ZGlmZiAtLWdpdCBhLy5kb2NrZXJpZ25vcmUgYi8uZG9ja2VyaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMmVjZDYKLS0tIC9kZXYvbnVsbAorKysgYi8uZG9ja2VyaWdub3JlCkBAIC0wLDAgKzEgQEAKKy5naXQvCmRpZmYgLS1naXQgYS8uZXNsaW50aWdub3JlIGIvLmVzbGludGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGUyZGJhCi0tLSAvZGV2L251bGwKKysrIGIvLmVzbGludGlnbm9yZQpAQCAtMCwwICsxLDkgQEAKKyMgVE9ETzogVXNlIGVzbGludCBvbiBqcyBsaWIgYW5kIGdlbmVyYXRlZCBjb2RlCisKKyMgSWdub3JlIGxpYi9qcyBmb3Igbm93LCB3aGljaCB1c2VzIGpzaGludCBjdXJyZW50bHkKK2xpYi9qcy8qCisjIElnbm9yZSBhbGwgZ2VuZXJhdGVkIGNvZGUgZm9yIG5vdworKiovZ2VuLSoKKworIyBEb24ndCBsaW50IG5lc3RlZCBub2RlX21vZHVsZXMKKyoqL25vZGVfbW9kdWxlcwpkaWZmIC0tZ2l0IGEvLmVzbGludHJjLmpzb24gYi8uZXNsaW50cmMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWFlODIwCi0tLSAvZGV2L251bGwKKysrIGIvLmVzbGludHJjLmpzb24KQEAgLTAsMCArMSwyNCBAQAoreworICAiZW52IjogeworICAgICJlczYiOiB0cnVlLAorICAgICJub2RlIjogdHJ1ZQorICB9LAorICAiZXh0ZW5kcyI6IFsKKyAgICAiZXNsaW50OnJlY29tbWVuZGVkIiwKKyAgICAicGx1Z2luOnByZXR0aWVyL3JlY29tbWVuZGVkIgorICBdLAorICAicGFyc2VyT3B0aW9ucyI6IHsKKyAgICAiZWNtYVZlcnNpb24iOiAyMDE3CisgIH0sCisgICJydWxlcyI6IHsKKyAgICAibm8tY29uc29sZSI6ICJvZmYiLAorICAgICJuby12YXIiOiAiZXJyb3IiLAorICAgICJwcmVmZXItY29uc3QiOiAiZXJyb3IiLAorICAgICJuby1jb25zdGFudC1jb25kaXRpb24iOiBbCisgICAgICAiZXJyb3IiLAorICAgICAgeworICAgICAgICAiY2hlY2tMb29wcyI6IGZhbHNlCisgICAgICB9CisgICAgXQorICB9Cit9CmRpZmYgLS1naXQgYS8uZmxha2U4IGIvLmZsYWtlOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjhmZGIyCi0tLSAvZGV2L251bGwKKysrIGIvLmZsYWtlOApAQCAtMCwwICsxLDUgQEAKK1tmbGFrZThdCitleGNsdWRlID0gLmdpdCxfX3B5Y2FjaGVfXywqKi9nZW4tKi8qKixjb250cmliLyoqLGRvY3Mvc291cmNlL2NvbmYucHksb2xkLGJ1aWxkLGRpc3QKK2lnbm9yZSA9IFc1MDQsRTQwMixFNTAxCittYXgtY29tcGxleGl0eSA9IDMwCittYXgtbGluZS1sZW5ndGggPSAxMjAKZGlmZiAtLWdpdCBhLy5naXRodWIvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kIGIvLmdpdGh1Yi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkN2JlZgotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kCkBAIC0wLDAgKzEsMTUgQEAKKzwhLS0gRXhwbGFpbiB0aGUgY2hhbmdlcyBpbiB0aGUgcHVsbCByZXF1ZXN0IGJlbG93OiAtLT4KKyAgCisKKzwhLS0gV2UgcmVjb21tZW5kIHlvdSByZXZpZXcgdGhlIGNoZWNrbGlzdCBiZWZvcmUgc3VibWl0dGluZyBhIHB1bGwgcmVxdWVzdC4gLS0+CisKKy0gWyBdIERpZCB5b3UgY3JlYXRlIGFuIFtBcGFjaGUgSmlyYV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL3Byb2plY3RzL1RIUklGVC9pc3N1ZXMvKSB0aWNrZXQ/ICAobm90IHJlcXVpcmVkIGZvciB0cml2aWFsIGNoYW5nZXMpCistIFsgXSBEb2VzIHlvdXIgcHVsbCByZXF1ZXN0IHRpdGxlIGZvbGxvdyB0aGUgcGF0dGVybiAiVEhSSUZULU5OTk46IGRlc2NyaWJlIG15IGlzc3VlIj8gIChub3QgcmVxdWlyZWQgZm9yIHRyaXZpYWwgY2hhbmdlcykKKy0gWyBdIERpZCB5b3Ugc3F1YXNoIHlvdXIgY2hhbmdlcyB0byBhIHNpbmdsZSBjb21taXQ/CistIFsgXSBEaWQgeW91IGRvIHlvdXIgYmVzdCB0byBhdm9pZCBicmVha2luZyBjaGFuZ2VzPyAgSWYgb25lIHdhcyBuZWVkZWQsIGRpZCB5b3UgbGFiZWwgdGhlIEppcmEgdGlja2V0IHdpdGggIkJyZWFraW5nLUNoYW5nZSIKKworPCEtLQorICBUaGUgQ29udHJpYnV0aW5nIEd1aWRlIGF0OgorICBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci9DT05UUklCVVRJTkcubWQKKyAgaGFzIG1vcmUgZGV0YWlscyBhbmQgdGlwcyBmb3IgY29tbWl0dGluZyBwcm9wZXJseS4KKy0tPgpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi9zdGFsZS55bWwgYi8uZ2l0aHViL3N0YWxlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQ0YWZiCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9zdGFsZS55bWwKQEAgLTAsMCArMSw1OSBAQAorIyBDb25maWd1cmF0aW9uIGZvciBwcm9ib3Qtc3RhbGUgLSBodHRwczovL2dpdGh1Yi5jb20vcHJvYm90L3N0YWxlCisKKyMgTnVtYmVyIG9mIGRheXMgb2YgaW5hY3Rpdml0eSBiZWZvcmUgYW4gSXNzdWUgb3IgUHVsbCBSZXF1ZXN0IGJlY29tZXMgc3RhbGUKK2RheXNVbnRpbFN0YWxlOiA2MAorCisjIE51bWJlciBvZiBkYXlzIG9mIGluYWN0aXZpdHkgYmVmb3JlIGFuIElzc3VlIG9yIFB1bGwgUmVxdWVzdCB3aXRoIHRoZSBzdGFsZSBsYWJlbCBpcyBjbG9zZWQuCisjIFNldCB0byBmYWxzZSB0byBkaXNhYmxlLiBJZiBkaXNhYmxlZCwgaXNzdWVzIHN0aWxsIG5lZWQgdG8gYmUgY2xvc2VkIG1hbnVhbGx5LCBidXQgd2lsbCByZW1haW4gbWFya2VkIGFzIHN0YWxlLgorZGF5c1VudGlsQ2xvc2U6IDcKKworIyBJc3N1ZXMgb3IgUHVsbCBSZXF1ZXN0cyB3aXRoIHRoZXNlIGxhYmVscyB3aWxsIG5ldmVyIGJlIGNvbnNpZGVyZWQgc3RhbGUuIFNldCB0byBgW11gIHRvIGRpc2FibGUKK2V4ZW1wdExhYmVsczoKKyAgLSBEbyBOb3QgTWVyZ2UKKyAgLSBibG9ja2VkCisgIC0gcGlubmVkCisgIC0gc2VjdXJpdHkKKyAgLSAiW1N0YXR1c10gTWF5YmUgTGF0ZXIiCisKKyMgU2V0IHRvIHRydWUgdG8gaWdub3JlIGlzc3VlcyBpbiBhIHByb2plY3QgKGRlZmF1bHRzIHRvIGZhbHNlKQorZXhlbXB0UHJvamVjdHM6IGZhbHNlCisKKyMgU2V0IHRvIHRydWUgdG8gaWdub3JlIGlzc3VlcyBpbiBhIG1pbGVzdG9uZSAoZGVmYXVsdHMgdG8gZmFsc2UpCitleGVtcHRNaWxlc3RvbmVzOiBmYWxzZQorCisjIExhYmVsIHRvIHVzZSB3aGVuIG1hcmtpbmcgYXMgc3RhbGUKK3N0YWxlTGFiZWw6IHdvbnRmaXgKKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiBtYXJraW5nIGFzIHN0YWxlLiBTZXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlCittYXJrQ29tbWVudDogPgorICBUaGlzIGlzc3VlIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHN0YWxlIGJlY2F1c2UgaXQgaGFzIG5vdCBoYWQKKyAgcmVjZW50IGFjdGl2aXR5LiBJdCB3aWxsIGJlIGNsb3NlZCBpbiA3IGRheXMgaWYgbm8gZnVydGhlciBhY3Rpdml0eSBvY2N1cnMuCisgIFRoYW5rIHlvdSBmb3IgeW91ciBjb250cmlidXRpb25zLgorCisjIENvbW1lbnQgdG8gcG9zdCB3aGVuIHJlbW92aW5nIHRoZSBzdGFsZSBsYWJlbC4KK3VubWFya0NvbW1lbnQ6ID4KKyAgVGhpcyBpc3N1ZSBpcyBubyBsb25nZXIgc3RhbGUuCisgIFRoYW5rIHlvdSBmb3IgeW91ciBjb250cmlidXRpb25zLgorCisjIENvbW1lbnQgdG8gcG9zdCB3aGVuIGNsb3NpbmcgYSBzdGFsZSBJc3N1ZSBvciBQdWxsIFJlcXVlc3QuCitjbG9zZUNvbW1lbnQ6ID4KKyAgVGhpcyBpc3N1ZSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IGNsb3NlZCBkdWUgdG8gaW5hY3Rpdml0eS4KKyAgVGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbnMuCisKKyMgTGltaXQgdGhlIG51bWJlciBvZiBhY3Rpb25zIHBlciBob3VyLCBmcm9tIDEtMzAuIERlZmF1bHQgaXMgMzAKK2xpbWl0UGVyUnVuOiAzMAorCisjIExpbWl0IHRvIG9ubHkgYGlzc3Vlc2Agb3IgYHB1bGxzYAorIyBvbmx5OiBpc3N1ZXMKKworIyBPcHRpb25hbGx5LCBzcGVjaWZ5IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgdGhhdCBhcmUgc3BlY2lmaWMgdG8ganVzdCAnaXNzdWVzJyBvciAncHVsbHMnOgorIyBwdWxsczoKKyMgICBkYXlzVW50aWxTdGFsZTogMzAKKyMgICBtYXJrQ29tbWVudDogPgorIyAgICAgVGhpcyBwdWxsIHJlcXVlc3QgaGFzIGJlZW4gYXV0b21hdGljYWxseSBtYXJrZWQgYXMgc3RhbGUgYmVjYXVzZSBpdCBoYXMgbm90IGhhZAorIyAgICAgcmVjZW50IGFjdGl2aXR5LiBJdCB3aWxsIGJlIGNsb3NlZCBpZiBubyBmdXJ0aGVyIGFjdGl2aXR5IG9jY3Vycy4gVGhhbmsgeW91CisjICAgICBmb3IgeW91ciBjb250cmlidXRpb25zLgorCisjIGlzc3VlczoKKyMgICBleGVtcHRMYWJlbHM6CisjICAgICAtIGNvbmZpcm1lZApkaWZmIC0tZ2l0IGEvLmdpdGlnbm9yZSBiLy5naXRpZ25vcmUKaW5kZXggNDIxOTQ2OC4uMTM1YjA4NSAxMDA2NDQKLS0tIGEvLmdpdGlnbm9yZQorKysgYi8uZ2l0aWdub3JlCkBAIC0yMSw0OSArMjEsNzYgQEAKICouc3dwCiAqLmhpCiAqfgordGFncwogCiAuKnByb2plY3QKKy5jbGFzc3BhdGgKKy5kdWIKKy5zZXR0aW5ncworLmNoZWNrc3R5bGUKIGp1bml0Ki5wcm9wZXJ0aWVzCiAuaWRlYQorKi5pbWwKKyouaXByCisqLml3cwogZ2VuLSoKIE1ha2VmaWxlCiBNYWtlZmlsZS5pbgogYWNsb2NhbC5tNAogYWNpbmNsdWRlLm00CithcGFjaGUtdGhyaWZ0LXRlc3QtbGlicmFyeQogYXV0b200dGUuY2FjaGUKIGNtYWtlLSoKK2R1Yi5zZWxlY3Rpb25zLmpzb24KK2xpYmFwYWNoZS10aHJpZnQuYQogbm9kZV9tb2R1bGVzCiBjb21waWxlCiB0ZXN0LWRyaXZlcgorZXJsX2NyYXNoLmR1bXAKK3Byb2plY3QubG9jay5qc29uCiAKIC5zb25hcgogLkRTX1N0b3JlCiAuc3ZuCiAudmFncmFudAorLnZzY29kZQorLnZzCiAKLS9jb250cmliLy52YWdyYW50LwogL2FjbG9jYWwvbGlidG9vbC5tNAogL2FjbG9jYWwvbHQqLm00CiAvYXV0b3NjYW4ubG9nCiAvYXV0b3NjYW4tKi5sb2cKKy9jbWFrZV8qCisvY29tcGlsZXIvY3BwL2NvbXBpbGVyLlZDLmRiCisvY29tcGlsZXIvY3BwL2NvbXBpbGVyLlZDLlZDLm9wZW5kYgorL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi90X2NwcF9nZW5lcmF0b3IuY2MKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5jcHAKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5oCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5jcHAKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgKKy9jb21waWxlci9jcHAvdGVzdC8qdGVzdAorL2NvbXBpbGVyL2NwcC90ZXN0L3RocmlmdC1nZW4tKgorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1ib290c3RyYXAKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vZ2VuLnN0YW1wCiAvY29tcGlsZXIvY3BwL0RlYnVnCiAvY29tcGlsZXIvY3BwL1JlbGVhc2UKLS9jb21waWxlci9jcHAvbGlicGFyc2UuYQotL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5jYwotL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS5jYwotL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS5oaAotL2NvbXBpbGVyL2NwcC9zcmMvd2luZG93cy92ZXJzaW9uLmgKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC9saWJwYXJzZS5hCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0bC5jYworL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdHkuY2MKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5LmhoCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvd2luZG93cy92ZXJzaW9uLmgKIC9jb21waWxlci9jcHAvdGhyaWZ0CiAvY29tcGlsZXIvY3BwL3RocmlmdGwuY2MKIC9jb21waWxlci9jcHAvdGhyaWZ0eS5jYwogL2NvbXBpbGVyL2NwcC9sZXgueXl0aHJpZnRsLmNjCiAvY29tcGlsZXIvY3BwL3RocmlmdHkuaAogL2NvbXBpbGVyL2NwcC90aHJpZnR5LmhoCi0vY29tcGlsZXIvY3BwL3ZlcnNpb24uaAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3ZlcnNpb24uaAogL2NvbmZpZy4qCiAvY29uZmlndXJlCiAvY29uZmlndXJlLmxpbmVubwogL2NvbmZpZ3VyZS5zY2FuCisvY29udHJpYi8udmFncmFudC8KIC9jb250cmliL2ZiMzAzL2NvbmZpZy5jYWNoZQogL2NvbnRyaWIvZmIzMDMvY29uZmlnLmxvZwogL2NvbnRyaWIvZmIzMDMvY29uZmlnLnN0YXR1cwpAQCAtNzgsNiArMTA1LDE1IEBACiAvY29udHJpYi9mYjMwMy9weS9mYjMwMy90dHlwZXMucHkKIC9kZXBjb21wCiAvaW5zdGFsbC1zaAorL2xpYi9hczMvLmdyYWRsZS8KKy9saWIvYXMzL2J1aWxkLworL2xpYi9jbC9iYWNrcG9ydC11cGRhdGUuemlwCisvbGliL2NsL2xpYgorL2xpYi9jbC9ydW4tdGVzdHMKKy9saWIvY2wvcXVpY2tsaXNwLmxpc3AKKy9saWIvY2wvZXh0ZXJuYWxzLworL2xpYi9jbC9ydW4tdGVzdHMKKy9saWIvY2wvcXVpY2tsaXNwLwogL2xpYi9jcHAvRGVidWcvCiAvbGliL2NwcC9EZWJ1Zy1tdC8KIC9saWIvY3BwL1JlbGVhc2UvCkBAIC04OCw2ICsxMjQsNyBAQAogL2xpYi9jcHAvc3JjL3RocmlmdC9zdGFtcC1oMgogL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsKIC9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xzVGVzdAorL2xpYi9jcHAvdGVzdC9Bbm5vdGF0aW9uVGVzdAogL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdAogL2xpYi9jcHAvdGVzdC9EZW5zZVByb3RvVGVzdAogL2xpYi9jcHAvdGVzdC9FbnVtVGVzdApAQCAtOTUsMTIgKzEzMiwxNCBAQAogL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdAogL2xpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QKIC9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0Ci0vbGliL2NwcC90ZXN0L1JlZmxlY3Rpb25UZXN0CiAvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QKKy9saWIvY3BwL3Rlc3QvUmVmbGVjdGlvblRlc3QKKy9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0CiAvbGliL2NwcC90ZXN0L1RGRFRyYW5zcG9ydFRlc3QKIC9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0CiAvbGliL2NwcC90ZXN0L1RJbnRlcnJ1cHRUZXN0CiAvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NlcnZlclRlc3QKKy9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAogL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0CiAvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QKIC9saWIvY3BwL3Rlc3QvVFNvY2tldEludGVycnVwdFRlc3QKQEAgLTEyMSw2NyArMTYwLDgwIEBACiAvbGliL2NfZ2xpYi8qLmdjZGEKIC9saWIvY19nbGliLyouZ2NubwogL2xpYi9jX2dsaWIvKi5sb1QKKy9saWIvY19nbGliL3NyYy90aHJpZnQvY29uZmlnLmgKKy9saWIvY19nbGliL3NyYy90aHJpZnQvc3RhbXAtaDMKIC9saWIvY19nbGliL3Rlc3QvKi5nY25vCiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3R3cmFwcGVyLnNoCiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3R3cmFwcGVyLXRlc3QqCiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbgogL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wKKy9saWIvY19nbGliL3Rlc3QvdGVzdGNvbXBhY3Rwcm90b2NvbAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQKIC9saWIvY19nbGliL3Rlc3QvdGVzdGNvbnRhaW5lcnRlc3QKIC9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8KKy9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0CiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQKIC9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlcgogL2xpYi9jX2dsaWIvdGVzdC90ZXN0b3B0aW9uYWxyZXF1aXJlZAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0CiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIKIC9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uCiAvbGliL2NfZ2xpYi90aHJpZnRjLnBjCiAvbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjCiAvbGliL2NzaGFycC8qKi9iaW4vCiAvbGliL2NzaGFycC8qKi9vYmovCi0vbGliL2QvbGlidGhyaWZ0ZC5hCisvbGliL2NzaGFycC9zcmMvcGFja2FnZXMKKy9saWIvZC90ZXN0LyoucGVtCisvbGliL2QvbGlidGhyaWZ0ZCouYQorL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdAorL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdAogL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsKKy9saWIvZC90ZXN0L3N0cmVzc190ZXN0X3NlcnZlcgorL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50CisvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIKIC9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0CiAvbGliL2QvdW5pdHRlc3QvCi0vbGliL2RlbHBoaS9zcmMvKi5kY3UKLS9saWIvZGVscGhpL3Rlc3QvKi5pZGVudGNhY2hlCi0vbGliL2RlbHBoaS90ZXN0LyoubG9jYWwKLS9saWIvZGVscGhpL3Rlc3QvKi5kY3UKLS9saWIvZGVscGhpL3Rlc3QvKi4yMDA3Ci0vbGliL2RlbHBoaS90ZXN0LyouZHByb2oKLS9saWIvZGVscGhpL3Rlc3QvKi5kcHJvagotL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuLyouYmF0Ci0vbGliL2RlbHBoaS90ZXN0L3NraXAvKi5sb2NhbAotL2xpYi9kZWxwaGkvdGVzdC9za2lwLyouaWRlbnRjYWNoZQotL2xpYi9kZWxwaGkvdGVzdC9za2lwLyouaWRlbnRjYWNoZQotL2xpYi9kZWxwaGkvdGVzdC9za2lwLyouZHByb2oKLS9saWIvZGVscGhpL3Rlc3Qvc2tpcC8qLmRwcm9qCi0vbGliL2RlbHBoaS90ZXN0L3NraXAvKi4yMDA3Ci0vbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvKi5pZGVudGNhY2hlCi0vbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvKi5kcHJvagotL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyLyoubG9jYWwKLS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci8qLjIwMDcKLS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci8qLmRjdQotL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC8qLmRwcm9qCi0vbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkLyouMjAwNwotL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC8qLmxvY2FsCi0vbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkLyouaWRlbnRjYWNoZQotL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC8qLmRjdQotL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvKi4yMDA3Ci0vbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS8qLmRwcm9qCi0vbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS8qLmlkZW50Y2FjaGUKLS9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5LyoubG9jYWwKLS9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5LyouZGN1Ci0vbGliL2VybC8uZ2VuZXJhdGVkCisvbGliL2RhcnQvY292ZXJhZ2UKKy9saWIvZGFydC8qKi8uZGFydF90b29sCisvbGliL2RhcnQvKiovLnBhY2thZ2VzCisvbGliL2RhcnQvKiovcGFja2FnZXMKKy9saWIvZGFydC8qKi8ucHViLworL2xpYi9kYXJ0LyoqL3B1YnNwZWMubG9jaworL2xpYi9kZWxwaGkvdGVzdC9za2lwLyoucmVxdWVzdAorL2xpYi9kZWxwaGkvdGVzdC9za2lwLyoucmVzcG9uc2UKKy9saWIvZGVscGhpLyoqLyouaWRlbnRjYWNoZQorL2xpYi9kZWxwaGkvKiovKi5sb2NhbAorL2xpYi9kZWxwaGkvKiovKi5kY3UKKy9saWIvZGVscGhpLyoqLyouMjAwNworL2xpYi9kZWxwaGkvKiovKi5kcHJvagorL2xpYi9kZWxwaGkvKiovY29kZWdlbi8qLmJhdAogL2xpYi9lcmwvLmV1bml0Ci0vbGliL2VybC9lYmluCisvbGliL2VybC8uZ2VuZXJhdGVkCisvbGliL2VybC8ucmViYXIvCiAvbGliL2VybC9kZXBzLworL2xpYi9lcmwvZWJpbgorL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCisvbGliL2VybC90ZXN0LyouYmVhbQorL2xpYi9lcmwvdGVzdC8qLmhybAorL2xpYi9lcmwvdGVzdC9UaHJpZnRfb21pdF93aXRob3V0LnRocmlmdAogL2xpYi9oYXhlL3Rlc3QvYmluCisvbGliL2hheGUvdGVzdC9kYXRhLnRtcAogL2xpYi9ocy9kaXN0CisvbGliL2phdmEvLmdyYWRsZQorL2xpYi9qYXZhL2FuZHJvaWQvLmdyYWRsZQogL2xpYi9qYXZhL2J1aWxkCisvbGliL2phdmEvdGFyZ2V0CisvbGliL2pzL2Rpc3QKKy9saWIvanMvZG9jCiAvbGliL2pzL3Rlc3QvYnVpbGQKKy9saWIvbmV0Y29yZS8qKi9iaW4KKy9saWIvbmV0Y29yZS8qKi9vYmoKKy9saWIvbmV0c3RkLyoqL2JpbgorL2xpYi9uZXRzdGQvKiovb2JqCiAvbGliL25vZGVqcy9jb3ZlcmFnZQogL2xpYi9ub2RlanMvbm9kZV9tb2R1bGVzLwogL2xpYi9wZXJsL01BTklGRVNUCkBAIC0yMDUsNiArMjU3LDcgQEAKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2J1aWxkLwogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLioKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZ3VyZQorL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlLmFjCiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWd1cmUuaW4KIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2luc3RhbGwtc2gKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2xpYnRvb2wKQEAgLTIyMSw1OSArMjc0LDEzNSBAQAogL2xpYi9waHAvdGVzdC9wYWNrYWdlcy8KIC9saWIvcHkvZGlzdC8KIC9saWIvZXJsL2xvZ3MvCisvbGliL2dvL3BrZworL2xpYi9nby9zcmMKIC9saWIvZ28vdGVzdC9nb3BhdGgvCiAvbGliL2dvL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKy9saWIvcnMvdGFyZ2V0LworL2xpYi9ycy9DYXJnby5sb2NrCisvbGliL3JzL3Rlc3QvQ2FyZ28ubG9jaworL2xpYi9ycy90ZXN0L3RhcmdldC8KKy9saWIvcnMvdGVzdC9iaW4vCisvbGliL3JzL3Rlc3Qvc3JjL2Jhc2Vfb25lLnJzCisvbGliL3JzL3Rlc3Qvc3JjL2Jhc2VfdHdvLnJzCisvbGliL3JzL3Rlc3Qvc3JjL21pZGxheWVyLnJzCisvbGliL3JzL3Rlc3Qvc3JjL3JlY3Vyc2l2ZS5ycworL2xpYi9ycy90ZXN0L3NyYy91bHRpbWF0ZS5ycworL2xpYi9ycy8qLmltbAorL2xpYi9ycy8qKi8qLmltbAorL2xpYi9zd2lmdC8uYnVpbGQKIC9saWJ0b29sCiAvbHRtYWluLnNoCiAvbWlzc2luZwogL25vZGVfbW9kdWxlcy8KKy92ZW5kb3IvCisvY29tcG9zZXIubG9jawogL3N0YW1wLWgxCisvdGVzdC9mZWF0dXJlcy9yZXN1bHRzLmpzb24KIC90ZXN0L3Jlc3VsdHMuanNvbgogL3Rlc3QvY19nbGliL3Rlc3RfY2xpZW50CiAvdGVzdC9jX2dsaWIvdGVzdF9zZXJ2ZXIKKy90ZXN0L2NsL1Rlc3RTZXJ2ZXIKKy90ZXN0L2NsL1Rlc3RDbGllbnQKIC90ZXN0L2NwcC9TdHJlc3NUZXN0CiAvdGVzdC9jcHAvU3RyZXNzVGVzdE5vbkJsb2NraW5nCiAvdGVzdC9jcHAvVGVzdENsaWVudAogL3Rlc3QvY3BwL1Rlc3RTZXJ2ZXIKKy90ZXN0L2NzaGFycC9vYmoKKy90ZXN0L2NzaGFycC9iaW4KKy90ZXN0L2RhcnQvKiovLmRhcnRfdG9vbAorL3Rlc3QvZGFydC8qKi8ucGFja2FnZXMKKy90ZXN0L2RhcnQvKiovcGFja2FnZXMKKy90ZXN0L2RhcnQvKiovLnB1Yi8KKy90ZXN0L2RhcnQvKiovcHVic3BlYy5sb2NrCiAvdGVzdC9sb2cvCiAvdGVzdC90ZXN0LmxvZwotL3Rlc3QvZXJsLy5ldW5pdC8KIC90ZXN0L2VybC8uZ2VuZXJhdGVkCisvdGVzdC9lcmwvLnJlYmFyCisvdGVzdC9lcmwvZWJpbgogL3Rlc3QvZ28vYmluLwogL3Rlc3QvZ28vVGhyaWZ0VGVzdC50aHJpZnQKIC90ZXN0L2dvL2dvcGF0aAogL3Rlc3QvZ28vcGtnLwogL3Rlc3QvZ28vc3JjL2NvZGUuZ29vZ2xlLmNvbS8KKy90ZXN0L2dvL3NyYy9jb21tb24vbW9ja19oYW5kbGVyLmdvCiAvdGVzdC9nby9zcmMvZ2l0aHViLmNvbS9nb2xhbmcvCisvdGVzdC9nby9zcmMvZ29sYW5nLm9yZy8KIC90ZXN0L2dvL3NyYy9nZW4vCiAvdGVzdC9nby9zcmMvdGhyaWZ0CiAvdGVzdC9oYXhlL2JpbgogL3Rlc3QvaHMvVGVzdENsaWVudAogL3Rlc3QvaHMvVGVzdFNlcnZlcgorL3Rlc3QvcGhwL3BocF9leHRfZGlyLwogL3Rlc3QvcHkudHdpc3RlZC9fdHJpYWxfdGVtcC8KIC90ZXN0L3JiL0dlbWZpbGUubG9jaworL3Rlc3QvbmV0Y29yZS8qKi9iaW4KKy90ZXN0L25ldGNvcmUvKiovb2JqCisvdGVzdC9uZXRjb3JlL1RocmlmdAorL3Rlc3QvbmV0c3RkLyoqL2JpbgorL3Rlc3QvbmV0c3RkLyoqL29iagorL3Rlc3QvbmV0c3RkL1RocmlmdAorL3Rlc3QvcGhwL3BocF9leHRfZGlyLworL3Rlc3QvcnMvQ2FyZ28ubG9jaworL3Rlc3QvcnMvc3JjL3RocmlmdF90ZXN0LnJzCisvdGVzdC9ycy9iaW4vCisvdGVzdC9ycy90YXJnZXQvCisvdGVzdC9ycy8qLmltbAorL3Rlc3QvcnMvKiovKi5pbWwKKy9saWIvY2wvYmFja3BvcnQtdXBkYXRlLnppcAorL2xpYi9jbC9saWIKKy90dXRvcmlhbC9jbC9xdWlja2xpc3AubGlzcAorL3R1dG9yaWFsL2NsL2V4dGVybmFscy8KKy90dXRvcmlhbC9jbC9xdWlja2xpc3AvCisvdHV0b3JpYWwvY2wvVHV0b3JpYWxDbGllbnQKKy90dXRvcmlhbC9jbC9UdXRvcmlhbFNlcnZlcgorL3R1dG9yaWFsL2NsL2JhY2twb3J0LXVwZGF0ZS56aXAKKy90dXRvcmlhbC9jbC9saWIvCisvdHV0b3JpYWwvY2wvc2hhcmVkLWltcGxlbWVudGF0aW9uLmZhc2wKKy90dXRvcmlhbC9jbC90dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5mYXNsCiAvdHV0b3JpYWwvY3BwL1R1dG9yaWFsQ2xpZW50CiAvdHV0b3JpYWwvY3BwL1R1dG9yaWFsU2VydmVyCiAvdHV0b3JpYWwvY19nbGliL3R1dG9yaWFsX2NsaWVudAogL3R1dG9yaWFsL2NfZ2xpYi90dXRvcmlhbF9zZXJ2ZXIKLS90dXRvcmlhbC9kZWxwaGkvKi5kc2sKLS90dXRvcmlhbC9kZWxwaGkvKi5sb2NhbAotL3R1dG9yaWFsL2RlbHBoaS8qLnR2c2NvbmZpZwotL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvZGN1Ci0vdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9kY3UKLS90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50LyoubG9jYWwKLS90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50LyouaWRlbnRjYWNoZQotL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvKi5pZGVudGNhY2hlCi0vdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci8qLmxvY2FsCisvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9vYmoKKy90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL2JpbgorL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvb2JqCisvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9iaW4KKy90dXRvcmlhbC9kL2FzeW5jX2NsaWVudAorL3R1dG9yaWFsL2QvY2xpZW50CisvdHV0b3JpYWwvZC9zZXJ2ZXIKKy90dXRvcmlhbC9kYXJ0LyoqLy5wYWNrYWdlcworL3R1dG9yaWFsL2RhcnQvKiovcGFja2FnZXMKKy90dXRvcmlhbC9kYXJ0LyoqLy5wdWIvCisvdHV0b3JpYWwvZGFydC8qKi9wdWJzcGVjLmxvY2sKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5kc2sKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5sb2NhbAorL3R1dG9yaWFsL2RlbHBoaS8qKi8qLnR2c2NvbmZpZworL3R1dG9yaWFsL2RlbHBoaS8qKi9kY3UKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5sb2NhbAorL3R1dG9yaWFsL2RlbHBoaS8qKi8qLmlkZW50Y2FjaGUKKy90dXRvcmlhbC9nby9nb3BhdGgKIC90dXRvcmlhbC9nby9nby10dXRvcmlhbAogL3R1dG9yaWFsL2dvL2NhbGN1bGF0b3ItcmVtb3RlCiAvdHV0b3JpYWwvZ28vc3JjL3NoYXJlZAogL3R1dG9yaWFsL2dvL3NyYy90dXRvcmlhbAogL3R1dG9yaWFsL2dvL3NyYy9naXQuYXBhY2hlLm9yZworL3R1dG9yaWFsL2dvL3NyYy9nb2xhbmcub3JnCiAvdHV0b3JpYWwvaGF4ZS9iaW4KIC90dXRvcmlhbC9ocy9kaXN0LwogL3R1dG9yaWFsL2phdmEvYnVpbGQvCiAvdHV0b3JpYWwvanMvYnVpbGQvCisvdHV0b3JpYWwvbmV0Y29yZS8qKi9iaW4KKy90dXRvcmlhbC9uZXRjb3JlLyoqL29iagorL3R1dG9yaWFsL25ldGNvcmUvVGhyaWZ0CisvdHV0b3JpYWwvbmV0c3RkLyoqL2JpbgorL3R1dG9yaWFsL25ldHN0ZC8qKi9vYmoKKy90dXRvcmlhbC9uZXRzdGQvSW50ZXJmYWNlcworL3R1dG9yaWFsL3JzLyouaW1sCisvdHV0b3JpYWwvcnMvc3JjL3NoYXJlZC5ycworL3R1dG9yaWFsL3JzL3NyYy90dXRvcmlhbC5ycworL3R1dG9yaWFsL3JzL2JpbgorL3R1dG9yaWFsL3JzL3RhcmdldAorL3R1dG9yaWFsL3JzL0NhcmdvLmxvY2sKIC95bHdyYXAKIAotL2NtYWtlXyoKZGlmZiAtLWdpdCBhLy5ydXN0Zm10LnRvbWwgYi8ucnVzdGZtdC50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTVhZmQKLS0tIC9kZXYvbnVsbAorKysgYi8ucnVzdGZtdC50b21sCkBAIC0wLDAgKzEsNjQgQEAKK21heF93aWR0aCA9IDEwMAoraGFyZF90YWJzID0gZmFsc2UKK3RhYl9zcGFjZXMgPSA0CituZXdsaW5lX3N0eWxlID0gIkF1dG8iCit1c2Vfc21hbGxfaGV1cmlzdGljcyA9ICJEZWZhdWx0IgoraW5kZW50X3N0eWxlID0gIkJsb2NrIgord3JhcF9jb21tZW50cyA9IGZhbHNlCitmb3JtYXRfZG9jX2NvbW1lbnRzID0gZmFsc2UKK2NvbW1lbnRfd2lkdGggPSA4MAorbm9ybWFsaXplX2NvbW1lbnRzID0gZmFsc2UKK25vcm1hbGl6ZV9kb2NfYXR0cmlidXRlcyA9IGZhbHNlCitsaWNlbnNlX3RlbXBsYXRlX3BhdGggPSAiIgorZm9ybWF0X3N0cmluZ3MgPSBmYWxzZQorZm9ybWF0X21hY3JvX21hdGNoZXJzID0gZmFsc2UKK2Zvcm1hdF9tYWNyb19ib2RpZXMgPSB0cnVlCitlbXB0eV9pdGVtX3NpbmdsZV9saW5lID0gdHJ1ZQorc3RydWN0X2xpdF9zaW5nbGVfbGluZSA9IHRydWUKK2ZuX3NpbmdsZV9saW5lID0gZmFsc2UKK3doZXJlX3NpbmdsZV9saW5lID0gZmFsc2UKK2ltcG9ydHNfaW5kZW50ID0gIkJsb2NrIgoraW1wb3J0c19sYXlvdXQgPSAiTWl4ZWQiCittZXJnZV9pbXBvcnRzID0gZmFsc2UKK3Jlb3JkZXJfaW1wb3J0cyA9IHRydWUKK3Jlb3JkZXJfbW9kdWxlcyA9IHRydWUKK3Jlb3JkZXJfaW1wbF9pdGVtcyA9IGZhbHNlCit0eXBlX3B1bmN0dWF0aW9uX2RlbnNpdHkgPSAiV2lkZSIKK3NwYWNlX2JlZm9yZV9jb2xvbiA9IGZhbHNlCitzcGFjZV9hZnRlcl9jb2xvbiA9IHRydWUKK3NwYWNlc19hcm91bmRfcmFuZ2VzID0gZmFsc2UKK2Jpbm9wX3NlcGFyYXRvciA9ICJGcm9udCIKK3JlbW92ZV9uZXN0ZWRfcGFyZW5zID0gdHJ1ZQorY29tYmluZV9jb250cm9sX2V4cHIgPSB0cnVlCitvdmVyZmxvd19kZWxpbWl0ZWRfZXhwciA9IGZhbHNlCitzdHJ1Y3RfZmllbGRfYWxpZ25fdGhyZXNob2xkID0gMAorZW51bV9kaXNjcmltX2FsaWduX3RocmVzaG9sZCA9IDAKK21hdGNoX2FybV9ibG9ja3MgPSB0cnVlCitmb3JjZV9tdWx0aWxpbmVfYmxvY2tzID0gZmFsc2UKK2ZuX2FyZ3NfZGVuc2l0eSA9ICJUYWxsIgorYnJhY2Vfc3R5bGUgPSAiU2FtZUxpbmVXaGVyZSIKK2NvbnRyb2xfYnJhY2Vfc3R5bGUgPSAiQWx3YXlzU2FtZUxpbmUiCit0cmFpbGluZ19zZW1pY29sb24gPSB0cnVlCit0cmFpbGluZ19jb21tYSA9ICJWZXJ0aWNhbCIKK21hdGNoX2Jsb2NrX3RyYWlsaW5nX2NvbW1hID0gZmFsc2UKK2JsYW5rX2xpbmVzX3VwcGVyX2JvdW5kID0gMQorYmxhbmtfbGluZXNfbG93ZXJfYm91bmQgPSAwCitlZGl0aW9uID0gIjIwMTUiCittZXJnZV9kZXJpdmVzID0gdHJ1ZQordXNlX3RyeV9zaG9ydGhhbmQgPSBmYWxzZQordXNlX2ZpZWxkX2luaXRfc2hvcnRoYW5kID0gZmFsc2UKK2ZvcmNlX2V4cGxpY2l0X2FiaSA9IHRydWUKK2NvbmRlbnNlX3dpbGRjYXJkX3N1ZmZpeGVzID0gZmFsc2UKK2NvbG9yID0gIkF1dG8iCityZXF1aXJlZF92ZXJzaW9uID0gIjEuMC4wIgordW5zdGFibGVfZmVhdHVyZXMgPSBmYWxzZQorZGlzYWJsZV9hbGxfZm9ybWF0dGluZyA9IGZhbHNlCitza2lwX2NoaWxkcmVuID0gZmFsc2UKK2hpZGVfcGFyc2VfZXJyb3JzID0gZmFsc2UKK2Vycm9yX29uX2xpbmVfb3ZlcmZsb3cgPSBmYWxzZQorZXJyb3Jfb25fdW5mb3JtYXR0ZWQgPSBmYWxzZQorcmVwb3J0X3RvZG8gPSAiTmV2ZXIiCityZXBvcnRfZml4bWUgPSAiTmV2ZXIiCitpZ25vcmUgPSBbXQorZW1pdF9tb2RlID0gIkZpbGVzIgorbWFrZV9iYWNrdXAgPSBmYWxzZQpkaWZmIC0tZ2l0IGEvLnRyYXZpcy55bWwgYi8udHJhdmlzLnltbAppbmRleCA1ODdkNzk1Li40YTM5OWE2IDEwMDY0NAotLS0gYS8udHJhdmlzLnltbAorKysgYi8udHJhdmlzLnltbApAQCAtMTksMTcwICsxOSwxNDAgQEAKIAogIyBidWlsZCBBcGFjaGUgVGhyaWZ0IG9uIFRyYXZpcyBDSSAtIGh0dHBzOi8vdHJhdmlzLWNpLm9yZy8KIAotbGFuZ3VhZ2U6IGNwcAorIworIyBEb2NrZXIgSW50ZWdyYXRpb24KKyMgc2VlOiBidWlsZC9kb2NrZXIvUkVBRE1FLm1kCisjIAogCiBzdWRvOiByZXF1aXJlZAorZGlzdDogdHJ1c3R5CitsYW5ndWFnZTogY3BwCiAKLWNhY2hlOgotIC0gYXB0Ci0gLSBucG0KLSAtIG1hdmVuCitzZXJ2aWNlczoKKyAgLSBkb2NrZXIKIAotY29tcGlsZXI6Ci0gIC0gY2xhbmcKLSAgLSBnY2MKK2luc3RhbGw6CisgIC0gaWYgW1sgYHVuYW1lYCA9PSAiTGludXgiIF1dOyB0aGVuIGJ1aWxkL2RvY2tlci9yZWZyZXNoLnNoOyBmaQogCi1iZWZvcmVfaW5zdGFsbDoKLSAgLSBzaCBidWlsZC90cmF2aXMvaW5zdGFsbENYWERlcGVuZGVuY2llcy5zaAotICAtIGlmIFsgIiRBTExfREVQUyIgIT0gIm5vIiBdIDsgdGhlbiBzaCBidWlsZC90cmF2aXMvaW5zdGFsbERlcGVuZGVuY2llcy5zaCAxPiAvZGV2L251bGwgOyBmaQotICAtIGlmIFsgIiRBTExfREVQUyIgIT0gIm5vIiBdIDsgdGhlbiBleHBvcnQgUEFUSD0vb3B0L2doYy8kR0hDVkVSL2Jpbjovb3B0L2NhYmFsLzEuMjAvYmluOiRQQVRIIDsgZmkKLSAgLSBpZiBbICIkQUxMX0RFUFMiICE9ICJubyIgXSA7IHRoZW4gY2FiYWwgdXBkYXRlIDsgZmkKLSAgIyBEaXNhYmxpbmcgYW55IGNhYmFsIGNvbmN1cnJlbnQgam9icyB0byB3b3JrYXJvdW5kIEdIQyBjcmFzaGVzIGR1ZSB0byBvdXQgb2YgbWVtb3J5LgotICAjIFdlIGNhbiBzYWZlbHkgcmVtb3ZlIHRoaXMgdG8gc3BlZWQgdXAgY2FiYWwgaW5zdGFsbCwgb25jZSBUcmF2aXMgaW5mcmFzdHJ1Y3R1cmUgaXMgdXBncmFkZWQuCi0gIC0gaWYgWyAiJEFMTF9ERVBTIiAhPSAibm8iIF0gOyB0aGVuIHNlZCAtaSAncy9eXHMqam9ic1xzKjpccypcJG5jcHVzXHMqJC9qb2JzOjEvZycgJEhPTUUvLmNhYmFsL2NvbmZpZyAmJiBjYXQgJEhPTUUvLmNhYmFsL2NvbmZpZyB8IGdyZXAgam9icyA7IGZpCi0KLQotc2NyaXB0OgotICAtIGlmIFsgIngkQ01BS0VfQ09ORklHIiAhPSAieG5vbmUiIF0gOyB0aGVuIG1rZGlyIGNtYWtlX2J1aWxkICYmIGNkIGNtYWtlX2J1aWxkICYmIGNtYWtlIC1HTmluamEgLURRVF9NT0NfRVhFQ1VUQUJMRT0ibW9xLXF0NSIgJENNQUtFX0NPTkZJRyAkVFJBVklTX0JVSUxEX0RJUiA7IGZpCi0gIC0gaWYgWyAieCRDTUFLRV9DT05GSUciICE9ICJ4bm9uZSIgXSA7IHRoZW4gbmluamEgOyBmaQotICAtIGlmIFsgIngkQ01BS0VfQ09ORklHIiAhPSAieG5vbmUiIF0gOyB0aGVuIGNwYWNrIDsgY2QgJFRSQVZJU19CVUlMRF9ESVIgOyBmaQotICAtIGlmIFsgIngkQ09ORklHIiAhPSAieG5vbmUiIF0gOyB0aGVuIHNoIGJvb3RzdHJhcC5zaCA7IGZpCi0gIC0gaWYgWyAieCRDT05GSUciICE9ICJ4bm9uZSIgXSA7IHRoZW4gc2ggY29uZmlndXJlICRDT05GSUcgOyBmaQotICAtIGlmIFsgIngkQ09ORklHIiAhPSAieG5vbmUiIF0gOyB0aGVuIG1ha2UgJE1BS0VfVEFSR0VUIC1qMiA7IGZpCi0KLWFmdGVyX2ZhaWx1cmU6Ci0gIC0gaWYgWyAieCRFUlJPUl9MT0ciICE9ICJ4bm9uZSIgXSA7IHRoZW4gY2F0ICRFUlJPUl9MT0cgOyBmaQorc3RhZ2VzOgorICAtIGRvY2tlciAgICAjIGRvY2tlciBpbWFnZXMKKyAgLSB0aHJpZnQgICAgIyB0aHJpZnQgYnVpbGQgam9icwogCiBlbnY6CiAgIGdsb2JhbDoKLSAgICAtIFRFU1RfTkFNRT0iIgotICAgIC0gQ01BS0VfQ09ORklHPSJub25lIgotICAgIC0gQ09ORklHPSJub25lIgotICAgIC0gTUFLRV9UQVJHRVQ9ImNoZWNrIgotICAgIC0gQUxMX0RFUFM9Im5vIgotICAgIC0gR0hDVkVSPTcuOC4zCi0gICAgLSBFUlJPUl9MT0c9Im5vbmUiCisgICAgLSBTQ1JJUFQ9ImNtYWtlLnNoIgorICAgIC0gQlVJTERfQVJHPSIiCisgICAgLSBCVUlMRF9FTlY9Ii1lIENDPWdjYyAtZSBDWFg9ZysrIC1lIFRIUklGVF9DUk9TU1RFU1RfQ09OQ1VSUkVOQ1k9NCIKKyAgICAtIERJU1RSTz11YnVudHUtYmlvbmljCisgICAgLSBCVUlMRF9MSUJTPSJDUFAgQ19HTElCIEhBU0tFTEwgSkFWQSBQWVRIT04gVEVTVElORyBUVVRPUklBTFMiICAjIG9ubHkgbWVhbmluZ2Z1bCBmb3IgQ01ha2UgYnVpbGRzCisgICAgLSBUUkFWSVNfQlVJTERfU1RBR0U9dGVzdAorICAgICMgRE9DS0VSX1JFUE8gKHRoaXMgd29ya3MgZm9yIGFsbCBidWlsZHMgYXMgYSBzb3VyY2UgZm9yIGRvY2tlciBpbWFnZXMgLSB5b3UgY2FuIG92ZXJyaWRlIGZvciBmb3JrIGJ1aWxkcyBpbiB5b3VyIFRyYXZpcyBzZXR0aW5ncykKKyAgICAtIERPQ0tFUl9SRVBPPSJ0aHJpZnQvdGhyaWZ0LWJ1aWxkIgorICAgICMgRE9DS0VSX1VTRVIgKHByb3ZpZGUgaW4geW91ciBUcmF2aXMgc2V0dGluZ3MgaWYgeW91IHdhbnQgdG8gYnVpbGQgYW5kIHVwZGF0ZSBkb2NrZXIgaW1hZ2VzIG9uY2UsIGluc3RlYWQgb2Ygb24gZXZlcnkgam9iKQorICAgICMgRE9DS0VSX1BBU1MgKHNhbWUpCiAKLSAgbWF0cml4OgotICAgICMgUHV0IGl0IGhlcmUgYmVjYXVzZSBpdCdzIG1vc3QgdGltZSBjb25zdW1pbmcKLSAgICAtIFRFU1RfTkFNRT0ibWFrZSBjcm9zcyAoYXV0b21ha2UpIgotICAgICAgVEhSSUZUX0NST1NTVEVTVF9DT05DVVJSRU5DWT02Ci0gICAgICBDT05GSUc9Ii0tZW5hYmxlLXR1dG9yaWFsPW5vIC0td2l0aG91dC1lcmxhbmcgLS13aXRob3V0LWx1YSAtLXdpdGhvdXQtaGF4ZSAtLXdpdGhvdXQtZCIKLSAgICAgIEFMTF9ERVBTPSJ5ZXMiCi0gICAgICBNQUtFX1RBUkdFVD0iY3Jvc3MiCi0gICAgICBFUlJPUl9MT0c9InRlc3QvbG9nL3VuZXhwZWN0ZWRfZmFpbHVyZXMubG9nIgotCi0gICAgIyBDTWFrZSBidWlsZHMKLSAgICAtIFRFU1RfTkFNRT0iY29tcGlsZXIgKENNYWtlICsgQ1BhY2spIgotICAgICAgQ01BS0VfQ09ORklHPSItREJVSUxEX0NPTVBJTEVSPU9OIC1EQlVJTERfTElCUkFSSUVTPU9GRiAtREJVSUxEX1RFU1RJTkc9T0ZGIC1EQlVJTERfRVhBTVBMRVM9T0ZGIgotICAgIC0gVEVTVF9OQU1FPSJhbGwgKENNYWtlICsgQ1BhY2spIgotICAgICAgQ01BS0VfQ09ORklHPSIiCi0gICAgICBBTExfREVQUz0ieWVzIgotICAgIC0gVEVTVF9OQU1FPSJDKysvYm9vc3QtdGhyZWFkcyAoQ01ha2UgKyBDUGFjaykiCi0gICAgICBDTUFLRV9DT05GSUc9Ii1EV0lUSF9DX0dMSUI9T0ZGIC1EV0lUSF9KQVZBPU9GRiAtRFdJVEhfQk9PU1RUSFJFQURTPU9OIgotICAgIC0gVEVTVF9OQU1FPSJDKysvc3RkLXRocmVhZHMgKENNYWtlICsgQ1BhY2spIgotICAgICAgQ01BS0VfQ09ORklHPSItRENNQUtFX0NYWF9GTEFHUz0tc3RkPWMrKzB4IC1EV0lUSF9DX0dMSUI9T0ZGIC1EV0lUSF9KQVZBPU9GRiAtRFdJVEhfU1REVEhSRUFEUz1PTiIKLSAgICAtIFRFU1RfTkFNRT0iY29tcGlsZXIgKG1pbmd3MzItZ2NjLCBDTWFrZSArIENQYWNrKSIKLSAgICAgIENNQUtFX0NPTkZJRz0iLURDTUFLRV9UT09MQ0hBSU5fRklMRT0uLi9idWlsZC9jbWFrZS9taW5ndzMyLXRvb2xjaGFpbi5jbWFrZSAtREJVSUxEX0NPTVBJTEVSPU9OIC1EQlVJTERfTElCUkFSSUVTPU9GRiAtREJVSUxEX1RFU1RJTkc9T0ZGIC1EQlVJTERfRVhBTVBMRVM9T0ZGIgotCi0gICAgIyBBdXRvdG9vbCBidWlsZHMKLSAgICAjIFRPRE86IFJlbW92ZSB0aGVtIGFzIG1pZ3JhdGlvbiBpcyBtYWRlCi0gICAgLSBURVNUX05BTUU9ImNvbXBpbGVyIChhdXRvbWFrZSkiCi0gICAgICBDT05GSUc9Ii0tZGlzYWJsZS1saWJzIgotICAgIC0gVEVTVF9OQU1FPSJhbGwgKGF1dG9tYWtlKSIKLSAgICAgIENPTkZJRz0iLS13aXRob3V0LWVybGFuZyAtLXdpdGhvdXQtcHl0aG9uIC0td2l0aG91dC1nbyAtLXdpdGhvdXQtbHVhIgotICAgICAgQUxMX0RFUFM9InllcyIKLSAgICAtIFRFU1RfTkFNRT0iQyAmIEMrKyAmIEhhc2tlbGwgKGF1dG9tYWtlKSIKLSAgICAgIENPTkZJRz0iLS13aXRob3V0LWNzaGFycCAtLXdpdGhvdXQtamF2YSAtLXdpdGhvdXQtZXJsYW5nIC0td2l0aG91dC1ub2RlanMgLS13aXRob3V0LWx1YSAtLXdpdGhvdXQtcHl0aG9uIC0td2l0aG91dC1wZXJsIC0td2l0aG91dC1waHAgLS13aXRob3V0LXBocC1leHRlbnNpb24gLS13aXRob3V0LXJ1YnkgLS13aXRob3V0LWdvIC0td2l0aG91dC1kIgotICAgICAgQUxMX0RFUFM9InllcyIKLSAgICAtIFRFU1RfTkFNRT0iU21hbGwgU2V0IChhdXRvbWFrZSkiCi0gICAgICBDT05GSUc9Ii0td2l0aG91dC1lcmxhbmcgLS13aXRob3V0LWhhc2tlbGwgLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtZ28gLS13aXRob3V0LWx1YSAtLXdpdGhvdXQtZCAtLXdpdGhvdXQtcnVieSAtLXdpdGhvdXQtbm9kZWpzIC0td2l0aG91dC1qYXZhIgotICAgICAgQUxMX0RFUFM9InllcyIKLSAgICAtIFRFU1RfTkFNRT0iZGlzdCAoYXV0b21ha2UpIgotICAgICAgQ09ORklHPSIiCi0gICAgICBBTExfREVQUz0ieWVzIgotICAgICAgTUFLRV9UQVJHRVQ9ImRpc3QiCi0KLW1hdHJpeDoKLSAgYWxsb3dfZmFpbHVyZXM6Ci0gICAgIyBnY2MgZmFpbHMgb24gdHJhdmlzIHNlZW1pbmdseSBkdWUgdG8gb3V0IG9mIG1lbW9yeQotICAgIC0gY29tcGlsZXI6IGdjYwotCi0gIGV4Y2x1ZGU6Ci0gICAgIyBUaGlzIG9uZSB0YWtlcyB2ZXJ5IGxvbmcKLSAgICAtIGNvbXBpbGVyOiBnY2MKLSAgICAgIGVudjogVEVTVF9OQU1FPSJtYWtlIGNyb3NzIChhdXRvbWFrZSkiIENPTkZJRz0iLS13aXRob3V0LXB5dGhvbiIgQUxMX0RFUFM9InllcyIgTUFLRV9UQVJHRVQ9ImNyb3NzIgotCi0gICAgIyBEb2VzIG5vdCB1c2UgbmF0aXZlIGNvbXBpbGVyLCBubyBuZWVkIHRvIGRvIGl0IHR3aWNlCi0gICAgLSBjb21waWxlcjogZ2NjCi0gICAgICBlbnY6IFRFU1RfTkFNRT0iY29tcGlsZXIgKG1pbmd3MzItZ2NjLCBDTWFrZSArIENQYWNrKSIgQ01BS0VfQ09ORklHPSItRENNQUtFX1RPT0xDSEFJTl9GSUxFPS4uL2J1aWxkL2NtYWtlL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIC1EQlVJTERfQ09NUElMRVI9T04gLURCVUlMRF9MSUJSQVJJRVM9T0ZGIC1EQlVJTERfVEVTVElORz1PRkYgLURCVUlMRF9FWEFNUExFUz1PRkYiCi0gICAgLSBjb21waWxlcjogZ2NjCi0gICAgICBlbnY6IFRFU1RfTkFNRT0iZGlzdCAoYXV0b21ha2UpIiBDT05GSUc9IiIgQUxMX0RFUFM9InllcyIgTUFLRV9UQVJHRVQ9ImRpc3QiCi0KK2pvYnM6CiAgIGluY2x1ZGU6Ci0gICAgLSBlbnY6Ci0gICAgICAgIC0gVEVTVF9OQU1FPSJEZWJpYW4gUGFja2FnZXMiCi0gICAgICBjb21waWxlcjogY2xhbmcKLSAgICAgIGJlZm9yZV9pbnN0YWxsOgotICAgICAgIC0gc2ggYnVpbGQvdHJhdmlzL2luc3RhbGxDWFhEZXBlbmRlbmNpZXMuc2g7Ci0gICAgICAgLSBzaCBidWlsZC90cmF2aXMvaW5zdGFsbERlcGVuZGVuY2llcy5zaCAxPiAvZGV2L251bGw7Ci0gICAgICAgLSBzdWRvIGFwdC1nZXQgaW5zdGFsbCBidWlsZC1lc3NlbnRpYWwgbW9uby1nbWNzIG1vbm8tZGV2ZWwgbGlibW9uby1zeXN0ZW0td2ViMi4wLWNpbCBlcmxhbmctYmFzZSBydWJ5MS44LWRldiBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnIHBocDUgcGhwNS1kZXYKLSAgICAgIHNjcmlwdDoKLSAgICAgICAtIGRwa2ctYnVpbGRwYWNrYWdlIC10YyAtdXMgLXVjCi0gICAgICAgLSBscyAtYWwgLi4KKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT0gc3RhZ2U6IGRvY2tlciA9PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLSBzdGFnZTogZG9ja2VyCisgICAgICBzY3JpcHQ6IHRydWUKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkRvY2tlciBCdWlsZCB1YnVudHUteGVuaWFsIDE2LjA0IExUUyIKKyAgICAgICAgLSBESVNUUk89dWJ1bnR1LXhlbmlhbAorICAgICAgICAtIFRSQVZJU19CVUlMRF9TVEFHRT1kb2NrZXIKKyAgICAtIHNjcmlwdDogdHJ1ZQorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iRG9ja2VyIEJ1aWxkIHVidW50dS1iaW9uaWMgMTguMDQgTFRTIgorICAgICAgICAtIERJU1RSTz11YnVudHUtYmlvbmljCisgICAgICAgIC0gVFJBVklTX0JVSUxEX1NUQUdFPWRvY2tlcgogCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09IHN0YWdlOiB0aHJpZnQgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGNyb3NzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyAoQmluYXJ5IFByb3RvY29sKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisgICAgICAgIC0gQlVJTERfQVJHPSItJyhiaW5hcnkpJyIKIAorICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyAoSGVhZGVyLCBKU09OIFByb3RvY29scykiCisgICAgICAgIC0gU0NSSVBUPSJjcm9zcy10ZXN0LnNoIgorICAgICAgICAtIEJVSUxEX0FSRz0iLScoaGVhZGVyfGpzb24pJyIKKworICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyAoQ29tcGFjdCBhbmQgTXVsdGlwbGV4ZWQgUHJvdG9jb2xzKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisgICAgICAgIC0gQlVJTERfQVJHPSItJyhjb21wYWN0fG11bHRpcGxleGVkKSciCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IHNjYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICMgUUEgam9icyBmb3IgY29kZSBhbmFseXRpY3MgYW5kIG1ldHJpY3MKKyAgICAtIHN0YWdlOiB0aHJpZnQKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iU3RhdGljIENvZGUgQW5hbHlzaXMiCisgICAgICAgIC0gU0NSSVBUPSJzY2Euc2giCiAKLSAgICAjIHN0YXRpYyBjb2RlIGFuYWx5c2lzIHdpdGggY3BwY2hlY2sgKHdlIGNhbiBhZGQgLS1lbmFibGU9YWxsIGxhdGVyKQotICAgIC0gZW52OiAgICBURVNUX05BTUU9ImNwcGNoZWNrIChjb21waWxlcikgZXJyb3IiCi0gICAgICBzY3JpcHQ6IGNwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGNvbXBpbGVyL2NwcC9zcmMKLSAgICAgIGJlZm9yZV9pbnN0YWxsOiBzdWRvIGFwdC1nZXQgaW5zdGFsbCBjcHBjaGVjawotICAgIC0gZW52OiAgICBURVNUX05BTUU9ImNwcGNoZWNrIChjcHApIGVycm9yIgotICAgICAgc2NyaXB0OiBjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lcnJvci1leGl0Y29kZT0xIC1qMiBsaWIvY3BwL3NyYyBsaWIvY3BwL3Rlc3QgdGVzdC9jcHAgdHV0b3JpYWwvY3BwCi0gICAgICBiZWZvcmVfaW5zdGFsbDogc3VkbyBhcHQtZ2V0IGluc3RhbGwgY3BwY2hlY2sKLSAgICAtIGVudjogICAgVEVTVF9OQU1FPSJjcHBjaGVjayAoY19nbGliKSBlcnJvciIKLSAgICAgIHNjcmlwdDogY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZXJyb3ItZXhpdGNvZGU9MSAtajIgbGliL2NfZ2xpYi9zcmMgbGliL2NfZ2xpYi90ZXN0IHRlc3QvY19nbGliL3NyYyB0dXRvcmlhbC9jX2dsaWIKLSAgICAgIGJlZm9yZV9pbnN0YWxsOiBzdWRvIGFwdC1nZXQgaW5zdGFsbCBjcHBjaGVjawotICAgICMgYWRkIC0tZXJyb3ItZXhpdGNvZGU9MSBhcyBzb29uIGFzIGV2ZXJ5dGhpbmcgaXMgZml4ZWQKLSAgICAtIGVudjogICAgVEVTVF9OQU1FPSJjcHBjaGVjayAoY29tcGlsZXIpIGFsbCIKLSAgICAgIHNjcmlwdDogY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgY29tcGlsZXIvY3BwL3NyYwotICAgICAgYmVmb3JlX2luc3RhbGw6IHN1ZG8gYXB0LWdldCBpbnN0YWxsIGNwcGNoZWNrCi0gICAgLSBlbnY6ICAgIFRFU1RfTkFNRT0iY3BwY2hlY2sgKGNwcCkgYWxsIgotICAgICAgc2NyaXB0OiBjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lbmFibGU9YWxsIC1qMiBsaWIvY3BwL3NyYyBsaWIvY3BwL3Rlc3QgdGVzdC9jcHAgdHV0b3JpYWwvY3BwCi0gICAgICBiZWZvcmVfaW5zdGFsbDogc3VkbyBhcHQtZ2V0IGluc3RhbGwgY3BwY2hlY2sKLSAgICAtIGVudjogICAgVEVTVF9OQU1FPSJjcHBjaGVjayAoY19nbGliKSBhbGwiCi0gICAgICBzY3JpcHQ6IGNwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVuYWJsZT1hbGwgLWoyIGxpYi9jX2dsaWIvc3JjIGxpYi9jX2dsaWIvdGVzdCB0ZXN0L2NfZ2xpYi9zcmMgdHV0b3JpYWwvY19nbGliCi0gICAgICBiZWZvcmVfaW5zdGFsbDogc3VkbyBhcHQtZ2V0IGluc3RhbGwgY3BwY2hlY2sKKyAgICAjIEMgYW5kIEMrKyB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgIyBBIGJpbmFyeSBjcmFzaGVzIGlmIHVuZGVmaW5lZCBiZWhhdmlvciBvY2N1cnMgYW5kIHByb2R1Y2VzIGEgc3RhY2sgdHJhY2UuCisgICAgIyBweXRob24gaXMgZGlzYWJsZWQsIHNlZTogVEhSSUZULTQzNjAKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iVUJTYW4iCisgICAgICAgIC0gU0NSSVBUPSJ1YnNhbi5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0td2l0aG91dC1weXRob24gLS13aXRob3V0LXB5MyIKIAotICAgICMgVE9ETyB1c2UgZmluZGJ1Z3MgZm9yIEphdmEKLSAgICAjIFRPRE8gdXNlIGZ4Y29wIGZvciBDIworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogYXV0b3Rvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBUT0RPOiBSZW1vdmUgdGhlbSBvbmNlIG1pZ3JhdGVkIHRvIENNYWtlCisgICAgLSBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkF1dG90b29scyAoVWJ1bnR1IEJpb25pYykiCisgICAgICAgIC0gU0NSSVBUPSJhdXRvdG9vbHMuc2giCiAKLSAgICAjIFRPRE8gZG8gc3R5bGUgY2hlY2tzCisgICAgLSBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkF1dG90b29scyAoVWJ1bnR1IFhlbmlhbCkiCisgICAgICAgIC0gRElTVFJPPXVidW50dS14ZW5pYWwKKyAgICAgICAgLSBTQ1JJUFQ9ImF1dG90b29scy5zaCIKIAotICAgICMgc2VhcmNoIGZvciBUT0RPIHdpdGhpbiBzb3VyY2UgdHJlZQotICAgIC0gZW52OiAgICBURVNUX05BTUU9IlRPRE8iCi0gICAgICBiZWZvcmVfaW5zdGFsbDoKLSAgICAgIHNjcmlwdDogZ3JlcCAtciBUT0RPICoKLSAgICAjIHNlYXJjaCBmb3IgRklYTUUgd2l0aGluIHNvdXJjZSB0cmVlCi0gICAgLSBlbnY6ICAgIFRFU1RfTkFNRT0iRklYTUUiCi0gICAgICBiZWZvcmVfaW5zdGFsbDoKLSAgICAgIHNjcmlwdDogZ3JlcCAtciBGSVhNRSAqCi0gICAgIyBzZWFyY2ggZm9yIEhBQ0sgd2l0aGluIHNvdXJjZSB0cmVlCi0gICAgLSBlbnY6ICAgIFRFU1RfTkFNRT0iSEFDSyIKLSAgICAgIGJlZm9yZV9pbnN0YWxsOgotICAgICAgc2NyaXB0OiBncmVwIC1yIEhBQ0sgKgotICAgICMgc29tZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBjb2RlIGJhc2UKLSAgICAtIGVudjogICAgVEVTVF9OQU1FPSJzbG9jY291bnQiCi0gICAgICBiZWZvcmVfaW5zdGFsbDoKLSAgICAgIHNjcmlwdDogc2xvY2NvdW50IC4KLSAgICAgIGJlZm9yZV9pbnN0YWxsOiBzdWRvIGFwdC1nZXQgaW5zdGFsbCBzbG9jY291bnQKLSAgICAjIHNvbWUgaW5mbyBhYm91dCB0aGUgYnVpbGQgbWFjaGluZQotICAgIC0gZW52OiAgICBURVNUX05BTUU9ImluZm8iCi0gICAgICBiZWZvcmVfaW5zdGFsbDoKLSAgICAgIHNjcmlwdDoKLSAgICAgICAtIGRwa2cgLWwKLSAgICAgICAtIHVuYW1lIC1hCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBjbWFrZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ01ha2UiCisgICAgICAgIC0gQlVJTERfQVJHPSItRENNQUtFX0JVSUxEX1RZUEU9RGVidWciCiAKLSMgVE9ETyBtYWtlIGl0IHBlcmZlY3QgOy1yCi0jCisgICAgLSBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNNYWtlIgorICAgICAgICAtIEJVSUxEX0FSRz0iLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UiCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGRpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJtYWtlIGRpc3QiCisgICAgICAgIC0gU0NSSVBUPSJtYWtlLWRpc3Quc2giCisKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iRGViaWFuIFBhY2thZ2VzIgorICAgICAgICAtIFNDUklQVD0iZHBrZy5zaCIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogY292ZXJpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBXZSBidWlsZCB0aGUgY292ZXJpdHkgc2NhbiBidWlsZCBvbmNlIG1vbnRobHkgdXNpbmcgYSB0cmF2aXMgY3JvbiBqb2IKKyAgICAtIGlmOiAoZW52KENPVkVSSVRZX1NDQU5fTk9USUZJQ0FUSU9OX0VNQUlMKSBJUyBwcmVzZW50KSBBTkQgKGJyYW5jaCBJTiAobWFzdGVyKSkgQU5EICh0eXBlIElOIChjcm9uKSkKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ292ZXJpdHkgU2NhbiIKKyAgICAgICAgLSBTQ1JJUFQ9ImNvdnNjYW4uc2giCisgICAgIAorCisgICMjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBvc3ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIyBkaXNhYmxlZCBkdWUgdG8gdGhlIHRpbWUgZGVsYXlzIGl0IGltcG9zZXMgb24gYnVpbGQgam9icworICAjIC0gb3M6IG9zeAorICAjICAgb3N4X2ltYWdlOiB4Y29kZTkKKyAgIyAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoCisKZGlmZiAtLWdpdCBhL0FwYWNoZVRocmlmdC5udXNwZWMgYi9BcGFjaGVUaHJpZnQubnVzcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZDkyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9BcGFjaGVUaHJpZnQubnVzcGVjCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorCis8IS0tCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICBJbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIGEgbnVnZXQgcGFja2FnZToKKworICAxLiBPcGVuIFRocmlmdC5zbG4gaW4gbGliXGNzaGFycFxzcmMgYW5kIGJ1aWxkIHRoZSByZWxlYXNlIHZlcnNpb24KKyAgICAgb2YgdGhlICJUaHJpZnQiIGFuZCAiVGhyaWZ0LjQ1IiBwcm9qZWN0cy4KKyAgMi4gT3BlbiBUaHJpZnQuc2xuIGluIGxpYlxuZXRjb3JlIGFuZCBidWlsZCB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mCisgICAgIHRoZSAiVGhyaWZ0IiBwcm9qZWN0LgorICAzLiBudWdldCBzZXRBcGlLZXkgPHlvdXItYXBpLWtleT4KKyAgMy4gbnVnZXQgcGFjayBBcGFjaGVUaHJpZnQubnVzcGVjIC1TeW1ib2xzIC1TeW1ib2xQYWNrYWdlRm9ybWF0IHNudXBrZworICA0LiBudWdldCBwdXNoIEFwYWNoZVRocmlmdC4wLjEzLjAubnVwa2cgLVNvdXJjZSBodHRwczovL2FwaS5udWdldC5vcmcvdjMvaW5kZXguanNvbgorICAtLT4KKworPHBhY2thZ2UgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vcGFja2FnaW5nLzIwMTMvMDUvbnVzcGVjLnhzZCI+CisgIDxtZXRhZGF0YT4KKyAgICA8aWQ+QXBhY2hlVGhyaWZ0PC9pZD4KKyAgICA8dmVyc2lvbj4wLjEzLjA8L3ZlcnNpb24+CisgICAgPHRpdGxlPkFwYWNoZSBUaHJpZnQgMC4xMy4wPC90aXRsZT4KKyAgICA8YXV0aG9ycz5BcGFjaGUgVGhyaWZ0IERldmVsb3BlcnM8L2F1dGhvcnM+CisgICAgPG93bmVycz5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvb3duZXJzPgorICAgIDxsaWNlbnNlIHR5cGU9ImV4cHJlc3Npb24iPkFwYWNoZS0yLjA8L2xpY2Vuc2U+CisgICAgPHByb2plY3RVcmw+aHR0cDovL3RocmlmdC5hcGFjaGUub3JnLzwvcHJvamVjdFVybD4KKyAgICA8cmVxdWlyZUxpY2Vuc2VBY2NlcHRhbmNlPnRydWU8L3JlcXVpcmVMaWNlbnNlQWNjZXB0YW5jZT4KKyAgICA8c3VtbWFyeT5BcGFjaGUgVGhyaWZ0IC5ORVQgTGlicmFyeTwvc3VtbWFyeT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBDb250YWlucyBydW50aW1lIGxpYnJhcmllcyBmcm9tIGxpYi9jc2hhcnAgZm9yIG5ldDM1IGFuZCBuZXQ0NSBmcmFtZXdvcmtzLCAKKyAgICAgIGFuZCBmcm9tIGxpYi9uZXRjb3JlIGZvciBuZXRzdGFuZGFyZDIuMCBmcmFtZXdvcmsgZGV2ZWxvcG1lbnQuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8cmVwb3NpdG9yeSB0eXBlPSJHaXRIdWIiIHVybD0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiIGJyYW5jaD0icmVsZWFzZS8wLjEzLjAiIC8+CisgICAgPHRhZ3M+QXBhY2hlIFRocmlmdCBSUEM8L3RhZ3M+CisgIDwvbWV0YWRhdGE+CisgIDxmaWxlcz4KKyAgICA8ZmlsZSBzcmM9ImxpYlxjc2hhcnBcc3JjXGJpblxSZWxlYXNlXFRocmlmdC4qIiB0YXJnZXQ9ImxpYlxuZXQzNSIgLz4KKyAgICA8ZmlsZSBzcmM9ImxpYlxjc2hhcnBcc3JjXGJpblxSZWxlYXNlXFRocmlmdDQ1LioiIHRhcmdldD0ibGliXG5ldDQ1IiAvPgorICAgIDxmaWxlIHNyYz0ibGliXG5ldGNvcmVcVGhyaWZ0XGJpblxSZWxlYXNlXG5ldHN0YW5kYXJkMi4wXCouKiIgdGFyZ2V0PSJsaWJcbmV0c3RhbmRhcmQyLjAiIC8+CisgIDwvZmlsZXM+Cis8L3BhY2thZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvQ0hBTkdFUyBiL0NIQU5HRVMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjg0MWIuLjAwMDAwMDAKLS0tIGEvQ0hBTkdFUworKysgL2Rldi9udWxsCkBAIC0xLDE3ODUgKzAsMCBAQAotQXBhY2hlIFRocmlmdCBDaGFuZ2Vsb2cKLQotVGhyaWZ0IDAuOS4zLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIyBCdWcKLSAgICAqIFtUSFJJRlQtNDUwNl0gLSBDVkUtMjAxOC0xMzIwIGZvciBKYXZhIFNBU0wgYmFja3BvcnRlZCBmcm9tIDAuMTIuMAotCi0KLVRocmlmdCAwLjkuMwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMjIEJ1ZwotICAgICogW1RIUklGVC0yNDQxXSAtIENhbm5vdCBzaHV0ZG93biBUVGhyZWFkZWRTZXJ2ZXIgd2hlbiBjbGllbnRzIGFyZSBzdGlsbCBjb25uZWN0ZWQKLSAgICAqIFtUSFJJRlQtMjQ2NV0gLSBUQmluYXJ5UHJvdG9jb2xUIGJyZWFrcyBpZiBjb3BpZWQvbW92ZWQKLSAgICAqIFtUSFJJRlQtMjQ3NF0gLSB0aHJpZnQuaCBjYXVzZXMgYSBjb21waWxlIGZhaWx1cmUKLSAgICAqIFtUSFJJRlQtMjU0MF0gLSBSdW5uaW5nIGNvbmZpZ3VyZSBmcm9tIG91dHNpZGUgdGhlIHNvdXJjZSBkaXJlY3RvcnkgZmFpbHMKLSAgICAqIFtUSFJJRlQtMjU5OF0gLSBBZGQgY2hlY2sgZm9yIG1pbmltdW0gR28gdmVyc2lvbiB0byBjb25maWd1cmUuYWMKLSAgICAqIFtUSFJJRlQtMjY0N10gLSBjb21waWxlci1oczogZG9uJ3QgZGVjYXBpdGFsaXplIGZpZWxkIG5hbWVzLCBkbyBkZWNhcGl0YWxpemUgYXJndW1lbnQgYmluZGluZ3MKLSAgICAqIFtUSFJJRlQtMjc3M10gLSBHZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciAnb25ld2F5JyBtZXRob2RzIGlzIGluY29ycmVjdC4KLSAgICAqIFtUSFJJRlQtMjc4OV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgbGVha3Mgc29ja2V0IEZEJ3MgdW5kZXIgbG9hZAotICAgICogW1RIUklGVC0yNjgyXSAtIFRUaHJlYWRlZFNlcnZlciBsZWFrcyBwZXItdGhyZWFkIG1lbW9yeQotICAgICogW1RIUklGVC0yNjc0XSAtIEphdmFTY3JpcHQ6IGRlY2xhcmUgQWNjZXB0OiBhbmQgQ29udGVudC1UeXBlOiBpbiByZXF1ZXN0Ci0gICAgKiBbVEhSSUZULTMwNzhdIC0gVE5vbmJsb2NraW5nU2VydmVyU29ja2V0J3MgbG9nZ2VyIGlzIG5vdCBuYW1lZCBhZnRlciBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQKLSAgICAqIFtUSFJJRlQtMzA3N10gLSBDKysgVEZpbGVUcmFuc3BvcnQgaWdub3JlcyByZXR1cm4gY29kZSBmcm9tIGZ0cnVuY2F0ZQotICAgICogW1RIUklGVC0zMDY3XSAtIEMrKyBjcHBjaGVjayBwZXJmb3JtYW5jZSByZWxhdGVkIHdhcm5pbmdzCi0gICAgKiBbVEhSSUZULTMwNjZdIC0gQysrIFREZW5zZVByb3RvY29sIGFzc2VydCBtb2RpZmllcyBpbnN0ZWFkIG9mIGNoZWNrcwotICAgICogW1RIUklGVC0zMDcxXSAtIGJvb3RzdHJhcC5zaCBvbiBVYnVudHUgMTIuMDQgKFByZWNpc2UpIGF1dG9tYWtlIGVycm9yCi0gICAgKiBbVEhSSUZULTMwNjldIC0gQysrIFRTZXJ2ZXJTb2NrZXQgbGVha3Mgc29ja2V0IG9uIGZjbnRsIGdldCBvciBzZXQgZmxhZ3MgZXJyb3IKLSAgICAqIFtUSFJJRlQtMzA3OV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQncyBsb2dnZXIgaXMgbm90IG5hbWVkIGFmdGVyIFROb25ibG9ja2luZ1NlcnZlclNvY2tldAotICAgICogW1RIUklGVC0zMDgwXSAtIEMrKyBUTm9uYmxvY2tpbmdTZXJ2ZXIgY29ubmVjdGlvbiBsZWFrIHdoaWxlIGFjY2VwdCBodWdlIG51bWJlciBjb25uZWN0aW9ucy4KLSAgICAqIFtUSFJJRlQtMzA4Nl0gLSBDKysgVmFsZ3JpbmQgRXJyb3IgQ2xlYW51cAotICAgICogW1RIUklGVC0zMDg1XSAtIHRocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50IG5ldmVyIHRyeSB0byByZWNvbm5lY3QKLSAgICAqIFtUSFJJRlQtMzEyM10gLSBNaXNzaW5nIGluY2x1ZGUgaW4gY29tcGlsZXIvY3BwL3NyYy9tYWluLmggYnJlYWtzIGJ1aWxkIGluIHNvbWUgZW52aXJvbm1lbnRzCi0gICAgKiBbVEhSSUZULTMxMjVdIC0gRml4IHRoZSBsaXN0IG9mIGV4cG9ydGVkIGhlYWRlcnMgaW4gYXV0b21ha2UgaW5wdXQKLSAgICAqIFtUSFJJRlQtMzEyNl0gLSBQSFAgSlNPTiBzZXJpYWxpemVyIGNvbnZlcnRzIGVtcHR5IG9yIGludC1pbmRleGVkIG1hcHMgdG8gbGlzdHMKLSAgICAqIFtUSFJJRlQtMzEzMl0gLSBQcm9wZXJseSBmb3JtYXQgZGF0ZSBpbiBKYXZhIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnMKLSAgICAqIFtUSFJJRlQtMzEzN10gLSBUcmF2aXMgYnVpbGQgaGFuZ3MgYWZ0ZXIgZmFpbHVyZQotICAgICogW1RIUklGVC0zMTM4XSAtICJtYWtlIGNoZWNrIiBwYXJhbGxlbCBleGVjdXRpb24gaXMgdW5kZXJtaW5pc3RpYwotICAgICogW1RIUklGVC0zMTM5XSAtIEpTIGxpYnJhcnkgdGVzdCBpcyBmbGFreQotICAgICogW1RIUklGVC0zMTQwXSAtIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gaXMgdGhyb3duIGJ5IEphdmFTY3JpcHQgdGVzdCBzZXJ2ZXIKLSAgICAqIFtUSFJJRlQtMzEyNF0gLSBTb21lIHNpZ25lZC91bnNpZ25lZCB3YXJuaW5ncyB3aGlsZSBidWlsZGluZyBjb21waWxlcgotICAgICogW1RIUklGVC0zMTI4XSAtIEdvIGdlbmVyYXRlZCBjb2RlIHByb2R1Y2VzIG5hbWUgY29sbGlzaW9ucyBiZXR3ZWVuIHNlcnZpY2VzCi0gICAgKiBbVEhSSUZULTMxNDZdIC0gR3JhcGh2aXogZ2VuZXJhdGVzIGZ1bmN0aW9uIG5hbWUgY29sbGlzaW9ucyBiZXR3ZWVuIHNlcnZpY2VzCi0gICAgKiBbVEhSSUZULTMxNDddIC0gU2VnZmF1bHQgd2hpbGUgcmVjZWl2aW5nIGRhdGEKLSAgICAqIFtUSFJJRlQtMzE0OF0gLSBNYXJrZG93biBsaW5rcyB0byBjb2Rpbmdfc3RhbmRhcmRzIGFyZSBkZWFkCi0gICAgKiBbVEhSSUZULTMwOTBdIC0gY21ha2UgYnVpbGQgaXMgYnJva2VuIG9uIE1hY09TWAotICAgICogW1RIUklGVC0zMDk3XSAtIGNtYWtlIHRhcmdldHMgdW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBvcHRpb25hbCBsaWJyYXJpZXMKLSAgICAqIFtUSFJJRlQtMzA5NF0gLSBtYXN0ZXIgYXMgb2YgMjAxNS1BUFItMTMgZmFpbHMgLURCT09TVF9USFJFQURTIGNtYWtlIGJ1aWxkCi0gICAgKiBbVEhSSUZULTMwOTldIC0gY21ha2UgYnVpbGQgaXMgYnJva2VuIG9uIEZyZWVCU0QKLSAgICAqIFtUSFJJRlQtMzA4OV0gLSBBc3NpZ25pbmcgZGVmYXVsdCBFTlVNIHZhbHVlcyByZXN1bHRzIGluIG5vbi1jb21waWxhYmxlIGphdmEgY29kZSBpZiBqYXZhIG5hbWVzcGFjZSBpcyBub3QgZGVmaW5lZAotICAgICogW1RIUklGVC0zMDkzXSAtIG1pbmd3IGNvbXBpbGUgZml4ZXMgZm9yIGMrKyBsaWJyYXJ5IDAuOS4yCi0gICAgKiBbVEhSSUZULTMwOThdIC0gVGhyaWZ0IGRvZXMgbm90IHByZXR0eSBwcmludCBiaW5hcnkgdHlwZWRlZnMgdGhlIHdheSBpdCBkb2VzIGJpbmFyeSBmaWVsZHMKLSAgICAqIFtUSFJJRlQtMzA5MV0gLSBjX2dsaWIgc2VydmljZSBtZXRob2Qgc2hvdWxkIHJldHVybiByZXN1bHQgZnJvbSBoYW5kbGVyIG1ldGhvZAotICAgICogW1RIUklGVC0zMDg4XSAtIFRUaHJlYWRQb29sU2VydmVyIHdpdGggU2FzbCBhdXRoIG1heSBsZWFrIENMT1NFX1dBSVQgc29ja2V0Ci0gICAgKiBbVEhSSUZULTMxMDldIC0gQ3Jvc3MgdGVzdCBsb2cgZmlsZSBjYW5ub3QgYmUgYnJvd3NlZCB3aGVuIHNlcnZlZCBpbiBIVFRQIHNlcnZlcgotICAgICogW1RIUklGVC0zMTEzXSAtIG00IEMrKzExIG1hY3JvIGlzc3VlCi0gICAgKiBbVEhSSUZULTMxMDVdIC0gQysrIGxpYnRocmlmdG5iIGxpYnJhcnkgb24gV2luZG93cyBidWlsZCBmYWlsdXJlCi0gICAgKiBbVEhSSUZULTMxMTVdIC0gVW5jb21waWxlYWJsZSBjb2RlIGR1ZSB0byBuYW1lIGNvbGxpc2lvbiB3aXRoIHByZWRlZmluZWQgdXNlZCB0eXBlcwotICAgICogW1RIUklGVC0zMTE3XSAtIEphdmEgVFNTTFRyYW5zcG9ydEZhY3RvcnkgY2FuJ3QgbG9hZCBjZXJ0aWZpY2F0ZXMgd2l0aGluIEpBUiBhcmNoaXZlCi0gICAgKiBbVEhSSUZULTMxMDJdIC0gY291bGQgbm90IG1ha2UgY2hlY2sgZm9yIEdvIExpYnJhcnkKLSAgICAqIFtUSFJJRlQtMzEyMF0gLSBNaW5vciBzcGVsbGluZyBlcnJvcnMgYW5kIGFuIG91dGRhdGVkIFVSTAotICAgICogW1RIUklGVC0zMTIxXSAtIExpYnJ0IGRvZXMgbm90IGV4aXN0IG9uIE9TIFgKLSAgICAqIFtUSFJJRlQtMzE1Ml0gLSBDb21waWxlciBlcnJvciBvbiBNYWMgT1NYIChtaXNzaW5nICNpbmNsdWRlIDxjc3RkbGliPikKLSAgICAqIFtUSFJJRlQtMzE2Ml0gLSBtYWtlIGZhaWxzIGZvciBkbWQgMi4wNjcKLSAgICAqIFtUSFJJRlQtMzE2NF0gLSBUaHJpZnQgQysrIGxpYnJhcnkgU1NMIHNvY2tldCBieSBkZWZhdWx0IGFsbG93cyBmb3IgdW5zZWN1cmUgU1NMdjMgbmVnb3RpYXRpb24KLSAgICAqIFtUSFJJRlQtMzE2OF0gLSBGaXggTWF2ZW4gUE9NCi0gICAgKiBbVEhSSUZULTMxNzBdIC0gSW5pdGlhbGlzbSBjb2RlIGluIHRoZSBHbyBjb21waWxlciBjYXVzZXMgY2hhb3MKLSAgICAqIFtUSFJJRlQtMzE2OV0gLSBEbyBub3QgZXhwb3J0IHRocmlmdC5UZXN0U3RydWN0IGFuZCB0aHJpZnQuVGVzdEVudW0gaW4gdGhyaWZ0IEdvIGxpYnJhcnkgCi0gICAgKiBbVEhSSUZULTMxOTFdIC0gUGVybCBjb21waWxlciBkb2VzIG5vdCBhZGQgc3VwcG9ydCBmb3IgdW5leHBlY3RlZCBleGNlcHRpb24gaGFuZGxpbmcKLSAgICAqIFtUSFJJRlQtMzE3OF0gLSBnbGliIEMgZG9lcyBub3QgY29tcGlsZQotICAgICogW1RIUklGVC0zMTg5XSAtIFBlcmwgU2VydmVyU29ja2V0IHNob3VsZCBhbGxvdyBhIHNwZWNpZmljIGludGVyZmFjZSB0byBiZSBsaXN0ZW5lZCB0bwotICAgICogW1RIUklGVC0zMjUyXSAtIE1pc3NpbmcgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIGluIGNwcCBNYWtlZmlsZSwgc28gZG9lc24ndCBpbnN0YWxsCi0gICAgKiBbVEhSSUZULTMyNTVdIC0gVGhyaWZ0IGdlbmVyYXRvciBkb2Vzbid0IGV4Y2x1ZGUgJ3BhY2thZ2UnIGtleXdvcmQgZm9yIHRocmlmdCBwcm9wZXJ0eSBuYW1lcyBicmVha2luZyBqYXZhIGJ1aWxkcwotICAgICogW1RIUklGVC0zMjYwXSAtIG11bHRpcGxlIHdhcm5pbmdzIGluIGNfZ2xpYiB0dXRvcmlhbAotICAgICogW1RIUklGVC0zMjU2XSAtIFNvbWUgRCB0ZXN0IHRpbWluZ3MgYXJlIHRvbyBhZ2dyZXNzaXZlIGZvciBzbG93IG1hY2hpbmVzCi0gICAgKiBbVEhSSUZULTMyNTddIC0gd2FybmluZzogZXh0cmEgdG9rZW5zIGF0IGVuZCBvZiAjZW5kaWYgZGlyZWN0aXZlCi0gICAgKiBbVEhSSUZULTMxODRdIC0gVGhyaWZ0IEdvIGxlYXZlcyBmaWxlIGRlc2NyaXB0b3JzIG9wZW4KLSAgICAqIFtUSFJJRlQtMzIwM10gLSBET0FQIC0gcGxlYXNlIGZpeCAiT2NhbWwiID0+ICJPQ2FtbCIKLSAgICAqIFtUSFJJRlQtMzIxMF0gLSAodW5jb21waWxlYWJsZSkgY29kZSBnZW5lcmF0ZWQgZm9yIHNlcnZlciBldmVudHMgd2hpbGUgYXJlIGV2ZW50cyBub3QgZW5hYmxlZAotICAgICogW1RIUklGVC0zMjE1XSAtIFRKU09OUHJvdG9jb2wgJyhjKyspIHVzZXMgInRocm93IG5ldyIgdG8gdGhyb3cgZXhjZXB0aW9ucyBpbnN0ZWFkIG9mICJ0aHJvdyIKLSAgICAqIFtUSFJJRlQtMzIwMl0gLSBBbGxvdyBIU0hBU2VydmVyIHRvIGNvbmZpZ3VyZSBtaW4gYW5kIG1heCB3b3JrZXIgdGhyZWFkcyBzZXBhcmF0ZWx5LgotICAgICogW1RIUklGVC0zMjA1XSAtIFRDb21wYWN0UHJvdG9jb2wgcmV0dXJuIGEgd3JvbmcgZXJyb3Igd2hlbiB0aGUgaW8uRU9GIGhhcHBlbnMKLSAgICAqIFtUSFJJRlQtMzIwOV0gLSBMR1BMIG1lbnRpb25lZCBpbiBsaWNlbnNlIGZpbGUKLSAgICAqIFtUSFJJRlQtMzE5N10gLSBrZWVwQWxpdmVUaW1lIGlzIGhhcmQgY29kZWQgYXMgNjAgc2VjIGluIFRUaHJlYWRQb29sU2VydmVyCi0gICAgKiBbVEhSSUZULTMxOTZdIC0gTWlzc3BlbGxpbmcgaW4gbHVhIFRCaW5hcnlQcm90b2NvbCAoc3RpcmN0V3JpdGUgPT4gc3RyaWN0V3JpdGUpCi0gICAgKiBbVEhSSUZULTMxOThdIC0gQWxsb3cgY29uc3RydWN0aW9uIG9mIFRUcmFuc3BvcnRGYWN0b3J5IHdpdGggYSBzcGVjaWZpZWQgbWF4TGVuZ3RoCi0gICAgKiBbVEhSSUZULTMxOTJdIC0gR28gaW1wb3J0IHBhdGhzIGNoYW5nZWQgaW4gMS40LCBhbmQgZXhwaXJlZCBKdW5lIDEKLSAgICAqIFtUSFJJRlQtMzI3MV0gLSBDb3VsZCBub3QgZmluZCBvciBsb2FkIG1haW4gY2xhc3MgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YSBvbiBzb21lIG5vbi1lbmdsaXNoIHN5c3RlbXMKLSAgICAqIFtUSFJJRlQtMzI3M10gLSBjX2dsaWI6IEdlbmVyYXRlZCBjb2RlIHRyaWVzIHRvIGNvbnZlcnQgYmV0d2VlbiBmdW5jdGlvbiBhbmQgdm9pZCBwb2ludGVycwotICAgICogW1RIUklGVC0zMjY0XSAtIEZpeCBFcmxhbmcgMTYgbmFtZXNwYWNlZCB0eXBlcwotICAgICogW1RIUklGVC0zMjcwXSAtIHJldXNpbmcgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiBjYXVzZSBkaXJ0eSBUU29ja2V0Ci0gICAgKiBbVEhSSUZULTMyNjddIC0gY19nbGliOiAiQ3JpdGljYWwiIGZhaWx1cmUgZHVyaW5nIHVuaXQgdGVzdHMKLSAgICAqIFtUSFJJRlQtMzI3N10gLSBUSHR0cENsaWVudCBsZWFrcyBjb25uZWN0aW9ucyBpZiBpdCdzIHVzZWQgZm9yIG11bHRpcGxlIHJlcXVlc3RzCi0gICAgKiBbVEhSSUZULTMyNzhdIC0gTm9kZUpTOiBGaXggZXhjZXB0aW9uIHN0YWNrIHRyYWNlcyBhbmQgbmFtZXMKLSAgICAqIFtUSFJJRlQtMzI3OV0gLSBGaXggYSBidWcgaW4gcmV0cnlfbWF4X2RlbGF5IChOb2RlSlMpCi0gICAgKiBbVEhSSUZULTMyODBdIC0gSW5pdGlhbGl6ZSByZXRyeSB2YXJpYWJsZXMgb24gY29uc3RydWN0aW9uCi0gICAgKiBbVEhSSUZULTMyODNdIC0gY19nbGliOiBUdXRvcmlhbCBzZXJ2ZXIgYWx3YXlzIGV4aXRzIHdpdGggd2FybmluZwotICAgICogW1RIUklGVC0zMjg0XSAtIGNfZ2xpYjogRW1wdHkgc2VydmljZSBwcm9kdWNlcyB1bnVzZWQtdmFyaWFibGUgd2FybmluZwotICAgICogW1RIUklGVC0xOTI1XSAtIGNfZ2xpYiBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBjb21waWxlCi0gICAgKiBbVEhSSUZULTE4NDldIC0gYWZ0ZXIgdHJhbnNwb3J0LT5vcGVuKCkgb3BlbnMgaXNPcGVuIHJldHVybnMgdHJ1ZSBhbmQgbmV4dCBvcGVuKCkgZ29lcyB0aHJ1IHdoZW4gaXQgc2hhbGwgbm90Ci0gICAgKiBbVEhSSUZULTE4NjZdIC0gamF2YSBjb21waWxlciBnZW5lcmF0ZXMgbm9uLWNvbXBpbGluZyBjb2RlIHdpdGggY29uc3QncyBkZWZpbmVkIGluIGEgdGhyaWZ0IHdoZW4gbmFtZSBpbmNsdWRlcyBub24taWRlbnRpZmllciBjaGFycwotICAgICogW1RIUklGVC0xOTM4XSAtIEZ1bmN0aW9uUnVubmVyLmggLS0gdXNlcyB3cm9uZyBwYXRoIGZvciBUaHJlYWQuaCB3aGVuIGluc3RhbGxlZAotICAgICogW1RIUklGVC0xODQ0XSAtIFBhc3N3b3JkIHN0cmluZyBub3QgY2xlYXJlZAotICAgICogW1RIUklGVC0yMDA0XSAtIFRocmlmdDo6VW5pb24gdmlvbGF0ZXMgOj09IG1ldGhvZCBjb250cmFjdCBhbmQgY3Jhc2hlcwotICAgICogW1RIUklGVC0yMDczXSAtIFRocmlmdCBDKysgVEh0dHBDbGllbnQgZXJyb3I6IGNhbm5vdCByZWZpbGwgYnVmZmVyCi0gICAgKiBbVEhSSUZULTIxMjddIC0gQXV0b2NvbmYgc2NyaXB0aW5nIGRvZXMgbm90IHByb3Blcmx5IGFjY291bnQgZm9yIGNyb3NzLWNvbXBpbGUKLSAgICAqIFtUSFJJRlQtMjE4MF0gLSBJbnRlZ2VyIHR5cGVzIGlzc3VlcyBpbiBDb2NvYSBsaWIgb24gQVJNNjQKLSAgICAqIFtUSFJJRlQtMjE4OV0gLSBHbyBuZWVkcyAiaXNzZXQiIHRvIGZ1bGx5IHN1cHBvcnQgInVuaW9uIiB0eXBlIChhbmQgb3B0aW9uYWxzKQotICAgICogW1RIUklGVC0yMTkyXSAtIGF1dG90b29scyBvbiBSZWRoYXQgYmFzZWQgc3lzdGVtcwotICAgICogW1RIUklGVC0yNTQ2XSAtIGNyb3NzIGxhbmd1YWdlIHRlc3RzIGZhaWxzIGF0ICdUZXN0TXVsdGlFeGNlcHRpb24nIHdoZW4gdXNpbmcgbm9kZWpzIHNlcnZlcgotICAgICogW1RIUklGVC0yNTQ3XSAtIG5vZGVqcyBzZXJ2ZXJzIGFuZCBjbGllbnRzIGZhaWxzIHRvIGNvbm5lY3Qgd2l0aCBjcHAgdXNpbmcgY29tcGFjdCBwcm90b2NvbAotICAgICogW1RIUklGVC0yNTQ4XSAtIE5vZGVqcyBzZXJ2ZXJzIGFuZCBjbGllbnRzIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgd2l0aCAgLXNzbAotICAgICogW1RIUklGVC0xNDcxXSAtIHRvU3RyaW5nKCkgZG9lcyBub3QgcHJpbnQgQnl0ZUJ1ZmZlciB2YWx1ZXMgd2hlbiBuZXN0ZWQgaW4gYSBMaXN0Ci0gICAgKiBbVEhSSUZULTEyMDFdIC0gZ2V0YWRkcmluZm8gcmVzb3VyY2UgbGVhawotICAgICogW1RIUklGVC02MTVdIC0gVFRocmVhZFBvb2xTZXJ2ZXIgZG9lc24ndCBjYWxsIHRhc2tfZG9uZSBhZnRlciBwdWxsaW5nIHRhc2tzIGZyb20gaXQncyBjbGllbnRzIHF1ZXVlCi0gICAgKiBbVEhSSUZULTE2Ml0gLSBUaHJpZnQgc3RydWN0dXJlcyBhcmUgdW5oYXNoYWJsZSwgcHJldmVudGluZyB0aGVtIGZyb20gYmVpbmcgdXNlZCBhcyBzZXQgZWxlbWVudHMKLSAgICAqIFtUSFJJRlQtODEwXSAtIENyYXNoZWQgY2xpZW50IG9uIFRTb2NrZXQ6OmNsb3NlIHVuZGVyIGxvYWRzCi0gICAgKiBbVEhSSUZULTU1N10gLSBjaGFyc2V0IHByb2JsZW0gd2l0aCBmaWxlIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0Ci0gICAgKiBbVEhSSUZULTIzM10gLSBJREwgZG9lc24ndCBzdXBwb3J0IG5lZ2F0aXZlIGhleCBsaXRlcmFscwotICAgICogW1RIUklGVC0xNjQ5XSAtIGNvbnRyaWIvemVyb21xIGRvZXMgbm90IGJ1aWxkIGluIDAuOC4wCi0gICAgKiBbVEhSSUZULTE2NDJdIC0gTWlzY2FsY3VsYXRpb24gbGVhZCB0byB0aHJvdyB1bmV4cGVjdGVkICJUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQiKG9yIGNhbGxlZCAiRUFHQUlOICh0aW1lZCBvdXQpIikgZXhjZXB0aW9uCi0gICAgKiBbVEhSSUZULTE1ODddIC0gVFNvY2tldDo6c2V0UmVjdlRpbWVvdXQgZXJyb3IKLSAgICAqIFtUSFJJRlQtMTI0OF0gLSBwb2ludGVyIHN1YnRyYWN0aW9uIGluIFRNZW1vcnlCdWZmZXIgcmVsaWVzIG9uIHVuZGVmaW5lZCBiZWhhdmlvcgotICAgICogW1RIUklGVC0xNzc0XSAtIFNhc2wgVHJhbnNwb3J0IGNsaWVudCB3b3VsZCBoYW5nIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3Qgbm9uLXNhc2wgdHJhbnNwb3J0IHNlcnZlcgotICAgICogW1RIUklGVC0xNzU0XSAtIFJhbmdlRXJyb3IgaW4gYnVmZmVyIGhhbmRsaW5nCi0gICAgKiBbVEhSSUZULTE2MThdIC0gc3RhdGljIHN0cnVjdE1hcCBpbiBGaWVsZE1ldGFEYXRhIGlzIG5vdCB0aHJlYWQgc2FmZSBhbmQgY2FuIGxlYWQgdG8gZGVhZGxvY2tzCi0gICAgKiBbVEhSSUZULTIzMzVdIC0gdGhyaWZ0IGluY29tcGF0aWJpbGl0eSB3aXRoIHB5OnRvcm5hZG8gYXMgc2VydmVyLCBqYXZhIGFzIGNsaWVudAotICAgICogW1RIUklGVC0yODAzXSAtIFRDUF9ERUZFUl9BQ0NFUFQgbm90IHN1cHBvcnRlZCB3aXRoIGRvbWFpbiBzb2NrZXRzCi0gICAgKiBbVEhSSUZULTI3OTldIC0gQnVpbGQgUHJvYmxlbShzKTogbGQ6IGxpYnJhcnkgbm90IGZvdW5kIGZvciAtbDpsaWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKLSAgICAqIFtUSFJJRlQtMjgwMV0gLSBDKysgdGVzdCBzdWl0ZSBjb21waWxhdGlvbiB3YXJuaW5ncwotICAgICogW1RIUklGVC0yODAyXSAtIEMrKyB0dXRvcmlhbCBjb21waWxhdGlvbiB3YXJuaW5ncwotICAgICogW1RIUklGVC0yNzk1XSAtIHRocmlmdF9iaW5hcnlfcHJvdG9jb2wuYzogJ2RlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcycKLSAgICAqIFtUSFJJRlQtMjgxN10gLSBUU2ltcGxlSlNPTlByb3RvY29sIHJlYWRzIGJleW9uZCBlbmQgb2YgbWVzc2FnZQotICAgICogW1RIUklGVC0yODI2XSAtIGh0bWw6c3RhbmRhbG9uZSBzb21ldGltZXMgaWdub3JlZAotICAgICogW1RIUklGVC0yODI5XSAtIFN1cHBvcnQgaGF4ZWxpYiBpbnN0YWxsYXRpb24gdmlhIGdpdGh1YgotICAgICogW1RIUklGVC0yODI4XSAtIHNsaWdodGx5IHdyb25nIGhlbHAgc2NyZWVuIGluZGVudAotICAgICogW1RIUklGVC0yODMxXSAtIFJlbW92ZXMgZGVhZCBjb2RlIGluIHdlYl9zZXJ2ZXIuanMgaW50cm9kdWNlZCBpbiBUSFJJRlQtMjgxOQotICAgICogW1RIUklGVC0yODIzXSAtIEFsbCBKUy10ZXN0cyBhcmUgZmFpbGluZyB3aGVuIHJ1biB3aXRoIGdydW50IHRlc3QKLSAgICAqIFtUSFJJRlQtMjgyN10gLSBUaHJpZnQgMC45LjIgZmFpbHMgdG8gY29tcGlsZSBvbiBZb3NlbWl0ZSBkdWUgdG8gdHIxL2Z1bmN0aW9uYWwgaW5jbHVkZSBpbiBQcm9jZXNzb3JUZXN0LmNwcAotICAgICogW1RIUklGVC0yODQzXSAtIEF1dG9tYWtlIGNvbmZpZ3VyZS5hYyBoYXMgcG9zc2libGUgdHlwbyByZWxhdGVkIHRvIEphdmEKLSAgICAqIFtUSFJJRlQtMjgxM10gLSBtdWx0aXBsZSBoYXhlIGxpYnJhcnkgZml4ZXMvaW1wcm92ZW1lbnRzCi0gICAgKiBbVEhSSUZULTI4MjVdIC0gU3VwcGx5aW5nIHVuaWNvZGUgdG8gcHl0aG9uIFRocmlmdCBjbGllbnQgY2FuIGNhdXNlIG5leHQgcmVxdWVzdCBhcmd1bWVudHMgdG8gZ2V0IG92ZXJ3cml0dGVuCi0gICAgKiBbVEhSSUZULTI4NDBdIC0gQ2FiYWwgZmlsZSBwb2ludHMgdG8gTElDRU5TRSBmaWxlIG91dHNpZGUgdGhlIHBhdGggb2YgdGhlIEhhc2tlbGwgcHJvamVjdC4KLSAgICAqIFtUSFJJRlQtMjgxOF0gLSBUcmFpbGluZyBjb21tYXMgaW4gYXJyYXkKLSAgICAqIFtUSFJJRlQtMjgzMF0gLSBDbGVhbiB1cCBhbnQgd2FybmluZ3MgaW4gdHV0b3JpYWwgZGlyCi0gICAgKiBbVEhSSUZULTI4NDJdIC0gRXJsYW5nIHRocmlmdCBjbGllbnQgaGFzIGluZmluaXRlIHRpbWVvdXQKLSAgICAqIFtUSFJJRlQtMjgxMF0gLSBEbyBub3QgbGVhdmUgdGhlIHVuZGVybHlpbmcgU2VydmVyU29ja2V0IG9wZW4gaWYgY29uc3RydWN0aW9uIG9mIFRTZXJ2ZXJTb2NrZXQgZmFpbHMKLSAgICAqIFtUSFJJRlQtMjgxMl0gLSBHbyBzZXJ2ZXIgYWRkaW5nIHJlZHVuZGFudCBidWZmZXJpbmcgbGF5ZXIKLSAgICAqIFtUSFJJRlQtMjgzOV0gLSBURnJhbWVkVHJhbnNwb3J0IHJlYWQgYnVnCi0gICAgKiBbVEhSSUZULTI4NDRdIC0gTm9kZWpzIHN1cHBvcnQgYnJva2VuIHdoZW4gcnVubmluZyB1bmRlciBCcm93c2VyaWZ5Ci0gICAgKiBbVEhSSUZULTI4MTRdIC0gYXJncy9yZXN1bHQgY2xhc3NlcyBub3QgZm91bmQgd2hlbiBubyBuYW1lc3BhY2UgaXMgc2V0Ci0gICAgKiBbVEhSSUZULTI4NDddIC0gZnVuY3Rpb24gSWZWYWx1ZSgpIGlzIGEgZHVwbGljYXRlIG9mIFN5c3RlbS5TdHJVdGlscy5JZlRoZW4KLSAgICAqIFtUSFJJRlQtMjg0OF0gLSBjZXJ0YWluIERlbHBoaSB0ZXN0cyBkbyBub3QgYnVpbGQgaWYgVHlwZVJlZ2lzdHJ5IGlzIHVzZWQKLSAgICAqIFtUSFJJRlQtMjg1NF0gLSBHbyBTdHJ1Y3Qgd3JpdGVyIGFuZCByZWFkZXIgbG9vc2VzIGltcG9ydGFudCBlcnJvciBpbmZvcm1hdGlvbgotICAgICogW1RIUklGVC0yODU4XSAtIEVuYWJsZSBoZWFkZXIgZmllbGQgY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaCBpbiBUSHR0cFNlcnZlcgotICAgICogW1RIUklGVC0yODU3XSAtIEMjIGdlbmVyYXRvciBjcmVhdGVzIHVuY29tcGlsYWJsZSBjb2RlIGZvciBzdHJ1Y3QgY29uc3RhbnRzCi0gICAgKiBbVEhSSUZULTI4NjBdIC0gRGVscGhpIHNlcnZlciBjbG9zZXMgY29ubmVjdGlvbiBvbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMKLSAgICAqIFtUSFJJRlQtMjg2OF0gLSBFbmhhbmNlIGVycm9yIGhhbmRsaW5nIGluIHRoZSBHbyBjbGllbnQgCi0gICAgKiBbVEhSSUZULTI4NzldIC0gVE1lbW9yeUJ1ZmZlcjogdXNpbmcgbHVhIHN0cmluZyBpbiB3cm9uZyB3YXkKLSAgICAqIFtUSFJJRlQtMjg1MV0gLSBSZW1vdmUgc3RyYW5nZSBwdWJsaWMgUGVlaygpIGZyb20gR28gdHJhbnNwb3J0cwotICAgICogW1RIUklGVC0yODUyXSAtIEJldHRlciBPcGVuL0lzT3Blbi9DbG9zZSBiZWhhdmlvciBmb3IgU3RyZWFtVHJhbnNwb3J0LgotICAgICogW1RIUklGVC0yODcxXSAtIE1pc3Npbmcgc2VtaWNvbG9uIGluIHRocmlmdC5qcwotICAgICogW1RIUklGVC0yODcyXSAtIFRocmVhZE1hbmFnZXIgZGVhZGxvY2sgZm9yIHRhc2sgZXhwaXJhdGlvbgotICAgICogW1RIUklGVC0yODgxXSAtIEhhbmRsZSBlcnJvcnMgZnJvbSBBY2NlcHQoKSBjb3JyZWN0bHkKLSAgICAqIFtUSFJJRlQtMjg0OV0gLSBTcGVsbCBlcnJvcnMgcmVwb3J0ZWQgYnkgY29kZXNwZWxsIHRvb2wKLSAgICAqIFtUSFJJRlQtMjg3MF0gLSBDKysgVEpTT05Qcm90b2NvbCB1c2luZyBsb2NhbGUgZGVwZW5kZW50IGZvcm1hdHRpbmcKLSAgICAqIFtUSFJJRlQtMjg4Ml0gLSBMdWEgR2VuZXJhdG9yOiB1c2luZyBzdHJpbmcubGVuIGZ1bnRpb24gdG8gZ2V0IHN0cnVjdChtYXAsbGlzdCxzZXQpIHNpemUKLSAgICAqIFtUSFJJRlQtMjg2NF0gLSBKU09OIGdlbmVyYXRvciBtaXNzaW5nIGZyb20gVmlzdWFsIFN0dWRpbyBidWlsZCBwcm9qZWN0IAotICAgICogW1RIUklGVC0yODc4XSAtIEdvIHZhbGlkYXRpb24gc3VwcG9ydCBvZiByZXF1aXJlZCBmaWVsZHMKLSAgICAqIFtUSFJJRlQtMjg3M10gLSBUUGlwZSBhbmQgVFBpcGVTZXJ2ZXIgZG9uJ3QgY29tcGlsZSBvbiBXaW5kb3dzIHdpdGggVU5JQ09ERSBlbmFibGVkCi0gICAgKiBbVEhSSUZULTI4ODhdIC0gaW1wb3J0IG9mIDxsaW1pdHM+IGlzIG1pc3NpbmcgaW4gSlNPTiBnZW5lcmF0b3IKLSAgICAqIFtUSFJJRlQtMjkwMF0gLSBQeXRob24gVEh0dHBDbGllbnQgZG9lcyBub3QgcmVzZXQgc29ja2V0IHRpbWVvdXQgb24gZXhjZXB0aW9uCi0gICAgKiBbVEhSSUZULTI5MDddIC0gJ250b2hsbCcgbWFjcm8gcmVkZWZpbmVkCi0gICAgKiBbVEhSSUZULTI4ODRdIC0gTWFwIGRvZXMgbm90IHNlcmlhbGl6ZSBjb3JyZWN0bHkgZm9yIEpTT04gcHJvdG9jb2wgaW4gR28gbGlicmFyeQotICAgICogW1RIUklGVC0yODg3XSAtIC0td2l0aC1vcGVuc3NsIGNvbmZpZ3VyZSBmbGFnIGlzIGlnbm9yZWQKLSAgICAqIFtUSFJJRlQtMjg5NF0gLSBQSFAganNvbiBzZXJpYWxpemVyIHNraXBzIG1hcHMgd2l0aCBpbnQvYm9vbCBrZXlzCi0gICAgKiBbVEhSSUZULTI5MDRdIC0ganNvbl9wcm90b2NvbF90ZXN0LmdvIGZhaWxzCi0gICAgKiBbVEhSSUZULTI5MDZdIC0gbGlicmFyeSBub3QgZm91bmQgZm9yIC1sOmxpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYQotICAgICogW1RIUklGVC0yODkwXSAtIGJpbmFyeSBkYXRhIG1heSBsb3NlIGJ5dGVzIHdpdGggSlNPTiB0cmFuc3BvcnQgdW5kZXIgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcwotICAgICogW1RIUklGVC0yODkxXSAtIGJpbmFyeSBkYXRhIG1heSBjYXVzZSBhIGZhaWx1cmUgd2l0aCBKU09OIHRyYW5zcG9ydCB1bmRlciBzcGVjaWZpYyBjaXJjdW1zdGFuY2VzCi0gICAgKiBbVEhSSUZULTI5MDFdIC0gRml4IGZvciBnZW5lcmF0ZWQgVHlwZVNjcmlwdCBmdW5jdGlvbnMgKyBpbmRlbnRhdGlvbiBvZiBKYXZhU2NyaXB0IG1hcHMKLSAgICAqIFtUSFJJRlQtMjkxNl0gLSBtYWtlIGNoZWNrIGZhaWxzIGZvciBEIGxhbmd1YWdlCi0gICAgKiBbVEhSSUZULTI5MThdIC0gUmFjZSBjb25kaXRpb24gaW4gUHl0aG9uIFRQcm9jZXNzUG9vbFNlcnZlciB0ZXN0Ci0gICAgKiBbVEhSSUZULTI5MjBdIC0gRXJsYW5nIFRocmlmdCB0ZXN0IHVzZXMgd3JvbmcgSURMIGZpbGUKLSAgICAqIFtUSFJJRlQtMjkyMl0gLSAkVFJJQUwgaXMgdXNlZCB3aXRoIFB5dGhvbiB0ZXN0cyBidXQgbm90IHRlc3RlZCBhY2NvcmRpbmdseQotICAgICogW1RIUklGVC0yOTEyXSAtIEF1dG90b29sIGJ1aWxkIGZvciBDKysgUXQgbGlicmFyeSBpcyBpbnZhbGlkCi0gICAgKiBbVEhSSUZULTI5MTRdIC0gZXhwbGljaXQgZGVwZW5kZW5jeSB0byBMdWE1LjIgZmFpbHMgb24gc29tZSBzeXN0ZW1zCi0gICAgKiBbVEhSSUZULTI5MTBdIC0gbGliZXZlbnQgaXMgbm90IHJlYWxseSBvcHRpb25hbAotICAgICogW1RIUklGVC0yOTExXSAtIGZpeCBjKysgdmVyc2lvbiB6ZXJvbXEgdHJhbnNwb3J0LCB0aGUgb2xkIHZlcnNpb24gY2Fubm90IHdvcmsKLSAgICAqIFtUSFJJRlQtMjkxNV0gLSBMdWEgZ2VuZXJhdG9yIG1pc3NpbmcgZnJvbSBWaXN1YWwgU3R1ZGlvIGJ1aWxkIHByb2plY3QKLSAgICAqIFtUSFJJRlQtMjkxN10gLSAibWFrZSBjbGVhbiIgYnJlYWtzIHRlc3QvY19nbGliCi0gICAgKiBbVEhSSUZULTI5MTldIC0gSGF4ZSB0ZXN0IHNlcnZlciB0aW1lb3V0IHRvbyBsYXJnZQotICAgICogW1RIUklGVC0yOTIzXSAtIEphdmFTY3JpcHQgY2xpZW50IGFzc3VtZXMgYSBtZXNzYWdlIGJlaW5nIHdyaXR0ZW4KLSAgICAqIFtUSFJJRlQtMjkyNF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgY3Jhc2hlcyB3aGVuIHVzZXItcHJvdmlkZWQgZXZlbnRfYmFzZSBpcyB1c2VkCi0gICAgKiBbVEhSSUZULTI5MjVdIC0gQ01ha2UgYnVpbGQgZG9lcyBub3Qgd29yayB3aXRoIE9wZW5TU0wgbm9yIGFueXRoaW5nIGluc3RhbGxlZCBpbiBub24tc3lzdGVtIGxvY2F0aW9uCi0gICAgKiBbVEhSSUZULTI5MzFdIC0gQWNjZXNzIHRvIHVuZGVjbGFyZWQgc3RhdGljIHByb3BlcnR5OiBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOjokVEJJTkFSWVBST1RPQ09MQUNDRUxFUkFURUQKLSAgICAqIFtUSFJJRlQtMjg5M10gLSBDTWFrZSBidWlsZCBmYWlscyB3aXRoIGJvb3N0IHRocmVhZCBvciBzdGQgdGhyZWFkCi0gICAgKiBbVEhSSUZULTI5MDJdIC0gR2VuZXJhdGVkIGNfZ2xpYiBjb2RlIGRvZXMgbm90IGNvbXBpbGUgd2l0aCBjbGFuZwotICAgICogW1RIUklGVC0yOTAzXSAtIFF0NCBsaWJyYXJ5IGJ1aWx0IHdpdGggQ01ha2UgZG9lcyBub3Qgd29yawotICAgICogW1RIUklGVC0yOTQyXSAtIENTaGFycCBnZW5lcmF0ZSBpbnZhbGlkIGNvZGUgZm9yIHByb3BlcnR5IG5hbWVkIHJlYWQgb3Igd3JpdGUKLSAgICAqIFtUSFJJRlQtMjkzMl0gLSBOb2RlLmpzIFRocmlmdCBjb25uZWN0aW9uIGxpYnJhcmllcyB0aHJvdyBFeGNlcHRpb25zIGludG8gZXZlbnQgZW1pdHRlcgotICAgICogW1RIUklGVC0yOTMzXSAtIHYwLjkuMjogZG91YmxlcyBlbmNvZGVkIGluIG5vZGUgd2l0aCBjb21wYWN0IHByb3RvY29sIGNhbm5vdCBiZSBkZWNvZGVkIGJ5IHB5dGhvbgotICAgICogW1RIUklGVC0yOTM0XSAtIGNyZWF0ZVNlcnZlciBzaWduYXR1cmUgbWlzbWF0Y2gKLSAgICAqIFtUSFJJRlQtMjk4MV0gLSBJREwgd2l0aCBubyBuYW1lc3BhY2UgcHJvZHVjZXMgdW5wYXJzYWJsZSBQSFAKLSAgICAqIFtUSFJJRlQtMjk5OV0gLSBBZGRpdGlvbiBvZiAuZ2l0YXR0cmlidXRlcyB0ZXh0IGF1dG8gaW4gVEhSSUZULTI3MjQgY2F1c2VzIG1vZGlmaWVkIGZpbGVzIG9uIGNoZWNrb3V0Ci0gICAgKiBbVEhSSUZULTI5NDldIC0gdHlwbyBpbiBjb21waWxlci9jcHAvUkVBRE1FLm1kCi0gICAgKiBbVEhSSUZULTI5NTddIC0gd2FybmluZzogc291cmNlIGZpbGUgJXMgaXMgaW4gYSBzdWJkaXJlY3RvcnksIGJ1dCBvcHRpb24gJ3N1YmRpci1vYmplY3RzJyBpcyBkaXNhYmxlZAotICAgICogW1RIUklGVC0yOTUzXSAtIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQgaXMgbm90IFN0b3AoKWFibGUKLSAgICAqIFtUSFJJRlQtMjk2Ml0gLSBEb2NrZXIgVGhyaWZ0IGVudiBmb3IgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcKLSAgICAqIFtUSFJJRlQtMjk3MV0gLSBDKysgdGVzdCBhbmQgdHV0b3JpYWwgcGFyYWxsZWwgYnVpbGQgaXMgdW5zdGFibGUKLSAgICAqIFtUSFJJRlQtMjk3Ml0gLSBNaXNzaW5nIGJhY2tzbGFzaCBpbiBsaWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KLSAgICAqIFtUSFJJRlQtMjk1MV0gLSBGaXggRXJsYW5nIG5hbWUgY29uZmxpY3QgdGVzdAotICAgICogW1RIUklGVC0yOTU1XSAtIFVzaW5nIGxpc3Qgb2YgdHlwZWRlZnMgZG9lcyBub3QgY29tcGlsZSBvbiBHbwotICAgICogW1RIUklGVC0yOTYwXSAtIG5hbWVzcGFjZSByZWdyZXNzaW9uIGZvciBSdWJ5Ci0gICAgKiBbVEhSSUZULTI5NTldIC0gbm9kZWpzOiBmaXggYmluYXJ5IHVuaXQgdGVzdHMKLSAgICAqIFtUSFJJRlQtMjk2Nl0gLSBub2RlanM6IEZpeCBiYWQgcmVmZXJlbmNlcyB0byBUUHJvdG9jb2xFeGNlcHRpb24gYW5kIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUKLSAgICAqIFtUSFJJRlQtMjk3MF0gLSBncnVudC1qc2RvYyBmYWlscyBkdWUgdG8gZGVwZW5kZW5jeSBpc3N1ZXMKLSAgICAqIFtUSFJJRlQtMzAwMV0gLSBDIyBFcXVhbHMgZmFpbHMgZm9yIGJpbmFyeSBmaWVsZHMgKGJ5dGVbXSkKLSAgICAqIFtUSFJJRlQtMzAwM10gLSBNaXNzaW5nIExJQ0VOU0UgZmlsZSBwcmV2ZW50cyBwYWNrYWdlIGZyb20gYmVpbmcgaW5zdGFsbGVkCi0gICAgKiBbVEhSSUZULTMwMDhdIC0gTm9kZS5qcyBzZXJ2ZXIgZG9lcyBub3QgZnVsbHkgc3VwcG9ydCBleGNlcHRpb24KLSAgICAqIFtUSFJJRlQtMzAwN10gLSBUcmF2aXMgYnVpbGQgaXMgYnJva2VuIGJlY2F1c2Ugb2YgZGlyZWN0b3J5IGNvbmZsaWN0Ci0gICAgKiBbVEhSSUZULTMwMDldIC0gVFNTTFNvY2tldCBkb2VzIG5vdCB1c2UgdGhlIGNvcnJlY3QgaG9zdG5hbWUgKGJyZWFrcyBjZXJ0aWZpY2F0ZSBjaGVja3MpCi0gICAgKiBbVEhSSUZULTMwMTFdIC0gQyMgdGVzdCBzZXJ2ZXIgdGVzdEV4Y2VwdGlvbigpIG5vdCBpbXBsZW1lbnRlZCBhY2NvcmRpbmcgdG8gc3BlY3MKLSAgICAqIFtUSFJJRlQtMzAxMl0gLSBUaW1pbmcgcHJvYmxlbXMgaW4gTmFtZWRQaXBlIGltcGxlbWVudGF0aW9uIGR1ZSB0byB1bm5lY2Vzc2FyeSBvcGVuL2Nsb3NlCi0gICAgKiBbVEhSSUZULTMwMTldIC0gR29sYW5nIGdlbmVyYXRvciBtaXNzaW5nIGRvY3N0cmluZyBmb3Igc3RydWN0cwotICAgICogW1RIUklGVC0zMDIxXSAtIFNlcnZpY2UgcmVtb3RlIHRvb2wgZG9lcyBub3QgaW1wb3J0IHN0dWIgcGFja2FnZSB3aXRoIHBhY2thZ2UgcHJlZml4Ci0gICAgKiBbVEhSSUZULTMwMjZdIC0gVE11bHRpcGxleGVkUHJvY2Vzc29yIGRvZXMgbm90IGhhdmUgYSBjb25zdHJ1Y3RvcgotICAgICogW1RIUklGVC0zMDI4XSAtIFJlZ3Jlc3Npb24gY2F1c2VkIGJ5IFRIUklGVC0yMTgwCi0gICAgKiBbVEhSSUZULTMwMTddIC0gb3JkZXIgb2YgbWFwIGtleS92YWx1ZSB0eXBlcyBpbmNvcnJlY3QgZm9yIG9uZSBDVE9SCi0gICAgKiBbVEhSSUZULTMwMjBdIC0gQ2Fubm90IGNvbXBpbGUgdGhyaWZ0IGFzIEMrKzAzCi0gICAgKiBbVEhSSUZULTMwMjRdIC0gVXNlci1BZ2VudCAiQmF0dGxlTmV0IiB1c2VkIGluIHNvbWUgVGhyaWZ0IGxpYnJhcnkgZmlsZXMKLSAgICAqIFtUSFJJRlQtMzA0N10gLSBVbmV2ZW4gY2FsbHMgdG8gaW5kZW50X3VwIGFuZCBpbmRlbnRfZG93biBpbiBDb2NvYSBnZW5lcmF0b3IKLSAgICAqIFtUSFJJRlQtMzA0OF0gLSBOb2RlSlMgZGVjb2Rpbmcgb2YgSTY0IGlzIGluY29uc2lzdGVudCBhY3Jvc3MgcHJvdG9jb2xzCi0gICAgKiBbVEhSSUZULTMwNDNdIC0gZ28gY29tcGlsZXIgZ2VuZXJhdG9yIHVzZXMgbm9uIEMrKzk4IGNvZGUKLSAgICAqIFtUSFJJRlQtMzA0NF0gLSBEb2NrZXIgUkVBRE1FLm1kIHBhdGhzIHRvIERvY2tlcmZpbGVzIGFyZSBpbmNvcnJlY3QKLSAgICAqIFtUSFJJRlQtMzA0MF0gLSBib3dlci5qc29uIHdyb25nICJtYWluIiBwYXRoCi0gICAgKiBbVEhSSUZULTMwNTFdIC0gR28gVGhyaWZ0IGdlbmVyYXRvciBjcmVhdGVzIGJhZCBnbyBjb2RlCi0gICAgKiBbVEhSSUZULTMwNTddIC0gSmF2YSBjb21waWxlciBidWlsZCBpcyBicm9rZW4KLSAgICAqIFtUSFJJRlQtMzA2MV0gLSBDKysgVFNTTFNvY2tldCBzaHV0ZG93biBkZWxheS92dWxuZXJhYmlsaXR5Ci0gICAgKiBbVEhSSUZULTMwNjJdIC0gQysrIFRTZXJ2ZXJTb2NrZXQgaW52YWxpZCBwb3J0IG51bWJlciAob3ZlciA5OTk5OTkpIGNhdXNlcyBzdGFjayBjb3JydXB0aW9uCi0gICAgKiBbVEhSSUZULTMwNjVdIC0gVXBkYXRlIGxpYnRocmlmdCBkZXBlbmRlbmNpZXMgKHNsZjRqLCBodHRwY29yZSwgaHR0cGNsaWVudCkKLSAgICAqIFtUSFJJRlQtMzI0NF0gLSBUeXBlU2NyaXB0OiBmaXggbmFtZXNwYWNlIG9mIGluY2x1ZGVkIHR5cGVzCi0gICAgKiBbVEhSSUZULTMyNDZdIC0gUmVkdWNlIHRoZSBudW1iZXIgb2YgdHJpdmlhbCB3YXJuaW5ncyBpbiBXaW5kb3dzIEMrKyBDTWFrZSBidWlsZHMKLSAgICAqIFtUSFJJRlQtMzIyNF0gLSBGaXggVE5hbWVkUGlwZVNlcnZlciB1bnByZWRpY3RhYmxlIGJlaGF2aW9yIG9uIGFjY2VwdAotICAgICogW1RIUklGVC0zMjMwXSAtIFB5dGhvbiBjb21waWxlciBnZW5lcmF0ZXMgd3JvbmcgY29kZSBpZiB0aGVyZSBpcyBmdW5jdGlvbiB0aHJvd2luZyBhIHR5cGVkZWYgb2YgZXhjZXB0aW9uIHdpdGggYW5vdGhlciBuYW1lc3BhY2UKLSAgICAqIFtUSFJJRlQtMzIzNl0gLSBNYXhTa2lwRGVwdGggbmV2ZXIgY2hlY2tlZAotICAgICogW1RIUklGVC0zMjM5XSAtIExpbWl0IHJlY3Vyc2lvbiBkZXB0aAotICAgICogW1RIUklGVC0zMjQxXSAtIGZhdGFsIGVycm9yOiBydW50aW1lOiBjYW5ub3QgbWFwIHBhZ2VzIGluIGFyZW5hIGFkZHJlc3Mgc3BhY2UKLSAgICAqIFtUSFJJRlQtMzI0Ml0gLSBPU0dpIEltcG9ydC1QYWNrYWdlIGRpcmVjdGl2ZSBpcyBtaXNzaW5nIHRoZSBBcGFjaGUgSFRUUCBwYWNrYWdlcwotICAgICogW1RIUklGVC0zMjM0XSAtIExpbWl0IHJlY3Vyc2lvbiBkZXB0aAotICAgICogW1RIUklGVC0zMjIyXSAtIFR5cGVTY3JpcHQ6IEdlbmVyYXRlZCBFbnVtcyBhcmUgcXVvdGVkCi0gICAgKiBbVEhSSUZULTMyMjldIC0gdW5leHBlY3RlZCBUaW1lb3V0IGV4Y2VwdGlvbiB3aGVuIGRlc2lyZWQgYnl0ZXMgYXJlIG9ubHkgcGFydGlhbGx5IGF2YWlsYWJsZQotICAgICogW1RIUklGVC0zMjMxXSAtIENQUDogTGltaXQgcmVjdXJzaW9uIGRlcHRoIHRvIDY0Ci0gICAgKiBbVEhSSUZULTMyMzVdIC0gTGltaXQgcmVjdXJzaW9uIGRlcHRoCi0gICAgKiBbVEhSSUZULTMxNzVdIC0gZmFzdGJpbmFyeS5jIHB5dGhvbiBkZXNlcmlhbGl6ZSBjYW4gY2F1c2UgaHVnZSBhbGxvY2F0aW9ucyBmcm9tIGdhcmJhZ2UKLSAgICAqIFtUSFJJRlQtMzE3Nl0gLSBVbmlvbiBpbmNvcnJlY3RseSBpbXBsZW1lbnRzID09Ci0gICAgKiBbVEhSSUZULTMxNzddIC0gRmFpbHMgdG8gcnVuIHJha2UgdGVzdAotICAgICogW1RIUklGVC0zMTgwXSAtIGx1YSBwbHVnaW46IGZyYW1lZCB0cmFuc3BvcnQgZG8gbm90IHdvcmsKLSAgICAqIFtUSFJJRlQtMzE3OV0gLSBsdWEgcGx1Z2luIGNhbnQgY29ubmVjdCB0byByZW1vdGUgc2VydmVyIGJlY2F1c2UgZnVuY3Rpb24gbF9zb2NrZXRfY3JlYXRlX2FuZF9jb25uZWN0IGFsd2F5cyBiaW5kIHNvY2tldCB0byBsb2NhbGhvc3QgCi0gICAgKiBbVEhSSUZULTMyNDhdIC0gVHlwZVNjcmlwdDogYWRkaXRpb25hbCBjb21tYSBpbiBtZXRob2Qgc2lnbmF0dXJlIHdpdGhvdXQgcGFyYW1ldGVycwotICAgICogW1RIUklGVC0zMzAyXSAtIEdvIEpTT04gcHJvdG9jb2wgc2hvdWxkIGVuY29kZSBUaHJpZnQgYnl0ZSB0eXBlIGFzIHNpZ25lZCBpbnRlZ2VyIHN0cmluZwotICAgICogW1RIUklGVC0zMjk3XSAtIGNfZ2xpYjogYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBpcyBub3QgZ2VuZXJhdGVkCi0gICAgKiBbVEhSSUZULTMyOTRdIC0gVFpsaWJUcmFuc3BvcnQgZm9yIEphdmEgZG9lcyBub3Qgd3JpdGUgZGF0YSBjb3JyZWN0bHkKLSAgICAqIFtUSFJJRlQtMzI5Nl0gLSBHbyBjcm9zcyB0ZXN0IGRvZXMgbm90IGNvbmZvcm0gdG8gc3BlYwotICAgICogW1RIUklGVC0zMjk1XSAtIEMjIGxpYnJhcnkgZG9lcyBub3QgYnVpbGQgb24gTW9ubyA0LjAuMi41IG9yIGxhdGVyCi0gICAgKiBbVEhSSUZULTMyOTNdIC0gSmF2YVNjcmlwdDogbnVsbCB2YWx1ZXMgdHVybiBpbnRvIGVtcHR5IHN0cnVjdHMgaW4gY29uc3RydWN0b3IKLSAgICAqIFtUSFJJRlQtMzMxMF0gLSBsaWIvZXJsL1JFQURNRS5tZCBoYXMgaW5jb3JyZWN0IGZvcm1hdHRpbmcKLSAgICAqIFtUSFJJRlQtMzMxOV0gLSBDU2hhcnAgdHV0b3JpYWwgd2lsbCBub3QgYnVpbGQgdXNpbmcgdGhlICouc2xuCi0gICAgKiBbVEhSSUZULTMzMzVdIC0gUnVieSBzZXJ2ZXIgZG9lcyBub3QgaGFuZGxlIHByb2Nlc3NvciBleGNlcHRpb24KLSAgICAqIFtUSFJJRlQtMzMzOF0gLSBTdHJheSB1bmRlcnNjb3JlIGluIGdlbmVyYXRlZCBnbyB3aGVuIHNlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCAiTmV3IgotICAgICogW1RIUklGVC0zMzI0XSAtIFVwZGF0ZSBHbyBEb2NzIGZvciBwdWxsaW5nIGFsbCBwYWNrYWdlcwotICAgICogW1RIUklGVC0zMzQ1XSAtIENsaWVudHMgYmxvY2tlZCBpbmRlZmluaXRlbHkgd2hlbiBhIGphdmEubGFuZy5FcnJvciBpcyB0aHJvd24KLSAgICAqIFtUSFJJRlQtMzMzMl0gLSBtYWtlIGRpc3QgZmFpbHMgb24gY2xlYW4gYnVpbGQKLSAgICAqIFtUSFJJRlQtMzMyNl0gLSBUZXN0cyBkbyBub3QgY29tcGlsZSB1bmRlciAqQlNECi0gICAgKiBbVEhSSUZULTMzMzRdIC0gTWFya2Rvd24gbm90YXRpb24gb2YgcHJvdG9jb2wgc3BlYyBpcyBtYWxmb3JtZWQKLSAgICAqIFtUSFJJRlQtMzMzMV0gLSB3YXJuaW5nOiDigJhldHlwZeKAmSBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24KLSAgICAqIFtUSFJJRlQtMzM0OV0gLSBQeXRob24gc2VydmVyIGRvZXMgbm90IGhhbmRsZSBwcm9jZXNzb3IgZXhjZXB0aW9uCi0gICAgKiBbVEhSSUZULTMzNDNdIC0gRml4IGhhc2tlbGwgUkVBRE1FCi0gICAgKiBbVEhSSUZULTMzNDBdIC0gUHl0aG9uOiBlbmFibGUganNvbiB0ZXN0cyBhZ2FpbgotICAgICogW1RIUklGVC0zMzExXSAtIFRvcCBsZXZlbCBSRUFETUUubWQgaGFzIGluY29ycmVjdCBmb3JtbWF0aW5nCi0gICAgKiBbVEhSSUZULTI5MzZdIC0gTWlub3IgbWVtb3J5IGxlYWsgaW4gU1NMCi0gICAgKiBbVEhSSUZULTMyOTBdIC0gVXNpbmcgZnJvbSBpbiB2YXJpYWJsZSBuYW1lcyBjYXVzZXMgdGhlIGdlbmVyYXRlZCBQeXRob24gY29kZSB0byBoYXZlIGVycm9ycwotICAgICogW1RIUklGVC0zMjI1XSAtIEZpeCBUUGlwZVNlcnZlciB1bnByZWRpY3RhYmxlIGJlaGF2aW9yIG9uIGludGVycnVwdCgpCi0gICAgKiBbVEhSSUZULTMzNTRdIC0gRml4IHdvcmQtZXh0cmFjdGlvbiBzdWJzdHIgYnVnIGluIGluaXRpYWxpc20gY29kZQotICAgICogW1RIUklGVC0yMDA2XSAtIFRCaW5hcnlQcm90b2NvbCBtZXNzYWdlIGhlYWRlciBjYWxsIG5hbWUgbGVuZ3RoIGlzIG5vdCB2YWxpZGF0ZWQgYW5kIGNhbiBiZSB1c2VkIHRvIGNvcmUgdGhlIHNlcnZlcgotICAgICogW1RIUklGVC0zMzI5XSAtIEMrKyBsaWJyYXJ5IHVuaXQgdGVzdHMgZG9uJ3QgY29tcGlsZSBhZ2FpbnN0IHRoZSBuZXcgYm9vc3QtMS41OSB1bml0IHRlc3QgZnJhbWV3b3JrCi0gICAgKiBbVEhSSUZULTI2MzBdIC0gd2luZG93czcgNjRiaXQgcGMuIGlwdjQgYW5kIGlwdjYgcGMuY2FuJ3QgdXNlCi0gICAgKiBbVEhSSUZULTMzMzZdIC0gVGhyaWZ0IGdlbmVyYXRlZCBzdHJlYW1pbmcgb3BlcmF0b3JzIGFkZGVkIGluIDAuOS4yIGNhbm5vdCBiZSBvdmVycmlkZGVuCi0gICAgKiBbVEhSSUZULTI2ODFdIC0gQ29yZSBvZiB1bndpbmRfY2xlYW51cAotICAgICogW1RIUklGVC0zMzE3XSAtIGNwcCBuYW1lc3BhY2Ugb3JnLmFwYWNoZSBpc3N1ZSBhcHBlYXJzIGluIDAuOQotCi0jIyBEb2N1bWVudGF0aW9uCi0gICAgKiBbVEhSSUZULTMyODZdIC0gQXBhY2hlIEFudCBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlbmN5Ci0KLSMjIEltcHJvdmVtZW50Ci0gICAgKiBbVEhSSUZULTIyN10gLSBCeXRlW10gaW4gY29sbGVjdGlvbnMgYXJlbid0IHByZXR0eSBwcmludGVkIGxpa2UgcmVndWxhciBiaW5hcnkgZmllbGRzCi0gICAgKiBbVEhSSUZULTI3NDRdIC0gVmFncmFudGZpbGUgZm9yIENlbnRvcyA2LjUKLSAgICAqIFtUSFJJRlQtMjY0NF0gLSBIYXhlIHN1cHBvcnQKLSAgICAqIFtUSFJJRlQtMjc1Nl0gLSByZWdpc3RlciBNZWRpYSBUeXBlIEAgSUFOQQotICAgICogW1RIUklGVC0zMDc2XSAtIENvbXBhdGliaWxpdHkgd2l0aCBIYXhlIDMuMi4wCi0gICAgKiBbVEhSSUZULTMwODFdIC0gQysrIENvbnNvbGlkYXRlIGNsaWVudCBwcm9jZXNzaW5nIGxvb3BzIGluIFRTZXJ2ZXJzCi0gICAgKiBbVEhSSUZULTMwODNdIC0gQysrIENvbnNvbGlkYXRlIHNlcnZlciBwcm9jZXNzaW5nIGxvb3BzIGluIFRTaW1wbGVTZXJ2ZXIsIFRUaHJlYWRlZFNlcnZlciwgVFRocmVhZFBvb2xTZXJ2ZXIKLSAgICAqIFtUSFJJRlQtMzA4NF0gLSBDKysgYWRkIGNvbmN1cnJlbnQgY2xpZW50IGxpbWl0IHRvIHRocmVhZGVkIHNlcnZlcnMKLSAgICAqIFtUSFJJRlQtMzA3NF0gLSAgICAgQWRkIGNvbXBpbGVyL2NwcC9sZXgueXl0aHJpZnRsLmNjIHRvIGdpdGlnbm9yZS4KLSAgICAqIFtUSFJJRlQtMzEzNF0gLSBSZW1vdmUgdXNlIG9mIGRlcHJlY2F0ZWQgInBoYW50b20uYXJncyIKLSAgICAqIFtUSFJJRlQtMzEzM10gLSBBbGxvdyAibWFrZSBjcm9zcyIgYW5kICJtYWtlIHByZWNyb3NzIiB0byBydW4gd2l0aG91dCBidWlsZGluZyBhbGwgbGFuZ3VhZ2VzCi0gICAgKiBbVEhSSUZULTMxNDJdIC0gTWFrZSBKYXZhU2NyaXB0IHVzZSBkb3dubG9hZGVkIGxpYnJhcmllcwotICAgICogW1RIUklGVC0zMTQxXSAtIEltcHJvdmUgbG9nZ2luZyBvZiBKYXZhU2NyaXB0IHRlc3QKLSAgICAqIFtUSFJJRlQtMzE0NF0gLSBQcm9wb3NhbDogbWFrZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZW51bXMgaW4gZ2VuZXJhdGVkIGdvIGNvZGUgbGVzcyB2ZXJib3NlCi0gICAgKiBbVEhSSUZULTMxMzBdIC0gUmVtb3ZlIHRoZSBsYXN0IHZlc3RpZ2VzIG9mIFRIUklGVF9PVkVSTE9BRF9JRiBmcm9tIFRIUklGVC0xMzE2Ci0gICAgKiBbVEhSSUZULTMxMzFdIC0gQ29uc29saWRhdGUgc3VnZ2VzdGVkIGltcG9ydCBwYXRoIGZvciBnbyB0aHJpZnQgbGlicmFyeSB0byBnaXQuYXBhY2hlLm9yZyBpbiBkb2NzIGFuZCBjb2RlCi0gICAgKiBbVEhSSUZULTMwOTJdIC0gR2VuZXJhdGVkIEhhc2tlbGwgdHlwZXMgc2hvdWxkIGRlcml2ZSBHZW5lcmljCi0gICAgKiBbVEhSSUZULTMxMTBdIC0gIFByaW50IGVycm9yIGxvZyBhZnRlciBjcm9zcyB0ZXN0IGZhaWx1cmVzIG9uIFRyYXZpcwotICAgICogW1RIUklGVC0zMTE0XSAtIFVzaW5nIGxvY2FsIHRlbXAgdmFyaWFibGVzIHRvIG5vdCBwb2xsdXRlIHRoZSBnbG9iYWwgdGFibGUKLSAgICAqIFtUSFJJRlQtMzEwNl0gLSBDTWFrZSBzdW1tYXJ5IHNob3VsZCBnaXZlIG1vcmUgaW5mb3JtYXRpb24gd2h5IGEgbGlicmFyeSBpcyBzZXQgdG8gb2ZmCi0gICAgKiBbVEhSSUZULTMxMTldIC0gSmF2YSdzIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGhhcyBpbmRpc3Rpbmd1aXNoYWJsZSBsb2cgbWVzc2FnZXMgaW4gcnVuKCkKLSAgICAqIFtUSFJJRlQtMzEyMl0gLSBKYXZhc2NyaXB0IHN0cnVjdCBjb25zdHJ1Y3RvciBzaG91bGQgcHJvcGVybHkgaW5pdGlhbGl6ZSBzdHJ1Y3QgYW5kIGNvbnRhaW5lciBtZW1iZXJzIGZyb20gcGxhaW4ganMgYXJndW1lbnRzCi0gICAgKiBbVEhSSUZULTMxNTFdIC0gRml4IGxpbmtzIHRvIGdpdC13aXAqIC0gc2hvdWxkIGJlIGdpdC5hcGFjaGUub3JnCi0gICAgKiBbVEhSSUZULTMxNjddIC0gV2luZG93cyBidWlsZCBmcm9tIHNvdXJjZSBpbnN0cnVjdGlvbnMgbmVlZCB0byBiZSByZXZpc2VkCi0gICAgKiBbVEhSSUZULTMxNTVdIC0gbW92ZSBjb250cmliL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIHRvIGJ1aWxkL2NtYWtlLwotICAgICogW1RIUklGVC0zMTYwXSAtIE1ha2UgZ2VuZXJhdGVkIGdvIGVudW1zIGltcGxlbWVudCBUZXh0TWFyc2hhbGxlciBhbmQgVGV4dFVubWFyc2hhbGxlciBpbnRlcmZhY2VzCi0gICAgKiBbVEhSSUZULTMxNTBdIC0gQWRkIGFuIG9wdGlvbiB0byB0aHJpZnQgZ28gZ2VuZXJhdG9yIHRvIG1ha2UgUmVhZCBhbmQgV3JpdGUgbWV0aG9kcyBwcml2YXRlCi0gICAgKiBbVEhSSUZULTMxNDldIC0gTWFrZSBSZWFkRmllbGROIG1ldGhvZHMgaW4gZ2VuZXJhdGVkIEdvIGNvZGUgcHJpdmF0ZQotICAgICogW1RIUklGVC0zMTcyXSAtIEFkZCB0dXRvcmlhbCB0byBUaHJpZnQgd2ViIHNpdGUKLSAgICAqIFtUSFJJRlQtMzIxNF0gLSBBZGQgRXJsYW5nIG9wdGlvbiBmb3IgdXNpbmcgbWFwcyBpbnN0ZWFkIG9mIGRpY3RzCi0gICAgKiBbVEhSSUZULTMyMDFdIC0gQ2FwdHVyZSBnaXRodWIgdGVzdCBhcnRpZmFjdHMgZm9yIGZhaWxlZCBidWlsZHMKLSAgICAqIFtUSFJJRlQtMzI2Nl0gLSBjX2dsaWI6IE11bHRpcGxlIGNvbXBpbGVyIHdhcm5pbmdzIGJ1aWxkaW5nIHVuaXQgdGVzdHMKLSAgICAqIFtUSFJJRlQtMzI4NV0gLSBjX2dsaWI6IEJ1aWxkIGxpYnJhcnkgd2l0aCBhbGwgd2FybmluZ3MgZW5hYmxlZCwgbm8gd2FybmluZ3MgZ2VuZXJhdGVkCi0gICAgKiBbVEhSSUZULTE5NTRdIC0gQWxsb3cgZm9yIGEgc2VwYXJhdGUgY29ubmVjdGlvbiB0aW1lb3V0IHZhbHVlIAotICAgICogW1RIUklGVC0yMDk4XSAtIEFkZCBzdXBwb3J0IGZvciBRdDUrCi0gICAgKiBbVEhSSUZULTIxOTldIC0gUmVtb3ZlIERlbnNlIHByb3RvY29sICh3YXM6IG1vdmUgdG8gQ29udHJpYikKLSAgICAqIFtUSFJJRlQtNDA2XSAtIEMrKyBUZXN0IHN1aXRlIGNsZWFudXAKLSAgICAqIFtUSFJJRlQtOTAyXSAtIHNvY2tldCBhbmQgY29ubmVjdCB0aW1lb3V0IGluIFRTb2NrZXQgc2hvdWxkIGJlIGRpc3Rpbmd1aXNoZWQKLSAgICAqIFtUSFJJRlQtMzg4XSAtIFVzZSBhIHNlcGFyYXRlIHdpcmUgZm9ybWF0IGZvciBhc3luYyBjYWxscwotICAgICogW1RIUklGVC03MjddIC0gc3VwcG9ydCBuYXRpdmUgQysrIGxhbmd1YWdlIHNwZWNpZmljIGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgKiBbVEhSSUZULTE3ODRdIC0gcGVwLTMxMTAgY29tcGxpYW5jZSBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIAotICAgICogW1RIUklGVC0xMDI1XSAtIEMrKyBTZXJ2ZXJTb2NrZXQgc2hvdWxkIGluaGVyaXQgZnJvbSBTb2NrZXQgd2l0aCB0aGUgbmVjZXNzYXJ5IEN0b3IgdG8gbGlzdGVuIG9uIGNvbm5lY3Rpb25zIGZyb20gYSBzcGVjaWZpYyBob3N0Ci0gICAgKiBbVEhSSUZULTIyNjldIC0gQ2FuIGRlcGxveSBsaWJ0aHJpZnQtc291cmNlLmphciB0byBtYXZlbiBjZW50ZXIgcmVwb3NpdG9yeQotICAgICogW1RIUklGVC0yODA0XSAtIFB1bGwgYW4gaW50ZXJmYWNlIG91dCBvZiBUQmFzZUFzeW5jUHJvY2Vzc29yCi0gICAgKiBbVEhSSUZULTI4MDZdIC0gbW9yZSB3aGl0ZXNwYWNlIGZpeHVwcwotICAgICogW1RIUklGVC0yODExXSAtIE1ha2UgcmVtb3RlIHNvY2tldCBhZGRyZXNzIGFjY2Vzc2libGUKLSAgICAqIFtUSFJJRlQtMjgwOV0gLSAuZ2l0aWdub3JlIHVwZGF0ZSBmb3IgY29tcGlsZXIncyB2aXN1YWwgcHJvamVjdAotICAgICogW1RIUklGVC0yODQ2XSAtIEV4cG9zZSBjaXBoZXJzIHBhcmFtZXRlciBmcm9tIHNzbC53cmFwX3NvY2tldCgpCi0gICAgKiBbVEhSSUZULTI4NTldIC0gSlNPTiBnZW5lcmF0b3I6IG91dHB1dCBjb21wbGV0ZSBkZXNjcmlwdG9ycwotICAgICogW1RIUklGVC0yODYxXSAtIGFkZCBidWZmZXJlZCB0cmFuc3BvcnQKLSAgICAqIFtUSFJJRlQtMjg2NV0gLSBUZXN0IGNhc2UgZm9yIEdvOiBTZXFJZCBvdXQgb2Ygc2VxdWVuY2UKLSAgICAqIFtUSFJJRlQtMjg2Nl0gLSBHbyBnZW5lcmF0b3Igc291cmNlIGNvZGUgaXMgaGFyZCB0byByZWFkIGFuZCBtYWludGFpbgotICAgICogW1RIUklGVC0yODgwXSAtIFJlYWQgdGhlIG5ldHdvcmsgYWRkcmVzcyBmcm9tIHRoZSBsaXN0ZW5lciBpZiBhdmFpbGFibGUuCi0gICAgKiBbVEhSSUZULTI4NzVdIC0gVHlwbyBpbiBURGVuc2VQcm90b2NvbC5oIGNvbW1lbnQKLSAgICAqIFtUSFJJRlQtMjg3NF0gLSBUQmluYXJ5UHJvdG9jb2wgIG1lbWJlciB2YXJpYWJsZSAic3RyaW5nX2J1Zl8iIGlzIG5ldmVyIHVzZWQuCi0gICAgKiBbVEhSSUZULTI4NTVdIC0gTW92ZSBjb250cmlidXRpbmcubWQgdG8gdGhlIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkKLSAgICAqIFtUSFJJRlQtMjg2Ml0gLSBFbmFibGUgUlRUSSBhbmQvb3IgYnVpbGQgbWFjcm9zIGZvciBnZW5lcmF0ZWQgY29kZQotICAgICogW1RIUklGVC0yODc2XSAtICBBZGQgdGVzdCBmb3IgVEhSSUZULTI1MjYgQXNzaWdubWVudCBvcGVyYXRvcnMgYW5kIGNvcHkgY29uc3RydWN0b3JzIGluIGMrKyBkb24ndCBjb3B5IHRoZSBfX2lzc2V0IHN0cnVjdAotICAgICogW1RIUklGVC0yODk3XSAtIEdlbmVyYXRlIC1pc0VxdWFsOiBhbmQgLWhhc2ggbWV0aG9kcwotICAgICogW1RIUklGVC0yOTA5XSAtIEltcHJvdmUgdHJhdmlzIGJ1aWxkCi0gICAgKiBbVEhSSUZULTI5MjFdIC0gTWFrZSBFcmxhbmcgaW1wbCByZWFkeSBmb3IgT1RQIDE4IHJlbGVhc2UgKGRpY3QvMCBhbmQgc2V0LzAgYXJlIGRlcHJlY2F0ZWQpCi0gICAgKiBbVEhSSUZULTI5MjhdIC0gUmVuYW1lIHRoZSBlcmxhbmcgdGVzdF9zZXJ2ZXIgbW9kdWxlCi0gICAgKiBbVEhSSUZULTI5NDBdIC0gQWxsb3cgaW5zdGFsbGluZyBUaHJpZnQgZnJvbSBnaXQgYXMgTlBNIG1vZHVsZSBieSBwcm92aWRpbmcgcGFja2FnZS5qc29uIGluIHRvcCBsZXZlbCBkaXJlY3RvcnkKLSAgICAqIFtUSFJJRlQtMjkzN10gLSBBbGxvdyBzZXR0aW5nIGEgbWF4aW11bSBmcmFtZSBzaXplIGluIFRGcmFtZWRUcmFuc3BvcnQKLSAgICAqIFtUSFJJRlQtMjk3Nl0gLSBub2RlanM6IHhociBhbmQgd2Vic29ja2V0IHN1cHBvcnQgZm9yIGJyb3dzZXJpZnkKLSAgICAqIFtUSFJJRlQtMjk5Nl0gLSBUZXN0IGZvciBIYXhlIDMuMS4zIG9yIGJldHRlciAKLSAgICAqIFtUSFJJRlQtMjk2OV0gLSBub2RlanM6IERSWSB1cCBsaWJyYXJ5IHRlc3RzCi0gICAgKiBbVEhSSUZULTI5NzNdIC0gVXBkYXRlIEhheGUgbGliIHJlYWRtZSByZWdhcmRpbmcgSGF4ZSAzLjEuMwotICAgICogW1RIUklGVC0yOTUyXSAtIEltcHJvdmUgaGFuZGxpbmcgb2YgU2VydmVyLlN0b3AoKSAKLSAgICAqIFtUSFJJRlQtMjk2NF0gLSBub2RlanM6IG1vdmUgcHJvdG9jb2xzIGFuZCB0cmFuc3BvcnRzIGludG8gc2VwYXJhdGUgZmlsZXMKLSAgICAqIFtUSFJJRlQtMjk2M10gLSBub2RlanMgLSBhZGQgdGVzdCBjb3ZlcmFnZQotICAgICogW1RIUklGVC0zMDA2XSAtIEF0dGFjaCAnb21pdGVtcHR5JyBqc29uIHRhZyBmb3Igb3B0aW9uYWwgZmllbGRzIGluIEdvCi0gICAgKiBbVEhSSUZULTMwMjddIC0gR28gY29tcGlsZXIgZG9lcyBub3QgZW5zdXJlIGNvbW1vbiBpbml0aWFsaXNtcyBoYXZlIGNvbnNpc3RlbnQgY2FzZQotICAgICogW1RIUklGVC0zMDMwXSAtIFRUaHJlYWRlZFNlcnZlcjogUHJvcGVydHkgZm9yIG51bWJlciBvZiBjbGllbnRUaHJlYWRzCi0gICAgKiBbVEhSSUZULTMwMjNdIC0gR28gY29tcGlsZXIgaXMgYSBsaXR0bGUgb3Zlcmx5IGNvbnNlcnZhdGl2ZSB3aXRoIG5hbWVzIG9mIGF0dHJpYnV0ZXMKLSAgICAqIFtUSFJJRlQtMzAxOF0gLSBDb21wYWN0IHByb3RvY29sIGZvciBEZWxwaGkKLSAgICAqIFtUSFJJRlQtMzAyNV0gLSBDaGFuZ2UgcHVyZSBJbnQgY29uc3RhbnRzIGludG8gQGVudW1zICh3aGVyZSBwb3NzaWJsZSkKLSAgICAqIFtUSFJJRlQtMzAzMV0gLSBtaWdyYXRlICJzaG91bGRTdG9wIiBmbGFnIHRvIFRTZXJ2ZXIKLSAgICAqIFtUSFJJRlQtMzAyMl0gLSBDb21wYWN0IHByb3RvY29sIGZvciBIYXhlCi0gICAgKiBbVEhSSUZULTMwNDFdIC0gR2VuZXJhdGUgYXN5bmNocm9ub3VzIGNsaWVudHMgZm9yIENvY29hCi0gICAgKiBbVEhSSUZULTMwNTNdIC0gUGVybCBTU0wgU29ja2V0IFN1cHBvcnQgKEVuY3J5cHRpb24pCi0gICAgKiBbVEhSSUZULTMyNDddIC0gR2VuZXJhdGUgYSBDKysgdGhyZWFkLXNhZmUgY2xpZW50Ci0gICAgKiBbVEhSSUZULTMyMTddIC0gUHJvdmlkZSBhIGxpdHRsZSBlbmRpYW4gdmFyaWFudCBvZiB0aGUgYmluYXJ5IHByb3RvY29sIGluIEMrKwotICAgICogW1RIUklGVC0zMjIzXSAtIFR5cGVTY3JpcHQ6IEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIEVudW0gTWFwcwotICAgICogW1RIUklGVC0zMjIwXSAtIE9wdGlvbiB0byBzdXBwcmVzcyBAR2VuZXJhdGVkIEFubm90YXRpb24gZW50aXJlbHkKLSAgICAqIFtUSFJJRlQtMzMwMF0gLSBSZWltcGxlbWVudCBUWmxpYlRyYW5zcG9ydCBpbiBKYXZhIHVzaW5nIHN0cmVhbXMKLSAgICAqIFtUSFJJRlQtMzI4OF0gLSBjX2dsaWI6IEJ1aWxkIHVuaXQgdGVzdHMgd2l0aCBhbGwgd2FybmluZ3MgZW5hYmxlZCwgbm8gd2FybmluZ3MgZ2VuZXJhdGVkCi0gICAgKiBbVEhSSUZULTMzNDddIC0gSW1wcm92ZSBjcm9zcyB0ZXN0IHNlcnZlcnMgYW5kIGNsaWVudHMKLSAgICAqIFtUSFJJRlQtMzM0Ml0gLSBJbXByb3ZlIHJ1YnkgY3Jvc3MgdGVzdCBjbGllbnQgYW5kIHNlcnZlciBjb21wYXRpYmlsaXR5Ci0gICAgKiBbVEhSSUZULTIyOTZdIC0gQWRkIEMrKyBCYXNlIGNsYXNzIGZvciBzZXJ2aWNlCi0gICAgKiBbVEhSSUZULTMzMzddIC0gQWRkIHRlc3RCb29sIG1ldGhvZCB0byBjcm9zcyB0ZXN0cwotICAgICogW1RIUklGVC0zMzAzXSAtIERpc2FibGUgY29uY3VycmVudCBjYWJhbCBqb2JzIG9uIFRyYXZpcyB0byBhdm9pZCBHSEMgY3Jhc2gKLSAgICAqIFtUSFJJRlQtMjYyM10gLSBEb2NrZXIgY29udGFpbmVyIGZvciBUaHJpZnQKLSAgICAqIFtUSFJJRlQtMzI5OF0gLSB0aHJpZnQgZW5kaWFuIGNvbnZlcnRlcnMgbWF5IGNvbmZsaWN0IHdpdGggb3RoZXIgbGlicmFyaWVzCi0gICAgKiBbVEhSSUZULTE1NTldIC0gUHJvdmlkZSBtZW1vcnkgcG9vbCBmb3IgVEJpbmFyeVByb3RvY29sIHRvIGVsaW1pbmF0ZSBtZW1vcnkgZnJhZ21lbnRhdGlvbgotICAgICogW1RIUklGVC00MjRdIC0gU3RlYWwgUHJvdG9jb2xCdWZmZXJzJyBWYXJJbnQgaW1wbGVtZW50YXRpb24gZm9yIEMrKwotCi0jIyBOZXcgRmVhdHVyZQotICAgICogW1RIUklGVC0zMDcwXSAtIEFkZCBhYmlsaXR5IHRvIHNldCB0aGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrCi0gICAgKiBbVEhSSUZULTE5MDldIC0gSmF2YTogQWRkIGNvbXBpbGVyIGZsYWcgdG8gdXNlIHRoZSAib3B0aW9uIHBhdHRlcm4iIGZvciBvcHRpb25hbCBmaWVsZHMKLSAgICAqIFtUSFJJRlQtMjA5OV0gLSBTdG9wIFRUaHJlYWRQb29sU2VydmVyIHdpdGggYWxpdmUgY29ubmVjdGlvbnMuCi0gICAgKiBbVEhSSUZULTEyM10gLSBpbXBsZW1lbnQgVFpsaWJUcmFuc3BvcnQgaW4gSmF2YQotICAgICogW1RIUklGVC0yMzY4XSAtIE5ldyBvcHRpb246IHJldXNlLW9iamVjdHMgZm9yIEphdmEgZ2VuZXJhdG9yCi0gICAgKiBbVEhSSUZULTI4MzZdIC0gT3B0aW9uYWxseSBnZW5lcmF0ZSBDKysxMSBNb3ZlQ29uc3RydWN0aWJsZSB0eXBlcwotICAgICogW1RIUklGVC0yODI0XSAtIEZsYWcgdG8gZGlzYWJsZSBodG1sIGVzY2FwaW5nIGRvY3RleHQKLSAgICAqIFtUSFJJRlQtMjgxOV0gLSBBZGQgV2Vic1NvY2tldCBjbGllbnQgdG8gbm9kZS5qcwotICAgICogW1RIUklGVC0zMDUwXSAtIENsaWVudCBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbiBmb3Igbm9uLWh0dHAgVExTIGluIEMjCi0gICAgKiBbVEhSSUZULTMyOTJdIC0gSW1wbGVtZW50IFRabGliVHJhbnNwb3J0IGluIEdvCi0KLSMjIFF1ZXN0aW9uCi0gICAgKiBbVEhSSUZULTI1ODNdIC0gVGhyaWZ0IG9uIHhQQyB0YXJnZXQgKFNwZWVkR29hdCkKLSAgICAqIFtUSFJJRlQtMjU5Ml0gLSB0aHJpZnQgc2VydmVyIHVzaW5nIGNfZ2xpYgotICAgICogW1RIUklGVC0yODMyXSAtIGNfZ2xpYjogSGFuZGxlIHN0cmluZyBsaXN0cyBjb3JyZWN0bHkKLSAgICAqIFtUSFJJRlQtMzEzNl0gLSB0aHJpZnQgaW5zdGFsbGF0aW9uIHByb2JsZW0gb24gbWFjCi0gICAgKiBbVEhSSUZULTMzNDZdIC0gY19nbGliOiBUdXRvcmlhbHMgZXhhbXBsZSBjcmFzaGVzIHNheWluZyBDYWxjdWxhdG9yLnBpbmcgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgRkFMU0UgYnV0IGRpZCBub3Qgc2V0IGFuIGVycm9yCi0KLSMjIFN1Yi10YXNrCi0gICAgKiBbVEhSSUZULTI1NzhdIC0gTW92aW5nICdtYWtlIGNyb3NzJyBmcm9tIHRlc3Quc2ggdG8gdGVzdC5weQotICAgICogW1RIUklGVC0yNzM0XSAtIEdvIGNvZGluZyBzdGFuZGFyZHMKLSAgICAqIFtUSFJJRlQtMjc0OF0gLSBBZGQgVmFncmFudGZpbGUgZm9yIENlbnRvcyA2LjUKLSAgICAqIFtUSFJJRlQtMjc1M10gLSBNaXNjLiBIYXhlIGltcHJvdmVtZW50cwotICAgICogW1RIUklGVC0yNjQwXSAtIENvbXBhY3QgUHJvdG9jb2wgaW4gQ29jb2EKLSAgICAqIFtUSFJJRlQtMzI2Ml0gLSB3YXJuaW5nOiBvdmVyZmxvdyBpbiBpbXBsaWNpdCBjb25zdGFudCBjb252ZXJzaW9uIGluIERlbnNlUHJvdG9UZXN0LmNwcAotICAgICogW1RIUklGVC0zMTk0XSAtIENhbid0IGJ1aWxkIHdpdGggZ28gZW5hYmxlZC4gIGdvbW9jayBTQ0MgcGF0aCBpbmNvcnJlY3QuCi0gICAgKiBbVEhSSUZULTMyNzVdIC0gY19nbGliIHR1dG9yaWFsIHdhcm5pbmdzIGluIGdlbmVyYXRlZCBjb2RlCi0gICAgKiBbVEhSSUZULTExMjVdIC0gTXVsdGlwbGV4aW5nIHN1cHBvcnQgZm9yIHRoZSBSdWJ5IExpYnJhcnkKLSAgICAqIFtUSFJJRlQtMjgwN10gLSBQSFAgQ29kZSBTdHlsZQotICAgICogW1RIUklGVC0yODQxXSAtIEFkZCBjb21wcmVoZW5zaXZlIGludGVncmF0aW9uIHRlc3RzIGZvciB0aGUgd2hvbGUgR28gc3RhY2sKLSAgICAqIFtUSFJJRlQtMjgxNV0gLSBIYXhlOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgotICAgICogW1RIUklGVC0yODg2XSAtIEludGVncmF0ZSBiaW5hcnkgdHlwZSBpbiBzdGFuZGFyZCBUaHJpZnQgY3Jvc3MgdGVzdAotICAgICogW1RIUklGVC0yOTQ2XSAtIEVuaGFuY2UgdXNhYmlsaXR5IG9mIGNyb3NzIHRlc3QgZnJhbWV3b3JrCi0gICAgKiBbVEhSSUZULTI5NjddIC0gQWRkIC5lZGl0b3Jjb25maWcgdG8gcm9vdAotICAgICogW1RIUklGVC0zMDMzXSAtIFBlcmw6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCi0gICAgKiBbVEhSSUZULTMxNzRdIC0gSW5pdGlhbGlzbSBjb2RlIGluIHRoZSBHbyBjb21waWxlciBkb2Vzbid0IGNoZWNrIGZpcnN0IHdvcmQKLSAgICAqIFtUSFJJRlQtMzE5M10gLSBPcHRpb24gdG8gc3VwcmVzcyBkYXRlIHZhbHVlIGluIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbgotICAgICogW1RIUklGVC0zMzA1XSAtIE1pc3NpbmcgZGlzdCBmaWxlcyBmb3IgMC45LjMgcmVsZWFzZSBjYW5kaWRhdGUKLSAgICAqIFtUSFJJRlQtMzM0MV0gLSBBZGQgdGVzdEJvb2wgbWV0aG9kcwotICAgICogW1RIUklGVC0zMzA4XSAtIEZpeCBicm9rZW4gdGVzdCBjYXNlcyBmb3IgMC45LjMgcmVsZWFzZSBjYW5kaWRhdGUKLQotIyMgVGFzawotICAgICogW1RIUklGVC0yODM0XSAtIFJlbW92ZSBzZW1pLWNvbG9ucyBmcm9tIHB5dGhvbiBjb2RlIGdlbmVyYXRvcgotICAgICogW1RIUklGVC0yODUzXSAtIEFkanVzdCBjb21tZW50cyBub3QgYXBwbHlpbmcgYW55bW9yZSBhZnRlciBUSFJJRlQtMjg1MgotCi0jIyBUZXN0Ci0gICAgKiBbVEhSSUZULTMyMTFdIC0gQWRkIG1ha2UgY3Jvc3Mgc3VwcG9ydCBmb3IgcGhwIFRDb21wYWN0UHJvdG9jb2wKLQotIyMgV2lzaAotICAgICogW1RIUklGVC0yODM4XSAtIFROb25ibG9ja2luZ1NlcnZlciBjYW4gYmluZCB0byBwb3J0IDAgKGkuZS4sIGdldCBhbiBPUy1hc3NpZ25lZCBwb3J0KSBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGdldCB0aGUgcG9ydCBudW1iZXIKLQotCi0KLVRocmlmdCAwLjkuMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMjIEJ1ZwotICAgICogW1RIUklGVC0yNzkzXSAtIEdvIGNvbXBpbGVyIHByb2R1Y2VzIHVuY29tcGlsYWJsZSBjb2RlCi0gICAgKiBbVEhSSUZULTE0ODFdIC0gVW5peCBkb21haW4gc29ja2V0cyBpbiBDKysgZG8gbm90IHN1cHBvcnQgdGhlIGFic3RyYWN0IG5hbWVzcGFjZQotICAgICogW1RIUklGVC0xNDU1XSAtIFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RyaW5nIGNhc3RzIGZyb20gc2l6ZV90IHRvIHVpbnQzMl90LCB3aGljaCBpcyBub3Qgc2FmZSBvbiA2NC1iaXQgcGxhdGZvcm1zCi0gICAgKiBbVEhSSUZULTE1NzldIC0gUEhQIEV4dGVudGlvbiAtIGZ1bmN0aW9uIHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSBub3Qgd29ya2luZyBmcm9tIFRCaW5hcnlTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZQotICAgICogW1RIUklGVC0xNTg0XSAtIEVycm9yOiBjb3VsZCBub3QgU2V0TWluVGhyZWFkcyBpbiBUaHJlYWRQb29sIG9uIHNpbmdsZS1jb3JlIG1hY2hpbmVzCi0gICAgKiBbVEhSSUZULTE2MTRdIC0gVGhyaWZ0IGJ1aWxkIGZyb20gc3ZuIHJlcG8gc291cmNlcyBmYWlscyB3aXRoIGF1dG9tYWtlLTEuMTIKLSAgICAqIFtUSFJJRlQtMTA0N10gLSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSB0cmVhdHMgYXJnIGFzIHN0cmluZyB3aXRob3V0IGNoZWNrLCBzZWdmYXVsdHMgaWYgeW91IHBhc3Mgbm9uLXN0cmluZwotICAgICogW1RIUklGVC0xNjM5XSAtIEphdmEvUHl0aG9uOiBTZXJpYWxpemF0aW9uL0Rlc2VyaWFsaXphdGlvbiBvZiBkb3VibGUgdHlwZSB1c2luZyBDb21wYWN0UHJvdG9jb2wKLSAgICAqIFtUSFJJRlQtMTY0N10gLSBOb2RlSlMgQnVmZmVyZWRUcmFuc3BvcnQgZG9lcyBub3Qgd29yayBiZXlvbmQgdGhlIGhlbGxvLXdvcmxkIGV4YW1wbGUKLSAgICAqIFtUSFJJRlQtMjEzMF0gLSBUaHJpZnQncyBEIGxpYnJhcnkvdGVzdDogcGFydHMgb2YgIm1ha2UgY2hlY2siIGNvZGUgZG8gbm90IGNvbXBpbGUgd2l0aCByZWNlbnQgZG1kLTIuMDYyIHRocm91Z2ggZG1kLTIuMDY0YWxwaGEKLSAgICAqIFtUSFJJRlQtMjE0MF0gLSBFcnJvciBjb21waWxpbmcgY3BwIHR1dG9yaWFscwotICAgICogW1RIUklGVC0yMTM5XSAtIE1TVkMgMjAxMiBFcnJvciAtIENhbm5vdCBjb21waWxlIGR1ZSB0byBCb29zdFRocmVhZEZhY3RvcnkKLSAgICAqIFtUSFJJRlQtMjEzOF0gLSBwa2djb25maWcgZmlsZSBjcmVhdGVkIHdpdGggd3JvbmcgaW5jbHVkZSBwYXRoCi0gICAgKiBbVEhSSUZULTIxNjBdIC0gV2FybmluZyBpbiB0aHJpZnQuaCB3aGVuIGNvbXBpbGluZyB3aXRoIC1XdW51c2VkIGFuZCBOREVCVUcKLSAgICAqIFtUSFJJRlQtMjE1OF0gLSBDb21wYWN0LCBKU09OLCBhbmQgU2ltcGxlSlNPTiBwcm90b2NvbHMgYXJlIG5vdCB3b3JraW5nIGNvcnJlY3RseQotICAgICogW1RIUklGVC0yMTY3XSAtIG5vZGVqcyBsaWIgdGhyb3dzIGVycm9yIGlmIG9wdGlvbnMgYXJndW1lbnQgaXNuJ3QgcGFzc2VkCi0gICAgKiBbVEhSSUZULTIyODhdIC0gR28gaW1wbCBvZiBUaHJpZnQgSlNPTiBwcm90b2NvbCB3cm9uZ2x5IHdyaXRlcy9leHBlY3RzIHRydWUvZmFsc2UgZm9yIGJvb2xzCi0gICAgKiBbVEhSSUZULTIxNDddIC0gVGhyaWZ0IElETCBncmFtbWFyIGFsbG93cyBmb3IgZG90dGVkIGlkZW50aWZpZXIgbmFtZXMKLSAgICAqIFtUSFJJRlQtMjE0NV0gLSBSYWNrIGFuZCBUaGluIGFyZSBub3QganVzdCBkZXZlbG9wbWVudCBkZXBlbmRlbmNpZXMKLSAgICAqIFtUSFJJRlQtMjI2N10gLSBTaG91bGQgYmUgYWJsZSB0byBjaG9vc2Ugc29ja2V0IGZhbWlseSBpbiBQeXRob24gVFNvY2tldAotICAgICogW1RIUklGVC0yMjc2XSAtIGphdmEgcGF0aCBpbiBzcGVjIGZpbGUgbmVlZHMgdXBkYXRpbmcKLSAgICAqIFtUSFJJRlQtMjI4MV0gLSBHZW5lcmF0ZWQgc2VuZC9yZWN2IGNvZGUgaWdub3JlcyBlcnJvcnMgcmV0dXJuZWQgYnkgdGhlIHVuZGVybHlpbmcgcHJvdG9jb2wKLSAgICAqIFtUSFJJRlQtMjI4MF0gLSBUSlNPTlByb3RvY29sLkZsdXNoKCkgZG9lcyBub3QgcmVhbGx5IGZsdXNoIHRoZSB0cmFuc3BvcnQKLSAgICAqIFtUSFJJRlQtMjI3NF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgYW5kIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGRvIG5vdCBjbG9zZSB0aGVpciBjaGFubmVsIHNlbGVjdG9ycyBvbiBleGl0IGFuZCBsZWFrIGZpbGUgZGVzY3JpcHRvcnMKLSAgICAqIFtUSFJJRlQtMjI2NV0gLSBwaHAgbGlicmFyeSBkb2Vzbid0IGJ1aWxkCi0gICAgKiBbVEhSSUZULTIyMzJdIC0gSXNTZXQqIGJyb2tlbiBpbiBHbwotICAgICogW1RIUklGVC0yMjQ2XSAtIFVuc2V0IGVudW0gdmFsdWUgaXMgcHJpbnRlZCBieSBUb1N0cmluZygpCi0gICAgKiBbVEhSSUZULTIyNDBdIC0gdGhyaWZ0LnZpbSAoY29udHJpYikgZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSAndW5pb24nCi0gICAgKiBbVEhSSUZULTIyNDNdIC0gVE5vbmJsb2NraW5nU2VydmVyIGluIHRocmlmdCBjcmFzaGVzIHdoZW4gVEZyYW1lZFRyYW5zcG9ydCBvcGVucwotICAgICogW1RIUklGVC0yMjMwXSAtIENhbm5vdCBCdWlsZCBvbiBSSEVML0NlbnRvcy9BbWF6b24gTGludXggNi54Ci0gICAgKiBbVEhSSUZULTIyNDddIC0gR28gZ2VuZXJhdG9yIGRvZXNuJ3QgZGVhbCB3ZWxsIHdpdGggbWFwIGtleXMgb2YgdHlwZSBiaW5hcnkKLSAgICAqIFtUSFJJRlQtMjI1M10gLSBQeXRob24gVG9ybmFkbyBUVG9ybmFkb1NlcnZlciBiYXNlIGNsYXNzIGNoYW5nZQotICAgICogW1RIUklGVC0yMjYxXSAtIGphdmE6IGVycm9yOiB1bm1hcHBhYmxlIGNoYXJhY3RlciBmb3IgZW5jb2RpbmcgQVNDSUkKLSAgICAqIFtUSFJJRlQtMjI1OV0gLSBDIzogdW5leHBlY3RlZCBudWxsIGxvZ0RlbGVnYXRlKCkgcG9pbnRlciBjYXVzZXMgQVYgaW4gVFNlcnZlci5zZXJ2ZSgpCi0gICAgKiBbVEhSSUZULTIyMjVdIC0gU1NMQ29udGV4dCBkZXN0cm95IGJlZm9yZSBjbGVhbnVwT3BlblNTTAotICAgICogW1RIUklGVC0yMjI0XSAtIFRTU0xTb2NrZXQuaCBhbmQgVFNTTFNlcnZlclNvY2tldC5oIHNob3VsZCB1c2UgdGhlIHBsYXRmcm9tc29ja2V0IHRvbwotICAgICogW1RIUklGVC0yMjI5XSAtIHRocmlmdCBmYWlsZWQgdG8gYnVpbGQgb24gT1NYIDEwLjkgR00KLSAgICAqIFtUSFJJRlQtMjIyN10gLSBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdGVzIHNwdXJpb3VzIHdhcm5pbmdzIHdpdGggWGxpbnQKLSAgICAqIFtUSFJJRlQtMjIxOV0gLSBUaHJpZnQgZ2VtIGZhaWxzIHRvIGJ1aWxkIG9uIE9TIFggTWF2ZXJpY2tzIHdpdGggMS45LjMgcnViaWVzCi0gICAgKiBbVEhSSUZULTIyMjZdIC0gVFNlcnZlclNvY2tldCAtIGtlZXBBbGl2ZSB3cm9uZyBpbml0aWFsaXphdGlvbiBvcmRlcgotICAgICogW1RIUklGVC0yMjg1XSAtIFRKc29uUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIEphdmEgZG9lc24ndCBhbGxvdyBhIHNsYXNoICgvKSB0byBiZSBlc2NhcGVkIChcLykKLSAgICAqIFtUSFJJRlQtMjIxNl0gLSBFeHRyYW5lb3VzIHNlbWljb2xvbiBpbiBUUHJvdG9jb2xVdGlsLmggbWFrZXMgY2xhbmcgbWFkCi0gICAgKiBbVEhSSUZULTIyMTVdIC0gR2VuZXJhdGVkIEhUTUwvR3JhcGh2aXogbGlzdHMgcmVmZXJlbmNlZCBlbnVtIGlkZW50aWZpZXJzIGFzIFVOS05PV04uCi0gICAgKiBbVEhSSUZULTIyMTFdIC0gRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGRvZXMgbm90IGNvbnRhaW4gbmFtZXNwYWNlIHByZWZpeC4KLSAgICAqIFtUSFJJRlQtMjIxMF0gLSBsaWIvamF2YSBUU2ltcGxlSlNPTlByb3RvY29sIGNhbiBlbWl0IGludmFsaWQgSlNPTgotICAgICogW1RIUklGVC0yMjA5XSAtIFJ1YnkgZ2VuZXJhdG9yIC0tIHBsZWFzZSBuYW1lc3BhY2UgY2xhc3NlcwotICAgICogW1RIUklGVC0yMjAyXSAtIERlbHBoaSBUU2VydmVySW1wbC5EZWZhdWx0TG9nRGVsZWdhdGUgbWF5IHN0b3AgdGhlIHNlcnZlciB3aXRoIEkvTy1FcnJvciAxMDUKLSAgICAqIFtUSFJJRlQtMjIwMV0gLSBUZXJuYXJ5IG9wZXJhdG9yIHJldHVybnMgZGlmZmVyZW50IHR5cGVzIChidWlsZCBlcnJvciBmb3Igc29tZSBjb21waWxlcnMpCi0gICAgKiBbVEhSSUZULTIyMDBdIC0gbmVzdGVkIHN0cnVjdHMgY2F1c2UgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB0byBzbG93IGRvd24gYXQgZXhjZXNzaXZlIENQVSBsb2FkCi0gICAgKiBbVEhSSUZULTIxOTddIC0gZml4IGphciBvdXRwdXQgZGlyZWN0b3J5IGluIHJwbSBzcGVjIGZpbGUKLSAgICAqIFtUSFJJRlQtMjE5Nl0gLSBGaXggaW52YWxpZCBkZXBlbmRlbmN5IGluIE1ha2VmaWxlLmFtCi0gICAgKiBbVEhSSUZULTIxOTRdIC0gTm9kZTogTm90IGFjdHVhbGx5IHByZXBlbmRpbmcgcmVzaWR1YWwgZGF0YSBpbiBURnJhbWVkVHJhbnNwb3J0LnJlY2VpdmVyCi0gICAgKiBbVEhSSUZULTIxOTNdIC0gSmF2YSBjb2RlIGdlbmVyYXRvciBlbWl0cyBzcHVyaW91cyBzZW1pY29sb24gd2hlbiBkZWVwIGNvcHlpbmcgYmluYXJ5IGRhdGEKLSAgICAqIFtUSFJJRlQtMjE5MV0gLSBGaXggY2hhcnAgSlNPTlByb3RvY29sLlJlYWRKU09ORG91YmxlIChzcGVjaWZ5IEludmFyaWFudEN1bHR1cmUpCi0gICAgKiBbVEhSSUZULTIyMTRdIC0gU3lzdGVtIGhlYWRlciBzeXMvcGFyYW0uaCBpcyBpbmNsdWRlZCBpbnNpZGUgdGhlIFRocmlmdCBuYW1lc3BhY2UKLSAgICAqIFtUSFJJRlQtMjE3OF0gLSBUaHJpZnQgZ2VuZXJhdG9yIHJldHVybnMgZXJyb3IgZXhpdCBjb2RlIG9uIC0tdmVyc2lvbgotICAgICogW1RIUklGVC0yMTcxXSAtIE5vZGVKUyBpbXBsZW1lbnRhdGlvbiBoYXMgZXh0cmVtZWx5IGxvdyB0ZXN0IGNvdmVyYWdlCi0gICAgKiBbVEhSSUZULTIxODNdIC0gZ2VtIGluc3RhbGwgZmFpbHMgb24genNoCi0gICAgKiBbVEhSSUZULTIxODJdIC0gc2VnZmF1bHQgaW4gcmVncmVzc2lvbiB0ZXN0cyAoR0MgYnVnIGluIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlKQotICAgICogW1RIUklGVC0yMTgxXSAtIG9uZXdheSBjYWxscyBkb24ndCB3b3JrIGluIE5vZGVKUwotICAgICogW1RIUklGVC0yMTY5XSAtIEphdmFNRSBUaHJpZnQgTGlicmFyeSBjYXVzZXMgImphdmEuaW8uSU9FeGNlcHRpb246IE5vIFJlc3BvbnNlIEVudHJpZXMgQXZhaWxhYmxlIiBhZnRlciB1c2luZyB0aGUgVGhyaWZ0IGNsaWVudCBmb3Igc29tZSB0aW1lCi0gICAgKiBbVEhSSUZULTIxNjhdIC0gTm9kZS5qcyBhcHBlYXJzIGJyb2tlbiAoYXQgbGVhc3QsIGV4YW1wbGVzIGRvbid0IHdvcmsgYXMgaW50ZW5kZWQpCi0gICAgKiBbVEhSSUZULTIyOTNdIC0gVFNTTFRyYW5zcG9ydEZhY3RvcnkuY3JlYXRlU1NMQ29udGV4dCgpIGxlYXZlcyBmaWxlcyBvcGVuCi0gICAgKiBbVEhSSUZULTIyNzldIC0gVFNlcmlhbGl6ZXIgb25seSByZXR1cm5zIHRoZSBmaXJzdCAxMDI0IGJ5dGVzIHNlcmlhbGl6ZWQKLSAgICAqIFtUSFJJRlQtMjI3OF0gLSBCdWZmZXJlZCB0cmFuc3BvcnQgZG9lc24ndCBzdXBwb3J0IHdyaXRlcyA+IGJ1ZmZlciBzaXplCi0gICAgKiBbVEhSSUZULTIyNzVdIC0gRml4IG1lbW9yeSBsZWFrIGluIGdvbGFuZyBjb21wYWN0X3Byb3RvY29sLgotICAgICogW1RIUklGVC0yMjgyXSAtIEluY29yZWN0IGNvZGUgZ2VuZXJhdGVkIGZvciBzb21lIHR5cGVkZWZzCi0gICAgKiBbVEhSSUZULTIwMDldIC0gR28gcmVkZWNsYXJhdGlvbiBlcnJvcgotICAgICogW1RIUklGVC0xOTY0XSAtICdJc3NldCcgY2F1c2VzIHByb2JsZW1zIHdpdGggQyMvLk5FVCBzZXJpYWxpemVycwotICAgICogW1RIUklGVC0yMDI2XSAtIEZpeCBUQ29tcGFjdFByb3RvY29sIDY0IGJpdCBidWlsZHMKLSAgICAqIFtUSFJJRlQtMjEwOF0gLSBGaXggVEFzeW5jQ2xpZW50TWFuYWdlciB0aW1lb3V0IHJhY2UKLSAgICAqIFtUSFJJRlQtMjA2OF0gLSBNdWx0aXBsZSBjYWxscyBmcm9tIHNhbWUgY29ubmVjdGlvbiBhcmUgbm90IHByb2Nlc3NlZCBpbiBub2RlCi0gICAgKiBbVEhSSUZULTE3NTBdIC0gTWFrZSBjb21waWxlciBidWlsZCBjbGVhbmx5IHVuZGVyIHZpc3VhbCBzdHVkaW8gMTAKLSAgICAqIFtUSFJJRlQtMTc1NV0gLSBDb21tZW50IHBhcnNpbmcgYnVnCi0gICAgKiBbVEhSSUZULTE3NzFdIC0gIm1ha2UgY2hlY2siIGZhaWxzIG9uIHg2NCBmb3IgbGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hCi0gICAgKiBbVEhSSUZULTE4NDFdIC0gTm9kZUpTIFRocmlmdCBpbmNvcnJlY3RseSBwYXJzZXMgbm9uLVVURjgtc3RyaW5nIHR5cGVzCi0gICAgKiBbVEhSSUZULTE5MDhdIC0gVXNpbmcgcGhwIHRocmlmdF9wcm90b2NvbCBhY2NlbGVyYXRlZCB0cmFuc2ZlciBjYXVzZXMgY29yZSBkdW1wCi0gICAgKiBbVEhSSUZULTE4OTJdIC0gU29ja2V0IHRpbWVvdXRzIGFyZSBkZWNsYXJlZCBpbiBtaWxsaS1zZWNvbmRzLCBidXQgYXJlIGFjdHVhbGx5IHNldCBpbiBtaWNyby1zZWNvbmRzCi0gICAgKiBbVEhSSUZULTIzMDNdIC0gVEJ1ZmZlcnJlZFRyYW5zcG9ydCBub3QgcHJvcGVybHkgY2xvc2luZyB1bmRlcmx5aW5nIHRyYW5zcG9ydAotICAgICogW1RIUklGVC0yMzEzXSAtIG5vZGVqcyBzZXJ2ZXIgY3Jhc2ggYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgZmlyc3QgcmVxdWVzdCB3aGVuIHVzaW5nIE11bHRpcGxleGVkUHJvY2Vzc29yL0ZyYW1lZEJ1ZmZlci9CaW5hcnlQcm90b2NvbAotICAgICogW1RIUklGVC0yMzExXSAtIEdvOiBpbnZhbGlkIGNvZGUgZ2VuZXJhdGVkIHdoZW4gZXhjZXB0aW9uIG5hbWUgaXMgYSBnbyBrZXl3b3JkCi0gICAgKiBbVEhSSUZULTIzMDhdIC0gbm9kZTogVEpTT05Qcm90b2NvbCBwYXJzZSBlcnJvciB3aGVuIHJlYWRpbmcgZnJvbSBidWZmZXJlZCBtZXNzYWdlCi0gICAgKiBbVEhSSUZULTIzMTZdIC0gY2NwOiBURmlsZVRyYW5zcG9ydFRlc3QKLSAgICAqIFtUSFJJRlQtMjM1Ml0gLSBtc3ZjIGZhaWxlZCB0byBjb21waWxlIHRocmlmdCB0ZXN0cwotICAgICogW1RIUklGVC0yMzM3XSAtIEdvbGFuZyBkb2VzIG5vdCByZXBvcnQgVElNRURfT1VUIGV4Y2VwdGlvbnMKLSAgICAqIFtUSFJJRlQtMjM0MF0gLSBHZW5lcmF0ZWQgc2VydmVyIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHNlbmQgcmVzcG9uc2UgdHlwZSBFWENFUFRJT04gb24gdGhlIFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV05fTUVUSE9EIGV4Y2VwdGlvbgotICAgICogW1RIUklGVC0yMzU0XSAtIENvbm5lY3Rpb24gZXJyb3JzIGNhbiBsZWFkIHRvIGNhc2VfY2xhdXNlIGV4Y2VwdGlvbnMKLSAgICAqIFtUSFJJRlQtMjMzOV0gLSBVbmNhdWdodCBleGNlcHRpb24gaW4gdGhyaWZ0IGMjIGRyaXZlcgotICAgICogW1RIUklGVC0yMzU2XSAtIGMrKyB0aHJpZnQgY2xpZW50IG5vdCB3b3JraW5nIHdpdGggc3NsIChTU0xfY29ubmVjdCBoYW5ncykKLSAgICAqIFtUSFJJRlQtMjMzMV0gLSBNaXNzaW5nIGNhbGwgdG8gUmVhZFN0cnVjdEJlZ2luKCkgaW4gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoKQotICAgICogW1RIUklGVC0yMzIzXSAtIFVuY29tcGlsZWFibGUgRGVscGhpIGNvZGUgZ2VuZXJhdGVkIGZvciB0eXBlZGVmJ2Qgc3RydWN0cwotICAgICogW1RIUklGVC0yMzIyXSAtIENvcnJlY3RseSBzaG93IHRoZSBudW1iZXIgb2YgdGltZXMgRXhlY3V0b3JTZXJ2aWNlIChqYXZhKSBoYXMgcmVqZWN0ZWQgdGhlIGNsaWVudC4KLSAgICAqIFtUSFJJRlQtMjM4OV0gLSBuYW1lc3BhY2VzIGhhbmRsZWQgd3JvbmdseSBpbiBhY3Jpb25zY3JpcHQgMy4wIGltcGxlbWVudGF0aW9uCi0gICAgKiBbVEhSSUZULTIzODhdIC0gR29MYW5nIC0gRml4IGRhdGEgcmFjZXMgaW4gc2ltcGxlX3NlcnZlciBhbmQgc2VydmVyX3NvY2tldAotICAgICogW1RIUklGVC0yMzg2XSAtIFRocmlmdCByZWZ1c2VzIHRvIGxpbmsgeXlsZXgKLSAgICAqIFtUSFJJRlQtMjM3NV0gLSBFeGNlc3NpdmUgPGJyPidzIGluIGdlbmVyYXRlZCBIVE1MCi0gICAgKiBbVEhSSUZULTIzNzNdIC0gd2FybmluZyBDUzA0MTQgaW4gVEh0dHBDbGllbnQuY3M6IHByaXZhdGUgZmllbGQgJ1RocmlmdC5UcmFuc3BvcnQuVEh0dHBDbGllbnQuY29ubmVjdGlvbicgYXNzaWduZWQgYnV0IG5ldmVyIHVzZWQKLSAgICAqIFtUSFJJRlQtMjM3Ml0gLSB0aHJpZnQvanNvbl9wcm90b2NvbC5nbzoxNjA6IGZ1bmN0aW9uIGVuZHMgd2l0aG91dCBhIHJldHVybiBzdGF0ZW1lbnQKLSAgICAqIFtUSFJJRlQtMjM3MV0gLSBydWJ5IGJ1bmRsZXIgdmVyc2lvbiBmYWlscyBvbiB+MS4zLjEsIHJlbW92ZSBhbmQgdGFrZSBsYXRlc3QgYXZhaWwKLSAgICAqIFtUSFJJRlQtMjM3MF0gLSBDb21waWxlciBTRUdGQVVMVHMgZ2VuZXJhdGluZyBIVE1MIGRvY3VtZW50YXRpb24gZm9yIGNvbXBsZXggc3RydWNyZQotICAgICogW1RIUklGVC0yMzg0XSAtIEJpbmFyeSBtYXAga2V5cyBwcm9kdWNlIHVuY29tcGlsYWJsZSBjb2RlIGluIGdvCi0gICAgKiBbVEhSSUZULTIzODBdIC0gdW5yZWFjaGFibGUgY29kZSAoQ0lEIDExNzQ1NDYsIENJRCAxMTc0Njc5KQotICAgICogW1RIUklGVC0yMzc4XSAtIHNlcnZpY2UgbWV0aG9kIGFyZ3VtZW50cyBvZiBiaW5hcnkgdHlwZSBsZWFkIHRvIHVuY29tcGlsZWFibGUgR28gY29kZQotICAgICogW1RIUklGVC0yMzYzXSAtIElzc3VlIHdpdGggY2hhcmFjdGVyIGVuY29kaW5nIG9mIFN1Y2Nlc3MgcmV0dXJuZWQgZnJvbSBMb2dpbiB1c2luZyBUaHJpZnQgUHJveHkgYW5kIE5vZGVKUwotICAgICogW1RIUklGVC0yMzU5XSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBkb2Vzbid0IGNsZWFyIGl0J3MgYnVmZmVyIG9uIGEgZmFpbGVkIGZsdXNoIGNhbGwKLSAgICAqIFtUSFJJRlQtMjQyOF0gLSBQeXRob24gMyBzZXR1cC5weSBzdXBwb3J0Ci0gICAgKiBbVEhSSUZULTIzNjddIC0gQnVpbGQgZmFpbHVyZTogc3RkbGliIGFuZCBib29zdCBib3RoIGRlZmluZSB1aW50NjRfdAotICAgICogW1RIUklGVC0yMzY1XSAtIEMjIGRlY29kZXMgdG9vIG1hbnkgYmluYXJ5IGJ5dGVzIGZyb20gSlNPTgotICAgICogW1RIUklGVC0yNDAyXSAtIGJ5dGUgY291bnQgb2YgRnJhbWVCdWZmZXIgaW4gQVdBSVRJTkdfQ0xPU0Ugc3RhdGUgaXMgbm90IHN1YnRyYWN0ZWQgZnJvbSByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQKLSAgICAqIFtUSFJJRlQtMjM5Nl0gLSBCdWlsZCBFcnJvciBvbiBNYWNPU1gKLSAgICAqIFtUSFJJRlQtMjM5NV0gLSB0aHJpZnQgUnVieSBnZW0gcmVxdWlyZXMgZGV2ZWxvcG1lbnQgZGVwZW5kZW5jeSAndGhpbicgcmVnYXJkbGVzcyBvZiBlbnZpcm9ubWVudAotICAgICogW1RIUklGVC0yNDE0XSAtIGNfZ2xpYiBmaXggc2V2ZXJhbCBidWcuCi0gICAgKiBbVEhSSUZULTI0MjBdIC0gR28gYXJndW1lbnQgcGFyc2VyIGZvciBtZXRob2RzIHdpdGhvdXQgYXJndW1lbnRzIGRvZXMgbm90IHNraXAgZmllbGRzCi0gICAgKiBbVEhSSUZULTI0MzldIC0gQnVnIGluIFRQcm90b2NvbERlY29yYXRvciBDbGFzcyBjYXVzZXMgcGFyc2luZyBlcnJvcnMKLSAgICAqIFtUSFJJRlQtMjQxOV0gLSBnb2xhbmcgLSBGaXggZm10LkVycm9yZiBpbiBnZW5lcmF0ZWQgY29kZQotICAgICogW1RIUklGVC0yNDE4XSAtIEdvIGhhbmRsZXIgZnVuY3Rpb24gcGFuaWNzIG9uIGludGVybmFsIGVycm9yCi0gICAgKiBbVEhSSUZULTI0MDVdIC0gTm9kZS5qcyBNdWx0aXBsZXhlciB0ZXN0cyBmYWlsIChzaWxlbnRseSkKLSAgICAqIFtUSFJJRlQtMjU4MV0gLSBURkRUcmFuc3BvcnQgZGVzdHJ1Y3RvciBzaG91bGQgbm90IHRocm93Ci0gICAgKiBbVEhSSUZULTI1NzVdIC0gVGhyaWZ0IGluY2x1ZGVzIHNpZ2luZm9fdCB3aXRoaW4gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sIG5hbWVzcGFjZQotICAgICogW1RIUklGVC0yNTc3XSAtIFRGaWxlVHJhbnNwb3J0ICBtaXNzdXNlIG9mIGNsb3Nlc29ja2V0IG9uIHdpbmRvd3MgcGxhdGZvcm0KLSAgICAqIFtUSFJJRlQtMjU3Nl0gLSBJbXBsZW1lbnQgVGhyaWZ0LlByb3RvY29sLnByb3RvdHlwZS5za2lwIG1ldGhvZCBpbiBKYXZhU2NyaXB0IGxpYnJhcnkKLSAgICAqIFtUSFJJRlQtMjU4OF0gLSBUaHJpZnQgY29tcGlsZXIgaXMgbm90IGJ1aWxkYWJsZSBpbiBWaXN1YWwgU3R1ZGlvIDIwMTAKLSAgICAqIFtUSFJJRlQtMjU5NF0gLSBKUyBDb21waWxlcjogU2luZ2xlIHF1b3RlcyBhcmUgbm90IGJlaW5nIGVzY2FwZWQgaW4gY29uc3RhbnRzLgotICAgICogW1RIUklGVC0yNTkxXSAtIFRGcmFtZWRUcmFuc3BvcnQgZG9lcyBub3QgaGFuZGxlIHBheWxvYWRzIHNwbGl0IGFjcm9zcyBwYWNrZXRzIGNvcnJlY3RseQotICAgICogW1RIUklGVC0yNTk5XSAtIFVuY29tcGlsZWFibGUgRGVscGhpIGNvZGUgZHVlIHRvIG5hbWluZyBjb25mbGljdHMgd2l0aCBJREwKLSAgICAqIFtUSFJJRlQtMjU5MF0gLSBDKysgVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBkb2Vzbid0IGluY2x1ZGUgTXVsdGlwbGV4aW5nIHN1cHBvcnQKLSAgICAqIFtUSFJJRlQtMjU5NV0gLSBOb2RlLmpzOiBGaXggZ2xvYmFsIGxlYWtzIGFuZCBjb3B5LXBhc3RlIGVycm9ycwotICAgICogW1RIUklGVC0yNTY1XSAtIGF1dG9jb25mIGZhaWxzIHRvIGZpbmQgbWluZ3ctZysrIGNyb3NzIGNvbXBpbGVyIG9uIHRyYXZpcyBDSQotICAgICogW1RIUklGVC0yNTU1XSAtIGV4Y2Vzc2l2ZSAidW51c2VkIGZpZWxkIiBjb21tZW50cwotICAgICogW1RIUklGVC0yNTU0XSAtIGRvdWJsZSBpbml0aWFsaXphdGlvbiBpbiBnZW5lcmF0ZWQgUmVhZCgpIG1ldGhvZAotICAgICogW1RIUklGVC0yNTUxXSAtIE91dE9mTWVtb3J5RXJyb3IgInVuYWJsZSB0byBjcmVhdGUgbmV3IG5hdGl2ZSB0aHJlYWQiIGtpbGxzIHNlcnZlIHRocmVhZAotICAgICogW1RIUklGVC0yNTQzXSAtIEdlbmVyYXRlZCBlbnVtIHR5cGUgaW4gaGFza2VsbCBzaG91bGQgYmUgcXVhbGlmaWVkCi0gICAgKiBbVEhSSUZULTI1NjBdIC0gVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRvciB0cmllcyB0byBjb25jYXQgaW50cyB3aXRoIHN0cmluZ3MgdXNpbmcgKwotICAgICogW1RIUklGVC0yNTU5XSAtIENlbnRvcyA2LjUgdW5hYmxlIHRvICJtYWtlIiB3aXRoIFRocmlmdCAwLjkuMQotICAgICogW1RIUklGVC0yNTI2XSAtIEFzc2lnbm1lbnQgb3BlcmF0b3JzIGFuZCBjb3B5IGNvbnN0cnVjdG9ycyBpbiBjKysgZG9uJ3QgY29weSB0aGUgX19pc3NldCBzdHJ1Y3QKLSAgICAqIFtUSFJJRlQtMjQ1NF0gLSBjX2dsaWI6IFRoZXJlIGlzIG5vIGdldGhvc3RieW5hbWVfcigpIGluIHNvbWUgT1MuCi0gICAgKiBbVEhSSUZULTI0NTFdIC0gRG8gbm90IHVzZSBwb2ludGVycyBmb3Igb3B0aW9uYWwgZmllbGRzIHdpdGggZGVmYXVsdHMuIERvIG5vdCB3cml0ZSBzdWNoIGZpZWxkcyBpZiBpdHMgdmFsdWUgc2V0IHRvIGRlZmF1bHQuIEFsc28sIGRvIG5vdCB1c2UgcG9pbnRlcnMgZm9yIGFueSBvcHRpb25hbCBmaWVsZHMgbWFwcGVkIHRvIGdvIG1hcCBvciBzbGljZS4gZ2VuZXJhdGUgR2V0IGFjY2Vzc29ycwotICAgICogW1RIUklGVC0yNDUwXSAtIGluY2x1ZGUgSG93VG9Db250cmlidXRlIGluIHRoZSBzcmMgcmVwbwotICAgICogW1RIUklGVC0yNDQ4XSAtIHRocmlmdC90ZXN0L3Rlc3Quc2ggaGFzIGluY29ycmVjdCBOb2RlLmpzIHRlc3QgcGF0aAotICAgICogW1RIUklGVC0yNDYwXSAtIHVub3BlbmVkIHNvY2tldCBmZCBtdXN0IGJlIGxlc3MgdGhhbiB6ZXJvLgotICAgICogW1RIUklGVC0yNDU5XSAtIC0tdmVyc2lvbiBzaG91bGQgbm90IGV4aXQgMQotICAgICogW1RIUklGVC0yNDY4XSAtIFRpbWVzdGFtcCBoYW5kbGluZwotICAgICogW1RIUklGVC0yNDY3XSAtIFVuYWJsZSB0byBidWlsZCBjb250cmliL2ZiMzAzIG9uIE9TWCAxMC45LjIKLSAgICAqIFtUSFJJRlQtMjQ2Nl0gLSBJbXByb3BlciBlcnJvciBoYW5kbGluZyBmb3IgU1NML1RMUyBjb25uZWN0aW9ucyB0aGF0IGRvbid0IGNvbXBsZXRlIGEgaGFuZHNoYWtlCi0gICAgKiBbVEhSSUZULTI0NjNdIC0gdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkgZmFpbHMgc29tZXRpbWVzCi0gICAgKiBbVEhSSUZULTI0NThdIC0gR2VuZXJhdGVkIGdvbGFuZyBzZXJ2ZXIgY29kZSBmb3IgIm9uZXdheSIgbWV0aG9kcyBpcyBpbmNvcnJlY3QKLSAgICAqIFtUSFJJRlQtMjQ1Nl0gLSBUSHR0cENsaWVudCBmYWlscyB3aGVuIHVzaW5nIGFzeW5jIHN1cHBvcnQgb3V0c2lkZSBTaWx2ZXJsaWdodAotICAgICogW1RIUklGVC0yNTI0XSAtIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBpcyBtaXNzaW5nIFRUaHJlYWRlZFNlcnZlciBmaWxlcwotICAgICogW1RIUklGVC0yNTIzXSAtIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBpcyBtaXNzaW5nIE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkIGZpbGVzCi0gICAgKiBbVEhSSUZULTI1MjBdIC0gY3BwOmNvYl9zdHlsZSBnZW5lcmF0ZXMgaW5jb3JyZWN0IC50Y2MgZmlsZQotICAgICogW1RIUklGVC0yNTA4XSAtIFVuY29tcGlsZWFibGUgQyMgY29kZSBkdWUgdG8gbGFuZ3VhZ2Uga2V5d29yZHMgaW4gSURMCi0gICAgKiBbVEhSSUZULTI1MDZdIC0gVXBkYXRlIFRQcm90b2NvbEV4Y2VwdGlvbiBlcnJvciBjb2RlcyB0byBiZSB1c2VkIGNvbnNpc3RlbnRseSB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5Ci0gICAgKiBbVEhSSUZULTI1MDVdIC0gZ286IHN0cnVjdCBzaG91bGQgYWx3YXlzIGJlIGEgcG9pbnRlciB0byBhdm9pZCBjb3B5aW5nIG9mIHBvdGVudGlhbGx5IHNpemUtdW5ib3VuZGVkIHN0cnVjdHMKLSAgICAqIFtUSFJJRlQtMjUxNV0gLSBUTFMgTWV0aG9kIGVycm9yIGR1cmluZyBtYWtlCi0gICAgKiBbVEhSSUZULTI1MDNdIC0gQysrOiBGaXggbmFtZSBjb2xsaXNpb24gd2hlbiBhIHN0cnVjdCBoYXMgYSBtZW1iZXIgbmFtZWQgInZhbCIKLSAgICAqIFtUSFJJRlQtMjQ3N10gLSB0aHJpZnQgLS1oZWxwIHRleHQgd2l0aCBtaXNwbGFjZWQgY29tbWEKLSAgICAqIFtUSFJJRlQtMjQ5Ml0gLSB0ZXN0L2NwcCBkb2VzIG5vdCBjb21waWxlIG9uIG1hYwotICAgICogW1RIUklGVC0yNTAwXSAtIHNlbmRpbmcgcmFuZG9tIGRhdGEgY3Jhc2hlcyB0aHJpZnQoZ29sYW5nKSBzZXJ2aWNlCi0gICAgKiBbVEhSSUZULTI0NzVdIC0gY19nbGliOiBidWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgZnVuY3Rpb24gcmV0dXJuIGFsd2F5cyBUUlVFLgotICAgICogW1RIUklGVC0yNDk1XSAtIEphdmFTY3JpcHQvTm9kZSBzdHJpbmcgY29uc3RhbnRzIGxhY2sgcHJvcGVyIGVzY2FwaW5nCi0gICAgKiBbVEhSSUZULTI0OTFdIC0gdW5hYmxlIHRvIGltcG9ydCBnZW5lcmF0ZWQgVGhyaWZ0VGVzdCBzZXJ2aWNlCi0gICAgKiBbVEhSSUZULTI0OTBdIC0gY19nbGliOiBpZiBmYWlsIHRvIHJlYWQgYSBleGNlcHRpb24gZnJvbSBzZXJ2ZXIsIGNsaWVudCBtYXkgYmUgb2NjdXJyZWQgZG91YmxlIGZyZWUKLSAgICAqIFtUSFJJRlQtMjQ3MF0gLSBUSHR0cEhhbmRsZXIgc3dhbGxvd3MgZXhjZXB0aW9ucyBmcm9tIHByb2Nlc3NvcgotICAgICogW1RIUklGVC0yNTMzXSAtIEJvb3N0IHZlcnNpb24gaW4gcmVxdWlyZW1lbnRzIHNob3VsZCBiZSB1cGRhdGVkCi0gICAgKiBbVEhSSUZULTI1MzJdIC0gSmF2YSB2ZXJzaW9uIGluIGluc3RhbGxhdGlvbiByZXF1aXJlbWVudHMgc2hvdWxkIGJlIHVwZGF0ZWQKLSAgICAqIFtUSFJJRlQtMjUyOV0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgc3BsaXQgIFRjcCBkYXRhIGJ1ZyBpbiBub2RlSnMKLSAgICAqIFtUSFJJRlQtMjUzN10gLSBQYXRoIGZvciAiZ28gZ2V0IiBkb2VzIG5vdCB3b3JrIChwdWxsIHJlcXVlc3QgMTE1KQotICAgICogW1RIUklGVC0yNDQzXSAtIE5vZGUgZmFpbHMgY3Jvc3MgbGFuZyB0ZXN0cwotICAgICogW1RIUklGVC0yNDM3XSAtIEF1dGhvciBmaWVsZHMgaW4gUHl0aG9uIHNldHVwLnB5IG11c3QgYmUgc3RyaW5ncyBub3QgbGlzdHMuCi0gICAgKiBbVEhSSUZULTI0MzVdIC0gSmF2YSBjb21waWxlciBkb2Vzbid0IGxpa2Ugc3RydWN0IG1lbWJlciBuYW1lcyB0aGF0IGFyZSBpZGVudGljYWwgdG8gYW4gZXhpc3RpbmcgZW51bSBvciBzdHJ1Y3QgdHlwZQotICAgICogW1RIUklGVC0yNDM0XSAtIE1pc3NpbmcgbmFtZXNwYWNlIGltcG9ydCBmb3IgcGhwIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbgotICAgICogW1RIUklGVC0yNDMyXSAtIEZsYWt5IHBhcmFsbGVsIGJ1aWxkCi0gICAgKiBbVEhSSUZULTI0MzBdIC0gQ3Jhc2ggZHVyaW5nIFRUaHJlYWRQb29sU2VydmVyIHNodXRkb3duCi0gICAgKiBbVEhSSUZULTY2N10gLSBQZXJpb2Qgc2hvdWxkIG5vdCBiZSBhbGxvd2VkIGluIGlkZW50aWZpZXIgbmFtZXMKLSAgICAqIFtUSFJJRlQtMTIxMl0gLSBNZW1iZXJzIGNhcGl0YWwgY2FzZSBjb25mbGljdAotICAgICogW1RIUklGVC0yNTg0XSAtIEVycm9yIGhhbmRsZXIgbm90IGxpc3RlbmVkIG9uIGphdmFzY3JpcHQgY2xpZW50Ci0gICAgKiBbVEhSSUZULTIyOTRdIC0gSW5jb3JyZWN0IE1ha2VmaWxlIGdlbmVyYXRpb24KLSAgICAqIFtUSFJJRlQtMjYwMV0gLSBGaXggdmFncmFudCB0byB3b3JrIGFnYWluIGZvciBidWlsZHMgYWdhaW4KLSAgICAqIFtUSFJJRlQtMjA5Ml0gLSBUTm9uYmxvY2tpbmcgc2VydmVyIHNob3VsZCByZWxlYXNlIGhhbmRsZXIgYXMgc29vbiBhcyBjb25uZWN0aW9uIGNsb3NlcwotICAgICogW1RIUklGVC0yNTU3XSAtIENTMDU0MiBtZW1iZXIgbmFtZXMgY2Fubm90IGJlIHRoZSBzYW1lIGFzIHRoZWlyIGVuY2xvc2luZyB0eXBlCi0gICAgKiBbVEhSSUZULTI2MDVdIC0gVFNvY2tldCB3YXJuaW5nIG9uIGdjYyA0LjguMwotICAgICogW1RIUklGVC0yNjA3XSAtIFRocmVhZE1hbmFnZXIuY3BwIHdhcm5pbmcgb24gY2xhbmcrKyAzLjQKLSAgICAqIFtUSFJJRlQtMTk5OF0gLSBUQ29tcGFjdFByb3RvY29sLnRjYyAtIG9uZSBtb3JlIHdhcm5pbmcgb24gVmlzdWFsIDIwMTAKLSAgICAqIFtUSFJJRlQtMjYxMF0gLSBNU1ZDIHdhcm5pbmcgaW4gVFNvY2tldC5jcHAKLSAgICAqIFtUSFJJRlQtMjYxNF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIHdhcm5pbmdzIG9uIE1TVkMKLSAgICAqIFtUSFJJRlQtMjYwOF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIHdhcm5pbmdzIG9uIGNsYW5nIDMuNAotICAgICogW1RIUklGVC0yNjA2XSAtIFRocmVhZE1hbmFnZXIuaCB3YXJuaW5nIGluIGNsYW5nKysgMy40Ci0gICAgKiBbVEhSSUZULTI2MDldIC0gVEZpbGVUcmFuc3BvcnQuaCB1bnVzZWQgZmllbGQgd2FybmluZyAoY2xhbmcgMy40KQotICAgICogW1RIUklGVC0yNDE2XSAtIENhbm5vdCB1c2UgVENvbXBhY3RQcm90b2NvbCB3aXRoIE1TVkMKLSAgICAqIFtUSFJJRlQtMTgwM10gLSBSdWJ5IFRocmlmdCAwLjkuMCB0cmllcyB0byBlbmNvZGUgVVVJRCB0byBVVEY4IGFuZCBjcmFzaGVzCi0gICAgKiBbVEhSSUZULTIzODVdIC0gUHJvYmxlbSB3aXRoIGdldGhvc3RieW5hbWUyIGR1cmluZyBtYWtlIGNoZWNrCi0gICAgKiBbVEhSSUZULTIyNjJdIC0gdGhyaWZ0IHNlcnZlciAnTXV0YXRlUm93JyBvcGVyYXRpb24gZ2l2ZXMgbm8gaW5kaWNhdGlvbiBvZiBzdWNjZXNzIC8gZmFpbHVyZQotICAgICogW1RIUklGVC0yMDQ4XSAtIFByZWZlciBib29sZWFuIGNvbnRleHQgdG8gbnVsbHB0cl90IGNvbnZlcnNpb24KLSAgICAqIFtUSFJJRlQtMjUyOF0gLSBUaHJpZnQgRXJsYW5nIExpYnJhcnk6IE11bHRpcGxlIHRocmlmdCBhcHBsaWNhdGlvbnMgaW4gb25lIGJ1bmRsZQotICAgICogW1RIUklGVC0xOTk5XSAtIHdhcm5pbmcgb24gZ2NjIDQuNyB3aGlsZSBjb21waWxpbmcgQm9vc3RNdXRleC5jcHAKLSAgICAqIFtUSFJJRlQtMjEwNF0gLSBTdHJ1Y3RzIGxvc2UgYmluYXJ5IGRhdGEgd2hlbiB0cmFuc2ZlcnJlZCBmcm9tIHNlcnZlciB0byBjbGllbnQgaW4gSmF2YQotICAgICogW1RIUklGVC0yMTg0XSAtIHVuZGVmaW5lZCBtZXRob2QgcnNwZWNfdmVyaWZ5IGZvciBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydAotICAgICogW1RIUklGVC0yMzUxXSAtIFBIUCBUQ29tcGFjdFByb3RvY29sIGhhcyBmYWlscyB0byBkZWNvZGUgbWVzc2FnZXMKLSAgICAqIFtUSFJJRlQtMjAxNl0gLSBSZXNvdXJjZSBMZWFrIGluIHRocmlmdCBzdHJ1Y3QgdW5kZXIgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Z1bmN0aW9uLmgKLSAgICAqIFtUSFJJRlQtMjI3M10gLSBQbGVhc2UgZGVsZXRlIG9sZCByZWxlYXNlcyBmcm9tIG1pcnJvcmluZyBzeXN0ZW0KLSAgICAqIFtUSFJJRlQtMjI3MF0gLSBGYXVsdHkgbGlicmFyeSB2ZXJzaW9uIG51bWJlcmluZyBhdCBidWlsZCBvciBkb2N1bWVudGF0aW9uCi0gICAgKiBbVEhSSUZULTIyMDNdIC0gVGVzdHMga2VlcGluZyBmYWlsaW5nIG9uIEplbmtpbnMgYW5kIFRyYXZpcyBDSQotICAgICogW1RIUklGVC0yMzk5XSAtIHRocmlmdC5lbDogcmVjb2duaXplICIvLyItc3R5bGUgY29tbWVudHMgaW4gZW1hY3MgdGhyaWZ0LW1vZGUKLSAgICAqIFtUSFJJRlQtMjU4Ml0gLSAiRmlsZVRyYW5zcG9ydCBlcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIHRyeWluZyB0byB1c2UgSmF2YSdzIFRGaWxlVHJhbnNwb3J0Ci0gICAgKiBbVEhSSUZULTE2ODJdIC0gTXVsdGlwbGUgdGhyZWFkIGNhbGxpbmcgYSBTZXJ2aWNlIGZ1bmN0aW9uIHVuc2FmZWx5IGNhdXNlcyBtZXNzYWdlIGNvcnJ1cHRpb24gYW5kIHRlcm1pbmF0ZXMgd2l0aCBCcm9rZW4gUGlwZQotICAgICogW1RIUklGVC0yMzU3XSAtIHJlY3Vyc2Ugb3B0aW9uIGhhcyBubyBlZmZlY3Qgd2hlbiBnZW5lcmF0aW5nIHBocAotICAgICogW1RIUklGVC0yMjQ4XSAtIEdvIGdlbmVyYXRvciBkb2Vzbid0IGRlYWwgd2VsbCB3aXRoIG1hcCBrZXlzIG9mIHR5cGUgYmluYXJ5Ci0gICAgKiBbVEhSSUZULTI0MjZdIC0gY2xhcmlmeSBJUCByaWdodHMgYW5kIGNvbnRyaWJ1dGlvbnMgZnJvbSBmYnRocmlmdAotICAgICogW1RIUklGVC0yMDQxXSAtIFROb25ibG9ja2luZyBzZXJ2ZXIgY29tcGlsYXRpb24gb24gd2luZG93cyAoQVJJVEhNRVRJQ19SSUdIVF9TSElGVCkKLSAgICAqIFtUSFJJRlQtMjQwMF0gLSB0aHJpZnQuZWw6IHJlY29nbml6ZSAiLy8iLXN0eWxlIGNvbW1lbnRzIGluIGVtYWNzIHRocmlmdC1tb2RlCi0gICAgKiBbVEhSSUZULTE3MTddIC0gRml4IGRlYiBidWlsZCBpbiBqZW5raW5zCi0gICAgKiBbVEhSSUZULTIyNjZdIC0gVGhyZWFkTWFuYWdlci5oOjI0OjEwOiBmYXRhbCBlcnJvcjogJ3RyMS9mdW5jdGlvbmFsJyBmaWxlIG5vdCBmb3VuZCBvbiBNYWMgMTAuOSAoTWF2ZXJpY2tzKQotICAgICogW1RIUklGVC0xMzAwXSAtIFRlc3QgZmFpbHVyZXMgd2l0aCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopCi0gICAgKiBbVEhSSUZULTI0ODddIC0gVHV0b3JpYWwgcmVxdWlyZXMgdHdvIElETCBmaWxlcyBidXQgb25seSBvbmUgaXMgbGlua2VkIGZyb20gdGhlIFRocmlmdCB3ZWIgc2l0ZQotICAgICogW1RIUklGVC0yMzI5XSAtIG1pc3NpbmcgcmVsZWFzZSB0YWdzIHdpdGhpbiBnaXQKLSAgICAqIFtUSFJJRlQtMjMwNl0gLSBjb25jdXJlbnQgY2xpZW50IGNhbGxzIHdpdGggbm9kZWpzCi0gICAgKiBbVEhSSUZULTIyMjJdIC0gcnVieSBnZW0gY2Fubm90IGJlIGNvbXBpbGVkIG9uIE9TIFggbWF2ZXJpY2tzCi0gICAgKiBbVEhSSUZULTIzODFdIC0gY29kZSB3aGljaCBnZW5lcmF0ZWQgYnkgdGhyaWZ0Mi9oYmFzZS50aHJpZnQgY29tcGlsZSBlcnJvcgotICAgICogW1RIUklGVC0yMzkwXSAtIG5vIGNsb3NlIGV2ZW50IHdoZW4gY29ubmVjdGlvbiBsb3N0Ci0gICAgKiBbVEhSSUZULTIxNDZdIC0gVW5hYmxlIHRvIHBhc3MgbXVsdGlwbGUgIi0tZ2VuIiBvcHRpb25zIHRvIHRoZSB0aHJpZnQgY29tcGlsZXIKLSAgICAqIFtUSFJJRlQtMjQzOF0gLSBVbmV4cGVjdGVkIHJlYWRGaWVsZEVuZCBjYWxsIGNhdXNlcyBKU09OIFBhcnNpbmcgZXJyb3JzCi0gICAgKiBbVEhSSUZULTI0OThdIC0gRXJyb3IgbWVzc2FnZSAiSW52YWxpZCBtZXRob2QgbmFtZSIgd2hpbGUgdHJ5aW5nIHRvIGNhbGwgSEJhc2UgVGhyaWZ0IEFQSQotICAgICogW1RIUklGVC04NDFdIC0gQnVpbGQgY3J1ZnQKLSAgICAqIFtUSFJJRlQtMjU3MF0gLSBXcm9uZyBVUkwgZ2l2ZW4gaW4gaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2RldmVsb3BlcnMKLSAgICAqIFtUSFJJRlQtMjYwNF0gLSBGaXggZGViaWFuIHBhY2thZ2luZwotICAgICogW1RIUklGVC0yNjE4XSAtIFVuaWdub3JlIC9hY2xvY2FsIGZpbGVzIHJlcXVpcmVkIGZvciBidWlsZAotICAgICogW1RIUklGVC0yNTYyXSAtIC4vY29uZmlndXJlIGNyZWF0ZSBNYWtlRmlsZSBpbiBsaWIvZCB3aXRoIGVycm9ycwotICAgICogW1RIUklGVC0yNTkzXSAtIFVuYWJsZSB0byBidWlsZCB0aHJpZnQgb24gdWJ1bnR1LTEyLjA0IChQcmVjaXNlKQotICAgICogW1RIUklGVC0yNDYxXSAtIENhbid0IGluc3RhbGwgdGhyaWZ0LTAuOC4wIG9uIE9TIFggMTAuOS4yCi0gICAgKiBbVEhSSUZULTI2MDJdIC0gRml4IG1pc3NpbmcgZGlzdCBmaWxlcwotICAgICogW1RIUklGVC0yNjIwXSAtIEZpeCBweXRob24gcGFja2FnaW5nCi0gICAgKiBbVEhSSUZULTI1NDVdIC0gVGVzdCBDUFAgZmFpbHMgdG8gYnVpbGQgKHBvc3NpYmx5IHR5cG8pCi0KLSMjIERvY3VtZW50YXRpb24KLSAgICAqIFtUSFJJRlQtMjE1NV0gLSBBZGRpbmcgb25lIGxpbmVyIGd1aWRlIHRvIHJlbmFtZSB0aGUgdmVyc2lvbi5oLmluIGFuZCByZW5hbWUgdGhyaWZ0eS5jYy5oCi0gICAgKiBbVEhSSUZULTE5OTFdIC0gQWRkIGV4Y2VwdGlvbnMgdG8gZXhhbXBsZXMKLSAgICAqIFtUSFJJRlQtMjMzNF0gLSBhZGQgYSB0dXRvcmlhbCBmb3Igbm9kZSBKUwotICAgICogW1RIUklGVC0yMzkyXSAtIEFjdGlvbnNjcmlwdCB0dXRvcmlhbAotICAgICogW1RIUklGVC0yMzgzXSAtIGNvbnRyaWI6IHNhbXBsZSBmb3IgY29ubmVjdGluZyBUaHJpZnQgd2l0aCBSZWJ1cwotICAgICogW1RIUklGVC0yMzgyXSAtIGNvbnRyaWI6IHNhbXBsZSBmb3IgY29ubmVjdGluZyBUaHJpZnQgd2l0aCBTVE9NUAotCi0jIyBJbXByb3ZlbWVudAotICAgICogW1RIUklGVC0xNDU3XSAtIENhcGFjaXR5IG9mIFRmcmFtZWRUcmFuc3BvcnQgd3JpdGUgYnVmZmVyIGlzIG5ldmVyIHJlc2V0Ci0gICAgKiBbVEhSSUZULTExMzVdIC0gTm9kZS5qcyB0dXRvcmlhbAotICAgICogW1RIUklGVC0xMzcxXSAtIFNvY2tldCB0aW1lb3V0cyAoU09fUkNWVElNRU8gYW5kIFNPX1NORFRJTUVPKSBub3Qgc3VwcG9ydGVkIG9uIFNvbGFyaXMKLSAgICAqIFtUSFJJRlQtMjE0Ml0gLSBNaW5vciB0d2Vha3MgdG8gdGhyaWZ0LmVsIGZvciBiZXR0ZXIgZW1hY3MgcGFja2FnZSBjb21wYXRpYmlsaXR5Ci0gICAgKiBbVEhSSUZULTIyNjhdIC0gTW9kaWZ5IFRTYXNsVHJhbnNwb3J0IHRvIGlnbm9yZSBUQ1AgaGVhbHRoIGNoZWNrcyBmcm9tIGxvYWRiYWxhbmNlcnMKLSAgICAqIFtUSFJJRlQtMjI2NF0gLSBHaXRIdWIgcGFnZSBpbmNvcnJlY3RseSBzdGF0ZXMgdGhhdCBUaHJpZnQgaXMgc3RpbGwgaW5jdWJhdGluZwotICAgICogW1RIUklGVC0yMjYzXSAtIEFsd2F5cyBnZW5lcmF0ZSBnb29kIGhhc2hDb2RlIGZvciBKYXZhCi0gICAgKiBbVEhSSUZULTIyMzNdIC0gSmF2YSBjb21waWxlciBzaG91bGQgZGVmZW5zaXZlbHkgY29weSBpdHMgYmluYXJ5IGlucHV0cwotICAgICogW1RIUklGVC0yMjM5XSAtIEFkZHJlc3MgRmluZEJ1Z3MgZXJyb3JzCi0gICAgKiBbVEhSSUZULTIyNDldIC0gQWRkIFNNUCBCdWlsZCBvcHRpb24gdG8gdGhyaWZ0LnNwZWMgKGFuZCB0aHJlZSBjb25maWcgZGVmaW5lcykKLSAgICAqIFtUSFJJRlQtMjI1NF0gLSBFeGNlcHRpb25zIGdlbmVyYXRlZCBieSBHbyBjb21waWxlciBzaG91bGQgaW1wbGVtZW50IGVycm9yIGludGVyZmFjZQotICAgICogW1RIUklGVC0yMjYwXSAtIFRocmlmdCBpbXBvc2VzIHVubmVlZGVkIGRlcGVuZGVuY3kgb24gY29tbW9ucy1sYW5nMwotICAgICogW1RIUklGVC0yMjU4XSAtIEFkZCBUTFMgdjEuMS8xLjIgc3VwcG9ydCB0byBUU1NMU29ja2V0LmNwcAotICAgICogW1RIUklGVC0yMjA1XSAtIE5vZGUuanMgVGVzdCBTZXJ2ZXIgdG8gc3VwcG9ydCB0ZXN0LmpzIEphdmFTY3JpcHQgQnJvd3NlciB0ZXN0IGFuZCBzdW5kcnkgZml4ZXMKLSAgICAqIFtUSFJJRlQtMjIwNF0gLSBTU0wgY2xpZW50IGZvciB0aGUgY29jb2EgY2xpZW50Ci0gICAgKiBbVEhSSUZULTIxNzJdIC0gSmF2YSBjb21waWxlciBhbGxvY2F0ZXMgb3B0aW9uYWxzIGFycmF5IGZvciBldmVyeSBzdHJ1Y3Qgd2l0aCBhbiBvcHRpb25hbCBmaWVsZAotICAgICogW1RIUklGVC0yMTg1XSAtIHVzZSBjYWJhbCBpbnN0ZWFkIG9mIHJ1bmhhc2tlbGwgaW4gaGFza2VsbCBsaWJyYXJ5Ci0gICAgKiBbVEhSSUZULTE5MjZdIC0gUEhQIENvbnN0YW50IEdlbmVyYXRpb24gUmVmYWN0b3JpbmcKLSAgICAqIFtUSFJJRlQtMjAyOV0gLSBQb3J0IEMrKyB0ZXN0cyB0byBXaW5kb3dzCi0gICAgKiBbVEhSSUZULTIwNTRdIC0gVFNpbXBsZUZpbGVUcmFuc3BvcnQgLSBKYXZhIExpYiBoYXMgbm8gc3RyYWlnaHQgZm9yd2FyZCBUVHJhbnNwb3J0IGJhc2VkIGZpbGUgdHJhbnNwb3J0Ci0gICAgKiBbVEhSSUZULTIwNDBdIC0gInVuaW5pdGlhbGl6ZWQgdmFyaWFibGUiIHdhcm5pbmdzIG9uIE1TVkMvd2luZG93cwotICAgICogW1RIUklGVC0yMDM0XSAtIEdpdmUgZGV2ZWxvcGVycycgQysrIGNvZGUgZGlyZWN0IGFjY2VzcyB0byBzb2NrZXQgRkRzIG9uIHNlcnZlciBzaWRlCi0gICAgKiBbVEhSSUZULTIwOTVdIC0gVXNlIHByaW50IGZ1bmN0aW9uIGZvciBQeXRob24gMyBjb21wYXRpYmxpdHkKLSAgICAqIFtUSFJJRlQtMTg2OF0gLSBNYWtlIHRoZSBUUEMgYmFja2xvZyBjb25maWd1cmFibGUgaW4gdGhlIEphdmEgc2VydmVycwotICAgICogW1RIUklGVC0xODEzXSAtIEFkZCBAR2VuZXJhdGVkIGFubm90YXRpb24gdG8gZ2VuZXJhdGVkIGNsYXNzZXMKLSAgICAqIFtUSFJJRlQtMTgxNV0gLSBDb2RlIGdlbmVyYXRvcnMgbGluZSBidWZmZXIgb3V0cHV0Ci0gICAgKiBbVEhSSUZULTIzMDVdIC0gVEZyYW1lZFRyYW5zcG9ydCBlbXB0eSBjb25zdHJ1Y3RvciBzaG91bGQgcHJvYmFibHkgYmUgcHJpdmF0ZQotICAgICogW1RIUklGVC0yMzA0XSAtIE1vdmUgY2xpZW50IGFzc2lnbm1lbnRzIGZyb20gY29uc3RydXRvciBpbiBtZXRob2QKLSAgICAqIFtUSFJJRlQtMjMwOV0gLSBSdWJ5IChnZW0pICYgUEhQIFJQTSBzdWJwYWNrYWdlcwotICAgICogW1RIUklGVC0yMzE4XSAtIHBlcmw6IGRlcGVuZGVuY3kgQ2xhc3M6OkFjY2Vzc29yIG5vdCBjaGVja2VkCi0gICAgKiBbVEhSSUZULTIzMTddIC0gZXhjbHVkZSB0dXRvcmlhbCBmcm9tIGJ1aWxkCi0gICAgKiBbVEhSSUZULTIzMjBdIC0gUHJvZ3JhbSBsZXZlbCBkb2N0ZXh0IGRvZXMgbm90IGdldCBhdHRhY2hlZCBieSBwYXJzZXIKLSAgICAqIFtUSFJJRlQtMjM0OV0gLSBHb2xhbmcgLSBpbXByb3ZlIHR1dG9yaWFsCi0gICAgKiBbVEhSSUZULTIzNDhdIC0gUEhQIEdlbmVyYXRvcjogYWRkIGFycmF5IHR5cGVoaW50IHRvIGZ1bmN0aW9ucwotICAgICogW1RIUklGVC0yMzQ0XSAtIGNvbmZpZ3VyZS5hYzogY29tcGlsZXItb25seSBvcHRpb24KLSAgICAqIFtUSFJJRlQtMjM0M10gLSBHb2xhbmcgLSBSZXR1cm4gYSBzaW5nbGUgZXJyb3IgZm9yIGFsbCBleGNlcHRpb25zIGluc3RlYWQgb2YgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcwotICAgICogW1RIUklGVC0yMzQxXSAtIEVuYWJsZSBnZW5lcmF0aW9uIG9mIERlbHBoaSBYTUxEb2MgY29tbWVudHMgKGEuay5hLiAiSGVscCBJbnNpZ2h0IikKLSAgICAqIFtUSFJJRlQtMjM1NV0gLSBBZGQgU1NMIGFuZCBXZWIgU29ja2V0IFN1cHBvcnQgdG8gTm9kZSBhbmQgSmF2YVNjcmlwdAotICAgICogW1RIUklGVC0yMzUwXSAtIEFkZCBhc3luYyBjYWxscyB0byBub3JtYWwgSmF2YVNjcmlwdAotICAgICogW1RIUklGVC0yMzMwXSAtIEdlbmVyYXRlIFBIUERvYyBjb21tZW50cwotICAgICogW1RIUklGVC0yMzMyXSAtIFJQTUJVSUxEOiBydW4gYm9vdHN0cmFwIChpZiBuZWVkZWQpCi0gICAgKiBbVEhSSUZULTIzOTFdIC0gc2ltcGxlIHNvY2tldCB0cmFuc3BvcnQgZm9yIGFjdGlvbnNjcmlwdCAzLjAKLSAgICAqIFtUSFJJRlQtMjM3Nl0gLSBub2RlanM6IGFsbG93IFByb21pc2Ugc3R5bGUgY2FsbHMgZm9yIGNsaWVudCBhbmQgc2VydmVyCi0gICAgKiBbVEhSSUZULTIzNjldIC0gQWRkIHNzbCBzdXBwb3J0IGZvciBub2RlanMgaW1wbGVtZW50YXRpb24KLSAgICAqIFtUSFJJRlQtMjQwMV0gLSBIYXNrZWxsIHR1dG9yaWFsIGNvbXBpbGVzCi0gICAgKiBbVEhSSUZULTI0MTddIC0gQyMgVW5pb24gY2xhc3NlcyBhcmUgbm90IHBhcnRpYWwKLSAgICAqIFtUSFJJRlQtMjQxNV0gLSBOYW1lZCBwaXBlcyBzZXJ2ZXIgcGVyZm9ybWFuY2UgJiBtZXNzYWdlIG1vZGUKLSAgICAqIFtUSFJJRlQtMjQwNF0gLSBlbWl0IHdhcm5pbmcgb24gKHR5cGljYWxseSBpbmVmZmljaWVudCkgbGlzdDxieXRlPgotICAgICogW1RIUklGVC0yMzk4XSAtIEltcHJvdmUgTm9kZSBTZXJ2ZXIgTGlicmFyeQotICAgICogW1RIUklGVC0yMzk3XSAtIEFkZCBDT1JTIGFuZCBDU1Agc3VwcG9ydCBmb3IgSmF2YVNjcmlwdCBhbmQgTm9kZS5qcyBsaWJyYXJpZXMKLSAgICAqIFtUSFJJRlQtMjQwN10gLSB1c2UgbWFya2Rvd24gKHJlbmFtZSBSRUFETUUgPT4gUkVBRE1FLm1kKQotICAgICogW1RIUklGVC0yMzAwXSAtIEQgY29uZmlndXJlIGluZm8gb3V0cHV0IHNob3VsZCBmb2xsb3cgc2FtZSBmb3JtYXQgYXMgb3RoZXIgbGFuZ3VhZ2VzCi0gICAgKiBbVEhSSUZULTI1NzldIC0gV2luZG93cyBDRSBzdXBwb3J0Ci0gICAgKiBbVEhSSUZULTI1NzRdIC0gQ29tcGlsZXIgb3B0aW9uIHRvIGdlbmVyYXRlIG5hbWVzcGFjZSBkaXJlY3RvcmllcyBmb3IgUnVieQotICAgICogW1RIUklGVC0yNTcxXSAtIFNpbXBsaWZ5IGNyb3NzIGNvbXBpbGF0aW9uIHVzaW5nIENNYWtlCi0gICAgKiBbVEhSSUZULTI1NjldIC0gSW50cm9kdWNlIGZpbGUgdG8gc3BlY2lmeSB0aGlyZCBwYXJ0eSBsaWJyYXJ5IGxvY2F0aW9ucyBvbiBXaW5kb3dzCi0gICAgKiBbVEhSSUZULTI1NjhdIC0gSW1wbGVtZW50IG93biBjZXJ0aWZpY2F0ZSBoYW5kbGVyCi0gICAgKiBbVEhSSUZULTI1NTJdIC0gZWxpbWluYXRlIHdhcm5pbmcgZnJvbSBjb25maWd1cmUuYWMKLSAgICAqIFtUSFJJRlQtMjU0OV0gLSBHZW5lcmF0ZSBqc29uIHRhZyBmb3Igc3RydWN0IG1lbWJlcnMuIHVzZSBnby50YWcgYW5ub3RhdGlvbiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBnZW5lcmF0ZWQgdGFnLgotICAgICogW1RIUklGVC0yNTQ0XSAtIEFkZCBzdXBwb3J0IGZvciBzb2NrZXQgdHJhbnNwb3J0IGZvciBjIyBsaWJyYXJ5IHdoZW4gdXNpbmcgV2luZG93cyBQaG9uZSBwcm9qZWN0cwotICAgICogW1RIUklGVC0yNDUzXSAtIGhhc2tlbGwgdHV0b3JpYWw6IGZpeCB1cCBkaXZpc2lvbiBieSAwIGV4YW1wbGUKLSAgICAqIFtUSFJJRlQtMjQ0OV0gLSBFbmhhbmNlIHR5cGVkZWYgc3RydWN0dXJlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZm9yd2FyZHMgYW5kIHJlYWwgdHlwZWRlZnMKLSAgICAqIFtUSFJJRlQtMjQ0Nl0gLSBUaGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHNlcnZlciBzdHJlYW0gZXJyb3JzCi0gICAgKiBbVEhSSUZULTI0NTVdIC0gQWxsb3cgY2xpZW50IGNlcnRpZmljYXRlcyB0byBiZSB1c2VkIHdpdGggVEh0dHBDbGllbnQKLSAgICAqIFtUSFJJRlQtMjUxMV0gLSBOb2RlLmpzIG5lZWRzIHRoZSBjb21wYWN0IHByb3RvY29sCi0gICAgKiBbVEhSSUZULTI0OTNdIC0gTm9kZS5qcyBsaWIgbmVlZHMgSFRUUCBjbGllbnQKLSAgICAqIFtUSFJJRlQtMjUwMl0gLSBPcHRpbWl6ZSBnbyBpbXBsZW1lbnRhdGlvbnMgb2YgYmluYXJ5IGFuZCBjb21wYWN0IHByb3RvY29scyBmb3Igc3BlZWQKLSAgICAqIFtUSFJJRlQtMjQ5NF0gLSBBZGQgZW51bSB0b1N0cmluZyBoZWxwZXIgZnVuY3Rpb24gaW4gY19nbGliCi0gICAgKiBbVEhSSUZULTI0NzFdIC0gTWFrZSBjcHAucmVmIGFubm90YXRpb24gbGFuZ3VhZ2UgYWdub3N0aWMKLSAgICAqIFtUSFJJRlQtMjQ5N10gLSBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgdGVzdC9nbywgYWxzbyBzZXZlcmFsIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMKLSAgICAqIFtUSFJJRlQtMjUzNV0gLSBUSlNPTlByb3RvY29sIHdoZW4gc2VyaWFsaXplZCB5aWVsZHMgVEZpZWxkIGlkcyByYXRoZXIgdGhhbiBuYW1lcwotICAgICogW1RIUklGVC0yMjIwXSAtIEFkZCBhIG5ldyBzdHJ1Y3Qgc3RydWN0dj8KLSAgICAqIFtUSFJJRlQtMTM1Ml0gLSBUaHJpZnQgc2VydmVyCi0gICAgKiBbVEhSSUZULTk4OV0gLSBQdXNoIGJvb3N0IG00IG1hY3JvcyB1cHN0cmVhbQotICAgICogW1RIUklGVC0xMzQ5XSAtIFJlbW92ZSB1bm5lY2Vzc2FyeSBwcmludCBvdXRzCi0gICAgKiBbVEhSSUZULTI0OTZdIC0gc2VydmVyIGFuZCBjbGllbnQgZm9yIHRlc3QvZ28sIGFsc28gc2V2ZXJhbCBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzCi0gICAgKiBbVEhSSUZULTExMTRdIC0gTWF2ZW4gcHVibGlzaCBzaG91bGRuJ3QgcmVxdWlyZSBwYXNzd29yZHMgaGFyZGNvZGVkIGluIHNldHRpbmdzLnhtbAotICAgICogW1RIUklGVC0yMDQzXSAtIHZpc3VhbCAyMDEwIHdhcm5pbmdzIC0gdW5yZWFjaGFibGUgY29kZQotICAgICogW1RIUklGVC0xNjgzXSAtIEltcGxlbWVudCBhbHRlcm5hdGl2ZXMgdG8gSmF2YXNjcmlwdCBDbGllbnQgc2lkZSBUcmFuc3BvcnQgcHJvdG9jb2wsIGp1c3QgYXMgTlBBUEkgYW5kIFdlYlNvY2tldC4KLSAgICAqIFtUSFJJRlQtMTc0Nl0gLSBwcm92aWRlIGEgU1BEWCBmaWxlCi0gICAgKiBbVEhSSUZULTE3NzJdIC0gU2VyaWFsaXphdGlvbiBkb2VzIG5vdCBjaGVjayB0eXBlcyBvZiBlbWJlZGRlZCBzdHJ1Y3R1cmVzLgotICAgICogW1RIUklGVC0yMzg3XSAtIG5vZGVqczogZXh0ZXJuYWwgaW1wb3J0cyBzaG91bGQgYmUgY2VudHJhbGl6ZWQgaW4gaW5kZXguanMKLSAgICAqIFtUSFJJRlQtMjAzN10gLSBNb3JlIGdlbmVyYWwgbWFjcm8gVEhSSUZUX1VOVVNFRF9WQVJJQUJMRQotCi0jIyBOZXcgRmVhdHVyZQotICAgICogW1RIUklGVC0xMDEyXSAtIFRyYW5zcG9ydCBmb3IgRGF0YUlucHV0IERhdGFPdXRwdXQgaW50ZXJmYWNlCi0gICAgKiBbVEhSSUZULTIyNTZdIC0gVXNpbmcgYysrMTEvYysrMHggc3RkIGxpYnJhcnkgIHJlcGxhY2UgYm9vc3QgbGlicmFyeQotICAgICogW1RIUklGVC0yMjUwXSAtIEpTT04gYW5kIE1lbW9yeUJ1ZmZlciBmb3IgSmF2YU1FCi0gICAgKiBbVEhSSUZULTIxMTRdIC0gUHl0aG9uIFNlcnZpY2UgUmVtb3RlIFNTTCBPcHRpb24KLSAgICAqIFtUSFJJRlQtMTcxOV0gLSBTQVNMIGNsaWVudCBzdXBwb3J0IGZvciBQeXRob24KLSAgICAqIFtUSFJJRlQtMTg5NF0gLSBUaHJpZnQgbXVsdGktdGhyZWFkZWQgYXN5bmMgSmF2YSBTZXJ2ZXIgdXNpbmcgSmF2YSA3IEFzeW5jaHJvbm91c0NoYW5uZWxHcm91cAotICAgICogW1RIUklGVC0xODkzXSAtIEhUVFAvSlNPTiBzZXJ2ZXIvY2xpZW50IGZvciBub2RlIGpzCi0gICAgKiBbVEhSSUZULTIzNDddIC0gQyMgVExTIFRyYW5zcG9ydCBiYXNlZCBvbiBUSFJJRlQtMTgxCi0gICAgKiBbVEhSSUZULTIzNzddIC0gQWxsb3cgYWRkaXRpb24gb2YgY3VzdG9tIEhUVFAgSGVhZGVycyB0byBhbiBIVFRQIFRyYW5zcG9ydAotICAgICogW1RIUklGVC0yNDA4XSAtIE5hbWVkIFBpcGUgVHJhbnNwb3J0IE9wdGlvbiBmb3IgQyMKLSAgICAqIFtUSFJJRlQtMjU3Ml0gLSBBZGQgc3RyaW5nL2NvbGxlY3Rpb24gbGVuZ3RoIGxpbWl0IGNoZWNrcyAoZnJvbSBDKyspIHRvIGphdmEgcHJvdG9jb2wgcmVhZGVycwotICAgICogW1RIUklGVC0yNDY5XSAtICJqYXZhOmZ1bGxjYW1lbCIgb3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkgY2FtZWwtY2FzZSB1bmRlcnNjb3JlZCBhdHRyaWJ1dGUgbmFtZXMKLSAgICAqIFtUSFJJRlQtNzk1XSAtIEltcG9ydGluZyBzZXJ2aWNlIGZ1bmN0aW9ucyAoc2ltdWxhdGlvbiBtdWx0aXBsZSBpbmhlcml0YW5jZSkKLSAgICAqIFtUSFJJRlQtMjE2NF0gLSBBZGQgYSBHZXQvUG9zdCBIdHRwIFNlcnZlciB0byBOb2RlIGFsb25nIHdpdGggZXhhbXBsZXMKLSAgICAqIFtUSFJJRlQtMjI1NV0gLSBhZGQgUGFyZW50IENsYXNzIGZvciBnZW5lcmF0ZWQgU3RydWN0IGNsYXNzCi0KLSMjIFF1ZXN0aW9uCi0gICAgKiBbVEhSSUZULTI1MzldIC0gVHNvY2tldC5jcHAgYWRkcmluZm8gYWlfZmxhZ3MgPSBBSV9BRERSQ09ORklHCi0gICAgKiBbVEhSSUZULTI0NDBdIC0gaG93IHRvIGNvbm5lY3QgYXMzIHRvIGphdmEgYnkgdGhyaWZ0ICwKLSAgICAqIFtUSFJJRlQtMjM3OV0gLSBNZW1tb3J5IGxlYWtpbmcgd2hpbGUgdXNpbmcgbXVsdGl0aHJlYWRpbmcgaW4gQysrIHNlcnZlci4KLSAgICAqIFtUSFJJRlQtMjI3N10gLSBUaHJpZnQ6IGluc3RhbGxpbmcgZmIzMDMgZXJyb3IKLSAgICAqIFtUSFJJRlQtMjU2N10gLSBDc2hhcnAgc2xvdyA/Ci0gICAgKiBbVEhSSUZULTI1NzNdIC0gdGhyaWZ0IDAuOS4yIHJlbGVhc2UKLQotIyMgU3ViLXRhc2sKLSAgICAqIFtUSFJJRlQtOTgxXSAtIGNvY29hOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5Ci0gICAgKiBbVEhSSUZULTIxMzJdIC0gR286IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCi0gICAgKiBbVEhSSUZULTIyOTldIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgUnVieSBkb2VzIG5vdCBhbGxvdyBmb3IgYm90aCBwb3NzaWJsZSBzbGFzaCAoc29saWR1cykgZW5jb2RpbmdzCi0gICAgKiBbVEhSSUZULTIyOThdIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgQyMgZG9lcyBub3QgYWxsb3cgZm9yIGJvdGggcG9zc2libGUgc2xhc2ggKHNvbGlkdXMpIGVuY29kaW5ncwotICAgICogW1RIUklGVC0yMjk3XSAtIFRKc29uUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIERlbHBoaSBkb2VzIG5vdCBhbGxvdyBmb3IgYm90aCBwb3NzaWJsZSBzbGFzaCAoc29saWR1cykgZW5jb2RpbmdzCi0gICAgKiBbVEhSSUZULTIyNzFdIC0gSmF2YVNjcmlwdDogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzCi0gICAgKiBbVEhSSUZULTIyNTFdIC0gZ28gdGVzdCBmb3IgY29tcGFjdCBwcm90b2NvbCBpcyBub3QgcnVubmluZwotICAgICogW1RIUklGVC0yMTk1XSAtIERlbHBoaTogQWRkIGV2ZW50IGhhbmRsZXJzIGZvciBzZXJ2ZXIgYW5kIHByb2Nlc3NpbmcgZXZlbnRzCi0gICAgKiBbVEhSSUZULTIxNzZdIC0gVFNpbXBsZUpTT05Qcm90b2NvbC5SZWFkRmllbGRCZWdpbigpIGRvZXMgbm90IHJldHVybiBmaWVsZCB0eXBlIGFuZCBJRAotICAgICogW1RIUklGVC0yMTc1XSAtIFdyb25nIGZpZWxkIHR5cGUgc2V0IGZvciBiaW5hcnkKLSAgICAqIFtUSFJJRlQtMjE3NF0gLSBEZXNlcmlhbGl6aW5nIEpTT04gZmFpbHMgaW4gc3BlY2lmaWMgY2FzZXMKLSAgICAqIFtUSFJJRlQtMjA1M10gLSBOb2RlSlM6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcwotICAgICogW1RIUklGVC0xOTE0XSAtIFB5dGhvbjogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKLSAgICAqIFtUSFJJRlQtMTgxMF0gLSBhZGQgcnVieSB0byB0ZXN0L3Rlc3Quc2gKLSAgICAqIFtUSFJJRlQtMjMxMF0gLSBQSFA6IENsaWVudC1zaWRlIHN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcwotICAgICogW1RIUklGVC0yMzQ2XSAtIEMjOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKLSAgICAqIFtUSFJJRlQtMjM0NV0gLSBEZWxwaGk6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAotICAgICogW1RIUklGVC0yMzM4XSAtIEZpcnN0IGRvY3RleHQgd3JvbmdseSBpbnRlcnByZXRlZCBhcyBwcm9ncmFtIGRvY3RleHQgaW4gc29tZSBjYXNlcwotICAgICogW1RIUklGVC0yMzI1XSAtIFNTTCB0ZXN0IGNlcnRpZmljYXRlcwotICAgICogW1RIUklGVC0yMzU4XSAtIEMrKzogYWRkIGNvbXBhY3QgcHJvdG9jb2wgdG8gY3Jvc3MgbGFuZ3VhZ2UgdGVzdCBzdWl0ZQotICAgICogW1RIUklGVC0yNDI1XSAtIFBIUDogU2VydmVyLXNpZGUgc3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzCi0gICAgKiBbVEhSSUZULTI0MjFdIC0gVHJlZS9SZWN1cnNpdmUgc3RydWN0IHN1cHBvcnQgaW4gdGhyaWZ0Ci0gICAgKiBbVEhSSUZULTIyOTBdIC0gVXBkYXRlIEdvIHR1dG9yaWFsIHRvIGFsaWduIHdpdGggVEhSSUZULTIyMzIKLSAgICAqIFtUSFJJRlQtMjU1OF0gLSBDU2hhcnAgY29tcGlsZXIgZ2VuZXJhdG9yIHRyaWVzIHRvIGNvbmNhdCBpbnRzIHdpdGggc3RyaW5ncyB1c2luZyArCi0gICAgKiBbVEhSSUZULTI1MDddIC0gQWRkaXRpb25hbCBMVUEgVFByb3RvY29sRXhjZXB0aW9uIGVycm9yIGNvZGUgbmVlZGVkPwotICAgICogW1RIUklGVC0yNDk5XSAtIENvbXBpbGVyOiBhbGxvdyBhbm5vdGF0aW9ucyB3aXRob3V0ICI9IHZhbHVlIgotICAgICogW1RIUklGVC0yNTM0XSAtIENyb3NzIGxhbmd1YWdlIHRlc3QgcmVzdWx0cyBzaG91bGQgcmVjb3JkZWQgdG8gYSBzdGF0dXMubWQgb3Igc3RhdHVzLmh0bWwgZmlsZSBhdXRvbWF0aWNhbGx5Ci0gICAgKiBbVEhSSUZULTY2XSAtIEphdmE6IEFsbG93IG11bHRpcGxleGluZyBtdWx0aXBsZSBzZXJ2aWNlcyBvdmVyIGEgc2luZ2xlIFRDUCBjb25uZWN0aW9uCi0gICAgKiBbVEhSSUZULTE2ODFdIC0gQWRkIEx1YSBTdXBwb3J0Ci0gICAgKiBbVEhSSUZULTE3MjddIC0gUnVieS0xLjk6IGRhdGEgbG9zczogImJpbmFyeSIgZmllbGRzIGFyZSByZS1lbmNvZGVkCi0gICAgKiBbVEhSSUZULTE3MjZdIC0gUnVieS0xLjk6ICJiaW5hcnkiIGZpZWxkcyBhcmUgcmVwcmVzZW50ZWQgYnkgc3RyaW5nIHdob3NlIGVuY29kaW5nIGlzICJVVEYtOCIKLSAgICAqIFtUSFJJRlQtOTg4XSAtIHBlcmw6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkgdmlhIGNvbmZpZ3VyZQotICAgICogW1RIUklGVC0zMzRdIC0gQ29tcGFjdCBQcm90b2NvbCBmb3IgUEhQCi0gICAgKiBbVEhSSUZULTI0NDRdIC0gcHVsbCByZXF1ZXN0IDg4OiB0aHJpZnQ6IGNsZWFuIHVwIGVudW0gdmFsdWUgYXNzaWdubWVudAotCi0jIyBUYXNrCi0gICAgKiBbVEhSSUZULTIyMjNdIC0gU3BhbSBsaW5rcyBvbiB3aWtpCi0gICAgKiBbVEhSSUZULTI1NjZdIC0gUGxlYXNlIGNyZWF0ZSBhIERPQVAgZmlsZSBmb3IgeW91ciBUTFAKLSAgICAqIFtUSFJJRlQtMjIzN10gLSBVcGRhdGUgYXJjaGl2ZSB0byBjb250YWluIGFsbCB2ZXJzaW9ucwotICAgICogW1RIUklGVC05NjJdIC0gVHV0b3JpYWwgcGFnZSBvbiBvdXIgd2Vic2l0ZSBpcyByZWFsbHkgdW5oZWxwZnVsCi0KLSMjIFRlc3QKLSAgICAqIFtUSFJJRlQtMjMyN10gLSBub2RlanM6IG5vZGVqcyB0ZXN0IHN1aXRlIHNob3VsZCBiZSBidW5kbGVkIHdpdGggdGhlIGxpYnJhcnkKLSAgICAqIFtUSFJJRlQtMjQ0NV0gLSBUSFJJRlQtMjM4NCAoY29kZSBnZW5lcmF0aW9uIGZvciBnbyBtYXBzIHdpdGggYmluYXJ5IGtleXMpIHNob3VsZCBiZSB0ZXN0ZWQKLSAgICAqIFtUSFJJRlQtMjUwMV0gLSBDIyBUaGUgdGVzdCBwYXJhbWV0ZXJzIGZyb20gdGhlIFRlc3RTZXJ2ZXIgYW5kIFRlc3RDbGllbnQgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvdGVzdC8KLQotIyMgV2lzaAotICAgICogW1RIUklGVC0yMTkwXSAtIEFkZCB0aGUgSmF2YVNjcmlwdCB0aHJpZnQuanMgbGliIHRvIHRoZSBCb3dlciByZWdpc3RyeQotICAgICogW1RIUklGVC0yMDc2XSAtIGJvb3N0OjpvcHRpb25hbCBpbnN0ZWFkIG9mIF9faXNzZXQKLQotCi0KLVRocmlmdCAwLjkuMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMjIEJ1ZwotICAgICogW1RIUklGVC0xNDQwXSAtIGRlYmlhbiBwYWNrYWdpbmc6IG1pbm9yLWlzaCBwb2xpY3kgcHJvYmxlbXMKLSAgICAqIFtUSFJJRlQtMTQwMl0gLSBHZW5lcmF0ZWQgWV90eXBlcy5qcyBkb2VzIG5vdCByZXF1aXJlKCkgWF90eXBlcy5qcyB3aGVuIGFuIGluY2x1ZGUgaW4gdGhlIElETCBmaWxlIHdhcyB1c2VkCi0gICAgKiBbVEhSSUZULTE1NTFdIC0gMiB0aHJpZnQgZmlsZSBkZWZpbmUgb25seSBzdHJ1Y3QgKG5vIHNlcnZpY2UpLCBvbmUgaW5jbHVkZSBhbm90aGVyLCB0aGUgZ2VuIG5vZGVqcyBmaWxlIGRpZG4ndCBoYXZlICJyZXF1aXJlcyIgYXQgdGhlIHRvcAotICAgICogW1RIUklGVC0xMjY0XSAtIFRTb2NrZXRDbGllbnQgaXMgcXVlcmllZCBieSBydW4gbG9vcCBhZnRlciBkZWFsbG9jYXRpb24gaW4gQ29jb2EKLSAgICAqIFtUSFJJRlQtMTYwMF0gLSBUaHJpZnQgR28gQ29tcGlsZXIgYW5kIExpYnJhcnkgb3V0IG9mIGRhdGUgd2l0aCBHbyAxIFJlbGVhc2UuCi0gICAgKiBbVEhSSUZULTE2MDNdIC0gVGhyaWZ0IElETCBhbGxvd3MgZm9yIG11bHRpcGxlIGV4Y2VwdGlvbnMsIGFyZ3Mgb3Igc3RydWN0IG1lbWJlciBuYW1lcyB0byBiZSB0aGUgc2FtZQotICAgICogW1RIUklGVC0xMDYyXSAtIFByb2JsZW1zIHdpdGggcHl0aG9uIHR1dG9yaWFscwotICAgICogW1RIUklGVC04NjRdIC0gZGVmYXVsdCB2YWx1ZSBmYWlscyBpZiBpZGVudGlmaWVyIGlzIGEgc3RydWN0Ci0gICAgKiBbVEhSSUZULTkzMF0gLSBSdWJ5IGFuZCBIYXNrZWxsIGJpbmRpbmdzIGRvbid0IHByb3Blcmx5IHN1cHBvcnQgREVTVERJUiAobWFrZXMgcGFja2FnaW5nIHBhaW5mdWwpCi0gICAgKiBbVEhSSUZULTgyMF0gLSBUaGUgcmVhZExlbmd0aCBhdHRyaWJ1dGUgb2YgVEJpbmFyeVByb3RvY29sIGlzIHVzZWQgYXMgYW4gaW5zdGFuY2UgdmFyaWFibGUgYW5kIGlzIGRlY3JlbWVudGVkIG9uIGVhY2ggY2FsbCBvZiBjaGVja1JlYWRMZW5ndGgKLSAgICAqIFtUSFJJRlQtMTY0MF0gLSBOb25lIG9mIHRoZSB0dXRvcmlhbHMgbGlua2VkIG9uIHRoZSB3ZWJzaXRlIGNvbnRhaW4gY29udGVudAotICAgICogW1RIUklGVC0xNjM3XSAtIE5QTSByZWdpc3RyeSBkb2VzIG5vdCBpbmNsdWRlIHZlcnNpb24gMC44Ci0gICAgKiBbVEhSSUZULTE2NDhdIC0gTm9kZUpTIGNsaWVudHMgYWx3YXlzIHJlY2VpdmUgMCBmb3IgJ2RvdWJsZScgdmFsdWVzLgotICAgICogW1RIUklGVC0xNjYwXSAtIFB5dGhvbiBUaHJpZnQgbGlicmFyeSBjYW4gYmUgaW5zdGFsbGVkIHdpdGggcGlwIGJ1dCBub3QgZWFzeV9pbnN0YWxsCi0gICAgKiBbVEhSSUZULTE2NTddIC0gQ2hyb21lIGJyb3dzZXIgc2VuZGluZyBPUFRJT05TIG1ldGhvZCBiZWZvcmUgUE9TVCBpbiB4bWxIdHRwUmVxdWVzdAotICAgICogW1RIUklGVC0yMTE4XSAtIENlcnRpZmljYXRlIGVycm9yIGhhbmRsaW5nIHN0aWxsIGluY29ycmVjdAotICAgICogW1RIUklGVC0yMTM3XSAtIFJ1YnkgdGVzdCBsaWIgZmFpbHMgamVua2lucyBidWlsZCAjODY0Ci0gICAgKiBbVEhSSUZULTIxMzZdIC0gVmFncmFudCBidWlsZCBub3QgY29tcGlsaW5nIGphdmEsIHJ1YnksIHBocCwgZ28gbGlicyBkdWUgdG8gbWlzc2luZyBkZXBlbmRlbmNpZXMKLSAgICAqIFtUSFJJRlQtMjEzNV0gLSBHTyBsaWIgbGVhdmVzIGJlaGluZCB0ZXN0IGZpbGVzIHRoYXQgYXJlIGF1dG8gZ2VuZXJhdGVkCi0gICAgKiBbVEhSSUZULTIxMzRdIC0gbWluZ3ctY3Jvc3MtY29tcGlsZSBzY3JpcHQgZmFpbGluZyB3aXRoIHN0cmlwIGVycm9ycwotICAgICogW1RIUklGVC0yMTMzXSAtIGphdmEgVGVzdFRCaW5hcnlQcm90b2NvbC5qYXZhIHRlc3QgZmFpbGluZwotICAgICogW1RIUklGVC0yMTI2XSAtIGxpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TVEQqIGZpbGVzIG1pc3NpbmcgZnJvbSBESVNUCi0gICAgKiBbVEhSSUZULTIxMjVdIC0gZGViaWFuIG1pc3NpbmcgZnJvbSBESVNUCi0gICAgKiBbVEhSSUZULTIxMjRdIC0gLm8sIC5zbywgLmxhLCAuZGVwcywgLmxpYnMsIGdlbi0qIGZpbGVzIGxlZnQgdHV0b3JpYWxzLCB0ZXN0IGFuZCBsaWIvY3BwIHdoZW4gbWFraW5nIERJU1QKLSAgICAqIFtUSFJJRlQtMjEyM10gLSBHTyBsaWIgbWlzc2luZyBmaWxlcyBpbiBESVNUIGJ1aWxkCi0gICAgKiBbVEhSSUZULTIxMjFdIC0gQ29tcGlsYXRpb24gYnVnIGZvciBOb2RlLmpzCi0gICAgKiBbVEhSSUZULTIxMjldIC0gcGhwIGV4dCBtaXNzaW5nIGZyb20gZGlzdAotICAgICogW1RIUklGVC0yMTI4XSAtIGxpYiBHTyB0ZXN0cyBmYWlsIHdpdGggZnVuY3QgZW5kcyB3aXRob3V0IGEgcmV0dXJuIHN0YXRlbWVudAotICAgICogW1RIUklGVC0yMjg2XSAtIEZhaWxlZCB0byBjb21waWxlIFRocmlmdDAuOS4xIHdpdGggYm9vc3QxLjU1IGJ5IFZTMjAxMCBpZiBzZWxlY3QgRGVidWctbXQmeDY0IG1vZGUuCi0gICAgKiBbVEhSSUZULTE5NzNdIC0gVENvbXBhY3RQcm90b2NvbCBpbiBDIyBsaWIgZG9lcyBub3Qgc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBuZWdhdGl2ZSBpbnQzMiBhbmQgaW50NjQgbnVtYmVyIGNvcnJlY3RseQotICAgICogW1RIUklGVC0xOTkyXSAtIGNhc3RzIGluIFRDb21wYWN0UHJvdG9jb2wudGNjIGNhdXNpbmcgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIgd2FybmluZ3MgZnJvbSBnY2MKLSAgICAqIFtUSFJJRlQtMTkzMF0gLSBDIyBnZW5lcmF0ZXMgdW5zaWduZWQgYnl0ZSBmb3IgVGhyaWZ0ICJieXRlIiB0eXBlCi0gICAgKiBbVEhSSUZULTE5MjldIC0gVXBkYXRlIHdlYnNpdGUgdG8gdXNlIE1pcnJvcnMgZm9yIGRvd25sb2FkcwotICAgICogW1RIUklGVC0xOTI4XSAtIFJhY2UgbWF5IHN0aWxsIGV4aXN0IGluIFRGaWxlVHJhbnNwb3J0OjpmbHVzaCgpCi0gICAgKiBbVEhSSUZULTE5MzRdIC0gVGFicyBpbiBFeGFtcGxlIHNlY3Rpb24gb24gbWFpbiBwYWdlIGFyZSBub3Qgd29ya2luZwotICAgICogW1RIUklGVC0xOTMzXSAtIERlbHBoaSBnZW5lcmF0b3IgY3Jhc2hlcyB3aGVuIGEgdHlwZWRlZiByZWZlcmVuY2VzIGFub3RoZXIgdHlwZWRlZiBmcm9tIGFuIGluY2x1ZGVkIGZpbGUKLSAgICAqIFtUSFJJRlQtMTk0Ml0gLSBCaW5hcnkgYWNjZWxlcmF0ZWQgY3BwIGV4dGVuc2lvbiBkb2VzIG5vdCB1c2UgVGhyaWZ0IG5hbWVzcGFjZXMgZm9yIEV4Y2VwdGlvbnMKLSAgICAqIFtUSFJJRlQtMTk1OV0gLSBDIzogQWRkIFVuaW9uIFRNZW1vcnlCdWZmZXIgc3VwcG9ydAotICAgICogW1RIUklGVC0xOTU4XSAtIEMjOiBVc2Ugc3RhdGljIE9iamVjdC5FcXVhbHMgaW5zdGVhZCBvZiAuRXF1YWxzKCkgY2FsbHMgaW4gZXF1YWxzCi0gICAgKiBbVEhSSUZULTE5NTddIC0gTm9kZUpTIFRGcmFtZWRUcmFuc3BvcnQgYW5kIFRCdWZmZXJlZFRyYW5zcG9ydCByZWFkIGJ5dGVzIGFzIHVuc2lnbmVkCi0gICAgKiBbVEhSSUZULTE5NTVdIC0gVW5pb24gVHlwZSB3cml0ZXIgZ2VuZXJhdGVkIGluIEMjIGRvZXMgbm90IFdyaXRlU3RydWN0QmVnaW4KLSAgICAqIFtUSFJJRlQtMTk1Ml0gLSBUcmF2aXMgQ0kKLSAgICAqIFtUSFJJRlQtMTk0OV0gLSBXUDcgYnVpbGQgYnJva2VuCi0gICAgKiBbVEhSSUZULTE5NDNdIC0gZG9jc3RyaW5ncyBmb3IgZW51bSB2YWx1ZXMgYXJlIGlnbm9yZWQKLSAgICAqIFtUSFJJRlQtMjA3MF0gLSBJbXByb3BlciBgSGV4Q2hhcicgYW5kICdIZXhWYWwnIGltcGxlbWVudGF0aW9uIGluIFRKU09OUHJvdG9jb2wuY3MKLSAgICAqIFtUSFJJRlQtMjAxN10gLSBSZXNvdXJjZSBMZWFrIGluIHRocmlmdCBzdHJ1Y3QgdW5kZXIgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAotICAgICogW1RIUklGVC0yMDMyXSAtIEMjIGNsaWVudCBsZWFrcyBzb2NrZXRzL2hhbmRsZXMKLSAgICAqIFtUSFJJRlQtMTk5Nl0gLSBKYXZhTUUgQ29uc3RhbnRzIGdlbmVyYXRpb24gaXMgYnJva2VuIC8gaW5jb25zaXN0ZW50IHdpdGggcmVndWxhciBKYXZhIGdlbmVyYXRpb24KLSAgICAqIFtUSFJJRlQtMjAwMl0gLSBIYXNrZWxsOiBUZXN0IHVzZSBEYXRhLk1heWJlIGluc3RlYWQgb2YgTWF5YmUKLSAgICAqIFtUSFJJRlQtMjA1MV0gLSBWYWdyYW50IGZhaWxzIHRvIGJ1aWxkIGVybGFuZwotICAgICogW1RIUklGVC0yMDUwXSAtIFZhZ3JhbnQgQyMgbGliIGNvbXBpbGUgZmFpbHMgd2l0aCBURXhjZXB0aW9uIG1pc3NpbmcKLSAgICAqIFtUSFJJRlQtMTk3OF0gLSBSdWJ5OiBUaHJpZnQgc2hvdWxkIGFsbG93IGZvciB0aGUgU1NMIHZlcmlmeSBtb2RlIHRvIGJlIHNldAotICAgICogW1RIUklGVC0xOTg0XSAtIG5hbWVzcGFjZSBjb2xsaXNpb24gaW4gcHl0aG9uIGJpbmRpbmdzCi0gICAgKiBbVEhSSUZULTE5ODhdIC0gV2hlbiB0cnlpbmcgdG8gYnVpbGQgYSBkZWJpYW4gcGFja2FnZSBpdCBmYWlscyBhcyB0aGUgZmlsZSBORVdTIGRvZXNuJ3QgZXhpc3QKLSAgICAqIFtUSFJJRlQtMTk3NV0gLSBUQmluYXJ5UHJvdG9jb2wgQ2hlY2tMZW5ndGggY2FuJ3QgYmUgdXNlZCBmb3IgYSBjbGllbnQKLSAgICAqIFtUSFJJRlQtMTk5NV0gLSAnLicgYWxsb3dlZCBhdCBlbmQgb2YgaWRlbnRpZmllciBnZW5lcmF0ZXMgbm9uLWNvbXBpbGFibGUgY29kZQotICAgICogW1RIUklGVC0yMTEyXSAtIEVycm9yIGluIEdvIGdlbmVyYXRvciB3aGVuIHVzaW5nIHR5cGVkZWZzIGluIG1hcCBrZXlzCi0gICAgKiBbVEhSSUZULTIwODhdIC0gVHlwb3MgaW4gVGhyaWZ0IGNvbXBpbGVyIGhlbHAgdGV4dAotICAgICogW1RIUklGVC0yMDgwXSAtIEMjIG11bHRpcGxleCBwcm9jZXNzb3IgZG9lcyBub3QgY2F0Y2ggSU9FeGNlcHRpb24KLSAgICAqIFtUSFJJRlQtMjA4Ml0gLSBFeGVjdXRpbmcgImdtYWtlIGNsZWFuIiBpcyBicm9rZW4KLSAgICAqIFtUSFJJRlQtMjEwMl0gLSBjb25zdGFudHMgYXJlIG5vdCByZWZlcmVuY2luZyB0byBjb3JyZWN0IHR5cGUgd2hlbiBpbmNsdWRlZCBmcm9tIGFub3RoZXIgdGhyaWZ0IGZpbGUKLSAgICAqIFtUSFJJRlQtMjEwMF0gLSB0eXBlZGVmcyBhcmUgbm90IGNvcnJlY3RseSByZWZlcmVuY2VkIHdoZW4gaW5jbHVkaW5nIGZyb20gb3RoZXIgdGhyaWZ0IGZpbGVzCi0gICAgKiBbVEhSSUZULTIwNjZdIC0gJ21ha2UgaW5zdGFsbCcgZG9lcyBub3QgaW5zdGFsbCB0d28gaGVhZGVycyByZXF1aXJlZCBmb3IgQysrIGJpbmRpbmdzCi0gICAgKiBbVEhSSUZULTIwNjVdIC0gTm90IHZhbGlkIGNvbnN0YW50cyBmaWxlbmFtZSBpbiBKYXZhCi0gICAgKiBbVEhSSUZULTIwNDddIC0gVGhyaWZ0LlByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wsIGludFRvWmlnWmFnIGRhdGEgbG9zdCAoVENvbXBhY3RQcm90b2NvbC5jcykKLSAgICAqIFtUSFJJRlQtMjAzNl0gLSBUaHJpZnQgZ2VtIHdhcm5zIGFib3V0IGNsYXNzIHZhcmlhYmxlIGFjY2VzcyBmcm9tIHRvcCBsZXZlbAotICAgICogW1RIUklGVC0yMDU3XSAtIFZhZ3JhbnQgZmFpbHMgb24gcGhwIHRlc3RzCi0gICAgKiBbVEhSSUZULTIxMDVdIC0gR2VuZXJhdGVkIGNvZGUgZm9yIGRlZmF1bHQgdmFsdWVzIG9mIGNvbGxlY3Rpb25zIGlnbm9yZXMgdF9maWVsZDo6VF9SRVFVSVJFRAotICAgICogW1RIUklGVC0yMDkxXSAtIFVubmVjZXNzYXJ5ICdmcmllbmQnIGRlY2xhcmF0aW9uIGNhdXNlcyB3YXJuaW5nIGluIFRXaW5zb2NrU2luZ2xldG9uCi0gICAgKiBbVEhSSUZULTIwOTBdIC0gR28gZ2VuZXJhdG9yLCBmaXggaW5jbHVkaW5nIG9mIG90aGVyIHRocmlmdCBmaWxlcwotICAgICogW1RIUklGVC0yMTA2XSAtIEZpeCBzdXBwb3J0IGZvciBuYW1lc3BhY2VzIGluIEdPIGdlbmVyYXRvcgotICAgICogW1RIUklGVC0xNzgzXSAtIEMjIGRvZXNuJ3QgaGFuZGxlIHJlcXVpcmVkIGZpZWxkcyBjb3JyZWN0bHkKLSAgICAqIFtUSFJJRlQtMTc4Ml0gLSBhc3luYyBvbmx5IGRlZmluZWQgaW4gc2lsdmVybGlnaHQKLSAgICAqIFtUSFJJRlQtMTc3OV0gLSBNaXNzaW5nIHByb2Nlc3NfWFhYWCBtZXRob2QgaW4gZ2VuZXJhdGVkIFRQcm9jZXNzb3IgaW1wbGVtZW50YXRpb24gZm9yIGFsbCAnb25ld2F5JyBzZXJ2aWNlIGZ1bmN0aW9ucwotICAgICogW1RIUklGVC0xNjkyXSAtIFNPX1JFVVNFQUREUiBhbGxvd3MgZm9yIHNvY2tldCBoaWphY2tpbmcgb24gV2luZG93cwotICAgICogW1RIUklGVC0xNzIwXSAtIEpSdWJ5IHRpbWVzIG91dCBvbiBzdWNjZXNzZnVsIGNvbm5lY3Rpb24KLSAgICAqIFtUSFJJRlQtMTcxM10gLSBOYW1lZCBhbmQgQW5vbnltb3VzIFBpcGUgdHJhbnNwb3J0IChEZWxwaGkpCi0gICAgKiBbVEhSSUZULTE2OTldIC0gTmF0aXZlIFVuaW9uI3JlYWQgaGFzIGV4dHJhIHJlYWRfZmllbGRfZW5kIGNhbGwKLSAgICAqIFtUSFJJRlQtMTc0OV0gLSBQeXRob24gVFNTTFNvY2tldCBlcnJvciBoYW5kbGluZyBvYnNjdXJlcyBhY3R1YWwgZXJyb3IKLSAgICAqIFtUSFJJRlQtMTc0OF0gLSBHdWFyZCBhbmQgUldHdWFyZCBtYWNyb3MgZGVmaW5lZCBpbiBnbG9iYWwgbmFtZXNwYWNlCi0gICAgKiBbVEhSSUZULTE3MzRdIC0gRnJvbnQgd2VicGFnZSBpcyBzdGlsbCBhZHZlcnRpc2luZyB2MC44IGFzIGN1cnJlbnQgcmVsZWFzZQotICAgICogW1RIUklGVC0xNzI5XSAtIEMgZ2xpYiByZWZhY3RvciBsZWZ0IGVtcHR5IGZvbGRlcnMgaW4gc3ZuCi0gICAgKiBbVEhSSUZULTE3NjddIC0gdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzIChEZWxwaGkpCi0gICAgKiBbVEhSSUZULTE3NjVdIC0gSW5jb3JyZWN0IGVycm9yIG1lc3NhZ2UgcHJpbnRlZCBmb3IgbnVsbCBvciBuZWdhdGl2ZSBrZXlzCi0gICAgKiBbVEhSSUZULTE3NzhdIC0gQ29uZmlndXJlIHJlcXVpcmVzIG1hbnVhbCBpbnRlcnZlbnRpb24gZHVlIHRvIHRhciBmYWlsdXJlCi0gICAgKiBbVEhSSUZULTE3NzddIC0gVFBpcGVTZXJ2ZXIgaXMgVU5TVE9QUEFCTEUKLSAgICAqIFtUSFJJRlQtMTc1M10gLSBNdWx0aXBsZSBDKysgV2luZG93cywgT1NYLCBhbmQgaU9TIHBvcnRhYmlsaXR5IGlzc3VlcwotICAgICogW1RIUklGVC0xNzU2XSAtICdtYWtlIC1qIDgnIGZhaWxzIHdpdGggInVudGVybWluYXRlZCAjaWZkZWYiIGVycm9yCi0gICAgKiBbVEhSSUZULTE3NzNdIC0gUHl0aG9uIGxpYnJhcnkgc2hvdWxkIHJ1biBvbiBweXRob24gMi40Ci0gICAgKiBbVEhSSUZULTE3NjldIC0gdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzIChDKyspCi0gICAgKiBbVEhSSUZULTE3NjhdIC0gdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzIChDb21waWxlcikKLSAgICAqIFtUSFJJRlQtMTY2Nl0gLSBodG9ubGwgdXNhZ2UgaW4gVEJpbmFyeVByb3RvY29sLnRjYyBnZW5lcmF0ZXMgd2FybmluZyB3aXRoIE1TVkMyMDEwCi0gICAgKiBbVEhSSUZULTE5MTldIC0gbGlidGhyaWZ0IGRlcGVuZHMgb24gaHR0cGNvcmUtNC4xLjMgKGRpcmVjdGx5KSBhbmQgaHR0cGNvcmUtNC4xLjQgKHRyYW5zaXRpdmVseSkKLSAgICAqIFtUSFJJRlQtMTg2NF0gLSBpbXBsZW1lbnQgZXZlbnQgaGFuZGxlciBmb3Igbm9uLWJsb2NraW5nIHNlcnZlcgotICAgICogW1RIUklGVC0xODU5XSAtIEdlbmVyYXRlZCBlcnJvciBjKysgY29kZSB3aXRoIC1vdXQgYW5kIGluY2x1ZGVfcHJlZml4IHBhcmFtCi0gICAgKiBbVEhSSUZULTE4NjldIC0gVFRocmVhZFBvb2xTZXJ2ZXIgKGphdmEpIGRpZXMgd2hlbiB0aHJlYWRwb29sIGlzIGNvbnN1bWVkCi0gICAgKiBbVEhSSUZULTE4NDJdIC0gTWVtb3J5IGxlYWsgd2l0aCBQaXBlcwotICAgICogW1RIUklGVC0xODM4XSAtIENhbid0IGJ1aWxkIGNvbXBpbGVyIG9uIE9TIFggYmVjYXVzZSBvZiBtaXNzaW5nIHRocmlmdHkuaAotICAgICogW1RIUklGVC0xODQ2XSAtIFJlc3RvcmUgc29ja2V0LmggaGVhZGVyIHRvIHN1cHBvcnQgYnVpbGRzIHdpdGggQW5kcm9pZCBOREsKLSAgICAqIFtUSFJJRlQtMTg1MF0gLSBtYWtlIGNoZWNrIGhhbmdzIG9uIFRTb2NrZXQgdGVzdHMgaW4gVHJhbnNwb3J0VGVzdC5jcHAKLSAgICAqIFtUSFJJRlQtMTg3M10gLSBCaW5hcnkgcHJvdG9jb2wgZmFjdG9yeSBpZ25vcmVzIHN0cnVjdCByZWFkL3dyaXRlIGZsYWdzCi0gICAgKiBbVEhSSUZULTE4NzJdIC0gaXNzdWVzIHdpdGggVEJ1ZmZlcmVkVHJhbnNwb3J0IGJ1ZmZlcgotICAgICogW1RIUklGVC0xOTA0XSAtIEluY29ycmVjdCBjb2RlIGlzIGdlbmVyYXRlZCBmb3IgdHlwZWRlZnMgd2hpY2ggdXNlIGluY2x1ZGVkIHR5cGVzCi0gICAgKiBbVEhSSUZULTE5MDNdIC0gUEhQIG5hbWVzcGFjZXMgY2F1c2UgYmluYXJ5IHByb3RvY29scyB0byBub3QgYmUgdXNlZAotICAgICogW1RIUklGVC0xODk1XSAtIERlbHBoaTogcmVzZXJ2ZWQgdmFyaWFibGUgbmFtZSAicmVzdWx0IiBub3QgZGV0ZWN0ZWQgcHJvcGVybHkKLSAgICAqIFtUSFJJRlQtMTg4MV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgZG9lcyBub3QgcmVsZWFzZSBvcGVuIGNvbm5lY3Rpb25zIG9yIHRocmVhZHMgb24gc2h1dGRvd24KLSAgICAqIFtUSFJJRlQtMTg4OF0gLSBKYXZhIFRocmlmdCBjbGllbnQgY2FuJ3QgY29ubmVjdCB0byBQeXRob24gVGhyaWZ0IHNlcnZlciBvbiBzYW1lIGhvc3QKLSAgICAqIFtUSFJJRlQtMTgzMV0gLSBCdWcgaW4gbGlzdCBkZXNlcmlhbGl6ZXIKLSAgICAqIFtUSFJJRlQtMTgyNF0gLSBtYW55IGNvbXBpbGUgd2FybmluZywgYmVjYXNlIFRocmVhZC5oIGluY2x1ZGVzIGNvbmZpZy5oCi0gICAgKiBbVEhSSUZULTE4MjNdIC0gTWlzc2luZyBwYXJlbnRoZXNpcyBicmVha3MgIklTXy4uLiIgbWFjcm8gaW4gZ2VuZXJhdGVkIGNvZGUKLSAgICAqIFtUSFJJRlQtMTgwNl0gLSBQeXRob24gZ2VuZXJhdGlvbiBhbHdheXMgdHJ1bmNhdGVzIF9faW5pdF9fLnB5IGZpbGVzCi0gICAgKiBbVEhSSUZULTE3OTVdIC0gUmFjZSBjb25kaXRpb24gaW4gVFRocmVhZGVkU2VydmVyUG9vbCBqYXZhIGltcGxlbWVudGF0aW9uCi0gICAgKiBbVEhSSUZULTE3OTRdIC0gQyMgYXN5bmNjdHAgYnJva2VuCi0gICAgKiBbVEhSSUZULTE4MDRdIC0gQmluYXJ5K2NvbXBhY3QgcHJvdG9jb2wgc2luZ2xlIGJ5dGUgZXJyb3IgaW4gUnVieSBsaWJyYXJ5IChBUk0gYXJjaGl0ZWN0dXJlKTogY2F1c2VkIGJ5IGRpZmZlcmVudCBjaGFyIHNpZ25lZG5lc3MKLSAgICAqIFtUSFJJRlQtMTgwMF0gLSBEb2N1bWVudGF0aW9uIHRleHQgbm90IGFsd2F5cyBlc2NhcGVkIGNvcnJlY3RseSB3aGVuIHJlbmRlcmVkIHRvIEhUTUwKLSAgICAqIFtUSFJJRlQtMTc4OF0gLSBDIzogQ29uc3RhbnRzIHN0YXRpYyBjb25zdHJ1Y3RvciBkb2VzIG5vdCBjb21waWxlCi0gICAgKiBbVEhSSUZULTE4MTZdIC0gTmVlZCAicmVxdWlyZSIgaW5jbHVkZWQgdGhyaWZ0IGZpbGVzIGluICJ4eHhfdHlwZXMuanMiCi0gICAgKiBbVEhSSUZULTE5MDddIC0gQ29tcGlsaW5nIG5hbWVzcGFjZSBhbmQgc3ViLW5hbWVzcGFjZSBkaXJlY3RpdmVzIGZvciB1bnJlY29nbml6ZWQgZ2VuZXJhdG9ycyBzaG91bGQgb25seSBiZSBhIHdhcm5pbmcKLSAgICAqIFtUSFJJRlQtMTkxM10gLSBza2lwcGluZyB1bmtub3duIGZpZWxkcyBpbiBqYXZhIHVuaW9ucwotICAgICogW1RIUklGVC0yNTUzXSAtIEMrKyBsaW5rZXIgZXJyb3IgLSB0cmFuc3BvcnQvVFNvY2tldAotICAgICogW1RIUklGVC0yNzRdIC0gVG93YXJkcyBhIHdvcmtpbmcgcmVsZWFzZS92ZXJzaW9uaW5nIHByb2Nlc3MKLQotIyMgRG9jdW1lbnRhdGlvbgotICAgICogW1RIUklGVC0xOTcxXSAtIFtHcmFwaHZpel0gQWRkcyB0dXRvcmlhbC9nZW5lcmFsIGRlc2NyaXB0aW9uIGRvY3VtZW50YXRpb24KLSAgICAqIFtUSFJJRlQtMjAwMV0gLSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvIEV4YW1wbGUgIkMrKyBTZXJ2ZXIiIHRhYiBpcyBicm9rZW4KLQotIyMgSW1wcm92ZW1lbnQKLSAgICAqIFtUSFJJRlQtMTU3NF0gLSBBcGFjaGUgcHJvamVjdCBicmFuZGluZyByZXF1aXJlbWVudHM6IERPQVAgZmlsZSBbUEFUQ0hdCi0gICAgKiBbVEhSSUZULTEzNDddIC0gVW5pZnkgdGhlIGV4Y2VwdGlvbnMgcmV0dXJuZWQgaW4gZ2VuZXJhdGVkIEdvIGNvZGUKLSAgICAqIFtUSFJJRlQtMTM1M10gLSBTd2l0Y2ggdG8gcGVyZm9ybWFuY2UgYnJhbmNoLCBnZXQgcmlkIG9mIEJpbmFyeVBhcnNlcgotICAgICogW1RIUklGVC0xNjI5XSAtIFJ1YnkgMS45IENvbXBhdGliaWxpdHkgZHVyaW5nIFRocmlmdCBjb25maWd1cmUsIG1ha2UsIGluc3RhbGwKLSAgICAqIFtUSFJJRlQtOTkxXSAtIFJlZmFjdG9yIEhhc2tlbGwgY29kZSBhbmQgZ2VuZXJhdG9yCi0gICAgKiBbVEhSSUZULTk5MF0gLSBTYW5pZnkgZ2V0dGltZW9mZGF5IHVzYWdlIGNvZGViYXNlLXdpZGUKLSAgICAqIFtUSFJJRlQtNzkxXSAtIExldCBDKysgVFNpbXBsZVNlcnZlciBiZSBkcml2ZW4gYnkgYW4gZXh0ZXJuYWwgbWFpbiBsb29wCi0gICAgKiBbVEhSSUZULTIxMTddIC0gQ29jb2EgVEJpbmFyeVByb3RvY29sIHN0cmljdFdyaXRlIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBieSBkZWZhdWx0Ci0gICAgKiBbVEhSSUZULTIwMTRdIC0gQ2hhbmdlIEMrKyBsaWIgaW5jbHVkZXMgdG8gdXNlIDxuYW1lc3BhY2UvPiBzdHlsZSB0aHJvdWdob3V0Ci0gICAgKiBbVEhSSUZULTE5NzJdIC0gQWRkIHN1cHBvcnQgZm9yIGFzeW5jIHByb2Nlc3NvcnMKLSAgICAqIFtUSFJJRlQtMTk3MF0gLSBbR3JhcGh2aXpdIEFkZHMgb3B0aW9uIHRvIHJlbmRlciBleGNlcHRpb25zIHJlbGF0aW9uc2hpcHMKLSAgICAqIFtUSFJJRlQtMTk2Nl0gLSBTdXBwb3J0IGRpZmZlcmVudCBmaWxlcyBmb3IgU1NMIGNlcnRpZmljYXRlcyBhbmQga2V5cwotICAgICogW1RIUklGVC0xOTY1XSAtIEFkZHMgR3JhcGh2aXogKGdyYXBoIGRlc2NyaXB0aW9uIGxhbmd1YWdlKSBnZW5lcmF0b3IKLSAgICAqIFtUSFJJRlQtMTk1Nl0gLSBTd2l0Y2ggdG8gQXBhY2hlIENvbW1vbnMgTGFuZyAzCi0gICAgKiBbVEhSSUZULTE5NjJdIC0gTXVsdGlwbGV4IHByb2Nlc3NvciBzaG91bGQgc2VuZCBhbnkgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGJhY2sgdG8gY2xpZW50Ci0gICAgKiBbVEhSSUZULTE5NjBdIC0gbWFpbigpIGRlY2xhcmVzIDIyIHVudXNlZCBnZW4gYm9vbHMKLSAgICAqIFtUSFJJRlQtMTk1MV0gLSBsaWJ0aHJpZnQuamFyIGhhcyBzb3VyY2UgZmlsZXMgaW4gaXQKLSAgICAqIFtUSFJJRlQtMTk5N10gLSBBZGQgYWNjZXB0IGJhY2tsb2cgY29uZmlndXJhdGlvbiBtZXRob2QgdG8gIFRTZXJ2ZXJTb2NrZXQKLSAgICAqIFtUSFJJRlQtMjAwM10gLSBEZXByZWNhdGUgc2VudW0KLSAgICAqIFtUSFJJRlQtMjA1Ml0gLSBWYWdyYW50IG1hY2hpbmUgaW1hZ2UgZGVmYXVsdHMgdG8gb25seSAzODRNQiBvZiBSQU0KLSAgICAqIFtUSFJJRlQtMTk4MF0gLSBNb2Rlcm5pemUgR28gdG9vbGluZywgZml4IGdvIGNsaWVudCBsaWJhcnkuCi0gICAgKiBbVEhSSUZULTE5NzddIC0gQyMgY29tcGlsZXIgc2hvdWxkIGdlbmVyYXRlIGNvbnN0YW50IGZpbGVzIHByZWZpeGVkIHdpdGggdGhyaWZ0IGZpbGUgbmFtZQotICAgICogW1RIUklGVC0xOTg1XSAtIGFkZCBhIFZhZ3JhbnRmaWxlIHRvIGJ1aWxkIGFuZCB0ZXN0IEFwYWNoZSBUaHJpZnQgZnVsbHkgcmVwcm9kdWNhYmxlCi0gICAgKiBbVEhSSUZULTE5OTRdIC0gRGVwcmVjYXRlIHNsaXN0Ci0gICAgKiBbVEhSSUZULTE5OTNdIC0gRmFjdG9yeSB0byBjcmVhdGUgaW5zdGFuY2VzIGZyb20ga25vd24gKGdlbmVyYXRlZCkgaW50ZXJmYWNlIHR5cGVzIHdpdGggRGVscGhpCi0gICAgKiBbVEhSSUZULTIwODFdIC0gU3BlY2lmaWVkIHRpbWVvdXQgc2hvdWxkIGJlIHVzZWQgaW4gVFNvY2tldC5PcGVuKCkKLSAgICAqIFtUSFJJRlQtMjA4NF0gLSBEZWxwaGk6IEFiaWxpdHkgdG8gY3JlYXRlIGVudGl0eSBUaHJpZnQtZ2VuZXJhdGVkIGluc3RhbmNlcyBiYXNlZCBvbiBUeXBlSW5mbwotICAgICogW1RIUklGVC0yMDgzXSAtIEltcHJvdmUgdGhlIGdvIGxpYjogYnVmZmVyZWQgVHJhbnNwb3J0LCBzYXZlIG1lbW9yeSBhbGxvY2F0aW9uLCBoYW5kbGUgY29uY3VycmVudCByZXF1ZXN0Ci0gICAgKiBbVEhSSUZULTIxMDldIC0gU2VjdXJlIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBzdXBwb3J0ZWQgaW4gR28KLSAgICAqIFtUSFJJRlQtMjEwN10gLSBtaW5vciBHbyBnZW5lcmF0b3IgZml4ZXMKLSAgICAqIFtUSFJJRlQtMTY5NV0gLSBhbGxvdyB3YXJuaW5nLWZyZWUgY29tcGlsYXRpb24gaW4gVlMgMjAxMiBhbmQgR05VIDQuNgotICAgICogW1RIUklGVC0xNzM1XSAtIGludGVncmF0ZSB0dXRvcmlhbCBpbnRvIHJlZ3VsYXIgYnVpbGQKLSAgICAqIFtUSFJJRlQtMTcxNl0gLSBtYXggYWxsb3dlZCBjb25uZWN0aW9ucyBzaG91bGQgYmUgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTCi0gICAgKiBbVEhSSUZULTE3MTVdIC0gQWxsb3cgZXhjbHVkaW5nIHB5dGhvbiBwYXJ0cyB3aGVuIGJ1aWxkaW5nIGNvbnRyaWIvZmIzMDMKLSAgICAqIFtUSFJJRlQtMTczM10gLSBGaXggUlBNIGJ1aWxkIGlzc3VlcyBvbiBSSEVMNi9PTDYgc3lzdGVtcwotICAgICogW1RIUklGVC0xNzI4XSAtIFVwZ3JhZGF0aW9uIG9mIGh0dHBjb21wb25lbnRzCi0gICAgKiBbVEhSSUZULTE4NzZdIC0gVXNlIGVudW0gbmFtZXMgaW5zdGVhZCBvZiBjYXN0ZWQgaW50ZWdlcnMgaW4gYXNzaWdubWVudHMKLSAgICAqIFtUSFJJRlQtMTg3NF0gLSB0aW1lb3V0IGZvciB0aGUgc2VydmVyLXNpZGUgZW5kIG9mIGEgbmFtZWQgcGlwZQotICAgICogW1RIUklGVC0xODk3XSAtIFN1cHBvcnQgdmFsaWRhdGlvbiBvZiByZXF1aXJlZCBmaWVsZHMKLSAgICAqIFtUSFJJRlQtMTg5Nl0gLSBBZGQgVEJhc2UgcHJvdG9jb2wgZm9yIENvY29hCi0gICAgKiBbVEhSSUZULTE4ODBdIC0gTWFrZSBuYW1lZCBwaXBlcyBzZXJ2ZXIgd29yayBhc3luY2hyb25vdXNseSAob3ZlcmxhcHBlZCkgdG8gYWxsb3cgZm9yIGNsZWFuIHNlcnZlciBzdG9wcwotICAgICogW1RIUklGVC0xODc4XSAtIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gc2VuZCBjdXN0b20gaGVhZGVycwotICAgICogW1RIUklGVC0xODgyXSAtIFVzZSBzaW5nbGUgaW5jbHVkZQotICAgICogW1RIUklGVC0xNzkzXSAtIEMjOiBVc2Ugc3RhdGljIHJlYWQgaW5zdGVhZCBvZiBpbnN0YW5jZSByZWFkCi0gICAgKiBbVEhSSUZULTE3OTldIC0gT3B0aW9uIHRvIGdlbmVyYXRlIEhUTUwgaW4gInN0YW5kYWxvbmUgbW9kZSIKLSAgICAqIFtUSFJJRlQtMTgxNV0gLSBDb2RlIGdlbmVyYXRvcnMgbGluZSBidWZmZXIgb3V0cHV0Ci0gICAgKiBbVEhSSUZULTE4OTBdIC0gQysrOiBNYWtlIG5hbWVkIHBpcGVzIHNlcnZlciB3b3JrIGFzeW5jaHJvbm91c2x5Ci0gICAgKiBbVEhSSUZULTQ3NF0gLSBHZW5lcmF0aW5nIFJ1Ynkgb24gUmFpbHMgZnJpZW5kbHkgY29kZQotCi0jIyBOZXcgRmVhdHVyZQotICAgICogW1RIUklGVC04MDFdIC0gUHJvdmlkZSBhbiBpbnRlcmFjdGl2ZSBzaGVsbCAoaXJiKSB3aGVuIGdlbmVyYXRpbmcgcnVieSBiaW5kaW5ncwotICAgICogW1RIUklGVC0yMjkyXSAtIEFuZHJvaWQgTGlicmFyeSBQcm9qZWN0Ci0gICAgKiBbVEhSSUZULTIwMTJdIC0gTW9kZXJuaXppbmcgR28KLSAgICAqIFtUSFJJRlQtMTk2OV0gLSBDIzogVGVzdHMgbm90IHByb3Blcmx5IGxpbmtlZCBmcm9tIHRoZSBzb2x1dGlvbgotICAgICogW1RIUklGVC0xNzg1XSAtIEMjOiBBZGQgVE1lbW9yeUJ1ZmZlciBzZXJpYWxpemVyL2Rlc2VyaWFsaXplcgotICAgICogW1RIUklGVC0xNzgwXSAtIEFkZCBvcHRpb24gdG8gZ2VuZXJhdGUgbnVsbGFibGUgdmFsdWVzCi0gICAgKiBbVEhSSUZULTE3ODZdIC0gQyMgVW5pb24gVHlwaW5nCi0gICAgKiBbVEhSSUZULTU5MV0gLSBNYWtlIHRoZSBDKysgcnVudGltZSBsaWJyYXJ5IGJlIGNvbXBhdGlibGUgd2l0aCBXaW5kb3dzIGFuZCBWaXN1YWwgU3R1ZGlvCi0gICAgKiBbVEhSSUZULTUxNF0gLSBBZGQgb3B0aW9uIHRvIGNvbmZpZ3VyZSBjb21waWxlciBvdXRwdXQgZGlyZWN0b3J5Ci0KLSMjIFF1ZXN0aW9uCi0gICAgKiBbVEhSSUZULTE3NjRdIC0gaG93IHRvIGdldCB0aGUgY29udGV4dCBvZiBjbGllbnQgd2hlbiBvbiBhIHJwYyBjYWxsIGluIHNlcnZlciBzaWRlPwotICAgICogW1RIUklGVC0xNzkxXSAtIHRocmlmdCdzIG5hbWVzcGFjZSBkaXJlY3RpdmUgd2hlbiBnZW5lcmF0aW5nIGhhc2tlbGwgY29kZQotCi0jIyBTdWItdGFzawotICAgICogW1RIUklGVC0xNTk0XSAtIEphdmEgdGVzdCBjbGllbnRzIHNob3VsZCBoYXZlIGEgcmV0dXJuIGNvZGVzIHRoYXQgcmVmbGVjdCB3aGV0aGVyIGl0IHN1Y2NlZWRzIG9yIG5vdC4KLSAgICAqIFtUSFJJRlQtMTU5NV0gLSBKYXZhIHRlc3Qgc2VydmVyIHNob3VsZCBmb2xsb3cgdGhlIGRvY3VtZW50ZWQgYmVoYXZpb3IgYXMgb2YgVEhSSUZULTE1OTAKLSAgICAqIFtUSFJJRlQtOTg2XSAtIHN0OiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5Ci0gICAgKiBbVEhSSUZULTk4NV0gLSBwaHA6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkKLSAgICAqIFtUSFJJRlQtOTg0XSAtIG9jYW1sOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5Ci0gICAgKiBbVEhSSUZULTE5MjRdIC0gRGVscGhpOiBJbmNvbnNpc3RlbmN5IGluIHNlcmlhbGl6YXRpb24gb2Ygb3B0aW9uYWwgZmllbGRzCi0gICAgKiBbVEhSSUZULTE5MjJdIC0gQyM6IEluY29uc2lzdGVuY3kgaW4gc2VyaWFsaXphdGlvbiBvZiBvcHRpb25hbCBmaWVsZHMKLSAgICAqIFtUSFJJRlQtMTk2MV0gLSBDIyB0ZXN0cyBzaG91bGQgYmUgaW4gbGliL2NzaGFycC90ZXN0Ly4uLgotICAgICogW1RIUklGVC0xODIyXSAtIFBIUCB1bml0IHRlc3QgZG9lcyBub3Qgd29yawotICAgICogW1RIUklGVC0xOTAyXSAtIEMrKzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKLSAgICAqIFtUSFJJRlQtMTkwMV0gLSBDIzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKLSAgICAqIFtUSFJJRlQtMTg5OV0gLSBEZWxwaGk6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCi0gICAgKiBbVEhSSUZULTU2M10gLSBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgotCi0KLQotVGhyaWZ0IDAuOQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMjIEJ1ZwotICAgICogW1RIUklGVC0xNDM4XSAtIGxpYi9jcHAvc3JjL3dpbmRvd3MvY29uZmlnLmggc2hvdWxkIHJlYWQgdmVyc2lvbiBmcm9tIGNvbmZpZ3VyZS5hYyByYXRoZXIgdGhhbiBhICNkZWZpbmUKLSAgICAqIFtUSFJJRlQtMTQ0Nl0gLSBDb21waWxlIGVycm9yIHdpdGggRGVscGhpIDIwMDkgaW4gY29uc3RhbnQgaW5pdGlhbGl6ZXIKLSAgICAqIFtUSFJJRlQtMTQ1MF0gLSBQcm9ibGVtcyBidWlsZGluZyB0aHJpZnQgMC44LjAgZm9yIFB5dGhvbiBhbmQgUnVieQotICAgICogW1RIUklGVC0xNDQ5XSAtIFJ1YnkgY2xpZW50IGRvZXMgbm90IHdvcmsgb24gc29sYXJpcyAoPykKLSAgICAqIFtUSFJJRlQtMTQ0N10gLSBOdWxscG9pbnRlckV4Y2VwdGlvbiBpbiBQcm9jZXNzRnVuY3Rpb24uY2xhc3MgOmluICJvbmV3YXkiIG1ldGhvZAotICAgICogW1RIUklGVC0xNDMzXSAtIFRTZXJ2ZXJTb2NrZXQgZml4IGZvciBNU1ZDCi0gICAgKiBbVEhSSUZULTE0MjldIC0gVGhlIG5vbmJsb2NraW5nIHNlcnZlcnMgaXMgc3VwcG9zZWQgdG8gdXNlIFRyYW5zcG9ydEZhY3RvcnkgdG8gcmVhZCB0aGUgZGF0YQotICAgICogW1RIUklGVC0xNDI3XSAtIFBIUCBsaWJyYXJ5IHVzZXMgbm9uLW11bHRpYnl0ZSBzYWZlIGZ1bmN0aW9ucyB3aXRoIG1ic3RyaW5nIGZ1bmN0aW9uIG92ZXJsb2FkaW5nCi0gICAgKiBbVEhSSUZULTE0MjFdIC0gRGViaWFuIFBhY2thZ2VzIGNhbiBub3QgYmUgYnVpbHQKLSAgICAqIFtUSFJJRlQtMTM5NF0gLSBUcmVhdG1lbnQgb2Ygb3B0aW9uYWwgZmllbGRzIGlzIG5vdCBjb25zaXN0ZW50IGJldHdlZW4gQysrIGFuZCBKYXZhCi0gICAgKiBbVEhSSUZULTE1MTFdIC0gU2VydmVyIHdpdGggb25ld2F5IHN1cHBvcnQgKCBKQVZBICkKLSAgICAqIFtUSFJJRlQtMTQ5Nl0gLSBQSFAgY29tcGlsZXIgbm90IG5hbWVzcGFjaW5nIGVudW1zCi0gICAgKiBbVEhSSUZULTE0OTVdIC0gUEhQIFRlc3RDbGllbnQgZmF0YWxzIG9uIG1pc3NpbmcgY2xhc3MKLSAgICAqIFtUSFJJRlQtMTUwOF0gLSBUU2VydmVyU29ja2V0IGRvZXMgbm90IGFsbG93IGZvciB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBJUCBhZGRyZXNzIHRvIGJpbmQgdG8KLSAgICAqIFtUSFJJRlQtMTUwNF0gLSBDb2NvYSBHZW5lcmF0b3Igc2hvdWxkIHVzZSBsb2NhbCBmaWxlIGltcG9ydHMgZm9yIGJhc2UgVGhyaWZ0IGhlYWRlcnMKLSAgICAqIFtUSFJJRlQtMTUxMl0gLSBUaHJpZnQgc29ja2V0IHN1cHBvcnQgZm9yIFdpbmRvd3MgWFAKLSAgICAqIFtUSFJJRlQtMTUwMl0gLSBUU2ltcGxlU2VydmVyOjpzZXJ2ZSgpOiBEbyBub3QgcHJpbnQgb3V0IGVycm9yIG1lc3NhZ2UgaWYgc2VydmVyIHdhcyBzdG9wcGVkLgotICAgICogW1RIUklGVC0xNTAxXSAtIFBIUCBvbGQgbmFtZXNwYWNlcyBub3QgZ2VuZXJhdGVkIGZvciBlbnVtcwotICAgICogW1RIUklGVC0xNDgzXSAtIGphdmEgY29tcGlsZXIgZG9lcyBub3QgZ2VuZXJhdGUgdHlwZSBwYXJhbWV0ZXJzIGZvciBzZXJ2aWNlcyBpbiBleHRlbmRlZCBjbGF1c2VzCi0gICAgKiBbVEhSSUZULTE0NzldIC0gQ29tcGlsZWQgUEhQIHByb2Nlc3MgZnVuY3Rpb25zIG1pc3Npbmcgd3JpdGVNZXNzYWdlRW5kKCkKLSAgICAqIFtUSFJJRlQtMTQ5Ml0gLSBlbmFibGluZyBjX2dsaWIgcmVuZGVyIHRocmlmdCB1bnVzYWJsZSAoZXZlbiBmb3IgQysrIGNvZGUpCi0gICAgKiBbVEhSSUZULTE0OTFdIC0gVW5pbml0aWFsaXplIHByb2Nlc3NvckZhY3RvcnlfIG1lbWJlciBpbiBUU2VydmVyLmgKLSAgICAqIFtUSFJJRlQtMTQ3NV0gLSBJbmNvbXBsZXRlIHJlY29yZHMgZ2VuZXJhdGlvbiBmb3IgRXJsYW5nCi0gICAgKiBbVEhSSUZULTE0ODZdIC0gSmF2YXNjcmlwdCBtYW51YWwgdGVzdHNlcnZlciBub3QgcmV0dXJuaW5nIGNvbnRlbnQgdHlwZXMKLSAgICAqIFtUSFJJRlQtMTQ4OF0gLSBzcmMvY29uY3VycmVuY3kvVGhyZWFkLmg6OTE6NTg6IGVycm9yOiBpbnZhbGlkIGNvbnZlcnNpb24gZnJvbSAncHRocmVhZF90IHtha2EgX29wYXF1ZV9wdGhyZWFkX3QqfScgdG8gJ2FwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkOjppZF90IHtha2EgbG9uZyBsb25nIHVuc2lnbmVkIGludH0nIFstZnBlcm1pc3NpdmVdCi0gICAgKiBbVEhSSUZULTE0OTBdIC0gV2luZG93cy1zcGVjaWZpYyBoZWFkZXIgZmlsZXMgLSBmaXhlcyAmIHR3ZWFrcwotICAgICogW1RIUklGVC0xNTI2XSAtIFVuaW9uIFR1cGxlU2NoZW1lRmFjdG9yeSByZXR1cm5zIFN0YW5kYXJkU2NoZW1lcwotICAgICogW1RIUklGVC0xNTI3XSAtIEdlbmVyYXRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0dXBsZVJlYWRTdHJ1Y3QgaW4gdW5pb25zIHJldHVybiBudWxsIHdoZW4gdGhlIHNldGZpZWxkIGlzIHVucmVjb2duaXplZAotICAgICogW1RIUklGVC0xNTI0XSAtIFROb25CbG9ja2luZ1NlcnZlciBkb2VzIG5vdCBjb21waWxlIGluIFZpc3VhbCBTdHVkaW8gMjAxMAotICAgICogW1RIUklGVC0xNTI5XSAtIFR1cGxlUHJvdG9jb2wgY2FuIHVuaW50ZW50aW9uYWxseSBpbmNsdWRlIGFuIGV4dHJhIGJ5dGUgaW4gYml0IHZlY3RvcnMgd2hlbiBudW1iZXIgb2Ygb3B0aW9uYWwgZmllbGRzIGlzIGFuIGludGVncmFsIG9mIDgKLSAgICAqIFtUSFJJRlQtMTQ3M10gLSBKU09OIGNvbnRleHQgc3RhY2sgbWF5IGJlIGxlZnQgaW4gYW4gaW5jb3JyZWN0IHN0YXRlIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCi0gICAgKiBbVEhSSUZULTE0NTZdIC0gU3lzdGVtLk5ldC5IdHRwV2ViUmVxdWVzdCcgZG9lcyBub3QgY29udGFpbiBhIGRlZmluaXRpb24gZm9yICdQcm94eScKLSAgICAqIFtUSFJJRlQtMTQ2OF0gLSBNZW1vcnkgbGVhayBpbiBUU2FzbFNlcnZlclRyYW5zcG9ydAotICAgICogW1RIUklGVC0xNDYxXSAtIFJlY2VudCBUTm9uYmxvY2tpbmdTZXJ2ZXIgY2hhbmdlcyBicm9rZSAtLWVuYWJsZS1ib29zdHRocmVhZHM9eWVzLCBXaW5kb3dzCi0gICAgKiBbVEhSSUZULTE0NjBdIC0gd2h5IG5vdCBhZGQgdW5pY29kZSBzdHJpbmdzIHN1cHBvcnQgdG8gcHl0aG9uIGRpcmVjdGx5PwotICAgICogW1RIUklGVC0xNDY0XSAtIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuRnJhbWVCdWZmZXIgVE5vbmJsb2NraW5nVHJhbnNwb3J0IGFjY2Vzc29yIGNoYW5nZWQgZnJvbSBwdWJsaWMgdG8gcHJpdmF0ZQotICAgICogW1RIUklGVC0xNDY3XSAtIFBvc3NpYmxlIEFWIHdpdGggZW1wdHkgc3RyaW5ncyB3aGVuIHVzaW5nIEpTT04gcHJvdG9jb2wKLSAgICAqIFtUSFJJRlQtMTUyM10gLSBjbGllbnRUaW1lb3V0IG5vdCB3b3JrZWQgYXMgZXhwZWN0ZWQgaW4gVFNlcnZlclNvY2tldCBjcmVhdGVkIGJ5IFRTU0xUcmFuc3BvcnRGYWN0b3J5Ci0gICAgKiBbVEhSSUZULTE1MzddIC0gVEZyYW1lZFRyYW5zcG9ydCBpc3N1ZXMKLSAgICAqIFtUSFJJRlQtMTUxOV0gLSBUaGlyZnQgQnVpbGQgRmFpbHVyZSByZWZlcmVuY2luZyByYl9pbnRlcm4yIHN5bWJvbAotICAgICogW1RIUklGVC0xNTE4XSAtIEdlbmVyYXRlZCBDKysgY29kZSBvbmx5IHNlbmRzIHRoZSBmaXJzdCBvcHRpb25hbCBmaWVsZCBpbiB0aGUgd3JpdGUoKSBmdW5jdGlvbiBmb3IgYSBzdHJ1Y3QuCi0gICAgKiBbVEhSSUZULTE1MTVdIC0gTmFtZUVycm9yOiBnbG9iYWwgbmFtZSAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyBpcyBub3QgZGVmaW5lZAotICAgICogW1RIUklGVC0xNTU0XSAtIEluaGVyaXRlZCBzZXJ2aWNlIG1ldGhvZHMgYXJlIG5vdCByZXNvbHZlZCBpbiBkZXJpdmVkIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zCi0gICAgKiBbVEhSSUZULTE1NTNdIC0gdGhyaWZ0IG5vZGVqcyBzZXJ2aWNlIHNpZGUgY2FuJ3QgcmVhZCBtYXAgc3RydWN0dXJlLCBrZXkgYXMgZW51bSwgdmFsdWUgYXMgT2JqZWN0Ci0gICAgKiBbVEhSSUZULTE1NzVdIC0gVHlwbyBpbiBzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaAotICAgICogW1RIUklGVC0xMzI3XSAtIEZpeCBTcGVjIFN1aXRlIHVuZGVyIFJ1YnktMS44LjcgKHdvcmtzIGZvciBNUkkgUnVieS0xLjkuMikKLSAgICAqIFtUSFJJRlQtMTMyNl0gLSBvbiBzb21lIHBsYXRmb3JtcywgI2luY2x1ZGUgPHN0ZGludC5oPiBpcyBuZWNlc3NhcnkgdG8gYmUgaW5jbHVkZWQgaW4gVGhyaWZ0LmgKLSAgICAqIFtUSFJJRlQtMTE1OV0gLSBUSHR0cENsaWVudC0+Rmx1c2goKSBpc3N1ZSAoY29ubmVjdGlvbiB0aHJ1IHByb3h5KQotICAgICogW1RIUklGVC0xMjc3XSAtIE5vZGUuanMgc2VyaWFsaXplcyBmYWxzZSBib29sZWFucyBhcyBudWxsCi0gICAgKiBbVEhSSUZULTEyMjRdIC0gQ2Fubm90IGluc2VydCBVVEYtOCB0ZXh0Ci0gICAgKiBbVEhSSUZULTEyNjddIC0gTm9kZS5qcyBjYW4ndCB0aHJvdyBleGNlcHRpb25zLgotICAgICogW1RIUklGVC0xMzM4XSAtIERvIG5vdCB1c2UgYW4gdW5wYXRjaGVkIGF1dG9jb25mIDIuNjUgdG8gZ2VuZXJhdGUgcmVsZWFzZSB0YXJiYWxsCi0gICAgKiBbVEhSSUZULTExMjhdIC0gTUFDIE9TIFg6IHRocmlmdC5oIGluY29tcGF0aWJpbGl0eSB3aXRoIFRocmlmdC5oCi0gICAgKiBbVEhSSUZULTE2MzFdIC0gRml4IEMrKyBzZXJ2ZXIgY29uc3RydWN0b3IgdHlwb3MKLSAgICAqIFtUSFJJRlQtMTYwMl0gLSBQSFAgQyBFeHRlbnNpb24gaXMgbm90IENvbXBhdGlibGUgd2l0aCBQSFAgNS40Ci0gICAgKiBbVEhSSUZULTE2MTBdIC0gSVdlYlByb3h5IG5vdCBhdmFpbGFibGUgb24gV1A3IHBsYXRmb3JtCi0gICAgKiBbVEhSSUZULTE2MDZdIC0gUmFjZSBjb25kaXRpb24gaW4gQm9vc3RUaHJlYWRGYWN0b3J5LmNwcAotICAgICogW1RIUklGVC0xNjA0XSAtIFB5dGhvbiBleGNlcHRpb24gaGFuZGVsaW5nIGZvciBjaGFuZ2VzIGZyb20gUEVQIDMxMTAKLSAgICAqIFtUSFJJRlQtMTYwN10gLSBJbmNvcnJlY3QgZmlsZSBtb2RlcyBmb3Igc2V2ZXJhbCBzb3VyY2UgZmlsZXMKLSAgICAqIFtUSFJJRlQtMTU4M10gLSBjX2dsaWIgbGVha3MgbWVtb3J5Ci0gICAgKiBbVEhSSUZULTE1ODJdIC0gQmFkIGluY2x1ZGVzIG9mIG5lc3RlZCB0aHJpZnQgZmlsZXMgaW4gY19nbGliCi0gICAgKiBbVEhSSUZULTE1NzhdIC0gQ19HTGliIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IGNvbXBpbGUKLSAgICAqIFtUSFJJRlQtMTU5N10gLSBUSlNPTlByb3RvY29sLnBocCBpcyBtaXNzaW5nIGZyb20gTWFrZWZpbGUuYW0KLSAgICAqIFtUSFJJRlQtMTU5MV0gLSBFbmFibGUgVENQX05PREVMQVkgZm9yIHJ1YnkgZ2VtCi0gICAgKiBbVEhSSUZULTE2MjRdIC0gSXNzZXQgR2VuZXJhdGVkIGRpZmZlcmVudGx5IG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMKLSAgICAqIFtUSFJJRlQtMTYyMl0gLSBJbmNvcnJlY3Qgc2l6ZSByZXR1cm5lZCBvbiByZWFkCi0gICAgKiBbVEhSSUZULTE2MjFdIC0gTWVtb3J5IGxlYWtzCi0gICAgKiBbVEhSSUZULTE2MTJdIC0gQmFzZTY0IGVuY29kaW5nIGlzIGJyb2tlbgotICAgICogW1RIUklGVC0xNjI3XSAtIGNvbXBpbGVyIGJ1aWx0IHVzaW5nIGNvbXBpbGVycy52Y3hwcm9qIGNhbm5vdCBiZSB1c2VkIHRvIGJ1aWxkIHNvbWUgdGVzdCAudGhyaWZ0IGZpbGVzCi0gICAgKiBbVEhSSUZULTE1NzFdIC0gVXBkYXRlIFJ1YnkgSFRUUCB0cmFuc3BvcnQgZm9yIHJlY2VudCBSdWJ5IHZlcnNpb25zCi0gICAgKiBbVEhSSUZULTEwMjNdIC0gVGhyaWZ0IGVuY29kaW5nICAoVVRGLTgpIGlzc3VlIHdpdGggUnVieSAxLjkuMgotICAgICogW1RIUklGVC0xMDkwXSAtIERvY3VtZW50IHRoZSBnZW5lcmF0aW9uIG9mIGEgZmlsZSBjYWxsZWQgIkNvbnN0YW50cy5qYXZhIgotICAgICogW1RIUklGVC0xMDgyXSAtIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0IHNvbWV0aW1lcyBjYWxscyBjbG9zZSgpIG9uIGFuIHVuZGVmaW5lZCB2YWx1ZQotICAgICogW1RIUklGVC05NTZdIC0gUHl0aG9uIG1vZHVsZSdzIHZlcnNpb24gbWV0YS1kYXRhIHNob3VsZCBiZSB1cGRhdGVkCi0gICAgKiBbVEhSSUZULTk3M10gLSBDb2NvYSBsaWJyYXJ5IHdvbid0IGNvbXBpbGUgdXNpbmcgY2xhbmcKLSAgICAqIFtUSFJJRlQtMTYzMl0gLSBydWJ5OiBkYXRhIGNvcnJ1cHRpb24gaW4gdGhyaWZ0X25hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBNZW1vcnlCdWZmZXJUcmFuc3BvcnQKLSAgICAqIFtUSFJJRlQtMTY2NV0gLSBUQmluYXJ5UHJvdG9jb2w6IGV4Y2VlZGVkIG1lc3NhZ2UgbGVuZ3RoIHJhaXNlcyBnZW5lcmljIFRFeGNlcHRpb24KLSAgICAqIFtUSFJJRlQtMTY2NF0gLSBSZWZlcmVuY2UgdG8gbm9uLWV4aXN0aW5nIHZhcmlhYmxlIGluIGJ1aWxkIHNjcmlwdAotICAgICogW1RIUklGVC0xNjYzXSAtIEphdmEgVGhyaWZ0IHNlcnZlciBpcyBub3QgdGhyb3dpbmcgZXhjZXB0aW9ucwotICAgICogW1RIUklGVC0xNjYyXSAtICJyZW1vdmVPYmplY3Q6IiBzaG91bGQgYmUgInJlbW92ZU9ic2VydmVyOiIgaW4gWy1UU29ja2V0U2VydmVyIGRlYWxsb2NdPwotICAgICogW1RIUklGVC0xNjQzXSAtIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjayBpbiBUQmluYXJ5UHJvdG9jb2wucmVhZFN0cmluZwotICAgICogW1RIUklGVC0xNjc0XSAtIFVwZGF0ZSBUaHJpZnQgRCBsaWJyYXJ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCAyLjA2MAotICAgICogW1RIUklGVC0xNjczXSAtIFJ1YnkgY29tcGlsZSBmbGFncyBmb3IgZXh0ZW5zaW9uIGZvciBtdWx0aSBhcmNoIGJ1aWxkcyAob3MgeCkKLSAgICAqIFtUSFJJRlQtMTY1NV0gLSBDb25maWd1cmUgc3RpbGwgdHJ5aW5nIHRvIHVzZSB0aHJpZnRfZ2VuZXJhdG9ycyBpbiBvdXRwdXQKLSAgICAqIFtUSFJJRlQtMTY1NF0gLSBjX2dsaWIgdGhyaWZ0X3NvY2tldF9yZWFkKCkgcmV0dXJucyBjb3JydXB0ZWQgZGF0YQotICAgICogW1RIUklGVC0xNjUzXSAtIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGxlYWtzIENMT1NFX1dBSVQgc29ja2V0cwotICAgICogW1RIUklGVC0xNjU4XSAtIEphdmEgdGhyaWZ0IHNlcnZlciBpcyBub3QgdGhyb3dpbmcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uCi0gICAgKiBbVEhSSUZULTE2NTZdIC0gU2V0dGluZyBwcm9wZXIgaGVhZGVycyBpbiBUSHR0cFNlcnZlci5jcHAgc28gdGhhdCAiQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmciIG9uIGpzIGNsaWVudCBjYW4gd29yay4KLSAgICAqIFtUSFJJRlQtMTY1Ml0gLSBUU2FzbFRyYW5zcG9ydCBkb2VzIG5vdCBsb2cgdGhlIGVycm9yIHdoZW4ga2VyYmVyb3MgYXV0aCBmYWlscwotICAgICogW1RIUklGVC0yMjcyXSAtIENMT05FIC0gRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrIGluIFRCaW5hcnlQcm90b2NvbC5yZWFkU3RyaW5nCi0gICAgKiBbVEhSSUZULTIwODZdIC0gSW52YWxpZCBnZW5lcmF0ZWQgY29kZSBmb3IgTm9kZS5KUyB3aGVuIHVzaW5nIG5hbWVzcGFjZXMKLSAgICAqIFtUSFJJRlQtMTY4Nl0gLSB0X3BocF9nZW5lcmF0b3IuY2MgdXNlcyAiYW5kIiBpbnN0ZWFkIG9mICImJiIsIGFuZCBjYXVzZXMgY29tcGlsZXIgZXJyb3JzIHdpdGggVmlzdWFsIFN0dWRpbwotICAgICogW1RIUklGVC0xNjkzXSAtIGxpYnRocmlmdCBoYXMgZGVwZW5kZW5jeSBvbiB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIGh0dHBjb3JlCi0gICAgKiBbVEhSSUZULTE2ODldIC0gZG9uJ3QgZXhpdCgtMSkgaW4gVE5vbmJsb2NraW5nU2VydmVyCi0gICAgKiBbVEhSSUZULTE2NzldIC0gTm9kZUpTOiBwcm90b2NvbCByZWFkU3RyaW5nKCkgc2hvdWxkIHRyZWF0IHN0cmluZyBhcyB1dGY4LCBub3QgYmluYXJ5Ci0gICAgKiBbVEhSSUZULTE3MjFdIC0gRGlzdCBicm9rZW4gZHVlIHRvIDAuOC4wIHRvIDAuOS4wIGNoYW5nZXMKLSAgICAqIFtUSFJJRlQtMTcxMF0gLSBNaW5vciBpc3N1ZXMgaW4gdGVzdCBjYXNlIGNvZGUKLSAgICAqIFtUSFJJRlQtMTcwOV0gLSBXYXJuaW5nICJCaXR3aXNlLW9yIG9wZXJhdG9yIHVzZWQgb24gYSBzaWduLWV4dGVuZGVkIG9wZXJhbmQ7IGNvbnNpZGVyIGNhc3RpbmcgdG8gYSBzbWFsbGVyIHVuc2lnbmVkIHR5cGUgZmlyc3QiIGluIFRCaW5hcnlQcm90b2NvbC5jcyBhdCBSZWFkSW50NjQoKQotICAgICogW1RIUklGVC0xNzA3XSAtIFtydWJ5XSBBZGp1c3Qgc2VydmVyX3NwZWMucmIgZm9yIFJTcGVjIDIuMTEueCBhbmQgUnVieSAxLjkuMwotICAgICogW1RIUklGVC0xNjcxXSAtIENvY29hIGNvZGUgZ2VuZXJhdG9yIGRvZXMgbm90IHB1dCBrZXl3b3JkcyBpbnRvIGdlbmVyYXRlZCBtZXRob2QgY2FsbHMKLSAgICAqIFtUSFJJRlQtMTY3MF0gLSBJbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBhIFRocmlmdCBpbnRlcmZhY2UKLSAgICAqIFtUSFJJRlQtMTY2OV0gLSBOYW1lRXJyb3I6IGdsb2JhbCBuYW1lICdUQXBwbGljYXRpb25FeGNlcHRpb24nIGlzIG5vdCBkZWZpbmVkCi0gICAgKiBbVEhSSUZULTE2NjhdIC0gQ29tcGlsZSBlcnJvciBpbiBjb250cmliL2ZiMzAzLCB0aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKLSAgICAqIFtUSFJJRlQtMTg0NV0gLSBGaXggY29tcGlsZXIgd2FybmluZyBjYXVzZWQgYnkgaW1wbGljaXQgc3RyaW5nIGNvbnZlcnNpb24gd2l0aCBYY29kZSA0LjYKLSAgICAqIFtUSFJJRlQtMzA0XSAtIEJ1aWxkaW5nIHRoZSBQeXRob24gbGlicmFyeSByZXF1aXJlcyBkZXZlbG9wbWVudCBoZWFkZXJzCi0gICAgKiBbVEhSSUZULTM2OV0gLSBzZXRzIGFuZCBtYXBzIGJyZWFrIGVxdWFsaXR5Ci0gICAgKiBbVEhSSUZULTU1Nl0gLSBSdWJ5IGNvbXBpbGVyIGRvZXMgbm90IGNvcnJlY3RseSByZWZlcnJlZCB0byB0b3AtbGV2ZWwgbW9kdWxlcyB3aGVuIGEgc3VibW9kdWxlIG1hc2tzIHRoZSB0b3AtbGV2ZWwgbmFtZQotICAgICogW1RIUklGVC00ODFdIC0gaW5kZW50YXRpb24gb2YgcnVieSBjbGFzc2VzIGlzIG9mZiBieSBhIGZldwotCi0jIyBJbXByb3ZlbWVudAotICAgICogW1RIUklGVC0xNDk4XSAtIEFsbG93IFRUaHJlYWRlZFBvb2xTZXJ2ZXIuQXJncyB0byBwYXNzIGEgRXhlY3V0b3JTZXJ2aWNlCi0gICAgKiBbVEhSSUZULTE0NDRdIC0gRnVuY3Rpb25SdW5uZXIgLSBhZGQgc3ludGFjdGljIHN1Z2FyIHRvIGNyZWF0ZSBzaGFyZWRfcHRycwotICAgICogW1RIUklGVC0xNDQzXSAtIGRlZmluZSBhIFRQcm9jZXNzb3IgaGVscGVyIGNsYXNzIHRvIGltcGxlbWVudCBwcm9jZXNzKCkKLSAgICAqIFtUSFJJRlQtMTQ0MV0gLSBHZW5lcmF0ZSBjb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMgZm9yIGV4Y2VwdGlvbiBjbGFzcyB0byBsZXQgaXQgdXBkYXRlIG1lc3NhZ2UgcHJvcGVydHkgYXV0b21hdGljYWxseS4KLSAgICAqIFtUSFJJRlQtMTUyMF0gLSBFbWJlZCB2ZXJzaW9uIG51bWJlciBpbiBlcmxhbmcgLmFwcCBmaWxlCi0gICAgKiBbVEhSSUZULTE0ODBdIC0gcHl0aG9uOiByZW1vdmUgdGFicywgYWRqdXN0IHdoaXRlc3BhY2UgYW5kIGFkZHJlc3MgUEVQOCB3YXJuaW5ncwotICAgICogW1RIUklGVC0xNDg1XSAtIFBlcmZvcm1hbmNlOiBwYXNzIGxhcmdlIGFuZC9vciByZWZjb3VudGVkIGFyZ3VtZW50cyBhcyAiY29uc3QiCi0gICAgKiBbVEhSSUZULTE0ODRdIC0gSW50cm9kdWNlIHBocHVuaXQgdGVzdCBzdWl0ZQotICAgICogW1RIUklGVC0xNTMyXSAtIFRoZSB0eXBlIHNwZWNpZmljYXRpb25zIGluIHRoZSBnZW5lcmF0ZWQgRXJsYW5nIGNvZGUgc2hvdWxkIGluY2x1ZGUgInVuZGVmaW5lZCIgd2hlcmUgaXQncyB1c2VkIGFzIGEgZGVmYXVsdCB2YWx1ZQotICAgICogW1RIUklGVC0xNTM0XSAtIFJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgRGVscGhpIGNvZGUgZ2VuZXJhdG9yLgotICAgICogW1RIUklGVC0xNDY5XSAtIEphdmEgaXNzZXQgc3BhY2Ugb3B0aW1pemF0aW9uCi0gICAgKiBbVEhSSUZULTE0NjVdIC0gVmlzaWJpbGl0eSBvZiBtZXRob2RzIGluIGdlbmVyYXRlZCBqYXZhIGNvZGUKLSAgICAqIFtUSFJJRlQtMTQ1M10gLSBEb24ndCBjaGFuZ2UgdHlwZXMgb2YgYXJndW1lbnRzIHdoZW4gc2VyaWFsaXppbmcgd2l0aCB0aHJpZnQgcGhwIGV4dGVuc2lvbgotICAgICogW1RIUklGVC0xNDUyXSAtIGdlbmVyYXRlIGEgc3dhcCgpIG1ldGhvZCBmb3IgYWxsIGdlbmVyYXRlZCBzdHJ1Y3RzCi0gICAgKiBbVEhSSUZULTE0NTFdIC0gRnJhbWVkVHJhbnNwb3J0OiBQcmV2ZW50IGluZmluaXRlIGxvb3Agd2hlbiB3cml0aW5nCi0gICAgKiBbVEhSSUZULTE1MjFdIC0gVHdvIHBhdGNoZXMgZm9yIG1vcmUgUGVyZm9ybWFuY2UKLSAgICAqIFtUSFJJRlQtMTU1NV0gLSBEZWxwaGkgdmVyc2lvbiBvZiB0aGUgdHV0b3JpYWwgY29kZQotICAgICogW1RIUklGVC0xNTM1XSAtIFdoeSB0aHJpZnQgZG9uJ3QgdXNlIHdyYXBwZWQgY2xhc3MgZm9yIG9wdGlvbmFsIGZpZWxkcyA/Ci0gICAgKiBbVEhSSUZULTEyMDRdIC0gUnVieSBhdXRvZ2VuZXJhdGVkIGZpbGVzIHNob3VsZCByZXF1aXJlICd0aHJpZnQnIGdlbQotICAgICogW1RIUklGVC0xMzQ0XSAtIFVzaW5nIHRoZSBodHRwYyBtb2R1bGUgZGlyZWN0bHkgcmF0aGVyIHRoYW4gdGhlIGRlcHJlY2F0ZWQgaHR0cCBsYXllcgotICAgICogW1RIUklGVC0xMzQzXSAtIG5vX2F1dG9faW1wb3J0IG1pbi8yIHRvIGF2b2lkIGNvbXBpbGUgd2FybmluZwotICAgICogW1RIUklGVC0xMzQwXSAtIEFkZCBzdXBwb3J0IG9mIEFSQyB0byBPYmplY3RpdmUtQwotICAgICogW1RIUklGVC0xNjExXSAtIEltcHJvdmVkIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdHlwZWRlZnMKLSAgICAqIFtUSFJJRlQtMTU5M10gLSBQYXNzIG9uIGVycm9ycyBsaWtlICJjb25uZWN0aW9uIGNsb3NlZCIgdG8gdGhlIGhhbmRsZXIgbW9kdWxlCi0gICAgKiBbVEhSSUZULTE2MTVdIC0gUEhQIE5hbWVzcGFjZQotICAgICogW1RIUklGVC0xNTY3XSAtIFRocmlmdC9jcHA6IEFsbG93IGFsdGVybmF0ZSBjbGFzc2VzIHRvIGJlIHVzZWQgZm9yCi0gICAgKiBbVEhSSUZULTEwNzJdIC0gTWlzc2luZyAtIChpZCkgaW5pdFdpdGhTaGFyZWRQcm9jZXNzb3IgaW4gVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaAotICAgICogW1RIUklGVC0xNjUwXSAtIFtydWJ5XSBVcGRhdGUgY2xlYW4gaXRlbXMgYW5kIHN2bjppZ25vcmUgZW50cmllcyBmb3IgT1MgWCBhcnRpZmFjdHMKLSAgICAqIFtUSFJJRlQtMTY2MV0gLSBbUEFUQ0hdIEFkZCAtLXdpdGgtcXQ0IGNvbmZpZ3VyZSBvcHRpb24KLSAgICAqIFtUSFJJRlQtMTY3NV0gLSBEbyB3ZSBoYXZlIGFueSBwbGFuIHRvIHN1cHBvcnQgc2NhbGE/Ci0gICAgKiBbVEhSSUZULTE2NDVdIC0gUmVwbGFjZSBPYmplY3QjdGVlIHdpdGggbW9yZSBjb252ZW50aW9uYWwgT2JqZWN0I3RhcCBpbiBzcGVjcwotICAgICogW1RIUklGVC0xNjQ0XSAtIFVwZ3JhZGUgUlNwZWMgdG8gMi4xMC54IGFuZCByZWZhY3RvciBzcGVjcyBhcyBuZWVkZWQKLSAgICAqIFtUSFJJRlQtMTY3Ml0gLSBNb25vVG91Y2ggKGFuZCBNb25vIGZvciBBbmRyb2lkKSBjb21wYXRpYmlsaXR5Ci0gICAgKiBbVEhSSUZULTE3MDJdIC0gYSB0aHJpZnQgbWFudWFsCi0gICAgKiBbVEhSSUZULTE2OTRdIC0gUmUtRW5hYmxlIHNlcmlhbGl6YXRpb24gZm9yIFdQNyBTaWx2ZXJsaWdodAotICAgICogW1RIUklGVC0xNjkxXSAtIFNlcmlhbGl6ZXIvZGVzZXJpYWxpemVyIHN1cHBvcnQgZm9yIERlbHBoaQotICAgICogW1RIUklGVC0xNjg4XSAtIFVwZGF0ZSBJREwgcGFnZSBtYXJrdXAKLSAgICAqIFtUSFJJRlQtMTcyNV0gLSBUdXRvcmlhbCB3ZWIgcGFnZXMgZm9yIERlbHBoaSBhbmQgQyMKLSAgICAqIFtUSFJJRlQtMTcxNF0gLSBbcnVieV0gRXhwbGljaXRseSBhZGQgQ1dEIHRvIFJ1YnkgdGVzdF9zdWl0ZXMucmIKLSAgICAqIFtUSFJJRlQtMzE3XSAtIElzc3VlcyB3aXRoIEphdmEgc3RydWN0IHZhbGlkYXRpb24KLSAgICAqIFtUSFJJRlQtMTY0XSAtIEJ1aWxkIHdlYiB0dXRvcmlhbCBvbiBJbmN1YmF0b3Igd2ViIHNpdGUKLSAgICAqIFtUSFJJRlQtNTQxXSAtIENvY29hIGNvZGUgZ2VuZXJhdG9yIGRvZXNuJ3QgcHV0IGtleXdvcmRzIGJlZm9yZSBhbGwgYXJndW1lbnRzLgotICAgICogW1RIUklGVC02ODFdIC0gVGhlIEhUTUwgZ2VuZXJhdG9yIGRvZXMgbm90IGhhbmRsZSBKYXZhRG9jIHN0eWxlIGNvbW1lbnRzIHZlcnkgd2VsbAotCi0jIyBOZXcgRmVhdHVyZQotICAgICogW1RIUklGVC0xNTAwXSAtIEQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugc3VwcG9ydAotICAgICogW1RIUklGVC0xNTEwXSAtIFRoZXJlIHNob3VsZCBiZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSnNvblByb3RvY29sIGZvciBydWJ5Ci0gICAgKiBbVEhSSUZULTExMTVdIC0gcHl0aG9uIFRCYXNlIGNsYXNzIGZvciBkeW5hbWljIChkZSlzZXJpYWxpemF0aW9uLCBhbmQgX19zbG90c19fIG9wdGlvbiBmb3IgbWVtb3J5IHNhdmluZ3MKLSAgICAqIFtUSFJJRlQtMTk1M10gLSBzdXBwb3J0IGZvciBhc3AubmV0IG12YyAzCi0KLSMjIFF1ZXN0aW9uCi0gICAgKiBbVEhSSUZULTEyMzVdIC0gSG93IGNvdWxkIEkgdXNlIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSB3aXRoVE5vbkJsb2NraW5nU2VydmVyCi0gICAgKiBbVEhSSUZULTEzNjhdIC0gVE5vbmJsb2NraW5nU2VydmVyIHVzYWdlCi0gICAgKiBbVEhSSUZULTEwNjFdIC0gUmVhZCBhbiBpbnZhbGlkIGZyYW1lIHNpemUgb2YgMC4gQXJlIHlvdSB1c2luZyBURnJhbWVkVHJhbnNwb3J0IG9uIHRoZSBjbGllbnQgc2lkZT8KLSAgICAqIFtUSFJJRlQtNDkxXSAtIFJpcHBpbmcgcmF3IHB0aHJlYWRzIG91dCBvZiBURmlsZVRyYW5zcG9ydCBhbmQgYXNzb2NpYXRlZCB0ZXN0IGlzc3VlcwotCi0jIyBTdWItdGFzawotICAgICogW1RIUklGVC0xNTk2XSAtIERlbHBoaTogVGVzdCBjbGllbnRzIHNob3VsZCBoYXZlIGEgcmV0dXJuIGNvZGVzIHRoYXQgcmVmbGVjdCB3aGV0aGVyIHRoZXkgc3VjY2VlZGVkIG9yIG5vdAotICAgICogW1RIUklGVC05ODJdIC0gamF2YW1lOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5Ci0gICAgKiBbVEhSSUZULTE3MjJdIC0gQyMgV1A3IEFzc2VtYmx5IGFkZGl0aW9uIGJlYWtzIG1vbm8gYnVpbGQKLSAgICAqIFtUSFJJRlQtMzM2XSAtIENvbXBhY3QgUHJvdG9jb2wgaW4gQyMKLQotIyMgVGVzdAotICAgICogW1RIUklGVC0xNjEzXSAtIEFkZCBjb2RlIGJhY2sgaW50byBlbXB0eSBzb3VyY2UgZmlsZSBUb1N0cmluZ1Rlc3QuamF2YQotICAgICogW1RIUklGVC0xNzE4XSAtIEluY29ycmVjdCBjaGVjayBpbiBURmlsZVRyYW5zcG9ydFRlc3QKLQotIyMgV2lzaAotICAgICogW1RIUklGVC0xNDYzXSAtIERlY291cGxlIFRocmlmdCBJREwgZnJvbSBnZW5lcmF0b3JzCi0gICAgKiBbVEhSSUZULTE0NjZdIC0gUHJvcGVyIERvY3VtZW50YXRpb24gZm9yIFRocmlmdCBDIEdsaWIKLSAgICAqIFtUSFJJRlQtMTUzOV0gLSBCdWlsZCBhbmQgZGlzdHJpYnV0ZSB0aGUgZmIzMDMgcHl0aG9uIGxpYnJhcmllcyBhbG9uZyB3aXRoIHRocmlmdAotICAgICogW1RIUklGVC0xNjg1XSAtIFBsZWFzZSBhZGQgImFlcmVvLmNvbSIgdG8gIlBvd2VyZWQgYnkgQXBhY2hlIFRocmlmdCIgbGlzdCBpbiBhYm91dCBwYWdlCi0gICAgKiBbVEhSSUZULTMzMF0gLSBUUHJvY2Vzc29yIC0gYWRkaXRpb25hbCBtZXRob2QgdG8gY2FsbGVkIHdoZW4gY29ubmVjdGlvbiBpcyBicm9rZW4KLQotCi0KLVRocmlmdCAwLjgKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIyBCdWcKLSAgICAqIFtUSFJJRlQtMTQzNl0gLSBwaXAgaW5zdGFsbCB0aHJpZnQgZmFpbHMgb24gV2luZG93cyB3aXRoICJVbmFibGUgdG8gZmluZCB2Y3ZhcnNhbGwuYmF0IgotICAgICogW1RIUklGVC0xNDMyXSAtIEphdmFzY3JpcHQgc3RydWN0IGNvbnN0YW50cyBkZWNsYXJlZCBpbiB0aGUgc2FtZSBmaWxlIGFzIHRoZWlyIHN0cnVjdCBkZWZpbml0aW9uIHdpbGwgY2F1c2UgYW4gZXJyb3IKLSAgICAqIFtUSFJJRlQtMTQyOF0gLSBzaGFyZWQudGhyZnQgZG9lcyBub3QgaW5jbHVkZSBuYW1lc3BhY2UgZm9yIHBocCwgc28gdGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlIGluY29ycmVjdCBuYW1lCi0gICAgKiBbVEhSSUZULTE0MjZdIC0gRGlzdCBwYWNrYWdlIG1pc3NpbmcgZmlsZXMgZm9yIHJlbGVhc2UgMC44Ci0gICAgKiBbVEhSSUZULTE0MjVdIC0gVGhlIE5vZGUgcGFja2FnZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXRlc3Qgbm9kZSAoMC42KSAmIG5wbSAoMS4wLjI3KQotICAgICogW1RIUklGVC0xNDE2XSAtIFB5dGhvbiBVbml0IHRlc3QgaXMgYnJva2VuIG9uIGNpCi0gICAgKiBbVEhSSUZULTE0MTldIC0gQWJzdHJhY3ROb25CbG9ja2luZ1NlcnZlciBkb2VzIG5vdCBjYXRjaCBlcnJvcnMgd2hlbiBpbnZva2luZyB0aGUgcHJvY2Vzc29yCi0gICAgKiBbVEhSSUZULTE0MjRdIC0gUnVieSBzcGVjcyBmYWlsIHdoZW4gcnVuIHdpdGggcmFrZQotICAgICogW1RIUklGVC0xNDIwXSAtIE5vbmJsb2NraW5nIGFuZCBIc0hhIHNlcnZlciBzaG91bGQgbWFrZSBzdXJlIHRvIGNsb3NlIGFsbCB0aGVpciBzb2NrZXQgY29ubmVjdGlvbnMgd2hlbiB0aGUgc2VsZWN0b3IgZXhpdHMKLSAgICAqIFtUSFJJRlQtMTQxM10gLSBHZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCByZWFkIE1hcEVuZCAvIExpc3RFbmQgLyBTZXRFbmQKLSAgICAqIFtUSFJJRlQtMTQwOV0gLSBOYW1lIGNvbmZsaWN0IGNoZWNrIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgZm9yIGV4Y2VwdGlvbiBvYmplY3QoRGVscGhpKS4KLSAgICAqIFtUSFJJRlQtMTQwOF0gLSBEZWxwaGkgVGVzdCBTZXJ2ZXI6IEV4Y2VwdGlvbiB0ZXN0IGNhc2UgZmFpbHMgZHVlIHRvIG5hbWluZyBjb25mbGljdCB3aXRoIGUubWVzc2FnZQotICAgICogW1RIUklGVC0xNDA3XSAtIFR5cG8gaW4gUHl0aG9uIHNvY2tldCBzZXJ2ZXIgY2F1c2VzIFRocmlmdCB0byBmYWlsIHdoZW4gd2UgZW5hYmxlIGEgZ2xvYmFsIHNvY2tldCB0aW1vdXQKLSAgICAqIFtUSFJJRlQtMTM5N10gLSBDSSBzZXJ2ZXIgZmFpbHMgZHVyaW5nIGJ1aWxkIGR1ZSB0byB1bnVzZWQgcGFyYW1ldGVycyBpbiBkZWxwaGkgZ2VuZXJhdG9yCi0gICAgKiBbVEhSSUZULTE0MDRdIC0gRGVscGhpIGNvbXBpbGVyIGdlbmVyYXRlcyBzdHJ1Y3QgcmVhZGVyIGNvZGUgd2l0aCBwcm9ibGVtLgotICAgICogW1RIUklGVC0xNDAwXSAtIFJ1YnkgbmF0aXZlIGV4dGVuc2lvbiBhYm9ydHMgd2l0aCBfX3N0YWNrX2Noa19mYWlsIGluIE9TWAotICAgICogW1RIUklGVC0xMzk5XSAtIE9uZSBvZiB0aGUgVFNlcnZlckltcGwuQ3JlYXRlIENUT1JzIGxhY2tzIGltcGxlbWVudGF0aW9uCi0gICAgKiBbVEhSSUZULTEzOTBdIC0gRGViaWFuIHBhY2thZ2VzIGJ1aWxkIGZpeCBmb3IgU3F1ZWV6ZSAoYnVpbGQgZnJvbSB0aGUgb2ZmaWNpYWwgIDAuNy4wIHRhcmJhbGwpCi0gICAgKiBbVEhSSUZULTEzOTNdIC0gVFRyYW5zcG9ydEV4Y2VwdGlvbidzIHRocm93biBmcm9tIFRIdHRwQ2xpZW50IGNvbnRhaW4gc3VwZXJmbHVvdXMgc2xhc2hlcyBpbiB0aGUgRXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAqIFtUSFJJRlQtMTM5Ml0gLSBFbmFibGluZyBib3RoIG5hbWVzcGFjZXMgYW5kIGF1dG9sb2FkaW5nIGluIGdlbmVyYXRlZCBQSFAgY29kZSB3b24ndCB3b3JrLgotICAgICogW1RIUklGVC0xNDA2XSAtIEJ1aWxkIGVycm9yIGFmdGVyIGFwcGx5aW5nIFRIUklGVC0xMzk1Ci0gICAgKiBbVEhSSUZULTE0MDVdIC0gRGVscGhpIGNvbXBpbGVyIGRvZXMgbm90IGdlbmVyYXRlcyBjb250YWluZXIgc2VyaWFsaXplciBwcm9wZXJseS4KLSAgICAqIFtUSFJJRlQtMTQxMV0gLSBqYXZhIGdlbmVyYXRvciBkb2VzIG5vdCBwcm92aWRlIHR5cGUgcGFyYW1ldGVyIGZvciBUQmFzZVByb2Nlc3NvcgotICAgICogW1RIUklGVC0xNDczXSAtIEpTT04gY29udGV4dCBzdGFjayBtYXkgYmUgbGVmdCBpbiBhbiBpbmNvcnJlY3Qgc3RhdGUgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbnMKLSAgICAqIFtUSFJJRlQtMTMzMV0gLSBSdWJ5IGxpYnJhcnkgZGVzZXJpYWxpemVzIGFuIGVtcHR5IG1hcCB0byBuaWwKLSAgICAqIFtUSFJJRlQtMTMzMF0gLSBQSFAgTmFtZXNwYWNlcyBubyBsb25nZXIgZ2VuZXJhdGVkCi0gICAgKiBbVEhSSUZULTEzMjhdIC0gVEJhc2VIZWxwZXIudG9TdHJpbmcoLi4uKSBhcHBlbmRzIEJ5dGVCdWZmZXIgZGF0YSBvdXRzaWRlIG9mIHZhbGlkIGJ1ZmZlciByYW5nZQotICAgICogW1RIUklGVC0xMzIyXSAtIE9DYW1sIGxpYiBmYWlsIHRvIGNvbXBpbGU6IFRocmlmdC5tbCBsaW5lIDMwNSwgaW50IHZzIGludDMyIG1pc21hdGNoCi0gICAgKiBbVEhSSUZULTExNDNdIC0gQnVpbGQgZG9lc24ndCBkZXRlY3QgY29ycmVjdCBhcmNoaXRlY3R1cmUgdHlwZSBvbiA2NGJpdCBvc3gKLSAgICAqIFtUSFJJRlQtMTIwNV0gLSBwb3J0IHNlcnZlciB1bmR1bHkgZnJhZ2lsZSB3aXRoIGFyYml0cmFyeSBpbnB1dAotICAgICogW1RIUklGVC0xMjc5XSAtIHR5cGUgc2V0IGlzIGhhbmRsZWQgaW5jb3JyZWN0bHkgd2hlbiB3cml0aW5nIG9iamVjdAotICAgICogW1RIUklGVC0xMjk4XSAtIFN0YW5kYXJkIHNjaGVtZSBkb2Vzbid0IHJlYWQgb3Igd3JpdGUgbWV0YWRhdGEgYWxvbmcgd2l0aCBmaWVsZCB2YWx1ZXMKLSAgICAqIFtUSFJJRlQtMTI2NV0gLSBDKysgY29udGFpbmVyIGRlc2VyaWFsaXplCi0gICAgKiBbVEhSSUZULTEyNjNdIC0gcHVibGlzaCBydWJ5IGNsaWVudCB0byBydWJ5Z2VtcwotICAgICogW1RIUklGVC0xMzg0XSAtIEphdmEgaGVscCBtZW51IG1pc3NpbmcgbmV3bGluZSBuZWFyIGphdmFtZSBmbGFnCi0gICAgKiBbVEhSSUZULTEzODJdIC0gQnVuZGxlIGluc3RhbGwgZG9lc25vdCB3b3JrIGJlY2F1c2UgdGhyaWZ0IGNyYXNoZXMKLSAgICAqIFtUSFJJRlQtMTM4MV0gLSBUaHJpZnQgQysrIGxpYnMgaGF2ZSBpbmNvcnJlY3RseSB2ZXJzaW9uZWQgbmFtZXMKLSAgICAqIFtUSFJJRlQtMTM1MF0gLSBHbyBsaWJyYXJ5IGNvZGUgZG9lcyBub3QgYnVpbGQgYXMgb2YgcjYwIChtb3N0IHJlY2VudCByZWxlYXNlKQotICAgICogW1RIUklGVC0xMzY1XSAtIFR1cGxlUHJvdG9jb2wjd3JpdGVCaXRTZXQgdW5pbnRlbnRpb25hbGx5IHdyaXRlcyBhIHZhcmlhYmxlIGxlbmd0aCBieXRlIGFycmF5Ci0gICAgKiBbVEhSSUZULTEzNTldIC0gLS1nZW4tY29iIGNwcDpjb2Jfc3R5bGUgZG9lcyBub3QgY29tcGlsZSBhbnltb3JlCi0gICAgKiBbVEhSSUZULTEzMTldIC0gTWlzbWF0Y2ggYmV0d2VlbiBob3cgYSB1bmlvbiByZWFkcyBhbmQgd3JpdGVzIGEgY29udGFpbmVyCi0gICAgKiBbVEhSSUZULTEzMDldIC0gbGliZmIzMDMtMC43LjAuamFyIG1pc3NpbmcgaW4gbWF2ZW4gcmVwb3NpdG9yeQotICAgICogW1RIUklGVC0xMjM4XSAtIFRocmlmdCBKUyBjbGllbnQgY2Fubm90IHJlYWQgbWFwIG9mIHN0cnVjdHVyZXMKLSAgICAqIFtUSFJJRlQtMTI1NF0gLSBDb2RlIGNhbid0IGJlIGNvbXBpbGVkIGFnYWluc3QgYSByZWd1bGFyIEpSRTogT2JqZWN0LmNsb25lKCkgb3ZlcnJpZGUgaGFzIGEgZGlmZmVyZW50IHJldHVybiB0eXBlCi0gICAgKiBbVEhSSUZULTEzNjddIC0gTWFjIE9TWCBidWlsZCBmYWlscyB3aXRoICJubyBzdWNoIGZpbGUgdG8gbG9hZCAtLSBzcGVjL3Jha2Uvc3BlY3Rhc2siCi0gICAgKiBbVEhSSUZULTEzNTVdIC0gUnVubmluZyBtYWtlIGluIGxpYi9yYiBkb2Vzbid0IGJ1aWxkIHRoZSBuYXRpdmUgZXh0ZW5zaW9ucwotICAgICogW1RIUklGVC0xMzcwXSAtIERlYmlhbiBwYWNrYWdpbmcgc2hvdWxkIEJ1aWxkLURlcGVuZCBvbiBsaWJnbGliMi4wLWRldgotICAgICogW1RIUklGVC0xMzQyXSAtIENvbXBpbGF0aW9uIHByb2JsZW0gb24gV2luZG93cyBvZiBmYXN0YmluYXJ5LmMKLSAgICAqIFtUSFJJRlQtMTM0MV0gLSBUUHJvdG9jb2wuaCBlbmRpYW4gZGV0ZWN0aW9uIHdyb25nIHdpdGggYm9vc3QKLSAgICAqIFtUSFJJRlQtMTU4M10gLSBjX2dsaWIgbGVha3MgbWVtb3J5Ci0gICAgKiBbVEhSSUZULTE1ODJdIC0gQmFkIGluY2x1ZGVzIG9mIG5lc3RlZCB0aHJpZnQgZmlsZXMgaW4gY19nbGliCi0gICAgKiBbVEhSSUZULTE1NzhdIC0gQ19HTGliIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IGNvbXBpbGUKLSAgICAqIFtUSFJJRlQtMTAyN10gLSAnbWFrZSAtaiAxNicgZmFpbHMgd2l0aCAidW50ZXJtaW5hdGVkICNpZmRlZiIgZXJyb3IKLSAgICAqIFtUSFJJRlQtMTEyMV0gLSBKYXZhIHNlcnZlciBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIGluIDAuNgotICAgICogW1RIUklGVC04NTddIC0gdGVzdHMgcnVuIGJ5ICJtYWtlIGluc3RhbGwiIGZhaWwgaWYgZ2VuZXJhdG9ycyBhcmUgZGlzYWJsZWQKLSAgICAqIFtUSFJJRlQtMzgwXSAtIFVzZSBzZXR1cHRvb2xzIGZvciBweXRob24gYnVpbGQKLQotIyMgRGVwZW5kZW5jeSB1cGdyYWRlCi0gICAgKiBbVEhSSUZULTEyNTddIC0gdGhyaWZ0J3MgZGVwZW5kZW5jeSBzY29wZSBvbiBqYXZheC5zZXJ2bGV0OnNlcnZsZXQtYXBpIHNob3VsZCBiZSAncHJvdmlkZWQnCi0KLSMjIEltcHJvdmVtZW50Ci0gICAgKiBbVEhSSUZULTE0NDVdIC0gbWlub3IgQysrIGdlbmVyYXRvciB2YXJpYWJsZSBjbGVhbnVwCi0gICAgKiBbVEhSSUZULTE0MzVdIC0gbWFrZSBURXhjZXB0aW9uLk1lc3NhZ2UgcHJvcGVydHkgY29uZm9ybWFudCB0byB0aGUgdXN1YWwgZXhwZWN0YXRpb25zCi0gICAgKiBbVEhSSUZULTE0MzFdIC0gUmVuYW1lICdzeXMnIG1vZHVsZSB0byAndXRpbCcKLSAgICAqIFtUSFJJRlQtMTM5Nl0gLSBEZXBoaSBnZW5lcmF0b3IgaGFzIGRlcGVuZGFjeSBvbiBib29zdCAxLjQyIGxhdGVyLgotICAgICogW1RIUklGVC0xMzk1XSAtIFBhdGNoIHRvIHByZXZlbnQgd2FybmluZ3MgZm9yIGludGVnZXIgdHlwZXMgaW4gc29tZSBjYXNlcwotICAgICogW1RIUklGVC0xMjc1XSAtICB0aHJpZnQ6IGFsd2F5cyBwcmVmaXggbmFtZXNwYWNlcyB3aXRoICIgOjoiCi0gICAgKiBbVEhSSUZULTEyNzRdIC0gIHRocmlmdDogZmFpbCBjb21waWxhdGlvbiBpZiBhbiB1bmV4cGVjdGVkIHRva2VuIGlzCi0gICAgKiBbVEhSSUZULTEyNzFdIC0gIHRocmlmdDogZml4IG1pc3NpbmcgbmFtZXNwYWNlIGluIGdlbmVyYXRlZCBsb2NhbAotICAgICogW1RIUklGVC0xMjcwXSAtICB0aHJpZnQ6IGFkZCAtLWFsbG93LW5lZy1rZXlzIGFyZ3VtZW50IHRvIGFsbG93Ci0gICAgKiBbVEhSSUZULTEzNDVdIC0gQWxsb3cgYnVpbGRpbmcgd2l0aG91dCB0ZXN0cwotICAgICogW1RIUklGVC0xMjg2XSAtIE1vZGVybml6ZSB0aGUgVGhyaWZ0IFJ1YnkgTGlicmFyeSBEZXYgRW52aXJvbm1lbnQKLSAgICAqIFtUSFJJRlQtMTI4NF0gLSAgdGhyaWZ0OiBmaXggcHJvY2Vzc29yIGluaGVyaXRhbmNlCi0gICAgKiBbVEhSSUZULTEyODNdIC0gIHRocmlmdDogd3JhcCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oKSB0byA4MAotICAgICogW1RIUklGVC0xMjgyXSAtIFVwZ3JhZGUgaHR0cGNsaWVudCB0byA0LjEuMiAoZnJvbSA0LjAuMSkKLSAgICAqIFtUSFJJRlQtMTI4MV0gLSAgYWRkIEBnZW5lcmF0ZWQgdG8gdGhlIGRvY2Jsb2NrCi0gICAgKiBbVEhSSUZULTEyODBdIC0gIFRocmlmdDogSW1wcm92ZSBNb25pdG9yIGV4Y2VwdGlvbi1mcmVlIGludGVyZmFjZXMKLSAgICAqIFtUSFJJRlQtMTI3OF0gLSBqYXZhZG9jIHdhcm5pbmdzIC0gY29tcGlsYXRpb24KLSAgICAqIFtUSFJJRlQtMTIyN10gLSBFcmxhbmcgaW1wbGVtZW50YXRpb24gb2YgdGhyaWZ0IEpTT04gcHJvdG9jb2wKLSAgICAqIFtUSFJJRlQtMTI5NV0gLSBEdXBsaWNhdGUgaW5jbHVkZSBpbiBUU29ja2V0LmNwcAotICAgICogW1RIUklGVC0xMjk0XSAtICB0aHJpZnQ6IGZpeCBsb2cgbWVzc2FnZSB0eXBvcyBpbiBUU2ltcGxlU2VydmVyCi0gICAgKiBbVEhSSUZULTEyOTNdIC0gIHRocmlmdDogaW1wcm92ZSBoYW5kbGluZyBvZiBleGNlcHRpb25zIHRocm93biBieQotICAgICogW1RIUklGVC0xMjkyXSAtICB0aHJpZnQ6IHNpbGVuY2UgbG9nIHNwZXcgZnJvbSBUVGhyZWFkZWRTZXJ2ZXIKLSAgICAqIFtUSFJJRlQtMTI4OF0gLSAgQWxsb3cgdHlwZWRlZmVkIGV4Y2VwdGlvbnMgaW4gdGhyb3dzIGNsYXVzZXMKLSAgICAqIFtUSFJJRlQtMTI5MF0gLSAgdGhyaWZ0OiBUTm9uYmxvY2tpbmdTZXJ2ZXI6IGNsZWFuIHVwIHN0YXRlIGluIHRoZQotICAgICogW1RIUklGVC0xMjg3XSAtICB0aHJpZnQ6IHN0YXJ0IHJlZmFjdG9yaW5nIHNvbWUgb2YgdGhlIEMrKyBwcm9jZXNzb3IKLSAgICAqIFtUSFJJRlQtMTI4OV0gLSAgdGhyaWZ0OiBpbXBsZW1lbnQgVE5vbmJsb2NraW5nU2VydmVyOjpzdG9wKCkKLSAgICAqIFtUSFJJRlQtMTMwNV0gLSAgdGhyaWZ0OiBtYWtlIFRDb25uZWN0aW9uIGEgcHJpdmF0ZSBpbm5lciBjbGFzcyBvZgotICAgICogW1RIUklGVC0xMzA0XSAtICBUTm9uYmxvY2tpbmdTZXJ2ZXI6IHBhc3MgaW4gdGhlIGNvbm5lY3Rpb24gY29udGV4dCB0bwotICAgICogW1RIUklGVC0xMzAyXSAtICB0aHJpZnQ6IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBzZW5kKCkgdGltZXMgb3V0IGluCi0gICAgKiBbVEhSSUZULTEzMDFdIC0gIHRocmlmdDogY29uc29saWRhdGUgY29tbW9uIGNvZGUgaW4gVE5vbmJsb2NraW5nU2VydmVyCi0gICAgKiBbVEhSSUZULTEzNzddIC0gYWJvcnQgUEhQIGRlc2VyaWFsaXphdGlvbiBvbiB1bmtub3duIGZpZWxkIHR5cGUKLSAgICAqIFtUSFJJRlQtMTM3OV0gLSBmaXggdW5pbml0aWFsaXplZCBlbnVtIHZhbHVlcyBpbiB0aHJpZnQgQysrIG9iamVjdHMKLSAgICAqIFtUSFJJRlQtMTM3Nl0gLSBNYWtlIHBvcnQgc3BlY2lmaWNhdGlvbiBvcHRpb24gaW4gdGhyaWZ0IHJlbW90ZQotICAgICogW1RIUklGVC0xMzc1XSAtIGZpeGVkIGEgaGV4IGNoYXIgY29udmVyc2lvbiBidWcgaW4gVEpTT05Qcm90b2NvbAotICAgICogW1RIUklGVC0xMzczXSAtIEZpeCB1c2VyLWRlZmluZWQgZXhjZXB0aW9uIGdlbmVyYXRpb24gaW4gdGhyaWZ0IChweXRob24pCi0gICAgKiBbVEhSSUZULTEzNjFdIC0gT3B0aW9uYWwgcmVwbGFjZW1lbnQgb2YgcHRocmVhZCBieSBib29zdDo6dGhyZWFkCi0gICAgKiBbVEhSSUZULTEzMjBdIC0gQ29uc2lzdGVuY3kgb2YgY29uZmlndXJlIGdlbmVyYXRlZCBjb25maWcuaAotICAgICogW1RIUklGVC0xMzE3XSAtICBSZW1vdmUgY29weSBjb25zdHJ1Y3RpYmlsaXR5IGZyb20KLSAgICAqIFtUSFJJRlQtMTMxNl0gLSAgdGhyaWZ0OiB1cGRhdGUgc2VydmVyIGNsYXNzZXMgdG8gYWNjZXB0Ci0gICAgKiBbVEhSSUZULTEzMTVdIC0gIHRocmlmdDogZ2VuZXJhdGUgc2VydmVyIGludGVyZmFjZSBmYWN0b3J5IGNsYXNzZXMKLSAgICAqIFtUSFJJRlQtMTMxNF0gLSAgdGhyaWZ0OiBhZGQgVFByb2Nlc3NvckZhY3RvcnkKLSAgICAqIFtUSFJJRlQtMTMzNV0gLSAgQWRkIGFjY2VwdCB0aW1lb3V0IHRvIFRTZXJ2ZXJTb2NrZXQKLSAgICAqIFtUSFJJRlQtMTMzNF0gLSAgQWRkIG1vcmUgaW5mbyB0byBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAqIFtUSFJJRlQtMTMzM10gLSAgTWFrZSBSV0d1YXJkIG5vdCBjb3B5YWJsZQotICAgICogW1RIUklGVC0xMzMyXSAtIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIGNsYXNzIHVzZXMgaGFyZCBjb2RlZCB2YWx1ZSBrZXlNYW5hZ2VyVHlwZTogU3VuWDUwOQotICAgICogW1RIUklGVC0xMjUxXSAtIEdlbmVyYXRlZCBqYXZhIGNvZGUgc2hvdWxkIGluZGljYXRlIHdoaWNoIGZpZWxkcyBhcmUgcmVxdWlyZWQgYW5kIHdoaWNoIGFyZSBvcHRpb25hbAotICAgICogW1RIUklGVC0xMzg3XSAtIEJ1aWxkIE1TVkMgbGlicmFyaWVzIHdpdGggQm9vc3QgVGhyZWFkcyBpbnN0ZWFkIG9mIFB0aHJlYWRzCi0gICAgKiBbVEhSSUZULTEzMzldIC0gRXh0ZW5kIFR1cGxlIFByb3RvY29sIHRvIFRVbmlvbnMKLSAgICAqIFtUSFJJRlQtMTAzMV0gLSBQYXRjaCB0byBjb21waWxlIFRocmlmdCBmb3IgdmMrKyA5LjAgYW5kIDEwLjAKLSAgICAqIFtUSFJJRlQtMTEzMF0gLSBBZGQgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBzeW1ib2xpYyBkZWZhdWx0IHZhbHVlIGZvciBvcHRpb25hbCBib29sZWFuCi0gICAgKiBbVEhSSUZULTExMjNdIC0gUGF0Y2ggdG8gY29tcGlsZSBUaHJpZnQgc2VydmVyIGFuZCBjbGllbnQgZm9yIHZjKysgOS4wIGFuZCAxMC4wCi0gICAgKiBbVEhSSUZULTM4Nl0gLSBNYWtlIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIHRoZSBQeXRob24gbGlicmFyeSB3aXRob3V0IHRoZSBleHRlbnNpb24KLQotIyMgTmV3IEZlYXR1cmUKLSAgICAqIFtUSFJJRlQtMTQwMV0gLSBKU09OLXByb3RvY29sIGZvciBEZWxwaGkgWEUgTGlicmFyaWVzCi0gICAgKiBbVEhSSUZULTExNjddIC0gSmF2YSBub25ibG9ja2luZyBzZXJ2ZXIgd2l0aCBtb3JlIHRoYW4gb25lIHRocmVhZCBmb3Igc2VsZWN0IGFuZCBoYW5kbGluZyBJTwotICAgICogW1RIUklGVC0xMzY2XSAtIERlbHBoaSBnZW5lcmF0b3IsIGxpcmJyYXJ5IGFuZCB1bml0IHRlc3QuCi0gICAgKiBbVEhSSUZULTEzNTRdIC0gQWRkIHJha2UgdGFzayB0byBidWlsZCBqdXN0IHRoZSBnZW0gZmlsZQotICAgICogW1RIUklGVC03NjldIC0gUGx1Z2dhYmxlIFNlcmlhbGl6ZXJzCi0KLSMjIFN1Yi10YXNrCi0gICAgKiBbVEhSSUZULTE0MTVdIC0gZGVscGhpOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5Ci0gICAgKiBbVEhSSUZULTEzOTFdIC0gSW1wcm92ZWQgRGVscGhpIFhFIHRlc3QgY2FzZXMKLQotCi0KLVRocmlmdCAwLjcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIyBCdWcKLSAgICAqIFtUSFJJRlQtMTE0MF0gLSBGcmFtZWQgVHJhbnNwb3J0IENsaWVudCB1c2luZyBDIChHbGliKSBMaWJyYXJ5IGhhbmdzIHdoZW4gY29ubmVjdGluZyB0byBSdWJ5IFNlcnZlcgotICAgICogW1RIUklGVC0xMTU0XSAtIEh0dHBDbGllbnQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgY29ubmVjdGlvbiBjbG9zZSBwYXJhbWV0ZXIKLSAgICAqIFtUSFJJRlQtMTE1M10gLSBIdHRwQ2xpZW50IGRvZXMgbm90IHNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gY2xvc2UgcGFyYW1ldGVyCi0gICAgKiBbVEhSSUZULTExNDldIC0gTm9uYmxvY2tpbmcgc2VydmVyIGZhaWxzIHdoZW4gY2xpZW50IGNvbm5lY3Rpb24gaXMgcmVzZXQKLSAgICAqIFtUSFJJRlQtMTE0Nl0gLSBBbmRyb2lkIEluY29tcGF0aWJpbGl0eSA6IGluIEFuZHJvaWQgPCAyLjMgamF2YS5pby5JT0V4Y2VwdGlvbiBkb2Vzbid0IHN1cHBvcnQgZm9yIFRocm93YWJsZSBwYXJhbWV0ZXIgaW4gY29uc3RydWN0b3IKLSAgICAqIFtUSFJJRlQtMTEzM10gLSBKYXZhIGFuZCBKYXZhU2NyaXB0IHR1dG9yaWFsIGlzIGJyb2tlbiBzaW5jZSB3ZSBoYXZlIEphdmEgbWF2ZW4gZGVwbG95bWVudAotICAgICogW1RIUklGVC0xMTMyXSAtIERlc2VyaWFsaXphdGlvbiBlcnJvciBpbiBUQXBwbGljYXRpb25FeGNlcHRpb24gQyMKLSAgICAqIFtUSFJJRlQtMTEzMV0gLSBDIyBKU09OIFByb3RvY29sIGlzIHVuYWJsZSB0byBkZWNvZGUgZXNjYXBlZCBjaGFyYWN0ZXJzIGluIHN0cmluZwotICAgICogW1RIUklGVC0xMjA4XSAtIHB5dGhvbiBUQ29tcGFjdFByb3RvY29sLnB5IHdyaXRlQm9vbCBhbmQgcmVhZEJvb2wgbm90IGZvbGxvdyB0aGUgY29tcGFjdC1wcm90by1zcGVjLTIudHh0IHNwZWMgZm9yIENPTlRBSU5FUl9XUklURSwgQ09OVEFJTkVSX1JFQUQKLSAgICAqIFtUSFJJRlQtMTIwMF0gLSBKUyBjb21waWxlciBnZW5lcmF0ZXMgY29kZSB0aGF0IGNsb2JiZXJzIGV4aXN0aW5nIG5hbWVzcGFjZXMKLSAgICAqIFtUSFJJRlQtMTE4M10gLSBQdXJlLXJ1YnkgQ29tcGFjdFByb3RvY29sIHJhaXNlcyBBcmd1bWVudEVycm9yIHdoZW4gZGVzZXJpYWxpemluZyB1bmRlciBSdWJ5IDEuOQotICAgICogW1RIUklGVC0xMTgyXSAtIE5hdGl2ZSBkZXNlcmlhbGl6ZXIgc2VnZmF1bHRzIG9uIGluY29ycmVjdCBsaXN0IGVsZW1lbnQgdHlwZQotICAgICogW1RIUklGVC0xMTgxXSAtIEFTMyBjb21waWxlciBnZW5lcmF0ZXMgaW5jb3JyZWN0IGNvZGUgZm9yIHNldHRpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gY29uc3RydWN0b3IKLSAgICAqIFtUSFJJRlQtMTIzNF0gLSB0aHJpZnQgLS1oZWxwIGlzIG1pc3NpbmcgZG9jIG9uIHB5OnV0ZjhzdHJpbmdzCi0gICAgKiBbVEhSSUZULTExODBdIC0gQVMzIGNvbXBpbGVyIGdlbmVyYXRlcyB1bmNvbXBpbGFibGUgY29kZSBmb3IgYmluYXJ5IHR5cGVzLgotICAgICogW1RIUklGVC0xMTk0XSAtIEphdmEgbGliIGRvZXMgbm90IGluc3RhbGwgYXJ0aWZhY3RzIHRvIGxvY2FsIGRpciBjb3JyZWN0bHkKLSAgICAqIFtUSFJJRlQtMTE5M10gLSBQb3RlbnRpYWwgaW5maW5pdGUgbG9vcCBpbiBub25ibG9ja2luZ19zZXJ2ZXIKLSAgICAqIFtUSFJJRlQtMTE5Ml0gLSBUeXBvOiBUUHJvdG9jb2wuaCB0ZXN0cyBmb3IgSEFWRV9TWVNfUEFSQU1fSF8KLSAgICAqIFtUSFJJRlQtMTE5MF0gLSByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQgaW4gVE5vbmJsb2NraW5nU2VydmVyLmphdmEgc2hvdWxkIGJlIEF0b21pY0xvbmcgdG8gZml4IEZEIGxlYWthZ2UgYW5kIGdlbmVyYWwgc2VydmVyIG1hbGZ1bmN0aW9uCi0gICAgKiBbVEhSSUZULTExODddIC0gbm9uYmxvY2tpbmdfc2VydmVyIHNodXRkb3duIHJhY2UgdW5kZXIgUnVieSAxLjkKLSAgICAqIFtUSFJJRlQtMTE3OF0gLSBKYXZhOiBUQmFzZSBzaWduYXR1cmUgc2hvdWxkIGJlIFQgZXh0ZW5kcyBUQmFzZTw/LD8+Ci0gICAgKiBbVEhSSUZULTExNjRdIC0gU2VnbWVudGF0aW9uIGZhdWx0IG9uIE5VTEwgcG9pbnRlciBpbiB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QKLSAgICAqIFtUSFJJRlQtMTE3MV0gLSBQZXJsIHdyaXRlL3JlYWREb3VibGUgYXNzdW1lcyBsaXR0bGUtZW5kaWFuIHBsYXRmb3JtCi0gICAgKiBbVEhSSUZULTEyMjJdIC0gVW5oYW5kbGVkIGV4Y2VwdGlvbiBmb3IgVEV2aHR0cFNlcnZlciByZXF1ZXN0Ci0gICAgKiBbVEhSSUZULTEyMjBdIC0gVFByb2Nlc3Nvcjo6cHJvY2VzcyBuZXZlciByZXR1cm5zIGZhbHNlCi0gICAgKiBbVEhSSUZULTEyODVdIC0gU3RhYmxlIDAuNy4wIFdpbmRvd3MgY29tcGlsZXIgZXhlIGF2YWlsYWJsZSBvbiB0aGUgd2Vic2lkZSBpcyBub3QgdGhlIGdvb2Qgb25lCi0gICAgKiBbVEhSSUZULTEyMThdIC0gY19nbGliIHVzZXMgd3JvbmcgbmFtZSBpbiBwa2ctY29uZmlnCi0gICAgKiBbVEhSSUZULTEyMTVdIC0gVW5kZWZpbmVkIHByb3BlcnR5IFRoaXJmdCBpbiBsaWIvanMvdGhyaWZ0LmpzCi0gICAgKiBbVEhSSUZULTEyMTFdIC0gV2hlbiB1c2luZyBUSHR0cENsaWVudCwgbm9uIDIwMCByZXNwb25zZXMgbGVhdmUgdGhlIGNvbm5lY3Rpb24gb3BlbgotICAgICogW1RIUklGVC0xMjI4XSAtIFRoZSBwaHAgYWNjZWxlcmF0b3IgbW9kdWxlIGNhbGxzIGZsdXNoIGluY29ycmVjdGx5Ci0gICAgKiBbVEhSSUZULTEzMDhdIC0gbGliZmIzMDMtMC43LjAuamFyIG1pc3NpbmcgaW4gbWF2ZW4gcmVwb3NpdG9yeQotICAgICogW1RIUklGVC0xMjU1XSAtIE1pc21hdGNoIG9mIG1ldGhvZCBuYW1lIGJldHdlZW4gSmF2YU1FJ3MgbGliIGFuZCBnZW5lcmF0ZWQgY29kZSAoY29tcGFyZVRvL2NvbXBhcmVPYmplY3RzKQotICAgICogW1RIUklGVC0xMjUzXSAtIENvZGUgZ2VuZXJhdGVkIGZvciBtYXBzIGlzIG5vdCBjb21waWxpbmcKLSAgICAqIFtUSFJJRlQtMTI1Ml0gLSBTZWdmYXVsdCBpbiBSdWJ5IGRlc2VyaWFsaXplcgotICAgICogW1RIUklGVC0xMDk0XSAtIGJ1ZyBpbiBUQ29tcGFjdFByb3RvIHB5dGhvbiByZWFkTWVzc2FnZUVuZCBtZXRob2QgYW5kIHVwZGF0ZWQgdGVzdCBjYXNlcwotICAgICogW1RIUklGVC0xMDkzXSAtIHNldmVyYWwgYnVncyBpbiBweXRob24gVENvbXBhY3RQcm90b2NvbAotICAgICogW1RIUklGVC0xMDkyXSAtIGdlbmVyYXRlZCB2YWxpZGF0ZSgpIG1ldGhvZCBoYXMgd3JvbmcgaW5kZW50YXRpb24KLSAgICAqIFtUSFJJRlQtMTAxMV0gLSBFcnJvciBnZW5lcmF0aW5nIHBhY2thZ2UgaW1wb3J0cyB3aGVuIHVzaW5nIGNsYXNzZXMgZnJvbSBvdGhlciBwYWNrYWdlcwotICAgICogW1RIUklGVC0xMDUwXSAtIERlY2xhcmluZyBhbiBhcmd1bWVudCBuYW1lZCAibWFuYWdlciIgdG8gYSBzZXJ2aWNlIG1ldGhvZCBwcm9kdWNlcyBjb2RlIHRoYXQgZmFpbHMgY29tcGlsZSBkdWUgdG8gbmFtZSBjb25mbGljdHMgd2l0aCBwcm90ZWN0ZWQgaXZhcnMgaW4gVEFzeW5jQ2xpZW50Ci0gICAgKiBbVEhSSUZULTEwNzRdIC0gLmtleXN0b3JlIGFuZCAudHJ1c3RzdG9yZSBhcmUgbWlzc2luZyBmcm9tIHRoZSAwLjYuMCBkaXN0cmlidXRpb24KLSAgICAqIFtUSFJJRlQtMTA2N10gLSBUb25zIG9mIGJ1Z3MgaW4gcGhwIGltcGxlbWVudGF0aW9uCi0gICAgKiBbVEhSSUZULTEwNjVdIC0gVW5leHBlY3RlZCBleGNlcHRpb25zIG5vdCBwcm9wZXIgaGFuZGxlZCBvbiBKUwotICAgICogW1RIUklGVC0xMDc2XSAtIEVybGFuZyBUaHJpZnQgc29ja2V0IHNlcnZlciBoYXMgYSBidWcgdGhhdCBjYXVzZXMgamF2YSB0aHJpZnQgY2xpZW50IG9mIGZyYW1lZCBiaW5hcnkgY2xpZW50IHRvIHRocm93ICJvdXQgb2Ygc2VxdWVuY2UiIGV4Y2VwdGlvbgotICAgICogW1RIUklGVC0xMDU3XSAtIGNhc3RzIGluIFRCaW5hcnlQcm90b2NvbC50Y2MgY2F1c2luZyAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIiB3YXJuaW5ncyBmcm9tIGdjYwotICAgICogW1RIUklGVC0xMDU1XSAtIGNzaGFycCBUU2VydmVyU29ja2V0IGFuZCBUU29ja2V0IGRvIG5vdCBkaXNhYmxlIE5hZ2xlIHZpYSBTb2NrZXQuTm9EZWxheSA9IHRydWUgbGlrZSBjcHAgYW5kIGphdmEgZG8KLSAgICAqIFtUSFJJRlQtMTA1NF0gLSBleHBsaWNpdCBjYWxsIHRvIFBLR19QUk9HX1BLR19DT05GSUcgaXMgbWlzc2luZyBhbmQgZmlyc3QgdXNlIG9mIFBLR19DSEVDS19NT0RVTEVTIG1heSBub3QgaGFwcGVuLCBjYXVzZXMgbW9ubyBkZXRlY3Rpb24gdG8gZmFpbAotICAgICogW1RIUklGVC0xMTE3XSAtIEphdmFTY3JpcHQgVW5pdCBUZXN0IGRvZXMgbm90IHdvcmsgYW55bW9yZSBiZWNhdXNlIGxpYnRocmlmdCouamFyIHdoZXJlIG1vdmVkIGJ5IE1hdmVuIERlcGxveW1lbnQKLSAgICAqIFtUSFJJRlQtMTExMV0gLSBUaGUgSFRNTCBnZW5lcmF0b3IgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBzdHJpbmcgYW5kIGJpbmFyeSB0eXBlcwotICAgICogW1RIUklGVC0xMDMyXSAtICJtYWtlIGRpc3QiIGZhaWxzIGR1ZSB0byBjX2dsaWIgcHJvYmxlbQotICAgICogW1RIUklGVC0xMDM2XSAtIEF1dG8tZ2VuZXJhdGVkIEMrKyBjb2RlIGZhaWxzIHRvIGNvbXBpbGUgd2l0aCAiLVdlcnJvciAtV2V4dHJhIC1XYWxsIiBnKysgY29tcGlsZXIgZmxhZ3MKLSAgICAqIFtUSFJJRlQtMTA0MV0gLSBURGVzZXJpYWxpemVyIGhvbGRzIG9udG8gYSByZWZlcmVuY2Ugb2YgdGhlIGFycmF5IGl0IHJlYWRzIGFmdGVyIGl0IGlzIGRvbmUgZGVzZXJpYWxpemluZwotICAgICogW1RIUklGVC0xMTA2XSAtIEMrKyBjb2RlIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmggJiBUQXN5bmNCdWZmZXJQcm9jZXNzb3IuaCBkb250IGhhdmUgdmlydHVhbCBmdW5jdGlvbnMgYnV0IG5vIHZpcnR1YWwgZGVzdHJ1Y3Rvci4gQ2F1c2VzIHdhcm5pbmdzIG9uIC1XYWxsCi0gICAgKiBbVEhSSUZULTExMDVdIC0gT0NhbWwgZ2VuZXJhdG9yIGRvZXMgbm90IHByZWZpeCBtZXRob2RzIG9mIGluY2x1ZGVkIHN0cnVjdHMgd2l0aCB0aGVpciB0eXBlCi0gICAgKiBbVEhSSUZULTExMDRdIC0gSU5TVEFMTERJUlMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGNvbmZpZ3VyZSBzY3JpcHQKLSAgICAqIFtUSFJJRlQtMTEwMl0gLSB0eXBvIGluIGNvbmZpZ3VyZS5hYzogIj09IiBvcGVyYXRvciBpbiAndGVzdCcgKGluc3RlYWQgb2YiJz0iKQotICAgICogW1RIUklGVC0xMTAxXSAtIGJ5dGVidWZmZXIgbGVuZ3RoIGNhbGN1bGF0aW9uIGluIFRCaW5hcnlQcm90b2NvbCB3cml0ZUJpbmFyeQotICAgICogW1RIUklGVC0xMDk4XSAtIFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGluIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkKLSAgICAqIFtUSFJJRlQtMTA4MV0gLSBQSFAgdGVzdHMgYnJva2VuIGFuZCBzb21ld2hhdCBpbmNvbXBsZXRlCi0gICAgKiBbVEhSSUZULTEwODBdIC0gZXJsYW5nIHRlc3QncyAnbWFrZScgZmFpbHMgb24gTWFjIE9TWAotICAgICogW1RIUklGVC0xMDc4XSAtIFRocmlmdFRlc3QudGhyaWZ0IGdlbmVyYXRlcyBpbnZhbGlkIFBIUCBsaWJyYXJ5Ci0gICAgKiBbVEhSSUZULTExMjBdIC0gcHJvdG8uV3JpdGVMaXN0RW5kIGJlaW5nIGNhbGxlZCBpbiB0aGUgd3JvbmcgcGxhY2UKLSAgICAqIFtUSFJJRlQtMTExOV0gLSBUSlNPTlByb3RvY29sIGZhaWxzIHRvIFVURjggZGVjb2RlIHN0cmluZ3MKLSAgICAqIFtUSFJJRlQtODY3XSAtIFBIUCBhY2NlbGVyYXRvciBtb2R1bGUncyBvdXRwdXQgdHJhbnNwb3J0IGlzIGluY29tcGF0aWJsZSB3aXRoIFRGcmFtZWRUcmFuc3BvcnQKLSAgICAqIFtUSFJJRlQtODI2XSAtIFBIUCBUU29ja2V0IFdyaXRlIFRpbWVvdXQKLSAgICAqIFtUSFJJRlQtODM1XSAtIEJhZCBBUzMgc3ludGF4IGluIGNvbnN0cnVjdG9ycyB0aGF0IHNldCBkZWZhdWx0IHZhbHVlcwotICAgICogW1RIUklGVC03ODhdIC0gdGhyaWZ0X3Byb3RvY29sLnNvOiBtdWx0aWdldC9tdWx0aWdldF9zbGljZSBkb2VzIG5vdCBoYW5kbGUgbW9yZSB0aGFuIDE3IGtleXMgY29ycmVjdGx5Ci0gICAgKiBbVEhSSUZULTEyNV0gLSBPQ2FtbCBsaWJyYXJpZXMgZG9uJ3QgY29tcGlsZSB3aXRoIDMyLWJpdCBvY2FtbAotICAgICogW1RIUklGVC0zNDJdIC0gUEhQOiBjYW4ndCBoYXZlIHNldHMgb2YgY29tcGxleCB0eXBlcwotICAgICogW1RIUklGVC03MzFdIC0gY29uZmlndXJlIGRvZXNuJ3QgY2hlY2sgZm9yIGFudCA+PSAxLjcKLSAgICAqIFtUSFJJRlQtNjkwXSAtIFVwZGF0ZSBUQXBwbGljYXRpb25FeGNlcHRpb24gY29kZXMKLSAgICAqIFtUSFJJRlQtNjM4XSAtIEJ1ZmZlcmVkVHJhbnNwb3J0ICsgQyBleHRlbnNpb25zIGJsb2NrIHVudGlsIHJlY3YgdGltZW91dCBpcyByZWFjaGVkIG9uIGxhc3QgZnJlYWQgY2FsbAotCi0jIyBEZXBlbmRlbmN5IHVwZ3JhZGUKLSAgICAqIFtUSFJJRlQtMTE3N10gLSBVcGRhdGUgdGhyaWZ0IHRvIHJlZmxlY3QgY2hhbmdlcyBpbiBHbydzIG5ldHdvcmtpbmcgbGlicmFyaWVzCi0KLSMjIEltcHJvdmVtZW50Ci0gICAgKiBbVEhSSUZULTExNTVdIC0gUmVtb3ZlIGxvZzRqIGRlcGVuZGVuY3kgZnJvbSBqYXZhIGNsaWVudAotICAgICogW1RIUklGVC0xMTUxXSAtIFByb2R1Y2UgbW9yZSBpbmZvcm1hdGl2ZSBydW50aW1lIGVycm9yIGluIGNhc2Ugb2Ygc2NoZW1hIGFuZCBkYXRhIG1pc21hdGNoIGR1cmluZyBzZXJpYWxpemF0aW9uCi0gICAgKiBbVEhSSUZULTEyMDddIC0gU3VwcG9ydCBERVNURElSIG9uICJtYWtlIGluc3RhbGwiIG9mIHJ1YnkgbGlicwotICAgICogW1RIUklGVC0xMTk5XSAtIFVuaW9uIHN0cnVjdHMgc2hvdWxkIGhhdmUgZ2VuZXJhdGVkIG1ldGhvZHMgdG8gdGVzdCB3aGV0aGVyIGEgc3BlY2lmaWMgZmllbGQgaXMgY3VycmVudGx5IHNldAotICAgICogW1RIUklGVC0xMjMzXSAtIFJlbW92ZSB1bnVzZWQgaW5jbHVkZSBpbiBnZW5lcmF0ZWQgQysrIGNvZGUKLSAgICAqIFtUSFJJRlQtMTE4OV0gLSBSdWJ5IGRlc2VyaWFsaXplciBzcGVlZCBpbXByb3ZlbWVudHMKLSAgICAqIFtUSFJJRlQtMTE3MF0gLSBUaHJpZnQgR2VuZXJhdGVkIENvZGUgYW5kIEphdmEgNQotICAgICogW1RIUklGVC0xMTc0XSAtIFB1Ymxpc2ggYXMzIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB2aWEgTWF2ZW4gZm9yIHVzZSBieSBmbGV4LW1vam9zIHVzZXJzCi0gICAgKiBbVEhSSUZULTEyMjVdIC0gVENvbXBhY3RQcm90b2NvbCBmb3IgUEhQCi0gICAgKiBbVEhSSUZULTEyMjFdIC0gUmVtb3ZlIFNpbXBsZUNhbGxiYWNrLmgKLSAgICAqIFtUSFJJRlQtMTIxN10gLSBVc2UgZXZ1dGlsX3NvY2tldHBhaXIgaW5zdGVhZCBvZiBwaXBlIChXaW5kb3dzIHBvcnQpCi0gICAgKiBbVEhSSUZULTEyMTZdIC0gYnVpbGQgSmF2YSBMaWJyYXJ5IGJlaGluZCBhIHByb3h5Ci0gICAgKiBbVEhSSUZULTEyMzFdIC0gUmVtb3ZlIGJvZ3VzIGluY2x1ZGUKLSAgICAqIFtUSFJJRlQtMTIxM10gLSBNZW1idWZmZXIgc2hvdWxkIHByb3ZpZGUgYSB3YXkgdG8gZ2V0IGJhY2sgdGhlIGJ1ZmZlcgotICAgICogW1RIUklGVC0xMjM3XSAtIEphdmEgZmIzMDMgbWlzc2luZyBzb21lIG1ldGhvZHMKLSAgICAqIFtUSFJJRlQtMTA2M10gLSBGaXggRXJsYW5nIFR1dG9yaWFsIEZpbGVzCi0gICAgKiBbVEhSSUZULTEwNTNdIC0gTWFrZSByZW1vdGUgY2xpZW50J3MgSVAgYWRkcmVzcyBhdmFpbGFibGUgZm9yIGFsbCBzb2NrZXQgcmVsYXRlZCB0cmFuc3BvcnRzCi0gICAgKiBbVEhSSUZULTExMDldIC0gRGVwbG95IGZiMzAzIGFsb25nIHNpZGUgbGlidGhyaWZ0IHRvIG1hdmVuIHJlcG8KLSAgICAqIFtUSFJJRlQtMTEwN10gLSBpbXByb3ZlbWVudCBmb3IgY29tcGlsZXItZ2VuZXJhdGVkIHB5dGhvbiBmb3IgJ05vbmUnIG9iamVjdCBjb21wYXJpc29ucwotICAgICogW1RIUklGVC0xMDY5XSAtIEFkZCBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHByZXZlbnQgdGhyaWZ0IGZyb20gaW5zZXJ0aW5nIGdlbi0qIGRpcmVjdG9yaWVzCi0gICAgKiBbVEhSSUZULTEwNDldIC0gQWxsb3cgZm9yIFRTZXJ2ZXJTb2NrZXQgcHl0aG9uIGxpYnJhcnkgdG8gYmluZCB0byBhIHNwZWNpZmljIGhvc3QKLSAgICAqIFtUSFJJRlQtMTEyNl0gLSBFeHRlbmRpbmcgc3RydWN0X2luZm8gZm9yIGVybGFuZyBiaW5kaW5ncwotICAgICogW1RIUklGVC0xMTAwXSAtIHB5dGhvbiBUU1NMU29ja2V0IGltcHJvdmVtZW50cywgaW5jbHVkaW5nIGNlcnRpZmljYXRlIHZhbGlkYXRpb24KLSAgICAqIFtUSFJJRlQtOTk0XSAtIERvbid0IHRyeSB0byBpbnZva2UgcGhwaXplIGlmIHdlIGRvbid0IGhhdmUgaXQKLSAgICAqIFtUSFJJRlQtOTkzXSAtIFNvbWUgaW1wcm92ZW1lbnRzIGluIEMrKyBzdHVicyBmb3Igb25ld2F5IG9wZXJhdGlvbnMKLSAgICAqIFtUSFJJRlQtOTk3XSAtIFVzaW5nIHZhbHVlT2YgZm9yIGJhc2UgdHlwZXMgaW4gZ2V0RmllbGRWYWx1ZQotICAgICogW1RIUklGVC00MThdIC0gRG9uJ3QgZG8gcnVudGltZSBzb3J0aW5nIG9mIHN0cnVjdCBmaWVsZHMKLSAgICAqIFtUSFJJRlQtMTUxXSAtIFRTU0xTZXJ2ZXJTb2NrZXQgYW5kIFRTU0xTb2NrZXQgaW1wbGVtZW50YXRpb24KLSAgICAqIFtUSFJJRlQtMjddIC0gR2VuZXJhdGVkIGVybGFuZyB0eXBlcyBkb24ndCBjb250YWluIGRlZmF1bHQgdmFsdWVzIGZvciByZWNvcmRzCi0gICAgKiBbVEhSSUZULTExM10gLSB0by1zdHJpbmcgbWV0aG9kcyBzaG91bGQgb21pdCBvcHRpb25hbCBudWxsIGZpZWxkcyBmcm9tIG91dHB1dAotICAgICogW1RIUklGVC0zNjNdIC0gTWF2ZW4gRGVwbG95Ci0gICAgKiBbVEhSSUZULTQ0N10gLSBNYWtlIGFuIGFic3RyYWN0IGJhc2UgQ2xpZW50IGNsYXNzIHNvIHdlIGNhbiBnZW5lcmF0ZSBsZXNzIGNvZGUKLSAgICAqIFtUSFJJRlQtNjI3XSAtIHNob3VsZCBjKysgaGF2ZSBzZXR0ZXJzIGZvciBvcHRpb25hbCBmaWVsZHM/Ci0KLSMjIE5ldyBGZWF0dXJlCi0gICAgKiBbVEhSSUZULTEyMzZdIC0gRXJsYW5nIFJlY29ubmVjdGluZyBUaHJpZnQgQ2xpZW50Ci0gICAgKiBbVEhSSUZULTEwMjFdIC0gRnJhbWVkIHRyYW5zcG9ydCBzdXBwb3J0IGZvciBPQ2FtbAotICAgICogW1RIUklGVC0xMDY4XSAtIFB5dGhvbiBTU0wgU29ja2V0IFN1cHBvcnQKLSAgICAqIFtUSFJJRlQtMTEwM10gLSBUWmxpYlRyYW5zcG9ydCBmb3IgcHl0aG9uLCBhIHpsaWIgY29tcHJlc3NlZCB0cmFuc3BvcnQKLSAgICAqIFtUSFJJRlQtMTA4M10gLSBQcmVmb3JraW5nIHB5dGhvbiBwcm9jZXNzIHBvb2wgc2VydmVyCi0gICAgKiBbVEhSSUZULTk5OV0gLSBBZGQgVEZvcmtpbmdTZXJ2ZXIKLQotIyMgU3ViLXRhc2sKLSAgICAqIFtUSFJJRlQtMTE1Ml0gLSBBdHRyaWJ1dGVzIGZyb20gcHJpdmF0ZSB0byBwcm90ZWN0ZWQKLSAgICAqIFtUSFJJRlQtMTAzOF0gLSBHZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYmluYXJ5IGZpZWxkcyAob3IgY29sbGVjdGlvbnMgdGhlcmVvZikgYXJlIG5vdCBzZXJpYWxpemFibGUgKGluIHRoZSBKYXZhIHNlbnNlKSBldmVuIHRob3VnaCB0aGV5IGltcGxlbWVudCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0jIyBUYXNrCi0gICAgKiBbVEhSSUZULTg5Ml0gLSBSZWZhY3RvciBlcmxhbmcgYnVpbGQgc3lzdGVtIHdpdGggcmViYXIKLQotIyMgV2lzaAotICAgICogW1RIUklGVC02MjVdIC0gQWRkIHN1cHBvcnQgZm9yICdHbycKLQotCi0KLVRocmlmdCAwLjYuMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMjIEJ1ZwotICAgICogW1RIUklGVC0xMTMzXSAtIEphdmEgYW5kIEphdmFTY3JpcHQgdHV0b3JpYWwgaXMgYnJva2VuIHNpbmNlIHdlIGhhdmUgSmF2YSBtYXZlbiBkZXBsb3ltZW50Ci0gICAgKiBbVEhSSUZULTExMzFdIC0gQyMgSlNPTiBQcm90b2NvbCBpcyB1bmFibGUgdG8gZGVjb2RlIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBzdHJpbmcKLSAgICAqIFtUSFJJRlQtMTA3NF0gLSAua2V5c3RvcmUgYW5kIC50cnVzdHN0b3JlIGFyZSBtaXNzaW5nIGZyb20gdGhlIDAuNi4wIGRpc3RyaWJ1dGlvbgotCi0jIyBJbXByb3ZlbWVudAotICAgICogW1RIUklGVC0xMTA5XSAtIERlcGxveSBmYjMwMyBhbG9uZyBzaWRlIGxpYnRocmlmdCB0byBtYXZlbiByZXBvCi0gICAgKiBbVEhSSUZULTM2M10gLSBNYXZlbiBEZXBsb3kKLQotIyMgUXVlc3Rpb24KLSAgICAqIFtUSFJJRlQtMTIwNl0gLSBkaWQgdGhlIFRIUklGVCAwLjYuMSBtZXJnZSBUSFJJRlQtNTYzID8KLQotIyMgU3ViLXRhc2sKLSAgICAqIFtUSFJJRlQtMTE2M10gLSBIb3cgY2FuIGkgdXNlIG11bHRpIHNlcnZpY2UgaW4gb25lIHByb2dyYW0/Ci0KLSMjIFRhc2sKLSAgICAqIFtUSFJJRlQtMTExMl0gLSBBcHBseSBUSFJJRlQtMzYzIHRvIDAuNiBicmFuY2gKLSAgICAqIFtUSFJJRlQtMTExM10gLSBBcHBseSBUSFJJRlQtMTA3NCB0byAwLjYgYnJhbmNoCi0KLQotCi1UaHJpZnQgMC42Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyMgQnVnCi0gICAgKiBbVEhSSUZULTEwMjBdIC0gT0NhbWwgY29tcGlsZXIgZ2VuZXJhdGVzIGludmFsaWQgT0NhbWwKLSAgICAqIFtUSFJJRlQtMTAxNV0gLSBUVW5pb24gZG9lcyBub3QgaGFuZGxlIEJ5dGVCdWZmZXIgaW4gdG9TdHJpbmcKLSAgICAqIFtUSFJJRlQtMTAxM10gLSBnZW5lcmF0ZWQgamF2YSBjb2RlIG1heSBoYXZlIG5hbWUgY2xhc2hlcyB3aXRoIHRocmlmdCBsaWJyYXJ5Ci0gICAgKiBbVEhSSUZULTEwMDldIC0gVFVuaW9uIGRvZXMgbm90IGNvcnJlY3RseSBkZWVwIGNvcHkgYSBCeXRlQnVmZmVyCi0gICAgKiBbVEhSSUZULTEwMzJdIC0gIm1ha2UgZGlzdCIgZmFpbHMgZHVlIHRvIGNfZ2xpYiBwcm9ibGVtCi0gICAgKiBbVEhSSUZULTg2OF0gLSBSZWZlcmVuY2luZyBjb25zdGFudCB2YWx1ZXMgZG9lc24ndCB3b3JrIHdpdGggd2l0aCB0eXBlZGVmIHR5cGVzCi0gICAgKiBbVEhSSUZULTk3MV0gLSBqYXZhIG1vZHVsZSBjYW4ndCBiZSBjb21waWxlZCB3aXRob3V0IGl2eSBhbmQgbmV0d29yayBjb25uZWN0aW9uCi0gICAgKiBbVEhSSUZULTk3MF0gLSBVbmRlciBoZWF2eSBsb2FkLCBUSHR0cENsaWVudCBtYXkgZmFpbCB3aXRoICJ0b28gbWFueSBvcGVuIGZpbGVzIgotICAgICogW1RIUklGVC05NjldIC0gSmF2YSBUdXRvcmlhbCBicm9rZW4sIG1vdmUgQ2FsY3VsYXRvckhhbmRsZXIgdG8gYSBzZXBhcmF0ZSBmaWxlCi0gICAgKiBbVEhSSUZULTgwN10gLSBKYXZhU2NyaXB0OiBJbml0aWFsaXphdGlvbiBvZiBCYXNlIFR5cGVzIHdpdGggMCBpbnN0ZWFkIG9mIG51bGwKLSAgICAqIFtUSFJJRlQtOTU1XSAtIFRocmlmdCBjb21waWxlciBmb3IgV2luZG93cyB1c2VzIGxvd2VyY2FzZSBuYW1lcyBhbmQgZGlyZWN0b3JpZXMgd2hpY2ggaXMgaW5jb25zaXN0ZW50IHdpdGggY29tcGlsaW5nIG9uIG90aGVyIHBsYXRmb3JtcwotICAgICogW1RIUklGVC05OTJdIC0gTmFtaW5nIGNvbnZlbnRpb24gaW4gQyMgY29uc3RydWN0b3IgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCBvdGhlciBmaWVsZHMgY2F1c2VzIGNvbXBpbGUgZXJyb3JzCi0gICAgKiBbVEhSSUZULTEwMDhdIC0gYnl0ZVtdIGFjY2Vzc29ycyB0aHJvdyBOUEUgb24gdW5zZXQgZmllbGQKLSAgICAqIFtUSFJJRlQtMTAwNl0gLSBJbXBvc3NpYmxlIHRvIGNvcnJlY3RseSBxdWFsaWZ5IGFuIGVudW0gY29uc3RhbnQgaW4gYW4gZXh0ZXJuYWwgdGhyaWZ0IGZpbGUKLSAgICAqIFtUSFJJRlQtOTUwXSAtIEhhc2tlbGwgYmluZGluZ3MgdHJlYXQgJ2J5dGUnIGFzIHVuc2lnbmVkIDgtYml0IGludCAoRGF0YS5Xb3JkLldvcmQ4KSwgamF2YS9jcHAgYXMgc2lnbmVkIChieXRlL2ludDhfdCkuCi0gICAgKiBbVEhSSUZULTk3NV0gLSBsaWIvY19nbGliL1JFQURNRSBpcyBtaXNzaW5nID0+IGJyZWFrcyBtYWtlIGRpc3QKLSAgICAqIFtUSFJJRlQtOTQ0XSAtIFN1cHBvcnQgYWxsIHZlcnNpb24tNHMgb2YgYmFzZQotICAgICogW1RIUklGVC05MzldIC0gb3B0aW9uYWwgYmluYXJ5IGZpZWxkcyB0aHJvdyBOUEUgb24gZGVmYXVsdCBieXRlW10gZ2V0dGVycwotICAgICogW1RIUklGVC05MzVdIC0gUEhQIEV4dGVuc2lvbiBhYm9ydHMgdGhlIGJ1aWxkIGlmIHBocC1jb25maWcgaXMgbm90IGluc3RhbGxlZAotICAgICogW1RIUklGVC05MzNdIC0gSGFza2VsbCdzIFRocmlmdC5jYWJhbCBoYXMgd2FybmluZ3MKLSAgICAqIFtUSFJJRlQtOTMyXSAtIEhhc2tlbGwgdGVzdHMgbmVlZCB0byBiZSBydW4gdGhyb3VnaCAnbWFrZSBjaGVjaycgKGFuZCBwcm9iYWJseSAnY2FiYWwgY2hlY2snKSB0b28KLSAgICAqIFtUSFJJRlQtOTA0XSAtIEMjIFRTb2NrZXQgc2hvdWxkIGRpc2FibGUgbmFnbGUgYW5kIGxpbmdlcgotICAgICogW1RIUklGVC05NDFdIC0gTWFrZSBQSFAgQyBFeHRlbnNpb24gdXNlIHRoZSBkZWZpbmVkIFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luIGZ1bmN0aW9uCi0gICAgKiBbVEhSSUZULTk0MF0gLSAnbWFrZSBjaGVjaycgZmFpbHMgaWYgYm9vc3QgaXMgbm90IGluIHRoZSBzdGQgaW5jbHVkZSBhbmQgbGluayBwYXRocwotICAgICogW1RIUklGVC05MjRdIC0gRml4IGdlbmVyYXRlZCBwaHAgc3RydWN0dXJlIGNvbnN0YW50cwotICAgICogW1RIUklGVC05NzldIC0gcnVieSBiaW5kaW5ncyB1c2VkIHRvIHdvcmsgb24ganJ1YnkKLSAgICAqIFtUSFJJRlQtOTc3XSAtIEhleCBDb252ZXJzaW9uIEJ1ZyBpbiBDKysgVEpTT05Qcm90b2NvbAotICAgICogW1RIUklGVC0zNDddIC0gUEhQIFRTb2NrZXQgVGltZW91dCBJc3N1ZXMKLSAgICAqIFtUSFJJRlQtNTE3XSAtIFRFeGNlcHRpb25zIHRocm93biBieSBzZXJ2ZXIgcmVzdWx0IGluIGNyeXB0aWMgZXJyb3IgbWVzc2FnZSBvbiBjbGllbnQgLSBUcmllZCB0byByZWFkIDQgYnl0ZXMsIGJ1dCBvbmx5IGdvdCAwIGJ5dGVzCi0KLSMjIEltcHJvdmVtZW50Ci0gICAgKiBbVEhSSUZULTEwMjRdIC0gQWRkIFB5dGhvbiBUd2lzdGVkIGV4YW1wbGUgdG8gdGhlIFR1dG9yaWFsCi0gICAgKiBbVEhSSUZULTk1OF0gLSBDaGFuZ2UgYWNjZXNzbW9kaWZlciBvbiB0cmFuc18gZmllbGQgaW4gdGhlIEZyYW1lQnVmZmVyIGNsYXNzIHRvIHB1YmxpYy4KLSAgICAqIFtUSFJJRlQtOTU3XSAtIFRIc0hhU2VydmVyOiBDaGFuZ2UgYWNjZXNzIG1vZGlmaWVyIG9mIHRoZSBpbnZva2VyIGZpZWxkLgotICAgICogW1RIUklGVC0xMDAyXSAtIENvZGVTdHlsZTogdF9jX2dsaWJfZ2VuZXJhdG9yLmNjCi0gICAgKiBbVEhSSUZULTEwMDVdIC0gR2l2ZSB1bmlvbnMgYnl0ZVtdIHNpZ25hdHVyZSBtZXRob2RzIHRvIGdvIGFsb25nIHdpdGggdGhlaXIgQnl0ZUJ1ZmZlciBjb3VudGVycGFydHMKLSAgICAqIFtUSFJJRlQtOTUxXSAtIEFkZCBhIG5ldyBpc1NlcnZpbmcoKSBtZXRob2QgdG8gVFNlcnZlcgotICAgICogW1RIUklGVC05NDNdIC0gU2lsbHkgcmVhZG1lIHR5cG8gZml4LgotICAgICogW1RIUklGVC05NjFdIC0gSmF2YVNjcmlwdCBUZXN0U3VpdGUgdXNpbmcgYW50L2l2eSBhbmQgSmF2YSdzIFNlcnZlclRlc3RCYXNlIEhhbmRsZXIKLSAgICAqIFtUSFJJRlQtOTYwXSAtIGFkZCBUZXN0U2VydmVyLCBUZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIgYW5kIFRlc3RDbGllbnQgYWdhaW4KLSAgICAqIFtUSFJJRlQtOTQ5XSAtIE1vZGlmeSB0aGUgVEVudW0gaW50ZXJmYWNlIHNvIGl0IGRlZmluZXMgYSBtZXRob2Qgc2ltaWxhciB0byBmaW5kQnlWYWx1ZQotICAgICogW1RIUklGVC05NDZdIC0gQXVnbWVudCBGaWVsZFZhbHVlTWV0YURhdGEgc28gaXQgZGlmZmVyZW50aWF0ZXMgJ3N0cmluZycgYW5kICdiaW5hcnknIGZpZWxkcy4KLSAgICAqIFtUSFJJRlQtOTAzXSAtIGN1c3RvbSBUaHJlYWRGYWN0b3J5IGluIFRIc0hhU2VydmVyCi0gICAgKiBbVEhSSUZULTkxM10gLSBUZXN0IENhc2UgZm9yIFVybCBlbmNvZGVkIHN0cmluZ3MgKyBzaW1wbGUgZW5oYW5jZW1lbnQgdG8gbGliL2pzL3Rlc3QvUnVuVGVzdFNlcnZlci5zaAotICAgICogW1RIUklGVC05MjZdIC0gTWlzY2VsbGFuZW91cyBDKysgaW1wcm92ZW1lbnRzCi0gICAgKiBbVEhSSUZULTkyOV0gLSBJbXByb3ZlbWVudHMgdG8gdGhlIEMrKyB0ZXN0IHN1aXRlCi0gICAgKiBbVEhSSUZULTg5M10gLSBhZGQgSmF2YVNjcmlwdCB0byB0aGUgdHV0b3JpYWwgZXhhbXBsZXMKLSAgICAqIFtUSFJJRlQtMTAwM10gLSBQb2xpc2hpbmcgY19nbGliIGNvZGUKLSAgICAqIFtUSFJJRlQtNzFdIC0gRGViaWFuIHBhY2thZ2luZyBmb3IgdGhyaWZ0Ci0KLSMjIE5ldyBGZWF0dXJlCi0gICAgKiBbVEhSSUZULTEwMzNdIC0gTm9kZS5qcyBsYW5ndWFnZSB0YXJnZXQKLSAgICAqIFtUSFJJRlQtOTQ3XSAtIFByb3ZpZGUgYSBoZWxwZXIgbWV0aG9kIHRvIGRldGVybWluZSB0aGUgVFByb3RvY29sIHVzZWQgdG8gc2VyaWFsaXplIHNvbWUgZGF0YS4KLSAgICAqIFtUSFJJRlQtOTI4XSAtIE1ha2UgbW9yZSBzdGF0aXN0aWNzIGF2YWlsYWJsZSBpbiBDKysgc2VydmVycwotICAgICogW1RIUklGVC05MjJdIC0gVGVtcGxhdGl6ZWQgW2RlXXNlcmlhbGl6YXRpb24gY29kZSBmb3IgQysrCi0gICAgKiBbVEhSSUZULTkyM10gLSBFdmVudC1kcml2ZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc3VwcG9ydCBmb3IgQysrCi0gICAgKiBbVEhSSUZULTkyNV0gLSBQcm92aWRlIG5hbWU8LT52YWx1ZSBtYXAgZm9yIGVudW1zIGluIEMrKwotICAgICogW1RIUklGVC05MjddIC0gQWRkIG9wdGlvbiB0byBtb2RpZnkgdGhlIFBIUCBpbmNsdWRlIHBhdGgKLSAgICAqIFtUSFJJRlQtMzc3XSAtIFRGaWxlVHJhbnNwb3J0IHBvcnQgaW4gSmF2YQotICAgICogW1RIUklGVC0xMDZdIC0gVFNTTFNlcnZlclNvY2tldAotICAgICogW1RIUklGVC01ODJdIC0gQyBpbXBsZW1lbnRhdGlvbiBvZiBUaHJpZnQKLSAgICAqIFtUSFJJRlQtNzQ1XSAtIE1ha2UgaXQgZWFzaWVyIHRvIGluc3RhbnRpYXRlIHNlcnZlcnMKLQotIyMgU3ViLXRhc2sKLSAgICAqIFtUSFJJRlQtMTAzOF0gLSBHZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYmluYXJ5IGZpZWxkcyAob3IgY29sbGVjdGlvbnMgdGhlcmVvZikgYXJlIG5vdCBzZXJpYWxpemFibGUgKGluIHRoZSBKYXZhIHNlbnNlKSBldmVuIHRob3VnaCB0aGV5IGltcGxlbWVudCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0jIyBUYXNrCi0gICAgKiBbVEhSSUZULTg2Ml0gLSBBc3luYyBjbGllbnQgaXNzdWVzIC8gaW1wcm92ZW1lbnRzCi0KLSMjIFRlc3QKLSAgICAqIFtUSFJJRlQtNTgxXSAtIEFkZCBhIHRlc3RzdWl0ZSBmb3IgdHhUaHJpZnQgKFR3aXN0ZWQpCi0KLQotCi1UaHJpZnQgMC41LjAgLSBJbmN1YmF0aW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVEhSSUZULTUwNSAgIEJ1aWxkICAgICAgICAgICAgICAgIE1ha2UgY29uZmlndXJlIGdpdmUgYSBzdW1tYXJ5IG9mIHRoZSBlbmFibGVkIGNvbXBvbmVudHMgKERhdmlkIFJlaXNzKQotVEhSSUZULTUwNiAgIEJ1aWxkICAgICAgICAgICAgICAgIEFsbG93IFRocmlmdCB0byBiZSBidWlsdCB3aXRob3V0IHRoZSBDKysgbGlicmFyeSAoRGF2aWQgUmVpc3MpCi1USFJJRlQtODQ0ICAgQnVpbGQgICAgICAgICAgICAgICAgQnVpbGQgUmVxdWlyZW1lbnRzIHN0YXRlIGF1dG9jb25mIDIuNTkrIGlzIHJlcXVpcmVkLCBidXQgMi42MCsgaXMgbmVlZGVkIChIYXJsYW4gTGllYmVybWFuLUJlcmcpCi1USFJJRlQtODUwICAgQnVpbGQgICAgICAgICAgICAgICAgUGVybCBydW50aW1lIHJlcXVpcmVzIEJpdDo6VmVjdG9yIHdoaWNoIG1heSBub3QgYmUgaW5zdGFsbGVkIGJ5IGRlZmF1bHQsIGJ1dCBjb25maWd1cmUgZG9lcyBub3QgZmFpbCAoTWljaGFlbCBMdW0pCi1USFJJRlQtODU0ICAgQnVpbGQgICAgICAgICAgICAgICAgUHJvdmlkZSBjb25maWd1cmUgb3B0aW9uIGFuZCBtYWtlIHJ1bGVzIHRvIGJ1aWxkL2luc3RhbGwgcGhwIGV4dGVuc2lvbiAoQW50aG9ueSBNb2xpbmFybykKLVRIUklGVC04NTggICBCdWlsZCAgICAgICAgICAgICAgICBIYXZlIGJvb3RzdHJhcC5zaCBjaGVjayBmb3IgYSBzdWl0YWJsZSBhdXRvY29uZiB2ZXJzaW9uIGJlZm9yZSBydW5uaW5nIChEYXZpZCBSZWlzcykKLVRIUklGVC04NzEgICBCdWlsZCAgICAgICAgICAgICAgICBUaHJpZnQgY29tcGlsZXIgZm9yIFdJbmRvd3MgKGJpbmFyeSBkaXN0cmlidXRpb24pIChEYXZpZCBSZWlzcykKLVRIUklGVC0zMjMgICBDIyAgICAgICAgICAgICAgICAgICBUSlNPTlByb3RvY29sIChSb2dlciBNZWllcikKLVRIUklGVC02MzQgICBDIyAgICAgICAgICAgICAgICAgICBDIyBDb21waWxlciBHZW5lcmF0ZXMgSW5jb3JyZWN0IENvZGUgRm9yIEZpZWxkcyB3aGljaCBiZWdpbiB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIgKEpvbiBTIEFraHRhcikKLVRIUklGVC04ODEgICBDIyAgICAgICAgICAgICAgICAgICBhZGQgY3NoYXJwIHRvIHRoZSB0dXRvcmlhbCAoUm9nZXIgTWVpZXIpCi1USFJJRlQtODU2ICAgQysrICAgICAgICAgICAgICAgICAgQnVpbGRpbmcgY3BwIGxpYnJhcnkgZmFpbHMgb24gT1MgWCB3aXRoIG1hbGxvYyBhbmQgZnJlZSBub3QgYmVpbmcgZGVjbGFyZWQgaW4gc2NvcGUgKEphbWVzIENsYXJrZSkKLVRIUklGVC04NjUgICBDKysgICAgICAgICAgICAgICAgICBDKysgY29tcGlsZXIgYnVpbGQgZGVwZW5kcyBvbiBsaWJmbCBldmVuIHdoZW4gZmxleC9sZXggbm90IGRldGVjdGVkIChEYXZpZCBSZWlzcykKLVRIUklGVC05MDAgICBDKysgICAgICAgICAgICAgICAgICBVbml4IGRvbWFpbiBzb2NrZXQgKFJvZ2VyIE1laWVyKQotVEhSSUZULTkyMCAgIEMrKyAgICAgICAgICAgICAgICAgIEMrKyBUZXN0IGFuZCBUdXRvcmlhbCBkb2VzIG5vdCBjb21waWxlIGFueW1vcmUgZHVlIHRvIHRoZSBjaGFuZ2Ugd2l0aGluIEVudW0gaGFuZGxpbmcgKFJvZ2VyIE1laWVyKQotVEhSSUZULTU2NyAgIEMrKyAgICAgICAgICAgICAgICAgIENhbid0IGltbWVkaWF0ZWx5IHN0b3AgYSBUU2ltcGxlU2VydmVyIHRocmVhZCB0aGF0IGlzIGlkbGUgKFJ1c2ggTWFuYmVydCkKLVRIUklGVC03NTYgICBDKysgICAgICAgICAgICAgICAgICBFeHBvc2luZyBUU29ja2V0KGludCkgY29uc3RydWN0b3IgdG8gcHVibGljIChSYWphdCBHb2VsKQotVEhSSUZULTc5OCAgIEMrKyAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlciBsZWFrcyByZXNvdXJjZXMgd2hlbiBkZXN0cm95ZWQgKERhdmlkIFJlaXNzKQotVEhSSUZULTgxMiAgIEMrKywgUHl0aG9uICAgICAgICAgIERlbW8gb2YgVGhyaWZ0IG92ZXIgWmVyb01RIChEYXZpZCBSZWlzcykKLVRIUklGVC02MjkgICBDb2NvYSAgICAgICAgICAgICAgICBVbnVzZWQgRmllbGQgSW4gVFNvY2tldFNlcnZlciBBcHBlYXJzIFRvIEJyZWFrIGlQaG9uZSBCdWlsZCAoSm9uIFMgQWtodGFyKQotVEhSSUZULTgzOCAgIENvY29hICAgICAgICAgICAgICAgIEdlbmVyYXRlZCBDb2NvYSBjbGFzc2VzIGhhdmUgdXNlbGVzcyBAZHluYW1pYyBkZWNsYXJhdGlvbnMgKEtldmluIEJhbGxhcmQpCi1USFJJRlQtODA1ICAgQ29jb2EgICAgICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgcHJvY2Vzc19YWFhYIG1ldGhvZHMgZm9yIG9uZXdheSBtZXRob2RzIChCcmFkIFRheWxvcikKLVRIUklGVC01MDcgICBDb21waWxlciAgICAgICAgICAgICBSZW1vdmUgdGhlIGNvbXBpbGVyJ3MgZGVwZW5kZW5jeSBvbiBCb29zdCAoRGF2aWQgUmVpc3MpCi1USFJJRlQtODk1ICAgQ29tcGlsZXIgKEdlbmVyYWwpICAgVGhyaWZ0IGNvbXBpbGVyIGRvZXMgbm90IGFsbG93IHR3byBkaWZmZXJlbnQgZW51bWVyYXRpb25zIHRvIGhhdmUgdGhlIHNhbWUga2V5IG5hbWUgZm9yIG9uZSBvZiB0aGUgZW51bSB2YWx1ZXMgKERhdmlkIFJlaXNzKQotVEhSSUZULTg1MiAgIENvbXBpbGVyIChHZW5lcmFsKSAgIE1pc3NpbmcgbmV3bGluZSBjYXVzZXMgbWFueSBjb21waWxlciB3YXJuaW5ncyAoQW50aG9ueSBNb2xpbmFybykKLVRIUklGVC04NzcgICBDb21waWxlciAoR2VuZXJhbCkgICBzbWFsbHRhbGsgbmFtZXNwYWNlIGRvZXNuJ3Qgd29yayAoQnJ1Y2UgTG93ZWthbXApCi1USFJJRlQtODk3ICAgQ29tcGlsZXIgKEdlbmVyYWwpICAgRG9uJ3QgYWxsb3cgdW5xdWFsaWZpZWQgY29uc3RhbnQgYWNjZXNzIHRvIGVudW0gdmFsdWVzIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTkgICAgIENvbXBpbGVyIChHZW5lcmFsKSAgIEFkZCBhIGRlZmF1bHQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGZvciBhbGwgbGFuZ3VhZ2VzIChEYXZpZCBSZWlzcykKLVRIUklGVC01OTkgICBFcmxhbmcgICAgICAgICAgICAgICBEb24ndCB1c2UgdW5uZWNlc3NhcnkgcHJvY2Vzc2VzIGluIHRoZSBFcmxhbmcgdHJhbnNwb3J0cyBhbmQgY2xpZW50cyAoRGF2aWQgUmVpc3MpCi1USFJJRlQtNjQ2ICAgRXJsYW5nICAgICAgICAgICAgICAgRXJsYW5nIGxpYnJhcnkgaXMgbWlzc2luZyBpbnN0YWxsIHRhcmdldCAoRGF2aWQgUmVpc3MpCi1USFJJRlQtNjk4ICAgRXJsYW5nICAgICAgICAgICAgICAgR2VuZXJhdGVkIG1vZHVsZSBsaXN0IHNob3VsZCBjb250YWluIGF0b21zLCBub3Qgc3RyaW5ncyAoQW50aG9ueSBNb2xpbmFybykKLVRIUklGVC04NjYgICBFcmxhbmcgICAgICAgICAgICAgICB0ZXJtKCkgaW4gc3BlYyBkZWZpbml0aW9ucyBzZWVtcyB0byBub3Qgd29yayBpbiBlcmxhbmcgUjEyIChBbnRob255IE1vbGluYXJvKQotVEhSSUZULTg4NiAgIEVybGFuZyAgICAgICAgICAgICAgIERpYWx5emVyIHdhcm5pbmcgKEFudGhvbnkgTW9saW5hcm8pCi1USFJJRlQtNzg1ICAgRXJsYW5nICAgICAgICAgICAgICAgRnJhbWVkIHRyYW5zcG9ydCBzZXJ2ZXIgcHJvYmxlbXMgKEFudGhvbnkgTW9saW5hcm8pCi1USFJJRlQtODg0ICAgSFRNTCAgICAgICAgICAgICAgICAgSFRNTCBHZW5lcmF0b3I6IGFkZCBLZXkgYXR0cmlidXRlIHRvIHRoZSBEYXRhIFR5cGVzIFRhYmxlcyAoUm9nZXIgTWVpZXIpCi1USFJJRlQtNjUyICAgSGFza2VsbCAgICAgICAgICAgICAgR2VuZXJhdGVkIGZpZWxkIG5hbWUgZm9yIHN0cnV0IGlzIG5vdCBjYXBpdGFsaXplZCBjb3JyZWN0bHkgKENocmlzdGlhbiBMYXZvaWUpCi1USFJJRlQtNzQzICAgSGFza2VsbCAgICAgICAgICAgICAgY29tcGlsZSBlcnJvciB3aXRoIEdIQyA2LjEyLjEgKENocmlzdGlhbiBMYXZvaWUpCi1USFJJRlQtOTAxICAgSGFza2VsbCAgICAgICAgICAgICAgQWxsb3cgdGhlIGJpbmRpbmdzIHRvIGNvbXBpbGUgd2l0aG91dCAtZmdsYXNnb3ctZXh0cyBhbmQgd2l0aCAtV2FsbCAtV2Vycm9yIChDaHJpc3RpYW4gTGF2b2llKQotVEhSSUZULTkwNSAgIEhhc2tlbGwgICAgICAgICAgICAgIE1ha2UgaGFza2VsbCB0aHJpZnQgYmluZGluZ3MgdXNlIGF1dG9tYWtlIHRvIGNvbXBpbGUgYW5kIGluc3RhbGwgKENocmlzdGlhbiBMYXZvaWUpCi1USFJJRlQtOTA2ICAgSGFza2VsbCAgICAgICAgICAgICAgSW1wcm92ZSB0eXBlIG1hcHBpbmdzIChDaHJpc3RpYW4gTGF2b2llKQotVEhSSUZULTkxNCAgIEhhc2tlbGwgICAgICAgICAgICAgIE1ha2UgaGFza2VsbCBiaW5kaW5ncyAnZWFzaWx5JyBjb21waWxhYmxlIChDaHJpc3RpYW4gTGF2b2llKQotVEhSSUZULTkxOCAgIEhhc2tlbGwgICAgICAgICAgICAgIE1ha2UgaGFza2VsbCB0ZXN0cyBydW4gYWdhaW4gKENocmlzdGlhbiBMYXZvaWUpCi1USFJJRlQtOTE5ICAgSGFza2VsbCAgICAgICAgICAgICAgVXBkYXRlIEhhc2tlbGwgYmluZGluZ3MgUkVBRE1FIChDaHJpc3RpYW4gTGF2b2llKQotVEhSSUZULTc4NyAgIEhhc2tlbGwgICAgICAgICAgICAgIEVudW1zIGFyZSBub3QgcmVhZCBjb3JyZWN0bHkgKENocmlzdGlhbiBMYXZvaWUpCi1USFJJRlQtMjUwICAgSmF2YSAgICAgICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGFzIGEgY29uc3RydWN0b3IgcGFyYW1ldGVyIGZvciBUU2VydmVyIChFZCBDZWFzZXIpCi1USFJJRlQtNjkzICAgSmF2YSAgICAgICAgICAgICAgICAgVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlZCBqYXZhIGNvZGUgdGhhdCB0aHJvd3MgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgZGVwcmVjYXRlZCBtZXRob2RzLiAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC04NDMgICBKYXZhICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTb2NrZXQgY29ubmVjdHMgd2l0aG91dCBhIHRpbWVvdXQgKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtODQ1ICAgSmF2YSAgICAgICAgICAgICAgICAgYXN5bmMgY2xpZW50IGRvZXMgbm90IHJlc3BlY3QgdGltZW91dCAoTmluZyBMaWFuZykKLVRIUklGVC04NzAgICBKYXZhICAgICAgICAgICAgICAgICBKYXZhIGNvbnN0YW50cyBkb24ndCBnZXQgSmF2YWRvYyBjb21tZW50cyAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC04NzMgICBKYXZhICAgICAgICAgICAgICAgICBKYXZhIHRlc3RzIGZhaWwgZHVlIHRvIFRvbyBtYW55IG9wZW4gZmlsZXMgKFRvZGQgTGlwY29uKQotVEhSSUZULTg3NiAgIEphdmEgICAgICAgICAgICAgICAgIEFkZCBTQVNMIHN1cHBvcnQgKEFhcm9uIFQuIE15ZXJzKQotVEhSSUZULTg3OSAgIEphdmEgICAgICAgICAgICAgICAgIFJlbW92ZSBAT3ZlcnJpZGUgZnJvbSBUVW5pb24uY2xlYXIgKERhdmUgRW5nYmVyZykKLVRIUklGVC04ODIgICBKYXZhICAgICAgICAgICAgICAgICBkZWVwIGNvcHkgb2YgYmluYXJ5IGZpZWxkcyBkb2VzIG5vdCBjb3B5IEJ5dGVCdWZmZXIgY2hhcmFjdGVyaXN0aWNzIChhcnJheU9mZnNldCwgcG9zaXRpb24pIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTg4OCAgIEphdmEgICAgICAgICAgICAgICAgIGFzeW5jIGNsaWVudCBzaG91bGQgYWxzbyBoYXZlIG5vbmJsb2NraW5nIGNvbm5lY3QgKEVyaWMgSmVuc2VuKQotVEhSSUZULTg5MCAgIEphdmEgICAgICAgICAgICAgICAgIEphdmEgdHV0b3JpYWwgZG9lc24ndCB3b3JrIChUb2RkIExpcGNvbikKLVRIUklGVC04OTQgICBKYXZhICAgICAgICAgICAgICAgICBNYWtlIGRlZmF1bHQgYWNjZXNzb3JzIGZvciBiaW5hcnkgZmllbGRzIHJldHVybiBieXRlW107IHByb3ZpZGUgbmV3IGFjY2Vzc29ycyB0byBnZXQgQnl0ZUJ1ZmZlciB2ZXJzaW9uIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTg5NiAgIEphdmEgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NvY2tldC5pc09wZW4oKSByZXR1cm5zIHRydWUgZXZlbiBhZnRlciBjbG9zZSgpIChFcmljIEplbnNlbikKLVRIUklGVC05MDcgICBKYXZhICAgICAgICAgICAgICAgICBsaWJmYjMwMyBkb2Vzbid0IGNvbXBpbGUgaW4gMC40LjAgKFRvZGQgTGlwY29uKQotVEhSSUZULTkxMiAgIEphdmEgICAgICAgICAgICAgICAgIEltcHJvdmVtZW50cyBhbmQgYnVnIGZpeGVzIHRvIFNBU0wgaW1wbGVtZW50YXRpb24gKFRvZGQgTGlwY29uKQotVEhSSUZULTkxNyAgIEphdmEgICAgICAgICAgICAgICAgIFRIc0hhU2VydmVyIHNob3VsZCBub3QgYWNjZXB0IGFuIEV4ZWN1dG9yU2VydmljZSB3aXRob3V0IGNhdGNoaW5nIFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIChFZCBDZWFzZXIpCi1USFJJRlQtOTMxICAgSmF2YSAgICAgICAgICAgICAgICAgVXNlIGxvZzRqIGZvciBKYXZhIHRlc3RzIChUb2RkIExpcGNvbikKLVRIUklGVC04ODAgICBKYXZhTUUgICAgICAgICAgICAgICBKYXZhTUUgY29kZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgbGlicmFyeSAoRGF2ZSBFbmdiZXJnKQotVEhSSUZULTg0NiAgIEphdmFTY3JpcHQgICAgICAgICAgIEphdmFTY3JpcHQgVGVzdCBGcmFtd29yazogZXh0ZW5kZWQgVGVzdGNhc2VzIChSb2dlciBNZWllcikKLVRIUklGVC04ODUgICBKYXZhU2NyaXB0ICAgICAgICAgICBVcmwgZW5jb2RlZCBzdHJpbmdzIG5ldmVyIGdldCBkZWNvZGVkPyBIb3cgZG8gd2UgZml4IHRoaXM/IChUIEpha2UgTHVjaWFuaSkKLVRIUklGVC05MTEgICBKYXZhU2NyaXB0ICAgICAgICAgICAoSmF2YVNjcmlwdCBjb21waWxlcikgQ29uc3Qgc3RydWN0cywgbWFwcywgc2V0cywgYW5kIGxpc3RzIGdlbmVyYXRlIGEgdHJhaWxpbmcgY29tbWEgKFQgSmFrZSBMdWNpYW5pKQotVEhSSUZULTg2MCAgIE9DYW1sICAgICAgICAgICAgICAgIGNvcHkgbWV0aG9kIGFuZCByZXNldCBtZXRob2QgKExldiBXYWxraW4pCi1USFJJRlQtNjgyICAgUEhQICAgICAgICAgICAgICAgICAgUEhQIGV4dGVuc2lvbiBkb2Vzbid0IGNvbXBpbGUgb24gTWFjIE9TIFggKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtODUxICAgUEhQICAgICAgICAgICAgICAgICAgcGhwIGV4dGVuc2lvbiBmYWlscyB0byBjb21waWxlIG9uIGNlbnRvcyA1LnggKFRvZGQgTGlwY29uKQotVEhSSUZULTg0MCAgIFBlcmwgICAgICAgICAgICAgICAgIFBlcmwgcHJvdG9jb2wgaGFuZGxlciBjb3VsZCBiZSBtb3JlIHJvYnVzdCBhZ2FpbnN0IHVucmVjb2duaXNlZCB0eXBlcyAoQ29ucmFkIEh1Z2hlcykKLVRIUklGVC03NTggICBQZXJsICAgICAgICAgICAgICAgICBpbmNvcnJlY3QgZGVmZXJlbmNlIGluIGV4Y2VwdGlvbiBoYW5kbGluZyAoWWFubiBLZXJoZXJ2ZSkKLVRIUklGVC0yNTcgICBQeXRob24gICAgICAgICAgICAgICBTdXBwb3J0IHZhbGlkYXRpb24gb2YgcmVxdWlyZWQgZmllbGRzIChFc3RldmUgRmVybmFuZGV6KQotVEhSSUZULTMzNSAgIFB5dGhvbiAgICAgICAgICAgICAgIENvbXBhY3QgUHJvdG9jb2wgZm9yIFB5dGhvbiAoRGF2aWQgUmVpc3MpCi1USFJJRlQtNTk2ICAgUHl0aG9uICAgICAgICAgICAgICAgTWFrZSBQeXRob24ncyBUQnVmZmVyZWRUcmFuc3BvcnQgdXNlIGEgY29uZmlndXJhYmxlIGlucHV0IGJ1ZmZlciAoRGF2aWQgUmVpc3MpCi1USFJJRlQtNTk3ICAgUHl0aG9uICAgICAgICAgICAgICAgUHl0aG9uIFRIdHRwU2VydmVyIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyAoRGF2aWQgUmVpc3MpCi1USFJJRlQtNTk4ICAgUHl0aG9uICAgICAgICAgICAgICAgQWxsb3cgUHl0aG9uJ3MgdGhyZWFkaW5nIHNlcnZlcnMgdG8gdXNlIGRhZW1vbiB0aHJlYWRzIChEYXZpZCBSZWlzcykKLVRIUklGVC02NjYgICBQeXRob24gICAgICAgICAgICAgICBBbGxvdyB0aGUgaGFuZGxlciB0byBvdmVycmlkZSBIVFRQIHJlc3BvbnNlcyBpbiBUSHR0cFNlcnZlciAoRGF2aWQgUmVpc3MpCi1USFJJRlQtNjczICAgUHl0aG9uICAgICAgICAgICAgICAgR2VuZXJhdGVkIFB5dGhvbiBjb2RlIGhhcyB3aGl0ZXNwYWNlIGlzc3VlcyAoSWFuIEV1cmUpCi1USFJJRlQtNzIxICAgUHl0aG9uICAgICAgICAgICAgICAgVEh0dHBDbGllbnQgaWdub3JlcyB1cmwgcGFyYW1ldGVycyAoVGhvbWFzIEtobykKLVRIUklGVC04MjQgICBQeXRob24gICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uX19zdHJfXygpIHJlZmVycyB0byBjbGFzcyBjb25zdGFudHMgYXMgZ2xvYmFscyAoUGV0ZXIgU2NodWxsZXIpCi1USFJJRlQtODU1ICAgUHl0aG9uICAgICAgICAgICAgICAgSW5jbHVkZSBvcHRpbWl6ZWQgY29tcGlsZWQgcHl0aG9uIG9iamVjdHMgaW4gaW5zdGFsbCAoQW50aG9ueSBNb2xpbmFybykKLVRIUklGVC04NTkgICBQeXRob24gICAgICAgICAgICAgICBBbGxvdyBweTp0d2lzdGVkIHRvIGJlIGdlbmVyYXRlZCBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gcHkgKEJydWNlIExvd2VrYW1wKQotVEhSSUZULTg2OSAgIFB5dGhvbiAgICAgICAgICAgICAgIFRTb2NrZXQucHkgb24gTWFjIChhbmQgRnJlZUJTRCkgZG9lc24ndCBoYW5kbGUgRUNPTk5SRVNFVCBmcm9tIHJlY3YoKSAoU3RldmVuIEtuaWdodCkKLVRIUklGVC04NzUgICBQeXRob24gICAgICAgICAgICAgICBJbmNsdWRlIHB5dGhvbiBzZXR1cC5jZmcgaW4gZGlzdCAoQW50aG9ueSBNb2xpbmFybykKLVRIUklGVC02MTAgICBSdWJ5ICAgICAgICAgICAgICAgICBiaW5hcnlfcHJvdG9jb2wucmIgc2VnZmF1bHRzIFtsaW5lIDg2XSAoVW5hc3NpZ25lZCkKLVRIUklGVC04OTkgICBSdWJ5ICAgICAgICAgICAgICAgICBSdWJ5IHJlYWQgdGltZW91dHMgY2FuIHNvbWV0aW1lcyBiZSAyeCB3aGF0IHRoZXkgc2hvdWxkIGJlIChSeWFuIEtpbmcpCi1USFJJRlQtOTA5ICAgUnVieSAgICAgICAgICAgICAgICAgYWxsb3cgYmxvY2sgYXJndW1lbnQgdG8gc3RydWN0IGNvbnN0cnVjdG9yIChNaWNoYWVsIFN0b2NrdG9uKQotVEhSSUZULTQ1NiAgIFRlc3QgU3VpdGUgICAgICAgICAgIEJhZCBJUCBhZGRyZXNzIHN0cmluZyBpbiB0ZXN0L2NwcC9zcmMvbWFpbi5jcHAgKFJ1c2ggTWFuYmVydCkKLQotCi1UaHJpZnQgMC40LjAgLSBJbmN1YmF0aW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVEhSSUZULTY1MCAgIEJ1aWxkICAgICAgICBNYWtlIENoZWNrIGZhaWxzIG9uIENlbnRvcy9PU1ggd2l0aCAwLjIuMCB0YXJiYWxsIChBbnRob255IE1vbGluYXJvKQotVEhSSUZULTc3MCAgIEJ1aWxkICAgICAgICBHZXQgJ21ha2UgZGlzdCcgdG8gd29yayB3aXRob3V0IGZpcnN0IGNvbXBpbGluZyBzb3VyY2UgY29kZSAoQW50aG9ueSBNb2xpbmFybykKLVRIUklGVC0xNjAgICBDIyAgICAgICAgICAgQ3JlYXRlZCBUSHR0cFRyYW5zcG9ydCBmb3IgdGhlIEMjIGxpYnJhcnkgYmFzZWQgb24gV2ViSHR0cFJlcXVlc3QgKE1pY2hhZWwgR3JlZW5lKQotVEhSSUZULTgzNCAgIEMjICAgICAgICAgICBUSHR0cENsaWVudCByZXNlbmRzIGNvbnRlbnRzIG9mIG1lc3NhZ2UgYWZ0ZXIgdHJhbnNwb3J0IGVycm9ycyAoQW5hdG9seSBGYXluZ2VsZXJpbikKLVRIUklGVC0yNDcgICBDKysgICAgICAgICAgVEh0dHBTZXJ2ZXIgVHJhbnNwb3J0IChVbmFzc2lnbmVkKQotVEhSSUZULTY3NiAgIEMrKyAgICAgICAgICBDaGFuZ2UgQysrIGNvZGUgZ2VuZXJhdG9yIHNvIHRoYXQgZ2VuZXJhdGVkIGNsYXNzZXMgY2FuIGJlIHdyYXBwZWQgd2l0aCBTV0lHIChVbmFzc2lnbmVkKQotVEhSSUZULTU3MCAgIENvbXBpbGVyICAgICBUaHJpZnQgY29tcGlsZXIgZG9lcyBub3QgZXJyb3Igd2hlbiBkdXBsaWNhdGUgbWV0aG9kIG5hbWVzIGFyZSBwcmVzZW50IChCcnVjZSBTaW1wc29uKQotVEhSSUZULTgwOCAgIENvbXBpbGVyICAgICBTZWdmYXVsdCB3aGVuIGNvbnN0YW50IGRlY2xhcmF0aW9uIHJlZmVyZW5jZXMgYSBzdHJ1Y3QgZmllbGQgdGhhdCBkb2Vzbid0IGV4aXN0IChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTY0NiAgIEVybGFuZyAgICAgICBFcmxhbmcgbGlicmFyeSBpcyBtaXNzaW5nIGluc3RhbGwgdGFyZ2V0IChBbnRob255IE1vbGluYXJvKQotVEhSSUZULTU0NCAgIEdlbmVyYWwgICAgICBtdWx0aXBsZSBlbnVtcyB3aXRoIHRoZSBzYW1lIGtleSBnZW5lcmF0ZSBpbnZhbGlkIGNvZGUgKEJlbiBUYWl0ZWxiYXVtKQotVEhSSUZULTQzNCAgIEdlbmVyYWwgICAgICBydWJ5IGNvbXBpbGVyIHNob3VsZCB3YXJuIHdoZW4gYSByZXNlcnZlZCB3b3JkIGlzIHVzZWQgKE1pY2hhZWwgU3RvY2t0b24pCi1USFJJRlQtNzk5ICAgR2VuZXJhbCAgICAgIEZpbGVzIG1pc3NpbmcgcHJvcGVyIEFwYWNoZSBsaWNlbnNlIGhlYWRlciAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC04MzIgICBIVE1MICAgICAgICAgSFRNTCBnZW5lcmF0b3Igc2hvd3MgdW5zcGVjaWZpZWQgc3RydWN0IGZpZWxkcyBhcyAncmVxdWlyZWQnIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTIyNiAgIEphdmEgICAgICAgICBDb2xsZWN0aW9ucyB3aXRoIGJpbmFyeSBrZXlzIG9yIHZhbHVlcyBicmVhayBlcXVhbHMoKSAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC00ODQgICBKYXZhICAgICAgICAgQWJpbGl0eSB0byB1c2UgYSBzbGljZSBvZiBhIGJ1ZmZlciBpbnN0ZWFkIG9mIGEgZGlyZWN0IGJ5dGVbXSBmb3IgYmluYXJ5IGZpZWxkcyAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC03MTQgICBKYXZhICAgICAgICAgbWF4V29ya2VyVGhyZWFkcyBwYXJhbWV0ZXIgdG8gVEhzSGFTZXJ2ZXIgaGFzIG5vIGVmZmVjdCAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC03NTEgICBKYXZhICAgICAgICAgQWRkIGNsZWFyKCkgbWV0aG9kIHRvIFRCYXNlIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTc2NSAgIEphdmEgICAgICAgICBJbXByb3ZlZCBzdHJpbmcgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHBlcmZvcm1hbmNlIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTc2OCAgIEphdmEgICAgICAgICBBc3luYyBjbGllbnQgZm9yIEphdmEgKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtNzc0ICAgSmF2YSAgICAgICAgIFREZXNlcmlhbGl6ZXIgc2hvdWxkIHByb3ZpZGUgYSBwYXJ0aWFsRGVzZXJpYWxpemUgbWV0aG9kIGZvciBwcmltaXRpdmUgdHlwZXMgKFBpb3RyIEtvemlrb3dza2kpCi1USFJJRlQtNzgzICAgSmF2YSAgICAgICAgIC5lcXVhbHMgamF2YSBtZXRob2QgaXMgYnJva2VuIG9uIHN0cnVjdHMgY29udGFpbmluZyBiaW5hcnktdHlwZSBmaWVsZHMgKFVuYXNzaWduZWQpCi1USFJJRlQtODA0ICAgSmF2YSAgICAgICAgIENvbXBhcmVUbyBpcyBicm9rZW4gZm9yIHVuaW9ucyBzZXQgdG8gbWFwLCBzZXQsIG9yIGxpc3QgKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtODE0ICAgSmF2YSAgICAgICAgIEluY2x1ZGUgYSBUU2VydmxldCBpbiB0aGUgc3RhbmRhcmQgVGhyaWZ0IGRpc3RyaWJ1dGlvbiAoTWF0aGlhcyBIZXJiZXJ0cykKLVRIUklGVC04MTggICBKYXZhICAgICAgICAgQXN5bmMgY2xpZW50IGRvZXNuJ3Qgc2VuZCBtZXRob2QgYXJncyAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC04MzAgICBKYXZhICAgICAgICAgU3dpdGNoIGJpbmFyeSBmaWVsZCBpbXBsZW1lbnRhdGlvbiBmcm9tIGJ5dGVbXSB0byBCeXRlQnVmZmVyIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTgzMSAgIEphdmEgICAgICAgICBGcmFtZWRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24gdGhhdCByZXVzZXMgaXRzIGJ1ZmZlcnMgKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtODMzICAgSmF2YSAgICAgICAgIGJ1aWxkLnhtbCBpbiBsaWIvamF2YSBpcyBtaXNzaW5nIGEgY2xhc3NwYXRocmVmIGF0dHJpYnV0ZSBmb3IgdGhlIGphdmFkb2MgdGFzayAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC04MzYgICBKYXZhICAgICAgICAgUmFjZSBjb25kaXRpb24gY2F1c2VzIENhbmNlbGxlZEtleUV4Y2VwdGlvbiBpbiBUQXN5bmNDbGllbnRNYW5hZ2VyIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTg0MiAgIEphdmEgICAgICAgICBVcGdyYWRlIHRvIGN1cnJlbnQgdmVyc2lvbiBvZiBjb21tb25zLWxhbmcgKDIuNSBpbnN0ZWFkIG9mIDIuNCkgYW5kL29yIGNoYW5nZSBkZXBlbmRlbmN5IGluIGl2eS54bWwgdG8gbm90IGJlIGV4YWN0IChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTgxNSAgIEphdmFTY3JpcHQgICBEZXNlcmlhbGl6YXRpb24gb2YgbGlzdHMgaXMgY3JpdGljYWxseSBicm9rZW4uIChUIEpha2UgTHVjaWFuaSkKLVRIUklGVC04MjcgICBPQ2FtbCAgICAgICAgT0NhbWwgZ2VuZXJhdG9yIHRvIHRha2UgZGVmYXVsdCB2YWx1ZXMgaW50byBhY2NvdW50IChMZXYgV2Fsa2luKQotVEhSSUZULTY0NyAgIFBIUCAgICAgICAgICBQSFAgbGlicmFyeSBpcyBtaXNzaW5nIGluc3RhbGwgdGFyZ2V0IChBbnRob255IE1vbGluYXJvKQotVEhSSUZULTY4MiAgIFBIUCAgICAgICAgICBQSFAgZXh0ZW5zaW9uIGRvZXNuJ3QgY29tcGlsZSBvbiBNYWMgT1MgWCAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC03MTggICBQSFAgICAgICAgICAgVGhyaWZ0IFBIUCBsaWJyYXJ5IGluY2x1ZGVzIGNsb3NpbmcgdGFncyBhbmQgZXh0cmFuZW91cyB3aGl0ZXNwYWNlIChOaWNob2xhcyBUZWxmb3JkKQotVEhSSUZULTc3OCAgIFBIUCAgICAgICAgICBQSFAgc29ja2V0IGxpc3RlbmluZyBzZXJ2ZXIgKE5pY2sgSm9uZXMpCi1USFJJRlQtNzgwICAgUEhQICAgICAgICAgIFBIUCBleHRlbnNpb24gc29tZXRpbWVzIGNhdXNlcyBhbiBhYm9ydCB3aXRoIHR3byBleGNlcHRpb25zIGF0IHRoZSBzYW1lIHRpbWUgKERhdmlkIFJlaXNzKQotVEhSSUZULTgzNyAgIFBIUCAgICAgICAgICBQSFAgYWNjZWxlcmF0b3IgYnVnIGZvciB3cml0ZXMgPiA4ayAoVGhvbWFzIEtobykKLVRIUklGVC03ODIgICBQZXJsICAgICAgICAgUGVybCBjb2RlIGZvciB3cml0aW5nIGNvbnRhaW5lcnMgZG9lc24ndCBjb3VudCBsZW5ndGggb2Ygd3JpdGUqQmVnaW4gb3Igd3JpdGUqRW5kIChDb25yYWQgSHVnaGVzKQotVEhSSUZULTM5NSAgIFB5dGhvbiAgICAgICBQeXRob24gbGlicmFyeSArIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgdW5pY29kZSBzdHJpbmdzIChVbmFzc2lnbmVkKQotVEhSSUZULTEzMyAgIFJ1YnkgICAgICAgICAnbmFtZXNwYWNlIHJ1YnknIHNob3VsZCBlcnJvciBvdXQsIG9yIGJlIGFuIGFsaWFzIHRvICduYW1lc3BhY2UgcmInIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTY2NCAgIFJ1YnkgICAgICAgICBSdWJ5IGV4dGVuc2lvbiBmYWlscyB0byBidWlsZCB3aXRoIFJ1YnkgMS45LjEgKFJhamVzaCBNYWxlcGF0aSkKLVRIUklGVC02OTkgICBSdWJ5ICAgICAgICAgRXhjaXNlIHVudXNlZCAibmF0aXZlIHByb3RvY29sIG1ldGhvZCB0YWJsZSIgc3R1ZmYgZnJvbSB0aHJpZnRfbmF0aXZlIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTc2NyAgIFJ1YnkgICAgICAgICBydWJ5IGNvbXBpbGVyIGRvZXMgbm90IGtlZXAgY29tbWVudHMgZm9yIGVudW0gdmFsdWVzIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTgxMSAgIFJ1YnkgICAgICAgICBodHRwX2NsaWVudF90cmFuc3BvcnQucmI6IGFsbG93IGN1c3RvbSBodHRwIGhlYWRlcnMgKFRvbnkgS2FtZW5pY2spCi1USFJJRlQtNDU5ICAgUnVieSAgICAgICAgIFJ1YnkgaW5zdGFsbGF0aW9uIGFsd2F5cyB0cmllcyB0byB3cml0ZSB0byAvTGlicmFyeS9SdWJ5L3NpdGUgKE1hdHRoaWV1IEltYmVydCkKLQotCi1UaHJpZnQgMC4xLjAgLSBJbmN1YmF0aW5nIChub3QgcmVsZWFzZWQpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29tcGF0aWJpbGl0eSBCcmVha2luZyBDaGFuZ2VzOgotICBDKys6Ci0gICAgKiBJdCdzIHF1aXRlIHBvc3NpYmxlIHRoYXQgcmVnZW5lcmF0aW5nIGNvZGUgYW5kIHJlYnVpbGRpbmcgd2lsbCBiZQotICAgICAgcmVxdWlyZWQuICBNYWtlIHN1cmUgeW91ciBoZWFkZXJzIG1hdGNoIHlvdXIgbGlicyEKLQotICBKYXZhOgotCi0gIFB5dGhvbjoKLQotICBSdWJ5OgotICAgICogR2VuZXJhdGVkIGZpbGVzIG5vdyBoYXZlIHVuZGVyc2NvcmVkIG5hbWVzIFtUSFJJRlQtNDIxXQotICAgICogVGhlIGxpYnJhcnkgaGFzIGJlZW4gcmVhcnJhbmdlZCB0byBiZSBtb3JlIFJ1YnktbGlrZSBbVEhSSUZULTI3Nl0KLQotICBFcmxhbmc6Ci0gICAgKiBHZW5lcmF0ZWQgY29kZSB3aWxsIGhhdmUgdG8gYmUgcmVnZW5lcmF0ZWQsIGFuZCB0aGUgbmV3IGNvZGUgd2lsbAotICAgICAgaGF2ZSB0byBiZSBkZXBsb3llZCBhdG9taWNhbGx5IHdpdGggdGhlIG5ldyBsaWJyYXJ5IGNvZGUgW1RIUklGVC0xMzZdCi0KLU5ldyBGZWF0dXJlcyBhbmQgQnVnIEZpeGVzOgotICBDKys6Ci0gICAgKiBTdXBwb3J0IGZvciBUQ29tcGFjdFByb3RvY29sIFtUSFJJRlQtMzMzXQotCi0gIEphdmE6Ci0gICAgKiBTdXBwb3J0IGZvciBUQ29tcGFjdFByb3RvY29sIFtUSFJJRlQtMTEwXQotCi0gIFB5dGhvbjoKLSAgICAqIFN1cHBvcnQgZm9yIFR3aXN0ZWQgW1RIUklGVC0xNDhdCi0KLSAgUnVieToKLSAgICAqIFN1cHBvcnQgZm9yIFRDb21wYWN0UHJvdG9jb2wgW1RIUklGVC0zMzJdCi0KZGlmZiAtLWdpdCBhL0NIQU5HRVMubWQgYi9DSEFOR0VTLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYTE4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9DSEFOR0VTLm1kCkBAIC0wLDAgKzEsMjk0MyBAQAorIyBBcGFjaGUgVGhyaWZ0IENoYW5nZWxvZworCisjIyAwLjEzLjAKKworIyMjIE5ldyBMYW5ndWFnZXMKKworIyMjIERlcHJlY2F0ZWQgTGFuZ3VhZ2VzCisKKyMjIyBSZW1vdmVkIExhbmd1YWdlcworCistIFtUSFJJRlQtNDcxOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDcxOSkgLSBDb2NvYSBsYW5ndWFnZSB3YXMgcmVtb3ZlZCAtIHVzZSBzd2lmdCBpbnN0ZWFkLgorCisjIyMgRGVwcmVjYXRlZCBMYW5ndWFnZXMKKworLSBbVEhSSUZULTQ3MjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ3MjMpIC0gQ1NoYXJwIGFuZCBOZXRjb3JlIHRhcmdldHMgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCB3aXRoIHRoZSBuZXh0IHJlbGVhc2UgLSB1c2UgTmV0U3RkIGluc3RlYWQuCisJCisjIyMgQnJlYWtpbmcgQ2hhbmdlcworCistIFtUSFJJRlQtNDc0M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDc0MykgLSBjb21waWxlcjogcmVtb3ZlZCB0aGUgcGx1Zy1pbiBtZWNoYW5pc20KKy0gW1RIUklGVC00NzIwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NzIwKSAtIGNwcDogQysrMDMvQysrOTggc3VwcG9ydCBoYXMgYmVlbiByZW1vdmVkOyBhbHNvIHJlbW92ZWQgYm9vc3QgYXMgYSBydW50aW1lIGRlcGVuZGVuY3kKKy0gW1RIUklGVC00NzMwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NzMwKSAtIGNwcDogQm9vc3RUaHJlYWRGYWN0b3J5LCBQb3NpeFRocmVhZEZhY3RvcnksIFN0ZFRocmVhZEZhY3RvcnkgcmVtb3ZlZAorLSBbVEhSSUZULTQ3MzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ3MzIpIC0gY3BwOiBDTWFrZSBidWlsZCBjaGFuZ2VkIHRvIHVzZSBCVUlMRF9TSEFSRURfTElCUworLSBbVEhSSUZULTQ3MzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ3MzUpIC0gY3BwOiBSZW1vdmVkIFF0NCBzdXBwb3J0CistIFtUSFJJRlQtNDc0MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDc0MCkgLSBjcHA6IFVzZSBzdGQ6OmNocm9ubzo6ZHVyYXRpb24gZm9yIHRpbWVvdXRzCistIFtUSFJJRlQtNDY3Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY3MikgLSBjcHA6IFRUcmFuc3BvcnQ6OmdldE9yaWdpbigpIGlzIG5vdyBjb25zdAorLSBbVEhSSUZULTQ3MDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ3MDIpIC0gamF2YTogY2xhc3Mgb3JnLmFwYWNoZS50aHJpZnQuQXV0b0V4cGFuZGluZ0J1ZmZlciBpcyBubyBsb25nZXIgcHVibGljCistIFtUSFJJRlQtNDcwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDcwOSkgLSBqYXZhOiBjaGFuZ2VzIHRvIFVURi04IGhhbmRsaW5nIHJlcXVpcmUgSkRLIDEuNyBhdCBhIG1pbmltdW0KKy0gW1RIUklGVC00NzEyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NzEyKSAtIGphdmE6IGNsYXNzIG9yZy5hcGFjaGUudGhyaWZ0LlNob3J0U3RhY2sgaXMgbm8gbG9uZ2VyIHB1YmxpYworLSBbVEhSSUZULTQ3MjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ3MjUpIC0gamF2YTogY2hhbmdlIHJldHVybiB0eXBlIHNpZ25hdHVyZSBvZiAncHJvY2VzcycgbWV0aG9kcworLSBbVEhSSUZULTQ2NzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2NzUpIC0ganM6IG5vdyB1c2VzIG5vZGUtaW50NjQgZm9yIDY0IGJpdCBpbnRlZ2VyIGNvbnN0YW50cworCisjIyMgS25vd24gSXNzdWVzIChCbG9ja2VyIG9yIENyaXRpY2FsKQorCisKKyMjIDAuMTIuMAorCitSZWxlYXNlZCAyMDE5LUpBTi0wNAorCisjIyMgTmV3IExhbmd1YWdlcworLSBDb21tb24gTElTUCAoY2wpCistIFN3aWZ0CistIFR5cGVzY3JpcHQgKG5vZGV0cykKKworIyMjIERlcHJlY2F0ZWQgTGFuZ3VhZ2VzCistIEMrKzAzL0MrKzk4IChtb3ZlIHRvIEMrKzExKQorLSBDb2NvYSAobW92ZSB0byBTd2lmdCkKKworIyMjIEJyZWFraW5nIENoYW5nZXMgKHNpbmNlIDAuMTEuMCkKKy0gW1RIUklGVC00NTI5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTI5KSAtIFJ1c3QgZW51bSB2YXJpYW50cyBhcmUgbm93IGNhbWVsLWNhc2VkIGluc3RlYWQgb2YgdXBwZXJjYXNlZCB0byBjb25mb3JtIHRvIFJ1c3QgbmFtaW5nIGNvbnZlbnRpb25zCistIFtUSFJJRlQtNDQ0OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ0OCkgLSBTdXBwb3J0IGZvciBnb2xhbmcgMS42IGFuZCBlYXJsaWVyIGhhcyBiZWVuIGRyb3BwZWQuCistIFtUSFJJRlQtNDQ3NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ3NCkgLSBQSFAgbm93IHVzZXMgdGhlIFBTUi00IGxvYWRlciBieSBkZWZhdWx0IGluc3RlYWQgb2YgY2xhc3MgbWFwcy4KKy0gW1RIUklGVC00NTMyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTMyKSAtIG1ldGhvZCBzaWduYXR1cmVzIGNoYW5nZWQgaW4gdGhlIGNvbXBpbGVyJ3MgdF9vb3BfZ2VuZXJhdG9yLgorLSBbVEhSSUZULTQ2NDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2NDgpIC0gVGhlIEMgKEdMaWIpIGNvbXBpbGVyJ3MgaGFuZGxpbmcgb2YgbmFtZXNwYWNlcyBoYXMgYmVlbiBpbXByb3ZlZC4KKworIyMjIEtub3duIElzc3VlcyAoQmxvY2tlciBvciBDcml0aWNhbCkKKy0gW1RIUklGVC00MDM3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDM3KSAtIGJ1aWxkOiB1c2UgYSBzaW5nbGUgYnVpbGQgc3lzdGVtIGZvciB0aHJpZnQKKy0gW1RIUklGVC00MTE5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTE5KSAtIGJ1aWxkOiBib290c3RyYXAuc2ggaXMgbWlzc2luZyBmcm9tIHNvdXJjZSB0YXJiYWxsCistIFtUSFJJRlQtMzI4OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzI4OSkgLSBjc2hhcnA6IHNvY2tldCBleGhhdXN0aW9uIGluIGNzaGFycCBpbXBsZW1lbnRhdGlvbgorLSBbVEhSSUZULTMwMjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwMjkpIC0gY29jb2E6IEdldHRlcnMgZm9yIGZpZWxkcyBkZWZpbmVkIHdpdGggdXBwZXJjYXNlIG5hbWVzIGRvIG5vdCB3b3JrCistIFtUSFJJRlQtMzMyNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzMyNSkgLSBjb2NvYTogRXh0ZW5kZWQgc2VydmljZXMgYXJlbid0IHN1YmNsYXNzZXMgaW4gZ2VuZXJhdGVkIENvY29hCistIFtUSFJJRlQtNDExNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDExNikgLSBjb2NvYTogVGhyaWZ0IGRlLWNhcGl0YWxpemVzIHRoZSBuYW1lIG9mIElzU2V0IHByb3BlcnR5IGluIENvY29hCistIFtUSFJJRlQtMzg3N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzg3NykgLSBjcHA6IHRoZSBodHRwIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzdGFuZGFyZDsgaW50ZXJvcCB3aXRoIG90aGVyIGxhbmd1YWdlcyBpcyBzcG90dHkgYXQgYmVzdAorLSBbVEhSSUZULTQxODBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxODApIC0gY3BwOiBJbXBvc3NpYmxlIHRvIGJ1aWxkIFRocmlmdCBDKysgbGlicmFyeSBmb3IgQW5kcm9pZCAoTkRLKQorLSBbVEhSSUZULTQzODRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzODQpIC0gY3BwOiBVc2luZyBtdWx0aXBsZSBhc3luYyBzZXJ2aWNlcyBzaW11bHRhbmVvdXNseSBpcyBub3QgdGhyZWFkLXNhZmUKKy0gW1RIUklGVC0zMTA4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTA4KSAtIGhhc2tlbGw6IERlZmF1bHRlZCBzdHJ1Y3QgcGFyYW1ldGVycyBvbiBhIHNlcnZpY2UgZ2VuZXJhdGVzIGludmFsaWQgSGFza2VsbAorLSBbVEhSSUZULTM5OTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5OTApIC0gbm9kZWpzOiBFeGNlcHRpb24gc3dhbGxvd2VkIGJ5IGRlc2VyaWFsaXphdGlvbiBmdW5jdGlvbgorLSBbVEhSSUZULTQyMTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyMTQpIC0gbm9kZWpzOiBtYXA8aTY0LHZhbHVlPiBrZXkgdHJlYXRlZCBhcyBoZXggdmFsdWUgaW4gSmF2YVNjcmlwdAorLSBbVEhSSUZULTQ2MDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2MDIpIC0gbm9kZWpzOiBFUlJPUiBpbiAuL25vZGVfbW9kdWxlcy90aHJpZnQvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMgTW9kdWxlIG5vdCBmb3VuZDogRXJyb3I6IENhbid0IHJlc29sdmUgJ2NoaWxkX3Byb2Nlc3MnCistIFtUSFJJRlQtNDYzOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDYzOSkgLSBub2RlanM6IFNlcXVlbmNlIG51bWJlcmluZyBmb3IgbXVsdGlwbGV4ZWQgcHJvdG9jb2wgYnJva2VuCistIFtUSFJJRlQtMTMxMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTMxMCkgLSBwaHA6IHNlcXVlbmNlIGFuZCByZWNvbm5lY3Rpb24gbWFuYWdlbWVudCBpc3N1ZXMKKy0gW1RIUklGVC0xNTM4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTM4KSAtIHBocDogRXJyb3IgZHVyaW5nIGRlc2VyaWFsaXphdGlvbiBpbnQ2NCBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlCistIFtUSFJJRlQtMTU4MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTU4MCkgLSBwaHA6IHRocmlmdCB0eXBlIGk2NCBqYXZhIHRvIHBocCBzZXJpYWxpemUvZGVzZXJlYWxpemUgbm90IHdvcmtpbmcKKy0gW1RIUklGVC0xOTUwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTUwKSAtIHBocDogUEhQIGdldHMgc3R1Y2sgaW4gaW5maW5pdGUgbG9vcAorLSBbVEhSSUZULTI5NTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5NTQpIC0gcHl0aG9uOiBzZW5kaW5nIGludCBvciBmbG9hdCBpbiBhIGRvdWJsZSBmaWVsZCBicmVha3MgdGhlIGNvbm5lY3Rpb24KKy0gW1RIUklGVC00MDgwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDgwKSAtIHB5dGhvbjogdW5peCBzb2NrZXRzIGNhbiBnZXQgc3R1Y2sgZm9yZXZlcgorLSBbVEhSSUZULTQyODFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyODEpIC0gcHl0aG9uOiBnZW5lcmF0ZWQgY29kZSBpcyBvdXQgb2Ygb3JkZXIgYW5kIGNhdXNlcyBsb2FkIGlzc3VlcworLSBbVEhSSUZULTQ2NzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2NzcpIC0gcHkzOiBVbmljb2RlRGVjaWRlRXJyb3IgaW4gUHl0aG9uMworCisjIyMgQnVpbGQgUHJvY2VzcworLSBbVEhSSUZULTQwNjddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwNjcpIC0gV2luZG93cyB0aHJpZnQgY29tcGlsZXIgZGlzdHJpYnV0ZWQgb24gdGhlIGFwYWNoZSB3ZWIgc2l0ZSBoYXMgcnVudGltZSBkZXBlbmRlbmNpZXMKKy0gW1RIUklGVC00MzA4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzA4KSAtIEQgbGFuZ3VhZ2UgZG9ja2VyIGltYWdlcyBuZWVkIGRlbWlvcyBmb3IgbGliZXZlbnQgYW5kIG9wZW5zc2wgZml4ZWQgdG8gcmUtZW5hYmxlIG1ha2UgY3Jvc3Mgb24gZGxhbmcKKy0gW1RIUklGVC00NTc5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTc5KSAtIFVzZSBVYnVudHUgQmlvbmljICgxOC4wNCBMVFMpIGZvciBDSSBidWlsZHMgaW5zdGVhZCBvZiBBcnRmdWwgKDE3LjEwKQorLSBbVEhSSUZULTQ1MDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1MDgpIC0gRGVmaW5lIENJIG9wZXJhdGluZyBzeXN0ZW0gY292ZXJhZ2UgcnVsZXMgZm9yIHRoZSBwcm9qZWN0IGFuZCAoaG9wZWZ1bGx5KSBzaW1wbGlmeSBDSSBhIGxpdHRsZSBtb3JlCistIFtUSFJJRlQtNDM5N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM5NykgLSB1YnVudHUgaW5zdGFsbCBpbnN0cnVjdGlvbnMgYnJva2VuIG9uIDE2LjA0CistIFtUSFJJRlQtNDU0NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU0NSkgLSBBcHB2ZXlvciBidWlsZHMgYXJlIGZhaWxpbmcgZHVlIHRvIGEgaGFza2VsbCAvIGNhYmFsIHVwZGF0ZSBpbiBjaG9jb2xhdGV5CistIFtUSFJJRlQtNDQ1Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ1MikgLSBvcHRpbWl6ZSBEb2NrZXJmaWxlIChvbmx5IG9uZXRpbWUgYXB0LWdldCB1cGRhdGUpCistIFtUSFJJRlQtNDQ0MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ0MCkgLSBybSBgYnVpbGQvZG9ja2VyL3VidW50dS10cnVzdHkvRG9ja2VyZmlsZS5vcmlnYAorLSBbVEhSSUZULTQzNTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzNTIpIC0gVWJ1bnR1IEFydGZ1bCBkb2Vzbid0IGFwcGVhciB0byBiZSBjb21wYXRpYmxlIHdpdGggVGhyaWZ0IGFuZCBIYXhlIDMuNC4yCistIFtUSFJJRlQtNDY2Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY2NikgLSBETGFuZyBDbGllbnQgUG9vbCBUZXN0IGZhaWxzIHNwb3JhZGljYWxseQorLSBbVEhSSUZULTQ2NzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2NzYpIC0gQ0wgdHV0b3JpYWwgYnVpbGQgZmFpbHMgc3BvcmFkaWNhbGx5CistIFtUSFJJRlQtNDQ1Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ1NikgLSBNYWtlIGhheGVsaWIgZG93bmxvYWQgcXVpZXQgc28gaXQgZG9lc24ndCBibG93IHVwIHRoZSBidWlsZCBsb2cKKy0gW1RIUklGVC00NjA1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjA1KSAtIGJvb3RzdHJhcC5zaCBmYWlscyBpZiBhdXRvbWFrZT0xLjE2LjEKKworIyMjIGNfZ2xpYgorLSBbVEhSSUZULTQ2NDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2NDgpIC0gVGhlIEMgKEdMaWIpIGNvbXBpbGVyJ3MgaGFuZGxpbmcgb2YgbmFtZXNwYWNlcyBoYXMgYmVlbiBpbXByb3ZlZC4KKy0gW1RIUklGVC00NjIyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjIyKSAtIGdsaWJDIGNvbXBpbGF0aW9uIGlzc3VlCistIFtUSFJJRlQtNDY3MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY3MSkgLSBjIGdsaWIgaXMgdW5hYmxlIHRvIGhhbmRsZSBjbGllbnQgY2xvc2UgdW5leHBlY3RlZGx5CisKKyMjIyBjbCAobmV3IGxhbmd1YWdlIHN1cHBvcnQgaW4gMC4xMi4wKQorLSBbVEhSSUZULTgyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC04MikgLSBDb21tb24gTGlzcCBzdXBwb3J0CisKKyMjIyBjc2hhcnAKKy0gW1RIUklGVC00NTU4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTU4KSAtIHJlc2VydmVkIENzaGFycCBrZXl3b3JkcyBhcmUgbm90IGVzY2FwZWQgaW4gc29tZSBjYXNlcworLSBbVEhSSUZULTQ2MzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2MzcpIC0gQyMgYXN5bmMgbW9kZSBnZW5lcmF0ZXMgaW5jb3JyZWN0IGNvZGUgd2l0aCBpbmhlcml0ZWQgc2VydmljZXMKKy0gW1RIUklGVC00NjcyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjcyKSAtIElBc3luY1Jlc3VsdCBzdHlsZSBtZXRob2RzIG5vdCBiZWluZyBzdXBwb3J0ZWQgYnkgY2VydGFpbiB0cmFuc3BvcnRzIGxlYWRzIHRvIGlzc3VlcyBpbiBtaXhlZCBJU3luYy9JQXN5bmMgdXNlIGNhc2VzCistIFtUSFJJRlQtNDUzOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDUzOSkgLSBBbGxvdyBUQnVmZmVyZWRUcmFuc3BvcnQgdG8gYmUgdXNlZCBhcyBiYXNlIGNsYXNzCistIFtUSFJJRlQtNDUzNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDUzNSkgLSBYTUwgZG9jczsgY29kZSBjbGVhbnVwICh0YWJzLT5zcGFjZXM7IFN0cmluZy0+c3RyaW5nKQorLSBbVEhSSUZULTQ0OTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0OTIpIC0gcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgdHlwZSBtZW1iZXIgb2YgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGNhbm5vdCBiZSBhY2Nlc3NlZAorLSBbVEhSSUZULTQ0NDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0NDYpIC0gSlNPTlByb3RvY29sIEJhc2U2NCBFbmNvZGluZyBUcmltcyBQYWRkaW5nCistIFtUSFJJRlQtNDQ1NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ1NSkgLSBNaXNzaW5nIGRpc3Bvc2UgY2FsbHMgaW4gVGhyZWFkZWRTZXJ2ZXIgJiBUaHJlYWRwb29sU2VydmVyCistIFtUSFJJRlQtNDYwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDYwOSkgLSBrZWVwIElubmVyRXhjZXB0aW9uIHdoZXJldmVyIGFwcHJvcHJpYXRlCistIFtUSFJJRlQtNDY3M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY3MykgLSBJQXN5bmNSZXN1bHQgbm90IHN1cHBvcnRlZCBieSBsYXllcmVkIHRyYW5zcG9ydHMgKGJ1ZmZlcmVkL2ZyYW1lZCkKKworIyMjIGNwcAorLSBbVEhSSUZULTQ0NzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0NzYpIC0gVHlwZWNhc3RpbmcgcHJvYmxlbSBvbiBsaXN0IGl0ZW1zCistIFtUSFJJRlQtNDQ2NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ2NSkgLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgdGhyb3dpbmcgVEhSSUZUIExPR0dFUjogVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogVEhSSUZUX0VBR0FJTiAodW5hdmFpbGFibGUgcmVzb3VyY2VzKQorLSBbVEhSSUZULTQ2ODBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2ODApIC0gVEJ1ZmZlclRyYW5zcG9ydHMuaCBkb2VzIG5vdCBjb21waWxlIHVuZGVyIFZpc3VhbCBTdHVkaW8gMjAxNworLSBbVEhSSUZULTQ2MThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2MTgpIC0gVE5vbmJsb2NraW5nU2VydmVyIGNyYXNoIGJlY2F1c2Ugb2YgbGltaXRhdGlvbiBvZiBzZWxlY3QoKQorLSBbVEhSSUZULTQ2MjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2MjApIC0gVFpsaWJUcmFuc3BvcnQuY3BwIGRvZXNuJ3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGZvciB0aGUgemxpYiBmbHVzaCBtYXJrZXIgaW4gdGhlIGJ1ZmZlci4KKy0gW1RIUklGVC00NTcxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTcxKSAtIFplcm9NUSBjb250cmliIGxpYnJhcnkgbmVlZHMgYSByZWZyZXNoCistIFtUSFJJRlQtNDU1OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU1OSkgLSBUU1NMU2VydmVyU29ja2V0IGluY29ycmVjdGx5IHByaW50cyBlcnJvcnMKKy0gW1RIUklGVC00NTc4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTc4KSAtIE1vdmUgYFRBc3luY1Byb3RvY29sUHJvY2Vzc29yYCBpbnRvIG1haW4gdGhyaWZ0IGxpYnJhcnkKKy0gW1RIUklGVC00NDE4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NDE4KSAtIGV2aHR0cF9jb25uZWN0aW9uX25ldyBpcyBkZXByZWNhdGVkOyB1c2UgZXZodHRwX2Nvbm5lY3Rpb25fYmFzZV9uZXcKKworIyMjIGNvbXBpbGVyCistIFtUSFJJRlQtNDY0NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY0NCkgLSBDb21waWxlciBjYW5ub3QgYmUgY29tcGlsZWQgb24gbWFjT1MobWF5YmUgYWxzbyBvbiBvdGhlciBwbGF0Zm9ybXMgd2l0aCBjbGFuZykKKy0gW1RIUklGVC00NTMxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTMxKSAtIFRocmlmdCBnZW5lcmF0ZXMgd3JvbmcgUHl0aG9uIGNvZGUgZm9yIGltbXV0YWJsZSBzdHJ1Y3R1cmVzIHdpdGggb3B0aW9uYWwgbWVtYmVycworLSBbVEhSSUZULTQ1MTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1MTMpIC0gdGhyaWZ0IGdlbmVyYXRlZCBjb2RlIGlzIG5vdCBzdGFibGUgZm9yIGNvbnN0YW50cworLSBbVEhSSUZULTQ1MzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1MzIpIC0gQXZvaWQgdXBkYXRpbmcgVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlIGlmIHRoZSBvdXRwdXQgaGFzIG5vdCBjaGFuZ2VkCistIFtUSFJJRlQtNDQwMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQwMCkgLSBWaXN1YWwgU3R1ZGlvIENvbXBpbGVyIHByb2plY3Qgc2hvdWxkIGxpbmsgcnVudGltZSBzdGF0aWNhbGx5IGluIHJlbGVhc2UgYnVpbGRzCistIFtUSFJJRlQtNDM5OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM5OSkgLSBwbHVnaW4udGhyaWZ0IHRfY29uc3RfdmFsdWUgaXMgbm90IHVzZWQgYXMgYSB1bmlvbiBpbiBDKysgY29kZSAtLSBmaXggdGhpcworLSBbVEhSSUZULTQ0OTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0OTYpIC0gRGVhbGluZyB3aXRoIGxhbmd1YWdlIGtleXdvcmRzIGluIFRocmlmdCAoZS5nLiBzZXJ2aWNlIG1ldGhvZCBuYW1lcykKKy0gW1RIUklGVC00MzkzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzkzKSAtIHJlcGVhdGVkIHJ1bnMgb2YgY29tcGlsZXIgcHJvZHVjZSBkaWZmZXJlbnQgYmluYXJ5IG91dHB1dCBhdCBwbHVnaW4gaW50ZXJmYWNlCisKKyMjIyBkbGFuZworLSBbVEhSSUZULTQ0NzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0NzgpIC0gVGhyaWZ0IHdpbGwgbm90IGJ1aWxkIHdpdGggZGxhbmcgMi4wNzggb3IgbGF0ZXIKKy0gW1RIUklGVC00NTAzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTAzKSAtIGRsYW5nIHNlcnZlcnMgbG9nRXJyb3Igb24gbm9ybWFsIGNsaWVudCBkaXNjb25uZWN0aW9uCistIFtUSFJJRlQtNDMwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDMwOCkgLSBEIGxhbmd1YWdlIGRvY2tlciBpbWFnZXMgbmVlZCBkZW1pb3MgZm9yIGxpYmV2ZW50IGFuZCBvcGVuc3NsIGZpeGVkIHRvIHJlLWVuYWJsZSBtYWtlIGNyb3NzIG9uIGRsYW5nCisKKyMjIyBkYXJ0CistIFtUSFJJRlQtNDY0Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY0NikgLSBFZmZlY3RpdmUgRGFydCBhbmQgRXhjZXB0aW9ucworLSBbVEhSSUZULTQ0MzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0MzkpIC0gU2hvdWxkbid0IGRvd25sb2FkIGRhcnQuZGViIGRpcmVjdGx5LgorCisjIyMgZGVscGhpCistIFtUSFJJRlQtNDU2Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU2MikgLSBDYWxsaW5nIHdyb25nIGV4Y2VwdGlvbiBDVE9SIGxlYWRzIHRvICJjYWxsIGZhaWxlZDogdW5rbm93biByZXN1bHQiIGluc3RlYWQgb2YgdGhlIHJlYWwgZXhjZXB0aW9uIGJlaW5nIHRocm93bgorLSBbVEhSSUZULTQ1NTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NTQpIC0gdW5jb21waWxlYWJsZSBjb2RlIHdpdGggbWVtYmVyIG5hbWVzIHRoYXQgYXJlIGFsc28gdHlwZXMgdW5kZXIgc3BlY2lmaWMgY29uZGl0aW9ucworLSBbVEhSSUZULTQ0MjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0MjIpIC0gQWRkIEFzeW5jIGltcGxlbWVudGF0aW9uIHZpYSBJRnV0dXJlCistIFtUSFJJRlQtNDQ4NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ4NSkgLSBQb3NzaWJsZSBpbnZhbGlkIHB0ciBBViB3aXRoIG92ZXJsYXBwZWQgcmVhZC93cml0ZSBvbiBwaXBlcworLSBbVEhSSUZULTQ1NDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NDkpIC0gVGhyaWZ0IGV4Y2VwdGlvbnMgc2hvdWxkIGRlcml2ZSBmcm9tIFRFeGNlcHRpb24KKy0gW1RIUklGVC00NTQwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTQwKSAtIGJ1ZmZlcmVkIHRyYW5zcG9ydCBicm9rZW4gd2hlbiB0cnlpbmcgdG8gcmUtb3BlbiBhIGZvcm1lcmx5IGNsb3NlZCB0cmFuc3BvcnQKKy0gW1RIUklGVC00NDczXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NDczKSAtIE1vdmUgVGhyaWZ0LkNvbnNvbGUucGFzIG91dCBvZiB0aGUgTGlicmFyeQorLSBbVEhSSUZULTQ0OTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0OTApIC0gQWxsb3cgYSBkZWZhdWx0IHNlcnZpY2UgYXMgZmFsbGJhY2sgZm9yIG11bHRpcGxleCBwcm9jZXNzb3JzIGNvbm5lY3RlZCBieSBvbGQgY2xpZW50cworLSBbVEhSSUZULTQ0NTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0NTQpIC0gTGFyZ2Ugd3JpdGVzL3JlYWRzIG1heSBjYXVzZSByYW5nZSBjaGVjayBlcnJvcnMgaW4gZGVidWcgbW9kZQorLSBbVEhSSUZULTQ0NjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0NjEpIC0gQ29tcGlsZXIgZGlyZWN0aXZlIHNob3VsZCBtYXRjaCBEZWxwaGkgWEU0CistIFtUSFJJRlQtNDQ2Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ2MikgLSBGaXJzdCBsaW5lIGluIENvbnNvbGUgZHVwbGljYXRlZAorLSBbVEhSSUZULTQ2NDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2NDIpIC0gRlBVIGN0cmwgd29yZCBzZXR0aW5ncyBtYXkgY2F1c2UgYW4gdW5leHBlY3RlZCAiZGVub3JtYWxpemVkIiBlcnJvcgorLSBbVEhSSUZULTQ1ODldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1ODkpIC0gSFRUUCBjbGllbnQgdGltZW91dHMgYXJlIGEpIGluY29tcGxldGUgYW5kIGIpIG5vdCB1c2VkIGF0IGFsbAorLSBbVEhSSUZULTQ1OTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1OTApIC0gcnVubmluZyB0aGUgdGVzdCBjbGllbnQgdXNpbmcgSFRUUCB0cmFuc3BvcnQgbGVhZHMgdG8gIkNvSW5pdGlhbGl6ZSBub3QgY2FsbGVkIgorCisjIyMgZXJsYW5nCistIFtUSFJJRlQtNDQ5N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ5NykgLSBFcmxhbmcgcmVjb3JkcyBzaG91bGQgdXNlIG1hcCgpIGZvciBtYXAgdHlwZQorLSBbVEhSSUZULTQ0OTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0OTUpIC0gRXJsYW5nIHJlY29yZHMgc2hvdWxkIGFsbG93ICd1bmRlZmluZWQnIGZvciBub24tcmVxdWlyZWQgZmllbGRzCistIFtUSFJJRlQtNDU4MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU4MCkgLSBGaXggZXJsYW5nIHR1dG9yaWFsIHVucGFjayBvbiBXaW5kb3dzCistIFtUSFJJRlQtNDU4Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU4MikgLSBVYnVudHUgWGVuaWFsIGVybGFuZyAxOC4zICJtYWtlIGNoZWNrIiBmYWlscworCisjIyMgZ29sYW5nCistIFtUSFJJRlQtNDQ0OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ0OCkgLSBTdXBwb3J0IGZvciBnb2xhbmcgMS42IGFuZCBlYXJsaWVyIGhhcyBiZWVuIGRyb3BwZWQuCistIFtUSFJJRlQtNDI1M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI1MykgLSBHbyBnZW5lcmF0b3IgYXNzaWducyBzdHJpbmdzIHRvIGZpZWxkIGluIGNvbnN0IGluc3RlYWQgb2YgcG9pbnRlcnMuCistIFtUSFJJRlQtNDU3M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU3MykgLSBVbmlvbnMgRmllbGQgQ291bnQgRG9lcyBOb3QgQ29uc2lkZXIgQmluYXJ5CistIFtUSFJJRlQtNDQ0N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ0NykgLSBHb2xhbmc6IFBhbmljIG9uIHAuYy5DYWxsIHdoZW4gdXNpbmcgZGVwcmVjYXRlZCBpbml0aWFsaXplcnMKKy0gW1RIUklGVC00NjUwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjUwKSAtIFJlcXVpcmVkIGZpZWxkIGluY29ycmVjdGx5IG1hcmtlZCBhcyBzZXQgd2hlbiBmaWVsZFR5cGUgZG9lcyBub3QgbWF0Y2gKKy0gW1RIUklGVC00NDg2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NDg2KSAtIEdvbGFuZzogLXJlbW90ZS5nbyBjbGllbnQgY2xlYW51cAorLSBbVEhSSUZULTQ1MzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1MzcpIC0gVFNpbXBsZVNlcnZlciBjYW4gZXhpdCBBY2NlcHQgbG9vcCB3aXRoIGxvY2sgc3RpbGwgYWNxdWlyZWQKKy0gW1RIUklGVC00NTE2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTE2KSAtIEFkZCBzdXBwb3J0IGZvciBnbyAxLjEwCistIFtUSFJJRlQtNDQyMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQyMSkgLSBnb2xhbmcgdGVzdHMgcmVseSBvbiBnb21vY2ssIHdoaWNoIGhhcyBjaGFuZ2UgYmVoYXZpb3VyLCBjYXVzaW5nIHRlc3RzIHRvIGZhaWwKKy0gW1RIUklGVC00NjI2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjI2KSAtIENvbW11bmljYXRpb24gY3Jhc2ggd2hlbiB1c2luZyBiaW5hcnkvY29tcGFjdCBwcm90b2NvbCBhbmQgemxpYiB0cmFuc3BvcnQKKy0gW1RIUklGVC00NjU5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjU5KSAtIGdvbGFuZyByYWNlIGRldGVjdGVkIHdoZW4gY2xvc2luZyBsaXN0ZW5lciBzb2NrZXQKKworIyMjIGhhc2tlbGwKKy0gW1RIUklGVC00NjM0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjM0KSAtIEhhc2tlbGwgYnVpbGRzIHdpdGggb2xkZXIgY2FiYWwgY2Fubm90IHJlY29uY2lsZSBjb21wbGV4IHZlcnNpb24gcmVxdWlyZW1lbnRzCisKKyMjIyBqYXZhCistIFtUSFJJRlQtNDI1OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI1OSkgLSBUaHJpZnQgZG9lcyBub3QgY29tcGlsZSBkdWUgdG8gQW50IE1hdmVuIHRhc2sgZXJyb3JzCistIFtUSFJJRlQtMTQxOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQxOCkgLSBDb21waWxpbmcgVGhyaWZ0IGZyb20gc291cmNlOiBDbGFzcyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db25kaXRpb25UYXNrIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbmVzdGVkICJ0eXBlZm91bmQiIGVsZW1lbnQKKy0gW1RIUklGVC00NTMwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTMwKSAtIHByb3Bvc2FsOiBhZGQgbnVsbGFiaWxpdHkgYW5ub3RhdGlvbnMgdG8gZ2VuZXJhdGVkIEphdmEgY29kZQorLSBbVEhSSUZULTQ2MTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2MTQpIC0gR2VuZXJhdGUgbWlzc2luZyBATnVsbGFibGUgYW5ub3RhdGlvbnMgZm9yIEphdmEgaXRlcmF0b3IgZ2V0dGVycworLSBbVEhSSUZULTQ1NTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NTUpIC0gR2V0dGVyIG9mIGJpbmFyeSBmaWVsZCBpbiBKYXZhIGNyZWF0ZXMgdW5uZWNlc3NhcnkgY29weQorLSBbVEhSSUZULTM5ODNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5ODMpIC0gbGlidGhyaWZ0IGlzIGRlcGxveWVkIG9uIGNlbnRyYWwgd2l0aCBwb20gcGFja2FnaW5nIGluc3RlYWQgb2YgamFyCistIFtUSFJJRlQtNDI5NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI5NCkgLSBKYXZhIENvbmZpZ3VyZSBGYWlscyBmb3IgQW50ID49IDEuMTAKKy0gW1RIUklGVC00MTc4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTc4KSAtIEphdmEgbGlicmFyaWVzIG1pc3NpbmcgZnJvbSBwYWNrYWdlIHdoZW4gdXNpbmcgY21ha2UKKy0gW1RIUklGVC00MTIwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTIwKSAtIHBvbSBmaWxlcyBhcmUgbm90IGdlbmVyYXRlZCBvciBwcm92aWRlZCBpbiB0aGUgYnVpbGQKKy0gW1RIUklGVC0xNTA3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTA3KSAtIE1hdmVuIGNhbid0IGRvd25sb2FkIHJlc291cmNlIGZyb20gY2VudHJhbCB3aGVuIGJlaGluZCBhIHByb3h5IGFuZCB3b24ndCB1c2UgbG9jYWwgcmVwb3NpdG9yeQorLSBbVEhSSUZULTQ1NTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NTYpIC0gT3B0aW9uYWwgcmV0aHJvdyBvZiB1bmhhbmRsZWQgZXhjZXB0aW9ucyBpbiBqYXZhIHByb2Nlc3NvcgorLSBbVEhSSUZULTQzMzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzMzcpIC0gQWJsZSB0byBzZXQga2V5U3RvcmUgYW5kIHRydXN0U3RvcmUgYXMgSW5wdXRTdHJlYW0gaW4gdGhlIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzCistIFtUSFJJRlQtNDU2Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU2NikgLSBQYXNzIG1lc3NhZ2Ugb2YgdW5oYW5kbGVkIGV4Y2VwdGlvbiB0byBvcHRpb25hbCByZXRocm93LgorLSBbVEhSSUZULTQ1MDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1MDYpIC0gUmVtb3ZlIGFzc2VydGlvbiBpbiBKYXZhIFNBU0wgY29kZSB0aGF0IHdvdWxkIGJlIGlnbm9yZWQgaW4gcmVsZWFzZSBidWlsZHMKKy0gW1RIUklGVC00NDcwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NDcwKSAtIEluY2x1ZGUgcG9wdWxhciBJREUgZmlsZSB0ZW1wbGF0ZXMgdG8gZ2l0aWdub3JlCistIFtUSFJJRlQtNDQyOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQyOSkgLSBNYWtlIFRUaHJlYWRQb29sU2VydmVyLmV4ZWN1dG9yU2VydmljZV8gYXZhaWxhYmxlIGluIGluaGVyaXRlZCBjbGFzc2VzIGFuZCByZWZhY3RvciBtZXRob2RzIHRvIGJlIGFibGUgY3VzdG9taXphdGlvbgorLSBbVEhSSUZULTM3NjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NjkpIC0gRml4IGxvZ2ljIG9mIFRIUklGVC0yMjY4CistIFtUSFJJRlQtNDQ5NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ5NCkgLSBJbmNyZWFzZSBKYXZhIFNvY2tldCBCdWZmZXIgU2l6ZQorLSBbVEhSSUZULTQ0OTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0OTkpIC0gUmVtb3ZlIE1hZ2ljIE51bWJlciBJbiBURklsZVRyYW5zcG9ydAorCisjIyMganMKKy0gW1RIUklGVC00NDA2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NDA2KSAtIEphdmFTY3JpcHQ6IFVzZSBtb2Rlcm4gUHJvbWlzZSBpbXBsZW1lbnRhdGlvbnMKKy0gW1RIUklGVC00NjI1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjI1KSAtIGxldCAvIGNvbnN0IHZhcmlhYmxlIGRlY29yYXRvcnMgZm9yIGVzNiBjb21waWxlcgorLSBbVEhSSUZULTQ2NTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2NTMpIC0gRVM2IENsYXNzZXMKKy0gW1RIUklGVC00NTkyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTkyKSAtIEpTOiByZWFkSTMyIHBlcmZvcm1hbmNlIG9uIGxhcmdlIGFycmF5cyBpcyB2ZXJ5IHBvb3IgaW4gQ2hyb21lCistIFtUSFJJRlQtNDUwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDUwOSkgLSBqcyBhbmQgbm9kZWpzIGxpYnJhcmllcyBuZWVkIHRvIGJlIHJlZnJlc2hlZCB3aXRoIGN1cnJlbnQgbGlicmFyaWVzCistIFtUSFJJRlQtNDQwM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQwMykgLSB0aHJpZnQuanM6IEluY29ycmVjdCB1c2FnZSBvZiAndGhpcycgaW4gVFdlYlNvY2tldFRyYW5zcG9ydC5fX29uT3BlbgorLSBbVEhSSUZULTQ0MzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0MzYpIC0gRGVzZXJpYWxpemF0aW9uIG9mIG5lc3RlZCBsaXN0IGRpc2NhcmRzIGNvbnRlbnQKKy0gW1RIUklGVC00NDM3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NDM3KSAtIEpTIFdlYlNvY2tldCBjbGllbnQgY2FsbGJhY2tzIGludm9rZWQgdHdpY2Ugb24gcGFyYWxsZWwgcmVxdWVzdHMKKy0gW1RIUklGVC00Njc5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00Njc5KSAtIER1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgaW4gbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMKKy0gW1RIUklGVC00NTUxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTUxKSAtIEFkZCBwcmV0dGllciBmb3IgY29uc2lzdGVudCBKUyBjb2RlIGZvcm1hdHRpbmcKKworIyMjIGx1YQorLSBbVEhSSUZULTQ1OTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1OTEpIC0gbHVhIGNsaWVudCB1c2VzIHR3byB3cml0ZSgpIGNhbGxzIHBlciBmcmFtZWQgbWVzc2FnZSBzZW5kCistIFtUSFJJRlQtMzg2M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzg2MykgLSBDYW4ndCAibWFrZSBpbnN0YWxsIiBMdWEgTGlicmFyeQorCisjIyMgbmV0Y29yZQorLSBbVEhSSUZULTQ1MjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1MjQpIC0gLk5FVCBDb3JlIFNlcnZlciBkb2Vzbid0IGNsb3NlIHByb3Blcmx5IHdoZW4gY2FuY2VsbGVkCistIFtUSFJJRlQtNDQzNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQzNCkgLSBVcGRhdGUgLk5FVCBDb3JlIGNvbXBvbmVudHMsIGFkZCB0ZXN0cyBmb3IgLk5ldCBDb3JlIGxpYnJhcnkgYW5kIC5OZXQgQ29yZSBjb21waWxlciwgZml4IGJ1Z3MgYW5kIGJ1aWxkIHByb2Nlc3MKKy0gW1RIUklGVC00NDQ2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NDQ2KSAtIEpTT05Qcm90b2NvbCBCYXNlNjQgRW5jb2RpbmcgVHJpbXMgUGFkZGluZworCisjIyMgbm9kZS5qcworLSBbVEhSSUZULTQyMjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyMjUpIC0gRXJyb3IgaGFuZGxpbmcgbWFsZm9ybWVkIGFyZ3VtZW50cyBsZWFrcyBtZW1vcnksIGNvcnJ1cHRzIHRyYW5zcG9ydCBidWZmZXJzIGNhdXNpbmcgbmV4dCBSUEMgdG8gZmFpbAorLSBbVEhSSUZULTM5NTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5NTApIC0gTWVtb3J5IGxlYWsgd2hpbGUgY2FsbGluZyBvbmV3YXkgbWV0aG9kCistIFtUSFJJRlQtMzE0M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzE0MykgLSBhZGQgdHlwZXNjcmlwdCBkaXJlY3Rvcnkgc3VwcG9ydAorLSBbVEhSSUZULTQ1NjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NjQpIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IGNhbiBsZWF2ZSBjb3JydXB0IGRhdGEgaW4gdGhlIGJ1ZmZlcgorLSBbVEhSSUZULTQ2NDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2NDcpIC0gTm9kZS5qcyBGaWxlc2VydmVyIHdlYnJvb3QgcGF0aAorLSBbVEhSSUZULTQ0ODldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0ODkpIC0gVW5peCBkb21haW4gc29ja2V0IHN1cHBvcnQgZm9yIE5vZGVKUyBjbGllbnQKKy0gW1RIUklGVC00NDQzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NDQzKSAtIG5vZGUuanMganNvbl9wcm90b2NvbCB0aHJvd3MgZXJyb3IgaW4gc2tpcCBmdW5jdGlvbgorLSBbVEhSSUZULTQ2MDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2MDQpIC0gTm9kZUpTOiBFeHBvc2UgSW50NjQgZnJvbSBicm93c2VyLmpzIGZvciBjb25zdW1wdGlvbiBieSBicm93c2VyCistIFtUSFJJRlQtNDQ4MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ4MCkgLSBOb2RlSlMgd2FybmluZyBvbiBiaW5hcnlfcHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kIHdoZW4gc2VxaWQgPSAwCisKKyMjIyBwZXJsCistIFtUSFJJRlQtNDM4Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM4MikgLSBSZXBsYWNlIHRoZSB1c2Ugb2YgUGVybCBJbmRpcmVjdCBPYmplY3QgU3ludGF4IGNhbGxzIHRvIG5ldygpCistIFtUSFJJRlQtNDQ3MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ3MSkgLSBUaHJpZnQgQ1BBTiByZWxlYXNlIGlzIG1pc3NpbmcgTWFrZWZpbGUuUEwgYW5kIHRoZSBjbGllbnRzIGFyZSB1bmFibGUgdG8gYnVpbGQgdGhlIG1vZHVsZQorLSBbVEhSSUZULTQ0MTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0MTYpIC0gUGVybCBDUEFOIFBhY2thZ2luZyBJbXByb3ZlbWVudHMKKworIyMjIHBocAorLSBbVEhSSUZULTQ0NzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0NzQpIC0gUEhQIGdlbmVyYXRvciB1c2UgUFNSLTQgZGVmYXVsdAorLSBbVEhSSUZULTQ0NjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0NjMpIC0gUEhQIGdlbmVyYXRlZCBjb2RlIG1hdGNoIFBTUi0yCistIFtUSFJJRlQtNDM3M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM3MykgLSBFeHRlbmRpbmcgVGhyaWZ0IGNsYXNzIHJlc3VsdHMgaW4gIkF0dGVtcHQgc2VyaWFsaXplIGZyb20gbm9uLVRocmlmdCBvYmplY3QiCistIFtUSFJJRlQtNDM1NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM1NCkgLSBUU29ja2V0IGJsb2NrIG9uIHJlYWQKKy0gW1RIUklGVC00NDIzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NDIzKSAtIG1pZ3JhdGUgcGhwIGxpYnJhcnkgdG8gcHNyLTQKKy0gW1RIUklGVC00NjU2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjU2KSAtIGluZmluaXRlIGxvb3AgaW4gbGF0ZXN0IFBIUCBsaWJyYXJ5CistIFtUSFJJRlQtNDQ3N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ3NykgLSBUQnVmZmVyZWRUcmFuc3BvcnQgbXVzdCBoYXZlIHVuZGVybHlpbmcgdHJhbnNwb3J0CistIFtUSFJJRlQtNDQ3NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ3NSkgLSBsaWIvcGhwL3Rlc3Qgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIFBTUi0yCistIFtUSFJJRlQtNDQ5OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ5OCkgLSBhZGQgcGhwY3MgYmFjaworLSBbVEhSSUZULTQ0NjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0NjApIC0gcGhwIGxpYnJhcnkgdXNlIFBTUi0yCistIFtUSFJJRlQtNDY0MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY0MSkgLSBUQ3VybENsaWVudCBkb2Vzbid0IGNoZWNrIGZvciBIVFRQIHN0YXR1cyBjb2RlCistIFtUSFJJRlQtNDY0NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY0NSkgLSBUQ3VybENsaWVudDogc2hvdyBhY3R1YWwgZXJyb3IgbWVzc2FnZSB3aGVuIHRocm93aW5nIFRUcmFuc3BvcnRFeGNlcHRpb24KKy0gW1RIUklGVC00Njc0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00Njc0KSAtIEFkZCBzdHJlYW0gY29udGV4dCBzdXBwb3J0IGludG8gUEhQL1RIdHRwQ2xpZW50CistIFtUSFJJRlQtNDQ1OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ1OSkgLSByZWR1Y2UgcGhwIGxpYnJhcnkgZGlyZWN0b3J5IGRlcHRoCisKKyMjIyBweXRob24KKy0gW1RIUklGVC00NjcwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjcwKSAtIFR3aXN0ZWQsIHNsb3RzLCBhbmQgdm9pZCBtZXRob2QgZmFpbHMgd2l0aCAib2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3N1Y2Nlc3MnIgorLSBbVEhSSUZULTQ0NjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0NjQpIC0gUG90ZW50aWFsbHkgc2VydmVyLWNyYXNoaW5nIHR5cG8gaW4gUHl0aG9uIFROb25ibG9ja2luZ1NlcnZlcgorLSBbVEhSSUZULTQ1NDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NDgpIC0gU3VwcG9ydGluZyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBwcm90b2NvbCB3aGVuIHVzaW5nIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpbiBQeXRob24KKy0gW1RIUklGVC00NTc3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTc3KSAtIE91dGRhdGVkIGNpcGhlciBzdHJpbmcgaW4gcHl0aG9uIHVuaXQgdGVzdAorLSBbVEhSSUZULTQ1MDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1MDUpIC0gcHl0aG9uIGJ1aWxkIG9uIFZhZ3JhbnQgV2luZG93cyBib3hlcyBmYWlscworLSBbVEhSSUZULTQ2MjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2MjEpIC0gVEhlYWRlciBmb3IgUHl0aG9uCistIFtUSFJJRlQtNDY2OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY2OCkgLSBtYWtlIHNvY2tldCBiYWNrbG9nIGNvbmZpZ3VyYWJsZSBmb3IgcHl0aG9uCistIFtUSFJJRlQtNDU2MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU2MSkgLSBQeXRob246IGNsZWFudXAgc29ja2V0IHRpbWVvdXQgc2V0dGluZ3MKKworIyMjIHJ1YnkKKy0gW1RIUklGVC00Mjg5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00Mjg5KSAtIFRocmlmdCBSU3BlYyB0ZXN0IHN1aXRlIGZhaWxzIHdpdGggUnVieSAyLjQueCBkdWUgdG8gRml4bnVtIGRlcHJlY2F0aW9uCistIFtUSFJJRlQtNDM0Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM0MikgLSBTdXBwb3J0IHJ1YnkgcnNwZWMgMworLSBbVEhSSUZULTQ1MjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1MjUpIC0gQWRkIHNzbCBzb2NrZXQgb3B0aW9uIHRvIHJ1YnkgY3Jvc3MgdGVzdHMKKy0gW1RIUklGVC00NDUwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NDUwKSAtIEFkZCBzZWVrIHN1cHBvcnQgdG8gVENvbXBhY3RJbnB1dFByb3RvY29sIGluIFJ1c3QKKy0gW1RIUklGVC00NjMxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjMxKSAtIENvZGVnZW4gQ3JlYXRlcyBJbnZhbGlkIFJ1YnkgZm9yIFJlY3Vyc2l2ZSBTdHJ1Y3RzCistIFtUSFJJRlQtNDQ3Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ3MikgLSBGaXggdGhlIGdlbnNwZWMgZm9yIHJ1Ynkgc28gaXQgZG9lcyBub3QgY29tcGxhaW4gYWJvdXQgYW4gaW52YWxpZCBsaWNlbnNlCisKKyMjIyBydXN0CistIFtUSFJJRlQtNDY2Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY2MikgLSBSdXN0IGNvbnN0IHN0cmluZyBjYWxscyBmdW5jdGlvbiBhdCBjb21waWxlIHRpbWUKKy0gW1RIUklGVC00NjYxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjYxKSAtIFJ1c3QgZW51bSBuYW1lIHdyb25nIGNhc2UgaW4gZ2VuZXJhdGVkIHN0cnVjdHMKKy0gW1RIUklGVC00NjE3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjE3KSAtIEF2b2lkIGdlbmVyYXRpbmcgY29uZmxpY3Rpbmcgc3RydWN0IG5hbWVzIGluIFJ1c3QgY29kZQorLSBbVEhSSUZULTQ1MjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1MjkpIC0gUnVzdCBnZW5lcmF0aW9uIHNob3VsZCBpbmNsdWRlICMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0gb3IgZm9yY2UgY29uZm9ybSB0byBSdXN0IHN0eWxlIGd1aWRlbGluZXMKKy0gW1RIUklGVC00MzkwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzkwKSAtIFJ1c3QgYmluYXJ5IHByb3RvY29sIGFuZCBidWZmZXJlZCB0cmFuc3BvcnQgY2Fubm90IGhhbmRsZSB3cml0ZXMgYWJvdmUgNDA5NiBieXRlcworLSBbVEhSSUZULTQ0MTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ0MTkpIC0gUnVzdCBmcmFtZWQgdHJhbnNwb3J0IGNhbm5vdCBoYW5kbGUgd3JpdGVzIGFib3ZlIDQwOTYgYnl0ZXMKKy0gW1RIUklGVC00NjU4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NjU4KSAtIFJ1c3QncyBUQmluYXJ5SW5wdXRQcm90b2NvbCBmYWlscyB3aGVuIHN0cmljdCBpcyBmYWxzZQorLSBbVEhSSUZULTQxODddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxODcpIC0gRGFydCAtPiBSdXN0IEZyYW1lZCBjcm9zcyB0ZXN0cyBmYWlsCistIFtUSFJJRlQtNDY2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY2NCkgLSBSdXN0IGNhbm5vdCBjcmVhdGUgUmVhZEhhbGYvV3JpdGVIYWxmIHRvIGltcGxlbWVudCBjdXN0b20gdHJhbnBvcnRzCistIFtUSFJJRlQtNDY2NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY2NSkgLSBLZWVwIFJ1c3QgbGlicmFyeSB1cC10by1kYXRlIG9uIGNyYXRlcy5pbworCisjIyMgc3dpZnQgKG5ldyBsYW5ndWFnZSBzdXBwb3J0IGluIDAuMTIuMCkKKy0gW1RIUklGVC0zNzczXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzczKSAtIFN3aWZ0IExpYnJhcnkKKworIyMjIHRlc3Qgc3VpdGUKKy0gW1RIUklGVC00NTE1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTE1KSAtIEdyYWNlZnVsbHkgc2h1dGRvd24gY3Jvc3MtdGVzdCBzZXJ2ZXJzIHRvIGZ1bGx5IHRlc3QgdGVhcmRvd24KKy0gW1RIUklGVC00MDg1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDg1KSAtIEFkZCAuTkVUIENvcmUgdG8gdGhlIG1ha2UgY3Jvc3Mgc3RhbmRhcmQgdGVzdCBzdWl0ZQorLSBbVEhSSUZULTQzNThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzNTgpIC0gQWRkIHVuaXggZG9tYWluIHNvY2tldHMgaW4gcnVieSB0byBjcm9zcyB0ZXN0IC0gY29kZSBleGlzdHMKKworIyMjIHR5cGVzY3JpcHQgKG5ldyBsYW5ndWFnZSBzdXBwb3J0IGluIDAuMTIuMCkKKy0gW1RIUklGVC0zMTQzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTQzKSAtIGFkZCB0eXBlc2NyaXB0IGRpcmVjdG9yeSBzdXBwb3J0CisKKyMjIDAuMTEuMAorCitSZWxlYXNlZCAyMDE3LURFQy0yNworCisjIyMgU3ViLXRhc2sKKy0gW1RIUklGVC0yNzMzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNzMzKSAtIEVybGFuZyBjb2Rpbmcgc3RhbmRhcmRzCistIFtUSFJJRlQtMjc0MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjc0MCkgLSBQZXJsIGNvZGluZyBzdGFuZGFyZHMKKy0gW1RIUklGVC0zNjEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjEwKSAtIFN0cmVhbWxpbmUgZXhjZXB0aW9uIGhhbmRsaW5nIGluIFB5dGhvbiBzZXJ2ZXIgaGFuZGxlcgorLSBbVEhSSUZULTM2ODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2ODYpIC0gSmF2YSBwcm9jZXNzb3Igc2hvdWxkIHJlcG9ydCBpbnRlcm5hbCBlcnJvciBvbiB1bmNhdWdodCBleGNlcHRpb24KKy0gW1RIUklGVC00MDQ5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDQ5KSAtIFNraXAoKSBzaG91bGQgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSBvbiB1bmtub3duIGRhdGEgdHlwZXMKKy0gW1RIUklGVC00MDUzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDUzKSAtIFNraXAoKSBzaG91bGQgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSBvbiB1bmtub3duIGRhdGEgdHlwZXMKKy0gW1RIUklGVC00MTM2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTM2KSAtIEFsaWduIGlzX2JpbmFyeSgpIG1ldGhvZCB3aXRoIGlzX3N0cmluZygpIHRvIHNpbXBsaWZ5IHRob3NlIGNoZWNrcworLSBbVEhSSUZULTQxMzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxMzcpIC0gRml4IHJlbWFpbmluZyB1bmRlZmluZWQgYmVoYXZpb3IgaW52YWxpZCB2cHRyIGNhc3RzIGluIFRocmlmdCBDb21waWxlcgorLSBbVEhSSUZULTQxMzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxMzgpIC0gRml4IHJlbWFpbmluZyB1bmRlZmluZWQgYmVoYXZpb3IgaW52YWxpZCB2cHRyIGNhc3RzIGluIEMrKyBsaWJyYXJ5CistIFtUSFJJRlQtNDI5Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI5NikgLSBGaXggVWJ1bnR1IFhlbmlhbCBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIHB5dGhvbiBsYW5ndWFnZQorLSBbVEhSSUZULTQyOThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyOTgpIC0gRml4IFVidW50dSBYZW5pYWwgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHRoZSBnbyAxLjYgbGFuZ3VhZ2UKKy0gW1RIUklGVC00Mjk5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00Mjk5KSAtIEZpeCBVYnVudHUgWGVuaWFsIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgRCBsYW5ndWFnZQorLSBbVEhSSUZULTQzMDBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzMDApIC0gRml4IG1ha2UgY3Jvc3MgaW4gVWJ1bnR1IFhlbmlhbCBkb2NrZXIgZW52aXJvbm1lbnQsIG9uY2UgYWxsIGxhbmd1YWdlIHN1cHBvcnQgaXNzdWVzIGFyZSBmaXhlZAorLSBbVEhSSUZULTQzMDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzMDIpIC0gRml4IFVidW50dSBYZW5pYWwgbWFrZSBjcm9zcyB0ZXN0aW5nIGZvciBsdWEgYW5kIHBocDcKKy0gW1RIUklGVC00Mzk4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00Mzk4KSAtIFVwZGF0ZSBFWFRSQV9ESVNUIGZvciAibWFrZSBkaXN0IgorCisjIyMgQnVnCistIFtUSFJJRlQtMzgxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODEpIC0gRmFpbCBmYXN0IGlmIGNvbmZpZ3VyZSBkZXRlY3RzIEMrKyBwcm9ibGVtcworLSBbVEhSSUZULTE2NzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NzcpIC0gTWluR1cgc3VwcG9ydCBicm9rZW4KKy0gW1RIUklGVC0xODA1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODA1KSAtIFRocmlmdCBzaG91bGQgbm90IHN3YWxsb3cgQUxMIGV4Y2VwdGlvbnMKKy0gW1RIUklGVC0yMDI2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDI2KSAtIEZpeCBUQ29tcGFjdFByb3RvY29sIDY0IGJpdCBidWlsZHMKKy0gW1RIUklGVC0yNjQyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNjQyKSAtIFJlY3Vyc2l2ZSBzdHJ1Y3RzIGRvbid0IHdvcmsgaW4gcHl0aG9uCistIFtUSFJJRlQtMjg4OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg4OSkgLSBzdGFibGUgcmVsZWFzZSAwLjkuMiwgZXJsYW5nIHR1dG9yaWFsIGJyb2tlbgorLSBbVEhSSUZULTI5MTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MTMpIC0gUnVieSBTZXJ2ZXIgVGhyaWZ0OjpUaHJlYWRQb29sU2VydmVyIHNob3VsZCBzZXJ2ZSBpbnNpZGUgYSB0aHJlYWQKKy0gW1RIUklGVC0yOTk4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTk4KSAtIE5vZGUuanM6IE1pc3NpbmcgaGVhZGVyIGZyb20gaHR0cCByZXF1ZXN0CistIFtUSFJJRlQtMzAwMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzAwMCkgLSAuTkVUIGltcGxlbWVudGF0aW9uIGhhcyB0cm91YmxlIHdpdGggbWl4ZWQgSVAgbW9kZXMKKy0gW1RIUklGVC0zMjgxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjgxKSAtIFRyYXZpcyBDSSBidWlsZCBwYXNzZWQgYnV0IHRoZSBsb2cgc2F5cyBCVUlMRCBGQUlMRUQKKy0gW1RIUklGVC0zMzU4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzU4KSAtIE1ha2VmaWxlOjEzNjI6ICoqKiBtaXNzaW5nIHNlcGFyYXRvci4gU3RvcC4KKy0gW1RIUklGVC0zNjAwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjAwKSAtIE1ha2UgVFR3aXN0ZWQgc2VydmVyIHNlbmQgZXhjZXB0aW9uIG9uIHVuZXhwZWN0ZWQgaGFuZGxlciBlcnJvcgorLSBbVEhSSUZULTM2MDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2MDIpIC0gTWFrZSBUb3JuYWRvIHNlcnZlciBzZW5kIGV4Y2VwdGlvbiBvbiB1bmV4cGVjdGVkIGhhbmRsZXIgZXJyb3IKKy0gW1RIUklGVC0zNjU3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjU3KSAtIEQgVEZpbGVXcml0ZXJUcmFuc3BvcnQgY2xvc2Ugc2hvdWxkIHVzZSBub24tcHJpb3JpdHkgc2VuZAorLSBbVEhSSUZULTM3MDBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3MDApIC0gR28gTWFwIGhhcyB3cm9uZyBkZWZhdWx0IHZhbHVlIHdoZW4gb3B0aW9uYWwKKy0gW1RIUklGVC0zNzAzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzAzKSAtIFVuaW9ucyBGaWVsZCBDb3VudCBEb2VzIE5vdCBDb25zaWRlciBNYXAvU2V0L0xpc3QgRmllbGRzCistIFtUSFJJRlQtMzczMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzczMCkgLSBzZXJ2ZXIgbG9nIGVycm9yIHR3aWNlCistIFtUSFJJRlQtMzc3OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc3OCkgLSBnbyBjbGllbnQgY2FuIG5vdCBwYXNzIG1ldGhvZCBwYXJhbWV0ZXIgdG8gc2VydmVyIG9mIG90aGVyIGxhbmd1YWdlIGlmIG5vIGZpZWxkX2lkIGlzIGdpdmVuCistIFtUSFJJRlQtMzc4NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc4NCkgLSB0aHJpZnQtbWF2ZW4tcGx1Z2luIGdlbmVyYXRlcyBpbnZhbGlkIGluY2x1ZGUgZGlyZWN0b3JpZXMgZm9yIElETCBpbiBkZXBlbmRlbmN5IEpBUnMKKy0gW1RIUklGVC0zODAxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODAxKSAtIE5vZGUgVGhyaWZ0IGNsaWVudCB0aHJvd3MgZXhjZXB0aW9uIHdpdGggbXVsdGlwbGV4ZXIgYW5kIHJlc3BvbnNlcyB0aGF0IGFyZSBiaWdnZXIgdGhhbiBhIHNpbmdsZSBidWZmZXIKKy0gW1RIUklGVC0zODIxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODIxKSAtIFRNZW1vcnlCdWZmZXIgYnVmZmVyIG1heSBvdmVyZmxvdyB3aGVuIHJlc2l6aW5nCistIFtUSFJJRlQtMzgzMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzgzMikgLSBUaHJpZnQgdmVyc2lvbiAwLjkuMyBleGFtcGxlIG9uIFdpbmRvd3MsIFZpc3VhbCBTdHVkaW8sIGxpbmtpbmcgZXJyb3JzIGR1cmluZyBjb21waWxpbmcKKy0gW1RIUklGVC0zODQ3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODQ3KSAtIHRocmlmdC9jb25maWcuaCBpbmNsdWRlcyBhICNkZWZpbmUgZm9yIFZFUlNJT04gd2hpY2ggd2lsbCBsaWtlbHkgY29uZmxpY3Qgd2l0aCBleGlzdGluZyB1c2VyIGVudmlyb25tZW50IG9yIGNvZGUKKy0gW1RIUklGVC0zODczXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODczKSAtIEZpeCB2YXJpb3VzIGJ1aWxkIHdhcm5pbmdzIHdoZW4gdXNpbmcgVmlzdWFsIFN0dWRpbworLSBbVEhSSUZULTM4OTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4OTEpIC0gVE5vbmJsb2NraW5nU2VydmVyIGNvbmZpZ3VyZWQgd2l0aCBtb3JlIHRoYW4gb25lIElPIHRocmVhZHMgZG9lcyBub3QgYWx3YXlzIHJldHVybiBmcm9tIHNlcnZlKCkgdXBvbiBzdG9wKCkKKy0gW1RIUklGVC0zODkyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODkyKSAtIFRocmlmdCB1c2VzIFRMUyBTTkkgZXh0ZW5zaW9uIHByb3ZpZGVkIGJ5IE9wZW5TU0wgbGlicmFyeS4gT2xkZXIgdmVyc2lvbiBvZiBPcGVuU1NMKDwgMC45LjhmKSBtYXkgY3JlYXRlIHByb2JsZW0gYmVjYXVzZSB0aGV5IGRvIG5vdCBzdXBwb3J0ICdTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoKScuCistIFtUSFJJRlQtMzg5NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzg5NSkgLSBCdWlsZCBmYWlscyB1c2luZyBKYXZhIDEuOCB3aXRoIEFudCA8IDEuOQorLSBbVEhSSUZULTM4OTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4OTYpIC0gbWFwPHN0cmluZyxzdHJpbmc+IGRhdGEgd2l0aCBudW1iZXIgc3RyaW5nIGtleSBjYW5ub3QgYWNjZXNzIHRoYXQgZGVzZXJpYWxpemVkIGJ5IHBocCBleHRlbnNpb24KKy0gW1RIUklGVC0zOTM4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTM4KSAtIFB5dGhvbiBUTm9uYmxvY2tpbmdTZXJ2ZXIgZG9lcyBub3Qgd29yayB3aXRoIFNTTAorLSBbVEhSSUZULTM5NDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5NDQpIC0gVFNTTFNvY2tldCBoYXMgZGVhZCBjb2RlIGluIGNoZWNrSGFuZHNoYWtlCistIFtUSFJJRlQtMzk0Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzk0NikgLSBKYXZhIDEuNSBjb21wYXRpYmlsaXR5IGJyb2tlbiBmb3IgYmluYXJ5IGZpZWxkcyAoamF2YTUgb3B0aW9uKQorLSBbVEhSSUZULTM5NjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5NjApIC0gSW5oZXJpdGVkIHNlcnZpY2VzIGluIEx1YSBnZW5lcmF0b3IgYXJlIG5vdCBuYW1lZCBjb3JyZWN0bHkKKy0gW1RIUklGVC0zOTYyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTYyKSAtIEFudCBidWlsZC54bWwgYnJva2VuIG9uIFdpbmRvd3MgZm9yIEphdmEgbGlicmFyeQorLSBbVEhSSUZULTM5NjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5NjMpIC0gVGhyaWZ0LmNhYmFsIGZpbGVuYW1lIGRvZXMgbm90IG1hdGNoIG1vZHVsZSBuYW1lCistIFtUSFJJRlQtMzk2N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzk2NykgLSBnb2JqZWN0L2dwYXJhbS5oOjE2NjozMzogd2FybmluZzogZW51bWVyYXRvciB2YWx1ZSBmb3Ig4oCYR19QQVJBTV9ERVBSRUNBVEVE4oCZIGlzIG5vdCBhbiBpbnRlZ2VyIGNvbnN0YW50IGV4cHJlc3Npb24KKy0gW1RIUklGVC0zOTY4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTY4KSAtIERlc2VyaWFsaXppbmcgZW1wdHkgc3RyaW5nL2JpbmFyeSBmaWVsZHMKKy0gW1RIUklGVC0zOTc0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTc0KSAtIFVzaW5nIGNsYW5nLTMuOCBhbmQgVGhyZWFkU2FuaXRpemVyIG9uIHRoZSBjb25jdXJyZW5jeV90ZXN0IGNsYWltcyBiYWQgUFRocmVhZCBiZWhhdmlvcgorLSBbVEhSSUZULTM5ODRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5ODQpIC0gUEhQNyBleHRlbnNpb24gY2F1c2VzIHNlZ2ZhdWx0CistIFtUSFJJRlQtNDAwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDAwOCkgLSBicm9rZW4gY2kgZHVlIHRvIHVwc3RyZWFtIGRlcGVuZGVuY3kgdmVyc2lvbmluZyBicmVhaworLSBbVEhSSUZULTQwMDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwMDkpIC0gVXNlIEBpbXBsZW1lbnRlciBpbnN0ZWFkIG9mIGltcGxlbWVudHMgaW4gVFR3aXN0ZWQucHkKKy0gW1RIUklGVC00MDEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDEwKSAtIFEuZmNhbGwgbWVzc2luZyB1cCB3aXRoICp0aGlzKiBwb2ludGVyIGluc2lkZSBjYWxsZWQgZnVuY3Rpb24KKy0gW1RIUklGVC00MDExXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDExKSAtIFNldHMgb2YgVGhyaWZ0IHN0cnVjdHMgZ2VuZXJhdGUgR28gY29kZSB0aGF0IGNhbid0IGJlIHNlcmlhbGl6ZWQgdG8gSlNPTgorLSBbVEhSSUZULTQwMTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwMTIpIC0gUHl0aG9uIFR3aXN0ZWQgaW1wbGVtZW50YXRpb24gdXNlcyBpbXBsZW1lbnRzLCBub3QgY29tcGF0aWJsZSB3aXRoIFB5MworLSBbVEhSSUZULTQwMTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwMTQpIC0gYWxpZ24gQyMgbWV0YSBkYXRhIGluIEFzc2VtYmx5SW5mby5jcworLSBbVEhSSUZULTQwMTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwMTUpIC0gRml4IHdyb25nbHkgc3BlbGxlZCAiVGhpcmZ0InMKKy0gW1RIUklGVC00MDE2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDE2KSAtIHRlc3RJbnNhbml0eSgpIGltcGwgZG9lcyBub3QgY29uZm9ybSB0byB0ZXN0IHNwZWMgaW4gVGhyaWZ0VGVzdC50aHJpZnQKKy0gW1RIUklGVC00MDIzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDIzKSAtIFNraXAgdW5leHBlY3RlZCBmaWVsZCB0eXBlcyBvbiByZWFkL3dyaXRlCistIFtUSFJJRlQtNDAyNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDAyNCkgLSBTa2lwKCkgc2hvdWxkIHRocm93IG9uIHVua25vd24gZGF0YSB0eXBlcworLSBbVEhSSUZULTQwMjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwMjYpIC0gVFNTTFNvY2tldCBkb2Vzbid0IHdvcmsgd2l0aCBQeXRob24gPCAyLjcuOQorLSBbVEhSSUZULTQwMjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwMjkpIC0gQWNjZWxlcmF0ZWQgcHJvdG9jb2xzIGRvIG5vdCBidWlsZCBmcm9tIHRocmlmdC1weSAwLjEwLjAgb24gUHlQSQorLSBbVEhSSUZULTQwMzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwMzEpIC0gR28gcGx1Z2luIGdlbmVyYXRlcyBpbnZhbGlkIGNvZGUgZm9yIGxpc3RzIG9mIHR5cGVkZWYnZWQgYnVpbHQtaW4gdHlwZXMKKy0gW1RIUklGVC00MDMzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDMzKSAtIERlZmF1bHQgYnVpbGQgV0lUSF9QTFVHSU49T04gZm9yIGFsbCBidWlsZHMgcmVzdWx0cyBpbiBwYWNrYWdpbmcgZXJyb3JzCistIFtUSFJJRlQtNDAzNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDAzNCkgLSBDTWFrZSBkb2Vzbid0IHdvcmsgdG8gYnVpbGQgY29tcGlsZXIgb24gTWFjT1MKKy0gW1RIUklGVC00MDM2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDM2KSAtIEFkZCAuTkVUIENvcmUgZW52aXJvbm1lbnQvYnVpbGQgc3VwcG9ydCB0byB0aGUgZG9ja2VyIGltYWdlCistIFtUSFJJRlQtNDAzOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDAzOCkgLSBzb2NrZXQgY2hlY2s6IGNoZWNraW5nIGFuIHVuc2lnbmVkIG51bWJlciBhZ2FpbnN0ID49IDAgbmV2ZXIgZmFpbHMKKy0gW1RIUklGVC00MDQyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDQyKSAtIEV4dHJhY3Rpb25FcnJvciB3aGVuIHVzaW5nIGFjY2VsZXJhdGVkIHRocmlmdCBpbiBhIG11bHRpcHJvY2VzcyB0ZXN0CistIFtUSFJJRlQtNDA0M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDA0MykgLSB0aHJpZnQgcGVybCBkZWJpYW4gcGFja2FnZSBpcyBwbGFjaW5nIGZpbGVzIGluIHRoZSB3cm9uZyBwbGFjZQorLSBbVEhSSUZULTQwNDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwNDQpIC0gQnVpbGQgam9iIDE3IGZhaWxpbmcgb24gZXZlcnkgcHVsbCByZXF1ZXN0OyBoc3BlYyBjb3JlIChoYXNrZWxsKSAyLjQgaXNzdWUKKy0gW1RIUklGVC00MDQ2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDQ2KSAtIE1pbkdXIHdpdGggZ2NjIDYuMiBkb2VzIG5vdCBjb21waWxlIG9uIFdpbmRvd3MKKy0gW1RIUklGVC00MDYwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDYwKSAtIFRocmlmdCBwcmludFRvIG9zdHJlYW0gb3ZlcmxvYWQgbWVjaGFuaXNtIGJyZWFrcyBkb3duIHdoZW4gdHlwZXMgYXJlIG5lc3RlZAorLSBbVEhSSUZULTQwNjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwNjIpIC0gUmVtb3ZlIGRlYnVnIHByaW50IGZyb20gVFNlcnZpY2VDbGllbnQKKy0gW1RIUklGVC00MDY1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDY1KSAtIERvY3VtZW50IFBlcmwgRm9ya2luZ1NlcnZlciBzaWduYWwgcmVzdHJpY3Rpb24gaW1wb3NlZCBieSBUSFJJRlQtMzg0OCBhbmQgcmVtb3ZlIHVubmVjZXNzYXJ5IGNvZGUKKy0gW1RIUklGVC00MDY4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDY4KSAtIEEgY29kZSBjb21tZW50IGluIEphdmEgU2VydmVyU29ja2V0IGlzIHdyb25nIGFyb3VuZCBhY2NlcHQoKQorLSBbVEhSSUZULTQwNzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwNzMpIC0gZW51bSBmaWxlcyBhcmUgc3RpbGwgYmVpbmcgZ2VuZXJhdGVkIHdpdGggdW51c2VkIGltcG9ydHMKKy0gW1RIUklGVC00MDc2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDc2KSAtIEFwcHZleW9yIGJ1aWxkcyBmYWlsaW5nIGJlY2F1c2UgYW50IDEuOS44IHdhcyByZW1vdmVkIGZyb20gYXBhY2hlIHNlcnZlcnMKKy0gW1RIUklGVC00MDc3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDc3KSAtIEFJX0FERFJDT05GSUcgcmVkZWZpbmVkIGFmdGVyIHJlY2VudCBjaGFuZ2UgdG8gUGxhdGZvcm1Tb2NrZXQgaGVhZGVyCistIFtUSFJJRlQtNDA3OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDA3OSkgLSBHZW5lcmF0ZWQgcGVybCBjb2RlIHRoYXQgcmV0dXJucyBzdHJ1Y3R1cmVzIGZyb20gaW5jbHVkZWQgdGhyaWZ0IGZpbGVzIGlzIG1pc3NpbmcgYSBuZWNlc3NhcnkgdXNlIGNsYXVzZQorLSBbVEhSSUZULTQwODddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwODcpIC0gU3B1cmlvdXMgZXhjZXB0aW9uIGRlc3Ryb3lpbmcgVFRocmVhZGVkU2VydmVyIGJlY2F1c2Ugb2YgaW5jb3JyZWN0IGpvaW4oKSBjYWxsCistIFtUSFJJRlQtNDEwMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDEwMikgLSBUQnVmZmVyZWRUcmFuc3BvcnQgcGVyZm9ybWFuY2UgaXNzdWUgc2luY2UgMC4xMC4wCistIFtUSFJJRlQtNDEwNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDEwNikgLSBjb25jdXJyZW5jeV90ZXN0IGZhaWxzIHJhbmRvbWx5CistIFtUSFJJRlQtNDEwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDEwOCkgLSBjX2dsaWIgdGhyaWZ0IHNzbCBoYXMgbXVsdGlwbGUgYnVncyBhbmQgZGVwcmVjYXRlZCBmdW5jdGlvbnMKKy0gW1RIUklGVC00MTA5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTA5KSAtIENvbmZpZ3VyZSBTY3JpcHQgdXNlcyBzdHJpbmcgY29tcGFyaXNvbiBmb3IgdmVyc2lvbnMKKy0gW1RIUklGVC00MTI5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTI5KSAtIEMrKyBUTm9uYmxvY2tpbmdTZXJ2ZXIgZmQgbGVhayB3aGVuIGZhaWxpbmcgdG8gZGlzcGF0Y2ggbmV3IGNvbm5lY3Rpb25zCistIFtUSFJJRlQtNDEzMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDEzMSkgLSBKYXZhc2NyaXB0IHdpdGggV2ViU29ja2V0IGhhbmRsZXMgb25ld2F5IG1ldGhvZHMgd3JvbmcKKy0gW1RIUklGVC00MTM0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTM0KSAtIEZpeCByZW1haW5pbmcgdW5kZWZpbmVkIGJlaGF2aW9yIGludmFsaWQgdnB0ciBjYXN0cworLSBbVEhSSUZULTQxNDBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxNDApIC0gVXNlIG9mIG5vbi10aHJlYWQtc2FmZSBmdW5jdGlvbiBnbXRpbWUoKQorLSBbVEhSSUZULTQxNDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxNDEpIC0gSW5zdGFsbGF0aW9uIG9mIGhheGUgaW4gZG9ja2VyIGZpbGVzIHJlZmVycyB0byBhIHJlZGlyZWN0IGxpbmsgYW5kIGZhaWxzCistIFtUSFJJRlQtNDE0N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDE0NykgLSBSdXN0OiBwcm90b2NvbCBzaG91bGQgYWNjZXB0IHRyYW5zcG9ydHMgd2l0aCBub24tc3RhdGljIGxpZmV0aW1lCistIFtUSFJJRlQtNDE0OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDE0OCkgLSBbbWF2ZW4tdGhyaWZ0LXBsdWdpbl0gY29tcGlsZSBlcnJvciB3aGlsZSBpbXBvcnQgYSB0aHJpZnQgaW4gZGVwZW5kZW5jeSBqYXIgZmlsZS4KKy0gW1RIUklGVC00MTQ5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTQ5KSAtIFN5c3RlbS5vdXQgcG9sbHV0ZXMgbG9nIGZpbGVzIAorLSBbVEhSSUZULTQxNTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxNTQpIC0gUEhQIGNsb3NlKCkgb2YgYSBUU29ja2V0IG5lZWRzIHRvIGNsb3NlIGFueSB0eXBlIG9mIHNvY2tldAorLSBbVEhSSUZULTQxNThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxNTgpIC0gbWlub3IgaXNzdWUgaW4gUkVBRE1FLU1TWVMyLm1kCistIFtUSFJJRlQtNDE1OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDE1OSkgLSBCdWlsZGluZyB0ZXN0cyBmYWlscyBvbiBNU1lTMiAoTWluR1c2NCkgZHVlIHRvIGEgKHNtYWxsPykgbGlua2VyIGVycm9yCistIFtUSFJJRlQtNDE2MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDE2MCkgLSBUTm9uYmxvY2tpbmcgc2VydmVyIGZpeCB1c2Ugb2YgY2xvc2VkL2ZyZWVkIGNvbm5lY3Rpb25zCistIFtUSFJJRlQtNDE2MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDE2MSkgLSBUTm9uQmxvY2tpbmcgc2VydmVyIHVzaW5nIHVuaW5pdGlhbGl6ZWQgZXZlbnQgaW4gZXJyb3IgcGF0aHMKKy0gW1RIUklGVC00MTYyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTYyKSAtIFROb25CbG9ja2luZyBoYW5kbGluZyBvZiBUU29ja2V0cyBpbiBlcnJvciBzdGF0ZSBpcyBpbmNvcnJlY3QgYWZ0ZXIgZmQgaXMgY2xvc2VkCistIFtUSFJJRlQtNDE2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDE2NCkgLSBDb3JlIGluIFRTU0xTb2NrZXQgY2xlYW51cE9wZW5TU0wgd2hlbiBkZXN0cm95aW5nIGEgbXV0ZXggdXNlZCBieSBvcGVuc3NsCistIFtUSFJJRlQtNDE2NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDE2NSkgLSBDKysgYnVpbGQgaGFzIG1hbnkgd2FybmluZ3MgdW5kZXIgYysrMDMgZHVlIHRvIHJlY2VudCBjaGFuZ2VzLCBjbWFrZSBuZWVkcyBiZXR0ZXIgcGxhdGZvcm0taW5kZXBlbmRlbnQgbGFuZ3VhZ2UgbGV2ZWwgY29udHJvbAorLSBbVEhSSUZULTQxNjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxNjYpIC0gUmVjZW50IGZpeCB0byByZW1vdmUgYm9vc3Q6OmxleGljYWxfY2FzdCB1c2FnZSBicm9rZSBWUzIwMTAKKy0gW1RIUklGVC00MTY3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTY3KSAtIE1pc3NpbmcgY29tcGlsZSBmbGFnCistIFtUSFJJRlQtNDE3MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDE3MCkgLSBTdXBwb3J0IGx1YSA1LjEgb3IgZWFybGllciBwcm9wZXJseSBmb3Igb2JqZWN0IGxlbmd0aCBkZXRlcm1pbmF0aW9uCistIFtUSFJJRlQtNDE3Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDE3MikgLSBub2RlLmpzIHR1dG9yaWFsIGNsaWVudCBkb2VzIG5vdCBpbXBvcnQgYXNzZXJ0LCBjb25uZWN0aW9uIGlzc3VlcyBhcmUgbm90IGhhbmRsZWQgcHJvcGVybHkKKy0gW1RIUklGVC00MTc3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTc3KSAtIEphdmEgY29tcGlsZXIgcHJvZHVjZXMgZGVlcCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgY291bGQgbWFrZSBzaGFsbG93IGNvcHkgaW5zdGVhZAorLSBbVEhSSUZULTQxODRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxODQpIC0gQnVpbGRpbmcgb24gQXBwdmV5b3I6IGludmFsaWQgZXNjYXBlIHNlcXVlbmNlIFxMCistIFtUSFJJRlQtNDE4NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDE4NSkgLSBmYjMwMyBjb3VudGVyIGVuY29kaW5nIGZpeAorLSBbVEhSSUZULTQxODldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxODkpIC0gRnJhbWVkL2J1ZmZlcmVkIHRyYW5zcG9ydCBEaXNwb3NlKCkgZG9lcyBub3QgZGlzcG9zZSB0aGUgbmVzdGVkIHRyYW5zcG9ydAorLSBbVEhSSUZULTQxOTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxOTMpIC0gTG93ZXIgdGhlIGRlZmF1bHQgbWF4UmVhZEJ1ZmZlckJ5dGVzIGZvciBub24tYmxvY2tpbmcgc2VydmVycworLSBbVEhSSUZULTQxOTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxOTUpIC0gQ29tcGlsYXRpb24gdG8gR08gcHJvZHVjZXMgYnJva2VuIGNvZGUKKy0gW1RIUklGVC00MTk2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTk2KSAtIENhbm5vdCBnZW5lcmF0ZSByZWN1cnNpdmUgUnVzdCB0eXBlcworLSBbVEhSSUZULTQyMDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyMDQpIC0gdHlwbyBpbiBjb21wYWN0IHNwZWMKKy0gW1RIUklGVC00MjA2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjA2KSAtIFN0cmluZ3MgaW4gY29udGFpbmVyIGZpZWxkcyBhcmUgbm90IGRlY29kZWQgcHJvcGVybHkgd2l0aCBweTpkeW5hbWljIGFuZCBweTp1dGY4c3RyaW5ncworLSBbVEhSSUZULTQyMDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyMDgpIC0gQyMgTmFtZWRQaXBlc1NlcnZlciBub3QgcmVhbGx5IHdvcmtpbmcgaW4gc29tZSBzY2VuYXJpb3MKKy0gW1RIUklGVC00MjExXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjExKSAtIEZpeCBHRXJyb3IgZ2xpYiBtYW5hZ2VtZW50IHVuZGVyIFRocmlmdAorLSBbVEhSSUZULTQyMTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyMTIpIC0gY19nbGliIGZsdXNoIHRyaWVzIHRvIGNsb3NlIFNTTCBldmVuIGlmIHNvY2tldCBpcyBpbnZhbGlkCistIFtUSFJJRlQtNDIxM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDIxMykgLSBUcmF2aXMgYnVpbGQgZmFpbHMgYXQgY3VybCAtc1NMIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9pbnN0YWxsLnNoIHwgc2gKKy0gW1RIUklGVC00MjE1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjE1KSAtIEdvbGFuZyBUVHJhbnNwb3J0RmFjdG9yeSBQYXR0ZXJuIFNxdWVsY2hlcyBFcnJvcnMKKy0gW1RIUklGVC00MjE2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjE2KSAtIEdvbGFuZyBIdHRwIENsaWVudHMgRG8gTm90IFJlc3BlY3QgVXNlciBPcHRpb25zCistIFtUSFJJRlQtNDIxOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDIxOCkgLSBTZXQgVENQX05PREVMQVkgZm9yIFBIUCBjbGllbnQgc29ja2V0CistIFtUSFJJRlQtNDIxOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDIxOSkgLSBHb2xhbmcgSFRUUCBjbGllbnRzIGNyZWF0ZWQgd2l0aCBOaWwgYnVmZmVyCistIFtUSFJJRlQtNDIzMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDIzMSkgLSBUSlNPTlByb3RvY29sIHRocm93cyB1bmV4cGVjdGVkIG5vbi1UaHJpZnQtZXhjZXB0aW9uIG9uIG51bGwgc3RyaW5ncworLSBbVEhSSUZULTQyMzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyMzIpIC0gLi9jb25maWd1cmUgZG9lcyBiYWQgYW50IHZlcnNpb24gY2hlY2sKKy0gW1RIUklGVC00MjM0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjM0KSAtIFRyYXZpcyBidWlsZCBmYWlscyBjcm9zcyBsYW5ndWFnZSB0ZXN0cyB3aXRoICJVbnN1cHBvcnRlZCBzZWN1cml0eSBwcm90b2NvbCB0eXBlIgorLSBbVEhSSUZULTQyMzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyMzcpIC0gR28gVFNlcnZlclNvY2tldCBSYWNlIENvbmRpdGlvbnMKKy0gW1RIUklGVC00MjQwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjQwKSAtIEdvIFRTaW1wbGVTZXJ2ZXIgZG9lcyBub3QgY2xvc2UgcHJvcGVybHkKKy0gW1RIUklGVC00MjQzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjQzKSAtIEdvIFRTaW1wbGVTZXJ2ZXIgcmFjZSBvbiB3YWl0IGluIFN0b3AoKSBtZXRob2QKKy0gW1RIUklGVC00MjQ1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjQ1KSAtIEdvbGFuZyBURnJhbWVkVHJhbnNwb3J0J3Mgd3JpdGVCdWZmZXIgaW5jcmVhc2VzIGlmIHdyaXRlcyB0byB0cmFuc3BvcnQgZmFpbGVkCistIFtUSFJJRlQtNDI0Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI0NikgLSBTZXF1ZW5jZSBudW1iZXIgbWlzbWF0Y2ggb24gbXVsdGlwbGV4ZWQgY2xpZW50cworLSBbVEhSSUZULTQyNDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyNDcpIC0gQ29tcGlsZSBmYWlscyB3aXRoIG9wZW5zc2wgMS4xCistIFtUSFJJRlQtNDI0OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI0OCkgLSBDb21waWxlIGZhaWxzIC0gc3RybmNweSwgbWVtY21wLCBtZW1zZXQgbm90IGRlY2xhcmVkIGluIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwCistIFtUSFJJRlQtNDI1MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI1MSkgLSBKYXZhIEVwb2xsIFNlbGVjdG9yIEJ1ZworLSBbVEhSSUZULTQyNTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyNTcpIC0gVHlwZXNjcmlwdCBhc3luYyBjYWxsYmFja3MgZG8gbm90IHByb3ZpZGUgdGhlIGNvcnJlY3QgdHlwZXMKKy0gW1RIUklGVC00MjU4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjU4KSAtIEJvb3N0L3N0ZCB0aHJlYWQgd3JhcHBpbmcgZmF1bHRpbmVzcworLSBbVEhSSUZULTQyNjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyNjApIC0gR28gY29udGV4dCBnZW5lcmF0aW9uIGlzc3VlLiBDb250ZXh0IGlzIHBhcmFtZXRlciBpbiBJbnRlcmZhY2Ugbm90IGluIGltcGxlbWVudGF0aW9uCistIFtUSFJJRlQtNDI2MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI2MSkgLSBHbyBjb250ZXh0IGdlbmVyYXRpb24gaXNzdWU6IGJyZWFraW5nIGNoYW5nZSBpbiBnZW5lcmF0ZWQgY29kZSByZWdhcmRpbmcgdGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiBpbnRlcmZhY2UKKy0gW1RIUklGVC00MjYyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjYyKSAtIEludmFsaWQgYmluZGluZyB0byBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KCkgd2l0aCA2NC1iaXQgdGFyZ2V0cworLSBbVEhSSUZULTQyNjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyNjMpIC0gRml4IHVzZSBhZnRlciBmcmVlIGJ1ZyBmb3IgdGhyb3duIGV4Y2VwdGlvbnMKKy0gW1RIUklGVC00MjY2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjY2KSAtIEVybGFuZyBsaWJyYXJ5IHRocm93cyBkdXJpbmcgc2tpcHBpbmcgZmllbGRzIG9mIGNvbXBvc2l0ZSB0eXBlIChtYXBzLCBsaXN0cywgc3RydWN0cywgc2V0cykKKy0gW1RIUklGVC00MjY4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjY4KSAtIEVybGFuZyBsaWJyYXJ5IGVtaXRzIGRlYnVnZ2luZyBvdXRwdXQgaW4gdHJhbnNwb3J0IGxheWVyCistIFtUSFJJRlQtNDI3M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI3MykgLSBlcmxhbmc6bm93LzA6IERlcHJlY2F0ZWQgQklGLiAKKy0gW1RIUklGVC00Mjc0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00Mjc0KSAtIFB5dGhvbiBmZWF0dXJlIHRlc3RzIGZvciBTU0wvVExTIGZhaWxpbmcKKy0gW1RIUklGVC00Mjc5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00Mjc5KSAtIFdyb25nIHBhdGggaW4gaW5jbHVkZSBkaXJlY3RpdmUgaW4gZ2VuZXJhdGVkIFRocmlmdCBzb3VyY2VzCistIFtUSFJJRlQtNDI4M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI4MykgLSBUTmFtZWRQaXBlU2VydmVyIHJhY2UgY29uZGl0aW9uIGluIGludGVycnVwdAorLSBbVEhSSUZULTQyODRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyODQpIC0gRmlsZSBjb250YWlucyBhIE5CU1A6IGxpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCistIFtUSFJJRlQtNDI5MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI5MCkgLSBDIyBudWxsYWJsZSBvcHRpb24gZ2VuZXJhdGVzIGludmFsaWQgY29kZSBmb3Igbm9uLXJlcXVpcmVkIGVudW0gZmllbGQgd2l0aCBkZWZhdWx0IHZhbHVlCistIFtUSFJJRlQtNDI5Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI5MikgLSBUaW1lck1hbmFnZXI6OnJlbW92ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZAorLSBbVEhSSUZULTQzMDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzMDcpIC0gTWFrZSBzc2wtb3BlbiB0aW1lb3V0IGVmZmVjdGl2ZSBpbiBnb2xhbmcgY2xpZW50CistIFtUSFJJRlQtNDMxMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDMxMikgLSBFcmxhbmcgY2xpZW50IGNhbm5vdCBjb25uZWN0IHRvIFB5dGhvbiBzZXJ2ZXI6IGV4Y2VwdGlvbiBlcnJvcjogZWNvbm5yZWZ1c2VkCistIFtUSFJJRlQtNDMxM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDMxMykgLSBQcm9ncmFtIGNvZGUgb2YgdGhlIEVybGFuZyB0dXRvcmlhbCBmaWxlcyBjb250YWluIHN5bnRheCBlcnJvcnMKKy0gW1RIUklGVC00MzE2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzE2KSAtIFRCeXRlQnVmZmVyLmphdmEgd2lsbCByZWFkIHRvbyBtdWNoIGRhdGEgaWYgYSBwcmV2aW91cyByZWFkIHJldHVybnMgZmV3ZXIgYnl0ZXMgdGhhbiByZXF1ZXN0ZWQKKy0gW1RIUklGVC00MzE5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzE5KSAtIGNvbW1hbmQgbGluZSBzd2l0Y2ggZm9yICJldmh0dHAiIGluY29ycmVjdGx5IHJlc29sdmVkIHRvIGFub24gcGlwZXMKKy0gW1RIUklGVC00MzIzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzIzKSAtIHJhbmdlIGNoZWNrIGVycm9ycyBvciBOUEUgaW4gZWRnZSBjYXNlcworLSBbVEhSSUZULTQzMjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzMjQpIC0gZmllbGQgbmFtZXMgY2FuIGNvbmZsaWN0IHdpdGggbG9jYWwgdmFycyBpbiBnZW5lcmF0ZWQgY29kZQorLSBbVEhSSUZULTQzMjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzMjgpIC0gVHJhdmlzIENJIGJ1aWxkcyBhcmUgdGltaW5nIG91dCAoam9iIDEpIGFuZCBoYXhlIGJ1aWxkcyBhcmUgZmFpbGluZyBzaW5jZSA5LzExCistIFtUSFJJRlQtNDMyOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDMyOSkgLSBjX2dsaWIgRG9lc24ndCBoYXZlIGEgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yCistIFtUSFJJRlQtNDMzMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDMzMSkgLSBDKys6IFRTU0xTb2NrZXRzIGJ1ZyBpbiBoYW5kbGluZyBodWdlIG1lc3NhZ2VzLCBidWcgaW4gaGFuZGxpbmcgcG9sbGluZworLSBbVEhSSUZULTQzMzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzMzIpIC0gQmluYXJ5IHByb3RvY29sIGhhcyBtZW1vcnkgbGVha3MKKy0gW1RIUklGVC00MzM0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzM0KSAtIFBlcmwgaW5kZW50YXRpb24gaW5jb3JyZWN0IHdoZW4gZGVmYXVsdGluZyBmaWVsZCBhdHRyaWJ1dGUgdG8gYSBzdHJ1Y3QKKy0gW1RIUklGVC00MzM5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzM5KSAtIFRocmlmdCBGcmFtZWQgVHJhbnNwb3J0IGluIEVybGFuZyBjcmFzaGVzIHNlcnZlciB3aGVuIGNsaWVudCBkaXNjb25uZWN0cworLSBbVEhSSUZULTQzNDBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzNDApIC0gRXJsYW5nIGZpeCBhIGNyYXNoIG9uIGNsaWVudCBjbG9zZQorLSBbVEhSSUZULTQzNTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzNTUpIC0gSmF2YXNjcmlwdCBpbmRlbnRhdGlvbiBpbmNvcnJlY3Qgd2hlbiBkZWZhdWx0aW5nIGZpZWxkIGF0dHJpYnV0ZSB0byBhIHN0cnVjdAorLSBbVEhSSUZULTQzNTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzNTYpIC0gdGhyaWZ0X3Byb3RvY29sIGNhbGwgVHJhbnNwb3J0IGNhdXNlIFNlZ21lbnRhdGlvbiBmYXVsdAorLSBbVEhSSUZULTQzNTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzNTkpIC0gSGF4ZSBjb21waWxlciBsb29rcyBsaWtlIGl0IGlzIHByb2R1Y2luZyBpbmNvcnJlY3QgY29kZSBmb3IgbWFwIG9yIHNldCBrZXkgdGhhdCBpcyBiaW5hcnkgdHlwZQorLSBbVEhSSUZULTQzNjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzNjIpIC0gTWlzc2luZyBzaXplLWNoZWNrIGNhbiBsZWFkIHRvIGh1Z2UgbWVtb3J5IGFsbG9jYXRpb24KKy0gW1RIUklGVC00MzY0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzY0KSAtIFdlYnNpdGUgY29udHJpYnV0aW5nIGd1aWRlIGVycm9uZW91c2x5IHJlY29tbWVuZHMgc3VibWl0dGluZyBwYXRjaGVzIGluIEpJUkEKKy0gW1RIUklGVC00MzY1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzY1KSAtIFBlcmwgZ2VuZXJhdGVkIGNvZGUgdXNlcyBpbmRpcmVjdCBvYmplY3Qgc3ludGF4LCB3aGljaCBvY2Nhc2lvbmFsbHkgY2F1c2VzIGNvbXBpbGF0aW9uIGVycm9ycy4KKy0gW1RIUklGVC00MzY3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzY3KSAtIHB5dGhvbiBUUHJvY2Vzc29yLnByb2Nlc3MgaXMgbWlzc2luZyAic2VsZiIKKy0gW1RIUklGVC00MzcwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzcwKSAtIFVidW50dSBBcnRmdWwgY3BwY2hlY2sgYW5kIGZsYWtlOCBhcmUgbW9yZSBzdHJpbmdlbnQgYW5kIGNhdXNpbmcgU0NBIGJ1aWxkIGpvYiBmYWlsdXJlcworLSBbVEhSSUZULTQzNzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzNzIpIC0gUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gCistIFtUSFJJRlQtNDM3NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM3NCkgLSBjYW5ub3QgbG9hZCB0aHJpZnRfcHJvdG9jb2wgZHVlIHRvIHVuZGVmaW5lZCBzeW1ib2w6IF9aVFZOMTBfX2N4eGFiaXYxMjBfX3NpX2NsYXNzX3R5cGVfaW5mb0UKKy0gW1RIUklGVC00Mzc1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00Mzc1KSAtIFRNZW1vcnkgdGhyb3cgYmFkX2FsbG9jIGR1ZSB0byBjb3VudGVyIG92ZXJmbG93CistIFtUSFJJRlQtNDM3Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM3NikgLSBDb3Zlcml0eSBoaWdoIGltcGFjdCBpc3N1ZSByZXNvbHV0aW9uCistIFtUSFJJRlQtNDM3N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM3NykgLSBoYXhlLiBzb2NrZXQgaGFuZGxlcyBsZWFrIGluIFRTaW1wbGVTZXJ2ZXIKKy0gW1RIUklGVC00MzgxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzgxKSAtIFdyb25nIGlzc2V0IGJpdGZpZWxkIHZhbHVlIGFmdGVyIHRyYW5zbWlzc2lvbgorLSBbVEhSSUZULTQzODVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzODUpIC0gR28gcmVtb3RlIGNsaWVudCAtdSBmbGFnIGlzIGJyb2tlbgorLSBbVEhSSUZULTQzOTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzOTIpIC0gY29tcGlsZXIvLi4uLi9wbHVnaW4udGhyaWZ0IHN0cnVjdHMgbWlzLW9yZGVyZWQgYmxvd3MgdXAgb2NhbWwgZ2VuZXJhdG9yCistIFtUSFJJRlQtNDM5NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM5NSkgLSBVbmFibGUgdG8gYnVpbGQgaW4gdGhlIHVidW50dS14ZW5pYWwgZG9ja2VyIGltYWdlOiBjbGFwIDIuMjggcmVxdWlyZXMgUnVzdCAxLjIwCistIFtUSFJJRlQtNDM5Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM5NikgLSBpbmNvbnNpc3RlbnQgKG9yIHBsYWluIHdyb25nKSB2ZXJzaW9uIG51bWJlcnMgaW4gbWFzdGVyL3RydW5rIAorCisjIyMgRG9jdW1lbnRhdGlvbgorLSBbVEhSSUZULTQxNTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxNTcpIC0gb3V0ZGF0ZWQgcmVhZG1lIGFib3V0IEhheGUgaW5zdGFsbGF0aW9uIG9uIExpbnV4CisKKyMjIyBJbXByb3ZlbWVudAorLSBbVEhSSUZULTEwNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTA1KSAtIG1ha2UgYSB0aHJpZnRfc3BlYyBmb3IgYSBzdHJ1Y3R1cmVzIHdpdGggbmVnYXRpdmUgdGFncworLSBbVEhSSUZULTI4MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgxKSAtIENvY29hIGxpYnJhcnkgY29kZSBuZWVkcyBjb21tZW50cywgYmFkbHkKKy0gW1RIUklGVC03NzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTc3NSkgLSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgZm9yIFBlcmwKKy0gW1RIUklGVC0yMjIxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjIxKSAtIEdlbmVyYXRlIGMrKyBjb2RlIHdpdGggc3RkOjpzaGFyZWRfcHRyIGluc3RlYWQgb2YgYm9vc3Q6OnNoYXJlZF9wdHIuCistIFtUSFJJRlQtMjM2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM2NCkgLSBPQ2FtbDogVXNlIE9hc2lzIGV4Y2x1c2l2ZWx5IGZvciBidWlsZCBwcm9jZXNzCistIFtUSFJJRlQtMjUwNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjUwNCkgLSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3Igc2hvdWxkIGFsbG93IHJlZ2lzdGVyaW5nIGRlZmF1bHQgcHJvY2Vzc29yIGNhbGxlZCBpZiBubyBzZXJ2aWNlIG5hbWUgaXMgcHJlc2VudAorLSBbVEhSSUZULTMyMDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyMDcpIC0gRW5hYmxlIGJ1aWxkIHdpdGggT3BlblNTTCAxLjEuMCBzZXJpZXMKKy0gW1RIUklGVC0zMjcyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjcyKSAtIFBlcmwgU1NMIEF1dGhlbnRpY2F0aW9uIFN1cHBvcnQKKy0gW1RIUklGVC0zMzU3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzU3KSAtIEdlbmVyYXRlIEVudW1TZXQvRW51bU1hcCB3aGVyZSBlbGVtZW50cy9rZXlzIGFyZSBlbnVtcworLSBbVEhSSUZULTMzNjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzNjkpIC0gSW1wbGVtZW50IFNTTC9UTFMgc3VwcG9ydCBvbiBDIHdpdGggY19nbGliCistIFtUSFJJRlQtMzQ2N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQ2NykgLSBHbyBNYXBzIGZvciBUaHJpZnQgU2V0cyBTaG91bGQgSGF2ZSBWYWx1ZXMgb2YgVHlwZSBzdHJ1Y3R7fSAKKy0gW1RIUklGVC0zNTgwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTgwKSAtIFRIZWFkZXIgZm9yIEhhc2tlbGwKKy0gW1RIUklGVC0zNjI3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjI3KSAtIE1pc3NpbmcgYmFzaWMgY29kZSBzdHlsZSBjb25zaXN0ZW5jeSBvZiBKYXZhU2NyaXB0LgorLSBbVEhSSUZULTM3MDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3MDYpIC0gVGhlcmUncyBubyBzdXBwb3J0IGZvciBNdWx0aXBsZXhlZCBwcm90b2NvbCBvbiBjX2dsaWIgbGlicmFyeQorLSBbVEhSSUZULTM3NjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NjYpIC0gQWRkIGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB0byBUWmxpYlRyYW5zcG9ydAorLSBbVEhSSUZULTM3NzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NzYpIC0gR28gY29kZSBmcm9tIG11bHRpcGxlIHRocmlmdCBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWVzcGFjZQorLSBbVEhSSUZULTM4MjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4MjMpIC0gRXNjYXBlIGRvY3VtZW50YXRpb24gd2hpbGUgZ2VuZXJhdGluZyBub24gZXNjYXBlZCBkb2N1bWV0YXRpb24KKy0gW1RIUklGVC0zODU0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODU0KSAtIGFsbG93IHVzZXJzIHRvIGNsZWFyIHJlYWQgYnVmZmVycworLSBbVEhSSUZULTM4NTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4NTkpIC0gVW5peCBEb21haW4gU29ja2V0IFN1cHBvcnQgaW4gT2JqZWN0aXZlLUMKKy0gW1RIUklGVC0zOTIxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTIxKSAtIEMrKyBjb2RlIHNob3VsZCBwcmludCBlbnVtcyBhcyBzdHJpbmdzCistIFtUSFJJRlQtMzkyNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkyNikgLSBUaGVyZSBzaG91bGQgYmUgYW4gZXJyb3IgZW1pdHRlZCB3aGVuIGh0dHAgc3RhdHVzIGNvZGUgaXMgbm90IDIwMCAKKy0gW1RIUklGVC00MDA3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDA3KSAtIE1pY3JvLW9wdGltaXphdGlvbiBvZiBUVHJhbnNwb3J0LnB5CistIFtUSFJJRlQtNDA0MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDA0MCkgLSBBZGQgcmVhbCBjYXVzZSBvZiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgZXJyb3IgdG8gZXhjZXB0aW9uCistIFtUSFJJRlQtNDA2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDA2NCkgLSBVcGRhdGUgbm9kZSBsaWJyYXJ5IGRlcGVuZGVuY2llcworLSBbVEhSSUZULTQwNjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwNjkpIC0gQWxsIHBlcmwgcGFja2FnZXMgc2hvdWxkIGhhdmUgcHJvcGVyIG5hbWVzcGFjZSwgdmVyc2lvbiBzeW50YXgsIGFuZCB1c2UgcHJvcGVyIHRocmlmdCBleGNlcHRpb25zCistIFtUSFJJRlQtNDA3MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDA3MSkgLSBDb25zb2xpZGF0ZSB0aGUgVHJhdmlzIENJIGpvYnMgd2hlcmUgcG9zc2libGUgdG8gcHV0IGxlc3Mgc3RyZXNzIG9uIHRoZSBBcGFjaGUgRm91bmRhdGlvbidzIGFsbG9jYXRpb24gb2YgQ0kgYnVpbGQgc2xhdmVzCistIFtUSFJJRlQtNDA3Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDA3MikgLSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIHNlbmQgY3VzdG9tIGhlYWRlcnMgaW4gVEN1cmxDbGllbnQKKy0gW1RIUklGVC00MDc1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDc1KSAtIEJldHRlciBNaW5HVyBzdXBwb3J0IGZvciBoZWFkZXJzLW9ubHkgYm9vc3QgKHdpdGhvdXQgdGhyZWFkIGxpYnJhcnkpCistIFtUSFJJRlQtNDA4MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDA4MSkgLSBQcm92aWRlIGEgTWluR1cgNjQtYml0IEFwcHZleW9yIENJIGJ1aWxkIGZvciBiZXR0ZXIgcHVsbCByZXF1ZXN0IHZhbGlkYXRpb24KKy0gW1RIUklGVC00MDg0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDg0KSAtIEltcHJvdmUgU1NMIHNlY3VyaXR5IGluIHRocmlmdCBieSBhZGRpbmcgYSBtYWtlIGNyb3NzIGNsaWVudCB0aGF0IGNoZWNrcyB0byBtYWtlIHN1cmUgU1NMdjMgcHJvdG9jb2wgY2Fubm90IGJlIG5lZ290aWF0ZWQKKy0gW1RIUklGVC00MDk1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDk1KSAtIEFkZCBtdWx0aXBsZXhlZCBwcm90b2NvbCB0byBUcmF2aXMgQ0kgZm9yIG1ha2UgY3Jvc3MKKy0gW1RIUklGVC00MDk5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDk5KSAtIEF1dG8tZGVyaXZlIEhhc2ggZm9yIGdlbmVyYXRlZCBSdXN0IHN0cnVjdHMKKy0gW1RIUklGVC00MTEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTEwKSAtIFRoZSBkZWJpYW4gYnVpbGQgZmlsZXMgZG8gbm90IHByb2R1Y2UgYSAiLWRiZyIgcGFja2FnZSBmb3IgZGVidWcgc3ltYm9scyBvZiBsaWJ0aHJpZnQwCistIFtUSFJJRlQtNDExNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDExNCkgLSBTcGFjZSBhZnRlciAnLy8vJyBpbiBkb2MgY29tbWVudHMKKy0gW1RIUklGVC00MTI2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTI2KSAtIFZhbGlkYXRlIG9iamVjdHMgaW4gcGhwIGV4dGVuc2lvbgorLSBbVEhSSUZULTQxMzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxMzApIC0gRW5zdXJlIEFwYWNoZSBIdHRwIGNvbm5lY3Rpb24gaXMgcmVsZWFzZWQgYmFjayB0byBwb29sIGFmdGVyIHVzZQorLSBbVEhSSUZULTQxNTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxNTEpIC0gVGhyaWZ0IE11dGV4IENvbnRlbnRpb24gUHJvZmlsaW5nIChwdGhyZWFkcykgc2hvdWxkIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKKy0gW1RIUklGVC00MTc2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTc2KSAtIEltcGxlbWVudCBhIHRocmVhZGVkIGFuZCB0aHJlYWRwb29sIHNlcnZlciB0eXBlIGZvciBSdXN0CistIFtUSFJJRlQtNDE4M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDE4MykgLSBOYW1lZCBwaXBlIGNsaWVudCBibG9ja3MgZm9yZXZlciBvbiBPcGVuKCkgd2hlbiB0aGVyZSBpcyBubyBzZXJ2ZXIgYXQgdGhlIG90aGVyIGVuZAorLSBbVEhSSUZULTQxOTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxOTApIC0gaW1wcm92ZSBDIyBUVGhyZWFkUG9vbFNlcnZlciBkZWZhdWx0cworLSBbVEhSSUZULTQxOTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxOTcpIC0gSW1wbGVtZW50IHRyYW5zcGFyZW50IGd6aXAgY29tcHJlc3Npb24gZm9yIEhUVFAgdHJhbnNwb3J0CistIFtUSFJJRlQtNDE5OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDE5OCkgLSBSdWJ5IHNob3VsZCBsb2cgVGhyaWZ0IGludGVybmFsIGVycm9ycyB0byBnbG9iYWwgbG9nZ2VyCistIFtUSFJJRlQtNDIwM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDIwMykgLSB0aHJpZnQgc2VydmVyIHN0b3AgZ3JhY2VmdWxseQorLSBbVEhSSUZULTQyMDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyMDUpIC0gY19nbGliIGlzIG5vdCBsaW5raW5nIGFnYWluc3QgZ2xpYiArIGdvYmplY3QKKy0gW1RIUklGVC00MjA5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjA5KSAtIHdhcm5pbmcgQ1MwNDE0IGluIFRbVExTXVNlcnZlclNvY2tldC5jcworLSBbVEhSSUZULTQyMTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyMTApIC0gaW5jbHVkZSBUaHJpZnQuNDUuY3Nwcm9qIGludG8gQ0kgcnVucyAKKy0gW1RIUklGVC00MjE3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjE3KSAtIEh0dHBDbGllbnQgc2hvdWxkIHN1cHBvcnQgZ3ppcCBhbmQgZGVmbGF0ZQorLSBbVEhSSUZULTQyMjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyMjIpIC0gU3VwcG9ydCBVbml4IERvbWFpbiBTb2NrZXRzIGluIEdvbGFuZyBUU2VydmVyU29ja2V0CistIFtUSFJJRlQtNDIzM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDIzMykgLSBNYWtlIFRIc0hhU2VydmVyLmludm9rZXIgYXZhaWxhYmxlIChnZXQgbWV0aG9kIG9ubHkpIGluIGluaGVyaXRlZCBjbGFzc2VzCistIFtUSFJJRlQtNDIzNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDIzNikgLSBTdXBwb3J0IGNvbnRleHQgaW4gZ28gZ2VuZXJhdGVkIGNvZGUuCistIFtUSFJJRlQtNDIzOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDIzOCkgLSBKU09OIGdlbmVyYXRvcjogbWFrZSBhbm5vdGF0aW9uLWF3YXJlCistIFtUSFJJRlQtNDI2OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI2OSkgLSBEb24ndCBhcHBlbmQgJy4nIHRvIEVybGFuZyBuYW1lc3BhY2UgaWYgaXQgZW5kcyBpbiAnXycuCistIFtUSFJJRlQtNDI3MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI3MCkgLSBHZW5lcmF0ZSBFcmxhbmcgbWFwcGluZyBmdW5jdGlvbnMgZm9yIGNvbnN0IG1hcHMgYW5kIGxpc3RzCistIFtUSFJJRlQtNDI3NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI3NSkgLSBBZGQgc3VwcG9ydCBmb3Igem9wZS5pbnRlcmZhY2Ugb25seSwgYXBhcnQgZnJvbSB0d2lzdGVkIHN1cHBvcnQuCistIFtUSFJJRlQtNDI4NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI4NSkgLSBQdWxsIGdlbmVyYXRlZCBzZW5kL3JlY3YgaW50byBsaWJyYXJ5IHRvIGFsbG93IGJlaGF2aW91ciB0byBiZSBjdXN0b21pc2VkCistIFtUSFJJRlQtNDI4N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI4NykgLSBBZGQgYysrIGNvbXBpbGVyICJub19za2VsZXRvbiIgZmxhZyBvcHRpb24KKy0gW1RIUklGVC00Mjg4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00Mjg4KSAtIEltcGxlbWVudCBsb2dnaW5nIGxldmVscyBwcm9wZXJseSBmb3Igbm9kZS5qcworLSBbVEhSSUZULTQyOTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyOTUpIC0gUmVmcmVzaCB0aGUgRG9ja2VyIGltYWdlIGZpbGUgc3VpdGUgZm9yIFVidW50dSwgRGViaWFuLCBhbmQgQ2VudE9TCistIFtUSFJJRlQtNDMwNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDMwNSkgLSBFbWl0IGRkb2MgZm9yIGdlbmVyYXRlZCBpdGVtcworLSBbVEhSSUZULTQzMDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzMDYpIC0gVGhyaWZ0IGltcG9ydHMgbm90IHJlcGxpY2F0ZWQgdG8gRCBzZXJ2aWNlIG91dHB1dAorLSBbVEhSSUZULTQzMTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzMTUpIC0gQWRkIGRlZmF1bHQgbWVzc2FnZSBmb3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uCistIFtUSFJJRlQtNDMxOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDMxOCkgLSBEZWxwaGkgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzCistIFtUSFJJRlQtNDMyNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDMyNSkgLSBTaW1wbGlmeSBhdXRvbWFrZSBjcm9zcyBjb21waWxhdGlvbiBieSByZWx5aW5nIG9uIG9uZSBnbG9iYWwgVEhSSUZUIGNvbXBpbGVyIHBhdGgKKy0gW1RIUklGVC00MzI3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzI3KSAtIEltcHJvdmUgVGltZXJNYW5hZ2VyIEFQSSB0byBhbGxvdyByZW1vdmluZyBzcGVjaWZpYyB0YXNrCistIFtUSFJJRlQtNDMzMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDMzMCkgLSBBbGxvdyB1bnVzZWQgY3JhdGVzIGluIFJ1c3QgZmlsZXMKKy0gW1RIUklGVC00MzMzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzMzKSAtIEVybGFuZyB0dXRvcmlhbCBleGFtcGxlcyBhcmUgdXNpbmcgYSBkaWZmZXJlbnQgcG9ydCAoOTk5OSkKKy0gW1RIUklGVC00MzQzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MzQzKSAtIENoYW5nZSBDSSBidWlsZHMgdG8gdXNlIG5vZGUuanMgOC54IExUUyBvbmNlIGF2YWlsYWJsZQorLSBbVEhSSUZULTQzNDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzNDUpIC0gQ3JlYXRlIGEgZG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IHRoYXQgdXNlcyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgbGFuZ3VhZ2UgbGV2ZWxzCistIFtUSFJJRlQtNDM0Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM0NikgLSBBbGxvdyBabGliIHRyYW5zcG9ydCBmYWN0b3J5IHRvIHdyYXAgb3RoZXIgdHJhbnNwb3J0cworLSBbVEhSSUZULTQzNDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzNDgpIC0gUGVybCBIVFRQIENsaWVudCBjdXN0b20gSFRUUCBoZWFkZXJzCistIFtUSFJJRlQtNDM1MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM1MCkgLSBVcGRhdGUgbmV0Y29yZSBidWlsZCBmb3IgZG90bmV0IDIuMCBzZGsgYW5kIG1ha2UgY3Jvc3MgdmFsaWRhdGlvbgorLSBbVEhSSUZULTQzNTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQzNTEpIC0gVXNlIFRyYXZpcyBDSSBCdWlsZCBTdGFnZXMgdG8gb3B0aW1pemUgdGhlIENJIGJ1aWxkCistIFtUSFJJRlQtNDM1M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM1MykgLSBjYW5ub3QgcmVhZCB2aWEgdGhyaWZ0X3Byb3RvY29sIGF0IHNlcnZlciBzaWRlCistIFtUSFJJRlQtNDM3OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM3OCkgLSBhZGQgc2V0IHN0b3BUaW1lb3V0VW5pdCBtZXRob2QgdG8gVFRocmVhZFBvb2xTZXJ2ZXIKKworIyMjIE5ldyBGZWF0dXJlCistIFtUSFJJRlQtNzUwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC03NTApIC0gQysrIENvbXBpbGVyIFZpcnR1YWwgRnVuY3Rpb24gT3B0aW9uCistIFtUSFJJRlQtMjk0NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjk0NSkgLSBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgUnVzdCBsYW5ndWFnZQorLSBbVEhSSUZULTM4NTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4NTcpIC0gdGhyaWZ0IGpzOm5vZGUgY29tcGxpZXIgc3VwcG9ydCBhbiBvYmplY3QgYXMgcGFyYW1ldGVyIG5vdCBhbiBpbnN0YW5jZSBvZiBzdHJ1Y3QKKy0gW1RIUklGVC0zOTMzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTMzKSAtIFBvcnQgb2ZmaWNpYWwgQyMgLk5FVCBsaWJyYXJ5IGZvciBUaHJpZnQgdG8gQyMgLk5FVCBDb3JlIGxpYmFyeQorLSBbVEhSSUZULTQwMzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwMzkpIC0gVXBkYXRlIG9mIEFwYWNoZSBUaHJpZnQgLk5ldCBDb3JlIGxpYiAKKy0gW1RIUklGVC00MTEzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MTEzKSAtIFByb3ZpZGUgYSBidWZmZXIgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcgaW4gbWVtb3J5IGJ5dGUgc3RyZWFtCisKKyMjIyBRdWVzdGlvbgorLSBbVEhSSUZULTI5NTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5NTYpIC0gYXV0b2NvbmYgLSBwb3NzaWJseSB1bmRlZmluZWQgbWFjcm8gLSBBQ19QUk9HX0JJU09OCistIFtUSFJJRlQtNDIyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDIyMykgLSBBZGQgc3VwcG9ydCB0byB0aGUgaXNTZXJ2aW5nKCkgbWV0aG9kIGZvciB0aGUgQysrIGxpYnJhcnkKKworIyMjIFRhc2sKKy0gW1RIUklGVC0zNjIyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjIyKSAtIEZpeCBkZXByZWNhdGVkIHVzZXMgb2Ygc3RkOjphdXRvX3B0cgorLSBbVEhSSUZULTQwMjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwMjgpIC0gUGxlYXNlIHJlbW92ZSBTeXN0ZW0ub3V0LmZvcm1hdCBmcm9tIHRoZSBzb3VyY2UgY29kZQorLSBbVEhSSUZULTQxODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQxODYpIC0gQnVpbGQgYW5kIHRlc3QgcnVzdCBjbGllbnQgaW4gVHJhdmlzCisKKyMjIyBUZXN0CistIFtUSFJJRlQtNDI2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI2NCkgLSBQSFAgLSBTdXBwb3J0IGJvdGggc2hhcmVkICYgc3RhdGljIGxpbmtpbmcgb2Ygc29ja2V0cyBsaWJyYXJ5CisKKyMjIyBXaXNoCistIFtUSFJJRlQtNDM0NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDM0NCkgLSBEZWZpbmUgYW5kIG1haW50YWluIHRoZSBtaW5pbXVtIGxhbmd1YWdlIGxldmVsIGZvciBhbGwgbGFuZ3VhZ2VzIGluIG9uZSBwbGFjZQorCisjIyAwLjEwLjAKKworIyMjIEJ1ZworLSBbVEhSSUZULTE4NDBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4NDApIC0gVGhyaWZ0IEdlbmVyYXRlZCBDb2RlIENhdXNlcyBHbG9iYWwgVmFyaWFibGUgTGVha3MKKy0gW1RIUklGVC0xODI4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODI4KSAtIG1vY19UUVRjcFNlcnZlci5jcHAgd2FzIHJlbW92ZWQgZnJvbSBzb3VyY2UgdHJlZSBidXQgaXMgaW4gdGhyaWZ0LTAuOS4wLnRhci5negorLSBbVEhSSUZULTE3OTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3OTApIC0gY29jb2E6IER1cGxpY2F0ZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBlcnJvcgorLSBbVEhSSUZULTE3NzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3NzYpIC0gVFBpcGVTZXJ2ZXIgc2hvdWxkIGltcGxlbWVudCAibGlzdGVuIiwgc28gdGhhdCBUU2VydmVyRXZlbnRIYW5kbGVyIHByZVNlcnZlIHdpbGwgd29yayByaWdodAorLSBbVEhSSUZULTEzNTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzNTEpIC0gQ29tcGlsZXIgZG9lcyBub3QgY2FyZSBhYm91dCBiaW5hcnkgc3RyaW5ncworLSBbVEhSSUZULTEyMjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyMjkpIC0gUHl0aG9uIGZhc3RiaW5hcnkuYyBjYW4gbm90IGhhbmRsZSB1bmljb2RlIGFzIGdlbmVyYXRlZCBweXRob24gY29kZQorLSBbVEhSSUZULTc0OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNzQ5KSAtIEMrKyBUQnVmZmVyZWRUcmFuc3BvcnRzIGRvIG5vdCBmbHVzaCB0aGVpciBidWZmZXJzIG9uIGRlbGV0ZQorLSBbVEhSSUZULTc0N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNzQ3KSAtIEMrKyBUU29ja2V0LT5jbG9zZSBjYWxscyBzaHV0ZG93biBicmVha2luZyBmb3JrZWQgcGFyZW50IHByb2Nlc3MKKy0gW1RIUklGVC03MzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTczMikgLSBzZXJ2ZXIgZXhpdHMgYWJub3JtYWxseSB3aGVuIGNsaWVudCBjYWxscyBzZW5kX3h4eCBmdW5jdGlvbiB3aXRob3V0IGNhbGxpbmcgcmVjdl94eHggZnVuY3Rpb24KKy0gW1RIUklGVC0zOTQyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTQyKSAtIFRTU0xTb2NrZXQgZG9lcyBub3QgaG9ub3Igc2VuZCBhbmQgcmVjZWl2ZSB0aW1lb3V0cworLSBbVEhSSUZULTM5NDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5NDEpIC0gV2luWFAgdmVyc2lvbiBvZiB0aHJpZnRfcG9sbCgpIHJlbGllcyBvbiB1bmRlZmluZWQgYmVoYXZpb3IgYnkgcGFzc2luZyBhIGRlc3RydWN0ZWQgdmFyaWFibGUgdG8gc2VsZWN0KCkKKy0gW1RIUklGVC0zOTQwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTQwKSAtIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlIGZvciBjb21waWxlciBpcyBicm9rZW4KKy0gW1RIUklGVC0zOTQzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTQzKSAtIENvdmVyaXR5IFNjYW4gaWRlbnRpZmllZCBzb21lIGhpZ2ggc2V2ZXJpdHkgZGVmZWN0cworLSBbVEhSSUZULTM5MjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5MjkpIC0gUEhQICJuc2dsb2JhbCIgT3B0aW9uIFJlc3VsdHMgaW4gU3ludGF4IEVycm9yIGluIEdlbmVyYXRlZCBDb2RlIChUcmFpbGluZyBCYWNrc2xhc2gpCistIFtUSFJJRlQtMzkzNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkzNikgLSBDYW5ub3QgY29tcGlsZSAwLjEwLjAgZGV2ZWxvcG1lbnQgdGlwIHdpdGggVlMyMDEzIGFuZCBlYXJsaWVyIChzbnByaW50ZiwgdWludDMyX3QpCistIFtUSFJJRlQtMzkzNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkzNSkgLSBJbmNvcnJlY3Qgc2tpcHBpbmcgb2YgbWFwIGFuZCBzZXQKKy0gW1RIUklGVC0zOTIwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTIwKSAtIFJ1Ynk6IEVuc3VyaW5nIHRoYXQgSFRUUCBmYWlsdXJlcyB3aWxsIGNsZWFyIHRoZSBodHRwIHRyYW5zcG9ydCBvdXRidWYgdmFyCistIFtUSFJJRlQtMzkxOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkxOSkgLSBDIyBUVExTU2VydmVyU29ja2V0IGRvZXMgbm90IHVzZSBjbGllbnRUaW1lb3V0CistIFtUSFJJRlQtMzkxN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkxNykgLSBDaGVjayBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIG1vZHVsZSB2ZXJzaW9uCistIFtUSFJJRlQtMzkwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkwOSkgLSBGaXggY19nbGliIHN0YXRpYyBsaWIgQ01ha2UgYnVpbGQKKy0gW1RIUklGVC0zOTA0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTA0KSAtIFR5cG8gaW4gbm9kZSB0dXRvcmlhbCBsZWFkcyB0byB3cm9uZyB0cmFuc3BvcnQgYmVpbmcgdXNlZAorLSBbVEhSSUZULTM4NDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4NDgpIC0gQXMgYW4gaW1wbGVtZW50ZXIgb2YgYSBwZXJsIHNvY2tldCBzZXJ2ZXIsIEkgZG8gbm90IHdhbnQgdG8gaGF2ZSB0byByZW1lbWJlciB0byBpZ25vcmUgU0lHQ0hMRCBmb3IgaXQgdG8gd29yayBwcm9wZXJseQorLSBbVEhSSUZULTM4NDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4NDQpIC0gdGhyaWZ0X3Byb3RvY29sIGNhbm5vdCBjb21waWxlIGluIDcuMC43CistIFtUSFJJRlQtMzg0M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzg0MykgLSBpbnRlZ2VyIGlzc3VlcyB3aXRoIEhheGUgUEhQIHRhcmdldHMgY2F1c2UgWmlnWmFnIGVuY29kaW5nIHRvIGZhaWwKKy0gW1RIUklGVC0zODQyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODQyKSAtIERhcnQgZ2VuZXJhdGVzIGluY29ycmVjdCBjb2RlIGZvciBhIGNvbnN0IHN0cnVjdAorLSBbVEhSSUZULTM4NDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4NDEpIC0gZGFydCBjb21wYWN0IHByb3RvY29sIGluY29ycmVjdGx5IHNlcmlhbGl6ZXMvZGVzZXJpYWxpemVkIGRvdWJsZXMKKy0gW1RIUklGVC0zNzA4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzA4KSAtIE5hbWVFcnJvcjogZ2xvYmFsIG5hbWUgJ1RQcm90b2NvbCcgaXMgbm90IGRlZmluZWQKKy0gW1RIUklGVC0zNzA0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzA0KSAtICJUQ29ubmVjdGVkQ2xpZW50IGRpZWQ6IENvdWxkIG5vdCByZWZpbGwgYnVmZmVyIiBtZXNzYWdlIHNob3duIHdoZW4gdXNpbmcgSFRUUCBTZXJ2ZXIKKy0gW1RIUklGVC0zNjc4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjc4KSAtIEZpeCBqYXZhZG9jIGVycm9ycyBvbiBKREsgOAorLSBbVEhSSUZULTMwMTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwMTQpIC0gQXBwVmV5b3Igc3VwcG9ydAorLSBbVEhSSUZULTI5OTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5OTQpIC0gTm9kZS5qcyBUSlNPTlByb3RvY29sIGNhbm5vdCBiZSB1c2VkIGZvciBvYmplY3Qgc2VyaWFsaXphdGlvbi4KKy0gW1RIUklGVC0yOTc0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTc0KSAtIHdyaXRlVG9QYXJjZWwgdGhyb3dzIE5QRSBmb3Igb3B0aW9uYWwgZW51bSBmaWVsZHMKKy0gW1RIUklGVC0yOTQ4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTQ4KSAtIFB5dGhvbiBUSlNPTlByb3RvY29sIGRvZXNuJ3QgaGFuZGxlIHN0cnVjdHMgd2l0aCBiaW5hcnkgZmllbGRzIGNvbnRhaW5pbmcgaW52YWxpZCB1bmljb2RlLgorLSBbVEhSSUZULTI4NDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4NDUpIC0gQ2hpbGRTZXJ2aWNlLlBsbzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorLSBbVEhSSUZULTMyNzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyNzYpIC0gQmluYXJ5IGRhdGEgZG9lcyBub3QgZGVjb2RlIGNvcnJlY3RseSB1c2luZyB0aGUgVEpTT05Qcm90b2NvbCB3aGVuIHRoZSBiYXNlNjQgZW5jb2RlZCBkYXRhIGlzIHBhZGRlZC4KKy0gW1RIUklGVC0zMjUzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjUzKSAtIFVzaW5nIGxhdGVzdCB2ZXJzaW9uIG9mIEQgZ2l2ZXMgZGVwcmVjYXRpb24gbm90aWNlcworLSBbVEhSSUZULTI4ODNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4ODMpIC0gVFR3aXN0ZWQucHksIGR1cmluZyBDb25uZWN0aW9uTG9zdCBwcm9jZXNzaW5nOiBleGNlcHRpb25zLlJ1bnRpbWVFcnJvcjogZGljdGlvbmFyeSBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbgorLSBbVEhSSUZULTIwMTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwMTkpIC0gV3JpdGluZyBvbiBhIGRpc2Nvbm5lY3RlZCBzb2NrZXQgb24gTWFjIGNhdXNlcyBTSUcgUElQRQorLSBbVEhSSUZULTIwMjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwMjApIC0gVGhyaWZ0IGxpYnJhcnkgaGFzIHNvbWUgZW1wdHkgZmlsZXMgdGhhdCBoYXZlbid0IHJlYWxseSBiZWVuIGRlbGV0ZWQKKy0gW1RIUklGVC0yMDQ5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDQ5KSAtIEdvIGNvbXBpbGVyIGRvZXNuJ3QgYnVpbGQgb24gbmF0aXZlIFdpbmRvd3MKKy0gW1RIUklGVC0yMDI0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDI0KSAtIFRTZXJ2ZXIuY3BwIHdhcm5zIG9uIDY0LWJpdCBwbGF0Zm9ybXMgYWJvdXQgdHJ1bmNhdGluZyBhbiBybGltX3QgaW50byBhbiBpbnQKKy0gW1RIUklGVC0yMDIzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDIzKSAtIGdldHRpbWVvZmRheSBpbXBsZW1lbnRhdGlvbiBvbiBXaW5kb3dzIGVycm9ycyB3aGVuIG5vIHRpbWUgem9uZSBpcyBwYXNzZWQgaW4uCistIFtUSFJJRlQtMjAyMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjAyMikgLSBDb0IgYW5kIGRlbnNlIGNvZGUgZ2VuZXJhdGlvbiBzdGlsbCB1c2VzIFRSMSBiaW5kLCBldmVuIHRob3VnaCB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIGNsYW5nCistIFtUSFJJRlQtMjAyN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjAyNykgLSBNaW5vciA2NC1iaXQgYW5kIE5PTUlOTUFYIGlzc3VlcyBpbiBDKysgbGlicmFyeQorLSBbVEhSSUZULTIxNTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxNTYpIC0gVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgaXMgdGhyb3dpbmcgZXhjZXB0aW9ucyB3aXRoIG1pc2xlYWRpbmcgaW5mb3JtYXRpb24KKy0gW1RIUklGVC0yMTU0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTU0KSAtIE1pc3NpbmcgPG9wZXJhdG9yIGJvZHkKKy0gW1RIUklGVC0yMTQ4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTQ4KSAtIFROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQgaW1wb3J0cyBsb2c0agorLSBbVEhSSUZULTIxMDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxMDMpIC0gW3B5dGhvbl0gU3VwcG9ydCBmb3IgU1NMIGNlcnRpZmljYXRlcyB3aXRoIFN1YmplY3QgQWx0ZXJuYXRpdmUgTmFtZXMKKy0gW1RIUklGVC0xOTMxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTMxKSAtIFNlbmRpbmcgYSBmcmFtZSBzaXplIG9mIHplcm8gdG8gYSBUTm9uYmxvY2tpbmdTZXJ2ZXIgY2F1c2VzIGFuIGFzc2VydGlvbiBmYWlsdXJlCistIFtUSFJJRlQtMTc1MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc1MSkgLSBkZWZpbml0aW9uIG9mIGluY3JlYXNlX21heF9mZHMgZG9lc24ndCBjb21waWxlIHdoZW4gSEFWRV9TWVNfUkVTT1VSQ0VfSCBpcyBub3QgZGVmaW5lZAorLSBbVEhSSUZULTE1MjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1MjIpIC0gVFNlcnZlclNvY2tldCBwb3RlbnRpYWwgbWVtb3J5IGxlYWsgd2l0aCBhZGRyaW5mbyAqcmVzMAorLSBbVEhSSUZULTE1NDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1NDcpIC0gUHJvYmxlbXMgYnVpbGRpbmcgYWdhaW5zdCBzdGF0aWMgbGliZXZlbnQKKy0gW1RIUklGVC0xNTQ1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTQ1KSAtIEdlbmVyYXRlZCBqYXZhc2NyaXB0IGNvZGUgdXNlcyAiZm9yIGluIiBmb3IgbG9vcGluZyBvdmVyIGFycmF5cworLSBbVEhSSUZULTE0ODddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0ODcpIC0gTmFtZXNwYWNlIHByb2JsZW0sIGNvbXBpbGUgZmFpbHMgb24gZ2VuZXJhdGVkIGNvZGUKKy0gW1RIUklGVC0xNDcyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDcyKSAtIENvbmZpZ3VyYXRpb24gY29uZmxpY3RzIHdpdGggYm9vc3QgcGxhdGZvcm0gaW5jbHVkZSBoZWFkZXIKKy0gW1RIUklGVC02XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC02KSAtIFRocmlmdCBsaWJyYXJpZXMgYW5kIGNvbXBpbGVyIGxhY2sgdmVyc2lvbiBudW1iZXIKKy0gW1RIUklGVC0xNjgwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjgwKSAtIG1ha2UgaW5zdGFsbCByZXF1aXJlcyBHTlUgbWFrZQorLSBbVEhSSUZULTM4NjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4NjkpIC0gRGFydCBUdXRvcmlhbCBidWlsZCBmYWlscyB3aXRoIEVycm9yIDY1IGF0ICJwdWIgZ2V0IgorLSBbVEhSSUZULTM4NjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4NjEpIC0gVHJhdmlzIENJIGJ1aWxkcyBhcmUgdGltaW5nIG91dCAtIEMrK1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgYXBwZWFycyB0byBiZSBoYW5naW5nCistIFtUSFJJRlQtMzg1NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzg1NSkgLSBJbiB0aGUgZ28gc2ltcGxlIHNlcnZlciwgaWYgU3RvcCgpIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpdCBoYW5ncworLSBbVEhSSUZULTM4ODVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4ODUpIC0gUEhQOiBFcnJvciB3aGVuIHJlYWRJNjQgaW4gVENvbXBhY3RQcm90b2NvbAorLSBbVEhSSUZULTM4ODNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4ODMpIC0gR28gVGVzdEFsbENvbm5lY3Rpb24gY2FuIGZhaWwgd2l0aCBwb3J0IDkwOTAgY29sbGlzaW9uCistIFtUSFJJRlQtMzg4NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzg4NCkgLSBGaXggRXJsYW5nIGNvbXBhY3QgcHJvdG9jb2wgZG91YmxlIGVuZGlhbmVzcyBhbmQgYm9vbGVhbiBsaXN0CistIFtUSFJJRlQtMzg4MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzg4MCkgLSBFcmxhbmcgQ29tcGFjdCBwcm90b2NvbCAtIGJvb2xlYW4gdmFsdWVzIGludmVydGVkCistIFtUSFJJRlQtMzg3OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzg3OSkgLSBVbmRlZmluZWQgZXZhbHVhdGlvbiBvcmRlciBjYXVzZXMgaW5jb3JyZWN0IHByb2Nlc3NpbmcgaW4gdGhlIEMrKyBsaWJyYXJ5IEpTT04gcHJvdG9jb2wKKy0gW1RIUklGVC0zODUxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODUxKSAtIEdvbGFuZyB0aHJpZnQgY29udGludWFsbHkgYWRkcyB0aGUgeC90aHJpZnQgY29udGVudCB0eXBlIAorLSBbVEhSSUZULTM4NTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4NTApIC0gQWxsIGFwYWNoZSBidWlsZHMgYXJlIGZhaWxpbmcgd2hlbiBpbml0aWF0ZWQgZnJvbSBhIGdpdGh1YiBwdWxsIHJlcXVlc3QKKy0gW1RIUklGVC0zODM3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODM3KSAtIFRoaWZ0IDAuOS4zIGNhbid0IGJlIGJ1aWxkIHdpdGggUXVpY2tDaGVjayAyLjguMiBhbmQgdW5vcmRlcmVkLWNvbnRhaW5lcnMgMC4yLjYKKy0gW1RIUklGVC0zODMxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODMxKSAtIGJ1aWxkIG9mIHRlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcCBmYWlscyB3aXRoIG5ld2VyIGdjYyBvbiBwbGF0Zm9ybXMgd2l0aCB1bnNpZ25lZCBjaGFyIGR1ZSB0byBuYXJyb3dpbmcgY29udmVyc2lvbnMKKy0gW1RIUklGVC0zODI3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODI3KSAtIHBocCBDb21wYWN0UHJvdG9jb2wgcmVhZEk2NCBmdW5jdGlvbiBoYXMgYnVnLCB3aGVuIHZhbHVlIGhhcyAzMmJpdCB+NjRiaXQsIEV4YW1wbGXvvJp2YWx1ZT0xNDYxNTYzNDU3MDAwIAorLSBbVEhSSUZULTM4MjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4MjUpIC0gSmF2YXNjcmlwdCB0ZXN0IGRlcGVuZGVuY3kgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZQorLSBbVEhSSUZULTM4MTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4MTQpIC0gRml4IGNvbnRlbnRpb24gaW4gVE5vbmJsb2NraW5nU2VydmVyVGVzdAorLSBbVEhSSUZULTM3OTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3OTMpIC0gQXBwdmV5b3IgYnVpbGRzIHJlZmVyZW5jZSBhbiBhbnQgdmVyc2lvbiB0aGF0IGlzIG5vIGxvbmdlciB0aGVyZQorLSBbVEhSSUZULTM3ODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3ODYpIC0gTm9kZS5qcyBUTFMgZW1pdHMgJ2Nvbm5lY3QnIGJlZm9yZSBjb25uZWN0aW9uIGlzIHJlYWR5CistIFtUSFJJRlQtMzc4MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc4MCkgLSBGaXggZGFydCBpbnQ2NCB1c2FnZSB3aGVuIGNvbXBpbGVkIHRvIGpzCistIFtUSFJJRlQtMzc4OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc4OSkgLSBOb2RlLmpzIGxhY2tzIGFiaWxpdHkgdG8gZGVzdHJveSBjb25uZWN0aW9uCistIFtUSFJJRlQtMzc5Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc5NikgLSBUaGVyZSdzIG5vIC0tZGJnIGZvciBkaF9zdHJpcCwgbWF5YmUgc29tZW9uZSBoYXMgbWlzdGFrZW4gdGhpcyBmb3IgLS1kYmctcGFja2FnZS4KKy0gW1RIUklGVC0zNzk1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzk1KSAtIEdlbmVyYXRlZCBoYXNoVmFsdWUgbWV0aG9kIGluIFN3aWZ0IHdpbGwgb3ZlcmZsb3cKKy0gW1RIUklGVC0zNzkwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzkwKSAtIEZpeCBEZWxwaGkgbmFtZWQgcGlwZSBjbGllbnQgdG8gdXNlIHRpbWVvdXQgZXZlbiB3aGVuIHBpcGUgZG9lc24ndCB5ZXQgZXhpc3QKKy0gW1RIUklGVC0zNzg3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzg3KSAtIE5vZGUuanMgQ29ubmVjdGlvbiBvYmplY3QgZG9lc24ndCBoYW5kbGUgZXJyb3JzIGNvcnJlY3RseQorLSBbVEhSSUZULTM3OTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3OTEpIC0gRGVscGhpIHBpcGUgY2xpZW50IG1heSBmYWlsIGV2ZW4gaW4gYSBub24tZXJyb3IgY29uZGl0aW9uCistIFtUSFJJRlQtMzc3MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc3MSkgLSBUQnVmZmVyZWRUcmFuc3BvcnQgZ2V0cyBpbiBpbnZhbGlkIHN0YXRlIG9uIHJlYWQvd3JpdGUgZXJyb3JzCistIFtUSFJJRlQtMzc2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc2NCkgLSBQSFAgIm1ha2UgaW5zdGFsbCIgZG9lcyBub3QgaW5zdGFsbCBUTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAgbm9yIFRTaW1wbGVKU09OUHJvdG9jb2wucGhwCistIFtUSFJJRlQtMzc2OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc2OCkgLSBUVGhyZWFkZWRTZXJ2ZXIgbWF5IGNyYXNoIGlmIGl0IGlzIGRlc3Ryb3llZCBpbW1lZGlhdGVseSBhZnRlciBpdCByZXR1cm5zIGZyb20gc2VydmUoKTsgVFRocmVhZGVkU2VydmVyIGRpc2Nvbm5lY3RzIGNsaWVudHMKKy0gW1RIUklGVC0zNzY1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzY1KSAtIG1lbW9yeSBsZWFrIGluIHB5dGhvbiBjb21wYWN0IHByb3RvY29sIGV4dGVuc2lvbgorLSBbVEhSSUZULTM3NThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NTgpIC0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpnZXRUeXBlIGFuZCBUUHJvdG9jb2xFeGNlcHRpb246OmdldFR5cGUgc2hvdWxkIGJlIGNvbnN0CistIFtUSFJJRlQtMzc2M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc2MykgLSBGaXggc2VyaWFsaXphdGlvbiBvZiBpNjQgbGFyZ2VyIHRoYW4gMl41MyBmb3IgYnJvd3NlcmlmeQorLSBbVEhSSUZULTM3NTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NTkpIC0gcmVxdWlyZWQgZmllbGRzIHRoYXQgYXJlIG5pbCBhcmUgc2lsZW50bHkgaWdub3JlZCBvbiB3cml0ZQorLSBbVEhSSUZULTM3NTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NTMpIC0gVFNlcnZlckZyYW1ld29yazo6c3RvcCBtYXkgZmFpbCB0byBpbnRlcnJ1cHQgY29ubmVjdGVkIGNsaWVudHMKKy0gW1RIUklGVC0zNzU1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzU1KSAtIFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cmluZyBoaXRzIGFzc2VydCBpbiBpc3ByaW50IG9uIFdpbmRvd3Mgd2l0aCBkZWJ1ZyBDUlQKKy0gW1RIUklGVC0zNzUxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzUxKSAtIENvbXBpbGVyIGFsbG93cyBmaWVsZCBpZHMgdGhhdCBhcmUgdG9vIGxhcmdlIGZvciBnZW5lcmF0ZWQgY29kZQorLSBbVEhSSUZULTM3NDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NDgpIC0gTm9kZS5qcyBEZXNlcmlhbGl6YXRpb24gb2YgbGlzdHMgb2YgbGlzdHMgaXMgYnJva2VuCistIFtUSFJJRlQtMzc2MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc2MCkgLSBGaXggaW5zdGFsbCBwYXRocyBldGMgb2YgZGViaWFuIHBhY2thZ2VzIGZvciBweSBhbmQgcGVybAorLSBbVEhSSUZULTM3NTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NTcpIC0gRml4IHZhcmlvdXMgYnVpbGQgd2FybmluZ3Mgb24gV2luZG93cyB3aXRoIFZTMjAxNSBjb21waWxlcgorLSBbVEhSSUZULTM3NTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NTApIC0gTlNDb3B5aW5nIGNvcHlXaXRoWm9uZTogaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY2hlY2sgaXNTZXQKKy0gW1RIUklGVC0zNzQ3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzQ3KSAtIER1cGxpY2F0ZSBub2RlLmpzIGJ1aWxkIG9uIFRyYXZpcy1DSQorLSBbVEhSSUZULTM3NDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NDQpIC0gVGhlIHByZWNpc2lvbiBzaG91bGQgYmUgMTcgKDE2IGJpdHMgbmVlZCBhZnRlciBkb3QpIGFmdGVyIGRvdCBmb3IgZG91YmxlIHR5cGUuCistIFtUSFJJRlQtMzc0MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc0MSkgLSBoYXhlIHRlc3QgaXMgYnJva2VuCistIFtUSFJJRlQtMzczOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzczOSkgLSBEZXByZWNhdGlvbiB3YXJuaW5nIGluIGNvZGVnZW4vYmFzZS5kCistIFtUSFJJRlQtMzczNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzczNSkgLSBKU09OIHByb3RvY29sIGxlZnQgaW4gaW5jb3JyZWN0IHN0YXRlIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCistIFtUSFJJRlQtMzczNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzczNCkgLSBUbyBjb21wYXJlIHR3byBzdHJpbmcgYXMgbG93ZXJjYXNlLgorLSBbVEhSSUZULTM3NDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NDMpIC0gSmF2YSBKU09OIHByb3RvY29sIGxlZnQgaW4gaW5jb3JyZWN0IHN0YXRlIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCistIFtUSFJJRlQtMzczMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzczMSkgLSBQZXJsIG11bHRpcGxleCB0ZXN0IGlzIGZsYWt5CistIFtUSFJJRlQtMzcyOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzcyOSkgLSBSZXN0cmljdCByYWtlIHZlcnNpb24KKy0gW1RIUklGVC0zNzI3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzI3KSAtIEluY29ycmVjdCByZXF1aXJlIHBhdGhzIGluIE5vZGUuanMgdHV0b3JpYWwKKy0gW1RIUklGVC0zNzIzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzIzKSAtIEZpeCBMdWEgaW5jbHVkZSBwYXRoCistIFtUSFJJRlQtMzcyMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzcyMikgLSBGaXggY2VydCBwYXRoIGluIEMrKyBjcm9zcyB0ZXN0cyBmb3Igbm9uLUxpbnV4IHBsYXRmb3JtCistIFtUSFJJRlQtMzcyNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzcyNikgLSBGaXggaW5jb3JyZWN0IGNvbmRpdGlvbmFsIGluIFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5weQorLSBbVEhSSUZULTM3MjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3MjUpIC0gU2tpcCBhIGZsYWt5IGNyb3NzIHRlc3QgZW50cnkgKGQtZGFydCBjb21wYWN0IGZyYW1lZC1pcCkKKy0gW1RIUklGVC0zNzI0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzI0KSAtIEZpeCBpbmNvcnJlY3QgdGltZXZhbCBjb252ZXJzaW9uIGluIGxpYmV2ZW50LmQKKy0gW1RIUklGVC0zNzIxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzIxKSAtIENMT05FIC0gd2h5IG5vdCBhZGQgdW5pY29kZSBzdHJpbmdzIHN1cHBvcnQgdG8gcHl0aG9uIGRpcmVjdGx5PworLSBbVEhSSUZULTM3MjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3MjApIC0gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCgpIHJldHVybnMgMCBpZiBub3QgYWxsIHJlcXVlc3RlZCBieXRlcyBjb3VsZCBiZSByZWFkCistIFtUSFJJRlQtMzcxOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzcxOSkgLSBEYXJ0IGdlbmVyYXRvciBzaG91bGQgdXNlIGxvd2VyQ2FtZWxDYXNlIGZvciBzZXJ2aWNlIG5hbWVzCistIFtUSFJJRlQtMzkwMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkwMikgLSBUU29ja2V0Lm9wZW4gdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCistIFtUSFJJRlQtMzkwMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkwMSkgLSBURnJhbWVkVHJhbnNwb3J0Lm9wZW4gdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCistIFtUSFJJRlQtMzg5M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzg5MykgLSBDb21tYW5kIGluamVjdGlvbiBpbiBmb3JtYXRfZ29fb3V0cHV0CistIFtUSFJJRlQtMzgwN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzgwNykgLSBTd2lmdCBjb21waWxlciBkb2VzIG5vdCBlc2NhcGUgcmVzZXJ2ZWQgd29yZHMKKy0gW1RIUklGVC0zNzk4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzk4KSAtIFRIdHRwQ2xpZW50IGRvZXMgbm90IHVzZSBwcm94eSBmcm9tIGh0dHBfcHJveHksIGh0dHBzX3Byb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcworLSBbVEhSSUZULTM4MDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4MDkpIC0gd3JvbmcvdW51c2VkIEJJTkFSWSB0eXBlIGNvZGUKKy0gW1RIUklGVC0zODA2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODA2KSAtIFN3aWZ0IGdlbmVyYXRvciBkb2VzIG5vdCBoYW5kbGUgc2VsZi1yZWZlcnJpbmcgc3RydWN0cworLSBbVEhSSUZULTM4MDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4MDUpIC0gR29sYW5nIHNlcnZlciBzdXNjZXB0aWJsZSB0byBtZW1vcnkgc3Bpa2UgZnJvbSBtYWxmb3JtZWQgbWVzc2FnZQorLSBbVEhSSUZULTM3OTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3OTcpIC0gR2VuZXJhdGVkIERlbHBoaSBwcm9jZXNzb3Igc2hvdWxkbid0IGVycm9yIG91dCBvbiB0aW1lZCBvdXQgZXhjZXB0aW9ucworLSBbVEhSSUZULTM4MTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4MTMpIC0gQXBwdmV5b3IgYnVpbGRzIHJlZmVyZW5jZSBhbiBvcGVuc3NsIHZlcnNpb24gdGhhdCBpcyBubyBsb25nZXIgdGhlcmUKKy0gW1RIUklGVC0zNjU4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjU4KSAtIE1pc3NpbmcgZmlsZSBpbiBUSFJJRlQtMzU5OQorLSBbVEhSSUZULTM2NDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NDkpIC0gUHl0aG9uIFRTYXNsQ2xpZW50VHJhbnNwb3J0IGluaXRpYWxpemVzIFRUcmFuc3BvcnRFeGNlcHRpb24gaW5jb3JyZWN0bHkKKy0gW1RIUklGVC0zNjUwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjUwKSAtIGluY29ycmVjdCB1bmlvbiBzZXJpYWxpemF0aW9uIAorLSBbVEhSSUZULTM3MTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3MTMpIC0gbGliL2QvdGVzdC90aHJpZnRfdGVzdF9ydW5uZXIuc2ggaXMgZmxha3kgb24gSmVua2lucworLSBbVEhSSUZULTM2NjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NjgpIC0gcmFuZ2UgY2hlY2sgZXJyb3IgaW4gY29tcGFjdCBwcm90b2NvbAorLSBbVEhSSUZULTM2NjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NjMpIC0gQ01ha2UgY3BwIHRlc3QgZmFpbHMgdG8gYnVpbGQgb24gc3lzdGVtIHdpdGhvdXQgemxpYgorLSBbVEhSSUZULTM3MTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3MTIpIC0gVFRvcm5hZG9TZXJ2ZXIgY2Fubm90IGhhbmRsZSBJUHY2IGFkZHJlc3MKKy0gW1RIUklGVC0zNzEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzEwKSAtIERhcnQgZ2VuZXJhdG9yIGRvZXMgbm90IGNhbWVsIGNhc2UgQ29uc3RhbnRzIGNsYXNzIG5hbWVzCistIFtUSFJJRlQtMzY5N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzY5NykgLSBEYXJ0IGdlbmVyYXRvciBkb2VzIG5vdCBuYW1lIGltcG9ydHMKKy0gW1RIUklGVC0zNjkwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjkwKSAtIFdvcmsgYXJvdW5kIGRvY2tlciBpbWFnZSBidWlsZCBmYWlsdXJlcyBvbiBUcmF2aXMtQ0kKKy0gW1RIUklGVC0zNjg5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjg5KSAtIHRocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50IHN0YXJ0IGZhaWxlZCB3aGVuIHNlcnZlciBpcyBub3QgYXZhaWxhYmxlCistIFtUSFJJRlQtMzY5NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzY5NSkgLSBGaXggRCB0ZXN0IHNjcmlwdHMKKy0gW1RIUklGVC0zNjc1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjc1KSAtIFVuaW9uIGlzIG5vdCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBUaHJpZnQgQyBHbGliCistIFtUSFJJRlQtMzY3M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzY3MykgLSBBUEkgZmFpbHMgd2l0aCBzdGQ6OmV4Y2VwdGlvbiBhZnRlciBhIHRpbWVvdXQgb2NjdXJlZCBpbiBlYXJsaWVyIGFueSBBUEkgY2FsbAorLSBbVEhSSUZULTM3MDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3MDkpIC0gQ29tbWVudCBzeW50YXggY2FuIHByb2R1Y2UgYnJva2VuIGNvZGUKKy0gW1RIUklGVC0zNzA1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzA1KSAtIEdvIG1hcCBoYXMgaW5jb3JyZWN0IHR5cGVzIHdoZW4gdXNlZCB3aXRoIGZvcndhcmQtZGVmaW5lZCB0eXBlcworLSBbVEhSSUZULTM3MDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3MDIpIC0gRml4IGNyb3NzIHRlc3RzIGZvciBEYXJ0IGNvbXBhY3QgcHJvdG9jb2wgKDMgZmFpbGluZykKKy0gW1RIUklGVC0zNjgzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjgzKSAtIEJhZFlpZWxkRXJyb3IgaW4gdGhyaWZ0IHB5OnRvcm5hZG8gc2VydmVyCistIFtUSFJJRlQtMzY4Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzY4MikgLSBEbyBub3QgcmV1c2UgcmVmdXNlZCBzb2NrZXRzIGluIHRlc3Qgc2NyaXB0cworLSBbVEhSSUZULTM2ODFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2ODEpIC0gRml4IERhcnQgdHV0b3JpYWwgYnVpbGQKKy0gW1RIUklGVC0zNjgwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjgwKSAtIEphdmEgYXN5bmMgcHJvY2Vzc29yIGZhaWxzIHRvIG5vdGlmeSBlcnJvcnMgdG8gY2xpZW50cworLSBbVEhSSUZULTM3MTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3MTQpIC0gVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbiBpcyBub3QgZGVmaW5lZCBpbiBqcy9zcmMvdGhyaWZ0LmpzCistIFtUSFJJRlQtMzY4OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzY4OCkgLSBGaXggc29ja2V0IGJpbmQgZmFpbHVyZSBkZXRlY3Rpb24gb2YgY3Jvc3MgdGVzdAorLSBbVEhSSUZULTM2NDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NDEpIC0gUnVieSBjbGllbnQgc2hvdWxkIHRyeSB0byBjb25uZWN0IHRvIGV2ZXJ5IHJlc3VsdCBvZiBnZXRhZGRyaW5mbworLSBbVEhSSUZULTM2MzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2MzUpIC0gRCB0cmFuc3BvcnRfdGVzdCBpcyBmbGFreSBvbiBKZW5raW5zIGFuZCBUcmF2aXMKKy0gW1RIUklGVC0zNjE4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjE4KSAtIFB5dGhvbiBUU1NMU29ja2V0IGRlcHJlY2F0aW9uIG1lc3NhZ2Ugc2hvdWxkIHByaW50IGNhbGxlcidzIGxvY2F0aW9uCistIFtUSFJJRlQtMzE0NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzE0NSkgLSBKU09OIHByb3RvY29sIGRvZXMgbm90IGhhbmRsZSBib29sIGFuZCBlbXB0eSBjb250YWluZXJzIGNvcnJlY3RseQorLSBbVEhSSUZULTMxNThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxNTgpIC0gVEJhc2U8VCxGPiNkZWVwQ29weSBzaG91bGQgcmV0dXJuIFQKKy0gW1RIUklGVC0zMTU3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTU3KSAtIFRCYXNlIHNpZ25hdHVyZSBzaG91bGQgYmUgVEJhc2U8VCBleHRlbmRzIFRCYXNlPFQsRj4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+CistIFtUSFJJRlQtMzE1Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzE1NikgLSBOb2RlIFRMUzogc2VydmVyIGV4ZWN1dGVzIHByb2Nlc3NpbmcgbG9naWMgdHdvIGZ1bGwgdGltZXMKKy0gW1RIUklGVC0zMTU0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTU0KSAtIHR1dG9yaWFsL3B5LnRvcm5hZG8gdGhyb3cgRU9GIGV4Y2VwdGlvbgorLSBbVEhSSUZULTMwNjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwNjMpIC0gQysrIGJ1aWxkIC1XdW51c2VkLXBhcmFtZXRlciB3YXJuaW5ncyBvbiBwcm9jZXNzb3JfdGVzdCwgVHJhbnNwb3J0VGVzdAorLSBbVEhSSUZULTMwNTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwNTYpIC0gQWRkIHN0cmluZy9jb2xsZWN0aW9uIGxlbmd0aCBsaW1pdHMgZm9yIFB5dGhvbiBwcm90b2NvbCByZWFkZXJzCistIFtUSFJJRlQtMzIzN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIzNykgLSBGaXggVE5hbWVkUGlwZVNlcnZlcjo6Y3JlYXRlTmFtZWRQaXBlIG1lbW9yeSBsZWFrCistIFtUSFJJRlQtMzIzM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIzMykgLSBGaXggQysrIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZVdvcmtlciB3b3JrZXIgam9pbgorLSBbVEhSSUZULTMyMzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyMzIpIC0gQ2Fubm90IGRlc2VyaWFsaXplIGpzb24gbWVzc2FnZXMgY3JlYXRlZCB3aXRoIGZpZWxkTmFtZXNBc1N0cmluZyAKKy0gW1RIUklGVC0zMjA2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjA2KSAtIEZpeCBWaXN1YWwgU3R1ZGlvIGJ1aWxkIGZhaWx1cmUgZHVlICdwdGhyZWFkX3NlbGYnOiBpZGVudGlmaWVyIG5vdCBmb3VuZAorLSBbVEhSSUZULTMyMDBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyMDApIC0gSlMgYW5kIG5vZGVqcyBkbyBub3QgZW5jb2RlIEpTT04gcHJvdG9jb2wgYmluYXJ5IGZpZWxkcyBhcyBiYXNlNjQKKy0gW1RIUklGVC0zMTk5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTk5KSAtIEV4Y2VwdGlvbiBmaWVsZCBoYXMgYmFzaWMgbWV0YWRhdGEKKy0gW1RIUklGVC0zMTgyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTgyKSAtIFRGcmFtZWRUcmFuc3BvcnQgaXMgaW4gYW4gaW52YWxpZCBzdGF0ZSBhZnRlciBmcmFtZSBzaXplIGV4Y2VwdGlvbgorLSBbVEhSSUZULTI1MzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1MzYpIC0gbmV3IFRTb2NrZXQsIHVuaW5pdGlhbGlzZWQgdmFsdWUgcmVwb3J0ZWQgYnkgdmFsZ3JpbmQKKy0gW1RIUklGVC0yNTI3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTI3KSAtIEFwYWNoZSBUaHJpZnQgSURMIENvbXBpbGVyIGNvZGUgZ2VuZXJhdGVkIGZvciBOb2RlLmpzIHNob3VsZCBiZSBqc2hpbnQgY2xlYW4KKy0gW1RIUklGVC0yNTE5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTE5KSAtICJwcm9jZXNzb3IiIGNsYXNzIGlzIG5vdCBiZWluZyBnZW5lcmF0ZWQKKy0gW1RIUklGVC0yNDMxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDMxKSAtIFRGaWxlVHJhbnNwb3J0VGVzdCBmYWlscyB3aXRoICJjaGVjayBkZWx0YSA8IFhYWCBmYWlsZWQiCistIFtUSFJJRlQtMjcwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjcwOCkgLSBFcmxhbmcgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0ICJvbmV3YXkiIG1lc3NhZ2UgdHlwZQorLSBbVEhSSUZULTMzNzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzNzcpIC0gRGVlcCBjb3B5IGlzIGFjdHVhbGx5IHNoYWxsb3cgd2hlbiB1c2luZyB0eXBlZGVmIG1lbWJlcnMKKy0gW1RIUklGVC0zMzc2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzc2KSAtIEMjIGFuZCBQeXRob24gSlNPTiBwcm90b2NvbCBkb3VibGUgdmFsdWVzIGxvc2UgcHJlY2lzaW9uCistIFtUSFJJRlQtMzM3M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM3MykgLSBWYXJpb3VzIGZpeGVzIGZvciBjcm9zcyB0ZXN0IHNlcnZlcnMgYW5kIGNsaWVudHMKKy0gW1RIUklGVC0zMzcwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzcwKSAtIGVycm5vIGV4dGVybiB2YXJpYWJsZSByZWRlZmluZWQuIE5vdCBjb21waWxpbmcgZm9yIEFuZHJvaWQKKy0gW1RIUklGVC0zMzc5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzc5KSAtICBQb3RlbnRpYWwgb3V0IG9mIHJhbmdlIHBhbmljIGluIEdvIEpTT04gcHJvdG9jb2xzCistIFtUSFJJRlQtMzM3MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM3MSkgLSBBYnN0cmFjdCBuYW1lc3BhY2UgVW5peCBkb21haW4gc29ja2V0cyBicm9rZW4gaW4gQysrCistIFtUSFJJRlQtMzM4MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM4MCkgLSBub2RlanM6IDAuOS4yIC0+IDAuOS4zIHVwZ3JhZGUgYnJlYWtzIFByb3RvY29sIGFuZCBUcmFuc3BvcnQgcmVxdWlyZXMKKy0gW1RIUklGVC0zMzY3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzY3KSAtIEZpeCBiYWQgbGlua3MgdG8gY29kaW5nX3N0YW5kYXJkcy5tZCAjNjM0IAorLSBbVEhSSUZULTM0MDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MDEpIC0gTmVzdGVkIGNvbGxlY3Rpb25zIGVtaXQgT2JqZWN0aXZlLUMgY29kZSB0aGF0IGNhbm5vdCBjb21waWxlCistIFtUSFJJRlQtMzQwM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQwMykgLSBKU09OIFN0cmluZyByZWFkZXIgZG9lc24ndCByZWNvZ25pemUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycworLSBbVEhSSUZULTMzNjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzNjIpIC0gbWFrZSBjaGVjayBmYWlscyBmb3IgQysrIGF0IHRoZSBTZWN1cml0eVRlc3QKKy0gW1RIUklGVC0zMzk1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzk1KSAtIENvY29hIGNvbXBpbGVyIHByb2R1Y2VzIGNvcnJ1cHQgY29kZSB3aGVuIGJveGluZyBlbnVtcyBpbnNpZGUgbWFwLgorLSBbVEhSSUZULTMzOTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzOTQpIC0gY29tcGlsZXIgZ2VuZXJhdGVzIHVuY29tcGlsYWJsZSBjb2RlCistIFtUSFJJRlQtMzM4OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM4OCkgLSBoYXNoIGRvZXNuJ3Qgd29yayBvbiBzZXQvbGlzdAorLSBbVEhSSUZULTMzOTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzOTEpIC0gV3JvbmcgYm9vbCBmb3JtYXR0aW5nIGluIHRlc3Qgc2VydmVyCistIFtUSFJJRlQtMzM5MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM5MCkgLSBUVG9ybmFkbyBzZXJ2ZXIgZG9lc24ndCBoYW5kbGUgY2xvc2VkIGNvbm5lY3Rpb25zIHByb3Blcmx5CistIFtUSFJJRlQtMzM4Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM4MikgLSBUQmFzZSBjbGFzcyBmb3IgQysrIExpYnJhcnkKKy0gW1RIUklGVC0zMzkyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzkyKSAtIEphdmEgVFpsaWJUcmFuc3BvcnQgZG9lcyBub3QgY2xvc2UgaXRzIHdyYXBwZXIgc3RyZWFtcyB1cG9uIGNsb3NlKCkKKy0gW1RIUklGVC0zMzgzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzgzKSAtIGk2NCByZWxhdGVkIHdhcm5pbmdzIAorLSBbVEhSSUZULTMzODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzODYpIC0gbWlzYy4gd2FybmluZ3Mgd2l0aCBtYWtlIGNoZWNrCistIFtUSFJJRlQtMzM4NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM4NSkgLSB3YXJuaW5nOiBmb3JtYXQg4oCYJWx14oCZIGV4cGVjdHMg4oCYbG9uZyB1bnNpZ25lZCBpbnTigJksIGJ1dCBoYXMgdHlwZSDigJhzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPjo6c2l6ZV90eXBlIHtha2EgdW5zaWduZWQgaW50fQorLSBbVEhSSUZULTMzNTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzNTUpIC0gbnBtIFdBUk4gcGFja2FnZS5qc29uIHRocmlmdEAxLjAuMC1kZXYgTm8gbGljZW5zZSBmaWVsZC4KKy0gW1RIUklGVC0zMzYwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzYwKSAtIEltcHJvdmUgY3Jvc3MgdGVzdCBzZXJ2ZXJzIGFuZCBjbGllbnRzIGZ1cnRoZXIKKy0gW1RIUklGVC0zMzU5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzU5KSAtIEJpbmFyeSBmaWVsZCBpbmNvbXBhdGliaWxpdGllcworLSBbVEhSSUZULTMzNTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzNTQpIC0gRml4IHdvcmQtZXh0cmFjdGlvbiBzdWJzdHIgYnVnIGluIGluaXRpYWxpc20gY29kZQorLSBbVEhSSUZULTMzNTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzNTApIC0gUHl0aG9uIEpTT04gcHJvdG9jb2wgZG9lcyBub3QgZW5jb2RlIGJpbmFyeSBhcyBCYXNlNjQKKy0gW1RIUklGVC0zNTc3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTc3KSAtIGFzc2VydGlvbiBmYWlsZWQgYXQgbGluZSA1MTIgb2YgdGVzdGNvbnRhaW5lcnRlc3QuYworLSBbVEhSSUZULTM1NzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1NzYpIC0gQm9vc3QgdGVzdCAtLWxvZ19mb3JtYXQgYXJnIGRvZXMgbm90IGFjY2VwdCBsb3dlcmNhc2UKKy0gW1RIUklGVC0zNTc1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTc1KSAtIEdvIGNvbXBpbGVyIHRyaWVzIHRvIHVzZSB1bmV4cG9ydGVkIGxpYnJhcnkgbWV0aG9kcyB3aGVuIHVzaW5nIHJlYWRfd3JpdGVfcHJpdmF0ZQorLSBbVEhSSUZULTM1NzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1NzQpIC0gQ29jb2EgZ2VuZXJhdG9yIG1ha2VzIHVuY29tcGlsYWJsZSBpbXBvcnRzCistIFtUSFJJRlQtMzU3MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU3MCkgLSBSZW1vdmUgZHVwbGljYXRlIGluc3RhbmNlcyB0aGF0IGFyZSBhZGRlZCBieSB1cHN0cmVhbQorLSBbVEhSSUZULTM1NzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1NzEpIC0gTWFrZSBmZWF0dXJlIHRlc3QgcmVzdWx0IGJyb3dzYWJsZQorLSBbVEhSSUZULTM1NjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1NjkpIC0gY19nbGliIHByb3RvY29scyBkbyBub3QgY2hlY2sgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYnkgdHJhbnNwb3J0CistIFtUSFJJRlQtMzU2OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU2OCkgLSBUSGVhZGVyIHNlcnZlciBjcmFzaGVzIG9uIHJlYWRTbG93CistIFtUSFJJRlQtMzU2N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU2NykgLSBHTGliLUdPYmplY3QtQ1JJVElDQUwgKio6IGdfb2JqZWN0X3VucmVmOiBhc3NlcnRpb24gJ0dfSVNfT0JKRUNUIChvYmplY3QpJyBmYWlsZWQKKy0gW1RIUklGVC0zNTY2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTY2KSAtIEMrKy9RdDogVFFUY3BTZXJ2ZXJUZXN0Ojp0ZXN0X2NvbW11bmljYXRlKCkgaXMgbmV2ZXIgZXhlY3V0ZWQKKy0gW1RIUklGVC0zNTY0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTY0KSAtIEMrKy9RdDogcG90ZW50aWFsIGNvcmUgZHVtcCBpbiBUUVRjcFNlcnZlciBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gVEFzeW5jUHJvY2Vzc29yOjpwcm9jZXNzKCkKKy0gW1RIUklGVC0zNTU4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTU4KSAtIHR5cG9zIGluIGNfZ2xpYiB0ZXN0cworLSBbVEhSSUZULTM1NTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1NTkpIC0gRml4IGF3a3dhcmQgZXh0cmEgc2VtaS1jb2xvbnMgd2l0aCBDb2NvYSBjb250YWluZXIgbGl0ZXJhbHMKKy0gW1RIUklGVC0zNTU1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTU1KSAtICdjb25maWd1cmUnIHNjcmlwdCBkb2VzIG5vdCBob25vciAtLXdpdGgtb3BlbnNzbD08cGF0aD4gZm9yIGxpYmNyeXB0byBmb3IgQk5faW5pdAorLSBbVEhSSUZULTM1NTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1NTQpIC0gQ29uc3RhbnQgZGVjbHMgbWF5IGxlYWQgdG8gIkVycm9yOiBpbnRlcm5hbCBlcnJvcjogcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgYWxyZWFkeSBhY3RpdmUgZm9yIGRpZmZlcmVudCBzdHJ1Y3QiCistIFtUSFJJRlQtMzU1Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU1MikgLSBnbGliX2MgTWVtb3J5IExlYWsKKy0gW1RIUklGVC0zNTUxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTUxKSAtIFRocmlmdCBwZXJsIGxpYnJhcnkgbWlzc2luZyBwYWNrYWdlIGRlY2xhcmF0aW9uCistIFtUSFJJRlQtMzU0OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU0OSkgLSBFeGNlcHRpb25zIGFyZSBub3QgcHJvcGVybHkgc3RyaW5naWZpZWQgaW4gUGVybCBsaWJyYXJ5CistIFtUSFJJRlQtMzU0Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU0NikgLSBOb2RlSlMgY29kZSBzaG91bGQgbm90IGJlIG5hbWVzcGFjZWQgKGFuZCBpcyBjdXJyZW50bHkgbm90IHN0cmljdC1tb2RlIGNvbXBsaWFudCkKKy0gW1RIUklGVC0zNTQ1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTQ1KSAtIENvbnRhaW5lciB0eXBlIGxpdGVyYWxzIGRvIG5vdCBjb21waWxlCistIFtUSFJJRlQtMzUzOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzUzOCkgLSBSZW1vdmUgVW5ib3VuZE1ldGhvZFR5cGUgaW4gVFByb3RvY29sRGVjb3JhdG9yCistIFtUSFJJRlQtMzUzNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzUzNikgLSBFcnJvciAnY2hhcicgZG9lcyBub3QgY29udGFpbiBhIGRlZmluaXRpb24gZm9yICdJc0xvd1N1cnJvZ2F0ZScgZm9yIFdQNyB0YXJnZXQKKy0gW1RIUklGVC0zNTM0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTM0KSAtIExpbmsgZXJyb3Igd2hlbiBidWlsZGluZyB3aXRoIFF0NQorLSBbVEhSSUZULTM1MzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1MzMpIC0gQ2FuIG5vdCBzZW5kIG5pbCBwb2ludGVyIGFzIHNlcnZpY2UgbWV0aG9kIGFyZ3VtZW50CistIFtUSFJJRlQtMzUwN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzUwNykgLSBUSHR0cENsaWVudCBkb2VzIG5vdCB1c2UgcHJveHkgZnJvbSBodHRwX3Byb3h5LCBodHRwc19wcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKy0gW1RIUklGVC0zNTAyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTAyKSAtIEMrKyBUU2VydmVyU29ja2V0IHBhc3NlcyBzbWFsbCBidWZmZXIgdG8gZ2V0c29ja25hbWUKKy0gW1RIUklGVC0zNTAxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTAxKSAtIEZvcndhcmQgc2xhc2ggaW4gY29tbWVudCBjYXVzZXMgY29tcGlsZXIgZXJyb3IKKy0gW1RIUklGVC0zNDk4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDk4KSAtIEMrKyBsaWJyYXJ5IGFzc3VtZXMgb3B0aW9uYWwgZnVuY3Rpb24gcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5IGlzIGF2YWlsYWJsZQorLSBbVEhSSUZULTM0OTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0OTcpIC0gQnVpbGQgZmFpbHMgd2l0aCAiaW52YWxpZCB1c2Ugb2YgaW5jb21wbGV0ZSB0eXBlIgorLSBbVEhSSUZULTM0OTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0OTYpIC0gQysrOiBDb2Igc3R5bGUgY2xpZW50IGZhaWxzIHdoZW4gc2VuZGluZyBhIGNvbnNlY3V0aXZlIHJlcXVlc3QKKy0gW1RIUklGVC0zNDkzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDkzKSAtIGxpYnRocmlmdCBkb2VzIG5vdCBjb21waWxlIG9uIHdpbmRvd3MgdXNpbmcgdmlzdWFsIHN0dWRpbworLSBbVEhSSUZULTM0ODhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0ODgpIC0gd2FybmluZzogdW51c2VkIHZhcmlhYmxlICdwcm9ncmFtJworLSBbVEhSSUZULTM0ODldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0ODkpIC0gd2FybmluZzogZGVwcmVjYXRlZCBjb252ZXJzaW9uIGZyb20gc3RyaW5nIGNvbnN0YW50IHRvICdjaGFyKicgWy1Xd3JpdGUtc3RyaW5nc10KKy0gW1RIUklGVC0zNDg3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDg3KSAtIEZ1bGwgc3VwcG9ydCBmb3IgbmV3ZXIgRGVscGhpIHZlcnNpb25zCistIFtUSFJJRlQtMzUyOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzUyOCkgLSBGaXggd2FybmluZ3MgaW4gdGhyaWZ0LmxsCistIFtUSFJJRlQtMzUyN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzUyNykgLSAtZ2VuIHB5OmR5bmFtaWMsdXRmOHN0cmluZ3MgaWdub3JlcyB1dGY4c3RyaW5ncyBvcHRpb24KKy0gW1RIUklGVC0zNTI2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTI2KSAtIENvZGUgZ2VuZXJhdGVkIGJ5IHB5OnV0ZjhzdHJpbmdzIGRvZXMgbm90IHdvcmsgZm9yIFB5dGhvbjMKKy0gW1RIUklGVC0zNTI0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTI0KSAtIGRjYzMyIHdhcm5pbmcgIlcxMDAwIFN5bWJvbCAnSXNMb3dTdXJyb2dhdGUnIGlzIGRlcHJlY2F0ZWQ6ICdVc2UgVENoYXJIZWxwZXInIiBpbiBUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMKKy0gW1RIUklGVC0zNTI1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTI1KSAtIHB5OmR5bmFtaWMgZmFpbHMgdG8gaGFuZGxlIGJpbmFyeSBsaXN0L3NldC9tYXAgZWxlbWVudAorLSBbVEhSSUZULTM1MjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1MjEpIC0gVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QgaXMgbm90IGRldGVybWluaXN0aWMgKGZhaWxzIHdoZW4gcnVuIG9uIEpESyA4KQorLSBbVEhSSUZULTM1MjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1MjApIC0gRGFydCBUU29ja2V0IG9uRXJyb3Igc3RyZWFtIHNob3VsZCBiZSB0eXBlZCBhcyBPYmplY3QKKy0gW1RIUklGVC0zNTE5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTE5KSAtIGZhc3RiaW5hcnkgZG9lcyBub3Qgd29yayB3aXRoIC1nZW4gcHk6dXRmOHN0cmluZ3MKKy0gW1RIUklGVC0zNTE4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTE4KSAtIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gZmlsZXMgd2VyZSBtaXNzaW5nIGZvciBWaXN1YWwgU3R1ZGlvCistIFtUSFJJRlQtMzUxMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzUxMikgLSBjX2dsaWI6IEJ1aWxkIGZhaWxzIGR1ZSB0byBtaXNzaW5nIGZlYXR1cmVzLmgKKy0gW1RIUklGVC0zNDgzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDgzKSAtIEluY29ycmVjdCBlbXB0eSBiaW5hcnkgaGFuZGxpbmcgaW50cm9kdWNlZCBieSBUSFJJRlQtMzM1OQorLSBbVEhSSUZULTM0NzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NzkpIC0gT25ld2F5IGNhbGxzIHNob3VsZCBub3QgcmV0dXJuIGV4Y2VwdGlvbnMgdG8gY2xpZW50cworLSBbVEhSSUZULTM0NzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NzgpIC0gUmVzdG9yZSBkcm9wcGVkIG1ldGhvZCB0byBUSHNIYVNlcnZlci5qYXZhCistIFtUSFJJRlQtMzQ3N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQ3NykgLSBQYXJzZXIgZmFpbHMgb24gZW51bSBpdGVtIHRoYXQgc3RhcnRzIHdpdGggJ0UnIGxldHRlciBhbmQgY29udGludWVzIHdpdGggbnVtYmVyIAorLSBbVEhSSUZULTM0NzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NzYpIC0gTWlzc2luZyBpbmNsdWRlIGluIC4vc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcAorLSBbVEhSSUZULTM0NzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NzQpIC0gRG9ja2VyOiB0aHJpZnQtY29tcGlsZXIKKy0gW1RIUklGVC0zNDczXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDczKSAtIFdoZW4gIm9wdGlvbmFsJyBpcyB1c2VkIHdpdGggYSBzdHJ1Y3QgbWVtYmVyLCBDKysgc2VydmVyIHNlZW1zIHRvIG5vdCByZXR1cm4gaXQgY29ycmVjdGx5CistIFtUSFJJRlQtMzQ2OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQ2OCkgLSBEYXJ0IFRTb2NrZXRUcmFuc3BvcnQgb25FcnJvciBoYW5kbGVyIGlzIHRvbyByZXN0cmljdGl2ZQorLSBbVEhSSUZULTM0NTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NTEpIC0gdGhyaWZ0X3Byb3RvY29sIFBIUCBleHRlbnNpb24gbWlzc2luZyBjb25maWcubTQgZmlsZQorLSBbVEhSSUZULTM0NTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NTYpIC0gcm91bmRpbmcgaXNzdWUgaW4gc3RhdGljIGFzc2VydAorLSBbVEhSSUZULTM0NTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NTUpIC0gc3RydWN0IHdyaXRlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSBpcyBpbmNvcnJlY3QKKy0gW1RIUklGVC0zNDU0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDU0KSAtIFB5dGhvbiBUb3JuYWRvIHR1dG9yaWFsIGlzIGJyb2tlbgorLSBbVEhSSUZULTM0NjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NjMpIC0gSmF2YSBjYW4ndCBiZSBkaXNhYmxlZCBpbiBDTWFrZSBidWlsZAorLSBbVEhSSUZULTM0NTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NTApIC0gTlBFIHdoZW4gdXNpbmcgU1NMCistIFtUSFJJRlQtMzQ0OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQ0OSkgLSBUQmFzZUFzeW5jUHJvY2Vzc29yIGZiLnJlc3BvbnNlUmVhZHkoKSBuZXZlciBjYWxsZWQgZm9yIG9uZXdheSBmdW5jdGlvbnMKKy0gW1RIUklGVC0zNDcxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDcxKSAtIERhcnQgZ2VuZXJhdG9yIGRvZXMgbm90IGhhbmRsZSB1cHBlcmNhc2UgYXJndW1lbnQgbmFtZXMKKy0gW1RIUklGVC0zNDcwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDcwKSAtIFNwb3JhZGljIHRpbWVvdXRzIHdpdGggcGlwZXMKKy0gW1RIUklGVC0zNDY1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDY1KSAtIEdvIENvZGUgV2l0aCBDb21wbGV4IENvbnN0IEluaXRpYWxpemVyIENvbXBpbGF0aW9uIERlcGVuZHMgT24gU3RydWN0IE9yZGVyCistIFtUSFJJRlQtMzQ2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQ2NCkgLSBGaXggc2V2ZXJhbCBkZWZlY3RzIGluIGNfZ2xpYiBjb2RlIGdlbmVyYXRvcgorLSBbVEhSSUZULTM0NjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NjIpIC0gQ29jb2EgZ2VuZXJhdGVzIEluY29ycmVjdCAjaW1wb3J0IGhlYWRlciBuYW1lcworLSBbVEhSSUZULTM0NTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NTMpIC0gcmVtb3ZlIHJhdF9leGNsdWRlCistIFtUSFJJRlQtMzQxOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQxOCkgLSBVc2Ugb2YgY2lwaGVycyBpbiBzc2wud3JhcF9zb2NrZXQoKSBicmVha3MgcHl0aG9uIDIuNiBjb21wYXRpYmlsaXR5CistIFtUSFJJRlQtMzQxN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQxNykgLSAibmFtZXNwYWNlIHhzZCIgaXMgbm90IHJlYWxseSB3b3JraW5nCistIFtUSFJJRlQtMzQxM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQxMykgLSBUaHJpZnQgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiBHbyB3aGVuIGV4dGVuZGluZyBzZXJ2aWNlCistIFtUSFJJRlQtMzQyMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQyMCkgLSBDKys6IFRTU0xTb2NrZXRzIGFyZSBub3QgaW50ZXJydXB0YWJsZQorLSBbVEhSSUZULTM0MTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MTUpIC0gaW5jbHVkZSB1bmlzdGQuaCBjb25kaXRpb25hbGx5CistIFtUSFJJRlQtMzQxNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQxNCkgLSAjaW5jbHVkZSA8cHdkLmg+IGluIFRIZWFkZXJUcmFuc3BvcnQuaCBicmVha3Mgd2luZG93cyBidWlsZAorLSBbVEhSSUZULTM0MTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MTEpIC0gR28gZ2VuZXJhdGVzIHJlbW90ZXMgd2l0aCB3cm9uZyBwYWNrYWdlIHF1YWxpZmllcnMgd2hlbiBpbmNsdWRpbmcKKy0gW1RIUklGVC0zNDMwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDMwKSAtIEdvIFRIdHRwQ2xpZW50IGRvZXMgbm90IHJlYWQgSFRUUCByZXNwb25zZSBib2R5IHRvIGNvbXBsZXRpb24gd2hlbiBjbG9zaW5nCistIFtUSFJJRlQtMzQyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQyMykgLSBGaXJzdCBjYWxsIHRvIHRocmlmdF90cmFuc3BvcnQ6cmVhZF9leGFjdCBmYWlscyB0byBkaXNwYXRjaCBjb3JyZWN0IGZ1bmN0aW9uCistIFtUSFJJRlQtMzQyMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQyMikgLSBHbyBUU2VydmVyU29ja2V0IGRvZXNuJ3QgY2xvc2Ugb24gSW50ZXJydXB0CistIFtUSFJJRlQtMzQyMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQyMSkgLSByZWJhciBhcyBkZXBlbmRlbmN5IGluc3RlYWQgb2YgYnVuZGxpbmcgKHdhczogIHJlYmFyIGZhaWxzIGlmIFBXRCBjb250YWlucyBVbmljb2RlKQorLSBbVEhSSUZULTM0MjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MjgpIC0gR28gdGVzdCBmYWlscyB3aGVuIHJ1bm5pbmcgbWFrZSBjaGVjaworLSBbVEhSSUZULTM0NDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NDUpIC0gVGhyb3dhYmxlIG1lc3NhZ2VzIGFyZSBoaWRkZW4gZnJvbSBKVk0gc3RhY2sgdHJhY2Ugb3V0cHV0CistIFtUSFJJRlQtMzQ0M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQ0MykgLSBUaHJpZnQgaW5jbHVkZSBjYW4gZ2VuZXJhdGUgdW5jb21waWxhYmxlIGNvZGUKKy0gW1RIUklGVC0zNDQ0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDQ0KSAtIExhcmdlIDY0IGJpdCBJbnRlZ2VyIGRvZXMgbm90IHByZXNlcnZlIHZhbHVlIHRocm91Z2ggTm9kZS5qcyBKU09OUHJvdG9jb2wgCistIFtUSFJJRlQtMzQzNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQzNikgLSBtaXNjLiBjcm9zcyB0ZXN0IGlzc3VlcyB3aXRoIFVURi04IHBhdGggbmFtZXMKKy0gW1RIUklGVC0zNDM1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDM1KSAtIFB1dCBnZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciBmdWxsY2FtZWwgdGVzdHMgaW4gYSBzZXBhcmF0ZSBwYWNrYWdlL25hbWVzcGFjZQorLSBbVEhSSUZULTM0MzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MzMpIC0gRG91YmxlcyBhcmVuJ3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5CistIFtUSFJJRlQtMzQzN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQzNykgLSBNaW5ndy13NjQgYnVpbGQgZmFpbAorLSBbVEhSSUZULTM0MzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MzQpIC0gRGFydCBnZW5lcmF0b3IgcHJvZHVjZXMgZW1wdHkgbmFtZSBpbiBwdWJzcGVjLnlhbWwgZm9yIGluY2x1ZGVzIHdpdGhvdXQgbmFtZXNwYWNlcworLSBbVEhSSUZULTM0MDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MDgpIC0gSlNPTiBnZW5lcmF0b3IgZW1pdHMgaW5jb3JyZWN0IHR5cGVzCistIFtUSFJJRlQtMzQwNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQwNikgLSBDb2NvYSBjbGllbnQgc2hvdWxkIG5vdCBzY2hlZHVsZSBzdHJlYW1zIG9uIG1haW4gcnVubG9vcAorLSBbVEhSSUZULTM0MDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MDQpIC0gSlNPTiBTdHJpbmcgcmVhZGVyIGRvZXNuJ3QgcmVjb2duaXplIFVURi0xNiBzdXJyb2dhdGUgcGFpcgorLSBbVEhSSUZULTM2MzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2MzYpIC0gRG91YmxlIHByZWNpc2lvbiBpcyBub3QgZnVsbHkgcHJlc2VydmVkIGluIEMrKyBUSlNPTlByb3RvY29sCistIFtUSFJJRlQtMzYzMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzYzMikgLSBjX2dsaWIgdGVzdHNlcmlhbGl6YXRpb24gZmFpbHMgd2l0aCBnbGliIGFzc2VydGlvbgorLSBbVEhSSUZULTM2MTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2MTkpIC0gVXNpbmcgVGhyaWZ0IDAuOS4zIHdpdGggZ29vZ2xldGVzdCBvbiBMaW51eCBnY2MgNC45IC8gQysrMTEKKy0gW1RIUklGVC0zNjE3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjE3KSAtIENNYWtlIGRvZXMgbm90IGJ1aWxkIGd2L3htbCBnZW5lcmF0b3JzCistIFtUSFJJRlQtMzYxNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzYxNSkgLSBGaXggUHl0aG9uIFNTTCBjbGllbnQgcmVzb3VyY2UgbGVhayBvbiBjb25uZWN0aW9uIGZhaWx1cmUKKy0gW1RIUklGVC0zNjE2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjE2KSAtIGxpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5IGlzIGZsYWt5CistIFtUSFJJRlQtMzY0M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzY0MykgLSBQZXJsIFNTTCBzZXJ2ZXIgY3J1c2hlcyBpZiBhIGNsaWVudCBkaXNjb25uZWN0IHdpdGhvdXQgaGFuZHNoYWtlCistIFtUSFJJRlQtMzYzOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzYzOSkgLSBDIyBUaHJpZnQgbGlicmFyeSBmb3JjZXMgVExTIDEuMCwgdGh3YXJ0aW5nIFRMUyAxLjIgdXNhZ2UKKy0gW1RIUklGVC0zNjMzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjMzKSAtIFRyYXZpcyAiQyBDKysgLSBHQ0MiIGJ1aWxkIHdhcyB1c2luZyBjbGFuZworLSBbVEhSSUZULTM2MzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2MzQpIC0gRml4IFB5dGhvbiBUU29ja2V0IHJlc291cmNlIGxlYWsgb24gY29ubmVjdGlvbiBmYWlsdXJlCistIFtUSFJJRlQtMzYzMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzYzMCkgLSBEZWJpYW4vVWJ1bnR1IGluc3RhbGwgZG9jcyBuZWVkIGFuIHVwZGF0ZQorLSBbVEhSSUZULTM2MjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2MjkpIC0gUGFyc2VyIHNldHMgZXhpdGNvZGUgb24gZXJyb3JzLCBidXQgZ2VuZXJhdG9yIGRvZXMgbm90CistIFtUSFJJRlQtMzYwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzYwOCkgLSBsaWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0IGlzIGZsYWt5IGluIGplbmtpbnMgVGhyaWZ0LXByZWNvbW1pdCBidWlsZC4KKy0gW1RIUklGVC0zNjAxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjAxKSAtIEJldHRlciBjb25mb3JtYW5jZSB0byBQRVA4IGZvciBnZW5lcmF0ZWQgY29kZQorLSBbVEhSSUZULTM1OTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1OTkpIC0gVmFsaWRhdGUgY2xpZW50IElQIGFkZHJlc3MgYWdhaW5zdCBjZXJ0J3MgU3ViamVjdEFsdE5hbWUKKy0gW1RIUklGVC0zNTk4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTk4KSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBkb2Vzbid0IGluc3RhbnRpYXRlIGNsaWVudCBjb25uZWN0aW9uCistIFtUSFJJRlQtMzU5N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU5NykgLSBgbWFrZSBjaGVja2AgaGFuZ3MgaW4gZ28gdGVzdHMKKy0gW1RIUklGVC0zNTg5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTg5KSAtIERhcnQgZ2VuZXJhdG9yIHVzZXMgd3JvbmcgbmFtZSBpbiBjb25zdHJ1Y3RvciBmb3IgdXBwZXJjYXNlIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHRzCistIFtUSFJJRlQtMzU4OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU4OCkgLSBVc2luZyBUeXBlU2NyaXB0IHdpdGggLS1ub0ltcGxpY2l0QW55IGZhaWxzCistIFtUSFJJRlQtMzU4NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU4NCkgLSBib29sZWFuIGZhbHNlIHZhbHVlIGNhbm5vdCBiZSB0cmFuc2ZlcnJlZAorLSBbVEhSSUZULTM1NzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1NzgpIC0gTWFrZSBUSGVhZGVyVHJhbnNwb3J0IGRldGVjdCBUQ29tcGFjdCBmcmFtZWQgYW5kIHVuZnJhbWVkCistIFtUSFJJRlQtMzMyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzMyMykgLSBQeXRob24gbGlicmFyeSBkb2VzIG5vdCBoYW5kbGUgZXNjYXBlZCBmb3J3YXJkIHNsYXNoICgiLyIpIGluIEpTT04KKy0gW1RIUklGVC0zMzIyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzIyKSAtIENNYWtlIGdlbmVyYXRlZCAibWFrZSBjaGVjayIgZmFpbGVzIG9uIHB5dGhvbl90ZXN0CistIFtUSFJJRlQtMzMyMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzMyMSkgLSBUaHJpZnQgY2FuJ3QgYmUgYWRkZWQgYXMgYSBzdWJkaXJlY3Rvcnkgb2YgYW5vdGhlciBDTWFrZS1iYXNlZCBwcm9qZWN0CistIFtUSFJJRlQtMzMxNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzMxNCkgLSBEb3RzIGluIGZpbGUgbmFtZXMgb2YgaW5jbHVkZXMgY2F1c2VzIGRvdHMgaW4gamF2YXNjcmlwdCB2YXJpYWJsZSBuYW1lcworLSBbVEhSSUZULTMzMDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzMDcpIC0gU2VnZmF1bHQgaW4gUnVieSBzZXJpYWxpemVyCistIFtUSFJJRlQtMzMwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzMwOSkgLSBNaXNzaW5nIFRDb25zdGFudC5waHAgaW4gL2xpYi9waHAvTWFrZWZpbGUuYW0KKy0gW1RIUklGVC0zODEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODEwKSAtIHVucmVzb2x2ZWQgZXh0ZXJuYWwgc3ltYm9sIHB1YmxpYzogdmlydHVhbCB2b2lkIF9fY2RlY2wgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckZyYW1ld29yazo6c2VydmUodm9pZCkKKy0gW1RIUklGVC0zNzM2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzM2KSAtIEMrKyBsaWJyYXJ5IGJ1aWxkIGZhaWxzIGlmIE9wZW5TU0wgZG9lcyBub3Qgc3VycnBvdCBTU0x2MworLSBbVEhSSUZULTM4NzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4NzgpIC0gQ29tcGlsZSBlcnJvciBpbiBUU1NMU29ja2V0LmNwcCB3aXRoIG5ldyBPcGVuU1NMIFtDUllQVE9fbnVtX2xvY2tzXQorLSBbVEhSSUZULTM5NDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5NDkpIC0gbWlzc2luZyBtYWtlIGRpc3QgZW50cnkgZm9yIGNvbXBpbGVyL2NwcC90ZXN0CistIFtUSFJJRlQtNDQ5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NDkpIC0gVGhlIHdpcmUgZm9ybWF0IG9mIHRoZSBKU09OIFByb3RvY29sIG1heSBub3QgYWx3YXlzIGJlIHZhbGlkIEpTT04gaWYgaXQgY29udGFpbnMgbm9uLVVURjggZW5jb2RlZCBzdHJpbmdzCistIFtUSFJJRlQtMTYyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjIpIC0gVGhyaWZ0IHN0cnVjdHVyZXMgYXJlIHVuaGFzaGFibGUsIHByZXZlbnRpbmcgdGhlbSBmcm9tIGJlaW5nIHVzZWQgYXMgc2V0IGVsZW1lbnRzCistIFtUSFJJRlQtMzk2MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzk2MSkgLSBUQ29ubmVjdGVkQ2xpZW50IGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50IGlmIGFuIGV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHRoZSByZWNlaXZlZCBtZXNzYWdlIG9jY3VyZXMuCistIFtUSFJJRlQtMzg4MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzg4MSkgLSBUcmF2aXMgQ0kgYnVpbGRzIGFyZSBmYWlsaW5nIGR1ZSB0byBkb2NrZXIgZmFpbHVyZXMgKHRocmVlIHJldHJpZXMsIGFuZCBnaXZlcyB1cCkKKy0gW1RIUklGVC0zOTM3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTM3KSAtIENhbm5vdCBjb21waWxlIDAuMTAuMCBkZXZlbG9wbWVudCB0aXAgd2l0aCBnY2MtNC42LngKKy0gW1RIUklGVC0zOTY0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTY0KSAtIFVuc3VwcG9ydGVkIG1lY2hhbmlzbSB0eXBlID8/Pz8/IGR1ZSB0byBkZXBlbmRlbmN5IG9uIGRlZmF1bHQgT1MtZGVwZW5kZW50IGNoYXJzZXQKKy0gW1RIUklGVC0zMDM4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDM4KSAtIFVzZSBvZiB2b2xhdGlsZSBpbiBjcHAgbGlicmFyeQorLSBbVEhSSUZULTMzMDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzMDEpIC0gSmF2YSBnZW5lcmF0ZWQgY29kZSB1c2VzIGltcG9ydHMgdGhhdCBjYW4gbGVhZCB0byBjbGFzcyBuYW1lIGNvbGxpc2lvbnMgd2l0aCBJREwgZGVmaW5lZCB0eXBlcworLSBbVEhSSUZULTMzNDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzNDgpIC0gUEhQIFRDb21wYWN0UHJvdG9jb2wgYm9vbCZpbnQ2NCByZWFkdmFsdWUgYnVnCistIFtUSFJJRlQtMzk1NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzk1NSkgLSBUVGhyZWFkZWRTZXJ2ZXIgTWVtb3J5IExlYWsKKy0gW1RIUklGVC0zODI5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODI5KSAtIFRocmlmdCBkb2VzIG5vdCBpbnN0YWxsIFB5dGhvbiBMaWJyYXJpZXMgaWYgVHdpc3RlZCBpcyBub3QgaW5zdGFsbGVkCistIFtUSFJJRlQtMzkzMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkzMikgLSBDKysgVGhyZWFkTWFuYWdlciBoYXMgYSByYXJlIHRlcm1pbmF0aW9uIHJhY2UKKy0gW1RIUklGVC0zODI4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODI4KSAtIGNtYWtlIGZhaWxzIHdoZW4gQm9vc3RfSU5DTFVERV9ESVJTIChhbmQgb3RoZXIgdmFyaWFibGVzIHBhc3NlZCB0byBpbmNsdWRlX2RpcmVjdG9yaWVzKCkpIGlzIGVtcHR5IAorLSBbVEhSSUZULTM5NThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5NTgpIC0gQ01ha2UgV0lUSF9NVCBvcHRpb24gZm9yIHdpbmRvd3Mgc3RhdGljIHJ1bnRpbWUgbGlua2luZyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjbWFrZSBidWlsZCB0eXBlIFJlbFdpdGhEZWJJbmZvCistIFtUSFJJRlQtMzk1N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzk1NykgLSBUQ29ubmVjdGVkQ2xpZW50IGRvZXMgbm90IGRpc2Nvbm5lY3QgZnJvbSBjbGllbnRzIHdoZW4gdGhlaXIgdGltZW91dCBpcyByZWFjaGVkLgorLSBbVEhSSUZULTM5NTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5NTMpIC0gVFNTTFNvY2tldDo6Y2xvc2Ugc2hvdWxkIGhhbmRsZSBleGNlcHRpb25zIGZyb20gd2FpdEZvckV2ZW50IGJlY2F1c2UgaXQgaXMgY2FsbGVkIGJ5IHRoZSBkZXN0cnVjdG9yLgorLSBbVEhSSUZULTM5NzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5NzcpIC0gUEhQIGV4dGVuc2lvbiBjcmVhdGVzIHVuZGVmaW5lZCB2YWx1ZXMgd2hlbiBkZXNlcmlhbGl6aW5nIHNldHMKKy0gW1RIUklGVC0zOTQ3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTQ3KSAtIHNvY2thZGRyIHR5cGUgaXNuJ3QgYWx3YXlzIGxhcmdlIGVub3VnaCBmb3IgdGhlIHJldHVybiBvZiBnZXRzb2NrbmFtZQorLSBbVEhSSUZULTI3NTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI3NTUpIC0gVGhyZWFkU2FuaXRpemVyIHJlcG9ydHMgZGF0YSByYWNlIGluIFRocmVhZE1hbmFnZXI6OkltcGw6OmFkZFdvcmtlcgorLSBbVEhSSUZULTM5NDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5NDgpIC0gZXJybm8gaXMgbm90IHRoZSBjb3JyZWN0IG1ldGhvZCBvZiBnZXR0aW5nIHRoZSBlcnJvciBpbiB3aW5kb3dzCistIFtUSFJJRlQtNDAwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDAwOCkgLSBicm9rZW4gY2kgZHVlIHRvIHVwc3RyZWFtIGRlcGVuZGVuY3kgdmVyc2lvbmluZyBicmVhaworLSBbVEhSSUZULTM5OTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5OTkpIC0gRml4IERlYmlhbiAmIFVidW50dSBwYWNrYWdlIGRlcGVuZGVuY2llcworLSBbVEhSSUZULTM4ODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4ODYpIC0gUEhQIGNyb3NzIHRlc3QgY2xpZW50IHJldHVybnMgMCBldmVuIHdoZW4gZmFpbGluZworLSBbVEhSSUZULTM5OTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5OTcpIC0gYnVpbGRpbmcgdGhyaWZ0IGxpYnMgZG9lcyBub3Qgc3VwcG9ydCBuZXcgb3BlbnNzbAorCisjIyMgRG9jdW1lbnRhdGlvbgorLSBbVEhSSUZULTM4NjddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4NjcpIC0gU3BlY2lmeSBCaW5hcnlQcm90b2NvbCBhbmQgQ29tcGFjdFByb3RvY29sCisKKyMjIyBFcGljCistIFtUSFJJRlQtMzA0OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA0OSkgLSBBcyBhbiBpT1MgZGV2ZWxvcGVyLCBJIHdhbnQgYSBnZW5lcmF0b3IgYW5kIGxpYnJhcnkgdGhhdCBwcm9kdWNlcyBTd2lmdCBjb2RlCistIFtUSFJJRlQtMjMzNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjMzNikgLSBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKworIyMjIEltcHJvdmVtZW50CistIFtUSFJJRlQtMTg2N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTg2NykgLSBQeXRob24gY2xpZW50L3NlcnZlciBzaG91bGQgc3VwcG9ydCBjbGllbnQtc2lkZSBjZXJ0aWZpY2F0ZXMuCistIFtUSFJJRlQtMTMxM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTMxMykgLSBjX2dsaWIgY29tcGFjdCBzdXBwb3J0CistIFtUSFJJRlQtMTM4NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTM4NSkgLSBtYWtlIGluc3RhbGwgZG9lc24ndCBpbnN0YWxsIGphdmEgbGlicmFyeSBpbiB0aGUgc2V0dGVkIGZvbGRlcgorLSBbVEhSSUZULTE0MzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0MzcpIC0gVXBkYXRlIFJQTSBzcGVjCistIFtUSFJJRlQtODQ3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC04NDcpIC0gVGVzdCBGcmFtZXdvcmsgaGFybW9uaXphdGlvbiBhY3Jvc3MgYWxsIGxhbmd1YWdlcworLSBbVEhSSUZULTgxOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtODE5KSAtIGFkZCBFbnVtZXJhdGlvbiBmb3IgcHJvdG9jb2wsIHRyYW5zcG9ydCBhbmQgc2VydmVyIHR5cGVzCistIFtUSFJJRlQtMzkyN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkyNykgLSBFbWl0IGFuIGVycm9yIGluc3RlYWQgb2YgdGhyb3cgYW4gZXJyb3IgaW4gdGhlIGFzeW5jIGNhbGxiYWNrCistIFtUSFJJRlQtMzkzMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkzMSkgLSBUU2ltcGxlU2VydmVyOiBJZiBwcm9jZXNzIHJlcXVlc3QgZW5jb3VudGVyIFVOS05PV05fTUVUSE9ELCBkb24ndCBjbG9zZSB0cmFuc3BvcnQuCistIFtUSFJJRlQtMzkzNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkzNCkgLSBBdXRvbWF0aWNhbGx5IHJlc29sdmUgT3BlblNTTCBiaW5hcnkgdmVyc2lvbiBvbiBXaW5kb3dzIENJCistIFtUSFJJRlQtMzkxOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkxOCkgLSBSdW4gc3Vic2V0IG9mIG1ha2UgY3Jvc3MKKy0gW1RIUklGVC0zOTA4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTA4KSAtIFJlbW92ZSByZWR1bmRhbnQgZGVwZW5kZW5jaWVzIGZyb20gRG9ja2VyZmlsZQorLSBbVEhSSUZULTM5MDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5MDcpIC0gU2tpcCBEb2NrZXIgaW1hZ2UgYnVpbGQgb24gQ0kgd2hlbiB1bmNoYW5nZWQKKy0gW1RIUklGVC0zODY4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODY4KSAtIEphdmEgc3RydWN0IGVxdWFscyBzaG91bGQgZG8gaWRlbnRpdHkgY2hlY2sgYmVmb3JlIGZpZWxkIGNvbXBhcmlzb24KKy0gW1RIUklGVC0zODQ5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODQ5KSAtIFBvcnQgR28gc2VyaWFsaXplciBhbmQgZGVzZXJpYWxpemVyIHRvIGRhcnQKKy0gW1RIUklGVC0yOTg5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTg5KSAtIENvbXBsZXRlIENNYWtlIGJ1aWxkIGZvciBBcGFjaGUgVGhyaWZ0CistIFtUSFJJRlQtMjk4MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjk4MCkgLSBUaHJpZnRNZW1vcnlCdWZmZXIgZG9lc24ndCBoYXZlIGEgY29uc3RydWN0b3Igb3B0aW9uIHRvIHRha2UgYW4gZXhpc3RpbmcgYnVmZmVyCistIFtUSFJJRlQtMjg1Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg1NikgLSByZWZhY3RvciBlcmxhbmcgYmFzaWMgdHJhbnNwb3J0cyBhbmQgdW5pZnkgaW50ZXJmYWNlcworLSBbVEhSSUZULTI4NzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4NzcpIC0gT3B0aW1pemUgZ2VuZXJhdGVkIGhhc2hDb2RlCistIFtUSFJJRlQtMjg2OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg2OSkgLSBKU09OOiBydW4gc2NoZW1hIHZhbGlkYXRpb24gZnJvbSB0ZXN0cworLSBbVEhSSUZULTMxMTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxMTIpIC0gW0phdmFdIEFzeW5jTWV0aG9kQ2FsbGJhY2sgc2hvdWxkIGJlIHR5cGVkIGluIGdlbmVyYXRlZCBBc3luY0lmYWNlCistIFtUSFJJRlQtMzI2M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzI2MykgLSBQSFAganNvblNlcmlhbGl6ZSgpIHNob3VsZCBjYXN0IHNjYWxhciB0eXBlcworLSBbVEhSSUZULTI5MDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MDUpIC0gQ29jb2EgY29tcGlsZXIgc2hvdWxkIGhhdmUgb3B0aW9uIHRvIHByb2R1Y2UgIm1vZGVybiIgT2JqZWN0aXZlLUMKKy0gW1RIUklGVC0yODIxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODIxKSAtIEVuYWJsZSB0aGUgdXNlIG9mIGN1c3RvbSBIVFRQLUhlYWRlciBpbiB0aGUgVHJhbnNwb3J0CistIFtUSFJJRlQtMjA5M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjA5MykgLSBhZGRlZCB0aGUgYWJpbGl0eSB0byBzZXQgY29tcHJlc3Npb24gbGV2ZWwgaW4gQysrIHpsaWIgdHJhbnNwb3J0CistIFtUSFJJRlQtMjA4OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjA4OSkgLSBDb21waWxlciBpZ25vcmVzIGR1cGxpY2F0ZSB0eXBlbmFtZXMKKy0gW1RIUklGVC0yMDU2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDU2KSAtIE1vdmVkIGFsbCAjaW5jbHVkZSBjb25maWcuaCBzdGF0ZW1lbnRzIHRvICNpbmNsdWRlIDx0aHJpZnQvY29uZmlnLmg+CistIFtUSFJJRlQtMjAzMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjAzMSkgLSBNYWtlIFNPX0tFRVBBTElWRSBjb25maWd1cmFibGUgZm9yIEMrKyBsaWIKKy0gW1RIUklGVC0yMDIxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDIxKSAtIEltcHJvdmUgbGFyZ2UgYmluYXJ5IHByb3RvY29sIHN0cmluZyBwZXJmb3JtYW5jZQorLSBbVEhSSUZULTIwMjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwMjgpIC0gQ2xlYW51cCB0aHJlYWRpbmcgaGVhZGVycyAvIGxpYnJhcmllcworLSBbVEhSSUZULTIwMTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwMTQpIC0gQ2hhbmdlIEMrKyBsaWIgaW5jbHVkZXMgdG8gdXNlIDxuYW1lc3BhY2UvPiBzdHlsZSB0aHJvdWdob3V0CistIFtUSFJJRlQtMjMxMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjMxMikgLSB0cmF2aXMueW1sOiBidWlsZCBldmVyeXRoaW5nCistIFtUSFJJRlQtMTkxNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTkxNSkgLSBNdWx0aXBsZXhpbmcgU2VydmljZXMKKy0gW1RIUklGVC0xNzM2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzM2KSAtIFZpc3VhbCBTdHVkaW8gdG9wIGxldmVsIHByb2plY3QgZmlsZXMgd2l0aGluIG1zdmMKKy0gW1RIUklGVC0xNzM1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzM1KSAtIGludGVncmF0ZSB0dXRvcmlhbCBpbnRvIHJlZ3VsYXIgYnVpbGQKKy0gW1RIUklGVC0xNTMzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTMzKSAtIE1ha2UgVFRyYW5zcG9ydCBzaG91bGQgYmUgQ2xvc2VhYmxlCistIFtUSFJJRlQtMzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1KSAtIE1vdmUgbGFuZ3VhZ2UgdGVzdHMgaW50byB0aGVpciBhcHByb3ByaWF0ZSBsaWJyYXJ5IGRpcmVjdG9yeQorLSBbVEhSSUZULTEwNzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwNzkpIC0gU3VwcG9ydCBpNjQgaW4gQVMzCistIFtUSFJJRlQtMTEwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTEwOCkgLSBTU0wgc3VwcG9ydCBmb3IgdGhlIFJ1YnkgbGlicmFyeSAKKy0gW1RIUklGVC0zODU2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODU2KSAtIHVwZGF0ZSBkZWJpYW4gcGFja2FnZSBkZWVwZW5kZW5jaWVzCistIFtUSFJJRlQtMzgzM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzgzMykgLSBoYXhlIGh0dHAgc2VydmVyIGltcGxlbWVudGF0aW9uIChieSBlbWJlZGluZyBpbnRvIHBocCB3ZWIgc2VydmVyKQorLSBbVEhSSUZULTM4MzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4MzkpIC0gUGVyZm9ybWFuY2UgaXNzdWUgd2l0aCBiaWcgbWVzc2FnZSBkZXNlcmlhbGl6YXRpb24gdXNpbmcgcGhwIGV4dGVuc2lvbgorLSBbVEhSSUZULTM4MjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4MjApIC0gRXJsYW5nOiBEZXRlY3QgT1RQID49IDE4IHRvIHVzZSBuZXcgdGltZSBjb3JyZWN0aW9uCistIFtUSFJJRlQtMzgxNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzgxNikgLSBSZWR1Y2UgZG9ja2VyIGJ1aWxkIGR1cmF0aW9uIG9uIFRyYXZpcy1DSQorLSBbVEhSSUZULTM4MTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4MTUpIC0gUHV0IGFwcHZleW9yIGRlcGVuZGVuY3kgdmVyc2lvbnMgdG8gb25lIHBsYWNlCistIFtUSFJJRlQtMzc4OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc4OCkgLSBDb21wYXRpYmlsaXR5IGltcHJvdmVtZW50cyBhbmQgV2luNjQgc3VwcG9ydAorLSBbVEhSSUZULTM3OTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3OTIpIC0gVGltZW91dHMgZm9yIGFub255bW91cyBwaXBlcyBzaG91bGQgYmUgY29uZmlndXJhYmxlCistIFtUSFJJRlQtMzc5NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc5NCkgLSBTcGxpdCBEZWxwaGkgYXBwbGljYXRpb24sIHByb3RvY29sIGFuZCB0cmFuc3BvcnQgZXhjZXB0aW9uIHN1YnR5cGVzIGludG8gc2VwYXJhdGUgZXhjZXB0aW9ucworLSBbVEhSSUZULTM3NzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NzQpIC0gVGhlIGdlbmVyYXRlZCBjb2RlIHNob3VsZCBoYXZlIGV4Y2VwdGlvbl9uYW1lcyBtZXRhIGluZm8KKy0gW1RIUklGVC0zNzYyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzYyKSAtIEZpeCBidWlsZCB3YXJuaW5ncyBmb3IgZGVwcmVjYXRlZCBUaHJpZnQgImJ5dGUiIGZpZWxkcworLSBbVEhSSUZULTM3NTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NTYpIC0gSW1wcm92ZSByZXF1aXJlZG5lc3MgZG9jdW1lbnRhdGlvbgorLSBbVEhSSUZULTM3NjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3NjEpIC0gQWRkIGRlYmlhbiBwYWNrYWdlIGZvciBQeXRob24zCistIFtUSFJJRlQtMzc0Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzc0MikgLSBoYXhlIHBocCBjbGkgc3VwcG9ydAorLSBbVEhSSUZULTM3MzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM3MzMpIC0gU29ja2V0IHRpbWVvdXQgaW1wcm92ZW1lbnRzCistIFtUSFJJRlQtMzcyOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzcyOCkgLSBodHRwIHRyYW5zcG9ydCBmb3IgdGhyaWZ0LWx1YQorLSBbVEhSSUZULTM5MDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5MDUpIC0gRGFydCBjb21waWxlciBkb2VzIG5vdCBpbml0aWFsaXplIGJvb2wsIGludCwgYW5kIGRvdWJsZSBwcm9wZXJ0aWVzCistIFtUSFJJRlQtMzkxMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkxMSkgLSBMb29zZW4gUnVieSBkZXYgZGVwZW5kZW5jeSB2ZXJzaW9uIHJlcXVpcmVtZW50cworLSBbVEhSSUZULTM5MDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5MDYpIC0gUnVuIEMjIHRlc3RzIHdpdGggbWFrZSBjaGVjaworLSBbVEhSSUZULTM5MDBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5MDApIC0gQWRkIFB5dGhvbiBTU0wgZmxhZ3MKKy0gW1RIUklGVC0zODk3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODk3KSAtIFByb3ZpZGUgbWVhbmluZ2Z1bCBleGNlcHRpb24gdHlwZSBiYXNlZCBvbiBXZWJFeGNlcHRpb25TdGF0dXMgaW4gY2FzZSBvZiB0aW1lb3V0CistIFtUSFJJRlQtMzgwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzgwOCkgLSBNaXNzaW5nIGBET1VCTEVgIGluIHRocmlmdCB0eXBlIGVudW1lcmF0aW9uCistIFtUSFJJRlQtMzgwM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzgwMykgLSBSZW1vdmUgImZpbGUiIGF0dHJpYnV0ZSBmcm9tIFhNTCBnZW5lcmF0b3IKKy0gW1RIUklGVC0zNjYwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjYwKSAtIEFkZCBWNCBtYXBwZWQgYWRkcmVzcyB0byB0ZXN0IGNsaWVudCBjZXJ0J3MgYWx0bmFtZQorLSBbVEhSSUZULTM2NjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NjEpIC0gVXNlIGh0dHBzIHRvIGRvd25sb2FkIG1lY2sgaW4gZXJsYW5nIHRlc3QgYnVpbGQKKy0gW1RIUklGVC0zNjU5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjU5KSAtIENoZWNrIGNvbmZpZ3VyZSByZXN1bHQgb2YgQ01ha2Ugb24gQ0kKKy0gW1RIUklGVC0zNjY3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjY3KSAtIEFkZCBUTFMgU05JIHN1cHBvcnQgdG8gY2xpZW50cworLSBbVEhSSUZULTM2NTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NTEpIC0gTWFrZSBiYWNrcG9ydHMubWF0Y2hfaG9zdG5hbWUgYW5kIGlwYWRkcmVzcyBvcHRpb25hbAorLSBbVEhSSUZULTM2NjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NjYpIC0gQnVpbGQgRCB0dXRvcmlhbCBhcyBwYXJ0IG9mIEF1dG90b29scyBidWlsZAorLSBbVEhSSUZULTM2NjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NjUpIC0gQWRkIEQgbGliZXZlbnQgYW5kIE9wZW5TU0wgdG8gZG9ja2VyIGltYWdlcworLSBbVEhSSUZULTM2NjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NjQpIC0gUmVtb3ZlIG1kNS5jCistIFtUSFJJRlQtMzY2Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzY2MikgLSBBZGQgSGFza2VsbCB0byBkZWJpYW4gZG9ja2VyIGltYWdlCistIFtUSFJJRlQtMzcxMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzcxMSkgLSBBZGQgRCB0byBjcm9zcyBsYW5ndWFnZSB0ZXN0CistIFtUSFJJRlQtMzY5MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzY5MSkgLSBSdW4gZmxha2U4IFB5dGhvbiBzdHlsZSBjaGVjayBvbiBUcmF2aXMtQ0kKKy0gW1RIUklGVC0zNjkyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjkyKSAtIChSZSllbmFibGUgQXBwdmV5b3IgQysrIGFuZCBQeXRob24gYnVpbGQKKy0gW1RIUklGVC0zNjc3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjc3KSAtIEltcHJvdmUgQ01ha2UgSmF2YSBidWlsZAorLSBbVEhSSUZULTM2NzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NzkpIC0gQWRkIHN0ZG91dCBsb2cgdG8gdGVzdEJpbmFyeSBpbiBKYXZhIHRlc3Qgc2VydmVyCistIFtUSFJJRlQtMzcxOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzcxOCkgLSBSZWR1Y2Ugc2l6ZSBvZiBkb2NrZXIgaW1hZ2UgZm9yIGJ1aWxkIGVudmlyb25tZW50CistIFtUSFJJRlQtMzY5OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzY5OCkgLSBbVHJhdmlzLUNJXSBJbnRyb2R1Y2UgcmV0cnkgdG8gYXB0IGNvbW1hbmRzCistIFtUSFJJRlQtMzEyN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzEyNykgLSBzd2l0Y2ggLXJlY3Vyc2UgdG8gLS1yZWN1cnNlIGFuZCByZXNlcnZlIC1yCistIFtUSFJJRlQtMzA4N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA4NykgLSBQYXNzIG9uIGVycm9ycyBsaWtlICJjb25uZWN0aW9uIGNsb3NlZCIKKy0gW1RIUklGVC0zMjQwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjQwKSAtIFRocmlmdCBQeXRob24gY2xpZW50IHNob3VsZCBzdXBwb3J0IHN1YmplY3RBbHROYW1lIGFuZCB3aWxkY2FyZCBjZXJ0cyBpbiBUU1NMU29ja2V0CistIFtUSFJJRlQtMzIxM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIxMykgLSBtYWtlIGNyb3NzIHNob3VsZCBpbmRpY2F0ZSB3aGVuIGl0IHNraXBzIGEga25vd24gZmFpbGluZyB0ZXN0CistIFtUSFJJRlQtMzIwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIwOCkgLSBGaXggVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBidWlsZCBmYWlsdXJlIGR1ZSB0byBtaXNzaW5nIHNvdXJjZQorLSBbVEhSSUZULTMxODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxODYpIC0gQWRkIFRTZXJ2ZXJIVFRQIHRvIEdvIGxpYnJhcnkKKy0gW1RIUklGVC0yMzQyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzQyKSAtIEFkZCBfX0ZJTEVfXyBhbmQgX19MSU5FX18gdG8gVGhyaWZ0IEMrKyBleGNwZXRpb25zCistIFtUSFJJRlQtMzM3Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM3MikgLSBBZGQgZGFydCBnZW5lcmF0b3IgdG8gVmlzdWFsIFN0dWRpbyBwcm9qZWN0CistIFtUSFJJRlQtMzM2Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM2NikgLSBUaHJpZnRUZXN0IHRvIGltcGxlbWVudCBzdGFuZGFyZCByZXR1cm4gdmFsdWVzIAorLSBbVEhSSUZULTM0MDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MDIpIC0gUHJvdmlkZSBhIHBlcmwgVW5peCBTb2NrZXQgaW1wbGVtZW50YXRpb24KKy0gW1RIUklGVC0zMzYxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzYxKSAtIEltcHJvdmUgQyMgbGlicmFyeQorLSBbVEhSSUZULTMzOTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzOTMpIC0gSW50cm9kdWNlIGk4IHRvIHByb3ZpZGUgY29uc2lzdGVudCBzZXQgb2YgVGhyaWZ0IElETCBpbnRlZ2VyIHR5cGVzCistIFtUSFJJRlQtMzMzOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzMzOSkgLSBTdXBwb3J0IGZvciBkYXRhYmFzZS9zcWwKKy0gW1RIUklGVC0zNTY1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTY1KSAtIEMrKzogVFtBc3luY11Qcm9jZXNzb3I6OmdldEV2ZW50SGFuZGxlcigpIHNob3VsZCBiZSBkZWNsYXJlZCBhcyBjb25zdCBtZW1iZXIgZnVuY3Rpb25zCistIFtUSFJJRlQtMzU2M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU2MykgLSBDKysvUXQ6IHJlbW92ZWQgdXNhZ2Ugb2YgbWFjcm8gUVRfUFJFUEVORF9OQU1FU1BBQ0UgYXMgaXQgaXNuJ3QgY29uc2VxdWVudGx5IHVzZWQgZm9yIGFsbCByZWZlcmVuY2VzIHRvIFF0IHR5cGVzLgorLSBbVEhSSUZULTM1NjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1NjIpIC0gUmVtb3ZlZCB1bnVzZWQgVEFzeW5jUHJvY2Vzc29yOjpnZXRBc3luY1NlcnZlcigpCistIFtUSFJJRlQtMzU2MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU2MSkgLSBDKysvUXQ6IG1ha2UgdXNlIG9mIFFfRElTQUJMRV9DT1BZKCkgdG8gZ2V0IHJpZCBvZiBjb3B5IGN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IKKy0gW1RIUklGVC0zNTU2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTU2KSAtIGNfZ2xpYiBmaWxlIGRlc2NyaXB0b3IgdHJhbnNwb3J0CistIFtUSFJJRlQtMzU0NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU0NCkgLSBNYWtlIGNyb3NzIHRlc3QgZmFpbCB3aGVuIHNlcnZlciBwcm9jZXNzIGRpZWQgdW5leHBlY3RlZGx5CistIFtUSFJJRlQtMzU0MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU0MCkgLSBNYWtlIHB5dGhvbiB0dXRvcmlhbCBtb3JlIGluIGxpbmUgd2l0aCBQRVA4CistIFtUSFJJRlQtMzUzNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzUzNSkgLSBEYXJ0IGdlbmVyYXRvciBhcmd1bWVudCB0byBwcm9kdWNlIGEgZmlsZSBzdHJ1Y3R1cmUgdXNhYmxlIGluIHBhcmVudCBsaWJyYXJ5CistIFtUSFJJRlQtMzUwNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzUwNSkgLSBFbmhhbmNlIFB5dGhvbiBUU1NMU29ja2V0CistIFtUSFJJRlQtMzUwNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzUwNikgLSBFbGltaW5hdGUgb2xkIHN0eWxlIGNsYXNzZXMgZnJvbSBsaWJyYXJ5IGNvZGUKKy0gW1RIUklGVC0zNTAzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTAzKSAtIEVuYWJsZSBweTp1dGY4c3RyaW5nIGJ5IGRlZmF1bHQKKy0gW1RIUklGVC0zNDk5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDk5KSAtIEFkZCBwYWNrYWdlX3ByZWZpeCB0byBweXRob24gZ2VuZXJhdG9yCistIFtUSFJJRlQtMzQ5NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQ5NSkgLSBNaW5vciBlbmhhbmNlbWVudHMgYW5kIGZpeGVzIGZvciBjcm9zcyB0ZXN0CistIFtUSFJJRlQtMzQ4Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQ4NikgLSBKYXZhIGdlbmVyYXRlZCBgZ2V0RmllbGRWYWx1ZWAgaXMgaW5jb21wYXRpYmxlIHdpdGggYHNldEZpZWxkVmFsdWVgIGZvciBiaW5hcnkgdmFsdWVzLgorLSBbVEhSSUZULTM0ODRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0ODQpIC0gQ29uc29saWRhdGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgaW4gSmF2YSdzIFRDb21wYWN0UHJvdG9jb2wKKy0gW1RIUklGVC0zNTE2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTE2KSAtIEFkZCBmZWF0dXJlIHRlc3QgZm9yIFRIZWFkZXIgVEJpbmFyeVByb3RvY29sIGludGVyb3AKKy0gW1RIUklGVC0zNTE1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTE1KSAtIFB5dGhvbiAyLjYgY29tcGF0aWJpbGl0eSBhbmQgdGVzdCBvbiBDSQorLSBbVEhSSUZULTM1MTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1MTQpIC0gUEhQIDcgY29tcGF0aWJsZSB2ZXJzaW9uIG9mIGJpbmFyeSBwcm90b2NvbAorLSBbVEhSSUZULTM0NjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NjkpIC0gRG9ja2VyOiBEZWJpYW4gc3VwcG9ydAorLSBbVEhSSUZULTM0MTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MTYpIC0gUmV0aXJlIG9sZCAieHh4X25hbWVzcGFjZSIgZGVjbGFyYXRpb25zIGZyb20gdGhlIElETAorLSBbVEhSSUZULTM0MjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MjYpIC0gQWxpZ24gYXV0b2dlbiBjb21tZW50IGluIFhTRAorLSBbVEhSSUZULTM0MjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MjQpIC0gQWRkIENNYWtlIGFuZHJvaWQgYnVpbGQgb3B0aW9uCistIFtUSFJJRlQtMzQzOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQzOSkgLSBSdW4gbWFrZSBjcm9zcyB1c2luZyBQeXRob24zIHdoZW4gYXZhaWxhYmxlCistIFtUSFJJRlQtMzQ0MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQ0MCkgLSBQeXRob24gbWFrZSBjaGVjayB0YWtlcyB0b28gbXVjaCB0aW1lCistIFtUSFJJRlQtMzQ0MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQ0MSkgLSBTdGFiaWxpemUgVHJhdmlzLUNJIGJ1aWxkcworLSBbVEhSSUZULTM0MzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MzEpIC0gQXZvaWQgInNjaGVtZXMiIEhhc2hNYXAgbG9va3VwcyBkdXJpbmcgc3RydWN0IHJlYWRzL3dyaXRlcworLSBbVEhSSUZULTM0MzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MzIpIC0gQWRkIGEgVEJ5dGVCdWZmZXIgdHJhbnNwb3J0IHRvIHRoZSBKYXZhIGxpYnJhcnkKKy0gW1RIUklGVC0zNDM4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDM4KSAtIEVuYWJsZSBweTpuZXdfc3R5bGUgYnkgZGVmYXVsdAorLSBbVEhSSUZULTM0MDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0MDUpIC0gR28gVEh0dHBDbGllbnQgbWlzdXNlcyBodHRwLkNsaWVudCBvYmplY3RzCistIFtUSFJJRlQtMzYxNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzYxNCkgLSBJbXByb3ZlIGxvZ2dpbmcgb2YgdGVzdF9zc2xzb2NrZXQucHkKKy0gW1RIUklGVC0zNjQ3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjQ3KSAtIEZpeCBwaHAgZXh0ZW5zaW9uIGJ1aWxkIHdhcm5pbmdzCistIFtUSFJJRlQtMzY0Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzY0MikgLSBTcGVlZCB1cCBjcm9zcyB0ZXN0IHJ1bm5lcgorLSBbVEhSSUZULTM2MzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2MzcpIC0gSW1wbGVtZW50IGNvbXBhY3QgcHJvdG9jb2wgZm9yIGRhcnQKKy0gW1RIUklGVC0zNjEzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjEzKSAtIFBvcnQgUHl0aG9uIEMgZXh0ZW5zaW9uIHRvIFB5dGhvbiAzCistIFtUSFJJRlQtMzYxMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzYxMikgLSBBZGQgUHl0aG9uIEMgZXh0ZW5zaW9uIGZvciBjb21wYWN0IHByb3RvY29sCistIFtUSFJJRlQtMzYxMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzYxMSkgLSBBZGQgLS1yZWdleCBmaWx0ZXIgdG8gY3Jvc3MgdGVzdCBydW5uZXIKKy0gW1RIUklGVC0zNjMxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjMxKSAtIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIEx1YQorLSBbVEhSSUZULTM2MDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2MDkpIC0gUmVtb3ZlIG9yIHJlcGxhY2UgVGVzdFBvcnRGaXh0dXJlLmgKKy0gW1RIUklGVC0zNjA1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjA1KSAtIEhhdmUgdGhlIGNvbXBpbGVyIGNvbXBsYWluIGFib3V0IGludmFsaWQgYXJndW1lbnRzIGFuZCBvcHRpb25zCistIFtUSFJJRlQtMzU5Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU5NikgLSBCZXR0ZXIgY29uZm9ybWFuY2UgdG8gUEVQOAorLSBbVEhSSUZULTM1ODVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1ODUpIC0gQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgTHVhCistIFtUSFJJRlQtMzU4Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzU4MikgLSBFcmxhbmcgbGlicmFyaWVzIHNob3VsZCBoYXZlIHNlcnZpY2UgbWV0YWRhdGEKKy0gW1RIUklGVC0zNTc5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTc5KSAtIEludHJvZHVjZSByZXRyeSB0byBtYWtlIGNyb3NzCistIFtUSFJJRlQtMzMwNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzMwNikgLSBKYXZhOiBUQmluYXJ5UHJvdG9jb2w6IFVzZSAxIHRlbXAgYnVmZmVyIGluc3RlYWQgb2YgYWxsb2NhdGluZyA4CistIFtUSFJJRlQtMzkxMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkxMCkgLSBEbyBub3QgaW52b2tlIHBpcCBhcyBwYXJ0IG9mIGJ1aWxkIHByb2Nlc3MKKy0gW1RIUklGVC0xODU3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODU3KSAtIFB5dGhvbiAzLlggU3VwcG9ydAorLSBbVEhSSUZULTE5NDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5NDQpIC0gQmluZGluZyB0byB6ZXJvIHBvcnQKKy0gW1RIUklGVC0zOTU0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zOTU0KSAtIEVuYWJsZSB0aGUgdXNhZ2Ugb2Ygc3RydWN0cyBjYWxsZWQgIk9iamVjdCIgaW4gSmF2YQorLSBbVEhSSUZULTM5ODFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5ODEpIC0gRW5hYmxlIGFuYWx5emVyIHN0cm9uZyBtb2RlIGluIERhcnQgbGlicmFyeQorLSBbVEhSSUZULTM5OThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM5OTgpIC0gRG9jdW1lbnQgYWJpbGl0eSB0byBhZGQgY3VzdG9tIHRhZ3MgdG8gdGhyaWZ0IHN0cnVjdHMKKy0gW1RIUklGVC00MDA2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MDA2KSAtIEFkZCBhIHJlbW92ZUV2ZW50TGlzdGVuZXIgbWV0aG9kIG9uIFRTb2NrZXQKKworIyMjIE5ldyBGZWF0dXJlCistIFtUSFJJRlQtNjQwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC02NDApIC0gU3VwcG9ydCBkZXByZWNhdGlvbgorLSBbVEhSSUZULTk0OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTQ4KSAtIFNTTCBzb2NrZXQgc3VwcG9ydCBmb3IgUEhQCistIFtUSFJJRlQtNzY0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC03NjQpIC0gYWRkIFN1cHBvcnQgZm9yIFZhbGEgbGFuZ3VhZ2UKKy0gW1RIUklGVC0zMDQ2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDQ2KSAtIEFsbG93IFBTUjQgY2xhc3MgbG9hZGluZyBmb3IgZ2VuZXJhdGVkIGNsYXNzZXMgKFBIUCkKKy0gW1RIUklGVC0yMTEzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTEzKSAtIEVybGFuZyBTU0wgU29ja2V0IFN1cHBvcnQKKy0gW1RIUklGVC0xNDgyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDgyKSAtIFVuaXggZG9tYWluIHNvY2tldCBzdXBwb3J0IHVuZGVyIFBIUAorLSBbVEhSSUZULTUxOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNTE5KSAtIFN1cHBvcnQgY29sbGVjdGlvbnMgb2YgdHlwZXMgd2l0aG91dCBoYXZpbmcgdG8gZXhwbGljaXRseSBkZWZpbmUgaXQKKy0gW1RIUklGVC00NjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2OCkgLSBSYWNrIE1pZGRsZXdhcmUgQXBwbGljYXRpb24gZm9yIFJhaWxzCistIFtUSFJJRlQtMTcwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTcwOCkgLSBBZGQgZXZlbnQgaGFuZGxlcnMgZm9yIHByb2Nlc3NvciBldmVudHMKKy0gW1RIUklGVC0zODM0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODM0KSAtIEVybGFuZyBuYW1lc3BhY2luZyBhbmQgZXhjZXB0aW9uIG1ldGFkYXRhCistIFtUSFJJRlQtMjUxMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjUxMCkgLSBJbXBsZW1lbnQgVE5vbmJsb2NraW5nU2VydmVyJ3MgYWJpbGl0eSB0byBsaXN0ZW4gb24gdW5peCBkb21haW4gc29ja2V0cworLSBbVEhSSUZULTMzOTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzOTcpIC0gSW1wbGVtZW50IFRQcm9jZXNzb3JGYWN0b3J5IGluIEMjIHRvIGVuYWJsZSBwZXItY2xpZW50IHByb2Nlc3NvcnMKKy0gW1RIUklGVC0zNTIzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTIzKSAtIFhNTCBHZW5lcmF0b3IKKy0gW1RIUklGVC0zNTEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTEwKSAtIEFkZCBIdHRwVGFza0FzeW5jSGFuZGxlciBpbXBsZW1lbnRhdGlvbgorLSBbVEhSSUZULTMzMThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzMTgpIC0gUEhQOiBTaW1wbGVKU09OUHJvdG9jb2wgSW1wbGVtZW50YXRpb24KKy0gW1RIUklGVC0zMjk5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjk5KSAtIERhcnQgbGFuZ3VhZ2UgYmluZGluZ3MgaW4gVGhyaWZ0CistIFtUSFJJRlQtMjgzNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgzNSkgLSBBZGQgcG9zc2liaWxpdHkgdG8gZGlzdHJpYnV0ZSBnZW5lcmF0b3JzIHNlcGFyYXRlbHkgZnJvbSB0aHJpZnQgY29yZSwgYW5kIGxvYWQgdGhlbSBkeW5hbWljYWxseQorLSBbVEhSSUZULTE4NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTg0KSAtIEFkZCBPU0dpIE1hbmlmZXN0IGhlYWRlcnMgdG8gdGhlIGxpYnRocmlmdCBqYXZhIGxpYnJhcnkgdG8gYmUgYWJsZSB0byB1c2UgVGhyaWZ0IGluIHRoZSBPU0dpIHJ1bnRpbWUKKy0gW1RIUklGVC0xNDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0MSkgLSBJZiBhIHJlcXVpcmVkIGZpZWxkIGlzIG5vdCBwcmVzZW50IG9uIHNlcmlhbGl6YXRpb24sIHRocm93IGFuIGV4Y2VwdGlvbgorLSBbVEhSSUZULTE4OTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4OTEpIC0gQWRkIFdpbmRvd3MgQUxQQyB0cmFuc3BvcnQgd2hpY2ggaXMgcmlnaHQgY291bnRlcnBhcnQgb2YgVW5peCBkb21haW4gc29ja2V0cworCisjIyMgUXVlc3Rpb24KKy0gW1RIUklGVC0xODA4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODA4KSAtIFRoZSBUaHJpZnQgc3RydWN0IHNob3VsZCBiZSBjb25zaWRlcmVkIHNlbGYtY29udGFpbmVkPworLSBbVEhSSUZULTI4OTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4OTUpIC0gVHV0b3JpYWwgY3BwCistIFtUSFJJRlQtMzg2MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzg2MCkgLSBFbGVwaGFudC1iaXJkIGFwcGxpY2F0aW9uIFRlc3QgZmFpbHMgZm9yIFRocmlmdAorLSBbVEhSSUZULTM4MTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4MTEpIC0gSFRUUFMgU3VwcG9ydCBmb3IgQysrIGFwcGxpY2F0aW9ucworLSBbVEhSSUZULTM1MDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1MDkpIC0gIm1ha2UgY2hlY2siIGVycm9yCisKKyMjIyBTdG9yeQorLSBbVEhSSUZULTM0NTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NTIpIC0gLnRyYXZpcy55bWw6IE1pZ3JhdGluZyBmcm9tIGxlZ2FjeSB0byBjb250YWluZXItYmFzZWQgaW5mcmFzdHJ1Y3R1cmUKKworIyMjIFN1Yi10YXNrCistIFtUSFJJRlQtMTgxMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTgxMSkgLSBydWJ5IHR1dG9yaWFsIGFzIHBhcnQgb2YgdGhlIHJlZ3VsYXIgYnVpbGQKKy0gW1RIUklGVC0yNzc5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNzc5KSAtIFBIUCBUSlNPTlByb3RvY29sIGVuY29kZSB1bmljb2RlIGludG8gVUNTLTRMRSB3aGljaCBjYW4ndCBiZSBwYXJzZWQgYnkgb3RoZXIgbGFuZ3VhZ2UgYmluZGluZ3MKKy0gW1RIUklGVC0yMTEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTEwKSAtIEVybGFuZzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKy0gW1RIUklGVC0zODUyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zODUyKSAtIEEgVHJhdmlzLUNJIGpvYiBmYWlscyB3aXRoICJ3cml0ZSBlcnJvciIKKy0gW1RIUklGVC0zNzQwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzQwKSAtIEZpeCBoYXhlbGliLmpzb24gY2xhc3NwYXRoIAorLSBbVEhSSUZULTM2NTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NTMpIC0gaW5jb3JyZWN0IHVuaW9uIHNlcmlhbGl6YXRpb24KKy0gW1RIUklGVC0zNjUyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjUyKSAtIGluY29ycmVjdCBzZXJpYWxpemF0aW9uIG9mIG9wdGlvbmFscworLSBbVEhSSUZULTM2NTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NTUpIC0gaW5jb3JyZWN0IHVuaW9uIHNlcmlhbGl6YXRpb24KKy0gW1RIUklGVC0zNjU0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjU0KSAtIGluY29ycmVjdCBzZXJpYWxpemF0aW9uIG9mIG9wdGlvbmFscworLSBbVEhSSUZULTM2NTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NTYpIC0gaW5jb3JyZWN0IHNlcmlhbGl6YXRpb24gb2Ygb3B0aW9uYWxzCistIFtUSFJJRlQtMzY5OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzY5OSkgLSBGaXggaW50ZWdlciBsaW1pdCBzeW1ib2wgaW5jbHVkZXMgaW4gUHl0aG9uIEMgZXh0ZW5zaW9uCistIFtUSFJJRlQtMzY5M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzY5MykgLSBGaXggaW5jbHVkZSBpc3N1ZSBpbiBDKysgVFNTTFNvY2tldEludGVycnVwdFRlc3Qgb24gV2luZG93cworLSBbVEhSSUZULTM2OTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2OTQpIC0gW1dpbmRvd3NdIERpc2FibGUgdGVzdHMgb2YgYSBmZXcgc2VydmVycyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkCistIFtUSFJJRlQtMzY5Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzY5NikgLSBJbnN0YWxsIHBpcCB0byBDZW50T1MgRG9ja2VyIGltYWdlcyB0byBmaXggUHl0aG9uIGJ1aWxkcworLSBbVEhSSUZULTM2MzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2MzgpIC0gRml4IGhheGVsaWIuanNvbgorLSBbVEhSSUZULTMyNTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyNTEpIC0gQWRkIGh0dHAgdHJhbnNwb3J0IGZvciBzZXJ2ZXIgdG8gR28gbGliCistIFtUSFJJRlQtMjQyNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQyNCkgLSBSZWN1cnNpdmUgVHlwZXMKKy0gW1RIUklGVC0yNDIzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDIzKSAtIFRIZWFkZXIKKy0gW1RIUklGVC0yNDEzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDEzKSAtIFB5dGhvbjogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCistIFtUSFJJRlQtMjQwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQwOSkgLSBKYXZhOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKy0gW1RIUklGVC0yNDEyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDEyKSAtIEQ6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorLSBbVEhSSUZULTI0MTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0MTEpIC0gQysrOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKy0gW1RIUklGVC0yNDEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDEwKSAtIEphdmFNZTogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCistIFtUSFJJRlQtMjY2OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjY2OCkgLSBUZXN0U3VpdGU6IGRldGFpbGVkIHJlc3VsdCBvbiBwYXNzZWQgdGVzdHMgYnkgZmVhdHVyZQorLSBbVEhSSUZULTI2NTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI2NTkpIC0gcHl0aG9uIFRlc3QgU2VydmVyIGZhaWxzIHdoZW4gdGhyb3dpbmcgVEV4Y2VwdGlvbgorLSBbVEhSSUZULTMzOThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzOTgpIC0gQWRkIENNYWtlIGJ1aWxkICBmb3IgSGFza2VsbCBsaWJyYXJ5IGFuZCB0ZXN0cworLSBbVEhSSUZULTMzOTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzOTYpIC0gREFSVDogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCistIFtUSFJJRlQtMzM2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM2NCkgLSAgIEZpeCBydWJ5IGJpbmFyeSBmaWVsZCBlbmNvZGluZyBpbiBUSlNPTlByb3RvY29sCistIFtUSFJJRlQtMzM4MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM4MSkgLSBGaXggZm9yIG1pc2MuIGNvZGVnZW4gaXNzdWVzIHdpdGggVEhSSUZULTI5MDUKKy0gW1RIUklGVC0zNTczXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTczKSAtIE5vIHJ1bGUgdG8gbWFrZSB0YXJnZXQgYC4uLy4uLy4uL3Rlc3QvY19nbGliL3NyYy8uZGVwcy90ZXN0dGhyaWZ0dGVzdC10aHJpZnRfdGVzdF9oYW5kbGVyLlBvJy4KKy0gW1RIUklGVC0zNTcyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTcyKSAtICJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiBhIHNpZ25lZCByaWdodCBzaGlmdCIKKy0gW1RIUklGVC0zNTQyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNTQyKSAtIEFkZCBsZW5ndGggbGltaXQgc3VwcG9ydCB0byBKYXZhIHRlc3Qgc2VydmVyCistIFtUSFJJRlQtMzUzN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzUzNykgLSBSZW1vdmUgdGhlIChub3cgb2Jzb2xldGUpIGNzaGFycDphc3luY2N0cCBmbGFnIAorLSBbVEhSSUZULTM1MzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1MzIpIC0gQWRkIGNvbmZpZ3VyYWJsZSBzdHJpbmcgYW5kIGNvbnRhaW5lciByZWFkIHNpemUgbGltaXQgdG8gUHl0aG9uIHByb3RvY29scworLSBbVEhSSUZULTM1MzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1MzEpIC0gQ3JlYXRlIGNyb3NzIGxhbmcgZmVhdHVyZSB0ZXN0IGZvciBzdHJpbmcgYW5kIGNvbnRhaW5lciByZWFkIGxlbmd0aCBsaW1pdAorLSBbVEhSSUZULTM0ODJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0ODIpIC0gSGFza2VsbCBKU09OIHByb3RvY29sIGRvZXMgbm90IGVuY29kZSBiaW5hcnkgZmllbGQgYXMgQmFzZTY0CistIFtUSFJJRlQtMzQyNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQyNSkgLSBNaW5vciBmaXhlcyArIHNpbXBsaWZpY2F0aW9uIGZvciBDZW50T1MgRG9ja2VyZmlsZQorLSBbVEhSSUZULTM0NDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NDIpIC0gUnVuIENNYWtlIHRlc3RzIG9uIEFwcHZleW9yCistIFtUSFJJRlQtMzQwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQwOSkgLSBOb2RlSlMgYmluYXJ5IGZpZWxkIGlzc3VlcworLSBbVEhSSUZULTM2MjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2MjEpIC0gRml4IGxpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QuY3BwIHRvIHVzZSBlcGhlbWVyYWwgcG9ydHMKKy0gW1RIUklGVC0zNjI4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjI4KSAtIEZpeCBsaWIvY3BwL3Rlc3QvVFNlcnZlckludGVncmF0aW9uVGVzdC5jcHAgdG8gdXNlIGVwaGVtZXJhbCBwb3J0cworLSBbVEhSSUZULTM2MjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2MjUpIC0gS2lsbCB1bnVzZWQgI2luY2x1ZGUgIlRlc3RQb3J0Rml4dHVyZS5oIiBpbiBsaWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwLgorLSBbVEhSSUZULTM2NDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM2NDYpIC0gRml4IFB5dGhvbiBleHRlbnNpb24gYnVpbGQgd2FybmluZ3MKKy0gW1RIUklGVC0zNjI2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjI2KSAtIEZpeCBsaWIvY3BwL3Rlc3QvVFNvY2tldEludGVycnVwdFRlc3QuY3BwIHRvIHVzZSBlcGhlbWVyYWwgcG9ydHMuCistIFtUSFJJRlQtMzYyNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzYyNCkgLSBGaXggbGliL2NwcC90ZXN0L1RTZXJ2ZXJTb2NrZXRUZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzCistIFtUSFJJRlQtMzYyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzYyMykgLSBGaXggRml4IGNwcC9saWIvdGVzdC9UU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgdG8gdXNlIGVwaGVtZXJhbCBwb3J0cworLSBbVEhSSUZULTM1OTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1OTIpIC0gQWRkIGJhc2ljIHRlc3QgY2xpZW50CistIFtUSFJJRlQtMzk4MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzk4MCkgLSBhZGQgVEV4dGVuZGVkQmluYXJ5UHJvdG9jb2wuamF2YQorCisjIyMgVGFzaworLSBbVEhSSUZULTE4MDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4MDEpIC0gU3luYyB1cCBUQXBwbGljYXRpb25FeGNlcHRpb24gY29kZXMgYWNyb3NzIGxhbmd1YWdlcyBhbmQgdGhyaWZ0IGltcGxlbWVudGF0aW9ucworLSBbVEhSSUZULTEyNTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyNTkpIC0gQXV0b21hdGUgdmVyc2lvbmluZyAKKworIyMjIFRlc3QKKy0gW1RIUklGVC0zNDAwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNDAwKSAtIEFkZCBFcmxhbmcgdG8gY3Jvc3MgdGVzdAorLSBbVEhSSUZULTM1MDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM1MDQpIC0gRml4IEZhc3RiaW5hcnlUZXN0LnB5CisKKyMjIyBXaXNoCistIFtUSFJJRlQtMzkyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzkyMykgLSBNYXliZSByZW1vdmUgQWVyZW8gZnJvbSB0aGUgIlBvd2VyZWQgYnkiIGxpc3QKKy0gW1RIUklGVC0yMTQ5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTQ5KSAtIEFkZCBhbiBvcHRpb24gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IG9wZXJhdG9ycworCisjIyAwLjkuMy4xCisKK1JlbGVhc2VkIE1hcmNoIDEzLCAyMDE5IHRvIGJhY2twb3J0IGEgQ1ZFIGZpeCB0byB0aGUgcG9wdWxhciAwLjkuMyByZWxlYXNlLgorCisjIyMgQnVnCistIFtUSFJJRlQtNDUwNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDUwNikgLSBDVkUtMjAxOC0xMzIwIGZvciBKYXZhIFNBU0wgYmFja3BvcnRlZCBmcm9tIDAuMTIuMAorCisjIyAwLjkuMworCisjIyMgQnVnCistIFtUSFJJRlQtMjQ0MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQ0MSkgLSBDYW5ub3Qgc2h1dGRvd24gVFRocmVhZGVkU2VydmVyIHdoZW4gY2xpZW50cyBhcmUgc3RpbGwgY29ubmVjdGVkCistIFtUSFJJRlQtMjQ2NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQ2NSkgLSBUQmluYXJ5UHJvdG9jb2xUIGJyZWFrcyBpZiBjb3BpZWQvbW92ZWQKKy0gW1RIUklGVC0yNDc0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDc0KSAtIHRocmlmdC5oIGNhdXNlcyBhIGNvbXBpbGUgZmFpbHVyZQorLSBbVEhSSUZULTI1NDBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1NDApIC0gUnVubmluZyBjb25maWd1cmUgZnJvbSBvdXRzaWRlIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGZhaWxzCistIFtUSFJJRlQtMjU5OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjU5OCkgLSBBZGQgY2hlY2sgZm9yIG1pbmltdW0gR28gdmVyc2lvbiB0byBjb25maWd1cmUuYWMKKy0gW1RIUklGVC0yNjQ3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNjQ3KSAtIGNvbXBpbGVyLWhzOiBkb24ndCBkZWNhcGl0YWxpemUgZmllbGQgbmFtZXMsIGRvIGRlY2FwaXRhbGl6ZSBhcmd1bWVudCBiaW5kaW5ncworLSBbVEhSSUZULTI3NzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI3NzMpIC0gR2VuZXJhdGVkIEphdmEgY29kZSBmb3IgJ29uZXdheScgbWV0aG9kcyBpcyBpbmNvcnJlY3QuCistIFtUSFJJRlQtMjc4OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjc4OSkgLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgbGVha3Mgc29ja2V0IEZEJ3MgdW5kZXIgbG9hZAorLSBbVEhSSUZULTI2ODJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI2ODIpIC0gVFRocmVhZGVkU2VydmVyIGxlYWtzIHBlci10aHJlYWQgbWVtb3J5CistIFtUSFJJRlQtMjY3NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjY3NCkgLSBKYXZhU2NyaXB0OiBkZWNsYXJlIEFjY2VwdDogYW5kIENvbnRlbnQtVHlwZTogaW4gcmVxdWVzdAorLSBbVEhSSUZULTMwNzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwNzgpIC0gVE5vbmJsb2NraW5nU2VydmVyU29ja2V0J3MgbG9nZ2VyIGlzIG5vdCBuYW1lZCBhZnRlciBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQKKy0gW1RIUklGVC0zMDc3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDc3KSAtIEMrKyBURmlsZVRyYW5zcG9ydCBpZ25vcmVzIHJldHVybiBjb2RlIGZyb20gZnRydW5jYXRlCistIFtUSFJJRlQtMzA2N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA2NykgLSBDKysgY3BwY2hlY2sgcGVyZm9ybWFuY2UgcmVsYXRlZCB3YXJuaW5ncworLSBbVEhSSUZULTMwNjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwNjYpIC0gQysrIFREZW5zZVByb3RvY29sIGFzc2VydCBtb2RpZmllcyBpbnN0ZWFkIG9mIGNoZWNrcworLSBbVEhSSUZULTMwNzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwNzEpIC0gYm9vdHN0cmFwLnNoIG9uIFVidW50dSAxMi4wNCAoUHJlY2lzZSkgYXV0b21ha2UgZXJyb3IKKy0gW1RIUklGVC0zMDY5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDY5KSAtIEMrKyBUU2VydmVyU29ja2V0IGxlYWtzIHNvY2tldCBvbiBmY250bCBnZXQgb3Igc2V0IGZsYWdzIGVycm9yCistIFtUSFJJRlQtMzA3OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA3OSkgLSBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQncyBsb2dnZXIgaXMgbm90IG5hbWVkIGFmdGVyIFROb25ibG9ja2luZ1NlcnZlclNvY2tldAorLSBbVEhSSUZULTMwODBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwODApIC0gQysrIFROb25ibG9ja2luZ1NlcnZlciBjb25uZWN0aW9uIGxlYWsgd2hpbGUgYWNjZXB0IGh1Z2UgbnVtYmVyIGNvbm5lY3Rpb25zLgorLSBbVEhSSUZULTMwODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwODYpIC0gQysrIFZhbGdyaW5kIEVycm9yIENsZWFudXAKKy0gW1RIUklGVC0zMDg1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDg1KSAtIHRocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50IG5ldmVyIHRyeSB0byByZWNvbm5lY3QKKy0gW1RIUklGVC0zMTIzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTIzKSAtIE1pc3NpbmcgaW5jbHVkZSBpbiBjb21waWxlci9jcHAvc3JjL21haW4uaCBicmVha3MgYnVpbGQgaW4gc29tZSBlbnZpcm9ubWVudHMKKy0gW1RIUklGVC0zMTI1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTI1KSAtIEZpeCB0aGUgbGlzdCBvZiBleHBvcnRlZCBoZWFkZXJzIGluIGF1dG9tYWtlIGlucHV0CistIFtUSFJJRlQtMzEyNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzEyNikgLSBQSFAgSlNPTiBzZXJpYWxpemVyIGNvbnZlcnRzIGVtcHR5IG9yIGludC1pbmRleGVkIG1hcHMgdG8gbGlzdHMKKy0gW1RIUklGVC0zMTMyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTMyKSAtIFByb3Blcmx5IGZvcm1hdCBkYXRlIGluIEphdmEgQEdlbmVyYXRlZCBhbm5vdGF0aW9ucworLSBbVEhSSUZULTMxMzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxMzcpIC0gVHJhdmlzIGJ1aWxkIGhhbmdzIGFmdGVyIGZhaWx1cmUKKy0gW1RIUklGVC0zMTM4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTM4KSAtICJtYWtlIGNoZWNrIiBwYXJhbGxlbCBleGVjdXRpb24gaXMgdW5kZXJtaW5pc3RpYworLSBbVEhSSUZULTMxMzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxMzkpIC0gSlMgbGlicmFyeSB0ZXN0IGlzIGZsYWt5CistIFtUSFJJRlQtMzE0MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzE0MCkgLSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlzIHRocm93biBieSBKYXZhU2NyaXB0IHRlc3Qgc2VydmVyCistIFtUSFJJRlQtMzEyNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzEyNCkgLSBTb21lIHNpZ25lZC91bnNpZ25lZCB3YXJuaW5ncyB3aGlsZSBidWlsZGluZyBjb21waWxlcgorLSBbVEhSSUZULTMxMjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxMjgpIC0gR28gZ2VuZXJhdGVkIGNvZGUgcHJvZHVjZXMgbmFtZSBjb2xsaXNpb25zIGJldHdlZW4gc2VydmljZXMKKy0gW1RIUklGVC0zMTQ2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTQ2KSAtIEdyYXBodml6IGdlbmVyYXRlcyBmdW5jdGlvbiBuYW1lIGNvbGxpc2lvbnMgYmV0d2VlbiBzZXJ2aWNlcworLSBbVEhSSUZULTMxNDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxNDcpIC0gU2VnZmF1bHQgd2hpbGUgcmVjZWl2aW5nIGRhdGEKKy0gW1RIUklGVC0zMTQ4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTQ4KSAtIE1hcmtkb3duIGxpbmtzIHRvIGNvZGluZ19zdGFuZGFyZHMgYXJlIGRlYWQKKy0gW1RIUklGVC0zMDkwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDkwKSAtIGNtYWtlIGJ1aWxkIGlzIGJyb2tlbiBvbiBNYWNPU1gKKy0gW1RIUklGVC0zMDk3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDk3KSAtIGNtYWtlIHRhcmdldHMgdW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBvcHRpb25hbCBsaWJyYXJpZXMKKy0gW1RIUklGVC0zMDk0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDk0KSAtIG1hc3RlciBhcyBvZiAyMDE1LUFQUi0xMyBmYWlscyAtREJPT1NUX1RIUkVBRFMgY21ha2UgYnVpbGQKKy0gW1RIUklGVC0zMDk5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDk5KSAtIGNtYWtlIGJ1aWxkIGlzIGJyb2tlbiBvbiBGcmVlQlNECistIFtUSFJJRlQtMzA4OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA4OSkgLSBBc3NpZ25pbmcgZGVmYXVsdCBFTlVNIHZhbHVlcyByZXN1bHRzIGluIG5vbi1jb21waWxhYmxlIGphdmEgY29kZSBpZiBqYXZhIG5hbWVzcGFjZSBpcyBub3QgZGVmaW5lZAorLSBbVEhSSUZULTMwOTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwOTMpIC0gbWluZ3cgY29tcGlsZSBmaXhlcyBmb3IgYysrIGxpYnJhcnkgMC45LjIKKy0gW1RIUklGVC0zMDk4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDk4KSAtIFRocmlmdCBkb2VzIG5vdCBwcmV0dHkgcHJpbnQgYmluYXJ5IHR5cGVkZWZzIHRoZSB3YXkgaXQgZG9lcyBiaW5hcnkgZmllbGRzCistIFtUSFJJRlQtMzA5MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA5MSkgLSBjX2dsaWIgc2VydmljZSBtZXRob2Qgc2hvdWxkIHJldHVybiByZXN1bHQgZnJvbSBoYW5kbGVyIG1ldGhvZAorLSBbVEhSSUZULTMwODhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwODgpIC0gVFRocmVhZFBvb2xTZXJ2ZXIgd2l0aCBTYXNsIGF1dGggbWF5IGxlYWsgQ0xPU0VfV0FJVCBzb2NrZXQKKy0gW1RIUklGVC0zMTA5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTA5KSAtIENyb3NzIHRlc3QgbG9nIGZpbGUgY2Fubm90IGJlIGJyb3dzZWQgd2hlbiBzZXJ2ZWQgaW4gSFRUUCBzZXJ2ZXIKKy0gW1RIUklGVC0zMTEzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTEzKSAtIG00IEMrKzExIG1hY3JvIGlzc3VlCistIFtUSFJJRlQtMzEwNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzEwNSkgLSBDKysgbGlidGhyaWZ0bmIgbGlicmFyeSBvbiBXaW5kb3dzIGJ1aWxkIGZhaWx1cmUKKy0gW1RIUklGVC0zMTE1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTE1KSAtIFVuY29tcGlsZWFibGUgY29kZSBkdWUgdG8gbmFtZSBjb2xsaXNpb24gd2l0aCBwcmVkZWZpbmVkIHVzZWQgdHlwZXMKKy0gW1RIUklGVC0zMTE3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTE3KSAtIEphdmEgVFNTTFRyYW5zcG9ydEZhY3RvcnkgY2FuJ3QgbG9hZCBjZXJ0aWZpY2F0ZXMgd2l0aGluIEpBUiBhcmNoaXZlCistIFtUSFJJRlQtMzEwMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzEwMikgLSBjb3VsZCBub3QgbWFrZSBjaGVjayBmb3IgR28gTGlicmFyeQorLSBbVEhSSUZULTMxMjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxMjApIC0gTWlub3Igc3BlbGxpbmcgZXJyb3JzIGFuZCBhbiBvdXRkYXRlZCBVUkwKKy0gW1RIUklGVC0zMTIxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTIxKSAtIExpYnJ0IGRvZXMgbm90IGV4aXN0IG9uIE9TIFgKKy0gW1RIUklGVC0zMTUyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTUyKSAtIENvbXBpbGVyIGVycm9yIG9uIE1hYyBPU1ggKG1pc3NpbmcgI2luY2x1ZGUgPGNzdGRsaWI+KQorLSBbVEhSSUZULTMxNjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxNjIpIC0gbWFrZSBmYWlscyBmb3IgZG1kIDIuMDY3CistIFtUSFJJRlQtMzE2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzE2NCkgLSBUaHJpZnQgQysrIGxpYnJhcnkgU1NMIHNvY2tldCBieSBkZWZhdWx0IGFsbG93cyBmb3IgdW5zZWN1cmUgU1NMdjMgbmVnb3RpYXRpb24KKy0gW1RIUklGVC0zMTY4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTY4KSAtIEZpeCBNYXZlbiBQT00KKy0gW1RIUklGVC0zMTcwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTcwKSAtIEluaXRpYWxpc20gY29kZSBpbiB0aGUgR28gY29tcGlsZXIgY2F1c2VzIGNoYW9zCistIFtUSFJJRlQtMzE2OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzE2OSkgLSBEbyBub3QgZXhwb3J0IHRocmlmdC5UZXN0U3RydWN0IGFuZCB0aHJpZnQuVGVzdEVudW0gaW4gdGhyaWZ0IEdvIGxpYnJhcnkgCistIFtUSFJJRlQtMzE5MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzE5MSkgLSBQZXJsIGNvbXBpbGVyIGRvZXMgbm90IGFkZCBzdXBwb3J0IGZvciB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBoYW5kbGluZworLSBbVEhSSUZULTMxNzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxNzgpIC0gZ2xpYiBDIGRvZXMgbm90IGNvbXBpbGUKKy0gW1RIUklGVC0zMTg5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTg5KSAtIFBlcmwgU2VydmVyU29ja2V0IHNob3VsZCBhbGxvdyBhIHNwZWNpZmljIGludGVyZmFjZSB0byBiZSBsaXN0ZW5lZCB0bworLSBbVEhSSUZULTMyNTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyNTIpIC0gTWlzc2luZyBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmggaW4gY3BwIE1ha2VmaWxlLCBzbyBkb2Vzbid0IGluc3RhbGwKKy0gW1RIUklGVC0zMjU1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjU1KSAtIFRocmlmdCBnZW5lcmF0b3IgZG9lc24ndCBleGNsdWRlICdwYWNrYWdlJyBrZXl3b3JkIGZvciB0aHJpZnQgcHJvcGVydHkgbmFtZXMgYnJlYWtpbmcgamF2YSBidWlsZHMKKy0gW1RIUklGVC0zMjYwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjYwKSAtIG11bHRpcGxlIHdhcm5pbmdzIGluIGNfZ2xpYiB0dXRvcmlhbAorLSBbVEhSSUZULTMyNTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyNTYpIC0gU29tZSBEIHRlc3QgdGltaW5ncyBhcmUgdG9vIGFnZ3Jlc3NpdmUgZm9yIHNsb3cgbWFjaGluZXMKKy0gW1RIUklGVC0zMjU3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjU3KSAtIHdhcm5pbmc6IGV4dHJhIHRva2VucyBhdCBlbmQgb2YgI2VuZGlmIGRpcmVjdGl2ZQorLSBbVEhSSUZULTMxODRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxODQpIC0gVGhyaWZ0IEdvIGxlYXZlcyBmaWxlIGRlc2NyaXB0b3JzIG9wZW4KKy0gW1RIUklGVC0zMjAzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjAzKSAtIERPQVAgLSBwbGVhc2UgZml4ICJPY2FtbCIgPT4gIk9DYW1sIgorLSBbVEhSSUZULTMyMTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyMTApIC0gKHVuY29tcGlsZWFibGUpIGNvZGUgZ2VuZXJhdGVkIGZvciBzZXJ2ZXIgZXZlbnRzIHdoaWxlIGFyZSBldmVudHMgbm90IGVuYWJsZWQKKy0gW1RIUklGVC0zMjE1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjE1KSAtIFRKU09OUHJvdG9jb2wgJyhjKyspIHVzZXMgInRocm93IG5ldyIgdG8gdGhyb3cgZXhjZXB0aW9ucyBpbnN0ZWFkIG9mICJ0aHJvdyIKKy0gW1RIUklGVC0zMjAyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjAyKSAtIEFsbG93IEhTSEFTZXJ2ZXIgdG8gY29uZmlndXJlIG1pbiBhbmQgbWF4IHdvcmtlciB0aHJlYWRzIHNlcGFyYXRlbHkuCistIFtUSFJJRlQtMzIwNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIwNSkgLSBUQ29tcGFjdFByb3RvY29sIHJldHVybiBhIHdyb25nIGVycm9yIHdoZW4gdGhlIGlvLkVPRiBoYXBwZW5zCistIFtUSFJJRlQtMzIwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIwOSkgLSBMR1BMIG1lbnRpb25lZCBpbiBsaWNlbnNlIGZpbGUKKy0gW1RIUklGVC0zMTk3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTk3KSAtIGtlZXBBbGl2ZVRpbWUgaXMgaGFyZCBjb2RlZCBhcyA2MCBzZWMgaW4gVFRocmVhZFBvb2xTZXJ2ZXIKKy0gW1RIUklGVC0zMTk2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTk2KSAtIE1pc3NwZWxsaW5nIGluIGx1YSBUQmluYXJ5UHJvdG9jb2wgKHN0aXJjdFdyaXRlID0+IHN0cmljdFdyaXRlKQorLSBbVEhSSUZULTMxOThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxOTgpIC0gQWxsb3cgY29uc3RydWN0aW9uIG9mIFRUcmFuc3BvcnRGYWN0b3J5IHdpdGggYSBzcGVjaWZpZWQgbWF4TGVuZ3RoCistIFtUSFJJRlQtMzE5Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzE5MikgLSBHbyBpbXBvcnQgcGF0aHMgY2hhbmdlZCBpbiAxLjQsIGFuZCBleHBpcmVkIEp1bmUgMQorLSBbVEhSSUZULTMyNzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyNzEpIC0gQ291bGQgbm90IGZpbmQgb3IgbG9hZCBtYWluIGNsYXNzIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEgb24gc29tZSBub24tZW5nbGlzaCBzeXN0ZW1zCistIFtUSFJJRlQtMzI3M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzI3MykgLSBjX2dsaWI6IEdlbmVyYXRlZCBjb2RlIHRyaWVzIHRvIGNvbnZlcnQgYmV0d2VlbiBmdW5jdGlvbiBhbmQgdm9pZCBwb2ludGVycworLSBbVEhSSUZULTMyNjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyNjQpIC0gRml4IEVybGFuZyAxNiBuYW1lc3BhY2VkIHR5cGVzCistIFtUSFJJRlQtMzI3MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzI3MCkgLSByZXVzaW5nIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24gY2F1c2UgZGlydHkgVFNvY2tldAorLSBbVEhSSUZULTMyNjddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyNjcpIC0gY19nbGliOiAiQ3JpdGljYWwiIGZhaWx1cmUgZHVyaW5nIHVuaXQgdGVzdHMKKy0gW1RIUklGVC0zMjc3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjc3KSAtIFRIdHRwQ2xpZW50IGxlYWtzIGNvbm5lY3Rpb25zIGlmIGl0J3MgdXNlZCBmb3IgbXVsdGlwbGUgcmVxdWVzdHMKKy0gW1RIUklGVC0zMjc4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjc4KSAtIE5vZGVKUzogRml4IGV4Y2VwdGlvbiBzdGFjayB0cmFjZXMgYW5kIG5hbWVzCistIFtUSFJJRlQtMzI3OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzI3OSkgLSBGaXggYSBidWcgaW4gcmV0cnlfbWF4X2RlbGF5IChOb2RlSlMpCistIFtUSFJJRlQtMzI4MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzI4MCkgLSBJbml0aWFsaXplIHJldHJ5IHZhcmlhYmxlcyBvbiBjb25zdHJ1Y3Rpb24KKy0gW1RIUklGVC0zMjgzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjgzKSAtIGNfZ2xpYjogVHV0b3JpYWwgc2VydmVyIGFsd2F5cyBleGl0cyB3aXRoIHdhcm5pbmcKKy0gW1RIUklGVC0zMjg0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjg0KSAtIGNfZ2xpYjogRW1wdHkgc2VydmljZSBwcm9kdWNlcyB1bnVzZWQtdmFyaWFibGUgd2FybmluZworLSBbVEhSSUZULTE5MjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5MjUpIC0gY19nbGliIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IGNvbXBpbGUKKy0gW1RIUklGVC0xODQ5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODQ5KSAtIGFmdGVyIHRyYW5zcG9ydC0+b3BlbigpIG9wZW5zIGlzT3BlbiByZXR1cm5zIHRydWUgYW5kIG5leHQgb3BlbigpIGdvZXMgdGhydSB3aGVuIGl0IHNoYWxsIG5vdAorLSBbVEhSSUZULTE4NjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4NjYpIC0gamF2YSBjb21waWxlciBnZW5lcmF0ZXMgbm9uLWNvbXBpbGluZyBjb2RlIHdpdGggY29uc3QncyBkZWZpbmVkIGluIGEgdGhyaWZ0IHdoZW4gbmFtZSBpbmNsdWRlcyBub24taWRlbnRpZmllciBjaGFycworLSBbVEhSSUZULTE5MzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5MzgpIC0gRnVuY3Rpb25SdW5uZXIuaCAtLSB1c2VzIHdyb25nIHBhdGggZm9yIFRocmVhZC5oIHdoZW4gaW5zdGFsbGVkCistIFtUSFJJRlQtMTg0NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTg0NCkgLSBQYXNzd29yZCBzdHJpbmcgbm90IGNsZWFyZWQKKy0gW1RIUklGVC0yMDA0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDA0KSAtIFRocmlmdDo6VW5pb24gdmlvbGF0ZXMgOj09IG1ldGhvZCBjb250cmFjdCBhbmQgY3Jhc2hlcworLSBbVEhSSUZULTIwNzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwNzMpIC0gVGhyaWZ0IEMrKyBUSHR0cENsaWVudCBlcnJvcjogY2Fubm90IHJlZmlsbCBidWZmZXIKKy0gW1RIUklGVC0yMTI3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTI3KSAtIEF1dG9jb25mIHNjcmlwdGluZyBkb2VzIG5vdCBwcm9wZXJseSBhY2NvdW50IGZvciBjcm9zcy1jb21waWxlCistIFtUSFJJRlQtMjE4MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjE4MCkgLSBJbnRlZ2VyIHR5cGVzIGlzc3VlcyBpbiBDb2NvYSBsaWIgb24gQVJNNjQKKy0gW1RIUklGVC0yMTg5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTg5KSAtIEdvIG5lZWRzICJpc3NldCIgdG8gZnVsbHkgc3VwcG9ydCAidW5pb24iIHR5cGUgKGFuZCBvcHRpb25hbHMpCistIFtUSFJJRlQtMjE5Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjE5MikgLSBhdXRvdG9vbHMgb24gUmVkaGF0IGJhc2VkIHN5c3RlbXMKKy0gW1RIUklGVC0yNTQ2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTQ2KSAtIGNyb3NzIGxhbmd1YWdlIHRlc3RzIGZhaWxzIGF0ICdUZXN0TXVsdGlFeGNlcHRpb24nIHdoZW4gdXNpbmcgbm9kZWpzIHNlcnZlcgorLSBbVEhSSUZULTI1NDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1NDcpIC0gbm9kZWpzIHNlcnZlcnMgYW5kIGNsaWVudHMgZmFpbHMgdG8gY29ubmVjdCB3aXRoIGNwcCB1c2luZyBjb21wYWN0IHByb3RvY29sCistIFtUSFJJRlQtMjU0OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjU0OCkgLSBOb2RlanMgc2VydmVycyBhbmQgY2xpZW50cyBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IHdpdGggIC1zc2wKKy0gW1RIUklGVC0xNDcxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDcxKSAtIHRvU3RyaW5nKCkgZG9lcyBub3QgcHJpbnQgQnl0ZUJ1ZmZlciB2YWx1ZXMgd2hlbiBuZXN0ZWQgaW4gYSBMaXN0CistIFtUSFJJRlQtMTIwMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTIwMSkgLSBnZXRhZGRyaW5mbyByZXNvdXJjZSBsZWFrCistIFtUSFJJRlQtNjE1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC02MTUpIC0gVFRocmVhZFBvb2xTZXJ2ZXIgZG9lc24ndCBjYWxsIHRhc2tfZG9uZSBhZnRlciBwdWxsaW5nIHRhc2tzIGZyb20gaXQncyBjbGllbnRzIHF1ZXVlCistIFtUSFJJRlQtMTYyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjIpIC0gVGhyaWZ0IHN0cnVjdHVyZXMgYXJlIHVuaGFzaGFibGUsIHByZXZlbnRpbmcgdGhlbSBmcm9tIGJlaW5nIHVzZWQgYXMgc2V0IGVsZW1lbnRzCistIFtUSFJJRlQtODEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC04MTApIC0gQ3Jhc2hlZCBjbGllbnQgb24gVFNvY2tldDo6Y2xvc2UgdW5kZXIgbG9hZHMKKy0gW1RIUklGVC01NTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTU1NykgLSBjaGFyc2V0IHByb2JsZW0gd2l0aCBmaWxlIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0CistIFtUSFJJRlQtMjMzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzMpIC0gSURMIGRvZXNuJ3Qgc3VwcG9ydCBuZWdhdGl2ZSBoZXggbGl0ZXJhbHMKKy0gW1RIUklGVC0xNjQ5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjQ5KSAtIGNvbnRyaWIvemVyb21xIGRvZXMgbm90IGJ1aWxkIGluIDAuOC4wCistIFtUSFJJRlQtMTY0Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTY0MikgLSBNaXNjYWxjdWxhdGlvbiBsZWFkIHRvIHRocm93IHVuZXhwZWN0ZWQgIlRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCIob3IgY2FsbGVkICJFQUdBSU4gKHRpbWVkIG91dCkiKSBleGNlcHRpb24KKy0gW1RIUklGVC0xNTg3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTg3KSAtIFRTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0IGVycm9yCistIFtUSFJJRlQtMTI0OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTI0OCkgLSBwb2ludGVyIHN1YnRyYWN0aW9uIGluIFRNZW1vcnlCdWZmZXIgcmVsaWVzIG9uIHVuZGVmaW5lZCBiZWhhdmlvcgorLSBbVEhSSUZULTE3NzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3NzQpIC0gU2FzbCBUcmFuc3BvcnQgY2xpZW50IHdvdWxkIGhhbmcgd2hlbiB0cnlpbmcgdG8gY29ubmVjdCBub24tc2FzbCB0cmFuc3BvcnQgc2VydmVyCistIFtUSFJJRlQtMTc1NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc1NCkgLSBSYW5nZUVycm9yIGluIGJ1ZmZlciBoYW5kbGluZworLSBbVEhSSUZULTE2MThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2MTgpIC0gc3RhdGljIHN0cnVjdE1hcCBpbiBGaWVsZE1ldGFEYXRhIGlzIG5vdCB0aHJlYWQgc2FmZSBhbmQgY2FuIGxlYWQgdG8gZGVhZGxvY2tzCistIFtUSFJJRlQtMjMzNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjMzNSkgLSB0aHJpZnQgaW5jb21wYXRpYmlsaXR5IHdpdGggcHk6dG9ybmFkbyBhcyBzZXJ2ZXIsIGphdmEgYXMgY2xpZW50CistIFtUSFJJRlQtMjgwM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgwMykgLSBUQ1BfREVGRVJfQUNDRVBUIG5vdCBzdXBwb3J0ZWQgd2l0aCBkb21haW4gc29ja2V0cworLSBbVEhSSUZULTI3OTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI3OTkpIC0gQnVpbGQgUHJvYmxlbShzKTogbGQ6IGxpYnJhcnkgbm90IGZvdW5kIGZvciAtbDpsaWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKKy0gW1RIUklGVC0yODAxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODAxKSAtIEMrKyB0ZXN0IHN1aXRlIGNvbXBpbGF0aW9uIHdhcm5pbmdzCistIFtUSFJJRlQtMjgwMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgwMikgLSBDKysgdHV0b3JpYWwgY29tcGlsYXRpb24gd2FybmluZ3MKKy0gW1RIUklGVC0yNzk1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNzk1KSAtIHRocmlmdF9iaW5hcnlfcHJvdG9jb2wuYzogJ2RlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcycKKy0gW1RIUklGVC0yODE3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODE3KSAtIFRTaW1wbGVKU09OUHJvdG9jb2wgcmVhZHMgYmV5b25kIGVuZCBvZiBtZXNzYWdlCistIFtUSFJJRlQtMjgyNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgyNikgLSBodG1sOnN0YW5kYWxvbmUgc29tZXRpbWVzIGlnbm9yZWQKKy0gW1RIUklGVC0yODI5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODI5KSAtIFN1cHBvcnQgaGF4ZWxpYiBpbnN0YWxsYXRpb24gdmlhIGdpdGh1YgorLSBbVEhSSUZULTI4MjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4MjgpIC0gc2xpZ2h0bHkgd3JvbmcgaGVscCBzY3JlZW4gaW5kZW50CistIFtUSFJJRlQtMjgzMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgzMSkgLSBSZW1vdmVzIGRlYWQgY29kZSBpbiB3ZWJfc2VydmVyLmpzIGludHJvZHVjZWQgaW4gVEhSSUZULTI4MTkKKy0gW1RIUklGVC0yODIzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODIzKSAtIEFsbCBKUy10ZXN0cyBhcmUgZmFpbGluZyB3aGVuIHJ1biB3aXRoIGdydW50IHRlc3QKKy0gW1RIUklGVC0yODI3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODI3KSAtIFRocmlmdCAwLjkuMiBmYWlscyB0byBjb21waWxlIG9uIFlvc2VtaXRlIGR1ZSB0byB0cjEvZnVuY3Rpb25hbCBpbmNsdWRlIGluIFByb2Nlc3NvclRlc3QuY3BwCistIFtUSFJJRlQtMjg0M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg0MykgLSBBdXRvbWFrZSBjb25maWd1cmUuYWMgaGFzIHBvc3NpYmxlIHR5cG8gcmVsYXRlZCB0byBKYXZhCistIFtUSFJJRlQtMjgxM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgxMykgLSBtdWx0aXBsZSBoYXhlIGxpYnJhcnkgZml4ZXMvaW1wcm92ZW1lbnRzCistIFtUSFJJRlQtMjgyNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgyNSkgLSBTdXBwbHlpbmcgdW5pY29kZSB0byBweXRob24gVGhyaWZ0IGNsaWVudCBjYW4gY2F1c2UgbmV4dCByZXF1ZXN0IGFyZ3VtZW50cyB0byBnZXQgb3ZlcndyaXR0ZW4KKy0gW1RIUklGVC0yODQwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODQwKSAtIENhYmFsIGZpbGUgcG9pbnRzIHRvIExJQ0VOU0UgZmlsZSBvdXRzaWRlIHRoZSBwYXRoIG9mIHRoZSBIYXNrZWxsIHByb2plY3QuCistIFtUSFJJRlQtMjgxOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgxOCkgLSBUcmFpbGluZyBjb21tYXMgaW4gYXJyYXkKKy0gW1RIUklGVC0yODMwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODMwKSAtIENsZWFuIHVwIGFudCB3YXJuaW5ncyBpbiB0dXRvcmlhbCBkaXIKKy0gW1RIUklGVC0yODQyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODQyKSAtIEVybGFuZyB0aHJpZnQgY2xpZW50IGhhcyBpbmZpbml0ZSB0aW1lb3V0CistIFtUSFJJRlQtMjgxMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgxMCkgLSBEbyBub3QgbGVhdmUgdGhlIHVuZGVybHlpbmcgU2VydmVyU29ja2V0IG9wZW4gaWYgY29uc3RydWN0aW9uIG9mIFRTZXJ2ZXJTb2NrZXQgZmFpbHMKKy0gW1RIUklGVC0yODEyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODEyKSAtIEdvIHNlcnZlciBhZGRpbmcgcmVkdW5kYW50IGJ1ZmZlcmluZyBsYXllcgorLSBbVEhSSUZULTI4MzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4MzkpIC0gVEZyYW1lZFRyYW5zcG9ydCByZWFkIGJ1ZworLSBbVEhSSUZULTI4NDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4NDQpIC0gTm9kZWpzIHN1cHBvcnQgYnJva2VuIHdoZW4gcnVubmluZyB1bmRlciBCcm93c2VyaWZ5CistIFtUSFJJRlQtMjgxNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgxNCkgLSBhcmdzL3Jlc3VsdCBjbGFzc2VzIG5vdCBmb3VuZCB3aGVuIG5vIG5hbWVzcGFjZSBpcyBzZXQKKy0gW1RIUklGVC0yODQ3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODQ3KSAtIGZ1bmN0aW9uIElmVmFsdWUoKSBpcyBhIGR1cGxpY2F0ZSBvZiBTeXN0ZW0uU3RyVXRpbHMuSWZUaGVuCistIFtUSFJJRlQtMjg0OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg0OCkgLSBjZXJ0YWluIERlbHBoaSB0ZXN0cyBkbyBub3QgYnVpbGQgaWYgVHlwZVJlZ2lzdHJ5IGlzIHVzZWQKKy0gW1RIUklGVC0yODU0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODU0KSAtIEdvIFN0cnVjdCB3cml0ZXIgYW5kIHJlYWRlciBsb29zZXMgaW1wb3J0YW50IGVycm9yIGluZm9ybWF0aW9uCistIFtUSFJJRlQtMjg1OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg1OCkgLSBFbmFibGUgaGVhZGVyIGZpZWxkIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2ggaW4gVEh0dHBTZXJ2ZXIKKy0gW1RIUklGVC0yODU3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODU3KSAtIEMjIGdlbmVyYXRvciBjcmVhdGVzIHVuY29tcGlsYWJsZSBjb2RlIGZvciBzdHJ1Y3QgY29uc3RhbnRzCistIFtUSFJJRlQtMjg2MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg2MCkgLSBEZWxwaGkgc2VydmVyIGNsb3NlcyBjb25uZWN0aW9uIG9uIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucworLSBbVEhSSUZULTI4NjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4NjgpIC0gRW5oYW5jZSBlcnJvciBoYW5kbGluZyBpbiB0aGUgR28gY2xpZW50IAorLSBbVEhSSUZULTI4NzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4NzkpIC0gVE1lbW9yeUJ1ZmZlcjogdXNpbmcgbHVhIHN0cmluZyBpbiB3cm9uZyB3YXkKKy0gW1RIUklGVC0yODUxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODUxKSAtIFJlbW92ZSBzdHJhbmdlIHB1YmxpYyBQZWVrKCkgZnJvbSBHbyB0cmFuc3BvcnRzCistIFtUSFJJRlQtMjg1Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg1MikgLSBCZXR0ZXIgT3Blbi9Jc09wZW4vQ2xvc2UgYmVoYXZpb3IgZm9yIFN0cmVhbVRyYW5zcG9ydC4KKy0gW1RIUklGVC0yODcxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODcxKSAtIE1pc3Npbmcgc2VtaWNvbG9uIGluIHRocmlmdC5qcworLSBbVEhSSUZULTI4NzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4NzIpIC0gVGhyZWFkTWFuYWdlciBkZWFkbG9jayBmb3IgdGFzayBleHBpcmF0aW9uCistIFtUSFJJRlQtMjg4MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg4MSkgLSBIYW5kbGUgZXJyb3JzIGZyb20gQWNjZXB0KCkgY29ycmVjdGx5CistIFtUSFJJRlQtMjg0OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg0OSkgLSBTcGVsbCBlcnJvcnMgcmVwb3J0ZWQgYnkgY29kZXNwZWxsIHRvb2wKKy0gW1RIUklGVC0yODcwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODcwKSAtIEMrKyBUSlNPTlByb3RvY29sIHVzaW5nIGxvY2FsZSBkZXBlbmRlbnQgZm9ybWF0dGluZworLSBbVEhSSUZULTI4ODJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4ODIpIC0gTHVhIEdlbmVyYXRvcjogdXNpbmcgc3RyaW5nLmxlbiBmdW50aW9uIHRvIGdldCBzdHJ1Y3QobWFwLGxpc3Qsc2V0KSBzaXplCistIFtUSFJJRlQtMjg2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg2NCkgLSBKU09OIGdlbmVyYXRvciBtaXNzaW5nIGZyb20gVmlzdWFsIFN0dWRpbyBidWlsZCBwcm9qZWN0IAorLSBbVEhSSUZULTI4NzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4NzgpIC0gR28gdmFsaWRhdGlvbiBzdXBwb3J0IG9mIHJlcXVpcmVkIGZpZWxkcworLSBbVEhSSUZULTI4NzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4NzMpIC0gVFBpcGUgYW5kIFRQaXBlU2VydmVyIGRvbid0IGNvbXBpbGUgb24gV2luZG93cyB3aXRoIFVOSUNPREUgZW5hYmxlZAorLSBbVEhSSUZULTI4ODhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4ODgpIC0gaW1wb3J0IG9mIDxsaW1pdHM+IGlzIG1pc3NpbmcgaW4gSlNPTiBnZW5lcmF0b3IKKy0gW1RIUklGVC0yOTAwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTAwKSAtIFB5dGhvbiBUSHR0cENsaWVudCBkb2VzIG5vdCByZXNldCBzb2NrZXQgdGltZW91dCBvbiBleGNlcHRpb24KKy0gW1RIUklGVC0yOTA3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTA3KSAtICdudG9obGwnIG1hY3JvIHJlZGVmaW5lZAorLSBbVEhSSUZULTI4ODRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4ODQpIC0gTWFwIGRvZXMgbm90IHNlcmlhbGl6ZSBjb3JyZWN0bHkgZm9yIEpTT04gcHJvdG9jb2wgaW4gR28gbGlicmFyeQorLSBbVEhSSUZULTI4ODddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4ODcpIC0gLS13aXRoLW9wZW5zc2wgY29uZmlndXJlIGZsYWcgaXMgaWdub3JlZAorLSBbVEhSSUZULTI4OTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4OTQpIC0gUEhQIGpzb24gc2VyaWFsaXplciBza2lwcyBtYXBzIHdpdGggaW50L2Jvb2wga2V5cworLSBbVEhSSUZULTI5MDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MDQpIC0ganNvbl9wcm90b2NvbF90ZXN0LmdvIGZhaWxzCistIFtUSFJJRlQtMjkwNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjkwNikgLSBsaWJyYXJ5IG5vdCBmb3VuZCBmb3IgLWw6bGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hCistIFtUSFJJRlQtMjg5MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg5MCkgLSBiaW5hcnkgZGF0YSBtYXkgbG9zZSBieXRlcyB3aXRoIEpTT04gdHJhbnNwb3J0IHVuZGVyIHNwZWNpZmljIGNpcmN1bXN0YW5jZXMKKy0gW1RIUklGVC0yODkxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODkxKSAtIGJpbmFyeSBkYXRhIG1heSBjYXVzZSBhIGZhaWx1cmUgd2l0aCBKU09OIHRyYW5zcG9ydCB1bmRlciBzcGVjaWZpYyBjaXJjdW1zdGFuY2VzCistIFtUSFJJRlQtMjkwMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjkwMSkgLSBGaXggZm9yIGdlbmVyYXRlZCBUeXBlU2NyaXB0IGZ1bmN0aW9ucyArIGluZGVudGF0aW9uIG9mIEphdmFTY3JpcHQgbWFwcworLSBbVEhSSUZULTI5MTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MTYpIC0gbWFrZSBjaGVjayBmYWlscyBmb3IgRCBsYW5ndWFnZQorLSBbVEhSSUZULTI5MThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MTgpIC0gUmFjZSBjb25kaXRpb24gaW4gUHl0aG9uIFRQcm9jZXNzUG9vbFNlcnZlciB0ZXN0CistIFtUSFJJRlQtMjkyMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjkyMCkgLSBFcmxhbmcgVGhyaWZ0IHRlc3QgdXNlcyB3cm9uZyBJREwgZmlsZQorLSBbVEhSSUZULTI5MjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MjIpIC0gJFRSSUFMIGlzIHVzZWQgd2l0aCBQeXRob24gdGVzdHMgYnV0IG5vdCB0ZXN0ZWQgYWNjb3JkaW5nbHkKKy0gW1RIUklGVC0yOTEyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTEyKSAtIEF1dG90b29sIGJ1aWxkIGZvciBDKysgUXQgbGlicmFyeSBpcyBpbnZhbGlkCistIFtUSFJJRlQtMjkxNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjkxNCkgLSBleHBsaWNpdCBkZXBlbmRlbmN5IHRvIEx1YTUuMiBmYWlscyBvbiBzb21lIHN5c3RlbXMKKy0gW1RIUklGVC0yOTEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTEwKSAtIGxpYmV2ZW50IGlzIG5vdCByZWFsbHkgb3B0aW9uYWwKKy0gW1RIUklGVC0yOTExXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTExKSAtIGZpeCBjKysgdmVyc2lvbiB6ZXJvbXEgdHJhbnNwb3J0LCB0aGUgb2xkIHZlcnNpb24gY2Fubm90IHdvcmsKKy0gW1RIUklGVC0yOTE1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTE1KSAtIEx1YSBnZW5lcmF0b3IgbWlzc2luZyBmcm9tIFZpc3VhbCBTdHVkaW8gYnVpbGQgcHJvamVjdAorLSBbVEhSSUZULTI5MTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MTcpIC0gIm1ha2UgY2xlYW4iIGJyZWFrcyB0ZXN0L2NfZ2xpYgorLSBbVEhSSUZULTI5MTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MTkpIC0gSGF4ZSB0ZXN0IHNlcnZlciB0aW1lb3V0IHRvbyBsYXJnZQorLSBbVEhSSUZULTI5MjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MjMpIC0gSmF2YVNjcmlwdCBjbGllbnQgYXNzdW1lcyBhIG1lc3NhZ2UgYmVpbmcgd3JpdHRlbgorLSBbVEhSSUZULTI5MjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MjQpIC0gVE5vbmJsb2NraW5nU2VydmVyIGNyYXNoZXMgd2hlbiB1c2VyLXByb3ZpZGVkIGV2ZW50X2Jhc2UgaXMgdXNlZAorLSBbVEhSSUZULTI5MjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MjUpIC0gQ01ha2UgYnVpbGQgZG9lcyBub3Qgd29yayB3aXRoIE9wZW5TU0wgbm9yIGFueXRoaW5nIGluc3RhbGxlZCBpbiBub24tc3lzdGVtIGxvY2F0aW9uCistIFtUSFJJRlQtMjkzMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjkzMSkgLSBBY2Nlc3MgdG8gdW5kZWNsYXJlZCBzdGF0aWMgcHJvcGVydHk6IFRocmlmdFxQcm90b2NvbFxUUHJvdG9jb2w6OiRUQklOQVJZUFJPVE9DT0xBQ0NFTEVSQVRFRAorLSBbVEhSSUZULTI4OTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4OTMpIC0gQ01ha2UgYnVpbGQgZmFpbHMgd2l0aCBib29zdCB0aHJlYWQgb3Igc3RkIHRocmVhZAorLSBbVEhSSUZULTI5MDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MDIpIC0gR2VuZXJhdGVkIGNfZ2xpYiBjb2RlIGRvZXMgbm90IGNvbXBpbGUgd2l0aCBjbGFuZworLSBbVEhSSUZULTI5MDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MDMpIC0gUXQ0IGxpYnJhcnkgYnVpbHQgd2l0aCBDTWFrZSBkb2VzIG5vdCB3b3JrCistIFtUSFJJRlQtMjk0Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjk0MikgLSBDU2hhcnAgZ2VuZXJhdGUgaW52YWxpZCBjb2RlIGZvciBwcm9wZXJ0eSBuYW1lZCByZWFkIG9yIHdyaXRlCistIFtUSFJJRlQtMjkzMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjkzMikgLSBOb2RlLmpzIFRocmlmdCBjb25uZWN0aW9uIGxpYnJhcmllcyB0aHJvdyBFeGNlcHRpb25zIGludG8gZXZlbnQgZW1pdHRlcgorLSBbVEhSSUZULTI5MzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MzMpIC0gdjAuOS4yOiBkb3VibGVzIGVuY29kZWQgaW4gbm9kZSB3aXRoIGNvbXBhY3QgcHJvdG9jb2wgY2Fubm90IGJlIGRlY29kZWQgYnkgcHl0aG9uCistIFtUSFJJRlQtMjkzNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjkzNCkgLSBjcmVhdGVTZXJ2ZXIgc2lnbmF0dXJlIG1pc21hdGNoCistIFtUSFJJRlQtMjk4MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjk4MSkgLSBJREwgd2l0aCBubyBuYW1lc3BhY2UgcHJvZHVjZXMgdW5wYXJzYWJsZSBQSFAKKy0gW1RIUklGVC0yOTk5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTk5KSAtIEFkZGl0aW9uIG9mIC5naXRhdHRyaWJ1dGVzIHRleHQgYXV0byBpbiBUSFJJRlQtMjcyNCBjYXVzZXMgbW9kaWZpZWQgZmlsZXMgb24gY2hlY2tvdXQKKy0gW1RIUklGVC0yOTQ5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTQ5KSAtIHR5cG8gaW4gY29tcGlsZXIvY3BwL1JFQURNRS5tZAorLSBbVEhSSUZULTI5NTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5NTcpIC0gd2FybmluZzogc291cmNlIGZpbGUgJXMgaXMgaW4gYSBzdWJkaXJlY3RvcnksIGJ1dCBvcHRpb24gJ3N1YmRpci1vYmplY3RzJyBpcyBkaXNhYmxlZAorLSBbVEhSSUZULTI5NTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5NTMpIC0gVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydCBpcyBub3QgU3RvcCgpYWJsZQorLSBbVEhSSUZULTI5NjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5NjIpIC0gRG9ja2VyIFRocmlmdCBlbnYgZm9yIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nCistIFtUSFJJRlQtMjk3MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjk3MSkgLSBDKysgdGVzdCBhbmQgdHV0b3JpYWwgcGFyYWxsZWwgYnVpbGQgaXMgdW5zdGFibGUKKy0gW1RIUklGVC0yOTcyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTcyKSAtIE1pc3NpbmcgYmFja3NsYXNoIGluIGxpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbQorLSBbVEhSSUZULTI5NTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5NTEpIC0gRml4IEVybGFuZyBuYW1lIGNvbmZsaWN0IHRlc3QKKy0gW1RIUklGVC0yOTU1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTU1KSAtIFVzaW5nIGxpc3Qgb2YgdHlwZWRlZnMgZG9lcyBub3QgY29tcGlsZSBvbiBHbworLSBbVEhSSUZULTI5NjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5NjApIC0gbmFtZXNwYWNlIHJlZ3Jlc3Npb24gZm9yIFJ1YnkKKy0gW1RIUklGVC0yOTU5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTU5KSAtIG5vZGVqczogZml4IGJpbmFyeSB1bml0IHRlc3RzCistIFtUSFJJRlQtMjk2Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjk2NikgLSBub2RlanM6IEZpeCBiYWQgcmVmZXJlbmNlcyB0byBUUHJvdG9jb2xFeGNlcHRpb24gYW5kIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUKKy0gW1RIUklGVC0yOTcwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTcwKSAtIGdydW50LWpzZG9jIGZhaWxzIGR1ZSB0byBkZXBlbmRlbmN5IGlzc3VlcworLSBbVEhSSUZULTMwMDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwMDEpIC0gQyMgRXF1YWxzIGZhaWxzIGZvciBiaW5hcnkgZmllbGRzIChieXRlW10pCistIFtUSFJJRlQtMzAwM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzAwMykgLSBNaXNzaW5nIExJQ0VOU0UgZmlsZSBwcmV2ZW50cyBwYWNrYWdlIGZyb20gYmVpbmcgaW5zdGFsbGVkCistIFtUSFJJRlQtMzAwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzAwOCkgLSBOb2RlLmpzIHNlcnZlciBkb2VzIG5vdCBmdWxseSBzdXBwb3J0IGV4Y2VwdGlvbgorLSBbVEhSSUZULTMwMDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwMDcpIC0gVHJhdmlzIGJ1aWxkIGlzIGJyb2tlbiBiZWNhdXNlIG9mIGRpcmVjdG9yeSBjb25mbGljdAorLSBbVEhSSUZULTMwMDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwMDkpIC0gVFNTTFNvY2tldCBkb2VzIG5vdCB1c2UgdGhlIGNvcnJlY3QgaG9zdG5hbWUgKGJyZWFrcyBjZXJ0aWZpY2F0ZSBjaGVja3MpCistIFtUSFJJRlQtMzAxMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzAxMSkgLSBDIyB0ZXN0IHNlcnZlciB0ZXN0RXhjZXB0aW9uKCkgbm90IGltcGxlbWVudGVkIGFjY29yZGluZyB0byBzcGVjcworLSBbVEhSSUZULTMwMTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwMTIpIC0gVGltaW5nIHByb2JsZW1zIGluIE5hbWVkUGlwZSBpbXBsZW1lbnRhdGlvbiBkdWUgdG8gdW5uZWNlc3Nhcnkgb3Blbi9jbG9zZQorLSBbVEhSSUZULTMwMTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwMTkpIC0gR29sYW5nIGdlbmVyYXRvciBtaXNzaW5nIGRvY3N0cmluZyBmb3Igc3RydWN0cworLSBbVEhSSUZULTMwMjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwMjEpIC0gU2VydmljZSByZW1vdGUgdG9vbCBkb2VzIG5vdCBpbXBvcnQgc3R1YiBwYWNrYWdlIHdpdGggcGFja2FnZSBwcmVmaXgKKy0gW1RIUklGVC0zMDI2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDI2KSAtIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBkb2VzIG5vdCBoYXZlIGEgY29uc3RydWN0b3IKKy0gW1RIUklGVC0zMDI4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDI4KSAtIFJlZ3Jlc3Npb24gY2F1c2VkIGJ5IFRIUklGVC0yMTgwCistIFtUSFJJRlQtMzAxN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzAxNykgLSBvcmRlciBvZiBtYXAga2V5L3ZhbHVlIHR5cGVzIGluY29ycmVjdCBmb3Igb25lIENUT1IKKy0gW1RIUklGVC0zMDIwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDIwKSAtIENhbm5vdCBjb21waWxlIHRocmlmdCBhcyBDKyswMworLSBbVEhSSUZULTMwMjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwMjQpIC0gVXNlci1BZ2VudCAiQmF0dGxlTmV0IiB1c2VkIGluIHNvbWUgVGhyaWZ0IGxpYnJhcnkgZmlsZXMKKy0gW1RIUklGVC0zMDQ3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDQ3KSAtIFVuZXZlbiBjYWxscyB0byBpbmRlbnRfdXAgYW5kIGluZGVudF9kb3duIGluIENvY29hIGdlbmVyYXRvcgorLSBbVEhSSUZULTMwNDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwNDgpIC0gTm9kZUpTIGRlY29kaW5nIG9mIEk2NCBpcyBpbmNvbnNpc3RlbnQgYWNyb3NzIHByb3RvY29scworLSBbVEhSSUZULTMwNDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwNDMpIC0gZ28gY29tcGlsZXIgZ2VuZXJhdG9yIHVzZXMgbm9uIEMrKzk4IGNvZGUKKy0gW1RIUklGVC0zMDQ0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDQ0KSAtIERvY2tlciBSRUFETUUubWQgcGF0aHMgdG8gRG9ja2VyZmlsZXMgYXJlIGluY29ycmVjdAorLSBbVEhSSUZULTMwNDBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwNDApIC0gYm93ZXIuanNvbiB3cm9uZyAibWFpbiIgcGF0aAorLSBbVEhSSUZULTMwNTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwNTEpIC0gR28gVGhyaWZ0IGdlbmVyYXRvciBjcmVhdGVzIGJhZCBnbyBjb2RlCistIFtUSFJJRlQtMzA1N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA1NykgLSBKYXZhIGNvbXBpbGVyIGJ1aWxkIGlzIGJyb2tlbgorLSBbVEhSSUZULTMwNjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwNjEpIC0gQysrIFRTU0xTb2NrZXQgc2h1dGRvd24gZGVsYXkvdnVsbmVyYWJpbGl0eQorLSBbVEhSSUZULTMwNjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwNjIpIC0gQysrIFRTZXJ2ZXJTb2NrZXQgaW52YWxpZCBwb3J0IG51bWJlciAob3ZlciA5OTk5OTkpIGNhdXNlcyBzdGFjayBjb3JydXB0aW9uCistIFtUSFJJRlQtMzA2NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA2NSkgLSBVcGRhdGUgbGlidGhyaWZ0IGRlcGVuZGVuY2llcyAoc2xmNGosIGh0dHBjb3JlLCBodHRwY2xpZW50KQorLSBbVEhSSUZULTMyNDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyNDQpIC0gVHlwZVNjcmlwdDogZml4IG5hbWVzcGFjZSBvZiBpbmNsdWRlZCB0eXBlcworLSBbVEhSSUZULTMyNDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyNDYpIC0gUmVkdWNlIHRoZSBudW1iZXIgb2YgdHJpdmlhbCB3YXJuaW5ncyBpbiBXaW5kb3dzIEMrKyBDTWFrZSBidWlsZHMKKy0gW1RIUklGVC0zMjI0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjI0KSAtIEZpeCBUTmFtZWRQaXBlU2VydmVyIHVucHJlZGljdGFibGUgYmVoYXZpb3Igb24gYWNjZXB0CistIFtUSFJJRlQtMzIzMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIzMCkgLSBQeXRob24gY29tcGlsZXIgZ2VuZXJhdGVzIHdyb25nIGNvZGUgaWYgdGhlcmUgaXMgZnVuY3Rpb24gdGhyb3dpbmcgYSB0eXBlZGVmIG9mIGV4Y2VwdGlvbiB3aXRoIGFub3RoZXIgbmFtZXNwYWNlCistIFtUSFJJRlQtMzIzNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIzNikgLSBNYXhTa2lwRGVwdGggbmV2ZXIgY2hlY2tlZAorLSBbVEhSSUZULTMyMzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyMzkpIC0gTGltaXQgcmVjdXJzaW9uIGRlcHRoCistIFtUSFJJRlQtMzI0MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzI0MSkgLSBmYXRhbCBlcnJvcjogcnVudGltZTogY2Fubm90IG1hcCBwYWdlcyBpbiBhcmVuYSBhZGRyZXNzIHNwYWNlCistIFtUSFJJRlQtMzI0Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzI0MikgLSBPU0dpIEltcG9ydC1QYWNrYWdlIGRpcmVjdGl2ZSBpcyBtaXNzaW5nIHRoZSBBcGFjaGUgSFRUUCBwYWNrYWdlcworLSBbVEhSSUZULTMyMzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyMzQpIC0gTGltaXQgcmVjdXJzaW9uIGRlcHRoCistIFtUSFJJRlQtMzIyMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIyMikgLSBUeXBlU2NyaXB0OiBHZW5lcmF0ZWQgRW51bXMgYXJlIHF1b3RlZAorLSBbVEhSSUZULTMyMjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyMjkpIC0gdW5leHBlY3RlZCBUaW1lb3V0IGV4Y2VwdGlvbiB3aGVuIGRlc2lyZWQgYnl0ZXMgYXJlIG9ubHkgcGFydGlhbGx5IGF2YWlsYWJsZQorLSBbVEhSSUZULTMyMzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyMzEpIC0gQ1BQOiBMaW1pdCByZWN1cnNpb24gZGVwdGggdG8gNjQKKy0gW1RIUklGVC0zMjM1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjM1KSAtIExpbWl0IHJlY3Vyc2lvbiBkZXB0aAorLSBbVEhSSUZULTMxNzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxNzUpIC0gZmFzdGJpbmFyeS5jIHB5dGhvbiBkZXNlcmlhbGl6ZSBjYW4gY2F1c2UgaHVnZSBhbGxvY2F0aW9ucyBmcm9tIGdhcmJhZ2UKKy0gW1RIUklGVC0zMTc2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTc2KSAtIFVuaW9uIGluY29ycmVjdGx5IGltcGxlbWVudHMgPT0KKy0gW1RIUklGVC0zMTc3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTc3KSAtIEZhaWxzIHRvIHJ1biByYWtlIHRlc3QKKy0gW1RIUklGVC0zMTgwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTgwKSAtIGx1YSBwbHVnaW46IGZyYW1lZCB0cmFuc3BvcnQgZG8gbm90IHdvcmsKKy0gW1RIUklGVC0zMTc5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTc5KSAtIGx1YSBwbHVnaW4gY2FudCBjb25uZWN0IHRvIHJlbW90ZSBzZXJ2ZXIgYmVjYXVzZSBmdW5jdGlvbiBsX3NvY2tldF9jcmVhdGVfYW5kX2Nvbm5lY3QgYWx3YXlzIGJpbmQgc29ja2V0IHRvIGxvY2FsaG9zdAorLSBbVEhSSUZULTMyNDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyNDgpIC0gVHlwZVNjcmlwdDogYWRkaXRpb25hbCBjb21tYSBpbiBtZXRob2Qgc2lnbmF0dXJlIHdpdGhvdXQgcGFyYW1ldGVycworLSBbVEhSSUZULTMzMDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzMDIpIC0gR28gSlNPTiBwcm90b2NvbCBzaG91bGQgZW5jb2RlIFRocmlmdCBieXRlIHR5cGUgYXMgc2lnbmVkIGludGVnZXIgc3RyaW5nCistIFtUSFJJRlQtMzI5N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzI5NykgLSBjX2dsaWI6IGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgaXMgbm90IGdlbmVyYXRlZAorLSBbVEhSSUZULTMyOTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyOTQpIC0gVFpsaWJUcmFuc3BvcnQgZm9yIEphdmEgZG9lcyBub3Qgd3JpdGUgZGF0YSBjb3JyZWN0bHkKKy0gW1RIUklGVC0zMjk2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjk2KSAtIEdvIGNyb3NzIHRlc3QgZG9lcyBub3QgY29uZm9ybSB0byBzcGVjCistIFtUSFJJRlQtMzI5NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzI5NSkgLSBDIyBsaWJyYXJ5IGRvZXMgbm90IGJ1aWxkIG9uIE1vbm8gNC4wLjIuNSBvciBsYXRlcgorLSBbVEhSSUZULTMyOTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyOTMpIC0gSmF2YVNjcmlwdDogbnVsbCB2YWx1ZXMgdHVybiBpbnRvIGVtcHR5IHN0cnVjdHMgaW4gY29uc3RydWN0b3IKKy0gW1RIUklGVC0zMzEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzEwKSAtIGxpYi9lcmwvUkVBRE1FLm1kIGhhcyBpbmNvcnJlY3QgZm9ybWF0dGluZworLSBbVEhSSUZULTMzMTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzMTkpIC0gQ1NoYXJwIHR1dG9yaWFsIHdpbGwgbm90IGJ1aWxkIHVzaW5nIHRoZSAqLnNsbgorLSBbVEhSSUZULTMzMzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzMzUpIC0gUnVieSBzZXJ2ZXIgZG9lcyBub3QgaGFuZGxlIHByb2Nlc3NvciBleGNlcHRpb24KKy0gW1RIUklGVC0zMzM4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzM4KSAtIFN0cmF5IHVuZGVyc2NvcmUgaW4gZ2VuZXJhdGVkIGdvIHdoZW4gc2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoICJOZXciCistIFtUSFJJRlQtMzMyNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzMyNCkgLSBVcGRhdGUgR28gRG9jcyBmb3IgcHVsbGluZyBhbGwgcGFja2FnZXMKKy0gW1RIUklGVC0zMzQ1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzQ1KSAtIENsaWVudHMgYmxvY2tlZCBpbmRlZmluaXRlbHkgd2hlbiBhIGphdmEubGFuZy5FcnJvciBpcyB0aHJvd24KKy0gW1RIUklGVC0zMzMyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzMyKSAtIG1ha2UgZGlzdCBmYWlscyBvbiBjbGVhbiBidWlsZAorLSBbVEhSSUZULTMzMjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzMjYpIC0gVGVzdHMgZG8gbm90IGNvbXBpbGUgdW5kZXIgKkJTRAorLSBbVEhSSUZULTMzMzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzMzQpIC0gTWFya2Rvd24gbm90YXRpb24gb2YgcHJvdG9jb2wgc3BlYyBpcyBtYWxmb3JtZWQKKy0gW1RIUklGVC0zMzMxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzMxKSAtIHdhcm5pbmc6IMOi4oKsy5xldHlwZcOi4oKs4oSiIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorLSBbVEhSSUZULTMzNDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzNDkpIC0gUHl0aG9uIHNlcnZlciBkb2VzIG5vdCBoYW5kbGUgcHJvY2Vzc29yIGV4Y2VwdGlvbgorLSBbVEhSSUZULTMzNDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzNDMpIC0gRml4IGhhc2tlbGwgUkVBRE1FCistIFtUSFJJRlQtMzM0MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM0MCkgLSBQeXRob246IGVuYWJsZSBqc29uIHRlc3RzIGFnYWluCistIFtUSFJJRlQtMzMxMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzMxMSkgLSBUb3AgbGV2ZWwgUkVBRE1FLm1kIGhhcyBpbmNvcnJlY3QgZm9ybW1hdGluZworLSBbVEhSSUZULTI5MzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MzYpIC0gTWlub3IgbWVtb3J5IGxlYWsgaW4gU1NMCistIFtUSFJJRlQtMzI5MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzI5MCkgLSBVc2luZyBmcm9tIGluIHZhcmlhYmxlIG5hbWVzIGNhdXNlcyB0aGUgZ2VuZXJhdGVkIFB5dGhvbiBjb2RlIHRvIGhhdmUgZXJyb3JzCistIFtUSFJJRlQtMzIyNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIyNSkgLSBGaXggVFBpcGVTZXJ2ZXIgdW5wcmVkaWN0YWJsZSBiZWhhdmlvciBvbiBpbnRlcnJ1cHQoKQorLSBbVEhSSUZULTMzNTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzNTQpIC0gRml4IHdvcmQtZXh0cmFjdGlvbiBzdWJzdHIgYnVnIGluIGluaXRpYWxpc20gY29kZQorLSBbVEhSSUZULTIwMDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwMDYpIC0gVEJpbmFyeVByb3RvY29sIG1lc3NhZ2UgaGVhZGVyIGNhbGwgbmFtZSBsZW5ndGggaXMgbm90IHZhbGlkYXRlZCBhbmQgY2FuIGJlIHVzZWQgdG8gY29yZSB0aGUgc2VydmVyCistIFtUSFJJRlQtMzMyOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzMyOSkgLSBDKysgbGlicmFyeSB1bml0IHRlc3RzIGRvbid0IGNvbXBpbGUgYWdhaW5zdCB0aGUgbmV3IGJvb3N0LTEuNTkgdW5pdCB0ZXN0IGZyYW1ld29yaworLSBbVEhSSUZULTI2MzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI2MzApIC0gd2luZG93czcgNjRiaXQgcGMuIGlwdjQgYW5kIGlwdjYgcGMuY2FuJ3QgdXNlCistIFtUSFJJRlQtMzMzNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzMzNikgLSBUaHJpZnQgZ2VuZXJhdGVkIHN0cmVhbWluZyBvcGVyYXRvcnMgYWRkZWQgaW4gMC45LjIgY2Fubm90IGJlIG92ZXJyaWRkZW4KKy0gW1RIUklGVC0yNjgxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNjgxKSAtIENvcmUgb2YgdW53aW5kX2NsZWFudXAKKy0gW1RIUklGVC0zMzE3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzE3KSAtIGNwcCBuYW1lc3BhY2Ugb3JnLmFwYWNoZSBpc3N1ZSBhcHBlYXJzIGluIDAuOQorCisjIyMgRG9jdW1lbnRhdGlvbgorLSBbVEhSSUZULTMyODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyODYpIC0gQXBhY2hlIEFudCBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlbmN5CisKKyMjIyBJbXByb3ZlbWVudAorLSBbVEhSSUZULTIyN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI3KSAtIEJ5dGVbXSBpbiBjb2xsZWN0aW9ucyBhcmVuJ3QgcHJldHR5IHByaW50ZWQgbGlrZSByZWd1bGFyIGJpbmFyeSBmaWVsZHMKKy0gW1RIUklGVC0yNzQ0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNzQ0KSAtIFZhZ3JhbnRmaWxlIGZvciBDZW50b3MgNi41CistIFtUSFJJRlQtMjY0NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjY0NCkgLSBIYXhlIHN1cHBvcnQKKy0gW1RIUklGVC0yNzU2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNzU2KSAtIHJlZ2lzdGVyIE1lZGlhIFR5cGUgQCBJQU5BCistIFtUSFJJRlQtMzA3Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA3NikgLSBDb21wYXRpYmlsaXR5IHdpdGggSGF4ZSAzLjIuMAorLSBbVEhSSUZULTMwODFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwODEpIC0gQysrIENvbnNvbGlkYXRlIGNsaWVudCBwcm9jZXNzaW5nIGxvb3BzIGluIFRTZXJ2ZXJzCistIFtUSFJJRlQtMzA4M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA4MykgLSBDKysgQ29uc29saWRhdGUgc2VydmVyIHByb2Nlc3NpbmcgbG9vcHMgaW4gVFNpbXBsZVNlcnZlciwgVFRocmVhZGVkU2VydmVyLCBUVGhyZWFkUG9vbFNlcnZlcgorLSBbVEhSSUZULTMwODRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwODQpIC0gQysrIGFkZCBjb25jdXJyZW50IGNsaWVudCBsaW1pdCB0byB0aHJlYWRlZCBzZXJ2ZXJzCistIFtUSFJJRlQtMzA3NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA3NCkgLSAgICAgQWRkIGNvbXBpbGVyL2NwcC9sZXgueXl0aHJpZnRsLmNjIHRvIGdpdGlnbm9yZS4KKy0gW1RIUklGVC0zMTM0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTM0KSAtIFJlbW92ZSB1c2Ugb2YgZGVwcmVjYXRlZCAicGhhbnRvbS5hcmdzIgorLSBbVEhSSUZULTMxMzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxMzMpIC0gQWxsb3cgIm1ha2UgY3Jvc3MiIGFuZCAibWFrZSBwcmVjcm9zcyIgdG8gcnVuIHdpdGhvdXQgYnVpbGRpbmcgYWxsIGxhbmd1YWdlcworLSBbVEhSSUZULTMxNDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxNDIpIC0gTWFrZSBKYXZhU2NyaXB0IHVzZSBkb3dubG9hZGVkIGxpYnJhcmllcworLSBbVEhSSUZULTMxNDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxNDEpIC0gSW1wcm92ZSBsb2dnaW5nIG9mIEphdmFTY3JpcHQgdGVzdAorLSBbVEhSSUZULTMxNDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxNDQpIC0gUHJvcG9zYWw6IG1ha2UgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGVudW1zIGluIGdlbmVyYXRlZCBnbyBjb2RlIGxlc3MgdmVyYm9zZQorLSBbVEhSSUZULTMxMzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxMzApIC0gUmVtb3ZlIHRoZSBsYXN0IHZlc3RpZ2VzIG9mIFRIUklGVF9PVkVSTE9BRF9JRiBmcm9tIFRIUklGVC0xMzE2CistIFtUSFJJRlQtMzEzMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzEzMSkgLSBDb25zb2xpZGF0ZSBzdWdnZXN0ZWQgaW1wb3J0IHBhdGggZm9yIGdvIHRocmlmdCBsaWJyYXJ5IHRvIGdpdC5hcGFjaGUub3JnIGluIGRvY3MgYW5kIGNvZGUKKy0gW1RIUklGVC0zMDkyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDkyKSAtIEdlbmVyYXRlZCBIYXNrZWxsIHR5cGVzIHNob3VsZCBkZXJpdmUgR2VuZXJpYworLSBbVEhSSUZULTMxMTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxMTApIC0gIFByaW50IGVycm9yIGxvZyBhZnRlciBjcm9zcyB0ZXN0IGZhaWx1cmVzIG9uIFRyYXZpcworLSBbVEhSSUZULTMxMTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxMTQpIC0gVXNpbmcgbG9jYWwgdGVtcCB2YXJpYWJsZXMgdG8gbm90IHBvbGx1dGUgdGhlIGdsb2JhbCB0YWJsZQorLSBbVEhSSUZULTMxMDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxMDYpIC0gQ01ha2Ugc3VtbWFyeSBzaG91bGQgZ2l2ZSBtb3JlIGluZm9ybWF0aW9uIHdoeSBhIGxpYnJhcnkgaXMgc2V0IHRvIG9mZgorLSBbVEhSSUZULTMxMTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxMTkpIC0gSmF2YSdzIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGhhcyBpbmRpc3Rpbmd1aXNoYWJsZSBsb2cgbWVzc2FnZXMgaW4gcnVuKCkKKy0gW1RIUklGVC0zMTIyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTIyKSAtIEphdmFzY3JpcHQgc3RydWN0IGNvbnN0cnVjdG9yIHNob3VsZCBwcm9wZXJseSBpbml0aWFsaXplIHN0cnVjdCBhbmQgY29udGFpbmVyIG1lbWJlcnMgZnJvbSBwbGFpbiBqcyBhcmd1bWVudHMKKy0gW1RIUklGVC0zMTUxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTUxKSAtIEZpeCBsaW5rcyB0byBnaXQtd2lwKiAtIHNob3VsZCBiZSBnaXQuYXBhY2hlLm9yZworLSBbVEhSSUZULTMxNjddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxNjcpIC0gV2luZG93cyBidWlsZCBmcm9tIHNvdXJjZSBpbnN0cnVjdGlvbnMgbmVlZCB0byBiZSByZXZpc2VkCistIFtUSFJJRlQtMzE1NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzE1NSkgLSBtb3ZlIGNvbnRyaWIvbWluZ3czMi10b29sY2hhaW4uY21ha2UgdG8gYnVpbGQvY21ha2UvCistIFtUSFJJRlQtMzE2MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzE2MCkgLSBNYWtlIGdlbmVyYXRlZCBnbyBlbnVtcyBpbXBsZW1lbnQgVGV4dE1hcnNoYWxsZXIgYW5kIFRleHRVbm1hcnNoYWxsZXIgaW50ZXJmYWNlcworLSBbVEhSSUZULTMxNTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxNTApIC0gQWRkIGFuIG9wdGlvbiB0byB0aHJpZnQgZ28gZ2VuZXJhdG9yIHRvIG1ha2UgUmVhZCBhbmQgV3JpdGUgbWV0aG9kcyBwcml2YXRlCistIFtUSFJJRlQtMzE0OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzE0OSkgLSBNYWtlIFJlYWRGaWVsZE4gbWV0aG9kcyBpbiBnZW5lcmF0ZWQgR28gY29kZSBwcml2YXRlCistIFtUSFJJRlQtMzE3Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzE3MikgLSBBZGQgdHV0b3JpYWwgdG8gVGhyaWZ0IHdlYiBzaXRlCistIFtUSFJJRlQtMzIxNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIxNCkgLSBBZGQgRXJsYW5nIG9wdGlvbiBmb3IgdXNpbmcgbWFwcyBpbnN0ZWFkIG9mIGRpY3RzCistIFtUSFJJRlQtMzIwMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIwMSkgLSBDYXB0dXJlIGdpdGh1YiB0ZXN0IGFydGlmYWN0cyBmb3IgZmFpbGVkIGJ1aWxkcworLSBbVEhSSUZULTMyNjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyNjYpIC0gY19nbGliOiBNdWx0aXBsZSBjb21waWxlciB3YXJuaW5ncyBidWlsZGluZyB1bml0IHRlc3RzCistIFtUSFJJRlQtMzI4NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzI4NSkgLSBjX2dsaWI6IEJ1aWxkIGxpYnJhcnkgd2l0aCBhbGwgd2FybmluZ3MgZW5hYmxlZCwgbm8gd2FybmluZ3MgZ2VuZXJhdGVkCistIFtUSFJJRlQtMTk1NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk1NCkgLSBBbGxvdyBmb3IgYSBzZXBhcmF0ZSBjb25uZWN0aW9uIHRpbWVvdXQgdmFsdWUgCistIFtUSFJJRlQtMjA5OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjA5OCkgLSBBZGQgc3VwcG9ydCBmb3IgUXQ1KworLSBbVEhSSUZULTIxOTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxOTkpIC0gUmVtb3ZlIERlbnNlIHByb3RvY29sICh3YXM6IG1vdmUgdG8gQ29udHJpYikKKy0gW1RIUklGVC00MDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQwNikgLSBDKysgVGVzdCBzdWl0ZSBjbGVhbnVwCistIFtUSFJJRlQtOTAyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05MDIpIC0gc29ja2V0IGFuZCBjb25uZWN0IHRpbWVvdXQgaW4gVFNvY2tldCBzaG91bGQgYmUgZGlzdGluZ3Vpc2hlZAorLSBbVEhSSUZULTM4OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzg4KSAtIFVzZSBhIHNlcGFyYXRlIHdpcmUgZm9ybWF0IGZvciBhc3luYyBjYWxscworLSBbVEhSSUZULTcyN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNzI3KSAtIHN1cHBvcnQgbmF0aXZlIEMrKyBsYW5ndWFnZSBzcGVjaWZpYyBleGNlcHRpb24gbWVzc2FnZQorLSBbVEhSSUZULTE3ODRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3ODQpIC0gcGVwLTMxMTAgY29tcGxpYW5jZSBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIAorLSBbVEhSSUZULTEwMjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwMjUpIC0gQysrIFNlcnZlclNvY2tldCBzaG91bGQgaW5oZXJpdCBmcm9tIFNvY2tldCB3aXRoIHRoZSBuZWNlc3NhcnkgQ3RvciB0byBsaXN0ZW4gb24gY29ubmVjdGlvbnMgZnJvbSBhIHNwZWNpZmljIGhvc3QKKy0gW1RIUklGVC0yMjY5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjY5KSAtIENhbiBkZXBsb3kgbGlidGhyaWZ0LXNvdXJjZS5qYXIgdG8gbWF2ZW4gY2VudGVyIHJlcG9zaXRvcnkKKy0gW1RIUklGVC0yODA0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODA0KSAtIFB1bGwgYW4gaW50ZXJmYWNlIG91dCBvZiBUQmFzZUFzeW5jUHJvY2Vzc29yCistIFtUSFJJRlQtMjgwNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgwNikgLSBtb3JlIHdoaXRlc3BhY2UgZml4dXBzCistIFtUSFJJRlQtMjgxMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgxMSkgLSBNYWtlIHJlbW90ZSBzb2NrZXQgYWRkcmVzcyBhY2Nlc3NpYmxlCistIFtUSFJJRlQtMjgwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgwOSkgLSAuZ2l0aWdub3JlIHVwZGF0ZSBmb3IgY29tcGlsZXIncyB2aXN1YWwgcHJvamVjdAorLSBbVEhSSUZULTI4NDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4NDYpIC0gRXhwb3NlIGNpcGhlcnMgcGFyYW1ldGVyIGZyb20gc3NsLndyYXBfc29ja2V0KCkKKy0gW1RIUklGVC0yODU5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODU5KSAtIEpTT04gZ2VuZXJhdG9yOiBvdXRwdXQgY29tcGxldGUgZGVzY3JpcHRvcnMKKy0gW1RIUklGVC0yODYxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODYxKSAtIGFkZCBidWZmZXJlZCB0cmFuc3BvcnQKKy0gW1RIUklGVC0yODY1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODY1KSAtIFRlc3QgY2FzZSBmb3IgR286IFNlcUlkIG91dCBvZiBzZXF1ZW5jZQorLSBbVEhSSUZULTI4NjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4NjYpIC0gR28gZ2VuZXJhdG9yIHNvdXJjZSBjb2RlIGlzIGhhcmQgdG8gcmVhZCBhbmQgbWFpbnRhaW4KKy0gW1RIUklGVC0yODgwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODgwKSAtIFJlYWQgdGhlIG5ldHdvcmsgYWRkcmVzcyBmcm9tIHRoZSBsaXN0ZW5lciBpZiBhdmFpbGFibGUuCistIFtUSFJJRlQtMjg3NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg3NSkgLSBUeXBvIGluIFREZW5zZVByb3RvY29sLmggY29tbWVudAorLSBbVEhSSUZULTI4NzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4NzQpIC0gVEJpbmFyeVByb3RvY29sICBtZW1iZXIgdmFyaWFibGUgInN0cmluZ19idWZfIiBpcyBuZXZlciB1c2VkLgorLSBbVEhSSUZULTI4NTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4NTUpIC0gTW92ZSBjb250cmlidXRpbmcubWQgdG8gdGhlIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkKKy0gW1RIUklGVC0yODYyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODYyKSAtIEVuYWJsZSBSVFRJIGFuZC9vciBidWlsZCBtYWNyb3MgZm9yIGdlbmVyYXRlZCBjb2RlCistIFtUSFJJRlQtMjg3Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg3NikgLSAgQWRkIHRlc3QgZm9yIFRIUklGVC0yNTI2IEFzc2lnbm1lbnQgb3BlcmF0b3JzIGFuZCBjb3B5IGNvbnN0cnVjdG9ycyBpbiBjKysgZG9uJ3QgY29weSB0aGUgX19pc3NldCBzdHJ1Y3QKKy0gW1RIUklGVC0yODk3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODk3KSAtIEdlbmVyYXRlIC1pc0VxdWFsOiBhbmQgLWhhc2ggbWV0aG9kcworLSBbVEhSSUZULTI5MDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MDkpIC0gSW1wcm92ZSB0cmF2aXMgYnVpbGQKKy0gW1RIUklGVC0yOTIxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTIxKSAtIE1ha2UgRXJsYW5nIGltcGwgcmVhZHkgZm9yIE9UUCAxOCByZWxlYXNlIChkaWN0LzAgYW5kIHNldC8wIGFyZSBkZXByZWNhdGVkKQorLSBbVEhSSUZULTI5MjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MjgpIC0gUmVuYW1lIHRoZSBlcmxhbmcgdGVzdF9zZXJ2ZXIgbW9kdWxlCistIFtUSFJJRlQtMjk0MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjk0MCkgLSBBbGxvdyBpbnN0YWxsaW5nIFRocmlmdCBmcm9tIGdpdCBhcyBOUE0gbW9kdWxlIGJ5IHByb3ZpZGluZyBwYWNrYWdlLmpzb24gaW4gdG9wIGxldmVsIGRpcmVjdG9yeQorLSBbVEhSSUZULTI5MzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5MzcpIC0gQWxsb3cgc2V0dGluZyBhIG1heGltdW0gZnJhbWUgc2l6ZSBpbiBURnJhbWVkVHJhbnNwb3J0CistIFtUSFJJRlQtMjk3Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjk3NikgLSBub2RlanM6IHhociBhbmQgd2Vic29ja2V0IHN1cHBvcnQgZm9yIGJyb3dzZXJpZnkKKy0gW1RIUklGVC0yOTk2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yOTk2KSAtIFRlc3QgZm9yIEhheGUgMy4xLjMgb3IgYmV0dGVyIAorLSBbVEhSSUZULTI5NjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5NjkpIC0gbm9kZWpzOiBEUlkgdXAgbGlicmFyeSB0ZXN0cworLSBbVEhSSUZULTI5NzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5NzMpIC0gVXBkYXRlIEhheGUgbGliIHJlYWRtZSByZWdhcmRpbmcgSGF4ZSAzLjEuMworLSBbVEhSSUZULTI5NTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5NTIpIC0gSW1wcm92ZSBoYW5kbGluZyBvZiBTZXJ2ZXIuU3RvcCgpIAorLSBbVEhSSUZULTI5NjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5NjQpIC0gbm9kZWpzOiBtb3ZlIHByb3RvY29scyBhbmQgdHJhbnNwb3J0cyBpbnRvIHNlcGFyYXRlIGZpbGVzCistIFtUSFJJRlQtMjk2M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjk2MykgLSBub2RlanMgLSBhZGQgdGVzdCBjb3ZlcmFnZQorLSBbVEhSSUZULTMwMDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwMDYpIC0gQXR0YWNoICdvbWl0ZW1wdHknIGpzb24gdGFnIGZvciBvcHRpb25hbCBmaWVsZHMgaW4gR28KKy0gW1RIUklGVC0zMDI3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDI3KSAtIEdvIGNvbXBpbGVyIGRvZXMgbm90IGVuc3VyZSBjb21tb24gaW5pdGlhbGlzbXMgaGF2ZSBjb25zaXN0ZW50IGNhc2UKKy0gW1RIUklGVC0zMDMwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDMwKSAtIFRUaHJlYWRlZFNlcnZlcjogUHJvcGVydHkgZm9yIG51bWJlciBvZiBjbGllbnRUaHJlYWRzCistIFtUSFJJRlQtMzAyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzAyMykgLSBHbyBjb21waWxlciBpcyBhIGxpdHRsZSBvdmVybHkgY29uc2VydmF0aXZlIHdpdGggbmFtZXMgb2YgYXR0cmlidXRlcworLSBbVEhSSUZULTMwMThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwMTgpIC0gQ29tcGFjdCBwcm90b2NvbCBmb3IgRGVscGhpCistIFtUSFJJRlQtMzAyNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzAyNSkgLSBDaGFuZ2UgcHVyZSBJbnQgY29uc3RhbnRzIGludG8gQGVudW1zICh3aGVyZSBwb3NzaWJsZSkKKy0gW1RIUklGVC0zMDMxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMDMxKSAtIG1pZ3JhdGUgInNob3VsZFN0b3AiIGZsYWcgdG8gVFNlcnZlcgorLSBbVEhSSUZULTMwMjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwMjIpIC0gQ29tcGFjdCBwcm90b2NvbCBmb3IgSGF4ZQorLSBbVEhSSUZULTMwNDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwNDEpIC0gR2VuZXJhdGUgYXN5bmNocm9ub3VzIGNsaWVudHMgZm9yIENvY29hCistIFtUSFJJRlQtMzA1M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA1MykgLSBQZXJsIFNTTCBTb2NrZXQgU3VwcG9ydCAoRW5jcnlwdGlvbikKKy0gW1RIUklGVC0zMjQ3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjQ3KSAtIEdlbmVyYXRlIGEgQysrIHRocmVhZC1zYWZlIGNsaWVudAorLSBbVEhSSUZULTMyMTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyMTcpIC0gUHJvdmlkZSBhIGxpdHRsZSBlbmRpYW4gdmFyaWFudCBvZiB0aGUgYmluYXJ5IHByb3RvY29sIGluIEMrKworLSBbVEhSSUZULTMyMjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyMjMpIC0gVHlwZVNjcmlwdDogQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgRW51bSBNYXBzCistIFtUSFJJRlQtMzIyMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIyMCkgLSBPcHRpb24gdG8gc3VwcHJlc3MgQEdlbmVyYXRlZCBBbm5vdGF0aW9uIGVudGlyZWx5CistIFtUSFJJRlQtMzMwMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzMwMCkgLSBSZWltcGxlbWVudCBUWmxpYlRyYW5zcG9ydCBpbiBKYXZhIHVzaW5nIHN0cmVhbXMKKy0gW1RIUklGVC0zMjg4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjg4KSAtIGNfZ2xpYjogQnVpbGQgdW5pdCB0ZXN0cyB3aXRoIGFsbCB3YXJuaW5ncyBlbmFibGVkLCBubyB3YXJuaW5ncyBnZW5lcmF0ZWQKKy0gW1RIUklGVC0zMzQ3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzQ3KSAtIEltcHJvdmUgY3Jvc3MgdGVzdCBzZXJ2ZXJzIGFuZCBjbGllbnRzCistIFtUSFJJRlQtMzM0Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM0MikgLSBJbXByb3ZlIHJ1YnkgY3Jvc3MgdGVzdCBjbGllbnQgYW5kIHNlcnZlciBjb21wYXRpYmlsaXR5CistIFtUSFJJRlQtMjI5Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI5NikgLSBBZGQgQysrIEJhc2UgY2xhc3MgZm9yIHNlcnZpY2UKKy0gW1RIUklGVC0zMzM3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzM3KSAtIEFkZCB0ZXN0Qm9vbCBtZXRob2QgdG8gY3Jvc3MgdGVzdHMKKy0gW1RIUklGVC0zMzAzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzAzKSAtIERpc2FibGUgY29uY3VycmVudCBjYWJhbCBqb2JzIG9uIFRyYXZpcyB0byBhdm9pZCBHSEMgY3Jhc2gKKy0gW1RIUklGVC0yNjIzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNjIzKSAtIERvY2tlciBjb250YWluZXIgZm9yIFRocmlmdAorLSBbVEhSSUZULTMyOThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyOTgpIC0gdGhyaWZ0IGVuZGlhbiBjb252ZXJ0ZXJzIG1heSBjb25mbGljdCB3aXRoIG90aGVyIGxpYnJhcmllcworLSBbVEhSSUZULTE1NTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1NTkpIC0gUHJvdmlkZSBtZW1vcnkgcG9vbCBmb3IgVEJpbmFyeVByb3RvY29sIHRvIGVsaW1pbmF0ZSBtZW1vcnkgZnJhZ21lbnRhdGlvbgorLSBbVEhSSUZULTQyNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI0KSAtIFN0ZWFsIFByb3RvY29sQnVmZmVycycgVmFySW50IGltcGxlbWVudGF0aW9uIGZvciBDKysKKworIyMjIE5ldyBGZWF0dXJlCistIFtUSFJJRlQtMzA3MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA3MCkgLSBBZGQgYWJpbGl0eSB0byBzZXQgdGhlIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaworLSBbVEhSSUZULTE5MDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5MDkpIC0gSmF2YTogQWRkIGNvbXBpbGVyIGZsYWcgdG8gdXNlIHRoZSAib3B0aW9uIHBhdHRlcm4iIGZvciBvcHRpb25hbCBmaWVsZHMKKy0gW1RIUklGVC0yMDk5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDk5KSAtIFN0b3AgVFRocmVhZFBvb2xTZXJ2ZXIgd2l0aCBhbGl2ZSBjb25uZWN0aW9ucy4KKy0gW1RIUklGVC0xMjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyMykgLSBpbXBsZW1lbnQgVFpsaWJUcmFuc3BvcnQgaW4gSmF2YQorLSBbVEhSSUZULTIzNjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzNjgpIC0gTmV3IG9wdGlvbjogcmV1c2Utb2JqZWN0cyBmb3IgSmF2YSBnZW5lcmF0b3IKKy0gW1RIUklGVC0yODM2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODM2KSAtIE9wdGlvbmFsbHkgZ2VuZXJhdGUgQysrMTEgTW92ZUNvbnN0cnVjdGlibGUgdHlwZXMKKy0gW1RIUklGVC0yODI0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODI0KSAtIEZsYWcgdG8gZGlzYWJsZSBodG1sIGVzY2FwaW5nIGRvY3RleHQKKy0gW1RIUklGVC0yODE5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODE5KSAtIEFkZCBXZWJzU29ja2V0IGNsaWVudCB0byBub2RlLmpzCistIFtUSFJJRlQtMzA1MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA1MCkgLSBDbGllbnQgY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24gZm9yIG5vbi1odHRwIFRMUyBpbiBDIworLSBbVEhSSUZULTMyOTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMyOTIpIC0gSW1wbGVtZW50IFRabGliVHJhbnNwb3J0IGluIEdvCisKKyMjIyBRdWVzdGlvbgorLSBbVEhSSUZULTI1ODNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1ODMpIC0gVGhyaWZ0IG9uIHhQQyB0YXJnZXQgKFNwZWVkR29hdCkKKy0gW1RIUklGVC0yNTkyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTkyKSAtIHRocmlmdCBzZXJ2ZXIgdXNpbmcgY19nbGliCistIFtUSFJJRlQtMjgzMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgzMikgLSBjX2dsaWI6IEhhbmRsZSBzdHJpbmcgbGlzdHMgY29ycmVjdGx5CistIFtUSFJJRlQtMzEzNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzEzNikgLSB0aHJpZnQgaW5zdGFsbGF0aW9uIHByb2JsZW0gb24gbWFjCistIFtUSFJJRlQtMzM0Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzM0NikgLSBjX2dsaWI6IFR1dG9yaWFscyBleGFtcGxlIGNyYXNoZXMgc2F5aW5nIENhbGN1bGF0b3IucGluZyBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBGQUxTRSBidXQgZGlkIG5vdCBzZXQgYW4gZXJyb3IKKworIyMjIFN1Yi10YXNrCistIFtUSFJJRlQtMjU3OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjU3OCkgLSBNb3ZpbmcgJ21ha2UgY3Jvc3MnIGZyb20gdGVzdC5zaCB0byB0ZXN0LnB5CistIFtUSFJJRlQtMjczNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjczNCkgLSBHbyBjb2Rpbmcgc3RhbmRhcmRzCistIFtUSFJJRlQtMjc0OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjc0OCkgLSBBZGQgVmFncmFudGZpbGUgZm9yIENlbnRvcyA2LjUKKy0gW1RIUklGVC0yNzUzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNzUzKSAtIE1pc2MuIEhheGUgaW1wcm92ZW1lbnRzCistIFtUSFJJRlQtMjY0MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjY0MCkgLSBDb21wYWN0IFByb3RvY29sIGluIENvY29hCistIFtUSFJJRlQtMzI2Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzI2MikgLSB3YXJuaW5nOiBvdmVyZmxvdyBpbiBpbXBsaWNpdCBjb25zdGFudCBjb252ZXJzaW9uIGluIERlbnNlUHJvdG9UZXN0LmNwcAorLSBbVEhSSUZULTMxOTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMxOTQpIC0gQ2FuJ3QgYnVpbGQgd2l0aCBnbyBlbmFibGVkLiAgZ29tb2NrIFNDQyBwYXRoIGluY29ycmVjdC4KKy0gW1RIUklGVC0zMjc1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMjc1KSAtIGNfZ2xpYiB0dXRvcmlhbCB3YXJuaW5ncyBpbiBnZW5lcmF0ZWQgY29kZQorLSBbVEhSSUZULTExMjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMjUpIC0gTXVsdGlwbGV4aW5nIHN1cHBvcnQgZm9yIHRoZSBSdWJ5IExpYnJhcnkKKy0gW1RIUklGVC0yODA3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODA3KSAtIFBIUCBDb2RlIFN0eWxlCistIFtUSFJJRlQtMjg0MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjg0MSkgLSBBZGQgY29tcHJlaGVuc2l2ZSBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgdGhlIHdob2xlIEdvIHN0YWNrCistIFtUSFJJRlQtMjgxNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjgxNSkgLSBIYXhlOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorLSBbVEhSSUZULTI4ODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4ODYpIC0gSW50ZWdyYXRlIGJpbmFyeSB0eXBlIGluIHN0YW5kYXJkIFRocmlmdCBjcm9zcyB0ZXN0CistIFtUSFJJRlQtMjk0Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjk0NikgLSBFbmhhbmNlIHVzYWJpbGl0eSBvZiBjcm9zcyB0ZXN0IGZyYW1ld29yaworLSBbVEhSSUZULTI5NjddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI5NjcpIC0gQWRkIC5lZGl0b3Jjb25maWcgdG8gcm9vdAorLSBbVEhSSUZULTMwMzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMwMzMpIC0gUGVybDogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKy0gW1RIUklGVC0zMTc0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTc0KSAtIEluaXRpYWxpc20gY29kZSBpbiB0aGUgR28gY29tcGlsZXIgZG9lc24ndCBjaGVjayBmaXJzdCB3b3JkCistIFtUSFJJRlQtMzE5M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzE5MykgLSBPcHRpb24gdG8gc3VwcmVzcyBkYXRlIHZhbHVlIGluIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbgorLSBbVEhSSUZULTMzMDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzMDUpIC0gTWlzc2luZyBkaXN0IGZpbGVzIGZvciAwLjkuMyByZWxlYXNlIGNhbmRpZGF0ZQorLSBbVEhSSUZULTMzNDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTMzNDEpIC0gQWRkIHRlc3RCb29sIG1ldGhvZHMKKy0gW1RIUklGVC0zMzA4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzA4KSAtIEZpeCBicm9rZW4gdGVzdCBjYXNlcyBmb3IgMC45LjMgcmVsZWFzZSBjYW5kaWRhdGUKKworIyMjIFRhc2sKKy0gW1RIUklGVC0yODM0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yODM0KSAtIFJlbW92ZSBzZW1pLWNvbG9ucyBmcm9tIHB5dGhvbiBjb2RlIGdlbmVyYXRvcgorLSBbVEhSSUZULTI4NTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4NTMpIC0gQWRqdXN0IGNvbW1lbnRzIG5vdCBhcHBseWluZyBhbnltb3JlIGFmdGVyIFRIUklGVC0yODUyCisKKyMjIyBUZXN0CistIFtUSFJJRlQtMzIxMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzIxMSkgLSBBZGQgbWFrZSBjcm9zcyBzdXBwb3J0IGZvciBwaHAgVENvbXBhY3RQcm90b2NvbAorCisjIyMgV2lzaAorLSBbVEhSSUZULTI4MzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI4MzgpIC0gVE5vbmJsb2NraW5nU2VydmVyIGNhbiBiaW5kIHRvIHBvcnQgMCAoaS5lLiwgZ2V0IGFuIE9TLWFzc2lnbmVkIHBvcnQpIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IHRoZSBwb3J0IG51bWJlcgorCisjIyAwLjkuMgorCisjIyMgQnVnCistIFtUSFJJRlQtMjc5M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjc5MykgLSBHbyBjb21waWxlciBwcm9kdWNlcyB1bmNvbXBpbGFibGUgY29kZQorLSBbVEhSSUZULTE0ODFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0ODEpIC0gVW5peCBkb21haW4gc29ja2V0cyBpbiBDKysgZG8gbm90IHN1cHBvcnQgdGhlIGFic3RyYWN0IG5hbWVzcGFjZQorLSBbVEhSSUZULTE0NTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0NTUpIC0gVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJpbmcgY2FzdHMgZnJvbSBzaXplX3QgdG8gdWludDMyX3QsIHdoaWNoIGlzIG5vdCBzYWZlIG9uIDY0LWJpdCBwbGF0Zm9ybXMKKy0gW1RIUklGVC0xNTc5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTc5KSAtIFBIUCBFeHRlbnRpb24gLSBmdW5jdGlvbiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgbm90IHdvcmtpbmcgZnJvbSBUQmluYXJ5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUKKy0gW1RIUklGVC0xNTg0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTg0KSAtIEVycm9yOiBjb3VsZCBub3QgU2V0TWluVGhyZWFkcyBpbiBUaHJlYWRQb29sIG9uIHNpbmdsZS1jb3JlIG1hY2hpbmVzCistIFtUSFJJRlQtMTYxNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTYxNCkgLSBUaHJpZnQgYnVpbGQgZnJvbSBzdm4gcmVwbyBzb3VyY2VzIGZhaWxzIHdpdGggYXV0b21ha2UtMS4xMgorLSBbVEhSSUZULTEwNDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwNDcpIC0gcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgdHJlYXRzIGFyZyBhcyBzdHJpbmcgd2l0aG91dCBjaGVjaywgc2VnZmF1bHRzIGlmIHlvdSBwYXNzIG5vbi1zdHJpbmcKKy0gW1RIUklGVC0xNjM5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjM5KSAtIEphdmEvUHl0aG9uOiBTZXJpYWxpemF0aW9uL0Rlc2VyaWFsaXphdGlvbiBvZiBkb3VibGUgdHlwZSB1c2luZyBDb21wYWN0UHJvdG9jb2wKKy0gW1RIUklGVC0xNjQ3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjQ3KSAtIE5vZGVKUyBCdWZmZXJlZFRyYW5zcG9ydCBkb2VzIG5vdCB3b3JrIGJleW9uZCB0aGUgaGVsbG8td29ybGQgZXhhbXBsZQorLSBbVEhSSUZULTIxMzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxMzApIC0gVGhyaWZ0J3MgRCBsaWJyYXJ5L3Rlc3Q6IHBhcnRzIG9mICJtYWtlIGNoZWNrIiBjb2RlIGRvIG5vdCBjb21waWxlIHdpdGggcmVjZW50IGRtZC0yLjA2MiB0aHJvdWdoIGRtZC0yLjA2NGFscGhhCistIFtUSFJJRlQtMjE0MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjE0MCkgLSBFcnJvciBjb21waWxpbmcgY3BwIHR1dG9yaWFscworLSBbVEhSSUZULTIxMzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxMzkpIC0gTVNWQyAyMDEyIEVycm9yIC0gQ2Fubm90IGNvbXBpbGUgZHVlIHRvIEJvb3N0VGhyZWFkRmFjdG9yeQorLSBbVEhSSUZULTIxMzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxMzgpIC0gcGtnY29uZmlnIGZpbGUgY3JlYXRlZCB3aXRoIHdyb25nIGluY2x1ZGUgcGF0aAorLSBbVEhSSUZULTIxNjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxNjApIC0gV2FybmluZyBpbiB0aHJpZnQuaCB3aGVuIGNvbXBpbGluZyB3aXRoIC1XdW51c2VkIGFuZCBOREVCVUcKKy0gW1RIUklGVC0yMTU4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTU4KSAtIENvbXBhY3QsIEpTT04sIGFuZCBTaW1wbGVKU09OIHByb3RvY29scyBhcmUgbm90IHdvcmtpbmcgY29ycmVjdGx5CistIFtUSFJJRlQtMjE2N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjE2NykgLSBub2RlanMgbGliIHRocm93cyBlcnJvciBpZiBvcHRpb25zIGFyZ3VtZW50IGlzbid0IHBhc3NlZAorLSBbVEhSSUZULTIyODhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyODgpIC0gR28gaW1wbCBvZiBUaHJpZnQgSlNPTiBwcm90b2NvbCB3cm9uZ2x5IHdyaXRlcy9leHBlY3RzIHRydWUvZmFsc2UgZm9yIGJvb2xzCistIFtUSFJJRlQtMjE0N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjE0NykgLSBUaHJpZnQgSURMIGdyYW1tYXIgYWxsb3dzIGZvciBkb3R0ZWQgaWRlbnRpZmllciBuYW1lcworLSBbVEhSSUZULTIxNDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxNDUpIC0gUmFjayBhbmQgVGhpbiBhcmUgbm90IGp1c3QgZGV2ZWxvcG1lbnQgZGVwZW5kZW5jaWVzCistIFtUSFJJRlQtMjI2N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI2NykgLSBTaG91bGQgYmUgYWJsZSB0byBjaG9vc2Ugc29ja2V0IGZhbWlseSBpbiBQeXRob24gVFNvY2tldAorLSBbVEhSSUZULTIyNzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyNzYpIC0gamF2YSBwYXRoIGluIHNwZWMgZmlsZSBuZWVkcyB1cGRhdGluZworLSBbVEhSSUZULTIyODFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyODEpIC0gR2VuZXJhdGVkIHNlbmQvcmVjdiBjb2RlIGlnbm9yZXMgZXJyb3JzIHJldHVybmVkIGJ5IHRoZSB1bmRlcmx5aW5nIHByb3RvY29sCistIFtUSFJJRlQtMjI4MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI4MCkgLSBUSlNPTlByb3RvY29sLkZsdXNoKCkgZG9lcyBub3QgcmVhbGx5IGZsdXNoIHRoZSB0cmFuc3BvcnQKKy0gW1RIUklGVC0yMjc0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjc0KSAtIFROb25ibG9ja2luZ1NlcnZlciBhbmQgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIgZG8gbm90IGNsb3NlIHRoZWlyIGNoYW5uZWwgc2VsZWN0b3JzIG9uIGV4aXQgYW5kIGxlYWsgZmlsZSBkZXNjcmlwdG9ycworLSBbVEhSSUZULTIyNjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyNjUpIC0gcGhwIGxpYnJhcnkgZG9lc24ndCBidWlsZAorLSBbVEhSSUZULTIyMzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyMzIpIC0gSXNTZXQqIGJyb2tlbiBpbiBHbworLSBbVEhSSUZULTIyNDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyNDYpIC0gVW5zZXQgZW51bSB2YWx1ZSBpcyBwcmludGVkIGJ5IFRvU3RyaW5nKCkKKy0gW1RIUklGVC0yMjQwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjQwKSAtIHRocmlmdC52aW0gKGNvbnRyaWIpIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgJ3VuaW9uJworLSBbVEhSSUZULTIyNDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyNDMpIC0gVE5vbmJsb2NraW5nU2VydmVyIGluIHRocmlmdCBjcmFzaGVzIHdoZW4gVEZyYW1lZFRyYW5zcG9ydCBvcGVucworLSBbVEhSSUZULTIyMzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyMzApIC0gQ2Fubm90IEJ1aWxkIG9uIFJIRUwvQ2VudG9zL0FtYXpvbiBMaW51eCA2LngKKy0gW1RIUklGVC0yMjQ3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjQ3KSAtIEdvIGdlbmVyYXRvciBkb2Vzbid0IGRlYWwgd2VsbCB3aXRoIG1hcCBrZXlzIG9mIHR5cGUgYmluYXJ5CistIFtUSFJJRlQtMjI1M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI1MykgLSBQeXRob24gVG9ybmFkbyBUVG9ybmFkb1NlcnZlciBiYXNlIGNsYXNzIGNoYW5nZQorLSBbVEhSSUZULTIyNjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyNjEpIC0gamF2YTogZXJyb3I6IHVubWFwcGFibGUgY2hhcmFjdGVyIGZvciBlbmNvZGluZyBBU0NJSQorLSBbVEhSSUZULTIyNTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyNTkpIC0gQyM6IHVuZXhwZWN0ZWQgbnVsbCBsb2dEZWxlZ2F0ZSgpIHBvaW50ZXIgY2F1c2VzIEFWIGluIFRTZXJ2ZXIuc2VydmUoKQorLSBbVEhSSUZULTIyMjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyMjUpIC0gU1NMQ29udGV4dCBkZXN0cm95IGJlZm9yZSBjbGVhbnVwT3BlblNTTAorLSBbVEhSSUZULTIyMjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyMjQpIC0gVFNTTFNvY2tldC5oIGFuZCBUU1NMU2VydmVyU29ja2V0Lmggc2hvdWxkIHVzZSB0aGUgcGxhdGZyb21zb2NrZXQgdG9vCistIFtUSFJJRlQtMjIyOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjIyOSkgLSB0aHJpZnQgZmFpbGVkIHRvIGJ1aWxkIG9uIE9TWCAxMC45IEdNCistIFtUSFJJRlQtMjIyN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjIyNykgLSBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdGVzIHNwdXJpb3VzIHdhcm5pbmdzIHdpdGggWGxpbnQKKy0gW1RIUklGVC0yMjE5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjE5KSAtIFRocmlmdCBnZW0gZmFpbHMgdG8gYnVpbGQgb24gT1MgWCBNYXZlcmlja3Mgd2l0aCAxLjkuMyBydWJpZXMKKy0gW1RIUklGVC0yMjI2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjI2KSAtIFRTZXJ2ZXJTb2NrZXQgLSBrZWVwQWxpdmUgd3JvbmcgaW5pdGlhbGl6YXRpb24gb3JkZXIKKy0gW1RIUklGVC0yMjg1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjg1KSAtIFRKc29uUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIEphdmEgZG9lc24ndCBhbGxvdyBhIHNsYXNoICgvKSB0byBiZSBlc2NhcGVkIChcLykKKy0gW1RIUklGVC0yMjE2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjE2KSAtIEV4dHJhbmVvdXMgc2VtaWNvbG9uIGluIFRQcm90b2NvbFV0aWwuaCBtYWtlcyBjbGFuZyBtYWQKKy0gW1RIUklGVC0yMjE1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjE1KSAtIEdlbmVyYXRlZCBIVE1ML0dyYXBodml6IGxpc3RzIHJlZmVyZW5jZWQgZW51bSBpZGVudGlmaWVycyBhcyBVTktOT1dOLgorLSBbVEhSSUZULTIyMTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyMTEpIC0gRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGRvZXMgbm90IGNvbnRhaW4gbmFtZXNwYWNlIHByZWZpeC4KKy0gW1RIUklGVC0yMjEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjEwKSAtIGxpYi9qYXZhIFRTaW1wbGVKU09OUHJvdG9jb2wgY2FuIGVtaXQgaW52YWxpZCBKU09OCistIFtUSFJJRlQtMjIwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjIwOSkgLSBSdWJ5IGdlbmVyYXRvciAtLSBwbGVhc2UgbmFtZXNwYWNlIGNsYXNzZXMKKy0gW1RIUklGVC0yMjAyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjAyKSAtIERlbHBoaSBUU2VydmVySW1wbC5EZWZhdWx0TG9nRGVsZWdhdGUgbWF5IHN0b3AgdGhlIHNlcnZlciB3aXRoIEkvTy1FcnJvciAxMDUKKy0gW1RIUklGVC0yMjAxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjAxKSAtIFRlcm5hcnkgb3BlcmF0b3IgcmV0dXJucyBkaWZmZXJlbnQgdHlwZXMgKGJ1aWxkIGVycm9yIGZvciBzb21lIGNvbXBpbGVycykKKy0gW1RIUklGVC0yMjAwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjAwKSAtIG5lc3RlZCBzdHJ1Y3RzIGNhdXNlIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgdG8gc2xvdyBkb3duIGF0IGV4Y2Vzc2l2ZSBDUFUgbG9hZAorLSBbVEhSSUZULTIxOTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxOTcpIC0gZml4IGphciBvdXRwdXQgZGlyZWN0b3J5IGluIHJwbSBzcGVjIGZpbGUKKy0gW1RIUklGVC0yMTk2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTk2KSAtIEZpeCBpbnZhbGlkIGRlcGVuZGVuY3kgaW4gTWFrZWZpbGUuYW0KKy0gW1RIUklGVC0yMTk0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTk0KSAtIE5vZGU6IE5vdCBhY3R1YWxseSBwcmVwZW5kaW5nIHJlc2lkdWFsIGRhdGEgaW4gVEZyYW1lZFRyYW5zcG9ydC5yZWNlaXZlcgorLSBbVEhSSUZULTIxOTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxOTMpIC0gSmF2YSBjb2RlIGdlbmVyYXRvciBlbWl0cyBzcHVyaW91cyBzZW1pY29sb24gd2hlbiBkZWVwIGNvcHlpbmcgYmluYXJ5IGRhdGEKKy0gW1RIUklGVC0yMTkxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTkxKSAtIEZpeCBjaGFycCBKU09OUHJvdG9jb2wuUmVhZEpTT05Eb3VibGUgKHNwZWNpZnkgSW52YXJpYW50Q3VsdHVyZSkKKy0gW1RIUklGVC0yMjE0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjE0KSAtIFN5c3RlbSBoZWFkZXIgc3lzL3BhcmFtLmggaXMgaW5jbHVkZWQgaW5zaWRlIHRoZSBUaHJpZnQgbmFtZXNwYWNlCistIFtUSFJJRlQtMjE3OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjE3OCkgLSBUaHJpZnQgZ2VuZXJhdG9yIHJldHVybnMgZXJyb3IgZXhpdCBjb2RlIG9uIC0tdmVyc2lvbgorLSBbVEhSSUZULTIxNzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxNzEpIC0gTm9kZUpTIGltcGxlbWVudGF0aW9uIGhhcyBleHRyZW1lbHkgbG93IHRlc3QgY292ZXJhZ2UKKy0gW1RIUklGVC0yMTgzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTgzKSAtIGdlbSBpbnN0YWxsIGZhaWxzIG9uIHpzaAorLSBbVEhSSUZULTIxODJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxODIpIC0gc2VnZmF1bHQgaW4gcmVncmVzc2lvbiB0ZXN0cyAoR0MgYnVnIGluIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlKQorLSBbVEhSSUZULTIxODFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxODEpIC0gb25ld2F5IGNhbGxzIGRvbid0IHdvcmsgaW4gTm9kZUpTCistIFtUSFJJRlQtMjE2OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjE2OSkgLSBKYXZhTUUgVGhyaWZ0IExpYnJhcnkgY2F1c2VzICJqYXZhLmlvLklPRXhjZXB0aW9uOiBObyBSZXNwb25zZSBFbnRyaWVzIEF2YWlsYWJsZSIgYWZ0ZXIgdXNpbmcgdGhlIFRocmlmdCBjbGllbnQgZm9yIHNvbWUgdGltZQorLSBbVEhSSUZULTIxNjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxNjgpIC0gTm9kZS5qcyBhcHBlYXJzIGJyb2tlbiAoYXQgbGVhc3QsIGV4YW1wbGVzIGRvbid0IHdvcmsgYXMgaW50ZW5kZWQpCistIFtUSFJJRlQtMjI5M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI5MykgLSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5jcmVhdGVTU0xDb250ZXh0KCkgbGVhdmVzIGZpbGVzIG9wZW4KKy0gW1RIUklGVC0yMjc5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjc5KSAtIFRTZXJpYWxpemVyIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgMTAyNCBieXRlcyBzZXJpYWxpemVkCistIFtUSFJJRlQtMjI3OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI3OCkgLSBCdWZmZXJlZCB0cmFuc3BvcnQgZG9lc24ndCBzdXBwb3J0IHdyaXRlcyA+IGJ1ZmZlciBzaXplCistIFtUSFJJRlQtMjI3NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI3NSkgLSBGaXggbWVtb3J5IGxlYWsgaW4gZ29sYW5nIGNvbXBhY3RfcHJvdG9jb2wuCistIFtUSFJJRlQtMjI4Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI4MikgLSBJbmNvcmVjdCBjb2RlIGdlbmVyYXRlZCBmb3Igc29tZSB0eXBlZGVmcworLSBbVEhSSUZULTIwMDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwMDkpIC0gR28gcmVkZWNsYXJhdGlvbiBlcnJvcgorLSBbVEhSSUZULTE5NjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5NjQpIC0gJ0lzc2V0JyBjYXVzZXMgcHJvYmxlbXMgd2l0aCBDIy8uTkVUIHNlcmlhbGl6ZXJzCistIFtUSFJJRlQtMjAyNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjAyNikgLSBGaXggVENvbXBhY3RQcm90b2NvbCA2NCBiaXQgYnVpbGRzCistIFtUSFJJRlQtMjEwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjEwOCkgLSBGaXggVEFzeW5jQ2xpZW50TWFuYWdlciB0aW1lb3V0IHJhY2UKKy0gW1RIUklGVC0yMDY4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDY4KSAtIE11bHRpcGxlIGNhbGxzIGZyb20gc2FtZSBjb25uZWN0aW9uIGFyZSBub3QgcHJvY2Vzc2VkIGluIG5vZGUKKy0gW1RIUklGVC0xNzUwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzUwKSAtIE1ha2UgY29tcGlsZXIgYnVpbGQgY2xlYW5seSB1bmRlciB2aXN1YWwgc3R1ZGlvIDEwCistIFtUSFJJRlQtMTc1NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc1NSkgLSBDb21tZW50IHBhcnNpbmcgYnVnCistIFtUSFJJRlQtMTc3MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc3MSkgLSAibWFrZSBjaGVjayIgZmFpbHMgb24geDY0IGZvciBsaWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKKy0gW1RIUklGVC0xODQxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODQxKSAtIE5vZGVKUyBUaHJpZnQgaW5jb3JyZWN0bHkgcGFyc2VzIG5vbi1VVEY4LXN0cmluZyB0eXBlcworLSBbVEhSSUZULTE5MDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5MDgpIC0gVXNpbmcgcGhwIHRocmlmdF9wcm90b2NvbCBhY2NlbGVyYXRlZCB0cmFuc2ZlciBjYXVzZXMgY29yZSBkdW1wCistIFtUSFJJRlQtMTg5Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTg5MikgLSBTb2NrZXQgdGltZW91dHMgYXJlIGRlY2xhcmVkIGluIG1pbGxpLXNlY29uZHMsIGJ1dCBhcmUgYWN0dWFsbHkgc2V0IGluIG1pY3JvLXNlY29uZHMKKy0gW1RIUklGVC0yMzAzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzAzKSAtIFRCdWZmZXJyZWRUcmFuc3BvcnQgbm90IHByb3Blcmx5IGNsb3NpbmcgdW5kZXJseWluZyB0cmFuc3BvcnQKKy0gW1RIUklGVC0yMzEzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzEzKSAtIG5vZGVqcyBzZXJ2ZXIgY3Jhc2ggYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgZmlyc3QgcmVxdWVzdCB3aGVuIHVzaW5nIE11bHRpcGxleGVkUHJvY2Vzc29yL0ZyYW1lZEJ1ZmZlci9CaW5hcnlQcm90b2NvbAorLSBbVEhSSUZULTIzMTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzMTEpIC0gR286IGludmFsaWQgY29kZSBnZW5lcmF0ZWQgd2hlbiBleGNlcHRpb24gbmFtZSBpcyBhIGdvIGtleXdvcmQKKy0gW1RIUklGVC0yMzA4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzA4KSAtIG5vZGU6IFRKU09OUHJvdG9jb2wgcGFyc2UgZXJyb3Igd2hlbiByZWFkaW5nIGZyb20gYnVmZmVyZWQgbWVzc2FnZQorLSBbVEhSSUZULTIzMTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzMTYpIC0gY2NwOiBURmlsZVRyYW5zcG9ydFRlc3QKKy0gW1RIUklGVC0yMzUyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzUyKSAtIG1zdmMgZmFpbGVkIHRvIGNvbXBpbGUgdGhyaWZ0IHRlc3RzCistIFtUSFJJRlQtMjMzN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjMzNykgLSBHb2xhbmcgZG9lcyBub3QgcmVwb3J0IFRJTUVEX09VVCBleGNlcHRpb25zCistIFtUSFJJRlQtMjM0MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM0MCkgLSBHZW5lcmF0ZWQgc2VydmVyIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHNlbmQgcmVzcG9uc2UgdHlwZSBFWENFUFRJT04gb24gdGhlIFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV05fTUVUSE9EIGV4Y2VwdGlvbgorLSBbVEhSSUZULTIzNTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzNTQpIC0gQ29ubmVjdGlvbiBlcnJvcnMgY2FuIGxlYWQgdG8gY2FzZV9jbGF1c2UgZXhjZXB0aW9ucworLSBbVEhSSUZULTIzMzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzMzkpIC0gVW5jYXVnaHQgZXhjZXB0aW9uIGluIHRocmlmdCBjIyBkcml2ZXIKKy0gW1RIUklGVC0yMzU2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzU2KSAtIGMrKyB0aHJpZnQgY2xpZW50IG5vdCB3b3JraW5nIHdpdGggc3NsIChTU0xfY29ubmVjdCBoYW5ncykKKy0gW1RIUklGVC0yMzMxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzMxKSAtIE1pc3NpbmcgY2FsbCB0byBSZWFkU3RydWN0QmVnaW4oKSBpbiBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZCgpCistIFtUSFJJRlQtMjMyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjMyMykgLSBVbmNvbXBpbGVhYmxlIERlbHBoaSBjb2RlIGdlbmVyYXRlZCBmb3IgdHlwZWRlZidkIHN0cnVjdHMKKy0gW1RIUklGVC0yMzIyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzIyKSAtIENvcnJlY3RseSBzaG93IHRoZSBudW1iZXIgb2YgdGltZXMgRXhlY3V0b3JTZXJ2aWNlIChqYXZhKSBoYXMgcmVqZWN0ZWQgdGhlIGNsaWVudC4KKy0gW1RIUklGVC0yMzg5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzg5KSAtIG5hbWVzcGFjZXMgaGFuZGxlZCB3cm9uZ2x5IGluIGFjcmlvbnNjcmlwdCAzLjAgaW1wbGVtZW50YXRpb24KKy0gW1RIUklGVC0yMzg4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzg4KSAtIEdvTGFuZyAtIEZpeCBkYXRhIHJhY2VzIGluIHNpbXBsZV9zZXJ2ZXIgYW5kIHNlcnZlcl9zb2NrZXQKKy0gW1RIUklGVC0yMzg2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzg2KSAtIFRocmlmdCByZWZ1c2VzIHRvIGxpbmsgeXlsZXgKKy0gW1RIUklGVC0yMzc1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzc1KSAtIEV4Y2Vzc2l2ZSA8YnI+J3MgaW4gZ2VuZXJhdGVkIEhUTUwKKy0gW1RIUklGVC0yMzczXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzczKSAtIHdhcm5pbmcgQ1MwNDE0IGluIFRIdHRwQ2xpZW50LmNzOiBwcml2YXRlIGZpZWxkICdUaHJpZnQuVHJhbnNwb3J0LlRIdHRwQ2xpZW50LmNvbm5lY3Rpb24nIGFzc2lnbmVkIGJ1dCBuZXZlciB1c2VkCistIFtUSFJJRlQtMjM3Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM3MikgLSB0aHJpZnQvanNvbl9wcm90b2NvbC5nbzoxNjA6IGZ1bmN0aW9uIGVuZHMgd2l0aG91dCBhIHJldHVybiBzdGF0ZW1lbnQKKy0gW1RIUklGVC0yMzcxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzcxKSAtIHJ1YnkgYnVuZGxlciB2ZXJzaW9uIGZhaWxzIG9uIH4xLjMuMSwgcmVtb3ZlIGFuZCB0YWtlIGxhdGVzdCBhdmFpbAorLSBbVEhSSUZULTIzNzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzNzApIC0gQ29tcGlsZXIgU0VHRkFVTFRzIGdlbmVyYXRpbmcgSFRNTCBkb2N1bWVudGF0aW9uIGZvciBjb21wbGV4IHN0cnVjcmUKKy0gW1RIUklGVC0yMzg0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzg0KSAtIEJpbmFyeSBtYXAga2V5cyBwcm9kdWNlIHVuY29tcGlsYWJsZSBjb2RlIGluIGdvCistIFtUSFJJRlQtMjM4MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM4MCkgLSB1bnJlYWNoYWJsZSBjb2RlIChDSUQgMTE3NDU0NiwgQ0lEIDExNzQ2NzkpCistIFtUSFJJRlQtMjM3OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM3OCkgLSBzZXJ2aWNlIG1ldGhvZCBhcmd1bWVudHMgb2YgYmluYXJ5IHR5cGUgbGVhZCB0byB1bmNvbXBpbGVhYmxlIEdvIGNvZGUKKy0gW1RIUklGVC0yMzYzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzYzKSAtIElzc3VlIHdpdGggY2hhcmFjdGVyIGVuY29kaW5nIG9mIFN1Y2Nlc3MgcmV0dXJuZWQgZnJvbSBMb2dpbiB1c2luZyBUaHJpZnQgUHJveHkgYW5kIE5vZGVKUworLSBbVEhSSUZULTIzNTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzNTkpIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IGRvZXNuJ3QgY2xlYXIgaXQncyBidWZmZXIgb24gYSBmYWlsZWQgZmx1c2ggY2FsbAorLSBbVEhSSUZULTI0MjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0MjgpIC0gUHl0aG9uIDMgc2V0dXAucHkgc3VwcG9ydAorLSBbVEhSSUZULTIzNjddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzNjcpIC0gQnVpbGQgZmFpbHVyZTogc3RkbGliIGFuZCBib29zdCBib3RoIGRlZmluZSB1aW50NjRfdAorLSBbVEhSSUZULTIzNjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzNjUpIC0gQyMgZGVjb2RlcyB0b28gbWFueSBiaW5hcnkgYnl0ZXMgZnJvbSBKU09OCistIFtUSFJJRlQtMjQwMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQwMikgLSBieXRlIGNvdW50IG9mIEZyYW1lQnVmZmVyIGluIEFXQUlUSU5HX0NMT1NFIHN0YXRlIGlzIG5vdCBzdWJ0cmFjdGVkIGZyb20gcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkCistIFtUSFJJRlQtMjM5Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM5NikgLSBCdWlsZCBFcnJvciBvbiBNYWNPU1gKKy0gW1RIUklGVC0yMzk1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzk1KSAtIHRocmlmdCBSdWJ5IGdlbSByZXF1aXJlcyBkZXZlbG9wbWVudCBkZXBlbmRlbmN5ICd0aGluJyByZWdhcmRsZXNzIG9mIGVudmlyb25tZW50CistIFtUSFJJRlQtMjQxNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQxNCkgLSBjX2dsaWIgZml4IHNldmVyYWwgYnVnLgorLSBbVEhSSUZULTI0MjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0MjApIC0gR28gYXJndW1lbnQgcGFyc2VyIGZvciBtZXRob2RzIHdpdGhvdXQgYXJndW1lbnRzIGRvZXMgbm90IHNraXAgZmllbGRzCistIFtUSFJJRlQtMjQzOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQzOSkgLSBCdWcgaW4gVFByb3RvY29sRGVjb3JhdG9yIENsYXNzIGNhdXNlcyBwYXJzaW5nIGVycm9ycworLSBbVEhSSUZULTI0MTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0MTkpIC0gZ29sYW5nIC0gRml4IGZtdC5FcnJvcmYgaW4gZ2VuZXJhdGVkIGNvZGUKKy0gW1RIUklGVC0yNDE4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDE4KSAtIEdvIGhhbmRsZXIgZnVuY3Rpb24gcGFuaWNzIG9uIGludGVybmFsIGVycm9yCistIFtUSFJJRlQtMjQwNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQwNSkgLSBOb2RlLmpzIE11bHRpcGxleGVyIHRlc3RzIGZhaWwgKHNpbGVudGx5KQorLSBbVEhSSUZULTI1ODFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1ODEpIC0gVEZEVHJhbnNwb3J0IGRlc3RydWN0b3Igc2hvdWxkIG5vdCB0aHJvdworLSBbVEhSSUZULTI1NzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1NzUpIC0gVGhyaWZ0IGluY2x1ZGVzIHNpZ2luZm9fdCB3aXRoaW4gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sIG5hbWVzcGFjZQorLSBbVEhSSUZULTI1NzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1NzcpIC0gVEZpbGVUcmFuc3BvcnQgIG1pc3N1c2Ugb2YgY2xvc2Vzb2NrZXQgb24gd2luZG93cyBwbGF0Zm9ybQorLSBbVEhSSUZULTI1NzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1NzYpIC0gSW1wbGVtZW50IFRocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUuc2tpcCBtZXRob2QgaW4gSmF2YVNjcmlwdCBsaWJyYXJ5CistIFtUSFJJRlQtMjU4OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjU4OCkgLSBUaHJpZnQgY29tcGlsZXIgaXMgbm90IGJ1aWxkYWJsZSBpbiBWaXN1YWwgU3R1ZGlvIDIwMTAKKy0gW1RIUklGVC0yNTk0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTk0KSAtIEpTIENvbXBpbGVyOiBTaW5nbGUgcXVvdGVzIGFyZSBub3QgYmVpbmcgZXNjYXBlZCBpbiBjb25zdGFudHMuCistIFtUSFJJRlQtMjU5MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjU5MSkgLSBURnJhbWVkVHJhbnNwb3J0IGRvZXMgbm90IGhhbmRsZSBwYXlsb2FkcyBzcGxpdCBhY3Jvc3MgcGFja2V0cyBjb3JyZWN0bHkKKy0gW1RIUklGVC0yNTk5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTk5KSAtIFVuY29tcGlsZWFibGUgRGVscGhpIGNvZGUgZHVlIHRvIG5hbWluZyBjb25mbGljdHMgd2l0aCBJREwKKy0gW1RIUklGVC0yNTkwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTkwKSAtIEMrKyBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGRvZXNuJ3QgaW5jbHVkZSBNdWx0aXBsZXhpbmcgc3VwcG9ydAorLSBbVEhSSUZULTI1OTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1OTUpIC0gTm9kZS5qczogRml4IGdsb2JhbCBsZWFrcyBhbmQgY29weS1wYXN0ZSBlcnJvcnMKKy0gW1RIUklGVC0yNTY1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTY1KSAtIGF1dG9jb25mIGZhaWxzIHRvIGZpbmQgbWluZ3ctZysrIGNyb3NzIGNvbXBpbGVyIG9uIHRyYXZpcyBDSQorLSBbVEhSSUZULTI1NTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1NTUpIC0gZXhjZXNzaXZlICJ1bnVzZWQgZmllbGQiIGNvbW1lbnRzCistIFtUSFJJRlQtMjU1NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjU1NCkgLSBkb3VibGUgaW5pdGlhbGl6YXRpb24gaW4gZ2VuZXJhdGVkIFJlYWQoKSBtZXRob2QKKy0gW1RIUklGVC0yNTUxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTUxKSAtIE91dE9mTWVtb3J5RXJyb3IgInVuYWJsZSB0byBjcmVhdGUgbmV3IG5hdGl2ZSB0aHJlYWQiIGtpbGxzIHNlcnZlIHRocmVhZAorLSBbVEhSSUZULTI1NDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1NDMpIC0gR2VuZXJhdGVkIGVudW0gdHlwZSBpbiBoYXNrZWxsIHNob3VsZCBiZSBxdWFsaWZpZWQKKy0gW1RIUklGVC0yNTYwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTYwKSAtIFRocmlmdCBjb21waWxlciBnZW5lcmF0b3IgdHJpZXMgdG8gY29uY2F0IGludHMgd2l0aCBzdHJpbmdzIHVzaW5nICsKKy0gW1RIUklGVC0yNTU5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTU5KSAtIENlbnRvcyA2LjUgdW5hYmxlIHRvICJtYWtlIiB3aXRoIFRocmlmdCAwLjkuMQorLSBbVEhSSUZULTI1MjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1MjYpIC0gQXNzaWdubWVudCBvcGVyYXRvcnMgYW5kIGNvcHkgY29uc3RydWN0b3JzIGluIGMrKyBkb24ndCBjb3B5IHRoZSBfX2lzc2V0IHN0cnVjdAorLSBbVEhSSUZULTI0NTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0NTQpIC0gY19nbGliOiBUaGVyZSBpcyBubyBnZXRob3N0YnluYW1lX3IoKSBpbiBzb21lIE9TLgorLSBbVEhSSUZULTI0NTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0NTEpIC0gRG8gbm90IHVzZSBwb2ludGVycyBmb3Igb3B0aW9uYWwgZmllbGRzIHdpdGggZGVmYXVsdHMuIERvIG5vdCB3cml0ZSBzdWNoIGZpZWxkcyBpZiBpdHMgdmFsdWUgc2V0IHRvIGRlZmF1bHQuIEFsc28sIGRvIG5vdCB1c2UgcG9pbnRlcnMgZm9yIGFueSBvcHRpb25hbCBmaWVsZHMgbWFwcGVkIHRvIGdvIG1hcCBvciBzbGljZS4gZ2VuZXJhdGUgR2V0IGFjY2Vzc29ycworLSBbVEhSSUZULTI0NTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0NTApIC0gaW5jbHVkZSBIb3dUb0NvbnRyaWJ1dGUgaW4gdGhlIHNyYyByZXBvCistIFtUSFJJRlQtMjQ0OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQ0OCkgLSB0aHJpZnQvdGVzdC90ZXN0LnNoIGhhcyBpbmNvcnJlY3QgTm9kZS5qcyB0ZXN0IHBhdGgKKy0gW1RIUklGVC0yNDYwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDYwKSAtIHVub3BlbmVkIHNvY2tldCBmZCBtdXN0IGJlIGxlc3MgdGhhbiB6ZXJvLgorLSBbVEhSSUZULTI0NTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0NTkpIC0gLS12ZXJzaW9uIHNob3VsZCBub3QgZXhpdCAxCistIFtUSFJJRlQtMjQ2OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQ2OCkgLSBUaW1lc3RhbXAgaGFuZGxpbmcKKy0gW1RIUklGVC0yNDY3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDY3KSAtIFVuYWJsZSB0byBidWlsZCBjb250cmliL2ZiMzAzIG9uIE9TWCAxMC45LjIKKy0gW1RIUklGVC0yNDY2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDY2KSAtIEltcHJvcGVyIGVycm9yIGhhbmRsaW5nIGZvciBTU0wvVExTIGNvbm5lY3Rpb25zIHRoYXQgZG9uJ3QgY29tcGxldGUgYSBoYW5kc2hha2UKKy0gW1RIUklGVC0yNDYzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDYzKSAtIHRlc3QvcHkvUnVuQ2xpZW50U2VydmVyLnB5IGZhaWxzIHNvbWV0aW1lcworLSBbVEhSSUZULTI0NThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0NTgpIC0gR2VuZXJhdGVkIGdvbGFuZyBzZXJ2ZXIgY29kZSBmb3IgIm9uZXdheSIgbWV0aG9kcyBpcyBpbmNvcnJlY3QKKy0gW1RIUklGVC0yNDU2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDU2KSAtIFRIdHRwQ2xpZW50IGZhaWxzIHdoZW4gdXNpbmcgYXN5bmMgc3VwcG9ydCBvdXRzaWRlIFNpbHZlcmxpZ2h0CistIFtUSFJJRlQtMjUyNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjUyNCkgLSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgaXMgbWlzc2luZyBUVGhyZWFkZWRTZXJ2ZXIgZmlsZXMKKy0gW1RIUklGVC0yNTIzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTIzKSAtIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBpcyBtaXNzaW5nIE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkIGZpbGVzCistIFtUSFJJRlQtMjUyMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjUyMCkgLSBjcHA6Y29iX3N0eWxlIGdlbmVyYXRlcyBpbmNvcnJlY3QgLnRjYyBmaWxlCistIFtUSFJJRlQtMjUwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjUwOCkgLSBVbmNvbXBpbGVhYmxlIEMjIGNvZGUgZHVlIHRvIGxhbmd1YWdlIGtleXdvcmRzIGluIElETAorLSBbVEhSSUZULTI1MDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1MDYpIC0gVXBkYXRlIFRQcm90b2NvbEV4Y2VwdGlvbiBlcnJvciBjb2RlcyB0byBiZSB1c2VkIGNvbnNpc3RlbnRseSB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5CistIFtUSFJJRlQtMjUwNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjUwNSkgLSBnbzogc3RydWN0IHNob3VsZCBhbHdheXMgYmUgYSBwb2ludGVyIHRvIGF2b2lkIGNvcHlpbmcgb2YgcG90ZW50aWFsbHkgc2l6ZS11bmJvdW5kZWQgc3RydWN0cworLSBbVEhSSUZULTI1MTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1MTUpIC0gVExTIE1ldGhvZCBlcnJvciBkdXJpbmcgbWFrZQorLSBbVEhSSUZULTI1MDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1MDMpIC0gQysrOiBGaXggbmFtZSBjb2xsaXNpb24gd2hlbiBhIHN0cnVjdCBoYXMgYSBtZW1iZXIgbmFtZWQgInZhbCIKKy0gW1RIUklGVC0yNDc3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDc3KSAtIHRocmlmdCAtLWhlbHAgdGV4dCB3aXRoIG1pc3BsYWNlZCBjb21tYQorLSBbVEhSSUZULTI0OTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0OTIpIC0gdGVzdC9jcHAgZG9lcyBub3QgY29tcGlsZSBvbiBtYWMKKy0gW1RIUklGVC0yNTAwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTAwKSAtIHNlbmRpbmcgcmFuZG9tIGRhdGEgY3Jhc2hlcyB0aHJpZnQoZ29sYW5nKSBzZXJ2aWNlCistIFtUSFJJRlQtMjQ3NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQ3NSkgLSBjX2dsaWI6IGJ1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSBmdW5jdGlvbiByZXR1cm4gYWx3YXlzIFRSVUUuCistIFtUSFJJRlQtMjQ5NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQ5NSkgLSBKYXZhU2NyaXB0L05vZGUgc3RyaW5nIGNvbnN0YW50cyBsYWNrIHByb3BlciBlc2NhcGluZworLSBbVEhSSUZULTI0OTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0OTEpIC0gdW5hYmxlIHRvIGltcG9ydCBnZW5lcmF0ZWQgVGhyaWZ0VGVzdCBzZXJ2aWNlCistIFtUSFJJRlQtMjQ5MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQ5MCkgLSBjX2dsaWI6IGlmIGZhaWwgdG8gcmVhZCBhIGV4Y2VwdGlvbiBmcm9tIHNlcnZlciwgY2xpZW50IG1heSBiZSBvY2N1cnJlZCBkb3VibGUgZnJlZQorLSBbVEhSSUZULTI0NzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0NzApIC0gVEh0dHBIYW5kbGVyIHN3YWxsb3dzIGV4Y2VwdGlvbnMgZnJvbSBwcm9jZXNzb3IKKy0gW1RIUklGVC0yNTMzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTMzKSAtIEJvb3N0IHZlcnNpb24gaW4gcmVxdWlyZW1lbnRzIHNob3VsZCBiZSB1cGRhdGVkCistIFtUSFJJRlQtMjUzMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjUzMikgLSBKYXZhIHZlcnNpb24gaW4gaW5zdGFsbGF0aW9uIHJlcXVpcmVtZW50cyBzaG91bGQgYmUgdXBkYXRlZAorLSBbVEhSSUZULTI1MjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1MjkpIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IHNwbGl0ICBUY3AgZGF0YSBidWcgaW4gbm9kZUpzCistIFtUSFJJRlQtMjUzN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjUzNykgLSBQYXRoIGZvciAiZ28gZ2V0IiBkb2VzIG5vdCB3b3JrIChwdWxsIHJlcXVlc3QgMTE1KQorLSBbVEhSSUZULTI0NDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0NDMpIC0gTm9kZSBmYWlscyBjcm9zcyBsYW5nIHRlc3RzCistIFtUSFJJRlQtMjQzN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQzNykgLSBBdXRob3IgZmllbGRzIGluIFB5dGhvbiBzZXR1cC5weSBtdXN0IGJlIHN0cmluZ3Mgbm90IGxpc3RzLgorLSBbVEhSSUZULTI0MzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0MzUpIC0gSmF2YSBjb21waWxlciBkb2Vzbid0IGxpa2Ugc3RydWN0IG1lbWJlciBuYW1lcyB0aGF0IGFyZSBpZGVudGljYWwgdG8gYW4gZXhpc3RpbmcgZW51bSBvciBzdHJ1Y3QgdHlwZQorLSBbVEhSSUZULTI0MzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0MzQpIC0gTWlzc2luZyBuYW1lc3BhY2UgaW1wb3J0IGZvciBwaHAgVE11bHRpcGxleGVkUHJvY2Vzc29yIGltcGxlbWVudGF0aW9uCistIFtUSFJJRlQtMjQzMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQzMikgLSBGbGFreSBwYXJhbGxlbCBidWlsZAorLSBbVEhSSUZULTI0MzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0MzApIC0gQ3Jhc2ggZHVyaW5nIFRUaHJlYWRQb29sU2VydmVyIHNodXRkb3duCistIFtUSFJJRlQtNjY3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC02NjcpIC0gUGVyaW9kIHNob3VsZCBub3QgYmUgYWxsb3dlZCBpbiBpZGVudGlmaWVyIG5hbWVzCistIFtUSFJJRlQtMTIxMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTIxMikgLSBNZW1iZXJzIGNhcGl0YWwgY2FzZSBjb25mbGljdAorLSBbVEhSSUZULTI1ODRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1ODQpIC0gRXJyb3IgaGFuZGxlciBub3QgbGlzdGVuZWQgb24gamF2YXNjcmlwdCBjbGllbnQKKy0gW1RIUklGVC0yMjk0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjk0KSAtIEluY29ycmVjdCBNYWtlZmlsZSBnZW5lcmF0aW9uCistIFtUSFJJRlQtMjYwMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjYwMSkgLSBGaXggdmFncmFudCB0byB3b3JrIGFnYWluIGZvciBidWlsZHMgYWdhaW4KKy0gW1RIUklGVC0yMDkyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDkyKSAtIFROb25ibG9ja2luZyBzZXJ2ZXIgc2hvdWxkIHJlbGVhc2UgaGFuZGxlciBhcyBzb29uIGFzIGNvbm5lY3Rpb24gY2xvc2VzCistIFtUSFJJRlQtMjU1N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjU1NykgLSBDUzA1NDIgbWVtYmVyIG5hbWVzIGNhbm5vdCBiZSB0aGUgc2FtZSBhcyB0aGVpciBlbmNsb3NpbmcgdHlwZQorLSBbVEhSSUZULTI2MDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI2MDUpIC0gVFNvY2tldCB3YXJuaW5nIG9uIGdjYyA0LjguMworLSBbVEhSSUZULTI2MDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI2MDcpIC0gVGhyZWFkTWFuYWdlci5jcHAgd2FybmluZyBvbiBjbGFuZysrIDMuNAorLSBbVEhSSUZULTE5OThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5OTgpIC0gVENvbXBhY3RQcm90b2NvbC50Y2MgLSBvbmUgbW9yZSB3YXJuaW5nIG9uIFZpc3VhbCAyMDEwCistIFtUSFJJRlQtMjYxMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjYxMCkgLSBNU1ZDIHdhcm5pbmcgaW4gVFNvY2tldC5jcHAKKy0gW1RIUklGVC0yNjE0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNjE0KSAtIFROb25ibG9ja2luZ1NlcnZlci5jcHAgd2FybmluZ3Mgb24gTVNWQworLSBbVEhSSUZULTI2MDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI2MDgpIC0gVE5vbmJsb2NraW5nU2VydmVyLmNwcCB3YXJuaW5ncyBvbiBjbGFuZyAzLjQKKy0gW1RIUklGVC0yNjA2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNjA2KSAtIFRocmVhZE1hbmFnZXIuaCB3YXJuaW5nIGluIGNsYW5nKysgMy40CistIFtUSFJJRlQtMjYwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjYwOSkgLSBURmlsZVRyYW5zcG9ydC5oIHVudXNlZCBmaWVsZCB3YXJuaW5nIChjbGFuZyAzLjQpCistIFtUSFJJRlQtMjQxNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQxNikgLSBDYW5ub3QgdXNlIFRDb21wYWN0UHJvdG9jb2wgd2l0aCBNU1ZDCistIFtUSFJJRlQtMTgwM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTgwMykgLSBSdWJ5IFRocmlmdCAwLjkuMCB0cmllcyB0byBlbmNvZGUgVVVJRCB0byBVVEY4IGFuZCBjcmFzaGVzCistIFtUSFJJRlQtMjM4NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM4NSkgLSBQcm9ibGVtIHdpdGggZ2V0aG9zdGJ5bmFtZTIgZHVyaW5nIG1ha2UgY2hlY2sKKy0gW1RIUklGVC0yMjYyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjYyKSAtIHRocmlmdCBzZXJ2ZXIgJ011dGF0ZVJvdycgb3BlcmF0aW9uIGdpdmVzIG5vIGluZGljYXRpb24gb2Ygc3VjY2VzcyAvIGZhaWx1cmUKKy0gW1RIUklGVC0yMDQ4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDQ4KSAtIFByZWZlciBib29sZWFuIGNvbnRleHQgdG8gbnVsbHB0cl90IGNvbnZlcnNpb24KKy0gW1RIUklGVC0yNTI4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTI4KSAtIFRocmlmdCBFcmxhbmcgTGlicmFyeTogTXVsdGlwbGUgdGhyaWZ0IGFwcGxpY2F0aW9ucyBpbiBvbmUgYnVuZGxlCistIFtUSFJJRlQtMTk5OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk5OSkgLSB3YXJuaW5nIG9uIGdjYyA0Ljcgd2hpbGUgY29tcGlsaW5nIEJvb3N0TXV0ZXguY3BwCistIFtUSFJJRlQtMjEwNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjEwNCkgLSBTdHJ1Y3RzIGxvc2UgYmluYXJ5IGRhdGEgd2hlbiB0cmFuc2ZlcnJlZCBmcm9tIHNlcnZlciB0byBjbGllbnQgaW4gSmF2YQorLSBbVEhSSUZULTIxODRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxODQpIC0gdW5kZWZpbmVkIG1ldGhvZCByc3BlY192ZXJpZnkgZm9yIFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0CistIFtUSFJJRlQtMjM1MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM1MSkgLSBQSFAgVENvbXBhY3RQcm90b2NvbCBoYXMgZmFpbHMgdG8gZGVjb2RlIG1lc3NhZ2VzCistIFtUSFJJRlQtMjAxNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjAxNikgLSBSZXNvdXJjZSBMZWFrIGluIHRocmlmdCBzdHJ1Y3QgdW5kZXIgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Z1bmN0aW9uLmgKKy0gW1RIUklGVC0yMjczXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjczKSAtIFBsZWFzZSBkZWxldGUgb2xkIHJlbGVhc2VzIGZyb20gbWlycm9yaW5nIHN5c3RlbQorLSBbVEhSSUZULTIyNzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyNzApIC0gRmF1bHR5IGxpYnJhcnkgdmVyc2lvbiBudW1iZXJpbmcgYXQgYnVpbGQgb3IgZG9jdW1lbnRhdGlvbgorLSBbVEhSSUZULTIyMDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyMDMpIC0gVGVzdHMga2VlcGluZyBmYWlsaW5nIG9uIEplbmtpbnMgYW5kIFRyYXZpcyBDSQorLSBbVEhSSUZULTIzOTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzOTkpIC0gdGhyaWZ0LmVsOiByZWNvZ25pemUgIi8vIi1zdHlsZSBjb21tZW50cyBpbiBlbWFjcyB0aHJpZnQtbW9kZQorLSBbVEhSSUZULTI1ODJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1ODIpIC0gIkZpbGVUcmFuc3BvcnQgZXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiB0cnlpbmcgdG8gdXNlIEphdmEncyBURmlsZVRyYW5zcG9ydAorLSBbVEhSSUZULTE2ODJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2ODIpIC0gTXVsdGlwbGUgdGhyZWFkIGNhbGxpbmcgYSBTZXJ2aWNlIGZ1bmN0aW9uIHVuc2FmZWx5IGNhdXNlcyBtZXNzYWdlIGNvcnJ1cHRpb24gYW5kIHRlcm1pbmF0ZXMgd2l0aCBCcm9rZW4gUGlwZQorLSBbVEhSSUZULTIzNTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzNTcpIC0gcmVjdXJzZSBvcHRpb24gaGFzIG5vIGVmZmVjdCB3aGVuIGdlbmVyYXRpbmcgcGhwCistIFtUSFJJRlQtMjI0OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI0OCkgLSBHbyBnZW5lcmF0b3IgZG9lc24ndCBkZWFsIHdlbGwgd2l0aCBtYXAga2V5cyBvZiB0eXBlIGJpbmFyeQorLSBbVEhSSUZULTI0MjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0MjYpIC0gY2xhcmlmeSBJUCByaWdodHMgYW5kIGNvbnRyaWJ1dGlvbnMgZnJvbSBmYnRocmlmdAorLSBbVEhSSUZULTIwNDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwNDEpIC0gVE5vbmJsb2NraW5nIHNlcnZlciBjb21waWxhdGlvbiBvbiB3aW5kb3dzIChBUklUSE1FVElDX1JJR0hUX1NISUZUKQorLSBbVEhSSUZULTI0MDBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0MDApIC0gdGhyaWZ0LmVsOiByZWNvZ25pemUgIi8vIi1zdHlsZSBjb21tZW50cyBpbiBlbWFjcyB0aHJpZnQtbW9kZQorLSBbVEhSSUZULTE3MTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3MTcpIC0gRml4IGRlYiBidWlsZCBpbiBqZW5raW5zCistIFtUSFJJRlQtMjI2Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI2NikgLSBUaHJlYWRNYW5hZ2VyLmg6MjQ6MTA6IGZhdGFsIGVycm9yOiAndHIxL2Z1bmN0aW9uYWwnIGZpbGUgbm90IGZvdW5kIG9uIE1hYyAxMC45IChNYXZlcmlja3MpCistIFtUSFJJRlQtMTMwMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTMwMCkgLSBUZXN0IGZhaWx1cmVzIHdpdGggcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKQorLSBbVEhSSUZULTI0ODddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0ODcpIC0gVHV0b3JpYWwgcmVxdWlyZXMgdHdvIElETCBmaWxlcyBidXQgb25seSBvbmUgaXMgbGlua2VkIGZyb20gdGhlIFRocmlmdCB3ZWIgc2l0ZQorLSBbVEhSSUZULTIzMjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzMjkpIC0gbWlzc2luZyByZWxlYXNlIHRhZ3Mgd2l0aGluIGdpdAorLSBbVEhSSUZULTIzMDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzMDYpIC0gY29uY3VyZW50IGNsaWVudCBjYWxscyB3aXRoIG5vZGVqcworLSBbVEhSSUZULTIyMjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyMjIpIC0gcnVieSBnZW0gY2Fubm90IGJlIGNvbXBpbGVkIG9uIE9TIFggbWF2ZXJpY2tzCistIFtUSFJJRlQtMjM4MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM4MSkgLSBjb2RlIHdoaWNoIGdlbmVyYXRlZCBieSB0aHJpZnQyL2hiYXNlLnRocmlmdCBjb21waWxlIGVycm9yCistIFtUSFJJRlQtMjM5MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM5MCkgLSBubyBjbG9zZSBldmVudCB3aGVuIGNvbm5lY3Rpb24gbG9zdAorLSBbVEhSSUZULTIxNDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxNDYpIC0gVW5hYmxlIHRvIHBhc3MgbXVsdGlwbGUgIi0tZ2VuIiBvcHRpb25zIHRvIHRoZSB0aHJpZnQgY29tcGlsZXIKKy0gW1RIUklGVC0yNDM4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDM4KSAtIFVuZXhwZWN0ZWQgcmVhZEZpZWxkRW5kIGNhbGwgY2F1c2VzIEpTT04gUGFyc2luZyBlcnJvcnMKKy0gW1RIUklGVC0yNDk4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDk4KSAtIEVycm9yIG1lc3NhZ2UgIkludmFsaWQgbWV0aG9kIG5hbWUiIHdoaWxlIHRyeWluZyB0byBjYWxsIEhCYXNlIFRocmlmdCBBUEkKKy0gW1RIUklGVC04NDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTg0MSkgLSBCdWlsZCBjcnVmdAorLSBbVEhSSUZULTI1NzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1NzApIC0gV3JvbmcgVVJMIGdpdmVuIGluIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kZXZlbG9wZXJzCistIFtUSFJJRlQtMjYwNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjYwNCkgLSBGaXggZGViaWFuIHBhY2thZ2luZworLSBbVEhSSUZULTI2MThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI2MTgpIC0gVW5pZ25vcmUgL2FjbG9jYWwgZmlsZXMgcmVxdWlyZWQgZm9yIGJ1aWxkCistIFtUSFJJRlQtMjU2Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjU2MikgLSAuL2NvbmZpZ3VyZSBjcmVhdGUgTWFrZUZpbGUgaW4gbGliL2Qgd2l0aCBlcnJvcnMKKy0gW1RIUklGVC0yNTkzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTkzKSAtIFVuYWJsZSB0byBidWlsZCB0aHJpZnQgb24gdWJ1bnR1LTEyLjA0IChQcmVjaXNlKQorLSBbVEhSSUZULTI0NjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0NjEpIC0gQ2FuJ3QgaW5zdGFsbCB0aHJpZnQtMC44LjAgb24gT1MgWCAxMC45LjIKKy0gW1RIUklGVC0yNjAyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNjAyKSAtIEZpeCBtaXNzaW5nIGRpc3QgZmlsZXMKKy0gW1RIUklGVC0yNjIwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNjIwKSAtIEZpeCBweXRob24gcGFja2FnaW5nCistIFtUSFJJRlQtMjU0NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjU0NSkgLSBUZXN0IENQUCBmYWlscyB0byBidWlsZCAocG9zc2libHkgdHlwbykKKworIyMgRG9jdW1lbnRhdGlvbgorLSBbVEhSSUZULTIxNTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxNTUpIC0gQWRkaW5nIG9uZSBsaW5lciBndWlkZSB0byByZW5hbWUgdGhlIHZlcnNpb24uaC5pbiBhbmQgcmVuYW1lIHRocmlmdHkuY2MuaAorLSBbVEhSSUZULTE5OTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5OTEpIC0gQWRkIGV4Y2VwdGlvbnMgdG8gZXhhbXBsZXMKKy0gW1RIUklGVC0yMzM0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzM0KSAtIGFkZCBhIHR1dG9yaWFsIGZvciBub2RlIEpTCistIFtUSFJJRlQtMjM5Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM5MikgLSBBY3Rpb25zY3JpcHQgdHV0b3JpYWwKKy0gW1RIUklGVC0yMzgzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzgzKSAtIGNvbnRyaWI6IHNhbXBsZSBmb3IgY29ubmVjdGluZyBUaHJpZnQgd2l0aCBSZWJ1cworLSBbVEhSSUZULTIzODJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzODIpIC0gY29udHJpYjogc2FtcGxlIGZvciBjb25uZWN0aW5nIFRocmlmdCB3aXRoIFNUT01QCisKKyMjIyBJbXByb3ZlbWVudAorLSBbVEhSSUZULTE0NTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0NTcpIC0gQ2FwYWNpdHkgb2YgVGZyYW1lZFRyYW5zcG9ydCB3cml0ZSBidWZmZXIgaXMgbmV2ZXIgcmVzZXQKKy0gW1RIUklGVC0xMTM1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTM1KSAtIE5vZGUuanMgdHV0b3JpYWwKKy0gW1RIUklGVC0xMzcxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzcxKSAtIFNvY2tldCB0aW1lb3V0cyAoU09fUkNWVElNRU8gYW5kIFNPX1NORFRJTUVPKSBub3Qgc3VwcG9ydGVkIG9uIFNvbGFyaXMKKy0gW1RIUklGVC0yMTQyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTQyKSAtIE1pbm9yIHR3ZWFrcyB0byB0aHJpZnQuZWwgZm9yIGJldHRlciBlbWFjcyBwYWNrYWdlIGNvbXBhdGliaWxpdHkKKy0gW1RIUklGVC0yMjY4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjY4KSAtIE1vZGlmeSBUU2FzbFRyYW5zcG9ydCB0byBpZ25vcmUgVENQIGhlYWx0aCBjaGVja3MgZnJvbSBsb2FkYmFsYW5jZXJzCistIFtUSFJJRlQtMjI2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI2NCkgLSBHaXRIdWIgcGFnZSBpbmNvcnJlY3RseSBzdGF0ZXMgdGhhdCBUaHJpZnQgaXMgc3RpbGwgaW5jdWJhdGluZworLSBbVEhSSUZULTIyNjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyNjMpIC0gQWx3YXlzIGdlbmVyYXRlIGdvb2QgaGFzaENvZGUgZm9yIEphdmEKKy0gW1RIUklGVC0yMjMzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjMzKSAtIEphdmEgY29tcGlsZXIgc2hvdWxkIGRlZmVuc2l2ZWx5IGNvcHkgaXRzIGJpbmFyeSBpbnB1dHMKKy0gW1RIUklGVC0yMjM5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjM5KSAtIEFkZHJlc3MgRmluZEJ1Z3MgZXJyb3JzCistIFtUSFJJRlQtMjI0OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI0OSkgLSBBZGQgU01QIEJ1aWxkIG9wdGlvbiB0byB0aHJpZnQuc3BlYyAoYW5kIHRocmVlIGNvbmZpZyBkZWZpbmVzKQorLSBbVEhSSUZULTIyNTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyNTQpIC0gRXhjZXB0aW9ucyBnZW5lcmF0ZWQgYnkgR28gY29tcGlsZXIgc2hvdWxkIGltcGxlbWVudCBlcnJvciBpbnRlcmZhY2UKKy0gW1RIUklGVC0yMjYwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjYwKSAtIFRocmlmdCBpbXBvc2VzIHVubmVlZGVkIGRlcGVuZGVuY3kgb24gY29tbW9ucy1sYW5nMworLSBbVEhSSUZULTIyNThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyNTgpIC0gQWRkIFRMUyB2MS4xLzEuMiBzdXBwb3J0IHRvIFRTU0xTb2NrZXQuY3BwCistIFtUSFJJRlQtMjIwNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjIwNSkgLSBOb2RlLmpzIFRlc3QgU2VydmVyIHRvIHN1cHBvcnQgdGVzdC5qcyBKYXZhU2NyaXB0IEJyb3dzZXIgdGVzdCBhbmQgc3VuZHJ5IGZpeGVzCistIFtUSFJJRlQtMjIwNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjIwNCkgLSBTU0wgY2xpZW50IGZvciB0aGUgY29jb2EgY2xpZW50CistIFtUSFJJRlQtMjE3Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjE3MikgLSBKYXZhIGNvbXBpbGVyIGFsbG9jYXRlcyBvcHRpb25hbHMgYXJyYXkgZm9yIGV2ZXJ5IHN0cnVjdCB3aXRoIGFuIG9wdGlvbmFsIGZpZWxkCistIFtUSFJJRlQtMjE4NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjE4NSkgLSB1c2UgY2FiYWwgaW5zdGVhZCBvZiBydW5oYXNrZWxsIGluIGhhc2tlbGwgbGlicmFyeQorLSBbVEhSSUZULTE5MjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5MjYpIC0gUEhQIENvbnN0YW50IEdlbmVyYXRpb24gUmVmYWN0b3JpbmcKKy0gW1RIUklGVC0yMDI5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDI5KSAtIFBvcnQgQysrIHRlc3RzIHRvIFdpbmRvd3MKKy0gW1RIUklGVC0yMDU0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDU0KSAtIFRTaW1wbGVGaWxlVHJhbnNwb3J0IC0gSmF2YSBMaWIgaGFzIG5vIHN0cmFpZ2h0IGZvcndhcmQgVFRyYW5zcG9ydCBiYXNlZCBmaWxlIHRyYW5zcG9ydAorLSBbVEhSSUZULTIwNDBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwNDApIC0gInVuaW5pdGlhbGl6ZWQgdmFyaWFibGUiIHdhcm5pbmdzIG9uIE1TVkMvd2luZG93cworLSBbVEhSSUZULTIwMzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwMzQpIC0gR2l2ZSBkZXZlbG9wZXJzJyBDKysgY29kZSBkaXJlY3QgYWNjZXNzIHRvIHNvY2tldCBGRHMgb24gc2VydmVyIHNpZGUKKy0gW1RIUklGVC0yMDk1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDk1KSAtIFVzZSBwcmludCBmdW5jdGlvbiBmb3IgUHl0aG9uIDMgY29tcGF0aWJsaXR5CistIFtUSFJJRlQtMTg2OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTg2OCkgLSBNYWtlIHRoZSBUUEMgYmFja2xvZyBjb25maWd1cmFibGUgaW4gdGhlIEphdmEgc2VydmVycworLSBbVEhSSUZULTE4MTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4MTMpIC0gQWRkIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbiB0byBnZW5lcmF0ZWQgY2xhc3NlcworLSBbVEhSSUZULTE4MTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4MTUpIC0gQ29kZSBnZW5lcmF0b3JzIGxpbmUgYnVmZmVyIG91dHB1dAorLSBbVEhSSUZULTIzMDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzMDUpIC0gVEZyYW1lZFRyYW5zcG9ydCBlbXB0eSBjb25zdHJ1Y3RvciBzaG91bGQgcHJvYmFibHkgYmUgcHJpdmF0ZQorLSBbVEhSSUZULTIzMDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzMDQpIC0gTW92ZSBjbGllbnQgYXNzaWdubWVudHMgZnJvbSBjb25zdHJ1dG9yIGluIG1ldGhvZAorLSBbVEhSSUZULTIzMDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzMDkpIC0gUnVieSAoZ2VtKSAmIFBIUCBSUE0gc3VicGFja2FnZXMKKy0gW1RIUklGVC0yMzE4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzE4KSAtIHBlcmw6IGRlcGVuZGVuY3kgQ2xhc3M6OkFjY2Vzc29yIG5vdCBjaGVja2VkCistIFtUSFJJRlQtMjMxN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjMxNykgLSBleGNsdWRlIHR1dG9yaWFsIGZyb20gYnVpbGQKKy0gW1RIUklGVC0yMzIwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzIwKSAtIFByb2dyYW0gbGV2ZWwgZG9jdGV4dCBkb2VzIG5vdCBnZXQgYXR0YWNoZWQgYnkgcGFyc2VyCistIFtUSFJJRlQtMjM0OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM0OSkgLSBHb2xhbmcgLSBpbXByb3ZlIHR1dG9yaWFsCistIFtUSFJJRlQtMjM0OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM0OCkgLSBQSFAgR2VuZXJhdG9yOiBhZGQgYXJyYXkgdHlwZWhpbnQgdG8gZnVuY3Rpb25zCistIFtUSFJJRlQtMjM0NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM0NCkgLSBjb25maWd1cmUuYWM6IGNvbXBpbGVyLW9ubHkgb3B0aW9uCistIFtUSFJJRlQtMjM0M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM0MykgLSBHb2xhbmcgLSBSZXR1cm4gYSBzaW5nbGUgZXJyb3IgZm9yIGFsbCBleGNlcHRpb25zIGluc3RlYWQgb2YgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcworLSBbVEhSSUZULTIzNDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzNDEpIC0gRW5hYmxlIGdlbmVyYXRpb24gb2YgRGVscGhpIFhNTERvYyBjb21tZW50cyAoYS5rLmEuICJIZWxwIEluc2lnaHQiKQorLSBbVEhSSUZULTIzNTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzNTUpIC0gQWRkIFNTTCBhbmQgV2ViIFNvY2tldCBTdXBwb3J0IHRvIE5vZGUgYW5kIEphdmFTY3JpcHQKKy0gW1RIUklGVC0yMzUwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzUwKSAtIEFkZCBhc3luYyBjYWxscyB0byBub3JtYWwgSmF2YVNjcmlwdAorLSBbVEhSSUZULTIzMzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzMzApIC0gR2VuZXJhdGUgUEhQRG9jIGNvbW1lbnRzCistIFtUSFJJRlQtMjMzMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjMzMikgLSBSUE1CVUlMRDogcnVuIGJvb3RzdHJhcCAoaWYgbmVlZGVkKQorLSBbVEhSSUZULTIzOTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzOTEpIC0gc2ltcGxlIHNvY2tldCB0cmFuc3BvcnQgZm9yIGFjdGlvbnNjcmlwdCAzLjAKKy0gW1RIUklGVC0yMzc2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzc2KSAtIG5vZGVqczogYWxsb3cgUHJvbWlzZSBzdHlsZSBjYWxscyBmb3IgY2xpZW50IGFuZCBzZXJ2ZXIKKy0gW1RIUklGVC0yMzY5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzY5KSAtIEFkZCBzc2wgc3VwcG9ydCBmb3Igbm9kZWpzIGltcGxlbWVudGF0aW9uCistIFtUSFJJRlQtMjQwMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQwMSkgLSBIYXNrZWxsIHR1dG9yaWFsIGNvbXBpbGVzCistIFtUSFJJRlQtMjQxN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQxNykgLSBDIyBVbmlvbiBjbGFzc2VzIGFyZSBub3QgcGFydGlhbAorLSBbVEhSSUZULTI0MTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0MTUpIC0gTmFtZWQgcGlwZXMgc2VydmVyIHBlcmZvcm1hbmNlICYgbWVzc2FnZSBtb2RlCistIFtUSFJJRlQtMjQwNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQwNCkgLSBlbWl0IHdhcm5pbmcgb24gKHR5cGljYWxseSBpbmVmZmljaWVudCkgbGlzdDxieXRlPgorLSBbVEhSSUZULTIzOThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzOTgpIC0gSW1wcm92ZSBOb2RlIFNlcnZlciBMaWJyYXJ5CistIFtUSFJJRlQtMjM5N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM5NykgLSBBZGQgQ09SUyBhbmQgQ1NQIHN1cHBvcnQgZm9yIEphdmFTY3JpcHQgYW5kIE5vZGUuanMgbGlicmFyaWVzCistIFtUSFJJRlQtMjQwN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQwNykgLSB1c2UgbWFya2Rvd24gKHJlbmFtZSBSRUFETUUgPT4gUkVBRE1FLm1kKQorLSBbVEhSSUZULTIzMDBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzMDApIC0gRCBjb25maWd1cmUgaW5mbyBvdXRwdXQgc2hvdWxkIGZvbGxvdyBzYW1lIGZvcm1hdCBhcyBvdGhlciBsYW5ndWFnZXMKKy0gW1RIUklGVC0yNTc5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTc5KSAtIFdpbmRvd3MgQ0Ugc3VwcG9ydAorLSBbVEhSSUZULTI1NzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1NzQpIC0gQ29tcGlsZXIgb3B0aW9uIHRvIGdlbmVyYXRlIG5hbWVzcGFjZSBkaXJlY3RvcmllcyBmb3IgUnVieQorLSBbVEhSSUZULTI1NzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1NzEpIC0gU2ltcGxpZnkgY3Jvc3MgY29tcGlsYXRpb24gdXNpbmcgQ01ha2UKKy0gW1RIUklGVC0yNTY5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTY5KSAtIEludHJvZHVjZSBmaWxlIHRvIHNwZWNpZnkgdGhpcmQgcGFydHkgbGlicmFyeSBsb2NhdGlvbnMgb24gV2luZG93cworLSBbVEhSSUZULTI1NjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1NjgpIC0gSW1wbGVtZW50IG93biBjZXJ0aWZpY2F0ZSBoYW5kbGVyCistIFtUSFJJRlQtMjU1Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjU1MikgLSBlbGltaW5hdGUgd2FybmluZyBmcm9tIGNvbmZpZ3VyZS5hYworLSBbVEhSSUZULTI1NDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1NDkpIC0gR2VuZXJhdGUganNvbiB0YWcgZm9yIHN0cnVjdCBtZW1iZXJzLiB1c2UgZ28udGFnIGFubm90YXRpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZ2VuZXJhdGVkIHRhZy4KKy0gW1RIUklGVC0yNTQ0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTQ0KSAtIEFkZCBzdXBwb3J0IGZvciBzb2NrZXQgdHJhbnNwb3J0IGZvciBjIyBsaWJyYXJ5IHdoZW4gdXNpbmcgV2luZG93cyBQaG9uZSBwcm9qZWN0cworLSBbVEhSSUZULTI0NTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0NTMpIC0gaGFza2VsbCB0dXRvcmlhbDogZml4IHVwIGRpdmlzaW9uIGJ5IDAgZXhhbXBsZQorLSBbVEhSSUZULTI0NDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0NDkpIC0gRW5oYW5jZSB0eXBlZGVmIHN0cnVjdHVyZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZvcndhcmRzIGFuZCByZWFsIHR5cGVkZWZzCistIFtUSFJJRlQtMjQ0Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQ0NikgLSBUaGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHNlcnZlciBzdHJlYW0gZXJyb3JzCistIFtUSFJJRlQtMjQ1NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQ1NSkgLSBBbGxvdyBjbGllbnQgY2VydGlmaWNhdGVzIHRvIGJlIHVzZWQgd2l0aCBUSHR0cENsaWVudAorLSBbVEhSSUZULTI1MTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1MTEpIC0gTm9kZS5qcyBuZWVkcyB0aGUgY29tcGFjdCBwcm90b2NvbAorLSBbVEhSSUZULTI0OTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0OTMpIC0gTm9kZS5qcyBsaWIgbmVlZHMgSFRUUCBjbGllbnQKKy0gW1RIUklGVC0yNTAyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTAyKSAtIE9wdGltaXplIGdvIGltcGxlbWVudGF0aW9ucyBvZiBiaW5hcnkgYW5kIGNvbXBhY3QgcHJvdG9jb2xzIGZvciBzcGVlZAorLSBbVEhSSUZULTI0OTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0OTQpIC0gQWRkIGVudW0gdG9TdHJpbmcgaGVscGVyIGZ1bmN0aW9uIGluIGNfZ2xpYgorLSBbVEhSSUZULTI0NzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0NzEpIC0gTWFrZSBjcHAucmVmIGFubm90YXRpb24gbGFuZ3VhZ2UgYWdub3N0aWMKKy0gW1RIUklGVC0yNDk3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDk3KSAtIHNlcnZlciBhbmQgY2xpZW50IGZvciB0ZXN0L2dvLCBhbHNvIHNldmVyYWwgZml4ZXMgYW5kIGltcHJvdmVtZW50cworLSBbVEhSSUZULTI1MzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1MzUpIC0gVEpTT05Qcm90b2NvbCB3aGVuIHNlcmlhbGl6ZWQgeWllbGRzIFRGaWVsZCBpZHMgcmF0aGVyIHRoYW4gbmFtZXMKKy0gW1RIUklGVC0yMjIwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjIwKSAtIEFkZCBhIG5ldyBzdHJ1Y3Qgc3RydWN0dj8KKy0gW1RIUklGVC0xMzUyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzUyKSAtIFRocmlmdCBzZXJ2ZXIKKy0gW1RIUklGVC05ODldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk4OSkgLSBQdXNoIGJvb3N0IG00IG1hY3JvcyB1cHN0cmVhbQorLSBbVEhSSUZULTEzNDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzNDkpIC0gUmVtb3ZlIHVubmVjZXNzYXJ5IHByaW50IG91dHMKKy0gW1RIUklGVC0yNDk2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDk2KSAtIHNlcnZlciBhbmQgY2xpZW50IGZvciB0ZXN0L2dvLCBhbHNvIHNldmVyYWwgZml4ZXMgYW5kIGltcHJvdmVtZW50cworLSBbVEhSSUZULTExMTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMTQpIC0gTWF2ZW4gcHVibGlzaCBzaG91bGRuJ3QgcmVxdWlyZSBwYXNzd29yZHMgaGFyZGNvZGVkIGluIHNldHRpbmdzLnhtbAorLSBbVEhSSUZULTIwNDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwNDMpIC0gdmlzdWFsIDIwMTAgd2FybmluZ3MgLSB1bnJlYWNoYWJsZSBjb2RlCistIFtUSFJJRlQtMTY4M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTY4MykgLSBJbXBsZW1lbnQgYWx0ZXJuYXRpdmVzIHRvIEphdmFzY3JpcHQgQ2xpZW50IHNpZGUgVHJhbnNwb3J0IHByb3RvY29sLCBqdXN0IGFzIE5QQVBJIGFuZCBXZWJTb2NrZXQuCistIFtUSFJJRlQtMTc0Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc0NikgLSBwcm92aWRlIGEgU1BEWCBmaWxlCistIFtUSFJJRlQtMTc3Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc3MikgLSBTZXJpYWxpemF0aW9uIGRvZXMgbm90IGNoZWNrIHR5cGVzIG9mIGVtYmVkZGVkIHN0cnVjdHVyZXMuCistIFtUSFJJRlQtMjM4N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM4NykgLSBub2RlanM6IGV4dGVybmFsIGltcG9ydHMgc2hvdWxkIGJlIGNlbnRyYWxpemVkIGluIGluZGV4LmpzCistIFtUSFJJRlQtMjAzN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjAzNykgLSBNb3JlIGdlbmVyYWwgbWFjcm8gVEhSSUZUX1VOVVNFRF9WQVJJQUJMRQorCisjIyMgTmV3IEZlYXR1cmUKKy0gW1RIUklGVC0xMDEyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDEyKSAtIFRyYW5zcG9ydCBmb3IgRGF0YUlucHV0IERhdGFPdXRwdXQgaW50ZXJmYWNlCistIFtUSFJJRlQtMjI1Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI1NikgLSBVc2luZyBjKysxMS9jKysweCBzdGQgbGlicmFyeSAgcmVwbGFjZSBib29zdCBsaWJyYXJ5CistIFtUSFJJRlQtMjI1MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI1MCkgLSBKU09OIGFuZCBNZW1vcnlCdWZmZXIgZm9yIEphdmFNRQorLSBbVEhSSUZULTIxMTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxMTQpIC0gUHl0aG9uIFNlcnZpY2UgUmVtb3RlIFNTTCBPcHRpb24KKy0gW1RIUklGVC0xNzE5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzE5KSAtIFNBU0wgY2xpZW50IHN1cHBvcnQgZm9yIFB5dGhvbgorLSBbVEhSSUZULTE4OTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4OTQpIC0gVGhyaWZ0IG11bHRpLXRocmVhZGVkIGFzeW5jIEphdmEgU2VydmVyIHVzaW5nIEphdmEgNyBBc3luY2hyb25vdXNDaGFubmVsR3JvdXAKKy0gW1RIUklGVC0xODkzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODkzKSAtIEhUVFAvSlNPTiBzZXJ2ZXIvY2xpZW50IGZvciBub2RlIGpzCistIFtUSFJJRlQtMjM0N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjM0NykgLSBDIyBUTFMgVHJhbnNwb3J0IGJhc2VkIG9uIFRIUklGVC0xODEKKy0gW1RIUklGVC0yMzc3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzc3KSAtIEFsbG93IGFkZGl0aW9uIG9mIGN1c3RvbSBIVFRQIEhlYWRlcnMgdG8gYW4gSFRUUCBUcmFuc3BvcnQKKy0gW1RIUklGVC0yNDA4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNDA4KSAtIE5hbWVkIFBpcGUgVHJhbnNwb3J0IE9wdGlvbiBmb3IgQyMKKy0gW1RIUklGVC0yNTcyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTcyKSAtIEFkZCBzdHJpbmcvY29sbGVjdGlvbiBsZW5ndGggbGltaXQgY2hlY2tzIChmcm9tIEMrKykgdG8gamF2YSBwcm90b2NvbCByZWFkZXJzCistIFtUSFJJRlQtMjQ2OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQ2OSkgLSAiamF2YTpmdWxsY2FtZWwiIG9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGNhbWVsLWNhc2UgdW5kZXJzY29yZWQgYXR0cmlidXRlIG5hbWVzCistIFtUSFJJRlQtNzk1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC03OTUpIC0gSW1wb3J0aW5nIHNlcnZpY2UgZnVuY3Rpb25zIChzaW11bGF0aW9uIG11bHRpcGxlIGluaGVyaXRhbmNlKQorLSBbVEhSSUZULTIxNjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxNjQpIC0gQWRkIGEgR2V0L1Bvc3QgSHR0cCBTZXJ2ZXIgdG8gTm9kZSBhbG9uZyB3aXRoIGV4YW1wbGVzCistIFtUSFJJRlQtMjI1NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI1NSkgLSBhZGQgUGFyZW50IENsYXNzIGZvciBnZW5lcmF0ZWQgU3RydWN0IGNsYXNzCisKKyMjIyBRdWVzdGlvbgorLSBbVEhSSUZULTI1MzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1MzkpIC0gVHNvY2tldC5jcHAgYWRkcmluZm8gYWlfZmxhZ3MgPSBBSV9BRERSQ09ORklHCistIFtUSFJJRlQtMjQ0MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQ0MCkgLSBob3cgdG8gY29ubmVjdCBhczMgdG8gamF2YSBieSB0aHJpZnQgLAorLSBbVEhSSUZULTIzNzldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzNzkpIC0gTWVtbW9yeSBsZWFraW5nIHdoaWxlIHVzaW5nIG11bHRpdGhyZWFkaW5nIGluIEMrKyBzZXJ2ZXIuCistIFtUSFJJRlQtMjI3N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI3NykgLSBUaHJpZnQ6IGluc3RhbGxpbmcgZmIzMDMgZXJyb3IKKy0gW1RIUklGVC0yNTY3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTY3KSAtIENzaGFycCBzbG93ID8KKy0gW1RIUklGVC0yNTczXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTczKSAtIHRocmlmdCAwLjkuMiByZWxlYXNlCisKKyMjIyBTdWItdGFzaworLSBbVEhSSUZULTk4MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTgxKSAtIGNvY29hOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CistIFtUSFJJRlQtMjEzMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjEzMikgLSBHbzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKy0gW1RIUklGVC0yMjk5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjk5KSAtIFRKc29uUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIFJ1YnkgZG9lcyBub3QgYWxsb3cgZm9yIGJvdGggcG9zc2libGUgc2xhc2ggKHNvbGlkdXMpIGVuY29kaW5ncworLSBbVEhSSUZULTIyOThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyOTgpIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgQyMgZG9lcyBub3QgYWxsb3cgZm9yIGJvdGggcG9zc2libGUgc2xhc2ggKHNvbGlkdXMpIGVuY29kaW5ncworLSBbVEhSSUZULTIyOTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyOTcpIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgRGVscGhpIGRvZXMgbm90IGFsbG93IGZvciBib3RoIHBvc3NpYmxlIHNsYXNoIChzb2xpZHVzKSBlbmNvZGluZ3MKKy0gW1RIUklGVC0yMjcxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMjcxKSAtIEphdmFTY3JpcHQ6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcworLSBbVEhSSUZULTIyNTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyNTEpIC0gZ28gdGVzdCBmb3IgY29tcGFjdCBwcm90b2NvbCBpcyBub3QgcnVubmluZworLSBbVEhSSUZULTIxOTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxOTUpIC0gRGVscGhpOiBBZGQgZXZlbnQgaGFuZGxlcnMgZm9yIHNlcnZlciBhbmQgcHJvY2Vzc2luZyBldmVudHMKKy0gW1RIUklGVC0yMTc2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTc2KSAtIFRTaW1wbGVKU09OUHJvdG9jb2wuUmVhZEZpZWxkQmVnaW4oKSBkb2VzIG5vdCByZXR1cm4gZmllbGQgdHlwZSBhbmQgSUQKKy0gW1RIUklGVC0yMTc1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTc1KSAtIFdyb25nIGZpZWxkIHR5cGUgc2V0IGZvciBiaW5hcnkKKy0gW1RIUklGVC0yMTc0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTc0KSAtIERlc2VyaWFsaXppbmcgSlNPTiBmYWlscyBpbiBzcGVjaWZpYyBjYXNlcworLSBbVEhSSUZULTIwNTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwNTMpIC0gTm9kZUpTOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMKKy0gW1RIUklGVC0xOTE0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTE0KSAtIFB5dGhvbjogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKy0gW1RIUklGVC0xODEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODEwKSAtIGFkZCBydWJ5IHRvIHRlc3QvdGVzdC5zaAorLSBbVEhSSUZULTIzMTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzMTApIC0gUEhQOiBDbGllbnQtc2lkZSBzdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMKKy0gW1RIUklGVC0yMzQ2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzQ2KSAtIEMjOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKy0gW1RIUklGVC0yMzQ1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzQ1KSAtIERlbHBoaTogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCistIFtUSFJJRlQtMjMzOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjMzOCkgLSBGaXJzdCBkb2N0ZXh0IHdyb25nbHkgaW50ZXJwcmV0ZWQgYXMgcHJvZ3JhbSBkb2N0ZXh0IGluIHNvbWUgY2FzZXMKKy0gW1RIUklGVC0yMzI1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMzI1KSAtIFNTTCB0ZXN0IGNlcnRpZmljYXRlcworLSBbVEhSSUZULTIzNThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzNTgpIC0gQysrOiBhZGQgY29tcGFjdCBwcm90b2NvbCB0byBjcm9zcyBsYW5ndWFnZSB0ZXN0IHN1aXRlCistIFtUSFJJRlQtMjQyNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQyNSkgLSBQSFA6IFNlcnZlci1zaWRlIHN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcworLSBbVEhSSUZULTI0MjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0MjEpIC0gVHJlZS9SZWN1cnNpdmUgc3RydWN0IHN1cHBvcnQgaW4gdGhyaWZ0CistIFtUSFJJRlQtMjI5MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI5MCkgLSBVcGRhdGUgR28gdHV0b3JpYWwgdG8gYWxpZ24gd2l0aCBUSFJJRlQtMjIzMgorLSBbVEhSSUZULTI1NThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1NTgpIC0gQ1NoYXJwIGNvbXBpbGVyIGdlbmVyYXRvciB0cmllcyB0byBjb25jYXQgaW50cyB3aXRoIHN0cmluZ3MgdXNpbmcgKworLSBbVEhSSUZULTI1MDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI1MDcpIC0gQWRkaXRpb25hbCBMVUEgVFByb3RvY29sRXhjZXB0aW9uIGVycm9yIGNvZGUgbmVlZGVkPworLSBbVEhSSUZULTI0OTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI0OTkpIC0gQ29tcGlsZXI6IGFsbG93IGFubm90YXRpb25zIHdpdGhvdXQgIj0gdmFsdWUiCistIFtUSFJJRlQtMjUzNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjUzNCkgLSBDcm9zcyBsYW5ndWFnZSB0ZXN0IHJlc3VsdHMgc2hvdWxkIHJlY29yZGVkIHRvIGEgc3RhdHVzLm1kIG9yIHN0YXR1cy5odG1sIGZpbGUgYXV0b21hdGljYWxseQorLSBbVEhSSUZULTY2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC02NikgLSBKYXZhOiBBbGxvdyBtdWx0aXBsZXhpbmcgbXVsdGlwbGUgc2VydmljZXMgb3ZlciBhIHNpbmdsZSBUQ1AgY29ubmVjdGlvbgorLSBbVEhSSUZULTE2ODFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2ODEpIC0gQWRkIEx1YSBTdXBwb3J0CistIFtUSFJJRlQtMTcyN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTcyNykgLSBSdWJ5LTEuOTogZGF0YSBsb3NzOiAiYmluYXJ5IiBmaWVsZHMgYXJlIHJlLWVuY29kZWQKKy0gW1RIUklGVC0xNzI2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzI2KSAtIFJ1YnktMS45OiAiYmluYXJ5IiBmaWVsZHMgYXJlIHJlcHJlc2VudGVkIGJ5IHN0cmluZyB3aG9zZSBlbmNvZGluZyBpcyAiVVRGLTgiCistIFtUSFJJRlQtOTg4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05ODgpIC0gcGVybDogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeSB2aWEgY29uZmlndXJlCistIFtUSFJJRlQtMzM0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzQpIC0gQ29tcGFjdCBQcm90b2NvbCBmb3IgUEhQCistIFtUSFJJRlQtMjQ0NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQ0NCkgLSBwdWxsIHJlcXVlc3QgODg6IHRocmlmdDogY2xlYW4gdXAgZW51bSB2YWx1ZSBhc3NpZ25tZW50CisKKyMjIyBUYXNrCistIFtUSFJJRlQtMjIyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjIyMykgLSBTcGFtIGxpbmtzIG9uIHdpa2kKKy0gW1RIUklGVC0yNTY2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTY2KSAtIFBsZWFzZSBjcmVhdGUgYSBET0FQIGZpbGUgZm9yIHlvdXIgVExQCistIFtUSFJJRlQtMjIzN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjIzNykgLSBVcGRhdGUgYXJjaGl2ZSB0byBjb250YWluIGFsbCB2ZXJzaW9ucworLSBbVEhSSUZULTk2Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTYyKSAtIFR1dG9yaWFsIHBhZ2Ugb24gb3VyIHdlYnNpdGUgaXMgcmVhbGx5IHVuaGVscGZ1bAorCisjIyMgVGVzdAorLSBbVEhSSUZULTIzMjddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIzMjcpIC0gbm9kZWpzOiBub2RlanMgdGVzdCBzdWl0ZSBzaG91bGQgYmUgYnVuZGxlZCB3aXRoIHRoZSBsaWJyYXJ5CistIFtUSFJJRlQtMjQ0NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjQ0NSkgLSBUSFJJRlQtMjM4NCAoY29kZSBnZW5lcmF0aW9uIGZvciBnbyBtYXBzIHdpdGggYmluYXJ5IGtleXMpIHNob3VsZCBiZSB0ZXN0ZWQKKy0gW1RIUklGVC0yNTAxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNTAxKSAtIEMjIFRoZSB0ZXN0IHBhcmFtZXRlcnMgZnJvbSB0aGUgVGVzdFNlcnZlciBhbmQgVGVzdENsaWVudCBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy90ZXN0LworCisjIyMgV2lzaAorLSBbVEhSSUZULTIxOTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxOTApIC0gQWRkIHRoZSBKYXZhU2NyaXB0IHRocmlmdC5qcyBsaWIgdG8gdGhlIEJvd2VyIHJlZ2lzdHJ5CistIFtUSFJJRlQtMjA3Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjA3NikgLSBib29zdDo6b3B0aW9uYWwgaW5zdGVhZCBvZiBfX2lzc2V0CisKKyMjIDAuOS4xCisKKyMjIyBCdWcKKy0gW1RIUklGVC0xNDQwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDQwKSAtIGRlYmlhbiBwYWNrYWdpbmc6IG1pbm9yLWlzaCBwb2xpY3kgcHJvYmxlbXMKKy0gW1RIUklGVC0xNDAyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDAyKSAtIEdlbmVyYXRlZCBZX3R5cGVzLmpzIGRvZXMgbm90IHJlcXVpcmUoKSBYX3R5cGVzLmpzIHdoZW4gYW4gaW5jbHVkZSBpbiB0aGUgSURMIGZpbGUgd2FzIHVzZWQKKy0gW1RIUklGVC0xNTUxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTUxKSAtIDIgdGhyaWZ0IGZpbGUgZGVmaW5lIG9ubHkgc3RydWN0IChubyBzZXJ2aWNlKSwgb25lIGluY2x1ZGUgYW5vdGhlciwgdGhlIGdlbiBub2RlanMgZmlsZSBkaWRuJ3QgaGF2ZSAicmVxdWlyZXMiIGF0IHRoZSB0b3AKKy0gW1RIUklGVC0xMjY0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjY0KSAtIFRTb2NrZXRDbGllbnQgaXMgcXVlcmllZCBieSBydW4gbG9vcCBhZnRlciBkZWFsbG9jYXRpb24gaW4gQ29jb2EKKy0gW1RIUklGVC0xNjAwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjAwKSAtIFRocmlmdCBHbyBDb21waWxlciBhbmQgTGlicmFyeSBvdXQgb2YgZGF0ZSB3aXRoIEdvIDEgUmVsZWFzZS4KKy0gW1RIUklGVC0xNjAzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjAzKSAtIFRocmlmdCBJREwgYWxsb3dzIGZvciBtdWx0aXBsZSBleGNlcHRpb25zLCBhcmdzIG9yIHN0cnVjdCBtZW1iZXIgbmFtZXMgdG8gYmUgdGhlIHNhbWUKKy0gW1RIUklGVC0xMDYyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDYyKSAtIFByb2JsZW1zIHdpdGggcHl0aG9uIHR1dG9yaWFscworLSBbVEhSSUZULTg2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtODY0KSAtIGRlZmF1bHQgdmFsdWUgZmFpbHMgaWYgaWRlbnRpZmllciBpcyBhIHN0cnVjdAorLSBbVEhSSUZULTkzMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTMwKSAtIFJ1YnkgYW5kIEhhc2tlbGwgYmluZGluZ3MgZG9uJ3QgcHJvcGVybHkgc3VwcG9ydCBERVNURElSIChtYWtlcyBwYWNrYWdpbmcgcGFpbmZ1bCkKKy0gW1RIUklGVC04MjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTgyMCkgLSBUaGUgcmVhZExlbmd0aCBhdHRyaWJ1dGUgb2YgVEJpbmFyeVByb3RvY29sIGlzIHVzZWQgYXMgYW4gaW5zdGFuY2UgdmFyaWFibGUgYW5kIGlzIGRlY3JlbWVudGVkIG9uIGVhY2ggY2FsbCBvZiBjaGVja1JlYWRMZW5ndGgKKy0gW1RIUklGVC0xNjQwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjQwKSAtIE5vbmUgb2YgdGhlIHR1dG9yaWFscyBsaW5rZWQgb24gdGhlIHdlYnNpdGUgY29udGFpbiBjb250ZW50CistIFtUSFJJRlQtMTYzN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTYzNykgLSBOUE0gcmVnaXN0cnkgZG9lcyBub3QgaW5jbHVkZSB2ZXJzaW9uIDAuOAorLSBbVEhSSUZULTE2NDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NDgpIC0gTm9kZUpTIGNsaWVudHMgYWx3YXlzIHJlY2VpdmUgMCBmb3IgJ2RvdWJsZScgdmFsdWVzLgorLSBbVEhSSUZULTE2NjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NjApIC0gUHl0aG9uIFRocmlmdCBsaWJyYXJ5IGNhbiBiZSBpbnN0YWxsZWQgd2l0aCBwaXAgYnV0IG5vdCBlYXN5X2luc3RhbGwKKy0gW1RIUklGVC0xNjU3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjU3KSAtIENocm9tZSBicm93c2VyIHNlbmRpbmcgT1BUSU9OUyBtZXRob2QgYmVmb3JlIFBPU1QgaW4geG1sSHR0cFJlcXVlc3QKKy0gW1RIUklGVC0yMTE4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTE4KSAtIENlcnRpZmljYXRlIGVycm9yIGhhbmRsaW5nIHN0aWxsIGluY29ycmVjdAorLSBbVEhSSUZULTIxMzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxMzcpIC0gUnVieSB0ZXN0IGxpYiBmYWlscyBqZW5raW5zIGJ1aWxkICM4NjQKKy0gW1RIUklGVC0yMTM2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTM2KSAtIFZhZ3JhbnQgYnVpbGQgbm90IGNvbXBpbGluZyBqYXZhLCBydWJ5LCBwaHAsIGdvIGxpYnMgZHVlIHRvIG1pc3NpbmcgZGVwZW5kZW5jaWVzCistIFtUSFJJRlQtMjEzNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjEzNSkgLSBHTyBsaWIgbGVhdmVzIGJlaGluZCB0ZXN0IGZpbGVzIHRoYXQgYXJlIGF1dG8gZ2VuZXJhdGVkCistIFtUSFJJRlQtMjEzNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjEzNCkgLSBtaW5ndy1jcm9zcy1jb21waWxlIHNjcmlwdCBmYWlsaW5nIHdpdGggc3RyaXAgZXJyb3JzCistIFtUSFJJRlQtMjEzM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjEzMykgLSBqYXZhIFRlc3RUQmluYXJ5UHJvdG9jb2wuamF2YSB0ZXN0IGZhaWxpbmcKKy0gW1RIUklGVC0yMTI2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTI2KSAtIGxpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TVEQqIGZpbGVzIG1pc3NpbmcgZnJvbSBESVNUCistIFtUSFJJRlQtMjEyNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjEyNSkgLSBkZWJpYW4gbWlzc2luZyBmcm9tIERJU1QKKy0gW1RIUklGVC0yMTI0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTI0KSAtIC5vLCAuc28sIC5sYSwgLmRlcHMsIC5saWJzLCBnZW4tKiBmaWxlcyBsZWZ0IHR1dG9yaWFscywgdGVzdCBhbmQgbGliL2NwcCB3aGVuIG1ha2luZyBESVNUCistIFtUSFJJRlQtMjEyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjEyMykgLSBHTyBsaWIgbWlzc2luZyBmaWxlcyBpbiBESVNUIGJ1aWxkCistIFtUSFJJRlQtMjEyMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjEyMSkgLSBDb21waWxhdGlvbiBidWcgZm9yIE5vZGUuanMKKy0gW1RIUklGVC0yMTI5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTI5KSAtIHBocCBleHQgbWlzc2luZyBmcm9tIGRpc3QKKy0gW1RIUklGVC0yMTI4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTI4KSAtIGxpYiBHTyB0ZXN0cyBmYWlsIHdpdGggZnVuY3QgZW5kcyB3aXRob3V0IGEgcmV0dXJuIHN0YXRlbWVudAorLSBbVEhSSUZULTIyODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyODYpIC0gRmFpbGVkIHRvIGNvbXBpbGUgVGhyaWZ0MC45LjEgd2l0aCBib29zdDEuNTUgYnkgVlMyMDEwIGlmIHNlbGVjdCBEZWJ1Zy1tdCZ4NjQgbW9kZS4KKy0gW1RIUklGVC0xOTczXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTczKSAtIFRDb21wYWN0UHJvdG9jb2wgaW4gQyMgbGliIGRvZXMgbm90IHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgbmVnYXRpdmUgaW50MzIgYW5kIGludDY0IG51bWJlciBjb3JyZWN0bHkKKy0gW1RIUklGVC0xOTkyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTkyKSAtIGNhc3RzIGluIFRDb21wYWN0UHJvdG9jb2wudGNjIGNhdXNpbmcgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIgd2FybmluZ3MgZnJvbSBnY2MKKy0gW1RIUklGVC0xOTMwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTMwKSAtIEMjIGdlbmVyYXRlcyB1bnNpZ25lZCBieXRlIGZvciBUaHJpZnQgImJ5dGUiIHR5cGUKKy0gW1RIUklGVC0xOTI5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTI5KSAtIFVwZGF0ZSB3ZWJzaXRlIHRvIHVzZSBNaXJyb3JzIGZvciBkb3dubG9hZHMKKy0gW1RIUklGVC0xOTI4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTI4KSAtIFJhY2UgbWF5IHN0aWxsIGV4aXN0IGluIFRGaWxlVHJhbnNwb3J0OjpmbHVzaCgpCistIFtUSFJJRlQtMTkzNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTkzNCkgLSBUYWJzIGluIEV4YW1wbGUgc2VjdGlvbiBvbiBtYWluIHBhZ2UgYXJlIG5vdCB3b3JraW5nCistIFtUSFJJRlQtMTkzM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTkzMykgLSBEZWxwaGkgZ2VuZXJhdG9yIGNyYXNoZXMgd2hlbiBhIHR5cGVkZWYgcmVmZXJlbmNlcyBhbm90aGVyIHR5cGVkZWYgZnJvbSBhbiBpbmNsdWRlZCBmaWxlCistIFtUSFJJRlQtMTk0Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk0MikgLSBCaW5hcnkgYWNjZWxlcmF0ZWQgY3BwIGV4dGVuc2lvbiBkb2VzIG5vdCB1c2UgVGhyaWZ0IG5hbWVzcGFjZXMgZm9yIEV4Y2VwdGlvbnMKKy0gW1RIUklGVC0xOTU5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTU5KSAtIEMjOiBBZGQgVW5pb24gVE1lbW9yeUJ1ZmZlciBzdXBwb3J0CistIFtUSFJJRlQtMTk1OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk1OCkgLSBDIzogVXNlIHN0YXRpYyBPYmplY3QuRXF1YWxzIGluc3RlYWQgb2YgLkVxdWFscygpIGNhbGxzIGluIGVxdWFscworLSBbVEhSSUZULTE5NTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5NTcpIC0gTm9kZUpTIFRGcmFtZWRUcmFuc3BvcnQgYW5kIFRCdWZmZXJlZFRyYW5zcG9ydCByZWFkIGJ5dGVzIGFzIHVuc2lnbmVkCistIFtUSFJJRlQtMTk1NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk1NSkgLSBVbmlvbiBUeXBlIHdyaXRlciBnZW5lcmF0ZWQgaW4gQyMgZG9lcyBub3QgV3JpdGVTdHJ1Y3RCZWdpbgorLSBbVEhSSUZULTE5NTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5NTIpIC0gVHJhdmlzIENJCistIFtUSFJJRlQtMTk0OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk0OSkgLSBXUDcgYnVpbGQgYnJva2VuCistIFtUSFJJRlQtMTk0M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk0MykgLSBkb2NzdHJpbmdzIGZvciBlbnVtIHZhbHVlcyBhcmUgaWdub3JlZAorLSBbVEhSSUZULTIwNzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwNzApIC0gSW1wcm9wZXIgYEhleENoYXInIGFuZCAnSGV4VmFsJyBpbXBsZW1lbnRhdGlvbiBpbiBUSlNPTlByb3RvY29sLmNzCistIFtUSFJJRlQtMjAxN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjAxNykgLSBSZXNvdXJjZSBMZWFrIGluIHRocmlmdCBzdHJ1Y3QgdW5kZXIgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAorLSBbVEhSSUZULTIwMzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwMzIpIC0gQyMgY2xpZW50IGxlYWtzIHNvY2tldHMvaGFuZGxlcworLSBbVEhSSUZULTE5OTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5OTYpIC0gSmF2YU1FIENvbnN0YW50cyBnZW5lcmF0aW9uIGlzIGJyb2tlbiAvIGluY29uc2lzdGVudCB3aXRoIHJlZ3VsYXIgSmF2YSBnZW5lcmF0aW9uCistIFtUSFJJRlQtMjAwMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjAwMikgLSBIYXNrZWxsOiBUZXN0IHVzZSBEYXRhLk1heWJlIGluc3RlYWQgb2YgTWF5YmUKKy0gW1RIUklGVC0yMDUxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDUxKSAtIFZhZ3JhbnQgZmFpbHMgdG8gYnVpbGQgZXJsYW5nCistIFtUSFJJRlQtMjA1MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjA1MCkgLSBWYWdyYW50IEMjIGxpYiBjb21waWxlIGZhaWxzIHdpdGggVEV4Y2VwdGlvbiBtaXNzaW5nCistIFtUSFJJRlQtMTk3OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk3OCkgLSBSdWJ5OiBUaHJpZnQgc2hvdWxkIGFsbG93IGZvciB0aGUgU1NMIHZlcmlmeSBtb2RlIHRvIGJlIHNldAorLSBbVEhSSUZULTE5ODRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5ODQpIC0gbmFtZXNwYWNlIGNvbGxpc2lvbiBpbiBweXRob24gYmluZGluZ3MKKy0gW1RIUklGVC0xOTg4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTg4KSAtIFdoZW4gdHJ5aW5nIHRvIGJ1aWxkIGEgZGViaWFuIHBhY2thZ2UgaXQgZmFpbHMgYXMgdGhlIGZpbGUgTkVXUyBkb2Vzbid0IGV4aXN0CistIFtUSFJJRlQtMTk3NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk3NSkgLSBUQmluYXJ5UHJvdG9jb2wgQ2hlY2tMZW5ndGggY2FuJ3QgYmUgdXNlZCBmb3IgYSBjbGllbnQKKy0gW1RIUklGVC0xOTk1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTk1KSAtICcuJyBhbGxvd2VkIGF0IGVuZCBvZiBpZGVudGlmaWVyIGdlbmVyYXRlcyBub24tY29tcGlsYWJsZSBjb2RlCistIFtUSFJJRlQtMjExMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjExMikgLSBFcnJvciBpbiBHbyBnZW5lcmF0b3Igd2hlbiB1c2luZyB0eXBlZGVmcyBpbiBtYXAga2V5cworLSBbVEhSSUZULTIwODhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwODgpIC0gVHlwb3MgaW4gVGhyaWZ0IGNvbXBpbGVyIGhlbHAgdGV4dAorLSBbVEhSSUZULTIwODBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwODApIC0gQyMgbXVsdGlwbGV4IHByb2Nlc3NvciBkb2VzIG5vdCBjYXRjaCBJT0V4Y2VwdGlvbgorLSBbVEhSSUZULTIwODJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwODIpIC0gRXhlY3V0aW5nICJnbWFrZSBjbGVhbiIgaXMgYnJva2VuCistIFtUSFJJRlQtMjEwMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjEwMikgLSBjb25zdGFudHMgYXJlIG5vdCByZWZlcmVuY2luZyB0byBjb3JyZWN0IHR5cGUgd2hlbiBpbmNsdWRlZCBmcm9tIGFub3RoZXIgdGhyaWZ0IGZpbGUKKy0gW1RIUklGVC0yMTAwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTAwKSAtIHR5cGVkZWZzIGFyZSBub3QgY29ycmVjdGx5IHJlZmVyZW5jZWQgd2hlbiBpbmNsdWRpbmcgZnJvbSBvdGhlciB0aHJpZnQgZmlsZXMKKy0gW1RIUklGVC0yMDY2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDY2KSAtICdtYWtlIGluc3RhbGwnIGRvZXMgbm90IGluc3RhbGwgdHdvIGhlYWRlcnMgcmVxdWlyZWQgZm9yIEMrKyBiaW5kaW5ncworLSBbVEhSSUZULTIwNjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwNjUpIC0gTm90IHZhbGlkIGNvbnN0YW50cyBmaWxlbmFtZSBpbiBKYXZhCistIFtUSFJJRlQtMjA0N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjA0NykgLSBUaHJpZnQuUHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCwgaW50VG9aaWdaYWcgZGF0YSBsb3N0IChUQ29tcGFjdFByb3RvY29sLmNzKQorLSBbVEhSSUZULTIwMzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwMzYpIC0gVGhyaWZ0IGdlbSB3YXJucyBhYm91dCBjbGFzcyB2YXJpYWJsZSBhY2Nlc3MgZnJvbSB0b3AgbGV2ZWwKKy0gW1RIUklGVC0yMDU3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDU3KSAtIFZhZ3JhbnQgZmFpbHMgb24gcGhwIHRlc3RzCistIFtUSFJJRlQtMjEwNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjEwNSkgLSBHZW5lcmF0ZWQgY29kZSBmb3IgZGVmYXVsdCB2YWx1ZXMgb2YgY29sbGVjdGlvbnMgaWdub3JlcyB0X2ZpZWxkOjpUX1JFUVVJUkVECistIFtUSFJJRlQtMjA5MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjA5MSkgLSBVbm5lY2Vzc2FyeSAnZnJpZW5kJyBkZWNsYXJhdGlvbiBjYXVzZXMgd2FybmluZyBpbiBUV2luc29ja1NpbmdsZXRvbgorLSBbVEhSSUZULTIwOTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwOTApIC0gR28gZ2VuZXJhdG9yLCBmaXggaW5jbHVkaW5nIG9mIG90aGVyIHRocmlmdCBmaWxlcworLSBbVEhSSUZULTIxMDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxMDYpIC0gRml4IHN1cHBvcnQgZm9yIG5hbWVzcGFjZXMgaW4gR08gZ2VuZXJhdG9yCistIFtUSFJJRlQtMTc4M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc4MykgLSBDIyBkb2Vzbid0IGhhbmRsZSByZXF1aXJlZCBmaWVsZHMgY29ycmVjdGx5CistIFtUSFJJRlQtMTc4Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc4MikgLSBhc3luYyBvbmx5IGRlZmluZWQgaW4gc2lsdmVybGlnaHQKKy0gW1RIUklGVC0xNzc5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzc5KSAtIE1pc3NpbmcgcHJvY2Vzc19YWFhYIG1ldGhvZCBpbiBnZW5lcmF0ZWQgVFByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsICdvbmV3YXknIHNlcnZpY2UgZnVuY3Rpb25zCistIFtUSFJJRlQtMTY5Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTY5MikgLSBTT19SRVVTRUFERFIgYWxsb3dzIGZvciBzb2NrZXQgaGlqYWNraW5nIG9uIFdpbmRvd3MKKy0gW1RIUklGVC0xNzIwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzIwKSAtIEpSdWJ5IHRpbWVzIG91dCBvbiBzdWNjZXNzZnVsIGNvbm5lY3Rpb24KKy0gW1RIUklGVC0xNzEzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzEzKSAtIE5hbWVkIGFuZCBBbm9ueW1vdXMgUGlwZSB0cmFuc3BvcnQgKERlbHBoaSkKKy0gW1RIUklGVC0xNjk5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjk5KSAtIE5hdGl2ZSBVbmlvbiNyZWFkIGhhcyBleHRyYSByZWFkX2ZpZWxkX2VuZCBjYWxsCistIFtUSFJJRlQtMTc0OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc0OSkgLSBQeXRob24gVFNTTFNvY2tldCBlcnJvciBoYW5kbGluZyBvYnNjdXJlcyBhY3R1YWwgZXJyb3IKKy0gW1RIUklGVC0xNzQ4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzQ4KSAtIEd1YXJkIGFuZCBSV0d1YXJkIG1hY3JvcyBkZWZpbmVkIGluIGdsb2JhbCBuYW1lc3BhY2UKKy0gW1RIUklGVC0xNzM0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzM0KSAtIEZyb250IHdlYnBhZ2UgaXMgc3RpbGwgYWR2ZXJ0aXNpbmcgdjAuOCBhcyBjdXJyZW50IHJlbGVhc2UKKy0gW1RIUklGVC0xNzI5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzI5KSAtIEMgZ2xpYiByZWZhY3RvciBsZWZ0IGVtcHR5IGZvbGRlcnMgaW4gc3ZuCistIFtUSFJJRlQtMTc2N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc2NykgLSB1bmlvbnMgY2FuJ3QgaGF2ZSByZXF1aXJlZCBmaWVsZHMgKERlbHBoaSkKKy0gW1RIUklGVC0xNzY1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzY1KSAtIEluY29ycmVjdCBlcnJvciBtZXNzYWdlIHByaW50ZWQgZm9yIG51bGwgb3IgbmVnYXRpdmUga2V5cworLSBbVEhSSUZULTE3NzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3NzgpIC0gQ29uZmlndXJlIHJlcXVpcmVzIG1hbnVhbCBpbnRlcnZlbnRpb24gZHVlIHRvIHRhciBmYWlsdXJlCistIFtUSFJJRlQtMTc3N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc3NykgLSBUUGlwZVNlcnZlciBpcyBVTlNUT1BQQUJMRQorLSBbVEhSSUZULTE3NTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3NTMpIC0gTXVsdGlwbGUgQysrIFdpbmRvd3MsIE9TWCwgYW5kIGlPUyBwb3J0YWJpbGl0eSBpc3N1ZXMKKy0gW1RIUklGVC0xNzU2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzU2KSAtICdtYWtlIC1qIDgnIGZhaWxzIHdpdGggInVudGVybWluYXRlZCAjaWZkZWYiIGVycm9yCistIFtUSFJJRlQtMTc3M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc3MykgLSBQeXRob24gbGlicmFyeSBzaG91bGQgcnVuIG9uIHB5dGhvbiAyLjQKKy0gW1RIUklGVC0xNzY5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzY5KSAtIHVuaW9ucyBjYW4ndCBoYXZlIHJlcXVpcmVkIGZpZWxkcyAoQysrKQorLSBbVEhSSUZULTE3NjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3NjgpIC0gdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzIChDb21waWxlcikKKy0gW1RIUklGVC0xNjY2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjY2KSAtIGh0b25sbCB1c2FnZSBpbiBUQmluYXJ5UHJvdG9jb2wudGNjIGdlbmVyYXRlcyB3YXJuaW5nIHdpdGggTVNWQzIwMTAKKy0gW1RIUklGVC0xOTE5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTE5KSAtIGxpYnRocmlmdCBkZXBlbmRzIG9uIGh0dHBjb3JlLTQuMS4zIChkaXJlY3RseSkgYW5kIGh0dHBjb3JlLTQuMS40ICh0cmFuc2l0aXZlbHkpCistIFtUSFJJRlQtMTg2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTg2NCkgLSBpbXBsZW1lbnQgZXZlbnQgaGFuZGxlciBmb3Igbm9uLWJsb2NraW5nIHNlcnZlcgorLSBbVEhSSUZULTE4NTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4NTkpIC0gR2VuZXJhdGVkIGVycm9yIGMrKyBjb2RlIHdpdGggLW91dCBhbmQgaW5jbHVkZV9wcmVmaXggcGFyYW0KKy0gW1RIUklGVC0xODY5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODY5KSAtIFRUaHJlYWRQb29sU2VydmVyIChqYXZhKSBkaWVzIHdoZW4gdGhyZWFkcG9vbCBpcyBjb25zdW1lZAorLSBbVEhSSUZULTE4NDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4NDIpIC0gTWVtb3J5IGxlYWsgd2l0aCBQaXBlcworLSBbVEhSSUZULTE4MzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4MzgpIC0gQ2FuJ3QgYnVpbGQgY29tcGlsZXIgb24gT1MgWCBiZWNhdXNlIG9mIG1pc3NpbmcgdGhyaWZ0eS5oCistIFtUSFJJRlQtMTg0Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTg0NikgLSBSZXN0b3JlIHNvY2tldC5oIGhlYWRlciB0byBzdXBwb3J0IGJ1aWxkcyB3aXRoIEFuZHJvaWQgTkRLCistIFtUSFJJRlQtMTg1MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTg1MCkgLSBtYWtlIGNoZWNrIGhhbmdzIG9uIFRTb2NrZXQgdGVzdHMgaW4gVHJhbnNwb3J0VGVzdC5jcHAKKy0gW1RIUklGVC0xODczXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODczKSAtIEJpbmFyeSBwcm90b2NvbCBmYWN0b3J5IGlnbm9yZXMgc3RydWN0IHJlYWQvd3JpdGUgZmxhZ3MKKy0gW1RIUklGVC0xODcyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODcyKSAtIGlzc3VlcyB3aXRoIFRCdWZmZXJlZFRyYW5zcG9ydCBidWZmZXIKKy0gW1RIUklGVC0xOTA0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTA0KSAtIEluY29ycmVjdCBjb2RlIGlzIGdlbmVyYXRlZCBmb3IgdHlwZWRlZnMgd2hpY2ggdXNlIGluY2x1ZGVkIHR5cGVzCistIFtUSFJJRlQtMTkwM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTkwMykgLSBQSFAgbmFtZXNwYWNlcyBjYXVzZSBiaW5hcnkgcHJvdG9jb2xzIHRvIG5vdCBiZSB1c2VkCistIFtUSFJJRlQtMTg5NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTg5NSkgLSBEZWxwaGk6IHJlc2VydmVkIHZhcmlhYmxlIG5hbWUgInJlc3VsdCIgbm90IGRldGVjdGVkIHByb3Blcmx5CistIFtUSFJJRlQtMTg4MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTg4MSkgLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgZG9lcyBub3QgcmVsZWFzZSBvcGVuIGNvbm5lY3Rpb25zIG9yIHRocmVhZHMgb24gc2h1dGRvd24KKy0gW1RIUklGVC0xODg4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODg4KSAtIEphdmEgVGhyaWZ0IGNsaWVudCBjYW4ndCBjb25uZWN0IHRvIFB5dGhvbiBUaHJpZnQgc2VydmVyIG9uIHNhbWUgaG9zdAorLSBbVEhSSUZULTE4MzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4MzEpIC0gQnVnIGluIGxpc3QgZGVzZXJpYWxpemVyCistIFtUSFJJRlQtMTgyNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTgyNCkgLSBtYW55IGNvbXBpbGUgd2FybmluZywgYmVjYXNlIFRocmVhZC5oIGluY2x1ZGVzIGNvbmZpZy5oCistIFtUSFJJRlQtMTgyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTgyMykgLSBNaXNzaW5nIHBhcmVudGhlc2lzIGJyZWFrcyAiSVNfLi4uIiBtYWNybyBpbiBnZW5lcmF0ZWQgY29kZQorLSBbVEhSSUZULTE4MDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4MDYpIC0gUHl0aG9uIGdlbmVyYXRpb24gYWx3YXlzIHRydW5jYXRlcyBfX2luaXRfXy5weSBmaWxlcworLSBbVEhSSUZULTE3OTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3OTUpIC0gUmFjZSBjb25kaXRpb24gaW4gVFRocmVhZGVkU2VydmVyUG9vbCBqYXZhIGltcGxlbWVudGF0aW9uCistIFtUSFJJRlQtMTc5NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc5NCkgLSBDIyBhc3luY2N0cCBicm9rZW4KKy0gW1RIUklGVC0xODA0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODA0KSAtIEJpbmFyeStjb21wYWN0IHByb3RvY29sIHNpbmdsZSBieXRlIGVycm9yIGluIFJ1YnkgbGlicmFyeSAoQVJNIGFyY2hpdGVjdHVyZSk6IGNhdXNlZCBieSBkaWZmZXJlbnQgY2hhciBzaWduZWRuZXNzCistIFtUSFJJRlQtMTgwMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTgwMCkgLSBEb2N1bWVudGF0aW9uIHRleHQgbm90IGFsd2F5cyBlc2NhcGVkIGNvcnJlY3RseSB3aGVuIHJlbmRlcmVkIHRvIEhUTUwKKy0gW1RIUklGVC0xNzg4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzg4KSAtIEMjOiBDb25zdGFudHMgc3RhdGljIGNvbnN0cnVjdG9yIGRvZXMgbm90IGNvbXBpbGUKKy0gW1RIUklGVC0xODE2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODE2KSAtIE5lZWQgInJlcXVpcmUiIGluY2x1ZGVkIHRocmlmdCBmaWxlcyBpbiAieHh4X3R5cGVzLmpzIgorLSBbVEhSSUZULTE5MDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5MDcpIC0gQ29tcGlsaW5nIG5hbWVzcGFjZSBhbmQgc3ViLW5hbWVzcGFjZSBkaXJlY3RpdmVzIGZvciB1bnJlY29nbml6ZWQgZ2VuZXJhdG9ycyBzaG91bGQgb25seSBiZSBhIHdhcm5pbmcKKy0gW1RIUklGVC0xOTEzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTEzKSAtIHNraXBwaW5nIHVua25vd24gZmllbGRzIGluIGphdmEgdW5pb25zCistIFtUSFJJRlQtMjU1M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjU1MykgLSBDKysgbGlua2VyIGVycm9yIC0gdHJhbnNwb3J0L1RTb2NrZXQKKy0gW1RIUklGVC0yNzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI3NCkgLSBUb3dhcmRzIGEgd29ya2luZyByZWxlYXNlL3ZlcnNpb25pbmcgcHJvY2VzcworCisjIyMgRG9jdW1lbnRhdGlvbgorLSBbVEhSSUZULTE5NzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE5NzEpIC0gW0dyYXBodml6XSBBZGRzIHR1dG9yaWFsL2dlbmVyYWwgZGVzY3JpcHRpb24gZG9jdW1lbnRhdGlvbgorLSBbVEhSSUZULTIwMDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwMDEpIC0gaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLyBFeGFtcGxlICJDKysgU2VydmVyIiB0YWIgaXMgYnJva2VuCisKKyMjIyBJbXByb3ZlbWVudAorLSBbVEhSSUZULTE1NzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1NzQpIC0gQXBhY2hlIHByb2plY3QgYnJhbmRpbmcgcmVxdWlyZW1lbnRzOiBET0FQIGZpbGUgW1BBVENIXQorLSBbVEhSSUZULTEzNDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzNDcpIC0gVW5pZnkgdGhlIGV4Y2VwdGlvbnMgcmV0dXJuZWQgaW4gZ2VuZXJhdGVkIEdvIGNvZGUKKy0gW1RIUklGVC0xMzUzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzUzKSAtIFN3aXRjaCB0byBwZXJmb3JtYW5jZSBicmFuY2gsIGdldCByaWQgb2YgQmluYXJ5UGFyc2VyCistIFtUSFJJRlQtMTYyOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTYyOSkgLSBSdWJ5IDEuOSBDb21wYXRpYmlsaXR5IGR1cmluZyBUaHJpZnQgY29uZmlndXJlLCBtYWtlLCBpbnN0YWxsCistIFtUSFJJRlQtOTkxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05OTEpIC0gUmVmYWN0b3IgSGFza2VsbCBjb2RlIGFuZCBnZW5lcmF0b3IKKy0gW1RIUklGVC05OTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk5MCkgLSBTYW5pZnkgZ2V0dGltZW9mZGF5IHVzYWdlIGNvZGViYXNlLXdpZGUKKy0gW1RIUklGVC03OTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTc5MSkgLSBMZXQgQysrIFRTaW1wbGVTZXJ2ZXIgYmUgZHJpdmVuIGJ5IGFuIGV4dGVybmFsIG1haW4gbG9vcAorLSBbVEhSSUZULTIxMTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxMTcpIC0gQ29jb2EgVEJpbmFyeVByb3RvY29sIHN0cmljdFdyaXRlIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBieSBkZWZhdWx0CistIFtUSFJJRlQtMjAxNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjAxNCkgLSBDaGFuZ2UgQysrIGxpYiBpbmNsdWRlcyB0byB1c2UgPG5hbWVzcGFjZS8+IHN0eWxlIHRocm91Z2hvdXQKKy0gW1RIUklGVC0xOTcyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTcyKSAtIEFkZCBzdXBwb3J0IGZvciBhc3luYyBwcm9jZXNzb3JzCistIFtUSFJJRlQtMTk3MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk3MCkgLSBbR3JhcGh2aXpdIEFkZHMgb3B0aW9uIHRvIHJlbmRlciBleGNlcHRpb25zIHJlbGF0aW9uc2hpcHMKKy0gW1RIUklGVC0xOTY2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTY2KSAtIFN1cHBvcnQgZGlmZmVyZW50IGZpbGVzIGZvciBTU0wgY2VydGlmaWNhdGVzIGFuZCBrZXlzCistIFtUSFJJRlQtMTk2NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk2NSkgLSBBZGRzIEdyYXBodml6IChncmFwaCBkZXNjcmlwdGlvbiBsYW5ndWFnZSkgZ2VuZXJhdG9yCistIFtUSFJJRlQtMTk1Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk1NikgLSBTd2l0Y2ggdG8gQXBhY2hlIENvbW1vbnMgTGFuZyAzCistIFtUSFJJRlQtMTk2Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk2MikgLSBNdWx0aXBsZXggcHJvY2Vzc29yIHNob3VsZCBzZW5kIGFueSBUQXBwbGljYXRpb25FeGNlcHRpb24gYmFjayB0byBjbGllbnQKKy0gW1RIUklGVC0xOTYwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTYwKSAtIG1haW4oKSBkZWNsYXJlcyAyMiB1bnVzZWQgZ2VuIGJvb2xzCistIFtUSFJJRlQtMTk1MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk1MSkgLSBsaWJ0aHJpZnQuamFyIGhhcyBzb3VyY2UgZmlsZXMgaW4gaXQKKy0gW1RIUklGVC0xOTk3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTk3KSAtIEFkZCBhY2NlcHQgYmFja2xvZyBjb25maWd1cmF0aW9uIG1ldGhvZCB0byAgVFNlcnZlclNvY2tldAorLSBbVEhSSUZULTIwMDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwMDMpIC0gRGVwcmVjYXRlIHNlbnVtCistIFtUSFJJRlQtMjA1Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjA1MikgLSBWYWdyYW50IG1hY2hpbmUgaW1hZ2UgZGVmYXVsdHMgdG8gb25seSAzODRNQiBvZiBSQU0KKy0gW1RIUklGVC0xOTgwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTgwKSAtIE1vZGVybml6ZSBHbyB0b29saW5nLCBmaXggZ28gY2xpZW50IGxpYmFyeS4KKy0gW1RIUklGVC0xOTc3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTc3KSAtIEMjIGNvbXBpbGVyIHNob3VsZCBnZW5lcmF0ZSBjb25zdGFudCBmaWxlcyBwcmVmaXhlZCB3aXRoIHRocmlmdCBmaWxlIG5hbWUKKy0gW1RIUklGVC0xOTg1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTg1KSAtIGFkZCBhIFZhZ3JhbnRmaWxlIHRvIGJ1aWxkIGFuZCB0ZXN0IEFwYWNoZSBUaHJpZnQgZnVsbHkgcmVwcm9kdWNhYmxlCistIFtUSFJJRlQtMTk5NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk5NCkgLSBEZXByZWNhdGUgc2xpc3QKKy0gW1RIUklGVC0xOTkzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTkzKSAtIEZhY3RvcnkgdG8gY3JlYXRlIGluc3RhbmNlcyBmcm9tIGtub3duIChnZW5lcmF0ZWQpIGludGVyZmFjZSB0eXBlcyB3aXRoIERlbHBoaQorLSBbVEhSSUZULTIwODFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwODEpIC0gU3BlY2lmaWVkIHRpbWVvdXQgc2hvdWxkIGJlIHVzZWQgaW4gVFNvY2tldC5PcGVuKCkKKy0gW1RIUklGVC0yMDg0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDg0KSAtIERlbHBoaTogQWJpbGl0eSB0byBjcmVhdGUgZW50aXR5IFRocmlmdC1nZW5lcmF0ZWQgaW5zdGFuY2VzIGJhc2VkIG9uIFR5cGVJbmZvCistIFtUSFJJRlQtMjA4M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjA4MykgLSBJbXByb3ZlIHRoZSBnbyBsaWI6IGJ1ZmZlcmVkIFRyYW5zcG9ydCwgc2F2ZSBtZW1vcnkgYWxsb2NhdGlvbiwgaGFuZGxlIGNvbmN1cnJlbnQgcmVxdWVzdAorLSBbVEhSSUZULTIxMDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIxMDkpIC0gU2VjdXJlIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBzdXBwb3J0ZWQgaW4gR28KKy0gW1RIUklGVC0yMTA3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMTA3KSAtIG1pbm9yIEdvIGdlbmVyYXRvciBmaXhlcworLSBbVEhSSUZULTE2OTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2OTUpIC0gYWxsb3cgd2FybmluZy1mcmVlIGNvbXBpbGF0aW9uIGluIFZTIDIwMTIgYW5kIEdOVSA0LjYKKy0gW1RIUklGVC0xNzM1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzM1KSAtIGludGVncmF0ZSB0dXRvcmlhbCBpbnRvIHJlZ3VsYXIgYnVpbGQKKy0gW1RIUklGVC0xNzE2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzE2KSAtIG1heCBhbGxvd2VkIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMKKy0gW1RIUklGVC0xNzE1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzE1KSAtIEFsbG93IGV4Y2x1ZGluZyBweXRob24gcGFydHMgd2hlbiBidWlsZGluZyBjb250cmliL2ZiMzAzCistIFtUSFJJRlQtMTczM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTczMykgLSBGaXggUlBNIGJ1aWxkIGlzc3VlcyBvbiBSSEVMNi9PTDYgc3lzdGVtcworLSBbVEhSSUZULTE3MjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3MjgpIC0gVXBncmFkYXRpb24gb2YgaHR0cGNvbXBvbmVudHMKKy0gW1RIUklGVC0xODc2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODc2KSAtIFVzZSBlbnVtIG5hbWVzIGluc3RlYWQgb2YgY2FzdGVkIGludGVnZXJzIGluIGFzc2lnbm1lbnRzCistIFtUSFJJRlQtMTg3NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTg3NCkgLSB0aW1lb3V0IGZvciB0aGUgc2VydmVyLXNpZGUgZW5kIG9mIGEgbmFtZWQgcGlwZQorLSBbVEhSSUZULTE4OTddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4OTcpIC0gU3VwcG9ydCB2YWxpZGF0aW9uIG9mIHJlcXVpcmVkIGZpZWxkcworLSBbVEhSSUZULTE4OTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4OTYpIC0gQWRkIFRCYXNlIHByb3RvY29sIGZvciBDb2NvYQorLSBbVEhSSUZULTE4ODBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4ODApIC0gTWFrZSBuYW1lZCBwaXBlcyBzZXJ2ZXIgd29yayBhc3luY2hyb25vdXNseSAob3ZlcmxhcHBlZCkgdG8gYWxsb3cgZm9yIGNsZWFuIHNlcnZlciBzdG9wcworLSBbVEhSSUZULTE4NzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4NzgpIC0gQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBzZW5kIGN1c3RvbSBoZWFkZXJzCistIFtUSFJJRlQtMTg4Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTg4MikgLSBVc2Ugc2luZ2xlIGluY2x1ZGUKKy0gW1RIUklGVC0xNzkzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzkzKSAtIEMjOiBVc2Ugc3RhdGljIHJlYWQgaW5zdGVhZCBvZiBpbnN0YW5jZSByZWFkCistIFtUSFJJRlQtMTc5OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc5OSkgLSBPcHRpb24gdG8gZ2VuZXJhdGUgSFRNTCBpbiAic3RhbmRhbG9uZSBtb2RlIgorLSBbVEhSSUZULTE4MTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4MTUpIC0gQ29kZSBnZW5lcmF0b3JzIGxpbmUgYnVmZmVyIG91dHB1dAorLSBbVEhSSUZULTE4OTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4OTApIC0gQysrOiBNYWtlIG5hbWVkIHBpcGVzIHNlcnZlciB3b3JrIGFzeW5jaHJvbm91c2x5CistIFtUSFJJRlQtNDc0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NzQpIC0gR2VuZXJhdGluZyBSdWJ5IG9uIFJhaWxzIGZyaWVuZGx5IGNvZGUKKworIyMjIE5ldyBGZWF0dXJlCistIFtUSFJJRlQtODAxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC04MDEpIC0gUHJvdmlkZSBhbiBpbnRlcmFjdGl2ZSBzaGVsbCAoaXJiKSB3aGVuIGdlbmVyYXRpbmcgcnVieSBiaW5kaW5ncworLSBbVEhSSUZULTIyOTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIyOTIpIC0gQW5kcm9pZCBMaWJyYXJ5IFByb2plY3QKKy0gW1RIUklGVC0yMDEyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yMDEyKSAtIE1vZGVybml6aW5nIEdvCistIFtUSFJJRlQtMTk2OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk2OSkgLSBDIzogVGVzdHMgbm90IHByb3Blcmx5IGxpbmtlZCBmcm9tIHRoZSBzb2x1dGlvbgorLSBbVEhSSUZULTE3ODVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3ODUpIC0gQyM6IEFkZCBUTWVtb3J5QnVmZmVyIHNlcmlhbGl6ZXIvZGVzZXJpYWxpemVyCistIFtUSFJJRlQtMTc4MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc4MCkgLSBBZGQgb3B0aW9uIHRvIGdlbmVyYXRlIG51bGxhYmxlIHZhbHVlcworLSBbVEhSSUZULTE3ODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3ODYpIC0gQyMgVW5pb24gVHlwaW5nCistIFtUSFJJRlQtNTkxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC01OTEpIC0gTWFrZSB0aGUgQysrIHJ1bnRpbWUgbGlicmFyeSBiZSBjb21wYXRpYmxlIHdpdGggV2luZG93cyBhbmQgVmlzdWFsIFN0dWRpbworLSBbVEhSSUZULTUxNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNTE0KSAtIEFkZCBvcHRpb24gdG8gY29uZmlndXJlIGNvbXBpbGVyIG91dHB1dCBkaXJlY3RvcnkKKworIyMjIFF1ZXN0aW9uCistIFtUSFJJRlQtMTc2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc2NCkgLSBob3cgdG8gZ2V0IHRoZSBjb250ZXh0IG9mIGNsaWVudCB3aGVuIG9uIGEgcnBjIGNhbGwgaW4gc2VydmVyIHNpZGU/CistIFtUSFJJRlQtMTc5MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTc5MSkgLSB0aHJpZnQncyBuYW1lc3BhY2UgZGlyZWN0aXZlIHdoZW4gZ2VuZXJhdGluZyBoYXNrZWxsIGNvZGUKKworIyMjIFN1Yi10YXNrCistIFtUSFJJRlQtMTU5NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTU5NCkgLSBKYXZhIHRlc3QgY2xpZW50cyBzaG91bGQgaGF2ZSBhIHJldHVybiBjb2RlcyB0aGF0IHJlZmxlY3Qgd2hldGhlciBpdCBzdWNjZWVkcyBvciBub3QuCistIFtUSFJJRlQtMTU5NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTU5NSkgLSBKYXZhIHRlc3Qgc2VydmVyIHNob3VsZCBmb2xsb3cgdGhlIGRvY3VtZW50ZWQgYmVoYXZpb3IgYXMgb2YgVEhSSUZULTE1OTAKKy0gW1RIUklGVC05ODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk4NikgLSBzdDogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeQorLSBbVEhSSUZULTk4NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTg1KSAtIHBocDogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeQorLSBbVEhSSUZULTk4NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTg0KSAtIG9jYW1sOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CistIFtUSFJJRlQtMTkyNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTkyNCkgLSBEZWxwaGk6IEluY29uc2lzdGVuY3kgaW4gc2VyaWFsaXphdGlvbiBvZiBvcHRpb25hbCBmaWVsZHMKKy0gW1RIUklGVC0xOTIyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTIyKSAtIEMjOiBJbmNvbnNpc3RlbmN5IGluIHNlcmlhbGl6YXRpb24gb2Ygb3B0aW9uYWwgZmllbGRzCistIFtUSFJJRlQtMTk2MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTk2MSkgLSBDIyB0ZXN0cyBzaG91bGQgYmUgaW4gbGliL2NzaGFycC90ZXN0Ly4uLgorLSBbVEhSSUZULTE4MjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE4MjIpIC0gUEhQIHVuaXQgdGVzdCBkb2VzIG5vdCB3b3JrCistIFtUSFJJRlQtMTkwMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTkwMikgLSBDKys6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCistIFtUSFJJRlQtMTkwMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTkwMSkgLSBDIzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKy0gW1RIUklGVC0xODk5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODk5KSAtIERlbHBoaTogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKy0gW1RIUklGVC01NjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTU2MykgLSBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorCisjIyAwLjkKKworIyMjIEJ1ZworLSBbVEhSSUZULTE0MzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0MzgpIC0gbGliL2NwcC9zcmMvd2luZG93cy9jb25maWcuaCBzaG91bGQgcmVhZCB2ZXJzaW9uIGZyb20gY29uZmlndXJlLmFjIHJhdGhlciB0aGFuIGEgI2RlZmluZQorLSBbVEhSSUZULTE0NDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0NDYpIC0gQ29tcGlsZSBlcnJvciB3aXRoIERlbHBoaSAyMDA5IGluIGNvbnN0YW50IGluaXRpYWxpemVyCistIFtUSFJJRlQtMTQ1MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQ1MCkgLSBQcm9ibGVtcyBidWlsZGluZyB0aHJpZnQgMC44LjAgZm9yIFB5dGhvbiBhbmQgUnVieQorLSBbVEhSSUZULTE0NDldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0NDkpIC0gUnVieSBjbGllbnQgZG9lcyBub3Qgd29yayBvbiBzb2xhcmlzICg/KQorLSBbVEhSSUZULTE0NDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0NDcpIC0gTnVsbHBvaW50ZXJFeGNlcHRpb24gaW4gUHJvY2Vzc0Z1bmN0aW9uLmNsYXNzIDppbiAib25ld2F5IiBtZXRob2QKKy0gW1RIUklGVC0xNDMzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDMzKSAtIFRTZXJ2ZXJTb2NrZXQgZml4IGZvciBNU1ZDCistIFtUSFJJRlQtMTQyOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQyOSkgLSBUaGUgbm9uYmxvY2tpbmcgc2VydmVycyBpcyBzdXBwb3NlZCB0byB1c2UgVHJhbnNwb3J0RmFjdG9yeSB0byByZWFkIHRoZSBkYXRhCistIFtUSFJJRlQtMTQyN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQyNykgLSBQSFAgbGlicmFyeSB1c2VzIG5vbi1tdWx0aWJ5dGUgc2FmZSBmdW5jdGlvbnMgd2l0aCBtYnN0cmluZyBmdW5jdGlvbiBvdmVybG9hZGluZworLSBbVEhSSUZULTE0MjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0MjEpIC0gRGViaWFuIFBhY2thZ2VzIGNhbiBub3QgYmUgYnVpbHQKKy0gW1RIUklGVC0xMzk0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzk0KSAtIFRyZWF0bWVudCBvZiBvcHRpb25hbCBmaWVsZHMgaXMgbm90IGNvbnNpc3RlbnQgYmV0d2VlbiBDKysgYW5kIEphdmEKKy0gW1RIUklGVC0xNTExXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTExKSAtIFNlcnZlciB3aXRoIG9uZXdheSBzdXBwb3J0ICggSkFWQSApCistIFtUSFJJRlQtMTQ5Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQ5NikgLSBQSFAgY29tcGlsZXIgbm90IG5hbWVzcGFjaW5nIGVudW1zCistIFtUSFJJRlQtMTQ5NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQ5NSkgLSBQSFAgVGVzdENsaWVudCBmYXRhbHMgb24gbWlzc2luZyBjbGFzcworLSBbVEhSSUZULTE1MDhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1MDgpIC0gVFNlcnZlclNvY2tldCBkb2VzIG5vdCBhbGxvdyBmb3IgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgSVAgYWRkcmVzcyB0byBiaW5kIHRvCistIFtUSFJJRlQtMTUwNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTUwNCkgLSBDb2NvYSBHZW5lcmF0b3Igc2hvdWxkIHVzZSBsb2NhbCBmaWxlIGltcG9ydHMgZm9yIGJhc2UgVGhyaWZ0IGhlYWRlcnMKKy0gW1RIUklGVC0xNTEyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTEyKSAtIFRocmlmdCBzb2NrZXQgc3VwcG9ydCBmb3IgV2luZG93cyBYUAorLSBbVEhSSUZULTE1MDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1MDIpIC0gVFNpbXBsZVNlcnZlcjo6c2VydmUoKTogRG8gbm90IHByaW50IG91dCBlcnJvciBtZXNzYWdlIGlmIHNlcnZlciB3YXMgc3RvcHBlZC4KKy0gW1RIUklGVC0xNTAxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTAxKSAtIFBIUCBvbGQgbmFtZXNwYWNlcyBub3QgZ2VuZXJhdGVkIGZvciBlbnVtcworLSBbVEhSSUZULTE0ODNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0ODMpIC0gamF2YSBjb21waWxlciBkb2VzIG5vdCBnZW5lcmF0ZSB0eXBlIHBhcmFtZXRlcnMgZm9yIHNlcnZpY2VzIGluIGV4dGVuZGVkIGNsYXVzZXMKKy0gW1RIUklGVC0xNDc5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDc5KSAtIENvbXBpbGVkIFBIUCBwcm9jZXNzIGZ1bmN0aW9ucyBtaXNzaW5nIHdyaXRlTWVzc2FnZUVuZCgpCistIFtUSFJJRlQtMTQ5Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQ5MikgLSBlbmFibGluZyBjX2dsaWIgcmVuZGVyIHRocmlmdCB1bnVzYWJsZSAoZXZlbiBmb3IgQysrIGNvZGUpCistIFtUSFJJRlQtMTQ5MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQ5MSkgLSBVbmluaXRpYWxpemUgcHJvY2Vzc29yRmFjdG9yeV8gbWVtYmVyIGluIFRTZXJ2ZXIuaAorLSBbVEhSSUZULTE0NzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0NzUpIC0gSW5jb21wbGV0ZSByZWNvcmRzIGdlbmVyYXRpb24gZm9yIEVybGFuZworLSBbVEhSSUZULTE0ODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0ODYpIC0gSmF2YXNjcmlwdCBtYW51YWwgdGVzdHNlcnZlciBub3QgcmV0dXJuaW5nIGNvbnRlbnQgdHlwZXMKKy0gW1RIUklGVC0xNDg4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDg4KSAtIHNyYy9jb25jdXJyZW5jeS9UaHJlYWQuaDo5MTo1ODogZXJyb3I6IGludmFsaWQgY29udmVyc2lvbiBmcm9tICdwdGhyZWFkX3Qge2FrYSBfb3BhcXVlX3B0aHJlYWRfdCp9JyB0byAnYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ6OmlkX3Qge2FrYSBsb25nIGxvbmcgdW5zaWduZWQgaW50fScgWy1mcGVybWlzc2l2ZV0KKy0gW1RIUklGVC0xNDkwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDkwKSAtIFdpbmRvd3Mtc3BlY2lmaWMgaGVhZGVyIGZpbGVzIC0gZml4ZXMgJiB0d2Vha3MKKy0gW1RIUklGVC0xNTI2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTI2KSAtIFVuaW9uIFR1cGxlU2NoZW1lRmFjdG9yeSByZXR1cm5zIFN0YW5kYXJkU2NoZW1lcworLSBbVEhSSUZULTE1MjddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1MjcpIC0gR2VuZXJhdGVkIGltcGxlbWVudGF0aW9uIG9mIHR1cGxlUmVhZFN0cnVjdCBpbiB1bmlvbnMgcmV0dXJuIG51bGwgd2hlbiB0aGUgc2V0ZmllbGQgaXMgdW5yZWNvZ25pemVkCistIFtUSFJJRlQtMTUyNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTUyNCkgLSBUTm9uQmxvY2tpbmdTZXJ2ZXIgZG9lcyBub3QgY29tcGlsZSBpbiBWaXN1YWwgU3R1ZGlvIDIwMTAKKy0gW1RIUklGVC0xNTI5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTI5KSAtIFR1cGxlUHJvdG9jb2wgY2FuIHVuaW50ZW50aW9uYWxseSBpbmNsdWRlIGFuIGV4dHJhIGJ5dGUgaW4gYml0IHZlY3RvcnMgd2hlbiBudW1iZXIgb2Ygb3B0aW9uYWwgZmllbGRzIGlzIGFuIGludGVncmFsIG9mIDgKKy0gW1RIUklGVC0xNDczXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDczKSAtIEpTT04gY29udGV4dCBzdGFjayBtYXkgYmUgbGVmdCBpbiBhbiBpbmNvcnJlY3Qgc3RhdGUgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbnMKKy0gW1RIUklGVC0xNDU2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDU2KSAtIFN5c3RlbS5OZXQuSHR0cFdlYlJlcXVlc3QnIGRvZXMgbm90IGNvbnRhaW4gYSBkZWZpbml0aW9uIGZvciAnUHJveHknCistIFtUSFJJRlQtMTQ2OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQ2OCkgLSBNZW1vcnkgbGVhayBpbiBUU2FzbFNlcnZlclRyYW5zcG9ydAorLSBbVEhSSUZULTE0NjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0NjEpIC0gUmVjZW50IFROb25ibG9ja2luZ1NlcnZlciBjaGFuZ2VzIGJyb2tlIC0tZW5hYmxlLWJvb3N0dGhyZWFkcz15ZXMsIFdpbmRvd3MKKy0gW1RIUklGVC0xNDYwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDYwKSAtIHdoeSBub3QgYWRkIHVuaWNvZGUgc3RyaW5ncyBzdXBwb3J0IHRvIHB5dGhvbiBkaXJlY3RseT8KKy0gW1RIUklGVC0xNDY0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDY0KSAtIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuRnJhbWVCdWZmZXIgVE5vbmJsb2NraW5nVHJhbnNwb3J0IGFjY2Vzc29yIGNoYW5nZWQgZnJvbSBwdWJsaWMgdG8gcHJpdmF0ZQorLSBbVEhSSUZULTE0NjddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0NjcpIC0gUG9zc2libGUgQVYgd2l0aCBlbXB0eSBzdHJpbmdzIHdoZW4gdXNpbmcgSlNPTiBwcm90b2NvbAorLSBbVEhSSUZULTE1MjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1MjMpIC0gY2xpZW50VGltZW91dCBub3Qgd29ya2VkIGFzIGV4cGVjdGVkIGluIFRTZXJ2ZXJTb2NrZXQgY3JlYXRlZCBieSBUU1NMVHJhbnNwb3J0RmFjdG9yeQorLSBbVEhSSUZULTE1MzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1MzcpIC0gVEZyYW1lZFRyYW5zcG9ydCBpc3N1ZXMKKy0gW1RIUklGVC0xNTE5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTE5KSAtIFRoaXJmdCBCdWlsZCBGYWlsdXJlIHJlZmVyZW5jaW5nIHJiX2ludGVybjIgc3ltYm9sCistIFtUSFJJRlQtMTUxOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTUxOCkgLSBHZW5lcmF0ZWQgQysrIGNvZGUgb25seSBzZW5kcyB0aGUgZmlyc3Qgb3B0aW9uYWwgZmllbGQgaW4gdGhlIHdyaXRlKCkgZnVuY3Rpb24gZm9yIGEgc3RydWN0LgorLSBbVEhSSUZULTE1MTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1MTUpIC0gTmFtZUVycm9yOiBnbG9iYWwgbmFtZSAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyBpcyBub3QgZGVmaW5lZAorLSBbVEhSSUZULTE1NTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1NTQpIC0gSW5oZXJpdGVkIHNlcnZpY2UgbWV0aG9kcyBhcmUgbm90IHJlc29sdmVkIGluIGRlcml2ZWQgc2VydmljZSBpbXBsZW1lbnRhdGlvbnMKKy0gW1RIUklGVC0xNTUzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTUzKSAtIHRocmlmdCBub2RlanMgc2VydmljZSBzaWRlIGNhbid0IHJlYWQgbWFwIHN0cnVjdHVyZSwga2V5IGFzIGVudW0sIHZhbHVlIGFzIE9iamVjdAorLSBbVEhSSUZULTE1NzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1NzUpIC0gVHlwbyBpbiBzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaAorLSBbVEhSSUZULTEzMjddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzMjcpIC0gRml4IFNwZWMgU3VpdGUgdW5kZXIgUnVieS0xLjguNyAod29ya3MgZm9yIE1SSSBSdWJ5LTEuOS4yKQorLSBbVEhSSUZULTEzMjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzMjYpIC0gb24gc29tZSBwbGF0Zm9ybXMsICNpbmNsdWRlIDxzdGRpbnQuaD4gaXMgbmVjZXNzYXJ5IHRvIGJlIGluY2x1ZGVkIGluIFRocmlmdC5oCistIFtUSFJJRlQtMTE1OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTE1OSkgLSBUSHR0cENsaWVudC0+Rmx1c2goKSBpc3N1ZSAoY29ubmVjdGlvbiB0aHJ1IHByb3h5KQorLSBbVEhSSUZULTEyNzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyNzcpIC0gTm9kZS5qcyBzZXJpYWxpemVzIGZhbHNlIGJvb2xlYW5zIGFzIG51bGwKKy0gW1RIUklGVC0xMjI0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjI0KSAtIENhbm5vdCBpbnNlcnQgVVRGLTggdGV4dAorLSBbVEhSSUZULTEyNjddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyNjcpIC0gTm9kZS5qcyBjYW4ndCB0aHJvdyBleGNlcHRpb25zLgorLSBbVEhSSUZULTEzMzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzMzgpIC0gRG8gbm90IHVzZSBhbiB1bnBhdGNoZWQgYXV0b2NvbmYgMi42NSB0byBnZW5lcmF0ZSByZWxlYXNlIHRhcmJhbGwKKy0gW1RIUklGVC0xMTI4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTI4KSAtIE1BQyBPUyBYOiB0aHJpZnQuaCBpbmNvbXBhdGliaWxpdHkgd2l0aCBUaHJpZnQuaAorLSBbVEhSSUZULTE2MzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2MzEpIC0gRml4IEMrKyBzZXJ2ZXIgY29uc3RydWN0b3IgdHlwb3MKKy0gW1RIUklGVC0xNjAyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjAyKSAtIFBIUCBDIEV4dGVuc2lvbiBpcyBub3QgQ29tcGF0aWJsZSB3aXRoIFBIUCA1LjQKKy0gW1RIUklGVC0xNjEwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjEwKSAtIElXZWJQcm94eSBub3QgYXZhaWxhYmxlIG9uIFdQNyBwbGF0Zm9ybQorLSBbVEhSSUZULTE2MDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2MDYpIC0gUmFjZSBjb25kaXRpb24gaW4gQm9vc3RUaHJlYWRGYWN0b3J5LmNwcAorLSBbVEhSSUZULTE2MDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2MDQpIC0gUHl0aG9uIGV4Y2VwdGlvbiBoYW5kZWxpbmcgZm9yIGNoYW5nZXMgZnJvbSBQRVAgMzExMAorLSBbVEhSSUZULTE2MDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2MDcpIC0gSW5jb3JyZWN0IGZpbGUgbW9kZXMgZm9yIHNldmVyYWwgc291cmNlIGZpbGVzCistIFtUSFJJRlQtMTU4M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTU4MykgLSBjX2dsaWIgbGVha3MgbWVtb3J5CistIFtUSFJJRlQtMTU4Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTU4MikgLSBCYWQgaW5jbHVkZXMgb2YgbmVzdGVkIHRocmlmdCBmaWxlcyBpbiBjX2dsaWIKKy0gW1RIUklGVC0xNTc4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTc4KSAtIENfR0xpYiBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBjb21waWxlCistIFtUSFJJRlQtMTU5N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTU5NykgLSBUSlNPTlByb3RvY29sLnBocCBpcyBtaXNzaW5nIGZyb20gTWFrZWZpbGUuYW0KKy0gW1RIUklGVC0xNTkxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTkxKSAtIEVuYWJsZSBUQ1BfTk9ERUxBWSBmb3IgcnVieSBnZW0KKy0gW1RIUklGVC0xNjI0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjI0KSAtIElzc2V0IEdlbmVyYXRlZCBkaWZmZXJlbnRseSBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zCistIFtUSFJJRlQtMTYyMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTYyMikgLSBJbmNvcnJlY3Qgc2l6ZSByZXR1cm5lZCBvbiByZWFkCistIFtUSFJJRlQtMTYyMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTYyMSkgLSBNZW1vcnkgbGVha3MKKy0gW1RIUklGVC0xNjEyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjEyKSAtIEJhc2U2NCBlbmNvZGluZyBpcyBicm9rZW4KKy0gW1RIUklGVC0xNjI3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjI3KSAtIGNvbXBpbGVyIGJ1aWx0IHVzaW5nIGNvbXBpbGVycy52Y3hwcm9qIGNhbm5vdCBiZSB1c2VkIHRvIGJ1aWxkIHNvbWUgdGVzdCAudGhyaWZ0IGZpbGVzCistIFtUSFJJRlQtMTU3MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTU3MSkgLSBVcGRhdGUgUnVieSBIVFRQIHRyYW5zcG9ydCBmb3IgcmVjZW50IFJ1YnkgdmVyc2lvbnMKKy0gW1RIUklGVC0xMDIzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDIzKSAtIFRocmlmdCBlbmNvZGluZyAgKFVURi04KSBpc3N1ZSB3aXRoIFJ1YnkgMS45LjIKKy0gW1RIUklGVC0xMDkwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDkwKSAtIERvY3VtZW50IHRoZSBnZW5lcmF0aW9uIG9mIGEgZmlsZSBjYWxsZWQgIkNvbnN0YW50cy5qYXZhIgorLSBbVEhSSUZULTEwODJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwODIpIC0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQgc29tZXRpbWVzIGNhbGxzIGNsb3NlKCkgb24gYW4gdW5kZWZpbmVkIHZhbHVlCistIFtUSFJJRlQtOTU2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05NTYpIC0gUHl0aG9uIG1vZHVsZSdzIHZlcnNpb24gbWV0YS1kYXRhIHNob3VsZCBiZSB1cGRhdGVkCistIFtUSFJJRlQtOTczXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05NzMpIC0gQ29jb2EgbGlicmFyeSB3b24ndCBjb21waWxlIHVzaW5nIGNsYW5nCistIFtUSFJJRlQtMTYzMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTYzMikgLSBydWJ5OiBkYXRhIGNvcnJ1cHRpb24gaW4gdGhyaWZ0X25hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBNZW1vcnlCdWZmZXJUcmFuc3BvcnQKKy0gW1RIUklGVC0xNjY1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjY1KSAtIFRCaW5hcnlQcm90b2NvbDogZXhjZWVkZWQgbWVzc2FnZSBsZW5ndGggcmFpc2VzIGdlbmVyaWMgVEV4Y2VwdGlvbgorLSBbVEhSSUZULTE2NjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NjQpIC0gUmVmZXJlbmNlIHRvIG5vbi1leGlzdGluZyB2YXJpYWJsZSBpbiBidWlsZCBzY3JpcHQKKy0gW1RIUklGVC0xNjYzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjYzKSAtIEphdmEgVGhyaWZ0IHNlcnZlciBpcyBub3QgdGhyb3dpbmcgZXhjZXB0aW9ucworLSBbVEhSSUZULTE2NjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NjIpIC0gInJlbW92ZU9iamVjdDoiIHNob3VsZCBiZSAicmVtb3ZlT2JzZXJ2ZXI6IiBpbiBbLVRTb2NrZXRTZXJ2ZXIgZGVhbGxvY10/CistIFtUSFJJRlQtMTY0M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTY0MykgLSBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2sgaW4gVEJpbmFyeVByb3RvY29sLnJlYWRTdHJpbmcKKy0gW1RIUklGVC0xNjc0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjc0KSAtIFVwZGF0ZSBUaHJpZnQgRCBsaWJyYXJ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCAyLjA2MAorLSBbVEhSSUZULTE2NzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NzMpIC0gUnVieSBjb21waWxlIGZsYWdzIGZvciBleHRlbnNpb24gZm9yIG11bHRpIGFyY2ggYnVpbGRzIChvcyB4KQorLSBbVEhSSUZULTE2NTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NTUpIC0gQ29uZmlndXJlIHN0aWxsIHRyeWluZyB0byB1c2UgdGhyaWZ0X2dlbmVyYXRvcnMgaW4gb3V0cHV0CistIFtUSFJJRlQtMTY1NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTY1NCkgLSBjX2dsaWIgdGhyaWZ0X3NvY2tldF9yZWFkKCkgcmV0dXJucyBjb3JydXB0ZWQgZGF0YQorLSBbVEhSSUZULTE2NTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NTMpIC0gVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIgbGVha3MgQ0xPU0VfV0FJVCBzb2NrZXRzCistIFtUSFJJRlQtMTY1OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTY1OCkgLSBKYXZhIHRocmlmdCBzZXJ2ZXIgaXMgbm90IHRocm93aW5nIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorLSBbVEhSSUZULTE2NTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NTYpIC0gU2V0dGluZyBwcm9wZXIgaGVhZGVycyBpbiBUSHR0cFNlcnZlci5jcHAgc28gdGhhdCAiQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmciIG9uIGpzIGNsaWVudCBjYW4gd29yay4KKy0gW1RIUklGVC0xNjUyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjUyKSAtIFRTYXNsVHJhbnNwb3J0IGRvZXMgbm90IGxvZyB0aGUgZXJyb3Igd2hlbiBrZXJiZXJvcyBhdXRoIGZhaWxzCistIFtUSFJJRlQtMjI3Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMjI3MikgLSBDTE9ORSAtIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjayBpbiBUQmluYXJ5UHJvdG9jb2wucmVhZFN0cmluZworLSBbVEhSSUZULTIwODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTIwODYpIC0gSW52YWxpZCBnZW5lcmF0ZWQgY29kZSBmb3IgTm9kZS5KUyB3aGVuIHVzaW5nIG5hbWVzcGFjZXMKKy0gW1RIUklGVC0xNjg2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjg2KSAtIHRfcGhwX2dlbmVyYXRvci5jYyB1c2VzICJhbmQiIGluc3RlYWQgb2YgIiYmIiwgYW5kIGNhdXNlcyBjb21waWxlciBlcnJvcnMgd2l0aCBWaXN1YWwgU3R1ZGlvCistIFtUSFJJRlQtMTY5M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTY5MykgLSBsaWJ0aHJpZnQgaGFzIGRlcGVuZGVuY3kgb24gdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBodHRwY29yZQorLSBbVEhSSUZULTE2ODldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2ODkpIC0gZG9uJ3QgZXhpdCgtMSkgaW4gVE5vbmJsb2NraW5nU2VydmVyCistIFtUSFJJRlQtMTY3OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTY3OSkgLSBOb2RlSlM6IHByb3RvY29sIHJlYWRTdHJpbmcoKSBzaG91bGQgdHJlYXQgc3RyaW5nIGFzIHV0ZjgsIG5vdCBiaW5hcnkKKy0gW1RIUklGVC0xNzIxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzIxKSAtIERpc3QgYnJva2VuIGR1ZSB0byAwLjguMCB0byAwLjkuMCBjaGFuZ2VzCistIFtUSFJJRlQtMTcxMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTcxMCkgLSBNaW5vciBpc3N1ZXMgaW4gdGVzdCBjYXNlIGNvZGUKKy0gW1RIUklGVC0xNzA5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzA5KSAtIFdhcm5pbmcgIkJpdHdpc2Utb3Igb3BlcmF0b3IgdXNlZCBvbiBhIHNpZ24tZXh0ZW5kZWQgb3BlcmFuZDsgY29uc2lkZXIgY2FzdGluZyB0byBhIHNtYWxsZXIgdW5zaWduZWQgdHlwZSBmaXJzdCIgaW4gVEJpbmFyeVByb3RvY29sLmNzIGF0IFJlYWRJbnQ2NCgpCistIFtUSFJJRlQtMTcwN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTcwNykgLSBbcnVieV0gQWRqdXN0IHNlcnZlcl9zcGVjLnJiIGZvciBSU3BlYyAyLjExLnggYW5kIFJ1YnkgMS45LjMKKy0gW1RIUklGVC0xNjcxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjcxKSAtIENvY29hIGNvZGUgZ2VuZXJhdG9yIGRvZXMgbm90IHB1dCBrZXl3b3JkcyBpbnRvIGdlbmVyYXRlZCBtZXRob2QgY2FsbHMKKy0gW1RIUklGVC0xNjcwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjcwKSAtIEluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIGEgVGhyaWZ0IGludGVyZmFjZQorLSBbVEhSSUZULTE2NjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NjkpIC0gTmFtZUVycm9yOiBnbG9iYWwgbmFtZSAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyBpcyBub3QgZGVmaW5lZAorLSBbVEhSSUZULTE2NjhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NjgpIC0gQ29tcGlsZSBlcnJvciBpbiBjb250cmliL2ZiMzAzLCB0aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKy0gW1RIUklGVC0xODQ1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xODQ1KSAtIEZpeCBjb21waWxlciB3YXJuaW5nIGNhdXNlZCBieSBpbXBsaWNpdCBzdHJpbmcgY29udmVyc2lvbiB3aXRoIFhjb2RlIDQuNgorLSBbVEhSSUZULTMwNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzA0KSAtIEJ1aWxkaW5nIHRoZSBQeXRob24gbGlicmFyeSByZXF1aXJlcyBkZXZlbG9wbWVudCBoZWFkZXJzCistIFtUSFJJRlQtMzY5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjkpIC0gc2V0cyBhbmQgbWFwcyBicmVhayBlcXVhbGl0eQorLSBbVEhSSUZULTU1Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNTU2KSAtIFJ1YnkgY29tcGlsZXIgZG9lcyBub3QgY29ycmVjdGx5IHJlZmVycmVkIHRvIHRvcC1sZXZlbCBtb2R1bGVzIHdoZW4gYSBzdWJtb2R1bGUgbWFza3MgdGhlIHRvcC1sZXZlbCBuYW1lCistIFtUSFJJRlQtNDgxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00ODEpIC0gaW5kZW50YXRpb24gb2YgcnVieSBjbGFzc2VzIGlzIG9mZiBieSBhIGZldworCisjIyMgSW1wcm92ZW1lbnQKKy0gW1RIUklGVC0xNDk4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDk4KSAtIEFsbG93IFRUaHJlYWRlZFBvb2xTZXJ2ZXIuQXJncyB0byBwYXNzIGEgRXhlY3V0b3JTZXJ2aWNlCistIFtUSFJJRlQtMTQ0NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQ0NCkgLSBGdW5jdGlvblJ1bm5lciAtIGFkZCBzeW50YWN0aWMgc3VnYXIgdG8gY3JlYXRlIHNoYXJlZF9wdHJzCistIFtUSFJJRlQtMTQ0M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQ0MykgLSBkZWZpbmUgYSBUUHJvY2Vzc29yIGhlbHBlciBjbGFzcyB0byBpbXBsZW1lbnQgcHJvY2VzcygpCistIFtUSFJJRlQtMTQ0MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQ0MSkgLSBHZW5lcmF0ZSBjb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMgZm9yIGV4Y2VwdGlvbiBjbGFzcyB0byBsZXQgaXQgdXBkYXRlIG1lc3NhZ2UgcHJvcGVydHkgYXV0b21hdGljYWxseS4KKy0gW1RIUklGVC0xNTIwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTIwKSAtIEVtYmVkIHZlcnNpb24gbnVtYmVyIGluIGVybGFuZyAuYXBwIGZpbGUKKy0gW1RIUklGVC0xNDgwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDgwKSAtIHB5dGhvbjogcmVtb3ZlIHRhYnMsIGFkanVzdCB3aGl0ZXNwYWNlIGFuZCBhZGRyZXNzIFBFUDggd2FybmluZ3MKKy0gW1RIUklGVC0xNDg1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDg1KSAtIFBlcmZvcm1hbmNlOiBwYXNzIGxhcmdlIGFuZC9vciByZWZjb3VudGVkIGFyZ3VtZW50cyBhcyAiY29uc3QiCistIFtUSFJJRlQtMTQ4NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQ4NCkgLSBJbnRyb2R1Y2UgcGhwdW5pdCB0ZXN0IHN1aXRlCistIFtUSFJJRlQtMTUzMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTUzMikgLSBUaGUgdHlwZSBzcGVjaWZpY2F0aW9ucyBpbiB0aGUgZ2VuZXJhdGVkIEVybGFuZyBjb2RlIHNob3VsZCBpbmNsdWRlICJ1bmRlZmluZWQiIHdoZXJlIGl0J3MgdXNlZCBhcyBhIGRlZmF1bHQgdmFsdWUKKy0gW1RIUklGVC0xNTM0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTM0KSAtIFJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgRGVscGhpIGNvZGUgZ2VuZXJhdG9yLgorLSBbVEhSSUZULTE0NjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0NjkpIC0gSmF2YSBpc3NldCBzcGFjZSBvcHRpbWl6YXRpb24KKy0gW1RIUklGVC0xNDY1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDY1KSAtIFZpc2liaWxpdHkgb2YgbWV0aG9kcyBpbiBnZW5lcmF0ZWQgamF2YSBjb2RlCistIFtUSFJJRlQtMTQ1M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQ1MykgLSBEb24ndCBjaGFuZ2UgdHlwZXMgb2YgYXJndW1lbnRzIHdoZW4gc2VyaWFsaXppbmcgd2l0aCB0aHJpZnQgcGhwIGV4dGVuc2lvbgorLSBbVEhSSUZULTE0NTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0NTIpIC0gZ2VuZXJhdGUgYSBzd2FwKCkgbWV0aG9kIGZvciBhbGwgZ2VuZXJhdGVkIHN0cnVjdHMKKy0gW1RIUklGVC0xNDUxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDUxKSAtIEZyYW1lZFRyYW5zcG9ydDogUHJldmVudCBpbmZpbml0ZSBsb29wIHdoZW4gd3JpdGluZworLSBbVEhSSUZULTE1MjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1MjEpIC0gVHdvIHBhdGNoZXMgZm9yIG1vcmUgUGVyZm9ybWFuY2UKKy0gW1RIUklGVC0xNTU1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTU1KSAtIERlbHBoaSB2ZXJzaW9uIG9mIHRoZSB0dXRvcmlhbCBjb2RlCistIFtUSFJJRlQtMTUzNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTUzNSkgLSBXaHkgdGhyaWZ0IGRvbid0IHVzZSB3cmFwcGVkIGNsYXNzIGZvciBvcHRpb25hbCBmaWVsZHMgPworLSBbVEhSSUZULTEyMDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyMDQpIC0gUnVieSBhdXRvZ2VuZXJhdGVkIGZpbGVzIHNob3VsZCByZXF1aXJlICd0aHJpZnQnIGdlbQorLSBbVEhSSUZULTEzNDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzNDQpIC0gVXNpbmcgdGhlIGh0dHBjIG1vZHVsZSBkaXJlY3RseSByYXRoZXIgdGhhbiB0aGUgZGVwcmVjYXRlZCBodHRwIGxheWVyCistIFtUSFJJRlQtMTM0M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTM0MykgLSBub19hdXRvX2ltcG9ydCBtaW4vMiB0byBhdm9pZCBjb21waWxlIHdhcm5pbmcKKy0gW1RIUklGVC0xMzQwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzQwKSAtIEFkZCBzdXBwb3J0IG9mIEFSQyB0byBPYmplY3RpdmUtQworLSBbVEhSSUZULTE2MTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2MTEpIC0gSW1wcm92ZWQgY29kZSBnZW5lcmF0aW9uIGZvciB0eXBlZGVmcworLSBbVEhSSUZULTE1OTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1OTMpIC0gUGFzcyBvbiBlcnJvcnMgbGlrZSAiY29ubmVjdGlvbiBjbG9zZWQiIHRvIHRoZSBoYW5kbGVyIG1vZHVsZQorLSBbVEhSSUZULTE2MTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2MTUpIC0gUEhQIE5hbWVzcGFjZQorLSBbVEhSSUZULTE1NjddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1NjcpIC0gVGhyaWZ0L2NwcDogQWxsb3cgYWx0ZXJuYXRlIGNsYXNzZXMgdG8gYmUgdXNlZCBmb3IKKy0gW1RIUklGVC0xMDcyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDcyKSAtIE1pc3NpbmcgLSAoaWQpIGluaXRXaXRoU2hhcmVkUHJvY2Vzc29yIGluIFRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgKKy0gW1RIUklGVC0xNjUwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjUwKSAtIFtydWJ5XSBVcGRhdGUgY2xlYW4gaXRlbXMgYW5kIHN2bjppZ25vcmUgZW50cmllcyBmb3IgT1MgWCBhcnRpZmFjdHMKKy0gW1RIUklGVC0xNjYxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjYxKSAtIFtQQVRDSF0gQWRkIC0td2l0aC1xdDQgY29uZmlndXJlIG9wdGlvbgorLSBbVEhSSUZULTE2NzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NzUpIC0gRG8gd2UgaGF2ZSBhbnkgcGxhbiB0byBzdXBwb3J0IHNjYWxhPworLSBbVEhSSUZULTE2NDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NDUpIC0gUmVwbGFjZSBPYmplY3QjdGVlIHdpdGggbW9yZSBjb252ZW50aW9uYWwgT2JqZWN0I3RhcCBpbiBzcGVjcworLSBbVEhSSUZULTE2NDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NDQpIC0gVXBncmFkZSBSU3BlYyB0byAyLjEwLnggYW5kIHJlZmFjdG9yIHNwZWNzIGFzIG5lZWRlZAorLSBbVEhSSUZULTE2NzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2NzIpIC0gTW9ub1RvdWNoIChhbmQgTW9ubyBmb3IgQW5kcm9pZCkgY29tcGF0aWJpbGl0eQorLSBbVEhSSUZULTE3MDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3MDIpIC0gYSB0aHJpZnQgbWFudWFsCistIFtUSFJJRlQtMTY5NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTY5NCkgLSBSZS1FbmFibGUgc2VyaWFsaXphdGlvbiBmb3IgV1A3IFNpbHZlcmxpZ2h0CistIFtUSFJJRlQtMTY5MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTY5MSkgLSBTZXJpYWxpemVyL2Rlc2VyaWFsaXplciBzdXBwb3J0IGZvciBEZWxwaGkKKy0gW1RIUklGVC0xNjg4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjg4KSAtIFVwZGF0ZSBJREwgcGFnZSBtYXJrdXAKKy0gW1RIUklGVC0xNzI1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzI1KSAtIFR1dG9yaWFsIHdlYiBwYWdlcyBmb3IgRGVscGhpIGFuZCBDIworLSBbVEhSSUZULTE3MTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE3MTQpIC0gW3J1YnldIEV4cGxpY2l0bHkgYWRkIENXRCB0byBSdWJ5IHRlc3Rfc3VpdGVzLnJiCistIFtUSFJJRlQtMzE3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMTcpIC0gSXNzdWVzIHdpdGggSmF2YSBzdHJ1Y3QgdmFsaWRhdGlvbgorLSBbVEhSSUZULTE2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTY0KSAtIEJ1aWxkIHdlYiB0dXRvcmlhbCBvbiBJbmN1YmF0b3Igd2ViIHNpdGUKKy0gW1RIUklGVC01NDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTU0MSkgLSBDb2NvYSBjb2RlIGdlbmVyYXRvciBkb2Vzbid0IHB1dCBrZXl3b3JkcyBiZWZvcmUgYWxsIGFyZ3VtZW50cy4KKy0gW1RIUklGVC02ODFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTY4MSkgLSBUaGUgSFRNTCBnZW5lcmF0b3IgZG9lcyBub3QgaGFuZGxlIEphdmFEb2Mgc3R5bGUgY29tbWVudHMgdmVyeSB3ZWxsCisKKyMjIyBOZXcgRmVhdHVyZQorLSBbVEhSSUZULTE1MDBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE1MDApIC0gRCBwcm9ncmFtbWluZyBsYW5ndWFnZSBzdXBwb3J0CistIFtUSFJJRlQtMTUxMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTUxMCkgLSBUaGVyZSBzaG91bGQgYmUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEpzb25Qcm90b2NvbCBmb3IgcnVieQorLSBbVEhSSUZULTExMTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMTUpIC0gcHl0aG9uIFRCYXNlIGNsYXNzIGZvciBkeW5hbWljIChkZSlzZXJpYWxpemF0aW9uLCBhbmQgX19zbG90c19fIG9wdGlvbiBmb3IgbWVtb3J5IHNhdmluZ3MKKy0gW1RIUklGVC0xOTUzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xOTUzKSAtIHN1cHBvcnQgZm9yIGFzcC5uZXQgbXZjIDMKKworIyMjIFF1ZXN0aW9uCistIFtUSFJJRlQtMTIzNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTIzNSkgLSBIb3cgY291bGQgSSB1c2UgVEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5IHdpdGhUTm9uQmxvY2tpbmdTZXJ2ZXIKKy0gW1RIUklGVC0xMzY4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzY4KSAtIFROb25ibG9ja2luZ1NlcnZlciB1c2FnZQorLSBbVEhSSUZULTEwNjFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwNjEpIC0gUmVhZCBhbiBpbnZhbGlkIGZyYW1lIHNpemUgb2YgMC4gQXJlIHlvdSB1c2luZyBURnJhbWVkVHJhbnNwb3J0IG9uIHRoZSBjbGllbnQgc2lkZT8KKy0gW1RIUklGVC00OTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ5MSkgLSBSaXBwaW5nIHJhdyBwdGhyZWFkcyBvdXQgb2YgVEZpbGVUcmFuc3BvcnQgYW5kIGFzc29jaWF0ZWQgdGVzdCBpc3N1ZXMKKworIyMjIFN1Yi10YXNrCistIFtUSFJJRlQtMTU5Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTU5NikgLSBEZWxwaGk6IFRlc3QgY2xpZW50cyBzaG91bGQgaGF2ZSBhIHJldHVybiBjb2RlcyB0aGF0IHJlZmxlY3Qgd2hldGhlciB0aGV5IHN1Y2NlZWRlZCBvciBub3QKKy0gW1RIUklGVC05ODJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk4MikgLSBqYXZhbWU6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkKKy0gW1RIUklGVC0xNzIyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNzIyKSAtIEMjIFdQNyBBc3NlbWJseSBhZGRpdGlvbiBiZWFrcyBtb25vIGJ1aWxkCistIFtUSFJJRlQtMzM2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zMzYpIC0gQ29tcGFjdCBQcm90b2NvbCBpbiBDIworCisjIyMgVGVzdAorLSBbVEhSSUZULTE2MTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2MTMpIC0gQWRkIGNvZGUgYmFjayBpbnRvIGVtcHR5IHNvdXJjZSBmaWxlIFRvU3RyaW5nVGVzdC5qYXZhCistIFtUSFJJRlQtMTcxOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTcxOCkgLSBJbmNvcnJlY3QgY2hlY2sgaW4gVEZpbGVUcmFuc3BvcnRUZXN0CisKKyMjIyBXaXNoCistIFtUSFJJRlQtMTQ2M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQ2MykgLSBEZWNvdXBsZSBUaHJpZnQgSURMIGZyb20gZ2VuZXJhdG9ycworLSBbVEhSSUZULTE0NjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0NjYpIC0gUHJvcGVyIERvY3VtZW50YXRpb24gZm9yIFRocmlmdCBDIEdsaWIKKy0gW1RIUklGVC0xNTM5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTM5KSAtIEJ1aWxkIGFuZCBkaXN0cmlidXRlIHRoZSBmYjMwMyBweXRob24gbGlicmFyaWVzIGFsb25nIHdpdGggdGhyaWZ0CistIFtUSFJJRlQtMTY4NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTY4NSkgLSBQbGVhc2UgYWRkICJhZXJlby5jb20iIHRvICJQb3dlcmVkIGJ5IEFwYWNoZSBUaHJpZnQiIGxpc3QgaW4gYWJvdXQgcGFnZQorLSBbVEhSSUZULTMzMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzMwKSAtIFRQcm9jZXNzb3IgLSBhZGRpdGlvbmFsIG1ldGhvZCB0byBjYWxsZWQgd2hlbiBjb25uZWN0aW9uIGlzIGJyb2tlbgorCisjIyAwLjgKKworIyMjIEJ1ZworLSBbVEhSSUZULTE0MzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0MzYpIC0gcGlwIGluc3RhbGwgdGhyaWZ0IGZhaWxzIG9uIFdpbmRvd3Mgd2l0aCAiVW5hYmxlIHRvIGZpbmQgdmN2YXJzYWxsLmJhdCIKKy0gW1RIUklGVC0xNDMyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDMyKSAtIEphdmFzY3JpcHQgc3RydWN0IGNvbnN0YW50cyBkZWNsYXJlZCBpbiB0aGUgc2FtZSBmaWxlIGFzIHRoZWlyIHN0cnVjdCBkZWZpbml0aW9uIHdpbGwgY2F1c2UgYW4gZXJyb3IKKy0gW1RIUklGVC0xNDI4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDI4KSAtIHNoYXJlZC50aHJmdCBkb2VzIG5vdCBpbmNsdWRlIG5hbWVzcGFjZSBmb3IgcGhwLCBzbyB0aHJpZnQgY29tcGlsZXIgZ2VuZXJhdGUgaW5jb3JyZWN0IG5hbWUKKy0gW1RIUklGVC0xNDI2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDI2KSAtIERpc3QgcGFja2FnZSBtaXNzaW5nIGZpbGVzIGZvciByZWxlYXNlIDAuOAorLSBbVEhSSUZULTE0MjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0MjUpIC0gVGhlIE5vZGUgcGFja2FnZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXRlc3Qgbm9kZSAoMC42KSAmIG5wbSAoMS4wLjI3KQorLSBbVEhSSUZULTE0MTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0MTYpIC0gUHl0aG9uIFVuaXQgdGVzdCBpcyBicm9rZW4gb24gY2kKKy0gW1RIUklGVC0xNDE5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDE5KSAtIEFic3RyYWN0Tm9uQmxvY2tpbmdTZXJ2ZXIgZG9lcyBub3QgY2F0Y2ggZXJyb3JzIHdoZW4gaW52b2tpbmcgdGhlIHByb2Nlc3NvcgorLSBbVEhSSUZULTE0MjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0MjQpIC0gUnVieSBzcGVjcyBmYWlsIHdoZW4gcnVuIHdpdGggcmFrZQorLSBbVEhSSUZULTE0MjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0MjApIC0gTm9uYmxvY2tpbmcgYW5kIEhzSGEgc2VydmVyIHNob3VsZCBtYWtlIHN1cmUgdG8gY2xvc2UgYWxsIHRoZWlyIHNvY2tldCBjb25uZWN0aW9ucyB3aGVuIHRoZSBzZWxlY3RvciBleGl0cworLSBbVEhSSUZULTE0MTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0MTMpIC0gR2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgcmVhZCBNYXBFbmQgLyBMaXN0RW5kIC8gU2V0RW5kCistIFtUSFJJRlQtMTQwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQwOSkgLSBOYW1lIGNvbmZsaWN0IGNoZWNrIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgZm9yIGV4Y2VwdGlvbiBvYmplY3QoRGVscGhpKS4KKy0gW1RIUklGVC0xNDA4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDA4KSAtIERlbHBoaSBUZXN0IFNlcnZlcjogRXhjZXB0aW9uIHRlc3QgY2FzZSBmYWlscyBkdWUgdG8gbmFtaW5nIGNvbmZsaWN0IHdpdGggZS5tZXNzYWdlCistIFtUSFJJRlQtMTQwN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQwNykgLSBUeXBvIGluIFB5dGhvbiBzb2NrZXQgc2VydmVyIGNhdXNlcyBUaHJpZnQgdG8gZmFpbCB3aGVuIHdlIGVuYWJsZSBhIGdsb2JhbCBzb2NrZXQgdGltb3V0CistIFtUSFJJRlQtMTM5N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTM5NykgLSBDSSBzZXJ2ZXIgZmFpbHMgZHVyaW5nIGJ1aWxkIGR1ZSB0byB1bnVzZWQgcGFyYW1ldGVycyBpbiBkZWxwaGkgZ2VuZXJhdG9yCistIFtUSFJJRlQtMTQwNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQwNCkgLSBEZWxwaGkgY29tcGlsZXIgZ2VuZXJhdGVzIHN0cnVjdCByZWFkZXIgY29kZSB3aXRoIHByb2JsZW0uCistIFtUSFJJRlQtMTQwMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQwMCkgLSBSdWJ5IG5hdGl2ZSBleHRlbnNpb24gYWJvcnRzIHdpdGggX19zdGFja19jaGtfZmFpbCBpbiBPU1gKKy0gW1RIUklGVC0xMzk5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzk5KSAtIE9uZSBvZiB0aGUgVFNlcnZlckltcGwuQ3JlYXRlIENUT1JzIGxhY2tzIGltcGxlbWVudGF0aW9uCistIFtUSFJJRlQtMTM5MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTM5MCkgLSBEZWJpYW4gcGFja2FnZXMgYnVpbGQgZml4IGZvciBTcXVlZXplIChidWlsZCBmcm9tIHRoZSBvZmZpY2lhbCAgMC43LjAgdGFyYmFsbCkKKy0gW1RIUklGVC0xMzkzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzkzKSAtIFRUcmFuc3BvcnRFeGNlcHRpb24ncyB0aHJvd24gZnJvbSBUSHR0cENsaWVudCBjb250YWluIHN1cGVyZmx1b3VzIHNsYXNoZXMgaW4gdGhlIEV4Y2VwdGlvbiBtZXNzYWdlCistIFtUSFJJRlQtMTM5Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTM5MikgLSBFbmFibGluZyBib3RoIG5hbWVzcGFjZXMgYW5kIGF1dG9sb2FkaW5nIGluIGdlbmVyYXRlZCBQSFAgY29kZSB3b24ndCB3b3JrLgorLSBbVEhSSUZULTE0MDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0MDYpIC0gQnVpbGQgZXJyb3IgYWZ0ZXIgYXBwbHlpbmcgVEhSSUZULTEzOTUKKy0gW1RIUklGVC0xNDA1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDA1KSAtIERlbHBoaSBjb21waWxlciBkb2VzIG5vdCBnZW5lcmF0ZXMgY29udGFpbmVyIHNlcmlhbGl6ZXIgcHJvcGVybHkuCistIFtUSFJJRlQtMTQxMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQxMSkgLSBqYXZhIGdlbmVyYXRvciBkb2VzIG5vdCBwcm92aWRlIHR5cGUgcGFyYW1ldGVyIGZvciBUQmFzZVByb2Nlc3NvcgorLSBbVEhSSUZULTE0NzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0NzMpIC0gSlNPTiBjb250ZXh0IHN0YWNrIG1heSBiZSBsZWZ0IGluIGFuIGluY29ycmVjdCBzdGF0ZSB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9ucworLSBbVEhSSUZULTEzMzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzMzEpIC0gUnVieSBsaWJyYXJ5IGRlc2VyaWFsaXplcyBhbiBlbXB0eSBtYXAgdG8gbmlsCistIFtUSFJJRlQtMTMzMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTMzMCkgLSBQSFAgTmFtZXNwYWNlcyBubyBsb25nZXIgZ2VuZXJhdGVkCistIFtUSFJJRlQtMTMyOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTMyOCkgLSBUQmFzZUhlbHBlci50b1N0cmluZyguLi4pIGFwcGVuZHMgQnl0ZUJ1ZmZlciBkYXRhIG91dHNpZGUgb2YgdmFsaWQgYnVmZmVyIHJhbmdlCistIFtUSFJJRlQtMTMyMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTMyMikgLSBPQ2FtbCBsaWIgZmFpbCB0byBjb21waWxlOiBUaHJpZnQubWwgbGluZSAzMDUsIGludCB2cyBpbnQzMiBtaXNtYXRjaAorLSBbVEhSSUZULTExNDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExNDMpIC0gQnVpbGQgZG9lc24ndCBkZXRlY3QgY29ycmVjdCBhcmNoaXRlY3R1cmUgdHlwZSBvbiA2NGJpdCBvc3gKKy0gW1RIUklGVC0xMjA1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjA1KSAtIHBvcnQgc2VydmVyIHVuZHVseSBmcmFnaWxlIHdpdGggYXJiaXRyYXJ5IGlucHV0CistIFtUSFJJRlQtMTI3OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTI3OSkgLSB0eXBlIHNldCBpcyBoYW5kbGVkIGluY29ycmVjdGx5IHdoZW4gd3JpdGluZyBvYmplY3QKKy0gW1RIUklGVC0xMjk4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjk4KSAtIFN0YW5kYXJkIHNjaGVtZSBkb2Vzbid0IHJlYWQgb3Igd3JpdGUgbWV0YWRhdGEgYWxvbmcgd2l0aCBmaWVsZCB2YWx1ZXMKKy0gW1RIUklGVC0xMjY1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjY1KSAtIEMrKyBjb250YWluZXIgZGVzZXJpYWxpemUKKy0gW1RIUklGVC0xMjYzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjYzKSAtIHB1Ymxpc2ggcnVieSBjbGllbnQgdG8gcnVieWdlbXMKKy0gW1RIUklGVC0xMzg0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzg0KSAtIEphdmEgaGVscCBtZW51IG1pc3NpbmcgbmV3bGluZSBuZWFyIGphdmFtZSBmbGFnCistIFtUSFJJRlQtMTM4Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTM4MikgLSBCdW5kbGUgaW5zdGFsbCBkb2Vzbm90IHdvcmsgYmVjYXVzZSB0aHJpZnQgY3Jhc2hlcworLSBbVEhSSUZULTEzODFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzODEpIC0gVGhyaWZ0IEMrKyBsaWJzIGhhdmUgaW5jb3JyZWN0bHkgdmVyc2lvbmVkIG5hbWVzCistIFtUSFJJRlQtMTM1MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTM1MCkgLSBHbyBsaWJyYXJ5IGNvZGUgZG9lcyBub3QgYnVpbGQgYXMgb2YgcjYwIChtb3N0IHJlY2VudCByZWxlYXNlKQorLSBbVEhSSUZULTEzNjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzNjUpIC0gVHVwbGVQcm90b2NvbCN3cml0ZUJpdFNldCB1bmludGVudGlvbmFsbHkgd3JpdGVzIGEgdmFyaWFibGUgbGVuZ3RoIGJ5dGUgYXJyYXkKKy0gW1RIUklGVC0xMzU5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzU5KSAtIC0tZ2VuLWNvYiBjcHA6Y29iX3N0eWxlIGRvZXMgbm90IGNvbXBpbGUgYW55bW9yZQorLSBbVEhSSUZULTEzMTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzMTkpIC0gTWlzbWF0Y2ggYmV0d2VlbiBob3cgYSB1bmlvbiByZWFkcyBhbmQgd3JpdGVzIGEgY29udGFpbmVyCistIFtUSFJJRlQtMTMwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTMwOSkgLSBsaWJmYjMwMy0wLjcuMC5qYXIgbWlzc2luZyBpbiBtYXZlbiByZXBvc2l0b3J5CistIFtUSFJJRlQtMTIzOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTIzOCkgLSBUaHJpZnQgSlMgY2xpZW50IGNhbm5vdCByZWFkIG1hcCBvZiBzdHJ1Y3R1cmVzCistIFtUSFJJRlQtMTI1NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTI1NCkgLSBDb2RlIGNhbid0IGJlIGNvbXBpbGVkIGFnYWluc3QgYSByZWd1bGFyIEpSRTogT2JqZWN0LmNsb25lKCkgb3ZlcnJpZGUgaGFzIGEgZGlmZmVyZW50IHJldHVybiB0eXBlCistIFtUSFJJRlQtMTM2N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTM2NykgLSBNYWMgT1NYIGJ1aWxkIGZhaWxzIHdpdGggIm5vIHN1Y2ggZmlsZSB0byBsb2FkIC0tIHNwZWMvcmFrZS9zcGVjdGFzayIKKy0gW1RIUklGVC0xMzU1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzU1KSAtIFJ1bm5pbmcgbWFrZSBpbiBsaWIvcmIgZG9lc24ndCBidWlsZCB0aGUgbmF0aXZlIGV4dGVuc2lvbnMKKy0gW1RIUklGVC0xMzcwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzcwKSAtIERlYmlhbiBwYWNrYWdpbmcgc2hvdWxkIEJ1aWxkLURlcGVuZCBvbiBsaWJnbGliMi4wLWRldgorLSBbVEhSSUZULTEzNDJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzNDIpIC0gQ29tcGlsYXRpb24gcHJvYmxlbSBvbiBXaW5kb3dzIG9mIGZhc3RiaW5hcnkuYworLSBbVEhSSUZULTEzNDFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzNDEpIC0gVFByb3RvY29sLmggZW5kaWFuIGRldGVjdGlvbiB3cm9uZyB3aXRoIGJvb3N0CistIFtUSFJJRlQtMTU4M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTU4MykgLSBjX2dsaWIgbGVha3MgbWVtb3J5CistIFtUSFJJRlQtMTU4Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTU4MikgLSBCYWQgaW5jbHVkZXMgb2YgbmVzdGVkIHRocmlmdCBmaWxlcyBpbiBjX2dsaWIKKy0gW1RIUklGVC0xNTc4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTc4KSAtIENfR0xpYiBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBjb21waWxlCistIFtUSFJJRlQtMTAyN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTAyNykgLSAnbWFrZSAtaiAxNicgZmFpbHMgd2l0aCAidW50ZXJtaW5hdGVkICNpZmRlZiIgZXJyb3IKKy0gW1RIUklGVC0xMTIxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTIxKSAtIEphdmEgc2VydmVyIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24gaW4gMC42CistIFtUSFJJRlQtODU3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC04NTcpIC0gdGVzdHMgcnVuIGJ5ICJtYWtlIGluc3RhbGwiIGZhaWwgaWYgZ2VuZXJhdG9ycyBhcmUgZGlzYWJsZWQKKy0gW1RIUklGVC0zODBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4MCkgLSBVc2Ugc2V0dXB0b29scyBmb3IgcHl0aG9uIGJ1aWxkCisKKyMjIyBEZXBlbmRlbmN5IHVwZ3JhZGUKKy0gW1RIUklGVC0xMjU3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjU3KSAtIHRocmlmdCdzIGRlcGVuZGVuY3kgc2NvcGUgb24gamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaSBzaG91bGQgYmUgJ3Byb3ZpZGVkJworCisjIyMgSW1wcm92ZW1lbnQKKy0gW1RIUklGVC0xNDQ1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDQ1KSAtIG1pbm9yIEMrKyBnZW5lcmF0b3IgdmFyaWFibGUgY2xlYW51cAorLSBbVEhSSUZULTE0MzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE0MzUpIC0gbWFrZSBURXhjZXB0aW9uLk1lc3NhZ2UgcHJvcGVydHkgY29uZm9ybWFudCB0byB0aGUgdXN1YWwgZXhwZWN0YXRpb25zCistIFtUSFJJRlQtMTQzMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQzMSkgLSBSZW5hbWUgJ3N5cycgbW9kdWxlIHRvICd1dGlsJworLSBbVEhSSUZULTEzOTZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzOTYpIC0gRGVwaGkgZ2VuZXJhdG9yIGhhcyBkZXBlbmRhY3kgb24gYm9vc3QgMS40MiBsYXRlci4KKy0gW1RIUklGVC0xMzk1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzk1KSAtIFBhdGNoIHRvIHByZXZlbnQgd2FybmluZ3MgZm9yIGludGVnZXIgdHlwZXMgaW4gc29tZSBjYXNlcworLSBbVEhSSUZULTEyNzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyNzUpIC0gIHRocmlmdDogYWx3YXlzIHByZWZpeCBuYW1lc3BhY2VzIHdpdGggIiA6OiIKKy0gW1RIUklGVC0xMjc0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjc0KSAtICB0aHJpZnQ6IGZhaWwgY29tcGlsYXRpb24gaWYgYW4gdW5leHBlY3RlZCB0b2tlbiBpcworLSBbVEhSSUZULTEyNzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyNzEpIC0gIHRocmlmdDogZml4IG1pc3NpbmcgbmFtZXNwYWNlIGluIGdlbmVyYXRlZCBsb2NhbAorLSBbVEhSSUZULTEyNzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyNzApIC0gIHRocmlmdDogYWRkIC0tYWxsb3ctbmVnLWtleXMgYXJndW1lbnQgdG8gYWxsb3cKKy0gW1RIUklGVC0xMzQ1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzQ1KSAtIEFsbG93IGJ1aWxkaW5nIHdpdGhvdXQgdGVzdHMKKy0gW1RIUklGVC0xMjg2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjg2KSAtIE1vZGVybml6ZSB0aGUgVGhyaWZ0IFJ1YnkgTGlicmFyeSBEZXYgRW52aXJvbm1lbnQKKy0gW1RIUklGVC0xMjg0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjg0KSAtICB0aHJpZnQ6IGZpeCBwcm9jZXNzb3IgaW5oZXJpdGFuY2UKKy0gW1RIUklGVC0xMjgzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjgzKSAtICB0aHJpZnQ6IHdyYXAgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKCkgdG8gODAKKy0gW1RIUklGVC0xMjgyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjgyKSAtIFVwZ3JhZGUgaHR0cGNsaWVudCB0byA0LjEuMiAoZnJvbSA0LjAuMSkKKy0gW1RIUklGVC0xMjgxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjgxKSAtICBhZGQgQGdlbmVyYXRlZCB0byB0aGUgZG9jYmxvY2sKKy0gW1RIUklGVC0xMjgwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjgwKSAtICBUaHJpZnQ6IEltcHJvdmUgTW9uaXRvciBleGNlcHRpb24tZnJlZSBpbnRlcmZhY2VzCistIFtUSFJJRlQtMTI3OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTI3OCkgLSBqYXZhZG9jIHdhcm5pbmdzIC0gY29tcGlsYXRpb24KKy0gW1RIUklGVC0xMjI3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjI3KSAtIEVybGFuZyBpbXBsZW1lbnRhdGlvbiBvZiB0aHJpZnQgSlNPTiBwcm90b2NvbAorLSBbVEhSSUZULTEyOTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyOTUpIC0gRHVwbGljYXRlIGluY2x1ZGUgaW4gVFNvY2tldC5jcHAKKy0gW1RIUklGVC0xMjk0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjk0KSAtICB0aHJpZnQ6IGZpeCBsb2cgbWVzc2FnZSB0eXBvcyBpbiBUU2ltcGxlU2VydmVyCistIFtUSFJJRlQtMTI5M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTI5MykgLSAgdGhyaWZ0OiBpbXByb3ZlIGhhbmRsaW5nIG9mIGV4Y2VwdGlvbnMgdGhyb3duIGJ5CistIFtUSFJJRlQtMTI5Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTI5MikgLSAgdGhyaWZ0OiBzaWxlbmNlIGxvZyBzcGV3IGZyb20gVFRocmVhZGVkU2VydmVyCistIFtUSFJJRlQtMTI4OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTI4OCkgLSAgQWxsb3cgdHlwZWRlZmVkIGV4Y2VwdGlvbnMgaW4gdGhyb3dzIGNsYXVzZXMKKy0gW1RIUklGVC0xMjkwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjkwKSAtICB0aHJpZnQ6IFROb25ibG9ja2luZ1NlcnZlcjogY2xlYW4gdXAgc3RhdGUgaW4gdGhlCistIFtUSFJJRlQtMTI4N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTI4NykgLSAgdGhyaWZ0OiBzdGFydCByZWZhY3RvcmluZyBzb21lIG9mIHRoZSBDKysgcHJvY2Vzc29yCistIFtUSFJJRlQtMTI4OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTI4OSkgLSAgdGhyaWZ0OiBpbXBsZW1lbnQgVE5vbmJsb2NraW5nU2VydmVyOjpzdG9wKCkKKy0gW1RIUklGVC0xMzA1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzA1KSAtICB0aHJpZnQ6IG1ha2UgVENvbm5lY3Rpb24gYSBwcml2YXRlIGlubmVyIGNsYXNzIG9mCistIFtUSFJJRlQtMTMwNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTMwNCkgLSAgVE5vbmJsb2NraW5nU2VydmVyOiBwYXNzIGluIHRoZSBjb25uZWN0aW9uIGNvbnRleHQgdG8KKy0gW1RIUklGVC0xMzAyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzAyKSAtICB0aHJpZnQ6IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBzZW5kKCkgdGltZXMgb3V0IGluCistIFtUSFJJRlQtMTMwMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTMwMSkgLSAgdGhyaWZ0OiBjb25zb2xpZGF0ZSBjb21tb24gY29kZSBpbiBUTm9uYmxvY2tpbmdTZXJ2ZXIKKy0gW1RIUklGVC0xMzc3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzc3KSAtIGFib3J0IFBIUCBkZXNlcmlhbGl6YXRpb24gb24gdW5rbm93biBmaWVsZCB0eXBlCistIFtUSFJJRlQtMTM3OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTM3OSkgLSBmaXggdW5pbml0aWFsaXplZCBlbnVtIHZhbHVlcyBpbiB0aHJpZnQgQysrIG9iamVjdHMKKy0gW1RIUklGVC0xMzc2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzc2KSAtIE1ha2UgcG9ydCBzcGVjaWZpY2F0aW9uIG9wdGlvbiBpbiB0aHJpZnQgcmVtb3RlCistIFtUSFJJRlQtMTM3NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTM3NSkgLSBmaXhlZCBhIGhleCBjaGFyIGNvbnZlcnNpb24gYnVnIGluIFRKU09OUHJvdG9jb2wKKy0gW1RIUklGVC0xMzczXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzczKSAtIEZpeCB1c2VyLWRlZmluZWQgZXhjZXB0aW9uIGdlbmVyYXRpb24gaW4gdGhyaWZ0IChweXRob24pCistIFtUSFJJRlQtMTM2MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTM2MSkgLSBPcHRpb25hbCByZXBsYWNlbWVudCBvZiBwdGhyZWFkIGJ5IGJvb3N0Ojp0aHJlYWQKKy0gW1RIUklGVC0xMzIwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzIwKSAtIENvbnNpc3RlbmN5IG9mIGNvbmZpZ3VyZSBnZW5lcmF0ZWQgY29uZmlnLmgKKy0gW1RIUklGVC0xMzE3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzE3KSAtICBSZW1vdmUgY29weSBjb25zdHJ1Y3RpYmlsaXR5IGZyb20KKy0gW1RIUklGVC0xMzE2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzE2KSAtICB0aHJpZnQ6IHVwZGF0ZSBzZXJ2ZXIgY2xhc3NlcyB0byBhY2NlcHQKKy0gW1RIUklGVC0xMzE1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzE1KSAtICB0aHJpZnQ6IGdlbmVyYXRlIHNlcnZlciBpbnRlcmZhY2UgZmFjdG9yeSBjbGFzc2VzCistIFtUSFJJRlQtMTMxNF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTMxNCkgLSAgdGhyaWZ0OiBhZGQgVFByb2Nlc3NvckZhY3RvcnkKKy0gW1RIUklGVC0xMzM1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzM1KSAtICBBZGQgYWNjZXB0IHRpbWVvdXQgdG8gVFNlcnZlclNvY2tldAorLSBbVEhSSUZULTEzMzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzMzQpIC0gIEFkZCBtb3JlIGluZm8gdG8gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCistIFtUSFJJRlQtMTMzM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTMzMykgLSAgTWFrZSBSV0d1YXJkIG5vdCBjb3B5YWJsZQorLSBbVEhSSUZULTEzMzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzMzIpIC0gVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMgY2xhc3MgdXNlcyBoYXJkIGNvZGVkIHZhbHVlIGtleU1hbmFnZXJUeXBlOiBTdW5YNTA5CistIFtUSFJJRlQtMTI1MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTI1MSkgLSBHZW5lcmF0ZWQgamF2YSBjb2RlIHNob3VsZCBpbmRpY2F0ZSB3aGljaCBmaWVsZHMgYXJlIHJlcXVpcmVkIGFuZCB3aGljaCBhcmUgb3B0aW9uYWwKKy0gW1RIUklGVC0xMzg3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMzg3KSAtIEJ1aWxkIE1TVkMgbGlicmFyaWVzIHdpdGggQm9vc3QgVGhyZWFkcyBpbnN0ZWFkIG9mIFB0aHJlYWRzCistIFtUSFJJRlQtMTMzOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTMzOSkgLSBFeHRlbmQgVHVwbGUgUHJvdG9jb2wgdG8gVFVuaW9ucworLSBbVEhSSUZULTEwMzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwMzEpIC0gUGF0Y2ggdG8gY29tcGlsZSBUaHJpZnQgZm9yIHZjKysgOS4wIGFuZCAxMC4wCistIFtUSFJJRlQtMTEzMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTEzMCkgLSBBZGQgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBzeW1ib2xpYyBkZWZhdWx0IHZhbHVlIGZvciBvcHRpb25hbCBib29sZWFuCistIFtUSFJJRlQtMTEyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTEyMykgLSBQYXRjaCB0byBjb21waWxlIFRocmlmdCBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgdmMrKyA5LjAgYW5kIDEwLjAKKy0gW1RIUklGVC0zODZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM4NikgLSBNYWtlIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIHRoZSBQeXRob24gbGlicmFyeSB3aXRob3V0IHRoZSBleHRlbnNpb24KKworIyMjIE5ldyBGZWF0dXJlCistIFtUSFJJRlQtMTQwMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTQwMSkgLSBKU09OLXByb3RvY29sIGZvciBEZWxwaGkgWEUgTGlicmFyaWVzCistIFtUSFJJRlQtMTE2N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTE2NykgLSBKYXZhIG5vbmJsb2NraW5nIHNlcnZlciB3aXRoIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGZvciBzZWxlY3QgYW5kIGhhbmRsaW5nIElPCistIFtUSFJJRlQtMTM2Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTM2NikgLSBEZWxwaGkgZ2VuZXJhdG9yLCBsaXJicmFyeSBhbmQgdW5pdCB0ZXN0LgorLSBbVEhSSUZULTEzNTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzNTQpIC0gQWRkIHJha2UgdGFzayB0byBidWlsZCBqdXN0IHRoZSBnZW0gZmlsZQorLSBbVEhSSUZULTc2OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNzY5KSAtIFBsdWdnYWJsZSBTZXJpYWxpemVycworCisjIyMgU3ViLXRhc2sKKy0gW1RIUklGVC0xNDE1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNDE1KSAtIGRlbHBoaTogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeQorLSBbVEhSSUZULTEzOTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEzOTEpIC0gSW1wcm92ZWQgRGVscGhpIFhFIHRlc3QgY2FzZXMKKworIyMgMC43CisKKyMjIyBCdWcKKy0gW1RIUklGVC0xMTQwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTQwKSAtIEZyYW1lZCBUcmFuc3BvcnQgQ2xpZW50IHVzaW5nIEMgKEdsaWIpIExpYnJhcnkgaGFuZ3Mgd2hlbiBjb25uZWN0aW5nIHRvIFJ1YnkgU2VydmVyCistIFtUSFJJRlQtMTE1NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTE1NCkgLSBIdHRwQ2xpZW50IGRvZXMgbm90IHNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gY2xvc2UgcGFyYW1ldGVyCistIFtUSFJJRlQtMTE1M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTE1MykgLSBIdHRwQ2xpZW50IGRvZXMgbm90IHNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gY2xvc2UgcGFyYW1ldGVyCistIFtUSFJJRlQtMTE0OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTE0OSkgLSBOb25ibG9ja2luZyBzZXJ2ZXIgZmFpbHMgd2hlbiBjbGllbnQgY29ubmVjdGlvbiBpcyByZXNldAorLSBbVEhSSUZULTExNDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExNDYpIC0gQW5kcm9pZCBJbmNvbXBhdGliaWxpdHkgOiBpbiBBbmRyb2lkIDwgMi4zIGphdmEuaW8uSU9FeGNlcHRpb24gZG9lc24ndCBzdXBwb3J0IGZvciBUaHJvd2FibGUgcGFyYW1ldGVyIGluIGNvbnN0cnVjdG9yCistIFtUSFJJRlQtMTEzM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTEzMykgLSBKYXZhIGFuZCBKYXZhU2NyaXB0IHR1dG9yaWFsIGlzIGJyb2tlbiBzaW5jZSB3ZSBoYXZlIEphdmEgbWF2ZW4gZGVwbG95bWVudAorLSBbVEhSSUZULTExMzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMzIpIC0gRGVzZXJpYWxpemF0aW9uIGVycm9yIGluIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBDIworLSBbVEhSSUZULTExMzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMzEpIC0gQyMgSlNPTiBQcm90b2NvbCBpcyB1bmFibGUgdG8gZGVjb2RlIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBzdHJpbmcKKy0gW1RIUklGVC0xMjA4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjA4KSAtIHB5dGhvbiBUQ29tcGFjdFByb3RvY29sLnB5IHdyaXRlQm9vbCBhbmQgcmVhZEJvb2wgbm90IGZvbGxvdyB0aGUgY29tcGFjdC1wcm90by1zcGVjLTIudHh0IHNwZWMgZm9yIENPTlRBSU5FUl9XUklURSwgQ09OVEFJTkVSX1JFQUQKKy0gW1RIUklGVC0xMjAwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjAwKSAtIEpTIGNvbXBpbGVyIGdlbmVyYXRlcyBjb2RlIHRoYXQgY2xvYmJlcnMgZXhpc3RpbmcgbmFtZXNwYWNlcworLSBbVEhSSUZULTExODNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExODMpIC0gUHVyZS1ydWJ5IENvbXBhY3RQcm90b2NvbCByYWlzZXMgQXJndW1lbnRFcnJvciB3aGVuIGRlc2VyaWFsaXppbmcgdW5kZXIgUnVieSAxLjkKKy0gW1RIUklGVC0xMTgyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTgyKSAtIE5hdGl2ZSBkZXNlcmlhbGl6ZXIgc2VnZmF1bHRzIG9uIGluY29ycmVjdCBsaXN0IGVsZW1lbnQgdHlwZQorLSBbVEhSSUZULTExODFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExODEpIC0gQVMzIGNvbXBpbGVyIGdlbmVyYXRlcyBpbmNvcnJlY3QgY29kZSBmb3Igc2V0dGluZyBkZWZhdWx0IHZhbHVlcyBpbiBjb25zdHJ1Y3RvcgorLSBbVEhSSUZULTEyMzRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyMzQpIC0gdGhyaWZ0IC0taGVscCBpcyBtaXNzaW5nIGRvYyBvbiBweTp1dGY4c3RyaW5ncworLSBbVEhSSUZULTExODBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExODApIC0gQVMzIGNvbXBpbGVyIGdlbmVyYXRlcyB1bmNvbXBpbGFibGUgY29kZSBmb3IgYmluYXJ5IHR5cGVzLgorLSBbVEhSSUZULTExOTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExOTQpIC0gSmF2YSBsaWIgZG9lcyBub3QgaW5zdGFsbCBhcnRpZmFjdHMgdG8gbG9jYWwgZGlyIGNvcnJlY3RseQorLSBbVEhSSUZULTExOTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExOTMpIC0gUG90ZW50aWFsIGluZmluaXRlIGxvb3AgaW4gbm9uYmxvY2tpbmdfc2VydmVyCistIFtUSFJJRlQtMTE5Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTE5MikgLSBUeXBvOiBUUHJvdG9jb2wuaCB0ZXN0cyBmb3IgSEFWRV9TWVNfUEFSQU1fSF8KKy0gW1RIUklGVC0xMTkwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTkwKSAtIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZCBpbiBUTm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBzaG91bGQgYmUgQXRvbWljTG9uZyB0byBmaXggRkQgbGVha2FnZSBhbmQgZ2VuZXJhbCBzZXJ2ZXIgbWFsZnVuY3Rpb24KKy0gW1RIUklGVC0xMTg3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTg3KSAtIG5vbmJsb2NraW5nX3NlcnZlciBzaHV0ZG93biByYWNlIHVuZGVyIFJ1YnkgMS45CistIFtUSFJJRlQtMTE3OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTE3OCkgLSBKYXZhOiBUQmFzZSBzaWduYXR1cmUgc2hvdWxkIGJlIFQgZXh0ZW5kcyBUQmFzZTw/LD8+CistIFtUSFJJRlQtMTE2NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTE2NCkgLSBTZWdtZW50YXRpb24gZmF1bHQgb24gTlVMTCBwb2ludGVyIGluIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdAorLSBbVEhSSUZULTExNzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExNzEpIC0gUGVybCB3cml0ZS9yZWFkRG91YmxlIGFzc3VtZXMgbGl0dGxlLWVuZGlhbiBwbGF0Zm9ybQorLSBbVEhSSUZULTEyMjJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyMjIpIC0gVW5oYW5kbGVkIGV4Y2VwdGlvbiBmb3IgVEV2aHR0cFNlcnZlciByZXF1ZXN0CistIFtUSFJJRlQtMTIyMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTIyMCkgLSBUUHJvY2Vzc29yOjpwcm9jZXNzIG5ldmVyIHJldHVybnMgZmFsc2UKKy0gW1RIUklGVC0xMjg1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjg1KSAtIFN0YWJsZSAwLjcuMCBXaW5kb3dzIGNvbXBpbGVyIGV4ZSBhdmFpbGFibGUgb24gdGhlIHdlYnNpZGUgaXMgbm90IHRoZSBnb29kIG9uZQorLSBbVEhSSUZULTEyMThdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyMTgpIC0gY19nbGliIHVzZXMgd3JvbmcgbmFtZSBpbiBwa2ctY29uZmlnCistIFtUSFJJRlQtMTIxNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTIxNSkgLSBVbmRlZmluZWQgcHJvcGVydHkgVGhpcmZ0IGluIGxpYi9qcy90aHJpZnQuanMKKy0gW1RIUklGVC0xMjExXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjExKSAtIFdoZW4gdXNpbmcgVEh0dHBDbGllbnQsIG5vbiAyMDAgcmVzcG9uc2VzIGxlYXZlIHRoZSBjb25uZWN0aW9uIG9wZW4KKy0gW1RIUklGVC0xMjI4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjI4KSAtIFRoZSBwaHAgYWNjZWxlcmF0b3IgbW9kdWxlIGNhbGxzIGZsdXNoIGluY29ycmVjdGx5CistIFtUSFJJRlQtMTMwOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTMwOCkgLSBsaWJmYjMwMy0wLjcuMC5qYXIgbWlzc2luZyBpbiBtYXZlbiByZXBvc2l0b3J5CistIFtUSFJJRlQtMTI1NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTI1NSkgLSBNaXNtYXRjaCBvZiBtZXRob2QgbmFtZSBiZXR3ZWVuIEphdmFNRSdzIGxpYiBhbmQgZ2VuZXJhdGVkIGNvZGUgKGNvbXBhcmVUby9jb21wYXJlT2JqZWN0cykKKy0gW1RIUklGVC0xMjUzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjUzKSAtIENvZGUgZ2VuZXJhdGVkIGZvciBtYXBzIGlzIG5vdCBjb21waWxpbmcKKy0gW1RIUklGVC0xMjUyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjUyKSAtIFNlZ2ZhdWx0IGluIFJ1YnkgZGVzZXJpYWxpemVyCistIFtUSFJJRlQtMTA5NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTA5NCkgLSBidWcgaW4gVENvbXBhY3RQcm90byBweXRob24gcmVhZE1lc3NhZ2VFbmQgbWV0aG9kIGFuZCB1cGRhdGVkIHRlc3QgY2FzZXMKKy0gW1RIUklGVC0xMDkzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDkzKSAtIHNldmVyYWwgYnVncyBpbiBweXRob24gVENvbXBhY3RQcm90b2NvbAorLSBbVEhSSUZULTEwOTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwOTIpIC0gZ2VuZXJhdGVkIHZhbGlkYXRlKCkgbWV0aG9kIGhhcyB3cm9uZyBpbmRlbnRhdGlvbgorLSBbVEhSSUZULTEwMTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwMTEpIC0gRXJyb3IgZ2VuZXJhdGluZyBwYWNrYWdlIGltcG9ydHMgd2hlbiB1c2luZyBjbGFzc2VzIGZyb20gb3RoZXIgcGFja2FnZXMKKy0gW1RIUklGVC0xMDUwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDUwKSAtIERlY2xhcmluZyBhbiBhcmd1bWVudCBuYW1lZCAibWFuYWdlciIgdG8gYSBzZXJ2aWNlIG1ldGhvZCBwcm9kdWNlcyBjb2RlIHRoYXQgZmFpbHMgY29tcGlsZSBkdWUgdG8gbmFtZSBjb25mbGljdHMgd2l0aCBwcm90ZWN0ZWQgaXZhcnMgaW4gVEFzeW5jQ2xpZW50CistIFtUSFJJRlQtMTA3NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTA3NCkgLSAua2V5c3RvcmUgYW5kIC50cnVzdHN0b3JlIGFyZSBtaXNzaW5nIGZyb20gdGhlIDAuNi4wIGRpc3RyaWJ1dGlvbgorLSBbVEhSSUZULTEwNjddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwNjcpIC0gVG9ucyBvZiBidWdzIGluIHBocCBpbXBsZW1lbnRhdGlvbgorLSBbVEhSSUZULTEwNjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwNjUpIC0gVW5leHBlY3RlZCBleGNlcHRpb25zIG5vdCBwcm9wZXIgaGFuZGxlZCBvbiBKUworLSBbVEhSSUZULTEwNzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwNzYpIC0gRXJsYW5nIFRocmlmdCBzb2NrZXQgc2VydmVyIGhhcyBhIGJ1ZyB0aGF0IGNhdXNlcyBqYXZhIHRocmlmdCBjbGllbnQgb2YgZnJhbWVkIGJpbmFyeSBjbGllbnQgdG8gdGhyb3cgIm91dCBvZiBzZXF1ZW5jZSIgZXhjZXB0aW9uCistIFtUSFJJRlQtMTA1N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTA1NykgLSBjYXN0cyBpbiBUQmluYXJ5UHJvdG9jb2wudGNjIGNhdXNpbmcgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIgd2FybmluZ3MgZnJvbSBnY2MKKy0gW1RIUklGVC0xMDU1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDU1KSAtIGNzaGFycCBUU2VydmVyU29ja2V0IGFuZCBUU29ja2V0IGRvIG5vdCBkaXNhYmxlIE5hZ2xlIHZpYSBTb2NrZXQuTm9EZWxheSA9IHRydWUgbGlrZSBjcHAgYW5kIGphdmEgZG8KKy0gW1RIUklGVC0xMDU0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDU0KSAtIGV4cGxpY2l0IGNhbGwgdG8gUEtHX1BST0dfUEtHX0NPTkZJRyBpcyBtaXNzaW5nIGFuZCBmaXJzdCB1c2Ugb2YgUEtHX0NIRUNLX01PRFVMRVMgbWF5IG5vdCBoYXBwZW4sIGNhdXNlcyBtb25vIGRldGVjdGlvbiB0byBmYWlsCistIFtUSFJJRlQtMTExN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTExNykgLSBKYXZhU2NyaXB0IFVuaXQgVGVzdCBkb2VzIG5vdCB3b3JrIGFueW1vcmUgYmVjYXVzZSBsaWJ0aHJpZnQqLmphciB3aGVyZSBtb3ZlZCBieSBNYXZlbiBEZXBsb3ltZW50CistIFtUSFJJRlQtMTExMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTExMSkgLSBUaGUgSFRNTCBnZW5lcmF0b3IgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBzdHJpbmcgYW5kIGJpbmFyeSB0eXBlcworLSBbVEhSSUZULTEwMzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwMzIpIC0gIm1ha2UgZGlzdCIgZmFpbHMgZHVlIHRvIGNfZ2xpYiBwcm9ibGVtCistIFtUSFJJRlQtMTAzNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTAzNikgLSBBdXRvLWdlbmVyYXRlZCBDKysgY29kZSBmYWlscyB0byBjb21waWxlIHdpdGggIi1XZXJyb3IgLVdleHRyYSAtV2FsbCIgZysrIGNvbXBpbGVyIGZsYWdzCistIFtUSFJJRlQtMTA0MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTA0MSkgLSBURGVzZXJpYWxpemVyIGhvbGRzIG9udG8gYSByZWZlcmVuY2Ugb2YgdGhlIGFycmF5IGl0IHJlYWRzIGFmdGVyIGl0IGlzIGRvbmUgZGVzZXJpYWxpemluZworLSBbVEhSSUZULTExMDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMDYpIC0gQysrIGNvZGUgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaCAmIFRBc3luY0J1ZmZlclByb2Nlc3Nvci5oIGRvbnQgaGF2ZSB2aXJ0dWFsIGZ1bmN0aW9ucyBidXQgbm8gdmlydHVhbCBkZXN0cnVjdG9yLiBDYXVzZXMgd2FybmluZ3Mgb24gLVdhbGwKKy0gW1RIUklGVC0xMTA1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTA1KSAtIE9DYW1sIGdlbmVyYXRvciBkb2VzIG5vdCBwcmVmaXggbWV0aG9kcyBvZiBpbmNsdWRlZCBzdHJ1Y3RzIHdpdGggdGhlaXIgdHlwZQorLSBbVEhSSUZULTExMDRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMDQpIC0gSU5TVEFMTERJUlMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGNvbmZpZ3VyZSBzY3JpcHQKKy0gW1RIUklGVC0xMTAyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTAyKSAtIHR5cG8gaW4gY29uZmlndXJlLmFjOiAiPT0iIG9wZXJhdG9yIGluICd0ZXN0JyAoaW5zdGVhZCBvZiInPSIpCistIFtUSFJJRlQtMTEwMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTEwMSkgLSBieXRlYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbiBpbiBUQmluYXJ5UHJvdG9jb2wgd3JpdGVCaW5hcnkKKy0gW1RIUklGVC0xMDk4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDk4KSAtIFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGluIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkKKy0gW1RIUklGVC0xMDgxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDgxKSAtIFBIUCB0ZXN0cyBicm9rZW4gYW5kIHNvbWV3aGF0IGluY29tcGxldGUKKy0gW1RIUklGVC0xMDgwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDgwKSAtIGVybGFuZyB0ZXN0J3MgJ21ha2UnIGZhaWxzIG9uIE1hYyBPU1gKKy0gW1RIUklGVC0xMDc4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDc4KSAtIFRocmlmdFRlc3QudGhyaWZ0IGdlbmVyYXRlcyBpbnZhbGlkIFBIUCBsaWJyYXJ5CistIFtUSFJJRlQtMTEyMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTEyMCkgLSBwcm90by5Xcml0ZUxpc3RFbmQgYmVpbmcgY2FsbGVkIGluIHRoZSB3cm9uZyBwbGFjZQorLSBbVEhSSUZULTExMTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMTkpIC0gVEpTT05Qcm90b2NvbCBmYWlscyB0byBVVEY4IGRlY29kZSBzdHJpbmdzCistIFtUSFJJRlQtODY3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC04NjcpIC0gUEhQIGFjY2VsZXJhdG9yIG1vZHVsZSdzIG91dHB1dCB0cmFuc3BvcnQgaXMgaW5jb21wYXRpYmxlIHdpdGggVEZyYW1lZFRyYW5zcG9ydAorLSBbVEhSSUZULTgyNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtODI2KSAtIFBIUCBUU29ja2V0IFdyaXRlIFRpbWVvdXQKKy0gW1RIUklGVC04MzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTgzNSkgLSBCYWQgQVMzIHN5bnRheCBpbiBjb25zdHJ1Y3RvcnMgdGhhdCBzZXQgZGVmYXVsdCB2YWx1ZXMKKy0gW1RIUklGVC03ODhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTc4OCkgLSB0aHJpZnRfcHJvdG9jb2wuc286IG11bHRpZ2V0L211bHRpZ2V0X3NsaWNlIGRvZXMgbm90IGhhbmRsZSBtb3JlIHRoYW4gMTcga2V5cyBjb3JyZWN0bHkKKy0gW1RIUklGVC0xMjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyNSkgLSBPQ2FtbCBsaWJyYXJpZXMgZG9uJ3QgY29tcGlsZSB3aXRoIDMyLWJpdCBvY2FtbAorLSBbVEhSSUZULTM0Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzQyKSAtIFBIUDogY2FuJ3QgaGF2ZSBzZXRzIG9mIGNvbXBsZXggdHlwZXMKKy0gW1RIUklGVC03MzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTczMSkgLSBjb25maWd1cmUgZG9lc24ndCBjaGVjayBmb3IgYW50ID49IDEuNworLSBbVEhSSUZULTY5MF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNjkwKSAtIFVwZGF0ZSBUQXBwbGljYXRpb25FeGNlcHRpb24gY29kZXMKKy0gW1RIUklGVC02MzhdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTYzOCkgLSBCdWZmZXJlZFRyYW5zcG9ydCArIEMgZXh0ZW5zaW9ucyBibG9jayB1bnRpbCByZWN2IHRpbWVvdXQgaXMgcmVhY2hlZCBvbiBsYXN0IGZyZWFkIGNhbGwKKworIyMjIERlcGVuZGVuY3kgdXBncmFkZQorLSBbVEhSSUZULTExNzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExNzcpIC0gVXBkYXRlIHRocmlmdCB0byByZWZsZWN0IGNoYW5nZXMgaW4gR28ncyBuZXR3b3JraW5nIGxpYnJhcmllcworCisjIyMgSW1wcm92ZW1lbnQKKy0gW1RIUklGVC0xMTU1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTU1KSAtIFJlbW92ZSBsb2c0aiBkZXBlbmRlbmN5IGZyb20gamF2YSBjbGllbnQKKy0gW1RIUklGVC0xMTUxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTUxKSAtIFByb2R1Y2UgbW9yZSBpbmZvcm1hdGl2ZSBydW50aW1lIGVycm9yIGluIGNhc2Ugb2Ygc2NoZW1hIGFuZCBkYXRhIG1pc21hdGNoIGR1cmluZyBzZXJpYWxpemF0aW9uCistIFtUSFJJRlQtMTIwN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTIwNykgLSBTdXBwb3J0IERFU1RESVIgb24gIm1ha2UgaW5zdGFsbCIgb2YgcnVieSBsaWJzCistIFtUSFJJRlQtMTE5OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTE5OSkgLSBVbmlvbiBzdHJ1Y3RzIHNob3VsZCBoYXZlIGdlbmVyYXRlZCBtZXRob2RzIHRvIHRlc3Qgd2hldGhlciBhIHNwZWNpZmljIGZpZWxkIGlzIGN1cnJlbnRseSBzZXQKKy0gW1RIUklGVC0xMjMzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjMzKSAtIFJlbW92ZSB1bnVzZWQgaW5jbHVkZSBpbiBnZW5lcmF0ZWQgQysrIGNvZGUKKy0gW1RIUklGVC0xMTg5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTg5KSAtIFJ1YnkgZGVzZXJpYWxpemVyIHNwZWVkIGltcHJvdmVtZW50cworLSBbVEhSSUZULTExNzBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExNzApIC0gVGhyaWZ0IEdlbmVyYXRlZCBDb2RlIGFuZCBKYXZhIDUKKy0gW1RIUklGVC0xMTc0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTc0KSAtIFB1Ymxpc2ggYXMzIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB2aWEgTWF2ZW4gZm9yIHVzZSBieSBmbGV4LW1vam9zIHVzZXJzCistIFtUSFJJRlQtMTIyNV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTIyNSkgLSBUQ29tcGFjdFByb3RvY29sIGZvciBQSFAKKy0gW1RIUklGVC0xMjIxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjIxKSAtIFJlbW92ZSBTaW1wbGVDYWxsYmFjay5oCistIFtUSFJJRlQtMTIxN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTIxNykgLSBVc2UgZXZ1dGlsX3NvY2tldHBhaXIgaW5zdGVhZCBvZiBwaXBlIChXaW5kb3dzIHBvcnQpCistIFtUSFJJRlQtMTIxNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTIxNikgLSBidWlsZCBKYXZhIExpYnJhcnkgYmVoaW5kIGEgcHJveHkKKy0gW1RIUklGVC0xMjMxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMjMxKSAtIFJlbW92ZSBib2d1cyBpbmNsdWRlCistIFtUSFJJRlQtMTIxM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTIxMykgLSBNZW1idWZmZXIgc2hvdWxkIHByb3ZpZGUgYSB3YXkgdG8gZ2V0IGJhY2sgdGhlIGJ1ZmZlcgorLSBbVEhSSUZULTEyMzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyMzcpIC0gSmF2YSBmYjMwMyBtaXNzaW5nIHNvbWUgbWV0aG9kcworLSBbVEhSSUZULTEwNjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwNjMpIC0gRml4IEVybGFuZyBUdXRvcmlhbCBGaWxlcworLSBbVEhSSUZULTEwNTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwNTMpIC0gTWFrZSByZW1vdGUgY2xpZW50J3MgSVAgYWRkcmVzcyBhdmFpbGFibGUgZm9yIGFsbCBzb2NrZXQgcmVsYXRlZCB0cmFuc3BvcnRzCistIFtUSFJJRlQtMTEwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTEwOSkgLSBEZXBsb3kgZmIzMDMgYWxvbmcgc2lkZSBsaWJ0aHJpZnQgdG8gbWF2ZW4gcmVwbworLSBbVEhSSUZULTExMDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMDcpIC0gaW1wcm92ZW1lbnQgZm9yIGNvbXBpbGVyLWdlbmVyYXRlZCBweXRob24gZm9yICdOb25lJyBvYmplY3QgY29tcGFyaXNvbnMKKy0gW1RIUklGVC0xMDY5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDY5KSAtIEFkZCBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHByZXZlbnQgdGhyaWZ0IGZyb20gaW5zZXJ0aW5nIGdlbi0qIGRpcmVjdG9yaWVzCistIFtUSFJJRlQtMTA0OV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTA0OSkgLSBBbGxvdyBmb3IgVFNlcnZlclNvY2tldCBweXRob24gbGlicmFyeSB0byBiaW5kIHRvIGEgc3BlY2lmaWMgaG9zdAorLSBbVEhSSUZULTExMjZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMjYpIC0gRXh0ZW5kaW5nIHN0cnVjdF9pbmZvIGZvciBlcmxhbmcgYmluZGluZ3MKKy0gW1RIUklGVC0xMTAwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTAwKSAtIHB5dGhvbiBUU1NMU29ja2V0IGltcHJvdmVtZW50cywgaW5jbHVkaW5nIGNlcnRpZmljYXRlIHZhbGlkYXRpb24KKy0gW1RIUklGVC05OTRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk5NCkgLSBEb24ndCB0cnkgdG8gaW52b2tlIHBocGl6ZSBpZiB3ZSBkb24ndCBoYXZlIGl0CistIFtUSFJJRlQtOTkzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05OTMpIC0gU29tZSBpbXByb3ZlbWVudHMgaW4gQysrIHN0dWJzIGZvciBvbmV3YXkgb3BlcmF0aW9ucworLSBbVEhSSUZULTk5N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTk3KSAtIFVzaW5nIHZhbHVlT2YgZm9yIGJhc2UgdHlwZXMgaW4gZ2V0RmllbGRWYWx1ZQorLSBbVEhSSUZULTQxOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDE4KSAtIERvbid0IGRvIHJ1bnRpbWUgc29ydGluZyBvZiBzdHJ1Y3QgZmllbGRzCistIFtUSFJJRlQtMTUxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNTEpIC0gVFNTTFNlcnZlclNvY2tldCBhbmQgVFNTTFNvY2tldCBpbXBsZW1lbnRhdGlvbgorLSBbVEhSSUZULTI3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNykgLSBHZW5lcmF0ZWQgZXJsYW5nIHR5cGVzIGRvbid0IGNvbnRhaW4gZGVmYXVsdCB2YWx1ZXMgZm9yIHJlY29yZHMKKy0gW1RIUklGVC0xMTNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMykgLSB0by1zdHJpbmcgbWV0aG9kcyBzaG91bGQgb21pdCBvcHRpb25hbCBudWxsIGZpZWxkcyBmcm9tIG91dHB1dAorLSBbVEhSSUZULTM2M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzYzKSAtIE1hdmVuIERlcGxveQorLSBbVEhSSUZULTQ0N10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDQ3KSAtIE1ha2UgYW4gYWJzdHJhY3QgYmFzZSBDbGllbnQgY2xhc3Mgc28gd2UgY2FuIGdlbmVyYXRlIGxlc3MgY29kZQorLSBbVEhSSUZULTYyN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNjI3KSAtIHNob3VsZCBjKysgaGF2ZSBzZXR0ZXJzIGZvciBvcHRpb25hbCBmaWVsZHM/CisKKyMjIyBOZXcgRmVhdHVyZQorLSBbVEhSSUZULTEyMzZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyMzYpIC0gRXJsYW5nIFJlY29ubmVjdGluZyBUaHJpZnQgQ2xpZW50CistIFtUSFJJRlQtMTAyMV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTAyMSkgLSBGcmFtZWQgdHJhbnNwb3J0IHN1cHBvcnQgZm9yIE9DYW1sCistIFtUSFJJRlQtMTA2OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTA2OCkgLSBQeXRob24gU1NMIFNvY2tldCBTdXBwb3J0CistIFtUSFJJRlQtMTEwM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTEwMykgLSBUWmxpYlRyYW5zcG9ydCBmb3IgcHl0aG9uLCBhIHpsaWIgY29tcHJlc3NlZCB0cmFuc3BvcnQKKy0gW1RIUklGVC0xMDgzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDgzKSAtIFByZWZvcmtpbmcgcHl0aG9uIHByb2Nlc3MgcG9vbCBzZXJ2ZXIKKy0gW1RIUklGVC05OTldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk5OSkgLSBBZGQgVEZvcmtpbmdTZXJ2ZXIKKworIyMjIFN1Yi10YXNrCistIFtUSFJJRlQtMTE1Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTE1MikgLSBBdHRyaWJ1dGVzIGZyb20gcHJpdmF0ZSB0byBwcm90ZWN0ZWQKKy0gW1RIUklGVC0xMDM4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDM4KSAtIEdlbmVyYXRlZCBKYXZhIGNvZGUgZm9yIHN0cnVjdHVyZXMgY29udGFpbmluZyBiaW5hcnkgZmllbGRzIChvciBjb2xsZWN0aW9ucyB0aGVyZW9mKSBhcmUgbm90IHNlcmlhbGl6YWJsZSAoaW4gdGhlIEphdmEgc2Vuc2UpIGV2ZW4gdGhvdWdoIHRoZXkgaW1wbGVtZW50IGphdmEuaW8uU2VyaWFsaXphYmxlCisKKyMjIyBUYXNrCistIFtUSFJJRlQtODkyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC04OTIpIC0gUmVmYWN0b3IgZXJsYW5nIGJ1aWxkIHN5c3RlbSB3aXRoIHJlYmFyCisKKyMjIyBXaXNoCistIFtUSFJJRlQtNjI1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC02MjUpIC0gQWRkIHN1cHBvcnQgZm9yICdHbycKKworIyMgMC42LjEKKworIyMjIEJ1ZworLSBbVEhSSUZULTExMzNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMzMpIC0gSmF2YSBhbmQgSmF2YVNjcmlwdCB0dXRvcmlhbCBpcyBicm9rZW4gc2luY2Ugd2UgaGF2ZSBKYXZhIG1hdmVuIGRlcGxveW1lbnQKKy0gW1RIUklGVC0xMTMxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTMxKSAtIEMjIEpTT04gUHJvdG9jb2wgaXMgdW5hYmxlIHRvIGRlY29kZSBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gc3RyaW5nCistIFtUSFJJRlQtMTA3NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTA3NCkgLSAua2V5c3RvcmUgYW5kIC50cnVzdHN0b3JlIGFyZSBtaXNzaW5nIGZyb20gdGhlIDAuNi4wIGRpc3RyaWJ1dGlvbgorCisjIyMgSW1wcm92ZW1lbnQKKy0gW1RIUklGVC0xMTA5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTA5KSAtIERlcGxveSBmYjMwMyBhbG9uZyBzaWRlIGxpYnRocmlmdCB0byBtYXZlbiByZXBvCistIFtUSFJJRlQtMzYzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNjMpIC0gTWF2ZW4gRGVwbG95CisKKyMjIyBRdWVzdGlvbgorLSBbVEhSSUZULTEyMDZdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEyMDYpIC0gZGlkIHRoZSBUSFJJRlQgMC42LjEgbWVyZ2UgVEhSSUZULTU2MyA/CisKKyMjIyBTdWItdGFzaworLSBbVEhSSUZULTExNjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExNjMpIC0gSG93IGNhbiBpIHVzZSBtdWx0aSBzZXJ2aWNlIGluIG9uZSBwcm9ncmFtPworCisjIyMgVGFzaworLSBbVEhSSUZULTExMTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMTIpIC0gQXBwbHkgVEhSSUZULTM2MyB0byAwLjYgYnJhbmNoCistIFtUSFJJRlQtMTExM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTExMykgLSBBcHBseSBUSFJJRlQtMTA3NCB0byAwLjYgYnJhbmNoCisKKyMjIDAuNgorCisjIyMgQnVnCistIFtUSFJJRlQtMTAyMF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTAyMCkgLSBPQ2FtbCBjb21waWxlciBnZW5lcmF0ZXMgaW52YWxpZCBPQ2FtbAorLSBbVEhSSUZULTEwMTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwMTUpIC0gVFVuaW9uIGRvZXMgbm90IGhhbmRsZSBCeXRlQnVmZmVyIGluIHRvU3RyaW5nCistIFtUSFJJRlQtMTAxM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTAxMykgLSBnZW5lcmF0ZWQgamF2YSBjb2RlIG1heSBoYXZlIG5hbWUgY2xhc2hlcyB3aXRoIHRocmlmdCBsaWJyYXJ5CistIFtUSFJJRlQtMTAwOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTAwOSkgLSBUVW5pb24gZG9lcyBub3QgY29ycmVjdGx5IGRlZXAgY29weSBhIEJ5dGVCdWZmZXIKKy0gW1RIUklGVC0xMDMyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDMyKSAtICJtYWtlIGRpc3QiIGZhaWxzIGR1ZSB0byBjX2dsaWIgcHJvYmxlbQorLSBbVEhSSUZULTg2OF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtODY4KSAtIFJlZmVyZW5jaW5nIGNvbnN0YW50IHZhbHVlcyBkb2Vzbid0IHdvcmsgd2l0aCB3aXRoIHR5cGVkZWYgdHlwZXMKKy0gW1RIUklGVC05NzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk3MSkgLSBqYXZhIG1vZHVsZSBjYW4ndCBiZSBjb21waWxlZCB3aXRob3V0IGl2eSBhbmQgbmV0d29yayBjb25uZWN0aW9uCistIFtUSFJJRlQtOTcwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05NzApIC0gVW5kZXIgaGVhdnkgbG9hZCwgVEh0dHBDbGllbnQgbWF5IGZhaWwgd2l0aCAidG9vIG1hbnkgb3BlbiBmaWxlcyIKKy0gW1RIUklGVC05NjldKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk2OSkgLSBKYXZhIFR1dG9yaWFsIGJyb2tlbiwgbW92ZSBDYWxjdWxhdG9ySGFuZGxlciB0byBhIHNlcGFyYXRlIGZpbGUKKy0gW1RIUklGVC04MDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTgwNykgLSBKYXZhU2NyaXB0OiBJbml0aWFsaXphdGlvbiBvZiBCYXNlIFR5cGVzIHdpdGggMCBpbnN0ZWFkIG9mIG51bGwKKy0gW1RIUklGVC05NTVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk1NSkgLSBUaHJpZnQgY29tcGlsZXIgZm9yIFdpbmRvd3MgdXNlcyBsb3dlcmNhc2UgbmFtZXMgYW5kIGRpcmVjdG9yaWVzIHdoaWNoIGlzIGluY29uc2lzdGVudCB3aXRoIGNvbXBpbGluZyBvbiBvdGhlciBwbGF0Zm9ybXMKKy0gW1RIUklGVC05OTJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk5MikgLSBOYW1pbmcgY29udmVudGlvbiBpbiBDIyBjb25zdHJ1Y3RvciBpcyBub3QgY29uc2lzdGVudCB3aXRoIG90aGVyIGZpZWxkcyBjYXVzZXMgY29tcGlsZSBlcnJvcnMKKy0gW1RIUklGVC0xMDA4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDA4KSAtIGJ5dGVbXSBhY2Nlc3NvcnMgdGhyb3cgTlBFIG9uIHVuc2V0IGZpZWxkCistIFtUSFJJRlQtMTAwNl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTAwNikgLSBJbXBvc3NpYmxlIHRvIGNvcnJlY3RseSBxdWFsaWZ5IGFuIGVudW0gY29uc3RhbnQgaW4gYW4gZXh0ZXJuYWwgdGhyaWZ0IGZpbGUKKy0gW1RIUklGVC05NTBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk1MCkgLSBIYXNrZWxsIGJpbmRpbmdzIHRyZWF0ICdieXRlJyBhcyB1bnNpZ25lZCA4LWJpdCBpbnQgKERhdGEuV29yZC5Xb3JkOCksIGphdmEvY3BwIGFzIHNpZ25lZCAoYnl0ZS9pbnQ4X3QpLgorLSBbVEhSSUZULTk3NV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTc1KSAtIGxpYi9jX2dsaWIvUkVBRE1FIGlzIG1pc3NpbmcgPT4gYnJlYWtzIG1ha2UgZGlzdAorLSBbVEhSSUZULTk0NF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTQ0KSAtIFN1cHBvcnQgYWxsIHZlcnNpb24tNHMgb2YgYmFzZQorLSBbVEhSSUZULTkzOV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTM5KSAtIG9wdGlvbmFsIGJpbmFyeSBmaWVsZHMgdGhyb3cgTlBFIG9uIGRlZmF1bHQgYnl0ZVtdIGdldHRlcnMKKy0gW1RIUklGVC05MzVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTkzNSkgLSBQSFAgRXh0ZW5zaW9uIGFib3J0cyB0aGUgYnVpbGQgaWYgcGhwLWNvbmZpZyBpcyBub3QgaW5zdGFsbGVkCistIFtUSFJJRlQtOTMzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05MzMpIC0gSGFza2VsbCdzIFRocmlmdC5jYWJhbCBoYXMgd2FybmluZ3MKKy0gW1RIUklGVC05MzJdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTkzMikgLSBIYXNrZWxsIHRlc3RzIG5lZWQgdG8gYmUgcnVuIHRocm91Z2ggJ21ha2UgY2hlY2snIChhbmQgcHJvYmFibHkgJ2NhYmFsIGNoZWNrJykgdG9vCistIFtUSFJJRlQtOTA0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05MDQpIC0gQyMgVFNvY2tldCBzaG91bGQgZGlzYWJsZSBuYWdsZSBhbmQgbGluZ2VyCistIFtUSFJJRlQtOTQxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05NDEpIC0gTWFrZSBQSFAgQyBFeHRlbnNpb24gdXNlIHRoZSBkZWZpbmVkIFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luIGZ1bmN0aW9uCistIFtUSFJJRlQtOTQwXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05NDApIC0gJ21ha2UgY2hlY2snIGZhaWxzIGlmIGJvb3N0IGlzIG5vdCBpbiB0aGUgc3RkIGluY2x1ZGUgYW5kIGxpbmsgcGF0aHMKKy0gW1RIUklGVC05MjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTkyNCkgLSBGaXggZ2VuZXJhdGVkIHBocCBzdHJ1Y3R1cmUgY29uc3RhbnRzCistIFtUSFJJRlQtOTc5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05NzkpIC0gcnVieSBiaW5kaW5ncyB1c2VkIHRvIHdvcmsgb24ganJ1YnkKKy0gW1RIUklGVC05NzddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk3NykgLSBIZXggQ29udmVyc2lvbiBCdWcgaW4gQysrIFRKU09OUHJvdG9jb2wKKy0gW1RIUklGVC0zNDddKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTM0NykgLSBQSFAgVFNvY2tldCBUaW1lb3V0IElzc3VlcworLSBbVEhSSUZULTUxN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNTE3KSAtIFRFeGNlcHRpb25zIHRocm93biBieSBzZXJ2ZXIgcmVzdWx0IGluIGNyeXB0aWMgZXJyb3IgbWVzc2FnZSBvbiBjbGllbnQgLSBUcmllZCB0byByZWFkIDQgYnl0ZXMsIGJ1dCBvbmx5IGdvdCAwIGJ5dGVzCisKKyMjIyBJbXByb3ZlbWVudAorLSBbVEhSSUZULTEwMjRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwMjQpIC0gQWRkIFB5dGhvbiBUd2lzdGVkIGV4YW1wbGUgdG8gdGhlIFR1dG9yaWFsCistIFtUSFJJRlQtOTU4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05NTgpIC0gQ2hhbmdlIGFjY2Vzc21vZGlmZXIgb24gdHJhbnNfIGZpZWxkIGluIHRoZSBGcmFtZUJ1ZmZlciBjbGFzcyB0byBwdWJsaWMuCistIFtUSFJJRlQtOTU3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05NTcpIC0gVEhzSGFTZXJ2ZXI6IENoYW5nZSBhY2Nlc3MgbW9kaWZpZXIgb2YgdGhlIGludm9rZXIgZmllbGQuCistIFtUSFJJRlQtMTAwMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTAwMikgLSBDb2RlU3R5bGU6IHRfY19nbGliX2dlbmVyYXRvci5jYworLSBbVEhSSUZULTEwMDVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwMDUpIC0gR2l2ZSB1bmlvbnMgYnl0ZVtdIHNpZ25hdHVyZSBtZXRob2RzIHRvIGdvIGFsb25nIHdpdGggdGhlaXIgQnl0ZUJ1ZmZlciBjb3VudGVycGFydHMKKy0gW1RIUklGVC05NTFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk1MSkgLSBBZGQgYSBuZXcgaXNTZXJ2aW5nKCkgbWV0aG9kIHRvIFRTZXJ2ZXIKKy0gW1RIUklGVC05NDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk0MykgLSBTaWxseSByZWFkbWUgdHlwbyBmaXguCistIFtUSFJJRlQtOTYxXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05NjEpIC0gSmF2YVNjcmlwdCBUZXN0U3VpdGUgdXNpbmcgYW50L2l2eSBhbmQgSmF2YSdzIFNlcnZlclRlc3RCYXNlIEhhbmRsZXIKKy0gW1RIUklGVC05NjBdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk2MCkgLSBhZGQgVGVzdFNlcnZlciwgVGVzdE5vbmJsb2NraW5nU2VydmVyIGFuZCBUZXN0Q2xpZW50IGFnYWluCistIFtUSFJJRlQtOTQ5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05NDkpIC0gTW9kaWZ5IHRoZSBURW51bSBpbnRlcmZhY2Ugc28gaXQgZGVmaW5lcyBhIG1ldGhvZCBzaW1pbGFyIHRvIGZpbmRCeVZhbHVlCistIFtUSFJJRlQtOTQ2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05NDYpIC0gQXVnbWVudCBGaWVsZFZhbHVlTWV0YURhdGEgc28gaXQgZGlmZmVyZW50aWF0ZXMgJ3N0cmluZycgYW5kICdiaW5hcnknIGZpZWxkcy4KKy0gW1RIUklGVC05MDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTkwMykgLSBjdXN0b20gVGhyZWFkRmFjdG9yeSBpbiBUSHNIYVNlcnZlcgorLSBbVEhSSUZULTkxM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTEzKSAtIFRlc3QgQ2FzZSBmb3IgVXJsIGVuY29kZWQgc3RyaW5ncyArIHNpbXBsZSBlbmhhbmNlbWVudCB0byBsaWIvanMvdGVzdC9SdW5UZXN0U2VydmVyLnNoCistIFtUSFJJRlQtOTI2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05MjYpIC0gTWlzY2VsbGFuZW91cyBDKysgaW1wcm92ZW1lbnRzCistIFtUSFJJRlQtOTI5XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05MjkpIC0gSW1wcm92ZW1lbnRzIHRvIHRoZSBDKysgdGVzdCBzdWl0ZQorLSBbVEhSSUZULTg5M10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtODkzKSAtIGFkZCBKYXZhU2NyaXB0IHRvIHRoZSB0dXRvcmlhbCBleGFtcGxlcworLSBbVEhSSUZULTEwMDNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwMDMpIC0gUG9saXNoaW5nIGNfZ2xpYiBjb2RlCistIFtUSFJJRlQtNzFdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTcxKSAtIERlYmlhbiBwYWNrYWdpbmcgZm9yIHRocmlmdAorCisjIyMgTmV3IEZlYXR1cmUKKy0gW1RIUklGVC0xMDMzXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDMzKSAtIE5vZGUuanMgbGFuZ3VhZ2UgdGFyZ2V0CistIFtUSFJJRlQtOTQ3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC05NDcpIC0gUHJvdmlkZSBhIGhlbHBlciBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoZSBUUHJvdG9jb2wgdXNlZCB0byBzZXJpYWxpemUgc29tZSBkYXRhLgorLSBbVEhSSUZULTkyOF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTI4KSAtIE1ha2UgbW9yZSBzdGF0aXN0aWNzIGF2YWlsYWJsZSBpbiBDKysgc2VydmVycworLSBbVEhSSUZULTkyMl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTIyKSAtIFRlbXBsYXRpemVkIFtkZV1zZXJpYWxpemF0aW9uIGNvZGUgZm9yIEMrKworLSBbVEhSSUZULTkyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTIzKSAtIEV2ZW50LWRyaXZlbiBjbGllbnQgYW5kIHNlcnZlciBzdXBwb3J0IGZvciBDKysKKy0gW1RIUklGVC05MjVdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTkyNSkgLSBQcm92aWRlIG5hbWU8LT52YWx1ZSBtYXAgZm9yIGVudW1zIGluIEMrKworLSBbVEhSSUZULTkyN10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtOTI3KSAtIEFkZCBvcHRpb24gdG8gbW9kaWZ5IHRoZSBQSFAgaW5jbHVkZSBwYXRoCistIFtUSFJJRlQtMzc3XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0zNzcpIC0gVEZpbGVUcmFuc3BvcnQgcG9ydCBpbiBKYXZhCistIFtUSFJJRlQtMTA2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDYpIC0gVFNTTFNlcnZlclNvY2tldAorLSBbVEhSSUZULTU4Ml0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNTgyKSAtIEMgaW1wbGVtZW50YXRpb24gb2YgVGhyaWZ0CistIFtUSFJJRlQtNzQ1XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC03NDUpIC0gTWFrZSBpdCBlYXNpZXIgdG8gaW5zdGFudGlhdGUgc2VydmVycworCisjIyMgU3ViLXRhc2sKKy0gW1RIUklGVC0xMDM4XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDM4KSAtIEdlbmVyYXRlZCBKYXZhIGNvZGUgZm9yIHN0cnVjdHVyZXMgY29udGFpbmluZyBiaW5hcnkgZmllbGRzIChvciBjb2xsZWN0aW9ucyB0aGVyZW9mKSBhcmUgbm90IHNlcmlhbGl6YWJsZSAoaW4gdGhlIEphdmEgc2Vuc2UpIGV2ZW4gdGhvdWdoIHRoZXkgaW1wbGVtZW50IGphdmEuaW8uU2VyaWFsaXphYmxlCisKKyMjIyBUYXNrCistIFtUSFJJRlQtODYyXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC04NjIpIC0gQXN5bmMgY2xpZW50IGlzc3VlcyAvIGltcHJvdmVtZW50cworCisjIyMgVGVzdAorLSBbVEhSSUZULTU4MV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNTgxKSAtIEFkZCBhIHRlc3RzdWl0ZSBmb3IgdHhUaHJpZnQgKFR3aXN0ZWQpCisKKyMjIEluY3ViYXRpbmcgVmVyc2lvbnMKKworVGhyaWZ0IDAuNS4wIC0gSW5jdWJhdGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RIUklGVC01MDUgICBCdWlsZCAgICAgICAgICAgICAgICBNYWtlIGNvbmZpZ3VyZSBnaXZlIGEgc3VtbWFyeSBvZiB0aGUgZW5hYmxlZCBjb21wb25lbnRzIChEYXZpZCBSZWlzcykKK1RIUklGVC01MDYgICBCdWlsZCAgICAgICAgICAgICAgICBBbGxvdyBUaHJpZnQgdG8gYmUgYnVpbHQgd2l0aG91dCB0aGUgQysrIGxpYnJhcnkgKERhdmlkIFJlaXNzKQorVEhSSUZULTg0NCAgIEJ1aWxkICAgICAgICAgICAgICAgIEJ1aWxkIFJlcXVpcmVtZW50cyBzdGF0ZSBhdXRvY29uZiAyLjU5KyBpcyByZXF1aXJlZCwgYnV0IDIuNjArIGlzIG5lZWRlZCAoSGFybGFuIExpZWJlcm1hbi1CZXJnKQorVEhSSUZULTg1MCAgIEJ1aWxkICAgICAgICAgICAgICAgIFBlcmwgcnVudGltZSByZXF1aXJlcyBCaXQ6OlZlY3RvciB3aGljaCBtYXkgbm90IGJlIGluc3RhbGxlZCBieSBkZWZhdWx0LCBidXQgY29uZmlndXJlIGRvZXMgbm90IGZhaWwgKE1pY2hhZWwgTHVtKQorVEhSSUZULTg1NCAgIEJ1aWxkICAgICAgICAgICAgICAgIFByb3ZpZGUgY29uZmlndXJlIG9wdGlvbiBhbmQgbWFrZSBydWxlcyB0byBidWlsZC9pbnN0YWxsIHBocCBleHRlbnNpb24gKEFudGhvbnkgTW9saW5hcm8pCitUSFJJRlQtODU4ICAgQnVpbGQgICAgICAgICAgICAgICAgSGF2ZSBib290c3RyYXAuc2ggY2hlY2sgZm9yIGEgc3VpdGFibGUgYXV0b2NvbmYgdmVyc2lvbiBiZWZvcmUgcnVubmluZyAoRGF2aWQgUmVpc3MpCitUSFJJRlQtODcxICAgQnVpbGQgICAgICAgICAgICAgICAgVGhyaWZ0IGNvbXBpbGVyIGZvciBXSW5kb3dzIChiaW5hcnkgZGlzdHJpYnV0aW9uKSAoRGF2aWQgUmVpc3MpCitUSFJJRlQtMzIzICAgQyMgICAgICAgICAgICAgICAgICAgVEpTT05Qcm90b2NvbCAoUm9nZXIgTWVpZXIpCitUSFJJRlQtNjM0ICAgQyMgICAgICAgICAgICAgICAgICAgQyMgQ29tcGlsZXIgR2VuZXJhdGVzIEluY29ycmVjdCBDb2RlIEZvciBGaWVsZHMgd2hpY2ggYmVnaW4gd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIChKb24gUyBBa2h0YXIpCitUSFJJRlQtODgxICAgQyMgICAgICAgICAgICAgICAgICAgYWRkIGNzaGFycCB0byB0aGUgdHV0b3JpYWwgKFJvZ2VyIE1laWVyKQorVEhSSUZULTg1NiAgIEMrKyAgICAgICAgICAgICAgICAgIEJ1aWxkaW5nIGNwcCBsaWJyYXJ5IGZhaWxzIG9uIE9TIFggd2l0aCBtYWxsb2MgYW5kIGZyZWUgbm90IGJlaW5nIGRlY2xhcmVkIGluIHNjb3BlIChKYW1lcyBDbGFya2UpCitUSFJJRlQtODY1ICAgQysrICAgICAgICAgICAgICAgICAgQysrIGNvbXBpbGVyIGJ1aWxkIGRlcGVuZHMgb24gbGliZmwgZXZlbiB3aGVuIGZsZXgvbGV4IG5vdCBkZXRlY3RlZCAoRGF2aWQgUmVpc3MpCitUSFJJRlQtOTAwICAgQysrICAgICAgICAgICAgICAgICAgVW5peCBkb21haW4gc29ja2V0IChSb2dlciBNZWllcikKK1RIUklGVC05MjAgICBDKysgICAgICAgICAgICAgICAgICBDKysgVGVzdCBhbmQgVHV0b3JpYWwgZG9lcyBub3QgY29tcGlsZSBhbnltb3JlIGR1ZSB0byB0aGUgY2hhbmdlIHdpdGhpbiBFbnVtIGhhbmRsaW5nIChSb2dlciBNZWllcikKK1RIUklGVC01NjcgICBDKysgICAgICAgICAgICAgICAgICBDYW4ndCBpbW1lZGlhdGVseSBzdG9wIGEgVFNpbXBsZVNlcnZlciB0aHJlYWQgdGhhdCBpcyBpZGxlIChSdXNoIE1hbmJlcnQpCitUSFJJRlQtNzU2ICAgQysrICAgICAgICAgICAgICAgICAgRXhwb3NpbmcgVFNvY2tldChpbnQpIGNvbnN0cnVjdG9yIHRvIHB1YmxpYyAoUmFqYXQgR29lbCkKK1RIUklGVC03OTggICBDKysgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXIgbGVha3MgcmVzb3VyY2VzIHdoZW4gZGVzdHJveWVkIChEYXZpZCBSZWlzcykKK1RIUklGVC04MTIgICBDKyssIFB5dGhvbiAgICAgICAgICBEZW1vIG9mIFRocmlmdCBvdmVyIFplcm9NUSAoRGF2aWQgUmVpc3MpCitUSFJJRlQtNjI5ICAgQ29jb2EgICAgICAgICAgICAgICAgVW51c2VkIEZpZWxkIEluIFRTb2NrZXRTZXJ2ZXIgQXBwZWFycyBUbyBCcmVhayBpUGhvbmUgQnVpbGQgKEpvbiBTIEFraHRhcikKK1RIUklGVC04MzggICBDb2NvYSAgICAgICAgICAgICAgICBHZW5lcmF0ZWQgQ29jb2EgY2xhc3NlcyBoYXZlIHVzZWxlc3MgQGR5bmFtaWMgZGVjbGFyYXRpb25zIChLZXZpbiBCYWxsYXJkKQorVEhSSUZULTgwNSAgIENvY29hICAgICAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIHByb2Nlc3NfWFhYWCBtZXRob2RzIGZvciBvbmV3YXkgbWV0aG9kcyAoQnJhZCBUYXlsb3IpCitUSFJJRlQtNTA3ICAgQ29tcGlsZXIgICAgICAgICAgICAgUmVtb3ZlIHRoZSBjb21waWxlcidzIGRlcGVuZGVuY3kgb24gQm9vc3QgKERhdmlkIFJlaXNzKQorVEhSSUZULTg5NSAgIENvbXBpbGVyIChHZW5lcmFsKSAgIFRocmlmdCBjb21waWxlciBkb2VzIG5vdCBhbGxvdyB0d28gZGlmZmVyZW50IGVudW1lcmF0aW9ucyB0byBoYXZlIHRoZSBzYW1lIGtleSBuYW1lIGZvciBvbmUgb2YgdGhlIGVudW0gdmFsdWVzIChEYXZpZCBSZWlzcykKK1RIUklGVC04NTIgICBDb21waWxlciAoR2VuZXJhbCkgICBNaXNzaW5nIG5ld2xpbmUgY2F1c2VzIG1hbnkgY29tcGlsZXIgd2FybmluZ3MgKEFudGhvbnkgTW9saW5hcm8pCitUSFJJRlQtODc3ICAgQ29tcGlsZXIgKEdlbmVyYWwpICAgc21hbGx0YWxrIG5hbWVzcGFjZSBkb2Vzbid0IHdvcmsgKEJydWNlIExvd2VrYW1wKQorVEhSSUZULTg5NyAgIENvbXBpbGVyIChHZW5lcmFsKSAgIERvbid0IGFsbG93IHVucXVhbGlmaWVkIGNvbnN0YW50IGFjY2VzcyB0byBlbnVtIHZhbHVlcyAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC05ICAgICBDb21waWxlciAoR2VuZXJhbCkgICBBZGQgYSBkZWZhdWx0IG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBmb3IgYWxsIGxhbmd1YWdlcyAoRGF2aWQgUmVpc3MpCitUSFJJRlQtNTk5ICAgRXJsYW5nICAgICAgICAgICAgICAgRG9uJ3QgdXNlIHVubmVjZXNzYXJ5IHByb2Nlc3NlcyBpbiB0aGUgRXJsYW5nIHRyYW5zcG9ydHMgYW5kIGNsaWVudHMgKERhdmlkIFJlaXNzKQorVEhSSUZULTY0NiAgIEVybGFuZyAgICAgICAgICAgICAgIEVybGFuZyBsaWJyYXJ5IGlzIG1pc3NpbmcgaW5zdGFsbCB0YXJnZXQgKERhdmlkIFJlaXNzKQorVEhSSUZULTY5OCAgIEVybGFuZyAgICAgICAgICAgICAgIEdlbmVyYXRlZCBtb2R1bGUgbGlzdCBzaG91bGQgY29udGFpbiBhdG9tcywgbm90IHN0cmluZ3MgKEFudGhvbnkgTW9saW5hcm8pCitUSFJJRlQtODY2ICAgRXJsYW5nICAgICAgICAgICAgICAgdGVybSgpIGluIHNwZWMgZGVmaW5pdGlvbnMgc2VlbXMgdG8gbm90IHdvcmsgaW4gZXJsYW5nIFIxMiAoQW50aG9ueSBNb2xpbmFybykKK1RIUklGVC04ODYgICBFcmxhbmcgICAgICAgICAgICAgICBEaWFseXplciB3YXJuaW5nIChBbnRob255IE1vbGluYXJvKQorVEhSSUZULTc4NSAgIEVybGFuZyAgICAgICAgICAgICAgIEZyYW1lZCB0cmFuc3BvcnQgc2VydmVyIHByb2JsZW1zIChBbnRob255IE1vbGluYXJvKQorVEhSSUZULTg4NCAgIEhUTUwgICAgICAgICAgICAgICAgIEhUTUwgR2VuZXJhdG9yOiBhZGQgS2V5IGF0dHJpYnV0ZSB0byB0aGUgRGF0YSBUeXBlcyBUYWJsZXMgKFJvZ2VyIE1laWVyKQorVEhSSUZULTY1MiAgIEhhc2tlbGwgICAgICAgICAgICAgIEdlbmVyYXRlZCBmaWVsZCBuYW1lIGZvciBzdHJ1dCBpcyBub3QgY2FwaXRhbGl6ZWQgY29ycmVjdGx5IChDaHJpc3RpYW4gTGF2b2llKQorVEhSSUZULTc0MyAgIEhhc2tlbGwgICAgICAgICAgICAgIGNvbXBpbGUgZXJyb3Igd2l0aCBHSEMgNi4xMi4xIChDaHJpc3RpYW4gTGF2b2llKQorVEhSSUZULTkwMSAgIEhhc2tlbGwgICAgICAgICAgICAgIEFsbG93IHRoZSBiaW5kaW5ncyB0byBjb21waWxlIHdpdGhvdXQgLWZnbGFzZ293LWV4dHMgYW5kIHdpdGggLVdhbGwgLVdlcnJvciAoQ2hyaXN0aWFuIExhdm9pZSkKK1RIUklGVC05MDUgICBIYXNrZWxsICAgICAgICAgICAgICBNYWtlIGhhc2tlbGwgdGhyaWZ0IGJpbmRpbmdzIHVzZSBhdXRvbWFrZSB0byBjb21waWxlIGFuZCBpbnN0YWxsIChDaHJpc3RpYW4gTGF2b2llKQorVEhSSUZULTkwNiAgIEhhc2tlbGwgICAgICAgICAgICAgIEltcHJvdmUgdHlwZSBtYXBwaW5ncyAoQ2hyaXN0aWFuIExhdm9pZSkKK1RIUklGVC05MTQgICBIYXNrZWxsICAgICAgICAgICAgICBNYWtlIGhhc2tlbGwgYmluZGluZ3MgJ2Vhc2lseScgY29tcGlsYWJsZSAoQ2hyaXN0aWFuIExhdm9pZSkKK1RIUklGVC05MTggICBIYXNrZWxsICAgICAgICAgICAgICBNYWtlIGhhc2tlbGwgdGVzdHMgcnVuIGFnYWluIChDaHJpc3RpYW4gTGF2b2llKQorVEhSSUZULTkxOSAgIEhhc2tlbGwgICAgICAgICAgICAgIFVwZGF0ZSBIYXNrZWxsIGJpbmRpbmdzIFJFQURNRSAoQ2hyaXN0aWFuIExhdm9pZSkKK1RIUklGVC03ODcgICBIYXNrZWxsICAgICAgICAgICAgICBFbnVtcyBhcmUgbm90IHJlYWQgY29ycmVjdGx5IChDaHJpc3RpYW4gTGF2b2llKQorVEhSSUZULTI1MCAgIEphdmEgICAgICAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBhcyBhIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBmb3IgVFNlcnZlciAoRWQgQ2Vhc2VyKQorVEhSSUZULTY5MyAgIEphdmEgICAgICAgICAgICAgICAgIFRocmlmdCBjb21waWxlciBnZW5lcmF0ZWQgamF2YSBjb2RlIHRoYXQgdGhyb3dzIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGRlcHJlY2F0ZWQgbWV0aG9kcy4gKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtODQzICAgSmF2YSAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nU29ja2V0IGNvbm5lY3RzIHdpdGhvdXQgYSB0aW1lb3V0IChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTg0NSAgIEphdmEgICAgICAgICAgICAgICAgIGFzeW5jIGNsaWVudCBkb2VzIG5vdCByZXNwZWN0IHRpbWVvdXQgKE5pbmcgTGlhbmcpCitUSFJJRlQtODcwICAgSmF2YSAgICAgICAgICAgICAgICAgSmF2YSBjb25zdGFudHMgZG9uJ3QgZ2V0IEphdmFkb2MgY29tbWVudHMgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtODczICAgSmF2YSAgICAgICAgICAgICAgICAgSmF2YSB0ZXN0cyBmYWlsIGR1ZSB0byBUb28gbWFueSBvcGVuIGZpbGVzIChUb2RkIExpcGNvbikKK1RIUklGVC04NzYgICBKYXZhICAgICAgICAgICAgICAgICBBZGQgU0FTTCBzdXBwb3J0IChBYXJvbiBULiBNeWVycykKK1RIUklGVC04NzkgICBKYXZhICAgICAgICAgICAgICAgICBSZW1vdmUgQE92ZXJyaWRlIGZyb20gVFVuaW9uLmNsZWFyIChEYXZlIEVuZ2JlcmcpCitUSFJJRlQtODgyICAgSmF2YSAgICAgICAgICAgICAgICAgZGVlcCBjb3B5IG9mIGJpbmFyeSBmaWVsZHMgZG9lcyBub3QgY29weSBCeXRlQnVmZmVyIGNoYXJhY3RlcmlzdGljcyAoYXJyYXlPZmZzZXQsIHBvc2l0aW9uKSAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC04ODggICBKYXZhICAgICAgICAgICAgICAgICBhc3luYyBjbGllbnQgc2hvdWxkIGFsc28gaGF2ZSBub25ibG9ja2luZyBjb25uZWN0IChFcmljIEplbnNlbikKK1RIUklGVC04OTAgICBKYXZhICAgICAgICAgICAgICAgICBKYXZhIHR1dG9yaWFsIGRvZXNuJ3Qgd29yayAoVG9kZCBMaXBjb24pCitUSFJJRlQtODk0ICAgSmF2YSAgICAgICAgICAgICAgICAgTWFrZSBkZWZhdWx0IGFjY2Vzc29ycyBmb3IgYmluYXJ5IGZpZWxkcyByZXR1cm4gYnl0ZVtdOyBwcm92aWRlIG5ldyBhY2Nlc3NvcnMgdG8gZ2V0IEJ5dGVCdWZmZXIgdmVyc2lvbiAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC04OTYgICBKYXZhICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTb2NrZXQuaXNPcGVuKCkgcmV0dXJucyB0cnVlIGV2ZW4gYWZ0ZXIgY2xvc2UoKSAoRXJpYyBKZW5zZW4pCitUSFJJRlQtOTA3ICAgSmF2YSAgICAgICAgICAgICAgICAgbGliZmIzMDMgZG9lc24ndCBjb21waWxlIGluIDAuNC4wIChUb2RkIExpcGNvbikKK1RIUklGVC05MTIgICBKYXZhICAgICAgICAgICAgICAgICBJbXByb3ZlbWVudHMgYW5kIGJ1ZyBmaXhlcyB0byBTQVNMIGltcGxlbWVudGF0aW9uIChUb2RkIExpcGNvbikKK1RIUklGVC05MTcgICBKYXZhICAgICAgICAgICAgICAgICBUSHNIYVNlcnZlciBzaG91bGQgbm90IGFjY2VwdCBhbiBFeGVjdXRvclNlcnZpY2Ugd2l0aG91dCBjYXRjaGluZyBSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiAoRWQgQ2Vhc2VyKQorVEhSSUZULTkzMSAgIEphdmEgICAgICAgICAgICAgICAgIFVzZSBsb2c0aiBmb3IgSmF2YSB0ZXN0cyAoVG9kZCBMaXBjb24pCitUSFJJRlQtODgwICAgSmF2YU1FICAgICAgICAgICAgICAgSmF2YU1FIGNvZGUgZ2VuZXJhdG9yIGFuZCBydW50aW1lIGxpYnJhcnkgKERhdmUgRW5nYmVyZykKK1RIUklGVC04NDYgICBKYXZhU2NyaXB0ICAgICAgICAgICBKYXZhU2NyaXB0IFRlc3QgRnJhbXdvcms6IGV4dGVuZGVkIFRlc3RjYXNlcyAoUm9nZXIgTWVpZXIpCitUSFJJRlQtODg1ICAgSmF2YVNjcmlwdCAgICAgICAgICAgVXJsIGVuY29kZWQgc3RyaW5ncyBuZXZlciBnZXQgZGVjb2RlZD8gSG93IGRvIHdlIGZpeCB0aGlzPyAoVCBKYWtlIEx1Y2lhbmkpCitUSFJJRlQtOTExICAgSmF2YVNjcmlwdCAgICAgICAgICAgKEphdmFTY3JpcHQgY29tcGlsZXIpIENvbnN0IHN0cnVjdHMsIG1hcHMsIHNldHMsIGFuZCBsaXN0cyBnZW5lcmF0ZSBhIHRyYWlsaW5nIGNvbW1hIChUIEpha2UgTHVjaWFuaSkKK1RIUklGVC04NjAgICBPQ2FtbCAgICAgICAgICAgICAgICBjb3B5IG1ldGhvZCBhbmQgcmVzZXQgbWV0aG9kIChMZXYgV2Fsa2luKQorVEhSSUZULTY4MiAgIFBIUCAgICAgICAgICAgICAgICAgIFBIUCBleHRlbnNpb24gZG9lc24ndCBjb21waWxlIG9uIE1hYyBPUyBYIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTg1MSAgIFBIUCAgICAgICAgICAgICAgICAgIHBocCBleHRlbnNpb24gZmFpbHMgdG8gY29tcGlsZSBvbiBjZW50b3MgNS54IChUb2RkIExpcGNvbikKK1RIUklGVC04NDAgICBQZXJsICAgICAgICAgICAgICAgICBQZXJsIHByb3RvY29sIGhhbmRsZXIgY291bGQgYmUgbW9yZSByb2J1c3QgYWdhaW5zdCB1bnJlY29nbmlzZWQgdHlwZXMgKENvbnJhZCBIdWdoZXMpCitUSFJJRlQtNzU4ICAgUGVybCAgICAgICAgICAgICAgICAgaW5jb3JyZWN0IGRlZmVyZW5jZSBpbiBleGNlcHRpb24gaGFuZGxpbmcgKFlhbm4gS2VyaGVydmUpCitUSFJJRlQtMjU3ICAgUHl0aG9uICAgICAgICAgICAgICAgU3VwcG9ydCB2YWxpZGF0aW9uIG9mIHJlcXVpcmVkIGZpZWxkcyAoRXN0ZXZlIEZlcm5hbmRleikKK1RIUklGVC0zMzUgICBQeXRob24gICAgICAgICAgICAgICBDb21wYWN0IFByb3RvY29sIGZvciBQeXRob24gKERhdmlkIFJlaXNzKQorVEhSSUZULTU5NiAgIFB5dGhvbiAgICAgICAgICAgICAgIE1ha2UgUHl0aG9uJ3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IHVzZSBhIGNvbmZpZ3VyYWJsZSBpbnB1dCBidWZmZXIgKERhdmlkIFJlaXNzKQorVEhSSUZULTU5NyAgIFB5dGhvbiAgICAgICAgICAgICAgIFB5dGhvbiBUSHR0cFNlcnZlciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgKERhdmlkIFJlaXNzKQorVEhSSUZULTU5OCAgIFB5dGhvbiAgICAgICAgICAgICAgIEFsbG93IFB5dGhvbidzIHRocmVhZGluZyBzZXJ2ZXJzIHRvIHVzZSBkYWVtb24gdGhyZWFkcyAoRGF2aWQgUmVpc3MpCitUSFJJRlQtNjY2ICAgUHl0aG9uICAgICAgICAgICAgICAgQWxsb3cgdGhlIGhhbmRsZXIgdG8gb3ZlcnJpZGUgSFRUUCByZXNwb25zZXMgaW4gVEh0dHBTZXJ2ZXIgKERhdmlkIFJlaXNzKQorVEhSSUZULTY3MyAgIFB5dGhvbiAgICAgICAgICAgICAgIEdlbmVyYXRlZCBQeXRob24gY29kZSBoYXMgd2hpdGVzcGFjZSBpc3N1ZXMgKElhbiBFdXJlKQorVEhSSUZULTcyMSAgIFB5dGhvbiAgICAgICAgICAgICAgIFRIdHRwQ2xpZW50IGlnbm9yZXMgdXJsIHBhcmFtZXRlcnMgKFRob21hcyBLaG8pCitUSFJJRlQtODI0ICAgUHl0aG9uICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLl9fc3RyX18oKSByZWZlcnMgdG8gY2xhc3MgY29uc3RhbnRzIGFzIGdsb2JhbHMgKFBldGVyIFNjaHVsbGVyKQorVEhSSUZULTg1NSAgIFB5dGhvbiAgICAgICAgICAgICAgIEluY2x1ZGUgb3B0aW1pemVkIGNvbXBpbGVkIHB5dGhvbiBvYmplY3RzIGluIGluc3RhbGwgKEFudGhvbnkgTW9saW5hcm8pCitUSFJJRlQtODU5ICAgUHl0aG9uICAgICAgICAgICAgICAgQWxsb3cgcHk6dHdpc3RlZCB0byBiZSBnZW5lcmF0ZWQgaW4gZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuIHB5IChCcnVjZSBMb3dla2FtcCkKK1RIUklGVC04NjkgICBQeXRob24gICAgICAgICAgICAgICBUU29ja2V0LnB5IG9uIE1hYyAoYW5kIEZyZWVCU0QpIGRvZXNuJ3QgaGFuZGxlIEVDT05OUkVTRVQgZnJvbSByZWN2KCkgKFN0ZXZlbiBLbmlnaHQpCitUSFJJRlQtODc1ICAgUHl0aG9uICAgICAgICAgICAgICAgSW5jbHVkZSBweXRob24gc2V0dXAuY2ZnIGluIGRpc3QgKEFudGhvbnkgTW9saW5hcm8pCitUSFJJRlQtNjEwICAgUnVieSAgICAgICAgICAgICAgICAgYmluYXJ5X3Byb3RvY29sLnJiIHNlZ2ZhdWx0cyBbbGluZSA4Nl0gKFVuYXNzaWduZWQpCitUSFJJRlQtODk5ICAgUnVieSAgICAgICAgICAgICAgICAgUnVieSByZWFkIHRpbWVvdXRzIGNhbiBzb21ldGltZXMgYmUgMnggd2hhdCB0aGV5IHNob3VsZCBiZSAoUnlhbiBLaW5nKQorVEhSSUZULTkwOSAgIFJ1YnkgICAgICAgICAgICAgICAgIGFsbG93IGJsb2NrIGFyZ3VtZW50IHRvIHN0cnVjdCBjb25zdHJ1Y3RvciAoTWljaGFlbCBTdG9ja3RvbikKK1RIUklGVC00NTYgICBUZXN0IFN1aXRlICAgICAgICAgICBCYWQgSVAgYWRkcmVzcyBzdHJpbmcgaW4gdGVzdC9jcHAvc3JjL21haW4uY3BwIChSdXNoIE1hbmJlcnQpCisKKworVGhyaWZ0IDAuNC4wIC0gSW5jdWJhdGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RIUklGVC02NTAgICBCdWlsZCAgICAgICAgTWFrZSBDaGVjayBmYWlscyBvbiBDZW50b3MvT1NYIHdpdGggMC4yLjAgdGFyYmFsbCAoQW50aG9ueSBNb2xpbmFybykKK1RIUklGVC03NzAgICBCdWlsZCAgICAgICAgR2V0ICdtYWtlIGRpc3QnIHRvIHdvcmsgd2l0aG91dCBmaXJzdCBjb21waWxpbmcgc291cmNlIGNvZGUgKEFudGhvbnkgTW9saW5hcm8pCitUSFJJRlQtMTYwICAgQyMgICAgICAgICAgIENyZWF0ZWQgVEh0dHBUcmFuc3BvcnQgZm9yIHRoZSBDIyBsaWJyYXJ5IGJhc2VkIG9uIFdlYkh0dHBSZXF1ZXN0IChNaWNoYWVsIEdyZWVuZSkKK1RIUklGVC04MzQgICBDIyAgICAgICAgICAgVEh0dHBDbGllbnQgcmVzZW5kcyBjb250ZW50cyBvZiBtZXNzYWdlIGFmdGVyIHRyYW5zcG9ydCBlcnJvcnMgKEFuYXRvbHkgRmF5bmdlbGVyaW4pCitUSFJJRlQtMjQ3ICAgQysrICAgICAgICAgIFRIdHRwU2VydmVyIFRyYW5zcG9ydCAoVW5hc3NpZ25lZCkKK1RIUklGVC02NzYgICBDKysgICAgICAgICAgQ2hhbmdlIEMrKyBjb2RlIGdlbmVyYXRvciBzbyB0aGF0IGdlbmVyYXRlZCBjbGFzc2VzIGNhbiBiZSB3cmFwcGVkIHdpdGggU1dJRyAoVW5hc3NpZ25lZCkKK1RIUklGVC01NzAgICBDb21waWxlciAgICAgVGhyaWZ0IGNvbXBpbGVyIGRvZXMgbm90IGVycm9yIHdoZW4gZHVwbGljYXRlIG1ldGhvZCBuYW1lcyBhcmUgcHJlc2VudCAoQnJ1Y2UgU2ltcHNvbikKK1RIUklGVC04MDggICBDb21waWxlciAgICAgU2VnZmF1bHQgd2hlbiBjb25zdGFudCBkZWNsYXJhdGlvbiByZWZlcmVuY2VzIGEgc3RydWN0IGZpZWxkIHRoYXQgZG9lc24ndCBleGlzdCAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC02NDYgICBFcmxhbmcgICAgICAgRXJsYW5nIGxpYnJhcnkgaXMgbWlzc2luZyBpbnN0YWxsIHRhcmdldCAoQW50aG9ueSBNb2xpbmFybykKK1RIUklGVC01NDQgICBHZW5lcmFsICAgICAgbXVsdGlwbGUgZW51bXMgd2l0aCB0aGUgc2FtZSBrZXkgZ2VuZXJhdGUgaW52YWxpZCBjb2RlIChCZW4gVGFpdGVsYmF1bSkKK1RIUklGVC00MzQgICBHZW5lcmFsICAgICAgcnVieSBjb21waWxlciBzaG91bGQgd2FybiB3aGVuIGEgcmVzZXJ2ZWQgd29yZCBpcyB1c2VkIChNaWNoYWVsIFN0b2NrdG9uKQorVEhSSUZULTc5OSAgIEdlbmVyYWwgICAgICBGaWxlcyBtaXNzaW5nIHByb3BlciBBcGFjaGUgbGljZW5zZSBoZWFkZXIgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtODMyICAgSFRNTCAgICAgICAgIEhUTUwgZ2VuZXJhdG9yIHNob3dzIHVuc3BlY2lmaWVkIHN0cnVjdCBmaWVsZHMgYXMgJ3JlcXVpcmVkJyAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC0yMjYgICBKYXZhICAgICAgICAgQ29sbGVjdGlvbnMgd2l0aCBiaW5hcnkga2V5cyBvciB2YWx1ZXMgYnJlYWsgZXF1YWxzKCkgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtNDg0ICAgSmF2YSAgICAgICAgIEFiaWxpdHkgdG8gdXNlIGEgc2xpY2Ugb2YgYSBidWZmZXIgaW5zdGVhZCBvZiBhIGRpcmVjdCBieXRlW10gZm9yIGJpbmFyeSBmaWVsZHMgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtNzE0ICAgSmF2YSAgICAgICAgIG1heFdvcmtlclRocmVhZHMgcGFyYW1ldGVyIHRvIFRIc0hhU2VydmVyIGhhcyBubyBlZmZlY3QgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtNzUxICAgSmF2YSAgICAgICAgIEFkZCBjbGVhcigpIG1ldGhvZCB0byBUQmFzZSAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC03NjUgICBKYXZhICAgICAgICAgSW1wcm92ZWQgc3RyaW5nIGVuY29kaW5nIGFuZCBkZWNvZGluZyBwZXJmb3JtYW5jZSAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC03NjggICBKYXZhICAgICAgICAgQXN5bmMgY2xpZW50IGZvciBKYXZhIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTc3NCAgIEphdmEgICAgICAgICBURGVzZXJpYWxpemVyIHNob3VsZCBwcm92aWRlIGEgcGFydGlhbERlc2VyaWFsaXplIG1ldGhvZCBmb3IgcHJpbWl0aXZlIHR5cGVzIChQaW90ciBLb3ppa293c2tpKQorVEhSSUZULTc4MyAgIEphdmEgICAgICAgICAuZXF1YWxzIGphdmEgbWV0aG9kIGlzIGJyb2tlbiBvbiBzdHJ1Y3RzIGNvbnRhaW5pbmcgYmluYXJ5LXR5cGUgZmllbGRzIChVbmFzc2lnbmVkKQorVEhSSUZULTgwNCAgIEphdmEgICAgICAgICBDb21wYXJlVG8gaXMgYnJva2VuIGZvciB1bmlvbnMgc2V0IHRvIG1hcCwgc2V0LCBvciBsaXN0IChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTgxNCAgIEphdmEgICAgICAgICBJbmNsdWRlIGEgVFNlcnZsZXQgaW4gdGhlIHN0YW5kYXJkIFRocmlmdCBkaXN0cmlidXRpb24gKE1hdGhpYXMgSGVyYmVydHMpCitUSFJJRlQtODE4ICAgSmF2YSAgICAgICAgIEFzeW5jIGNsaWVudCBkb2Vzbid0IHNlbmQgbWV0aG9kIGFyZ3MgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtODMwICAgSmF2YSAgICAgICAgIFN3aXRjaCBiaW5hcnkgZmllbGQgaW1wbGVtZW50YXRpb24gZnJvbSBieXRlW10gdG8gQnl0ZUJ1ZmZlciAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC04MzEgICBKYXZhICAgICAgICAgRnJhbWVkVHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIHRoYXQgcmV1c2VzIGl0cyBidWZmZXJzIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTgzMyAgIEphdmEgICAgICAgICBidWlsZC54bWwgaW4gbGliL2phdmEgaXMgbWlzc2luZyBhIGNsYXNzcGF0aHJlZiBhdHRyaWJ1dGUgZm9yIHRoZSBqYXZhZG9jIHRhc2sgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtODM2ICAgSmF2YSAgICAgICAgIFJhY2UgY29uZGl0aW9uIGNhdXNlcyBDYW5jZWxsZWRLZXlFeGNlcHRpb24gaW4gVEFzeW5jQ2xpZW50TWFuYWdlciAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC04NDIgICBKYXZhICAgICAgICAgVXBncmFkZSB0byBjdXJyZW50IHZlcnNpb24gb2YgY29tbW9ucy1sYW5nICgyLjUgaW5zdGVhZCBvZiAyLjQpIGFuZC9vciBjaGFuZ2UgZGVwZW5kZW5jeSBpbiBpdnkueG1sIHRvIG5vdCBiZSBleGFjdCAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC04MTUgICBKYXZhU2NyaXB0ICAgRGVzZXJpYWxpemF0aW9uIG9mIGxpc3RzIGlzIGNyaXRpY2FsbHkgYnJva2VuLiAoVCBKYWtlIEx1Y2lhbmkpCitUSFJJRlQtODI3ICAgT0NhbWwgICAgICAgIE9DYW1sIGdlbmVyYXRvciB0byB0YWtlIGRlZmF1bHQgdmFsdWVzIGludG8gYWNjb3VudCAoTGV2IFdhbGtpbikKK1RIUklGVC02NDcgICBQSFAgICAgICAgICAgUEhQIGxpYnJhcnkgaXMgbWlzc2luZyBpbnN0YWxsIHRhcmdldCAoQW50aG9ueSBNb2xpbmFybykKK1RIUklGVC02ODIgICBQSFAgICAgICAgICAgUEhQIGV4dGVuc2lvbiBkb2Vzbid0IGNvbXBpbGUgb24gTWFjIE9TIFggKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtNzE4ICAgUEhQICAgICAgICAgIFRocmlmdCBQSFAgbGlicmFyeSBpbmNsdWRlcyBjbG9zaW5nIHRhZ3MgYW5kIGV4dHJhbmVvdXMgd2hpdGVzcGFjZSAoTmljaG9sYXMgVGVsZm9yZCkKK1RIUklGVC03NzggICBQSFAgICAgICAgICAgUEhQIHNvY2tldCBsaXN0ZW5pbmcgc2VydmVyIChOaWNrIEpvbmVzKQorVEhSSUZULTc4MCAgIFBIUCAgICAgICAgICBQSFAgZXh0ZW5zaW9uIHNvbWV0aW1lcyBjYXVzZXMgYW4gYWJvcnQgd2l0aCB0d28gZXhjZXB0aW9ucyBhdCB0aGUgc2FtZSB0aW1lIChEYXZpZCBSZWlzcykKK1RIUklGVC04MzcgICBQSFAgICAgICAgICAgUEhQIGFjY2VsZXJhdG9yIGJ1ZyBmb3Igd3JpdGVzID4gOGsgKFRob21hcyBLaG8pCitUSFJJRlQtNzgyICAgUGVybCAgICAgICAgIFBlcmwgY29kZSBmb3Igd3JpdGluZyBjb250YWluZXJzIGRvZXNuJ3QgY291bnQgbGVuZ3RoIG9mIHdyaXRlKkJlZ2luIG9yIHdyaXRlKkVuZCAoQ29ucmFkIEh1Z2hlcykKK1RIUklGVC0zOTUgICBQeXRob24gICAgICAgUHl0aG9uIGxpYnJhcnkgKyBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IHVuaWNvZGUgc3RyaW5ncyAoVW5hc3NpZ25lZCkKK1RIUklGVC0xMzMgICBSdWJ5ICAgICAgICAgJ25hbWVzcGFjZSBydWJ5JyBzaG91bGQgZXJyb3Igb3V0LCBvciBiZSBhbiBhbGlhcyB0byAnbmFtZXNwYWNlIHJiJyAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC02NjQgICBSdWJ5ICAgICAgICAgUnVieSBleHRlbnNpb24gZmFpbHMgdG8gYnVpbGQgd2l0aCBSdWJ5IDEuOS4xIChSYWplc2ggTWFsZXBhdGkpCitUSFJJRlQtNjk5ICAgUnVieSAgICAgICAgIEV4Y2lzZSB1bnVzZWQgIm5hdGl2ZSBwcm90b2NvbCBtZXRob2QgdGFibGUiIHN0dWZmIGZyb20gdGhyaWZ0X25hdGl2ZSAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC03NjcgICBSdWJ5ICAgICAgICAgcnVieSBjb21waWxlciBkb2VzIG5vdCBrZWVwIGNvbW1lbnRzIGZvciBlbnVtIHZhbHVlcyAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC04MTEgICBSdWJ5ICAgICAgICAgaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiOiBhbGxvdyBjdXN0b20gaHR0cCBoZWFkZXJzIChUb255IEthbWVuaWNrKQorVEhSSUZULTQ1OSAgIFJ1YnkgICAgICAgICBSdWJ5IGluc3RhbGxhdGlvbiBhbHdheXMgdHJpZXMgdG8gd3JpdGUgdG8gL0xpYnJhcnkvUnVieS9zaXRlIChNYXR0aGlldSBJbWJlcnQpCisKKworVGhyaWZ0IDAuMS4wIC0gSW5jdWJhdGluZyAobm90IHJlbGVhc2VkKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbXBhdGliaWxpdHkgQnJlYWtpbmcgQ2hhbmdlczoKKyAgQysrOgorLSBJdCdzIHF1aXRlIHBvc3NpYmxlIHRoYXQgcmVnZW5lcmF0aW5nIGNvZGUgYW5kIHJlYnVpbGRpbmcgd2lsbCBiZQorICAgICAgcmVxdWlyZWQuICBNYWtlIHN1cmUgeW91ciBoZWFkZXJzIG1hdGNoIHlvdXIgbGlicyEKKworICBKYXZhOgorCisgIFB5dGhvbjoKKworICBSdWJ5OgorLSBHZW5lcmF0ZWQgZmlsZXMgbm93IGhhdmUgdW5kZXJzY29yZWQgbmFtZXMgW1RIUklGVC00MjFdCistIFRoZSBsaWJyYXJ5IGhhcyBiZWVuIHJlYXJyYW5nZWQgdG8gYmUgbW9yZSBSdWJ5LWxpa2UgW1RIUklGVC0yNzZdCisKKyAgRXJsYW5nOgorLSBHZW5lcmF0ZWQgY29kZSB3aWxsIGhhdmUgdG8gYmUgcmVnZW5lcmF0ZWQsIGFuZCB0aGUgbmV3IGNvZGUgd2lsbAorICAgICAgaGF2ZSB0byBiZSBkZXBsb3llZCBhdG9taWNhbGx5IHdpdGggdGhlIG5ldyBsaWJyYXJ5IGNvZGUgW1RIUklGVC0xMzZdCisKK05ldyBGZWF0dXJlcyBhbmQgQnVnIEZpeGVzOgorICBDKys6CistIFN1cHBvcnQgZm9yIFRDb21wYWN0UHJvdG9jb2wgW1RIUklGVC0zMzNdCisKKyAgSmF2YToKKy0gU3VwcG9ydCBmb3IgVENvbXBhY3RQcm90b2NvbCBbVEhSSUZULTExMF0KKworICBQeXRob246CistIFN1cHBvcnQgZm9yIFR3aXN0ZWQgW1RIUklGVC0xNDhdCisKKyAgUnVieToKKy0gU3VwcG9ydCBmb3IgVENvbXBhY3RQcm90b2NvbCBbVEhSSUZULTMzMl0KKwpkaWZmIC0tZ2l0IGEvQ01ha2VMaXN0cy50eHQgYi9DTWFrZUxpc3RzLnR4dAppbmRleCA0NGY2NWFmLi5jNzdhNjAxIDEwMDY0NAotLS0gYS9DTWFrZUxpc3RzLnR4dAorKysgYi9DTWFrZUxpc3RzLnR4dApAQCAtMTcsMjcgKzE3LDI2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1jbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjEyKQorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuNCkKIAotcHJvamVjdCgiQXBhY2hlIFRocmlmdCIpCitpZihQT0xJQ1kgQ01QMDA0OCkKKyAgY21ha2VfcG9saWN5KFNFVCBDTVAwMDQ4IE5FVykgICMgcGFja2FnZSB2ZXJzaW9uIGJlaGF2aW9yIGFkZGVkIGluIGNtYWtlIDMuMAorZW5kaWYoKQoraWYoUE9MSUNZIENNUDAwNzQpCisgIGNtYWtlX3BvbGljeShTRVQgQ01QMDA3NCBORVcpICAjIGZpbmRfcGFja2FnZSBiZWhhdmlvciBhZGRlZCBpbiBjbWFrZSAzLjEyCitlbmRpZigpCisKKyMgUEFDS0FHRV9WRVJTSU9OIGlzIHVzZWQgYnkgY3BhY2sgc2NyaXB0cyBjdXJyZW50bHkKKyMgQm90aCB0aHJpZnRfVkVSU0lPTiBhbmQgUEFDS0FHRV9WRVJTSU9OIHNob3VsZCBiZSB0aGUgc2FtZSBmb3Igbm93CitzZXQodGhyaWZ0X1ZFUlNJT04gIjAuMTMuMCIpCitzZXQoUEFDS0FHRV9WRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059KQorCitwcm9qZWN0KCJ0aHJpZnQiIFZFUlNJT04gJHtQQUNLQUdFX1ZFUlNJT059KQorbWVzc2FnZShTVEFUVVMgIkNvbmZpZ3VyaW5nICR7Q01BS0VfUFJPSkVDVF9OQU1FfSAke3RocmlmdF9WRVJTSU9OfSIpCisKIAogc2V0KENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX01PRFVMRV9QQVRIfSIgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9idWlsZC9jbWFrZSIpCiAKLSMgVE9ETzogYWRkIGBnaXQgcmV2LXBhcnNlIC0tc2hvcnQgSEVBRGAKLSMgUmVhZCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBBdXRvY29uZiBmaWxlCi1maWxlIChTVFJJTkdTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29uZmlndXJlLmFjIiBDT05GSUdVUkVfQUMgUkVHRVggIkFDX0lOSVRcXCguKlxcKSIgKQotCi0jIFRoZSBmb2xsb3dpbmcgdmFyaWFibGUgaXMgdXNlZCBpbiB0aGUgdmVyc2lvbi5oLmluIGZpbGUKLXN0cmluZyhSRUdFWCBSRVBMQUNFICJBQ19JTklUXFwoXFxbLipcXF0sIFxcWyhbMC05XStcXC5bMC05XStcXC5bMC05XSsoLWRldik/KVxcXVxcKSIgIlxcMSIgUEFDS0FHRV9WRVJTSU9OICR7Q09ORklHVVJFX0FDfSkKLW1lc3NhZ2UoU1RBVFVTICJQYXJzZWQgVGhyaWZ0IHBhY2thZ2UgdmVyc2lvbjogJHtQQUNLQUdFX1ZFUlNJT059IikKLQotIyBUaGVzZSBhcmUgaW50ZXJuYWwgdG8gQ01ha2UKLXN0cmluZyhSRUdFWCBSRVBMQUNFICIoWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rKSgtZGV2KT8iICJcXDEiIHRocmlmdF9WRVJTSU9OICR7UEFDS0FHRV9WRVJTSU9OfSkKLXN0cmluZyhSRUdFWCBSRVBMQUNFICIoWzAtOV0rKVxcLlswLTldK1xcLlswLTldKyIgIlxcMSIgdGhyaWZ0X1ZFUlNJT05fTUFKT1IgJHt0aHJpZnRfVkVSU0lPTn0pCi1zdHJpbmcoUkVHRVggUkVQTEFDRSAiWzAtOV0rXFwuKFswLTldKStcXC5bMC05XSsiICJcXDEiIHRocmlmdF9WRVJTSU9OX01JTk9SICR7dGhyaWZ0X1ZFUlNJT059KQotc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlswLTldK1xcLlswLTldK1xcLihbMC05XSspIiAiXFwxIiB0aHJpZnRfVkVSU0lPTl9QQVRDSCAke3RocmlmdF9WRVJTSU9OfSkKLW1lc3NhZ2UoU1RBVFVTICJQYXJzZWQgVGhyaWZ0IHZlcnNpb246ICR7dGhyaWZ0X1ZFUlNJT059ICgke3RocmlmdF9WRVJTSU9OX01BSk9SfS4ke3RocmlmdF9WRVJTSU9OX01JTk9SfS4ke3RocmlmdF9WRVJTSU9OX1BBVENIfSkiKQotCiAjIFNvbWUgZGVmYXVsdCBzZXR0aW5ncwogaW5jbHVkZShEZWZpbmVDTWFrZURlZmF1bHRzKQogCkBAIC00OCwxNiArNDcsMjAgQEAKICMgQmFzZWQgb24gdGhlIG9wdGlvbnMgc2V0IHNvbWUgcGxhdGZvcm0gc3BlY2lmaWNzCiBpbmNsdWRlKERlZmluZVBsYXRmb3JtU3BlY2lmYykKIAorIyBBZGQgQ01ha2UgdGFyZ2V0cyBmb3Igc3RhdGljIGNvZGUgYW5hbHlzaXMKK2luY2x1ZGUoU3RhdGljQ29kZUFuYWx5c2lzKQorCiAjIEdlbmVyYXRlIHRoZSBjb25maWcuaCBmaWxlCiBpbmNsdWRlKENvbmZpZ3VyZUNoZWNrcykKIAotIyBQYWNrYWdlIGl0CisjIFBhY2thZ2luZwogaW5jbHVkZShDUGFja0NvbmZpZykKIAotCisjIERlcGVuZGVuY2llcworaW5jbHVkZShCb29zdE1hY3JvcykKIGZpbmRfcGFja2FnZShUaHJlYWRzKQotCiBpbmNsdWRlKENUZXN0KQorCiBpZihCVUlMRF9URVNUSU5HKQogICBtZXNzYWdlKFNUQVRVUyAiQnVpbGRpbmcgd2l0aCB1bml0dGVzdHMiKQogCkBAIC02NywxNSArNzAsMjIgQEAKIGVsc2UgKCkKICAgbWVzc2FnZShTVEFUVVMgIkJ1aWxkaW5nIHdpdGhvdXQgdGVzdHMiKQogZW5kaWYgKCkKKwogaWYoQlVJTERfQ09NUElMRVIpCisgICAgaWYoTk9UIEVYSVNUUyAke1RIUklGVF9DT01QSUxFUn0pCisgICAgICAgIHNldChUSFJJRlRfQ09NUElMRVIgJDxUQVJHRVRfRklMRTp0aHJpZnQtY29tcGlsZXI+KQorICAgIGVuZGlmKCkKICAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb21waWxlci9jcHApCitlbHNlaWYoRVhJU1RTICR7VEhSSUZUX0NPTVBJTEVSfSkKKyAgICBhZGRfZXhlY3V0YWJsZSh0aHJpZnQtY29tcGlsZXIgSU1QT1JURUQpCisgICAgc2V0X3Byb3BlcnR5KFRBUkdFVCB0aHJpZnQtY29tcGlsZXIgUFJPUEVSVFkgSU1QT1JURURfTE9DQVRJT04gJHtUSFJJRlRfQ09NUElMRVJ9KQogZW5kaWYoKQogCiBpZihCVUlMRF9DUFApCiAgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL2NwcCkKICAgICBpZihCVUlMRF9UVVRPUklBTFMpCiAgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3R1dG9yaWFsL2NwcCkKLSAgICBlbmRpZihCVUlMRF9UVVRPUklBTFMpCisgICAgZW5kaWYoKQogICAgIGlmKEJVSUxEX1RFU1RJTkcpCiAgICAgICAgIGlmKFdJVEhfTElCRVZFTlQgQU5EIFdJVEhfWkxJQiBBTkQgV0lUSF9PUEVOU1NMKQogICAgICAgICAgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC9jcHApCkBAIC04NSw4ICs5NSwxNSBAQAogICAgIGVuZGlmKCkKIGVuZGlmKCkKIAoraWYoQlVJTERfQVMzKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYi9hczMpCitlbmRpZigpCisKIGlmKEJVSUxEX0NfR0xJQikKICAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWIvY19nbGliKQorICAgIGlmKEJVSUxEX1RFU1RJTkcpCisgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliKQorICAgIGVuZGlmKCkKIGVuZGlmKCkKIAogaWYoQlVJTERfSkFWQSkKQEAgLTEwMCw0ICsxMTcsMTEgQEAKICAgICBlbmRpZigpCiBlbmRpZigpCiAKK2lmKEJVSUxEX0hBU0tFTEwpCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL2hzKQorICAgIGlmKEJVSUxEX1RFU1RJTkcpCisgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvaHMpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCiBQUklOVF9DT05GSUdfU1VNTUFSWSgpCmRpZmYgLS1naXQgYS9DT05UUklCVVRJTkcubWQgYi9DT05UUklCVVRJTkcubWQKaW5kZXggNzYwNDFmNi4uN2ExOTlmNyAxMDA2NDQKLS0tIGEvQ09OVFJJQlVUSU5HLm1kCisrKyBiL0NPTlRSSUJVVElORy5tZApAQCAtMSw0OSArMSwxMTYgQEAKLSMjIEhvdyB0byBjb250cmlidXRlCi0gMS4gSGVscCB0byByZXZpZXcgYW5kIHZlcmlmeSBleGlzdGluZyBwYXRjaGVzCi0gMS4gTWFrZSBzdXJlIHlvdXIgaXNzdWUgaXMgbm90IGFsbCByZWFkeSBpbiB0aGUgW0ppcmEgaXNzdWUgdHJhY2tlcl0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkKLSAxLiBJZiBub3QsIGNyZWF0ZSBhIHRpY2tldCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UgeW91J3JlIHByb3Bvc2luZyBpbiB0aGUgW0ppcmEgaXNzdWUgdHJhY2tlcl0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkKLSAxLiBDb250cmlidXRlIHlvdXIgcGF0Y2ggdXNpbmcgb25lIG9mIHRoZSB0d28gbWV0aG9kcyBiZWxvdworIyBIb3cgdG8gQ29udHJpYnV0ZSAjCiAKLSMjIyBDb250cmlidXRpbmcgdmlhIGEgcGF0Y2gKLQotMS4gQ2hlY2sgb3V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgc291cmNlIGNvZGUKLQotICAqIGdpdCBjbG9uZSBodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdCB0aHJpZnQKLQotMS4gTW9kaWZ5IHRoZSBzb3VyY2UgdG8gaW5jbHVkZSB0aGUgaW1wcm92ZW1lbnQvYnVnZml4Ci0KLSAgKiBSZW1lbWJlciB0byBwcm92aWRlICp0ZXN0cyogZm9yIGFsbCBzdWJtaXRlZCBjaGFuZ2VzCi0gICogV2hlbiBidWdmaXhpbmc6IGFkZCB0ZXN0IHRoYXQgd2lsbCBpc29sYXRlIGJ1ZyAqYmVmb3JlKiBhcHBseWluZyBjaGFuZ2UgdGhhdCBmaXhlcyBpdAotICAqIFZlcmlmeSB0aGF0IHlvdSBmb2xsb3cgW1RocmlmdCBDb2RpbmcgU3RhbmRhcmRzXSgvY29kaW5nX3N0YW5kYXJkcykgKHlvdSBjYW4gcnVuICdtYWtlIHN0eWxlJywgd2hpY2ggZW5zdXJlcyBwcm9wZXIgZm9ybWF0IGZvciBzb21lIGxhbmd1YWdlcykKLQotMS4gQ3JlYXRlIGEgcGF0Y2ggZnJvbSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5IChlLmcuIHlvdUBkZXY6fi90aHJpZnQgJCApOgotCi0gICogZ2l0IGRpZmYgPiAuLi90aHJpZnQtWFhYLW15LW5ldy1mZWF0dXJlLnBhdGNoCi0KLTEuIEF0dGFjaCB0aGUgbmV3bHkgZ2VuZXJhdGVkIHBhdGNoIHRvIHRoZSBpc3N1ZQotMS4gV2FpdCBmb3Igb3RoZXIgY29udHJpYnV0b3JzIG9yIGNvbW1pdHRlcnMgdG8gcmV2aWV3IHlvdXIgbmV3IGFkZGl0aW9uCi0xLiBXYWl0IGZvciBhIGNvbW1pdHRlciB0byBjb21taXQgeW91ciBwYXRjaAotCi0jIyMgQ29udHJpYnV0aW5nIHZpYSBHaXRIdWIgcHVsbCByZXF1ZXN0cwotCi0xLiBDcmVhdGUgYSBmb3JrIGZvciBodHRwOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0Ci0xLiBDcmVhdGUgYSBicmFuY2ggZm9yIHlvdXIgY2hhbmdlcyhiZXN0IHByYWN0aWNlIGlzIGlzc3VlIGFzIGJyYW5jaCBuYW1lLCBlLmcuIFRIUklGVC05OTk5KQotMS4gTW9kaWZ5IHRoZSBzb3VyY2UgdG8gaW5jbHVkZSB0aGUgaW1wcm92ZW1lbnQvYnVnZml4Ci0KLSAgKiBSZW1lbWJlciB0byBwcm92aWRlICp0ZXN0cyogZm9yIGFsbCBzdWJtaXRlZCBjaGFuZ2VzCi0gICogV2hlbiBidWdmaXhpbmc6IGFkZCB0ZXN0IHRoYXQgd2lsbCBpc29sYXRlIGJ1ZyAqYmVmb3JlKiBhcHBseWluZyBjaGFuZ2UgdGhhdCBmaXhlcyBpdAotICAqIFZlcmlmeSB0aGF0IHlvdSBmb2xsb3cgW1RocmlmdCBDb2RpbmcgU3RhbmRhcmRzXSgvY29kaW5nX3N0YW5kYXJkcykgKHlvdSBjYW4gcnVuICdtYWtlIHN0eWxlJywgd2hpY2ggZW5zdXJlcyBwcm9wZXIgZm9ybWF0IGZvciBzb21lIGxhbmd1YWdlcykKLSAgKiBWZXJpZnkgdGhhdCB5b3VyIGNoYW5nZSB3b3JrcyBvbiBvdGhlciBwbGF0Zm9ybXMgYnkgYWRkaW5nIGEgR2l0SHViIHNlcnZpY2UgaG9vayB0byBbVHJhdmlzIENJXShodHRwOi8vZG9jcy50cmF2aXMtY2kuY29tL3VzZXIvZ2V0dGluZy1zdGFydGVkLyNTdGVwLW9uZSUzQS1TaWduLWluKSBhbmQgW0FwcFZleW9yXShodHRwOi8vd3d3LmFwcHZleW9yLmNvbS9kb2NzKQotCi0xLiBDb21taXQgYW5kIHB1c2ggY2hhbmdlcyB0byB5b3VyIGJyYW5jaCAocGxlYXNlIHVzZSBpc3N1ZSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBhcyBjb21taXQgdGl0bGUsIGUuZy4gVEhSSUZULTk5OTkgbWFrZSBpdCBwZXJmZWN0KQotMS4gSXNzdWUgYSBwdWxsIHJlcXVlc3Qgd2l0aCB0aGUgamlyYSB0aWNrZXQgbnVtYmVyIHlvdSBhcmUgd29ya2luZyBvbiBpbiBpdCdzIG5hbWUKLTEuIFdhaXQgZm9yIG90aGVyIGNvbnRyaWJ1dG9ycyBvciBjb21taXR0ZXJzIHRvIHJldmlldyB5b3VyIG5ldyBhZGRpdGlvbgotMS4gV2FpdCBmb3IgYSBjb21taXR0ZXIgdG8gY29tbWl0IHlvdXIgcGF0Y2gKLQotIyMjIE1vcmUgaW5mbwotCi0gUGxlbnR5IG9mIGluZm9ybWF0aW9uIG9uIHdoeSBhbmQgaG93IHRvIGNvbnRyaWJ1dGUgaXMgYXZhaWxhYmxlIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB3ZWIgc2l0ZS4gSW4gcGFydGljdWxhciwgd2UgcmVjb21tZW5kIHRoZSBmb2xsb3dpbmc6CitUaGFuayB5b3UgZm9yIHlvdXIgaW50ZXJlc3QgaW4gY29udHJpYnV0aW5nIHRvIHRoZSBBcGFjaGUgVGhyaWZ0IHByb2plY3QhICBJbmZvcm1hdGlvbiBvbiB3aHkgYW5kIGhvdyB0byBjb250cmlidXRlIGlzIGF2YWlsYWJsZSBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgd2ViIHNpdGUuIEluIHBhcnRpY3VsYXIsIHdlIHJlY29tbWVuZCB0aGUgZm9sbG93aW5nIHRvIGJlY29tZSBhY3F1YWludGVkIHdpdGggQXBhY2hlIENvbnRyaWJ1dGlvbnM6CiAKICAqIFtDb250cmlidXRvcnMgVGVjaCBHdWlkZV0oaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9jb250cmlidXRvcnMpCiAgKiBbR2V0IGludm9sdmVkIV0oaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vZ2V0aW52b2x2ZWQuaHRtbCkKICAqIFtMZWdhbCBhc3BlY3RzIG9uIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucyAoUGF0Y2hlcyldKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sI2NvbnRyaWJ1dGlvbnMpCisKKyMjIEdpdEh1YiBwdWxsIHJlcXVlc3RzICMjCisKK1RoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2Qgb2Ygc3VibWl0dGluZyBjaGFuZ2VzLiAgV2hlbiB5b3Ugc3VibWl0IGEgcHVsbCByZXF1ZXN0IHRocm91Z2ggZ2l0aHViLAoraXQgYWN0aXZhdGVzIHRoZSBjb250aW51b3VzIGludGVncmF0aW9uIChDSSkgYnVpbGQgc3lzdGVtcyBhdCBBcHB2ZXlvciBhbmQgVHJhdmlzIHRvIGJ1aWxkIHlvdXIgY2hhbmdlc3hpCitvbiBhIHZhcmlldHkgb2YgTGludXggYW5kIFdpbmRvd3MgY29uZmlndXJhdGlvbnMgYW5kIHJ1biBhbGwgdGhlIHRlc3Qgc3VpdGVzLiAgRm9sbG93IHRoZXNlIHJlcXVpcmVtZW50cyAKK2ZvciBhIHN1Y2Nlc3NmdWwgcHVsbCByZXF1ZXN0OgorCisgMS4gQWxsIHNpZ25pZmljYW50IGNoYW5nZXMgcmVxdWlyZSBhbiBbQXBhY2hlIEppcmEgVEhSSUZUIElzc3VlXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKSB0aWNrZXQuICBUcml2aWFsIGNoYW5nZXMgc3VjaCBhcyBmaXhpbmcgYSB0eXBvIG9yIGEgY29tcGlsZXIgd2FybmluZyBkbyBub3QuCisKKyAxLiBBbGwgcHVsbCByZXF1ZXN0cyBzaG91bGQgY29udGFpbiBhIHNpbmdsZSBjb21taXQgcGVyIGlzc3VlLCBvciB3ZSB3aWxsIGFzayB5b3UgdG8gc3F1YXNoIGl0LgorIDEuIFRoZSBwdWxsIHJlcXVlc3QgdGl0bGUgbXVzdCBiZWdpbiB3aXRoIHRoZSBKaXJhIFRIUklGVCB0aWNrZXQgaWRlbnRpZmllciBpZiBpdCBoYXMgYW4gYXNzb2NpYXRlZCB0aWNrZXQsIGZvciBleGFtcGxlOgorCisgICAgICAgIFRIUklGVC05OTk5OiBhbiBleGFtcGxlIHB1bGwgcmVxdWVzdCB0aXRsZQorICAgICAgICAKKyAxLiBDb21taXQgbWVzc2FnZXMgbXVzdCBmb2xsb3cgdGhpcyBwYXR0ZXJuIGZvciBjb2RlIGNoYW5nZXMgKGRldmlhdGlvbnMgd2lsbCBub3QgYmUgbWVyZ2VkKToKKyAgICAgICAgCisgICAgICAgIFRIUklGVC05OTk5OiBbc3VtbWFyeSBvZiBmaXgsIG9uZSBsaW5lIGlmIHBvc3NpYmxlXQorICAgICAgICBDbGllbnQ6IFtsYW5ndWFnZShzKSBhZmZlY3RlZCwgY29tbWEgc2VwYXJhdGVkLCBmb3IgZXhhbXBsZTogImNwcCxlcmwscGVybCJdCisKK0luc3RydWN0aW9uczoKKworIDEuIENyZWF0ZSBhIGZvcmsgaW4geW91ciBHaXRIdWIgYWNjb3VudCBvZiBodHRwOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0CisgMS4gQ2xvbmUgdGhlIGZvcmsgdG8geW91ciBkZXZlbG9wbWVudCBzeXN0ZW0uCisgMS4gQ3JlYXRlIGEgYnJhbmNoIGZvciB5b3VyIGNoYW5nZXMgKGJlc3QgcHJhY3RpY2UgaXMgaXNzdWUgYXMgYnJhbmNoIG5hbWUsIGUuZy4gVEhSSUZULTk5OTkpLgorIDEuIE1vZGlmeSB0aGUgc291cmNlIHRvIGluY2x1ZGUgdGhlIGltcHJvdmVtZW50L2J1Z2ZpeCwgYW5kOgorCisgICAgKiBSZW1lbWJlciB0byBwcm92aWRlICp0ZXN0cyogZm9yIGFsbCBzdWJtaXR0ZWQgY2hhbmdlcyEKKyAgICAqIFVzZSB0ZXN0LWRyaXZlbiBkZXZlbG9wbWVudCAoVEREKTogYWRkIGEgdGVzdCB0aGF0IHdpbGwgaXNvbGF0ZSB0aGUgYnVnICpiZWZvcmUqIGFwcGx5aW5nIHRoZSBjaGFuZ2UgdGhhdCBmaXhlcyBpdC4KKyAgICAqIFZlcmlmeSB0aGF0IHlvdSBmb2xsb3cgW1RocmlmdCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jcy9jb2Rpbmdfc3RhbmRhcmRzKSAoeW91IGNhbiBydW4gJ21ha2Ugc3R5bGUnLCB3aGljaCBlbnN1cmVzIHByb3BlciBmb3JtYXQgZm9yIHNvbWUgbGFuZ3VhZ2VzKS4KKyAgICAqIFsqb3B0aW9uYWwqXSBWZXJpZnkgdGhhdCB5b3VyIGNoYW5nZSB3b3JrcyBvbiBvdGhlciBwbGF0Zm9ybXMgYnkgYWRkaW5nIGEgR2l0SHViIHNlcnZpY2UgaG9vayB0byBbVHJhdmlzIENJXShodHRwOi8vZG9jcy50cmF2aXMtY2kuY29tL3VzZXIvZ2V0dGluZy1zdGFydGVkLyNTdGVwLW9uZSUzQS1TaWduLWluKSBhbmQgW0FwcFZleW9yXShodHRwOi8vd3d3LmFwcHZleW9yLmNvbS9kb2NzKS4gIFlvdSBjYW4gdXNlIHRoaXMgdGVjaG5pcXVlIHRvIHJ1biB0aGUgVGhyaWZ0IENJIGpvYnMgaW4geW91ciBhY2NvdW50IHRvIGNoZWNrIHlvdXIgY2hhbmdlcyBiZWZvcmUgdGhleSBhcmUgbWFkZSBwdWJsaWMuICBFdmVyeSBHaXRIdWIgcHVsbCByZXF1ZXN0IGludG8gVGhyaWZ0IHdpbGwgcnVuIHRoZSBmdWxsIENJIGJ1aWxkIGFuZCB0ZXN0IHN1aXRlIG9uIHlvdXIgY2hhbmdlcy4KKworIDEuIFNxdWFzaCB5b3VyIGNoYW5nZXMgdG8gYSBzaW5nbGUgY29tbWl0LiAgVGhpcyBtYWludGFpbnMgY2xlYW4gY2hhbmdlIGhpc3RvcnkuCisgMS4gQ29tbWl0IGFuZCBwdXNoIGNoYW5nZXMgdG8geW91ciBicmFuY2ggKHBsZWFzZSB1c2UgaXNzdWUgbmFtZSBhbmQgZGVzY3JpcHRpb24gYXMgY29tbWl0IHRpdGxlLCBlLmcuICJUSFJJRlQtOTk5OTogbWFrZSBpdCBwZXJmZWN0IiksIHdpdGggdGhlIGFmZmVjdGVkIGxhbmd1YWdlcyBvbiB0aGUgbmV4dCBsaW5lIG9mIHRoZSBkZXNjcmlwdGlvbi4KKyAxLiBVc2UgR2l0SHViIHRvIGNyZWF0ZSBhIHB1bGwgcmVxdWVzdCBnb2luZyBmcm9tIHlvdXIgYnJhbmNoIHRvIGFwYWNoZTptYXN0ZXIuICBFbnN1cmUgdGhhdCB0aGUgSmlyYSB0aWNrZXQgbnVtYmVyIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRpdGxlIG9mIHlvdXIgcHVsbCByZXF1ZXN0LCBzYW1lIGFzIHRoZSBjb21taXQgdGl0bGUuCisgMS4gV2FpdCBmb3Igb3RoZXIgY29udHJpYnV0b3JzIG9yIGNvbW1pdHRlcnMgdG8gcmV2aWV3IHlvdXIgbmV3IGFkZGl0aW9uLCBhbmQgZm9yIGEgQ0kgYnVpbGQgdG8gY29tcGxldGUuCisgMS4gV2FpdCBmb3IgYSBjb21taXR0ZXIgdG8gY29tbWl0IHlvdXIgcGF0Y2guICBZb3UgY2FuIG51ZGdlIHRoZSBjb21taXR0ZXJzIGlmIG5lY2Vzc2FyeSBieSBzZW5kaW5nIGEgbWVzc2FnZSB0byB0aGUgW0FwYWNoZSBUaHJpZnQgbWFpbGluZyBsaXN0XShodHRwczovL3RocmlmdC5hcGFjaGUub3JnL21haWxpbmcpLgorCisjIyBJZiB5b3Ugd2FudCB0byBidWlsZCB0aGUgcHJvamVjdCBsb2NhbGx5ICMjCisKK0ZvciBXaW5kb3dzIHN5c3RlbXMsIHNlZSBvdXIgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBbQ01ha2UgUkVBRE1FXSgvYnVpbGQvY21ha2UvUkVBRE1FLm1kKS4KKworRm9yIFdpbmRvd3MgTmF0aXZlIEMrKyBidWlsZHMsIHNlZSBvdXIgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBbV2luQ1BQIFJFQURNRV0oL2J1aWxkL3dpbmNwcC9SRUFETUUubWQpLgorCitGb3IgdW5peCBzeXN0ZW1zLCBzZWUgb3VyIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiB0aGUgW0RvY2tlciBSRUFETUVdKC9idWlsZC9kb2NrZXIvUkVBRE1FLm1kKS4KKworIyMgSWYgeW91IHdhbnQgdG8gcmV2aWV3IG9wZW4gaXNzdWVzLi4uICMjCisKKyAxLiBSZXZpZXcgdGhlIFtHaXRIdWIgUHVsbCBSZXF1ZXN0IEJhY2tsb2ddKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L3B1bGxzKS4gIENvZGUgcmV2aWV3cyBhcmUgb3BlbiB0byBhbGwuCisgMi4gUmV2aWV3IHRoZSBbSmlyYSBpc3N1ZSB0cmFja2VyXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKS4gIFlvdSBjYW4gc2VhcmNoIGZvciB0aWNrZXRzIHJlbGF0aW5nIHRvIGxhbmd1YWdlcyB5b3UgYXJlIGludGVyZXN0ZWQgaW4gb3IgY3VycmVudGx5IHVzaW5nIHdpdGggdGhyaWZ0LCBmb3IgZXhhbXBsZSBhIEppcmEgc2VhcmNoIChJc3N1ZXMgLT4gU2VhcmNoIEZvciBJc3N1ZXMpIHF1ZXJ5IG9mIGBgcHJvamVjdCA9IFRIUklGVCBBTkQgY29tcG9uZW50IGluICgiRXJsYW5nIC0gTGlicmFyeSIpIGFuZCBzdGF0dXMgbm90IGluIChyZXNvbHZlZCwgY2xvc2VkKWBgIHdpbGwgbG9jYXRlIGFsbCB0aGUgb3BlbiBFcmxhbmcgTGlicmFyeSBpc3N1ZXMuCisKKyMjIElmIHlvdSBkaXNjb3ZlcmVkIGEgZGVmZWN0Li4uICMjCisKKyAxLiBDaGVjayB0byBzZWUgaWYgdGhlIGlzc3VlIGlzIGFscmVhZHkgaW4gdGhlIFtKaXJhIGlzc3VlIHRyYWNrZXJdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpLgorIDEuIElmIG5vdCwgY3JlYXRlIGEgdGlja2V0IGRlc2NyaWJpbmcgdGhlIGNoYW5nZSB5b3UncmUgcHJvcG9zaW5nIGluIHRoZSBKaXJhIGlzc3VlIHRyYWNrZXIuCisgMS4gQ29udHJpYnV0ZSB5b3VyIGNvZGUgY2hhbmdlcyB1c2luZyB0aGUgR2l0SHViIHB1bGwgcmVxdWVzdCBtZXRob2Q6CisKKyMjIENvbnRyaWJ1dGluZyB2aWEgUGF0Y2ggIyMKKworVG8gY3JlYXRlIGEgcGF0Y2ggZnJvbSBjaGFuZ2VzIGluIHlvdXIgbG9jYWwgZGlyZWN0b3J5OgorCisgICAgZ2l0IGRpZmYgPiAuLi9USFJJRlQtTk5OTi5wYXRjaAorCit0aGVuIHdhaXQgZm9yIGNvbnRyaWJ1dG9ycyBvciBjb21taXR0ZXJzIHRvIHJldmlldyB5b3VyIGNoYW5nZXMsIGFuZCB0aGVuIGZvciBhIGNvbW1pdHRlciB0byBhcHBseSB5b3VyIHBhdGNoLiAgVGhpcyBpcyBub3QgdGhlIHByZWZlcnJlZCB3YXkgdG8gc3VibWl0IGNoYW5nZXMgYW5kIGluY3VycyBhZGRpdGlvbmFsIG92ZXJoZWFkIGZvciBjb21taXR0ZXJzIHdobyBtdXN0IHRoZW4gY3JlYXRlIGEgcHVsbCByZXF1ZXN0IGZvciB5b3UuCisKKyMjIEdpdEh1YiByZWNpcGVzIGZvciBQdWxsIFJlcXVlc3RzICMjCisKK1NvbWV0aW1lcyBjb21tbWl0dGVycyBtYXkgYXNrIHlvdSB0byB0YWtlIGFjdGlvbnMgaW4geW91ciBwdWxsIHJlcXVlc3RzLiAgSGVyZSBhcmUgc29tZSByZWNpcGVzIHRoYXQgd2lsbCBoZWxwIHlvdSBhY2NvbXBsaXNoIHRob3NlIHJlcXVlc3RzLiAgVGhlc2UgZXhhbXBsZXMgYXNzdW1lIHlvdSBhcmUgd29ya2luZyBvbiBKaXJhIGlzc3VlIFRIUklGVC05OTk5LiAgWW91IHNob3VsZCBhbHNvIGJlIGZhbWlsaWFyIHdpdGggdGhlIFt1cHN0cmVhbV0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvc3luY2luZy1hLWZvcmsvKSByZXBvc2l0b3J5IGNvbmNlcHQuCisKKyMjIyBTcXVhc2ggeW91ciBjaGFuZ2VzICMjIworCitJZiB5b3UgaGF2ZSBub3Qgc3VibWl0dGVkIGEgcHVsbCByZXF1ZXN0IHlldCwgb3IgaWYgeW91IGhhdmUgbm90IHlldCByZWJhc2VkIHlvdXIgZXhpc3RpbmcgcHVsbCByZXF1ZXN0LCB5b3UgY2FuIHNxdWFzaCBhbGwgeW91ciBjb21taXRzIGRvd24gdG8gYSBzaW5nbGUgY29tbWl0LiAgVGhpcyBtYWtlcyBsaWZlIGVhc2llciBmb3IgdGhlIGNvbW1pdHRlcnMuICBJZiB5b3VyIHB1bGwgcmVxdWVzdCBvbiBHaXRIdWIgaGFzIG1vcmUgdGhhbiBvbmUgY29tbWl0LCB5b3Ugc2hvdWxkIGRvIHRoaXMuCisKKzEuIFVzZSB0aGUgY29tbWFuZCBgYGdpdCBsb2dgYCB0byBpZGVudGlmeSBob3cgbWFueSBjb21taXRzIHlvdSBtYWRlIHNpbmNlIHlvdSBiZWdhbi4KKzIuIFVzZSB0aGUgY29tbWFuZCBgYGdpdCByZWJhc2UgLWkgSEVBRH5OYGAgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIGNvbW1pdHMuCiszLiBMZWF2ZSAicHVsbCIgaW4gdGhlIGZpcnN0IGxpbmUuCis0LiBDaGFuZ2UgYWxsIG90aGVyIGxpbmVzIGZyb20gInB1bGwiIHRvICJmaXh1cCIuCis1LiBBbGwgeW91ciBjaGFuZ2VzIGFyZSBub3cgaW4gYSBzaW5nbGUgY29tbWl0LgorCitJZiB5b3UgYWxyZWFkeSBoYXZlIGEgcHVsbCByZXF1ZXN0IG91dHN0YW5kaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIGRvIGEgImZvcmNlIHB1c2giIHRvIG92ZXJ3cml0ZSBpdCBzaW5jZSB5b3UgY2hhbmdlZCB5b3VyIGNvbW1pdCBoaXN0b3J5OgorCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5IC0tZm9yY2UKKworQSBtb3JlIGRldGFpbGVkIHdhbGt0aHJvdWdoIG9mIGEgc3F1YXNoIGNhbiBiZSBmb3VuZCBhdCBbR2l0IFJlYWR5XShodHRwOi8vZ2l0cmVhZHkuY29tL2FkdmFuY2VkLzIwMDkvMDIvMTAvc3F1YXNoaW5nLWNvbW1pdHMtd2l0aC1yZWJhc2UuaHRtbCkuCisKKyMjIyBSZWJhc2UgeW91ciBwdWxsIHJlcXVlc3QgIyMjCisKK0lmIHlvdXIgcHVsbCByZXF1ZXN0IGhhcyBhIGNvbmZsaWN0IHdpdGggbWFzdGVyLCBpdCBuZWVkcyB0byBiZSByZWJhc2VkOgorCisgICAgZ2l0IGNoZWNrb3V0IFRIUklGVC05OTk5CisgICAgZ2l0IHJlYmFzZSB1cHN0cmVhbSBtYXN0ZXIKKyAgICAgIChyZXNvbHZlIGFueSBjb25mbGljdHMsIG1ha2Ugc3VyZSBpdCBidWlsZHMpCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5IC0tZm9yY2UKKworIyMjIEZpeCBhIGJhZCBtZXJnZSAjIyMKKworSWYgeW91ciBwdWxsIHJlcXVlc3QgY29udGFpbnMgY29tbWl0cyB0aGF0IGFyZSBub3QgeW91cnMsIHRoZW4geW91IHNob3VsZCB1c2UgdGhlIGZvbGxvd2luZyB0ZWNobmlxdWUgdG8gZml4IHRoZSBiYWQgbWVyZ2UgaW4geW91ciBicmFuY2g6CisKKyAgICBnaXQgY2hlY2tvdXQgbWFzdGVyCisgICAgZ2l0IHB1bGwgdXBzdHJlYW0gbWFzdGVyCisgICAgZ2l0IGNoZWNrb3V0IC1iIFRIUklGVC05OTk5LXRha2UtMgorICAgIGdpdCBjaGVycnktcGljayAuLi4KKyAgICAgICAgKHBpY2sgb25seSB5b3VyIGNvbW1pdHMgZnJvbSB5b3VyIG9yaWdpbmFsIHB1bGwgcmVxdWVzdCBpbiBhc2NlbmRpbmcgY2hyb25vbG9naWNhbCBvcmRlcikKKyAgICBzcXVhc2ggeW91ciBjaGFuZ2VzIHRvIGEgc2luZ2xlIGNvbW1pdCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIChzZWUgYWJvdmUpCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5LXRha2UtMjpUSFJJRlQtOTk5OQorCitUaGlzIHByb2NlZHVyZSB3aWxsIGFwcGx5IG9ubHkgeW91ciBjb21taXRzIGluIG9yZGVyIHRvIHRoZSBjdXJyZW50IG1hc3RlciwgdGhlbiB5b3Ugd2lsbCBzcXVhc2ggdGhlbSB0byBhIHNpbmdsZSBjb21taXQsIGFuZCB0aGVuIHlvdSBmb3JjZSBwdXNoIHlvdXIgbG9jYWwgVEhSSUZULTk5OTktdGFrZS0yIGludG8gcmVtb3RlIFRIUklGVC05OTk5IHdoaWNoIHJlcHJlc2VudHMgeW91ciBwdWxsIHJlcXVlc3QsIHJlcGxhY2luZyBhbGwgdGhlIGNvbW1pdHMgd2l0aCB0aGUgbmV3IG9uZS4KKworIApkaWZmIC0tZ2l0IGEvTEFOR1VBR0VTLm1kIGIvTEFOR1VBR0VTLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTAxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9MQU5HVUFHRVMubWQKQEAgLTAsMCArMSwzOTEgQEAKKyMgQXBhY2hlIFRocmlmdCBMYW5ndWFnZSBTdXBwb3J0ICMKKworR3VpZGFuY2UgRm9yOiAwLjEzLjAgfCAKK1swLjEyLjBdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvdjAuMTIuMC9MQU5HVUFHRVMubWQpIHwgCitbMC4xMS4wXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iLzAuMTEuMC9MQU5HVUFHRVMubWQpCisKK1RocmlmdCBzdXBwb3J0cyBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcyBhbmQgaGFzIGFuIGltcHJlc3NpdmUgdGVzdCBzdWl0ZSB0aGF0CitleGVyY2lzZXMgbW9zdCBvZiB0aGUgbGFuZ3VhZ2VzLCBwcm90b2NvbHMsIGFuZCB0cmFuc3BvcnRzLiAgRWFjaCBidWlsZCBleGVyY2lzZXMKK2EgbWF0cml4IG9mIHRob3VzYW5kcyBvZiBwb3NzaWJsZSBjb21iaW5hdGlvbnMuICBFYWNoIGxhbmd1YWdlIHR5cGljYWxseSBoYXMgYSAKK21pbmltdW0gcmVxdWlyZWQgdmVyc2lvbiBhcyB3ZWxsIGFzIHN1cHBvcnQgbGlicmFyaWVzIC0gc29tZSBtYW5kYXRvcnkgYW5kIHNvbWUKK29wdGlvbmFsLiAgVGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJlbG93IHdpbGwgaGVscCB5b3UgYXNzZXNzIHdoZXRoZXIgeW91IGNhbgordXNlIEFwYWNoZSBUaHJpZnQgd2l0aCB5b3VyIHByb2plY3QuICBPYnZpb3VzbHkgdGhpcyBpcyBhIGNvbXBsZXggbWF0cml4IHRvCittYWludGFpbiBhbmQgbWF5IG5vdCBiZSBjb3JyZWN0IGluIGFsbCBjYXNlcyAtIGlmIHlvdSBzcG90IGFuIGVycm9yIHBsZWFzZSBpbmZvcm0KK3RoZSBkZXZlbG9wZXJzIHVzaW5nIHRoZSBtYWlsaW5nIGxpc3QsIG9yIGJldHRlciB5ZXQsCitbRWRpdCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2VkaXQvbWFzdGVyL0xBTkdVQUdFUy5tZCkuCisKK0FwYWNoZSBUaHJpZnQgY3VycmVudGx5IHVzZXMgdHdvIGJ1aWxkIHN5c3RlbXMuICBUaGUgYGF1dG9jb25mYCBidWlsZCBzeXN0ZW0gaXMKK3RoZSBtb3N0IGNvbXBsZXRlIGFuZCBidWlsZHMgYWxsIHN1cHBvcnRlZCBsYW5ndWFnZXMsIGhvd2V2ZXIgaXQgZG9lcyBub3Qgc3VwcG9ydAorV2luZG93cy4uICBUaGUgYGNtYWtlYCBidWlsZCBzeXN0ZW0gd29ya3Mgb24gTGludXggYW5kIFdpbmRvd3MsIGFuZCBoYXMgYmVlbgorZGVzaWduYXRlZCBieSB0aGUgcHJvamVjdCB0byByZXBsYWNlIGBhdXRvY29uZmAgaG93ZXZlciB0aGlzIHRyYW5zaXRpb24gd2lsbAordGFrZSBxdWl0ZSBzb21lIHRpbWUgdG8gY29tcGxldGUuICBEdXJpbmcgdGhhdCB0cmFuc2l0aW9uLCB0aGUgY21ha2UgYnVpbGQgd2lsbAorbm90IHN1cHBvcnQgYWxsIGxhbmd1YWdlcy4KKworVGhlIExhbmd1YWdlL0xpYnJhcnkgTGV2ZWxzIGluZGljYXRlIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZlcnNpb25zIHRoYXQgYXJlCit1c2VkIGluIHRoZSBbY29udGludW91cyBpbnRlZ3JhdGlvbiBlbnZpcm9ubWVudHNdKGJ1aWxkL2RvY2tlci9SRUFETUUubWQpCisoQXBwdmV5b3IsIFRyYXZpcykgZm9yIEFwYWNoZSBUaHJpZnQuICBPdGhlciBsYW5ndWFnZSBsZXZlbHMgbWF5IGJlIHN1cHBvcnRlZAorZm9yIGVhY2ggbGFuZ3VhZ2UsIGhvd2V2ZXIgdGVzdGVkIGxlc3MgdGhvcm91Z2hseTsgY2hlY2sgdGhlIFJFQURNRSBmaWxlIGluc2lkZQorZWFjaCBsaWIgZGlyZWN0b3J5IGZvciBhZGRpdGlvbmFsIGRldGFpbHMuICBOb3RlOiB3aGlsZSBhIGxhbmd1YWdlIG1heSBjb250YWluCitzdXBwb3J0IGZvciBwcm90b2NvbHMsIHRyYW5zcG9ydHMsIGFuZCBzZXJ2ZXJzLCB0aGUgZXh0ZW50IHRvIHdoaWNoIGVhY2ggaXMgdGVzdGVkCithcyBwYXJ0IG9mIHRoZSBvdmVyYWxsIGJ1aWxkIHByb2Nlc3MgdmFyaWVzLiAgVGhlIGRlZmluaXRpdmUgaW50ZWdyYXRpb24gdGVzdCBmb3IKK3RoZSBwcm9qZWN0IGlzIGNhbGxlZCB0aGUgImNyb3NzIiB0ZXN0IHdoaWNoIGV4ZWN1dGVzIGEgdGVzdCBtYXRyaXggd2l0aCBjbGllbnRzCithbmQgc2VydmVycyBjb21tdW5pY2F0aW5nIGFjcm9zcyBsYW5ndWFnZXMuCisKK1RocmlmdCdzIGNvcmUgdHJhbnNwb3J0IChzdXBwb3J0ZWQgYnkgYWxsIGxhbmd1YWdlcykgaXMgVFNvY2tldC4KK1RocmlmdCdzIGNvcmUgcHJvdG9jb2wgaXMgVEJpbmFyeSwgc3VwcG9ydGVkIGJ5IGFsbCBsYW5ndWFnZXMgZXhjZXB0IGZvciBKYXZhU2NyaXB0LgorCis8dGFibGUgc3R5bGU9ImZvbnQtc2l6ZTogNjAlOyBwYWRkaW5nOiAxcHg7Ij4KKzx0aGVhZD4KKzx0cj4KKzx0aCByb3dzcGFuPTI+TGFuZ3VhZ2U8L3RoPgorPHRoIHJvd3NwYW49MiBhbGlnbj1jZW50ZXI+U2luY2U8L3RoPgorPHRoIGNvbHNwYW49MiBhbGlnbj1jZW50ZXI+QnVpbGQgU3lzdGVtczwvdGg+Cis8dGggY29sc3Bhbj0yIGFsaWduPWNlbnRlcj5MYW5nL0xpYiBMZXZlbHMgKFRlc3RlZCk8L3RoPgorPHRoIGNvbHNwYW49NiBhbGlnbj1jZW50ZXI+TG93LUxldmVsIFRyYW5zcG9ydHM8L3RoPgorPHRoIGNvbHNwYW49NCBhbGlnbj1jZW50ZXI+VHJhbnNwb3J0IFdyYXBwZXJzPC90aD4KKzx0aCBjb2xzcGFuPTQgYWxpZ249Y2VudGVyPlByb3RvY29sczwvdGg+Cis8dGggY29sc3Bhbj01IGFsaWduPWNlbnRlcj5TZXJ2ZXJzPC90aD4KKzx0aCByb3dzcGFuPTI+T3BlbiBJc3N1ZXM8L3RoPgorPC90cj4KKzx0cj4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRoPmF1dG9jb25mPC90aD48dGg+Y21ha2U8L3RoPgorPCEtLSBMYW5nL0xpYiBMZXZlbHMgLS0tLS0tLT48dGg+TWluPC90aD48dGg+TWF4PC90aD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRoPjxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfZG9tYWluX3NvY2tldCI+RG9tYWluPC9hPjwvdGg+PHRoPiZuYnNwO0ZpbGUmbmJzcDs8L3RoPjx0aD5NZW1vcnk8L3RoPjx0aD4mbmJzcDtQaXBlJm5ic3A7PC90aD48dGg+U29ja2V0PC90aD48dGg+Jm5ic3A7VExTJm5ic3A7PC90aD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRoPkZyYW1lZDwvdGg+PHRoPkhlYWRlcjwvdGg+PHRoPiZuYnNwO2h0dHAmbmJzcDs8L3RoPjx0aD4mbmJzcDt6bGliJm5ic3A7PC90aD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRoPjxhIGhyZWY9ImRvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kIj5CaW5hcnk8L2E+PC90aD48dGg+PGEgaHJlZj0iZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kIj5Db21wYWN0PC9hPjwvdGg+PHRoPiZuYnNwO0pTT04mbmJzcDs8L3RoPjx0aD5NdWx0aXBsZXg8L3RoPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGg+Rm9ya2luZzwvdGg+PHRoPk5vbmJsb2NraW5nPC90aD48dGg+U2ltcGxlPC90aD48dGg+VGhyZWFkZWQ8L3RoPjx0aD5UaHJlYWRQb29sPC90aD4KKzwvdHI+Cis8L3RoZWFkPgorPHRib2R5PgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL2xpYi9hczMvUkVBRE1FLm1kIj5BY3Rpb25TY3JpcHQ8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMy4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+RkxFWCBTREsgNC42PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9qcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMEFORCUyMGNvbXBvbmVudCUyMGluJTIwKCUyMkFTMyUyMC0lMjBDb21waWxlciUyMiUyQyUyMCUyMkFTMyUyMC0lMjBMaWJyYXJ5JTIyKSUyMGFuZCUyMHN0YXR1cyUyMG5vdCUyMGluJTIwKGZpeGVkJTJDJTIwcmVzb2x2ZWQlMkMlMjBjbG9zZWQpIj5BY3Rpb25TY3JpcHQ8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvbGliL2NfZ2xpYi9SRUFETUUubWQiPkMgKGdsaWIpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjYuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Mi40OC4yPC90ZD48dGQ+Mi41Ni4wPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9qcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMEFORCUyMGNvbXBvbmVudCUyMGluJTIwKCUyMkMlMjBnbGliJTIwLSUyMENvbXBpbGVyJTIyJTJDJTIwJTIyQyUyMGdsaWIlMjAtJTIwTGlicmFyeSUyMiklMjBhbmQlMjBzdGF0dXMlMjBub3QlMjBpbiUyMChmaXhlZCUyQyUyMHJlc29sdmVkJTJDJTIwY2xvc2VkKSI+QyAoZ2xpYik8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvbGliL2NwcC9SRUFETUUubWQiPkMrKzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj5DKysxMTwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/anFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBBTkQlMjBjb21wb25lbnQlMjBpbiUyMCglMjJDJTJCJTJCJTIwLSUyMENvbXBpbGVyJTIyJTJDJTIwJTIyQyUyQiUyQiUyMC0lMjBMaWJyYXJ5JTIyKSUyMGFuZCUyMHN0YXR1cyUyMG5vdCUyMGluJTIwKGZpeGVkJTJDJTIwcmVzb2x2ZWQlMkMlMjBjbG9zZWQpIj5DKys8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvbGliL2NzaGFycC9SRUFETUUubWQiPkMjPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDxicj5EZXByZWNhdGVkPGJyPnVzZSBuZXRzdGQ8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPi5ORVQmbmJzcDszLjUgLyBtb25vJm5ic3A7My4yLjguMDwvdGQ+PHRkPi5ORVQmbmJzcDs0LjYuMSAvIG1vbm8mbmJzcDs0LjYuMi43PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9qcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMEFORCUyMGNvbXBvbmVudCUyMGluJTIwKCUyMkMlMjMlMjAtJTIwQ29tcGlsZXIlMjIlMkMlMjAlMjJDJTIzJTIwLSUyMExpYnJhcnklMjIpJTIwYW5kJTIwc3RhdHVzJTIwbm90JTIwaW4lMjAoZml4ZWQlMkMlMjByZXNvbHZlZCUyQyUyMGNsb3NlZCkiPkMjICguTkVUKTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci9saWIvY2wvUkVBRE1FLm1kIj5Db21tb24gTElTUDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4xMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+U0JDTCAxLjQueDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/anFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBBTkQlMjBjb21wb25lbnQlMjBpbiUyMCglMjJDb21tb24lMjBMSVNQJTIwLSUyMENvbXBpbGVyJTIyJTJDJTIwJTIyQ29tbW9uJTIwTElTUCUyMC0lMjBMaWJyYXJ5JTIyKSUyMGFuZCUyMHN0YXR1cyUyMG5vdCUyMGluJTIwKGZpeGVkJTJDJTIwcmVzb2x2ZWQlMkMlMjBjbG9zZWQpIj5Db21tb24gTElTUDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci9saWIvZC9SRUFETUUubWQiPkRsYW5nPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjkuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Mi4wNzUuMTwvdGQ+PHRkPjIuMDgzLjI8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9pc3N1ZXMvP2pxbD1wcm9qZWN0JTIwJTNEJTIwVEhSSUZUJTIwQU5EJTIwY29tcG9uZW50JTIwaW4lMjAoJTIyRCUyMC0lMjBDb21waWxlciUyMiUyQyUyMCUyMkQlMjAtJTIwTGlicmFyeSUyMiklMjBhbmQlMjBzdGF0dXMlMjBub3QlMjBpbiUyMChmaXhlZCUyQyUyMHJlc29sdmVkJTJDJTIwY2xvc2VkKSI+RDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci9saWIvZGFydC9SRUFETUUubWQiPkRhcnQ8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTAuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MS4yNC4zPC90ZD48dGQ+Mi54PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9qcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMEFORCUyMGNvbXBvbmVudCUyMGluJTIwKCUyMkRhcnQlMjAtJTIwQ29tcGlsZXIlMjIlMkMlMjAlMjJEYXJ0JTIwLSUyMExpYnJhcnklMjIpJTIwYW5kJTIwc3RhdHVzJTIwbm90JTIwaW4lMjAoZml4ZWQlMkMlMjByZXNvbHZlZCUyQyUyMGNsb3NlZCkiPkRhcnQ8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvbGliL2RlbHBoaS9SRUFETUUubWQiPkRlbHBoaTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC44LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIwMTA8L3RkPjx0ZD51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9qcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMEFORCUyMGNvbXBvbmVudCUyMGluJTIwKCUyMkRlbHBoaSUyMC0lMjBDb21waWxlciUyMiUyQyUyMCUyMkRlbHBoaSUyMC0lMjBMaWJyYXJ5JTIyKSUyMGFuZCUyMHN0YXR1cyUyMG5vdCUyMGluJTIwKGZpeGVkJTJDJTIwcmVzb2x2ZWQlMkMlMjBjbG9zZWQpIj5EZWxwaGk8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvbGliL25ldGNvcmUvUkVBRE1FLm1kIj4uTkVUIENvcmU8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTEuMDxicj5EZXByZWNhdGVkPGJyPnVzZSBuZXRzdGQ8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuMS40PC90ZD48dGQ+Mi4yLjEwMTwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/anFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBBTkQlMjBjb21wb25lbnQlMjBpbiUyMCglMjJuZXRjb3JlJTIwLSUyMENvbXBpbGVyJTIyJTJDJTIwJTIybmV0Y29yZSUyMC0lMjBMaWJyYXJ5JTIyKSUyMGFuZCUyMHN0YXR1cyUyMG5vdCUyMGluJTIwKGZpeGVkJTJDJTIwcmVzb2x2ZWQlMkMlMjBjbG9zZWQpIj4uTkVUIENvcmU8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvbGliL25ldHN0ZC9SRUFETUUubWQiPi5ORVQgU3RhbmRhcmQ8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTMuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPi5ORVQgNC41KywgLk5FVCBTdGFuZGFyZCAyLng8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9pc3N1ZXMvP2pxbD1wcm9qZWN0JTIwJTNEJTIwVEhSSUZUJTIwQU5EJTIwY29tcG9uZW50JTIwaW4lMjAoJTIybmV0c3RkJTIwLSUyMENvbXBpbGVyJTIyJTJDJTIwJTIybmV0c3RkJTIwLSUyMExpYnJhcnklMjIpJTIwYW5kJTIwc3RhdHVzJTIwbm90JTIwaW4lMjAoZml4ZWQlMkMlMjByZXNvbHZlZCUyQyUyMGNsb3NlZCkiPi5ORVQgU3RhbmRhcmQ8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvbGliL2VybC9SRUFETUUubWQiPkVybGFuZzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4zLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjE4LjM8L3RkPjx0ZD4yMC4wLjQ8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9pc3N1ZXMvP2pxbD1wcm9qZWN0JTIwJTNEJTIwVEhSSUZUJTIwQU5EJTIwY29tcG9uZW50JTIwaW4lMjAoJTIyRXJsYW5nJTIwLSUyMENvbXBpbGVyJTIyJTJDJTIwJTIyRXJsYW5nJTIwLSUyMExpYnJhcnklMjIpJTIwYW5kJTIwc3RhdHVzJTIwbm90JTIwaW4lMjAoZml4ZWQlMkMlMjByZXNvbHZlZCUyQyUyMGNsb3NlZCkiPkVybGFuZzwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci9saWIvZ28vUkVBRE1FLm1kIj5HbzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC43LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjEuNy42PC90ZD48dGQ+MS4xMS40PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9qcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMEFORCUyMGNvbXBvbmVudCUyMGluJTIwKCUyMkdvJTIwLSUyMENvbXBpbGVyJTIyJTJDJTIwJTIyR28lMjAtJTIwTGlicmFyeSUyMiklMjBhbmQlMjBzdGF0dXMlMjBub3QlMjBpbiUyMChmaXhlZCUyQyUyMHJlc29sdmVkJTJDJTIwY2xvc2VkKSI+R288L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvbGliL2hzL1JFQURNRS5tZCI+SGFza2VsbDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC41LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjcuMTAuMzwvdGQ+PHRkPjguMC4yPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9qcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMEFORCUyMGNvbXBvbmVudCUyMGluJTIwKCUyMkhhc2tlbGwlMjAtJTIwQ29tcGlsZXIlMjIlMkMlMjAlMjJIYXNrZWxsJTIwLSUyMExpYnJhcnklMjIpJTIwYW5kJTIwc3RhdHVzJTIwbm90JTIwaW4lMjAoZml4ZWQlMkMlMjByZXNvbHZlZCUyQyUyMGNsb3NlZCkiPkhhc2tlbGw8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvbGliL2hheGUvUkVBRE1FLm1kIj5IYXhlPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjkuMzwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+My4yLjE8L3RkPjx0ZD4zLjQuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/anFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBBTkQlMjBjb21wb25lbnQlMjBpbiUyMCglMjJIYXhlJTIwLSUyMENvbXBpbGVyJTIyJTJDJTIwJTIySGF4ZSUyMC0lMjBMaWJyYXJ5JTIyKSUyMGFuZCUyMHN0YXR1cyUyMG5vdCUyMGluJTIwKGZpeGVkJTJDJTIwcmVzb2x2ZWQlMkMlMjBjbG9zZWQpIj5IYXhlPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL2xpYi9qYXZhL1JFQURNRS5tZCI+SmF2YSAoU0UpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MS44LjBfMTUxPC90ZD48dGQ+MS44LjBfMTkxPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9qcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMEFORCUyMGNvbXBvbmVudCUyMGluJTIwKCUyMkphdmElMjAtJTIwQ29tcGlsZXIlMjIlMkMlMjAlMjJKYXZhJTIwLSUyMExpYnJhcnklMjIpJTIwYW5kJTIwc3RhdHVzJTIwbm90JTIwaW4lMjAoZml4ZWQlMkMlMjByZXNvbHZlZCUyQyUyMGNsb3NlZCkiPkphdmEgU0U8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvbGliL2phdmFtZS9SRUFETUUubWQiPkphdmEgKE1FKTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC41LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9qcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMEFORCUyMGNvbXBvbmVudCUyMGluJTIwKCUyMkphdmFNRSUyMC0lMjBDb21waWxlciUyMiUyQyUyMCUyMkphdmFNRSUyMC0lMjBMaWJyYXJ5JTIyKSUyMGFuZCUyMHN0YXR1cyUyMG5vdCUyMGluJTIwKGZpeGVkJTJDJTIwcmVzb2x2ZWQlMkMlMjBjbG9zZWQpIj5KYXZhIE1FPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL2xpYi9qcy9SRUFETUUubWQiPkphdmFzY3JpcHQ8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMy4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD5FUzU8L3RkPjx0ZD5FUzY8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9pc3N1ZXMvP2pxbD1wcm9qZWN0JTIwJTNEJTIwVEhSSUZUJTIwQU5EJTIwY29tcG9uZW50JTIwaW4lMjAoJTIySmF2YXNjcmlwdCUyMC0lMjBDb21waWxlciUyMiUyQyUyMCUyMkphdmFzY3JpcHQlMjAtJTIwTGlicmFyeSUyMiklMjBhbmQlMjBzdGF0dXMlMjBub3QlMjBpbiUyMChmaXhlZCUyQyUyMHJlc29sdmVkJTJDJTIwY2xvc2VkKSI+SmF2YXNjcmlwdDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci9saWIvbHVhL1JFQURNRS5tZCI+THVhPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjkuMjwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+NS4xLjU8L3RkPjx0ZD41LjIuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/anFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBBTkQlMjBjb21wb25lbnQlMjBpbiUyMCglMjJMdWElMjAtJTIwQ29tcGlsZXIlMjIlMkMlMjAlMjJMdWElMjAtJTIwTGlicmFyeSUyMiklMjBhbmQlMjBzdGF0dXMlMjBub3QlMjBpbiUyMChmaXhlZCUyQyUyMHJlc29sdmVkJTJDJTIwY2xvc2VkKSI+THVhPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL2xpYi9ub2RlanMvUkVBRE1FLm1kIj5ub2RlLmpzPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjYuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Ni54PC90ZD48dGQ+OC54PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9qcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMEFORCUyMGNvbXBvbmVudCUyMGluJTIwKCUyMk5vZGUuanMlMjAtJTIwQ29tcGlsZXIlMjIlMkMlMjAlMjJOb2RlLmpzJTIwLSUyMExpYnJhcnklMjIpJTIwYW5kJTIwc3RhdHVzJTIwbm90JTIwaW4lMjAoZml4ZWQlMkMlMjByZXNvbHZlZCUyQyUyMGNsb3NlZCkiPm5vZGUuanM8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvbGliL25vZGV0cy9SRUFETUUubWQiPm5vZGUudHM8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+My4xLjY8L3RkPjx0ZD48L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9pc3N1ZXMvP2pxbD1wcm9qZWN0JTIwJTNEJTIwVEhSSUZUJTIwQU5EJTIwY29tcG9uZW50JTIwaW4lMjAoJTIyVHlwZVNjcmlwdCUyMC0lMjBMaWJyYXJ5JTIyKSUyMGFuZCUyMHN0YXR1cyUyMG5vdCUyMGluJTIwKGZpeGVkJTJDJTIwcmVzb2x2ZWQlMkMlMjBjbG9zZWQpIj5ub2RlLnRzPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL2xpYi9vY2FtbC9SRUFETUUubWQiPk9DYW1sPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPjQuMDQuMDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/anFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBBTkQlMjBjb21wb25lbnQlMjBpbiUyMCglMjJPQ2FtbCUyMC0lMjBDb21waWxlciUyMiUyQyUyMCUyMk9DYW1sJTIwLSUyMExpYnJhcnklMjIpJTIwYW5kJTIwc3RhdHVzJTIwbm90JTIwaW4lMjAoZml4ZWQlMkMlMjByZXNvbHZlZCUyQyUyMGNsb3NlZCkiPk9DYW1sPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL2xpYi9wZXJsL1JFQURNRS5tZCI+UGVybDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjUuMjIuMTwvdGQ+PHRkPjUuMjYuMTwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/anFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBBTkQlMjBjb21wb25lbnQlMjBpbiUyMCglMjJQZXJsJTIwLSUyMENvbXBpbGVyJTIyJTJDJTIwJTIyUGVybCUyMC0lMjBMaWJyYXJ5JTIyKSUyMGFuZCUyMHN0YXR1cyUyMG5vdCUyMGluJTIwKGZpeGVkJTJDJTIwcmVzb2x2ZWQlMkMlMjBjbG9zZWQpIj5QZXJsPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL2xpYi9waHAvUkVBRE1FLm1kIj5QSFA8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD43LjAuMjI8L3RkPjx0ZD43LjIuMTA8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9pc3N1ZXMvP2pxbD1wcm9qZWN0JTIwJTNEJTIwVEhSSUZUJTIwQU5EJTIwY29tcG9uZW50JTIwaW4lMjAoJTIyUEhQJTIwLSUyMENvbXBpbGVyJTIyJTJDJTIwJTIyUEhQJTIwLSUyMExpYnJhcnklMjIpJTIwYW5kJTIwc3RhdHVzJTIwbm90JTIwaW4lMjAoZml4ZWQlMkMlMjByZXNvbHZlZCUyQyUyMGNsb3NlZCkiPlBIUDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci9saWIvcHkvUkVBRE1FLm1kIj5QeXRob248L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yLjcuMTIsIDMuNS4yPC90ZD48dGQ+Mi43LjE1cmMxLCAzLjYuNzwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/anFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBBTkQlMjBjb21wb25lbnQlMjBpbiUyMCglMjJQeXRob24lMjAtJTIwQ29tcGlsZXIlMjIlMkMlMjAlMjJQeXRob24lMjAtJTIwTGlicmFyeSUyMiklMjBhbmQlMjBzdGF0dXMlMjBub3QlMjBpbiUyMChmaXhlZCUyQyUyMHJlc29sdmVkJTJDJTIwY2xvc2VkKSI+UHl0aG9uPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL2xpYi9yYi9SRUFETUUubWQiPlJ1Ynk8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yLjMuMXAxMTI8L3RkPjx0ZD4yLjUuMXA1NzwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/anFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBBTkQlMjBjb21wb25lbnQlMjBpbiUyMCglMjJSdWJ5JTIwLSUyMENvbXBpbGVyJTIyJTJDJTIwJTIyUnVieSUyMC0lMjBMaWJyYXJ5JTIyKSUyMGFuZCUyMHN0YXR1cyUyMG5vdCUyMGluJTIwKGZpeGVkJTJDJTIwcmVzb2x2ZWQlMkMlMjBjbG9zZWQpIj5SdWJ5PC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL2xpYi9ycy9SRUFETUUubWQiPlJ1c3Q8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTEuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MS4xNy4wPC90ZD48dGQ+MS4zMC4wPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9qcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMEFORCUyMGNvbXBvbmVudCUyMGluJTIwKCUyMlJ1c3QlMjAtJTIwQ29tcGlsZXIlMjIlMkMlMjAlMjJSdXN0JTIwLSUyMExpYnJhcnklMjIpJTIwYW5kJTIwc3RhdHVzJTIwbm90JTIwaW4lMjAoZml4ZWQlMkMlMjByZXNvbHZlZCUyQyUyMGNsb3NlZCkiPlJ1c3Q8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvbGliL3N0L1JFQURNRS5tZCI+U21hbGx0YWxrPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9pc3N1ZXMvP2pxbD1wcm9qZWN0JTIwJTNEJTIwVEhSSUZUJTIwQU5EJTIwY29tcG9uZW50JTIwaW4lMjAoJTIyU21hbGx0YWxrJTIwLSUyMENvbXBpbGVyJTIyJTJDJTIwJTIyU21hbGx0YWxrJTIwLSUyMExpYnJhcnklMjIpJTIwYW5kJTIwc3RhdHVzJTIwbm90JTIwaW4lMjAoZml4ZWQlMkMlMjByZXNvbHZlZCUyQyUyMGNsb3NlZCkiPlNtYWxsdGFsazwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci9saWIvc3dpZnQvUkVBRE1FLm1kIj5Td2lmdDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4xMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+NC4yLjE8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9pc3N1ZXMvP2pxbD1wcm9qZWN0JTIwJTNEJTIwVEhSSUZUJTIwQU5EJTIwY29tcG9uZW50JTIwaW4lMjAoJTIyU3dpZnQlMjAtJTIwQ29tcGlsZXIlMjIlMkMlMjAlMjJTd2lmdCUyMC0lMjBMaWJyYXJ5JTIyKSUyMGFuZCUyMHN0YXR1cyUyMG5vdCUyMGluJTIwKGZpeGVkJTJDJTIwcmVzb2x2ZWQlMkMlMjBjbG9zZWQpIj5Td2lmdDwvYT48L3RkPgorPC90cj4KKzwvdGJvZHk+Cis8dGZvb3Q+Cis8dHI+Cis8dGggcm93c3Bhbj0yPkxhbmd1YWdlPC90aD4KKzx0aCByb3dzcGFuPTIgYWxpZ249Y2VudGVyPlNpbmNlPC90aD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRoPmF1dG9jb25mPC90aD48dGg+Y21ha2U8L3RoPgorPCEtLSBMYW5nL0xpYiBMZXZlbHMgLS0tLS0tLT48dGg+TWluPC90aD48dGg+TWF4PC90aD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRoPjxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfZG9tYWluX3NvY2tldCI+RG9tYWluPC9hPjwvdGg+PC90aD48dGg+Jm5ic3A7RmlsZSZuYnNwOzwvdGg+PHRoPk1lbW9yeTwvdGg+PHRoPiZuYnNwO1BpcGUmbmJzcDs8L3RoPjx0aD5Tb2NrZXQ8L3RoPjx0aD4mbmJzcDtUTFMmbmJzcDs8L3RoPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGg+RnJhbWVkPC90aD48dGg+SGVhZGVyPC90aD48dGg+Jm5ic3A7aHR0cCZuYnNwOzwvdGg+PHRoPiZuYnNwO3psaWImbmJzcDs8L3RoPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGg+PGEgaHJlZj0iZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQiPkJpbmFyeTwvYT48L3RoPjx0aD48YSBocmVmPSJkb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQiPkNvbXBhY3Q8L2E+PC90aD48dGg+Jm5ic3A7SlNPTiZuYnNwOzwvdGg+PHRoPk11bHRpcGxleDwvdGg+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0aD5Gb3JraW5nPC90aD48dGg+Tm9uYmxvY2tpbmc8L3RoPjx0aD5TaW1wbGU8L3RoPjx0aD5UaHJlYWRlZDwvdGg+PHRoPlRocmVhZFBvb2w8L3RoPgorPHRoIHJvd3NwYW49Mj5PcGVuIElzc3VlczwvdGg+Cis8L3RyPgorPHRyPgorPHRoIGNvbHNwYW49MiBhbGlnbj1jZW50ZXI+QnVpbGQgU3lzdGVtczwvdGg+Cis8dGggY29sc3Bhbj0yIGFsaWduPWNlbnRlcj5MYW5nL0xpYiBMZXZlbHMgKFRlc3RlZCk8L3RoPgorPHRoIGNvbHNwYW49NiBhbGlnbj1jZW50ZXI+TG93LUxldmVsIFRyYW5zcG9ydHM8L3RoPgorPHRoIGNvbHNwYW49NCBhbGlnbj1jZW50ZXI+VHJhbnNwb3J0IFdyYXBwZXJzPC90aD4KKzx0aCBjb2xzcGFuPTQgYWxpZ249Y2VudGVyPlByb3RvY29sczwvdGg+Cis8dGggY29sc3Bhbj01IGFsaWduPWNlbnRlcj5TZXJ2ZXJzPC90aD4KKzwvdHI+Cis8L3Rmb290PgorPC9mdAordGFibGU+CmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQppbmRleCA4ZDVlMDgyLi4zYjZkN2Q3IDEwMDY0NAotLS0gYS9MSUNFTlNFCisrKyBiL0xJQ0VOU0UKQEAgLTIyNiwyOCArMjI2LDE0IEBACiAjICAgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Gb3IgdGhlIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21kNS5bY2hdIGNvbXBvbmVudHM6CitGb3IgdGhlIGxpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzOgogCiAvKgotICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAganNvbl9wYXJzZS5qcworICAgIDIwMTUtMDUtMDIKKyAgICBQdWJsaWMgRG9tYWluLgorICAgIE5PIFdBUlJBTlRZIEVYUFJFU1NFRCBPUiBJTVBMSUVELiBVU0UgQVQgWU9VUiBPV04gUklTSy4KIAotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTC4gUGV0ZXIgRGV1dHNjaAotICBnaG9zdEBhbGFkZGluLmNvbQotCi0gKi8KKyovCisoQnkgRG91Z2xhcyBDcm9ja2ZvcmQgPGRvdWdsYXNAY3JvY2tmb3JkLmNvbT4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9NYWtlZmlsZS5hbQppbmRleCA0MmM4MmUyLi5iYWNkMDA4IDEwMDc1NQotLS0gYS9NYWtlZmlsZS5hbQorKysgYi9NYWtlZmlsZS5hbQpAQCAtMjksMzYgKzI5LDgxIEBACiBTVUJESVJTICs9IHR1dG9yaWFsCiBlbmRpZgogCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciB2ZW5kb3IvCisKK2Rpc3RjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciAuZHViLworCSQoUk0pIC1yIGF1dG9tNHRlLmNhY2hlLworCitDTEVBTkZJTEVTID0gXAorCWNvbXBvc2VyLmxvY2sgXAorCWR1Yi5zZWxlY3Rpb25zLmpzb24KKworRElTVENMRUFORklMRVMgPSBcCisJTWFrZWZpbGUgXAorCU1ha2VmaWxlLmluIFwKKwlhY2xvY2FsLm00IFwKKwlhcGFjaGUtdGhyaWZ0LXRlc3QtbGlicmFyeSBcCisJYXV0b3NjYW4ubG9nIFwKKwljb21waWxlIFwKKwljb25maWcuZ3Vlc3MgXAorCWNvbmZpZy5oaW4gXAorCWNvbmZpZy5oaW5+IFwKKwljb25maWcubG9nIFwKKwljb25maWcuc3RhdHVzIFwKKwljb25maWcuc3ViIFwKKwljb25maWd1cmUgXAorCWNvbmZpZ3VyZS5zY2FuIFwKKyAgICBkZWJjb21wIFwKKyAgICBpbnN0YWxsLXNoIFwKKyAgICBsdG1haW4uc2ggXAorICAgIG1pc3NpbmcgXAorICAgIHlsd3JhcAorCiBkaXN0LWhvb2s6Ci0JZmluZCAkKGRpc3RkaXIpIC10eXBlIGYgXCggLWluYW1lICIuRFNfU3RvcmUiIC1vciAtaW5hbWUgIi5fKiIgLW9yIC1pbmFtZSAiLmdpdGlnbm9yZSIgXCkgfCB4YXJncyBybSAtcmYKKwlmaW5kICQoZGlzdGRpcikgLXR5cGUgZiBcKCAtaW5hbWUgIi5EU19TdG9yZSIgLW9yIC1pbmFtZSAiLl8qIiAtb3IgLWluYW1lICIuZ2l0aWdub3JlIiBcKSB8IHhhcmdzIHJtIC1mCiAJZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgXCggLWluYW1lICIuZGVwcyIgLW9yIC1pbmFtZSAiLmxpYnMiIFwpIHwgeGFyZ3Mgcm0gLXJmCiAJZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgXCggLWluYW1lICIuc3ZuIiAtb3IgLWluYW1lICIuZ2l0IiBcKSB8IHhhcmdzIHJtIC1yZgogCiBwcmludC12ZXJzaW9uOgotCUBlY2hvICQoVkVSU0lPTikKKwlAZWNobyAkKFBBQ0tBR0VfVkVSU0lPTikKIAogLlBIT05ZOiBwcmVjcm9zcyBjcm9zcwogcHJlY3Jvc3MtJTogYWxsCiAJJChNQUtFKSAtQyAkKiBwcmVjcm9zcwogcHJlY3Jvc3M6IGFsbCBwcmVjcm9zcy10ZXN0IHByZWNyb3NzLWxpYgogCi0jIFRPRE86IGdlbmVyYXRlIC0tc2VydmVyIGFuZCAtLWNsaWVudCBzd2l0Y2hlcyBmcm9tICItLXdpdGgob3V0KS0uLi4iIGJ1aWxkIGZsYWdzCi0KLQogZW1wdHkgOj0KIHNwYWNlIDo9ICQoZW1wdHkpICQoZW1wdHkpCiBjb21tYSA6PSAsCiAKLUNST1NTX0xBTkdTID0gQE1BWUJFX0NQUEAgQE1BWUJFX0NfR0xJQkAgQE1BWUJFX0pBVkFAIEBNQVlCRV9DU0hBUlBAIEBNQVlCRV9QWVRIT05AIEBNQVlCRV9SVUJZQCBATUFZQkVfSEFTS0VMTEAgQE1BWUJFX1BFUkxAIEBNQVlCRV9QSFBAIEBNQVlCRV9HT0AgQE1BWUJFX05PREVKU0AKK0NST1NTX0xBTkdTID0gQE1BWUJFX0NQUEAgQE1BWUJFX0NfR0xJQkAgQE1BWUJFX0NMQCBATUFZQkVfREAgQE1BWUJFX0pBVkFAIEBNQVlCRV9DU0hBUlBAIEBNQVlCRV9QWVRIT05AIEBNQVlCRV9QWTNAIEBNQVlCRV9SVUJZQCBATUFZQkVfSEFTS0VMTEAgQE1BWUJFX1BFUkxAIEBNQVlCRV9QSFBAIEBNQVlCRV9HT0AgQE1BWUJFX05PREVKU0AgQE1BWUJFX0RBUlRAIEBNQVlCRV9FUkxBTkdAIEBNQVlCRV9MVUFAIEBNQVlCRV9SU0AgQE1BWUJFX0RPVE5FVENPUkVAIEBNQVlCRV9OT0RFVFNACiBDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQgPSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoQ1JPU1NfTEFOR1MpKQogCi1jcm9zczogcHJlY3Jvc3MKLQkkKFBZVEhPTikgdGVzdC90ZXN0LnB5IC1zIC0tc2VydmVyICQoQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEKSAtLWNsaWVudCAkKENST1NTX0xBTkdTX0NPTU1BX1NFUEFSQVRFRCkKK2lmIFdJVEhfUFkzCitDUk9TU19QWT0kKFBZVEhPTjMpCitlbHNlCitDUk9TU19QWT0kKFBZVEhPTikKK2VuZGlmCisKK2lmIFdJVEhfUFlUSE9OCitjcm9zc2ZlYXR1cmU6IHByZWNyb3NzCisJJChDUk9TU19QWSkgdGVzdC90ZXN0LnB5IC0tcmV0cnktY291bnQgNSAtLWZlYXR1cmVzIC4qIC0tc2tpcC1rbm93bi1mYWlsdXJlcyAtLXNlcnZlciAkKENST1NTX0xBTkdTX0NPTU1BX1NFUEFSQVRFRCkKK2Vsc2UKKyMgZmVhdHVyZSB0ZXN0IG5lZWRzIHB5dGhvbiBidWlsZAorY3Jvc3NmZWF0dXJlOgorZW5kaWYKKworY3Jvc3MtJTogcHJlY3Jvc3MgY3Jvc3NmZWF0dXJlCisJJChDUk9TU19QWSkgdGVzdC90ZXN0LnB5IC0tcmV0cnktY291bnQgNSAtLXNraXAta25vd24tZmFpbHVyZXMgLS1zZXJ2ZXIgJChDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQpIC0tY2xpZW50ICQoQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEKSAtLXJlZ2V4ICIkKiIKKworY3Jvc3M6IGNyb3NzLS4qCiAKIFRJTUVTID0gMSAyIDMKIGZhaWw6IHByZWNyb3NzCi0JJChQWVRIT04pIHRlc3QvdGVzdC5weSB8fCB0cnVlCi0JJChQWVRIT04pIHRlc3QvdGVzdC5weSAtLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcz1vdmVyd3JpdGUKKwkkKENST1NTX1BZKSB0ZXN0L3Rlc3QucHkgfHwgdHJ1ZQorCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSAtLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcz1vdmVyd3JpdGUKIAkkKGZvcmVhY2ggdmFyLCQoVElNRVMpLHRlc3QvdGVzdC5weSAtcyB8fCB0cnVlO3Rlc3QvdGVzdC5weSAtLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcz1tZXJnZTspCiAKIGNvZGVzcGVsbF9za2lwX2ZpbGVzID0gXApAQCAtODgsMjMgKzEzMywzMCBAQAogCiBFWFRSQV9ESVNUID0gXAogCS5jbGFuZy1mb3JtYXQgXAorCS5kb2NrZXJpZ25vcmUgXAogCS5lZGl0b3Jjb25maWcgXAogCS50cmF2aXMueW1sIFwKKwkucnVzdGZtdC50b21sIFwKKwlBcGFjaGVUaHJpZnQubnVzcGVjIFwKIAlhcHB2ZXlvci55bWwgXAorCWJvb3RzdHJhcC5zaCBcCiAJYm93ZXIuanNvbiBcCiAJYnVpbGQgXAorCUNIQU5HRVMubWQgXAogCUNNYWtlTGlzdHMudHh0IFwKIAljb21wb3Nlci5qc29uIFwKIAljb250cmliIFwKIAlDT05UUklCVVRJTkcubWQgXAogCWRlYmlhbiBcCi0JZG9jIFwKIAlkb2FwLnJkZiBcCi0JanNvbi1zY2hlbWEuanNvbiBcCi0JcGFja2FnZS5qc29uIFwKLQlyYXRfZXhjbHVkZSBcCi0Jc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzIFwKKwlkb2MgXAorCWR1Yi5qc29uIFwKKwlqaXRwYWNrLnltbCBcCisJTEFOR1VBR0VTLm1kIFwKIAlMSUNFTlNFIFwKLQlDSEFOR0VTIFwKIAlOT1RJQ0UgXAotCVJFQURNRS5tZAorCXBhY2thZ2UuanNvbiBcCisJcGhwY3MueG1sLmRpc3QgXAorCVJFQURNRS5tZCBcCisJc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzIFwKKwlUaHJpZnQucG9kc3BlYwpkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCmluZGV4IGMyMzk5NWEuLjM3ODI0ZTcgMTAwNjQ0Ci0tLSBhL05PVElDRQorKysgYi9OT1RJQ0UKQEAgLTEsNSArMSw1IEBACiBBcGFjaGUgVGhyaWZ0Ci1Db3B5cmlnaHQgMjAwNi0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KK0NvcHlyaWdodCAoQykgMjAwNiAtIDIwMTksIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgogCiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1RoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCmRpZmYgLS1naXQgYS9SRUFETUUubWQgYi9SRUFETUUubWQKaW5kZXggYTU1Mzg5YS4uZDA5ZTZlMSAxMDA2NDQKLS0tIGEvUkVBRE1FLm1kCisrKyBiL1JFQURNRS5tZApAQCAtMSw3ICsxLDQzIEBACiBBcGFjaGUgVGhyaWZ0CiA9PT09PT09PT09PT09CiAKLUxhc3QgTW9kaWZpZWQ6IDIwMTQtMDMtMTYKK0ludHJvZHVjdGlvbgorPT09PT09PT09PT09CisKK1RocmlmdCBpcyBhIGxpZ2h0d2VpZ2h0LCBsYW5ndWFnZS1pbmRlcGVuZGVudCBzb2Z0d2FyZSBzdGFjayB3aXRoIGFuCithc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIHBvaW50LXRvLXBvaW50IFJQQy4gVGhyaWZ0IHByb3ZpZGVzIAorY2xlYW4gYWJzdHJhY3Rpb25zIGZvciBkYXRhIHRyYW5zcG9ydCwgZGF0YSBzZXJpYWxpemF0aW9uLCBhbmQgYXBwbGljYXRpb24KK2xldmVsIHByb2Nlc3NpbmcuIFRoZSBjb2RlIGdlbmVyYXRpb24gc3lzdGVtIHRha2VzIGEgc2ltcGxlIGRlZmluaXRpb24KK2xhbmd1YWdlIGFzIGlucHV0IGFuZCBnZW5lcmF0ZXMgY29kZSBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHRoYXQKK3VzZXMgdGhlIGFic3RyYWN0ZWQgc3RhY2sgdG8gYnVpbGQgaW50ZXJvcGVyYWJsZSBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4KKworIVtBcGFjaGUgVGhyaWZ0IExheWVyZWQgQXJjaGl0ZWN0dXJlXShkb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nKQorCitUaHJpZnQgbWFrZXMgaXQgZWFzeSBmb3IgcHJvZ3JhbXMgd3JpdHRlbiBpbiBkaWZmZXJlbnQgcHJvZ3JhbW1pbmcKK2xhbmd1YWdlcyB0byBzaGFyZSBkYXRhIGFuZCBjYWxsIHJlbW90ZSBwcm9jZWR1cmVzLiAgV2l0aCBzdXBwb3J0IAorZm9yIFsyNSBwcm9ncmFtbWluZyBsYW5ndWFnZXNdKExBTkdVQUdFUy5tZCksIGNoYW5jZXMgYXJlIFRocmlmdCAKK3N1cHBvcnRzIHRoZSBsYW5ndWFnZXMgdGhhdCB5b3UgY3VycmVudGx5IHVzZS4KKworVGhyaWZ0IGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBzdXBwb3J0IG5vbi1hdG9taWMgdmVyc2lvbiBjaGFuZ2VzCithY3Jvc3MgY2xpZW50IGFuZCBzZXJ2ZXIgY29kZS4KKworRm9yIG1vcmUgZGV0YWlscyBvbiBUaHJpZnQncyBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uLCBzZWUgdGhlIFRocmlmdAord2hpdGVwYXBlciBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgb3IgYXQgdGhlIFJFQURNRS5tZCBmaWxlCitpbiB5b3VyIHBhcnRpY3VsYXIgc3ViZGlyZWN0b3J5IG9mIGludGVyZXN0LgorCitTdGF0dXMKKz09PT09PQorCit8IEJyYW5jaCB8IFRyYXZpcyB8IEFwcHZleW9yIHwgQ292ZXJpdHkgU2NhbiB8IGNvZGVjb3YuaW8gfCBXZWJzaXRlIHwKK3wgOi0tLS0tIHwgOi0tLS0tIHwgOi0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0tLS0tLSB8IDotLS0tLS0gfAorfCBbYG1hc3RlcmBdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L3RyZWUvbWFzdGVyKSB8IFshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2FwYWNoZS90aHJpZnQuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvYXBhY2hlL3RocmlmdCkgfCBbIVtCdWlsZCBzdGF0dXNdKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL2FwaS9wcm9qZWN0cy9zdGF0dXMvZ2l0aHViL2FwYWNoZS90aHJpZnQ/YnJhbmNoPW1hc3RlciZzdmc9dHJ1ZSldKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvQXBhY2hlU29mdHdhcmVGb3VuZGF0aW9uL3RocmlmdC9oaXN0b3J5KSB8IFshW0NvdmVyaXR5IFNjYW4gQnVpbGQgU3RhdHVzXShodHRwczovL3NjYW4uY292ZXJpdHkuY29tL3Byb2plY3RzLzEzNDUvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9wcm9qZWN0cy90aHJpZnQpIHwgfCBbIVtXZWJzaXRlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL29mZmljaWFsLXdlYnNpdGUtYnJpZ2h0Z3JlZW4uc3ZnKV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy8pIHwKKworUmVsZWFzZXMKKz09PT09PT09CisKK1RocmlmdCBkb2VzIG5vdCBtYWludGFpbiBhIHNwZWNpZmljIHJlbGVhc2UgY2FsZW5kYXIgYXQgdGhpcyB0aW1lLiAgCisKK1dlIHN0cml2ZSB0byByZWxlYXNlIHR3aWNlIHllYXJseS4gIERvd25sb2FkIHRoZSBbY3VycmVudCByZWxlYXNlXShodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG93bmxvYWQpLgogCiBMaWNlbnNlCiA9PT09PT09CkBAIC0yMywyNSArNTksOCBAQAogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogdW5kZXIgdGhlIExpY2Vuc2UuCiAKLUludHJvZHVjdGlvbgotPT09PT09PT09PT09Ci0KLVRocmlmdCBpcyBhIGxpZ2h0d2VpZ2h0LCBsYW5ndWFnZS1pbmRlcGVuZGVudCBzb2Z0d2FyZSBzdGFjayB3aXRoIGFuCi1hc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIFJQQy4gVGhyaWZ0IHByb3ZpZGVzIGNsZWFuCi1hYnN0cmFjdGlvbnMgZm9yIGRhdGEgdHJhbnNwb3J0LCBkYXRhIHNlcmlhbGl6YXRpb24sIGFuZCBhcHBsaWNhdGlvbgotbGV2ZWwgcHJvY2Vzc2luZy4gVGhlIGNvZGUgZ2VuZXJhdGlvbiBzeXN0ZW0gdGFrZXMgYSBzaW1wbGUgZGVmaW5pdGlvbgotbGFuZ3VhZ2UgYXMgaXRzIGlucHV0IGFuZCBnZW5lcmF0ZXMgY29kZSBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHRoYXQKLXVzZXMgdGhlIGFic3RyYWN0ZWQgc3RhY2sgdG8gYnVpbGQgaW50ZXJvcGVyYWJsZSBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4KLQotVGhyaWZ0IGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBzdXBwb3J0IG5vbi1hdG9taWMgdmVyc2lvbiBjaGFuZ2VzCi1hY3Jvc3MgY2xpZW50IGFuZCBzZXJ2ZXIgY29kZS4KLQotRm9yIG1vcmUgZGV0YWlscyBvbiBUaHJpZnQncyBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uLCB0YWtlIGEgZ2FuZGVyIGF0Ci10aGUgVGhyaWZ0IHdoaXRlcGFwZXIgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gb3IgYXQgdGhlIFJFQURNRS5tZCBmaWxlcwotaW4geW91ciBwYXJ0aWN1bGFyIHN1YmRpcmVjdG9yeSBvZiBpbnRlcmVzdC4KLQotSGllcmFyY2h5Ci09PT09PT09PT0KK1Byb2plY3QgSGllcmFyY2h5Cis9PT09PT09PT09PT09PT09PQogCiB0aHJpZnQvCiAKQEAgLTYwLDYgKzc5LDcgQEAKICAgICBwaHAvCiAgICAgcHkvCiAgICAgcmIvCisgICAgLi4uCiAKICAgdGVzdC8KIApAQCAtNzEsMTAgKzkxLDE2IEBACiAgICAgQ29udGFpbnMgYSBiYXNpYyB0dXRvcmlhbCB0aGF0IHdpbGwgdGVhY2ggeW91IGhvdyB0byBkZXZlbG9wIHNvZnR3YXJlCiAgICAgdXNpbmcgVGhyaWZ0LgogCitEZXZlbG9wbWVudAorPT09PT09PT09PT0KKworVG8gYnVpbGQgdGhlIHNhbWUgd2F5IFRyYXZpcyBDSSBidWlsZHMgdGhlIHByb2plY3QgeW91IHNob3VsZCB1c2UgZG9ja2VyLgorV2UgaGF2ZSBbY29tcHJlaGVuc2l2ZSBidWlsZGluZyBpbnN0cnVjdGlvbnMgZm9yIGRvY2tlcl0oYnVpbGQvZG9ja2VyL1JFQURNRS5tZCkuCisKIFJlcXVpcmVtZW50cwogPT09PT09PT09PT09CiAKLVNlZSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG9jcy9pbnN0YWxsIGZvciBhbiB1cC10by1kYXRlIGxpc3Qgb2YgYnVpbGQgcmVxdWlyZW1lbnRzLgorU2VlIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb2NzL2luc3RhbGwgZm9yIGEgbGlzdCBvZiBidWlsZCByZXF1aXJlbWVudHMgKG1heSBiZSBzdGFsZSkuICBBbHRlcm5hdGl2ZWx5IHNlZSB0aGUgZG9ja2VyIGJ1aWxkIGVudmlyb25tZW50cyBmb3IgYSBsaXN0IG9mIHByZXJlcXVpc2l0ZXMuCiAKIFJlc291cmNlcwogPT09PT09PT09CkBAIC0xNjIsMyArMTg4LDUgQEAKIAogVGhpcyB3aWxsIHJ1biBhIHNldCBvZiB0ZXN0cyB0aGF0IHVzZSBkaWZmZXJlbnQgbGFuZ3VhZ2UgY2xpZW50cyBhbmQKIHNlcnZlcnMuCisKKwpkaWZmIC0tZ2l0IGEvVGhyaWZ0LnBvZHNwZWMgYi9UaHJpZnQucG9kc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjFjOWIyCi0tLSAvZGV2L251bGwKKysrIGIvVGhyaWZ0LnBvZHNwZWMKQEAgLTAsMCArMSwxNiBAQAorUG9kOjpTcGVjLm5ldyBkbyB8c3wKKyAgcy5uYW1lICAgICAgICAgID0gIlRocmlmdC1zd2lmdDMiCisgIHMudmVyc2lvbiAgICAgICA9ICIwLjEzLjAiCisgIHMuc3VtbWFyeSAgICAgICA9ICJBcGFjaGUgVGhyaWZ0IGlzIGEgbGlnaHR3ZWlnaHQsIGxhbmd1YWdlLWluZGVwZW5kZW50IHNvZnR3YXJlIHN0YWNrIHdpdGggYW4gYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBSUEMuIgorICBzLmRlc2NyaXB0aW9uICAgPSA8PC1ERVNDCitUaGUgQXBhY2hlIFRocmlmdCBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIG5ldHdvcmtlZCBzZXJ2aWNlcyBkZXZlbG9wbWVudCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseSBiZXR3ZWVuIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgorICAgICAgICAgICAgICAgICAgICBERVNDCisgIHMuaG9tZXBhZ2UgICAgICA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCisgIHMubGljZW5zZSAgICAgICA9IHsgOnR5cGUgPT4gJ0FwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcsIDp1cmwgPT4gJ2h0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAnIH0KKyAgcy5hdXRob3IgICAgICAgID0geyAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiA9PiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiB9CisgIHMuaW9zLmRlcGxveW1lbnRfdGFyZ2V0ID0gJzkuMCcKKyAgcy5vc3guZGVwbG95bWVudF90YXJnZXQgPSAnMTAuMTAnCisgIHMucmVxdWlyZXNfYXJjICA9IHRydWUKKyAgcy5zb3VyY2UgICAgICAgID0geyA6Z2l0ID0+ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLCA6dGFnID0+ICJ2MC4xMy4wIiB9CisgIHMuc291cmNlX2ZpbGVzICA9ICJsaWIvc3dpZnQvU291cmNlcy8qLnN3aWZ0IgorZW5kCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQgYi9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQKaW5kZXggYjQ5NjAyMC4uZDU0MDM5NSAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00CisrKyBiL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNApAQCAtMSw1ICsxLDUgQEAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICAgICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2Jvb3N0X2Jhc2UuaHRtbAorIyAgICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9ib29zdF9iYXNlLmh0bWwKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCkBAIC0zMyw3ICszMywxNSBAQAogIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKICMgICB3YXJyYW50eS4KIAotI3NlcmlhbCAyMworI3NlcmlhbCA0NQorCisjIGV4YW1wbGUgYm9vc3QgcHJvZ3JhbSAobmVlZCB0byBwYXNzIHZlcnNpb24pCittNF9kZWZpbmUoW19BWF9CT09TVF9CQVNFX1BST0dSQU1dLAorICAgICAgICAgIFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KK11dLFtbCisodm9pZCkgKCh2b2lkKXNpemVvZihjaGFyWzEgLSAyKiEhKChCT09TVF9WRVJTSU9OKSA8ICgkMSkpXSkpOworXV0pXSkKIAogQUNfREVGVU4oW0FYX0JPT1NUX0JBU0VdLAogWwpAQCAtNDQsMTAxICs1MiwxMjEgQEAKICAgICAgb3IgZGlzYWJsZSBpdCAoQVJHPW5vKQogICAgICBAPDpAQVJHPXllc0A6PkAgXSldLAogICAgIFsKLSAgICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSAibm8iOyB0aGVuCi0gICAgICAgIHdhbnRfYm9vc3Q9Im5vIgotICAgIGVsaWYgdGVzdCAiJHdpdGh2YWwiID0gInllcyI7IHRoZW4KLSAgICAgICAgd2FudF9ib29zdD0ieWVzIgotICAgICAgICBhY19ib29zdF9wYXRoPSIiCi0gICAgZWxzZQotICAgICAgICB3YW50X2Jvb3N0PSJ5ZXMiCi0gICAgICAgIGFjX2Jvb3N0X3BhdGg9IiR3aXRodmFsIgotICAgIGZpCisgICAgIEFTX0NBU0UoWyR3aXRodmFsXSwKKyAgICAgICBbbm9dLFt3YW50X2Jvb3N0PSJubyI7X0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aD0iIl0sCisgICAgICAgW3llc10sW3dhbnRfYm9vc3Q9InllcyI7X0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aD0iIl0sCisgICAgICAgW3dhbnRfYm9vc3Q9InllcyI7X0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aD0iJHdpdGh2YWwiXSkKICAgICBdLAogICAgIFt3YW50X2Jvb3N0PSJ5ZXMiXSkKIAogCiBBQ19BUkdfV0lUSChbYm9vc3QtbGliZGlyXSwKLSAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdC1saWJkaXI9TElCX0RJUl0sCi0gICAgICAgIFtGb3JjZSBnaXZlbiBkaXJlY3RvcnkgZm9yIGJvb3N0IGxpYnJhcmllcy4gTm90ZSB0aGF0IHRoaXMgd2lsbCBvdmVycmlkZSBsaWJyYXJ5IHBhdGggZGV0ZWN0aW9uLCBzbyB1c2UgdGhpcyBwYXJhbWV0ZXIgb25seSBpZiBkZWZhdWx0IGxpYnJhcnkgZGV0ZWN0aW9uIGZhaWxzIGFuZCB5b3Uga25vdyBleGFjdGx5IHdoZXJlIHlvdXIgYm9vc3QgbGlicmFyaWVzIGFyZSBsb2NhdGVkLl0pLAotICAgICAgICBbCi0gICAgICAgIGlmIHRlc3QgLWQgIiR3aXRodmFsIgotICAgICAgICB0aGVuCi0gICAgICAgICAgICAgICAgYWNfYm9vc3RfbGliX3BhdGg9IiR3aXRodmFsIgotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQUNfTVNHX0VSUk9SKC0td2l0aC1ib29zdC1saWJkaXIgZXhwZWN0ZWQgZGlyZWN0b3J5IG5hbWUpCi0gICAgICAgIGZpCi0gICAgICAgIF0sCi0gICAgICAgIFthY19ib29zdF9saWJfcGF0aD0iIl0KLSkKKyAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtYm9vc3QtbGliZGlyPUxJQl9ESVJdLAorICAgIFtGb3JjZSBnaXZlbiBkaXJlY3RvcnkgZm9yIGJvb3N0IGxpYnJhcmllcy4KKyAgICAgTm90ZSB0aGF0IHRoaXMgd2lsbCBvdmVycmlkZSBsaWJyYXJ5IHBhdGggZGV0ZWN0aW9uLAorICAgICBzbyB1c2UgdGhpcyBwYXJhbWV0ZXIgb25seSBpZiBkZWZhdWx0IGxpYnJhcnkgZGV0ZWN0aW9uIGZhaWxzCisgICAgIGFuZCB5b3Uga25vdyBleGFjdGx5IHdoZXJlIHlvdXIgYm9vc3QgbGlicmFyaWVzIGFyZSBsb2NhdGVkLl0pXSwKKyAgWworICAgQVNfSUYoW3Rlc3QgLWQgIiR3aXRodmFsIl0sCisgICAgICAgICBbX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGg9IiR3aXRodmFsIl0sCisgICAgW0FDX01TR19FUlJPUihbLS13aXRoLWJvb3N0LWxpYmRpciBleHBlY3RlZCBkaXJlY3RvcnkgbmFtZV0pXSkKKyAgXSwKKyAgW19BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoPSIiXSkKIAotaWYgdGVzdCAieCR3YW50X2Jvb3N0IiA9ICJ4eWVzIjsgdGhlbgotICAgIGJvb3N0X2xpYl92ZXJzaW9uX3JlcT1pZmVsc2UoWyQxXSwgLDEuMjAuMCwkMSkKLSAgICBib29zdF9saWJfdmVyc2lvbl9yZXFfc2hvcnRlbj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxIDogJ1woW1swLTldXSpcLltbMC05XV0qXCknYAotICAgIGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9tYWpvcj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxIDogJ1woW1swLTldXSpcKSdgCi0gICAgYm9vc3RfbGliX3ZlcnNpb25fcmVxX21pbm9yPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnW1swLTldXSpcLlwoW1swLTldXSpcKSdgCi0gICAgYm9vc3RfbGliX3ZlcnNpb25fcmVxX3N1Yl9taW5vcj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxIDogJ1tbMC05XV0qXC5bWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKLSAgICBpZiB0ZXN0ICJ4JGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zdWJfbWlub3IiID0gIngiIDsgdGhlbgotICAgICAgICBib29zdF9saWJfdmVyc2lvbl9yZXFfc3ViX21pbm9yPSIwIgotICAgICAgICBmaQotICAgIFdBTlRfQk9PU1RfVkVSU0lPTj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX21ham9yIFwqIDEwMDAwMCBcKyAgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9taW5vciBcKiAxMDAgXCsgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zdWJfbWlub3JgCi0gICAgQUNfTVNHX0NIRUNLSU5HKGZvciBib29zdGxpYiA+PSAkYm9vc3RfbGliX3ZlcnNpb25fcmVxKQorQk9PU1RfTERGTEFHUz0iIgorQk9PU1RfQ1BQRkxBR1M9IiIKK0FTX0lGKFt0ZXN0ICJ4JHdhbnRfYm9vc3QiID0gInh5ZXMiXSwKKyAgICAgIFtfQVhfQk9PU1RfQkFTRV9SVU5ERVRFQ1QoWyQxXSxbJDJdLFskM10pXSkKK0FDX1NVQlNUKEJPT1NUX0NQUEZMQUdTKQorQUNfU1VCU1QoQk9PU1RfTERGTEFHUykKK10pCisKKworIyBjb252ZXJ0IGEgdmVyc2lvbiBzdHJpbmcgaW4gJDIgdG8gbnVtZXJpYyBhbmQgYWZmZWN0IHRvIHBvbHltb3JwaGljIHZhciAkMQorQUNfREVGVU4oW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05dLFsKKyAgQVNfSUYoW3Rlc3QgIngkMiIgPSAieCJdLFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcT0iMS4yMC4wIl0sW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxPSIkMiJdKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zaG9ydGVuPWBleHByICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcSA6ICdcKFtbMC05XV0qXC5bWzAtOV1dKlwpJ2AKKyAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWFqb3I9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1woW1swLTldXSpcKSdgCisgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21ham9yIiA9ICJ4Il0sCisgICAgICAgIFtBQ19NU0dfRVJST1IoW1lvdSBzaG91bGQgYXQgbGVhc3Qgc3BlY2lmeSBsaWJib29zdCBtYWpvciB2ZXJzaW9uXSldKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9taW5vcj1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXEgOiAnW1swLTldXSpcLlwoW1swLTldXSpcKSdgCisgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yIiA9ICJ4Il0sCisgICAgICAgIFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9taW5vcj0iMCJdKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3I9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1tbMC05XV0qXC5bWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKKyAgQVNfSUYoW3Rlc3QgIlgkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfc3ViX21pbm9yIiA9ICJYIl0sCisgICAgICAgIFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3I9IjAiXSkKKyAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9SRVQ9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21ham9yIFwqIDEwMDAwMCBcKyAgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yIFwqIDEwMCBcKyAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfc3ViX21pbm9yYAorICBBU19WQVJfU0VUKCQxLCRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX1JFVCkKK10pCisKK2RubCBSdW4gdGhlIGRldGVjdGlvbiBvZiBib29zdCBzaG91bGQgYmUgcnVuIG9ubHkgaWYgJHdhbnRfYm9vc3QKK0FDX0RFRlVOKFtfQVhfQk9PU1RfQkFTRV9SVU5ERVRFQ1RdLFsKKyAgICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OKFdBTlRfQk9PU1RfVkVSU0lPTixbJDFdKQogICAgIHN1Y2NlZWRlZD1ubwogCisKKyAgICBBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pCiAgICAgZG5sIE9uIDY0LWJpdCBzeXN0ZW1zIGNoZWNrIGZvciBzeXN0ZW0gbGlicmFyaWVzIGluIGJvdGggbGliNjQgYW5kIGxpYi4KICAgICBkbmwgVGhlIGZvcm1lciBpcyBzcGVjaWZpZWQgYnkgRkhTLCBidXQgZS5nLiBEZWJpYW4gZG9lcyBub3QgYWRoZXJlIHRvCiAgICAgZG5sIHRoaXMgKGFzIGl0IHJpc2VzIHByb2JsZW1zIGZvciBnZW5lcmljIG11bHRpLWFyY2ggc3VwcG9ydCkuCiAgICAgZG5sIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBsaXN0IGlzIGNob3NlbiBieSBkZWZhdWx0IHdoZW4gbm8gbGlicmFyaWVzCiAgICAgZG5sIGFyZSBmb3VuZCwgZS5nLiB3aGVuIG9ubHkgaGVhZGVyLW9ubHkgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQhCi0gICAgbGlic3ViZGlycz0ibGliIgotICAgIGF4X2FyY2g9YHVuYW1lIC1tYAotICAgIGNhc2UgJGF4X2FyY2ggaW4KLSAgICAgIHg4Nl82NHxwcGM2NHxzMzkweHxzcGFyYzY0fGFhcmNoNjQpCi0gICAgICAgIGxpYnN1YmRpcnM9ImxpYjY0IGxpYiBsaWI2NCIKLSAgICAgICAgOzsKLSAgICBlc2FjCisgICAgQVNfQ0FTRShbJHtob3N0X2NwdX1dLAorICAgICAgW3g4Nl82NF0sW2xpYnN1YmRpcnM9ImxpYjY0IGxpYngzMiBsaWIgbGliNjQiXSwKKyAgICAgIFtwcGM2NHxwb3dlcnBjNjR8czM5MHh8c3BhcmM2NHxhYXJjaDY0fHBwYzY0bGV8cG93ZXJwYzY0bGV8cmlzY3Y2NF0sW2xpYnN1YmRpcnM9ImxpYjY0IGxpYiBsaWI2NCJdLAorICAgICAgW2xpYnN1YmRpcnM9ImxpYiJdCisgICAgKQogCiAgICAgZG5sIGFsbG93IGZvciByZWFsIG11bHRpLWFyY2ggcGF0aHMgZS5nLiAvdXNyL2xpYi94ODZfNjQtbGludXgtZ251LiBHaXZlCiAgICAgZG5sIHRoZW0gcHJpb3JpdHkgb3ZlciB0aGUgb3RoZXIgcGF0aHMgc2luY2UsIGlmIGxpYnMgYXJlIGZvdW5kIHRoZXJlLCB0aGV5CiAgICAgZG5sIGFyZSBhbG1vc3QgYXNzdXJlZGx5IHRoZSBvbmVzIGRlc2lyZWQuCi0gICAgQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQotICAgIGxpYnN1YmRpcnM9ImxpYi8ke2hvc3RfY3B1fS0ke2hvc3Rfb3N9ICRsaWJzdWJkaXJzIgotCi0gICAgY2FzZSAke2hvc3RfY3B1fSBpbgotICAgICAgaT84NikKLSAgICAgICAgbGlic3ViZGlycz0ibGliL2kzODYtJHtob3N0X29zfSAkbGlic3ViZGlycyIKLSAgICAgICAgOzsKLSAgICBlc2FjCisgICAgQVNfQ0FTRShbJHtob3N0X2NwdX1dLAorICAgICAgW2k/ODZdLFttdWx0aWFyY2hfbGlic3ViZGlyPSJsaWIvaTM4Ni0ke2hvc3Rfb3N9Il0sCisgICAgICBbbXVsdGlhcmNoX2xpYnN1YmRpcj0ibGliLyR7aG9zdF9jcHV9LSR7aG9zdF9vc30iXQorICAgICkKIAogICAgIGRubCBmaXJzdCB3ZSBjaGVjayB0aGUgc3lzdGVtIGxvY2F0aW9uIGZvciBib29zdCBsaWJyYXJpZXMKICAgICBkbmwgdGhpcyBsb2NhdGlvbiBpc3QgY2hvc2VuIGlmIGJvb3N0IGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIHdpdGggdGhlIC0tbGF5b3V0PXN5c3RlbSBvcHRpb24KICAgICBkbmwgb3IgaWYgeW91IGluc3RhbGwgYm9vc3Qgd2l0aCBSUE0KLSAgICBpZiB0ZXN0ICIkYWNfYm9vc3RfcGF0aCIgIT0gIiI7IHRoZW4KLSAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZSIKLSAgICAgICAgZm9yIGFjX2Jvb3N0X3BhdGhfdG1wIGluICRsaWJzdWJkaXJzOyBkbwotICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRhY19ib29zdF9wYXRoIi8iJGFjX2Jvb3N0X3BhdGhfdG1wIiA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJGFjX2Jvb3N0X3BhdGgvJGFjX2Jvb3N0X3BhdGhfdG1wIgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBmaQotICAgICAgICBkb25lCi0gICAgZWxpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KLSAgICAgICAgZm9yIGFjX2Jvb3N0X3BhdGhfdG1wIGluICRsdF9zeXNyb290L3VzciAkbHRfc3lzcm9vdC91c3IvbG9jYWwgJGx0X3N5c3Jvb3Qvb3B0ICRsdF9zeXNyb290L29wdC9sb2NhbCA7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWNfYm9vc3RfcGF0aF90bXAvaW5jbHVkZS9ib29zdCIgJiYgdGVzdCAtciAiJGFjX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUvYm9vc3QiOyB0aGVuCi0gICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkbGlic3ViZGlycyA7IGRvCi0gICAgICAgICAgICAgICAgICAgIGlmIGxzICIkYWNfYm9vc3RfcGF0aF90bXAvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQorICAgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiICE9ICJ4Il0sWworICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBib29zdGxpYiA+PSAkMSAoJFdBTlRfQk9PU1RfVkVSU0lPTikgaW5jbHVkZXMgaW4gIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUiXSkKKyAgICAgICAgIEFTX0lGKFt0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlIiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlIl0sWworICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlIgorICAgICAgICAgICBmb3IgX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAgaW4gJG11bHRpYXJjaF9saWJzdWJkaXIgJGxpYnN1YmRpcnM7IGRvCisgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgYm9vc3RsaWIgPj0gJDEgKCRXQU5UX0JPT1NUX1ZFUlNJT04pIGxpYiBwYXRoIGluICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAiXSkKKyAgICAgICAgICAgICAgICBBU19JRihbdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAiIF0sWworICAgICAgICAgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIF0sCisgICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKV0pCisgICAgICAgICAgIGRvbmVdLFsKKyAgICAgIEFDX01TR19SRVNVTFQoW25vXSldKQorICAgIF0sWworICAgICAgICBpZiB0ZXN0IFgiJGNyb3NzX2NvbXBpbGluZyIgPSBYeWVzOyB0aGVuCisgICAgICAgICAgICBzZWFyY2hfbGlic3ViZGlycz0kbXVsdGlhcmNoX2xpYnN1YmRpcgorICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWFyY2hfbGlic3ViZGlycz0iJG11bHRpYXJjaF9saWJzdWJkaXIgJGxpYnN1YmRpcnMiCisgICAgICAgIGZpCisgICAgICAgIGZvciBfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCBpbiAvdXNyIC91c3IvbG9jYWwgL29wdCAvb3B0L2xvY2FsIDsgZG8KKyAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC9pbmNsdWRlL2Jvb3N0IiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAvaW5jbHVkZS9ib29zdCIgOyB0aGVuCisgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkc2VhcmNoX2xpYnN1YmRpcnMgOyBkbworICAgICAgICAgICAgICAgICAgICBpZiBscyAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wLyRsaWJzdWJkaXIvbGliYm9vc3RfIiogPi9kZXYvbnVsbCAyPiYxIDsgdGhlbiBicmVhazsgZmkKICAgICAgICAgICAgICAgICBkb25lCi0gICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkYWNfYm9vc3RfcGF0aF90bXAvJGxpYnN1YmRpciIKLSAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkYWNfYm9vc3RfcGF0aF90bXAvaW5jbHVkZSIKKyAgICAgICAgICAgICAgICBCT09TVF9MREZMQUdTPSItTCRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC8kbGlic3ViZGlyIgorICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC9pbmNsdWRlIgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZmkKICAgICAgICAgZG9uZQotICAgIGZpCisgICAgXSkKIAogICAgIGRubCBvdmVyd3JpdGUgbGQgZmxhZ3MgaWYgd2UgaGF2ZSByZXF1aXJlZCBzcGVjaWFsIGRpcmVjdG9yeSB3aXRoCiAgICAgZG5sIC0td2l0aC1ib29zdC1saWJkaXIgcGFyYW1ldGVyCi0gICAgaWYgdGVzdCAiJGFjX2Jvb3N0X2xpYl9wYXRoIiAhPSAiIjsgdGhlbgotICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJGFjX2Jvb3N0X2xpYl9wYXRoIgotICAgIGZpCisgICAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiICE9ICJ4Il0sCisgICAgICAgICAgW0JPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIl0pCiAKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBib29zdGxpYiA+PSAkMSAoJFdBTlRfQk9PU1RfVkVSU0lPTildKQogICAgIENQUEZMQUdTX1NBVkVEPSIkQ1BQRkxBR1MiCiAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCiAgICAgZXhwb3J0IENQUEZMQUdTCkBAIC0xNDksMTUgKzE3Nyw3IEBACiAKICAgICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pCiAgICAgQUNfTEFOR19QVVNIKEMrKykKLSAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotICAgIEAlOkBpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KLSAgICBdXSwgW1sKLSAgICAjaWYgQk9PU1RfVkVSU0lPTiA+PSAkV0FOVF9CT09TVF9WRVJTSU9OCi0gICAgLy8gRXZlcnl0aGluZyBpcyBva2F5Ci0gICAgI2Vsc2UKLSAgICAjICBlcnJvciBCb29zdCB2ZXJzaW9uIGlzIHRvbyBvbGQKLSAgICAjZW5kaWYKLSAgICBdXSldLFsKKyAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW19BWF9CT09TVF9CQVNFX1BST0dSQU0oJFdBTlRfQk9PU1RfVkVSU0lPTildLFsKICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgc3VjY2VlZGVkPXllcwogICAgIGZvdW5kX3N5c3RlbT15ZXMKQEAgLTE2OSwzMCArMTg5LDUwIEBACiAKICAgICBkbmwgaWYgd2UgZm91bmQgbm8gYm9vc3Qgd2l0aCBzeXN0ZW0gbGF5b3V0IHdlIHNlYXJjaCBmb3IgYm9vc3QgbGlicmFyaWVzCiAgICAgZG5sIGJ1aWx0IGFuZCBpbnN0YWxsZWQgd2l0aG91dCB0aGUgLS1sYXlvdXQ9c3lzdGVtIG9wdGlvbiBvciBmb3IgYSBzdGFnZWQobm90IGluc3RhbGxlZCkgdmVyc2lvbgotICAgIGlmIHRlc3QgIngkc3VjY2VlZGVkIiAhPSAieHllcyI7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JHN1Y2NlZWRlZCIgIT0gInh5ZXMiIDsgdGhlbgorICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTX1NBVkVEIgorICAgICAgICBMREZMQUdTPSIkTERGTEFHU19TQVZFRCIKKyAgICAgICAgQk9PU1RfQ1BQRkxBR1M9CisgICAgICAgIGlmIHRlc3QgLXogIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aCIgOyB0aGVuCisgICAgICAgICAgICBCT09TVF9MREZMQUdTPQorICAgICAgICBmaQogICAgICAgICBfdmVyc2lvbj0wCi0gICAgICAgIGlmIHRlc3QgIiRhY19ib29zdF9wYXRoIiAhPSAiIjsgdGhlbgotICAgICAgICAgICAgaWYgdGVzdCAtZCAiJGFjX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRhY19ib29zdF9wYXRoIjsgdGhlbgotICAgICAgICAgICAgICAgIGZvciBpIGluIGBscyAtZCAkYWNfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSogMj4vZGV2L251bGxgOyBkbwotICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbl90bXA9YGVjaG8gJGkgfCBzZWQgInMjJGFjX2Jvb3N0X3BhdGgjIyIgfCBzZWQgJ3MvXC9pbmNsdWRlXC9ib29zdC0vLycgfCBzZWQgJ3MvXy8uLydgCisgICAgICAgIGlmIHRlc3QgLW4gIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCI7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiBgbHMgLWQgJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0qIDI+L2Rldi9udWxsYDsgZG8KKyAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAogICAgICAgICAgICAgICAgICAgICBWX0NIRUNLPWBleHByICRfdmVyc2lvbl90bXAgXD4gJF92ZXJzaW9uYAotICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkVl9DSEVDSyIgPSAiMSIgOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkVl9DSEVDSyIgPSAieDEiIDsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb249JF92ZXJzaW9uX3RtcAogICAgICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgICAgICBWRVJTSU9OX1VOREVSU0NPUkU9YGVjaG8gJF92ZXJzaW9uIHwgc2VkICdzL1wuL18vJ2AKLSAgICAgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0kVkVSU0lPTl9VTkRFUlNDT1JFIgorICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCiAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgIGRubCBpZiBub3RoaW5nIGZvdW5kIHNlYXJjaCBmb3IgbGF5b3V0IHVzZWQgaW4gV2luZG93cyBkaXN0cmlidXRpb25zCisgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJEJPT1NUX0NQUEZMQUdTIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9ib29zdCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvYm9vc3QiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGRubCBpZiB3ZSBmb3VuZCBzb21ldGhpbmcgYW5kIEJPT1NUX0xERkxBR1Mgd2FzIHVuc2V0IGJlZm9yZQorICAgICAgICAgICAgICAgIGRubCAoYmVjYXVzZSAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiA9ICIiKSwgc2V0IGl0IGhlcmUuCisgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEJPT1NUX0NQUEZMQUdTIiAmJiB0ZXN0IC16ICIkQk9PU1RfTERGTEFHUyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkbGlic3ViZGlycyA7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBscyAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQorICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJGxpYnN1YmRpciIKKyAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgZmkKICAgICAgICAgZWxzZQotICAgICAgICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCi0gICAgICAgICAgICAgICAgZm9yIGFjX2Jvb3N0X3BhdGggaW4gJGx0X3N5c3Jvb3QvdXNyICRsdF9zeXNyb290L3Vzci9sb2NhbCAkbHRfc3lzcm9vdC9vcHQgJGx0X3N5c3Jvb3Qvb3B0L2xvY2FsIDsgZG8KLSAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJGFjX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRhY19ib29zdF9wYXRoIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gYGxzIC1kICRhY19ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtKiAyPi9kZXYvbnVsbGA7IGRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRhY19ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAorICAgICAgICAgICAgaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciICE9ICJ4eWVzIiA7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3IgX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCBpbiAvdXNyIC91c3IvbG9jYWwgL29wdCAvb3B0L2xvY2FsIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIGBscyAtZCAkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSogMj4vZGV2L251bGxgOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3RtcD1gZWNobyAkaSB8IHNlZCAicyMkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCMjIiB8IHNlZCAncy9cL2luY2x1ZGVcL2Jvb3N0LS8vJyB8IHNlZCAncy9fLy4vJ2AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWX0NIRUNLPWBleHByICRfdmVyc2lvbl90bXAgXD4gJF92ZXJzaW9uYAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRWX0NIRUNLIiA9ICIxIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4JFZfQ0hFQ0siID0gIngxIiA7IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb249JF92ZXJzaW9uX3RtcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3BhdGg9JGFjX2Jvb3N0X3BhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9wYXRoPSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUKICAgICAgICAgICAgICAgICAgICAgZmkKQEAgLTIwMCw3ICsyNDAsNyBAQAogCiAgICAgICAgICAgICAgICAgVkVSU0lPTl9VTkRFUlNDT1JFPWBlY2hvICRfdmVyc2lvbiB8IHNlZCAncy9cLi9fLydgCiAgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJGJlc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCi0gICAgICAgICAgICAgICAgaWYgdGVzdCAiJGFjX2Jvb3N0X2xpYl9wYXRoIiA9ICIiOyB0aGVuCisgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiA7IHRoZW4KICAgICAgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkbGlic3ViZGlycyA7IGRvCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBscyAiJGJlc3RfcGF0aC8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCiAgICAgICAgICAgICAgICAgICAgIGRvbmUKQEAgLTIwOCw3ICsyNDgsNyBAQAogICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICBmaQogCi0gICAgICAgICAgICBpZiB0ZXN0ICJ4JEJPT1NUX1JPT1QiICE9ICJ4IjsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEJPT1NUX1JPT1QiIDsgdGhlbgogICAgICAgICAgICAgICAgIGZvciBsaWJzdWJkaXIgaW4gJGxpYnN1YmRpcnMgOyBkbwogICAgICAgICAgICAgICAgICAgICBpZiBscyAiJEJPT1NUX1JPT1Qvc3RhZ2UvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQogICAgICAgICAgICAgICAgIGRvbmUKQEAgLTIxNyw3ICsyNTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdGFnZV92ZXJzaW9uPWBlY2hvICR2ZXJzaW9uX2RpciB8IHNlZCAncy9ib29zdF8vLycgfCBzZWQgJ3MvXy8uL2cnYAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VfdmVyc2lvbl9zaG9ydGVuPWBleHByICRzdGFnZV92ZXJzaW9uIDogJ1woW1swLTldXSpcLltbMC05XV0qXCknYAogICAgICAgICAgICAgICAgICAgICBWX0NIRUNLPWBleHByICRzdGFnZV92ZXJzaW9uX3Nob3J0ZW4gXD5cPSAkX3ZlcnNpb25gCi0gICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRWX0NIRUNLIiA9ICIxIiAtYSAiJGFjX2Jvb3N0X2xpYl9wYXRoIiA9ICIiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4JFZfQ0hFQ0siID0gIngxIiAmJiB0ZXN0IC16ICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiIDsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgQUNfTVNHX05PVElDRShXZSB3aWxsIHVzZSBhIHN0YWdlZCBib29zdCBsaWJyYXJ5IGZyb20gJEJPT1NUX1JPT1QpCiAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkQk9PU1RfUk9PVCIKICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJEJPT1NUX1JPT1Qvc3RhZ2UvJGxpYnN1YmRpciIKQEAgLTIzMiwxNSArMjcyLDcgQEAKICAgICAgICAgZXhwb3J0IExERkxBR1MKIAogICAgICAgICBBQ19MQU5HX1BVU0goQysrKQotICAgICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotICAgICAgICBAJTpAaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+Ci0gICAgICAgIF1dLCBbWwotICAgICAgICAjaWYgQk9PU1RfVkVSU0lPTiA+PSAkV0FOVF9CT09TVF9WRVJTSU9OCi0gICAgICAgIC8vIEV2ZXJ5dGhpbmcgaXMgb2theQotICAgICAgICAjZWxzZQotICAgICAgICAjICBlcnJvciBCb29zdCB2ZXJzaW9uIGlzIHRvbyBvbGQKLSAgICAgICAgI2VuZGlmCi0gICAgICAgIF1dKV0sWworICAgICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW19BWF9CT09TVF9CQVNFX1BST0dSQU0oJFdBTlRfQk9PU1RfVkVSU0lPTildLFsKICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgICBzdWNjZWVkZWQ9eWVzCiAgICAgICAgIGZvdW5kX3N5c3RlbT15ZXMKQEAgLTI0OSwxNyArMjgxLDE1IEBACiAgICAgICAgIEFDX0xBTkdfUE9QKFtDKytdKQogICAgIGZpCiAKLSAgICBpZiB0ZXN0ICIkc3VjY2VlZGVkIiAhPSAieWVzIiA7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAiJF92ZXJzaW9uIiA9ICIwIiA7IHRoZW4KLSAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoW1tXZSBjb3VsZCBub3QgZGV0ZWN0IHRoZSBib29zdCBsaWJyYXJpZXMgKHZlcnNpb24gJGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zaG9ydGVuIG9yIGhpZ2hlcikuIElmIHlvdSBoYXZlIGEgc3RhZ2VkIGJvb3N0IGxpYnJhcnkgKHN0aWxsIG5vdCBpbnN0YWxsZWQpIHBsZWFzZSBzcGVjaWZ5IFwkQk9PU1RfUk9PVCBpbiB5b3VyIGVudmlyb25tZW50IGFuZCBkbyBub3QgZ2l2ZSBhIFBBVEggdG8gLS13aXRoLWJvb3N0IG9wdGlvbi4gIElmIHlvdSBhcmUgc3VyZSB5b3UgaGF2ZSBib29zdCBpbnN0YWxsZWQsIHRoZW4gY2hlY2sgeW91ciB2ZXJzaW9uIG51bWJlciBsb29raW5nIGluIDxib29zdC92ZXJzaW9uLmhwcD4uIFNlZSBodHRwOi8vcmFuZHNwcmluZ2VyLmRlL2Jvb3N0IGZvciBtb3JlIGRvY3VtZW50YXRpb24uXV0pCisgICAgaWYgdGVzdCAieCRzdWNjZWVkZWQiICE9ICJ4eWVzIiA7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAieCRfdmVyc2lvbiIgPSAieDAiIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX05PVElDRShbW1dlIGNvdWxkIG5vdCBkZXRlY3QgdGhlIGJvb3N0IGxpYnJhcmllcyAodmVyc2lvbiAkMSBvciBoaWdoZXIpLiBJZiB5b3UgaGF2ZSBhIHN0YWdlZCBib29zdCBsaWJyYXJ5IChzdGlsbCBub3QgaW5zdGFsbGVkKSBwbGVhc2Ugc3BlY2lmeSBcJEJPT1NUX1JPT1QgaW4geW91ciBlbnZpcm9ubWVudCBhbmQgZG8gbm90IGdpdmUgYSBQQVRIIHRvIC0td2l0aC1ib29zdCBvcHRpb24uICBJZiB5b3UgYXJlIHN1cmUgeW91IGhhdmUgYm9vc3QgaW5zdGFsbGVkLCB0aGVuIGNoZWNrIHlvdXIgdmVyc2lvbiBudW1iZXIgbG9va2luZyBpbiA8Ym9vc3QvdmVyc2lvbi5ocHA+LiBTZWUgaHR0cDovL3JhbmRzcHJpbmdlci5kZS9ib29zdCBmb3IgbW9yZSBkb2N1bWVudGF0aW9uLl1dKQogICAgICAgICBlbHNlCiAgICAgICAgICAgICBBQ19NU0dfTk9USUNFKFtZb3VyIGJvb3N0IGxpYnJhcmllcyBzZWVtcyB0byBvbGQgKHZlcnNpb24gJF92ZXJzaW9uKS5dKQogICAgICAgICBmaQogICAgICAgICAjIGV4ZWN1dGUgQUNUSU9OLUlGLU5PVC1GT1VORCAoaWYgcHJlc2VudCk6CiAgICAgICAgIGlmZWxzZShbJDNdLCAsIDosIFskM10pCiAgICAgZWxzZQotICAgICAgICBBQ19TVUJTVChCT09TVF9DUFBGTEFHUykKLSAgICAgICAgQUNfU1VCU1QoQk9PU1RfTERGTEFHUykKICAgICAgICAgQUNfREVGSU5FKEhBVkVfQk9PU1QsLFtkZWZpbmUgaWYgdGhlIEJvb3N0IGxpYnJhcnkgaXMgYXZhaWxhYmxlXSkKICAgICAgICAgIyBleGVjdXRlIEFDVElPTi1JRi1GT1VORCAoaWYgcHJlc2VudCk6CiAgICAgICAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pCkBAIC0yNjcsNiArMjk3LDUgQEAKIAogICAgIENQUEZMQUdTPSIkQ1BQRkxBR1NfU0FWRUQiCiAgICAgTERGTEFHUz0iJExERkxBR1NfU0FWRUQiCi1maQogCiBdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9jaGVja19vcGVuc3NsLm00IGIvYWNsb2NhbC9heF9jaGVja19vcGVuc3NsLm00CmluZGV4IGE4N2M1YTYuLjI4ZTQ4Y2IgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfY2hlY2tfb3BlbnNzbC5tNAorKysgYi9hY2xvY2FsL2F4X2NoZWNrX29wZW5zc2wubTQKQEAgLTEsNSArMSw1IEBACiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY2hlY2tfb3BlbnNzbC5odG1sCisjICAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY2hlY2tfb3BlbnNzbC5odG1sCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIwogIyBTWU5PUFNJUwpAQCAtMzIsNyArMzIsNyBAQAogIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKICMgICB3YXJyYW50eS4KIAotI3NlcmlhbCA4Cisjc2VyaWFsIDEwCiAKIEFVX0FMSUFTKFtDSEVDS19TU0xdLCBbQVhfQ0hFQ0tfT1BFTlNTTF0pCiBBQ19ERUZVTihbQVhfQ0hFQ0tfT1BFTlNTTF0sIFsKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgXSwgWwogICAgICAgICAgICAgIyBpZiBwa2ctY29uZmlnIGlzIGluc3RhbGxlZCBhbmQgb3BlbnNzbCBoYXMgaW5zdGFsbGVkIGEgLnBjIGZpbGUsCiAgICAgICAgICAgICAjIHRoZW4gdXNlIHRoYXQgaW5mb3JtYXRpb24gYW5kIGRvbid0IHNlYXJjaCBzc2xkaXJzCi0gICAgICAgICAgICBBQ19QQVRIX1BST0coW1BLR19DT05GSUddLCBbcGtnLWNvbmZpZ10pCisgICAgICAgICAgICBBQ19DSEVDS19UT09MKFtQS0dfQ09ORklHXSwgW3BrZy1jb25maWddKQogICAgICAgICAgICAgaWYgdGVzdCB4IiRQS0dfQ09ORklHIiAhPSB4IiI7IHRoZW4KICAgICAgICAgICAgICAgICBPUEVOU1NMX0xERkxBR1M9YCRQS0dfQ09ORklHIG9wZW5zc2wgLS1saWJzLW9ubHktTCAyPi9kZXYvbnVsbGAKICAgICAgICAgICAgICAgICBpZiB0ZXN0ICQ/ID0gMDsgdGhlbgpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9jb21wYXJlX3ZlcnNpb24ubTQgYi9hY2xvY2FsL2F4X2NvbXBhcmVfdmVyc2lvbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzhlMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9jb21wYXJlX3ZlcnNpb24ubTQKQEAgLTAsMCArMSwxNzcgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jb21wYXJlX3ZlcnNpb24uaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DT01QQVJFX1ZFUlNJT04oVkVSU0lPTl9BLCBPUCwgVkVSU0lPTl9CLCBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBUaGlzIG1hY3JvIGNvbXBhcmVzIHR3byB2ZXJzaW9uIHN0cmluZ3MuIER1ZSB0byB0aGUgdmFyaW91cyBudW1iZXIgb2YKKyMgICBtaW5vci12ZXJzaW9uIG51bWJlcnMgdGhhdCBjYW4gZXhpc3QsIGFuZCB0aGUgZmFjdCB0aGF0IHN0cmluZworIyAgIGNvbXBhcmlzb25zIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIG51bWVyaWMgY29tcGFyaXNvbnMsIHRoaXMgaXMgbm90CisjICAgbmVjZXNzYXJpbHkgdHJpdmlhbCB0byBkbyBpbiBhIGF1dG9jb25mIHNjcmlwdC4gVGhpcyBtYWNybyBtYWtlcyBkb2luZworIyAgIHRoZXNlIGNvbXBhcmlzb25zIGVhc3kuCisjCisjICAgVGhlIHNpeCBiYXNpYyBjb21wYXJpc29ucyBhcmUgYXZhaWxhYmxlLCBhcyB3ZWxsIGFzIGNoZWNraW5nIGVxdWFsaXR5CisjICAgbGltaXRlZCB0byBhIGNlcnRhaW4gbnVtYmVyIG9mIG1pbm9yLXZlcnNpb24gbGV2ZWxzLgorIworIyAgIFRoZSBvcGVyYXRvciBPUCBkZXRlcm1pbmVzIHdoYXQgdHlwZSBvZiBjb21wYXJpc29uIHRvIGRvLCBhbmQgY2FuIGJlIG9uZQorIyAgIG9mOgorIworIyAgICBlcSAgLSBlcXVhbCAodGVzdCBBID09IEIpCisjICAgIG5lICAtIG5vdCBlcXVhbCAodGVzdCBBICE9IEIpCisjICAgIGxlICAtIGxlc3MgdGhhbiBvciBlcXVhbCAodGVzdCBBIDw9IEIpCisjICAgIGdlICAtIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCAodGVzdCBBID49IEIpCisjICAgIGx0ICAtIGxlc3MgdGhhbiAodGVzdCBBIDwgQikKKyMgICAgZ3QgIC0gZ3JlYXRlciB0aGFuICh0ZXN0IEEgPiBCKQorIworIyAgIEFkZGl0aW9uYWxseSwgdGhlIGVxIGFuZCBuZSBvcGVyYXRvciBjYW4gaGF2ZSBhIG51bWJlciBhZnRlciBpdCB0byBsaW1pdAorIyAgIHRoZSB0ZXN0IHRvIHRoYXQgbnVtYmVyIG9mIG1pbm9yIHZlcnNpb25zLgorIworIyAgICBlcTAgLSBlcXVhbCB1cCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24KKyMgICAgbmUwIC0gbm90IGVxdWFsIHVwIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXIgdmVyc2lvbgorIyAgICBlcU4gLSBlcXVhbCB1cCB0byBOIHN1Yi12ZXJzaW9uIGxldmVscworIyAgICBuZU4gLSBub3QgZXF1YWwgdXAgdG8gTiBzdWItdmVyc2lvbiBsZXZlbHMKKyMKKyMgICBXaGVuIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSwgc2hlbGwgY29tbWFuZHMgQUNUSU9OLUlGLVRSVUUgYXJlIHJ1biwKKyMgICBvdGhlcndpc2Ugc2hlbGwgY29tbWFuZHMgQUNUSU9OLUlGLUZBTFNFIGFyZSBydW4uIFRoZSBlbnZpcm9ubWVudAorIyAgIHZhcmlhYmxlICdheF9jb21wYXJlX3ZlcnNpb24nIGlzIGFsd2F5cyBzZXQgdG8gZWl0aGVyICd0cnVlJyBvciAnZmFsc2UnCisjICAgYXMgd2VsbC4KKyMKKyMgICBFeGFtcGxlczoKKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbbHRdLFszLjE1LjhdKQorIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1XSxbbHRdLFszLjE1LjhdKQorIworIyAgIHdvdWxkIGJvdGggYmUgdHJ1ZS4KKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbZXFdLFszLjE1LjhdKQorIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1XSxbZ3RdLFszLjE1LjhdKQorIworIyAgIHdvdWxkIGJvdGggYmUgZmFsc2UuCisjCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2VxMl0sWzMuMTUuOF0pCisjCisjICAgd291bGQgYmUgdHJ1ZSBiZWNhdXNlIGl0IGlzIG9ubHkgY29tcGFyaW5nIHR3byBtaW5vciB2ZXJzaW9ucy4KKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbZXEwXSxbMy4xNV0pCisjCisjICAgd291bGQgYmUgdHJ1ZSBiZWNhdXNlIGl0IGlzIG9ubHkgY29tcGFyaW5nIHRoZSBsZXNzZXIgbnVtYmVyIG9mIG1pbm9yCisjICAgdmVyc2lvbnMgb2YgdGhlIHR3byB2YWx1ZXMuCisjCisjICAgTm90ZTogVGhlIGNoYXJhY3RlcnMgdGhhdCBzZXBhcmF0ZSB0aGUgdmVyc2lvbiBudW1iZXJzIGRvIG5vdCBtYXR0ZXIuIEFuCisjICAgZW1wdHkgc3RyaW5nIGlzIHRoZSBzYW1lIGFzIHZlcnNpb24gMC4gT1AgaXMgZXZhbHVhdGVkIGJ5IGF1dG9jb25mLCBub3QKKyMgICBjb25maWd1cmUsIHNvIG11c3QgYmUgYSBzdHJpbmcsIG5vdCBhIHZhcmlhYmxlLgorIworIyAgIFRoZSBhdXRob3Igd291bGQgbGlrZSB0byBhY2tub3dsZWRnZSBHdWlkbyBEcmFoZWltIHdob3NlIGFkdmljZSBhYm91dAorIyAgIHRoZSBtNF9jYXNlIGFuZCBtNF9pZnZhbG4gZnVuY3Rpb25zIG1ha2UgdGhpcyBtYWNybyBvbmx5IGluY2x1ZGUgdGhlCisjICAgcG9ydGlvbnMgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gdGhlIHNwZWNpZmljIGNvbXBhcmlzb24gc3BlY2lmaWVkIGJ5IHRoZQorIyAgIE9QIGFyZ3VtZW50IGluIHRoZSBmaW5hbCBjb25maWd1cmUgc2NyaXB0LgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IFRpbSBUb29sYW4gPHRvb2xhbkBlbGUudXJpLmVkdT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMTIKKworZG5sICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0FDX0RFRlVOKFtBWF9DT01QQVJFX1ZFUlNJT05dLCBbCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSkKKworICAjIFVzZWQgdG8gaW5kaWNhdGUgdHJ1ZSBvciBmYWxzZSBjb25kaXRpb24KKyAgYXhfY29tcGFyZV92ZXJzaW9uPWZhbHNlCisKKyAgIyBDb252ZXJ0IHRoZSB0d28gdmVyc2lvbiBzdHJpbmdzIHRvIGJlIGNvbXBhcmVkIGludG8gYSBmb3JtYXQgdGhhdAorICAjIGFsbG93cyBhIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvbi4gIFRoZSBlbmQgcmVzdWx0IGlzIHRoYXQgYSB2ZXJzaW9uCisgICMgc3RyaW5nIG9mIHRoZSBmb3JtIDEuMTIuNS1yNjE3IHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBmb3JtCisgICMgMDAwMTAwMTIwMDA1MDYxNy4gIEluIG90aGVyIHdvcmRzLCBlYWNoIG51bWJlciBpcyB6ZXJvIHBhZGRlZCB0byBmb3VyCisgICMgZGlnaXRzLCBhbmQgbm9uIGRpZ2l0cyBhcmUgcmVtb3ZlZC4KKyAgQVNfVkFSX1BVU0hERUYoW0FdLFtheF9jb21wYXJlX3ZlcnNpb25fQV0pCisgIEE9YGVjaG8gIiQxIiB8IHNlZCAtZSAncy9cKFtbMC05XV0qXCkvWlwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9bW14wLTldXS8vZydgCisKKyAgQVNfVkFSX1BVU0hERUYoW0JdLFtheF9jb21wYXJlX3ZlcnNpb25fQl0pCisgIEI9YGVjaG8gIiQzIiB8IHNlZCAtZSAncy9cKFtbMC05XV0qXCkvWlwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9bW14wLTldXS8vZydgCisKKyAgZG5sICMgSW4gdGhlIGNhc2Ugb2YgbGUsIGdlLCBsdCwgYW5kIGd0LCB0aGUgc3RyaW5ncyBhcmUgc29ydGVkIGFzIG5lY2Vzc2FyeQorICBkbmwgIyB0aGVuIHRoZSBmaXJzdCBsaW5lIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS4KKyAgZG5sICMgVGhlIHNlZCByaWdodCBhZnRlciB0aGUgZWNobyBpcyB0byByZW1vdmUgYW55IGluZGVudGVkIHdoaXRlIHNwYWNlLgorICBtNF9jYXNlKG00X3RvbG93ZXIoJDIpLAorICBbbHRdLFsKKyAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IC1yIHwgc2VkICJzL3gke0F9L2ZhbHNlLztzL3gke0J9L3RydWUvOzFxImAKKyAgXSwKKyAgW2d0XSxbCisgICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKK3gkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCB8IHNlZCAicy94JHtBfS9mYWxzZS87cy94JHtCfS90cnVlLzsxcSJgCisgIF0sCisgIFtsZV0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgfCBzZWQgInMveCR7QX0vdHJ1ZS87cy94JHtCfS9mYWxzZS87MXEiYAorICBdLAorICBbZ2VdLFsKKyAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IC1yIHwgc2VkICJzL3gke0F9L3RydWUvO3MveCR7Qn0vZmFsc2UvOzFxImAKKyAgXSxbCisgICAgZG5sIFNwbGl0IHRoZSBvcGVyYXRvciBmcm9tIHRoZSBzdWJ2ZXJzaW9uIGNvdW50IGlmIHByZXNlbnQuCisgICAgbTRfYm1hdGNoKG00X3N1YnN0cigkMiwyKSwKKyAgICBbMF0sWworICAgICAgIyBBIGNvdW50IG9mIHplcm8gbWVhbnMgdXNlIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXIgdmVyc2lvbi4KKyAgICAgICMgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBBIGFuZCBCLgorICAgICAgYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9BPWBlY2hvICIkQSIgfCAkQVdLICd7cHJpbnQobGVuZ3RoKX0nYAorICAgICAgYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9CPWBlY2hvICIkQiIgfCAkQVdLICd7cHJpbnQobGVuZ3RoKX0nYAorCisgICAgICAjIFNldCBBIHRvIG5vIG1vcmUgdGhhbiBCJ3MgbGVuZ3RoIGFuZCBCIHRvIG5vIG1vcmUgdGhhbiBBJ3MgbGVuZ3RoLgorICAgICAgQT1gZWNobyAiJEEiIHwgc2VkICJzL1woLlx7JGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQlx9XCkuKi9cMS8iYAorICAgICAgQj1gZWNobyAiJEIiIHwgc2VkICJzL1woLlx7JGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQVx9XCkuKi9cMS8iYAorICAgIF0sCisgICAgW1swLTldK10sWworICAgICAgIyBBIGNvdW50IGdyZWF0ZXIgdGhhbiB6ZXJvIG1lYW5zIHVzZSBvbmx5IHRoYXQgbWFueSBzdWJ2ZXJzaW9ucworICAgICAgQT1gZWNobyAiJEEiIHwgc2VkICJzL1woXChbWzAtOV1dXHs0XH1cKVx7bTRfc3Vic3RyKCQyLDIpXH1cKS4qL1wxLyJgCisgICAgICBCPWBlY2hvICIkQiIgfCBzZWQgInMvXChcKFtbMC05XV1cezRcfVwpXHttNF9zdWJzdHIoJDIsMilcfVwpLiovXDEvImAKKyAgICBdLAorICAgIFsuK10sWworICAgICAgQUNfV0FSTklORygKKyAgICAgICAgW2lsbGVnYWwgT1AgbnVtZXJpYyBwYXJhbWV0ZXI6ICQyXSkKKyAgICBdLFtdKQorCisgICAgIyBQYWQgemVyb3MgYXQgZW5kIG9mIG51bWJlcnMgdG8gbWFrZSBzYW1lIGxlbmd0aC4KKyAgICBheF9jb21wYXJlX3ZlcnNpb25fdG1wX0E9IiRBYGVjaG8gJEIgfCBzZWQgJ3MvLi8wL2cnYCIKKyAgICBCPSIkQmBlY2hvICRBIHwgc2VkICdzLy4vMC9nJ2AiCisgICAgQT0iJGF4X2NvbXBhcmVfdmVyc2lvbl90bXBfQSIKKworICAgICMgQ2hlY2sgZm9yIGVxdWFsaXR5IG9yIGluZXF1YWxpdHkgYXMgbmVjZXNzYXJ5LgorICAgIG00X2Nhc2UobTRfdG9sb3dlcihtNF9zdWJzdHIoJDIsMCwyKSksCisgICAgW2VxXSxbCisgICAgICB0ZXN0ICJ4JEEiID0gIngkQiIgJiYgYXhfY29tcGFyZV92ZXJzaW9uPXRydWUKKyAgICBdLAorICAgIFtuZV0sWworICAgICAgdGVzdCAieCRBIiAhPSAieCRCIiAmJiBheF9jb21wYXJlX3ZlcnNpb249dHJ1ZQorICAgIF0sWworICAgICAgQUNfV0FSTklORyhbaWxsZWdhbCBPUCBwYXJhbWV0ZXI6ICQyXSkKKyAgICBdKQorICBdKQorCisgIEFTX1ZBUl9QT1BERUYoW0FdKWRubAorICBBU19WQVJfUE9QREVGKFtCXSlkbmwKKworICBkbmwgIyBFeGVjdXRlIEFDVElPTi1JRi1UUlVFIC8gQUNUSU9OLUlGLUZBTFNFLgorICBpZiB0ZXN0ICIkYXhfY29tcGFyZV92ZXJzaW9uIiA9ICJ0cnVlIiA7IHRoZW4KKyAgICBtNF9pZnZhbG4oWyQ0XSxbJDRdLFs6XSlkbmwKKyAgICBtNF9pZnZhbG4oWyQ1XSxbZWxzZSAkNV0pZG5sCisgIGZpCitdKSBkbmwgQVhfQ09NUEFSRV9WRVJTSU9OCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eC5tNCBiL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOWVhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eC5tNApAQCAtMCwwICsxLDk0OCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jeHhfY29tcGlsZV9zdGRjeHguaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DWFhfQ09NUElMRV9TVERDWFgoVkVSU0lPTiwgW2V4dHxub2V4dF0sIFttYW5kYXRvcnl8b3B0aW9uYWxdKQorIworIyBERVNDUklQVElPTgorIworIyAgIENoZWNrIGZvciBiYXNlbGluZSBsYW5ndWFnZSBjb3ZlcmFnZSBpbiB0aGUgY29tcGlsZXIgZm9yIHRoZSBzcGVjaWZpZWQKKyMgICB2ZXJzaW9uIG9mIHRoZSBDKysgc3RhbmRhcmQuICBJZiBuZWNlc3NhcnksIGFkZCBzd2l0Y2hlcyB0byBDWFggYW5kCisjICAgQ1hYQ1BQIHRvIGVuYWJsZSBzdXBwb3J0LiAgVkVSU0lPTiBtYXkgYmUgJzExJyAoZm9yIHRoZSBDKysxMSBzdGFuZGFyZCkKKyMgICBvciAnMTQnIChmb3IgdGhlIEMrKzE0IHN0YW5kYXJkKS4KKyMKKyMgICBUaGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQsIGluZGljYXRlcyB3aGV0aGVyIHlvdSBpbnNpc3Qgb24gYW4KKyMgICBleHRlbmRlZCBtb2RlIChlLmcuIC1zdGQ9Z251KysxMSkgb3IgYSBzdHJpY3QgY29uZm9ybWFuY2UgbW9kZSAoZS5nLgorIyAgIC1zdGQ9YysrMTEpLiAgSWYgbmVpdGhlciBpcyBzcGVjaWZpZWQsIHlvdSBnZXQgd2hhdGV2ZXIgd29ya3MsIHdpdGgKKyMgICBwcmVmZXJlbmNlIGZvciBhbiBleHRlbmRlZCBtb2RlLgorIworIyAgIFRoZSB0aGlyZCBhcmd1bWVudCwgaWYgc3BlY2lmaWVkICdtYW5kYXRvcnknIG9yIGlmIGxlZnQgdW5zcGVjaWZpZWQsCisjICAgaW5kaWNhdGVzIHRoYXQgYmFzZWxpbmUgc3VwcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBDKysgc3RhbmRhcmQgaXMKKyMgICByZXF1aXJlZCBhbmQgdGhhdCB0aGUgbWFjcm8gc2hvdWxkIGVycm9yIG91dCBpZiBubyBtb2RlIHdpdGggdGhhdAorIyAgIHN1cHBvcnQgaXMgZm91bmQuICBJZiBzcGVjaWZpZWQgJ29wdGlvbmFsJywgdGhlbiBjb25maWd1cmF0aW9uIHByb2NlZWRzCisjICAgcmVnYXJkbGVzcywgYWZ0ZXIgZGVmaW5pbmcgSEFWRV9DWFgke1ZFUlNJT059IGlmIGFuZCBvbmx5IGlmIGEKKyMgICBzdXBwb3J0aW5nIG1vZGUgaXMgZm91bmQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDEyIFphY2sgV2VpbmJlcmcgPHphY2t3QHBhbml4LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTMgUm95IFN0b2duZXIgPHJveXN0Z25yQGljZXMudXRleGFzLmVkdT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTUgR29vZ2xlIEluYy47IGNvbnRyaWJ1dGVkIGJ5IEFsZXhleSBTb2tvbG92IDxzb2tvbG92QGdvb2dsZS5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDE1IFBhdWwgTm9ybWFuIDxwZW5vcm1hbkBtYWMuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxNSBNb3JpdHogS2xhbW1sZXIgPG1vcml0ekBrbGFtbWxlci5ldT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggS3J6ZXNpbWlyIE5vd2FrIDxxZGxhY3pAZ21haWwuY29tPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMTAKKworZG5sICBUaGlzIG1hY3JvIGlzIGJhc2VkIG9uIHRoZSBjb2RlIGZyb20gdGhlIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMSBtYWNybworZG5sICAoc2VyaWFsIHZlcnNpb24gbnVtYmVyIDEzKS4KKworQUNfREVGVU4oW0FYX0NYWF9DT01QSUxFX1NURENYWF0sIFtkbmwKKyAgbTRfaWYoWyQxXSwgWzExXSwgW2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlcz0iMTEgMHgiXSwKKyAgICAgICAgWyQxXSwgWzE0XSwgW2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlcz0iMTQgMXkiXSwKKyAgICAgICAgWyQxXSwgWzE3XSwgW2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlcz0iMTcgMXoiXSwKKyAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIGZpcnN0IGFyZ3VtZW50IGAkMScgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSldKWRubAorICBtNF9pZihbJDJdLCBbXSwgW10sCisgICAgICAgIFskMl0sIFtleHRdLCBbXSwKKyAgICAgICAgWyQyXSwgW25vZXh0XSwgW10sCisgICAgICAgIFttNF9mYXRhbChbaW52YWxpZCBzZWNvbmQgYXJndW1lbnQgYCQyJyB0byBBWF9DWFhfQ09NUElMRV9TVERDWFhdKV0pZG5sCisgIG00X2lmKFskM10sIFtdLCBbYXhfY3h4X2NvbXBpbGVfY3h4JDFfcmVxdWlyZWQ9dHJ1ZV0sCisgICAgICAgIFskM10sIFttYW5kYXRvcnldLCBbYXhfY3h4X2NvbXBpbGVfY3h4JDFfcmVxdWlyZWQ9dHJ1ZV0sCisgICAgICAgIFskM10sIFtvcHRpb25hbF0sIFtheF9jeHhfY29tcGlsZV9jeHgkMV9yZXF1aXJlZD1mYWxzZV0sCisgICAgICAgIFttNF9mYXRhbChbaW52YWxpZCB0aGlyZCBhcmd1bWVudCBgJDMnIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF0pXSkKKyAgQUNfTEFOR19QVVNIKFtDKytdKWRubAorICBhY19zdWNjZXNzPW5vCisKKyAgbTRfaWYoWyQyXSwgW25vZXh0XSwgW10sIFtkbmwKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBmb3IgYWx0ZXJuYXRpdmUgaW4gJHtheF9jeHhfY29tcGlsZV9hbHRlcm5hdGl2ZXN9OyBkbworICAgICAgc3dpdGNoPSItc3RkPWdudSsrJHthbHRlcm5hdGl2ZX0iCisgICAgICBjYWNoZXZhcj1BU19UUl9TSChbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4JDFfJHN3aXRjaF0pCisgICAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrJDEgZmVhdHVyZXMgd2l0aCAkc3dpdGNoLAorICAgICAgICAgICAgICAgICAgICAgJGNhY2hldmFyLAorICAgICAgICBbYWNfc2F2ZV9DWFg9IiRDWFgiCisgICAgICAgICBDWFg9IiRDWFggJHN3aXRjaCIKKyAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8kMV0pXSwKKyAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9eWVzXSwKKyAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9bm9dKQorICAgICAgICAgQ1hYPSIkYWNfc2F2ZV9DWFgiXSkKKyAgICAgIGlmIGV2YWwgdGVzdCB4XCQkY2FjaGV2YXIgPSB4eWVzOyB0aGVuCisgICAgICAgIENYWD0iJENYWCAkc3dpdGNoIgorICAgICAgICBpZiB0ZXN0IC1uICIkQ1hYQ1BQIiA7IHRoZW4KKyAgICAgICAgICBDWFhDUFA9IiRDWFhDUFAgJHN3aXRjaCIKKyAgICAgICAgZmkKKyAgICAgICAgYWNfc3VjY2Vzcz15ZXMKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaV0pCisKKyAgbTRfaWYoWyQyXSwgW2V4dF0sIFtdLCBbZG5sCisgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgZG5sIEhQJ3MgYUNDIG5lZWRzICtzdGQ9YysrMTEgYWNjb3JkaW5nIHRvOgorICAgIGRubCBodHRwOi8vaDIxMDA3Lnd3dzIuaHAuY29tL3BvcnRhbC9kb3dubG9hZC9maWxlcy91bnByb3QvYUN4eC9QREZfUmVsZWFzZV9Ob3Rlcy83NjkxNDktMDAxLnBkZgorICAgIGRubCBDcmF5J3MgY3JheUNDIG5lZWRzICItaCBzdGQ9YysrMTEiCisgICAgZm9yIGFsdGVybmF0aXZlIGluICR7YXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzfTsgZG8KKyAgICAgIGZvciBzd2l0Y2ggaW4gLXN0ZD1jKyske2FsdGVybmF0aXZlfSArc3RkPWMrKyR7YWx0ZXJuYXRpdmV9ICItaCBzdGQ9YysrJHthbHRlcm5hdGl2ZX0iOyBkbworICAgICAgICBjYWNoZXZhcj1BU19UUl9TSChbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4JDFfJHN3aXRjaF0pCisgICAgICAgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKyskMSBmZWF0dXJlcyB3aXRoICRzd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICRjYWNoZXZhciwKKyAgICAgICAgICBbYWNfc2F2ZV9DWFg9IiRDWFgiCisgICAgICAgICAgIENYWD0iJENYWCAkc3dpdGNoIgorICAgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfJDFdKV0sCisgICAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9eWVzXSwKKyAgICAgICAgICAgIFtldmFsICRjYWNoZXZhcj1ub10pCisgICAgICAgICAgIENYWD0iJGFjX3NhdmVfQ1hYIl0pCisgICAgICAgIGlmIGV2YWwgdGVzdCB4XCQkY2FjaGV2YXIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgQ1hYPSIkQ1hYICRzd2l0Y2giCisgICAgICAgICAgaWYgdGVzdCAtbiAiJENYWENQUCIgOyB0aGVuCisgICAgICAgICAgICBDWFhDUFA9IiRDWFhDUFAgJHN3aXRjaCIKKyAgICAgICAgICBmaQorICAgICAgICAgIGFjX3N1Y2Nlc3M9eWVzCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICAgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geHllczsgdGhlbgorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpXSkKKyAgQUNfTEFOR19QT1AoW0MrK10pCisgIGlmIHRlc3QgeCRheF9jeHhfY29tcGlsZV9jeHgkMV9yZXF1aXJlZCA9IHh0cnVlOyB0aGVuCisgICAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICAgIEFDX01TR19FUlJPUihbKioqIEEgY29tcGlsZXIgd2l0aCBzdXBwb3J0IGZvciBDKyskMSBsYW5ndWFnZSBmZWF0dXJlcyBpcyByZXF1aXJlZC5dKQorICAgIGZpCisgIGZpCisgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgSEFWRV9DWFgkMT0wCisgICAgQUNfTVNHX05PVElDRShbTm8gY29tcGlsZXIgd2l0aCBDKyskMSBzdXBwb3J0IHdhcyBmb3VuZF0pCisgIGVsc2UKKyAgICBIQVZFX0NYWCQxPTEKKyAgICBBQ19ERUZJTkUoSEFWRV9DWFgkMSwxLAorICAgICAgICAgICAgICBbZGVmaW5lIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBiYXNpYyBDKyskMSBzeW50YXhdKQorICBmaQorICBBQ19TVUJTVChIQVZFX0NYWCQxKQorXSkKKworCitkbmwgIFRlc3QgYm9keSBmb3IgY2hlY2tpbmcgQysrMTEgc3VwcG9ydAorCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfMTFdLAorICBfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xMQorKQorCisKK2RubCAgVGVzdCBib2R5IGZvciBjaGVja2luZyBDKysxNCBzdXBwb3J0CisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8xNF0sCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzExCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE0CispCisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8xN10sCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzExCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE0CisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE3CispCisKK2RubCAgVGVzdHMgZm9yIG5ldyBmZWF0dXJlcyBpbiBDKysxMQorCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzExXSwgW1sKKworLy8gSWYgdGhlIGNvbXBpbGVyIGFkbWl0cyB0aGF0IGl0IGlzIG5vdCByZWFkeSBmb3IgQysrMTEsIHdoeSB0b3J0dXJlIGl0PworLy8gSG9wZWZ1bGx5LCB0aGlzIHdpbGwgc3BlZWQgdXAgdGhlIHRlc3QuCisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKyBjb21waWxlciIKKworI2VsaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysxMSBjb21waWxlciIKKworI2Vsc2UKKworbmFtZXNwYWNlIGN4eDExCit7CisKKyAgbmFtZXNwYWNlIHRlc3Rfc3RhdGljX2Fzc2VydAorICB7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgY2hlY2sKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihpbnQpIDw9IHNpemVvZihUKSwgIm5vdCBiaWcgZW5vdWdoIik7CisgICAgfTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZmluYWxfb3ZlcnJpZGUKKyAgeworCisgICAgc3RydWN0IEJhc2UKKyAgICB7CisgICAgICB2aXJ0dWFsIHZvaWQgZigpIHt9CisgICAgfTsKKworICAgIHN0cnVjdCBEZXJpdmVkIDogcHVibGljIEJhc2UKKyAgICB7CisgICAgICB2aXJ0dWFsIHZvaWQgZigpIG92ZXJyaWRlIHt9CisgICAgfTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZG91YmxlX3JpZ2h0X2FuZ2xlX2JyYWNrZXRzCisgIHsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGNoZWNrIHt9OworCisgICAgdHlwZWRlZiBjaGVjazx2b2lkPiBzaW5nbGVfdHlwZTsKKyAgICB0eXBlZGVmIGNoZWNrPGNoZWNrPHZvaWQ+PiBkb3VibGVfdHlwZTsKKyAgICB0eXBlZGVmIGNoZWNrPGNoZWNrPGNoZWNrPHZvaWQ+Pj4gdHJpcGxlX3R5cGU7CisgICAgdHlwZWRlZiBjaGVjazxjaGVjazxjaGVjazxjaGVjazx2b2lkPj4+PiBxdWFkcnVwbGVfdHlwZTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZGVjbHR5cGUKKyAgeworCisgICAgaW50CisgICAgZigpCisgICAgeworICAgICAgaW50IGEgPSAxOworICAgICAgZGVjbHR5cGUoYSkgYiA9IDI7CisgICAgICByZXR1cm4gYSArIGI7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF90eXBlX2RlZHVjdGlvbgorICB7CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiA+CisgICAgc3RydWN0IGlzX3NhbWUKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgorICAgIHN0cnVjdCBpc19zYW1lPFQsIFQ+CisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiA+CisgICAgYXV0bworICAgIGFkZChUMSBhMSwgVDIgYTIpIC0+IGRlY2x0eXBlKGExICsgYTIpCisgICAgeworICAgICAgcmV0dXJuIGExICsgYTI7CisgICAgfQorCisgICAgaW50CisgICAgdGVzdChjb25zdCBpbnQgYywgdm9sYXRpbGUgaW50IHYpCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoMCk+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShjKT46OnZhbHVlID09IGZhbHNlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZSh2KT46OnZhbHVlID09IGZhbHNlLCAiIik7CisgICAgICBhdXRvIGFjID0gYzsKKyAgICAgIGF1dG8gYXYgPSB2OworICAgICAgYXV0byBzdW1pID0gYWMgKyBhdiArICd4JzsKKyAgICAgIGF1dG8gc3VtZiA9IGFjICsgYXYgKyAxLjA7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShhYyk+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShhdik+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShzdW1pKT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKHN1bWYpPjo6dmFsdWUgPT0gZmFsc2UsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGFkZChjLCB2KSk+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICByZXR1cm4gKHN1bWYgPiAwLjApID8gc3VtaSA6IGFkZChjLCB2KTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X25vZXhjZXB0CisgIHsKKworICAgIGludCBmKCkgeyByZXR1cm4gMDsgfQorICAgIGludCBnKCkgbm9leGNlcHQgeyByZXR1cm4gMDsgfQorCisgICAgc3RhdGljX2Fzc2VydChub2V4Y2VwdChmKCkpID09IGZhbHNlLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChub2V4Y2VwdChnKCkpID09IHRydWUsICIiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfY29uc3RleHByCisgIHsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgQ2hhclQgPgorICAgIHVuc2lnbmVkIGxvbmcgY29uc3RleHByCisgICAgc3RybGVuX2Nfcihjb25zdCBDaGFyVCAqY29uc3QgcywgY29uc3QgdW5zaWduZWQgbG9uZyBhY2MpIG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuICpzID8gc3RybGVuX2NfcihzICsgMSwgYWNjICsgMSkgOiBhY2M7CisgICAgfQorCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBDaGFyVCA+CisgICAgdW5zaWduZWQgbG9uZyBjb25zdGV4cHIKKyAgICBzdHJsZW5fYyhjb25zdCBDaGFyVCAqY29uc3Qgcykgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gc3RybGVuX2NfcihzLCAwVUwpOworICAgIH0KKworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoIiIpID09IDBVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoIjEiKSA9PSAxVUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJleGFtcGxlIikgPT0gN1VMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiYW5vdGhlclwwZXhhbXBsZSIpID09IDdVTCwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9ydmFsdWVfcmVmZXJlbmNlcworICB7CisKKyAgICB0ZW1wbGF0ZSA8IGludCBOID4KKyAgICBzdHJ1Y3QgYW5zd2VyCisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgdmFsdWUgPSBOOworICAgIH07CisKKyAgICBhbnN3ZXI8MT4gZihpbnQmKSAgICAgICB7IHJldHVybiBhbnN3ZXI8MT4oKTsgfQorICAgIGFuc3dlcjwyPiBmKGNvbnN0IGludCYpIHsgcmV0dXJuIGFuc3dlcjwyPigpOyB9CisgICAgYW5zd2VyPDM+IGYoaW50JiYpICAgICAgeyByZXR1cm4gYW5zd2VyPDM+KCk7IH0KKworICAgIHZvaWQKKyAgICB0ZXN0KCkKKyAgICB7CisgICAgICBpbnQgaSA9IDA7CisgICAgICBjb25zdCBpbnQgYyA9IDA7CisgICAgICBzdGF0aWNfYXNzZXJ0KGRlY2x0eXBlKGYoaSkpOjp2YWx1ZSA9PSAxLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGRlY2x0eXBlKGYoYykpOjp2YWx1ZSA9PSAyLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGRlY2x0eXBlKGYoMCkpOjp2YWx1ZSA9PSAzLCAiIik7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF91bmlmb3JtX2luaXRpYWxpemF0aW9uCisgIHsKKworICAgIHN0cnVjdCB0ZXN0CisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGludCB6ZXJvIHt9OworICAgICAgc3RhdGljIGNvbnN0IGludCBvbmUgezF9OworICAgIH07CisKKyAgICBzdGF0aWNfYXNzZXJ0KHRlc3Q6Onplcm8gPT0gMCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQodGVzdDo6b25lID09IDEsICIiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfbGFtYmRhcworICB7CisKKyAgICB2b2lkCisgICAgdGVzdDEoKQorICAgIHsKKyAgICAgIGF1dG8gbGFtYmRhMSA9IFtdKCl7fTsKKyAgICAgIGF1dG8gbGFtYmRhMiA9IGxhbWJkYTE7CisgICAgICBsYW1iZGExKCk7CisgICAgICBsYW1iZGEyKCk7CisgICAgfQorCisgICAgaW50CisgICAgdGVzdDIoKQorICAgIHsKKyAgICAgIGF1dG8gYSA9IFtdKGludCBpLCBpbnQgail7IHJldHVybiBpICsgajsgfSgxLCAyKTsKKyAgICAgIGF1dG8gYiA9IFtdKCkgLT4gaW50IHsgcmV0dXJuICcwJzsgfSgpOworICAgICAgYXV0byBjID0gWz1dKCl7IHJldHVybiBhICsgYjsgfSgpOworICAgICAgYXV0byBkID0gWyZdKCl7IHJldHVybiBjOyB9KCk7CisgICAgICBhdXRvIGUgPSBbYSwgJmJdKGludCB4KSBtdXRhYmxlIHsKKyAgICAgICAgY29uc3QgYXV0byBpZGVudGl0eSA9IFtdKGludCB5KXsgcmV0dXJuIHk7IH07CisgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IGE7ICsraSkKKyAgICAgICAgICBhICs9IGItLTsKKyAgICAgICAgcmV0dXJuIHggKyBpZGVudGl0eShhICsgYik7CisgICAgICB9KDApOworICAgICAgcmV0dXJuIGEgKyBiICsgYyArIGQgKyBlOworICAgIH0KKworICAgIGludAorICAgIHRlc3QzKCkKKyAgICB7CisgICAgICBjb25zdCBhdXRvIG51bGxhcnkgPSBbXSgpeyByZXR1cm4gMDsgfTsKKyAgICAgIGNvbnN0IGF1dG8gdW5hcnkgPSBbXShpbnQgeCl7IHJldHVybiB4OyB9OworICAgICAgdXNpbmcgbnVsbGFyeV90ID0gZGVjbHR5cGUobnVsbGFyeSk7CisgICAgICB1c2luZyB1bmFyeV90ID0gZGVjbHR5cGUodW5hcnkpOworICAgICAgY29uc3QgYXV0byBoaWdoZXIxc3QgPSBbXShudWxsYXJ5X3QgZil7IHJldHVybiBmKCk7IH07CisgICAgICBjb25zdCBhdXRvIGhpZ2hlcjJuZCA9IFt1bmFyeV0obnVsbGFyeV90IGYxKXsKKyAgICAgICAgcmV0dXJuIFt1bmFyeSwgZjFdKHVuYXJ5X3QgZjIpeyByZXR1cm4gZjIodW5hcnkoZjEoKSkpOyB9OworICAgICAgfTsKKyAgICAgIHJldHVybiBoaWdoZXIxc3QobnVsbGFyeSkgKyBoaWdoZXIybmQobnVsbGFyeSkodW5hcnkpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfdmFyaWFkaWNfdGVtcGxhdGVzCisgIHsKKworICAgIHRlbXBsYXRlIDxpbnQuLi4+CisgICAgc3RydWN0IHN1bTsKKworICAgIHRlbXBsYXRlIDxpbnQgTjAsIGludC4uLiBOMXRvTj4KKyAgICBzdHJ1Y3Qgc3VtPE4wLCBOMXRvTi4uLj4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPSBOMCArIHN1bTxOMXRvTi4uLj46OnZhbHVlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8PgorICAgIHN0cnVjdCBzdW08PgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9IDA7CisgICAgfTsKKworICAgIHN0YXRpY19hc3NlcnQoc3VtPD46OnZhbHVlID09IDAsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTwxPjo6dmFsdWUgPT0gMSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDIzPjo6dmFsdWUgPT0gMjMsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTwxLCAyPjo6dmFsdWUgPT0gMywgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDUsIDUsIDExPjo6dmFsdWUgPT0gMjEsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTwyLCAzLCA1LCA3LCAxMSwgMTM+Ojp2YWx1ZSA9PSA0MSwgIiIpOworCisgIH0KKworICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEzNzI4MTg0L3RlbXBsYXRlLWFsaWFzZXMtYW5kLXNmaW5hZQorICAvLyBDbGFuZyAzLjEgZmFpbHMgd2l0aCBoZWFkZXJzIG9mIGxpYnN0ZCsrIDQuOC4zIHdoZW4gdXNpbmcgc3RkOjpmdW5jdGlvbgorICAvLyBiZWNhdXNlIG9mIHRoaXMuCisgIG5hbWVzcGFjZSB0ZXN0X3RlbXBsYXRlX2FsaWFzX3NmaW5hZQorICB7CisKKyAgICBzdHJ1Y3QgZm9vIHt9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB1c2luZyBtZW1iZXIgPSB0eXBlbmFtZSBUOjptZW1iZXJfdHlwZTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBmdW5jKC4uLikge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBmdW5jKG1lbWJlcjxUPiopIHt9CisKKyAgICB2b2lkIHRlc3QoKTsKKworICAgIHZvaWQgdGVzdCgpIHsgZnVuYzxmb28+KDApOyB9CisKKyAgfQorCit9ICAvLyBuYW1lc3BhY2UgY3h4MTEKKworI2VuZGlmICAvLyBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKK11dKQorCisKK2RubCAgVGVzdHMgZm9yIG5ldyBmZWF0dXJlcyBpbiBDKysxNAorCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE0XSwgW1sKKworLy8gSWYgdGhlIGNvbXBpbGVyIGFkbWl0cyB0aGF0IGl0IGlzIG5vdCByZWFkeSBmb3IgQysrMTQsIHdoeSB0b3J0dXJlIGl0PworLy8gSG9wZWZ1bGx5LCB0aGlzIHdpbGwgc3BlZWQgdXAgdGhlIHRlc3QuCisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKyBjb21waWxlciIKKworI2VsaWYgX19jcGx1c3BsdXMgPCAyMDE0MDJMCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysxNCBjb21waWxlciIKKworI2Vsc2UKKworbmFtZXNwYWNlIGN4eDE0Cit7CisKKyAgbmFtZXNwYWNlIHRlc3RfcG9seW1vcnBoaWNfbGFtYmRhcworICB7CisKKyAgICBpbnQKKyAgICB0ZXN0KCkKKyAgICB7CisgICAgICBjb25zdCBhdXRvIGxhbWJkYSA9IFtdKGF1dG8mJi4uLiBhcmdzKXsKKyAgICAgICAgY29uc3QgYXV0byBpc3RpbnkgPSBbXShhdXRvIHgpeworICAgICAgICAgIHJldHVybiAoc2l6ZW9mKHgpID09IDFVTCkgPyAxIDogMDsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3QgaW50IGFyZXRpbnlbXSA9IHsgaXN0aW55KGFyZ3MpLi4uIH07CisgICAgICAgIHJldHVybiBhcmV0aW55WzBdOworICAgICAgfTsKKyAgICAgIHJldHVybiBsYW1iZGEoMSwgMUwsIDEuMGYsICcxJyk7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9iaW5hcnlfbGl0ZXJhbHMKKyAgeworCisgICAgY29uc3RleHByIGF1dG8gaXZpaSA9IDBiMDAwMDAwMDAwMDEwMTAxMDsKKyAgICBzdGF0aWNfYXNzZXJ0KGl2aWkgPT0gNDIsICJ3cm9uZyB2YWx1ZSIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9nZW5lcmFsaXplZF9jb25zdGV4cHIKKyAgeworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBDaGFyVCA+CisgICAgY29uc3RleHByIHVuc2lnbmVkIGxvbmcKKyAgICBzdHJsZW5fYyhjb25zdCBDaGFyVCAqY29uc3Qgcykgbm9leGNlcHQKKyAgICB7CisgICAgICBhdXRvIGxlbmd0aCA9IDBVTDsKKyAgICAgIGZvciAoYXV0byBwID0gczsgKnA7ICsrcCkKKyAgICAgICAgKytsZW5ndGg7CisgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0KKworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoIiIpID09IDBVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoIngiKSA9PSAxVUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJ0ZXN0IikgPT0gNFVMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiYW5vdGhlclwwdGVzdCIpID09IDdVTCwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9sYW1iZGFfaW5pdF9jYXB0dXJlCisgIHsKKworICAgIGludAorICAgIHRlc3QoKQorICAgIHsKKyAgICAgIGF1dG8geCA9IDA7CisgICAgICBjb25zdCBhdXRvIGxhbWJkYTEgPSBbYSA9IHhdKGludCBiKXsgcmV0dXJuIGEgKyBiOyB9OworICAgICAgY29uc3QgYXV0byBsYW1iZGEyID0gW2EgPSBsYW1iZGExKHgpXSgpeyByZXR1cm4gYTsgfTsKKyAgICAgIHJldHVybiBsYW1iZGEyKCk7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9kaWdpdF9zZXBhcmF0b3JzCisgIHsKKworICAgIGNvbnN0ZXhwciBhdXRvIHRlbl9taWxsaW9uID0gMTAwJzAwMCcwMDA7CisgICAgc3RhdGljX2Fzc2VydCh0ZW5fbWlsbGlvbiA9PSAxMDAwMDAwMDAsICIiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfcmV0dXJuX3R5cGVfZGVkdWN0aW9uCisgIHsKKworICAgIGF1dG8gZihpbnQmIHgpIHsgcmV0dXJuIHg7IH0KKyAgICBkZWNsdHlwZShhdXRvKSBnKGludCYgeCkgeyByZXR1cm4geDsgfQorCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIgPgorICAgIHN0cnVjdCBpc19zYW1lCisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0gZmFsc2U7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGlzX3NhbWU8VCwgVD4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPSB0cnVlOworICAgIH07CisKKyAgICBpbnQKKyAgICB0ZXN0KCkKKyAgICB7CisgICAgICBhdXRvIHggPSAwOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoZih4KSk+Ojp2YWx1ZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCYsIGRlY2x0eXBlKGcoeCkpPjo6dmFsdWUsICIiKTsKKyAgICAgIHJldHVybiB4OworICAgIH0KKworICB9CisKK30gIC8vIG5hbWVzcGFjZSBjeHgxNAorCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzID49IDIwMTQwMkwKKworXV0pCisKKworZG5sICBUZXN0cyBmb3IgbmV3IGZlYXR1cmVzIGluIEMrKzE3CisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTddLCBbWworCisvLyBJZiB0aGUgY29tcGlsZXIgYWRtaXRzIHRoYXQgaXQgaXMgbm90IHJlYWR5IGZvciBDKysxNywgd2h5IHRvcnR1cmUgaXQ/CisvLyBIb3BlZnVsbHksIHRoaXMgd2lsbCBzcGVlZCB1cCB0aGUgdGVzdC4KKworI2lmbmRlZiBfX2NwbHVzcGx1cworCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrIGNvbXBpbGVyIgorCisjZWxpZiBfX2NwbHVzcGx1cyA8IDIwMTcwM0wKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKzE3IGNvbXBpbGVyIgorCisjZWxzZQorCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgY3h4MTcKK3sKKworICBuYW1lc3BhY2UgdGVzdF9jb25zdGV4cHJfbGFtYmRhcworICB7CisKKyAgICBjb25zdGV4cHIgaW50IGZvbyA9IFtdKCl7cmV0dXJuIDQyO30oKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3Q6Om5lc3RlZF9uYW1lc3BhY2U6OmRlZmluaXRpb25zCisgIHsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZm9sZF9leHByZXNzaW9uCisgIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgaW50IG11bHRpcGx5KEFyZ3MuLi4gYXJncykKKyAgICB7CisgICAgICByZXR1cm4gKGFyZ3MgKiAuLi4gKiAxKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmdzPgorICAgIGJvb2wgYWxsKEFyZ3MuLi4gYXJncykKKyAgICB7CisgICAgICByZXR1cm4gKGFyZ3MgJiYgLi4uKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2V4dGVuZGVkX3N0YXRpY19hc3NlcnQKKyAgeworCisgICAgc3RhdGljX2Fzc2VydCAodHJ1ZSk7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2F1dG9fYnJhY2VfaW5pdF9saXN0CisgIHsKKworICAgIGF1dG8gZm9vID0gezV9OworICAgIGF1dG8gYmFyIHs1fTsKKworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxpbnQ+LCBkZWNsdHlwZShmb28pPjo6dmFsdWUpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGludCwgZGVjbHR5cGUoYmFyKT46OnZhbHVlKTsKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3R5cGVuYW1lX2luX3RlbXBsYXRlX3RlbXBsYXRlX3BhcmFtZXRlcgorICB7CisKKyAgICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZT4gdHlwZW5hbWUgWD4gc3RydWN0IEQ7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2ZhbGx0aHJvdWdoX25vZGlzY2FyZF9tYXliZV91bnVzZWRfYXR0cmlidXRlcworICB7CisKKyAgICBpbnQgZjEoKQorICAgIHsKKyAgICAgIHJldHVybiA0MjsKKyAgICB9CisKKyAgICBbW25vZGlzY2FyZF1dIGludCBmMigpCisgICAgeworICAgICAgW1ttYXliZV91bnVzZWRdXSBhdXRvIHVudXNlZCA9IGYxKCk7CisKKyAgICAgIHN3aXRjaCAoZjEoKSkKKyAgICAgIHsKKyAgICAgIGNhc2UgMTc6CisgICAgICAgIGYxKCk7CisgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgIGNhc2UgNDI6CisgICAgICAgIGYxKCk7CisgICAgICB9CisgICAgICByZXR1cm4gZjEoKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2V4dGVuZGVkX2FnZ3JlZ2F0ZV9pbml0aWFsaXphdGlvbgorICB7CisKKyAgICBzdHJ1Y3QgYmFzZTEKKyAgICB7CisgICAgICBpbnQgYjEsIGIyID0gNDI7CisgICAgfTsKKworICAgIHN0cnVjdCBiYXNlMgorICAgIHsKKyAgICAgIGJhc2UyKCkgeworICAgICAgICBiMyA9IDQyOworICAgICAgfQorICAgICAgaW50IGIzOworICAgIH07CisKKyAgICBzdHJ1Y3QgZGVyaXZlZCA6IGJhc2UxLCBiYXNlMgorICAgIHsKKyAgICAgICAgaW50IGQ7CisgICAgfTsKKworICAgIGRlcml2ZWQgZDEge3sxLCAyfSwge30sIDR9OyAgLy8gZnVsbCBpbml0aWFsaXphdGlvbgorICAgIGRlcml2ZWQgZDIge3t9LCB7fSwgNH07ICAgICAgLy8gdmFsdWUtaW5pdGlhbGl6ZWQgYmFzZXMKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZ2VuZXJhbF9yYW5nZV9iYXNlZF9mb3JfbG9vcAorICB7CisKKyAgICBzdHJ1Y3QgaXRlcgorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBpbnQmIG9wZXJhdG9yKiAoKQorICAgICAgeworICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKworICAgICAgY29uc3QgaW50JiBvcGVyYXRvciogKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisKKyAgICAgIGl0ZXImIG9wZXJhdG9yKysoKQorICAgICAgeworICAgICAgICArK2k7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICB9OworCisgICAgc3RydWN0IHNlbnRpbmVsCisgICAgeworICAgICAgaW50IGk7CisgICAgfTsKKworICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgaXRlciYgaSwgY29uc3Qgc2VudGluZWwmIHMpCisgICAgeworICAgICAgcmV0dXJuIGkuaSA9PSBzLmk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9IChjb25zdCBpdGVyJiBpLCBjb25zdCBzZW50aW5lbCYgcykKKyAgICB7CisgICAgICByZXR1cm4gIShpID09IHMpOworICAgIH0KKworICAgIHN0cnVjdCByYW5nZQorICAgIHsKKyAgICAgIGl0ZXIgYmVnaW4oKSBjb25zdAorICAgICAgeworICAgICAgICByZXR1cm4gezB9OworICAgICAgfQorCisgICAgICBzZW50aW5lbCBlbmQoKSBjb25zdAorICAgICAgeworICAgICAgICByZXR1cm4gezV9OworICAgICAgfQorICAgIH07CisKKyAgICB2b2lkIGYoKQorICAgIHsKKyAgICAgIHJhbmdlIHIge307CisKKyAgICAgIGZvciAoYXV0byBpIDogcikKKyAgICAgIHsKKyAgICAgICAgW1ttYXliZV91bnVzZWRdXSBhdXRvIHYgPSBpOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfbGFtYmRhX2NhcHR1cmVfYXN0ZXJpc2tfdGhpc19ieV92YWx1ZQorICB7CisKKyAgICBzdHJ1Y3QgdAorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IGZvbygpCisgICAgICB7CisgICAgICAgIHJldHVybiBbKnRoaXNdKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9KCk7CisgICAgICB9CisgICAgfTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZW51bV9jbGFzc19jb25zdHJ1Y3Rpb24KKyAgeworCisgICAgZW51bSBjbGFzcyBieXRlIDogdW5zaWduZWQgY2hhcgorICAgIHt9OworCisgICAgYnl0ZSBmb28gezQyfTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfY29uc3RleHByX2lmCisgIHsKKworICAgIHRlbXBsYXRlIDxib29sIGNvbmQ+CisgICAgaW50IGYgKCkKKyAgICB7CisgICAgICBpZiBjb25zdGV4cHIoY29uZCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIDEzOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICByZXR1cm4gNDI7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9zZWxlY3Rpb25fc3RhdGVtZW50X3dpdGhfaW5pdGlhbGl6ZXIKKyAgeworCisgICAgaW50IGYoKQorICAgIHsKKyAgICAgIHJldHVybiAxMzsKKyAgICB9CisKKyAgICBpbnQgZjIoKQorICAgIHsKKyAgICAgIGlmIChhdXRvIGkgPSBmKCk7IGkgPiAwKQorICAgICAgeworICAgICAgICByZXR1cm4gMzsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChhdXRvIGkgPSBmKCk7IGkgKyA0KQorICAgICAgeworICAgICAgY2FzZSAxNzoKKyAgICAgICAgcmV0dXJuIDI7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfdGVtcGxhdGVfYXJndW1lbnRfZGVkdWN0aW9uX2Zvcl9jbGFzc190ZW1wbGF0ZXMKKyAgeworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgcGFpcgorICAgIHsKKyAgICAgIHBhaXIgKFQxIHAxLCBUMiBwMikKKyAgICAgICAgOiBtMSB7cDF9LAorICAgICAgICAgIG0yIHtwMn0KKyAgICAgIHt9CisKKyAgICAgIFQxIG0xOworICAgICAgVDIgbTI7CisgICAgfTsKKworICAgIHZvaWQgZigpCisgICAgeworICAgICAgW1ttYXliZV91bnVzZWRdXSBhdXRvIHAgPSBwYWlyezEzLCA0MnV9OworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3Rfbm9uX3R5cGVfYXV0b190ZW1wbGF0ZV9wYXJhbWV0ZXJzCisgIHsKKworICAgIHRlbXBsYXRlIDxhdXRvIG4+CisgICAgc3RydWN0IEIKKyAgICB7fTsKKworICAgIEI8NT4gYjE7CisgICAgQjwnYSc+IGIyOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9zdHJ1Y3R1cmVkX2JpbmRpbmdzCisgIHsKKworICAgIGludCBhcnJbMl0gPSB7IDEsIDIgfTsKKyAgICBzdGQ6OnBhaXI8aW50LCBpbnQ+IHByID0geyAxLCAyIH07CisKKyAgICBhdXRvIGYxKCkgLT4gaW50KCYpWzJdCisgICAgeworICAgICAgcmV0dXJuIGFycjsKKyAgICB9CisKKyAgICBhdXRvIGYyKCkgLT4gc3RkOjpwYWlyPGludCwgaW50PiYKKyAgICB7CisgICAgICByZXR1cm4gcHI7CisgICAgfQorCisgICAgc3RydWN0IFMKKyAgICB7CisgICAgICBpbnQgeDEgOiAyOworICAgICAgdm9sYXRpbGUgZG91YmxlIHkxOworICAgIH07CisKKyAgICBTIGYzKCkKKyAgICB7CisgICAgICByZXR1cm4ge307CisgICAgfQorCisgICAgYXV0byBbIHgxLCB5MSBdID0gZjEoKTsKKyAgICBhdXRvJiBbIHhyMSwgeXIxIF0gPSBmMSgpOworICAgIGF1dG8gWyB4MiwgeTIgXSA9IGYyKCk7CisgICAgYXV0byYgWyB4cjIsIHlyMiBdID0gZjIoKTsKKyAgICBjb25zdCBhdXRvIFsgeDMsIHkzIF0gPSBmMygpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9leGNlcHRpb25fc3BlY190eXBlX3N5c3RlbQorICB7CisKKyAgICBzdHJ1Y3QgR29vZCB7fTsKKyAgICBzdHJ1Y3QgQmFkIHt9OworCisgICAgdm9pZCBnMSgpIG5vZXhjZXB0OworICAgIHZvaWQgZzIoKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQmFkCisgICAgZihUKiwgVCopOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIEdvb2QKKyAgICBmKFQxKiwgVDIqKTsKKworICAgIHN0YXRpY19hc3NlcnQgKHN0ZDo6aXNfc2FtZV92PEdvb2QsIGRlY2x0eXBlKGYoZzEsIGcyKSk+KTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfaW5saW5lX3ZhcmlhYmxlcworICB7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGYoVCkKKyAgICB7fQorCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIFQgZyhUKQorICAgIHsKKyAgICAgIHJldHVybiBUe307CisgICAgfQorCisgICAgdGVtcGxhdGU8PiBpbmxpbmUgdm9pZCBmPD4oaW50KQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZTw+IGludCBnPD4oaW50KQorICAgIHsKKyAgICAgIHJldHVybiA1OworICAgIH0KKworICB9CisKK30gIC8vIG5hbWVzcGFjZSBjeHgxNworCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzIDwgMjAxNzAzTAorCitdXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLm00IGIvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQKaW5kZXggYTlhOGY1OC4uMTczM2ZkOCAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQKKysrIGIvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQKQEAgLTEsMjYgKzEsMjMgQEAKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLmh0bWwKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCiAjCi0jICAgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExKFtleHR8bm9leHRdLFttYW5kYXRvcnl8b3B0aW9uYWxdKQorIyAgIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMShbZXh0fG5vZXh0XSwgW21hbmRhdG9yeXxvcHRpb25hbF0pCiAjCiAjIERFU0NSSVBUSU9OCiAjCiAjICAgQ2hlY2sgZm9yIGJhc2VsaW5lIGxhbmd1YWdlIGNvdmVyYWdlIGluIHRoZSBjb21waWxlciBmb3IgdGhlIEMrKzExCi0jICAgc3RhbmRhcmQ7IGlmIG5lY2Vzc2FyeSwgYWRkIHN3aXRjaGVzIHRvIENYWEZMQUdTIHRvIGVuYWJsZSBzdXBwb3J0LgorIyAgIHN0YW5kYXJkOyBpZiBuZWNlc3NhcnksIGFkZCBzd2l0Y2hlcyB0byBDWFggYW5kIENYWENQUCB0byBlbmFibGUKKyMgICBzdXBwb3J0LgogIwotIyAgIFRoZSBmaXJzdCBhcmd1bWVudCwgaWYgc3BlY2lmaWVkLCBpbmRpY2F0ZXMgd2hldGhlciB5b3UgaW5zaXN0IG9uIGFuCi0jICAgZXh0ZW5kZWQgbW9kZSAoZS5nLiAtc3RkPWdudSsrMTEpIG9yIGEgc3RyaWN0IGNvbmZvcm1hbmNlIG1vZGUgKGUuZy4KLSMgICAtc3RkPWMrKzExKS4gIElmIG5laXRoZXIgaXMgc3BlY2lmaWVkLCB5b3UgZ2V0IHdoYXRldmVyIHdvcmtzLCB3aXRoCi0jICAgcHJlZmVyZW5jZSBmb3IgYW4gZXh0ZW5kZWQgbW9kZS4KLSMKLSMgICBUaGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQgJ21hbmRhdG9yeScgb3IgaWYgbGVmdCB1bnNwZWNpZmllZCwKLSMgICBpbmRpY2F0ZXMgdGhhdCBiYXNlbGluZSBDKysxMSBzdXBwb3J0IGlzIHJlcXVpcmVkIGFuZCB0aGF0IHRoZSBtYWNybwotIyAgIHNob3VsZCBlcnJvciBvdXQgaWYgbm8gbW9kZSB3aXRoIHRoYXQgc3VwcG9ydCBpcyBmb3VuZC4gIElmIHNwZWNpZmllZAotIyAgICdvcHRpb25hbCcsIHRoZW4gY29uZmlndXJhdGlvbiBwcm9jZWVkcyByZWdhcmRsZXNzLCBhZnRlciBkZWZpbmluZwotIyAgIEhBVkVfQ1hYMTEgaWYgYW5kIG9ubHkgaWYgYSBzdXBwb3J0aW5nIG1vZGUgaXMgZm91bmQuCisjICAgVGhpcyBtYWNybyBpcyBhIGNvbnZlbmllbmNlIGFsaWFzIGZvciBjYWxsaW5nIHRoZSBBWF9DWFhfQ09NUElMRV9TVERDWFgKKyMgICBtYWNybyB3aXRoIHRoZSB2ZXJzaW9uIHNldCB0byBDKysxMS4gIFRoZSB0d28gb3B0aW9uYWwgYXJndW1lbnRzIGFyZQorIyAgIGZvcndhcmRlZCBsaXRlcmFsbHkgYXMgdGhlIHNlY29uZCBhbmQgdGhpcmQgYXJndW1lbnQgcmVzcGVjdGl2ZWx5LgorIyAgIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBBWF9DWFhfQ09NUElMRV9TVERDWFggbWFjcm8gZm9yCisjICAgbW9yZSBpbmZvcm1hdGlvbi4gIElmIHlvdSB3YW50IHRvIHVzZSB0aGlzIG1hY3JvLCB5b3UgYWxzbyBuZWVkIHRvCisjICAgZG93bmxvYWQgdGhlIGF4X2N4eF9jb21waWxlX3N0ZGN4eC5tNCBmaWxlLgogIwogIyBMSUNFTlNFCiAjCkBAIC0yOCwxMzggKzI1LDE1IEBACiAjICAgQ29weXJpZ2h0IChjKSAyMDEyIFphY2sgV2VpbmJlcmcgPHphY2t3QHBhbml4LmNvbT4KICMgICBDb3B5cmlnaHQgKGMpIDIwMTMgUm95IFN0b2duZXIgPHJveXN0Z25yQGljZXMudXRleGFzLmVkdT4KICMgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTUgR29vZ2xlIEluYy47IGNvbnRyaWJ1dGVkIGJ5IEFsZXhleSBTb2tvbG92IDxzb2tvbG92QGdvb2dsZS5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDE1IFBhdWwgTm9ybWFuIDxwZW5vcm1hbkBtYWMuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxNSBNb3JpdHogS2xhbW1sZXIgPG1vcml0ekBrbGFtbWxlci5ldT4KICMKICMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKICMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKICMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CiAjICAgd2FycmFudHkuCiAKLSNzZXJpYWwgMTAKKyNzZXJpYWwgMTgKIAotbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSwgW1sKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgc3RydWN0IGNoZWNrCi0gICAgewotICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoaW50KSA8PSBzaXplb2YoVCksICJub3QgYmlnIGVub3VnaCIpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgQmFzZSB7Ci0gICAgdmlydHVhbCB2b2lkIGYoKSB7fQotICAgIH07Ci0gICAgc3RydWN0IENoaWxkIDogcHVibGljIEJhc2UgewotICAgIHZpcnR1YWwgdm9pZCBmKCkgb3ZlcnJpZGUge30KLSAgICB9OwotCi0gICAgdHlwZWRlZiBjaGVjazxjaGVjazxib29sPj4gcmlnaHRfYW5nbGVfYnJhY2tldHM7Ci0KLSAgICBpbnQgYTsKLSAgICBkZWNsdHlwZShhKSBiOwotCi0gICAgdHlwZWRlZiBjaGVjazxpbnQ+IGNoZWNrX3R5cGU7Ci0gICAgY2hlY2tfdHlwZSBjOwotICAgIGNoZWNrX3R5cGUmJiBjciA9IHN0YXRpY19jYXN0PGNoZWNrX3R5cGUmJj4oYyk7Ci0KLSAgICBhdXRvIGQgPSBhOwotICAgIGF1dG8gbCA9IFtdKCl7fTsKLSAgICAvLyBQcmV2ZW50IENsYW5nIGVycm9yOiB1bnVzZWQgdmFyaWFibGUgJ2wnIFstV2Vycm9yLC1XdW51c2VkLXZhcmlhYmxlXQotICAgIHN0cnVjdCB1c2VfbCB7IHVzZV9sKCkgeyBsKCk7IH0gfTsKLQotICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTM3MjgxODQvdGVtcGxhdGUtYWxpYXNlcy1hbmQtc2ZpbmFlCi0gICAgLy8gQ2xhbmcgMy4xIGZhaWxzIHdpdGggaGVhZGVycyBvZiBsaWJzdGQrKyA0LjguMyB3aGVuIHVzaW5nIHN0ZDo6ZnVuY3Rpb24gYmVjYXVzZSBvZiB0aGlzCi0gICAgbmFtZXNwYWNlIHRlc3RfdGVtcGxhdGVfYWxpYXNfc2ZpbmFlIHsKLSAgICAgICAgc3RydWN0IGZvbyB7fTsKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICB1c2luZyBtZW1iZXIgPSB0eXBlbmFtZSBUOjptZW1iZXJfdHlwZTsKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICB2b2lkIGZ1bmMoLi4uKSB7fQotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIHZvaWQgZnVuYyhtZW1iZXI8VD4qKSB7fQotCi0gICAgICAgIHZvaWQgdGVzdCgpOwotCi0gICAgICAgIHZvaWQgdGVzdCgpIHsKLSAgICAgICAgICAgIGZ1bmM8Zm9vPigwKTsKLSAgICAgICAgfQotICAgIH0KLV1dKQotCi1BQ19ERUZVTihbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSwgW2RubAotICBtNF9pZihbJDFdLCBbXSwgW10sCi0gICAgICAgIFskMV0sIFtleHRdLCBbXSwKLSAgICAgICAgWyQxXSwgW25vZXh0XSwgW10sCi0gICAgICAgIFttNF9mYXRhbChbaW52YWxpZCBhcmd1bWVudCBgJDEnIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMV0pXSlkbmwKLSAgbTRfaWYoWyQyXSwgW10sIFtheF9jeHhfY29tcGlsZV9jeHgxMV9yZXF1aXJlZD10cnVlXSwKLSAgICAgICAgWyQyXSwgW21hbmRhdG9yeV0sIFtheF9jeHhfY29tcGlsZV9jeHgxMV9yZXF1aXJlZD10cnVlXSwKLSAgICAgICAgWyQyXSwgW29wdGlvbmFsXSwgW2F4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkPWZhbHNlXSwKLSAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIHNlY29uZCBhcmd1bWVudCBgJDInIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMV0pXSkKLSAgQUNfTEFOR19QVVNIKFtDKytdKWRubAotICBhY19zdWNjZXNzPW5vCi0gIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKysxMSBmZWF0dXJlcyBieSBkZWZhdWx0LAotICBheF9jdl9jeHhfY29tcGlsZV9jeHgxMSwKLSAgW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0pXSwKLSAgICBbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTE9eWVzXSwKLSAgICBbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTE9bm9dKV0pCi0gIGlmIHRlc3QgeCRheF9jdl9jeHhfY29tcGlsZV9jeHgxMSA9IHh5ZXM7IHRoZW4KLSAgICBhY19zdWNjZXNzPXllcwotICBmaQotCi0gIG00X2lmKFskMV0sIFtub2V4dF0sIFtdLCBbZG5sCi0gIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCi0gICAgZm9yIHN3aXRjaCBpbiAtc3RkPWdudSsrMTEgLXN0ZD1nbnUrKzB4OyBkbwotICAgICAgY2FjaGV2YXI9QVNfVFJfU0goW2F4X2N2X2N4eF9jb21waWxlX2N4eDExXyRzd2l0Y2hdKQotICAgICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKzExIGZlYXR1cmVzIHdpdGggJHN3aXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICRjYWNoZXZhciwKLSAgICAgICAgW2FjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKLSAgICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKLSAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0pXSwKLSAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9eWVzXSwKLSAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9bm9dKQotICAgICAgICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIl0pCi0gICAgICBpZiBldmFsIHRlc3QgeFwkJGNhY2hldmFyID0geHllczsgdGhlbgotICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRzd2l0Y2giCi0gICAgICAgIGFjX3N1Y2Nlc3M9eWVzCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmldKQotCi0gIG00X2lmKFskMV0sIFtleHRdLCBbXSwgW2RubAotICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgotICAgIGZvciBzd2l0Y2ggaW4gLXN0ZD1jKysxMSAtc3RkPWMrKzB4OyBkbwotICAgICAgY2FjaGV2YXI9QVNfVFJfU0goW2F4X2N2X2N4eF9jb21waWxlX2N4eDExXyRzd2l0Y2hdKQotICAgICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKzExIGZlYXR1cmVzIHdpdGggJHN3aXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICRjYWNoZXZhciwKLSAgICAgICAgW2FjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKLSAgICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKLSAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0pXSwKLSAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9eWVzXSwKLSAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9bm9dKQotICAgICAgICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIl0pCi0gICAgICBpZiBldmFsIHRlc3QgeFwkJGNhY2hldmFyID0geHllczsgdGhlbgotICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRzd2l0Y2giCi0gICAgICAgIGFjX3N1Y2Nlc3M9eWVzCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmldKQotICBBQ19MQU5HX1BPUChbQysrXSkKLSAgaWYgdGVzdCB4JGF4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkID0geHRydWU7IHRoZW4KLSAgICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgotICAgICAgQUNfTVNHX0VSUk9SKFsqKiogQSBjb21waWxlciB3aXRoIHN1cHBvcnQgZm9yIEMrKzExIGxhbmd1YWdlIGZlYXR1cmVzIGlzIHJlcXVpcmVkLl0pCi0gICAgZmkKLSAgZWxzZQotICAgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCi0gICAgICBIQVZFX0NYWDExPTAKLSAgICAgIEFDX01TR19OT1RJQ0UoW05vIGNvbXBpbGVyIHdpdGggQysrMTEgc3VwcG9ydCB3YXMgZm91bmRdKQotICAgIGVsc2UKLSAgICAgIEhBVkVfQ1hYMTE9MQotICAgICAgQUNfREVGSU5FKEhBVkVfQ1hYMTEsMSwKLSAgICAgICAgICAgICAgICBbZGVmaW5lIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBiYXNpYyBDKysxMSBzeW50YXhdKQotICAgIGZpCi0KLSAgICBBQ19TVUJTVChIQVZFX0NYWDExKQotICBmaQotXSkKK0FYX1JFUVVJUkVfREVGSU5FRChbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSkKK0FDX0RFRlVOKFtBWF9DWFhfQ09NUElMRV9TVERDWFhfMTFdLCBbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYKFsxMV0sIFskMV0sIFskMl0pXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQgYi9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00CmluZGV4IGYzNDFmNTAuLjAyMDM5NjAgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKKysrIGIvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNApAQCAtMTE4LDcgKzExOCw3IEBACiBBQ19ERUZVTihbQVhfQ0hFQ0tfQU5UX1ZFUlNJT05dLAogICAgICAgICAgWwogICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgYW50IHZlcnNpb24gPiAkMikKLSAgICAgICAgICBBTlRfVkFMSUQ9YGV4cHIgJCgkMSAtdmVyc2lvbiAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy8uKnZlcnNpb24gXChAPDpAMC05XC5AOj5AKlwpLiovXDEvcCcpIFw+PSAkMmAKKyAgICAgICAgICBBTlRfVkFMSUQ9YGV4cHIgIngkKHByaW50ZiAiJDJcbiQoJDEgLXZlcnNpb24gMj4vZGV2L251bGwgfCBzZWQgLW4gJ3MvLip2ZXJzaW9uIFwoQDw6QDAtOVwuQDo+QCpcKS4qL1wxL3AnKSIgfCBzb3J0IC10ICcuJyAtayAxLDEgLWsgMiwyIC1rIDMsMyAtZyB8IHNlZCAtbiAxcCkiID0gIngkMiJgCiAgICAgICAgICAgaWYgdGVzdCAieCRBTlRfVkFMSUQiID0gIngxIiA7IHRoZW4KICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfbHVhLm00IGIvYWNsb2NhbC9heF9sdWEubTQKaW5kZXggMTU1MzQ5MS4uNTkyMDE2NyAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9sdWEubTQKKysrIGIvYWNsb2NhbC9heF9sdWEubTQKQEAgLTEsNSArMSw1IEBACiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAgICAgICAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9sdWEuaHRtbAorIyAgICAgICAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfbHVhLmh0bWwKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCkBAIC0xOCw4ICsxOCw4IEBACiAjICAgQWxzbyBkZXRlY3QgTHVhIGhlYWRlcnMgYW5kIGxpYnJhcmllcy4gVGhlIEx1YSB2ZXJzaW9uIGNvbnRhaW5lZCBpbiB0aGUKICMgICBoZWFkZXIgaXMgY2hlY2tlZCB0byBtYXRjaCB0aGUgTHVhIGludGVycHJldGVyIHZlcnNpb24gZXhhY3RseS4gV2hlbgogIyAgIHNlYXJjaGluZyBmb3IgTHVhIGxpYnJhcmllcywgdGhlIHZlcnNpb24gbnVtYmVyIGlzIHVzZWQgYXMgYSBzdWZmaXguCi0jICAgVGhpcyBpcyBkb25lIHdpdGggdGhlIGdvYWwgb2Ygc3VwcG9ydGluZyBtdWx0aXBsZSBMdWEgaW5zdGFsbHMgKDUuMSBhbmQKLSMgICA1LjIgc2lkZS1ieS1zaWRlKS4KKyMgICBUaGlzIGlzIGRvbmUgd2l0aCB0aGUgZ29hbCBvZiBzdXBwb3J0aW5nIG11bHRpcGxlIEx1YSBpbnN0YWxscyAoNS4xLAorIyAgIDUuMiwgYW5kIDUuMyBzaWRlLWJ5LXNpZGUpLgogIwogIyAgIEEgbm90ZSBvbiBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbnM6IFRoaXMgZmlsZSBoYXMgYmVlbgogIyAgIG1vc3RseSByZXdyaXR0ZW4gZm9yIHNlcmlhbCAxOC4gTW9zdCBkZXZlbG9wZXJzIHNob3VsZCBiZSBhYmxlIHRvIHVzZQpAQCAtNTEsNyArNTEsNyBAQAogIwogIyAgIElmIE1JTklNVU0tVkVSU0lPTiBpcyBzdXBwbGllZCwgdGhlbiBvbmx5IEx1YSBpbnRlcnByZXRlcnMgd2l0aCBhCiAjICAgdmVyc2lvbiBudW1iZXIgZ3JlYXRlciBvciBlcXVhbCB0byBNSU5JTVVNLVZFUlNJT04gd2lsbCBiZSBhY2NlcHRlZC4gSWYKLSMgICBUT08tQklHLSBWRVJTSU9OIGlzIGFsc28gc3VwcGxpZWQsIHRoZW4gb25seSBMdWEgaW50ZXJwcmV0ZXJzIHdpdGggYQorIyAgIFRPTy1CSUctVkVSU0lPTiBpcyBhbHNvIHN1cHBsaWVkLCB0aGVuIG9ubHkgTHVhIGludGVycHJldGVycyB3aXRoIGEKICMgICB2ZXJzaW9uIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIE1JTklNVU0tVkVSU0lPTiBhbmQgbGVzcyB0aGFuCiAjICAgVE9PLUJJRy1WRVJTSU9OIHdpbGwgYmUgYWNjZXB0ZWQuCiAjCkBAIC02NiwxMiArNjYsMTMgQEAKICMgICAgIGx1YWV4ZWNkaXIgICAgICAgICBEaXJlY3RvcnkgdG8gaW5zdGFsbCBMdWEgbW9kdWxlcy4KICMgICAgIHBrZ2x1YWV4ZWNkaXIgICAgICAkbHVhZXhlY2Rpci8kUEFDS0FHRQogIwotIyAgIFRoZXNlIHBhdGhzIGEgZm91bmQgYmFzZWQgb24gJHByZWZpeCwgJGV4ZWNfcHJlZml4LCBMdWEncyBwYWNrYWdlLnBhdGgsCi0jICAgYW5kIHBhY2thZ2UuY3BhdGguIFRoZSBmaXJzdCBwYXRoIG9mIHBhY2thZ2UucGF0aCBiZWdpbm5pbmcgd2l0aCAkcHJlZml4Ci0jICAgaXMgc2VsZWN0ZWQgYXMgbHVhZGlyLiBUaGUgZmlyc3QgcGF0aCBvZiBwYWNrYWdlLmNwYXRoIGJlZ2lubmluZyB3aXRoCi0jICAgJGV4ZWNfcHJlZml4IGlzIHVzZWQgYXMgbHVhZXhlY2Rpci4gVGhpcyBzaG91bGQgd29yayBvbiBhbGwgcmVhc29uYWJsZQotIyAgIEx1YSBpbnN0YWxsYXRpb25zLiBJZiBhIHBhdGggY2Fubm90IGJlIGRldGVybWluZWQsIGEgZGVmYXVsdCBwYXRoIGlzCi0jICAgdXNlZC4gT2YgY291cnNlLCB0aGUgdXNlciBjYW4gb3ZlcnJpZGUgdGhlc2UgbGF0ZXIgd2hlbiBpbnZva2luZyBtYWtlLgorIyAgIFRoZXNlIHBhdGhzIGFyZSBmb3VuZCBiYXNlZCBvbiAkcHJlZml4LCAkZXhlY19wcmVmaXgsIEx1YSdzCisjICAgcGFja2FnZS5wYXRoLCBhbmQgcGFja2FnZS5jcGF0aC4gVGhlIGZpcnN0IHBhdGggb2YgcGFja2FnZS5wYXRoCisjICAgYmVnaW5uaW5nIHdpdGggJHByZWZpeCBpcyBzZWxlY3RlZCBhcyBsdWFkaXIuIFRoZSBmaXJzdCBwYXRoIG9mCisjICAgcGFja2FnZS5jcGF0aCBiZWdpbm5pbmcgd2l0aCAkZXhlY19wcmVmaXggaXMgdXNlZCBhcyBsdWFleGVjZGlyLiBUaGlzCisjICAgc2hvdWxkIHdvcmsgb24gYWxsIHJlYXNvbmFibGUgTHVhIGluc3RhbGxhdGlvbnMuIElmIGEgcGF0aCBjYW5ub3QgYmUKKyMgICBkZXRlcm1pbmVkLCBhIGRlZmF1bHQgcGF0aCBpcyB1c2VkLiBPZiBjb3Vyc2UsIHRoZSB1c2VyIGNhbiBvdmVycmlkZQorIyAgIHRoZXNlIGxhdGVyIHdoZW4gaW52b2tpbmcgbWFrZS4KICMKICMgICAgIGx1YWRpciAgICAgICAgICAgICBEZWZhdWx0OiAkcHJlZml4L3NoYXJlL2x1YS8kTFVBX1ZFUlNJT04KICMgICAgIGx1YWV4ZWNkaXIgICAgICAgICBEZWZhdWx0OiAkZXhlY19wcmVmaXgvbGliL2x1YS8kTFVBX1ZFUlNJT04KQEAgLTE1MSw3ICsxNTIsNyBAQAogIwogIyBMSUNFTlNFCiAjCi0jICAgQ29weXJpZ2h0IChjKSAyMDE0IFJldWJlbiBUaG9tYXMgPHJydEBzYzNkLm9yZz4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgUmV1YmVuIFRob21hcyA8cnJ0QHNjM2Qub3JnPgogIyAgIENvcHlyaWdodCAoYykgMjAxNCBUaW0gUGVya2lucyA8dHByazc3QGdtYWlsLmNvbT4KICMKICMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTY1LDcgKzE2Niw3IEBACiAjICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICMKICMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjICAgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAjCiAjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQgb3duZXIKICMgICBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhlIGNvbmZpZ3VyZQpAQCAtMTgwLDcgKzE4MSw3IEBACiAjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAogIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgogCi0jc2VyaWFsIDM2Cisjc2VyaWFsIDQwCiAKIGRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBkbmwgQVhfUFJPR19MVUEoW01JTklNVU0tVkVSU0lPTl0sIFtUT08tQklHLVZFUlNJT05dLApAQCAtMTk3LDcgKzE5OCw3IEBACiAKICAgZG5sIEZpbmQgYSBMdWEgaW50ZXJwcmV0ZXIuCiAgIG00X2RlZmluZV9kZWZhdWx0KFtfQVhfTFVBX0lOVEVSUFJFVEVSX0xJU1RdLAotICAgIFtsdWEgbHVhNS4yIGx1YTUyIGx1YTUuMSBsdWE1MSBsdWE1MF0pCisgICAgW2x1YSBsdWE1LjMgbHVhNTMgbHVhNS4yIGx1YTUyIGx1YTUuMSBsdWE1MSBsdWE1MF0pCiAKICAgbTRfaWYoWyQxXSwgW10sCiAgIFsgZG5sIE5vIHZlcnNpb24gY2hlY2sgaXMgbmVlZGVkLiBGaW5kIGFueSBMdWEgaW50ZXJwcmV0ZXIuCkBAIC0zMDQsNyArMzA1LDcgQEAKICAgICAgICAgYXhfY3ZfbHVhX2x1YWRpcj0iJExVQV9QUkVGSVgvc2hhcmUvbHVhLyRMVUFfVkVSU0lPTiIKIAogICAgICAgICBkbmwgVHJ5IHRvIGZpbmQgYSBwYXRoIHdpdGggdGhlIHByZWZpeC4KLSAgICAgICAgX0FYX0xVQV9GTkRfUFJGWF9QVEgoWyRMVUFdLCBbJGF4X2x1YV9wcmVmaXhdLCBbcGFja2FnZS5wYXRoXSkKKyAgICAgICAgX0FYX0xVQV9GTkRfUFJGWF9QVEgoWyRMVUFdLCBbJGF4X2x1YV9wcmVmaXhdLCBbc2NyaXB0XSkKICAgICAgICAgQVNfSUYoW3Rlc3QgIngkYXhfbHVhX3ByZWZpeGVkX3BhdGgiICE9ICd4J10sCiAgICAgICAgIFsgZG5sIEZpeCB0aGUgcHJlZml4LgogICAgICAgICAgIF9heF9zdHJpcF9wcmVmaXg9YGVjaG8gIiRheF9sdWFfcHJlZml4IiB8ICRTRUQgJ3N8LnwufGcnYApAQCAtMzMxLDcgKzMzMiw3IEBACiAKICAgICAgICAgZG5sIFRyeSB0byBmaW5kIGEgcGF0aCB3aXRoIHRoZSBwcmVmaXguCiAgICAgICAgIF9BWF9MVUFfRk5EX1BSRlhfUFRIKFskTFVBXSwKLSAgICAgICAgICBbJGF4X2x1YV9leGVjX3ByZWZpeF0sIFtwYWNrYWdlLmNwYXRoXSkKKyAgICAgICAgICBbJGF4X2x1YV9leGVjX3ByZWZpeF0sIFttb2R1bGVdKQogICAgICAgICBBU19JRihbdGVzdCAieCRheF9sdWFfcHJlZml4ZWRfcGF0aCIgIT0gJ3gnXSwKICAgICAgICAgWyBkbmwgRml4IHRoZSBwcmVmaXguCiAgICAgICAgICAgX2F4X3N0cmlwX3ByZWZpeD1gZWNobyAiJGF4X2x1YV9leGVjX3ByZWZpeCIgfCAkU0VEICdzfC58LnxnJ2AKQEAgLTQxNSw3ICs0MTYsNyBAQAogWwogICBkbmwgR2V0IHRoZSBzY3JpcHQgb3IgbW9kdWxlIGRpcmVjdG9yeSBieSBxdWVyeWluZyB0aGUgTHVhIGludGVycHJldGVyLAogICBkbmwgZmlsdGVyaW5nIG9uIHRoZSBnaXZlbiBwcmVmaXgsIGFuZCBzZWxlY3RpbmcgdGhlIHNoYWxsb3dlc3QgcGF0aC4gSWYgbm8KLSAgZG5sIHBhdGggIGlzIGZvdW5kIG1hdGNoaW5nIHRoZSBwcmVmaXgsIHRoZSByZXN1bHQgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuCisgIGRubCBwYXRoIGlzIGZvdW5kIG1hdGNoaW5nIHRoZSBwcmVmaXgsIHRoZSByZXN1bHQgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuCiAgIGRubCBUaGUgdGhpcmQgYXJndW1lbnQgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiBzZWFyY2gsIGl0IGNhbiBiZSAnc2NyaXB0JyBvcgogICBkbmwgJ21vZHVsZScuIFN1cHBseWluZyAnc2NyaXB0JyB3aWxsIHBlcmZvcm0gdGhlIHNlYXJjaCB3aXRoIHBhY2thZ2UucGF0aAogICBkbmwgYW5kIExVQV9QQVRILCBhbmQgc3VwcGx5aW5nICdtb2R1bGUnIHdpbGwgc2VhcmNoIHdpdGggcGFja2FnZS5jcGF0aCBhbmQKQEAgLTQzMSw3ICs0MzIsNyBAQAogICAgICAgcGF0aHMgPSAocGFja2FnZSBhbmQgcGFja2FnZS5jcGF0aCkgb3IgTFVBX0NQQVRICiAgICAgZW5kCiAgICAgLS0gc2VhcmNoIGZvciB0aGUgcHJlZml4Ci0gICAgbG9jYWwgcHJlZml4ID0gIiQyIgorICAgIGxvY2FsIHByZWZpeCA9ICInJDInIgogICAgIGxvY2FsIG1pbnBhdGggPSAiIgogICAgIGxvY2FsIG1pbmRlcHRoID0gMWU5CiAgICAgc3RyaW5nLmdzdWIocGF0aHMsICIoQDw6QF47QDo+QCspIiwKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfcHJvZ19kb3RuZXRjb3JlX3ZlcnNpb24ubTQgYi9hY2xvY2FsL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzc0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLm00CkBAIC0wLDAgKzEsNjEgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OKFtWRVJTSU9OXSxbQUNUSU9OLUlGLVRSVUVdLFtBQ1RJT04tSUYtRkFMU0VdKQorIworIyBERVNDUklQVElPTgorIworIyAgIE1ha2VzIHN1cmUgdGhhdCAuTkVUIENvcmUgc3VwcG9ydHMgdGhlIHZlcnNpb24gaW5kaWNhdGVkLiBJZiB0cnVlIHRoZQorIyAgIHNoZWxsIGNvbW1hbmRzIGluIEFDVElPTi1JRi1UUlVFIGFyZSBleGVjdXRlZC4gSWYgbm90IHRoZSBzaGVsbCBjb21tYW5kcworIyAgIGluIEFDVElPTi1JRi1GQUxTRSBhcmUgcnVuLiBUaGUgJGRvdG5ldGNvcmVfdmVyc2lvbiB2YXJpYWJsZSB3aWxsIGJlCisjICAgZmlsbGVkIHdpdGggdGhlIGRldGVjdGVkIHZlcnNpb24uCisjCisjICAgVGhpcyBtYWNybyB1c2VzIHRoZSAkRE9UTkVUQ09SRSB2YXJpYWJsZSB0byBwZXJmb3JtIHRoZSBjaGVjay4gSWYKKyMgICAkRE9UTkVUQ09SRSBpcyBub3Qgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBtYWNybywgdGhlIG1hY3JvIHdpbGwgZmFpbC4KKyMKKyMgICBFeGFtcGxlOgorIworIyAgICAgQUNfUEFUSF9QUk9HKFtET1RORVRDT1JFXSxbZG90bmV0XSkKKyMgICAgIEFDX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OKFsxLjAuMl0sWyAuLi4gXSxbIC4uLiBdKQorIworIyAgIFNlYXJjaGVzIGZvciAuTkVUIENvcmUsIHRoZW4gY2hlY2tzIGlmIGF0IGxlYXN0IHZlcnNpb24gMS4wLjIgaXMKKyMgICBwcmVzZW50LgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDE2IEplbnMgR2V5ZXIgPGplbnNnQGFwYWNoZS5vcmc+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDIKKworQUNfREVGVU4oW0FYX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OXSxbCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19TRURdKQorCisgICAgQVNfSUYoW3Rlc3QgLW4gIiRET1RORVRDT1JFIl0sWworICAgICAgICBheF9kb3RuZXRjb3JlX3ZlcnNpb249IiQxIgorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIC5ORVQgQ29yZSB2ZXJzaW9uXSkKKyAgICAgICAgZG90bmV0Y29yZV92ZXJzaW9uPWAkRE9UTkVUQ09SRSAtLXZlcnNpb24gMj4mMSB8ICRTRUQgLWUgJ3MvXChAPDpAMC05QDo+QCpcLkA8OkAwLTlAOj5AKlwuQDw6QDAtOUA6PkAqXClcKC4qXCkvXDEvJ2AKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkZG90bmV0Y29yZV92ZXJzaW9uKQorCisJICAgIEFDX1NVQlNUKFtET1RORVRDT1JFX1ZFUlNJT05dLFskZG90bmV0Y29yZV92ZXJzaW9uXSkKKworICAgICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWyRheF9kb3RuZXRjb3JlX3ZlcnNpb25dLFtsZV0sWyRkb3RuZXRjb3JlX3ZlcnNpb25dLFsKKwkgICAgOgorICAgICAgICAgICAgJDIKKyAgICAgICAgXSxbCisJICAgIDoKKyAgICAgICAgICAgICQzCisgICAgICAgIF0pCisgICAgXSxbCisgICAgICAgIEFDX01TR19XQVJOKFtjb3VsZCBub3QgZmluZCAuTkVUIENvcmVdKQorICAgICAgICAkMworICAgIF0pCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9wcm9nX2hheGVfdmVyc2lvbi5tNCBiL2FjbG9jYWwvYXhfcHJvZ19oYXhlX3ZlcnNpb24ubTQKaW5kZXggM2RlZTQzMC4uZmNhY2M2NyAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9wcm9nX2hheGVfdmVyc2lvbi5tNAorKysgYi9hY2xvY2FsL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLm00CkBAIC0xLDUgKzEsNSBAQAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9wcm9nX2hheGVfdmVyc2lvbi5odG1sCisjICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLmh0bWwKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCkBAIC0zMiw3ICszMiw3IEBACiAjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQogIyAgIHdhcnJhbnR5LgogCi0jc2VyaWFsIDEKKyNzZXJpYWwgMgogCiBBQ19ERUZVTihbQVhfUFJPR19IQVhFX1ZFUlNJT05dLFsKICAgICBBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00IGIvYWNsb2NhbC9heF9wcm9nX3BlcmxfbW9kdWxlcy5tNAppbmRleCAxMWEzMjZjLi43MGIzMjMwIDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00CisrKyBiL2FjbG9jYWwvYXhfcHJvZ19wZXJsX21vZHVsZXMubTQKQEAgLTEsNSArMSw1IEBACiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfcGVybF9tb2R1bGVzLmh0bWwKKyMgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHJvZ19wZXJsX21vZHVsZXMuaHRtbAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMKICMgU1lOT1BTSVMKQEAgLTMyLDcgKzMyLDcgQEAKICMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CiAjICAgd2FycmFudHkuCiAKLSNzZXJpYWwgNworI3NlcmlhbCA4CiAKIEFVX0FMSUFTKFtBQ19QUk9HX1BFUkxfTU9EVUxFU10sIFtBWF9QUk9HX1BFUkxfTU9EVUxFU10pCiBBQ19ERUZVTihbQVhfUFJPR19QRVJMX01PRFVMRVNdLFtkbmwKZGlmZiAtLWdpdCBhL2FjbG9jYWwvbTRfYXhfY29tcGFyZV92ZXJzaW9uLm00IGIvYWNsb2NhbC9tNF9heF9jb21wYXJlX3ZlcnNpb24ubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZGMwZmQuLjAwMDAwMDAKLS0tIGEvYWNsb2NhbC9tNF9heF9jb21wYXJlX3ZlcnNpb24ubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY29tcGFyZV92ZXJzaW9uLmh0bWwKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIFNZTk9QU0lTCi0jCi0jICAgQVhfQ09NUEFSRV9WRVJTSU9OKFZFUlNJT05fQSwgT1AsIFZFUlNJT05fQiwgW0FDVElPTi1JRi1UUlVFXSwgW0FDVElPTi1JRi1GQUxTRV0pCi0jCi0jIERFU0NSSVBUSU9OCi0jCi0jICAgVGhpcyBtYWNybyBjb21wYXJlcyB0d28gdmVyc2lvbiBzdHJpbmdzLiBEdWUgdG8gdGhlIHZhcmlvdXMgbnVtYmVyIG9mCi0jICAgbWlub3ItdmVyc2lvbiBudW1iZXJzIHRoYXQgY2FuIGV4aXN0LCBhbmQgdGhlIGZhY3QgdGhhdCBzdHJpbmcKLSMgICBjb21wYXJpc29ucyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBudW1lcmljIGNvbXBhcmlzb25zLCB0aGlzIGlzIG5vdAotIyAgIG5lY2Vzc2FyaWx5IHRyaXZpYWwgdG8gZG8gaW4gYSBhdXRvY29uZiBzY3JpcHQuIFRoaXMgbWFjcm8gbWFrZXMgZG9pbmcKLSMgICB0aGVzZSBjb21wYXJpc29ucyBlYXN5LgotIwotIyAgIFRoZSBzaXggYmFzaWMgY29tcGFyaXNvbnMgYXJlIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyBjaGVja2luZyBlcXVhbGl0eQotIyAgIGxpbWl0ZWQgdG8gYSBjZXJ0YWluIG51bWJlciBvZiBtaW5vci12ZXJzaW9uIGxldmVscy4KLSMKLSMgICBUaGUgb3BlcmF0b3IgT1AgZGV0ZXJtaW5lcyB3aGF0IHR5cGUgb2YgY29tcGFyaXNvbiB0byBkbywgYW5kIGNhbiBiZSBvbmUKLSMgICBvZjoKLSMKLSMgICAgZXEgIC0gZXF1YWwgKHRlc3QgQSA9PSBCKQotIyAgICBuZSAgLSBub3QgZXF1YWwgKHRlc3QgQSAhPSBCKQotIyAgICBsZSAgLSBsZXNzIHRoYW4gb3IgZXF1YWwgKHRlc3QgQSA8PSBCKQotIyAgICBnZSAgLSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgKHRlc3QgQSA+PSBCKQotIyAgICBsdCAgLSBsZXNzIHRoYW4gKHRlc3QgQSA8IEIpCi0jICAgIGd0ICAtIGdyZWF0ZXIgdGhhbiAodGVzdCBBID4gQikKLSMKLSMgICBBZGRpdGlvbmFsbHksIHRoZSBlcSBhbmQgbmUgb3BlcmF0b3IgY2FuIGhhdmUgYSBudW1iZXIgYWZ0ZXIgaXQgdG8gbGltaXQKLSMgICB0aGUgdGVzdCB0byB0aGF0IG51bWJlciBvZiBtaW5vciB2ZXJzaW9ucy4KLSMKLSMgICAgZXEwIC0gZXF1YWwgdXAgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciB2ZXJzaW9uCi0jICAgIG5lMCAtIG5vdCBlcXVhbCB1cCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24KLSMgICAgZXFOIC0gZXF1YWwgdXAgdG8gTiBzdWItdmVyc2lvbiBsZXZlbHMKLSMgICAgbmVOIC0gbm90IGVxdWFsIHVwIHRvIE4gc3ViLXZlcnNpb24gbGV2ZWxzCi0jCi0jICAgV2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWUsIHNoZWxsIGNvbW1hbmRzIEFDVElPTi1JRi1UUlVFIGFyZSBydW4sCi0jICAgb3RoZXJ3aXNlIHNoZWxsIGNvbW1hbmRzIEFDVElPTi1JRi1GQUxTRSBhcmUgcnVuLiBUaGUgZW52aXJvbm1lbnQKLSMgICB2YXJpYWJsZSAnYXhfY29tcGFyZV92ZXJzaW9uJyBpcyBhbHdheXMgc2V0IHRvIGVpdGhlciAndHJ1ZScgb3IgJ2ZhbHNlJwotIyAgIGFzIHdlbGwuCi0jCi0jICAgRXhhbXBsZXM6Ci0jCi0jICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2x0XSxbMy4xNS44XSkKLSMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNV0sW2x0XSxbMy4xNS44XSkKLSMKLSMgICB3b3VsZCBib3RoIGJlIHRydWUuCi0jCi0jICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2VxXSxbMy4xNS44XSkKLSMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNV0sW2d0XSxbMy4xNS44XSkKLSMKLSMgICB3b3VsZCBib3RoIGJlIGZhbHNlLgotIwotIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtlcTJdLFszLjE1LjhdKQotIwotIyAgIHdvdWxkIGJlIHRydWUgYmVjYXVzZSBpdCBpcyBvbmx5IGNvbXBhcmluZyB0d28gbWlub3IgdmVyc2lvbnMuCi0jCi0jICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2VxMF0sWzMuMTVdKQotIwotIyAgIHdvdWxkIGJlIHRydWUgYmVjYXVzZSBpdCBpcyBvbmx5IGNvbXBhcmluZyB0aGUgbGVzc2VyIG51bWJlciBvZiBtaW5vcgotIyAgIHZlcnNpb25zIG9mIHRoZSB0d28gdmFsdWVzLgotIwotIyAgIE5vdGU6IFRoZSBjaGFyYWN0ZXJzIHRoYXQgc2VwYXJhdGUgdGhlIHZlcnNpb24gbnVtYmVycyBkbyBub3QgbWF0dGVyLiBBbgotIyAgIGVtcHR5IHN0cmluZyBpcyB0aGUgc2FtZSBhcyB2ZXJzaW9uIDAuIE9QIGlzIGV2YWx1YXRlZCBieSBhdXRvY29uZiwgbm90Ci0jICAgY29uZmlndXJlLCBzbyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgYSB2YXJpYWJsZS4KLSMKLSMgICBUaGUgYXV0aG9yIHdvdWxkIGxpa2UgdG8gYWNrbm93bGVkZ2UgR3VpZG8gRHJhaGVpbSB3aG9zZSBhZHZpY2UgYWJvdXQKLSMgICB0aGUgbTRfY2FzZSBhbmQgbTRfaWZ2YWxuIGZ1bmN0aW9ucyBtYWtlIHRoaXMgbWFjcm8gb25seSBpbmNsdWRlIHRoZQotIyAgIHBvcnRpb25zIG5lY2Vzc2FyeSB0byBwZXJmb3JtIHRoZSBzcGVjaWZpYyBjb21wYXJpc29uIHNwZWNpZmllZCBieSB0aGUKLSMgICBPUCBhcmd1bWVudCBpbiB0aGUgZmluYWwgY29uZmlndXJlIHNjcmlwdC4KLSMKLSMgTElDRU5TRQotIwotIyAgIENvcHlyaWdodCAoYykgMjAwOCBUaW0gVG9vbGFuIDx0b29sYW5AZWxlLnVyaS5lZHU+Ci0jCi0jICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCi0jICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCi0jICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQotIyAgIHdhcnJhbnR5LgotCi0jc2VyaWFsIDExCi0KLWRubCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BQ19ERUZVTihbQVhfQ09NUEFSRV9WRVJTSU9OXSwgWwotICBBQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pCi0KLSAgIyBVc2VkIHRvIGluZGljYXRlIHRydWUgb3IgZmFsc2UgY29uZGl0aW9uCi0gIGF4X2NvbXBhcmVfdmVyc2lvbj1mYWxzZQotCi0gICMgQ29udmVydCB0aGUgdHdvIHZlcnNpb24gc3RyaW5ncyB0byBiZSBjb21wYXJlZCBpbnRvIGEgZm9ybWF0IHRoYXQKLSAgIyBhbGxvd3MgYSBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb24uICBUaGUgZW5kIHJlc3VsdCBpcyB0aGF0IGEgdmVyc2lvbgotICAjIHN0cmluZyBvZiB0aGUgZm9ybSAxLjEyLjUtcjYxNyB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgZm9ybQotICAjIDAwMDEwMDEyMDAwNTA2MTcuICBJbiBvdGhlciB3b3JkcywgZWFjaCBudW1iZXIgaXMgemVybyBwYWRkZWQgdG8gZm91cgotICAjIGRpZ2l0cywgYW5kIG5vbiBkaWdpdHMgYXJlIHJlbW92ZWQuCi0gIEFTX1ZBUl9QVVNIREVGKFtBXSxbYXhfY29tcGFyZV92ZXJzaW9uX0FdKQotICBBPWBlY2hvICIkMSIgfCBzZWQgLWUgJ3MvXChbWzAtOV1dKlwpL1pcMVovZycgXAotICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVwpWi9aMFwxWi9nJyBcCi0gICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCi0gICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAotICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvW1teMC05XV0vL2cnYAotCi0gIEFTX1ZBUl9QVVNIREVGKFtCXSxbYXhfY29tcGFyZV92ZXJzaW9uX0JdKQotICBCPWBlY2hvICIkMyIgfCBzZWQgLWUgJ3MvXChbWzAtOV1dKlwpL1pcMVovZycgXAotICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVwpWi9aMFwxWi9nJyBcCi0gICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCi0gICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAotICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvW1teMC05XV0vL2cnYAotCi0gIGRubCAjIEluIHRoZSBjYXNlIG9mIGxlLCBnZSwgbHQsIGFuZCBndCwgdGhlIHN0cmluZ3MgYXJlIHNvcnRlZCBhcyBuZWNlc3NhcnkKLSAgZG5sICMgdGhlbiB0aGUgZmlyc3QgbGluZSBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUuCi0gIGRubCAjIFRoZSBzZWQgcmlnaHQgYWZ0ZXIgdGhlIGVjaG8gaXMgdG8gcmVtb3ZlIGFueSBpbmRlbnRlZCB3aGl0ZSBzcGFjZS4KLSAgbTRfY2FzZShtNF90b2xvd2VyKCQyKSwKLSAgW2x0XSxbCi0gICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKLXgkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCAtciB8IHNlZCAicy94JHtBfS9mYWxzZS87cy94JHtCfS90cnVlLzsxcSJgCi0gIF0sCi0gIFtndF0sWwotICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCi14JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgfCBzZWQgInMveCR7QX0vZmFsc2UvO3MveCR7Qn0vdHJ1ZS87MXEiYAotICBdLAotICBbbGVdLFsKLSAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoteCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IHwgc2VkICJzL3gke0F9L3RydWUvO3MveCR7Qn0vZmFsc2UvOzFxImAKLSAgXSwKLSAgW2dlXSxbCi0gICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKLXgkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCAtciB8IHNlZCAicy94JHtBfS90cnVlLztzL3gke0J9L2ZhbHNlLzsxcSJgCi0gIF0sWwotICAgIGRubCBTcGxpdCB0aGUgb3BlcmF0b3IgZnJvbSB0aGUgc3VidmVyc2lvbiBjb3VudCBpZiBwcmVzZW50LgotICAgIG00X2JtYXRjaChtNF9zdWJzdHIoJDIsMiksCi0gICAgWzBdLFsKLSAgICAgICMgQSBjb3VudCBvZiB6ZXJvIG1lYW5zIHVzZSB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24uCi0gICAgICAjIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gQSBhbmQgQi4KLSAgICAgIGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQT1gZWNobyAiJEEiIHwgJEFXSyAne3ByaW50KGxlbmd0aCl9J2AKLSAgICAgIGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQj1gZWNobyAiJEIiIHwgJEFXSyAne3ByaW50KGxlbmd0aCl9J2AKLQotICAgICAgIyBTZXQgQSB0byBubyBtb3JlIHRoYW4gQidzIGxlbmd0aCBhbmQgQiB0byBubyBtb3JlIHRoYW4gQSdzIGxlbmd0aC4KLSAgICAgIEE9YGVjaG8gIiRBIiB8IHNlZCAicy9cKC5ceyRheF9jb21wYXJlX3ZlcnNpb25fbGVuX0JcfVwpLiovXDEvImAKLSAgICAgIEI9YGVjaG8gIiRCIiB8IHNlZCAicy9cKC5ceyRheF9jb21wYXJlX3ZlcnNpb25fbGVuX0FcfVwpLiovXDEvImAKLSAgICBdLAotICAgIFtbMC05XStdLFsKLSAgICAgICMgQSBjb3VudCBncmVhdGVyIHRoYW4gemVybyBtZWFucyB1c2Ugb25seSB0aGF0IG1hbnkgc3VidmVyc2lvbnMKLSAgICAgIEE9YGVjaG8gIiRBIiB8IHNlZCAicy9cKFwoW1swLTldXVx7NFx9XClce200X3N1YnN0cigkMiwyKVx9XCkuKi9cMS8iYAotICAgICAgQj1gZWNobyAiJEIiIHwgc2VkICJzL1woXChbWzAtOV1dXHs0XH1cKVx7bTRfc3Vic3RyKCQyLDIpXH1cKS4qL1wxLyJgCi0gICAgXSwKLSAgICBbLitdLFsKLSAgICAgIEFDX1dBUk5JTkcoCi0gICAgICAgIFtpbGxlZ2FsIE9QIG51bWVyaWMgcGFyYW1ldGVyOiAkMl0pCi0gICAgXSxbXSkKLQotICAgICMgUGFkIHplcm9zIGF0IGVuZCBvZiBudW1iZXJzIHRvIG1ha2Ugc2FtZSBsZW5ndGguCi0gICAgYXhfY29tcGFyZV92ZXJzaW9uX3RtcF9BPSIkQWBlY2hvICRCIHwgc2VkICdzLy4vMC9nJ2AiCi0gICAgQj0iJEJgZWNobyAkQSB8IHNlZCAncy8uLzAvZydgIgotICAgIEE9IiRheF9jb21wYXJlX3ZlcnNpb25fdG1wX0EiCi0KLSAgICAjIENoZWNrIGZvciBlcXVhbGl0eSBvciBpbmVxdWFsaXR5IGFzIG5lY2Vzc2FyeS4KLSAgICBtNF9jYXNlKG00X3RvbG93ZXIobTRfc3Vic3RyKCQyLDAsMikpLAotICAgIFtlcV0sWwotICAgICAgdGVzdCAieCRBIiA9ICJ4JEIiICYmIGF4X2NvbXBhcmVfdmVyc2lvbj10cnVlCi0gICAgXSwKLSAgICBbbmVdLFsKLSAgICAgIHRlc3QgIngkQSIgIT0gIngkQiIgJiYgYXhfY29tcGFyZV92ZXJzaW9uPXRydWUKLSAgICBdLFsKLSAgICAgIEFDX1dBUk5JTkcoW2lsbGVnYWwgT1AgcGFyYW1ldGVyOiAkMl0pCi0gICAgXSkKLSAgXSkKLQotICBBU19WQVJfUE9QREVGKFtBXSlkbmwKLSAgQVNfVkFSX1BPUERFRihbQl0pZG5sCi0KLSAgZG5sICMgRXhlY3V0ZSBBQ1RJT04tSUYtVFJVRSAvIEFDVElPTi1JRi1GQUxTRS4KLSAgaWYgdGVzdCAiJGF4X2NvbXBhcmVfdmVyc2lvbiIgPSAidHJ1ZSIgOyB0aGVuCi0gICAgbTRfaWZ2YWxuKFskNF0sWyQ0XSxbOl0pZG5sCi0gICAgbTRfaWZ2YWxuKFskNV0sW2Vsc2UgJDVdKWRubAotICBmaQotXSkgZG5sIEFYX0NPTVBBUkVfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvYXBwdmV5b3IueW1sIGIvYXBwdmV5b3IueW1sCmluZGV4IDBjNWJmZGYuLjc0YzkyZjEgMTAwNzU1Ci0tLSBhL2FwcHZleW9yLnltbAorKysgYi9hcHB2ZXlvci55bWwKQEAgLTEsMyArMSw0IEBACisjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KQEAgLTE4LDM2ICsxOSw5MiBAQAogCiAjIGJ1aWxkIEFwYWNoZSBUaHJpZnQgb24gQXBwVmV5b3IgLSBodHRwczovL2NpLmFwcHZleW9yLmNvbQogCi12ZXJzaW9uOiAne2J1aWxkfScKK3ZlcnNpb246ICcwLjEzLjAue2J1aWxkfScKKworc2hhbGxvd19jbG9uZTogdHJ1ZQorCiticmFuY2hlczoKKyAgb25seToKKyAgICAtIG1hc3RlcgorICAgIC0gL14ocmVsZWFzZS8pP1xkK1wuXGQrXC5cZCskLworCiBvczoKLS0gV2luZG93cyBTZXJ2ZXIgMjAxMiBSMgotLSBWaXN1YWwgU3R1ZGlvIDIwMTQgQ1RQNAotLSBWaXN1YWwgU3R1ZGlvIDIwMTUgQ1RQCi0tIFZpc3VhbCBTdHVkaW8gMjAxNSBDVFAgNgotLSBWaXN1YWwgU3R1ZGlvIDIwMTUgUHJldmlldworICAtIFZpc3VhbCBTdHVkaW8gMjAxNworCittYXRyaXg6CisgIGZhc3RfZmluaXNoOiB0cnVlCiAKIGVudmlyb25tZW50OgotICBCT09TVF9ST09UOiBjOlxMaWJyYXJpZXNcYm9vc3QKLSAgQk9PU1RfTElCUkFSWURJUjogYzpcTGlicmFyaWVzXGJvb3N0XHN0YWdlXGxpYgorICBtYXRyaXg6CisgICAtIFBST0ZJTEU6IE1TVkMyMDE3CisgICAgIFBMQVRGT1JNOiB4NjQKKyAgICAgQ09ORklHVVJBVElPTjogUmVsZWFzZQorICAgICBCVUlMRF9TSEFSRURfTElCUzogT04KKyAgICAgQk9PU1RfVkVSU0lPTjogMS42Ny4wCisgICAgIExJQkVWRU5UX1ZFUlNJT046IDIuMS44CisgICAgIFBZVEhPTl9WRVJTSU9OOiAzLjYKKyAgICAgUVRfVkVSU0lPTjogNS4xMAorICAgICBaTElCX1ZFUlNJT046IDEuMi4xMQorICAgICBESVNBQkxFRF9URVNUUzogKFN0cmVzc1Rlc3ROb25CbG9ja2luZykKKworICAgLSBQUk9GSUxFOiBNU1ZDMjAxNQorICAgICBQTEFURk9STTogeDg2CisgICAgIENPTkZJR1VSQVRJT046IERlYnVnCisgICAgIEJVSUxEX1NIQVJFRF9MSUJTOiBPRkYKKyAgICAgQk9PU1RfVkVSU0lPTjogMS42Mi4wCisgICAgIExJQkVWRU5UX1ZFUlNJT046IDIuMC4yMgorICAgICBQWVRIT05fVkVSU0lPTjogMy41CisgICAgIFFUX1ZFUlNJT046IDUuOAorICAgICBaTElCX1ZFUlNJT046IDEuMi44CisgICAgIERJU0FCTEVEX1RFU1RTOiAoU3RyZXNzVGVzdE5vbkJsb2NraW5nKQorICAgICBBUFBWRVlPUl9CVUlMRF9XT1JLRVJfSU1BR0U6IFZpc3VhbCBTdHVkaW8gMjAxNQorCisgICAtIFBST0ZJTEU6IE1JTkdXCisgICAgIFBMQVRGT1JNOiB4NjQKKyAgICAgQ09ORklHVVJBVElPTjogUmVsV2l0aERlYkluZm8KKyAgICAgRElTQUJMRURfVEVTVFM6IChTdHJlc3NUZXN0Tm9uQmxvY2tpbmcpCisKKyAgIC0gUFJPRklMRTogQ1lHV0lOCisgICAgIFBMQVRGT1JNOiB4NjQKKyAgICAgQ09ORklHVVJBVElPTjogUmVsV2l0aERlYkluZm8KKyAgICAgRElTQUJMRURfVEVTVFM6IChabGliVGVzdHxPcGVuU1NMTWFudWFsSW5pdFRlc3R8VE5vbmJsb2NraW5nU2VydmVyVGVzdHxTdHJlc3NUZXN0Tm9uQmxvY2tpbmcpCiAKIGluc3RhbGw6Ci0tIGNpbnN0IGNtYWtlCi0tIGNpbnN0IG5zaXMKLS0gY2luc3QgYW50Ci0tIGNpbnN0IHdpbmZsZXhiaXNvbgorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gY2FsbCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci1pbnN0YWxsLmJhdAorICAtIHJlZnJlc2hlbnYKIAogYnVpbGRfc2NyaXB0OgotLSBzZXQgUEFUSD1DOlxQcm9ncmFtRGF0YVxjaG9jb2xhdGV5XGJpbjtDOlx0b29sc1xhcGFjaGUtYW50LTEuOS40XGJpbjslUEFUSCUKLS0gbXYgQzpcUHJvZ3JhbURhdGFcY2hvY29sYXRleVxiaW5cd2luX2Jpc29uLmV4ZSBDOlxQcm9ncmFtRGF0YVxjaG9jb2xhdGV5XGJpblxiaXNvbi5leGUKLS0gbXYgQzpcUHJvZ3JhbURhdGFcY2hvY29sYXRleVxiaW5cd2luX2ZsZXguZXhlIEM6XFByb2dyYW1EYXRhXGNob2NvbGF0ZXlcYmluXGZsZXguZXhlCi0tIHNldCBKQVZBX0hPTUU9QzpcUHJvZ3JhbSBGaWxlc1xKYXZhXGpkazEuNy4wCi0tIHNldCBQQVRIPSVKQVZBX0hPTUUlXGJpbjslUEFUSCUKLS0gbWtkaXIgY21ha2UtYnVpbGQKLS0gY2QgY21ha2UtYnVpbGQKLS0gY21ha2UgLURCVUlMRF9URVNUSU5HPU9GRiAuLgotLSBjbWFrZSAtLWJ1aWxkIC4KLS0gY21ha2UgLS1idWlsZCAuIC0tY29uZmlnIFJlbGVhc2UKLS0gY3BhY2sKKyAgLSBjZCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorICAtIGNhbGwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItYnVpbGQuYmF0CiAKLSNUT0RPIGVuYWJsZSB0ZXN0aW5nCi0jVE9ETyBtYWtlIGl0IHBlcmZlY3QgOy1yCit0ZXN0X3NjcmlwdDoKKyAgLSBjZCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorICAtIGNhbGwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItdGVzdC5iYXQKKworCisjIGFydGlmYWN0IGNhcHR1cmUgZGlzYWJsZWQgYXMgaXQgbWlnaHQgaW5jcmVhc2Ugc2VydmljZSBjb3N0IGZvciBsaXR0bGUgZ2FpbjoKKyMKKyMgYXJ0aWZhY3RzOgorIyAgLSBwYXRoOiBsb2NhbC10aHJpZnQtaW5zdAorIyAgICBuYW1lOiBjbWFrZSBpbnN0YWxsZWQgY29udGVudAorIyAgICB0eXBlOiB6aXAKKyMKKyMgIC0gcGF0aDogbG9jYWwtdGhyaWZ0LWJ1aWxkXFRlc3RpbmcKKyMgICAgbmFtZTogY3Rlc3Qgb3V0cHV0CisjICAgIHR5cGU6IHppcAorCisjIFJEUCBzdXBwb3J0OiB1c2Ugb25lIG9yIHRoZSBvdGhlci4uLgorIworIyBlbmFibGVzIFJEUCBmb3IgZWFjaCBidWlsZCBqb2Igc28geW91IGNhbiBpbnNwZWN0IHRoZSBlbnZpcm9ubWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBqb2I6CisjIGluaXQ6CisjICAtIHBzOiBpZXggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLkRvd25sb2FkU3RyaW5nKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBwdmV5b3IvY2kvbWFzdGVyL3NjcmlwdHMvZW5hYmxlLXJkcC5wczEnKSkKKyMKKyMgZW5hYmxlcyBSRFAgYXQgdGhlIGVuZCBvZiB0aGUgYnVpbGQgam9iIHNvIHlvdSBjYW4gbG9naW4gYW5kIHJlLXJ1bgorIyBjb21tYW5kcyB0byBzZWUgd2h5IHNvbWV0aGluZyBmYWlsZWQuLi4KKyMgb25fZmluaXNoOgorIyAgIC0gcHM6ICRibG9ja1JkcCA9ICR0cnVlOyBpZXggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLkRvd25sb2FkU3RyaW5nKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBwdmV5b3IvY2kvbWFzdGVyL3NjcmlwdHMvZW5hYmxlLXJkcC5wczEnKSkKKyMKKyMgYWxzbyBuZWVkOgorIyBlbnZpcm9ubWVudDoKKyMgICBBUFBWRVlPUl9SRFBfUEFTU1dPUkQ6IHRocjFGVDIzNDUkeHl6WgpkaWZmIC0tZ2l0IGEvYm9vdHN0cmFwLnNoIGIvYm9vdHN0cmFwLnNoCmluZGV4IDUyZWNkYTQuLjE5ODk0MzcgMTAwNzU1Ci0tLSBhL2Jvb3RzdHJhcC5zaAorKysgYi9ib290c3RyYXAuc2gKQEAgLTE5LDcgKzE5LDEwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0uL2NsZWFudXAuc2gKK2VjaG8gLW4gIm1ha2UgZGlzdGNsZWFuLi4uICIKK21ha2UgLWsgZGlzdGNsZWFuID4vZGV2L251bGwgMj4mMQorZWNobyAib2siCisKIGlmIHRlc3QgLWQgbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbCA7IHRoZW4KICAgICBpZiBwaHBpemUgLXYgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCA7IHRoZW4KICAgICAgICAgKGNkIGxpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wgJiYgcGhwaXplKQpAQCAtMzgsMTcgKzQxLDI0IEBACiAgIGV4aXQgMQogZmkKIAorZm9ybWF0X3ZlcnNpb24gKCkgeworICAgIHByaW50ZiAiJTAzZCUwM2QlMDNkJTAzZCIgJChlY2hvICQxIHwgdHIgJy4nICcgJyk7Cit9CisKICMgd2UgcmVxdWlyZSBhdXRvbWFrZSAxLjEzIG9yIGxhdGVyCiAjIGNoZWNrIG11c3QgaGFwcGVuIGV4dGVybmFsbHkgZHVlIHRvIHVzZSBvZiBuZXdlciBtYWNybwogQVVUT01BS0VfVkVSU0lPTj1gYXV0b21ha2UgLS12ZXJzaW9uIHwgZ3JlcCBhdXRvbWFrZSB8IGVncmVwIC1vICcoWzAtOV17MSx9XC4pK1swLTldezEsfSdgCi1pZiBbICIkQVVUT01BS0VfVkVSU0lPTiIgXDwgIjEuMTMiIF07IHRoZW4KK2lmICBbICQoZm9ybWF0X3ZlcnNpb24gJEFVVE9NQUtFX1ZFUlNJT04pIC1sdCAkKGZvcm1hdF92ZXJzaW9uIDEuMTMpIF07IHRoZW4KICAgZWNobyA+JjIgImF1dG9tYWtlIHZlcnNpb24gJEFVVE9NQUtFX1ZFUlNJT04gaXMgdG9vIG9sZCAobmVlZCAxLjEzIG9yIGxhdGVyKSIKICAgZXhpdCAxCiBmaQogCitzZXQgLWUKIGF1dG9zY2FuCiAkTElCVE9PTElaRSAtLWNvcHkgLS1hdXRvbWFrZQogYWNsb2NhbCAtSSAuL2FjbG9jYWwKIGF1dG9oZWFkZXIKK3NlZCAnL3VuZGVmIFZFUlNJT04vZCcgY29uZmlnLmhpbiA+IGNvbmZpZy5oaW4yCittdiBjb25maWcuaGluMiBjb25maWcuaGluCiBhdXRvY29uZgogYXV0b21ha2UgLS1jb3B5IC0tYWRkLW1pc3NpbmcgLS1mb3JlaWduCmRpZmYgLS1naXQgYS9ib3dlci5qc29uIGIvYm93ZXIuanNvbgppbmRleCBlMDYxMmUzLi5jNjAyYWYxIDEwMDY0NAotLS0gYS9ib3dlci5qc29uCisrKyBiL2Jvd2VyLmpzb24KQEAgLTEsNyArMSw3IEBACiB7CiAgICJuYW1lIjogInRocmlmdCIsCi0gICJ2ZXJzaW9uIjogIjAuOS4zIiwKLSAgImhvbWVwYWdlIjogImh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IiwKKyAgInZlcnNpb24iOiAiMC4xMy4wIiwKKyAgImhvbWVwYWdlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIsCiAgICJhdXRob3JzIjogWwogICAgICJBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IgogICBdLApAQCAtMTEsNiArMTEsNSBAQAogICAgICJ0aHJpZnQiCiAgIF0sCiAgICJsaWNlbnNlIjogIkFwYWNoZSB2MiIsCi0gICJpZ25vcmUiOiBbCi0gIF0KKyAgImlnbm9yZSI6IFtdCiB9CmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWJ1aWxkLmJhdCBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItYnVpbGQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzMyODcKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWJ1aWxkLmJhdApAQCAtMCwwICsxLDM1IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9idWlsZC5iYXQgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitTRVQgQ01BS0VBUkdTPV4KKyAgLUcnJUdFTkVSQVRPUiUnIF4KKyAgLURDTUFLRV9CVUlMRF9UWVBFPSVDT05GSUdVUkFUSU9OJSBeCisgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9JUlOU1RESVIlIF4KKyAgLURDTUFLRV9DWFhfRkxBR1M9Ii1EX0dOVV9TT1VSQ0UiIF4KKyAgLURXSVRIX0pBVkE9T0ZGIF4KKyAgLURXSVRIX1BZVEhPTj1PRkYKKworOjogLURDTUFLRV9DWFhfRVhURU5TSU9OUz1PTiBeCis6OiAtRENNQUtFX0NYWF9TVEFOREFSRD0xMSBeCisKK0BFQ0hPIE9OCislQkFTSCUgLWxjICJta2RpciAtcCAlQlVJTERESVIlICYmIGNkICVCVUlMRERJUiUgJiYgY21ha2UuZXhlICVTUkNESVIlICVDTUFLRUFSR1MlICYmIGNtYWtlIC0tYnVpbGQgLiAtLWNvbmZpZyAlQ09ORklHVVJBVElPTiUgLS10YXJnZXQgaW5zdGFsbCIgfHwgRVhJVCAvQgorQEVDSE8gT0ZGCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWluc3RhbGwuYmF0IGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1pbnN0YWxsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjcxMmIyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1pbnN0YWxsLmJhdApAQCAtMCwwICsxLDUwIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogQXBwdmV5b3IgaW5zdGFsbCBzY3JpcHQgZm9yIENZR1dJTgorOjogSW5zdGFsbHMgdGhpcmQgcGFydHkgcGFja2FnZXMgd2UgbmVlZCBmb3IgYSBjbWFrZSBidWlsZAorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9pbnN0YWxsLmJhdCAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2hvd2Vudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6Cis6OiBVcGdyYWRlcyBjeWd3aW4gdG8gdGhlIGxhdGVzdCwgaWYgeW91IHdhbnQuLi4KKzo6Cis6OiBhcHB2ZXlvciBEb3dubG9hZEZpbGUgImh0dHBzOi8vY3lnd2luLmNvbS9zZXR1cC14ODZfNjQuZXhlIgorOjogc2V0dXAteDg2XzY0LmV4ZSAtLXF1aWV0LW1vZGUgLS13YWl0IC0tdXBncmFkZS1hbHNvIC0tcGFja2FnZXM9ImdjYy1nKysiCisKKzo6Cis6OiBJbnN0YWxsIGFwdC1jeWcgZm9yIHBhY2thZ2UgbWFuYWdlbWVudAorOjoKKworJUJBU0glIC1sYyAid2dldCByYXdnaXQuY29tL3RyYW5zY29kZS1vcGVuL2FwdC1jeWcvbWFzdGVyL2FwdC1jeWcgJiYgaW5zdGFsbCBhcHQtY3lnIC9iaW4gJiYgcm0gLWYgYXB0LWN5ZyIgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAiYXB0LWN5ZyB1cGRhdGUiIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgImFwdC1jeWcgaW5zdGFsbCBiaXNvbiBjbWFrZSBmbGV4IGdjYy1nKysgbGliYm9vc3QtZGV2ZWwgbGliZXZlbnQtZGV2ZWwgbWFrZSBvcGVuc3NsLWRldmVsIHh6IHpsaWItZGV2ZWwiCisKKzo6Cis6OiBXZSBuZWVkIGEgbmV3ZXIgdmVyc2lvbiBvZiBjbWFrZSwgdGhlIG9uZSBjeWd3aW4gcHJvdmlkZXMgaXMgdG9vIG9sZAorOjogdG8gcmVjb2duaXplIHRoZSB2ZXJzaW9uIG9mIGJvb3N0LiAgTHVja2lseSB0aGVyZSBpcyBhIHByZS1yZWxlYXNlCis6OiBvbmUgYXZhaWxhYmxlLCBob3dldmVyIGN5Z3dpbidzIG93biBzZXR1cCBwcm9ncmFtIGhhcyBubyBjb21tYW5kIGxpbmUKKzo6IG9wdGlvbiB0byBhbGxvdyBhY2Nlc3MgdG8gdGVzdCBwYWNrYWdlcyEKKzo6CisKKyVCQVNIJSAtbGMgImFwdC1jeWcgcmVtb3ZlIGNtYWtlIgorJUJBU0glIC1sYyAiY2QgLyAmJiB3Z2V0IGh0dHA6Ly9taXJyb3IuY2xhcmtzb24uZWR1L2N5Z3dpbi94ODZfNjQvcmVsZWFzZS9jbWFrZS9jbWFrZS0zLjEzLjEtMS50YXIueHogJiYgdGFyIHhKZiBjbWFrZS0zLjEzLjEtMS50YXIueHogJiYgaGFzaCAtciAmJiBjbWFrZSAtLXZlcnNpb24iCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLXRlc3QuYmF0IGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci10ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjY3ZjliCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci10ZXN0LmJhdApAQCAtMCwwICsxLDIxIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl90ZXN0LmJhdCAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworJUJBU0glIC1sYyAiY2QgJUJVSUxERElSJSAmJiBjdGVzdC5leGUgLUMgJUNPTkZJR1VSQVRJT04lIC0tdGltZW91dCAzMDAgLVZWIC1FICclRElTQUJMRURfVEVTVFMlJyIgfHwgRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1idWlsZC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLWJ1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWM2NWY4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1idWlsZC5iYXQKQEAgLTAsMCArMSwzNCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfYnVpbGQuYmF0ICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworU0VUIENNQUtFQVJHUz1eCisgIC1HJyVHRU5FUkFUT1IlJyBeCisgIC1EQ01BS0VfQlVJTERfVFlQRT0lQ09ORklHVVJBVElPTiUgXgorICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVJTlNURElSJSBeCisgIC1EQ01BS0VfTUFLRV9QUk9HUkFNPS9taW5ndyVOT1JNX1BMQVRGT1JNJS9iaW4vbWluZ3czMi1tYWtlIF4KKyAgLURDTUFLRV9DX0NPTVBJTEVSPS9taW5ndyVOT1JNX1BMQVRGT1JNJS9iaW4vZ2NjLmV4ZSBeCisgIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPS9taW5ndyVOT1JNX1BMQVRGT1JNJS9iaW4vZysrLmV4ZSBeCisgIC1ET1BFTlNTTF9ST09UX0RJUj0vbWluZ3clTk9STV9QTEFURk9STSUgXgorICAtRFdJVEhfUFlUSE9OPU9GRgorCitARUNITyBPTgorJUJBU0glIC1sYyAibWtkaXIgLXAgJUJVSUxERElSJSAmJiBjZCAlQlVJTERESVIlICYmIGNtYWtlLmV4ZSAlU1JDRElSJSAlQ01BS0VBUkdTJSAmJiBjbWFrZSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2OWIwNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw0NSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNSU5HVyBvbiBNU1lTMgorOjogSW5zdGFsbHMgdGhpcmQgcGFydHkgcGFja2FnZXMgd2UgbmVlZCBmb3IgYSBjbWFrZSBidWlsZAorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9pbnN0YWxsLmJhdCAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2hvd2Vudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBQQUNLQUdFUz1eCisgIC0tbmVlZGVkIC1TIGJpc29uIGZsZXggbWFrZSBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1ib29zdCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1jbWFrZSBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1saWJldmVudCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1vcGVuc3NsIF4KKyAgbWluZ3ctdzY0LSVNSU5HV1BMQVQlLXRvb2xjaGFpbiBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS16bGliCisKKzo6bWluZ3ctdzY0LSVNSU5HV1BMQVQlLXF0NSA6IFdBWSB0b28gbGFyZ2UgKDFHQiBkb3dubG9hZCEpIC0gdGVzdGVkIGluIGN5Z3dpbiBidWlsZHMgYW55d2F5CisKKzo6IFJlbW92ZSBvbGQgcGFja2FnZXMgdGhhdCBubyBsb25nZXIgZXhpc3QgdG8gYXZvaWQgYW4gZXJyb3IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAtLXJlbW92ZSBsaWJjYXRnZXRzIGNhdGdldHMgfHwgdHJ1ZSIgfHwgRVhJVCAvQgorCis6OiBVcGdyYWRlIHRoaW5ncworJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TeXUgJUlHTk9SRSUiICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN1ICVJR05PUkUlIiAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAlUEFDS0FHRVMlIiAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItdGVzdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OWMxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0CkBAIC0wLDAgKzEsMjIgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCisKKyVCQVNIJSAtbGMgImNkICVCVUlMRERJUiUgJiYgY3Rlc3QuZXhlIC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAnJURJU0FCTEVEX1RFU1RTJSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyZGFhMQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsNjAgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitNS0RJUiAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBXaGVuIGxpYnJhcmllcyBjYW5ub3QgYmUgZm91bmQsIHRoaW5ncyBtaWdodCBoYXZlIGJlZW4gdXBkYXRlZAorOjogc28gdW5jb21tZW50IHRoaXMgYW5kIHN1Ym1pdCBhIHB1bGwgcmVxdWVzdCB0byBzZWUgd2hhdCdzIHRoZXJlCis6OiBub3cuLi4KKzo6IERJUiBDOlxMaWJyYXJpZXMKKzo6IERJUiBDOlxMaWJyYXJpZXNcYm9vc3RfMV82OV8wXGxpYioKKzo6IERJUiBDOlxMaWJyYXJpZXNcYm9vc3RfMV82OF8wXGxpYioKKzo6IERJUiBDOlxMaWJyYXJpZXNcYm9vc3RfMV82N18wXGxpYioKKzo6IERJUiBDOlxMaWJyYXJpZXNcYm9vc3RfMV82Nl8wXGxpYioKKzo6IERJUiBDOlxMaWJyYXJpZXNcYm9vc3RfMV82NV8wXGxpYioKKzo6IERJUiBDOlxMaWJyYXJpZXNcYm9vc3RfMV82NF8wXGxpYioKKzo6IERJUiBDOlxMaWJyYXJpZXNcYm9vc3RfMV82M18wXGxpYioKKzo6IERJUiBDOlxMaWJyYXJpZXNcYm9vc3RfMV82Ml8wXGxpYioKKzo6IERJUiBDOlxMaWJyYXJpZXNcYm9vc3RfMV82MV8wXGxpYioKKzo6IERJUiBDOlxMaWJyYXJpZXNcYm9vc3RfMV82MF8wXGxpYioKKworQEVDSE8gT04KKyAgY21ha2UgIiVTUkNESVIlIiBeCisgICAgLUciJUdFTkVSQVRPUiUiIF4KKwktREJJU09OX0VYRUNVVEFCTEU9QzpcUHJvZ3JhbURhdGFcY2hvY29sYXRleVxsaWJcd2luZmxleGJpc29uM1x0b29sc1x3aW5fYmlzb24uZXhlIF4KKyAgICAtREJPT1NUX1JPT1Q9IiVCT09TVF9ST09UJSIgXgorICAgIC1EQk9PU1RfTElCUkFSWURJUj0iJUJPT1NUX0xJQlJBUllESVIlIiBeCisgICAgLURCVUlMRF9TSEFSRURfTElCUz0iJUJVSUxEX1NIQVJFRF9MSUJTJSIgXgorICAgIC1EQ01BS0VfQlVJTERfVFlQRT0iJUNPTkZJR1VSQVRJT04lIiBeCisgICAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0iJUlOU1RESVIlIiBeCisJLURGTEVYX0VYRUNVVEFCTEU9QzpcUHJvZ3JhbURhdGFcY2hvY29sYXRleVxsaWJcd2luZmxleGJpc29uM1x0b29sc1x3aW5fZmxleC5leGUgXgorICAgIC1ETElCRVZFTlRfUk9PVD0iJVdJTjNQJVxsaWJldmVudC0lTElCRVZFTlRfVkVSU0lPTiUtc3RhYmxlIiBeCisgICAgLURPUEVOU1NMX1JPT1RfRElSPSIlT1BFTlNTTF9ST09UJSIgXgorICAgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T0ZGIF4KKyAgICAtRFpMSUJfTElCUkFSWT0iJVdJTjNQJVx6bGliLWluc3RcbGliXHpsaWIlWkxJQl9MSUJfU1VGRklYJS5saWIiIF4KKyAgICAtRFpMSUJfUk9PVD0iJVdJTjNQJVx6bGliLWluc3QiIF4KKyAgICAtRFdJVEhfUFlUSE9OPSVXSVRIX1BZVEhPTiUgXgorICAgIC1EV0lUSF8lVEhSRUFETU9ERUwlVEhSRUFEUz1PTiAgICAgICAgICB8fCBFWElUIC9CCitARUNITyBPRkYKKworY21ha2UgLS1idWlsZCAuIF4KKyAgLS1jb25maWcgIiVDT05GSUdVUkFUSU9OJSIgXgorICAtLXRhcmdldCBJTlNUQUxMICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLWluc3RhbGwuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1pbnN0YWxsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQ2NTVhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1pbnN0YWxsLmJhdApAQCAtMCwwICsxLDY2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogQXBwdmV5b3IgaW5zdGFsbCBzY3JpcHQgZm9yIE1TVkMKKzo6IEluc3RhbGxzIChvciBidWlsZHMpIHRoaXJkIHBhcnR5IHBhY2thZ2VzIHdlIG5lZWQKKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9pbnN0YWxsLmJhdCAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3Nob3dlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitNS0RJUiAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK2Nob2NvIGZlYXR1cmUgZW5hYmxlIC1uIGFsbG93R2xvYmFsQ29uZmlybWF0aW9uIHx8IEVYSVQgL0IKKworOjogVGhpbmdzIHRvIGluc3RhbGwgd2hlbiBOT1QgcnVubmluZyBpbiBhcHB2ZXlvcjoKK0lGICIlQVBQVkVZT1JfQlVJTERfSUQlIiA9PSAiIiAoCisgICAgY3VwIC15IGNob2NvbGF0ZXkgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgY2luc3QgLXkgY3VybCAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgY2luc3QgLXkgN3ppcCAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgY2luc3QgLXkgcHl0aG9uMyAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgY2luc3QgLXkgb3BlbnNzbC5saWdodCAgICAgICAgICAgICAgICB8fCBFWElUIC9CCispCisKK2NpbnN0IC15IGpkazggICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK2NpbnN0IC15IHdpbmZsZXhiaXNvbjMgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogemxpYiAtIG5vdCBhdmFpbGFibGUgdGhyb3VnaCBjaG9jb2xhdGV5CitDRCAiJUFQUFZFWU9SX1NDUklQVFMlIiAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitjYWxsIGJ1aWxkLXpsaWIuYmF0ICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IGxpYmV2ZW50IC0gbm90IGF2YWlsYWJsZSB0aHJvdWdoIGNob2NvbGF0ZXkKK0NEICIlQVBQVkVZT1JfU0NSSVBUUyUiICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK2NhbGwgYnVpbGQtbGliZXZlbnQuYmF0ICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogcHl0aG9uIHBhY2thZ2VzIChjb3JyZWN0IHBhdGggdG8gcGlwIHNldCBpbiBjbF9zZXRlbnYuYmF0KQorcGlwLmV4ZSBeCisgICAgaW5zdGFsbCBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIF4KKyAgICAgICAgICAgIGlwYWRkcmVzcyBeCisgICAgICAgICAgICBzaXggXgorICAgICAgICAgICAgdG9ybmFkbyBeCisgICAgICAgICAgICB0d2lzdGVkICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK2NpbnN0IC15IGdoYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogQWRvYmUgRmxleCBTREsgNC42IGZvciBBY3Rpb25TY3JpcHQKK01LRElSICJDOlxBZG9iZVxGbGV4XFNES1w0LjYiICAgICAgICAgICAgIHx8IEVYSVQgL0IKK2FwcHZleW9yIERvd25sb2FkRmlsZSBodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL2ZsZXgvc2RrL2ZsZXhfc2RrXzQuNi56aXAgLUZpbGVOYW1lIEM6XEFkb2JlXEZsZXhcU0RLXDQuNlxTREsuemlwIHx8IEVYSVQgL0IKK0NEICJDOlxBZG9iZVxGbGV4XFNES1w0LjYiICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKzd6IHggU0RLLnppcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK1NFVFggRkxFWF9IT01FICJDOlxBZG9iZVxGbGV4XFNES1w0LjYiCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLXRlc3QuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTk0NTc5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdApAQCAtMCwwICsxLDMyIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPTgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX3Rlc3QuYmF0ICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0QgIiVCVUlMRERJUiUiICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworRElSIEM6XGxpYnJhcmllcworRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzU5XzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82MF8wCitESVIgQzpcbGlicmFyaWVzXGJvb3N0XzFfNjJfMAorRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzYzXzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82NF8wCisKKzo6IEFkZCBkaXJlY3RvcmllcyB0byB0aGUgcGF0aCB0byBmaW5kIERMTHMgb2YgdGhpcmQgcGFydHkgbGlicmFyaWVzIHNvIHRlc3RzIHJ1biBwcm9wZXJseSEKK1NFVCBQQVRIPSVCT09TVF9MSUJSQVJZRElSOi89XCU7JU9QRU5TU0xfUk9PVCVcYmluOyVXSU4zUCVcemxpYi1pbnN0XGJpbjslUEFUSCUKKworY3Rlc3QgLUMgJUNPTkZJR1VSQVRJT04lIC0tdGltZW91dCAzMDAgLVZWIC1FICIoJURJU0FCTEVEX1RFU1RTJSkiIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwMTcyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsNDggQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBCQVNIPUM6XG1zeXM2NFx1c3JcYmluXGJhc2gKK1NFVCBDTUFLRT0vYy9tc3lzNjQvbWluZ3c2NC9iaW4vY21ha2UuZXhlCisKK0BFQ0hPIE9OCitTRVQgQ01BS0VBUkdTPS1HXCIlR0VORVJBVE9SJVwiIF4KKyAgLURCb29zdF9ERUJVRz1PTiBeCisgIC1EQm9vc3RfTkFNRVNQQUNFPWxpYmJvb3N0IF4KKyAgLURCT09TVF9JTkNMVURFRElSPSVCT09TVF9JTkNMVURFRElSJSBeCisgIC1EQk9PU1RfTElCUkFSWURJUj0lQk9PU1RfTElCUkFSWURJUiUgXgorICAtRENNQUtFX0JVSUxEX1RZUEU9JUNPTkZJR1VSQVRJT04lIF4KKyAgLURDTUFLRV9DX0NPTVBJTEVSPWdjYy5leGUgXgorICAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysuZXhlIF4KKyAgLURDTUFLRV9NQUtFX1BST0dSQU09bWFrZS5leGUgXgorICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVJTlNURElSX01TWVMlIF4KKyAgLURMSUJFVkVOVF9ST09UPSVMSUJFVkVOVF9ST09UJSBeCisgIC1ET1BFTlNTTF9MSUJSQVJJRVM9JU9QRU5TU0xfTElCUkFSSUVTJSBeCisgIC1ET1BFTlNTTF9ST09UX0RJUj0lT1BFTlNTTF9ST09UJSBeCisgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T04gXgorICAtRFdJVEhfQk9PU1RfU1RBVElDPU9OIF4KKyAgLURXSVRIX0pBVkE9T0ZGIF4KKyAgLURXSVRIX0xJQkVWRU5UPU9OIF4KKyAgLURXSVRIX1BZVEhPTj0lV0lUSF9QWVRIT04lIF4KKyAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgLURXSVRIX1NUQVRJQ19MSUI9T04KKworJUJBU0glIC1sYyAibWtkaXIgJUJVSUxERElSX01TWVMlICYmIGNkICVCVUlMRERJUl9NU1lTJSAmJiAlQ01BS0UlICVTUkNESVJfTVNZUyUgJUNNQUtFQVJHUyUgJiYgJUNNQUtFJSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxOGRmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw0OCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNU1lTCis6OiBJbnN0YWxscyAob3IgYnVpbGRzKSB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2luc3RhbGwuYmF0ICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogV2UncmUgZ29pbmcgdG8ga2VlcCBib29zdCBhdCBhIHZlcnNpb24gY21ha2UgdW5kZXJzdGFuZHMKK1NFVCBCT09TVFBLRz1taW5ndy13NjQteDg2XzY0LWJvb3N0LTEuNjQuMC0zLWFueS5wa2cudGFyLnh6CitTRVQgSUdOT1JFPS0taWdub3JlIG1pbmd3LXc2NC14ODZfNjQtYm9vc3QKKworU0VUIFBBQ0tBR0VTPV4KKyAgLS1uZWVkZWQgLVMgYmlzb24gZmxleCBtYWtlIF4KKyAgbWluZ3ctdzY0LXg4Nl82NC1jbWFrZSBeCisgIG1pbmd3LXc2NC14ODZfNjQtbGliZXZlbnQgXgorICBtaW5ndy13NjQteDg2XzY0LW9wZW5zc2wgXgorICBtaW5ndy13NjQteDg2XzY0LXRvb2xjaGFpbiBeCisgIG1pbmd3LXc2NC14ODZfNjQtemxpYgorCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN5dSAlSUdOT1JFJSIgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TdSAlSUdOT1JFJSIgIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAlUEFDS0FHRVMlIiAgICB8fCBFWElUIC9CCisKKzo6IEluc3RhbGwgYSBzbGlnaHRseSBvbGRlciBib29zdCAoMS42NC4wKSBhcyBjbWFrZSAzLjEwCis6OiBkb2VzIG5vdCBoYXZlIGJ1aWx0LWluIGRlcGVuZGVuY2llcyBmb3IgYm9vc3QgMS42Ni4wIHlldAorOjogLS0gdGhpcyBjdXRzIGRvd24gb24gYnVpbGQgd2FybmluZyBvdXRwdXQgLS0KKyVCQVNIJSAtbGMgIndnZXQgaHR0cDovL3JlcG8ubXN5czIub3JnL21pbmd3L3g4Nl82NC8lQk9PU1RQS0clICYmIHBhY21hbiAtLW5vY29uZmlybSAtLW5lZWRlZCAtVSAlQk9PU1RQS0clICYmIHJtICVCT09TVFBLRyUiIHx8IEVYSVQgL0IKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzN2VjNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwyNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl90ZXN0LmJhdCAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHJhbmRvbWx5IGZhaWxzIG9uIG1pbmd3OyBzZWUgSmlyYSBUSFJJRlQtNDEwNgorU0VUIERJU0FCTEVEX1RFU1RTPWNvbmN1cnJlbmN5X3Rlc3QKKworJUJBU0glIC1sYyAiY2QgJUJVSUxERElSX01TWVMlICYmIGN0ZXN0LmV4ZSAtQyAlQ09ORklHVVJBVElPTiUgLS10aW1lb3V0IDMwMCAtVlYgLUUgJyglRElTQUJMRURfVEVTVFMlKSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZCBiL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJhYTMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzQgQEAKKzwhLS0tCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKyMgQXBwdmV5b3IgQnVpbGQKKworQXBwdmV5b3IgaXMgY2FwYWJsZSBvZiBidWlsZGluZyBNU1ZDIDIwMTAgdGhyb3VnaCAyMDE1IGFzIHdlbGwgYXMKK2hhdmluZyB0aGUgbGF0ZXN0IE1TWVMyL01pbkdXIDY0LWJpdCBlbnZpcm9ubWVudC4gIEl0IGhhcyBtYW55IHZlcnNpb25zCitvZiBib29zdCBhbmQgcHl0aG9uIGluc3RhbGxlZCBhcyB3ZWxsLiAgU2VlIHdoYXQgYXBwdmV5b3IgaGFzCitbaW5zdGFsbGVkIG9uIGJ1aWxkIHdvcmtlcnNdKGh0dHBzOi8vd3d3LmFwcHZleW9yLmNvbS9kb2NzL2luc3RhbGxlZC1zb2Z0d2FyZS8pLgorCitXZSBydW4gYSBtYXRyaXggYnVpbGQgb24gQXBwdmV5b3IgYW5kIGJ1aWxkIHRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zOgorCisqIE1pbkdXIHg2NCAoZ2NjIDYuMy4wKQorKiBNU1ZDIDIwMTAgeDg2LCBhbiBvbGRlciBib29zdCwgYW4gb2xkZXIgcHl0aG9uCisqIE1TVkMgMjAxNSB4ODYveDY0LCB0aGUgbGF0ZXN0IGJvb3N0LCB0aGUgbGF0ZXN0IHB5dGhvbgorKiBNU1lTMiB4NjQgKGdjYyA2LjMuMCkgLSB0aGlzIGlzIGEgd29yayBpbiBwcm9ncmVzcworCitUaGUgQXBwdmV5b3Igc2NyaXB0IHRha2VzIHRoZSBmaXJzdCBmb3VyIGxldHRlcnMgZnJvbSB0aGUgUFJPRklMRSBzcGVjaWZpZWQgaW4KK3RoZSBlbnZpcm9ubWVudCBzdGFuemEgYW5kIHJ1bnMgdGhlc2Ugc2NyaXB0cyBpbiBvcmRlcjoKKworPz8/Py1hcHB2ZXlvci1pbnN0YWxsLmJhdCB3aWxsIGluc3RhbGwgdGhpcmQgcGFydHkgbGlicmFyaWVzIGFuZCBzZXQgdXAgdGhlIGVudmlyb25tZW50Cis/Pz8/LWFwcHZleW9yLWJ1aWxkLmJhdCB3aWxsIGJ1aWxkIHdpdGggY21ha2UKKz8/Pz8tYXBwdmV5b3ItdGVzdC5iYXQgd2lsbCBydW4gY3Rlc3QKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdCBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGI2MzViCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvYnVpbGQtbGliZXZlbnQuYmF0CkBAIC0wLDAgKzEsMzcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworU0VUIFVSTEZJTEU9bGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZS50YXIuZ3oKK1NFVCBVUkw9aHR0cHM6Ly9naXRodWIuY29tL2xpYmV2ZW50L2xpYmV2ZW50L3JlbGVhc2VzL2Rvd25sb2FkL3JlbGVhc2UtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZS8lVVJMRklMRSUKKworOjogRG93bmxvYWQgLSBzdXBwb3J0IHJ1bm5pbmcgYSBsb2NhbCBidWlsZCBvciBhIGJ1aWxkIGluIGFwcHZleW9yCitDRCAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorSUYgIiVBUFBWRVlPUl9CVUlMRF9JRCUiID09ICIiICgKKyAgICBjdXJsIC1MIC1mIC1vICIlVVJMRklMRSUiICIlVVJMJSIKKykgRUxTRSAoCisgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlVVJMJSIKKykKKzd6IHggIiVVUkxGSUxFJSIgLXNvIHwgN3ogeCAtc2kgLXR0YXIgPiBudWwgICAgICB8fCBFWElUIC9CCitDRCAibGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZSIgICAgICAgICAgfHwgRVhJVCAvQgorbm1ha2UgLWYgTWFrZWZpbGUubm1ha2Ugc3RhdGljX2xpYnMgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogaW4gbGliZXZlbnQgMi4wIHRoZXJlIGlzIG5vIG5tYWtlIHN1YmRpcmVjdG9yeSBpbiBXSU4zMi1Db2RlLCBidXQgaW4gMi4xIHRoZXJlIGlzCitta2RpciBsaWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorbW92ZSAqLmxpYiBsaWJcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK21vdmUgV0lOMzItQ29kZVxldmVudDJcKiBpbmNsdWRlXGV2ZW50MlwgICAgICAgICB8fCBtb3ZlIFdJTjMyLUNvZGVcbm1ha2VcZXZlbnQyXCogaW5jbHVkZVxldmVudDJcIHx8IEVYSVQgL0IKK21vdmUgKi5oIGluY2x1ZGVcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdCBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLXpsaWIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTU3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdApAQCAtMCwwICsxLDU2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK1NFVCBQQUNLQUdFPXpsaWItJVpMSUJfVkVSU0lPTiUKK1NFVCBCVUlMRERJUj0lV0lOM1AlXHpsaWItYnVpbGQKK1NFVCBJTlNURElSPSVXSU4zUCVcemxpYi1pbnN0CitTRVQgU1JDRElSPSVXSU4zUCVcJVBBQ0tBR0UlCitTRVQgVVJMRklMRT0lUEFDS0FHRSUudGFyLmd6CisKKzo6IFRoaXMgYWxsb3dzIHVzIHRvIHRvbGVyYXRlIHdoZW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBhcmNoaXZlZAorU0VUIFVSTD1odHRwOi8vemxpYi5uZXQvJVVSTEZJTEUlCitTRVQgRlVSTD1odHRwOi8vemxpYi5uZXQvZm9zc2lscy8lVVJMRklMRSUKKworOjogRG93bmxvYWQgLSBzdXBwb3J0IHJ1bm5pbmcgYSBsb2NhbCBidWlsZCBvciBhIGJ1aWxkIGluIGFwcHZleW9yCitDRCAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQVBQVkVZT1JfQlVJTERfSUQlIiA9PSAiIiAoCisgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJVVSTCUiCisgICAgSUYgRVJST1JMRVZFTCAxICgKKyAgICAgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJUZVUkwlIgorICAgICkKKykgRUxTRSAoCisgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlVVJMJSIKKyAgICBJRiBFUlJPUkxFVkVMIDEgKAorICAgICAgICBhcHB2ZXlvciBEb3dubG9hZEZpbGUgIiVGVVJMJSIgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgKQorKQorN3ogeCAiJVVSTEZJTEUlIiAtc28gfCA3eiB4IC1zaSAtdHRhciA+IG51bCAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IEdlbmVyYXRlCitNS0RJUiAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY21ha2UgIiVTUkNESVIlIiBeCisgICAgICAtRyJOTWFrZSBNYWtlZmlsZXMiIF4KKyAgICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IiVJTlNURElSJSIgXgorICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPSIlQ09ORklHVVJBVElPTiUiICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IEJ1aWxkCitubWFrZSAvZk1ha2VmaWxlIGluc3RhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQ09ORklHVVJBVElPTiUiID09ICJEZWJ1ZyIgKAorICAgIENPUFkgIiVCVUlMRERJUiVcemxpYmQucGRiIiAiJUlOU1RESVIlXGJpblwiICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCispCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMmEyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9hcGFjaGVfdGhyaWZ0LmJhdApAQCAtMCwwICsxLDI0IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9QXBhY2hlJTIwVGhyaWZ0CisKK0VDSE8vCitFQ0hPICAgIF9fXyAgICAgICAgICAgICAgICAgX18gICAgICAgICBfX19fX19fXyAgICAgICBfIF9fX19fCitFQ0hPICAgLyBfIHwgX19fICBfX18gX19fX18vIC8gIF9fXyAgIC9fICBfXy8gLyAgX19fXyhfKSBfLyAvXworRUNITyAgLyBfXyB8LyBfIFwvIF8gYC8gX18vIF8gXC8gLV8pICAgLyAvIC8gXyBcLyBfXy8gLyBfLyBfXy8KK0VDSE8gL18vIHxfLyAuX18vXF8sXy9cX18vXy8vXy9cX18vICAgL18vIC9fLy9fL18vIC9fL18vIFxfXy8KK0VDSE8gICAgICAvXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI3MmYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdApAQCAtMCwwICsxLDIzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9QnVpbGQKKworRUNITy8KK0VDSE8gICAgX19fICAgICAgIF8gX18gICBfXworRUNITyAgIC8gXyApX18gX18oXykgL19fLyAvCitFQ0hPICAvIF8gIC8gLy8gLyAvIC8gXyAgLyAgICAgQEBAIEJVSUxECitFQ0hPIC9fX19fL1xfLF8vXy9fL1xfLF8vCitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTNkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfaW5zdGFsbC5iYXQKQEAgLTAsMCArMSwyMyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjogQSB2aXN1YWwgaW5kaWNhdG9yIGluIGEgbGFyZ2UgbG9nIGhlbHBzIHlvdSBsb2NhdGUgdGhpbmdzIHdoZW4gc2Nhbm5pbmcKKzo6IGh0dHA6Ly93d3cucGF0b3Jqay5jb20vc29mdHdhcmUvdGFhZy8jcD1kaXNwbGF5JmY9U21hbGwlMjBTbGFudCZ0PUluc3RhbGwKKworRUNITy8KK0VDSE8gICAgX19fXyAgICAgICAgIF9fICAgICAgIF9fX18KK0VDSE8gICAvICBfL19fICBfX18gLyAvX19fXyBfLyAvIC8KK0VDSE8gIF8vIC8vIF8gXChfLV48LyBfXy8gXyBcLyAvIC8gICAgIEBAQCBJTlNUQUxMCitFQ0hPIC9fX18vXy8vXy9fX18vXF9fL1xfLF8vXy9fLworRUNITy8KZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGUyZDEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX3Rlc3QuYmF0CkBAIC0wLDAgKzEsMjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6IEEgdmlzdWFsIGluZGljYXRvciBpbiBhIGxhcmdlIGxvZyBoZWxwcyB5b3UgbG9jYXRlIHRoaW5ncyB3aGVuIHNjYW5uaW5nCis6OiBodHRwOi8vd3d3LnBhdG9yamsuY29tL3NvZnR3YXJlL3RhYWcvI3A9ZGlzcGxheSZmPVNtYWxsJTIwU2xhbnQmdD1UZXN0CisKK0VDSE8vCitFQ0hPICBfX19fX18gICAgICAgIF9fCitFQ0hPIC9fICBfXy9fXyBfX18gLyAvXworRUNITyAgLyAvIC8gLV9efF8tXjwvIF9fLyAgICAgQEBAIFRFU1QKK0VDSE8gL18vICBcX18vX19fL1xfXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzZmZjNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGNvbXBpbGVyLmJhdApAQCAtMCwwICsxLDYzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluLgorOjogU2V0IHRoZSBDT01QSUxFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OiAgIGdjYyAgID0gTWluR1cgLyBNU1lTMiBhbmQgZ2NjIHRvb2xjaGFpbgorOjogICB2YzEwMCA9IFZpc3VhbCBTdHVkaW8gMjAxMAorOjogICB2YzExMCA9IFZpc3VhbCBTdHVkaW8gMjAxMgorOjogICB2YzEyMCA9IFZpc3VhbCBTdHVkaW8gMjAxMworOjogICB2YzE0MCA9IFZpc3VhbCBTdHVkaW8gMjAxNQorOjogICB2YzE0MSA9IFZpc3VhbCBTdHVkaW8gMjAxNworOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgQ09NUElMRVIgZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIENPTVBJTEVSIGNhbiBiZSBkZXRlcm1pbmVkLAorOjogICAgICAgICAgICAgICAgIHRvIDEgaWYgaXQgY2Fubm90LgorOjoKKworSUYgREVGSU5FRCBDT01QSUxFUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBDT01QSUxFUgorICBFWElUIC9CIDAKKykKKworSUYgTk9UICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKyAgU0VUIENPTVBJTEVSPWdjYworKSBFTFNFICgKKyAgQ0FMTCA6Q0hFQ0sgMTYKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzEwMCkKKyAgQ0FMTCA6Q0hFQ0sgMTcKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzExMCkKKyAgQ0FMTCA6Q0hFQ0sgMTgKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzEyMCkKKyAgQ0FMTCA6Q0hFQ0sgMTkuMAorICBJRiAhRVJST1JMRVZFTCEgPT0gMCAoU0VUIENPTVBJTEVSPXZjMTQwKQorICBDQUxMIDpDSEVDSyAxOS4xCisgIElGICFFUlJPUkxFVkVMISA9PSAwIChTRVQgQ09NUElMRVI9dmMxNDEpCispCisKK0lGIE5PVCBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvbXBpbGVyIGVkaXRpb24KKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCBjb21waWxlciBlZGl0aW9uICAgICVDT01QSUxFUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJSIgPiBudWwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX3NldGVudi5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNGQ0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0CkBAIC0wLDAgKzEsMTI0IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKKworSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDEyIiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTEuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDEzIiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTIuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDE1IiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTQuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDE3IiAoCisgIENBTEwgOlNFVFVQTkVXRVJNU1ZDICAgIHx8IEVYSVQgL0IKKykgRUxTRSBJRiAiJVBST0ZJTEUlIiA9PSAiTUlOR1ciICgKKyAgUkVNIFN1cHBvcnRlZCwgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIkNZR1dJTiIgKAorICBSRU0gU3VwcG9ydGVkLCBub3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZS4KKykgRUxTRSAoCisgIEVDSE8gVW5zdXBwb3J0ZWQgUFJPRklMRT0lUFJPRklMRSUgb3IgUExBVEZPUk09JVBMQVRGT1JNJQorICBFWElUIC9CIDEKKykKKworQ0FMTCBjbF9zZXRjb21waWxlci5iYXQgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGdlbmVyYXRvci5iYXQgIHx8IEVYSVQgL0IKKworU0VUIEFQUFZFWU9SX1NDUklQVFM9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcYnVpbGRcYXBwdmV5b3IKK1NFVCBCVUlMRERJUj0lQVBQVkVZT1JfQlVJTERfRk9MREVSJVwuLlxidWlsZFwlUFJPRklMRSVcJVBMQVRGT1JNJQorU0VUIElOU1RESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcLi5cYnVpbGRcJVBST0ZJTEUlXCVQTEFURk9STSUKK1NFVCBTUkNESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKKworOjogUExBVEZPUk0gaXMgeDY0IG9yIHg4NgorOjogTk9STV9QTEFURk9STSBpcyA2NCBvciAzMgorU0VUIE5PUk1fUExBVEZPUk09JVBMQVRGT1JNOn4tMiwyJQorSUYgIiVOT1JNX1BMQVRGT1JNJSIgPT0gIjg2IiAoU0VUIE5PUk1fUExBVEZPUk09MzIpCisKK0lGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKworICA6OiBGaW5kQm9vc3QgbmVlZHMgZm9yd2FyZCBzbGFzaGVzIHNvIGNtYWtlIGRvZXNuJ3Qgc2VlIHNvbWV0aGluZyBhcyBhbiBlc2NhcGVkIGNoYXJhY3RlcgorICBTRVQgQk9PU1RfUk9PVD1DOi9MaWJyYXJpZXMvYm9vc3RfJUJPT1NUX1ZFUlNJT046Lj1fJQorICBTRVQgQk9PU1RfTElCUkFSWURJUj0hQk9PU1RfUk9PVCEvbGliJU5PUk1fUExBVEZPUk0lLW1zdmMtJUNPTVBJTEVSOn4tMywyJS4lQ09NUElMRVI6fi0xLDElCisgIFNFVCBPUEVOU1NMX1JPT1Q9QzpcT3BlblNTTC1XaW4lTk9STV9QTEFURk9STSUKKyAgU0VUIFdJTjNQPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlXHRoaXJkcGFydHkKKworICBTRVQgVEhSRUFETU9ERUw9U1RECisKKyAgSUYgIiVQWVRIT05fVkVSU0lPTiUiID09ICIiICgKKyAgICBTRVQgV0lUSF9QWVRIT049T0ZGCisgICkgRUxTRSAoCisgICAgU0VUIFdJVEhfUFlUSE9OPU9OCisgICAgSUYgL2kgIiVQTEFURk9STSUiID09ICJ4NjQiIFNFVCBQVEVYVD0teDY0CisgICAgU0VUIFBBVEg9QzpcUHl0aG9uJVBZVEhPTl9WRVJTSU9OOi49JSFQVEVYVCFcc2NyaXB0cztDOlxQeXRob24lUFlUSE9OX1ZFUlNJT046Lj0lIVBURVhUITshUEFUSCEKKyAgKQorICBJRiAiJUNPTkZJR1VSQVRJT04lIiA9PSAiRGVidWciIChTRVQgWkxJQl9MSUJfU1VGRklYPWQpCisKKyAgSUYgTk9UICIlUVRfVkVSU0lPTiUiID09ICIiICgKKyAgICBJRiAvaSAiJVBMQVRGT1JNJSIgPT0gIng2NCIgU0VUIFFURVhUPV82NAorICAgIFNFVCBQQVRIPUM6XFF0XCVRVF9WRVJTSU9OJVwlUFJPRklMRSUhUVRFWFQhXGJpbjshUEFUSCEKKyAgKQorCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTUlORyIgKAorCisgIDo6IFBMQVRGT1JNID0geDg2IG1lYW5zIE1JTkdXUExBVCBpNjg2CisgIDo6IFBMQVRGT1JNID0geDY0IG1lYW5zIE1JTkdXUExBVCB4ODZfNjQKKyAgU0VUIE1JTkdXUExBVD14ODZfNjQKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4ODYiIChTRVQgTUlOR1dQTEFUPWk2ODYpCisKKyAgU0VUIEJBU0g9QzpcbXN5czY0XHVzclxiaW5cYmFzaC5leGUKKyAgIUJBU0ghIC1sYyAic2VkIC1pICcvZXhwb3J0IFBBVEg9XC9taW5ndzMyXC9iaW4vZCcgfi8uYmFzaF9wcm9maWxlICYmIHNlZCAtaSAnL2V4cG9ydCBQQVRIPVwvbWluZ3c2NFwvYmluL2QnIH4vLmJhc2hfcHJvZmlsZSAmJiBlY2hvICdleHBvcnQgUEFUSD0vbWluZ3clTk9STV9QTEFURk9STSUvYmluOiRQQVRIJyA+PiB+Ly5iYXNoX3Byb2ZpbGUiIHx8IEVYSVQgL0IKKworICBTRVQgQlVJTERESVI9JUJVSUxERElSOlw9LyUKKyAgU0VUIEJVSUxERElSPS9jIUJVSUxERElSOn4yIQorICBTRVQgSU5TVERJUj0lSU5TVERJUjpcPS8lCisgIFNFVCBJTlNURElSPS9jIUlOU1RESVI6fjIhCisgIFNFVCBTUkNESVI9JVNSQ0RJUjpcPS8lCisgIFNFVCBTUkNESVI9L2MhU1JDRElSOn4yIQorCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiQ1lHVyIgKAorCisgIFNFVCBDWUdXSU5ST09UPUM6XGN5Z3dpbgorICBJRiAiJVBMQVRGT1JNJSIgPT0gIng2NCIgKFNFVCBDWUdXSU5ST09UPSFDWUdXSU5ST09UITY0KQorCisgIFNFVCBCQVNIPSFDWUdXSU5ST09UIVxiaW5cYmFzaC5leGUKKyAgU0VUIFNFVFVQPSFDWUdXSU5ST09UIVxzZXR1cC14ODYKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4NjQiIChTRVQgU0VUVVA9IVNFVFVQIV82NCkKKyAgU0VUIFNFVFVQPSFTRVRVUCEuZXhlCisKKyAgU0VUIEJVSUxERElSPSVCVUlMRERJUjpcPS8lCisgIFNFVCBCVUlMRERJUj0vY3lnZHJpdmUvYyFCVUlMRERJUjp+MiEKKyAgU0VUIElOU1RESVI9JUlOU1RESVI6XD0vJQorICBTRVQgSU5TVERJUl9DWUc9L2N5Z2RyaXZlL2MhSU5TVERJUjp+MiEKKyAgU0VUIFNSQ0RJUj0lU1JDRElSOlw9LyUKKyAgU0VUIFNSQ0RJUj0vY3lnZHJpdmUvYyFTUkNESVI6fjIhCisKKykKKworR09UTyA6RU9GCisKKzpTRVRVUE5FV0VSTVNWQworICA6OiBJZiBWc0RldkNtZC5iYXQgaGFzIGFscmVhZHkgZXhlY3V0ZWQsIGFzIGlzIHRoZSBjYXNlIGluIHRoZQorICA6OiBtc3ZjMjAxNyBkb2NrZXIgY29udGFpbmVyLCBza2lwIHRoaXMuLi4KKyAgSUYgTk9UIERFRklORUQgVlNDTURfVkVSICgKKyAgICBGT1IgL0YgIlVTRUJBQ0tRIFRPS0VOUz0qIiAlJWkgSU4gKGBjYWxsICIlUHJvZ3JhbUZpbGVzKHg4NiklXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvXEluc3RhbGxlclx2c3doZXJlLmV4ZSIgLXZlcnNpb24gIlsxNS4wLDE2LjApIiAtcHJvcGVydHkgaW5zdGFsbGF0aW9uUGF0aGApIERPICgKKyAgICAgIElGICIlTVNWQ1JPT1QlIiA9PSAiIiAoU0VUIE1TVkNST09UPSUlaSkKKyAgICApCisgICAgU0VUIE1TVkNQTEFUPXg4NgorICAgIElGICIlUExBVEZPUk0lIiA9PSAieDY0IiAoU0VUIE1TVkNQTEFUPWFtZDY0KQorCisgICAgU0VUIENVUlJFTlRESVI9JUNEJQorICAgIENBTEwgIiFNU1ZDUk9PVCFcQ29tbW9uN1xUb29sc1xWc0RldkNtZC5iYXQiIC1hcmNoPSFNU1ZDUExBVCEgfHwgRVhJVCAvQgorICAgIENEICVDVVJSRU5URElSJQorICAgIEVYSVQgL0IKKyAgKQorOkVPRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Z2VuZXJhdG9yLmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGdlbmVyYXRvci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViNmZmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGdlbmVyYXRvci5iYXQKQEAgLTAsMCArMSw3OSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IERldGVjdCB0aGUgY29tcGlsZXIgZWRpdGlvbiB3ZSdyZSBidWlsZGluZyBpbiBhbmQgdGhlbgorOjogc2V0IHRoZSBHRU5FUkFUT1IgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb25lIG9mOgorOjoKKzo6ICBWaXN1YWwgU3R1ZGlvIDE1IDIwMTcgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxNyBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxNCAyMDE1IFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTUgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTIgMjAxMyBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEzIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDExIDIwMTIgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMiBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMCAyMDEwIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTAgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJJQTY0Ii4KKzo6ICBNaW5HVyBNYWtlZmlsZXMgICAgICAgICAgICAgID0gR2VuZXJhdGVzIG1ha2VmaWxlcyBmb3IgTWluR1cKKzo6ICBNU1lTIE1ha2VmaWxlcyAgICAgICAgICAgICAgID0gR2VuZXJhdGVzIG1ha2VmaWxlcyBmb3IgTVNZUworOjogIFVuaXggTWFrZWZpbGVzICAgICAgICAgICAgICAgPSBHZW5lcmF0ZXMgbWFrZWZpbGVzIGZvciBDWUdXSU4KKzo6Cis6OiBIb25vcnMgYW55IGV4aXN0aW5nIEdFTkVSQVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZQorOjogICBzZXR0aW5nIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQsIHRvIGFsbG93IGl0Cis6OiAgIHRvIGJlIGZvcmNlZCBpZiBuZWVkZWQuCis6OgorOjogU2V0cyBFUlJPUkxFVkVMIHRvIDAgaWYgR0VORVJBVE9SIGNhbiBiZSBkZXRlcm1pbmVkLAorOjogICAgICAgICAgICAgICAgIHRvIDEgaWYgaXQgY2Fubm90LgorOjoKKworSUYgREVGSU5FRCBHRU5FUkFUT1IgKAorICBFQ0hPIFt3YXJuIF0gdXNpbmcgZXhpc3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgR0VORVJBVE9SCisgIEVYSVQgL0IgMAorKQorCisKK0lGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1JTkciICgKKyAgU0VUIEdFTkVSQVRPUj1NaW5HVyBNYWtlZmlsZXMKKworKSBFTFNFIElGICIlUFJPRklMRTp+MCw0JSIgPT0gIkNZR1ciICgKKyAgU0VUIEdFTkVSQVRPUj1Vbml4IE1ha2VmaWxlcworCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTVNZUyIgKAorICBTRVQgR0VORVJBVE9SPU1TWVMgTWFrZWZpbGVzCispIEVMU0UgKAorICBJRiAvaSAiJVBMQVRGT1JNJSIgPT0gIng2NCIgU0VUIEdFTkFSQ0g9IFdpbjY0CisgIENBTEwgOkNIRUNLIDE2CisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMCAyMDEwIUdFTkFSQ0ghCisgIENBTEwgOkNIRUNLIDE3CisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMSAyMDEyIUdFTkFSQ0ghCisgIENBTEwgOkNIRUNLIDE4CisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMiAyMDEzIUdFTkFSQ0ghCisgIENBTEwgOkNIRUNLIDE5LjAKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDE0IDIwMTUhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTkuMQorICBJRiAhRVJST1JMRVZFTCEgPT0gMCBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTUgMjAxNyFHRU5BUkNIIQorKQorCitJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgKAorICBFQ0hPIFtlcnJvcl0gdW5hYmxlIHRvIGRldGVybWluZSB0aGUgQ01ha2UgZ2VuZXJhdG9yIHRvIHVzZQorICBFWElUIC9CIDEKKykKKworRUNITyBbaW5mbyBdIHVzaW5nIENNYWtlIGdlbmVyYXRvciAgICAgICAgJUdFTkVSQVRPUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJSIgPiBudWwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX3Nob3dlbnYuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfc2hvd2Vudi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwYTQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX3Nob3dlbnYuYmF0CkBAIC0wLDAgKzEsNjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0VDSE8vCitFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKK0VDSE8gVmVyc2lvbnMKK0VDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRUNITyBib29zdCAgICAgICAgICAgICAgICAgPSAlQk9PU1RfVkVSU0lPTiUKK0VDSE8gbGliZXZlbnQgICAgICAgICAgICAgID0gJUxJQkVWRU5UX1ZFUlNJT04lCitFQ0hPIHB5dGhvbiAgICAgICAgICAgICAgICA9ICVQWVRIT05fVkVSU0lPTiUKK0VDSE8gcXQgICAgICAgICAgICAgICAgICAgID0gJVFUX1ZFUlNJT04lCitFQ0hPIHpsaWIgICAgICAgICAgICAgICAgICA9ICVaTElCX1ZFUlNJT04lCitFQ0hPLworKQorRUNITyBBcHB2ZXlvciBWYXJpYWJsZXMKK0VDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRUNITyBBUFBWRVlPUl9CVUlMRF9GT0xERVIgPSAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorRUNITyBDT05GSUdVUkFUSU9OICAgICAgICAgPSAlQ09ORklHVVJBVElPTiUKK0VDSE8gUExBVEZPUk0gICAgICAgICAgICAgID0gJVBMQVRGT1JNJQorRUNITyBQUk9GSUxFICAgICAgICAgICAgICAgPSAlUFJPRklMRSUKK0VDSE8vCitFQ0hPIE91ciBWYXJpYWJsZXMKK0VDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRUNITyBBUFBWRVlPUl9TQ1JJUFRTICAgICAgPSAlQVBQVkVZT1JfU0NSSVBUUyUKK0VDSE8gQkFTSCAgICAgICAgICAgICAgICAgID0gJUJBU0glCitFQ0hPIEJPT1NUX1JPT1QgICAgICAgICAgICA9ICVCT09TVF9ST09UJQorRUNITyBCT09TVF9JTkNMVURFRElSICAgICAgPSAlQk9PU1RfSU5DTFVERURJUiUKK0VDSE8gQk9PU1RfTElCUkFSWURJUiAgICAgID0gJUJPT1NUX0xJQlJBUllESVIlCitFQ0hPIEJVSUxERElSICAgICAgICAgICAgICA9ICVCVUlMRERJUiUKK0VDSE8gQ09NUElMRVIgICAgICAgICAgICAgID0gJUNPTVBJTEVSJQorRUNITyBHRU5FUkFUT1IgICAgICAgICAgICAgPSAlR0VORVJBVE9SJQorRUNITyBJTlNURElSICAgICAgICAgICAgICAgPSAlSU5TVERJUiUKK0VDSE8gSkFWQV9IT01FICAgICAgICAgICAgID0gJUpBVkFfSE9NRSUKK0VDSE8gT1BFTlNTTF9ST09UICAgICAgICAgID0gJU9QRU5TU0xfUk9PVCUKK0VDSE8gU0VUVVAgICAgICAgICAgICAgICAgID0gJVNFVFVQJQorRUNITyBTUkNESVIgICAgICAgICAgICAgICAgPSAlU1JDRElSJQorRUNITyBXSU4zUCAgICAgICAgICAgICAgICAgPSAlV0lOM1AlCitFQ0hPIFdJVEhfUFlUSE9OICAgICAgICAgICA9ICVXSVRIX1BZVEhPTiUKK0VDSE8gWkxJQl9TVEFUSUNfU1VGRklYICAgID0gJVpMSUJfU1RBVElDX1NVRkZJWCUKK0lGIE5PVCAiJVBST0ZJTEU6fjAsNCUiID09ICJNU1ZDIiAoCisgIEVDSE8vCisgIEVDSE8gVU5JWHkgUEFUSAorICBFQ0hPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgJUJBU0glIC1sYyAiZWNobyAkUEFUSCIKKykKK0VDSE8vCitFQ0hPIFdpbmRvd3MgUEFUSAorRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPICVQQVRIJQorRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3Ivc2ltdWxhdGUtYXBwdmV5b3IuYmF0IGIvYnVpbGQvYXBwdmV5b3Ivc2ltdWxhdGUtYXBwdmV5b3IuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NzRmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9zaW11bGF0ZS1hcHB2ZXlvci5iYXQKQEAgLTAsMCArMSwzNSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEhlbHBzIGJ1aWxkIHRocmlmdCBieSBwcmV0ZW5kaW5nIHRvIGJlIGFwcHZleW9yCis6OiBVc2FnZToKKzo6ICAgY2QgYnVpbGRcYXBwdmV5b3IKKzo6ICAgc2ltdWxhdGUtYXBwdmV5b3IuYmF0IFtEZWJ1Z3xSZWxlYXNlXSBbeDg2fHg2NF0gW0NZR1dJTnxNSU5HV3xNU1ZDMjAxP10KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitTRVQgQVBQVkVZT1JfQlVJTERfRk9MREVSPSV+ZHAwLi5cLi4KK1NFVCBDT05GSUdVUkFUSU9OPSUxCitTRVQgUExBVEZPUk09JTIKK1NFVCBQUk9GSUxFPSUzCisKK0NEICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitDQUxMIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLWluc3RhbGwuYmF0IHx8IEVYSVQgL0IKK0NEICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitDQUxMIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLWJ1aWxkLmJhdCAgIHx8IEVYSVQgL0IKK0NEICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitDQUxMIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLXRlc3QuYmF0CmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9Cb29zdE1hY3Jvcy5jbWFrZSBiL2J1aWxkL2NtYWtlL0Jvb3N0TWFjcm9zLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjN2YxM2QKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9Cb29zdE1hY3Jvcy5jbWFrZQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc2V0KEJPT1NUX01JTlJFViAxLjUzKQorCittYWNybyhSRVFVSVJFX0JPT1NUX0hFQURFUlMpCisgIGZpbmRfcGFja2FnZShCb29zdCAke0JPT1NUX01JTlJFVn0gUVVJRVQgUkVRVUlSRUQpCisgIGlmIChOT1QgQm9vc3RfRk9VTkQpCisgICAgc3RyaW5nKENPTkNBVCBmYXRhbF9tZXNzYWdlCisJICAgICJCb29zdCAxLjUzIG9yIGxhdGVyIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIHNvdXJjZXMgaW4gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IikKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SLCAke2ZhdGFsX21lc3NhZ2V9KQorICBlbmRpZigpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke0Jvb3N0X0lOQ0xVREVfRElSU30iKQorZW5kbWFjcm8oKQorCittYWNybyhSRVFVSVJFX0JPT1NUX0xJQlJBUklFUyBsaWJzKQorICBtZXNzYWdlKFNUQVRVUyAiTG9jYXRpbmcgYm9vc3QgbGlicmFyaWVzIHJlcXVpcmVkIGJ5IHNvdXJjZXMgaW4gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IikKKyAgZmluZF9wYWNrYWdlKEJvb3N0ICR7Qk9PU1RfTUlOUkVWfSBSRVFVSVJFRCBDT01QT05FTlRTICR7JHtsaWJzfX0pCisgIGlmIChOT1QgQm9vc3RfRk9VTkQpCisgICAgc3RyaW5nKENPTkNBVCBmYXRhbF9tZXNzYWdlCisJICAgICJCb29zdCAxLjUzIG9yIGxhdGVyIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIHNvdXJjZXMgaW4gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LCAiCisJICAgICJvciB1c2UgLURCVUlMRF9URVNUSU5HPU9GRiIpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiwgJHtmYXRhbF9tZXNzYWdlfSkKKyAgZW5kaWYoKQorZW5kbWFjcm8oKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvQnVpbGRUeXBlLmNtYWtlIGIvYnVpbGQvY21ha2UvQnVpbGRUeXBlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYmYzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9CdWlsZFR5cGUuY21ha2UKQEAgLTAsMCArMSwzNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgb3JpZ2luYWxseSBmcm9tOgorIyBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vT3BlbkNoZW1pc3RyeS90b212aXovbWFzdGVyL2NtYWtlL0J1aWxkVHlwZS5jbWFrZQorCisjIFNldCBhIGRlZmF1bHQgYnVpbGQgdHlwZSBpZiBub25lIHdhcyBzcGVjaWZpZWQKK3NldChkZWZhdWx0X2J1aWxkX3R5cGUgIlJlbFdpdGhEZWJJbmZvIikKK2lmKEVYSVNUUyAiJHtDTUFLRV9TT1VSQ0VfRElSfS8uZ2l0IikKKyAgc2V0KGRlZmF1bHRfYnVpbGRfdHlwZSAiRGVidWciKQorZW5kaWYoKQorCitpZihOT1QgQ01BS0VfQlVJTERfVFlQRSBBTkQgTk9UIENNQUtFX0NPTkZJR1VSQVRJT05fVFlQRVMpCisgIG1lc3NhZ2UoU1RBVFVTICJTZXR0aW5nIGJ1aWxkIHR5cGUgdG8gJyR7ZGVmYXVsdF9idWlsZF90eXBlfScgYXMgbm9uZSB3YXMgc3BlY2lmaWVkLiIpCisgIHNldChDTUFLRV9CVUlMRF9UWVBFICIke2RlZmF1bHRfYnVpbGRfdHlwZX0iIENBQ0hFCisgICAgICBTVFJJTkcgIkNob29zZSB0aGUgdHlwZSBvZiBidWlsZC4iIEZPUkNFKQorICAjIFNldCB0aGUgcG9zc2libGUgdmFsdWVzIG9mIGJ1aWxkIHR5cGUgZm9yIGNtYWtlLWd1aQorICBzZXRfcHJvcGVydHkoQ0FDSEUgQ01BS0VfQlVJTERfVFlQRSBQUk9QRVJUWSBTVFJJTkdTICJEZWJ1ZyIgIlJlbGVhc2UiCisgICAgIk1pblNpemVSZWwiICJSZWxXaXRoRGViSW5mbyIpCitlbmRpZigpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9DUGFja0NvbmZpZy5jbWFrZSBiL2J1aWxkL2NtYWtlL0NQYWNrQ29uZmlnLmNtYWtlCmluZGV4IDAyNDAwMDUuLmZkYzFiNGUgMTAwNjQ0Ci0tLSBhL2J1aWxkL2NtYWtlL0NQYWNrQ29uZmlnLmNtYWtlCisrKyBiL2J1aWxkL2NtYWtlL0NQYWNrQ29uZmlnLmNtYWtlCkBAIC0yOCw4ICsyOCw4IEBACiBzZXQoQ1BBQ0tfUEFDS0FHRV9OQU1FICJ0aHJpZnQiKQogc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTiAiJHtQQUNLQUdFX1ZFUlNJT059IikKIHNldChDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX1NVTU1BUlkgIkFwYWNoZSBUaHJpZnQiKQotc2V0KENQQUNLX1BBQ0tBR0VfREVTQ1JJUFRJT05fRklMRSAiJHtDTUFLRV9TT1VSQ0VfRElSfS9SRUFETUUubWQiKQotc2V0KENQQUNLX1JFU09VUkNFX0ZJTEVfTElDRU5TRSAiJHtDTUFLRV9TT1VSQ0VfRElSfS9MSUNFTlNFIikKK3NldChDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX0ZJTEUgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9SRUFETUUubWQiKQorc2V0KENQQUNLX1JFU09VUkNFX0ZJTEVfTElDRU5TRSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0xJQ0VOU0UiKQogc2V0KENQQUNLX1BBQ0tBR0VfVkVORE9SICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpCiBzZXQoQ1BBQ0tfUEFDS0FHRV9DT05UQUNUICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciKQogc2V0KENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgIiR7Q1BBQ0tfUEFDS0FHRV9OQU1FfSIpCkBAIC01OCw3ICs1OCw3IEBACiAgICAgICAgICJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCIgIkFwYWNoZSBUaHJpZnQgLSBJc3N1ZXMiKQogICAgIHNldChDUEFDS19OU0lTX0NPTlRBQ1QgJHtDUEFDS19QQUNLQUdFX0NPTlRBQ1R9KQogICAgIHNldChDUEFDS19OU0lTX01PRElGWV9QQVRIICJPTiIpCi0gICAgc2V0KENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgJHtDUEFDS19QQUNLQUdFX05BTUV9KQorICAgIHNldChDUEFDS19QQUNLQUdFX0lOU1RBTExfRElSRUNUT1JZICIke0NQQUNLX1BBQ0tBR0VfTkFNRX0iKQogZWxzZSgpCiAgICAgc2V0KENQQUNLX0dFTkVSQVRPUiAiREVCIiApCiAgICAgc2V0KENQQUNLX0RFQklBTl9QQUNLQUdFX01BSU5UQUlORVIgJHtDUEFDS19QQUNLQUdFX0NPTlRBQ1R9KQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlIGIvYnVpbGQvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlCmluZGV4IGY2NTA1NDQuLjQ1N2JmZTAgMTAwNjQ0Ci0tLSBhL2J1aWxkL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZQorKysgYi9idWlsZC9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UKQEAgLTE3LDE3ICsxNywxNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotCi1pbmNsdWRlKENoZWNrU3ltYm9sRXhpc3RzKQoraW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQogaW5jbHVkZShDaGVja0luY2x1ZGVGaWxlKQogaW5jbHVkZShDaGVja0luY2x1ZGVGaWxlcykKLWluY2x1ZGUoQ2hlY2tGdW5jdGlvbkV4aXN0cykKK2luY2x1ZGUoQ2hlY2tTeW1ib2xFeGlzdHMpCiAKLSMgSWYgQUlfQUREUkNPTkZJRyBpcyBub3QgZGVmaW5lZCB3ZSBkZWZpbmUgaXQgYXMgMAotY2hlY2tfc3ltYm9sX2V4aXN0cyhBSV9BRERSQ09ORklHICJzeXMvdHlwZXMuaDtzeXMvc29ja2V0Lmg7bmV0ZGIuaCIgSEFWRV9BSV9BRERSQ09ORklHKQotaWYoTk9UIEhBVkVfQUlfQUREUkNPTkZJRykKLXNldChBSV9BRERSQ09ORklHIDEpCi1lbmRpZihOT1QgSEFWRV9BSV9BRERSQ09ORklHKQoraWYgKEludHR5cGVzX0ZPVU5EKQorICAjIFRoaXMgYWxsb3dzIHRoZSBpbnR0eXBlcy5oIGFuZCBzdGRpbnQuaCBjaGVja3MgdG8gc3VjY2VlZCBvbiBwbGF0Zm9ybXMgdGhhdAorICAjIGRvIG5vdCBuYXRpdmVseSBwcm92aWRlIHRoZXJlLgorICBzZXQgKENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7SU5UVFlQRVNfSU5DTFVERV9ESVJTfSkKK2VuZGlmICgpCiAKIGNoZWNrX2luY2x1ZGVfZmlsZShhcnBhL2luZXQuaCBIQVZFX0FSUEFfSU5FVF9IKQogY2hlY2tfaW5jbHVkZV9maWxlKGZjbnRsLmggSEFWRV9GQ05UTF9IKQpAQCAtMzUsMTggKzM0LDIyIEBACiBjaGVja19pbmNsdWRlX2ZpbGUoaW50dHlwZXMuaCBIQVZFX0lOVFRZUEVTX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUobmV0ZGIuaCBIQVZFX05FVERCX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUobmV0aW5ldC9pbi5oIEhBVkVfTkVUSU5FVF9JTl9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHNpZ25hbC5oIEhBVkVfU0lHTkFMX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoc3RkaW50LmggSEFWRV9TVERJTlRfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZSh1bmlzdGQuaCBIQVZFX1VOSVNURF9IKQogY2hlY2tfaW5jbHVkZV9maWxlKHB0aHJlYWQuaCBIQVZFX1BUSFJFQURfSCkKLWNoZWNrX2luY2x1ZGVfZmlsZShzeXMvdGltZS5oIEhBVkVfU1lTX1RJTUVfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvaW9jdGwuaCBIQVZFX1NZU19JT0NUTF9IKQogY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9wYXJhbS5oIEhBVkVfU1lTX1BBUkFNX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3Jlc291cmNlLmggSEFWRV9TWVNfUkVTT1VSQ0VfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzeXMvc29ja2V0LmggSEFWRV9TWVNfU09DS0VUX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3N0YXQuaCBIQVZFX1NZU19TVEFUX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3RpbWUuaCBIQVZFX1NZU19USU1FX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3VuLmggSEFWRV9TWVNfVU5fSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShwb2xsLmggSEFWRV9QT0xMX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3BvbGwuaCBIQVZFX1NZU19QT0xMX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3NlbGVjdC5oIEhBVkVfU1lTX1NFTEVDVF9IKQogY2hlY2tfaW5jbHVkZV9maWxlKHNjaGVkLmggSEFWRV9TQ0hFRF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN0cmluZy5oIEhBVkVfU1RSSU5HX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoc3RyaW5ncy5oIEhBVkVfU1RSSU5HU19IKQogCiBjaGVja19mdW5jdGlvbl9leGlzdHMoZ2V0aG9zdGJ5bmFtZSBIQVZFX0dFVEhPU1RCWU5BTUUpCkBAIC03Miw1ICs3NSw1IEBACiAKICMgZ2VuZXJhdGUgYSBjb25maWcuaCBmaWxlCiBjb25maWd1cmVfZmlsZSgiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9jb25maWcuaCIpCi0jIEhBQ0s6IFNvbWUgZmlsZXMgaW5jbHVkZSB0aHJpZnQvY29uZmlnLmggYW5kIHNvbWUgY29uZmlnLmggc28gd2UgaW5jbHVkZSBib3RoLiBUaGlzIHNob3VsZCBiZSBjbGVhbmVkIHVwLgotaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdCIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlIGIvYnVpbGQvY21ha2UvRGVmaW5lQ01ha2VEZWZhdWx0cy5jbWFrZQppbmRleCAzNGZmNzM4Li4yYjBjZGJiIDEwMDY0NAotLS0gYS9idWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlCisrKyBiL2J1aWxkL2NtYWtlL0RlZmluZUNNYWtlRGVmYXVsdHMuY21ha2UKQEAgLTM0LDIxICszNCwxMiBAQAogIyBzaW5jZSBjbWFrZSAyLjQuMAogc2V0KENNQUtFX0NPTE9SX01BS0VGSUxFIE9OKQogCi0jIERlZmluZSB0aGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJpZXMgaGVyZQotc2V0KEdFTkVSSUNfTElCX1ZFUlNJT04gIjAuOS4zIikKLXNldChHRU5FUklDX0xJQl9TT1ZFUlNJT04gIjAiKQotCi0jIFNldCB0aGUgZGVmYXVsdCBidWlsZCB0eXBlIHRvIHJlbGVhc2Ugd2l0aCBkZWJ1ZyBpbmZvCi1pZiAoTk9UIENNQUtFX0JVSUxEX1RZUEUpCi0gIHNldChDTUFLRV9CVUlMRF9UWVBFIFJlbFdpdGhEZWJJbmZvCi0gICAgQ0FDSEUgU1RSSU5HCi0gICAgICAiQ2hvb3NlIHRoZSB0eXBlIG9mIGJ1aWxkLCBvcHRpb25zIGFyZTogTm9uZSBEZWJ1ZyBSZWxlYXNlIFJlbFdpdGhEZWJJbmZvIE1pblNpemVSZWwuIgotICApCi1lbmRpZiAoTk9UIENNQUtFX0JVSUxEX1RZUEUpCi0KICMgQ3JlYXRlIHRoZSBjb21waWxlIGNvbW1hbmQgZGF0YWJhc2UgZm9yIGNsYW5nIGJ5IGRlZmF1bHQKIHNldChDTUFLRV9FWFBPUlRfQ09NUElMRV9DT01NQU5EUyBPTikKIAorIyBTZXQgdGhlIENNQUtFX0JVSUxEX1RZUEUgaWYgaXQgaXMgbm90IGFscmVhZHkgZGVmaW5lZAoraW5jbHVkZShCdWlsZFR5cGUpCisKICMgUHV0IHRoZSBsaWJyYXJpZXMgYW5kIGJpbmFyaWVzIHRoYXQgZ2V0IGJ1aWx0IGludG8gZGlyZWN0b3JpZXMgYXQgdGhlCiAjIHRvcCBvZiB0aGUgYnVpbGQgdHJlZSByYXRoZXIgdGhhbiBpbiBoYXJkLXRvLWZpbmQgbGVhZgogIyBkaXJlY3Rvcmllcy4gVGhpcyBzaW1wbGlmaWVzIG1hbnVhbCB0ZXN0aW5nIGFuZCB0aGUgdXNlIG9mIHRoZSBidWlsZApAQCAtNjgsMyArNTksMzQgQEAKICMgbG9jYXRpb25zIGFuZCBydW5uaW5nIHRoZSBleGVjdXRhYmxlcyB3aXRob3V0IExEX1BSRUxPQUQgb3Igc2ltaWxhci4KICMgVGhpcyByZXF1aXJlcyB0aGUgbGlicmFyeSB0byBiZSBidWlsdCB3aXRoIHJwYXRoIHN1cHBvcnQuCiBzZXQoQ01BS0VfSU5TVEFMTF9SUEFUSF9VU0VfTElOS19QQVRIIFRSVUUpCisKKyMKKyMgQysrIExhbmd1YWdlIExldmVsIERlZmF1bHRzIC0gdGhpcyBkZXBlbmRzIG9uIHRoZSBjb21waWxlciBjYXBhYmlsaXRpZXMKKyMKK2lmIChOT1QgREVGSU5FRCBDTUFLRV9DWFhfU1RBTkRBUkQpCisgIHNldChDTUFLRV9DWFhfU1RBTkRBUkQgMTEpICMgQysrMTEKKyAgbWVzc2FnZShTVEFUVVMgIlNldHRpbmcgQysrMTEgYXMgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgbGV2ZWwuIikKKyAgbWVzc2FnZShTVEFUVVMgIlRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgQysrIGxhbmd1YWdlIGxldmVsLCBzZXQgQ01BS0VfQ1hYX1NUQU5EQVJEIikKK2VuZGlmKCkKKworaWYgKENNQUtFX0NYWF9TVEFOREFSRCBFUVVBTCA5OCkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAib25seSBDKysxMSBvciBhYm92ZSBDKysgc3RhbmRhcmQgaXMgc3VwcG9ydGVkIikKK2Vsc2VpZiAoQ01BS0VfQ1hYX1NUQU5EQVJEIEVRVUFMIDExKQorICAjIHNob3VsZCBub3QgZmFsbGJhY2sgdG8gQysrOTgKKyAgc2V0KENNQUtFX0NYWF9TVEFOREFSRF9SRVFVSVJFRCBPTikKK2VuZGlmKCkKKworaWYgKE5PVCBERUZJTkVEIENNQUtFX0NYWF9FWFRFTlNJT05TKQorICBzZXQoQ01BS0VfQ1hYX0VYVEVOU0lPTlMgT0ZGKSAgICAgICAgIyB1c2Ugc3RhbmRhcmRzIGNvbXBsaWFudCBsYW5ndWFnZSBsZXZlbCBmb3IgcG9ydGFiaWxpdHkKK2VuZGlmKCkKKworaWYoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJNU1ZDIikKKyAgaW5jbHVkZShDaGVja0NYWENvbXBpbGVyRmxhZykKKyAgc2V0KENNQUtFX1JFUVVJUkVEX1FVSUVUIE9OKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygiL1pjOl9fY3BsdXNwbHVzIiByZXNfdmFyKQorICBpZiAocmVzX3ZhcikKKyAgICAjIE1ha2UgTVNWQyByZXBvcnRpbmcgY29ycmVjdCB2YWx1ZSBmb3IgX19jcGx1c3BsdXMKKyAgICAjIFNlZSBodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS92Y2Jsb2cvMjAxOC8wNC8wOS9tc3ZjLW5vdy1jb3JyZWN0bHktcmVwb3J0cy1fX2NwbHVzcGx1cy8KKyAgICBhZGRfY29tcGlsZV9vcHRpb25zKCIvWmM6X19jcGx1c3BsdXMiKQorICBlbmRpZigpCitlbmRpZigpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9EZWZpbmVJbnN0YWxsYXRpb25QYXRocy5jbWFrZSBiL2J1aWxkL2NtYWtlL0RlZmluZUluc3RhbGxhdGlvblBhdGhzLmNtYWtlCmluZGV4IDEyMmYwZjYuLmQ5YTcxNzQgMTAwNjQ0Ci0tLSBhL2J1aWxkL2NtYWtlL0RlZmluZUluc3RhbGxhdGlvblBhdGhzLmNtYWtlCisrKyBiL2J1aWxkL2NtYWtlL0RlZmluZUluc3RhbGxhdGlvblBhdGhzLmNtYWtlCkBAIC0yMyw0ICsyMyw5IEBACiBzZXQoTElCX0lOU1RBTExfRElSICJsaWIke0xJQl9TVUZGSVh9IiBDQUNIRSBQQVRIICJUaGUgbGlicmFyeSBpbnN0YWxsIGRpciAoZGVmYXVsdDogbGliJHtMSUJfU1VGRklYfSkiKQogc2V0KElOQ0xVREVfSU5TVEFMTF9ESVIgImluY2x1ZGUiIENBQ0hFIFBBVEggIlRoZSBsaWJyYXJ5IGluc3RhbGwgZGlyIChkZWZhdWx0OiBpbmNsdWRlKSIpCiBzZXQoQ01BS0VfSU5TVEFMTF9ESVIgImNtYWtlIiBDQUNIRSBQQVRIICJUaGUgc3ViZGlyZWN0b3J5IHRvIGluc3RhbGwgY21ha2UgY29uZmlnIGZpbGVzIChkZWZhdWx0OiBjbWFrZSkiKQorc2V0KFBLR0NPTkZJR19JTlNUQUxMX0RJUiAibGliL3BrZ2NvbmZpZyIgQ0FDSEUgUEFUSCAiVGhlIHN1YmRpcmVjdG9yeSB0byBpbnN0YWxsIHBrZ2NvbmZpZyBjb25maWcgZmlsZXMgKGRlZmF1bHQ6IGxpYi9wa2djb25maWcpIikKIHNldChET0NfSU5TVEFMTF9ESVIgInNoYXJlL2RvYyIgQ0FDSEUgUEFUSCAiVGhlIHN1YmRpcmVjdG9yeSB0byBpbnN0YWxsIGRvY3VtZW50YXRpb24gZmlsZXMgKGRlZmF1bHQ6IHNoYXJlL2RvYykiKQorc2V0KHByZWZpeCAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0iKQorc2V0KGV4ZWNfcHJlZml4ICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS9iaW4iKQorc2V0KGxpYmRpciAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vbGliIikKK3NldChpbmNsdWRlZGlyICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS9pbmNsdWRlIikKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZU9wdGlvbnMuY21ha2UgYi9idWlsZC9jbWFrZS9EZWZpbmVPcHRpb25zLmNtYWtlCmluZGV4IDYyZTI0MGYuLjc3OGJlOGQgMTAwNjQ0Ci0tLSBhL2J1aWxkL2NtYWtlL0RlZmluZU9wdGlvbnMuY21ha2UKKysrIGIvYnVpbGQvY21ha2UvRGVmaW5lT3B0aW9ucy5jbWFrZQpAQCAtMjAsMTEgKzIwLDE2IEBACiAKIGluY2x1ZGUoQ01ha2VEZXBlbmRlbnRPcHRpb24pCiAKK3NldChUSFJJRlRfQ09NUElMRVIgIiIgQ0FDSEUgRklMRVBBVEggIkV4dGVybmFsIFRocmlmdCBjb21waWxlciB0byB1c2UgZHVyaW5nIGJ1aWxkIikKKwogIyBBZGRpdGlvbmFsIGNvbXBvbmVudHMKIG9wdGlvbihCVUlMRF9DT01QSUxFUiAiQnVpbGQgVGhyaWZ0IGNvbXBpbGVyIiBPTikKLW9wdGlvbihCVUlMRF9URVNUSU5HICJCdWlsZCB3aXRoIHVuaXQgdGVzdHMiIE9OKQotb3B0aW9uKEJVSUxEX0VYQU1QTEVTICJCdWlsZCBleGFtcGxlcyIgT04pCi1vcHRpb24oQlVJTERfVFVUT1JJQUxTICJCdWlsZCBUaHJpZnQgdHV0b3JpYWxzIiBPTikKKworaWYoQlVJTERfQ09NUElMRVIgT1IgRVhJU1RTICR7VEhSSUZUX0NPTVBJTEVSfSkKKyAgICBzZXQoSEFWRV9DT01QSUxFUiBPTikKK2VuZGlmKCkKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfVEVTVElORyAiQnVpbGQgd2l0aCB1bml0IHRlc3RzIiBPTiAiSEFWRV9DT01QSUxFUiIgT0ZGKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9UVVRPUklBTFMgIkJ1aWxkIFRocmlmdCB0dXRvcmlhbHMiIE9OICJIQVZFX0NPTVBJTEVSIiBPRkYpCiBvcHRpb24oQlVJTERfTElCUkFSSUVTICJCdWlsZCBUaHJpZnQgbGlicmFyaWVzIiBPTikKIAogIyBMaWJyYXJpZXMgdG8gYnVpbGQKQEAgLTM0LDExMCArMzksMTU4IEBACiAjIGFuZCBlbmFibGVzIHRoZSBsaWJyYXJ5IGlmIGFsbCBhcmUgZm91bmQuIFRoaXMgbWVhbnMgdGhlIGRlZmF1bHQgaXMgdG8gYnVpbGQgYXMKICMgbXVjaCBhcyBwb3NzaWJsZSBidXQgbGVhdmluZyBvdXQgbGlicmFyaWVzIGlmIHRoZWlyIGRlcGVuZGVuY2llcyBhcmUgbm90IG1ldC4KIAoraWYgKE5PVCBCb29zdF9VU0VfU1RBVElDX0xJQlMpCisgICAgYWRkX2RlZmluaXRpb25zKC1EQk9PU1RfQUxMX0RZTl9MSU5LKQorICAgIGFkZF9kZWZpbml0aW9ucygtREJPT1NUX1RFU1RfRFlOX0xJTkspCitlbmRpZigpCisKKyMgYXMzCitvcHRpb24oV0lUSF9BUzMgIkJ1aWxkIEFjdGlvblNjcmlwdCAzIFRocmlmdCBMaWJyYXJ5IiBPTikKK2lmIChXSVRIX0FTMykKKyAgICBzZXQoUE9TU0lCTEVfUEFUSFMgIiR7RkxFWF9IT01FfS9iaW4iICIkRU5We0ZMRVhfSE9NRX0vYmluIikKKyAgICBmaW5kX3Byb2dyYW0oSEFWRV9DT01QQyBOQU1FUyBjb21wYyBISU5UUyAke1BPU1NJQkxFX1BBVEhTfSkKK2VuZGlmICgpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0FTMyAiQnVpbGQgYXMzIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9BUzM7SEFWRV9DT01QQyIgT0ZGKQorCiAjIEMrKwogb3B0aW9uKFdJVEhfQ1BQICJCdWlsZCBDKysgVGhyaWZ0IGxpYnJhcnkiIE9OKQotZmluZF9wYWNrYWdlKEJvb3N0IDEuNTMgUVVJRVQpCi1DTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0NQUCAiQnVpbGQgQysrIGxpYnJhcnkiIE9OCi0gICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9DUFA7Qm9vc3RfRk9VTkQiIE9GRikKLSMgTk9URTogQ3VycmVudGx5IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgQysrIHNwZWNpZmljLAotIyBidXQgaW4gZnV0dXJlIG90aGVyIGxpYnJhcmllcyBtaWdodCByZXVzZSB0aGVtLgotIyBTbyB0aGV5IGFyZSBub3QgZGVwZW5kZW50IG9uIFdJVEhfQ1BQIGJ1dCBzZXR0aW5nIHRoZW0gd2l0aG91dCBXSVRIX0NQUCBjdXJyZW50bHkKLSMgaGFzIG5vIGVmZmVjdC4KLWZpbmRfcGFja2FnZShaTElCIFFVSUVUKQotQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1pMSUIgIkJ1aWxkIHdpdGggWkxJQiBzdXBwb3J0IiBPTgotICAgICAgICAgICAgICAgICAgICAgICAiWkxJQl9GT1VORCIgT0ZGKQotZmluZF9wYWNrYWdlKExpYmV2ZW50IFFVSUVUKQotQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX0xJQkVWRU5UICJCdWlsZCB3aXRoIGxpYmV2ZW50IHN1cHBvcnQiIE9OCi0gICAgICAgICAgICAgICAgICAgICAgICJMaWJldmVudF9GT1VORCIgT0ZGKQotZmluZF9wYWNrYWdlKFF0NCBRVUlFVCBDT01QT05FTlRTIFF0Q29yZSBRdE5ldHdvcmspCi1DTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfUVQ0ICJCdWlsZCB3aXRoIFF0NCBzdXBwb3J0IiBPTgotICAgICAgICAgICAgICAgICAgICAgICAiUVQ0X0ZPVU5EIiBPRkYpCi1maW5kX3BhY2thZ2UoUXQ1IFFVSUVUIENPTVBPTkVOVFMgQ29yZSBOZXR3b3JrKQotQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1FUNSAiQnVpbGQgd2l0aCBRdDUgc3VwcG9ydCIgT04KLSAgICAgICAgICAgICAgICAgICAgICAgIlF0NV9GT1VORCIgT0ZGKQotaWYoJHtXSVRIX1FUNH0gQU5EICR7V0lUSF9RVDV9IEFORCAke0NNQUtFX01BSk9SX1ZFUlNJT059IExFU1MgMykKLSAgIyBjbWFrZSA8IDMuMC4wIGNhdXNlcyBjb25mbGljdCB3aGVuIGJ1aWxkaW5nIGJvdGggUXQ0IGFuZCBRdDUKLSAgc2V0KFdJVEhfUVQ0IE9GRikKK2lmKFdJVEhfQ1BQKQorICAgICMgTk9URTogQ3VycmVudGx5IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgQysrIHNwZWNpZmljLAorICAgICMgYnV0IGluIGZ1dHVyZSBvdGhlciBsaWJyYXJpZXMgbWlnaHQgcmV1c2UgdGhlbS4KKyAgICAjIFNvIHRoZXkgYXJlIG5vdCBkZXBlbmRlbnQgb24gV0lUSF9DUFAgYnV0IHNldHRpbmcgdGhlbSB3aXRob3V0IFdJVEhfQ1BQIGN1cnJlbnRseQorICAgICMgaGFzIG5vIGVmZmVjdC4KKyAgICBpZihaTElCX0xJQlJBUlkpCisgICAgICAgICMgRmluZFpMSUIuY21ha2UgZG9lcyBub3Qgbm9ybWFsaXplIHBhdGggc28gd2UgbmVlZCB0byBkbyBpdCBvdXJzZWx2ZXMuCisgICAgICAgIGZpbGUoVE9fQ01BS0VfUEFUSCAke1pMSUJfTElCUkFSWX0gWkxJQl9MSUJSQVJZKQorICAgIGVuZGlmKCkKKyAgICBmaW5kX3BhY2thZ2UoWkxJQiBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfWkxJQiAiQnVpbGQgd2l0aCBaTElCIHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiWkxJQl9GT1VORCIgT0ZGKQorICAgIGZpbmRfcGFja2FnZShMaWJldmVudCBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfTElCRVZFTlQgIkJ1aWxkIHdpdGggbGliZXZlbnQgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaWJldmVudF9GT1VORCIgT0ZGKQorICAgIGZpbmRfcGFja2FnZShRdDUgUVVJRVQgQ09NUE9ORU5UUyBDb3JlIE5ldHdvcmspCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1FUNSAiQnVpbGQgd2l0aCBRdDUgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdDVfRk9VTkQiIE9GRikKKyAgICBmaW5kX3BhY2thZ2UoT3BlblNTTCBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfT1BFTlNTTCAiQnVpbGQgd2l0aCBPcGVuU1NMIHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1BFTlNTTF9GT1VORCIgT0ZGKQogZW5kaWYoKQotZmluZF9wYWNrYWdlKE9wZW5TU0wgUVVJRVQpCi1DTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfT1BFTlNTTCAiQnVpbGQgd2l0aCBPcGVuU1NMIHN1cHBvcnQiIE9OCi0gICAgICAgICAgICAgICAgICAgICAgICJPUEVOU1NMX0ZPVU5EIiBPRkYpCi1vcHRpb24oV0lUSF9TVERUSFJFQURTICJCdWlsZCB3aXRoIEMrKyBzdGQ6OnRocmVhZCBzdXBwb3J0IiBPRkYpCi1DTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfQk9PU1RUSFJFQURTICJCdWlsZCB3aXRoIEJvb3N0IHRocmVhZHMgc3VwcG9ydCIgT0ZGCi0gICAgIk5PVCBXSVRIX1NURFRIUkVBRFM7Qm9vc3RfRk9VTkQiIE9GRikKLQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9DUFAgIkJ1aWxkIEMrKyBsaWJyYXJ5IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfQ1BQIiBPRkYpCiAKICMgQyBHTGliCiBvcHRpb24oV0lUSF9DX0dMSUIgIkJ1aWxkIEMgKEdMaWIpIFRocmlmdCBsaWJyYXJ5IiBPTikKLWZpbmRfcGFja2FnZShHTElCIFFVSUVUIENPTVBPTkVOVFMgZ29iamVjdCkKK2lmKFdJVEhfQ19HTElCKQorICAgIGZpbmRfcGFja2FnZShHTElCIFFVSUVUIENPTVBPTkVOVFMgZ29iamVjdCkKK2VuZGlmKCkKIENNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfQ19HTElCICJCdWlsZCBDIChHTGliKSBsaWJyYXJ5IiBPTgogICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfQ19HTElCO0dMSUJfRk9VTkQiIE9GRikKKwogIyBKYXZhCiBvcHRpb24oV0lUSF9KQVZBICJCdWlsZCBKYXZhIFRocmlmdCBsaWJyYXJ5IiBPTikKLWZpbmRfcGFja2FnZShKYXZhIFFVSUVUKQotZmluZF9wYWNrYWdlKEFudCBRVUlFVCkKLUNNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfSkFWQSAiQnVpbGQgSmF2YSBsaWJyYXJ5IiBPTgotICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfSkFWQTtKQVZBX0ZPVU5EO0FOVF9GT1VORCIgT0ZGKQoraWYoQU5EUk9JRCkKKyAgICBmaW5kX3BhY2thZ2UoR3JhZGxlIFFVSUVUKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfSkFWQSAiQnVpbGQgSmF2YSBsaWJyYXJ5IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0pBVkE7R1JBRExFX0ZPVU5EIiBPRkYpCitlbHNlKCkKKyAgICBmaW5kX3BhY2thZ2UoR3JhZGxldyBRVUlFVCkKKyAgICBmaW5kX3BhY2thZ2UoSmF2YSBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0pBVkEgIkJ1aWxkIEphdmEgbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9KQVZBO0pBVkFfRk9VTkQ7R1JBRExFV19GT1VORCIgT0ZGKQorZW5kaWYoKQogCiAjIFB5dGhvbgogb3B0aW9uKFdJVEhfUFlUSE9OICJCdWlsZCBQeXRob24gVGhyaWZ0IGxpYnJhcnkiIE9OKQogZmluZF9wYWNrYWdlKFB5dGhvbkludGVycCBRVUlFVCkgIyBmb3IgUHl0aG9uIGV4ZWN1dGFibGUKIGZpbmRfcGFja2FnZShQeXRob25MaWJzIFFVSUVUKSAjIGZvciBQeXRob24uaAogQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9QWVRIT04gIkJ1aWxkIFB5dGhvbiBsaWJyYXJ5IiBPTgotICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfUFlUSE9OO1BZVEhPTkxJQlNfRk9VTkQiIE9GRikKKyAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX1BZVEhPTjtQWVRIT05JTlRFUlBfRk9VTkQ7UFlUSE9OTElCU19GT1VORCIgT0ZGKQorCisjIEhhc2tlbGwKK29wdGlvbihXSVRIX0hBU0tFTEwgIkJ1aWxkIEhhc2tlbGwgVGhyaWZ0IGxpYnJhcnkiIE9OKQorZmluZF9wYWNrYWdlKEdIQyBRVUlFVCkKK2ZpbmRfcGFja2FnZShDYWJhbCBRVUlFVCkKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfSEFTS0VMTCAiQnVpbGQgR0hDIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9IQVNLRUxMO0dIQ19GT1VORDtDQUJBTF9GT1VORCIgT0ZGKQogCiAjIENvbW1vbiBsaWJyYXJ5IG9wdGlvbnMKLW9wdGlvbihXSVRIX1NIQVJFRF9MSUIgIkJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiIE9OKQotb3B0aW9uKFdJVEhfU1RBVElDX0xJQiAiQnVpbGQgc3RhdGljIGxpYnJhcmllcyIgT04pCi1pZiAoTk9UIFdJVEhfU0hBUkVEX0xJQiBBTkQgTk9UIFdJVEhfU1RBVElDX0xJQikKLSAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDYW5ub3QgYnVpbGQgd2l0aCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIG91dHB1dHMgZGlzYWJsZWQhIikKLWVuZGlmKCkKKyMgaHR0cHM6Ly9jbWFrZS5vcmcvY21ha2UvaGVscC9sYXRlc3QvdmFyaWFibGUvQlVJTERfU0hBUkVEX0xJQlMuaHRtbAorIyBEZWZhdWx0IG9uIFdpbmRvd3MgaXMgc3RhdGljLCBzaGFyZWQgbW9kZSBsaWJyYXJ5IHN1cHBvcnQgbmVlZHMgd29yay4uLgorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9TSEFSRURfTElCUyAiQnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgT0ZGICJXSU4zMiIgT04pCiAKLSNOT1RFOiBDKysgY29tcGlsZXIgb3B0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgbGliL2NwcC9DTWFrZUxpc3RzLnR4dAoraWYgKFdJVEhfU0hBUkVEX0xJQikKKyAgICBtZXNzYWdlKFdBUk5JTkcgIldJVEhfU0hBUkVEX0xJQiBpcyBkZXByZWNhdGVkOyB1c2UgLURCVUlMRF9TSEFSRURfTElCUz1PTiBpbnN0ZWFkIikKKyAgICBzZXQoQlVJTERfU0hBUkVEX0xJQlMgT04pCitlbHNlaWYgKFdJVEhfU1RBVElDX0xJQikKKyAgICBpZiAoV0lUSF9TSEFSRURfTElCKQorICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDYW5ub3QgYnVpbGQgc2hhcmVkIGFuZCBzdGF0aWMgdG9nZXRoZXI7IHNldCBCVUlMRF9TSEFSRURfTElCUyBpbnN0ZWFkLiIpCisgICAgZW5kaWYgKCkKKyAgICBtZXNzYWdlKFdBUk5JTkcgIldJVEhfU1RBVElDX0xJQiBpcyBkZXByZWNhdGVkOyB1c2UgLURCVUlMRF9TSEFSRURfTElCUz1PRkYgaW5zdGVhZCIpCisgICAgc2V0KEJVSUxEX1NIQVJFRF9MSUJTIE9GRikKK2VuZGlmICgpCiAKICMgVmlzdWFsIFN0dWRpbyBvbmx5IG9wdGlvbnMKIGlmKE1TVkMpCi1vcHRpb24oV0lUSF9NVCAiQnVpbGQgdXNpbmcgTVQgaW5zdGVhZCBvZiBNRCAoTVNWQyBvbmx5KSIgT0ZGKQorICAgIG9wdGlvbihXSVRIX01UICJCdWlsZCB1c2luZyBNVCBpbnN0ZWFkIG9mIE1EIChNU1ZDIG9ubHkpIiBPRkYpCiBlbmRpZihNU1ZDKQogCiBtYWNybyhNRVNTQUdFX0RFUCBmbGFnIHN1bW1hcnkpCiBpZihOT1QgJHtmbGFnfSkKLSAgbWVzc2FnZShTVEFUVVMgIiAgIC0gJHtzdW1tYXJ5fSIpCisgICAgbWVzc2FnZShTVEFUVVMgIiAgIC0gJHtzdW1tYXJ5fSIpCiBlbmRpZigpCiBlbmRtYWNybyhNRVNTQUdFX0RFUCBmbGFnIHN1bW1hcnkpCiAKIG1hY3JvKFBSSU5UX0NPTkZJR19TVU1NQVJZKQogbWVzc2FnZShTVEFUVVMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKQotbWVzc2FnZShTVEFUVVMgIlRocmlmdCB2ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJHt0aHJpZnRfVkVSU0lPTn0gKCR7dGhyaWZ0X1ZFUlNJT05fTUFKT1J9LiR7dGhyaWZ0X1ZFUlNJT05fTUlOT1J9LiR7dGhyaWZ0X1ZFUlNJT05fUEFUQ0h9KSIpCi1tZXNzYWdlKFNUQVRVUyAiVGhyaWZ0IHBhY2thZ2UgdmVyc2lvbjogICAgICAgICAgICAgICAke1BBQ0tBR0VfVkVSU0lPTn0iKQotbWVzc2FnZShTVEFUVVMgIkJ1aWxkIGNvbmZpZ3VyYXRpb24gU3VtbWFyeSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBUaHJpZnQgY29tcGlsZXI6ICAgICAgICAgICAgICAke0JVSUxEX0NPTVBJTEVSfSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIHVuaXQgdGVzdHM6ICAgICAgICAgICAgICAke0JVSUxEX1RFU1RJTkd9IikKLW1lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIGV4YW1wbGVzOiAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfRVhBTVBMRVN9IikKLW1lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIFRocmlmdCBsaWJyYXJpZXM6ICAgICAgICAgICAgICR7QlVJTERfTElCUkFSSUVTfSIpCi1tZXNzYWdlKFNUQVRVUyAiIExhbmd1YWdlIGxpYnJhcmllczoiKQotbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgQysrIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAgJHtCVUlMRF9DUFB9IikKLU1FU1NBR0VfREVQKFdJVEhfQ1BQICJEaXNhYmxlZCBieSB2aWEgV0lUSF9DQ1A9T0ZGIikKLU1FU1NBR0VfREVQKEJvb3N0X0ZPVU5EICJCb29zdCBoZWFkZXJzIG1pc3NpbmciKQotbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgQyAoR0xpYikgbGlicmFyeTogICAgICAgICAgICAgJHtCVUlMRF9DX0dMSUJ9IikKLU1FU1NBR0VfREVQKFdJVEhfQ19HTElCICJEaXNhYmxlZCBieSB2aWEgV0lUSF9DX0dMSUI9T0ZGIikKK21lc3NhZ2UoU1RBVFVTICJUaHJpZnQgdmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aHJpZnRfVkVSU0lPTn0gKCR7dGhyaWZ0X1ZFUlNJT05fTUFKT1J9LiR7dGhyaWZ0X1ZFUlNJT05fTUlOT1J9LiR7dGhyaWZ0X1ZFUlNJT05fUEFUQ0h9KSIpCittZXNzYWdlKFNUQVRVUyAiVGhyaWZ0IHBhY2thZ2UgdmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICR7UEFDS0FHRV9WRVJTSU9OfSIpCittZXNzYWdlKFNUQVRVUykKK21lc3NhZ2UoU1RBVFVTICJCdWlsZCBjb25maWd1cmF0aW9uIHN1bW1hcnkiKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgY29tcGlsZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0NPTVBJTEVSfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBsaWJyYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfTElCUkFSSUVTfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB0ZXN0czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfVEVTVElOR30iKQorTUVTU0FHRV9ERVAoSEFWRV9DT01QSUxFUiAiRGlzYWJsZWQgYmVjYXVzZSBCVUlMRF9USFJJRlQ9T0ZGIGFuZCBubyB2YWxpZCBUSFJJRlRfQ09NUElMRVIgaXMgZ2l2ZW4iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgdHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0NNQUtFX0JVSUxEX1RZUEV9IikKK21lc3NhZ2UoU1RBVFVTKQorbWVzc2FnZShTVEFUVVMgIkxhbmd1YWdlIGxpYnJhcmllczoiKQorbWVzc2FnZShTVEFUVVMpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBhczMgbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfQVMzfSIpCitNRVNTQUdFX0RFUChXSVRIX0FTMyAiRGlzYWJsZWQgYnkgV0lUSF9BUzM9T0ZGIikKK01FU1NBR0VfREVQKEhBVkVfQ09NUEMgIkFkb2JlIEZsZXggY29tcGMgd2FzIG5vdCBmb3VuZCAtIGRpZCB5b3Ugc2V0IGVudiB2YXIgRkxFWF9IT01FPyIpCittZXNzYWdlKFNUQVRVUykKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIEMrKyBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9DUFB9IikKK01FU1NBR0VfREVQKFdJVEhfQ1BQICJEaXNhYmxlZCBieSBXSVRIX0NQUD1PRkYiKQoraWYgKEJVSUxEX0NQUCkKKyAgICBtZXNzYWdlKFNUQVRVUyAiICAgIEMrKyBMYW5ndWFnZSBMZXZlbDogICAgICAgICAgICAgICAgICAgICAgICR7Q1hYX0xBTkdVQUdFX0xFVkVMfSIpCisgICAgbWVzc2FnZShTVEFUVVMgIiAgICBCdWlsZCBzaGFyZWQgbGlicmFyaWVzOiAgICAgICAgICAgICAgICAgICAke0JVSUxEX1NIQVJFRF9MSUJTfSIpCisgICAgbWVzc2FnZShTVEFUVVMgIiAgICBCdWlsZCB3aXRoIGxpYmV2ZW50IHN1cHBvcnQ6ICAgICAgICAgICAgICAke1dJVEhfTElCRVZFTlR9IikKKyAgICBtZXNzYWdlKFNUQVRVUyAiICAgIEJ1aWxkIHdpdGggUXQ1IHN1cHBvcnQ6ICAgICAgICAgICAgICAgICAgICR7V0lUSF9RVDV9IikKKyAgICBtZXNzYWdlKFNUQVRVUyAiICAgIEJ1aWxkIHdpdGggWkxJQiBzdXBwb3J0OiAgICAgICAgICAgICAgICAgICR7V0lUSF9aTElCfSIpCitlbmRpZiAoKQorbWVzc2FnZShTVEFUVVMpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBDIChHTGliKSBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfQ19HTElCfSIpCitNRVNTQUdFX0RFUChXSVRIX0NfR0xJQiAiRGlzYWJsZWQgYnkgV0lUSF9DX0dMSUI9T0ZGIikKIE1FU1NBR0VfREVQKEdMSUJfRk9VTkQgIkdMaWIgbWlzc2luZyIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBKYXZhIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAke0JVSUxEX0pBVkF9IikKLU1FU1NBR0VfREVQKFdJVEhfSkFWQSAiRGlzYWJsZWQgYnkgdmlhIFdJVEhfSkFWQT1PRkYiKQotTUVTU0FHRV9ERVAoSkFWQV9GT1VORCAiSmF2YSBSdW50aW1lIG1pc3NpbmciKQotTUVTU0FHRV9ERVAoQU5UX0ZPVU5EICJBbnQgbWlzc2luZyIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBQeXRob24gbGlicmFyeTogICAgICAgICAgICAgICAke0JVSUxEX1BZVEhPTn0iKQotTUVTU0FHRV9ERVAoV0lUSF9QWVRIT04gIkRpc2FibGVkIGJ5IHZpYSBXSVRIX1BZVEhPTj1PRkYiKQorbWVzc2FnZShTVEFUVVMpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBKYXZhIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfSkFWQX0iKQorTUVTU0FHRV9ERVAoV0lUSF9KQVZBICJEaXNhYmxlZCBieSBXSVRIX0pBVkE9T0ZGIikKK2lmKEFORFJPSUQpCisgICAgTUVTU0FHRV9ERVAoR1JBRExFX0ZPVU5EICJHcmFkbGUgbWlzc2luZyIpCitlbHNlKCkKKyAgICBNRVNTQUdFX0RFUChKQVZBX0ZPVU5EICJKYXZhIFJ1bnRpbWUgbWlzc2luZyIpCisgICAgTUVTU0FHRV9ERVAoR1JBRExFV19GT1VORCAiR3JhZGxlIFdyYXBwZXIgbWlzc2luZyIpCitlbmRpZigpCittZXNzYWdlKFNUQVRVUykKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIFB5dGhvbiBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9QWVRIT059IikKK01FU1NBR0VfREVQKFdJVEhfUFlUSE9OICJEaXNhYmxlZCBieSBXSVRIX1BZVEhPTj1PRkYiKQogTUVTU0FHRV9ERVAoUFlUSE9OTElCU19GT1VORCAiUHl0aG9uIGxpYnJhcmllcyBtaXNzaW5nIikKLW1lc3NhZ2UoU1RBVFVTICIgTGlicmFyeSBmZWF0dXJlczoiKQotbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgc2hhcmVkIGxpYnJhcmllczogICAgICAgICAgICAgJHtXSVRIX1NIQVJFRF9MSUJ9IikKLW1lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHN0YXRpYyBsaWJyYXJpZXM6ICAgICAgICAgICAgICR7V0lUSF9TVEFUSUNfTElCfSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFpMSUIgc3VwcG9ydDogICAgICAgICAgICAke1dJVEhfWkxJQn0iKQotbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBsaWJldmVudCBzdXBwb3J0OiAgICAgICAgJHtXSVRIX0xJQkVWRU5UfSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFF0NCBzdXBwb3J0OiAgICAgICAgICAgICAke1dJVEhfUVQ0fSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFF0NSBzdXBwb3J0OiAgICAgICAgICAgICAke1dJVEhfUVQ1fSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIE9wZW5TU0wgc3VwcG9ydDogICAgICAgICAke1dJVEhfT1BFTlNTTH0iKQotbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBCb29zdCB0aHJlYWQgc3VwcG9ydDogICAgJHtXSVRIX0JPT1NUVEhSRUFEU30iKQotbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBDKysgc3RkOjp0aHJlYWQgc3VwcG9ydDogJHtXSVRIX1NURFRIUkVBRFN9IikKK21lc3NhZ2UoU1RBVFVTKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgSGFza2VsbCBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0hBU0tFTEx9IikKK01FU1NBR0VfREVQKFdJVEhfSEFTS0VMTCAiRGlzYWJsZWQgYnkgV0lUSF9IQVNLRUxMPU9GRiIpCitNRVNTQUdFX0RFUChHSENfRk9VTkQgIkdIQyBtaXNzaW5nIikKK01FU1NBR0VfREVQKENBQkFMX0ZPVU5EICJDYWJhbCBtaXNzaW5nIikKK21lc3NhZ2UoU1RBVFVTKQogbWVzc2FnZShTVEFUVVMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKQogZW5kbWFjcm8oUFJJTlRfQ09ORklHX1NVTU1BUlkpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9EZWZpbmVQbGF0Zm9ybVNwZWNpZmMuY21ha2UgYi9idWlsZC9jbWFrZS9EZWZpbmVQbGF0Zm9ybVNwZWNpZmMuY21ha2UKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0MGVjNjI3Li5jMGJiNTI5Ci0tLSBhL2J1aWxkL2NtYWtlL0RlZmluZVBsYXRmb3JtU3BlY2lmYy5jbWFrZQorKysgYi9idWlsZC9jbWFrZS9EZWZpbmVQbGF0Zm9ybVNwZWNpZmMuY21ha2UKQEAgLTE3LDkgKzE3LDQ0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCisjIFVuY29tbWVudCB0aGlzIHRvIHNob3cgc29tZSBiYXNpYyBjbWFrZSB2YXJpYWJsZXMgYWJvdXQgcGxhdGZvcm1zCisjIGluY2x1ZGUgKE5ld1BsYXRmb3JtRGVidWcpCisKKyMgRm9yIERlYnVnIGJ1aWxkIHR5cGVzLCBhcHBlbmQgYSAiZCIgdG8gdGhlIGxpYnJhcnkgbmFtZXMuCitzZXQoQ01BS0VfREVCVUdfUE9TVEZJWCAiZCIgQ0FDSEUgU1RSSU5HICJTZXQgZGVidWcgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKworIyBiYXNpYyBvcHRpb25zCitmb3JlYWNoKGxhbmcgSU4gSVRFTVMgQyBDWFgpCisgIGlmKENNQUtFXyR7bGFuZ31fQ09NUElMRVJfSUQgU1RSRVFVQUwgIkNsYW5nIikKKyAgICBzZXQoQ01BS0VfJHtsYW5nfV9GTEFHUyAiJHtDTUFLRV8ke2xhbmd9X0ZMQUdTfSAtV2FsbCIpCisgICAgc2V0KENNQUtFXyR7bGFuZ31fRkxBR1MgIiR7Q01BS0VfJHtsYW5nfV9GTEFHU30gLWZlcnJvci1saW1pdD0xIikKKyAgZWxzZWlmKENNQUtFXyR7bGFuZ31fQ09NUElMRVJfSUQgU1RSRVFVQUwgIkdOVSIpCisgICAgc2V0KENNQUtFXyR7bGFuZ31fRkxBR1MgIiR7Q01BS0VfJHtsYW5nfV9GTEFHU30gLVdhbGwgLVdleHRyYSIpCisgICAgc2V0KENNQUtFXyR7bGFuZ31fRkxBR1MgIiR7Q01BS0VfJHtsYW5nfV9GTEFHU30gLWZtYXgtZXJyb3JzPTEiKQorICBlbHNlaWYoQ01BS0VfJHtsYW5nfV9DT01QSUxFUl9JRCBTVFJFUVVBTCAiTVNWQyIpCisgICAgc2V0KENNQUtFXyR7bGFuZ31fRkxBR1MgIiR7Q01BS0VfJHtsYW5nfV9GTEFHU30gL01QIikgIyBwYXJhbGxlbCBidWlsZAorICAgIHNldChDTUFLRV8ke2xhbmd9X0ZMQUdTICIke0NNQUtFXyR7bGFuZ31fRkxBR1N9IC9XMyIpICMgd2FybmluZyBsZXZlbCAzCisgICAgaW5jbHVkZShDaGVja0NYWENvbXBpbGVyRmxhZykKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfUVVJRVQgT04pCisgICAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoIi9zb3VyY2UtY2hhcnNldDp1dGYtOCIgcmVzX3ZhcikKKyAgICBpZiAocmVzX3ZhcikKKyAgICAgIHNldChDTUFLRV8ke2xhbmd9X0ZMQUdTICIke0NNQUtFXyR7bGFuZ31fRkxBR1N9IC9zb3VyY2UtY2hhcnNldDp1dGYtOCIpCisgICAgZW5kaWYoKQorICAgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKCIvZXhlY3V0aW9uLWNoYXJzZXQ6dXRmLTgiIHJlc192YXIpCisgICAgaWYgKHJlc192YXIpCisgICAgICBzZXQoQ01BS0VfJHtsYW5nfV9GTEFHUyAiJHtDTUFLRV8ke2xhbmd9X0ZMQUdTfSAvZXhlY3V0aW9uLWNoYXJzZXQ6dXRmLTgiKQorICAgIGVuZGlmKCkKKyAgICBhZGRfZGVmaW5pdGlvbnMoIi1EVU5JQ09ERSAtRF9VTklDT0RFIikKKyAgZW5kaWYoKQorZW5kZm9yZWFjaCgpCiAKICMgVmlzdWFsIFN0dWRpbyBzcGVjaWZpYyBvcHRpb25zCiBpZihNU1ZDKQorICAgICMgQWxsb3cgZm9yIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkcworICAgIGlmKEJVSUxEX1NIQVJFRF9MSUJTKQorICAgICAgICBzZXQoQ01BS0VfV0lORE9XU19FWFBPUlRfQUxMX1NZTUJPTFMgT04gQ0FDSEUgVFlQRSBCT09MIEZPUkNFKQorICAgIGVuZGlmKCkKKwogICAgICNGb3IgdmlzdWFsIHN0dWRpbyB0aGUgbGlicmFyeSBuYW1pbmcgaXMgYXMgZm9sbG93aW5nOgogICAgICMgRHluYW1pYyBsaWJyYXJpZXM6CiAgICAgIyAgLSB0aHJpZnQuZGxsICBmb3IgcmVsZWFzZSBsaWJyYXJ5CkBAIC0zNCw2MSArNjksNDggQEAKICAgICAjCiAgICAgIyB0aGUgc2FtZSBob2xkcyBmb3Igb3RoZXIgbGlicmFyaWVzIGxpa2UgbGlidGhyaWZ0eiBldGMuCiAKLSAgICAjIEZvciBEZWJ1ZyBidWlsZCB0eXBlcywgYXBwZW5kIGEgImQiIHRvIHRoZSBsaWJyYXJ5IG5hbWVzLgotICAgIHNldChDTUFLRV9ERUJVR19QT1NURklYICJkIiBDQUNIRSBTVFJJTkcgIlNldCBkZWJ1ZyBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQotICAgIHNldChDTUFLRV9SRUxFQVNFX1BPU1RGSVggIiIgQ0FDSEUgU1RSSU5HICJTZXQgcmVsZWFzZSBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQotCiAgICAgIyBCdWlsZCB1c2luZyAvTVQgb3B0aW9uIGluc3RlYWQgb2YgL01EIGlmIHRoZSBXSVRIX01UIG9wdGlvbnMgaXMgc2V0CiAgICAgaWYoV0lUSF9NVCkKICAgICAgICAgc2V0KENvbXBpbGVyRmxhZ3MKICAgICAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1MKICAgICAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1NfREVCVUcKICAgICAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRQorICAgICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GTwogICAgICAgICAgICAgICAgIENNQUtFX0NfRkxBR1MKICAgICAgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTX0RFQlVHCiAgICAgICAgICAgICAgICAgQ01BS0VfQ19GTEFHU19SRUxFQVNFCisgICAgICAgICAgICAgICAgQ01BS0VfQ19GTEFHU19SRUxXSVRIREVCSU5GTwogICAgICAgICAgICAgICAgICkKICAgICAgICAgZm9yZWFjaChDb21waWxlckZsYWcgJHtDb21waWxlckZsYWdzfSkKICAgICAgICAgICBzdHJpbmcoUkVQTEFDRSAiL01EIiAiL01UIiAke0NvbXBpbGVyRmxhZ30gIiR7JHtDb21waWxlckZsYWd9fSIpCiAgICAgICAgIGVuZGZvcmVhY2goKQotICAgICAgICBzZXQoU1RBVElDX1BPU1RGSVggIm10IiBDQUNIRSBTVFJJTkcgIlNldCBzdGF0aWMgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKyAgICAgICAgc2V0KFRIUklGVF9SVU5USU1FX1BPU1RGSVggIm10IiBDQUNIRSBTVFJJTkcgIlNldCBydW50aW1lIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCiAgICAgZWxzZShXSVRIX01UKQotICAgICAgICBzZXQoU1RBVElDX1BPU1RGSVggIm1kIiBDQUNIRSBTVFJJTkcgIlNldCBzdGF0aWMgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKyAgICAgICAgc2V0KFRIUklGVF9SVU5USU1FX1BPU1RGSVggIm1kIiBDQUNIRSBTVFJJTkcgIlNldCBydW50aW1lIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCiAgICAgZW5kaWYoV0lUSF9NVCkKIAotICAgICMgRGlzYWJsZSBXaW5kb3dzLmggZGVmaW5pdGlvbiBvZiBtYWNyb3MgZm9yIG1pbiBhbmQgbWF4Ci0gICAgYWRkX2RlZmluaXRpb25zKCItRE5PTUlOTUFYIikKLQogICAgICMgRGlzYWJsZSBib29zdCBhdXRvIGxpbmtpbmcgcHJhZ21hcyAtIGNtYWtlIGluY2x1ZGVzIHRoZSByaWdodCBmaWxlcwogICAgIGFkZF9kZWZpbml0aW9ucygiLURCT09TVF9BTExfTk9fTElCIikKLQotICAgICMgV2luZG93cyBidWlsZCBkb2VzIG5vdCBrbm93IGhvdyB0byBtYWtlIGEgc2hhcmVkIGxpYnJhcnkgeWV0Ci0gICAgIyBhcyB0aGVyZSBhcmUgbm8gX19kZWNsc3BlYyhkbGxleHBvcnQpIG9yIGV4cG9ydHMgZmlsZXMgaW4gdGhlIHByb2plY3QuCi0gICAgaWYgKFdJVEhfU0hBUkVEX0xJQikKLSAgICAgIG1lc3NhZ2UgKEZBVEFMX0VSUk9SICJXaW5kb3dzIGJ1aWxkIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcnkgb3V0cHV0IHlldCwgcGxlYXNlIHNldCAtRFdJVEhfU0hBUkVEX0xJQj1vZmYiKQotICAgIGVuZGlmKCkKLQogZWxzZWlmKFVOSVgpCiAgIGZpbmRfcHJvZ3JhbSggTUVNT1JZQ0hFQ0tfQ09NTUFORCB2YWxncmluZCApCiAgIHNldCggTUVNT1JZQ0hFQ0tfQ09NTUFORF9PUFRJT05TICItLWdlbi1zdXBwcmVzc2lvbnM9YWxsIC0tbGVhay1jaGVjaz1mdWxsIiApCiAgIHNldCggTUVNT1JZQ0hFQ0tfU1VQUFJFU1NJT05TX0ZJTEUgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzIiApCiBlbmRpZigpCiAKLSMgV0lUSF8qVEhSRUFEUyBzZWxlY3RzIHdoaWNoIHRocmVhZGluZyBsaWJyYXJ5IHRvIHVzZQotaWYoV0lUSF9CT09TVFRIUkVBRFMpCi0gIGFkZF9kZWZpbml0aW9ucygiLURVU0VfQk9PU1RfVEhSRUFEPTEiKQotZWxzZWlmKFdJVEhfU1REVEhSRUFEUykKLSAgYWRkX2RlZmluaXRpb25zKCItRFVTRV9TVERfVEhSRUFEPTEiKQorYWRkX2RlZmluaXRpb25zKCItRF9fU1REQ19GT1JNQVRfTUFDUk9TIikKK2FkZF9kZWZpbml0aW9ucygiLURfX1NURENfTElNSVRfTUFDUk9TIikKKworIyBDKysgTGFuZ3VhZ2UgTGV2ZWwKK3NldChDWFhfTEFOR1VBR0VfTEVWRUwgIkMrKyR7Q01BS0VfQ1hYX1NUQU5EQVJEfSIpCitpZiAoQ01BS0VfQ1hYX1NUQU5EQVJEX1JFUVVJUkVEKQorICBzdHJpbmcoQ09OQ0FUIENYWF9MQU5HVUFHRV9MRVZFTCAiJHtDWFhfTEFOR1VBR0VfTEVWRUx9IFtjb21waWxlciBtdXN0IHN1cHBvcnQgaXRdIikKK2Vsc2UoKQorICBzdHJpbmcoQ09OQ0FUIENYWF9MQU5HVUFHRV9MRVZFTCAiJHtDWFhfTEFOR1VBR0VfTEVWRUx9IFtmYWxsYmFjayB0byBlYXJsaWVyIGlmIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgaXRdIikKK2VuZGlmKCkKK2lmIChDTUFLRV9DWFhfRVhURU5TSU9OUykKKyAgc3RyaW5nKENPTkNBVCBDWFhfTEFOR1VBR0VfTEVWRUwgIiR7Q1hYX0xBTkdVQUdFX0xFVkVMfSBbd2l0aCBjb21waWxlci1zcGVjaWZpYyBleHRlbnNpb25zXSIpCiBlbmRpZigpCiAKLSMgR0NDIGFuZCBDbGFuZy4KLWlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIE9SIENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCBPUiBDTUFLRV9DWFhfQ09NUElMRVJfSUQgTUFUQ0hFUyAiQ2xhbmciKQotICAjIEZJWE1FIC1wZWRhbnRpYyBjYW4gbm90IGJlIHVzZWQgYXQgdGhlIG1vbWVudCBiZWNhdXNlIG9mOiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNzg0Ci0gICNzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXN0ZD1jKysxMSAtTzIgLVdhbGwgLVdleHRyYSAtcGVkYW50aWMiKQotICAjIEZJWE1FIGVuYWJsaW5nIGMrKzExIGJyZWFrcyBzb21lIExpbnV4IGJ1aWxkcyBvbiBUcmF2aXMgYnkgdHJpZ2dlcmluZyBhIGcrKyBidWcsIHNlZQotICAjIGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9hcGFjaGUvdGhyaWZ0L2pvYnMvNTgwMTcwMjIKLSAgIyBvbiB0aGUgb3RoZXIgaGFuZCwgYm90aCBNYWNPU1ggYW5kIEZyZWVCU0QgbmVlZCBjKysxMQotICBpZigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iIE9SICR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkZyZWVCU0QiKQotICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtc3RkPWMrKzExIC1PMiAtV2FsbCAtV2V4dHJhIikKLSAgZW5kaWYoKQoraWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBNQVRDSEVTICJDbGFuZyIpCisgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtV25vLWRlcHJlY2F0ZWQtcmVnaXN0ZXIiKQogZW5kaWYoKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEFudC5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRBbnQuY21ha2UKaW5kZXggMTZiOWFmZC4uOGIwMzcxZCAxMDA2NDQKLS0tIGEvYnVpbGQvY21ha2UvRmluZEFudC5jbWFrZQorKysgYi9idWlsZC9jbWFrZS9GaW5kQW50LmNtYWtlCkBAIC0xOCw4ICsxOCw4IEBACiAjCiAKIAotIyAgQW50X0ZPVU5EIC0gc3lzdGVtIGhhcyBBbnQKLSMgIEFudF9FWEVDVVRCQUxFIC0gdGhlIEFudCBleGVjdXRhYmxlCisjICBBTlRfRk9VTkQgLSBzeXN0ZW0gaGFzIEFudAorIyAgQW50X0VYRUNVVEFCTEUgLSB0aGUgQW50IGV4ZWN1dGFibGUKICMKICMgSXQgd2lsbCBzZWFyY2ggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEFOVF9IT01FIGlmIGl0IGlzIHNldAogCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kQ2FiYWwuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kQ2FiYWwuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkMzM3YgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRDYWJhbC5jbWFrZQpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBDYWJhbF9GT1VORCAtIHN5c3RlbSBoYXMgQ2FiYWwKKyMgIENhYmFsIC0gdGhlIENhYmFsIGV4ZWN1dGFibGUKKyMKKyMgSXQgd2lsbCBzZWFyY2ggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIENBQkFMX0hPTUUgaWYgaXQgaXMgc2V0CisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCisKK2ZpbmRfcHJvZ3JhbShDQUJBTCBOQU1FUyBjYWJhbCBQQVRIUyAkRU5We0hPTUV9Ly5jYWJhbC9iaW4gJEVOVntDQUJBTF9IT01FfS9iaW4pCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoQ0FCQUwgREVGQVVMVF9NU0cgQ0FCQUwpCittYXJrX2FzX2FkdmFuY2VkKENBQkFMKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZENsYW5nVG9vbHMuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kQ2xhbmdUb29scy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzJiZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZENsYW5nVG9vbHMuY21ha2UKQEAgLTAsMCArMSwyOCBAQAorIyAtIFRyeSB0byBmaW5kIENsYW5nIHRvb2xzCisjCisjIFRoZSBmb2xsb3dpbmcgYXJlIHNldCBhZnRlciBjb25maWd1cmF0aW9uIGlzIGRvbmU6CisjICBjbGFuZy10aWR5X0ZPVU5ECisjICBDbGFuZ1Rvb2xzOjpjbGFuZy10aWR5CisjICBjbGFuZy1hcHBseS1yZXBsYWNlbWVudHNfRk9VTkQKKyMgIENsYW5nVG9vbHM6OmNsYW5nLWFwcGx5LXJlcGxhY2VtZW50cworIyAgcnVuLWNsYW5nLXRpZHlfRk9VTkQKKyMgIENsYW5nVG9vbHM6OnJ1bi1jbGFuZy10aWR5CisKK2luY2x1ZGVfZ3VhcmQoKQoraW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZm9yZWFjaChwcm9ncmFtX25hbWUgSU4gSVRFTVMgY2xhbmctdGlkeSBjbGFuZy1hcHBseS1yZXBsYWNlbWVudHMpCisgIGZpbmRfcHJvZ3JhbSgke3Byb2dyYW1fbmFtZX1fQklOQVJZIE5BTUVTICR7cHJvZ3JhbV9uYW1lfS1kZXZlbCAke3Byb2dyYW1fbmFtZX0tOCAke3Byb2dyYW1fbmFtZX0gUEFUSF9TVUZGSVhFUyAiTExWTS9iaW4iKQorICBmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoJHtwcm9ncmFtX25hbWV9IERFRkFVTFRfTVNHICR7cHJvZ3JhbV9uYW1lfV9CSU5BUlkpCisgIGlmKCR7cHJvZ3JhbV9uYW1lfV9GT1VORCBBTkQgTk9UIFRBUkdFVCBDbGFuZ1Rvb2xzOjoke3Byb2dyYW1fbmFtZX0pCisgICAgYWRkX2V4ZWN1dGFibGUoQ2xhbmdUb29sczo6JHtwcm9ncmFtX25hbWV9IElNUE9SVEVEKQorICAgIHNldF9wcm9wZXJ0eShUQVJHRVQgQ2xhbmdUb29sczo6JHtwcm9ncmFtX25hbWV9IFBST1BFUlRZIElNUE9SVEVEX0xPQ0FUSU9OICIkeyR7cHJvZ3JhbV9uYW1lfV9CSU5BUll9IikKKyAgZW5kaWYoKQorZW5kZm9yZWFjaCgpCisKK2ZpbmRfcHJvZ3JhbShydW4tY2xhbmctdGlkeV9CSU5BUlkgTkFNRVMgcnVuLWNsYW5nLXRpZHkgcnVuLWNsYW5nLXRpZHkucHkgUEFUSF9TVUZGSVhFUyAiTExWTS9iaW4iICJsbHZtLWRldmVsL3NoYXJlL2NsYW5nIikKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhydW4tY2xhbmctdGlkeSBERUZBVUxUX01TRyBydW4tY2xhbmctdGlkeV9CSU5BUlkpCitpZihydW4tY2xhbmctdGlkeV9GT1VORCBBTkQgTk9UIFRBUkdFVCBDbGFuZ1Rvb2xzOjpydW4tY2xhbmctdGlkeSkKKyAgYWRkX2V4ZWN1dGFibGUoQ2xhbmdUb29sczo6cnVuLWNsYW5nLXRpZHkgSU1QT1JURUQpCisgIHNldF9wcm9wZXJ0eShUQVJHRVQgQ2xhbmdUb29sczo6cnVuLWNsYW5nLXRpZHkgUFJPUEVSVFkgSU1QT1JURURfTE9DQVRJT04gIiR7cnVuLWNsYW5nLXRpZHlfQklOQVJZfSIpCitlbmRpZigpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kR0hDLmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEdIQy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODczODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEdIQy5jbWFrZQpAQCAtMCwwICsxLDM2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBHSENfRk9VTkQgLSBzeXN0ZW0gaGFzIEdIQworIyAgR0hDIC0gdGhlIEdIQyBleGVjdXRhYmxlCisjICBSVU5fSEFTS0VMTF9GT1VORCAtIHN5c3RlbSBoYXMgcnVuaGFza2VsbAorIyAgUlVOX0hBU0tFTEwgLSB0aGUgcnVuaGFza2VsbCBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHSENfSE9NRSBpZiBpdCBpcyBzZXQKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKEdIQyBOQU1FUyBnaGMgUEFUSFMgJEVOVntHSENfSE9NRX0vYmluKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdIQyBERUZBVUxUX01TRyBHSEMpCittYXJrX2FzX2FkdmFuY2VkKEdIQykKKworZmluZF9wcm9ncmFtKFJVTl9IQVNLRUxMIE5BTUVTIHJ1bmhhc2tlbGwgUEFUSFMgJEVOVntHSENfSE9NRX0vYmluKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKFJVTl9IQVNLRUxMIERFRkFVTFRfTVNHIFJVTl9IQVNLRUxMKQorbWFya19hc19hZHZhbmNlZChSVU5fSEFTS0VMTCkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGUuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDVkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxlLmNtYWtlCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIEdSQURMRV9GT1VORCAtIHN5c3RlbSBoYXMgR3JhZGxlCisjICBHUkFETEVfRVhFQ1VUQUJMRSAtIHRoZSBHcmFkbGUgZXhlY3V0YWJsZQorIworIyBJdCB3aWxsIHNlYXJjaCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQU5UX0hPTUUgaWYgaXQgaXMgc2V0CisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCisKK2ZpbmRfcHJvZ3JhbShHUkFETEVfRVhFQ1VUQUJMRSBOQU1FUyBncmFkbGUgUEFUSFMgJEVOVntHUkFETEVfSE9NRX0vYmluIE5PX0NNQUtFX0ZJTkRfUk9PVF9QQVRIKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdyYWRsZSBERUZBVUxUX01TRyBHUkFETEVfRVhFQ1VUQUJMRSkKK21hcmtfYXNfYWR2YW5jZWQoR1JBRExFX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kR3JhZGxldy5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGV3LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YmI5OTgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxldy5jbWFrZQpAQCAtMCwwICsxLDM2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBHUkFETEVXX0ZPVU5EIC0gc3lzdGVtIGhhcyBHcmFkbGV3CisjICBHUkFETEVXX0VYRUNVVEFCTEUgLSB0aGUgR3JhZGxldyBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBsb2NhdGlvbiBDTUFLRV9TT1VSQ0VfRElSL2xpYi9qYXZhCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCisKK2ZpbmRfcHJvZ3JhbShHUkFETEVXX0VYRUNVVEFCTEUgZ3JhZGxldyBQQVRIUyAke0NNQUtFX1NPVVJDRV9ESVJ9L2xpYi9qYXZhIE5PX0RFRkFVTFRfUEFUSCBOT19DTUFLRV9GSU5EX1JPT1RfUEFUSCkKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhHcmFkbGV3IERFRkFVTFRfTVNHIEdSQURMRVdfRVhFQ1VUQUJMRSkKK21hcmtfYXNfYWR2YW5jZWQoR1JBRExFV19FWEVDVVRBQkxFKQorCisjIEJ1Z2d5IGZpbmRfcHJvZ3JhbSBjYW5ub3QgZmluZCBncmFkbGV3LmJhdCB3aGVuIGdyYWRsZXcgaXMgYXQgdGhlIHNhbWUgcGF0aAorIyBhbmQgZXZlbiBidWdnaWVyIGN0ZXN0IHdpbGwgbm90IGV4ZWN1dGUgZ3JhZGxldy5iYXQgd2hlbiBncmFkbGV3IGlzIGdpdmVuLgoraWYoQ01BS0VfSE9TVF9XSU4zMikKKyAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiKC4rZ3JhZGxldykkIiAiXFwxLmJhdCIgR1JBRExFV19FWEVDVVRBQkxFICR7R1JBRExFV19FWEVDVVRBQkxFfSkKK2VuZGlmKENNQUtFX0hPU1RfV0lOMzIpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kSW50dHlwZXMuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kSW50dHlwZXMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2MWY3OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRJbnR0eXBlcy5jbWFrZQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBmaW5kIG1zaW50dHlwZXMgb24gY29tcGlsZXJzIHRoYXQgZG9uJ3QgcHJvdmlkZSBpdCwgZm9yIGV4YW1wbGUKKyMgICBWUzIwMTAKKworIyBVc2FnZTogCisjIFByb3ZpZGUgSU5UVFlQRVNfUk9PVCBpZiB5b3UgbmVlZCBpdAorIyBSZXN1bHQ6IElOVFRZUEVTX0lOQ0xVREVfRElSUywgd2hlcmUgdG8gZmluZCBpbnR0eXBlcy5oCisjIFJlc3VsdDogSW50dHlwZXNfRk9VTkQsIElmIGZhbHNlLCBpbnR0eXBlcy5oIHdhcyBub3QgZm91bmQKKworZmluZF9wYXRoKElOVFRZUEVTX0lOQ0xVREVfRElSUyBpbnR0eXBlcy5oIEhJTlRTICR7SU5UVFlQRVNfUk9PVH0pCitpZiAoSU5UVFlQRVNfSU5DTFVERV9ESVJTKQorICBzZXQoSW50dHlwZXNfRk9VTkQgVFJVRSkKK2Vsc2UgKCkKKyAgc2V0KEludHR5cGVzX0ZPVU5EIEZBTFNFKQorICBpZiAoSW50dHlwZXNfRklORF9SRVFVSVJFRCkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDb3VsZCBOT1QgZmluZCBpbnR0eXBlcy5oIikKKyAgZW5kaWYgKCkKKyAgbWVzc2FnZShTVEFUVVMgImludHR5cGVzLmggTk9UIGZvdW5kIikKK2VuZGlmICgpCisKK21hcmtfYXNfYWR2YW5jZWQoCisgIElOVFRZUEVTX0lOQ0xVREVfRElSUworKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZExpYmV2ZW50LmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZExpYmV2ZW50LmNtYWtlCmluZGV4IDFlYWMzMTUuLmFjNmEwNzggMTAwNjQ0Ci0tLSBhL2J1aWxkL2NtYWtlL0ZpbmRMaWJldmVudC5jbWFrZQorKysgYi9idWlsZC9jbWFrZS9GaW5kTGliZXZlbnQuY21ha2UKQEAgLTYsMTQgKzYsMjAgQEAKICMgTElCRVZFTlRfTElCUkFSSUVTLCBMaWJFdmVudCBsaWJyYXJpZXMKICMgTGliZXZlbnRfRk9VTkQsIElmIGZhbHNlLCBkbyBub3QgdHJ5IHRvIHVzZSBsaWJldmVudAogCi1zZXQoTGliRXZlbnRfRVhUUkFfUFJFRklYRVMgL3Vzci9sb2NhbCAvb3B0L2xvY2FsICIkRU5We0hPTUV9IikKK3NldChMSUJFVkVOVF9ST09UIENBQ0hFIFBBVEggIlJvb3QgZGlyZWN0b3J5IG9mIGxpYmV2ZW50IGluc3RhbGxhdGlvbiIpCitzZXQoTGliRXZlbnRfRVhUUkFfUFJFRklYRVMgL3Vzci9sb2NhbCAvb3B0L2xvY2FsICIkRU5We0hPTUV9IiAke0xJQkVWRU5UX1JPT1R9KQogZm9yZWFjaChwcmVmaXggJHtMaWJFdmVudF9FWFRSQV9QUkVGSVhFU30pCiAgIGxpc3QoQVBQRU5EIExpYkV2ZW50X0lOQ0xVREVfUEFUSFMgIiR7cHJlZml4fS9pbmNsdWRlIikKICAgbGlzdChBUFBFTkQgTGliRXZlbnRfTElCUkFSSUVTX1BBVEhTICIke3ByZWZpeH0vbGliIikKIGVuZGZvcmVhY2goKQogCi1maW5kX3BhdGgoTElCRVZFTlRfSU5DTFVERV9ESVJTIGV2ZW50LmggUEFUSFMgJHtMaWJFdmVudF9JTkNMVURFX1BBVEhTfSkKLWZpbmRfbGlicmFyeShMSUJFVkVOVF9MSUJSQVJJRVMgTkFNRVMgZXZlbnQgUEFUSFMgJHtMaWJFdmVudF9MSUJSQVJJRVNfUEFUSFN9KQorIyBMb29raW5nIGZvciAiZXZlbnQuaCIgd2lsbCBmaW5kIHRoZSBQbGF0Zm9ybSBTREsgaW5jbHVkZSBkaXIgb24gd2luZG93cworIyBzbyB3ZSBhbHNvIGxvb2sgZm9yIGEgcGVlciBoZWFkZXIgbGlrZSBldmh0dHAuaCB0byBnZXQgdGhlIHJpZ2h0IHBhdGgKK2ZpbmRfcGF0aChMSUJFVkVOVF9JTkNMVURFX0RJUlMgZXZodHRwLmggZXZlbnQuaCBQQVRIUyAke0xpYkV2ZW50X0lOQ0xVREVfUEFUSFN9KQorCisjICJsaWIiIHByZWZpeCBpcyBuZWVkZWQgb24gV2luZG93cyBpbiBzb21lIGNhc2VzCisjIG5ld2VyIHZlcnNpb25zIG9mIGxpYmV2ZW50IHVzZSB0aHJlZSBsaWJyYXJpZXMKK2ZpbmRfbGlicmFyeShMSUJFVkVOVF9MSUJSQVJJRVMgTkFNRVMgZXZlbnQgZXZlbnRfY29yZSBldmVudF9leHRyYSBsaWJldmVudCBQQVRIUyAke0xpYkV2ZW50X0xJQlJBUklFU19QQVRIU30pCiAKIGlmIChMSUJFVkVOVF9MSUJSQVJJRVMgQU5EIExJQkVWRU5UX0lOQ0xVREVfRElSUykKICAgc2V0KExpYmV2ZW50X0ZPVU5EIFRSVUUpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9OZXdQbGF0Zm9ybURlYnVnLmNtYWtlIGIvYnVpbGQvY21ha2UvTmV3UGxhdGZvcm1EZWJ1Zy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTRkMzAyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvTmV3UGxhdGZvcm1EZWJ1Zy5jbWFrZQpAQCAtMCwwICsxLDQ0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBGb3IgZGVidWdnaW5nIG5ldyBwbGF0Zm9ybXMsIGp1c3QgdG8gc2VlIHdoYXQgc29tZSBlbnZpcm9ubWVudCBmbGFncyBhcmUuLi4KKyMKK21hY3JvKFNIT1dGTEFHIGZsYWcpCisgIG1lc3NhZ2UoU1RBVFVTICIke2ZsYWd9ID0gJHske2ZsYWd9fSIpCitlbmRtYWNybyhTSE9XRkxBRykKKworc2V0KE5FV1BMQVRGT1JNREVCVUcgT04pCisKK2lmKE5FV1BMQVRGT1JNREVCVUcpCisgIFNIT1dGTEFHKCJBUFBMRSIpCisgIFNIT1dGTEFHKCJCT1JMQU5EIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NfQ09NUElMRVJfSUQiKQorICBTSE9XRkxBRygiQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCIpCisgIFNIT1dGTEFHKCJDWUdXSU4iKQorICBTSE9XRkxBRygiTUlOR1ciKQorICBTSE9XRkxBRygiTVNWQyIpCisgIFNIT1dGTEFHKCJNU1ZDX1ZFUlNJT04iKQorICBTSE9XRkxBRygiTVNZUyIpCisgIFNIT1dGTEFHKCJVTklYIikKKyAgU0hPV0ZMQUcoIldBVENPTSIpCisgIFNIT1dGTEFHKCJXSU4zMiIpCitlbmRpZihORVdQTEFURk9STURFQlVHKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvUkVBRE1FLU1TWVMyLm1kIGIvYnVpbGQvY21ha2UvUkVBRE1FLU1TWVMyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Y2FkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9SRUFETUUtTVNZUzIubWQKQEAgLTAsMCArMSw2MyBAQAorPCEtLS0KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIyBCdWlsZGluZyB0aHJpZnQgb24gV2luZG93cyAoTWluR1c2NC9NU1lTMikKKworVGhyaWZ0IHVzZXMgY21ha2UgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgdGhlIHByb2plY3Qgb24gbXVsdGlwbGUgcGxhdGZvcm1zLCBob3dldmVyIHRvIGJ1aWxkIGEgZnVsbHkgZnVuY3Rpb25hbCBhbmQgcHJvZHVjdGlvbiByZWFkeSB0aHJpZnQgb24gV2luZG93cyByZXF1aXJlcyBhIG51bWJlciBvZiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdG8gYmUgb2J0YWluZWQuICBPbmNlIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBhcmUgcmVhZHksIHRoZSByaWdodCBjb21iaW5hdGlvbiBvZiBvcHRpb25zIG11c3QgYmUgcGFzc2VkIHRvIGNtYWtlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0IGVudmlyb25tZW50LgorCis+IE5vdGU6IGxpYmV2ZW50IGFuZCBsaWJldmVudC1kZXZlbCBkbyBub3Qgd29yayB3aXRoIHRoaXMgdG9vbGNoYWluIGFzIHRoZXkgZG8gbm90IHByb3Blcmx5IGRldGVjdCBtaW5ndzY0IGFuZCBleHBlY3Qgc29tZSBoZWFkZXJzIHRvIGV4aXN0IHRoYXQgZG8gbm90LCBzbyB0aGUgbm9uLWJsb2NraW5nIHNlcnZlciBpcyBub3QgY3VycmVudGx5IGJ1aWx0IGludG8gdGhpcyBzb2x1dGlvbi4KKworIyMgTVNZUzIKKworRG93bmxvYWQgYW5kIGZ1bGx5IHVwZ3JhZGUgbXN5czIgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbnMgYXQ6CisKKyAgICBodHRwczovL21zeXMyLmdpdGh1Yi5pby8KKworSW5zdGFsbCB0aGUgbmVjZXNzYXJ5IHRvb2xjaGFpbiBpdGVtcyBmb3IgQysrOgorCisgICAgJCBwYWNtYW4gLS1uZWVkZWQgLVMgYmlzb24gZmxleCBtYWtlIG1pbmd3LXc2NC14ODZfNjQtb3BlbnNzbCBcCisgICAgICAgICAgICAgICAgbWluZ3ctdzY0LXg4Nl82NC1ib29zdCBtaW5ndy13NjQteDg2XzY0LWNtYWtlIFwKKyAgICAgICAgICAgICAgICBtaW5ndy13NjQteDg2XzY0LXRvb2xjaGFpbiBtaW5ndy13NjQteDg2XzY0LXpsaWIKKworVXBkYXRlIHlvdXIgbXN5czIgYmFzaCBwYXRoIHRvIGluY2x1ZGUgL21pbmd3NjQvYmluIGJ5IGFkZGluZyBhIGxpbmUgdG8geW91ciB+Ly5iYXNoX3Byb2ZpbGVzIHVzaW5nIHRoaXMgY29tbWFuZDoKKworICAgIGVjaG8gImV4cG9ydCBQQVRIPS9taW5ndzY0L2JpbjpcJFBBVEgiID4+IH4vLmJhc2hfcHJvZmlsZQorCitBZnRlciB0aGF0LCBjbG9zZSB5b3VyIHNoZWxsIGFuZCBvcGVuIGEgbmV3IG9uZS4KKworVXNlIGNtYWtlIHRvIGNyZWF0ZSBhIE1pbkdXIG1ha2VmaWxlLCBvdXQgb2YgdHJlZSAoYXNzdW1lcyB5b3UgYXJlIGluIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHRocmlmdCBzb3VyY2UgdHJlZSk6CisKKyAgICBta2RpciAuLi90aHJpZnQtYnVpbGQKKyAgICBjZCAuLi90aHJpZnQtYnVpbGQKKyAgICBjbWFrZSAtRyJNaW5HVyBNYWtlZmlsZXMiIC1EQ01BS0VfTUFLRV9QUk9HUkFNPS9taW5ndzY0L2Jpbi9taW5ndzMyLW1ha2UgXAorICAgICAgIC1EQ01BS0VfQ19DT01QSUxFUj14ODZfNjQtdzY0LW1pbmd3MzItZ2NjLmV4ZSBcCisgICAgICAgLURDTUFLRV9DWFhfQ09NUElMRVI9eDg2XzY0LXc2NC1taW5ndzMyLWcrKy5leGUgXAorICAgICAgIC1EV0lUSF9MSUJFVkVOVD1PRkYgXAorICAgICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRiAtRFdJVEhfU1RBVElDX0xJQj1PTiBcCisgICAgICAgLURXSVRIX0pBVkE9T0ZGIC1EV0lUSF9QWVRIT049T0ZGIC1EV0lUSF9QRVJMPU9GRiBcCisgICAgICAgLi4vdGhyaWZ0CisKK0J1aWxkIHRocmlmdCAoaW5zaWRlIHRocmlmdC1idWlsZCk6CisKKyAgICBjbWFrZSAtLWJ1aWxkIC4KKworUnVuIHRoZSB0ZXN0cyAoaW5zaWRlIHRocmlmdC1idWlsZCk6CisKKyAgICBjdGVzdAorCis+IElmIHlvdSBydW4gaW50byBpc3N1ZXMsIGNoZWNrIEFwYWNoZSBKaXJhIFRIUklGVC00MDQ2IGZvciBwYXRjaGVzIHJlbGF0aW5nIHRvIE1pbkdXNjQvTVNZUzIgYnVpbGRzLgorCisjIyBUZXN0ZWQgV2l0aAorCittc3lzMiA2NC1iaXQgMjAxNi0xMC0yNiBkaXN0cmlidXRpb24KZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL1JFQURNRS5tZCBiL2J1aWxkL2NtYWtlL1JFQURNRS5tZAppbmRleCBlYmM0ZjdkLi5hMGViODU5IDEwMDY0NAotLS0gYS9idWlsZC9jbWFrZS9SRUFETUUubWQKKysrIGIvYnVpbGQvY21ha2UvUkVBRE1FLm1kCkBAIC0xLDYgKzEsNyBAQAotIyBBcGFjaGUgVGhyaWZ0IC0gQ01ha2UgYnVpbGQKKyMgQXBhY2hlIFRocmlmdCAtIENNYWtlIEJ1aWxkCiAKICMjIEdvYWwKKwogRXh0ZW5kIEFwYWNoZSBUaHJpZnQncyAqbWFrZSBjcm9zcyogYXBwcm9hY2ggdG8gdGhlIGJ1aWxkIHN5c3RlbS4KIAogRHVlIHRvIGdyb3dpbmcgdGhlIGZpZWxkIG9mIG9wZXJhdGluZyBzeXN0ZW0gc3VwcG9ydCwgYSBwcm9wZXIgZXhlY3V0YWJsZQpAQCAtMTEsMTIgKzEyLDI2IEBACiBBcyBuaWNlIHNpZGUgYmVuZWZpdCBvZiBDTWFrZSBpcyB0aGUgZ2VuZXJhdGlvbiBvZiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudAogc3BlY2lmaWMgc291bHRpb24gZmlsZXMuID0+IE5vIHNvbHV0aW9uIGZpbGVzIHdpdGhpbiBzb3VyY2UgdHJlZS4KIAorIyMgUHJlcmVxdWlzaXRlcworCitUaGVzZSBhcmUgbGFuZ3VhZ2Utc3BlY2lmaWMsIGhvd2V2ZXIgZm9yIEMrKyB5b3UgbXVzdCBwcm92aWRlOgorCistIEJvb3N0CistIE9wZW5TU0wKKworWW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGU6CisKKy0gbGliZXZlbnQKKy0gemxpYgogCiAjIyBVc2FnZQotanVzdCBkbyB0aGlzOgogCi0gICAgbWtkaXIgY21ha2UtYnVpbGQgJiYgY2QgY21ha2UtYnVpbGQKLSAgICBjbWFrZSAuLgorVG8gdXNlIENNYWtlIHlvdSBmaXJzdCBjcmVhdGUgYW4gb3V0LW9mLXRyZWUgYnVpbGQgZGlyZWN0b3J5LCB0aGVuIHVzZQorQ01ha2UgdG8gZ2VuZXJhdGUgYSBidWlsZCBmcmFtZXdvcmssIHRoZW4gYnVpbGQ6CisKKyAgICBta2RpciAvdG1wL2J1aWxkCisgICAgY2QgL3RtcC9idWlsZAorICAgIGNtYWtlIC9sb2NhdGlvbi90by90aHJpZnQKIAogaWYgeW91IHVzZSBhIHNwZWNpZmljIHRvb2xjaGFpbiBwYXNzIGl0IHRvIGNtYWtlLCB0aGUgc2FtZSBmb3Igb3B0aW9uczoKIApAQCAtMjUsMTMgKzQwLDYgQEAKICAgICBjbWFrZSAtRFRIUklGVF9DT01QSUxFUl9IUz1PRkYgLi4KICAgICBjbWFrZSAtRFdJVEhfWkxJQj1PTiAuLgogCi1vciBvbiBXaW5kb3dzCi0KLSAgICBjbWFrZSAtRyAiVmlzdWFsIFN0dWRpbyAxMiAyMDEzIFdpbjY0IiBcCi0gICAgLURCT09TVF9ST09UPUM6LzNyZHBhcnR5L2Jvb3N0XzFfNThfMCBcCi0gICAgLURaTElCX1JPT1Q9QzovM3JkcGFydHkvemxpYjEyOC1kbGwgXAotICAgIC1EV0lUSF9TSEFSRURfTElCPW9mZiAtRFdJVEhfQk9PU1RUSFJFQURTPU9OIC4uCi0KIGFuZCBvcGVuIHRoZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB5b3UgbGlrZSB3aXRoIHRoZSBzb2x1dGlvbiBvciBkbyB0aGlzOgogCiAgICAgbWFrZQpAQCAtMzksMTUgKzQ3LDI1IEBACiAgICAgbWFrZSBjcm9zcwogICAgIG1ha2UgZGlzdAogCi10byBnZW5lcmF0ZSBhbiBpbnN0YWxsZXIgYW5kIGRpc3RyaWJ1dGlvbiBwYWNrYWdlIGRvIHRoaXM6CitvciBvbiBXaW5kb3dzLCB0aGUgZm9sbG93aW5nIHdpbGwgcHJvZHVjZSBhIHNvbHV0aW9uIGZpbGUgeW91IGNhbiB1c2UKK2luc2lkZSBWaXN1YWwgU3R1ZGlvOgorCisgICAgY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTUgMjAxNyBXaW42NCIgXAorICAgICAgLURCT09TVF9ST09UPUM6LzNyZHBhcnR5L2Jvb3N0XzFfNjlfMCBcCisgICAgICAtREJPT1NUX0xJQlJBUllESVI9QzovM3JkcGFydHkvYm9vc3RfMV82OV8wL2xpYjY0LW1zdmMtMTQuMV4KKyAgICAgIC1EWkxJQl9ST09UPUM6LzNyZHBhcnR5L3psaWItMS4yLjExCisKKzwhLS0KK1RvIGdlbmVyYXRlIGFuIGluc3RhbGxlciBhbmQgZGlzdHJpYnV0aW9uIHBhY2thZ2UgZG8gdGhpczoKIAogICAgIGNwYWNrCistLT4KIAogIyMgVE9ETworCiAqIGdpdCBoYXNoIG9yIHRhZyBiYXNlZCB2ZXJzaW9uaW5nIGRlcGVuZGluZyBvbiBzb3VyY2Ugc3RhdGUKICogYnVpbGQgdHV0b3JpYWwKICogYnVpbGQgdGVzdAotKiB3aXRoL3dpdGhvdXQgbGFuZ3VhZ2UgbGliLzxsYW5nPi8KICogZW5hYmxlL2Rpc2FibGUKICogbWFrZSBjcm9zcwogKiBtYWtlIGRpc3QgKGNyZWF0ZSBhbiBhbGlhcyB0byBtYWtlIHBhY2thZ2Vfc291cmNlKQpAQCAtNTcsNCArNzUsNCBAQAogICAqIGxpYnRocmlmdAogICAqIHR1dG9yaWFsCiAgICogdGVzdAotKiBtZXJnZSBpbnRvIC9SRUFETUUubWQKKyogbWVyZ2UgaW50byAvUkVBRE1FLm1kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvU3RhdGljQ29kZUFuYWx5c2lzLmNtYWtlIGIvYnVpbGQvY21ha2UvU3RhdGljQ29kZUFuYWx5c2lzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTZjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9TdGF0aWNDb2RlQW5hbHlzaXMuY21ha2UKQEAgLTAsMCArMSw5IEBACitmaW5kX3BhY2thZ2UoQ2xhbmdUb29scyBRVUlFVCkKK2lmKGNsYW5nLXRpZHlfRk9VTkQgQU5EIHJ1bi1jbGFuZy10aWR5X0ZPVU5EIEFORCBOT1QgVEFSR0VUIGRvX3J1bl9jbGFuZ190aWR5KQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KAorICAgICAgZG9fcnVuX2NsYW5nX3RpZHkKKyAgICAgIENPTU1BTkQgQ2xhbmdUb29sczo6cnVuLWNsYW5nLXRpZHkgLWNsYW5nLXRpZHktYmluYXJ5ICIkPFRBUkdFVF9GSUxFOkNsYW5nVG9vbHM6OmNsYW5nLXRpZHk+IiAtcCAke0NNQUtFX0JJTkFSWV9ESVJ9ICItcXVpZXQiID4gLi9ydW4tY2xhbmctdGlkeS50eHQKKyAgICAgIERFUEVORFMgJHtDTUFLRV9CSU5BUllfRElSfS9jb21waWxlX2NvbW1hbmRzLmpzb24KKyAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQklOQVJZX0RJUn0KKyAgICAgICkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL1RocmlmdE1hY3Jvcy5jbWFrZSBiL2J1aWxkL2NtYWtlL1RocmlmdE1hY3Jvcy5jbWFrZQppbmRleCAyNjU2NTk4Li44ZjM3MGRmIDEwMDY0NAotLS0gYS9idWlsZC9jbWFrZS9UaHJpZnRNYWNyb3MuY21ha2UKKysrIGIvYnVpbGQvY21ha2UvVGhyaWZ0TWFjcm9zLmNtYWtlCkBAIC0xNyw3OCArMTcsMzggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLQotc2V0KENNQUtFX0RFQlVHX1BPU1RGSVggImQiIENBQ0hFIFNUUklORyAiU2V0IGRlYnVnIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCittYWNybyhBRERfUEtHQ09ORklHX1RIUklGVCBuYW1lKQorICAgIGNvbmZpZ3VyZV9maWxlKCIke25hbWV9LnBjLmluIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7bmFtZX0ucGMiIEBPTkxZKQorICAgIGluc3RhbGwoRklMRVMgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke25hbWV9LnBjIgorICAgICAgICBERVNUSU5BVElPTiAiJHtQS0dDT05GSUdfSU5TVEFMTF9ESVJ9IikKK2VuZG1hY3JvKEFERF9QS0dDT05GSUdfVEhSSUZUKQogCiAKIG1hY3JvKEFERF9MSUJSQVJZX1RIUklGVCBuYW1lKQotCi1pZihXSVRIX1NIQVJFRF9MSUIpCi0gICAgYWRkX2xpYnJhcnkoJHtuYW1lfSBTSEFSRUQgJHtBUkdOfSkKLSAgICAjdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX0gJHtTWVNMSUJTfSkKKyAgICBhZGRfbGlicmFyeSgke25hbWV9ICR7QVJHTn0pCiAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0gUFJPUEVSVElFUwotICAgICAgICBPVVRQVVRfTkFNRSAke25hbWV9Ci0gICAgICAgIFZFUlNJT04gJHt0aHJpZnRfVkVSU0lPTn0KLSAgICAgICAgU09WRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059ICkKLSAgICAjc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0gUFJPUEVSVElFUyBQVUJMSUNfSEVBREVSICIke3RocmlmdGNwcF9IRUFERVJTfSIpCisgICAgICAgIE9VVFBVVF9OQU1FICR7bmFtZX0ke1RIUklGVF9SVU5USU1FX1BPU1RGSVh9ICAgIyB3aW5kb3dzIGxpbmsgdmFyaWFudHMgKC9NVCwgL01ELCAvTVRkLCAvTURkKSBnZXQgZGlmZmVyZW50IG5hbWVzCisgICAgICAgIFZFUlNJT04gJHt0aHJpZnRfVkVSU0lPTn0gKQorICAgICMgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0gUFJPUEVSVElFUyBQVUJMSUNfSEVBREVSICIke3RocmlmdGNwcF9IRUFERVJTfSIpCiAgICAgaW5zdGFsbChUQVJHRVRTICR7bmFtZX0KICAgICAgICAgUlVOVElNRSBERVNUSU5BVElPTiAiJHtCSU5fSU5TVEFMTF9ESVJ9IgogICAgICAgICBMSUJSQVJZIERFU1RJTkFUSU9OICIke0xJQl9JTlNUQUxMX0RJUn0iCiAgICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gIiR7TElCX0lOU1RBTExfRElSfSIKICAgICAgICAgUFVCTElDX0hFQURFUiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIpCi1lbmRpZigpCitlbmRtYWNybygpCiAKLWlmKFdJVEhfU1RBVElDX0xJQikKLSAgICBhZGRfbGlicmFyeSgke25hbWV9X3N0YXRpYyBTVEFUSUMgJHtBUkdOfSkKLSAgICAjdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX1fc3RhdGljICR7U1lTTElCU30pCi0gICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX1fc3RhdGljIFBST1BFUlRJRVMKLSAgICAgICAgT1VUUFVUX05BTUUgJHtuYW1lfSR7U1RBVElDX1BPU1RGSVh9Ci0gICAgICAgIFZFUlNJT04gJHt0aHJpZnRfVkVSU0lPTn0KLSAgICAgICAgU09WRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059ICkKLSAgICBpbnN0YWxsKFRBUkdFVFMgJHtuYW1lfV9zdGF0aWMKLSAgICAgICAgUlVOVElNRSBERVNUSU5BVElPTiAiJHtCSU5fSU5TVEFMTF9ESVJ9IgotICAgICAgICBMSUJSQVJZIERFU1RJTkFUSU9OICIke0xJQl9JTlNUQUxMX0RJUn0iCi0gICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gIiR7TElCX0lOU1RBTExfRElSfSIKLSAgICAgICAgUFVCTElDX0hFQURFUiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIpCi1lbmRpZigpCi0KLWVuZG1hY3JvKEFERF9MSUJSQVJZX1RIUklGVCkKLQorbWFjcm8oVEFSR0VUX0lOQ0xVREVfRElSRUNUT1JJRVNfVEhSSUZUIG5hbWUpCisgICAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtuYW1lfSAke0FSR059KQorZW5kbWFjcm8oKQogCiBtYWNybyhUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUIG5hbWUpCi0KLWlmKFdJVEhfU0hBUkVEX0xJQikKICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtuYW1lfSAke0FSR059KQotZW5kaWYoKQotCi1pZihXSVRIX1NUQVRJQ19MSUIpCi0gICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX1fc3RhdGljICR7QVJHTn0pCi1lbmRpZigpCi0KLWVuZG1hY3JvKFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQpCi0KK2VuZG1hY3JvKCkKIAogbWFjcm8oTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZIHRhcmdldCBsaWJuYW1lKQotCi1pZiAoV0lUSF9TSEFSRURfTElCKQogICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH0gJHtsaWJuYW1lfSkKLWVsc2VpZiAoV0lUSF9TVEFUSUNfTElCKQotICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH0gJHtsaWJuYW1lfV9zdGF0aWMpCi1lbHNlKCkKLSAgICBtZXNzYWdlKEZBVEFMICJOb3QgbGlua2luZyB3aXRoIHNoYXJlZCBvciBzdGF0aWMgbGlicmFyaWVzPyIpCi1lbmRpZigpCi0KLWVuZG1hY3JvKExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSkKLQorZW5kbWFjcm8oKQogCiBtYWNybyhUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkgdGFyZ2V0IGxpYm5hbWUpCi0KLWlmKFdJVEhfU0hBUkVEX0xJQikKLSAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXR9ICR7bGlibmFtZX0pCi1lbmRpZigpCi0KLWlmKFdJVEhfU1RBVElDX0xJQikKLSAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXR9X3N0YXRpYyAke2xpYm5hbWV9X3N0YXRpYykKLWVuZGlmKCkKLQotZW5kbWFjcm8oVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH0gJHtBUkdOfSAke2xpYm5hbWV9KQorZW5kbWFjcm8oKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvYW5kcm9pZC10b29sY2hhaW4uY21ha2UgYi9idWlsZC9jbWFrZS9hbmRyb2lkLXRvb2xjaGFpbi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYzZDAwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvYW5kcm9pZC10b29sY2hhaW4uY21ha2UKQEAgLTAsMCArMSwyNiBAQAorc2V0KEFORFJPSURfTkRLICIvb3B0L2FuZHJvaWQtbmRrIiBDQUNIRSkKK3NldChBTkRST0lEX1BMQVRGT1JNICJhbmRyb2lkLTE1IiBDQUNIRSkKK3NldChBTkRST0lEX0FSQ0ggImFyY2gtYXJtIiBDQUNIRSkKK3NldChBTkRST0lEX1RPT0xfQVJDSCAiYW5kcm9pZC1hcm0iIENBQ0hFKQorc2V0KEFORFJPSURfQ1BVICJhcm1lYWJpLXY3YSIgQ0FDSEUpCitzZXQoQU5EUk9JRF9HQ0NfVkVSU0lPTiA0LjkgQ0FDSEUpCitzZXQoSE9TVF9BUkNIIGxpbnV4LXg4Nl82NCBDQUNIRSkKKworc2V0KENNQUtFX1NZU1RFTV9OQU1FIEFuZHJvaWQpCitzZXQoQU5EUk9JRF9TWVNST09UICIke0FORFJPSURfTkRLfS9wbGF0Zm9ybXMvJHtBTkRST0lEX1BMQVRGT1JNfS8ke0FORFJPSURfQVJDSH0iKQorc2V0KEFORFJPSURfVFJJUExFVCBhcm0tbGludXgtYW5kcm9pZGVhYmkpCitzZXQoQU5EUk9JRF9TVEwgIiR7QU5EUk9JRF9OREt9L3NvdXJjZXMvY3h4LXN0bC9nbnUtbGlic3RkKysvJHtBTkRST0lEX0dDQ19WRVJTSU9OfSIpCisKK3NldChfQ09NUElMRVJfUk9PVCAke0FORFJPSURfTkRLfS9wcmVidWlsdC8ke0FORFJPSURfVFJJUExFVH0tJHtBTkRST0lEX0dDQ19WRVJTSU9OfS9wcmVidWlsdC8ke0hPU1RfQVJDSH0pCitzZXQoQ01BS0VfQ19DT01QSUxFUiAke19DT01QSUxFUl9ST09UfS9iaW4vJHtBTkRST0lEX1RSSVBMRVR9LWdjYykKK3NldChDTUFLRV9DWENYX0NPTVBJTEVSICR7X0NPTVBJTEVSX1JPT1R9L2Jpbi8ke0FORFJPSURfVFJJUExFVH0tZysrKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKAorICAgICR7QU5EUk9JRF9TVEx9L2luY2x1ZGUKKyAgICAke0FORFJPSURfU1RMfS9saWJzLyR7QU5EUk9JRF9DUFV9L2luY2x1ZGUpCisKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSCAke0FORFJPSURfU1lTUk9PVH0pCisKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX1BST0dSQU0gTkVWRVIpCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9MSUJSQVJZIE9OTFkpCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9JTkNMVURFIE9OTFkpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9jb25maWcuaC5pbiBiL2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluCmluZGV4IDE4MWVhMTguLmEzZDY2NDIgMTAwNjQ0Ci0tLSBhL2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluCisrKyBiL2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluCkBAIC00NCw5ICs0NCw2IEBACiAvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCiAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIke1BBQ0tBR0VfU1RSSU5HfSIKIAotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI2RlZmluZSBWRVJTSU9OICIke1ZFUlNJT059IgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogREVGSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBEZWZpbmUgaWYgdGhlIEFJX0FERFJDT05GSUcgc3ltYm9sIGlzIHVuYXZhaWxhYmxlICovCkBAIC02NywxMiArNjQsNiBAQAogICAgc2VlOiBhY2xvY2FsL2FjX3Byb2dfYmlzb24ubTQgKi8KICNjbWFrZWRlZmluZSBCSVNPTl9VU0VfUEFSU0VSX0hfRVhURU5TSU9OIDEKIAotLyogcmVwbGFjZXMgUE9TSVggcHRocmVhZCBieSBib29zdDo6dGhyZWFkICovCi0jY21ha2VkZWZpbmUgVVNFX0JPT1NUX1RIUkVBRCAxCi0KLS8qIHJlcGxhY2VzIFBPU0lYIHB0aHJlYWQgYnkgc3RkOjp0aHJlYWQgKi8KLSNjbWFrZWRlZmluZSBVU0VfU1REX1RIUkVBRCAxCi0KIC8qIERlZmluZSB0byAxIGlmIHN0cmVycm9yX3IgcmV0dXJucyBjaGFyICouICovCiAjY21ha2VkZWZpbmUgU1RSRVJST1JfUl9DSEFSX1AgMQogCkBAIC05NCw2ICs4NSw5IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvaW4uaD4gaGVhZGVyIGZpbGUuICovCiAjY21ha2VkZWZpbmUgSEFWRV9ORVRJTkVUX0lOX0ggMQogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNpZ25hbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NJR05BTF9IIDEKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCiAjY21ha2VkZWZpbmUgSEFWRV9TVERJTlRfSCAxCiAKQEAgLTEwMyw4ICs5Nyw4IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHB0aHJlYWQuaD4gaGVhZGVyIGZpbGUuICovCiAjY21ha2VkZWZpbmUgSEFWRV9QVEhSRUFEX0ggMQogCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLwotI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19JT0NUTF9IIDEKIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICovCiAjY21ha2VkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCkBAIC0xMjEsMTIgKzExNSwxOCBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdW4uaD4gaGVhZGVyIGZpbGUuICovCiAjY21ha2VkZWZpbmUgSEFWRV9TWVNfVU5fSCAxCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cG9sbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1BPTExfSCAxCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BvbGwuaD4gaGVhZGVyIGZpbGUuICovCiAjY21ha2VkZWZpbmUgSEFWRV9TWVNfUE9MTF9IIDEKIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VsZWN0Lmg+IGhlYWRlciBmaWxlLiAqLwogI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1NFTEVDVF9IIDEKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19USU1FX0ggMQorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNjaGVkLmg+IGhlYWRlciBmaWxlLiAqLwogI2NtYWtlZGVmaW5lIEhBVkVfU0NIRURfSCAxCiAKQEAgLTE1NCw0ICsxNTQsNCBAQAogLyogRGVmaW5lIHRvIDEgaWYgc3RyZXJyb3JfciByZXR1cm5zIGNoYXIgKi4gKi8KICNjbWFrZWRlZmluZSBTVFJFUlJPUl9SX0NIQVJfUCAxCiAKLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL1JFQURNRS5tZCBiL2J1aWxkL2RvY2tlci9SRUFETUUubWQKaW5kZXggMzcxMjY1My4uYjY1Zjc0YiAxMDA2NDQKLS0tIGEvYnVpbGQvZG9ja2VyL1JFQURNRS5tZAorKysgYi9idWlsZC9kb2NrZXIvUkVBRE1FLm1kCkBAIC0xLDI3ICsxLDE5NyBAQAotIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBjb250YWluZXJzCi1BIHNldCBvZiBkb2NrZXIgY29udGFpbmVycyB1c2VkIHRvIGJ1aWxkIGFuZCB0ZXN0IEFwYWNoZSBUaHJpZnQKKyMgRG9ja2VyIEludGVncmF0aW9uICMKIAotIyMjIEF2YWlsYWJsZSBDb250YWluZXJzCitEdWUgdG8gdGhlIGxhcmdlIG51bWJlciBvZiBsYW5ndWFnZXMgc3VwcG9ydGVkIGJ5IEFwYWNoZSBUaHJpZnQsCitkb2NrZXIgY29udGFpbmVycyBhcmUgdXNlZCB0byBidWlsZCBhbmQgdGVzdCB0aGUgcHJvamVjdCBvbiBhCit2YXJpZXR5IG9mIHBsYXRmb3JtcyB0byBwcm92aWRlIG1heGltdW0gdGVzdCBjb3ZlcmFnZS4KIAotKiBVYnVudHUgLSBiYXNlZCBvbiB1YnVudHU6dHJ1c3R5ICgxNC4wNCkKLSogQ2VudG9zIC0gYmFzZWQgb24gY2VudG9zOjYuNgorIyMgQXBwdmV5b3IgSW50ZWdyYXRpb24gIyMKIAotIyMgRGVwZW5kZW5jaWVzCitBdCB0aGlzIHRpbWUgdGhlIEFwcHZleW9yIHNjcmlwdHMgZG8gbm90IHVzZSBkb2NrZXIgY29udGFpbmVycy4KK09uY2UgTWljcm9zb2Z0IHN1cHBvcnRzIFZpc3VhbCBTdHVkaW8gQnVpbGQgVG9vbHMgcnVubmluZyBpbnNpZGUKK25hbm8gY29udGFpbmVycyAoaW5zdGVhZCBvZiBDb3JlLCB3aGljaCBpcyBodWdlKSB0aGVuIHdlIHdpbGwKK2NvbnNpZGVyIHVzaW5nIGNvbnRhaW5lcnMgZm9yIHRoZSBXaW5kb3dzIGJ1aWxkcyBhcyB3ZWxsLgogCi0qIEEgd29ya2luZyBEb2NrZXIgZW52aXJvbm1lbnQuIEEgVmFncmFudGZpbGUgaXMgcHJvdmlkZWQgd2hpY2ggd2lsbCBzZXR1cCBhbiBVYnVudHUgaG9zdCBhbmQgd29ya2luZyBEb2NrZXIgZW52aXJvbm1lbnQgYXMgd2VsbCBhcyBidWlsZCB0aGUgQXBhY2hlIFRocmlmdCBEb2NrZXIgY29udGFpbmVyIGZvciB0ZXN0aW5nIGFuZCBkZXZlbG9wbWVudAorIyMgVHJhdmlzIENJIEludGVncmF0aW9uICMjCiAKLSMjIFVzYWdlCi1Gcm9tIHRoZSBBcGFjaGUgVGhyaWZ0IGNvZGUgYmFzZSByb290CitUaGUgVHJhdmlzIENJIHNjcmlwdHMgdXNlIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZAorbG9naWMgdG8gZGV0ZXJtaW5lIHRoZWlyIGJlaGF2aW9yOgogCi0qIEJ1aWxkCisjIyMgRW52aXJvbm1lbnQgVmFyaWFibGVzICMjIwogCi0JZG9ja2VyIGJ1aWxkIC10IHRocmlmdCBidWlsZC9kb2NrZXIvdWJ1bnR1Cit8IFZhcmlhYmxlIHwgRGVmYXVsdCB8IFVzYWdlIHwKK3wgLS0tLS0tLS0gfCAtLS0tLSB8IC0tLS0tLS0gfAorfCBgRElTVFJPYCB8IGB1YnVudHUtYmlvbmljYCB8IFNldCBieSB2YXJpb3VzIGJ1aWxkIGpvYnMgaW4gYC50cmF2aXMueW1sYCB0byBydW4gYnVpbGRzIGluIGRpZmZlcmVudCBjb250YWluZXJzLiAgTm90IGludGVuZGVkIHRvIGJlIHNldCBleHRlcm5hbGx5LnwKK3wgYERPQ0tFUl9SRVBPYCB8IGB0aHJpZnQvdGhyaWZ0LWJ1aWxkYCB8IFRoZSBuYW1lIG9mIHRoZSBEb2NrZXIgSHViIHJlcG9zaXRvcnkgdG8gb2J0YWluIGFuZCBzdG9yZSBkb2NrZXIgaW1hZ2VzLiB8Cit8IGBET0NLRVJfVVNFUmAgfCBgPG5vbmU+YCB8IFRoZSBEb2NrZXIgSHViIGFjY291bnQgbmFtZSBjb250YWluaW5nIHRoZSByZXBvc2l0b3J5LiB8Cit8IGBET0NLRVJfUEFTU2AgfCBgPG5vbmU+YCB8IFRoZSBEb2NrZXIgSHViIGFjY291bnQgcGFzc3dvcmQgdG8gdXNlIHdoZW4gcHVzaGluZyBuZXcgdGFncy4gfAogCi0Jb3IKK0ZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCBkb2NrZXIgaW1hZ2UgdGhhdCBpcyB1c2VkIGluIGJ1aWxkcyBpZiBubyBvdmVycmlkZXMgYXJlIHNwZWNpZmllZCB3b3VsZCBiZTogYHRocmlmdC90aHJpZnQtYnVpbGQ6dWJ1bnR1LWJpb25pY2AKIAotCWRvY2tlciBidWlsZCAtdCB0aHJpZnQgYnVpbGQvZG9ja2VyL2NlbnRvcworIyMjIEZvcmtzICMjIwogCi0qIFJ1bgorSWYgeW91IGhhdmUgZm9ya2VkIHRoZSBBcGFjaGUgVGhyaWZ0IHJlcG9zaXRvcnkgYW5kIHlvdSB3b3VsZCBsaWtlCit0byB1c2UgeW91ciBvd24gRG9ja2VyIEh1YiBhY2NvdW50IHRvIHN0b3JlIHRocmlmdCBidWlsZCBpbWFnZXMsCit5b3UgY2FuIHVzZSB0aGUgVHJhdmlzIENJIHdlYiBpbnRlcmZhY2UgdG8gc2V0IHRoZSBgRE9DS0VSX1VTRVJgLAorYERPQ0tFUl9QQVNTYCwgYW5kIGBET0NLRVJfUkVQT2AgdmFyaWFibGVzIGluIGEgc2VjdXJlIG1hbm5lci4KK1lvdXIgZm9yayBidWlsZHMgd2lsbCB0aGVuIHB1bGwsIHB1c2gsIGFuZCB0YWcgdGhlIGRvY2tlciBpbWFnZXMKK2luIHlvdXIgYWNjb3VudC4KIAotCWRvY2tlciBydW4gLXYgJChwd2QpOi90aHJpZnQgLWl0IHRocmlmdCAvYmluL2Jhc2gKKyMjIyBMb2dpYyAjIyMKIAorVGhlIFRyYXZpcyBDSSBidWlsZCBydW5zIGluIHR3byBwaGFzZXMgLSBmaXJzdCB0aGUgZG9ja2VyIGltYWdlcyBhcmUgcmVidWlsdAorZm9yIGVhY2ggb2YgdGhlIHN1cHBvcnRlZCBjb250YWluZXJzIGlmIHRoZXkgZG8gbm90IG1hdGNoIHRoZSBEb2NrZXJmaWxlIHRoYXQKK3dhcyB1c2VkIHRvIGJ1aWxkIHRoZSBtb3N0IHJlY2VudCB0YWcuICBJZiBhIGBET0NLRVJfUEFTU2AgZW52aXJvbm1lbnQKK3ZhcmlhYmxlIGlzIHNwZWNpZmllZCwgdGhlIGRvY2tlciBzdGFnZSBidWlsZHMgd2lsbCBhdHRlbXB0IHRvIGxvZyBpbnRvCitEb2NrZXIgSHViIGFuZCBwdXNoIHRoZSByZXN1bHRpbmcgdGFncy4KKworIyMgU3VwcG9ydGVkIENvbnRhaW5lcnMgIyMKKworVGhlIFRyYXZpcyBDSSAoY29udGludW91cyBpbnRlZ3JhdGlvbikgYnVpbGRzIHVzZSB0aGUgVWJ1bnR1IEJpb25pYworKDE4LjA0IExUUykgYW5kIFhlbmlhbCAoMTYuMDQgTFRTKSBpbWFnZXMgdG8gbWF4aW1pemUgbGFuZ3VhZ2UgbGV2ZWwKK2NvdmVyYWdlLgorCisjIyMgVWJ1bnR1ICMjIworCisqIGJpb25pYyAoc3RhYmxlLCBjdXJyZW50KQorKiBhcnRmdWwgKHByZXZpb3VzIHN0YWJsZSkKKyogeGVuaWFsIChsZWdhY3kpCisKKyMjIFVuc3VwcG9ydGVkIENvbnRhaW5lcnMgIyMKKworVGhlc2UgY29udGFpbmVycyBtYXkgYmUgaW4gdmFyaW91cyBzdGF0ZXMsIGFuZCBtYXkgbm90IGJ1aWxkIGV2ZXJ5dGhpbmcuCitUaGV5IGNhbiBiZSBmb3VuZCBpbiB0aGUgYG9sZC9gIHN1YmRpcmVjdG9yeS4KKworIyMjIENlbnRPUyAjIyMKKyogNy4zCisgICogbWFrZSBjaGVjayBpbiBsaWIvcHkgbWF5IGhhbmcgaW4gdGVzdF9zc2xzb2NrZXQgLSByb290IGNhdXNlIHVua25vd24KKworIyMjIERlYmlhbiAjIyMKKworKiBqZXNzaWUKKyogc3RyZXRjaAorICAqIG1ha2UgY2hlY2sgaW4gbGliL2NwcCBmYWlscyBkdWUgdG8gaHR0cHM6Ly9zdm4uYm9vc3Qub3JnL3RyYWMxMC90aWNrZXQvMTI1MDcKKworIyMgQnVpbGRpbmcgbGlrZSBUcmF2aXMgQ0kgZG9lcywgbG9jYWxseSAjIworCitXZSByZWNvbW1lbmQgeW91IGJ1aWxkIGxvY2FsbHkgdGhlIHNhbWUgd2F5IFRyYXZpcyBDSSBkb2VzLCBzbyB0aGF0IHdoZW4geW91CitzdWJtaXQgeW91ciBwdWxsIHJlcXVlc3QgeW91IHdpbGwgcnVuIGludG8gZmV3ZXIgc3VycHJpc2VzLiAgVG8gbWFrZSBpdCBhCitsaXR0bGUgZWFzaWVyLCBwdXQgdGhlIGZvbGxvd2luZyBpbnRvIHlvdXIgYH4vLmJhc2hfYWxpYXNlc2AgZmlsZToKKworICAgICMgS2lsbCBhbGwgcnVubmluZyBjb250YWluZXJzLgorICAgIGFsaWFzIGRvY2tlcmtpbGxhbGw9J2RvY2tlciBraWxsICQoZG9ja2VyIHBzIC1xKScKKworICAgICMgRGVsZXRlIGFsbCBzdG9wcGVkIGNvbnRhaW5lcnMuCisgICAgYWxpYXMgZG9ja2VyY2xlYW5jPSdwcmludGYgIlxuPj4+IERlbGV0aW5nIHN0b3BwZWQgY29udGFpbmVyc1xuXG4iICYmIGRvY2tlciBybSAkKGRvY2tlciBwcyAtYSAtcSknCisKKyAgICAjIERlbGV0ZSBhbGwgdW50YWdnZWQgaW1hZ2VzLgorICAgIGFsaWFzIGRvY2tlcmNsZWFuaT0ncHJpbnRmICJcbj4+PiBEZWxldGluZyB1bnRhZ2dlZCBpbWFnZXNcblxuIiAmJiBkb2NrZXIgcm1pICQoZG9ja2VyIGltYWdlcyAtcSAtZiBkYW5nbGluZz10cnVlKScKKworICAgICMgRGVsZXRlIGFsbCBzdG9wcGVkIGNvbnRhaW5lcnMgYW5kIHVudGFnZ2VkIGltYWdlcy4KKyAgICBhbGlhcyBkb2NrZXJjbGVhbj0nZG9ja2VyY2xlYW5jIHx8IHRydWUgJiYgZG9ja2VyY2xlYW5pJworCisgICAgIyBCdWlsZCBhIHRocmlmdCBkb2NrZXIgaW1hZ2UgKHJ1biBmcm9tIHRvcCBsZXZlbCBvZiBnaXQgcmVwbyk6IGFyZ3VtZW50ICMxIGlzIGltYWdlIHR5cGUgKHVidW50dSwgY2VudG9zLCBldGMpLgorICAgIGZ1bmN0aW9uIGRvY2tlcmJ1aWxkCisgICAgeworICAgICAgZG9ja2VyIGJ1aWxkIC10ICQxIGJ1aWxkL2RvY2tlci8kMQorICAgIH0KKworICAgICMgUnVuIGEgdGhyaWZ0IGRvY2tlciBpbWFnZTogYXJndW1lbnQgIzEgaXMgaW1hZ2UgdHlwZSAodWJ1bnR1LCBjZW50b3MsIGV0YykuCisgICAgZnVuY3Rpb24gZG9ja2VycnVuCisgICAgeworICAgICAgZG9ja2VyIHJ1biAtdiAkKHB3ZCk6L3RocmlmdC9zcmMgLWl0ICQxIC9iaW4vYmFzaAorICAgIH0KKworVGhlbiwgdG8gcHVsbCBkb3duIHRoZSBjdXJyZW50IGltYWdlIGJlaW5nIHVzZWQgdG8gYnVpbGQgKHRoZSBzYW1lIHdheQorVHJhdmlzIENJIGRvZXMgaXQpIC0gaWYgaXQgaXMgb3V0IG9mIGRhdGUgaW4gYW55IHdheSBpdCB3aWxsIGJ1aWxkIGEKK25ldyBvbmUgZm9yIHlvdToKKworICAgIHRocmlmdCQgRE9DS0VSX1JFUE89dGhyaWZ0L3RocmlmdC1idWlsZCBESVNUUk89dWJ1bnR1LWJpb25pYyBidWlsZC9kb2NrZXIvcmVmcmVzaC5zaAorCitUbyBydW4gYWxsIHVuaXQgdGVzdHMgKGp1c3QgbGlrZSBUcmF2aXMgQ0kgZG9lcyk6CisKKyAgICB0aHJpZnQkIGRvY2tlcnJ1biB1YnVudHUtYmlvbmljCisgICAgcm9vdEA4Y2FmNTZiMGNlN2I6L3RocmlmdC9zcmMjIGJ1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaAorCitUbyBydW4gdGhlIGNyb3NzIHRlc3RzIChqdXN0IGxpa2UgVHJhdmlzIENJIGRvZXMpOgorCisgICAgdGhyaWZ0JCBkb2NrZXJydW4gdWJ1bnR1LWJpb25pYworICAgIHJvb3RAOGNhZjU2YjBjZTdiOi90aHJpZnQvc3JjIyBidWlsZC9kb2NrZXIvc2NyaXB0cy9jcm9zcy10ZXN0LnNoCisKK1doZW4geW91IGFyZSBkb25lLCB5b3Ugd2FudCB0byBjbGVhbiB1cCBvY2Nhc2lvbmFsbHkgc28gdGhhdCBkb2NrZXIgaXNuJ3QgdXNpbmcgbG90cyBvZiBleHRyYSBkaXNrIHNwYWNlOgorCisgICAgdGhyaWZ0JCBkb2NrZXJjbGVhbgorCitZb3UgbmVlZCB0byBydW4gdGhlIGRvY2tlciBjb21tYW5kcyBmcm9tIHRoZSByb290IG9mIHRoZSBsb2NhbCBjbG9uZSBvZiB0aGUKK3RocmlmdCBnaXQgcmVwb3NpdG9yeSBmb3IgdGhlbSB0byB3b3JrLgorCitXaGVuIHlvdSBhcmUgZG9uZSBpbiB0aGUgcm9vdCBkb2NrZXIgc2hlbGwgeW91IGNhbiBgZXhpdGAgdG8gZ28gYmFjayB0bworeW91ciB1c2VyIGhvc3Qgc2hlbGwuICBPbmNlIHRoZSB1bml0IHRlc3RzIGFuZCBjcm9zcyB0ZXN0IHBhc3NlcyBsb2NhbGx5LAorc3VibWl0IHRoZSBjaGFuZ2VzLCBhbmQgaWYgZGVzaXJlZCBzcXVhc2ggdGhlIHB1bGwgcmVxdWVzdCB0byBvbmUgY29tbWl0Cit0byBtYWtlIGl0IGVhc2llciB0byBtZXJnZSAodGhlIGNvbW1pdHRlcnMgY2FuIHNxdWFzaCBhdCBjb21taXQgdGltZSBub3cKK3RoYXQgR2l0SHViIGlzIHRoZSBtYXN0ZXIgcmVwb3NpdG9yeSkuICBOb3cgeW91IGFyZSBidWlsZGluZyBsaWtlIFRyYXZpcyBDSSBkb2VzIQorCisjIyBSYXcgQ29tbWFuZHMgZm9yIEJ1aWxkaW5nIHdpdGggRG9ja2VyICMjCisKK0lmIHlvdSBkbyBub3Qgd2FudCB0byB1c2UgdGhlIHNhbWUgc2NyaXB0cyBUcmF2aXMgQ0kgZG9lcywgeW91IGNhbiBkbyBpdCBtYW51YWxseToKKworQnVpbGQgdGhlIGltYWdlOgorCisgICAgdGhyaWZ0JCBkb2NrZXIgYnVpbGQgLXQgdGhyaWZ0IGJ1aWxkL2RvY2tlci91YnVudHUtYmlvbmljCisKK09wZW4gYSBjb21tYW5kIHByb21wdCBpbiB0aGUgaW1hZ2U6CisKKyAgICB0aHJpZnQkIGRvY2tlciBydW4gLXYgJChwd2QpOi90aHJpZnQvc3JjIC1pdCB0aHJpZnQgL2Jpbi9iYXNoCisKKyMjIENvcmUgVG9vbCBWZXJzaW9ucyBwZXIgRG9ja2VyZmlsZSAjIworCitMYXN0IHVwZGF0ZWQ6IE9jdG9iZXIgMSwgMjAxNworCit8IFRvb2wgICAgICB8IHVidW50dS14ZW5pYWwgfCB1YnVudHUtYmlvbmljIHwgTm90ZXMgfAorfCA6LS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLSB8IDotLS0tIHwKK3wgYW50ICAgICAgIHwgMS45LjYgICAgICAgICB8IDEuMTAuMyAgICAgICAgfCAgICAgICB8Cit8IGF1dG9jb25mICB8IDIuNjkgICAgICAgICAgfCAyLjY5ICAgICAgICAgIHwgICAgICAgfAorfCBhdXRvbWFrZSAgfCAxLjE1ICAgICAgICAgIHwgMS4xNS4xICAgICAgICB8ICAgICAgIHwKK3wgYmlzb24gICAgIHwgMy4wLjQgICAgICAgICB8IDMuMC40ICAgICAgICAgfCAgICAgICB8Cit8IGJvb3N0ICAgICB8IDEuNTguMCAgICAgICAgfCAxLjY1LjEgICAgICAgIHwgICAgICAgfAorfCBjbWFrZSAgICAgfCAzLjUuMSAgICAgICAgIHwgMy4xMC4yICAgICAgICB8ICAgICAgIHwKK3wgY3BwY2hlY2sgIHwgMS43MiAgICAgICAgICB8IDEuODIgICAgICAgICAgfCAgICAgICB8Cit8IGZsZXggICAgICB8IDIuNi4wICAgICAgICAgfCAyLjYuNCAgICAgICAgIHwgICAgICAgfAorfCBsaWJjNiAgICAgfCAyLjIzICAgICAgICAgIHwgMi4yNyAgICAgICAgICB8IGdsaWJjIHwKK3wgbGliZXZlbnQgIHwgMi4wLjIxICAgICAgICB8IDIuMS44ICAgICAgICAgfCAgICAgICB8Cit8IGxpYnN0ZGMrKyB8IDUuNC4wICAgICAgICAgfCA3LjMuMCAgICAgICAgIHwgICAgICAgfAorfCBtYWtlICAgICAgfCA0LjEgICAgICAgICAgIHwgNC4xICAgICAgICAgICB8ICAgICAgIHwKK3wgb3BlbnNzbCAgIHwgMS4wLjJnICAgICAgICB8IDEuMS4wZyAgICAgICAgfCAgICAgICB8Cit8IHF0NSAgICAgICB8IDUuNS4xICAgICAgICAgfCA1LjkuNSAgICAgICAgIHwgICAgICAgfAorCisjIyBDb21waWxlci9MYW5ndWFnZSBWZXJzaW9ucyBwZXIgRG9ja2VyZmlsZSAjIworCit8IExhbmd1YWdlICB8IHVidW50dS14ZW5pYWwgfCB1YnVudHUtYmlvbmljIHwgTm90ZXMgfAorfCA6LS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLSB8IDotLS0tIHwKK3wgYXMgb2YgICAgIHwgTWFyIDA2LCAyMDE4ICB8IEphbiAyMSwgMjAxOSAgfCAgICAgICB8Cit8IGFzMyAgICAgICB8ICAgICAgICAgICAgICAgfCA0LjYuMCAgICAgICAgIHwgICAgICAgfAorfCBDKysgZ2NjICAgfCA1LjQuMCAgICAgICAgIHwgNy4zLjAgICAgICAgICB8ICAgICAgIHwKK3wgQysrIGNsYW5nIHwgMy44ICAgICAgICAgICB8IDYuMCAgICAgICAgICAgfCAgICAgICB8Cit8IEMjIChtb25vKSB8IDQuMi4xLjAgICAgICAgfCA0LjYuMi43ICAgICAgIHwgICAgICAgfAorfCBjX2dsaWIgICAgfCAyLjQ4LjIgICAgICAgIHwgMi41Ni4wICAgICAgICB8ICAgICAgIHwKK3wgY2wgKHNiY2wpIHwgICAgICAgICAgICAgICB8IDEuNC4xNSAgICAgICAgfCAgICAgICB8Cit8IGQgICAgICAgICB8IDIuMDc1LjEgICAgICAgfCAyLjA4My4xICAgICAgIHwgICAgICAgfAorfCBkYXJ0ICAgICAgfCAxLjI0LjMgICAgICAgIHwgMi4xLjAgICAgICAgICB8ICAgICAgIHwKK3wgZGVscGhpICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBOb3QgaW4gQ0kgfAorfCBkb3RuZXQgICAgfCAyLjEuNTAzICAgICAgIHwgMi4yLjEwMyAgICAgICB8ICAgICAgIHwKK3wgZXJsYW5nICAgIHwgMTguMyAgICAgICAgICB8IDIwLjIuMiAgICAgICAgfCAgICAgICB8Cit8IGdvICAgICAgICB8IDEuNy42ICAgICAgICAgfCAxLjExLjQgICAgICAgIHwgICAgICAgfAorfCBoYXNrZWxsICAgfCA3LjEwLjMgICAgICAgIHwgOC4wLjIgICAgICAgICB8ICAgICAgIHwKK3wgaGF4ZSAgICAgIHwgMy4yLjEgICAgICAgICB8IDMuNC40ICAgICAgICAgfCBUSFJJRlQtNDM1MjogYXZvaWQgMy40LjIgfAorfCBqYXZhICAgICAgfCAxLjguMF8xOTEgICAgIHwgMS44LjBfMTkxICAgICB8ICAgICAgIHwKK3wganMgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBVbnN1cmUgaG93IHRvIGxvb2sgZm9yIHZlcnNpb24gaW5mbz8gfAorfCBsdWEgICAgICAgfCA1LjIuNCAgICAgICAgIHwgNS4yLjQgICAgICAgICB8IEx1YSA1LjM6IHNlZSBUSFJJRlQtNDM4NiB8Cit8IG5vZGVqcyAgICB8IDYuMTYuMCAgICAgICAgfCA4LjE1LjAgICAgICAgIHwgICAgICAgfAorfCBvY2FtbCAgICAgfCAgICAgICAgICAgICAgIHwgNC4wNS4wICAgICAgICB8IFRIUklGVC00NTE3OiBvY2FtbCA0LjAyLjMgb24geGVuaWFsIGFwcGVhcnMgYnJva2VuIHwKK3wgcGVybCAgICAgIHwgNS4yMi4xICAgICAgICB8IDUuMjYuMSAgICAgICAgfCAgICAgICB8Cit8IHBocCAgICAgICB8IDcuMC4zMiAgICAgICAgfCA3LjIuMTAgICAgICAgIHwgICAgICAgfAorfCBweXRob24gICAgfCAyLjcuMTIgICAgICAgIHwgMi43LjE1cmMxICAgICB8ICAgICAgIHwKK3wgcHl0aG9uMyAgIHwgMy41LjIgICAgICAgICB8IDMuNi43ICAgICAgICAgfCAgICAgICB8Cit8IHJ1YnkgICAgICB8IDIuMy4xcDExMiAgICAgfCAyLjUuMXA1NyAgICAgIHwgICAgICAgfAorfCBydXN0ICAgICAgfCAxLjMwLjAgICAgICAgIHwgMS4zMC4wICAgICAgICB8ICAgICAgIHwKK3wgc21hbGx0YWxrIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBOb3QgaW4gQ0kgfAorfCBzd2lmdCAgICAgfCAgICAgICAgICAgICAgIHwgNC4yLjEgICAgICAgICB8ICAgICAgIHwKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9jZW50b3MvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci9jZW50b3MvRG9ja2VyZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjMjczYy4uMDAwMDAwMAotLS0gYS9idWlsZC9kb2NrZXIvY2VudG9zL0RvY2tlcmZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIENlbnRvcwotIwotIyBLbm93biBtaXNzaW5nIGNsaWVudCBsaWJyYXJpZXM6Ci0jICAtIEQKLSMgIC0gSGF4ZQotIyAgLSBMdWEKLSMKLQotRlJPTSBjZW50b3M6NwotTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Ci0KLUVOViBIT01FIC9yb290Ci0KLSMgUlVOIHl1bSAteSB1cGRhdGUKLQotIyBHZW5lcmFsIGRlcGVuZGVuY2llcwotUlVOIHl1bSAteSBpbnN0YWxsIC15IHRhciBtNCBwZXJsIGdjYyBnaXQgbGlidG9vbCB6bGliLWRldmVsIG9wZW5zc2wtZGV2ZWwgYXV0b2NvbmYgbWFrZSBiaXNvbiBiaXNvbi1kZXZlbCBmbGV4Ci0KLVJVTiBta2RpciAtcCAvdG1wL2VwZWwgJiYgXAotICAgIGN1cmwgLXNTTCAiaHR0cDovL2RsLmZlZG9yYXByb2plY3Qub3JnL3B1Yi9lcGVsLzcveDg2XzY0L2UvZXBlbC1yZWxlYXNlLTctNS5ub2FyY2gucnBtIiAtbyAvdG1wL2VwZWwvZXBlbC1yZWxlYXNlLTctNS5ub2FyY2gucnBtICYmIFwKLSAgICBjZCAvdG1wL2VwZWwgJiYgXAotICAgIHJwbSAtaXZoIGVwZWwtcmVsZWFzZSoucnBtICYmIFwKLSAgICBjZCAkSE9NRQotCi0jIEF1dG9tYWtlCi1SVU4gbWtkaXIgLXAgL3RtcC9hdXRvbWFrZSAmJiBcCi0gICAgY3VybCAtU0wgImh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYXV0b21ha2UvYXV0b21ha2UtMS4xNC50YXIuZ3oiIHwgdGFyIC14ekMgL3RtcC9hdXRvbWFrZSAmJiBcCi0gICAgY2QgL3RtcC9hdXRvbWFrZS9hdXRvbWFrZS0xLjE0ICYmIFwKLSAgICAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyICYmIFwKLSAgICBtYWtlICYmIFwKLSAgICBtYWtlIGluc3RhbGwgJiYgXAotICAgIGNkICRIT01FCi0KLSMgQysrIGRlcGVuZGVuY2llcwotUlVOIHl1bSBpbnN0YWxsIC15IGxpYmJvb3N0LWRldiBsaWJldmVudC1kZXZlbAotCi0jIEphdmEgRGVwZW5kZW5jaWVzCi1SVU4geXVtIGluc3RhbGwgLXkgYW50IGp1bml0IGFudC1ub2RlcHMgYW50LWp1bml0IGphdmEtMS43LjAtb3Blbmpkay1kZXZlbAotCi0jIFB5dGhvbiBEZXBlbmRlbmNpZXMKLVJVTiB5dW0gaW5zdGFsbCAteSBweXRob24tZGV2ZWwgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXR3aXN0ZWQKLQotIyBSdWJ5IERlcGVuZGVuY2llcwotUlVOIHl1bSBpbnN0YWxsIC15IHJ1YnkgcnVieS1kZXZlbCBydWJ5Z2VtcyAmJiBcCi0gICAgZ2VtIGluc3RhbGwgYnVuZGxlciByYWtlCi0KLSMgUGVybCBEZXBlbmRlbmNpZXMKLVJVTiB5dW0gaW5zdGFsbCAteSBwZXJsLUJpdC1WZWN0b3IgcGVybC1DbGFzcy1BY2Nlc3NvciBwZXJsLUV4dFV0aWxzLU1ha2VNYWtlciBwZXJsLVRlc3QtU2ltcGxlCi0KLSMgUEhQIERlcGVuZGVuY2llcwotUlVOIHl1bSBpbnN0YWxsIC15IHBocCBwaHAtZGV2ZWwgcGhwLXBlYXIgcmUyYwotCi0jIEdMaWJDIERlcGVuZGVuY2llcwotUlVOIHl1bSBpbnN0YWxsIC15IGdsaWIyLWRldmVsCi0KLSMgRXJsYW5nIERlcGVuZGVuY2llcwotUlVOIGN1cmwgLXNTTCBodHRwOi8vcGFja2FnZXMuZXJsYW5nLXNvbHV0aW9ucy5jb20vcnBtL2NlbnRvcy9lcmxhbmdfc29sdXRpb25zLnJlcG8gLW8gL2V0Yy95dW0ucmVwb3MuZC9lcmxhbmdfc29sdXRpb25zLnJlcG8gJiYgXAotICAgIHl1bSBpbnN0YWxsIC15IGVybGFuZy1rZXJuZWwgZXJsYW5nLWVydHMgZXJsYW5nLXN0ZGxpYiBlcmxhbmctZXVuaXQgZXJsYW5nLXJlYmFyCi0KLSMgR28gRGVwZW5kZW5jaWVzCi1SVU4gY3VybCAtc1NMIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9nb2xhbmcvZ28xLjQuMi5saW51eC1hbWQ2NC50YXIuZ3ogfCB0YXIgLUMgL3Vzci9saWIvIC14eiAmJiBcCi0gICAgbWtkaXIgLXAgL3Vzci9zaGFyZS9nbwotCi1FTlYgR09ST09UIC91c3IvbGliL2dvCi1FTlYgR09QQVRIIC91c3Ivc2hhcmUvZ28KLUVOViBQQVRIICR7R09ST09UfS9iaW46JHtHT1BBVEh9L2JpbjokUEFUSAotCi0jIEhhc2tlbGwgRGVwZW5kZW5jaWVzCi1SVU4geXVtIC15IGluc3RhbGwgY2FiYWwtZGV2ICYmIFwKLSAgICBjYWJhbCB1cGRhdGUgJiYgXAotICAgIGNhYmFsIGluc3RhbGwgY2FiYWwtaW5zdGFsbCAmJiBcCi0gICAgY2QgJEhPTUUKLQotIyBOb2RlLmpzIERlcGVuZGVuY2llcwotUlVOIHl1bSBpbnN0YWxsIC15IG5vZGVqcyBub2RlanMtZGV2ZWwgbnBtCi0KLSMgQyMgRGVwZW5kZW5jaWVzCi1SVU4geXVtIGluc3RhbGwgLXkgbW9uby1jb3JlIG1vbm8tZGV2ZWwgbW9uby13ZWItZGV2ZWwgbW9uby1leHRyYXMgbWluZ3czMi1iaW51dGlscyBtaW5ndzMyLXJ1bnRpbWUgbWluZ3czMi1uc2lzCi0KLSMgQ2xlYW4gdXAKLVJVTiBybSAtcmYgL3RtcC8qICYmIFwKLSAgICB5dW0gY2xlYW4gYWxsCi0KLVdPUktESVIgJEhPTUUKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9tc3ZjMjAxNy9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL21zdmMyMDE3L0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiM2NkNwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9tc3ZjMjAxNy9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMTAzIEBACisjIGVzY2FwZT1gCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0ZST00gbWljcm9zb2Z0L2RvdG5ldC1mcmFtZXdvcms6NC43LjEKKworIyBSZXN0b3JlIHRoZSBkZWZhdWx0IFdpbmRvd3Mgc2hlbGwgZm9yIGNvcnJlY3QgYmF0Y2ggcHJvY2Vzc2luZyBiZWxvdy4KK1NIRUxMIFsiY21kIiwgIi9TIiwgIi9DIl0KKworIyBJbnN0YWxsIEJ1aWxkIFRvb2xzIGV4Y2x1ZGluZyB3b3JrbG9hZHMgYW5kIGNvbXBvbmVudHMgd2l0aCBrbm93biBpc3N1ZXMuCitBREQgaHR0cHM6Ly9ha2EubXMvdnMvMTUvcmVsZWFzZS92c19idWlsZHRvb2xzLmV4ZSBDOlxURU1QXHZzX2J1aWxkdG9vbHMuZXhlCitSVU4gQzpcVEVNUFx2c19idWlsZHRvb2xzLmV4ZSAtLXF1aWV0IC0td2FpdCAtLW5vcmVzdGFydCAtLW5vY2FjaGUgYAorICAgIC0taW5zdGFsbFBhdGggQzpcQnVpbGRUb29scyBgCisgICAgLS1hbGwgYAorICAgIC0tcmVtb3ZlIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uQ29tcG9uZW50LldpbmRvd3MxMFNESy4xMDI0MCBgCisgICAgLS1yZW1vdmUgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5Db21wb25lbnQuV2luZG93czEwU0RLLjEwNTg2IGAKKyAgICAtLXJlbW92ZSBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLkNvbXBvbmVudC5XaW5kb3dzMTBTREsuMTQzOTMgYAorICAgIC0tcmVtb3ZlIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uQ29tcG9uZW50LldpbmRvd3M4MVNESyBgCisgfHwgSUYgIiVFUlJPUkxFVkVMJSI9PSIzMDEwIiBFWElUIDAKK1JVTiBERUwgQzpcVEVNUFx2c19idWlsZHRvb2xzLmV4ZQorCisjIEluc3RhbGwgQ01ha2UKK0FERCBodHRwczovL2dpdGh1Yi5jb20vS2l0d2FyZS9DTWFrZS9yZWxlYXNlcy9kb3dubG9hZC92My4xMy40L2NtYWtlLTMuMTMuNC13aW42NC14NjQubXNpIEM6XFRFTVBcY21ha2UubXNpCitSVU4gbXNpZXhlYy5leGUgL2kgQzpcVEVNUFxjbWFrZS5tc2kgL3FuICYmIGAKKyAgICBTRVRYIFBBVEggIiVQQVRIJTtDOlxQcm9ncmFtIEZpbGVzXENNYWtlXGJpbiIgJiYgYAorICAgIERFTCBDOlxURU1QXGNtYWtlLm1zaQorCisjIEluc3RhbGwgYm9vc3QgKGZvciB0aGUgdGhyaWZ0IHJ1bnRpbWUgbGlicmFyeSBidWlsZCkKK0FERCBodHRwczovL2Jvb3N0LnRlZWtzOTkuY29tL2Jpbi8xLjY5LjAvYm9vc3RfMV82OV8wLW1zdmMtMTQuMS02NC5leGUgQzpcVEVNUFxib29zdC5leGUKK1JVTiBDOlxURU1QXGJvb3N0LmV4ZSAvRElSPSJDOlxMaWJyYXJpZXNcYm9vc3RfMV82OV8wIiAvU0lMRU5UICYmIGAKKyAgICBERUwgQzpcVEVNUFxib29zdC5leGUKKworIyBJbnN0YWxsIGNob2NvbGF0ZXkKK1JVTiBAIiVTeXN0ZW1Sb290JVxTeXN0ZW0zMlxXaW5kb3dzUG93ZXJTaGVsbFx2MS4wXHBvd2Vyc2hlbGwuZXhlIiBgCisgICAgLU5vUHJvZmlsZSAtSW5wdXRGb3JtYXQgTm9uZSAtRXhlY3V0aW9uUG9saWN5IEJ5cGFzcyAtQ29tbWFuZCBgCisgICAgImlleCAoKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkU3RyaW5nKCdodHRwczovL2Nob2NvbGF0ZXkub3JnL2luc3RhbGwucHMxJykpIiBgCisgICAgJiYgU0VUWCBQQVRIICIlUEFUSCU7JUFMTFVTRVJTUFJPRklMRSVcY2hvY29sYXRleVxiaW4iCisKKyMgSW5zdGFsbCB3aW5mbGV4Ymlzb24gKGZvciB0aGUgdGhyaWZ0IGNvbXBpbGVyIGJ1aWxkKQorUlVOIGNob2NvIGluc3RhbGwgd2luZmxleGJpc29uMyAteQorCisjIEluc3RhbGwgN3ppcCBhbmQgY3VybCAodXNlZCBieSB0aGUgbGliZXZlbnQgYW5kIHpsaWIgYnVpbGQgc2NyaXB0cykKK1JVTiBjaG9jbyBpbnN0YWxsIDd6aXAgY3VybCAteQorCisjIEluc3RhbGwgbGliZXZlbnQKK0NPUFkgYXBwdmV5b3JcYnVpbGQtbGliZXZlbnQuYmF0IEM6XFRFTVBcYnVpbGQtbGliZXZlbnQuYmF0CitFTlYgTElCRVZFTlRfVkVSU0lPTj0yLjEuOAorRU5WIFdJTjNQPUM6XFRFTVBcV0lOM1AKK1JVTiBDOlxCdWlsZFRvb2xzXENvbW1vbjdcVG9vbHNcVnNEZXZDbWQuYmF0IC1hcmNoPWFtZDY0ICYmIGAKKyAgICBNS0RJUiBDOlxURU1QXFdJTjNQICYmIGAKKyAgICBDOlxURU1QXGJ1aWxkLWxpYmV2ZW50LmJhdCAmJiBgCisgICAgTUtESVIgQzpcTGlicmFyaWVzXGxpYmV2ZW50LSVMSUJFVkVOVF9WRVJTSU9OJSAmJiBgCisgICAgTU9WRSBDOlxURU1QXFdJTjNQXGxpYmV2ZW50LSVMSUJFVkVOVF9WRVJTSU9OJS1zdGFibGVcaW5jbHVkZSBDOlxMaWJyYXJpZXNcbGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lICYmIGAKKyAgICBNT1ZFIEM6XFRFTVBcV0lOM1BcbGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZVxsaWIgQzpcTGlicmFyaWVzXGxpYmV2ZW50LSVMSUJFVkVOVF9WRVJTSU9OJSAmJiBgCisgICAgUk1ESVIgL1MgL1EgQzpcVEVNUFxXSU4zUAorCisjIEluc3RhbGwgemxpYgorQ09QWSBhcHB2ZXlvclxidWlsZC16bGliLmJhdCBDOlxURU1QXGJ1aWxkLXpsaWIuYmF0CitFTlYgWkxJQl9WRVJTSU9OPTEuMi4xMQorRU5WIFdJTjNQPUM6XFRFTVBcV0lOM1AKK1JVTiBDOlxCdWlsZFRvb2xzXENvbW1vbjdcVG9vbHNcVnNEZXZDbWQuYmF0IC1hcmNoPWFtZDY0ICYmIGAKKyAgICBNS0RJUiBDOlxURU1QXFdJTjNQICYmIGAKKyAgICBDOlxURU1QXGJ1aWxkLXpsaWIuYmF0ICYmIGAKKyAgICBNT1ZFIEM6XFRFTVBcV0lOM1BcemxpYi1pbnN0IEM6XExpYnJhcmllc1x6bGliLSVaTElCX1ZFUlNJT04lICYmIGAKKyAgICBSTURJUiAvUyAvUSBDOlxURU1QXFdJTjNQCisKKyMgSW5zdGFsbCBPcGVuU1NMIDEuMS4wCitBREQgaHR0cDovL3NscHJvd2ViLmNvbS9kb3dubG9hZC9XaW42NE9wZW5TU0wtMV8xXzBqLmV4ZSBDOlxURU1QXG9wZW5zc2wuZXhlCitSVU4gQzpcVEVNUFxvcGVuc3NsLmV4ZSAvc2lsZW50ICYmIGAKKyAgICBERUwgQzpcVEVNUFxvcGVuc3NsLmV4ZQorCisjIEluc3RhbGwgamF2YQorUlVOIGNob2NvIGluc3RhbGwgamRrOCAteQorCisjIEluc3RhbGwgaGFza2VsbAorUlVOIGNob2NvIGluc3RhbGwgZ2hjIC15CisKKyMgSW5zdGFsbCBweXRob24zCitSVU4gY2hvY28gaW5zdGFsbCBweXRob24zIC15CisKKyMgSW5zdGFsbCBBZG9iZSBGbGV4IDQuNiBTREsgYW5kIHNldCBGTEVYX0hPTUUgc28gaXQgY2FuIGJlIGZvdW5kCitBREQgaHR0cDovL2Rvd25sb2FkLm1hY3JvbWVkaWEuY29tL3B1Yi9mbGV4L3Nkay9mbGV4X3Nka180LjYuemlwIEM6XEFkb2JlXEZsZXhcU0RLXDQuNlxTREsuemlwCitSVU4gQ0QgQzpcQWRvYmVcRmxleFxTREtcNC42ICYmIGAKKyAgICA3eiB4IFNESy56aXAgJiYgYAorICAgIERFTCBTREsuemlwICYmIGAKKyAgICBTRVRYIEZMRVhfSE9NRSAiQzpcQWRvYmVcRmxleFxTREtcNC42IgorCisjIFN0YXJ0IGRldmVsb3BlciBjb21tYW5kIHByb21wdCB3aXRoIGFueSBvdGhlciBjb21tYW5kcyBzcGVjaWZpZWQuCitFTlRSWVBPSU5UIEM6XEJ1aWxkVG9vbHNcQ29tbW9uN1xUb29sc1xWc0RldkNtZC5iYXQgLWFyY2g9YW1kNjQgJiYKKworIyBEZWZhdWx0IHRvIFBvd2VyU2hlbGwgaWYgbm8gb3RoZXIgY29tbWFuZCBzcGVjaWZpZWQuCitDTUQgWyJwb3dlcnNoZWxsLmV4ZSIsICItTm9Mb2dvIiwgIi1FeGVjdXRpb25Qb2xpY3kiLCAiQnlwYXNzIl0KZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9tc3ZjMjAxNy9SRUFETUUubWQgYi9idWlsZC9kb2NrZXIvbXN2YzIwMTcvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjODgyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvbXN2YzIwMTcvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTAgQEAKKyMgQnVpbGRpbmcgVGhyaWZ0IHVzaW5nIERvY2tlciBmb3IgV2luZG93cworCitUaGUgYnVpbGQgaW1hZ2UgaXMgdmVyeSBsYXJnZSAoanVzdCB1bmRlciAzMEdCKSBzbyBwbGFuIGFjY29yZGluZ2x5LgorT25jZSBNaWNyb3NvZnQgc3VwcG9ydHMgYnVpbGQgdG9vbHMgaW4gbmFubywgaXQgc2hvdWxkIGdldCBiZXR0ZXIuCisKK0luc3RhbGwgRG9ja2VyIGZvciBXaW5kb3dzIGFuZCBzd2l0Y2ggdG8gV2luZG93cyBjb250YWluZXIgbW9kZS4KKworUHVsbCBmcm9tIGRvY2tlciBodWI6CisKKyAgICBQUyBDOlw+IGRvY2tlciBwdWxsIHRocmlmdC90aHJpZnQtYnVpbGQ6bXN2YzIwMTcKKworb3IgYnVpbGQgaW4gYSBkb2NrZXIgZm9yIHdpbmRvd3MgZW52aXJvbm1lbnQ6CisKKyAgICBQUyBDOlxUaHJpZnQ+IGRvY2tlciBidWlsZCAtdCB0aHJpZnQvdGhyaWZ0LWJ1aWxkOm1zdmMyMDE3IC1mIGJ1aWxkXGRvY2tlclxtc3ZjMjAxN1xEb2NrZXJmaWxlIGJ1aWxkXAorCitUaGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzIGFyZSB1c2VkIGluc2lkZSB0aGUgY29udGFpbmVyOgorCisgICAgQzpcQnVpbGQgICAgIHRoZSBvdXQtb2YtdHJlZSBidWlsZCBkaXJlY3RvcnkKKyAgICBDOlxJbnN0YWxsICAgdGhlIGluc3RhbGwgdGFyZ2V0IGRpcmVjdG9yeQorICAgIEM6XFRocmlmdCAgICB0aGUgc291cmNlIHRyZWUKKworWW91IGNhbiBvdmVycmlkZSB0aGVzZSBhcyBkb2NrZXIgdm9sdW1lcyBpZiBkZXNpcmVkLgorCisjIyMgQ29tcGlsZXIKKworVG8gYnVpbGQgYSBwb3J0YWJsZSB3aW5kb3dzIHRocmlmdCBjb21waWxlciAod2l0aCBhIHN0YXRpY2FsbHkgbGlua2VkCitydW50aW1lKSBhbmQgZ2V0IGl0IHBsYWNlZCBpbnRvIEM6XGluc3RhbGw6CisKKyAgICBkb2NrZXIgcnVuIC12IEM6XHRocmlmdDpDOlx0aHJpZnReCisgICAgICAgICAgIC12IEM6XGluc3RhbGw6QzpcaW5zdGFsbF4KKyAgICAgICAgICAgLS1ybSAtdCB0aHJpZnQvdGhyaWZ0LWJ1aWxkOm1zdmMyMDE3XgorICAgICAgICAgICBDOlx0aHJpZnRcYnVpbGRcZG9ja2VyXG1zdmMyMDE3XGJ1aWxkLWNvbXBpbGVyLmJhdAorCitUaGUgZW5kIHJlc3VsdCBpcyBhIHBvcnRhYmxlIHdpbmRvd3MgdGhyaWZ0IGNvbXBpbGVyIGxvY2F0ZWQgYXQKKworICAgIEM6XEluc3RhbGxcYmluXHRocmlmdC5leGUKKworSWYgeW91IHJ1biBpdCB0aHJvdWdoIHRoZSBbRGVwZW5kZW5jeSBXYWxrZXJdKGh0dHA6Ly93d3cuZGVwZW5kZW5jeXdhbGtlci5jb20vKQoreW91IHdpbGwgc2VlIGl0IG9ubHkgZGVwZW5kcyBvbiBLRVJORUwzMi5ETEwgd2hpY2ggbWVhbnMgdGhlIHJ1bnRpbWUgaXMgc3RhdGljYWxseQorbGlua2VkLCBzbyB0aGUgZXhlY3V0YWJsZSBpcyBwb3J0YWJsZSBhbmQgc2VsZi1jb250YWluZWQuICBUaGlzIGlzIGhvdyB0aGUKK3dpbmRvd3MgdGhyaWZ0IGNvbXBpbGVyIGlzIGJ1aWx0IGZvciBlYWNoIEFwYWNoZSBUaHJpZnQgcmVsZWFzZS4KKworIyMjIExpYnJhcmllcworCitUbyBidWlsZCwgdGVzdCBldmVyeXRoaW5nIGFuZCBnZXQgdGhlIEMrKyBTREsgcGxhY2VkIGludG8gQzpcaW5zdGFsbDoKKworICAgIGRvY2tlciBydW4gLXYgQzpcdGhyaWZ0OkM6XHRocmlmdF4KKyAgICAgICAgICAgLXYgQzpcaW5zdGFsbDpDOlxpbnN0YWxsXgorICAgICAgICAgICAtbSA0MDk2IC0tcm0gLXQgdGhyaWZ0L3RocmlmdC1idWlsZDptc3ZjMjAxN14KKyAgICAgICAgICAgQzpcdGhyaWZ0XGJ1aWxkXGRvY2tlclxtc3ZjMjAxN1xidWlsZC5iYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvbXN2YzIwMTcvYnVpbGQtY29tcGlsZXIuYmF0IGIvYnVpbGQvZG9ja2VyL21zdmMyMDE3L2J1aWxkLWNvbXBpbGVyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTM0NDI4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL21zdmMyMDE3L2J1aWxkLWNvbXBpbGVyLmJhdApAQCAtMCwwICsxLDQ0IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogQnVpbGQgc2NyaXB0IGV4YW1wbGUgZm9yIGluc2lkZSB0aGUgd2luZG93cyBkb2NrZXIgY29udGFpbmVyCis6OgorOjogQzpcYnVpbGQgaXMgdGhlIG91dC1vZi10cmVlIGJ1aWxkIGRpcmVjdG9yeQorOjogQzpcaW5zdGFsbCBpcyB0aGUgbG9jYXRpb24gd2hlcmUgYXJ0aWZhY3RzIGFyZSBwbGFjZWQKKzo6IEM6XHRocmlmdCBpcyB3aGVyZSB0aGUgc291cmNlcyBhcmUKKzo6CisKKzo6IE1ha2UgYW5kIGdvIGludG8gdGhlIG91dC1vZi10cmVlIGRpcmVjdG9yeQorSUYgTk9UIEVYSVNUIEM6XGJ1aWxkIChNS0RJUiBDOlxidWlsZCkKK2NkIGM6XGJ1aWxkCisKKzo6IEdlbmVyYXRlIHRoZSBvdXQtb2YtdHJlZSBidWlsZCBmaWxlcworY21ha2VeCisgIC1EQk9PU1RfUk9PVD1DOlxMaWJyYXJpZXNcYm9vc3RfMV82OV8wXgorICAtREJPT1NUX0xJQlJBUllESVI9QzpcTGlicmFyaWVzXGJvb3N0XzFfNjlfMFxsaWI2NC1tc3ZjLTE0LjFeCisgIC1EQlVJTERfTElCUkFSSUVTPU9GRl4KKyAgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2VeCisgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9QzpcaW5zdGFsbF4KKyAgLURXSVRIX01UPU9OXgorICBjOlx0aHJpZnQgfHwgRVhJVCAvQgorCis6OiBCdWlsZAorY21ha2UgLS1idWlsZCAuIC0tdGFyZ2V0IHRocmlmdC1jb21waWxlciAtLWNvbmZpZyBSZWxlYXNlIHx8IEVYSVQgL0IKKworOjogVGVzdAorY21ha2UgLS1idWlsZCAuIC0tdGFyZ2V0IGNoZWNrIHx8IEVYSVQgL0IKKworOjogSW5zdGFsbAorY21ha2UgLS1idWlsZCAuIC0tdGFyZ2V0IGluc3RhbGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvbXN2YzIwMTcvYnVpbGQuYmF0IGIvYnVpbGQvZG9ja2VyL21zdmMyMDE3L2J1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTg4MDViCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL21zdmMyMDE3L2J1aWxkLmJhdApAQCAtMCwwICsxLDQ1IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogQnVpbGQgc2NyaXB0IGV4YW1wbGUgZm9yIGluc2lkZSB0aGUgd2luZG93cyBkb2NrZXIgY29udGFpbmVyCis6OgorOjogQzpcYnVpbGQgaXMgdGhlIG91dC1vZi10cmVlIGJ1aWxkIGRpcmVjdG9yeQorOjogQzpcaW5zdGFsbCBpcyB0aGUgbG9jYXRpb24gd2hlcmUgYXJ0aWZhY3RzIGFyZSBwbGFjZWQKKzo6IEM6XHRocmlmdCBpcyB3aGVyZSB0aGUgc291cmNlcyBhcmUKKzo6CisKKzo6IE1ha2UgYW5kIGdvIGludG8gdGhlIG91dC1vZi10cmVlIGRpcmVjdG9yeQorSUYgTk9UIEVYSVNUIEM6XGJ1aWxkIChNS0RJUiBDOlxidWlsZCkKK2NkIGM6XGJ1aWxkCisKKzo6IEdlbmVyYXRlIHRoZSBvdXQtb2YtdHJlZSBidWlsZCBmaWxlcworY21ha2VeCisgIC1EQk9PU1RfUk9PVD1DOlxMaWJyYXJpZXNcYm9vc3RfMV82OV8wXgorICAtREJPT1NUX0xJQlJBUllESVI9QzpcTGlicmFyaWVzXGJvb3N0XzFfNjlfMFxsaWI2NC1tc3ZjLTE0LjFeCisgIC1ERkxFWF9IT01FPUM6XEFkb2JlXEZsZXhcU0RLXDQuNl4KKyAgLURMSUJFVkVOVF9ST09UPUM6XExpYnJhcmllc1xsaWJldmVudC0yLjEuOF4KKyAgLURaTElCX1JPT1Q9QzpcTGlicmFyaWVzXHpsaWItMS4yLjExXgorICAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZV4KKyAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD1DOlxpbnN0YWxsXgorICBjOlx0aHJpZnQgfHwgRVhJVCAvQgorCis6OiBCdWlsZAorY21ha2UgLS1idWlsZCAuIC0tY29uZmlnIFJlbGVhc2UgfHwgRVhJVCAvQgorCis6OiBUZXN0CitjbWFrZSAtLWJ1aWxkIC4gLS10YXJnZXQgY2hlY2sgfHwgRVhJVCAvQgorCis6OiBJbnN0YWxsCitjbWFrZSAtLWJ1aWxkIC4gLS10YXJnZXQgaW5zdGFsbApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL1ZhZ3JhbnRmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC9WYWdyYW50ZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnVpbGQvZG9ja2VyL1ZhZ3JhbnRmaWxlCnJlbmFtZSB0byBidWlsZC9kb2NrZXIvb2xkL1ZhZ3JhbnRmaWxlCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL2NlbnRvcy03LjMvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci9vbGQvY2VudG9zLTcuMy9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NmJiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvb2xkL2NlbnRvcy03LjMvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDE5OSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBDZW50T1MKKyMKKyMgS25vd24gbWlzc2luZyBjbGllbnQgbGlicmFyaWVzOgorIyAgLSBkb3RuZXQgKHdpbGwgdXBkYXRlIHRvIDIuMC4wIHNlcGFyYXRlbHkpCisjICAtIGhheGUgKG5vdCBpbiBjZW50b3MpCisKK0ZST00gY2VudG9zOjcuMy4xNjExCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KKworUlVOIHl1bSBpbnN0YWxsIC15IGVwZWwtcmVsZWFzZQorCisjIEdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgYXV0b2NvbmYgXAorICAgICAgYmlzb24gXAorICAgICAgYmlzb24tZGV2ZWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY2xhbmctYW5hbHl6ZXIgXAorICAgICAgY21ha2UzIFwKKyAgICAgIGN1cmwgXAorICAgICAgZmxleCBcCisgICAgICBnY2MgXAorICAgICAgZ2NjLWMrKyBcCisgICAgICBnZGIgXAorICAgICAgZ2l0IFwKKyAgICAgIGxpYnRvb2wgXAorICAgICAgbTQgXAorICAgICAgbWFrZSBcCisgICAgICB0YXIgXAorICAgICAgdW56aXAgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgd2dldCAmJiBcCisgICAgICBsbiAtcyAvdXNyL2Jpbi9jbWFrZTMgL3Vzci9iaW4vY21ha2UgJiYgXAorICAgICAgbG4gLXMgL3Vzci9iaW4vY3BhY2szIC91c3IvYmluL2NwYWNrICYmIFwKKyAgICAgIGxuIC1zIC91c3IvYmluL2N0ZXN0MyAvdXNyL2Jpbi9jdGVzdAorCisjIEMrKyBkZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBib29zdC1kZXZlbC1zdGF0aWMgXAorICAgICAgemxpYi1kZXZlbCBcCisgICAgICBvcGVuc3NsLWRldmVsIFwKKyAgICAgIGxpYmV2ZW50LWRldmVsICYmIFwKKyAgICBjZCAvdXNyL2xpYjY0ICYmIFwKKyAgICBsbiAtcyBsaWJib29zdF90aHJlYWQtbXQuYSBsaWJib29zdF90aHJlYWQuYQorCisjIEMjIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIG1vbm8tY29yZSBcCisgICAgICBtb25vLWRldmVsIFwKKyAgICAgIG1vbm8td2ViLWRldmVsIFwKKyAgICAgIG1vbm8tZXh0cmFzCisKKyMgRCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBodHRwOi8vZG93bmxvYWRzLmRsYW5nLm9yZy9yZWxlYXNlcy8yLngvMi4wNzYuMC9kbWQtMi4wNzYuMC0wLmZlZG9yYS54ODZfNjQucnBtIHhkZy11dGlscworUlVOIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlciBvcGVuc3NsLW1hc3RlcgorCisjIERhcnQKK1JVTiBjZCAvdXNyL2xvY2FsICYmIFwKKyAgICB3Z2V0IC1xIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kYXJ0LWFyY2hpdmUvY2hhbm5lbHMvc3RhYmxlL3JlbGVhc2UvMS4yNC4yL3Nkay9kYXJ0c2RrLWxpbnV4LXg2NC1yZWxlYXNlLnppcCAmJiBcCisgICAgdW56aXAgLXEgZGFydHNkay1saW51eC14NjQtcmVsZWFzZS56aXAgJiYgXAorICAgIHJtIGRhcnRzZGstbGludXgteDY0LXJlbGVhc2UuemlwCitFTlYgUEFUSCAvdXNyL2xvY2FsL2RhcnQtc2RrL2JpbjokUEFUSAorCisjIEVybGFuZyBEZXBlbmRlbmNpZXMKK1JVTiBjdXJsIC1zU0wgaHR0cDovL3BhY2thZ2VzLmVybGFuZy1zb2x1dGlvbnMuY29tL3JwbS9jZW50b3MvZXJsYW5nX3NvbHV0aW9ucy5yZXBvIC1vIC9ldGMveXVtLnJlcG9zLmQvZXJsYW5nX3NvbHV0aW9ucy5yZXBvICYmIFwKKyAgICB5dW0gaW5zdGFsbCAteSBcCisgICAgICBlcmxhbmcta2VybmVsIFwKKyAgICAgIGVybGFuZy1lcnRzIFwKKyAgICAgIGVybGFuZy1zdGRsaWIgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1yZWJhciBcCisgICAgICBlcmxhbmctdG9vbHMKKworIyBHTGliQyBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBnbGliMi1kZXZlbAorCisjIEdvIERlcGVuZGVuY2llcworUlVOIGN1cmwgLXNTTCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ29sYW5nL2dvMS45LmxpbnV4LWFtZDY0LnRhci5neiB8IHRhciAtQyAvdXNyL2xvY2FsLyAteHoKK0VOViBQQVRIIC91c3IvbG9jYWwvZ28vYmluOiRQQVRICisKKyMgSGFza2VsbCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gLXkgaW5zdGFsbCBoYXNrZWxsLXBsYXRmb3JtCisKKyMgSGF4ZSBEZXBlbmRlbmNpZXMKKyMgTm90IGluIGRlYmlhbi9zdHJldGNoCisKKyMgSmF2YSBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBhbnQgXAorICAgICAganVuaXQgXAorICAgICAgYW50LWp1bml0IFwKKyAgICAgIGphdmEtMS44LjAtb3Blbmpkay1kZXZlbAorCisjIEx1YSBEZXBlbmRlbmNpZXMKKyMgTHVhIGluIGVwZWwgaXMgdG9vIG9sZCAoNS4xLjQsIG5lZWQgNS4yKSBzbyB3ZSBnZXQgdGhlIGxhdGVzdAorUlVOIHl1bSBpbnN0YWxsIC15IHJlYWRsaW5lLWRldmVsICYmIFwKKyAgICB3Z2V0IC1xIGh0dHA6Ly93d3cubHVhLm9yZy9mdHAvbHVhLTUuMy40LnRhci5neiAmJiBcCisgICAgdGFyIHh6ZiBsdWEtNS4zLjQudGFyLmd6ICYmIFwKKyAgICBjZCBsdWEtNS4zLjQgJiYgXAorICAgIHNlZCAtaSAncy9DRkxBR1M9IC9DRkxBR1M9IC1mUElDIC9nJyBzcmMvTWFrZWZpbGUgJiYgXAorICAgIG1ha2UgbGludXggJiYgXAorICAgIG1ha2UgaW5zdGFsbCAmJiBcCisgICAgY2QgLi4gJiYgXAorICAgIHJtIC1yZiBsdWEtNSoKKworIyBNaW5HVyBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBtaW5ndzMyLWJpbnV0aWxzIFwKKyAgICAgIG1pbmd3MzItY3J0IFwKKyAgICAgIG1pbmd3MzItbnNpcworCisjIE5vZGUuanMgRGVwZW5kZW5jaWVzCisjIFdvcmsgYXJvdW5kIGVwZWwgaXNzdWUgd2hlcmUgdGhleSByZW1vdmVkIGh0dHAtcGFyc2VyIHRoYXQgbm9kZWpzIGRlcGVuZHMgb24hCitSVU4geXVtIC15IGluc3RhbGwgaHR0cHM6Ly9vcGVuc291cmNlLmVuZGEuZXUvcGFja2FnZXMvaHR0cC1wYXJzZXItMi43LjEtMy5lbDcueDg2XzY0LnJwbQorUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIG5vZGVqcyBcCisgICAgICBucG0KKworIyBPY2FtbCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBvY2FtbCBcCisgICAgICBvY2FtbC1vY2FtbGRvYyAmJiBcCisgICAgd2dldCAtcSBodHRwczovL3Jhdy5naXRodWIuY29tL29jYW1sL29wYW0vbWFzdGVyL3NoZWxsL29wYW1faW5zdGFsbGVyLnNoIC1PIC0gfCBzaCAtcyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMgJiYgXAorICAgIGVjaG8gJy4gL3Jvb3QvLm9wYW0vb3BhbS1pbml0L2luaXQuc2ggPiAvZGV2L251bGwgMj4gL2Rldi9udWxsIHx8IHRydWUnID4+IH4vLmJhc2hyYworCisjIFBlcmwgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgcGVybCBcCisgICAgICBwZXJsLXZlcnNpb24gXAorICAgICAgcGVybC1CaXQtVmVjdG9yIFwKKyAgICAgIHBlcmwtQ2xhc3MtQWNjZXNzb3IgXAorICAgICAgcGVybC1FeHRVdGlscy1NYWtlTWFrZXIgXAorICAgICAgcGVybC1UZXN0LVNpbXBsZSBcCisgICAgICBwZXJsLUlPLVNvY2tldC1TU0wgXAorICAgICAgcGVybC1OZXQtU1NMZWF5IFwKKyAgICAgIHBlcmwtQ3J5cHQtU1NMZWF5CisKKyMgUEhQIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIHBocCBcCisgICAgICBwaHAtZGV2ZWwgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBwaHAtcGhwdW5pdC1QSFBVbml0IFwKKyAgICAgIGJ6aXAyCisKKyMgUHl0aG9uIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIHB5dGhvbiBcCisgICAgICBweXRob24tZGV2ZWwgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24zNCBcCisgICAgICBweXRob24zNC1kZXZlbCBcCisgICAgICBweXRob24zNC1waXAgXAorICAgICAgcHl0aG9uMzQtc2V0dXB0b29scworUlVOIHBpcDIgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwCitSVU4gcGlwMiBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGlwYWRkcmVzcyBzZXR1cHRvb2xzIHNpeCB0b3JuYWRvIHRvcm5hZG8tdGVzdGluZyB0d2lzdGVkIHZpcnR1YWxlbnYgem9wZS1pbnRlcmZhY2UKK1JVTiBwaXAzIGluc3RhbGwgLS11cGdyYWRlIHBpcAorUlVOIHBpcDMgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpcGFkZHJlc3Mgc2V0dXB0b29scyBzaXggdG9ybmFkbyB0b3JuYWRvLXRlc3RpbmcgdHdpc3RlZCB2aXJ0dWFsZW52IHpvcGUtaW50ZXJmYWNlCisKKyMgUnVieSBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2ZWwgXAorICAgICAgcnVieWdlbXMgJiYgXAorICAgIGdlbSBpbnN0YWxsIGJ1bmRsZXIgcmFrZQorCisjIFJ1c3QKK1JVTiBjdXJsIGh0dHBzOi8vc2gucnVzdHVwLnJzIC1zU2YgfCBzaCAtcyAtLSAteSAtLWRlZmF1bHQtdG9vbGNoYWluIDEuMTcuMAorRU5WIFBBVEggL3Jvb3QvLmNhcmdvL2JpbjokUEFUSAorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC90bXAvKiAmJiBcCisgICAgeXVtIGNsZWFuIGFsbAorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLWplc3NpZS9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tamVzc2llL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxYjRiYgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLWplc3NpZS9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjA1IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIERlYmlhbgorIworIyBLbm93biBtaXNzaW5nIGNsaWVudCBsaWJyYXJpZXM6CisjICAtIGRvdG5ldGNvcmUKKyMgIC0gcnVzdAorCitGUk9NIGJ1aWxkcGFjay1kZXBzOmplc3NpZS1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorCitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMgQWRkIGFwdCBzb3VyY2VzCisjIGplc3NpZS1iYWNrcG9ydHMgZm9yIGNtYWtlIGFuZCBzb21lIHJ1YnkgYml0cworUlVOIGVjaG8gImRlYiBodHRwOi8vZnRwLmRlYmlhbi5vcmcvZGViaWFuIGplc3NpZS1iYWNrcG9ydHMgbWFpbiIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9qZXNzaWUtYmFja3BvcnRzLmxpc3QKKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgJiYgXAorICAgIHNlZCAtaSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0IC1lICdzL2h0dHBzOi9odHRwOi9nJworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgcGtnLWNvbmZpZyAmJiBcCisgICAgYXB0LWdldCAtdCBqZXNzaWUtYmFja3BvcnRzIGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgY21ha2UKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1kZXYgXAorICAgICAgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBcCisgICAgICBsaWJib29zdC1zeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRlc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRocmVhZC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTctamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXBpcAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktYnVuZGxlciBcCisgICAgICBydWJ5LWRldiBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCAtdCBqZXNzaWUtYmFja3BvcnRzIGluc3RhbGwgLXkgcnVieS1idW5kbGVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocDUgXAorICAgICAgcGhwNS1kZXYgXAorICAgICAgcGhwNS1jbGkgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBwaHB1bml0IFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYgXAorICAgICAgbGlibmVrbzAKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzIFwKKyAgICAgIG5vZGVqcy1kZXYgXAorICAgICAgbm9kZWpzLWxlZ2FjeSBcCisgICAgICBucG0KKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDU2hhcnAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJtb25vLXN5c3RlbS13ZWIyLjAtY2lsIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgICAgeGRnLXV0aWxzIFwKK2AjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0IFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2IFwKK2AjIE1pbkdXIGRlcGVuZGVuY2llc2AgXAorICAgICAgbWluZ3czMiBcCisgICAgICBtaW5ndzMyLWJpbnV0aWxzIFwKK2AjICAgICAgbWluZ3czMi1ydW50aW1lYCBcCisgICAgICBuc2lzIFwKK2AjIENsZWFuIHVwYCBcCisgICAgJiYgcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworIyBSdWJ5CitSVU4gZ2VtIGluc3RhbGwgYnVuZGxlciAtLW5vLXJpIC0tbm8tcmRvYworCisjIFB5dGhvbiBvcHRpb25hbCBkZXBlbmRlbmNpZXMKK1JVTiBwaXAyIGluc3RhbGwgLVUgaXBhZGRyZXNzIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbworUlVOIHBpcDMgaW5zdGFsbCAtVSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvcm5hZG8KKworIyBHbworUlVOIGN1cmwgLXNTTCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ29sYW5nL2dvMS40LjMubGludXgtYW1kNjQudGFyLmd6IHwgdGFyIC1DIC91c3IvbG9jYWwvIC14egorRU5WIFBBVEggL3Vzci9sb2NhbC9nby9iaW46JFBBVEgKKworIyBIYXhlCitSVU4gbWtkaXIgLXAgL3Vzci9saWIvaGF4ZSAmJiBcCisgICAgd2dldCAtTyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL3JlbGVhc2VzL2Rvd25sb2FkLzMuMi4xL2hheGUtMy4yLjEtbGludXg2NC50YXIuZ3ogfCBcCisgICAgdGFyIC1DIC91c3IvbGliL2hheGUgLS1zdHJpcC1jb21wb25lbnRzPTEgLXh6ICYmIFwKKyAgICBsbiAtcyAvdXNyL2xpYi9oYXhlL2hheGUgL3Vzci9iaW4vaGF4ZSAmJiBcCisgICAgbG4gLXMgL3Vzci9saWIvaGF4ZS9oYXhlbGliIC91c3IvYmluL2hheGVsaWIgJiYgXAorICAgIG1rZGlyIC1wIC91c3IvbGliL2hheGUvbGliICAmJiBcCisgICAgY2htb2QgLVIgNzc3IC91c3IvbGliL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIHNldHVwIC91c3IvbGliL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgaHhjcHAKKworIyBECitSVU4gY3VybCAtc1NMIGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8yLjA3MC4wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViIC1vIC90bXAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgJiYgXAorICAgIGRwa2cgLWkgL3RtcC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAmJiBcCisgICAgcm0gL3RtcC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyIG9wZW5zc2wtbWFzdGVyICYmIFwKKyAgICBlY2hvICdnY2MgLVdsLC0tbm8tYXMtbmVlZGVkICQqJyA+IC91c3IvbG9jYWwvYmluL2djYy1kbWQgJiYgXAorICAgIGNobW9kIDc1NSAvdXNyL2xvY2FsL2Jpbi9nY2MtZG1kICYmIFwKKyAgICBlY2hvICdDQz0vdXNyL2xvY2FsL2Jpbi9nY2MtZG1kJyA+PiAvZXRjL2RtZC5jb25mCisKKyMgRGFydAorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworIyBPQ2FtbAorUlVOIGVjaG8gJ2RlYiBodHRwOi8vcHBhLmxhdW5jaHBhZC5uZXQvYXZzbS9wcGEvdWJ1bnR1IHRydXN0eSBtYWluJyA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2F2c20tb2ZmaWNpYWwtb2NhbWwubGlzdCAmJiBcCisgICAgZ3BnIC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdiA2MTcwN0IwOSAmJiBcCisgICAgZ3BnIC0tZXhwb3J0IC0tYXJtb3IgNjE3MDdCMDkgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IG9jYW1sIG9wYW0gJiYgXAorICAgIG9wYW0gaW5pdCAmJiBcCisgICAgb3BhbSBpbnN0YWxsIG9hc2lzCisKKyMgRm9yY2UgdXRmOCBsb2NhbGUgdG8gc3VjY2Vzc2Z1bGx5IGJ1aWxkIEhhc2tlbGwgdGYtcmFuZG9tCitFTlYgTENfQUxMIEMuVVRGLTgKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1zdHJldGNoL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1zdHJldGNoL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzZWVjZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLXN0cmV0Y2gvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDIzMSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBEZWJpYW4gU3RyZXRjaAorIworIyBLbm93biBpc3N1ZXM6CisjIC0gZDogZGVpbW9zIGZvciBsaWJldmVudCBhbmQgb3BlbnNzbCBkaXNhYmxlZCAtIGJ1aWxkIGVycm9ycworIyAtIGRvdG5ldGNvcmUsIGJlY2F1c2UgbmV0Y29yZSBpcyBmb3IgMS4wLjAtcHJldmlldyBhbmQgMi4wLjAgaXMgb3V0CisjIC0gcnVzdDogY2FyZ28gbm90IGluIGRlYmlhbiByZXBvIC0gcGVyaGFwcyBub3QgbmVlZGVkPworCitGUk9NIGJ1aWxkcGFjay1kZXBzOnN0cmV0Y2gtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KKworRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIGFwdCBhcHQtdHJhbnNwb3J0LWh0dHBzIGN1cmwgd2dldCBhcHQtdXRpbHMKKworIyBECitSVU4gd2dldCBodHRwOi8vbWFzdGVyLmRsLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L2QtYXB0L2ZpbGVzL2QtYXB0Lmxpc3QgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZC1hcHQubGlzdCAmJiBcCisgICAgYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCAteSAtLWFsbG93LXVuYXV0aGVudGljYXRlZCBpbnN0YWxsIC0tcmVpbnN0YWxsIGQtYXB0LWtleXJpbmcKKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgJiYgXAorICAgIHNlZCAtaSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0IC1lICdzL2h0dHBzOi9odHRwOi9nJworCisjIGRvdG5ldCAoY29yZSkgMi4wLjAgLSBwcm9qZWN0IGlzbid0IHJlYWR5IGZvciB0aGlzIHlldDoKKyMgUlVOIGN1cmwgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYyB8IGdwZyAtLWRlYXJtb3IgPiAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorIyAgICAgZWNobyAiZGViIFthcmNoPWFtZDY0XSBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vcmVwb3MvbWljcm9zb2Z0LXVidW50dS14ZW5pYWwtcHJvZCB4ZW5pYWwgbWFpbiIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb3RuZXRkZXYubGlzdAorCisjIG5vZGUuanMgKHRoaXMgc3RlcCBydW5zIGFwdC1nZXQgdXBkYXRlIGludGVybmFsbHkpCitSVU4gY3VybCAtc0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vc2V0dXBfOC54IHwgYmFzaAorCisKKyMjIyBpbnN0YWxsIGdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorCisKKyMjIyBsYW5ndWFnZXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1kZXYgXAorICAgICAgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBcCisgICAgICBsaWJib29zdC1zeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRlc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRocmVhZC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkbWQtYmluIFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHhkZy11dGlscworIyBsaWJldmVudCBkZWltb3MgZGlzYWJsZWQgLSBidWlsZCBlcnJvcnMKKyMgUlVOIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyMgICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorIyAgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorIyAgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisjICAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyCisjIG9wZW5zc2wgZGVpbW9zIGRvZXNuJ3Qgd29yayB3aXRoIG9wZW5zc2wtMS4xLjAgLSBkaXNhYmxpbmcgaXQgZm9yIG5vdzoKKyMgUlVOIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisjICAgICBtdiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyMgICAgIG12IG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisjICAgICBybSAtcmYgb3BlbnNzbC1tYXN0ZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydAorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworIyBwcm9qZWN0IGlzbid0IHJlYWR5IGZvciB0aGlzIHF1aXRlIHlldDoKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIGRvdG5ldCBjb3JlIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBkb3RuZXQtc2RrLTIuMC4wCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGdvbGFuZyAoZ28pIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ29sYW5nLWdvCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldgorUlVOIGhheGVsaWIgc2V0dXAgLS1hbHdheXMgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIC0tYWx3YXlzIGh4Y3BwCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay04LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2CisjIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2x1YTUuMy8rYnVnLzE3MDcyMTIKKyMgc2FtZSBmb3IgZGViaWFuIHN0cmV0Y2gKKyMgbHVhNS4zIGRvZXMgbm90IGluc3RhbGwgYWx0ZXJuYXRpdmVzIHNvIHN0aWNrIHdpdGggNS4yIGhlcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBvY2FtbCBcCisgICAgICBvcGFtICYmIFwKKyAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwNy4wIFwKKyAgICAgIHBocDcuMC1jbGkgXAorICAgICAgcGhwNy4wLWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIHBocHVuaXQKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1iYWNrcG9ydHMuc3NsLW1hdGNoLWhvc3RuYW1lIFwKKyAgICAgIHB5dGhvbi1pcGFkZHJlc3MgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tc2l4IFwKKyAgICAgIHB5dGhvbi10b3JuYWRvIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi13aGVlbCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1zaXggXAorICAgICAgcHl0aG9uMy10b3JuYWRvIFwKKyAgICAgIHB5dGhvbjMtdHdpc3RlZCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UgJiYgXAorICAgIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCitSVU4gZ2VtIGluc3RhbGwgYnVuZGxlciAtLW5vLXJpIC0tbm8tcmRvYworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydXN0YworCisjIFVwZGF0ZSBhbnl0aGluZyBlbHNlIGxlZnQgaGFuZ2luZworUlVOIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15CisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvdWJ1bnR1LWFydGZ1bC9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC91YnVudHUtYXJ0ZnVsL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlODRkMQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvdWJ1bnR1LWFydGZ1bC9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjcwIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIFVidW50dSBBcnRmdWwKKyMgVXNpbmcgYWxsIHN0b2NrIFVidW50dSBBcnRmdWwgcGFja2FnaW5nIGV4Y2VwdCBmb3I6CisjIC0gY3BwOiBzdG9jayBib29zdCAxLjYyIGluIGFydGZ1bCBoYXMgYSBuYXN0eSBidWcgc28gd2UgdXNlIHN0b2NrIGJvb3N0IDEuNjMKKyMgLSBkOiBkbWQgZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUuIFBpbm5lZCB0byBsYXN0IDEueCByZWxlYXNlCisjIC0gZG90bmV0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gaGF4ZTogdmVyc2lvbiAzLjQuMiB0aGF0IGNvbWVzIHdpdGggVWJ1bnR1IGNvcmVzIGluIG91ciBDSSBidWlsZAorIyAtIGdvOiBhcnRmdWwgY29tZXMgd2l0aCAxLjksIHdlIHdhbnQgdGhlIGxhdGVzdCAoc3VwcG9ydGVkKQorIyAtIG5vZGVqczogd2FudCB2OCwgYXJ0ZnVsIGNvbWVzIHdpdGggdjYKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczphcnRmdWwtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIGRpcm1uZ3IgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIGNzaGFycCAobW9ubykgLSBpZiB3ZSBldmVyIHdhbnQgYSBsYXRlciB2ZXJzaW9uCisjIFJVTiBlY2hvICJkZWIgaHR0cDovL2Rvd25sb2FkLm1vbm8tcHJvamVjdC5jb20vcmVwby9kZWJpYW4geGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21vbm8ubGlzdCAmJiBcCisjICAgICBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBBNkExOUIzOEQzRDgzMUVGCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0CitFTlYgREFSVF9WRVJTSU9OIDEuMjQuMy0xCisKKyMgZG90bmV0IChuZXRjb3JlKQorUlVOIGN1cmwgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYyB8IGdwZyAtLWRlYXJtb3IgPiAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorICAgIGVjaG8gImRlYiBbYXJjaD1hbWQ2NF0gaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL3JlcG9zL21pY3Jvc29mdC11YnVudHUtYXJ0ZnVsLXByb2QgYXJ0ZnVsIG1haW4iID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZG90bmV0ZGV2Lmxpc3QKKworIyBoYXhlIChodHRwczovL2hheGUub3JnL2Rvd25sb2FkL2xpbnV4LykKK1JVTiBhZGQtYXB0LXJlcG9zaXRvcnkgcHBhOmhheGUvcmVsZWFzZXMgLXkKKworIyBub2RlLmpzCitSVU4gY3VybCAtc0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vZ3Bna2V5L25vZGVzb3VyY2UuZ3BnLmtleSB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGVjaG8gImRlYiBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ub2RlXzgueCBhcnRmdWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbm9kZXNvdXJjZS5saXN0CisKKyMjIyBpbnN0YWxsIGdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTMuOC9iaW46JFBBVEgKKworIyBib29zdC0xLjYyIGhhcyBhIHRlcnJpYmxlIGJ1ZyBpbiBib29zdDo6dGVzdCwgc2VlIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjMTAvdGlja2V0LzEyNTA3CitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0MS42My1hbGwtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworRU5WIFNCQ0xfVkVSU0lPTiAxLjQuNQorUlVOIFwKK2AjIENvbW1vbiBMaXNwIChzYmNsKSBkZXBlbmRlbmNpZXNgIFwKKyAgICBjdXJsIC0tdmVyc2lvbiAmJiBcCisgICAgY3VybCAtTyAtSiAtTCBodHRwczovL2tlbnQuZGwuc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2JjbC9zYmNsLyR7U0JDTF9WRVJTSU9OfS9zYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIgJiYgXAorICAgIHRhciB4amYgc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyICYmIFwKKyAgICBjZCBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXggJiYgXAorICAgIC4vaW5zdGFsbC5zaCAmJiBcCisgICAgc2JjbCAtLXZlcnNpb24gJiYgXAorICAgIHJtIC1yZiBzYmNsKgorCitFTlYgRF9WRVJTSU9OICAgICAyLjA4MC4wCitFTlYgRE1EX0RFQiAgICAgICBkbWRfMi4wODAuMC0wX2FtZDY0LmRlYgorUlVOIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgd2dldCAtcSBodHRwOi8vZG93bmxvYWRzLmRsYW5nLm9yZy9yZWxlYXNlcy8yLngvJHtEX1ZFUlNJT059LyR7RE1EX0RFQn0gJiYgXAorICAgIGRwa2cgLS1pbnN0YWxsICR7RE1EX0RFQn0gJiYgXAorICAgIHJtIC1mICR7RE1EX0RFQn0gJiYgXAorICAgIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlciAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBvcGVuc3NsLW1hc3RlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGAjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0PSREQVJUX1ZFUlNJT04KK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgZG90bmV0IGNvcmUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkb3RuZXQtc2RrLTIuMS40CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuMTAKK0VOViBHT0xBTkdfRE9XTkxPQURfVVJMIGh0dHBzOi8vZ29sYW5nLm9yZy9kbC9nbyRHT0xBTkdfVkVSU0lPTi5saW51eC1hbWQ2NC50YXIuZ3oKK0VOViBHT0xBTkdfRE9XTkxPQURfU0hBMjU2IGI1YTY0MzM1ZjE0OTAyNzdiNTg1ODMyZDFmNmM3ZjhjNmMxMTIwNmNiYTVjZDNmNzcxZGNiODdiOThhZDFhMzMKK1JVTiBjdXJsIC1mc1NMICIkR09MQU5HX0RPV05MT0FEX1VSTCIgLW8gZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBlY2hvICIkR09MQU5HX0RPV05MT0FEX1NIQTI1NiAgZ29sYW5nLnRhci5neiIgfCBzaGEyNTZzdW0gLWMgLSAmJiBcCisgICAgICAgICAgICB0YXIgLUMgL3Vzci9sb2NhbCAteHpmIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgICAgICAgICAgICAgbG4gLXMgL3Vzci9sb2NhbC9nby9iaW4vZ28gL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgcm0gZ29sYW5nLnRhci5negorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBoYXhlIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYgJiYgXAorICAgIGhheGVsaWIgc2V0dXAgLS1hbHdheXMgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIC0tYWx3YXlzIGh4Y3BwIDI+JjEgPiAvZGV2L251bGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTgtamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMhCisjIG5lZWQgdG8gdXBkYXRlIG91ciBsdWFzb2NrZXQgY29kZSwgbHVhIGRvZXNuJ3QgaGF2ZSBsdWFMX29wZW5saWIgYW55IG1vcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKKyMgVGVzdCBkZXBlbmRlbmNpZXMgZm9yIHJ1bm5pbmcgcHVwcGV0ZWVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEpTIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGlieHNzMQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorICAgICAgb2NhbWwgXAorICAgICAgb3BhbSAmJiBcCisgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocCBcCisgICAgICBwaHAtY2xpIFwKKyAgICAgIHBocC1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBjb21wb3NlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSAmJiBcCisgICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbjMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtcGlwIFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjYXJnbyBcCisgICAgICBydXN0YworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFN0YXRpYyBDb2RlIEFuYWx5c2lzIGRlcGVuZGVuY2llc2AgXAorICAgICAgY3BwY2hlY2sgXAorICAgICAgc2xvY2NvdW50ICYmIFwKKyAgICBwaXAgaW5zdGFsbCBmbGFrZTgKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL3VidW50dS10cnVzdHkvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU0ZDNiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyNDQgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgVWJ1bnR1IFRydXN0eQorIyBVc2luZyBhbGwgc3RvY2sgVWJ1bnR1IFRydXN0eSBwYWNrYWdpbmcgZXhjZXB0IGZvcjoKKyMgLSBkOiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1IHNvIHdlJ3JlIGluc3RhbGxpbmcgMi4wNzAuMAorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAxLjIwLjEKKyMgLSBkb3RuZXRjb3JlLCBkaXNhYmxlZCBiZWNhdXNlIG5ldGNvcmUgaXMgZm9yIDEuMC4wLXByZXZpZXcgYW5kIDIuMC4wIGlzIG91dAorIyAtIGhheGUsIGRpc2FibGVkIGJlY2F1c2UgdGhlIGRpc3RybyBjb21lcyB3aXRoIDMuMC4wIGFuZCBpdCBjb3JlcyB3aGlsZSBpbnN0YWxsaW5nCisjIC0gbm9kZS5qcywgZGlzYWJsZWQgYmVjYXVzZSBpdCBpcyBhdCAwLjEwLjAgaW4gdGhlIGRpc3RybyB3aGljaCBpcyB0b28gb2xkIChuZWVkIDQrKQorIyAtIG9jYW1sLCBkaXNhYmxlZCBiZWNhdXNlIGl0IGZhaWxzIHRvIGluc3RhbGwgcHJvcGVybHkKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczp0cnVzdHktc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIGRpcm1uZ3IgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIEQKK1JVTiBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBFQkNGOTc1RTVCQTI0RDVFICYmIFwKKyAgICAgICAgd2dldCBodHRwOi8vbWFzdGVyLmRsLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L2QtYXB0L2ZpbGVzL2QtYXB0Lmxpc3QgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZC1hcHQubGlzdCAmJiBcCisgICAgICAgIHdnZXQgLXFPIC0gaHR0cHM6Ly9kbGFuZy5vcmcvZC1rZXlyaW5nLmdwZyB8IGFwdC1rZXkgYWRkIC0KKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgICAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiBcCisgICAgICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdAorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTMuOC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1hbGwtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG1kLWJpbj0yLjA3MC4yLTAgXAorICAgICAgbGlicGhvYm9zMi1kZXY9Mi4wNzAuMi0wIFwKKyAgICAgIGR1YiBcCisgICAgICBkZm10IFwKKyAgICAgIGRzY2FubmVyIFwKKyAgICAgIHhkZy11dGlscworUlVOIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlcgorUlVOIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgb3BlbnNzbC1tYXN0ZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydD0xLjIwLjEtMQorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKKyMgZ29sYW5nCitFTlYgR09MQU5HX1ZFUlNJT04gMS43LjYKK0VOViBHT0xBTkdfRE9XTkxPQURfVVJMIGh0dHBzOi8vZ29sYW5nLm9yZy9kbC9nbyRHT0xBTkdfVkVSU0lPTi5saW51eC1hbWQ2NC50YXIuZ3oKK0VOViBHT0xBTkdfRE9XTkxPQURfU0hBMjU2IGFkNTgwOGJmNDJiMDE0YzIyZGQ3NjQ2NDU4ZjYzMTM4NTAwMzA0OWRlZDBiYjZhZjJlZmM3ZjFmNzlmYTI5ZWEKK1JVTiBjdXJsIC1mc1NMICIkR09MQU5HX0RPV05MT0FEX1VSTCIgLW8gZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBlY2hvICIkR09MQU5HX0RPV05MT0FEX1NIQTI1NiAgZ29sYW5nLnRhci5neiIgfCBzaGEyNTZzdW0gLWMgLSAmJiBcCisgICAgICB0YXIgLUMgL3Vzci9sb2NhbCAteHpmIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgbG4gLXMgL3Vzci9sb2NhbC9nby9iaW4vZ28gL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgICAgcm0gZ29sYW5nLnRhci5negorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbAorCisjIGRpc2FibGVkIGJlY2F1c2UgaXQgY29yZXMgd2hpbGUgaW5zdGFsbGluZworIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyMgICAgICAgaGF4ZSBcCisjICAgICAgIG5la28gXAorIyAgICAgICBuZWtvLWRldiAmJiBcCisjICAgICBoYXhlbGliIHNldHVwIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorIyAgICAgaGF4ZWxpYiBpbnN0YWxsIGh4Y3BwIDMuMi4xMDIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTctamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4xIFwKKyAgICAgIGx1YTUuMS1kZXYKKworIyBkaXNhYmxlZCBiZWNhdXNlIGl0IGlzIHRvbyBvbGQKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIG5vZGVqcyBcCisjICAgICAgIG5wbQorCisjIGRpc2FibGVkIGJlY2F1c2UgaXQgZmFpbHMgdG8gaW5zdGFsbCBwcm9wZXJseQorIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIG9jYW1sIFwKKyMgICAgICAgb3BhbSAmJiBcCisjICAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorIyAgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHA1IFwKKyAgICAgIHBocDUtY2xpIFwKKyAgICAgIHBocDUtZGV2IFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgJiYgXAorICAgICAgd2dldCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9pbnN0YWxsZXIgLU8gLSAtcSB8IHBocCAtLSAtLXF1aWV0IC0taW5zdGFsbC1kaXI9L3Vzci9sb2NhbC9iaW4vIC0tZmlsZW5hbWU9Y29tcG9zZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1waXAgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZSAmJiBcCisgICAgcGlwIGluc3RhbGwgLVUgaXBhZGRyZXNzIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbyAmJiBcCisgICAgcGlwMyBpbnN0YWxsIC1VIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbworIyBpbnN0YWxsaW5nIHRvcm5hZG8gYnkgcGlwL3BpcDMgaW5zdGVhZCBvZiBkZWJpYW4gcGFja2FnZQorIyBpZiB3ZSBpbnN0YWxsIHRoZSBkZWJpYW4gcGFja2FnZSwgdGhlIGJ1aWxkIGZhaWxzIGluIHB5MgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorUlVOIGdlbSBpbnN0YWxsIGJ1bmRsZXIgLS1uby1yaSAtLW5vLXJkb2MKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdXN0IGRlcGVuZGVuY2llc2AgXAorICAgICAgY2FyZ28gXAorICAgICAgcnVzdGMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBTdGF0aWMgQ29kZSBBbmFseXNpcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNwcGNoZWNrIFwKKyAgICAgIHNsb2Njb3VudCAmJiBcCisgICAgcGlwIGluc3RhbGwgZmxha2U4CisKKyMgSW5zdGFsbCBCb3VuY3lDYXN0bGUgcHJvdmlkZXIgdG8gZml4IEphdmEgYnVpbGRzIGlzc3VlcyB3aXRoIEpESyA3CisjIEJ1aWxkcyBhY2Nlc3NpbmcgcmVwb3RlIHJlcG9zaXRvcmllcyBmYWlsIGFzIHNlZW4gaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL3RyYXZpcy1jaS90cmF2aXMtY2kvaXNzdWVzLzg1MDMKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQm91bmN5Q2FzdGxlIEpDRSBQcm92aWRlciBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJjcHJvdi1qYXZhICYmIFwKKyAgICBsbiAtcyAvdXNyL3NoYXJlL2phdmEvYmNwcm92LmphciAvdXNyL2xpYi9qdm0vamF2YS03LW9wZW5qZGstYW1kNjQvanJlL2xpYi9leHQvYmNwcm92LmphciAmJiBcCisgICAgYXdrIC1GIC4gLXYgT0ZTPS4gJ0JFR0lOe249Mn0vXnNlY3VyaXR5XC5wcm92aWRlci8ge3NwbGl0KCQzLCBwb3NBbmRFcXVhbHMsICI9Iik7JDM9bisrIj0icG9zQW5kRXF1YWxzWzJdO3ByaW50O25leHR9IDEnIC9ldGMvamF2YS03LW9wZW5qZGsvc2VjdXJpdHkvamF2YS5zZWN1cml0eSA+IC90bXAvamF2YS5zZWN1cml0eSAmJiBcCisgIGVjaG8gInNlY3VyaXR5LnByb3ZpZGVyLjE9b3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuQm91bmN5Q2FzdGxlUHJvdmlkZXIiID4+IC90bXAvamF2YS5zZWN1cml0eSAmJiBcCisgIG12IC90bXAvamF2YS5zZWN1cml0eSAvZXRjL2phdmEtNy1vcGVuamRrL3NlY3VyaXR5L2phdmEuc2VjdXJpdHkKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3JlZnJlc2guc2ggYi9idWlsZC9kb2NrZXIvcmVmcmVzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wOGNiYzkxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3JlZnJlc2guc2gKQEAgLTAsMCArMSw4MiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIFRoZSBidWlsZCBoYXMgdHdvIHN0YWdlczogImRvY2tlciIgYW5kICJ0ZXN0IgorIyBUaGUgImRvY2tlciIgc3RhZ2UgaXMgbWVhbnQgdG8gcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlcworIyAgIGlmIG5lZWRlZC4gIElmIHdlIGNhbm5vdCBwdXNoIHRoYXQgcmVzdWx0IGhvd2V2ZXIgdGhlbgorIyAgIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBkbyBhbnl0aGluZy4KKyMgVGhlICJ0ZXN0IiBzdGFnZSBpcyBhbiBhY3R1YWwgdGVzdCBqb2IuICBFdmVuIGlmIHRoZSBkb2NrZXIKKyMgICBpbWFnZSBkb2Vzbid0IG1hdGNoIHdoYXQncyBpbiB0aGUgcmVwbywgd2Ugc3RpbGwgYnVpbGQKKyMgICB0aGUgaW1hZ2Ugc28gdGhlIGJ1aWxkIGpvYiBjYW4gcnVuIHByb3Blcmx5LgorIworCitzZXQgLWUKKworU0NSSVBUX0RJUj0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgorRE9DS0VSX1RBRz0kRE9DS0VSX1JFUE86JERJU1RSTworCitmdW5jdGlvbiBkb2NrZXJmaWxlX2NoYW5nZWQgeworICAjIGltYWdlIG1heSBub3QgZXhpc3QgeWV0LCBzbyB3ZSBoYXZlIHRvIGxldCBpdCBmYWlsIHNpbGVudGx5OgorICBkb2NrZXIgcHVsbCAkRE9DS0VSX1RBRyB8fCB0cnVlCisgIGRvY2tlciBydW4gJERPQ0tFUl9UQUcgYmFzaCAtYyAnY2QgLi4gJiYgc2hhNTEyc3VtIERvY2tlcmZpbGUnID4gLkRvY2tlcmZpbGUuc2hhNTEyCisgIHNoYTUxMnN1bSAtYyAuRG9ja2VyZmlsZS5zaGE1MTIKK30KKworIworIyBJZiB0aGlzIGJ1aWxkIGhhcyBubyBET0NLRVJfUEFTUyBhbmQgaXQgaXMgaW4gdGhlIGRvY2tlciBzdGFnZQorIyB0aGVuIHRoZXJlJ3Mgbm8gcmVhc29uIHRvIGRvIGFueSBwcm9jZXNzaW5nIGJlY2F1c2Ugd2UgY2Fubm90CisjIHB1c2ggdGhlIHJlc3VsdCBpZiB0aGUgRG9ja2VyZmlsZSBjaGFuZ2VkLiAgCisjCisKK2lmIFtbICIkVFJBVklTX0JVSUxEX1NUQUdFIiA9PSAiZG9ja2VyIiBdXSAmJiBbWyAteiAiJERPQ0tFUl9QQVNTIiBdXTsgdGhlbgorICBlY2hvIERldGVjdGVkIGRvY2tlciBzdGFnZSBidWlsZCBhbmQgbm8gZGVmaW5lZCBET0NLRVJfUEFTUywgdGhpcyBidWlsZCBqb2Igd2lsbCBiZSBza2lwcGVkLgorICBlY2hvIFN1YnNlcXVlbnQgam9icyBpbiB0aGUgdGVzdCBzdGFnZSBtYXkgZWFjaCByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UuCisgIGV4aXQgMAorZmkKKworCitwdXNoZCAke1NDUklQVF9ESVJ9LyRESVNUUk8KK2lmIGRvY2tlcmZpbGVfY2hhbmdlZDsgdGhlbgorICBlY2hvIERvY2tlcmZpbGUgaGFzIG5vdCBjaGFuZ2VkLiAgTm8gbmVlZCB0byByZWJ1aWxkLgorICBleGl0IDAKK2Vsc2UKKyAgZWNobyBEb2NrZXJmaWxlIGhhcyBjaGFuZ2VkLgorZmkKK3BvcGQKKworIworIyBEb2NrZXJmaWxlIGhhcyBjaGFuZ2VkIC0gcmVidWlsZCBpdCBmb3IgdGhlIGN1cnJlbnQgYnVpbGQgam9iLgorIyBJZiBpdCBpcyBhICJkb2NrZXIiIHN0YWdlIGJ1aWxkIHRoZW4gd2Ugd2FudCB0byBwdXNoIGl0IGJhY2sKKyMgdG8gdGhlIERPQ0tFUl9SRVBPLiAgSWYgaXQgaXMgYSAidGVzdCIgc3RhZ2UgYnVpbGQgdGhlbiB3ZSBkbworIyBub3QuICBJZiBub2JvZHkgZGVmaW5lZCBhIERPQ0tFUl9QQVNTIHRoZW4gaXQgZG9lc24ndCBtYXR0ZXIuCisjCisKK2VjaG8gUmVidWlsZGluZyBkb2NrZXIgaW1hZ2UgJERJU1RSTworZG9ja2VyIGJ1aWxkIC0tdGFnICRET0NLRVJfVEFHIGJ1aWxkL2RvY2tlci8kRElTVFJPCisKK2lmIFtbICIkVFJBVklTX0JVSUxEX1NUQUdFIiA9PSAiZG9ja2VyIiBdXSAmJiBbWyAhIC16ICIkRE9DS0VSX1VTRVIiIF1dICYmIFtbICEgLXogIiRET0NLRVJfUEFTUyIgXV07IHRoZW4gCisgIGVjaG8gUHVzaGluZyBkb2NrZXIgaW1hZ2UgJERPQ0tFUl9UQUcKKyAgZG9ja2VyIGxvZ2luIC11ICRET0NLRVJfVVNFUiAtcCAkRE9DS0VSX1BBU1MKKyAgZG9ja2VyIHB1c2ggJERPQ0tFUl9UQUcKK2Vsc2UKKyAgZWNobyBOb3QgcHVzaGluZyBkb2NrZXIgaW1hZ2U6IGVpdGhlciBub3QgYSBkb2NrZXIgc3RhZ2UgYnVpbGQgam9iLCBvciBvbmUgb2YgRE9DS0VSX1VTRVIgb3IgRE9DS0VSX1BBU1MgaXMgdW5kZWZpbmVkLgorZmkKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3J1bi5zaCBiL2J1aWxkL2RvY2tlci9ydW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWZlMTlkNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9ydW4uc2gKQEAgLTAsMCArMSwzMCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXQgLWUKKworU0NSSVBUX0RJUj0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgorRE9DS0VSX1RBRz0kRE9DS0VSX1JFUE86JERJU1RSTworCitwcmludGVudiB8IHNvcnQKKworZG9ja2VyIHJ1biAtLW5ldD1ob3N0IC1lIEJVSUxEX0xJQlM9IiRCVUlMRF9MSUJTIiAkQlVJTERfRU5WIC12ICQocHdkKTovdGhyaWZ0L3NyYyBcCisJLWl0ICRET0NLRVJfVEFHIGJ1aWxkL2RvY2tlci9zY3JpcHRzLyRTQ1JJUFQgJEJVSUxEX0FSRworCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODM4OGY3MgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaApAQCAtMCwwICsxLDYgQEAKKyMhL2Jpbi9zaAorc2V0IC1ldgorCisuL2Jvb3RzdHJhcC5zaAorLi9jb25maWd1cmUgJCoKK21ha2UgY2hlY2sgLWozCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NtYWtlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViMzg0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaApAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworQ01BS0VfRkxBR1M9JCoKK01BS0VQUk9HPW1ha2UKKworaWYgbmluamEgLS12ZXJzaW9uICA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgTUFLRVBST0c9bmluamEKKyAgQ01BS0VfRkxBR1M9Ii1HTmluamEgJENNQUtFX0ZMQUdTIgorZmkKKworbWtkaXIgLXAgY21ha2VfYnVpbGQgJiYgY2QgY21ha2VfYnVpbGQKK2NtYWtlICRDTUFLRV9GTEFHUyAuLgorZm9yIExJQiBpbiAkQlVJTERfTElCUzsgZG8KKyAgaWYgISBncmVwICJeQlVJTERfJHtMSUJ9OkJPT0w9T04kIiBDTWFrZUNhY2hlLnR4dCA7IHRoZW4KKyAgICBlY2hvICJmYWlsZWQgdG8gY29uZmlndXJlICRMSUIiCisgICAgZXhpdCAxCisgIGZpCitkb25lCiskTUFLRVBST0cgLWozCitjcGFjaworY3Rlc3QgLVZWCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9jb3ZzY2FuLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY292c2Nhbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYjNmMjgzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY292c2Nhbi5zaApAQCAtMCwwICsxLDUwIEBACisjCisjIENvdmVyaXR5IFNjYW4gVHJhdmlzIGJ1aWxkIHNjcmlwdAorIyBUbyBydW4gdGhpcyBpbnRlcmFjdGl2ZWx5LCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB5b3Vyc2VsZiwKKyMgYW5kIHJ1biB0aGlzIGluc2lkZSBhIGRvY2tlciBjb250YWluZXIuCisjCisjIENvbW1hbmQtTGluZSBBcmd1bWVudHMKKyMKKyMgLS1za2lwZG93bmxvYWQgICB0byBza2lwIHJlLWRvd25sb2FkaW5nIHRoZSBDb3Zlcml0eSBTY2FuIGJ1aWxkIHBhY2thZ2UgKGxhcmdlKQorIworIyBFbnZpcm9ubWVudCBWYXJpYWJsZXMgKHJlcXVpcmVkKQorIworIyBDT1ZFUklUWV9TQ0FOX05PVElGSUNBVElPTl9FTUFJTCAgLSBlbWFpbCBhZGRyZXNzIHRvIG5vdGlmeQorIyBDT1ZFUklUWV9TQ0FOX1RPS0VOICAgICAgICAgICAgICAgLSB0aGUgQ292ZXJpdHkgU2NhbiB0b2tlbiAoc2hvdWxkIGJlIHNlY3VyZSkKKyMKKyMgRW52aXJvbm1lbnQgVmFyaWFibGVzIChkZWZhdWx0ZWQpCisjCisjIENPVkVSSVRZX1NDQU5fQlVJTERfQ09NTUFORCAgICAgICAtIGRlZmF1bHRzIHRvICJidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2giCisjIENPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT04gICAgICAgICAtIGRlZmF1bHRzIHRvIFRSQVZJU19CUkFOQ0ggb3IgIm1hc3RlciIgaWYgZW1wdHkKKyMgQ09WRVJJVFlfU0NBTl9QUk9KRUNUICAgICAgICAgICAgIC0gZGVmYXVsdHMgdG8gInRocmlmdCIKKworc2V0IC1leAorCitDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQ9JHtDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQ6LWJ1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaH0KK0NPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT049JHtDT1ZFUklUWV9TQ0FOX0RFU0NSSVBUSU9OOi0ke1RSQVZJU19CUkFOQ0g6LW1hc3Rlcn19CitDT1ZFUklUWV9TQ0FOX1BST0pFQ1Q9JHtDT1ZFUklUWV9TQ0FOX1BST0pFQ1Q6LXRocmlmdH0KKworIyBkb3dubG9hZCB0aGUgY292ZXJpdHkgc2NhbiBwYWNrYWdlCisKK3B1c2hkIC90bXAKK2lmIFtbICIkMSIgIT0gIi0tc2tpcGRvd25sb2FkIiBdXTsgdGhlbgorICBybSAtcmYgY292ZXJpdHlfdG9vbC50Z3ogY292LWFuYWx5c2lzKgorICB3Z2V0IGh0dHBzOi8vc2Nhbi5jb3Zlcml0eS5jb20vZG93bmxvYWQvbGludXg2NCAtLXBvc3QtZGF0YSAidG9rZW49JENPVkVSSVRZX1NDQU5fVE9LRU4mcHJvamVjdD0kQ09WRVJJVFlfU0NBTl9QUk9KRUNUIiAtTyBjb3Zlcml0eV90b29sLnRnegorICB0YXIgeHpmIGNvdmVyaXR5X3Rvb2wudGd6CitmaQorQ09WQklOPSQoZWNobyAkKHB3ZCkvY292LWFuYWx5c2lzKi9iaW4pCitleHBvcnQgUEFUSD0kQ09WQklOOiRQQVRICitwb3BkCisKKyMgYnVpbGQgdGhlIHByb2plY3Qgd2l0aCBjb3Zlcml0eSBzY2FuCisKK3JtIC1yZiBjb3YtaW50LworY292LWJ1aWxkIC0tZGlyIGNvdi1pbnQgJENPVkVSSVRZX1NDQU5fQlVJTERfQ09NTUFORAordGFyIGNKZiBjb3YtaW50LnRhci54eiBjb3YtaW50LworY3VybCAtLWZvcm0gdG9rZW49IiRDT1ZFUklUWV9TQ0FOX1RPS0VOIiBcCisgICAgIC0tZm9ybSBlbWFpbD0iJENPVkVSSVRZX1NDQU5fTk9USUZJQ0FUSU9OX0VNQUlMIiBcCisgICAgIC0tZm9ybSBmaWxlPUBjb3YtaW50LnRhci54eiBcCisgICAgIC0tZm9ybSB2ZXJzaW9uPSIkKGdpdCBkZXNjcmliZSAtLXRhZ3MpIiBcCisgICAgIC0tZm9ybSBkZXNjcmlwdGlvbj0iJENPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT04iIFwKKyAgICAgaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9idWlsZHM/cHJvamVjdD0iJENPVkVSSVRZX1NDQU5fUFJPSkVDVCIKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY3Jvc3MtdGVzdC5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Nyb3NzLXRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDM1ODFhNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Nyb3NzLXRlc3Quc2gKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL3NoCitzZXQgLWV2CisKKy4vYm9vdHN0cmFwLnNoCisuL2NvbmZpZ3VyZSAtLWVuYWJsZS10dXRvcmlhbD1ubworbWFrZSAtajMgcHJlY3Jvc3MKKworc2V0ICtlCittYWtlIGNyb3NzJDEKKworUkVUPSQ/CitpZiBbICRSRVQgLW5lIDAgXTsgdGhlbgorICBjYXQgdGVzdC9sb2cvdW5leHBlY3RlZF9mYWlsdXJlcy5sb2cKK2ZpCisKK2V4aXQgJFJFVApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvZHBrZy5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Rwa2cuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2JhMGNkNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Rwa2cuc2gKQEAgLTAsMCArMSw1IEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworZHBrZy1idWlsZHBhY2thZ2UgLXRjIC11cyAtdWMKK2xzIC1hbCAuLgpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvbWFrZS1kaXN0LnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvbWFrZS1kaXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVhMzY4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9tYWtlLWRpc3Quc2gKQEAgLTAsMCArMSw5IEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworLi9ib290c3RyYXAuc2gKKy4vY29uZmlndXJlICQqCittYWtlIGRpc3QKK3RhciB4dmYgdGhyaWZ0LSoudGFyLmd6CitjZCB0aHJpZnQtKgorLi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvc2NhLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvc2NhLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQyMTI4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9zY2Euc2gKQEAgLTAsMCArMSw1OCBAQAorIyEvYmluL2Jhc2gKK3NldCAtZXYKKworIworIyBHZW5lcmF0ZSB0aHJpZnQgZmlsZXMgc28gdGhlIHN0YXRpYyBjb2RlIGFuYWx5c2lzIGluY2x1ZGVzIGFuIGFuYWx5c2lzCisjIG9mIHRoZSBmaWxlcyB0aGUgdGhyaWZ0IGNvbXBpbGVyIHNwaXRzIG91dC4gIElmIHJ1bm5pbmcgaW50ZXJhY3RpdmVseQorIyBzZXQgdGhlIE5PQlVJTEQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gc2tpcCB0aGUgYm9vdC9jb25maWcvbWFrZSBwaGFzZS4KKyMKKworaWYgW1sgLXogIiROT0JVSUxEIiBdXTsgdGhlbgorICAuL2Jvb3RzdHJhcC5zaAorICAuL2NvbmZpZ3VyZSAtLWVuYWJsZS10dXRvcmlhbD1ubworICBtYWtlIC1qMyBwcmVjcm9zcworZmkKKworIworIyBDL0MrKyBzdGF0aWMgY29kZSBhbmFseXNpcyB3aXRoIGNwcGNoZWNrCisjIGFkZCAtLWVycm9yLWV4aXRjb2RlPTEgdG8gLS1lbmFibGU9YWxsIGFzIHNvb24gYXMgZXZlcnl0aGluZyBpcyBmaXhlZAorIworIyBQeXRob24gY29kZSBzdHlsZSBjaGVjayB3aXRoIGZsYWtlOAorIworIyBzZWFyY2ggZm9yIFRPRE8gZXRjIHdpdGhpbiBzb3VyY2UgdHJlZQorIyBzb21lIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGNvZGUgYmFzZQorIyBzb21lIGluZm8gYWJvdXQgdGhlIGJ1aWxkIG1hY2hpbmUKKworIyBDb21waWxlciBjcHBjaGVjayAoQWxsKQorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgY29tcGlsZXIvY3BwL3NyYworCisjIEMrKyBjcHBjaGVjayAoQWxsKQorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgbGliL2NwcC9zcmMgbGliL2NwcC90ZXN0IHRlc3QvY3BwIHR1dG9yaWFsL2NwcAorCisjIEMgR2xpYiBjcHBjaGVjayAoQWxsKQorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgbGliL2NfZ2xpYi9zcmMgbGliL2NfZ2xpYi90ZXN0IHRlc3QvY19nbGliL3NyYyB0dXRvcmlhbC9jX2dsaWIKKworIyBTaWxlbnQgZXJyb3IgY2hlY2tzCisjIFNlZSBUSFJJRlQtNDM3MSA6IGZsZXggZ2VuZXJhdGVkIGNvZGUgdHJpZ2dlcnMgInBvc3NpYmxlIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSIgaW4geXlfaW5pdF9idWZmZXIKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLXN1cHByZXNzPSIqOnRocmlmdC90aHJpZnRsLmNjIiAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGNvbXBpbGVyL2NwcC9zcmMKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGxpYi9jcHAvc3JjIGxpYi9jcHAvdGVzdCB0ZXN0L2NwcCB0dXRvcmlhbC9jcHAKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGxpYi9jX2dsaWIvc3JjIGxpYi9jX2dsaWIvdGVzdCB0ZXN0L2NfZ2xpYi9zcmMgdHV0b3JpYWwvY19nbGliCisKKyMgUHl0aG9uIGNvZGUgc3R5bGUKK2ZsYWtlOAorCisjIFBIUCBjb2RlIHN0eWxlCitjb21wb3NlciBpbnN0YWxsIC0tcXVpZXQKKy4vdmVuZG9yL2Jpbi9waHBjcworCisjIFRPRE8gZXRjCitlY2hvIEZJWE1FczogYGdyZXAgLXIgRklYTUUgKiB8IHdjIC1sYAorZWNobyAgSEFDS3M6IGBncmVwIC1yIEhBQ0sgKiB8IHdjIC1sYAorZWNobyAgVE9ET3M6IGBncmVwIC1yIFRPRE8gKiB8IHdjIC1sYAorCisjIExvQworc2xvY2NvdW50IC4KKworIyBTeXN0ZW0gSW5mbworZHBrZyAtbAordW5hbWUgLWEKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL3Vic2FuLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvdWJzYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjUwZGJhMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL3Vic2FuLnNoCkBAIC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9zaAorCitzZXQgLWUKKworIyBXcmFwcyBhdXRvdG9vbHMuc2gsIGJ1dCBlYWNoIGJpbmFyeSBjcmFzaGVzIGlmIGl0IGV4aGliaXRzIHVuZGVmaW5lZCBiZWhhdmlvci4gCisjIFNldCB0aGUgdW5kZWZpbmVkIGJlaGF2aW9yIGZsYWdzLiBUaGlzIGNyYXNoZXMgb24gYWxsIHVuZGVmaW5lZCBiZWhhdmlvciBleGNlcHQgZm9yCisjIHVuZGVmaW5lZCBjYXN0aW5nLCBha2EgInZwdHIiLgorIyBUT0RPOiBmaXggdW5kZWZpbmVkIHZwdHIgYmVoYXZpb3IgYW5kIHR1cm4gdGhpcyBvcHRpb24gYmFjayBvbi4KKworZXhwb3J0IENGTEFHUz0iLWZzYW5pdGl6ZT11bmRlZmluZWQgLWZuby1zYW5pdGl6ZS1yZWNvdmVyPXVuZGVmaW5lZCAtTzAgLWdnZGIzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIgorZXhwb3J0IENYWEZMQUdTPSIke0NGTEFHU30iCitleHBvcnQgTERGTEFHUz0iLWx1YnNhbiIKK2V4cG9ydCBVQlNBTl9PUFRJT05TPXByaW50X3N0YWNrdHJhY2U9MQorCisjCisjIHdvcmsgYXJvdW5kIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjMTAvdGlja2V0LzExNjMyIGlmIHByZXNlbnQKKyMKKworc2VkIC1pICdzLywgc3RyZWFtX3QocmRidWYoKSkgLywgc3RyZWFtX3QocGJhc2VfdHlwZTo6bWVtYmVyLmdldCgpKS9nJyAvdXNyL2luY2x1ZGUvYm9vc3QvZm9ybWF0L2FsdF9zc3RyZWFtLmhwcAorCisjIGxsdm0tc3ltYm9saXplciBtdXN0IGJlIG9uIFBBVEggdG8gZ2V0IGEgc3RhY2sgdHJhY2Ugb24gZXJyb3IKKworQ0xBTkdfUEFUSD0iJChta3RlbXAgLWQpIgordHJhcCAicm0gLXJmICR7Q0xBTkdfUEFUSH0iIEVYSVQKK2xuIC1zICIkKHdoZXJlaXMgbGx2bS1zeW1ib2xpemVyLTQuMCAgfCByZXYgfCBjdXQgLWQgJyAnIC1mIDEgfCByZXYpIiBcCisgICIke0NMQU5HX1BBVEh9L2xsdm0tc3ltYm9saXplciIKK2V4cG9ydCBQQVRIPSIke0NMQU5HX1BBVEh9OiR7UEFUSH0iCitsbHZtLXN5bWJvbGl6ZXIgLXZlcnNpb24KKworYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoICQqCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvdWJ1bnR1LWJpb25pYy9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGVkMzE3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDI5MCBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBVYnVudHUgQmlvbmljCisjIFVzaW5nIGFsbCBzdG9jayBVYnVudHUgQmlvbmljIHBhY2thZ2luZyBleGNlcHQgZm9yOgorIyAtIGNsOiB3YW50IGxhdGVzdAorIyAtIGQ6IGRtZCBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZGFydDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dSAtIHdlIHVzZSAyLnggaGVyZQorIyAtIGRvdG5ldDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGdvOiB3YW50IGxhdGVzdAorIyAtIG5vZGVqczogd2FudCB2OCwgYmlvbmljIGNvbWVzIHdpdGggdjYKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczpiaW9uaWMtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIGRpcm1uZ3IgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIGNzaGFycCAobW9ubykgLSBpZiB3ZSBldmVyIHdhbnQgYSBsYXRlciB2ZXJzaW9uCisjIFJVTiBlY2hvICJkZWIgaHR0cDovL2Rvd25sb2FkLm1vbm8tcHJvamVjdC5jb20vcmVwby9kZWJpYW4geGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21vbm8ubGlzdCAmJiBcCisjICAgICBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBBNkExOUIzOEQzRDgzMUVGCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0CisKKyMgZG90bmV0IChuZXRjb3JlKQorUlVOIGN1cmwgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYyB8IGdwZyAtLWRlYXJtb3IgPiAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorICAgIHdnZXQgLXEgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbWljcm9zb2Z0LXByb2QubGlzdCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vY29uZmlnL3VidW50dS8xOC4wNC9wcm9kLmxpc3QgJiYgXAorICAgIGNob3duIHJvb3Q6cm9vdCAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorICAgIGNob3duIHJvb3Q6cm9vdCAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9taWNyb3NvZnQtcHJvZC5saXN0CisKKyMgbm9kZS5qcworUlVOIGN1cmwgLXNMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL2dwZ2tleS9ub2Rlc291cmNlLmdwZy5rZXkgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBlY2hvICJkZWIgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vbm9kZV84LnggYmlvbmljIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL25vZGVzb3VyY2UubGlzdAorCisjIyMgaW5zdGFsbCBnZW5lcmFsIGRlcGVuZGVuY2llcworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmFzaC1jb21wbGV0aW9uIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbWFrZSBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBnZGIgXAorICAgICAgbGliYXNvdW5kMiBcCisgICAgICBsaWJhdGstYnJpZGdlMi4wLTAgXAorICAgICAgbGliZ3RrLTMtMCBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdW56aXAgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTYuMC9iaW46JFBBVEgKKworIyBsaWIvYXMzIChBY3Rpb25TY3JpcHQpCitSVU4gbWtkaXIgLXAgL3Vzci9sb2NhbC9hZG9iZS9mbGV4LzQuNiAmJiBcCisgICAgY2QgL3Vzci9sb2NhbC9hZG9iZS9mbGV4LzQuNiAmJiBcCisgICAgd2dldCAtcSAiaHR0cDovL2Rvd25sb2FkLm1hY3JvbWVkaWEuY29tL3B1Yi9mbGV4L3Nkay9mbGV4X3Nka180LjYuemlwIiAmJiBcCisgICAgdW56aXAgZmxleF9zZGtfNC42LnppcAorRU5WIEZMRVhfSE9NRSAvdXNyL2xvY2FsL2Fkb2JlL2ZsZXgvNC42CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtYWxsLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGNzaGFycCAobW9ubykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtb25vLWRldmVsCisKK0VOViBTQkNMX1ZFUlNJT04gMS40LjE1CitSVU4gXAorYCMgQ29tbW9uIExpc3AgKHNiY2wpIGRlcGVuZGVuY2llc2AgXAorICAgIGN1cmwgLS12ZXJzaW9uICYmIFwKKyAgICBjdXJsIC1vIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6MiAtSiAtTCBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9zYmNsL2ZpbGVzL3NiY2wvJHtTQkNMX1ZFUlNJT059L3NiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6Mi9kb3dubG9hZD91c2VfbWlycm9yPW1hbmFnZWR3YXkjICYmIFwKKyAgICB0YXIgeGpmIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6MiAmJiBcCisgICAgY2Qgc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4ICYmIFwKKyAgICAuL2luc3RhbGwuc2ggJiYgXAorICAgIHNiY2wgLS12ZXJzaW9uICYmIFwKKyAgICBjZCAuLiAmJiBcCisgICAgcm0gLXJmIHNiY2wqCisKK0VOViBEX1ZFUlNJT04gICAgIDIuMDgzLjEKK0VOViBETURfREVCICAgICAgIGRtZF8yLjA4My4xLTBfYW1kNjQuZGViCitSVU4gXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICB3Z2V0IC1xIGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8ke0RfVkVSU0lPTn0vJHtETURfREVCfSAmJiBcCisgICAgZHBrZyAtLWluc3RhbGwgJHtETURfREVCfSAmJiBcCisgICAgcm0gLWYgJHtETURfREVCfSAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIGdpdCBjbG9uZSAtYiAndjIuMC4yKzIuMC4xNicgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50LmdpdCBkZWltb3MtbGliZXZlbnQtMi4wICYmIFwKKyAgICBtdiBkZWltb3MtbGliZXZlbnQtMi4wL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGRlaW1vcy1saWJldmVudC0yLjAvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgZGVpbW9zLWxpYmV2ZW50LTIuMCAmJiBcCisgICAgZ2l0IGNsb25lIC1iICd2Mi4wLjArMS4xLjBoJyBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC5naXQgZGVpbW9zLW9wZW5zc2wtMS4xLjBoICYmIFwKKyAgICBtdiBkZWltb3Mtb3BlbnNzbC0xLjEuMGgvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgZGVpbW9zLW9wZW5zc2wtMS4xLjBoL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGRlaW1vcy1vcGVuc3NsLTEuMS4waAorCitFTlYgREFSVF9WRVJTSU9OIDIuMS4wLTEKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9JERBUlRfVkVSU0lPTgorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBkb3RuZXQgY29yZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRvdG5ldC1zZGstMi4yCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuMTEuNAorRU5WIEdPTEFOR19ET1dOTE9BRF9VUkwgaHR0cHM6Ly9nb2xhbmcub3JnL2RsL2dvJEdPTEFOR19WRVJTSU9OLmxpbnV4LWFtZDY0LnRhci5negorRU5WIEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgZmIyNmMzMGU2YTA0YWQ5MzdiYmM2NTdhMWI1YmJhOTJmODAwOTZhZjFlOGVlNmRhNjQzMGMwNDVhOGRiM2E1YgorUlVOIGN1cmwgLWZzU0wgIiRHT0xBTkdfRE9XTkxPQURfVVJMIiAtbyBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGVjaG8gIiRHT0xBTkdfRE9XTkxPQURfU0hBMjU2ICBnb2xhbmcudGFyLmd6IiB8IHNoYTI1NnN1bSAtYyAtICYmIFwKKyAgICAgICAgICAgIHRhciAtQyAvdXNyL2xvY2FsIC14emYgZ29sYW5nLnRhci5neiAmJiBcCisgICAgICAgICAgICAgICAgICBsbiAtcyAvdXNyL2xvY2FsL2dvL2Jpbi9nbyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICBybSBnb2xhbmcudGFyLmd6CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldiAmJiBcCisgICAgaGF4ZWxpYiBzZXR1cCAtLWFsd2F5cyAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgLS1hbHdheXMgaHhjcHAgMj4mMSA+IC9kZXYvbnVsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG1hdmVuIFwKKyAgICAgIG9wZW5qZGstMTEtamRrLWhlYWRsZXNzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMhCisjIG5lZWQgdG8gdXBkYXRlIG91ciBsdWFzb2NrZXQgY29kZSwgbHVhIGRvZXNuJ3QgaGF2ZSBsdWFMX29wZW5saWIgYW55IG1vcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKKyMgVGVzdCBkZXBlbmRlbmNpZXMgZm9yIHJ1bm5pbmcgcHVwcGV0ZWVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEpTIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGlieHNzMQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorICAgICAgb2NhbWwgXAorICAgICAgb3BhbSAmJiBcCisgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocCBcCisgICAgICBwaHAtY2xpIFwKKyAgICAgIHBocC1kZXYgXAorICAgICAgcGhwLWpzb24gXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBjb21wb3NlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSAmJiBcCisgICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbjMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtcGlwIFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjYXJnbyBcCisgICAgICBydXN0YworCisjIFN3aWZ0IG9uIExpbnV4IGZvciBjcm9zcyB0ZXN0cworUlVOIGNkIC8gJiYgXAorICAgIHdnZXQgLS1xdWlldCBodHRwczovL3N3aWZ0Lm9yZy9idWlsZHMvc3dpZnQtNC4yLjEtcmVsZWFzZS91YnVudHUxODA0L3N3aWZ0LTQuMi4xLVJFTEVBU0Uvc3dpZnQtNC4yLjEtUkVMRUFTRS11YnVudHUxOC4wNC50YXIuZ3ogJiYgXAorICAgIHRhciB4ZiBzd2lmdC00LjIuMS1SRUxFQVNFLXVidW50dTE4LjA0LnRhci5neiAtLXN0cmlwLWNvbXBvbmVudHM9MSAmJiBcCisgICAgcm0gc3dpZnQtNC4yLjEtUkVMRUFTRS11YnVudHUxOC4wNC50YXIuZ3ogJiYgXAorICAgIHN3aWZ0IC0tdmVyc2lvbgorCisjIGNwcGNoZWNrLTEuODIgaGFzIGEgbmFzdHkgY3BwIHBhcnNlciBidWcsIHNvIHdlJ3JlIHVzaW5nIHNvbWV0aGluZyBuZXdlcgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBTdGF0aWMgQ29kZSBBbmFseXNpcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNwcGNoZWNrIFwKKyAgICAgIHNsb2Njb3VudCAmJiBcCisgICAgcGlwIGluc3RhbGwgZmxha2U4ICYmIFwKKyAgICB3Z2V0IC1xICJodHRwczovL2xhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvY3BwY2hlY2svMS44My0yLytidWlsZC8xNDg3NDcwMy8rZmlsZXMvY3BwY2hlY2tfMS44My0yX2FtZDY0LmRlYiIgJiYgXAorICAgIGRwa2cgLWkgY3BwY2hlY2tfMS44My0yX2FtZDY0LmRlYiAmJiBcCisgICAgcm0gY3BwY2hlY2tfMS44My0yX2FtZDY0LmRlYgorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvdWJ1bnR1LXhlbmlhbC9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL3VidW50dS14ZW5pYWwvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjkzYTJjCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3VidW50dS14ZW5pYWwvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDI3MiBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBVYnVudHUgWGVuaWFsCisjIFVzaW5nIGFsbCBzdG9jayBVYnVudHUgWGVuaWFsIHBhY2thZ2luZyBleGNlcHQgZm9yOgorIyAtIGQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAyLjA3NS4xIGZvciBjb3ZlcmFnZQorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAxLjI0LjMgZm9yIGNvdmVyYWdlCisjIC0gZG90bmV0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZ286IFhlbmlhbCBjb21lcyB3aXRoIDEuNiwgYnV0IHdlIG5lZWQgMS43IG9yIGxhdGVyCisjIC0gbm9kZWpzOiBYZW5pYWwgY29tZXMgd2l0aCA0LjIuNiB3aGljaCBleGl0cyBMVFMgQXByaWwgMjAxOCwgc28gd2UncmUgaW5zdGFsbGluZyA2LngKKyMgLSBvY2FtbDogY2F1c2VzIHN0YWNrIG92ZXJmbG93IGVycm9yLCBqdXN0IHN0YXJ0ZWQgTWFyY2ggMjAxOCBub3Qgc3VyZSB3aHkKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczp4ZW5pYWwtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIFwKKyAgICAgIHdnZXQKKworIyBjc2hhcnAgKG1vbm8pCisjIFJVTiBlY2hvICJkZWIgaHR0cDovL2Rvd25sb2FkLm1vbm8tcHJvamVjdC5jb20vcmVwby9kZWJpYW4geGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21vbm8ubGlzdCAmJiBcCisjICAgICBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBBNkExOUIzOEQzRDgzMUVGCisKKyMgRAorUlVOIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEVCQ0Y5NzVFNUJBMjRENUUgJiYgXAorICAgIHdnZXQgaHR0cDovL21hc3Rlci5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9kLWFwdC9maWxlcy9kLWFwdC5saXN0IC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2QtYXB0Lmxpc3QgJiYgXAorICAgIHdnZXQgLXFPIC0gaHR0cHM6Ly9kbGFuZy5vcmcvZC1rZXlyaW5nLmdwZyB8IGFwdC1rZXkgYWRkIC0KKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QKKworIyBkb3RuZXQgKGNvcmUpCitSVU4gY3VybCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20va2V5cy9taWNyb3NvZnQuYXNjIHwgZ3BnIC0tZGVhcm1vciA+IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisgICAgZWNobyAiZGViIFthcmNoPWFtZDY0XSBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vcmVwb3MvbWljcm9zb2Z0LXVidW50dS14ZW5pYWwtcHJvZCB4ZW5pYWwgbWFpbiIgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb3RuZXRkZXYubGlzdAorCisjIG5vZGUuanMKK1JVTiBjdXJsIC1zTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ncGdrZXkvbm9kZXNvdXJjZS5ncGcua2V5IHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgZWNobyAiZGViIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL25vZGVfNi54IHhlbmlhbCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9ub2Rlc291cmNlLmxpc3QKKworIyMjIGluc3RhbGwgZ2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIGxsdm0gXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KK0VOViBQQVRIIC91c3IvbGliL2xsdm0tMy44L2JpbjokUEFUSAorCisjIyMgbGFuZ3VhZ2VzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgXAorICAgICAgbGliYm9vc3Qtc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC10ZXN0LWRldiBcCisgICAgICBsaWJib29zdC10aHJlYWQtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworRU5WIERfVkVSU0lPTiAyLjA3NS4xLTAKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1hbGxvdy11bmF1dGhlbnRpY2F0ZWQgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRtZC1iaW49JERfVkVSU0lPTiBcCisgICAgICBsaWJwaG9ib3MyLWRldj0kRF9WRVJTSU9OIFwKKyAgICAgIGR1Yj0xLjYuMC0wIFwKKyAgICAgIGRmbXQgXAorICAgICAgZHNjYW5uZXIgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgeGRnLXV0aWxzCitSVU4gbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvdjEuMS42KzEuMC4xZy50YXIuZ3ogfCB0YXIgeHogJiYgXAorICAgIG12IG9wZW5zc2wtMS4xLjYtMS4wLjFnL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IG9wZW5zc2wtMS4xLjYtMS4wLjFnL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIG9wZW5zc2wtMS4xLjYtMS4wLjFnCisKK0VOViBEQVJUX1ZFUlNJT04gMS4yNC4zLTEKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9JERBUlRfVkVSU0lPTgorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBkb3RuZXQgY29yZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRvdG5ldC1zZGstMi4xCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuNy42CitFTlYgR09MQU5HX0RPV05MT0FEX1VSTCBodHRwczovL2dvbGFuZy5vcmcvZGwvZ28kR09MQU5HX1ZFUlNJT04ubGludXgtYW1kNjQudGFyLmd6CitFTlYgR09MQU5HX0RPV05MT0FEX1NIQTI1NiBhZDU4MDhiZjQyYjAxNGMyMmRkNzY0NjQ1OGY2MzEzODUwMDMwNDlkZWQwYmI2YWYyZWZjN2YxZjc5ZmEyOWVhCitSVU4gY3VybCAtZnNTTCAiJEdPTEFOR19ET1dOTE9BRF9VUkwiIC1vIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgZWNobyAiJEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgIGdvbGFuZy50YXIuZ3oiIHwgc2hhMjU2c3VtIC1jIC0gJiYgXAorICAgICAgdGFyIC1DIC91c3IvbG9jYWwgLXh6ZiBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGxuIC1zIC91c3IvbG9jYWwvZ28vYmluL2dvIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICAgIHJtIGdvbGFuZy50YXIuZ3oKKworIyBkdWUgdG8gYSBidWcgaW4gY2FiYWwgaW4geGVuaWFsIChjYWJhbC1pbnN0YWxsIHBhY2thZ2UpIHdlIHB1bGwgaW4gYW5vdGhlcjoKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyAmJiBcCisgICAgY2QgL3RtcCAmJiBcCisgICAgd2dldCAtcSBodHRwczovL3d3dy5oYXNrZWxsLm9yZy9jYWJhbC9yZWxlYXNlL2NhYmFsLWluc3RhbGwtMS4yNC4wLjIvY2FiYWwtaW5zdGFsbC0xLjI0LjAuMi14ODZfNjQtdW5rbm93bi1saW51eC50YXIuZ3ogJiYgXAorICAgIHRhciB4emYgY2FiYWwtaW5zdGFsbC0xLjI0LjAuMi14ODZfNjQtdW5rbm93bi1saW51eC50YXIuZ3ogJiYgXAorICAgIGZpbmQgZGlzdC1uZXdzdHlsZS8gLXR5cGUgZiAtbmFtZSBjYWJhbCAtZXhlYyBtdiB7fSAvdXNyL2JpbiBcOyAmJiBcCisgICAgcm0gLXJmIC90bXAvY2FiYWwqICYmIFwKKyAgICBjYWJhbCAtLXZlcnNpb24KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgaGF4ZSBcCisgICAgICBuZWtvIFwKKyAgICAgIG5la28tZGV2IFwKKyAgICAgIGxpYm5la28wICYmIFwKKyAgICBoYXhlbGliIHNldHVwIC0tYWx3YXlzIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgaW5zdGFsbCAtLWFsd2F5cyBoeGNwcCAzLjQuNjQgMj4mMSA+IC9kZXYvbnVsbAorIyBub3RlOiBoeGNwcCAzLjQuMTg1IChsYXRlc3QpIG5vIGxvbmdlciBzaGlwcyBzdGF0aWMgbGlicmFyaWVzLCBhbmQgY2F1c2VkIGEgYnVpbGQgZmFpbHVyZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstOC1qZGsgXAorICAgICAgbWF2ZW4KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjIgXAorICAgICAgbHVhNS4yLWRldgorIyBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9sdWE1LjMvK2J1Zy8xNzA3MjEyCisjIGx1YTUuMyBkb2VzIG5vdCBpbnN0YWxsIGFsdGVybmF0aXZlcyBzbyBzdGljayB3aXRoIDUuMiBoZXJlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTm9kZS5qcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5vZGVqcworCisjIFRlc3QgZGVwZW5kZW5jaWVzIGZvciBydW5uaW5nIHB1cHBldGVlcgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKUyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYnhzczEgXAorICAgICAgbGliYXRrLWJyaWRnZTIuMC0wIFwKKyAgICAgIGxpYmd0ay0zLTAKKworIyBUSFJJRlQtNDUxNzogY2F1c2VzIHN0YWNrIG92ZXJmbG93czsgdmVyc2lvbiB0b28gb2xkOyBza2lwIG9jYW1sIGluIHhlbmlhbAorIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIG9jYW1sIFwKKyMgICAgICAgb3BhbSAmJiBcCisjICAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorIyAgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHA3LjAgXAorICAgICAgcGhwNy4wLWNsaSBcCisgICAgICBwaHA3LjAtZGV2IFwKKyAgICAgIHBocC1qc29uIFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgY29tcG9zZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1iYWNrcG9ydHMuc3NsLW1hdGNoLWhvc3RuYW1lIFwKKyAgICAgIHB5dGhvbi1pcGFkZHJlc3MgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tc2l4IFwKKyAgICAgIHB5dGhvbi10b3JuYWRvIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi13aGVlbCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1zaXggXAorICAgICAgcHl0aG9uMy10b3JuYWRvIFwKKyAgICAgIHB5dGhvbjMtdHdpc3RlZCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UgJiYgXAorICAgIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNhcmdvIFwKKyAgICAgIHJ1c3RjCisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgRE9UTkVUX0NMSV9URUxFTUVUUllfT1BUT1VUIDEKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3VidW50dS9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL3VidW50dS9Eb2NrZXJmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ4MDA2Li4wMDAwMDAwCi0tLSBhL2J1aWxkL2RvY2tlci91YnVudHUvRG9ja2VyZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIENlbnRvcwotIwotIyBLbm93biBtaXNzaW5nIGNsaWVudCBsaWJyYXJpZXM6Ci0jICAtIE5vbmUKLQotRlJPTSB1YnVudHU6dHJ1c3R5Ci1NQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KLQotRU5WIEhPTUUgL3Jvb3QKLUVOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKLQotUlVOIGFwdC1nZXQgdXBkYXRlIC15ICYmIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15Ci0KLSMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKLVJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgYXV0b21ha2UgbGlidG9vbCBmbGV4IGJpc29uIHBrZy1jb25maWcgZysrIGxpYnNzbC1kZXYgbWFrZSBsaWJxdDQtZGV2IGdpdCBcCi0gICAgZGViaGVscGVyIGNtYWtlCi0KLSMgQysrIGRlcGVuZGVuY2llcwotUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBsaWJib29zdC1kZXYgbGliYm9vc3QtdGVzdC1kZXYgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBcCi0gICAgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgbGliYm9vc3Qtc3lzdGVtLWRldiBsaWJib29zdC10aHJlYWQtZGV2IGxpYmV2ZW50LWRldgotCi0jIEphdmEgZGVwZW5kZW5jaWVzCi1SVU4gYXB0LWdldCBpbnN0YWxsIC15IGFudCBvcGVuamRrLTctamRrIG1hdmVuICYmIFwKLSAgICB1cGRhdGUtamF2YS1hbHRlcm5hdGl2ZXMgLXMgamF2YS0xLjcuMC1vcGVuamRrLWFtZDY0Ci0KLSMgUHl0aG9uIGRlcGVuZGVuY2llcwotUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnIHB5dGhvbi1zZXR1cHRvb2xzIHB5dGhvbi1zdXBwb3J0IFwKLSAgICBweXRob24tdHdpc3RlZCBweXRob24tem9wZS5pbnRlcmZhY2UKLQotIyBSdWJ5IGRlcGVuZGVuY2llcwotUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBydWJ5IHJ1YnktZGV2ICYmIFwKLSAgICBnZW0gaW5zdGFsbCBidW5kbGVyIHJha2UKLQotIyBQZXJsIGRlcGVuZGVuY2llcwotUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBsaWJiaXQtdmVjdG9yLXBlcmwgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybAotCi0jIFBocCBkZXBlbmRlbmNpZXMKLVJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgcGhwNSBwaHA1LWRldiBwaHA1LWNsaSBwaHAtcGVhciByZTJjIHBocHVuaXQKLQotIyBHbGliQyBkZXBlbmRlbmNpZXMKLVJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgbGliZ2xpYjIuMC1kZXYKLQotIyBFcmxhbmcgZGVwZW5kZW5jaWVzCi1SVU4gZWNobyAnZGViIGh0dHA6Ly9wYWNrYWdlcy5lcmxhbmctc29sdXRpb25zLmNvbS9kZWJpYW4gdHJ1c3R5IGNvbnRyaWInID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZXJsYW5nX3NvbHV0aW9ucy5saXN0ICYmIFwKLSAgICBjdXJsIC1zU0wgaHR0cDovL3BhY2thZ2VzLmVybGFuZy1zb2x1dGlvbnMuY29tL2RlYmlhbi9lcmxhbmdfc29sdXRpb25zLmFzYyB8IHN1ZG8gYXB0LWtleSBhZGQgLSAmJiBcCi0gICAgYXB0LWdldCB1cGRhdGUgJiYgXAotICAgIGFwdC1nZXQgaW5zdGFsbCAteSBlcmxhbmctYmFzZSBlcmxhbmctZXVuaXQgZXJsYW5nLWRldgotCi0jIEdPIGRlcGVuZGVuY2llcwotUlVOIGN1cmwgLXNTTCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ29sYW5nL2dvMS40LjIubGludXgtYW1kNjQudGFyLmd6IHwgdGFyIC1DIC91c3IvbGliLyAteHogJiYgXAotICAgIG1rZGlyIC1wIC91c3Ivc2hhcmUvZ28KLQotRU5WIEdPUk9PVCAvdXNyL2xpYi9nbwotRU5WIEdPUEFUSCAvdXNyL3NoYXJlL2dvCi1FTlYgUEFUSCAke0dPUk9PVH0vYmluOiR7R09QQVRIfS9iaW46JFBBVEgKLQotIyBIYXNrZWxsIGRlcGVuZGVuY2llcwotUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBnaGMgY2FiYWwtaW5zdGFsbCBsaWJnaGMtYmluYXJ5LWRldiBsaWJnaGMtbmV0d29yay1kZXYgbGliZ2hjLWh0dHAtZGV2IFwKLSAgICBsaWJnaGMtaGFzaGFibGUtZGV2IGxpYmdoYy11bm9yZGVyZWQtY29udGFpbmVycy1kZXYgbGliZ2hjLXZlY3Rvci1kZXYgJiYgXAotICAgIGNhYmFsIHVwZGF0ZQotCi0jIEhheGUKLVJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgbmVrbyBuZWtvLWRldiBsaWJuZWtvMCAmJiBcCi0gICAgbWtkaXIgLXAgL3RtcC9oYXhlIC91c3IvbGliL2hheGUgJiYgXAotICAgIGN1cmwgaHR0cDovL2hheGUub3JnL3dlYnNpdGUtY29udGVudC9kb3dubG9hZHMvMy4yLjAvZG93bmxvYWRzL2hheGUtMy4yLjAtbGludXg2NC50YXIuZ3ogLW8gL3RtcC9oYXhlL2hheGUtMy4yLjAtbGludXg2NC50YXIuZ3ogJiYgXAotICAgIHRhciAteHZ6ZiAvdG1wL2hheGUvaGF4ZS0zLjIuMC1saW51eDY0LnRhci5neiAtQyAvdXNyL2xpYi9oYXhlIC0tc3RyaXAtY29tcG9uZW50cz0xICYmIFwKLSAgICBsbiAtcyAvdXNyL2xpYi9oYXhlL2hheGUgL3Vzci9iaW4vaGF4ZSAmJiBcCi0gICAgbG4gLXMgL3Vzci9saWIvaGF4ZS9oYXhlbGliIC91c3IvYmluL2hheGVsaWIgJiYgXAotICAgIG1rZGlyIC1wIC91c3IvbGliL2hheGUvbGliICAmJiBcCi0gICAgY2htb2QgLVIgNzc3IC91c3IvbGliL2hheGUvbGliICYmIFwKLSAgICBoYXhlbGliIHNldHVwIC91c3IvbGliL2hheGUvbGliICYmIFwKLSAgICBoYXhlbGliIGluc3RhbGwgaHhjcHAKLQotIyBMdWEgZGVwZW5kZW5jaWVzCi1SVU4gYXB0LWdldCBpbnN0YWxsIC15IGx1YTUuMiBsdWE1LjItZGV2Ci0KLSMgTm9kZS5qcyBkZXBlbmRlbmNpZXMKLVJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgbm9kZWpzIG5vZGVqcy1kZXYgbm9kZWpzLWxlZ2FjeSBucG0KLQotIyBDU2hhcnAKLVJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgbW9uby1nbWNzIG1vbm8tZGV2ZWwgbW9uby14YnVpbGQgbW9uby1jb21wbGV0ZSBsaWJtb25vLXN5c3RlbS13ZWIyLjAtY2lsIFwKLSAgICBtaW5ndzMyIG1pbmd3MzItYmludXRpbHMgbWluZ3czMi1ydW50aW1lIG5zaXMKLQotIyBEIGRlcGVuZGVuY2llcwotIyBUSFJJRlQtMjkxNjogRE1EIHBpbm5lZCB0byAyLjA2NS4wLTAgZHVlIHRvIHJlZ3Jlc3Npb24gaW4gMi4wNjYKLSMgVEhSSUZULTMyNTM6IERNRCBwaW5uZWQgdG8gMi4wNjUuMC0wIGR1ZSB0byBkZXByZWNhdGlvbnMgMi4wNjcuMQotUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBnY2MtbXVsdGlsaWIgeGRnLXV0aWxzICYmIFwKLSAgICBjdXJsIC1zU0wgaHR0cDovL2Rvd25sb2Fkcy5kbGFuZy5vcmcvcmVsZWFzZXMvMi54LzIuMDY1LjAvZG1kXzIuMDY1LjAtMF9hbWQ2NC5kZWIgLW8gL3RtcC9kbWRfMi4wNjUuMC0wX2FtZDY0LmRlYiAmJiBcCi0gICAgZHBrZyAtaSAvdG1wL2RtZF8yLjA2NS4wLTBfYW1kNjQuZGViICYmIFwKLSAgICBybSAvdG1wL2RtZF8yLjA2NS4wLTBfYW1kNjQuZGViCi0KLSMgQ2xlYW4gdXAKLVJVTiBhcHQtZ2V0IGNsZWFuICYmIFwKLSAgICBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCi0gICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKLSAgICBybSAtcmYgL3RtcC8qICYmIFwKLSAgICBybSAtcmYgL3Zhci90bXAvKgotCi1XT1JLRElSICRIT01FCmRpZmYgLS1naXQgYS9idWlsZC9maXhjaGFuZ2VzLnNoIGIvYnVpbGQvZml4Y2hhbmdlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzU3YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZml4Y2hhbmdlcy5zaApAQCAtMCwwICsxLDM5IEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgZml4Y2hhbmdlcyB3aWxsIHRha2UgYSBmaWxlIGFzIGlucHV0IGFuZCBsb29rIGZvciB0ZXh0IG1hdGNoaW5nCisjIHRoZSBwYXR0ZXJuIFtUSFJJRlQtbm5ubl0gKHRoZSBudW1iZXIgb2YgZGlnaXRzIGlzIG5vdCBpbXBvcnRhbnQpCisjIHdoaWNoIGlzIG5vdCBhIG1hcmtkb3duIGxpbmssIGFuZCBjaGFuZ2UgaXQgdG8gYmUgYSBtYXJrZG93biBsaW5rLgorIyBUaGUgdG9vbCB3cml0ZXMgdG8gc3Rkb3V0IHNvIHlvdSBjYW4gcmVkaXJlY3QgaXQgdG8gYSB0ZW1wb3JhcnkKKyMgZmlsZSBhbmQgdGhlbiBjb21wYXJlIGFnYWluc3QgdGhlIG9yaWdpbmFsIGZpbGUgYmVmb3JlIHJlcGxhY2luZworIyBpdC4KKyMKKyMgVGhpcyB0b29sIHdhcyBkZXZlbG9wZWQgYWZ0ZXIgdGhlIDAuMTIuMCByZWxlYXNlIHRvIGFzc2lzdCB3aXRoCisjIGdlbmVyYXRpb24gb2YgQ0hBTkdFUy5tZCBjb250ZW50LgorIworCit3aGlsZSBJRlM9JycgcmVhZCAtciBsaW5lIHx8IFtbIC1uICIkbGluZSIgXV07IGRvCisgICAgaWYgW1sgIiRsaW5lIiA9fiBeKC4qKVxbKFRIUklGVC1bWzpkaWdpdDpdXSspXF1bXlwoXSguKikkIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIiR7QkFTSF9SRU1BVENIWzFdfVske0JBU0hfUkVNQVRDSFsyXX1dKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvJHtCQVNIX1JFTUFUQ0hbMl19KSAke0JBU0hfUkVNQVRDSFszXX0iCisgICAgZWxzZQorICAgICAgICBlY2hvICIkbGluZSIKKyAgICBmaQorZG9uZSA8ICIkMSIKZGlmZiAtLWdpdCBhL2J1aWxkL3RyYXZpcy9pbnN0YWxsQ1hYRGVwZW5kZW5jaWVzLnNoIGIvYnVpbGQvdHJhdmlzL2luc3RhbGxDWFhEZXBlbmRlbmNpZXMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjM2VkZjMuLjAwMDAwMDAKLS0tIGEvYnVpbGQvdHJhdmlzL2luc3RhbGxDWFhEZXBlbmRlbmNpZXMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotIyBNYWlubHkgYWltaW5nIFRyYXZpcyBDSSdzIFVidW50dSBtYWNoaW5lcyBmb3Igbm93Ci0jIHNlZSB3aGF0IHdlIG5lZWQ6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb2NzL2luc3RhbGwvdWJ1bnR1Ci0KLSMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWFkZC1yZXBvc2l0b3J5ICJkZWIgaHR0cDovL2FyY2hpdmUudWJ1bnR1LmNvbS91YnVudHUvIHRydXN0eSBtYWluIHJlc3RyaWN0ZWQiIC15Ci1zdWRvIGFwdC1nZXQgdXBkYXRlIC1xcQotCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgbGlicGFuZ28tMS4wLTAgbGlicXQ0LWRldiBxdGJhc2U1LWRldiBxdGJhc2U1LWRldi10b29scyBxdDUtZGVmYXVsdCBsaWJib29zdC1kZXYgbGliYm9vc3QtdGVzdC1kZXYgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBsaWJib29zdC1zeXN0ZW0tZGV2IGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IGxpYmJvb3N0LXRocmVhZC1kZXYgbGliZXZlbnQtZGV2IGF1dG9tYWtlIGxpYnRvb2wgZmxleCBiaXNvbiBwa2ctY29uZmlnIGcrKyBsaWJzc2wtZGV2IG1ha2UgY21ha2UgZ2l0IGRlYmhlbHBlciBiYyBuc2lzIG5pbmphLWJ1aWxkCi1kcGtnIC1TIC91c3IvaW5jbHVkZS9ib29zdC92ZXJzaW9uLmhwcApkaWZmIC0tZ2l0IGEvYnVpbGQvdHJhdmlzL2luc3RhbGxEZXBlbmRlbmNpZXMuc2ggYi9idWlsZC90cmF2aXMvaW5zdGFsbERlcGVuZGVuY2llcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWI3NDE0MC4uMDAwMDAwMAotLS0gYS9idWlsZC90cmF2aXMvaW5zdGFsbERlcGVuZGVuY2llcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotU0NSSVBUUEFUSD0kKCBjZCAkKGRpcm5hbWUgJDApIDsgcHdkIC1QICkKLQotIyBNYWlubHkgYWltaW5nIFRyYXZpcyBDSSdzIFVidW50dSBtYWNoaW5lcyBmb3Igbm93Ci0jIHNlZSB3aGF0IHdlIG5lZWQ6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb2NzL2luc3RhbGwvdWJ1bnR1Ci0KLSMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKLXNoICR7U0NSSVBUUEFUSH0vaW5zdGFsbENYWERlcGVuZGVuY2llcy5zaAotCi0jIEphdmEgZGVwZW5kZW5jaWVzCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgYW50IG9wZW5qZGstNy1qZGsKLXN1ZG8gdXBkYXRlLWphdmEtYWx0ZXJuYXRpdmVzIC1zIGphdmEtMS43LjAtb3Blbmpkay1hbWQ2NAotCi0jIFB5dGhvbiBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnIHB5dGhvbi1zZXR1cHRvb2xzIHB5dGhvbi1zdXBwb3J0IHB5dGhvbi10d2lzdGVkCi0KLSMgUnVieSBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBydWJ5IHJ1YnktZGV2Ci1zdWRvIGdlbSBpbnN0YWxsIGJ1bmRsZXIgcmFrZQotCi0jIFBlcmwgZGVwZW5kZW5jaWVzCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgbGliYml0LXZlY3Rvci1wZXJsIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgbGliaW8tc29ja2V0LXNzbC1wZXJsIGxpYm5ldC1zc2xlYXktcGVybCBsaWJjcnlwdC1zc2xlYXktcGVybAotCi0jIFBocCBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBwaHA1IHBocDUtZGV2IHBocDUtY2xpIHBocC1wZWFyIHJlMmMKLQotIyBHbGliQyBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJnbGliMi4wLWRldgotCi0jIEVybGFuZyBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBlcmxhbmctYmFzZSBlcmxhbmctZXVuaXQgZXJsYW5nLWRldgotCi0jIEdPIGRlcGVuZGVuY2llcwotZWNobyAiZ29sYW5nLWdvIGdvbGFuZy1nby9kYXNoYm9hcmQgYm9vbGVhbiBmYWxzZSIgfCBkZWJjb25mLXNldC1zZWxlY3Rpb25zCi1zdWRvIGFwdC1nZXQgLXkgaW5zdGFsbCAtcXEgZ29sYW5nIGdvbGFuZy1nbwotCi0jIEhhc2tlbGwgZGVwZW5kZW5jaWVzCi1zdWRvIGFkZC1hcHQtcmVwb3NpdG9yeSAteSBwcGE6aHZyL2doYwotc3VkbyBhcHQtZ2V0IHVwZGF0ZQotc3VkbyBhcHQtZ2V0IGluc3RhbGwgY2FiYWwtaW5zdGFsbC0xLjIwIGdoYy0kR0hDVkVSCi0KLSMgTHVhIGRlcGVuZGVuY2llcwotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGx1YTUuMiBsdWE1LjItZGV2Ci0KLSMgTm9kZS5qcyBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBub2RlanMgbm9kZWpzLWRldiBucG0KLXN1ZG8gdXBkYXRlLWFsdGVybmF0aXZlcyAtLWluc3RhbGwgL3Vzci9iaW4vbm9kZSBub2RlIC91c3IvYmluL25vZGVqcyAxMAotCi0jIENTaGFycAotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIG1vbm8tZ21jcyBtb25vLWRldmVsIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBtaW5ndzMyIG1pbmd3MzItYmludXRpbHMgbWluZ3czMi1ydW50aW1lIG5zaXMKZGlmZiAtLWdpdCBhL2J1aWxkL3ZlcmFsaWduLnNoIGIvYnVpbGQvdmVyYWxpZ24uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTZjNDM2YQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3ZlcmFsaWduLnNoCkBAIC0wLDAgKzEsMzE4IEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBUaGUgdmVyYWxpZ24gc2NyaXB0IHNldHMgdGhlIGFwcHJvcHJpYXRlIHZlcnNpb25zIGluIGFsbCBvZgorIyB0aGUgcGFja2FnZSBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBhbGwgb2YgdGhlIHN1cHBvcnRlZAorIyBsYW5ndWFnZXMuICBJdCBpcyB1c2VkIHRvIHByZXBhcmUgYSByZWxlYXNlIG9yIG1vdmUgbWFzdGVyCisjIGZvcndhcmQgdG8gdGhlIG5leHQgYW50aWNpcGF0ZWQgdmVyc2lvbi4KKyMKKyMgVVNBR0UKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdXNhZ2U6IHZlcmFsaWduLnNoIDxvbGRWZXJzaW9uPiA8bmV3VmVyc2lvbj4KKyMKKyMgRVhBTVBMRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAkIC4vdmVyYWxpZ24uc2ggMC4xMi4wIDEuMC4wCisjICQgLi92ZXJhbGlnbi5zaCAxLjAuMCAxLjEuMAorIworIyBJTVBPUlRBTlQgVVNBR0UgTk9URQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIERSWVJVTiB0byBoYXZlIHRoZSBzY3JpcHQKKyMgcHJpbnQgb3V0IGFsbCBtYXRjaGVzIHRvIHRoZSBvbGRWZXJzaW9uIGhpbGlnaHRlZCBzbyB0aGF0CisjIHlvdSBjYW4gdmVyaWZ5IGl0IHdpbGwgY2hhbmdlIHRoZSByaWdodCB0aGluZ3MuCisjCisKK2RlY2xhcmUgLUEgRklMRVMKKworIyBUaGVzZSBmaWxlcyByZXF1aXJlIGEgbWFudWFsIHRvdWNoOgorRklMRVNbQ0hBTkdFUy5tZF09bWFudWFsCitGSUxFU1tkZWJpYW4vY2hhbmdlbG9nXT1tYW51YWwKK0ZJTEVTW2RvYXAucmRmXT1tYW51YWwKKworIyBUaGVzZSBmaWxlcyBjYW4gYmUgdXBkYXRlZCBhdXRvbWF0aWNhbGx5OgorRklMRVNbQXBhY2hlVGhyaWZ0Lm51c3BlY109c2ltcGxlUmVwbGFjZQorRklMRVNbQ01ha2VMaXN0cy50eHRdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW1RocmlmdC5wb2RzcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1thcHB2ZXlvci55bWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2Jvd2VyLmpzb25dPWpzb25SZXBsYWNlCitGSUxFU1tjb25maWd1cmUuYWNdPWNvbmZpZ3VyZVJlcGxhY2UKK0ZJTEVTW2NvbnRyaWIvdGhyaWZ0LnNwZWNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2RvYy9zcGVjcy9pZGwubWRdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9hczMvZ3JhZGxlLnByb3BlcnRpZXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleFNlcnZlci5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2Qvc3JjL3RocmlmdC9iYXNlLmRdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9kYXJ0L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW2xpYi9kZWxwaGkvc3JjL1RocmlmdC5wYXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvaGF4ZS9oYXhlbGliLmpzb25dPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9ocy90aHJpZnQuY2FiYWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9qYXZhL2dyYWRsZS5wcm9wZXJ0aWVzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvanMvcGFja2FnZS5qc29uXT1qc29uUmVwbGFjZQorRklMRVNbbGliL2pzL3NyYy90aHJpZnQuanNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9sdWEvVGhyaWZ0Lmx1YV09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL25ldGNvcmUvVGhyaWZ0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9USHR0cENsaWVudFRyYW5zcG9ydC5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL29jYW1sL19vYXNpc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3BlcmwvbGliL1RocmlmdC5wbV09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3B5L3NldHVwLnB5XT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvcmIvdGhyaWZ0LmdlbXNwZWNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9ycy9DYXJnby50b21sXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvc3QvcGFja2FnZS54bWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9zd2lmdC9Tb3VyY2VzL1RocmlmdC5zd2lmdF09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RocmlmdFRlc3RzLnN3aWZ0XT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvdHMvcGFja2FnZS5qc29uXT1qc29uUmVwbGFjZQorRklMRVNbcGFja2FnZS5qc29uXT1qc29uUmVwbGFjZQorRklMRVNbc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3Rlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyY109c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sXT1wdWJzcGVjUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9vY2FtbC9fb2FzaXNdPXNpbXBsZVJlcGxhY2UKKworaWYgWyAhIC1mICJDSEFOR0VTLm1kIiBdOyB0aGVuCisgICAgPiYyIGVjaG8gImVycm9yOiBydW4gdmVyYWxpZ24uc2ggd2hpbGUgaW4gdGhlIHRocmlmdCByb290IGRpcmVjdG9yeSIKKyAgICBleGl0IDEKK2ZpCisKK2lmIFsgJCMgLW5lIDIgXTsgdGhlbgorICAgID4mMiBlY2hvICJ1c2FnZTogdmVyYWxpZ24uc2ggPG9sZFZlcnNpb24+IDxuZXdWZXJzaW9uPiIKKyAgICBleGl0IDEKK2ZpCisKK2pxIC0tdmVyc2lvbiAxPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAoraWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICAgPiYyIGVjaG8gImVycm9yOiB0aGUgJ2pxJyBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQiCisgICAgZXhpdCAxCitmaQorCisjCisjIHZhbGlkYXRlVmVyc2lvbjogY2hlY2sgdGhhdCBhIHZlcnNpb24gbWF0Y2hlcyB0aGUgbWFqb3IubWlub3IucGF0Y2gKKyMgICBmb3JtYXQgd2hpY2ggaXMgdGhlIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3Igc3VwcG9ydGVkIGJ5IGFsbAorIyAgIHByb2plY3Qgc3lzdGVtcy4KKyMgXHBhcmFtICQxIHRoZSB2ZXJzaW9uCisjIFxyZXR1cm5zIDAgaWYgdGhlIHZlcnNpb24gaXMgY29tcGxpYW50CisjCitmdW5jdGlvbiB2YWxpZGF0ZVZlcnNpb24KK3sKKyAgICBsb2NhbCByZXN1bHQKKyAgICBsb2NhbCB2YWxpZAorICAgIHZhbGlkPSQoZWNobyAiJDEiIHwgc2VkICcvXltbOmRpZ2l0Ol1dXCtcLltbOmRpZ2l0Ol1dXCtcLltbOmRpZ2l0Ol1dXCskLyF7cTIyfScpCisgICAgcmVzdWx0PSQ/CisgICAgaWYgWyAkcmVzdWx0IC1lcSAyMiBdOyB0aGVuCisgICAgICAgID4mMiBlY2hvICJlcnJvcjogdmVyc2lvbiAnJDEnIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIHJlcXVpcmVkIG1ham9yLm1pbm9yLnBhdGNoIGZvcm1hdCIKKyAgICAgICAgcmV0dXJuICR7cmVzdWx0fQorICAgIGZpCit9CisKK09MRFZFUlNJT049JDEKK05FV1ZFUlNJT049JDIKK3ZhbGlkYXRlVmVyc2lvbiAiJHtPTERWRVJTSU9OfSIgfHwgZXhpdCAkPwordmFsaWRhdGVWZXJzaW9uICIke05FV1ZFUlNJT059IiB8fCBleGl0ICQ/CisKKyMKKyMgZXNjYXBlVmVyc2lvbjogZXNjYXBlIHRoZSB2ZXJzaW9uIGZvciB1c2UgYXMgYSBzZWQgc2VhcmNoCisjIFxwYXJhbSAkMSB0aGUgdmVyc2lvbiB0byBlc2NhcGUKKyMgXG91dHB1dCB0aGUgZXNjYXBlZCBzdHJpbmcKKyMgXHJldHVybnMgMAorIyBcZXhhbXBsZSBWRVJTRUFSQ0g9JChlc2NhcGVWZXJzaW9uICJbMS4wLjBdIik7IGVjaG8gJFZFUlNFQVJDSDsgPT4gIlxbMVwuMFwuMFxdIgorIworZnVuY3Rpb24gZXNjYXBlVmVyc2lvbgoreworICAgIGVjaG8gIiQoZWNobyAkMSB8IHNlZCAncy9cLi9cXC4vZycgfCBzZWQgJ3MvXFsvXFxcWy9nJyB8IHNlZCAncy9cXS9cXFxdL2cnKSIKK30KKworIyBTZXQgdXAgdmVyYm9zZSBoaWxpZ2h0aW5nIGlmIHJ1bm5pbmcgaW50ZXJhY3RpdmUKK2lmIFsgIiQodHB1dCBjb2xvcnMpIiAtbmUgMCBdOyB0aGVuCisgICAgcmV2ZXJzZT0kKHRwdXQgcmV2KQorICAgIHJlZD0kKHRwdXQgc2V0YWYgMSkKKyAgICBncmVlbj0kKHRwdXQgc2V0YWYgMikKKyAgICB5ZWxsb3c9JCh0cHV0IHNldGFmIDMpCisgICAgbm9ybWFsPSQodHB1dCBzZ3IwKQorZmkKKworZGVjbGFyZSAtQSBNQU5VQUwKKworIworIyBtYW51YWw6IG5vdGUgdGhhdCB1cGRhdGUgb2Ygc2FpZCBmaWxlIGlzIG1hbnVhbAorIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxyZXR1cm5zIDAKKyMKK2Z1bmN0aW9uIG1hbnVhbAoreworICAgIE1BTlVBTFsiJDEiXT0iIgorICAgIHJldHVybiAwCit9CisKKyMKKyMgY29uZmlndXJlUmVwbGFjZTogcmVwbGFjZSB0aGUgQUNfSU5JVCBmaWVsZCBpbiBjb25maWd1cmUuYWMKKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKKworZnVuY3Rpb24gY29uZmlndXJlUmVwbGFjZQoreworICAgIHJlcGxhY2UgIiQxIiAiW3RocmlmdF0sIFske09MRFZFUlNJT059XSIgIlt0aHJpZnRdLCBbJHtORVdWRVJTSU9OfV0iCit9CisKKyMKKyMganNvblJlcGxhY2U6IHJlcGxhY2UgYSBzcGVjaWZpYyB2ZXJzaW9uIGZpZWxkIGluIGEgSlNPTiBmaWxlCisjICAgbXVzdCBiZSBhIHRvcCBsZXZlbCAidmVyc2lvbiIgZmllbGQgaW4gdGhlIGpzb24gc3RydWN0dXJlCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCisKK2Z1bmN0aW9uIGpzb25SZXBsYWNlCit7CisgICAgbG9jYWwgcmVzdWx0CisgICAgbG9jYWwgb3V0cHV0CisgICAgaWYgWyAhIC16ICIkRFJZUlVOIiBdOyB0aGVuCisgICAgICAgIG91dHB1dD0kKGpxIC1lICIudmVyc2lvbiIgIiQxIikKKyAgICBlbHNlCisgICAgICAgIG91dHB1dD0kKGpxIC1lICIudmVyc2lvbiA9IFwiJHtORVdWRVJTSU9OfVwiIiAiJDEiID4gdG1wLiQkLmpzb24gJiYgbXYgdG1wLiQkLmpzb24gIiQxIikKKyAgICBmaQorICAgIHJlc3VsdD0kPworICAgIGlmIFsgJD8gLW5lIDAgXTsgdGhlbgorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtyZWR9RVJST1Ike25vcm1hbH06IHZlcnNpb24gdGFnIG5vdCBmb3VuZCIgIiQxIiAiJGNvdW50IgorICAgICAgICBlY2hvCisgICAgICAgIHJldHVybiAxCisgICAgZWxpZiBbICEgLXogIiREUllSVU4iIF07IHRoZW4KKyAgICAgICAgb3V0cHV0PSR7b3V0cHV0JVwifQorICAgICAgICBvdXRwdXQ9JHtvdXRwdXQjXCJ9CisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCBNQVRDSEVTOiAgIHZlcnNpb246IFwiJHtyZXZlcnNlfSR7Z3JlZW59JHtvdXRwdXR9JHtub3JtYWx9XCIiICIkMSIgMQorICAgICAgICBlY2hvCisgICAgICAgIHJldHVybiAwCisgICAgZmkKKyAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtncmVlbn1PSyR7bm9ybWFsfSIgIiQxIiAxCisgICAgZWNobworICAgIHJldHVybiAwCit9CisKKyMKKyMgcHVic3BlY1JlcGxhY2U6IHJlcGxhY2UgYSBzcGVjaWZpYyB2ZXJzaW9uIGZpZWxkIGluIGEgWUFNTCBmaWxlCisjICAgbXVzdCBiZSBhIHRvcCBsZXZlbCAidmVyc2lvbiIgZmllbGQgaW4gdGhlIHlhbWwgc3RydWN0dXJlCisjICAgZGlkIG5vdCBmaW5kIGEgcGFja2FnZSB0aGF0IHByZXNlcnZlcyBjb21tZW50cyBzbyB0aGlzIGlzCisjICAgc29tZXdoYXQgYnJhaW4tZGVhZCwgYnV0IGl0IGdldHMgdGhlIGpvYiBkb25lCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCisKK2Z1bmN0aW9uIHB1YnNwZWNSZXBsYWNlCit7CisgICAgcmVwbGFjZSAiJDEiICJ2ZXJzaW9uOiAke09MRFZFUlNJT059IiAidmVyc2lvbjogJHtORVdWRVJTSU9OfSIKK30KKworIworIyByZXBsYWNlOiByZXBsYWNlIG9jY3VycmVuY2VzIG9mIG9uZSBzdHJpbmcgd2l0aCBhbm90aGVyCisjICAgICB0aGUgZmlsZSBzcGVjaWZpZWQgbXVzdCBjb250YWluIHRoZSBvbGQgc3RyaW5nIGF0IGxlYXN0IG9uY2UKKyMgICAgIGluIG9yZGVyIHRvIGJlIHN1Y2Nlc3NmdWwuCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHBhcmFtICQyIHRoZSAib2xkIiBzdHJpbmcgdG8gYmUgcmVwbGFjZWQKKyMgXHBhcmFtICQzIHRoZSAibmV3IiBzdHJpaW5nIHRvIHJlcGxhY2UgaXQgd2l0aAorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKK2Z1bmN0aW9uIHJlcGxhY2UKK3sKKyAgICBsb2NhbCByZXN1bHQKKyAgICBsb2NhbCBvdXRwdXQKKyAgICBsb2NhbCBvbGRTdHJpbmc9IiQyIgorICAgIGxvY2FsIG5ld1N0cmluZz0iJDMiCisgICAgbG9jYWwgb2xkUmVnZXg9JChlc2NhcGVWZXJzaW9uICIke29sZFN0cmluZ30iKQorICAgIGxvY2FsIGNvdW50PSQoZ3JlcCAtRWMgIiR7b2xkUmVnZXh9IiAiJDEiKQorICAgIGxvY2FsIHZlcmJvc2UKKyAgICBpZiBbICRjb3VudCAtZXEgMCBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke3JlZH1OT1QgRk9VTkQke25vcm1hbH06ICR7b2xkU3RyaW5nfSIgIiQxIiAwCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbGlmIFsgISAteiAiJERSWVJVTiIgXTsgdGhlbgorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgTUFUQ0hFUzoiICIkMSIgIiRjb3VudCIKKyAgICAgICAgZWNobworICAgICAgICB3aGlsZSByZWFkIC1yIGxpbmU7IGRvCisgICAgICAgICAgICBlY2hvICIgPiAkKGVjaG8gIiRsaW5lIiB8IHNlZCAicy8ke29sZFJlZ2V4fS8ke3JldmVyc2V9JHtncmVlbn0ke29sZFN0cmluZ30ke25vcm1hbH0vZyIpIgorICAgICAgICBkb25lIDwgPChncmVwIC1FICIke29sZFJlZ2V4fSIgIiQxIikKKyAgICAgICAgcmV0dXJuIDAKKyAgICBmaQorICAgIG91dHB1dD0kKHNlZCAtaSAicy8ke29sZFJlZ2V4fS8ke25ld1N0cmluZ30vZyIgIiQxIikKKyAgICByZXN1bHQ9JD8KKyAgICBpZiBbICRyZXN1bHQgLW5lIDAgXTsgdGhlbgorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtyZWR9RVJST1Ike25vcm1hbH06ICVzIiAiJDEiICIkY291bnQiICIkb3V0cHV0IgorICAgICAgICBlY2hvCisgICAgICAgIHJldHVybiAxCisgICAgZmkKKyAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtncmVlbn1PSyR7bm9ybWFsfSIgIiQxIiAiJGNvdW50IgorICAgIGVjaG8KKyAgICByZXR1cm4gMAorfQorCisjCisjIHNpbXBsZVJlcGxhY2U6IHJlcGxhY2Ugb2NjdXJyZW5jZXMgb2YgJHtPTERWRVJTSU9OfSB3aXRoICR7TkVXVkVSU0lPTn0KKyMgICAgIHRoZSBmaWxlIHNwZWNpZmllZCBtdXN0IGNvbnRhaW4gT0xEVkVSU0lPTiBhdCBsZWFzdCBvbmNlCisjICAgICBpbiBvcmRlciB0byBiZSBzdWNjZXNzZnVsLgorIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxwYXJhbSAkMiB0aGUgIm9sZCIgc3RyaW5nIHRvIGJlIHJlcGxhY2VkCisjIFxwYXJhbSAkMyB0aGUgIm5ldyIgc3RyaWluZyB0byByZXBsYWNlIGl0IHdpdGgKKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCitmdW5jdGlvbiBzaW1wbGVSZXBsYWNlCit7CisgICAgcmVwbGFjZSAiJDEiICIke09MRFZFUlNJT059IiAiJHtORVdWRVJTSU9OfSIKK30KKworZWNobyAiIgorZWNobyAiQXBhY2hlIFRocmlmdCBWZXJzaW9uIEFsaWdubWVudCBUb29sIgorZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiIgorZWNobyAiUHJldmlvdXMgVmVyc2lvbjogJHtPTERWRVJTSU9OfSIKK2VjaG8gIiAgICAgTmV3IFZlcnNpb246ICR7TkVXVkVSU0lPTn0iCitlY2hvICIiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKK2VjaG8gIkZpbGVuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvdW50IHwgU3RhdHVzICAgICAgICAgICAgICAgIgorZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisKK2ZvciBmaWxlIGluICQoZWNobyAiJHshRklMRVNbQF19IiB8IHNvcnQpOyBkbworICAgICR7RklMRVNbJGZpbGVdfSAkZmlsZSB8fCBleGl0ICQ/Citkb25lCisKK2VjaG8KK2VjaG8gIkZpbGVzIHRoYXQgbXVzdCBiZSBtb2RpZmllZCBtYW51YWxseToiCitlY2hvCitmb3IgbWFudSBpbiAkKGVjaG8gIiR7IU1BTlVBTFtAXX0iIHwgc29ydCk7IGRvCisgICAgZWNobyAiID4gJHt5ZWxsb3d9JHttYW51fSR7bm9ybWFsfSIKK2RvbmUKKworZXhpdCAwCmRpZmYgLS1naXQgYS9jbGVhbnVwLnNoIGIvY2xlYW51cC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjExMDcyMS4uMDAwMDAwMAotLS0gYS9jbGVhbnVwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi10b3BzcmNkaXI9ImBkaXJuYW1lICQwYCIKLWNkICIkdG9wc3JjZGlyIgotCi1tYWtlIC1rIGNsZWFuID4vZGV2L251bGwgMj4mMQotbWFrZSAtayBkaXN0Y2xlYW4gPi9kZXYvbnVsbCAyPiYxCi1maW5kIC4gLW5hbWUgTWFrZWZpbGUuaW4gLWV4ZWMgcm0gLWYge30gXDsKLXJtIC1yZiBcCi1BVVRIT1JTIFwKLUNoYW5nZUxvZyBcCi1JTlNUQUxMIFwKLU1ha2VmaWxlIFwKLU1ha2VmaWxlLmluIFwKLU1ha2VmaWxlLm9yaWcgXAotYWNsb2NhbC9saWJ0b29sLm00IFwKLWFjbG9jYWwvbHRvcHRpb25zLm00IFwKLWFjbG9jYWwvbHRzdWdhci5tNCBcCi1hY2xvY2FsL2x0dmVyc2lvbi5tNCBcCi1hY2xvY2FsL2x0fm9ic29sZXRlLm00IFwKLWFjbG9jYWwubTQgXAotYXV0b200dGUuY2FjaGUgXAotYXV0b3NjYW4ubG9nIFwKLWNvbmZpZy5ndWVzcyBcCi1jb25maWcuaCBcCi1jb25maWcuaGluIFwKLWNvbmZpZy5oaW5+IFwKLWNvbmZpZy5sb2cgXAotY29uZmlnLnN0YXR1cyBcCi1jb25maWcuc3RhdHVzLmxpbmVubyBcCi1jb25maWcuc3ViIFwKLWNvbmZpZ3VyZSBcCi1jb25maWd1cmUubGluZW5vIFwKLWNvbmZpZ3VyZS5zY2FuIFwKLWRlcGNvbXAgXAotLmRlcHMgXAotaW5zdGFsbC1zaCBcCi0ubGlicyBcCi1saWJ0b29sIFwKLWx0bWFpbi5zaCBcCi1taXNzaW5nIFwKLXlsd3JhcCBcCi1pZi9nZW4tKiBcCi10ZXN0L2dlbi0qIFwKLWxpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvLmRlcHMgXAotbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9NYWtlZmlsZSBcCi1saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL01ha2VmaWxlLmZyYWdtZW50cyBcCi1saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL01ha2VmaWxlLmdsb2JhbCBcCi1saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL01ha2VmaWxlLm9iamVjdHMgXAotbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9hY2luY2x1ZGUubTQgXAotbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9hY2xvY2FsLm00IFwKLWxpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvYXV0b200dGUuY2FjaGUgXAotbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9idWlsZCBcCi1saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5ndWVzcyBcCi1saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5oIFwKLWxpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLmguaW4gXAotbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubG9nIFwKLWxpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLm5pY2UgXAotbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcuc3RhdHVzIFwKLWxpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLnN1YiBcCi1saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZ3VyZSBcCi1saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZ3VyZS5pbiBcCi1saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2luY2x1ZGUgXAotbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9pbnN0YWxsLXNoIFwKLWxpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbGlidG9vbCBcCi1saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2x0bWFpbi5zaCBcCi1saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL21pc3NpbmcgXAotbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9ta2luc3RhbGxkaXJzIFwKLWxpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbW9kdWxlcyBcCi1saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3J1bi10ZXN0cy5waHAKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9DTWFrZUxpc3RzLnR4dCBiL2NvbXBpbGVyL2NwcC9DTWFrZUxpc3RzLnR4dAppbmRleCBiYzY1OTFjLi4xN2RhZTQ3IDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvQ01ha2VMaXN0cy50eHQKKysrIGIvY29tcGlsZXIvY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0xNywxMTcgKzE3LDEwNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBXaW5kb3dzIGhhcyBhIGRpZmZlcmVudCBoZWFkZXIKLWlmKE1TVkMpCi0gICAgY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy93aW5kb3dzL3ZlcnNpb24uaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdmVyc2lvbi5oKQotZWxzZSgpCi0gICAgY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3ZlcnNpb24uaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdmVyc2lvbi5oKQotZW5kaWYoKQorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMykKK3Byb2plY3QoInRocmlmdC1jb21waWxlciIgVkVSU0lPTiAke1BBQ0tBR0VfVkVSU0lPTn0pCisKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3ZlcnNpb24uaCkKIAogZmluZF9wYWNrYWdlKEZMRVggUkVRVUlSRUQpCiBmaW5kX3BhY2thZ2UoQklTT04gUkVRVUlSRUQpCiAKKyMgY3JlYXRlIGRpcmVjdG9yeSBmb3IgdGhyaWZ0eSBhbmQgdGhyaWZ0bAorZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0LykKKwogIyBDcmVhdGUgZmxleCBhbmQgYmlzb24gZmlsZXMgYW5kIGJ1aWxkIHRoZSBsaWIgcGFyc2Ugc3RhdGljIGxpYnJhcnkKLUJJU09OX1RBUkdFVCh0aHJpZnR5ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0eS55eSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0eS5jYykKLUZMRVhfVEFSR0VUKHRocmlmdGwgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnRsLmxsICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnRsLmNjKQorQklTT05fVEFSR0VUKHRocmlmdHkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdGhyaWZ0eS55eSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuY2MpCitGTEVYX1RBUkdFVCh0aHJpZnRsICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdGwubGwgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnRsLmNjKQogQUREX0ZMRVhfQklTT05fREVQRU5ERU5DWSh0aHJpZnRsIHRocmlmdHkpCiAKLSMgSEFDSzogV29yayBhcm91bmQgdGhlIGZhY3QgdGhhdCBiaXNvbiBjcmF0ZXMgYSAuaGggZmlsZSBidXQgd2UgbmVlZCBhIC5oIGZpbGUKLWFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdHkuaAotICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnR5LmhoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnR5LmgKLSAgICAgICAgICAgICAgICAgICBERVBFTkRTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnR5LmhoCi0gICAgICAgICAgICAgICAgICAgKQotCi1zZXQobGlicGFyc2VfU09VUkNFUwotICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnR5LmNjCi0gICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdGwuY2MKLSAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0eS5oCitzZXQocGFyc2VfU09VUkNFUworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5oaAogKQogCi1hZGRfbGlicmFyeShsaWJwYXJzZSBTVEFUSUMgJHtsaWJwYXJzZV9TT1VSQ0VTfSkKK2FkZF9saWJyYXJ5KHBhcnNlIFNUQVRJQyAke3BhcnNlX1NPVVJDRVN9KQogCiAjIENyZWF0ZSB0aGUgdGhyaWZ0IGNvbXBpbGVyCi1zZXQoIHRocmlmdF9TT1VSQ0VTIAotICAgIHNyYy9tYWluLmNjCi0gICAgc3JjL21kNS5jCi0gICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCi0gICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKLSAgICBzcmMvZ2xvYmFscy5oCi0gICAgc3JjL21haW4uaAotICAgIHNyYy9wbGF0Zm9ybS5oCi0gICAgc3JjL21kNS5oCi0gICAgc3JjL2F1ZGl0L3RfYXVkaXQuY3BwCi0gICAgc3JjL3BhcnNlL3RfZG9jLmgKLSAgICBzcmMvcGFyc2UvdF90eXBlLmgKLSAgICBzcmMvcGFyc2UvdF9iYXNlX3R5cGUuaAotICAgIHNyYy9wYXJzZS90X2VudW0uaAotICAgIHNyYy9wYXJzZS90X2VudW1fdmFsdWUuaAotICAgIHNyYy9wYXJzZS90X3R5cGVkZWYuaAotICAgIHNyYy9wYXJzZS90X3R5cGVkZWYuY2MKLSAgICBzcmMvcGFyc2UvdF9jb250YWluZXIuaAotICAgIHNyYy9wYXJzZS90X2xpc3QuaAotICAgIHNyYy9wYXJzZS90X3NldC5oCi0gICAgc3JjL3BhcnNlL3RfbWFwLmgKLSAgICBzcmMvcGFyc2UvdF9zdHJ1Y3QuaAotICAgIHNyYy9wYXJzZS90X2ZpZWxkLmgKLSAgICBzcmMvcGFyc2UvdF9zZXJ2aWNlLmgKLSAgICBzcmMvcGFyc2UvdF9mdW5jdGlvbi5oCi0gICAgc3JjL3BhcnNlL3RfcHJvZ3JhbS5oCi0gICAgc3JjL3BhcnNlL3Rfc2NvcGUuaAotICAgIHNyYy9wYXJzZS90X2NvbnN0LmgKLSAgICBzcmMvcGFyc2UvdF9jb25zdF92YWx1ZS5oCi0gICAgc3JjL3BhcnNlL3BhcnNlLmNjCi0gICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgKLSAgICBzcmMvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKLSAgICBzcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oCi0gICAgc3JjL3dpbmRvd3MvY29uZmlnLmgKLSAgICB2ZXJzaW9uLmgKK3NldChjb21waWxlcl9jb3JlCisgICAgc3JjL3RocmlmdC9jb21tb24uY2MKKyAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCisgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MKKyAgICBzcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgKKykKKworc2V0KHRocmlmdC1jb21waWxlcl9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC9tYWluLmNjCisgICAgc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAorKQorCitzZXQodGhyaWZ0X2NvbXBpbGVyX0xBTkdTCiApCiAKICMgVGhpcyBtYWNybyBhZGRzIGFuIG9wdGlvbiBUSFJJRlRfQ09NUElMRVJfJHtOQU1FfQogIyB0aGF0IGFsbG93cyBlbmFibGluZyBvciBkaXNhYmxpbmcgY2VydGFpbiBsYW5ndWFnZXMKIG1hY3JvKFRIUklGVF9BRERfQ09NUElMRVIgbmFtZSBkZXNjcmlwdGlvbiBpbml0aWFsKQogICAgIHN0cmluZyhUT1VQUEVSICJUSFJJRlRfQ09NUElMRVJfJHtuYW1lfSIgZW5hYmxlcikKLSAgICBzZXQoc3JjICJzcmMvZ2VuZXJhdGUvdF8ke25hbWV9X2dlbmVyYXRvci5jYyIpCisgICAgc2V0KHNyYyAic3JjL3RocmlmdC9nZW5lcmF0ZS90XyR7bmFtZX1fZ2VuZXJhdG9yLmNjIikKICAgICBvcHRpb24oJHtlbmFibGVyfSAke2Rlc2NyaXB0aW9ufSAke2luaXRpYWx9KQogICAgIGlmKCR7ZW5hYmxlcn0pCi0gICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdF9TT1VSQ0VTICR7c3JjfSkKKyAgICAgICAgbGlzdChBUFBFTkQgdGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVMgJHtzcmN9KQorICAgICAgICBsaXN0KEFQUEVORCB0aHJpZnRfY29tcGlsZXJfTEFOR1MgJHtuYW1lfSkKICAgICBlbmRpZigpCiBlbmRtYWNybygpCiAKICMgVGhlIGZvbGxvd2luZyBjb21waWxlciBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZAotVEhSSUZUX0FERF9DT01QSUxFUihjX2dsaWIgICJFbmFibGUgY29tcGlsZXIgZm9yIEMgd2l0aCBHbGliIiBPTikKLVRIUklGVF9BRERfQ09NUElMRVIoY3BwICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDKysiIE9OKQotVEhSSUZUX0FERF9DT01QSUxFUihqYXZhICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEiICAgT04pCiBUSFJJRlRfQUREX0NPTVBJTEVSKGFzMyAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQWN0aW9uU2NyaXB0IDMiIE9OKQotVEhSSUZUX0FERF9DT01QSUxFUihoYXhlICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhheGUiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihjX2dsaWIgICJFbmFibGUgY29tcGlsZXIgZm9yIEMgd2l0aCBHbGliIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoY2wgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDb21tb24gTElTUCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGNwcCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQysrIiBPTikKIFRIUklGVF9BRERfQ09NUElMRVIoY3NoYXJwICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDIyIgT04pCi1USFJJRlRfQUREX0NPTVBJTEVSKHB5ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUHl0aG9uIDIuMCIgT04pCi1USFJJRlRfQUREX0NPTVBJTEVSKHJiICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUnVieSIgT04pCi1USFJJRlRfQUREX0NPTVBJTEVSKHBlcmwgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUGVybCIgT04pCi1USFJJRlRfQUREX0NPTVBJTEVSKHBocCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUEhQIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoZCAgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoZGFydCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEYXJ0IiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoZGVscGhpICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEZWxwaGkiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihlcmwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEVybGFuZyIgT04pCi1USFJJRlRfQUREX0NPTVBJTEVSKGNvY29hICAgIkVuYWJsZSBjb21waWxlciBmb3IgQ29jb2EgT2JqZWN0aXZlLUMiIE9OKQotVEhSSUZUX0FERF9DT01QSUxFUihzdCAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFNtYWxsdGFsayIgT04pCi1USFJJRlRfQUREX0NPTVBJTEVSKG9jYW1sICAgIkVuYWJsZSBjb21waWxlciBmb3IgT0NhbWwiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihnbyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEdvIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoZ3YgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBHcmFwaFZpeiIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGhheGUgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGF4ZSIgT04pCiBUSFJJRlRfQUREX0NPTVBJTEVSKGhzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGFza2VsbCIgT04pCi1USFJJRlRfQUREX0NPTVBJTEVSKHhzZCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgWFNEIiBPTikKIFRIUklGVF9BRERfQ09NUElMRVIoaHRtbCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIVE1MIERvY3VtZW50YXRpb24iIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihqYXZhICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEiICAgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGphdmFtZSAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YSBNRSIgT04pCiBUSFJJRlRfQUREX0NPTVBJTEVSKGpzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YVNjcmlwdCIgT04pCiBUSFJJRlRfQUREX0NPTVBJTEVSKGpzb24gICAgIkVuYWJsZSBjb21waWxlciBmb3IgSlNPTiIgT04pCi1USFJJRlRfQUREX0NPTVBJTEVSKGphdmFtZSAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YSBNRSIgT04pCi1USFJJRlRfQUREX0NPTVBJTEVSKGRlbHBoaSAgIkVuYWJsZSBjb21waWxlciBmb3IgRGVscGhpIiBPTikKLVRIUklGVF9BRERfQ09NUElMRVIoZ28gICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBHbyIgT04pCi1USFJJRlRfQUREX0NPTVBJTEVSKGQgICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRCIgT04pCiBUSFJJRlRfQUREX0NPTVBJTEVSKGx1YSAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgTHVhIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIobmV0Y29yZSAiRW5hYmxlIGNvbXBpbGVyIGZvciAuTkVUIENvcmUiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihuZXRzdGQgICJFbmFibGUgY29tcGlsZXIgZm9yIC5ORVQgU3RhbmRhcmQiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihvY2FtbCAgICJFbmFibGUgY29tcGlsZXIgZm9yIE9DYW1sIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIocGVybCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQZXJsIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIocGhwICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQSFAiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihweSAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFB5dGhvbiAyLjAiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihyYiAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1YnkiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihycyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1c3QiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihzdCAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFNtYWxsdGFsayIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHN3aWZ0ICAgIkVuYWJsZSBjb21waWxlciBmb3IgQ29jb2EgU3dpZnQiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUih4bWwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFhNTCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHhzZCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgWFNEIiBPTikKIAogIyBUaHJpZnQgaXMgbG9va2luZyBmb3IgaW5jbHVkZSBmaWxlcyBpbiB0aGUgc3JjIGRpcmVjdG9yeQogIyB3ZSBhbHNvIGFkZCB0aGUgY3VycmVudCBiaW5hcnkgZGlyZWN0b3J5IGZvciBnZW5lcmF0ZWQgZmlsZXMKIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IHNyYykKIAotYWRkX2V4ZWN1dGFibGUodGhyaWZ0LWNvbXBpbGVyICR7dGhyaWZ0X1NPVVJDRVN9KQorbGlzdChBUFBFTkQgdGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVMgJHtjb21waWxlcl9jb3JlfSkKKworYWRkX2V4ZWN1dGFibGUodGhyaWZ0LWNvbXBpbGVyICR7dGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVN9KQorCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGhyaWZ0LWNvbXBpbGVyIFBST1BFUlRJRVMgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZIGJpbi8pCiBzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGhyaWZ0LWNvbXBpbGVyIFBST1BFUlRJRVMgT1VUUFVUX05BTUUgdGhyaWZ0KQogCi10YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0LWNvbXBpbGVyIGxpYnBhcnNlKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdC1jb21waWxlciBwYXJzZSkKIAotaW5zdGFsbChUQVJHRVRTIHRocmlmdC1jb21waWxlciBERVNUSU5BVElPTiAiJHtCSU5fSU5TVEFMTF9ESVJ9IikKK2luc3RhbGwoVEFSR0VUUyB0aHJpZnQtY29tcGlsZXIgREVTVElOQVRJT04gYmluKQorCitpZihCVUlMRF9URVNUSU5HKQorICAgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbSBiL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQppbmRleCAzOGY5ZjlkLi4xNmQ0ZDNhIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvTWFrZWZpbGUuYW0KKysrIGIvY29tcGlsZXIvY3BwL01ha2VmaWxlLmFtCkBAIC0yMSw4OSArMjEsOTAgQEAKICMgUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKICMgZGV0YWlscy4KIAotQU1fWUZMQUdTID0gLWQKLUxJQlMgPQotQlVJTFRfU09VUkNFUyA9IHNyYy90aHJpZnR5LmNjCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMKKworU1VCRElSUyA9IHNyYyAuCitpZiBXSVRIX1RFU1RTCitTVUJESVJTICs9IHRlc3QKK2VuZGlmCiAKIGJpbl9QUk9HUkFNUyA9IHRocmlmdAogCi1ub2luc3RfTElCUkFSSUVTID0gbGlicGFyc2UuYQotCiB0aHJpZnRfT0JKRElSID0gb2JqCiAKLXRocmlmdF9TT1VSQ0VTID0gc3JjL21haW4uY2MgXAotICAgICAgICAgICAgICAgICBzcmMvbWQ1LmMgXAotICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9nbG9iYWxzLmggXAotICAgICAgICAgICAgICAgICBzcmMvbWFpbi5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BsYXRmb3JtLmggXAotICAgICAgICAgICAgICAgICBzcmMvbG9nZ2luZy5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL21kNS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL2F1ZGl0L3RfYXVkaXQuY3BwIFwKLSAgICAgICAgICAgICAgICAgc3JjL2F1ZGl0L3RfYXVkaXQuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2RvYy5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfdHlwZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfYmFzZV90eXBlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9lbnVtLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9lbnVtX3ZhbHVlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF90eXBlZGVmLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF90eXBlZGVmLmNjIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfY29udGFpbmVyLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9saXN0LmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9zZXQuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X21hcC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3Rfc3RydWN0LmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9maWVsZC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3Rfc2VydmljZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfZnVuY3Rpb24uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3Byb2dyYW0uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3Njb3BlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9jb25zdC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfY29uc3RfdmFsdWUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS9wYXJzZS5jYyBcCi0gICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy93aW5kb3dzL2NvbmZpZy5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3dpbmRvd3MvdmVyc2lvbi5oCit0aHJpZnRfU09VUkNFUyA9IHNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29tbW9uLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb21tb24uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dsb2JhbHMuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvbG9nZ2luZy5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9tYWluLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9tYWluLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9kb2MuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9saXN0LmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3NldC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGxhdGZvcm0uaCAKIAogIyBTcGVjaWZpYyBjbGllbnQgZ2VuZXJhdG9yIHNvdXJjZQotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYwordGhyaWZ0X1NPVVJDRVMgKz0gc3JjL3RocmlmdC9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NsX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2d2X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9sdWFfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0c3RkX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0c3RkX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcnNfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N3aWZ0X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeG1sX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwogCiB0aHJpZnRfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKS9zcmMKLXRocmlmdF9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCi10aHJpZnRfTERBREQgPSBATEVYTElCQCBsaWJwYXJzZS5hCi0KLWxpYnBhcnNlX2FfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKS9zcmMKLWxpYnBhcnNlX2FfQ1hYRkxBR1MgPSAtV2FsbCAtV25vLXNpZ24tY29tcGFyZSAtV25vLXVudXNlZAotCi1saWJwYXJzZV9hX1NPVVJDRVMgPSBzcmMvdGhyaWZ0eS55eSBcCi0gICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0bC5sbAordGhyaWZ0X0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgLVdlcnJvcgordGhyaWZ0X0xEQUREID0gQExFWExJQkAgc3JjL3RocmlmdC9saWJwYXJzZS5hCiAKIFdJTkRPV1NfRElTVCA9IFwKICAgICAgICAgICAgICBjb21waWxlci5zbG4gXApAQCAtMTE0LDEyICsxMTUsMTMgQEAKICAgICAgICAgICAgICBjb2Rpbmdfc3RhbmRhcmRzLm1kIFwKICAgICAgICAgICAgICBSRUFETUUubWQgXAogICAgICAgICAgICAgIENNYWtlTGlzdHMudHh0IFwKKyAgICAgICAgICAgICB0ZXN0IFwKICAgICAgICAgICAgICAkKFdJTkRPV1NfRElTVCkKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgdGhyaWZ0bC5jYyB0aHJpZnR5LmNjIHRocmlmdHkuaCB0aHJpZnR5LmhoIHZlcnNpb24uaCB3aW5kb3dzL3ZlcnNpb24uaAorCSQoUk0pIHZlcnNpb24uaAogCi1zcmMvbWFpbi5jYzogdmVyc2lvbi5oCitzcmMvdGhyaWZ0L21haW4uY2M6IHNyYy90aHJpZnQvdmVyc2lvbi5oCiAKIHN0eWxlLWxvY2FsOgogCSQoQ1BQU1RZTEVfQ01EKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL1JFQURNRS5tZCBiL2NvbXBpbGVyL2NwcC9SRUFETUUubWQKaW5kZXggZWExOTVjNy4uNWMwNGNkOCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL1JFQURNRS5tZAorKysgYi9jb21waWxlci9jcHAvUkVBRE1FLm1kCkBAIC0xLDg0ICsxLDE3NSBAQAotIyBCdWlsZCBjb21waWxlciB1c2luZyBDTWFrZQorIyBCdWlsZCBUaHJpZnQgSURMIGNvbXBpbGVyIHVzaW5nIENNYWtlCiAKLVVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorPCEtLSBUT0MgLS0+CiAKLSAgICBta2RpciBjbWFrZS1idWlsZAotICAgIGNkIGNtYWtlLWJ1aWxkCi0gICAgY21ha2UgLi4KLSAgICBtYWtlCistIFtCdWlsZCBUaHJpZnQgSURMIGNvbXBpbGVyIHVzaW5nIENNYWtlXSgjYnVpbGQtdGhyaWZ0LWlkbC1jb21waWxlci11c2luZy1jbWFrZSkKKyAgICAtIFtCdWlsZCBvbiBVbml4LWxpa2UgU3lzdGVtXSgjYnVpbGQtb24tdW5peC1saWtlLXN5c3RlbSkKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlc10oI3ByZXJlcXVpc2l0ZXMpCisgICAgICAgIC0gW0J1aWxkIHVzaW5nIENNYWtlXSgjYnVpbGQtdXNpbmctY21ha2UpCisgICAgICAgICAgICAtIFtCdWlsZCB3aXRoIEVjbGlwc2UgSURFXSgjYnVpbGQtd2l0aC1lY2xpcHNlLWlkZSkKKyAgICAgICAgICAgIC0gW0J1aWxkIHdpdGggWENvZGUgSURFIGluIE1hY09TXSgjYnVpbGQtd2l0aC14Y29kZS1pZGUtaW4tbWFjb3MpCisgICAgICAgICAgICAtIFtVc2FnZSBvZiBvdGhlciBJREVzXSgjdXNhZ2Utb2Ytb3RoZXItaWRlcykKKyAgICAtIFtCdWlsZCBvbiBXaW5kb3dzXSgjYnVpbGQtb24td2luZG93cykKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlc10oI3ByZXJlcXVpc2l0ZXMtMSkKKyAgICAgICAgLSBbQnVpbGQgdXNpbmcgR2l0IEJhc2hdKCNidWlsZC11c2luZy1naXQtYmFzaCkKKyAgICAgICAgLSBbVXNpbmcgVmlzdWFsIFN0dWRpbyBhbmQgV2luIGZsZXgtYmlzb25dKCN1c2luZy12aXN1YWwtc3R1ZGlvLWFuZC13aW4tZmxleC1iaXNvbikKKyAgICAgICAgLSBbQ3Jvc3MgY29tcGlsZSB1c2luZyBtaW5ndzMyIGFuZCBnZW5lcmF0ZSBhIFdpbmRvd3MgSW5zdGFsbGVyIHdpdGggQ1BhY2tdKCNjcm9zcy1jb21waWxlLXVzaW5nLW1pbmd3MzItYW5kLWdlbmVyYXRlLWEtd2luZG93cy1pbnN0YWxsZXItd2l0aC1jcGFjaykKKy0gW090aGVyIGNhc2VzXSgjb3RoZXItY2FzZXMpCisgICAgLSBbQnVpbGRpbmcgdGhlIFRocmlmdCBJREwgY29tcGlsZXIgaW4gV2luZG93cyB3aXRob3V0IENNYWtlXSgjYnVpbGRpbmctdGhlLXRocmlmdC1pZGwtY29tcGlsZXItaW4td2luZG93cy13aXRob3V0LWNtYWtlKQorLSBbVW5pdCB0ZXN0cyBmb3IgY29tcGlsZXJdKCN1bml0LXRlc3RzLWZvci1jb21waWxlcikKKyAgICAtIFtVc2luZyBib29zdCB0ZXN0XSgjdXNpbmctYm9vc3QtdGVzdCkKKyAgICAtIFtVc2luZyBDYXRjaCBDKysgdGVzdCBsaWJyYXJ5XSgjdXNpbmctY2F0Y2gtYy10ZXN0LWxpYnJhcnkpCistIFtIYXZlIGEgSGFwcHkgZnJlZSB0aW1lIGFuZCBob2xpZGF5c10oI2hhdmUtYS1oYXBweS1mcmVlLXRpbWUtYW5kLWhvbGlkYXlzKQogCis8IS0tIC9UT0MgLS0+CiAKLSMjIyBDcmVhdGUgYW4gZWNsaXBzZSBwcm9qZWN0CisjIyBCdWlsZCBvbiBVbml4LWxpa2UgU3lzdGVtCiAKLSAgICBta2RpciBjbWFrZS1lYyAmJiBjZCBjbWFrZS1lYwotICAgIGNtYWtlIC1HICJFY2xpcHNlIENEVDQgLSBVbml4IE1ha2VmaWxlcyIgLi4KLSAgICBtYWtlCisjIyMgUHJlcmVxdWlzaXRlcworLSBJbnN0YWxsIENNYWtlCistIEluc3RhbGwgZmxleCBhbmQgYmlzb24KKworIyMjIEJ1aWxkIHVzaW5nIENNYWtlCisKKy0gR28gdG8gKip0aHJpZnRcY29tcGlsZXJcY3BwKioKKy0gVXNlIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdXNpbmcgY21ha2U6CisKK2BgYAorbWtkaXIgY21ha2UtYnVpbGQgJiYgY2QgY21ha2UtYnVpbGQKK2NtYWtlIC4uCittYWtlCitgYGAKKworIyMjIyBCdWlsZCB3aXRoIEVjbGlwc2UgSURFCisKKy0gR28gdG8gKip0aHJpZnRcY29tcGlsZXJcY3BwKioKKy0gVXNlIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdXNpbmcgY21ha2U6CisKK2BgYAorbWtkaXIgY21ha2UtZWMgJiYgY2QgY21ha2UtZWMKK2NtYWtlIC1HICJFY2xpcHNlIENEVDQgLSBVbml4IE1ha2VmaWxlcyIgLi4KK21ha2UKK2BgYAogCiBOb3cgb3BlbiB0aGUgZm9sZGVyIGNtYWtlLWVjIHVzaW5nIGVjbGlwc2UuCiAKKyMjIyMgQnVpbGQgd2l0aCBYQ29kZSBJREUgaW4gTWFjT1MKKworLSBJbnN0YWxsL3VwZGF0ZSBmbGV4LCBiaXNvbiBhbmQgY21ha2Ugd2l0aCBicmV3CisKK2BgYAorYnJldyBpbnN0YWxsIGNtYWtlCiticmV3IGluc3RhbGwgYmlzb24KK2BgYAorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmU6CisKK2BgYAorbWtkaXIgY21ha2UtYnVpbGQgJiYgY2QgY21ha2UtYnVpbGQKK2NtYWtlIC1HICJYY29kZSIgLi4KK2NtYWtlIC0tYnVpbGQgLgorYGBgCisKKyMjIyMgVXNhZ2Ugb2Ygb3RoZXIgSURFcworCitQbGVhc2UgY2hlY2sgbGlzdCBvZiBzdXBwb3J0ZWQgSURFIAorCitgYGAKK2NtYWtlIC0taGVscAorYGBgCisKKyMjIEJ1aWxkIG9uIFdpbmRvd3MKKworIyMjIFByZXJlcXVpc2l0ZXMKKy0gSW5zdGFsbCBDTWFrZSAtIGh0dHBzOi8vY21ha2Uub3JnL2Rvd25sb2FkLworLSBJbiBjYXNlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHdpdGhvdXQgR2l0IEJhc2ggLSBpbnN0YWxsIHdpbmZsZXhiaXNvbiAtIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi8KKy0gSW4gY2FzZSBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIFZpc3VhbCBTdHVkaW8gLSBpbnN0YWxsIFZpc3VhbCBTdHVkaW8gCisgIC0gQmV0dGVyIHRvIHVzZSB0aGUgbGF0ZXN0IHN0YWJsZSBWaXN1YWwgU3R1ZGlvIENvbW11bml0eSBFZGl0aW9uIC0gaHR0cHM6Ly93d3cudmlzdWFsc3R1ZGlvLmNvbS92cy93aGF0c25ldy8gKGVuc3VyZSB0aGF0IHlvdSBpbnN0YWxsZWQgd29ya2xvYWQgIkRlc2t0b3AgRGV2ZWxvcG1lbnQgd2l0aCBDKysiIGZvciBWUzIwMTcpIC0gTWljcm9zb2Z0IGFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgQ01ha2UgYW5kIGltcHJvdmluZyBpdCBpbiBWaXN1YWwgU3R1ZGlvCisKKyMjIyBCdWlsZCB1c2luZyBHaXQgQmFzaAorCitHaXQgQmFzaCBwcm92aWRlcyBmbGV4IGFuZCBiaXNvbgorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorCitgYGAKK21rZGlyIGNtYWtlLXZzICYmIGNkIGNtYWtlLXZzCitjbWFrZSAtRFdJVEhfU0hBUkVEX0xJQj1vZmYgLi4KK2NtYWtlIC0tYnVpbGQgLgorYGBgCisKKyMjIyBVc2luZyBWaXN1YWwgU3R1ZGlvIGFuZCBXaW4gZmxleC1iaXNvbgorCistIEdlbmVyYXRlIGEgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZvciB2ZXJzaW9uIG9mIFZpc3VhbCBTdHVkaW8gd2hpY2ggeW91IGhhdmUgKCoqY21ha2UgLS1oZWxwKiogY2FuIHNob3cgbGlzdCBvZiBzdXBwb3J0YWJsZSBWUyB2ZXJzaW9ucyk6CistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmU6CitgYGAKK21rZGlyIGNtYWtlLXZzCitjZCBjbWFrZS12cworY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTUgMjAxNyIgLi4KK2BgYAorLSBOb3cgb3BlbiB0aGUgZm9sZGVyIGNtYWtlLXZzIHVzaW5nIFZpc3VhbCBTdHVkaW8uCiAKICMjIyBDcm9zcyBjb21waWxlIHVzaW5nIG1pbmd3MzIgYW5kIGdlbmVyYXRlIGEgV2luZG93cyBJbnN0YWxsZXIgd2l0aCBDUGFjawogCi0gICAgbWtkaXIgY21ha2UtbWluZ3czMiAmJiBjZCBjbWFrZS1taW5ndzMyCi0gICAgY21ha2UgLURDTUFLRV9UT09MQ0hBSU5fRklMRT0uLi9idWlsZC9jbWFrZS9taW5ndzMyLXRvb2xjaGFpbi5jbWFrZSAtREJVSUxEX0NPTVBJTEVSPU9OIC1EQlVJTERfTElCUkFSSUVTPU9GRiAtREJVSUxEX1RFU1RJTkc9T0ZGIC1EQlVJTERfRVhBTVBMRVM9T0ZGIC4uCi0gICAgY3BhY2sKLQotIyMgQnVpbGQgb24gd2luZG93cwotCi0jIyMgdXNpbmcgR2l0IEJhc2gKLUdpdCBCYXNoIHByb3ZpZGVzIGZsZXggYW5kIGJpc29uLCBzbyB5b3UganVzdCBuZWVkIHRvIGRvIHRoaXM6Ci0KLSAgICBta2RpciBjbWFrZS12cyAmJiBjZCBjbWFrZS12cwotICAgIGNtYWtlIC1EV0lUSF9TSEFSRURfTElCPW9mZiAuLgotCi0jIyMgdXNpbmcgV2luIGZsZXgtYmlzb24KLQotSW4gb3JkZXIgdG8gYnVpbGQgb24gd2luZG93cyB3aXRoIHdpbmZsZXhiaXNvbiBhIGZldyBhZGRpdGlvbmFsIHN0ZXBzIGFyZSBuZWNlc3Nhcnk6Ci0KLTEuIERvd25sb2FkIHdpbmZsZXhiaXNvbiBmcm9tIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvd2luZmxleGJpc29uLwotMi4gRXh0cmFjdCB0aGUgd2luZmxleCBiaXNvbiBmaWxlcyB0byBmb3IgZS5nLiBDOlx3aW5mbGV4Ymlzb24KLTMuIE1ha2UgdGhlIENNYWtlIHZhcmlhYmxlcyBwb2ludCB0byB0aGUgY29ycmVjdCBiaW5hcmllcy4KLSAgKiBGTEVYX0VYRUNVVEFCTEUgPSBDOi93aW5idWlsZC93aW5fZmxleC5leGUKLSAgKiBCSVNPTl9FWEVDVVRBQkxFID0gQzovd2luYnVpbGQvd2luX2Jpc29uLmV4ZQotNC4gR2VuZXJhdGUgYSBWaXN1YWwgU3R1ZGlvIHByb2plY3Q6CiBgYGAKLW1rZGlyIGNtYWtlLXZzICYmIGNkIGNtYWtlLXZzCi1jbWFrZSAtRyAiVmlzdWFsIFN0dWRpbyAxMiIgLURXSVRIX1NIQVJFRF9MSUI9b2ZmIC4uCitta2RpciBjbWFrZS1taW5ndzMyICYmIGNkIGNtYWtlLW1pbmd3MzIKK2NtYWtlIC1EQ01BS0VfVE9PTENIQUlOX0ZJTEU9Li4vYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UgLURCVUlMRF9DT01QSUxFUj1PTiAtREJVSUxEX0xJQlJBUklFUz1PRkYgLURCVUlMRF9URVNUSU5HPU9GRiAuLgorY3BhY2sKIGBgYAotNS4gTm93IG9wZW4gdGhlIGZvbGRlciBidWlsZF92cyB1c2luZyBWaXN1YWwgU3R1ZGlvIDIwMTMuCiAKLSMgQnVpbGRpbmcgdGhlIFRocmlmdCBJREwgY29tcGlsZXIgaW4gV2luZG93cworIyBPdGhlciBjYXNlcwogCi1JZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgQ01ha2UgeW91IGNhbiB1c2UgdGhlIGFscmVhZHkgYXZhaWxhYmxlIFZpc3VhbCBTdHVkaW8KLTIwMTAgc29sdXRpb24uCi1UaGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGNvbnRhaW5zIHByZS1idWlsZCBjb21tYW5kcyB0byBnZW5lcmF0ZSB0aGUKLXRocmlmdGwuY2MsIHRocmlmdHkuY2MgYW5kIHRocmlmdHkuaGggZmlsZXMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBidWlsZAotdGhlIGNvbXBpbGVyLiBUaGVzZSBkZXBlbmQgb24gYmlzb24sIGZsZXggYW5kIHRoZWlyIGRlcGVuZGVuY2llcyB0bwotd29yayBwcm9wZXJseS4gSWYgdGhpcyBkb2Vzbid0IHdvcmsgb24gYSBzeXN0ZW0sIHRyeSB0aGVzZSBtYW51YWwKLXByZS1idWlsZCBzdGVwcy4KKyMjIEJ1aWxkaW5nIHRoZSBUaHJpZnQgSURMIGNvbXBpbGVyIGluIFdpbmRvd3Mgd2l0aG91dCBDTWFrZQogCi1PcGVuIGNvbXBpbGVyLnNsbiBhbmQgcmVtb3ZlIHRoZSBQcmUtYnVpbGQgY29tbWFuZHMgdW5kZXIgdGhlIHByb2plY3QncwotIFByb3BlcnRpZXMgLT4gQnVpbGQgRXZlbnRzIC0+IFByZS1CdWlsZCBFdmVudHMuCitJZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgQ01ha2UgeW91IGNhbiB1c2UgdGhlIGFscmVhZHkgYXZhaWxhYmxlIFZpc3VhbCBTdHVkaW8gMjAxMCBzb2x1dGlvbi4KIAotRG93bmxvYWQgZmxleCAmIGJpc29uIGZyb20gaHR0cDovL2phaXNhbnRvbnlrLndvcmRwcmVzcy5jb20vMjAwOC8wMy8xNi9sZXgtYW5kLXlhY2NiaXNvbi1pbi13aW5kb3dzLwotRG93bmxvYWQgYmlzb24uc2ltcGxlIGluIGFkZGl0aW9uIHRvIGJpc29uLmV4ZSAuIFRoaXMgYnVpbGQgb2YgYmlzb24gaXMgZWFzaWVyIHRvIHVzZQotdGhhbiB0aGUgb25lIG9uIHNvdXJjZWZvcmdlIHdoaWNoIGhhcyBhIG15cmlhZCBvZiBkZXBlbmRlbmNpZXMuCi1QbGFjZSB0aGVzZSBiaW5hcmllcyBzb21ld2hlcmUgaW4gdGhlIHBhdGguCitUaGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGNvbnRhaW5zIHByZS1idWlsZCBjb21tYW5kcyB0byBnZW5lcmF0ZSB0aGUgdGhyaWZ0bC5jYywgdGhyaWZ0eS5jYyBhbmQgdGhyaWZ0eS5oaCBmaWxlcyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGJ1aWxkIHRoZSBjb21waWxlci4gCisKK1RoZXNlIGRlcGVuZCBvbiBiaXNvbiwgZmxleCBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzIHRvIHdvcmsgcHJvcGVybHkuCisKK0Rvd25sb2FkIGZsZXggJiBiaXNvbiBhcyBkZXNjcmliZWQgYWJvdmUuIAorCitQbGFjZSB0aGVzZSBiaW5hcmllcyBzb21ld2hlcmUgaW4gdGhlIHBhdGggYW5kIHJlbmFtZSB3aW5fZmxleC5leGUgYW5kIHdpbl9iaXNvbi5leGUgdG8gZmxleC5leGUgYW5kIGJpc29uLmV4ZSByZXNwZWN0aXZlbHkuCisKK0lmIHRoaXMgZG9lc24ndCB3b3JrIG9uIGEgc3lzdGVtLCB0cnkgdGhlc2UgbWFudWFsIHByZS1idWlsZCBzdGVwcy4KKworT3BlbiBjb21waWxlci5zbG4gYW5kIHJlbW92ZSB0aGUgUHJlLWJ1aWxkIGNvbW1hbmRzIHVuZGVyIHRoZSBwcm9qZWN0J3M6IFByb3BlcnRpZXMgLT4gQnVpbGQgRXZlbnRzIC0+IFByZS1CdWlsZCBFdmVudHMuCiAKIEZyb20gYSBjb21tYW5kIHByb21wdDoKLT4gY2QgdGhyaWZ0L2NvbXBpbGVyL2NwcAotPiBmbGV4IC1vc3JjXHRocmlmdGwuY2Mgc3JjXHRocmlmdGwubGwKK2BgYAorY2QgdGhyaWZ0L2NvbXBpbGVyL2NwcAorZmxleCAtbyBzcmNcdGhyaWZ0XHRocmlmdGwuY2Mgc3JjXHRocmlmdFx0aHJpZnRsLmxsCitgYGAKIEluIHRoZSBnZW5lcmF0ZWQgdGhyaWZ0bC5jYywgY29tbWVudCBvdXQgI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiBQbGFjZSBhIGNvcHkgb2YgYmlzb24uc2ltcGxlIGluIHRocmlmdC9jb21waWxlci9jcHAKLT4gYmlzb24gLXkgLW8gInNyYy90aHJpZnR5LmNjIiAtLWRlZmluZXMgc3JjL3RocmlmdHkueXkKLT4gbW92ZSBzcmNcdGhyaWZ0eS5jYy5oaCAgc3JjXHRocmlmdHkuaGgKK2BgYAorYmlzb24gLXkgLW8gInNyYy90aHJpZnQvdGhyaWZ0eS5jYyIgLS1kZWZpbmVzIHNyYy90aHJpZnQvdGhyaWZ0eS55eQorbW92ZSBzcmNcdGhyaWZ0XHRocmlmdHkuY2MuaGggIHNyY1x0aHJpZnRcdGhyaWZ0eS5oaAorYGBgCiAKIEJpc29uIG1pZ2h0IGdlbmVyYXRlIHRoZSB5YWNjIGhlYWRlciBmaWxlICJ0aHJpZnR5LmNjLmgiIHdpdGgganVzdCBvbmUgaCAiLmgiIGV4dGVuc2lvbjsgaW4gdGhpcyBjYXNlIHlvdSdsbCBoYXZlIHRvIHJlbmFtZSB0byAidGhyaWZ0eS5oIi4KIAotPiBtb3ZlIHNyY1x3aW5kb3dzXHZlcnNpb24uaC5pbiBzcmNcd2luZG93c1x2ZXJzaW9uLmgKK2BgYAorbW92ZSBzcmNcdGhyaWZ0XHZlcnNpb24uaC5pbiBzcmNcdGhyaWZ0XHZlcnNpb24uaAorYGBgCiAKIERvd25sb2FkIGludHR5cGVzLmggZnJvbSB0aGUgaW50ZXJ3ZWJzIGFuZCBwbGFjZSBpdCBpbiBhbiBpbmNsdWRlIHBhdGgKIGxvY2F0aW9uIChlLmcuIHRocmlmdC9jb21waWxlci9jcHAvc3JjKS4KIAogQnVpbGQgdGhlIGNvbXBpbGVyIGluIFZpc3VhbCBTdHVkaW8uCisKKyMgVW5pdCB0ZXN0cyBmb3IgY29tcGlsZXIKKworIyMgVXNpbmcgYm9vc3QgdGVzdAorLSBwbHMgY2hlY2sgKip0ZXN0KiogZm9sZGVyCisKKyMjIFVzaW5nIENhdGNoIEMrKyB0ZXN0IGxpYnJhcnkKKworQWRkZWQgZ2VuZXJpYyB3YXkgdG8gY292ZXIgY29kZSBieSB0ZXN0cyBmb3IgbWFueSBsYW5ndWFnZXMgKHlvdSBqdXN0IG5lZWQgdG8gbWFrZSBhIGNvcnJlY3QgaGVhZGVyIGZpbGUgZm9yIGdlbmVyYXRvciBmb3IgeW91ciBsYW5ndWFnZSAtIGV4YW1wbGUgaW4gKipuZXRjb3JlKiogaW1wbGVtZW50YXRpb24pCisKKy0gcGxzIGNoZWNrICoqdGVzdHMqKiBmb2xkZXIKKworIyBIYXZlIGEgSGFwcHkgZnJlZSB0aW1lIGFuZCBob2xpZGF5cyAKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2oKaW5kZXggYzA4ZWRmMi4uMDZjNGViNCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2oKKysrIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2oKQEAgLTE5LDc1ICsxOSw4MSBAQAogICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGF1ZGl0XHRfYXVkaXQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2dlbmVyYXRvci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9vb3BfZ2VuZXJhdG9yLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9odG1sX2dlbmVyYXRvci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdsb2JhbHMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xtYWluLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcbWQ1LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9iYXNlX3R5cGUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2NvbnN0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9jb25zdF92YWx1ZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfY29udGFpbmVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9kb2MuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2VudW0uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2VudW1fdmFsdWUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2ZpZWxkLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9mdW5jdGlvbi5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfbGlzdC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfbWFwLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9wcm9ncmFtLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9zY29wZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfc2VydmljZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfc2V0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9zdHJ1Y3QuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3R5cGUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3R5cGVkZWYuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwbGF0Zm9ybS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdHkuaGgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcd2luZG93c1xjb25maWcuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x3aW5kb3dzXHZlcnNpb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXVkaXRcdF9hdWRpdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb21tb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9nZW5lcmF0b3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9vb3BfZ2VuZXJhdG9yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfaHRtbF9nZW5lcmF0b3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2xvYmFscy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxtYWluLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfYmFzZV90eXBlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfY29uc3QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9jb25zdF92YWx1ZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2NvbnRhaW5lci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2RvYy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2VudW0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9lbnVtX3ZhbHVlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfZmllbGQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9mdW5jdGlvbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2xpc3QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9tYXAuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9wcm9ncmFtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfc2NvcGUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9zZXJ2aWNlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfc2V0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfc3RydWN0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfdHlwZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3R5cGVkZWYuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGxhdGZvcm0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdGhyaWZ0eS5oaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xjb25maWcuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdmVyc2lvbi5oIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xhdWRpdFx0X2F1ZGl0LmNwcCIvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfYXMzX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2NvY29hX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2NwcF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfY19nbGliX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2RfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZGVscGhpX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2VybF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9nb19nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9ndl9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9oYXhlX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2hzX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfamF2YW1lX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2phdmFfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfanNfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfanNvbl9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9sdWFfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfb2NhbWxfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcGVybF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9waHBfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcHlfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcmJfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfc3RfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfeHNkX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xtYWluLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXG1kNS5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHBhcnNlXHBhcnNlLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfdHlwZWRlZi5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRsLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdHkuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGF1ZGl0XHRfYXVkaXQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb21tb24uY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfYXMzX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NsX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9jcHBfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NzaGFycF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZGFydF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZGVscGhpX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9lcmxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9nb19nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ3ZfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2hheGVfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2hzX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9odG1sX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9qYXZhX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2pzX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9qc29uX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9sdWFfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X25ldGNvcmVfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X25ldHN0ZF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfb2NhbWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3BlcmxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3BocF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfcHlfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3JiX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9yc19nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfc3RfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3N3aWZ0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF94bWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3hzZF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XG1haW4uY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHBhcnNlLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3R5cGVkZWYuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdGwuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdHkuY2MiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRsLmxsIiAvPgotICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnR5Lnl5IiAvPgorICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRcdGhyaWZ0bC5sbCIgLz4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdHkueXkiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CiAgICAgPFByb2plY3RHdWlkPns4OTk3NUExQS1GNzk5LTQ1NTYtOThCOC02NEUzMEFCMzlBOTB9PC9Qcm9qZWN0R3VpZD4KQEAgLTE2NCw3ICsxNzAsNyBAQAogICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KICAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KICAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtNSU5HVztZWV9OT19VTklTVERfSDtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz5jb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xjb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgogICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDcHA8L0NvbXBpbGVBcz4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KQEAgLTE3Miw4ICsxNzgsNyBAQAogICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CiAgICAgPC9MaW5rPgogICAgIDxQcmVCdWlsZEV2ZW50PgotICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0bC5sbAotYmlzb24gLXkgLW8gInNyY1x0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyYy90aHJpZnR5LmhoIiBzcmMvdGhyaWZ0eS55eTwvQ29tbWFuZD4KKyAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0L3RocmlmdGwubGwgJmFtcDsmYW1wOyBiaXNvbiAteSAtbyAic3JjXFx0aHJpZnRcXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjXFx0aHJpZnRcXHRocmlmdHkuaGgiIHNyYy90aHJpZnQvdGhyaWZ0eS55eTwvQ29tbWFuZD4KICAgICA8L1ByZUJ1aWxkRXZlbnQ+CiAgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KICAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4KQEAgLTE4Myw3ICsxODgsNyBAQAogICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KICAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KICAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtNSU5HVztZWV9OT19VTklTVERfSDtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz5jb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xjb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgogICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDcHA8L0NvbXBpbGVBcz4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KQEAgLTE5MSw4ICsxOTYsNyBAQAogICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CiAgICAgPC9MaW5rPgogICAgIDxQcmVCdWlsZEV2ZW50PgotICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXHRocmlmdGwuY2MiIHNyYy90aHJpZnRsLmxsCi1iaXNvbiAteSAtbyAic3JjXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjL3RocmlmdHkuaGgiIHNyYy90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgogICAgIDwvUHJlQnVpbGRFdmVudD4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KQEAgLTIwNCw4ICsyMDgsOSBAQAogICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgogICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CiAgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TUlOR1c7WVlfTk9fVU5JU1REX0g7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+Y29uZmlnLmg8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+dGhyaWZ0XHdpbmRvd3NcY29uZmlnLmg8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KICAgICAgIDxDb21waWxlQXM+Q29tcGlsZUFzQ3BwPC9Db21waWxlQXM+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPExpbms+CiAgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KQEAgLTIxNCw4ICsyMTksNyBAQAogICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CiAgICAgPC9MaW5rPgogICAgIDxQcmVCdWlsZEV2ZW50PgotICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXHRocmlmdGwuY2MiIHNyYy90aHJpZnRsLmxsCi1iaXNvbiAteSAtbyAic3JjXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjL3RocmlmdHkuaGgiIHNyYy90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgogICAgIDwvUHJlQnVpbGRFdmVudD4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CkBAIC0yMjcsOCArMjMxLDkgQEAKICAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KICAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgogICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO01JTkdXO1lZX05PX1VOSVNURF9IO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPmNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CiAgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0NwcDwvQ29tcGlsZUFzPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgogICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CkBAIC0yMzcsMTEgKzI0MiwxMCBAQAogICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CiAgICAgPC9MaW5rPgogICAgIDxQcmVCdWlsZEV2ZW50PgotICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXHRocmlmdGwuY2MiIHNyYy90aHJpZnRsLmxsCi1iaXNvbiAteSAtbyAic3JjXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjL3RocmlmdHkuaGgiIHNyYy90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgogICAgIDwvUHJlQnVpbGRFdmVudD4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgogICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgogICA8L0ltcG9ydEdyb3VwPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qLmZpbHRlcnMgYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvai5maWx0ZXJzCmluZGV4IDdmZjY5YjcuLjVhNTc1ODkgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qLmZpbHRlcnMKKysrIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2ouZmlsdGVycwpAQCAtMTYsNyArMTYsNiBAQAogICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdsb2JhbHMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xtYWluLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcbWQ1LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9iYXNlX3R5cGUuaCI+CiAgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CkBAIC0xMTEsNiArMTEwLDkgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2RfZ2VuZXJhdG9yLmNjIj4KICAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2RhcnRfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2RlbHBoaV9nZW5lcmF0b3IuY2MiPgogICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtMTU5LDE0ICsxNjEsMzQgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3JiX2dlbmVyYXRvci5jYyI+CiAgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9uZXRjb3JlX2dlbmVyYXRvci5oIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X25ldHN0ZF9nZW5lcmF0b3IuaCI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9uZXRjb3JlX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9uZXRzdGRfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3JzX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9zdF9nZW5lcmF0b3IuY2MiPgogICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfc3dpZnRfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3hzZF9nZW5lcmF0b3IuY2MiPgogICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfeG1sX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcbWFpbi5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xtZDUuYyIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xwYXJzZVxwYXJzZS5jYyI+CiAgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CkBAIC0xODYsNCArMjA4LDQgQEAKICAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0bC5sbCIgLz4KICAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0eS55eSIgLz4KICAgPC9JdGVtR3JvdXA+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9NYWtlZmlsZS5hbSBiL2NvbXBpbGVyL2NwcC9zcmMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxMzllMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjCisjIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisjIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisjIGRldGFpbHMuCisKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cworCitBTV9ZRkxBR1MgPSAtZAorCitCVUlMVF9TT1VSQ0VTID0gdGhyaWZ0L3RocmlmdHkuY2MKKworbm9pbnN0X0xJQlJBUklFUyA9IHRocmlmdC9saWJwYXJzZS5hCisKK3RocmlmdF9saWJwYXJzZV9hX0NQUEZMQUdTID0gLUkkKHNyY2RpcikKK3RocmlmdF9saWJwYXJzZV9hX0NYWEZMQUdTID0gLVdhbGwgLVduby1zaWduLWNvbXBhcmUgLVduby11bnVzZWQKKwordGhyaWZ0X2xpYnBhcnNlX2FfU09VUkNFUyA9IHRocmlmdC90aHJpZnR5Lnl5IFwKKyAgICAgICAgICAgICAgICAgICAgIHRocmlmdC90aHJpZnRsLmxsCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIHRocmlmdC90aHJpZnRsLmNjIHRocmlmdC90aHJpZnR5LmNjIHRocmlmdC90aHJpZnR5LmggdGhyaWZ0L3RocmlmdHkuaGgKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvYXVkaXQvdF9hdWRpdC5jcHAgYi9jb21waWxlci9jcHAvc3JjL2F1ZGl0L3RfYXVkaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNiZDVlLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvYXVkaXQvdF9hdWRpdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NjYgKzAsMCBAQAotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotLy8gQ2FyZWZ1bDogbXVzdCBpbmNsdWRlIGdsb2JhbHMgZmlyc3QgZm9yIGV4dGVybiBkZWZpbml0aW9ucwotI2luY2x1ZGUgImdsb2JhbHMuaCIKLQotI2luY2x1ZGUgInBhcnNlL3RfcHJvZ3JhbS5oIgotI2luY2x1ZGUgInBhcnNlL3Rfc2NvcGUuaCIKLSNpbmNsdWRlICJwYXJzZS90X2NvbnN0LmgiCi0jaW5jbHVkZSAicGFyc2UvdF9maWVsZC5oIgotCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0jaW5jbHVkZSAidF9hdWRpdC5oIgotCi1leHRlcm4gaW50IGdfd2FybjsKLWV4dGVybiBzdGQ6OnN0cmluZyBnX2N1cnBhdGg7Ci1leHRlcm4gYm9vbCBnX3JldHVybl9mYWlsdXJlOwotCi12b2lkIHRocmlmdF9hdWRpdF93YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgIGlmIChnX3dhcm4gPCBsZXZlbCkgewotICAgICAgcmV0dXJuOwotICAgfQotICAgdmFfbGlzdCBhcmdzOwotICAgcHJpbnRmKCJbVGhyaWZ0IEF1ZGl0IFdhcm5pbmc6JXNdICIsIGdfY3VycGF0aC5jX3N0cigpKTsKLSAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gICB2cHJpbnRmKGZtdCwgYXJncyk7Ci0gICB2YV9lbmQoYXJncyk7Ci0gICBwcmludGYoIlxuIik7Ci19Ci0KLXZvaWQgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgdmFfbGlzdCBhcmdzOwotICBmcHJpbnRmKHN0ZGVyciwgIltUaHJpZnQgQXVkaXQgRmFpbHVyZTolc10gIiwgZ19jdXJwYXRoLmNfc3RyKCkpOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLSAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICBnX3JldHVybl9mYWlsdXJlID0gdHJ1ZTsKLX0KLQotdm9pZCBjb21wYXJlX25hbWVzcGFjZSh0X3Byb2dyYW0qIG5ld1Byb2dyYW0sIHRfcHJvZ3JhbSogb2xkUHJvZ3JhbSkKLXsKLSAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIG5ld05hbWVzcGFjZU1hcCA9IG5ld1Byb2dyYW0tPmdldF9hbGxfbmFtZXNwYWNlcygpOwotICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgb2xkTmFtZXNwYWNlTWFwID0gb2xkUHJvZ3JhbS0+Z2V0X2FsbF9uYW1lc3BhY2VzKCk7Ci0KLSAgIGZvcihzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBvbGROYW1lc3BhY2VNYXBJdCA9IG9sZE5hbWVzcGFjZU1hcC5iZWdpbigpOwotICAgICAgICAgb2xkTmFtZXNwYWNlTWFwSXQgIT0gb2xkTmFtZXNwYWNlTWFwLmVuZCgpOwotICAgICAgICAgb2xkTmFtZXNwYWNlTWFwSXQrKykKLSAgIHsKLSAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG5ld05hbWVzcGFjZU1hcEl0ID0gbmV3TmFtZXNwYWNlTWFwLmZpbmQob2xkTmFtZXNwYWNlTWFwSXQtPmZpcnN0KTsKLSAgICAgIGlmKG5ld05hbWVzcGFjZU1hcEl0ID09IG5ld05hbWVzcGFjZU1hcC5lbmQoKSkKLSAgICAgIHsKLSAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJMYW5ndWFnZSAlcyBub3QgZm91bmQgaW4gbmV3IHRocmlmdCBmaWxlXG4iLCAob2xkTmFtZXNwYWNlTWFwSXQtPmZpcnN0KS5jX3N0cigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoKG5ld05hbWVzcGFjZU1hcEl0LT5zZWNvbmQpICE9IG9sZE5hbWVzcGFjZU1hcEl0LT5zZWNvbmQpCi0gICAgICB7Ci0gICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiTmFtZXNwYWNlICVzIGNoYW5nZWQgaW4gbmV3IHRocmlmdCBmaWxlXG4iLCAob2xkTmFtZXNwYWNlTWFwSXQtPnNlY29uZCkuY19zdHIoKSk7Ci0gICAgICB9Ci0gICB9Ci19Ci0KLXZvaWQgY29tcGFyZV9lbnVtX3ZhbHVlcyh0X2VudW0qIG5ld0VudW0sdF9lbnVtKiBvbGRFbnVtKQotewotICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIG9sZEVudW1WYWx1ZXMgPSBvbGRFbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gICBmb3Ioc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIG9sZEVudW1WYWx1ZXNJdCA9IG9sZEVudW1WYWx1ZXMuYmVnaW4oKTsKLSAgICAgICAgIG9sZEVudW1WYWx1ZXNJdCAhPSBvbGRFbnVtVmFsdWVzLmVuZCgpOwotICAgICAgICAgb2xkRW51bVZhbHVlc0l0KyspCi0gICB7Ci0gICAgICBpbnQgZW51bVZhbHVlID0gKCpvbGRFbnVtVmFsdWVzSXQpLT5nZXRfdmFsdWUoKTsKLSAgICAgIHRfZW51bV92YWx1ZSogbmV3RW51bVZhbHVlID0gbmV3RW51bS0+Z2V0X2NvbnN0YW50X2J5X3ZhbHVlKGVudW1WYWx1ZSk7Ci0gICAgICBpZihuZXdFbnVtVmFsdWUgIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHN0ZDo6c3RyaW5nIGVudW1OYW1lID0gKCpvbGRFbnVtVmFsdWVzSXQpLT5nZXRfbmFtZSgpOwotICAgICAgICAgaWYoZW51bU5hbWUgIT0gbmV3RW51bVZhbHVlLT5nZXRfbmFtZSgpKQotICAgICAgICAgewotICAgICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIk5hbWUgb2YgdGhlIHZhbHVlICVkIGNoYW5nZWQgaW4gZW51bSAlc1xuIiwgZW51bVZhbHVlLCBvbGRFbnVtLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgICAgICAgfSAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIkVudW0gdmFsdWUgJWQgbWlzc2luZyBpbiAlc1xuIiwgZW51bVZhbHVlLCBvbGRFbnVtLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgICAgfQotCi0gICB9Ci19Ci0KLXZvaWQgY29tcGFyZV9lbnVtcyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgbmV3RW51bUxpc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBvbGRFbnVtTGlzdCkKLXsKLSAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLHRfZW51bSo+IG5ld0VudW1NYXA7Ci0gICBzdGQ6OnZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgbmV3RW51bUl0OwotICAgZm9yKG5ld0VudW1JdCA9IG5ld0VudW1MaXN0LmJlZ2luKCk7IG5ld0VudW1JdCAhPSBuZXdFbnVtTGlzdC5lbmQoKTsgbmV3RW51bUl0KyspCi0gICB7Ci0gICAgICBuZXdFbnVtTWFwWygqbmV3RW51bUl0KS0+Z2V0X25hbWUoKV0gPSAqbmV3RW51bUl0OwotICAgfQotICAgc3RkOjp2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIG9sZEVudW1JdDsKLSAgIGZvcihvbGRFbnVtSXQgPSBvbGRFbnVtTGlzdC5iZWdpbigpOyBvbGRFbnVtSXQgIT0gb2xkRW51bUxpc3QuZW5kKCk7IG9sZEVudW1JdCsrKQotICAgewotICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsdF9lbnVtKj46Oml0ZXJhdG9yIG5ld0VudW1NYXBJdDsKLSAgICAgIG5ld0VudW1NYXBJdCA9IG5ld0VudW1NYXAuZmluZCgoKm9sZEVudW1JdCktPmdldF9uYW1lKCkpOwotCi0gICAgICBpZihuZXdFbnVtTWFwSXQgPT0gbmV3RW51bU1hcC5lbmQoKSkKLSAgICAgIHsKLSAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJFbnVtICVzIG5vdCBmb3VuZCBpbiBuZXcgdGhyaWZ0IGZpbGVcbiIsKCpvbGRFbnVtSXQpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgY29tcGFyZV9lbnVtX3ZhbHVlcyhuZXdFbnVtTWFwSXQtPnNlY29uZCwgKm9sZEVudW1JdCk7Ci0gICAgICB9Ci0gICB9Ci19Ci0KLS8vVGhpcyBmdW5jdGlvbiByZXR1cm5zICd0cnVlJyBpZiB0aGUgdHdvIGFyZ3VlbWVudHMgYXJlIG9mIHNhbWUgdHlwZXMuCi0vL1JldHVybnMgZmFsc2UgaWYgdGhleSBhcmUgb2YgZGlmZmVyZW50IHR5cGUKLWJvb2wgY29tcGFyZV90eXBlKHRfdHlwZSogbmV3VHlwZSwgdF90eXBlKiBvbGRUeXBlKQotewotICAgLy9Db21wYXJpbmcgbmFtZXMgb2YgdHdvIHR5cGVzIHdpbGwgd29yayB3aGVuIHRoZSBuZXdUeXBlIGFuZCBvbGRUeXBlIGFyZSBiYXNpYyB0eXBlcyBvciBzdHJ1Y3RzIG9yIGVudW1zLgotICAgLy9Ib3dldmVyLCB3aGVuIHRoZXkgYXJlIGNvbnRhaW5lcnMsIGdldF9uYW1lKCkgcmV0dXJucyBlbXB0eSBmb3Igd2hpY2ggd2UgaGF2ZSB0byBjb21wYXJlIHRoZSB0eXBlIG9mIAotICAgLy90aGVpciBlbGVtZW50cyBhcyB3ZWxsLgotICAgaWYoKG5ld1R5cGUtPmdldF9uYW1lKCkpLmVtcHR5KCkgJiYgKG9sZFR5cGUtPmdldF9uYW1lKCkpLmVtcHR5KCkpCi0gICB7Ci0KLSAgICAgIGlmKG5ld1R5cGUtPmlzX2xpc3QoKSAmJiBvbGRUeXBlLT5pc19saXN0KCkpCi0gICAgICB7Ci0gICAgICAgICB0X3R5cGUqIG5ld0VsZW1lbnRUeXBlID0gKCh0X2xpc3QqKW5ld1R5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgICB0X3R5cGUqIG9sZEVsZW1lbnRUeXBlID0gKCh0X2xpc3QqKW9sZFR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgICByZXR1cm4gY29tcGFyZV90eXBlKG5ld0VsZW1lbnRUeXBlLCBvbGRFbGVtZW50VHlwZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKG5ld1R5cGUtPmlzX21hcCgpICYmIG9sZFR5cGUtPmlzX21hcCgpKQotICAgICAgewotICAgICAgICAgdF90eXBlKiBuZXdLZXlUeXBlID0gKCh0X21hcCopbmV3VHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgICAgdF90eXBlKiBvbGRLZXlUeXBlID0gKCh0X21hcCopb2xkVHlwZSktPmdldF9rZXlfdHlwZSgpOwotCi0gICAgICAgICB0X3R5cGUqIG5ld1ZhbFR5cGUgPSAoKHRfbWFwKiluZXdUeXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgICAgICB0X3R5cGUqIG9sZFZhbFR5cGUgPSAoKHRfbWFwKilvbGRUeXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICAgICAgIHJldHVybiAoY29tcGFyZV90eXBlKG5ld0tleVR5cGUsIG9sZEtleVR5cGUpICYmIGNvbXBhcmVfdHlwZShuZXdWYWxUeXBlLCBvbGRWYWxUeXBlKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKG5ld1R5cGUtPmlzX3NldCgpICYmIG9sZFR5cGUtPmlzX3NldCgpKQotICAgICAgewotICAgICAgICAgdF90eXBlKiBuZXdFbGVtZW50VHlwZSA9ICgodF9zZXQqKW5ld1R5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgICB0X3R5cGUqIG9sZEVsZW1lbnRUeXBlID0gKCh0X3NldCopb2xkVHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgICAgIHJldHVybiBjb21wYXJlX3R5cGUobmV3RWxlbWVudFR5cGUsIG9sZEVsZW1lbnRUeXBlKTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICB9Ci0gICBlbHNlIGlmKG5ld1R5cGUtPmdldF9uYW1lKCkgPT0gb2xkVHlwZS0+Z2V0X25hbWUoKSkKLSAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgfQotfQotCi1ib29sIGNvbXBhcmVfcGFpcihzdGQ6OnBhaXI8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBuZXdNYXBQYWlyLCBzdGQ6OnBhaXI8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBvbGRNYXBQYWlyKQotewotICAgcmV0dXJuIGNvbXBhcmVfZGVmYXVsdHMobmV3TWFwUGFpci5maXJzdCwgb2xkTWFwUGFpci5maXJzdCkgJiYgY29tcGFyZV9kZWZhdWx0cyhuZXdNYXBQYWlyLnNlY29uZCwgb2xkTWFwUGFpci5zZWNvbmQpOwotfSAgIAotCi0vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgJ3RydWUnIGlmIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgc2FtZS4gUmV0dXJucyBmYWxzZSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQuCi1ib29sIGNvbXBhcmVfZGVmYXVsdHModF9jb25zdF92YWx1ZSogbmV3U3RydWN0RGVmYXVsdCwgdF9jb25zdF92YWx1ZSogb2xkU3RydWN0RGVmYXVsdCkKLXsKLSAgIGlmKG5ld1N0cnVjdERlZmF1bHQgPT0gTlVMTCAmJiBvbGRTdHJ1Y3REZWZhdWx0ID09IE5VTEwpIHJldHVybiB0cnVlOwotICAgZWxzZSBpZihuZXdTdHJ1Y3REZWZhdWx0ID09IE5VTEwgJiYgb2xkU3RydWN0RGVmYXVsdCAhPSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0gICBlbHNlIGlmIChuZXdTdHJ1Y3REZWZhdWx0ICE9IE5VTEwgJiYgb2xkU3RydWN0RGVmYXVsdCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgIGlmKG5ld1N0cnVjdERlZmF1bHQtPmdldF90eXBlKCkgIT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X3R5cGUoKSkKLSAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLQotICAgc3dpdGNoKG5ld1N0cnVjdERlZmF1bHQtPmdldF90eXBlKCkpCi0gICB7Ci0gICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6Ci0gICAgICAgICByZXR1cm4gKG5ld1N0cnVjdERlZmF1bHQtPmdldF9pbnRlZ2VyKCkgPT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2ludGVnZXIoKSk7Ci0gICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKLSAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X2RvdWJsZSgpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9kb3VibGUoKSk7Ci0gICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKLSAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X3N0cmluZygpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9zdHJpbmcoKSk7Ci0gICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIG9sZERlZmF1bHRMaXN0ID0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2xpc3QoKTsKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgbmV3RGVmYXVsdExpc3QgPSBuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfbGlzdCgpOwotICAgICAgICAgICAgYm9vbCBkZWZhdWx0VmFsdWVzQ29tcGFyZSA9IChvbGREZWZhdWx0TGlzdC5zaXplKCkgPT0gbmV3RGVmYXVsdExpc3Quc2l6ZSgpKTsKLQotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXNDb21wYXJlICYmIHN0ZDo6ZXF1YWwobmV3RGVmYXVsdExpc3QuYmVnaW4oKSwgbmV3RGVmYXVsdExpc3QuZW5kKCksIG9sZERlZmF1bHRMaXN0LmJlZ2luKCksIGNvbXBhcmVfZGVmYXVsdHMpOwotICAgICAgICAgfQotICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG5ld01hcCA9IG5ld1N0cnVjdERlZmF1bHQtPmdldF9tYXAoKTsKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gb2xkTWFwID0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X21hcCgpOwotCi0gICAgICAgICAgICBib29sIGRlZmF1bHRWYWx1ZXNDb21wYXJlID0gKG9sZE1hcC5zaXplKCkgPT0gbmV3TWFwLnNpemUoKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzQ29tcGFyZSAmJiBzdGQ6OmVxdWFsKG5ld01hcC5iZWdpbigpLCBuZXdNYXAuZW5kKCksIG9sZE1hcC5iZWdpbigpLCBjb21wYXJlX3BhaXIpOwotICAgICAgICAgfQotICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgotICAgICAgICAgcmV0dXJuIChuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfaWRlbnRpZmllcigpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9pZGVudGlmaWVyKCkpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLQotfQotCi12b2lkIGNvbXBhcmVfc3RydWN0X2ZpZWxkKHRfZmllbGQqIG5ld0ZpZWxkLCB0X2ZpZWxkKiBvbGRGaWVsZCwgc3RkOjpzdHJpbmcgb2xkU3RydWN0TmFtZSkKLXsKLSAgIHRfdHlwZSogbmV3RmllbGRUeXBlID0gbmV3RmllbGQtPmdldF90eXBlKCk7Ci0gICB0X3R5cGUqIG9sZEZpZWxkVHlwZSA9IG9sZEZpZWxkLT5nZXRfdHlwZSgpOwotICAgaWYoIWNvbXBhcmVfdHlwZShuZXdGaWVsZFR5cGUsIG9sZEZpZWxkVHlwZSkpCi0gICB7Ci0gICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIFR5cGUgQ2hhbmdlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsIG5ld0ZpZWxkLT5nZXRfa2V5KCksIG9sZFN0cnVjdE5hbWUuY19zdHIoKSk7Ci0gICB9Ci0KLSAgIC8vIEEgU3RydWN0IG1lbWJlciBjYW4gYmUgb3B0aW9uYWwgaWYgaXQgaXMgbWVudGlvbmVkIGV4cGxpY2l0bHksIG9yIGlmIGl0IGlzIGFzc2lnbmVkIHdpdGggZGVmYXVsdCB2YWx1ZXMuCi0gICBib29sIG5ld1N0cnVjdEZpZWxkT3B0aW9uYWwgPSAobmV3RmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKLSAgIGJvb2wgb2xkU3RydWN0RmllbGRPcHRpb25hbCA9IChvbGRGaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOwotCi0gICBpZihuZXdTdHJ1Y3RGaWVsZE9wdGlvbmFsICE9IG9sZFN0cnVjdEZpZWxkT3B0aW9uYWwpCi0gICB7Ci0gICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIFJlcXVpcmVkbmVzcyBDaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgbmV3RmllbGQtPmdldF9rZXkoKSwgb2xkU3RydWN0TmFtZS5jX3N0cigpKTsKLSAgIH0KLSAgIGlmKG5ld1N0cnVjdEZpZWxkT3B0aW9uYWwgfHwgb2xkU3RydWN0RmllbGRPcHRpb25hbCkKLSAgIHsKLSAgICAgIGlmKCFjb21wYXJlX2RlZmF1bHRzKG5ld0ZpZWxkLT5nZXRfdmFsdWUoKSwgb2xkRmllbGQtPmdldF92YWx1ZSgpKSkKLSAgICAgIHsKLSAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJEZWZhdWx0IHZhbHVlIGNoYW5nZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOwotICAgICAgfQotICAgfQotCi0gICBzdGQ6OnN0cmluZyBmaWVsZE5hbWUgPSBuZXdGaWVsZC0+Z2V0X25hbWUoKTsKLSAgIGlmKGZpZWxkTmFtZSAhPSBvbGRGaWVsZC0+Z2V0X25hbWUoKSkKLSAgIHsKLSAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJTdHJ1Y3QgZmllbGQgbmFtZSBjaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOwotICAgfQotCi19Ci0KLXZvaWQgY29tcGFyZV9zaW5nbGVfc3RydWN0KHRfc3RydWN0KiBuZXdTdHJ1Y3QsIHRfc3RydWN0KiBvbGRTdHJ1Y3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBvbGRTdHJ1Y3ROYW1lID0gc3RkOjpzdHJpbmcoKSkKLXsKLSAgIHN0ZDo6c3RyaW5nIHN0cnVjdE5hbWUgPSBvbGRTdHJ1Y3ROYW1lLmVtcHR5KCkgPyBvbGRTdHJ1Y3QtPmdldF9uYW1lKCkgOiBvbGRTdHJ1Y3ROYW1lOwotICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBvbGRTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyID0gb2xkU3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlciA9IG5ld1N0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG9sZFN0cnVjdE1lbWJlckl0ID0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5iZWdpbigpOwotICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBuZXdTdHJ1Y3RNZW1iZXJJdCA9IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuYmVnaW4oKTsKLQotICAgLy8gU2luY2Ugd2UgaGF2ZSB0aGUgc3RydWN0IG1lbWJlcnMgaW4gdGhlaXIgSUQgb3JkZXIsIGNvbXBhcmluZyB0aGVpciBJRHMgY2FuIGJlIGRvbmUgYnkgdHJhdmVyc2luZyB0aGUgdHdvIG1lbWJlcgotICAgLy8gbGlzdHMgdG9nZXRoZXIuICAKLSAgIHdoaWxlKCEob2xkU3RydWN0TWVtYmVySXQgPT0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSAmJiBuZXdTdHJ1Y3RNZW1iZXJJdCA9PSBuZXdTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpKSkKLSAgIHsKLSAgICAgIGlmKG5ld1N0cnVjdE1lbWJlckl0ID09IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkgJiYgb2xkU3RydWN0TWVtYmVySXQgIT0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSkKLSAgICAgIHsKLSAgICAgICAgIC8vIEEgZmllbGQgSUQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBlbmQuCi0gICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIHJlbW92ZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCBzdHJ1Y3ROYW1lLmNfc3RyKCkpOwotICAgICAgICAgb2xkU3RydWN0TWVtYmVySXQrKzsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYobmV3U3RydWN0TWVtYmVySXQgIT0gbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSAmJiBvbGRTdHJ1Y3RNZW1iZXJJdCA9PSBvbGRTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpKQotICAgICAgewotICAgICAgICAgLy9OZXcgZmllbGQgSUQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGVuZC4KLSAgICAgICAgIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJSZXF1aXJlZCBTdHJ1Y3QgRmllbGQgQWRkZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCAoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCBzdHJ1Y3ROYW1lLmNfc3RyKCkpOwotICAgICAgICAgfQotICAgICAgICAgbmV3U3RydWN0TWVtYmVySXQrKzsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSA9PSAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpKQotICAgICAgewotICAgICAgICAgLy9GaWVsZCBJRCBmb3VuZCBpbiBib3RoIHN0cnVjdHMuIENvbXBhcmUgZmllbGQgdHlwZXMsIGRlZmF1bHQgdmFsdWVzLgotICAgICAgICAgY29tcGFyZV9zdHJ1Y3RfZmllbGQoKm5ld1N0cnVjdE1lbWJlckl0LCAqb2xkU3RydWN0TWVtYmVySXQsIHN0cnVjdE5hbWUpOwotCi0gICAgICAgICBuZXdTdHJ1Y3RNZW1iZXJJdCsrOwotICAgICAgICAgb2xkU3RydWN0TWVtYmVySXQrKzsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSA8ICgqb2xkU3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkpCi0gICAgICB7Ci0gICAgICAgICAvL05ldyBGaWVsZCBJZCBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuCi0gICAgICAgICAvL0FkZGluZyBmaWVsZHMgdG8gc3RydWN0IGlzIGZpbmUsIGJ1dCBhZGRpbmcgdGhlbSBpbiB0aGUgbWlkZGxlIGlzIHN1c3BpY2lvdXMuIEVycm9yISEKLSAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgZmllbGQgaXMgYWRkZWQgaW4gdGhlIG1pZGRsZSB3aXRoIElkID0gJWQgaW4gJXNcbiIsICAoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCAgc3RydWN0TmFtZS5jX3N0cigpKTsKLSAgICAgICAgIG5ld1N0cnVjdE1lbWJlckl0Kys7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkgPiAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpKQotICAgICAgewotICAgICAgICAgLy9BIGZpZWxkIGlzIGRlbGV0ZWQgaW4gbmV3U3RydWN0LgotICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCBGaWVsZCByZW1vdmVkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgICgqb2xkU3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCksIHN0cnVjdE5hbWUuY19zdHIoKSk7Ci0gICAgICAgICBvbGRTdHJ1Y3RNZW1iZXJJdCsrOwotICAgICAgfQotCi0gICB9Ci19Ci0KLXZvaWQgY29tcGFyZV9zdHJ1Y3RzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIG5ld1N0cnVjdExpc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIG9sZFN0cnVjdExpc3QpCi17Ci0gICBzdGQ6Om1hcDxzdGQ6OnN0cmluZyx0X3N0cnVjdCo+IG5ld1N0cnVjdE1hcDsKLSAgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIG5ld1N0cnVjdExpc3RJdDsKLSAgIGZvcihuZXdTdHJ1Y3RMaXN0SXQgPSBuZXdTdHJ1Y3RMaXN0LmJlZ2luKCk7IG5ld1N0cnVjdExpc3RJdCAhPSBuZXdTdHJ1Y3RMaXN0LmVuZCgpOyBuZXdTdHJ1Y3RMaXN0SXQrKykKLSAgIHsKLSAgICAgIG5ld1N0cnVjdE1hcFsoKm5ld1N0cnVjdExpc3RJdCktPmdldF9uYW1lKCldID0gKm5ld1N0cnVjdExpc3RJdDsKLSAgIH0KLQotICAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3Igb2xkU3RydWN0TGlzdEl0OwotICAgZm9yKG9sZFN0cnVjdExpc3RJdCA9IG9sZFN0cnVjdExpc3QuYmVnaW4oKTsgb2xkU3RydWN0TGlzdEl0ICE9IG9sZFN0cnVjdExpc3QuZW5kKCk7IG9sZFN0cnVjdExpc3RJdCsrKQotICAgewotICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc3RydWN0Kj46Oml0ZXJhdG9yIG5ld1N0cnVjdE1hcEl0OwotICAgICAgbmV3U3RydWN0TWFwSXQgPSBuZXdTdHJ1Y3RNYXAuZmluZCgoKm9sZFN0cnVjdExpc3RJdCktPmdldF9uYW1lKCkpOwotICAgICAgaWYobmV3U3RydWN0TWFwSXQgPT0gbmV3U3RydWN0TWFwLmVuZCgpKQotICAgICAgewotICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCAlcyBub3QgZm91bmQgaW4gbmV3IHRocmlmdCBmaWxlXG4iLCAoKm9sZFN0cnVjdExpc3RJdCktPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBjb21wYXJlX3NpbmdsZV9zdHJ1Y3QobmV3U3RydWN0TWFwSXQtPnNlY29uZCwgKm9sZFN0cnVjdExpc3RJdCk7Ci0gICAgICB9Ci0gICB9Ci0KLX0KLQotdm9pZCBjb21wYXJlX3NpbmdsZV9mdW5jdGlvbih0X2Z1bmN0aW9uKiBuZXdGdW5jdGlvbiwgdF9mdW5jdGlvbiogb2xkRnVuY3Rpb24pCi17Ci0gICB0X3R5cGUqIG5ld0Z1bmN0aW9uUmV0dXJuVHlwZSA9IG5ld0Z1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotCi0gICBpZihuZXdGdW5jdGlvbi0+aXNfb25ld2F5KCkgIT0gb2xkRnVuY3Rpb24tPmlzX29uZXdheSgpKQotICAgewotICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIk9uZXdheSBhdHRyaWJ1dGUgY2hhbmdlZCBmb3IgZnVuY3Rpb24gJXNcbiIsb2xkRnVuY3Rpb24tPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICB9Ci0gICBpZighY29tcGFyZV90eXBlKG5ld0Z1bmN0aW9uUmV0dXJuVHlwZSwgb2xkRnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKQotICAgewotICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlJldHVybiB0eXBlIGNoYW5nZWQgZm9yIGZ1bmN0aW9uICVzXG4iLG9sZEZ1bmN0aW9uLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgfQotCi0gICAvL0NvbXBhcmUgZnVuY3Rpb24gYXJndW1lbnRzLgotICAgY29tcGFyZV9zaW5nbGVfc3RydWN0KG5ld0Z1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBvbGRGdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Ci0gICBzdGQ6OnN0cmluZyBleGNlcHRpb25OYW1lID0gb2xkRnVuY3Rpb24tPmdldF9uYW1lKCk7Ci0gICBleGNlcHRpb25OYW1lICs9ICJfZXhjZXB0aW9uIjsKLSAgIGNvbXBhcmVfc2luZ2xlX3N0cnVjdChuZXdGdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLCBvbGRGdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLCBleGNlcHRpb25OYW1lKTsKLX0KLQotdm9pZCBjb21wYXJlX2Z1bmN0aW9ucyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4mIG5ld0Z1bmN0aW9uTGlzdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+JiBvbGRGdW5jdGlvbkxpc3QpCi17Ci0gICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9mdW5jdGlvbio+IG5ld0Z1bmN0aW9uTWFwOwotICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgbmV3RnVuY3Rpb25NYXBJdDsKLSAgIGZvcihzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIG5ld0Z1bmN0aW9uSXQgPSBuZXdGdW5jdGlvbkxpc3QuYmVnaW4oKTsKLSAgICAgICAgIG5ld0Z1bmN0aW9uSXQgIT0gbmV3RnVuY3Rpb25MaXN0LmVuZCgpOwotICAgICAgICAgbmV3RnVuY3Rpb25JdCsrKQotICAgewotICAgICAgbmV3RnVuY3Rpb25NYXBbKCpuZXdGdW5jdGlvbkl0KS0+Z2V0X25hbWUoKV0gPSAqbmV3RnVuY3Rpb25JdDsKLSAgIH0KLQotICAgZm9yKHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3Igb2xkRnVuY3Rpb25JdCA9IG9sZEZ1bmN0aW9uTGlzdC5iZWdpbigpOwotICAgICAgICAgb2xkRnVuY3Rpb25JdCAhPSBvbGRGdW5jdGlvbkxpc3QuZW5kKCk7Ci0gICAgICAgICBvbGRGdW5jdGlvbkl0KyspCi0gICB7Ci0gICAgICBuZXdGdW5jdGlvbk1hcEl0ID0gbmV3RnVuY3Rpb25NYXAuZmluZCgoKm9sZEZ1bmN0aW9uSXQpLT5nZXRfbmFtZSgpKTsKLSAgICAgIGlmKG5ld0Z1bmN0aW9uTWFwSXQgPT0gbmV3RnVuY3Rpb25NYXAuZW5kKCkpCi0gICAgICB7Ci0gICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiTmV3IFRocmlmdCBGaWxlIGhhcyBtaXNzaW5nIGZ1bmN0aW9uICVzXG4iLCgqb2xkRnVuY3Rpb25JdCktPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIC8vRnVuY3Rpb24gaXMgZm91bmQgaW4gYm90aCB0aHJpZnQgZmlsZXMuIENvbXBhcmUgcmV0dXJuIHR5cGUgYW5kIGFyZ3VtZW50IGxpc3QKLSAgICAgICAgIGNvbXBhcmVfc2luZ2xlX2Z1bmN0aW9uKG5ld0Z1bmN0aW9uTWFwSXQtPnNlY29uZCwgKm9sZEZ1bmN0aW9uSXQpOwotICAgICAgfQotICAgfQotCi19Ci0KLXZvaWQgY29tcGFyZV9zZXJ2aWNlcyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgbmV3U2VydmljZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBvbGRTZXJ2aWNlcykKLXsKLSAgIHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciBvbGRTZXJ2aWNlSXQ7Ci0KLSAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3NlcnZpY2UqPiBuZXdTZXJ2aWNlTWFwOwotICAgZm9yKHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciBuZXdTZXJ2aWNlSXQgPSBuZXdTZXJ2aWNlcy5iZWdpbigpOwotICAgICAgICAgbmV3U2VydmljZUl0ICE9IG5ld1NlcnZpY2VzLmVuZCgpOwotICAgICAgICAgbmV3U2VydmljZUl0KyspCi0gICB7Ci0gICAgICBuZXdTZXJ2aWNlTWFwWygqbmV3U2VydmljZUl0KS0+Z2V0X25hbWUoKV0gPSAqbmV3U2VydmljZUl0OwotICAgfQotCi0KLSAgIGZvcihvbGRTZXJ2aWNlSXQgPSBvbGRTZXJ2aWNlcy5iZWdpbigpOyBvbGRTZXJ2aWNlSXQgIT0gb2xkU2VydmljZXMuZW5kKCk7IG9sZFNlcnZpY2VJdCsrKQotICAgewotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgb2xkU2VydmljZU5hbWUgPSAoKm9sZFNlcnZpY2VJdCktPmdldF9uYW1lKCk7Ci0gICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zZXJ2aWNlKj46Oml0ZXJhdG9yIG5ld1NlcnZpY2VNYXBJdCA9IG5ld1NlcnZpY2VNYXAuZmluZChvbGRTZXJ2aWNlTmFtZSk7Ci0KLSAgICAgIGlmKG5ld1NlcnZpY2VNYXBJdCA9PSBuZXdTZXJ2aWNlTWFwLmVuZCgpKQotICAgICAgewotICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIk5ldyBUaHJpZnQgZmlsZSBpcyBtaXNzaW5nIGEgc2VydmljZSAlc1xuIiwgb2xkU2VydmljZU5hbWUuY19zdHIoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICB0X3NlcnZpY2UqIG9sZFNlcnZpY2VFeHRlbmRzID0gKCpvbGRTZXJ2aWNlSXQpLT5nZXRfZXh0ZW5kcygpOwotICAgICAgICAgdF9zZXJ2aWNlKiBuZXdTZXJ2aWNlRXh0ZW5kcyA9IChuZXdTZXJ2aWNlTWFwSXQtPnNlY29uZCktPmdldF9leHRlbmRzKCk7Ci0KLSAgICAgICAgIGlmKG9sZFNlcnZpY2VFeHRlbmRzID09IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJdCBpcyBmaW5lIHRvIGFkZCBleHRlbmRzLiBTbyBpZiBzZXJ2aWNlIGluIG9sZGVyIHRocmlmdCBkaWQgbm90IGhhdmUgYW55IGV4dGVuZHMsIHdlIGFyZSBmaW5lLgotICAgICAgICAgICAgLy8gRE8gTm90aGluZwotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZihvbGRTZXJ2aWNlRXh0ZW5kcyAhPSBOVUxMICYmIG5ld1NlcnZpY2VFeHRlbmRzID09IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiQ2hhbmdlIGluIFNlcnZpY2UgaW5oZXJpdGFuY2UgZm9yICVzXG4iLCBvbGRTZXJ2aWNlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9sZEV4dGVuZHNOYW1lID0gb2xkU2VydmljZUV4dGVuZHMtPmdldF9uYW1lKCk7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBuZXdFeHRlbmRzTmFtZSA9IG5ld1NlcnZpY2VFeHRlbmRzLT5nZXRfbmFtZSgpOwotCi0gICAgICAgICAgICBpZiggbmV3RXh0ZW5kc05hbWUgIT0gb2xkRXh0ZW5kc05hbWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiQ2hhbmdlIGluIFNlcnZpY2UgaW5oZXJpdGFuY2UgZm9yICVzXG4iLCBvbGRTZXJ2aWNlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgY29tcGFyZV9mdW5jdGlvbnMoKG5ld1NlcnZpY2VNYXBJdC0+c2Vjb25kKS0+Z2V0X2Z1bmN0aW9ucygpLCAoKm9sZFNlcnZpY2VJdCktPmdldF9mdW5jdGlvbnMoKSk7Ci0gICAgICB9Ci0KLSAgIH0KLQotfQotCi12b2lkIGNvbXBhcmVfY29uc3RzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgbmV3Q29uc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgb2xkQ29uc3QpCi17Ci0gICBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIG5ld0NvbnN0SXQ7Ci0gICBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIG9sZENvbnN0SXQ7Ci0KLSAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2NvbnN0Kj4gbmV3Q29uc3RNYXA7Ci0KLSAgIGZvcihuZXdDb25zdEl0ID0gbmV3Q29uc3QuYmVnaW4oKTsgbmV3Q29uc3RJdCAhPSBuZXdDb25zdC5lbmQoKTsgbmV3Q29uc3RJdCsrKQotICAgewotICAgICAgbmV3Q29uc3RNYXBbKCpuZXdDb25zdEl0KS0+Z2V0X25hbWUoKV0gPSAqbmV3Q29uc3RJdDsKLSAgIH0KLQotICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3IgbmV3Q29uc3RNYXBJdDsKLSAgIGZvcihvbGRDb25zdEl0ID0gb2xkQ29uc3QuYmVnaW4oKTsgb2xkQ29uc3RJdCAhPSBvbGRDb25zdC5lbmQoKTsgb2xkQ29uc3RJdCsrKQotICAgewotICAgICAgbmV3Q29uc3RNYXBJdCA9IG5ld0NvbnN0TWFwLmZpbmQoKCpvbGRDb25zdEl0KS0+Z2V0X25hbWUoKSk7Ci0gICAgICBpZihuZXdDb25zdE1hcEl0ID09IG5ld0NvbnN0TWFwLmVuZCgpKQotICAgICAgewotICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkNvbnN0YW50cyBNaXNzaW5nICVzIFxuIiwgKCgqb2xkQ29uc3RJdCktPmdldF9uYW1lKCkpLmNfc3RyKCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZighY29tcGFyZV90eXBlKChuZXdDb25zdE1hcEl0LT5zZWNvbmQpLT5nZXRfdHlwZSgpLCAoKm9sZENvbnN0SXQpLT5nZXRfdHlwZSgpKSkKLSAgICAgIHsKLSAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJDb25zdGFudCAlcyBpcyBvZiBkaWZmZXJlbnQgdHlwZSBcbiIsICgoKm9sZENvbnN0SXQpLT5nZXRfbmFtZSgpKS5jX3N0cigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoIWNvbXBhcmVfZGVmYXVsdHMoKG5ld0NvbnN0TWFwSXQtPnNlY29uZCktPmdldF92YWx1ZSgpLCAoKm9sZENvbnN0SXQpLT5nZXRfdmFsdWUoKSkpCi0gICAgICB7Ci0gICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiQ29uc3RhbnQgJXMgaGFzIGRpZmZlcmVudCB2YWx1ZVxuIiwgKCgqb2xkQ29uc3RJdCktPmdldF9uYW1lKCkpLmNfc3RyKCkpOwotICAgICAgfQotICAgfQotfQotCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvYXVkaXQvdF9hdWRpdC5oIGIvY29tcGlsZXIvY3BwL3NyYy9hdWRpdC90X2F1ZGl0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMDAxM2EuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9hdWRpdC90X2F1ZGl0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jaWZuZGVmIFRfQVVESVRfSAotI2RlZmluZSBUX0FVRElUX0gKLQotdm9pZCBjb21wYXJlX25hbWVzcGFjZSh0X3Byb2dyYW0qIG5ld1Byb2dyYW0sIHRfcHJvZ3JhbSogb2xkUHJvZ3JhbSk7Ci12b2lkIGNvbXBhcmVfZW51bXMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG5ld0VudW1MaXN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgb2xkRW51bUxpc3QpOwotYm9vbCBjb21wYXJlX2RlZmF1bHRzKHRfY29uc3RfdmFsdWUqIG5ld1N0cnVjdERlZmF1bHQsIHRfY29uc3RfdmFsdWUqIG9sZFN0cnVjdERlZmF1bHQpOwotdm9pZCBjb21wYXJlX3N0cnVjdHMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgbmV3U3RydWN0TGlzdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgb2xkU3RydWN0TGlzdCk7Ci12b2lkIGNvbXBhcmVfc2VydmljZXMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIG5ld1NlcnZpY2VzLCBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgb2xkU2VydmljZXMpOwotdm9pZCBjb21wYXJlX2NvbnN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG5ld0NvbnN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG9sZENvbnN0KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzQzNDMwLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjU3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxjY3R5cGU+Ci0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKioKLSAqIEFTMyBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfYXMzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X2FzM19nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImJpbmRhYmxlIik7Ci0gICAgYmluZGFibGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tYXMzIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7Ci0gIC8vIHJlbW92ZWQgLS0gZXF1YWxpdHksY29tcGFyZV90bwotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM192YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2FzM190eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKLSAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwotICAvLyByZW1vdmVkIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX2FzM19kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9hczNfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGFzM19wYWNrYWdlKCk7Ci0gIHN0ZDo6c3RyaW5nIGFzM190eXBlX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgYXMzX3RocmlmdF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cyk7Ci0gIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLCBib29sIGluX2luaXQgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOwotCi0gIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLQotICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCi0gICAgICAgICAgIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0KLXByaXZhdGU6Ci0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0KLSAgYm9vbCBiaW5kYWJsZV87Ci19OwotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImFzMyIpOwotCi0gIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOwotICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKLSAgfQotICBpZiAoZGlyLnNpemUoKSA+IDApIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICB9Ci0KLSAgcGFja2FnZV9kaXJfID0gc3ViZGlyOwotfQotCi0vKioKLSAqIFBhY2thZ2VzIHRoZSBnZW5lcmF0ZWQgZmlsZQotICoKLSAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBwYWNrYWdlLCBpLmUuICJwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0ZGVtbzsiCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM19wYWNrYWdlKCkgewotICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgewotICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIiAiOwotICB9Ci0gIHJldHVybiAicGFja2FnZSAiOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBhczMgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBBczMgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBoZXJlCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190eXBlX2ltcG9ydHMoKSB7Ci0gIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2V0O1xuIiArICJpbXBvcnQgZmxhc2gudXRpbHMuQnl0ZUFycmF5O1xuIgotICAgICAgICAgKyAiaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7XG5cbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGFzMyBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9pbXBvcnRzKCkgewotICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjtcbiIKLSAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc3RydWN0Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cykgewotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgLy8gRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVybmV0IG5hbWVzcGFjZQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpOwotICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKLSAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7Ci0gICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSArICI7XG4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gaW1wb3J0czsKLX0KLQotLyoqCi0gKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3NlcnZpY2UKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBpbXBvcnRzOwotICBjb25zdCB2ZWN0b3I8dF9mdW5jdGlvbio+JiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVybmV0IG5hbWVzcGFjZQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7Ci0gICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgewotICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgewotICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI7XG4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGFzM190aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLCBpbXBvcnRzKTsKLSAgICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLCBpbXBvcnRzKTsKLSAgfQotCi0gIHJldHVybiBpbXBvcnRzOwotfQotCi0vKioKLSAqIE5vdGhpbmcgaW4gQXMzCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBBczMsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCl0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuYXMiOwotICBvZnN0cmVhbSBmX2VudW07Ci0gIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKLSAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCkgPDwgZW5kbDsKLQotICBzY29wZV91cChmX2VudW0pOwotICAvLyBBZGQgYXMzIGltcG9ydHMKLSAgZl9lbnVtIDw8IHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5TZXQ7IiA8PCBlbmRsIDw8ICJpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTsiCi0gICAgICAgICA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiICI7Ci0gIHNjb3BlX3VwKGZfZW51bSk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjppbnQgPSAiIDw8IHZhbHVlIDw8ICI7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBDcmVhdGUgYSBzdGF0aWMgU2V0IHdpdGggYWxsIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCi0gIGZfZW51bSA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IFZBTElEX1ZBTFVFUzpTZXQgPSBuZXcgU2V0KCI7Ci0gIGluZGVudF91cCgpOwotICBib29sIGZpcnN0VmFsdWUgPSB0cnVlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIC8vIHBvcHVsYXRlIHNldAotICAgIGZfZW51bSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwgIikgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX2VudW0gPDwgIik7IiA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IFZBTFVFU19UT19OQU1FUzpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAoZl9lbnVtKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAiVkFMVUVTX1RPX05BTUVTWyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdID0gXCIiCi0gICAgICAgICAgICAgICAgICAgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9lbnVtIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOwotCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIGNsYXNzCi0KLSAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgcGFja2FnZQotCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiQ29uc3RhbnRzLmFzIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKLQotICBzY29wZV91cChmX2NvbnN0cyk7Ci0gIGZfY29uc3RzIDw8IGVuZGw7Ci0KLSAgZl9jb25zdHMgPDwgYXMzX3R5cGVfaW1wb3J0cygpOwotCi0gIGluZGVudChmX2NvbnN0cykgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfY29uc3RzKTsKLSAgZl9jb25zdHMuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaW5kZW50KG91dCk7Ci0gIGlmICghZGVmdmFsKSB7Ci0gICAgb3V0IDw8IChpbl9zdGF0aWMgPyAidmFyICIgOiAicHVibGljIHN0YXRpYyBjb25zdCAiKTsKLSAgfQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgb3V0IDw8IG5hbWU7Ci0gICAgaWYgKCFkZWZ2YWwpIHsKLSAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIH0KLSAgICBvdXQgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgbmFtZTsKLSAgICBpZiAoIWRlZnZhbCkgewotICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gICAgfQotICAgIG91dCA8PCAiID0gIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvdXQgPDwgbmFtZSA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiCi0gICAgICAgIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCk6dm9pZCB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7Ci0gICAgICBvdXQgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgbmFtZTsKLSAgICBpZiAoIWRlZnZhbCkgewotICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gICAgfQotICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lOwotICAgIGlmICghZGVmdmFsKSB7Ci0gICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCk6dm9pZCB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCAodHlwZS0+aXNfbGlzdCgpID8gInB1c2giIDogImFkZCIpIDw8ICIoIiA8PCB2YWwgPDwgIik7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAodm9pZCluYW1lOwotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKLSAqIHdpdGggZGF0YSBtZW1iZXJzLCByZWFkKCksIHdyaXRlKCksIGFuZCBhbiBpbm5lciBJc3NldCBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9hczNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2FzM19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBBczMgc3RydWN0IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5hcyI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKLQotICBzY29wZV91cChmX3N0cnVjdCk7Ci0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGltcG9ydHM7Ci0KLSAgZl9zdHJ1Y3QgPDwgYXMzX3R5cGVfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHN0cnVjdCwgaW1wb3J0cykKLSAgICAgICAgICAgPDwgZW5kbDsKLQotICBpZiAoYmluZGFibGVfICYmICFpc19leGNlcHRpb24pIHsKLSAgICBmX3N0cnVjdCA8PCAiaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudDsiIDw8IGVuZGwgPDwgImltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnREaXNwYXRjaGVyOyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8ICJpbXBvcnQgbXguZXZlbnRzLlByb3BlcnR5Q2hhbmdlRXZlbnQ7IiA8PCBlbmRsOwotICB9Ci0KLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotCi0gIHNjb3BlX2Rvd24oZl9zdHJ1Y3QpOyAvLyBlbmQgb2YgcGFja2FnZQotICBmX3N0cnVjdC5jbG9zZSgpOwotfQotCi0vKioKLSAqIEFzMyBzdHJ1Y3QgZGVmaW5pdGlvbi4gVGhpcyBoYXMgdmFyaW91cyBwYXJhbWV0ZXJzLCBhcyBpdCBjb3VsZCBiZQotICogZ2VuZXJhdGVkIHN0YW5kYWxvbmUgb3IgaW5zaWRlIGFub3RoZXIgY2xhc3MgYXMgYSBoZWxwZXIuIElmIGl0Ci0gKiBpcyBhIGhlbHBlciB0aGFuIGl0IGlzIGEgc3RhdGljIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPwotICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCi0gKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgdHN0cnVjdCk7Ci0KLSAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOwotICBib29sIGJpbmRhYmxlID0gIWlzX2V4Y2VwdGlvbiAmJiAhaW5fY2xhc3MgJiYgYmluZGFibGVfOwotCi0gIGluZGVudChvdXQpIDw8IChpbl9jbGFzcyA/ICIiIDogInB1YmxpYyAiKSA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIgotICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJleHRlbmRzIEVycm9yICI7Ci0gIH0gZWxzZSBpZiAoYmluZGFibGUpIHsKLSAgICBvdXQgPDwgImV4dGVuZHMgRXZlbnREaXNwYXRjaGVyICI7Ci0gIH0KLSAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY29uc3QgU1RSVUNUX0RFU0M6VFN0cnVjdCA9IG5ldyBUU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgIDw8ICJcIik7IiA8PCBlbmRsOwotCi0gIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWFzMywgcHJpdmF0ZSBmb3IgLWFzM2JlYW4KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGNvbnN0ICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDOlRGaWVsZCA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2YXIgXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0ICIgPDwgdXBjYXNlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgPDwgIjppbnQgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6Qm9vbGVhbiA9IGZhbHNlOyIKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOwotCi0gIC8vIFN0YXRpYyBpbml0aWFsaXplciB0byBwb3B1bGF0ZSBnbG9iYWwgY2xhc3MgdG8gc3RydWN0IG1ldGFkYXRhIG1hcAotICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJGaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIG1ldGFEYXRhTWFwKTsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0LCBiaW5kYWJsZSk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgaWYgKGlzX3Jlc3VsdCkgewotICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QsIGJpbmRhYmxlKTsKLSAgZ2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgotICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZDpURmllbGQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuaWQpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0gICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKLSAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCi0gICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGluIG5vbi1iZWFucyBzdHlsZSwgY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZQotICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKLSAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghX19pc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKLSAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8vIGdlbmVyYXRlcyBhczMgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKLS8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM192YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKLSAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gYWxhcywgd2UgY2Fubm90IGNoZWNrICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIGl0J3MgYSBwcmltaXRpdmUgYW5kIHlvdSBjaG9zZSB0aGUgbm9uLWJlYW5zIGdlbmVyYXRvci4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCi0gICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiICYmICEiIDw8IGdldF9lbnVtX2NsYXNzX25hbWUodHlwZSkKLSAgICAgICAgICAgICAgICAgIDw8ICIuVkFMSURfVkFMVUVTLmNvbnRhaW5zKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikpeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlRoZSBmaWVsZCAnIgotICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIicgaGFzIGJlZW4gYXNzaWduZWQgdGhlIGludmFsaWQgdmFsdWUgXCIgKyAiCi0gICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IgotICAgICAgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAotICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCi0gKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQotICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIodGhpcy4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gICh2b2lkKXR5cGU7Ci0gICh2b2lkKWNhcF9uYW1lOwotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gICh2b2lkKXR5cGU7Ci0gICh2b2lkKWNhcF9uYW1lOwotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLQotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07Ci0KLSAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBjcmVhdGUgdGhlIHNldHRlcgotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldEZpZWxkVmFsdWUoZmllbGRJRDppbnQsIHZhbHVlOiopOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKLQotICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY3JlYXRlIHRoZSBnZXR0ZXIKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlKGZpZWxkSUQ6aW50KToqIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBjcmVhdGUgdGhlIGlzU2V0IG1ldGhvZAotICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgIgotICAgICAgICAgICAgICAgICAidmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXNTZXQoZmllbGRJRDppbnQpOkJvb2xlYW4geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2V0IG9mIEFzMyBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKLSAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJpbmRhYmxlKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgLy8gU2ltcGxlIGdldHRlcgotICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIoKToiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gU2ltcGxlIHNldHRlcgotICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCBmaWVsZCk7Ci0gICAgc3RkOjpzdHJpbmcgcHJvcE5hbWUgPSB0bXAoInRocmlmdFByb3BlcnR5Q2hhbmdlIik7Ci0gICAgaWYgKGJpbmRhYmxlKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiW0JpbmRhYmxlKGV2ZW50PVwiIiA8PCBwcm9wTmFtZSA8PCAiXCIpXSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIoIiA8PCBmaWVsZF9uYW1lIDw8ICI6IgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMuXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKLQotICAgIGlmIChiaW5kYWJsZSkgewotICAgICAgLy8gV2UgaGF2ZSB0byB1c2UgYSBjdXN0b20gZXZlbnQgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQsIGJlY2F1c2UgaWYgeW91IHVzZSB0aGUgZGVmYXVsdCwKLSAgICAgIC8vIHRoZSBzZXR0ZXIgb25seSBnZXRzIGNhbGxlZCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgLSB0aGlzIG1lYW5zIGNhbGxpbmcKLSAgICAgIC8vIGZvby5zZXRJbnRWYWx1ZSgwKQotICAgICAgLy8gd2lsbCBub3QgY2F1c2UgZm9vLmlzSW50VmFsdWVTZXQoKSB0byByZXR1cm4gdHJ1ZSBzaW5jZSB0aGUgdmFsdWUgb2YgZm9vLl9pbnRWYWx1ZSB3YXNuJ3QKLSAgICAgIC8vIGNoYW5nZWQKLSAgICAgIC8vIHNvIHRoZSBzZXR0ZXIgd2FzIG5ldmVyIGNhbGxlZC4KLSAgICAgIGluZGVudChvdXQpIDw8ICJkaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcIiIgPDwgcHJvcE5hbWUgPDwgIlwiKSk7IiA8PCBlbmRsOwotCi0gICAgICAvLyBIb3dldmVyLCBpZiB5b3UganVzdCB1c2UgYSBjdXN0b20gZXZlbnQsIHRoZW4gY29sbGVjdGlvbnMgd29uJ3QgYmUgYWJsZSB0byBkZXRlY3Qgd2hlbgotICAgICAgLy8gZWxlbWVudHMKLSAgICAgIC8vIGluIHRoZSBjb2xsZWN0aW9ucyBoYXZlIGNoYW5nZWQgc2luY2UgdGhleSBsaXN0ZWQgZm9yIFByb3BlcnR5Q2hhbmdlRXZlbnRzLiAgU28sIHdlCi0gICAgICAvLyBkaXNwYXRjaCBib3RoLgotICAgICAgaW5kZW50KG91dCkgPDwgImRpc3BhdGNoRXZlbnQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudC5QUk9QRVJUWV9DSEFOR0UpKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBVbnNldHRlcgotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIGlzU2V0IG1ldGhvZAotICAgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCi0gICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCk6Qm9vbGVhbiB7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJpbmRhYmxlKSB7Ci0gIC8vIElmIGl0J3MgYmluZGFibGUsIGl0IGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHNvIHRvU3RyaW5nIGlzIGFuIG92ZXJyaWRlLgotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IChiaW5kYWJsZSA/ICJvdmVycmlkZSAiIDogIiIpIDw8ICJmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7IgotICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcmV0OlN0cmluZyA9IG5ldyBTdHJpbmcoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaXJzdDpCb29sZWFuID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGlmIChjb3VsZF9iZV91bnNldCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgIGlmICghZmlyc3QpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSByZXQgKz0gIFwiLCBcIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiOyIgPDwgZW5kbDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwibnVsbFwiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopKGZpZWxkLT5nZXRfdHlwZSgpKSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJCSU5BUllcIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgZmllbGQtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICJfbmFtZTpTdHJpbmcgPSAiIDw8IGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpCi0gICAgICAgICAgICAgICAgICA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIgKFwiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIpXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXQgKz0gXCIpXCI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmV0OyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCi0gKiBmaWVsZE5hbWUgbWFwcGluZwotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIFN0YXRpYyBNYXAgd2l0aCBmaWVsZElEIC0+IEZpZWxkTWV0YURhdGEgbWFwcGluZ3MKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgbWV0YURhdGFNYXA6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIC8vIFBvcHVsYXRlIG1hcAotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRhRGF0YU1hcFsiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIl0gPSBuZXcgRmllbGRNZXRhRGF0YShcIiIKLSAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUgPDwgIlwiLCAiOwotCi0gICAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQotICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgIjsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKLSAgICAgIH0KLQotICAgICAgLy8gQ3JlYXRlIHZhbHVlIG1ldGEgZGF0YQotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOwotICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBhczMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCi0gKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCi0gKi8KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKLSAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGUuTElTVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIGdldF9hczNfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gIlRUeXBlLlZPSUQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyEiKTsKLSAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigKLSAgICAgICAgIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQotICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gIH0KLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgewotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudF91cCgpOwotICBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IFN0cnVjdE1ldGFEYXRhKFRUeXBlLlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IExpc3RNZXRhRGF0YShUVHlwZS5MSVNULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTZXRNZXRhRGF0YShUVHlwZS5TRVQsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKLSAgICB9IGVsc2UgeyAvLyBtYXAKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTWFwTWV0YURhdGEoVFR5cGUuTUFQLCAiOwotICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBrZXlfdHlwZSk7Ci0gICAgICBvdXQgPDwgIiwgIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIHZhbF90eXBlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBGaWVsZFZhbHVlTWV0YURhdGEoIiA8PCBnZXRfYXMzX3R5cGVfc3RyaW5nKHR5cGUpOwotICB9Ci0gIG91dCA8PCAiKSI7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIE1ha2UgaW50ZXJmYWNlIGZpbGUKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIuYXMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOwotCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgZW5kbCA8PCBhczNfdHlwZV9pbXBvcnRzKCkgPDwgYXMzX3RocmlmdF9pbXBvcnRzKCkKLSAgICAgICAgICAgICA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIHRfdHlwZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gICAgc3RyaW5nIHBhcmVudF9uYW1lc3BhY2UgPSBwYXJlbnQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImFzMyIpOwotICAgIGlmICghcGFyZW50X25hbWVzcGFjZS5lbXB0eSgpICYmIHBhcmVudF9uYW1lc3BhY2UgIT0gcGFja2FnZV9uYW1lXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgdHlwZV9uYW1lKHBhcmVudCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0KLSAgLy8gTm93IG1ha2UgdGhlIGltcGxlbWVudGF0aW9uL2NsaWVudCBmaWxlCi0gIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICJJbXBsLmFzIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKLQotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgYXMzX3R5cGVfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfaW1wb3J0cygpCi0gICAgICAgICAgICAgPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKLSAgICBpZiAoIXBhcmVudF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBwYXJlbnRfbmFtZXNwYWNlICE9IHBhY2thZ2VfbmFtZV8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHR5cGVfbmFtZShwYXJlbnQpIDw8ICJJbXBsOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgYXMzX3R5cGVfaW1wb3J0cygpOwotICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfaW1wb3J0cygpOwotICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOwotICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4qOyIgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotCi0gIC8vIE5vdyBtYWtlIHRoZSBwcm9jZXNzb3Ivc2VydmVyIGZpbGUKLSAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3Nvci5hcyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7Ci0KLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGFzM190eXBlX2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKQotICAgICAgICAgICAgIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgYXMzX3R5cGVfaW1wb3J0cygpOwotICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfaW1wb3J0cygpOwotICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7Ci0gIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOwotICB9Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLQotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGdlbmVyYXRlX2FzM19kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlICIgPDwgc2VydmljZV9uYW1lXyA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9hczNfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIkltcGwiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJbXBsIiA8PCBleHRlbmRzX2NsaWVudAotICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSW1wbCIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIoaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2w9bnVsbCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvcHJvdCA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHZhciBpcHJvdF86VFByb3RvY29sOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCB2YXIgb3Byb3RfOlRQcm90b2NvbDsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCB2YXIgc2VxaWRfOmludDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldElucHV0UHJvdG9jb2woKTpUUHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0UHJvdG9jb2woKTpUUHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5vcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCk6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIKLSAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKLSAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3M6IiA8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIKLSAgICAgICAgICAgICAgIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKGZ1bmN0aW9uKGVycm9yOkVycm9yKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChlcnJvciAhPSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZXJyb3IpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm47IgotICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICJ2YXIgbXNnOlRNZXNzYWdlID0gaXByb3RfLnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgImlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIHZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gVEFwcGxpY2F0aW9uRXJyb3IucmVhZChpcHJvdF8pOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcih4KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA6IiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIgotICAgICAgICAgICAgICAgICA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MocmVzdWx0LnN1Y2Nlc3MpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihuZXcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5NSVNTSU5HX1JFU1VMVCwgXCIiCi0gICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKGU6VEVycm9yKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBFeHRlbmRzIHN0dWZmCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvcihpZmFjZToiIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgICAgICAgICAgIDw8ICIpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlBST0NFU1NfTUFQW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgdmFyIGlmYWNlXzoiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIjsiIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBjb25zdCBQUk9DRVNTX01BUDpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBzdHJpbmcgb3ZlcnJpZGUgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBvdmVycmlkZSA9ICJvdmVycmlkZSAiOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCBvdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgPDwgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sKTpCb29sZWFuIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgbXNnOlRNZXNzYWdlID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KLSAgLy8gQVMtIElmIGFsbCBtZXRob2QgaXMgb25ld2F5OgotICAvLyBkbyB5b3UgaGF2ZSBhbiBvcHJvdD8KLSAgLy8gZG8geW91IHlvdSBuZWVkIG51bGxjaGVjaz8KLSAgZl9zZXJ2aWNlXwotICAgICAgPDwgaW5kZW50KCkgPDwgInZhciBmbjpGdW5jdGlvbiA9IFBST0NFU1NfTUFQW21zZy5uYW1lXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgdmFyIHg6VEFwcGxpY2F0aW9uRXJyb3IgPSBuZXcgVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuVU5LTk9XTl9NRVRIT0QsICIKLSAgICAgICAgICJcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIittc2cubmFtZStcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIKLSAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKLSAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgImZuLmNhbGwodGhpcyxtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpdHNlcnZpY2U7Ci0gIC8vIE9wZW4gY2xhc3MKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGZ1bmN0aW9uICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoKTpGdW5jdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGZ1bmN0aW9uKHNlcWlkOmludCwgaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2wpOnZvaWQiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBhcmdzOiIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IgotICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0OiIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgIi8vIHNvcnJ5IHRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBFcnJvcihcIlRoaXMgaXMgbm90IHlldCBzdXBwb3J0ZWRcIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQotICAgICAgJiYgIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQotICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IgotICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgotICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICh0aDpFcnJvcikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cmFjZShcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgIDw8ICJcIiwgdGgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgInZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gbmV3ICIKLSAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5JTlRFUk5BTF9FUlJPUiwgXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIKLSAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiCi0gICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIC8vIENsb3NlIGNsYXNzCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgY2xhc3MKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQXMzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZwotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgb2JqOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICI6VE1hcCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICI6VFNldCA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRMaXN0ID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkKLSAgICAgICAgICAgICAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKLSAgICAgICAgICAgICAgPDwgIigiCi0gICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpIDw8ICI6aW50ID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiCi0gICAgICAgICAgICAgIDw8ICI7ICIKLSAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1c2goIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgotICogQHBhcmFtIHByZWZpeCBTdHJpbmcgcHJlZml4IGZvciBmaWVsZHMKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2tleSIpOwotICAgIHN0cmluZyBjb3VudGVyID0gdG1wKCJfc2l6ZUNvdW50ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgY291bnRlciA8PCAiOmludCA9IDA7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBjb3VudGVyIDw8ICsiKys7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IGNvdW50ZXIgPDwgIikpOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJlbGVtIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciBlYWNoICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiLnRvQXJyYXkoKSkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGVhY2ggKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIpIjsKLSAgfQotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgQXMzIHR5cGUgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/Ci0gKiBAcmV0dXJuIEFzMyB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0KSB7Ci0gICh2b2lkKWluX2luaXQ7Ci0gIC8vIEluIEFzMyB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaW50IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIkRpY3Rpb25hcnkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiU2V0IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJBcnJheSI7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7Ci0gICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIEFTMyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgQXMzIGNvbnRhaW5lcj8KLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsIGJvb2wgaW5fY29udGFpbmVyKSB7Ci0gICh2b2lkKWluX2NvbnRhaW5lcjsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gIkJ5dGVBcnJheSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiU3RyaW5nIjsKLSAgICB9Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gIkJvb2xlYW4iOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHRocm93ICJpNjQgaXMgbm90IHlldCBzdXBwb3J0ZWQgaW4gYXMzIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJOdW1iZXIiOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQXMzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgewotICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KLSAgc3RyaW5nIHJlc3VsdCA9ICJ2YXIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIG9mc3RyZWFtIGR1bW15OwotICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgICA7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaWYgKGFyZ3VtZW50cyAhPSAiIikgewotICAgICAgYXJndW1lbnRzICs9ICIsICI7Ci0gICAgfQotICAgIGFyZ3VtZW50cyArPSAib25FcnJvcjpGdW5jdGlvbiwgb25TdWNjZXNzOkZ1bmN0aW9uIjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIik6dm9pZCI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCi0gKi8KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBjb25zdGFudF9uYW1lOwotCi0gIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7Ci0gIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgewotICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOwotCi0gICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7Ci0gICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKLSAgICB9Ci0gICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpc19maXJzdCA9IGZhbHNlOwotICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7Ci0gIH0KLQotICByZXR1cm4gY29uc3RhbnRfbmFtZTsKLX0KLQotLyoqCi0gKiBFbWl0cyBhIEFzM0RvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgdGRvYy0+Z2V0X2RvYygpLCAiICovXG4iKTsKLSAgfQotfQotCi0vKioKLSAqIEVtaXRzIGEgQXMzRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKLSAgICBzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKHAtPmhhc19kb2MoKSkgewotICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOwotICAgICAgfQotICAgIH0KLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOwotfQotCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKLSAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewotICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7Ci0gIHN0cmluZyBwYWNrYWdlID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKSArICIuIjsKLSAgfQotICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCi0gICAgYXMzLAotICAgICJBUzMiLAotICAgICIgICAgYmluZGFibGU6ICAgICAgICBBZGQgW2JpbmRhYmxlXSBtZXRhZGF0YSB0byBhbGwgdGhlIHN0cnVjdCBjbGFzc2VzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YWE0ZDIuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NTY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCi1zdHJpbmcgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHN0cmluZyBuYW1lKTsKLXN0cmluZyB1bmRlcnNjb3Jlc190b19pbml0aWFsX2NhcHMoc3RyaW5nIG5hbWUpOwotc3RyaW5nIHRvX3VwcGVyX2Nhc2Uoc3RyaW5nIG5hbWUpOwotc3RyaW5nIHRvX2xvd2VyX2Nhc2Uoc3RyaW5nIG5hbWUpOwotCi0vKioKLSAqIEMgY29kZSBnZW5lcmF0b3IsIHVzaW5nIGdsaWIgZm9yIEMgdHlwaW5nLgotICovCi1jbGFzcyB0X2NfZ2xpYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgLyogY29uc3RydWN0b3IgKi8KLSAgdF9jX2dsaWJfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIC8qIHNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSAqLwotICAgIHRoaXMtPm91dF9kaXJfYmFzZV8gPSAiZ2VuLWNfZ2xpYiI7Ci0KLSAgICAvKiBzZXQgdGhlIG5hbWVzcGFjZSAqLwotICAgIHRoaXMtPm5zcGFjZSA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKTsKLQotICAgIGlmICh0aGlzLT5uc3BhY2UuZW1wdHkoKSkgewotICAgICAgdGhpcy0+bnNwYWNlID0gIiI7Ci0gICAgICB0aGlzLT5uc3BhY2VfdSA9ICIiOwotICAgICAgdGhpcy0+bnNwYWNlX3VjID0gIiI7Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPSAiIjsKLSAgICB9IGVsc2UgewotICAgICAgLyogcmVwbGFjZSBkb3RzIHdpdGggdW5kZXJzY29yZXMgKi8KLSAgICAgIGNoYXIqIHRtcCA9IHN0cmR1cCh0aGlzLT5uc3BhY2UuY19zdHIoKSk7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0cmxlbih0bXApOyBpKyspIHsKLSAgICAgICAgaWYgKHRtcFtpXSA9PSAnLicpIHsKLSAgICAgICAgICB0bXBbaV0gPSAnXyc7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHRoaXMtPm5zcGFjZSA9IHN0cmluZyh0bXAsIHN0cmxlbih0bXApKTsKLSAgICAgIGZyZWUodG1wKTsKLQotICAgICAgLyogY2xlYW4gdXAgdGhlIG5hbWVzcGFjZSBmb3IgQy4KLSAgICAgICAqIEFuIGlucHV0IG9mICduYW1lc3BhY2UgZm9vJyBzaG91bGQgcmVzdWx0IGluOgotICAgICAgICogIC0gbnNwYWNlID0gZm9vICAgICAgIC0gZm9yIHRocmlmdCBvYmplY3RzIGFuZCB0eXBlZGVmcwotICAgICAgICogIC0gbnNwYWNlX3UgPSBGb28gICAgIC0gZm9yIGludGVybmFsIEdPYmplY3QgcHJlZml4ZXMKLSAgICAgICAqICAtIG5zcGFjZV91YyA9IEZPT18gICAtIGZvciBtYWNybyBwcmVmaXhlcwotICAgICAgICogIC0gbnNwYWNlX2xjID0gZm9vXyAgIC0gZm9yIGZpbGVuYW1lIGFuZCBtZXRob2QgcHJlZml4ZXMKLSAgICAgICAqIFRoZSB1bmRlcnNjb3JlcyBhcmUgdGhlcmUgc2luY2UgdWMgYW5kIGxjIHN0cmluZ3MgYXJlIHVzZWQgYXMgZmlsZSBhbmQKLSAgICAgICAqIHZhcmlhYmxlIHByZWZpeGVzLgotICAgICAgICovCi0gICAgICB0aGlzLT5uc3BhY2VfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0aGlzLT5uc3BhY2UpOwotICAgICAgdGhpcy0+bnNwYWNlX3VjID0gdG9fdXBwZXJfY2FzZSh0aGlzLT5uc3BhY2VfdSkgKyAiXyI7Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPSB0b19sb3dlcl9jYXNlKHRoaXMtPm5zcGFjZV91KSArICJfIjsKLSAgICB9Ci0gIH0KLQotICAvKiBpbml0aWFsaXphdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qIGdlbmVyYXRpb24gZnVuY3Rpb25zICovCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKLQotcHJpdmF0ZToKLSAgLyogZmlsZSBzdHJlYW1zICovCi0gIG9mc3RyZWFtIGZfdHlwZXNfOwotICBvZnN0cmVhbSBmX3R5cGVzX2ltcGxfOwotICBvZnN0cmVhbSBmX2hlYWRlcl87Ci0gIG9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgLyogbmFtZXNwYWNlIHZhcmlhYmxlcyAqLwotICBzdHJpbmcgbnNwYWNlOwotICBzdHJpbmcgbnNwYWNlX3U7Ci0gIHN0cmluZyBuc3BhY2VfdWM7Ci0gIHN0cmluZyBuc3BhY2VfbGM7Ci0KLSAgLyogaGVscGVyIGZ1bmN0aW9ucyAqLwotICBib29sIGlzX2NvbXBsZXhfdHlwZSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYgPSBmYWxzZSwgYm9vbCBpc19jb25zdCA9IGZhbHNlKTsKLSAgc3RyaW5nIHByb3BlcnR5X3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYgPSBmYWxzZSwgYm9vbCBpc19jb25zdCA9IGZhbHNlKTsKLSAgc3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlKTsKLSAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpOwotICBzdHJpbmcgY29uc3RhbnRfbGl0ZXJhbCh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgc3RyaW5nIGNvbnN0YW50X3ZhbHVlKHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgc3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0cmluZyB4Y2VwdGlvbl9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZlcmVuY2UgPSBmYWxzZSk7Ci0gIHZvaWQgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcmIGJhc2VfbmFtZSk7Ci0KLSAgLyogZ2VuZXJhdGlvbiBmdW5jdGlvbnMgKi8KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGFuZGxlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9vYmplY3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbiA9IHRydWUpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbiA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgZWxlbWVudCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlID0gdHJ1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlID0gdHJ1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7Ci0KLSAgc3RyaW5nIGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZSh0X3R5cGUqIGtleSwgdF90eXBlKiB2YWx1ZSk7Ci0gIHN0cmluZyBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0cmluZyBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpOwotICBzdHJpbmcgZ2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RyaW5nIGdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKLX07Ci0KLS8qKgotICogUHJlcGFyZSBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlCi0gKiBvdXRwdXQgc3RyZWFtcy4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvKiBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSAqLwotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHN0cmluZyBwcm9ncmFtX25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKTsKLSAgc3RyaW5nIHByb2dyYW1fbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOwotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7Ci0KLSAgLyogY3JlYXRlIG91dHB1dCBmaWxlcyAqLwotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHRoaXMtPm5zcGFjZV9sYyArIHByb2dyYW1fbmFtZV9sYyArICJfdHlwZXMuaCI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotICBzdHJpbmcgZl90eXBlc19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgdGhpcy0+bnNwYWNlX2xjICsgcHJvZ3JhbV9uYW1lX2xjICsgIl90eXBlcy5jIjsKLSAgZl90eXBlc19pbXBsXy5vcGVuKGZfdHlwZXNfaW1wbF9uYW1lLmNfc3RyKCkpOwotCi0gIC8qIGFkZCB0aHJpZnQgYm9pbGVycGxhdGUgaGVhZGVycyAqLwotICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl90eXBlc19pbXBsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKLQotICAvKiBpbmNsdWRlIGluY2x1c2lvbiBndWFyZCAqLwotICBmX3R5cGVzXyA8PCAiI2lmbmRlZiAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBwcm9ncmFtX25hbWVfdWMgPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKLSAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvKiBpbmNsdWRlIGJhc2UgdHlwZXMgKi8KLSAgZl90eXBlc18gPDwgIi8qIGJhc2UgaW5jbHVkZXMgKi8iIDw8IGVuZGwgPDwgIiNpbmNsdWRlIDxnbGliLW9iamVjdC5oPiIgPDwgZW5kbAotICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oPiIgPDwgZW5kbAotICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+IiA8PCBlbmRsOwotCi0gIC8qIGluY2x1ZGUgb3RoZXIgdGhyaWZ0IGluY2x1ZGVzICovCi0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBmX3R5cGVzXyA8PCAiLyogb3RoZXIgdGhyaWZ0IGluY2x1ZGVzICovIiA8PCBlbmRsIDw8ICIjaW5jbHVkZSBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjCi0gICAgICAgICAgICAgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbDsKLSAgfQotICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gIC8qIGluY2x1ZGUgY3VzdG9tIGhlYWRlcnMgKi8KLSAgY29uc3QgdmVjdG9yPHN0cmluZz4mIGNfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2NfaW5jbHVkZXMoKTsKLSAgZl90eXBlc18gPDwgIi8qIGN1c3RvbSB0aHJpZnQgaW5jbHVkZXMgKi8iIDw8IGVuZGw7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY19pbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIGlmIChjX2luY2x1ZGVzW2ldWzBdID09ICc8JykgewotICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlICIgPDwgY19pbmNsdWRlc1tpXSA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGNfaW5jbHVkZXNbaV0gPDwgIlwiIiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gIC8qIGluY2x1ZGUgbWF0aC5oIChmb3IgIklORklOSVRZIikgaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUsIGluIGNhc2Ugd2UKLSAgICAgZW5jb3VudGVyIGEgc3RydWN0IHdpdGggYSBtZW1iZXIgb2YgdHlwZSBkb3VibGUgKi8KLSAgZl90eXBlc19pbXBsXyA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8bWF0aC5oPiIgPDwgZW5kbDsKLQotICAvLyBpbmNsdWRlIHRoZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfaW1wbF8gPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBwcm9ncmFtX25hbWVfdSA8PCAiX3R5cGVzLmhcIiIKLSAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3R5cGVzXyA8PCAiLyogYmVnaW4gdHlwZXMgKi8iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiAgRmluaXNoIHVwIGdlbmVyYXRpb24gYW5kIGNsb3NlIGFsbCBmaWxlIHN0cmVhbXMuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIHN0cmluZyBwcm9ncmFtX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKSk7Ci0KLSAgLyogZW5kIHRoZSBoZWFkZXIgaW5jbHVzaW9uIGd1YXJkICovCi0gIGZfdHlwZXNfIDw8ICIjZW5kaWYgLyogIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgcHJvZ3JhbV9uYW1lX3VjIDw8ICJfVFlQRVNfSCAqLyIgPDwgZW5kbDsKLQotICAvKiBjbG9zZSBvdXRwdXQgZmlsZSAqLwotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX3R5cGVzX2ltcGxfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgVGhyaWZ0IHR5cGVkZWYgaW4gQyBjb2RlLiAgRm9yIGV4YW1wbGU6Ci0gKgotICogVGhyaWZ0OgotICogdHlwZWRlZiBtYXA8aTMyLGkzMj4gU29tZU1hcAotICoKLSAqIEM6Ci0gKiB0eXBlZGVmIEdIYXNoVGFibGUgKiBUaHJpZnRTb21lTWFwOwotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIgPDwgdGhpcy0+bnNwYWNlCi0gICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIEMgZW51bWVyYXRpb24uICBGb3IgZXhhbXBsZToKLSAqCi0gKiBUaHJpZnQ6Ci0gKiBlbnVtIE15RW51bSB7Ci0gKiAgIE9ORSA9IDEsCi0gKiAgIFRXTwotICogfQotICoKLSAqIEM6Ci0gKiBlbnVtIF9UaHJpZnRNeUVudW0gewotICogICBUSFJJRlRfTVlfRU5VTV9PTkUgPSAxLAotICogICBUSFJJRlRfTVlfRU5VTV9UV08KLSAqIH07Ci0gKiB0eXBlZGVmIGVudW0gX1RocmlmdE15RW51bSBUaHJpZnRNeUVudW07Ci0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgc3RyaW5nIG5hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKLSAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKSk7Ci0KLSAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgLyogb3V0cHV0IGVhY2ggb2YgdGhlIGVudW1lcmF0aW9uIGVsZW1lbnRzICovCi0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3R5cGVzXyA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfdHlwZXNfIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzXyA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBlbnVtIF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgIgotICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfdHlwZXNfIDw8ICIvKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50ICovIiA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCAiY29uc3QgY2hhciAqIiA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCAidG9TdHJpbmdfIiA8PCBuYW1lIDw8ICIoaW50IHZhbHVlKTsgIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIDsKLSAgZl90eXBlc19pbXBsXyA8PCAiLyogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCAqLyIgPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCAiY29uc3QgY2hhciAqIiA8PCBlbmRsOwotICBmX3R5cGVzX2ltcGxfIDw8ICJ0b1N0cmluZ18iIDw8IG5hbWUgPDwgIihpbnQgdmFsdWUpICIgPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCAieyIgPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCAiICBzdGF0aWMgX190aHJlYWQgY2hhciBidWZbMTZdID0gezB9OyIgPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCAiICBzd2l0Y2godmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZl90eXBlc19pbXBsXyA8PCAiICBjYXNlICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl8iIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIKLSAgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gXCIiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICJcIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl90eXBlc19pbXBsXyA8PCAiICBkZWZhdWx0OiBnX3NucHJpbnRmKGJ1ZiwgMTYsIFwiJWRcIiwgdmFsdWUpOyByZXR1cm4gYnVmOyIgPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCAiICB9IiA8PCBlbmRsOwotICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIFRocmlmdCBjb25zdGFudHMgaW4gQyBjb2RlLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIGZfdHlwZXNfIDw8ICIvKiBjb25zdGFudHMgKi8iIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIi8qIGNvbnN0YW50cyAqLyIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWUpOwotICAgIHN0cmluZyBuYW1lX2xjID0gdG9fbG93ZXJfY2FzZShuYW1lKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiICIKLSAgICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShuYW1lX2xjLCB0eXBlLCB2YWx1ZSkgPDwgZW5kbDsKLQotICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKG5hbWVfbGMsIHR5cGUsIHZhbHVlKTsKLSAgfQotCi0gIGZfdHlwZXNfIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBUaHJpZnQgc3RydWN0cyBpbiBDIGNvZGUsIGFzIEdPYmplY3RzLiAgRXhhbXBsZToKLSAqCi0gKiBUaHJpZnQ6Ci0gKiBzdHJ1Y3QgQm9uawotICogewotICogICAxOiBzdHJpbmcgbWVzc2FnZSwKLSAqICAgMjogaTMyIHR5cGUKLSAqIH0KLSAqCi0gKiBDIEdPYmplY3QgaW5zdGFuY2UgaGVhZGVyOgotICogc3RydWN0IF9UaHJpZnRCb25rCi0gKiB7Ci0gKiAgIEdPYmplY3QgcGFyZW50OwotICoKLSAqICAgZ2NoYXIgKiBtZXNzYWdlOwotICogICBnaW50MzIgdHlwZTsKLSAqIH07Ci0gKiB0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Qm9uayBUaHJpZnRCb25rCi0gKiAvLyAuLi4gYWRkaXRpb25hbCBHT2JqZWN0IGJvaWxlcnBsYXRlIC4uLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGZfdHlwZXNfIDw8ICIvKiBzdHJ1Y3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGdlbmVyYXRlX29iamVjdCh0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBDIGNvZGUgdG8gcmVwcmVzZW50IFRocmlmdCBzZXJ2aWNlcy4gIENyZWF0ZXMgYSBuZXcgR09iamVjdAotICogd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBzZXJ2aWNlLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBzdmNuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHNlcnZpY2UtPmdldF9uYW1lKCkpOwotICBzdHJpbmcgc3ZjbmFtZV91YyA9IHRoaXMtPm5zcGFjZV91YyArIHRvX3VwcGVyX2Nhc2Uoc3ZjbmFtZV91KTsKLSAgc3RyaW5nIGZpbGVuYW1lID0gdGhpcy0+bnNwYWNlX2xjICsgdG9fbG93ZXJfY2FzZShzdmNuYW1lX3UpOwotCi0gIC8vIG1ha2Ugb3V0cHV0IGZpbGVzCi0gIHN0cmluZyBmX2hlYWRlcl9uYW1lID0gZ2V0X291dF9kaXIoKSArIGZpbGVuYW1lICsgIi5oIjsKLSAgZl9oZWFkZXJfLm9wZW4oZl9oZWFkZXJfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocHJvZ3JhbV9uYW1lXyk7Ci0gIHN0cmluZyBwcm9ncmFtX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKHByb2dyYW1fbmFtZV91KTsKLQotICAvLyBhZGQgaGVhZGVyIGZpbGUgYm9pbGVycGxhdGUKLSAgZl9oZWFkZXJfIDw8IGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8vIGFkZCBhbiBpbmNsdXNpb24gZ3VhcmQKLSAgZl9oZWFkZXJfIDw8ICIjaWZuZGVmICIgPDwgc3ZjbmFtZV91YyA8PCAiX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBzdmNuYW1lX3VjIDw8ICJfSCIgPDwgZW5kbAotICAgICAgICAgICAgPDwgZW5kbDsKLQotICAvLyBhZGQgc3RhbmRhcmQgaW5jbHVkZXMKLSAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5oPiIgPDwgZW5kbCA8PCBlbmRsOwotICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgcHJvZ3JhbV9uYW1lX2xjIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsOwotCi0gIC8vIGlmIHdlIGFyZSBpbmhlcml0aW5nIGZyb20gYW5vdGhlciBzZXJ2aWNlLCBpbmNsdWRlIGl0cyBoZWFkZXIKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7Ci0gICAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjCi0gICAgICAgICAgICAgIDw8IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKSkpIDw8ICIuaFwiIgotICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PCBlbmRsOwotCi0gIC8vIGNyZWF0ZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbgotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgZmlsZW5hbWUgKyAiLmMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gYWRkIHRoZSBib2lsZXJwbGFjZSBoZWFkZXIKLSAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKLQotICAvLyBpbmNsdWRlIHRoZSBoZWFkZXJzCi0gIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIDxzdHJpbmcuaD4iIDw8IGVuZGwgPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPiIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmg+IiA8PCBlbmRsIDw8ICIjaW5jbHVkZSBcIiIKLSAgICAgICAgICAgICA8PCBmaWxlbmFtZSA8PCAiLmhcIiIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIHRoZSBzZXJ2aWNlLWhlbHBlciBjbGFzc2VzCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgLy8gZ2VuZXJhdGUgdGhlIGNsaWVudCBvYmplY3RzCi0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLQotICAvLyBnZW5lcmF0ZSB0aGUgc2VydmVyIG9iamVjdHMKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotCi0gIC8vIGVuZCB0aGUgaGVhZGVyIGluY2x1c2lvbiBndWFyZAotICBmX2hlYWRlcl8gPDwgIiNlbmRpZiAvKiAiIDw8IHN2Y25hbWVfdWMgPDwgIl9IICovIiA8PCBlbmRsOwotCi0gIC8vIGNsb3NlIHRoZSBmaWxlcwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIGZfaGVhZGVyXy5jbG9zZSgpOwotfQotCi0vKioKLSAqCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0gIHN0cmluZyBuYW1lX2xjID0gdG9fbG93ZXJfY2FzZShuYW1lX3UpOwotICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKLQotICBnZW5lcmF0ZV9vYmplY3QodHN0cnVjdCk7Ci0KLSAgZl90eXBlc18gPDwgIi8qIGV4Y2VwdGlvbiAqLyIgPDwgZW5kbAotICAgICAgICAgICA8PCAidHlwZWRlZiBlbnVtIiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9FUlJPUl9DT0RFIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzXyA8PCAifSAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJFcnJvcjsiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgZW5kbAotICAgICAgICAgICA8PCAiR1F1YXJrICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMKLSAgICAgICAgICAgPDwgIl9lcnJvcl9xdWFyayAodm9pZCk7IiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9FUlJPUiAoIgotICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2Vycm9yX3F1YXJrKCkpIiA8PCBlbmRsCi0gICAgICAgICAgIDw8IGVuZGwKLSAgICAgICAgICAgPDwgZW5kbDsKLQotICBmX3R5cGVzX2ltcGxfIDw8ICIvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIGV4Y2VwdGlvbnMgKi8iIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgotICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1JfRE9NQUlOIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYwotICAgICAgICAgICAgICAgIDw8ICJfZXJyb3JfcXVhcmtcIiIgPDwgZW5kbCA8PCAiR1F1YXJrIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjCi0gICAgICAgICAgICAgICAgPDwgIl9lcnJvcl9xdWFyayAodm9pZCkiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMKLSAgICAgICAgICAgICAgICA8PCAiX0VSUk9SX0RPTUFJTik7IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKgotICogSEVMUEVSIEZVTkNUSU9OUyAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogUmV0dXJucyB0cnVlIGlmIHR0eXBlIGlzIG5vdCBhIHByaW1pdGl2ZS4KLSAqLwotYm9vbCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmlzX2NvbXBsZXhfdHlwZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogTWFwcyBhIFRocmlmdCB0X3R5cGUgdG8gYSBDIHR5cGUuCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYsIGJvb2wgaXNfY29uc3QpIHsKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyBibmFtZSA9IGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpOwotCi0gICAgaWYgKGlzX2NvbnN0KSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGJuYW1lOwotICAgIH0KLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBzdHJpbmcgY25hbWU7Ci0KLSAgICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHR5cGU7Ci0gICAgaWYgKHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpKSB7Ci0gICAgICBjbmFtZSA9IHRjb250YWluZXItPmdldF9jcHBfbmFtZSgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBjbmFtZSA9ICJHSGFzaFRhYmxlIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgLy8gc2luY2UgYSBzZXQgcmVxdWlyZXMgdW5pcXVlIGVsZW1lbnRzLCB1c2UgYSBHSGFzaFRhYmxlLCBhbmQKLSAgICAgIC8vIHBvcHVsYXRlIHRoZSBrZXlzIGFuZCB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBkYXRhLCB1c2luZyBrZXlzIGZvcgotICAgICAgLy8gdGhlIGFjdHVhbCB3cml0ZXMgYW5kIHJlYWRzLgotICAgICAgLy8gVE9ETzogZGlzY3VzcyB3aGV0aGVyIG9yIG5vdCB0byBpbXBsZW1lbnQgVFNldCwgVEhhc2hTZXQgb3IgR0hhc2hTZXQKLSAgICAgIGNuYW1lID0gIkdIYXNoVGFibGUiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgLy8gVE9ETzogaW52ZXN0aWdhdGUgb3RoZXIgaW1wbGVtZW50YXRpb25zIGJlc2lkZXMgR1B0ckFycmF5Ci0gICAgICBjbmFtZSA9ICJHUHRyQXJyYXkiOwotICAgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIGlmIChldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKWV0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgY25hbWUgPSAiR0FycmF5IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIE9taXQgdGhlIGRlcmVmZXJlbmNlIG9wZXJhdG9yIGlmIHdlIGFyZSBhbGlhc2luZyB0aGlzIHR5cGUgd2l0aGluIGEKLSAgICAgICB0eXBlZGVmLCB0byBhbGxvdyB0aGUgdHlwZSB0byBiZSB1c2VkIG1vcmUgbmF0dXJhbGx5IGluIGNsaWVudCBjb2RlOwotICAgICAgIG90aGVyd2lzZSwgaW5jbHVkZSBpdCAqLwotICAgIGlmICghaW5fdHlwZWRlZikgewotICAgICAgY25hbWUgKz0gIiAqIjsKLSAgICB9Ci0KLSAgICBpZiAoaXNfY29uc3QpIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIGNuYW1lOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gY25hbWU7Ci0gICAgfQotICB9Ci0KLSAgLy8gY2hlY2sgZm9yIGEgbmFtZXNwYWNlCi0gIHN0cmluZyBwbmFtZSA9IHRoaXMtPm5zcGFjZSArIHR0eXBlLT5nZXRfbmFtZSgpOwotCi0gIGlmIChpc19jb21wbGV4X3R5cGUodHR5cGUpKSB7Ci0gICAgcG5hbWUgKz0gIiAqIjsKLSAgfQotCi0gIGlmIChpc19jb25zdCkgewotICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lOwotICB9IGVsc2UgewotICAgIHJldHVybiBwbmFtZTsKLSAgfQotfQotCi0vKioKLSAqIE1hcHMgYSBUaHJpZnQgcHJpbWl0aXZlIHRvIHRoZSB0eXBlIG5lZWRlZCB0byBob2xkIGl0cyB2YWx1ZSB3aGVuIHVzZWQgYXMgYW4KLSAqIG9iamVjdCBwcm9wZXJ0eS4KLSAqCi0gKiBUaGlzIG1ldGhvZCBpcyBuZWVkZWQgYmVjYXVzZSBhbGwgaW50ZWdlciBwcm9wZXJ0aWVzIG9mIHdpZHRoIGxlc3MgdGhhbiA2NAotICogYml0cyBtYXAgdG8gdGhlIHNhbWUgdHlwZSwgZ2ludCwgYXMgb3Bwb3NlZCB0byB0aGVpciB3aWR0aC1zcGVjaWZpYyB0eXBlCi0gKiAoZ2ludDgsIGdpbnQxNiBvciBnaW50MzIpLgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpwcm9wZXJ0eV90eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGlzX2NvbnN0KSB7Ci0gIHN0cmluZyByZXN1bHQ7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgaWYgKGlzX2NvbnN0KSB7Ci0gICAgICAgIHJlc3VsdCA9ICJjb25zdCBnaW50IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCA9ICJnaW50IjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJlc3VsdCA9IHR5cGVfbmFtZSh0dHlwZSwgaW5fdHlwZWRlZiwgaXNfY29uc3QpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZXN1bHQgPSB0eXBlX25hbWUodHR5cGUsIGluX3R5cGVkZWYsIGlzX2NvbnN0KTsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogTWFwcyBhIFRocmlmdCBwcmltaXRpdmUgdG8gYSBDIHByaW1pdGl2ZS4KLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUpIHsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gIkdCeXRlQXJyYXkgKiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiZ2NoYXIgKiI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJnYm9vbGVhbiI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICByZXR1cm4gImdpbnQ4IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuICJnaW50MTYiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImdpbnQzMiI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAiZ2ludDY0IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJnZG91YmxlIjsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi0vKioKLSAqIFJldHVybnMgYSBtZW1iZXIgb2YgdGhlIFRocmlmdFR5cGUgQyBlbnVtZXJhdGlvbiBpbiB0aHJpZnRfcHJvdG9jb2wuaAotICogZm9yIGEgVGhyaWZ0IHR5cGUuCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVF9TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVF9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRfQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRfSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUX0k2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRfRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICByZXR1cm4gIlRfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVF9TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVF9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgVGhyaWZ0IGNvbnN0YW50IGZvcm1hdHRlZCBhcyBhIGxpdGVyYWwgZm9yIGluY2x1c2lvbiBpbiBDIGNvZGUuCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNvbnN0YW50X2xpdGVyYWwodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAvKiBwcmltaXRpdmVzICovCi0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICJcIiIgKyB2YWx1ZS0+Z2V0X3N0cmluZygpICsgIlwiIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gIlRSVUUiIDogIkZBTFNFIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdmFsdWVfdHlwZSA9IHZhbHVlLT5nZXRfdHlwZSgpOwotCi0gICAgc3dpdGNoICh2YWx1ZV90eXBlKSB7Ci0gICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgotICAgICAgcmVuZGVyIDw8ICJ7ICI7Ci0gICAgICB7Ci0gICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGxpc3QgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgbGlzdF9pdGVyOwotCi0gICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICBsaXN0X2l0ZXIgPSBsaXN0LmJlZ2luKCk7Ci0gICAgICAgICAgcmVuZGVyIDw8IGNvbnN0YW50X2xpdGVyYWwoZWxlbV90eXBlLCAqbGlzdF9pdGVyKTsKLQotICAgICAgICAgIHdoaWxlICgrK2xpc3RfaXRlciAhPSBsaXN0LmVuZCgpKSB7Ci0gICAgICAgICAgICByZW5kZXIgPDwgIiwgIiA8PCBjb25zdGFudF9saXRlcmFsKGVsZW1fdHlwZSwgKmxpc3RfaXRlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZW5kZXIgPDwgIiB9IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgotICAgIGRlZmF1bHQ6Ci0gICAgICByZW5kZXIgPDwgIk5VTEwgLyogbm90IHN1cHBvcnRlZCAqLyI7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgY29uc3RhbnQuCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNvbnN0YW50X3ZhbHVlKHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIG9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIC8qIHByaW1pdGl2ZXMgKi8KLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICJnX3N0cmR1cCAoXCIiICsgdmFsdWUtPmdldF9zdHJpbmcoKSArICJcIikiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgIT0gMCkgPyAxIDogMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkKLSAgICAgICAgICAgICB8fCB0eXBlLT5pc19tYXAoKSkgewotICAgIHJlbmRlciA8PCAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHRvX2xvd2VyX2Nhc2UobmFtZSkgPDwgIl9jb25zdGFudCgpKSI7Ci0gIH0gZWxzZSB7Ci0gICAgcmVuZGVyIDw8ICJOVUxMIC8qIG5vdCBzdXBwb3J0ZWQgKi8iOwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIHRfc3RydWN0KiB4bGlzdCA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBzdHJpbmcgZm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKLQotICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKLSAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0gIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICByZXR1cm4gImdib29sZWFuICIgKyB0aGlzLT5uc3BhY2VfbGMgKyBmbmFtZSArICIgKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICogaWZhY2UiCi0gICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQotICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdsaXN0KSkpCi0gICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeGxpc3QpKSkgKyAiLCBHRXJyb3IgKiogZXJyb3IpIjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHJldHVybiBDb21tYSBzZXBlYXJhdGVkIGxpc3Qgb2YgYWxsIGZpZWxkIG5hbWVzIGluIHRoYXQgc3RydWN0Ci0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKSArICIgIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgbXV0YWJsZSBleGNlcHRpb24gbGlzdHMKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEByZXR1cm4gQ29tbWEgc2VwZWFyYXRlZCBsaXN0IG9mIGFsbCBmaWVsZCBuYW1lcyBpbiB0aGF0IHN0cnVjdAotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp4Y2VwdGlvbl9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiogIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIGluY2x1ZGluZyBhbnkgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVmZXJlbmNlKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgaWYgKGNvbnN0YW50KSB7Ci0gICAgcmVzdWx0ICs9ICJjb25zdCAiOwotICB9Ci0gIHJlc3VsdCArPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKHBvaW50ZXIpIHsKLSAgICByZXN1bHQgKz0gIioiOwotICB9Ci0gIGlmIChyZWZlcmVuY2UpIHsKLSAgICByZXN1bHQgKz0gIioiOwotICB9Ci0gIHJlc3VsdCArPSAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChnZG91YmxlKSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBOVUxMIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgaW50aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR5cGUpICsgIikgMCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBOVUxMIjsKLSAgICB9Ci0gIH0KLQotICBpZiAoIXJlZmVyZW5jZSkgewotICAgIHJlc3VsdCArPSAiOyI7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCBpbml0aWFsaXplcyBjb21wbGV4IGNvbnN0YW50cy4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOwotICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZV91KTsKLSAgc3RyaW5nIHR5cGVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgc3RyaW5nIHR5cGVfdWMgPSB0b191cHBlcl9jYXNlKHR5cGVfdSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKLQotICAgIC8vIGluaXRpYWxpemUgYW55IGNvbnN0YW50cyB0aGF0IG1heSBiZSByZWZlcmVuY2VkIGJ5IHRoaXMgaW5pdGlhbGl6ZXIKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gIiI7Ci0KLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKLSAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGZpZWxkX25hbWUgPSB0bXAoZmllbGRfbmFtZSk7Ci0KLSAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKG5hbWUgKyAiX2NvbnN0YW50XyIgKyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluaXRpYWxpemVycyA8PCAiICAgIGNvbnN0YW50LT4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIgotICAgICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKG5hbWUgKyAiX2NvbnN0YW50XyIgKyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9pdGVyLT5zZWNvbmQpIDw8ICI7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgIiAgICBjb25zdGFudC0+X19pc3NldF8iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgPSBUUlVFOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBpbXBsZW1lbnQgdGhlIGluaXRpYWxpemVyCi0gICAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljICIgPDwgdGhpcy0+bnNwYWNlIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIiAqIgotICAgICAgICAgICAgICAgICAgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljICIgPDwgdGhpcy0+bnNwYWNlIDw8IHR5cGUtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICIgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY29uc3RhbnQgPSBnX29iamVjdF9uZXcgKCIgPDwgdGhpcy0+bnNwYWNlX3VjCi0gICAgICAgICAgICAgICAgICA8PCAiVFlQRV8iIDw8IHR5cGVfdWMgPDwgIiwgTlVMTCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICA8PCBpbml0aWFsaXplcnMuc3RyKCk7Ci0gICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29uc3RhbnQ7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBsaXN0X3R5cGUgPSAiR1B0ckFycmF5ICoiOwotICAgIC8vIFRPRE86IFRoaXMgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGNvbnRhaW4gYSBmcmVlIGZ1bmN0aW9uIGZvciBjb250YWluZXIKLSAgICBzdHJpbmcgbGlzdF9pbml0aWFsaXplciA9ICJnX3B0cl9hcnJheV9uZXcoKTsiOwotICAgIHN0cmluZyBsaXN0X2FwcGVuZGVyID0gImdfcHRyX2FycmF5X2FkZCI7Ci0gICAgYm9vbCBsaXN0X3ZhcmlhYmxlID0gZmFsc2U7Ci0KLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOwotICAgIG9zdHJpbmdzdHJlYW0gYXBwZW5kZXJzOwotCi0gICAgbGlzdF9pbml0aWFsaXplciA9IGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUoZXR5cGUpOwotICAgIGlmIChldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKilldHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBsaXN0X3R5cGUgPSAiR0FycmF5ICoiOwotICAgICAgICBsaXN0X2FwcGVuZGVyID0gImdfYXJyYXlfYXBwZW5kX3ZhbCI7Ci0gICAgICAgIGxpc3RfdmFyaWFibGUgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBmbmFtZSA9IHRtcChuYW1lKTsKLQotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoZm5hbWUsIGV0eXBlLCAoKnZfaXRlcikpOwotICAgICAgaWYgKGxpc3RfdmFyaWFibGUpIHsKLSAgICAgICAgaW5pdGlhbGl6ZXJzIDw8ICIgICAgIiA8PCB0eXBlX25hbWUoZXR5cGUpIDw8ICIgIiA8PCBmbmFtZSA8PCAiID0gIgotICAgICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCAoKnZfaXRlcikpIDw8ICI7IgotICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgYXBwZW5kZXJzIDw8ICIgICAgIiA8PCBsaXN0X2FwcGVuZGVyIDw8ICIoY29uc3RhbnQsICIgPDwgZm5hbWUgPDwgIik7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGFwcGVuZGVycyA8PCAiICAgICIgPDwgbGlzdF9hcHBlbmRlciA8PCAiKGNvbnN0YW50LCAiCi0gICAgICAgICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShmbmFtZSwgKHRfdHlwZSopZXR5cGUsICgqdl9pdGVyKSkgPDwgIik7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgIiA8PCBsaXN0X3R5cGUgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljICIgPDwgbGlzdF90eXBlIDw8ICIgY29uc3RhbnQgPSBOVUxMOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7Ci0gICAgaWYgKCFpbml0aWFsaXplcnMuc3RyKCkuZW1wdHkoKSkgewotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbml0aWFsaXplcnMuc3RyKCkKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY29uc3RhbnQgPSAiIDw8IGxpc3RfaW5pdGlhbGl6ZXIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgPDwgYXBwZW5kZXJzLnN0cigpOwotICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKLSAgICBvc3RyaW5nc3RyZWFtIGFwcGVuZGVyczsKLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZm5hbWUgPSB0bXAobmFtZSk7Ci0gICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihmbmFtZSwgZXR5cGUsICgqdl9pdGVyKSk7Ci0gICAgICBpbml0aWFsaXplcnMgPDwgIiAgICAiIDw8IHR5cGVfbmFtZShldHlwZSkgPDwgIiAiIDw8IGZuYW1lIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCAoKnZfaXRlcikpIDw8ICI7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBhcHBlbmRlcnMgPDwgIiAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChjb25zdGFudCwgJiIgPDwgZm5hbWUgPDwgIiwgJiIKLSAgICAgICAgICAgICAgICA8PCBmbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIEdIYXNoVGFibGUgKiIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljIEdIYXNoVGFibGUgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBpbml0aWFsaXplcnMuc3RyKCkKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGNvbnRhaW4gYSBmcmVlIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAvLyBmb3IgZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjb25zdGFudCA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgIDw8IGFwcGVuZGVycy5zdHIoKTsKLSAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb25zdGFudDsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOwotICAgIG9zdHJpbmdzdHJlYW0gYXBwZW5kZXJzOwotCi0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBmbmFtZSA9IHRtcChuYW1lKTsKLSAgICAgIHN0cmluZyBrbmFtZSA9IGZuYW1lICsgImtleSI7Ci0gICAgICBzdHJpbmcgdm5hbWUgPSBmbmFtZSArICJ2YWwiOwotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoa25hbWUsIGt0eXBlLCAoKnZfaXRlcikpOwotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIodm5hbWUsIHZ0eXBlLCAoKnZfaXRlcikpOwotCi0gICAgICBpbml0aWFsaXplcnMgPDwgIiAgICAiIDw8IHR5cGVfbmFtZShrdHlwZSkgPDwgIiAiIDw8IGtuYW1lIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUoa25hbWUsICh0X3R5cGUqKWt0eXBlLCAoKnZfaXRlcikpIDw8ICI7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCAiICAgICIgPDwgdHlwZV9uYW1lKHZ0eXBlKSA8PCAiICIgPDwgdm5hbWUgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZSh2bmFtZSwgKHRfdHlwZSopdnR5cGUsICgqdl9pdGVyKSkgPDwgIjsiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGFwcGVuZGVycyA8PCAiICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnN0YW50LCAmIiA8PCBmbmFtZSA8PCAiLCAmIgotICAgICAgICAgICAgICAgIDw8IGZuYW1lIDw8ICIpOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyBHSGFzaFRhYmxlICoiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyBHSGFzaFRhYmxlICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5pdGlhbGl6ZXJzLnN0cigpCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIGluaXRpYWxpemF0aW9uIHNob3VsZCBjb250YWluIGEgZnJlZSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgLy8gZm9yIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY29uc3RhbnQgPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICA8PCBhcHBlbmRlcnMuc3RyKCk7Ci0gICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29uc3RhbnQ7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBjbGFzc2VzIGZvciBhIHNlcnZpY2UsIGNvbnNpc3Rpbmcgb2YgYSBUaHJpZnRTdHJ1Y3Qgc3ViY2xhc3MKLSAqIGZvciB0aGUgYXJndW1lbnRzIHRvIGFuZCB0aGUgcmVzdWx0IGZyb20gZWFjaCBtZXRob2QuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBnZW5lcmF0ZSBoZWxwZXIgY2xhc3NlcwotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmdW5jdGlvbl9pdGVyOwotCi0gIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc2VydmljZSdzIG1ldGhvZHMKLSAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBzdHJpbmcgYXJnX2xpc3RfbmFtZV9vcmlnID0gYXJnX2xpc3QtPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgYXJndW1lbnRzIGNsYXNzCi0gICAgYXJnX2xpc3QtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKGZ1bmN0aW9uX25hbWUpICsgIkFyZ3MiKTsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3QoYXJnX2xpc3QpOwotCi0gICAgYXJnX2xpc3QtPnNldF9uYW1lKGFyZ19saXN0X25hbWVfb3JpZyk7Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgcmVzdWx0IGNsYXNzCi0gICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLAotICAgICAgICAgICAgICAgICAgICAgIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKGZ1bmN0aW9uX25hbWUpICsgIlJlc3VsdCIpOwotICAgICAgdF9maWVsZCBzdWNjZXNzKCgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gICAgICBzdWNjZXNzLnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7Ci0gICAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmaWVsZF9pdGVyOwotICAgICAgZm9yIChmaWVsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZpZWxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKLSAgICAgICAgKCpmaWVsZF9pdGVyKS0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgqZmllbGRfaXRlcik7Ci0gICAgICB9Ci0KLSAgICAgIGdlbmVyYXRlX3N0cnVjdCgmcmVzdWx0KTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIGNsaWVudC4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLyogZ2V0IHNvbWUgQyBmcmllbmRseSBzZXJ2aWNlIG5hbWVzICovCi0gIHN0cmluZyBzZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKSk7Ci0gIHN0cmluZyBzZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfbmFtZV9sYyk7Ci0KLSAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWU7Ci0gIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX2xjOwotICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV91YzsKLQotICBzdHJpbmcgcGFyZW50X2NsYXNzX25hbWUgPSAiR09iamVjdCI7Ci0gIHN0cmluZyBwYXJlbnRfdHlwZV9uYW1lID0gIkdfVFlQRV9PQkpFQ1QiOwotCi0gIC8vIFRoZSBzZXJ2aWNlIHRoaXMgc2VydmljZSBleHRlbmRzLCBvciBOVUxMIGlmIGl0IGV4dGVuZHMgbm8KLSAgLy8gc2VydmljZQotICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7Ci0gICAgLy8gVGhlIG5hbWUgb2YgdGhlIHBhcmVudCBzZXJ2aWNlCi0gICAgcGFyZW50X3NlcnZpY2VfbmFtZSA9IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKTsKLSAgICBwYXJlbnRfc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocGFyZW50X3NlcnZpY2VfbmFtZSkpOwotICAgIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHBhcmVudF9zZXJ2aWNlX25hbWVfbGMpOwotCi0gICAgLy8gVGhlIG5hbWVzIG9mIHRoZSBjbGllbnQgY2xhc3MnIHBhcmVudCBjbGFzcyBhbmQgdHlwZQotICAgIHBhcmVudF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJDbGllbnQiOwotICAgIHBhcmVudF90eXBlX25hbWUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgcGFyZW50X3NlcnZpY2VfbmFtZV91YyArICJfQ0xJRU5UIjsKLSAgfQotCi0gIC8vIFRoZSBiYXNlIHNlcnZpY2UgKHRoZSB0b3Btb3N0IGluIHRoZSAiZXh0ZW5kcyIgaGllcmFyY2h5KSwgb24KLSAgLy8gd2hvc2UgY2xpZW50IGNsYXNzIHRoZSAiaW5wdXRfcHJvdG9jb2wiIGFuZCAib3V0cHV0X3Byb3RvY29sIgotICAvLyBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkCi0gIHRfc2VydmljZSogYmFzZV9zZXJ2aWNlID0gdHNlcnZpY2U7Ci0gIHdoaWxlIChiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKLSAgICBiYXNlX3NlcnZpY2UgPSBiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIH0KLQotICBzdHJpbmcgYmFzZV9zZXJ2aWNlX25hbWUgPSBiYXNlX3NlcnZpY2UtPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBiYXNlX3NlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGJhc2Vfc2VydmljZV9uYW1lKSk7Ci0gIHN0cmluZyBiYXNlX3NlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoYmFzZV9zZXJ2aWNlX25hbWVfbGMpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgaW50ZXJmYWNlIGR1bW15IG9iamVjdCBpbiB0aGUgaGVhZGVyLgotICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHNlcnZpY2UgaW50ZXJmYWNlICovIiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIgotICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmOyAiCi0gICAgICAgICAgICA8PCAiIC8qIGR1bW15IG9iamVjdCAqLyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgaW50ZXJmYWNlIG9iamVjdCBpbiB0aGUgaGVhZGVyLgotICBmX2hlYWRlcl8gPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8ICIgIEdUeXBlSW50ZXJmYWNlIHBhcmVudDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvKiB3cml0ZSBvdXQgdGhlIGZ1bmN0aW9ucyBmb3IgdGhpcyBpbnRlcmZhY2UgKi8KLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLwotICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCogYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICB0X3N0cnVjdCogeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKLSAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLQotICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdsaXN0KSkpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4bGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7Ci0KLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiZ2Jvb2xlYW4gKCoiIDw8IGZ1bm5hbWUgPDwgIikgIiA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgIgotICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIGFsbCB0aGUgaW50ZXJmYWNlIGJvaWxlcnBsYXRlCi0gIGZfaGVhZGVyXyA8PCAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbAotICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiAiCi0gICAgICAgICAgICA8PCAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKLSAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRihvYmopICIKLSAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYpKSIgPDwgZW5kbAotICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiCi0gICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgotICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YwotICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUZfR0VUX0lOVEVSRkFDRShpbnN0KSAoR19UWVBFX0lOU1RBTkNFX0dFVF9JTlRFUkZBQ0UgKChpbnN0KSwgIgotICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsICIgPDwgdGhpcy0+bnNwYWNlCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSkpIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gd3JpdGUgb3V0IGFsbCB0aGUgaW50ZXJmYWNlIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KLSAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgdF9zdHJ1Y3QqIHhsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7Ci0gICAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0gICAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0KLSAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeGxpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOwotCi0gICAgZl9oZWFkZXJfIDw8ICJnYm9vbGVhbiAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl8iIDw8IGZ1bm5hbWUgPDwgIiAiCi0gICAgICAgICAgICAgIDw8IHBhcmFtcyA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IG9iamVjdCBpbnN0YW5jZSBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIuCi0gIGZfaGVhZGVyXyA8PCAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgc2VydmljZSBjbGllbnQgKi8iIDw8IGVuZGwgPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UKLSAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICAiIDw8IHBhcmVudF9jbGFzc19uYW1lCi0gICAgICAgICAgICA8PCAiIHBhcmVudDsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kc19zZXJ2aWNlKSB7Ci0gICAgLy8gRGVmaW5lICJpbnB1dF9wcm90b2NvbCIgYW5kICJvdXRwdXRfcHJvdG9jb2wiIHByb3BlcnRpZXMgb25seQotICAgIC8vIGZvciBiYXNlIHNlcnZpY2VzOyBjaGlsZCBzZXJ2aWNlLWNsaWVudCBjbGFzc2VzIHdpbGwgaW5oZXJpdAotICAgIC8vIHRoZXNlCi0gICAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIiAgVGhyaWZ0UHJvdG9jb2wgKmlucHV0X3Byb3RvY29sOyIgPDwgZW5kbAotICAgICAgICAgICAgICA8PCAiICBUaHJpZnRQcm90b2NvbCAqb3V0cHV0X3Byb3RvY29sOyIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICIKLSAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGNsYXNzIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlci4KLSAgZl9oZWFkZXJfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCi0gICAgICAgICAgICA8PCAiICAiIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbAotICAgICAgICAgICAgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyAiIDw8IHRoaXMtPm5zcGFjZQotICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gQ3JlYXRlIGFsbCB0aGUgR09iamVjdCBib2lsZXJwbGF0ZQotICBmX2hlYWRlcl8gPDwgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsCi0gICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCAiCi0gICAgICAgICAgICA8PCAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfdHlwZSgpKSIgPDwgZW5kbAotICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UKG9iaikgIgotICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKLSAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50KSkiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9DTEFTUyhjKSAiCi0gICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjCi0gICAgICAgICAgICA8PCAiX0NMSUVOVCwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCi0gICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSVNfQ0xJRU5UKG9iaikgIgotICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKLSAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JU19DTElFTlRfQ0xBU1MoYykgIgotICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YwotICAgICAgICAgICAgPDwgIl9DTElFTlQpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKLSAgICAgICAgICAgIDw8ICJfQ0xJRU5UX0dFVF9DTEFTUyhvYmopICIKLSAgICAgICAgICAgIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKLSAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MpKSIKLSAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvKiB3cml0ZSBvdXQgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KLSAgICBzdHJpbmcgZnVubmFtZSA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOwotCi0gICAgdF9mdW5jdGlvbiBzZXJ2aWNlX2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50XyIpICsgZnVubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZXJ2aWNlX2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKLQotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50X3NlbmRfIikgKyBmdW5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICAvLyBpbXBsZW1lbnQgcmVjdiBpZiBub3QgYSBvbmV3YXkgc2VydmljZQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50X3JlY3ZfIikgKyBmdW5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvKiB3cml0ZSBvdXQgdGhlIGdldC9zZXQgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotICBmX2hlYWRlcl8gPDwgInZvaWQgIiArIHNlcnZpY2VfbmFtZV9sYyArICJfY2xpZW50X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnR5X2lkLCBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYyk7IgotICAgICAgICAgICAgPDwgZW5kbDsKLSAgZl9oZWFkZXJfIDw8ICJ2b2lkICIgKyBzZXJ2aWNlX25hbWVfbGMgKyAiX2NsaWVudF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eV9pZCwgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpOyIKLSAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgZl9oZWFkZXJfIDw8IGVuZGw7Ci0gIC8vIGVuZCBvZiBoZWFkZXIgY29kZQotCi0gIC8vIEdlbmVyYXRlIGludGVyZmFjZSBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCi0gICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHRfc3RydWN0KiB4bGlzdCA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOwotICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotCi0gICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgotICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQotICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhsaXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKLQotICAgIHN0cmluZyBwYXJhbXNfd2l0aG91dF90eXBlID0gc3RyaW5nKCJpZmFjZSwgIikgKyAoaGFzX3JldHVybiA/ICJfcmV0dXJuLCAiIDogIiIpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXJfZmllbGQ7Ci0gICAgZm9yIChmX2l0ZXJfZmllbGQgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyX2ZpZWxkICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXJfZmllbGQpIHsKLSAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gKCpmX2l0ZXJfZmllbGQpLT5nZXRfbmFtZSgpOwotICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAiLCAiOwotICAgIH0KLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAoKnhfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICIsICI7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCAiZ2Jvb2xlYW4iIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmXyIgPDwgZnVubmFtZQotICAgICAgICAgICAgICAgPDwgIiAiIDw8IHBhcmFtcyA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsIDw8ICIgIHJldHVybiAiIDw8IHRoaXMtPm5zcGFjZV91YwotICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUZfR0VUX0lOVEVSRkFDRSAoaWZhY2UpLT4iIDw8IGZ1bm5hbWUgPDwgIiAoIgotICAgICAgICAgICAgICAgPDwgcGFyYW1zX3dpdGhvdXRfdHlwZSA8PCAiZXJyb3IpOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgaW50ZXJmYWNlIGJvaWxlcnBsYXRlCi0gIGZfc2VydmljZV8gPDwgIkdUeXBlIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9nZXRfdHlwZSAodm9pZCkiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICBzdGF0aWMgR1R5cGUgdHlwZSA9IDA7IiA8PCBlbmRsIDw8ICIgIGlmICh0eXBlID09IDApIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgeyIgPDwgZW5kbCA8PCAiICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gdHlwZV9pbmZvID0iIDw8IGVuZGwgPDwgIiAgICB7IgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UpLCIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAgLyogYmFzZV9pbml0ICovIiA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAgLyogYmFzZV9maW5hbGl6ZSAqLyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAgLyogY2xhc3NfaW5pdCAqLyIgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgIC8qIGNsYXNzX2ZpbmFsaXplICovIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsICAvKiBjbGFzc19kYXRhICovIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgIiAgICAgIDAsICAgICAvKiBpbnN0YW5jZV9zaXplICovIiA8PCBlbmRsIDw8ICIgICAgICAwLCAgICAgLyogbl9wcmVhbGxvY3MgKi8iCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgIC8qIGluc3RhbmNlX2luaXQgKi8iIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCAgIC8qIHZhbHVlX3RhYmxlICovIiA8PCBlbmRsIDw8ICIgICAgfTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiICAgIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHX1RZUEVfSU5URVJGQUNFLCIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZcIiwiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV9pbmZvLCAwKTsiIDw8IGVuZGwgPDwgIiAgfSIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHJldHVybiB0eXBlOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBib2lsZXJwbGF0ZQotICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCAiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYwotICAgICAgICAgICAgIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSk7IgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCAiR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgICA8PCAiQ2xpZW50LCAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnQsIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAiIDw8IHBhcmVudF90eXBlX25hbWUgPDwgIiwgIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKLSAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA8PCB0aGlzLT5uc3BhY2VfbGMKLSAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCkpIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgcHJvcGVydHktcmVsYXRlZCBjb2RlIG9ubHkgZm9yIGJhc2Ugc2VydmljZXMtLS1jaGlsZAotICAvLyBzZXJ2aWNlLWNsaWVudCBjbGFzc2VzIGhhdmUgb25seSBwcm9wZXJ0aWVzIGluaGVyaXRlZCBmcm9tIHRoZWlyCi0gIC8vIHBhcmVudCBjbGFzcwotICBpZiAoIWV4dGVuZHNfc2VydmljZSkgewotICAgIC8vIEdlbmVyYXRlIGNsaWVudCBwcm9wZXJ0aWVzCi0gICAgZl9zZXJ2aWNlXyA8PCAiZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50UHJvcGVydGllcyIgPDwgZW5kbCA8PCAieyIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgUFJPUF8wLCIgPDwgZW5kbCA8PCAiICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YwotICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0wsIiA8PCBlbmRsIDw8ICIgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMKLSAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0wiIDw8IGVuZGwgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBzZXR0ZXIKLSAgICBmX3NlcnZpY2VfIDw8ICJ2b2lkIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfc2V0X3Byb3BlcnR5ICgiCi0gICAgICAgICAgICAgICA8PCAiR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgY29uc3QgR1ZhbHVlICp2YWx1ZSwgIgotICAgICAgICAgICAgICAgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICAiIDw8IHRoaXMtPm5zcGFjZQotICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKLSAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UIChvYmplY3QpOyIgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBjYXNlIFBST1BfIgotICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgICAgICBjbGllbnQtPmlucHV0X3Byb3RvY29sID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8ICIgICAgY2FzZSBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YwotICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MOiIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgICAgIGNsaWVudC0+b3V0cHV0X3Byb3RvY29sID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8ICIgIH0iIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIGdlbmVyYXRlIHByb3BlcnR5IGdldHRlcgotICAgIGZfc2VydmljZV8gPDwgInZvaWQiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfcHJvcGVydHkgKCIKLSAgICAgICAgICAgICAgIDw8ICJHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLCBHVmFsdWUgKnZhbHVlLCAiCi0gICAgICAgICAgICAgICA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsIDw8ICIgICIgPDwgdGhpcy0+bnNwYWNlCi0gICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YwotICAgICAgICAgICAgICAgPDwgIl9DTElFTlQgKG9iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgc3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGwgPDwgIiAgeyIgPDwgZW5kbCA8PCAiICAgIGNhc2UgUFJPUF8iCi0gICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MOiIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIGNsaWVudC0+aW5wdXRfcHJvdG9jb2wpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICAgIGNhc2UgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKLSAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBjbGllbnQtPm91dHB1dF9wcm90b2NvbCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8ICIgIH0iIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcyBhbmQgZXhjZXB0aW9ucwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgLy8gRnVuY3Rpb24gZm9yIHNlbmRpbmcKLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9zZW5kXyIpICsgZnVubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgIC8vIE9wZW4gdGhlIHNlbmQgZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgc3RyaW5nIHJlcVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRfT05FV0FZIiA6ICJUX0NBTEwiOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIGNzZXFpZCA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKiBwcm90b2NvbCA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IGJhc2Vfc2VydmljZV9uYW1lX3VjCi0gICAgICAgICAgICAgICA8PCAiX0NMSUVOVCAoaWZhY2UpLT5vdXRwdXRfcHJvdG9jb2w7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCBcIiIgPDwgbmFtZSA8PCAiXCIsICIKLSAgICAgICAgICAgICAgIDw8IHJlcVR5cGUgPDwgIiwgY3NlcWlkLCBlcnJvcikgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IgotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihmX3NlcnZpY2VfLCBhcmdfc3RydWN0LCAiIiwgIiIsIGZhbHNlKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBlcnJvcikgPCAwKSIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgImlmICghdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgImlmICghdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKSkiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFRSVUU7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgLy8gR2VuZXJhdGUgcmVjdiBmdW5jdGlvbiBvbmx5IGlmIG5vdCBhbiBhc3luYyBmdW5jdGlvbgotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50X3JlY3ZfIikgKyBmdW5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnaW50MzIgcnNlcWlkOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ2NoYXIgKiBmbmFtZSA9IE5VTEw7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRNZXNzYWdlVHlwZSBtdHlwZTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFByb3RvY29sICogcHJvdG9jb2wgPSAiCi0gICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBiYXNlX3NlcnZpY2VfbmFtZV91YwotICAgICAgICAgICAgICAgICA8PCAiX0NMSUVOVCAoaWZhY2UpLT5pbnB1dF9wcm90b2NvbDsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbjsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gIgotICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLCAmZm5hbWUsICZtdHlwZSwgJnJzZXFpZCwgZXJyb3IpIDwgMCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBGQUxTRTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gVF9FWENFUFRJT04pIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ4Y2VwdGlvbiA9IGdfb2JqZWN0X25ldyAiCi0gICAgICAgICAgICAgICAgICAgICIoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBOVUxMKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoeGNlcHRpb24pLCAiCi0gICAgICAgICAgICAgICAgICAgICJwcm90b2NvbCwgTlVMTCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAiCi0gICAgICAgICAgICAgICAgICAgICIocHJvdG9jb2wsIE5VTEwpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAiCi0gICAgICAgICAgICAgICAgICAgICIocHJvdG9jb2wtPnRyYW5zcG9ydCwgTlVMTCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnX3NldF9lcnJvciAoZXJyb3IsICIKLSAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IseGNlcHRpb24tPnR5cGUsICIKLSAgICAgICAgICAgICAgICAgICAgIlwiYXBwbGljYXRpb24gZXJyb3I6ICVzXCIsIHhjZXB0aW9uLT5tZXNzYWdlKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRkFMU0U7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiAobXR5cGUgIT0gVF9SRVBMWSkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgVF9TVFJVQ1QsICIKLSAgICAgICAgICAgICAgICAgICAgIk5VTEwpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCAiCi0gICAgICAgICAgICAgICAgICAgICJOVUxMKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKCIKLSAgICAgICAgICAgICAgICAgICAgInByb3RvY29sLT50cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19zZXRfZXJyb3IgKGVycm9yLCAiCi0gICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SLCAiCi0gICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfTUVTU0FHRV9UWVBFLCAiCi0gICAgICAgICAgICAgICAgICAgICJcImludmFsaWQgbWVzc2FnZSB0eXBlICVkLCBleHBlY3RlZCBUX1JFUExZXCIsIG10eXBlKTsiCi0gICAgICAgICAgICAgICAgIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBGQUxTRTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIChzdHJuY21wIChmbmFtZSwgXCIiIDw8IG5hbWUKLSAgICAgICAgICAgICAgICAgPDwgIlwiLCAiIDw8IG5hbWUubGVuZ3RoKCkgPDwgIikgIT0gMCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBUX1NUUlVDVCwgIgotICAgICAgICAgICAgICAgICAgICAiTlVMTCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIgotICAgICAgICAgICAgICAgICAgICAiZXJyb3IpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoIgotICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19zZXRfZXJyb3IgKGVycm9yLCAiCi0gICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SLCAiCi0gICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1dST05HX01FVEhPRF9OQU1FLCAiCi0gICAgICAgICAgICAgICAgICAgICJcIndyb25nIG1ldGhvZCBuYW1lICVzLCBleHBlY3RlZCAiIDw8IG5hbWUKLSAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBmbmFtZSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgICAgIHsKLSAgICAgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgICAgIHRfZmllbGQgc3VjY2VzcygoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICIqX3JldHVybiIsIDApOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgcmVhZGVycyBmb3IgZXhjZXB0aW9ucywgZGVyZWZlcmVuY2luZyB0aGUgcG9pbnRlci4KLSAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgeF9pdGVyKyspIHsKLSAgICAgICAgICB0X2ZpZWxkKiB4Y2VwdGlvbiA9IG5ldyB0X2ZpZWxkKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqIiArICgqeF9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X2tleSgpKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKHhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoZl9zZXJ2aWNlXywgJnJlc3VsdCwgIiIsICIiLCBmYWxzZSk7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIGVycm9yKSA8IDApIgotICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiaWYgKCF0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcikpIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgLy8gY29weSBvdmVyIGFueSB0aHJvdyBleGNlcHRpb25zIGFuZCByZXR1cm4gZmFpbHVyZQotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgeF9pdGVyKyspIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCoiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBnX3NldF9lcnJvciAoZXJyb3IsICIKLSAgICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMKLSAgICAgICAgICAgICAgICAgICA8PCB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpKQotICAgICAgICAgICAgICAgICAgIDw8ICJfRVJST1IsICIgPDwgdGhpcy0+bnNwYWNlX3VjCi0gICAgICAgICAgICAgICAgICAgPDwgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICA8PCAiX0VSUk9SX0NPREUsIFwiIiA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gVFJVRTsiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICB0X2Z1bmN0aW9uIHNlcnZpY2VfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcoIl9jbGllbnRfIikgKyBmdW5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZXJ2aWNlX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgLy8gd3JhcCBlYWNoIGZ1bmN0aW9uCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfc2VuZF8iCi0gICAgICAgICAgICAgICA8PCBmdW5uYW1lIDw8ICIgKGlmYWNlIjsKLQotICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiLCBlcnJvcikpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBpZiBub3Qgb25ld2F5LCBpbXBsZW1lbnQgcmVjdgotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJldCA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpID8gIiIgOiAiX3JldHVybiwgIjsKLQotICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICByZXQgKz0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICByZXQgKz0gIiwgIjsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfcmVjdl8iCi0gICAgICAgICAgICAgICAgIDw8IGZ1bm5hbWUgPDwgIiAoaWZhY2UsICIgPDwgcmV0IDw8ICJlcnJvcikpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gcmV0dXJuIFRSVUUgd2hpY2ggbWVhbnMgYWxsIGZ1bmN0aW9ucyB3ZXJlIGNhbGxlZCBPSwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIFRSVUU7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgLy8gY3JlYXRlIHRoZSBpbnRlcmZhY2UgaW5pdGlhbGl6ZXIKLSAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIKLSAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgKmlmYWNlKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KLSAgICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlLT4iIDw8IGZ1bm5hbWUgPDwgIiA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjCi0gICAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF8iIDw8IGZ1bm5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBjcmVhdGUgdGhlIGNsaWVudCBpbnN0YW5jZSBpbml0aWFsaXplcgotICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfaW5pdCAoIgotICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoIWV4dGVuZHNfc2VydmljZSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNsaWVudC0+aW5wdXRfcHJvdG9jb2wgPSBOVUxMOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNsaWVudC0+b3V0cHV0X3Byb3RvY29sID0gTlVMTDsiIDw8IGVuZGw7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGNsaWVudCk7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBjcmVhdGUgdGhlIGNsaWVudCBjbGFzcyBpbml0aWFsaXplcgotICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjCi0gICAgICAgICAgICAgPDwgIl9jbGllbnRfY2xhc3NfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MgKmNscykiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsiIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjCi0gICAgICAgICAgICAgICA8PCAiX2NsaWVudF9zZXRfcHJvcGVydHk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMKLSAgICAgICAgICAgICAgIDw8ICJfY2xpZW50X2dldF9wcm9wZXJ0eTsiIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwiaW5wdXRfcHJvdG9jb2xcIiwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlucHV0IHByb3RvY29sIChjb25zdHJ1Y3QpXCIsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTZXQgdGhlIGNsaWVudCBpbnB1dCBwcm90b2NvbFwiLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YwotICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0wsIHBhcmFtX3NwZWMpOyIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoXCJvdXRwdXRfcHJvdG9jb2xcIiwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm91dHB1dCBwcm90b2NvbCAoY29uc3RydWN0KVwiLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2V0IHRoZSBjbGllbnQgb3V0cHV0IHByb3RvY29sXCIsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCi0gICAgICAgICAgICAgICA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0wsIHBhcmFtX3NwZWMpOyIgPDwgZW5kbDsKLSAgfQotICBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIgIFRIUklGVF9VTlVTRURfVkFSIChjbHMpOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBoYW5kbGVyLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgYSBoYW5kbGVyLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oYW5kbGVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jdGlvbl9pdGVyOwotCi0gIHN0cmluZyBzZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKSk7Ci0gIHN0cmluZyBzZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfbmFtZV9sYyk7Ci0KLSAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIkhhbmRsZXIiOwotICBzdHJpbmcgY2xhc3NfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGNsYXNzX25hbWUpKTsKLSAgc3RyaW5nIGNsYXNzX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGNsYXNzX25hbWVfbGMpOwotCi0gIHN0cmluZyBwYXJlbnRfY2xhc3NfbmFtZTsKLSAgc3RyaW5nIHBhcmVudF90eXBlX25hbWU7Ci0KLSAgc3RyaW5nIGFyZ3NfaW5kZW50OwotCi0gIC8vIFRoZSBzZXJ2aWNlIHRoaXMgc2VydmljZSBleHRlbmRzLCBvciBOVUxMIGlmIGl0IGV4dGVuZHMgbm8gc2VydmljZQotICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotCi0gIC8vIERldGVybWluZSB0aGUgbmFtZSBvZiBvdXIgcGFyZW50IHNlcnZpY2UgKGlmIGFueSkgYW5kIHRoZSBoYW5kbGVyIGNsYXNzJwotICAvLyBwYXJlbnQgY2xhc3MgbmFtZSBhbmQgdHlwZQotICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7Ci0gICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWUgPSBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhwYXJlbnRfc2VydmljZV9uYW1lKSk7Ci0gICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHBhcmVudF9zZXJ2aWNlX25hbWVfbGMpOwotCi0gICAgcGFyZW50X2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBwYXJlbnRfc2VydmljZV9uYW1lICsgIkhhbmRsZXIiOwotICAgIHBhcmVudF90eXBlX25hbWUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgcGFyZW50X3NlcnZpY2VfbmFtZV91YyArICJfSEFORExFUiI7Ci0gIH0gZWxzZSB7Ci0gICAgcGFyZW50X2NsYXNzX25hbWUgPSAiR09iamVjdCI7Ci0gICAgcGFyZW50X3R5cGVfbmFtZSA9ICJHX1RZUEVfT0JKRUNUIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGNsYXNzJyBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIgZmlsZQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGluc3RhbmNlIGRlZmluaXRpb24KLSAgZl9oZWFkZXJfIDw8ICIvKiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBoYW5kbGVyIChhYnN0cmFjdCBiYXNlIGNsYXNzKSAqLyIgPDwgZW5kbCA8PCAic3RydWN0IF8iCi0gICAgICAgICAgICA8PCBjbGFzc19uYW1lIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIiBwYXJlbnQ7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICIgIiA8PCBjbGFzc19uYW1lIDw8ICI7IiA8PCBlbmRsCi0gICAgICAgICAgICA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGNsYXNzIGRlZmluaXRpb24sIGluY2x1ZGluZyBpdHMgY2xhc3MgbWVtYmVycwotICAvLyAobWV0aG9kcykKLSAgZl9oZWFkZXJfIDw8ICJzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIkNsYXNzIHBhcmVudDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgewotICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCogYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHRfc3RydWN0KiB4X2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgYm9vbCBoYXNfcmV0dXJuID0gIXJldHVybl90eXBlLT5pc192b2lkKCk7Ci0gICAgYm9vbCBoYXNfYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLQotICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUocmV0dXJuX3R5cGUpICsgIiogX3JldHVybiIgOiAiIikKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdfbGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeF9saXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKLQotICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJnYm9vbGVhbiAoKiIgPDwgbWV0aG9kX25hbWUgPDwgIikgIiA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyAiIDw8IGNsYXNzX25hbWUKLSAgICAgICAgICAgIDw8ICJDbGFzczsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcmVtYWluaW5nIGhlYWRlciBib2lsZXJwbGF0ZQotICBmX2hlYWRlcl8gPDwgIkdUeXBlICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgotICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiAiCi0gICAgICAgICAgICA8PCAiKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgY2xhc3NfbmFtZV91YwotICAgICAgICAgICAgPDwgIihvYmopICIKLSAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSLCAiIDw8IGNsYXNzX25hbWUgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKLSAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSKG9iaikgIgotICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKLSAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMKLSAgICAgICAgICAgIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKLSAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIsICIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCi0gICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUl9DTEFTUyhjKSAiCi0gICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjCi0gICAgICAgICAgICA8PCAiX0hBTkRMRVIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKLSAgICAgICAgICAgIDw8ICJfSEFORExFUl9HRVRfQ0xBU1Mob2JqKSAiCi0gICAgICAgICAgICA8PCAiKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSLCAiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcycgbWV0aG9kIGRlZmluaXRpb25zCi0gIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7Ci0gICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOwotICAgIHRfdHlwZSogcmV0dXJuX3R5cGUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgdF9zdHJ1Y3QqIHhfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBib29sIGhhc19yZXR1cm4gPSAhcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKTsKLSAgICBib29sIGhhc19hcmdzID0gYXJnX2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0gICAgYm9vbCBoYXNfeGNlcHRpb25zID0geF9saXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotCi0gICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgotICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZShyZXR1cm5fdHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQotICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ19saXN0KSkpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4X2xpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOwotCi0gICAgZl9oZWFkZXJfIDw8ICJnYm9vbGVhbiAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl8iIDw8IG1ldGhvZF9uYW1lIDw8ICIgIiA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIncyBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaW1wbGVtZW50YXRpb24gZmlsZQotCi0gIC8vIEdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBib2lsZXJwbGF0ZQotICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBzZXJ2aWNlX25hbWVfbGMKLSAgICAgICAgICAgICA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpOyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgYXJnc19pbmRlbnQgPSBzdHJpbmcoMjUsICcgJyk7Ci0gIGZfc2VydmljZV8gPDwgIkdfREVGSU5FX1RZUEVfV0lUSF9DT0RFICgiIDw8IGNsYXNzX25hbWUgPDwgIiwgIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgPDwgY2xhc3NfbmFtZV9sYyA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBwYXJlbnRfdHlwZV9uYW1lIDw8ICIsIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIkdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgotICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGLCIgPDwgZW5kbDsKLSAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIzLCAnICcpOwotICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8IGNsYXNzX25hbWVfbGMgPDwgIl8iIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2ludGVyZmFjZV9pbml0KSkiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGZ1bmN0aW9uX25hbWUpOwotICAgIHRfdHlwZSogcmV0dXJuX3R5cGUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgdF9zdHJ1Y3QqIHhfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfbGlzdC0+Z2V0X21lbWJlcnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4X2xpc3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmaWVsZF9pdGVyOwotCi0gICAgdF9mdW5jdGlvbiBpbXBsZW1lbnRpbmdfZnVuY3Rpb24ocmV0dXJuX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgIl9oYW5kbGVyXyIgKyBtZXRob2RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmaW1wbGVtZW50aW5nX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfcmV0dXJuX3ZhbF9pZl9mYWlsICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIgotICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiAoaWZhY2UpLCBGQUxTRSk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfR0VUX0NMQVNTIChpZmFjZSkiCi0gICAgICAgICAgICAgICA8PCAiLT4iIDw8IG1ldGhvZF9uYW1lIDw8ICIgKGlmYWNlLCAiOwotCi0gICAgaWYgKCFyZXR1cm5fdHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJfcmV0dXJuLCAiOwotICAgIH0KLSAgICBmb3IgKGZpZWxkX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGZpZWxkX2l0ZXIgIT0gYXJncy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmllbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKLSAgICB9Ci0gICAgZm9yIChmaWVsZF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IGZpZWxkX2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgKCpmaWVsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJlcnJvcik7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgaW50ZXJmYWNlIGluaXRpYWxpemVyCi0gIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl8iIDw8IHNlcnZpY2VfbmFtZV9sYwotICAgICAgICAgICAgIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSkiCi0gICAgICAgICAgICAgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlLT4iIDw8IG1ldGhvZF9uYW1lIDw8ICIgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl8iCi0gICAgICAgICAgICAgICAgIDw8IG1ldGhvZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOyIgPDwgZW5kbDsKLSAgfQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgaW5zdGFuY2UgaW5pdGlhbGl6ZXIKLSAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2luaXQgKCIgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmKSIKLSAgICAgICAgICAgICA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGNsYXNzIGluaXRpYWxpemVyCi0gIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2NsYXNzX2luaXQgKCIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MgKmNscykiCi0gICAgICAgICAgICAgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOwotICAgICAgICAgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7Ci0gICAgICAgICArK2Z1bmN0aW9uX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhmdW5jdGlvbl9uYW1lKTsKLQotICAgICAgLy8gQWxsIG1ldGhvZHMgYXJlIHB1cmUgdmlydHVhbCBhbmQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjbHMtPiIgPDwgbWV0aG9kX25hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoY2xzKTsiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2UgcHJvY2Vzc29yLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgYSBwcm9jZXNzb3IKLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jdGlvbl9pdGVyOwotCi0gIHN0cmluZyBzZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKSk7Ci0gIHN0cmluZyBzZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfbmFtZV9sYyk7Ci0KLSAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3NvciI7Ci0gIHN0cmluZyBjbGFzc19uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoY2xhc3NfbmFtZSkpOwotICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7Ci0KLSAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lOwotICBzdHJpbmcgcGFyZW50X3R5cGVfbmFtZTsKLQotICBzdHJpbmcgaGFuZGxlcl9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJIYW5kbGVyIjsKLSAgc3RyaW5nIGhhbmRsZXJfY2xhc3NfbmFtZV9sYyA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhoYW5kbGVyX2NsYXNzX25hbWUpOwotCi0gIHN0cmluZyBwcm9jZXNzX2Z1bmN0aW9uX3R5cGVfbmFtZSA9IGNsYXNzX25hbWUgKyAiUHJvY2Vzc0Z1bmN0aW9uIjsKLSAgc3RyaW5nIHByb2Nlc3NfZnVuY3Rpb25fZGVmX3R5cGVfbmFtZSA9Ci0gICAgY2xhc3NfbmFtZV9sYyArICJfcHJvY2Vzc19mdW5jdGlvbl9kZWYiOwotCi0gIHN0cmluZyBmdW5jdGlvbl9uYW1lOwotICBzdHJpbmcgYXJnc19pbmRlbnQ7Ci0KLSAgLy8gVGhlIHNlcnZpY2UgdGhpcyBzZXJ2aWNlIGV4dGVuZHMsIG9yIE5VTEwgaWYgaXQgZXh0ZW5kcyBubyBzZXJ2aWNlCi0gIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0KLSAgLy8gRGV0ZXJtaW5lIHRoZSBuYW1lIG9mIG91ciBwYXJlbnQgc2VydmljZSAoaWYgYW55KSBhbmQgdGhlCi0gIC8vIHByb2Nlc3NvciBjbGFzcycgcGFyZW50IGNsYXNzIG5hbWUgYW5kIHR5cGUKLSAgaWYgKGV4dGVuZHNfc2VydmljZSkgewotICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lID0gZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocGFyZW50X3NlcnZpY2VfbmFtZSkpOwotICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwYXJlbnRfc2VydmljZV9uYW1lX2xjKTsKLQotICAgIHBhcmVudF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJQcm9jZXNzb3IiOwotICAgIHBhcmVudF90eXBlX25hbWUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgcGFyZW50X3NlcnZpY2VfbmFtZV91YyArICJfUFJPQ0VTU09SIjsKLSAgfSBlbHNlIHsKLSAgICBwYXJlbnRfY2xhc3NfbmFtZSA9ICJUaHJpZnREaXNwYXRjaFByb2Nlc3NvciI7Ci0gICAgcGFyZW50X3R5cGVfbmFtZSA9ICJUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvciBjbGFzcycgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyIGZpbGUKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yIGluc3RhbmNlIGRlZmluaXRpb24KLSAgZl9oZWFkZXJfIDw8ICIvKiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBwcm9jZXNzb3IgKi8iIDw8IGVuZGwgPDwgInN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8IGVuZGwKLSAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICIgcGFyZW50OyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAiLyogcHJvdGVjdGVkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIkhhbmRsZXIgKmhhbmRsZXI7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAiR0hhc2hUYWJsZSAqcHJvY2Vzc19tYXA7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICIgIiA8PCBjbGFzc19uYW1lIDw8ICI7IiA8PCBlbmRsCi0gICAgICAgICAgICA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IgY2xhc3MgZGVmaW5pdGlvbgotICBmX2hlYWRlcl8gPDwgInN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAiLyogcHJvdGVjdGVkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAiZ2Jvb2xlYW4gKCpkaXNwYXRjaF9jYWxsKSAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKnByb2Nlc3NvciwiIDw8IGVuZGw7Ci0gIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjcsICcgJyk7Ci0gIGZfaGVhZGVyXyA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKmluLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKm91dCwiCi0gICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnY2hhciAqZm5hbWUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIgc2VxaWQsIgotICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqZXJyb3IpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MgIiA8PCBjbGFzc19uYW1lCi0gICAgICAgICAgICA8PCAiQ2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHJlbWFpbmluZyBoZWFkZXIgYm9pbGVycGxhdGUKLSAgZl9oZWFkZXJfIDw8ICJHVHlwZSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKLSAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiAiCi0gICAgICAgICAgICA8PCAiKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgY2xhc3NfbmFtZV91YwotICAgICAgICAgICAgPDwgIihvYmopICIKLSAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IsICIgPDwgY2xhc3NfbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgotICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUihvYmopICIKLSAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMKLSAgICAgICAgICAgIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKLSAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKLSAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1JfQ0xBU1MoYykgIgotICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YwotICAgICAgICAgICAgPDwgIl9QUk9DRVNTT1IpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKLSAgICAgICAgICAgIDw8ICJfUFJPQ0VTU09SX0dFVF9DTEFTUyhvYmopICIKLSAgICAgICAgICAgIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKLSAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIGltcGxlbWVudGF0aW9uIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlCi0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb3BlcnRpZXMgZW51bQotICBmX3NlcnZpY2VfIDw8ICJlbnVtIF8iIDw8IGNsYXNzX25hbWUgPDwgIlByb3BlcnRpZXMiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiXzAsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJQUk9QXyIKLSAgICAgICAgICAgICA8PCBjbGFzc19uYW1lX3VjIDw8ICJfSEFORExFUiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gYm9pbGVycGxhdGUKLSAgYXJnc19pbmRlbnQgPSBzdHJpbmcoMTUsICcgJyk7Ci0gIGZfc2VydmljZV8gPDwgIkdfREVGSU5FX1RZUEUgKCIgPDwgY2xhc3NfbmFtZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBjbGFzc19uYW1lX2xjCi0gICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgcGFyZW50X3R5cGVfbmFtZSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nLWZ1bmN0aW9uIHR5cGUKLSAgYXJnc19pbmRlbnQgPSBzdHJpbmcocHJvY2Vzc19mdW5jdGlvbl90eXBlX25hbWUubGVuZ3RoKCkgKyAyMywgJyAnKTsKLSAgZl9zZXJ2aWNlXyA8PCAidHlwZWRlZiBnYm9vbGVhbiAoKiAiIDw8IHByb2Nlc3NfZnVuY3Rpb25fdHlwZV9uYW1lIDw8ICIpICgiCi0gICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCAiICosICIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIsIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIkdFcnJvciAqKik7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZy1mdW5jdGlvbi1kZWZpbml0aW9uIHR5cGUKLSAgZl9zZXJ2aWNlXyA8PCAidHlwZWRlZiBzdHJ1Y3QiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdjaGFyICpuYW1lOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHByb2Nlc3NfZnVuY3Rpb25fdHlwZV9uYW1lIDw8ICIgZnVuY3Rpb247IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8ICJ9ICIgPDwgcHJvY2Vzc19mdW5jdGlvbl9kZWZfdHlwZV9uYW1lIDw8ICI7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBmb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZyBmdW5jdGlvbnMgc28gd2UKLSAgLy8gY2FuIHJlZmVyIHRvIHRoZW0gaW4gdGhlIHByb2Nlc3NpbmctZnVuY3Rpb24tZGVmaW5pdGlvbiBzdHJ1Y3QgYmVsb3cgYW5kCi0gIC8vIGtlZXAgYWxsIG9mIHRoZSBwcm9jZXNzb3IncyBkZWNsYXJhdGlvbnMgaW4gb25lIHBsYWNlCi0gIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOwotICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOwotICAgICAgICsrZnVuY3Rpb25faXRlcikgewotICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzXyIKLSAgICAgICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIGdib29sZWFuIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKCIKLSAgICAgICAgICAgICAgIDw8IGNsYXNzX25hbWUgPDwgIiAqLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nLWZ1bmN0aW9uIGRlZmluaXRpb25zLCBpZiB0aGUgc2VydmljZQotICAvLyBkZWZpbmVzIGFueSBtZXRob2RzCi0gIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IHByb2Nlc3NfZnVuY3Rpb25fZGVmX3R5cGVfbmFtZQotICAgICAgICAgICAgICAgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmc1siCi0gICAgICAgICAgICAgICA8PCBmdW5jdGlvbnMuc2l6ZSgpIDw8ICJdID0geyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKLSAgICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOwotICAgICAgICAgKytmdW5jdGlvbl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIHN0cmluZyBwcm9jZXNzX2Z1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzXyIKLSAgICAgICAgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiXCIiIDw8IHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA8PCAiXCIsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHByb2Nlc3NfZnVuY3Rpb25fbmFtZSA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iCi0gICAgICAgICAgICAgICAgIDw8IChmdW5jdGlvbl9pdGVyID09IC0tZnVuY3Rpb25zLmVuZCgpID8gIiIgOiAiLCIpIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZyBmdW5jdGlvbnMKLSAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKLSAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lX2ljID0gdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKHNlcnZpY2VfZnVuY3Rpb25fbmFtZSk7Ci0gICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9sYyA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOwotICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9sYyk7Ci0KLSAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICBib29sIGhhc19yZXR1cm5fdmFsdWUgPSAhcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKTsKLQotICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFyZ19pdGVyOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhjZXB0aW9uX2l0ZXI7Ci0KLSAgICBzdHJpbmcgYXJnc19jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9pYyArICJBcmdzIjsKLSAgICBzdHJpbmcgYXJnc19jbGFzc190eXBlID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHNlcnZpY2VfbmFtZV91YyArICJfIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV91YyArICJfQVJHUyI7Ci0KLSAgICBzdHJpbmcgcmVzdWx0X2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX2ljICsgIlJlc3VsdCI7Ci0gICAgc3RyaW5nIHJlc3VsdF9jbGFzc190eXBlID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHNlcnZpY2VfbmFtZV91YyArICJfIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX3VjICsgIl9SRVNVTFQiOwotCi0gICAgc3RyaW5nIGhhbmRsZXJfZnVuY3Rpb25fbmFtZSA9IGhhbmRsZXJfY2xhc3NfbmFtZV9sYyArICJfIiArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9sYzsKLQotICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzXyIKLSAgICAgICAgICAgICAgICAgICAgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKLQotICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOwotICAgIGZfc2VydmljZV8gPDwgInN0YXRpYyBnYm9vbGVhbiIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKCIgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmLCIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiBzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgIDw8ICJUaHJpZnRQcm90b2NvbCAqaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdFcnJvciAqKmVycm9yKSIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2Jvb2xlYW4gcmVzdWx0ID0gVFJVRTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQ7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgYXJnc19jbGFzc19uYW1lICsgIiAqIGFyZ3MgPSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9uZXcgKCIgPDwgYXJnc19jbGFzc190eXBlIDw8ICIsIE5VTEwpOyIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaWYgKCgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoc2VxdWVuY2VfaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKG91dHB1dF9wcm90b2NvbCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2dldCAoaW5wdXRfcHJvdG9jb2wsIFwidHJhbnNwb3J0XCIsICIKLSAgICAgICAgICAgICAgIDw8ICImdHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFJlYWQgdGhlIG1ldGhvZCdzIGFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsZXIKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoKHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoYXJncyksICIKLSAgICAgICAgICAgICAgIDw8ICJpbnB1dF9wcm90b2NvbCwgZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgICAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKGlucHV0X3Byb3RvY29sLCAiCi0gICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgICAodGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAodHJhbnNwb3J0LCBlcnJvcikgIT0gRkFMU0UpKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcHJvcGVydHlfdHlwZV9uYW1lKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIKLSAgICAgICAgICAgICAgICAgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGZvciAoeGNlcHRpb25faXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIKLSAgICAgICAgICAgICAgICAgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKGhhc19yZXR1cm5fdmFsdWUpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSA8PCAiIHJldHVybl92YWx1ZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0X2NsYXNzX25hbWUgPDwgIiAqIHJlc3VsdF9zdHJ1Y3Q7IiA8PCBlbmRsOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpZiAoYXJncy5zaXplKCkgPiAwKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9nZXQgKGFyZ3MsIiA8PCBlbmRsOwotICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygxNCwgJyAnKTsKLSAgICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKLSAgICAgICAgc3RyaW5nIGFyZ19uYW1lID0gKCphcmdfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8IGFyZ19uYW1lIDw8ICJcIiwgJiIgPDwgYXJnX25hbWUgPDwgIiwiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgImdfb2JqZWN0X2dldCAob3V0cHV0X3Byb3RvY29sLCBcInRyYW5zcG9ydFwiLCAiCi0gICAgICAgICAgICAgICAgIDw8ICImdHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAicmVzdWx0X3N0cnVjdCA9IGdfb2JqZWN0X25ldyAoIiA8PCByZXN1bHRfY2xhc3NfdHlwZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9nZXQgKHJlc3VsdF9zdHJ1Y3QsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJzdWNjZXNzXCIsICZyZXR1cm5fdmFsdWUsIE5VTEwpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBQYXNzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGluIHRoZSBoYW5kbGVyCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaGFuZGxlcl9mdW5jdGlvbl9uYW1lIDw8ICIgKCIgPDwgdGhpcy0+bnNwYWNlX3VjCi0gICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiAoc2VsZi0+aGFuZGxlciksIiA8PCBlbmRsOwotICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoaGFuZGxlcl9mdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgNiwgJyAnKTsKLSAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgewotICAgICAgc3RyaW5nIHJldHVybl90eXBlX25hbWUgPSB0eXBlX25hbWUocmV0dXJuX3R5cGUpOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50OwotCi0gICAgICAvLyBDYXN0IHJldHVybl92YWx1ZSBpZiBpdCB3YXMgZGVjbGFyZWQgYXMgYSB0eXBlIG90aGVyIHRoYW4gdGhlIHJldHVybgotICAgICAgLy8gdmFsdWUncyBhY3R1YWwgdHlwZS0tLXRoaXMgaXMgdHJ1ZSBmb3IgaW50ZWdlciB2YWx1ZXMgMzIgYml0cyBvciBmZXdlcgotICAgICAgLy8gaW4gd2lkdGgsIGZvciB3aGljaCBHTGliIHJlcXVpcmVzIGEgcGxhaW4gZ2ludCB0eXBlIGJlIHVzZWQgd2hlbgotICAgICAgLy8gc3RvcmluZyBvciByZXRyaWV2aW5nIGFzIGFuIG9iamVjdCBwcm9wZXJ0eQotICAgICAgaWYgKHJldHVybl90eXBlX25hbWUgIT0gcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSkgewotICAgICAgICBpZiAocmV0dXJuX3R5cGVfbmFtZVtyZXR1cm5fdHlwZV9uYW1lLmxlbmd0aCgpIC0gMV0gIT0gJyonKSB7Ci0gICAgICAgICAgcmV0dXJuX3R5cGVfbmFtZSArPSAnICc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuX3R5cGVfbmFtZSArPSAnKic7Ci0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiKCIgPDwgcmV0dXJuX3R5cGVfbmFtZSA8PCAiKSI7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgIiZyZXR1cm5fdmFsdWUsIiA8PCBlbmRsOwotICAgIH0KLSAgICBmb3IgKGFyZ19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ19pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBmb3IgKHhjZXB0aW9uX2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25faXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25faXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiJiIgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgPT0gVFJVRSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBUaGUgaGFuZGxlciByZXBvcnRlZCBzdWNjZXNzOyByZXR1cm4gdGhlIHJlc3VsdCwgaWYgYW55LCB0byB0aGUgY2FsbGVyCi0gICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaWYgKGhhc19yZXR1cm5fdmFsdWUpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3Rfc2V0IChyZXN1bHRfc3RydWN0LCBcInN1Y2Nlc3NcIiwgcmV0dXJuX3ZhbHVlLCAiCi0gICAgICAgICAgICAgICAgICAgPDwgIk5VTEwpOyIgPDwgZW5kbDsKLQotICAgICAgICAvLyBEZWFsbG9jYXRlIChvciB1bnJlZikgcmV0dXJuX3ZhbHVlCi0gICAgICAgIHJldHVybl90eXBlID0gZ2V0X3RydWVfdHlwZShyZXR1cm5fdHlwZSk7Ci0gICAgICAgIGlmIChyZXR1cm5fdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopcmV0dXJuX3R5cGUpOwotCi0gICAgICAgICAgaWYgKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXR1cm5fdmFsdWUgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfYnl0ZV9hcnJheV91bnJlZiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2ZyZWUgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocmV0dXJuX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJldHVybl92YWx1ZSAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgICAgIGlmIChyZXR1cm5fdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0KilyZXR1cm5fdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgICAgICAgIGlmICgoZWxlbV90eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhZWxlbV90eXBlLT5pc19zdHJpbmcoKSkKLSAgICAgICAgICAgICAgICB8fCBlbGVtX3R5cGUtPmlzX2VudW0oKSkgewotICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJnX2FycmF5X3VucmVmIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGZfc2VydmljZV8gPDwgImdfcHRyX2FycmF5X3VucmVmIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwgIiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5fdHlwZS0+aXNfbWFwKCkgfHwgcmV0dXJuX3R5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfdW5yZWYgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocmV0dXJuX3R5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJldHVybl92YWx1ZSAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsOwotICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzOSwgJyAnKTsKLSAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICA8PCAiVF9SRVBMWSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgInNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUIChyZXN1bHRfc3RydWN0KSwiIDw8IGVuZGw7Ci0gICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDIzLCAnICcpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpICE9IC0xKSk7IgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgLy8gVGhlIGhhbmRsZXIgcmVwb3J0ZWQgZmFpbHVyZTsgY2hlY2sgdG8gc2VlIGlmIGFuIGFwcGxpY2F0aW9uLWRlZmluZWQKLSAgICAvLyBleGNlcHRpb24gd2FzIHJhaXNlZCBhbmQgaWYgc28sIHJldHVybiBpdCB0byB0aGUgY2FsbGVyCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIGZvciAoeGNlcHRpb25faXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgImlmICgiIDw8IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9zZXQgKHJlc3VsdF9zdHJ1Y3QsIiA8PCBlbmRsOwotICAgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDE0LCAnICcpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKLSAgICAgICAgICAgICAgICAgICA8PCAoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKG91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGw7Ci0gICAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzksICcgJyk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICAgIDw8ICJUX1JFUExZLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICAgICAgPDwgImVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUIChyZXN1bHRfc3RydWN0KSwiIDw8IGVuZGw7Ci0gICAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjMsICcgJyk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKSAhPSAtMSkpOyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIGhhbmRsZXIgcmVwb3J0ZWQgZmFpbHVyZSBidXQgcmFpc2VkIG5vIGFwcGxpY2F0aW9uLWRlZmluZWQKLSAgICAvLyBleGNlcHRpb24sIHJldHVybiBhIFRocmlmdCBhcHBsaWNhdGlvbiBleGNlcHRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24KLSAgICAvLyByZXR1cm5lZCB2aWEgR0xpYidzIG93biBlcnJvci1yZXBvcnRpbmcgbWVjaGFuaXNtCi0gICAgZl9zZXJ2aWNlXyA8PCAiaWYgKCplcnJvciA9PSBOVUxMKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3dhcm5pbmcgKFwiIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIuIgotICAgICAgICAgICAgICAgPDwgKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudGF0aW9uIHJldHVybmVkIEZBTFNFIFwiIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBzdHJpbmcoMTEsICcgJykgPDwgIlwiYnV0IGRpZCBub3Qgc2V0IGFuIGVycm9yXCIpOyIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAieGNlcHRpb24gPSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwiIDw8IGVuZGw7Ci0gICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygxNCwgJyAnKTsKLSAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcInR5cGVcIiwgICAgKmVycm9yICE9IE5VTEwgPyAoKmVycm9yKS0+Y29kZSA6IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCBzdHJpbmcoMTEsICcgJykgPDwgIlRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTiwiCi0gICAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJcIm1lc3NhZ2VcIiwgKmVycm9yICE9IE5VTEwgPyAoKmVycm9yKS0+bWVzc2FnZSA6IE5VTEwsIgotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCk7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19jbGVhcl9lcnJvciAoZXJyb3IpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAicmVzdWx0ID0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbDsKLSAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDM5LCAnICcpOwotICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgPDwgIlRfRVhDRVBUSU9OLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAodGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAoeGNlcHRpb24pLCIgPDwgZW5kbDsKLSAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDIzLCAnICcpOwotICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKSAhPSAtMSkpOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7IiA8PCBlbmRsOwotCi0gICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIH0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIERlbGxvY2F0ZSBvciB1bnJlZiByZXRyaWV2ZWQgYXJndW1lbnQgdmFsdWVzIGFzIG5lY2Vzc2FyeQotICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBhcmdfbmFtZSA9ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgdF90eXBlKiBhcmdfdHlwZSA9IGdldF90cnVlX3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCkpOwotCi0gICAgICBpZiAoYXJnX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKilhcmdfdHlwZSk7Ci0KLSAgICAgICAgaWYgKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBhcmdfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2J5dGVfYXJyYXlfdW5yZWYgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2ZyZWUgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGFyZ190eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBhcmdfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgICBpZiAoYXJnX3R5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKWFyZ190eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotCi0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgICAgICBpZiAoKGVsZW1fdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIWVsZW1fdHlwZS0+aXNfc3RyaW5nKCkpCi0gICAgICAgICAgICAgIHx8IGVsZW1fdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJnX2FycmF5X3VucmVmIjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiZ19wdHJfYXJyYXlfdW5yZWYiOwotICAgICAgICAgIH0KLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgaWYgKGFyZ190eXBlLT5pc19tYXAoKSB8fCBhcmdfdHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfdW5yZWYgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0gZWxzZSBpZiAoYXJnX3R5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGFyZ19uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHJlc3VsdF9zdHJ1Y3QpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICJpZiAocmVzdWx0ID09IFRSVUUpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgIgotICAgICAgICAgICAgICAgICA8PCAiKG91dHB1dF9wcm90b2NvbCwgZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBlcnJvcikgIgotICAgICAgICAgICAgICAgICA8PCAiIT0gRkFMU0UpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgZXJyb3IpICIKLSAgICAgICAgICAgICAgICAgPDwgIiE9IEZBTFNFKSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSBGQUxTRTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiZ19vYmplY3RfdW5yZWYgKGFyZ3MpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0OyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIGRpc3BhdGNoX2NhbGwgaW1wbGVtZW50YXRpb24KLSAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX2Rpc3BhdGNoX2NhbGwiOwotICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOwotICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgZ2Jvb2xlYW4iIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZQotICAgICAgICAgICAgIDw8ICIgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yICpkaXNwYXRjaF9wcm9jZXNzb3IsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdjaGFyICptZXRob2RfbmFtZSwiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyIHNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgIDw8ICJHRXJyb3IgKiplcnJvcikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZiAqIgotICAgICAgICAgICAgIDw8ICJwcm9jZXNzX2Z1bmN0aW9uX2RlZjsiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdib29sZWFuIGRpc3BhdGNoX3Jlc3VsdCA9IEZBTFNFOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKGRpc3BhdGNoX3Byb2Nlc3Nvcik7IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIipwYXJlbnRfY2xhc3MgPSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfR0VUX0NMQVNTIChzZWxmKSk7IgotICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzX2Z1bmN0aW9uX2RlZiA9ICIKLSAgICAgICAgICAgICA8PCAiZ19oYXNoX3RhYmxlX2xvb2t1cCAoc2VsZi0+cHJvY2Vzc19tYXAsIG1ldGhvZF9uYW1lKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHByb2Nlc3NfZnVuY3Rpb25fZGVmICE9IE5VTEwpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyg1MywgJyAnKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGlzcGF0Y2hfcmVzdWx0ID0gIgotICAgICAgICAgICAgIDw8ICIoKnByb2Nlc3NfZnVuY3Rpb25fZGVmLT5mdW5jdGlvbikgKHNlbGYsIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgInNlcXVlbmNlX2lkLCIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJpbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcik7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAvLyBNZXRob2QgbmFtZSBub3QgcmVjb2duaXplZDsgY2hhaW4gdXAgdG8gb3VyIHBhcmVudCBwcm9jZXNzb3ItLS1ub3RlIHRoZQotICAvLyB0b3AtbW9zdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCwgaW4gVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgaXRzZWxmLAotICAvLyB3aWxsIHJldHVybiBhbiBhcHBsaWNhdGlvbiBleGNlcHRpb24gdG8gdGhlIGNhbGxlciBpZiBubyBjbGFzcyBpbiB0aGUKLSAgLy8gaGllcmFyY2h5IHJlY29nbml6ZXMgdGhlIG1ldGhvZCBuYW1lCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRpc3BhdGNoX3Jlc3VsdCA9IHBhcmVudF9jbGFzcy0+ZGlzcGF0Y2hfY2FsbCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIihkaXNwYXRjaF9wcm9jZXNzb3IsIiA8PCBlbmRsOwotICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDQ3LCAnICcpOwotICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJpbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAibWV0aG9kX25hbWUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZGlzcGF0Y2hfcmVzdWx0OyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9wZXJ0eSBzZXR0ZXIKLSAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3NldF9wcm9wZXJ0eSI7Ci0gIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOwotICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKEdPYmplY3QgKm9iamVjdCwiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJjb25zdCBHVmFsdWUgKnZhbHVlLCIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSBQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0hBTkRMRVI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPmhhbmRsZXIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLT5oYW5kbGVyID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgImdfb2JqZWN0X3JlZiAoc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsOwotICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7Ci0gICAgLy8gQ2hhaW4gdXAgdG8gc2V0IHRoZSBoYW5kbGVyIGluIGV2ZXJ5IHN1cGVyY2xhc3MgYXMgd2VsbAotICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfQ0xBU1MgKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3BhcmVudF9jbGFzcyktPiIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2V0X3Byb3BlcnR5IChvYmplY3QsIHByb3BlcnR5X2lkLCB2YWx1ZSwgcHNwZWMpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yJ3MgcHJvcGVydHkgZ2V0dGVyCi0gIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9nZXRfcHJvcGVydHkiOwotICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKLSAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1ZhbHVlICp2YWx1ZSwiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhc2UgUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRvciB0aGUgcHJvY2Vzc29yJ3MgZGlzcG9zZSBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcG9zZSAoR09iamVjdCAqZ29iamVjdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChnb2JqZWN0KTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+aGFuZGxlciAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChzZWxmLT5oYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAic2VsZi0+aGFuZGxlciA9IE5VTEw7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX0NMQVNTICgiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wYXJlbnRfY2xhc3MpIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+ZGlzcG9zZSAoZ29iamVjdCk7IgotICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBwcm9jZXNzb3IgZmluYWxpemUgZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2ZpbmFsaXplIChHT2JqZWN0ICpnb2JqZWN0KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciAqc2VsZiA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjCi0gICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SIChnb2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJnX2hhc2hfdGFibGVfZGVzdHJveSAoc2VsZi0+cHJvY2Vzc19tYXApOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIkdfT0JKRUNUX0NMQVNTICgiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wYXJlbnRfY2xhc3MpIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPmZpbmFsaXplIChnb2JqZWN0KTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBwcm9jZXNzb3IgaW5zdGFuY2UgaW5pdGlhbGl6ZXIKLSAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2luaXQgKCIgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmKSIKLSAgICAgICAgICAgICA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQgaW5kZXg7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYtPmhhbmRsZXIgPSBOVUxMOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJzZWxmLT5wcm9jZXNzX21hcCA9ICIKLSAgICAgICAgICAgICAgICAiZ19oYXNoX3RhYmxlX25ldyAoZ19zdHJfaGFzaCwgZ19zdHJfZXF1YWwpOyIgPDwgZW5kbDsKLSAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoMjEsICcgJyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpbmRleCA9IDA7IGluZGV4IDwgIgotICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25zLnNpemUoKSA8PCAiOyBpbmRleCArPSAxKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfaW5zZXJ0IChzZWxmLT5wcm9jZXNzX21hcCwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcHJvY2Vzc19mdW5jdGlvbl9kZWZzW2luZGV4XS5uYW1lLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgIDw8ICImIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcHJvY2Vzc19mdW5jdGlvbl9kZWZzW2luZGV4XSIgPDwgIik7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBwcm9jZXNzb3IgY2xhc3MgaW5pdGlhbGl6ZXIKLSAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2NsYXNzX2luaXQgKCIgPDwgY2xhc3NfbmFtZQotICAgICAgICAgICAgIDw8ICJDbGFzcyAqY2xzKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnREaXNwYXRjaFByb2Nlc3NvckNsYXNzICpkaXNwYXRjaF9wcm9jZXNzb3JfY2xhc3MgPSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1JfQ0xBU1MgKGNscyk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJHUGFyYW1TcGVjICpwYXJhbV9zcGVjOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgImdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9kaXNwb3NlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2ZpbmFsaXplOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9zZXRfcHJvcGVydHk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF9wcm9wZXJ0eTsiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgImRpc3BhdGNoX3Byb2Nlc3Nvcl9jbGFzcy0+ZGlzcGF0Y2hfY2FsbCA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2Rpc3BhdGNoX2NhbGw7IgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNscy0+ZGlzcGF0Y2hfY2FsbCA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2Rpc3BhdGNoX2NhbGw7IgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwiaGFuZGxlclwiLCIKLSAgICAgICAgICAgICA8PCBlbmRsOwotICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDM0LCAnICcpOwotICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIlNlcnZpY2UgaGFuZGxlciBpbXBsZW1lbnRhdGlvblwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgIDw8ICJcIlRoZSBzZXJ2aWNlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24gXCIiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICA8PCAiXCJ0byB3aGljaCBtZXRob2QgY2FsbHMgYXJlIGRpc3BhdGNoZWQuXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHNlcnZpY2VfbmFtZV91YyArICJfSEFORExFUiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICA8PCAiR19QQVJBTV9SRUFEV1JJVEUpOyIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywiIDw8IGVuZGw7Ci0gIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzMsICcgJyk7Ci0gIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfSEFORExFUiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICA8PCAicGFyYW1fc3BlYyk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2Ugc2VydmVyLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAodm9pZCl0c2VydmljZTsKLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZpY2UncyBoYW5kbGVyIGNsYXNzCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGFuZGxlcih0c2VydmljZSk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZpY2UncyBwcm9jZXNzb3IgY2xhc3MKLSAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBDIGNvZGUgdG8gcmVwcmVzZW50IGEgVEhyaWZ0IHN0cnVjdHVyZSBhcyBhIEdPYmplY3QuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vYmplY3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOwotICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKLQotICBzdHJpbmcgY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIG5hbWU7Ci0gIHN0cmluZyBjbGFzc19uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoY2xhc3NfbmFtZSkpOwotICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7Ci0KLSAgc3RyaW5nIGZ1bmN0aW9uX25hbWU7Ci0gIHN0cmluZyBhcmdzX2luZGVudDsKLQotICAvLyB3cml0ZSB0aGUgaW5zdGFuY2UgZGVmaW5pdGlvbgotICBmX3R5cGVzXyA8PCAic3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8IGVuZGwgPDwgInsgIiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIgIFRocmlmdFN0cnVjdCBwYXJlbnQ7ICIgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIC8qIHB1YmxpYyAqLyIgPDwgZW5kbDsKLQotICAvLyBmb3IgZWFjaCBmaWVsZCwgYWRkIGEgbWVtYmVyIHZhcmlhYmxlCi0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgZl90eXBlc18gPDwgIiAgIiA8PCB0eXBlX25hbWUodCkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgZl90eXBlc18gPDwgIiAgZ2Jvb2xlYW4gX19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBjbG9zZSB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24gYW5kIGNyZWF0ZSBhIHR5cGVkZWYKLSAgZl90eXBlc18gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICIgPDwgdGhpcy0+bnNwYWNlCi0gICAgICAgICAgIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyB3cml0ZSB0aGUgY2xhc3MgZGVmaW5pdGlvbgotICBmX3R5cGVzXyA8PCAic3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbAotICAgICAgICAgICA8PCAiICBUaHJpZnRTdHJ1Y3RDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIKLSAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIHdyaXRlIHRoZSBzdGFuZGFyZCBHT2JqZWN0IGJvaWxlcnBsYXRlCi0gIGZfdHlwZXNfIDw8ICJHVHlwZSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKLSAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiICgiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UKLSAgICAgICAgICAgPDwgIl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjCi0gICAgICAgICAgIDw8ICIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMKLSAgICAgICAgICAgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMKLSAgICAgICAgICAgPDwgbmFtZV91YyA8PCAiX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiX1RZUEVfIgotICAgICAgICAgICA8PCBuYW1lX3VjIDw8ICIsICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgotICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgbmFtZV91YyA8PCAiKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIgotICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YwotICAgICAgICAgICA8PCAiSVNfIiA8PCBuYW1lX3VjIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjCi0gICAgICAgICAgIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YwotICAgICAgICAgICA8PCAiX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgotICAgICAgICAgICA8PCBuYW1lX3VjIDw8ICIsICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBzdGFydCB3cml0aW5nIHRoZSBvYmplY3QgaW1wbGVtZW50YXRpb24gLmMgZmlsZQotCi0gIC8vIGdlbmVyYXRlIHByb3BlcnRpZXMgZW51bQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZl90eXBlc19pbXBsXyA8PCAiZW51bSBfIiA8PCBjbGFzc19uYW1lIDw8ICJQcm9wZXJ0aWVzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIlBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfMCI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCi0gICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKLQotICAgICAgZl90eXBlc19pbXBsXyA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl8iIDw8IG1lbWJlcl9uYW1lX3VjOwotICAgIH0KLSAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gZ2VuZXJhdGUgc3RydWN0IEkvTyBtZXRob2RzCi0gIHN0cmluZyB0aGlzX2dldCA9IHRoaXMtPm5zcGFjZSArIG5hbWUgKyAiICogdGhpc19vYmplY3QgPSAiICsgdGhpcy0+bnNwYWNlX3VjICsgbmFtZV91YwotICAgICAgICAgICAgICAgICAgICArICIob2JqZWN0KTsiOwotICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsICJ0aGlzX29iamVjdC0+IiwgdGhpc19nZXQpOwotICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsICJ0aGlzX29iamVjdC0+IiwgdGhpc19nZXQpOwotCi0gIC8vIGdlbmVyYXRlIHByb3BlcnR5IHNldHRlciBhbmQgZ2V0dGVyCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBzZXR0ZXIKLSAgICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfc2V0X3Byb3BlcnR5IjsKLSAgICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKEdPYmplY3QgKm9iamVjdCwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJndWludCBwcm9wZXJ0eV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgIDw8ICJjb25zdCBHVmFsdWUgKnZhbHVlLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1faXRlcik7Ci0gICAgICBzdHJpbmcgbWVtYmVyX25hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgbWVtYmVyX25hbWVfdWMKLSAgICAgICAgICA9IHRvX3VwcGVyX2Nhc2UodG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobWVtYmVyX25hbWUpKSk7Ci0gICAgICB0X3R5cGUqIG1lbWJlcl90eXBlID0gZ2V0X3RydWVfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOwotCi0gICAgICBzdHJpbmcgcHJvcGVydHlfaWRlbnRpZmllciA9ICJQUk9QXyIgKyBjbGFzc19uYW1lX3VjICsgIl8iICsgbWVtYmVyX25hbWVfdWM7Ci0KLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCBwcm9wZXJ0eV9pZGVudGlmaWVyICsgIjoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgaWYgKG1lbWJlcl90eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopbWVtYmVyX3R5cGUpOwotICAgICAgICBzdHJpbmcgYXNzaWduX2Z1bmN0aW9uX25hbWU7Ci0KLSAgICAgICAgaWYgKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKLSAgICAgICAgICBzdHJpbmcgcmVsZWFzZV9mdW5jdGlvbl9uYW1lOwotCi0gICAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19ieXRlX2FycmF5X3VucmVmIjsKLSAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZHVwX2JveGVkIjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfZnJlZSI7Ci0gICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2R1cF9zdHJpbmciOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgcmVsZWFzZV9mdW5jdGlvbl9uYW1lIDw8ICIgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIik7IgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN3aXRjaCAoYmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfYm9vbGVhbiI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2ludCI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfaW50NjQiOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2RvdWJsZSI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKLSAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgYmFzZSB0eXBlIFwiIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICJcIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHN0cnVjdCBtZW1iZXIgXCIiCi0gICAgICAgICAgICAgICAgKyBtZW1iZXJfbmFtZSArICJcIiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSAiIDw8IGFzc2lnbl9mdW5jdGlvbl9uYW1lCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiAodmFsdWUpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2VudW0oKSkgewotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAgIHN0cmluZyByZWxlYXNlX2Z1bmN0aW9uX25hbWU7Ci0gICAgICAgIHN0cmluZyBhc3NpZ25fZnVuY3Rpb25fbmFtZTsKLQotICAgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKW1lbWJlcl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotCi0gICAgICAgICAgLy8gTGlzdHMgb2YgYmFzZSB0eXBlcyBvdGhlciB0aGFuIHN0cmluZ3MgYXJlIHJlcHJlc2VudGVkIGFzIEdBcnJheXM7Ci0gICAgICAgICAgLy8gYWxsIG90aGVycyBhcyBHUHRyQXJyYXlzCi0gICAgICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIWVsZW1fdHlwZS0+aXNfc3RyaW5nKCkpIHsKLSAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2FycmF5X3VucmVmIjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfcHRyX2FycmF5X3VucmVmIjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2R1cF9ib3hlZCI7Ci0gICAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3NldCgpIHx8IG1lbWJlcl90eXBlLT5pc19tYXAoKSkgewotICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2hhc2hfdGFibGVfdW5yZWYiOwotICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZHVwX2JveGVkIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA8PCAiIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIpOyIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSAiIDw8IGFzc2lnbl9mdW5jdGlvbl9uYW1lCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiAodmFsdWUpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3N0cnVjdCgpIHx8IG1lbWJlcl90eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOyIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpZiAobWVtYmVyLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT5fX2lzc2V0XyIgPDwgbWVtYmVyX25hbWUgPDwgIiA9IFRSVUU7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7Ci0gICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7Ci0KLSAgICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBnZXR0ZXIKLSAgICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfZ2V0X3Byb3BlcnR5IjsKLSAgICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKEdPYmplY3QgKm9iamVjdCwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJndWludCBwcm9wZXJ0eV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdWYWx1ZSAqdmFsdWUsIgotICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1faXRlcik7Ci0gICAgICBzdHJpbmcgbWVtYmVyX25hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgbWVtYmVyX25hbWVfdWMKLSAgICAgICAgICA9IHRvX3VwcGVyX2Nhc2UodG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobWVtYmVyX25hbWUpKSk7Ci0gICAgICB0X3R5cGUqIG1lbWJlcl90eXBlID0gZ2V0X3RydWVfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOwotCi0gICAgICBzdHJpbmcgcHJvcGVydHlfaWRlbnRpZmllciA9ICJQUk9QXyIgKyBjbGFzc19uYW1lX3VjICsgIl8iICsgbWVtYmVyX25hbWVfdWM7Ci0KLSAgICAgIHN0cmluZyBzZXR0ZXJfZnVuY3Rpb25fbmFtZTsKLQotICAgICAgaWYgKG1lbWJlcl90eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopbWVtYmVyX3R5cGUpOwotCi0gICAgICAgIHN3aXRjaCAoYmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9ib29sZWFuIjsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9pbnQiOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2ludDY0IjsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9kb3VibGUiOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9ib3hlZCI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X3N0cmluZyI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiAiCi0gICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBiYXNlIHR5cGUgXCIiICsgYmFzZV90eXBlLT5nZXRfbmFtZSgpICsgIlwiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHN0cnVjdCBtZW1iZXIgXCIiCi0gICAgICAgICAgICAgICsgbWVtYmVyX25hbWUgKyAiXCIiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfaW50IjsKLSAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3N0cnVjdCgpIHx8IG1lbWJlcl90eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X29iamVjdCI7Ci0gICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9ib3hlZCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKLSAgICAgICAgICAgICAgInVucmVjb2duaXplZCB0eXBlIGZvciBzdHJ1Y3QgbWVtYmVyIFwiIiArIG1lbWJlcl9uYW1lICsgIlwiIjsKLSAgICAgIH0KLQotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IHByb3BlcnR5X2lkZW50aWZpZXIgKyAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA8PCAiICh2YWx1ZSwgc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiKTsiCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKLSAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKLSAgfQotCi0gIC8vIGdlbmVyYXRlIHRoZSBpbnN0YW5jZSBpbml0IGZ1bmN0aW9uCi0KLSAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQgIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9pbnN0YW5jZV9pbml0ICgiCi0gICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAqIG9iamVjdCkiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIGdlbmVyYXRlIGRlZmF1bHQtdmFsdWUgc3RydWN0dXJlcyBmb3IgY29udGFpbmVyLXR5cGUgbWVtYmVycwotICBib29sIGNvbnN0YW50X2RlY2xhcmF0aW9uX291dHB1dCA9IGZhbHNlOwotICBib29sIHN0cmluZ19saXN0X2NvbnN0YW50X291dHB1dCA9IGZhbHNlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogbWVtYmVyID0gKm1faXRlcjsKLSAgICB0X2NvbnN0X3ZhbHVlKiBtZW1iZXJfdmFsdWUgPSBtZW1iZXItPmdldF92YWx1ZSgpOwotCi0gICAgaWYgKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICBzdHJpbmcgbWVtYmVyX25hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7Ci0gICAgICB0X3R5cGUqIG1lbWJlcl90eXBlID0gZ2V0X3RydWVfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOwotCi0gICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBsaXN0ID0gbWVtYmVyX3ZhbHVlLT5nZXRfbGlzdCgpOwotICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0KiltZW1iZXJfdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgICAgICAvLyBHZW5lcmF0ZSBhbiBhcnJheSB3aXRoIHRoZSBsaXN0IGxpdGVyYWwKLSAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJzdGF0aWMgIiA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIiBfX2RlZmF1bHRfIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbWVtYmVyX25hbWUgPDwgIlsiIDw8IGxpc3Quc2l6ZSgpIDw8ICJdID0gIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBjb25zdGFudF9saXRlcmFsKG1lbWJlcl90eXBlLCBtZW1iZXJfdmFsdWUpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotCi0gICAgICAgIGNvbnN0YW50X2RlY2xhcmF0aW9uX291dHB1dCA9IHRydWU7Ci0KLSAgICAgICAgLy8gSWYgd2UgYXJlIGdlbmVyYXRpbmcgdmFsdWVzIGZvciBhIHBvaW50ZXIgYXJyYXkgKGkuZS4gYSBsaXN0IG9mCi0gICAgICAgIC8vIHN0cmluZ3MpLCBzZXQgYSBmbGFnIHNvIHdlIGtub3cgdG8gYWxzbyBkZWNsYXJlIGFuIGluZGV4IHZhcmlhYmxlIHRvCi0gICAgICAgIC8vIHVzZSBpbiBwcmUtcG9wdWxhdGluZyB0aGUgYXJyYXkKLSAgICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfc3RyaW5nKCkpIHsKLSAgICAgICAgICBzdHJpbmdfbGlzdF9jb25zdGFudF9vdXRwdXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRPRE86IEhhbmRsZSBjb250YWluZXIgdHlwZXMgb3RoZXIgdGhhbiBsaXN0Ci0gICAgfQotICB9Ci0gIGlmIChjb25zdGFudF9kZWNsYXJhdGlvbl9vdXRwdXQpIHsKLSAgICBpZiAoc3RyaW5nX2xpc3RfY29uc3RhbnRfb3V0cHV0KSB7Ci0gICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgInVuc2lnbmVkIGludCBsaXN0X2luZGV4OyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBzYXRpc2Z5IGNvbXBpbGVycyB3aXRoIC1XYWxsIHR1cm5lZCBvbgotICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIi8qIHNhdGlzZnkgLVdhbGwgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAob2JqZWN0KTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHN0cmluZyBkdmFsID0gIiA9ICI7Ci0gICAgICBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGR2YWwgKz0gIigiICsgdHlwZV9uYW1lKHQpICsgIikiOwotICAgICAgfQotICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOwotICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKLSAgICAgICAgZHZhbCArPSBjb25zdGFudF92YWx1ZSgiIiwgdCwgY3YpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZHZhbCArPSB0LT5pc19zdHJpbmcoKSA/ICJOVUxMIiA6ICIwIjsKLSAgICAgIH0KLSAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgc3RyaW5nIHR5cGVfbmFtZV91YwotICAgICAgICAgID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSk7Ci0gICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBnX29iamVjdF9uZXcgKCIgPDwgdGhpcy0+bnNwYWNlX3VjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRZUEVfIiA8PCB0eXBlX25hbWVfdWMgPDwgIiwgTlVMTCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodC0+aXNfeGNlcHRpb24oKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIHN0cmluZyBpbml0X2Z1bmN0aW9uOwotICAgICAgdF90eXBlKiBldHlwZSA9IE5VTEw7Ci0KLSAgICAgIGlmICh0LT5pc19tYXAoKSkgewotICAgICAgICB0X3R5cGUqIGtleSA9ICgodF9tYXAqKXQpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgICAgdF90eXBlKiB2YWx1ZSA9ICgodF9tYXAqKXQpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICAgICAgaW5pdF9mdW5jdGlvbiA9IGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZShrZXksIHZhbHVlKTsKLSAgICAgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKLSAgICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBpbml0X2Z1bmN0aW9uID0gZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKGV0eXBlLCBOVUxMKTsKLSAgICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgIGluaXRfZnVuY3Rpb24gPSBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKGV0eXBlKTsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gIiA8PCBpbml0X2Z1bmN0aW9uIDw8IGVuZGw7Ci0KLSAgICAgIC8vIFByZS1wb3B1bGF0ZSB0aGUgY29udGFpbmVyIHdpdGggdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlcywgaWYgYW55Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgewotICAgICAgICB0X2NvbnN0X3ZhbHVlKiBtZW1iZXJfdmFsdWUgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgICAgIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBsaXN0ID0gbWVtYmVyX3ZhbHVlLT5nZXRfbGlzdCgpOwotCi0gICAgICAgICAgaWYgKChldHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIWV0eXBlLT5pc19zdHJpbmcoKSkKLSAgICAgICAgICAgICAgfHwgZXR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8Ci0gICAgICAgICAgICAgICJnX2FycmF5X2FwcGVuZF92YWxzIChvYmplY3QtPiIgPDwgbmFtZSA8PCAiLCAmX19kZWZhdWx0XyIgPDwKLSAgICAgICAgICAgICAgbmFtZSA8PCAiLCAiIDw8IGxpc3Quc2l6ZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwKLSAgICAgICAgICAgICAgImZvciAobGlzdF9pbmRleCA9IDA7IGxpc3RfaW5kZXggPCAiIDw8IGxpc3Quc2l6ZSgpIDw8ICI7ICIgPDwKLSAgICAgICAgICAgICAgImxpc3RfaW5kZXggKz0gMSkiIDw8IGVuZGw7Ci0gICAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PAotICAgICAgICAgICAgICAiZ19wdHJfYXJyYXlfYWRkIChvYmplY3QtPiIgPDwgbmFtZSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCBzdHJpbmcoMTcsICcgJykgPDwgImdfc3RyZHVwIChfX2RlZmF1bHRfIiA8PAotICAgICAgICAgICAgICBuYW1lIDw8ICJbbGlzdF9pbmRleF0pKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IEhhbmRsZSBjb250YWluZXIgdHlwZXMgb3RoZXIgdGhhbiBsaXN0Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogaWYgbm90IHJlcXVpcmVkLCBpbml0aWFsaXplIHRoZSBfX2lzc2V0IHZhcmlhYmxlICovCi0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT5fX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBGQUxTRTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl90eXBlc19pbXBsXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8qIGNyZWF0ZSB0aGUgZGVzdHJ1Y3RvciAqLwotICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgdm9pZCAiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdQotICAgICAgICAgICAgICAgIDw8ICJfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAqdG9iamVjdCA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMKLSAgICAgICAgICAgICAgICA8PCAiIChvYmplY3QpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIi8qIHNhdGlzZnkgLVdhbGwgaW4gY2FzZSB3ZSBkb24ndCB1c2UgdG9iamVjdCAqLyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAodG9iamVjdCk7IiA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHQtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIGlmICh0LT5pc19tYXAoKSB8fCB0LT5pc19zZXQoKSkgewotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfZGVzdHJveSAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgICAgc3RyaW5nIGRlc3RydWN0b3JfZnVuY3Rpb24gPSAiZ19wdHJfYXJyYXlfdW5yZWYiOwotCi0gICAgICAgIGlmIChldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopZXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIGRlc3RydWN0b3JfZnVuY3Rpb24gPSAiZ19hcnJheV91bnJlZiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA8PCAiICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICAvLyBUT0RPOiBnX2NsZWFyX29iamVjdCBuZWVkcyBnbGliID49IDIuMjgKLSAgICAgIC8vIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdfY2xlYXJfb2JqZWN0ICgmKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKSk7IiA8PCBlbmRsOwotICAgICAgLy8gZG9lcyBnX29iamVjdF91bnJlZiB0aGUgdHJpY2s/Ci0gICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZih0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodC0+aXNfc3RyaW5nKCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHQpIDw8ICIodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpOyIKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gZ2VuZXJhdGUgdGhlIGNsYXNzIGluaXQgZnVuY3Rpb24KLQotICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfY2xhc3NfaW5pdCAoIiA8PCBjbGFzc19uYW1lCi0gICAgICAgICAgICAgICAgPDwgIkNsYXNzICogY2xzKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7Ci0KLSAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFN0cnVjdENsYXNzICpzdHJ1Y3RfY2xhc3MgPSAiCi0gICAgICAgICAgICAgICAgPDwgIlRIUklGVF9TVFJVQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICA8PCAic3RydWN0X2NsYXNzLT5yZWFkID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcmVhZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICA8PCAic3RydWN0X2NsYXNzLT53cml0ZSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3dyaXRlOyIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZmluYWxpemU7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IGNsYXNzX25hbWVfbGMKLSAgICAgICAgICAgICAgICAgIDw8ICJfZ2V0X3Byb3BlcnR5OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgPDwgImdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3NldF9wcm9wZXJ0eTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBpbnN0YWxsIGEgcHJvcGVydHkgZm9yIGVhY2ggbWVtYmVyCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptX2l0ZXIpOwotICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOwotICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCi0gICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl9uYW1lKSkpOwotICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKLSAgICAgIHRfY29uc3RfdmFsdWUqIG1lbWJlcl92YWx1ZSA9IG1lbWJlci0+Z2V0X3ZhbHVlKCk7Ci0KLSAgICAgIHN0cmluZyBwcm9wZXJ0eV9pZGVudGlmaWVyID0gIlBST1BfIiArIGNsYXNzX25hbWVfdWMgKyAiXyIgKyBtZW1iZXJfbmFtZV91YzsKLQotICAgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgJyAnOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IHByb3BlcnR5X2lkZW50aWZpZXIKLSAgICAgICAgICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQ7Ci0KLSAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKiltZW1iZXJfdHlwZSktPmdldF9iYXNlKCk7Ci0KLSAgICAgICAgaWYgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKLSAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopbWVtYmVyX3R5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOwotICAgICAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2JveGVkIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJHX1RZUEVfQllURV9BUlJBWSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjEsICcgJyk7Ci0gICAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfc3RyaW5nIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgobWVtYmVyX3ZhbHVlICE9IE5VTEwpID8gIlwiIiArIG1lbWJlcl92YWx1ZS0+Z2V0X3N0cmluZygpICsgIlwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJOVUxMIikgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkgewotICAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMiwgJyAnKTsKLSAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm9vbGVhbiAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgoKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSAmJiAobWVtYmVyX3ZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJUUlVFIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJGQUxTRSIpIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFKSB8fCAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0kxNikKLSAgICAgICAgICAgICAgICAgICB8fCAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0kzMikgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpCi0gICAgICAgICAgICAgICAgICAgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpKSB7Ci0gICAgICAgICAgc3RyaW5nIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfaW50IjsKLSAgICAgICAgICBzdHJpbmcgbWluX3ZhbHVlOwotICAgICAgICAgIHN0cmluZyBtYXhfdmFsdWU7Ci0gICAgICAgICAgb3N0cmluZ3N0cmVhbSBkZWZhdWx0X3ZhbHVlOwotCi0gICAgICAgICAgc3dpdGNoIChiYXNlX3R5cGUpIHsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgICBtaW5fdmFsdWUgPSAiR19NSU5JTlQ4IjsKLSAgICAgICAgICAgIG1heF92YWx1ZSA9ICJHX01BWElOVDgiOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICAgIG1pbl92YWx1ZSA9ICJHX01JTklOVDE2IjsKLSAgICAgICAgICAgIG1heF92YWx1ZSA9ICJHX01BWElOVDE2IjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICBtaW5fdmFsdWUgPSAiR19NSU5JTlQzMiI7Ci0gICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQzMiI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgcGFyYW1fc3BlY19mdW5jdGlvbl9uYW1lID0gImdfcGFyYW1fc3BlY19pbnQ2NCI7Ci0gICAgICAgICAgICBtaW5fdmFsdWUgPSAiR19NSU5JTlQ2NCI7Ci0gICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQ2NCI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgcGFyYW1fc3BlY19mdW5jdGlvbl9uYW1lID0gImdfcGFyYW1fc3BlY19kb3VibGUiOwotICAgICAgICAgICAgbWluX3ZhbHVlID0gIi1JTkZJTklUWSI7Ci0gICAgICAgICAgICBtYXhfdmFsdWUgPSAiSU5GSU5JVFkiOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiAiCi0gICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIGJhc2UgdHlwZSBcIiIgKyBtZW1iZXJfdHlwZS0+Z2V0X25hbWUoKSArICJcIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igc3RydWN0IG1lbWJlciBcIiIKLSAgICAgICAgICAgICAgICArIG1lbWJlcl9uYW1lICsgIlwiIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChtZW1iZXJfdmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgZGVmYXVsdF92YWx1ZSA8PCAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSA/IG1lbWJlcl92YWx1ZS0+Z2V0X2RvdWJsZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWVtYmVyX3ZhbHVlLT5nZXRfaW50ZWdlcigpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVmYXVsdF92YWx1ZSA8PCAiMCI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7Ci0gICAgICAgICAgZl90eXBlc19pbXBsXyA8PCBwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUgPDwgIiAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8IG1pbl92YWx1ZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBtYXhfdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IGRlZmF1bHRfdmFsdWUuc3RyKCkgPDwgIiwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgdF9lbnVtX3ZhbHVlKiBlbnVtX21pbl92YWx1ZSA9ICgodF9lbnVtKiltZW1iZXJfdHlwZSktPmdldF9taW5fdmFsdWUoKTsKLSAgICAgICAgdF9lbnVtX3ZhbHVlKiBlbnVtX21heF92YWx1ZSA9ICgodF9lbnVtKiltZW1iZXJfdHlwZSktPmdldF9tYXhfdmFsdWUoKTsKLSAgICAgICAgaW50IG1pbl92YWx1ZSA9IChlbnVtX21pbl92YWx1ZSAhPSBOVUxMKSA/IGVudW1fbWluX3ZhbHVlLT5nZXRfdmFsdWUoKSA6IDA7Ci0gICAgICAgIGludCBtYXhfdmFsdWUgPSAoZW51bV9tYXhfdmFsdWUgIT0gTlVMTCkgPyBlbnVtX21heF92YWx1ZS0+Z2V0X3ZhbHVlKCkgOiAwOwotCi0gICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygxOCwgJyAnKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2ludCAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICAgICAgICAgPDwgbWluX3ZhbHVlIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IG1heF92YWx1ZSA8PCAiLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8IG1pbl92YWx1ZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICAgICAgIDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3N0cnVjdCgpIHx8IG1lbWJlcl90eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIHN0cmluZyBwYXJhbV90eXBlID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobWVtYmVyX3R5cGUtPmdldF9uYW1lKCkpKTsKLQotICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjAsICcgJyk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19vYmplY3QgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtX3R5cGUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKW1lbWJlcl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBzdHJpbmcgcGFyYW1fdHlwZTsKLQotICAgICAgICBpZiAoZWxlbV90eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhZWxlbV90eXBlLT5pc19zdHJpbmcoKSkgewotICAgICAgICAgIHBhcmFtX3R5cGUgPSAiR19UWVBFX0FSUkFZIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwYXJhbV90eXBlID0gIkdfVFlQRV9QVFJfQVJSQVkiOwotICAgICAgICB9Ci0KLSAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm94ZWQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtX3R5cGUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc2V0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMCwgJyAnKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2JveGVkIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiR19UWVBFX0hBU0hfVEFCTEUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotICAgIH0KLSAgfQotICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOwotICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19pbXBsXyA8PCAiR1R5cGUiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2dldF90eXBlICh2b2lkKSIgPDwgZW5kbCA8PCAieyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbCA8PCAiICBpZiAodHlwZSA9PSAwKSAiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCAiICB7IiA8PCBlbmRsIDw8ICIgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyB0eXBlX2luZm8gPSAiIDw8IGVuZGwgPDwgIiAgICB7IgotICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAvKiBiYXNlX2luaXQgKi8iIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsIC8qIGJhc2VfZmluYWxpemUgKi8iCi0gICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgKEdDbGFzc0luaXRGdW5jKSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9jbGFzc19pbml0LCIKLSAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAvKiBjbGFzc19maW5hbGl6ZSAqLyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAvKiBjbGFzc19kYXRhICovIiA8PCBlbmRsIDw8ICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlCi0gICAgICAgICAgICAgICAgPDwgbmFtZSA8PCAiKSwiIDw8IGVuZGwgPDwgIiAgICAgIDAsIC8qIG5fcHJlYWxsb2NzICovIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgIiAgICAgIChHSW5zdGFuY2VJbml0RnVuYykgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfaW5zdGFuY2VfaW5pdCwiCi0gICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgLyogdmFsdWVfdGFibGUgKi8iIDw8IGVuZGwgPDwgIiAgICB9OyIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgIiAgICB0eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoVEhSSUZUX1RZUEVfU1RSVUNULCAiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIlR5cGVcIiwiCi0gICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV9pbmZvLCAwKTsiIDw8IGVuZGwgPDwgIiAgfSIKLSAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgcmV0dXJuIHR5cGU7IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGZ1bmN0aW9ucyB0byB3cml0ZSBUaHJpZnQgc3RydWN0dXJlcyB0byBhIHN0cmVhbS4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24pIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOwotICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGludCBlcnJvcl9yZXQgPSAwOwotCi0gIGlmIChpc19mdW5jdGlvbikgewotICAgIGVycm9yX3JldCA9IC0xOwotICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgZ2ludDMyIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UKLSAgICAgICAgICAgICAgICA8PCAiX3dyaXRlIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJnaW50MzIgcmV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHhmZXIgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8IHRoaXNfZ2V0IDw8IGVuZGw7Ci0gIC8vIHNhdGlzZnkgLVdhbGwgaW4gdGhlIGNhc2Ugb2YgYW4gZW1wdHkgc3RydWN0Ci0gIGlmICghdGhpc19nZXQuZW1wdHkoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAodGhpc19vYmplY3QpOyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgXCIiIDw8IG5hbWUKLSAgICAgIDw8ICJcIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXNfb2JqZWN0LT5fX2lzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gVFJVRSkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAiCi0gICAgICAgIDw8ICJcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQKLSAgICAgICAgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCB0aGlzX25hbWUsICIiLCBlcnJvcl9yZXQpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IgotICAgICAgICA8PCBlbmRsOwotCi0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyB3cml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKLSAgICAgIDw8IGVuZGw7Ci0KLSAgaWYgKGlzX2Z1bmN0aW9uKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gcmVhZCBUaHJpZnQgc3RydWN0dXJlcyBmcm9tIGEgc3RyZWFtLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbikgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0gIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOwotICBpbnQgZXJyb3JfcmV0ID0gMDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGlmIChpc19mdW5jdGlvbikgewotICAgIGVycm9yX3JldCA9IC0xOwotICAgIGluZGVudChvdXQpIDw8ICIvKiByZWFkcyBhICIgPDwgbmFtZV91IDw8ICIgb2JqZWN0ICovIiA8PCBlbmRsIDw8ICJzdGF0aWMgZ2ludDMyIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdQotICAgICAgICAgICAgICAgIDw8ICJfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIGRlY2xhcmUgc3RhY2sgdGVtcCB2YXJpYWJsZXMKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJnaW50MzIgcmV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHhmZXIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgImdjaGFyICpuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZnR5cGU7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiZ2ludDE2IGZpZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgbGVuID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJncG9pbnRlciBkYXRhID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdGhpc19nZXQgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZ2Jvb2xlYW4gaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IEZBTFNFOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICAvLyBzYXRpc2Z5IC1XYWxsIGluIGNhc2Ugd2UgZG9uJ3QgdXNlIHNvbWUgdmFyaWFibGVzCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHRoZXNlIGFyZW4ndCB1c2VkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGxlbik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoZGF0YSk7IiA8PCBlbmRsOwotCi0gIGlmICghdGhpc19nZXQuZW1wdHkoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRoaXNfb2JqZWN0KTsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gcmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUgbWFya2VyCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgc3RydWN0IGJlZ2luIG1hcmtlciAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJm5hbWUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIm5hbWUgPSBOVUxMOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIHJlYWQgdGhlIHN0cnVjdCBmaWVsZHMKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBzdHJ1Y3QgZmllbGRzICovIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ3aGlsZSAoMSkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gcmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgZmllbGQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJm5hbWUsICZmdHlwZSwgJmZpZCwgZXJyb3IpKSA8IDApIgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAibmFtZSA9IE5VTEw7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogYnJlYWsgaWYgd2UgZ2V0IGEgU1RPUCBmaWVsZCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgImlmIChmdHlwZSA9PSBUX1NUT1ApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBzd2l0Y2ggZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZCkiIDw8IGVuZGw7Ci0KLSAgLy8gc3RhcnQgc3dpdGNoCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gZ2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIHR5cGVzCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvLyBnZW5lcmF0ZSBkZXNlcmlhbGl6ZSBmaWVsZAotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgdGhpc19uYW1lLCAiIiwgZXJyb3JfcmV0LCBmYWxzZSk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSByZXQ7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIC8vIGNyZWF0ZSB0aGUgZGVmYXVsdCBjYXNlCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICAgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IHJldDsiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAvLyBlbmQgc3dpdGNoCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyByZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0KLSAgLy8gZW5kIHdoaWxlIGxvb3AKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyByZWFkIHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZQotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKLSAgICAgIDw8IGVuZGw7Ci0KLSAgLy8gaWYgYSByZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nLCB0aHJvdyBhbiBlcnJvcgotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiCi0gICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0lOVkFMSURfREFUQSwiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgXCJtaXNzaW5nIGZpZWxkXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gLTE7IiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpZiAoaXNfZnVuY3Rpb24pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gZW5kIHRoZSBmdW5jdGlvbi9zdHJ1Y3R1cmUKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lLCBlcnJvcl9yZXQpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV8iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAiYm9vbCAocHJvdG9jb2wsICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAiYnl0ZSAocHJvdG9jb2wsICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJpMTYgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgImk2NCAocHJvdG9jb2wsICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJkb3VibGUgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgImJpbmFyeSAocHJvdG9jb2wsICgoR0J5dGVBcnJheSAqKSAiIDw8IG5hbWUgPDwgIiktPmRhdGEsICgoR0J5dGVBcnJheSAqKSAiIDw8IG5hbWUKLSAgICAgICAgICAgICAgPDwgIiktPmxlbiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJzdHJpbmcgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgd3JpdGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsIChnaW50MzIpICIgPDwgbmFtZTsKLSAgICB9Ci0gICAgb3V0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBuYW1lLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICAodm9pZCl0c3RydWN0OwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAoIiA8PCBwcmVmaXgKLSAgICAgIDw8ICIpLCBwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBsZW5ndGggPSAiZ19oYXNoX3RhYmxlX3NpemUgKChHSGFzaFRhYmxlICopICIgKyBwcmVmaXggKyAiKSI7Ci0gICAgdF90eXBlKiB0a2V5ID0gKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHR2YWwgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIHN0cmluZyB0a2V5X25hbWUgPSB0eXBlX25hbWUodGtleSk7Ci0gICAgc3RyaW5nIHR2YWxfbmFtZSA9IHR5cGVfbmFtZSh0dmFsKTsKLSAgICBzdHJpbmcgdGtleV9wdHI7Ci0gICAgc3RyaW5nIHR2YWxfcHRyOwotICAgIHN0cmluZyBrZXluYW1lID0gdG1wKCJrZXkiKTsKLSAgICBzdHJpbmcgdmFsbmFtZSA9IHRtcCgidmFsIik7Ci0KLSAgICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdGtleSwga2V5bmFtZSk7Ci0gICAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHR2YWwsIHZhbG5hbWUpOwotCi0gICAgLyogSWYgZWl0aGVyIHRoZSBrZXkgb3IgdmFsdWUgdHlwZSBpcyBhIHR5cGVkZWYsIGZpbmQgaXRzIHVuZGVybHlpbmcgdHlwZSBzbwotICAgICAgIHdlIGNhbiBjb3JyZWN0bHkgZGV0ZXJtaW5lIGhvdyB0byBnZW5lcmF0ZSBhIHBvaW50ZXIgdG8gaXQgKi8KLSAgICB0a2V5ID0gZ2V0X3RydWVfdHlwZSh0a2V5KTsKLSAgICB0dmFsID0gZ2V0X3RydWVfdHlwZSh0dmFsKTsKLQotICAgIHRrZXlfcHRyID0gdGtleS0+aXNfc3RyaW5nKCkgfHwgIXRrZXktPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0gICAgdHZhbF9wdHIgPSB0dmFsLT5pc19zdHJpbmcoKSB8fCAhdHZhbC0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKLQotICAgIC8qCi0gICAgICogU29tZSB1Z2xpbmVzcyBoZXJlLiAgVG8gbWF4aW1pemUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlCi0gICAgICogYXZvaWQgdXNpbmcgR0hhc2hUYWJsZUl0ZXIgYW5kIGluc3RlYWQgZ2V0IGEgR0xpc3Qgb2YgYWxsIGtleXMsCi0gICAgICogdGhlbiBjb3B5IGl0IGludG8gYSBhcnJheSBvbiB0aGUgc3RhY2ssIGFuZCBmcmVlIGl0LgotICAgICAqIFRoaXMgaXMgYmVjYXVzZSB3ZSBtYXkgZXhpdCBlYXJseSBiZWZvcmUgd2UgZ2V0IGEgY2hhbmNlIHRvIGZyZWUgdGhlCi0gICAgICogR0xpc3QuCi0gICAgICovCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJHTGlzdCAqa2V5X2xpc3QgPSBOVUxMLCAqaXRlciA9IE5VTEw7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8IHRrZXlfbmFtZSA8PCB0a2V5X3B0ciA8PCAiKiBrZXlzOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50IGkgPSAwLCBrZXlfY291bnQ7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsICIKLSAgICAgICAgPDwgdHlwZV90b19lbnVtKHRrZXkpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKHR2YWwpIDw8ICIsIChnaW50MzIpICIKLSAgICAgICAgPDwgbGVuZ3RoIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfZm9yZWFjaCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXgKLSAgICAgICAgPDwgIiwgdGhyaWZ0X2hhc2hfdGFibGVfZ2V0X2tleXMsICZrZXlfbGlzdCk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJrZXlfY291bnQgPSBnX2xpc3RfbGVuZ3RoIChrZXlfbGlzdCk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJrZXlzID0gZ19uZXdhICgiIDw8IHRrZXlfbmFtZSA8PCB0a2V5X3B0cgotICAgICAgICA8PCAiLCBrZXlfY291bnQpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpdGVyID0gZ19saXN0X2ZpcnN0IChrZXlfbGlzdCk7IGl0ZXI7ICIKLSAgICAgICAgICAgIml0ZXIgPSBpdGVyLT5uZXh0KSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImtleXNbaSsrXSA9ICgiIDw8IHRrZXlfbmFtZSA8PCB0a2V5X3B0cgotICAgICAgICA8PCAiKSBpdGVyLT5kYXRhOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ19saXN0X2ZyZWUgKGtleV9saXN0KTsiIDw8IGVuZGwKLSAgICAgICAgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IGtleV9jb3VudDsgKytpKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBrZXluYW1lIDw8ICIgPSBrZXlzW2ldOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCB2YWxuYW1lIDw8ICIgPSAoIiA8PCB0dmFsX25hbWUgPDwgdHZhbF9wdHIKLSAgICAgICAgPDwgIikgZ19oYXNoX3RhYmxlX2xvb2t1cCAoKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4Ci0gICAgICAgIDw8ICIpLCAoZ3BvaW50ZXIpICIgPDwga2V5bmFtZSA8PCAiKTsiIDw8IGVuZGwKLSAgICAgICAgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9tYXAqKXR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0a2V5X3B0ciArICIgIiArIGtleW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2YWxfcHRyICsgIiAiICsgdmFsbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcmV0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChwcm90b2NvbCwgIgotICAgICAgICAgICAiZXJyb3IpKSA8IDApIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGxlbmd0aCA9ICJnX2hhc2hfdGFibGVfc2l6ZSAoKEdIYXNoVGFibGUgKikgIiArIHByZWZpeCArICIpIjsKLSAgICB0X3R5cGUqIHRlbGVtID0gKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgc3RyaW5nIHRlbGVtX25hbWUgPSB0eXBlX25hbWUodGVsZW0pOwotICAgIHN0cmluZyB0ZWxlbV9wdHIgPSB0ZWxlbS0+aXNfc3RyaW5nKCkgfHwgIXRlbGVtLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiR0xpc3QgKmtleV9saXN0ID0gTlVMTCwgKml0ZXIgPSBOVUxMOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0ciA8PCAiKiBrZXlzOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50IGkgPSAwLCBrZXlfY291bnQ7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICIgZWxlbTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImdwb2ludGVyIHZhbHVlOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHZhbHVlKTsiIDw8IGVuZGwKLSAgICAgICAgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgIgotICAgICAgICA8PCB0eXBlX3RvX2VudW0odGVsZW0pIDw8ICIsIChnaW50MzIpICIgPDwgbGVuZ3RoIDw8ICIsIGVycm9yKSkgPCAwKSIKLSAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfZm9yZWFjaCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXgKLSAgICAgICAgPDwgIiwgdGhyaWZ0X2hhc2hfdGFibGVfZ2V0X2tleXMsICZrZXlfbGlzdCk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJrZXlfY291bnQgPSBnX2xpc3RfbGVuZ3RoIChrZXlfbGlzdCk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJrZXlzID0gZ19uZXdhICgiIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyCi0gICAgICAgIDw8ICIsIGtleV9jb3VudCk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGl0ZXIgPSBnX2xpc3RfZmlyc3QgKGtleV9saXN0KTsgaXRlcjsgIgotICAgICAgICAgICAiaXRlciA9IGl0ZXItPm5leHQpIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAia2V5c1tpKytdID0gKCIgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIKLSAgICAgICAgPDwgIikgaXRlci0+ZGF0YTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdfbGlzdF9mcmVlIChrZXlfbGlzdCk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBrZXlfY291bnQ7ICsraSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsZW0gPSBrZXlzW2ldOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFsdWUgPSAoZ3BvaW50ZXIpIGdfaGFzaF90YWJsZV9sb29rdXAgIgotICAgICAgICAgICAiKCgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PCAiKSwgKGdwb2ludGVyKSBlbGVtKTsiIDw8IGVuZGwKLSAgICAgICAgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zZXQqKXR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWxlbV9wdHIgKyAiZWxlbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3JldCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsICIKLSAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgbGVuZ3RoID0gcHJlZml4ICsgIi0+bGVuIjsKLSAgICBzdHJpbmcgaSA9IHRtcCgiaSIpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQgIiA8PCBpIDw8ICI7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCAiCi0gICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIChnaW50MzIpICIKLSAgICAgICAgPDwgbGVuZ3RoIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IGxlbmd0aCA8PCAiOyAiCi0gICAgICAgIDw8IGkgPDwgIisrKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCBpLCBlcnJvcl9yZXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwgIgotICAgICAgICAgICAiZXJyb3IpKSA8IDApIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWx1ZSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtZW50KTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKTsKLQotICAvLyBjYXN0IHRvIG5vbi1jb25zdAotICBzdHJpbmcgY2FzdCA9ICIiOwotICBzdHJpbmcgbmFtZSA9ICJnX3B0cl9hcnJheV9pbmRleCAoKEdQdHJBcnJheSAqKSAiICsgbGlzdCArICIsICIgKyBpbmRleCArICIpIjsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdib29sZWFuLCAiICsgaW5kZXggKyAiKSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgZ2ludDgsICIgKyBpbmRleCArICIpIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdpbnQxNiwgIiArIGluZGV4ICsgIikiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgZ2ludDMyLCAiICsgaW5kZXggKyAiKSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG5hbWUgPSAiZ19hcnJheV9pbmRleCAoIiArIGxpc3QgKyAiLCBnaW50NjQsICIgKyBpbmRleCArICIpIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdkb3VibGUsICIgKyBpbmRleCArICIpIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgY2FzdCA9ICIoZ2NoYXIqKSI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpIHx8IHR0eXBlLT5pc19zZXQoKSkgewotICAgIGNhc3QgPSAiKEdIYXNoVGFibGUqKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogYmFzZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBpZiAoYmFzZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopYmFzZSktPmdldF9iYXNlKCkpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBjYXN0ID0gIihHQXJyYXkqKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGNhc3QgPSAiKEdQdHJBcnJheSopIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiQ29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBjYXN0ID0gIihHUHRyQXJyYXkqKSI7Ci0gICAgfQotICB9Ci0KLSAgdF9maWVsZCBlZmllbGQodHR5cGUsICIoIiArIGNhc3QgKyBuYW1lICsgIikiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOwotfQotCi0vKiBkZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgZXJyb3JfcmV0LCBhbGxvY2F0ZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lLCBlcnJvcl9yZXQpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJnX2ZyZWUoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF8iOwotCi0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICBvdXQgPDwgImJpbmFyeSAocHJvdG9jb2wsICZkYXRhLCAmbGVuIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAic3RyaW5nIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAiYm9vbCAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBvdXQgPDwgImJ5dGUgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBvdXQgPDwgImkxNiAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8ICJpNjQgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBvdXQgPDwgImRvdWJsZSAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIHJlYWRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKLSAgICB9Ci0gICAgb3V0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiCi0gICAgICAgIDw8IGVuZGw7Ci0KLSAgICAvLyBsb2FkIHRoZSBieXRlIGFycmF5IHdpdGggdGhlIGRhdGEKLSAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gZ19ieXRlX2FycmF5X25ldygpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJnX2J5dGVfYXJyYXlfYXBwZW5kICgiIDw8IG5hbWUgPDwgIiwgKGd1aW50OCAqKSBkYXRhLCAoZ3VpbnQpIGxlbik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImdfZnJlZSAoZGF0YSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgiZWNhc3QiKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdpbnQzMiAiIDw8IHQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJiIgPDwgdCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB0IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci0KLSAgLy8gaWYgdGhlIHR5cGUgaXMgbm90IHJlcXVpcmVkIGFuZCB0aGlzIGlzIGEgdGhyaWZ0IHN0cnVjdCAobm8gcHJlZml4KSwKLSAgLy8gc2V0IHRoZSBpc3NldCB2YXJpYWJsZS4gIGlmIHRoZSB0eXBlIGlzIHJlcXVpcmVkLCB0aGVuIHNldCB0aGUKLSAgLy8gbG9jYWwgdmFyaWFibGUgaW5kaWNhdGluZyB0aGUgdmFsdWUgd2FzIHNldCwgc28gdGhhdCB3ZSBjYW4gZG8gICAgLy8gdmFsaWRhdGlvbiBsYXRlci4KLSAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgcHJlZml4ICE9ICIiKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJfX2lzc2V0XyIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8IHN1ZmZpeCA8PCAiID0gVFJVRTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiBwcmVmaXggIT0gIiIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXNzZXRfIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IFRSVUU7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb2NhdGUpIHsKLSAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0c3RydWN0LT5nZXRfbmFtZSgpKSk7Ci0gIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBUaGlzIHN0cnVjdCBpcyBhbiBleGNlcHRpb24gKi8iIDw8IGVuZGw7Ci0gICAgYWxsb2NhdGUgPSB0cnVlOwotICB9Ci0KLSAgaWYgKGFsbG9jYXRlKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoICIgPDwgcHJlZml4IDw8ICIgIT0gTlVMTCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gZ19vYmplY3RfbmV3ICgiIDw8IHRoaXMtPm5zcGFjZV91YwotICAgICAgICA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiwgTlVMTCk7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKCIgPDwgcHJlZml4Ci0gICAgICA8PCAiKSwgcHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmIChhbGxvY2F0ZSkgewotICAgIGluZGVudChvdXQpIDw8ICJnX29iamVjdF91bnJlZiAoIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICAgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IE5VTEw7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUga2V5X3R5cGU7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIHZhbHVlX3R5cGU7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIG1hcCBiZWdpbiBtYXJrZXIgKi8iIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwgIgotICAgICAgICAgICAiJmtleV90eXBlLCAmdmFsdWVfdHlwZSwgJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGw7Ci0KLSAgICAvLyBpdGVyYXRlIG92ZXIgbWFwIGVsZW1lbnRzCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggZWFjaCBvZiB0aGUgbWFwJ3MgZmllbGRzICovIiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4LCBlcnJvcl9yZXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIC8vIHJlYWQgbWFwIGVuZAotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgbWFwIGVuZCBtYXJrZXIgKi8iIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAocHJvdG9jb2wsICIKLSAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBzaXplOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGU7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwgIgotICAgICAgICAgICAiJmVsZW1lbnRfdHlwZSwgJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGw7Ci0KLSAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggdGhlIHNldCBlbGVtZW50cyAqLyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCwgZXJyb3JfcmV0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAvLyByZWFkIHNldCBlbmQKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsICIKLSAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBzaXplOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGU7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICIKLSAgICAgICAgICAgIiZlbGVtZW50X3R5cGUsJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGw7Ci0KLSAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggbGlzdCBlbGVtZW50cyAqLyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9saXN0Kil0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3JldCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gcmVhZCBsaXN0IGVuZAotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAocHJvdG9jb2wsICIKLSAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcmIG5hbWUpIHsKLSAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHR0eXBlKTsKLQotICAvKiBJZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhIHR5cGVkZWYsIGZpbmQgaXRzIHVuZGVybHlpbmcgdHlwZSBzbyB3ZQotICAgICBjYW4gY29ycmVjdGx5IGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgYSBwb2ludGVyIHRvIGl0ICovCi0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgc3RyaW5nIHB0ciA9IHR0eXBlLT5pc19zdHJpbmcoKSB8fCAhdHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8ICIgIiA8PCBuYW1lIDw8ICIgPSAiCi0gICAgICAgIDw8IGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdG1hcC0+Z2V0X3ZhbF90eXBlKCkpIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8ICIgIiA8PCBuYW1lIDw8ICIgPSAiCi0gICAgICAgIDw8IGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8ICIgIiA8PCBuYW1lCi0gICAgICAgIDw8IChwdHIgIT0gIiIgPyAiID0gZ19uZXcgKCIgKyB0bmFtZSArICIsIDEpIiA6ICIgPSBOVUxMIikgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHRfdHlwZSogdGtleSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOwotICB0X3R5cGUqIHR2YWwgPSB0bWFwLT5nZXRfdmFsX3R5cGUoKTsKLSAgc3RyaW5nIGtleW5hbWUgPSB0bXAoImtleSIpOwotICBzdHJpbmcgdmFsbmFtZSA9IHRtcCgidmFsIik7Ci0KLSAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHRrZXksIGtleW5hbWUpOwotICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdHZhbCwgdmFsbmFtZSk7Ci0KLSAgLyogSWYgZWl0aGVyIHRoZSBrZXkgb3IgdmFsdWUgdHlwZSBpcyBhIHR5cGVkZWYsIGZpbmQgaXRzIHVuZGVybHlpbmcKLSAgICAgdHlwZSBzbyB3ZSBjYW4gY29ycmVjdGx5IGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgYSBwb2ludGVyIHRvCi0gICAgIGl0ICovCi0gIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKHRrZXkpOwotICB0dmFsID0gZ2V0X3RydWVfdHlwZSh0dmFsKTsKLQotICBzdHJpbmcgdGtleV9wdHIgPSB0a2V5LT5pc19zdHJpbmcoKSB8fCAhdGtleS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKLSAgc3RyaW5nIHR2YWxfcHRyID0gdHZhbC0+aXNfc3RyaW5nKCkgfHwgIXR2YWwtPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0KLSAgLy8gZGVzZXJpYWxpemUgdGhlIGZpZWxkcyBvZiB0aGUgbWFwIGVsZW1lbnQKLSAgdF9maWVsZCBma2V5KHRrZXksIHRrZXlfcHRyICsga2V5bmFtZSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksICIiLCAiIiwgZXJyb3JfcmV0KTsKLSAgdF9maWVsZCBmdmFsKHR2YWwsIHR2YWxfcHRyICsgdmFsbmFtZSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsICIiLCAiIiwgZXJyb3JfcmV0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikiIDw8IHByZWZpeCA8PCAiLCAoZ3BvaW50ZXIpICIgPDwga2V5bmFtZQotICAgICAgICAgICAgICA8PCAiLCAoZ3BvaW50ZXIpICIgPDwgdmFsbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICB0X3R5cGUqIHRlbGVtID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOwotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgc3RyaW5nIHRlbGVtX3B0ciA9IHRlbGVtLT5pc19zdHJpbmcoKSB8fCAhdGVsZW0tPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0KLSAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHRlbGVtLCBlbGVtKTsKLQotICB0X2ZpZWxkIGZlbGVtKHRlbGVtLCB0ZWxlbV9wdHIgKyBlbGVtKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCAiIiwgZXJyb3JfcmV0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIiwgKGdwb2ludGVyKSAiIDw8IGVsZW0KLSAgICAgICAgICAgICAgPDwgIiwgKGdwb2ludGVyKSAxKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gICh2b2lkKWluZGV4OwotICB0X3R5cGUqIHR0eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHN0cmluZyB0ZWxlbV9wdHIgPSB0dHlwZS0+aXNfc3RyaW5nKCkgfHwgIXR0eXBlLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotCi0gIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0dHlwZSwgZWxlbSk7Ci0KLSAgdF9maWVsZCBmZWxlbSh0dHlwZSwgdGVsZW1fcHRyICsgZWxlbSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCAiIiwgIiIsIGVycm9yX3JldCk7Ci0KLSAgaW5kZW50KG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAiZ19wdHJfYXJyYXlfYWRkICgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBvdXQgPDwgImdfYXJyYXlfYXBwZW5kX3ZhbHMgKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiLCAxKTsiIDw8IGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgfQotICB9Ci0gIG91dCA8PCAiZ19wdHJfYXJyYXlfYWRkICgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpIHsKLSAgaWYgKHR0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuICJOVUxMIjsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJnX2ZyZWUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgcmV0dXJuICJ0aHJpZnRfc3RyaW5nX2ZyZWUiOwotICAgICAgfQotICAgICAgcmV0dXJuICJnX2ZyZWUiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIk5VTEwiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIHJldHVybiAiZ19vYmplY3RfdW5yZWYiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGlmIChldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKilldHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfYXJyYXlfdW5yZWYiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX3B0cl9hcnJheV91bnJlZiI7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZXR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IGV0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfcHRyX2FycmF5X3VucmVmIjsKLSAgICAgIDsKLSAgICB9IGVsc2UgaWYgKGV0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX2FycmF5X3VucmVmIjsKLSAgICB9Ci0gICAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZCBpbnNpZGUgdGhlIGFycmF5OiAlc1xuIiwgZXR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIGluc2lkZSBhcnJheSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKCgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCkpOwotICB9Ci0gIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKLX0KLQotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIGlmICh0dHlwZSA9PSBOVUxMKQotICAgIHJldHVybiAiTlVMTCI7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBoYXNoIHR5cGUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiZ19pbnRfaGFzaCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImdfaW50NjRfaGFzaCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImdfZG91YmxlX2hhc2giOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJnX3N0cl9oYXNoIjsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBoYXNoIHRhYmxlIGluZm8gZm9yIHR5cGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJnX2RpcmVjdF9oYXNoIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgcmV0dXJuICJnX2RpcmVjdF9oYXNoIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIGdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUoKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKSk7Ci0gIH0KLSAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZDogJXNcbiIsIHR0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB0aHJvdyAiVHlwZSBub3QgZXhwZWN0ZWQiOwotfQotCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbXBfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSkgewotICBpZiAodHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gIk5VTEwiOwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgaGFzaCB0eXBlIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gImdfaW50X2VxdWFsIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiZ19pbnQ2NF9lcXVhbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImdfZG91YmxlX2VxdWFsIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiZ19zdHJfZXF1YWwiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImdfZGlyZWN0X2VxdWFsIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgcmV0dXJuICJnX2RpcmVjdF9lcXVhbCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBnZW5lcmF0ZV9jbXBfZnVuY19mcm9tX3R5cGUoKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKSk7Ci0gIH0KLSAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZDogJXNcbiIsIHR0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB0aHJvdyAiVHlwZSBub3QgZXhwZWN0ZWQiOwotfQotCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUodF90eXBlKiBrZXksIHRfdHlwZSogdmFsdWUpIHsKLSAgc3RyaW5nIGhhc2hfZnVuYyA9IGdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUoa2V5KTsKLSAgc3RyaW5nIGNtcF9mdW5jID0gZ2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKGtleSk7Ci0gIHN0cmluZyBrZXlfZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZShrZXkpOwotICBzdHJpbmcgdmFsdWVfZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh2YWx1ZSk7Ci0KLSAgcmV0dXJuICJnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKCIgKyBoYXNoX2Z1bmMgKyAiLCAiICsgY21wX2Z1bmMgKyAiLCAiICsga2V5X2ZyZWVfZnVuYyArICIsICIKLSAgICAgICAgICsgdmFsdWVfZnJlZV9mdW5jICsgIik7IjsKLX0KLQotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdib29sZWFuKSk7IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdpbnQ4KSk7IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2ludDE2KSk7IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2ludDMyKSk7IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2ludDY0KSk7IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2RvdWJsZSkpOyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gImdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoZ19mcmVlKTsiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mIChnaW50MzIpKTsiOwotICB9IGVsc2UgewotICAgIHN0cmluZyBmcmVlX2Z1bmMgPSBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHR0eXBlKTsKLSAgICByZXR1cm4gImdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoIiArIGZyZWVfZnVuYyArICIpOyI7Ci0gIH0KLQotICByZXR1cm4gImdfcHRyX2FycmF5X25ldygpOyI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFVUSUxJVFkgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogVXBwZXIgY2FzZSBhIHN0cmluZy4gIFdyYXBzIGJvb3N0J3Mgc3RyaW5nIHV0aWxpdHkuCi0gKi8KLXN0cmluZyB0b191cHBlcl9jYXNlKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBzKG5hbWUpOwotICBzdGQ6OnRyYW5zZm9ybShzLmJlZ2luKCksIHMuZW5kKCksIHMuYmVnaW4oKSwgOjp0b3VwcGVyKTsKLSAgcmV0dXJuIHM7Ci0gIC8vICByZXR1cm4gYm9vc3Q6OnRvX3VwcGVyX2NvcHkgKG5hbWUpOwotfQotCi0vKioKLSAqIExvd2VyIGNhc2UgYSBzdHJpbmcuICBXcmFwcyBib29zdCdzIHN0cmluZyB1dGlsaXR5LgotICovCi1zdHJpbmcgdG9fbG93ZXJfY2FzZShzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgcyhuYW1lKTsKLSAgc3RkOjp0cmFuc2Zvcm0ocy5iZWdpbigpLCBzLmVuZCgpLCBzLmJlZ2luKCksIDo6dG9sb3dlcik7Ci0gIHJldHVybiBzOwotICAvLyAgcmV0dXJuIGJvb3N0Ojp0b19sb3dlcl9jb3B5IChuYW1lKTsKLX0KLQotLyoqCi0gKiBNYWtlcyBhIHN0cmluZyBmcmllbmRseSB0byBDIGNvZGUgc3RhbmRhcmRzIGJ5IGxvd2VyY2FzaW5nIGFuZCBhZGRpbmcKLSAqIHVuZGVyc2NvcmVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4gIEZvciBleGFtcGxlOgotICoKLSAqIElucHV0OiAiWm9tZ0NhbWVsQ2FzZSIKLSAqIE91dHB1dDogInpvbWdfY2FtZWxfY2FzZSIKLSAqLwotc3RyaW5nIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgcmV0OwotICBjb25zdCBjaGFyKiB0bXAgPSBuYW1lLmNfc3RyKCk7Ci0gIGludCBwb3MgPSAwOwotCi0gIC8qIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXNuJ3QgdW5kZXJzY29yZWQgaWYgdXBwZXJjYXNlLCBqdXN0IGxvd2VyY2FzZWQgKi8KLSAgcmV0ICs9IHRvbG93ZXIodG1wW3Bvc10pOwotICBwb3MrKzsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IHBvczsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgewotICAgIGNoYXIgbGMgPSB0b2xvd2VyKHRtcFtpXSk7Ci0gICAgaWYgKGxjICE9IHRtcFtpXSkgewotICAgICAgcmV0ICs9ICdfJzsKLSAgICB9Ci0gICAgcmV0ICs9IGxjOwotICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBQZXJmb3JtcyB0aGUgcmV2ZXJzZSBvcGVyYXRpb24gb2YgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzOiBUaGUgZmlyc3QKLSAqIGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGlzIG1hZGUgdXBwZXJjYXNlLCBhbG9uZyB3aXRoIGVhY2ggY2hhcmFjdGVyIHRoYXQKLSAqIGZvbGxvd3MgYW4gdW5kZXJzY29yZSAod2hpY2ggaXMgcmVtb3ZlZCkuIFVzZWZ1bCBmb3IgY29udmVydGluZyBUaHJpZnQKLSAqIHNlcnZpY2UtbWV0aG9kIG5hbWVzIGludG8gR09iamVjdC1zdHlsZSBjbGFzcyBuYW1lcy4KLSAqCi0gKiBJbnB1dDogInpvbWdfY2FtZWxfY2FzZSIKLSAqIE91dHB1dDogIlpvbWdDYW1lbENhc2UiCi0gKi8KLXN0cmluZyB1bmRlcnNjb3Jlc190b19pbml0aWFsX2NhcHMoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIHJldDsKLSAgY29uc3QgY2hhciogdG1wID0gbmFtZS5jX3N0cigpOwotICBib29sIHVwcGVyY2FzZV9uZXh0ID0gdHJ1ZTsKLQotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgewotICAgIGNoYXIgYyA9IHRtcFtpXTsKLSAgICBpZiAoYyA9PSAnXycpIHsKLSAgICAgIHVwcGVyY2FzZV9uZXh0ID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHVwcGVyY2FzZV9uZXh0KSB7Ci0gICAgICAgIHJldCArPSB0b3VwcGVyKGMpOwotICAgICAgICB1cHBlcmNhc2VfbmV4dCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ICs9IGM7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogcmVnaXN0ZXIgdGhpcyBnZW5lcmF0b3Igd2l0aCB0aGUgbWFpbiBwcm9ncmFtICovCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGNfZ2xpYiwgIkMsIHVzaW5nIEdMaWIiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTBjOTM3Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyODU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBPYmplY3RpdmUtQyBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKiBtb3N0bHkgY29weS9wYXN0aW5nL3R3ZWFraW5nIGZyb20gbWNzbGVlJ3Mgd29yay4KLSAqLwotY2xhc3MgdF9jb2NvYV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9jb2NvYV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJsb2dfdW5leHBlY3RlZCIpOwotICAgIGxvZ191bmV4cGVjdGVkXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ2YWxpZGF0ZV9yZXF1aXJlZCIpOwotICAgIHZhbGlkYXRlX3JlcXVpcmVkXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJhc3luY19jbGllbnRzIik7Ci0gICAgYXN5bmNfY2xpZW50c18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jb2NvYSI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcm9wZXJ0eSA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29udGFpbmVyaXplX2l0ID0gZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZW5jb2RlX3dpdGhfY29kZXJfbWV0aG9kKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaGFzaF9tZXRob2Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pc19lcXVhbF9tZXRob2Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9kZWNsYXJhdGlvbnMoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2woc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2FzeW5jX3Byb3RvY29sKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2Uoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbnRlcmZhY2Uoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbnZvY2F0aW9uKG9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2Uoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUgPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxpc3ROYW1lKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgY29jb2FfcHJlZml4KCk7Ci0gIHN0ZDo6c3RyaW5nIGNvY29hX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgY29jb2FfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgY2xhc3NfcmVmID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfcHJvcGVydHkodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmb3JtYXRfc3RyaW5nX2Zvcl90eXBlKHRfdHlwZSogdHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGNhbGxfZmllbGRfc2V0dGVyKHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKLSAgc3RkOjpzdHJpbmcgY29udGFpbmVyaXplKHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY29udGFpbmVyaXplKHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKLQotICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQotICAgICAgICAgICB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgY29jb2FfcHJlZml4XzsKLSAgc3RkOjpzdHJpbmcgY29uc3RhbnRzX2RlY2xhcmF0aW9uc187Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6Om9mc3RyZWFtIGZfaGVhZGVyXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2ltcGxfOwotCi0gIGJvb2wgbG9nX3VuZXhwZWN0ZWRfOwotICBib29sIHZhbGlkYXRlX3JlcXVpcmVkXzsKLSAgYm9vbCBhc3luY19jbGllbnRzXzsKLX07Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgY29jb2FfcHJlZml4XyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpOwotCi0gIC8vIHdlIGhhdmUgYSAuaCBoZWFkZXIgZmlsZS4uLgotICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IHByb2dyYW1fbmFtZV8gKyAiLmgiOwotICBzdHJpbmcgZl9oZWFkZXJfZnVsbG5hbWUgPSBnZXRfb3V0X2RpcigpICsgZl9oZWFkZXJfbmFtZTsKLSAgZl9oZWFkZXJfLm9wZW4oZl9oZWFkZXJfZnVsbG5hbWUuY19zdHIoKSk7Ci0KLSAgZl9oZWFkZXJfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0KLSAgZl9oZWFkZXJfIDw8IGNvY29hX2ltcG9ydHMoKSA8PCBjb2NvYV90aHJpZnRfaW1wb3J0cygpOwotCi0gIC8vIC4uLmFuZCBhIC5tIGltcGxlbWVudGF0aW9uIGZpbGUKLSAgc3RyaW5nIGZfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiLm0iOwotICBmX2ltcGxfLm9wZW4oZl9pbXBsX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9pbXBsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIGZfaW1wbF8gPDwgY29jb2FfaW1wb3J0cygpIDw8IGNvY29hX3RocmlmdF9pbXBvcnRzKCkgPDwgIiNpbXBvcnQgXCIiIDw8IGZfaGVhZGVyX25hbWUgPDwgIlwiIgotICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgQ29jb2EgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBDb2NvYSBsaWJyYXJpZXMKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb2NvYV9pbXBvcnRzKCkgewotICByZXR1cm4gc3RyaW5nKCkgKyAiI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+XG4iICsgIlxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhyaWZ0IHJ1bnRpbWUgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0IHJ1bnRpbWUKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb2NvYV90aHJpZnRfaW1wb3J0cygpIHsKLSAgc3RyaW5nIHJlc3VsdCA9IHN0cmluZygpICsgIiNpbXBvcnQgXCJUUHJvdG9jb2wuaFwiXG4iICsgIiNpbXBvcnQgXCJUQXBwbGljYXRpb25FeGNlcHRpb24uaFwiXG4iCi0gICAgICAgICAgICAgICAgICArICIjaW1wb3J0IFwiVFByb3RvY29sRXhjZXB0aW9uLmhcIlxuIiAKLSAgICAgICAgICAgICAgICAgICsgIiNpbXBvcnQgXCJUUHJvdG9jb2xVdGlsLmhcIlxuIgotICAgICAgICAgICAgICAgICAgKyAiI2ltcG9ydCBcIlRQcm9jZXNzb3IuaFwiXG4iIAotICAgICAgICAgICAgICAgICAgKyAiI2ltcG9ydCBcIlRPYmplY3RpdmUtQy5oXCJcbiIKLSAgICAgICAgICAgICAgICAgICsgIiNpbXBvcnQgXCJUQmFzZS5oXCJcbiIKLSAgICAgICAgICAgICAgICAgICsgIiNpbXBvcnQgXCJUQXN5bmNUcmFuc3BvcnQuaFwiXG4iCi0gICAgICAgICAgICAgICAgICArICIjaW1wb3J0IFwiVFByb3RvY29sRmFjdG9yeS5oXCJcbiIKLSAgICAgICAgICAgICAgICAgICsgIiNpbXBvcnQgXCJUQmFzZUNsaWVudC5oXCJcbiIgCi0gICAgICAgICAgICAgICAgICArICJcbiI7Ci0KLSAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiI2ltcG9ydCBcIiIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSArICIuaFwiIiArICJcbiI7Ci0gIH0KLSAgcmVzdWx0ICs9ICJcbiI7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBGaW5pc2ggdXAgZ2VuZXJhdGlvbi4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBzdGljayBvdXIgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZmlsZQotICAvLyBzaW5jZSB0aGV5IHJlZmVyIHRvIHRoaW5ncyB3ZSBhcmUgZGVmaW5pbmcuCi0gIGZfaGVhZGVyXyA8PCBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIG9iamVjdGl2ZS1jCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8IGNvY29hX3ByZWZpeF8KLSAgICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIEluIE9iamVjdGl2ZS1DLCB0aGlzIGlzCi0gKiBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCB1c2luZyB0aGUKLSAqIGVudW0ga2V5d29yZCBpbiBPYmplY3RpdmUtQy4gIEZvciBuYW1lc3BhY2UgcHVycG9zZXMsIHRoZSBuYW1lIG9mCi0gKiB0aGUgZW51bSBwbHVzIGFuIHVuZGVyc2NvcmUgaXMgcHJlZml4ZWQgb250byBlYWNoIGVsZW1lbnQuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJlbnVtICIgPDwgY29jb2FfcHJlZml4XyA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2hlYWRlcl8gPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfaGVhZGVyXyA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4gIFByaW1pdGl2ZSB2YWx1ZXMKLSAqIGNvdWxkIGhhdmUgYmVlbiBwbGFjZWQgb3V0c2lkZSB0aGlzIGNsYXNzLCBidXQgSSBqdXN0IHB1dAotICogZXZlcnl0aGluZyBpbiBmb3IgY29uc2lzdGVuY3kuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb25zdF9pbnRlcmZhY2U7Ci0gIHN0cmluZyBjb25zdGFudHNfY2xhc3NfbmFtZSA9IGNvY29hX3ByZWZpeF8gKyBwcm9ncmFtX25hbWVfICsgIkNvbnN0YW50cyI7Ci0KLSAgY29uc3RfaW50ZXJmYWNlIDw8ICJAaW50ZXJmYWNlICIgPDwgY29uc3RhbnRzX2NsYXNzX25hbWUgPDwgIiA6IE5TT2JqZWN0ICI7Ci0gIHNjb3BlX3VwKGNvbnN0X2ludGVyZmFjZSk7Ci0gIHNjb3BlX2Rvd24oY29uc3RfaW50ZXJmYWNlKTsKLQotICAvLyBnZXR0ZXIgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50IGRlZmluZWQuCi0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgY29uc3RfaW50ZXJmYWNlIDw8ICIrICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBjb25zdF9pbnRlcmZhY2UgPDwgIkBlbmQiOwotCi0gIC8vIHRoaXMgZ2V0cyBzcGl0IGludG8gdGhlIGhlYWRlciBmaWxlIGluIDo6Y2xvc2VfZ2VuZXJhdG9yCi0gIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfID0gY29uc3RfaW50ZXJmYWNlLnN0cigpOwotCi0gIC8vIHN0YXRpYyB2YXJpYWJsZXMgaW4gdGhlIC5tIGhvbGQgYWxsIGNvbnN0YW50IHZhbHVlcwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBmX2ltcGxfIDw8ICJzdGF0aWMgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgbmFtZTsKLSAgICBpZiAoIXR5cGUtPmlzX2NvbnRhaW5lcigpICYmICF0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgZl9pbXBsXyA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZl9pbXBsXywgdHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICAgIGZfaW1wbF8gPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9pbXBsXyA8PCBlbmRsOwotCi0gIGZfaW1wbF8gPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvbnN0YW50c19jbGFzc19uYW1lIDw8IGVuZGw7Ci0KLSAgLy8gaW5pdGlhbGl6ZSBjb21wbGV4IGNvbnN0YW50cyB3aGVuIHRoZSBjbGFzcyBpcyBsb2FkZWQKLSAgZl9pbXBsXyA8PCAiKyAodm9pZCkgaW5pdGlhbGl6ZSAiOwotICBzY29wZV91cChmX2ltcGxfKTsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmdldF90eXBlKCktPmlzX2NvbnRhaW5lcigpIHx8ICgqY19pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfaW1wbF8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2NvYV9wcmVmaXhfICsgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgZl9pbXBsXyA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgc2NvcGVfZG93bihmX2ltcGxfKTsKLQotICAvLyBnZXR0ZXIgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGZfaW1wbF8gPDwgIisgKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZTsKLSAgICBzY29wZV91cChmX2ltcGxfKTsKLSAgICBpbmRlbnQoZl9pbXBsXykgPDwgInJldHVybiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfaW1wbF8pOwotICB9Ci0KLSAgZl9pbXBsXyA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcwotICogd2l0aCBwcm90ZWN0ZWQgZGF0YSBtZW1iZXJzLCByZWFkKCksIHdyaXRlKCksIGFuZCBnZXR0ZXJzIGFuZCBzZXR0ZXJzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2hlYWRlcl8sIHRzdHJ1Y3QsIGZhbHNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gTlNFeGNlcHRpb24KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHhjZXB0aW9uLCB0cnVlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgdGhlIGludGVyZmFjZSBmb3IgYSBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgOiAiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIk5TRXhjZXB0aW9uICI7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJOU09iamVjdCAiOwotICB9Ci0gIG91dCA8PCAiPFRCYXNlLCBOU0NvZGluZz4gIjsKLQotICBzY29wZV91cChvdXQpOwotCi0gIC8vIG1lbWJlcnMgYXJlIHByb3RlY3RlZC4gIHRoaXMgaXMgcmVkdW5kYW50LCBidXQgZXhwbGljaXQuCi0gIC8vICBmX2hlYWRlcl8gPDwgZW5kbCA8PCAiQHByb3RlY3RlZDoiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgLy8gbWVtYmVyIHZhcmlhbGJlcwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyKSA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCBlbmRsOwotICAgIC8vIGlzc2V0IGZpZWxkcwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJCT09MIF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldDsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBwcm9wZXJ0aWVzCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgIiNpZiBUQVJHRVRfT1NfSVBIT05FIHx8IChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEID49IE1BQ19PU19YX1ZFUlNJT05fMTBfNSkiCi0gICAgICAgIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHkoKm1faXRlcikgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8ICIjZW5kaWYiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGRlZmF1bHQgaW5pdGlhbGl6ZXIKLSAgb3V0IDw8IGluZGVudCgpIDw8ICItIChpZCkgaW5pdDsiIDw8IGVuZGw7Ci0KLSAgLy8gaW5pdGlhbGl6ZXIgZm9yIGFsbCBmaWVsZHMKLSAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKG91dCwgdHN0cnVjdCk7Ci0gICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIHJlYWQgYW5kIHdyaXRlCi0gIG91dCA8PCAiLSAodm9pZCkgcmVhZDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sOyIgPDwgZW5kbDsKLSAgb3V0IDw8ICItICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIHZhbGlkYXRvcgotICBvdXQgPDwgIi0gKHZvaWQpIHZhbGlkYXRlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGdldHRlcnMgYW5kIHNldHRlcnMKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2RlY2xhcmF0aW9ucyhvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0KLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgc2lnbmF0dXJlIGZvciBpbml0aWFsaXplciBvZiBzdHJ1Y3Qgd2l0aCBhIHBhcmFtZXRlciBmb3IKLSAqIGVhY2ggZmllbGQuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgaW5kZW50KG91dCkgPDwgIi0gKGlkKSBpbml0V2l0aCI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKLSAgICBpZiAobV9pdGVyID09IG1lbWJlcnMuYmVnaW4oKSkgewotICAgICAgb3V0IDw8IGNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICI6ICgiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIpICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICsrbV9pdGVyOwotICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSkgewotICAgICAgb3V0IDw8ICIgIjsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBnZXR0ZXIgYW5kIHNldHRlciBkZWNsYXJhdGlvbnMgZm9yIGFsbCBmaWVsZHMsIHBsdXMgYW4KLSAqIElzU2V0IGdldHRlci4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2RlY2xhcmF0aW9ucyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgKHZvaWQpaXNfZXhjZXB0aW9uOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIjaWYgIV9faGFzX2ZlYXR1cmUob2JqY19hcmMpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoIiA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSAiCi0gICAgICAgIDw8IGRlY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAodm9pZCkgc2V0IiA8PCBjYXBpdGFsaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjogKCIKLSAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIjZW5kaWYiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSB0aGUgaW5pdFdpdGhDb2RlciBtZXRob2QgZm9yIHRoaXMgc3RydWN0IHNvIGl0J3MgY29tcGF0aWJsZSB3aXRoCi0gKiB0aGUgTlNDb2RpbmcgcHJvdG9jb2wKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgaW5kZW50KG91dCkgPDwgIi0gKGlkKSBpbml0V2l0aENvZGVyOiAoTlNDb2RlciAqKSBkZWNvZGVyIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgLy8gTlNFeGNlcHRpb25zIGNvbmZvcm0gdG8gTlNDb2RpbmcsIHNvIHdlIGNhbiBjYWxsIHN1cGVyCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRXaXRoQ29kZXI6IGRlY29kZXJdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKFtkZWNvZGVyIGNvbnRhaW5zVmFsdWVGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0pIgotICAgICAgICA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0gICAgICBvdXQgPDwgIltbZGVjb2RlciBkZWNvZGVPYmplY3RGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gcmV0YWluX3N0dWJdOyIKLSAgICAgICAgICA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVCb29sRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludDMyRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnQ2NEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlRG91YmxlRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGRvbid0IGtub3cgaG93IHRvIGRlY29kZSB0aHJpZnQgdHlwZTogIgotICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCA9IFlFUzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgdGhlIGVuY29kZVdpdGhDb2RlciBtZXRob2QgZm9yIHRoaXMgc3RydWN0IHNvIGl0J3MgY29tcGF0aWJsZSB3aXRoCi0gKiB0aGUgTlNDb2RpbmcgcHJvdG9jb2wKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIGVuY29kZVdpdGhDb2RlcjogKE5TQ29kZXIgKikgZW5jb2RlciIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIC8vIE5TRXhjZXB0aW9ucyBjb25mb3JtIHRvIE5TQ29kaW5nLCBzbyB3ZSBjYW4gY2FsbCBzdXBlcgotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGVuY29kZVdpdGhDb2RlcjogZW5jb2Rlcl07IiA8PCBlbmRsOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICAvLyBvdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlT2JqZWN0OiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCi0gICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgotICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUJvb2w6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKLSAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCi0gICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCi0gICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50MzI6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKLSAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ2NDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgotICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZURvdWJsZTogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgotICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogZG9uJ3Qga25vdyBob3cgdG8gZW5jb2RlIHRocmlmdCB0eXBlOiAiCi0gICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgdGhlIGhhc2ggbWV0aG9kIGZvciB0aGlzIHN0cnVjdAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaGFzaF9tZXRob2Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIi0gKE5TVUludGVnZXIpIGhhc2giIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNVSW50ZWdlciBoYXNoID0gMTc7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImhhc2ggPSAoaGFzaCAqIDMxKSBeIF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIl9pc3NldCA/IDI2NTQ0MzU3NjEgOiAwOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfaXNzZXQpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaGFzaCA9IChoYXNoICogMzEpIF4gW19fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBoYXNoXTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaGFzaCA9IChoYXNoICogMzEpIF4gW0AoX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSBoYXNoXTsiCi0gICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gaGFzaDsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgdGhlIGlzRXF1YWwgbWV0aG9kIGZvciB0aGlzIHN0cnVjdAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaXNfZXF1YWxfbWV0aG9kKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICItIChCT09MKSBpc0VxdWFsOiAoaWQpIGFuT2JqZWN0IiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJpZiAoc2VsZiA9PSBhbk9iamVjdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGNsYXNzX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgdHN0cnVjdC0+Z2V0X25hbWUoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbYW5PYmplY3QgaXNLaW5kT2ZDbGFzczpbIiA8PCBjbGFzc19uYW1lIDw8ICIgY2xhc3NdXSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gTk87IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCBjbGFzc19uYW1lIDw8ICIgKm90aGVyID0gKCIgPDwgY2xhc3NfbmFtZSA8PCAiICopYW5PYmplY3Q7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKF9fIiA8PCBuYW1lIDw8ICJfaXNzZXQgIT0gb3RoZXItPl9fIiA8PCBuYW1lIDw8ICJfaXNzZXQpIHx8IiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAiCi0gICAgICAgICAgPDwgIihfXyIgPDwgbmFtZSA8PCAiX2lzc2V0ICYmICIKLSAgICAgICAgICA8PCAiKChfXyIgPDwgbmFtZSA8PCAiIHx8IG90aGVyLT5fXyIgPDwgbmFtZSA8PCAiKSAmJiAiCi0gICAgICAgICAgPDwgIiFbX18iIDw8IG5hbWUgPDwgIiBpc0VxdWFsOm90aGVyLT5fXyIgPDwgbmFtZSA8PCAiXSkpKSB7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgoX18iIDw8IG5hbWUgPDwgIl9pc3NldCAhPSBvdGhlci0+X18iIDw8IG5hbWUgPDwgIl9pc3NldCkgfHwiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICIKLSAgICAgICAgICA8PCAiKF9fIiA8PCBuYW1lIDw8ICJfaXNzZXQgJiYgIgotICAgICAgICAgIDw8ICIoX18iIDw8IG5hbWUgPDwgIiAhPSBvdGhlci0+X18iIDw8IG5hbWUgPDwgIikpKSB7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBzdHJ1Y3QgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/Ci0gKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgLy8gZXhjZXB0aW9ucyBuZWVkIHRvIGNhbGwgdGhlIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgb24gTlNFeGNlcHRpb24KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaWQpIGluaXQiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBbc3VwZXIgaW5pdFdpdGhOYW1lOiBAXCIiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgICA8PCAiXCIgcmVhc29uOiBAXCJ1bmtub3duXCIgdXNlckluZm86IG5pbF07IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICAvLyBzdHJ1Y3QKLQotICAgIC8vIGRlZmF1bHQgaW5pdGlhbGl6ZXIKLSAgICAvLyBzZXR1cCBpbnN0YW5jZSB2YXJpYWJsZXMgd2l0aCBkZWZhdWx0IHZhbHVlcwotICAgIGluZGVudChvdXQpIDw8ICItIChpZCkgaW5pdCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKLSAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgICBvdXQgPDwgIiNpZiBUQVJHRVRfT1NfSVBIT05FIHx8IChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEID49IE1BQ19PU19YX1ZFUlNJT05fMTBfNSkiCi0gICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxmLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICAvLyBpbml0aWFsaXplciB3aXRoIGFsbCBmaWVsZHMgYXMgcGFyYW1zCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOwotICAgIG91dCA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3NlbGYgaW5pdF07IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0gICAgICAgIG91dCA8PCAiWyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgcmV0YWluX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCA9IFlFUzsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gaW5pdFdpdGhDb2RlciBmb3IgTlNDb2RpbmcKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICAvLyBlbmNvZGVXaXRoQ29kZXIgZm9yIE5TQ29kaW5nCi0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICAvLyBoYXNoIGFuZCBpc0VxdWFsIGZvciBOU09iamVjdAotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaGFzaF9tZXRob2Qob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2lzX2VxdWFsX21ldGhvZChvdXQsIHRzdHJ1Y3QpOwotCi0gIC8vIGRlYWxsb2MKLSAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKLSAgICBvdXQgPDwgIi0gKHZvaWQpIGRlYWxsb2MiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJbX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGRlYWxsb2Nfc3R1Yl07IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIC8vIHRoZSByZXN0IG9mIHRoZSBtZXRob2RzCi0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9pbXBsZW1lbnRhdGlvbnMob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9kZXNjcmlwdGlvbihvdXQsIHRzdHJ1Y3QpOwotCi0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgIi0gKHZvaWQpIHJlYWQ6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzCi0gIGluZGVudChvdXQpIDw8ICJOU1N0cmluZyAqIGZpZWxkTmFtZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpbnQgZmllbGRUeXBlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImludCBmaWVsZElEOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IE5VTExdOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJbaW5Qcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6ICZmaWVsZE5hbWUgdHlwZTogJmZpZWxkVHlwZSBmaWVsZElEOiAmZmllbGRJRF07IgotICAgICAgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGRUeXBlID09IFRUeXBlX1NUT1ApIHsgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGRUeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgImZpZWxkVmFsdWUiKTsKLSAgICBpbmRlbnQob3V0KSA8PCBjYWxsX2ZpZWxkX3NldHRlcigqZl9pdGVyLCAiZmllbGRWYWx1ZSIpIDw8IGVuZGw7Ci0gICAgLy8gaWYgdGhpcyBpcyBhbiBhbGxvY2F0ZWQgZmllbGQsIHJlbGVhc2UgaXQgc2luY2UgdGhlIHN0cnVjdAotICAgIC8vIGlzIG5vdyByZXRhaW5pbmcgaXQKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAvLyBkZXNlcmlhbGl6ZWQgc3RyaW5ncyBhcmUgYXV0b3JlbGVhc2UsIHNvIGRvbid0IHJlbGVhc2UgdGhlbQotICAgICAgaWYgKCEoZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIltmaWVsZFZhbHVlIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGw7Ci0gICAgaWYgKGxvZ191bmV4cGVjdGVkXykgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TTG9nKEBcIiVzOiBmaWVsZCBJRCAlaSBoYXMgdW5leHBlY3RlZCB0eXBlICVpLiAgU2tpcHBpbmcuXCIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiX19QUkVUVFlfRlVOQ1RJT05fXywgZmllbGRJRCwgZmllbGRUeXBlKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IGluUHJvdG9jb2xdOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGlmIChsb2dfdW5leHBlY3RlZF8pIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNMb2coQFwiJXM6IHVuZXhwZWN0ZWQgZmllbGQgSUQgJWkgd2l0aCB0eXBlICVpLiAgU2tpcHBpbmcuXCIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgIl9fUFJFVFRZX0ZVTkNUSU9OX18sIGZpZWxkSUQsIGZpZWxkVHlwZSk7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IGluUHJvdG9jb2xdOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRGaWVsZEVuZF07IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIltpblByb3RvY29sIHJlYWRTdHJ1Y3RFbmRdOyIgPDwgZW5kbDsKLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaWYgKHZhbGlkYXRlX3JlcXVpcmVkXykgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3NlbGYgdmFsaWRhdGVdOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBuYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX2lzc2V0KSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgIDw8ICJcIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiBmaWVsZElEOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICJdOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIl9fIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmRdOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LCB3aGljaAotICogaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuIGlmIHRoZXkgYXJlCi0gKiBzZXQsIGFuZCBvbmx5IG9uZSBvZiB0aGVtIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBuYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIoX18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX2lzc2V0KSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG5pbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiIGZpZWxkSUQ6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIl07IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiX18iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEVuZF07IiA8PCBlbmRsOwotCi0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZFN0b3BdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIltvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEVuZF07IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKLSAqIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAodm9pZCkgdmFsaWRhdGUgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIV9fIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX2lzc2V0KSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEBcIlRQcm90b2NvbEV4Y2VwdGlvblwiIiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAXCJSZXF1aXJlZCBmaWVsZCAnIgotICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBpcyBub3Qgc2V0LlwiXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcyBmb3IgYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0LgotICogZ2V0dGVyLCBzZXR0ZXIsIGlzc2V0IGdldHRlci4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgKHZvaWQpaXNfZXhjZXB0aW9uOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGZpZWxkX25hbWU7Ci0gICAgY2FwX25hbWVbMF0gPSB0b3VwcGVyKGNhcF9uYW1lWzBdKTsKLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiLSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikgIjsKLSAgICBvdXQgPDwgZmllbGRfbmFtZSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFtbX18iIDw8IGZpZWxkX25hbWUgPDwgIiByZXRhaW5fc3R1Yl0gYXV0b3JlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBTaW1wbGUgc2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIHNldCIgPDwgY2FwX25hbWUgPDwgIjogKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgZmllbGRfbmFtZQotICAgICAgICAgICAgICAgIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGRfbmFtZSA8PCAiIHJldGFpbl9zdHViXTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiW19fIiA8PCBmaWVsZF9uYW1lIDw8ICIgcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX18iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICJfaXNzZXQgPSBZRVM7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIElzU2V0Ci0gICAgaW5kZW50KG91dCkgPDwgIi0gKEJPT0wpICIgPDwgZmllbGRfbmFtZSA8PCAiSXNTZXQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fIiA8PCBmaWVsZF9uYW1lIDw8ICJfaXNzZXQ7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFVuc2V0dGVyIC0gZG8gd2UgbmVlZCB0aGlzPwotICAgIGluZGVudChvdXQpIDw8ICItICh2b2lkKSB1bnNldCIgPDwgY2FwX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiW19fIiA8PCBmaWVsZF9uYW1lIDw8ICIgcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX18iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5pbDsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJfXyIgPDwgZmllbGRfbmFtZSA8PCAiX2lzc2V0ID0gTk87IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGRlc2NyaXB0aW9uIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24ob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICItIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TTXV0YWJsZVN0cmluZyAqIG1zID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoU3RyaW5nOiBAXCIiCi0gICAgICA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIl07IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCJdOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiwiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRGb3JtYXQ6IEBcIiIgPDwgZm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0dHlwZSkgPDwgIlwiLCBfXyIKLSAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW21zIGFwcGVuZFN0cmluZzogQFwiKVwiXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJyZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IG1zXTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gIEluIE9iamVjdGl2ZS1DIHRoaXMgY29uc2lzdHMgb2YgYQotICogcHJvdG9jb2wgZGVmaW5pdGlvbiwgYSBjbGllbnQgaW50ZXJmYWNlIGFuZCBhIGNsaWVudCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOwotICBpZiAoYXN5bmNfY2xpZW50c18pIHsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2FzeW5jX3Byb3RvY29sKGZfaGVhZGVyXywgdHNlcnZpY2UpOwotICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ludGVyZmFjZShmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIHJldHVybiB0eXBlcwotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2ltcGxfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0cywgZmFsc2UsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm4gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0gIH0KLX0KLQotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgcmV0dXJuIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gY3JlYXRlIGEgcmVzdWx0IHN0cnVjdCB3aXRoIGEgc3VjY2VzcyBmaWVsZCBvZiB0aGUgcmV0dXJuIHR5cGUsCi0gIC8vIGFuZCBhIGZpZWxkIGZvciBlYWNoIHR5cGUgb2YgZXhjZXB0aW9uIHRocm93bgotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodGZ1bmN0aW9uKSk7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICAvLyBnZW5lcmF0ZSB0aGUgcmVzdWx0IHN0cnVjdAotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaW1wbF8sICZyZXN1bHQsIGZhbHNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHByb3RvY29sIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQHByb3RvY29sICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiIDxOU09iamVjdD4iIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8ICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IgotICAgICAgICA8PCAiICAvLyB0aHJvd3MgIjsKLSAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpICsgIiwgIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJURXhjZXB0aW9uIiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiBhc3luY2hyb25vdXMgc2VydmljZSBwcm90b2NvbCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb3RvY29sIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfYXN5bmNfcHJvdG9jb2wob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBwcm90b2NvbCAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jIgotICAgICAgPDwgIiA8TlNPYmplY3Q+IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PCAiLSAiIDw8IGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ludGVyZmFjZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IDogVEJhc2VDbGllbnQgPCIKLSAgICAgIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4gIjsKLQotICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sOyIgPDwgZW5kbDsKLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhJblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgb3V0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgIgotICAgICAgICAgIm91dFByb3RvY29sOyIgPDwgZW5kbDsKLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbnRlcmZhY2Uob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudEFzeW5jIDogVEJhc2VDbGllbnQgPCIKLSAgICAgIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jPiAiOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQgPFRBc3luY1RyYW5zcG9ydD4gYXN5bmNUcmFuc3BvcnQ7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIGZhY3RvcnkgIgotICAgICAgICAgInRyYW5zcG9ydDogKGlkIDxUQXN5bmNUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7IiA8PCBlbmRsOwotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBpbnRlcmZhY2UgZGVmaW5pdGlvbi4gSW4gb3RoZXIgd29yZHMsIHRoZSBUUHJvY2VzcyBpbXBsZW1lbnRhdGlvbiBmb3IKLSAqdGhlCi0gKiBzZXJ2aWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2Uob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkKLSAgICAgIDw8ICJQcm9jZXNzb3IgOiBOU09iamVjdCA8VFByb2Nlc3Nvcj4gIjsKLQotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlkIDwiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4gbVNlcnZpY2U7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRGljdGlvbmFyeSAqIG1NZXRob2RNYXA7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI6IChpZCA8IiA8PCBjb2NvYV9wcmVmaXhfCi0gICAgICA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZTsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiLSAoaWQ8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlOyIgPDwgZW5kbDsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbigKLSAgICBvZnN0cmVhbSYgb3V0LAotICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBzdHJpbmcgZnVubmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKLQotICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQob3V0KSA8PCAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIiIKLSAgICAgIDw8ICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpID8gIiB0eXBlOiBUTWVzc2FnZVR5cGVfT05FV0FZIiA6ICIgdHlwZTogVE1lc3NhZ2VUeXBlX0NBTEwiKQotICAgICAgPDwgIiBzZXF1ZW5jZUlEOiAwXTsiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGFyZ3NuYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotCi0gIC8vIHdyaXRlIG91dCBmdW5jdGlvbiBwYXJhbWV0ZXJzCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmbGRfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGZpZWxkTmFtZSA8PCAiICE9IG5pbCkiOwotICAgICAgc2NvcGVfdXAob3V0KTsKLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZmllbGROYW1lCi0gICAgICAgIDw8ICJcIiIKLSAgICAgICAgICAgIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkKLSAgICAgICAgPDwgIiBmaWVsZElEOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIl07IiA8PCBlbmRsOwotCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZsZF9pdGVyLCBmaWVsZE5hbWUpOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEVuZF07IiA8PCBlbmRsOwotCi0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmbGRfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKAotICAgIG9mc3RyZWFtJiBvdXQsCi0gICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbih0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCkpOwotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChvdXQpIDw8ICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIC8vIFRPRE8obWNzbGVlKTogTWVzc2FnZSB2YWxpZGF0aW9uIGhlcmUsIHdhcyB0aGUgc2VxaWQgZXRjIG9rPwotCi0gIC8vIGNoZWNrIGZvciBhbiBleGNlcHRpb24KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24gKiB4ID0gW3NlbGYgY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb25dOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh4ICE9IG5pbCkiOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIkB0aHJvdyB4OyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIEZJWE1FIC0gY291bGQgb3B0aW1pemUgaGVyZSB0byByZWR1Y2UgY3JlYXRpb24gb2YgdGVtcG9yYXJ5IG9iamVjdHMuCi0gIHN0cmluZyByZXN1bHRuYW1lID0gZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0ZnVuY3Rpb24pOwotICBvdXQgPDwgaW5kZW50KCkgPDwgY29jb2FfcHJlZml4XyA8PCByZXN1bHRuYW1lIDw8ICIgKiByZXN1bHQgPSBbW1siIDw8IGNvY29hX3ByZWZpeF8gPDwgcmVzdWx0bmFtZQotICAgICAgPDwgIiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiW3Jlc3VsdCByZWFkOiBpblByb3RvY29sXTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotCi0gIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoW3Jlc3VsdCBzdWNjZXNzSXNTZXRdKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIHJldHVybiBbcmVzdWx0IHN1Y2Nlc3NdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoW3Jlc3VsdCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXRdKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIEB0aHJvdyBbcmVzdWx0ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgotICBpZiAodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkB0aHJvdyBbVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhUeXBlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb25fTUlTU0lOR19SRVNVTFQiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIl07IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gaW52b2NhdGlvbiBvZiBhIGdpdmVuICdzZW5kXycgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbnZvY2F0aW9uKAotICAgIG9mc3RyZWFtJiBvdXQsCi0gICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgaW5kZW50KG91dCkgPDwgIltzZWxmIHNlbmRfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgIHN0cmluZyBmaWVsZE5hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBvdXQgPDwgIiAiOwotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PCAiOiAiIDw8IGZpZWxkTmFtZTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGZpZWxkTmFtZSA8PCAiOiAiIDw8IGZpZWxkTmFtZTsKLSAgICB9Ci0gIH0KLSAgb3V0IDw8ICJdOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IiA8PCBlbmRsOwotCi0gIC8vIGluaXRpYWxpemVycwotICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBbc2VsZiBpbml0V2l0aEluUHJvdG9jb2w6IHByb3RvY29sIG91dFByb3RvY29sOiBwcm90b2NvbF07IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoSW5Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBhbkluUHJvdG9jb2wgb3V0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgIgotICAgICAgICAgImFuT3V0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaW5Qcm90b2NvbCA9IFthbkluUHJvdG9jb2wgcmV0YWluX3N0dWJdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXRQcm90b2NvbCA9IFthbk91dFByb3RvY29sIHJldGFpbl9zdHViXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotCi0gICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsICpmX2l0ZXIpOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgKmZfaXRlcik7Ci0gICAgfQotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChvdXQpIDw8ICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoXTsiIDw8IGVuZGw7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIG91dCA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIltzZWxmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gZm9yIGl0cyBhc3luY2hyb25vdXMgaW50ZXJmYWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnRBc3luYyIgPDwgZW5kbAotICAgICAgPDwgZW5kbCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBmYWN0b3J5ICIKLSAgICAgICAgICAgICAgICAgInRyYW5zcG9ydDogKGlkIDxUQXN5bmNUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7IiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaW5Qcm90b2NvbCA9IFtbZmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OnRyYW5zcG9ydF0gcmV0YWluX3N0dWJdOyIKLSAgICAgIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0UHJvdG9jb2wgPSBpblByb3RvY29sOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJhc3luY1RyYW5zcG9ydCA9IHRyYW5zcG9ydDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotCi0gICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsICpmX2l0ZXIpOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgKmZfaXRlcik7Ci0gICAgfQotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChvdXQpIDw8ICItICIgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiQHRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IEBjYXRjaChURXhjZXB0aW9uICogdGV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZhaWx1cmVCbG9jayh0ZXhjZXB0aW9uKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2FzeW5jVHJhbnNwb3J0IGZsdXNoOl57IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJAdHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBzdHJpbmcgcmVjdl9pbnZvY2F0aW9uID0gIltzZWxmIHJlY3ZfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJdIjsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkgJiYgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZWN2X2ludm9jYXRpb24gPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzcG9uc2VCbG9jaygiOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSAmJiAhKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIG91dCA8PCByZWN2X2ludm9jYXRpb247Ci0gICAgfQotICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IEBjYXRjaChURXhjZXB0aW9uICogdGV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmFpbHVyZUJsb2NrKHRleGNlcHRpb24pOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZmFpbHVyZTpmYWlsdXJlQmxvY2tdOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uICBJbiBvdGhlciB3b3JkcyB0aGUgYWN0dWFsIFRQcm9jZXNzb3IgaW1wbGVtZW50YXRpb24KLSAqIGZvciB0aGUgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yIiA8PCBlbmRsOwotCi0gIC8vIGluaXRpYWxpemVyCi0gIG91dCA8PCBlbmRsOwotICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIjogKGlkIDwiIDw8IGNvY29hX3ByZWZpeF8KLSAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghc2VsZikgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBuaWw7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAibVNlcnZpY2UgPSBbc2VydmljZSByZXRhaW5fc3R1Yl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIm1NZXRob2RNYXAgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgZGljdGlvbmFyeV0gcmV0YWluX3N0dWJdOyIgPDwgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSBtZXRob2QgbWFwIGZvciByb3V0aW5nIGluY29taW5nIGNhbGxzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJTRUwgcyA9IEBzZWxlY3Rvcihwcm9jZXNzXyIgPDwgZnVubmFtZQotICAgICAgICA8PCAiX3dpdGhTZXF1ZW5jZUlEOmluUHJvdG9jb2w6b3V0UHJvdG9jb2w6KTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU01ldGhvZFNpZ25hdHVyZSAqIHNpZyA9IFtzZWxmIG1ldGhvZFNpZ25hdHVyZUZvclNlbGVjdG9yOiBzXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJOU0ludm9jYXRpb24gKiBpbnZvY2F0aW9uID0gW05TSW52b2NhdGlvbiBpbnZvY2F0aW9uV2l0aE1ldGhvZFNpZ25hdHVyZTogc2lnXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW52b2NhdGlvbiBzZXRTZWxlY3Rvcjogc107IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2ludm9jYXRpb24gcmV0YWluQXJndW1lbnRzXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbbU1ldGhvZE1hcCBzZXRWYWx1ZTogaW52b2NhdGlvbiBmb3JLZXk6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgJ3NlcnZpY2UnIG1ldGhvZCB3aGljaCByZXR1cm5zIHRoZSBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gIC8vIHByb2Nlc3NvcgotICBvdXQgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICItIChpZDwiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIHNlcnZpY2UiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBbW21TZXJ2aWNlIHJldGFpbl9zdHViXSBhdXRvcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAvLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFByb2Nlc3MgbWV0aG9kLCB3aGljaCBkaXNwYXRjaGVzIHRoZSBpbmNvbWluZyBjYWxsIHVzaW5nIHRoZSBtZXRob2QgbWFwCi0gIG91dCA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHByb2Nlc3NPbklucHV0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGludCBtZXNzYWdlVHlwZTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpbnQgc2VxSUQ7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6ICZtZXNzYWdlTmFtZSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAmbWVzc2FnZVR5cGUiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogJnNlcUlEXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0ludm9jYXRpb24gKiBpbnZvY2F0aW9uID0gW21NZXRob2RNYXAgdmFsdWVGb3JLZXk6IG1lc3NhZ2VOYW1lXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoaW52b2NhdGlvbiA9PSBuaWwpIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBUVHlwZV9TVFJVQ1Qgb25Qcm90b2NvbDogaW5Qcm90b2NvbF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBUQXBwbGljYXRpb25FeGNlcHRpb24gKiB4ID0gW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb25XaXRoVHlwZTogIgotICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOX01FVEhPRCByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiAiCi0gICAgICAgICAgICAgICAgICAgICAiQFwiSW52YWxpZCBtZXRob2QgbmFtZTogJyVAJ1wiLCBtZXNzYWdlTmFtZV1dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IG1lc3NhZ2VOYW1lIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVE1lc3NhZ2VUeXBlX0VYQ0VQVElPTiIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcUlEXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFt4IHdyaXRlOiBvdXRQcm90b2NvbF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFtbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gWUVTOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAvLyBOU0ludm9jYXRpb24gZG9lcyBub3QgY29uZm9ybSB0byBOU0NvcHlpbmcgcHJvdG9jb2wiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0ludm9jYXRpb24gKiBpID0gW05TSW52b2NhdGlvbiBpbnZvY2F0aW9uV2l0aE1ldGhvZFNpZ25hdHVyZTogIgotICAgICAgICAgICAgICAgICAgICAgIltpbnZvY2F0aW9uIG1ldGhvZFNpZ25hdHVyZV1dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldFNlbGVjdG9yOiBbaW52b2NhdGlvbiBzZWxlY3Rvcl1dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmc2VxSUQgYXRJbmRleDogMl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZpblByb3RvY29sIGF0SW5kZXg6IDNdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmb3V0UHJvdG9jb2wgYXRJbmRleDogNF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0VGFyZ2V0OiBzZWxmXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBpbnZva2VdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBZRVM7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgLy8gZ2VuZXJhdGUgYSBwcm9jZXNzX1hYWFggbWV0aG9kIGZvciBlYWNoIHNlcnZpY2UgZnVuY3Rpb24sIHdoaWNoIHJlYWRzIGFyZ3MsIGNhbGxzIHRoZSBzZXJ2aWNlLAotICAvLyBhbmQgd3JpdGVzIHJlc3VsdHMKLSAgZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKHZvaWQpIHByb2Nlc3NfIiA8PCBmdW5uYW1lCi0gICAgICAgIDw8ICJfd2l0aFNlcXVlbmNlSUQ6IChpbnQzMl90KSBzZXFJRCBpblByb3RvY29sOiAoaWQ8VFByb3RvY29sPikgaW5Qcm90b2NvbCBvdXRQcm90b2NvbDogIgotICAgICAgICAgICAiKGlkPFRQcm90b2NvbD4pIG91dFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgc3RyaW5nIGFyZ3N0eXBlID0gY29jb2FfcHJlZml4XyArIGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKCpmX2l0ZXIpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBhcmdzdHlwZSA8PCAiICogYXJncyA9IFtbIiA8PCBhcmdzdHlwZSA8PCAiIGFsbG9jXSBpbml0XTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbYXJncyByZWFkOiBpblByb3RvY29sXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotCi0gICAgLy8gcHJlcGFyZSB0aGUgcmVzdWx0IGlmIG5vdCBvbmV3YXkKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyByZXN1bHR0eXBlID0gY29jb2FfcHJlZml4XyArIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUoKmZfaXRlcik7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVzdWx0dHlwZSA8PCAiICogcmVzdWx0ID0gW1siIDw8IHJlc3VsdHR5cGUgPDwgIiBhbGxvY10gaW5pdF07IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIG1ha2UgdGhlIGNhbGwgdG8gdGhlIGFjdHVhbCBzZXJ2aWNlIG9iamVjdAotICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBvdXQgPDwgIltyZXN1bHQgc2V0U3VjY2VzczogIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJbbVNlcnZpY2UgIiA8PCBmdW5uYW1lOwotICAgIC8vIHN1cHBseWluZyBhcmd1bWVudHMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8ICI6IFthcmdzICIgPDwgZmllbGROYW1lIDw8ICJdIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiICIgPDwgZmllbGROYW1lIDw8ICI6IFthcmdzICIgPDwgZmllbGROYW1lIDw8ICJdIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICJdIjsKLSAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBvdXQgPDwgIl0iOwotICAgIH0KLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICAvLyB3cml0ZSBvdXQgdGhlIHJlc3VsdCBpZiBub3Qgb25ld2F5Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiIiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVE1lc3NhZ2VUeXBlX1JFUExZIiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogc2VxSURdOyIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3Jlc3VsdCB3cml0ZTogb3V0UHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbW291dFByb3RvY29sIHRyYW5zcG9ydF0gZmx1c2hdOyIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3Jlc3VsdCByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbYXJncyByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIC8vIGRlYWxsb2MKLSAgb3V0IDw8IGVuZGw7Ci0gIG91dCA8PCAiLSAodm9pZCkgZGVhbGxvYyIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbbVNlcnZpY2UgcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW21NZXRob2RNYXAgcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGRlYWxsb2Nfc3R1Yl07IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gZmllbGROYW1lIFRoZSB2YXJpYWJsZSBuYW1lIGZvciB0aGlzIGZpZWxkCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgZmllbGROYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIGZpZWxkTmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZE5hbWUgPDwgIiA9IFtpblByb3RvY29sICI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnldOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nXTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZV07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2XTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NF07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIKLSAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyXTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBhbGxvY2F0ZXMgdGhlIHN0cnVjdCBhbmQgaW52b2tlcyByZWFkOgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCBmaWVsZE5hbWUgPDwgIiA9IFtbIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSkKLSAgICAgICAgICAgICAgPDwgIiBhbGxvY10gaW5pdF07IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgcmVhZDogaW5Qcm90b2NvbF07IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZwotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIGluZGVudChvdXQpIDw8ICJpbnQgIiA8PCBzaXplIDw8ICI7IiA8PCBlbmRsOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IE5VTEwgdmFsdWVUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUKLSAgICAgICAgICAgICAgICA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZURpY3Rpb25hcnkgKiAiIDw8IGZpZWxkTmFtZQotICAgICAgICAgICAgICAgIDw8ICIgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIl07IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZVNldCAqICIgPDwgZmllbGROYW1lCi0gICAgICAgICAgICAgICAgPDwgIiA9IFtbTlNNdXRhYmxlU2V0IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiW2luUHJvdG9jb2wgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIl07IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZUFycmF5ICogIiA8PCBmaWVsZE5hbWUKLSAgICAgICAgICAgICAgICA8PCAiID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgfQotICAvLyBGSVhNRSAtIHRoZSBjb2RlIGFib3ZlIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZSBlbGVtZW50IHR5cGVzIG9mCi0gIC8vIHRoZSBjb250YWluZXJzIGJlaW5nIHJlYWQgbWF0Y2ggdGhlIGVsZW1lbnQgdHlwZXMgb2YgdGhlCi0gIC8vIGNvbnRhaW5lcnMgd2UgYXJlIHJlYWRpbmcgaW50by4gIERvZXMgdGhhdCBtYXR0ZXI/Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwgImludCAiIDw8IGkgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIKLSAgICAgICAgICAgICAgPDwgc2l6ZSA8PCAiOyAiCi0gICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGZpZWxkTmFtZSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBmaWVsZE5hbWUpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgZmllbGROYW1lKTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWFwRW5kXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRTZXRFbmRdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRMaXN0RW5kXTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBUYWtlIGEgdmFyaWFibGUgb2YgYSBnaXZlbiB0eXBlIGFuZCB3cmFwIGl0IGluIGNvZGUgdG8gbWFrZSBpdAotICogc3VpdGFibGUgZm9yIHB1dHRpbmcgaW50byBhIGNvbnRhaW5lciwgaWYgbmVjZXNzYXJ5LiAgQmFzaWNhbGx5LAotICogd3JhcCBzY2FsZXIgcHJpbWl0aXZlcyBpbiBOU051bWJlciBvYmplY3RzLgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvbnRhaW5lcml6ZSh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIC8vIEZJWE1FIC0gb3B0aW1pemUgaGVyZSB0byBhdm9pZCBhdXRvcmVsZWFzZSBwb29sPwotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotICBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhJbnQ6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNhbid0IGNvbnRhaW5lcml6ZSB2b2lkIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoQm9vbDogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoVW5zaWduZWRDaGFyOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aFNob3J0OiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aExvbmc6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoTG9uZ0xvbmc6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoRG91YmxlOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyBkbyBub3RoaW5nCi0gIHJldHVybiBmaWVsZE5hbWU7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAgZWxlbWVudAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X3R5cGUqIGtleVR5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKLSAgdF90eXBlKiB2YWxUeXBlID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7Ci0gIHRfZmllbGQgZmtleShrZXlUeXBlLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodmFsVHlwZSwgdmFsKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCBrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8ICJbIiA8PCBmaWVsZE5hbWUgPDwgIiBzZXRPYmplY3Q6ICIgPDwgY29udGFpbmVyaXplKHZhbFR5cGUsIHZhbCkKLSAgICAgICAgICAgICAgPDwgIiBmb3JLZXk6ICIgPDwgY29udGFpbmVyaXplKGtleVR5cGUsIGtleSkgPDwgIl07IiA8PCBlbmRsOwotCi0gIGlmICh0eXBlX2Nhbl9iZV9udWxsKGtleVR5cGUpKSB7Ci0gICAgaWYgKCEoZ2V0X3RydWVfdHlwZShrZXlUeXBlKS0+aXNfc3RyaW5nKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgY29udGFpbmVyaXplKGtleVR5cGUsIGtleSkgPDwgIiByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpZiAodHlwZV9jYW5fYmVfbnVsbCh2YWxUeXBlKSkgewotICAgIGlmICghKGdldF90cnVlX3R5cGUodmFsVHlwZSktPmlzX3N0cmluZygpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGNvbnRhaW5lcml6ZSh2YWxUeXBlLCB2YWwpIDw8ICIgcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF90eXBlKiB0eXBlID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOwotICB0X2ZpZWxkIGZlbGVtKHR5cGUsIGVsZW0pOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgYWRkT2JqZWN0OiAiIDw8IGNvbnRhaW5lcml6ZSh0eXBlLCBlbGVtKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAvLyBkZXNlcmlhbGl6ZWQgc3RyaW5ncyBhcmUgYXV0b3JlbGVhc2UsIHNvIGRvbid0IHJlbGVhc2UgdGhlbQotICAgIGlmICghKGdldF90cnVlX3R5cGUodHlwZSktPmlzX3N0cmluZygpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGNvbnRhaW5lcml6ZSh0eXBlLCBlbGVtKSA8PCAiIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfdHlwZSogdHlwZSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7Ci0gIHRfZmllbGQgZmVsZW0odHlwZSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8ICJbIiA8PCBmaWVsZE5hbWUgPDwgIiBhZGRPYmplY3Q6ICIgPDwgY29udGFpbmVyaXplKHR5cGUsIGVsZW0pIDw8ICJdOyIgPDwgZW5kbDsKLQotICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgIGlmICghKGdldF90cnVlX3R5cGUodHlwZSktPmlzX3N0cmluZygpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGNvbnRhaW5lcml6ZSh0eXBlLCBlbGVtKSA8PCAiIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSB0byBvZiB0aGUgdmFyaWFibGUgaG9sZGluZyB0aGUgZmllbGQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIGZpZWxkTmFtZSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBmaWVsZE5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIGZpZWxkTmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltvdXRQcm90b2NvbCAiOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgZmllbGROYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeTogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nOiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbDogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlOiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2OiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyOiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0OiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlOiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIKLSAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMjogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgaG9sZGluZyBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICAodm9pZCl0c3RydWN0OwotICBvdXQgPDwgaW5kZW50KCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIHdyaXRlOiBvdXRQcm90b2NvbF07IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgotICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIGhvbGRpbmcgY29udGFpbmVyCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIgdmFsdWVUeXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiIHNpemU6IFsiCi0gICAgICAgICAgICAgICAgPDwgZmllbGROYW1lIDw8ICIgY291bnRdXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiIHNpemU6IFsiIDw8IGZpZWxkTmFtZQotICAgICAgICAgICAgICAgIDw8ICIgY291bnRdXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6ICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiIHNpemU6IFsiIDw8IGZpZWxkTmFtZQotICAgICAgICAgICAgICAgIDw8ICIgY291bnRdXTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgc3RyaW5nIGtleTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGtleSA9IHRtcCgia2V5Iik7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TRW51bWVyYXRvciAqICIgPDwgaXRlciA8PCAiID0gWyIgPDwgZmllbGROYW1lIDw8ICIga2V5RW51bWVyYXRvcl07IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJpZCAiIDw8IGtleSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKCgiIDw8IGtleSA8PCAiID0gWyIgPDwgaXRlciA8PCAiIG5leHRPYmplY3RdKSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAga2V5ID0gdG1wKCJvYmoiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiTlNFbnVtZXJhdG9yICogIiA8PCBpdGVyIDw8ICIgPSBbIiA8PCBmaWVsZE5hbWUgPDwgIiBvYmplY3RFbnVtZXJhdG9yXTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIndoaWxlICgoIiA8PCBrZXkgPDwgIiA9IFsiIDw8IGl0ZXIgPDwgIiBuZXh0T2JqZWN0XSkpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBrZXkgPSB0bXAoImlkeCIpOwotICAgIGluZGVudChvdXQpIDw8ICJpbnQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBrZXkgPDwgIiA9IDA7ICIgPDwga2V5IDw8ICIgPCBbIiA8PCBmaWVsZE5hbWUgPDwgIiBjb3VudF07ICIgPDwga2V5Ci0gICAgICAgICAgICAgICAgPDwgIisrKSIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtleSwgZmllbGROYW1lKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBrZXkpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGtleSwgZmllbGROYW1lKTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZU1hcEVuZF07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTZXRFbmRdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUxpc3RFbmRdOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBHaXZlbiBhIGZpZWxkIHZhcmlhYmxlIG5hbWUsIHdyYXAgaXQgaW4gY29kZSB0aGF0IGNvbnZlcnRzIGl0IHRvIGEKLSAqIHByaW1pdGl2ZSB0eXBlLCBpZiBuZWNlc3NhcnkuCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZGVjb250YWluZXJpemUodF9maWVsZCogdGZpZWxkLCBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgaW50VmFsdWVdIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY2FuJ3QgZGVjb250YWluZXJpemUgdm9pZCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgYm9vbFZhbHVlXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgdW5zaWduZWRDaGFyVmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIHNob3J0VmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGxvbmdWYWx1ZV0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgbG9uZ0xvbmdWYWx1ZV0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgZG91YmxlVmFsdWVdIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gZG8gbm90aGluZwotICByZXR1cm4gZmllbGROYW1lOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcE5hbWUpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsIGRlY29udGFpbmVyaXplKCZrZmllbGQsIGtleSkpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgIlsiICsgbWFwTmFtZSArICIgb2JqZWN0Rm9yS2V5OiAiICsga2V5ICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgZGVjb250YWluZXJpemUoJnZmaWVsZCwgdmZpZWxkLmdldF9uYW1lKCkpKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZWxlbWVudE5hbWUpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtZW50TmFtZSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIGRlY29udGFpbmVyaXplKCZlZmllbGQsIGVsZW1lbnROYW1lKSk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbGlzdE5hbWUpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIlsiICsgbGlzdE5hbWUgKyAiIG9iamVjdEF0SW5kZXg6ICIgKyBpbmRleCArICJdIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIGRlY29udGFpbmVyaXplKCZlZmllbGQsIGVmaWVsZC5nZXRfbmFtZSgpKSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbiBPYmplY3RpdmUtQyBuYW1lCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcGFyYW0gY2xhc3NfcmVmIERvIHdlIHdhbnQgYSBDbGFzcyByZWZlcmVuY2UgaXN0ZWFkIG9mIGEgdHlwZSByZWZlcmVuY2U/Ci0gKiBAcmV0dXJuIEphdmEgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGNsYXNzX3JlZikgewotICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICAgIHJldHVybiBwcm9ncmFtID8gKHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNvY29hIikgKyB0dHlwZS0+Z2V0X25hbWUoKSkgOiB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyByZXN1bHQ7Ci0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaW50IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXN1bHQgPSAiTlNNdXRhYmxlRGljdGlvbmFyeSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmVzdWx0ID0gIk5TTXV0YWJsZVNldCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJlc3VsdCA9ICJOU011dGFibGVBcnJheSI7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gQ2hlY2sgZm9yIHByZWZpeAotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICAgIGlmIChwcm9ncmFtICE9IE5VTEwpIHsKLSAgICAgIHJlc3VsdCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNvY29hIikgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFjbGFzc19yZWYpIHsKLSAgICByZXN1bHQgKz0gIiAqIjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIE9iamVjdGl2ZS1DIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCi0gKgotICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSkgewotICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKLQotICBzd2l0Y2ggKHRiYXNlKSB7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICByZXR1cm4gInZvaWQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIHJldHVybiAiTlNEYXRhICoiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIk5TU3RyaW5nICoiOwotICAgIH0KLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIHJldHVybiAiQk9PTCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICByZXR1cm4gInVpbnQ4X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICByZXR1cm4gImludDE2X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludDMyX3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICByZXR1cm4gImludDY0X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICByZXR1cm4gImRvdWJsZSI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBPYmplY3RpdmUtQyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHkpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaW5kZW50KG91dCk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKTsKLSAgICBpZiAoZGVmdmFsKQotICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpZiAoZGVmdmFsKQotICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGlmIChkZWZ2YWwpCi0gICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKLSAgICBpZiAoZGVmdmFsIHx8IGlzX3Byb3BlcnR5KQotICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFtbWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlX3N0dWJdOyIKLSAgICAgICAgICA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBbWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgYWxsb2NdIGluaXRdOyIgPDwgZW5kbDsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gY2FwaXRhbGl6ZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOwotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IG5hbWUgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICI6IiA8PCB2YWwgPDwgIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGlmIChkZWZ2YWwpCi0gICAgICBvdXQgPDwgIk5TTXV0YWJsZURpY3Rpb25hcnkgKiI7Ci0gICAgaWYgKGRlZnZhbCB8fCBpc19wcm9wZXJ0eSkKLSAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBbW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiIgPDwgdmFsLnNpemUoKQotICAgICAgICAgIDw8ICJdIGF1dG9yZWxlYXNlX3N0dWJdOyAiIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eToiIDw8IHZhbC5zaXplKCkgPDwgIl07ICIKLSAgICAgICAgICA8PCBlbmRsOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QsIHRydWUpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgdHJ1ZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgbmFtZSA8PCAiIHNldE9iamVjdDoiIDw8IHZhbCA8PCAiIGZvcktleToiIDw8IGtleSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgaWYgKGRlZnZhbCkKLSAgICAgIG91dCA8PCAiTlNNdXRhYmxlQXJyYXkgKiI7Ci0gICAgaWYgKGRlZnZhbCB8fCBpc19wcm9wZXJ0eSkKLSAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBbW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eToiIDw8IHZhbC5zaXplKCkKLSAgICAgICAgICA8PCAiXSBhdXRvcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6IiA8PCB2YWwuc2l6ZSgpIDw8ICJdOyIgPDwgZW5kbDsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBuYW1lIDw8ICIgYWRkT2JqZWN0OiIgPDwgdmFsIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgaWYgKGRlZnZhbCkKLSAgICAgIG91dCA8PCAiTlNNdXRhYmxlU2V0ICoiOwotICAgIGlmIChkZWZ2YWwgfHwgaXNfcHJvcGVydHkpCi0gICAgICBvdXQgPDwgbmFtZSA8PCAiID0gW1tbTlNNdXRhYmxlU2V0IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiIgPDwgdmFsLnNpemUoKQotICAgICAgICAgIDw8ICJdIGF1dG9yZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAgICBvdXQgPDwgbmFtZSA8PCAiID0gW1tOU011dGFibGVTZXQgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6IiA8PCB2YWwuc2l6ZSgpIDw8ICJdOyIgPDwgZW5kbDsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBuYW1lIDw8ICIgYWRkT2JqZWN0OiIgPDwgdmFsIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29udGFpbmVyaXplX2l0KSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAvLyBXZSBtdXN0IGhhbmRsZSBiaW5hcnkgY29uc3RhbnQgYnV0IHRoZSBzeW50YXggb2YgSURMIGRlZmluZXMKLSAgICAgIC8vIG5vdGhpbmcgYWJvdXQgYmluYXJ5IGNvbnN0YW50LgotICAgICAgLy8gICBpZiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpCi0gICAgICAvLyAgICAgIC8vIGJpbmFyeSBjb2RlCi0gICAgICByZW5kZXIgPDwgIkBcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gIllFUyIgOiAiTk8iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSwgZmFsc2UpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgaWYgKGNvbnRhaW5lcml6ZV9pdCkgewotICAgIHJldHVybiBjb250YWluZXJpemUodHlwZSwgcmVuZGVyLnN0cigpKTsKLSAgfQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi0jaWYgMAotLyoqCi1PUklHSU5BTAotICogU3BpdCBvdXQgY29kZSB0aGF0IGV2YWx1YXRlcyB0byB0aGUgc3BlY2lmaWVkIGNvbnN0YW50IHZhbHVlLgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb250YWluZXJpemVfaXQpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJlbmRlciA8PCAiQFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAiWUVTIiA6ICJOTyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBpZiAodmFsLnNpemUoKSA+IDApCi0gICAgICByZW5kZXIgPDwgIltbIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSkgPDwgIiBhbGxvY10gaW5pdFdpdGgiOwotICAgIGVsc2UKLSAgICAgIHJlbmRlciA8PCAiW1siIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIGFsbG9jXSBpbml0IjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgLy8gRklYTUUgVGhlIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IG1hdGNoIHdpdGggaW5pdFdpdGhYWFgKLSAgICAgIC8vICAgICAgIGluaXRpYWxpemVyIGFuZCBjYXVzZXMgY29tcGlsZSBlcnJvci4KLSAgICAgIC8vICAgICAgIFRyeTogdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgYW5kIHRlc3QvU21hbGxUZXN0LnRocmlmdAotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIHJlbmRlciA8PCBjYXBpdGFsaXplKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgIiAiIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHJlbmRlciA8PCAiOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICAgIHJlbmRlciA8PCAiXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZW5kZXIgPDwgIltbTlNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHNBbmRLZXlzOiAiOwotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0LCB0cnVlKTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kLCB0cnVlKTsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICByZW5kZXIgPDwgdmFsIDw8ICIsICIgPDwga2V5OwotICAgIH0KLSAgICBpZiAoZmlyc3QpCi0gICAgICByZW5kZXIgPDwgIiBuaWxdIjsKLSAgICBlbHNlCi0gICAgICByZW5kZXIgPDwgIiwgbmlsXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmVuZGVyIDw8ICJbW05TQXJyYXkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czogIjsKLSAgICB0X3R5cGUgKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIHJlbmRlciA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOwotICAgIH0KLSAgICBpZiAoZmlyc3QpCi0gICAgICByZW5kZXIgPDwgIiBuaWxdIjsKLSAgICBlbHNlCi0gICAgICByZW5kZXIgPDwgIiwgbmlsXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZW5kZXIgPDwgIltbTlNTZXQgYWxsb2NdIGluaXRXaXRoT2JqZWN0czogIjsKLSAgICB0X3R5cGUgKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCAiLCAiOwotICAgICAgfQotICAgICAgcmVuZGVyIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7Ci0gICAgfQotICAgIGlmIChmaXJzdCkKLSAgICAgIHJlbmRlciA8PCAiIG5pbF0iOwotICAgIGVsc2UKLSAgICAgIHJlbmRlciA8PCAiLCBuaWxdIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiZG9uJ3Qga25vdyBob3cgdG8gcmVuZGVyIGNvbnN0YW50IGZvciB0eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmIChjb250YWluZXJpemVfaXQpIHsKLSAgICByZXR1cm4gY29udGFpbmVyaXplKHR5cGUsIHJlbmRlci5zdHIoKSk7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotI2VuZGlmCi0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZC4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCkgewotICByZXR1cm4gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiIF9fIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICI7IjsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhbiBPYmplY3RpdmUtQyAyLjAgcHJvcGVydHkuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gZGVjbGFyZSBhIHByb3BlcnR5IGZvcgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY2xhcmVfcHJvcGVydHkodF9maWVsZCogdGZpZWxkKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0gIHJlbmRlciA8PCAiQHByb3BlcnR5IChub25hdG9taWMsICI7Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwodGZpZWxkLT5nZXRfdHlwZSgpKSkKLSAgICByZW5kZXIgPDwgInJldGFpbiwgIjsKLQotICByZW5kZXIgPDwgImdldHRlcj0iIDw8IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIsIHNldHRlcj1zZXQiCi0gICAgICAgICA8PCBjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgKyAiOikgIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiICIKLSAgICAgICAgIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyI7Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIikgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIHRoYXQgcmV0dXJucyBhc3luY2hyb25vdXNseSBpbnN0ZWFkIG9mCi0gKiBsaXRlcmFsbHkgcmV0dXJuaW5nLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgdF9zdHJ1Y3QqIHRhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBzdGQ6OnN0cmluZyByZXNwb25zZV9wYXJhbSA9ICJkaXNwYXRjaF9ibG9ja190IjsKLSAgaWYgKCF0dHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzcG9uc2VfcGFyYW0gPSAidm9pZCAoXikoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKSI7Ci0gIH0KLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gIih2b2lkKSAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICsgKHRhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA/ICIgcmVzcG9uc2UiIDogIiIpICsgIjogKCIKLSAgICAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZV9wYXJhbSArICIpIHJlc3BvbnNlQmxvY2sgIgotICAgICAgICAgICAgICAgICAgICAgICArICJmYWlsdXJlIDogKFRBc3luY0ZhaWx1cmVCbG9jaykgZmFpbHVyZUJsb2NrIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgdHlwZXMgYW5kIG5hbWVzLCBzdWl0YWJsZSBmb3IgYW4KLSAqIG9iamVjdGl2ZS1jIHBhcmFtZXRlciBsaXN0Ci0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgYXJnUHJlZml4ID0gIiI7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBhcmdQcmVmaXggPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICByZXN1bHQgKz0gIiAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gYXJnUHJlZml4ICsgIjogKCIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIpICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBPYmplY3RpdmUtQyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGVfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlX0JPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGVfQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlX0kzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlX0k2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlX0RPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGVfSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZV9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZV9NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZV9TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGVfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIGZvcm1hdCBzdHJpbmcgc3BlY2lmaWVyIGZvciB0aGUgc3VwcGxpZWQgcGFyc2UgdHlwZS4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmb3JtYXRfc3RyaW5nX2Zvcl90eXBlKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiXFxcIiVAXFxcIiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICIlaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICIlaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIiVoaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIiVpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiJXFpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiJWYiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIiVpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICIlQCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIiVAIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiJUAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiJUAiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBmb3JtYXRfc3RyaW5nX2Zvcl90eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNhbGwgdG8gYSBmaWVsZCdzIHNldHRlci4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIEZpZWxkIHRoZSBzZXR0ZXIgaXMgYmVpbmcgY2FsbGVkIG9uCi0gKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgdG8gcGFzcyB0byBzZXR0ZXIKLSAqLwotCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNhbGxfZmllbGRfc2V0dGVyKHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIGZpZWxkTmFtZSkgewotICByZXR1cm4gIltzZWxmIHNldCIgKyBjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgKyAiOiAiICsgZmllbGROYW1lICsgIl07IjsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKLSAgICBjb2NvYSwKLSAgICAiQ29jb2EiLAotICAgICIgICAgbG9nX3VuZXhwZWN0ZWQ6ICBMb2cgZXZlcnkgdGltZSBhbiB1bmV4cGVjdGVkIGZpZWxkIElEIG9yIHR5cGUgaXMgZW5jb3VudGVyZWQuXG4iCi0gICAgIiAgICB2YWxpZGF0ZV9yZXF1aXJlZDpcbiIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgVGhyb3dzIGV4Y2VwdGlvbiBpZiBhbnkgcmVxdWlyZWQgZmllbGQgaXMgbm90IHNldC5cbiIKLSAgICAiICAgIGFzeW5jX2NsaWVudHM6ICAgR2VuZXJhdGUgY2xpZW50cyB3aGljaCBpbnZva2UgYXN5bmNocm9ub3VzbHkgdmlhIGJsb2NrIHN5bnRheC5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTAzZDk0Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDM2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBDKysgY29kZSBnZW5lcmF0b3IuIFRoaXMgaXMgbGVnaXRpbWFjeSBpbmNhcm5hdGUuCi0gKgotICovCi1jbGFzcyB0X2NwcF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9jcHBfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJwdXJlX2VudW1zIik7Ci0gICAgZ2VuX3B1cmVfZW51bXNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImluY2x1ZGVfcHJlZml4Iik7Ci0gICAgdXNlX2luY2x1ZGVfcHJlZml4XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJjb2Jfc3R5bGUiKTsKLSAgICBnZW5fY29iX3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJub19jbGllbnRfY29tcGxldGlvbiIpOwotICAgIGdlbl9ub19jbGllbnRfY29tcGxldGlvbl8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibm9fZGVmYXVsdF9vcGVyYXRvcnMiKTsKLSAgICBnZW5fbm9fZGVmYXVsdF9vcGVyYXRvcnNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInRlbXBsYXRlcyIpOwotICAgIGdlbl90ZW1wbGF0ZXNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgZ2VuX3RlbXBsYXRlc19vbmx5XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpICYmIGl0ZXItPnNlY29uZCA9PSAib25seSIpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm1vdmVhYmxlX3R5cGVzIik7Ci0gICAgZ2VuX21vdmVhYmxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNwcCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7IGdlbmVyYXRlX2NwcF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOyB9Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeyBnZW5lcmF0ZV9jcHBfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7IH0KLSAgdm9pZCBnZW5lcmF0ZV9jcHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycyA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlYWQgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzd2FwID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9mc3RyZWFtJiBmb3JjZV9jcHBfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0dGVycyA9IHRydWUpOwotICB2b2lkIGdlbmVyYXRlX2NvcHlfY29uc3RydWN0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX21vdmVfY29uc3RydWN0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y3BldGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tb3ZlKTsKLSAgdm9pZCBnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX21vdmVfYXNzaWdubWVudF9vcGVyYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX21vdmUpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycyA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycyA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNwZWNpYWxpemVkID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyID0gZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1c2hfYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXgpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyID0gZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhcmdfcHJlZml4KTsKLSAgLyoKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX3ByZWZpeChzdGQ6OnN0cmluZyBucyk7Ci0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9vcGVuKHN0ZDo6c3RyaW5nIG5zKTsKLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Nsb3NlKHN0ZDo6c3RyaW5nIG5zKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiA9IGZhbHNlLCBib29sIGFyZyA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVfcGFyYW1zID0gdHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIGNvYl9mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmFtZV9wYXJhbXMgPSB0cnVlKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcyA9IHRydWUsIGJvb2wgc3RhcnRfY29tbWEgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLQotICB2b2lkIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChzdGQ6Om9mc3RyZWFtJiBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGNvbnN0YW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV92YWx1ZXMpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3Ioc3RkOjpvZnN0cmVhbSYgZiwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChzdGQ6Om9mc3RyZWFtJiBmLCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kX2RlY2woc3RkOjpvZnN0cmVhbSYgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4dGVybmFsID0gZmFsc2UpOwotCi0gIGJvb2wgaXNfcmVmZXJlbmNlKHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfcmVmZXJlbmNlKCk7IH0KLQotICBib29sIGlzX2NvbXBsZXhfdHlwZSh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLQotICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCi0gICAgICAgICAgIHx8ICh0dHlwZS0+aXNfYmFzZV90eXBlKCkKLSAgICAgICAgICAgICAgICYmICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSk7Ci0gIH0KLQotICB2b2lkIHNldF91c2VfaW5jbHVkZV9wcmVmaXgoYm9vbCB1c2VfaW5jbHVkZV9wcmVmaXgpIHsgdXNlX2luY2x1ZGVfcHJlZml4XyA9IHVzZV9pbmNsdWRlX3ByZWZpeDsgfQotCi1wcml2YXRlOgotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5jbHVkZSBwcmVmaXggdG8gdXNlIGZvciBhIGZpbGUgZ2VuZXJhdGVkIGJ5IHByb2dyYW0sIG9yIHRoZQotICAgKiBlbXB0eSBzdHJpbmcgaWYgbm8gaW5jbHVkZSBwcmVmaXggc2hvdWxkIGJlIHVzZWQuCi0gICAqLwotICBzdGQ6OnN0cmluZyBnZXRfaW5jbHVkZV9wcmVmaXgoY29uc3QgdF9wcm9ncmFtJiBwcm9ncmFtKSBjb25zdDsKLQotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgcHVyZSBlbnVtcyBmb3IgVGhyaWZ0IGVudW1zLCBpbnN0ZWFkIG9mIHdyYXBwZXIgY2xhc3Nlcy4KLSAgICovCi0gIGJvb2wgZ2VuX3B1cmVfZW51bXNfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuCi0gICAqLwotICBib29sIGdlbl90ZW1wbGF0ZXNfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgcHJvY2VzcyBmdW5jdGlvbiBwb2ludGVycyBmb3Igb25seSB0ZW1wbGF0aXplZAotICAgKiByZWFkZXIvd3JpdGVyIG1ldGhvZHMuCi0gICAqLwotICBib29sIGdlbl90ZW1wbGF0ZXNfb25seV87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIG1vdmUgY29uc3RydWN0b3JzICYgYXNzaWdubWVudCBvcGVyYXRvcnMuCi0gICAqLwotICBib29sIGdlbl9tb3ZlYWJsZV87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWZmIHdlIHNob3VsZCB1c2UgYSBwYXRoIHByZWZpeCBpbiBvdXIgI2luY2x1ZGUgc3RhdGVtZW50cyBmb3Igb3RoZXIKLSAgICogdGhyaWZ0LWdlbmVyYXRlZCBoZWFkZXIgZmlsZXMuCi0gICAqLwotICBib29sIHVzZV9pbmNsdWRlX3ByZWZpeF87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlICJDb250aW51YXRpb24gT0JqZWN0Ii1zdHlsZSBjbGFzc2VzIGFzIHdlbGwuCi0gICAqLwotICBib29sIGdlbl9jb2Jfc3R5bGVfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBvbWl0IGNhbGxzIHRvIGNvbXBsZXRpb25fXygpIGluIENvYkNsaWVudCBjbGFzcy4KLSAgICovCi0gIGJvb2wgZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgb21pdCBnZW5lcmF0aW5nIHRoZSBkZWZhdWx0IG9wZWFydG9ycyA9PSwgIT0gYW5kIDwuCi0gICAqLwotICBib29sIGdlbl9ub19kZWZhdWx0X29wZXJhdG9yc187Ci0KLSAgLyoqCi0gICAqIFN0cmluZ3MgZm9yIG5hbWVzcGFjZSwgY29tcHV0ZWQgb25jZSB1cCBmcm9udCB0aGVuIHVzZWQgZGlyZWN0bHkKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgbnNfb3Blbl87Ci0gIHN0ZDo6c3RyaW5nIG5zX2Nsb3NlXzsKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zLCBzdG9yZWQgaGVyZSB0byBhdm9pZCBwYXNzaW5nIHRoZW0gYXMgcGFyYW1ldGVycyB0byBldmVyeQotICAgKiBmdW5jdGlvbi4KLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2ltcGxfOwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfdGNjXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2hlYWRlcl87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfdGNjXzsKLQotICAvLyBUaGUgUHJvY2Vzc29yR2VuZXJhdG9yIGlzIHVzZWQgdG8gZ2VuZXJhdGUgcGFydHMgb2YgdGhlIGNvZGUsCi0gIC8vIHNvIGl0IG5lZWRzIGFjY2VzcyB0byBtYW55IG9mIG91ciBwcm90ZWN0ZWQgbWVtYmVycyBhbmQgbWV0aG9kcy4KLSAgLy8KLSAgLy8gVE9ETzogVGhlIGNvZGUgcmVhbGx5IHNob3VsZCBiZSBjbGVhbmVkIHVwIHNvIHRoYXQgaGVscGVyIG1ldGhvZHMgZm9yCi0gIC8vIHdyaXRpbmcgdG8gdGhlIG91dHB1dCBmaWxlcyBhcmUgc2VwYXJhdGUgZnJvbSB0aGUgZ2VuZXJhdG9yIGNsYXNzZXMKLSAgLy8gdGhlbXNlbHZlcy4KLSAgZnJpZW5kIGNsYXNzIFByb2Nlc3NvckdlbmVyYXRvcjsKLX07Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLmgiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl90eXBlc19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMuY3BwIjsKLSAgZl90eXBlc19pbXBsXy5vcGVuKGZfdHlwZXNfaW1wbF9uYW1lLmNfc3RyKCkpOwotCi0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIC8vIElmIHdlIGRvbid0IG9wZW4gdGhlIHN0cmVhbSwgaXQgYXBwZWFycyB0byBqdXN0IGRpc2NhcmQgZGF0YSwKLSAgICAvLyB3aGljaCBpcyBmaW5lLgotICAgIHN0cmluZyBmX3R5cGVzX3RjY19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLnRjYyI7Ci0gICAgZl90eXBlc190Y2NfLm9wZW4oZl90eXBlc190Y2NfbmFtZS5jX3N0cigpKTsKLSAgfQotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl90eXBlc19pbXBsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl90eXBlc190Y2NfIDw8IGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8vIFN0YXJ0IGlmbmRlZgotICBmX3R5cGVzXyA8PCAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXwotICAgICAgICAgICA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl90eXBlc190Y2NfIDw8ICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX1RZUEVTX1RDQyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHByb2dyYW1fbmFtZV8KLSAgICAgICAgICAgICAgIDw8ICJfVFlQRVNfVENDIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSBiYXNlIHR5cGVzCi0gIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSA8aW9zZndkPiIgPDwgZW5kbAotICAgICAgICAgICA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPiIgPDwgZW5kbAotICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaD4iIDw8IGVuZGwKLSAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+IiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+IiA8PCBlbmRsCi0gICAgICAgICAgIDw8IGVuZGw7Ci0gIC8vIEluY2x1ZGUgQysreHggY29tcGF0aWJpbGl0eSBoZWFkZXIKLSAgZl90eXBlc18gPDwgIiNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPiIgPDwgZW5kbDsKLQotICAvLyBJbmNsdWRlIG90aGVyIFRocmlmdCBpbmNsdWRlcwotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihpbmNsdWRlc1tpXSkpIDw8IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7Ci0KLSAgICAvLyBYWFgoc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAotICAgIC8vIGluY2x1ZGVkIGZpbGVzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KLSAgICBmX3R5cGVzX3RjY18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihpbmNsdWRlc1tpXSkpIDw8IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgIDw8ICJfdHlwZXMudGNjXCIiIDw8IGVuZGw7Ci0gIH0KLSAgZl90eXBlc18gPDwgZW5kbDsKLQotICAvLyBJbmNsdWRlIGN1c3RvbSBoZWFkZXJzCi0gIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjcHBfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2NwcF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNwcF9pbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIGlmIChjcHBfaW5jbHVkZXNbaV1bMF0gPT0gJzwnKSB7Ci0gICAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgIiA8PCBjcHBfaW5jbHVkZXNbaV0gPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBjcHBfaW5jbHVkZXNbaV0gPDwgIlwiIiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gIC8vIEluY2x1ZGUgdGhlIHR5cGVzIGZpbGUKLSAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXwotICAgICAgICAgICAgICAgIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfdHlwZXNfdGNjXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXwotICAgICAgICAgICAgICAgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBUaGUgc3dhcCgpIGNvZGUgbmVlZHMgPGFsZ29yaXRobT4gZm9yIHN0ZDo6c3dhcCgpCi0gIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIDxhbGdvcml0aG0+IiA8PCBlbmRsOwotICAvLyBmb3Igb3BlcmF0b3I8PAotICBmX3R5cGVzX2ltcGxfIDw8ICIjaW5jbHVkZSA8b3N0cmVhbT4iIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBPcGVuIG5hbWVzcGFjZQotICBuc19vcGVuXyA9IG5hbWVzcGFjZV9vcGVuKHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7Ci0gIG5zX2Nsb3NlXyA9IG5hbWVzcGFjZV9jbG9zZShwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOwotCi0gIGZfdHlwZXNfIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3R5cGVzX2ltcGxfIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3R5cGVzX3RjY18gPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgb3V0cHV0IGZpbGVzLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSBuYW1lc3BhY2UKLSAgZl90eXBlc18gPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCBuc19jbG9zZV8gPDwgZW5kbDsKLSAgZl90eXBlc190Y2NfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSB0aGUgdHlwZXMudGNjIGZpbGUgZnJvbSB0aGUgdHlwZXMgaGVhZGVyIGZpbGUsCi0gIC8vIHNvIGNsaWVudHMgZG9uJ3QgaGF2ZSB0byBleHBsaWNpdGx5IGluY2x1ZGUgdGhlIHRjYyBmaWxlLgotICAvLyBUT0RPKHNpbXBraW5zKTogTWFrZSB0aGlzIGEgc2VwYXJhdGUgb3B0aW9uLgotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXwotICAgICAgICAgICAgIDw8ICJfdHlwZXMudGNjXCIiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIENsb3NlIGlmbmRlZgotICBmX3R5cGVzXyA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICBmX3R5cGVzX3RjY18gPDwgIiNlbmRpZiIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBvdXRwdXQgZmlsZQotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX3R5cGVzX2ltcGxfLmNsb3NlKCk7Ci0gIGZfdHlwZXNfdGNjXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIEMrKwotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCksIHRydWUpIDw8ICIgIgotICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChzdGQ6Om9mc3RyZWFtJiBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGNvbnN0YW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV92YWx1ZXMpIHsKLSAgZiA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGYgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChmKSA8PCBwcmVmaXggPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IHN1ZmZpeDsKLSAgICBpZiAoaW5jbHVkZV92YWx1ZXMpIHsKLSAgICAgIGYgPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9Ci0gIH0KLQotICBmIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmKSA8PCAifTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gQysrLCB0aGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lCi0gKiBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCB1c2luZyB0aGUgZW51bSBrZXl3b3JkIGluIEMrKy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0KLSAgc3RkOjpzdHJpbmcgZW51bV9uYW1lID0gdGVudW0tPmdldF9uYW1lKCk7Ci0gIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7Ci0gICAgZW51bV9uYW1lID0gInR5cGUiOwotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJzdHJ1Y3QgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLSAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImVudW0gIiA8PCBlbnVtX25hbWU7Ci0KLSAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfLCBjb25zdGFudHMsICIiLCAiIiwgdHJ1ZSk7Ci0KLSAgaWYgKCFnZW5fcHVyZV9lbnVtc18pIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfdHlwZXNfIDw8ICJ9OyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfdHlwZXNfIDw8IGVuZGw7Ci0KLSAgLyoqCi0gICAgIEdlbmVyYXRlIGEgY2hhcmFjdGVyIGFycmF5IG9mIGVudW0gbmFtZXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KLSAgKi8KLSAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7Ci0gICAgcHJlZml4ID0gdGVudW0tPmdldF9uYW1lKCkgKyAiOjoiOwotICB9Ci0KLSAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaW50IF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiVmFsdWVzW10gPSI7Ci0gIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChmX3R5cGVzX2ltcGxfLCBjb25zdGFudHMsIHByZWZpeC5jX3N0cigpLCAiIiwgZmFsc2UpOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0IGNoYXIqIF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiTmFtZXNbXSA9IjsKLSAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfaW1wbF8sIGNvbnN0YW50cywgIlwiIiwgIlwiIiwgZmFsc2UpOwotCi0gIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJleHRlcm4gY29uc3Qgc3RkOjptYXA8aW50LCBjb25zdCBjaGFyKj4gXyIgPDwgdGVudW0tPmdldF9uYW1lKCkKLSAgICAgICAgICAgPDwgIl9WQUxVRVNfVE9fTkFNRVM7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY29uc3Qgc3RkOjptYXA8aW50LCBjb25zdCBjaGFyKj4gXyIgPDwgdGVudW0tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICA8PCAiX1ZBTFVFU19UT19OQU1FUyg6OmFwYWNoZTo6dGhyaWZ0OjpURW51bUl0ZXJhdG9yKCIgPDwgY29uc3RhbnRzLnNpemUoKSA8PCAiLCBfayIKLSAgICAgICAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiVmFsdWVzIgotICAgICAgICAgICAgICAgIDw8ICIsIF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiTmFtZXMpLCAiCi0gICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRFbnVtSXRlcmF0b3IoLTEsIE5VTEwsIE5VTEwpKTsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RhbnRzLmgiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2NvbnN0c19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RhbnRzLmNwcCI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzX2ltcGw7Ci0gIGZfY29uc3RzX2ltcGwub3BlbihmX2NvbnN0c19pbXBsX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpOwotICBmX2NvbnN0c19pbXBsIDw8IGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8vIFN0YXJ0IGlmbmRlZgotICBmX2NvbnN0cyA8PCAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9DT05TVEFOVFNfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHByb2dyYW1fbmFtZV8KLSAgICAgICAgICAgPDwgIl9DT05TVEFOVFNfSCIgPDwgZW5kbCA8PCBlbmRsIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKQotICAgICAgICAgICA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfY29uc3RzX2ltcGwgPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KLSAgICAgICAgICAgICAgICA8PCAiX2NvbnN0YW50cy5oXCIiIDw8IGVuZGwgPDwgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9jb25zdHMgPDwgImNsYXNzICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsIDw8ICIgICIKLSAgICAgICAgICAgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGZfY29uc3RzIDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX2NvbnN0cyA8PCAifTsiIDw8IGVuZGw7Ci0KLSAgZl9jb25zdHNfaW1wbCA8PCAiY29uc3QgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgZ18iIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9jb25zdGFudHM7IgotICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHM6OiIgPDwgcHJvZ3JhbV9uYW1lXwotICAgICAgICAgICAgICAgIDw8ICJDb25zdGFudHMoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0c19pbXBsLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfY29uc3RzX2ltcGwpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGZfY29uc3RzIDw8IGVuZGwgPDwgImV4dGVybiBjb25zdCAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyBnXyIgPDwgcHJvZ3JhbV9uYW1lXwotICAgICAgICAgICA8PCAiX2NvbnN0YW50czsiIDw8IGVuZGwgPDwgZW5kbCA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsIDw8ICIjZW5kaWYiIDw8IGVuZGw7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci0KLSAgZl9jb25zdHNfaW1wbCA8PCBlbmRsIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBib29sIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gZmFsc2U7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBpc19ub25yZXF1aXJlZF9maWVsZCA9IGZhbHNlOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICAgIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpZiAoaXNfbm9ucmVxdWlyZWRfZmllbGQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLl9faXNzZXQuIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHVzaF9iYWNrKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBwcmludF9jb25zdF92YWx1ZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLX0KLQotLyoqCi0gKgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgKHZvaWQpbmFtZTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMTCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgdCA8PCAiOyIgPDwgZW5kbDsKLSAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIEZvcndhcmQgZGVjbGFyZSBzdHJ1Y3QgZGVmCi0gIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKLSAqIHdpdGggZGF0YSBtZW1iZXJzIGFuZCBhIHJlYWQvd3JpdGUoKSBmdW5jdGlvbiwgcGx1cyBhIG1pcnJvcmluZyBpc3NldAotICogaW5uZXIgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jcHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWUpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzX2ltcGxfLCBmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKLQotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3R5cGVzX3RjY18gOiBmX3R5cGVzX2ltcGxfKTsKLSAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9zd2FwKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9jb3B5X2NvbnN0cnVjdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIGlmIChnZW5fbW92ZWFibGVfKSB7Ci0gICAgZ2VuZXJhdGVfbW92ZV9jb25zdHJ1Y3RvcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICB9Ci0gIGdlbmVyYXRlX2Fzc2lnbm1lbnRfb3BlcmF0b3IoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7Ci0gIGlmIChnZW5fbW92ZWFibGVfKSB7Ci0gICAgZ2VuZXJhdGVfbW92ZV9hc3NpZ25tZW50X29wZXJhdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOwotICB9Ci0gIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2QoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2QoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7Ci0gIH0KLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvcHlfY29uc3RydWN0b3Iob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfY29uc3RydWN0b3JfaGVscGVyKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCAvKmlzX21vdmU9Ki9mYWxzZSk7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9tb3ZlX2NvbnN0cnVjdG9yKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgLyppc19tb3ZlPSovdHJ1ZSk7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0vLyBIZWxwZXIgdG8gY29udmVydCBhIHZhcmlhYmxlIHRvIHJ2YWx1ZSwgaWYgbW92ZSBpcyBlbmFibGVkCi1zdGQ6OnN0cmluZyBtYXliZU1vdmUoc3RkOjpzdHJpbmcgY29uc3QmIG90aGVyLCBib29sIG1vdmUpIHsKLSAgaWYgKG1vdmUpIHsKLSAgICByZXR1cm4gInN0ZDo6bW92ZSgiICsgb3RoZXIgKyAiKSI7Ci0gIH0KLSAgcmV0dXJuIG90aGVyOwotfQotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RydWN0b3JfaGVscGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tb3ZlKSB7Ci0KLSAgc3RkOjpzdHJpbmcgdG1wX25hbWUgPSB0bXAoIm90aGVyIik7Ci0KLSAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjoiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKGlzX21vdmUpIHsKLSAgICBvdXQgPDwgIiggIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImJiAiOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiAiOwotICB9Ci0gIG91dCA8PCB0bXBfbmFtZSA8PCAiKSAiOwotICBpZiAoaXNfZXhjZXB0aW9uKQotICAgIG91dCA8PCAiOiBURXhjZXB0aW9uKCkgIjsKLSAgb3V0IDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAvLyBlbGltaW5hdGUgY29tcGlsZXIgdW51c2VkIHdhcm5pbmcKLSAgaWYgKG1lbWJlcnMuZW1wdHkoKSkKLSAgICBpbmRlbnQob3V0KSA8PCAiKHZvaWQpICIgPDwgdG1wX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKLSAgZm9yIChmX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGZfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQotICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7Ci0gICAgaW5kZW50KG91dCkgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgPDwgbWF5YmVNb3ZlKHRtcF9uYW1lICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQgPSAiIDw8IG1heWJlTW92ZSh0bXBfbmFtZSArICIuX19pc3NldCIsIGlzX21vdmUpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2Fzc2lnbm1lbnRfaGVscGVyKG91dCwgdHN0cnVjdCwgLyppc19tb3ZlPSovZmFsc2UpOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbW92ZV9hc3NpZ25tZW50X29wZXJhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2Fzc2lnbm1lbnRfaGVscGVyKG91dCwgdHN0cnVjdCwgLyppc19tb3ZlPSovdHJ1ZSk7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19tb3ZlKSB7Ci0gIHN0ZDo6c3RyaW5nIHRtcF9uYW1lID0gdG1wKCJvdGhlciIpOwotCi0gIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6Om9wZXJhdG9yPSgiOwotCi0gIGlmIChpc19tb3ZlKSB7Ci0gICAgb3V0IDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYmICI7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgIjsKLSAgfQotICBvdXQgPDwgdG1wX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAvLyBlbGltaW5hdGUgY29tcGlsZXIgdW51c2VkIHdhcm5pbmcKLSAgaWYgKG1lbWJlcnMuZW1wdHkoKSkKLSAgICBpbmRlbnQob3V0KSA8PCAiKHZvaWQpICIgPDwgdG1wX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKLSAgZm9yIChmX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGZfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQotICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7Ci0gICAgaW5kZW50KG91dCkgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgPDwgbWF5YmVNb3ZlKHRtcF9uYW1lICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcykgewotICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0ID0gIiA8PCBtYXliZU1vdmUodG1wX25hbWUgKyAiLl9faXNzZXQiLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKnRoaXM7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZXMgdGhlIHN0cnVjdCBkZWNsYXJhdGlvbiBpbnRvIHRoZSBoZWFkZXIgZmlsZQotICoKLSAqIEBwYXJhbSBvdXQgT3V0cHV0IHN0cmVhbQotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN3YXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBleHRlbmRzID0gIiA6IHB1YmxpYyA6OmFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIjsKLSAgfQotCi0gIC8vIEdldCBtZW1iZXJzCi0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgLy8gV3JpdGUgdGhlIGlzc2V0IHN0cnVjdHVyZSBkZWNsYXJhdGlvbiBvdXRzaWRlIHRoZSBjbGFzcy4gVGhpcyBtYWtlcwotICAvLyB0aGUgZ2VuZXJhdGVkIGNvZGUgYW1lbmFibGUgdG8gcHJvY2Vzc2luZyBieSBTV0lHLgotICAvLyBXZSBvbmx5IGRlY2xhcmUgdGhlIHN0cnVjdCBpZiBpdCBnZXRzIHVzZWQgaW4gdGhlIGNsYXNzLgotCi0gIC8vIElzc2V0IHN0cnVjdCBoYXMgYm9vbGVhbiBmaWVsZHMsIGJ1dCBvbmx5IGZvciBub24tcmVxdWlyZWQgZmllbGRzLgotICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQotICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7Ci0gIH0KLQotICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyAmJiAoIXBvaW50ZXJzIHx8IHJlYWQpKSB7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0KCkgIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyBpc1NldCA9ICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpID8gInRydWUiIDogImZhbHNlIjsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBvdXQgPDwgIjogIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGlzU2V0IDw8ICIpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgaXNTZXQgPDwgIikiOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIiB7fSIgPDwgZW5kbDsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJib29sICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgOjE7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0gXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldDsiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICAvLyBPcGVuIHN0cnVjdCBkZWYKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgcHVibGljOiIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoIXBvaW50ZXJzKSB7Ci0gICAgLy8gQ29weSBjb25zdHJ1Y3RvcgotICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYpOyIgPDwgZW5kbDsKLQotICAgIC8vIE1vdmUgY29uc3RydWN0b3IKLSAgICBpZiAoZ2VuX21vdmVhYmxlXykgewotICAgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiYpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBBc3NpZ25tZW50IE9wZXJhdG9yCi0gICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiBvcGVyYXRvcj0oY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgIC8vIE1vdmUgYXNzaWdubWVudCBvcGVyYXRvcgotICAgIGlmIChnZW5fbW92ZWFibGVfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImIG9wZXJhdG9yPSgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYmKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIjsKLQotICAgIGJvb2wgaW5pdF9jdG9yID0gZmFsc2U7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkgfHwgdC0+aXNfZW51bSgpIHx8IGlzX3JlZmVyZW5jZSgqbV9pdGVyKSkgewotICAgICAgICBzdHJpbmcgZHZhbDsKLSAgICAgICAgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgICAgIGR2YWwgKz0gIigiICsgdHlwZV9uYW1lKHQpICsgIikiOwotICAgICAgICB9Ci0gICAgICAgIGR2YWwgKz0gKHQtPmlzX3N0cmluZygpIHx8IGlzX3JlZmVyZW5jZSgqbV9pdGVyKSkgPyAiIiA6ICIwIjsKLSAgICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOwotICAgICAgICBpZiAoY3YgIT0gTlVMTCkgewotICAgICAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCAoKm1faXRlciktPmdldF9uYW1lKCksIHQsIGN2KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWluaXRfY3RvcikgewotICAgICAgICAgIGluaXRfY3RvciA9IHRydWU7Ci0gICAgICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGR2YWwgPDwgIikiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZHZhbCA8PCAiKSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IFdoZW4gZXZlcnl0aGluZyBlbHNlIGluIFRocmlmdCBpcyBwZXJmZWN0LAotICAgIC8vIGRvIG1vcmUgb2YgdGhlc2UgaW4gdGhlIGluaXRpYWxpemVyIGxpc3QuCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotCi0gICAgICBpZiAoIXQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKLSAgICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgY3YpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIGlmICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSA9PSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKLSAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSB0aHJvdygpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIERlY2xhcmUgYWxsIGZpZWxkcwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnRlcnMgJiYgISgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcmVhZCkgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEFkZCB0aGUgX19pc3NldCBkYXRhIG1lbWJlciBpZiB3ZSBuZWVkIGl0LCB1c2luZyB0aGUgZGVmaW5pdGlvbiBmcm9tIGFib3ZlCi0gIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzICYmICghcG9pbnRlcnMgfHwgcmVhZCkpIHsKLSAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCBfX2lzc2V0OyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIENyZWF0ZSBhIHNldHRlciBmdW5jdGlvbiBmb3IgZWFjaCBmaWVsZAotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKHBvaW50ZXJzKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGlzX3JlZmVyZW5jZSgoKm1faXRlcikpKSB7Ci0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCBfX3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKGJvb3N0OjpzaGFyZWRfcHRyPCIKLSAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICI+IjsKLSAgICAgIG91dCA8PCAiIHZhbCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCBfX3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIKLSAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBvdXQgPDwgIiB2YWwpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaWYgKCFwb2ludGVycykgewotICAgIC8vIFNob3VsZCB3ZSBnZW5lcmF0ZSBkZWZhdWx0IG9wZXJhdG9ycz8KLSAgICBpZiAoIWdlbl9ub19kZWZhdWx0X29wZXJhdG9yc18pIHsKLSAgICAgIC8vIEdlbmVyYXRlIGFuIGVxdWFsaXR5IHRlc3Rpbmcgb3BlcmF0b3IuICBNYWtlIGl0IGlubGluZSBzaW5jZSB0aGUgY29tcGlsZXIKLSAgICAgIC8vIHdpbGwgZG8gYSBiZXR0ZXIgam9iIHRoYW4gd2Ugd291bGQgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGlubGluZSBpdC4KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJiAiCi0gICAgICAgICAgPDwgKG1lbWJlcnMuc2l6ZSgpID4gMCA/ICJyaHMiIDogIi8qIHJocyAqLyIpIDw8ICIpIGNvbnN0IiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCi0gICAgICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCi0gICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISgiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IHJocy4iCi0gICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gcmhzLl9faXNzZXQuIgotICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAotICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZWxzZSBpZiAoX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICYmICEoIgotICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSByaHMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikpIiA8PCBlbmRsCi0gICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZyaHMpIGNvbnN0IHsiCi0gICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gISgqdGhpcyA9PSByaHMpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAotICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICAgIC8vIEdlbmVyYXRlIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGxlc3MtdGhhbiBvcGVyYXRvci4gIFRoaXMgbXVzdCBiZQotICAgICAgLy8gaW1wbGVtZW50ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciBpZiB0aGV5IHdpc2ggdG8gdXNlIGl0LiAgKFRoZXkKLSAgICAgIC8vIHdpbGwgZ2V0IGEgbGluayBlcnJvciBpZiB0aGV5IHRyeSB0byB1c2UgaXQgd2l0aG91dCBhbiBpbXBsZW1lbnRhdGlvbi4pCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgPCAoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJiApIGNvbnN0OyIgPDwgZW5kbAotICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHJlYWQpIHsKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAidWludDMyX3QgcmVhZChQcm90b2NvbF8qIGlwcm90KTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgcmVhZCgiCi0gICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGlmICh3cml0ZSkgewotICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICJ1aW50MzJfdCB3cml0ZShQcm90b2NvbF8qIG9wcm90KSBjb25zdDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3Qgd3JpdGUoIgotICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3Q7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICBpZiAoc3RyZWFtKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICI7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZF9kZWNsKG91dCwgTlVMTCk7Ci0gICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gc3RkOjpleGNlcHRpb246OndoYXQoKQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJtdXRhYmxlIHN0ZDo6c3RyaW5nIHRocmlmdFRFeGNlcHRpb25NZXNzYWdlSG9sZGVyXzsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpOwotICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKG91dCwgdHN0cnVjdCwgZmFsc2UpOwotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGlmIChzd2FwKSB7Ci0gICAgLy8gR2VuZXJhdGUgYSBuYW1lc3BhY2Utc2NvcGUgc3dhcCgpIGZ1bmN0aW9uCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkIHN3YXAoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJmEsICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgICA8PCAiICZiKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChzdHJlYW0pIHsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mc3RyZWFtJiBmb3JjZV9jcHBfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0dGVycykgewotICAvLyBHZXQgbWVtYmVycwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIC8vIERlc3RydWN0b3IKLSAgaWYgKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpID09IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSkgewotICAgIGZvcmNlX2NwcF9vdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6On4iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICIoKSB0aHJvdygpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZvcmNlX2NwcF9vdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIENyZWF0ZSBhIHNldHRlciBmdW5jdGlvbiBmb3IgZWFjaCBmaWVsZAotICBpZiAoc2V0dGVycykgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmIChpc19yZWZlcmVuY2UoKCptX2l0ZXIpKSkgewotICAgICAgICBzdGQ6OnN0cmluZyB0eXBlID0gdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjpfX3NldF8iCi0gICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIihib29zdDo6c2hhcmVkX3B0cjwiCi0gICAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICI+IjsKLSAgICAgICAgb3V0IDw8ICIgdmFsKSB7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6Ol9fc2V0XyIKLSAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpOwotICAgICAgICBvdXQgPDwgIiB2YWwpIHsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHZhbDsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotCi0gICAgICAvLyBhc3N1bWUgYWxsIGZpZWxkcyBhcmUgcmVxdWlyZWQgZXhjZXB0IG9wdGlvbmFsIGZpZWxkcy4KLSAgICAgIC8vIGZvciBvcHRpb25hbCBmaWVsZHMgY2hhbmdlIF9faXNzZXQubmFtZSB0byB0cnVlCi0gICAgICBib29sIGlzX29wdGlvbmFsID0gKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICAgIGlmIChpc19vcHRpb25hbCkgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgIl9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBNYWtlcyBhIGhlbHBlciBmdW5jdGlvbiB0byBnZW4gYSBzdHJ1Y3QgcmVhZGVyLgotICoKLSAqIEBwYXJhbSBvdXQgU3RyZWFtIHRvIHdyaXRlIHRvCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0Ci0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzKSB7Ci0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIKLSAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjpyZWFkKFByb3RvY29sXyogaXByb3QpIHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgIDw8ICI6OnJlYWQoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpIHsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcwotICBvdXQgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgImFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VElucHV0UmVjdXJzaW9uVHJhY2tlciB0cmFja2VyKCppcHJvdCk7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAic3RkOjpzdHJpbmcgZm5hbWU7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgImludDE2X3QgZmlkOyIgPDwgZW5kbAotICAgICAgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RCZWdpbihmbmFtZSk7IiA8PCBlbmRsCi0gICAgICA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAidXNpbmcgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbjsiIDw8IGVuZGwKLSAgICAgIDw8IGVuZGw7Ci0KLSAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0uCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCi0gICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZEZpZWxkQmVnaW4oZm5hbWUsIGZ0eXBlLCBmaWQpOyIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZnR5cGUgPT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuZW1wdHkoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmlkKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgY29uc3QgY2hhciogaXNzZXRfcHJlZml4ID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpID8gInRoaXMtPl9faXNzZXQuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImlzc2V0XyI7Ci0KLSNpZiAwCi0gICAgICAgICAgLy8gVGhpcyBjb2RlIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgZmllbGQgaXMgZW5jb3VudGVyZWQgdHdpY2UuCi0gICAgICAgICAgLy8gV2UndmUgZGVjaWRlZCB0byBsZWF2ZSBpdCBvdXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCi0gICAgICAgICAgLy8gVE9ETyhkcmVpc3MpOiBHZW5lcmF0ZSB0aGlzIGNvZGUgYW5kICJpZiIgaXQgb3V0IHRvIG1ha2UgaXQgZWFzaWVyCi0gICAgICAgICAgLy8gZm9yIHBlb3BsZSByZWNvbXBpbGluZyB0aHJpZnQgdG8gaW5jbHVkZSBpdC4KLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCBpc3NldF9wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgICBpZiAocG9pbnRlcnMgJiYgISgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgICAgfQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGlzc2V0X3ByZWZpeCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsCi0gICAgICAgICAgPDwKLSAgICAgICAgICAvLyBUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyBhbiBvcHRpb24gd2hlbiB0aHJpZnQgc3RydWN0cwotICAgICAgICAgIC8vIGhhdmUgYSBjb21tb24gYmFzZSBjbGFzcy4KLSAgICAgICAgICAvLyBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0gLy8hZmllbGRzLmVtcHR5KCkKLSAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIC8vIFRocm93IGlmIGFueSByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcuCi0gIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgcmVhZGluZyB0aGUgc3RydWN0IGVuZCBzbyB0aGF0Ci0gIC8vIHRoZXJlIG1pZ2h0IHBvc3NpYmx5IGJlIGEgY2hhbmNlIG9mIGNvbnRpbnVpbmcuCi0gIG91dCA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICcpJyA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSB3cml0ZSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bwotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycykgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgIgotICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OndyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgIDw8ICI6OndyaXRlKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRPdXRwdXRSZWN1cnNpb25UcmFja2VyIHRyYWNrZXIoKm9wcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBjaGVja19pZl9zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoKmZfaXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCk7Ci0gICAgaWYgKGNoZWNrX2lmX3NldCkgewotICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5fX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIgotICAgICAgICA8PCAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBpZiAocG9pbnRlcnMgJiYgISgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIigqKHRoaXMtPiIsICIpKSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7Ci0gICAgfQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICAgIGlmIChjaGVja19pZl9zZXQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAnfSc7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU3RydWN0IHdyaXRlciBmb3IgcmVzdWx0IG9mIGEgZnVuY3Rpb24sIHdoaWNoIGNhbiBoYXZlIG9ubHkgb25lIG9mIGl0cwotICogZmllbGRzIHNldCBhbmQgZG9lcyBhIGNvbmRpdGlvbmFsIGlmIGVsc2UgbG9vayB1cCBpbnRvIHRoZSBfX2lzc2V0IGZpZWxkCi0gKiBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSBvdXQgT3V0cHV0IHN0cmVhbQotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHJlc3VsdCBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycykgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgIgotICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OndyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgIDw8ICI6OndyaXRlKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCB4ZmVyID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOwotICAgIH0KLQotICAgIG91dCA8PCAiKHRoaXMtPl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIgotICAgICAgICA8PCAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBpZiAocG9pbnRlcnMpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgIH0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgc3dhcCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bwotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3N3YXAob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkIHN3YXAoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJmEsICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgPDwgIiAmYikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gTGV0IGFyZ3VtZW50LWRlcGVuZGVudCBuYW1lIGxvb2t1cCBmaW5kIHRoZSBjb3JyZWN0IHN3YXAoKSBmdW5jdGlvbiB0bwotICAvLyB1c2UgYmFzZWQgb24gdGhlIGFyZ3VtZW50IHR5cGVzLiAgSWYgbm9uZSBpcyBmb3VuZCBpbiB0aGUgYXJndW1lbnRzJwotICAvLyBuYW1lc3BhY2VzLCBmYWxsIGJhY2sgdG8gOjpzdGQ6OnN3YXAoKS4KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ1c2luZyA6OnN0ZDo6c3dhcDsiIDw8IGVuZGw7Ci0KLSAgYm9vbCBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gZmFsc2U7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogdGZpZWxkID0gKmZfaXRlcjsKLQotICAgIGlmICh0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN3YXAoYS4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBiLiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIKLSAgICAgICAgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJzd2FwKGEuX19pc3NldCwgYi5fX2lzc2V0KTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBoYW5kbGUgZW1wdHkgc3RydWN0cwotICBpZiAoZmllbGRzLnNpemUoKSA9PSAwKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgYTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgYjsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgImlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0ICIKLSAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgIDw8ICImIG9iaikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAib2JqLnByaW50VG8ob3V0KTsiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gb3V0OyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCAidm9pZCAiOwotICBpZiAodHN0cnVjdCkgewotICAgIG91dCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OiI7Ci0gIH0KLSAgb3V0IDw8ICJwcmludFRvKHN0ZDo6b3N0cmVhbSYgb3V0KSBjb25zdCI7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRlcm5hbCkgewotICBvdXQgPDwgImNvbnN0IGNoYXIqICI7Ci0gIGlmIChleHRlcm5hbCkgewotICAgIG91dCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OiI7Ci0gIH0KLSAgb3V0IDw8ICJ3aGF0KCkgY29uc3QgdGhyb3coKSI7Ci19Ci0KLW5hbWVzcGFjZSBzdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9nZW5lcmF0b3Igewotdm9pZCBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7Ci0gIG91dCA8PCAiIDw8IHRvX3N0cmluZygiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpIjsKLX0KLQotdm9pZCBnZW5lcmF0ZV9vcHRpb25hbF9maWVsZF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7Ci0gIG91dCA8PCAiOyAoX19pc3NldC4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPyAob3V0IjsKLSAgZ2VuZXJhdGVfcmVxdWlyZWRfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7Ci0gIG91dCA8PCAiKSA6IChvdXQgPDwgXCI8bnVsbD5cIikpIjsKLX0KLQotdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpCi0gICAgZ2VuZXJhdGVfb3B0aW9uYWxfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7Ci0gIGVsc2UKLSAgICBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKLX0KLQotdm9pZCBnZW5lcmF0ZV9maWVsZF9uYW1lKHN0ZDo6b2ZzdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKLSAgb3V0IDw8ICJcIiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIj1cIiI7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgewotICBnZW5lcmF0ZV9maWVsZF9uYW1lKG91dCwgZmllbGQpOwotICBnZW5lcmF0ZV9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKLX0KLQotdm9pZCBnZW5lcmF0ZV9maWVsZHMoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluZGVudCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBiZWcgPSBmaWVsZHMuYmVnaW4oKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gZmllbGRzLmVuZCgpOwotCi0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBiZWc7IGl0ICE9IGVuZDsgKytpdCkgewotICAgIG91dCA8PCBpbmRlbnQgPDwgIm91dCA8PCAiOwotCi0gICAgaWYgKGl0ICE9IGJlZykgewotICAgICAgb3V0IDw8ICJcIiwgXCIgPDwgIjsKLSAgICB9Ci0KLSAgICBnZW5lcmF0ZV9maWVsZChvdXQsICppdCk7Ci0gICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICB9Ci19Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIG9wZXJhdG9yPDwKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgIiB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAidXNpbmcgOjphcGFjaGU6OnRocmlmdDo6dG9fc3RyaW5nOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXQgPDwgXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIjsiIDw8IGVuZGw7Ci0gIHN0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRzKG91dCwgdHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgaW5kZW50KCkpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dCA8PCBcIilcIjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHdoYXQoKSBtZXRob2QgZm9yIGV4Y2VwdGlvbnMKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKTsKLSAgZ2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kX2RlY2wob3V0LCB0c3RydWN0LCB0cnVlKTsKLSAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZ3N0cmVhbSBzczsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAic3MgPDwgXCJURXhjZXB0aW9uIC0gc2VydmljZSBoYXMgdGhyb3duOiBcIiA8PCAqdGhpczsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy0+dGhyaWZ0VEV4Y2VwdGlvbk1lc3NhZ2VIb2xkZXJfID0gc3Muc3RyKCk7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLT50aHJpZnRURXhjZXB0aW9uTWVzc2FnZUhvbGRlcl8uY19zdHIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYpIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFwiVEV4Y2VwdGlvbiAtIHNlcnZpY2UgaGFzIHRocm93bjogIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIjsiCi0gICAgICA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQotICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCi0gKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCi0gKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlcwotICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIi5oIjsKLSAgZl9oZWFkZXJfLm9wZW4oZl9oZWFkZXJfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIgZmlsZSBpbmNsdWRlcwotICBmX2hlYWRlcl8gPDwgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfaGVhZGVyXyA8PCAiI2lmbmRlZiAiIDw8IHN2Y25hbWUgPDwgIl9IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgc3ZjbmFtZSA8PCAiX0giIDw8IGVuZGwKLSAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGlmIChnZW5fY29iX3N0eWxlXykgewotICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4iIDw8IGVuZGwgPDwgLy8gVE1lbW9yeUJ1ZmZlcgotICAgICAgICAiI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+IiA8PCBlbmRsCi0gICAgICAgICAgICAgIDw8ICJuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgIDw8ICJjbGFzcyBUQXN5bmNDaGFubmVsOyIgPDwgZW5kbCA8PCAifX19IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaD4iIDw8IGVuZGw7Ci0gIGlmIChnZW5fY29iX3N0eWxlXykgewotICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNEaXNwYXRjaFByb2Nlc3Nvci5oPiIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oPiIgPDwgZW5kbDsKLSAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXMuaFwiIgotICAgICAgICAgICAgPDwgZW5kbDsKLQotICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zZXJ2aWNlICE9IE5VTEwpIHsKLSAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihleHRlbmRzX3NlcnZpY2UtPmdldF9wcm9ncmFtKCkpKQotICAgICAgICAgICAgICA8PCBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkgPDwgIi5oXCIiIDw8IGVuZGw7Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNpZmRlZiBfV0lOMzJcbiIKLSAgICAiICAjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKVxuIgotICAgICIgICNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQyNTAgKSAvL2luaGVyaXRpbmcgbWV0aG9kcyB2aWEgZG9taW5hbmNlIFxuIgotICAgICIjZW5kaWZcblxuIjsKLQotICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiLmNwcCI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLSAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl9zZXJ2aWNlXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbDsKLSAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiI2luY2x1ZGUgXCJ0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oXCIiIDw8IGVuZGw7Ci0gIH0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLnRjY1wiIgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgIHN0cmluZyBmX3NlcnZpY2VfdGNjX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICIudGNjIjsKLSAgICBmX3NlcnZpY2VfdGNjXy5vcGVuKGZfc2VydmljZV90Y2NfbmFtZS5jX3N0cigpKTsKLSAgICBmX3NlcnZpY2VfdGNjXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgICBmX3NlcnZpY2VfdGNjXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlX3RjY18gPDwgIiNpZm5kZWYgIiA8PCBzdmNuYW1lIDw8ICJfVENDIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgc3ZjbmFtZSA8PCAiX1RDQyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICAgIGZfc2VydmljZV90Y2NfIDw8ICIjaW5jbHVkZSBcInRocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmhcIiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOwotICBmX3NlcnZpY2VfdGNjXyA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBhbGwgdGhlIGNvbXBvbmVudHMKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICIiKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0c2VydmljZSwgIiIpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodHNlcnZpY2UsICIiKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UsICIiKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UsICIiKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NrZWxldG9uKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UsICJDb25jdXJyZW50Iik7Ci0KLSAgLy8gR2VuZXJhdGUgYWxsIHRoZSBjb2IgY29tcG9uZW50cwotICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSwgIkNvYkNsIik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICJDb2JTdiIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlX2ZhY3RvcnkodHNlcnZpY2UsICJDb2JTdiIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0c2VydmljZSwgIkNvYlN2Iik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UsICJDb2IiKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSwgIkNvYiIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2tlbGV0b24odHNlcnZpY2UpOwotICB9Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNpZmRlZiBfV0lOMzJcbiIKLSAgICAiICAjcHJhZ21hIHdhcm5pbmcoIHBvcCApXG4iCi0gICAgIiNlbmRpZlxuXG4iOwotCi0gIC8vIENsb3NlIHRoZSBuYW1lc3BhY2UKLSAgZl9zZXJ2aWNlXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOwotICBmX3NlcnZpY2VfdGNjXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOwotICBmX2hlYWRlcl8gPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBUT0RPKHNpbXBraW5zKTogTWFrZSB0aGlzIGEgc2VwYXJhdGUgb3B0aW9uCi0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLnRjY1wiIiA8PCBlbmRsCi0gICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfCi0gICAgICAgICAgICAgIDw8ICJfdHlwZXMudGNjXCIiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGZfaGVhZGVyXyA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICBmX3NlcnZpY2VfdGNjXyA8PCAiI2VuZGlmIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIHRoZSBmaWxlcwotICBmX3NlcnZpY2VfdGNjXy5jbG9zZSgpOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIGZfaGVhZGVyXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuIEJhc2ljYWxseSwgdGhpcyBnZW5lcmF0ZXMgdHlwZXMKLSAqIGZvciBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgcmVzdWx0cyB0byBmdW5jdGlvbnMuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBzdHJpbmcgbmFtZV9vcmlnID0gdHMtPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBUT0RPKGRyZWlzcyk6IFdoeSBpcyB0aGlzIHN0dWZmIG5vdCBpbiBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzPwotICAgIHRzLT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOwotICAgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX2hlYWRlcl8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3V0LCBmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCB0cyk7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsIHRzKTsKLSAgICB0cy0+c2V0X25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3BhcmdzIik7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfaGVhZGVyXywgdHMsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3V0LCBmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCB0cywgdHJ1ZSk7Ci0gICAgdHMtPnNldF9uYW1lKG5hbWVfb3JpZyk7Ci0KLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKLQotICBzdHJpbmcgc2VydmljZV9pZl9uYW1lID0gc2VydmljZV9uYW1lXyArIHN0eWxlICsgIklmIjsKLSAgaWYgKHN0eWxlID09ICJDb2JDbCIpIHsKLSAgICAvLyBGb3J3YXJkIGRlY2xhcmUgdGhlIGNsaWVudC4KLSAgICBzdHJpbmcgY2xpZW50X25hbWUgPSBzZXJ2aWNlX25hbWVfICsgIkNvYkNsaWVudCI7Ci0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBjbGllbnRfbmFtZSArPSAiVCI7Ci0gICAgICBzZXJ2aWNlX2lmX25hbWUgKz0gIlQiOwotICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiY2xhc3MgIiA8PCBjbGllbnRfbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiA6IHZpcnR1YWwgcHVibGljICIgKyB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgc3R5bGUgKyAiSWYiOwotICAgIGlmIChzdHlsZSA9PSAiQ29iQ2wiICYmIGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAvLyBUT0RPKHNpbXBraW5zKTogSWYgZ2VuX3RlbXBsYXRlc18gaXMgZW5hYmxlZCwgd2UgY3VycmVudGx5IGFzc3VtZSBhbGwKLSAgICAgIC8vIHBhcmVudCBzZXJ2aWNlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCi0gICAgICBleHRlbmRzICs9ICJUPFByb3RvY29sXz4iOwotICAgIH0KLSAgfQotCi0gIGlmIChzdHlsZSA9PSAiQ29iQ2wiICYmIGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgZl9oZWFkZXJfIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgc2VydmljZV9pZl9uYW1lIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIigpIHt9IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmhhc19kb2MoKSkKLSAgICAgIGZfaGVhZGVyXyA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfaGVhZGVyXywgKmZfaXRlcik7Ci0gICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHN0eWxlKSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGlmIChzdHlsZSA9PSAiQ29iQ2wiICYmIGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgLy8gZ2VuZXJhdGUgYSBiYWNrd2FyZHMtY29tcGF0aWJsZSB0eXBlZGVmIGZvciBjbGllbnRzIHRoYXQgZG8gbm90Ci0gICAgLy8ga25vdyBhYm91dCB0aGUgbmV3IHRlbXBsYXRlLXN0eWxlIGNvZGUKLSAgICBmX2hlYWRlcl8gPDwgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gIgotICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJJZjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGZhY3RvcnkuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGludGVyZmFjZSBmYWN0b3J5IGZvci4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlX2ZhY3RvcnkodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7Ci0gIHN0cmluZyBzZXJ2aWNlX2lmX25hbWUgPSBzZXJ2aWNlX25hbWVfICsgc3R5bGUgKyAiSWYiOwotCi0gIC8vIEZpZ3VyZSBvdXQgdGhlIG5hbWUgb2YgdGhlIHVwcGVyLW1vc3QgcGFyZW50IGNsYXNzLgotICAvLyBHZXR0aW5nIGV2ZXJ5dGhpbmcgdG8gd29yayBvdXQgcHJvcGVybHkgd2l0aCBpbmhlcml0YW5jZSBpcyBhbm5veWluZy4KLSAgLy8gSGVyZSdzIHdoYXQgd2UncmUgZG9pbmcgZm9yIG5vdzoKLSAgLy8KLSAgLy8gLSBBbGwgaGFuZGxlcnMgaW1wbGVtZW50IGdldEhhbmRsZXIoKSwgYnV0IHN1YmNsYXNzZXMgdXNlIGNvdmFyaWFudCByZXR1cm4KLSAgLy8gICB0eXBlcyB0byByZXR1cm4gdGhlaXIgc3BlY2lmaWMgc2VydmljZSBpbnRlcmZhY2UgY2xhc3MgdHlwZS4gIFdlIGhhdmUgdG8KLSAgLy8gICB1c2UgcmF3IHBvaW50ZXJzIGJlY2F1c2Ugb2YgdGhpczsgc2hhcmVkX3B0cjw+IGNhbid0IGJlIHVzZWQgZm9yCi0gIC8vICAgY292YXJpYW50IHJldHVybiB0eXBlcy4KLSAgLy8KLSAgLy8gLSBTaW5jZSB3ZSdyZSBub3QgdXNpbmcgc2hhcmVkX3B0cjw+LCB3ZSBhbHNvIHByb3ZpZGUgYSByZWxlYXNlSGFuZGxlcigpCi0gIC8vICAgZnVuY3Rpb24gdGhhdCBtdXN0IGJlIGNhbGxlZCB0byByZWxlYXNlIGEgcG9pbnRlciB0byBhIGhhbmRsZXIgb2J0YWluZWQKLSAgLy8gICB2aWEgZ2V0SGFuZGxlcigpLgotICAvLwotICAvLyAgIHJlbGVhc2VIYW5kbGVyKCkgYWx3YXlzIGFjY2VwdHMgYSBwb2ludGVyIHRvIHRoZSB1cHBlci1tb3N0IHBhcmVudCBjbGFzcwotICAvLyAgIHR5cGUuICBUaGlzIGlzIG5lY2Vzc2FyeSBzaW5jZSB0aGUgcGFyZW50IHZlcnNpb25zIG9mIHJlbGVhc2VIYW5kbGVyKCkKLSAgLy8gICBtYXkgYWNjZXB0IGFueSBvZiB0aGUgcGFyZW50IHR5cGVzLCBub3QganVzdCB0aGUgbW9zdCBzcGVjaWZpYyBzdWJjbGFzcwotICAvLyAgIHR5cGUuICBJbXBsZW1lbnRhdGlvbnMgY2FuIHVzZSBkeW5hbWljX2Nhc3QgdG8gY2FzdCB0aGUgcG9pbnRlciB0byB0aGUKLSAgLy8gICBzdWJjbGFzcyB0eXBlIGlmIGRlc2lyZWQuCi0gIHRfc2VydmljZSogYmFzZV9zZXJ2aWNlID0gdHNlcnZpY2U7Ci0gIHdoaWxlIChiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGJhc2Vfc2VydmljZSA9IGJhc2Vfc2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgfQotICBzdHJpbmcgYmFzZV9pZl9uYW1lID0gdHlwZV9uYW1lKGJhc2Vfc2VydmljZSkgKyBzdHlsZSArICJJZiI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGFic3RyYWN0IGZhY3RvcnkgY2xhc3MKLSAgc3RyaW5nIGZhY3RvcnlfbmFtZSA9IHNlcnZpY2VfaWZfbmFtZSArICJGYWN0b3J5IjsKLSAgc3RyaW5nIGV4dGVuZHM7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9ICIgOiB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArIHN0eWxlICsgIklmRmFjdG9yeSI7Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgZmFjdG9yeV9uYW1lIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiIEhhbmRsZXI7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIH4iIDw8IGZhY3RvcnlfbmFtZSA8PCAiKCkge30iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIiogZ2V0SGFuZGxlcigiCi0gICAgICAgICAgICA8PCAiY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgInZpcnR1YWwgdm9pZCByZWxlYXNlSGFuZGxlcigiIDw8IGJhc2VfaWZfbmFtZSA8PCAiKiAvKiBoYW5kbGVyICovKSA9IDA7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2luZ2xldG9uIGZhY3RvcnkgY2xhc3MKLSAgc3RyaW5nIHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPSBzZXJ2aWNlX2lmX25hbWUgKyAiU2luZ2xldG9uRmFjdG9yeSI7Ci0gIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBzaW5nbGV0b25fZmFjdG9yeV9uYW1lIDw8ICIgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IGZhY3RvcnlfbmFtZSA8PCAiIHsiCi0gICAgICAgICAgICA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBzaW5nbGV0b25fZmFjdG9yeV9uYW1lIDw8ICIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PCBzZXJ2aWNlX2lmX25hbWUKLSAgICAgICAgICAgIDw8ICI+JiBpZmFjZSkgOiBpZmFjZV8oaWZhY2UpIHt9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iCi0gICAgICAgICAgICA8PCBzaW5nbGV0b25fZmFjdG9yeV9uYW1lIDw8ICIoKSB7fSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICIKLSAgICAgICAgICAgIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiKiBnZXRIYW5kbGVyKCIKLSAgICAgICAgICAgIDw8ICJjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAiICByZXR1cm4gaWZhY2VfLmdldCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgInZpcnR1YWwgdm9pZCByZWxlYXNlSGFuZGxlcigiIDw8IGJhc2VfaWZfbmFtZSA8PCAiKiAvKiBoYW5kbGVyICovKSB7fSIgPDwgZW5kbDsKLQotICBmX2hlYWRlcl8gPDwgZW5kbCA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgc2VydmljZV9pZl9uYW1lCi0gICAgICAgICAgICA8PCAiPiBpZmFjZV87IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBudWxsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9udWxsKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSAiICwgdmlydHVhbCBwdWJsaWMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyBzdHlsZSArICJOdWxsIjsKLSAgfQotICBmX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiTnVsbCA6IHZpcnR1YWwgcHVibGljICIgPDwgc2VydmljZV9uYW1lXwotICAgICAgICAgICAgPDwgc3R5bGUgPDwgIklmIiA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiTnVsbCgpIHt9IiA8PCBlbmRsOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHN0eWxlLCAiIiwgZmFsc2UpIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHRfdHlwZSogcmV0dXJudHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X2ZpZWxkIHJldHVybmZpZWxkKHJldHVybnR5cGUsICJfcmV0dXJuIik7Ci0KLSAgICBpZiAoc3R5bGUgPT0gIiIpIHsKLSAgICAgIGlmIChyZXR1cm50eXBlLT5pc192b2lkKCkgfHwgaXNfY29tcGxleF90eXBlKHJldHVybnR5cGUpKSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgPDwgInJldHVybiBfcmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHN0eWxlID09ICJDb2JTdiIpIHsKLSAgICAgIGlmIChyZXR1cm50eXBlLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKCk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdF9maWVsZCByZXR1cm5maWVsZChyZXR1cm50eXBlLCAiX3JldHVybiIpOwotICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gY29iKF9yZXR1cm4pOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyAiVU5LTk9XTiBTVFlMRSI7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25fY2FsbChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFyZ19wcmVmaXgpIHsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHRfdHlwZSogcmV0X3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7Ci0gIG91dCA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICFyZXRfdHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgaWYgKGlzX2NvbXBsZXhfdHlwZShyZXRfdHlwZSkpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBvdXQgPDwgaWZhY2UgPDwgIi0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiIDw8IHRhcmdldDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IHRhcmdldCA8PCAiID0gIiA8PCBpZmFjZSA8PCAiLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG91dCA8PCBpZmFjZSA8PCAiLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgIH0KLSAgICBvdXQgPDwgYXJnX3ByZWZpeCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2tlbGV0b24odF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgc3ZjbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOwotCi0gIC8vIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gZmlsZSBpbmNsdWRlcwotICBzdHJpbmcgZl9za2VsZXRvbl9uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiX2FzeW5jX3NlcnZlci5za2VsZXRvbi5jcHAiOwotCi0gIHN0cmluZyBucyA9IG5hbWVzcGFjZV9wcmVmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKLQotICBvZnN0cmVhbSBmX3NrZWxldG9uOwotICBmX3NrZWxldG9uLm9wZW4oZl9za2VsZXRvbl9uYW1lLmNfc3RyKCkpOwotICBmX3NrZWxldG9uIDw8ICIvLyBUaGlzIGF1dG9nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBvbmUgd2F5IHRvIGFkYXB0IGEgc3luY2hyb25vdXMiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCAiLy8gaW50ZXJmYWNlIGludG8gYW4gYXN5bmNocm9ub3VzIGludGVyZmFjZS4gWW91IHNob3VsZCBjb3B5IGl0IHRvIGFub3RoZXIiCi0gICAgICAgICAgICAgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIvLyBmaWxlbmFtZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdCBhbmQgcmV3cml0ZSBhcyBhc3luY2hyb25vdXMgYW55IGZ1bmN0aW9ucyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8ICIvLyB0aGF0IHdvdWxkIG90aGVyd2lzZSBpbnRyb2R1Y2UgdW53YW50ZWQgbGF0ZW5jeS4iIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+IiA8PCBlbmRsIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOyIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBub3QgY29tcGlsZToKLSAgLy8gdXNpbmcgbmFtZXNwYWNlIDsKLSAgLy8gdXNpbmcgbmFtZXNwYWNlIDo6OwotICBpZiAoKCFucy5lbXB0eSgpKSAmJiAobnMuY29tcGFyZSgiIDo6IikgIT0gMCkpIHsKLSAgICBmX3NrZWxldG9uIDw8ICJ1c2luZyBuYW1lc3BhY2UgIiA8PCBzdHJpbmcobnMsIDAsIG5zLnNpemUoKSAtIDIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NrZWxldG9uIDw8ICJjbGFzcyAiIDw8IHN2Y25hbWUgPDwgIkFzeW5jSGFuZGxlciA6ICIKLSAgICAgICAgICAgICA8PCAicHVibGljICIgPDwgc3ZjbmFtZSA8PCAiQ29iU3ZJZiB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgc3ZjbmFtZSA8PCAiQXN5bmNIYW5kbGVyKCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIgIHN5bmNIYW5kbGVyXyA9IHN0ZDo6YXV0b19wdHI8IiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyPihuZXcgIiA8PCBzdmNuYW1lCi0gICAgICAgICAgICAgPDwgIkhhbmRsZXIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkFzeW5jSGFuZGxlcigpOyIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NrZWxldG9uIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICJDb2JTdiIsICIiLCB0cnVlKSA8PCAiIHsiCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKLQotICAgIHN0cmluZyB0YXJnZXQgPSByZXR1cm50eXBlLT5pc192b2lkKCkgPyAiIiA6ICJfcmV0dXJuIjsKLSAgICBpZiAoIXJldHVybnR5cGUtPmlzX3ZvaWQoKSkgewotICAgICAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbDsKLSAgICB9Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25fY2FsbChmX3NrZWxldG9uLCAqZl9pdGVyLCB0YXJnZXQsICJzeW5jSGFuZGxlcl8iLCAiIik7Ci0gICAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYigiIDw8IHRhcmdldCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2tlbGV0b24pOwotICB9Ci0gIGZfc2tlbGV0b24gPDwgZW5kbCA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN0ZDo6YXV0b19wdHI8IiA8PCBzdmNuYW1lCi0gICAgICAgICAgICAgPDwgIkhhbmRsZXI+IHN5bmNIYW5kbGVyXzsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2tlbGV0b24gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgbXVsdGlmYWNlLCB3aGljaCBpcyBhIHNpbmdsZSBzZXJ2ZXIgdGhhdCBqdXN0IHRha2VzIGEgc2V0Ci0gKiBvZiBvYmplY3RzIGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIGFuZCBjYWxscyB0aGVtIGFsbCwgcmV0dXJuaW5nIHRoZQotICogdmFsdWUgb2YgdGhlIGxhc3Qgb25lIHRvIGJlIGNhbGxlZC4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBtdWx0aXNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX211bHRpZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfbXVsdGlmYWNlID0gIiwgcHVibGljICIgKyBleHRlbmRzICsgIk11bHRpZmFjZSI7Ci0gIH0KLQotICBzdHJpbmcgbGlzdF90eXBlID0gc3RyaW5nKCJzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjwiKSArIHNlcnZpY2VfbmFtZV8gKyAiSWY+ID4iOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBmX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiTXVsdGlmYWNlIDogIgotICAgICAgICAgICAgPDwgInZpcnR1YWwgcHVibGljICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYiIDw8IGV4dGVuZHNfbXVsdGlmYWNlIDw8ICIgeyIgPDwgZW5kbAotICAgICAgICAgICAgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSgiIDw8IGxpc3RfdHlwZQotICAgICAgICAgICAgPDwgIiYgaWZhY2VzKSA6IGlmYWNlc18oaWZhY2VzKSB7IiA8PCBlbmRsOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICA8PCAiICBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjwiICsgc2VydmljZV9uYW1lXyArICJJZj4gPjo6aXRlcmF0b3IgaXRlcjsiCi0gICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZm9yIChpdGVyID0gaWZhY2VzLmJlZ2luKCk7IGl0ZXIgIT0gaWZhY2VzLmVuZCgpOyArK2l0ZXIpIHsiCi0gICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICAiIDw8IGV4dGVuZHMgPDwgIk11bHRpZmFjZTo6YWRkKCppdGVyKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXwotICAgICAgICAgICAgPDwgIk11bHRpZmFjZSgpIHt9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIFByb3RlY3RlZCBkYXRhIG1lbWJlcnMKLSAgZl9oZWFkZXJfIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBsaXN0X3R5cGUgPDwgIiBpZmFjZXNfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfCi0gICAgICAgICAgICA8PCAiTXVsdGlmYWNlKCkge30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPCIKLSAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmPiBpZmFjZSkgeyIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8ICJNdWx0aWZhY2U6OmFkZChpZmFjZSk7IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpZmFjZXNfLnB1c2hfYmFjayhpZmFjZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotCi0gICAgc3RyaW5nIGNhbGwgPSBzdHJpbmcoImlmYWNlc19baV0tPiIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIigiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgY2FsbCArPSAiX3JldHVybiI7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0KLSAgICBmb3IgKGFfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYV9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNhbGwgKz0gIiwgIjsKLSAgICAgIH0KLSAgICAgIGNhbGwgKz0gKCphX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBjYWxsICs9ICIpIjsKLQotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIpIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInNpemVfdCBzeiA9IGlmYWNlc18uc2l6ZSgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2l6ZV90IGkgPSAwOyIKLSAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm9yICg7IGkgPCAoc3ogLSAxKTsgKytpKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgewotICBzdHJpbmcgaWZzdHlsZTsKLSAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgaWZzdHlsZSA9ICJDb2JDbCI7Ci0gIH0KLQotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOwotICBzdHJpbmcgdGVtcGxhdGVfaGVhZGVyLCB0ZW1wbGF0ZV9zdWZmaXgsIHNob3J0X3N1ZmZpeCwgcHJvdG9jb2xfdHlwZSwgX3RoaXM7Ci0gIHN0cmluZyBjb25zdCBwcm90X2ZhY3RvcnlfdHlwZSA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeSI7Ci0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIHRlbXBsYXRlX2hlYWRlciA9ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPlxuIjsKLSAgICBzaG9ydF9zdWZmaXggPSAiVCI7Ci0gICAgdGVtcGxhdGVfc3VmZml4ID0gIlQ8UHJvdG9jb2xfPiI7Ci0gICAgcHJvdG9jb2xfdHlwZSA9ICJQcm90b2NvbF8iOwotICAgIF90aGlzID0gInRoaXMtPiI7Ci0gIH0gZWxzZSB7Ci0gICAgcHJvdG9jb2xfdHlwZSA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIjsKLSAgfQotICBzdHJpbmcgcHJvdF9wdHIgPSAiYm9vc3Q6OnNoYXJlZF9wdHI8ICIgKyBwcm90b2NvbF90eXBlICsgIj4iOwotICBzdHJpbmcgY2xpZW50X3N1ZmZpeCA9ICJDbGllbnQiICsgdGVtcGxhdGVfc3VmZml4OwotICBzdHJpbmcgaWZfc3VmZml4ID0gIklmIjsKLSAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgaWZfc3VmZml4ICs9IHRlbXBsYXRlX3N1ZmZpeDsKLSAgfQotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAotICAgIC8vIHBhcmVudCBzZXJ2aWNlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCi0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAiLCBwdWJsaWMgIiArIGV4dGVuZHMgKyBzdHlsZSArIGNsaWVudF9zdWZmaXg7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaWYoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKQotICB7Ci0gICAgZl9oZWFkZXJfIDw8IAotICAgICAgIi8vIFRoZSBcJ2NvbmN1cnJlbnRcJyBjbGllbnQgaXMgYSB0aHJlYWQgc2FmZSBjbGllbnQgdGhhdCBjb3JyZWN0bHkgaGFuZGxlc1xuIgotICAgICAgIi8vIG91dCBvZiBvcmRlciByZXNwb25zZXMuICBJdCBpcyBzbG93ZXIgdGhhbiB0aGUgcmVndWxhciBjbGllbnQsIHNvIHNob3VsZFxuIgotICAgICAgIi8vIG9ubHkgYmUgdXNlZCB3aGVuIHlvdSBuZWVkIHRvIHNoYXJlIGEgY29ubmVjdGlvbiBhbW9uZyBtdWx0aXBsZSB0aHJlYWRzXG4iOwotICB9Ci0gIGZfaGVhZGVyXyA8PCB0ZW1wbGF0ZV9oZWFkZXIgPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXgKLSAgICAgICAgICAgIDw8ICIgOiAiCi0gICAgICAgICAgICA8PCAidmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IGlmc3R5bGUgPDwgaWZfc3VmZml4IDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgeyIKLSAgICAgICAgICAgIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBpZiAoc3R5bGUgIT0gIkNvYiIpIHsKLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIigiIDw8IHByb3RfcHRyCi0gICAgICAgICAgICAgIDw8ICIgcHJvdCkgIjsKLQotICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICAgIGZfaGVhZGVyXyA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIocHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeCA8PCAiKHByb3QsIHByb3QpIHt9IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIiA8PCBwcm90X3B0cgotICAgICAgICAgICAgICA8PCAiIGlwcm90LCAiIDw8IHByb3RfcHRyIDw8ICIgb3Byb3QpICI7Ci0gICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgICAgZl9oZWFkZXJfIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIihpcHJvdCxvcHJvdCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PCAiOiIgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8IHN0eWxlIDw8IGNsaWVudF9zdWZmaXgKLSAgICAgICAgICAgICAgICA8PCAiKGlwcm90LCBvcHJvdCkge30iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gY3JlYXRlIHRoZSBzZXRQcm90b2NvbCBtZXRob2RzCi0gICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgICAgZl9oZWFkZXJfIDw8ICIgcHJpdmF0ZToiIDw8IGVuZGw7Ci0gICAgICAvLyAxOiBvbmUgcGFyYW1ldGVyCi0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwgcHJvdF9wdHIgPDwgIiBwcm90KSB7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIihwcm90LHByb3QpOyIgPDwgZW5kbDsKLSAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIC8vIDI6IHR3byBwYXJhbWV0ZXIKLSAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIiA8PCBwcm90X3B0ciA8PCAiIGlwcm90LCAiCi0gICAgICAgICAgICAgICAgPDwgcHJvdF9wdHIgPDwgIiBvcHJvdCkgeyIgPDwgZW5kbDsKLQotICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHBpcHJvdF89aXByb3Q7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHBvcHJvdF89b3Byb3Q7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gaXByb3QuZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgPDwgIiAgb3Byb3RfID0gb3Byb3QuZ2V0KCk7IiA8PCBlbmRsOwotCi0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBmX2hlYWRlcl8gPDwgIiBwdWJsaWM6IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIEdlbmVyYXRlIGdldHRlcnMgZm9yIHRoZSBwcm90b2NvbHMuCi0gICAgLy8gTm90ZSB0aGF0IHRoZXNlIGFyZSBub3QgY3VycmVudGx5IHRlbXBsYXRlZCBmb3Igc2ltcGxpY2l0eS4KLSAgICAvLyBUT0RPKHNpbXBraW5zKTogc2hvdWxkIHRoZXkgYmUgdGVtcGxhdGVkPwotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldElucHV0UHJvdG9jb2woKSB7IgotICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IF90aGlzIDw8ICJwaXByb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldE91dHB1dFByb3RvY29sKCkgeyIKLSAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBfdGhpcyA8PCAicG9wcm90XzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIC8qIGlmIChzdHlsZSA9PSAiQ29iIikgKi8gewotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIKLSAgICAgICAgICAgICAgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbCwgIgotICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3RvcnkqIHByb3RvY29sRmFjdG9yeSkgOiIgPDwgZW5kbDsKLSAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgY2hhbm5lbF8oY2hhbm5lbCksIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgPDwgIiAgaXRyYW5zXyhuZXcgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKCkpLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG90cmFuc18obmV3IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcigpKSwiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICAvLyBUUHJvdG9jb2xGYWN0b3J5IGNsYXNzZXMgcmV0dXJuIGdlbmVyaWMgVFByb3RvY29sIHBvaW50ZXJzLgotICAgICAgICAvLyBXZSBoYXZlIHRvIGR5bmFtaWMgY2FzdCB0byB0aGUgUHJvdG9jb2xfIHR5cGUgd2UgYXJlIGV4cGVjdGluZy4KLSAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHBpcHJvdF8oYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFByb3RvY29sXz4oIgotICAgICAgICAgICAgICAgICAgPDwgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpKSwiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgIDw8ICIgIHBvcHJvdF8oYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFByb3RvY29sXz4oIgotICAgICAgICAgICAgICAgICAgPDwgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wob3RyYW5zXykpKSB7IiA8PCBlbmRsOwotICAgICAgICAvLyBUaHJvdyBhIFRFeGNlcHRpb24gaWYgZWl0aGVyIGR5bmFtaWMgY2FzdCBmYWlsZWQuCi0gICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpZiAoIXBpcHJvdF8gfHwgIXBvcHJvdF8pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgIDw8ICIgICAgdGhyb3cgOjphcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihcIiIKLSAgICAgICAgICAgICAgICAgIDw8ICJUUHJvdG9jb2xGYWN0b3J5IHJldHVybmVkIHVuZXhwZWN0ZWQgcHJvdG9jb2wgdHlwZSBpbiAiIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgICAgICAgIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiIGNvbnN0cnVjdG9yXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBwaXByb3RfKHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcG9wcm90Xyhwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKG90cmFuc18pKSB7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90XyA9IHBpcHJvdF8uZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgPDwgIiAgb3Byb3RfID0gcG9wcm90Xy5nZXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeAotICAgICAgICAgICAgICAgIDw8ICIoY2hhbm5lbCwgcHJvdG9jb2xGYWN0b3J5KSB7fSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gZ2V0Q2hhbm5lbCgpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgImNoYW5uZWxfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBpZiAoIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB2b2lkIGNvbXBsZXRlZF9fKGJvb2wgLyogc3VjY2VzcyAqLykge30iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGlmc3R5bGUpIDw8ICI7IiA8PCBlbmRsOwotICAgIC8vIFRPRE8oZHJlaXNzKTogVXNlIHByaXZhdGUgaW5oZXJpdGFuY2UgdG8gYXZvaWQgZ2VuZXJhdGluZyB0aGlzZSBpbiBjb2Itc3R5bGUuCi0gICAgaWYoc3R5bGUgPT0gIkNvbmN1cnJlbnQiICYmICEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAvLyBjb25jdXJyZW50IGNsaWVudHMgbmVlZCB0byBtb3ZlIHRoZSBzZXFpZCBmcm9tIHRoZSBzZW5kIGZ1bmN0aW9uIHRvIHRoZQotICAgICAgLy8gcmVjdiBmdW5jdGlvbi4gIE9uZXdheSBtZXRob2RzIGRvbid0IGhhdmUgYSByZWN2IGZ1bmN0aW9uLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgICAvLyBtb3ZlIHRoZSBzZXFpZCBmb3IgdGhlbS4gIEF0dGVtcHRpbmcgdG8gZG8gc28gd291bGQgcmVzdWx0IGluIGEgc2VxaWQgbGVhay4KLSAgICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfaTMyLCAvKnJldHVybmluZyBzZXFpZCovCi0gICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0gICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sICIiKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0gICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sICIiKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBpZihzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKLSAgICAgICAgdF9maWVsZCBzZXFJZEFyZyhnX3R5cGVfaTMyLCAic2VxaWQiKTsKLSAgICAgICAgdF9zdHJ1Y3Qgc2VxSWRBcmdTdHJ1Y3QocHJvZ3JhbV8pOwotICAgICAgICBzZXFJZEFyZ1N0cnVjdC5hcHBlbmQoJnNlcUlkQXJnKTsKLSAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICZzZXFJZEFyZ1N0cnVjdCk7Ci0gICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfaGVhZGVyXyA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKLSAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgIDw8ICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0NoYW5uZWw+IGNoYW5uZWxfOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IGl0cmFuc187IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gb3RyYW5zXzsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9oZWFkZXJfIDw8IAotICAgICAgaW5kZW50KCkgPDwgcHJvdF9wdHIgPDwgIiBwaXByb3RfOyIgPDwgZW5kbCA8PCAKLSAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcG9wcm90XzsiIDw8IGVuZGwgPDwgCi0gICAgICBpbmRlbnQoKSA8PCBwcm90b2NvbF90eXBlIDw8ICIqIGlwcm90XzsiIDw8IGVuZGwgPDwgCi0gICAgICBpbmRlbnQoKSA8PCBwcm90b2NvbF90eXBlIDw8ICIqIG9wcm90XzsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQ29uY3VycmVudENsaWVudFN5bmNJbmZvIHN5bmNfOyI8PGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgLy8gT3V0cHV0IGEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdHlwZWRlZiB1c2luZwotICAgIC8vIFRQcm90b2NvbCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLgotICAgIGZfaGVhZGVyXyA8PCAidHlwZWRlZiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUKLSAgICAgICAgICAgICAgPDwgIkNsaWVudFQ8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+ICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZQotICAgICAgICAgICAgICA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIHNjb3BlID0gc2VydmljZV9uYW1lXyArIHN0eWxlICsgY2xpZW50X3N1ZmZpeCArICI6OiI7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgc2VxSWRDYXB0dXJlOwotICAgIHN0cmluZyBzZXFJZFVzZTsKLSAgICBzdHJpbmcgc2VxSWRDb21tYVVzZTsKLSAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiICYmICEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzZXFJZENhcHR1cmUgPSAiaW50MzJfdCBzZXFpZCA9ICI7Ci0gICAgICBzZXFJZFVzZSA9ICJzZXFpZCI7Ci0gICAgICBzZXFJZENvbW1hVXNlID0gIiwgc2VxaWQiOwotICAgIH0KLQotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgaW5kZW50KG91dCkgPDwgdGVtcGxhdGVfaGVhZGVyOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgaWZzdHlsZSwgc2NvcGUpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCBzZXFJZENhcHR1cmUgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgfQotICAgICAgb3V0IDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKHN0eWxlICE9ICJDb2IiKSB7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgICAgICBvdXQgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoX3JldHVybiIgPDwgc2VxSWRDb21tYVVzZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PCAicmV0dXJuIHJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBzZXFJZFVzZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IHNlcUlkVXNlIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IF90aGlzIDw8ICJjaGFubmVsXy0+c2VuZEFuZFJlY3ZNZXNzYWdlKCIKLSAgICAgICAgICAgIDw8ICJ0Y3h4OjpiaW5kKGNvYiwgdGhpcyksICIgPDwgX3RoaXMgPDwgIm90cmFuc18uZ2V0KCksICIgPDwgX3RoaXMgPDwgIml0cmFuc18uZ2V0KCkpOyIKLSAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgX3RoaXMgPDwgImNoYW5uZWxfLT5zZW5kTWVzc2FnZSgiCi0gICAgICAgICAgICA8PCAidGN4eDo6YmluZChjb2IsIHRoaXMpLCAiIDw8IF90aGlzIDw8ICJvdHJhbnNfLmdldCgpKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIC8vIGlmIChzdHlsZSAhPSAiQ29iIikgLy8gVE9ETyhkcmVpc3MpOiBMaWJpZnkgdGhlIGNsaWVudCBhbmQgZG9uJ3QgZ2VuZXJhdGUgdGhpcyBmb3IgY29iLXN0eWxlCi0gICAgaWYgKHRydWUpIHsKLSAgICAgIHRfdHlwZSAqc2VuZF9mdW5jX3JldHVybl90eXBlID0gZ190eXBlX3ZvaWQ7Ci0gICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiICYmICEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIHNlbmRfZnVuY19yZXR1cm5fdHlwZSA9IGdfdHlwZV9pMzI7Ci0gICAgICB9Ci0gICAgICAvLyBGdW5jdGlvbiBmb3Igc2VuZGluZwotICAgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKHNlbmRfZnVuY19yZXR1cm5fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgICAgLy8gT3BlbiB0aGUgc2VuZCBmdW5jdGlvbgotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIsIHNjb3BlKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gRnVuY3Rpb24gYXJndW1lbnRzIGFuZCByZXN1bHRzCi0gICAgICBzdHJpbmcgYXJnc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcGFyZ3MiOwotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcHJlc3VsdCI7Ci0KLSAgICAgIHN0cmluZyBjc2VxaWRWYWwgPSAiMCI7Ci0gICAgICBpZihzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgICAgY3NlcWlkVmFsID0gInRoaXMtPnN5bmNfLmdlbmVyYXRlU2VxSWQoKSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgICAgb3V0IDw8IAotICAgICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCBjc2VxaWQgPSAiIDw8IGNzZXFpZFZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGlmKHN0eWxlID09ICJDb25jdXJyZW50IikgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRDb25jdXJyZW50U2VuZFNlbnRyeSBzZW50cnkoJnRoaXMtPnN5bmNfKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgIm9wcm90Xy0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IAotICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgCi0gICAgICAgICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OiIgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVF9PTkVXQVkiIDogIlRfQ0FMTCIpIDw8IAotICAgICAgICAiLCBjc2VxaWQpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IAotICAgICAgICBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3M7IiA8PCBlbmRsOwotCi0gICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUoIiA8PCBfdGhpcyA8PCAib3Byb3RfKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcwotICAgICAgICAgIDw8ICJvcHJvdF8tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcwotICAgICAgICAgIDw8ICJvcHJvdF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcwotICAgICAgICAgIDw8ICJvcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgICAgaWYoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gY3NlcWlkOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAgIC8vIEdlbmVyYXRlIHJlY3YgZnVuY3Rpb24gb25seSBpZiBub3QgYW4gb25ld2F5IGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgICB0X2ZpZWxkIHNlcUlkQXJnKGdfdHlwZV9pMzIsICJzZXFpZCIpOwotICAgICAgICB0X3N0cnVjdCBzZXFJZEFyZ1N0cnVjdChwcm9ncmFtXyk7Ci0gICAgICAgIHNlcUlkQXJnU3RydWN0LmFwcGVuZCgmc2VxSWRBcmcpOwotCi0gICAgICAgIHRfc3RydWN0ICpyZWN2X2Z1bmN0aW9uX2FyZ3MgPSAmbm9hcmdzOwotICAgICAgICBpZihzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKLSAgICAgICAgICByZWN2X2Z1bmN0aW9uX2FyZ3MgPSAmc2VxSWRBcmdTdHJ1Y3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdl9mdW5jdGlvbl9hcmdzKTsKLSAgICAgICAgLy8gT3BlbiB0aGUgcmVjdiBmdW5jdGlvbgotICAgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCB0ZW1wbGF0ZV9oZWFkZXI7Ci0gICAgICAgIH0KLSAgICAgICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCAiIiwgc2NvcGUpIDw8IGVuZGw7Ci0gICAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgICAgb3V0IDw8IGVuZGwgPDwgCi0gICAgICAgICAgaW5kZW50KCkgPDwgImludDMyX3QgcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwgCi0gICAgICAgICAgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nIGZuYW1lOyIgPDwgZW5kbCA8PCAKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsiIDw8IGVuZGw7Ci0gICAgICAgIGlmKHN0eWxlID09ICJDb25jdXJyZW50IikgewotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIi8vIHRoZSByZWFkIG11dGV4IGdldHMgZHJvcHBlZCBhbmQgcmVhY3F1aXJlZCBhcyBwYXJ0IG9mIHdhaXRGb3JXb3JrKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIvLyBUaGUgZGVzdHJ1Y3RvciBvZiB0aGlzIHNlbnRyeSB3YWtlcyB1cCBvdGhlciBjbGllbnRzIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRDb25jdXJyZW50UmVjdlNlbnRyeSBzZW50cnkoJnRoaXMtPnN5bmNfLCBzZXFpZCk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBjb21wbGV0ZWQgPSBmYWxzZTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiOwotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCBlbmRsOwotICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAid2hpbGUodHJ1ZSkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYoIXRoaXMtPnN5bmNfLmdldFBlbmRpbmcoZm5hbWUsIG10eXBlLCByc2VxaWQpKSB7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCByc2VxaWQpOyIgPDwgZW5kbDsKLSAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgewotICAgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmKHNlcWlkID09IHJzZXFpZCkgeyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTikgeyIgPDwgZW5kbCA8PCAKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geDsiIDw8IGVuZGwgPDwgCi0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgeC5yZWFkKCIgPDwgX3RoaXMgPDwgImlwcm90Xyk7IiA8PCBlbmRsIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgCi0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbDsKLSAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHg7IiA8PCBlbmRsIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgIT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFkpIHsiIDw8IGVuZGwgPDwgCi0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5za2lwKCIgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgCi0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbDsKLSAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKGZhbHNlKTsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoZm5hbWUuY29tcGFyZShcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikgIT0gMCkgeyIgPDwgZW5kbCA8PCAKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPnNraXAoIiA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsiIDw8IGVuZGwgPDwgCi0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCAKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsOwotICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18oZmFsc2UpOyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7Ci0gICAgICAgICAgb3V0IDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIGluIGEgYmFkIHN0YXRlLCBkb24ndCBjb21taXQiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb247IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQotICAgICAgICAgICAgJiYgIWlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgICAgdF9maWVsZCByZXR1cm5maWVsZCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICJfcmV0dXJuIik7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkKSA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQ7IiA8PCBlbmRsOwotCi0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gJl9yZXR1cm47IiA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQucmVhZCgiIDw8IF90aGlzIDw8ICJpcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcwotICAgICAgICAgICAgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgX3RoaXMKLSAgICAgICAgICAgIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgICAgLy8gQ2FyZWZ1bCwgb25seSBsb29rIGZvciBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICAgICAgb3V0IDw8IAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgLy8gX3JldHVybiBwb2ludGVyIGhhcyBub3cgYmVlbiBmaWxsZWQiIDw8IGVuZGw7Ci0gICAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7Ci0gICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0IDw8IAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8IAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKLSAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIF9yZXR1cm47IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgewotICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBvbmx5IGdldCBoZXJlIGlmIHdlIGFyZSBhIHZvaWQgZnVuY3Rpb24KLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjb21wbGV0ZWRfXyh0cnVlKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgewotICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRlZF9fKHRydWUpOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7Ci0gICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGluIGEgYmFkIHN0YXRlLCBkb24ndCBjb21taXQiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uKDo6YXBhY2hlOjp0aHJpZnQ6OiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpZihzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBzZXFpZCAhPSByc2VxaWQiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPnN5bmNfLnVwZGF0ZVBlbmRpbmcoZm5hbWUsIG10eXBlLCByc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgLy8gdGhpcyB3aWxsIHRlbXBvcmFyaWx5IHVubG9jayB0aGUgcmVhZE11dGV4LCBhbmQgbGV0IG90aGVyIGNsaWVudHMgZ2V0IHdvcmsgZG9uZSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy0+c3luY18ud2FpdEZvcldvcmsoc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0gLy8gZW5kIHdoaWxlKHRydWUpIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoICguLi4pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaWYgKCFjb21wbGV0ZWQpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICBjb21wbGV0ZWRfXyhmYWxzZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwKLSAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3c7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLWNsYXNzIFByb2Nlc3NvckdlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIFByb2Nlc3NvckdlbmVyYXRvcih0X2NwcF9nZW5lcmF0b3IqIGdlbmVyYXRvciwgdF9zZXJ2aWNlKiBzZXJ2aWNlLCBjb25zdCBzdHJpbmcmIHN0eWxlKTsKLQotICB2b2lkIHJ1bigpIHsKLSAgICBnZW5lcmF0ZV9jbGFzc19kZWZpbml0aW9uKCk7Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2hDYWxsKCkgZnVuY3Rpb24KLSAgICBnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKGZhbHNlKTsKLSAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIGdlbmVyYXRlX2Rpc3BhdGNoX2NhbGwodHJ1ZSk7Ci0gICAgfQotCi0gICAgLy8gR2VuZXJhdGUgYWxsIG9mIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25zKCk7Ci0KLSAgICBnZW5lcmF0ZV9mYWN0b3J5KCk7Ci0gIH0KLQotICB2b2lkIGdlbmVyYXRlX2NsYXNzX2RlZmluaXRpb24oKTsKLSAgdm9pZCBnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKGJvb2wgdGVtcGxhdGVfcHJvdG9jb2wpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25zKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmFjdG9yeSgpOwotCi1wcm90ZWN0ZWQ6Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYgPSBmYWxzZSwgYm9vbCBhcmcgPSBmYWxzZSkgewotICAgIHJldHVybiBnZW5lcmF0b3JfLT50eXBlX25hbWUodHR5cGUsIGluX3R5cGVkZWYsIGFyZyk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBpbmRlbnQoKSB7IHJldHVybiBnZW5lcmF0b3JfLT5pbmRlbnQoKTsgfQotICBzdGQ6Om9zdHJlYW0mIGluZGVudChzdGQ6Om9zdHJlYW0mIG9zKSB7IHJldHVybiBnZW5lcmF0b3JfLT5pbmRlbnQob3MpOyB9Ci0KLSAgdm9pZCBpbmRlbnRfdXAoKSB7IGdlbmVyYXRvcl8tPmluZGVudF91cCgpOyB9Ci0gIHZvaWQgaW5kZW50X2Rvd24oKSB7IGdlbmVyYXRvcl8tPmluZGVudF9kb3duKCk7IH0KLQotICB0X2NwcF9nZW5lcmF0b3IqIGdlbmVyYXRvcl87Ci0gIHRfc2VydmljZSogc2VydmljZV87Ci0gIHN0ZDo6b2ZzdHJlYW0mIGZfaGVhZGVyXzsKLSAgc3RkOjpvZnN0cmVhbSYgZl9vdXRfOwotICBzdHJpbmcgc2VydmljZV9uYW1lXzsKLSAgc3RyaW5nIHN0eWxlXzsKLSAgc3RyaW5nIHBzdHlsZV87Ci0gIHN0cmluZyBjbGFzc19uYW1lXzsKLSAgc3RyaW5nIGlmX25hbWVfOwotICBzdHJpbmcgZmFjdG9yeV9jbGFzc19uYW1lXzsKLSAgc3RyaW5nIGZpbmlzaF9jb2JfOwotICBzdHJpbmcgZmluaXNoX2NvYl9kZWNsXzsKLSAgc3RyaW5nIHJldF90eXBlXzsKLSAgc3RyaW5nIGNhbGxfY29udGV4dF87Ci0gIHN0cmluZyBjb2JfYXJnXzsKLSAgc3RyaW5nIGNhbGxfY29udGV4dF9hcmdfOwotICBzdHJpbmcgY2FsbF9jb250ZXh0X2RlY2xfOwotICBzdHJpbmcgdGVtcGxhdGVfaGVhZGVyXzsKLSAgc3RyaW5nIHRlbXBsYXRlX3N1ZmZpeF87Ci0gIHN0cmluZyB0eXBlbmFtZV9zdHJfOwotICBzdHJpbmcgY2xhc3Nfc3VmZml4XzsKLSAgc3RyaW5nIGV4dGVuZHNfOwotfTsKLQotUHJvY2Vzc29yR2VuZXJhdG9yOjpQcm9jZXNzb3JHZW5lcmF0b3IodF9jcHBfZ2VuZXJhdG9yKiBnZW5lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN0eWxlKQotICA6IGdlbmVyYXRvcl8oZ2VuZXJhdG9yKSwKLSAgICBzZXJ2aWNlXyhzZXJ2aWNlKSwKLSAgICBmX2hlYWRlcl8oZ2VuZXJhdG9yLT5mX2hlYWRlcl8pLAotICAgIGZfb3V0XyhnZW5lcmF0b3ItPmdlbl90ZW1wbGF0ZXNfID8gZ2VuZXJhdG9yLT5mX3NlcnZpY2VfdGNjXyA6IGdlbmVyYXRvci0+Zl9zZXJ2aWNlXyksCi0gICAgc2VydmljZV9uYW1lXyhnZW5lcmF0b3ItPnNlcnZpY2VfbmFtZV8pLAotICAgIHN0eWxlXyhzdHlsZSkgewotICBpZiAoc3R5bGVfID09ICJDb2IiKSB7Ci0gICAgcHN0eWxlXyA9ICJBc3luYyI7Ci0gICAgY2xhc3NfbmFtZV8gPSBzZXJ2aWNlX25hbWVfICsgcHN0eWxlXyArICJQcm9jZXNzb3IiOwotICAgIGlmX25hbWVfID0gc2VydmljZV9uYW1lXyArICJDb2JTdklmIjsKLQotICAgIGZpbmlzaF9jb2JfID0gInRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgIjsKLSAgICBmaW5pc2hfY29iX2RlY2xfID0gInRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+LCAiOwotICAgIGNvYl9hcmdfID0gImNvYiwgIjsKLSAgICByZXRfdHlwZV8gPSAidm9pZCAiOwotICB9IGVsc2UgewotICAgIGNsYXNzX25hbWVfID0gc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IiOwotICAgIGlmX25hbWVfID0gc2VydmljZV9uYW1lXyArICJJZiI7Ci0KLSAgICByZXRfdHlwZV8gPSAiYm9vbCAiOwotICAgIC8vIFRPRE8oZWRoYWxsKSBjYWxsQ29udGV4dCBzaG91bGQgZXZlbnR1YWxseSBiZSBhZGRlZCB0byBUQXN5bmNQcm9jZXNzb3IKLSAgICBjYWxsX2NvbnRleHRfID0gIiwgdm9pZCogY2FsbENvbnRleHQiOwotICAgIGNhbGxfY29udGV4dF9hcmdfID0gIiwgY2FsbENvbnRleHQiOwotICAgIGNhbGxfY29udGV4dF9kZWNsXyA9ICIsIHZvaWQqIjsKLSAgfQotCi0gIGZhY3RvcnlfY2xhc3NfbmFtZV8gPSBjbGFzc19uYW1lXyArICJGYWN0b3J5IjsKLQotICBpZiAoZ2VuZXJhdG9yLT5nZW5fdGVtcGxhdGVzXykgewotICAgIHRlbXBsYXRlX2hlYWRlcl8gPSAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz5cbiI7Ci0gICAgdGVtcGxhdGVfc3VmZml4XyA9ICI8UHJvdG9jb2xfPiI7Ci0gICAgdHlwZW5hbWVfc3RyXyA9ICJ0eXBlbmFtZSAiOwotICAgIGNsYXNzX25hbWVfICs9ICJUIjsKLSAgICBmYWN0b3J5X2NsYXNzX25hbWVfICs9ICJUIjsKLSAgfQotCi0gIGlmIChzZXJ2aWNlXy0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kc18gPSB0eXBlX25hbWUoc2VydmljZV8tPmdldF9leHRlbmRzKCkpICsgcHN0eWxlXyArICJQcm9jZXNzb3IiOwotICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgICAgLy8gVE9ETyhzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCi0gICAgICAvLyBwYXJlbnQgc2VydmljZXMgd2VyZSBhbHNvIGdlbmVyYXRlZCB3aXRoIHRlbXBsYXRlcyBlbmFibGVkLgotICAgICAgZXh0ZW5kc18gKz0gIlQ8UHJvdG9jb2xfPiI7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9jbGFzc19kZWZpbml0aW9uKCkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHNlcnZpY2VfLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgcGFyZW50X2NsYXNzOwotICBpZiAoc2VydmljZV8tPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIHBhcmVudF9jbGFzcyA9IGV4dGVuZHNfOwotICB9IGVsc2UgewotICAgIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKLSAgICAgIHBhcmVudF9jbGFzcyA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IiOwotICAgIH0gZWxzZSB7Ci0gICAgICBwYXJlbnRfY2xhc3MgPSAiOjphcGFjaGU6OnRocmlmdDo6VERpc3BhdGNoUHJvY2Vzc29yIjsKLSAgICB9Ci0KLSAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIHBhcmVudF9jbGFzcyArPSAiVDxQcm90b2NvbF8+IjsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9oZWFkZXJfIDw8IHRlbXBsYXRlX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZV8gPDwgIiA6IHB1YmxpYyAiIDw8IHBhcmVudF9jbGFzcyA8PCAiIHsiCi0gICAgICAgICAgICA8PCBlbmRsOwotCi0gIC8vIFByb3RlY3RlZCBkYXRhIG1lbWJlcnMKLSAgZl9oZWFkZXJfIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PCBpZl9uYW1lXyA8PCAiPiBpZmFjZV87IiA8PCBlbmRsOwotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCByZXRfdHlwZV8gPDwgImRpc3BhdGNoQ2FsbCgiIDw8IGZpbmlzaF9jb2JfCi0gICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QsICIKLSAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgIgotICAgICAgICAgICAgPDwgImNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKTsiIDw8IGVuZGw7Ci0gIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IHJldF90eXBlXyA8PCAiZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKCIgPDwgZmluaXNoX2NvYl8KLSAgICAgICAgICAgICAgPDwgIlByb3RvY29sXyogaXByb3QsIFByb3RvY29sXyogb3Byb3QsICIKLSAgICAgICAgICAgICAgPDwgImNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBQcm9jZXNzIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwotICBmX2hlYWRlcl8gPDwgIiBwcml2YXRlOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gRGVjbGFyZSBwcm9jZXNzTWFwXwotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIHZvaWQgKCIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6KiIKLSAgICAgICAgICAgIDw8ICJQcm9jZXNzRnVuY3Rpb24pKCIgPDwgZmluaXNoX2NvYl9kZWNsXyA8PCAiaW50MzJfdCwgIgotICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqLCAiCi0gICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCoiIDw8IGNhbGxfY29udGV4dF9kZWNsXyA8PCAiKTsiIDw8IGVuZGw7Ci0gIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiB2b2lkICgiIDw8IGNsYXNzX25hbWVfIDw8ICI6OioiCi0gICAgICAgICAgICAgIDw8ICJTcGVjaWFsaXplZFByb2Nlc3NGdW5jdGlvbikoIiA8PCBmaW5pc2hfY29iX2RlY2xfIDw8ICJpbnQzMl90LCAiCi0gICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qLCBQcm90b2NvbF8qIiA8PCBjYWxsX2NvbnRleHRfZGVjbF8gPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgIDw8ICJzdHJ1Y3QgUHJvY2Vzc0Z1bmN0aW9ucyB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFByb2Nlc3NGdW5jdGlvbiBnZW5lcmljOyIKLSAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBTcGVjaWFsaXplZFByb2Nlc3NGdW5jdGlvbiBzcGVjaWFsaXplZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgPDwgIiAgUHJvY2Vzc0Z1bmN0aW9ucyhQcm9jZXNzRnVuY3Rpb24gZywgIgotICAgICAgICAgICAgICA8PCAiU3BlY2lhbGl6ZWRQcm9jZXNzRnVuY3Rpb24gcykgOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgIGdlbmVyaWMoZyksIiA8PCBlbmRsCi0gICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgc3BlY2lhbGl6ZWQocykge30iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgPDwgIiAgUHJvY2Vzc0Z1bmN0aW9ucygpIDogZ2VuZXJpYyhOVUxMKSwgc3BlY2lhbGl6ZWQoTlVMTCkgIgotICAgICAgICAgICAgICA8PCAie30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgIDw8ICJ0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb25zPiAiCi0gICAgICAgICAgICAgIDw8ICJQcm9jZXNzTWFwOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gIgotICAgICAgICAgICAgICA8PCAiUHJvY2Vzc01hcDsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzTWFwIHByb2Nlc3NNYXBfOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJ2b2lkIHByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGZpbmlzaF9jb2JfCi0gICAgICAgICAgICAgICAgICAgICAgPDwgImludDMyX3Qgc2VxaWQsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90LCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90IiA8PCBjYWxsX2NvbnRleHRfIDw8ICIpOyIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgInZvaWQgcHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZmluaXNoX2NvYl8KLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnQzMl90IHNlcWlkLCBQcm90b2NvbF8qIGlwcm90LCBQcm90b2NvbF8qIG9wcm90IiA8PCBjYWxsX2NvbnRleHRfCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKLSAgICAgIC8vIFhYWCBGYWN0b3IgdGhpcyBvdXQsIGV2ZW4gaWYgaXQgaXMgYSBwYWluLgotICAgICAgc3RyaW5nIHJldF9hcmcgPSAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiLCBjb25zdCAiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgKyAiJiBfcmV0dXJuIik7Ci0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgcmV0dXJuXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgPDwgIih0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKLSAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsICIKLSAgICAgICAgICAgICAgICA8PCAidm9pZCogY3R4IiA8PCByZXRfYXJnIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgcmV0dXJuXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiKHRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgotICAgICAgICAgICAgICAgICAgPDwgIlByb3RvY29sXyogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZyA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICAvLyBYWFggRG9uJ3QgZGVjbGFyZSB0aHJvdyBpZiBpdCBkb2Vzbid0IGV4aXN0Ci0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgdGhyb3dfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICA8PCAiKHRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgotICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgdm9pZCogY3R4LCAiCi0gICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpOyIgPDwgZW5kbDsKLSAgICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgdGhyb3dfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICIodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCi0gICAgICAgICAgICAgICAgICA8PCAiUHJvdG9jb2xfKiBvcHJvdCwgdm9pZCogY3R4LCAiCi0gICAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZfaGVhZGVyXyA8PCAiIHB1YmxpYzoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZV8gPDwgIihib29zdDo6c2hhcmVkX3B0cjwiIDw8IGlmX25hbWVfCi0gICAgICAgICAgICA8PCAiPiBpZmFjZSkgOiIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzXy5lbXB0eSgpKSB7Ci0gICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kc18gPDwgIihpZmFjZSksIiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpZmFjZV8oaWZhY2UpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSAiOwotICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgICAgZl9oZWFkZXJfIDw8ICJQcm9jZXNzRnVuY3Rpb25zKCIgPDwgZW5kbDsKLSAgICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzX29ubHlfKSB7Ci0gICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICIgIE5VTEwsIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgIiAgJiIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6cHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICIgICYiIDw8IGNsYXNzX25hbWVfIDw8ICI6OnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2hlYWRlcl8gPDwgIiYiIDw8IGNsYXNzX25hbWVfIDw8ICI6OnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfaGVhZGVyXyA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IGNsYXNzX25hbWVfIDw8ICIoKSB7fSIKLSAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAvLyBHZW5lcmF0ZSBhIGJhY2t3YXJkcyBjb21wYXRpYmxlIHR5cGVkZWYsIGZvciBjYWxsZXJzIHdobyBkb24ndCBrbm93Ci0gICAgLy8gYWJvdXQgdGhlIG5ldyB0ZW1wbGF0ZS1zdHlsZSBjb2RlLgotICAgIC8vCi0gICAgLy8gV2UgY2FuJ3QgdXNlIFRQcm90b2NvbCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLCBzaW5jZSBQcm9jZXNzb3JUCi0gICAgLy8gcHJvdmlkZXMgb3ZlcmxvYWRlZCB2ZXJzaW9ucyBvZiBtb3N0IG1ldGhvZHMsIG9uZSBvZiB3aGljaCBhY2NlcHRzCi0gICAgLy8gVFByb3RvY29sIHBvaW50ZXJzLCBhbmQgb25lIHdoaWNoIGFjY2VwdHMgUHJvdG9jb2xfIHBvaW50ZXJzLiAgVGhpcwotICAgIC8vIHJlc3VsdHMgaW4gYSBjb21waWxlIGVycm9yIGlmIGluc3RhbnRpYXRlZCB3aXRoIFByb3RvY29sXyA9PSBUUHJvdG9jb2wuCi0gICAgLy8gVGhlcmVmb3JlLCB3ZSBkZWZpbmUgVER1bW15UHJvdG9jb2wgc29sZWx5IHNvIHdlIGNhbiB1c2UgaXQgYXMgdGhlCi0gICAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyIGhlcmUuCi0gICAgZl9oZWFkZXJfIDw8ICJ0eXBlZGVmICIgPDwgY2xhc3NfbmFtZV8gPDwgIjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlREdW1teVByb3RvY29sID4gIgotICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8IHBzdHlsZV8gPDwgIlByb2Nlc3NvcjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChib29sIHRlbXBsYXRlX3Byb3RvY29sKSB7Ci0gIHN0cmluZyBwcm90b2NvbCA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIjsKLSAgc3RyaW5nIGZ1bmN0aW9uX3N1ZmZpeDsKLSAgaWYgKHRlbXBsYXRlX3Byb3RvY29sKSB7Ci0gICAgcHJvdG9jb2wgPSAiUHJvdG9jb2xfIjsKLSAgICAvLyBXZSBjYWxsIHRoZSBnZW5lcmljIHZlcnNpb24gZGlzcGF0Y2hDYWxsKCksIGFuZCB0aGUgc3BlY2lhbGl6ZWQKLSAgICAvLyB2ZXJzaW9uIGRpc3BhdGNoQ2FsbFRlbXBsYXRlZCgpLiAgV2UgY2FuJ3QgY2FsbCB0aGVtIGJvdGgKLSAgICAvLyBkaXNwYXRjaENhbGwoKSwgc2luY2UgdGhpcyB3aWxsIGNhdXNlIHRoZSBjb21waWxlciB0byBpc3N1ZSBhIHdhcm5pbmcgaWYKLSAgICAvLyBhIHNlcnZpY2UgdGhhdCBkb2Vzbid0IHVzZSB0ZW1wbGF0ZXMgaW5oZXJpdHMgZnJvbSBhIHNlcnZpY2UgdGhhdCBkb2VzCi0gICAgLy8gdXNlIHRlbXBsYXRlczogdGhlIGNvbXBpbGVyIGNvbXBsYWlucyB0aGF0IHRoZSBzdWJjbGFzcyBvbmx5IGltcGxlbWVudHMKLSAgICAvLyB0aGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIGRpc3BhdGNoQ2FsbCgpLCBhbmQgaGlkZXMgdGhlIHRlbXBsYXRlZCB2ZXJzaW9uLgotICAgIC8vIFVzaW5nIGRpZmZlcmVudCBuYW1lcyBmb3IgdGhlIHR3byBmdW5jdGlvbnMgcHJldmVudHMgdGhpcy4KLSAgICBmdW5jdGlvbl9zdWZmaXggPSAiVGVtcGxhdGVkIjsKLSAgfQotCi0gIGZfb3V0XyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8IHJldF90eXBlXyA8PCBjbGFzc19uYW1lXyA8PCB0ZW1wbGF0ZV9zdWZmaXhfIDw8ICI6OmRpc3BhdGNoQ2FsbCIKLSAgICAgICAgIDw8IGZ1bmN0aW9uX3N1ZmZpeCA8PCAiKCIgPDwgZmluaXNoX2NvYl8gPDwgcHJvdG9jb2wgPDwgIiogaXByb3QsICIgPDwgcHJvdG9jb2wKLSAgICAgICAgIDw8ICIqIG9wcm90LCAiCi0gICAgICAgICA8PCAiY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfIDw8ICIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEhPVDogbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIgbWFwCi0gIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCB0eXBlbmFtZV9zdHJfIDw8ICJQcm9jZXNzTWFwOjppdGVyYXRvciBwZm47IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICA8PCAicGZuID0gcHJvY2Vzc01hcF8uZmluZChmbmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICA8PCAiaWYgKHBmbiA9PSBwcm9jZXNzTWFwXy5lbmQoKSkgeyIgPDwgZW5kbDsKLSAgaWYgKGV4dGVuZHNfLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QtPnNraXAoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgPDwgIiAgaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgIDw8ICIgIGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICA8PCAiICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24gIgotICAgICAgICAgICAgICAieCg6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICIKLSAgICAgICAgICAgICAgIidcIitmbmFtZStcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgIDw8ICIgIG9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihmbmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IgotICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICA8PCAiICBvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgIDw8ICIgIG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gIiAgcmV0dXJuIGNvYih0cnVlKTsiIDogIiAgcmV0dXJuIHRydWU7IikgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXh0ZW5kc18gPDwgIjo6ZGlzcGF0Y2hDYWxsKCIKLSAgICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJjb2IsICIgOiAiIikgPDwgImlwcm90LCBvcHJvdCwgZm5hbWUsIHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfYXJnXwotICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBpZiAodGVtcGxhdGVfcHJvdG9jb2wpIHsKLSAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kLnNwZWNpYWxpemVkKSkiOwotICB9IGVsc2UgewotICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzX29ubHlfKSB7Ci0gICAgICAvLyBUT0RPOiBUaGlzIGlzIGEgbnVsbCBwb2ludGVyLCBzbyBub3RoaW5nIGdvb2Qgd2lsbCBjb21lIGZyb20gY2FsbGluZwotICAgICAgLy8gaXQuICBUaHJvdyBhbiBleGNlcHRpb24gaW5zdGVhZC4KLSAgICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQuZ2VuZXJpYykpIjsKLSAgICB9IGVsc2UgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kLmdlbmVyaWMpKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQpKSI7Ci0gICAgfQotICB9Ci0gIGZfb3V0XyA8PCAiKCIgPDwgY29iX2FyZ18gPDwgInNlcWlkLCBpcHJvdCwgb3Byb3QiIDw8IGNhbGxfY29udGV4dF9hcmdfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBUT0RPKGRyZWlzcyk6IHJldHVybiBwZm4gcmV0PwotICBpZiAoc3R5bGVfID09ICJDb2IiKSB7Ci0gICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9vdXRfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9ucygpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSBzZXJ2aWNlXy0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBnZW5lcmF0b3JfLT5nZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHNlcnZpY2VfLCAqZl9pdGVyLCBzdHlsZV8sIGZhbHNlKTsKLSAgICAgIGdlbmVyYXRvcl8tPmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc2VydmljZV8sICpmX2l0ZXIsIHN0eWxlXywgdHJ1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRvcl8tPmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc2VydmljZV8sICpmX2l0ZXIsIHN0eWxlXywgZmFsc2UpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfZmFjdG9yeSgpIHsKLSAgc3RyaW5nIGlmX2ZhY3RvcnlfbmFtZSA9IGlmX25hbWVfICsgIkZhY3RvcnkiOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBmYWN0b3J5IGNsYXNzIGRlZmluaXRpb24KLSAgZl9oZWFkZXJfIDw8IHRlbXBsYXRlX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgZmFjdG9yeV9jbGFzc19uYW1lXyA8PCAiIDogcHVibGljIDo6YXBhY2hlOjp0aHJpZnQ6OiIKLSAgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvckZhY3RvcnkiIDogIlRQcm9jZXNzb3JGYWN0b3J5IikgPDwgIiB7IgotICAgICAgICAgICAgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBmYWN0b3J5X2NsYXNzX25hbWVfIDw8ICIoY29uc3QgOjpib29zdDo6c2hhcmVkX3B0cjwgIiA8PCBpZl9mYWN0b3J5X25hbWUKLSAgICAgICAgICAgIDw8ICIgPiYgaGFuZGxlckZhY3RvcnkpIDoiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgIDw8ICIgICAgaGFuZGxlckZhY3RvcnlfKGhhbmRsZXJGYWN0b3J5KSB7fSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAiOjpib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6IgotICAgICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yIiA6ICJUUHJvY2Vzc29yIikgPDwgIiA+ICIKLSAgICAgICAgICAgIDw8ICJnZXRQcm9jZXNzb3IoY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbyk7IiA8PCBlbmRsOwotCi0gIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpib29zdDo6c2hhcmVkX3B0cjwgIgotICAgICAgICAgICAgPDwgaWZfZmFjdG9yeV9uYW1lIDw8ICIgPiBoYW5kbGVyRmFjdG9yeV87IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBJZiB3ZSBhcmUgZ2VuZXJhdGluZyB0ZW1wbGF0ZXMsIG91dHB1dCBhIHR5cGVkZWYgZm9yIHRoZSBwbGFpbgotICAvLyBmYWN0b3J5IG5hbWUuCi0gIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgIGZfaGVhZGVyXyA8PCAidHlwZWRlZiAiIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8KLSAgICAgICAgICAgICAgPDwgIjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlREdW1teVByb3RvY29sID4gIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHBzdHlsZV8KLSAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvckZhY3Rvcnk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZ2V0UHJvY2Vzc29yKCkgbWV0aG9kCi0gIGZfb3V0XyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICI6OmJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiCi0gICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3IiIDogIlRQcm9jZXNzb3IiKSA8PCAiID4gIgotICAgICAgICAgPDwgZmFjdG9yeV9jbGFzc19uYW1lXyA8PCB0ZW1wbGF0ZV9zdWZmaXhfIDw8ICI6OmdldFByb2Nlc3NvcigiCi0gICAgICAgICA8PCAiY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpSZWxlYXNlSGFuZGxlcjwgIiA8PCBpZl9mYWN0b3J5X25hbWUKLSAgICAgICAgIDw8ICIgPiBjbGVhbnVwKGhhbmRsZXJGYWN0b3J5Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OmJvb3N0OjpzaGFyZWRfcHRyPCAiCi0gICAgICAgICA8PCBpZl9uYW1lXyA8PCAiID4gaGFuZGxlcigiCi0gICAgICAgICA8PCAiaGFuZGxlckZhY3RvcnlfLT5nZXRIYW5kbGVyKGNvbm5JbmZvKSwgY2xlYW51cCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICA8PCAiOjpib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6IgotICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yIiA6ICJUUHJvY2Vzc29yIikgPDwgIiA+ICIKLSAgICAgICAgIDw8ICJwcm9jZXNzb3IobmV3ICIgPDwgY2xhc3NfbmFtZV8gPDwgdGVtcGxhdGVfc3VmZml4XyA8PCAiKGhhbmRsZXIpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgIDw8ICJyZXR1cm4gcHJvY2Vzc29yOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX291dF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHByb2Nlc3NvciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb2Nlc3NvciBmb3IuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKLSAgUHJvY2Vzc29yR2VuZXJhdG9yIGdlbmVyYXRvcih0aGlzLCB0c2VydmljZSwgc3R5bGUpOwotICBnZW5lcmF0b3IucnVuKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6b2ZzdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCAmcmVzdWx0LCBmYWxzZSk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgJnJlc3VsdCk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgJnJlc3VsdCk7Ci0KLSAgcmVzdWx0LnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9wcmVzdWx0Iik7Ci0gIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX2hlYWRlcl8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlLCBnZW5fY29iX3N0eWxlXyk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgJnJlc3VsdCwgdHJ1ZSk7Ci0gIGlmIChnZW5fY29iX3N0eWxlXykgewotICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCAmcmVzdWx0LCB0cnVlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNwZWNpYWxpemVkKSB7Ci0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBzdHJpbmcgc2VydmljZV9mdW5jX25hbWUgPSAiXCIiICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiLiIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiXCIiOwotCi0gIHN0ZDo6b2ZzdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7Ci0KLSAgc3RyaW5nIHByb3RfdHlwZSA9IChzcGVjaWFsaXplZCA/ICJQcm90b2NvbF8iIDogIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiKTsKLSAgc3RyaW5nIGNsYXNzX3N1ZmZpeDsKLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgY2xhc3Nfc3VmZml4ID0gIlQ8UHJvdG9jb2xfPiI7Ci0gIH0KLQotICAvLyBJIHRyaWVkIHRvIGRvIHRoaXMgYXMgb25lIGZ1bmN0aW9uLiAgSSByZWFsbHkgZGlkLiAgQnV0IGl0IHdhcyB0b28gaGFyZC4KLSAgaWYgKHN0eWxlICE9ICJDb2IiKSB7Ci0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgY29uc3QgYm9vbCB1bm5hbWVkX29wcm90X3NlcWlkID0gdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCk7Ci0gICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OiIKLSAgICAgICAgPDwgInByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiCi0gICAgICAgIDw8ICJpbnQzMl90IiA8PCAodW5uYW1lZF9vcHJvdF9zZXFpZCA/ICIsICIgOiAiIHNlcWlkLCAiKSA8PCBwcm90X3R5cGUgPDwgIiogaXByb3QsICIKLSAgICAgICAgPDwgcHJvdF90eXBlIDw8ICIqIiA8PCAodW5uYW1lZF9vcHJvdF9zZXFpZCA/ICIsICIgOiAiIG9wcm90LCAiKSA8PCAidm9pZCogY2FsbENvbnRleHQpIgotICAgICAgICA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF1bm5hbWVkX29wcm90X3NlcWlkKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBzZXFpZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBvcHJvdDsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkKiBjdHggPSBOVUxMOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgY2FsbENvbnRleHQpOyIKLSAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiCi0gICAgICAgIDw8ICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlUmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAidWludDMyX3QgYnl0ZXMgPSBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0UmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gRGVjbGFyZSByZXN1bHQKLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0OyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBUcnkgYmxvY2sgZm9yIGZ1bmN0aW9ucyB3aXRoIGV4Y2VwdGlvbnMKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG91dCA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHJlc3VsdC5zdWNjZXNzIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICB9Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuc3VjY2VzcyA9IHRydWU7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAmIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IgotICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIn0iOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwgIiBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYpIHsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgoZS53aGF0KCkpOyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+YXN5bmNDb21wbGV0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImJ5dGVzID0gb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gQ29iIHN0eWxlLgotICBlbHNlIHsKLSAgICAvLyBQcm9jZXNzb3IgZW50cnkgcG9pbnQuCi0gICAgLy8gVE9ETyhlZGhhbGwpIHVwZGF0ZSBmb3IgY2FsbENvbnRleHQgd2hlbiBURXZlbnRTZXJ2ZXIgaXMgcmVhZHkKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OnByb2Nlc3NfIgotICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIih0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKLSAgICAgICAgPDwgcHJvdF90eXBlIDw8ICIqIGlwcm90LCAiIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFRPRE8oc2ltcGtpbnMpOiB3ZSBjb3VsZCB0cnkgdG8gY29uc29sZGF0ZSB0aGlzCi0gICAgLy8gd2l0aCB0aGUgbm9uLWNvYiBjb2RlIGFib3ZlCi0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCkgewotICAgICAgLy8gSWYgdGhlc2UgYXJlIGluc3RhbmNlcyBvZiBQcm90b2NvbF8sIGluc3RlYWQgb2YgYW55IG9sZCBUUHJvdG9jb2wsCi0gICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHByb2Nlc3MgZnVuY3Rpb24gaW5zdGVhZC4KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfaXByb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4oaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgImlmIChfaXByb3QgJiYgX29wcm90KSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwcm9jZXNzXyIKLSAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihjb2IsIHNlcWlkLCBfaXByb3QsIF9vcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IgotICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBpcHJvdCwgX2lwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBzZXFpZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBvcHJvdDsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfYXJncyBhcmdzOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAidm9pZCogY3R4ID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIE5VTEwpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiCi0gICAgICAgIDw8ICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVSZWFkKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgInVpbnQzMl90IGJ5dGVzID0gaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RSZWFkKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIC8vIFRPRE8oZHJlaXNzKTogSGFuZGxlIFRFeGNlcHRpb25zPyAgRXhwb3NlIHRvIHNlcnZlcj8KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICAgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGNvYihmYWxzZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmFzeW5jQ29tcGxldGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICAvLyBUT0RPKGRyZWlzcyk6IEZpZ3VyZSBvdXQgYSBzdHJhdGVneSBmb3IgZXhjZXB0aW9ucyBpbiBhc3luYyBoYW5kbGVycy4KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZyZWVyLnVucmVnaXN0ZXIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIC8vIE5vIHJldHVybi4gIEp1c3QgaGFuZCBvZmYgb3VyIGNvYi4KLSAgICAgIC8vIFRPRE8oZHJlaXNzKTogQ2FsbCB0aGUgY29iIGltbWVkaWF0ZWx5PwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIgotICAgICAgICAgIDw8ICJ0Y3h4OjpiaW5kKGNvYiwgdHJ1ZSkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHJpbmcgcmV0X2FyZywgcmV0X3BsYWNlaG9sZGVyOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICByZXRfYXJnID0gIiwgY29uc3QgIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiI7Ci0gICAgICAgIHJldF9wbGFjZWhvbGRlciA9ICIsIHRjeHg6OnBsYWNlaG9sZGVyczo6XzEiOwotICAgICAgfQotCi0gICAgICAvLyBXaGVuIGdlbl90ZW1wbGF0ZXNfIGlzIHRydWUsIHRoZSByZXR1cm5fIGFuZCB0aHJvd18gZnVuY3Rpb25zIGFyZQotICAgICAgLy8gb3ZlcmxvYWRlZC4gIFdlIGhhdmUgdG8gZGVjbGFyZSBwb2ludGVycyB0byB0aGVtIHNvIHRoYXQgdGhlIGNvbXBpbGVyCi0gICAgICAvLyBjYW4gcmVzb2x2ZSB0aGUgY29ycmVjdCBvdmVybG9hZGVkIHZlcnNpb24uCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKLSAgICAgICAgICA8PCAiOjoqcmV0dXJuX2ZuKSh0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiAiCi0gICAgICAgICAgPDwgImNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZwotICAgICAgICAgIDw8ICIpID0iIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgJiIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKLSAgICAgICAgICA8PCAiOjpyZXR1cm5fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXhjZXB0aW9ucy5lbXB0eSgpKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCAoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeAotICAgICAgICAgICAgPDwgIjo6KnRocm93X2ZuKSh0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiAiCi0gICAgICAgICAgICA8PCAiY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4LCAiCi0gICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdykgPSIgPDwgZW5kbDsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICYiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4Ci0gICAgICAgICAgICA8PCAiOjp0aHJvd18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGN4eDo6YmluZChyZXR1cm5fZm4sIHRoaXMsIGNvYiwgc2VxaWQsIG9wcm90LCBjdHgiIDw8IHJldF9wbGFjZWhvbGRlcgotICAgICAgICAgIDw8ICIpIjsKLSAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKLSAgICAgICAgb3V0IDw8ICcsJyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ0Y3h4OjpiaW5kKHRocm93X2ZuLCB0aGlzLCBjb2IsIHNlcWlkLCBvcHJvdCwgIgotICAgICAgICAgICAgPDwgImN0eCwgdGN4eDo6cGxhY2Vob2xkZXJzOjpfMSkiOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFhYWCBXaGl0ZXNwYWNlIGNsZWFudXAuCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIG91dCA8PCAnLCcgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotCi0gICAgLy8gTm9ybWFsIHJldHVybi4KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyByZXRfYXJnX2RlY2wsIHJldF9hcmdfbmFtZTsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgcmV0X2FyZ19kZWNsID0gIiwgY29uc3QgIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiI7Ci0gICAgICAgIHJldF9hcmdfbmFtZSA9ICIsIF9yZXR1cm4iOwotICAgICAgfQotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjpyZXR1cm5fIgotICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgotICAgICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4IiA8PCByZXRfYXJnX2RlY2wgPDwgJyknIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7Ci0gICAgICAgIC8vIElmIG9wcm90IGlzIGEgUHJvdG9jb2xfIGluc3RhbmNlLAotICAgICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHJldHVybiBmdW5jdGlvbiBpbnN0ZWFkLgotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX29wcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG9wcm90KTsiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoX29wcm90KSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXR1cm5fIgotICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoY29iLCBzZXFpZCwgX29wcm90LCBjdHgiIDw8IHJldF9hcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3Byb3QsIF9vcHJvdCk7IgotICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiX3ByZXN1bHQgcmVzdWx0OyIKLSAgICAgICAgICA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAvLyBUaGUgY29uc3RfY2FzdCBoZXJlIGlzIHVuZm9ydHVuYXRlLCBidXQgaXQgd291bGQgYmUgYSBwYWluIHRvIGF2b2lkLAotICAgICAgICAvLyBhbmQgd2Ugb25seSBkbyBhIHdyaXRlIHdpdGggdGhpcyBzdHJ1Y3QsIHdoaWNoIGlzIGNvbnN0LXNhZmUuCi0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBjb25zdF9jYXN0PCIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkKLSAgICAgICAgICAgIDw8ICIqPigmX3JldHVybik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC5zdWNjZXNzID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0Ci0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKCIKLSAgICAgICAgICA8PCAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIgotICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IgotICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IGJ5dGVzID0gb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0V3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBFeGNlcHRpb24gcmV0dXJuLgotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAheGNlcHRpb25zLmVtcHR5KCkpIHsKLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6dGhyb3dfIgotICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgotICAgICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4LCAiCi0gICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCkgewotICAgICAgICAvLyBJZiBvcHJvdCBpcyBhIFByb3RvY29sXyBpbnN0YW5jZSwKLSAgICAgICAgLy8gdXNlIHRoZSBzcGVjaWFsaXplZCB0aHJvdyBmdW5jdGlvbiBpbnN0ZWFkLgotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX29wcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG9wcm90KTsiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoX29wcm90KSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJvd18iCi0gICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihjb2IsIHNlcWlkLCBfb3Byb3QsIGN0eCwgX3Rocm93KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3Byb3QsIF9vcHJvdCk7IiA8PCBlbmRsCi0gICAgICAgICAgICA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBHZXQgdGhlIGV2ZW50IGhhbmRsZXIgY29udGV4dAotICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiCi0gICAgICAgICAgPDwgInRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgLy8gVGhyb3cgdGhlIFREZWxheWVkRXhjZXB0aW9uLCBhbmQgY2F0Y2ggdGhlIHJlc3VsdAotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIl9yZXN1bHQgcmVzdWx0OyIKLSAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl90aHJvdy0+dGhyb3dfaXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IoZmFsc2UpOyIKLSAgICAgICAgICA8PCBlbmRsOyAvLyBJcyB0aGlzIHBvc3NpYmxlPyAgVEJELgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAnfSc7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBvdXQgPDwgIiAgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAmIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiCi0gICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbiBpcyB0aHJvd24KLSAgICAgIG91dCA8PCAiIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+aGFuZGxlckVycm9yKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KGUud2hhdCgpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgLy8gV2UgcGFzcyB0cnVlIHRvIHRoZSBjb2IgaGVyZSwgc2luY2Ugd2UgZGlkIHN1Y2Nlc3NmdWxseSB3cml0ZSBhCi0gICAgICAgICAgLy8gcmVzcG9uc2UsIGV2ZW4gdGhvdWdoIGl0IGlzIGFuIGV4Y2VwdGlvbiByZXNwb25zZS4KLSAgICAgICAgICAvLyBJdCBsb29rcyBsaWtlIHRoZSBhcmd1bWVudCBpcyBjdXJyZW50bHkgaWdub3JlZCwgYW55d2F5LgotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gY29iKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgICAgLy8gU2VyaWFsaXplIHRoZSByZXN1bHQgaW50byBhIHN0cnVjdAotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlV3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIKLSAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIKLSAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCBieXRlcyA9IG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IodHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfSAvLyBmb3IgZWFjaCBmdW5jdGlvbgotICB9ICAgLy8gY29iIHN0eWxlCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2tlbGV0b24gZmlsZSBvZiBhIHNlcnZlcgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKLQotICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKLSAgc3RyaW5nIGZfc2tlbGV0b25fbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIl9zZXJ2ZXIuc2tlbGV0b24uY3BwIjsKLQotICBzdHJpbmcgbnMgPSBuYW1lc3BhY2VfcHJlZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7Ci0KLSAgb2ZzdHJlYW0gZl9za2VsZXRvbjsKLSAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25fbmFtZS5jX3N0cigpKTsKLSAgZl9za2VsZXRvbiA8PCAiLy8gVGhpcyBhdXRvZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIGJ1aWxkIGEgc2VydmVyLiIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIvLyBZb3Ugc2hvdWxkIGNvcHkgaXQgdG8gYW5vdGhlciBmaWxlbmFtZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdC4iIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4iIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPiIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPiIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7IiA8PCBlbmRsIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAidXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIG5vdCBjb21waWxlOgotICAvLyB1c2luZyBuYW1lc3BhY2UgOwotICAvLyB1c2luZyBuYW1lc3BhY2UgOjo7Ci0gIGlmICgoIW5zLmVtcHR5KCkpICYmIChucy5jb21wYXJlKCIgOjoiKSAhPSAwKSkgewotICAgIGZfc2tlbGV0b24gPDwgInVzaW5nIG5hbWVzcGFjZSAiIDw8IHN0cmluZyhucywgMCwgbnMuc2l6ZSgpIC0gMikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2tlbGV0b24gPDwgImNsYXNzICIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlciA6IHZpcnR1YWwgcHVibGljICIgPDwgc3ZjbmFtZSA8PCAiSWYgeyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2tlbGV0b24sICpmX2l0ZXIpOwotICAgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiKSA8PCAiIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgIC8vIFlvdXIgaW1wbGVtZW50YXRpb24gZ29lcyBoZXJlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHByaW50ZihcIiIKLSAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXFxuXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9za2VsZXRvbiA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8ICJpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NrZWxldG9uCi0gICAgICA8PCBpbmRlbnQoKSA8PCAiaW50IHBvcnQgPSA5MDkwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjwiIDw8IHN2Y25hbWUKLSAgICAgIDw8ICJIYW5kbGVyPiBoYW5kbGVyKG5ldyAiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAic2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3ICIgPDwgc3ZjbmFtZSA8PCAiUHJvY2Vzc29yKGhhbmRsZXIpKTsiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7IgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgInNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7IgotICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiVFNpbXBsZVNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7IgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VydmVyLnNlcnZlKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2tlbGV0b24gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBDbG9zZSB0aGUgZmlsZXMKLSAgZl9za2VsZXRvbi5jbG9zZSgpOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgaXNfcmVmZXJlbmNlKHRmaWVsZCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+IjsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgInJlYWRCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgb3V0IDw8ICJyZWFkSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAicmVhZEk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIHJlYWRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoImVjYXN0Iik7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpbnQzMl90ICIgPDwgdCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZEkzMigiIDw8IHQKLSAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKLSAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQotICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKLSAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIpIHsKLSAgaWYgKHBvaW50ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCEiIDw8IHByZWZpeCA8PCAiKSB7ICIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHByZWZpeCA8PCAiID0gYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIj4obmV3ICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICItPnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCB3YXNTZXQgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBmX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLT5fX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiKSB7IHdhc1NldCA9IHRydWU7IH0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXdhc1NldCkgeyAiIDw8IHByZWZpeCA8PCAiLnJlc2V0KCk7IH0iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0KLSAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOwotICBib29sIHVzZV9wdXNoID0gdGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuY2xlYXIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIgPDwgc2l6ZSA8PCAiOyIgPDwgZW5kbDsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwga3R5cGUgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IHZ0eXBlIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTWFwQmVnaW4oIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBldHlwZSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAieGZlciArPSBpcHJvdC0+cmVhZFNldEJlZ2luKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBldHlwZSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAieGZlciArPSBpcHJvdC0+cmVhZExpc3RCZWdpbigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCF1c2VfcHVzaCkgewotICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucmVzaXplKCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IGkgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkKLSAgICAgIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCwgdXNlX3B1c2gsIGkpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGtleQotICAgICAgICAgICAgICA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5pbnNlcnQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9wdXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgpIHsKLSAgaWYgKHVzZV9wdXNoKSB7Ci0gICAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gICAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLSAgICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0gICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaF9iYWNrKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBwcmVmaXggKyAiWyIgKyBpbmRleCArICJdIik7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgaXNfcmVmZXJlbmNlKHRmaWVsZCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIHdyaXRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpCi0gICAgICAgICAgICArIG5hbWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoKGludDMyX3QpIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgbmFtZS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyKSB7Ci0gIGlmIChwb2ludGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUob3Byb3QpOyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IgotICAgICAgICAgICAgICAgIDw8ICJvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCAic3RhdGljX2Nhc3Q8dWludDMyX3Q+KCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCAic3RhdGljX2Nhc3Q8dWludDMyX3Q+KCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVMaXN0QmVnaW4oIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCAic3RhdGljX2Nhc3Q8dWludDMyX3Q+KCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICI6OmNvbnN0X2l0ZXJhdG9yICIgPDwgaXRlciA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgImZvciAoIiA8PCBpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmJlZ2luKCk7ICIgPDwgaXRlciA8PCAiICE9ICIgPDwgcHJlZml4Ci0gICAgICA8PCAiLmVuZCgpOyArKyIgPDwgaXRlciA8PCAiKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLT5maXJzdCIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGl0ZXIgKyAiLT5zZWNvbmQiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgIigqIiArIGl0ZXIgKyAiKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICIoKiIgKyBpdGVyICsgIikiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIE1ha2VzIGEgOjogcHJlZml4IGZvciBhIG5hbWVzcGFjZQotICoKLSAqIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlLCB3LyBwZXJpb2RzIGluIGl0Ci0gKiBAcmV0dXJuIE5hbWVzcGFjZXMKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX3ByZWZpeChzdHJpbmcgbnMpIHsKLSAgLy8gQWx3YXlzIHN0YXJ0IHdpdGggIjo6IiwgdG8gYXZvaWQgcG9zc2libGUgbmFtZSBjb2xsaXNpb25zIHdpdGgKLSAgLy8gb3RoZXIgbmFtZXMgaW4gb25lIG9mIHRoZSBjdXJyZW50IG5hbWVzcGFjZXMuCi0gIC8vCi0gIC8vIFdlIGFsc28gbmVlZCBhIGxlYWRpbmcgc3BhY2UsIGluIGNhc2UgdGhlIG5hbWUgaXMgdXNlZCBpbnNpZGUgb2YgYQotICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICAiTXlUZW1wbGF0ZTw6OmZvbzo6QmFyPiIgaXMgbm90IHZhbGlkIEMrKywKLSAgLy8gc2luY2UgIjw6IiBpcyBhbiBhbHRlcm5hdGl2ZSB0b2tlbiBmb3IgIlsiLgotICBzdHJpbmcgcmVzdWx0ID0gIiA6OiI7Ci0KLSAgaWYgKG5zLnNpemUoKSA9PSAwKSB7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7Ci0gICAgcmVzdWx0ICs9ICI6OiI7Ci0gICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7Ci0gIH0KLSAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgKz0gbnMgKyAiOjoiOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogT3BlbnMgbmFtZXNwYWNlLgotICoKLSAqIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlLCB3LyBwZXJpb2RzIGluIGl0Ci0gKiBAcmV0dXJuIE5hbWVzcGFjZXMKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX29wZW4oc3RyaW5nIG5zKSB7Ci0gIGlmIChucy5zaXplKCkgPT0gMCkgewotICAgIHJldHVybiAiIjsKLSAgfQotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIHN0cmluZyBzZXBhcmF0b3IgPSAiIjsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmVzdWx0ICs9IHNlcGFyYXRvcjsKLSAgICByZXN1bHQgKz0gIm5hbWVzcGFjZSAiOwotICAgIHJlc3VsdCArPSBucy5zdWJzdHIoMCwgbG9jKTsKLSAgICByZXN1bHQgKz0gIiB7IjsKLSAgICBzZXBhcmF0b3IgPSAiICI7Ci0gICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7Ci0gIH0KLSAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgKz0gc2VwYXJhdG9yICsgIm5hbWVzcGFjZSAiICsgbnMgKyAiIHsiOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ2xvc2VzIG5hbWVzcGFjZS4KLSAqCi0gKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAotICogQHJldHVybiBOYW1lc3BhY2VzCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9jbG9zZShzdHJpbmcgbnMpIHsKLSAgaWYgKG5zLnNpemUoKSA9PSAwKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIHN0cmluZyByZXN1bHQgPSAifSI7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJlc3VsdCArPSAifSI7Ci0gICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7Ci0gIH0KLSAgcmVzdWx0ICs9ICIgLy8gbmFtZXNwYWNlIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgQysrIHR5cGUgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHR5cGUgbmFtZSwgaS5lLiBzdGQ6OnNldDx0eXBlPgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGFyZykgewotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIGJuYW1lID0gYmFzZV90eXBlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKTsKLSAgICBzdGQ6Om1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdHR5cGUtPmFubm90YXRpb25zXy5maW5kKCJjcHAudHlwZSIpOwotICAgIGlmIChpdCAhPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7Ci0gICAgICBibmFtZSA9IGl0LT5zZWNvbmQ7Ci0gICAgfQotCi0gICAgaWYgKCFhcmcpIHsKLSAgICAgIHJldHVybiBibmFtZTsKLSAgICB9Ci0KLSAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWUgKyAiJiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lOwotICAgIH0KLSAgfQotCi0gIC8vIENoZWNrIGZvciBhIGN1c3RvbSBvdmVybG9hZGVkIEMrKyBuYW1lCi0gIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBzdHJpbmcgY25hbWU7Ci0KLSAgICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHR5cGU7Ci0gICAgaWYgKHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpKSB7Ci0gICAgICBjbmFtZSA9IHRjb250YWluZXItPmdldF9jcHBfbmFtZSgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7Ci0gICAgICBjbmFtZSA9ICJzdGQ6Om1hcDwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpbl90eXBlZGVmKSArICIsICIKLSAgICAgICAgICAgICAgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOwotICAgICAgY25hbWUgPSAic3RkOjpzZXQ8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKLSAgICAgIGNuYW1lID0gInN0ZDo6dmVjdG9yPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOwotICAgIH0KLQotICAgIGlmIChhcmcpIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIGNuYW1lICsgIiYiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gY25hbWU7Ci0gICAgfQotICB9Ci0KLSAgc3RyaW5nIGNsYXNzX3ByZWZpeDsKLSAgaWYgKGluX3R5cGVkZWYgJiYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICBjbGFzc19wcmVmaXggPSAiY2xhc3MgIjsKLSAgfQotCi0gIC8vIENoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIG5hbWVzcGFjZWQKLSAgc3RyaW5nIHBuYW1lOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcG5hbWUgPSBjbGFzc19wcmVmaXggKyBuYW1lc3BhY2VfcHJlZml4KHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNwcCIpKSArIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9IGVsc2UgewotICAgIHBuYW1lID0gY2xhc3NfcHJlZml4ICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2VudW0oKSAmJiAhZ2VuX3B1cmVfZW51bXNfKSB7Ci0gICAgcG5hbWUgKz0gIjo6dHlwZSI7Ci0gIH0KLQotICBpZiAoYXJnKSB7Ci0gICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0dHlwZSkpIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lICsgIiYiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHBuYW1lOwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgQysrIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCi0gKgotICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKLSAqIEByZXR1cm4gRXhwbGljaXQgQysrIHR5cGUsIGkuZS4gImludDMyX3QiCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpIHsKLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgcmV0dXJuICJzdGQ6OnN0cmluZyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gImJvb2wiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuICJpbnQ4X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICByZXR1cm4gImludDE2X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludDMyX3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICByZXR1cm4gImludDY0X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICByZXR1cm4gImRvdWJsZSI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEByZXR1cm4gRmllbGQgZGVjbGFyYXRpb24sIGkuZS4gaW50IHggPSAwOwotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVmZXJlbmNlKSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGlmIChjb25zdGFudCkgewotICAgIHJlc3VsdCArPSAiY29uc3QgIjsKLSAgfQotICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmIChpc19yZWZlcmVuY2UodGZpZWxkKSkgewotICAgIHJlc3VsdCA9ICJib29zdDo6c2hhcmVkX3B0cjwiICsgcmVzdWx0ICsgIj4iOwotICB9Ci0gIGlmIChwb2ludGVyKSB7Ci0gICAgcmVzdWx0ICs9ICIqIjsKLSAgfQotICBpZiAocmVmZXJlbmNlKSB7Ci0gICAgcmVzdWx0ICs9ICImIjsKLSAgfQotICByZXN1bHQgKz0gIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR5cGUpICsgIikwIjsKLSAgICB9Ci0gIH0KLSAgaWYgKCFyZWZlcmVuY2UpIHsKLSAgICByZXN1bHQgKz0gIjsiOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmFtZV9wYXJhbXMpIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGJvb2wgaGFzX3hjZXB0aW9ucyA9ICF0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpOwotCi0gIGlmIChzdHlsZSA9PSAiIikgewotICAgIGlmIChpc19jb21wbGV4X3R5cGUodHR5cGUpKSB7Ci0gICAgICByZXR1cm4gInZvaWQgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIHR5cGVfbmFtZSh0dHlwZSkKLSAgICAgICAgICAgICArIChuYW1lX3BhcmFtcyA/ICImIF9yZXR1cm4iIDogIiYgLyogX3JldHVybiAqLyIpCi0gICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zLCB0cnVlKSArICIpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIKLSAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMpICsgIikiOwotICAgIH0KLSAgfSBlbHNlIGlmIChzdHlsZS5zdWJzdHIoMCwgMykgPT0gIkNvYiIpIHsKLSAgICBzdHJpbmcgY29iX3R5cGU7Ci0gICAgc3RyaW5nIGV4bl9jb2I7Ci0gICAgaWYgKHN0eWxlID09ICJDb2JDbCIpIHsKLSAgICAgIGNvYl90eXBlID0gIigiICsgc2VydmljZV9uYW1lXyArICJDb2JDbGllbnQiOwotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgIGNvYl90eXBlICs9ICJUPFByb3RvY29sXz4iOwotICAgICAgfQotICAgICAgY29iX3R5cGUgKz0gIiogY2xpZW50KSI7Ci0gICAgfSBlbHNlIGlmIChzdHlsZSA9PSAiQ29iU3YiKSB7Ci0gICAgICBjb2JfdHlwZSA9ICh0dHlwZS0+aXNfdm9pZCgpID8gIigpIiA6ICgiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIiBjb25zdCYgX3JldHVybikiKSk7Ci0gICAgICBpZiAoaGFzX3hjZXB0aW9ucykgewotICAgICAgICBleG5fY29iCi0gICAgICAgICAgICA9ICIsIHRjeHg6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IC8qIGV4bl9jb2IgKi8iOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyAiVU5LTk9XTiBTVFlMRSI7Ci0gICAgfQotCi0gICAgcmV0dXJuICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKHRjeHg6OmZ1bmN0aW9uPHZvaWQiICsgY29iX3R5cGUgKyAiPiBjb2IiCi0gICAgICAgICAgICsgZXhuX2NvYiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMsIHRydWUpICsgIikiOwotICB9IGVsc2UgewotICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKLSAgfQotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcywgYm9vbCBzdGFydF9jb21tYSkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gIXN0YXJ0X2NvbW1hOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIKLSAgICAgICAgICAgICAgKyAobmFtZV9wYXJhbXMgPyAoKmZfaXRlciktPmdldF9uYW1lKCkgOiAiLyogIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgKi8iKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHlwZSBUaHJpZnQgVHlwZQotICogQHJldHVybiBTdHJpbmcgb2YgQysrIGNvZGUgdG8gZGVmaW5pdGlvbiBvZiB0aGF0IHR5cGUgY29uc3RhbnQKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0k2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0RPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmdldF9pbmNsdWRlX3ByZWZpeChjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0IHsKLSAgc3RyaW5nIGluY2x1ZGVfcHJlZml4ID0gcHJvZ3JhbS5nZXRfaW5jbHVkZV9wcmVmaXgoKTsKLSAgaWYgKCF1c2VfaW5jbHVkZV9wcmVmaXhfIHx8IChpbmNsdWRlX3ByZWZpeC5zaXplKCkgPiAwICYmIGluY2x1ZGVfcHJlZml4WzBdID09ICcvJykpIHsKLSAgICAvLyBpZiBmbGFnIGlzIHR1cm5lZCBvZmYgb3IgdGhpcyBpcyBhYnNvbHV0ZSBwYXRoLCByZXR1cm4gZW1wdHkgcHJlZml4Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0cmluZzo6bnBvczsKLSAgaWYgKChsYXN0X3NsYXNoID0gaW5jbHVkZV9wcmVmaXgucmZpbmQoIi8iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmV0dXJuIGluY2x1ZGVfcHJlZml4LnN1YnN0cigwLCBsYXN0X3NsYXNoKQotICAgICAgICAgICArIChnZXRfcHJvZ3JhbSgpLT5pc19vdXRfcGF0aF9hYnNvbHV0ZSgpID8gIi8iIDogIi8iICsgb3V0X2Rpcl9iYXNlXyArICIvIik7Ci0gIH0KLQotICByZXR1cm4gIiI7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCi0gICAgY3BwLAotICAgICJDKysiLAotICAgICIgICAgY29iX3N0eWxlOiAgICAgICBHZW5lcmF0ZSBcIkNvbnRpbnVhdGlvbiBPQmplY3RcIi1zdHlsZSBjbGFzc2VzLlxuIgotICAgICIgICAgbm9fY2xpZW50X2NvbXBsZXRpb246XG4iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgIE9taXQgY2FsbHMgdG8gY29tcGxldGlvbl9fKCkgaW4gQ29iQ2xpZW50IGNsYXNzLlxuIgotICAgICIgICAgbm9fZGVmYXVsdF9vcGVyYXRvcnM6XG4iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgIE9taXRzIGdlbmVyYXRpb24gb2YgZGVmYXVsdCBvcGVyYXRvcnMgPT0sICE9IGFuZCA8XG4iCi0gICAgIiAgICB0ZW1wbGF0ZXM6ICAgICAgIEdlbmVyYXRlIHRlbXBsYXRpemVkIHJlYWRlci93cml0ZXIgbWV0aG9kcy5cbiIKLSAgICAiICAgIHB1cmVfZW51bXM6ICAgICAgR2VuZXJhdGUgcHVyZSBlbnVtcyBpbnN0ZWFkIG9mIHdyYXBwZXIgY2xhc3Nlcy5cbiIKLSAgICAiICAgIGluY2x1ZGVfcHJlZml4OiAgVXNlIGZ1bGwgaW5jbHVkZSBwYXRocyBpbiBnZW5lcmF0ZWQgZmlsZXMuXG4iCi0gICAgIiAgICBtb3ZlYWJsZV90eXBlczogIEdlbmVyYXRlIG1vdmUgY29uc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9ycy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTIxODAxLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjg2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxjY3R5cGU+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotY2xhc3MgdF9jc2hhcnBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfY3NoYXJwX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotCi0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJhc3luYyIpOwotICAgIGFzeW5jXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYXN5bmNjdHAiKTsKLSAgICBhc3luY19jdHBfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgIGlmIChhc3luY18gJiYgYXN5bmNfY3RwXykgewotICAgICAgdGhyb3cgImFyZ3VtZW50IGVycm9yOiBDYW5ub3Qgc3BlY2lmeSBib3RoIGFzeW5jIGFuZCBhc3luY2N0cDsgdGhleSBhcmUgaW5jb21wYXRpYmxlLiI7Ci0gICAgfQotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm51bGxhYmxlIik7Ci0gICAgbnVsbGFibGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImhhc2hjb2RlIik7Ci0gICAgaGFzaGNvZGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInVuaW9uIik7Ci0gICAgdW5pb25fID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInNlcmlhbCIpOwotICAgIHNlcmlhbGl6ZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgaWYgKHNlcmlhbGl6ZV8pIHsKLSAgICAgIHdjZl9uYW1lc3BhY2VfID0gaXRlci0+c2Vjb25kOyAvLyBzaW5jZSB0aGVyZSBjYW4gYmUgb25seSBvbmUgbmFtZXNwYWNlCi0gICAgfQotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIndjZiIpOwotICAgIHdjZl8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgaWYgKHdjZl8pIHsKLSAgICAgIHdjZl9uYW1lc3BhY2VfID0gaXRlci0+c2Vjb25kOwotICAgIH0KLQotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNzaGFycCI7Ci0gIH0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eShvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlSXNzZXQgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCA9ICIiKTsKLSAgYm9vbCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWR0eXBlID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgdm9pZCBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotICB2b2lkIHByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbl9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2NsYXNzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbiwgdF9maWVsZCogdGZpZWxkKTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfd2NmZmF1bHQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9lcXVhbHMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9oYXNoY29kZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5bGVzcyA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogbGlzdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZWxlbWVudCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5bGVzcyA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7Ci0KLSAgdm9pZCBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKHN0ZDo6b2ZzdHJlYW0mIG91dCk7Ci0gIHZvaWQgZW5kX2NzaGFycF9uYW1lc3BhY2Uoc3RkOjpvZnN0cmVhbSYgb3V0KTsKLQotICBzdGQ6OnN0cmluZyBjc2hhcnBfdHlwZV91c2luZ3MoKTsKLSAgc3RkOjpzdHJpbmcgY3NoYXJwX3RocmlmdF91c2luZ3MoKTsKLQotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY291bnRhaW5lciA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3BhcmFtID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fcGFyYW0gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgc3VwcHJlc3NfbWFwcGluZyA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOwotCi0gIGJvb2wgZmllbGRfaGFzX2RlZmF1bHQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEw7IH0KLQotICBib29sIGZpZWxkX2lzX3JlcXVpcmVkKHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRDsgfQotCi0gIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQotICAgICAgICAgICB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX25hbWVfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9kaXJfOwotICBib29sIGFzeW5jXzsKLSAgYm9vbCBhc3luY19jdHBfOwotICBib29sIG51bGxhYmxlXzsKLSAgYm9vbCB1bmlvbl87Ci0gIGJvb2wgaGFzaGNvZGVfOwotICBib29sIHNlcmlhbGl6ZV87Ci0gIGJvb2wgd2NmXzsKLSAgc3RkOjpzdHJpbmcgd2NmX25hbWVzcGFjZV87Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gY3NoYXJwX2tleXdvcmRzOwotCi0gIHZvaWQqIG1lbWJlcl9tYXBwaW5nX3Njb3BlOwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1lbWJlcl9uYW1lX21hcHBpbmc7Ci0KLSAgdm9pZCBpbml0X2tleXdvcmRzKCk7Ci0gIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7Ci0gIHZvaWQgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSk7Ci0gIHZvaWQgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlKTsKLSAgc3RyaW5nIGdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG9sZG5hbWUpOwotfTsKLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIik7Ci0KLSAgc3RyaW5nIGRpciA9IG5hbWVzcGFjZV9uYW1lXzsKLSAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCkuY19zdHIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOwotICB9Ci0gIGlmIChkaXIuc2l6ZSgpID4gMCkgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gIH0KLQotICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKLSAgaW5pdF9rZXl3b3JkcygpOwotICBtZW1iZXJfbWFwcGluZ19zY29wZSA9IE5VTEw7Ci0KLSAgcHZlcmJvc2UoIkMjIG9wdGlvbnM6XG4iKTsKLSAgcHZlcmJvc2UoIi0gYXN5bmMgLi4uLi4uICVzXG4iLCAoYXN5bmNfID8gIk9OIiA6ICJvZmYiKSk7Ci0gIHB2ZXJib3NlKCItIGFzeW5jX2N0cCAuLiAlc1xuIiwgKGFzeW5jX2N0cF8gPyAiT04iIDogIm9mZiIpKTsKLSAgcHZlcmJvc2UoIi0gbnVsbGFibGUgLi4uICVzXG4iLCAobnVsbGFibGVfID8gIk9OIiA6ICJvZmYiKSk7Ci0gIHB2ZXJib3NlKCItIHVuaW9uIC4uLi4uLiAlc1xuIiwgKHVuaW9uXyA/ICJPTiIgOiAib2ZmIikpOwotICBwdmVyYm9zZSgiLSBoYXNoY29kZSAuLi4gJXNcbiIsIChoYXNoY29kZV8gPyAiT04iIDogIm9mZiIpKTsKLSAgcHZlcmJvc2UoIi0gc2VyaWFsaXplIC4uICVzXG4iLCAoc2VyaWFsaXplXyA/ICJPTiIgOiAib2ZmIikpOwotICBwdmVyYm9zZSgiLSB3Y2YgLi4uLi4uLi4gJXNcbiIsICh3Y2ZfID8gIk9OIiA6ICJvZmYiKSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6bm9ybWFsaXplX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgdG1wKG5hbWUpOwotICBzdGQ6OnRyYW5zZm9ybSh0bXAuYmVnaW4oKSwgdG1wLmVuZCgpLCB0bXAuYmVnaW4oKSwgc3RhdGljX2Nhc3Q8aW50ICgqKShpbnQpPihzdGQ6OnRvbG93ZXIpKTsKLQotICAvLyB1bi1jb25mbGljdCBrZXl3b3JkcyBieSBwcmVmaXhpbmcgd2l0aCAiQCIKLSAgaWYgKGNzaGFycF9rZXl3b3Jkcy5maW5kKHRtcCkgIT0gY3NoYXJwX2tleXdvcmRzLmVuZCgpKSB7Ci0gICAgcmV0dXJuICJAIiArIG5hbWU7Ci0gIH0KLQotICAvLyBubyBjaGFuZ2VzIG5lY2Vzc2FyeQotICByZXR1cm4gbmFtZTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmluaXRfa2V5d29yZHMoKSB7Ci0gIGNzaGFycF9rZXl3b3Jkcy5jbGVhcigpOwotCi0gIC8vIEMjIGtleXdvcmRzCi0gIGNzaGFycF9rZXl3b3Jkc1siYWJzdHJhY3QiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siYXMiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siYmFzZSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJib29sIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImJyZWFrIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImJ5dGUiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siY2FzZSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJjYXRjaCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJjaGFyIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImNoZWNrZWQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siY2xhc3MiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siY29uc3QiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siY29udGludWUiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZGVjaW1hbCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJkZWZhdWx0Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImRlbGVnYXRlIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImRvIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImRvdWJsZSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJlbHNlIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImVudW0iXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZXZlbnQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZXhwbGljaXQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZXh0ZXJuIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImZhbHNlIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImZpbmFsbHkiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZml4ZWQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZmxvYXQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZm9yIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImZvcmVhY2giXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZ290byJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJpZiJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJpbXBsaWNpdCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJpbiJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJpbnQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siaW50ZXJmYWNlIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImludGVybmFsIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImlzIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImxvY2siXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sibG9uZyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJuYW1lc3BhY2UiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sibmV3Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbIm51bGwiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sib2JqZWN0Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbIm9wZXJhdG9yIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbIm91dCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJvdmVycmlkZSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJwYXJhbXMiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sicHJpdmF0ZSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJwcm90ZWN0ZWQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sicHVibGljIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInJlYWRvbmx5Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInJlZiJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJyZXR1cm4iXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sic2J5dGUiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sic2VhbGVkIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInNob3J0Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInNpemVvZiJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJzdGFja2FsbG9jIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInN0YXRpYyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJzdHJpbmciXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sic3RydWN0Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInN3aXRjaCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ0aGlzIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInRocm93Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInRydWUiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sidHJ5Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInR5cGVvZiJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ1aW50Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInVsb25nIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInVuY2hlY2tlZCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ1bnNhZmUiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sidXNob3J0Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInVzaW5nIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInZpcnR1YWwiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sidm9pZCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ2b2xhdGlsZSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ3aGlsZSJdID0gMTsKLQotICAvLyBDIyBjb250ZXh0dWFsIGtleXdvcmRzCi0gIGNzaGFycF9rZXl3b3Jkc1siYWRkIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImFsaWFzIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImFzY2VuZGluZyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJhc3luYyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJhd2FpdCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJkZXNjZW5kaW5nIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImR5bmFtaWMiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZnJvbSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJnZXQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZ2xvYmFsIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImdyb3VwIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImludG8iXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siam9pbiJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJsZXQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sib3JkZXJieSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJwYXJ0aWFsIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInJlbW92ZSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJzZWxlY3QiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sic2V0Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInZhbHVlIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInZhciJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ3aGVyZSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ5aWVsZCJdID0gMTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob2ZzdHJlYW0mIG91dCkgewotICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8ICJuYW1lc3BhY2UgIiA8PCBuYW1lc3BhY2VfbmFtZV8gPDwgIlxuIjsKLSAgICBzY29wZV91cChvdXQpOwotICB9Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjplbmRfY3NoYXJwX25hbWVzcGFjZShvZnN0cmVhbSYgb3V0KSB7Ci0gIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpIHsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y3NoYXJwX3R5cGVfdXNpbmdzKCkgewotICByZXR1cm4gc3RyaW5nKCkgKyAidXNpbmcgU3lzdGVtO1xuIiArICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7XG4iCi0gICAgICAgICArICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIgKyAidXNpbmcgU3lzdGVtLlRleHQ7XG4iICsgInVzaW5nIFN5c3RlbS5JTztcbiIKLSAgICAgICAgICsgKChhc3luY18gfHwgYXN5bmNfY3RwXykgPyAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIgOiAiIikgKyAidXNpbmcgVGhyaWZ0O1xuIgotICAgICAgICAgKyAidXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zO1xuIiArICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSA/ICIjaWYgIVNJTFZFUkxJR0hUXG4iIDogIiIpCi0gICAgICAgICArICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSA/ICJ1c2luZyBTeXN0ZW0uWG1sLlNlcmlhbGl6YXRpb247XG4iIDogIiIpCi0gICAgICAgICArICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSA/ICIjZW5kaWZcbiIgOiAiIikgKyAod2NmXyA/ICIvL3VzaW5nIFN5c3RlbS5TZXJ2aWNlTW9kZWw7XG4iIDogIiIpCi0gICAgICAgICArICJ1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uO1xuIjsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y3NoYXJwX3RocmlmdF91c2luZ3MoKSB7Ci0gIHJldHVybiBzdHJpbmcoKSArICJ1c2luZyBUaHJpZnQuUHJvdG9jb2w7XG4iICsgInVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7XG4iOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotfQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCl0dHlwZWRlZjsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdHJpbmcgZl9lbnVtX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKLQotICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLQotICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfZW51bSk7Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX2VudW0sIHRlbnVtKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiXG4iOwotICBzY29wZV91cChmX2VudW0pOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfZW51bSwgKmNfaXRlcik7Ci0KLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX2VudW0pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiLCIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsKLQotICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX2VudW0pOwotCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAnLycgKyBwcm9ncmFtX25hbWVfICsgIi5Db25zdGFudHMuY3MiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGNzaGFycF90eXBlX3VzaW5ncygpIDw8IGVuZGw7Ci0KLSAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX2NvbnN0cyk7Ci0KLSAgaW5kZW50KGZfY29uc3RzKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykKLSAgICAgICAgICAgICAgICAgICA8PCAiQ29uc3RhbnRzIiA8PCBlbmRsOwotICBzY29wZV91cChmX2NvbnN0cyk7Ci0KLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gZmFsc2U7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX2NvbnN0cywgKCpjX2l0ZXIpKTsKLSAgICBpZiAocHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKLSAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAobmVlZF9zdGF0aWNfY29uc3RydWN0b3IpIHsKLSAgICBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihmX2NvbnN0cywgY29uc3RzKTsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9jb25zdHMpOwotICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX2NvbnN0cyk7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZygodF9zdHJ1Y3QqKXR5cGUpOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBmaWVsZCA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGQgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gZmllbGQtPmdldF90eXBlKCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgcHJvcF9uYW1lKGZpZWxkKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygodF9zdHJ1Y3QqKXR5cGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSIKLSAgICAgICAgICAgICAgICAgIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotCi0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLkFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9jb25zdHJ1Y3RvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaW5kZW50KG91dCkgPDwgInN0YXRpYyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykuY19zdHIoKSA8PCAiQ29uc3RhbnRzKCkiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLy8gaXQgc2VlbXMgbGlrZSBhbGwgdGhhdCBtZXRob2RzIHRoYXQgY2FsbCB0aGlzIGFyZSB1c2luZyBpbl9zdGF0aWMgdG8gYmUgdGhlIG9wcG9zaXRlIG9mIHdoYXQgaXQKLS8vIHdvdWxkIGltcGx5Ci1ib29sIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWR0eXBlKSB7Ci0gIGluZGVudChvdXQpOwotICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9ICFpbl9zdGF0aWM7Ci0gIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKCFkZWZ2YWwgfHwgbmVlZHR5cGUpIHsKLSAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICIiIDogdHlwZS0+aXNfYmFzZV90eXBlKCkgPyAicHVibGljIGNvbnN0ICIgOiAicHVibGljIHN0YXRpYyAiKQotICAgICAgICA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOwotICB9Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKLSAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSBmYWxzZTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpCi0gICAgICAgIDw8ICI7IiA8PCBlbmRsOwotICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGRlZnZhbCAmJiAhdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX2VudW0oKSkgewotICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgfQotCi0gIHJldHVybiBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb247Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKW5hbWU7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlmICh1bmlvbl8gJiYgdHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIGdlbmVyYXRlX2NzaGFycF91bmlvbih0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5jcyI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotCi0gIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKLQotICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotCi0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotCi0gIGlmICghaW5fY2xhc3MpIHsKLSAgICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9jc2hhcnBfZG9jKG91dCwgdHN0cnVjdCk7Ci0gIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiI2lmICFTSUxWRVJMSUdIVCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgIWlzX2V4Y2VwdGlvbikgewotICAgIGluZGVudChvdXQpIDw8ICJbRGF0YUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsgLy8gZG8gbm90IG1ha2UgZXhjZXB0aW9uIGNsYXNzZXMgZGlyZWN0bHkgV0NGIHNlcmlhbGl6YWJsZSwgd2UgcHJvdmlkZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdGUgImZhdWx0IiBmb3IgdGhhdAotICB9Ci0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIKLSAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkgPDwgIiA6ICI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiVEV4Y2VwdGlvbiwgIjsKLSAgfQotICBvdXQgPDwgIlRCYXNlIjsKLQotICBvdXQgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgLy8gbWFrZSBwcml2YXRlIG1lbWJlcnMgd2l0aCBwdWJsaWMgUHJvcGVydGllcwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgLy8gaWYgdGhlIGZpZWxkIGlzIHJlcXVpZWQsIHRoZW4gd2UgdXNlIGF1dG8tcHJvcGVydGllcwotICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSAmJiAoIW51bGxhYmxlXyB8fCBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIiA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiXyIpIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKLSAgYm9vbCBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzID0gZmFsc2U7Ci0gIGJvb2wgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhvdXQsICptX2l0ZXIpOwotICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7Ci0gICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7Ci0gICAgaWYgKGlzX3JlcXVpcmVkKSB7Ci0gICAgICBoYXNfcmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGhhc19kZWZhdWx0KSB7Ci0gICAgICAgIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMgPSB0cnVlOwotICAgICAgfQotICAgICAgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGJvb2wgZ2VuZXJhdGVfaXNzZXQgPSAobnVsbGFibGVfICYmIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoIW51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyk7Ci0gIGlmIChnZW5lcmF0ZV9pc3NldCkgewotICAgIG91dCA8PCBlbmRsOwotICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW1htbElnbm9yZV0gLy8gWG1sU2VyaWFsaXplciIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICJbRGF0YU1lbWJlcihPcmRlciA9IDEpXSAgLy8gWG1sT2JqZWN0U2VyaWFsaXplciwgRGF0YUNvbnRyYWN0SnNvblNlcmlhbGl6ZXIsIGV0Yy4iCi0gICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgSXNzZXQgX19pc3NldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIjZW5kaWYiIDw8IGVuZGw7Ci0gICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykgewotICAgICAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0cnVjdCBJc3NldCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOwotICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7Ci0gICAgICAvLyBpZiBpdCBpcyByZXF1aXJlZCwgZG9uJ3QgbmVlZCBJc3NldCBmb3IgdGhhdCB2YXJpYWJsZQotICAgICAgLy8gaWYgaXQgaXMgbm90IHJlcXVpcmVkLCBpZiBpdCBoYXMgYSBkZWZhdWx0IHZhbHVlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIElzc2V0Ci0gICAgICAvLyBpZiB3ZSBhcmUgbm90IG51bGxhYmxlLCB0aGVuIHdlIGdlbmVyYXRlIElzc2V0Ci0gICAgICBpZiAoIWlzX3JlcXVpcmVkICYmICghbnVsbGFibGVfIHx8IGhhc19kZWZhdWx0KSkgewotICAgICAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIltEYXRhTWVtYmVyXSIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2wgIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGlmIChnZW5lcmF0ZV9pc3NldCAmJiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiNyZWdpb24gWG1sU2VyaWFsaXplciBzdXBwb3J0IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7Ci0gICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOwotICAgICAgICAvLyBpZiBpdCBpcyByZXF1aXJlZCwgZG9uJ3QgbmVlZCBJc3NldCBmb3IgdGhhdCB2YXJpYWJsZQotICAgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKLSAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAotICAgICAgICBpZiAoIWlzX3JlcXVpcmVkICYmICghbnVsbGFibGVfIHx8IGhhc19kZWZhdWx0KSkgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbCBTaG91bGRTZXJpYWxpemUiIDw8IHByb3BfbmFtZSgoKm1faXRlcikpIDw8ICIoKSIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpbmRlbnQob3V0KSA8PCAiI2VuZHJlZ2lvbiBYbWxTZXJpYWxpemVyIHN1cHBvcnQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBXZSBhbHdheXMgd2FudCBhIGRlZmF1bHQsIG5vIGFyZ3VtZW50IGNvbnN0cnVjdG9yIGZvciBSZWFkaW5nCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOwotICAgIH0KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkgewotICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyBwcm9wX25hbWUoKm1faXRlciksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcy5fIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgIC8vIE9wdGlvbmFscyB3aXRoIGRlZmF1bHRzIGFyZSBtYXJrZWQgc2V0Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSB0cnVlOyIKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoaGFzX3JlcXVpcmVkX2ZpZWxkcykgewotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIikgOiB0aGlzKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgcHJvcF9uYW1lKCgqbV9pdGVyKSkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IgotICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGlmIChoYXNoY29kZV8pIHsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2VxdWFscyhvdXQsIHRzdHJ1Y3QpOwotICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfaGFzaGNvZGUob3V0LCB0c3RydWN0KTsKLSAgfQotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gZ2VuZXJhdGUgYSBjb3JyZXNwb25kaW5nIFdDRiBmYXVsdCB0byB3cmFwIHRoZSBleGNlcHRpb24KLSAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmIGlzX2V4Y2VwdGlvbikgewotICAgIGdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChvdXQsIHRzdHJ1Y3QpOwotICB9Ci0KLSAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QpOwotICBpZiAoIWluX2NsYXNzKSB7Ci0gICAgZW5kX2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiI2lmICFTSUxWRVJMSUdIVCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7Ci0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICA8PCAiRmF1bHQiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGZhbHNlKTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgUmVhZCAoVFByb3RvY29sIGlwcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgImJvb2wgaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImZpZWxkID0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIHsgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuSUQpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOwotICAgIGlmIChpc19yZXF1aXJlZCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IgotICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpOwotICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSk7Ci0gICAgICBpZiAobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCAmJiAhaXNfcmVxdWlyZWQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9IGVsc2UgaWYgKCFpc19yZXF1aXJlZCkgewotICAgICAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iCi0gICAgICAgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOwotCi0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKLQotICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIWlzX3JlcXVpcmVkKSB7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKLSAgICAgIH0KLQotICAgICAgaWYgKG51bGxhYmxlXykgewotICAgICAgICBvdXQgPDwgIih0aGlzLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIodGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gIW51bGxhYmxlXyAmJiB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICJcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOwotCi0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKLQotICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIlN0cmluZ0J1aWxkZXIgX19zYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgYm9vbCB1c2VGaXJzdEZsYWcgPSBmYWxzZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJib29sIF9fZmlyc3QgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgIHVzZUZpcnN0RmxhZyA9IHRydWU7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgYm9vbCBoYWRfcmVxdWlyZWQgPSBmYWxzZTsgLy8gc2V0IHRvIHRydWUgYWZ0ZXIgZmlyc3QgcmVxdWlyZWQgZmllbGQgaGFzIGJlZW4gcHJvY2Vzc2VkCi0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKLSAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKTsKLSAgICBpZiAobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCAmJiAhaXNfcmVxdWlyZWQpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9IGVsc2UgaWYgKCFpc19yZXF1aXJlZCkgewotICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iCi0gICAgICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh1c2VGaXJzdEZsYWcgJiYgKCFoYWRfcmVxdWlyZWQpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYoIV9fZmlyc3QpIHsgX19zYi5BcHBlbmQoXCIsIFwiKTsgfSIgPDwgZW5kbDsKLSAgICAgIGlmICghaXNfcmVxdWlyZWQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIl9fZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoXCIiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICI6IFwiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZChcIiwgIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiOiBcIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9fc2IuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkKLSAgICAgICAgICAgICAgICAgIDw8ICI9PSBudWxsID8gXCI8bnVsbD5cIiA6ICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIi5Ub1N0cmluZygpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoIWlzX3JlcXVpcmVkKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGhhZF9yZXF1aXJlZCA9IHRydWU7IC8vIG5vdyBfX2ZpcnN0IG11c3QgYmUgZmFsc2UsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQgYW55bW9yZQotICAgIH0KLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZChcIilcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fc2IuVG9TdHJpbmcoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbih0X3N0cnVjdCogdHVuaW9uKSB7Ci0gIHN0cmluZyBmX3VuaW9uX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0dW5pb24tPmdldF9uYW1lKCkpICsgIi5jcyI7Ci0gIG9mc3RyZWFtIGZfdW5pb247Ci0KLSAgZl91bmlvbi5vcGVuKGZfdW5pb25fbmFtZS5jX3N0cigpKTsKLQotICBmX3VuaW9uIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGNzaGFycF90eXBlX3VzaW5ncygpIDw8IGNzaGFycF90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fZGVmaW5pdGlvbihmX3VuaW9uLCB0dW5pb24pOwotCi0gIGZfdW5pb24uY2xvc2UoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbl9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbikgewotICAvLyBMZXQncyBkZWZpbmUgdGhlIGNsYXNzIGZpcnN0Ci0gIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGFic3RyYWN0IHBhcnRpYWwgY2xhc3MgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiA6IFRBYnN0cmFjdEJhc2UgeyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGUoVFByb3RvY29sIHByb3RvY29sKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgcmVhZG9ubHkgYm9vbCBJc3NldDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IERhdGEgeyBnZXQ7IH0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiKGJvb2wgaXNzZXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiSXNzZXQgPSBpc3NldDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyBfX191bmRlZmluZWQgOiAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gbnVsbDsgfSB9IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgX19fdW5kZWZpbmVkKCkgOiBiYXNlKGZhbHNlKSB7fSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShUUHJvdG9jb2wgcHJvdG9jb2wpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbiggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgXCJDYW5ub3QgcGVyc2lzdCAiCi0gICAgICAgICAgICAgICAgICJhbiB1bmlvbiB0eXBlIHdoaWNoIGlzIG5vdCBzZXQuXCIpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHR1bmlvbi0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2NsYXNzKG91dCwgdHVuaW9uLCAoKmZfaXRlcikpOwotICB9Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihvdXQsIHR1bmlvbik7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBlbmRfY3NoYXJwX25hbWVzcGFjZShvdXQpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX2NsYXNzKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHR1bmlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkKSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgeyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBfZGF0YTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gX2RhdGE7IH0gfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkKLSAgICAgICAgICAgICAgPDwgIiBkYXRhKSA6IGJhc2UodHJ1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ0aGlzLl9kYXRhID0gZGF0YTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJmaWVsZC5JRCA9ICIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCB0ZmllbGQsICJfZGF0YSIsIHRydWUsIHRydWUpOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2VxdWFscyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCB0aGF0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAidmFyIG90aGVyID0gdGhhdCBhcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKFJlZmVyZW5jZUVxdWFscyh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICI7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiJiYgIjsKLSAgICB9Ci0gICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpICYmICEobnVsbGFibGVfICYmICFmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpKSkgewotICAgICAgb3V0IDw8ICIoKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPT0gb3RoZXIuX19pc3NldC4iCi0gICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSAmJiAoKCFfX2lzc2V0LiIKLSAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHx8ICgiOwotICAgIH0KLSAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5pc19iaW5hcnkoKSkpKSB7Ci0gICAgICBvdXQgPDwgIlRDb2xsZWN0aW9ucy5FcXVhbHMoIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJTeXN0ZW0uT2JqZWN0LkVxdWFscygiOwotICAgIH0KLSAgICBvdXQgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiwgb3RoZXIuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiKSI7Ci0gICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpICYmICEobnVsbGFibGVfICYmICFmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpKSkgewotICAgICAgb3V0IDw8ICIpKSkiOwotICAgIH0KLSAgfQotICBpZiAoZmlyc3QpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfaGFzaGNvZGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiaW50IGhhc2hjb2RlID0gMDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ1bmNoZWNrZWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaGFzaGNvZGUgPSAoaGFzaGNvZGUgKiAzOTcpIF4gIjsKLSAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkgewotICAgICAgb3V0IDw8ICIoIjsKLSAgICB9IGVsc2UgaWYgKG51bGxhYmxlXykgewotICAgICAgb3V0IDw8ICIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiID09IG51bGwgPyAwIDogIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIoIV9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPyAwIDogIjsKLSAgICB9Ci0gICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgb3V0IDw8ICIoVENvbGxlY3Rpb25zLkdldEhhc2hDb2RlKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikpIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLkdldEhhc2hDb2RlKCkpIjsKLSAgICB9Ci0gICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGhhc2hjb2RlOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIuY3MiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7Ci0KLSAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX3NlcnZpY2VfKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBwYXJ0aWFsIGNsYXNzICIgPDwgbm9ybWFsaXplX25hbWUoc2VydmljZV9uYW1lXykgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfaWZhY2UgPSAiIDogIiArIGV4dGVuZHMgKyAiLklmYWNlIjsKLSAgfQotCi0gIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotCi0gIGlmICh3Y2ZfKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLQotICAgIC8vIGlmIHdlJ3JlIHVzaW5nIFdDRiwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMKLSAgICBpZiAod2NmXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbT3BlcmF0aW9uQ29udHJhY3RdIiA8PCBlbmRsOwotCi0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbRmF1bHRDb250cmFjdCh0eXBlb2YoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIkZhdWx0KSldIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaWYgKCFhc3luY18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2JlZ2luKCpmX2l0ZXIsICJCZWdpbl8iKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCgqZl9pdGVyLCAiRW5kXyIpIDw8ICI7IiA8PCBlbmRsOwotICAgIGlmIChhc3luY18gfHwgYXN5bmNfY3RwXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFhc3luY18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50LCAiOwotICB9IGVsc2UgewotICAgIGV4dGVuZHNfY2xpZW50ID0gIklEaXNwb3NhYmxlLCAiOwotICB9Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgQ2xpZW50IDogIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdCkgOiB0aGlzKHByb3QsIHByb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaXByb3QsIG9wcm90KSI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgaXByb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgb3Byb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGludCBzZXFpZF87IgotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIFRQcm90b2NvbCBJbnB1dFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZ2V0IHsgcmV0dXJuIGlwcm90XzsgfSIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIFRQcm90b2NvbCBPdXRwdXRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImdldCB7IHJldHVybiBvcHJvdF87IH0iIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI3JlZ2lvbiBcIiBJRGlzcG9zYWJsZSBTdXBwb3J0IFwiIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOyIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gSURpc3Bvc2FibGUiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCBEaXNwb3NlKCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJEaXNwb3NlKHRydWUpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKCFfSXNEaXNwb3NlZCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZGlzcG9zaW5nKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChpcHJvdF8gIT0gbnVsbCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKElEaXNwb3NhYmxlKWlwcm90XykuRGlzcG9zZSgpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9wcm90XyAhPSBudWxsKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigoSURpc3Bvc2FibGUpb3Byb3RfKS5EaXNwb3NlKCk7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX0lzRGlzcG9zZWQgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZHJlZ2lvbiIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGw7Ci0KLSAgICBpZiAoIWFzeW5jXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7Ci0gICAgfQotICAgIC8vIEJlZ2luXwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2JlZ2luKCpmX2l0ZXIsICJCZWdpbl8iKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoY2FsbGJhY2ssIHN0YXRlIjsKLQotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIGZfc2VydmljZV8gPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIEVuZAotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCgqZl9pdGVyLCAiRW5kXyIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdF8uVHJhbnNwb3J0LkVuZEZsdXNoKGFzeW5jUmVzdWx0KTsiIDw8IGVuZGw7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgLy8gYXN5bmMKLSAgICBib29sIGZpcnN0OwotICAgIGlmIChhc3luY18gfHwgYXN5bmNfY3RwXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYXN5bmMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlciwgIiIpIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIiByZXR2YWw7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHZhbCA9ICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7Ci0gICAgICB9Ci0gICAgICBpZiAoYXN5bmNfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgImF3YWl0IFRhc2suUnVuKCgpID0+IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiYXdhaXQgVGFza0V4LlJ1bigoKSA9PiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgZnVubmFtZSA8PCAiKCI7Ci0gICAgICBmaXJzdCA9IHRydWU7Ci0gICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmICghYXN5bmNfKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vICJOb3JtYWwiIFN5bmNocm9ub3VzIGludm9rZQotICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIGlmICghYXN5bmNfKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgICAgZmlyc3QgPSB0cnVlOwotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbHNlIiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFNpbHZlcmxpZ2h0IHN5bmNocm9ub3VzIGludm9rZQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIGFzeW5jUmVzdWx0ID0gQmVnaW5fIiA8PCBmdW5uYW1lIDw8ICIobnVsbCwgbnVsbCI7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIiA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIkVuZF8iIDw8IGZ1bm5hbWUgPDwgIihhc3luY1Jlc3VsdCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpZiAoIWFzeW5jXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kaWYiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBTZW5kCi0gICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgaWYgKCFhc3luY18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBpZiAoIWFzeW5jXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZWxzZSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kaWYiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIKLSAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PbmV3YXkiIDogIlRNZXNzYWdlVHlwZS5DYWxsIikKLSAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZQotICAgICAgICAgICAgICAgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuV3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICAgIDsKLQotICAgIGlmICghYXN5bmNfKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gb3Byb3RfLlRyYW5zcG9ydC5CZWdpbkZsdXNoKGNhbGxiYWNrLCBzdGF0ZSk7IiA8PCBlbmRsOwotICAgIGlmICghYXN5bmNfKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbHNlIiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdF8uVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kaWYiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoeHMsIHhzLT5nZXRfbWVtYmVycygpLCByZXN1bHRuYW1lKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3RfLlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgImlmIChtc2cuVHlwZSA9PSBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKGlwcm90Xyk7IgotICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInRocm93IHg7IgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiCi0gICAgICAgICAgICAgICAgIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LlJlYWQoaXByb3RfKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpZiAobnVsbGFibGVfKSB7Ci0gICAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5TdWNjZXNzICE9IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5TdWNjZXNzLkhhc1ZhbHVlKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2Vzcy5WYWx1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gcmVzdWx0LlN1Y2Nlc3M7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBpZiAobnVsbGFibGVfKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93IHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiCi0gICAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgPDwgInRocm93IG5ldyAiCi0gICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0LCBcIiIKLSAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvciwgIjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzIFByb2Nlc3NvciA6ICIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIlRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgUHJvY2Vzc29yKElmYWNlIGlmYWNlKSI7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiIDogYmFzZShpZmFjZSkiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3M7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfCi0gICAgICAgIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJwcm90ZWN0ZWQgZGVsZWdhdGUgdm9pZCBQcm9jZXNzRnVuY3Rpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7IgotICAgICAgICA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJZmFjZSBpZmFjZV87IiA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPSBuZXcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+KCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBib29sIFByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIG5ldyBib29sIFByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfCi0gICAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgInByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBvdXQgZm4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiCi0gICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgVFR5cGUuU3RydWN0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gIgotICAgICAgICAgIihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duTWV0aG9kLCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIiArICIKLSAgICAgICAgICJtc2cuTmFtZSArIFwiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKSk7IgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWU7IgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoIChJT0V4Y2VwdGlvbikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpdHNlcnZpY2U7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICJfUHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgImFyZ3MuUmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiaWZhY2VfLiIgPDwgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7Ci0gICAgaWYgKG51bGxhYmxlXyAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIuVmFsdWUiOwotICAgIH0KLSAgfQotICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIgotICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIn0iOwotICAgICAgfQotICAgIH0KLSAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoeHMpOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SZXBseSwgc2VxaWQpKTsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuV3JpdGUob3Byb3QpOyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pIHsKLSAgLy8gVGhhbmtzIHRvIFRIUklGVC0xNzY4LCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgaW4gdGhlIHVuaW9uCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHR1bmlvbi0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgUmVhZChUUHJvdG9jb2wgaXByb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIHJldHZhbDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBpcHJvdC5SZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLSAgLy8gd2UgY2Fubm90IGhhdmUgdGhlIGZpcnN0IGZpZWxkIGJlIGEgc3RvcCAtLSB3ZSBtdXN0IGhhdmUgYSBzaW5nbGUgZmllbGQgZGVmaW5lZAotICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbHNlIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRlbXA7IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAidGVtcCIsIHRydWUpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR2YWwgPSBuZXcgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIih0ZW1wKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IgotICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICA8PCAicmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiaWYgKGlwcm90LlJlYWRGaWVsZEJlZ2luKCkuVHlwZSAhPSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gZW5kIG9mIGVsc2UgZm9yIFRTdG9wCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gcmV0dmFsOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzKSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiOwotCi0gICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIpIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgImlwcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5KCk7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAiUmVhZEJ5dGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIlJlYWRJNjQoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIGlmICh1bmlvbl8gJiYgdHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIuUmVhZChpcHJvdCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8IHByZWZpeCA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgb2JqOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJUTWFwICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LlJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwgImZvciggaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLkNvdW50IgotICAgICAgICAgICAgICA8PCAiOyAiCi0gICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0KLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcm9wZXJ0eWxlc3MpIHsKLSAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgKGlzX3Byb3BlcnR5bGVzcyA/ICIiIDogcHJvcF9uYW1lKHRmaWVsZCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKLQotICAgIHN0cmluZyBudWxsYWJsZV9uYW1lID0gbnVsbGFibGVfICYmICFpc19lbGVtZW50ICYmICFmaWVsZF9pc19yZXF1aXJlZCh0ZmllbGQpID8gbmFtZSArICIuVmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuYW1lOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnkoIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKCI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVCb29sKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVJMTYoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVJMzIoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVJNjQoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAiV3JpdGVJMzIoKGludCkiIDw8IG51bGxhYmxlX25hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAotICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5Db3VudCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5Db3VudCkpOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKLSAgICAgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuS2V5cykiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKLSAgICAgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKLSAgICAgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIjsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCB0cnVlKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgdHJ1ZSk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIHRydWUpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvcGVydHkob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdlbmVyYXRlSXNzZXQpIHsKLSAgZ2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG91dCwgdGZpZWxkLCBpc1B1YmxpYywgZ2VuZXJhdGVJc3NldCwgIl8iKTsKLX0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfcHJvcGVydHkob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdlbmVyYXRlSXNzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4KSB7Ci0gIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiBpc1B1YmxpYykgewotICAgIGluZGVudChvdXQpIDw8ICJbRGF0YU1lbWJlcihPcmRlciA9IDApXSIgPDwgZW5kbDsKLSAgfQotICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKTsKLSAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKHRmaWVsZCk7Ci0gIGlmICgobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCkgfHwgKGlzX3JlcXVpcmVkKSkgewotICAgIGluZGVudChvdXQpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBpc19yZXF1aXJlZCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgIiB7IGdldDsgc2V0OyB9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlLCB0cnVlKSA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImdldCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGJvb2wgdXNlX251bGxhYmxlID0gZmFsc2U7Ci0gICAgaWYgKG51bGxhYmxlXykgewotICAgICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgICAgIH0KLSAgICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdXNlX251bGxhYmxlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpICE9IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaWYgKHVzZV9udWxsYWJsZSkgewotICAgICAgaWYgKGdlbmVyYXRlSXNzZXQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgPSB2YWx1ZS5IYXNWYWx1ZTsiCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlLkhhc1ZhbHVlKSB0aGlzLiIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICIgPSB2YWx1ZS5WYWx1ZTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChnZW5lcmF0ZUlzc2V0KSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKLSAgc3RkOjpzdHJpbmcgc3RyID0gZnJvbU5hbWU7Ci0gIGlmIChzdHIuZW1wdHkoKSkgewotICAgIHJldHVybiBzdHI7Ci0gIH0KLQotICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKLSAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKLQotICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0Ci0gIGNoYXIgYyA9IHN0ci5hdCgwKTsKLSAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgewotICAgIHN0ciA9ICJfIiArIHN0cjsKLSAgfQotCi0gIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgewotICAgIGMgPSBzdHIuYXQoaSk7Ci0gICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCi0gICAgICAgICYmICgnXycgIT0gYykpIHsKLSAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHN0cjsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSkgewotICBpZiAobWVtYmVyX21hcHBpbmdfc2NvcGUgIT0gc2NvcGUpIHsKLSAgICBpZiAobWVtYmVyX21hcHBpbmdfc2NvcGUgPT0gTlVMTCkgewotICAgICAgdGhyb3cgImludGVybmFsIGVycm9yOiBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKSBub3QgYWN0aXZlIjsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgImludGVybmFsIGVycm9yOiBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKSBjYWxsZWQgZm9yIHdyb25nIHN0cnVjdCI7Ci0gICAgfQotICB9Ci0KLSAgbWVtYmVyX21hcHBpbmdfc2NvcGUgPSBOVUxMOwotICBtZW1iZXJfbmFtZV9tYXBwaW5nLmNsZWFyKCk7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG5hbWUpIHsKLSAgbWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IG1lbWJlcl9uYW1lX21hcHBpbmcuZmluZChuYW1lKTsKLSAgaWYgKG1lbWJlcl9uYW1lX21hcHBpbmcuZW5kKCkgIT0gaXRlcikgewotICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7Ci0gIH0KLSAgcHZlcmJvc2UoIm5vIG1hcHBpbmcgZm9yIG1lbWJlciAlc1xuIiwgbmFtZS5jX3N0cigpKTsKLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QsIHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIHRzdHJ1Y3QtPmdldF9uYW1lKCkpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN0cnVjdG5hbWUpIHsKLSAgaWYgKG1lbWJlcl9tYXBwaW5nX3Njb3BlICE9IE5VTEwpIHsKLSAgICBpZiAobWVtYmVyX21hcHBpbmdfc2NvcGUgIT0gc2NvcGUpIHsKLSAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgYWxyZWFkeSBhY3RpdmUgZm9yIGRpZmZlcmVudCBzdHJ1Y3QiOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyAiaW50ZXJuYWwgZXJyb3I6IHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZygpIGFscmVhZHkgYWN0aXZlIGZvciB0aGlzIHN0cnVjdCI7Ci0gICAgfQotICB9Ci0KLSAgbWVtYmVyX21hcHBpbmdfc2NvcGUgPSBzY29wZTsKLSAgbWVtYmVyX25hbWVfbWFwcGluZy5jbGVhcigpOwotCi0gIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB1c2VkX21lbWJlcl9uYW1lczsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAvLyBjdXJyZW50IEMjIGdlbmVyYXRvciBwb2xpY3k6Ci0gIC8vIC0gcHJvcCBuYW1lcyBhcmUgYWx3YXlzIHJlbmRlcmVkIHdpdGggYW4gVXBwZXJjYXNlIGZpcnN0IGxldHRlcgotICAvLyAtIHN0cnVjdCBuYW1lcyBhcmUgdXNlZCBhcyBnaXZlbgotCi0gIC8vIHByZXZlbnQgbmFtZSBjb25mbGljdHMgd2l0aCBzdHJ1Y3QgKENTMDU0MiBlcnJvcikKLSAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KHN0cnVjdG5hbWUpOwotCi0gIC8vIHByZXZlbnQgbmFtZSBjb25mbGljdHMgd2l0aCBrbm93biBtZXRob2RzIChUSFJJRlQtMjk0MikKLSAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KCJSZWFkIik7Ci0gIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiV3JpdGUiKTsKLQotICBmb3IgKGl0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGl0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgc3RyaW5nIG9sZG5hbWUgPSAoKml0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyBuZXduYW1lID0gcHJvcF9uYW1lKCppdGVyLCB0cnVlKTsKLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAvLyBuZXcgbmFtZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlcgotICAgICAgaWYgKHVzZWRfbWVtYmVyX25hbWVzLmZpbmQobmV3bmFtZSkgIT0gdXNlZF9tZW1iZXJfbmFtZXMuZW5kKCkpIHsKLSAgICAgICAgcHZlcmJvc2UoInN0cnVjdCAlczogbWVtYmVyICVzIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgbWVtYmVyXG4iLAotICAgICAgICAgICAgICAgICBzdHJ1Y3RuYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIG5ld25hbWUuY19zdHIoKSk7Ci0gICAgICAgIG5ld25hbWUgKz0gJ18nOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLy8gYWRkIGFsd2F5cywgdGhpcyBoZWxwcyB1cyB0byBkZXRlY3QgZWRnZSBjYXNlcyBsaWtlCi0gICAgICAvLyBkaWZmZXJlbnQgc3BlbGxpbmdzICgiZm9vIiBhbmQgIkZvbyIpIHdpdGhpbiB0aGUgc2FtZSBzdHJ1Y3QKLSAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciBtYXBwaW5nICVzID0+ICVzXG4iLAotICAgICAgICAgICAgICAgc3RydWN0bmFtZS5jX3N0cigpLAotICAgICAgICAgICAgICAgb2xkbmFtZS5jX3N0cigpLAotICAgICAgICAgICAgICAgbmV3bmFtZS5jX3N0cigpKTsKLSAgICAgIG1lbWJlcl9uYW1lX21hcHBpbmdbb2xkbmFtZV0gPSBuZXduYW1lOwotICAgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KG5ld25hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBzdXBwcmVzc19tYXBwaW5nKSB7Ci0gIHN0cmluZyBuYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIGlmIChzdXBwcmVzc19tYXBwaW5nKSB7Ci0gICAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0gIH0gZWxzZSB7Ci0gICAgbmFtZSA9IGdldF9tYXBwZWRfbWVtYmVyX25hbWUobmFtZSk7Ci0gIH0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQpIHsKLSAgKHZvaWQpaW5faW5pdDsKLSAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lciwgaW5fcGFyYW0sIGlzX3JlcXVpcmVkKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7Ci0gICAgcmV0dXJuICJEaWN0aW9uYXJ5PCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRydWUpICsgIiwgIgotICAgICAgICAgICArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOwotICAgIHJldHVybiAiVEhhc2hTZXQ8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7Ci0gICAgcmV0dXJuICJMaXN0PCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7Ci0gIH0KLQotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgc3RyaW5nIHBvc3RmaXggPSAoIWlzX3JlcXVpcmVkICYmIG51bGxhYmxlXyAmJiBpbl9wYXJhbSAmJiB0dHlwZS0+aXNfZW51bSgpKSA/ICI/IiA6ICIiOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBzdHJpbmcgbnMgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjc2hhcnAiKTsKLSAgICBpZiAoIW5zLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBucyArICIuIiArIG5vcm1hbGl6ZV9uYW1lKHR0eXBlLT5nZXRfbmFtZSgpKSArIHBvc3RmaXg7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKHR0eXBlLT5nZXRfbmFtZSgpKSArIHBvc3RmaXg7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQpIHsKLSAgKHZvaWQpaW5fY29udGFpbmVyOwotICBzdHJpbmcgcG9zdGZpeCA9ICghaXNfcmVxdWlyZWQgJiYgbnVsbGFibGVfICYmIGluX3BhcmFtKSA/ICI/IiA6ICIiOwotICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKSB7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICByZXR1cm4gInZvaWQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gImJ5dGVbXSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICB9Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gImJvb2wiICsgcG9zdGZpeDsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIHJldHVybiAic2J5dGUiICsgcG9zdGZpeDsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuICJzaG9ydCIgKyBwb3N0Zml4OwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludCIgKyBwb3N0Zml4OwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICByZXR1cm4gImxvbmciICsgcG9zdGZpeDsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJkb3VibGUiICsgcG9zdGZpeDsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlLT5nZXRfYmFzZSgpKTsKLSAgfQotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBzdGQ6OnN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiBmaWVsZF9oYXNfZGVmYXVsdCh0ZmllbGQpKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIikwIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCIKLSAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBjb21tYSA9ICh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCA/ICIsICIgOiAiIik7Ci0gIHJldHVybiAiSUFzeW5jUmVzdWx0ICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCi0gICAgICAgICArICIoQXN5bmNDYWxsYmFjayBjYWxsYmFjaywgb2JqZWN0IHN0YXRlIiArIGNvbW1hICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpCi0gICAgICAgICArICIpIjsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCi0gICAgICAgICArICIoSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KSI7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgc3RyaW5nIHRhc2sgPSAiVGFzayI7Ci0gIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkKLSAgICB0YXNrICs9ICI8IiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiPiI7Ci0gIHJldHVybiB0YXNrICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJBc3luYygiCi0gICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiICsgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlN0cmluZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5Cb29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJ5dGUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTWFwIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU2V0IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxpc3QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG9mc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgewotICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvLy8gPHN1bW1hcnk+XG4iLCAiLy8vICIsIGNvbnRlbnRzLCAiLy8vIDwvc3VtbWFyeT5cbiIpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewotICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbjxzZWVhbHNvIGNyZWY9XCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpICsgIlwiLz4iOwotICAgIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2NzaGFycF9kb2Mob3V0LCAodF9kb2MqKWZpZWxkKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7Ci0gICAgc3RyaW5nc3RyZWFtIHBzOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0gICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOwotICAgICAgcHMgPDwgIlxuPHBhcmFtIG5hbWU9XCIiIDw8IHAtPmdldF9uYW1lKCkgPDwgIlwiPiI7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHN0ciA9IHAtPmdldF9kb2MoKTsKLSAgICAgICAgc3RyLmVyYXNlKHN0ZDo6cmVtb3ZlKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksICdcbicpLAotICAgICAgICAgICAgICAgICAgc3RyLmVuZCgpKTsgLy8gcmVtb3ZlIHRoZSBuZXdsaW5lcyB0aGF0IGFwcGVhciBmcm9tIHRoZSBwYXJzZXIKLSAgICAgICAgcHMgPDwgc3RyOwotICAgICAgfQotICAgICAgcHMgPDwgIjwvcGFyYW0+IjsKLSAgICB9Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1bW1hcnk+XG4iICsgdGZ1bmN0aW9uLT5nZXRfZG9jKCkgKyAiPC9zdW1tYXJ5PiIgKyBwcy5zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIik7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgewotICBzdHJpbmcgcGFja2FnZSA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIikgKyAiLiI7Ci0gIH0KLSAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAotICAgIGNzaGFycCwKLSAgICAiQyMiLAotICAgICIgICAgYXN5bmM6ICAgICAgICAgICBBZGRzIEFzeW5jIHN1cHBvcnQgdXNpbmcgVGFzay5SdW4uXG4iCi0gICAgIiAgICBhc3luY2N0cDogICAgICAgIEFkZHMgQXN5bmMgQ1RQIHN1cHBvcnQgdXNpbmcgVGFza0V4LlJ1bi5cbiIKLSAgICAiICAgIHdjZjogICAgICAgICAgICAgQWRkcyBiaW5kaW5ncyBmb3IgV0NGIHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgotICAgICIgICAgc2VyaWFsOiAgICAgICAgICBBZGQgc2VyaWFsaXphdGlvbiBzdXBwb3J0IHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgotICAgICIgICAgbnVsbGFibGU6ICAgICAgICBVc2UgbnVsbGFibGUgdHlwZXMgZm9yIHByb3BlcnRpZXMuXG4iCi0gICAgIiAgICBoYXNoY29kZTogICAgICAgIEdlbmVyYXRlIGEgaGFzaGNvZGUgYW5kIGVxdWFscyBpbXBsZW1lbnRhdGlvbiBmb3IgY2xhc3Nlcy5cbiIKLSAgICAiICAgIHVuaW9uOiAgICAgICAgICAgVXNlIG5ldyB1bmlvbiB0eXBpbmcsIHdoaWNoIGluY2x1ZGVzIGEgc3RhdGljIHJlYWQgZnVuY3Rpb24gZm9yIHVuaW9uICIKLSAgICAidHlwZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2RfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTc2NDg1Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDcyMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnNldDsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBEIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqIGdlbmVyYXRlXyooKSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSB0aGUgYmFzZSBjbGFzcyB0byBlbWl0IGNvZGUgZm9yIHRoZQotICogZ2l2ZW4gZW50aXR5LCBwcmludF8qKCkgZnVuY3Rpb25zIHdyaXRlIGEgcGllY2Ugb2YgY29kZSB0byB0aGUgcGFzc2VkCi0gKiBzdHJlYW0sIGFuZCByZW5kZXJfKigpIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBEIHJlcHJlc2VudGF0aW9uIG9mCi0gKiB0aGUgcGFzc2VkIGVudGl0eS4KLSAqLwotY2xhc3MgdF9kX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X2RfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgKHZvaWQpcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kIjsKLSAgfQotCi1wcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBpbml0X2dlbmVyYXRvcigpIHsKLSAgICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gICAgc3RyaW5nIGRpciA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJkIik7Ci0gICAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7Ci0gICAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICAgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7Ci0gICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOwotICAgIH0KLSAgICBpZiAoIWRpci5lbXB0eSgpKSB7Ci0gICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7Ci0gICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgcGFja2FnZV9kaXJfID0gc3ViZGlyICsgIi8iOwotCi0gICAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICAgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5kIjsKLSAgICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICAgIC8vIFByaW50IGhlYWRlcgotICAgIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8ICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqcHJvZ3JhbV8pIDw8IHByb2dyYW1fbmFtZV8KLSAgICAgICAgICAgICA8PCAiX3R5cGVzOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfdHlwZXNfKTsKLQotICAgIC8vIEluY2x1ZGUgdHlwZSBtb2R1bGVzIGZyb20gb3RoZXIgaW1wb3J0ZWQgcHJvZ3JhbXMuCi0gICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICBmX3R5cGVzXyA8PCAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKihpbmNsdWRlc1tpXSkpIDw8IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICA8PCAiX3R5cGVzOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbmNsdWRlcy5lbXB0eSgpKQotICAgICAgZl90eXBlc18gPDwgZW5kbDsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gICAgLy8gQ2xvc2Ugb3V0cHV0IGZpbGUKLSAgICBmX3R5cGVzXy5jbG9zZSgpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gICAgaWYgKCFjb25zdHMuZW1wdHkoKSkgewotICAgICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBwcm9ncmFtX25hbWVfICsgIl9jb25zdGFudHMuZCI7Ci0gICAgICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgICAgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAgICAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCpwcm9ncmFtXykgPDwgcHJvZ3JhbV9uYW1lXwotICAgICAgICAgICAgICAgPDwgIl9jb25zdGFudHM7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIHByaW50X2RlZmF1bHRfaW1wb3J0cyhmX2NvbnN0cyk7Ci0KLSAgICAgIGZfY29uc3RzIDw8ICJpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICAgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAiaW1tdXRhYmxlKCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGZfY29uc3RzIDw8IGVuZGwgPDwgInN0YXRpYyB0aGlzKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9jb25zdHMgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIGluZGVudChmX2NvbnN0cykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOwotICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKHR5cGUpKSB7Ci0gICAgICAgICAgZl9jb25zdHMgPDwgImNhc3QoaW1tdXRhYmxlKCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSkgIjsKLSAgICAgICAgfQotICAgICAgICBmX2NvbnN0cyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImFsaWFzICIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIiAiCi0gICAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0KLSAgICBzdHJpbmcgZW51bV9uYW1lID0gdGVudW0tPmdldF9uYW1lKCk7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImVudW0gIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3R5cGVzXyA8PCAiLCIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChmX3R5cGVzXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgZl90eXBlc18gPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9Ci0KLSAgICBmX3R5cGVzXyA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGZfdHlwZXNfIDw8IGVuZGw7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICAgcHJpbnRfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gICAgcHJpbnRfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgc3RyaW5nIHN2Y19uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKLSAgICBzdHJpbmcgZl9zZXJ2aWNlbmFtZSA9IHBhY2thZ2VfZGlyXyArIHN2Y19uYW1lICsgIi5kIjsKLSAgICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZTsKLSAgICBmX3NlcnZpY2Uub3BlbihmX3NlcnZpY2VuYW1lLmNfc3RyKCkpOwotICAgIGZfc2VydmljZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBzdmNfbmFtZSA8PCAiOyIKLSAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfc2VydmljZSk7Ci0KLSAgICBmX3NlcnZpY2UgPDwgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXM7IiA8PCBlbmRsOwotCi0gICAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgICBpZiAoZXh0ZW5kc19zZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgIGZfc2VydmljZSA8PCAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKihleHRlbmRzX3NlcnZpY2UtPmdldF9wcm9ncmFtKCkpKQotICAgICAgICAgICAgICAgIDw8IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2UgPDwgZW5kbDsKLQotICAgIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICAgIGV4dGVuZHMgPSAiIDogIiArIHJlbmRlcl90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIH0KLQotICAgIGZfc2VydmljZSA8PCBpbmRlbnQoKSA8PCAiaW50ZXJmYWNlICIgPDwgc3ZjX25hbWUgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBDb2xsZWN0IGFsbCB0aGUgZXhjZXB0aW9uIHR5cGVzIHNlcnZpY2UgbWV0aG9kcyBjYW4gdGhyb3cgc28gd2UgY2FuCi0gICAgLy8gZW1pdCB0aGUgbmVjZXNzYXJ5IGFsaWFzZXMgbGF0ZXIuCi0gICAgc2V0PHRfdHlwZSo+IGV4Y2VwdGlvbl90eXBlczsKLQotICAgIC8vIFByaW50IHRoZSBtZXRob2Qgc2lnbmF0dXJlcy4KLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKLSAgICBmb3IgKGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZm5faXRlcikgewotICAgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpOwotICAgICAgcHJpbnRfZnVuY3Rpb25fc2lnbmF0dXJlKGZfc2VydmljZSwgKmZuX2l0ZXIpOwotICAgICAgZl9zZXJ2aWNlIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBleGNlcHRpb25zID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZXhfaXRlcjsKLSAgICAgIGZvciAoZXhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgZXhfaXRlciAhPSBleGNlcHRpb25zLmVuZCgpOyArK2V4X2l0ZXIpIHsKLSAgICAgICAgZXhjZXB0aW9uX3R5cGVzLmluc2VydCgoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBbGlhcyB0aGUgZXhjZXB0aW9uIHR5cGVzIGludG8gdGhlIGN1cnJlbnQgc2NvcGUuCi0gICAgaWYgKCFleGNlcHRpb25fdHlwZXMuZW1wdHkoKSkKLSAgICAgIGZfc2VydmljZSA8PCBlbmRsOwotICAgIHNldDx0X3R5cGUqPjo6Y29uc3RfaXRlcmF0b3IgZXRfaXRlcjsKLSAgICBmb3IgKGV0X2l0ZXIgPSBleGNlcHRpb25fdHlwZXMuYmVnaW4oKTsgZXRfaXRlciAhPSBleGNlcHRpb25fdHlwZXMuZW5kKCk7ICsrZXRfaXRlcikgewotICAgICAgaW5kZW50KGZfc2VydmljZSkgPDwgImFsaWFzICIgPDwgcmVuZGVyX3BhY2thZ2UoKigqZXRfaXRlciktPmdldF9wcm9ncmFtKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmV0X2l0ZXIpLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpIDw8ICJfdHlwZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiIgPDwgKCpldF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpldF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdGhlIG1ldGhvZCBtZXRhZGF0YS4KLSAgICBvc3RyaW5nc3RyZWFtIG1ldGE7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZuX2l0ZXIpIHsKLSAgICAgIGlmICgoKmZuX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkKLSAgICAgICAgICAmJiAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSAmJiAhKCpmbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWV0YSA8PCAiLCI7Ci0gICAgICB9Ci0KLSAgICAgIG1ldGEgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVE1ldGhvZE1ldGEoYCIgPDwgKCpmbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQobWV0YSkgPDwgIlsiOwotCi0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHBhcmFtcyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0gICAgICBmb3IgKHBfaXRlciA9IHBhcmFtcy5iZWdpbigpOyBwX2l0ZXIgIT0gcGFyYW1zLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG1ldGEgPDwgIiwgIjsKLSAgICAgICAgfQotCi0gICAgICAgIG1ldGEgPDwgIlRQYXJhbU1ldGEoYCIgPDwgKCpwX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJgLCAiIDw8ICgqcF9pdGVyKS0+Z2V0X2tleSgpOwotCi0gICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCpwX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKLSAgICAgICAgICBtZXRhIDw8ICIsIHF7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCpwX2l0ZXIpLT5nZXRfdHlwZSgpLCBjdikgPDwgIn0iOwotICAgICAgICB9Ci0gICAgICAgIG1ldGEgPDwgIikiOwotICAgICAgfQotCi0gICAgICBtZXRhIDw8ICJdIjsKLQotICAgICAgaWYgKCEoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSB8fCAoKmZuX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBtZXRhIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJbIjsKLQotICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZXhjZXB0aW9ucyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZXhfaXRlcjsKLSAgICAgICAgZm9yIChleF9pdGVyID0gZXhjZXB0aW9ucy5iZWdpbigpOyBleF9pdGVyICE9IGV4Y2VwdGlvbnMuZW5kKCk7ICsrZXhfaXRlcikgewotICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWV0YSA8PCAiLCAiOwotICAgICAgICAgIH0KLQotICAgICAgICAgIG1ldGEgPDwgIlRFeGNlcHRpb25NZXRhKGAiIDw8ICgqZXhfaXRlciktPmdldF9uYW1lKCkgPDwgImAsICIgPDwgKCpleF9pdGVyKS0+Z2V0X2tleSgpCi0gICAgICAgICAgICAgICA8PCAiLCBgIiA8PCAoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICJgKSI7Ci0gICAgICAgIH0KLQotICAgICAgICBtZXRhIDw8ICJdIjsKLSAgICAgIH0KLQotICAgICAgaWYgKCgqZm5faXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIG1ldGEgPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRNZXRob2RUeXBlLk9ORVdBWSI7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBtZXRhIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIikiOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgc3RyaW5nIG1ldGFfc3RyKG1ldGEuc3RyKCkpOwotICAgIGlmICghbWV0YV9zdHIuZW1wdHkoKSkgewotICAgICAgZl9zZXJ2aWNlIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVudW0gbWV0aG9kTWV0YSA9IFsiIDw8IG1ldGFfc3RyIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIl07IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIC8vIFNlcnZlciBza2VsZXRvbiBnZW5lcmF0aW9uLgotICAgIHN0cmluZyBmX3NrZWxldG9ubmFtZSA9IHBhY2thZ2VfZGlyXyArIHN2Y19uYW1lICsgIl9zZXJ2ZXIuc2tlbGV0b24uZCI7Ci0gICAgc3RkOjpvZnN0cmVhbSBmX3NrZWxldG9uOwotICAgIGZfc2tlbGV0b24ub3BlbihmX3NrZWxldG9ubmFtZS5jX3N0cigpKTsKLSAgICBwcmludF9zZXJ2ZXJfc2tlbGV0b24oZl9za2VsZXRvbiwgdHNlcnZpY2UpOwotICAgIGZfc2tlbGV0b24uY2xvc2UoKTsKLSAgfQotCi1wcml2YXRlOgotICAvKioKLSAgICogV3JpdGVzIGEgc2VydmVyIHNrZWxldG9uIGZvciB0aGUgcGFzc2VkIHNlcnZpY2UgdG8gb3V0LgotICAgKi8KLSAgdm9pZCBwcmludF9zZXJ2ZXJfc2tlbGV0b24ob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgc3RyaW5nIHN2Y19uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgICBvdXQgPDwgIi8qIiA8PCBlbmRsCi0gICAgICAgIDw8ICIgKiBUaGlzIGF1dG8tZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIGJ1aWxkIGEgc2VydmVyLiBJZiB5b3UiIDw8IGVuZGwKLSAgICAgICAgPDwgIiAqIGludGVuZCB0byBjdXN0b21pemUgaXQsIHlvdSBzaG91bGQgZWRpdCBhIGNvcHkgd2l0aCBhbm90aGVyIGZpbGUgbmFtZSB0byAiIDw8IGVuZGwKLSAgICAgICAgPDwgIiAqIGF2b2lkIG92ZXJ3cml0aW5nIGl0IHdoZW4gcnVubmluZyB0aGUgZ2VuZXJhdG9yIGFnYWluLiIgPDwgZW5kbCA8PCAiICovIiA8PCBlbmRsCi0gICAgICAgIDw8ICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqdHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHN2Y19uYW1lIDw8ICJfc2VydmVyOyIgPDwgZW5kbAotICAgICAgICA8PCBlbmRsIDw8ICJpbXBvcnQgc3RkLnN0ZGlvOyIgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC5jb2RlZ2VuLnByb2Nlc3NvcjsiIDw8IGVuZGwKLSAgICAgICAgPDwgImltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OyIgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC5zZXJ2ZXIuc2ltcGxlOyIgPDwgZW5kbAotICAgICAgICA8PCAiaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsiIDw8IGVuZGwgPDwgImltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOyIKLSAgICAgICAgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwgImltcG9ydCAiCi0gICAgICAgIDw8IHJlbmRlcl9wYWNrYWdlKCp0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc3ZjX25hbWUgPDwgIjsiIDw8IGVuZGwgPDwgImltcG9ydCAiCi0gICAgICAgIDw8IHJlbmRlcl9wYWNrYWdlKCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXM7IiA8PCBlbmRsIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICA8PCAiY2xhc3MgIiA8PCBzdmNfbmFtZSA8PCAiSGFuZGxlciA6ICIgPDwgc3ZjX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzKCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZS4iCi0gICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIHByaW50X2Z1bmN0aW9uX3NpZ25hdHVyZShvdXQsICpmX2l0ZXIpOwotICAgICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gWW91ciBpbXBsZW1lbnRhdGlvbiBnb2VzIGhlcmUuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ3cml0ZWxuKFwiIgotICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGNhbGxlZFwiKTsiIDw8IGVuZGw7Ci0KLSAgICAgIHRfYmFzZV90eXBlKiBydCA9ICh0X2Jhc2VfdHlwZSopKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgICAgaWYgKHJ0LT5nZXRfYmFzZSgpICE9IHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0eXBlb2YocmV0dXJuKS5pbml0OyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaW5kZW50X2Rvd24oKTsKLQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCBtYWluKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF1dG8gcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJhdXRvIHByb2Nlc3NvciA9IG5ldyBUU2VydmljZVByb2Nlc3NvciEiIDw8IHN2Y19uYW1lIDw8ICIobmV3ICIgPDwgc3ZjX25hbWUKLSAgICAgICAgPDwgIkhhbmRsZXIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXV0byBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsiCi0gICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImF1dG8gdHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXV0byBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcigiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJzZXJ2ZXIuc2VydmUoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3RydWN0IG9yIGFuIGV4Y2VwdGlvbiB0eXBlIHRvIG91dC4KLSAgICovCi0gIHZvaWQgcHJpbnRfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAgIGlmIChpc19leGNlcHRpb24pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6IFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIERlY2xhcmUgYWxsIGZpZWxkcy4KLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX3R5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmICghbWVtYmVycy5lbXB0eSgpKQotICAgICAgaW5kZW50KG91dCkgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibWl4aW4gVFN0cnVjdEhlbHBlcnMhKCI7Ci0KLSAgICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgewotICAgICAgLy8gSWYgdGhlcmUgYXJlIGFueSBmaWVsZHMsIGNvbnN0cnVjdCB0aGUgVEZpZWxkTWV0YSBhcnJheSB0byBwYXNzIHRvCi0gICAgICAvLyBUU3RydWN0SGVscGVycy4gV2UgY2FuJ3QganVzdCBwYXNzIGFuIGVtcHR5IGFycmF5IGlmIG5vdCBiZWNhdXNlIFtdCi0gICAgICAvLyBkb2Vzbid0IHBhc3MgdGhlIFRGaWVsZE1ldGFbXSBjb25zdHJhaW50LgotICAgICAgb3V0IDw8ICJbIjsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCBlbmRsOwotCi0gICAgICAgIGluZGVudChvdXQpIDw8ICJURmllbGRNZXRhKGAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKTsKLQotICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICAgIHRfZmllbGQ6OmVfcmVxIHJlcSA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpOwotICAgICAgICBvdXQgPDwgIiwgIiA8PCByZW5kZXJfcmVxKHJlcSk7Ci0gICAgICAgIGlmIChjdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgb3V0IDw8ICIsIHF7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBjdikgPDwgIn0iOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAiKSI7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXSI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludHMgdGhlIEQgZnVuY3Rpb24gc2lnbmF0dXJlIChpbmNsdWRpbmcgcmV0dXJuIHR5cGUpIGZvciB0aGUgZ2l2ZW4KLSAgICogbWV0aG9kLgotICAgKi8KLSAgdm9pZCBwcmludF9mdW5jdGlvbl9zaWduYXR1cmUob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiBmbikgewotICAgIG91dCA8PCByZW5kZXJfdHlwZV9uYW1lKGZuLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiICIgPDwgZm4tPmdldF9uYW1lKCkgPDwgIigiOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gZm4tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgfQotICAgICAgb3V0IDw8IHJlbmRlcl90eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLQotICAgIG91dCA8PCAiKSI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgRCByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZS4gVGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIGEKLSAgICogc2luZ2xlIGV4cHJlc3Npb247IGZvciBjb21wbGV4IHR5cGVzLCBpbW1lZGlhdGVseSBjYWxsZWQgZGVsZWdhdGUKLSAgICogbGl0ZXJhbHMgYXJlIHVzZWQgdG8gYWNoaWV2ZSB0aGlzLgotICAgKi8KLSAgc3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICAgLy8gUmVzb2x2ZSBhbnkgdHlwZWRlZnMuCi0gICAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgICBvc3RyaW5nc3RyZWFtIG91dDsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgImNhc3QoIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJDb21waWxlciBlcnJvcjogTm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgImNhc3QoIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJ7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIiB2OyIgPDwgZW5kbDsKLSAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ2ID0gIiA8PCAodHlwZS0+aXNfeGNlcHRpb24oKSA/ICJuZXcgIiA6ICIiKSA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICAgICAgdGhyb3cgIlR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIgotICAgICAgICAgICAgICAgICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidi5zZXQhYCIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICJgKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgICAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgICAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInZbIjsKLSAgICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKGt0eXBlKSkgewotICAgICAgICAgICAgb3V0IDw8ICJjYXN0KGltbXV0YWJsZSgiIDw8IHJlbmRlcl90eXBlX25hbWUoa3R5cGUpIDw8ICIpKSI7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dCA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ2IH49ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ2IH49ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyAiQ29tcGlsZXIgZXJyb3I6IEludmFsaWQgdHlwZSBpbiByZW5kZXJfY29uc3RfdmFsdWU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB2OyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9KCkiOwotICAgIH0KLQotICAgIHJldHVybiBvdXQuc3RyKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgRCBwYWNrYWdlIHRvIHdoaWNoIG1vZHVsZXMgZm9yIHByb2dyYW0gYXJlIHdyaXR0ZW4gKHdpdGggYQotICAgKiB0cmFpbGluZyBkb3QsIGlmIG5vdCBlbXB0eSkuCi0gICAqLwotICBzdHJpbmcgcmVuZGVyX3BhY2thZ2UoY29uc3QgdF9wcm9ncmFtJiBwcm9ncmFtKSBjb25zdCB7Ci0gICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLmdldF9uYW1lc3BhY2UoImQiKTsKLSAgICBpZiAocGFja2FnZS5zaXplKCkgPT0gMCkKLSAgICAgIHJldHVybiAiIjsKLSAgICByZXR1cm4gcGFja2FnZSArICIuIjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBEIHJlcGVzZW50YXRpb24gb2YgdHR5cGUuCi0gICAqCi0gICAqIElmIGlzQXJnIGlzIHRydWUsIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIHdpbGwgYmUgcmV0dXJuZWQgZm9yCi0gICAqIHN0cnVjdHMuCi0gICAqLwotICBzdHJpbmcgcmVuZGVyX3R5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlLCBib29sIGlzQXJnID0gZmFsc2UpIGNvbnN0IHsKLSAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICByZXR1cm4gInZvaWQiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmV0dXJuICJib29sIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgcmV0dXJuICJieXRlIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICByZXR1cm4gInNob3J0IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZXR1cm4gImludCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJsb25nIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXR1cm4gImRvdWJsZSI7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiQ29tcGlsZXIgZXJyb3I6IE5vIEQgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOwotICAgICAgaWYgKHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpKSB7Ci0gICAgICAgIHJldHVybiB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKLSAgICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKLSAgICAgICAgdF90eXBlKiBrdHlwZSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOwotCi0gICAgICAgIHN0cmluZyBuYW1lID0gcmVuZGVyX3R5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkgKyAiWyI7Ci0gICAgICAgIGlmICghaXNfaW1tdXRhYmxlX3R5cGUoa3R5cGUpKSB7Ci0gICAgICAgICAgbmFtZSArPSAiaW1tdXRhYmxlKCI7Ci0gICAgICAgIH0KLSAgICAgICAgbmFtZSArPSByZW5kZXJfdHlwZV9uYW1lKGt0eXBlKTsKLSAgICAgICAgaWYgKCFpc19pbW11dGFibGVfdHlwZShrdHlwZSkpIHsKLSAgICAgICAgICBuYW1lICs9ICIpIjsKLSAgICAgICAgfQotICAgICAgICBuYW1lICs9ICJdIjsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7Ci0gICAgICAgIHJldHVybiAiSGFzaFNldCEoIiArIHJlbmRlcl90eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKLSAgICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7Ci0gICAgICAgIHJldHVybiByZW5kZXJfdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIltdIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpICYmIGlzQXJnKSB7Ci0gICAgICByZXR1cm4gInJlZiBjb25zdCgiICsgdHR5cGUtPmdldF9uYW1lKCkgKyAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgRCBUUmVxIGVudW0gbWVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gcmVxLgotICAgKi8KLSAgc3RyaW5nIHJlbmRlcl9yZXEodF9maWVsZDo6ZV9yZXEgcmVxKSBjb25zdCB7Ci0gICAgc3dpdGNoIChyZXEpIHsKLSAgICBjYXNlIHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ6Ci0gICAgICByZXR1cm4gIlRSZXEuT1BUX0lOX1JFUV9PVVQiOwotICAgIGNhc2UgdF9maWVsZDo6VF9PUFRJT05BTDoKLSAgICAgIHJldHVybiAiVFJlcS5PUFRJT05BTCI7Ci0gICAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgotICAgICAgcmV0dXJuICJUUmVxLlJFUVVJUkVEIjsKLSAgICBkZWZhdWx0OiB7Ci0gICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICAgIHNzIDw8ICJDb21waWxlciBlcnJvcjogSW52YWxpZCByZXF1aXJlbWVudCBsZXZlbCAiIDw8IHJlcTsKLSAgICAgIHRocm93IHNzLnN0cigpOwotICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBkZWZhdWx0IGxpc3Qgb2YgaW1wb3J0cyAod2hpY2ggYXJlIHdyaXR0ZW4gdG8gZXZlcnkgZ2VuZXJhdGVkCi0gICAqIG1vZHVsZSkgdG8gZi4KLSAgICovCi0gIHZvaWQgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKG9zdHJlYW0mIG91dCkgewotICAgIGluZGVudChvdXQpIDw8ICJpbXBvcnQgdGhyaWZ0LmJhc2U7IiA8PCBlbmRsIDw8ICJpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCAiaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHR5cGUgaXMgwrtpbnRyaW5zaWNhbGx5IGltbXV0YWJsZcKrLCBpbiB0aGUgc2Vuc2UgdGhhdAotICAgKiBhIHZhbHVlIG9mIHRoYXQgdHlwZSBpcyBpbXBsaWNpdGx5IGNhc3RhYmxlIHRvIGltbXV0YWJsZSh0eXBlKSwgYW5kIGl0IGlzCi0gICAqIGFsbG93ZWQgZm9yIEFBIGtleXMgd2l0aG91dCBhbiBpbW11dGFibGUoKSBxdWFsaWZpZXIuCi0gICAqLwotICBib29sIGlzX2ltbXV0YWJsZV90eXBlKHRfdHlwZSogdHlwZSkgY29uc3QgewotICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICAgIHJldHVybiB0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKTsKLSAgfQotCi0gIC8qCi0gICAqIEZpbGUgc3RyZWFtcywgc3RvcmVkIGhlcmUgdG8gYXZvaWQgcGFzc2luZyB0aGVtIGFzIHBhcmFtZXRlcnMgdG8gZXZlcnkKLSAgICogZnVuY3Rpb24uCi0gICAqLwotICBvZnN0cmVhbSBmX3R5cGVzXzsKLSAgb2ZzdHJlYW0gZl9oZWFkZXJfOwotCi0gIHN0cmluZyBwYWNrYWdlX2Rpcl87Ci19OwotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGQsICJEIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGY0OWM2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzkwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGNjdHlwZT4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi1jbGFzcyB0X2RlbHBoaV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9kZWxwaGlfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgaW5kZW50X2ltcGxfID0gMDsKLSAgICBoYXNfZm9yd2FyZCA9IGZhbHNlOwotICAgIGhhc19lbnVtID0gZmFsc2U7Ci0gICAgaGFzX2NvbnN0ID0gZmFsc2U7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJhbnNpc3RyX2JpbmFyeSIpOwotICAgIGFuc2lzdHJfYmluYXJ5XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgicmVnaXN0ZXJfdHlwZXMiKTsKLSAgICByZWdpc3Rlcl90eXBlc18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImNvbnN0cHJlZml4Iik7Ci0gICAgY29uc3RwcmVmaXhfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJldmVudHMiKTsKLSAgICBldmVudHNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ4bWxkb2MiKTsKLSAgICB4bWxkb2NfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZGVscGhpIjsKLSAgICBlc2NhcGVfLmNsZWFyKCk7Ci0gICAgZXNjYXBlX1snXCcnXSA9ICInJyI7Ci0gIH0KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGlzX3hjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eV93cml0ZXJfKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljKTsKLQotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RydWN0X2lzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfeGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191bmlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9mYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB4Y2VwdGlvbl9mYWN0cm95X25hbWUpOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9jbGVhcl91bmlvbl92YWx1ZShvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191bmlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9mYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB4Y2VwdGlvbl9mYWN0cm95X25hbWUpOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90b3N0cmluZ19pbXBsKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSk7Ci0KLSAgdm9pZCBhZGRfZGVscGhpX3VzZXNfbGlzdChzdHJpbmcgdW5pdG5hbWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2NyZWF0ZV9leGNlcHRpb25faW1wbChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotCi0gIGJvb2wgY29uc3RfbmVlZHNfdmFyKHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgcHJpbnRfY29uc3RfcHJvcChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICB2b2lkIHByaW50X3ByaXZhdGVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIHZhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICB2b2lkIGluaXRpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiB2YXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICB2b2lkIGZpbmFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19ubSA9ICIiKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgdm9pZCBwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvc3RyZWFtJiB2YXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX25tID0gIiIpOwotICBzdGQ6OnN0cmluZyBtYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKTsKLQotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOwotICB2b2lkIHByaW50X2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X2Z1bmMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3Rvcnkob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24ob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcyA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotCi0gIHZvaWQgZGVscGhpX3R5cGVfdXNpbmdzKHN0ZDo6b3N0cmVhbSYgb3V0KTsKLSAgc3RkOjpzdHJpbmcgZGVscGhpX3RocmlmdF91c2luZ3MoKTsKLQotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9jbHMgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9ub19wb3N0Zml4ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX2ZhY3RvcnkgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5ID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBub3JtYWxpemVfY2xzbm0oc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9ub19jaGVja19rZXl3b3JkID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2RlbHBoaV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGlucHV0X2FyZ19wcmVmaXgodF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZ1bGxfY2xzID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgY29uc3RydWN0b3JfYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgY3VycmVudF9pbmRlbnQpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHByb3BfbmFtZShzdGQ6OnN0cmluZyBuYW1lLCBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKHN0cmluZyBuYW1lKTsKLQotICB2b2lkIHdyaXRlX2VudW0oc3RkOjpzdHJpbmcgbGluZSk7Ci0gIHZvaWQgd3JpdGVfZm9yd2FyZF9kZWNyKHN0ZDo6c3RyaW5nIGxpbmUpOwotICB2b2lkIHdyaXRlX2NvbnN0KHN0ZDo6c3RyaW5nIGxpbmUpOwotICB2b2lkIHdyaXRlX3N0cnVjdChzdGQ6OnN0cmluZyBsaW5lKTsKLSAgdm9pZCB3cml0ZV9zZXJ2aWNlKHN0ZDo6c3RyaW5nIGxpbmUpOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygiKCoqXG4iKSArICIgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKLSAgICAgICAgICAgKyAiICpcbiIgKyAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgotICAgICAgICAgICArICIgKilcbiI7Ci0gIH0KLQotICBzdHJpbmcgcmVwbGFjZV9hbGwoc3RyaW5nIGNvbnRlbnRzLCBzdHJpbmcgc2VhcmNoLCBzdHJpbmcgcmVwbGFjZSk7Ci0gIHN0cmluZyB4bWxfZW5jb2RlKHN0cmluZyBjb250ZW50cyk7Ci0gIHN0cmluZyB4bWxkb2NfZW5jb2RlKHN0cmluZyBjb250ZW50cyk7Ci0gIHN0cmluZyB4bWxhdHRyaWJfZW5jb2RlKHN0cmluZyBjb250ZW50cyk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7Ci0KLSAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICAgIH0KLQotICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpOwotICB9Ci0KLXByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9uYW1lXzsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfZm9yd2FyZF9kZWNyOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19lbnVtOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19jb25zdDsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc3RydWN0OwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zZXJ2aWNlOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19jb25zdF9pbXBsOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zdHJ1Y3RfaW1wbDsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc2VydmljZV9pbXBsOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc190eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc190eXBlX2ZhY3RvcnlfZnVuY3M7Ci0gIGJvb2wgaGFzX2ZvcndhcmQ7Ci0gIGJvb2wgaGFzX2VudW07Ci0gIGJvb2wgaGFzX2NvbnN0OwotICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gZGVscGhpX2tleXdvcmRzOwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kOwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvbjsKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gdHlwZXNfa25vd247Ci0gIHN0ZDo6bGlzdDx0X3R5cGVkZWYqPiB0eXBlZGVmc19wZW5kaW5nOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdXNlc19saXN0OwotICB2b2lkIGNyZWF0ZV9rZXl3b3JkcygpOwotICBib29sIGZpbmRfa2V5d29yZChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiYga2V5d29yZF9tYXAsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBub3JtYWxpemVfbmFtZShzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfbWV0aG9kID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9leGNlcHRpb25fbWV0aG9kID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBlbXB0eV92YWx1ZSh0X3R5cGUqIHR5cGUpOwotICBib29sIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0X3R5cGUqIHR0eXBlKTsKLSAgdm9pZCBhZGRfZGVmaW5lZF90eXBlKHRfdHlwZSogdHR5cGUpOwotICB2b2lkIGluaXRfa25vd25fdHlwZXNfbGlzdCgpOwotICBib29sIGlzX3ZvaWQodF90eXBlKiB0eXBlKTsKLSAgaW50IGluZGVudF9pbXBsXzsKLSAgYm9vbCBhbnNpc3RyX2JpbmFyeV87Ci0gIGJvb2wgcmVnaXN0ZXJfdHlwZXNfOwotICBib29sIGNvbnN0cHJlZml4XzsKLSAgYm9vbCBldmVudHNfOwotICBib29sIHhtbGRvY187Ci0gIHZvaWQgaW5kZW50X3VwX2ltcGwoKSB7ICsraW5kZW50X2ltcGxfOyB9OwotICB2b2lkIGluZGVudF9kb3duX2ltcGwoKSB7IC0taW5kZW50X2ltcGxfOyB9OwotICBzdGQ6OnN0cmluZyBpbmRlbnRfaW1wbCgpIHsKLSAgICBzdGQ6OnN0cmluZyBpbmQgPSAiIjsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50X2ltcGxfOyArK2kpIHsKLSAgICAgIGluZCArPSAiICAiOwotICAgIH0KLSAgICByZXR1cm4gaW5kOwotICB9OwotICBzdGQ6Om9zdHJlYW0mIGluZGVudF9pbXBsKHN0ZDo6b3N0cmVhbSYgb3MpIHsgcmV0dXJuIG9zIDw8IGluZGVudF9pbXBsKCk7IH07Ci19OwotCi1zdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpyZXBsYWNlX2FsbChzdHJpbmcgY29udGVudHMsIHN0cmluZyBzZWFyY2gsIHN0cmluZyByZXBsKSB7Ci0gIHN0cmluZyBzdHIoY29udGVudHMpOwotCi0gIHNpemVfdCBzbGVuID0gc2VhcmNoLmxlbmd0aCgpOwotICBzaXplX3QgcmxlbiA9IHJlcGwubGVuZ3RoKCk7Ci0gIHNpemVfdCBpbmNyID0gKHJsZW4gPiAwKSA/IHJsZW4gOiAxOwotCi0gIGlmIChzbGVuID4gMCkgewotICAgIHNpemVfdCBmb3VuZCA9IHN0ci5maW5kKHNlYXJjaCk7Ci0gICAgd2hpbGUgKChmb3VuZCAhPSBzdHJpbmc6Om5wb3MpICYmIChmb3VuZCA8IHN0ci5sZW5ndGgoKSkpIHsKLSAgICAgIHN0ci5yZXBsYWNlKGZvdW5kLCBzbGVuLCByZXBsKTsKLSAgICAgIGZvdW5kID0gc3RyLmZpbmQoc2VhcmNoLCBmb3VuZCArIGluY3IpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBzdHI7Ci19Ci0KLS8vIFhNTCBlbmNvZGluZwotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6eG1sX2VuY29kZShzdHJpbmcgY29udGVudHMpIHsKLSAgc3RyaW5nIHN0cihjb250ZW50cyk7Ci0KLSAgLy8gZXNjYXBlIHRoZSBlc2NhcGUKLSAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiJiIsICImYW1wOyIpOwotCi0gIC8vIG90aGVyIHN0YW5kYXJkIFhNTCBlbnRpdGllcwotICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICI8IiwgIiZsdDsiKTsKLSAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiPiIsICImZ3Q7Iik7Ci0KLSAgcmV0dXJuIHN0cjsKLX0KLQotLy8gWE1MIGF0dHJpYnV0ZSBlbmNvZGluZwotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6eG1sYXR0cmliX2VuY29kZShzdHJpbmcgY29udGVudHMpIHsKLSAgc3RyaW5nIHN0cih4bWxfZW5jb2RlKGNvbnRlbnRzKSk7Ci0KLSAgLy8gb3VyIGF0dHJpYnMgYXJlIGVuY2xvc2VkIGluICIKLSAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXCIiLCAiXFxcIiIpOwotCi0gIHJldHVybiBzdHI7Ci19Ci0KLS8vIFhNTCBlbmNvZGluZyBmb3IgZG9jIGNvbW1lbnRzCi1zdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjp4bWxkb2NfZW5jb2RlKHN0cmluZyBjb250ZW50cykgewotICBzdHJpbmcgc3RyKHhtbF9lbmNvZGUoY29udGVudHMpKTsKLQotICAvLyBYTUxEb2Mgc3BlY2lmaWM6IGNvbnZlcnQgbGluZWJyZWFrcyBpbnRvIDxwYXJhPmdyYXBoczwvcGFyYT4KLSAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXHJcbiIsICJcciIpOwotICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICJcbiIsICJcciIpOwotICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICJcciIsICI8L3BhcmE+XG48cGFyYT4iKTsKLQotICByZXR1cm4gc3RyOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKSB7Ci0gIGlmICh4bWxkb2NfKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7JFJFR0lPTiAnWE1MRG9jJ30vLy8gPHN1bW1hcnk+XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHBhcmE+IiArIGNvbnRlbnRzICsgIjwvcGFyYT4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gPC9zdW1tYXJ5PlxueyRFTkRSRUdJT059XG4iKTsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmICh4bWxkb2NfKSB7Ci0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKLSAgICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0geG1sZG9jX2VuY29kZShmaWVsZC0+Z2V0X2RvYygpKSArICJcbjxzZWVhbHNvIGNyZWY9XCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgeG1sZG9jX2VuY29kZSh0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpKSArICJcIi8+IjsKLSAgICAgIGdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSAmJiB4bWxkb2NfKSB7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KG91dCwgeG1sZG9jX2VuY29kZSh0ZG9jLT5nZXRfZG9jKCkpKTsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkgJiYgeG1sZG9jXykgewotICAgIHN0cmluZ3N0cmVhbSBwczsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHBzIDw8ICJcbjxwYXJhbSBuYW1lPVwiIiA8PCB4bWxhdHRyaWJfZW5jb2RlKHAtPmdldF9uYW1lKCkpIDw8ICJcIj4iOwotICAgICAgaWYgKHAtPmhhc19kb2MoKSkgewotICAgICAgICBzdGQ6OnN0cmluZyBzdHIgPSBwLT5nZXRfZG9jKCk7Ci0gICAgICAgIHN0ci5lcmFzZShzdGQ6OnJlbW92ZShzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLCAnXG4nKSwKLSAgICAgICAgICAgICAgICAgIHN0ci5lbmQoKSk7IC8vIHJlbW92ZSB0aGUgbmV3bGluZXMgdGhhdCBhcHBlYXIgZnJvbSB0aGUgcGFyc2VyCi0gICAgICAgIHBzIDw8IHhtbGRvY19lbmNvZGUoc3RyKTsKLSAgICAgIH0KLSAgICAgIHBzIDw8ICI8L3BhcmFtPiI7Ci0gICAgfQotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyRSRUdJT04gJ1hNTERvYyd9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdW1tYXJ5PjxwYXJhPiIgKyB4bWxkb2NfZW5jb2RlKHRmdW5jdGlvbi0+Z2V0X2RvYygpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvcGFyYT48L3N1bW1hcnk+IiArIHBzLnN0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7JEVORFJFR0lPTn1cbiIpOwotICB9Ci19Ci0KLWJvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjpmaW5kX2tleXdvcmQoc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4mIGtleXdvcmRfbWFwLCBzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGVuID0gbmFtZS5sZW5ndGgoKTsKLQotICBpZiAobGVuIDw9IDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIG5sYXN0ID0gbmFtZS5maW5kX2xhc3Rfb2YoJ18nKTsKLQotICBpZiAobmxhc3QgPj0gMSkgewotICAgIGlmIChubGFzdCA9PSAobGVuIC0gMSkpIHsKLSAgICAgIHN0cmluZyBuZXdfbmFtZShuYW1lLCAwLCBubGFzdCk7Ci0gICAgICByZXR1cm4gZmluZF9rZXl3b3JkKGtleXdvcmRfbWFwLCBuZXdfbmFtZSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAoa2V5d29yZF9tYXBbbmFtZV0gPT0gMSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bm9ybWFsaXplX25hbWUoc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX21ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2V4Y2VwdGlvbl9tZXRob2QpIHsKLSAgc3RyaW5nIHRtcChuYW1lKTsKLSAgc3RkOjp0cmFuc2Zvcm0odG1wLmJlZ2luKCksIHRtcC5lbmQoKSwgdG1wLmJlZ2luKCksIHN0YXRpY19jYXN0PGludCAoKikoaW50KT4oc3RkOjp0b2xvd2VyKSk7Ci0KLSAgYm9vbCBiX2ZvdW5kID0gZmFsc2U7Ci0KLSAgaWYgKGZpbmRfa2V5d29yZChkZWxwaGlfa2V5d29yZHMsIHRtcCkpIHsKLSAgICBiX2ZvdW5kID0gdHJ1ZTsKLSAgfSBlbHNlIGlmIChiX21ldGhvZCAmJiBmaW5kX2tleXdvcmQoZGVscGhpX3Jlc2VydmVkX21ldGhvZCwgdG1wKSkgewotICAgIGJfZm91bmQgPSB0cnVlOwotICB9IGVsc2UgaWYgKGJfZXhjZXB0aW9uX21ldGhvZCAmJiBmaW5kX2tleXdvcmQoZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb24sIHRtcCkpIHsKLSAgICBiX2ZvdW5kID0gdHJ1ZTsKLSAgfQotCi0gIGlmIChiX2ZvdW5kKSB7Ci0gICAgcmV0dXJuIG5hbWUgKyAiXyI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmNyZWF0ZV9rZXl3b3JkcygpIHsKLSAgZGVscGhpX2tleXdvcmRzWyJhbmQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZW5kIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImludGVyZmFjZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJyYWlzZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ1c2VzIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImFycmF5Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImV4Y2VwdCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJpcyJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJyZWNvcmQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidmFyIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImFzIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImV4cG9ydHMiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sibGFiZWwiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicmVwZWF0Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIndoaWxlIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImFzbSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJmaWxlIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImxpYnJhcnkiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicmVzb3VyY2VzdHJpbmciXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sid2l0aCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJiZWdpbiJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJmaW5hbGl6YXRpb24iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sibW9kIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInNldCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ4b3IiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siY2FzZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJmaW5hbGx5Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIm5pbCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJzaGwiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siY2xhc3MiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZm9yIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIm5vdCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJzaHIiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siY29uc3QiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZnVuY3Rpb24iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sib2JqZWN0Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInN0cmluZyJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJjb25zdHJ1Y3RvciJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJnb3RvIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIm9mIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInRoZW4iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZGVzdHJ1Y3RvciJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJpZiJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJvciJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ0aHJlYWR2YXIiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZGlzcGludGVyZmFjZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJpbXBsZW1lbnRhdGlvbiJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJvdXQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidG8iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZGl2Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImluIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInBhY2tlZCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ0cnkiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZG8iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siaW5oZXJpdGVkIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInByb2NlZHVyZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ0eXBlIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImRvd250byJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJpbml0aWFsaXphdGlvbiJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJwcm9ncmFtIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInVuaXQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZWxzZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJpbmxpbmUiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicHJvcGVydHkiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidW50aWwiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicHJpdmF0ZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJwcm90ZWN0ZWQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicHVibGljIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInB1Ymxpc2hlZCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJhdXRvbWF0ZWQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siYXQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sib24iXSA9IDE7Ci0KLSAgLy8gcmVzZXJ2ZWQvcHJlZGVmaW5lZCB2YXJpYWJsZXMgYW5kIHR5cGVzIChsb3dlcmNhc2UhKQotICBkZWxwaGlfa2V5d29yZHNbInJlc3VsdCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ0Ynl0ZXMiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidG9iamVjdCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ0Y2xhc3MiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidGludGVyZmFjZWRvYmplY3QiXSA9IDE7Ci0KLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY3JlYXRlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmcmVlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJpbml0aW5zdGFuY2UiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsZWFudXBpbnN0YW5jZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3N0eXBlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc25hbWUiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzbmFtZWlzIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc3BhcmVudCJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NpbmZvIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJpbnN0YW5jZXNpemUiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImluaGVyaXRzZnJvbSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsibWV0aG9kYWRkcmVzcyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsibWV0aG9kYWRkcmVzcyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsibWV0aG9kbmFtZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZmllbGRhZGRyZXNzIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmaWVsZGFkZHJlc3MiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGludGVyZmFjZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aW50ZXJmYWNlZW50cnkiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGludGVyZmFjZXRhYmxlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJ1bml0bmFtZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZXF1YWxzIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRoYXNoY29kZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsidG9zdHJpbmciXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInNhZmVjYWxsZXhjZXB0aW9uIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJhZnRlcmNvbnN0cnVjdGlvbiJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiYmVmb3JlZGVzdHJ1Y3Rpb24iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImRpc3BhdGNoIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJkZWZhdWx0aGFuZGxlciJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsibmV3aW5zdGFuY2UiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZyZWVpbnN0YW5jZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZGVzdHJveSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsicmVhZCJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsid3JpdGUiXSA9IDE7Ci0KLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInNldGlubmVyZXhjZXB0aW9uIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic2V0c3RhY2tpbmZvIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0c3RhY2t0cmFjZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInJhaXNpbmdleGNlcHRpb24iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVmbXQiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXMiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXNmbXQiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVoZWxwIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlZm10aGVscCJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZXJlc2hlbHAiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXNmbXRoZWxwIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0YmFzZWV4Y2VwdGlvbiJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImJhc2VleGNlcHRpb24iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJoZWxwY29udGV4dCJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImlubmVyZXhjZXB0aW9uIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsibWVzc2FnZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInN0YWNrdHJhY2UiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzdGFja2luZm8iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJnZXRleGNlcHRpb25zdGFja2luZm9wcm9jIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0c3RhY2tpbmZvc3RyaW5ncHJvYyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNsZWFudXBzdGFja2luZm9wcm9jIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsicmFpc2VvdXRlcmV4Y2VwdGlvbiJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInRocm93b3V0ZXJleGNlcHRpb24iXSA9IDE7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjphZGRfZGVscGhpX3VzZXNfbGlzdChzdHJpbmcgdW5pdG5hbWUpIHsKLSAgdmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwotICBib29sIGZvdW5kID0gZmFsc2U7Ci0gIGZvciAoc19pdGVyID0gdXNlc19saXN0LmJlZ2luKCk7IHNfaXRlciAhPSB1c2VzX2xpc3QuZW5kKCk7ICsrc19pdGVyKSB7Ci0gICAgaWYgKCgqc19pdGVyKSA9PSB1bml0bmFtZSkgewotICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmICghZm91bmQpIHsKLSAgICB1c2VzX2xpc3QucHVzaF9iYWNrKHVuaXRuYW1lKTsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIGluZGVudF9pbXBsXyA9IDA7Ci0gIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJkZWxwaGkiKTsKLSAgaGFzX2ZvcndhcmQgPSBmYWxzZTsKLSAgaGFzX2VudW0gPSBmYWxzZTsKLSAgaGFzX2NvbnN0ID0gZmFsc2U7Ci0gIGNyZWF0ZV9rZXl3b3JkcygpOwotICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiQ2xhc3NlcyIpOwotICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiU3lzVXRpbHMiKTsKLSAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIkdlbmVyaWNzLkNvbGxlY3Rpb25zIik7Ci0gIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQiKTsKLSAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5VdGlscyIpOwotICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LkNvbGxlY3Rpb25zIik7Ci0gIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuUHJvdG9jb2wiKTsKLSAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5UcmFuc3BvcnQiKTsKLQotICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7Ci0gICAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5UeXBlUmVnaXN0cnkiKTsKLSAgfQotCi0gIGluaXRfa25vd25fdHlwZXNfbGlzdCgpOwotCi0gIHN0cmluZyB1bml0bmFtZSwgbnNuYW1lOwotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgdW5pdG5hbWUgPSBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKTsKLSAgICBuc25hbWUgPSBpbmNsdWRlc1tpXS0+Z2V0X25hbWVzcGFjZSgiZGVscGhpIik7Ci0gICAgaWYgKCIiICE9IG5zbmFtZSkgewotICAgICAgdW5pdG5hbWUgPSBuc25hbWU7Ci0gICAgfQotICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KHVuaXRuYW1lKTsKLSAgfQotCi0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIHN0ZDo6c3RyaW5nIHVuaXRuYW1lID0gcHJvZ3JhbV9uYW1lXzsKLSAgaWYgKCIiICE9IG5hbWVzcGFjZV9uYW1lXykgewotICAgIHVuaXRuYW1lID0gbmFtZXNwYWNlX25hbWVfOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXVuaXRuYW1lLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKHVuaXRuYW1lW2ldID09ICcgJykgewotICAgICAgdW5pdG5hbWUucmVwbGFjZShpLCAxLCAiXyIpOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGZfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyB1bml0bmFtZSArICIucGFzIjsKLSAgc3RkOjpvZnN0cmVhbSBmX2FsbDsKLQotICBmX2FsbC5vcGVuKGZfbmFtZS5jX3N0cigpKTsKLQotICBmX2FsbCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotICBnZW5lcmF0ZV9kZWxwaGlfZG9jKGZfYWxsLCBwcm9ncmFtXyk7Ci0gIGZfYWxsIDw8ICJ1bml0ICIgPDwgdW5pdG5hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl9hbGwgPDwgImludGVyZmFjZSIgPDwgZW5kbCA8PCBlbmRsOwotICBmX2FsbCA8PCAidXNlcyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7Ci0gIGZvciAoc19pdGVyID0gdXNlc19saXN0LmJlZ2luKCk7IHNfaXRlciAhPSB1c2VzX2xpc3QuZW5kKCk7ICsrc19pdGVyKSB7Ci0gICAgaWYgKHNfaXRlciAhPSB1c2VzX2xpc3QuYmVnaW4oKSkgewotICAgICAgZl9hbGwgPDwgIiwiOwotICAgICAgZl9hbGwgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KGZfYWxsKSA8PCAqc19pdGVyOwotICB9Ci0KLSAgZl9hbGwgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIHN0cmluZyB0bXBfdW5pdCh1bml0bmFtZSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCl0bXBfdW5pdC5zaXplKCk7IGkrKykgewotICAgIGlmICh0bXBfdW5pdFtpXSA9PSAnLicpIHsKLSAgICAgIHRtcF91bml0LnJlcGxhY2UoaSwgMSwgIl8iKTsKLSAgICB9Ci0gIH0KLQotICBmX2FsbCA8PCAiY29uc3QiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdAotICAgICAgICAgICAgICAgIDw8ICJfT3B0aW9uX0Fuc2lTdHJfQmluYXJ5ID0gIiA8PCAoYW5zaXN0cl9iaW5hcnlfID8gIlRydWUiIDogIkZhbHNlIikgPDwgIjsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQKLSAgICAgICAgICAgICAgICA8PCAiX09wdGlvbl9SZWdpc3Rlcl9UeXBlcyA9ICIgPDwgKHJlZ2lzdGVyX3R5cGVzXyA/ICJUcnVlIiA6ICJGYWxzZSIpIDw8ICI7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0Ci0gICAgICAgICAgICAgICAgPDwgIl9PcHRpb25fQ29uc3RQcmVmaXggICAgPSAiIDw8IChjb25zdHByZWZpeF8gPyAiVHJ1ZSIgOiAiRmFsc2UiKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQgPDwgIl9PcHRpb25fRXZlbnRzICAgICAgICAgPSAiIDw8IChldmVudHNfID8gIlRydWUiIDogIkZhbHNlIikKLSAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQgPDwgIl9PcHRpb25fWG1sRG9jICAgICAgICAgPSAiIDw8ICh4bWxkb2NfID8gIlRydWUiIDogIkZhbHNlIikKLSAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX2FsbCA8PCBlbmRsOwotICBmX2FsbCA8PCAidHlwZSIgPDwgZW5kbDsKLSAgaWYgKGhhc19mb3J3YXJkKSB7Ci0gICAgZl9hbGwgPDwgc19mb3J3YXJkX2RlY3Iuc3RyKCkgPDwgZW5kbDsKLSAgfQotICBpZiAoaGFzX2VudW0pIHsKLSAgICBpbmRlbnQoZl9hbGwpIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfYWxsKSA8PCAieyRTQ09QRURFTlVNUyBPTn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBmX2FsbCA8PCBzX2VudW0uc3RyKCk7Ci0gICAgaW5kZW50KGZfYWxsKSA8PCAieyRTQ09QRURFTlVNUyBPRkZ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgZl9hbGwgPDwgc19zdHJ1Y3Quc3RyKCk7Ci0gIGZfYWxsIDw8IHNfc2VydmljZS5zdHIoKTsKLSAgZl9hbGwgPDwgc19jb25zdC5zdHIoKTsKLSAgZl9hbGwgPDwgImltcGxlbWVudGF0aW9uIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfYWxsIDw8IHNfc3RydWN0X2ltcGwuc3RyKCk7Ci0gIGZfYWxsIDw8IHNfc2VydmljZV9pbXBsLnN0cigpOwotICBmX2FsbCA8PCBzX2NvbnN0X2ltcGwuc3RyKCk7Ci0KLSAgaWYgKHJlZ2lzdGVyX3R5cGVzXykgewotICAgIGZfYWxsIDw8IGVuZGw7Ci0gICAgZl9hbGwgPDwgIi8vIFR5cGUgZmFjdG9yeSBtZXRob2RzIGFuZCByZWdpc3RyYXRpb24iIDw8IGVuZGw7Ci0gICAgZl9hbGwgPDwgc190eXBlX2ZhY3RvcnlfZnVuY3Muc3RyKCk7Ci0gICAgZl9hbGwgPDwgInByb2NlZHVyZSBSZWdpc3RlclR5cGVGYWN0b3JpZXM7IiA8PCBlbmRsOwotICAgIGZfYWxsIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBmX2FsbCA8PCBzX3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24uc3RyKCk7Ci0gICAgZl9hbGwgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9hbGwgPDwgZW5kbDsKLQotICBzdHJpbmcgY29uc3RhbnRzX2NsYXNzID0gbWFrZV9jb25zdGFudHNfY2xhc3NuYW1lKCk7Ci0KLSAgZl9hbGwgPDwgImluaXRpYWxpemF0aW9uIiA8PCBlbmRsOwotICBpZiAoaGFzX2NvbnN0KSB7Ci0gICAgZl9hbGwgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjEuMH0gIC8vIEQyMDEwIiA8PCBlbmRsOwotICAgIGZfYWxsIDw8ICIgICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIl9Jbml0aWFsaXplOyIgPDwgZW5kbDsKLSAgICBmX2FsbCA8PCAieyRJRkVORH0iIDw8IGVuZGw7Ci0gIH0KLSAgaWYgKHJlZ2lzdGVyX3R5cGVzXykgewotICAgIGZfYWxsIDw8ICIgIFJlZ2lzdGVyVHlwZUZhY3RvcmllczsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9hbGwgPDwgZW5kbDsKLQotICBmX2FsbCA8PCAiZmluYWxpemF0aW9uIiA8PCBlbmRsOwotICBpZiAoaGFzX2NvbnN0KSB7Ci0gICAgZl9hbGwgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjEuMH0gIC8vIEQyMDEwIiA8PCBlbmRsOwotICAgIGZfYWxsIDw8ICIgICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIl9GaW5hbGl6ZTsiIDw8IGVuZGw7Ci0gICAgZl9hbGwgPDwgInskSUZFTkR9IiA8PCBlbmRsOwotICB9Ci0gIGZfYWxsIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX2FsbCA8PCAiZW5kLiIgPDwgZW5kbDsKLSAgZl9hbGwuY2xvc2UoKTsKLQotICBpZiAoIXR5cGVkZWZzX3BlbmRpbmcuZW1wdHkoKSkgewotICAgIHB3YXJuaW5nKDAsICIlZCB0eXBlZGVmcyB3aXRoIHVucmVzb2x2ZWQgdHlwZSByZWZlcmVuY2VzIGxlZnQ6XG4iLCB0eXBlZGVmc19wZW5kaW5nLnNpemUoKSk7Ci0gICAgZm9yIChzdGQ6Omxpc3Q8dF90eXBlZGVmKj46Oml0ZXJhdG9yIGl0ZXIgPSB0eXBlZGVmc19wZW5kaW5nLmJlZ2luKCk7Ci0gICAgICAgICB0eXBlZGVmc19wZW5kaW5nLmVuZCgpICE9IGl0ZXI7Ci0gICAgICAgICArK2l0ZXIpIHsKLSAgICAgIHB3YXJuaW5nKDAsICItICVzXG4iLCAoKml0ZXIpLT5nZXRfc3ltYm9saWMoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmRlbHBoaV90eXBlX3VzaW5ncyhvc3RyZWFtJiBvdXQpIHsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJDbGFzc2VzLCBTeXNVdGlscywgR2VuZXJpY3MuQ29sbGVjdGlvbnMsIFRocmlmdC5Db2xsZWN0aW9ucywgVGhyaWZ0LlByb3RvY29sLCIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIlRocmlmdC5UcmFuc3BvcnQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIEZvcndhcmQgZGVjbGFyZSBzdHJ1Y3QgZGVmCi0gIGhhc19mb3J3YXJkID0gdHJ1ZTsKLSAgcHZlcmJvc2UoImZvcndhcmQgZGVjbGFyYXRpb24gb2YgJXNcbiIsIHR5cGVfbmFtZSh0c3RydWN0KS5jX3N0cigpKTsKLQotICBzdHJpbmcgd2hhdCA9IHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkgPyAiY2xhc3MiIDogImludGVyZmFjZSI7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChzX2ZvcndhcmRfZGVjcikgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCksIHRydWUpIDw8ICIgPSAiIDw8IHdoYXQgPDwgIjsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBhZGRfZGVmaW5lZF90eXBlKHRzdHJ1Y3QpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIHRfdHlwZSogdHlwZSA9IHR0eXBlZGVmLT5nZXRfdHlwZSgpOwotCi0gIC8vIHdyaXRlIG5vdyBvciBzYXZlIGZvciBsYXRlcj8KLSAgaWYgKCFpc19mdWxseV9kZWZpbmVkX3R5cGUodHlwZSkpIHsKLSAgICBwdmVyYm9zZSgidHlwZWRlZiAlczogdW5yZXNvbHZlZCBkZXBlbmRlbmNpZXMgZm91bmRcbiIsIHR5cGVfbmFtZSh0dHlwZWRlZikuY19zdHIoKSk7Ci0gICAgdHlwZWRlZnNfcGVuZGluZy5wdXNoX2JhY2sodHR5cGVkZWYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc3RydWN0LCB0dHlwZWRlZik7Ci0gIGluZGVudChzX3N0cnVjdCkgPDwgdHlwZV9uYW1lKHR0eXBlZGVmKSA8PCAiID0gIjsKLQotICAvLyBjb21tZW50ZWQgb3V0OiB0aGUgYmVuZWZpdCBpcyBub3QgYmlnIGVub3VnaCB0byByaXNrIGJyZWFraW5nIGV4aXN0aW5nIGNvZGUKLSAgLy8gYm9vbCBjb250YWluZXIgPSB0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCk7Ci0gIC8vIGlmKCAhIGNvbnRhaW5lcikKLSAgLy8gIHNfc3RydWN0IDw8ICJ0eXBlICI7ICAvL3RoZSAidHlwZSBBID0gdHlwZSBCIiBzeW50YXggbGVhZHMgdG8gRTI1NzQgd2l0aCBnZW5lcmljcwotCi0gIHNfc3RydWN0IDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBhZGRfZGVmaW5lZF90eXBlKHR0eXBlZGVmKTsKLX0KLQotYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIGlmICgoTlVMTCAhPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKSkgJiYgKHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IHByb2dyYW1fKSkgewotICAgIHRfc2NvcGUqIHNjb3BlID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPnNjb3BlKCk7Ci0gICAgaWYgKE5VTEwgIT0gc2NvcGUtPmdldF90eXBlKHR0eXBlLT5nZXRfbmFtZSgpKSkgewotICAgICAgLy8gcHJpbnRmKCJ0eXBlICVzIGZvdW5kIGluIGluY2x1ZGVkIHNjb3BlICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgLy8gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiAoMSA9PSB0eXBlc19rbm93blt0eXBlX25hbWUodHR5cGUpXSk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuICgxID09IHR5cGVzX2tub3duW2Jhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpXSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiB0cnVlOyAvLyBlbnVtcyBhcmUgd3JpdHRlbiBmaXJzdCwgYmVmb3JlIGFsbCBvdGhlciB0eXBlcwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKLSAgICByZXR1cm4gaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpKQotICAgICAgICAgICAmJiBpc19mdWxseV9kZWZpbmVkX3R5cGUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKLSAgICByZXR1cm4gaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKLSAgICByZXR1cm4gaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOwotICB9Ci0KLSAgcmV0dXJuICgxID09IHR5cGVzX2tub3duW3R5cGVfbmFtZSh0dHlwZSldKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmFkZF9kZWZpbmVkX3R5cGUodF90eXBlKiB0dHlwZSkgewotICAvLyBtYXJrIGFzIGtub3duIHR5cGUKLSAgdHlwZXNfa25vd25bdHlwZV9uYW1lKHR0eXBlKV0gPSAxOwotCi0gIC8vIGNoZWNrIGFsbCBwZW5kaW5nIHR5cGVkZWZzCi0gIHN0ZDo6bGlzdDx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgaXRlcjsKLSAgYm9vbCBtb3JlID0gdHJ1ZTsKLSAgd2hpbGUgKG1vcmUgJiYgKCF0eXBlZGVmc19wZW5kaW5nLmVtcHR5KCkpKSB7Ci0gICAgbW9yZSA9IGZhbHNlOwotCi0gICAgZm9yIChpdGVyID0gdHlwZWRlZnNfcGVuZGluZy5iZWdpbigpOyB0eXBlZGVmc19wZW5kaW5nLmVuZCgpICE9IGl0ZXI7ICsraXRlcikgewotICAgICAgdF90eXBlZGVmKiB0dHlwZWRlZiA9ICgqaXRlcik7Ci0gICAgICBpZiAoaXNfZnVsbHlfZGVmaW5lZF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBwdmVyYm9zZSgidHlwZWRlZiAlczogYWxsIHBlbmRpbmcgcmVmZXJlbmNlcyBhcmUgbm93IHJlc29sdmVkXG4iLAotICAgICAgICAgICAgICAgICB0eXBlX25hbWUodHR5cGVkZWYpLmNfc3RyKCkpOwotICAgICAgICB0eXBlZGVmc19wZW5kaW5nLmVyYXNlKGl0ZXIpOwotICAgICAgICBnZW5lcmF0ZV90eXBlZGVmKHR0eXBlZGVmKTsKLSAgICAgICAgbW9yZSA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5pdF9rbm93bl90eXBlc19saXN0KCkgewotICAvLyBrbm93biBiYXNlIHR5cGVzCi0gIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfc3RyaW5nKV0gPSAxOwotICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2JpbmFyeSldID0gMTsKLSAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9ib29sKV0gPSAxOwotICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2J5dGUpXSA9IDE7Ci0gIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfaTE2KV0gPSAxOwotICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2kzMildID0gMTsKLSAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9pNjQpXSA9IDE7Ci0gIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfZG91YmxlKV0gPSAxOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGhhc19lbnVtID0gdHJ1ZTsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19lbnVtLCB0ZW51bSk7Ci0gIGluZGVudChzX2VudW0pIDw8IHR5cGVfbmFtZSh0ZW51bSwgdHJ1ZSwgdHJ1ZSkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgPDwgIigiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgaWYgKGNvbnN0YW50cy5lbXB0eSgpKSB7Ci0gICAgaW5kZW50KHNfZW51bSkgPDwgImR1bW15ID0gMCAgLy8gZW1wdHkgZW51bXMgYXJlIG5vdCBhbGxvd2VkIjsKLSAgfSBlbHNlIHsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmJlZ2luKCkpIHsKLSAgICAgICAgc19lbnVtIDw8ICIsIjsKLSAgICAgICAgc19lbnVtIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfZW51bSwgKmNfaXRlcik7Ci0gICAgICBpbmRlbnQoc19lbnVtKSA8PCBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSAiIDw8IHZhbHVlOwotICAgIH0KLSAgfQotICBzX2VudW0gPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfZW51bSkgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9kZWxwaGlfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKLSAgc3RkOjpzdHJpbmcgc3RyID0gZnJvbU5hbWU7Ci0gIGlmIChzdHIuZW1wdHkoKSkgewotICAgIHJldHVybiBzdHI7Ci0gIH0KLQotICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKLSAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKLQotICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0Ci0gIGNoYXIgYyA9IHN0ci5hdCgwKTsKLSAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgewotICAgIHN0ciA9ICJfIiArIHN0cjsKLSAgfQotCi0gIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgewotICAgIGMgPSBzdHIuYXQoaSk7Ci0gICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCi0gICAgICAgICYmICgnXycgIT0gYykpIHsKLSAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHN0cjsKLX0KLQotc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjptYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKSB7Ci0gIGlmIChjb25zdHByZWZpeF8pIHsKLSAgICByZXR1cm4gbWFrZV92YWxpZF9kZWxwaGlfaWRlbnRpZmllcigiVCIgKyBwcm9ncmFtX25hbWVfICsgIkNvbnN0YW50cyIpOwotICB9IGVsc2UgewotICAgIHJldHVybiAiVENvbnN0YW50cyI7IC8vIGNvbXBhdGliaWxpdHkKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaGFzX2NvbnN0ID0gdHJ1ZTsKLSAgc3RyaW5nIGNvbnN0YW50c19jbGFzcyA9IG1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpOwotCi0gIGluZGVudF91cCgpOwotICBpbmRlbnQoc19jb25zdCkgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIiA9IGNsYXNzIiA8PCBlbmRsOwotICBpbmRlbnQoc19jb25zdCkgPDwgInByaXZhdGUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKGNvbnN0X25lZWRzX3ZhcigoKmNfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICBwcmludF9wcml2YXRlX2ZpZWxkKHNfY29uc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX2NvbnN0KSA8PCAicHVibGljIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfY29uc3QsICpjX2l0ZXIpOwotICAgIHByaW50X2NvbnN0X3Byb3Aoc19jb25zdCwKLSAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgfQotICBpbmRlbnQoc19jb25zdCkgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9IiA8PCBlbmRsOwotICBpbmRlbnQoc19jb25zdCkgPDwgImNsYXNzIGNvbnN0cnVjdG9yIENyZWF0ZTsiIDw8IGVuZGw7Ci0gIGluZGVudChzX2NvbnN0KSA8PCAiY2xhc3MgZGVzdHJ1Y3RvciBEZXN0cm95OyIgPDwgZW5kbDsKLSAgaW5kZW50KHNfY29uc3QpIDw8ICJ7JElGRU5EfSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfY29uc3QpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhcnMsIGNvZGU7Ci0KLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbml0aWFsaXplX2ZpZWxkKHZhcnMsCi0gICAgICAgICAgICAgICAgICAgICBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgIkYiICsgcHJvcF9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgfQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0KLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0iIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImNsYXNzIGNvbnN0cnVjdG9yICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIi5DcmVhdGU7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgaWYgKCF2YXJzLnN0cigpLmVtcHR5KCkpIHsKLSAgICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7Ci0gICAgc19jb25zdF9pbXBsIDw8IHZhcnMuc3RyKCk7Ci0gIH0KLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGlmICghY29kZS5zdHIoKS5lbXB0eSgpKSB7Ci0gICAgc19jb25zdF9pbXBsIDw8IGNvZGUuc3RyKCk7Ci0gIH0KLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJjbGFzcyBkZXN0cnVjdG9yICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIi5EZXN0cm95OyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoY29uc3RfbmVlZHNfdmFyKCgqY19pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgIGZpbmFsaXplX2ZpZWxkKHNfY29uc3RfaW1wbCwKLSAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ7JEVMU0V9IiA8PCBlbmRsOwotCi0gIHZhcnMuc3RyKCIiKTsKLSAgY29kZS5zdHIoIiIpOwotCi0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKGNvbnN0X25lZWRzX3ZhcigoKmNfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICBpbml0aWFsaXplX2ZpZWxkKHZhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50c19jbGFzcyArICIuRiIgKyBwcm9wX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotCi0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInByb2NlZHVyZSAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfSW5pdGlhbGl6ZTsiIDw8IGVuZGw7Ci0gIGlmICghdmFycy5zdHIoKS5lbXB0eSgpKSB7Ci0gICAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOwotICAgIHNfY29uc3RfaW1wbCA8PCB2YXJzLnN0cigpOwotICB9Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpZiAoIWNvZGUuc3RyKCkuZW1wdHkoKSkgewotICAgIHNfY29uc3RfaW1wbCA8PCBjb2RlLnN0cigpOwotICB9Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJwcm9jZWR1cmUgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0ZpbmFsaXplOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZmluYWxpemVfZmllbGQoc19jb25zdF9pbXBsLAotICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgY29uc3RhbnRzX2NsYXNzKTsKLSAgfQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInskSUZFTkR9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvc3RyZWFtJiB2YXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfbm0pIHsKLQotICBzdHJpbmcgY2xzX3ByZWZpeDsKLQotICBpZiAoY2xzX25tID09ICIiKSB7Ci0gICAgY2xzX3ByZWZpeCA9ICIiOwotICB9IGVsc2UgewotICAgIGNsc19wcmVmaXggPSBjbHNfbm0gKyAiLiI7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBjbHNfcHJlZml4IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICIuIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBwcm9wX25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpLCB0eXBlLT5pc194Y2VwdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IGNsc19wcmVmaXggPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIlsiIDw8IGtleSA8PCAiXSIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotCi0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBjbHNfcHJlZml4IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICIuQWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X3ByaXZhdGVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKXZhbHVlOwotICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgdmFyIEYiIDw8IG5hbWUgPDwgIjogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLWJvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjb25zdF9uZWVkc192YXIodF90eXBlKiB0eXBlKSB7Ci0gIHRfdHlwZSogdHJ1ZXR5cGUgPSB0eXBlOwotICB3aGlsZSAodHJ1ZXR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHRydWV0eXBlID0gKCh0X3R5cGVkZWYqKXRydWV0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotICByZXR1cm4gKCF0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfcHJvcChzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgKHZvaWQpdmFsdWU7Ci0gIGlmIChjb25zdF9uZWVkc192YXIodHlwZSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgcHJvcGVydHkgIiA8PCBuYW1lIDw8ICI6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgcmVhZCBGIiA8PCBuYW1lIDw8ICI7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhcnM7IC8vIGR1bW15Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIGluZGVudChvdXQpIDw8ICJjb25zdCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7Ci0gIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHRydWV0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIC8vIGFscmVhZHkgZG9uZQotICAgIC8vIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZSggdmFycywgb3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgLy8gaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0eXBuYW1lOwotICAgIHR5cG5hbWUgPSB0eXBlX25hbWUodHJ1ZXR5cGUsIHRydWUsIGZhbHNlLCB0eXBlLT5pc194Y2VwdGlvbigpLCB0eXBlLT5pc194Y2VwdGlvbigpKTsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cG5hbWUgPDwgIi5DcmVhdGU7IiA8PCBlbmRsOwotICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHRydWV0eXBlLCB2YWx1ZSk7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmluaXRpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiB2YXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHByaW50X2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6ZmluYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfbm0pIHsKLSAgKHZvaWQpb3V0OwotICAodm9pZCluYW1lOwotICAodm9pZCl0eXBlOwotICAodm9pZCl2YWx1ZTsKLSAgKHZvaWQpY2xzX25tOwotfQotCi1zdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgdmFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKW5hbWU7Ci0KLSAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7Ci0gIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXRydWV0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZW5kZXIgPDwgIiciIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIiciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJUcnVlIiA6ICJGYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmVuZGVyIDw8ICJTaG9ydEludCggIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJlbmRlciA8PCAiU21hbGxJbnQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZW5kZXIgPDwgIkxvbmdJbnQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgIkludDY0KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIuMCI7IC8vIG1ha2UgaXQgYSBkb3VibGUgY29uc3RhbnQgYnkgYWRkaW5nICIuMCIKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHZhcnMgPDwgIiAgIiA8PCB0IDw8ICIgOiAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBwcmludF9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIHQsIHR5cGUsIHZhbHVlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc19zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgYWRkX2RlZmluZWRfdHlwZSh0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwoc19zdHJ1Y3RfaW1wbCwgIiIsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIGlmIChyZWdpc3Rlcl90eXBlc18pIHsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeShzX3R5cGVfZmFjdG9yeV9mdW5jcywgIiIsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uKHNfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4Y2VwdGlvbik7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgewotCi0gIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBpc19yZXN1bHQsIHRydWUpOwotICB9Ci0KLSAgc3RyaW5nIGNsc19ubTsKLQotICBzdHJpbmcgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZTsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA9IG5vcm1hbGl6ZV9jbHNubSh0c3RydWN0LT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSkgKyAiRmFjdG9yeSI7Ci0gIH0KLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsICghaXNfeF9mYWN0b3J5KSwgaXNfeF9mYWN0b3J5LCB0cnVlKTsKLSAgfSBlbHNlIHsKLSAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UpOwotICB9Ci0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhcnMsIGNvZGU7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpbmRlbnRfdXBfaW1wbCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKLSAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7Ci0gICAgfQotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIGluaXRpYWxpemVfZmllbGQodmFycywKLSAgICAgICAgICAgICAgICAgICAgICAgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIkYiICsgcHJvcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgaXNfZXhjZXB0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBpbmRlbnRfaW1wbChjb2RlKSA8PCAiRl9faXNzZXRfIiA8PCBwcm9wX25hbWUoKCptX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgOj0gVHJ1ZTsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgotICAgICAgICAgICAgICAgICAgIDw8ICJDcmVhdGU7IiA8PCBlbmRsOwotCi0gIGlmICghdmFycy5zdHIoKS5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8ICJ2YXIiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IHZhcnMuc3RyKCk7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpbmhlcml0ZWQgQ3JlYXRlKCcnKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiIDo9IFQiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUKLSAgICAgICAgICAgICAgICAgICAgIDw8ICJJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICghY29kZS5zdHIoKS5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8IGNvZGUuc3RyKCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoKG1lbWJlcnMuc2l6ZSgpID4gMCkgJiYgaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImNvbnN0cnVjdG9yICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iCi0gICAgICAgICAgICAgICAgICAgICA8PCAiQ3JlYXRlKCIgPDwgY29uc3RydWN0b3JfYXJndW1lbnRfbGlzdCh0c3RydWN0LCBpbmRlbnRfaW1wbCgpKSA8PCAiKTsiCi0gICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiQ3JlYXRlOyIgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBzdHJpbmcgcHJvcG5hbWUgPSBwcm9wX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19leGNlcHRpb24pOwotICAgICAgc3RyaW5nIHBhcmFtX25hbWUgPSBjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHByb3BuYW1lIDw8ICIgOj0gIiA8PCBwYXJhbV9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJVcGRhdGVNZXNzYWdlUHJvcGVydHk7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJkZXN0cnVjdG9yICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iCi0gICAgICAgICAgICAgICAgICAgPDwgIkRlc3Ryb3k7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKLSAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7Ci0gICAgfQotICAgIGZpbmFsaXplX2ZpZWxkKG91dCwgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbiksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICB9Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGVhclVuaW9uVmFsdWVzOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKLSAgICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKLSAgICAgIH0KLQotICAgICAgZ2VuZXJhdGVfZGVscGhpX2NsZWFyX3VuaW9uX3ZhbHVlKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc19ubSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptX2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LT5pc191bmlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3hfZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fZmFjdG9yeV9uYW1lKTsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7Ci0gICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgewotICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKLSAgICB9Ci0gICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgY2xzX25tLCB0LCAqbV9pdGVyLCAiRiIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzX25tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbV9pdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0cnVjdC0+aXNfdW5pb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfeF9mYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fZmFjdG9yeV9uYW1lKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgY2xzX25tLCB0LCAqbV9pdGVyLCAiRiIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCghaXNfZXhjZXB0aW9uKSB8fCBpc194X2ZhY3RvcnkpIHsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3Rfd3JpdGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICAgIH0KLSAgfQotICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGlzX3hfZmFjdG9yeSk7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbiAmJiBpc194X2ZhY3RvcnkpIHsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfY3JlYXRlX2V4Y2VwdGlvbl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfZnVuYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBvdXQgPDwgIkNyZWF0ZV8iOwotICBvdXQgPDwgc3RydWN0X2ludGZfbmFtZTsKLSAgb3V0IDw8ICJfSW1wbCI7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeShvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKLSAgKHZvaWQpY2xzX3ByZWZpeDsKLSAgaWYgKGlzX2V4Y2VwdGlvbikKLSAgICByZXR1cm47Ci0gIGlmIChpc19yZXN1bHQpCi0gICAgcmV0dXJuOwotICBpZiAoaXNfeF9mYWN0b3J5KQotICAgIHJldHVybjsKLQotICBzdHJpbmcgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgc3RyaW5nIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSk7Ci0KLSAgb3V0IDw8ICJmdW5jdGlvbiAiOwotICBwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCAiOiAiOwotICBvdXQgPDwgc3RydWN0X2ludGZfbmFtZTsKLSAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICBvdXQgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IGNsc19ubSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7Ci0gICh2b2lkKWNsc19wcmVmaXg7Ci0gIGlmIChpc19leGNlcHRpb24pCi0gICAgcmV0dXJuOwotICBpZiAoaXNfcmVzdWx0KQotICAgIHJldHVybjsKLSAgaWYgKGlzX3hfZmFjdG9yeSkKLSAgICByZXR1cm47Ci0KLSAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiAgVHlwZVJlZ2lzdHJ5LlJlZ2lzdGVyVHlwZUZhY3Rvcnk8IiA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICI+KCI7Ci0gIHByaW50X2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X2Z1bmMob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8ICIpOyI7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKLSAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOwotICBzdHJpbmcgc3RydWN0X2ludGZfbmFtZTsKLSAgc3RyaW5nIHN0cnVjdF9uYW1lOwotICBzdHJpbmcgaXNzZXRfbmFtZTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBzdHJpbmcgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA9IG5vcm1hbGl6ZV9jbHNubSh0c3RydWN0LT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSkgKyAiRmFjdG9yeSI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICB9Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIHN0cnVjdF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsICghaXNfeF9mYWN0b3J5KSwgaXNfeF9mYWN0b3J5KTsKLSAgfSBlbHNlIHsKLSAgICBzdHJ1Y3RfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlKTsKLSAgfQotCi0gIGlmICgoIWlzX2V4Y2VwdGlvbikgfHwgaXNfeF9mYWN0b3J5KSB7Ci0KLSAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgdHN0cnVjdCk7Ci0gICAgaW5kZW50KG91dCkgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiID0gaW50ZXJmYWNlKElCYXNlKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgIH0KLQotICAgIGlmIChpc194X2ZhY3RvcnkpIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIi8vIENyZWF0ZSBFeGNlcHRpb24gT2JqZWN0IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIENyZWF0ZUV4Y2VwdGlvbjogIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgaXNfZXhjZXB0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgICBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgICAgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBpc3NldF9uYW1lIDw8ICI6IEJvb2xlYW4gcmVhZCBHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjsiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX2RlbHBoaV9kb2Mob3V0LCB0c3RydWN0KTsKLSAgaW5kZW50KG91dCkgPDwgc3RydWN0X25hbWUgPDwgIiA9ICI7Ci0gIGlmIChpc19maW5hbCkgewotICAgIG91dCA8PCAic2VhbGVkICI7Ci0gIH0KLSAgb3V0IDw8ICJjbGFzcygiOwotICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgewotICAgIG91dCA8PCAiVEV4Y2VwdGlvbiI7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJUSW50ZXJmYWNlZE9iamVjdCwgSUJhc2UsICIgPDwgc3RydWN0X2ludGZfbmFtZTsKLSAgfQotICBvdXQgPDwgIikiIDw8IGVuZGw7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0eXBlIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaW5fY2xhc3MsIGlzX3Jlc3VsdCwgdHJ1ZSk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInByaXZhdGUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIkYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIiA6IiA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIkYiLCBpc19leGNlcHRpb24pIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBpc3NldF9uYW1lID0gIkZfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgaXNzZXRfbmFtZSA8PCAiOiBCb29sZWFuOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7Ci0gIH0KLQotICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIG91dCA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIvLyBDbGVhciB2YWx1ZXMoZm9yIHVuaW9uJ3MgcHJvcGVydHkgc2V0dGVyKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHJvY2VkdXJlIENsZWFyVW5pb25WYWx1ZXM7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjogQm9vbGVhbjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoKG1lbWJlcnMuc2l6ZSgpID4gMCkgJiYgaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgewotICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlKCIgPDwgY29uc3RydWN0b3JfYXJndW1lbnRfbGlzdCh0c3RydWN0LCBpbmRlbnQoKSkKLSAgICAgICAgICAgICAgICA8PCAiKTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGU7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7IiA8PCBlbmRsOwotCi0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gVG9TdHJpbmc6IHN0cmluZzsgb3ZlcnJpZGU7IiA8PCBlbmRsOwotCi0gIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIi8vIEV4Y2VwdGlvbiBGYWN0b3J5IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwcm9wZXJ0eSAiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIjogIiA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICIgcmVhZCBGIgotICAgICAgICAgICAgICAgIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIiB3cml0ZSBGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKCghaXNfZXhjZXB0aW9uKSB8fCBpc194X2ZhY3RvcnkpIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gSUJhc2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBSZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBXcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbiAmJiBpc194X2ZhY3RvcnkpIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gQ3JlYXRlIEV4Y2VwdGlvbiBPYmplY3QiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIENyZWF0ZUV4Y2VwdGlvbjogIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIi8vIFByb3BlcnRpZXMiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCBpc19leGNlcHRpb24pOwotICAgIH0KLSAgfQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gaXNzZXQiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgaXNzZXRfbmFtZSA8PCAiOiBCb29sZWFuIHJlYWQgR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI7IgotICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpIDw8ICIgPSBjbGFzcyIgPDwgZW5kbDsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJ0eXBlIiA8PCBlbmRsOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLQotICBpbmRlbnRfdXAoKTsKLQotICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCksIHRydWUsIHRydWUpOwotICAgIGV4dGVuZHNfaWZhY2UgPSBleHRlbmRzICsgIi5JZmFjZSI7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiSWZhY2UgPSBpbnRlcmZhY2UoIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIpIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJJZmFjZSA9IGludGVyZmFjZSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgKmZfaXRlcik7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHNfc2VydmljZSwgdHMsIGZhbHNlLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwoc19zZXJ2aWNlX2ltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgaW5kZW50X3VwKCk7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50LCAiOwotICB9Ci0KLSAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLCB0cnVlLCB0cnVlKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLlRDbGllbnQiOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUQ2xpZW50ID0gY2xhc3MoIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiLCBJZmFjZSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRDbGllbnQgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElmYWNlKSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIHByb3Q6IElQcm90b2NvbCk7IG92ZXJsb2FkOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnN0cnVjdG9yICIgPDwgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuVENsaWVudC5DcmVhdGUoIHByb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkNyZWF0ZSggcHJvdCwgcHJvdCApOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoc19zZXJ2aWNlKQotICAgICAgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IG92ZXJsb2FkOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnN0cnVjdG9yICIgPDwgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuVENsaWVudC5DcmVhdGUoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkIENyZWF0ZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3RfIDo9IGlwcm90OyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8gOj0gb3Byb3Q7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgImlwcm90XzogSVByb3RvY29sOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAib3Byb3RfOiBJUHJvdG9jb2w7IiA8PCBlbmRsOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJzZXFpZF86IEludGVnZXI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm9wZXJ0eSBJbnB1dFByb3RvY29sOiBJUHJvdG9jb2wgcmVhZCBpcHJvdF87IiA8PCBlbmRsOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm9wZXJ0eSBPdXRwdXRQcm90b2NvbDogSVByb3RvY29sIHJlYWQgb3Byb3RfOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8ICIvLyBJZmFjZSIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgKmZfaXRlcik7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgZnVsbF9jbHMgPSBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuVENsaWVudCI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZnVsbF9jbHMpIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNfc2VydmljZV9pbXBsIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBzX3NlcnZpY2VfaW1wbCA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgfQotICAgIHNfc2VydmljZV9pbXBsIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgaW5kZW50X2ltcGwoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgIlJlc3VsdCA6PSAiOwotICAgICAgfQotICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICAgIHN0cmluZyBhcmdzX2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKGFyZ3NuYW1lLCAiVCIpOwotICAgIHN0cmluZyBhcmdzX2ludGZubSA9IG5vcm1hbGl6ZV9jbHNubShhcmdzbmFtZSwgIkkiKTsKLQotICAgIHN0cmluZyBhcmdzdmFyID0gdG1wKCJfYXJncyIpOwotICAgIHN0cmluZyBtc2d2YXIgPSB0bXAoIl9tc2ciKTsKLQotICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCBmdWxsX2NscykgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIgOiAiIDw8IGFyZ3NfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBtc2d2YXIgPDwgIiA6IFRocmlmdC5Qcm90b2NvbC5JTWVzc2FnZTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLQotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAic2VxaWRfIDo9IHNlcWlkXyArIDE7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBtc2d2YXIgPDwgIiA6PSBUaHJpZnQuUHJvdG9jb2wuVE1lc3NhZ2VJbXBsLkNyZWF0ZSgnIiA8PCBmdW5uYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PbmV3YXkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRNZXNzYWdlVHlwZS5DYWxsIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgc2VxaWRfKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VCZWdpbiggIiA8PCBtc2d2YXIgPDwgIiApOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiIDo9ICIgPDwgYXJnc19jbHNubSA8PCAiSW1wbC5DcmVhdGUoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIi4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgZW1wdHlfdmFsdWUoKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90Xy5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyBvcmdfcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgICAgIHN0cmluZyByZXN1bHRfY2xzbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJUIik7Ci0gICAgICBzdHJpbmcgcmVzdWx0X2ludGZubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIkkiKTsKLQotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICAgIHN0cmluZyBleGNlcHR2YXIgPSB0bXAoIl9leCIpOwotICAgICAgc3RyaW5nIGFwcGV4dmFyID0gdG1wKCJfYXgiKTsKLSAgICAgIHN0cmluZyByZXR2YXIgPSB0bXAoIl9yZXQiKTsKLQotICAgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgZnVsbF9jbHMpIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgbXNndmFyIDw8ICIgOiBUaHJpZnQuUHJvdG9jb2wuSU1lc3NhZ2U7IiA8PCBlbmRsOwotICAgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBleGNlcHR2YXIgPDwgIiA6IEV4Y2VwdGlvbjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXBwZXh2YXIgPDwgIiA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIgOiAiIDw8IHJlc3VsdF9pbnRmbm0gPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IG1zZ3ZhciA8PCAiIDo9IGlwcm90Xy5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiAoIiA8PCBtc2d2YXIgPDwgIi5UeXBlXyA9IFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pIHRoZW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFwcGV4dmFyIDw8ICIgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoaXByb3RfKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmFpc2UgIiA8PCBhcHBleHZhciA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IHJldHZhciA8PCAiIDo9ICIgPDwgcmVzdWx0X2Nsc25tIDw8ICJJbXBsLkNyZWF0ZSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCByZXR2YXIgPDwgIi5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiAoIiA8PCByZXR2YXIgPDwgIi5fX2lzc2V0X3N1Y2Nlc3MpIHRoZW4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9ICIgPDwgcmV0dmFyIDw8ICIuU3VjY2VzczsiIDw8IGVuZGw7Ci0gICAgICAgIHRfdHlwZSogdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICAgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfbGlzdCgpCi0gICAgICAgICAgICB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCByZXR2YXIgPDwgIi5TdWNjZXNzIDo9IG5pbDsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgKCIgPDwgcmV0dmFyIDw8ICIuX19pc3NldF8iIDw8IHByb3BfbmFtZSgqeF9pdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgdGhlbiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGV4Y2VwdHZhciA8PCAiIDo9ICIgPDwgcmV0dmFyIDw8ICIuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ3JlYXRlRXhjZXB0aW9uOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyYWlzZSAiIDw8IGV4Y2VwdHZhciA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpCi0gICAgICAgICAgICA8PCAicmFpc2UgIgotICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQsICciCi0gICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0Jyk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLQotICBzdHJpbmcgZnVsbF9jbHMgPSBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuVFByb2Nlc3NvckltcGwiOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5UUHJvY2Vzc29ySW1wbCI7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRQcm9jZXNzb3JJbXBsID0gY2xhc3MoIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiLCBJUHJvY2Vzc29yKSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiVFByb2Nlc3NvckltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElQcm9jZXNzb3IpIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIGlmYWNlXzogSWZhY2UgKTsiIDw8IGVuZGw7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnN0cnVjdG9yICIgPDwgZnVsbF9jbHMgPDwgIi5DcmVhdGUoIGlmYWNlXzogSWZhY2UgKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpbmhlcml0ZWQgQ3JlYXRlKCBpZmFjZV8pOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZCBDcmVhdGU7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiU2VsZi5pZmFjZV8gOj0gaWZhY2VfOyIgPDwgZW5kbDsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkFTU0VSVCggcHJvY2Vzc01hcF8gPD4gbmlsKTsgIC8vIGluaGVyaXRlZCIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkKLSAgICAgICAgPDwgInByb2Nlc3NNYXBfIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxzdHJpbmcsIFRQcm9jZXNzRnVuY3Rpb24+LkNyZWF0ZTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicHJvY2Vzc01hcF8uQWRkT3JTZXRWYWx1ZSggJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3MpOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZGVzdHJ1Y3RvciAiIDw8IGZ1bGxfY2xzIDw8ICIuRGVzdHJveTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJpdmF0ZSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJpZmFjZV86IElmYWNlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgewotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgInR5cGUiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRQcm9jZXNzRnVuY3Rpb24gPSByZWZlcmVuY2UgdG8gcHJvY2VkdXJlKCBzZXFpZDogSW50ZWdlcjsgY29uc3QgaXByb3Q6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sIgotICAgICAgICAgICAgICAgICAgICAgIDw8IChldmVudHNfID8gIjsgY29uc3QgZXZlbnRzIDogSVJlcXVlc3RFdmVudHMiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvY2Vzc01hcF86IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3NGdW5jdGlvbj47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJmdW5jdGlvbiBQcm9jZXNzKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMpOiBCb29sZWFuOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbDsgY29uc3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzKTogQm9vbGVhbjsgcmVpbnRyb2R1Y2U7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmdW5jdGlvbiAiIDw8IGZ1bGxfY2xzIDw8ICIuUHJvY2VzcyggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN0IG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiBJUHJvY2Vzc29yRXZlbnRzKTogQm9vbGVhbjsiIDw8IGVuZGw7Ci0gIDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAibXNnIDogVGhyaWZ0LlByb3RvY29sLklNZXNzYWdlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbiA6IFRQcm9jZXNzRnVuY3Rpb247IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInggOiBUQXBwbGljYXRpb25FeGNlcHRpb247IiA8PCBlbmRsOwotICBpZiAoZXZlbnRzXykgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29udGV4dCA6IElSZXF1ZXN0RXZlbnRzOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidHJ5IiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZyA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZuIDo9IG5pbDsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgbm90IHByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBmbikiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Igbm90IEFzc2lnbmVkKGZuKSB0aGVuIiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgVFR5cGUuU3RydWN0KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAieCA6PSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZShUQXBwbGljYXRpb25FeGNlcHRpb24uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRFeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsICdJbnZhbGlkIG1ldGhvZCBuYW1lOiAnJycgKyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLk5hbWUgKyAnJycnKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQotICAgICAgPDwgIm1zZyA6PSBUaHJpZnQuUHJvdG9jb2wuVE1lc3NhZ2VJbXBsLkNyZWF0ZShtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKTsiCi0gICAgICA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gVHJ1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICBpZiAoZXZlbnRzXykgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRoZW4gY29udGV4dCA6PSBldmVudHMuQ3JlYXRlUmVxdWVzdENvbnRleHQobXNnLk5hbWUpIiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZWxzZSBjb250ZXh0IDo9IG5pbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0cnkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90LCBjb250ZXh0KTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgY29udGV4dCA8PiBuaWwgdGhlbiBiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29udGV4dC5DbGVhbnVwQ29udGV4dDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb250ZXh0IDo9IG5pbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZXhjZXB0IiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBGYWxzZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBUcnVlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAiU3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHNfc2VydmljZSwgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOwotICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwoc19zZXJ2aWNlX2ltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCl0c2VydmljZTsKLSAgc3RyaW5nIGZ1bmNuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOwotICBzdHJpbmcgZnVsbF9jbHMgPSBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuVFByb2Nlc3NvckltcGwiOwotCi0gIHN0cmluZyBvcmdfYXJnc25hbWUgPSBmdW5jbmFtZSArICJfYXJncyI7Ci0gIHN0cmluZyBhcmdzX2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19hcmdzbmFtZSwgIlQiKTsKLSAgc3RyaW5nIGFyZ3NfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19hcmdzbmFtZSwgIkkiKTsKLQotICBzdHJpbmcgb3JnX3Jlc3VsdG5hbWUgPSBmdW5jbmFtZSArICJfcmVzdWx0IjsKLSAgc3RyaW5nIHJlc3VsdF9jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIlQiKTsKLSAgc3RyaW5nIHJlc3VsdF9pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJJIik7Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb2NlZHVyZSAiIDw8IGZ1bmNuYW1lCi0gICAgICAgICAgICAgICAgICAgIDw8ICJfUHJvY2Vzcyggc2VxaWQ6IEludGVnZXI7IGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wiCi0gICAgICAgICAgICAgICAgICAgIDw8IChldmVudHNfID8gIjsgY29uc3QgZXZlbnRzIDogSVJlcXVlc3RFdmVudHMiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiLy8gb25lIHdheSBwcm9jZXNzb3IiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICIvLyBib3RoIHdheSBwcm9jZXNzb3IiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkKLSAgICAgIDw8ICJwcm9jZWR1cmUgIiA8PCBmdWxsX2NscyA8PCAiLiIgPDwgZnVuY25hbWUKLSAgICAgIDw8ICJfUHJvY2Vzcyggc2VxaWQ6IEludGVnZXI7IGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wiCi0gICAgICA8PCAoZXZlbnRzXyA/ICI7IGNvbnN0IGV2ZW50cyA6IElSZXF1ZXN0RXZlbnRzIiA6ICIiKSA8PCAiKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3M6ICIgPDwgYXJnc19pbnRmbm0gPDwgIjsiIDw8IGVuZGw7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAibXNnOiBUaHJpZnQuUHJvdG9jb2wuSU1lc3NhZ2U7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0OiAiIDw8IHJlc3VsdF9pbnRmbm0gPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcHB4IDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICBpZiAoZXZlbnRzXykgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5QcmVSZWFkOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3MgOj0gIiA8PCBhcmdzX2Nsc25tIDw8ICJJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXJncy5SZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0gIGlmIChldmVudHNfKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlBvc3RSZWFkOyIgPDwgZW5kbDsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQgOj0gIiA8PCByZXN1bHRfY2xzbm0gPDwgIkltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidHJ5IiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBzX3NlcnZpY2VfaW1wbCA8PCBpbmRlbnRfaW1wbCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgc19zZXJ2aWNlX2ltcGwgPDwgInJldC5TdWNjZXNzIDo9ICI7Ci0gIH0KLSAgc19zZXJ2aWNlX2ltcGwgPDwgImlmYWNlXy4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNfc2VydmljZV9pbXBsIDw8ICIsICI7Ci0gICAgfQotICAgIHNfc2VydmljZV9pbXBsIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpOwotICB9Ci0gIHNfc2VydmljZV9pbXBsIDw8ICIpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgZW1wdHlfdmFsdWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJleGNlcHQiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9uIEU6ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgdHJ1ZSwgdHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkbyBiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIGZhY3RvcnlfbmFtZSA9IG5vcm1hbGl6ZV9jbHNubSgoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCksICIiLCB0cnVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkZhY3RvcnkiOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiA6PSBFLiIgPDwgZmFjdG9yeV9uYW1lIDw8ICI7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaWYoZXZlbnRzXykgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5VbmhhbmRsZWRFcnJvcihFKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcHB4IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yLCBFLk1lc3NhZ2UpOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGlmKGV2ZW50c18pIHsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5QcmVXcml0ZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAibXNnIDo9IFRocmlmdC5Qcm90b2NvbC5UTWVzc2FnZUltcGwuQ3JlYXRlKCciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgc2VxaWQpOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFwcHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKLSAgICBpZihldmVudHNfKSB7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUG9zdFdyaXRlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcHB4LkZyZWU7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaWYgKGV2ZW50c18pIHsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5QcmVXcml0ZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAibXNnIDo9IFRocmlmdC5Qcm90b2NvbC5UTWVzc2FnZUltcGwuQ3JlYXRlKCciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCk7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKLSAgICBpZiAoZXZlbnRzXykgewotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlBvc3RXcml0ZTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKGV2ZW50c18pIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuT25ld2F5Q29tcGxldGU7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLSAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCAiIik7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCBpc194Y2VwdGlvbiwgdHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIjsKLQotICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UpIDw8ICIoIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgImlwcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgewotICAgICAgICAgICAgb3V0IDw8ICJSZWFkQW5zaVN0cmluZygpOyI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpOyI7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAiUmVhZEJvb2woKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAiUmVhZEkxNigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAiUmVhZEkzMigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAiUmVhZEk2NCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAiUmVhZERvdWJsZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEZWxwaGkgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7Ci0gICAgICBvdXQgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgdHlwX25hbWU7Ci0KLSAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICB0eXBfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgdHlwX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UpOwotICB9Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwX25hbWUgPDwgIi5DcmVhdGU7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCBuYW1lIDw8ICIuUmVhZChpcHJvdCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycykgewotCi0gIHN0cmluZyBvYmo7Ci0gIHN0cmluZyBjb3VudGVyOwotICBzdHJpbmcgbG9jYWxfdmFyOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGxvY2FsX3ZhciA9IG9iaiArICI6IElNYXA7IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBJU2V0OyI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGxvY2FsX3ZhciA9IG9iaiArICI6IElMaXN0OyI7Ci0gIH0KLSAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGxvY2FsX3ZhciA8PCBlbmRsOwotICBjb3VudGVyID0gdG1wKCJfaSIpOwotICBsb2NhbF92YXIgPSBjb3VudGVyICsgIjogSW50ZWdlcjsiOwotICBsb2NhbF92YXJzIDw8ICIgICIgPDwgbG9jYWxfdmFyIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBlX25hbWUodHR5cGUsIHRydWUpIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBpcHJvdC5SZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBpcHJvdC5SZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gaXByb3QuUmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgImZvciAiIDw8IGNvdW50ZXIgPDwgIiA6PSAwIHRvICIgPDwgb2JqIDw8ICIuQ291bnQgLSAxIGRvIiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X21hcCopdHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X3NldCopdHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbGlzdCopdHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOwotICB9Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaXByb3QuUmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpcHJvdC5SZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpcHJvdC5SZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0KLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHN0cmluZyBsb2NhbF92YXI7Ci0KLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0gIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZma2V5LCAiIiwgbG9jYWxfdmFycyk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZmdmFsLCAiIiwgbG9jYWxfdmFycyk7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgIi5BZGRPclNldFZhbHVlKCAiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLSAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZmVsZW0sICIiLCBsb2NhbF92YXJzKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0gIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZlbGVtLCAiIiwgbG9jYWxfdmFycyk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLSAgKHZvaWQpbG9jYWxfdmFyczsKLQotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbik7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIGlzX3hjZXB0aW9uLCB0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7Ci0gICAgICAgICAgICBvdXQgPDwgIldyaXRlQW5zaVN0cmluZygiOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5KCI7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmcoIjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJXcml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJXcml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJXcml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJXcml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJXcml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERlbHBoaSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAiV3JpdGVJMzIoSW50ZWdlcigiIDw8IG5hbWUgPDwgIikpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gICh2b2lkKWxvY2FsX3ZhcnM7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIG91dCA8PCBpbmRlbnRfaW1wbCgpIDw8IHByZWZpeCA8PCAiLldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLSAgc3RyaW5nIG9iajsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG9iaiA9IHRtcCgibWFwIik7Ci0gICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogSU1hcDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBUTWFwSW1wbC5DcmVhdGUoICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb2JqID0gdG1wKCJzZXRfIik7Ci0gICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogSVNldDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBUU2V0SW1wbC5DcmVhdGUoIgotICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgPDwgIi5Db3VudCk7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlU2V0QmVnaW4oICIgPDwgb2JqIDw8ICIpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJsaXN0XyIpOwotICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IElMaXN0OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG9iaiA8PCAiIDo9IFRMaXN0SW1wbC5DcmVhdGUoIgotICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RCZWdpbiggIiA8PCBvYmogPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgaXRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5LZXlzIGRvIiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGl0ZXIgPDwgIjogIiA8PCB0eXBlX25hbWUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICI7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIiBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgaXRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICI7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIiBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgsIGxvY2FsX3ZhcnMpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9zZXQqKXR0eXBlLCBpdGVyLCBsb2NhbF92YXJzKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9saXN0Kil0dHlwZSwgaXRlciwgbG9jYWxfdmFycyk7Ci0gIH0KLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAma2ZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZ2ZmllbGQsICIiLCBsb2NhbF92YXJzKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmVmaWVsZCwgIiIsIGxvY2FsX3ZhcnMpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZlZmllbGQsICIiLCBsb2NhbF92YXJzKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eShvdXQsIGlzX3hjZXB0aW9uLCB0ZmllbGQsIGlzUHVibGljLCAiR2V0Iik7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cnVjdF9pc194Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCkgewotICAodm9pZClpc1B1YmxpYzsKLQotICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7Ci0gIGdlbmVyYXRlX2RlbHBoaV9kb2Mob3V0LCB0ZmllbGQpOwotICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBwcm9wX25hbWUodGZpZWxkLCBzdHJ1Y3RfaXNfeGNlcHRpb24pIDw8ICI6ICIKLSAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICIgcmVhZCAiCi0gICAgICAgICAgICAgIDw8IGZpZWxkUHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiIHdyaXRlIFNldCIKLSAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiOyIgPDwgZW5kbDsKLX0KLQotc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uKSB7Ci0gIHJldHVybiBwcm9wX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpLCBpc194Y2VwdGlvbik7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHN0cmluZyBuYW1lLCBib29sIGlzX3hjZXB0aW9uKSB7Ci0gIHN0cmluZyByZXQgPSBuYW1lOwotICByZXRbMF0gPSB0b3VwcGVyKHJldFswXSk7Ci0gIHJldHVybiBub3JtYWxpemVfbmFtZShyZXQsIHRydWUsIGlzX3hjZXB0aW9uKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyByZXQgPSBuYW1lOwotICByZXRbMF0gPSB0b3VwcGVyKHJldFswXSk7Ci0gIHJldCA9ICJBIiArIHJldDsKLSAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKHJldCwgZmFsc2UsIGZhbHNlKTsKLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bm9ybWFsaXplX2Nsc25tKHN0cmluZyBjbHNubSwgc3RyaW5nIHByZWZpeCwgYm9vbCBiX25vX2NoZWNrX2tleXdvcmQpIHsKLSAgaWYgKGNsc25tLnNpemUoKSA+IDApIHsKLSAgICBjbHNubVswXSA9IHRvdXBwZXIoY2xzbm1bMF0pOwotICB9Ci0gIGlmIChiX25vX2NoZWNrX2tleXdvcmQpIHsKLSAgICByZXR1cm4gcHJlZml4ICsgY2xzbm07Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIGNsc25tKTsKLSAgfQotfQotCi1zdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfY2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9ub19wb3N0Zml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9leGNlcHRpb25fZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZnVsbF9leGNlcHRpb25fZmFjdG9yeSkgewotCi0gIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdF90eXBlZGVmKiB0ZGVmID0gKHRfdHlwZWRlZiopdHR5cGU7Ci0gICAgaWYgKHRkZWYtPmlzX2ZvcndhcmRfdHlwZWRlZigpKSB7IC8vIGZvcndhcmQgdHlwZXMgYWNjb3JkaW5nIHRvIFRIUklGVC0yNDIxCi0gICAgICBpZiAodGRlZi0+Z2V0X3R5cGUoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiB0eXBlX25hbWUodGRlZi0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiX2NscywKLSAgICAgICAgICAgICAgICAgICAgICAgICBiX25vX3Bvc3RmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYl9leGNlcHRpb25fZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgInVucmVzb2x2ZWQgZm9yd2FyZCBkZWNsYXJhdGlvbjogIiArIHRkZWYtPmdldF9zeW1ib2xpYygpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbm9ybWFsaXplX25hbWUoIlQiICsgdGRlZi0+Z2V0X3N5bWJvbGljKCkpOwotICAgIH0KLSAgfQotCi0gIHN0cmluZyB0eXBfbm07Ci0KLSAgc3RyaW5nIHNfZmFjdG9yeTsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBiX2NscyA9IHRydWU7Ci0gICAgYl9ub19wb3N0Zml4ID0gdHJ1ZTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7Ci0gICAgaWYgKGJfY2xzKSB7Ci0gICAgICB0eXBfbm0gPSAiVFRocmlmdERpY3Rpb25hcnlJbXBsIjsKLSAgICB9IGVsc2UgewotICAgICAgdHlwX25tID0gIklUaHJpZnREaWN0aW9uYXJ5IjsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cF9ubSArICI8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpKQotICAgICAgICAgICArICI+IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7Ci0gICAgaWYgKGJfY2xzKSB7Ci0gICAgICB0eXBfbm0gPSAiVEhhc2hTZXRJbXBsIjsKLSAgICB9IGVsc2UgewotICAgICAgdHlwX25tID0gIklIYXNoU2V0IjsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cF9ubSArICI8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7Ci0gICAgaWYgKGJfY2xzKSB7Ci0gICAgICB0eXBfbm0gPSAiVFRocmlmdExpc3RJbXBsIjsKLSAgICB9IGVsc2UgewotICAgICAgdHlwX25tID0gIklUaHJpZnRMaXN0IjsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cF9ubSArICI8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKLSAgfQotCi0gIHN0cmluZyB0eXBlX3ByZWZpeDsKLQotICBpZiAoYl9jbHMpIHsKLSAgICB0eXBlX3ByZWZpeCA9ICJUIjsKLSAgfSBlbHNlIHsKLSAgICB0eXBlX3ByZWZpeCA9ICJJIjsKLSAgfQotCi0gIHN0cmluZyBubSA9IG5vcm1hbGl6ZV9jbHNubSh0dHlwZS0+Z2V0X25hbWUoKSwgdHlwZV9wcmVmaXgpOwotCi0gIGlmIChiX2V4Y2VwdGlvbl9mYWN0b3J5KSB7Ci0gICAgbm0gPSBubSArICJGYWN0b3J5IjsKLSAgfQotCi0gIGlmIChiX2NscykgewotICAgIGlmICghYl9ub19wb3N0Zml4KSB7Ci0gICAgICBubSA9IG5tICsgIkltcGwiOwotICAgIH0KLSAgfQotCi0gIGlmIChiX2V4Y2VwdGlvbl9mYWN0b3J5ICYmIGJfZnVsbF9leGNlcHRpb25fZmFjdG9yeSkgewotICAgIHJldHVybiB0eXBlX25hbWUodHR5cGUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSkgKyAiLiIgKyBubTsKLSAgfQotCi0gIHJldHVybiBubTsKLX0KLQotLy8gcmV0dXJucyAiY29uc3QgIiBmb3Igc29tZSBhcmd1bWVudCB0eXBlcwotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5wdXRfYXJnX3ByZWZpeCh0X3R5cGUqIHR0eXBlKSB7Ci0KLSAgLy8gYmFzZSB0eXBlcwotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpIHsKLQotICAgIC8vIHRoZXNlIHNob3VsZCBiZSBjb25zdCdlZCBmb3Igb3B0aW1hbCBwZXJmb3JtYW1jZQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOiAvLyByZWZjb3VudGVkIHBvaW50ZXIKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDogICAgLy8gbGFyZ2VyIHRoYW4gMzIgYml0Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6IC8vIGxhcmdlciB0aGFuIDMyIGJpdAotICAgICAgcmV0dXJuICJjb25zdCAiOwotCi0gICAgLy8gYWxsIG90aGVycyBkb24ndCBuZWVkIHRvIGJlCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gIiI7Ci0KLSAgICAvLyB3ZSBiZXR0ZXIgYWx3YXlzIHJlcG9ydCBhbnkgdW5rbm93biB0eXBlcwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGlucHV0X2FyZ19wcmVmaXgoKSBmb3IgYmFzZSB0eXBlICIKLSAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpOwotICAgIH0KLQotICAgIC8vIGVudW1zCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiIjsgLy8gdXN1YWxseSA8PSAzMiBiaXQKLQotICAgIC8vIGNvbnRhaW5lcnMKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gImNvbnN0ICI7IC8vIHJlZmNvdW50ZWQgcG9pbnRlcgotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJjb25zdCAiOyAvLyByZWZjb3VudGVkIHBvaW50ZXIKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gImNvbnN0ICI7IC8vIHJlZmNvdW50ZWQgcG9pbnRlcgotICB9Ci0KLSAgLy8gYW55IG90aGVyIHR5cGUsIGVpdGhlciBUU29tZXRoaW5nIG9yIElTb21ldGhpbmcKLSAgcmV0dXJuICJjb25zdCAiOyAvLyBwb3NzaWJseSByZWZjb3VudGVkIHBvaW50ZXIKLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKSB7Ci0gIHN3aXRjaCAodGJhc2UtPmdldF9iYXNlKCkpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIC8vIG5vICJ2b2lkIiBpbiBEZWxwaGkgbGFuZ3VhZ2UKLSAgICByZXR1cm4gIiI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKLSAgICAgICAgcmV0dXJuICJBbnNpU3RyaW5nIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAiVEJ5dGVzIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJzdHJpbmciOwotICAgIH0KLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIHJldHVybiAiQm9vbGVhbiI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICByZXR1cm4gIlNob3J0SW50IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuICJTbWFsbEludCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIHJldHVybiAiSW50ZWdlciI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAiSW50NjQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICByZXR1cm4gIkRvdWJsZSI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEZWxwaGkgbmFtZSBmb3IgYmFzZSB0eXBlICIKLSAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UtPmdldF9iYXNlKCkpOwotICB9Ci19Ci0KLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcykgewotICAodm9pZClpbml0OwotCi0gIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKLQotICBzdHJpbmcgcmVzdWx0ID0gcHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpICsgIjogIgotICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgKyAiOyI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZnVsbF9jbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICBzdHJpbmcgcHJlZml4OwotICBpZiAoZnVsbF9jbHMgPT0gIiIpIHsKLSAgICBwcmVmaXggPSAiIjsKLSAgfSBlbHNlIHsKLSAgICBwcmVmaXggPSBmdWxsX2NscyArICIuIjsKLSAgfQotICBpZiAoaXNfdm9pZCh0dHlwZSkpIHsKLSAgICByZXR1cm4gInByb2NlZHVyZSAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgKyAiKCIKLSAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKTsiOwotICB9IGVsc2UgewotICAgIHJldHVybiAiZnVuY3Rpb24gIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIigiCi0gICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik6ICIKLSAgICAgICAgICAgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgKyAiOyI7Ci0gIH0KLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHRfdHlwZSogdHQ7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiOyAiOwotICAgIH0KLQotICAgIHR0ID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHJlc3VsdCArPSBpbnB1dF9hcmdfcHJlZml4KHR0KTsgLy8gY29uc3Q/Ci0gICAgcmVzdWx0ICs9IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiOiAiCi0gICAgICAgICAgICAgICsgdHlwZV9uYW1lKHR0LCBmYWxzZSwgdHJ1ZSwgdHQtPmlzX3hjZXB0aW9uKCksIHRydWUpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBjdXJyZW50X2luZGVudCkgewotICBvc3RyaW5nc3RyZWFtIHJlc3VsdDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgdF90eXBlKiB0dDsKLSAgc3RyaW5nIGxpbmUgPSAiIjsKLSAgc3RyaW5nIG5ld2xpbmVfaW5kZW50ID0gY3VycmVudF9pbmRlbnQgKyAiICAiOwotCi0gIGJvb2wgZmlyc3RsaW5lID0gdHJ1ZTsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgbGluZSArPSAiOyI7Ci0gICAgfQotCi0gICAgaWYgKGxpbmUuc2l6ZSgpID4gODApIHsKLSAgICAgIGlmIChmaXJzdGxpbmUpIHsKLSAgICAgICAgcmVzdWx0IDw8IGVuZGwgPDwgbmV3bGluZV9pbmRlbnQ7Ci0gICAgICAgIGZpcnN0bGluZSA9IGZhbHNlOwotICAgICAgfQotICAgICAgcmVzdWx0IDw8IGxpbmUgPDwgZW5kbDsKLSAgICAgIGxpbmUgPSBuZXdsaW5lX2luZGVudDsKLSAgICB9IGVsc2UgaWYgKGxpbmUuc2l6ZSgpID4gMCkgewotICAgICAgbGluZSArPSAiICI7Ci0gICAgfQotCi0gICAgdHQgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgbGluZSArPSBpbnB1dF9hcmdfcHJlZml4KHR0KTsgLy8gY29uc3Q/Ci0gICAgbGluZSArPSBjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiOiAiCi0gICAgICAgICAgICArIHR5cGVfbmFtZSh0dCwgZmFsc2UsIHRydWUsIHR0LT5pc194Y2VwdGlvbigpLCB0cnVlKTsKLSAgfQotCi0gIGlmIChsaW5lLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgPDwgbGluZTsKLSAgfQotCi0gIHN0cmluZyByZXN1bHRfc3RyOwotCi0gIGlmIChmaXJzdGxpbmUpIHsKLSAgICByZXN1bHRfc3RyID0gIiAiICsgcmVzdWx0LnN0cigpOwotICB9IGVsc2UgewotICAgIHJlc3VsdF9zdHIgPSByZXN1bHQuc3RyKCk7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0X3N0cjsKLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TdHJpbmdfIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJvb2xfIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJ5dGVfIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlXyI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TdHJ1Y3QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5NYXAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TZXRfIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxpc3QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1zdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjplbXB0eV92YWx1ZSh0X3R5cGUqIHR5cGUpIHsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAiMCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKLSAgICAgICAgICByZXR1cm4gIicnIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gIm5pbCI7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAiJyciOwotICAgICAgfQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiRmFsc2UiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiMCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIjAuMCI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVCIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigwKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAibmlsIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAibmlsIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAibmlsIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIm5pbCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpIHsKLSAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOwotCi0gIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgU2V0IiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykKLSAgICAgICAgICAgICAgPDwgIiggY29uc3QgVmFsdWU6ICIgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICIpOyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcykgewotICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICI6ICIKLSAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICI7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKSB7Ci0gIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBHZXRfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pIDw8ICI6IEJvb2xlYW47IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2NsZWFyX3VuaW9uX3ZhbHVlKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSkgewotICAodm9pZCljbHNfcHJlZml4OwotICAodm9pZCluYW1lOwotICAodm9pZCl0eXBlOwotICAodm9pZClpc191bmlvbjsKLSAgKHZvaWQpaXNfeGNlcHRpb25fZmFjdG9yeTsKLSAgKHZvaWQpeGNlcHRpb25fZmFjdG9yeV9uYW1lOwotCi0gIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiBGX19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIHRoZW4gYmVnaW4iCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiRl9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSBGYWxzZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgZmllbGRQcmVmaXggPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgOj0gIgotICAgICAgICAgICAgICAgICAgIDw8ICJEZWZhdWx0KCAiIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiKTsiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3Ryb3lfbmFtZSkgewotICAodm9pZCl0eXBlOwotCi0gIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IG5hbWUgPDwgIi4iCi0gICAgICAgICAgICAgICAgICAgPDwgIlNldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgPDwgIiggY29uc3QgVmFsdWU6ICIgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICIpOyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaWYgKGlzX3VuaW9uKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiQ2xlYXJVbmlvblZhbHVlczsiIDw8IGVuZGw7Ci0gIH0KLSAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJGX19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9IFRydWU7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgZmllbGRQcmVmaXggPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgOj0gVmFsdWU7IiA8PCBlbmRsOwotCi0gIGlmIChpc194Y2VwdGlvbl9jbGFzcyAmJiAoIWlzX3hjZXB0aW9uX2ZhY3RvcnkpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiRiIgPDwgeGNlcHRpb25fZmFjdHJveV9uYW1lIDw8ICIuIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gVmFsdWU7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpIHsKLSAgKHZvaWQpdHlwZTsKLQotICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IG5hbWUgPDwgIi4iCi0gICAgICAgICAgICAgICAgICAgPDwgIkdldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICI6ICIKLSAgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBmaWVsZFByZWZpeCA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIjsiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pIHsKLSAgKHZvaWQpdHlwZTsKLQotICBzdHJpbmcgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbik7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBuYW1lIDw8ICIuIgotICAgICAgICAgICAgICAgICAgIDw8ICJHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjogQm9vbGVhbjsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBmaWVsZFByZWZpeCA8PCBpc3NldF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9jcmVhdGVfZXhjZXB0aW9uX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gICh2b2lkKWNsc19wcmVmaXg7Ci0KLSAgc3RyaW5nIGV4Y2VwdGlvbl9jbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0gIHN0cmluZyBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIGlzX2V4Y2VwdGlvbiwgaXNfZXhjZXB0aW9uKTsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19ubSA8PCAiLkNyZWF0ZUV4Y2VwdGlvbjogIiA8PCBleGNlcHRpb25fY2xzX25tIDw8ICI7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgZXhjZXB0aW9uX2Nsc19ubSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7Ci0gIHN0cmluZyBmYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0odHN0cnVjdC0+Z2V0X25hbWUoKSwgIiIsIHRydWUpICsgIkZhY3RvcnkiOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQuIiA8PCBmYWN0b3J5X25hbWUgPDwgIiA6PSBTZWxmOyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIHByb3BuYW1lOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcHJvcG5hbWUgPSBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgX19pc3NldF8iIDw8IHByb3BuYW1lIDw8ICIgdGhlbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICB9Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0LiIgPDwgcHJvcG5hbWUgPDwgIiA6PSAiIDw8IHByb3BuYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdC5VcGRhdGVNZXNzYWdlUHJvcGVydHk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLQotICBvc3RyaW5nc3RyZWFtIGxvY2FsX3ZhcnM7Ci0gIG9zdHJpbmdzdHJlYW0gY29kZV9ibG9jazsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gIGluZGVudF9pbXBsKGxvY2FsX3ZhcnMpIDw8ICJ0cmFja2VyIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0cmFja2VyIDo9IGlwcm90Lk5leHRSZWN1cnNpb25MZXZlbDsiIDw8IGVuZGw7Ci0KLSAgLy8gbG9jYWwgYm9vbHMgZm9yIHJlcXVpcmVkIGZpZWxkcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOiBCb29sZWFuOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOj0gRkFMU0U7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAic3RydWMgOj0gaXByb3QuUmVhZFN0cnVjdEJlZ2luOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJ5IiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ3aGlsZSAodHJ1ZSkgZG8iIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoZmllbGRfLlR5cGVfID0gVFR5cGUuU3RvcCkgdGhlbiIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiQnJlYWs7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0KLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJjYXNlIGZpZWxkXy5JRCBvZiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgfQotCi0gICAgZmlyc3QgPSBmYWxzZTsKLSAgICBpZiAoZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7Ci0gICAgICBjb2RlX2Jsb2NrIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiBiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoZmllbGRfLlR5cGVfID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHRoZW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICIiLCBsb2NhbF92YXJzKTsKLQotICAgIC8vIHJlcXVpcmVkIGZpZWxkPwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOj0gVFJVRTsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLQotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQgZWxzZSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZF8uVHlwZV8pOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQiOwotICB9Ci0KLSAgaWYgKCFmaXJzdCkgewotICAgIGNvZGVfYmxvY2sgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZWxzZSBiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICB9Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGRfLlR5cGVfKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKCFmaXJzdCkgewotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlwcm90LlJlYWRTdHJ1Y3RFbmQ7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOwotCi0gIC8vIGFsbCByZXF1aXJlZCBmaWVsZHMgaGF2ZSBiZWVuIHJlYWQ/Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiBub3QgX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKQotICAgICAgICAgIDw8ICJ0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICciCi0gICAgICAgICAgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIicpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGNsc19ubTsKLQotICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIGlzX2V4Y2VwdGlvbiwgaXNfZXhjZXB0aW9uKTsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLlJlYWQoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IElGaWVsZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgInN0cnVjIDogSVN0cnVjdDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCkgPDwgZW5kbDsKLSAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLQotICBvc3RyaW5nc3RyZWFtIGxvY2FsX3ZhcnM7Ci0gIG9zdHJpbmdzdHJlYW0gY29kZV9ibG9jazsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gIGluZGVudF9pbXBsKGxvY2FsX3ZhcnMpIDw8ICJ0cmFja2VyIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0cmFja2VyIDo9IG9wcm90Lk5leHRSZWN1cnNpb25MZXZlbDsiIDw8IGVuZGw7Ci0gIAotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAic3RydWMgOj0gVFN0cnVjdEltcGwuQ3JlYXRlKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfIDo9IFRGaWVsZEltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIikgdGhlbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5OYW1lIDo9ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLlR5cGVfICA6PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uSUQgOj0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGRfKTsiIDw8IGVuZGw7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoY29kZV9ibG9jaywgaXNfZXhjZXB0aW9uLCAqZl9pdGVyLCAiIiwgbG9jYWxfdmFycyk7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGNsc19ubTsKLQotICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIGlzX2V4Y2VwdGlvbiwgaXNfZXhjZXB0aW9uKTsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLldyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJzdHJ1YyA6IElTdHJ1Y3Q7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IElGaWVsZDsiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgbG9jYWxfdmFycy5zdHIoKTsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBvdXQgPDwgY29kZV9ibG9jay5zdHIoKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3Rfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0KLSAgb3N0cmluZ3N0cmVhbSBsb2NhbF92YXJzOwotICBvc3RyaW5nc3RyZWFtIGNvZGVfYmxvY2s7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAidHJhY2tlciA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJhY2tlciA6PSBvcHJvdC5OZXh0UmVjdXJzaW9uTGV2ZWw7IiA8PCBlbmRsOwotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJzdHJ1YyA6PSBUU3RydWN0SW1wbC5DcmVhdGUoJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8gOj0gVEZpZWxkSW1wbC5DcmVhdGU7IiA8PCBlbmRsOwotICB9Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBib29sIGlzX29wdGlvbmFsID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgPD4gbmlsKSI7Ci0gICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKLSAgICAgICAgY29kZV9ibG9jayA8PCAiIGFuZCBfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgICB9Ci0gICAgICBjb2RlX2Jsb2NrIDw8ICIgdGhlbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChpc19vcHRpb25hbCkgewotICAgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiKSB0aGVuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiLy8gcmVxdWlyZWQgZmllbGQiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uTmFtZSA6PSAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uVHlwZV8gIDo9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLklEIDo9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZF8pOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoY29kZV9ibG9jaywgaXNfZXhjZXB0aW9uLCAqZl9pdGVyLCAiIiwgbG9jYWxfdmFycyk7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCB8fCBpc19vcHRpb25hbCkgewotICAgICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHN0cmluZyBjbHNfbm07Ci0KLSAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5Xcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBJU3RydWN0OyIgPDwgZW5kbDsKLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmllbGRfIDogSUZpZWxkOyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgbG9jYWxfdmFycy5zdHIoKTsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBvdXQgPDwgY29kZV9ibG9jay5zdHIoKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmdfaW1wbChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBjbHNfbm07Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCAoIWlzX3hfZmFjdG9yeSksIGlzX3hfZmFjdG9yeSwgdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKLSAgfQotCi0gIHN0cmluZyB0bXBfc2IgPSB0bXAoIl9zYiIpOwotICBzdHJpbmcgdG1wX2ZpcnN0ID0gdG1wKCJfZmlyc3QiKTsKLSAgYm9vbCB1c2VGaXJzdEZsYWcgPSBmYWxzZTsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuVG9TdHJpbmc6IHN0cmluZzsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIiA6IFRUaHJpZnRTdHJpbmdCdWlsZGVyOyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIGlzX29wdGlvbmFsID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOwotICAgIGlmIChpc19vcHRpb25hbCkgewotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfZmlyc3QgPDwgIiA6IEJvb2xlYW47IiA8PCBlbmRsOwotICAgICAgdXNlRmlyc3RGbGFnID0gdHJ1ZTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiIDo9IFRUaHJpZnRTdHJpbmdCdWlsZGVyLkNyZWF0ZSgnKCcpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAidHJ5IiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gIGlmICh1c2VGaXJzdEZsYWcpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9maXJzdCA8PCAiIDo9IFRSVUU7IiA8PCBlbmRsOwotICB9Ci0KLSAgYm9vbCBoYWRfcmVxdWlyZWQgPSBmYWxzZTsgLy8gc2V0IHRvIHRydWUgYWZ0ZXIgZmlyc3QgcmVxdWlyZWQgZmllbGQgaGFzIGJlZW4gcHJvY2Vzc2VkCi0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBib29sIGlzX29wdGlvbmFsID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIiA8PiBuaWwpIjsKLSAgICAgIGlmIChpc19vcHRpb25hbCkgewotICAgICAgICBvdXQgPDwgIiBhbmQgX19pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pOwotICAgICAgfQotICAgICAgb3V0IDw8ICIgdGhlbiBiZWdpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChpc19vcHRpb25hbCkgewotICAgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiAoX19pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIpIHRoZW4gYmVnaW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodXNlRmlyc3RGbGFnICYmICghaGFkX3JlcXVpcmVkKSkgewotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgbm90ICIgPDwgdG1wX2ZpcnN0IDw8ICIgdGhlbiAiIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCgnLCcpOyIgPDwgZW5kbDsKLSAgICAgIGlmIChpc19vcHRpb25hbCkgewotICAgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9maXJzdCA8PCAiIDo9IEZBTFNFOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCciIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIjogJyk7IgotICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCgnLCAiIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIjogJyk7IgotICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLQotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgICB9Ci0KLSAgICBpZiAodHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgPSBuaWwpIHRoZW4gIiA8PCB0bXBfc2IKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5BcHBlbmQoJzxudWxsPicpIGVsc2UgIiA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIuVG9TdHJpbmcoKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoSW50ZWdlcigiIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIikpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIpOyIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAobnVsbF9hbGxvd2VkIHx8IGlzX29wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmICghaXNfb3B0aW9uYWwpIHsKLSAgICAgIGhhZF9yZXF1aXJlZCA9IHRydWU7IC8vIG5vdyBfX2ZpcnN0IG11c3QgYmUgZmFsc2UsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQgYW55bW9yZQotICAgIH0KLSAgfQotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCcpJyk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCB0bXBfc2IgPDwgIi5Ub1N0cmluZzsiIDw8IGVuZGw7Ci0gIGlmICh1c2VGaXJzdEZsYWcpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiAiIDw8IHRtcF9maXJzdCA8PCAiIHRoZW4ge3ByZXZlbnQgd2FybmluZ307IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkZyZWU7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLWJvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjppc192b2lkKHRfdHlwZSogdHlwZSkgewotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKLSAgICBkZWxwaGksCi0gICAgImRlbHBoaSIsCi0gICAgIiAgICBhbnNpc3RyX2JpbmFyeTogIFVzZSBBbnNpU3RyaW5nIGZvciBiaW5hcnkgZGF0YXR5cGUgKGRlZmF1bHQgaXMgVEJ5dGVzKS5cbiIKLSAgICAiICAgIHJlZ2lzdGVyX3R5cGVzOiAgRW5hYmxlIFR5cGVSZWdpc3RyeSwgYWxsb3dzIGZvciBjcmVhdGlvbiBvZiBzdHJ1Y3QsIHVuaW9uXG4iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgIGFuZCBjb250YWluZXIgaW5zdGFuY2VzIGJ5IGludGVyZmFjZSBvciBUeXBlSW5mbygpXG4iCi0gICAgIiAgICBjb25zdHByZWZpeDogICAgIE5hbWUgVENvbnN0YW50cyBjbGFzc2VzIGFmdGVyIElETCB0byByZWR1Y2UgYW1iaWd1aXRpZXNcbiIKLSAgICAiICAgIGV2ZW50czogICAgICAgICAgRW5hYmxlIGFuZCB1c2UgcHJvY2Vzc2luZyBldmVudHMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLlxuIgotICAgICIgICAgeG1sZG9jOiAgICAgICAgICBFbmFibGUgWE1MRG9jIGNvbW1lbnRzIGZvciBIZWxwIEluc2lnaHQgZXRjLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNjY2MzYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKioKLSAqIEVybGFuZyBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfZXJsX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfZXJsX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKXBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZXJsIjsKLQotICAgIGxlZ2FjeV9uYW1lc18gPSAocGFyc2VkX29wdGlvbnMuZmluZCgibGVnYWN5bmFtZXMiKSAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgbWFwc18gPSAocGFyc2VkX29wdGlvbnMuZmluZCgibWFwcyIpICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICBvdHAxNl8gPSAocGFyc2VkX29wdGlvbnMuZmluZCgib3RwMTYiKSAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgaWYgKG1hcHNfICYmIG90cDE2XykgewotICAgICAgdGhyb3cgImFyZ3VtZW50IGVycm9yOiBDYW5ub3Qgc3BlY2lmeSBib3RoIG1hcHMgYW5kIG90cDE2OyBtYXBzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBFcmxhbmcvT1RQIFIxNiBvciBvbGRlciI7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX21lbWJlcl90eXBlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX21lbWJlcl92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX21lbWJlcl90eXBlKHRfZmllbGQqIGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX21lbWJlcl92YWx1ZSh0X2ZpZWxkKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfcmVxdWlyZWRuZXNzKHRfZmllbGQqIGZpZWxkKTsKLQotICAvLyAgc3RkOjpzdHJpbmcgcmVuZGVyX2RlZmF1bHRfdmFsdWUodF90eXBlKiB0eXBlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2RlZmF1bHRfdmFsdWUodF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl90eXBlX3Rlcm0odF90eXBlKiB0dHlwZSwgYm9vbCBleHBhbmRfc3RydWN0cywgYm9vbCBleHRlbmRlZF9pbmZvID0gZmFsc2UpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0bWVtYmVyKTsKLSAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0X2luZm8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9lcmxfZXh0ZW5kZWRfc3RydWN0X2luZm8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2luZm8odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgZXJsX2F1dG9nZW5fY29tbWVudCgpOwotICBzdGQ6OnN0cmluZyBlcmxfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyB0eXBlX21vZHVsZSh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgaWYgKGxlZ2FjeV9uYW1lc18pIHsKLSAgICAgIHJldHVybiBkZWNhcGl0YWxpemUoaW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdW5kZXJzY29yZShpbik7Ci0gICAgfQotICB9Ci0KLSAgc3RkOjpzdHJpbmcgYXRvbWlmeShzdGQ6OnN0cmluZyBpbikgewotICAgIGlmIChsZWdhY3lfbmFtZXNfKSB7Ci0gICAgICByZXR1cm4gIiciICsgZGVjYXBpdGFsaXplKGluKSArICInIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICInIiArIGluICsgIiciOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNvbnN0aWZ5KHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgaWYgKGxlZ2FjeV9uYW1lc18pIHsKLSAgICAgIHJldHVybiBjYXBpdGFsaXplKGluKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHVwcGVyY2FzZShpbik7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbW1lbnQoc3RyaW5nIGluKTsKLQotcHJpdmF0ZToKLSAgYm9vbCBoYXNfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKik7Ci0KLSAgLyogaWYgdHJ1ZSByZXRhaW4gcHJlIDAuOS4yIG5hbWluZyBzY2hlbWUgZm9yIGZ1bmN0aW9ucywgYXRvbXMgYW5kIGNvbnN0cyAqLwotICBib29sIGxlZ2FjeV9uYW1lc187Ci0KLSAgLyogaWYgdHJ1ZSB1c2UgbWFwcyBpbnN0ZWFkIG9mIGRpY3RzIGluIGdlbmVyYXRlZCBjb2RlICovCi0gIGJvb2wgbWFwc187Ci0KLSAgLyogaWYgdHJ1ZSB1c2Ugbm9uLW5hbWVzcGFjZWQgZGljdCBhbmQgc2V0IGluc3RlYWQgb2YgZGljdDpkaWN0IGFuZCBzZXRzOnNldCAqLwotICBib29sIG90cDE2XzsKLQotICAvKioKLSAgICogYWRkIGZ1bmN0aW9uIHRvIGV4cG9ydCBsaXN0Ci0gICAqLwotCi0gIHZvaWQgZXhwb3J0X2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGV4cG9ydF9zdHJpbmcoc3RkOjpzdHJpbmcgbmFtZSwgaW50IG51bSk7Ci0KLSAgdm9pZCBleHBvcnRfdHlwZXNfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZXhwb3J0X3R5cGVzX3N0cmluZyhzdGQ6OnN0cmluZyBuYW1lLCBpbnQgbnVtKTsKLQotICAvKioKLSAgICogd3JpdGUgb3V0IGhlYWRlcnMgYW5kIGZvb3RlcnMgZm9yIGhybCBmaWxlcwotICAgKi8KLQotICB2b2lkIGhybF9oZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIGhybF9mb290ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAgKiBzdHVmZiB0byBzcGl0IG91dCBhdCB0aGUgdG9wIG9mIGdlbmVyYXRlZCBmaWxlcwotICAgKi8KLQotICBib29sIGV4cG9ydF9saW5lc19maXJzdF87Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBleHBvcnRfbGluZXNfOwotCi0gIGJvb2wgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XzsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGV4cG9ydF90eXBlc19saW5lc187Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl9pbmZvXzsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfaW5mb19leHRfOwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc19maWxlXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2hybF9maWxlXzsKLQotICBzdGQ6Om9mc3RyZWFtIGZfY29uc3RzXzsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlX2ZpbGVfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV9ocmxfOwotfTsKLQotLyoqCi0gKiBVSSBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBzZXR1cCBleHBvcnQgbGluZXMKLSAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IHRydWU7Ci0gIGV4cG9ydF90eXBlc19saW5lc19maXJzdF8gPSB0cnVlOwotCi0gIC8vIHR5cGVzIGZpbGVzCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSArICJfdHlwZXMuZXJsIjsKLSAgc3RyaW5nIGZfdHlwZXNfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSArICJfdHlwZXMuaHJsIjsKLQotICBmX3R5cGVzX2ZpbGVfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotICBmX3R5cGVzX2hybF9maWxlXy5vcGVuKGZfdHlwZXNfaHJsX25hbWUuY19zdHIoKSk7Ci0KLSAgaHJsX2hlYWRlcihmX3R5cGVzX2hybF9maWxlXywgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSArICJfdHlwZXMiKTsKLQotICBmX3R5cGVzX2ZpbGVfIDw8IGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8ICItbW9kdWxlKCIKLSAgICAgICAgICAgICAgICA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMpLiIgPDwgZW5kbCA8PCBlcmxfaW1wb3J0cygpCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICBmX3R5cGVzX2ZpbGVfIDw8ICItaW5jbHVkZShcIiIgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzLmhybFwiKS4iCi0gICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfdHlwZXNfaHJsX2ZpbGVfIDw8IHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7Ci0KLSAgLy8gY29uc3RzIGZpbGUKLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIl9jb25zdGFudHMuaHJsIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBmX2NvbnN0c18gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgZXJsX2ltcG9ydHMoKSA8PCBlbmRsIDw8ICItaW5jbHVkZShcIiIKLSAgICAgICAgICAgIDw8IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcy5ocmxcIikuIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogQm9pbGVycGxhdGUgYXQgYmVnaW5uaW5nIGFuZCBlbmQgb2YgaGVhZGVyIGZpbGVzCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpocmxfaGVhZGVyKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKLSAgb3V0IDw8ICItaWZuZGVmKF8iIDw8IG5hbWUgPDwgIl9pbmNsdWRlZCkuIiA8PCBlbmRsIDw8ICItZGVmaW5lKF8iIDw8IG5hbWUgPDwgIl9pbmNsdWRlZCwgeWVhaCkuIgotICAgICAgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmhybF9mb290ZXIob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgewotICAodm9pZCluYW1lOwotICBvdXQgPDwgIi1lbmRpZi4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiLWluY2x1ZGUoXCIiICsgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgKyAiX3R5cGVzLmhybFwiKS5cbiI7Ci0gIH0KLSAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgKz0gIlxuIjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmVybF9hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybiBzdGQ6OnN0cmluZygiJSVcbiIpICsgIiUlIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgotICAgICAgICAgKyAiJSVcbiIgKyAiJSUgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgotICAgICAgICAgKyAiJSVcbiI7Ci19Ci0KLS8qKgotICogQ29tbWVudCBvdXQgdGV4dAotICovCi0KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmNvbW1lbnQoc3RyaW5nIGluKSB7Ci0gIHNpemVfdCBwb3MgPSAwOwotICBpbi5pbnNlcnQocG9zLCAiJSUgIik7Ci0gIHdoaWxlICgocG9zID0gaW4uZmluZF9maXJzdF9vZignXG4nLCBwb3MpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBpbi5pbnNlcnQoKytwb3MsICIlJSAiKTsKLSAgfQotICByZXR1cm4gaW47Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmVybF9pbXBvcnRzKCkgewotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0KLSAgZXhwb3J0X3R5cGVzX3N0cmluZygic3RydWN0X2luZm8iLCAxKTsKLSAgZXhwb3J0X3R5cGVzX3N0cmluZygic3RydWN0X2luZm9fZXh0IiwgMSk7Ci0gIGZfdHlwZXNfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0X3R5cGVzX2xpbmVzXy5zdHIoKSA8PCAiXSkuIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19maWxlXyA8PCBmX2luZm9fLnN0cigpOwotICBmX3R5cGVzX2ZpbGVfIDw8ICJzdHJ1Y3RfaW5mbyhfKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3R5cGVzX2ZpbGVfIDw8IGZfaW5mb19leHRfLnN0cigpOwotICBmX3R5cGVzX2ZpbGVfIDw8ICJzdHJ1Y3RfaW5mb19leHQoXykgLT4gZXJsYW5nOmVycm9yKGZ1bmN0aW9uX2NsYXVzZSkuIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaHJsX2Zvb3RlcihmX3R5cGVzX2hybF9maWxlXywgc3RyaW5nKCJCT0dVUyIpKTsKLQotICBmX3R5cGVzX2ZpbGVfLmNsb3NlKCk7Ci0gIGZfdHlwZXNfaHJsX2ZpbGVfLmNsb3NlKCk7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIG5vIG9wCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCl0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KGZfdHlwZXNfaHJsX2ZpbGVfKSA8PCAiLWRlZmluZSgiIDw8IGNvbnN0aWZ5KG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXyIgPDwgY29uc3RpZnkodGVudW0tPmdldF9uYW1lKCkpIDw8ICJfIiA8PCBjb25zdGlmeShuYW1lKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAiKS4iIDw8IGVuZGw7Ci0gIH0KLQotICBmX3R5cGVzX2hybF9maWxlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZl9jb25zdHNfIDw8ICItZGVmaW5lKCIgPDwgY29uc3RpZnkobWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSkgPDwgIl8iCi0gICAgICAgICAgICA8PCBjb25zdGlmeShuYW1lKSA8PCAiLCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIikuIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICIjIiA8PCBhdG9taWZ5KHR5cGUtPmdldF9uYW1lKCkpIDw8ICJ7IjsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICBvdXQgPDwgIiA9ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIGlmIChtYXBzXykgewotICAgICAgb3V0IDw8ICJtYXBzOmZyb21fbGlzdChbIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJkaWN0OmZyb21fbGlzdChbIjsKLSAgICB9Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IHZhbHVlLT5nZXRfbWFwKCkuZW5kKCk7Ci0gICAgZm9yIChpID0gdmFsdWUtPmdldF9tYXAoKS5iZWdpbigpOyBpICE9IGVuZDspIHsKLSAgICAgIG91dCA8PCAieyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCBpLT5maXJzdCkgPDwgIiwiCi0gICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCBpLT5zZWNvbmQpIDw8ICJ9IjsKLSAgICAgIGlmICgrK2kgIT0gZW5kKSB7Ci0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiXSkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgb3V0IDw8ICJzZXRzOmZyb21fbGlzdChbIjsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBpLCBlbmQgPSB2YWx1ZS0+Z2V0X2xpc3QoKS5lbmQoKTsKLSAgICBmb3IgKGkgPSB2YWx1ZS0+Z2V0X2xpc3QoKS5iZWdpbigpOyBpICE9IGVuZDspIHsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICppKTsKLSAgICAgIGlmICgrK2kgIT0gZW5kKSB7Ci0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiXSkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBvdXQgPDwgIlsiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJdIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgewotICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIiMiICsgYXRvbWlmeSh0eXBlLT5nZXRfbmFtZSgpKSArICJ7fSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpZiAobWFwc18pIHsKLSAgICAgIHJldHVybiAiI3t9IjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJkaWN0Om5ldygpIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gInNldHM6bmV3KCkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiW10iOwotICB9IGVsc2UgewotICAgIHJldHVybiAidW5kZWZpbmVkIjsKLSAgfQotfQotCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfbWVtYmVyX3R5cGUodF9maWVsZCogZmllbGQpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gInN0cmluZygpIHwgYmluYXJ5KCkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiYm9vbGVhbigpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImludGVnZXIoKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImZsb2F0KCkiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IHVuc3VwcG9ydGVkIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpbnRlZ2VyKCkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gYXRvbWlmeSh0eXBlLT5nZXRfbmFtZSgpKSArICIoKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpZiAobWFwc18pIHsKLSAgICAgIHJldHVybiAiI3t9IjsKLSAgICB9IGVsc2UgaWYgKG90cDE2XykgewotICAgICAgcmV0dXJuICJkaWN0KCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gImRpY3Q6ZGljdCgpIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpZiAob3RwMTZfKSB7Ci0gICAgICByZXR1cm4gInNldCgpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJzZXRzOnNldCgpIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJsaXN0KCkiOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogdW5zdXBwb3J0ZWQgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyh0X2ZpZWxkKiBmaWVsZCkgewotICBzd2l0Y2ggKGZpZWxkLT5nZXRfcmVxKCkpIHsKLSAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgotICAgIHJldHVybiAicmVxdWlyZWQiOwotICBjYXNlIHRfZmllbGQ6OlRfT1BUSU9OQUw6Ci0gICAgcmV0dXJuICJvcHRpb25hbCI7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuICJ1bmRlZmluZWQiOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2VybF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gICh2b2lkKWlzX2V4Y2VwdGlvbjsKLSAgZ2VuZXJhdGVfZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfaHJsX2ZpbGVfLCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKGZfaW5mb18sIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9lcmxfZXh0ZW5kZWRfc3RydWN0X2luZm8oZl9pbmZvX2V4dF8sIHRzdHJ1Y3QpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiJSUgc3RydWN0ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8IGVuZGwgPDwgZW5kbDsKLQotICBzdGQ6OnN0cmluZ3N0cmVhbSBidWY7Ci0gIGJ1ZiA8PCBpbmRlbnQoKSA8PCAiLXJlY29yZCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCB7IjsKLSAgc3RyaW5nIGZpZWxkX2luZGVudChidWYuc3RyKCkuc2l6ZSgpLCAnICcpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7KSB7Ci0gICAgZ2VuZXJhdGVfZXJsX3N0cnVjdF9tZW1iZXIoYnVmLCAqbV9pdGVyKTsKLSAgICBpZiAoKyttX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSkgewotICAgICAgYnVmIDw8ICIsIiA8PCBlbmRsIDw8IGZpZWxkX2luZGVudDsKLSAgICB9Ci0gIH0KLSAgYnVmIDw8ICJ9KS4iOwotCi0gIG91dCA8PCBidWYuc3RyKCkgPDwgZW5kbDsKLSAgb3V0IDw8ICItdHlwZSAiICsgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSA6OiAjIiArIHR5cGVfbmFtZSh0c3RydWN0KSArICJ7fS4iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlY29yZCBmaWVsZCBkZWZpbml0aW9uCi0gKi8KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdG1lbWJlcikgewotICBvdXQgPDwgYXRvbWlmeSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKLSAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKHRtZW1iZXIpKQotICAgIG91dCA8PCAiID0gIiA8PCByZW5kZXJfbWVtYmVyX3ZhbHVlKHRtZW1iZXIpOwotICBvdXQgPDwgIiA6OiAiIDw8IHJlbmRlcl9tZW1iZXJfdHlwZSh0bWVtYmVyKTsKLX0KLQotYm9vbCB0X2VybF9nZW5lcmF0b3I6Omhhc19kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIGZpZWxkKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICBpZiAoIWZpZWxkLT5nZXRfdmFsdWUoKSkgewotICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpCi0gICAgICAgICAgfHwgdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9tZW1iZXJfdmFsdWUodF9maWVsZCogZmllbGQpIHsKLSAgaWYgKCFmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKLSAgICByZXR1cm4gcmVuZGVyX2RlZmF1bHRfdmFsdWUoZmllbGQpOwotICB9IGVsc2UgewotICAgIHJldHVybiByZW5kZXJfY29uc3RfdmFsdWUoZmllbGQtPmdldF90eXBlKCksIGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInN0cnVjdF9pbmZvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl90eXBlX3Rlcm0odHN0cnVjdCwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInN0cnVjdF9pbmZvX2V4dCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKSAtPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfdHlwZV90ZXJtKHRzdHJ1Y3QsIHRydWUsIHRydWUpIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHNlcnZpY2VfbmFtZV8gPSBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHNlcnZpY2VfbmFtZV8pOwotCi0gIHN0cmluZyBmX3NlcnZpY2VfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc2VydmljZV9uYW1lXyArICJfdGhyaWZ0LmhybCI7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIl90aHJpZnQuZXJsIjsKLSAgZl9zZXJ2aWNlX2ZpbGVfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIGZfc2VydmljZV9ocmxfLm9wZW4oZl9zZXJ2aWNlX2hybF9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFJlc2V0IHNlcnZpY2UgdGV4dCBhZ2dyZWdhdGluZyBzdHJlYW0gc3RyZWFtcwotICBmX3NlcnZpY2VfLnN0cigiIik7Ci0gIGV4cG9ydF9saW5lc18uc3RyKCIiKTsKLSAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IHRydWU7Ci0KLSAgaHJsX2hlYWRlcihmX3NlcnZpY2VfaHJsXywgc2VydmljZV9uYW1lXyk7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfaHJsXyA8PCAiLWluY2x1ZGUoXCIiCi0gICAgICAgICAgICAgICAgICAgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgICA8PCAiX3RocmlmdC5ocmxcIikuICUgaW5oZXJpdCAiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfaHJsXyA8PCAiLWluY2x1ZGUoXCIiIDw8IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcy5ocmxcIikuIgotICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsgLy8gY3Bpcm86IE5ldyBFcmxhbmcgT3JkZXIKLQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0KLSAgLy8gaW5kZW50X2Rvd24oKTsKLQotICBmX3NlcnZpY2VfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgIi1tb2R1bGUoIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfdGhyaWZ0KS4iCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICItYmVoYXZpb3VyKHRocmlmdF9zZXJ2aWNlKS4iIDw8IGVuZGwgPDwgZW5kbCA8PCBlcmxfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8ICItaW5jbHVkZShcIiIgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgIDw8ICJfdGhyaWZ0LmhybFwiKS4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0X2xpbmVzXy5zdHIoKSA8PCAiXSkuIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8IGZfc2VydmljZV8uc3RyKCk7Ci0KLSAgaHJsX2Zvb3RlcihmX3NlcnZpY2VfaHJsXywgZl9zZXJ2aWNlX25hbWUpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfZmlsZV8uY2xvc2UoKTsKLSAgZl9zZXJ2aWNlX2hybF8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAvLyAgIiUgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGV4cG9ydF9zdHJpbmcoInN0cnVjdF9pbmZvIiwgMSk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICJzdHJ1Y3RfaW5mbyhfKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpdGZ1bmN0aW9uOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0KLSAgZXhwb3J0X3N0cmluZygiZnVuY3Rpb25faW5mbyIsIDIpOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmX3NlcnZpY2VfIDw8ICIlJSUgaW50ZXJmYWNlIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiUgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLQotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2luZm8odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgLy8gSW5oZXJpdGFuY2UgLSBwYXNzIHVua25vd24gZnVuY3Rpb25zIHRvIGJhc2UgY2xhc3MKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIEluZm9UeXBlKSAtPiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgSW5mb1R5cGUpLiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgewotICAgIC8vIHJldHVybiBmdW5jdGlvbl9jbGF1c2UgZXJyb3IgZm9yIG5vbi1leGlzdGVudCBmdW5jdGlvbnMKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oX0Z1bmMsIF9JbmZvKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uTmFtZSwgcGFyYW1zX3R5cGUpIGFuZAotICogZnVuY3Rpb25faW5mbyhGdW5jdGlvbk5hbWUsIHJlcGx5X3R5cGUpCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9pbmZvKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCl0c2VydmljZTsKLSAgc3RyaW5nIG5hbWVfYXRvbSA9IGF0b21pZnkodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0KLSAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcGFyYW1zX3R5cGUpOgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgcGFyYW1zX3R5cGUpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVuZGVyX3R5cGVfdGVybShhcmdfc3RydWN0LCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHJlcGx5X3R5cGUpOgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgcmVwbHlfdHlwZSkgLT4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlbmRlcl90eXBlX3Rlcm0odGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGVsc2UgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvbmV3YXlfdm9pZDsiIDw8IGVuZGw7Ci0gIGVsc2UKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIntzdHJ1Y3QsIFtdfSIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgZXhjZXB0aW9ucyk6Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbygiIDw8IG5hbWVfYXRvbSA8PCAiLCBleGNlcHRpb25zKSAtPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCByZW5kZXJfdHlwZV90ZXJtKHhzLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLSAgcmV0dXJuIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoVGhpcyIKLSAgICAgICAgICsgY2FwaXRhbGl6ZShhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkpICsgIikiOwotfQotCi0vKioKLSAqIEFkZCBhIGZ1bmN0aW9uIHRvIHRoZSBleHBvcnRzIGxpc3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF9zdHJpbmcoc3RyaW5nIG5hbWUsIGludCBudW0pIHsKLSAgaWYgKGV4cG9ydF9saW5lc19maXJzdF8pIHsKLSAgICBleHBvcnRfbGluZXNfZmlyc3RfID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgZXhwb3J0X2xpbmVzXyA8PCAiLCAiOwotICB9Ci0gIGV4cG9ydF9saW5lc18gPDwgbmFtZSA8PCAiLyIgPDwgbnVtOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X3R5cGVzX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotCi0gIGV4cG9ydF90eXBlc19zdHJpbmcocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgIDEgLy8gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICsgKCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpLT5nZXRfbWVtYmVycygpKS5zaXplKCkpOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X3R5cGVzX3N0cmluZyhzdHJpbmcgbmFtZSwgaW50IG51bSkgewotICBpZiAoZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XykgewotICAgIGV4cG9ydF90eXBlc19saW5lc19maXJzdF8gPSBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBleHBvcnRfdHlwZXNfbGluZXNfIDw8ICIsICI7Ci0gIH0KLSAgZXhwb3J0X3R5cGVzX2xpbmVzXyA8PCBuYW1lIDw8ICIvIiA8PCBudW07Ci19Ci0KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0KLSAgZXhwb3J0X3N0cmluZyhwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgMSAvLyBUaGlzCi0gICAgICAgICAgICAgICAgKyAoKHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSktPmdldF9tZW1iZXJzKCkpLnNpemUoKSk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsgLy8gaW5pdGlhbCBjb21tYSB0byBjb21wZW5zYXRlIGZvciBpbml0aWFsIFRoaXMKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiBhdG9taWZ5KHByZWZpeCArIG5hbWUpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgRXJsYW5nICJ0eXBlIiAobWFjcm8gZm9yIGludCBjb25zdGFudHMpCi0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIj90VHlwZV9TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiP3RUeXBlX0JPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiP3RUeXBlX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICI/dFR5cGVfSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiP3RUeXBlX0kzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIj90VHlwZV9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICI/dFR5cGVfRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICI/dFR5cGVfSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICI/dFR5cGVfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiP3RUeXBlX01BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiP3RUeXBlX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGFuIEVybGFuZyB0ZXJtIHdoaWNoIHJlcHJlc2VudHMgYSB0aHJpZnQgdHlwZQotICovCi1zdGQ6OnN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl90eXBlX3Rlcm0odF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhwYW5kX3N0cnVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRlbmRlZF9pbmZvKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJzdHJpbmciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiYm9vbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJieXRlIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiaTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiaTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiaTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZG91YmxlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBpZiAoZXhwYW5kX3N0cnVjdHMpIHsKLQotICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gYnVmOwotICAgICAgYnVmIDw8ICJ7c3RydWN0LCBbIjsKLSAgICAgIHN0cmluZyBmaWVsZF9pbmRlbnQoYnVmLnN0cigpLnNpemUoKSwgJyAnKTsKLQotICAgICAgdF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZSBjb25zdCYgZmllbGRzID0gc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHRfc3RydWN0OjptZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IGZpZWxkcy5lbmQoKTsKLSAgICAgIGZvciAoaSA9IGZpZWxkcy5iZWdpbigpOyBpICE9IGVuZDspIHsKLSAgICAgICAgdF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZTo6dmFsdWVfdHlwZSBtZW1iZXIgPSAqaTsKLSAgICAgICAgaW50MzJfdCBrZXkgPSBtZW1iZXItPmdldF9rZXkoKTsKLSAgICAgICAgc3RyaW5nIHR5cGUgPSByZW5kZXJfdHlwZV90ZXJtKG1lbWJlci0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKTsgLy8gcmVjdXJzaXZlIGNhbGwKLQotICAgICAgICBpZiAoIWV4dGVuZGVkX2luZm8pIHsKLSAgICAgICAgICAvLyBDb252ZXJ0IHRvIGZvcm1hdDoge3N0cnVjdCwgW3tGaWQsIFR5cGV9fC4uLl19Ci0gICAgICAgICAgYnVmIDw8ICJ7IiA8PCBrZXkgPDwgIiwgIiA8PCB0eXBlIDw8ICJ9IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBDb252ZXJ0IHRvIGZvcm1hdDoge3N0cnVjdCwgW3tGaWQsIFJlcSwgVHlwZSwgTmFtZSwgRGVmfXwuLi5dfQotICAgICAgICAgIHN0cmluZyBuYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOwotICAgICAgICAgIHN0cmluZyB2YWx1ZSA9IHJlbmRlcl9tZW1iZXJfdmFsdWUobWVtYmVyKTsKLSAgICAgICAgICBzdHJpbmcgcmVxdWlyZWRuZXNzID0gcmVuZGVyX21lbWJlcl9yZXF1aXJlZG5lc3MobWVtYmVyKTsKLSAgICAgICAgICBidWYgPDwgInsiIDw8IGtleSA8PCAiLCAiIDw8IHJlcXVpcmVkbmVzcyA8PCAiLCAiIDw8IHR5cGUgPDwgIiwgIiA8PCBhdG9taWZ5KG5hbWUpIDw8ICIsICIKLSAgICAgICAgICAgICAgPDwgdmFsdWUgPDwgIn0iOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCsraSAhPSBlbmQpIHsKLSAgICAgICAgICBidWYgPDwgIiwiIDw8IGVuZGwgPDwgZmllbGRfaW5kZW50OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGJ1ZiA8PCAiXX0iIDw8IGVuZGw7Ci0gICAgICByZXR1cm4gYnVmLnN0cigpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIntzdHJ1Y3QsIHsiICsgYXRvbWlmeSh0eXBlX21vZHVsZSh0eXBlKSkgKyAiLCAiICsgdHlwZV9uYW1lKHR5cGUpICsgIn19IjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAvLyB7bWFwLCBLZXlUeXBlLCBWYWxUeXBlfQotICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIHJldHVybiAie21hcCwgIiArIHJlbmRlcl90eXBlX3Rlcm0oa2V5X3R5cGUsIGZhbHNlKSArICIsICIgKyByZW5kZXJfdHlwZV90ZXJtKHZhbF90eXBlLCBmYWxzZSkKLSAgICAgICAgICAgKyAifSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgIHJldHVybiAie3NldCwgIiArIHJlbmRlcl90eXBlX3Rlcm0oZWxlbV90eXBlLCBmYWxzZSkgKyAifSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotCi0gICAgcmV0dXJuICJ7bGlzdCwgIiArIHJlbmRlcl90eXBlX3Rlcm0oZWxlbV90eXBlLCBmYWxzZSkgKyAifSI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV9tb2R1bGUodF90eXBlKiB0dHlwZSkgewotICByZXR1cm4gbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzIjsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKLSAgICBlcmwsCi0gICAgIkVybGFuZyIsCi0gICAgIiAgICBsZWdhY3luYW1lczogT3V0cHV0IGZpbGVzIHJldGFpbiBuYW1pbmcgY29udmVudGlvbnMgb2YgVGhyaWZ0IDAuOS4xIGFuZCBlYXJsaWVyLlxuIgotICAgICIgICAgbWFwczogICAgICAgIEdlbmVyYXRlIG1hcHMgaW5zdGVhZCBvZiBkaWN0cy5cbiIKLSAgICAiICAgIG90cDE2OiAgICAgICBHZW5lcmF0ZSBub24tbmFtZXNwYWNlZCBkaWN0IGFuZCBzZXQgaW5zdGVhZCBvZiBkaWN0OmRpY3QgYW5kIHNldHM6c2V0LlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzc2MGQ3Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLS8qKgotICogVG9wIGxldmVsIHByb2dyYW0gZ2VuZXJhdGlvbiBmdW5jdGlvbi4gQ2FsbHMgdGhlIGdlbmVyYXRvciBzdWJjbGFzcyBtZXRob2RzCi0gKiBmb3IgcHJlcGFyaW5nIGZpbGUgc3RyZWFtcyBldGMuIHRoZW4gaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIHBhcnRzIG9mIHRoZQotICogcHJvZ3JhbSB0byBwZXJmb3JtIHRoZSBjb3JyZWN0IGFjdGlvbnMuCi0gKgotICogQHBhcmFtIHByb2dyYW0gVGhlIHRocmlmdCBwcm9ncmFtIHRvIGNvbXBpbGUgaW50byBDKysgc291cmNlCi0gKi8KLXZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7Ci0gIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyYXRvcgotICBpbml0X2dlbmVyYXRvcigpOwotCi0gIC8vIEdlbmVyYXRlIGVudW1zCi0gIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKLSAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOwotICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHN0cnVjdHMsIGV4Y2VwdGlvbnMsIGFuZCB1bmlvbnMgaW4gZGVjbGFyZWQgb3JkZXIKLSAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOwotCi0gIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7Ci0gIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKCpvX2l0ZXIpOwotICB9Ci0gIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKLSAgICBpZiAoKCpvX2l0ZXIpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNvbnN0YW50cwotICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7Ci0gIGdlbmVyYXRlX2NvbnN0cyhjb25zdHMpOwotCi0gIC8vIEdlbmVyYXRlIHNlcnZpY2VzCi0gIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7Ci0gIH0KLQotICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCi0gIGNsb3NlX2dlbmVyYXRvcigpOwotfQotCi1zdHJpbmcgdF9nZW5lcmF0b3I6OmVzY2FwZV9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbikgY29uc3QgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGZvciAoc3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdCA9IGluLmJlZ2luKCk7IGl0IDwgaW4uZW5kKCk7IGl0KyspIHsKLSAgICBzdGQ6Om1hcDxjaGFyLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHJlcyA9IGVzY2FwZV8uZmluZCgqaXQpOwotICAgIGlmIChyZXMgIT0gZXNjYXBlXy5lbmQoKSkgewotICAgICAgcmVzdWx0LmFwcGVuZChyZXMtPnNlY29uZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdC5wdXNoX2JhY2soKml0KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9jb25zdCgqY19pdGVyKTsKLSAgfQotfQotCi12b2lkIHRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbW1lbnRfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGxpbmVfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29tbWVudF9lbmQpIHsKLSAgaWYgKGNvbW1lbnRfc3RhcnQgIT0gIiIpCi0gICAgaW5kZW50KG91dCkgPDwgY29tbWVudF9zdGFydDsKLSAgc3RyaW5nc3RyZWFtIGRvY3MoY29udGVudHMsIGlvc19iYXNlOjppbik7Ci0gIHdoaWxlICghKGRvY3MuZW9mKCkgfHwgZG9jcy5mYWlsKCkpKSB7Ci0gICAgY2hhciBsaW5lWzEwMjRdOwotICAgIGRvY3MuZ2V0bGluZShsaW5lLCAxMDI0KTsKLQotICAgIC8vIEp1c3QgcHJudCBhIG5ld2xpbmUgd2hlbiB0aGUgbGluZSAmIHByZWZpeCBhcmUgZW1wdHkuCi0gICAgaWYgKHN0cmxlbihsaW5lKSA9PSAwICYmIGxpbmVfcHJlZml4ID09ICIiICYmICFkb2NzLmVvZigpKSB7Ci0gICAgICBvdXQgPDwgc3RkOjplbmRsOwotICAgIH0gZWxzZSBpZiAoc3RybGVuKGxpbmUpID4gMCB8fCAhZG9jcy5lb2YoKSkgeyAvLyBza2lwIHRoZSBlbXB0eSBsYXN0IGxpbmUKLSAgICAgIGluZGVudChvdXQpIDw8IGxpbmVfcHJlZml4IDw8IGxpbmUgPDwgc3RkOjplbmRsOwotICAgIH0KLSAgfQotICBpZiAoY29tbWVudF9lbmQgIT0gIiIpCi0gICAgaW5kZW50KG91dCkgPDwgY29tbWVudF9lbmQ7Ci19Ci0KLXZvaWQgdF9nZW5lcmF0b3JfcmVnaXN0cnk6OnJlZ2lzdGVyX2dlbmVyYXRvcih0X2dlbmVyYXRvcl9mYWN0b3J5KiBmYWN0b3J5KSB7Ci0gIGdlbl9tYXBfdCYgdGhlX21hcCA9IGdldF9nZW5lcmF0b3JfbWFwKCk7Ci0gIGlmICh0aGVfbWFwLmZpbmQoZmFjdG9yeS0+Z2V0X3Nob3J0X25hbWUoKSkgIT0gdGhlX21hcC5lbmQoKSkgewotICAgIGZhaWx1cmUoIkR1cGxpY2F0ZSBnZW5lcmF0b3JzIGZvciBsYW5ndWFnZSBcIiVzXCIhXG4iLCBmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci0gIHRoZV9tYXBbZmFjdG9yeS0+Z2V0X3Nob3J0X25hbWUoKV0gPSBmYWN0b3J5OwotfQotCi10X2dlbmVyYXRvciogdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdHJpbmcmIG9wdGlvbnMpIHsKLSAgc3RyaW5nOjpzaXplX3R5cGUgY29sb24gPSBvcHRpb25zLmZpbmQoJzonKTsKLSAgc3RyaW5nIGxhbmd1YWdlID0gb3B0aW9ucy5zdWJzdHIoMCwgY29sb24pOwotCi0gIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnM7Ci0gIGlmIChjb2xvbiAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBjb2xvbiArIDE7Ci0gICAgd2hpbGUgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgcG9zIDwgb3B0aW9ucy5zaXplKCkpIHsKLSAgICAgIHN0cmluZzo6c2l6ZV90eXBlIG5leHRfcG9zID0gb3B0aW9ucy5maW5kKCcsJywgcG9zKTsKLSAgICAgIHN0cmluZyBvcHRpb24gPSBvcHRpb25zLnN1YnN0cihwb3MsIG5leHRfcG9zIC0gcG9zKTsKLSAgICAgIHBvcyA9ICgobmV4dF9wb3MgPT0gc3RyaW5nOjpucG9zKSA/IG5leHRfcG9zIDogbmV4dF9wb3MgKyAxKTsKLQotICAgICAgc3RyaW5nOjpzaXplX3R5cGUgc2VwYXJhdG9yID0gb3B0aW9uLmZpbmQoJz0nKTsKLSAgICAgIHN0cmluZyBrZXksIHZhbHVlOwotICAgICAgaWYgKHNlcGFyYXRvciA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAga2V5ID0gb3B0aW9uOwotICAgICAgICB2YWx1ZSA9ICIiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAga2V5ID0gb3B0aW9uLnN1YnN0cigwLCBzZXBhcmF0b3IpOwotICAgICAgICB2YWx1ZSA9IG9wdGlvbi5zdWJzdHIoc2VwYXJhdG9yICsgMSk7Ci0gICAgICB9Ci0KLSAgICAgIHBhcnNlZF9vcHRpb25zW2tleV0gPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICBnZW5fbWFwX3QmIHRoZV9tYXAgPSBnZXRfZ2VuZXJhdG9yX21hcCgpOwotICBnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0ZXIgPSB0aGVfbWFwLmZpbmQobGFuZ3VhZ2UpOwotCi0gIGlmIChpdGVyID09IHRoZV9tYXAuZW5kKCkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBpdGVyLT5zZWNvbmQtPmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbnMpOwotfQotCi10X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90JiB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKSB7Ci0gIC8vIGh0dHA6Ly93d3cucGFyYXNoaWZ0LmNvbS9jKystZmFxLWxpdGUvY3RvcnMuaHRtbCNmYXEtMTAuMTIKLSAgc3RhdGljIGdlbl9tYXBfdCogdGhlX21hcCA9IG5ldyBnZW5fbWFwX3QoKTsKLSAgcmV0dXJuICp0aGVfbWFwOwotfQotCi10X2dlbmVyYXRvcl9mYWN0b3J5Ojp0X2dlbmVyYXRvcl9mYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG9jdW1lbnRhdGlvbikKLSAgOiBzaG9ydF9uYW1lXyhzaG9ydF9uYW1lKSwgbG9uZ19uYW1lXyhsb25nX25hbWUpLCBkb2N1bWVudGF0aW9uXyhkb2N1bWVudGF0aW9uKSB7Ci0gIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpyZWdpc3Rlcl9nZW5lcmF0b3IodGhpcyk7Ci19CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZDg3OGEuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0dFTkVSQVRPUl9ICi0jZGVmaW5lIFRfR0VORVJBVE9SX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAicGFyc2UvdF9wcm9ncmFtLmgiCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYmFzaWMKLSAqIHJvdXRpbmVzIGZvciBjb2RlIGdlbmVyYXRpb24gYW5kIGNvbnRhaW5zIHRoZSB0b3AgbGV2ZWwgbWV0aG9kIHRoYXQKLSAqIGRpc3BhdGNoZXMgY29kZSBnZW5lcmF0aW9uIGFjcm9zcyB2YXJpb3VzIGNvbXBvbmVudHMuCi0gKgotICovCi1jbGFzcyB0X2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotICAgIHRtcF8gPSAwOwotICAgIGluZGVudF8gPSAwOwotICAgIHByb2dyYW1fID0gcHJvZ3JhbTsKLSAgICBwcm9ncmFtX25hbWVfID0gZ2V0X3Byb2dyYW1fbmFtZShwcm9ncmFtKTsKLSAgICBlc2NhcGVfWydcbiddID0gIlxcbiI7Ci0gICAgZXNjYXBlX1snXHInXSA9ICJcXHIiOwotICAgIGVzY2FwZV9bJ1x0J10gPSAiXFx0IjsKLSAgICBlc2NhcGVfWyciJ10gPSAiXFxcIiI7Ci0gICAgZXNjYXBlX1snXFwnXSA9ICJcXFxcIjsKLSAgfQotCi0gIHZpcnR1YWwgfnRfZ2VuZXJhdG9yKCkge30KLQotICAvKioKLSAgICogRnJhbWV3b3JrIGdlbmVyYXRvciBtZXRob2QgdGhhdCBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgcGFydHMgb2YgYSBwcm9ncmFtCi0gICAqIGFuZCBwZXJmb3JtcyBnZW5lcmFsIGFjdGlvbnMuIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGJhc2UgY2xhc3MgYW5kCi0gICAqIHNob3VsZCBub3Qgbm9ybWFsbHkgYmUgb3ZlcndyaXR0ZW4gaW4gdGhlIHN1YmNsYXNzZXMuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSgpOwotCi0gIGNvbnN0IHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSBjb25zdCB7IHJldHVybiBwcm9ncmFtXzsgfQotCi0gIHZvaWQgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnRfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmVfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29tbWVudF9lbmQpOwotCi0gIC8qKgotICAgKiBjaGVjayB3aGV0aGVyIHN1Yi1uYW1lc3BhY2UgZGVjbGFyYWN0aW9uIGlzIHVzZWQgYnkgZ2VuZXJhdG9yLgotICAgKiBlLmcuIGFsbG93Ci0gICAqIG5hbWVzcGFjZSBweS50d2lzdGVkIGJhcgotICAgKiB0byBzcGVjaWZ5IG5hbWVzcGFjZSB0byB1c2Ugd2hlbiAtZ2VuIHB5OnR3aXN0ZWQgaXMgc3BlY2lmaWVkLgotICAgKiBXaWxsIGJlIGNhbGxlZCB3aXRoIHN1Ym5hbWVzcGFjZSwgaS5lLiBpc192YWxpZF9uYW1lc3BhY2UoInR3aXN0ZWQiKQotICAgKiB3aWxsIGJlIGNhbGxlZCBmb3IgdGhlIGFib3ZlIGV4YW1wbGUuCi0gICAqLwotICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKLSAgICAodm9pZClzdWJfbmFtZXNwYWNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBFc2NhcGUgc3RyaW5nIHRvIHVzZSBvbmUgaW4gZ2VuZXJhdGVkIHNvdXJjZXMuCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGVzY2FwZV9zdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGluKSBjb25zdDsKLQotICBzdGQ6OnN0cmluZyBnZXRfZXNjYXBlZF9zdHJpbmcodF9jb25zdF92YWx1ZSogY29uc3R2YWwpIHsKLSAgICByZXR1cm4gZXNjYXBlX3N0cmluZyhjb25zdHZhbC0+Z2V0X3N0cmluZygpKTsKLSAgfQotCi1wcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiBPcHRpb25hbCBtZXRob2RzIHRoYXQgbWF5IGJlIGltbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byB0YWtlIG5lY2Vzc2FyeQotICAgKiBzdGVwcyBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBjb2RlIGdlbmVyYXRpb24uCi0gICAqLwotCi0gIHZpcnR1YWwgdm9pZCBpbml0X2dlbmVyYXRvcigpIHt9Ci0gIHZpcnR1YWwgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFB1cmUgdmlydHVhbCBtZXRob2RzIGltcGxlbWVudGVkIGJ5IHRoZSBnZW5lcmF0b3Igc3ViY2xhc3Nlcy4KLSAgICovCi0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgPSAwOwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsgKHZvaWQpdGNvbnN0OyB9Ci0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpID0gMDsKLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCopIHt9Ci0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gICAgLy8gQnkgZGVmYXVsdCBleGNlcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBzdHJ1Y3RzCi0gICAgZ2VuZXJhdGVfc3RydWN0KHR4Y2VwdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHRvIGdldCB0aGUgcHJvZ3JhbSBuYW1lLCBtYXkgYmUgb3ZlcnJpZGRlbgotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfcHJvZ3JhbV9uYW1lKHRfcHJvZ3JhbSogdHByb2dyYW0pIHsgcmV0dXJuIHRwcm9ncmFtLT5nZXRfbmFtZSgpOyB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0byBnZXQgdGhlIHNlcnZpY2UgbmFtZSwgbWF5IGJlIG92ZXJyaWRkZW4KLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X3NlcnZpY2VfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7IHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKTsgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgb3V0cHV0IGRpcmVjdG9yeQotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfb3V0X2RpcigpIGNvbnN0IHsKLSAgICBpZiAocHJvZ3JhbV8tPmlzX291dF9wYXRoX2Fic29sdXRlKCkpIHsKLSAgICAgIHJldHVybiBwcm9ncmFtXy0+Z2V0X291dF9wYXRoKCkgKyAiLyI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHByb2dyYW1fLT5nZXRfb3V0X3BhdGgoKSArIG91dF9kaXJfYmFzZV8gKyAiLyI7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIHVuaXF1ZSB0ZW1wb3JhcnkgdmFyaWFibGUgbmFtZSwgd2hpY2ggaXMganVzdCAibmFtZSIgd2l0aCBhCi0gICAqIG51bWJlciBhcHBlbmRlZCB0byBpdCAoaS5lLiBuYW1lMzUpCi0gICAqLwotICBzdGQ6OnN0cmluZyB0bXAoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gICAgb3V0IDw8IG5hbWUgPDwgdG1wXysrOwotICAgIHJldHVybiBvdXQuc3RyKCk7Ci0gIH0KLQotICAvKioKLSAgICogSW5kZW50YXRpb24gbGV2ZWwgbW9kaWZpZXJzCi0gICAqLwotCi0gIHZvaWQgaW5kZW50X3VwKCkgeyArK2luZGVudF87IH0KLQotICB2b2lkIGluZGVudF9kb3duKCkgeyAtLWluZGVudF87IH0KLQotICAvKioKLSAgICogSW5kZW50YXRpb24gcHJpbnQgZnVuY3Rpb24KLSAgICovCi0gIHN0ZDo6c3RyaW5nIGluZGVudCgpIHsKLSAgICBzdGQ6OnN0cmluZyBpbmQgPSAiIjsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50XzsgKytpKSB7Ci0gICAgICBpbmQgKz0gIiAgIjsKLSAgICB9Ci0gICAgcmV0dXJuIGluZDsKLSAgfQotCi0gIC8qKgotICAgKiBJbmRlbnRhdGlvbiB1dGlsaXR5IHdyYXBwZXIKLSAgICovCi0gIHN0ZDo6b3N0cmVhbSYgaW5kZW50KHN0ZDo6b3N0cmVhbSYgb3MpIHsgcmV0dXJuIG9zIDw8IGluZGVudCgpOyB9Ci0KLSAgLyoqCi0gICAqIENhcGl0YWxpemF0aW9uIGhlbHBlcnMKLSAgICovCi0gIHN0ZDo6c3RyaW5nIGNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvdXBwZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotICBzdGQ6OnN0cmluZyBkZWNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvbG93ZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotICBzdGF0aWMgc3RkOjpzdHJpbmcgbG93ZXJjYXNlKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5zaXplKCk7ICsraSkgewotICAgICAgaW5baV0gPSB0b2xvd2VyKGluW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluOwotICB9Ci0gIHN0YXRpYyBzdGQ6OnN0cmluZyB1cHBlcmNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgKytpKSB7Ci0gICAgICBpbltpXSA9IHRvdXBwZXIoaW5baV0pOwotICAgIH0KLSAgICByZXR1cm4gaW47Ci0gIH0KLSAgLyoqCi0gICAqIFRyYW5zZm9ybXMgYSBjYW1lbCBjYXNlIHN0cmluZyB0byBhbiBlcXVpdmFsZW50IG9uZSBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMKLSAgICogZS5nLiBhTXVsdGlXb3JkIC0+IGFfbXVsdGlfd29yZAotICAgKiAgICAgIHNvbWVOYW1lICAgLT4gc29tZV9uYW1lCi0gICAqICAgICAgQ2FtZWxDYXNlICAtPiBjYW1lbF9jYXNlCi0gICAqICAgICAgbmFtZSAgICAgICAtPiBuYW1lCi0gICAqICAgICAgTmFtZSAgICAgICAtPiBuYW1lCi0gICAqLwotICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgaW5bMF0gPSB0b2xvd2VyKGluWzBdKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGluLnNpemUoKTsgKytpKSB7Ci0gICAgICBpZiAoaXN1cHBlcihpbltpXSkpIHsKLSAgICAgICAgaW5baV0gPSB0b2xvd2VyKGluW2ldKTsKLSAgICAgICAgaW4uaW5zZXJ0KGksICJfIik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbjsKLSAgfQotICAvKioKLSAgICAqIFRyYW5zZm9ybXMgYSBzdHJpbmcgd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMgdG8gYSBjYW1lbCBjYXNlIGVxdWl2YWxlbnQKLSAgICAqIGUuZy4gYV9tdWx0aV93b3JkIC0+IGFNdWx0aVdvcmQKLSAgICAqICAgICAgc29tZV9uYW1lICAgIC0+ICBzb21lTmFtZQotICAgICogICAgICBuYW1lICAgICAgICAgLT4gIG5hbWUKLSAgICAqLwotICBzdGQ6OnN0cmluZyBjYW1lbGNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAgIGJvb2wgdW5kZXJzY29yZSA9IGZhbHNlOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5zaXplKCk7IGkrKykgewotICAgICAgaWYgKGluW2ldID09ICdfJykgewotICAgICAgICB1bmRlcnNjb3JlID0gdHJ1ZTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAodW5kZXJzY29yZSkgewotICAgICAgICBvdXQgPDwgKGNoYXIpdG91cHBlcihpbltpXSk7Ci0gICAgICAgIHVuZGVyc2NvcmUgPSBmYWxzZTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5baV07Ci0gICAgfQotCi0gICAgcmV0dXJuIG91dC5zdHIoKTsKLSAgfQotCi1wdWJsaWM6Ci0gIC8qKgotICAgKiBHZXQgdGhlIHRydWUgdHlwZSBiZWhpbmQgYSBzZXJpZXMgb2YgdHlwZWRlZnMuCi0gICAqLwotICBzdGF0aWMgdF90eXBlKiBnZXRfdHJ1ZV90eXBlKHRfdHlwZSogdHlwZSkgeyByZXR1cm4gdHlwZS0+Z2V0X3RydWVfdHlwZSgpOyB9Ci0KLXByb3RlY3RlZDoKLSAgLyoqCi0gICAqIFRoZSBwcm9ncmFtIGJlaW5nIGdlbmVyYXRlZAotICAgKi8KLSAgdF9wcm9ncmFtKiBwcm9ncmFtXzsKLQotICAvKioKLSAgICogUXVpY2sgYWNjZXNzb3IgZm9yIGZvcm1hdHRlZCBwcm9ncmFtIG5hbWUgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcKLSAgICogZ2VuZXJhdGVkLgotICAgKi8KLSAgc3RkOjpzdHJpbmcgcHJvZ3JhbV9uYW1lXzsKLQotICAvKioKLSAgICogUXVpY2sgYWNjZXNzb3IgZm9yIGZvcm1hdHRlZCBzZXJ2aWNlIG5hbWUgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcKLSAgICogZ2VuZXJhdGVkLgotICAgKi8KLSAgc3RkOjpzdHJpbmcgc2VydmljZV9uYW1lXzsKLQotICAvKioKLSAgICogT3V0cHV0IHR5cGUtc3BlY2lmYyBkaXJlY3RvcnkgbmFtZSAoImdlbi0qIikKLSAgICovCi0gIHN0ZDo6c3RyaW5nIG91dF9kaXJfYmFzZV87Ci0KLSAgLyoqCi0gICAqIE1hcCBvZiBjaGFyYWN0ZXJzIHRvIGVzY2FwZSBpbiBzdHJpbmcgbGl0ZXJhbHMuCi0gICAqLwotICBzdGQ6Om1hcDxjaGFyLCBzdGQ6OnN0cmluZz4gZXNjYXBlXzsKLQotcHJpdmF0ZToKLSAgLyoqCi0gICAqIEN1cnJlbnQgY29kZSBpbmRlbnRhdGlvbiBsZXZlbAotICAgKi8KLSAgaW50IGluZGVudF87Ci0KLSAgLyoqCi0gICAqIFRlbXBvcmFyeSB2YXJpYWJsZSBjb3VudGVyLCBmb3IgbWFraW5nIHVuaXF1ZSB2YXJpYWJsZSBuYW1lcwotICAgKi8KLSAgaW50IHRtcF87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1MjM4NS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfR0VORVJBVE9SX1JFR0lTVFJZX0gKLSNkZWZpbmUgVF9HRU5FUkFUT1JfUkVHSVNUUllfSAotCi1jbGFzcyB0X2dlbmVyYXRvcjsKLQotLyoqCi0gKiBBIGZhY3RvcnkgZm9yIHByb2R1Y2luZyBnZW5lcmF0b3IgY2xhc3NlcyBvZiBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UuCi0gKgotICogVGhpcyBjbGFzcyBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvcjoKLSAqICAtIFJlZ2lzdGVyaW5nIGl0c2VsZiB3aXRoIHRoZSBnZW5lcmF0b3IgcmVnaXN0cnkuCi0gKiAgLSBQcm92aWRpbmcgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGdlbmVyYXRvcnMgaXQgcHJvZHVjZXMuCi0gKi8KLWNsYXNzIHRfZ2VuZXJhdG9yX2ZhY3RvcnkgewotcHVibGljOgotICB0X2dlbmVyYXRvcl9mYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb25nX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pOwotCi0gIHZpcnR1YWwgfnRfZ2VuZXJhdG9yX2ZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IoCi0gICAgICAvLyBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZS4KLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIC8vIE5vdGU6IHBhcnNlZF9vcHRpb25zIHdpbGwgbm90IGV4aXN0IGJleW9uZCB0aGUgY2FsbCB0byBnZXRfZ2VuZXJhdG9yLgotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAvLyBOb3RlOiBvcHRpb25fc3RyaW5nIG1pZ2h0IG5vdCBleGlzdCBiZXlvbmQgdGhlIGNhbGwgdG8gZ2V0X2dlbmVyYXRvci4KLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKSA9IDA7Ci0KLSAgdmlydHVhbCBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgPSAwOwotCi0gIHN0ZDo6c3RyaW5nIGdldF9zaG9ydF9uYW1lKCkgeyByZXR1cm4gc2hvcnRfbmFtZV87IH0KLSAgc3RkOjpzdHJpbmcgZ2V0X2xvbmdfbmFtZSgpIHsgcmV0dXJuIGxvbmdfbmFtZV87IH0KLSAgc3RkOjpzdHJpbmcgZ2V0X2RvY3VtZW50YXRpb24oKSB7IHJldHVybiBkb2N1bWVudGF0aW9uXzsgfQotCi1wcml2YXRlOgotICBzdGQ6OnN0cmluZyBzaG9ydF9uYW1lXzsKLSAgc3RkOjpzdHJpbmcgbG9uZ19uYW1lXzsKLSAgc3RkOjpzdHJpbmcgZG9jdW1lbnRhdGlvbl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgZ2VuZXJhdG9yPgotY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnkgewotcHVibGljOgotICB0X2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwoY29uc3Qgc3RkOjpzdHJpbmcmIHNob3J0X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pCi0gICAgOiB0X2dlbmVyYXRvcl9mYWN0b3J5KHNob3J0X25hbWUsIGxvbmdfbmFtZSwgZG9jdW1lbnRhdGlvbikge30KLQotICB2aXJ0dWFsIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykgewotICAgIHJldHVybiBuZXcgZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKLSAgICByZXR1cm4gZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2Uoc3ViX25hbWVzcGFjZSk7Ci0gIH0KLX07Ci0KLWNsYXNzIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5IHsKLXB1YmxpYzoKLSAgc3RhdGljIHZvaWQgcmVnaXN0ZXJfZ2VuZXJhdG9yKHRfZ2VuZXJhdG9yX2ZhY3RvcnkqIGZhY3RvcnkpOwotCi0gIHN0YXRpYyB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKLQotICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2dlbmVyYXRvcl9mYWN0b3J5Kj4gZ2VuX21hcF90OwotICBzdGF0aWMgZ2VuX21hcF90JiBnZXRfZ2VuZXJhdG9yX21hcCgpOwotCi1wcml2YXRlOgotICB0X2dlbmVyYXRvcl9yZWdpc3RyeSgpOwotICB0X2dlbmVyYXRvcl9yZWdpc3RyeShjb25zdCB0X2dlbmVyYXRvcl9yZWdpc3RyeSYpOwotfTsKLQotI2RlZmluZSBUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGxhbmd1YWdlLCBsb25nX25hbWUsIGRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjbGFzcyB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgOiBwdWJsaWMgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsPHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcj4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgOiB0X2dlbmVyYXRvcl9mYWN0b3J5X2ltcGw8dF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yPigjbGFuZ3VhZ2UsIGxvbmdfbmFtZSwgZG9jKSB7fSAgICAgICAgICAgXAotICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgdF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCBfcmVnaXN0ZXJlcjsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0YmM0OC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzU4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgcHJvZ3JhbW1hdGljYWxseSBzYW5pdGl6ZWQgZm9yIHN0eWxlOgotICogYXN0eWxlIC0tc3R5bGU9MXRicyAtZiAtcCAtSCAtaiAtVSB0X2dvX2dlbmVyYXRvci5jYwotICoKLSAqIFRoZSBvdXRwdXQgb2YgYXN0eWxlIHNob3VsZCBub3QgYmUgdGFrZW4gdW5xdWVzdGlvbmluZ2x5LCBidXQgaXQgaXMgYSBnb29kCi0gKiBndWlkZSBmb3IgZW5zdXJpbmcgdW5pZm9ybWl0eSBhbmQgcmVhZGFiaWxpdHkuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2xvY2FsZT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBBIGhlbHBlciBmb3IgYXV0b21hdGljYWxseSBmb3JtYXR0aW5nIHRoZSBlbWl0dGVkIEdvIGNvZGUgZnJvbSB0aGUgVGhyaWZ0Ci0gKiBJREwgcGVyIHRoZSBHbyBzdHlsZSBndWlkZS4KLSAqCi0gKiBSZXR1cm5zOgotICogIC0gdHJ1ZSwgaWYgdGhlIGZvcm1hdHRpbmcgcHJvY2VzcyBzdWNjZWVkZWQuCi0gKiAgLSBmYWxzZSwgaWYgdGhlIGZvcm1hdHRpbmcgcHJvY2VzcyBmYWlsZWQsIHdoaWNoIG1lYW5zIHRoZSBiYXNpYyBvdXRwdXQgd2FzCi0gKiAgICAgICAgICAgc3RpbGwgZ2VuZXJhdGVkLgotICovCi1ib29sIGZvcm1hdF9nb19vdXRwdXQoY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgpOwotCi1jb25zdCBzdHJpbmcgZGVmYXVsdF90aHJpZnRfaW1wb3J0ID0gImdpdC5hcGFjaGUub3JnL3RocmlmdC5naXQvbGliL2dvL3RocmlmdCI7Ci1zdGF0aWMgc3RkOjpzdHJpbmcgcGFja2FnZV9mbGFnOwotCi0vKioKLSAqIEdvIGNvZGUgZ2VuZXJhdG9yLgotICovCi1jbGFzcyB0X2dvX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfZ29fZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1nbyI7Ci0gICAgZ2VuX3RocmlmdF9pbXBvcnRfID0gZGVmYXVsdF90aHJpZnRfaW1wb3J0OwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInBhY2thZ2VfcHJlZml4Iik7Ci0KLSAgICBpZiAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSkgewotICAgICAgZ2VuX3BhY2thZ2VfcHJlZml4XyA9IChpdGVyLT5zZWNvbmQpOwotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ0aHJpZnRfaW1wb3J0Iik7Ci0KLSAgICBpZiAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSkgewotICAgICAgZ2VuX3RocmlmdF9pbXBvcnRfID0gKGl0ZXItPnNlY29uZCk7Ci0gICAgfQotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInBhY2thZ2UiKTsKLQotICAgIGlmIChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKSB7Ci0gICAgICBwYWNrYWdlX2ZsYWcgPSAoaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgicmVhZF93cml0ZV9wcml2YXRlIik7Ci0gICAgcmVhZF93cml0ZV9wcml2YXRlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJpZ25vcmVfaW5pdGlhbGlzbXMiKTsKLSAgICBpZ25vcmVfaW5pdGlhbGlzbXNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBjb25zdCBzdHJpbmcmIG5hbWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJncyA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfaW5pdGlhbGl6ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9pc3NldF9oZWxwZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb3VudHNldGZpZWxkc19oZWxwZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZXNfY291bnRzZXRmaWVsZHMgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ29fZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogT1VUX3B1Yl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiogT1VUX2RlZl92YWx1ZSkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvZXJjZURhdGEgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV90cnVlX3R5cGUgPSBmYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wb2ludGVyX2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5ID0gZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGdvX2F1dG9nZW5fY29tbWVudCgpOwotICBzdGQ6OnN0cmluZyBnb19wYWNrYWdlKCk7Ci0gIHN0ZDo6c3RyaW5nIGdvX2ltcG9ydHNfYmVnaW4oKTsKLSAgc3RkOjpzdHJpbmcgZ29faW1wb3J0c19lbmQoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbXBvcnRfcHJvdGVjdGlvbigpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9maWVsZF9pbml0aWFsX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwgY29uc3Qgc3RyaW5nJiBuYW1lLCBib29sIG9wdGlvbmFsX2ZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkRXJyb3IgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZ29fdHlwZSh0X3R5cGUqIHR0eXBlLCBib29sIGlzX2NvbnRhaW5lcl92YWx1ZSA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19nb190eXBlX3dpdGhfb3B0KHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsX2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19jb250YWluZXJfdmFsdWUgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZ29fa2V5X3R5cGUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9nb19tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtKSB7Ci0KLSAgICBpZiAoIXBhY2thZ2VfZmxhZy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcGFja2FnZV9mbGFnOwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyByZWFsX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImdvIik7Ci0gICAgaWYgKCFyZWFsX21vZHVsZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcmVhbF9tb2R1bGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGxvd2VyY2FzZShwcm9ncmFtLT5nZXRfbmFtZSgpKTsKLSAgfQotCi1wcml2YXRlOgotICBzdGQ6OnN0cmluZyBnZW5fcGFja2FnZV9wcmVmaXhfOwotICBzdGQ6OnN0cmluZyBnZW5fdGhyaWZ0X2ltcG9ydF87Ci0gIGJvb2wgcmVhZF93cml0ZV9wcml2YXRlXzsKLSAgYm9vbCBpZ25vcmVfaW5pdGlhbGlzbXNfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpzdHJpbmcgZl90eXBlc19uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6c3RyaW5nIGZfY29uc3RzX25hbWVfOwotICBzdGQ6OnN0cmluZ3N0cmVhbSBmX2NvbnN0X3ZhbHVlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOwotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0gIHN0ZDo6c3RyaW5nIHJlYWRfbWV0aG9kX25hbWVfOwotICBzdGQ6OnN0cmluZyB3cml0ZV9tZXRob2RfbmFtZV87Ci0KLSAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvbW1vbkluaXRpYWxpc21zOwotCi0gIHN0ZDo6c3RyaW5nIGNhbWVsY2FzZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0OwotICB2b2lkIGZpeF9jb21tb25faW5pdGlhbGlzbShzdGQ6OnN0cmluZyYgdmFsdWUsIGludCBpKSBjb25zdDsKLSAgc3RkOjpzdHJpbmcgcHVibGljaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCA9IGZhbHNlKSBjb25zdDsKLSAgc3RkOjpzdHJpbmcgcHJpdmF0aXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3Q7Ci0gIHN0ZDo6c3RyaW5nIG5ld19wcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdDsKLSAgc3RhdGljIHN0ZDo6c3RyaW5nIHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBzdGF0aWMgYm9vbCBpc19wb2ludGVyX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7Ci0gIHN0YXRpYyBib29sIG9taXRfaW5pdGlhbGl6YXRpb24odF9maWVsZCogdGZpZWxkKTsKLX07Ci0KLS8vIHJldHVybnMgdHJ1ZSBpZiBmaWVsZCBpbml0aWFsaXphdGlvbiBjYW4gYmUgb21pdHRlZCBzaW5jZSBpdCBoYXMgY29ycmVzcG9uZGluZyBnbyB0eXBlIHplcm8gdmFsdWUKLS8vIG9yIGRlZmF1bHQgdmFsdWUgaXMgbm90IHNldAotYm9vbCB0X2dvX2dlbmVyYXRvcjo6b21pdF9pbml0aWFsaXphdGlvbih0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0ZmllbGQtPmdldF92YWx1ZSgpOwotICBpZiAoIXZhbHVlKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiIjsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAvL1tdYnl0ZSBhcmUgYWx3YXlzIGlubGluZQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICAvLyBzdHJpbmdzIGFyZSBwb2ludGVycyBpZiBoYXMgbm8gZGVmYXVsdAotICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfc3RyaW5nKCkuZW1wdHkoKTsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gdmFsdWUtPmdldF9pbnRlZ2VyKCkgPT0gMDsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA9PSAwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfZG91YmxlKCkgPT0gMC47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIG5lZWQgYSByZWZlcmVuY2UgaWYgdXNlZCBhcyBvcHRpb25hbCB3aXRob3V0IGRlZmF1bHQKLXN0YXRpYyBib29sIHR5cGVfbmVlZF9yZWZlcmVuY2UodF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSB0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7Ci0gIGlmICh0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc3RydWN0KCkKLSAgICAgIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgKHR5cGUtPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHJldHVybnMgZmFsc2UgaWYgZmllbGQgY291bGQgbm90IHVzZSBjb21wYXJpc29uIHRvIGRlZmF1bHQgdmFsdWUgYXMgIUlzU2V0KgotYm9vbCB0X2dvX2dlbmVyYXRvcjo6aXNfcG9pbnRlcl9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5fY29udGFpbmVyX3ZhbHVlKSB7Ci0gICh2b2lkKWluX2NvbnRhaW5lcl92YWx1ZTsKLSAgaWYgKHRmaWVsZC0+YW5ub3RhdGlvbnNfLmNvdW50KCJjcHAucmVmIikgIT0gMCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOwotICAvLyBTdHJ1Y3RzIGluIGNvbnRhaW5lcnMgYXJlIHBvaW50ZXJzCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKCEodGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBib29sIGhhc19kZWZhdWx0ID0gdGZpZWxkLT5nZXRfdmFsdWUoKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICIiOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIC8vW11ieXRlIGFyZSBhbHdheXMgaW5saW5lCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIC8vIHN0cmluZ3MgYXJlIHBvaW50ZXJzIGlmIGhhcyBubyBkZWZhdWx0Ci0gICAgICByZXR1cm4gIWhhc19kZWZhdWx0OwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAhaGFzX2RlZmF1bHQ7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAhaGFzX2RlZmF1bHQ7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuIGhhc19kZWZhdWx0OwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuIGhhc19kZWZhdWx0OwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiBoYXNfZGVmYXVsdDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gaGFzX2RlZmF1bHQ7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZ29fdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpjYW1lbGNhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nIHZhbHVlMih2YWx1ZSk7Ci0gIHN0ZDo6c2V0bG9jYWxlKExDX0FMTCwgIkMiKTsgLy8gc2V0IGxvY2FsZSB0byBjbGFzc2ljCi0KLSAgLy8gRml4IGNvbW1vbiBpbml0aWFsaXNtIGluIGZpcnN0IHdvcmQKLSAgZml4X2NvbW1vbl9pbml0aWFsaXNtKHZhbHVlMiwgMCk7Ci0KLSAgLy8gYXMgbG9uZyBhcyB3ZSBhcmUgY2hhbmdpbmcgdGhpbmdzLCBsZXQncyBjaGFuZ2UgXyBmb2xsb3dlZCBieSBsb3dlcmNhc2UgdG8KLSAgLy8gY2FwaXRhbCBhbmQgZml4IGNvbW1vbiBpbml0aWFsaXNtcwotICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDE7IGkgPCB2YWx1ZTIuc2l6ZSgpIC0gMTsgKytpKSB7Ci0gICAgaWYgKHZhbHVlMltpXSA9PSAnXycpIHsKLSAgICAgIGlmIChpc2xvd2VyKHZhbHVlMltpICsgMV0pKSB7Ci0gICAgICAgIHZhbHVlMi5yZXBsYWNlKGksIDIsIDEsIHRvdXBwZXIodmFsdWUyW2kgKyAxXSkpOwotICAgICAgfQotICAgICAgZml4X2NvbW1vbl9pbml0aWFsaXNtKHZhbHVlMiwgaSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHZhbHVlMjsKLX0KLQotLy8gQ2hlY2tzIHRvIHNlZSBpZiB0aGUgd29yZCBzdGFydGluZyBhdCBpIGluIHZhbHVlIGNvbnRhaW5zIGEgY29tbW9uIGluaXRpYWxpc20KLS8vIGFuZCBpZiBzbyByZXBsYWNlcyBpdCB3aXRoIHRoZSB1cHBlciBjYXNlIHZlcnNpb24gb2YgdGhlIHdvcmQuCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpmaXhfY29tbW9uX2luaXRpYWxpc20oc3RkOjpzdHJpbmcmIHZhbHVlLCBpbnQgaSkgY29uc3QgewotICBpZiAoIWlnbm9yZV9pbml0aWFsaXNtc18pIHsKLSAgICBzaXplX3Qgd29yZExlbiA9IHZhbHVlLmZpbmQoJ18nLCBpKTsKLSAgICBpZiAod29yZExlbiAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgd29yZExlbiAtPSBpOwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyB3b3JkID0gdmFsdWUuc3Vic3RyKGksIHdvcmRMZW4pOwotICAgIHN0ZDo6dHJhbnNmb3JtKHdvcmQuYmVnaW4oKSwgd29yZC5lbmQoKSwgd29yZC5iZWdpbigpLCA6OnRvdXBwZXIpOwotICAgIGlmIChjb21tb25Jbml0aWFsaXNtcy5maW5kKHdvcmQpICE9IGNvbW1vbkluaXRpYWxpc21zLmVuZCgpKSB7Ci0gICAgICB2YWx1ZS5yZXBsYWNlKGksIHdvcmQubGVuZ3RoKCksIHdvcmQpOwotICAgIH0KLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cHVibGljaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCkgY29uc3QgewotICBpZiAodmFsdWUuc2l6ZSgpIDw9IDApIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpLCBwcmVmaXg7Ci0KLSAgc3RyaW5nOjpzaXplX3R5cGUgZG90X3BvcyA9IHZhbHVlLnJmaW5kKCcuJyk7Ci0gIGlmIChkb3RfcG9zICE9IHN0cmluZzo6bnBvcykgewotICAgIHByZWZpeCA9IHZhbHVlLnN1YnN0cigwLCBkb3RfcG9zICsgMSkgKyBwcmVmaXg7Ci0gICAgdmFsdWUyID0gdmFsdWUuc3Vic3RyKGRvdF9wb3MgKyAxKTsKLSAgfQotCi0gIGlmICghaXN1cHBlcih2YWx1ZTJbMF0pKSB7Ci0gICAgdmFsdWUyWzBdID0gdG91cHBlcih2YWx1ZTJbMF0pOwotICB9Ci0KLSAgdmFsdWUyID0gY2FtZWxjYXNlKHZhbHVlMik7Ci0KLSAgLy8gZmluYWwgbGVuZ3RoIGJlZm9yZSBmdXJ0aGVyIGNoZWNrcywgdGhlIHN0cmluZyBtYXkgYmVjb21lIGxvbmdlcgotICBzaXplX3QgbGVuX2JlZm9yZSA9IHZhbHVlMi5sZW5ndGgoKTsKLQotICAvLyBJREwgaWRlbnRpZmllcnMgbWF5IHN0YXJ0IHdpdGggIk5ldyIgd2hpY2ggaW50ZXJmZXJlcyB3aXRoIHRoZSBDVE9SIHBhdHRlcm4KLSAgLy8gQWRkaW5nIGFuIGV4dHJhIHVuZGVyc2NvcmUgdG8gYWxsIHRob3NlIGlkZW50aWZpZXJzIHNvbHZlcyB0aGlzCi0gIGlmICgobGVuX2JlZm9yZSA+PSAzKSAmJiAodmFsdWUyLnN1YnN0cigwLCAzKSA9PSAiTmV3IikpIHsKLSAgICB2YWx1ZTIgKz0gJ18nOwotICB9Ci0KLSAgLy8gSURMIGlkZW50aWZpZXJzIG1heSBlbmQgd2l0aCAiQXJncyIvIlJlc3VsdCIgd2hpY2ggaW50ZXJmZXJlcyB3aXRoIHRoZSBpbXBsaWNpdCBzZXJ2aWNlCi0gIC8vIGZ1bmN0aW9uIHN0cnVjdHMKLSAgLy8gQWRkaW5nIGFub3RoZXIgZXh0cmEgdW5kZXJzY29yZSB0byBhbGwgdGhvc2UgaWRlbnRpZmllcnMgc29sdmVzIHRoaXMKLSAgLy8gU3VwcHJlc3MgdGhpcyBjaGVjayBmb3IgdGhlIGFjdHVhbCBoZWxwZXIgc3RydWN0IG5hbWVzCi0gIGlmICghaXNfYXJnc19vcl9yZXN1bHQpIHsKLSAgICBib29sIGVuZHNfd2l0aF9hcmdzID0gKGxlbl9iZWZvcmUgPj0gNCkgJiYgKHZhbHVlMi5zdWJzdHIobGVuX2JlZm9yZSAtIDQsIDQpID09ICJBcmdzIik7Ci0gICAgYm9vbCBlbmRzX3dpdGhfcnNsdCA9IChsZW5fYmVmb3JlID49IDYpICYmICh2YWx1ZTIuc3Vic3RyKGxlbl9iZWZvcmUgLSA2LCA2KSA9PSAiUmVzdWx0Iik7Ci0gICAgaWYgKGVuZHNfd2l0aF9hcmdzIHx8IGVuZHNfd2l0aF9yc2x0KSB7Ci0gICAgICB2YWx1ZTIgKz0gJ18nOwotICAgIH0KLSAgfQotCi0gIC8vIEF2b2lkIG5hbWluZyBjb2xsaXNpb25zIHdpdGggb3RoZXIgc2VydmljZXMKLSAgaWYgKGlzX2FyZ3Nfb3JfcmVzdWx0KSB7Ci0gICAgcHJlZml4ICs9IHB1YmxpY2l6ZShzZXJ2aWNlX25hbWVfKTsKLSAgfQotCi0gIHJldHVybiBwcmVmaXggKyB2YWx1ZTI7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpuZXdfcHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3QgewotICBpZiAodmFsdWUuc2l6ZSgpIDw9IDApIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICBzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gdmFsdWUucmZpbmQoJy4nKTsKLSAgaWYgKGRvdF9wb3MgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmV0dXJuIHZhbHVlLnN1YnN0cigwLCBkb3RfcG9zICsgMSkgKyAiTmV3IiArIHB1YmxpY2l6ZSh2YWx1ZS5zdWJzdHIoZG90X3BvcyArIDEpKTsKLSAgfQotICByZXR1cm4gIk5ldyIgKyBwdWJsaWNpemUodmFsdWUpOwotfQotCi1zdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cHJpdmF0aXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3QgewotICBpZiAodmFsdWUuc2l6ZSgpIDw9IDApIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpOwotCi0gIGlmICghaXNsb3dlcih2YWx1ZTJbMF0pKSB7Ci0gICAgdmFsdWUyWzBdID0gdG9sb3dlcih2YWx1ZTJbMF0pOwotICB9Ci0KLSAgdmFsdWUyID0gY2FtZWxjYXNlKHZhbHVlMik7Ci0KLSAgcmV0dXJuIHZhbHVlMjsKLX0KLQotc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKTsKLSAgc3RkOjp0cmFuc2Zvcm0odmFsdWUyLmJlZ2luKCksIHZhbHVlMi5lbmQoKSwgdmFsdWUyLmJlZ2luKCksIDo6dG9sb3dlcik7Ci0KLSAgc3dpdGNoICh2YWx1ZVswXSkgewotICBjYXNlICdiJzoKLSAgY2FzZSAnQic6Ci0gICAgaWYgKHZhbHVlMiAhPSAiYnJlYWsiKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSAnYyc6Ci0gIGNhc2UgJ0MnOgotICAgIGlmICh2YWx1ZTIgIT0gImNhc2UiICYmIHZhbHVlMiAhPSAiY2hhbiIgJiYgdmFsdWUyICE9ICJjb25zdCIgJiYgdmFsdWUyICE9ICJjb250aW51ZSIpIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBicmVhazsKLQotICBjYXNlICdkJzoKLSAgY2FzZSAnRCc6Ci0gICAgaWYgKHZhbHVlMiAhPSAiZGVmYXVsdCIgJiYgdmFsdWUyICE9ICJkZWZlciIpIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBicmVhazsKLQotICBjYXNlICdlJzoKLSAgY2FzZSAnRSc6Ci0gICAgaWYgKHZhbHVlMiAhPSAiZWxzZSIgJiYgdmFsdWUyICE9ICJlcnJvciIpIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBicmVhazsKLQotICBjYXNlICdmJzoKLSAgY2FzZSAnRic6Ci0gICAgaWYgKHZhbHVlMiAhPSAiZmFsbHRocm91Z2giICYmIHZhbHVlMiAhPSAiZm9yIiAmJiB2YWx1ZTIgIT0gImZ1bmMiKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSAnZyc6Ci0gIGNhc2UgJ0cnOgotICAgIGlmICh2YWx1ZTIgIT0gImdvIiAmJiB2YWx1ZTIgIT0gImdvdG8iKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSAnaSc6Ci0gIGNhc2UgJ0knOgotICAgIGlmICh2YWx1ZTIgIT0gImlmIiAmJiB2YWx1ZTIgIT0gImltcG9ydCIgJiYgdmFsdWUyICE9ICJpbnRlcmZhY2UiKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSAnbSc6Ci0gIGNhc2UgJ00nOgotICAgIGlmICh2YWx1ZTIgIT0gIm1hcCIpIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBicmVhazsKLQotICBjYXNlICdwJzoKLSAgY2FzZSAnUCc6Ci0gICAgaWYgKHZhbHVlMiAhPSAicGFja2FnZSIpIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBicmVhazsKLQotICBjYXNlICdyJzoKLSAgY2FzZSAnUic6Ci0gICAgaWYgKHZhbHVlMiAhPSAicmFuZ2UiICYmIHZhbHVlMiAhPSAicmV0dXJuIikgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIGJyZWFrOwotCi0gIGNhc2UgJ3MnOgotICBjYXNlICdTJzoKLSAgICBpZiAodmFsdWUyICE9ICJzZWxlY3QiICYmIHZhbHVlMiAhPSAic3RydWN0IiAmJiB2YWx1ZTIgIT0gInN3aXRjaCIpIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBicmVhazsKLQotICBjYXNlICd0JzoKLSAgY2FzZSAnVCc6Ci0gICAgaWYgKHZhbHVlMiAhPSAidHlwZSIpIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBicmVhazsKLQotICBjYXNlICd2JzoKLSAgY2FzZSAnVic6Ci0gICAgaWYgKHZhbHVlMiAhPSAidmFyIikgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgcmV0dXJuIHZhbHVlMiArICJfYTEiOwotfQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9nb19tb2R1bGUocHJvZ3JhbV8pOwotICBzdHJpbmcgdGFyZ2V0ID0gbW9kdWxlOwotICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpOwotCi0gIC8vIFRoaXMgc2V0IGlzIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9saW50L2Jsb2IvbWFzdGVyL2xpbnQuZ28jTDY5MgotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkFQSSIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkFTQ0lJIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiQ1BVIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiQ1NTIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiRE5TIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiRU9GIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiR1VJRCIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkhUTUwiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJIVFRQIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSFRUUFMiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJJRCIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIklQIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSlNPTiIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkxIUyIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlFQUyIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlJBTSIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlJIUyIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlJQQyIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlNMQSIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlNNVFAiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJTU0giKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJUQ1AiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJUTFMiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJUVEwiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVRFAiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVSSIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVJRCIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVVSUQiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVUkkiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVUkwiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVVEY4Iik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVk0iKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJYTUwiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJYU1JGIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiWFNTIik7Ci0KLSAgLy8gbmFtZXMgb2YgcmVhZCBhbmQgd3JpdGUgbWV0aG9kcwotICBpZiAocmVhZF93cml0ZV9wcml2YXRlXykgewotICAgIHJlYWRfbWV0aG9kX25hbWVfID0gInJlYWQiOwotICAgIHdyaXRlX21ldGhvZF9uYW1lXyA9ICJ3cml0ZSI7Ci0gIH0gZWxzZSB7Ci0gICAgcmVhZF9tZXRob2RfbmFtZV8gPSAiUmVhZCI7Ci0gICAgd3JpdGVfbWV0aG9kX25hbWVfID0gIldyaXRlIjsKLSAgfQotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCi0gICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOwotCi0gICAgaWYgKG1vZHVsZS5lbXB0eSgpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBtb2R1bGUuZmluZCgnLicpOwotCi0gICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlOwotICAgICAgcGFja2FnZV9uYW1lXyA9IG1vZHVsZTsKLSAgICAgIG1vZHVsZS5jbGVhcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOwotICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZS5zdWJzdHIoMCwgcG9zKTsKLSAgICAgIG1vZHVsZS5lcmFzZSgwLCBwb3MgKyAxKTsKLSAgICB9Ci0gIH0KLQotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0KLSAgd2hpbGUgKChsb2MgPSB0YXJnZXQuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICB0YXJnZXQucmVwbGFjZShsb2MsIDEsIDEsICcvJyk7Ci0gIH0KLQotICAvLyBNYWtlIG91dHB1dCBmaWxlcwotICBmX3R5cGVzX25hbWVfID0gcGFja2FnZV9kaXJfICsgIi8iICsgInR0eXBlcy5nbyI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lXy5jX3N0cigpKTsKLQotICBmX2NvbnN0c19uYW1lXyA9IHBhY2thZ2VfZGlyXyArICIvIiArICJjb25zdGFudHMuZ28iOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lXy5jX3N0cigpKTsKLQotICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLQotICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICBzdHJpbmcgc2VydmljZV9kaXIgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyB1bmRlcnNjb3JlKCgqc3ZfaXRlciktPmdldF9uYW1lKCkpICsgIi1yZW1vdGUiOwotICAgIE1LRElSKHNlcnZpY2VfZGlyLmNfc3RyKCkpOwotICB9Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpIDw8IGdvX3BhY2thZ2UoKSA8PCByZW5kZXJfaW5jbHVkZXMoKQotICAgICAgICAgICA8PCByZW5kZXJfaW1wb3J0X3Byb3RlY3Rpb24oKTsKLQotICBmX2NvbnN0c18gPDwgZ29fYXV0b2dlbl9jb21tZW50KCkgPDwgZ29fcGFja2FnZSgpIDw8IHJlbmRlcl9pbmNsdWRlcygpOwotCi0gIGZfY29uc3RfdmFsdWVzXyA8PCBlbmRsIDw8ICJmdW5jIGluaXQoKSB7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgc3RyaW5nIHVudXNlZF9wcm90ID0gIiI7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHN0cmluZyBnb19tb2R1bGUgPSBnZXRfcmVhbF9nb19tb2R1bGUoaW5jbHVkZXNbaV0pOwotICAgIHNpemVfdCBmb3VuZCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBnb19tb2R1bGUuc2l6ZSgpOyBqKyspIHsKLSAgICAgIC8vIEltcG9ydCBzdGF0ZW1lbnQgdXNlcyBzbGFzaGVzICgnLycpIGluIG5hbWVzcGFjZQotICAgICAgaWYgKGdvX21vZHVsZVtqXSA9PSAnLicpIHsKLSAgICAgICAgZ29fbW9kdWxlW2pdID0gJy8nOwotICAgICAgICBmb3VuZCA9IGogKyAxOwotICAgICAgfQotICAgIH0KLQotICAgIHJlc3VsdCArPSAiXHRcIiIgKyBnZW5fcGFja2FnZV9wcmVmaXhfICsgZ29fbW9kdWxlICsgIlwiXG4iOwotICAgIHVudXNlZF9wcm90ICs9ICJ2YXIgXyA9ICIgKyBnb19tb2R1bGUuc3Vic3RyKGZvdW5kKSArICIuR29VbnVzZWRQcm90ZWN0aW9uX19cbiI7Ci0gIH0KLQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSAiXG4iOwotICB9Ci0KLSAgcmV0dXJuIGdvX2ltcG9ydHNfYmVnaW4oKSArIHJlc3VsdCArIGdvX2ltcG9ydHNfZW5kKCkgKyB1bnVzZWRfcHJvdDsKLX0KLQotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfaW1wb3J0X3Byb3RlY3Rpb24oKSB7Ci0gIHJldHVybiBzdHJpbmcoInZhciBHb1VudXNlZFByb3RlY3Rpb25fXyBpbnQ7XG5cbiIpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSB0byB1c2UgdGhlIGFjY2VsZXJhdGVkIFRCaW5hcnlQcm90b2NvbAotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCkgewotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpnb19hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybgotICAgICAgICBzdGQ6OnN0cmluZygpICsKLSAgICAgICAgIi8vIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgotICAgICAgICAiLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgcGFja2FnZQotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX3BhY2thZ2UoKSB7Ci0gIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIlxuXG4iOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbXBvcnQgc3RhdGVtZW50Ci0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29faW1wb3J0c19iZWdpbigpIHsKLSAgcmV0dXJuIHN0cmluZygKLSAgICAgICJpbXBvcnQgKFxuIgotICAgICAgIlx0XCJieXRlc1wiXG4iCi0gICAgICAiXHRcImZtdFwiXG4iCi0gICAgICAiXHRcIiIgKyBnZW5fdGhyaWZ0X2ltcG9ydF8gKyAiXCJcbiIpOwotfQotCi0vKioKLSAqIEVuZCB0aGUgaW1wb3J0IHN0YXRlbWVudCwgaW5jbHVkZSB1bmRzY29yZS1hc3NpZ25tZW50cwotICoKLSAqIFRoZXNlICJfID0iIHByZXZlbnQgdGhlIGdvIGNvbXBpbGVyIGNvbXBsYWluaW5nIGFib3V0IHVzZWQgaW1wb3J0cy4KLSAqIFRoaXMgd2lsbCBoYXZlIHRvIGRvIGluIGxpZXUgb2YgbW9yZSBpbnRlbGxpZ2VudCBpbXBvcnQgc3RhdGVtZW50IGNvbnN0cnVjdGlvbgotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2ltcG9ydHNfZW5kKCkgewotICByZXR1cm4gc3RyaW5nKAotICAgICAgIilcblxuIgotICAgICAgIi8vIChuZWVkZWQgdG8gZW5zdXJlIHNhZmV0eSBiZWNhdXNlIG9mIG5haXZlIGltcG9ydCBsaXN0IGNvbnN0cnVjdGlvbi4pXG4iCi0gICAgICAidmFyIF8gPSB0aHJpZnQuWkVST1xuIgotICAgICAgInZhciBfID0gZm10LlByaW50ZlxuIgotICAgICAgInZhciBfID0gYnl0ZXMuRXF1YWxcblxuIik7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgZl9jb25zdF92YWx1ZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfY29uc3RzXyA8PCBmX2NvbnN0X3ZhbHVlc18uc3RyKCk7Ci0KLSAgLy8gQ2xvc2UgdHlwZXMgYW5kIGNvbnN0YW50cyBmaWxlcwotICBmX2NvbnN0c18uY2xvc2UoKTsKLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZm9ybWF0X2dvX291dHB1dChmX3R5cGVzX25hbWVfKTsKLSAgZm9ybWF0X2dvX291dHB1dChmX2NvbnN0c19uYW1lXyk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0dHlwZWRlZik7Ci0gIHN0cmluZyBuZXdfdHlwZV9uYW1lKHB1YmxpY2l6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpKTsKLSAgc3RyaW5nIGJhc2VfdHlwZSh0eXBlX3RvX2dvX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpKTsKLQotICBpZiAoYmFzZV90eXBlID09IG5ld190eXBlX25hbWUpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmX3R5cGVzXyA8PCAidHlwZSAiIDw8IG5ld190eXBlX25hbWUgPDwgIiAiIDw8IGJhc2VfdHlwZSA8PCBlbmRsIDw8IGVuZGw7Ci0gIC8vIEdlbmVyYXRlIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBhbiBpbnN0YW5jZSBvZiBhIHR5cGUKLSAgLy8gKHdoaWNoIG1heSBiZSBhIGNvbnN0YW50KSBpbnRvIGEgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBvZiBhIHR5cGUuCi0gIGZfdHlwZXNfIDw8ICJmdW5jICIgPDwgbmV3X3R5cGVfbmFtZSA8PCAiUHRyKHYgIiA8PCBuZXdfdHlwZV9uYW1lIDw8ICIpICoiIDw8IG5ld190eXBlX25hbWUKLSAgICAgICAgICAgPDwgIiB7IHJldHVybiAmdiB9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSB0b19zdHJpbmdfbWFwcGluZywgZnJvbV9zdHJpbmdfbWFwcGluZzsKLSAgc3RkOjpzdHJpbmcgdGVudW1fbmFtZShwdWJsaWNpemUodGVudW0tPmdldF9uYW1lKCkpKTsKLSAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0ZW51bSk7Ci0gIGZfdHlwZXNfIDw8ICJ0eXBlICIgPDwgdGVudW1fbmFtZSA8PCAiIGludDY0IiA8PCBlbmRsIDw8ICJjb25zdCAoIiA8PCBlbmRsOwotCi0gIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICIgPDwgdGVudW1fbmFtZSA8PCAiKSBTdHJpbmcoKSBzdHJpbmcgeyIgPDwgZW5kbDsKLSAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgc3dpdGNoIHAgeyIgPDwgZW5kbDsKLQotICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJmdW5jICIgPDwgdGVudW1fbmFtZSA8PCAiRnJvbVN0cmluZyhzIHN0cmluZykgKCIgPDwgdGVudW1fbmFtZQotICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGVycm9yKSB7IiA8PCBlbmRsOwotICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIHN3aXRjaCBzIHsiIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBpbnQgdmFsdWUgPSAtMTsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLQotICAgIHN0cmluZyBpdGVyX3N0ZF9uYW1lKGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSk7Ci0gICAgc3RyaW5nIGl0ZXJfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgdGVudW1fbmFtZSA8PCAiXyIgPDwgaXRlcl9uYW1lIDw8ICcgJyA8PCB0ZW51bV9uYW1lIDw8ICIgPSAiCi0gICAgICAgICAgICAgPDwgdmFsdWUgPDwgZW5kbDsKLSAgICAvLyBEaWN0aW9uYXJpZXMgdG8vZnJvbSBzdHJpbmcgbmFtZXMgb2YgZW51bXMKLSAgICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlICIgPDwgdGVudW1fbmFtZSA8PCAiXyIgPDwgaXRlcl9uYW1lIDw8ICI6IHJldHVybiBcIiIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIiIgPDwgZW5kbDsKLQotICAgIGlmIChpdGVyX3N0ZF9uYW1lICE9IGVzY2FwZV9zdHJpbmcoaXRlcl9uYW1lKSkgewotICAgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlIFwiIiA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIiwgXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcoaXRlcl9uYW1lKSA8PCAiXCI6IHJldHVybiAiIDw8IHRlbnVtX25hbWUgPDwgIl8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGl0ZXJfbmFtZSA8PCAiLCBuaWwgIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIGNhc2UgXCIiIDw8IGl0ZXJfc3RkX25hbWUgPDwgIlwiOiByZXR1cm4gIiA8PCB0ZW51bV9uYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJfIiA8PCBpdGVyX25hbWUgPDwgIiwgbmlsICIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gXCI8VU5TRVQ+XCIiIDw8IGVuZGw7Ci0gIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgdGVudW1fbmFtZSA8PCAiKDApLCIKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZtdC5FcnJvcmYoXCJub3QgYSB2YWxpZCAiIDw8IHRlbnVtX25hbWUgPDwgIiBzdHJpbmdcIikiIDw8IGVuZGw7Ci0gIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgZl90eXBlc18gPDwgIikiIDw8IGVuZGwgPDwgZW5kbCA8PCB0b19zdHJpbmdfbWFwcGluZy5zdHIoKSA8PCBlbmRsIDw8IGZyb21fc3RyaW5nX21hcHBpbmcuc3RyKCkKLSAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBhbiBpbnN0YW5jZSBvZiBhbiBlbnVtCi0gIC8vICh3aGljaCBtYXkgYmUgYSBjb25zdGFudCkgaW50byBhIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgdGhhdCBlbnVtCi0gIC8vIHR5cGUuCi0gIGZfdHlwZXNfIDw8ICJmdW5jICIgPDwgdGVudW1fbmFtZSA8PCAiUHRyKHYgIiA8PCB0ZW51bV9uYW1lIDw8ICIpICoiIDw8IHRlbnVtX25hbWUKLSAgICAgICAgICAgPDwgIiB7IHJldHVybiAmdiB9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgTWFyc2hhbFRleHQKLSAgZl90eXBlc18gPDwgImZ1bmMgKHAgIiA8PCB0ZW51bV9uYW1lIDw8ICIpIE1hcnNoYWxUZXh0KCkgKFtdYnl0ZSwgZXJyb3IpIHsiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8ICJyZXR1cm4gW11ieXRlKHAuU3RyaW5nKCkpLCBuaWwiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgVW5tYXJzaGFsVGV4dAotICBmX3R5cGVzXyA8PCAiZnVuYyAocCAqIiA8PCB0ZW51bV9uYW1lIDw8ICIpIFVubWFyc2hhbFRleHQodGV4dCBbXWJ5dGUpIGVycm9yIHsiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8ICJxLCBlcnIgOj0gIiA8PCB0ZW51bV9uYW1lIDw8ICJGcm9tU3RyaW5nKHN0cmluZyh0ZXh0KSkiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8ICJpZiAoZXJyICE9IG5pbCkgeyIgPDwgZW5kbCA8PCAicmV0dXJuIGVyciIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgIipwID0gcSIgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgInJldHVybiBuaWwiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSBwdWJsaWNpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQoZl9jb25zdHNfKSA8PCAiY29uc3QgIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSwgbmFtZSkgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX2NvbnN0X3ZhbHVlc18gPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUsIG5hbWUpIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgIGZfY29uc3RzXyA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgbmFtZSA8PCAiICIgPDwgdHlwZV90b19nb190eXBlKHR5cGUpIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICBvdXQgPDwgIltdYnl0ZShcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiXCIpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICB9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAiJiIgPDwgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSkgPDwgInsiOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0KLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHB1YmxpY2l6ZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIDw8ICI6ICIKLSAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQsIG5hbWUpIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8ICJ9IjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG91dCA8PCAibWFwWyIgPDwgdHlwZV90b19nb190eXBlKGt0eXBlKSA8PCAiXSIgPDwgdHlwZV90b19nb190eXBlKHZ0eXBlLCB0cnVlKSA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QsIG5hbWUpIDw8ICI6ICIKLSAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kLCBuYW1lKSA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIG91dCA8PCAiW10iIDw8IHR5cGVfdG9fZ29fdHlwZShldHlwZSkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIsIG5hbWUpIDw8ICIsICI7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgb3V0IDw8ICJtYXBbIiA8PCB0eXBlX3RvX2dvX2tleV90eXBlKGV0eXBlKSA8PCAiXWJvb2x7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyLCBuYW1lKSA8PCAiOiB0cnVlLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGdvIHN0cnVjdAotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfZ29fc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9nb19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBnbyBzdHJ1Y3QKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLX0KLQotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIE9VVF9wdWJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiogT1VUX2RlZl92YWx1ZSkgY29uc3QgewotICBjb25zdCBzdHJpbmcgYmFzZV9maWVsZF9uYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOwotICBjb25zdCBzdHJpbmcgZXNjYXBlZF9maWVsZF9uYW1lID0gZXNjYXBlX3N0cmluZyhiYXNlX2ZpZWxkX25hbWUpOwotICAqT1VUX3B1Yl9uYW1lID0gcHVibGljaXplKGVzY2FwZWRfZmllbGRfbmFtZSk7Ci0gICpPVVRfZGVmX3ZhbHVlID0gdGZpZWxkLT5nZXRfdmFsdWUoKTsKLX0KLQotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCkgewotICBvdXQgPDwgcHVibGljaXplKHR5cGVfbmFtZSh0c3RydWN0KSwgaXNfYXJnc19vcl9yZXN1bHQpIDw8ICJ7IjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsKLSAgICAgICArK21faXRlcikgewotICAgIGJvb2wgcG9pbnRlcl9maWVsZCA9IGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcik7Ci0gICAgc3RyaW5nIHB1YmxpY2l6ZWRfbmFtZTsKLSAgICB0X2NvbnN0X3ZhbHVlKiBkZWZfdmFsdWU7Ci0gICAgZ2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKCptX2l0ZXIsICZwdWJsaWNpemVkX25hbWUsICZkZWZfdmFsdWUpOwotICAgIGlmICghcG9pbnRlcl9maWVsZCAmJiBkZWZfdmFsdWUgIT0gTlVMTCAmJiAhb21pdF9pbml0aWFsaXphdGlvbigqbV9pdGVyKSkgewotICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHVibGljaXplZF9uYW1lIDw8ICI6ICIKLSAgICAgICAgICA8PCByZW5kZXJfZmllbGRfaW5pdGlhbF92YWx1ZSgqbV9pdGVyLCAoKm1faXRlciktPmdldF9uYW1lKCksIHBvaW50ZXJfZmllbGQpIDw8ICIsIgotICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FyZ3MpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHNvcnRlZF9tZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCksIGlzX2FyZ3MgfHwgaXNfcmVzdWx0KSk7Ci0gIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCB0c3RydWN0X25hbWUgPDwgIiBzdHJ1Y3QgeyIgPDwgZW5kbDsKLSAgLyoKLSAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgotICAgICBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgICB0aHJpZnRfc3BlYyAtPiB0dXBsZSBvZiBpdGVtX3NwZWMKLSAgICAgaXRlbV9zcGVjIC0+IG5pbCB8ICh0YWcsIHR5cGVfZW51bSwgbmFtZSwgc3BlY19hcmdzLCBkZWZhdWx0KQotICAgICB0YWcgLT4gaW50ZWdlcgotICAgICB0eXBlX2VudW0gLT4gVFR5cGUuSTMyIHwgVFR5cGUuU1RSSU5HIHwgVFR5cGUuU1RSVUNUIHwgLi4uCi0gICAgIG5hbWUgLT4gc3RyaW5nX2xpdGVyYWwKLSAgICAgZGVmYXVsdCAtPiBuaWwgICMgSGFuZGxlZCBieSBfX2luaXRfXwotICAgICBzcGVjX2FyZ3MgLT4gbmlsICAjIEZvciBzaW1wbGUgdHlwZXMKLSAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKLSAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncywgdHlwZV9lbnVtLCBzcGVjX2FyZ3MpCi0gICAgICAgICAgICAgICAgICAjIEtleSBhbmQgdmFsdWUgZm9yIG1hcAotICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KLSAgICAgY2xhc3NfbmFtZSAtPiBpZGVudGlmaWVyICAjIEJhc2ljYWxseSBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzCi0gICAgIHNwZWNfYXJnc19wdHIgLT4gZXhwcmVzc2lvbiAgIyBqdXN0IGNsYXNzX25hbWUuc3BlY19hcmdzCi0KLSAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KLSAgKi8KLSAgLy8gVE9ETyhkcmVpc3MpOiBMb29rIGludG8gZ2VuZXJhdGluZyBhbiBlbXB0eSB0dXBsZSBpbnN0ZWFkIG9mIG5pbAotICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCi0gIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cwotICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgotICBpbmRlbnRfdXAoKTsKLQotICBpbnQgbnVtX3NldGFibGUgPSAwOwotICBpZiAoc29ydGVkX21lbWJlcnMuZW1wdHkoKSB8fCAoc29ydGVkX21lbWJlcnNbMF0tPmdldF9rZXkoKSA+PSAwKSkgewotICAgIGludCBzb3J0ZWRfa2V5c19wb3MgPSAwOwotCi0gICAgZm9yIChtX2l0ZXIgPSBzb3J0ZWRfbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gc29ydGVkX21lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAvLyBTZXQgZmllbGQgdG8gb3B0aW9uYWwgaWYgZmllbGQgaXMgdW5pb24sIHRoaXMgaXMgc28gd2UgY2FuIGdldCBhCi0gICAgICAvLyBwb2ludGVyIHRvIHRoZSBmaWVsZC4KLSAgICAgIGlmICh0c3RydWN0LT5pc191bmlvbigpKQotICAgICAgICAoKm1faXRlciktPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7Ci0gICAgICBpZiAoc29ydGVkX2tleXNfcG9zICE9ICgqbV9pdGVyKS0+Z2V0X2tleSgpKSB7Ci0gICAgICAgIGludCBmaXJzdF91bnVzZWQgPSBzdGQ6Om1heCgxLCBzb3J0ZWRfa2V5c19wb3MrKyk7Ci0gICAgICAgIHdoaWxlIChzb3J0ZWRfa2V5c19wb3MgIT0gKCptX2l0ZXIpLT5nZXRfa2V5KCkpIHsKLSAgICAgICAgICArK3NvcnRlZF9rZXlzX3BvczsKLSAgICAgICAgfQotICAgICAgICBpbnQgbGFzdF91bnVzZWQgPSBzb3J0ZWRfa2V5c19wb3MgLSAxOwotICAgICAgICBpZiAoZmlyc3RfdW51c2VkIDwgbGFzdF91bnVzZWQpIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gdW51c2VkIGZpZWxkcyAjICIgPDwgZmlyc3RfdW51c2VkIDw8ICIgdG8gIiA8PCBsYXN0X3VudXNlZCA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgaWYgKGZpcnN0X3VudXNlZCA9PSBsYXN0X3VudXNlZCkgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyB1bnVzZWQgZmllbGQgIyAiIDw8IGZpcnN0X3VudXNlZCA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRfdHlwZSogZmllbGRUeXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgc3RyaW5nIGdvVHlwZSA9IHR5cGVfdG9fZ29fdHlwZV93aXRoX29wdChmaWVsZFR5cGUsIGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcikpOwotICAgICAgc3RyaW5nIGdvdGFnOwotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgZ290YWcgPSAianNvbjpcIiIgKyBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiLG9taXRlbXB0eVwiIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdvdGFnID0gImpzb246XCIiICsgZXNjYXBlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpICsgIlwiIjsKLSAgICAgIH0KLSAgICAgIHN0ZDo6bWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSAoKm1faXRlciktPmFubm90YXRpb25zXy5maW5kKCJnby50YWciKTsKLSAgICAgIGlmIChpdCAhPSAoKm1faXRlciktPmFubm90YXRpb25zXy5lbmQoKSkgewotICAgICAgICBnb3RhZyA9IGl0LT5zZWNvbmQ7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCBwdWJsaWNpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiICIgPDwgZ29UeXBlIDw8ICIgYHRocmlmdDpcIiIKLSAgICAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiLCIgPDwgc29ydGVkX2tleXNfcG9zOwotCi0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBvdXQgPDwgIixyZXF1aXJlZCI7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PCAiXCIgIiA8PCBnb3RhZyA8PCAiYCIgPDwgZW5kbDsKLSAgICAgIHNvcnRlZF9rZXlzX3BvcysrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAvLyBUaGlzIGZpbGxzIGluIGRlZmF1bHQgdmFsdWVzLCBhcyBvcHBvc2VkIHRvIG51bGxzCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHVibGljaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiCi0gICAgICAgICAgPDwgdHlwZV90b19nb190eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgdHN0cnVjdF9uYW1lIDw8ICIoKSAqIiA8PCB0c3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICYiOwotICBnZW5lcmF0ZV9nb19zdHJ1Y3RfaW5pdGlhbGl6ZXIob3V0LCB0c3RydWN0LCBpc19yZXN1bHQgfHwgaXNfYXJncyk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAvLyBEZWZhdWx0IHZhbHVlcyBmb3Igb3B0aW9uYWwgZmllbGRzCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgcHVibGljaXplZF9uYW1lOwotICAgIHRfY29uc3RfdmFsdWUqIGRlZl92YWx1ZTsKLSAgICBnZXRfcHVibGljaXplZF9uYW1lX2FuZF9kZWZfdmFsdWUoKm1faXRlciwgJnB1YmxpY2l6ZWRfbmFtZSwgJmRlZl92YWx1ZSk7Ci0gICAgdF90eXBlKiBmaWVsZFR5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7Ci0gICAgc3RyaW5nIGdvVHlwZSA9IHR5cGVfdG9fZ29fdHlwZV93aXRoX29wdChmaWVsZFR5cGUsIGZhbHNlKTsKLSAgICBzdHJpbmcgZGVmX3Zhcl9uYW1lID0gdHN0cnVjdF9uYW1lICsgIl8iICsgcHVibGljaXplZF9uYW1lICsgIl9ERUZBVUxUIjsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fCBpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IGRlZl92YXJfbmFtZSA8PCAiICIgPDwgZ29UeXBlOwotICAgICAgaWYgKGRlZl92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgIG91dCA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRUeXBlLCBkZWZfdmFsdWUsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcikpIHsKLSAgICAgIHN0cmluZyBnb09wdFR5cGUgPSB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQoZmllbGRUeXBlLCB0cnVlKTsKLSAgICAgIHN0cmluZyBtYXliZXBvaW50ZXIgPSBnb09wdFR5cGUgIT0gZ29UeXBlID8gIioiIDogIiI7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIEdldCIgPDwgcHVibGljaXplZF9uYW1lIDw8ICIoKSAiCi0gICAgICAgICAgPDwgZ29UeXBlIDw8ICIgeyIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAhcC5Jc1NldCIgPDwgcHVibGljaXplZF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuICIgPDwgZGVmX3Zhcl9uYW1lIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgbWF5YmVwb2ludGVyIDw8ICJwLiIgPDwgcHVibGljaXplZF9uYW1lIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBudW1fc2V0YWJsZSArPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgR2V0IiA8PCBwdWJsaWNpemVkX25hbWUgPDwgIigpICIKLSAgICAgICAgICA8PCBnb1R5cGUgPDwgIiB7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwLiIgPDwgcHVibGljaXplZF9uYW1lIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkgJiYgbnVtX3NldGFibGUgPiAwKSB7Ci0gICAgZ2VuZXJhdGVfY291bnRzZXRmaWVsZHNfaGVscGVyKG91dCwgdHN0cnVjdCwgdHN0cnVjdF9uYW1lLCBpc19yZXN1bHQpOwotICB9Ci0KLSAgZ2VuZXJhdGVfaXNzZXRfaGVscGVycyhvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKLSAgZ2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKLSAgZ2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0LCBudW1fc2V0YWJsZSA+IDApOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiBwID09IG5pbCB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gXCI8bmlsPlwiIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuU3ByaW50ZihcIiIgPDwgZXNjYXBlX3N0cmluZyh0c3RydWN0X25hbWUpIDw8ICIoJSt2KVwiLCAqcCkiCi0gICAgICA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBFcnJvcigpIHN0cmluZyB7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5TdHJpbmcoKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgSXNTZXQgaGVscGVyIG1ldGhvZHMgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2hlbHBlcnMob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICAodm9pZClpc19yZXN1bHQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcikpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgSXNTZXQiIDw8IGZpZWxkX25hbWUgPDwgIigpIGJvb2wgeyIKLSAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7Ci0gICAgICBib29sIGlzX2J5dGVzbGljZSA9IHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0dHlwZSktPmlzX2JpbmFyeSgpOwotICAgICAgYm9vbCBjb21wYXJlX3RvX25pbF9vbmx5ID0gdHR5cGUtPmlzX3NldCgpIHx8IHR0eXBlLT5pc19saXN0KCkgfHwgdHR5cGUtPmlzX21hcCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaXNfYnl0ZXNsaWNlICYmICEoKmZfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgICAgIGlmIChpc19wb2ludGVyX2ZpZWxkKCpmX2l0ZXIpIHx8IGNvbXBhcmVfdG9fbmlsX29ubHkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBuaWwiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdHJpbmcgZGVmX3Zhcl9uYW1lID0gdHN0cnVjdF9uYW1lICsgIl8iICsgZmllbGRfbmFtZSArICJfREVGQVVMVCI7Ci0gICAgICAgIGlmIChpc19ieXRlc2xpY2UpIHsKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAhYnl0ZXMuRXF1YWwocC4iIDw8IGZpZWxkX25hbWUgPDwgIiwgIiA8PCBkZWZfdmFyX25hbWUgPDwgIikiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSAiIDw8IGRlZl92YXJfbmFtZSA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBDb3VudFNldEZpZWxkcyBoZWxwZXIgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb3VudHNldGZpZWxkc19oZWxwZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICAodm9pZClpc19yZXN1bHQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgQ291bnRTZXRGaWVsZHMiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCkgaW50IHsiCi0gICAgICA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJjb3VudCA6PSAwIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAoIWlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcikpCi0gICAgICBjb250aW51ZTsKLQotICAgIGNvbnN0IHN0cmluZyBmaWVsZF9uYW1lKHB1YmxpY2l6ZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHAuSXNTZXQiIDw8IGZpZWxkX25hbWUgPDwgIigpKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY291bnQrKyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvdW50IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICAodm9pZClpc19yZXN1bHQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgIihpcHJvdCB0aHJpZnQuVFByb3RvY29sKSBlcnJvciB7IgotICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgXywgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIHJlYWQgZXJyb3I6IFwiLCBwKSwgZXJyKSIKLSAgICAgIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBkb2VzIG5vdCBoYXZlIElzU2V0IGZ1bmN0aW9ucywgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtLgotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidmFyIGlzc2V0IiA8PCBmaWVsZF9uYW1lIDw8ICIgYm9vbCA9IGZhbHNlOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJmb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIGZpZWxkVHlwZUlkLCBmaWVsZElkLCBlcnIgOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiCi0gICAgICAgICAgICAgICAgICAgICAiXCIlVCBmaWVsZCAlZCByZWFkIGVycm9yOiBcIiwgcCwgZmllbGRJZCksIGVycikiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkVHlwZUlkID09IHRocmlmdC5TVE9QIHsgYnJlYWs7IH0iIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIHRocmlmdEZpZWxkVHlwZUlkOwotICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgaW50MzJfdCBmaWVsZF9pZCA9IC0xOwotCi0gIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nLCBmYWxzZSBpZiBubyBmaWVsZHMgcHJlc2VudAotICBib29sIGhhdmVfc3dpdGNoID0gIWZpZWxkcy5lbXB0eSgpOwotICBpZiAoaGF2ZV9zd2l0Y2gpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIGZpZWxkSWQgeyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEFsbCB0aGUgZmllbGRzIHdlIGtub3cKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotCi0gICAgLy8gaWYgbmVnYXRpdmUgaWQsIGVuc3VyZSB3ZSBnZW5lcmF0ZSBhIHZhbGlkIG1ldGhvZCBuYW1lCi0gICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoInJlYWRGaWVsZCIpOwotCi0gICAgaWYgKGZpZWxkX2lkIDwgMCkgewotICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7Ci0gICAgICBmaWVsZF9pZCAqPSAtMTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCBmaWVsZF9pZCA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICB0aHJpZnRGaWVsZFR5cGVJZCA9IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotCi0gICAgaWYgKHRocmlmdEZpZWxkVHlwZUlkID09ICJ0aHJpZnQuQklOQVJZIikgewotICAgICAgdGhyaWZ0RmllbGRUeXBlSWQgPSAidGhyaWZ0LlNUUklORyI7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gcC4iIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfaWQgPDwgIihpcHJvdCk7IGVyciAhPSBuaWwgeyIKLSAgICAgICAgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBNYXJrIHJlcXVpcmVkIGZpZWxkIGFzIHJlYWQKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpc3NldCIgPDwgZmllbGRfbmFtZSA8PCAiID0gdHJ1ZSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gQmVnaW4gc3dpdGNoIGRlZmF1bHQgY2FzZQotICBpZiAoaGF2ZV9zd2l0Y2gpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gU2tpcCB1bmtub3duIGZpZWxkcyBpbiBlaXRoZXIgY2FzZQotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIEVuZCBzd2l0Y2ggZGVmYXVsdCBjYXNlCi0gIGlmIChoYXZlX3N3aXRjaCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZXJyIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiCi0gICAgICAgICAgICAgICAgICAgICAiXCIlVCByZWFkIHN0cnVjdCBlbmQgZXJyb3I6IFwiLCBwKSwgZXJyKSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFJldHVybiBlcnJvciBpZiBhbnkgcmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nLgotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICFpc3NldCIgPDwgZmllbGRfbmFtZSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKHRocmlmdC5JTlZBTElEX0RBVEEsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiZm10LkVycm9yZihcIlJlcXVpcmVkIGZpZWxkICIgPDwgZmllbGRfbmFtZSA8PCAiIGlzIG5vdCBzZXRcIikpOyIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBuaWwiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZpZWxkX3R5cGVfbmFtZShwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSk7Ci0gICAgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOwotICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJyZWFkRmllbGQiKTsKLSAgICBpbnQzMl90IGZpZWxkX2lkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7Ci0KLSAgICBpZiAoZmllbGRfaWQgPCAwKSB7Ci0gICAgICBmaWVsZF9tZXRob2RfcHJlZml4ICs9ICJfIjsKLSAgICAgIGZpZWxkX2lkICo9IC0xOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgICIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9pZAotICAgICAgICA8PCAiKGlwcm90IHRocmlmdC5UUHJvdG9jb2wpIGVycm9yIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCBmYWxzZSwgInAuIik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIG5pbCIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlc19jb3VudHNldGZpZWxkcykgewotICAodm9pZClpc19yZXN1bHQ7Ci0gIHN0cmluZyBuYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBpbmRlbnQob3V0KSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgIiA8PCB3cml0ZV9tZXRob2RfbmFtZV8gPDwgIihvcHJvdCB0aHJpZnQuVFByb3RvY29sKSBlcnJvciB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkgJiYgdXNlc19jb3VudHNldGZpZWxkcykgewotICAgIHN0ZDo6c3RyaW5nIHRzdHJ1Y3RfbmFtZShwdWJsaWNpemUodHN0cnVjdC0+Z2V0X25hbWUoKSkpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgYyA6PSBwLkNvdW50U2V0RmllbGRzIiA8PCB0c3RydWN0X25hbWUgPDwgIigpOyBjICE9IDEgeyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICByZXR1cm4gZm10LkVycm9yZihcIiVUIHdyaXRlIHVuaW9uOiBleGFjdGx5IG9uZSBmaWVsZCBtdXN0IGJlIHNldCAoJWQgc2V0KS5cIiwgcCwgYykiCi0gICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgbmFtZSA8PCAiXCIpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiCi0gICAgICAgICAgICAgICAgICAgICAiXCIlVCB3cml0ZSBzdHJ1Y3QgYmVnaW4gZXJyb3I6IFwiLCBwKSwgZXJyKSB9IiA8PCBlbmRsOwotCi0gIHN0cmluZyBmaWVsZF9uYW1lOwotICBzdHJpbmcgZXNjYXBlX2ZpZWxkX25hbWU7Ci0gIC8vIHRfY29uc3RfdmFsdWUqIGZpZWxkX2RlZmF1bHRfdmFsdWU7Ci0gIHRfZmllbGQ6OmVfcmVxIGZpZWxkX3JlcXVpcmVkOwotICBpbnQzMl90IGZpZWxkX2lkID0gLTE7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZmllbGRfbWV0aG9kX3ByZWZpeCgid3JpdGVGaWVsZCIpOwotICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZXNjYXBlX2ZpZWxkX25hbWUgPSBlc2NhcGVfc3RyaW5nKGZpZWxkX25hbWUpOwotICAgIGZpZWxkX2lkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7Ci0KLSAgICBpZiAoZmllbGRfaWQgPCAwKSB7Ci0gICAgICBmaWVsZF9tZXRob2RfcHJlZml4ICs9ICJfIjsKLSAgICAgIGZpZWxkX2lkICo9IC0xOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IHAuIiA8PCBmaWVsZF9tZXRob2RfcHJlZml4IDw8IGZpZWxkX2lkCi0gICAgICAgIDw8ICIob3Byb3QpOyBlcnIgIT0gbmlsIHsgcmV0dXJuIGVyciB9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJ3cml0ZSBmaWVsZCBzdG9wIGVycm9yOiBcIiwgZXJyKSB9IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcIndyaXRlIHN0cnVjdCBzdG9wIGVycm9yOiBcIiwgZXJyKSB9IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBuaWwiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIndyaXRlRmllbGQiKTsKLSAgICBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZXNjYXBlX2ZpZWxkX25hbWUgPSBlc2NhcGVfc3RyaW5nKGZpZWxkX25hbWUpOwotICAgIC8vIGZpZWxkX2RlZmF1bHRfdmFsdWUgPSAoKmZfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGZpZWxkX3JlcXVpcmVkID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCk7Ci0KLSAgICBpZiAoZmllbGRfaWQgPCAwKSB7Ci0gICAgICBmaWVsZF9tZXRob2RfcHJlZml4ICs9ICJfIjsKLSAgICAgIGZpZWxkX2lkICo9IC0xOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgIiA8PCBmaWVsZF9tZXRob2RfcHJlZml4IDw8IGZpZWxkX2lkCi0gICAgICAgIDw8ICIob3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKGVyciBlcnJvcikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGlmIChmaWVsZF9yZXF1aXJlZCA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIHAuSXNTZXQiIDw8IHB1YmxpY2l6ZShmaWVsZF9uYW1lKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbihcIiIgPDwgZXNjYXBlX2ZpZWxkX25hbWUgPDwgIlwiLCAiCi0gICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwgZmllbGRfaWQgPDwgIik7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAiCi0gICAgICAgIDw8IGZpZWxkX2lkIDw8ICI6IiA8PCBlc2NhcGVfZmllbGRfbmFtZSA8PCAiOiBcIiwgcCksIGVycikgfSIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInAuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgIgotICAgICAgICA8PCBmaWVsZF9pZCA8PCAiOiIgPDwgZXNjYXBlX2ZpZWxkX25hbWUgPDwgIjogXCIsIHApLCBlcnIpIH0iIDw8IGVuZGw7Ci0KLSAgICBpZiAoZmllbGRfcmVxdWlyZWQgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZXJyIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyB0ZXN0X3N1ZmZpeCgiX3Rlc3QiKTsKLSAgc3RyaW5nIGZpbGVuYW1lID0gbG93ZXJjYXNlKHNlcnZpY2VfbmFtZV8pOwotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWU7Ci0KLSAgc2l6ZV90IGZuYW1lX2xlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOwotICBzaXplX3Qgc3VmZml4X2xlbiA9IHRlc3Rfc3VmZml4Lmxlbmd0aCgpOwotCi0gIGlmICgoZm5hbWVfbGVuID49IHN1ZmZpeF9sZW4pCi0gICAgICAmJiAoZmlsZW5hbWUuY29tcGFyZShmbmFtZV9sZW4gLSBzdWZmaXhfbGVuLCBzdWZmaXhfbGVuLCB0ZXN0X3N1ZmZpeCkgPT0gMCkpIHsKLSAgICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGZpbGVuYW1lICsgIl8uZ28iOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZmlsZW5hbWUgKyAiLmdvIjsKLSAgfQotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIGZfc2VydmljZV8gPDwgZ29fYXV0b2dlbl9jb21tZW50KCkgPDwgZ29fcGFja2FnZSgpIDw8IHJlbmRlcl9pbmNsdWRlcygpOwotCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRzZXJ2aWNlKTsKLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotICBmb3JtYXRfZ29fb3V0cHV0KGZfc2VydmljZV9uYW1lKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZl9zZXJ2aWNlXyA8PCAiLy8gSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gICAgc3VjY2Vzcy5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOwotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gICAgfQotCi0gICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIGYgPSAqZl9pdGVyOwotICAgICAgZi0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoZik7Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOwotICBzdHJpbmcgc2VydmljZU5hbWUocHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7Ci0gIHN0cmluZyBpbnRlcmZhY2VOYW1lID0gc2VydmljZU5hbWU7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBzaXplX3QgaW5kZXggPSBleHRlbmRzLnJmaW5kKCIuIik7Ci0KLSAgICBpZiAoaW5kZXggIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBleHRlbmRzX2lmID0gIlxuIiArIGluZGVudCgpICsgIiAgIiArIGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkKLSAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiXG4iICsgaW5kZW50KCkgKyBwdWJsaWNpemUoZXh0ZW5kcykgKyAiXG4iOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBpbnRlcmZhY2VOYW1lIDw8ICIgaW50ZXJmYWNlIHsiIDw8IGV4dGVuZHNfaWY7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0KLSAgaWYgKCFmdW5jdGlvbnMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfc2VydmljZV8sICgqZl9pdGVyKSk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyLCAiIiwgdHJ1ZSkgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2ZpZWxkID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnRfbmV3ID0gIiI7Ci0gIHN0cmluZyBzZXJ2aWNlTmFtZShwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIHNpemVfdCBpbmRleCA9IGV4dGVuZHMucmZpbmQoIi4iKTsKLQotICAgIGlmIChpbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKQotICAgICAgICAgICAgICAgICAgICAgICArICJDbGllbnQiOwotICAgICAgZXh0ZW5kc19jbGllbnRfbmV3ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArICJOZXciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJDbGllbnQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBleHRlbmRzX2NsaWVudCA9IHB1YmxpY2l6ZShleHRlbmRzKSArICJDbGllbnQiOwotICAgICAgZXh0ZW5kc19jbGllbnRfbmV3ID0gIk5ldyIgKyBleHRlbmRzX2NsaWVudDsKLSAgICB9Ci0gIH0KLQotICBleHRlbmRzX2ZpZWxkID0gZXh0ZW5kc19jbGllbnQuc3Vic3RyKGV4dGVuZHNfY2xpZW50LmZpbmQoIi4iKSArIDEpOwotCi0gIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IHN0cnVjdCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoIWV4dGVuZHNfY2xpZW50LmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIqIiA8PCBleHRlbmRzX2NsaWVudCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRyYW5zcG9ydCB0aHJpZnQuVFRyYW5zcG9ydCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiSW5wdXRQcm90b2NvbCB0aHJpZnQuVFByb3RvY29sIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIk91dHB1dFByb3RvY29sIHRocmlmdC5UUHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiU2VxSWQgaW50MzIiIDw8IGVuZGw7Ci0gICAgLypmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXFzIG1hcFtpbnQzMl1EZWZlcnJlZCIgPDwgZW5kbCovOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUKLSAgICAgICAgICAgICA8PCAiQ2xpZW50RmFjdG9yeSh0IHRocmlmdC5UVHJhbnNwb3J0LCBmIHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5KSAqIiA8PCBzZXJ2aWNlTmFtZQotICAgICAgICAgICAgIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiAmIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IjsKLQotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgInsiIDw8IGV4dGVuZHNfZmllbGQgPDwgIjogIiA8PCBleHRlbmRzX2NsaWVudF9uZXcgPDwgIkZhY3RvcnkodCwgZil9IjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8ICJ7VHJhbnNwb3J0OiB0LCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQcm90b2NvbEZhY3Rvcnk6IGYsIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIklucHV0UHJvdG9jb2w6IGYuR2V0UHJvdG9jb2wodCksIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIk91dHB1dFByb3RvY29sOiBmLkdldFByb3RvY29sKHQpLCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJTZXFJZDogMCwiIDw8IGVuZGw7Ci0gICAgLypmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJSZXFzOiBtYWtlKG1hcFtpbnQzMl1EZWZlcnJlZCkiIDw8IGVuZGwqLzsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8KLSAgICAgIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUKLSAgICAgIDw8ICJDbGllbnRQcm90b2NvbCh0IHRocmlmdC5UVHJhbnNwb3J0LCBpcHJvdCB0aHJpZnQuVFByb3RvY29sLCBvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAqIgotICAgICAgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQiOwotCi0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAieyIgPDwgZXh0ZW5kc19maWVsZCA8PCAiOiAiIDw8IGV4dGVuZHNfY2xpZW50X25ldyA8PCAiUHJvdG9jb2wodCwgaXByb3QsIG9wcm90KX0iCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgIntUcmFuc3BvcnQ6IHQsIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlByb3RvY29sRmFjdG9yeTogbmlsLCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJJbnB1dFByb3RvY29sOiBpcHJvdCwiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiT3V0cHV0UHJvdG9jb2w6IG9wcm90LCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJTZXFJZDogMCwiIDw8IGVuZGw7Ci0gICAgLypmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJSZXFzOiBtYWtlKG1hcFtpbnQzMl1pbnRlcmZhY2V7fSkiIDw8IGVuZGwqLzsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl9zZXJ2aWNlXywgKCpmX2l0ZXIpKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQpICIKLSAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyLCAiIiwgdHJ1ZSkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIC8qCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInAuU2VxSWQgKz0gMSIgPDwgZW5kbDsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImQgOj0gZGVmZXIuRGVmZXJyZWQoKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicC5SZXFzW3AuU2VxSWRdID0gZCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgKi8KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSBwLnNlbmQiIDw8IGZ1bm5hbWUgPDwgIigiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8IHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCAiKTsgZXJyICE9IG5pbCB7IHJldHVybiB9IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC5yZWN2IiA8PCBmdW5uYW1lIDw8ICIoKSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCkgc2VuZCIKLSAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiKGVyciBlcnJvcikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiLCB0cnVlKTsKLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QgOj0gcC5PdXRwdXRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBvcHJvdCA9PSBuaWwgeyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90ID0gcC5Qcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wocC5UcmFuc3BvcnQpIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcC5PdXRwdXRQcm90b2NvbCA9IG9wcm90IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicC5TZXFJZCsrIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIGVyciA9IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgIDw8ICJcIiwgIiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJ0aHJpZnQuT05FV0FZIiA6ICJ0aHJpZnQuQ0FMTCIpCi0gICAgICAgICAgICAgICA8PCAiLCBwLlNlcUlkKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzIDo9ICIgPDwgYXJnc25hbWUgPDwgInsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBwdWJsaWNpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiCi0gICAgICAgICAgICAgICAgIDw8IHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyID0gYXJncy4iIDw8IHdyaXRlX21ldGhvZF9uYW1lXyA8PCAiKG9wcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gb3Byb3QuRmx1c2goKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIsIHRydWUpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQpIHJlY3YiCi0gICAgICAgICAgICAgICAgIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoKSAoIjsKLQotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ2YWx1ZSAiIDw8IHR5cGVfdG9fZ29fdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIsICI7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgImVyciBlcnJvcikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgotICAgICAgc3RyaW5nIGVycm9yKHRtcCgiZXJyb3IiKSk7Ci0gICAgICBzdHJpbmcgZXJyb3IyKHRtcCgiZXJyb3IiKSk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdCA6PSBwLklucHV0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBpcHJvdCA9PSBuaWwgeyIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QgPSBwLlByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChwLlRyYW5zcG9ydCkiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHAuSW5wdXRQcm90b2NvbCA9IGlwcm90IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1ldGhvZCwgbVR5cGVJZCwgc2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBtZXRob2QgIT0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgeyIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbigiCi0gICAgICAgICAgICAgICAgIDw8ICJ0aHJpZnQuV1JPTkdfTUVUSE9EX05BTUUsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHdyb25nIG1ldGhvZCBuYW1lXCIpIiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgcC5TZXFJZCAhPSBzZXFJZCB7IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKCIKLSAgICAgICAgICAgICAgICAgPDwgInRocmlmdC5CQURfU0VRVUVOQ0VfSUQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IG91dCBvZiBzZXF1ZW5jZSByZXNwb25zZVwiKSIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIG1UeXBlSWQgPT0gdGhyaWZ0LkVYQ0VQVElPTiB7IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGVycm9yCi0gICAgICAgICAgICAgICAgIDw8ICIgOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT04sICIKLSAgICAgICAgICAgICAgICAgICAgIlwiVW5rbm93biBFeGNlcHRpb25cIikiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHZhciAiIDw8IGVycm9yMiA8PCAiIGVycm9yIiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGVycm9yMiA8PCAiLCBlcnIgPSAiIDw8IGVycm9yIDw8ICIuIiA8PCByZWFkX21ldGhvZF9uYW1lXyA8PCAiKGlwcm90KSIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyID0gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gIiA8PCBlcnJvcjIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIG1UeXBlSWQgIT0gdGhyaWZ0LlJFUExZIHsiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24oIgotICAgICAgICAgICAgICAgICA8PCAidGhyaWZ0LklOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogaW52YWxpZCBtZXNzYWdlIHR5cGVcIikiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgOj0gIiA8PCByZXN1bHRuYW1lIDw8ICJ7fSIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIGVyciA9IHJlc3VsdC4iIDw8IHJlYWRfbWV0aG9kX25hbWVfIDw8ICIoaXByb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHVibmFtZSA9IHB1YmxpY2l6ZSgoKnhfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIHJlc3VsdC4iIDw8IHB1Ym5hbWUgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSByZXN1bHQuIiA8PCBwdWJuYW1lIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0KLSAgICAgICAgaWYgKCh4X2l0ZXIgKyAxKSAhPSB4Y2VwdGlvbnMuZW5kKCkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgZWxzZSAiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFsdWUgPSByZXN1bHQuR2V0U3VjY2VzcygpIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY29tbWFuZCBsaW5lIHRvb2wgZm9yIG1ha2luZyByZW1vdGUgcmVxdWVzdHMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSByZW1vdGUgZm9yLgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdF9zZXJ2aWNlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLQotICAvLyBjb2xsZWN0IGluaGVyaXRlZCBmdW5jdGlvbnMKLSAgd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBwX2Z1bmN0aW9ucyA9IHBhcmVudC0+Z2V0X2Z1bmN0aW9ucygpOwotICAgIGZ1bmN0aW9ucy5pbnNlcnQoZnVuY3Rpb25zLmVuZCgpLCBwX2Z1bmN0aW9ucy5iZWdpbigpLCBwX2Z1bmN0aW9ucy5lbmQoKSk7Ci0gICAgcGFyZW50ID0gcGFyZW50LT5nZXRfZXh0ZW5kcygpOwotICB9Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBzdHJpbmcgZl9yZW1vdGVfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHVuZGVyc2NvcmUoc2VydmljZV9uYW1lXykgKyAiLXJlbW90ZS8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyB1bmRlcnNjb3JlKHNlcnZpY2VfbmFtZV8pICsgIi1yZW1vdGUuZ28iOwotICBvZnN0cmVhbSBmX3JlbW90ZTsKLSAgZl9yZW1vdGUub3BlbihmX3JlbW90ZV9uYW1lLmNfc3RyKCkpOwotICBzdHJpbmcgc2VydmljZV9tb2R1bGUgPSBnZXRfcmVhbF9nb19tb2R1bGUocHJvZ3JhbV8pOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0KLSAgd2hpbGUgKChsb2MgPSBzZXJ2aWNlX21vZHVsZS5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHNlcnZpY2VfbW9kdWxlLnJlcGxhY2UobG9jLCAxLCAxLCAnLycpOwotICB9Ci0gIGlmICghZ2VuX3BhY2thZ2VfcHJlZml4Xy5lbXB0eSgpKSB7Ci0gICAgc2VydmljZV9tb2R1bGUgPSBnZW5fcGFja2FnZV9wcmVmaXhfICsgc2VydmljZV9tb2R1bGU7Ci0gIH0KLQotICBmX3JlbW90ZSA8PCBnb19hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInBhY2thZ2UgbWFpbiIgPDwgZW5kbCA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaW1wb3J0ICgiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwiZmxhZ1wiIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcImZtdFwiIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIm1hdGhcIiIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJuZXRcIiIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJuZXQvdXJsXCIiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwib3NcIiIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJzdHJjb252XCIiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwic3RyaW5nc1wiIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIiIgKyBnZW5fdGhyaWZ0X2ltcG9ydF8gKyAiXCIiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwiIiA8PCBzZXJ2aWNlX21vZHVsZSA8PCAiXCIiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyBVc2FnZSgpIHsiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiVXNhZ2Ugb2YgXCIsIG9zLkFyZ3NbMF0sIFwiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlstaCBob3N0OnBvcnRdIFstdSB1cmxdIFstZltyYW1lZF1dIGZ1bmN0aW9uIFthcmcxIFthcmcyLi4uXV06XCIpIgotICAgICAgICAgICA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbGFnLlByaW50RGVmYXVsdHMoKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJcXG5GdW5jdGlvbnM6XCIpIiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9yZW1vdGUgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCIgICIgPDwgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIgotICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICIsICI7Ci0gICAgICB9Ci0KLSAgICAgIGZfcmVtb3RlIDw8IGFyZ3NbaV0tPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiIDw8IGFyZ3NbaV0tPmdldF9uYW1lKCk7Ci0gICAgfQotCi0gICAgZl9yZW1vdGUgPDwgIilcIikiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgwKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmdW5jIG1haW4oKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuVXNhZ2UgPSBVc2FnZSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBob3N0IHN0cmluZyIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBwb3J0IGludCIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBwcm90b2NvbCBzdHJpbmciIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgdXJsU3RyaW5nIHN0cmluZyIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBmcmFtZWQgYm9vbCIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciB1c2VIdHRwIGJvb2wiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcGFyc2VkVXJsIHVybC5VUkwiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgdHJhbnMgdGhyaWZ0LlRUcmFuc3BvcnQiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfID0gc3RyY29udi5BdG9pIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiXyA9IG1hdGguQWJzIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5Vc2FnZSA9IFVzYWdlIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJmhvc3QsIFwiaFwiLCBcImxvY2FsaG9zdFwiLCBcIlNwZWNpZnkgaG9zdCBhbmQgcG9ydFwiKSIKLSAgICAgICAgICAgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuSW50VmFyKCZwb3J0LCBcInBcIiwgOTA5MCwgXCJTcGVjaWZ5IHBvcnRcIikiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlN0cmluZ1ZhcigmcHJvdG9jb2wsIFwiUFwiLCBcImJpbmFyeVwiLCBcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwZWNpZnkgdGhlIHByb3RvY29sIChiaW5hcnksIGNvbXBhY3QsIHNpbXBsZWpzb24sIGpzb24pXCIpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJnVybFN0cmluZywgXCJ1XCIsIFwiXCIsIFwiU3BlY2lmeSB0aGUgdXJsXCIpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5Cb29sVmFyKCZmcmFtZWQsIFwiZnJhbWVkXCIsIGZhbHNlLCBcIlVzZSBmcmFtZWQgdHJhbnNwb3J0XCIpIgotICAgICAgICAgICA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5Cb29sVmFyKCZ1c2VIdHRwLCBcImh0dHBcIiwgZmFsc2UsIFwiVXNlIGh0dHBcIikiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlBhcnNlKCkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBsZW4odXJsU3RyaW5nKSA+IDAgeyIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcGFyc2VkVXJsLCBlcnIgOj0gdXJsLlBhcnNlKHVybFN0cmluZykiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkVycm9yIHBhcnNpbmcgVVJMOiBcIiwgZXJyKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBmbGFnLlVzYWdlKCkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGhvc3QgPSBwYXJzZWRVcmwuSG9zdCIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgdXNlSHR0cCA9IGxlbihwYXJzZWRVcmwuU2NoZW1lKSA8PSAwIHx8IHBhcnNlZFVybC5TY2hlbWUgPT0gXCJodHRwXCIiCi0gICAgICAgICAgIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgdXNlSHR0cCB7IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBfLCBlcnIgOj0gdXJsLlBhcnNlKGZtdC5TcHJpbnQoXCJodHRwOi8vXCIsIGhvc3QsIFwiOlwiLCBwb3J0KSkiCi0gICAgICAgICAgIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkVycm9yIHBhcnNpbmcgVVJMOiBcIiwgZXJyKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBmbGFnLlVzYWdlKCkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY21kIDo9IGZsYWcuQXJnKDApIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIGVyciBlcnJvciIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIHVzZUh0dHAgeyIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUSHR0cENsaWVudChwYXJzZWRVcmwuU3RyaW5nKCkpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHBvcnRTdHIgOj0gZm10LlNwcmludChwb3J0KSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgc3RyaW5ncy5Db250YWlucyhob3N0LCBcIjpcIikgeyIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgIGhvc3QsIHBvcnRTdHIsIGVyciA9IG5ldC5TcGxpdEhvc3RQb3J0KGhvc3QpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcImVycm9yIHdpdGggaG9zdDpcIiwgZXJyKSIKLSAgICAgICAgICAgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgIH0iIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VFNvY2tldChuZXQuSm9pbkhvc3RQb3J0KGhvc3QsIHBvcnRTdHIpKSIKLSAgICAgICAgICAgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiZXJyb3IgcmVzb2x2aW5nIGFkZHJlc3M6XCIsIGVycikiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZnJhbWVkIHsiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgdHJhbnMgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFucykiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkVycm9yIGNyZWF0aW5nIHRyYW5zcG9ydFwiLCBlcnIpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDEpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmVyIHRyYW5zLkNsb3NlKCkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHByb3RvY29sIHsiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiY29tcGFjdFwiOiIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcInNpbXBsZWpzb25cIjoiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJqc29uXCI6IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiYmluYXJ5XCIsIFwiXCI6IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZDogXCIsIHByb3RvY29sKSIKLSAgICAgICAgICAgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjbGllbnQgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuTmV3IiA8PCBwdWJsaWNpemUoc2VydmljZV9uYW1lXykKLSAgICAgICAgICAgPDwgIkNsaWVudEZhY3RvcnkodHJhbnMsIHByb3RvY29sRmFjdG9yeSkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gdHJhbnMuT3BlbigpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3Igb3BlbmluZyBzb2NrZXQgdG8gXCIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3QsIFwiOlwiLCBwb3J0LCBcIiBcIiwgZXJyKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggY21kIHsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOwotICAgIHN0cmluZyBmdW5jTmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHN0cmluZyBwdWJOYW1lKHB1YmxpY2l6ZShmdW5jTmFtZSkpOwotICAgIHN0cmluZyBhcmd1bWVudHNOYW1lKHB1YmxpY2l6ZShmdW5jTmFtZSArICJfYXJncyIsIHRydWUpKTsKLSAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcIiIgPDwgZXNjYXBlX3N0cmluZyhmdW5jTmFtZSkgPDwgIlwiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZmxhZy5OQXJnKCkgLSAxICE9ICIgPDwgbnVtX2FyZ3MgPDwgIiB7IiA8PCBlbmRsOwotICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHB1Yk5hbWUpIDw8ICIgcmVxdWlyZXMgIgotICAgICAgICAgICAgIDw8IG51bV9hcmdzIDw8ICIgYXJnc1wiKSIgPDwgZW5kbDsKLSAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbGFnLlVzYWdlKCkiIDw8IGVuZGw7Ci0gICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgewotICAgICAgaW50IGZsYWdBcmcgPSBpICsgMTsKLSAgICAgIHRfdHlwZSogdGhlX3R5cGUoYXJnc1tpXS0+Z2V0X3R5cGUoKSk7Ci0gICAgICB0X3R5cGUqIHRoZV90eXBlMihnZXRfdHJ1ZV90eXBlKHRoZV90eXBlKSk7Ci0KLSAgICAgIGlmICh0aGVfdHlwZTItPmlzX2VudW0oKSkgewotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsIGVyciA6PSAoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSkpIgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiIHJldHVybiIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLiIKLSAgICAgICAgICAgICAgICAgPDwgcHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSA8PCAiKHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAodGhlX3R5cGUyLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIGUgPSAoKHRfYmFzZV90eXBlKil0aGVfdHlwZTIpLT5nZXRfYmFzZSgpOwotICAgICAgICBzdHJpbmcgZXJyKHRtcCgiZXJyIikpOwotCi0gICAgICAgIHN3aXRjaCAoZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXRoZV90eXBlMiktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBbXWJ5dGUoZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSA9PSBcInRydWVcIiIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsICIgPDwgZXJyIDw8ICIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiCi0gICAgICAgICAgICAgICAgICAgPDwgZmxhZ0FyZyA8PCAiKSkpIiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGJ5dGUodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIKLSAgICAgICAgICAgICAgICAgICA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gYnl0ZSh0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIgotICAgICAgICAgICAgICAgICAgIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBpbnQzMih0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIsICIgPDwgZXJyCi0gICAgICAgICAgICAgICAgICAgPDwgIiA6PSAoc3RyY29udi5QYXJzZUludChmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIiksIDEwLCA2NCkpIiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiLCAiIDw8IGVycgotICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gKHN0cmNvbnYuUGFyc2VGbG9hdChmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIiksIDY0KSkiIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdygiSW52YWxpZCBiYXNlIHR5cGUgaW4gZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZfcmVtb3RlIDw8IHB1YmxpY2l6ZShhcmdzW2ldLT5nZXRfbmFtZSgpKSA8PCAiKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwKLSAgICAgICAgLy8gIikpKSI7Ci0gICAgICB9IGVsc2UgaWYgKHRoZV90eXBlMi0+aXNfc3RydWN0KCkpIHsKLSAgICAgICAgc3RyaW5nIGFyZyh0bXAoImFyZyIpKTsKLSAgICAgICAgc3RyaW5nIG1iVHJhbnModG1wKCJtYlRyYW5zIikpOwotICAgICAgICBzdHJpbmcgZXJyMSh0bXAoImVyciIpKTsKLSAgICAgICAgc3RyaW5nIGZhY3RvcnkodG1wKCJmYWN0b3J5IikpOwotICAgICAgICBzdHJpbmcganNQcm90KHRtcCgianNQcm90IikpOwotICAgICAgICBzdHJpbmcgZXJyMih0bXAoImVyciIpKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgdHN0cnVjdF9uYW1lKHB1YmxpY2l6ZSh0aGVfdHlwZS0+Z2V0X25hbWUoKSkpOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBhcmcgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IG1iVHJhbnMgPDwgIiA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlckxlbihsZW4oIiA8PCBhcmcgPDwgIikpIgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmZXIgIiA8PCBtYlRyYW5zIDw8ICIuQ2xvc2UoKSIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIl8sICIgPDwgZXJyMSA8PCAiIDo9ICIgPDwgbWJUcmFucyA8PCAiLldyaXRlU3RyaW5nKCIgPDwgYXJnIDw8ICIpIgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIxIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGZhY3RvcnkgPDwgIiA6PSB0aHJpZnQuTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwganNQcm90IDw8ICIgOj0gIiA8PCBmYWN0b3J5IDw8ICIuR2V0UHJvdG9jb2woIiA8PCBtYlRyYW5zIDw8ICIpIgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi5OZXciIDw8IHRzdHJ1Y3RfbmFtZQotICAgICAgICAgICAgICAgICA8PCAiKCkiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVycjIgPDwgIiA6PSBhcmd2YWx1ZSIgPDwgaSA8PCAiLiIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgICIoIiA8PCBqc1Byb3QgPDwgIikiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAodGhlX3R5cGUyLT5pc19jb250YWluZXIoKSB8fCB0aGVfdHlwZTItPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgc3RyaW5nIGFyZyh0bXAoImFyZyIpKTsKLSAgICAgICAgc3RyaW5nIG1iVHJhbnModG1wKCJtYlRyYW5zIikpOwotICAgICAgICBzdHJpbmcgZXJyMSh0bXAoImVyciIpKTsKLSAgICAgICAgc3RyaW5nIGZhY3RvcnkodG1wKCJmYWN0b3J5IikpOwotICAgICAgICBzdHJpbmcganNQcm90KHRtcCgianNQcm90IikpOwotICAgICAgICBzdHJpbmcgZXJyMih0bXAoImVyciIpKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgYXJnTmFtZShwdWJsaWNpemUoYXJnc1tpXS0+Z2V0X25hbWUoKSkpOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBhcmcgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IG1iVHJhbnMgPDwgIiA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlckxlbihsZW4oIiA8PCBhcmcgPDwgIikpIgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmZXIgIiA8PCBtYlRyYW5zIDw8ICIuQ2xvc2UoKSIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIl8sICIgPDwgZXJyMSA8PCAiIDo9ICIgPDwgbWJUcmFucyA8PCAiLldyaXRlU3RyaW5nKCIgPDwgYXJnIDw8ICIpIgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIxIDw8ICIgIT0gbmlsIHsgIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBmYWN0b3J5IDw8ICIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGpzUHJvdCA8PCAiIDo9ICIgPDwgZmFjdG9yeSA8PCAiLkdldFByb3RvY29sKCIgPDwgbWJUcmFucyA8PCAiKSIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNvbnRhaW5lclN0cnVjdCIgPDwgaSA8PCAiIDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLk5ldyIKLSAgICAgICAgICAgICAgICAgPDwgYXJndW1lbnRzTmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVycjIgPDwgIiA6PSBjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIi5SZWFkRmllbGQiIDw8IChpICsgMSkgPDwgIigiCi0gICAgICAgICAgICAgICAgIDw8IGpzUHJvdCA8PCAiKSIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMiA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIi4iIDw8IGFyZ05hbWUKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93KCJJbnZhbGlkIGFyZ3VtZW50IHR5cGUgaW4gZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUiKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHRoZV90eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhbHVlIiA8PCBpIDw8ICIgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuIgotICAgICAgICAgICAgICAgICA8PCBwdWJsaWNpemUodGhlX3R5cGUtPmdldF9uYW1lKCkpIDw8ICIoYXJndmFsdWUiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFsdWUiIDw8IGkgPDwgIiA6PSBhcmd2YWx1ZSIgPDwgaSA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbXQuUHJpbnQoY2xpZW50LiIgPDwgcHViTmFtZSA8PCAiKCI7Ci0gICAgYm9vbCBhcmdGaXJzdCA9IHRydWU7Ci0KLSAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgewotICAgICAgaWYgKGFyZ0ZpcnN0KSB7Ci0gICAgICAgIGFyZ0ZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3JlbW90ZSA8PCAiLCAiOwotICAgICAgfQotCi0gICAgICBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICJ2YWx1ZSIgPDwgaTsKLSAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBlID0gKCh0X2Jhc2VfdHlwZSopKGFyZ3NbaV0tPmdldF90eXBlKCkpKS0+Z2V0X2Jhc2UoKTsKLQotICAgICAgICBzd2l0Y2ggKGUpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3coIkludmFsaWQgYmFzZSB0eXBlIGluIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmX3JlbW90ZSA8PCBwdWJsaWNpemUoYXJnc1tpXS0+Z2V0X25hbWUoKSkgPDwgIihzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8Ci0gICAgICAgIC8vICIpKSkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOwotICAgICAgfQotICAgIH0KLQotICAgIGZfcmVtb3RlIDw8ICIpKSIgPDwgZW5kbDsKLSAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZm10LlByaW50KFwiXFxuXCIpIiA8PCBlbmRsOwotICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJicmVhayIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJcIjoiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiSW52YWxpZCBmdW5jdGlvbiBcIiwgY21kKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9yZW1vdGUuY2xvc2UoKTsKLSAgZm9ybWF0X2dvX291dHB1dChmX3JlbW90ZV9uYW1lKTsKLSNpZm5kZWYgX01TQ19WRVIKLSAgLy8gTWFrZSBmaWxlIGV4ZWN1dGFibGUsIGxvdmUgdGhhdCBiaXR3aXNlIE9SIGFjdGlvbgotICBjaG1vZChmX3JlbW90ZV9uYW1lLmNfc3RyKCksCi0gICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JWFVTUgotI2lmbmRlZiBfV0lOMzIKLSAgICAgICAgfCBTX0lSR1JQIHwgU19JWEdSUCB8IFNfSVJPVEggfCBTX0lYT1RICi0jZW5kaWYKLSAgICAgICAgKTsKLSNlbmRpZgotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPSAiIjsKLSAgc3RyaW5nIHNlcnZpY2VOYW1lKHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgc2l6ZV90IGluZGV4ID0gZXh0ZW5kcy5yZmluZCgiLiIpOwotCi0gICAgaWYgKGluZGV4ICE9IHN0cmluZzo6bnBvcykgewotICAgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpICsgcHVibGljaXplKGV4dGVuZHMuc3Vic3RyKGluZGV4ICsgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsgIlByb2Nlc3NvciI7Ci0gICAgICBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPSBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpICsgIk5ldyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHVibGljaXplKGV4dGVuZHMuc3Vic3RyKGluZGV4ICsgMSkpICsgIlByb2Nlc3NvciI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gcHVibGljaXplKGV4dGVuZHMpICsgIlByb2Nlc3NvciI7Ci0gICAgICBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPSAiTmV3IiArIGV4dGVuZHNfcHJvY2Vzc29yOwotICAgIH0KLSAgfQotCi0gIHN0cmluZyBwU2VydmljZU5hbWUocHJpdmF0aXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7Ci0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBzdHJpbmcgc2VsZih0bXAoInNlbGYiKSk7Ci0KLSAgaWYgKGV4dGVuZHNfcHJvY2Vzc29yLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciBzdHJ1Y3QgeyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHByb2Nlc3Nvck1hcCBtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBoYW5kbGVyICIgPDwgc2VydmljZU5hbWUgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZQotICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikgQWRkVG9Qcm9jZXNzb3JNYXAoa2V5IHN0cmluZywgcHJvY2Vzc29yIHRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24pIHsiCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcC5wcm9jZXNzb3JNYXBba2V5XSA9IHByb2Nlc3NvciIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZQotICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikgR2V0UHJvY2Vzc29yRnVuY3Rpb24oa2V5IHN0cmluZykgIgotICAgICAgICAgICAgICAgICAgIihwcm9jZXNzb3IgdGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiwgb2sgYm9vbCkgeyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHByb2Nlc3Nvciwgb2sgPSBwLnByb2Nlc3Nvck1hcFtrZXldIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHByb2Nlc3Nvciwgb2siIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUKLSAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpIFByb2Nlc3Nvck1hcCgpIG1hcFtzdHJpbmdddGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiB7IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHAucHJvY2Vzc29yTWFwIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyICIgPDwgc2VydmljZU5hbWUKLSAgICAgICAgICAgICAgIDw8ICIpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IgeyIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGZfc2VydmljZV8KLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIgOj0gJiIgPDwgc2VydmljZU5hbWUKLSAgICAgICAgPDwgIlByb2Nlc3NvcntoYW5kbGVyOmhhbmRsZXIsIHByb2Nlc3Nvck1hcDptYWtlKG1hcFtzdHJpbmdddGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbil9IgotICAgICAgICA8PCBlbmRsOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBlc2NhcGVkRnVuY05hbWUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIucHJvY2Vzc29yTWFwW1wiIiA8PCBlc2NhcGVkRnVuY05hbWUgPDwgIlwiXSA9ICYiCi0gICAgICAgICAgICAgICAgIDw8IHBTZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICA8PCAie2hhbmRsZXI6aGFuZGxlcn0iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgc3RyaW5nIHgodG1wKCJ4IikpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IHNlbGYgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZQotICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikgUHJvY2VzcyhpcHJvdCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHN1Y2Nlc3MgYm9vbCwgZXJyICIKLSAgICAgICAgICAgICAgICAgICJ0aHJpZnQuVEV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIG5hbWUsIF8sIHNlcUlkLCBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IHJldHVybiBmYWxzZSwgZXJyIH0iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBpZiBwcm9jZXNzb3IsIG9rIDo9IHAuR2V0UHJvY2Vzc29yRnVuY3Rpb24obmFtZSk7IG9rIHsiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBwcm9jZXNzb3IuUHJvY2VzcyhzZXFJZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5Ta2lwKHRocmlmdC5TVFJVQ1QpIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgeAotICAgICAgICAgICAgICAgPDwgIiA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5VTktOT1dOX01FVEhPRCwgXCJVbmtub3duIGZ1bmN0aW9uICIKLSAgICAgICAgICAgICAgICAgICJcIiArIG5hbWUpIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdGhyaWZ0LkVYQ0VQVElPTiwgc2VxSWQpIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCB4IDw8ICIuIiA8PCB3cml0ZV9tZXRob2RfbmFtZV8gPDwgIihvcHJvdCkiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2UsICIgPDwgeCA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3Igc3RydWN0IHsiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAqIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyICIgPDwgc2VydmljZU5hbWUKLSAgICAgICAgICAgICAgIDw8ICIpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IgeyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiIDo9ICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3J7IgotICAgICAgICAgICAgICAgPDwgZXh0ZW5kc19wcm9jZXNzb3JfbmV3IDw8ICIoaGFuZGxlcil9IiA8PCBlbmRsOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBlc2NhcGVkRnVuY05hbWUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIuQWRkVG9Qcm9jZXNzb3JNYXAoXCIiIDw8IGVzY2FwZWRGdW5jTmFtZQotICAgICAgICAgICAgICAgICA8PCAiXCIsICYiIDw8IHBTZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICA8PCAie2hhbmRsZXI6aGFuZGxlcn0pIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgc2VsZiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgc3RyaW5nIHByb2Nlc3Nvck5hbWUgPSBwcml2YXRpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlByb2Nlc3NvciIKLSAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotICBzdHJpbmcgYXJnc25hbWUgPSBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIiwgdHJ1ZSk7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IiwgdHJ1ZSk7Ci0gIC8vIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAvLyBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBwcm9jZXNzb3JOYW1lIDw8ICIgc3RydWN0IHsiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgaGFuZGxlciAiIDw8IHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHByb2Nlc3Nvck5hbWUKLSAgICAgICAgICAgICA8PCAiKSBQcm9jZXNzKHNlcUlkIGludDMyLCBpcHJvdCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHN1Y2Nlc3MgYm9vbCwgZXJyICIKLSAgICAgICAgICAgICAgICAidGhyaWZ0LlRFeGNlcHRpb24pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzIDo9ICIgPDwgYXJnc25hbWUgPDwgInt9IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSBhcmdzLiIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgICIoaXByb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgeCA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5QUk9UT0NPTF9FUlJPUiwgZXJyLkVycm9yKCkpIgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgIDw8ICJcIiwgdGhyaWZ0LkVYQ0VQVElPTiwgc2VxSWQpIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgeC4iIDw8IHdyaXRlX21ldGhvZF9uYW1lXyA8PCAiKG9wcm90KSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goKSIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZSwgZXJyIiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0IDo9ICIgPDwgcmVzdWx0bmFtZSA8PCAie30iIDw8IGVuZGw7Ci0gIH0KLSAgYm9vbCBuZWVkX3JlZmVyZW5jZSA9IHR5cGVfbmVlZF9yZWZlcmVuY2UodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgInZhciByZXR2YWwgIiA8PCB0eXBlX3RvX2dvX3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIGVycjIgZXJyb3IiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICI7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dmFsLCAiOwotICAgIH0KLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZl9zZXJ2aWNlXyA8PCAiZXJyMiA9IHAuaGFuZGxlci4iIDw8IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgcHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8ICIpOyBlcnIyICE9IG5pbCB7IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhfZmllbGRzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKLSAgaWYgKCF4X2ZpZWxkcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHYgOj0gZXJyMi4odHlwZSkgeyIgPDwgZW5kbDsKLQotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhmX2l0ZXI7Ci0KLSAgICBmb3IgKHhmX2l0ZXIgPSB4X2ZpZWxkcy5iZWdpbigpOyB4Zl9pdGVyICE9IHhfZmllbGRzLmVuZCgpOyArK3hmX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgY2FzZSAiIDw8IHR5cGVfdG9fZ29fdHlwZSgoKCp4Zl9pdGVyKS0+Z2V0X3R5cGUoKSkpIDw8ICI6IgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHVibGljaXplKCgqeGZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSB2IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHggOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuSU5URVJOQUxfRVJST1IsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgIDw8ICI6IFwiICsgZXJyMi5FcnJvcigpKSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgIDw8ICJcIiwgdGhyaWZ0LkVYQ0VQVElPTiwgc2VxSWQpIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgeC4iIDw8IHdyaXRlX21ldGhvZF9uYW1lXyA8PCAiKG9wcm90KSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goKSIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWUsIGVycjIiIDw8IGVuZGw7Ci0KLSAgaWYgKCF4X2ZpZWxkcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOyAvLyBjbG9zZXMgZXJyMiAhPSBuaWwKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgZWxzZSB7IiA8PCBlbmRsOyAvLyBtYWtlIHN1cmUgd2Ugc2V0IFN1Y2Nlc3MgcmV0dmFsIG9ubHkgb24gc3VjY2VzcwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7Ci0gICAgICBpZiAobmVlZF9yZWZlcmVuY2UpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiJiI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJyZXR2YWwiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIyID0gb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiCi0gICAgICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIlwiLCB0aHJpZnQuUkVQTFksIHNlcUlkKTsgZXJyMiAhPSBuaWwgeyIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IHJlc3VsdC4iIDw8IHdyaXRlX21ldGhvZF9uYW1lXyA8PCAiKG9wcm90KTsgZXJyID09IG5pbCAmJiBlcnIyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIGVycjIgPSBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsgZXJyID09IG5pbCAmJiBlcnIyICE9IG5pbCB7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIyID0gb3Byb3QuRmx1c2goKTsgZXJyID09IG5pbCAmJiBlcnIyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlLCBlcnIiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlLCBuaWwiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29lcmNlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lcl92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX3RydWVfdHlwZSkgewotICAodm9pZClpbmNsYXNzOwotICAodm9pZCljb2VyY2VEYXRhOwotICB0X3R5cGUqIG9yaWdfdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShvcmlnX3R5cGUpOwotICBzdHJpbmcgbmFtZShwcmVmaXggKyBwdWJsaWNpemUodGZpZWxkLT5nZXRfbmFtZSgpKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19wb2ludGVyX2ZpZWxkKHRmaWVsZCwgaW5fY29udGFpbmVyX3ZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCBvcmlnX3R5cGUsIGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSwgZGVjbGFyZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBpZiAoZGVjbGFyZSkgewotICAgICAgdF90eXBlKiBhY3R1YWxfdHlwZSA9IHVzZV90cnVlX3R5cGUgPyB0ZmllbGQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0ZmllbGQtPmdldF90eXBlKCk7Ci0KLSAgICAgIHN0cmluZyB0eXBlX25hbWUgPSBpbmtleSA/IHR5cGVfdG9fZ29fa2V5X3R5cGUoYWN0dWFsX3R5cGUpIDogdHlwZV90b19nb190eXBlKGFjdHVhbF90eXBlKTsKLQotICAgICAgb3V0IDw8ICJ2YXIgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiAiIDw8IHR5cGVfbmFtZSA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJpZiB2LCBlcnIgOj0gaXByb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpICYmICFpbmtleSkgewotICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKSI7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCkiOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCkiOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAiUmVhZEkxNigpIjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCkiOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAiUmVhZERvdWJsZSgpIjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gR28gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICI7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBmaWVsZCAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpCi0gICAgICAgIDw8ICI6IFwiLCBlcnIpIiA8PCBlbmRsOwotCi0gICAgb3V0IDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBzdHJpbmcgd3JhcDsKLQotICAgIGlmICh0eXBlLT5pc19lbnVtKCkgfHwgKG9yaWdfdHlwZS0+aXNfdHlwZWRlZigpICYmICF1c2VfdHJ1ZV90eXBlKSkgewotICAgICAgd3JhcCA9IHB1YmxpY2l6ZSh0eXBlX25hbWUob3JpZ190eXBlKSk7Ci0gICAgfSBlbHNlIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFKSB7Ci0gICAgICB3cmFwID0gImludDgiOwotICAgIH0KLQotICAgIHN0cmluZyBtYXliZV9hZGRyZXNzID0gKGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSA/ICImIiA6ICIiKTsKLSAgICBpZiAod3JhcCA9PSAiIikgewotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCBtYXliZV9hZGRyZXNzIDw8ICJ2IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGVtcCA6PSAiIDw8IHdyYXAgPDwgIih2KSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgbWF5YmVfYWRkcmVzcyA8PCAidGVtcCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAnIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiJyBmb3IgZmllbGQgJyIKLSAgICAgICAgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiJyI7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlcShkZWNsYXJlID8gIiA6PSAiIDogIiA9ICIpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIik7Ci0gIGdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSAiIDw8IHByZWZpeCA8PCAiLiIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgICIoaXByb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIGVycm9yIHJlYWRpbmcgc3RydWN0OiBcIiwgIgotICAgICAgPDwgcHJlZml4IDw8ICIpLCBlcnIpIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKLSAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogb3JpZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZShvcmlnX3R5cGUpOwotICBzdHJpbmcgZXEoIiA9ICIpOwotCi0gIGlmIChkZWNsYXJlKSB7Ci0gICAgZXEgPSAiIDo9ICI7Ci0gIH0KLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXywgXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRNYXBCZWdpbigpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgbWFwIGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0TWFwIDo9IG1ha2UoIiA8PCB0eXBlX3RvX2dvX3R5cGUob3JpZ190eXBlKSA8PCAiLCBzaXplKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8ICIgIiA8PCAocG9pbnRlcl9maWVsZCA/ICImIiA6ICIiKSA8PCAidE1hcCIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3NldCogdCA9ICh0X3NldCopdHR5cGU7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZFNldEJlZ2luKCkiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBzZXQgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRTZXQgOj0gbWFrZShtYXBbIgotICAgICAgICA8PCB0eXBlX3RvX2dvX2tleV90eXBlKHQtPmdldF9lbGVtX3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpKSA8PCAiXWJvb2wsIHNpemUpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgIiAiIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpIDw8ICJ0U2V0IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBsaXN0IGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0U2xpY2UgOj0gbWFrZSgiIDw8IHR5cGVfdG9fZ29fdHlwZShvcmlnX3R5cGUpIDw8ICIsIDAsIHNpemUpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgIiAiIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpIDw8ICJ0U2xpY2UiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgJyIgKyB0dHlwZS0+Z2V0X25hbWUoKSArICInIGZvciBwcmVmaXggJyIKLSAgICAgICAgKyBwcmVmaXggKyAiJyI7Ci0gIH0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkgKysgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKHBvaW50ZXJfZmllbGQpIHsKLSAgICBwcmVmaXggPSAiKCoiICsgcHJlZml4ICsgIikiOwotICB9Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGRlY2xhcmUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBkZWNsYXJlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgZGVjbGFyZSwgcHJlZml4KTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRNYXBFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgbWFwIGVuZDogXCIsIGVycikiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRTZXRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgc2V0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBsaXN0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZClkZWNsYXJlOwotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0gIGZrZXkuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKLSAgZnZhbC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBzZXQgZWxlbWVudAotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKWRlY2xhcmU7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0gIGZlbGVtLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwgZWxlbSA8PCAiXSA9IHRydWUiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBsaXN0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZClkZWNsYXJlOwotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSgoKHRfbGlzdCopdGxpc3QpLT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotICBmZWxlbS5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUpOwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGFwcGVuZCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgc3RyaW5nIG5hbWUocHJlZml4ICsgcHVibGljaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGdlbmVyYXRlIHNlcmlhbGl6ZSBmb3Igdm9pZCB0eXBlOiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQpLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgZXJyIDo9IG9wcm90LiI7Ci0KLSAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQpKSB7Ci0gICAgICBuYW1lID0gIioiICsgbmFtZTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSAmJiAhaW5rZXkpIHsKLSAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZyhzdHJpbmcoIiA8PCBuYW1lIDw8ICIpKSI7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIldyaXRlQm9vbChib29sKCIgPDwgbmFtZSA8PCAiKSkiOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZShpbnQ4KCIgPDwgbmFtZSA8PCAiKSkiOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVJMTYoaW50MTYoIiA8PCBuYW1lIDw8ICIpKSI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJXcml0ZUkzMihpbnQzMigiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIldyaXRlSTY0KGludDY0KCIgPDwgbmFtZSA8PCAiKSkiOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoZmxvYXQ2NCgiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gR28gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIldyaXRlSTMyKGludDMyKCIgPDwgbmFtZSA8PCAiKSkiOwotICAgIH0KLQotICAgIG91dCA8PCAiOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVULiIKLSAgICAgICAgPDwgZXNjYXBlX3N0cmluZyh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgKCIgPDwgdGZpZWxkLT5nZXRfa2V5KCkKLSAgICAgICAgPDwgIikgZmllbGQgd3JpdGUgZXJyb3I6IFwiLCBwKSwgZXJyKSB9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogSW52YWxpZCB0eXBlIGluIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAnIiArIHR5cGUtPmdldF9uYW1lKCkKLSAgICAgICAgKyAiJyBmb3IgZmllbGQgJyIgKyBuYW1lICsgIiciOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCl0c3RydWN0OwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSAiIDw8IHByZWZpeCA8PCAiLiIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIGVycm9yIHdyaXRpbmcgc3RydWN0OiBcIiwgIgotICAgICAgPDwgcHJlZml4IDw8ICIpLCBlcnIpIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIGlmIChwb2ludGVyX2ZpZWxkKSB7Ci0gICAgcHJlZml4ID0gIioiICsgcHJlZml4OwotICB9Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZU1hcEJlZ2luKCIKLSAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgPDwgImxlbigiIDw8IHByZWZpeCA8PCAiKSk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciB3cml0aW5nIG1hcCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlU2V0QmVnaW4oIgotICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgPDwgImxlbigiIDw8IHByZWZpeCA8PCAiKSk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciB3cml0aW5nIHNldCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUxpc3RCZWdpbigiCi0gICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgPDwgImxlbigiIDw8IHByZWZpeCA8PCAiKSk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciB3cml0aW5nIGxpc3QgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IEludmFsaWQgdHlwZSBpbiBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICciICsgdHR5cGUtPmdldF9uYW1lKCkKLSAgICAgICAgKyAiJyBmb3IgcHJlZml4ICciICsgcHJlZml4ICsgIiciOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvciBrLCB2IDo9IHJhbmdlICIgPDwgcHJlZml4IDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCB0bWFwLCAiayIsICJ2Iik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgdiwgXyA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgdHNldCwgInYiKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgXywgdiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgdGxpc3QsICJ2Iik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZU1hcEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBtYXAgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTZXRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgc2V0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUxpc3RFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCAiIik7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCAiIik7Ci0gIGtmaWVsZC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOwotICB2ZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwga2l0ZXIsIHRydWUpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCB2aXRlcik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgIiIpOwotICBlZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgcHJlZml4KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICIiKTsKLSAgZWZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIHByZWZpeCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gc3RydWN0LgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCwgdHN0cnVjdCwgIkF0dHJpYnV0ZXMiKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBmdW5jdGlvbi4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3V0LCB0ZnVuY3Rpb24sIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIlBhcmFtZXRlcnMiKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBzdHJ1Y3Qgb3IgZnVuY3Rpb24uCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcikgewotICBib29sIGhhc19kb2MgPSBmYWxzZTsKLSAgc3RyaW5nc3RyZWFtIHNzOwotCi0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBoYXNfZG9jID0gdHJ1ZTsKLSAgICBzcyA8PCB0ZG9jLT5nZXRfZG9jKCk7Ci0gIH0KLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGlmIChoYXNfZG9jKSB7Ci0gICAgICBzcyA8PCBlbmRsOwotICAgIH0KLQotICAgIGhhc19kb2MgPSB0cnVlOwotICAgIHNzIDw8IHN1YmhlYWRlciA8PCAiOlxuIjsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0KLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBzcyA8PCAiIC0gIiA8PCBwdWJsaWNpemUocC0+Z2V0X25hbWUoKSk7Ci0KLSAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKLSAgICAgICAgc3MgPDwgIjogIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzcyA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChoYXNfZG9jKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIi8vICIsIHNzLnN0cigpLCAiIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnZW5lcmljIG9iamVjdC4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIiLCAiLy8iLCB0ZG9jLT5nZXRfZG9jKCksICIiKTsKLSAgfQotfQotCi0vKioKLSAqIERlY2xhcmVzIGFuIGFyZ3VtZW50LCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OwotICByZXN1bHQgPDwgcHVibGljaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIj0iOwotCi0gIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICByZXN1bHQgPDwgInRocmlmdF9zcGVjWyIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIl1bNF0iOwotICB9IGVsc2UgewotICAgIHJlc3VsdCA8PCAibmlsIjsKLSAgfQotCi0gIHJldHVybiByZXN1bHQuc3RyKCk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIHN0cnVjdCBmaWVsZCBpbml0aWFsIHZhbHVlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkLCB3aGljaCBtdXN0IGhhdmUgYHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTGAKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfZmllbGRfaW5pdGlhbF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbF9maWVsZCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKG9wdGlvbmFsX2ZpZWxkKSB7Ci0gICAgLy8gVGhlIGNhbGxlciB3aWxsIG1ha2UgYSBzZWNvbmQgcGFzcyBmb3Igb3B0aW9uYWwgZmllbGRzLAotICAgIC8vIGFzc2lnbmluZyB0aGUgcmVzdWx0IG9mIHJlbmRlcl9jb25zdF92YWx1ZSB0byAiKmZpZWxkX25hbWUiLiBJdAotICAgIC8vIGlzIG1hZGRlbmluZyB0aGF0IEdvIHN5bnRheCBkb2VzIG5vdCBhbGxvdyBmb3IgYSB0eXBlLWFnbm9zdGljCi0gICAgLy8gd2F5IHRvIGluaXRpYWxpemUgYSBwb2ludGVyIHRvIGEgY29uc3QgdmFsdWUsIGJ1dCBzbyBpdCBnb2VzLgotICAgIC8vIFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byB3cml0ZSB0eXBlIHNwZWNpZmljIGZ1bmN0aW9ucyB0aGF0Ci0gICAgLy8gY29udmVydCBmcm9tIGNvbnN0IHZhbHVlcyB0byBwb2ludGVyIHR5cGVzLCBidXQgZ2l2ZW4gdGhlIGxhY2sKLSAgICAvLyBvZiBvdmVybG9hZGluZyBpdCB3b3VsZCBiZSBtZXNzeS4KLSAgICByZXR1cm4gIm5ldygiICsgdHlwZV90b19nb190eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiKSI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpLCBuYW1lKTsKLSAgfQotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5Ci0gIHJldHVybiBwdWJsaWNpemUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKQotICAgICAgICAgKyAiKSI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbiBpbnRlcmZhY2UgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2lmKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCwgYm9vbCBhZGRFcnJvcikgewotICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQotICBzdHJpbmcgc2lnbmF0dXJlID0gcHVibGljaXplKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCI7Ci0gIHNpZ25hdHVyZSArPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSAoIjsKLSAgdF90eXBlKiByZXQgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHN0cmluZyBlcnJzID0gYXJndW1lbnRfbGlzdChleGNlcHRpb25zKTsKLQotICBpZiAoIXJldC0+aXNfdm9pZCgpKSB7Ci0gICAgc2lnbmF0dXJlICs9ICJyICIgKyB0eXBlX3RvX2dvX3R5cGUocmV0KTsKLQotICAgIGlmIChhZGRFcnJvciB8fCBlcnJzLnNpemUoKSA9PSAwKSB7Ci0gICAgICBzaWduYXR1cmUgKz0gIiwgIjsKLSAgICB9Ci0gIH0KLQotICBpZiAoYWRkRXJyb3IpIHsKLSAgICBzaWduYXR1cmUgKz0gImVyciBlcnJvciI7Ci0gIH0KLQotICBzaWduYXR1cmUgKz0gIikiOwotICByZXR1cm4gc2lnbmF0dXJlOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLQotICAgIHJlc3VsdCArPSB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSArICIgIgotICAgICAgICAgICAgICArIHR5cGVfdG9fZ29fdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLQotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBzdHJpbmcgbW9kdWxlKGdldF9yZWFsX2dvX21vZHVsZShwcm9ncmFtKSk7Ci0gICAgLy8gZm9yIG5hbWVzcGFjZWQgaW5jbHVkZXMsIG9ubHkga2VlcCBwYXJ0IGFmdGVyIGRvdC4KLSAgICBzaXplX3QgZG90ID0gbW9kdWxlLnJmaW5kKCcuJyk7Ci0gICAgaWYgKGRvdCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIG1vZHVsZSA9IG1vZHVsZS5zdWJzdHIoZG90ICsgMSk7Ci0gICAgfQotICAgIHJldHVybiBtb2R1bGUgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGdvIHR5b2UKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIC8qIHRoaXMgaXMgd3JvbmcsIGJpbmFyeSBpcyBzdGlsbCBhIHN0cmluZyB0eXBlIGludGVybmFsbHkKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICByZXR1cm4gInRocmlmdC5CSU5BUlkiOwotICAgICAgfQotICAgICAgKi8KLSAgICAgIHJldHVybiAidGhyaWZ0LlNUUklORyI7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gInRocmlmdC5CT09MIjsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAidGhyaWZ0LkJZVEUiOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gInRocmlmdC5JMTYiOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gInRocmlmdC5JMzIiOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gInRocmlmdC5JNjQiOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gInRocmlmdC5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gInRocmlmdC5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gInRocmlmdC5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJ0aHJpZnQuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAidGhyaWZ0LlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJ0aHJpZnQuTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyBtYXAgdHlwZSwgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgd2lsbAotICogbm90IHByb2R1Y2UgYSB2YWxpZCBnbyBtYXAgdHlwZS4KLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2dvX2tleV90eXBlKHRfdHlwZSogdHlwZSkgewotICB0X3R5cGUqIHJlc29sdmVkX3R5cGUgPSB0eXBlOwotCi0gIHdoaWxlIChyZXNvbHZlZF90eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXNvbHZlZF90eXBlID0gKCh0X3R5cGVkZWYqKXJlc29sdmVkX3R5cGUpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7Ci0gIH0KLQotICBpZiAocmVzb2x2ZWRfdHlwZS0+aXNfbWFwKCkgfHwgcmVzb2x2ZWRfdHlwZS0+aXNfbGlzdCgpIHx8IHJlc29sdmVkX3R5cGUtPmlzX3NldCgpKSB7Ci0gICAgdGhyb3cgIkNhbm5vdCBwcm9kdWNlIGEgdmFsaWQgdHlwZSBmb3IgYSBHbyBtYXAga2V5OiAiICsgdHlwZV90b19nb190eXBlKHR5cGUpICsgIiAtIGFib3J0aW5nLiI7Ci0gIH0KLQotICBpZiAocmVzb2x2ZWRfdHlwZS0+aXNfc3RyaW5nKCkgJiYgKCh0X2Jhc2VfdHlwZSopcmVzb2x2ZWRfdHlwZSktPmlzX2JpbmFyeSgpKQotICAgIHJldHVybiAic3RyaW5nIjsKLQotICByZXR1cm4gdHlwZV90b19nb190eXBlKHR5cGUsIHRydWUpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gdHlwZQotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fZ29fdHlwZSh0X3R5cGUqIHR5cGUsIGJvb2wgaXNfY29udGFpbmVyX3ZhbHVlKSB7Ci0gIHJldHVybiB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQodHlwZSwgZmFsc2UsIGlzX2NvbnRhaW5lcl92YWx1ZSk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eXBlLCB0YWtpbmcgaW50byBhY2NvdW50IHdoZXRoZXIgdGhlIGZpZWxkCi0gKiBhc3NvY2lhdGVkIHdpdGggdGhlIHR5cGUgaXMgVF9PUFRJT05BTC4KLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQodF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbF9maWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY29udGFpbmVyX3ZhbHVlKSB7Ci0gICh2b2lkKWlzX2NvbnRhaW5lcl92YWx1ZTsKLSAgc3RyaW5nIG1heWJlX3BvaW50ZXIob3B0aW9uYWxfZmllbGQgPyAiKiIgOiAiIik7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiIjsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJbXWJ5dGUiOwotICAgICAgfQotCi0gICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJzdHJpbmciOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiYm9vbCI7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQ4IjsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiaW50MTYiOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQzMiI7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImludDY0IjsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiZmxvYXQ2NCI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiKiIgKyBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfbWFwKiB0ID0gKHRfbWFwKil0eXBlOwotICAgIHN0cmluZyBrZXlUeXBlID0gdHlwZV90b19nb19rZXlfdHlwZSh0LT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgc3RyaW5nIHZhbHVlVHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSk7Ci0gICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBzdHJpbmcoIm1hcFsiKSArIGtleVR5cGUgKyAiXSIgKyB2YWx1ZVR5cGU7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3NldCogdCA9ICh0X3NldCopdHlwZTsKLSAgICBzdHJpbmcgZWxlbVR5cGUgPSB0eXBlX3RvX2dvX2tleV90eXBlKHQtPmdldF9lbGVtX3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpKTsKLSAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHN0cmluZygibWFwWyIpICsgZWxlbVR5cGUgKyBzdHJpbmcoIl1ib29sIik7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF9saXN0KiB0ID0gKHRfbGlzdCopdHlwZTsKLSAgICBzdHJpbmcgZWxlbVR5cGUgPSB0eXBlX3RvX2dvX3R5cGUodC0+Z2V0X2VsZW1fdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCksIHRydWUpOwotICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgc3RyaW5nKCJbXSIpICsgZWxlbVR5cGU7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKTsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19nb190eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqIFNlZSB0aGUgY29tbWVudCBpbnNpZGUgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24gZm9yIHdoYXQgdGhpcyBpcy4gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSkgewotICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAibmlsIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIi50aHJpZnRfc3BlYykiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCIKLSAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIgotICAgICAgICAgICArIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsIgotICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIikiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiCi0gICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCIKLSAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX3NwZWNfYXJnczogIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1ib29sIGZvcm1hdF9nb19vdXRwdXQoY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgpIHsKLSAgY29uc3Qgc3RyaW5nIGNvbW1hbmQgPSAiZ29mbXQgLXcgIiArIGZpbGVfcGF0aDsKLQotICBpZiAoc3lzdGVtKGNvbW1hbmQuY19zdHIoKSkgPT0gMCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgZnByaW50ZihzdGRlcnIsICJXQVJOSU5HIC0gUnVubmluZyAnJXMnIGZhaWxlZC5cbiIsIGNvbW1hbmQuY19zdHIoKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihnbywgIkdvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBwYWNrYWdlX3ByZWZpeD0gIFBhY2thZ2UgcHJlZml4IGZvciBnZW5lcmF0ZWQgZmlsZXMuXG4iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB0aHJpZnRfaW1wb3J0PSAgIE92ZXJyaWRlIHRocmlmdCBwYWNrYWdlIGltcG9ydCBwYXRoIChkZWZhdWx0OiIgKyBkZWZhdWx0X3RocmlmdF9pbXBvcnQgKyAiKVxuIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcGFja2FnZT0gICAgICAgICBQYWNrYWdlIG5hbWUgKGRlZmF1bHQ6IGluZmVycmVkIGZyb20gdGhyaWZ0IGZpbGUgbmFtZSlcbiIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGlnbm9yZV9pbml0aWFsaXNtc1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBhdXRvbWF0aWMgc3BlbGxpbmcgY29ycmVjdGlvbiBvZiBpbml0aWFsaXNtcyAoZS5nLiBcIlVSTFwiKVxuIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcmVhZF93cml0ZV9wcml2YXRlXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICBNYWtlIHJlYWQvd3JpdGUgbWV0aG9kcyBwcml2YXRlLCBkZWZhdWx0IGlzIHB1YmxpYyBSZWFkL1dyaXRlXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2d2X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MGYyY2EuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2d2X2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnBhaXI7Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBHcmFwaHZpeiBjb2RlIGdlbmVyYXRvcgotICovCi1jbGFzcyB0X2d2X2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfZ3ZfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKXBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZ3YiOwotCi0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiZXhjZXB0aW9ucyIpOwotICAgIGV4Y2VwdGlvbl9hcnJvd3MgPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgZW5kIG9mIGdlbmVyYXRvcgotICAgKi8KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotcHJvdGVjdGVkOgotICAvKioKLSAgICogSGVscGVycwotICAgKi8KLSAgdm9pZCBwcmludF90eXBlKHRfdHlwZSogdHR5cGUsIHN0cmluZyBzdHJ1Y3RfZmllbGRfcmVmKTsKLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7Ci0KLXByaXZhdGU6Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9vdXRfOwotICBzdGQ6Omxpc3Q8c3RyaW5nPiBlZGdlczsKLSAgYm9vbCBleGNlcHRpb25fYXJyb3dzOwotfTsKLQotLyoqCi0gKiBJbml0IGdlbmVyYXRvcjoKLSAqIC0gQWRkcyBzb21lIGVzY2FwaW5nIGZvciB0aGUgR3JhcGh2aXogZG9tYWluLgotICogLSBDcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSBhbmQgb3BlbiBmaWxlIGZvciB3cml0dGluZy4KLSAqIC0gV3JpdGUgdGhlIGZpbGUgaGVhZGVyLgotICovCi12b2lkIHRfZ3ZfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgZXNjYXBlX1sneyddID0gIlxceyI7Ci0gIGVzY2FwZV9bJ30nXSA9ICJcXH0iOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBzdHJpbmcgZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmd2IjsKLSAgZl9vdXRfLm9wZW4oZm5hbWUuY19zdHIoKSk7Ci0gIGZfb3V0XyA8PCAiZGlncmFwaCBcIiIgPDwgZXNjYXBlX3N0cmluZyhwcm9ncmFtX25hbWVfKSA8PCAiXCIgeyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICJub2RlIFtzdHlsZT1maWxsZWQsIHNoYXBlPXJlY29yZF07IiA8PCBlbmRsOwotICBmX291dF8gPDwgImVkZ2UgW2Fycm93c2l6ZT0wLjVdOyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICJyYW5rZGlyPUxSIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIENsb3NlcyBnZW5lcmF0b3I6Ci0gKiAtIFByaW50IGFjY3VtdWxhdGVkIG5vZGVzIGNvbm5lY3Rpb25zLgotICogLSBQcmludCBmb290bm90ZS4KLSAqIC0gQ2xvc2VzIGZpbGUuCi0gKi8KLXZvaWQgdF9ndl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gUHJpbnQgZWRnZXMKLSAgc3RkOjpsaXN0PHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBlZGdlcy5iZWdpbigpOwotICBmb3IgKDsgaXRlciAhPSBlZGdlcy5lbmQoKTsgaXRlcisrKSB7Ci0gICAgZl9vdXRfIDw8ICgqaXRlcikgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFByaW50IGdyYXBoIGVuZCB9IGFuZCBjbG9zZSBmaWxlCi0gIGZfb3V0XyA8PCAifSIgPDwgZW5kbDsKLSAgZl9vdXRfLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBzdHJpbmcgbmFtZSA9IHR0eXBlZGVmLT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1henVyZV07IiA8PCBlbmRsOwotICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7Ci0KLSAgZl9vdXRfIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7Ci0gIGZfb3V0XyA8PCAiIDo6ICI7Ci0gIHByaW50X3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCksIG5hbWUpOwotCi0gIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7Ci0gIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPXdoaXRlXTsiIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiZW51bSAiIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7Ci0gIGZvciAodmFsX2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdmFsX2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZhbF9pdGVyKSB7Ci0gICAgZl9vdXRfIDw8ICd8JyA8PCAoKnZhbF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIiA9ICI7Ci0gICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgfQotCi0gIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotCi0gIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWFsaWNlYmx1ZV07IiA8PCBlbmRsOwotICBmX291dF8gPDwgImNvbnN0XyIgPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7Ci0KLSAgZl9vdXRfIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7Ci0gIGZfb3V0XyA8PCAiID0gIjsKLSAgcHJpbnRfY29uc3RfdmFsdWUodGNvbnN0LT5nZXRfdHlwZSgpLCB0Y29uc3QtPmdldF92YWx1ZSgpKTsKLSAgZl9vdXRfIDw8ICIgOjogIjsKLSAgcHJpbnRfdHlwZSh0Y29uc3QtPmdldF90eXBlKCksICJjb25zdF8iICsgbmFtZSk7Ci0KLSAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotCi0gIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9bGlnaHRwaW5rXTsiIDw8IGVuZGw7Ci0gICAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOwotICAgIGZfb3V0XyA8PCAiZXhjZXB0aW9uICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKLSAgfSBlbHNlIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7Ci0gICAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9bGlnaHRjeWFuXTsiIDw8IGVuZGw7Ci0gICAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOwotICAgIGZfb3V0XyA8PCAidW5pb24gIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWJlaWdlXTsiIDw8IGVuZGw7Ci0gICAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOwotICAgIGZfb3V0XyA8PCAic3RydWN0ICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKLSAgfQotCi0gIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOwotICBmb3IgKDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgewotICAgIHN0cmluZyBmaWVsZF9uYW1lID0gKCptZW1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBwcmludCBwb3J0IChhbmNob3IgcmVmZXJlbmNlKQotICAgIGZfb3V0XyA8PCAifDxmaWVsZF8iIDw8IGZpZWxkX25hbWUgPDwgJz4nOwotCi0gICAgLy8gZmllbGQgbmFtZSA6OiBmaWVsZCB0eXBlCi0gICAgZl9vdXRfIDw8ICgqbWVtX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfb3V0XyA8PCAiIDo6ICI7Ci0gICAgcHJpbnRfdHlwZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSwgbmFtZSArICI6ZmllbGRfIiArIGZpZWxkX25hbWUpOwotICB9Ci0KLSAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpwcmludF90eXBlKHRfdHlwZSogdHR5cGUsIHN0cmluZyBzdHJ1Y3RfZmllbGRfcmVmKSB7Ci0gIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZl9vdXRfIDw8ICJsaXN0XFw8IjsKLSAgICAgIHByaW50X3R5cGUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKLSAgICAgIGZfb3V0XyA8PCAiXFw+IjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZl9vdXRfIDw8ICJzZXRcXDwiOwotICAgICAgcHJpbnRfdHlwZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7Ci0gICAgICBmX291dF8gPDwgIlxcPiI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAibWFwXFw8IjsKLSAgICAgIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7Ci0gICAgICBmX291dF8gPDwgIiwgIjsKLSAgICAgIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7Ci0gICAgICBmX291dF8gPDwgIlxcPiI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGZfb3V0XyA8PCAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5pc19iaW5hcnkoKSA/ICJiaW5hcnkiIDogdHR5cGUtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PCB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICBlZGdlcy5wdXNoX2JhY2soc3RydWN0X2ZpZWxkX3JlZiArICIgLT4gIiArIHR0eXBlLT5nZXRfbmFtZSgpKTsKLSAgfQotfQotCi0vKioKLSAqIFByaW50cyBvdXQgYW4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm92aWRlZCBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgewotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgc3dpdGNoICh0dmFsdWUtPmdldF90eXBlKCkpIHsKLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgotICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgotICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICBicmVhazsKLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6Ci0gICAgZl9vdXRfIDw8ICJcXFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodHZhbHVlKSA8PCAiXFxcIiI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOiB7Ci0gICAgZl9vdXRfIDw8ICJcXHsgIjsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBtYXBfZWxlbXMgPSB0dmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbWFwX2l0ZXI7Ci0gICAgZm9yIChtYXBfaXRlciA9IG1hcF9lbGVtcy5iZWdpbigpOyBtYXBfaXRlciAhPSBtYXBfZWxlbXMuZW5kKCk7IG1hcF9pdGVyKyspIHsKLSAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpLCBtYXBfaXRlci0+Zmlyc3QpOwotICAgICAgZl9vdXRfIDw8ICIgPSAiOwotICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpLCBtYXBfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICIgXFx9IjsKLSAgfSBicmVhazsKLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOiB7Ci0gICAgZl9vdXRfIDw8ICJcXHsgIjsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RfZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7Ci0gICAgOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpc3RfaXRlcjsKLSAgICBmb3IgKGxpc3RfaXRlciA9IGxpc3RfZWxlbXMuYmVnaW4oKTsgbGlzdF9pdGVyICE9IGxpc3RfZWxlbXMuZW5kKCk7IGxpc3RfaXRlcisrKSB7Ci0gICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgIGZfb3V0XyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICpsaXN0X2l0ZXIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgKmxpc3RfaXRlcik7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiIFxcfSI7Ci0gIH0gYnJlYWs7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKLSAgICBmX291dF8gPDwgZXNjYXBlX3N0cmluZyh0eXBlLT5nZXRfbmFtZSgpKSA8PCAiLiIKLSAgICAgICAgICAgPDwgZXNjYXBlX3N0cmluZyh0dmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKSk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgZl9vdXRfIDw8ICJVTktOT1dOIjsKLSAgICBicmVhazsKLSAgfQotfQotCi12b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIHNlcnZpY2VfbmFtZSA9IGdldF9zZXJ2aWNlX25hbWUodHNlcnZpY2UpOwotICBmX291dF8gPDwgInN1YmdyYXBoIGNsdXN0ZXJfIiA8PCBzZXJ2aWNlX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1iaXNxdWVdOyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICJzdHlsZT1kYXNoZWQ7IiA8PCBlbmRsOwotICBmX291dF8gPDwgImxhYmVsID0gXCIiIDw8IGVzY2FwZV9zdHJpbmcoc2VydmljZV9uYW1lKSA8PCAiIHNlcnZpY2VcIjsiIDw8IGVuZGw7Ci0KLSAgLy8gVE9ETzogc2VydmljZSBleHRlbmRzCi0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7Ci0gIGZvciAoOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7Ci0gICAgc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgZl9vdXRfIDw8ICJmdW5jdGlvbl8iIDw8IHNlcnZpY2VfbmFtZSA8PCBmbl9uYW1lOwotICAgIGZfb3V0XyA8PCAiW2xhYmVsPVwiPHJldHVybl90eXBlPmZ1bmN0aW9uICIgPDwgZXNjYXBlX3N0cmluZyhmbl9uYW1lKTsKLSAgICBmX291dF8gPDwgIiA6OiAiOwotICAgIHByaW50X3R5cGUoKCpmbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgImZ1bmN0aW9uXyIgKyBzZXJ2aWNlX25hbWUgKyBmbl9uYW1lICsgIjpyZXR1cm5fdHlwZSIpOwotCi0gICAgdmVjdG9yPHRfZmllbGQqPiBhcmdzID0gKCpmbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsKLSAgICBmb3IgKDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgewotICAgICAgZl9vdXRfIDw8ICJ8PHBhcmFtXyIgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCkgPDwgIj4iOwotICAgICAgZl9vdXRfIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKCgqYXJnX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICAgIGZfb3V0XyA8PCAiID0gIjsKLSAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCphcmdfaXRlciktPmdldF90eXBlKCksICgqYXJnX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgICB9Ci0gICAgICBmX291dF8gPDwgIiA6OiAiOwotICAgICAgcHJpbnRfdHlwZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgImZ1bmN0aW9uXyIgKyBzZXJ2aWNlX25hbWUgKyBmbl9uYW1lICsgIjpwYXJhbV8iICsgKCphcmdfaXRlciktPmdldF9uYW1lKCkpOwotICAgIH0KLSAgICAvLyBlbmQgb2Ygbm9kZQotICAgIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKLQotICAgIC8vIEV4Y2VwdGlvbiBlZGdlcwotICAgIGlmIChleGNlcHRpb25fYXJyb3dzKSB7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOwotICAgICAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7Ci0gICAgICAgIGVkZ2VzLnB1c2hfYmFjaygiZnVuY3Rpb25fIiArIHNlcnZpY2VfbmFtZSArIGZuX25hbWUgKyAiIC0+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKCpleF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSArICIgW2NvbG9yPXJlZF0iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmX291dF8gPDwgIiB9IiA8PCBlbmRsOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAotICAgIGd2LAotICAgICJHcmFwaHZpeiIsCi0gICAgIiAgICBleGNlcHRpb25zOiAgICAgIFdoZXRoZXIgdG8gZHJhdyBhcnJvd3MgZnJvbSBmdW5jdGlvbnMgdG8gZXhjZXB0aW9uLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZhMzZjNS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOTY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGNjdHlwZT4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogSGF4ZSBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfaGF4ZV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9oYXhlX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJjYWxsYmFja3MiKTsKLSAgICBjYWxsYmFja3NfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInJ0dGkiKTsKLSAgICBydHRpXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJidWlsZG1hY3JvIik7Ci0gICAgYnVpbGRtYWNyb18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSkgPyAoaXRlci0+c2Vjb25kKSA6ICIiOwotCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4taGF4ZSI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotICAvLyByZW1vdmVkIC0tIGVxdWFsaXR5LGNvbXBhcmVfdG8KLSAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV9tZXRhX2RhdGFfbWFwKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9oYXhlX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5X2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKLSAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwotICAvLyByZW1vdmVkIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpc19pbnRlcmZhY2UpOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOwotCi0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV9kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7Ci0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV9kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKLQotICB2b2lkIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQpOwotICB2b2lkIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0KTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgaGF4ZV9wYWNrYWdlKCk7Ci0gIHN0ZDo6c3RyaW5nIGhheGVfdHlwZV9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIGhheGVfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cyk7Ci0gIHN0ZDo6c3RyaW5nIGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwgYm9vbCBpbl9pbml0ID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfY2FsbGJhY2sodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7Ci0gIHN0cmluZyBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGFzX3R5cGUsIGJvb2wgb21pdF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfY2FsbGJhY2sodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGlzX2ludGVyZmFjZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKTsKLQotICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RyaW5nKCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgLy8gY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6ICAtIEludDY0IGlzIG5vdCByZWFsbHkgbnVsbGFibGUsIGV2ZW4gdGhvdWdoIGl0IGJlaGF2ZWQgdGhhdAotICAgICAgICAvLyB3YXkgYmVmb3JlIEhheGUgMy4yLjAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLQotcHJpdmF0ZToKLSAgYm9vbCBjYWxsYmFja3NfOwotICBib29sIHJ0dGlfOwotICBzdHJpbmcgYnVpbGRtYWNyb187Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKLX07Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImhheGUiKTsKLQotICAvLyBIYXhlIHBhY2thZ2UgbmFtZXMgYXJlIGxvd2VyY2FzZQotICBpZiAocGFja2FnZV9uYW1lXy5sZW5ndGgoKSA+IDApIHsKLSAgICBwYWNrYWdlX25hbWVfWzBdID0gdG9sb3dlcihwYWNrYWdlX25hbWVfWzBdKTsKLSAgICBzaXplX3QgaW5kZXggPSBwYWNrYWdlX25hbWVfLmZpbmQoJy4nKTsKLSAgICB3aGlsZSAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGlmICgrK2luZGV4IDwgcGFja2FnZV9uYW1lXy5sZW5ndGgoKSkgewotICAgICAgICBwYWNrYWdlX25hbWVfW2luZGV4XSA9IHRvbG93ZXIocGFja2FnZV9uYW1lX1tpbmRleF0pOwotICAgICAgfQotICAgICAgaW5kZXggPSBwYWNrYWdlX25hbWVfLmZpbmQoJy4nLCBpbmRleCk7Ci0gICAgfQotICB9Ci0KLSAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87Ci0gIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOwotICB9Ci0gIGlmIChkaXIuc2l6ZSgpID4gMCkgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gIH0KLQotICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Ci19Ci0KLS8qKgotICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCi0gKgotICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKLSAqLwotc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfcGFja2FnZSgpIHsKLSAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXzsKLSAgfQotICByZXR1cm4gInBhY2thZ2UiOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBoYXhlIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgaGF4ZSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKLSAqLwotc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfdHlwZV9pbXBvcnRzKCkgewotICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci4qO1xuIiArICJpbXBvcnQgaGF4ZS5pby5CeXRlcztcbiIKLSAgICAgICAgICsgImltcG9ydCBoYXhlLmRzLkludE1hcDtcbiIgKyAiaW1wb3J0IGhheGUuZHMuU3RyaW5nTWFwO1xuIgotICAgICAgICAgKyAiaW1wb3J0IGhheGUuZHMuT2JqZWN0TWFwO1xuIiArICJcbiIgKyAiI2lmIGZsYXNoXG4iCi0gICAgICAgICArICJpbXBvcnQgZmxhc2guZXJyb3JzLkFyZ3VtZW50RXJyb3I7XG4iICsgIiNlbmRcbiIgKyAiXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBoYXhlIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAotICovCi1zdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV90aHJpZnRfaW1wb3J0cygpIHsKLSAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iCi0gICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjtcbiIgKyAiXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc3RydWN0Ci0gKi8KLXN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKSB7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICAvLyBGb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCk7Ci0gICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImhheGUiKTsKLSAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7Ci0gICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSArICI7XG4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gaW1wb3J0czsKLX0KLQotLyoqCi0gKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3NlcnZpY2UKLSAqLwotc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGltcG9ydHM7Ci0gIGNvbnN0IHZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBGb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfcHJvZ3JhbSgpOwotICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7Ci0gICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgewotICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgewotICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI7XG4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwgaW1wb3J0cyk7Ci0gICAgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCksIGltcG9ydHMpOwotICB9Ci0KLSAgcmV0dXJuIGltcG9ydHM7Ci19Ci0KLS8qKgotICogTm90aGluZyBpbiBoYXhlCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gaGF4ZSwgc2luY2UgaXQgZG9lcwotICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCi0gKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCl0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmh4IjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKLQotICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0Ci0gIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEFkZCBoYXhlIGltcG9ydHMKLSAgZl9lbnVtIDw8IHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXIuKjsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9lbnVtKTsKLSAgZ2VuZXJhdGVfbWFjcm9fZGVjb3JhdGlvbihmX2VudW0pOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgIjsKLSAgc2NvcGVfdXAoZl9lbnVtKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBpbmxpbmUgdmFyICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgOiBJbnQgPSAiIDw8IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBDcmVhdGUgYSBzdGF0aWMgU2V0IHdpdGggYWxsIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCi0gIGZfZW51bSA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIHZhciBWQUxJRF9WQUxVRVMgPSB7IG5ldyBJbnRTZXQoIFsiOwotICBpbmRlbnRfdXAoKTsKLSAgYm9vbCBmaXJzdFZhbHVlID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAvLyBwb3B1bGF0ZSBzZXQKLSAgICBmX2VudW0gPDwgKGZpcnN0VmFsdWUgPyAiIiA6ICIsICIpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmaXJzdFZhbHVlID0gZmFsc2U7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9lbnVtIDw8ICJdKTsgfTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgdmFyIFZBTFVFU19UT19OQU1FUyA9IHsgWyI7Ci0gIGluZGVudF91cCgpOwotICBmaXJzdFZhbHVlID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBmX2VudW0gPDwgKGZpcnN0VmFsdWUgPyAiIiA6ICIsIikgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PiBcIiIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiI7Ci0gICAgZmlyc3RWYWx1ZSA9IGZhbHNlOwotICB9Ci0gIGZfZW51bSA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiXTsgfTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgY2xhc3MKLQotICBmX2VudW0uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIGlmIChjb25zdHMuZW1wdHkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHByb2dyYW1fbmFtZV8pICsgIkNvbnN0YW50cy5oeCI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOwotICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9jb25zdHMgPDwgZW5kbDsKLQotICBmX2NvbnN0cyA8PCBoYXhlX3R5cGVfaW1wb3J0cygpOwotCi0gIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX2NvbnN0cyk7Ci0gIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9jb25zdHMpOwotICBpbmRlbnQoZl9jb25zdHMpIDw8ICJjbGFzcyAiIDw8IGdldF9jYXBfbmFtZShwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGluZGVudChvdXQpOwotICBpZiAoIWRlZnZhbCkgewotICAgIG91dCA8PCAoaW5fc3RhdGljID8gInZhciAiIDogInB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciAgIik7Ci0gIH0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIG91dCA8PCBuYW1lOwotICAgIGlmICghZGVmdmFsKSB7Ci0gICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IG5hbWU7Ci0gICAgaWYgKCFkZWZ2YWwpIHsKLSAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIH0KLSAgICBvdXQgPDwgIiA9ICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IgotICAgICAgICA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpIDogVm9pZCB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7Ci0gICAgICBvdXQgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgbmFtZTsKLSAgICBpZiAoIWRlZnZhbCkgewotICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gICAgfQotICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpIDogVm9pZCB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IG5hbWU7Ci0gICAgaWYgKCFkZWZ2YWwpIHsKLSAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIH0KLSAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKSA6IFZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgKHR5cGUtPmlzX2xpc3QoKSA/ICJwdXNoIiA6ICJhZGQiKSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKW5hbWU7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJlbmRlciA8PCAiKGRvdWJsZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcwotICogd2l0aCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGFuIGlubmVyIElzc2V0IGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBIYXhlIHN0cnVjdCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiwgYm9vbCBpc19yZXN1bHQpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuaHgiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGltcG9ydHM7Ci0KLSAgZl9zdHJ1Y3QgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKSA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkKLSAgICAgICAgICAgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHN0cnVjdCwgaW1wb3J0cykgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGlzX3Jlc3VsdCk7Ci0KLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBoYXhlIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCi0gKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKLSAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/Ci0gKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKLSAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgZ2VuZXJhdGVfaGF4ZV9kb2Mob3V0LCB0c3RydWN0KTsKLQotICBzdHJpbmcgY2xzbmFtZSA9IGdldF9jYXBfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKLQotICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24ob3V0KTsKLSAgZ2VuZXJhdGVfbWFjcm9fZGVjb3JhdGlvbihvdXQpOwotICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCBjbHNuYW1lIDw8ICIgIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJleHRlbmRzIFRFeGNlcHRpb24gIjsKLSAgfQotICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UgIjsKLQotICBzY29wZV91cChvdXQpOwotICBpbmRlbnQob3V0KSA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgdmFyIFNUUlVDVF9ERVNDID0geyBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyB9OyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHZhciAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IHsgbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IH07IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgKm1faXRlcik7Ci0gICAgLy8gaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArICIgOiAiICsKLSAgICAvLyB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiQDppc1ZhciIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZhciAiCi0gICAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsgIihnZXQsc2V0KSA6ICIKLSAgICAgICAgICAgICAgICAgICArIGdldF9jYXBfbmFtZSh0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlubGluZSBzdGF0aWMgdmFyICIgPDwgdXBjYXNlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9JRCA6IEludCA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICAvLyBJbm5lciBJc3NldCBjbGFzcwotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA6IEJvb2wgPSBmYWxzZTsiCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gU3RhdGljIGluaXRpYWxpemVyIHRvIHBvcHVsYXRlIGdsb2JhbCBjbGFzcyB0byBzdHJ1Y3QgbWV0YWRhdGEgbWFwCi0gIGlmIChmYWxzZSkgewotICAgIC8vIFRPRE86IHJlYWN0aXZhdGUgd2hlbiBuZWVkZWQKLSAgICBnZW5lcmF0ZV9oYXhlX21ldGFfZGF0YV9tYXAob3V0LCB0c3RydWN0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCBtZXRhRGF0YU1hcCk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGluZGVudChvdXQpIDw8ICJzdXBlcigpOyIgPDwgZW5kbDsKLSAgfQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfcHJvcGVydHlfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfaGF4ZV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoIGlwcm90IDogVFByb3RvY29sKSA6IFZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgotICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZCA6IFRGaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIKLSAgICAgIDw8IGVuZGw7Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuaWQpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9JRDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0gICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKLSAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgotICAgICAgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBpbmRlbnQob3V0KSA8PCAiY2F0Y2goZTpEeW5hbWljKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaW5kZW50KG91dCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidGhyb3cgZTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCi0gIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQotICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFfX2lzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCi0gICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgaGF4ZSBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcwotLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoKSA6IFZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkKLSAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKLSAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlLiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0gICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7Ci0gICAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKLSAgICBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIgJiYgISIKLSAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZShnZXRfZW51bV9jbGFzc19uYW1lKHR5cGUpKSA8PCAiLlZBTElEX1ZBTFVFUy5jb250YWlucygiCi0gICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSl7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVU5LTk9XTiwgXCJUaGUgZmllbGQgJyIKLSAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICInIGhhcyBiZWVuIGFzc2lnbmVkIHRoZSBpbnZhbGlkIHZhbHVlIFwiICsgIgotICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpIDogVm9pZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidHJ5IiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotICAKLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIGluZGVudChvdXQpIDw8ICJjYXRjaChlOkR5bmFtaWMpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICAKLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKLSAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgotICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KLSAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKSA6IFZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0KLSAgCi0gIGluZGVudChvdXQpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotICAKLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIGluZGVudChvdXQpIDw8ICJjYXRjaChlOkR5bmFtaWMpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICAKLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gICh2b2lkKXR5cGU7Ci0gICh2b2lkKWNhcF9uYW1lOwotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIl9GSUVMRF9JRDoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgewotICAodm9pZCl0eXBlOwotICAodm9pZCljYXBfbmFtZTsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLQotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07Ci0KLSAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBjcmVhdGUgdGhlIHNldHRlcgotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldEZpZWxkVmFsdWUoZmllbGRJRCA6IEludCwgdmFsdWUgOiBEeW5hbWljKSA6IFZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBjcmVhdGUgdGhlIGdldHRlcgotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUoZmllbGRJRCA6IEludCkgOiBEeW5hbWljIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLy8gQ3JlYXRlcyBhIGdlbmVyaWMgaXNTZXQgbWV0aG9kIHRoYXQgdGFrZXMgdGhlIGZpZWxkIG51bWJlciBhcyBhcmd1bWVudAotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBjcmVhdGUgdGhlIGlzU2V0IG1ldGhvZAotICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgIgotICAgICAgICAgICAgICAgICAidmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXNTZXQoZmllbGRJRCA6IEludCkgOiBCb29sIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9JRDoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNldCBvZiBwcm9wZXJ0eSBzZXR0ZXJzL2dldHRlcnMgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvcGVydHlfZ2V0dGVyc19zZXR0ZXJzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgLy8gU2ltcGxlIGdldHRlcgotICAgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiKCkgOiAiIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUodHlwZSkpCi0gICAgICAgICAgICAgICAgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gU2ltcGxlIHNldHRlcgotICAgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiKCIgPDwgZmllbGRfbmFtZSA8PCAiOiIKLSAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHR5cGUpKSA8PCAiKSA6ICIgPDwgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0eXBlKSkgPDwgIiB7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBVbnNldHRlcgotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSA6IFZvaWQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gaXNTZXQgbWV0aG9kCi0gICAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKLSAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSA6IEJvb2wgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIgotICAgICAgPDwgImZ1bmN0aW9uIHRvU3RyaW5nKCkgOiBTdHJpbmcgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcmV0IDogU3RyaW5nID0gXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIjsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpcnN0IDogQm9vbCA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgcmV0ICs9ICBcIiwgXCI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIjsiIDw8IGVuZGw7Ci0gICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIm51bGxcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKShmaWVsZC0+Z2V0X3R5cGUoKSkpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiQklOQVJZXCI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiX25hbWUgOiBTdHJpbmcgPSAiIDw8IGdldF9jYXBfbmFtZShnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSkKLSAgICAgICAgICAgICAgICAgIDw8ICIuVkFMVUVTX1RPX05BTUVTW3RoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9ICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIiAoXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIilcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldCArPSBcIilcIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXQ7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RhdGljIG1hcCB3aXRoIG1ldGEgZGF0YSB0byBzdG9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGZpZWxkSUQgdG8KLSAqIGZpZWxkTmFtZSBtYXBwaW5nCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9tZXRhX2RhdGFfbWFwKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBGaWVsZE1ldGFEYXRhIG1hcHBpbmdzCi0gIGluZGVudChvdXQpIDw8ICJpbmxpbmUgc3RhdGljIHZhciBtZXRhRGF0YU1hcCA6IEludE1hcCA9IG5ldyBJbnRNYXAoKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgLy8gUG9wdWxhdGUgbWFwCi0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGFEYXRhTWFwWyIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKQotICAgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9JRF0gPSBuZXcgRmllbGRNZXRhRGF0YShcIiIgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7Ci0KLSAgICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCi0gICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOwotICAgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOwotICAgICAgfQotCi0gICAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhCi0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGhheGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCi0gKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCi0gKi8KLXN0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9oYXhlX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gZ2V0X2hheGVfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gIlRUeXBlLlZPSUQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9oYXhlX3R5cGVfc3RyaW5nISIpOwotICAgICAgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKAotICAgICAgICAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCi0gICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfaGF4ZV90eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICB9Ci19Ci0KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTGlzdE1ldGFEYXRhKFRUeXBlLkxJU1QsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IFNldE1ldGFEYXRhKFRUeXBlLlNFVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOwotICAgIH0gZWxzZSB7IC8vIG1hcAotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7Ci0gICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9oYXhlX3R5cGVfc3RyaW5nKHR5cGUpOwotICB9Ci0gIG91dCA8PCAiKSI7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBNYWtlIGludGVyZmFjZSBmaWxlCi0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSArICIuaHgiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKSA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkKLSAgICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7Ci0gICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLQotICAvLyBOb3cgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24vY2xpZW50IGZpbGUKLSAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgKyAiSW1wbC5oeCI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKQotICAgICAgICAgICAgIDw8IGhheGVfdGhyaWZ0X2ltcG9ydHMoKSA8PCBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSkgPDwgZW5kbDsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIHRfdHlwZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gICAgc3RyaW5nIHBhcmVudF9uYW1lc3BhY2UgPSBwYXJlbnQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImhheGUiKTsKLSAgICBpZiAoIXBhcmVudF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBwYXJlbnRfbmFtZXNwYWNlICE9IHBhY2thZ2VfbmFtZV8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHR5cGVfbmFtZShwYXJlbnQpIDw8ICJJbXBsOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLQotICAvLyBOb3cgbWFrZSB0aGUgaGVscGVyIGNsYXNzIGZpbGVzCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgLy8gTm93IG1ha2UgdGhlIHByb2Nlc3Nvci9zZXJ2ZXIgZmlsZQotICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSArICJQcm9jZXNzb3IuaHgiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGhheGVfdHlwZV9pbXBvcnRzKCkKLSAgICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7Ci0KLSAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuKjsiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLiIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pLmNfc3RyKCkKLSAgICAgICAgICAgICAgIDw8ICJJbXBsOyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLQotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0KLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgY29kZSBzbmlwcGV0IGZvciB0aGUgb25TdWNjZXNzIGNhbGxiYWNrcwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29kZSBmb3IuCi0gKi8KLXN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFzX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb21pdF9uYW1lKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSAiIjsKLSAgaWYgKCFvbWl0X25hbWUpIHsKLSAgICBuYW1lID0gIm9uU3VjY2VzcyI7Ci0gICAgaWYgKGFzX3R5cGUpIHsKLSAgICAgIG5hbWUgKz0gIiA6ICI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgaWYgKGFzX3R5cGUpIHsKLSAgICAgIHJldHVybiBuYW1lICsgIlZvaWQtPlZvaWQgPSBudWxsIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG5hbWUgKyAiKCkgOiBWb2lkIjsKLSAgICB9Ci0gIH0KLQotICBpZiAoYXNfdHlwZSkgewotICAgIHJldHVybiBuYW1lICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiLT5Wb2lkID0gbnVsbCI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG5hbWUgKyAiKCByZXR2YWwgOiAiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiKSI7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKSB7Ci0gIGlmIChjYWxsYmFja3NfKSB7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX2NhbGxiYWNrKHRmdW5jdGlvbiwgaXNfaW50ZXJmYWNlKTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfbm9ybWFsKHRmdW5jdGlvbiwgaXNfaW50ZXJmYWNlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgbWV0aG9kIGhlYWRlciBpbiAibm9ybWFsIiBzdHlsZQotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29kZSBmb3IuCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbnRlcmZhY2UpIHsKLSAgaWYgKGlzX2ludGVyZmFjZSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRmdW5jdGlvbikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9ub3JtYWwodGZ1bmN0aW9uKSA8PCAiIHsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIgaW4gImNhbGxiYWNrIiBzdHlsZQotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29kZSBmb3IuCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX2NhbGxiYWNrKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW50ZXJmYWNlKSB7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHN0ZDo6c3RyaW5nIG9uX3N1Y2Nlc3NfaW1wbCA9IGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX29uc3VjY2Vzcyh0ZnVuY3Rpb24sIGZhbHNlLCBmYWxzZSk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvLyBmdW5jdGlvbiBvbkVycm9yKER5bmFtaWMpIDogVm9pZDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvLyBmdW5jdGlvbiAiIDw8IG9uX3N1Y2Nlc3NfaW1wbC5jX3N0cigpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGlzX2ludGVyZmFjZSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfY2FsbGJhY2sodGZ1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2NhbGxiYWNrKHRmdW5jdGlvbikgPDwgIiB7IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0gIH0KLQotICBnZW5lcmF0ZV9oYXhlX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIC8vIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX3NlcnZpY2VfKTsgLSBub3QgeWV0LCBiZWNhdXNlIG9mCi0gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy8zNjI2Ci0gIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImludGVyZmFjZSAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9oYXhlX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gZ2V0X2NhcF9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJJbXBsIjsKLSAgfQotCi0gIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX3NlcnZpY2VfKTsKLSAgLy8gYnVpbGQgbWFjcm8gaXMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIkltcGwiIDw8IGV4dGVuZHNfY2xpZW50Ci0gICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIG5ldyggaXByb3QgOiBUUHJvdG9jb2wsIG9wcm90IDogVFByb3RvY29sID0gbnVsbCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvcHJvdCA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHZhciBpcHJvdF8gOiBUUHJvdG9jb2w7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAicHJpdmF0ZSB2YXIgb3Byb3RfIDogVFByb3RvY29sOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgInByaXZhdGUgdmFyIHNlcWlkXyA6IEludDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldElucHV0UHJvdG9jb2woKSA6IFRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0aGlzLmlwcm90XzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXRQcm90b2NvbCgpIDogVFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSk7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIHN0cmluZyBjYWxsdHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiT05FV0FZIiA6ICJDQUxMIjsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lCi0gICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS4iIDw8IGNhbGx0eXBlIDw8ICIsIHNlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgInZhciBhcmdzIDogIiA8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgoKmZfaXRlciktPmlzX29uZXdheSgpIHx8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJldHZhbCA6ICIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIjsiCi0gICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goZnVuY3Rpb24oZXJyb3I6RHluYW1pYykgOiBWb2lkIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGlmIChjYWxsYmFja3NfKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgfQotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGVycm9yICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGlmIChjYWxsYmFja3NfKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihlcnJvcik7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IGVycm9yOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciBtc2cgOiBUTWVzc2FnZSA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgeCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoY2FsbGJhY2tzXykgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoeCk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IHg7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIHJlc3VsdCA6ICIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpZiAoY2FsbGJhY2tzXykgewotICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MocmVzdWx0LnN1Y2Nlc3MpOyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR2YWwgPSByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGlmIChjYWxsYmFja3NfKSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrc18pIHsKLSAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKCk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChjYWxsYmFja3NfKSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykKLSAgICAgICAgICAgICAgPDwgIm9uRXJyb3IoIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSk7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pCi0gICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjYWxsYmFja3NfKSB7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBjYXRjaCggZSA6IFRFeGNlcHRpb24pIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZSk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoISgoKmZfaXRlciktPmlzX29uZXdheSgpIHx8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBFeHRlbmRzIHN0dWZmCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7Ci0gIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIlByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSB2YXIgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykKLSAgICAgICAgICAgICA8PCAiX2lmYWNlXyA6ICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICI7IiA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAicHJpdmF0ZSB2YXIgUFJPQ0VTU19NQVAgPSBuZXcgU3RyaW5nTWFwPCBJbnQtPlRQcm90b2NvbC0+VFByb3RvY29sLT5Wb2lkID4oKTsiCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIG5ldyggaWZhY2UgOiAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiKSIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIl9pZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQUk9DRVNTX01BUC5zZXQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKLSAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIHN0cmluZyBvdmVycmlkZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIG92ZXJyaWRlID0gIm92ZXJyaWRlICI7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IG92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICA8PCAicHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoIGlwcm90IDogVFByb3RvY29sLCBvcHJvdCA6IFRQcm90b2NvbCkgOiBCb29sIgotICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZyA6IFRNZXNzYWdlID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KLSAgLy8gQVMtIElmIGFsbCBtZXRob2QgaXMgb25ld2F5OgotICAvLyBkbyB5b3UgaGF2ZSBhbiBvcHJvdD8KLSAgLy8gZG8geW91IHlvdSBuZWVkIG51bGxjaGVjaz8KLSAgZl9zZXJ2aWNlXwotICAgICAgPDwgaW5kZW50KCkgPDwgInZhciBmbiAgPSBQUk9DRVNTX01BUC5nZXQobXNnLm5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgImlmIChmbiA9PSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiCi0gICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICB2YXIgeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELCBcIkludmFsaWQgIgotICAgICAgICAgIm1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiCi0gICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiCi0gICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJmbiggbXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJpbmcgcmVzdWx0bmFtZSA9IGdldF9jYXBfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHJlc3VsdG5hbWUpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QoJnJlc3VsdCwgZmFsc2UsIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpdHNlcnZpY2U7Ci0gIC8vIE9wZW4gY2xhc3MKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGZ1bmN0aW9uICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiKCkgOiBJbnQtPlRQcm90b2NvbC0+VFByb3RvY29sLT5Wb2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZnVuY3Rpb24oIHNlcWlkIDogSW50LCBpcHJvdCA6IFRQcm90b2NvbCwgb3Byb3QgOiBUUHJvdG9jb2wpIDogVm9pZCIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IGdldF9jYXBfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfY2FwX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJncyA6ICIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IgotICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0IDogIiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhbnkgIGZ1bmN0aW9uIHRvIGNhdGNoIChkZWZpbmVkIG9yIHVuZGVmaW5lZCkgZXhjZXB0aW9ucwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGNhbGxiYWNrc18pIHsKLSAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiBzdHlsZSBvbkVycm9yL29uU3VjY2VzcwotCi0gICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiX2lmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0KLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgc3RyaW5nIG9uX3N1Y2Nlc3MgPSBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModGZ1bmN0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibnVsbCwgIC8vIGVycm9ycyBhcmUgdGhyb3duIGJ5IHRoZSBoYW5kbGVyIiA8PCBlbmRsOwotICAgICAgaWYgKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibnVsbCk7IC8vIG5vIHJldHZhbCIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb24iIDw8IG9uX3N1Y2Nlc3MuY19zdHIoKSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zdWNjZXNzID0gcmV0dmFsOyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICAvLyBub3JtYWwgZnVuY3Rpb24oKTpyZXN1bHQgc3R5bGUKLQotICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgaWYgKCEodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSB8fCB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIl9pZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIC8vIGNhdGNoIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgSURMCi0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiCi0gICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gYWx3YXlzIGNhdGNoIGFsbCBleGNlcHRpb25zIHRvIHByZXZlbnQgZnJvbSBzZXJ2aWNlIGRlbmlhbAotICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKHRoIDogRHluYW1pYykgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJhY2UoXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgdGgpOyIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIC8vIENsb3NlIGNsYXNzCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgY2xhc3MKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEhheGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUodHN0cnVjdCkpIDw8ICIoKTsiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBvYmo7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG9iaiA9IHRtcCgiX21hcCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG9iaiA9IHRtcCgiX3NldCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9saXN0Iik7Ci0gIH0KLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCi0gICAgICAgICAgICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5Ci0gICAgICAgICAgICAgIDw8ICIoIgotICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpIDw8ICIgaW4gMCAuLi4gIiA8PCBvYmogPDwgIi5zaXplKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuc2V0KCAiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBIYXhlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgotICogQHBhcmFtIHByZWZpeCBTdHJpbmcgcHJlZml4IGZvciBmaWVsZHMKLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9rZXkiKTsKLSAgICBzdHJpbmcgY291bnRlciA9IHRtcCgiX3NpemVDb3VudGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGNvdW50ZXIgPDwgIiA6IEludCA9IDA7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBjb3VudGVyIDw8ICsiKys7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IGNvdW50ZXIgPDwgIikpOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJlbGVtIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLmtleXMoKSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi50b0FycmF5KCkpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIi5nZXQoIiArIGl0ZXIgKyAiKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIGhheGUgdHlwZSBuYW1lCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KLSAqIEByZXR1cm4gaGF4ZSB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+Ci0gKi8KLXN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCkgewotICAodm9pZClpbl9pbml0OwotCi0gIC8vIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotICBzdHJpbmcgcHJlZml4OwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJJbnQiOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSogdGtleSA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgdF90eXBlKiB0dmFsID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICBpZiAodGtleS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0a2V5KS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoISgoKHRfYmFzZV90eXBlKil0a2V5KS0+aXNfYmluYXJ5KCkpKSB7Ci0gICAgICAgICAgcmV0dXJuICJTdHJpbmdNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIHJldHVybiAiSW50TWFwPCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJldHVybiAiSW50NjRNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RNYXA8PgotICAgICAgfQotICAgIH0KLSAgICBpZiAodGtleS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXR1cm4gIkludE1hcDwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKLSAgICB9Ci0gICAgcmV0dXJuICJPYmplY3RNYXA8ICIgKyB0eXBlX25hbWUodGtleSkgKyAiLCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogdGtleSA9IGdldF90cnVlX3R5cGUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICBpZiAodGtleS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0a2V5KS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoISgoKHRfYmFzZV90eXBlKil0a2V5KS0+aXNfYmluYXJ5KCkpKSB7Ci0gICAgICAgICAgcmV0dXJuICJTdHJpbmdTZXQiOwotICAgICAgICB9Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZXR1cm4gIkludFNldCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJJbnQ2NFNldCI7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RTZXQKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRrZXktPmlzX2VudW0oKSkgewotICAgICAgcmV0dXJuICJJbnRTZXQiOwotICAgIH0KLSAgICByZXR1cm4gIk9iamVjdFNldDwgIiArIHR5cGVfbmFtZSh0a2V5KSArICI+IjsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiB0ZWxtID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHJldHVybiAiTGlzdDwgIiArIHR5cGVfbmFtZSh0ZWxtKSArICI+IjsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7Ci0gICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGhheGUgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIGhheGUgY29udGFpbmVyPwotICovCi1zdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsIGJvb2wgaW5fY29udGFpbmVyKSB7Ci0gICh2b2lkKWluX2NvbnRhaW5lcjsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJWb2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gImhheGUuaW8uQnl0ZXMiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJCb29sIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJoYXhlLkludDMyIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuICJoYXhlLkludDY0IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJGbG9hdCI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBIYXhlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSAidmFyICIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiIDogIiArIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIG9mc3RyZWFtIGR1bW15OwotICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2NhbGxiYWNrKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBzdGQ6OnN0cmluZyBvbl9lcnJvcl9zdWNjZXNzID0gIm9uRXJyb3IgOiBEeW5hbWljLT5Wb2lkID0gbnVsbCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModGZ1bmN0aW9uLCB0cnVlLCBmYWxzZSk7Ci0KLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpZiAoYXJndW1lbnRzICE9ICIiKSB7Ci0gICAgICBhcmd1bWVudHMgKz0gIiwgIjsKLSAgICB9Ci0gICAgYXJndW1lbnRzICs9IG9uX2Vycm9yX3N1Y2Nlc3M7IC8vIm9uRXJyb3IgOiBGdW5jdGlvbiwgb25TdWNjZXNzIDogRnVuY3Rpb24iOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gImZ1bmN0aW9uICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudHMgKyAiKSA6IFZvaWQiOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9ub3JtYWwodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKLQotICBzdGQ6OnN0cmluZyByZXN1bHR0eXBlOwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSB8fCB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdHR5cGUgPSAiVm9pZCI7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0dHlwZSA9IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gImZ1bmN0aW9uICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudHMgKyAiKSA6ICIgKyByZXN1bHR0eXBlOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiIDogIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGUuQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlLkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlLkk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGUuTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogSGF4ZSBjbGFzcyBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggdXBwZXJjYXNlIGxldHRlciwgYnV0IEhheGUgbmFtZXNwYWNlcyBtdXN0IG5vdC4KLSAqLwotc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLy8gdGVzdC5mb3IuR2VuZXJpYzwgZGF0YS5UeXBlLCBvci50aGUuTGlrZT4gYW5kIGhhbmRsZSBpdCByZWN1cnNpdmVseQotICBzaXplX3QgZ2VuZXJpY19maXJzdCA9IG5hbWUuZmluZCgnPCcpOwotICBzaXplX3QgZ2VuZXJpY19sYXN0ID0gbmFtZS5yZmluZCgnPicpOwotICBpZiAoKGdlbmVyaWNfZmlyc3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MpICYmIChnZW5lcmljX2xhc3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7Ci0gICAgc3RyaW5nIG91dGVyX3R5cGUgPSBuYW1lLnN1YnN0cigwLCBnZW5lcmljX2ZpcnN0KTsKLSAgICBzdHJpbmcgaW5uZXJfdHlwZXMgPSBuYW1lLnN1YnN0cihnZW5lcmljX2ZpcnN0ICsgMSwgZ2VuZXJpY19sYXN0IC0gZ2VuZXJpY19maXJzdCAtIDEpOwotCi0gICAgc3RyaW5nIG5ld19pbm5lciA9ICIiOwotICAgIHNpemVfdCBjb21tYV9zdGFydCA9IDA7Ci0gICAgd2hpbGUgKGNvbW1hX3N0YXJ0IDwgaW5uZXJfdHlwZXMubGVuZ3RoKCkpIHsKLSAgICAgIHNpemVfdCBjb21tYV9wb3MgPSBjb21tYV9zdGFydDsKLSAgICAgIGludCBuZXN0ZWQgPSAwOwotCi0gICAgICB3aGlsZSAoY29tbWFfcG9zIDwgaW5uZXJfdHlwZXMubGVuZ3RoKCkpIHsKLSAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgICAgICBzd2l0Y2ggKGlubmVyX3R5cGVzW2NvbW1hX3Bvc10pIHsKLSAgICAgICAgY2FzZSAnPCc6Ci0gICAgICAgICAgKytuZXN0ZWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJz4nOgotICAgICAgICAgIC0tbmVzdGVkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICcsJzoKLSAgICAgICAgICBmb3VuZCA9IChuZXN0ZWQgPT0gMCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZvdW5kKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKytjb21tYV9wb3M7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChuZXdfaW5uZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIG5ld19pbm5lciArPSAiLCI7Ci0gICAgICB9Ci0KLSAgICAgIHN0cmluZyBpbm5lciA9IGlubmVyX3R5cGVzLnN1YnN0cihjb21tYV9zdGFydCwgY29tbWFfcG9zIC0gY29tbWFfc3RhcnQpOwotICAgICAgbmV3X2lubmVyICs9IGdldF9jYXBfbmFtZShpbm5lcik7Ci0gICAgICBjb21tYV9zdGFydCA9ICsrY29tbWFfcG9zOwotICAgIH0KLQotICAgIHJldHVybiBnZXRfY2FwX25hbWUob3V0ZXJfdHlwZSkgKyAiPCIgKyBuZXdfaW5uZXIgKyAiPiI7Ci0gIH0KLQotICAvLyBwYWNrYWdlIG5hbWUKLSAgc2l6ZV90IGluZGV4ID0gbmFtZS5maW5kX2ZpcnN0X25vdF9vZigiIFxuXHJcdCIpOwotICBpZiAoaW5kZXggPCBuYW1lLmxlbmd0aCgpKSB7Ci0gICAgbmFtZVtpbmRleF0gPSB0b2xvd2VyKG5hbWVbaW5kZXhdKTsKLSAgICBpbmRleCA9IG5hbWUuZmluZCgnLicpOwotICAgIHdoaWxlIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgaWYgKCsraW5kZXggPCBuYW1lLmxlbmd0aCgpKSB7Ci0gICAgICAgIG5hbWVbaW5kZXhdID0gdG9sb3dlcihuYW1lW2luZGV4XSk7Ci0gICAgICB9Ci0gICAgICBpbmRleCA9IG5hbWUuZmluZCgnLicsIGluZGV4KTsKLSAgICB9Ci0gIH0KLQotICAvLyBjbGFzcyBuYW1lCi0gIGluZGV4ID0gbmFtZS5yZmluZCgnLicpOwotICBpZiAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICArK2luZGV4OwotICB9IGVsc2UgewotICAgIGluZGV4ID0gbmFtZS5maW5kX2ZpcnN0X25vdF9vZigiIFxuXHJcdCIpOwotICB9Ci0KLSAgaWYgKGluZGV4IDwgbmFtZS5sZW5ndGgoKSkgewotICAgIG5hbWVbaW5kZXhdID0gdG91cHBlcihuYW1lW2luZGV4XSk7Ci0gIH0KLQotICByZXR1cm4gbmFtZTsKLX0KLQotc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIGNvbnN0YW50X25hbWU7Ci0KLSAgYm9vbCBpc19maXJzdCA9IHRydWU7Ci0gIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKLSAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7Ci0gICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7Ci0KLSAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOwotCi0gICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKLSAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOwotICAgIH0KLSAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlzX2ZpcnN0ID0gZmFsc2U7Ci0gICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKLSAgfQotCi0gIHJldHVybiBjb25zdGFudF9uYW1lOwotfQotCi0vKioKLSAqIEVuYWJsZXMgUlRUSSBmb3IgYSBjbGFzcyBvciBpbnRlcmZhY2UKLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24ob2ZzdHJlYW0mIG91dCkgewotICBpZiAocnR0aV8pIHsKLSAgICBvdXQgPDwgIkA6cnR0aSIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEFkZHMgYnVpbGQgbWFjcm9zIHRvIGEgY2xhc3Mgb3IgaW50ZXJmYWNlCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbWFjcm9fZGVjb3JhdGlvbihvZnN0cmVhbSYgb3V0KSB7Ci0gIGlmICghYnVpbGRtYWNyb18uZW1wdHkoKSkgewotICAgIG91dCA8PCAiI2lmICEgbWFjcm8iIDw8IGVuZGw7Ci0gICAgb3V0IDw8ICJAOmJ1aWxkKCAiIDw8IGJ1aWxkbWFjcm9fIDw8ICIpIiA8PCBlbmRsOyAgICAgLy8gY3VycmVudCBjbGFzcy9pbnRlcmZhY2UKLSAgICBvdXQgPDwgIkA6YXV0b0J1aWxkKCAiIDw8IGJ1aWxkbWFjcm9fIDw8ICIpIiA8PCBlbmRsOyAvLyBpbmhlcml0ZWQgY2xhc3Nlcy9pbnRlcmZhY2VzCi0gICAgb3V0IDw8ICIjZW5kIiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBoYXhlRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9kb2Mob2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHRkb2MtPmdldF9kb2MoKSwgIiAqL1xuIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIGhheGVEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7Ci0gICAgc3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0gICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOwotICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgcC0+Z2V0X25hbWUoKTsKLSAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKLSAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKSB7Ci0gIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZC0+Z2V0X25hbWUoKSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKLSAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKLX0KLQotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKLSAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAvKiYmIHByb2dyYW0gIT0gcHJvZ3JhbV8qLykgewotICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIikgKyAiLiI7Ci0gIH0KLSAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAotICAgIGhheGUsCi0gICAgIkhheGUiLAotICAgICIgICAgY2FsbGJhY2tzICAgICAgICBVc2Ugb25FcnJvcigpL29uU3VjY2VzcygpIGNhbGxiYWNrcyBmb3Igc2VydmljZSBtZXRob2RzIChsaWtlIEFTMylcbiIKLSAgICAiICAgIHJ0dGkgICAgICAgICAgICAgRW5hYmxlIEA6cnR0aSBmb3IgZ2VuZXJhdGVkIGNsYXNzZXMgYW5kIGludGVyZmFjZXNcbiIKLSAgICAiICAgIGJ1aWxkbWFjcm89bXkubWFjcm9zLkNsYXNzLm1ldGhvZChhcmdzKVxuIgotICAgICIgICAgICAgICAgICAgICAgICAgICBBZGQgQDpidWlsZCBtYWNybyBjYWxscyB0byBnZW5lcmF0ZWQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlc1xuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjk3Mzk3Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKioKLSAqIEhhc2tlbGwgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2hzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X2hzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKXBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4taHMiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICBzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlbHBlciA9IGZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfYXJiaXRyYXJ5KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX3R5cGVtYXAob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfaHNfZGVmYXVsdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgbmFtZSA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgYXJnID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGFyZyA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIG5hbWUgPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcga2l0ZXIsIHN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdHJpbmcgaHNfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0cmluZyBoc19sYW5ndWFnZV9wcmFnbWEoKTsKLSAgc3RyaW5nIGhzX2ltcG9ydHMoKTsKLQotICBzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIHN0cmluZyBmdW5jdGlvbl9wcmVmaXggPSAiIik7Ci0KLSAgc3RyaW5nIGZpZWxkX25hbWUoc3RyaW5nIHRuYW1lLCBzdHJpbmcgZm5hbWUpOwotCi0gIHN0cmluZyBmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbnMgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbyA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIG1ldGhvZCA9IGZhbHNlKTsKLQotICBzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0cmluZyB0eXBlX3RvX2RlZmF1bHQodF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RyaW5nIHJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwgYm9vbCBuZWVkc19wYXJlbnMpOwotCi0gIHN0cmluZyB0eXBlX3RvX2NvbnN0cnVjdG9yKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0cmluZyByZW5kZXJfaHNfdHlwZV9mb3JfZnVuY3Rpb25fbmFtZSh0X3R5cGUqIHR5cGUpOwotCi1wcml2YXRlOgotICBvZnN0cmVhbSBmX3R5cGVzXzsKLSAgb2ZzdHJlYW0gZl9jb25zdHNfOwotICBvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBvZnN0cmVhbSBmX2lmYWNlXzsKLSAgb2ZzdHJlYW0gZl9jbGllbnRfOwotfTsKLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIHBuYW1lID0gY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKTsKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwbmFtZSArICJfVHlwZXMuaHMiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwbmFtZSArICJfQ29uc3RzLmhzIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgIm1vZHVsZSAiIDw8IHBuYW1lIDw8ICJfVHlwZXMgd2hlcmUiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIGZfY29uc3RzXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOwotICBmX2NvbnN0c18gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8ICJtb2R1bGUgIiA8PCBwbmFtZSA8PCAiX0NvbnN0cyB3aGVyZSIgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX2NvbnN0c18gPDwgImltcG9ydCAiIDw8IHBuYW1lIDw8ICJfVHlwZXMiIDw8IGVuZGw7Ci19Ci0KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfbGFuZ3VhZ2VfcHJhZ21hKCkgewotICByZXR1cm4gc3RyaW5nKAotICAgICAgInstIyBMQU5HVUFHRSBEZXJpdmVEYXRhVHlwZWFibGUgIy19XG4iCi0gICAgICAiey0jIExBTkdVQUdFIERlcml2ZUdlbmVyaWMgIy19XG4iCi0gICAgICAiey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfVxuIgotICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tbWlzc2luZy1maWVsZHMgIy19XG4iCi0gICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1taXNzaW5nLXNpZ25hdHVyZXMgIy19XG4iCi0gICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1uYW1lLXNoYWRvd2luZyAjLX1cbiIKLSAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLXVudXNlZC1pbXBvcnRzICMtfVxuIgotICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tdW51c2VkLW1hdGNoZXMgIy19XG4iKTsKLX0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuIHN0cmluZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpCi0gICAgICAgICArICItLSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIikgICAgICAgICAgICAgICAgICAgICAgLS1cbiIKLSAgICAgICAgICsgIi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tXG4iCi0gICAgICAgICArICItLSBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORyAtLVxuIgotICAgICAgICAgKyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfaW1wb3J0cygpIHsKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgc3RyaW5nIHJlc3VsdCA9IHN0cmluZygKLSAgICAgICJpbXBvcnQgUHJlbHVkZSAoKCQpLCAoLiksICg+Pj0pLCAoPT0pLCAoKyspKVxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgUHJlbHVkZSBhcyBQXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBDb250cm9sLkV4Y2VwdGlvbiBhcyBYXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBDb250cm9sLk1vbmFkIGFzIE0gKCBsaWZ0TSwgYXAsIHdoZW4gKVxuIgotICAgICAgImltcG9ydCBEYXRhLkZ1bmN0b3IgKCAoPCQ+KSApXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlNcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaGFibGUgYXMgSFxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5JbnQgYXMgSVxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXliZSBhcyBNIChjYXRNYXliZXMpXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZyBhcyBFICggZGVjb2RlVXRmOCwgZW5jb2RlVXRmOCApXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBMVFxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgR0hDLkdlbmVyaWNzIGFzIEcgKEdlbmVyaWMpXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlR5cGVhYmxlIGFzIFRZICggVHlwZWFibGUgKVxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXBcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXRcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvclxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGVzdC5RdWlja0NoZWNrLkFyYml0cmFyeSBhcyBRQyAoIEFyYml0cmFyeSguLikgKVxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGVzdC5RdWlja0NoZWNrIGFzIFFDICggZWxlbWVudHMgKVxuIgotICAgICAgIlxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0IGFzIFRcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRocmlmdC5UeXBlcyBhcyBUXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBUaHJpZnQuQXJiaXRyYXJpZXMgYXMgVFxuIgotICAgICAgIlxuIik7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkKLSAgICByZXN1bHQgKz0gImltcG9ydCBxdWFsaWZpZWQgIiArIGNhcGl0YWxpemUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl9UeXBlc1xuIjsKLQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkKLSAgICByZXN1bHQgKz0gIlxuIjsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gRXouCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIHN0cmluZyB0bmFtZSA9IGNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKTsKLSAgc3RyaW5nIHRkZWYgPSByZW5kZXJfaHNfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgZmFsc2UpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0eXBlICIgPDwgdG5hbWUgPDwgIiA9ICIgPDwgdGRlZiA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgImRhdGEgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiID0gIjsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBmX3R5cGVzXyA8PCAoZmlyc3QgPyAiIiA6ICJ8Iik7Ci0gICAgZl90eXBlc18gPDwgbmFtZTsKLSAgICBmaXJzdCA9IGZhbHNlOwotICB9Ci0gIGluZGVudChmX3R5cGVzXykgPDwgImRlcml2aW5nIChQLlNob3csIFAuRXEsIEcuR2VuZXJpYywgVFkuVHlwZWFibGUsIFAuT3JkLCBQLkJvdW5kZWQpIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpOwotCi0gIGluZGVudChmX3R5cGVzXykgPDwgImluc3RhbmNlIFAuRW51bSAiIDw8IGVuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJmcm9tRW51bSB0ID0gY2FzZSB0IG9mIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgbmFtZSA8PCAiIC0+ICIgPDwgdmFsdWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0b0VudW0gdCA9IGNhc2UgdCBvZiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8IHZhbHVlIDw8ICIgLT4gIiA8PCBuYW1lIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiXyAtPiBYLnRocm93IFQuVGhyaWZ0RXhjZXB0aW9uIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX3R5cGVzXykgPDwgImluc3RhbmNlIEguSGFzaGFibGUgIiA8PCBlbmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaGFzaFdpdGhTYWx0IHNhbHQgPSBILmhhc2hXaXRoU2FsdCBzYWx0IFAuLiBQLmZyb21FbnVtIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX3R5cGVzXykgPDwgImluc3RhbmNlIFFDLkFyYml0cmFyeSAiIDw8IGVuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJhcmJpdHJhcnkgPSBRQy5lbGVtZW50cyAoUC5lbnVtRnJvbVRvIFAubWluQm91bmQgUC5tYXhCb3VuZCkiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOwotCi0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgOjogIiA8PCByZW5kZXJfaHNfdHlwZSh0eXBlLCBmYWxzZSkgPDwgZW5kbDsKLSAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8IGVuZGw7Ci0gIGZfY29uc3RzXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IE5VTEwpCi0gICAgcmV0dXJuIHR5cGVfdG9fZGVmYXVsdCh0eXBlKTsKLQotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgb3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAiUC5UcnVlIiA6ICJQLkZhbHNlIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHRfZW51bSogdGVudW0gPSAodF9lbnVtKil0eXBlOwotICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICAgIGZvciAodmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsKLSAgICAgICAgICsrY19pdGVyKSB7Ci0gICAgICBpbnQgdmFsID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgIGlmICh2YWwgPT0gdmFsdWUtPmdldF9pbnRlZ2VyKCkpIHsKLSAgICAgICAgdF9wcm9ncmFtKiBwcm9nID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgICAgICAgaWYgKHByb2cgIT0gTlVMTCAmJiBwcm9nICE9IHByb2dyYW1fKQotICAgICAgICAgIG91dCA8PCBjYXBpdGFsaXplKHByb2ctPmdldF9uYW1lKCkpIDw8ICJfVHlwZXMuIjsKLSAgICAgICAgb3V0IDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHN0cmluZyBjbmFtZSA9IHR5cGVfbmFtZSh0eXBlKTsKLSAgICBvdXQgPDwgImRlZmF1bHRfIiA8PCBjbmFtZSA8PCAieyI7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlciA9IHZhbC5iZWdpbigpOwotICAgICAgICAgdl9pdGVyICE9IHZhbC5lbmQoKTsKLSAgICAgICAgICsrdl9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBmaWVsZCA9IE5VTEw7Ci0KLSAgICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7Ci0gICAgICAgICAgICsrZl9pdGVyKQotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkKLSAgICAgICAgICBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgICAgaWYgKGZpZWxkID09IE5VTEwpCi0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgY25hbWUgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotCi0gICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICBzdHJpbmcgY29uc3RfdmFsdWUgPSByZW5kZXJfY29uc3RfdmFsdWUoZmllbGQtPmdldF90eXBlKCksIHZfaXRlci0+c2Vjb25kKTsKLQotICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwgIik7Ci0gICAgICBvdXQgPDwgZmllbGRfbmFtZShjbmFtZSwgZm5hbWUpIDw8ICIgPSAiOwotICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fCAoKHRfdHlwZSopZmllbGQtPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIG91dCA8PCAiUC5KdXN0ICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgY29uc3RfdmFsdWU7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0KLQotICAgIG91dCA8PCAifSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICBvdXQgPDwgIihNYXAuZnJvbUxpc3QgWyI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgICAgb3V0IDw8ICIoIiA8PCBrZXkgPDwgIiwiIDw8IHZhbCA8PCAiKSI7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0KLSAgICBvdXQgPDwgIl0pIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSB0eXBlLT5pc19saXN0KCkgPyAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgaWYgKHR5cGUtPmlzX3NldCgpKQotICAgICAgb3V0IDw8ICIoU2V0LmZyb21MaXN0IFsiOwotICAgIGVsc2UKLSAgICAgIG91dCA8PCAiKFZlY3Rvci5mcm9tTGlzdCBbIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0KLQotICAgIG91dCA8PCAiXSkiOwotCi0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhICJzdHJ1Y3QiCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9oc19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QsIGJ1dCBhbHNvIGhhcyBhbiBleGNlcHRpb24gZGVjbGFyYXRpb24uCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9oc19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBIYXNrZWxsIHN0cnVjdAotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24sIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVscGVyKSB7Ci0gICh2b2lkKWhlbHBlcjsKLSAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIGluZGVudChvdXQpIDw8ICJkYXRhICIgPDwgdG5hbWUgPDwgIiA9ICIgPDwgdG5hbWU7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7Ci0gICAgICAgICArK21faXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ7ICI7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiLCAiOwotICAgICAgfQotICAgICAgc3RyaW5nIG1uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgb3V0IDw8IGZpZWxkX25hbWUodG5hbWUsIG1uYW1lKSA8PCAiIDo6ICI7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAotICAgICAgICAgIHx8ICgodF90eXBlKikoKm1faXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIG91dCA8PCAiUC5NYXliZSAiOwotICAgICAgfQotICAgICAgb3V0IDw8IHJlbmRlcl9oc190eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBvdXQgPDwgIiBkZXJpdmluZyAoUC5TaG93LFAuRXEsRy5HZW5lcmljLFRZLlR5cGVhYmxlKSIgPDwgZW5kbDsKLQotICBpZiAoaXNfZXhjZXB0aW9uKQotICAgIG91dCA8PCAiaW5zdGFuY2UgWC5FeGNlcHRpb24gIiA8PCB0bmFtZSA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJpbnN0YW5jZSBILkhhc2hhYmxlICIgPDwgdG5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJoYXNoV2l0aFNhbHQgc2FsdCByZWNvcmQgPSBzYWx0IjsKLSAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOwotICAgICAgICsrbV9pdGVyKSB7Ci0gICAgc3RyaW5nIG1uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8ICIgYEguaGFzaFdpdGhTYWx0YCAiIDw8IGZpZWxkX25hbWUodG5hbWUsIG1uYW1lKSA8PCAiIHJlY29yZCI7Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBnZW5lcmF0ZV9oc19zdHJ1Y3RfYXJiaXRyYXJ5KG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9oc190eXBlbWFwKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2hzX2RlZmF1bHQob3V0LCB0c3RydWN0KTsKLX0KLQotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X2FyYml0cmFyeShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAiaW5zdGFuY2UgUUMuQXJiaXRyYXJ5ICIgPDwgdG5hbWUgPDwgIiB3aGVyZSAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImFyYml0cmFyeSA9IE0ubGlmdE0gIiA8PCB0bmFtZTsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7Ci0gICAgICAgICArK21faXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG91dCA8PCAiICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiYE0uYXBgIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiKCI7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAotICAgICAgICAgIHx8ICgodF90eXBlKikoKm1faXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIG91dCA8PCAiTS5saWZ0TSBQLkp1c3QgIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiUUMuYXJiaXRyYXJ5KSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIC8vIFNocmluawotICAgIGluZGVudChvdXQpIDw8ICJzaHJpbmsgb2JqIHwgb2JqID09IGRlZmF1bHRfIiA8PCB0bmFtZSA8PCAiID0gW10iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICAgICAgICAgfCBQLm90aGVyd2lzZSA9IE0uY2F0TWF5YmVzIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7Ci0gICAgICAgICArK21faXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJbICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiLCAiOwotICAgICAgfQotICAgICAgc3RyaW5nIGZuYW1lID0gZmllbGRfbmFtZSh0bmFtZSwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgIG91dCA8PCAiaWYgb2JqID09IGRlZmF1bHRfIiA8PCB0bmFtZTsKLSAgICAgIG91dCA8PCAieyIgPDwgZm5hbWUgPDwgIiA9ICIgPDwgZm5hbWUgPDwgIiBvYmp9ICI7Ci0gICAgICBvdXQgPDwgInRoZW4gUC5Ob3RoaW5nICI7Ci0gICAgICBvdXQgPDwgImVsc2UgUC5KdXN0ICQgZGVmYXVsdF8iIDw8IHRuYW1lOwotICAgICAgb3V0IDw8ICJ7IiA8PCBmbmFtZSA8PCAiID0gIiA8PCBmbmFtZSA8PCAiIG9ian0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJdIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSB7IC8qIDAgPT0gbWVtYmVycy5zaXplKCkgKi8KLSAgICBpbmRlbnQob3V0KSA8PCAiYXJiaXRyYXJ5ID0gUUMuZWxlbWVudHMgWyIgPDwgdG5hbWUgPDwgIl0iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgc25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIHN0cmluZyBpZCA9IHRtcCgiX2lkIik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLQotICBpbmRlbnQob3V0KSA8PCAidG9fIiA8PCBzbmFtZSA8PCAiIDo6IFQuVGhyaWZ0VmFsIC0+ICIgPDwgc25hbWUgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInRvXyIgPDwgc25hbWUgPDwgIiAoVC5UU3RydWN0IGZpZWxkcykgPSAiIDw8IHNuYW1lIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbnQzMl90IGtleSA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotICAgIHN0cmluZyBldHlwZSA9IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIHN0cmluZyBmbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIEZpbGwgaW4gRmllbGQKLSAgICBpbmRlbnQob3V0KSA8PCBmaWVsZF9uYW1lKHNuYW1lLCBmbmFtZSkgPDwgIiA9ICI7Ci0KLSAgICBvdXQgPDwgIlAubWF5YmUgKCI7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIG91dCA8PCAiUC5lcnJvciBcIk1pc3NpbmcgcmVxdWlyZWQgZmllbGQ6ICIgPDwgZm5hbWUgPDwgIlwiIjsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKCgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCi0gICAgICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSAmJiAoKmZfaXRlciktPmdldF92YWx1ZSgpID09IE5VTEwpIHsKLSAgICAgICAgb3V0IDw8ICJQLk5vdGhpbmciOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IGZpZWxkX25hbWUoc25hbWUsIGZuYW1lKSA8PCAiIGRlZmF1bHRfIiA8PCBzbmFtZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIpICI7Ci0KLSAgICBvdXQgPDwgIihcXChfLCIgPDwgdmFsIDw8ICIpIC0+ICI7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKLSAgICAgICAgfHwgKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpCi0gICAgICBvdXQgPDwgIlAuSnVzdCAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgdmFsKTsKLSAgICBvdXQgPDwgIikiOwotICAgIG91dCA8PCAiIChNYXAubG9va3VwICgiIDw8IGtleSA8PCAiKSBmaWVsZHMpIjsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyByZWFkCi0gIHN0cmluZyB0bWFwID0gdHlwZV9uYW1lKHRzdHJ1Y3QsICJ0eXBlbWFwXyIpOwotICBpbmRlbnQob3V0KSA8PCAidG9fIiA8PCBzbmFtZSA8PCAiIF8gPSBQLmVycm9yIFwibm90IGEgc3RydWN0XCIiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiIDo6IChULlRyYW5zcG9ydCB0LCBULlByb3RvY29sIHApID0+IHAgdCAtPiBQLklPICIgPDwgc25hbWUKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiIGlwcm90ID0gdG9fIiA8PCBzbmFtZTsKLSAgb3V0IDw8ICIgPCQ+IFQucmVhZFZhbCBpcHJvdCAoVC5UX1NUUlVDVCAiIDw8IHRtYXAgPDwgIikiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlY29kZV8iIDw8IHNuYW1lCi0gICAgICAgICAgICAgIDw8ICIgOjogKFQuUHJvdG9jb2wgcCwgVC5UcmFuc3BvcnQgdCkgPT4gcCB0IC0+IExCUy5CeXRlU3RyaW5nIC0+ICIgPDwgc25hbWUgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImRlY29kZV8iIDw8IHNuYW1lIDw8ICIgaXByb3QgYnMgPSB0b18iIDw8IHNuYW1lIDw8ICIgJCAiOwotICBvdXQgPDwgIlQuZGVzZXJpYWxpemVWYWwgaXByb3QgKFQuVF9TVFJVQ1QgIiA8PCB0bWFwIDw8ICIpIGJzIiA8PCBlbmRsOwotfQotCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7Ci0gIHN0cmluZyBmID0gdG1wKCJfZiIpOwotICBzdHJpbmcgdiA9IHRtcCgiX3YiKTsKLQotICBpbmRlbnQob3V0KSA8PCAiZnJvbV8iIDw8IG5hbWUgPDwgIiA6OiAiIDw8IG5hbWUgPDwgIiAtPiBULlRocmlmdFZhbCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImZyb21fIiA8PCBuYW1lIDw8ICIgcmVjb3JkID0gVC5UU3RydWN0ICQgTWFwLmZyb21MaXN0ICI7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEdldCBFeGNlcHRpb25zCi0gIGJvb2wgaGFzRXhuID0gZmFsc2U7Ci0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBoYXNFeG4gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBpc2ZpcnN0ID0gdHJ1ZTsKLSAgaWYgKGhhc0V4bikgewotICAgIG91dCA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIobGV0IGV4bnMgPSBNLmNhdE1heWJlcyAiOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7Ci0gICAgICAgICArK2ZfaXRlcikgewotICAgICAgaWYgKCgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIGlmIChpc2ZpcnN0KSB7Ci0gICAgICAgICAgb3V0IDw8ICJbICI7Ci0gICAgICAgICAgaXNmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIHN0cmluZyBtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgaW50MzJfdCBrZXkgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKLSAgICAgICAgb3V0IDw8ICIoXFwiIDw8IHYgPDwgIiAtPiAoIiA8PCBrZXkgPDwgIiwgKFwiIiA8PCBtbmFtZSA8PCAiXCIsIjsKLSAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCAoKmZfaXRlciktPmdldF90eXBlKCksIHYpOwotICAgICAgICBvdXQgPDwgIikpKSA8JD4gIiA8PCBmaWVsZF9uYW1lKG5hbWUsIG1uYW1lKSA8PCAiIHJlY29yZCI7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghaXNmaXJzdCkgewotICAgICAgb3V0IDw8ICJdIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJpbiBpZiBQLm5vdCAoUC5udWxsIGV4bnMpIHRoZW4gZXhucyBlbHNlICI7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICIkICI7Ci0gIH0KLQotICBvdXQgPDwgIk0uY2F0TWF5YmVzIiA8PCBlbmRsOwotICAvLyBHZXQgdGhlIFJlc3QKLSAgaXNmaXJzdCA9IHRydWU7Ci0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgaWYgKGlzZmlyc3QpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbICI7Ci0gICAgICBpc2ZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIsICI7Ci0gICAgfQotICAgIHN0cmluZyBtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBpbnQzMl90IGtleSA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotICAgIG91dCA8PCAiKFxcIjsKLSAgICBvdXQgPDwgdiA8PCAiIC0+ICI7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwKLSAgICAgICAgJiYgISgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBvdXQgPDwgIlAuSnVzdCAiOwotICAgIH0KLSAgICBvdXQgPDwgIigiIDw8IGtleSA8PCAiLCAoXCIiIDw8IG1uYW1lIDw8ICJcIiwiOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCB2KTsKLSAgICBvdXQgPDwgIikpKSAiOwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMCi0gICAgICAgICYmICEoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgb3V0IDw8ICIkIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICI8JD4iOwotICAgIH0KLSAgICBvdXQgPDwgIiAiIDw8IGZpZWxkX25hbWUobmFtZSwgbW5hbWUpIDw8ICIgcmVjb3JkIiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgaWYgKGlzZmlyc3QpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiW10iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIl0iIDw8IGVuZGw7Ci0gIH0KLSAgaWYgKGhhc0V4bikgewotICAgIGluZGVudChvdXQpIDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyB3cml0ZQotICBpbmRlbnQob3V0KSA8PCAid3JpdGVfIiA8PCBuYW1lIDw8ICIgOjogKFQuUHJvdG9jb2wgcCwgVC5UcmFuc3BvcnQgdCkgPT4gcCB0IC0+ICIgPDwgbmFtZQotICAgICAgICAgICAgICA8PCAiIC0+IFAuSU8gKCkiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ3cml0ZV8iIDw8IG5hbWUgPDwgIiBvcHJvdCByZWNvcmQgPSBULndyaXRlVmFsIG9wcm90ICQgZnJvbV8iOwotICBvdXQgPDwgbmFtZSA8PCAiIHJlY29yZCIgPDwgZW5kbDsKLQotICAvLyBlbmNvZGUKLSAgaW5kZW50KG91dCkgPDwgImVuY29kZV8iIDw8IG5hbWUgPDwgIiA6OiAoVC5Qcm90b2NvbCBwLCBULlRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gIiA8PCBuYW1lCi0gICAgICAgICAgICAgIDw8ICIgLT4gTEJTLkJ5dGVTdHJpbmciIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJlbmNvZGVfIiA8PCBuYW1lIDw8ICIgb3Byb3QgcmVjb3JkID0gVC5zZXJpYWxpemVWYWwgb3Byb3QgJCAiOwotICBvdXQgPDwgImZyb21fIiA8PCBuYW1lIDw8ICIgcmVjb3JkIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICIuaHMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIiB3aGVyZSIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgcXVhbGlmaWVkICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0IHF1YWxpZmllZCAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIl9JZmFjZSBhcyBJZmFjZSIgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICItLSBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIC0tIiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmaWVsZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgInJlc3VsdCIpKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLQotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLQotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0KLSAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBtYXAgZnJvbSBmaWVsZCBuYW1lcyB0byAodHlwZSwgaWQpCi0gKiBAcGFyYW0gdHN0cnVjdCB0aGUgU3RydWN0Ci0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3R5cGVtYXAob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgInR5cGVtYXBfIiA8PCBuYW1lIDw8ICIgOjogVC5UeXBlTWFwIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidHlwZW1hcF8iIDw8IG5hbWUgPDwgIiA9IE1hcC5mcm9tTGlzdCBbIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGlmICghZmlyc3QpIHsKLSAgICAgIG91dCA8PCAiLCI7Ci0gICAgfQotCi0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7Ci0gICAgb3V0IDw8ICIoIiA8PCBrZXkgPDwgIiwoXCIiIDw8IG1uYW1lIDw8ICJcIiwiIDw8IHR5cGVfdG9fZW51bSh0eXBlKSA8PCAiKSkiOwotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLSAgb3V0IDw8ICJdIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIGdlbmVyYXRlIHRoZSBzdHJ1Y3Qgd2l0aCBkZWZhdWx0IHZhbHVlcyBmaWxsZWQgaW4KLSAqIEBwYXJhbSB0c3RydWN0IHRoZSBTdHJ1Y3QKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfZGVmYXVsdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgc3RyaW5nIGZuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsICJkZWZhdWx0XyIpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLQotICBpbmRlbnQob3V0KSA8PCBmbmFtZSA8PCAiIDo6ICIgPDwgbmFtZSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCBmbmFtZSA8PCAiID0gIiA8PCBuYW1lIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9ICgqZl9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgZmllbGRfbmFtZShuYW1lLCBtbmFtZSkgPDwgIiA9ICI7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKLSAgICAgICAgfHwgKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIG91dCA8PCAiUC5Ob3RoaW5nIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiUC5KdXN0ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Ci0gICAgfQotICB9Ci0gIG91dCA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX2lmYWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJfSWZhY2UuaHMiOwotICBmX2lmYWNlXy5vcGVuKGZfaWZhY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX2lmYWNlXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOwotICBmX2lmYWNlXyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIGZfaWZhY2VfIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJfSWZhY2Ugd2hlcmUiIDw8IGVuZGw7Ci0KLSAgZl9pZmFjZV8gPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7Ci0gIGZfaWZhY2VfIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfVHlwZXMiIDw8IGVuZGw7Ci0gIGZfaWZhY2VfIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIHNuYW1lID0gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKTsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBzdHJpbmcgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0KLSAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJpbXBvcnQgIiA8PCBleHRlbmRzIDw8ICJfSWZhY2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfaWZhY2VfKSA8PCAiY2xhc3MgIiA8PCBleHRlbmRzIDw8ICJfSWZhY2UgYSA9PiAiIDw8IHNuYW1lIDw8ICJfSWZhY2UgYSB3aGVyZSIgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIGluZGVudChmX2lmYWNlXykgPDwgImNsYXNzICIgPDwgc25hbWUgPDwgIl9JZmFjZSBhIHdoZXJlIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ0ID0gZnVuY3Rpb25fdHlwZSgqZl9pdGVyLCB0cnVlLCB0cnVlLCB0cnVlKTsKLSAgICBpbmRlbnQoZl9pZmFjZV8pIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOjogYSAtPiAiIDw8IGZ0IDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX2lmYWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uIE5vdGUgdGhhdCBpbiBIYXNrZWxsLCB0aGUgY2xpZW50IGRvZXNuJ3QgaW1wbGVtZW50IGlmYWNlLgotICpUaGlzIGlzIGJlY2F1c2UKLSAqIFRoZSBjbGllbnQgZG9lcyBub3QgKGFuZCBzaG91bGQgbm90IGhhdmUgdG8pIGRlYWwgd2l0aCBhcmd1bWVudHMgYmVpbmcgTm90aGluZy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX2NsaWVudF9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiX0NsaWVudC5ocyI7Ci0gIGZfY2xpZW50Xy5vcGVuKGZfY2xpZW50X25hbWUuY19zdHIoKSk7Ci0gIGZfY2xpZW50XyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOwotICBmX2NsaWVudF8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXhwb3J0cyA9ICIiOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGV4cG9ydHMgKz0gKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGV4cG9ydHMgKz0gZGVjYXBpdGFsaXplKGZ1bm5hbWUpOwotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLQotICBzdHJpbmcgc25hbWUgPSBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pOwotICBpbmRlbnQoZl9jbGllbnRfKSA8PCAibW9kdWxlICIgPDwgc25hbWUgPDwgIl9DbGllbnQoIiA8PCBleHBvcnRzIDw8ICIpIHdoZXJlIiA8PCBlbmRsOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGV4dGVuZHMgPDwgIl9DbGllbnQiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLklPUmVmIGFzIFIiIDw8IGVuZGw7Ci0gIGluZGVudChmX2NsaWVudF8pIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOwotICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCBlbmRsOwotCi0gIC8vIERBVFMgUklURSBBIEdMT0JBTCBWQVIKLSAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlcWlkID0gUi5uZXdJT1JlZiAwIiA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIHN0cmluZyBmYXJncyA9ICIiOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKQotICAgICAgZmFyZ3MgKz0gIiBhcmdfIiArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX2NsaWVudF8pIDw8IGRlY2FwaXRhbGl6ZShmdW5uYW1lKSA8PCAiIChpcCxvcCkiIDw8IGZhcmdzIDw8ICIgPSBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiBvcCIgPDwgZmFyZ3M7Ci0KLSAgICBmX2NsaWVudF8gPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkKLSAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiIGlwIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiIG9wIiA8PCBmYXJncyA8PCAiID0gZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxIDwtIHNlcWlkIiA8PCBlbmRsOwotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZXFuIDwtIFIucmVhZElPUmVmIHNlcSIgPDwgZW5kbDsKLSAgICBzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIHN0cmluZyBmbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgbXNnVHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVC5NX09ORVdBWSIgOiAiVC5NX0NBTEwiOwotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJULndyaXRlTWVzc2FnZUJlZ2luIG9wIChcIiIgPDwgZm5hbWUgPDwgIlwiLCAiIDw8IG1zZ1R5cGUgPDwgIiwgc2VxbikiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAid3JpdGVfIiA8PCBhcmdzbmFtZSA8PCAiIG9wICgiIDw8IGFyZ3NuYW1lIDw8ICJ7IjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOwotICAgICAgICAgKytmbGRfaXRlcikgewotICAgICAgc3RyaW5nIGZpZWxkbmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgZl9jbGllbnRfIDw8IChmaXJzdCA/ICIiIDogIiwiKTsKLSAgICAgIGZfY2xpZW50XyA8PCBmaWVsZF9uYW1lKGFyZ3NuYW1lLCBmaWVsZG5hbWUpIDw8ICI9IjsKLSAgICAgIGlmICgoKmZsZF9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKLSAgICAgICAgICB8fCAoKHRfdHlwZSopKCpmbGRfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKQotICAgICAgICBmX2NsaWVudF8gPDwgIlAuSnVzdCAiOwotICAgICAgZl9jbGllbnRfIDw8ICJhcmdfIiA8PCBmaWVsZG5hbWU7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0KLSAgICBmX2NsaWVudF8gPDwgIn0pIiA8PCBlbmRsOwotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJULndyaXRlTWVzc2FnZUVuZCBvcCIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiVC50Rmx1c2ggKFQuZ2V0VHJhbnNwb3J0IG9wKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHN0cmluZyBmdW5uYW1lID0gc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgZnVubmFtZSwgJm5vYXJncyk7Ci0KLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGluZGVudChmX2NsaWVudF8pIDw8IGZ1bm5hbWUgPDwgIiBpcCA9IGRvIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICIoZm5hbWUsIG10eXBlLCByc2VxaWQpIDwtIFQucmVhZE1lc3NhZ2VCZWdpbiBpcCIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJNLndoZW4gKG10eXBlID09IFQuTV9FWENFUFRJT04pICQgZG8geyBleG4gPC0gVC5yZWFkQXBwRXhuIGlwIDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlQucmVhZE1lc3NhZ2VFbmQgaXAgOyBYLnRocm93IGV4biB9IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAicmVzIDwtIHJlYWRfIiA8PCByZXN1bHRuYW1lIDw8ICIgaXAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiVC5yZWFkTWVzc2FnZUVuZCBpcCIgPDwgZW5kbDsKLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLQotICAgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsKLSAgICAgICAgICAgKyt4X2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlAubWF5YmUgKFAucmV0dXJuICgpKSBYLnRocm93ICgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIHJlcykiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCi0gICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJQLnJldHVybiAkICIgPDwgZmllbGRfbmFtZShyZXN1bHRuYW1lLCAic3VjY2VzcyIpIDw8ICIgcmVzIiA8PCBlbmRsOwotICAgICAgZWxzZQotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiUC5yZXR1cm4gKCkiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLSAgfQotCi0gIGZfY2xpZW50Xy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCi0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSA9IGNhc2UgbmFtZSBvZiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJcIiIgPDwgZm5hbWUgPDwgIlwiIC0+IHByb2Nlc3NfIiA8PCBkZWNhcGl0YWxpemUoZm5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIgKHNlcWlkLGlwcm90LG9wcm90LGhhbmRsZXIpIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfIC0+ICI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpCi0gICAgICAgICAgICAgICA8PCAiLnByb2NfIGhhbmRsZXIgKGlwcm90LG9wcm90KSAobmFtZSx0eXAsc2VxaWQpIiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfIDwtIFQucmVhZFZhbCBpcHJvdCAoVC5UX1NUUlVDVCBNYXAuZW1wdHkpIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2VCZWdpbiBvcHJvdCAobmFtZSxULk1fRVhDRVBUSU9OLHNlcWlkKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVBcHBFeG4gb3Byb3QgKFQuQXBwRXhuIFQuQUVfVU5LTk9XTl9NRVRIT0QgKFwiVW5rbm93biBmdW5jdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcIiArKyBMVC51bnBhY2sgbmFtZSkpIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2VFbmQgb3Byb3QiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULnRGbHVzaCAoVC5nZXRUcmFuc3BvcnQgb3Byb3QpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzIGhhbmRsZXIgKGlwcm90LCBvcHJvdCkgPSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIobmFtZSwgdHlwLCBzZXFpZCkgPC0gVC5yZWFkTWVzc2FnZUJlZ2luIGlwcm90IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2NfIGhhbmRsZXIgKGlwcm90LG9wcm90KSAobmFtZSx0eXAsc2VxaWQpIiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQucmVhZE1lc3NhZ2VFbmQgaXByb3QiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gUC5UcnVlIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi1ib29sIGhhc05vQXJndW1lbnRzKHRfZnVuY3Rpb24qIGZ1bmMpIHsKLSAgcmV0dXJuIChmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpOwotfQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9oc190eXBlX2Zvcl9mdW5jdGlvbl9uYW1lKHRfdHlwZSogdHlwZSkgewotICBzdHJpbmcgdHlwZV9zdHIgPSByZW5kZXJfaHNfdHlwZSh0eXBlLCBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZm91bmQgPSAtMTsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIGZvdW5kID0gdHlwZV9zdHIuZmluZF9maXJzdF9vZigiW10uICIsIGZvdW5kICsgMSk7Ci0gICAgaWYgKHN0cmluZzo6bnBvcyA9PSBzaXplX3QoZm91bmQpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAodHlwZV9zdHJbZm91bmRdID09ICcuJykKLSAgICAgIHR5cGVfc3RyW2ZvdW5kXSA9ICdfJzsKLSAgICBlbHNlCi0gICAgICB0eXBlX3N0cltmb3VuZF0gPSAnWic7Ci0gIH0KLSAgcmV0dXJuIHR5cGVfc3RyOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKXRzZXJ2aWNlOwotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIHN0cmluZyBmdW5uYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc18iIDw8IGZ1bm5hbWUgPDwgIiAoc2VxaWQsIGlwcm90LCBvcHJvdCwgaGFuZGxlcikgPSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3MgPC0gcmVhZF8iIDw8IGFyZ3NuYW1lIDw8ICIgaXByb3QiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgc2l6ZV90IG4gPSB4Y2VwdGlvbnMuc2l6ZSgpICsgMTsKLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAobiA+IDApIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoWC5jYXRjaCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgfQotCi0gIGlmIChuID4gMCkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKGRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKTsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQotICAgIGZfc2VydmljZV8gPDwgInZhbCA8LSAiOwotCi0gIGZfc2VydmljZV8gPDwgIklmYWNlLiIgPDwgZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIiBoYW5kbGVyIjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCi0gICAgZl9zZXJ2aWNlXyA8PCAiICgiIDw8IGZpZWxkX25hbWUoYXJnc25hbWUsICgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiBhcmdzKSI7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImxldCByZXMgPSBkZWZhdWx0XyIgPDwgcmVzdWx0bmFtZSA8PCAieyIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZShyZXN1bHRuYW1lLCAic3VjY2VzcyIpIDw8ICIgPSB2YWx9IjsKLQotICB9IGVsc2UgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibGV0IHJlcyA9IGRlZmF1bHRfIiA8PCByZXN1bHRuYW1lOwotICB9Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gKCkiOwotICB9IGVsc2UgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2VCZWdpbiBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsIFQuTV9SRVBMWSwgc2VxaWQpIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid3JpdGVfIiA8PCByZXN1bHRuYW1lIDw8ICIgb3Byb3QgcmVzIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2VFbmQgb3Byb3QiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULnRGbHVzaCAoVC5nZXRUcmFuc3BvcnQgb3Byb3QpIjsKLSAgfQotICBpZiAobiA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpZiAobiA+IDApIHsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoXFxlICAtPiBkbyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJsZXQgcmVzID0gZGVmYXVsdF8iIDw8IHJlc3VsdG5hbWUgPDwgInsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IFAuSnVzdCBlfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2VCZWdpbiBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBULk1fUkVQTFksIHNlcWlkKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZV8iIDw8IHJlc3VsdG5hbWUgPDwgIiBvcHJvdCByZXMiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2VFbmQgb3Byb3QiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC50Rmx1c2ggKFQuZ2V0VHJhbnNwb3J0IG9wcm90KSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuICgpIjsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PCAiKSkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKFxcXyAtPiBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZUJlZ2luIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBULk1fRVhDRVBUSU9OLCBzZXFpZCkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVBcHBFeG4gb3Byb3QgKFQuQXBwRXhuIFQuQUVfVU5LTk9XTiBcIlwiKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2VFbmQgb3Byb3QiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQudEZsdXNoIChULmdldFRyYW5zcG9ydCBvcHJvdCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuICgpIjsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIDo6IFguU29tZUV4Y2VwdGlvbiAtPiBQLklPICgpKSkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewotICAodm9pZClwcmVmaXg7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsIHR5cGUsIHByZWZpeCk7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgYXJnKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIG91dCA8PCAiKGNhc2UgIiA8PCBhcmcgPDwgIiBvZiB7IiA8PCB0eXBlX3RvX2NvbnN0cnVjdG9yKHR5cGUpIDw8ICIgIiA8PCB2YWwgPDwgIiAtPiAiOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpCi0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCB2YWwpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCB2YWwpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiAhKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBvdXQgPDwgIkUuZGVjb2RlVXRmOCAiOwotICAgIH0KLSAgICBvdXQgPDwgdmFsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCAiUC50b0VudW0gJCBQLmZyb21JbnRlZ3JhbCAiIDw8IHZhbDsKLQotICB9IGVsc2UgewotICAgIHRocm93ICJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgVFlQRSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICBvdXQgPDwgIjsgXyAtPiBQLmVycm9yIFwid3JvbmcgdHlwZVwifSkiOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBuYW1lKSB7Ci0KLSAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgInRvXyIpIDw8ICIgKFQuVFN0cnVjdCAiIDw8IG5hbWUgPDwgIikpIjsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQotICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBhcmcpIHsKLQotICBzdHJpbmcgdmFsID0gdG1wKCJfdiIpOwotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBrZXkgPSB0bXAoIl9rIik7Ci0gICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0ICQgUC5tYXAgKFxcKCIgPDwga2V5IDw8ICIsIiA8PCB2YWwgPDwgIikgLT4gKCI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0KLSAgICBvdXQgPDwgIiwiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gICAgb3V0IDw8ICIpKSAiIDw8IGFyZyA8PCAiKSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgIihTZXQuZnJvbUxpc3QgJCBQLm1hcCAoXFwiIDw8IHZhbCA8PCAiIC0+ICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHZhbCk7Ci0gICAgb3V0IDw8ICIpICIgPDwgYXJnIDw8ICIpIjsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgIihWZWN0b3IuZnJvbUxpc3QgJCBQLm1hcCAoXFwiIDw8IHZhbCA8PCAiIC0+ICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHZhbCk7Ci0gICAgb3V0IDw8ICIpICIgPDwgYXJnIDw8ICIpIjsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgbmFtZSkgewotCi0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpCi0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFIjsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIG91dCA8PCB0eXBlX3RvX2NvbnN0cnVjdG9yKHR5cGUpIDw8ICIgIjsKLSAgICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgJiYgISgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICBvdXQgPDwgIiQgRS5lbmNvZGVVdGY4ICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgbmFtZTsKLQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOwotICAgICAgb3V0IDw8ICJULlRJMzIgJCBQLmZyb21JbnRlZ3JhbCAkIFAuZnJvbUVudW0gIiA8PCBuYW1lOwotICAgIH0KLQotICB9IGVsc2UgewotICAgIHRocm93ICJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEIE9GIFRZUEUgIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCwgImZyb21fIikgPDwgIiAiIDw8IHByZWZpeDsKLX0KLQotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrID0gdG1wKCJfayIpOwotICBzdHJpbmcgdiA9IHRtcCgiX3YiKTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJULlRNYXAgIiA8PCB0eXBlX3RvX2VudW0oa3R5cGUpIDw8ICIgIiA8PCB0eXBlX3RvX2VudW0odnR5cGUpOwotICAgIG91dCA8PCAiICQgUC5tYXAgKFxcKCIgPDwgayA8PCAiLCIgPDwgdiA8PCAiKSAtPiAoIjsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsIGt0eXBlLCBrKTsKLSAgICBvdXQgPDwgIiwgIjsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsIHZ0eXBlLCB2KTsKLSAgICBvdXQgPDwgIikpICQgTWFwLnRvTGlzdCAiIDw8IHByZWZpeDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCAiVC5UU2V0ICIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgb3V0IDw8ICIgJCBQLm1hcCAoXFwiIDw8IHYgPDwgIiAtPiAiOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB2KTsKLSAgICBvdXQgPDwgIikgJCBTZXQudG9MaXN0ICIgPDwgcHJlZml4OwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PCAiVC5UTGlzdCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIG91dCA8PCAiICQgUC5tYXAgKFxcIiA8PCB2IDw8ICIgLT4gIjsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdik7Ci0gICAgb3V0IDw8ICIpICQgVmVjdG9yLnRvTGlzdCAiIDw8IHByZWZpeDsKLSAgfQotfQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgb3B0aW9ucywgYm9vbCBpbywgYm9vbCBtZXRob2QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCi0gICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKQotICAgICAgcmVzdWx0ICs9ICJQLk1heWJlICI7Ci0gICAgcmVzdWx0ICs9IHJlbmRlcl9oc190eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgb3B0aW9ucyk7Ci0gICAgcmVzdWx0ICs9ICIgLT4gIjsKLSAgfQotCi0gIGlmIChmaWVsZHMuZW1wdHkoKSAmJiAhbWV0aG9kKQotICAgIHJlc3VsdCArPSAiKCkgLT4gIjsKLQotICBpZiAoaW8pCi0gICAgcmVzdWx0ICs9ICJQLklPICI7Ci0KLSAgcmVzdWx0ICs9IHJlbmRlcl9oc190eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLCBpbyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIHN0cmluZyBmdW5jdGlvbl9wcmVmaXgpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLQotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pCi0gICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKQotICAgICAgcHJlZml4ID0gY2FwaXRhbGl6ZShwcm9ncmFtLT5nZXRfbmFtZSgpKSArICJfVHlwZXMuIjsKLQotICByZXR1cm4gcHJlZml4ICsgZnVuY3Rpb25fcHJlZml4ICsgY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7Ci19Ci0KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6ZmllbGRfbmFtZShzdHJpbmcgdG5hbWUsIHN0cmluZyBmbmFtZSkgewotICByZXR1cm4gZGVjYXBpdGFsaXplKHRuYW1lKSArICJfIiArIGZuYW1lOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHJvdG9jb2wudF90eXBlIGVudW0KLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJULlRfVk9JRCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlQuVF9TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVC5UX0JPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVC5UX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJULlRfSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVC5UX0kzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlQuVF9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJULlRfRE9VQkxFIjsKLSAgICB9Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlQuVF9JMzIiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiKFQuVF9TVFJVQ1QgIiArIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUsICJ0eXBlbWFwXyIpICsgIikiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga3R5cGUgPSB0eXBlX3RvX2VudW0oKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICBzdHJpbmcgdnR5cGUgPSB0eXBlX3RvX2VudW0oKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICByZXR1cm4gIihULlRfTUFQICIgKyBrdHlwZSArICIgIiArIHZ0eXBlICsgIikiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIihULlRfU0VUICIgKyB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICIoVC5UX0xJU1QgIiArIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBkZWZhdWx0IHZhbHVlCi0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV90b19kZWZhdWx0KHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAiUC5lcnJvciBcIk5vIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVF9WT0lEXCIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJcIlwiIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlAuRmFsc2UiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiMCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIjAiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICIwIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiMCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIjAiOwotICAgIH0KLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiKFAudG9FbnVtIDApIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSwgImRlZmF1bHRfIik7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiTWFwLmVtcHR5IjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJTZXQuZW1wdHkiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJWZWN0b3IuZW1wdHkiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2RlZmF1bHQ6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIGhhc2tlbGwgdHlwZQotICovCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwgYm9vbCBuZWVkc19wYXJlbnMpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0cmluZyB0eXBlX3JlcHI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gIigpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpID8gIkxCUy5CeXRlU3RyaW5nIiA6ICJMVC5UZXh0Iik7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJQLkJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiSS5JbnQ4IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiSS5JbnQxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIkkuSW50MzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJJLkludDY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiUC5Eb3VibGUiOwotICAgIH0KLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiB0eXBlX25hbWUoKHRfZW51bSopdHlwZSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgdHlwZV9yZXByID0gIk1hcC5IYXNoTWFwICIgKyByZW5kZXJfaHNfdHlwZShrdHlwZSwgdHJ1ZSkgKyAiICIgKyByZW5kZXJfaHNfdHlwZSh2dHlwZSwgdHJ1ZSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHR5cGVfcmVwciA9ICJTZXQuSGFzaFNldCAiICsgcmVuZGVyX2hzX3R5cGUoZXR5cGUsIHRydWUpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHR5cGVfcmVwciA9ICJWZWN0b3IuVmVjdG9yICIgKyByZW5kZXJfaHNfdHlwZShldHlwZSwgdHJ1ZSk7Ci0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICByZXR1cm4gbmVlZHNfcGFyZW5zID8gIigiICsgdHlwZV9yZXByICsgIikiIDogdHlwZV9yZXByOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgaGFza2VsbCBjb25zdHJ1Y3RvcgotICovCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfdG9fY29uc3RydWN0b3IodF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImludmFsaWQgdHlwZTogVF9WT0lEIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVC5UU3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlQuVEJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVC5UQnl0ZSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlQuVEkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlQuVEkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlQuVEk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlQuVERvdWJsZSI7Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJULlRJMzIiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVC5UU3RydWN0IjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJULlRNYXAgXyBfIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJULlRTZXQgXyI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlQuVExpc3QgXyI7Ci0gIH0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGhzLCAiSGFza2VsbCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWYzZDBhLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInRfaHRtbF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnBhaXI7Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotZW51bSBpbnB1dF90eXBlIHsgSU5QVVRfVU5LTk9XTiwgSU5QVVRfVVRGOCwgSU5QVVRfUExBSU4gfTsKLQotLyoqCi0gKiBIVE1MIGNvZGUgZ2VuZXJhdG9yCi0gKgotICogbW9zdGx5IGNvcHkvcGFzdGluZy90d2Vha2luZyBmcm9tIG1jc2xlZSdzIHdvcmsuCi0gKi8KLWNsYXNzIHRfaHRtbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X2h0bWxfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWh0bWwiOwotICAgIGlucHV0X3R5cGVfID0gSU5QVVRfVU5LTk9XTjsKLQotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInN0YW5kYWxvbmUiKTsKLSAgICBzdGFuZGFsb25lXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJub2VzY2FwZSIpOwotICAgIHVuc2FmZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBlc2NhcGVfLmNsZWFyKCk7Ci0gICAgZXNjYXBlX1snJiddID0gIiZhbXA7IjsKLSAgICBlc2NhcGVfWyc8J10gPSAiJmx0OyI7Ci0gICAgZXNjYXBlX1snPiddID0gIiZndDsiOwotICAgIGVzY2FwZV9bJyInXSA9ICImcXVvdDsiOwotICAgIGVzY2FwZV9bJ1wnJ10gPSAiJmFwb3M7IjsKLQotICAgIGluaXRfYWxsb3dlZF9fbWFya3VwKCk7Ci0gIH0KLQotICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOwotICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0X3Byb2dyYW0qIHRwcm9nKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaW5kZXgoKTsKLSAgc3RkOjpzdHJpbmcgZXNjYXBlX2h0bWwoc3RkOjpzdHJpbmcgY29uc3QmIHN0cik7Ci0gIHN0ZDo6c3RyaW5nIGVzY2FwZV9odG1sX3RhZ3Moc3RkOjpzdHJpbmcgY29uc3QmIHN0cik7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NzKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoc3RkOjpvZnN0cmVhbSYgZl90YXJnZXQpOwotICB2b2lkIGdlbmVyYXRlX3N0eWxlX3RhZygpOwotICBzdGQ6OnN0cmluZyBtYWtlX2ZpbGVfbGluayhzdGQ6OnN0cmluZyBuYW1lKTsKLSAgYm9vbCBpc191dGY4X3NlcXVlbmNlKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcyk7Ci0gIHZvaWQgZGV0ZWN0X2lucHV0X2VuY29kaW5nKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcyk7Ci0gIHZvaWQgaW5pdF9hbGxvd2VkX19tYXJrdXAoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKLQotICB2b2lkIHByaW50X2RvYyh0X2RvYyogdGRvYyk7Ci0gIGludCBwcmludF90eXBlKHRfdHlwZSogdHR5cGUpOwotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKLSAgdm9pZCBwcmludF9mbl9hcmdzX2RvYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi1wcml2YXRlOgotICBzdGQ6Om9mc3RyZWFtIGZfb3V0XzsKLSAgc3RkOjpzdHJpbmcgY3VycmVudF9maWxlXzsKLSAgaW5wdXRfdHlwZSBpbnB1dF90eXBlXzsKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gYWxsb3dlZF9tYXJrdXA7Ci0gIGJvb2wgc3RhbmRhbG9uZV87Ci0gIGJvb2wgdW5zYWZlXzsKLX07Ci0KLS8qKgotICogRW1pdHMgdGhlIFRhYmxlIG9mIENvbnRlbnRzIGxpbmtzIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSdzIHBhZ2UKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvYygpIHsKLSAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkICIKLSAgICAgICAgICAgICJ0YWJsZS1jb25kZW5zZWRcIj48dGhlYWQ+PHRoPk1vZHVsZTwvdGg+PHRoPlNlcnZpY2VzPC90aD4iCi0gICAgICAgICA8PCAiPHRoPkRhdGEgdHlwZXM8L3RoPjx0aD5Db25zdGFudHM8L3RoPjwvdGhlYWQ+IiA8PCBlbmRsOwotICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3cocHJvZ3JhbV8pOwotICBmX291dF8gPDwgIjwvdGFibGU+IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFJlY3Vyc2VzIHRocm91Z2ggZnJvbSB0aGUgcHJvdmlkZWQgcHJvZ3JhbSBhbmQgZ2VuZXJhdGVzIGEgVG9DIHJvdwotICogZm9yIGVhY2ggZGlzY292ZXJlZCBwcm9ncmFtIGV4YWN0bHkgb25jZSBieSBtYWludGFpbmluZyB0aGUgbGlzdCBvZgotICogY29tcGxldGVkIHJvd3MgaW4gJ2ZpbmlzaGVkJwotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3ModF9wcm9ncmFtKiB0cHJvZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZmluaXNoZWQpIHsKLSAgZm9yICh2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXIgPSBmaW5pc2hlZC5iZWdpbigpOyBpdGVyICE9IGZpbmlzaGVkLmVuZCgpOyBpdGVyKyspIHsKLSAgICBpZiAodHByb2ctPmdldF9wYXRoKCkgPT0gKCppdGVyKS0+Z2V0X3BhdGgoKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBmaW5pc2hlZC5wdXNoX2JhY2sodHByb2cpOwotICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codHByb2cpOwotICB2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXMgPSB0cHJvZy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIGZvciAodmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgaXRlcisrKSB7Ci0gICAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cygqaXRlciwgZmluaXNoZWQpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgdGhlIFRhYmxlIG9mIENvbnRlbnRzIGxpbmtzIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSdzIHBhZ2UKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codF9wcm9ncmFtKiB0cHJvZykgewotICBzdHJpbmcgZm5hbWUgPSB0cHJvZy0+Z2V0X25hbWUoKSArICIuaHRtbCI7Ci0gIGZfb3V0XyA8PCAiPHRyPiIgPDwgZW5kbCA8PCAiPHRkPiIgPDwgdHByb2ctPmdldF9uYW1lKCkgPDwgIjwvdGQ+PHRkPiI7Ci0gIGlmICghdHByb2ctPmdldF9zZXJ2aWNlcygpLmVtcHR5KCkpIHsKLSAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSB0cHJvZy0+Z2V0X3NlcnZpY2VzKCk7Ci0gICAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgICAgc3RyaW5nIG5hbWUgPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKLSAgICAgIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsoZm5hbWUpIDw8ICIjU3ZjXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAgICAgICAgPDwgIjwvYT48YnIvPiIgPDwgZW5kbDsKLSAgICAgIGZfb3V0XyA8PCAiPHVsPiIgPDwgZW5kbDsKLSAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gZm5faHRtbDsKLSAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gKCpzdl9pdGVyKS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKLSAgICAgIGZvciAoZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmbl9pdGVyKSB7Ci0gICAgICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgc3RyaW5nIGh0bWwgPSAiPGxpPjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNGbl8iICsgbmFtZSArICJfIiArIGZuX25hbWUKLSAgICAgICAgICAgICAgICAgICAgICArICJcIj4iICsgZm5fbmFtZSArICI8L2E+PC9saT4iOwotICAgICAgICBmbl9odG1sLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihmbl9uYW1lLCBodG1sKSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGh0bWxfaXRlciA9IGZuX2h0bWwuYmVnaW4oKTsgaHRtbF9pdGVyICE9IGZuX2h0bWwuZW5kKCk7Ci0gICAgICAgICAgIGh0bWxfaXRlcisrKSB7Ci0gICAgICAgIGZfb3V0XyA8PCBodG1sX2l0ZXItPnNlY29uZCA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICI8L3VsPiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L3RkPiIgPDwgZW5kbCA8PCAiPHRkPiI7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gZGF0YV90eXBlczsKLSAgaWYgKCF0cHJvZy0+Z2V0X2VudW1zKCkuZW1wdHkoKSkgewotICAgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHRwcm9nLT5nZXRfZW51bXMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gICAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqZW5faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICAvLyBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKGZuYW1lKSA8PCAiI0VudW1fIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKLSAgICAgIC8vIDw8ICAiPC9hPjxici8+IiA8PCBlbmRsOwotICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI0VudW1fIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKyAiPC9hPiI7Ci0gICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7Ci0gICAgfQotICB9Ci0gIGlmICghdHByb2ctPmdldF90eXBlZGVmcygpLmVtcHR5KCkpIHsKLSAgICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSB0cHJvZy0+Z2V0X3R5cGVkZWZzKCk7Ci0gICAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOwotICAgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKnRkX2l0ZXIpLT5nZXRfc3ltYm9saWMoKTsKLSAgICAgIC8vIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsoZm5hbWUpIDw8ICIjVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQotICAgICAgLy8gPDwgIjwvYT48YnIvPiIgPDwgZW5kbDsKLSAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNUeXBlZGVmXyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIjwvYT4iOwotICAgICAgZGF0YV90eXBlcy5pbnNlcnQocGFpcjxzdHJpbmcsIHN0cmluZz4obmFtZSwgaHRtbCkpOwotICAgIH0KLSAgfQotICBpZiAoIXRwcm9nLT5nZXRfb2JqZWN0cygpLmVtcHR5KCkpIHsKLSAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gdHByb2ctPmdldF9vYmplY3RzKCk7Ci0gICAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKLSAgICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqb19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIC8vIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsoZm5hbWUpIDw8ICIjU3RydWN0XyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAvLzw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjU3RydWN0XyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIjwvYT4iOwotICAgICAgZGF0YV90eXBlcy5pbnNlcnQocGFpcjxzdHJpbmcsIHN0cmluZz4obmFtZSwgaHRtbCkpOwotICAgIH0KLSAgfQotICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGR0X2l0ZXIgPSBkYXRhX3R5cGVzLmJlZ2luKCk7IGR0X2l0ZXIgIT0gZGF0YV90eXBlcy5lbmQoKTsKLSAgICAgICBkdF9pdGVyKyspIHsKLSAgICBmX291dF8gPDwgZHRfaXRlci0+c2Vjb25kIDw8ICI8YnIvPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGQ+IiA8PCBlbmRsIDw8ICI8dGQ+IjsKLSAgaWYgKCF0cHJvZy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKLSAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IGNvbnN0X2h0bWw7Ci0gICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSB0cHJvZy0+Z2V0X2NvbnN0cygpOwotICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNvbl9pdGVyOwotICAgIGZvciAoY29uX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY29uX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2Nvbl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqY29uX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgc3RyaW5nIGh0bWwgPSAiPGNvZGU+PGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI0NvbnN0XyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIjwvYT48L2NvZGU+IjsKLSAgICAgIGNvbnN0X2h0bWwuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBjb25faXRlciA9IGNvbnN0X2h0bWwuYmVnaW4oKTsgY29uX2l0ZXIgIT0gY29uc3RfaHRtbC5lbmQoKTsKLSAgICAgICAgIGNvbl9pdGVyKyspIHsKLSAgICAgIGZfb3V0XyA8PCBjb25faXRlci0+c2Vjb25kIDw8ICI8YnIvPiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD4iIDw8IGVuZGwgPDwgIjwvdHI+IjsKLX0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtLgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBjdXJyZW50X2ZpbGVfID0gcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmh0bWwiOwotICBzdHJpbmcgZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgY3VycmVudF9maWxlXzsKLSAgZl9vdXRfLm9wZW4oZm5hbWUuY19zdHIoKSk7Ci0gIGZfb3V0XyA8PCAiPCFET0NUWVBFIGh0bWwgUFVCTElDIFwiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU5cIiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICIgICAgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkXCI+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxodG1sIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8aGVhZD4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPG1ldGEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOFwiIC8+IiA8PCBlbmRsOwotICBnZW5lcmF0ZV9zdHlsZV90YWcoKTsKLSAgZl9vdXRfIDw8ICI8dGl0bGU+VGhyaWZ0IG1vZHVsZTogIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiPC90aXRsZT48L2hlYWQ+PGJvZHk+IiA8PCBlbmRsCi0gICAgICAgICA8PCAiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPiIgPDwgZW5kbAotICAgICAgICAgPDwgIjxoMT5UaHJpZnQgbW9kdWxlOiAiIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICI8L2gxPiIgPDwgZW5kbDsKLQotICBwcmludF9kb2MocHJvZ3JhbV8pOwotCi0gIGdlbmVyYXRlX3Byb2dyYW1fdG9jKCk7Ci0KLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiQ29uc3RhbnRzXCI+Q29uc3RhbnRzPC9oMj4iIDw8IGVuZGw7Ci0gICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOwotICAgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOwotICAgIGZfb3V0XyA8PCAiPHRoZWFkPjx0aD5Db25zdGFudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90aGVhZD4iIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7Ci0gICAgZl9vdXRfIDw8ICI8L3RhYmxlPiI7Ci0gIH0KLQotICBpZiAoIXByb2dyYW1fLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIkVudW1lcmF0aW9uc1wiPkVudW1lcmF0aW9uczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIGVudW1zCi0gICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiVHlwZWRlZnNcIj5UeXBlIGRlY2xhcmF0aW9uczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOwotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9vYmplY3RzKCkuZW1wdHkoKSkgewotICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJTdHJ1Y3RzXCI+RGF0YSBzdHJ1Y3R1cmVzPC9oMj4iIDw8IGVuZGw7Ci0gICAgLy8gR2VuZXJhdGUgc3RydWN0cyBhbmQgZXhjZXB0aW9ucyBpbiBkZWNsYXJlZCBvcmRlcgotICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKLSAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOwotICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKLSAgICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCkuZW1wdHkoKSkgewotICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJTZXJ2aWNlc1wiPlNlcnZpY2VzPC9oMj4iIDw8IGVuZGw7Ci0gICAgLy8gR2VuZXJhdGUgc2VydmljZXMKLSAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7Ci0gICAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOwotICAgICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7Ci0gICAgfQotICB9Ci0KLSAgZl9vdXRfIDw8ICI8L2Rpdj48L2JvZHk+PC9odG1sPiIgPDwgZW5kbDsKLSAgZl9vdXRfLmNsb3NlKCk7Ci0KLSAgZ2VuZXJhdGVfaW5kZXgoKTsKLSAgZ2VuZXJhdGVfY3NzKCk7Ci19Ci0KLS8qKgotICogRW1pdHMgdGhlIGluZGV4Lmh0bWwgZmlsZSBmb3IgdGhlIHJlY3Vyc2l2ZSBzZXQgb2YgVGhyaWZ0IHByb2dyYW1zCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaW5kZXgoKSB7Ci0gIGN1cnJlbnRfZmlsZV8gPSAiaW5kZXguaHRtbCI7Ci0gIHN0cmluZyBpbmRleF9mbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjdXJyZW50X2ZpbGVfOwotICBmX291dF8ub3BlbihpbmRleF9mbmFtZS5jX3N0cigpKTsKLSAgZl9vdXRfIDw8ICI8aHRtbD48aGVhZD4iIDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3N0eWxlX3RhZygpOwotICBmX291dF8gPDwgIjx0aXRsZT5BbGwgVGhyaWZ0IGRlY2xhcmF0aW9uczwvdGl0bGU+PC9oZWFkPjxib2R5PiIgPDwgZW5kbAotICAgICAgICAgPDwgIjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4iIDw8IGVuZGwgPDwgIjxoMT5BbGwgVGhyaWZ0IGRlY2xhcmF0aW9uczwvaDE+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgIgotICAgICAgICAgICAgInRhYmxlLWNvbmRlbnNlZFwiPjx0aGVhZD48dGg+TW9kdWxlPC90aD48dGg+U2VydmljZXM8L3RoPjx0aD5EYXRhIHR5cGVzPC90aD4iCi0gICAgICAgICA8PCAiPHRoPkNvbnN0YW50czwvdGg+PC90aGVhZD4iIDw8IGVuZGw7Ci0gIHZlY3Rvcjx0X3Byb2dyYW0qPiBwcm9ncmFtczsKLSAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cyhwcm9ncmFtXywgcHJvZ3JhbXMpOwotICBmX291dF8gPDwgIjwvdGFibGU+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjwvZGl2PjwvYm9keT48L2h0bWw+IiA8PCBlbmRsOwotICBmX291dF8uY2xvc2UoKTsKLX0KLQotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc3MoKSB7Ci0gIGlmICghc3RhbmRhbG9uZV8pIHsKLSAgICBjdXJyZW50X2ZpbGVfID0gInN0eWxlLmNzcyI7Ci0gICAgc3RyaW5nIGNzc19mbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjdXJyZW50X2ZpbGVfOwotICAgIGZfb3V0Xy5vcGVuKGNzc19mbmFtZS5jX3N0cigpKTsKLSAgICBnZW5lcmF0ZV9jc3NfY29udGVudChmX291dF8pOwotICAgIGZfb3V0Xy5jbG9zZSgpOwotICB9Ci19Ci0KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NzX2NvbnRlbnQoc3RkOjpvZnN0cmVhbSYgZl90YXJnZXQpIHsKLSAgZl90YXJnZXQgPDwgQk9PVFNUUkFQX0NTUygpIDw8IGVuZGw7Ci0gIGZfdGFyZ2V0IDw8ICIvKiBBdXRvLWdlbmVyYXRlZCBDU1MgZm9yIGdlbmVyYXRlZCBUaHJpZnQgZG9jcyAqLyIgPDwgZW5kbDsKLSAgZl90YXJnZXQgPDwgImgzLCBoNCB7IG1hcmdpbi1ib3R0b206IDZweDsgfSIgPDwgZW5kbDsKLSAgZl90YXJnZXQgPDwgImRpdi5kZWZpbml0aW9uIHsgYm9yZGVyOiAxcHggc29saWQgI0NDQzsgbWFyZ2luLWJvdHRvbTogMTBweDsgcGFkZGluZzogMTBweDsgfSIKLSAgICAgICAgICAgPDwgZW5kbDsKLSAgZl90YXJnZXQgPDwgImRpdi5leHRlbmRzIHsgbWFyZ2luOiAtMC41ZW0gMCAxZW0gNWVtIH0iIDw8IGVuZGw7Ci0gIGZfdGFyZ2V0IDw8ICJ0ZCB7IHZlcnRpY2FsLWFsaWduOiB0b3A7IH0iIDw8IGVuZGw7Ci0gIGZfdGFyZ2V0IDw8ICJ0YWJsZSB7IGVtcHR5LWNlbGxzOiBzaG93OyB9IiA8PCBlbmRsOwotICBmX3RhcmdldCA8PCAiY29kZSB7IGxpbmUtaGVpZ2h0OiAyMHB4OyB9IiA8PCBlbmRsOwotICBmX3RhcmdldCA8PCAiLnRhYmxlLWJvcmRlcmVkIHRoLCAudGFibGUtYm9yZGVyZWQgdGQgeyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0RERERERDsgfSIKLSAgICAgICAgICAgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIENTUyB0YWcuCi0gKiBEZXBlbmRpbmcgb24gInN0YW5kYWxvbmUiLCBlaXRoZXIgYSBDU1MgZmlsZSBsaW5rIChkZWZhdWx0KSwgb3IgdGhlIGVudGlyZSBDU1MgaXMgZW1iZWRkZWQKLSAqIGlubGluZS4KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHlsZV90YWcoKSB7Ci0gIGlmICghc3RhbmRhbG9uZV8pIHsKLSAgICBmX291dF8gPDwgIjxsaW5rIGhyZWY9XCJzdHlsZS5jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIvPiIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX291dF8gPDwgIjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIi8+PCEtLSIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9jc3NfY29udGVudChmX291dF8pOwotICAgIGZfb3V0XyA8PCAiLS0+PC9zdHlsZT4iIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSB0YXJnZXQgZmlsZSBmb3IgYSA8YSBocmVmPiBsaW5rCi0gKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGVtcHR5LCB3aGVuZXZlciBmaWxlbmFtZSByZWZlcnMgdG8gdGhlIGN1cnJlbnQgZmlsZS4KLSAqLwotc3RkOjpzdHJpbmcgdF9odG1sX2dlbmVyYXRvcjo6bWFrZV9maWxlX2xpbmsoc3RkOjpzdHJpbmcgZmlsZW5hbWUpIHsKLSAgcmV0dXJuIChjdXJyZW50X2ZpbGVfLmNvbXBhcmUoZmlsZW5hbWUpICE9IDApID8gZmlsZW5hbWUgOiAiIjsKLX0KLQotLyoqCi0gKiBJZiB0aGUgcHJvdmlkZWQgZG9jdW1lbnRhYmxlIG9iamVjdCBoYXMgZG9jdW1lbnRhdGlvbiBhdHRhY2hlZCwgdGhpcwotICogd2lsbCBlbWl0IGl0IHRvIHRoZSBvdXRwdXQgc3RyZWFtIGluIEhUTUwgZm9ybWF0LgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OnByaW50X2RvYyh0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgaWYgKHVuc2FmZV8pIHsKLSAgICAgIGZfb3V0XyA8PCB0ZG9jLT5nZXRfZG9jKCkgPDwgIjxici8+IjsKLSAgICB9IGVsc2UgewotICAgICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKHRkb2MtPmdldF9kb2MoKSkgPDwgIjxici8+IjsKLSAgICB9Ci0gIH0KLX0KLQotYm9vbCB0X2h0bWxfZ2VuZXJhdG9yOjppc191dGY4X3NlcXVlbmNlKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcykgewotICAvLyBsZWFkaW5nIGNoYXIgZGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZQotICB1bnNpZ25lZCBjaGFyIGMgPSBzdHIuYXQoZmlyc3Rwb3MpOwotICBpbnQgY291bnQgPSAwOwotICBpZiAoKGMgJiAweEUwKSA9PSAweEMwKSB7Ci0gICAgY291bnQgPSAxOwotICB9IGVsc2UgaWYgKChjICYgMHhGMCkgPT0gMHhFMCkgewotICAgIGNvdW50ID0gMjsKLSAgfSBlbHNlIGlmICgoYyAmIDB4RjgpID09IDB4RjApIHsKLSAgICBjb3VudCA9IDM7Ci0gIH0gZWxzZSBpZiAoKGMgJiAweEZDKSA9PSAweEY4KSB7Ci0gICAgY291bnQgPSA0OwotICB9IGVsc2UgaWYgKChjICYgMHhGRSkgPT0gMHhGQykgewotICAgIGNvdW50ID0gNTsKLSAgfSBlbHNlIHsKLSAgICAvLyBwZGVidWcoIlVURi04IHRlc3Q6IGNoYXIgJyVjJyAoJWQpIGlzIG5vdCBhIHZhbGlkIFVURi04IGxlYWRpbmcgYnl0ZSIsIGMsIGludChjKSk7Ci0gICAgcmV0dXJuIGZhbHNlOyAvLyBubyBVVEYtOAotICB9Ci0KLSAgLy8gZm9sbG93aW5nIGNoYXJzCi0gIHNpemVfdCBwb3MgPSBmaXJzdHBvcyArIDE7Ci0gIHdoaWxlICgocG9zIDwgc3RyLmxlbmd0aCgpKSAmJiAoMCA8IGNvdW50KSkgewotICAgIGMgPSBzdHIuYXQocG9zKTsKLSAgICBpZiAoKGMgJiAweEMwKSAhPSAweDgwKSB7Ci0gICAgICAvLyBwZGVidWcoIlVURi04IHRlc3Q6IGNoYXIgJyVjJyAoJWQpIGlzIG5vdCBhIHZhbGlkIFVURi04IGZvbGxvd2luZyBieXRlIiwgYywgaW50KGMpKTsKLSAgICAgIHJldHVybiBmYWxzZTsgLy8gbm8gVVRGLTgKLSAgICB9Ci0gICAgLS1jb3VudDsKLSAgICArK3BvczsKLSAgfQotCi0gIC8vIHRydWUgaWYgdGhlIHNlcXVlbmNlIGlzIGNvbXBsZXRlCi0gIHJldHVybiAoMCA9PSBjb3VudCk7Ci19Ci0KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6ZGV0ZWN0X2lucHV0X2VuY29kaW5nKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcykgewotICBpZiAoaXNfdXRmOF9zZXF1ZW5jZShzdHIsIGZpcnN0cG9zKSkgewotICAgIHBkZWJ1ZygiSW5wdXQgc2VlbXMgdG8gYmUgYWxyZWFkeSBVVEYtOCBlbmNvZGVkIik7Ci0gICAgaW5wdXRfdHlwZV8gPSBJTlBVVF9VVEY4OwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGZhbGxiYWNrCi0gIHB3YXJuaW5nKDEsICJJbnB1dCBpcyBub3QgVVRGLTgsIHRyZWF0aW5nIGFzIHBsYWluIEFOU0kiKTsKLSAgaW5wdXRfdHlwZV8gPSBJTlBVVF9QTEFJTjsKLX0KLQotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjppbml0X2FsbG93ZWRfX21hcmt1cCgpIHsKLSAgYWxsb3dlZF9tYXJrdXAuY2xlYXIoKTsKLSAgLy8gc3RhbmRhbG9uZSB0YWdzCi0gIGFsbG93ZWRfbWFya3VwWyJiciJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImJyLyJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImltZyJdID0gMTsKLSAgLy8gcGFpcmVkIHRhZ3MKLSAgYWxsb3dlZF9tYXJrdXBbImIiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvYiJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbInUiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvdSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImkiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvaSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbInMiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvcyJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImJpZyJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9iaWciXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJzbWFsbCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9zbWFsbCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbInN1cCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9zdXAiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJzdWIiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvc3ViIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsicHJlIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL3ByZSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbInR0Il0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL3R0Il0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsidWwiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvdWwiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJvbCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9vbCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImxpIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2xpIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiYSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9hIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsicCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9wIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiY29kZSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9jb2RlIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiZGwiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvZGwiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJkdCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9kdCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImRkIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2RkIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiaDEiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvaDEiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJoMiJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9oMiJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImgzIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2gzIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiaDQiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvaDQiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJoNSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9oNSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImg2Il0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2g2Il0gPSAxOwotfQotCi1zdGQ6OnN0cmluZyB0X2h0bWxfZ2VuZXJhdG9yOjplc2NhcGVfaHRtbF90YWdzKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKLQotICB1bnNpZ25lZCBjaGFyIGMgPSAnPyc7Ci0gIHNpemVfdCBsYXN0cG9zOwotICBzaXplX3QgZmlyc3Rwb3MgPSAwOwotICB3aGlsZSAoZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKLQotICAgIC8vIGxvb2sgZm9yIG5vbi1BU0NJSSBjaGFyCi0gICAgbGFzdHBvcyA9IGZpcnN0cG9zOwotICAgIHdoaWxlIChsYXN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7Ci0gICAgICBjID0gc3RyLmF0KGxhc3Rwb3MpOwotICAgICAgaWYgKCgnPCcgPT0gYykgfHwgKCc+JyA9PSBjKSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgICsrbGFzdHBvczsKLSAgICB9Ci0KLSAgICAvLyBjb3B5IHdoYXQgd2UgZ290IHNvIGZhcgotICAgIGlmIChsYXN0cG9zID4gZmlyc3Rwb3MpIHsKLSAgICAgIHJlc3VsdCA8PCBzdHIuc3Vic3RyKGZpcnN0cG9zLCBsYXN0cG9zIC0gZmlyc3Rwb3MpOwotICAgICAgZmlyc3Rwb3MgPSBsYXN0cG9zOwotICAgIH0KLQotICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KLSAgICBpZiAoZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyB0YWcgZW5kIHdpdGhvdXQgY29ycmVzcG9uZGluZyBiZWdpbgotICAgICsrZmlyc3Rwb3M7Ci0gICAgaWYgKCc+JyA9PSBjKSB7Ci0gICAgICByZXN1bHQgPDwgIiZndDsiOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLy8gZXh0cmFjdCB0aGUgdGFnCi0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHRhZ3N0cmVhbTsKLSAgICB3aGlsZSAoZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKLSAgICAgIGMgPSBzdHIuYXQoZmlyc3Rwb3MpOwotICAgICAgKytmaXJzdHBvczsKLSAgICAgIGlmICgnPCcgPT0gYykgewotICAgICAgICB0YWdzdHJlYW0gPDwgIiZsdDsiOyAvLyBuZXN0ZWQgYmVnaW4/Ci0gICAgICB9IGVsc2UgaWYgKCc+JyA9PSBjKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGFnc3RyZWFtIDw8IGM7IC8vIG5vdCB2ZXJ5IGVmZmljaWVudCwgYnV0IHRhZ3Mgc2hvdWxkIGJlIHF1aXRlIHNob3J0Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gd2UgYWxsb3cgZm9yIHNldmVyYWwgbWFya3VwIGluIGRvY3N0cmluZ3MsIGFsbCBlbHNlIHdpbGwgYmVjb21lIGVzY2FwZWQKLSAgICBzdHJpbmcgdGFnX2NvbnRlbnQgPSB0YWdzdHJlYW0uc3RyKCk7Ci0gICAgc3RyaW5nIHRhZ19rZXkgPSB0YWdfY29udGVudDsKLSAgICBzaXplX3QgZmlyc3Rfd2hpdGUgPSB0YWdfa2V5LmZpbmRfZmlyc3Rfb2YoIiBcdFxmXHZcblxyIik7Ci0gICAgaWYgKGZpcnN0X3doaXRlICE9IHN0cmluZzo6bnBvcykgewotICAgICAgdGFnX2tleS5lcmFzZShmaXJzdF93aGl0ZSk7Ci0gICAgfQotICAgIGZvciAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IHRhZ19rZXkubGVuZ3RoKCk7ICsraSkgewotICAgICAgdGFnX2tleVtpXSA9IHRvbG93ZXIodGFnX2tleVtpXSk7Ci0gICAgfQotICAgIGlmIChhbGxvd2VkX21hcmt1cC5maW5kKHRhZ19rZXkpICE9IGFsbG93ZWRfbWFya3VwLmVuZCgpKSB7Ci0gICAgICByZXN1bHQgPDwgIjwiIDw8IHRhZ19jb250ZW50IDw8ICI+IjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0IDw8ICImbHQ7IiA8PCB0YWdzdHJlYW0uc3RyKCkgPDwgIiZndDsiOwotICAgICAgcHZlcmJvc2UoImlsbGVnYWwgbWFya3VwIDwlcz4gaW4gZG9jLWNvbW1lbnRcbiIsIHRhZ19rZXkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9odG1sX2dlbmVyYXRvcjo6ZXNjYXBlX2h0bWwoc3RkOjpzdHJpbmcgY29uc3QmIHN0cikgewotICAvLyB0aGUgZ2VuZXJhdGVkIEhUTUwgaGVhZGVyIHNheXMgaXQgaXMgVVRGLTggZW5jb2RlZAotICAvLyBpZiBVVEYtOCBpbnB1dCBoYXMgYmVlbiBkZXRlY3RlZCBiZWZvcmUsIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nCi0gIGlmIChpbnB1dF90eXBlXyA9PSBJTlBVVF9VVEY4KSB7Ci0gICAgcmV0dXJuIGVzY2FwZV9odG1sX3RhZ3Moc3RyKTsKLSAgfQotCi0gIC8vIGNvbnZlcnQgdW5zYWZlIGNoYXJzIHRvIHRoZWlyICYjPG51bT47IGVxdWl2YWxlbnQKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKLSAgdW5zaWduZWQgY2hhciBjID0gJz8nOwotICB1bnNpZ25lZCBpbnQgaWMgPSAwOwotICBzaXplX3QgbGFzdHBvczsKLSAgc2l6ZV90IGZpcnN0cG9zID0gMDsKLSAgd2hpbGUgKGZpcnN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7Ci0KLSAgICAvLyBsb29rIGZvciBub24tQVNDSUkgY2hhcgotICAgIGxhc3Rwb3MgPSBmaXJzdHBvczsKLSAgICB3aGlsZSAobGFzdHBvcyA8IHN0ci5sZW5ndGgoKSkgewotICAgICAgYyA9IHN0ci5hdChsYXN0cG9zKTsKLSAgICAgIGljID0gYzsKLSAgICAgIGlmICgoMzIgPiBpYykgfHwgKDEyNyA8IGljKSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgICsrbGFzdHBvczsKLSAgICB9Ci0KLSAgICAvLyBjb3B5IHdoYXQgd2UgZ290IHNvIGZhcgotICAgIGlmIChsYXN0cG9zID4gZmlyc3Rwb3MpIHsKLSAgICAgIHJlc3VsdCA8PCBzdHIuc3Vic3RyKGZpcnN0cG9zLCBsYXN0cG9zIC0gZmlyc3Rwb3MpOwotICAgICAgZmlyc3Rwb3MgPSBsYXN0cG9zOwotICAgIH0KLQotICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KLSAgICBpZiAoZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBzb21lIGNvbnRyb2wgY29kZT8KLSAgICBpZiAoaWMgPD0gMzEpIHsKLSAgICAgIHN3aXRjaCAoYykgewotICAgICAgY2FzZSAnXHInOgotICAgICAgY2FzZSAnXG4nOgotICAgICAgY2FzZSAnXHQnOgotICAgICAgICByZXN1bHQgPDwgYzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiAvLyBzaWxlbnRseSBjb25zdW1lIGFsbCBvdGhlciBjdHJsIGNoYXJzCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKytmaXJzdHBvczsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KLSAgICBpZiAoZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyB0cnkgdG8gZGV0ZWN0IGlucHV0IGVuY29kaW5nCi0gICAgaWYgKGlucHV0X3R5cGVfID09IElOUFVUX1VOS05PV04pIHsKLSAgICAgIGRldGVjdF9pbnB1dF9lbmNvZGluZyhzdHIsIGZpcnN0cG9zKTsKLSAgICAgIGlmIChpbnB1dF90eXBlXyA9PSBJTlBVVF9VVEY4KSB7Ci0gICAgICAgIGxhc3Rwb3MgPSBzdHIubGVuZ3RoKCk7Ci0gICAgICAgIHJlc3VsdCA8PCBzdHIuc3Vic3RyKGZpcnN0cG9zLCBsYXN0cG9zIC0gZmlyc3Rwb3MpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjb252ZXJ0IHRoZSBjaGFyYWN0ZXIgdG8gc29tZXRoaW5nIHVzZWZ1bCBiYXNlZCBvbiB0aGUgZGV0ZWN0ZWQgZW5jb2RpbmcKLSAgICBzd2l0Y2ggKGlucHV0X3R5cGVfKSB7Ci0gICAgY2FzZSBJTlBVVF9QTEFJTjoKLSAgICAgIHJlc3VsdCA8PCAiJiMiIDw8IGljIDw8ICI7IjsKLSAgICAgICsrZmlyc3Rwb3M7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgIlVuZXhwZWN0ZWQgb3IgdW5yZWNvZ25pemVkIGlucHV0IGVuY29kaW5nIjsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZXNjYXBlX2h0bWxfdGFncyhyZXN1bHQuc3RyKCkpOwotfQotCi0vKioKLSAqIFByaW50cyBvdXQgdGhlIHByb3ZpZGVkIHR5cGUgaW4gSFRNTAotICovCi1pbnQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfdHlwZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGVuID0gMDsKLSAgZl9vdXRfIDw8ICI8Y29kZT4iOwotICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGZfb3V0XyA8PCAibGlzdCZsdDsiOwotICAgICAgbGVuID0gNiArIHByaW50X3R5cGUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICAgIGZfb3V0XyA8PCAiJmd0OyI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGZfb3V0XyA8PCAic2V0Jmx0OyI7Ci0gICAgICBsZW4gPSA1ICsgcHJpbnRfdHlwZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgICBmX291dF8gPDwgIiZndDsiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBmX291dF8gPDwgIm1hcCZsdDsiOwotICAgICAgbGVuID0gNSArIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgICBmX291dF8gPDwgIiwgIjsKLSAgICAgIGxlbiArPSBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgZl9vdXRfIDw8ICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmlzX2JpbmFyeSgpID8gImJpbmFyeSIgOiB0dHlwZS0+Z2V0X25hbWUoKSk7Ci0gICAgbGVuID0gdHR5cGUtPmdldF9uYW1lKCkuc2l6ZSgpOwotICB9IGVsc2UgewotICAgIHN0cmluZyBwcm9nX25hbWUgPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgdHlwZV9uYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhwcm9nX25hbWUgKyAiLmh0bWwiKSA8PCAiIyI7Ci0gICAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiVHlwZWRlZl8iOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBmX291dF8gPDwgIlN0cnVjdF8iOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgZl9vdXRfIDw8ICJFbnVtXyI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7Ci0gICAgICBmX291dF8gPDwgIlN2Y18iOwotICAgIH0KLSAgICBmX291dF8gPDwgdHlwZV9uYW1lIDw8ICJcIj4iOwotICAgIGxlbiA9IHR5cGVfbmFtZS5zaXplKCk7Ci0gICAgaWYgKHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IHByb2dyYW1fKSB7Ci0gICAgICBmX291dF8gPDwgcHJvZ19uYW1lIDw8ICIuIjsKLSAgICAgIGxlbiArPSBwcm9nX25hbWUuc2l6ZSgpICsgMTsKLSAgICB9Ci0gICAgZl9vdXRfIDw8IHR5cGVfbmFtZSA8PCAiPC9hPiI7Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L2NvZGU+IjsKLSAgcmV0dXJuIChpbnQpbGVuOwotfQotCi0vKioKLSAqIFByaW50cyBvdXQgYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgewotCi0gIC8vIGlmIHR2YWx1ZSBpcyBhbiBpZGVudGlmaWVyLCB0aGUgY29uc3RhbnQgY29udGVudCBpcyBhbHJlYWR5IHNob3duIGVsc2V3aGVyZQotICBpZiAodHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKLSAgICBzdHJpbmcgZm5hbWUgPSBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuaHRtbCI7Ci0gICAgc3RyaW5nIG5hbWUgPSBlc2NhcGVfaHRtbCh0dmFsdWUtPmdldF9pZGVudGlmaWVyKCkpOwotICAgIGZfb3V0XyA8PCAiPGNvZGU+PGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI0NvbnN0XyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lCi0gICAgICAgICAgICAgICsgIjwvYT48L2NvZGU+IjsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKLSAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgaWYgKHRydWV0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0cnVldHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgZl9vdXRfIDw8ICciJyA8PCBlc2NhcGVfaHRtbChnZXRfZXNjYXBlZF9zdHJpbmcodHZhbHVlKSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgZl9vdXRfIDw8ICgodHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmX291dF8gPDwgIlVOS05PV04gQkFTRSBUWVBFIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKHRydWV0eXBlLT5nZXRfbmFtZSgpKSA8PCAiLiIKLSAgICAgICAgICAgPDwgZXNjYXBlX2h0bWwodHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0cnVldHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGZfb3V0XyA8PCAieyAiOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXRydWV0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHR2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0cnVldHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKLSAgICAgICAgICAgICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICBmX291dF8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBmX291dF8gPDwgZXNjYXBlX2h0bWwodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSA8PCAiID0gIjsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICIgfSI7Ci0gIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZl9vdXRfIDw8ICJ7ICI7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gbWFwX2VsZW1zID0gdHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIG1hcF9pdGVyOwotICAgIGZvciAobWFwX2l0ZXIgPSBtYXBfZWxlbXMuYmVnaW4oKTsgbWFwX2l0ZXIgIT0gbWFwX2VsZW1zLmVuZCgpOyBtYXBfaXRlcisrKSB7Ci0gICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgIGZfb3V0XyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9tYXAqKXRydWV0eXBlKS0+Z2V0X2tleV90eXBlKCksIG1hcF9pdGVyLT5maXJzdCk7Ci0gICAgICBmX291dF8gPDwgIiA9ICI7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbWFwKil0cnVldHlwZSktPmdldF92YWxfdHlwZSgpLCBtYXBfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICIgfSI7Ci0gIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2xpc3QoKSkgewotICAgIGZfb3V0XyA8PCAieyAiOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICA7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOwotICAgIGZvciAobGlzdF9pdGVyID0gbGlzdF9lbGVtcy5iZWdpbigpOyBsaXN0X2l0ZXIgIT0gbGlzdF9lbGVtcy5lbmQoKTsgbGlzdF9pdGVyKyspIHsKLSAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X2xpc3QqKXRydWV0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICIgfSI7Ci0gIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZl9vdXRfIDw8ICJ7ICI7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0X2VsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIDsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXN0X2l0ZXI7Ci0gICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOyBsaXN0X2l0ZXIrKykgewotICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICBmX291dF8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfc2V0Kil0cnVldHlwZSktPmdldF9lbGVtX3R5cGUoKSwgKmxpc3RfaXRlcik7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiIH0iOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PCAiVU5LTk9XTiBUWVBFIjsKLSAgfQotfQotCi0vKioKLSAqIFByaW50cyBvdXQgZG9jdW1lbnRhdGlvbiBmb3IgYXJndW1lbnRzL2V4Y2VwdGlvbnMgb2YgYSBmdW5jdGlvbiwgaWYgYW55IGRvY3VtZW50YXRpb24gaGFzIGJlZW4KLSAqIHN1cHBsaWVkLgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OnByaW50X2ZuX2FyZ3NfZG9jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBib29sIGhhc19kb2NzID0gZmFsc2U7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7Ci0gIGlmIChhcmdfaXRlciAhPSBhcmdzLmVuZCgpKSB7Ci0gICAgZm9yICg7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKLSAgICAgIGlmICgoKmFyZ19pdGVyKS0+aGFzX2RvYygpICYmICEoKmFyZ19pdGVyKS0+Z2V0X2RvYygpLmVtcHR5KCkpCi0gICAgICAgIGhhc19kb2NzID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGhhc19kb2NzKSB7Ci0gICAgICBhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsKLSAgICAgIGZfb3V0XyA8PCAiPGJyLz48aDQgaWQ9XCJQYXJhbWV0ZXJzXyIgPDwgc2VydmljZV9uYW1lXyA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgPDwgIlwiPlBhcmFtZXRlcnM8L2g0PiIgPDwgZW5kbDsKLSAgICAgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOwotICAgICAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPk5hbWU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90aGVhZD4iOwotICAgICAgZm9yICg7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKLSAgICAgICAgZl9vdXRfIDw8ICI8dHI+PHRkPiIgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKLSAgICAgICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKCgqYXJnX2l0ZXIpLT5nZXRfZG9jKCkpOwotICAgICAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBmX291dF8gPDwgIjwvdGFibGU+IjsKLSAgICB9Ci0gIH0KLQotICBoYXNfZG9jcyA9IGZhbHNlOwotICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKLSAgaWYgKGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKSkgewotICAgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgewotICAgICAgaWYgKCgqZXhfaXRlciktPmhhc19kb2MoKSAmJiAhKCpleF9pdGVyKS0+Z2V0X2RvYygpLmVtcHR5KCkpCi0gICAgICAgIGhhc19kb2NzID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGhhc19kb2NzKSB7Ci0gICAgICBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOwotICAgICAgZl9vdXRfIDw8ICI8YnIvPjxoNCBpZD1cIkV4Y2VwdGlvbnNfIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICA8PCAiXCI+RXhjZXB0aW9uczwvaDQ+IiA8PCBlbmRsOwotICAgICAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiI7Ci0gICAgICBmX291dF8gPDwgIjx0aGVhZD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RoZWFkPiI7Ci0gICAgICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKLSAgICAgICAgZl9vdXRfIDw8ICI8dHI+PHRkPiIgPDwgKCpleF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgICAgICBmX291dF8gPDwgZXNjYXBlX2h0bWwoKCpleF9pdGVyKS0+Z2V0X2RvYygpKTsKLSAgICAgICAgZl9vdXRfIDw8ICI8L3RkPjwvdHI+IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICI8L3RhYmxlPiI7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBzdHJpbmcgbmFtZSA9IHR0eXBlZGVmLT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJUeXBlZGVmXyIgPDwgbmFtZSA8PCAiXCI+VHlwZWRlZjogIiA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8cD48c3Ryb25nPkJhc2UgdHlwZTo8L3N0cm9uZz4mbmJzcDsiOwotICBwcmludF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKTsKLSAgZl9vdXRfIDw8ICI8L3A+IiA8PCBlbmRsOwotICBwcmludF9kb2ModHR5cGVkZWYpOwotICBmX291dF8gPDwgIjwvZGl2PiIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgc3RyaW5nIG5hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKLSAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7Ci0gIGZfb3V0XyA8PCAiPGgzIGlkPVwiRW51bV8iIDw8IG5hbWUgPDwgIlwiPkVudW1lcmF0aW9uOiAiIDw8IG5hbWUgPDwgIjwvaDM+IiA8PCBlbmRsOwotICBwcmludF9kb2ModGVudW0pOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKLSAgZl9vdXRfIDw8ICI8YnIvPjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IiA8PCBlbmRsOwotICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgewotICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD48Y29kZT4iOwotICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjwvY29kZT48L3RkPjx0ZD48Y29kZT4iOwotICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48dGQ+IiA8PCBlbmRsOwotICAgIHByaW50X2RvYygoKnZhbF9pdGVyKSk7Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjwvdHI+IiA8PCBlbmRsOwotICB9Ci0gIGZfb3V0XyA8PCAiPC90YWJsZT48L2Rpdj4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIGZfb3V0XyA8PCAiPHRyIGlkPVwiQ29uc3RfIiA8PCBuYW1lIDw8ICJcIj48dGQ+PGNvZGU+IiA8PCBuYW1lIDw8ICI8L2NvZGU+PC90ZD48dGQ+IjsKLSAgcHJpbnRfdHlwZSh0Y29uc3QtPmdldF90eXBlKCkpOwotICBmX291dF8gPDwgIjwvdGQ+PHRkPjxjb2RlPiI7Ci0gIHByaW50X2NvbnN0X3ZhbHVlKHRjb25zdC0+Z2V0X3R5cGUoKSwgdGNvbnN0LT5nZXRfdmFsdWUoKSk7Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PC90cj4iOwotICBpZiAodGNvbnN0LT5oYXNfZG9jKCkpIHsKLSAgICBmX291dF8gPDwgIjx0cj48dGQgY29sc3Bhbj1cIjNcIj48YmxvY2txdW90ZT4iOwotICAgIHByaW50X2RvYyh0Y29uc3QpOwotICAgIGZfb3V0XyA8PCAiPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4iOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJTdHJ1Y3RfIiA8PCBuYW1lIDw8ICJcIj4iOwotICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgewotICAgIGZfb3V0XyA8PCAiRXhjZXB0aW9uOiAiOwotICB9IGVsc2UgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBmX291dF8gPDwgIlVuaW9uOiAiOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PCAiU3RydWN0OiAiOwotICB9Ci0gIGZfb3V0XyA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOwotICBmX291dF8gPDwgIjx0aGVhZD48dGg+S2V5PC90aD48dGg+RmllbGQ8L3RoPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjx0aD5SZXF1aXJlZG5lc3M8LyIKLSAgICAgICAgICAgICJ0aD48dGg+RGVmYXVsdCB2YWx1ZTwvdGg+PC90aGVhZD4iIDw8IGVuZGw7Ci0gIGZvciAoOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7Ci0gICAgZl9vdXRfIDw8ICI8dHI+PHRkPiIgPDwgKCptZW1faXRlciktPmdldF9rZXkoKSA8PCAiPC90ZD48dGQ+IjsKLSAgICBmX291dF8gPDwgKCptZW1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgIHByaW50X3R5cGUoKCptZW1faXRlciktPmdldF90eXBlKCkpOwotICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKLSAgICBmX291dF8gPDwgZXNjYXBlX2h0bWwoKCptZW1faXRlciktPmdldF9kb2MoKSk7Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgIGlmICgoKm1lbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGZfb3V0XyA8PCAib3B0aW9uYWwiOwotICAgIH0gZWxzZSBpZiAoKCptZW1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBmX291dF8gPDwgInJlcXVpcmVkIjsKLSAgICB9IGVsc2UgewotICAgICAgZl9vdXRfIDw8ICJkZWZhdWx0IjsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgIHRfY29uc3RfdmFsdWUqIGRlZmF1bHRfdmFsID0gKCptZW1faXRlciktPmdldF92YWx1ZSgpOwotICAgIGlmIChkZWZhdWx0X3ZhbCAhPSBOVUxMKSB7Ci0gICAgICBmX291dF8gPDwgIjxjb2RlPiI7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZGVmYXVsdF92YWwpOwotICAgICAgZl9vdXRfIDw8ICI8L2NvZGU+IjsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjwvdHI+IiA8PCBlbmRsOwotICB9Ci0gIGZfb3V0XyA8PCAiPC90YWJsZT48YnIvPiI7Ci0gIHByaW50X2RvYyh0c3RydWN0KTsKLSAgZl9vdXRfIDw8ICI8L2Rpdj4iOwotfQotCi0vKioKLSAqIEV4Y2VwdGlvbnMgYXJlIHNwZWNpYWwgc3RydWN0cwotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfc3RydWN0KHR4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBIVE1MIGJsb2NrIGZvciBhIFRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGZfb3V0XyA8PCAiPGgzIGlkPVwiU3ZjXyIgPDwgc2VydmljZV9uYW1lXyA8PCAiXCI+U2VydmljZTogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICI8L2gzPiIgPDwgZW5kbDsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKLSAgICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJleHRlbmRzXCI+PGVtPmV4dGVuZHM8L2VtPiAiOwotICAgIHByaW50X3R5cGUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGZfb3V0XyA8PCAiPC9kaXY+XG4iOwotICB9Ci0gIHByaW50X2RvYyh0c2VydmljZSk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOwotICBmb3IgKDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgewotICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgICBmX291dF8gPDwgIjxoNCBpZD1cIkZuXyIgPDwgc2VydmljZV9uYW1lXyA8PCAiXyIgPDwgZm5fbmFtZSA8PCAiXCI+RnVuY3Rpb246ICIgPDwgc2VydmljZV9uYW1lXwotICAgICAgICAgICA8PCAiLiIgPDwgZm5fbmFtZSA8PCAiPC9oND4iIDw8IGVuZGw7Ci0gICAgZl9vdXRfIDw8ICI8cHJlPiI7Ci0gICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBvZmZzZXQgPSBwcmludF90eXBlKCgqZm5faXRlciktPmdldF9yZXR1cm50eXBlKCkpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZfb3V0XyA8PCAiICIgPDwgZm5fbmFtZSA8PCAiKCI7Ci0gICAgb2Zmc2V0ICs9IGZuX25hbWUuc2l6ZSgpICsgMjsKLSAgICB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSAoKmZuX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOwotICAgIGZvciAoOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7Ci0gICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgIGZfb3V0XyA8PCAiLCIgPDwgZW5kbDsKLSAgICAgICAgZm9yIChzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgb2Zmc2V0OyArK2kpIHsKLSAgICAgICAgICBmX291dF8gPDwgIiAiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgcHJpbnRfdHlwZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBmX291dF8gPDwgIiAiIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKCgqYXJnX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICAgIGZfb3V0XyA8PCAiID0gIjsKLSAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCphcmdfaXRlciktPmdldF90eXBlKCksICgqYXJnX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiKSIgPDwgZW5kbDsKLSAgICBmaXJzdCA9IHRydWU7Ci0gICAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7Ci0gICAgaWYgKGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKSkgewotICAgICAgZl9vdXRfIDw8ICIgICAgdGhyb3dzICI7Ci0gICAgICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKLSAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgIGZfb3V0XyA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIHByaW50X3R5cGUoKCpleF9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICB9Ci0gICAgICBmX291dF8gPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICI8L3ByZT4iOwotICAgIHByaW50X2RvYygqZm5faXRlcik7Ci0gICAgcHJpbnRfZm5fYXJnc19kb2MoKmZuX2l0ZXIpOwotICAgIGZfb3V0XyA8PCAiPC9kaXY+IjsKLSAgfQotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAotICAgIGh0bWwsCi0gICAgIkhUTUwiLAotICAgICIgICAgc3RhbmRhbG9uZTogICAgICBTZWxmLWNvbnRhaW5lZCBtb2RlLCBpbmNsdWRlcyBhbGwgQ1NTIGluIHRoZSBIVE1MIGZpbGVzLlxuIgotICAgICIgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZXMgbm8gc3R5bGUuY3NzIGZpbGUsIGJ1dCBIVE1MIGZpbGVzIHdpbGwgYmUgbGFyZ2VyLlxuIgotICAgICIgICAgbm9lc2NhcGU6ICAgICAgICBEbyBub3QgZXNjYXBlIGh0bWwgaW4gZG9jIHRleHQuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGNiYzQ1Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDUxNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjdGltZT4KLQotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnNldGZpbGw7Ci11c2luZyBzdGQ6OnNldHc7Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBKYXZhIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9qYXZhX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X2phdmFfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImJlYW5zIik7Ci0gICAgYmVhbl9zdHlsZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYW5kcm9pZCIpOwotICAgIGFuZHJvaWRfc3R5bGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInByaXZhdGUtbWVtYmVycyIpOwotICAgIHByaXZhdGVfbWVtYmVyc18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibm9jYW1lbCIpOwotICAgIG5vY2FtZWxfc3R5bGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImZ1bGxjYW1lbCIpOwotICAgIGZ1bGxjYW1lbF9zdHlsZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYW5kcm9pZF9sZWdhY3kiKTsKLSAgICBhbmRyb2lkX2xlZ2FjeV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgic29ydGVkX2NvbnRhaW5lcnMiKTsKLSAgICBzb3J0ZWRfY29udGFpbmVyc18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiamF2YTUiKTsKLSAgICBqYXZhNV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgaWYgKGphdmE1XykgewotICAgICAgYW5kcm9pZF9sZWdhY3lfID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgicmV1c2Utb2JqZWN0cyIpOwotICAgIHJldXNlX29iamVjdHNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm9wdGlvbl90eXBlIik7Ci0gICAgdXNlX29wdGlvbl90eXBlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJnZW5lcmF0ZWRfYW5ub3RhdGlvbnMiKTsKLSAgICBpZiAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSkgewotICAgICAgdW5kYXRlZF9nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfICA9IChpdGVyLT5zZWNvbmQuY29tcGFyZSgidW5kYXRlZCIpID09IDApOwotICAgICAgc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyA9IChpdGVyLT5zZWNvbmQuY29tcGFyZSgic3VwcHJlc3MiKSA9PSAwKTsKLSAgICB9IGVsc2UgewotICAgICAgdW5kYXRlZF9nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfICA9IGZhbHNlOwotICAgICAgc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyA9IGZhbHNlOwotICAgIH0KLQotICAgIG91dF9kaXJfYmFzZV8gPSAoYmVhbl9zdHlsZV8gPyAiZ2VuLWphdmFiZWFuIiA6ICJnZW4tamF2YSIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3BhcmNlbGFibGUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2ZpZWxkX2J5X2lkKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBhc19jYW1lbF9jYXNlKHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgdWNmaXJzdCA9IHRydWUpOwotICBzdGQ6OnN0cmluZyBnZXRfcnBjX21ldGhvZF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOwotICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4KTsKLSAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25faXNfc2V0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3R1cGxlX3NjaGVtZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9uYW1lKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zY2hlbWVfbWFwKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfc2NoZW1lKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZheF9nZW5lcmF0ZWRfYW5ub3RhdGlvbihvZnN0cmVhbSYgb3V0KTsKLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvYmogPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9iaiA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2JqID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKLQotICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSk7Ci0KLSAgZW51bSBpc3NldF90eXBlIHsgSVNTRVRfTk9ORSwgSVNTRVRfUFJJTUlUSVZFLCBJU1NFVF9CSVRTRVQgfTsKLSAgaXNzZXRfdHlwZSBuZWVkc19pc3NldCh0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcqIG91dFByaW1pdGl2ZVR5cGUgPSBOVUxMKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgamF2YV9wYWNrYWdlKCk7Ci0gIHN0ZDo6c3RyaW5nIGphdmFfdHlwZV9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIGphdmFfc3VwcHJlc3Npb25zKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dlbmVyaWMgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VfbmFtZXNwYWNlID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgY29tbWVudCA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Jhc2VfbWV0aG9kID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOwotICBzdGQ6OnN0cmluZyBhc3luY19hcmd1bWVudF9saXN0KHRfZnVuY3Rpb24qIHRmdW5jdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcyA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOwotICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOwotCi0gIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLQotICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKQotICAgICAgICAgICB8fCB0dHlwZS0+aXNfZW51bSgpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLQotcHJpdmF0ZToKLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKLQotICBib29sIGJlYW5fc3R5bGVfOwotICBib29sIGFuZHJvaWRfc3R5bGVfOwotICBib29sIHByaXZhdGVfbWVtYmVyc187Ci0gIGJvb2wgbm9jYW1lbF9zdHlsZV87Ci0gIGJvb2wgZnVsbGNhbWVsX3N0eWxlXzsKLSAgYm9vbCBhbmRyb2lkX2xlZ2FjeV87Ci0gIGJvb2wgamF2YTVfOwotICBib29sIHNvcnRlZF9jb250YWluZXJzXzsKLSAgYm9vbCByZXVzZV9vYmplY3RzXzsKLSAgYm9vbCB1c2Vfb3B0aW9uX3R5cGVfOwotICBib29sIHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXzsKLSAgYm9vbCBzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfOwotICAKLX07Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKLQotICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKLSAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7Ci0gIH0KLSAgaWYgKGRpci5zaXplKCkgPiAwKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgfQotCi0gIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKLX0KLQotLyoqCi0gKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKLSAqCi0gKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV9wYWNrYWdlKCkgewotICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgewotICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIjtcblxuIjsKLSAgfQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBKYXZhIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV90eXBlX2ltcG9ydHMoKSB7Ci0gIHN0cmluZyBoYXNoX2J1aWxkZXI7Ci0gIHN0cmluZyB0cmVlX3NldF9hbmRfbWFwOwotICBzdHJpbmcgYW5ub3RhdGlvbl9nZW5lcmF0ZWQ7Ci0KLSAgc3RyaW5nIG9wdGlvbjsKLSAgaWYgKHNvcnRlZF9jb250YWluZXJzXykgewotICAgIHRyZWVfc2V0X2FuZF9tYXAgPSBzdHJpbmcoKSArICJpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7XG4iICsgImltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDtcbiI7Ci0gIH0KLQotICBpZiAodXNlX29wdGlvbl90eXBlXykgewotICAgIG9wdGlvbiA9IHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb247XG4iOwotICB9Ci0KLSAgLy8gYW5kcm9pZCBkb2VzIG5vdCBzdXBwb3J0IEBHZW5lcmF0ZWQgQW5ub3RhdGlvbgotICBpZiAoIXN1cHByZXNzX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18pIHsKLSAgICBhbm5vdGF0aW9uX2dlbmVyYXRlZCA9IHN0cmluZygpICsgImltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDtcbiI7Ci0gIH0KLQotICByZXR1cm4gc3RyaW5nKCkgKyBoYXNoX2J1aWxkZXIgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lO1xuIgotICAgICAgICAgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5O1xuIgotICAgICAgICAgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZTtcblxuIgotICAgICAgICAgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTtcbiIKLSAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbDtcbiIKLSAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb247XG4iCi0gICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlscztcbiIKLSAgICAgICAgICsgb3B0aW9uCi0gICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjtcbiIKLSAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrO1xuIgotICAgICAgICAgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLio7XG4iCi0gICAgICAgICArICJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsgImltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0O1xuIiArICJpbXBvcnQgamF2YS51dGlsLk1hcDtcbiIKLSAgICAgICAgICsgImltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDtcbiIgKyAiaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwO1xuIiArICJpbXBvcnQgamF2YS51dGlsLlNldDtcbiIKLSAgICAgICAgICsgImltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDtcbiIgKyAiaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0O1xuIiArIHRyZWVfc2V0X2FuZF9tYXAKLSAgICAgICAgICsgImltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7XG4iICsgImltcG9ydCBqYXZhLnV0aWwuQml0U2V0O1xuIgotICAgICAgICAgKyAiaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7XG4iCi0gICAgICAgICArICJpbXBvcnQgamF2YS51dGlsLkFycmF5cztcbiIgKyBhbm5vdGF0aW9uX2dlbmVyYXRlZAotICAgICAgICAgKyAiaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7XG4iICsgImltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTtcblxuIjsKLX0KLQotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfc3VwcHJlc3Npb25zKCkgewotICByZXR1cm4gIkBTdXBwcmVzc1dhcm5pbmdzKHtcImNhc3RcIiwgXCJyYXd0eXBlc1wiLCBcInNlcmlhbFwiLCBcInVuY2hlY2tlZFwifSlcbiI7Ci19Ci0KLS8qKgotICogTm90aGluZyBpbiBKYXZhCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSmF2YSwgc2luY2UgaXQgZG9lcwotICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCi0gKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCl0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOwotICBvZnN0cmVhbSBmX2VudW07Ci0gIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKLSAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGVuZGw7Ci0KLSAgLy8gQWRkIGphdmEgaW1wb3J0cwotICBmX2VudW0gPDwgc3RyaW5nKCkgKyAiaW1wb3J0IGphdmEudXRpbC5NYXA7XG4iICsgImltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDtcbiIKLSAgICAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URW51bTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sIHRlbnVtKTsKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtICI7Ci0gIHNjb3BlX3VwKGZfZW51bSk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2VudW0gPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCAqY19pdGVyKTsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IHZhbHVlIDw8ICIpIjsKLSAgfQotICBmX2VudW0gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBGaWVsZCBmb3IgdGhyaWZ0Q29kZQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKGludCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgdGhpcy52YWx1ZSA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iCi0gICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgaW50IGdldFZhbHVlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIHZhbHVlOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogRmluZCBhIHRoZSBlbnVtIHR5cGUgYnkgaXRzIGludGVnZXIgdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogQHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyAiICsgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZpbmRCeVZhbHVlKGludCB2YWx1ZSkgeyAiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInN3aXRjaCAodmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY2FzZSAiIDw8IHZhbHVlIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChmX2VudW0pIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfZW51bSk7Ci0KLSAgZl9lbnVtLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICcvJyArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShwcm9ncmFtX25hbWVfKQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIkNvbnN0YW50cy5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3N1cHByZXNzaW9ucygpOwotCi0gIGZfY29uc3RzIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2NvbnN0cywgKCpjX2l0ZXIpKTsKLSAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaW5kZW50KG91dCk7Ci0gIGlmICghZGVmdmFsKSB7Ci0gICAgb3V0IDw8IChpbl9zdGF0aWMgPyAiIiA6ICJwdWJsaWMgc3RhdGljIGZpbmFsICIpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7Ci0gIH0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdHlwZSwgdmFsdWUpOwotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOwotICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKLSAgICAgIG91dCA8PCAic2V0IiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXQoIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5hZGQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJlbmRlciA8PCAiKGRvdWJsZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9wcmVmaXggPSB0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7Ci0gICAgaWYgKG5hbWVzcGFjZV9wcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICBuYW1lc3BhY2VfcHJlZml4ICs9ICIuIjsKLSAgICB9Ci0gICAgcmVuZGVyIDw8IG5hbWVzcGFjZV9wcmVmaXggPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX3dpdGhfcGFyZW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIHdpbGwgYmUgYSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZQotICogaW1wbGVtZW50b3IuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV91bmlvbih0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICArICIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3N1cHByZXNzaW9ucygpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLS8qKgotICogSmF2YSB1bmlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9zdHJ1Y3Q7Ci0gIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKLQotICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3R5cGVfaW1wb3J0cygpIDw8IGphdmFfc3VwcHJlc3Npb25zKCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLQotICBpbmRlbnQoZl9zdHJ1Y3QpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRVbmlvbjwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5fRmllbGRzPiAiOwotCi0gIHNjb3BlX3VwKGZfc3RydWN0KTsKLQotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3IoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2lzX3NldF9tZXRob2RzKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc3RydWN0KTsKLQotICBmX3N0cnVjdC5jbG9zZSgpOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGJvb2wgZGVmYXVsdF92YWx1ZSA9IGZhbHNlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdXBlcihfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGRlZmF1bHRfdmFsdWUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmIChkZWZhdWx0X3ZhbHVlID09IGZhbHNlKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInN1cGVyKCk7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKF9GaWVsZHMgc2V0RmllbGQsIE9iamVjdCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIoc2V0RmllbGQsIHZhbHVlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKG90aGVyKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSAiY29uc3RydWN0b3JzIiBmb3IgZWFjaCBmaWVsZAotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsdWUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICIoYnl0ZVtdIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICA8PCAiKEJ5dGVCdWZmZXIud3JhcChBcnJheXMuY29weU9mKHZhbHVlLCB2YWx1ZS5sZW5ndGgpKSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHg7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLQotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKLQotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYnl0ZVtdIGdldCIgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIob3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIucmlnaHRTaXplKGJ1ZmZlciIKLSAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgY2FwX25hbWUgPDwgIigpKSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgQnl0ZUJ1ZmZlciBiID0gYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gYiA9PSBudWxsID8gbnVsbCA6IGIuYXJyYXkoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgQnl0ZUJ1ZmZlciBidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikKLSAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KQotICAgICAgICAgIDw8ICIgICAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoKEJ5dGVCdWZmZXIpZ2V0RmllbGRWYWx1ZSgpKTsiCi0gICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBnZXQgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byBcIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIGdldCIKLSAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiAoIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUpIDw8ICIpZ2V0RmllbGRWYWx1ZSgpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oXCJDYW5ub3QgZ2V0IGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIHVuaW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gXCIgKyBnZXRGaWVsZERlc2MoZ2V0U2V0RmllbGQoKSkubmFtZSk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIihieXRlW10gdmFsdWUpIHsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICA8PCAiKEJ5dGVCdWZmZXIud3JhcChBcnJheXMuY29weU9mKHZhbHVlLCB2YWx1ZS5sZW5ndGgpKSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICIgIHNldEZpZWxkXyA9IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB2YWx1ZV8gPSB2YWx1ZTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCkgeyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gc2V0RmllbGRfID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfY2hlY2tfdHlwZShvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3JlYWRfdmFsdWUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV93cml0ZV92YWx1ZShvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3JlYWRfdmFsdWUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3R1cGxlX3NjaGVtZV93cml0ZV92YWx1ZShvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBfRmllbGRzIGVudW1Gb3JJZChzaG9ydCBpZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWRPclRocm93KGlkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJwcm90ZWN0ZWQgdm9pZCBjaGVja1R5cGUoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsiCi0gICAgICA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSBpbnN0YW5jZW9mICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSwgdHJ1ZSkKLSAgICAgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihcIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSAiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiBmb3IgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICA8PCAiJywgYnV0IGdvdCBcIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsiIDw8IGVuZGw7Ci0gICAgLy8gZG8gdGhlIHJlYWwgY2hlY2sgaGVyZQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3JlYWRfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBPYmplY3Qgc3RhbmRhcmRTY2hlbWVSZWFkVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sICIKLSAgICAgICAgICAgICAgICAgImlwcm90LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgZmllbGQpIHRocm93cyAiCi0gICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMgc2V0RmllbGQgPSBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkLmlkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDLnR5cGUpIHsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55ICIKLSAgICAgICAgICAgICAgICAgIm9mIHRoZSBjYXNlIHN0YXRlbWVudHMhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV93cml0ZV92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgc3RhbmRhcmRTY2hlbWVXcml0ZVZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCAiCi0gICAgICAgICAgICAgICAgICJvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZF8pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9ICgiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZV87IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgXCIgKyAiCi0gICAgICAgICAgICAgICAgICJzZXRGaWVsZF8pOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R1cGxlX3NjaGVtZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgT2JqZWN0IHR1cGxlU2NoZW1lUmVhZFZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCAiCi0gICAgICAgICAgICAgICAgICJpcHJvdCwgc2hvcnQgZmllbGRJRCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiX0ZpZWxkcyBzZXRGaWVsZCA9IF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJRCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSAiCi0gICAgICAgICAgICAgICAgICJvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oXCJDb3VsZG4ndCBmaW5kIGEgZmllbGQgd2l0aCBmaWVsZCBpZCBcIiArIGZpZWxkSUQpOyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R1cGxlX3NjaGVtZV93cml0ZV92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgdHVwbGVTY2hlbWVXcml0ZVZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgIgotICAgICAgICAgICAgICAgICAidGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZF8pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9ICgiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZV87IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgXCIgKyAiCi0gICAgICAgICAgICAgICAgICJzZXRGaWVsZF8pOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IgotICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0M7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBnZXRTdHJ1Y3REZXNjKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIFNUUlVDVF9ERVNDOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgLy8gZXF1YWxpdHkKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGlmIChvdGhlciBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBlcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKW90aGVyKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBvdGhlciAhPSBudWxsICYmIGdldFNldEZpZWxkKCkgPT0gb3RoZXIuZ2V0U2V0RmllbGQoKSAmJiAiCi0gICAgICAgICAgICAgICAgICJnZXRGaWVsZFZhbHVlKCkuZXF1YWxzKG90aGVyLmdldEZpZWxkVmFsdWUoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGludCBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRTZXRGaWVsZCgpLCAiCi0gICAgICAgICAgICAgICAgICJvdGhlci5nZXRTZXRGaWVsZCgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGlmIChsYXN0Q29tcGFyaXNvbiA9PSAwKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0RmllbGRWYWx1ZSgpLCAiCi0gICAgICAgICAgICAgICAgICJvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGxpc3QuYWRkKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHNldEZpZWxkID0gZ2V0U2V0RmllbGQoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGlmIChzZXRGaWVsZCAhPSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIGxpc3QuYWRkKHNldEZpZWxkLmdldFRocmlmdEZpZWxkSWQoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIE9iamVjdCB2YWx1ZSA9IGdldEZpZWxkVmFsdWUoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgaWYgKHZhbHVlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS50aHJpZnQuVEVudW0pIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgICBsaXN0LmFkZCgoKG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtKWdldEZpZWxkVmFsdWUoKSkuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIH0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgICAgbGlzdC5hZGQodmFsdWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iOwotfQotCi0vKioKLSAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKLSAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAotICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KLSAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcwotICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgdHN0cnVjdCk7Ci0KLSAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOwotCi0gIGlmICghaW5fY2xhc3MgJiYgIXN1cHByZXNzX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18pIHsKLSAgICBnZW5lcmF0ZV9qYXZheF9nZW5lcmF0ZWRfYW5ub3RhdGlvbihvdXQpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8IChpbl9jbGFzcyA/ICJzdGF0aWMgIiA6ICIiKSA8PCAiY2xhc3MgIgotICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJleHRlbmRzIFRFeGNlcHRpb24gIjsKLSAgfQotICBvdXQgPDwgImltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgPDwgIi5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIj4iOwotCi0gIGlmIChhbmRyb2lkX3N0eWxlXykgewotICAgIG91dCA8PCAiLCBhbmRyb2lkLm9zLlBhcmNlbGFibGUiOwotICB9Ci0KLSAgb3V0IDw8ICIgIjsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG91dCwgdHN0cnVjdCk7Ci0KLSAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtamF2YSwgcHJpdmF0ZSBmb3IgLWphdmFiZWFuCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3V0LCB0c3RydWN0KTsKLQotICBvdXQgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9zY2hlbWVfbWFwKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmIChiZWFuX3N0eWxlXyB8fCBwcml2YXRlX21lbWJlcnNfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICptX2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiOwotICAgIH0KLSAgICBvdXQgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgdHJ1ZSkgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIGlmIChhbmRyb2lkX3N0eWxlXykgewotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3BhcmNlbGFibGUob3V0LCB0c3RydWN0KTsKLSAgfQotCi0gIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG91dCwgdHN0cnVjdCk7Ci0KLSAgLy8gaXNzZXQgZGF0YQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gaXNzZXQgaWQgYXNzaWdubWVudHMiIDw8IGVuZGw7Ci0KLSAgICBpbnQgaSA9IDA7Ci0gICAgaW50IG9wdGlvbmFscyA9IDA7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgb3B0aW9uYWxzKys7Ci0gICAgICB9Ci0gICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICIgPDwgaXNzZXRfZmllbGRfaWQoKm1faXRlcikgPDwgIiA9ICIgPDwgaSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIHByaW1pdGl2ZVR5cGU7Ci0gICAgc3dpdGNoIChuZWVkc19pc3NldCh0c3RydWN0LCAmcHJpbWl0aXZlVHlwZSkpIHsKLSAgICBjYXNlIElTU0VUX05PTkU6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElTU0VUX1BSSU1JVElWRToKLSAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgcHJpbWl0aXZlVHlwZSA8PCAiIF9faXNzZXRfYml0ZmllbGQgPSAwOyIgPDwgZW5kbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVNTRVRfQklUU0VUOgotICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgQml0U2V0IF9faXNzZXRfYml0X3ZlY3RvciA9IG5ldyBCaXRTZXQoIiA8PCBpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChvcHRpb25hbHMgPiAwKSB7Ci0gICAgICBzdGQ6OnN0cmluZyBvdXRwdXRfc3RyaW5nID0gInByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7IjsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgICBvdXRwdXRfc3RyaW5nID0gb3V0cHV0X3N0cmluZyArICJfRmllbGRzLiIgKyBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiLCI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8IG91dHB1dF9zdHJpbmcuc3Vic3RyKDAsIG91dHB1dF9zdHJpbmcubGVuZ3RoKCkgLSAxKSA8PCAifTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKG91dCwgdHN0cnVjdCk7Ci0KLSAgYm9vbCBhbGxfb3B0aW9uYWxfbWVtYmVycyA9IHRydWU7Ci0KLSAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgIH0KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgYWxsX29wdGlvbmFsX21lbWJlcnMgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoIW1lbWJlcnMuZW1wdHkoKSAmJiAhYWxsX29wdGlvbmFsX21lbWJlcnMpIHsKLSAgICAvLyBGdWxsIGNvbnN0cnVjdG9yIGZvciBhbGwgZmllbGRzCi0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIikiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcygpOyIgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgIDw8ICIgPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICgqbV9pdGVyKSwgIiIpOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGNvcHkgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCkpIHsKLSAgY2FzZSBJU1NFVF9OT05FOgotICAgIGJyZWFrOwotICBjYXNlIElTU0VUX1BSSU1JVElWRToKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IG90aGVyLl9faXNzZXRfYml0ZmllbGQ7IiA8PCBlbmRsOwotICAgIGJyZWFrOwotICBjYXNlIElTU0VUX0JJVFNFVDoKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3Iub3Iob3RoZXIuX19pc3NldF9iaXRfdmVjdG9yKTsiIDw8IGVuZGw7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHR5cGUpOwotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCAib3RoZXIiLCBmaWVsZF9uYW1lLCAiX190aGlzX18iICsgZmllbGRfbmFtZSwgdHlwZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IF9fdGhpc19fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsICJvdGhlci4iICsgZmllbGRfbmFtZSwgZmllbGRfbmFtZSwgdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBjbG9uZSBtZXRob2QsIHNvIHRoYXQgeW91IGNhbiBkZWVwIGNvcHkgYW4gb2JqZWN0IHdoZW4geW91IGRvbid0IGtub3cgaXRzIGNsYXNzLgotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2ZpZWxkX2J5X2lkKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3Qob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3Qob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9zdGFuZGFyZF9zY2hlbWUob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9zY2hlbWUob3V0LCB0c3RydWN0KTsKLQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIGdlbmVyYXRlcyBwYXJjZWxhYmxlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3BhcmNlbGFibGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHRuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAicHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBvdXQsIGludCBmbGFncykgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHN0cmluZyBiaXRzZXRQcmltaXRpdmVUeXBlID0gIiI7Ci0gIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCwgJmJpdHNldFByaW1pdGl2ZVR5cGUpKSB7Ci0gIGNhc2UgSVNTRVRfTk9ORToKLSAgICBicmVhazsKLSAgY2FzZSBJU1NFVF9QUklNSVRJVkU6Ci0gICAgaW5kZW50KG91dCkgPDwgIi8vcHJpbWl0aXZlIGJpdGZpZWxkIG9mIHR5cGU6ICIgPDwgYml0c2V0UHJpbWl0aXZlVHlwZSA8PCBlbmRsOwotICAgIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJieXRlIikgewotICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUJ5dGUoX19pc3NldF9iaXRmaWVsZCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAic2hvcnQiKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KG5ldyBTaG9ydChfX2lzc2V0X2JpdGZpZWxkKS5pbnRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJpbnQiKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KF9faXNzZXRfYml0ZmllbGQpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gImxvbmciKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlTG9uZyhfX2lzc2V0X2JpdGZpZWxkKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICAgIGJyZWFrOwotICBjYXNlIElTU0VUX0JJVFNFVDoKLSAgICBpbmRlbnQob3V0KSA8PCAiLy9CaXRTZXQiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZVNlcmlhbGl6YWJsZShfX2lzc2V0X2JpdF92ZWN0b3IpOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBicmVhazsKLSAgfQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgaWYgKHQtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlUGFyY2VsYWJsZSgiIDw8IG5hbWUgPDwgIiwgZmxhZ3MpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR5cGVfbmFtZSh0KSA9PSAiZmxvYXQiKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlRmxvYXQoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludCgiIDw8IG5hbWUgPDwgIi5nZXRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICAgIGlmICgoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpLT5pc19zdHJ1Y3QoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlVHlwZWRMaXN0KCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlTGlzdCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVNYXAoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdCktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQoIiA8PCBuYW1lIDw8ICIhPW51bGwgPyAxIDogMCk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYoIiA8PCBuYW1lIDw8ICIgIT0gbnVsbCkgeyAiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlQnl0ZUFycmF5KCIgPDwgbmFtZSA8PCAiLmFycmF5KCksICIgPDwgbmFtZSA8PCAiLnBvc2l0aW9uKCkgKyAiCi0gICAgICAgICAgICAgICAgICAgIDw8IG5hbWUgPDwgIi5hcnJheU9mZnNldCgpLCAiIDw8IG5hbWUgPDwgIi5saW1pdCgpIC0gIiA8PCBuYW1lCi0gICAgICAgICAgICAgICAgICAgIDw8ICIucG9zaXRpb24oKSApOyIgPDwgZW5kbDsKLSAgICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KG5ldyBTaG9ydCgiIDw8IG5hbWUgPDwgIikuaW50VmFsdWUoKSk7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVMb25nKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiID8gMSA6IDApOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0bmFtZSA8PCAiKGFuZHJvaWQub3MuUGFyY2VsIGluKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgLy8gcmVhZCBpbiB0aGUgcmVxdWlyZWQgYml0ZmllbGQKLSAgc3dpdGNoIChuZWVkc19pc3NldCh0c3RydWN0LCAmYml0c2V0UHJpbWl0aXZlVHlwZSkpIHsKLSAgY2FzZSBJU1NFVF9OT05FOgotICAgIGJyZWFrOwotICBjYXNlIElTU0VUX1BSSU1JVElWRToKLSAgICBpbmRlbnQob3V0KSA8PCAiLy9wcmltaXRpdmUgYml0ZmllbGQgb2YgdHlwZTogIiA8PCBiaXRzZXRQcmltaXRpdmVUeXBlIDw8IGVuZGw7Ci0gICAgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gImJ5dGUiKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IGluLnJlYWRCeXRlKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAic2hvcnQiKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IChzaG9ydCkgaW4ucmVhZEludCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gImludCIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gaW4ucmVhZEludCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gImxvbmciKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IGluLnJlYWRMb25nKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgICBicmVhazsKLSAgY2FzZSBJU1NFVF9CSVRTRVQ6Ci0gICAgaW5kZW50KG91dCkgPDwgIi8vQml0U2V0IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3IgPSAoQml0U2V0KSBpbi5yZWFkU2VyaWFsaXphYmxlKCk7IiA8PCBlbmRsOwotICAgIG91dCA8PCBlbmRsOwotICAgIGJyZWFrOwotICB9Ci0gIC8vIHJlYWQgYWxsIHRoZSBmaWVsZHMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgcHJlZml4ID0gInRoaXMuIiArIG5hbWU7Ci0KLSAgICBpZiAodC0+aXNfc3RydWN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiPSBpbi5yZWFkUGFyY2VsYWJsZSgiIDw8IHRuYW1lIDw8ICIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0KSA8PCAiLmZpbmRCeVZhbHVlKGluLnJlYWRJbnQoKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgICB0X2xpc3QqIGxpc3QgPSAodF9saXN0Kil0OwotICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodCwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpZiAobGlzdC0+Z2V0X2VsZW1fdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCktPmlzX3N0cnVjdCgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpbi5yZWFkVHlwZWRMaXN0KCIgPDwgcHJlZml4IDw8ICIsICIgPDwgdHlwZV9uYW1lKGxpc3QtPmdldF9lbGVtX3R5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgPDwgIi5DUkVBVE9SKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaW4ucmVhZExpc3QoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCB0bmFtZSA8PCAiLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOyIKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0LCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgaW4ucmVhZE1hcCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IHRuYW1lIDw8ICIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR5cGVfbmFtZSh0KSA9PSAiZmxvYXQiKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRGbG9hdCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZSogYnQgPSAodF9iYXNlX3R5cGUqKXQ7Ci0gICAgICBpZiAoYnQtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZihpbi5yZWFkSW50KCk9PTEpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IEJ5dGVCdWZmZXIud3JhcChpbi5jcmVhdGVCeXRlQXJyYXkoKSk7IiA8PCBlbmRsOwotICAgICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKGJ0LT5nZXRfYmFzZSgpKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gKHNob3J0KSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZExvbmcoKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IChpbi5yZWFkSW50KCk9PTEpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZEJ5dGUoKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZERvdWJsZSgpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICI9IGluLnJlYWRTdHJpbmcoKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8IiA8PCB0bmFtZQotICAgICAgICAgICAgICA8PCAiPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPCIgPDwgdG5hbWUgPDwgIj4oKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCB0bmFtZSA8PCAiW10gbmV3QXJyYXkoaW50IHNpemUpIHsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRuYW1lIDw8ICJbc2l6ZV07IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IHRuYW1lCi0gICAgICAgICAgICAgIDw8ICIgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBpbikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdG5hbWUgPDwgIihpbik7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7IgotICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0IGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICByZXR1cm4gdGhpcy5lcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKXRoYXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgdGhhdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCi0gICAgLy8gc28gd2UgdHJlYXQgImRlZmF1bHQiIGZpZWxkcyBhcyByZXF1aXJlZC4KLSAgICBib29sIGlzX29wdGlvbmFsID0gKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0KTsKLSAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIHN0cmluZyB0aGlzX3ByZXNlbnQgPSAidHJ1ZSI7Ci0gICAgc3RyaW5nIHRoYXRfcHJlc2VudCA9ICJ0cnVlIjsKLSAgICBzdHJpbmcgdW5lcXVhbDsKLQotICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgewotICAgICAgdGhpc19wcmVzZW50ICs9ICIgJiYgdGhpcy4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7Ci0gICAgICB0aGF0X3ByZXNlbnQgKz0gIiAmJiB0aGF0LiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2xlYW4gdGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIiA8PCB0aGlzX3ByZXNlbnQgPDwgIjsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImJvb2xlYW4gdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIiA8PCB0aGF0X3ByZXNlbnQgPDwgIjsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgiCi0gICAgICAgIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgfHwgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCEoIgotICAgICAgICA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiICYmIHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIikpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdCktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKLSAgICB9IGVsc2UgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKLSAgICB9IGVsc2UgewotICAgICAgdW5lcXVhbCA9ICJ0aGlzLiIgKyBuYW1lICsgIiAhPSB0aGF0LiIgKyBuYW1lOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgdW5lcXVhbCA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOyIgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBzdHJpbmcgcHJlc2VudCA9ICJ0cnVlIjsKLQotICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgewotICAgICAgcHJlc2VudCArPSAiICYmICgiICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcikgKyAiKSI7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgImJvb2xlYW4gcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgcHJlc2VudCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibGlzdC5hZGQocHJlc2VudF8iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAocHJlc2VudF8iIDw8IG5hbWUgPDwgIikiIDw8IGVuZGw7Ci0gICAgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgbGlzdC5hZGQoIiA8PCBuYW1lIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBsaXN0LmFkZCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGxpc3QuaGFzaENvZGUoKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXIuZ2V0Q2xhc3MoKSkpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJpbnQgbGFzdENvbXBhcmlzb24gPSAwOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKm1faXRlcjsKLSAgICBpbmRlbnQob3V0KSA8PCAibGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkKLSAgICAgICAgICAgICAgICA8PCAiKS5jb21wYXJlVG8ob3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuIgotICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIG90aGVyLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90KSB0aHJvd3MgIgotICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCi0vLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaWYgKGJlYW5fc3R5bGVfKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIgotICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIGlzIHVuc2V0ISBTdHJ1Y3Q6XCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KG91dCkKLSAgICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciCi0gICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIGl0J3MgYSBwcmltaXRpdmUgYW5kIHlvdSBjaG9zZSB0aGUgbm9uLWJlYW5zIGdlbmVyYXRvci4iCi0gICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHN1Yi1zdHJ1Y3QgdmFsaWRpdHkiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSAmJiAhKCh0X3N0cnVjdCopdHlwZSktPmlzX3VuaW9uKCkpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLnZhbGlkYXRlKCk7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICAodm9pZCl0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3MgIgotICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKLSAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgotICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KLSAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzICIKLSAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8ICh0eXBlLT5pc19ib29sKCkgPyAiaXMiIDogImdldCIpIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCgiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07Ci0KLSAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBjcmVhdGUgdGhlIHNldHRlcgotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc3dpdGNoIChmaWVsZCkgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IHNldHRlcl9zdHJlYW0uc3RyKCk7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY3JlYXRlIHRoZSBnZXR0ZXIKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBnZXR0ZXJfc3RyZWFtLnN0cigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKLSAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSAiCi0gICAgICAgICAgICAgICAgICJ2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2V0IG9mIEphdmEgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCi0gKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaXNzZXRfdHlwZSBpc3NldFR5cGUgPSBuZWVkc19pc3NldCh0c3RydWN0KTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7Ci0gICAgYm9vbCBvcHRpb25hbCA9IHVzZV9vcHRpb25fdHlwZV8gJiYgZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAvLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uCi0gICAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBPcHRpb248SW50ZWdlcj4gZ2V0IiA8PCBjYXBfbmFtZTsKLSAgICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOwotCi0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gT3B0aW9uLm5vbmUoKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gT3B0aW9uLnNvbWUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJzaXplKCkgeyIpIDw8IGVuZGw7Ci0KLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyAwIDogIgotICAgICAgICAgICAgICAgICAgICA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5zaXplKCk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIHRfdHlwZSogZWxlbWVudF90eXBlOwotICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIH0KLQotICAgICAgLy8gSXRlcmF0b3IgZ2V0dGVyIGZvciBzZXRzIGFuZCBsaXN0cwotICAgICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgT3B0aW9uPGphdmEudXRpbC5JdGVyYXRvcjwiIDw8IHR5cGVfbmFtZShlbGVtZW50X3R5cGUsIHRydWUsIGZhbHNlKQotICAgICAgICAgICAgICAgICAgICA8PCAiPj4gZ2V0IiA8PCBjYXBfbmFtZTsKLSAgICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiaXRlcmF0b3IoKSB7IikgPDwgZW5kbDsKLQotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIE9wdGlvbi5ub25lKCk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIE9wdGlvbi5zb21lKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuaXRlcmF0b3IoKSk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yPCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSwgdHJ1ZSwgZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgIDw8ICI+IGdldCIgPDwgY2FwX25hbWU7Ci0gICAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoIml0ZXJhdG9yKCkgeyIpIDw8IGVuZGw7Ci0KLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyBudWxsIDogIgotICAgICAgICAgICAgICAgICAgICA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5pdGVyYXRvcigpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQWRkIHRvIHNldCBvciBsaXN0LCBjcmVhdGUgaWYgdGhlIHNldC9saXN0IGlzIG51bGwKLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBhZGQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKLSAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSkgPDwgIiBlbGVtKSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5hZGQoZWxlbSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgICAgLy8gUHV0IHRvIG1hcAotICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBwdXQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKLSAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGtleV90eXBlKSA8PCAiIGtleSwgIiA8PCB0eXBlX25hbWUodmFsX3R5cGUpIDw8ICIgdmFsKSB7IgotICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dChrZXksIHZhbCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gU2ltcGxlIGdldHRlcgotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYnl0ZVtdIGdldCIgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIob3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIucmlnaHRTaXplKCIKLSAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUgPDwgIikpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsID8gbnVsbCA6ICIgPDwgZmllbGRfbmFtZSA8PCAiLmFycmF5KCk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgQnl0ZUJ1ZmZlciBidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgY2FwX25hbWUgPDwgIigpIHsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCBmaWVsZF9uYW1lIDw8ICIpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBPcHRpb248IiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSkgPDwgIj4iOwotICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkgewotICAgICAgICAgIG91dCA8PCAiIGlzIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIiBnZXQiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLmlzU2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIE9wdGlvbi5zb21lKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBPcHRpb24ubm9uZSgpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkgewotICAgICAgICAgIG91dCA8PCAiIGlzIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIiBnZXQiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2ltcGxlIHNldHRlcgotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKLSAgICAgIGlmIChiZWFuX3N0eWxlXykgewotICAgICAgICBvdXQgPDwgInZvaWQiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIihieXRlW10gIiA8PCBmaWVsZF9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCA/IChCeXRlQnVmZmVyKW51bGwiCi0gICAgICAgICAgICAgICAgICA8PCAiIDogQnl0ZUJ1ZmZlci53cmFwKEFycmF5cy5jb3B5T2YoIiA8PCBmaWVsZF9uYW1lIDw8ICIsICIgPDwgZmllbGRfbmFtZQotICAgICAgICAgICAgICAgICAgPDwgIi5sZW5ndGgpKTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIWJlYW5fc3R5bGVfKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB0aGlzOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKLSAgICBpZiAoYmVhbl9zdHlsZV8pIHsKLSAgICAgIG91dCA8PCAidm9pZCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCk7Ci0gICAgfQotICAgIG91dCA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIjsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCBmaWVsZF9uYW1lIDw8ICIpIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGZpZWxkX25hbWU7Ci0gICAgfQotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCwgIiIpOwotICAgIGlmICghYmVhbl9zdHlsZV8pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpczsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gVW5zZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAoaXNzZXRUeXBlID09IElTU0VUX1BSSU1JVElWRSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsICIKLSAgICAgICAgICAgICAgICAgIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3IuY2xlYXIoIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBpc1NldCBtZXRob2QKLSAgICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKLSAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsICIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpCi0gICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF9iaXRfdmVjdG9yLmdldCgiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgIgotICAgICAgICAgICAgICAgICAgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIsIHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3Iuc2V0KCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIsIHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIlN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiCi0gICAgICA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2xlYW4gZmlyc3QgPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotCi0gICAgaWYgKCFmaXJzdCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHNiLmFwcGVuZChcIiwgXCIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCIpOyIgPDwgZW5kbDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2IuYXBwZW5kKFwibnVsbFwiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpCi0gICAgICAgICYmICgodF9iYXNlX3R5cGUqKShnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKSkpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnRvU3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBzYik7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfc2V0KCkpCi0gICAgICAgICAgICAgICAmJiAoZ2V0X3RydWVfdHlwZSgoKHRfc2V0KilmaWVsZC0+Z2V0X3R5cGUoKSktPmdldF9lbGVtX3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpKQotICAgICAgICAgICAgICAgJiYgKCgodF9iYXNlX3R5cGUqKWdldF90cnVlX3R5cGUoKCh0X3NldCopZmllbGQtPmdldF90eXBlKCkpLT5nZXRfZWxlbV90eXBlKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAtPmlzX2JpbmFyeSgpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnRvU3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBzYik7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfbGlzdCgpKQotICAgICAgICAgICAgICAgJiYgKGdldF90cnVlX3R5cGUoKCh0X2xpc3QqKWZpZWxkLT5nZXRfdHlwZSgpKS0+Z2V0X2VsZW1fdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpCi0gICAgICAgICAgICAgICAmJiAoKCh0X2Jhc2VfdHlwZSopZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopZmllbGQtPmdldF90eXBlKCkpLT5nZXRfZWxlbV90eXBlKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAtPmlzX2JpbmFyeSgpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnRvU3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBzYik7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZCh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5hcHBlbmQoXCIpXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNiLnRvU3RyaW5nKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RhdGljIG1hcCB3aXRoIG1ldGEgZGF0YSB0byBzdG9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGZpZWxkSUQgdG8KLSAqIGZpZWxkTmFtZSBtYXBwaW5nCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSBtYXBwaW5ncwotICBpbmRlbnQob3V0KQotICAgICAgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsiCi0gICAgICA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyAiCi0gICAgICAgICAgICAgICAgICJFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgLy8gUG9wdWxhdGUgbWFwCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidG1wTWFwLnB1dChfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKQotICAgICAgICAgICAgICAgIDw8ICIsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YShcIiIgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7Ci0KLSAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQotICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOwotICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhCi0gICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOwotICAgIG91dCA8PCAiKSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgIm1ldGFEYXRhTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiCi0gICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLmNsYXNzLCBtZXRhRGF0YU1hcCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKLSAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUIikKLSAqLwotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5FTlVNIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gZ2V0X2phdmFfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlZPSUQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkJPT0wiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CWVRFIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMTYiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOwotICAgICAgcmV0dXJuICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIjsKLSAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsKLSAgICByZXR1cm4gIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQotICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIjsKLSAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyAiCi0gICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS4iCi0gICAgICAgICAgICAgICAgICAgIlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KQotICAgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkxpc3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkKLSAgICAgICAgICA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TZXRNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKLSAgICB9IGVsc2UgeyAvLyBtYXAKLSAgICAgIGluZGVudChvdXQpCi0gICAgICAgICAgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTWFwTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAiOwotICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBrZXlfdHlwZSk7Ci0gICAgICBvdXQgPDwgIiwgIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIHZhbF90eXBlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgICAgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRW51bU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkVOVU0sICIKLSAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YSgiCi0gICAgICAgICAgICAgICAgPDwgZ2V0X2phdmFfdHlwZV9zdHJpbmcodHlwZSk7Ci0gICAgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiwgXCIiIDw8ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3N5bWJvbGljKCkgPDwgIlwiIjsKLSAgICB9IGVsc2UgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiwgdHJ1ZSI7Ci0gICAgfQotICB9Ci0gIG91dCA8PCAiKSI7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzZXJ2aWNlX25hbWVfKSArICIuamF2YSI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV9zdXBwcmVzc2lvbnMoKTsKLQotICBpZiAoIXN1cHByZXNzX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18pIHsKLSAgICBnZW5lcmF0ZV9qYXZheF9nZW5lcmF0ZWRfYW5ub3RhdGlvbihmX3NlcnZpY2VfKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19zZXJ2ZXIodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5JZmFjZSI7Ci0gIH0KLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIgLkFzeW5jSWZhY2UiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBBc3luY0lmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlciwgdHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSBhcmdzIGFuZCByZXR1cm4gdHlwZXMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKLSAgICBleHRlbmRzX2NsaWVudCA9ICJvcmcuYXBhY2hlLnRocmlmdC5UU2VydmljZUNsaWVudCI7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudCBleHRlbmRzICIgPDwgZXh0ZW5kc19jbGllbnQKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBJZmFjZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykKLSAgICAgIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UU2VydmljZUNsaWVudEZhY3Rvcnk8Q2xpZW50PiB7IgotICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIEZhY3RvcnkoKSB7fSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50IGdldENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCkgeyIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBuZXcgQ2xpZW50KHByb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQgZ2V0Q2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG5ldyBDbGllbnQoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAic3VwZXIocHJvdCwgcHJvdCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgc2VwID0gIl8iOwotICAgIHN0cmluZyBqYXZhbmFtZSA9IGZ1bm5hbWU7Ci0gICAgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKLSAgICAgIHNlcCA9ICIiOwotICAgICAgamF2YW5hbWUgPSBhc19jYW1lbF9jYXNlKGZ1bm5hbWUpOwotICAgIH0KLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZCIgPDwgc2VwIDw8IGphdmFuYW1lIDw8ICIoIjsKLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgInJlY3YiIDw8IHNlcCA8PCBqYXZhbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kIikgKyBzZXAgKyBqYXZhbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3Muc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBjb25zdCBzdHJpbmcgc2VuZEJhc2VOYW1lID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJzZW5kQmFzZU9uZXdheSIgOiAic2VuZEJhc2UiOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBzZW5kQmFzZU5hbWUgPDwgIihcIiIgPDwgZnVubmFtZSA8PCAiXCIsIGFyZ3MpOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2IikgKyBzZXAgKyBqYXZhbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVjZWl2ZUJhc2UocmVzdWx0LCBcIiIgPDwgZnVubmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIgotICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9hc3luY19jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICJvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnQiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArICIuQXN5bmNDbGllbnQiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIEFzeW5jQ2xpZW50IGV4dGVuZHMgIiA8PCBleHRlbmRzCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgQXN5bmNJZmFjZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBGYWN0b3J5IG1ldGhvZAotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRGYWN0b3J5PEFzeW5jQ2xpZW50PiB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHJpdmF0ZSBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRNYW5hZ2VyIGNsaWVudE1hbmFnZXI7IgotICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHByaXZhdGUgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnk7IgotICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHB1YmxpYyBGYWN0b3J5KG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudE1hbmFnZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudE1hbmFnZXIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgInByb3RvY29sRmFjdG9yeSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgdGhpcy5jbGllbnRNYW5hZ2VyID0gY2xpZW50TWFuYWdlcjsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgIHRoaXMucHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5OyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwdWJsaWMgQXN5bmNDbGllbnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgImdldEFzeW5jQ2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgcmV0dXJuIG5ldyBBc3luY0NsaWVudChwcm90b2NvbEZhY3RvcnksIGNsaWVudE1hbmFnZXIsIHRyYW5zcG9ydCk7IgotICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIEFzeW5jQ2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgInByb3RvY29sRmFjdG9yeSwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50TWFuYWdlciwgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0KSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIocHJvdG9jb2xGYWN0b3J5LCBjbGllbnRNYW5hZ2VyLCB0cmFuc3BvcnQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIHNlcCA9ICJfIjsKLSAgICBzdHJpbmcgamF2YW5hbWUgPSBmdW5uYW1lOwotICAgIGlmIChmdWxsY2FtZWxfc3R5bGVfKSB7Ci0gICAgICBzZXAgPSAiIjsKLSAgICAgIGphdmFuYW1lID0gYXNfY2FtZWxfY2FzZShqYXZhbmFtZSk7Ci0gICAgfQotICAgIHRfdHlwZSogcmV0X3R5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIGZ1bmNsYXNzbmFtZSA9IGZ1bm5hbWUgKyAiX2NhbGwiOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgYXJnc19uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgICBzdHJpbmcgcmVzdWx0X25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAvLyBNYWluIG1ldGhvZCBib2R5Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlciwgZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgY2hlY2tSZWFkeSgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgIiA8PCBmdW5jbGFzc25hbWUgPDwgIiBtZXRob2RfY2FsbCA9IG5ldyAiICsgZnVuY2xhc3NuYW1lICsgIigiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGFzeW5jX2FyZ3VtZW50X2xpc3QoKmZfaXRlciwgYXJnX3N0cnVjdCwgcmV0X3R5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHRoaXMsIF9fX3Byb3RvY29sRmFjdG9yeSwgX19fdHJhbnNwb3J0KTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHRoaXMuX19fY3VycmVudE1ldGhvZCA9IG1ldGhvZF9jYWxsOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgX19fbWFuYWdlci5jYWxsKG1ldGhvZF9jYWxsKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgLy8gVEFzeW5jTWV0aG9kIG9iamVjdCBmb3IgdGhpcyBmdW5jdGlvbiBjYWxsCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgKyBmdW5jbGFzc25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jTWV0aG9kQ2FsbCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gTWVtYmVyIHZhcmlhYmxlcwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgIiArIHR5cGVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gTk9URSBzaW5jZSB3ZSB1c2UgYSBuZXcgQ2xpZW50IGluc3RhbmNlIHRvIGRlc2VyaWFsaXplLCBsZXQncyBrZWVwIHNlcWlkIHRvIDAgZm9yIG5vdwotICAgIC8vIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBpbnQgc2VxaWQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBDb25zdHJ1Y3RvcgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgKyBmdW5jbGFzc25hbWUgKyAiKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhc3luY19hcmd1bWVudF9saXN0KCpmX2l0ZXIsIGFyZ19zdHJ1Y3QsIHJldF90eXBlLCB0cnVlKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnQgY2xpZW50LCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFuc3BvcnQpIHRocm93cyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGNsaWVudCwgcHJvdG9jb2xGYWN0b3J5LCB0cmFuc3BvcnQsIHJlc3VsdEhhbmRsZXIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBBc3NpZ24gbWVtYmVyIHZhcmlhYmxlcwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgdGhpcy4iICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgKyAiID0gIiArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgd3JpdGVfYXJncyhvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIFNlcmlhbGl6ZSByZXF1ZXN0Ci0gICAgLy8gTk9URSB3ZSBhcmUgbGVhdmluZyBzZXFpZCBhcyAwLCBmb3Igbm93IChzZWUgYWJvdmUpCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2UoXCIiCi0gICAgICAgICAgICAgICA8PCBmdW5uYW1lIDw8ICJcIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuIgotICAgICAgICAgICAgICAgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlLkNBTEwiKSA8PCAiLCAwKSk7IgotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBhcmdzX25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc19uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigiCi0gICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKHByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFJldHVybiBtZXRob2QKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiICsgdHlwZV9uYW1lKHJldF90eXBlKSArICIgZ2V0UmVzdWx0KCkgdGhyb3dzICI7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfCi0gICAgICAgIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJpZiAoZ2V0U3RhdGUoKSAhPSBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNNZXRob2RDYWxsLlN0YXRlLlJFU1BPTlNFX1JFQUQpIHsiCi0gICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIk1ldGhvZCBjYWxsIG5vdCBmaW5pc2hlZCFcIik7IgotICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0IG1lbW9yeVRyYW5zcG9ydCA9IG5ldyAiCi0gICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0KGdldEZyYW1lQnVmZmVyKCkuYXJyYXkoKSk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudC5nZXRQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbChtZW1vcnlUcmFuc3BvcnQpOyIgPDwgZW5kbDsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKTsKLSAgICAgIGlmICghcmV0X3R5cGUtPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIihuZXcgQ2xpZW50KHByb3QpKS5yZWN2IiArIHNlcCArIGphdmFuYW1lICsgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gQ2xvc2UgY2xhc3MKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gQ2xvc2UgQXN5bmNDbGllbnQKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIEV4dGVuZHMgc3R1ZmYKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSA9PSBOVUxMKSB7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VQcm9jZXNzb3I8ST4iOwotICB9IGVsc2UgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yPEk+IjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvY2Vzc29yPEkgZXh0ZW5kcyBJZmFjZT4gZXh0ZW5kcyAiCi0gICAgICAgICAgICAgICAgICAgICA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvciB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykKLSAgICAgIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSk7IgotICAgICAgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBQcm9jZXNzb3IoSSBpZmFjZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKG5ldyBIYXNoTWFwPFN0cmluZywgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4oKSkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgUHJvY2Vzc29yKEkgaWZhY2UsIE1hcDxTdHJpbmcsICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKHByb2Nlc3NNYXApKTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgPEkgZXh0ZW5kcyBJZmFjZT4gTWFwPFN0cmluZywgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZT4+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJnZXRQcm9jZXNzTWFwKE1hcDxTdHJpbmcsICBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiBwcm9jZXNzTWFwKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3NNYXAucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIgotICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcHJvY2Vzc01hcDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRXh0ZW5kcyBzdHVmZgotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUFzeW5jUHJvY2Vzc29yPEk+IjsKLSAgfSBlbHNlIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLkFzeW5jUHJvY2Vzc29yPEk+IjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNQcm9jZXNzb3I8SSBleHRlbmRzIEFzeW5jSWZhY2U+IGV4dGVuZHMgIgotICAgICAgICAgICAgICAgICAgICAgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXN5bmNQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQXN5bmNQcm9jZXNzb3IoSSBpZmFjZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKG5ldyBIYXNoTWFwPFN0cmluZywgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UsID8+PigpKSk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCBBc3luY1Byb2Nlc3NvcihJIGlmYWNlLCBNYXA8U3RyaW5nLCAgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLCA/Pj4gcHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKHByb2Nlc3NNYXApKTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgPEkgZXh0ZW5kcyBBc3luY0lmYWNlPiBNYXA8U3RyaW5nLCAgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLD8+PiBnZXRQcm9jZXNzTWFwKE1hcDxTdHJpbmcsICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UsID8+PiBwcm9jZXNzTWFwKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3NNYXAucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIgotICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcHJvY2Vzc01hcDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfYXN5bmNfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfYXN5bmNfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmVzdWx0bmFtZSA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSI7Ci0gIH0KLQotICBzdHJpbmcgcmVzdWx0dHlwZSA9IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksIHRydWUpOwotCi0gICh2b2lkKXRzZXJ2aWNlOwotICAvLyBPcGVuIGNsYXNzCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgPDwgIjxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCAiCi0gICAgICAgICAgICAgICAgICAgICA8PCBhcmdzbmFtZSA8PCAiLCAiIDw8IHJlc3VsdHR5cGUgPDwgIj4geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGFyZ3NuYW1lIDw8ICIgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIEFzeW5jTWV0aG9kQ2FsbGJhY2s8IiA8PCByZXN1bHR0eXBlCi0gICAgICAgICAgICAgICAgICAgICA8PCAiPiBnZXRSZXN1bHRIYW5kbGVyKGZpbmFsIEFzeW5jRnJhbWVCdWZmZXIgZmIsIGZpbmFsIGludCBzZXFpZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZmluYWwgb3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb24gZmNhbGwgPSB0aGlzOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbmV3IEFzeW5jTWV0aG9kQ2FsbGJhY2s8IiA8PCByZXN1bHR0eXBlIDw8ICI+KCkgeyAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIG9uQ29tcGxldGUoIiA8PCByZXN1bHR0eXBlIDw8ICIgbykgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zdWNjZXNzID0gbzsiIDw8IGVuZGw7Ci0gICAgICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAotICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pCi0gICAgICAgIDw8ICIgIGZjYWxsLnNlbmRSZXNwb25zZShmYixyZXN1bHQsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5SRVBMWSxzZXFpZCk7IgotICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIExPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGludGVybmFsIGZyYW1lIGJ1ZmZlclwiLCBlKTsiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZmIuY2xvc2UoKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJieXRlIG1zZ1R5cGUgPSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFk7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UgbXNnOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgaWYgKHhfaXRlciAhPSB4Y2VwdGlvbnMuYmVnaW4oKSkKLSAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVsc2UgIjsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZSBpbnN0YW5jZW9mICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIpIGU7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKnhfaXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIih0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBpbmRlbnQoKSA8PCAibXNnID0gcmVzdWx0OyIgPDwgZW5kbDsKLQotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiBlbHNlICIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtc2dUeXBlID0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtc2cgPSAob3JnLmFwYWNoZS50aHJpZnQuVEJhc2UpbmV3ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsIGUuZ2V0TWVzc2FnZSgpKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBmY2FsbC5zZW5kUmVzcG9uc2UoZmIsbXNnLG1zZ1R5cGUsc2VxaWQpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgTE9HR0VSLmVycm9yKFwiRXhjZXB0aW9uIHdyaXRpbmcgdG8gaW50ZXJuYWwgZnJhbWUgYnVmZmVyXCIsIGV4KTsiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZmIuY2xvc2UoKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCBib29sZWFuIGlzT25ld2F5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybiAiIDw8ICgodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCBzdGFydChJIGlmYWNlLCAiIDw8IGFyZ3NuYW1lCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIGFyZ3MsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8IiA8PCByZXN1bHR0eXBlCi0gICAgICAgICAgICAgICAgICAgICA8PCAiPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAiaWZhY2UuIiA8PCBnZXRfcnBjX21ldGhvZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBpZiAoIWZpcnN0KQotICAgIGZfc2VydmljZV8gPDwgIiwiOwotICBmX3NlcnZpY2VfIDw8ICJyZXN1bHRIYW5kbGVyIjsKLSAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IjsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgY2xhc3MKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmVzdWx0bmFtZSA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSI7Ci0gIH0KLQotICAodm9pZCl0c2VydmljZTsKLSAgLy8gT3BlbiBjbGFzcwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICI8SSBleHRlbmRzIElmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCAiCi0gICAgICAgICAgICAgICAgICAgICA8PCBhcmdzbmFtZSA8PCAiPiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgYXJnc25hbWUgPDwgIiBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZXdheSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gIiA8PCAoKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgcmVzdWx0bmFtZSA8PCAiIGdldFJlc3VsdChJIGlmYWNlLCAiIDw8IGFyZ3NuYW1lCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIGFyZ3MpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgImlmYWNlLiIgPDwgZ2V0X3JwY19tZXRob2RfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQotICAgICAgJiYgIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCi0gICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcmVzdWx0OyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBDbG9zZSBjbGFzcwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSwgaGFzX21ldGFkYXRhKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7Ci0KLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKLSAgICAgICAgICAgICAgICAgICArICIuZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotCi0gIGlmIChyZXVzZV9vYmplY3RzXykgewotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGlmIChyZXVzZV9vYmplY3RzXykgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZwotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgewotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIG9iajsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbWFwIik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfc2V0Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKLSAgfQotCi0gIGlmIChoYXNfbWV0YWRhdGEpIHsKLSAgICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCAiIDw8IG9iagotICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKCIKLSAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgPDwgImlwcm90LnJlYWRJMzIoKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCAiIDw8IG9iagotICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0KCIKLSAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgaXByb3QucmVhZEkzMigpKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0ICIgPDwgb2JqCi0gICAgICAgICAgICAgICAgICA8PCAiID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KCIKLSAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgaXByb3QucmVhZEkzMigpKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmIChyZXVzZV9vYmplY3RzXykgewotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKLSAgaWYgKHNvcnRlZF9jb250YWluZXJzXyAmJiAodHR5cGUtPmlzX21hcCgpIHx8IHR0eXBlLT5pc19zZXQoKSkpIHsKLSAgICAvLyBUcmVlU2V0IGFuZCBUcmVlTWFwIGRvbid0IGhhdmUgYW55IGNvbnN0cnVjdG9yIHdoaWNoIHRha2VzIGEgY2FwYWN0aXR5IGFzIGFuIGFyZ3VtZW50Ci0gICAgb3V0IDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICIoIiA8PCAodHR5cGUtPmlzX2xpc3QoKSA/ICIiIDogIjIqIikgPDwgb2JqIDw8ICIuc2l6ZSIKLSAgICAgICAgPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHJldXNlX29iamVjdHNfKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCwgb2JqLCBoYXNfbWV0YWRhdGEpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4LCBvYmosIGhhc19tZXRhZGF0YSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgsIG9iaiwgaGFzX21ldGFkYXRhKTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAoaGFzX21ldGFkYXRhKSB7Ci0gICAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXksIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgcmV1c2Vfb2JqZWN0c18sIGZhbHNlKSA8PCBlbmRsOwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgotICAgICAgICAgICAgICA8PCAiOyAiCi0gICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksICIiLCBoYXNfbWV0YWRhdGEpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCAiIiwgaGFzX21ldGFkYXRhKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXQoIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotCi0gIGlmIChyZXVzZV9vYmplY3RzXyAmJiAhZ2V0X3RydWVfdHlwZShma2V5LmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGluZGVudChvdXQpIDw8IGtleSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAocmV1c2Vfb2JqZWN0c18gJiYgIWdldF90cnVlX3R5cGUoZnZhbC5nZXRfdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCB2YWwgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSwgcmV1c2Vfb2JqZWN0c18sIGZhbHNlKSA8PCBlbmRsOwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgotICAgICAgICAgICAgICA8PCAiOyAiCi0gICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgIiIsIGhhc19tZXRhZGF0YSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGluZGVudChvdXQpIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSwgcmV1c2Vfb2JqZWN0c18sIGZhbHNlKSA8PCBlbmRsOwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgotICAgICAgICAgICAgICA8PCAiOyAiCi0gICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgIiIsIGhhc19tZXRhZGF0YSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGluZGVudChvdXQpIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpLCBoYXNfbWV0YWRhdGEpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUkzMigiIDw8IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKHN0cnVjdC4iIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgotICogQHBhcmFtIHByZWZpeCBTdHJpbmcgcHJlZml4IGZvciBmaWVsZHMKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKGhhc19tZXRhZGF0YSkgewotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKCIKLSAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCgiCi0gICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4Ci0gICAgICAgICAgICAgICAgICA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QoIgotICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKLSAgICAgICAgICAgICAgICAgIDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVJMzIoIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAoTWFwLkVudHJ5PCIgPDwgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHRydWUsIGZhbHNlKQotICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiPiAiIDw8IGl0ZXIKLSAgICAgICAgICAgICAgICA8PCAiIDogIiA8PCBwcmVmaXggPDwgIi5lbnRyeVNldCgpKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCB0eXBlX25hbWUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyIDw8ICIgOiAiCi0gICAgICAgICAgICAgICAgPDwgcHJlZml4IDw8ICIpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PCAiIDogIgotICAgICAgICAgICAgICAgIDw8IHByZWZpeCA8PCAiKSI7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCwgaGFzX21ldGFkYXRhKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyLCBoYXNfbWV0YWRhdGEpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIsIGhhc19tZXRhZGF0YSk7Ci0gIH0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmIChoYXNfbWV0YWRhdGEpIHsKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gICh2b2lkKW1hcDsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLmdldEtleSgpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaXRlciArICIuZ2V0VmFsdWUoKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgSmF2YSB0eXBlIG5hbWUKLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEBwYXJhbSBjb250YWluZXIgSXMgdGhlIHR5cGUgZ29pbmcgaW5zaWRlIGEgY29udGFpbmVyPwotICogQHJldHVybiBKYXZhIHR5cGUgbmFtZSwgaS5lLiBIYXNoTWFwPEtleSxWYWx1ZT4KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZV9uYW1lc3BhY2UpIHsKLSAgLy8gSW4gSmF2YSB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOwotICAgIGlmIChpbl9pbml0KSB7Ci0gICAgICBpZiAoc29ydGVkX2NvbnRhaW5lcnNfKSB7Ci0gICAgICAgIHByZWZpeCA9ICJUcmVlTWFwIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByZWZpeCA9ICJIYXNoTWFwIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcHJlZml4ID0gIk1hcCI7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRydWUpICsgIiwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOwotICAgIGlmIChpbl9pbml0KSB7Ci0gICAgICBpZiAoc29ydGVkX2NvbnRhaW5lcnNfKSB7Ci0gICAgICAgIHByZWZpeCA9ICJUcmVlU2V0IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByZWZpeCA9ICJIYXNoU2V0IjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcHJlZml4ID0gIlNldCI7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKLSAgICBpZiAoaW5faW5pdCkgewotICAgICAgcHJlZml4ID0gIkFycmF5TGlzdCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByZWZpeCA9ICJMaXN0IjsKLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+Iik7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmICgocHJvZ3JhbSAhPSBOVUxMKSAmJiAoKHByb2dyYW0gIT0gcHJvZ3JhbV8pIHx8IGZvcmNlX25hbWVzcGFjZSkpIHsKLSAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKLSAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHBhY2thZ2UgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgSmF2YSB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgSmF2YSBjb250YWluZXI/Ci0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSwgYm9vbCBpbl9jb250YWluZXIpIHsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiVm9pZCIgOiAidm9pZCIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIHJldHVybiAiQnl0ZUJ1ZmZlciI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiU3RyaW5nIjsKLSAgICB9Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJCb29sZWFuIiA6ICJib29sZWFuIik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJCeXRlIiA6ICJieXRlIik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIlNob3J0IiA6ICJzaG9ydCIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJJbnRlZ2VyIiA6ICJpbnQiKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiTG9uZyIgOiAibG9uZyIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJEb3VibGUiIDogImRvdWJsZSIpOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqIEBwYXJhbSBpbml0IFdoZXRoZXIgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQKLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgY29tbWVudCkgewotICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KLSAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIG9mc3RyZWFtIGR1bW15OwotICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICAgIDsKLSAgICB9Ci0gIH0KLSAgcmVzdWx0ICs9ICI7IjsKLSAgaWYgKGNvbW1lbnQpIHsKLSAgICByZXN1bHQgKz0gIiAvLyAiOwotICAgIGlmICh0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICByZXN1bHQgKz0gIm9wdGlvbmFsIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICJyZXF1aXJlZCI7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICBzdGQ6OnN0cmluZyBmbl9uYW1lID0gZ2V0X3JwY19tZXRob2RfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotICBzdGQ6OnN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgcHJlZml4ICsgZm5fbmFtZSArICIoIgotICAgICAgICAgICAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIHRocm93cyAiOwotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKLSAgfQotICByZXN1bHQgKz0gIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24iOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3ZvaWQgbmFtZShhcmdzLCByZXN1bHRIYW5kbGVyKScKLSAqCi0gKiBAcGFyYW1zIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9iYXNlX21ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdGQ6OnN0cmluZyBhcmdsaXN0ID0gYXN5bmNfZnVuY3Rpb25fY2FsbF9hcmdsaXN0KHRmdW5jdGlvbiwgdXNlX2Jhc2VfbWV0aG9kLCB0cnVlKTsKLQotICBzdGQ6OnN0cmluZyByZXRfdHlwZSA9ICIiOwotICBpZiAodXNlX2Jhc2VfbWV0aG9kKSB7Ci0gICAgcmV0X3R5cGUgKz0gIkFzeW5jQ2xpZW50LiI7Ci0gIH0KLSAgcmV0X3R5cGUgKz0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9jYWxsIjsKLQotICBzdGQ6OnN0cmluZyBmbl9uYW1lID0gZ2V0X3JwY19tZXRob2RfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotCi0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHByZWZpeCArICJ2b2lkICIgKyBmbl9uYW1lICsgIigiICsgYXJnbGlzdCArICIpIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfYmFzZV9tZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcykgewotICAodm9pZCl1c2VfYmFzZV9tZXRob2Q7Ci0gIHN0ZDo6c3RyaW5nIGFyZ2xpc3QgPSAiIjsKLSAgaWYgKHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLnNpemUoKSA+IDApIHsKLSAgICBhcmdsaXN0ID0gYXJndW1lbnRfbGlzdCh0ZnVuYy0+Z2V0X2FyZ2xpc3QoKSwgaW5jbHVkZV90eXBlcykgKyAiLCAiOwotICB9Ci0KLSAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICBhcmdsaXN0ICs9ICJvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrICI7Ci0gIH0KLSAgYXJnbGlzdCArPSAicmVzdWx0SGFuZGxlciI7Ci0KLSAgcmV0dXJuIGFyZ2xpc3Q7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcykgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICBpZiAoaW5jbHVkZV90eXBlcykgewotICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc3luY19hcmd1bWVudF9saXN0KHRfZnVuY3Rpb24qIHRmdW5jdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcykgewotICAodm9pZCl0ZnVuY3Q7Ci0gICh2b2lkKXR0eXBlOwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBpZiAoIWZpcnN0KSB7Ci0gICAgcmVzdWx0ICs9ICIsICI7Ci0gIH0KLSAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICByZXN1bHQgKz0gIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgIjsKLSAgfQotICByZXN1bHQgKz0gInJlc3VsdEhhbmRsZXIiOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgSmF2YSBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBUYWtlcyBhIG5hbWUgYW5kIHByb2R1ZXMgYSB2YWxpZCBKYXZhIHNvdXJjZSBmaWxlIG5hbWUgZnJvbSBpdAotICoKLSAqIEBwYXJhbSBmcm9tTmFtZSBUaGUgbmFtZSB3aGljaCBzaGFsbCBiZWNvbWUgYSB2YWxpZCBKYXZhIHNvdXJjZSBmaWxlIG5hbWUKLSAqIEByZXR1cm4gVGhlIHByb2R1Y2VkIGlkZW50aWZpZXIKLSAqLwotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkgewotICAvLyBpZiBhbnkgZnVydGhlciBydWxlcyBhcHBseSB0byBzb3VyY2UgZmlsZSBuYW1lcyBpbiBKYXZhLCBtb2RpZnkgYXMgbmVjZXNzYXJ5Ci0gIHJldHVybiBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihmcm9tTmFtZSk7Ci19Ci0KLS8qKgotICogVGFrZXMgYSBuYW1lIGFuZCBwcm9kdWVzIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyIGZyb20gaXQKLSAqCi0gKiBAcGFyYW0gZnJvbU5hbWUgVGhlIG5hbWUgd2hpY2ggc2hhbGwgYmVjb21lIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0gKiBAcmV0dXJuIFRoZSBwcm9kdWNlZCBpZGVudGlmaWVyCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfamF2YV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkgewotICBzdGQ6OnN0cmluZyBzdHIgPSBmcm9tTmFtZTsKLSAgaWYgKHN0ci5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIHN0cjsKLSAgfQotCi0gIC8vIHRlc3RzIHJlbHkgb24gdGhpcwotICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOwotCi0gIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKLSAgY2hhciBjID0gc3RyLmF0KDApOwotICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKSB7Ci0gICAgc3RyID0gIl8iICsgc3RyOwotICB9Ci0KLSAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7Ci0gICAgYyA9IHN0ci5hdChpKTsKLSAgICBpZiAoKCgnQScgPiBjKSB8fCAoYyA+ICdaJykpICYmICgoJ2EnID4gYykgfHwgKGMgPiAneicpKSAmJiAoKCcwJyA+IGMpIHx8IChjID4gJzknKSkKLSAgICAgICAgJiYgKCdfJyAhPSBjKSkgewotICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gc3RyOwotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc19jYW1lbF9jYXNlKHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgdWNmaXJzdCkgewotICBzdGQ6OnN0cmluZyBuZXdfbmFtZTsKLSAgc2l6ZV90IGkgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7IGkrKykgewotICAgIGlmIChuYW1lW2ldICE9ICdfJykKLSAgICAgIGJyZWFrOwotICB9Ci0gIGlmICh1Y2ZpcnN0KSB7Ci0gICAgbmV3X25hbWUgKz0gdG91cHBlcihuYW1lW2krK10pOwotICB9IGVsc2UgewotICAgIG5ld19uYW1lICs9IHRvbG93ZXIobmFtZVtpKytdKTsKLSAgfQotICBmb3IgKDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAobmFtZVtpXSA9PSAnXycpIHsKLSAgICAgIGlmIChpIDwgbmFtZS5zaXplKCkgLSAxKSB7Ci0gICAgICAgIGkrKzsKLSAgICAgICAgbmV3X25hbWUgKz0gdG91cHBlcihuYW1lW2ldKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgbmV3X25hbWUgKz0gbmFtZVtpXTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5ld19uYW1lOwotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfcnBjX21ldGhvZF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKLSAgICByZXR1cm4gYXNfY2FtZWxfY2FzZShuYW1lLCBmYWxzZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLX0KLQotLyoqCi0gKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXwotICogYW5kL29yIGZ1bGxjYW1lbF9zdHlsZV8KLSAqLwotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgaWYgKG5vY2FtZWxfc3R5bGVfKSB7Ci0gICAgcmV0dXJuICJfIiArIG5hbWU7Ci0gIH0gZWxzZSBpZiAoZnVsbGNhbWVsX3N0eWxlXykgewotICAgIHJldHVybiBhc19jYW1lbF9jYXNlKG5hbWUpOwotICB9IGVsc2UgewotICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOwotICAgIHJldHVybiBuYW1lOwotICB9Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBjb25zdGFudF9uYW1lOwotCi0gIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7Ci0gIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgewotICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOwotCi0gICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7Ci0gICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKLSAgICB9Ci0gICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpc19maXJzdCA9IGZhbHNlOwotICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7Ci0gIH0KLQotICByZXR1cm4gY29uc3RhbnRfbmFtZTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7Ci0KLSAgdF9jb250YWluZXIqIGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHlwZTsKLSAgc3RkOjpzdHJpbmcgc291cmNlX25hbWU7Ci0gIGlmIChzb3VyY2VfbmFtZV9wMiA9PSAiIikKLSAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOwotICBlbHNlCi0gICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOwotCi0gIGJvb2wgY29weV9jb25zdHJ1Y3RfY29udGFpbmVyOwotICBpZiAoY29udGFpbmVyLT5pc19tYXAoKSkgewotICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKiljb250YWluZXI7Ci0gICAgY29weV9jb25zdHJ1Y3RfY29udGFpbmVyID0gdG1hcC0+Z2V0X2tleV90eXBlKCktPmlzX2Jhc2VfdHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdG1hcC0+Z2V0X3ZhbF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpOwotICB9IGVsc2UgewotICAgIHRfdHlwZSogZWxlbV90eXBlID0gY29udGFpbmVyLT5pc19saXN0KCkgPyAoKHRfbGlzdCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb3B5X2NvbnN0cnVjdF9jb250YWluZXIgPSBlbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpOwotICB9Ci0KLSAgaWYgKGNvcHlfY29uc3RydWN0X2NvbnRhaW5lcikgewotICAgIC8vIGRlZXAgY29weSBvZiBiYXNlIHR5cGVzIGNhbiBiZSBkb25lIG11Y2ggbW9yZSBlZmZpY2llbnRseSB0aGFuIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUKLSAgICAvLyBlbGVtZW50cyBtYW51YWxseQotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNhcGFjaXR5OwotICBpZiAoIShzb3J0ZWRfY29udGFpbmVyc18gJiYgKGNvbnRhaW5lci0+aXNfbWFwKCkgfHwgY29udGFpbmVyLT5pc19zZXQoKSkpKSB7Ci0gICAgLy8gdW5zb3J0ZWQgY29udGFpbmVycyBhY2NlcHQgYSBjYXBhY2l0eSB2YWx1ZQotICAgIGNhcGFjaXR5ID0gc291cmNlX25hbWUgKyAiLnNpemUoKSI7Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiCi0gICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgY2FwYWNpdHkgPDwgIik7IiA8PCBlbmRsOwotCi0gIHN0ZDo6c3RyaW5nIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIl9lbGVtZW50IjsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0X2VsZW1lbnRfbmFtZSA9IHJlc3VsdF9uYW1lICsgIl9jb3B5IjsKLQotICBpZiAoY29udGFpbmVyLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChNYXAuRW50cnk8IiA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIj4gIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIiA6ICIKLSAgICAgICAgICAgICAgICA8PCBzb3VyY2VfbmFtZSA8PCAiLmVudHJ5U2V0KCkpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUKLSAgICAgICAgICAgICAgICA8PCAiX2tleSA9ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIuZ2V0S2V5KCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUKLSAgICAgICAgICAgICAgICA8PCAiX3ZhbHVlID0gIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIi5nZXRWYWx1ZSgpOyIgPDwgZW5kbDsKLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaWYgKGtleV90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX2tleSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlKTsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXkgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGlmICh2YWxfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsX3R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlID0gIjsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsX3R5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfa2V5LCAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUKLSAgICAgICAgICAgICAgICA8PCAiX3ZhbHVlKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgdF90eXBlKiBlbGVtX3R5cGU7Ci0KLSAgICBpZiAoY29udGFpbmVyLT5pc19zZXQoKSkgewotICAgICAgZWxlbV90eXBlID0gKCh0X3NldCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbGVtX3R5cGUgPSAoKHRfbGlzdCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUKLSAgICAgICAgICAgICAgICA8PCAiIDogIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpZiAoZWxlbV90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgLy8gcmVjdXJzaXZlIGRlZXAgY29weQotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgIiIsIHJlc3VsdF9lbGVtZW50X25hbWUsIGVsZW1fdHlwZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBpdGVyYXRpdmUgY29weQotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKWVsZW1fdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJCeXRlQnVmZmVyIHRlbXBfYmluYXJ5X2VsZW1lbnQgPSAiOwotICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBfYmluYXJ5X2VsZW1lbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtX3R5cGUpOwotICAgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCI7Ci0gICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpIHsKLSAgKHZvaWQpZGVzdF9uYW1lOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIjsKLSAgICB9IGVsc2UgewotICAgICAgLy8gZXZlcnl0aGluZyBlbHNlIGNhbiBiZSBjb3BpZWQgZGlyZWN0bHkKLSAgICAgIG91dCA8PCBzb3VyY2VfbmFtZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIjsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOwotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjppc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gIl9fIiArIHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkgKyAiX2lzc2V0X2lkIik7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKLSAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQotICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgIgotICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZXNjcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkICIKLSAgICAgICAgICAgICAgICA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgIDw8ICIoc2hvcnQpIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zY2hlbWVfbWFwKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3ICIKLSAgICAgICAgICAgICAgICAgIkhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzY2hlbWVzLnB1dChTdGFuZGFyZFNjaGVtZS5jbGFzcywgbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICA8PCAiU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc2NoZW1lcy5wdXQoVHVwbGVTY2hlbWUuY2xhc3MsIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgPDwgIlR1cGxlU2NoZW1lRmFjdG9yeSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICIvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgIgotICAgICAgICAgICAgICAgICAiZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICghZmlyc3QpIHsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICptX2l0ZXIpOwotICAgIGluZGVudChvdXQpIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKChzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpCi0gICAgICAgICAgICAgICAgPDwgIiwgXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIpIjsKLSAgfQotCi0gIG91dCA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpCi0gICAgICA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOyIKLSAgICAgIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuIgotICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkKGludCBmaWVsZElkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaChmaWVsZElkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiOiAvLyAiCi0gICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogaWYgaXQgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZE9yVGhyb3coaW50IGZpZWxkSWQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIF9GaWVsZHMgZmllbGRzID0gZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZmllbGRzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJGaWVsZCBcIiArIGZpZWxkSWQgKyAiCi0gICAgICAgICAgICAgICAgICJcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBmaWVsZHM7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuIgotICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoU3RyaW5nIG5hbWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgX3RocmlmdElkID0gdGhyaWZ0SWQ7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBfZmllbGROYW1lID0gZmllbGROYW1lOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX3RocmlmdElkOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX2ZpZWxkTmFtZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXRfamF2YV9nZW5lcmF0b3I6Omlzc2V0X3R5cGUgdF9qYXZhX2dlbmVyYXRvcjo6bmVlZHNfaXNzZXQodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRQcmltaXRpdmVUeXBlKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW50IGNvdW50ID0gMDsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbChnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpKSB7Ci0gICAgICBjb3VudCsrOwotICAgIH0KLSAgfQotICBpZiAoY291bnQgPT0gMCkgewotICAgIHJldHVybiBJU1NFVF9OT05FOwotICB9IGVsc2UgaWYgKGNvdW50IDw9IDY0KSB7Ci0gICAgaWYgKG91dFByaW1pdGl2ZVR5cGUgIT0gTlVMTCkgewotICAgICAgaWYgKGNvdW50IDw9IDgpCi0gICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gImJ5dGUiOwotICAgICAgZWxzZSBpZiAoY291bnQgPD0gMTYpCi0gICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gInNob3J0IjsKLSAgICAgIGVsc2UgaWYgKGNvdW50IDw9IDMyKQotICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJpbnQiOwotICAgICAgZWxzZSBpZiAoY291bnQgPD0gNjQpCi0gICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gImxvbmciOwotICAgIH0KLSAgICByZXR1cm4gSVNTRVRfUFJJTUlUSVZFOwotICB9IGVsc2UgewotICAgIHJldHVybiBJU1NFVF9CSVRTRVQ7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlmICghamF2YTVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgY2xlYXIoKSB7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgICBpZiAoZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArIGZpZWxkLT5nZXRfbmFtZSgpLCB0LCBmaWVsZC0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKLQotICAgICAgaWYgKHJldXNlX29iamVjdHNfICYmICh0LT5pc19jb250YWluZXIoKSB8fCB0LT5pc19zdHJ1Y3QoKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmNsZWFyKCk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgICAgfSBlbHNlIHsKLQotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIG11c3QgYmUgYSBiYXNlIHR5cGUKLSAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKLSAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGZhbHNlKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0OwotCi0gICAgc3dpdGNoIChiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAidW5zdXBwb3J0ZWQgdHlwZTogIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICIgZm9yIGZpZWxkICIgKyBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gc2VyaWFsaXplIChpbiB0aGUgSmF2YSBzZW5zZSkgdGhlIG9iamVjdAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7IgotICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdHJ5IHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3ICIKLSAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSIgPDwgKGFuZHJvaWRfbGVnYWN5XyA/ICIuZ2V0TWVzc2FnZSgpIiA6ICIiKQotICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBzZXJpYWxpemUgKGluIHRoZSBKYXZhIHNlbnNlKSB0aGUgb2JqZWN0Ci12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgIgotICAgICAgICAgICAgICAgICAiamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0cnkgeyIgPDwgZW5kbDsKLSAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7Ci0gICAgc3dpdGNoIChuZWVkc19pc3NldCh0c3RydWN0KSkgewotICAgIGNhc2UgSVNTRVRfTk9ORToKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgotICAgICAgaW5kZW50KG91dCkgPDwgIiAgICAvLyBpdCBkb2Vzbid0IHNlZW0gbGlrZSB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8gdGhpcywgYnV0IGphdmEgIgotICAgICAgICAgICAgICAgICAgICAgInNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgICBfX2lzc2V0X2JpdGZpZWxkID0gMDsiIDw8IGVuZGw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElTU0VUX0JJVFNFVDoKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICAgLy8gaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91IHNob3VsZCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBqYXZhICIKLSAgICAgICAgICAgICAgICAgICAgICJzZXJpYWxpemF0aW9uIGlzIHdhY2t5LCBhbmQgZG9lc24ndCBjYWxsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICAgX19pc3NldF9iaXRfdmVjdG9yID0gbmV3IEJpdFNldCgxKTsiIDw8IGVuZGw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgIiAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyAiCi0gICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSIgPDwgKGFuZHJvaWRfbGVnYWN5XyA/ICIuZ2V0TWVzc2FnZSgpIiA6ICIiKQotICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsICIKLSAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgotICBvdXQgPDwgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8ICJzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwgImlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiAvLyAiCi0gICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIChzY2hlbWVGaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic3RydWN0LiIsIHRydWUpOwotICAgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3QuIgotICAgICAgICAgICAgICAgIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQotICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgLy8gaW4gbm9uLWJlYW5zIHN0eWxlLCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCi0gIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQotICBpZiAoIWJlYW5fc3R5bGVfKSB7Ci0gICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFzdHJ1Y3QuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciCi0gICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgIDw8ICInIHdhcyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaW5kZW50KG91dCkgPDwgInN0cnVjdC52YWxpZGF0ZSgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgewotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QsICIKLSAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICBpbmRlbnQob3V0KSA8PCAic3RydWN0LnZhbGlkYXRlKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHN0cnVjdC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgYm9vbCBvcHRpb25hbCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB8fCAoaXNfcmVzdWx0ICYmICFudWxsX2FsbG93ZWQpOwotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiCi0gICAgICAgICAgICAgICAgICA8PCAic3RydWN0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKCpmX2l0ZXIpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic3RydWN0LiIsIHRydWUpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIKLSAgICAgIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfc3RhbmRhcmRfc2NoZW1lKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgPDwgIlN0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJTdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJTdGFuZGFyZFNjaGVtZSgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgIDw8ICJTdGFuZGFyZFNjaGVtZSBleHRlbmRzIFN0YW5kYXJkU2NoZW1lPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9zdGFuZGFyZF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3N0YW5kYXJkX3dyaXRlcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCAiCi0gICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7IiA8PCBlbmRsOwotICBpbnQgb3B0aW9uYWxfY291bnQgPSAwOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKLSAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgewotICAgICAgb3B0aW9uYWxfY291bnQrKzsKLSAgICB9Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAic3RydWN0LiIsIGZhbHNlKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3Quc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKLSAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBpZiAob3B0aW9uYWxfY291bnQgPiAwKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIkJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoIiA8PCBvcHRpb25hbF9jb3VudCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW50IGkgPSAwOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAotICAgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChpbmNvbWluZy5nZXQoIiA8PCBpIDw8ICIpKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAic3RydWN0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCAiCi0gICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBoYXNfb3B0aW9uYWwgPSBmYWxzZTsKLSAgaW50IG9wdGlvbmFsX2NvdW50ID0gMDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAotICAgICAgICB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7Ci0gICAgICBvcHRpb25hbF9jb3VudCsrOwotICAgICAgaGFzX29wdGlvbmFsID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7Ci0gICAgfQotICB9Ci0gIGlmIChoYXNfb3B0aW9uYWwpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiQml0U2V0IG9wdGlvbmFscyA9IG5ldyBCaXRTZXQoKTsiIDw8IGVuZGw7Ci0gICAgaW50IGkgPSAwOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAotICAgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChzdHJ1Y3QuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAib3B0aW9uYWxzLnNldCgiIDw8IGkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsICIgPDwgb3B0aW9uYWxfY291bnQgPDwgIik7IiA8PCBlbmRsOwotICAgIGludCBqID0gMDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKLSAgICAgICAgICB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoc3RydWN0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBqKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3NjaGVtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgIDw8ICJUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWUoKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgc3RhdGljIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgPDwgIlR1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI+IHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKG9mc3RyZWFtJiBvdXQpIHsKLSAgdGltZV90IHNlY29uZHMgPSB0aW1lKE5VTEwpOwotICBzdHJ1Y3QgdG0qIG5vdyA9IGxvY2FsdGltZSgmc2Vjb25kcyk7Ci0gIGluZGVudChvdXQpIDw8ICJAR2VuZXJhdGVkKHZhbHVlID0gXCIiIDw8IGF1dG9nZW5fc3VtbWFyeSgpIDw8ICJcIiI7Ci0gIGlmICh1bmRhdGVkX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18pIHsKLSAgICBvdXQgPDwgIikiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiwgZGF0ZSA9IFwiIiA8PCAobm93LT50bV95ZWFyICsgMTkwMCkgPDwgIi0iIDw8IHNldGZpbGwoJzAnKSA8PCBzZXR3KDIpCi0gICAgICAgICAgICAgICAgPDwgKG5vdy0+dG1fbW9uICsgMSkgPDwgIi0iIDw8IHNldGZpbGwoJzAnKSA8PCBzZXR3KDIpIDw8IG5vdy0+dG1fbWRheQotICAgICAgICAgICAgICAgIDw8ICJcIikiIDw8IGVuZGw7Ci0gIH0KLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKLSAgICBqYXZhLAotICAgICJKYXZhIiwKLSAgICAiICAgIGJlYW5zOiAgICAgICAgICAgTWVtYmVycyB3aWxsIGJlIHByaXZhdGUsIGFuZCBzZXR0ZXIgbWV0aG9kcyB3aWxsIHJldHVybiB2b2lkLlxuIgotICAgICIgICAgcHJpdmF0ZS1tZW1iZXJzOiBNZW1iZXJzIHdpbGwgYmUgcHJpdmF0ZSwgYnV0IHNldHRlciBtZXRob2RzIHdpbGwgcmV0dXJuICd0aGlzJyBsaWtlICIKLSAgICAidXN1YWwuXG4iCi0gICAgIiAgICBub2NhbWVsOiAgICAgICAgIERvIG5vdCB1c2UgQ2FtZWxDYXNlIGZpZWxkIGFjY2Vzc29ycyB3aXRoIGJlYW5zLlxuIgotICAgICIgICAgZnVsbGNhbWVsOiAgICAgICBDb252ZXJ0IHVuZGVyc2NvcmVkX2FjY2Vzc29yX29yX3NlcnZpY2VfbmFtZXMgdG8gY2FtZWxDYXNlLlxuIgotICAgICIgICAgYW5kcm9pZDogICAgICAgICBHZW5lcmF0ZWQgc3RydWN0dXJlcyBhcmUgUGFyY2VsYWJsZS5cbiIKLSAgICAiICAgIGFuZHJvaWRfbGVnYWN5OiAgRG8gbm90IHVzZSBqYXZhLmlvLklPRXhjZXB0aW9uKHRocm93YWJsZSkgKGF2YWlsYWJsZSBmb3IgQW5kcm9pZCAyLjMgYW5kICIKLSAgICAiYWJvdmUpLlxuIgotICAgICIgICAgb3B0aW9uX3R5cGU6ICAgICBXcmFwIG9wdGlvbmFsIGZpZWxkcyBpbiBhbiBPcHRpb24gdHlwZS5cbiIKLSAgICAiICAgIGphdmE1OiAgICAgICAgICAgR2VuZXJhdGUgSmF2YSAxLjUgY29tcGxpYW50IGNvZGUgKGluY2x1ZGVzIGFuZHJvaWRfbGVnYWN5IGZsYWcpLlxuIgotICAgICIgICAgcmV1c2Utb2JqZWN0czogICBEYXRhIG9iamVjdHMgd2lsbCBub3QgYmUgYWxsb2NhdGVkLCBidXQgZXhpc3RpbmcgaW5zdGFuY2VzIHdpbGwgYmUgdXNlZCAiCi0gICAgIihyZWFkIGFuZCB3cml0ZSkuXG4iCi0gICAgIiAgICBzb3J0ZWRfY29udGFpbmVyczpcbiIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgVXNlIFRyZWVTZXQvVHJlZU1hcCBpbnN0ZWFkIG9mIEhhc2hTZXQvSGFzaE1hcCBhcyBhIGltcGxlbWVudGF0aW9uIG9mICIKLSAgICAic2V0L21hcC5cbiIKLSAgICAiICAgIGdlbmVyYXRlZF9hbm5vdGF0aW9ucz1bdW5kYXRlZHxzdXBwcmVzc106XG4iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgIHVuZGF0ZWQ6IHN1cHByZXNzIHRoZSBkYXRlIGF0IEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnNcbiIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3M6IHN1cHByZXNzIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnMgZW50aXJlbHlcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGExM2ZjLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzI4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxjY3R5cGU+Ci0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKioKLSAqIEphdmEgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2phdmFtZV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9qYXZhbWVfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKXBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1qYXZhbWUiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKLSAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9wcmltaXRpdmVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jaGVja190eXBlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV93cml0ZV92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX25hbWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKLQotICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSk7Ci0KLSAgYm9vbCBoYXNfYml0X3ZlY3Rvcih0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGphdmFfcGFja2FnZSgpOwotICBzdGQ6OnN0cmluZyBqYXZhX3R5cGVfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dlbmVyaWMgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIGJveF90eXBlKHRfdHlwZSogdHlwZSwgc3RyaW5nIHZhbHVlKTsKLQotICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RyaW5nKCkKLSAgICAgICAgICAgfHwgdHR5cGUtPmlzX2VudW0oKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0KLXByaXZhdGU6Ci0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci19OwotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKLQotICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKLSAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7Ci0gIH0KLSAgaWYgKGRpci5zaXplKCkgPiAwKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgfQotCi0gIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKLX0KLQotLyoqCi0gKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKLSAqCi0gKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpqYXZhX3BhY2thZ2UoKSB7Ci0gIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiO1xuXG4iOwotICB9Ci0gIHJldHVybiAiIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgamF2YSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIEphdmEgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBoZXJlCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmphdmFfdHlwZV9pbXBvcnRzKCkgewotICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7XG4iICsgImltcG9ydCBqYXZhLnV0aWwuVmVjdG9yO1xuIgotICAgICAgICAgKyAiaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjtcblxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgamF2YSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6amF2YV90aHJpZnRfaW1wb3J0cygpIHsKLSAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iCi0gICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuXG4iOwotfQotCi0vKioKLSAqIE5vdGhpbmcgaW4gSmF2YQotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSmF2YSwgc2luY2UgaXQgZG9lcwotICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCi0gKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKXR0eXBlZGVmOwotfQotCi0vKioKLSAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodGVudW0tPmdldF9uYW1lKCkpICsgIi5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKLQotICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0Ci0gIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKTsKLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sIHRlbnVtKTsKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URW51bSAiOwotICBzY29wZV91cChmX2VudW0pOwotICBmX2VudW0gPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sICpjX2l0ZXIpOwotICAgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGZpbmFsICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgPSBuZXcgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdmFsdWUgPDwgIik7IiA8PCBlbmRsOwotICB9Ci0gIGZfZW51bSA8PCBlbmRsOwotCi0gIC8vIEZpZWxkIGZvciB0aHJpZnRDb2RlCi0gIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIoaW50IHZhbHVlKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICB0aGlzLnZhbHVlID0gdmFsdWU7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKiBHZXQgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhpcyBlbnVtIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gdmFsdWU7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKiBGaW5kIGEgdGhlIGVudW0gdHlwZSBieSBpdHMgaW50ZWdlciB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iCi0gICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlIGlzIG5vdCBmb3VuZC4iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljICIgKyB0ZW51bS0+Z2V0X25hbWUoKSArICIgZmluZEJ5VmFsdWUoaW50IHZhbHVlKSB7ICIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAic3dpdGNoICh2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX2VudW0pIDw8ICJjYXNlICIgPDwgdmFsdWUgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsKLQotICBmX2VudW0uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIkNvbnN0YW50cy5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKTsKLQotICBmX2NvbnN0cyA8PCAicHVibGljIGNsYXNzICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaW5kZW50KG91dCk7Ci0gIGlmICghZGVmdmFsKSB7Ci0gICAgb3V0IDw8IChpbl9zdGF0aWMgPyAiIiA6ICJwdWJsaWMgc3RhdGljIGZpbmFsICIpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7Ci0gIH0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOwotICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKLSAgICAgIG91dCA8PCAic2V0IiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXQoIiA8PCBib3hfdHlwZShrdHlwZSwga2V5KSA8PCAiLCAiIDw8IGJveF90eXBlKHZ0eXBlLCB2YWwpIDw8ICIpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuYWRkRWxlbWVudCgiIDw8IGJveF90eXBlKGV0eXBlLCB2YWwpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXQoIiA8PCBib3hfdHlwZShldHlwZSwgdmFsKSA8PCAiLCAiIDw8IGJveF90eXBlKGV0eXBlLCB2YWwpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAodm9pZCluYW1lOwotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCBmYWxzZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcigpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmJveF90eXBlKHRfdHlwZSogdHlwZSwgc3RyaW5nIHZhbHVlKSB7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIm5ldyBCb29sZWFuKCIgKyB2YWx1ZSArICIpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIm5ldyBCeXRlKCIgKyB2YWx1ZSArICIpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAibmV3IFNob3J0KCIgKyB2YWx1ZSArICIpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAibmV3IEludGVnZXIoIiArIHZhbHVlICsgIikiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJuZXcgTG9uZygiICsgdmFsdWUgKyAiKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIm5ldyBEb3VibGUoIiArIHZhbHVlICsgIikiOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgd2lsbCBiZSBhIFRCYXNlCi0gKiBpbXBsZW1lbnRvci4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIGdlbmVyYXRlX2phdmFfdW5pb24odHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKgotICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBKYXZhIHVuaW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV90aHJpZnRfaW1wb3J0cygpOwotCi0gIGdlbmVyYXRlX2phdmFfZG9jKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KGZfc3RydWN0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgZXh0ZW5kcyBUVW5pb24gIjsKLQotICBzY29wZV91cChmX3N0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2Rlc2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3N0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIihfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKHNldEZpZWxkLCB2YWx1ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IgotICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihvdGhlcik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gZ2VuZXJhdGUgImNvbnN0cnVjdG9ycyIgZm9yIGVhY2ggZmllbGQKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHggPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB4LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIih2YWx1ZSk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB4OyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLQotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotCi0gICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBnZXQiCi0gICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuICgiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIilnZXRGaWVsZFZhbHVlKCk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBnZXQgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIHVuaW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gXCIgKyBnZXRGaWVsZERlc2MoZ2V0U2V0RmllbGQoKSkubmFtZSk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAodmFsdWUgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiICBzZXRGaWVsZF8gPSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgdmFsdWVfID0gdmFsdWU7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2NoZWNrX3R5cGUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3JlYWRfdmFsdWUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3dyaXRlX3ZhbHVlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2hlY2tfdHlwZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KQotICAgICAgPDwgInByb3RlY3RlZCB2b2lkIGNoZWNrVHlwZShfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24geyIKLSAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCB0cnVlKQotICAgICAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICBicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKFwiV2FzIGV4cGVjdGluZyB2YWx1ZSBvZiB0eXBlICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiIGZvciBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgIDw8ICInLCBidXQgZ290IFwiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOyIgPDwgZW5kbDsKLSAgICAvLyBkbyB0aGUgcmVhbCBjaGVjayBoZXJlCi0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlYWRfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBPYmplY3QgcmVhZFZhbHVlKFRQcm90b2NvbCBpcHJvdCwgVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IgotICAgICAgICAgICAgICA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZC5pZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQy50eXBlKSB7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSAiCi0gICAgICAgICAgICAgICAgICJvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCB3cml0ZVZhbHVlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZF8pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9ICgiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZV87IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgXCIgKyAiCi0gICAgICAgICAgICAgICAgICJzZXRGaWVsZF8pOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBURmllbGQgZ2V0RmllbGREZXNjKF9GaWVsZHMgc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQzsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICAodm9pZCl0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIFRTdHJ1Y3QgZ2V0U3RydWN0RGVzYygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBTVFJVQ1RfREVTQzsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgLy8gZXF1YWxpdHkKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGlmIChvdGhlciBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBlcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKW90aGVyKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBvdGhlciAhPSBudWxsICYmIGdldFNldEZpZWxkKCkgPT0gb3RoZXIuZ2V0U2V0RmllbGQoKSAmJiAiCi0gICAgICAgICAgICAgICAgICJnZXRGaWVsZFZhbHVlKCkuZXF1YWxzKG90aGVyLmdldEZpZWxkVmFsdWUoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGludCBsYXN0Q29tcGFyaXNvbiA9IFRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRTZXRGaWVsZCgpLCBvdGhlci5nZXRTZXRGaWVsZCgpKTsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGlmIChsYXN0Q29tcGFyaXNvbiA9PSAwKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBUQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0RmllbGRWYWx1ZSgpLCBvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25faGFzaGNvZGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkKLSAgICAgIDw8ICIgKiBJZiB5b3UnZCBsaWtlIHRoaXMgdG8gcGVyZm9ybSBtb3JlIHJlc3BlY3RhYmx5LCB1c2UgdGhlIGhhc2hjb2RlIGdlbmVyYXRvciBvcHRpb24uIgotICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gMDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKLSAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAotICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KLSAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcwotICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgKGluX2NsYXNzID8gInN0YXRpYyAiIDogIiIpIDw8ICJjbGFzcyAiCi0gICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgImV4dGVuZHMgRXhjZXB0aW9uICI7Ci0gIH0KLSAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWphdmEsIHByaXZhdGUgZm9yIC1qYXZhYmVhbgotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICI7Ci0gICAgb3V0IDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UpIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBpc3NldCBkYXRhCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCBpZCBhc3NpZ25tZW50cyIgPDwgZW5kbDsKLQotICAgIGludCBpID0gMDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICIgPDwgaXNzZXRfZmllbGRfaWQoKm1faXRlcikgPDwgIiA9ICIgPDwgaSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpID4gMCkgewotICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgYm9vbGVhbltdIF9faXNzZXRfdmVjdG9yID0gbmV3IGJvb2xlYW5bIiA8PCBpIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIGJvb2wgYWxsX29wdGlvbmFsX21lbWJlcnMgPSB0cnVlOwotCi0gIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0LAotICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKCFtZW1iZXJzLmVtcHR5KCkgJiYgIWFsbF9vcHRpb25hbF9tZW1iZXJzKSB7Ci0gICAgLy8gRnVsbCBjb25zdHJ1Y3RvciBmb3IgYWxsIGZpZWxkcwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMoKTsiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IgotICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAoKm1faXRlcikpOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBjb3B5IGNvbnN0cnVjdG9yCi0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IgotICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoaGFzX2JpdF92ZWN0b3IodHN0cnVjdCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiU3lzdGVtLmFycmF5Y29weShvdGhlci5fX2lzc2V0X3ZlY3RvciwgMCwgX19pc3NldF92ZWN0b3IsIDAsICIKLSAgICAgICAgICAgICAgICAgICAib3RoZXIuX19pc3NldF92ZWN0b3IubGVuZ3RoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHR5cGUpOwotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCAib3RoZXIiLCBmaWVsZF9uYW1lLCAiX190aGlzX18iICsgZmllbGRfbmFtZSwgdHlwZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IF9fdGhpc19fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsICJvdGhlci4iICsgZmllbGRfbmFtZSwgZmllbGRfbmFtZSwgdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBjbG9uZSBtZXRob2QsIHNvIHRoYXQgeW91IGNhbiBkZWVwIGNvcHkgYW4gb2JqZWN0IHdoZW4geW91IGRvbid0IGtub3cgaXRzIGNsYXNzLgotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhhdCA9PSBudWxsKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgaW5zdGFuY2VvZiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgIHJldHVybiB0aGlzLmVxdWFscygoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpdGhhdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscygiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiB0aGF0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhhdCA9PSBudWxsKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKLSAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgotICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOwotICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgc3RyaW5nIHRoaXNfcHJlc2VudCA9ICJ0cnVlIjsKLSAgICBzdHJpbmcgdGhhdF9wcmVzZW50ID0gInRydWUiOwotICAgIHN0cmluZyB1bmVxdWFsOwotCi0gICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7Ci0gICAgICB0aGlzX3ByZXNlbnQgKz0gIiAmJiB0aGlzLiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKLSAgICAgIHRoYXRfcHJlc2VudCArPSAiICYmIHRoYXQuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoaXNfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoYXRfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCIKLSAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiB8fCB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISgiCi0gICAgICAgIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgJiYgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0KS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIHVuZXF1YWwgPSAiVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuIiArIG5hbWUgKyAiLCB0aGF0LiIgKyBuYW1lICsgIikgIT0gMCI7Ci0gICAgfSBlbHNlIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgdW5lcXVhbCA9ICIhdGhpcy4iICsgbmFtZSArICIuZXF1YWxzKHRoYXQuIiArIG5hbWUgKyAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVuZXF1YWwgPSAidGhpcy4iICsgbmFtZSArICIgIT0gdGhhdC4iICsgbmFtZTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHVuZXF1YWwgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvdGhlck9iamVjdCkgeyIgPDwgZW5kbDsKLSAgLy8gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlck9iamVjdC5nZXRDbGFzcygpKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlck9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IgotICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyID0gKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpb3RoZXJPYmplY3Q7IjsKLQotICBpbmRlbnQob3V0KSA8PCAiaW50IGxhc3RDb21wYXJpc29uID0gMDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7Ci0gICAgaW5kZW50KG91dCkgPDwgImxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpCi0gICAgICAgICAgICAgICAgPDwgIiwgb3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfc3RydWN0KCkgfHwgZmllbGQtPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gdGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuY29tcGFyZVRvKG90aGVyLiIKLSAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiLCBvdGhlci4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLmlkKSB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIgotICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCi0gICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKLS8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgPDwgIicgaXMgdW5zZXQhIFN0cnVjdDpcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBib29sIG9wdGlvbmFsID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIKLSAgICAgIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKLSAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgotICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KLSAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX3N0cmluZygpKSB7Ci0gICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHlwZTsKLQotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiKCIKLSAgICAgICAgICAgICAgICA8PCAoYmFzZV90eXBlLT5pc19ib29sKCkgPyAiaXMiIDogImdldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCgiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpb3V0OwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07Ci0KLSAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXQgb2YgSmF2YSBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKLSAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAvLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyAwIDogIgotICAgICAgICAgICAgICAgICAgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuc2l6ZSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmICh0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkpIHsKLQotICAgICAgdF90eXBlKiBlbGVtZW50X3R5cGU7Ci0gICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgfQotCi0gICAgICAvLyBJdGVyYXRvciBnZXR0ZXIgZm9yIHNldHMgYW5kIGxpc3RzCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIEVudW1lcmF0aW9uIGdldCIgPDwgY2FwX25hbWU7Ci0gICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJFbnVtZXJhdGlvbigpIHsiKSA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyBudWxsIDogIgotICAgICAgICAgICAgICAgICAgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuZWxlbWVudHMoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgLy8gQWRkIHRvIHNldCBvciBsaXN0LCBjcmVhdGUgaWYgdGhlIHNldC9saXN0IGlzIG51bGwKLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBhZGQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKLSAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSkgPDwgIiBlbGVtKSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIucHV0KCIgPDwgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgICAgPDwgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmFkZEVsZW1lbnQoIiA8PCBib3hfdHlwZShlbGVtZW50X3R5cGUsICJlbGVtIikKLSAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAvLyBQdXQgdG8gbWFwCi0gICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgICAgaW5kZW50KG91dCk7Ci0gICAgICBvdXQgPDwgInB1YmxpYyB2b2lkIHB1dFRvIiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlKSA8PCAiIGtleSwgIgotICAgICAgICAgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSkgPDwgIiB2YWwpIHsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dChrZXksIHZhbCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gU2ltcGxlIGdldHRlcgotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpIHsKLSAgICAgIG91dCA8PCAiIGlzIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIgZ2V0IjsKLSAgICB9Ci0gICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gU2ltcGxlIHNldHRlcgotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKLSAgICBvdXQgPDwgInZvaWQiOwotICAgIG91dCA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFVuc2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfdmVjdG9yWyIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICJdID0gZmFsc2U7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBpc1NldCBtZXRob2QKLSAgICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKLSAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfdmVjdG9yWyIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICJdID0gdmFsdWU7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIKLSAgICAgIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiBmaXJzdCA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgc2IuYXBwZW5kKFwiLCBcIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIik7IiA8PCBlbmRsOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzYi5hcHBlbmQoXCJudWxsXCIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopKGZpZWxkLT5nZXRfdHlwZSgpKSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiVEJhc2VIZWxwZXIudG9TdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHNiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmIChjb3VsZF9iZV91bnNldCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBmaXJzdCA9IGZhbHNlOwotICB9Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuYXBwZW5kKFwiKVwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBzYi50b1N0cmluZygpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKLSAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAiVFR5cGUuU1RSVUNUIikKLSAqLwotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKLSAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGUuTElTVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkVOVU0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBnZXRfamF2YV90eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAiVFR5cGUuVk9JRCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlLkkxNiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsKLSAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigKLSAgICAgICAgIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQotICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICB9Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBTdHJ1Y3RNZXRhRGF0YShUVHlwZS5TVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBMaXN0TWV0YURhdGEoVFR5cGUuTElTVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgU2V0TWV0YURhdGEoVFR5cGUuU0VULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7Ci0gICAgfSBlbHNlIHsgLy8gbWFwCi0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgRW51bU1ldGFEYXRhKFRUeXBlLkVOVU0sICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2phdmFfdHlwZV9zdHJpbmcodHlwZSk7Ci0gICAgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiwgXCIiIDw8ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3N5bWJvbGljKCkgPDwgIlwiIjsKLSAgICB9Ci0gIH0KLSAgb3V0IDw8ICIpIjsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQotICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCi0gKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCi0gKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5qYXZhIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3ByaW1pdGl2ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UgZXh0ZW5kcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmYWNlIHsgfSIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGZfaW50ZXJmYWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIklmYWNlLmphdmEiOwotICBzdGQ6Om9mc3RyZWFtIGZfaWZhY2U7Ci0gIGZfaWZhY2Uub3BlbihmX2ludGVyZmFjZV9uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArICJJZmFjZSI7Ci0gIH0KLQotICBmX2lmYWNlIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV90aHJpZnRfaW1wb3J0cygpOwotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2lmYWNlLCB0c2VydmljZSk7Ci0gIGZfaWZhY2UgPDwgInB1YmxpYyBpbnRlcmZhY2UgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBlbmRsOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2lmYWNlLCAqZl9pdGVyKTsKLSAgICBmX2lmYWNlIDw8ICIgIHB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGZfaWZhY2UgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLklmYWNlIjsKLSAgfQotCi0gIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5DbGllbnQiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUU2VydmljZUNsaWVudCwgSWZhY2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcyhwcm90LCBwcm90KTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBpcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBvcHJvdF87IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgaW50IHNlcWlkXzsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFRQcm90b2NvbCBnZXRJbnB1dFByb3RvY29sKCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgVFByb3RvY29sIGdldE91dHB1dFByb3RvY29sKCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5vcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIKLSAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKLSAgICAgICAgICAgICAgIDw8ICIsICsrc2VxaWRfKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lCi0gICAgICAgICAgICAgICA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Muc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoIgotICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKG1zZy5zZXFpZCAhPSBzZXFpZF8pIHsiCi0gICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELCBcIiIKLSAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiBvdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2VcIik7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIgotICAgICAgICAgICAgICAgICA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiCi0gICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIEV4dGVuZHMgc3R1ZmYKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLlByb2Nlc3NvciI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIFByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFByb2Nlc3NvcihJZmFjZSBpZmFjZSkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF8ucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIgotICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgc3RhdGljIGludGVyZmFjZSBQcm9jZXNzRnVuY3Rpb24geyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICBwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOyIKLSAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJZmFjZSBpZmFjZV87IiA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZmluYWwgSGFzaHRhYmxlIHByb2Nlc3NNYXBfID0gbmV3IEhhc2h0YWJsZSgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZSwgd2FzIHRoZSBzZXFpZCBldGMuIGxlZ2l0PwotCi0gIGZfc2VydmljZV8KLSAgICAgIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm4gPSAoUHJvY2Vzc0Z1bmN0aW9uKXByb2Nlc3NNYXBfLmdldChtc2cubmFtZSk7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyAiCi0gICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAiCi0gICAgICAgICAiJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiZm4ucHJvY2Vzcyhtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKXRzZXJ2aWNlOwotICAvLyBPcGVuIGNsYXNzCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBjbGFzcyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgUHJvY2Vzc0Z1bmN0aW9uIHsiCi0gICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKQotICAgICAgPDwgInB1YmxpYyB2b2lkIHByb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24iCi0gICAgICA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyAiCi0gICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uUFJPVE9DT0xfRVJST1IsIGUuZ2V0TWVzc2FnZSgpKTsiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIgotICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IgotICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgImlmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKLSAgICAgICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKLSAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCi0gICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IgotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIgotICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIC8vIENsb3NlIGNsYXNzCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgY2xhc3MKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7Ci0KLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKCEoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgKyAiLmZpbmRCeVZhbHVlKGlwcm90LnJlYWRJMzIoKSk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZwotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgb2JqOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkKLSAgICAgICAgICAgICAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKLSAgICAgICAgICAgICAgPDwgIigiIDw8ICh0dHlwZS0+aXNfbGlzdCgpID8gIiIgOiAiMioiKSA8PCBvYmogPDwgIi5zaXplIgotICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiCi0gICAgICAgICAgICAgIDw8ICI7ICIKLSAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXQoIiA8PCBib3hfdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KSA8PCAiLCAiCi0gICAgICAgICAgICAgIDw8IGJveF90eXBlKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1dCgiIDw8IGJveF90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSkgPDwgIiwgIgotICAgICAgICAgICAgICA8PCBib3hfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGRFbGVtZW50KCIgPDwgYm94X3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSkgPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUkzMigiIDw8IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgotICogQHBhcmFtIHByZWZpeCBTdHJpbmcgcHJlZml4IGZvciBmaWVsZHMKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4Ci0gICAgICAgICAgICAgICAgPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKLSAgICBzdHJpbmcga2V5X3R5cGUgPSB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmtleXMoKTsgIiA8PCBlbnVtZXIKLSAgICAgICAgICAgICAgICA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCBrZXlfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIgPDwga2V5X3R5cGUgPDwgIikiIDw8IGVudW1lcgotICAgICAgICAgICAgICAgIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGVudW1lciA9IGl0ZXIgKyAiX2VudW0iOwotICAgIHN0cmluZyBlbGVfdHlwZSA9IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHRydWUpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmtleXMoKTsgIiA8PCBlbnVtZXIKLSAgICAgICAgICAgICAgICA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCBlbGVfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIgPDwgZWxlX3R5cGUgPDwgIikiIDw8IGVudW1lcgotICAgICAgICAgICAgICAgIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5lbGVtZW50cygpOyAiIDw8IGVudW1lcgotICAgICAgICAgICAgICAgIDw8ICIuaGFzTW9yZUVsZW1lbnRzKCk7ICkgIjsKLSAgICBzY29wZV91cChvdXQpOwotICAgIHN0cmluZyBlbGVfdHlwZSA9IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHRydWUpOwotICAgIGluZGVudChvdXQpIDw8IGVsZV90eXBlIDw8ICIgIiA8PCBpdGVyIDw8ICIgPSAoIiA8PCBlbGVfdHlwZSA8PCAiKSIgPDwgZW51bWVyCi0gICAgICAgICAgICAgICAgPDwgIi5uZXh0RWxlbWVudCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLSAgc3RyaW5nIHZhbF90eXBlID0gdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlLCBmYWxzZSk7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCAiKCgiICsgdmFsX3R5cGUgKyAiKSIgKyBtYXAgKyAiLmdldCgiICsgaXRlciArICIpKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEphdmEgdHlwZSBuYW1lCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KLSAqIEByZXR1cm4gSmF2YSB0eXBlIG5hbWUsIGkuZS4gVmVjdG9yCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYykgewotICAodm9pZClpbl9pbml0OwotICAodm9pZClza2lwX2dlbmVyaWM7Ci0gIC8vIEluIEphdmEgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCi0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0gIHN0cmluZyBwcmVmaXg7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiSGFzaHRhYmxlIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIkhhc2h0YWJsZSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVmVjdG9yIjsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7Ci0gICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIEMrKyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgSmF2YSBjb250YWluZXI/Ci0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgewotICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKLQotICBzd2l0Y2ggKHRiYXNlKSB7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICByZXR1cm4gInZvaWQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICBpZiAoIXR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiYnl0ZVtdIjsKLSAgICB9Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJCb29sZWFuIiA6ICJib29sZWFuIik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJCeXRlIiA6ICJieXRlIik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIlNob3J0IiA6ICJzaG9ydCIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJJbnRlZ2VyIiA6ICJpbnQiKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiTG9uZyIgOiAibG9uZyIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJEb3VibGUiIDogImRvdWJsZSIpOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgICAgOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0ICsgIjsiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICBzdGQ6OnN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiCi0gICAgICAgICAgICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikgdGhyb3dzICI7Ci0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiLCAiOwotICB9Ci0gIHJlc3VsdCArPSAiVEV4Y2VwdGlvbiI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX3R5cGVzKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIGlmIChpbmNsdWRlX3R5cGVzKSB7Ci0gICAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBjb25zdGFudF9uYW1lOwotCi0gIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7Ci0gIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgewotICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOwotCi0gICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7Ci0gICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKLSAgICB9Ci0gICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpc19maXJzdCA9IGZhbHNlOwotICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7Ci0gIH0KLQotICByZXR1cm4gY29uc3RhbnRfbmFtZTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob2ZzdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKSB7Ci0gIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIGNvbnRlbnRzLCAiICovXG4iKTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKLSAgfQotfQotCi0vKioKLSAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgIHN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHNzLnN0cigpLCAiICovXG4iKTsKLSAgfQotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7Ci0KLSAgdF9jb250YWluZXIqIGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHlwZTsKLSAgc3RkOjpzdHJpbmcgc291cmNlX25hbWU7Ci0gIGlmIChzb3VyY2VfbmFtZV9wMiA9PSAiIikKLSAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOwotICBlbHNlCi0gICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOwotCi0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIgotICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLQotICBzdGQ6OnN0cmluZyBpdGVyYXRvcl9lbGVtZW50X25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZWxlbWVudCI7Ci0gIHN0ZDo6c3RyaW5nIGVudW1lcmF0aW9uX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZW51bSI7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdF9lbGVtZW50X25hbWUgPSByZXN1bHRfbmFtZSArICJfY29weSI7Ci0KLSAgaWYgKGNvbnRhaW5lci0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF92YWxfdHlwZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIgPSAiIDw8IHNvdXJjZV9uYW1lIDw8ICIua2V5cygpOyAiCi0gICAgICAgICAgICAgICAgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl9rZXkgPSAoIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIubmV4dEVsZW1lbnQoKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAoIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmdldCgiCi0gICAgICAgICAgICAgICAgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfa2V5KTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGlmIChrZXlfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gIjsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX2tleSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpZiAodmFsX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lCi0gICAgICAgICAgICAgICAgPDwgIl92YWx1ZSk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHRfdHlwZSogZWxlbV90eXBlOwotCi0gICAgaWYgKGNvbnRhaW5lci0+aXNfc2V0KCkpIHsKLSAgICAgIGVsZW1fdHlwZSA9ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZWxlbV90eXBlID0gKCh0X2xpc3QqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIiA9ICIgPDwgc291cmNlX25hbWUKLSAgICAgICAgICAgICAgICA8PCAiLmVsZW1lbnRzKCk7ICIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIiA9ICgiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIubmV4dEVsZW1lbnQoKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpZiAoZWxlbV90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgLy8gcmVjdXJzaXZlIGRlZXAgY29weQotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgIiIsIHJlc3VsdF9lbGVtZW50X25hbWUsIGVsZW1fdHlwZSk7Ci0gICAgICBpZiAoZWxlbV90eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIiwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lCi0gICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8gaXRlcmF0aXZlIGNvcHkKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKillbGVtX3R5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiB0ZW1wX2JpbmFyeV9lbGVtZW50ID0gIjsKLSAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wX2JpbmFyeV9lbGVtZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpZiAoZWxlbV90eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZEVsZW1lbnQodGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KHRlbXBfYmluYXJ5X2VsZW1lbnQsIHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCI7Ci0gICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIC8vIGJpbmFyeSBmaWVsZHMgbmVlZCB0byBiZSBjb3BpZWQgd2l0aCBTeXN0ZW0uYXJyYXljb3B5Ci0gICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgb3V0IDw8ICJuZXcgYnl0ZVsiIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoXTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiU3lzdGVtLmFycmF5Y29weSgiIDw8IHNvdXJjZV9uYW1lIDw8ICIsIDAsICIgPDwgZGVzdF9uYW1lIDw8ICIsIDAsICIKLSAgICAgICAgICAgICAgICAgIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoKSI7Ci0gICAgfQotICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgY29waWVkIGRpcmVjdGx5Ci0gICAgZWxzZQotICAgICAgb3V0IDw8IHNvdXJjZV9uYW1lOwotICB9IGVsc2UgewotICAgIG91dCA8PCAibmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSI7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOwotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6Omlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKSB7Ci0gIHJldHVybiAiX18iICsgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSArICJfaXNzZXRfaWQiKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7Ci0gIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKLSAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgewotICBzdHJpbmcgcGFja2FnZSA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpICsgIi4iOwotICB9Ci0gIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBUU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgPDwgIlwiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZXNjcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgVEZpZWxkICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCAiKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICB9Ci19Ci0KLWJvb2wgdF9qYXZhbWVfZ2VuZXJhdG9yOjpoYXNfYml0X3ZlY3Rvcih0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIGNsZWFyKCkgeyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudF91cCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0LAotICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbXVzdCBiZSBhIGJhc2UgdHlwZQotICAgICAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIoZmFsc2UpOyIgPDwgZW5kbDsKLSAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDA7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8vIHByZXZlbnQgZ2NjIGNvbXBpbGVyIHdhcm5pbmcKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoamF2YW1lLCAiSmF2YSBNRSIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDg3NzQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDIxNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi0KLS8qKgotICogSlMgY29kZSBnZW5lcmF0b3IuCi0gKi8KLWNsYXNzIHRfanNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfanNfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotCi0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJub2RlIik7Ci0gICAgZ2VuX25vZGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImpxdWVyeSIpOwotICAgIGdlbl9qcXVlcnlfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaWYgKCFnZW5fbm9kZV8pIHsKLSAgICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ0cyIpOwotICAgICAgZ2VuX3RzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuX3RzXyA9IGZhbHNlOwotICAgIH0KLQotICAgIGlmIChnZW5fbm9kZV8gJiYgZ2VuX2pxdWVyeV8pIHsKLSAgICAgIHRocm93ICJJbnZhbGlkIHN3aXRjaDogWy1nZW4ganM6bm9kZSxqcXVlcnldIG9wdGlvbnMgbm90IGNvbXBhdGlibGUsIHRyeTogWy1nZW4ganM6bm9kZSAtZ2VuICIKLSAgICAgICAgICAgICJqczpqcXVlcnldIjsKLSAgICB9Ci0KLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ub2RlanMiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1qcyI7Ci0gICAgfQotCi0gICAgZXNjYXBlX1snXCcnXSA9ICJcXCciOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9yZWN2X3Rocm93KHN0ZDo6c3RyaW5nIHZhcik7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9yZWN2X3JldHVybihzdGQ6OnN0cmluZyB2YXIpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0cyEKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4cG9ydGVkID0gdHJ1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcganNfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgYm9vbCBvYmogPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV9jYWxsYmFjayA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygiLy9cbiIpICsgIi8vIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgotICAgICAgICAgICArICIvL1xuIiArICIvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCi0gICAgICAgICAgICsgIi8vXG4iOwotICB9Ci0KLSAgdF90eXBlKiBnZXRfY29udGFpbmVkX3R5cGUodF90eXBlKiB0KTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4ganNfbmFtZXNwYWNlX3BpZWNlcyh0X3Byb2dyYW0qIHApIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoImpzIik7Ci0KLSAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGllY2VzOwotCi0gICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICBwaWVjZXMucHVzaF9iYWNrKG5zLnN1YnN0cigwLCBsb2MpKTsKLSAgICAgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgIHBpZWNlcy5wdXNoX2JhY2sobnMpOwotICAgIH0KLQotICAgIHJldHVybiBwaWVjZXM7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBqc190eXBlX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICBpZiAocCAhPSBOVUxMICYmIHAgIT0gcHJvZ3JhbV8pIHsKLSAgICAgICAgcmV0dXJuIHAtPmdldF9uYW1lKCkgKyAiX3R0eXBlcy4iOwotICAgICAgfQotICAgICAgcmV0dXJuICJ0dHlwZXMuIjsKLSAgICB9Ci0gICAgcmV0dXJuIGpzX25hbWVzcGFjZShwKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGpzX2V4cG9ydF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7Ci0gICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgcmV0dXJuICJleHBvcnRzLiI7Ci0gICAgfQotICAgIHJldHVybiBqc19uYW1lc3BhY2UocCk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBqc19uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOwotICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICBucyArPSAiLiI7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5zOwotICB9Ci0KLSAgLyoqCi0gICAqIFR5cGVTY3JpcHQgRGVmaW5pdGlvbiBGaWxlIGhlbHBlciBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RyaW5nIHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9jYWxsYmFjayk7Ci0gIHN0cmluZyB0c19nZXRfdHlwZSh0X3R5cGUqIHR5cGUpOwotCi0gIC8qKgotICAgKiBTcGVjaWFsIGluZGVudGF0aW9uIGZvciBUeXBlU2NyaXB0IERlZmluaXRpb25zIGJlY2F1c2Ugb2YgdGhlIG1vZHVsZS4KLSAgICogUmV0dXJucyB0aGUgbm9ybWFsIGluZGVudGF0aW9uICsgIiAgIiBpZiBhIG1vZHVsZSB3YXMgZGVmaW5lZC4KLSAgICogQHJldHVybiBzdHJpbmcKLSAgICovCi0gIHN0cmluZyB0c19pbmRlbnQoKSB7IHJldHVybiBpbmRlbnQoKSArICghdHNfbW9kdWxlXy5lbXB0eSgpID8gIiAgIiA6ICIiKTsgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zICJkZWNsYXJlICIgaWYgbm8gbW9kdWxlIHdhcyBkZWZpbmVkLgotICAgKiBAcmV0dXJuIHN0cmluZwotICAgKi8KLSAgc3RyaW5nIHRzX2RlY2xhcmUoKSB7IHJldHVybiAodHNfbW9kdWxlXy5lbXB0eSgpID8gImRlY2xhcmUgIiA6ICIiKTsgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zICI/IiBpZiB0aGUgZ2l2ZW4gZmllbGQgaXMgb3B0aW9uYWwuCi0gICAqIEBwYXJhbSB0X2ZpZWxkIFRoZSBmaWVsZCB0byBjaGVjawotICAgKiBAcmV0dXJuIHN0cmluZwotICAgKi8KLSAgc3RyaW5nIHRzX2dldF9yZXEodF9maWVsZCogZmllbGQpIHsgcmV0dXJuIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgPyAiPyIgOiAiIik7IH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZG9jdW1lbnRhdGlvbiwgaWYgdGhlIHByb3ZpZGVkIGRvY3VtZW50YWJsZSBvYmplY3QgaGFzIG9uZS4KLSAgICogQHBhcmFtIHRfZG9jIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBkb2N1bWVudGF0aW9uIGZyb20KLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRvY3VtZW50YXRpb24KLSAgICovCi0gIHN0cmluZyB0c19wcmludF9kb2ModF9kb2MqIHRkb2MpIHsKLSAgICBzdHJpbmcgcmVzdWx0ID0gZW5kbDsKLQotICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGRvYyh0ZG9jLT5nZXRfZG9jKCkpOwotICAgICAgc3RyaW5nIGl0ZW07Ci0KLSAgICAgIHJlc3VsdCArPSB0c19pbmRlbnQoKSArICIvKioiICsgZW5kbDsKLSAgICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoZG9jLCBpdGVtKSkgewotICAgICAgICByZXN1bHQgKz0gdHNfaW5kZW50KCkgKyAiICogIiArIGl0ZW0gKyBlbmRsOwotICAgICAgfQotICAgICAgcmVzdWx0ICs9IHRzX2luZGVudCgpICsgIiAqLyIgKyBlbmRsOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLXByaXZhdGU6Ci0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBOb2RlSlMtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLgotICAgKi8KLSAgYm9vbCBnZW5fbm9kZV87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHNlcnZpY2VzIHRoYXQgdXNlIGpRdWVyeSBhamF4IChhc3luYy9zeW5jKS4KLSAgICovCi0gIGJvb2wgZ2VuX2pxdWVyeV87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGEgVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGUgZm9yIGVhY2ggc2VydmljZS4KLSAgICovCi0gIGJvb2wgZ2VuX3RzXzsKLQotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhlIGRlZmluZWQgbW9kdWxlKHMpLCBmb3IgVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGVzLgotICAgKi8KLSAgc3RyaW5nIHRzX21vZHVsZV87Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV90c187Ci19OwotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZShzKQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gb3V0ZGlyICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzLmpzIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgaWYgKGdlbl90c18pIHsKLSAgICBzdHJpbmcgZl90eXBlc190c19uYW1lID0gb3V0ZGlyICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzLmQudHMiOwotICAgIGZfdHlwZXNfdHNfLm9wZW4oZl90eXBlc190c19uYW1lLmNfc3RyKCkpOwotICB9Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGpzX2luY2x1ZGVzKCkgPDwgZW5kbCA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHNfKSB7Ci0gICAgZl90eXBlc190c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBmX3R5cGVzXyA8PCAidmFyIHR0eXBlcyA9IG1vZHVsZS5leHBvcnRzID0ge307IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIHBuczsKLQotICAvLyBzZXR1cCB0aGUgbmFtZXNwYWNlCi0gIC8vIFRPRE8gc2hvdWxkIHRoZSBuYW1lc3BhY2UganVzdCBiZSBpbiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3Igbm9kZT8KLSAgdmVjdG9yPHN0cmluZz4gbnNfcGllY2VzID0ganNfbmFtZXNwYWNlX3BpZWNlcyhwcm9ncmFtXyk7Ci0gIGlmIChuc19waWVjZXMuc2l6ZSgpID4gMCkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnNfcGllY2VzLnNpemUoKTsgKytpKSB7Ci0gICAgICBwbnMgKz0gKChpID09IDApID8gIiIgOiAiLiIpICsgbnNfcGllY2VzW2ldOwotICAgICAgZl90eXBlc18gPDwgImlmICh0eXBlb2YgIiA8PCBwbnMgPDwgIiA9PT0gJ3VuZGVmaW5lZCcpIHsiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCAiICAiIDw8IHBucyA8PCAiID0ge307IiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICB0c19tb2R1bGVfID0gcG5zOwotICAgICAgZl90eXBlc190c18gPDwgImRlY2xhcmUgbW9kdWxlICIgPDwgdHNfbW9kdWxlXyA8PCAiIHsiOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqcyBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6anNfaW5jbHVkZXMoKSB7Ci0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICByZXR1cm4gc3RyaW5nKAotICAgICAgICAidmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpO1xuIgotICAgICAgICAidmFyIFRocmlmdCA9IHRocmlmdC5UaHJpZnQ7XG4iCi0gICAgICAgICJ2YXIgUSA9IHRocmlmdC5RO1xuIik7Ci0gIH0KLQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgIHJlc3VsdCArPSAidmFyICIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSArICJfdHR5cGVzID0gcmVxdWlyZSgnLi8iICsgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICArICJfdHlwZXMnKVxuIjsKLSAgICB9Ci0gICAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKLSAgICAgIHJlc3VsdCArPSAiXG4iOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZShzKQotCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0KLSAgaWYgKGdlbl90c18pIHsKLSAgICBpZiAoIXRzX21vZHVsZV8uZW1wdHkoKSkgewotICAgICAgZl90eXBlc190c18gPDwgIn0iOwotICAgIH0KLSAgICBmX3R5cGVzX3RzXy5jbG9zZSgpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKUywgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKLSAqIGluIEpTLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgZl90eXBlc18gPDwganNfdHlwZV9uYW1lc3BhY2UodGVudW0tPmdldF9wcm9ncmFtKCkpIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHNfKSB7Ci0gICAgZl90eXBlc190c18gPDwgdHNfcHJpbnRfZG9jKHRlbnVtKSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImVudW0gIgotICAgICAgICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIiwiIDw8IGVuZGw7Ci0gICAgICAvLyBhZGQgJ3ZhbHVlOiBrZXknIGluIGFkZGl0aW9uIHRvICdrZXk6IHZhbHVlJyBmb3IgVHlwZVNjcmlwdCBlbnVtcwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiciIDw8IHZhbHVlIDw8ICInIDogJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyA6ICIgPDwgdmFsdWU7Ci0gICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCkgLSAxKSB7Ci0gICAgICBmX3R5cGVzXyA8PCAiLCI7Ci0gICAgfQotICAgIGZfdHlwZXNfIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfdHlwZXNfIDw8ICJ9OyIgPDwgZW5kbDsKLQotICBpZiAoZ2VuX3RzXykgewotICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGZfdHlwZXNfIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBuYW1lIDw8ICIgPSAiOwotICBmX3R5cGVzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHNfKSB7Ci0gICAgZl90eXBlc190c18gPDwgdHNfcHJpbnRfZG9jKHRjb25zdCkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJ2YXIgIiA8PCBuYW1lIDw8ICI6ICIKLSAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSh0eXBlKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLQotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICInIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICInIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAibmV3ICIgPDwganNfdHlwZV9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmJlZ2luKCkpCi0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJ9KSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotCi0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQotICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotCi0gICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgZW5kbCA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIG91dCA8PCAiWyI7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgfQotICAgIG91dCA8PCAiXSI7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBNYWtlIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9qc19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2pzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotfQotCi0vKioKLSAqIFJldHVybiB0eXBlIG9mIGNvbnRhaW5lZCBlbGVtZW50cyBmb3IgYSBjb250YWluZXIgdHlwZS4gRm9yIG1hcHMKLSAqIHRoaXMgaXMgdHlwZSBvZiB2YWx1ZSAoa2V5cyBhcmUgYWx3YXlzIHN0cmluZ3MgaW4ganMpCi0gKi8KLXRfdHlwZSogdF9qc19nZW5lcmF0b3I6OmdldF9jb250YWluZWRfdHlwZSh0X3R5cGUqIHQpIHsKLSAgdF90eXBlKiBldHlwZTsKLSAgaWYgKHQtPmlzX2xpc3QoKSkgewotICAgIGV0eXBlID0gKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKLSAgICBldHlwZSA9ICgodF9zZXQqKXQpLT5nZXRfZWxlbV90eXBlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgZXR5cGUgPSAoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCk7Ci0gIH0KLSAgcmV0dXJuIGV0eXBlOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBKUwotICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQotICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leHBvcnRlZCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBpZiAoaXNfZXhwb3J0ZWQpIHsKLSAgICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiID0gIgotICAgICAgICAgIDw8ICJtb2R1bGUuZXhwb3J0cy4iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA9IGZ1bmN0aW9uKGFyZ3MpIHsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiID0gZnVuY3Rpb24oYXJncykgeyIKLSAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA9IGZ1bmN0aW9uKGFyZ3MpIHsiCi0gICAgICAgIDw8IGVuZGw7Ci0gICAgaWYgKGdlbl90c18pIHsKLSAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0c3RydWN0KSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImNsYXNzICIKLSAgICAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgKGlzX2V4Y2VwdGlvbiA/ICIgZXh0ZW5kcyBUaHJpZnQuVEV4Y2VwdGlvbiIgOiAiIikKLSAgICAgICAgICAgICAgICAgIDw8ICIgeyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoZ2VuX25vZGVfICYmIGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0LlRFeGNlcHRpb24uY2FsbCh0aGlzLCBcIiIgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCi0gICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMubmFtZSA9IFwiIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBtZW1iZXJzIHdpdGggYXJndW1lbnRzCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZHZhbCA9IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsIHRydWUpOwotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKGdlbl90c18pIHsKLSAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiCi0gICAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIEVhcmx5IHJldHVybnMgZm9yIGV4Y2VwdGlvbnMKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAodC0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChhcmdzIGluc3RhbmNlb2YgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKQotICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ0aGlzLiIKLSAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gYXJnczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInJldHVybjsiCi0gICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGFyZ3MpIHsiIDw8IGVuZGw7Ci0gICAgaWYgKGdlbl90c18pIHsKLSAgICAgIGZfdHlwZXNfdHNfIDw8IGVuZGwgPDwgdHNfaW5kZW50KCkgPDwgImNvbnN0cnVjdG9yKGFyZ3M/OiB7ICI7Ci0gICAgfQotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJpZiAoYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSB1bmRlZmluZWQgJiYgYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IgotICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAgIGlmICh0LT5pc19zdHJ1Y3QoKSkgewotICAgICAgICBvdXQgPDwgKCIgPSBuZXcgIiArIGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpICsgdC0+Z2V0X25hbWUoKSArCi0gICAgICAgICAgICAgICAgIihhcmdzLiIrKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsiKTsiKTsKLSAgICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKHQtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAgIHRfdHlwZSogZXR5cGUgPSBnZXRfY29udGFpbmVkX3R5cGUodCk7Ci0gICAgICAgIHN0cmluZyBjb3B5RnVuYyA9IHQtPmlzX21hcCgpID8gIlRocmlmdC5jb3B5TWFwIiA6ICJUaHJpZnQuY29weUxpc3QiOwotICAgICAgICBzdHJpbmcgdHlwZV9saXN0ID0gIiI7Ci0KLSAgICAgICAgd2hpbGUgKGV0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgICAgIGlmICh0eXBlX2xpc3QubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICB0eXBlX2xpc3QgKz0gIiwgIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdHlwZV9saXN0ICs9IGV0eXBlLT5pc19tYXAoKSA/ICJUaHJpZnQuY29weU1hcCIgOiAiVGhyaWZ0LmNvcHlMaXN0IjsKLSAgICAgICAgICBldHlwZSA9IGdldF9jb250YWluZWRfdHlwZShldHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICAgICAgaWYgKHR5cGVfbGlzdC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHR5cGVfbGlzdCArPSAiLCAiOwotICAgICAgICAgIH0KLSAgICAgICAgICB0eXBlX2xpc3QgKz0ganNfdHlwZV9uYW1lc3BhY2UoZXR5cGUtPmdldF9wcm9ncmFtKCkpICsgZXR5cGUtPmdldF9uYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKHR5cGVfbGlzdC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHR5cGVfbGlzdCArPSAiLCAiOwotICAgICAgICAgIH0KLSAgICAgICAgICB0eXBlX2xpc3QgKz0gIm51bGwiOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0IDw8ICgiID0gIiArIGNvcHlGdW5jICsgIihhcmdzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCkgKwotICAgICAgICAgICAgICAgICIsIFsiICsgdHlwZV9saXN0ICsgIl0pOyIpOwotICAgICAgICBvdXQgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiID0gYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaWYgKCEoKm1faXRlciktPmdldF9yZXEoKSkgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAidGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuVU5LTk9XTiwgIgotICAgICAgICAgICAgICAgIidSZXF1aXJlZCBmaWVsZCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzIHVuc2V0IScpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICAgIGZfdHlwZXNfdHNfIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCB0c19nZXRfcmVxKCptX2l0ZXIpIDw8ICI6ICIKLSAgICAgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyAiOwotICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBpZiAoZ2VuX3RzXykgewotICAgICAgZl90eXBlc190c18gPDwgIn0pOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgIn07IiA8PCBlbmRsOwotICBpZiAoZ2VuX3RzXykgewotICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIiwgVGhyaWZ0LlRFeGNlcHRpb24pOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5wcm90b3R5cGUubmFtZSA9ICciCi0gICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIC8vIGluaXQgcHJvdG90eXBlCi0gICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIucHJvdG90eXBlID0ge307IgotICAgICAgICA8PCBlbmRsOwotICB9Ci0KLSAgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgIDw8ICIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihpbnB1dCkgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInZhciByZXQgPSBpbnB1dC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInZhciBmbmFtZSA9IHJldC5mbmFtZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ2YXIgZnR5cGUgPSByZXQuZnR5cGU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidmFyIGZpZCA9IHJldC5maWQ7IiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSBUaHJpZnQuVHlwZS5TVE9QKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGlmICghZmllbGRzLmVtcHR5KCkpIHsKLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZCkiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmIChmaWVsZHMuc2l6ZSgpID09IDEpIHsKLSAgICAgIC8vIHBzZXVkbyBjYXNlIHRvIG1ha2UganNsaW50IGhhcHB5Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAwOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgPDwgIi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihvdXRwdXQpIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCAmJiB0aGlzLiIKLSAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IHVuZGVmaW5lZCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCIKLSAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVTdHJ1Y3RFbmQoKTsiCi0gICAgICA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5qcyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBpZiAoZ2VuX3RzXykgewotICAgIHN0cmluZyBmX3NlcnZpY2VfdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5kLnRzIjsKLSAgICBmX3NlcnZpY2VfdHNfLm9wZW4oZl9zZXJ2aWNlX3RzX25hbWUuY19zdHIoKSk7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGpzX2luY2x1ZGVzKCkgPDwgZW5kbCA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHNfKSB7Ci0gICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICAgIGZfc2VydmljZV90c18gPDwgIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIuZC50c1wiIC8+IiA8PCBlbmRsOwotICAgIH0KLSAgICBmX3NlcnZpY2VfdHNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0gICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKLSAgICAgIGZfc2VydmljZV90c18gPDwgImRlY2xhcmUgbW9kdWxlICIgPDwgdHNfbW9kdWxlXyA8PCAiIHsiOwotICAgIH0KLSAgfQotCi0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAidmFyICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIiA9IHJlcXVpcmUoJy4vIgotICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiJykiIDw8IGVuZGwgPDwgInZhciAiCi0gICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgIDw8ICJDbGllbnQgPSAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIuQ2xpZW50IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8ICJ2YXIgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yID0gIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLlByb2Nlc3NvciIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ2YXIgdHR5cGVzID0gcmVxdWlyZSgnLi8iICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzJyk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0KLSAgaWYgKGdlbl9ub2RlXykgewotICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKLSAgfQotCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgaWYgKGdlbl90c18pIHsKLSAgICBpZiAoIXRzX21vZHVsZV8uZW1wdHkoKSkgewotICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAifSI7Ci0gICAgfQotICAgIGZfc2VydmljZV90c18uY2xvc2UoKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yID0gIgotICAgICAgICAgICAgIDw8ICJleHBvcnRzLlByb2Nlc3NvciA9IGZ1bmN0aW9uKGhhbmRsZXIpICI7Ci0KLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5faGFuZGxlciA9IGhhbmRsZXIiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKQotICAgICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IsICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IucHJvdG90eXBlLnByb2Nlc3MgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0KSAiOwotCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByID0gaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJpZiAodGhpc1sncHJvY2Vzc18nICsgci5mbmFtZV0pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiICByZXR1cm4gdGhpc1sncHJvY2Vzc18nICsgci5mbmFtZV0uY2FsbCh0aGlzLCByLnJzZXFpZCwgaW5wdXQsIG91dHB1dCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlucHV0LnNraXAoVGhyaWZ0LlR5cGUuU1RSVUNUKTsiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIgIHZhciB4ID0gbmV3ICIKLSAgICAgICAgICAgICAgICAiVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOX01FVEhPRCwgIgotICAgICAgICAgICAgICAgICInVW5rbm93biBmdW5jdGlvbiAnICsgci5mbmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiAgb3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKHIuZm5hbWUsIFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04sIHIucnNlcWlkKTsiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiAgb3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCi0gICAgICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA9IGZ1bmN0aW9uKHNlcWlkLCBpbnB1dCwgb3V0cHV0KSAiOwotCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IGpzX25hbWVzcGFjZShwcm9ncmFtXykgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBqc19uYW1lc3BhY2UocHJvZ3JhbV8pICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJhcmdzLnJlYWQoaW5wdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgIDw8ICIubGVuZ3RoID09PSAiIDw8IGZpZWxkcy5zaXplKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUS5mY2FsbCh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiLCBhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIih7c3VjY2VzczogcmVzdWx0fSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgPDwgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAicmVzdWx0LndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9LCBmdW5jdGlvbiAoZXJyKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBib29sIGhhc19leGNlcHRpb24gPSBmYWxzZTsKLSAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgaWYgKGV4Y2VwdGlvbnMpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKLSAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVtYmVycy5iZWdpbigpOyBpdCAhPSBtZW1iZXJzLmVuZCgpOyArK2l0KSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqaXQpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICh0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIGlmICghaGFzX2V4Y2VwdGlvbikgewotICAgICAgICAgIGhhc19leGNlcHRpb24gPSB0cnVlOwotICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGVyciBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgfHwgZXJyIGluc3RhbmNlb2YgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKQotICAgICAgICAgICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChoYXNfZXhjZXB0aW9uKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoZXJyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgPDwgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGVyci5tZXNzYWdlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIKLSAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsOwotCi0gIGlmIChoYXNfZXhjZXB0aW9uKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICI7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8ICJmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGVyciA9PSBudWxsIjsKLSAgaWYgKGhhc19leGNlcHRpb24pIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKLSAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVtYmVycy5iZWdpbigpOyBpdCAhPSBtZW1iZXJzLmVuZCgpOyArK2l0KSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqaXQpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICh0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiB8fCBlcnIgaW5zdGFuY2VvZiAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpIDw8IHQtPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGZfc2VydmljZV8gPDwgIikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lCi0gICAgICAgICAgICAgPDwgIigoZXJyICE9IG51bGwgPyBlcnIgOiB7c3VjY2VzczogcmVzdWx0fSkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA9IG5ldyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuVU5LTk9XTiwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBlcnIubWVzc2FnZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiCi0gICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gRG8gbm90IGdlbmVyYXRlIFRTIGRlZmluaXRpb25zIGZvciBoZWxwZXIgZnVuY3Rpb25zCi0gIGJvb2wgZ2VuX3RzX3RtcCA9IGdlbl90c187Ci0gIGdlbl90c18gPSBmYWxzZTsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8ICIvL0hFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOwotICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7Ci0gICAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgICB0cy0+c2V0X25hbWUobmFtZSk7Ci0gIH0KLQotICBnZW5fdHNfID0gZ2VuX3RzX3RtcDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAodm9pZCl0c2VydmljZTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAodm9pZCl0c2VydmljZTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgaWYgKGdlbl9ub2RlXykgewotICAgIGZfc2VydmljZV8gPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgPSAiCi0gICAgICAgICAgICAgICA8PCAiZXhwb3J0cy5DbGllbnQgPSBmdW5jdGlvbihvdXRwdXQsIHBDbGFzcykgeyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXwotICAgICAgICAgICAgICAgPDwgIkNsaWVudCA9IGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQpIHsiIDw8IGVuZGw7Ci0gICAgaWYgKGdlbl90c18pIHsKLSAgICAgIGZfc2VydmljZV90c18gPDwgdHNfcHJpbnRfZG9jKHRzZXJ2aWNlKSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImNsYXNzICIKLSAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICI7Ci0gICAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIkNsaWVudCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAieyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICB0aGlzLm91dHB1dCA9IG91dHB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgIHRoaXMucENsYXNzID0gcENsYXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB0aGlzLl9zZXFpZCA9IDA7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aGlzLl9yZXFzID0ge307IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgdGhpcy5pbnB1dCA9IGlucHV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgdGhpcy5vdXRwdXQgPSAoIW91dHB1dCkgPyBpbnB1dCA6IG91dHB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgIHRoaXMuc2VxaWQgPSAwOyIgPDwgZW5kbDsKLSAgICBpZiAoZ2VuX3RzXykgewotICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAiaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKQotICAgICAgICAgICAgICAgICAgICA8PCAib3V0cHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbDsiIDw8IGVuZGwgPDwgdHNfaW5kZW50KCkgPDwgInNlcWlkOiBudW1iZXI7IgotICAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgdHNfaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICAgPDwgImNvbnN0cnVjdG9yKGlucHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbCwgb3V0cHV0PzogVGhyaWZ0LlRKU09OUHJvdG9jb2wpOyIKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUaHJpZnQuaW5oZXJpdHMoIiA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCwgIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICAvLyBpbml0IHByb3RvdHlwZQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUgPSB7fTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyB1dGlscyBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMKLSAgaWYgKGdlbl9ub2RlXykgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUuc2VxaWQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3NlcWlkOyB9IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXwotICAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS5uZXdfc2VxaWQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3NlcWlkICs9IDE7IH0iCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgYXJnbGlzdCA9IGFyZ3VtZW50X2xpc3QoYXJnX3N0cnVjdCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgZl9zZXJ2aWNlXyA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudC5wcm90b3R5cGUuIgotICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCB0cnVlKSA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYygqZl9pdGVyKSA8PAotICAgICAgICAgIC8vIGZ1bmN0aW9uIGRlZmluaXRpb24gd2l0aG91dCBjYWxsYmFjawotICAgICAgICAgIHRzX2luZGVudCgpIDw8IHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgZW5kbCA8PCB0c19wcmludF9kb2MoKmZfaXRlcikgPDwKLSAgICAgICAgICAvLyBvdmVybG9hZCB3aXRoIGNhbGxiYWNrCi0gICAgICAgICAgdHNfaW5kZW50KCkgPDwgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGdlbl9ub2RlXykgeyAvLyBOb2RlLmpzIG91dHB1dCAgICAgIC4vZ2VuLW5vZGVqcwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5fc2VxaWQgPSB0aGlzLm5ld19zZXFpZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBfZGVmZXIgPSBRLmRlZmVyKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICJ0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV0gPSBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnJvcikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfZGVmZXIucmVqZWN0KGVycm9yKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfZGVmZXIucmVzb2x2ZShyZXN1bHQpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gX2RlZmVyLnByb21pc2U7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXSA9IGNhbGxiYWNrOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAoZ2VuX2pxdWVyeV8pIHsgLy8galF1ZXJ5IG91dHB1dCAgICAgICAuL2dlbi1qcwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsOwotICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ0aGlzLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBwb3N0RGF0YSA9IHRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QKLSAgICAgICAgICAgICAgICAgPDwgKGFyZ2xpc3QuZW1wdHkoKSA/ICIiIDogIiwgIikgPDwgInRydWUpOyIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiLmpxUmVxdWVzdCh0aGlzLCBwb3N0RGF0YSwgYXJndW1lbnRzLCB0aGlzLnJlY3ZfIiA8PCBmdW5uYW1lCi0gICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgeyAvLyBTdGFuZGFyZCBKYXZhU2NyaXB0IC4vZ2VuLWpzCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0Ci0gICAgICAgICAgICAgICAgIDw8IChhcmdsaXN0LmVtcHR5KCkgPyAiIiA6ICIsICIpIDw8ICJjYWxsYmFjayk7ICIgPDwgZW5kbDsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIWNhbGxiYWNrKSB7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiICByZXR1cm4gIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ0aGlzLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBTZW5kIGZ1bmN0aW9uCi0gICAgZl9zZXJ2aWNlXyA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudC5wcm90b3R5cGUuc2VuZF8iCi0gICAgICAgICAgICAgICA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIsICFnZW5fbm9kZV8pIDw8ICIgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgb3V0cHV0VmFyOwotICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBvdXRwdXQgPSBuZXcgdGhpcy5wQ2xhc3ModGhpcy5vdXRwdXQpOyIgPDwgZW5kbDsKLSAgICAgIG91dHB1dFZhciA9ICJvdXRwdXQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXRwdXRWYXIgPSAidGhpcy5vdXRwdXQiOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0ganNfbmFtZXNwYWNlKHByb2dyYW1fKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl9hcmdzIjsKLQotICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUaHJpZnQuTWVzc2FnZVR5cGUuT05FV0FZIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJUaHJpZnQuTWVzc2FnZVR5cGUuQ0FMTCI7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBvdXRwdXRWYXIgPDwgIi53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgbWVzc2FnZVR5cGUgPDwgIiwgdGhpcy5zZXFpZCgpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgb3V0cHV0VmFyIDw8ICIud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIsIHRoaXMuc2VxaWQpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKCIgPDwgb3V0cHV0VmFyIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBvdXRwdXRWYXIKLSAgICAgICAgICAgICAgIDw8ICIud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoZ2VuX2pxdWVyeV8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKGNhbGxiYWNrKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoY2FsbGJhY2spIHsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgdmFyIHNlbGYgPSB0aGlzOyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCBmdW5jdGlvbigpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgICB2YXIgcmVzdWx0ID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgICB0cnkgeyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAgICAgcmVzdWx0ID0gc2VsZi5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICAgfSBjYXRjaCAoZSkgeyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAgICAgcmVzdWx0ID0gZTsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgICB9IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICAgY2FsbGJhY2socmVzdWx0KTsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgfSk7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0ganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiA9IGZ1bmN0aW9uKGlucHV0LG10eXBlLHJzZXFpZCkgeyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS4iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIiB7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgc3RkOjpzdHJpbmcgaW5wdXRWYXI7Ci0gICAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICAgIGlucHV0VmFyID0gImlucHV0IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlucHV0VmFyID0gInRoaXMuaW5wdXQiOwotICAgICAgfQotCi0gICAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBjYWxsYmFjayA9IHRoaXMuX3JlcXNbcnNlcWlkXSB8fCBmdW5jdGlvbigpIHt9OyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJkZWxldGUgdGhpcy5fcmVxc1tyc2VxaWRdOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXQgPSB0aGlzLmlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICA8PCAidmFyIGZuYW1lID0gcmV0LmZuYW1lOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmFyIG10eXBlID0gcmV0Lm10eXBlOyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2YXIgcnNlcWlkID0gcmV0LnJzZXFpZDsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChtdHlwZSA9PSBUaHJpZnQuTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIHZhciB4ID0gbmV3IFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAgeC5yZWFkKCIgPDwgaW5wdXRWYXIgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICIgPDwgaW5wdXRWYXIKLSAgICAgICAgICAgICAgICAgPDwgIi5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHJlbmRlcl9yZWN2X3Rocm93KCJ4IikKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAicmVzdWx0LnJlYWQoIiA8PCBpbnB1dFZhciA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5wdXRWYXIgPDwgIi5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAobnVsbCAhPT0gcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHJlbmRlcl9yZWN2X3Rocm93KCJyZXN1bHQuIiArICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAobnVsbCAhPT0gcmVzdWx0LnN1Y2Nlc3MpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgIgotICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9yZWN2X3JldHVybigicmVzdWx0LnN1Y2Nlc3MiKSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX3JlY3ZfdGhyb3coIiciICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0JyIpCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNhbGxiYWNrKG51bGwpIiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmIChnZW5fdHNfKSB7Ci0gICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX3JlY3ZfdGhyb3coc3RkOjpzdHJpbmcgdmFyKSB7Ci0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICByZXR1cm4gInJldHVybiBjYWxsYmFjaygiICsgdmFyICsgIik7IjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gInRocm93ICIgKyB2YXIgKyAiOyI7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9yZWN2X3JldHVybihzdGQ6OnN0cmluZyB2YXIpIHsKLSAgaWYgKGdlbl9ub2RlXykgewotICAgIHJldHVybiAicmV0dXJuIGNhbGxiYWNrKG51bGwsICIgKyB2YXIgKyAiKTsiOwotICB9IGVsc2UgewotICAgIHJldHVybiAicmV0dXJuICIgKyB2YXIgKyAiOyI7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKLSAgKHZvaWQpaW5jbGFzczsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlucHV0LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSA/ICJyZWFkQmluYXJ5KCkiIDogInJlYWRTdHJpbmcoKSIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNigpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOwotICAgIH0KLQotICAgIGlmICghZ2VuX25vZGVfKSB7Ci0gICAgICBvdXQgPDwgIi52YWx1ZSI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKLSAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQotICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKLSAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwganNfdHlwZV9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlucHV0KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotICBzdHJpbmcgcnRtcDMgPSB0bXAoIl9ydG1wMyIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBzaXplIDw8ICIgPSAwOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBydG1wMyA8PCAiOyIgPDwgZW5kbDsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwga3R5cGUgPDwgIiA9IDA7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCB2dHlwZSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwga3R5cGUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5rdHlwZTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IHZ0eXBlIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIudnR5cGU7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBzaXplIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIuc2l6ZTsiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IFtdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8IHJ0bXAzIDw8ICIgPSBpbnB1dC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZXR5cGUgPDwgIiA9ICIKLSAgICAgICAgPDwgcnRtcDMgPDwgIi5ldHlwZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemU7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZXR5cGUgPDwgIiA9ICIKLSAgICAgICAgPDwgcnRtcDMgPDwgIi5ldHlwZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemU7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaWYgKCFnZW5fbm9kZV8pIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaSA8PCAiID4gMCApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiICBpZiAoaW5wdXQucnN0YWNrLmxlbmd0aCA+IGlucHV0LnJwb3NbaW5wdXQucnBvcy5sZW5ndGggLTFdICsgMSkgeyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgaW5wdXQucnN0YWNrLnBvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgia2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoInZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5LCBmYWxzZSwgZmFsc2UpIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCBmYWxzZSwgZmFsc2UpIDw8ICI7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAgIC8vIEhhY2sgZm9yIHdoZW4gcHJlZml4IGlzIGRlZmluZWQgKGFsd2F5cyBhIGhhc2ggcmVmKQotICAgIGlmICghcHJlZml4LmVtcHR5KCkpCi0gICAgICBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgPyAid3JpdGVCaW5hcnkoIiA6ICJ3cml0ZVN0cmluZygiKSA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKUyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0gICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3V0cHV0KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGVzIG91dCBhIGNvbnRhaW5lcgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCAiVGhyaWZ0Lm9iamVjdExlbmd0aCgiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgIDw8IHByZWZpeCA8PCAiLmxlbmd0aCk7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGtpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIuaGFzT3duUHJvcGVydHkoIiA8PCBraXRlciA8PCAiKSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgdml0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBraXRlciA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIuaGFzT3duUHJvcGVydHkoIiA8PCBpdGVyIDw8ICIpKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBpdGVyIDw8ICJdOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLmhhc093blByb3BlcnR5KCIgPDwgaXRlciA8PCAiKSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCBpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiWyIgPDwgaXRlciA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICJ0aGlzLiIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKCFvYmopIHsKLSAgICByZXN1bHQgPSAidmFyICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBpZiAob2JqKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyBqc190eXBlX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV9jYWxsYmFjaykgewotCi0gIHN0cmluZyBzdHI7Ci0KLSAgc3RyID0gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIiA9IGZ1bmN0aW9uKCI7Ci0KLSAgc3RyICs9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBpbmNsdWRlX2NhbGxiYWNrKTsKLQotICBzdHIgKz0gIikiOwotICByZXR1cm4gc3RyOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAoaW5jbHVkZV9jYWxsYmFjaykgewotICAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gImNhbGxiYWNrIjsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIGEgdF90eXBlIHRvIGEgVHlwZVNjcmlwdCB0eXBlIChzdHJpbmcpLgotICogQHBhcmFtIHRfdHlwZSBUeXBlIHRvIGNvbnZlcnQgdG8gVHlwZVNjcmlwdAotICogQHJldHVybiBTdHJpbmcgVHlwZVNjcmlwdCB0eXBlCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6dHNfZ2V0X3R5cGUodF90eXBlKiB0eXBlKSB7Ci0gIHN0ZDo6c3RyaW5nIHRzX3R5cGU7Ci0KLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHRzX3R5cGUgPSAic3RyaW5nIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHRzX3R5cGUgPSAiYm9vbGVhbiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICB0c190eXBlID0gImFueSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHRzX3R5cGUgPSAibnVtYmVyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRzX3R5cGUgPSAidm9pZCI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lOwotICAgIGlmICh0eXBlLT5nZXRfcHJvZ3JhbSgpKSB7Ci0gICAgICB0eXBlX25hbWUgPSBqc19uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSk7Ci0gICAgfQotICAgIHR5cGVfbmFtZS5hcHBlbmQodHlwZS0+Z2V0X25hbWUoKSk7Ci0gICAgdHNfdHlwZSA9IHR5cGVfbmFtZTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotCi0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIHRzX3R5cGUgPSB0c19nZXRfdHlwZShldHlwZSkgKyAiW10iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGt0eXBlID0gdHNfZ2V0X3R5cGUoKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICBzdHJpbmcgdnR5cGUgPSB0c19nZXRfdHlwZSgoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotCi0KLSAgICBpZiAoa3R5cGUgPT0gIm51bWJlciIgfHwga3R5cGUgPT0gInN0cmluZyIgKSB7Ci0gICAgICB0c190eXBlID0gInsgW2s6ICIgKyBrdHlwZSArICJdOiAiICsgdnR5cGUgKyAiOyB9IjsKLSAgICB9IGVsc2UgaWYgKCgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCkpLT5pc19lbnVtKCkpIHsKLSAgICAgIC8vIE5vdCB5ZXQgc3VwcG9ydGVkIChlbnVtIG1hcCk6IGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9wdWxsLzI2NTIKLSAgICAgIC8vdHNfdHlwZSA9ICJ7IFtrOiAiICsga3R5cGUgKyAiXTogIiArIHZ0eXBlICsgIjsgfSI7Ci0gICAgICB0c190eXBlID0gInsgW2s6IG51bWJlciAvKiIgKyBrdHlwZSArICIqL106ICIgKyB2dHlwZSArICI7IH0iOwotICAgIH0gZWxzZSB7Ci0gICAgICB0c190eXBlID0gImFueSI7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRzX3R5cGU7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIFR5cGVTY3JpcHQgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICduYW1lKGFyZ3M6IHR5cGVzKTogdHlwZTsnCi0gKgotICogQHBhcmFtIHRfZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHBhcmFtIGJvb2wgaW4tL2V4Y2x1ZGUgdGhlIGNhbGxiYWNrIGFyZ3VtZW50Ci0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0c19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfY2FsbGJhY2spIHsKLSAgc3RyaW5nIHN0cjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArIHRzX2dldF9yZXEoKmZfaXRlcikgKyAiOiAiICsgdHNfZ2V0X3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLQotICAgIGlmIChmX2l0ZXIgKyAxICE9IGZpZWxkcy5lbmQoKSB8fCAoaW5jbHVkZV9jYWxsYmFjayAmJiBmaWVsZHMuc2l6ZSgpID4gMCkpIHsKLSAgICAgIHN0ciArPSAiLCAiOwotICAgIH0KLSAgfQotCi0gIGlmIChpbmNsdWRlX2NhbGxiYWNrKSB7Ci0gICAgc3RyICs9ICJjYWxsYmFjazogRnVuY3Rpb24pOiAiOwotCi0gICAgaWYgKGdlbl9qcXVlcnlfKSB7Ci0gICAgICBzdHIgKz0gIkpRdWVyeVhIUjsiOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHIgKz0gInZvaWQ7IjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3RyICs9ICIpOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI7IjsKLSAgfQotCi0gIHJldHVybiBzdHI7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoanMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJKYXZhc2NyaXB0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBqcXVlcnk6ICAgICAgICAgIEdlbmVyYXRlIGpRdWVyeSBjb21wYXRpYmxlIGNvZGUuXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgbm9kZTogICAgICAgICAgICBHZW5lcmF0ZSBub2RlLmpzIGNvbXBhdGlibGUgY29kZS5cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB0czogICAgICAgICAgICAgIEdlbmVyYXRlIFR5cGVTY3JpcHQgZGVmaW5pdGlvbiBmaWxlcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfanNvbl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfanNvbl9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNDRhODIuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci11c2luZyBzdGQ6OnN0YWNrOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOwotc3RhdGljIGNvbnN0IHN0cmluZyBxdW90ID0gIlwiIjsKLXN0YXRpYyBjb25zdCBib29sIE5PX0lOREVOVCA9IGZhbHNlOwotc3RhdGljIGNvbnN0IGJvb2wgRk9SQ0VfU1RSSU5HID0gdHJ1ZTsKLQotY2xhc3MgdF9qc29uX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfanNvbl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKXBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tanNvbiI7Ci0KLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJtZXJnZSIpOwotICAgIHNob3VsZF9tZXJnZV9pbmNsdWRlc18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gIH0KLQotICB2aXJ0dWFsIH50X2pzb25fZ2VuZXJhdG9yKCkge30KLQotICAvKioKLSAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYyk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGQodF9maWVsZCogZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi1wcml2YXRlOgotICBib29sIHNob3VsZF9tZXJnZV9pbmNsdWRlc187Ci0KLSAgc3RkOjpvZnN0cmVhbSBmX2pzb25fOwotICBzdGQ6OnN0YWNrPGJvb2w+IGNvbW1hX25lZWRlZF87Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0cmluZyBudW1iZXJfdG9fc3RyaW5nKFQgdCkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gICAgb3V0LmltYnVlKHN0ZDo6bG9jYWxlOjpjbGFzc2ljKCkpOwotICAgIG91dC5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxUPjo6ZGlnaXRzMTApOwotICAgIG91dCA8PCB0OwotICAgIHJldHVybiBvdXQuc3RyKCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgdm9pZCB3cml0ZV9udW1iZXIoVCBuKSB7Ci0gICAgZl9qc29uXyA8PCBudW1iZXJfdG9fc3RyaW5nKG4pOwotICB9Ci0KLSAgc3RyaW5nIGdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0cmluZyBnZXRfcXVhbGlmaWVkX25hbWUodF90eXBlKiB0dHlwZSk7Ci0KLSAgdm9pZCBzdGFydF9vYmplY3QoYm9vbCBzaG91bGRfaW5kZW50ID0gdHJ1ZSk7Ci0gIHZvaWQgc3RhcnRfYXJyYXkoKTsKLSAgdm9pZCBlbmRfb2JqZWN0KCk7Ci0gIHZvaWQgZW5kX2FycmF5KCk7Ci0gIHZvaWQgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gIHZvaWQgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gIHN0cmluZyBlc2NhcGVfanNvbl9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCk7Ci0gIHN0cmluZyBqc29uX3N0cihjb25zdCBzdHJpbmcmIHN0cik7Ci0gIHZvaWQgbWVyZ2VfaW5jbHVkZXModF9wcm9ncmFtKik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdGFudCh0X2NvbnN0KiBjb24pOwotCi0gIHZvaWQgd3JpdGVfdHlwZV9zcGVjX2VudHJ5KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpOwotICB2b2lkIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoY29uc3QgY2hhciogbmFtZSwgdF90eXBlKiB0dHlwZSk7Ci0gIHZvaWQgd3JpdGVfdHlwZV9zcGVjKHRfdHlwZSogdHR5cGUpOwotICB2b2lkIHdyaXRlX3N0cmluZyhjb25zdCBzdHJpbmcmIHZhbHVlKTsKLSAgdm9pZCB3cml0ZV92YWx1ZSh0X3R5cGUqIHR2YWx1ZSk7Ci0gIHZvaWQgd3JpdGVfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgZm9yY2Vfc3RyaW5nID0gZmFsc2UpOwotICB2b2lkIHdyaXRlX2tleV9hbmQoc3RyaW5nIGtleSk7Ci0gIHZvaWQgd3JpdGVfa2V5X2FuZF9zdHJpbmcoc3RyaW5nIGtleSwgc3RyaW5nIHZhbCk7Ci0gIHZvaWQgd3JpdGVfa2V5X2FuZF9pbnRlZ2VyKHN0cmluZyBrZXksIGludCB2YWwpOwotICB2b2lkIHdyaXRlX2tleV9hbmRfYm9vbChzdHJpbmcga2V5LCBib29sIHZhbCk7Ci19OwotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2pzb25fbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuanNvbiI7Ci0gIGZfanNvbl8ub3BlbihmX2pzb25fbmFtZS5jX3N0cigpKTsKLQotICAvLyBNZXJnZSBhbGwgaW5jbHVkZWQgcHJvZ3JhbXMgaW50byB0aGlzIG9uZSBzbyB3ZSBjYW4gb3V0cHV0IG9uZSBiaWcgZmlsZS4KLSAgaWYgKHNob3VsZF9tZXJnZV9pbmNsdWRlc18pIHsKLSAgICBtZXJnZV9pbmNsdWRlcyhwcm9ncmFtXyk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6OmVzY2FwZV9qc29uX3N0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0KSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKLSAgZm9yIChzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGlucHV0LmJlZ2luKCk7IGl0ZXIgIT0gaW5wdXQuZW5kKCk7IGl0ZXIrKykgewotICAgIHN3aXRjaCAoKml0ZXIpIHsKLSAgICBjYXNlICdcXCc6Ci0gICAgICBzcyA8PCAiXFxcXCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICciJzoKLSAgICAgIHNzIDw8ICJcXFwiIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJy8nOgotICAgICAgc3MgPDwgIlxcLyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdcYic6Ci0gICAgICBzcyA8PCAiXFxiIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1xmJzoKLSAgICAgIHNzIDw8ICJcXGYiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnXG4nOgotICAgICAgc3MgPDwgIlxcbiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdccic6Ci0gICAgICBzcyA8PCAiXFxyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1x0JzoKLSAgICAgIHNzIDw8ICJcXHQiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNzIDw8ICppdGVyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpzdGFydF9vYmplY3QoYm9vbCBzaG91bGRfaW5kZW50KSB7Ci0gIGZfanNvbl8gPDwgKHNob3VsZF9pbmRlbnQgPyBpbmRlbnQoKSA6ICIiKSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGNvbW1hX25lZWRlZF8ucHVzaChmYWxzZSk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6c3RhcnRfYXJyYXkoKSB7Ci0gIGZfanNvbl8gPDwgIlsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBjb21tYV9uZWVkZWRfLnB1c2goZmFsc2UpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2NvbW1hX2lmX25lZWRlZCgpIHsKLSAgaWYgKGNvbW1hX25lZWRlZF8udG9wKCkpIHsKLSAgICBmX2pzb25fIDw8ICIsIiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6aW5kaWNhdGVfY29tbWFfbmVlZGVkKCkgewotICBjb21tYV9uZWVkZWRfLnBvcCgpOwotICBjb21tYV9uZWVkZWRfLnB1c2godHJ1ZSk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2FuZChzdHJpbmcga2V5KSB7Ci0gIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOwotICBpbmRlbnQoZl9qc29uXykgPDwganNvbl9zdHIoa2V5KSA8PCAiOiAiOwotICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9rZXlfYW5kX2ludGVnZXIoc3RyaW5nIGtleSwgaW50IHZhbCkgewotICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgaW5kZW50KGZfanNvbl8pIDw8IGpzb25fc3RyKGtleSkgPDwgIjogIiA8PCBudW1iZXJfdG9fc3RyaW5nKHZhbCk7Ci0gIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleV9hbmRfc3RyaW5nKHN0cmluZyBrZXksIHN0cmluZyB2YWwpIHsKLSAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gIGluZGVudChmX2pzb25fKSA8PCBqc29uX3N0cihrZXkpIDw8ICI6ICIgPDwganNvbl9zdHIodmFsKTsKLSAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2FuZF9ib29sKHN0cmluZyBrZXksIGJvb2wgdmFsKSB7Ci0gIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOwotICBpbmRlbnQoZl9qc29uXykgPDwganNvbl9zdHIoa2V5KSA8PCAiOiAiIDw8ICh2YWwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6ZW5kX29iamVjdCgpIHsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9qc29uXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgY29tbWFfbmVlZGVkXy5wb3AoKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjplbmRfYXJyYXkoKSB7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGlmIChjb21tYV9uZWVkZWRfLnRvcCgpKSB7Ci0gICAgZl9qc29uXyA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX2pzb25fKSA8PCAiXSI7Ci0gIGNvbW1hX25lZWRlZF8ucG9wKCk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfdHlwZV9zcGVjX29iamVjdChjb25zdCBjaGFyKiBuYW1lLCB0X3R5cGUqIHR0eXBlKSB7Ci0gIHR0eXBlID0gdHR5cGUtPmdldF90cnVlX3R5cGUoKTsKLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICB3cml0ZV9rZXlfYW5kKG5hbWUpOwotICAgIHN0YXJ0X29iamVjdChOT19JTkRFTlQpOwotICAgIHdyaXRlX2tleV9hbmQoInR5cGVJZCIpOwotICAgIHdyaXRlX3R5cGVfc3BlYyh0dHlwZSk7Ci0gICAgZW5kX29iamVjdCgpOwotICB9Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfdHlwZV9zcGVjX2VudHJ5KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpIHsKLSAgd3JpdGVfa2V5X2FuZChuYW1lKTsKLSAgd3JpdGVfdHlwZV9zcGVjKHR0eXBlKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV90eXBlX3NwZWModF90eXBlKiB0dHlwZSkgewotICB0dHlwZSA9IHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7Ci0KLSAgd3JpdGVfc3RyaW5nKGdldF90eXBlX25hbWUodHR5cGUpKTsKLQotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImNsYXNzIiwgZ2V0X3F1YWxpZmllZF9uYW1lKHR0eXBlKSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImtleVR5cGVJZCIsIGdldF90eXBlX25hbWUoa3R5cGUpKTsKLSAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygidmFsdWVUeXBlSWQiLCBnZXRfdHlwZV9uYW1lKHZ0eXBlKSk7Ci0gICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgia2V5VHlwZSIsIGt0eXBlKTsKLSAgICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ2YWx1ZVR5cGUiLCB2dHlwZSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJlbGVtVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZShldHlwZSkpOwotICAgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoImVsZW1UeXBlIiwgZXR5cGUpOwotICB9Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICBmX2pzb25fIDw8IGVuZGw7Ci0gIGZfanNvbl8uY2xvc2UoKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjptZXJnZV9pbmNsdWRlcyh0X3Byb2dyYW0qIHByb2dyYW0pIHsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaW5jX2l0ZXI7Ci0gIGZvciAoaW5jX2l0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpbmNfaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgKytpbmNfaXRlcikgewotICAgIHRfcHJvZ3JhbSogaW5jbHVkZSA9ICppbmNfaXRlcjsKLSAgICAvLyByZWN1cnNlIGluIGNhc2Ugd2UgZ2V0IGNyYXp5Ci0gICAgbWVyZ2VfaW5jbHVkZXMoaW5jbHVkZSk7Ci0gICAgLy8gbWVyZ2UgZW51bXMKLSAgICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBpbmNsdWRlLT5nZXRfZW51bXMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gICAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7Ci0gICAgICBwcm9ncmFtLT5hZGRfZW51bSgqZW5faXRlcik7Ci0gICAgfQotICAgIC8vIG1lcmdlIHR5cGVkZWZzCi0gICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gaW5jbHVkZS0+Z2V0X3R5cGVkZWZzKCk7Ci0gICAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOwotICAgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgewotICAgICAgcHJvZ3JhbS0+YWRkX3R5cGVkZWYoKnRkX2l0ZXIpOwotICAgIH0KLSAgICAvLyBtZXJnZSBzdHJ1Y3RzCi0gICAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IGluY2x1ZGUtPmdldF9vYmplY3RzKCk7Ci0gICAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKLSAgICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgICBwcm9ncmFtLT5hZGRfc3RydWN0KCpvX2l0ZXIpOwotICAgIH0KLSAgICAvLyBtZXJnZSBjb25zdGFudHMKLSAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IGluY2x1ZGUtPmdldF9jb25zdHMoKTsKLSAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIHByb2dyYW0tPmFkZF9jb25zdCgqY19pdGVyKTsKLSAgICB9Ci0KLSAgICAvLyBtZXJnZSBzZXJ2aWNlcwotICAgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IGluY2x1ZGUtPmdldF9zZXJ2aWNlcygpOwotICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICAgIHByb2dyYW0tPmFkZF9zZXJ2aWNlKCpzdl9pdGVyKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgewotCi0gIGluaXRfZ2VuZXJhdG9yKCk7Ci0KLSAgc3RhcnRfb2JqZWN0KCk7Ci0gIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgcHJvZ3JhbV8tPmdldF9uYW1lKCkpOwotICBpZiAocHJvZ3JhbV8tPmhhc19kb2MoKSkgewotICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCBwcm9ncmFtXy0+Z2V0X2RvYygpKTsKLSAgfQotCi0gIC8vIFdoZW4gbWVyZ2luZyBpbmNsdWRlcywgdGhlICJuYW1lc3BhY2VzIiBhbmQgImluY2x1ZGVzIiBzZWN0aW9ucwotICAvLyBiZWNvbWUgYW1iaWd1b3VzLCBzbyBqdXN0IHNraXAgdGhlbS4KLSAgaWYgKCFzaG91bGRfbWVyZ2VfaW5jbHVkZXNfKSB7Ci0gICAgLy8gR2VuZXJhdGUgbmFtZXNwYWNlcwotICAgIHdyaXRlX2tleV9hbmQoIm5hbWVzcGFjZXMiKTsKLSAgICBzdGFydF9vYmplY3QoTk9fSU5ERU5UKTsKLSAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBuYW1lc3BhY2VzID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2VzKCk7Ci0gICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbnNfaXQ7Ci0gICAgZm9yIChuc19pdCA9IG5hbWVzcGFjZXMuYmVnaW4oKTsgbnNfaXQgIT0gbmFtZXNwYWNlcy5lbmQoKTsgKytuc19pdCkgewotICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcobnNfaXQtPmZpcnN0LCBuc19pdC0+c2Vjb25kKTsKLSAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotICAgIH0KLSAgICBlbmRfb2JqZWN0KCk7Ci0KLSAgICAvLyBHZW5lcmF0ZSBpbmNsdWRlcwotICAgIHdyaXRlX2tleV9hbmQoImluY2x1ZGVzIik7Ci0gICAgc3RhcnRfYXJyYXkoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gICAgdmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBpbmNfaXQ7Ci0gICAgZm9yIChpbmNfaXQgPSBpbmNsdWRlcy5iZWdpbigpOyBpbmNfaXQgIT0gaW5jbHVkZXMuZW5kKCk7ICsraW5jX2l0KSB7Ci0gICAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgICAgIHdyaXRlX3N0cmluZygoKmluY19pdCktPmdldF9uYW1lKCkpOwotICAgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gICAgfQotICAgIGVuZF9hcnJheSgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgZW51bXMKLSAgd3JpdGVfa2V5X2FuZCgiZW51bXMiKTsKLSAgc3RhcnRfYXJyYXkoKTsKLSAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgewotICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOwotICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotICB9Ci0gIGVuZF9hcnJheSgpOwotCi0gIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gIHdyaXRlX2tleV9hbmQoInR5cGVkZWZzIik7Ci0gIHN0YXJ0X2FycmF5KCk7Ci0gIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKLSAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOwotICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKLSAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKLSAgfQotICBlbmRfYXJyYXkoKTsKLQotICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzLCBleGNlcHRpb25zLCBhbmQgdW5pb25zIGluIGRlY2xhcmVkIG9yZGVyCi0gIHdyaXRlX2tleV9hbmQoInN0cnVjdHMiKTsKLSAgc3RhcnRfYXJyYXkoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOwotICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKLSAgICB9Ci0gICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gIH0KLSAgZW5kX2FycmF5KCk7Ci0KLSAgLy8gR2VuZXJhdGUgY29uc3RhbnRzCi0gIHdyaXRlX2tleV9hbmQoImNvbnN0YW50cyIpOwotICBzdGFydF9hcnJheSgpOwotICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgICBnZW5lcmF0ZV9jb25zdGFudCgqY19pdGVyKTsKLSAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKLSAgfQotICBlbmRfYXJyYXkoKTsKLQotICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcwotICB3cml0ZV9rZXlfYW5kKCJzZXJ2aWNlcyIpOwotICBzdGFydF9hcnJheSgpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7Ci0gICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gIH0KLSAgZW5kX2FycmF5KCk7Ci0KLSAgZW5kX29iamVjdCgpOwotCi0gIC8vIENsb3NlIHRoZSBnZW5lcmF0b3IKLSAgY2xvc2VfZ2VuZXJhdG9yKCk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIHN0YXJ0X29iamVjdCgpOwotICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIGdldF9xdWFsaWZpZWRfbmFtZSh0dHlwZWRlZikpOwotICB3cml0ZV9rZXlfYW5kX3N0cmluZygidHlwZUlkIiwgZ2V0X3R5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3RydWVfdHlwZSgpKSk7Ci0gIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInR5cGUiLCB0dHlwZWRlZi0+Z2V0X3RydWVfdHlwZSgpKTsKLSAgaWYgKHR0eXBlZGVmLT5oYXNfZG9jKCkpIHsKLSAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdHR5cGVkZWYtPmdldF9kb2MoKSk7Ci0gIH0KLSAgZW5kX29iamVjdCgpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX3N0cmluZyhjb25zdCBzdHJpbmcmIHZhbHVlKSB7Ci0gIGZfanNvbl8gPDwgcXVvdCA8PCBlc2NhcGVfanNvbl9zdHJpbmcodmFsdWUpIDw8IHF1b3Q7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgc2hvdWxkX2ZvcmNlX3N0cmluZykgewotCi0gIHN3aXRjaCAodmFsdWUtPmdldF90eXBlKCkpIHsKLQotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKLSAgICBpZiAoc2hvdWxkX2ZvcmNlX3N0cmluZykgewotICAgICAgd3JpdGVfc3RyaW5nKG51bWJlcl90b19zdHJpbmcodmFsdWUtPmdldF9pbnRlZ2VyKCkpKTsKLSAgICB9IGVsc2UgewotICAgICAgd3JpdGVfbnVtYmVyKHZhbHVlLT5nZXRfaW50ZWdlcigpKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6Ci0gICAgaWYgKHNob3VsZF9mb3JjZV9zdHJpbmcpIHsKLSAgICAgIHdyaXRlX3N0cmluZyhudW1iZXJfdG9fc3RyaW5nKHZhbHVlLT5nZXRfZG91YmxlKCkpKTsKLSAgICB9IGVsc2UgewotICAgICAgd3JpdGVfbnVtYmVyKHZhbHVlLT5nZXRfZG91YmxlKCkpOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKLSAgICB3cml0ZV9zdHJpbmcodmFsdWUtPmdldF9zdHJpbmcoKSk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOiB7Ci0gICAgc3RhcnRfYXJyYXkoKTsKLSAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGl0OwotICAgIGZvciAobGl0ID0gbGlzdC5iZWdpbigpOyBsaXQgIT0gbGlzdC5lbmQoKTsgKytsaXQpIHsKLSAgICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOwotICAgICAgZl9qc29uXyA8PCBpbmRlbnQoKTsKLSAgICAgIHdyaXRlX2NvbnN0X3ZhbHVlKCpsaXQpOwotICAgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gICAgfQotICAgIGVuZF9hcnJheSgpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6IHsKLSAgICBzdGFydF9vYmplY3QoTk9fSU5ERU5UKTsKLSAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG1hcCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbWl0OwotICAgIGZvciAobWl0ID0gbWFwLmJlZ2luKCk7IG1pdCAhPSBtYXAuZW5kKCk7ICsrbWl0KSB7Ci0gICAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgICAgIGZfanNvbl8gPDwgaW5kZW50KCk7Ci0gICAgICAvLyBKU09OIG9iamVjdHMgb25seSBhbGxvdyBzdHJpbmcga2V5cwotICAgICAgd3JpdGVfY29uc3RfdmFsdWUobWl0LT5maXJzdCwgRk9SQ0VfU1RSSU5HKTsKLSAgICAgIGZfanNvbl8gPDwgIjogIjsKLSAgICAgIHdyaXRlX2NvbnN0X3ZhbHVlKG1pdC0+c2Vjb25kKTsKLSAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotICAgIH0KLSAgICBlbmRfb2JqZWN0KCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBkZWZhdWx0OgotICAgIGZfanNvbl8gPDwgIm51bGwiOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLXN0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjpqc29uX3N0cihjb25zdCBzdHJpbmcmIHN0cikgewotICByZXR1cm4gcXVvdCArIGVzY2FwZV9qc29uX3N0cmluZyhzdHIpICsgcXVvdDsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdGFudCh0X2NvbnN0KiBjb24pIHsKLSAgc3RhcnRfb2JqZWN0KCk7Ci0KLSAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBjb24tPmdldF9uYW1lKCkpOwotICB3cml0ZV9rZXlfYW5kX3N0cmluZygidHlwZUlkIiwgZ2V0X3R5cGVfbmFtZShjb24tPmdldF90eXBlKCkpKTsKLSAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgidHlwZSIsIGNvbi0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKGNvbi0+aGFzX2RvYygpKSB7Ci0gICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIGNvbi0+Z2V0X2RvYygpKTsKLSAgfQotCi0gIHdyaXRlX2tleV9hbmQoInZhbHVlIik7Ci0gIHdyaXRlX2NvbnN0X3ZhbHVlKGNvbi0+Z2V0X3ZhbHVlKCkpOwotCi0gIGVuZF9vYmplY3QoKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgc3RhcnRfb2JqZWN0KCk7Ci0KLSAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCB0ZW51bS0+Z2V0X25hbWUoKSk7Ci0KLSAgaWYgKHRlbnVtLT5oYXNfZG9jKCkpIHsKLSAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdGVudW0tPmdldF9kb2MoKSk7Ci0gIH0KLQotICB3cml0ZV9rZXlfYW5kKCJtZW1iZXJzIik7Ci0gIHN0YXJ0X2FycmF5KCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiB2YWx1ZXMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIHZhbF9pdGVyOwotICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgewotICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOwotICAgIHRfZW51bV92YWx1ZSogdmFsID0gKCp2YWxfaXRlcik7Ci0gICAgc3RhcnRfb2JqZWN0KCk7Ci0gICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCB2YWwtPmdldF9uYW1lKCkpOwotICAgIHdyaXRlX2tleV9hbmRfaW50ZWdlcigidmFsdWUiLCB2YWwtPmdldF92YWx1ZSgpKTsKLSAgICBpZiAodmFsLT5oYXNfZG9jKCkpIHsKLSAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB2YWwtPmdldF9kb2MoKSk7Ci0gICAgfQotICAgIGVuZF9vYmplY3QoKTsKLSAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKLSAgfQotICBlbmRfYXJyYXkoKTsKLQotICBlbmRfb2JqZWN0KCk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0YXJ0X29iamVjdCgpOwotCi0gIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgdHN0cnVjdC0+Z2V0X25hbWUoKSk7Ci0KLSAgaWYgKHRzdHJ1Y3QtPmhhc19kb2MoKSkgewotICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0c3RydWN0LT5nZXRfZG9jKCkpOwotICB9Ci0KLSAgd3JpdGVfa2V5X2FuZF9ib29sKCJpc0V4Y2VwdGlvbiIsIHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpOwotCi0gIHdyaXRlX2tleV9hbmRfYm9vbCgiaXNVbmlvbiIsIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpOwotCi0gIHdyaXRlX2tleV9hbmQoImZpZWxkcyIpOwotICBzdGFydF9hcnJheSgpOwotICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1faXRlcjsKLSAgZm9yIChtZW1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgewotICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOwotICAgIGdlbmVyYXRlX2ZpZWxkKCptZW1faXRlcik7Ci0gICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gIH0KLSAgZW5kX2FycmF5KCk7Ci0KLSAgZW5kX29iamVjdCgpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdGFydF9vYmplY3QoKTsKLQotICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIGdldF9xdWFsaWZpZWRfbmFtZSh0c2VydmljZSkpOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgewotICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJleHRlbmRzIiwgZ2V0X3F1YWxpZmllZF9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSk7Ci0gIH0KLQotICBpZiAodHNlcnZpY2UtPmhhc19kb2MoKSkgewotICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0c2VydmljZS0+Z2V0X2RvYygpKTsKLSAgfQotCi0gIHdyaXRlX2tleV9hbmQoImZ1bmN0aW9ucyIpOwotICBzdGFydF9hcnJheSgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKLSAgZm9yICg7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyBmbl9pdGVyKyspIHsKLSAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbigqZm5faXRlcik7Ci0gICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gIH0KLSAgZW5kX2FycmF5KCk7Ci0KLSAgZW5kX29iamVjdCgpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jKSB7Ci0gIHN0YXJ0X29iamVjdCgpOwotCi0gIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgdGZ1bmMtPmdldF9uYW1lKCkpOwotCi0gIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJyZXR1cm5UeXBlSWQiLCBnZXRfdHlwZV9uYW1lKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKSk7Ci0gIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInJldHVyblR5cGUiLCB0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7Ci0KLSAgd3JpdGVfa2V5X2FuZF9ib29sKCJvbmV3YXkiLCB0ZnVuYy0+aXNfb25ld2F5KCkpOwotCi0gIGlmICh0ZnVuYy0+aGFzX2RvYygpKSB7Ci0gICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHRmdW5jLT5nZXRfZG9jKCkpOwotICB9Ci0KLSAgd3JpdGVfa2V5X2FuZCgiYXJndW1lbnRzIik7Ci0gIHN0YXJ0X2FycmF5KCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKLSAgZm9yICg7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKLSAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgICBnZW5lcmF0ZV9maWVsZCgqbWVtX2l0ZXIpOwotICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotICB9Ci0gIGVuZF9hcnJheSgpOwotCi0gIHdyaXRlX2tleV9hbmQoImV4Y2VwdGlvbnMiKTsKLSAgc3RhcnRfYXJyYXkoKTsKLSAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gdGZ1bmMtPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKLSAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7Ci0gICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgZ2VuZXJhdGVfZmllbGQoKmV4X2l0ZXIpOwotICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotICB9Ci0gIGVuZF9hcnJheSgpOwotCi0gIGVuZF9vYmplY3QoKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZCh0X2ZpZWxkKiBmaWVsZCkgewotICBzdGFydF9vYmplY3QoKTsKLQotICB3cml0ZV9rZXlfYW5kX2ludGVnZXIoImtleSIsIGZpZWxkLT5nZXRfa2V5KCkpOwotICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInR5cGVJZCIsIGdldF90eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpKTsKLSAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgidHlwZSIsIGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAoZmllbGQtPmhhc19kb2MoKSkgewotICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCBmaWVsZC0+Z2V0X2RvYygpKTsKLSAgfQotCi0gIHdyaXRlX2tleV9hbmQoInJlcXVpcmVkIik7Ci0gIHN3aXRjaCAoZmllbGQtPmdldF9yZXEoKSkgewotICBjYXNlIHRfZmllbGQ6OlRfUkVRVUlSRUQ6Ci0gICAgd3JpdGVfc3RyaW5nKCJyZXF1aXJlZCIpOwotICAgIGJyZWFrOwotICBjYXNlIHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ6Ci0gICAgd3JpdGVfc3RyaW5nKCJyZXFfb3V0Iik7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgd3JpdGVfc3RyaW5nKCJvcHRpb25hbCIpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGZpZWxkLT5nZXRfdmFsdWUoKSkgewotICAgIHdyaXRlX2tleV9hbmQoImRlZmF1bHQiKTsKLSAgICB3cml0ZV9jb25zdF92YWx1ZShmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICB9Ci0KLSAgZW5kX29iamVjdCgpOwotfQotCi1zdHJpbmcgdF9qc29uX2dlbmVyYXRvcjo6Z2V0X3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHR0eXBlID0gdHR5cGUtPmdldF90cnVlX3R5cGUoKTsKLSAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gImxpc3QiOwotICB9Ci0gIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gInNldCI7Ci0gIH0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAibWFwIjsKLSAgfQotICBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaTMyIjsKLSAgfQotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgcmV0dXJuICgodF9zdHJ1Y3QqKXR0eXBlKS0+aXNfdW5pb24oKSA/ICJ1bmlvbiIgOiAic3RydWN0IjsKLSAgfQotICBpZiAodHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gImV4Y2VwdGlvbiI7Ci0gIH0KLSAgLy9pZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgcmV0dXJuICJiaW5hcnkiOwotfQotCi1zdHJpbmcgdF9qc29uX2dlbmVyYXRvcjo6Z2V0X3F1YWxpZmllZF9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgaWYgKHNob3VsZF9tZXJnZV9pbmNsdWRlc18gfHwgdHR5cGUtPmdldF9wcm9ncmFtKCkgPT0gcHJvZ3JhbV8pIHsKLSAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoanNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkpTT04iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIG1lcmdlOiAgICAgICAgICAgR2VuZXJhdGUgb3V0cHV0IHdpdGggaW5jbHVkZWQgZmlsZXMgbWVyZ2VkXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhOGFlMC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnZlY3RvcjsKLXVzaW5nIHN0ZDo6bWFwOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogTFVBIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9sdWFfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfbHVhX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgib21pdF9yZXF1aXJlcyIpOwotICAgIGdlbl9yZXF1aXJlc18gPSAoaXRlciA9PSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1sdWEiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi1wcml2YXRlOgotICAvKioKLSAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIGdlbmVyYXRlIGx1YSByZXF1aXJlIHN0YXRlbWVudHMuCi0gICAqLwotICBib29sIGdlbl9yZXF1aXJlc187Ci0KLSAgLyoqCi0gICAqIFN0cnVjdC1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9sdWFfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBEZXNlcmlhbGl6YXRpb24gKFJlYWQpCi0gICAqLwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIChXcml0ZSkKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0gIHN0ZDo6c3RyaW5nIGx1YV9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZShjb25zdCB0X3Byb2dyYW0qIHByb2dyYW0pOwotCi0gIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIi0tXG4iKSArICItLSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdFxuIiArICItLVxuIgotICAgICAgICAgICArICItLSBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIi0tIEAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVkXG4iCi0gICAgICAgICAgICsgIi0tXG4iOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLX07Ci0KLS8qKgotICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgTUtESVIob3V0ZGlyLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGVzCi0gIHN0cmluZyBjdXJfbmFtZXNwYWNlID0gZ2V0X25hbWVzcGFjZShwcm9ncmFtXyk7Ci0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gb3V0ZGlyICsgY3VyX25hbWVzcGFjZSArICJjb25zdGFudHMubHVhIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpciArIGN1cl9uYW1lc3BhY2UgKyAidHR5cGVzLmx1YSI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIEFkZCBoZWFkZXJzCi0gIGZfY29uc3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBsdWFfaW5jbHVkZXMoKTsKLSAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbHVhX2luY2x1ZGVzKCk7Ci0gIGlmIChnZW5fcmVxdWlyZXNfKSB7Ci0gICAgZl90eXBlc18gPDwgZW5kbCA8PCAicmVxdWlyZSAnIiA8PCBjdXJfbmFtZXNwYWNlIDw8ICJjb25zdGFudHMnIjsKLSAgfQotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgdHlwZWRlZiAoZXNzZW50aWFsbHkgYSBjb25zdGFudCkKLSAqLwotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBmX3R5cGVzXyA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICIgPSAiCi0gICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUgKHRhYmxlKQotICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGZfdHlwZXNfIDw8IGVuZGwgPDwgZW5kbCA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7KSB7Ci0gICAgaW50MzJfdCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0KLSAgICBmX3R5cGVzXyA8PCAiICAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZTsKLSAgICArK2NfaXRlcjsKLSAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKSkgewotICAgICAgZl90eXBlc18gPDwgIiwiOwotICAgIH0KLSAgICBmX3R5cGVzXyA8PCBlbmRsOwotICB9Ci0gIGZfdHlwZXNfIDw8ICJ9IjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IChub24tbG9jYWwpIHZhbHVlCi0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGZfY29uc3RzXyA8PCBlbmRsIDw8IGVuZGwgPDwgbmFtZSA8PCAiID0gIjsKLSAgZl9jb25zdHNfIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X2x1YV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgIiciIDw8IHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIiciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8ICJsdWFsb25nbnVtYmVyLm5ldygnIiA8PCB2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICInKSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPSAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICArK3ZfaXRlcjsKLSAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7Ci0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8ICJ9IjsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KQotICAgICAgICAgICAgICAgICAgPDwgIl0gPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgKyt2X2l0ZXI7Ci0gICAgICBpZiAodl9pdGVyICE9IHZhbC5lbmQoKSkgewotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgfQotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBvdXQgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8ICJbIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpIDw8ICJdIjsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBvdXQgPDwgIiA9IHRydWUiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIgPSBmYWxzZSI7Ci0gICAgICB9Ci0gICAgICArK3ZfaXRlcjsKLSAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7Ci0gICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICJ9IjsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgdGhyaWZ0IHN0cnVjdAotICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgdGhyaWZ0IGV4Y2VwdGlvbgotICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSB0aHJpZnQgc3RydWN0IG9yIGV4Y2VwdGlvbiAobHVhIHRhYmxlKQotICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICIgPSBURXhjZXB0aW9uOm5ld3siIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgX190eXBlID0gJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJyI7Ci0gICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgICAgb3V0IDw8ICIsIjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICIgPSBfX1RPYmplY3Q6bmV3eyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgewotICAgIGluZGVudChvdXQpOwotICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgKyttX2l0ZXI7Ci0gICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmVuZCgpKSB7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpOwotICBvdXQgPDwgZW5kbCA8PCAifSI7Ci0KLSAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfbHVhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIHN0cnVjdC9leGNlcHRpb24gcmVhZGVyCi0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9sdWFfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gZnVuY3Rpb24KLSAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCBlbmRsIDw8ICJmdW5jdGlvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjpyZWFkKGlwcm90KSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRTdHJ1Y3RCZWdpbigpIiA8PCBlbmRsOwotCi0gIC8vIHdoaWxlOiBSZWFkIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgdHJ1ZSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gaWY6IENoZWNrIHdoYXQgdG8gcmVhZAotICBpbmRlbnQob3V0KSA8PCAibG9jYWwgZm5hbWUsIGZ0eXBlLCBmaWQgPSBpcHJvdDpyZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaWYgZnR5cGUgPT0gVFR5cGUuU1RPUCB0aGVuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrIiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZWxzZWlmIGZpZCA9PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIgdGhlbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRoZW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBSZWFkIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCBmYWxzZSwgInNlbGYuIik7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGlwcm90OnNraXAoZnR5cGUpIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBlbmQgaWYKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGlwcm90OnNraXAoZnR5cGUpIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7Ci0KLSAgLy8gZW5kIHdoaWxlCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7Ci0KLSAgLy8gZW5kIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpOwotICBvdXQgPDwgImVuZCI7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBzdHJ1Y3QvZXhjZXB0aW9uIHdyaXRlcgotICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbHVhX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIGZ1bmN0aW9uCi0gIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6d3JpdGUob3Byb3QpIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInKSIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgc2VsZi4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHRoZW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpIgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRFbmQoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZVN0cnVjdEVuZCgpIiA8PCBlbmRsOwotCi0gIC8vIGVuZCBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KTsKLSAgb3V0IDw8ICJlbmQiOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgdGhyaWZ0IHNlcnZpY2UKLSAqLwotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZXQgb3V0cHV0IGRpcmVjdG9yeQotICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKLQotICAvLyBPcGVuIHRoZSBmaWxlIGZvciB3cml0aW5nCi0gIHN0cmluZyBjdXJfbnMgPSBnZXRfbmFtZXNwYWNlKHByb2dyYW1fKTsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gb3V0ZGlyICsgY3VyX25zICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiLmx1YSI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICAvLyBIZWFkZXJzCi0gIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbHVhX2luY2x1ZGVzKCk7Ci0gIGlmIChnZW5fcmVxdWlyZXNfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8ICJyZXF1aXJlICciIDw8IGN1cl9ucyA8PCAidHR5cGVzJyIgPDwgZW5kbDsKLQotICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJyZXF1aXJlICciIDw8IGdldF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCi0gICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICInIiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHRoZSBmaWxlCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKG9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIklmYWNlIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLQotICAvLyBJbnRlcmZhY2Ugb2JqZWN0IGRlZmluaXRpb24KLSAgb3V0IDw8IGNsYXNzbmFtZSA8PCAiID0gIjsKLSAgaWYgKGV4dGVuZHNfcykgewotICAgIG91dCA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIklmYWNlOm5ld3siIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJfX1RPYmplY3Q6bmV3eyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgIiAgX190eXBlID0gJyIgPDwgY2xhc3NuYW1lIDw8ICInIiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBjbGFzc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJDbGllbnQiOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotCi0gIC8vIENsaWVudCBvYmplY3QgZGVmaW5pdGlvbgotICBvdXQgPDwgY2xhc3NuYW1lIDw8ICIgPSBfX1RPYmplY3QubmV3KCI7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIG91dCA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIkNsaWVudCI7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJfX1RDbGllbnQiOwotICB9Ci0gIG91dCA8PCAiLCB7IiA8PCBlbmRsIDw8ICIgIF9fdHlwZSA9ICciIDw8IGNsYXNzbmFtZSA8PCAiJyIgPDwgZW5kbCA8PCAifSkiIDw8IGVuZGw7Ci0KLSAgLy8gU2VuZC9SZWN2IGZ1bmN0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgc2lnID0gZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOwotICAgIHN0cmluZyBmdW5jbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIFdyYXBwZXIgZnVuY3Rpb24KLSAgICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8ICJmdW5jdGlvbiAiIDw8IGNsYXNzbmFtZSA8PCAiOiIgPDwgc2lnIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAic2VsZjpzZW5kXyIgPDwgc2lnIDw8IGVuZGwgPDwgaW5kZW50KCk7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIG91dCA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgInNlbGY6cmVjdl8iIDw8IHNpZyA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLQotICAgIC8vIFNlbmQgZnVuY3Rpb24KLSAgICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8ICJmdW5jdGlvbiAiIDw8IGNsYXNzbmFtZSA8PCAiOnNlbmRfIiA8PCBzaWcgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJzZWxmLm9wcm90OndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IGZ1bmNuYW1lIDw8ICInLCAiCi0gICAgICAgICAgICAgICAgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlLkNBTEwiKQotICAgICAgICAgICAgICAgIDw8ICIsIHNlbGYuX3NlcWlkKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgYXJncyA9ICIgPDwgZnVuY25hbWUgPDwgIl9hcmdzOm5ld3t9IiA8PCBlbmRsOwotCi0gICAgLy8gU2V0IHRoZSBhcmdzCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBmb3IgKGZsZF9pdGVyID0gYXJncy5iZWdpbigpOyBmbGRfaXRlciAhPSBhcmdzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBzdGQ6OnN0cmluZyBhcmduYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiYXJncy4iIDw8IGFyZ25hbWUgPDwgIiA9ICIgPDwgYXJnbmFtZSA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJhcmdzOndyaXRlKHNlbGYub3Byb3QpIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJzZWxmLm9wcm90OndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJzZWxmLm9wcm90LnRyYW5zOmZsdXNoKCkiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0KLSAgICAvLyBSZWN2IGZ1bmN0aW9uCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8ICJmdW5jdGlvbiAiIDw8IGNsYXNzbmFtZSA8PCAiOnJlY3ZfIiA8PCBzaWcgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxvY2FsIGZuYW1lLCBtdHlwZSwgcnNlcWlkID0gc2VsZi5pcHJvdDoiCi0gICAgICAgICAgPDwgInJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgbXR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiB0aGVuIgotICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgbG9jYWwgeCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjpuZXd7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICIgIHg6cmVhZChzZWxmLmlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBzZWxmLmlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBlcnJvcih4KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgImxvY2FsIHJlc3VsdCA9ICIgPDwgZnVuY25hbWUgPDwgIl9yZXN1bHQ6bmV3e30iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAicmVzdWx0OnJlYWQoc2VsZi5pcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInNlbGYuaXByb3Q6cmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLQotICAgICAgLy8gUmV0dXJuIHRoZSByZXN1bHQgaWYgaXQncyBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgcmVzdWx0LnN1Y2Nlc3MgdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3MiCi0gICAgICAgICAgICA8PCBlbmRsOwotCi0gICAgICAgIC8vIFRocm93IGN1c3RvbSBleGNlcHRpb25zCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGYgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgICBmb3IgKHhfaXRlciA9IHhmLmJlZ2luKCk7IHhfaXRlciAhPSB4Zi5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2VpZiByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiB0aGVuIiA8PCBlbmRsCi0gICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGVycm9yKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAiZXJyb3IoVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3tlcnJvckNvZGUgPSAiCi0gICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxUfSkiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3Iob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgY2xhc3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiUHJvY2Vzc29yIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLQotICAvLyBEZWZpbmUgcHJvY2Vzc29yIHRhYmxlCi0gIG91dCA8PCBlbmRsIDw8IGNsYXNzbmFtZSA8PCAiID0gX19UT2JqZWN0Lm5ldygiOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBvdXQgPDwgZXh0ZW5kc19zIDw8ICJQcm9jZXNzb3IiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJfX1RQcm9jZXNzb3IiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8ICIsIHsiIDw8IGVuZGwgPDwgIiBfX3R5cGUgPSAnIiA8PCBjbGFzc25hbWUgPDwgIiciIDw8IGVuZGwgPDwgIn0pIiA8PCBlbmRsOwotCi0gIC8vIFByb2Nlc3MgZnVuY3Rpb24KLSAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpwcm9jZXNzKGlwcm90LCBvcHJvdCwgc2VydmVyX2N0eCkiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJsb2NhbCBuYW1lLCBtdHlwZSwgc2VxaWQgPSBpcHJvdDpyZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJsb2NhbCBmdW5jX25hbWUgPSAncHJvY2Vzc18nIC4uIG5hbWUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpZiBub3Qgc2VsZltmdW5jX25hbWVdIG9yIHR0eXBlKHNlbGZbZnVuY19uYW1lXSkgfj0gJ2Z1bmN0aW9uJyB0aGVuIjsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdDpza2lwKFRUeXBlLlNUUlVDVCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJpcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3siIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICIgIGVycm9yQ29kZSA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKLSAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90OndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sICIKLSAgICAgIDw8ICJzZXFpZCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIng6d3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAib3Byb3Q6d3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zOmZsdXNoKCkiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbHNlIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgIDw8ICIgIHNlbGZbZnVuY19uYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90LCBzZXJ2ZXJfY3R4KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7Ci0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotICBzdHJpbmcgZm5fbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKLQotICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8ICJmdW5jdGlvbiAiIDw8IGNsYXNzbmFtZSA8PCAiOnByb2Nlc3NfIiA8PCBmbl9uYW1lCi0gICAgICAgICAgICAgIDw8ICIoc2VxaWQsIGlwcm90LCBvcHJvdCwgc2VydmVyX2N0eCkiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIFJlYWQgdGhlIHJlcXVlc3QKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJsb2NhbCBhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiOm5ld3t9IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAibG9jYWwgcmVwbHlfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJnczpyZWFkKGlwcm90KSIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImxvY2FsIHJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZQotICAgICAgPDwgIjpuZXd7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibG9jYWwgc3RhdHVzLCByZXMgPSBwY2FsbChzZWxmLmhhbmRsZXIuIiA8PCBmbl9uYW1lCi0gICAgICA8PCAiLCBzZWxmLmhhbmRsZXIiOwotCi0gIC8vIFByaW50IGFyZ3VtZW50cwotICB0X3N0cnVjdCogYXJncyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgaWYgKGFyZ3MtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCAiLCAiIDw8IGFyZ3VtZW50X2xpc3QoYXJncywgImFyZ3MuIik7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgZXJyb3JzCi0gIG91dCA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgbm90IHN0YXR1cyB0aGVuIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICByZXBseV90eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gcmVzfSIgPDwgZW5kbDsKLQotICAvLyBIYW5kbGUgY3VzdG9tIGV4Y2VwdGlvbnMKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4ZiA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICBpZiAoeGYuc2l6ZSgpID4gMCkgewotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhmLmJlZ2luKCk7IHhfaXRlciAhPSB4Zi5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZWlmIHR0eXBlKHJlcykgPT0gJyIgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICInIHRoZW4iCi0gICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHJlcyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBTZXQgdGhlIHJlc3VsdCBhbmQgd3JpdGUgdGhlIHJlcGx5Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQuc3VjY2VzcyA9IHJlcyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgImVuZCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Q6d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgZm5fbmFtZSA8PCAiJywgcmVwbHlfdHlwZSwgIgotICAgICAgPDwgInNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0OndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIm9wcm90OndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci19Ci0KLS8vIFNlcnZpY2UgaGVscGVycwotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCBlbmRsIDw8ICItLSBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG91dCwgKmZfaXRlcik7Ci0gIH0KLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgIH0KLQotICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgICB9Ci0gICAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgJnJlc3VsdCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemUgKFJlYWQpCi0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBsb2NhbCwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBsb2NhbCwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgbmFtZSA8PCAiID0gaXByb3Q6IjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoKSI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjpuZXd7fSIKLSAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIjpyZWFkKGlwcm90KSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGluZGVudChvdXQpIDw8IChsb2NhbCA/ICJsb2NhbCAiIDogIiIpIDw8IHByZWZpeCA8PCAiID0ge30iIDw8IGVuZGw7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiID0gaXByb3Q6cmVhZE1hcEJlZ2luKCkgIgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImxvY2FsICIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgPSBpcHJvdDpyZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImxvY2FsICIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgPSBpcHJvdDpyZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBEZXNlcmlhbGl6ZQotICBpbmRlbnQob3V0KSA8PCAiZm9yIF9pPTEsIiA8PCBzaXplIDw8ICIgZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZE1hcEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkU2V0RW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkTGlzdEVuZCgpIiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgewotICAvLyBBIG1hcCBpcyByZXByZXNlbnRlZCBieSBhIHRhYmxlIGluZGV4YWJsZSBieSBhbnkgbHVhIHR5cGUKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksIHRydWUpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCB0cnVlKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewotICAvLyBBIHNldCBpcyByZXByZXNlbnRlZCBieSBhIHRhYmxlIGluZGV4ZWQgYnkgdGhlIHZhbHVlCi0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUpOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwgZWxlbSA8PCAiXSA9ICIgPDwgZWxlbSA8PCBlbmRsOwotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgLy8gQSBsaXN0IGlzIHJlcHJlc2VudGVkIGJ5IGEgdGFibGUgaW5kZXhlZCBieSBpbnRlZ2VyIHZhbHVlcwotICAvLyBMVUEgbmF0aXZlbHkgcHJvdmlkZXMgYWxsIG9mIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gYSBsaXN0Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlKTsKLQotICBpbmRlbnQob3V0KSA8PCAidGFibGUuaW5zZXJ0KCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemUgKFdyaXRlKQotICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDoiOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBuYW1lLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICI6d3JpdGUob3Byb3QpIiA8PCBlbmRsOwotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIC8vIEJlZ2luIHdyaXRpbmcKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgIDw8ICJ0dGFibGVfc2l6ZSgiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCAidHRhYmxlX3NpemUoIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCAiIyIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2VyaWFsaXplCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBraXRlciA8PCAiLCIgPDwgdml0ZXIgPDwgIiBpbiBwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIsXyBpbiBwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciBfLCIgPDwgaXRlciA8PCAiIGluIGlwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEZpbmlzaCB3cml0aW5nCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTGlzdEVuZCgpIiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiAgSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAqLwotc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6bHVhX2luY2x1ZGVzKCkgewotICBpZiAoZ2VuX3JlcXVpcmVzXykgewotICAgIHJldHVybiAiXG5cbnJlcXVpcmUgJ1RocmlmdCciOwotICB9IGVsc2UgewotICAgIHJldHVybiAiIjsKLSAgfQotfQotCi1zdHJpbmcgdF9sdWFfZ2VuZXJhdG9yOjpnZXRfbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotICBzdGQ6OnN0cmluZyByZWFsX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImx1YSIpOwotICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgewotICAgIHJldHVybiBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIl8iOwotICB9Ci0gIHJldHVybiByZWFsX21vZHVsZSArICJfIjsKLX0KLQotc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotICAodm9pZClwcmVmaXg7Ci0gIHN0ZDo6c3RyaW5nIHJldCA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgc3RkOjpzdHJpbmcgcmV0ID0gIiI7Ci0gIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgewotICAgIHJldCArPSBwcmVmaXggKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICArK2ZsZF9pdGVyOwotICAgIGlmIChmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKLSAgICAgIHJldCArPSAiLCAiOwotICAgIH0KLSAgfQotICByZXR1cm4gcmV0OwotfQotCi1zdHJpbmcgdF9sdWFfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihsdWEsICJMdWEiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWJjMTJkLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgc3RkOjppb3M7Ci11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBPQ2FtbCBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfb2NhbWxfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfb2NhbWxfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW9jYW1sIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgYm9vbCBzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodF9maWVsZCogdG1lbWJlcik7Ci0gIGJvb2wgc3RydWN0X21lbWJlcl9vbWl0YWJsZSh0X2ZpZWxkKiB0bWVtYmVyKTsKLSAgYm9vbCBzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRfZmllbGQqIHRtZW1iZXIpOwotICBzdGQ6OnN0cmluZyBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YodF90eXBlKiB0eXBlLCBzdHJpbmcgd2hhdCk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfbWVtYmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIHRuYW1lLCB0X2ZpZWxkKiB0bWVtYmVyKTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KHN0ZDo6b2ZzdHJlYW0mIG91dCwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBtZW1iZXIpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBuYW1lID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIG9jYW1sX2F1dG9nZW5fY29tbWVudCgpOwotICBzdGQ6OnN0cmluZyBvY2FtbF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIG1ldGhvZCA9IGZhbHNlLCBib29sIG9wdGlvbnMgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9vY2FtbF90eXBlKHRfdHlwZSogdHlwZSk7Ci0KLXByaXZhdGU6Ci0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfaV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlX2lfOwotfTsKLQotLyoKLSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2Ugd2FudCB0eXBlZGVmcyB0byBhcHBlYXIgbGF0ZXIsCi0gKiBhZnRlciBhbGwgdGhlIHR5cGVzIGhhdmUgYmVlbiBkZWNsYXJlZC4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKLSAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2VuZXJhdG9yCi0gIGluaXRfZ2VuZXJhdG9yKCk7Ci0KLSAgLy8gR2VuZXJhdGUgZW51bXMKLSAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgewotICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgc3RydWN0cwotICB2ZWN0b3I8dF9zdHJ1Y3QqPiBzdHJ1Y3RzID0gcHJvZ3JhbV8tPmdldF9zdHJ1Y3RzKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBzdF9pdGVyOwotICBmb3IgKHN0X2l0ZXIgPSBzdHJ1Y3RzLmJlZ2luKCk7IHN0X2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzdF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfc3RydWN0KCpzdF9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHhjZXB0aW9ucwotICB2ZWN0b3I8dF9zdHJ1Y3QqPiB4Y2VwdGlvbnMgPSBwcm9ncmFtXy0+Z2V0X3hjZXB0aW9ucygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIGdlbmVyYXRlX3hjZXB0aW9uKCp4X2l0ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdHlwZWRlZnMKLSAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOwotICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7Ci0gIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgewotICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgc2VydmljZXMKLSAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0gIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgIHNlcnZpY2VfbmFtZV8gPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNvbnN0YW50cwotICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7Ci0gIGdlbmVyYXRlX2NvbnN0cyhjb25zdHMpOwotCi0gIC8vIENsb3NlIHRoZSBnZW5lcmF0b3IKLSAgY2xvc2VfZ2VuZXJhdG9yKCk7Ci19Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMubWwiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIGZfdHlwZXNfaV9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLm1saSI7Ci0gIGZfdHlwZXNfaV8ub3BlbihmX3R5cGVzX2lfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl9jb25zdHMubWwiOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PCBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX3R5cGVzX2lfIDw8IG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7Ci0gIGZfY29uc3RzXyA8PCBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsIDw8ICJvcGVuICIKLSAgICAgICAgICAgIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6Om9jYW1sX2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIoKlxuIikgKyAiIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIiArICJcbiIKLSAgICAgICAgICsgIiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICIqKVxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpvY2FtbF9pbXBvcnRzKCkgewotICByZXR1cm4gIm9wZW4gVGhyaWZ0IjsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gRXouCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgZGVjYXBpdGFsaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSkgPDwgIiA9ICIKLSAgICAgICAgICAgPDwgcmVuZGVyX29jYW1sX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl90eXBlc19pXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IGRlY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiCi0gICAgICAgICAgICAgPDwgcmVuZGVyX29jYW1sX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLgotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBpbmRlbnQoZl90eXBlc18pIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiID0gIiA8PCBlbmRsIDw8ICJzdHJ1Y3QiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiIDogIiA8PCBlbmRsIDw8ICJzaWciCi0gICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAidHlwZSB0ID0gIiA8PCBlbmRsOwotICBpbmRlbnQoZl90eXBlc19pXykgPDwgInR5cGUgdCA9ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8ICIgPDwgbmFtZSA8PCBlbmRsOwotICAgIGluZGVudChmX3R5cGVzX2lfKSA8PCAifCAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX3R5cGVzXykgPDwgImxldCB0b19pID0gZnVuY3Rpb24iIDw8IGVuZGw7Ci0gIGluZGVudChmX3R5cGVzX2lfKSA8PCAidmFsIHRvX2kgOiB0IC0+IEludDMyLnQiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IG5hbWUgPDwgIiAtPiAiIDw8IHZhbHVlIDw8ICJsIiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAibGV0IG9mX2kgPSBmdW5jdGlvbiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ2YWwgb2ZfaSA6IEludDMyLnQgLT4gdCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8ICIgPDwgdmFsdWUgPDwgImwgLT4gIiA8PCBuYW1lIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCBfIC0+IHJhaXNlIFRocmlmdF9lcnJvciIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZW5kIiA8PCBlbmRsOwotICBpbmRlbnQoZl90eXBlc19pXykgPDwgImVuZCIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBpbmRlbnQoZl9jb25zdHNfKSA8PCAibGV0ICIgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAvLyBPQ2FtbCByZXF1aXJlcyBhbGwgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBjb250YWluIGEgZGVjaW1hbCBwb2ludAotICBvdXQuc2V0Zihpb3M6OnNob3dwb2ludCk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJsIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIuMCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR5cGU7Ci0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGludCB2YWwgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgICAgaWYgKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiLiIgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHN0cmluZyBjbmFtZSA9IHR5cGVfbmFtZSh0eXBlKTsKLSAgICBzdHJpbmcgY3QgPSB0bXAoIl9jIik7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBjdCA8PCAiID0gbmV3ICIgPDwgY25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIGZuYW1lID0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IGN0IDw8ICIjc2V0XyIgPDwgZm5hbWUgPDwgIiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8IGN0IDw8ICIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBzdHJpbmcgaG0gPSB0bXAoIl9obSIpOwotICAgIG91dCA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICIgPDwgaG0gPDwgIiA9IEhhc2h0YmwuY3JlYXRlICIgPDwgdmFsLnNpemUoKSA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGhtIDw8ICIgIiA8PCBrZXkgPDwgIiAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgaG0gPDwgIikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgb3V0IDw8ICJbIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIl0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIHN0cmluZyBobSA9IHRtcCgiX2htIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBobSA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCB2YWwuc2l6ZSgpIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgaG0gPDwgIiAiIDw8IHZhbCA8PCAiIHRydWU7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCBobSA8PCAiKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgInN0cnVjdCIKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCwgYnV0IGFsc28gaGFzIGFuIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiBPQ2FtbCBzdHJ1Y3QKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhmX3R5cGVzX2lfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotfQotCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShvZnN0cmVhbSYgb3V0LCBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzKSB7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICAvKiBDcmVhdGUgYSBjb3B5IG9mIHRoZSBjdXJyZW50IG9iamVjdCAqLwotICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGNvcHkgPSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAibGV0IF9uZXcgPSBPby5jb3B5IHNlbGYgaW4iIDw8IGVuZGw7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCi0gICAgZ2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkob3V0LCAqbV9pdGVyKTsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiX25ldyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YodF90eXBlKiB0eXBlLCBzdHJpbmcgd2hhdCkgewotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB3aGF0ICsgc3RyaW5nKCIjY29weSIpOwotICB9Ci0gIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBjb3B5X29mX2sgPSBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YoKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpLCAiayIpOwotICAgIHN0cmluZyBjb3B5X29mX3YgPSBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YoKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpLCAidiIpOwotCi0gICAgaWYgKGNvcHlfb2ZfayA9PSAiayIgJiYgY29weV9vZl92ID09ICJ2IikgewotICAgICAgcmV0dXJuIHN0cmluZygiKEhhc2h0YmwuY29weSAiKSArIHdoYXQgKyBzdHJpbmcoIikiKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHN0cmluZygKLSAgICAgICAgICAgICAgICAgIigoZnVuIG9oIC0+IGxldCBuaCA9IEhhc2h0YmwuY3JlYXRlIChIYXNodGJsLmxlbmd0aCBvaCkgaW4gSGFzaHRibC5pdGVyIChmdW4gayB2ICIKLSAgICAgICAgICAgICAgICAgIi0+IEhhc2h0YmwuYWRkIG5oICIpICsgY29weV9vZl9rICsgc3RyaW5nKCIgIikgKyBjb3B5X29mX3YgKyBzdHJpbmcoIikgb2g7IG5oKSAiKQotICAgICAgICAgICAgICsgd2hhdCArICIpIjsKLSAgICB9Ci0gIH0KLSAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGNvcHlfb2YgPSBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YoKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgImsiKTsKLQotICAgIGlmIChjb3B5X29mID09ICJrIikgewotICAgICAgcmV0dXJuIHN0cmluZygiKEhhc2h0YmwuY29weSAiKSArIHdoYXQgKyBzdHJpbmcoIikiKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHN0cmluZygKLSAgICAgICAgICAgICAgICAgIigoZnVuIG9oIC0+IGxldCBuaCA9IEhhc2h0YmwuY3JlYXRlIChIYXNodGJsLmxlbmd0aCBvaCkgaW4gSGFzaHRibC5pdGVyIChmdW4gayB2ICIKLSAgICAgICAgICAgICAgICAgIi0+IEhhc2h0YmwuYWRkIG5oICIpICsgY29weV9vZiArIHN0cmluZygiIHRydWUiKSArIHN0cmluZygiKSBvaDsgbmgpICIpICsgd2hhdAotICAgICAgICAgICAgICsgIikiOwotICAgIH0KLSAgfQotICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGNvcHlfb2YgPSBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YoKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICJ4Iik7Ci0gICAgaWYgKGNvcHlfb2YgIT0gIngiKSB7Ci0gICAgICByZXR1cm4gc3RyaW5nKCIoTGlzdC5tYXAgKGZ1biB4IC0+ICIpICsgY29weV9vZiArIHN0cmluZygiKSAiKSArIHdoYXQgKyBzdHJpbmcoIikiKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHdoYXQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiB3aGF0OwotfQotCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0bWVtYmVyKSB7Ci0gIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKLQotICBzdHJpbmcgZ3JhYl9maWVsZCA9IHN0cmluZygic2VsZiNncmFiXyIpICsgbW5hbWU7Ci0gIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKHR5cGUsIGdyYWJfZmllbGQpOwotICBpZiAoY29weV9vZiAhPSBncmFiX2ZpZWxkKSB7Ci0gICAgaW5kZW50KG91dCk7Ci0gICAgaWYgKCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKLSAgICAgIG91dCA8PCAiaWYgXyIgPDwgbW5hbWUgPDwgIiA8PiBOb25lIHRoZW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICAiOwotICAgIH0KLSAgICBvdXQgPDwgIl9uZXcjc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IGNvcHlfb2YgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRuYW1lIDw8ICIgPSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob3V0LCB0bmFtZSwgKCptX2l0ZXIpKTsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgfQotICBnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShvdXQsIG1lbWJlcnMpOwotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGluZGVudChvdXQpIDw8ICJleGNlcHRpb24gIiA8PCBjYXBpdGFsaXplKHRuYW1lKSA8PCAiIG9mICIgPDwgdG5hbWUgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3R1cmUgbWVtYmVyIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRuYW1lIE5hbWUgb2YgdGhlIHBhcmVudCBzdHJ1Y3R1cmUgZm9yIHRoZSBtZW1iZXIKLSAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0bWVtYmVyKSB7Ci0gIHN0cmluZyB4ID0gdG1wKCJfeCIpOwotICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInZhbCBtdXRhYmxlIF8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHJlbmRlcl9vY2FtbF90eXBlKHRtZW1iZXItPmdldF90eXBlKCkpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKLSAgaWYgKHZhbCkgewotICAgIGlmIChzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpCi0gICAgICBvdXQgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgIG91dCA8PCAiIG9wdGlvbiA9IFNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCi0gICAgICAgICAgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICAvLyBhc3NlcnQoIXN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkKLSAgICBvdXQgPDwgIiBvcHRpb24gPSBOb25lIiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkgewotICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA9IFNvbWUgXyIgPDwgbW5hbWUgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdyYWJfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHNldF8iIDw8IG1uYW1lIDw8ICIgIiA8PCB4IDw8ICIgPSBfIiA8PCBtbmFtZSA8PCAiIDwtICIgPDwgeCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA9IG1hdGNoIF8iIDw8IG1uYW1lCi0gICAgICAgICAgICAgICAgPDwgIiB3aXRoIE5vbmUtPnJhaXNlIChGaWVsZF9lbXB0eSBcIiIgPDwgdG5hbWUgPDwgIi4iIDw8IG1uYW1lIDw8ICJcIikgfCBTb21lICIKLSAgICAgICAgICAgICAgICA8PCB4IDw8ICIgLT4gIiA8PCB4IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiICIgPDwgeCA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSBTb21lICIgPDwgeAotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB1bnNldF8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCAiIDwtIE5vbmUiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHJlc2V0XyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gIjsKLSAgaWYgKHZhbCkgewotICAgIGlmIChzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpCi0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgIG91dCA8PCAiU29tZSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgIk5vbmUiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBDaGVjayB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgY2FuIG5vdCBoYXZlIHVuZGVmaW5lZCB2YWx1ZQotICoKLSAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCi0gKi8KLWJvb2wgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0X2ZpZWxkKiB0bWVtYmVyKSB7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbCA9IHRtZW1iZXItPmdldF92YWx1ZSgpOwotICByZXR1cm4gKHZhbCA/IHRydWUgOiBmYWxzZSk7Ci19Ci0KLS8qKgotICogQ2hlY2sgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGNhbiBiZSBza2lwcGVkIGR1cmluZyBlbmNvZGluZwotICoKLSAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCi0gKi8KLWJvb2wgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfb21pdGFibGUodF9maWVsZCogdG1lbWJlcikgewotICByZXR1cm4gKHRtZW1iZXItPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKLX0KLQotLyoqCi0gKiBGaWd1cmUgb3V0IHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBoYXMKLSAqIGEgY2hlYXBseSBjb21wYXJhYmxlIGRlZmF1bHQgdmFsdWUuCi0gKgotICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KLSAqLwotYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0X2ZpZWxkKiB0bWVtYmVyKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodG1lbWJlci0+Z2V0X3R5cGUoKSk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbCA9IHRtZW1iZXItPmdldF92YWx1ZSgpOwotICBpZiAoIXZhbCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIC8vIEJhc2UgdHlwZXMgYXJlIGdlbmVyYWxseSBjaGVhcGx5IGNvbXBhcmVkIGZvciBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlLgotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWwtPmdldF9kb3VibGUoKSA9PSAwLjApCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAvLyBFbXB0eSBsaXN0cyBhcmUgY2hlYXBseSBjb21wYXJlZCBmb3Igc3RydWN0dXJhbCBlcXVpdmFsZW5jZS4KLSAgICAvLyBJcyBlbXB0eSBsaXN0PwotICAgIGlmICh2YWwtPmdldF9saXN0KCkuc2l6ZSgpID09IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0bmFtZSA8PCAiIDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvYmplY3QgKCdhKSIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgeCA9IHRtcCgiX3giKTsKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgICAgc3RyaW5nIHR5cGUgPSByZW5kZXJfb2NhbWxfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCB0eXBlIDw8ICIgb3B0aW9uIiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCB0eXBlIDw8ICIgLT4gdW5pdCIgPDwgZW5kbDsKLSAgICAgIGlmICghc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KCptX2l0ZXIpKQotICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHJlc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudChvdXQpIDw8ICJtZXRob2QgY29weSA6ICdhIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHdyaXRlIDogUHJvdG9jb2wudCAtPiB1bml0IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiZXhjZXB0aW9uICIgPDwgY2FwaXRhbGl6ZSh0bmFtZSkgPDwgIiBvZiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAidmFsIHJlYWRfIiA8PCB0bmFtZSA8PCAiIDogUHJvdG9jb2wudCAtPiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIHN0cmluZyBzbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOwotICBzdHJpbmcgdCA9IHRtcCgiX3QiKTsKLSAgc3RyaW5nIGlkID0gdG1wKCJfaWQiKTsKLSAgaW5kZW50KG91dCkgPDwgImxldCByZWMgcmVhZF8iIDw8IHNuYW1lIDw8ICIgKGlwcm90IDogUHJvdG9jb2wudCkgPSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJsZXQgIiA8PCBzdHIgPDwgIiA9IG5ldyAiIDw8IHNuYW1lIDw8ICIgaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaWdub3JlKGlwcm90I3JlYWRTdHJ1Y3RCZWdpbik7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAiKHRyeSB3aGlsZSB0cnVlIGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8ICJsZXQgKF8sIiA8PCB0IDw8ICIsIiA8PCBpZCA8PCAiKSA9IGlwcm90I3JlYWRGaWVsZEJlZ2luIGluIiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwgImlmICIgPDwgdCA8PCAiID0gUHJvdG9jb2wuVF9TVE9QIHRoZW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicmFpc2UgQnJlYWsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbHNlICgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiKG1hdGNoICIgPDwgaWQgPDwgIiB3aXRoICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJ8ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiAtPiAoIjsKLSAgICBvdXQgPDwgImlmICIgPDwgdCA8PCAiID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRoZW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCBzdHIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlwcm90I3NraXAgIiA8PCB0IDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAifCBfIC0+ICIKLSAgICAgIDw8ICJpcHJvdCNza2lwICIgPDwgdCA8PCAiKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAiaXByb3QjcmVhZEZpZWxkRW5kOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgImRvbmU7ICgpIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAid2l0aCBCcmVhayAtPiAoKSk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkU3RydWN0RW5kOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCBzdHIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOwotICBzdHJpbmcgZiA9IHRtcCgiX2YiKTsKLQotICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHdyaXRlIChvcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVTdHJ1Y3RCZWdpbiBcIiIgPDwgbmFtZSA8PCAiXCI7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogdG1lbWJlciA9ICgqZl9pdGVyKTsKLSAgICBzdHJpbmcgbW5hbWUgPSAiXyIgKyBkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIF92OwotCi0gICAgaWYgKHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkgewotCi0gICAgICBpZiAoc3RydWN0X21lbWJlcl9vbWl0YWJsZSh0bWVtYmVyKSAmJiBzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRtZW1iZXIpKSB7Ci0gICAgICAgIF92ID0gIl92IjsKLSAgICAgICAgLy8gQXZvaWQgcmVkdW5kYW50IGVuY29kaW5nIG9mIG1lbWJlcnMgaGF2aW5nIGRlZmF1bHQgdmFsdWVzLgotICAgICAgICBpbmRlbnQob3V0KSA8PCAiKG1hdGNoICIgPDwgbW5hbWUgPDwgIiB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKSA8PCAiIC0+ICgpIHwgIgotICAgICAgICAgICAgICAgICAgICA8PCBfdiA8PCAiIC0+ICIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIF92ID0gbW5hbWU7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIoIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgfSBlbHNlIHsKLQotICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiOwotCi0gICAgICBpZiAoc3RydWN0X21lbWJlcl9vbWl0YWJsZSh0bWVtYmVyKSkgewotICAgICAgICBvdXQgPDwgIk5vbmUgLT4gKCkiOwotCi0gICAgICAgIGlmIChzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRtZW1iZXIpKSB7Ci0gICAgICAgICAgLy8gQXZvaWQgcmVkdW5kYW50IGVuY29kaW5nIG9mIG1lbWJlcnMgaGF2aW5nIGRlZmF1bHQgdmFsdWVzLgotICAgICAgICAgIG91dCA8PCAiIHwgU29tZSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkKLSAgICAgICAgICAgICAgPDwgIiAtPiAoKSI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8ICIgfCBTb21lIF92IC0+ICIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifCBOb25lIC0+IHJhaXNlIChGaWVsZF9lbXB0eSBcIiIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIuIiA8PCBtbmFtZQotICAgICAgICAgICAgICAgICAgICA8PCAiXCIpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifCBTb21lIF92IC0+ICIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgX3YgPSAiX3YiOwotICAgIH0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVGaWVsZEJlZ2luKFwiIiA8PCB0bWVtYmVyLT5nZXRfbmFtZSgpIDw8ICJcIiwiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKHRtZW1iZXItPmdldF90eXBlKCkpIDw8ICIsIiA8PCB0bWVtYmVyLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCB0bWVtYmVyLCBfdik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVGaWVsZEVuZCIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZUZpZWxkU3RvcDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlU3RydWN0RW5kIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIi5tbCI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIGZfc2VydmljZV9pX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICIubWxpIjsKLSAgZl9zZXJ2aWNlX2lfLm9wZW4oZl9zZXJ2aWNlX2lfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8IG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7Ci0gIGZfc2VydmljZV9pXyA8PCBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIC8qIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgIm9wZW4gIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICAgIGZfc2VydmljZV9pXyA8PAotICAgICAgIm9wZW4gIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICB9Ci0gICovCi0gIGZfc2VydmljZV8gPDwgIm9wZW4gIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfaV8gPDwgIm9wZW4gIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIGZfc2VydmljZV9pXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKCogSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyAqKSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjbGFzcyB2aXJ0dWFsIGlmYWNlID0iIDw8IGVuZGwgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV9pXyA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgdmlydHVhbCBpZmFjZSA6IiA8PCBlbmRsIDw8ICJvYmplY3QiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBzdHJpbmcgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbmhlcml0ICIgPDwgZXh0ZW5kcyA8PCAiLmlmYWNlIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgPDwgZXh0ZW5kcyA8PCAiLmlmYWNlIiA8PCBlbmRsOwotICB9Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ0ID0gZnVuY3Rpb25fdHlwZSgqZl9pdGVyLCB0cnVlLCB0cnVlKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtZXRob2QgdmlydHVhbCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiCi0gICAgICAgICAgICAgICA8PCBmdCA8PCBlbmRsOwotICAgIGZfc2VydmljZV9pXyA8PCBpbmRlbnQoKSA8PCAibWV0aG9kIHZpcnR1YWwgIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIgotICAgICAgICAgICAgICAgICA8PCBmdCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLiBOb3RlIHRoYXQgaW4gT0NhbWwsIHRoZSBjbGllbnQgZG9lc24ndCBpbXBsZW1lbnQgaWZhY2UuCi0gKlRoaXMgaXMgYmVjYXVzZQotICogVGhlIGNsaWVudCBkb2VzIG5vdCAoYW5kIHNob3VsZCBub3QgaGF2ZSB0bykgZGVhbCB3aXRoIGFyZ3VtZW50cyBiZWluZyBOb25lLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjbGFzcyBjbGllbnQgKGlwcm90IDogUHJvdG9jb2wudCkgKG9wcm90IDogUHJvdG9jb2wudCkgPSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgICAgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJjbGFzcyBjbGllbnQgOiBQcm90b2NvbC50IC0+IFByb3RvY29sLnQgLT4gIiA8PCBlbmRsIDw8ICJvYmplY3QiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbmhlcml0ICIgPDwgZXh0ZW5kcyA8PCAiLmNsaWVudCBpcHJvdCBvcHJvdCBhcyBzdXBlciIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5jbGllbnQiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YWwgbXV0YWJsZSBzZXFpZCA9IDAiIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm1ldGhvZCAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiID0gIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJtZXRob2QgIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3R5cGUoKmZfaXRlciwgdHJ1ZSwgZmFsc2UpIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmI3NlbmRfIiA8PCBmdW5uYW1lOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJzZWxmI3JlY3ZfIiA8PCBmdW5uYW1lIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm1ldGhvZCBwcml2YXRlIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiA9ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUJlZ2luIChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgotICAgICAgICAgICAgICAgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiUHJvdG9jb2wuT05FV0FZIiA6ICJQcm90b2NvbC5DQUxMIikgPDwgIiwgc2VxaWQpOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJsZXQgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyNzZXRfIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIKLSAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mjd3JpdGUgb3Byb3Q7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IgotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QjZ2V0VHJhbnNwb3J0I2ZsdXNoIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1ldGhvZCBwcml2YXRlICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiID0iCi0gICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJsZXQgKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA9IGlwcm90I3JlYWRNZXNzYWdlQmVnaW4gaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIihpZiBtdHlwZSA9IFByb3RvY29sLkVYQ0VQVElPTiB0aGVuIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIGxldCB4ID0gQXBwbGljYXRpb25fRXhuLnJlYWQgaXByb3QgaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgKGlwcm90I3JlYWRNZXNzYWdlRW5kOyIgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAgIHJhaXNlIChBcHBsaWNhdGlvbl9FeG4uRSB4KSkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSAoKSk7IiA8PCBlbmRsOwotICAgICAgc3RyaW5nIHJlcyA9ICJfIjsKLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpIHx8IHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHJlcyA9ICJyZXN1bHQiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgcmVzIDw8ICIgPSByZWFkXyIgPDwgcmVzdWx0bmFtZSA8PCAiIGlwcm90IGluIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtYXRjaCByZXN1bHQjZ2V0X3N1Y2Nlc3Mgd2l0aCBTb21lIHYgLT4gdiB8IE5vbmUgLT4gKCIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9Ci0KLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIihtYXRjaCByZXN1bHQjZ2V0XyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiB3aXRoIE5vbmUgLT4gKCkgfCBTb21lIF92IC0+IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmFpc2UgKCIgPDwgY2FwaXRhbGl6ZSh0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgX3YpKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKCkiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfCi0gICAgICAgICAgICA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgInJhaXNlIChBcHBsaWNhdGlvbl9FeG4uRSAoQXBwbGljYXRpb25fRXhuLmNyZWF0ZSBBcHBsaWNhdGlvbl9FeG4uTUlTU0lOR19SRVNVTFQgXCIiCi0gICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpKSkiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjbGFzcyBwcm9jZXNzb3IgKGhhbmRsZXIgOiBpZmFjZSkgPSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib2JqZWN0IChzZWxmKSIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJjbGFzcyBwcm9jZXNzb3IgOiBpZmFjZSAtPiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib2JqZWN0IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpbmhlcml0IFByb2Nlc3Nvci50IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfc2VydmljZV9pXyA8PCBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PCBlbmRsOwotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbmhlcml0ICIgKyBleHRlbmRzICsgIi5wcm9jZXNzb3IgKGhhbmRsZXIgOj4gIiArIGV4dGVuZHMgKyAiLmlmYWNlKSIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiaW5oZXJpdCAiICsgZXh0ZW5kcyArICIucHJvY2Vzc29yIiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFsIHByb2Nlc3NNYXAgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IGZ1bmN0aW9ucy5zaXplKCkgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKQotICAgICAgPDwgInZhbCBwcm9jZXNzTWFwIDogKHN0cmluZywgaW50ICogUHJvdG9jb2wudCAqIFByb3RvY29sLnQgLT4gdW5pdCkgSGFzaHRibC50IiA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgcHJvY2VzcyBpcHJvdCBvcHJvdCA9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAibWV0aG9kIHByb2Nlc3MgOiBQcm90b2NvbC50IC0+IFByb3RvY29sLnQgLT4gYm9vbCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IChuYW1lLCB0eXAsIHNlcWlkKSAgPSBpcHJvdCNyZWFkTWVzc2FnZUJlZ2luIGluIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlCi0KLSAgLy8gSE9UOiBkaWN0aW9uYXJ5IGZ1bmN0aW9uIGxvb2t1cAotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBIYXNodGJsLm1lbSBwcm9jZXNzTWFwIG5hbWUgdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIgIChIYXNodGJsLmZpbmQgcHJvY2Vzc01hcCBuYW1lKSAoc2VxaWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiZWxzZSAoIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlwcm90I3NraXAoUHJvdG9jb2wuVF9TVFJVQ1QpOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlwcm90I3JlYWRNZXNzYWdlRW5kOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIgIGxldCB4ID0gQXBwbGljYXRpb25fRXhuLmNyZWF0ZSBBcHBsaWNhdGlvbl9FeG4uVU5LTk9XTl9NRVRIT0QgKFwiVW5rbm93biAiCi0gICAgICAgICAgICAgICAgImZ1bmN0aW9uIFwiXm5hbWUpIGluIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBQcm90b2NvbC5FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiICAgIHgjd3JpdGUgb3Byb3Q7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgb3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgb3Byb3QjZ2V0VHJhbnNwb3J0I2ZsdXNoIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBSZWFkIGVuZCBvZiBhcmdzIGZpZWxkLCB0aGUgVF9TVE9QLCBhbmQgdGhlIHN0cnVjdCBjbG9zZQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnVlIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5pdGlhbGl6ZXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkhhc2h0YmwuYWRkIHByb2Nlc3NNYXAgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgPDwgIlwiIHNlbGYjcHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCl0c2VydmljZTsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm1ldGhvZCBwcml2YXRlIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgKHNlcWlkLCBpcHJvdCwgb3Byb3QpID0iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0IjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGFyZ3MgPSAiYXJncyI7Ci0gIGlmIChmaWVsZHMuc2l6ZSgpID09IDApIHsKLSAgICBhcmdzID0gIl8iOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgYXJncyA8PCAiID0gcmVhZF8iIDw8IGFyZ3NuYW1lIDw8ICIgaXByb3QgaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJsZXQgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIodHJ5IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgInJlc3VsdCNzZXRfc3VjY2VzcyAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIihoYW5kbGVyIyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwgIiBhcmdzI2dldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid2l0aCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifCAiIDw8IGNhcGl0YWxpemUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkpIDw8ICIgIgotICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAtPiAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCNzZXRfIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigpIjsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlQmVnaW4gKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICA8PCAiXCIsIFByb3RvY29sLlJFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQjd3JpdGUgb3Byb3Q7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUVuZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAib3Byb3QjZ2V0VHJhbnNwb3J0I2ZsdXNoIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIjc2V0XyIgPDwgbmFtZSA8PCAiICI7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCB0eXBlKTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRSI7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIG91dCA8PCAiaXByb3QjIjsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAicmVhZEJvb2wiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJyZWFkQnl0ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCAicmVhZEkxNiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCAicmVhZEkzMiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAicmVhZEk2NCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIG91dCA8PCAicmVhZERvdWJsZSI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7Ci0gICAgb3V0IDw8ICIoIiA8PCBlbmFtZSA8PCAiLm9mX2kgaXByb3QjcmVhZEkzMikiOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgJyVzJ1xuIiwgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0c3RydWN0LT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl90eXBlcy4iOwotICB9Ci0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOwotICBvdXQgPDwgIigiIDw8IHByZWZpeCA8PCAicmVhZF8iIDw8IG5hbWUgPDwgIiBpcHJvdCkiOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5Ci0gKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLSAgc3RyaW5nIGNvbiA9IHRtcCgiX2NvbiIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICgiIDw8IGt0eXBlIDw8ICIsIiA8PCB2dHlwZSA8PCAiLCIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90I3JlYWRNYXBCZWdpbiBpbiIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgIiA8PCBjb24gPDwgIiA9IEhhc2h0YmwuY3JlYXRlICIgPDwgc2l6ZSA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgaSA9IDEgdG8gIiA8PCBzaXplIDw8ICIgZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCBfayA9ICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgIG91dCA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgX3YgPSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICBvdXQgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBjb24gPDwgIiBfayBfdiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImRvbmU7IGlwcm90I3JlYWRNYXBFbmQ7ICIgPDwgY29uIDw8ICIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICgiIDw8IGV0eXBlIDw8ICIsIiA8PCBzaXplIDw8ICIpID0gaXByb3QjcmVhZFNldEJlZ2luIGluIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgIiA8PCBjb24gPDwgIiA9IEhhc2h0YmwuY3JlYXRlICIgPDwgc2l6ZSA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgaSA9IDEgdG8gIiA8PCBzaXplIDw8ICIgZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgY29uIDw8ICIgIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIG91dCA8PCAiIHRydWUiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZG9uZTsgaXByb3QjcmVhZFNldEVuZDsgIiA8PCBjb24gPDwgIikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICgiIDw8IGV0eXBlIDw8ICIsIiA8PCBzaXplIDw8ICIpID0gaXByb3QjcmVhZExpc3RCZWdpbiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgY29uIDw8ICIgPSAoQXJyYXkudG9fbGlzdCAoQXJyYXkuaW5pdCAiIDw8IHNpemUgPDwgIiAoZnVuIF8gLT4gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICBvdXQgPDwgIikpKSBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QjcmVhZExpc3RFbmQ7ICIgPDwgY29uIDw8ICIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBuYW1lKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCMiOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIG9jYW1sIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBlbmFtZSA8PCAiLnRvX2kgIiA8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci0gIG91dCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiI3dyaXRlKG9wcm90KSI7Ci19Ci0KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTWFwQmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiSGFzaHRibC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCI7Ci0gICAgb3V0IDw8ICJIYXNodGJsLmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiwiOwotICAgIG91dCA8PCAiTGlzdC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgiX2tpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJfdml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5pdGVyIChmdW4gIiA8PCBraXRlciA8PCAiIC0+IGZ1biAiIDw8IHZpdGVyIDw8ICIgLT4gIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5pdGVyIChmdW4gIiA8PCBpdGVyIDw8ICIgLT4gZnVuIF8gLT4gIjsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiTGlzdC5pdGVyIChmdW4gIiA8PCBpdGVyIDw8ICIgLT4gIjsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTWFwRW5kIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVTZXRFbmQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVMaXN0RW5kIjsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ25hbWUgYXJncycKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHJldHVybiBwcmVmaXggKyBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIgIgotICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Ci19Ci0KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBtZXRob2QsIGJvb2wgb3B0aW9ucykgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQgKz0gcmVuZGVyX29jYW1sX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAob3B0aW9ucykKLSAgICAgIHJlc3VsdCArPSAiIG9wdGlvbiI7Ci0gICAgcmVzdWx0ICs9ICIgLT4gIjsKLSAgfQotICBpZiAoZmllbGRzLmVtcHR5KCkgJiYgIW1ldGhvZCkgewotICAgIHJlc3VsdCArPSAidW5pdCAtPiAiOwotICB9Ci0gIHJlc3VsdCArPSByZW5kZXJfb2NhbWxfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgICAgcHJlZml4ID0gY2FwaXRhbGl6ZShwcm9ncmFtLT5nZXRfbmFtZSgpKSArICJfdHlwZXMuIjsKLSAgICB9Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgIG5hbWUgPSBjYXBpdGFsaXplKG5hbWUpOwotICB9IGVsc2UgewotICAgIG5hbWUgPSBkZWNhcGl0YWxpemUobmFtZSk7Ci0gIH0KLSAgcmV0dXJuIHByZWZpeCArIG5hbWU7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQcm90b2NvbC50X3R5cGUgZW51bQotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfVk9JRCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0RPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiUHJvdG9jb2wuVF9NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX1NFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIG9jYW1sIHR5cGUKLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpyZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gInVuaXQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJzdHJpbmciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiYm9vbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJpbnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJpbnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJJbnQzMi50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiSW50NjQudCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImZsb2F0IjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuIGNhcGl0YWxpemUoKCh0X2VudW0qKXR5cGUpLT5nZXRfbmFtZSgpKSArICIudCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB0eXBlX25hbWUoKHRfc3RydWN0Kil0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICByZXR1cm4gIigiICsgcmVuZGVyX29jYW1sX3R5cGUoa3R5cGUpICsgIiwiICsgcmVuZGVyX29jYW1sX3R5cGUodnR5cGUpICsgIikgSGFzaHRibC50IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHJldHVybiAiKCIgKyByZW5kZXJfb2NhbWxfdHlwZShldHlwZSkgKyAiLGJvb2wpIEhhc2h0YmwudCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHJldHVybiByZW5kZXJfb2NhbWxfdHlwZShldHlwZSkgKyAiIGxpc3QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKG9jYW1sLCAiT0NhbWwiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjVkMTA4Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfT09QX0dFTkVSQVRPUl9ICi0jZGVmaW5lIFRfT09QX0dFTkVSQVRPUl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLS8qKgotICogQ2xhc3Mgd2l0aCB1dGlsaXR5IG1ldGhvZHMgc2hhcmVkIGFjcm9zcyBjb21tb24gb2JqZWN0IG9yaWVudGVkIGxhbmd1YWdlcy4KLSAqIFNwZWNpZmljYWxseSwgbW9zdCBvZiB0aGlzIHN0dWZmIGlzIGZvciBDKysvSmF2YS4KLSAqCi0gKi8KLWNsYXNzIHRfb29wX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfb29wX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0pIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkge30KLQotICAvKioKLSAgICogU2NvcGluZywgdXNpbmcgY3VybHkgYnJhY2VzIQotICAgKi8KLQotICB2b2lkIHNjb3BlX3VwKHN0ZDo6b3N0cmVhbSYgb3V0KSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInsiIDw8IHN0ZDo6ZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIHZvaWQgc2NvcGVfZG93bihzdGQ6Om9zdHJlYW0mIG91dCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IHN0ZDo6ZW5kbDsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHVwY2FzZV9zdHJpbmcoc3RkOjpzdHJpbmcgb3JpZ2luYWwpIHsKLSAgICBzdGQ6OnRyYW5zZm9ybShvcmlnaW5hbC5iZWdpbigpLCBvcmlnaW5hbC5lbmQoKSwgb3JpZ2luYWwuYmVnaW4oKSwgKGludCAoKikoaW50KSl0b3VwcGVyKTsKLSAgICByZXR1cm4gb3JpZ2luYWw7Ci0gIH0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIGEgY29tbWVudCBhYm91dCB0aGlzIGNvZGUgYmVpbmcgYXV0b2dlbmVyYXRlZCwgdXNpbmcgQysrIHN0eWxlCi0gICAqIGNvbW1lbnRzLCB3aGljaCBhcmUgYWxzbyBmYWlyIGdhbWUgaW4gSmF2YSAvIFBIUCwgeWF5IQotICAgKgotICAgKiBAcmV0dXJuIEMtc3R5bGUgY29tbWVudCBtZW50aW9uaW5nIHRoYXQgdGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQuCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIi8qKlxuIikgKyAiICogIiArIGF1dG9nZW5fc3VtbWFyeSgpICsgIlxuIiArICIgKlxuIgotICAgICAgICAgICArICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCi0gICAgICAgICAgICsgIiAqICBAZ2VuZXJhdGVkXG4iICsgIiAqL1xuIjsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgYXV0b2dlbl9zdW1tYXJ5KCkgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIpICsgVEhSSUZUX1ZFUlNJT04gKyAiKSI7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7Ci0gICAgc3RkOjpzdHJpbmcgcGFja2FnZSA9ICIiOwotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpICsgIi4iOwotICAgIH0KLSAgICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNvbnRlbnRzKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgICAgc3RkOjpzdHJpbmcgY29tYmluZWRfbWVzc2FnZSA9IGZpZWxkLT5nZXRfZG9jKCkgKyAiXG5Ac2VlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpOwotICAgICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7Ci0gICAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAotICAgKi8KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7Ci0gICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOwotICAgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOwotICAgICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOwotICAgIH0KLSAgfQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNTJjMjQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTY0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogUEVSTCBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfcGVybF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9wZXJsX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKXBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcGVybCI7Ci0gICAgZXNjYXBlX1snJCddID0gIlxcJCI7Ci0gICAgZXNjYXBlX1snQCddID0gIlxcQCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3RzIQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBwZXJsX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgYm9vbCBvYmogPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIjXG4iKSArICIjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgotICAgICAgICAgICArICIjXG4iICsgIiMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICIjXG4iOwotICB9Ci0KLSAgdm9pZCBwZXJsX25hbWVzcGFjZV9kaXJzKHRfcHJvZ3JhbSogcCwgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiYgZGlycykgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGVybCIpOwotICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICBkaXJzLnB1c2hfYmFjayhucy5zdWJzdHIoMCwgbG9jKSk7Ci0gICAgICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICBkaXJzLnB1c2hfYmFjayhucyk7Ci0gICAgfQotICB9Ci0KLSAgc3RkOjpzdHJpbmcgcGVybF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwZXJsIik7Ci0gICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0KLSAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIHJlc3VsdCArPSBucy5zdWJzdHIoMCwgbG9jKTsKLSAgICAgICAgcmVzdWx0ICs9ICI6OiI7Ci0gICAgICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOwotICAgICAgfQotCi0gICAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgICByZXN1bHQgKz0gbnMgKyAiOjoiOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlX291dF9kaXIoKSB7Ci0gICAgc3RkOjpzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+IGRpcnM7Ci0gICAgcGVybF9uYW1lc3BhY2VfZGlycyhwcm9ncmFtXywgZGlycyk7Ci0gICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQ7Ci0gICAgZm9yIChpdCA9IGRpcnMuYmVnaW4oKTsgaXQgIT0gZGlycy5lbmQoKTsgaXQrKykgewotICAgICAgb3V0ZGlyICs9ICppdCArICIvIjsKLSAgICB9Ci0gICAgcmV0dXJuIG91dGRpcjsKLSAgfQotCi1wcml2YXRlOgotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfY29uc3RzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2hlbHBlcnNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci19OwotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBkaXJzOwotICBwZXJsX25hbWVzcGFjZV9kaXJzKHByb2dyYW1fLCBkaXJzKTsKLSAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQ7Ci0gIGZvciAoaXQgPSBkaXJzLmJlZ2luKCk7IGl0ICE9IGRpcnMuZW5kKCk7IGl0KyspIHsKLSAgICBvdXRkaXIgKz0gKml0ICsgIi8iOwotICAgIE1LRElSKG91dGRpci5jX3N0cigpKTsKLSAgfQotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpciArICJUeXBlcy5wbSI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG91dGRpciArICJDb25zdGFudHMucG0iOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwZXJsX2luY2x1ZGVzKCk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCAiQ29uc3RhbnRzOyIgPDwgZW5kbAotICAgICAgICAgICAgPDwgcGVybF9pbmNsdWRlcygpIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cwotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cGVybF9pbmNsdWRlcygpIHsKLSAgc3RyaW5nIGluYzsKLQotICBpbmMgPSAicmVxdWlyZSA1LjYuMDtcbiI7Ci0gIGluYyArPSAidXNlIHN0cmljdDtcbiI7Ci0gIGluYyArPSAidXNlIHdhcm5pbmdzO1xuIjsKLSAgaW5jICs9ICJ1c2UgVGhyaWZ0O1xuXG4iOwotCi0gIHJldHVybiBpbmM7Ci19Ci0KLS8qKgotICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfIDw8ICIxOyIgPDwgZW5kbDsKLSAgZl90eXBlc18uY2xvc2UoKTsKLQotICBmX2NvbnN0c18gPDwgIjE7IiA8PCBlbmRsOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFBFUkwsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKLSAqIGluIFBFUkwsIHdlIHVzZSBhIGdsb2JhbCBhcnJheSBmb3IgdGhpcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGZfdHlwZXNfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGZfdHlwZXNfIDw8ICJ1c2UgY29uc3RhbnQgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PiAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZl9jb25zdHNfIDw8ICJ1c2UgY29uc3RhbnQgIiA8PCBuYW1lIDw8ICIgPT4gIjsKLSAgZl9jb25zdHNfIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Ci0gIGZfY29uc3RzXyA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAiMSIgOiAiMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgIm5ldyAiIDw8IHBlcmxfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIih7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCAifSkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIG91dCA8PCAieyIgPDwgZW5kbDsKLQotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIlsiIDw8IGVuZGw7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0KLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIG91dCA8PCAiID0+IDEiOwotICAgICAgfQotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgIl0iOwotICB9Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogTWFrZSBhIHN0cnVjdAotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBQRVJMCi0gKiB3aGVyZSB0aGUgb2JqZWN0cyBhcmUgYWxsIGp1c3QgYXNzb2NpYXRpdmUgYXJyYXlzICh1bmxlc3Mgb2YgY291cnNlIHdlCi0gKiBkZWNpZGUgdG8gc3RhcnQgdXNpbmcgb2JqZWN0cyBmb3IgdGhlbS4uLikKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBvdXQgPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI7XG4iOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJ1c2UgYmFzZSBxdyhUaHJpZnQ6OlRFeGNlcHRpb24pO1xuIjsKLSAgfQotCi0gIC8vIENyZWF0ZSBzaW1wbGUgYWNlc3NvciBtZXRob2RzCi0gIG91dCA8PCAidXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTtcbiI7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCBwZXJsX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICItPm1rX2FjY2Vzc29ycyggcXcoICI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKCF0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAiOwotICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PCAiKSApO1xuIjsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIG5ldygpCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgInN1YiBuZXcgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGNsYXNzbmFtZSA9IHNoaWZ0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIm15ICRzZWxmICAgICAgPSB7fTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICR2YWxzICAgICAgPSBzaGlmdCB8fCB7fTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHN0cmluZyBkdmFsID0gInVuZGVmIjsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAhKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiRzZWxmLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgPDwgIn0gPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChVTklWRVJTQUw6OmlzYSgkdmFscywnSEFTSCcpKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHZhbHMtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSkgeyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICRzZWxmLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkdmFscy0+eyIKLSAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn07IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzICgkc2VsZiwgJGNsYXNzbmFtZSk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgIn1cblxuIjsKLQotICBvdXQgPDwgInN1YiBnZXROYW1lIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgInN1YiByZWFkIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRpbnB1dCkgPSBAXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICR4ZmVyICA9IDA7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZ0eXBlID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJteSAkZmlkICAgPSAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oXFwkZm5hbWUpOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlICgxKSAiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbihcXCRmbmFtZSwgXFwkZnR5cGUsIFxcJGZpZCk7IiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAibGFzdDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gIGluZGVudChvdXQpIDw8ICJTV0lUQ0g6IGZvcigkZmlkKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotCi0gICAgaW5kZW50KG91dCkgPDwgIi9eIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiJC8gJiYgZG97IjsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCRmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLT4iKTsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJsYXN0OyB9OyIgPDwgZW5kbDsKLSAgfQotICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0KLSAgaW5kZW50KG91dCkgPDwgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSB3cml0ZSgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCAic3ViIHdyaXRlIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJteSAoJHNlbGYsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAibXkgJHhmZXIgICA9IDA7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHNlbGYtPnsiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oIgotICAgICAgICAgICAgICAgIDw8ICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYtPiIpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfbmFtZXNwYWNlX291dF9kaXIoKSArIHNlcnZpY2VfbmFtZV8gKyAiLnBtIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAgIC8vLyAgICAgICJwYWNrYWdlICI8PHNlcnZpY2VfbmFtZV88PCI7Ijw8ZW5kbDw8Ci0gICAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwZXJsX2luY2x1ZGVzKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8ICJUeXBlczsiIDw8IGVuZGw7Ci0KLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIjsiCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQRVJMKQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfIDw8ICIxOyIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJ1c2UgYmFzZSBxdygiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IpOyI7Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9zZXJ2aWNlXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3I7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkY2xhc3NuYW1lLCAkaGFuZGxlcikgPSBAXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntoYW5kbGVyfSA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcyAoJHNlbGYsICRjbGFzc25hbWUpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGZfc2VydmljZV8gPDwgInN1YiBwcm9jZXNzIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRmbmFtZSAgPSB1bmRlZjsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJG10eXBlICA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKFxcJGZuYW1lLCBcXCRtdHlwZSwgXFwkcnNlcWlkKTsiIDw8IGVuZGw7Ci0KLSAgLy8gSE9UOiBjaGVjayBmb3IgbWV0aG9kIGltcGxlbWVudGF0aW9uCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgImlmICghJHNlbGYtPmNhbigkbWV0aG9kbmFtZSkpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+c2tpcChUVHlwZTo6U1RSVUNUKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJteSAkeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicsICIKLSAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04sICRyc2VxaWQpOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkeC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIkc2VsZi0+JG1ldGhvZG5hbWUoJHJzZXFpZCwgJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiAxOyIKLSAgICAgICAgICAgICA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8gPDwgInN1YiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRzZXFpZCwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCi0gICAgICAgICAgICAgICAgICAgICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCi0gICAgICAgICAgICAgICAgICAgICAgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJldmFsIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgIiRyZXN1bHQtPntzdWNjZXNzfSA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiJHNlbGYtPntoYW5kbGVyfS0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiJGFyZ3MtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn07IGlmKCBVTklWRVJTQUw6OmlzYSgkQCwnIgotICAgICAgICAgICAgICAgICA8PCBwZXJsX25hbWVzcGFjZSgoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCkpCi0gICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiJykgKXsgIiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPnsiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICRAOyIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRAID0gdW5kZWY7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBjYXRjaC1hbGwgZm9yIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucyAoVEhSSUZULTMxOTEpCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCRAKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRAID1+IHMvXlxccyt8XFxzKyQvL2c7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJGVyciA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oXCJVbmV4cGVjdGVkIEV4Y2VwdGlvbjogXCIgLiAkQCwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUik7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHNlcWlkKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkZXJyLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkQCA9IHVuZGVmOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBTZXJpYWxpemUgdGhlIHJlcGx5Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgJHNlcWlkKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKLSAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOwotICAgIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9wZXJsX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gICAgdHMtPnNldF9uYW1lKG5hbWUpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzX2lmID0gIiI7Ci0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGV4dGVuZHNfaWYgPSAidXNlIGJhc2UgcXcoIiArIHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgKyAiSWYpOyI7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmOyIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInVzZSBzdHJpY3Q7IiA8PCBlbmRsIDw8IGV4dGVuZHNfaWYgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbCA8PCAiICBkaWUgJ2ltcGxlbWVudCBpbnRlcmZhY2UnO1xufSIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFJFU1QgaW50ZXJmYWNlCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX2lmID0gInVzZSBiYXNlIHF3KCIgKyBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICsgIlJlc3QpOyI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJSZXN0OyIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInVzZSBzdHJpY3Q7IiA8PCBlbmRsIDw8IGV4dGVuZHNfaWYgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkY2xhc3NuYW1lLCAkaW1wbCkgPSBAXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJteSAkc2VsZiAgICAgPXsgaW1wbCA9PiAkaW1wbCB9OyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAicmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJzdWIgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgInsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJHJlcXVlc3QpID0gQF87IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgICBmb3IgKGFfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYV9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGF0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmFfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgc3RyaW5nIHJlcSA9ICIkcmVxdWVzdC0+eyciICsgKCphX2l0ZXIpLT5nZXRfbmFtZSgpICsgIid9IjsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gKCIgPDwgcmVxIDw8ICIpID8gIiA8PCByZXEKLSAgICAgICAgICAgICAgICAgPDwgIiA6IHVuZGVmOyIgPDwgZW5kbDsKLSAgICAgIGlmIChhdHlwZS0+aXNfc3RyaW5nKCkgJiYgKCh0X2Jhc2VfdHlwZSopYXR5cGUpLT5pc19zdHJpbmdfbGlzdCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15IEAiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gc3BsaXQoLywvLCAkIgotICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiCi0gICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBcXEAiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJHNlbGYtPntpbXBsfS0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiCi0gICAgICAgICAgICAgICA8PCBhcmd1bWVudF9saXN0KCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAidXNlIGJhc2UgcXcoIiArIGV4dGVuZHMgKyAiQ2xpZW50KTsiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQ7IiA8PCBlbmRsIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBleHRlbmRzX2NsaWVudCA8PCBlbmRsIDw8ICJ1c2UgYmFzZSBxdygiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKQotICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PCAic3ViIG5ldyB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkY2xhc3NuYW1lLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIm15ICRzZWxmICAgICAgPSB7fTsiIDw8IGVuZGw7Ci0KLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0gID0gJGlucHV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiRzZWxmLT57b3V0cHV0fSA9IGRlZmluZWQgJG91dHB1dCA/ICRvdXRwdXQgOiAkaW5wdXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiJHNlbGYtPntzZXFpZH0gID0gMDsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgZl9zZXJ2aWNlXyA8PCAic3ViICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIiQiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIkc2VsZi0+cmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAic3ViIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntvdXRwdXR9LT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgIDw8ICInLCAiIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZTo6T05FV0FZIiA6ICJUTWVzc2FnZVR5cGU6OkNBTEwiKQotICAgICAgICAgICAgICAgPDwgIiwgJHNlbGYtPntzZXFpZH0pOyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkYXJncy0+eyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkIgotICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCRzZWxmLT57b3V0cHV0fSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiJHNlbGYtPntvdXRwdXR9LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIkc2VsZi0+e291dHB1dH0tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJG10eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlQmVnaW4oXFwkZm5hbWUsIFxcJG10eXBlLCBcXCRyc2VxaWQpOyIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRtdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBteSAkeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAgJHgtPnJlYWQoJHNlbGYtPntpbnB1dH0pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICAkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZGllICR4OyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiJHJlc3VsdC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+e3N1Y2Nlc3N9ICkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiAkcmVzdWx0LT57c3VjY2Vzc307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBkaWUgJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9OyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkaWUgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIjsiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gICh2b2lkKWluY2xhc3M7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAvLyBIYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKLSAgaWYgKCFwcmVmaXguZW1wdHkoKSkgewotICAgIG5hbWUgPSBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSI7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbChcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNihcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZShcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAotICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCi0gKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAotICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCi0gICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeAotICAgICAgPDwgIi0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCBzaXplIDw8ICIgPSAwOyIgPDwgZW5kbDsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IGt0eXBlIDw8ICIgPSAwOyIKLSAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwgdnR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigiCi0gICAgICAgIDw8ICJcXCQiIDw8IGt0eXBlIDw8ICIsIFxcJCIgPDwgdnR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwgZXR5cGUgPDwgIiA9IDA7IgotICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigiCi0gICAgICAgIDw8ICJcXCQiIDw8IGV0eXBlIDw8ICIsIFxcJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiCi0gICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigiCi0gICAgICAgIDw8ICJcXCQiIDw8IGV0eXBlIDw8ICIsIFxcJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PCAiZm9yIChteSAkIiA8PCBpIDw8ICIgPSAwOyAkIiA8PCBpIDw8ICIgPCAkIiA8PCBzaXplIDw8ICI7ICsrJCIgPDwgaSA8PCAiKSIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXksIHRydWUsIHRydWUpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwsIHRydWUsIHRydWUpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIi0+eyQiIDw8IGtleSA8PCAifSA9ICQiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm15ICQiIDw8IGVsZW0gPDwgIiA9IHVuZGVmOyIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiLT57JCIgPDwgZWxlbSA8PCAifSA9IDE7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCAibXkgJCIgPDwgZWxlbSA8PCAiID0gdW5kZWY7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCAicHVzaChAeyQiIDw8IHByZWZpeCA8PCAifSwkIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSIpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9Iik7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAgIC8vIEhhY2sgZm9yIHdoZW4gcHJlZml4IGlzIGRlZmluZWQgKGFsd2F5cyBhIGhhc2ggcmVmKQotICAgIGlmICghcHJlZml4LmVtcHR5KCkpCi0gICAgICBuYW1lID0gcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIn0iOwotCi0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCl0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJCIgPDwgcHJlZml4IDw8ICItPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgInNjYWxhcihrZXlzICV7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEJlZ2luKCIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCAic2NhbGFyKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgInNjYWxhcihAeyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKLSAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIndoaWxlKCBteSAoJCIgPDwga2l0ZXIgPDwgIiwkIiA8PCB2aXRlciA8PCAiKSA9IGVhY2ggJXskIiA8PCBwcmVmaXggPDwgIn0pICIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggbXkgJCIgPDwgaXRlciA8PCAiIChAeyQiIDw8IHByZWZpeCA8PCAifSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCBteSAkIiA8PCBpdGVyIDw8ICIgKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSAiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIG9iaikgewotICBzdHJpbmcgcmVzdWx0ID0gIm15ICQiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAnJyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwLjAiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEVSTCBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIKLSAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IFtdIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGlmIChvYmopIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHBlcmxfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICIoKSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgKz0gIiA9IHVuZGVmIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0KLSAgc3RyaW5nIHN0cjsKLQotICBzdHIgPSBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAie1xuIjsKLSAgc3RyICs9ICIgIG15ICRzZWxmID0gc2hpZnQ7XG4iOwotCi0gIC8vIE5lZWQgdG8gY3JlYXRlIHBlcmwgZnVuY3Rpb24gYXJnIGlucHV0cwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0ciArPSAiICBteSAkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgPSBzaGlmdDtcbiI7Ci0gIH0KLQotICByZXR1cm4gc3RyOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAiJCIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZTo6U1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpCT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpCWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGU6OkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZTo6STY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGU6OkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGU6OkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpNQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6U0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpMSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihwZXJsLCAiUGVybCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyNmQ3MC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI1MjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0jZGVmaW5lIE5TR0xPQkFMIChuc2dsb2JhbF8uc2l6ZSgpID8gbnNnbG9iYWxfIDogIiIpCi0jZGVmaW5lIE5TR0xPQkFMX0EgKCJcXCIgKyBOU0dMT0JBTCkKLSNkZWZpbmUgTlNHTE9CQUxfQiAoTlNHTE9CQUwgKyAiXFwiKQotI2RlZmluZSBOU0dMT0JBTF9BQiAoIlxcIiArIE5TR0xPQkFMICsgIlxcIikKLQotLyoqCi0gKiBQSFAgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3BocF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9waHBfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJpbmxpbmVkIik7Ci0gICAgYmluYXJ5X2lubGluZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgicmVzdCIpOwotICAgIHJlc3RfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInNlcnZlciIpOwotICAgIHBocHNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm9vcCIpOwotICAgIG9vcF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgidmFsaWRhdGUiKTsKLSAgICB2YWxpZGF0ZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgianNvbiIpOwotICAgIGpzb25fc2VyaWFsaXphYmxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJuc2dsb2JhbCIpOwotICAgIGlmIChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKSB7Ci0gICAgICBuc2dsb2JhbF8gPSBpdGVyLT5zZWNvbmQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5zZ2xvYmFsXyA9ICIiOyAvLyBieSBkZWZhdWx0IGdsb2JhbCBuYW1lc3BhY2UgaXMgZW1wdHkKLSAgICB9Ci0KLSAgICBpZiAob29wXyAmJiBiaW5hcnlfaW5saW5lXykgewotICAgICAgdGhyb3cgIm9vcCBhbmQgaW5saW5lZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiI7Ci0gICAgfQotCi0gICAgb3V0X2Rpcl9iYXNlXyA9IChiaW5hcnlfaW5saW5lXyA/ICJnZW4tcGhwaSIgOiAiZ2VuLXBocCIpOwotICAgIGVzY2FwZV9bJyQnXSA9ICJcXCQiOwotICB9Ci0KLSAgc3RhdGljIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKTsKLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdHMhCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVfbW9kZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKLSAgYm9vbCBuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7Ci0gIGJvb2wgbmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7Ci0gIGludCBnZXRfcGhwX251bV9yZXF1aXJlZF9maWVsZHMoY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzLCBib29sIHdyaXRlX21vZGUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHBocF9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYWRkVHlwZUhpbnRzID0gdHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fY2FzdCh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX3BocGRvYyh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBwaHBfbmFtZXNwYWNlX2Jhc2UoY29uc3QgdF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwaHAiKTsKLSAgICBjb25zdCBjaGFyKiBkZWxpbWl0ZXIgPSAiXFwiOwotICAgIHNpemVfdCBwb3NpdGlvbiA9IG5zLmZpbmQoJy4nKTsKLSAgICB3aGlsZSAocG9zaXRpb24gIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBucy5yZXBsYWNlKHBvc2l0aW9uLCAxLCBkZWxpbWl0ZXIpOwotICAgICAgcG9zaXRpb24gPSBucy5maW5kKCcuJywgcG9zaXRpb24gKyAxKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5zOwotICB9Ci0KLSAgLy8gZ2VuZXJhbCB1c2UgbmFtZXNwYWNlIHByZWZpeGluZzogXG15XG5hbWVzcGFjZVwgb3IgbXlfbmFtZXNwYWNlXwotICBzdHJpbmcgcGhwX25hbWVzcGFjZShjb25zdCB0X3Byb2dyYW0qIHApIHsKLSAgICBzdHJpbmcgbnMgPSBwaHBfbmFtZXNwYWNlX2Jhc2UocCk7Ci0gICAgcmV0dXJuIChuc2dsb2JhbF8uc2l6ZSgpID8gTlNHTE9CQUxfQUIgOiBOU0dMT0JBTF9CKSArIChucy5zaXplKCkgPyAobnMgKyAiXFwiKSA6ICIiKTsKLSAgfQotCi0gIC8vIHNldHRpbmcgdGhlIG5hbWVzcGFjZSBvZiBhIGZpbGU6IG15XG5hbWVzcGFjZQotICBzdHJpbmcgcGhwX25hbWVzcGFjZV9zdWZmaXgoY29uc3QgdF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOwotCi0gICAgcmV0dXJuIChuc2dsb2JhbF8uc2l6ZSgpID8gTlNHTE9CQUxfQiA6IE5TR0xPQkFMKSArIG5zOwotICB9Ci0KLSAgLy8gYWRkIGEgZGlyZWN0b3J5IHRvIGFscmVhZHkgZXhpc3RpbmcgbmFtZXNwYWNlCi0gIHN0cmluZyBwaHBfbmFtZXNwYWNlX2RpcmVjdG9yeShzdHJpbmcgZGlyZWN0b3J5LCBib29sIGVuZCA9IHRydWUpIHsKLSAgICAodm9pZClkaXJlY3Rvcnk7Ci0gICAgaWYgKGVuZCkgewotICAgICAgcmV0dXJuICI7IjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgfQotCi0gIC8vIHdyaXRpbmcgYW4gYXV0bG9hZCBpZGVudGlmaWVyIGludG8gZ2xvYmE7bHM6IG15XG5hbWVzcGFjZVwgb3IgbXlfbmFtZXNwYWNlXwotICBzdHJpbmcgcGhwX25hbWVzcGFjZV9hdXRvbG9hZChjb25zdCB0X3Byb2dyYW0qIHApIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHBocF9uYW1lc3BhY2VfYmFzZShwKTsKLSAgICByZXR1cm4gKG5zZ2xvYmFsXy5zaXplKCkgPyBOU0dMT0JBTF9CIDogTlNHTE9CQUwpICsgKG5zLnNpemUoKSA/IChucyArICJcXCIpIDogIiIpOwotICB9Ci0KLSAgLy8gZGVjbGFyaW5nIGEgdHlwZTogdHlwZW5hbWUgb3IgbXlfbmFtZXNwYWNlX3R5cGVuYW1lCi0gIHN0cmluZyBwaHBfbmFtZXNwYWNlX2RlY2xhcmF0aW9uKHRfdHlwZSogdCkgeyByZXR1cm4gdC0+Z2V0X25hbWUoKTsgfQotCi0gIHN0ZDo6c3RyaW5nIHBocF9wYXRoKHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGhwLnBhdGgiKTsKLSAgICBpZiAobnMuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHAtPmdldF9uYW1lKCk7Ci0gICAgfQotCi0gICAgLy8gVHJhbnNmb3JtIHRoZSBqYXZhLXN0eWxlIG5hbWVzcGFjZSBpbnRvIGEgcGF0aC4KLSAgICBmb3IgKHN0ZDo6c3RyaW5nOjppdGVyYXRvciBpdCA9IG5zLmJlZ2luKCk7IGl0ICE9IG5zLmVuZCgpOyArK2l0KSB7Ci0gICAgICBpZiAoKml0ID09ICcuJykgewotICAgICAgICAqaXQgPSAnLyc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5zICsgJy8nOwotICB9Ci0KLSAgLyoqCi0gICAqIFRyYW5zZm9ybSBjbGFzc19tZXRob2QgaW50byBDbGFzc01ldGhvZAotICAgKgotICAgKiBAcGFyYW0gc3RyCi0gICAqIEByZXR1cm4gc3Rpcm5nCi0gICAqLwotICBzdHJpbmcgY2xhc3NpZnkoc3RyaW5nIHN0cikgewotICAgIHN0cmluZyBjbGFzc2UgPSAiIjsKLQotICAgIHZlY3RvcjxzdHJpbmc+IHggPSBzcGxpdChzdHIsICdfJyk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHguc2l6ZSgpOyArK2kpIHsKLSAgICAgIGNsYXNzZSA9IGNsYXNzZSArIGNhcGl0YWxpemUoeFtpXSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNsYXNzZTsKLSAgfQotCi0gIC8qKgotICAgKiBTcGxpdCBtZXRob2QKLSAgICogQHBhcmFtIHMKLSAgICogQHBhcmFtIGRlbGltCi0gICAqIEBwYXJhbSBlbGVtcwotICAgKiBAcmV0dXJuCi0gICAqLwotICB2ZWN0b3I8c3RyaW5nPiYgc3BsaXQoY29uc3Qgc3RyaW5nJiBzLCBjaGFyIGRlbGltLCB2ZWN0b3I8c3RyaW5nPiYgZWxlbXMpIHsKLSAgICBzdHJpbmdzdHJlYW0gc3Mocyk7Ci0gICAgc3RyaW5nIGl0ZW07Ci0KLSAgICB3aGlsZSAoZ2V0bGluZShzcywgaXRlbSwgZGVsaW0pKSB7Ci0gICAgICBlbGVtcy5wdXNoX2JhY2soaXRlbSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVsZW1zOwotICB9Ci0KLSAgdmVjdG9yPHN0cmluZz4gc3BsaXQoY29uc3Qgc3RyaW5nJiBzLCBjaGFyIGRlbGltKSB7Ci0gICAgdmVjdG9yPHN0cmluZz4gZWxlbXM7Ci0KLSAgICByZXR1cm4gc3BsaXQocywgZGVsaW0sIGVsZW1zKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYXBpdGFsaXplIG1ldGhvZAotICAgKiBAcGFyYW0gc3RyCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHN0cmluZyBjYXBpdGFsaXplKHN0cmluZyBzdHIpIHsKLSAgICBzdHJpbmc6Oml0ZXJhdG9yIGl0KHN0ci5iZWdpbigpKTsKLQotICAgIGlmIChpdCAhPSBzdHIuZW5kKCkpCi0gICAgICBzdHJbMF0gPSB0b3VwcGVyKCh1bnNpZ25lZCBjaGFyKXN0clswXSk7Ci0KLSAgICAvLyAgICB3aGlsZSgrK2l0ICE9IHN0ci5lbmQoKSkKLSAgICAvLyAgICB7Ci0gICAgLy8gICAgICAqaXQgPSB0b2xvd2VyKCh1bnNpZ25lZCBjaGFyKSppdCk7Ci0gICAgLy8gICAgfQotICAgIHJldHVybiBzdHI7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2hlbHBlcnNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotICAvKioKLSAgICogR2VuZXJhdGUgcHJvdG9jb2wtaW5kZXBlbmRlbnQgdGVtcGxhdGU/IE9yIEJpbmFyeSBpbmxpbmUgY29kZT8KLSAgICovCi0gIGJvb2wgYmluYXJ5X2lubGluZV87Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlIGEgUkVTVCBoYW5kbGVyIGNsYXNzCi0gICAqLwotICBib29sIHJlc3RfOwotCi0gIC8qKgotICAgKiBHZW5lcmF0ZSBzdHVicyBmb3IgYSBQSFAgc2VydmVyCi0gICAqLwotICBib29sIHBocHNfOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIHVzZSBPT1AgYmFzZSBjbGFzcyBUQmFzZQotICAgKi8KLSAgYm9vbCBvb3BfOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIHZhbGlkYXRvciBjb2RlCi0gICAqLwotICBib29sIHZhbGlkYXRlXzsKLQotICAvKioKLSAgICogV2hldGhlciB0byBnZW5lcmF0ZSBKc29uU2VyaWFsaXphYmxlIGNsYXNzZXMKLSAgICovCi0gIGJvb2wganNvbl9zZXJpYWxpemFibGVfOwotCi0gIC8qKgotICAgKiBHbG9iYWwgbmFtZXNwYWNlIGZvciBQSFAgNS4zCi0gICAqLwotICBzdGQ6OnN0cmluZyBuc2dsb2JhbF87Ci19OwotCi1ib29sIHRfcGhwX2dlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7Ci0gIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJwYXRoIjsKLX0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBDcmVhdGUgUmVhbCBkaXJlY3RvcnkgTmFtZXNwYWNlcwotICB2ZWN0b3I8c3RyaW5nPiBOU3ggPSBzcGxpdChwaHBfbmFtZXNwYWNlX3N1ZmZpeChnZXRfcHJvZ3JhbSgpKSwgJ1xcJyk7Ci0gIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOU3guc2l6ZSgpOyArK2kpIHsKLSAgICBwYWNrYWdlX2Rpcl8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBOU3hbaV0gKyAiLyI7Ci0gICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOwotICB9Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfICsgIlR5cGVzLnBocCI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PCAiPD9waHAiIDw8IGVuZGw7Ci0gIGlmICggISBwaHBfbmFtZXNwYWNlX3N1ZmZpeChnZXRfcHJvZ3JhbSgpKS5lbXB0eSgpICkgIHsKLSAgICBmX3R5cGVzXyA8PCAibmFtZXNwYWNlICIgPDwgcGhwX25hbWVzcGFjZV9zdWZmaXgoZ2V0X3Byb2dyYW0oKSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwaHBfaW5jbHVkZXMoKTsKLQotICBmX3R5cGVzXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBwaHAgaW5jbHVkZXMKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cGhwX2luY2x1ZGVzKCkgewotICBzdHJpbmcgaW5jbHVkZXMgPSAidXNlIFRocmlmdFxcQmFzZVxcVEJhc2U7XG4iCi0gICAgICAgICAgICAgICAgICAgICJ1c2UgVGhyaWZ0XFxUeXBlXFxUVHlwZTtcbiIKLSAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFR5cGVcXFRNZXNzYWdlVHlwZTtcbiIKLSAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVEV4Y2VwdGlvbjtcbiIKLSAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVFByb3RvY29sRXhjZXB0aW9uO1xuIgotICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcUHJvdG9jb2xcXFRQcm90b2NvbDtcbiIKLSAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFByb3RvY29sXFxUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZDtcbiIKLSAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVEFwcGxpY2F0aW9uRXhjZXB0aW9uO1xuIjsKLQotICBpZiAoanNvbl9zZXJpYWxpemFibGVfKSB7Ci0gICAgaW5jbHVkZXMgKz0gInVzZSBKc29uU2VyaWFsaXphYmxlO1xuIgotICAgICAgICAgICAgICAgICJ1c2Ugc3RkQ2xhc3M7XG4iOwotICB9Ci0KLSAgcmV0dXJuIGluY2x1ZGVzICsgIlxuIjsKLX0KLQotLyoqCi0gKiBDbG9zZSB1cCAob3IgZG93bikgc29tZSBmaWxlei4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXyA8PCBlbmRsOwotICBmX3R5cGVzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUEhQLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKLSAqIGluIFBIUCwgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0KLSAgLy8gV2UncmUgYWxzbyBkb2luZyBpdCB0aGlzIHdheSB0byBzZWUgaG93IGl0IHBlcmZvcm1zLiBJdCdzIG1vcmUgbGVnaWJsZQotICAvLyBjb2RlIGJ1dCB5b3UgY2FuJ3QgZG8gdGhpbmdzIGxpa2UgYW4gJ2V4dHJhY3QnIG9uIGl0LCB3aGljaCBpcyBhIGJpdCBvZgotICAvLyBhIGRvd25lci4KLSAgZ2VuZXJhdGVfcGhwX2RvYyhmX3R5cGVzXywgdGVudW0pOwotICBmX3R5cGVzXyA8PCAiZmluYWwgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBnZW5lcmF0ZV9waHBfZG9jKGZfdHlwZXNfLCAqY19pdGVyKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJjb25zdCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChmX3R5cGVzXykgPDwgInN0YXRpYyBwdWJsaWMgJF9fbmFtZXMgPSBhcnJheSgiIDw8IGVuZGw7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8ICIgICIgPDwgdmFsdWUgPDwgIiA9PiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3R5cGVzXykgPDwgIik7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgY29uc3RhbnQgY2xhc3MKLSAqCi0gKiBPdmVycmlkZSB0aGUgb25lIGZyb20gdF9nZW5lcmF0b3IKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0KLSAgLy8gQ3JlYXRlIGNsYXNzIG9ubHkgaWYgbmVlZGVkCi0gIGlmIChjb25zdHMuc2l6ZSgpID4gMCkgewotICAgIGZfdHlwZXNfIDw8ICJmaW5hbCBjbGFzcyBDb25zdGFudCBleHRlbmRzIFxcVGhyaWZ0XFxUeXBlXFxUQ29uc3RhbnQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIENyZWF0ZSBzdGF0aWMgcHJvcGVydHkKLSAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAgIGluZGVudChmX3R5cGVzXykgPDwgInN0YXRpYyBwcm90ZWN0ZWQgJCIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgaW5pdCBmdW5jdGlvbgotICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgICAgZl90eXBlc18gPDwgZW5kbDsKLQotICAgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAic3RhdGljIHByb3RlY3RlZCBmdW5jdGlvbiBpbml0XyIgPDwgbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJyZXR1cm4gIjsKLSAgICAgIGdlbmVyYXRlX2NvbnN0KCpjX2l0ZXIpOwotICAgICAgZl90eXBlc18gPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBnZW5lcmF0ZV9waHBfZG9jKGZfdHlwZXNfLCB0Y29uc3QpOwotICBmX3R5cGVzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICJuZXcgIiA8PCBwaHBfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIihhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgImFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiID0+ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBvdXQgPDwgImFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIG91dCA8PCAiID0+IHRydWUiOwotICAgICAgfQotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpIjsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIE1ha2UgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9waHBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotfQotCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHQpIHsKLSAgdCA9IGdldF90cnVlX3R5cGUodCk7Ci0gIGluZGVudChvdXQpIDw8ICIndHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0odCkgPDwgIiwiIDw8IGVuZGw7Ci0KLSAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpIHx8IHQtPmlzX2VudW0oKSkgewotICAgIC8vIE5vb3AsIHR5cGUgaXMgYWxsIHdlIG5lZWQKLSAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIidjbGFzcycgPT4gJyIgPDwgcGhwX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0LT5nZXRfbmFtZSgpIDw8ICInLCIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdCktPmdldF9rZXlfdHlwZSgpKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgIGluZGVudChvdXQpIDw8ICIna3R5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiLCIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiJ3Z0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIidrZXknID0+IGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwga3R5cGUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIndmFsJyA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIHZ0eXBlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkgfHwgdC0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIidldHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0oZXR5cGUpIDw8ICIsIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICInZWxlbScgPT4gYXJyYXkoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCBldHlwZSk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyB0eXBlIGZvciBwaHAgc3RydWN0IHNwZWMgZmllbGQiOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUsIHdoaWNoIGZ1bGx5IHF1YWxpZmllcyBlbm91Z2gKLSAqIHR5cGUgaW5mb3JtYXRpb24gdG8gZ2VuZXJhbGl6ZSBzZXJpYWxpemF0aW9uIHJvdXRpbmVzLgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAoIWlzc2V0KHNlbGY6OiRfVFNQRUMpKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic2VsZjo6JF9UU1BFQyA9IGFycmF5KCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpbmRlbnQob3V0KSA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiID0+IGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIid2YXInID0+ICciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIHQpOwotICAgIGluZGVudChvdXQpIDw8ICIpLCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIiAgKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBQSFAKLSAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKLSAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBnZW5lcmF0ZV9waHBfZG9jKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCAiY2xhc3MgIiA8PCBwaHBfbmFtZXNwYWNlX2RlY2xhcmF0aW9uKHRzdHJ1Y3QpOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICIgZXh0ZW5kcyAiCi0gICAgICAgIDw8ICJURXhjZXB0aW9uIjsKLSAgfSBlbHNlIGlmIChvb3BfKSB7Ci0gICAgb3V0IDw8ICIgZXh0ZW5kcyAiCi0gICAgICAgIDw8ICJUQmFzZSI7Ci0gIH0KLSAgaWYgKGpzb25fc2VyaWFsaXphYmxlXykgewotICAgIG91dCA8PCAiIGltcGxlbWVudHMgSnNvblNlcmlhbGl6YWJsZSI7Ci0gIH0KLSAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN0YXRpYyAkX1RTUEVDOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZHZhbCA9ICJudWxsIjsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAhKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICAgIGdlbmVyYXRlX3BocF9kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICQiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQotICBzdHJpbmcgcGFyYW0gPSAobWVtYmVycy5zaXplKCkgPiAwKSA/ICIkdmFscz1udWxsIiA6ICIiOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgiIDw8IHBhcmFtIDw8ICIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoaXNfYXJyYXkoJHZhbHMpKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmIChvb3BfKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInBhcmVudDo6X19jb25zdHJ1Y3Qoc2VsZjo6JF9UU1BFQywgJHZhbHMpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChpc3NldCgkdmFsc1snIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiddKSkgeyIgPDwgZW5kbAotICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJHRoaXMtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkdmFsc1snIgotICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICciCi0gICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOwotICBpZiAobmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKLSAgICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgaWYgKG5lZWRzX3BocF93cml0ZV92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgewotICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgaWYgKGpzb25fc2VyaWFsaXphYmxlXykgewotICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoJGlucHV0KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAob29wXykgewotICAgIGlmIChuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiR0bXAgPSAkdGhpcy0+X3JlYWQoJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJywgc2VsZjo6JF9UU1BFQywgJGlucHV0KTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JSZWFkKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdG1wOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3JlYWQoJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJywgc2VsZjo6JF9UU1BFQywgJGlucHV0KTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkZm5hbWUgPSBudWxsOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiRmdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkZmlkID0gMDsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzCi0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICB0X2ZpZWxkIGZmdHlwZShnX3R5cGVfYnl0ZSwgImZ0eXBlIik7Ci0gICAgdF9maWVsZCBmZmlkKGdfdHlwZV9pMTYsICJmaWQiKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZnR5cGUpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRmdHlwZSA9PSAiCi0gICAgICAgIDw8ICJUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZpZCk7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOyIgPDwgZW5kbDsKLSAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIgotICAgICAgICAgICAgICAgIDw8ICJUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoICgkZmlkKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICIKLSAgICAgICAgICAgICAgICAgIDw8ICJUUHJvdG9jb2w6OnNraXBCaW5hcnkoJGlucHV0LCAkZnR5cGUpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICIKLSAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sOjpza2lwQmluYXJ5KCRpbnB1dCwgJGZ0eXBlKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChvdXQpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgewotICAgIGluZGVudChvdXQpIDw8ICIkdGhpcy0+X3ZhbGlkYXRlRm9yUmVhZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJiRvdXRwdXQpIHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KSB7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPl92YWxpZGF0ZUZvcldyaXRlKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKG9vcF8pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR0aGlzLT5fd3JpdGUoJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJywgc2VsZjo6JF9UU1BFQywgJG91dHB1dCk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICIkeGZlciA9IDA7IiA8PCBlbmRsOwotCi0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCR0aGlzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIHN0cmluZyBleHBlY3Q7Ci0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBleHBlY3QgPSAiYXJyYXkiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIGV4cGVjdCA9ICJvYmplY3QiOwotICAgIH0KLSAgICBpZiAoIWV4cGVjdC5lbXB0eSgpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghaXNfIiA8PCBleHBlY3QgPDwgIigkdGhpcy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikpIHsiCi0gICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgIgotICAgICAgICAgIDw8ICJUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB0eXBlIGluIHN0cnVjdHVyZS4nLCAiCi0gICAgICAgICAgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIik7IgotICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnbicsICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCIKLSAgICAgICAgICAgICAgICAgIDw8ICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKLSAgICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIgotICAgICAgICA8PCAiVFR5cGU6OlNUT1ApOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZF92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0LCAiX3ZhbGlkYXRlRm9yUmVhZCIsIGZhbHNlKTsKLX0KLQotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCwgIl92YWxpZGF0ZUZvcldyaXRlIiwgdHJ1ZSk7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVfbW9kZSkgewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IG1ldGhvZF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLSAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQKLSAgICAgICAgICB8fCAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUICYmIHdyaXRlX21vZGUpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoJHRoaXMtPiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9PT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdSZXF1aXJlZCBmaWVsZCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi4iCi0gICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJyk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9qc29uX3NlcmlhbGl6ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAobmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JXcml0ZSgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICIkanNvbiA9IG5ldyBzdGRDbGFzczsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7Ci0gICAgICBjb25zdCBzdHJpbmcmIG5hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICAgIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgICBpZiAoIShrZXlfdHlwZS0+aXNfYmFzZV90eXBlKCkgfHwga2V5X3R5cGUtPmlzX2VudW0oKSkpIHsKLSAgICAgICAgICAvLyBKU09OIG9iamVjdCBrZXlzIG11c3QgYmUgc3RyaW5ncy4gUEhQJ3MganNvbl9lbmNvZGUoKQotICAgICAgICAgIC8vIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhbnkgc2NhbGFyIGtleSB0byBzdHJpbmdzLCBidXQKLSAgICAgICAgICAvLyB3ZSBza2lwIHRocmlmdCBtYXBzIHdpdGggbm9uLXNjYWxhciBrZXlzLgotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCR0aGlzLT4iIDw8IG5hbWUgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIiRqc29uLT4iIDw8IG5hbWUgPDwgIiA9ICI7Ci0gICAgICBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgICAgb3V0IDw8ICIob2JqZWN0KSI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIiR0aGlzLT4iIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiAkanNvbjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotaW50IHRfcGhwX2dlbmVyYXRvcjo6Z2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcywgYm9vbCB3cml0ZV9tb2RlKSB7Ci0gIGludCBudW1fcmVxID0gMDsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVECi0gICAgICAgICAgfHwgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQgJiYgd3JpdGVfbW9kZSkpIHsKLSAgICAgICAgKytudW1fcmVxOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gbnVtX3JlcTsKLX0KLQotYm9vbCB0X3BocF9nZW5lcmF0b3I6Om5lZWRzX3BocF93cml0ZV92YWxpZGF0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIHJldHVybiAodmFsaWRhdGVfICYmICFpc19yZXN1bHQgJiYgIXRzdHJ1Y3QtPmlzX3VuaW9uKCkKLSAgICAgICAgICAmJiBnZXRfcGhwX251bV9yZXF1aXJlZF9maWVsZHModHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgdHJ1ZSkgPiAwKTsKLX0KLQotYm9vbCB0X3BocF9nZW5lcmF0b3I6Om5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKLSAgcmV0dXJuICh2YWxpZGF0ZV8gJiYgIWlzX3Jlc3VsdAotICAgICAgICAgICYmIChnZXRfcGhwX251bV9yZXF1aXJlZF9maWVsZHModHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgZmFsc2UpID4gMCkpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgc2VydmljZV9uYW1lXyArICIucGhwIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwgIjw/cGhwIiA8PCBlbmRsOwotICBpZiAoICEgcGhwX25hbWVzcGFjZV9zdWZmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpLmVtcHR5KCkgKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAibmFtZXNwYWNlICIgPDwgcGhwX25hbWVzcGFjZV9zdWZmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgcGhwX2luY2x1ZGVzKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgaWYgKHJlc3RfKSB7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRzZXJ2aWNlKTsKLSAgfQotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGlmIChwaHBzXykgewotICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKLSAgfQotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfc2VydmljZV8gPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGhhbmRsZXJfID0gbnVsbDsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhhbmRsZXIpIHsiIDw8IGVuZGw7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICR0aGlzLT5oYW5kbGVyXyA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHBhcmVudDo6X19jb25zdHJ1Y3QoJGhhbmRsZXIpOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCRpbnB1dCwgJG91dHB1dCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkZm5hbWUgPSBudWxsOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIHRfZmllbGQgZmZuYW1lKGdfdHlwZV9zdHJpbmcsICJmbmFtZSIpOwotICAgIHRfZmllbGQgZm10eXBlKGdfdHlwZV9ieXRlLCAibXR5cGUiKTsKLSAgICB0X2ZpZWxkIGZzZXFpZChnX3R5cGVfaTMyLCAicnNlcWlkIik7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlXywgJmZmbmFtZSwgIiIsIHRydWUpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV8sICZmbXR5cGUsICIiLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfLCAmZnNlcWlkLCAiIiwgdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBIT1Q6IGNoZWNrIGZvciBtZXRob2QgaW1wbGVtZW50YXRpb24KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJG1ldGhvZG5hbWUgPSAncHJvY2Vzc18nLiRmbmFtZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiaWYgKCFtZXRob2RfZXhpc3RzKCR0aGlzLCAkbWV0aG9kbmFtZSkpIHsiIDw8IGVuZGw7Ci0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IFxcRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nKTsiCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgJGlucHV0LT5za2lwKCIKLSAgICAgICAgICAgICAgIDw8ICJUVHlwZTo6U1RSVUNUKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJGlucHV0LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJHggPSBuZXcgIgotICAgICAgICAgICAgICAgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbignRnVuY3Rpb24gJy4kZm5hbWUuJyBub3QgaW1wbGVtZW50ZWQuJywgIgotICAgICAgICAgICAgICAgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJGZuYW1lLCAiCi0gICAgICAgICAgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04sICRyc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgJHgtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiCi0gICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiR0aGlzLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgPDwgIigkc2VxaWQsICRpbnB1dCwgJG91dHB1dCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCi0gICAgICAgICAgICAgICAgICAgICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKLSAgICAgICAgICAgICAgICAgICAgICArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiJGFyZ3MtPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Ci0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiJHJlc3VsdC0+c3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiJHRoaXMtPmhhbmRsZXJfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIkYXJncy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoIgotICAgICAgICAgICAgICAgICA8PCBwaHBfbmFtZXNwYWNlKGdldF90cnVlX3R5cGUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKS0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgJCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiCi0gICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkIgotICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkb3V0cHV0IGluc3RhbmNlb2YgIgotICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IgotICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCRiaW5fYWNjZWwpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KCRvdXRwdXQsICciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgIDw8ICInLCAiCi0gICAgICAgICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6UkVQTFksICRyZXN1bHQsICRzZXFpZCwgJG91dHB1dC0+aXNTdHJpY3RXcml0ZSgpKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkYnVmZiA9IHBhY2soJ04nLCAoMHg4MDAxMDAwMCB8ICIKLSAgICAgICAgICAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJFUExZKSk7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gcGFjaygnTicsIHN0cmxlbignIgotICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkYnVmZiAuPSAnIgotICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gcGFjaygnTicsICRzZXFpZCk7IgotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmZsdXNoKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgIgotICAgICAgICAgICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6UkVQTFksICRzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkb3V0cHV0KTsiCi0gICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgIi8vIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOwotICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzKTsKLSAgICBnZW5lcmF0ZV9waHBfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgICB0cy0+c2V0X25hbWUobmFtZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gICAgfQotCi0gICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICAgIH0KLQotICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCi0gICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19pZiA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgICAgICAgICAgICAgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSArICJJZiI7Ci0gIH0KLSAgZ2VuZXJhdGVfcGhwX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIGZfc2VydmljZV8gPDwgImludGVyZmFjZSAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHNlcnZpY2UpIDw8ICJJZiIgPDwgZXh0ZW5kc19pZiA8PCAiIHsiCi0gICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3BocF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFJFU1QgaW50ZXJmYWNlCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCi0gICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19pZiA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgICAgICAgICAgICAgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSArICJSZXN0IjsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3QiIDw8IGV4dGVuZHNfaWYgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRpbXBsXzsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaW1wbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIgICR0aGlzLT5pbXBsXyA9ICRpbXBsOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoJHJlcXVlc3QpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIHN0cmluZyBjYXN0ID0gdHlwZV90b19jYXN0KGF0eXBlKTsKLSAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3RbJyIgKyAoKmFfaXRlciktPmdldF9uYW1lKCkgKyAiJ10iOwotICAgICAgaWYgKGF0eXBlLT5pc19ib29sKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IGNhc3QgPDwgIighZW1wdHkoIiA8PCByZXEKLSAgICAgICAgICAgICAgICAgICA8PCAiKSAmJiAoIiA8PCByZXEgPDwgIiAhPT0gJ2ZhbHNlJykpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gaXNzZXQoIiA8PCByZXEgPDwgIikgPyAiCi0gICAgICAgICAgICAgICAgICAgPDwgY2FzdCA8PCByZXEgPDwgIiA6IG51bGw7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaWYgKGF0eXBlLT5pc19zdHJpbmcoKSAmJiAoKHRfYmFzZV90eXBlKilhdHlwZSktPmlzX3N0cmluZ19saXN0KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBleHBsb2RlKCcsJywgJCIKLSAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmIChhdHlwZS0+aXNfbWFwKCkgfHwgYXR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGpzb25fZGVjb2RlKCQiCi0gICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIHRydWUpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gYXJyYXlfZmlsbF9rZXlzKGpzb25fZGVjb2RlKCQiCi0gICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIHRydWUpLCAxKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19zdHJ1Y3QoKSB8fCBhdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IG5ldyAiCi0gICAgICAgICAgICAgICAgICAgPDwgcGhwX25hbWVzcGFjZShhdHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgYXR5cGUtPmdldF9uYW1lKCkgPDwgIihqc29uX2RlY29kZSgkIgotICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCB0cnVlKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJHRoaXMtPmltcGxfLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIKLSAgICAgICAgICAgICAgIDw8IGFyZ3VtZW50X2xpc3QoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLCBmYWxzZSkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHMKLSAgICAgICAgICAgICAgICAgICAgICsgIkNsaWVudCI7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8ICJjbGFzcyAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHNlcnZpY2UpIDw8ICJDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50Ci0gICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzICIgPDwgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYgeyIKLSAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBQcml2YXRlIG1lbWJlcnMKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaW5wdXRfID0gbnVsbDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgJG91dHB1dF8gPSBudWxsOyIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkc2VxaWRfID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaW5wdXQsICRvdXRwdXQ9bnVsbCkgeyIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHBhcmVudDo6X19jb25zdHJ1Y3QoJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW5wdXRfID0gJGlucHV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgJHRoaXMtPm91dHB1dF8gPSAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiR0aGlzLT5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiJHRoaXMtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkYXJncy0+IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJCIKLSAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkdGhpcy0+b3V0cHV0XyBpbnN0YW5jZW9mICIKLSAgICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIHN0cmluZyBtZXNzYWdlVHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlOjpPTkVXQVkiIDogIlRNZXNzYWdlVHlwZTo6Q0FMTCI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KCR0aGlzLT5vdXRwdXRfLCAnIgotICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlCi0gICAgICAgICAgICAgICA8PCAiLCAkYXJncywgJHRoaXMtPnNlcWlkXywgJHRoaXMtPm91dHB1dF8tPmlzU3RyaWN0V3JpdGUoKSk7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgPSBwYWNrKCdOJywgKDB4ODAwMTAwMDAgfCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIpKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIgPDwgZnVubmFtZSA8PCAiJykpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gJyIgPDwgZnVubmFtZSA8PCAiJzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiRidWZmIC49IHBhY2soJ04nLCAkdGhpcy0+c2VxaWRfKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgbWVzc2FnZVR5cGUgPDwgIiwgJHRoaXMtPnNlcWlkXyk7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRhcmdzLT53cml0ZSgkYnVmZik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPmZsdXNoKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJHRoaXMtPm91dHB1dF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCR0aGlzLT5pbnB1dF8gaW5zdGFuY2VvZiAiCi0gICAgICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkiCi0gICAgICAgICAgICAgICAgIDw8ICIgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnknKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgImlmICgkYmluX2FjY2VsKSAkcmVzdWx0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KCR0aGlzLT5pbnB1dF8sICciCi0gICAgICAgICAgICAgICAgIDw8IHJlc3VsdG5hbWUgPDwgIicsICR0aGlzLT5pbnB1dF8tPmlzU3RyaWN0UmVhZCgpKTsiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICB0X2ZpZWxkIGZmbmFtZShnX3R5cGVfc3RyaW5nLCAiZm5hbWUiKTsKLSAgICAgICAgdF9maWVsZCBmc2VxaWQoZ190eXBlX2kzMiwgInJzZXFpZCIpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkdmVyID0gdW5wYWNrKCdOJywgJHRoaXMtPmlucHV0Xy0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR2ZXIgPSAkdmVyWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG10eXBlID0gJHZlciAmIDB4ZmY7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR2ZXIgPSAkdmVyICYgMHhmZmZmMDAwMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICA8PCAiaWYgKCR2ZXIgIT0gMHg4MDAxMDAwMCkgdGhyb3cgbmV3ICIKLSAgICAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgdmVyc2lvbiBpZGVudGlmaWVyOiAnLiR2ZXIsICIKLSAgICAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7IiA8PCBlbmRsOwotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfLCAmZmZuYW1lLCAiIiwgdHJ1ZSk7Ci0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV8sICZmc2VxaWQsICIiLCB0cnVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoJG10eXBlID09ICIKLSAgICAgICAgICAgICAgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJHggPSBuZXcgIgotICAgICAgICAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJHgtPnJlYWQoJHRoaXMtPmlucHV0Xyk7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJHRoaXMtPmlucHV0Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICA8PCAiICB0aHJvdyAkeDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiRyZXN1bHQtPnJlYWQoJHRoaXMtPmlucHV0Xyk7IiA8PCBlbmRsOwotCi0gICAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoJHJlc3VsdC0+c3VjY2VzcyAhPT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiAkcmVzdWx0LT5zdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyAkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgXFxFeGNlcHRpb24oXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSB7Ci0KLSAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICBzdGQ6OnN0cmluZyBpdHJhbnMgPSAoaW5jbGFzcyA/ICIkdGhpcy0+aW5wdXRfIiA6ICIkaW5wdXQiKTsKLQotICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkbGVuID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRsZW4gPSAkbGVuWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRsZW4gPiAweDdmZmZmZmZmKSB7IgotICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJGxlbiA9IDAgLSAoKCRsZW4gLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKCRsZW4pOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSB1bnBhY2soJ2MnLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDEpKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gKGJvb2wpJCIgPDwgbmFtZSA8PCAiWzFdOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gdW5wYWNrKCdjJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgxKSk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICQiIDw8IG5hbWUgPDwgIlsxXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHZhbCA9IHVucGFjaygnbicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoMikpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdmFsID0gJHZhbFsxXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkdmFsID4gMHg3ZmZmKSB7IgotICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICR2YWw7IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSB1bnBhY2soJ04nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDQpKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZmZmZmYpIHsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkdmFsID0gMCAtICgoJHZhbCAtIDEpIF4gMHhmZmZmZmZmZik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICR2YWw7IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRhcnIgPSB1bnBhY2soJ04yJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg4KSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgkYXJyWzFdICYgMHg4MDAwMDAwMCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgIDw8ICIgICRhcnJbMV0gPSAkYXJyWzFdIF4gMHhGRkZGRkZGRjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICA8PCAiICAkYXJyWzJdID0gJGFyclsyXSBeIDB4RkZGRkZGRkY7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICQiIDw8IG5hbWUKLSAgICAgICAgICAgICAgICA8PCAiID0gMCAtICRhcnJbMV0qNDI5NDk2NzI5NiAtICRhcnJbMl0gLSAxOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkIiA8PCBuYW1lIDw8ICIgPSAkYXJyWzFdKjQyOTQ5NjcyOTYgKyAkYXJyWzJdOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRhcnIgPSB1bnBhY2soJ2QnLCBzdHJyZXYoIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg4KSkpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkYXJyWzFdOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkKLSAgICAgICAgICAgICAgICArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgIDw8ICIkdmFsID0gJHZhbFsxXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkdmFsID4gMHg3ZmZmZmZmZikgeyIgPDwgZW5kbAotICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAkdmFsID0gMCAtICgoJHZhbCAtIDEpIF4gMHhmZmZmZmZmZik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IgotICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLQotICAgICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT4iOwotCi0gICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICAgIG91dCA8PCAicmVhZEkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAotICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCi0gKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAotICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHBocF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJCIgPDwgcHJlZml4Ci0gICAgICA8PCAiLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gYXJyYXkoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHNpemUgPDwgIiA9IDA7IgotICAgICAgPDwgZW5kbDsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwga3R5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCB2dHlwZSA8PCAiID0gMDsiCi0gICAgICAgIDw8IGVuZGw7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma3R5cGUpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZ0eXBlKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigiCi0gICAgICAgICAgPDwgIiQiIDw8IGt0eXBlIDw8ICIsICQiIDw8IHZ0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZldHlwZSk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCIKLSAgICAgICAgICA8PCAiJCIgPDwgZXR5cGUgPDwgIiwgJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZldHlwZSk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigiCi0gICAgICAgICAgPDwgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8ICJmb3IgKCQiIDw8IGkgPDwgIiA9IDA7ICQiIDw8IGkgPDwgIiA8ICQiIDw8IHNpemUgPDwgIjsgKyskIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiWyQiIDw8IGtleSA8PCAiXSA9ICQiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8ICJpZiAoaXNfc2NhbGFyKCQiIDw8IGVsZW0gPDwgIikpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICQiIDw8IHByZWZpeCA8PCAiWyQiIDw8IGVsZW0gPDwgIl0gPSB0cnVlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAkIiA8PCBwcmVmaXggPDwgIiBbXT0gJCIgPDwgZWxlbSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8ICIkIiA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiIFtdPSAkIiA8PCBlbGVtIDw8ICI7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCBzdHJsZW4oJCIgPDwgbmFtZSA8PCAiKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgIDw8ICIkb3V0cHV0IC49ICQiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICQiIDw8IG5hbWUgPDwgIiA/IDEgOiAwKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICQiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnbicsICQiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnTicsICQiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnTjInLCAkIiA8PCBuYW1lIDw8ICIgPj4gMzIsICQiIDw8IG5hbWUKLSAgICAgICAgICAgICAgPDwgIiAmIDB4RkZGRkZGRkYpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdkJywgJCIgPDwgbmFtZSA8PCAiKSk7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotCi0gICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+IjsKLQotICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGVzIG91dCBhIGNvbnRhaW5lcgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQotICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIgotICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnbCcsIGNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlTWFwQmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKLSAgICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgIDw8ICJjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQotICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnbCcsIGNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSkpOyIKLSAgICAgICAgICA8PCBlbmRsOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQotICAgICAgICAgICAgICAgICAgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgPDwgImNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKLSAgICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiCi0gICAgICAgICAgPDwgZW5kbDsKLQotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQotICAgICAgICAgICAgICAgICAgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgPDwgImNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKLSAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICIKLSAgICAgICAgICAgICAgICA8PCAiJCIgPDwga2l0ZXIgPDwgIiA9PiAkIiA8PCB2aXRlciA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgc3RyaW5nIGl0ZXJfdmFsID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICQiIDw8IGl0ZXIgPDwgIiA9PiAkIiA8PCBpdGVyX3ZhbCA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoaXNfc2NhbGFyKCQiIDw8IGl0ZXJfdmFsIDw8ICIpKSB7IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyX3ZhbCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgkIiA8PCBwcmVmaXggPDwgIiBhcyAkIiA8PCBpdGVyIDw8ICIpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIEVtaXRzIGEgUEhQRG9jIGNvbW1lbnQgZm9yIHRoZSBnaXZlbiBjb250ZW50cwotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2RvY3N0cmluZ19jb21tZW50KG9mc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgewotICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBjb250ZW50cywgIiAqL1xuIik7Ci19Ci0KLS8qKgotICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2Mob2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIFBIUERvYyBjb21tZW50IGZvciBhIGZpZWxkCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7Ci0gIHN0cmluZ3N0cmVhbSBzczsKLQotICAvLyBwcmVwZW5kIGZyZWUtc3R5bGUgZG9jIGlmIGF2YWlsYWJsZQotICBpZiAoZmllbGQtPmhhc19kb2MoKSkgewotICAgIHNzIDw8IGZpZWxkLT5nZXRfZG9jKCkgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGFwcGVuZCBAdmFyIHRhZwotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgc3MgPDwgIkB2YXIgIiA8PCB0eXBlX3RvX3BocGRvYyh0eXBlKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChvdXQsIHNzLnN0cigpKTsKLX0KLQotLyoqCi0gKiBFbWl0cyBhIFBIUERvYyBjb21tZW50IGZvciBhIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKSB7Ci0gIHN0cmluZ3N0cmVhbSBzczsKLSAgaWYgKGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKLSAgICBzcyA8PCBmdW5jdGlvbi0+Z2V0X2RvYygpIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBnZW5lcmF0ZSBwYXJhbWV0ZXIgdHlwZXMgZG9jCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICBmb3IgKGFfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYV9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgdF9maWVsZCogYXJnID0gKmFfaXRlcjsKLSAgICBzcyA8PCAiQHBhcmFtICIgPDwgdHlwZV90b19waHBkb2MoYXJnLT5nZXRfdHlwZSgpKSA8PCAiICQiIDw8IGFyZy0+Z2V0X25hbWUoKTsKLSAgICBpZiAoYXJnLT5oYXNfZG9jKCkpIHsKLSAgICAgIHNzIDw8ICIgIiA8PCBhcmctPmdldF9kb2MoKTsKLSAgICB9Ci0gICAgc3MgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGdlbmVyYXRlIHJldHVybiB0eXBlIGRvYwotICB0X3R5cGUqIHJldF90eXBlID0gZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIGlmICghcmV0X3R5cGUtPmlzX3ZvaWQoKSB8fCByZXRfdHlwZS0+aGFzX2RvYygpKSB7Ci0gICAgc3MgPDwgIkByZXR1cm4gIiA8PCB0eXBlX3RvX3BocGRvYyhyZXRfdHlwZSk7Ci0gICAgaWYgKHJldF90eXBlLT5oYXNfZG9jKCkpIHsKLSAgICAgIHNzIDw8ICIgIiA8PCByZXRfdHlwZS0+Z2V0X2RvYygpOwotICAgIH0KLSAgICBzcyA8PCBlbmRsOwotICB9Ci0KLSAgLy8gZ2VuZXJhdGUgZXhjZXB0aW9ucyBkb2MKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZXhjcyA9IGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKLSAgZm9yIChlX2l0ZXIgPSBleGNzLmJlZ2luKCk7IGVfaXRlciAhPSBleGNzLmVuZCgpOyArK2VfaXRlcikgewotICAgIHRfZmllbGQqIGV4YyA9ICplX2l0ZXI7Ci0gICAgc3MgPDwgIkB0aHJvd3MgIiA8PCB0eXBlX3RvX3BocGRvYyhleGMtPmdldF90eXBlKCkpOwotICAgIGlmIChleGMtPmhhc19kb2MoKSkgewotICAgICAgc3MgPDwgIiAiIDw8IGV4Yy0+Z2V0X2RvYygpOwotICAgIH0KLSAgICBzcyA8PCBlbmRsOwotICB9Ci0KLSAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOwotfQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIkIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gJyciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IDAuMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IGFycmF5KCkiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgaWYgKG9iaikgewotICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLSAgcmV0dXJuIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGFkZFR5cGVIaW50cykgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLQotICAgIHRfdHlwZSogdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLQotICAgIC8vIFNldCB0eXBlIG5hbWUKLSAgICBpZiAoYWRkVHlwZUhpbnRzKSB7Ci0gICAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgICAgc3RyaW5nIGNsYXNzTmFtZSA9IHBocF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGhwX25hbWVzcGFjZV9kaXJlY3RvcnkoIkRlZmluaXRpb24iLCBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2xhc3NpZnkodHlwZS0+Z2V0X25hbWUoKSk7Ci0KLSAgICAgICAgcmVzdWx0ICs9IGNsYXNzTmFtZSArICIgIjsKLSAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgICAgcmVzdWx0ICs9ICJhcnJheSAiOwotICAgICAgfQotICAgIH0KLQotICAgIHJlc3VsdCArPSAiJCIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBHZXRzIGEgdHlwZWNhc3Qgc3RyaW5nIGZvciBhIHBhcnRpY3VsYXIgdHlwZS4KLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6dHlwZV90b19jYXN0KHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZSogYnR5cGUgPSAodF9iYXNlX3R5cGUqKXR5cGU7Ci0gICAgc3dpdGNoIChidHlwZS0+Z2V0X2Jhc2UoKSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiKGJvb2wpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIihpbnQpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiKGRvdWJsZSkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICIoc3RyaW5nKSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICIoaW50KSI7Ci0gIH0KLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGU6OlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZTo6Qk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZTo6QllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGU6Okk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpJMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpTVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TFNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFBIUERvYyBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjp0eXBlX3RvX3BocGRvYyh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gInZvaWQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJzdHJpbmciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiYm9vbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJpbnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJpbnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJpbnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJpbnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJkb3VibGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImludCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiBwaHBfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiYXJyYXkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSBzdGF0aWNfY2FzdDx0X3NldCo+KHR5cGUpOwotICAgIHRfdHlwZSogdF9lbGVtID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGlmICh0X2VsZW0tPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXR1cm4gIigiICsgdHlwZV90b19waHBkb2ModF9lbGVtKSArICIpW10iOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdHlwZV90b19waHBkb2ModF9lbGVtKSArICJbXSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfbGlzdCogdGxpc3QgPSBzdGF0aWNfY2FzdDx0X2xpc3QqPih0eXBlKTsKLSAgICB0X3R5cGUqIHRfZWxlbSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgaWYgKHRfZWxlbS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX3BocGRvYyh0X2VsZW0pICsgIilbXSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB0eXBlX3RvX3BocGRvYyh0X2VsZW0pICsgIltdIjsKLSAgICB9Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCi0gICAgcGhwLAotICAgICJQSFAiLAotICAgICIgICAgaW5saW5lZDogICAgICAgICBHZW5lcmF0ZSBQSFAgaW5saW5lZCBmaWxlc1xuIgotICAgICIgICAgc2VydmVyOiAgICAgICAgICBHZW5lcmF0ZSBQSFAgc2VydmVyIHN0dWJzXG4iCi0gICAgIiAgICBvb3A6ICAgICAgICAgICAgIEdlbmVyYXRlIFBIUCB3aXRoIG9iamVjdCBvcmllbnRlZCBzdWJjbGFzc2VzXG4iCi0gICAgIiAgICByZXN0OiAgICAgICAgICAgIEdlbmVyYXRlIFBIUCBSRVNUIHByb2Nlc3NvcnNcbiIKLSAgICAiICAgIG5zZ2xvYmFsPU5BTUU6ICAgU2V0IGdsb2JhbCBuYW1lc3BhY2VcbiIKLSAgICAiICAgIHZhbGlkYXRlOiAgICAgICAgR2VuZXJhdGUgUEhQIHZhbGlkYXRvciBtZXRob2RzXG4iCi0gICAgIiAgICBqc29uOiAgICAgICAgICAgIEdlbmVyYXRlIEpzb25TZXJpYWxpemFibGUgY2xhc3NlcyAocmVxdWlyZXMgUEhQID49IDUuNClcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM0M2IxZi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKioKLSAqIFB5dGhvbiBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfcHlfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9weV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm5ld19zdHlsZSIpOwotICAgIGdlbl9uZXdzdHlsZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgic2xvdHMiKTsKLSAgICBnZW5fc2xvdHNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImR5bmFtaWMiKTsKLSAgICBnZW5fZHluYW1pY18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpZiAoZ2VuX2R5bmFtaWNfKSB7Ci0gICAgICBnZW5fbmV3c3R5bGVfID0gMDsgLy8gZHluYW1pYyBpcyBuZXdzdHlsZQotICAgICAgZ2VuX2R5bmJhc2VjbGFzc18gPSAiVEJhc2UiOwotICAgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gIlRFeGNlcHRpb25CYXNlIjsKLSAgICAgIGltcG9ydF9keW5iYXNlXyA9ICJmcm9tIHRocmlmdC5wcm90b2NvbC5UQmFzZSBpbXBvcnQgVEJhc2UsIFRFeGNlcHRpb25CYXNlLCBUVHJhbnNwb3J0XG4iOwotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJkeW5iYXNlIik7Ci0gICAgaWYgKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpIHsKLSAgICAgIGdlbl9keW5iYXNlXyA9IHRydWU7Ci0gICAgICBnZW5fZHluYmFzZWNsYXNzXyA9IChpdGVyLT5zZWNvbmQpOwotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJkeW5leGMiKTsKLSAgICBpZiAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSkgewotICAgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gKGl0ZXItPnNlY29uZCk7Ci0gICAgfQotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImR5bmltcG9ydCIpOwotICAgIGlmIChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKSB7Ci0gICAgICBnZW5fZHluYmFzZV8gPSB0cnVlOwotICAgICAgaW1wb3J0X2R5bmJhc2VfID0gKGl0ZXItPnNlY29uZCk7Ci0gICAgfQotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInR3aXN0ZWQiKTsKLSAgICBnZW5fdHdpc3RlZF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgidG9ybmFkbyIpOwotICAgIGdlbl90b3JuYWRvXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGlmIChnZW5fdHdpc3RlZF8gJiYgZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgICB0aHJvdyAiYXQgbW9zdCBvbmUgb2YgJ3R3aXN0ZWQnIGFuZCAndG9ybmFkbycgYXJlIGFsbG93ZWQiOwotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ1dGY4c3RyaW5ncyIpOwotICAgIGdlbl91dGY4c3RyaW5nc18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiY29kaW5nIik7Ci0gICAgaWYgKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpIHsKLSAgICAgICAgY29kaW5nXyA9IGl0ZXItPnNlY29uZDsKLSAgICB9Ci0KLSAgICBjb3B5X29wdGlvbnNfID0gb3B0aW9uX3N0cmluZzsKLQotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5LnR3aXN0ZWQiOwotICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1weS50b3JuYWRvIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkiOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcHlfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0ZDo6c3RyaW5nIHB5X2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGludGVyZmFjZSA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHByZSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwb3N0ID0gTlVMTCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RhdGljIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7Ci0gICAgcmV0dXJuIHN1Yl9uYW1lc3BhY2UgPT0gInR3aXN0ZWQiOwotICB9Ci0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldF9yZWFsX3B5X21vZHVsZShjb25zdCB0X3Byb2dyYW0qIHByb2dyYW0sIGJvb2wgZ2VuX3R3aXN0ZWQpIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWQpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHR3aXN0ZWRfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgicHkudHdpc3RlZCIpOwotICAgICAgaWYgKCF0d2lzdGVkX21vZHVsZS5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiB0d2lzdGVkX21vZHVsZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyByZWFsX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoInB5Iik7Ci0gICAgaWYgKHJlYWxfbW9kdWxlLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwcm9ncmFtLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVhbF9tb2R1bGU7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIG5ldy1zdHlsZSBjbGFzc2VzLgotICAgKi8KLSAgYm9vbCBnZW5fbmV3c3R5bGVfOwotCi0gIC8qKgotICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGR5bmFtaWMgc3R5bGUgY2xhc3Nlcy4KLSAgKi8KLSAgYm9vbCBnZW5fZHluYW1pY187Ci0KLSAgYm9vbCBnZW5fZHluYmFzZV87Ci0gIHN0ZDo6c3RyaW5nIGdlbl9keW5iYXNlY2xhc3NfOwotICBzdGQ6OnN0cmluZyBnZW5fZHluYmFzZWNsYXNzX2V4Y187Ci0KLSAgc3RkOjpzdHJpbmcgaW1wb3J0X2R5bmJhc2VfOwotCi0gIGJvb2wgZ2VuX3Nsb3RzXzsKLQotICBzdGQ6OnN0cmluZyBjb3B5X29wdGlvbnNfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBUd2lzdGVkLWZyaWVuZGx5IFJQQyBzZXJ2aWNlcy4KLSAgICovCi0gIGJvb2wgZ2VuX3R3aXN0ZWRfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCBUb3JuYWRvCi0gICAqLwotICBib29sIGdlbl90b3JuYWRvXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZiBzdHJpbmdzIHNob3VsZCBiZSBlbmNvZGVkIHVzaW5nIHV0Zi04LgotICAgKi8KLSAgYm9vbCBnZW5fdXRmOHN0cmluZ3NfOwotCi0gIC8qKgotICAgKiBzcGVjaWZ5IGdlbmVyYXRlZCBmaWxlIGVuY29kaW5nCi0gICAqIGVnLiAjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQotICAgKi8KLSAgc3RyaW5nIGNvZGluZ187Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfY29uc3RzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotCi0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKLSAgc3RkOjpzdHJpbmcgbW9kdWxlXzsKLX07Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgc3RyaW5nIG1vZHVsZSA9IGdldF9yZWFsX3B5X21vZHVsZShwcm9ncmFtXywgZ2VuX3R3aXN0ZWRfKTsKLSAgcGFja2FnZV9kaXJfID0gZ2V0X291dF9kaXIoKTsKLSAgbW9kdWxlXyA9IG1vZHVsZTsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICAvLyBUT0RPOiBEbyBiZXR0ZXIgZXJyb3IgY2hlY2tpbmcgaGVyZS4KLSAgICBNS0RJUihwYWNrYWdlX2Rpcl8uY19zdHIoKSk7Ci0gICAgc3RkOjpvZnN0cmVhbSBpbml0X3B5KChwYWNrYWdlX2Rpcl8gKyAiL19faW5pdF9fLnB5IikuY19zdHIoKSwgc3RkOjppb3NfYmFzZTo6YXBwKTsKLSAgICBpbml0X3B5LmNsb3NlKCk7Ci0gICAgaWYgKG1vZHVsZS5lbXB0eSgpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gbW9kdWxlLmZpbmQoJy4nKTsKLSAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgewotICAgICAgcGFja2FnZV9kaXJfICs9ICIvIjsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSBtb2R1bGU7Ci0gICAgICBtb2R1bGUuY2xlYXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgcGFja2FnZV9kaXJfICs9ICIvIjsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSBtb2R1bGUuc3Vic3RyKDAsIHBvcyk7Ci0gICAgICBtb2R1bGUuZXJhc2UoMCwgcG9zICsgMSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgInR0eXBlcy5weSI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgImNvbnN0YW50cy5weSI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfaW5pdF9uYW1lID0gcGFja2FnZV9kaXJfICsgIi9fX2luaXRfXy5weSI7Ci0gIG9mc3RyZWFtIGZfaW5pdDsKLSAgZl9pbml0Lm9wZW4oZl9pbml0X25hbWUuY19zdHIoKSk7Ci0gIGZfaW5pdCA8PCAiX19hbGxfXyA9IFsndHR5cGVzJywgJ2NvbnN0YW50cyciOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgZl9pbml0IDw8ICIsICciIDw8ICgqc3ZfaXRlciktPmdldF9uYW1lKCkgPDwgIiciOwotICB9Ci0gIGZfaW5pdCA8PCAiXSIgPDwgZW5kbDsKLSAgZl9pbml0LmNsb3NlKCk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8IHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcHlfaW1wb3J0cygpIDw8IGVuZGwgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbAotICAgICAgICAgICA8PCByZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX2NvbnN0c18gPDwgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBweV9pbXBvcnRzKCkgPDwgZW5kbCA8PCAiZnJvbSB0dHlwZXMgaW1wb3J0ICoiCi0gICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgcmVzdWx0ICs9ICJpbXBvcnQgIiArIGdldF9yZWFsX3B5X21vZHVsZShpbmNsdWRlc1tpXSwgZ2VuX3R3aXN0ZWRfKSArICIudHR5cGVzXG4iOwotICB9Ci0gIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9ICJcbiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBhY2NlbGVyYXRlZCBUQmluYXJ5UHJvdG9jb2wKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIHsKLSAgc3RyaW5nIGhkciA9ICIiOwotICBpZiAoZ2VuX2R5bmFtaWNfKSB7Ci0gICAgaGRyICs9IHN0ZDo6c3RyaW5nKGltcG9ydF9keW5iYXNlXyk7Ci0gIH0gZWxzZSB7Ci0gICAgaGRyICs9ICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRcbiIKLSAgICAgICAgICAgImZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wsIFRQcm90b2NvbFxuIgotICAgICAgICAgICAidHJ5OlxuIgotICAgICAgICAgICAiICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgZmFzdGJpbmFyeVxuIgotICAgICAgICAgICAiZXhjZXB0OlxuIgotICAgICAgICAgICAiICBmYXN0YmluYXJ5ID0gTm9uZVxuIjsKLSAgfQotICByZXR1cm4gaGRyOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6cHlfYXV0b2dlbl9jb21tZW50KCkgewotICBzdHJpbmcgY29kaW5nOwotICBpZiAoIWNvZGluZ18uZW1wdHkoKSkgewotICAgICAgY29kaW5nID0gIiMgLSotIGNvZGluZzogIiArIGNvZGluZ18gKyAiIC0qLVxuIjsKLSAgfQotICByZXR1cm4gY29kaW5nICsgc3RkOjpzdHJpbmcoIiNcbiIpICsgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCi0gICAgICAgICArICIjXG4iICsgIiMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICIjXG4iCi0gICAgICAgICArICIjICBvcHRpb25zIHN0cmluZzogIiArIGNvcHlfb3B0aW9uc18gKyAiXG4iICsgIiNcbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6cHlfaW1wb3J0cygpIHsKLSAgcmV0dXJuIHN0cmluZygiZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUVHlwZSwgVE1lc3NhZ2VUeXBlLCBURXhjZXB0aW9uLCBUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUHl0aG9uLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCl0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHRvX3N0cmluZ19tYXBwaW5nLCBmcm9tX3N0cmluZ19tYXBwaW5nOwotCi0gIGZfdHlwZXNfIDw8ICJjbGFzcyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8IChnZW5fbmV3c3R5bGVfID8gIihvYmplY3QpIiA6ICIiKQotICAgICAgICAgICA8PCAoZ2VuX2R5bmFtaWNfID8gIigiICsgZ2VuX2R5bmJhc2VjbGFzc18gKyAiKSIgOiAiIikgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfdHlwZXNfLCB0ZW51bSk7Ci0KLSAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIl9WQUxVRVNfVE9fTkFNRVMgPSB7IiA8PCBlbmRsOwotICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJfTkFNRVNfVE9fVkFMVUVTID0geyIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCBlbmRsOwotCi0gICAgLy8gRGljdGlvbmFyaWVzIHRvL2Zyb20gc3RyaW5nIG5hbWVzIG9mIGVudW1zCi0gICAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgdmFsdWUgPDwgIjogXCIiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgZXNjYXBlX3N0cmluZygoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICJcIiwiIDw8IGVuZGw7Ci0gICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAnIicgPDwgZXNjYXBlX3N0cmluZygoKmNfaXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCI6ICIgPDwgdmFsdWUgPDwgJywnIDw8IGVuZGw7Ci0gIH0KLSAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl90eXBlc18gPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgdG9fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbCA8PCBmcm9tX3N0cmluZ19tYXBwaW5nLnN0cigpIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKLSAgZl9jb25zdHNfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIlRydWUiIDogIkZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCoqeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiIDogIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9KSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQgPDwgInNldCgiOwotICAgIH0KLSAgICBvdXQgPDwgIlsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiXSI7Ci0gICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQgPDwgIikiOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHl0aG9uIHN0cnVjdAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcHlfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9weV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBweXRob24gc3RydWN0Ci0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICAodm9pZClpc19yZXN1bHQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBzb3J0ZWRfbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgb3V0IDw8IHN0ZDo6ZW5kbCA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgaWYgKGdlbl9keW5hbWljXykgewotICAgICAgb3V0IDw8ICIoIiA8PCBnZW5fZHluYmFzZWNsYXNzX2V4Y18gPDwgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIihURXhjZXB0aW9uKSI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChnZW5fbmV3c3R5bGVfKSB7Ci0gICAgICBvdXQgPDwgIihvYmplY3QpIjsKLSAgICB9IGVsc2UgaWYgKGdlbl9keW5hbWljXykgewotICAgICAgb3V0IDw8ICIoIiA8PCBnZW5fZHluYmFzZWNsYXNzXyA8PCAiKSI7Ci0gICAgfQotICB9Ci0gIG91dCA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0c3RydWN0KTsKLQotICBvdXQgPDwgZW5kbDsKLQotICAvKgotICAgICBIZXJlIHdlIGdlbmVyYXRlIHRoZSBzdHJ1Y3R1cmUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGZhc3RiaW5hcnkgY29kZWMuCi0gICAgIFRoZXNlIHNwZWNpZmljYXRpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0gICAgIHRocmlmdF9zcGVjIC0+IHR1cGxlIG9mIGl0ZW1fc3BlYwotICAgICBpdGVtX3NwZWMgLT4gTm9uZSB8ICh0YWcsIHR5cGVfZW51bSwgbmFtZSwgc3BlY19hcmdzLCBkZWZhdWx0KQotICAgICB0YWcgLT4gaW50ZWdlcgotICAgICB0eXBlX2VudW0gLT4gVFR5cGUuSTMyIHwgVFR5cGUuU1RSSU5HIHwgVFR5cGUuU1RSVUNUIHwgLi4uCi0gICAgIG5hbWUgLT4gc3RyaW5nX2xpdGVyYWwKLSAgICAgZGVmYXVsdCAtPiBOb25lICAjIEhhbmRsZWQgYnkgX19pbml0X18KLSAgICAgc3BlY19hcmdzIC0+IE5vbmUgICMgRm9yIHNpbXBsZSB0eXBlcwotICAgICAgICAgICAgICAgIHwgKHR5cGVfZW51bSwgc3BlY19hcmdzKSAgIyBWYWx1ZSB0eXBlIGZvciBsaXN0L3NldAotICAgICAgICAgICAgICAgIHwgKHR5cGVfZW51bSwgc3BlY19hcmdzLCB0eXBlX2VudW0sIHNwZWNfYXJncykKLSAgICAgICAgICAgICAgICAgICMgS2V5IGFuZCB2YWx1ZSBmb3IgbWFwCi0gICAgICAgICAgICAgICAgfCAoY2xhc3NfbmFtZSwgc3BlY19hcmdzX3B0cikgIyBGb3Igc3RydWN0L2V4Y2VwdGlvbgotICAgICBjbGFzc19uYW1lIC0+IGlkZW50aWZpZXIgICMgQmFzaWNhbGx5IGEgcG9pbnRlciB0byB0aGUgY2xhc3MKLSAgICAgc3BlY19hcmdzX3B0ciAtPiBleHByZXNzaW9uICAjIGp1c3QgY2xhc3NfbmFtZS5zcGVjX2FyZ3MKLQotICAgICBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIG1ha2luZyB0aGlzIHdvcmsgZm9yIHN0cnVjdHMgd2l0aCBuZWdhdGl2ZSB0YWdzLgotICAqLwotCi0gIGlmIChnZW5fc2xvdHNfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIl9fc2xvdHNfXyA9IFsgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAobV9pdGVyID0gc29ydGVkX21lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IHNvcnRlZF9tZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwgIiciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiBdIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBUT0RPKGRyZWlzcyk6IExvb2sgaW50byBnZW5lcmF0aW5nIGFuIGVtcHR5IHR1cGxlIGluc3RlYWQgb2YgTm9uZQotICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCi0gIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cwotICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgotICBpZiAoc29ydGVkX21lbWJlcnMuZW1wdHkoKSB8fCAoc29ydGVkX21lbWJlcnNbMF0tPmdldF9rZXkoKSA+PSAwKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ0aHJpZnRfc3BlYyA9ICgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbnQgc29ydGVkX2tleXNfcG9zID0gMDsKLSAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLQotICAgICAgZm9yICg7IHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKTsgc29ydGVkX2tleXNfcG9zKyspIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIk5vbmUsICMgIiA8PCBzb3J0ZWRfa2V5c19wb3MgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCkgPDwgIigiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkKLSAgICAgICAgICAgICAgICAgIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgIDw8ICInIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiciCi0gICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fc3BlY19hcmdzKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUoKm1faXRlcikgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgPDwgIiksIgotICAgICAgICAgICAgICAgICAgPDwgIiAjICIgPDwgc29ydGVkX2tleXNfcG9zIDw8IGVuZGw7Ci0KLSAgICAgIHNvcnRlZF9rZXlzX3BvcysrOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhyaWZ0X3NwZWMgPSBOb25lIiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIjsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIC8vIFRoaXMgZmlsbHMgaW4gZGVmYXVsdCB2YWx1ZXMsIGFzIG9wcG9zZWQgdG8gbnVsbHMKLSAgICAgIG91dCA8PCAiICIgPDwgZGVjbGFyZV9hcmd1bWVudCgqbV9pdGVyKSA8PCAiLCI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIpOiIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgLy8gSW5pdGlhbGl6ZSBmaWVsZHMKLSAgICAgIHRfdHlwZSogdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgIGlmICghdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX2VudW0oKSAmJiAoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaXMgIgotICAgICAgICAgICAgICAgICAgICA8PCAic2VsZi50aHJpZnRfc3BlY1siIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICJdWzRdOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUoKm1faXRlcikKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICJzZWxmLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIGlmICghZ2VuX2R5bmFtaWNfKSB7Ci0gICAgZ2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICAgIGdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotCi0gIC8vIEZvciBleGNlcHRpb25zIG9ubHksIGdlbmVyYXRlIGEgX19zdHJfXyBtZXRob2QuIFRoaXMgaXMKLSAgLy8gYmVjYXVzZSB3aGVuIHJhaXNlZCBleGNlcHRpb25zIGFyZSBwcmludGVkIHRvIHRoZSBjb25zb2xlLCBfX3JlcHJfXwotICAvLyBpc24ndCB1c2VkLiBTZWUgcHl0aG9uIGJ1ZyAjNTg4MgotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19zdHJfXyhzZWxmKToiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlcHIoc2VsZikiIDw8IGVuZGwKLSAgICAgICAgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faGFzaF9fKHNlbGYpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ2YWx1ZSA9IDE3IiA8PCBlbmRsOyAvLyBQWVRIT05IQVNIU0VFRCB3b3VsZCBiZSBiZXR0ZXIsIGJ1dCByZXF1aXJlcyBQeXRob24gMy4yLjMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJ2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArICIpIiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdmFsdWUiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGlmICghZ2VuX3Nsb3RzXykgewotICAgIC8vIFByaW50aW5nIHV0aWxpdGllcyBzbyB0aGF0IG9uIHRoZSBjb21tYW5kIGxpbmUgdGhyaWZ0Ci0gICAgLy8gc3RydWN0cyBsb29rIHByZXR0eSBsaWtlIGRpY3Rpb25hcmllcwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fcmVwcl9fKHNlbGYpOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBMID0gWyclcz0lcicgJSAoa2V5LCB2YWx1ZSkiCi0gICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXSIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkiIDw8IGVuZGwKLSAgICAgICAgPDwgZW5kbDsKLQotICAgIC8vIEVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG1ldGhvZHMgdGhhdCBjb21wYXJlIGJ5IHZhbHVlCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19lcV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX25lX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICghZ2VuX2R5bmFtaWNfKSB7Ci0gICAgLy8gbm8gYmFzZSBjbGFzcyBhdmFpbGFibGUgdG8gaW1wbGVtZW50IF9fZXFfXyBhbmQgX19yZXByX18gYW5kIF9fbmVfXyBmb3IgdXMKLSAgICAvLyBzbyB3ZSBtdXN0IHByb3ZpZGUgb25lIHRoYXQgdXNlcyBfX3Nsb3RzX18KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX3JlcHJfXyhzZWxmKToiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgTCA9IFsnJXM9JXInICUgKGtleSwgZ2V0YXR0cihzZWxmLCBrZXkpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICAgIGZvciBrZXkgaW4gc2VsZi5fX3Nsb3RzX19dIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gRXF1YWxpdHkgbWV0aG9kIHRoYXQgY29tcGFyZXMgZWFjaCBhdHRyaWJ1dGUgYnkgdmFsdWUgYW5kIHR5cGUsIHdhbGtpbmcgX19zbG90c19fCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19lcV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gRmFsc2UiCi0gICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZm9yIGF0dHIgaW4gc2VsZi5fX3Nsb3RzX186IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgICAgbXlfdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICAgIG90aGVyX3ZhbCA9IGdldGF0dHIob3RoZXIsIGF0dHIpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgICAgaWYgbXlfdmFsICE9IG90aGVyX3ZhbDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICAgIHJldHVybiBGYWxzZSIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gVHJ1ZSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19uZV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJkZWYgcmVhZChzZWxmLCBpcHJvdCk6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiaWYgaXByb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCAiCi0gICAgICAgICAgICAgICAgICJhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpICIKLSAgICAgICAgICAgICAgICAgImFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lICIKLSAgICAgICAgICAgICAgICAgImFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpIiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgVHJ1ZToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAiKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7Ci0KLSAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICBpbmRlbnQob3V0KSA8PCAiaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsaWYgIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJmaWQgPT0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LnNraXAoZnR5cGUpIiA8PCBlbmRsOwotCi0gIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAiZGVmIHdyaXRlKHNlbGYsIG9wcm90KToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkICIKLSAgICAgICAgICAgICAgICAgImFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lICIKLSAgICAgICAgICAgICAgICAgImFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpIgotICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKSIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIGluZGVudChvdXQpIDw8ICJpZiBzZWxmLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaXMgbm90IE5vbmU6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIgotICAgICAgICAgICAgICAgIDw8ICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCkiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpIgotICAgICAgPDwgZW5kbDsKLQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJkZWYgdmFsaWRhdGUoc2VsZik6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLSAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIHNlbGYuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIGlzIE5vbmU6IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiICByYWlzZSBUUHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKG1lc3NhZ2U9J1JlcXVpcmVkIGZpZWxkICIKLSAgICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLnB5IjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBweV9pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiCi0gICAgICAgICAgICAgICA8PCBnZXRfcmVhbF9weV9tb2R1bGUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCksIGdlbl90d2lzdGVkXykgPDwgIi4iCi0gICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0IGxvZ2dpbmciIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiZnJvbSB0dHlwZXMgaW1wb3J0ICoiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUUHJvY2Vzc29yIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKSA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJmcm9tIHpvcGUuaW50ZXJmYWNlIGltcG9ydCBJbnRlcmZhY2UsIGltcGxlbWVudHMiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICJmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IGRlZmVyIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHdpc3RlZCIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJmcm9tIHRvcm5hZG8gaW1wb3J0IGdlbiIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8ICJmcm9tIHRvcm5hZG8gaW1wb3J0IGNvbmN1cnJlbnQiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRzZXJ2aWNlKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gICAgfQotCi0gICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICAgIH0KLSAgICBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZiA9ICIoIiArIGV4dGVuZHMgKyAiLklmYWNlKSI7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZXh0ZW5kc19pZiA9ICIoSW50ZXJmYWNlKSI7Ci0gICAgfSBlbHNlIGlmIChnZW5fbmV3c3R5bGVfIHx8IGdlbl9keW5hbWljXyB8fCBnZW5fdG9ybmFkb18pIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiKG9iamVjdCkiOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwgImNsYXNzIElmYWNlIiA8PCBleHRlbmRzX2lmIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgaWYgKGZ1bmN0aW9ucy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGV4dGVuZHNfY2xpZW50ID0gIigiICsgZXh0ZW5kcyArICIuQ2xpZW50KSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50LCAiOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfICYmIChnZW5fbmV3c3R5bGVfIHx8IGdlbl9keW5hbWljXykpIHsKLSAgICAgIGV4dGVuZHNfY2xpZW50ID0gIihvYmplY3QpIjsKLSAgICB9Ci0gIH0KLQotICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiY2xhc3MgQ2xpZW50IiA8PCBleHRlbmRzX2NsaWVudCA8PCAiOiIgPDwgZW5kbCA8PCAiICBpbXBsZW1lbnRzKElmYWNlKSIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJjbGFzcyBDbGllbnQoIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UpOiIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0KLSAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIG9wcm90X2ZhY3RvcnkpOiIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lKToiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIGlwcm90LCBvcHJvdD1Ob25lKToiIDw8IGVuZGw7Ci0gIH0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgc2VsZi5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIHNlbGYuX29wcm90X2ZhY3RvcnkgPSBvcHJvdF9mYWN0b3J5IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIHNlbGYuX3NlcWlkID0gMCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBzZWxmLl9yZXFzID0ge30iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBzZWxmLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAgc2VsZi5faXByb3RfZmFjdG9yeSA9IGlwcm90X2ZhY3RvcnkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAgc2VsZi5fb3Byb3RfZmFjdG9yeSA9IChvcHJvdF9mYWN0b3J5IGlmIG9wcm90X2ZhY3RvcnkgaXMgbm90IE5vbmUiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlwcm90X2ZhY3RvcnkpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIHNlbGYuX3NlcWlkID0gMCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBzZWxmLl9yZXFzID0ge30iIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgc2VsZi5fdHJhbnNwb3J0LmlvX2xvb3Auc3Bhd25fY2FsbGJhY2soc2VsZi5fc3RhcnRfcmVjZWl2aW5nKSIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHNlbGYuX2lwcm90ID0gc2VsZi5fb3Byb3QgPSBpcHJvdCIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICBpZiBvcHJvdCBpcyBub3QgTm9uZToiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBzZWxmLl9vcHJvdCA9IG9wcm90IgotICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHNlbGYuX3NlcWlkID0gMCIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcwotICAgICAgICAgICAgICAgICA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIG9wcm90X2ZhY3RvcnkpIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzCi0gICAgICAgICAgICAgICAgIDw8ICIuQ2xpZW50Ll9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeSkiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgaXByb3QsIG9wcm90KSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmIChnZW5fdG9ybmFkb18gJiYgZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiQGdlbi5lbmdpbmUiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJkZWYgX3N0YXJ0X3JlY2VpdmluZyhzZWxmKToiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgd2hpbGUgVHJ1ZToiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgdHJ5OiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgICAgIGZyYW1lID0geWllbGQgc2VsZi5fdHJhbnNwb3J0LnJlYWRGcmFtZSgpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24gYXMgZToiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICAgICBmb3IgZnV0dXJlIGluIHNlbGYuX3JlcXMuaXRlcnZhbHVlcygpOiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgICAgICAgZnV0dXJlLnNldF9leGNlcHRpb24oZSkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICAgIHNlbGYuX3JlcXMgPSB7fSIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICAgIHJldHVybiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgICB0ciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihmcmFtZSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICAgaXByb3QgPSBzZWxmLl9pcHJvdF9mYWN0b3J5LmdldFByb3RvY29sKHRyKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgICAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiICAgIGZ1dHVyZSA9IHNlbGYuX3JlcXMucG9wKHJzZXFpZCwgTm9uZSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICAgaWYgbm90IGZ1dHVyZToiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICAgICAjIGZ1dHVyZSBoYXMgYWxyZWFkeSBiZWVuIGRpc2NhcmRlZCIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgICAgIGNvbnRpbnVlIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZiwgJ3JlY3ZfJyArIGZuYW1lKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgICB0cnk6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgICByZXN1bHQgPSBtZXRob2QoaXByb3QsIG10eXBlLCByc2VxaWQpIgotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICAgICBmdXR1cmUuc2V0X2V4Y2VwdGlvbihlKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgIGVsc2U6IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgZnV0dXJlLnNldF9yZXN1bHQocmVzdWx0KSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VxaWQgPSBzZWxmLl9zZXFpZCA9IHNlbGYuX3NlcWlkICsgMSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5fcmVxc1tzZXFpZF0gPSBkZWZlci5EZWZlcnJlZCgpIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImQgPSBkZWZlci5tYXliZURlZmVycmVkKHNlbGYuc2VuZF8iIDw8IGZ1bm5hbWU7Ci0KLSAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLl9zZXFpZCArPSAxIiA8PCBlbmRsOwotICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnV0dXJlID0gc2VsZi5fcmVxc1tzZWxmLl9zZXFpZF0gPSBjb25jdXJyZW50LkZ1dHVyZSgpIiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotICAgIH0KLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIC8vIHdlIG5lZWQgYSBsZWFkaW5nIGNvbW1hIGlmIHRoZXJlIGFyZSBhcmdzLCBzaW5jZSBpdCdzIGNhbGxlZCBhcyBtYXliZURlZmVycmVkKGZ1bmNuYW1lLAotICAgICAgLy8gYXJnKQotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIC8vIG5vdGhpbmcuIFNlZSB0aGUgbmV4dCBibG9jay4KLSAgICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGZ1dHVyZSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8ICJzZWxmLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIC8vIFRoaXMgYmxvY2sgaW5qZWN0cyB0aGUgYm9keSBvZiB0aGUgc2VuZF88PiBtZXRob2QgZm9yIHR3aXN0ZWQgKGFuZCBhIGNiL2ViIHBhaXIpCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZC5hZGRDYWxsYmFja3MoIiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrPXNlbGYuY2Jfc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgImNhbGxiYWNrQXJncz0oc2VxaWQsKSwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVycmJhY2s9c2VsZi5lYl9zZW5kXyIKLSAgICAgICAgICAgICAgICAgPDwgZnVubmFtZSA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZXJyYmFja0FyZ3M9KHNlcWlkLCkpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLQotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIGNiX3NlbmRfIiA8PCBmdW5uYW1lIDw8ICIoc2VsZiwgXywgc2VxaWQpOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgLy8gaWYgb25lLXdheSwgZmlyZSB0aGUgZGVmZXJyZWQgJiByZW1vdmUgaXQgZnJvbSBfcmVxcwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3Aoc2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgPDwgImQuY2FsbGJhY2soTm9uZSkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGYuX3JlcXNbc2VxaWRdIiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgICAgLy8gYWRkIGFuIGVycmJhY2sgdG8gZmFpbCB0aGUgcmVxdWVzdCBpZiB0aGUgY2FsbCB0byBzZW5kXzw+IHJhaXNlZCBhbiBleGNlcHRpb24KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIGViX3NlbmRfIiA8PCBmdW5uYW1lIDw8ICIoc2VsZiwgZiwgc2VxaWQpOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZCA9IHNlbGYuX3JlcXMucG9wKHNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZC5lcnJiYWNrKGYpIgotICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCI7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90ID0gc2VsZi5fb3Byb3RfZmFjdG9yeS5nZXRQcm90b2NvbChzZWxmLl90cmFuc3BvcnQpIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKLSAgICAgICAgICAgICAgICAgPDwgbWVzc2FnZVR5cGUgPDwgIiwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKLSAgICAgICAgICAgICAgICAgPDwgbWVzc2FnZVR5cGUgPDwgIiwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoKSIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCi0gICAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShzZWxmLl9vcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgInNlbGYuX29wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICJzZWxmLl9vcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfIHx8IGdlbl90b3JuYWRvXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgaXByb3QsIG10eXBlLCByc2VxaWQpOiIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0KLSAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZCA9IHNlbGYuX3JlcXMucG9wKHJzZXFpZCkiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgewotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QgPSBzZWxmLl9pcHJvdCIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgIDw8ICIoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkiIDw8IGVuZGw7Ci0KLSAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICB4LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZC5lcnJiYWNrKHgpIgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICA8PCAicmVzdWx0LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICB4LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByYWlzZSB4IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICA8PCAicmVzdWx0LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgcmVzdWx0LnN1Y2Nlc3MgaXMgbm90IE5vbmU6IiA8PCBlbmRsOwotICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZC5jYWxsYmFjayhyZXN1bHQuc3VjY2VzcykiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3MiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaXMgbm90IE5vbmU6IiA8PCBlbmRsOwotICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZC5lcnJiYWNrKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByYWlzZSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQuY2FsbGJhY2soTm9uZSkiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXwotICAgICAgICAgICAgICA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICA8PCAicmV0dXJuIGQuZXJyYmFjayhUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIKLSAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSkiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgICAgPDwgInJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIgotICAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY29tbWFuZCBsaW5lIHRvb2wgZm9yIG1ha2luZyByZW1vdGUgcmVxdWVzdHMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSByZW1vdGUgZm9yLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgLy8gR2V0IGFsbCBmdW5jdGlvbiBmcm9tIHBhcmVudHMKLSAgdF9zZXJ2aWNlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBwX2Z1bmN0aW9ucyA9IHBhcmVudC0+Z2V0X2Z1bmN0aW9ucygpOwotICAgIGZ1bmN0aW9ucy5pbnNlcnQoZnVuY3Rpb25zLmVuZCgpLCBwX2Z1bmN0aW9ucy5iZWdpbigpLCBwX2Z1bmN0aW9ucy5lbmQoKSk7Ci0gICAgcGFyZW50ID0gcGFyZW50LT5nZXRfZXh0ZW5kcygpOwotICB9Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZl9yZW1vdGVfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLXJlbW90ZSI7Ci0gIG9mc3RyZWFtIGZfcmVtb3RlOwotICBmX3JlbW90ZS5vcGVuKGZfcmVtb3RlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9yZW1vdGUgPDwgIiMhL3Vzci9iaW4vZW52IHB5dGhvbiIgPDwgZW5kbCA8PCBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8ICJpbXBvcnQgc3lzIgotICAgICAgICAgICA8PCBlbmRsIDw8ICJpbXBvcnQgcHByaW50IiA8PCBlbmRsIDw8ICJmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZSIgPDwgZW5kbAotICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0IiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNTTFNvY2tldCIgPDwgZW5kbAotICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUSHR0cENsaWVudCIgPDwgZW5kbAotICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfcmVtb3RlIDw8ICJmcm9tICIgPDwgbW9kdWxlXyA8PCAiIGltcG9ydCAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgZW5kbCA8PCAiZnJvbSAiIDw8IG1vZHVsZV8KLSAgICAgICAgICAgPDwgIi50dHlwZXMgaW1wb3J0ICoiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3JlbW90ZSA8PCAiaWYgbGVuKHN5cy5hcmd2KSA8PSAxIG9yIHN5cy5hcmd2WzFdID09ICctLWhlbHAnOiIgPDwgZW5kbCA8PCAiICBwcmludCgnJykiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgIiAgcHJpbnQoJ1VzYWdlOiAnICsgc3lzLmFyZ3ZbMF0gKyAnIFstaCBob3N0Wzpwb3J0XV0gWy11IHVybF0gWy1mW3JhbWVkXV0gWy1zW3NsXV0gIgotICAgICAgICAgICAgICAiZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXScpIiA8PCBlbmRsIDw8ICIgIHByaW50KCcnKSIgPDwgZW5kbAotICAgICAgICAgICA8PCAiICBwcmludCgnRnVuY3Rpb25zOicpIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfcmVtb3RlIDw8ICIgIHByaW50KCcgICIgPDwgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIgotICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3JlbW90ZSA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9yZW1vdGUgPDwgYXJnc1tpXS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgYXJnc1tpXS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9yZW1vdGUgPDwgIiknKSIgPDwgZW5kbDsKLSAgfQotICBmX3JlbW90ZSA8PCAiICBwcmludCgnJykiIDw8IGVuZGwgPDwgIiAgc3lzLmV4aXQoMCkiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3JlbW90ZSA8PCAicHAgPSBwcHJpbnQuUHJldHR5UHJpbnRlcihpbmRlbnQgPSAyKSIgPDwgZW5kbCA8PCAiaG9zdCA9ICdsb2NhbGhvc3QnIiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICJwb3J0ID0gOTA5MCIgPDwgZW5kbCA8PCAidXJpID0gJyciIDw8IGVuZGwgPDwgImZyYW1lZCA9IEZhbHNlIiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICJzc2wgPSBGYWxzZSIgPDwgZW5kbCA8PCAiaHR0cCA9IEZhbHNlIiA8PCBlbmRsIDw8ICJhcmdpID0gMSIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLWgnOiIgPDwgZW5kbCA8PCAiICBwYXJ0cyA9IHN5cy5hcmd2W2FyZ2krMV0uc3BsaXQoJzonKSIKLSAgICAgICAgICAgPDwgZW5kbCA8PCAiICBob3N0ID0gcGFydHNbMF0iIDw8IGVuZGwgPDwgIiAgaWYgbGVuKHBhcnRzKSA+IDE6IiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIgICAgcG9ydCA9IGludChwYXJ0c1sxXSkiIDw8IGVuZGwgPDwgIiAgYXJnaSArPSAyIiA8PCBlbmRsIDw8IGVuZGwKLSAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctdSc6IiA8PCBlbmRsIDw8ICIgIHVybCA9IHVybHBhcnNlKHN5cy5hcmd2W2FyZ2krMV0pIiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIgIHBhcnRzID0gdXJsWzFdLnNwbGl0KCc6JykiIDw8IGVuZGwgPDwgIiAgaG9zdCA9IHBhcnRzWzBdIiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIgIGlmIGxlbihwYXJ0cykgPiAxOiIgPDwgZW5kbCA8PCAiICAgIHBvcnQgPSBpbnQocGFydHNbMV0pIiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIgIGVsc2U6IiA8PCBlbmRsIDw8ICIgICAgcG9ydCA9IDgwIiA8PCBlbmRsIDw8ICIgIHVyaSA9IHVybFsyXSIgPDwgZW5kbAotICAgICAgICAgICA8PCAiICBpZiB1cmxbNF06IiA8PCBlbmRsIDw8ICIgICAgdXJpICs9ICc/JXMnICUgdXJsWzRdIiA8PCBlbmRsIDw8ICIgIGh0dHAgPSBUcnVlIgotICAgICAgICAgICA8PCBlbmRsIDw8ICIgIGFyZ2kgKz0gMiIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLWYnIG9yIHN5cy5hcmd2W2FyZ2ldID09ICctZnJhbWVkJzoiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgIiAgZnJhbWVkID0gVHJ1ZSIgPDwgZW5kbCA8PCAiICBhcmdpICs9IDEiIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1zJyBvciBzeXMuYXJndlthcmdpXSA9PSAnLXNzbCc6IiA8PCBlbmRsIDw8ICIgIHNzbCA9IFRydWUiCi0gICAgICAgICAgIDw8IGVuZGwgPDwgIiAgYXJnaSArPSAxIiA8PCBlbmRsIDw8IGVuZGwgPDwgImNtZCA9IHN5cy5hcmd2W2FyZ2ldIiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICJhcmdzID0gc3lzLmFyZ3ZbYXJnaSsxOl0iIDw8IGVuZGwgPDwgZW5kbCA8PCAiaWYgaHR0cDoiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgIiAgdHJhbnNwb3J0ID0gVEh0dHBDbGllbnQuVEh0dHBDbGllbnQoaG9zdCwgcG9ydCwgdXJpKSIgPDwgZW5kbCA8PCAiZWxzZToiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgIiAgc29ja2V0ID0gVFNTTFNvY2tldC5UU1NMU29ja2V0KGhvc3QsIHBvcnQsIHZhbGlkYXRlPUZhbHNlKSBpZiBzc2wgZWxzZSAiCi0gICAgICAgICAgICAgICJUU29ja2V0LlRTb2NrZXQoaG9zdCwgcG9ydCkiIDw8IGVuZGwgPDwgIiAgaWYgZnJhbWVkOiIgPDwgZW5kbAotICAgICAgICAgICA8PCAiICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpIiA8PCBlbmRsIDw8ICIgIGVsc2U6IiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSIgPDwgZW5kbAotICAgICAgICAgICA8PCAicHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgImNsaWVudCA9ICIgPDwgc2VydmljZV9uYW1lXyA8PCAiLkNsaWVudChwcm90b2NvbCkiIDw8IGVuZGwgPDwgInRyYW5zcG9ydC5vcGVuKCkiCi0gICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9yZW1vdGUgPDwgImVsIjsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOwotCi0gICAgZl9yZW1vdGUgPDwgImlmIGNtZCA9PSAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIic6IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgIiAgaWYgbGVuKGFyZ3MpICE9ICIgPDwgbnVtX2FyZ3MgPDwgIjoiIDw8IGVuZGwgPDwgIiAgICBwcmludCgnIgotICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHJlcXVpcmVzICIgPDwgbnVtX2FyZ3MgPDwgIiBhcmdzJykiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiICAgIHN5cy5leGl0KDEpIiA8PCBlbmRsIDw8ICIgIHBwLnBwcmludChjbGllbnQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiOwotICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7Ci0gICAgICBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkpIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgImFyZ3NbIiA8PCBpIDw8ICJdLCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3JlbW90ZSA8PCAiZXZhbChhcmdzWyIgPDwgaSA8PCAiXSksIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9yZW1vdGUgPDwgIikpIiA8PCBlbmRsOwotCi0gICAgZl9yZW1vdGUgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfcmVtb3RlIDw8ICJlbHNlOiIgPDwgZW5kbDsKLSAgICBmX3JlbW90ZSA8PCAiICBwcmludCgnVW5yZWNvZ25pemVkIG1ldGhvZCAlcycgJSBjbWQpIiA8PCBlbmRsOwotICAgIGZfcmVtb3RlIDw8ICIgIHN5cy5leGl0KDEpIiA8PCBlbmRsOwotICAgIGZfcmVtb3RlIDw8IGVuZGw7Ci0gIH0KLQotICBmX3JlbW90ZSA8PCAidHJhbnNwb3J0LmNsb3NlKCkiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfcmVtb3RlLmNsb3NlKCk7Ci0KLSNpZm5kZWYgX01TQ19WRVIKLQotICAvLyBNYWtlIGZpbGUgZXhlY3V0YWJsZSwgbG92ZSB0aGF0IGJpdHdpc2UgT1IgYWN0aW9uCi0gIGNobW9kKGZfcmVtb3RlX25hbWUuY19zdHIoKSwKLSAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lYVVNSCi0jaWZuZGVmIF9XSU4zMgotICAgICAgICB8IFNfSVJHUlAgfCBTX0lYR1JQIHwgU19JUk9USCB8IFNfSVhPVEgKLSNlbmRpZgotICAgICAgICApOwotCi0jZW5kaWYgLy8gX01TQ19WRVIKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3IsICI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIGZfc2VydmljZV8gPDwgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yKToiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgIGltcGxlbWVudHMoSWZhY2UpIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiY2xhc3MgUHJvY2Vzc29yKCIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIklmYWNlLCBUUHJvY2Vzc29yKToiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IElmYWNlKGhhbmRsZXIpIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9oYW5kbGVyID0gaGFuZGxlciIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9wcm9jZXNzTWFwID0ge30iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBleHRlbmRzIDw8ICIuUHJvY2Vzc29yLl9faW5pdF9fKHNlbGYsIElmYWNlKGhhbmRsZXIpKSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBleHRlbmRzIDw8ICIuUHJvY2Vzc29yLl9faW5pdF9fKHNlbGYsIGhhbmRsZXIpIiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX3Byb2Nlc3NNYXBbXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgPDwgIlwiXSA9IFByb2Nlc3Nvci5wcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIHByb2Nlc3Moc2VsZiwgaXByb3QsIG9wcm90KToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIihuYW1lLCB0eXBlLCBzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGw7Ci0KLSAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlCi0KLSAgLy8gSE9UOiBkaWN0aW9uYXJ5IGZ1bmN0aW9uIGxvb2t1cAotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBuYW1lIG5vdCBpbiBzZWxmLl9wcm9jZXNzTWFwOiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIgIGlwcm90LnNraXAoVFR5cGUuU1RSVUNUKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiICB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgJ1Vua25vd24gIgotICAgICAgICAgICAgICAgICJmdW5jdGlvbiAlcycgJSAobmFtZSkpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiAgeC53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBkZWZlci5zdWNjZWVkKE5vbmUpIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGw7Ci0KLSAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgc2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKLQotICAgIC8vIFJlYWQgZW5kIG9mIGFyZ3MgZmllbGQsIHRoZSBUX1NUT1AsIGFuZCB0aGUgc3RydWN0IGNsb3NlCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpdHNlcnZpY2U7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaWYgKGdlbl90b3JuYWRvXykgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkBnZW4uY29yb3V0aW5lIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJkZWYgcHJvY2Vzc18iCi0gICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KToiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIC8vIFRPRE86IFByb3BhZ2F0ZSBhcmJpdHJhcnkgZXhjZXB0aW9uIHJhaXNlZCBieSBoYW5kbGVyIHRvIGNsaWVudCBhcyBkb2VzIHBsYWluICJweSIKLQotICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQgPSBkZWZlci5tYXliZURlZmVycmVkKHNlbGYuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgIDw8ICIsICI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLQotICAgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkLmFkZENhbGxiYWNrKHNlbGYud3JpdGVfcmVzdWx0c19zdWNjZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGw7Ci0KLSAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQuYWRkRXJyYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfZXhjZXB0aW9uXyIKLSAgICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIsIHJlc3VsdCwgc2VxaWQsIG9wcm90KSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgd3JpdGVfcmVzdWx0c19zdWNjZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgc3VjY2VzcywgcmVzdWx0LCBzZXFpZCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9IHN1Y2Nlc3MiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIgotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgd3JpdGVfcmVzdWx0c19leGNlcHRpb25fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHNlbGYsIGVycm9yLCByZXN1bHQsIHNlcWlkLCBvcHJvdCk6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOwotCi0gICAgICAvLyBLaW5kYSBhYnN1cmQKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgZXJyb3IucmFpc2VFeGNlcHRpb24oKSIgPDwgZW5kbDsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgYXMgIgotICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInBhc3MiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLQotICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgewotICAgIC8qCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImRlZiBoYW5kbGVfZXhjZXB0aW9uKHh0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToiIDw8IGVuZGw7Ci0KLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiB4dHlwZSA9PSAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWUiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIFRydWUiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICAqLwotCi0gICAgLy8gVE9ETzogUHJvcGFnYXRlIGFyYml0cmFyeSBleGNlcHRpb24gcmFpc2VkIGJ5IGhhbmRsZXIgdG8gY2xpZW50IGFzIGRvZXMgcGxhaW4gInB5IgotCi0gICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJ5aWVsZCBnZW4ubWF5YmVfZnV0dXJlKHNlbGYuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIikpIiA8PCBlbmRsOwotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiBhcyAiCi0gICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIgotICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIH0gZWxzZSB7IC8vIHB5Ci0gICAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICAgIC8vIEl0IGFsc28gY2F0Y2hlcyBhcmJpdHJhcnkgZXhjZXB0aW9ucyByYWlzZWQgYnkgaGFuZGxlciBtZXRob2QgdG8gcHJvcGFnYXRlIHRoZW0gdG8gdGhlIGNsaWVudAotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAic2VsZi5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJleGNlcHQgKFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOiIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmFpc2UiIDw8IGVuZGw7Ci0KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgYXMgIgotICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgotICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgbG9nZ2luZy5leGNlcHRpb24oZXgpIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICIKLSAgICAgICAgICAgICAgICAgICAgIidJbnRlcm5hbCBlcnJvcicpIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgIDw8ICJcIiwgbXNnX3R5cGUsIHNlcWlkKSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdDoiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcGFzcyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gICh2b2lkKWluY2xhc3M7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSB8fCAhZ2VuX3V0ZjhzdHJpbmdzXykgewotICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUHl0aG9uIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHByZWZpeAotICAgICAgPDwgIi5yZWFkKGlwcm90KSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQotICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIoIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlCi0gICAgICAgIDw8ICIsICIgPDwgc2l6ZSA8PCAiICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBzZXQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplCi0gICAgICAgIDw8ICIpID0gaXByb3QucmVhZFNldEJlZ2luKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IFtdIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIoIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUKLSAgICAgICAgPDwgIikgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwgaSA8PCAiIGluIHhyYW5nZSgiIDw8IHNpemUgPDwgIik6IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpIiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBzZXQgZWxlbWVudAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYXBwZW5kKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgfHwgIWdlbl91dGY4c3RyaW5nc18pIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIi5lbmNvZGUoJ3V0Zi04JykpIjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFB5dGhvbiBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpIiA8PCBlbmRsOwotfQotCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgImxlbigiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiwgIgotICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKLSAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAiIDw8IGtpdGVyIDw8ICIsIiA8PCB2aXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuaXRlbXMoKToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCkiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gc3RydWN0LgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0c3RydWN0LCB0c3RydWN0LCAiQXR0cmlidXRlcyIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdGZ1bmN0aW9uLCB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICJQYXJhbWV0ZXJzIik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgc3RydWN0IG9yIGZ1bmN0aW9uLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKSB7Ci0gIGJvb2wgaGFzX2RvYyA9IGZhbHNlOwotICBzdHJpbmdzdHJlYW0gc3M7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBoYXNfZG9jID0gdHJ1ZTsKLSAgICBzcyA8PCB0ZG9jLT5nZXRfZG9jKCk7Ci0gIH0KLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpZiAoaGFzX2RvYykgewotICAgICAgc3MgPDwgZW5kbDsKLSAgICB9Ci0gICAgaGFzX2RvYyA9IHRydWU7Ci0gICAgc3MgPDwgc3ViaGVhZGVyIDw8ICI6XG4iOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBzcyA8PCAiIC0gIiA8PCBwLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKHAtPmhhc19kb2MoKSkgewotICAgICAgICBzcyA8PCAiOiAiIDw8IHAtPmdldF9kb2MoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNzIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKGhhc19kb2MpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICJcIlwiXCJcbiIsICIiLCBzcy5zdHIoKSwgIlwiXCJcIlxuIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnZW5lcmljIG9iamVjdC4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiXCJcIlwiXG4iLCAiIiwgdGRvYy0+Z2V0X2RvYygpLCAiXCJcIlwiXG4iKTsKLSAgfQotfQotCi0vKioKLSAqIERlY2xhcmVzIGFuIGFyZ3VtZW50LCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OwotICByZXN1bHQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI9IjsKLSAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgIHJlc3VsdCA8PCAidGhyaWZ0X3NwZWNbIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiXVs0XSI7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0IDw8ICJOb25lIjsKLSAgfQotICByZXR1cm4gcmVzdWx0LnN0cigpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBkZWZhdWx0IHZhbHVlLCByZXR1cm5zIE5vbmUgb3RoZXJ3aXNlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodF9maWVsZCogdGZpZWxkKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgIHJldHVybiByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICJOb25lIjsKLSAgfQotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGludGVyZmFjZSkgewotICB2ZWN0b3I8c3RyaW5nPiBwcmU7Ci0gIHZlY3RvcjxzdHJpbmc+IHBvc3Q7Ci0gIHN0cmluZyBzaWduYXR1cmUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCI7Ci0KLSAgaWYgKCEoZ2VuX3R3aXN0ZWRfICYmIGludGVyZmFjZSkpIHsKLSAgICBwcmUucHVzaF9iYWNrKCJzZWxmIik7Ci0gIH0KLQotICBzaWduYXR1cmUgKz0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICZwcmUsICZwb3N0KSArICIpIjsKLSAgcmV0dXJuIHNpZ25hdHVyZTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHZlY3RvcjxzdHJpbmc+KiBwcmUsIHZlY3RvcjxzdHJpbmc+KiBwb3N0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBpZiAocHJlKSB7Ci0gICAgZm9yIChzX2l0ZXIgPSBwcmUtPmJlZ2luKCk7IHNfaXRlciAhPSBwcmUtPmVuZCgpOyArK3NfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICAgIH0KLSAgICAgIHJlc3VsdCArPSAqc19pdGVyOwotICAgIH0KLSAgfQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgaWYgKHBvc3QpIHsKLSAgICBmb3IgKHNfaXRlciA9IHBvc3QtPmJlZ2luKCk7IHNfaXRlciAhPSBwb3N0LT5lbmQoKTsgKytzX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgKz0gKnNfaXRlcjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgIHJldHVybiBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbSwgZ2VuX3R3aXN0ZWRfKSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHJldHVybiBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbSwgZ2VuX3R3aXN0ZWRfKSArICIudHR5cGVzLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQeXRob24gdHlvZQotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKiogU2VlIHRoZSBjb21tZW50IGluc2lkZSBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbiBmb3Igd2hhdCB0aGlzIGlzLiAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKSB7Ci0gIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJOb25lIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIi50aHJpZnRfc3BlYykiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCIKLSAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIgotICAgICAgICAgICArIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsIgotICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIikiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCIKLSAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiCi0gICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19zcGVjX2FyZ3M6ICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKLSAgICBweSwKLSAgICAiUHl0aG9uIiwKLSAgICAiICAgIG5ld19zdHlsZTogICAgICAgR2VuZXJhdGUgbmV3LXN0eWxlIGNsYXNzZXMuXG4iCi0gICAgIiAgICB0d2lzdGVkOiAgICAgICAgIEdlbmVyYXRlIFR3aXN0ZWQtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLlxuIgotICAgICIgICAgdG9ybmFkbzogICAgICAgICBHZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCBUb3JuYWRvLlxuIgotICAgICIgICAgdXRmOHN0cmluZ3M6ICAgICBFbmNvZGUvZGVjb2RlIHN0cmluZ3MgdXNpbmcgdXRmOCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuXG4iCi0gICAgIiAgICBjb2Rpbmc9Q09ESU5HOiAgIEFkZCBmaWxlIGVuY29kaW5nIGRlY2xhcmUgaW4gZ2VuZXJhdGVkIGZpbGUuXG4iCi0gICAgIiAgICBzbG90czogICAgICAgICAgIEdlbmVyYXRlIGNvZGUgdXNpbmcgc2xvdHMgZm9yIGluc3RhbmNlIG1lbWJlcnMuXG4iCi0gICAgIiAgICBkeW5hbWljOiAgICAgICAgIEdlbmVyYXRlIGR5bmFtaWMgY29kZSwgbGVzcyBjb2RlIGdlbmVyYXRlZCBidXQgc2xvd2VyLlxuIgotICAgICIgICAgZHluYmFzZT1DTFMgICAgICBEZXJpdmUgZ2VuZXJhdGVkIGNsYXNzZXMgZnJvbSBjbGFzcyBDTFMgaW5zdGVhZCBvZiBUQmFzZS5cbiIKLSAgICAiICAgIGR5bmV4Yz1DTFMgICAgICAgRGVyaXZlIGdlbmVyYXRlZCBleGNlcHRpb25zIGZyb20gQ0xTIGluc3RlYWQgb2YgVEV4Y2VwdGlvbkJhc2UuXG4iCi0gICAgIiAgICBkeW5pbXBvcnQ9J2Zyb20gZm9vLmJhciBpbXBvcnQgQ0xTJ1xuIgotICAgICIgICAgICAgICAgICAgICAgICAgICBBZGQgYW4gaW1wb3J0IGxpbmUgdG8gZ2VuZXJhdGVkIGNvZGUgdG8gZmluZCB0aGUgZHluYmFzZSBjbGFzcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1YzI0OC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBBIHN1YmNsYXNzIG9mIHN0ZDo6b2ZzdHJlYW0gdGhhdCBpbmNsdWRlcyBpbmRlbnRpbmcgZnVuY3Rpb25hbGl0eS4KLSAqLwotY2xhc3MgdF9yYl9vZnN0cmVhbSA6IHB1YmxpYyBzdGQ6Om9mc3RyZWFtIHsKLXByaXZhdGU6Ci0gIGludCBpbmRlbnRfOwotCi1wdWJsaWM6Ci0gIHRfcmJfb2ZzdHJlYW0oKSA6IHN0ZDo6b2ZzdHJlYW0oKSwgaW5kZW50XygwKSB7fQotICBleHBsaWNpdCB0X3JiX29mc3RyZWFtKGNvbnN0IGNoYXIqIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gaW9zX2Jhc2U6Om91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50ID0gMCkKLSAgICA6IHN0ZDo6b2ZzdHJlYW0oZmlsZW5hbWUsIG1vZGUpLCBpbmRlbnRfKGluZGVudCkge30KLQotICB0X3JiX29mc3RyZWFtJiBpbmRlbnQoKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRfOyArK2kpIHsKLSAgICAgICp0aGlzIDw8ICIgICI7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZvaWQgaW5kZW50X3VwKCkgeyBpbmRlbnRfKys7IH0KLSAgdm9pZCBpbmRlbnRfZG93bigpIHsgaW5kZW50Xy0tOyB9Ci19OwotCi0vKioKLSAqIFJ1YnkgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3JiX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X3JiX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1yYiI7Ci0KLSAgICByZXF1aXJlX3J1YnlnZW1zXyA9IChwYXJzZWRfb3B0aW9ucy5maW5kKCJydWJ5Z2VtcyIpICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICBuYW1lc3BhY2VkXyA9IChwYXJzZWRfb3B0aW9ucy5maW5kKCJuYW1lc3BhY2VkIikgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHRfcmJfb2ZzdHJlYW0mIHJlbmRlcl9jb25zdF92YWx1ZSh0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcmJfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3JiX3NpbXBsZV9jb25zdHJ1Y3Rvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVmbnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGF0YSh0X3JiX29mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIGZpZWxkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCh0X3JiX29mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQodF9yYl9vZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQodF9yYl9vZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcmRvYyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcmJfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bGxfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChzdGQ6OnN0cmluZyByYl9uYW1lc3BhY2UpOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBydWJ5X21vZHVsZXModF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJyYiIpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzOwotICAgIGlmIChucy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gbW9kdWxlczsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZzo6aXRlcmF0b3IgcG9zID0gbnMuYmVnaW4oKTsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGRlbGltID0gc3RkOjpmaW5kKHBvcywgbnMuZW5kKCksICcuJyk7Ci0gICAgICBtb2R1bGVzLnB1c2hfYmFjayhjYXBpdGFsaXplKHN0ZDo6c3RyaW5nKHBvcywgZGVsaW0pKSk7Ci0gICAgICBwb3MgPSBkZWxpbTsKLSAgICAgIGlmIChwb3MgPT0gbnMuZW5kKCkpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICArK3BvczsKLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kdWxlczsKLSAgfQotCi0gIHZvaWQgYmVnaW5fbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4pOwotICB2b2lkIGVuZF9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPik7Ci0KLXByaXZhdGU6Ci0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgdF9yYl9vZnN0cmVhbSBmX3R5cGVzXzsKLSAgdF9yYl9vZnN0cmVhbSBmX2NvbnN0c187Ci0gIHRfcmJfb2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKLSAgc3RkOjpzdHJpbmcgcmVxdWlyZV9wcmVmaXhfOwotCi0gIC8qKiBJZiB0cnVlLCBhZGQgYSAicmVxdWlyZSAncnVieWdlbXMnIiBsaW5lIHRvIHRoZSB0b3Agb2YgZWFjaCBnZW4tcmIgZmlsZS4gKi8KLSAgYm9vbCByZXF1aXJlX3J1YnlnZW1zXzsKLQotICAvKiogSWYgdHJ1ZSwgZ2VuZXJhdGUgZmlsZXMgaW4gaWRpb21hdGljIG5hbWVzcGFjZWQgZGlyZWN0b3JpZXMuICovCi0gIGJvb2wgbmFtZXNwYWNlZF87Ci19OwotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLQotICBpZiAobmFtZXNwYWNlZF8pIHsKLSAgICByZXF1aXJlX3ByZWZpeF8gPSByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgocHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInJiIikpOwotCi0gICAgc3RyaW5nIGRpciA9IHJlcXVpcmVfcHJlZml4XzsKLSAgICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0KLSAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgewotICAgICAgc3ViZGlyID0gc3ViZGlyICsgZGlyLnN1YnN0cigwLCBsb2MpICsgIi8iOwotICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKLSAgICB9Ci0gIH0KLQotICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArIHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgKyAiX3R5cGVzLnJiIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArIHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgKyAiX2NvbnN0YW50cy5yYiI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8IHJiX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCkgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKLSAgYmVnaW5fbmFtZXNwYWNlKGZfdHlwZXNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKLQotICBmX2NvbnN0c18gPDwgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKSA8PCAicmVxdWlyZSAnIgotICAgICAgICAgICAgPDwgcmVxdWlyZV9wcmVmaXhfIDw8IHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyciIDw8IGVuZGwgPDwgZW5kbDsKLSAgYmVnaW5fbmFtZXNwYWNlKGZfY29uc3RzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci19Ci0KLS8qKgotICogUmVuZGVycyB0aGUgcmVxdWlyZSBvZiB0aHJpZnQgaXRzZWxmLCBhbmQgcG9zc2libHkgb2YgdGhlIHJ1YnlnZW1zIGRlcGVuZGVuY3kuCi0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCkgewotICBpZiAocmVxdWlyZV9ydWJ5Z2Vtc18pIHsKLSAgICByZXR1cm4gInJlcXVpcmUgJ3J1YnlnZW1zJ1xucmVxdWlyZSAndGhyaWZ0J1xuIjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gInJlcXVpcmUgJ3RocmlmdCdcbiI7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCi0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgewotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBpZiAobmFtZXNwYWNlZF8pIHsKLSAgICAgIHRfcHJvZ3JhbSogaW5jbHVkZWQgPSBpbmNsdWRlc1tpXTsKLSAgICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVkX3JlcXVpcmVfcHJlZml4Ci0gICAgICAgICAgPSByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoaW5jbHVkZWQtPmdldF9uYW1lc3BhY2UoInJiIikpOwotICAgICAgc3RkOjpzdHJpbmcgaW5jbHVkZWRfbmFtZSA9IGluY2x1ZGVkLT5nZXRfbmFtZSgpOwotICAgICAgcmVzdWx0ICs9ICJyZXF1aXJlICciICsgaW5jbHVkZWRfcmVxdWlyZV9wcmVmaXggKyB1bmRlcnNjb3JlKGluY2x1ZGVkX25hbWUpICsgIl90eXBlcydcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAicmVxdWlyZSAnIiArIHVuZGVyc2NvcmUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl90eXBlcydcbiI7Ci0gICAgfQotICB9Ci0gIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9ICJcbiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJiX2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIjXG4iKSArICIjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgotICAgICAgICAgKyAiI1xuIiArICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiI1xuIjsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGVuZF9uYW1lc3BhY2UoZl90eXBlc18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOwotICBlbmRfbmFtZXNwYWNlKGZfY29uc3RzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUnVieSwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGZfdHlwZXNfLmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICBmX3R5cGVzXy5pbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLQotICAgIC8vIFJ1YnkgY2xhc3MgY29uc3RhbnRzIGhhdmUgdG8gYmUgY2FwaXRhbGl6ZWQuLi4gb21nIGkgYW0gc28gb24gdGhlIGZlbmNlCi0gICAgLy8gYWJvdXQgbGFuZ3VhZ2VzIHN0cmljdGx5IGVuZm9yY2luZyBjYXBpdGFsaXphdGlvbiB3aHkgY2FuJ3Qgd2UganVzdCBhbGwKLSAgICAvLyBhZ3JlZSBhbmQgcGxheSBuaWNlLgotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgZ2VuZXJhdGVfcmRvYyhmX3R5cGVzXywgKmNfaXRlcik7Ci0gICAgZl90eXBlc18uaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIiA8PCB2YWx1ZSA8PCBlbmRsOwotICB9Ci0KLSAgLy8gQ3JlYXRlIGEgaGFzaCBtYXBwaW5nIHZhbHVlcyBiYWNrIHRvIHRoZWlyIG5hbWVzIChhcyBzdHJpbmdzKSBzaW5jZSBydWJ5IGhhcyBubyBuYXRpdmUgZW51bQotICAvLyB0eXBlCi0gIGZfdHlwZXNfLmluZGVudCgpIDw8ICJWQUxVRV9NQVAgPSB7IjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAvLyBQb3B1bGF0ZSB0aGUgaGFzaAotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkKLSAgICAgIGZfdHlwZXNfIDw8ICIsICI7Ci0gICAgZl90eXBlc18gPDwgdmFsdWUgPDwgIiA9PiBcIiIgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICJcIiI7Ci0gIH0KLSAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGw7Ci0KLSAgLy8gQ3JlYXRlIGEgc2V0IHdpdGggdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KLSAgZl90eXBlc18uaW5kZW50KCkgPDwgIlZBTElEX1ZBTFVFUyA9IFNldC5uZXcoWyI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgLy8gUG9wdWxhdGUgdGhlIHNldAotICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmJlZ2luKCkpCi0gICAgICBmX3R5cGVzXyA8PCAiLCAiOwotICAgIGZfdHlwZXNfIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgfQotICBmX3R5cGVzXyA8PCAiXSkuZnJlZXplIiA8PCBlbmRsOwotCi0gIGZfdHlwZXNfLmluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0KLSAgZl9jb25zdHNfLmluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICI7Ci0gIHJlbmRlcl9jb25zdF92YWx1ZShmX2NvbnN0c18sIHR5cGUsIHZhbHVlKSA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotdF9yYl9vZnN0cmVhbSYgdF9yYl9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3JiX29mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgIiVxXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dC5pbmRlbnQoKSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8IGZ1bGxfdHlwZV9uYW1lKHR5cGUpIDw8ICIubmV3KHsiIDw8IGVuZGw7Ci0gICAgb3V0LmluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KSA8PCAiID0+ICI7Ci0gICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dC5pbmRlbnRfZG93bigpOwotICAgIG91dC5pbmRlbnQoKSA8PCAifSkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIG91dCA8PCAieyIgPDwgZW5kbDsKLSAgICBvdXQuaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpIDw8ICIgPT4gIjsKLSAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dC5pbmRlbnRfZG93bigpOwotICAgIG91dC5pbmRlbnQoKSA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0IDw8ICJTZXQubmV3KFsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0LmluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIpIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQuaW5kZW50X2Rvd24oKTsKLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dC5pbmRlbnQoKSA8PCAiXSkiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQuaW5kZW50KCkgPDwgIl0iOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gb3V0OwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHJ1Ynkgc3RydWN0Ci0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIGdlbmVyYXRlX3JiX3VuaW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcnVieSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlKSB7Ci0gIGdlbmVyYXRlX3Jkb2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiIDwgOjpUaHJpZnQ6OkV4Y2VwdGlvbiI7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0LmluZGVudF91cCgpOwotICBvdXQuaW5kZW50KCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OlN0cnVjdCwgOjpUaHJpZnQ6OlN0cnVjdF9VbmlvbiIgPDwgZW5kbDsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgZ2VuZXJhdGVfcmJfc2ltcGxlX2V4Y2VwdGlvbl9jb25zdHJ1Y3RvcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0KLSAgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2ZpZWxkX2RlZm5zKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLQotICBvdXQuaW5kZW50KCkgPDwgIjo6VGhyaWZ0OjpTdHJ1Y3QuZ2VuZXJhdGVfYWNjZXNzb3JzIHNlbGYiIDw8IGVuZGw7Ci0KLSAgb3V0LmluZGVudF9kb3duKCk7Ci0gIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcnVieSB1bmlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl91bmlvbih0X3JiX29mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKLSAgKHZvaWQpaXNfZXhjZXB0aW9uOwotICBnZW5lcmF0ZV9yZG9jKG91dCwgdHN0cnVjdCk7Ci0gIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiA8IDo6VGhyaWZ0OjpVbmlvbiIgPDwgZW5kbDsKLQotICBvdXQuaW5kZW50X3VwKCk7Ci0gIG91dC5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6U3RydWN0X1VuaW9uIiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9maWVsZF9kZWZucyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLQotICBvdXQuaW5kZW50KCkgPDwgIjo6VGhyaWZ0OjpVbmlvbi5nZW5lcmF0ZV9hY2Nlc3NvcnMgc2VsZiIgPDwgZW5kbDsKLQotICBvdXQuaW5kZW50X2Rvd24oKTsKLSAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLQotICBvdXQuaW5kZW50KCkgPDwgImNsYXNzIDw8IHNlbGYiIDw8IGVuZGw7Ci0gIG91dC5pbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIG91dC5pbmRlbnQoKSA8PCAiZGVmICIgPDwgZmllbGRfbmFtZSA8PCAiKHZhbCkiIDw8IGVuZGw7Ci0gICAgb3V0LmluZGVudCgpIDw8ICIgICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLm5ldyg6IiA8PCBmaWVsZF9uYW1lIDw8ICIsIHZhbCkiIDw8IGVuZGw7Ci0gICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQuaW5kZW50X2Rvd24oKTsKLSAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3IodF9yYl9vZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICBpZiAobWVtYmVycy5zaXplKCkgPT0gMSkgewotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKLQotICAgIGlmICgoKm1faXRlciktPmdldF90eXBlKCktPmlzX3N0cmluZygpKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgICAgb3V0LmluZGVudCgpIDw8ICJkZWYgaW5pdGlhbGl6ZShtZXNzYWdlPW5pbCkiIDw8IGVuZGw7Ci0gICAgICBvdXQuaW5kZW50X3VwKCk7Ci0gICAgICBvdXQuaW5kZW50KCkgPDwgInN1cGVyKCkiIDw8IGVuZGw7Ci0gICAgICBvdXQuaW5kZW50KCkgPDwgInNlbGYuIiA8PCBuYW1lIDw8ICIgPSBtZXNzYWdlIiA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudF9kb3duKCk7Ci0gICAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgICBpZiAobmFtZSAhPSAibWVzc2FnZSIpIHsKLSAgICAgICAgb3V0LmluZGVudCgpIDw8ICJkZWYgbWVzc2FnZTsgIiA8PCBuYW1lIDw8ICIgZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX2ZpZWxkX25hbWUgPSB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpOwotCi0gICAgb3V0LmluZGVudCgpIDw8IGNhcF9maWVsZF9uYW1lIDw8ICIgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2RlZm5zKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dC5pbmRlbnQoKSA8PCAiRklFTERTID0geyIgPDwgZW5kbDsKLSAgb3V0LmluZGVudF91cCgpOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBnZW5lcmF0ZSB0aGUgZmllbGQgZG9jc3RyaW5ncyB3aXRoaW4gdGhlIEZJRUxEUyBjb25zdGFudC4gbm8gcmVhbCBiZXR0ZXIgcGxhY2UuLi4KLSAgICBnZW5lcmF0ZV9yZG9jKG91dCwgKmZfaXRlcik7Ci0KLSAgICBvdXQuaW5kZW50KCkgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPT4gIjsKLQotICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpOwotICB9Ci0gIG91dC5pbmRlbnRfZG93bigpOwotICBvdXQgPDwgZW5kbDsKLSAgb3V0LmluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgb3V0LmluZGVudCgpIDw8ICJkZWYgc3RydWN0X2ZpZWxkczsgRklFTERTOyBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGF0YSh0X3JiX29mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX25hbWUgPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogZmllbGRfdmFsdWUgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsID0gZmFsc2UpIHsKLSAgZmllbGRfdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGRfdHlwZSk7Ci0KLSAgLy8gQmVnaW4gdGhpcyBmaWVsZCdzIGRlZm4KLSAgb3V0IDw8ICJ7OnR5cGUgPT4gIiA8PCB0eXBlX3RvX2VudW0oZmllbGRfdHlwZSk7Ci0KLSAgaWYgKCFmaWVsZF9uYW1lLmVtcHR5KCkpIHsKLSAgICBvdXQgPDwgIiwgOm5hbWUgPT4gJyIgPDwgZmllbGRfbmFtZSA8PCAiJyI7Ci0gIH0KLQotICBpZiAoZmllbGRfdmFsdWUgIT0gTlVMTCkgewotICAgIG91dCA8PCAiLCA6ZGVmYXVsdCA9PiAiOwotICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGZpZWxkX3R5cGUsIGZpZWxkX3ZhbHVlKTsKLSAgfQotCi0gIGlmICghZmllbGRfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpZiAoZmllbGRfdHlwZS0+aXNfc3RydWN0KCkgfHwgZmllbGRfdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgb3V0IDw8ICIsIDpjbGFzcyA9PiAiIDw8IGZ1bGxfdHlwZV9uYW1lKCh0X3N0cnVjdCopZmllbGRfdHlwZSk7Ci0gICAgfSBlbHNlIGlmIChmaWVsZF90eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIG91dCA8PCAiLCA6ZWxlbWVudCA9PiAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9saXN0KilmaWVsZF90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmtleSA9PiAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9tYXAqKWZpZWxkX3R5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgICBvdXQgPDwgIiwgOnZhbHVlID0+ICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X21hcCopZmllbGRfdHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmVsZW1lbnQgPT4gIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfc2V0KilmaWVsZF90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCgodF9iYXNlX3R5cGUqKWZpZWxkX3R5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgb3V0IDw8ICIsIDpiaW5hcnkgPT4gdHJ1ZSI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgb3V0IDw8ICIsIDpvcHRpb25hbCA9PiB0cnVlIjsKLSAgfQotCi0gIGlmIChmaWVsZF90eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgIiwgOmVudW1fY2xhc3MgPT4gIiA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZF90eXBlKTsKLSAgfQotCi0gIC8vIEVuZCBvZiB0aGlzIGZpZWxkJ3MgZGVmbgotICBvdXQgPDwgIn0iOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpiZWdpbl9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKLSAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLmVuZCgpOyArK21faXRlcikgewotICAgIG91dC5pbmRlbnQoKSA8PCAibW9kdWxlICIgPDwgKm1faXRlciA8PCBlbmRsOwotICAgIG91dC5pbmRlbnRfdXAoKTsKLSAgfQotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjplbmRfbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mIG91dCwgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzKSB7Ci0gIGZvciAodmVjdG9yPHN0ZDo6c3RyaW5nPjo6cmV2ZXJzZV9pdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLnJiZWdpbigpOyBtX2l0ZXIgIT0gbW9kdWxlcy5yZW5kKCk7Ci0gICAgICAgKyttX2l0ZXIpIHsKLSAgICBvdXQuaW5kZW50X2Rvd24oKTsKLSAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArIHVuZGVyc2NvcmUoc2VydmljZV9uYW1lXykgKyAiLnJiIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGlmIChuYW1lc3BhY2VkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgicmIiKSkKLSAgICAgICAgICAgICAgICAgPDwgdW5kZXJzY29yZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgIiciIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgInJlcXVpcmUgJyIgPDwgcmVxdWlyZV9wcmVmaXhfCi0gICAgICAgICAgICAgICAgIDw8IHVuZGVyc2NvcmUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8ICInIiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwgInJlcXVpcmUgJyIgPDwgcmVxdWlyZV9wcmVmaXhfIDw8IHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyciIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBlbmRsOwotCi0gIGJlZ2luX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKLQotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCi0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotCi0gIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZW5kX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3NlcnZpY2VfLCB0cyk7Ci0gICAgZ2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLSAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfc2VydmljZV8sICZyZXN1bHQpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gZnVsbF90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiA8ICIgKyBleHRlbmRzICsgIjo6Q2xpZW50ICI7Ci0gIH0KLQotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6Q2xpZW50IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8uaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOwotICAgIH0KLSAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKLQotICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKLSAgICBzdGQ6OnN0cmluZyBtZXNzYWdlU2VuZFByb2MgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gInNlbmRfb25ld2F5X21lc3NhZ2UiIDogInNlbmRfbWVzc2FnZSI7Ci0KLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8IG1lc3NhZ2VTZW5kUHJvYyA8PCAiKCciIDw8IGZ1bm5hbWUgPDwgIicsICIgPDwgYXJnc25hbWU7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCA6IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7Ci0KLSAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KLQotICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzdWx0ID0gcmVjZWl2ZV9tZXNzYWdlKCIgPDwgcmVzdWx0bmFtZSA8PCAiKSIgPDwgZW5kbDsKLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuc3VjY2VzcyB1bmxlc3MgcmVzdWx0LnN1Y2Nlc3MubmlsPyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmFpc2UgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgdW5sZXNzIHJlc3VsdC4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIubmlsPyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmFpc2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6OlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNSVNTSU5HX1JFU1VMVCwgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0JykiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gZnVsbF90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiA8ICIgKyBleHRlbmRzICsgIjo6UHJvY2Vzc29yICI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiY2xhc3MgUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OlByb2Nlc3NvciIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCl0c2VydmljZTsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJkZWYgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmluZGVudF91cCgpOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImFyZ3MgPSByZWFkX2FyZ3MoaXByb3QsICIgPDwgYXJnc25hbWUgPDwgIikiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIi5uZXcoKSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfLmluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIkBoYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc2N1ZSAiIDw8IGZ1bGxfdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiA9PiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJ3cml0ZV9yZXN1bHQocmVzdWx0LCBvcHJvdCwgJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBzZXFpZCkiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5Ci0gIHJldHVybiBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgbmFtZSA9IGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOwotICB9Ci0KLSAgcmV0dXJuIHByZWZpeCArIG5hbWU7Ci19Ci0KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6ZnVsbF90eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIjo6IjsKLSAgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzID0gcnVieV9tb2R1bGVzKHR0eXBlLT5nZXRfcHJvZ3JhbSgpKTsKLSAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLmVuZCgpOyArK21faXRlcikgewotICAgIHByZWZpeCArPSAqbV9pdGVyICsgIjo6IjsKLSAgfQotICByZXR1cm4gcHJlZml4ICsgdHlwZV9uYW1lKHR0eXBlKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFJ1YnkgdHlvZQotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6Qk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpNQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChzdHJpbmcgcmJfbmFtZXNwYWNlKSB7Ci0gIHN0cmluZyBuYW1lc3BhY2VzX2xlZnQgPSByYl9uYW1lc3BhY2U7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLQotICBzdHJpbmcgcGF0aF9wcmVmaXggPSAiIjsKLQotICB3aGlsZSAoKGxvYyA9IG5hbWVzcGFjZXNfbGVmdC5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHBhdGhfcHJlZml4ID0gcGF0aF9wcmVmaXggKyB1bmRlcnNjb3JlKG5hbWVzcGFjZXNfbGVmdC5zdWJzdHIoMCwgbG9jKSkgKyAiLyI7Ci0gICAgbmFtZXNwYWNlc19sZWZ0ID0gbmFtZXNwYWNlc19sZWZ0LnN1YnN0cihsb2MgKyAxKTsKLSAgfQotICBpZiAobmFtZXNwYWNlc19sZWZ0LnNpemUoKSA+IDApIHsKLSAgICBwYXRoX3ByZWZpeCA9IHBhdGhfcHJlZml4ICsgdW5kZXJzY29yZShuYW1lc3BhY2VzX2xlZnQpICsgIi8iOwotICB9Ci0gIHJldHVybiBwYXRoX3ByZWZpeDsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmRvYyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIiMgIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7Ci0gIH0KLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dC5pbmRlbnQoKSA8PCAiZGVmIHZhbGlkYXRlIiA8PCBlbmRsOwotICBvdXQuaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0gICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgb3V0LmluZGVudCgpIDw8ICJyYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgIgotICAgICAgICAgICAgICAgICAgICAgICInUmVxdWlyZWQgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIGlzIHVuc2V0IScpIjsKLSAgICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYm9vbCgpKSB7Ci0gICAgICAgIG91dCA8PCAiIGlmIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIubmlsPyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiB1bmxlc3MgQCIgPDwgZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotCi0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dC5pbmRlbnQoKSA8PCAidW5sZXNzIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIubmlsPyB8fCAiCi0gICAgICAgICAgICAgICAgICAgPDwgZnVsbF90eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICI6OlZBTElEX1ZBTFVFUy5pbmNsdWRlPyhAIgotICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudF91cCgpOwotICAgICAgb3V0LmluZGVudCgpIDw8ICJyYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgIgotICAgICAgICAgICAgICAgICAgICAgICInSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIhJykiIDw8IGVuZGw7Ci0gICAgICBvdXQuaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIG91dC5pbmRlbnRfZG93bigpOwotICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQuaW5kZW50KCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKLSAgb3V0LmluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQuaW5kZW50KCkKLSAgICAgIDw8ICJyYWlzZShTdGFuZGFyZEVycm9yLCAnVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LicpIGlmIGdldF9zZXRfZmllbGQubmlsPyB8fCBnZXRfdmFsdWUubmlsPyIKLSAgICAgIDw8IGVuZGw7Ci0KLSAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBjb25zdCB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQuaW5kZW50KCkgPDwgImlmIGdldF9zZXRfZmllbGQgPT0gOiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgIG91dC5pbmRlbnQoKSA8PCAiICByYWlzZSAiCi0gICAgICAgICAgICAgICAgICAgICAgIjo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpVTktOT1dOLCAiCi0gICAgICAgICAgICAgICAgICAgICAgIidJbnZhbGlkIHZhbHVlIG9mIGZpZWxkICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiEnKSB1bmxlc3MgIgotICAgICAgICAgICAgICAgICAgIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOjpWQUxJRF9WQUxVRVMuaW5jbHVkZT8oZ2V0X3ZhbHVlKSIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgb3V0LmluZGVudF9kb3duKCk7Ci0gIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCi0gICAgcmIsCi0gICAgIlJ1YnkiLAotICAgICIgICAgcnVieWdlbXM6ICAgICAgICBBZGQgYSBcInJlcXVpcmUgJ3J1YnlnZW1zJ1wiIGxpbmUgdG8gdGhlIHRvcCBvZiBlYWNoIGdlbmVyYXRlZCBmaWxlLlxuIgotICAgICIgICAgbmFtZXNwYWNlZDogICAgICBHZW5lcmF0ZSBmaWxlcyBpbiBpZGlvbWF0aWMgbmFtZXNwYWNlZCBkaXJlY3Rvcmllcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzNWY2OC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBTbWFsbHRhbGsgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3N0X2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X3N0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgKHZvaWQpcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1zdCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZm9yY2VfY29uc3RzKCk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc3Rfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9hY2Nlc3NvcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlbmRfbWV0aG9kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVjdl9tZXRob2QodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICBzdGQ6OnN0cmluZyBtYXBfcmVhZGVyKHRfbWFwKiB0bWFwKTsKLSAgc3RkOjpzdHJpbmcgbGlzdF9yZWFkZXIodF9saXN0KiB0bGlzdCk7Ci0gIHN0ZDo6c3RyaW5nIHNldF9yZWFkZXIodF9zZXQqIHRzZXQpOwotICBzdGQ6OnN0cmluZyBzdHJ1Y3RfcmVhZGVyKHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBjbHNOYW1lKTsKLQotICBzdGQ6OnN0cmluZyBtYXBfd3JpdGVyKHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgbGlzdF93cml0ZXIodF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIHNldF93cml0ZXIodF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBzdHJ1Y3Rfd3JpdGVyKHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBmbmFtZSk7Ci0KLSAgc3RkOjpzdHJpbmcgd3JpdGVfdmFsKHRfdHlwZSogdCwgc3RkOjpzdHJpbmcgZm5hbWUpOwotICBzdGQ6OnN0cmluZyByZWFkX3ZhbCh0X3R5cGUqIHQpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBzdF9hdXRvZ2VuX2NvbW1lbnQoKTsKLQotICB2b2lkIHN0X2NsYXNzX2RlZihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIHN0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7Ci0gIHZvaWQgc3RfY2xvc2VfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCk7Ci0gIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgdm9pZCBzdF9jbGFzc19tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIGNhdGVnb3J5KTsKLSAgdm9pZCBzdF9zZXR0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGUpOwotICB2b2lkIHN0X2dldHRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBjbGFzc19uYW1lKCk7Ci0gIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7Ci0gIHN0ZDo6c3RyaW5nIGNsaWVudF9jbGFzc19uYW1lKCk7Ci0gIHN0ZDo6c3RyaW5nIHByZWZpeChzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl90eXBlc19jb21tZW50KHRfZnVuY3Rpb24qIGZuKTsKLQotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGFfdHlwZSh0X3R5cGUqIHR5cGUpOwotICBib29sIGlzX3Zvd2VsKGNoYXIgYyk7Ci0gIHN0ZDo6c3RyaW5nIHRlbXBfbmFtZSgpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfY2F0ZWdvcnkoKTsKLQotcHJpdmF0ZToKLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgaW50IHRlbXBvcmFyeV92YXI7Ci0gIHN0ZDo6b2ZzdHJlYW0gZl87Ci19OwotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgdGVtcG9yYXJ5X3ZhciA9IDA7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9uYW1lID0gZ2V0X291dF9kaXIoKSArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiLnN0IjsKLSAgZl8ub3BlbihmX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfIDw8IHN0X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0KLSAgc3RfY2xhc3NfZGVmKGZfLCBwcm9ncmFtX25hbWVfKTsKLSAgZ2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uKCk7Ci0KLSAgLy8gR2VuZXJhdGUgZW51bXMKLSAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgewotICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICB9Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6Y2xhc3NfbmFtZSgpIHsKLSAgcmV0dXJuIGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk7Ci19Ci0KLWJvb2wgdF9zdF9nZW5lcmF0b3I6OmlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgewotICByZXR1cm4gc3ViX25hbWVzcGFjZSA9PSAicHJlZml4IiB8fCBzdWJfbmFtZXNwYWNlID09ICJjYXRlZ29yeSI7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6cHJlZml4KHN0cmluZyBjbGFzc19uYW1lKSB7Ci0gIHN0cmluZyBwcmVmaXggPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgic21hbGx0YWxrLnByZWZpeCIpOwotICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoY2xhc3NfbmFtZSk7Ci0gIG5hbWUgPSBwcmVmaXguZW1wdHkoKSA/IG5hbWUgOiAocHJlZml4ICsgbmFtZSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsaWVudF9jbGFzc19uYW1lKCkgewotICByZXR1cm4gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJDbGllbnQiOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RfYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4gc3RkOjpzdHJpbmcoIiciKSArICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKyAiXG4iCi0gICAgICAgICArICJETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIichXG4iOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3JjZV9jb25zdHMoKSB7Ci0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXMga2V5c0FuZFZhbHVlc0RvOiBbOmsgOnYgfCAiIDw8IHByZWZpeChjbGFzc19uYW1lKCkpCi0gICAgIDw8ICIgZW51bXMgYXQ6IGsgcHV0OiB2IHZhbHVlXS4hIiA8PCBlbmRsOwotCi0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzIGtleXNBbmRWYWx1ZXNEbzogWzprIDp2IHwgIiA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKQotICAgICA8PCAiIGNvbnN0YW50cyBhdDogayBwdXQ6IHYgdmFsdWVdLiEiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgZ2VuZXJhdGVfZm9yY2VfY29uc3RzKCk7Ci0gIGZfLmNsb3NlKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVkX2NhdGVnb3J5KCkgewotICBzdHJpbmcgY2F0ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInNtYWxsdGFsay5jYXRlZ29yeSIpOwotICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBUaHJpZnQgZ3JhbW1hciwgdGhlIGNhdGVnb3J5IG11c3QKLSAgLy8gYmUgcHVuY3R1YXRlZCBieSBkb3RzLiAgUmVwbGFjZXMgdGhlbSB3aXRoIGRhc2hlcyBoZXJlLgotICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IGNhdC5iZWdpbigpOyBpdGVyICE9IGNhdC5lbmQoKTsgKytpdGVyKSB7Ci0gICAgaWYgKCppdGVyID09ICcuJykgewotICAgICAgKml0ZXIgPSAnLSc7Ci0gICAgfQotICB9Ci0gIHJldHVybiBjYXQuc2l6ZSgpID8gY2F0IDogIkdlbmVyYXRlZC0iICsgY2xhc3NfbmFtZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gU21hbGx0YWxrLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCl0dHlwZWRlZjsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfZGVmKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKLSAgb3V0IDw8ICJPYmplY3Qgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChuYW1lKSA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICcnIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnIgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicG9vbERpY3Rpb25hcmllczogJyciIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNhdGVnb3J5OiAnIgotICAgICAgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7Ci0gIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSwgImFzIHlldCB1bmNhdGVnb3JpemVkIik7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7Ci0gIHN0X21ldGhvZChvdXQsIGNscyArICIgY2xhc3MiLCBuYW1lKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyBjYXRlZ29yeSkgewotICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsIGNhdGVnb3J5KTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyBjYXRlZ29yeSkgewotICBjaGFyIHRpbWVzdHJbNTBdOwotICB0aW1lX3QgcmF3dGltZTsKLSAgc3RydWN0IHRtKiB0aW5mbzsKLQotICB0aW1lKCZyYXd0aW1lKTsKLSAgdGluZm8gPSBsb2NhbHRpbWUoJnJhd3RpbWUpOwotICBzdHJmdGltZSh0aW1lc3RyLCA1MCwgIiVtLyVkLyVZICVIOiVNIiwgdGluZm8pOwotCi0gIG91dCA8PCAiISIgPDwgcHJlZml4KGNscykgPDwgIiBtZXRob2RzRm9yOiAnIiArIGNhdGVnb3J5ICsgIicgc3RhbXA6ICd0aHJpZnQgIiA8PCB0aW1lc3RyCi0gICAgICA8PCAiJyFcbiIgPDwgbmFtZSA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2Nsb3NlX21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQpIHsKLSAgb3V0IDw8ICIhICEiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3Rfc2V0dGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0eXBlID0gImFuT2JqZWN0IikgewotICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUgKyAiOiAiICsgdHlwZSk7Ci0gIG91dCA8PCBuYW1lIDw8ICIgOj0gIiArIHR5cGU7Ci0gIHN0X2Nsb3NlX21ldGhvZChvdXQpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9nZXR0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgewotICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUgKyAiIik7Ci0gIG91dCA8PCAiXiAiIDw8IG5hbWU7Ci0gIHN0X2Nsb3NlX21ldGhvZChvdXQpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9hY2Nlc3NvcnMoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHR5cGUgPSAiYW5PYmplY3QiKSB7Ci0gIHN0X3NldHRlcihvdXQsIGNscywgbmFtZSwgdHlwZSk7Ci0gIHN0X2dldHRlcihvdXQsIGNscywgbmFtZSk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpIHsKLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjbGFzcyIgPDwgZW5kbCA8PCAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICdjb25zdGFudHMgZW51bXMnISIKLSAgICAgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHN0X2FjY2Vzc29ycyhmXywgY2xhc3NfbmFtZSgpICsgIiBjbGFzcyIsICJlbnVtcyIpOwotICBzdF9hY2Nlc3NvcnMoZl8sIGNsYXNzX25hbWUoKSArICIgY2xhc3MiLCAiY29uc3RhbnRzIik7Ci0KLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtczogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOwotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50czogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOwotCi0gIGZfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0cmluZyBjbHNfbmFtZSA9IHByb2dyYW1fbmFtZV8gKyBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKTsKLQotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGF0OiAnIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiJyBwdXQ6IFsiCi0gICAgIDw8ICIoRGljdGlvbmFyeSBuZXcgIiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGZfIDw8ICJcdGF0OiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicgcHV0OiAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl8gPDwgIlx0eW91cnNlbGYpXSEiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHMgYXQ6ICciIDw8IG5hbWUgPDwgIicgcHV0OiBbIgotICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICJdISIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgIigiIDw8IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSkgPDwgIiBuZXcgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICI6ICIKLSAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIG91dCA8PCAiKERpY3Rpb25hcnkgbmV3IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCAiYXQ6ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiIHB1dDogIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ5b3Vyc2VsZikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQgPDwgIihTZXQgbmV3IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIihPcmRlcmVkQ29sbGVjdGlvbiBuZXciIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8ICJhZGQ6ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ5b3Vyc2VsZikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFNtYWxsdGFsayBzdHJ1Y3QKLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3N0X3N0cnVjdChmXywgdHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3N0X3N0cnVjdChmXywgdHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzbWFsbHRhbGsgY2xhc3MgdG8gcmVwcmVzZW50IGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0X3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGlmIChpc19leGNlcHRpb24pCi0gICAgb3V0IDw8ICJFcnJvciI7Ci0gIGVsc2UKLSAgICBvdXQgPDwgIk9iamVjdCI7Ci0KLSAgb3V0IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeCh0eXBlX25hbWUodHN0cnVjdCkpIDw8IGVuZGwgPDwgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnIjsKLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmJlZ2luKCkpCi0gICAgICAgIG91dCA8PCAiICI7Ci0gICAgICBvdXQgPDwgY2FtZWxjYXNlKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8ICInXG4iCi0gICAgICA8PCAiXHRjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnXG4iCi0gICAgICA8PCAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIgotICAgICAgPDwgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOwotCi0gIGdlbmVyYXRlX2FjY2Vzc29ycyhvdXQsIHRzdHJ1Y3QpOwotfQotCi1ib29sIHRfc3RfZ2VuZXJhdG9yOjppc192b3dlbChjaGFyIGMpIHsKLSAgc3dpdGNoICh0b2xvd2VyKGMpKSB7Ci0gIGNhc2UgJ2EnOgotICBjYXNlICdlJzoKLSAgY2FzZSAnaSc6Ci0gIGNhc2UgJ28nOgotICBjYXNlICd1JzoKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6YV90eXBlKHRfdHlwZSogdHlwZSkgewotICBzdHJpbmcgcHJlZml4OwotCi0gIGlmIChpc192b3dlbCh0eXBlX25hbWUodHlwZSlbMF0pKQotICAgIHByZWZpeCA9ICJhbiI7Ci0gIGVsc2UKLSAgICBwcmVmaXggPSAiYSI7Ci0KLSAgcmV0dXJuIHByZWZpeCArIGNhcGl0YWxpemUodHlwZV9uYW1lKHR5cGUpKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgc3RyaW5nIHR5cGU7Ci0gIHN0cmluZyBwcmVmaXg7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHN0X2FjY2Vzc29ycyhvdXQsCi0gICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZSh0eXBlX25hbWUodHN0cnVjdCkpLAotICAgICAgICAgICAgICAgICAgIGNhbWVsY2FzZSgoKm1faXRlciktPmdldF9uYW1lKCkpLAotICAgICAgICAgICAgICAgICAgIGFfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKTsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICAvLyBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6dGVtcF9uYW1lKCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBvdXQgPDwgInRlbXAiIDw8IHRlbXBvcmFyeV92YXIrKzsKLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjptYXBfd3JpdGVyKHRfbWFwKiB0bWFwLCBzdHJpbmcgZm5hbWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgc3RyaW5nIGtleSA9IHRlbXBfbmFtZSgpOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVNYXBCZWdpbjogKFRNYXAgbmV3IGtleVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRtYXAtPmdldF9rZXlfdHlwZSgpKQotICAgICAgPDwgIjsgdmFsdWVUeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIKLSAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGtleXNBbmRWYWx1ZXNEbzogWzoiIDw8IGtleSA8PCAiIDoiIDw8IHZhbCA8PCAiIHwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSkgPDwgIi4iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8IHdyaXRlX3ZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZU1hcEVuZF0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6bWFwX3JlYWRlcih0X21hcCogdG1hcCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkTWFwQmVnaW4uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbAotICAgICAgPDwgIiA6PSBEaWN0aW9uYXJ5IG5ldy4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhdDogIiA8PCByZWFkX3ZhbCh0bWFwLT5nZXRfa2V5X3R5cGUoKSkKLSAgICAgIDw8ICIgcHV0OiAiIDw8IHJlYWRfdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdCByZWFkTWFwRW5kLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6bGlzdF93cml0ZXIodF9saXN0KiB0bGlzdCwgc3RyaW5nIGZuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIltvcHJvdCB3cml0ZUxpc3RCZWdpbjogKFRMaXN0IG5ldyBlbGVtVHlwZTogIiA8PCB0eXBlX3RvX2VudW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSkKLSAgICAgIDw8ICI7IHNpemU6ICIgPDwgZm5hbWUgPDwgIiBzaXplKS4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGRvOiBbOiIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHZhbCkgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUxpc3RFbmRdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6Omxpc3RfcmVhZGVyKHRfbGlzdCogdGxpc3QpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkTGlzdEJlZ2luLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IE9yZGVyZWRDb2xsZWN0aW9uIG5ldy4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYwotICAgICAgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYWRkOiAiIDw8IHJlYWRfdmFsKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRMaXN0RW5kLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c2V0X3dyaXRlcih0X3NldCogdHNldCwgc3RyaW5nIGZuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIltvcHJvdCB3cml0ZVNldEJlZ2luOiAoVFNldCBuZXcgZWxlbVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkKLSAgICAgIDw8ICI7IHNpemU6ICIgPDwgZm5hbWUgPDwgIiBzaXplKS4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGRvOiBbOiIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdmFsKSA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlU2V0RW5kXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzZXRfcmVhZGVyKHRfc2V0KiB0c2V0KSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZFNldEJlZ2luLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IFNldCBuZXcuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIgotICAgICAgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIGFkZDogIiA8PCByZWFkX3ZhbCh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRTZXRFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzdHJ1Y3Rfd3JpdGVyKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgc25hbWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotCi0gIG91dCA8PCAiW29wcm90IHdyaXRlU3RydWN0QmVnaW46ICIKLSAgICAgIDw8ICIoVFN0cnVjdCBuZXcgbmFtZTogJyIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIicpLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICBib29sIG9wdGlvbmFsID0gKCpmbGRfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIHN0cmluZyBmbmFtZSA9IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIGFjY2Vzc29yID0gc25hbWUgKyAiICIgKyBjYW1lbGNhc2UoZm5hbWUpOwotCi0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgYWNjZXNzb3IgPDwgIiBpZk5vdE5pbDogWyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEJlZ2luOiAoVEZpZWxkIG5ldyBuYW1lOiAnIiA8PCBmbmFtZQotICAgICAgICA8PCAiJzsgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpCi0gICAgICAgIDw8ICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikuIiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSwgYWNjZXNzb3IpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJvcHJvdCB3cml0ZUZpZWxkRW5kIjsKLQotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgb3V0IDw8ICJdIjsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIuIiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkU3RvcDsgd3JpdGVTdHJ1Y3RFbmRdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0cnVjdF9yZWFkZXIodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBjbHNOYW1lID0gIiIpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIGZvdW5kID0gdGVtcF9uYW1lKCk7Ci0KLSAgaWYgKGNsc05hbWUuc2l6ZSgpID09IDApIHsKLSAgICBjbHNOYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gVGhpcyBpcyBuYXN0eSwgYnV0IHdpdGhvdXQgaXQgd2UnbGwgYnJlYWsgdGhpbmdzIGJ5IHByZWZpeGluZyBUUmVzdWx0LgotICBzdHJpbmcgbmFtZSA9ICgoY2FwaXRhbGl6ZShjbHNOYW1lKSA9PSAiVFJlc3VsdCIpID8gY2FwaXRhbGl6ZShjbHNOYW1lKSA6IHByZWZpeChjbHNOYW1lKSk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSAiIDw8IG5hbWUgPDwgIiBuZXcuIiA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZFN0cnVjdEJlZ2luLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiWyIgPDwgZGVzYwotICAgICAgPDwgIiA6PSBpcHJvdCByZWFkRmllbGRCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYwotICAgICAgPDwgIiB0eXBlID0gVFR5cGUgc3RvcF0gd2hpbGVGYWxzZTogW3wiIDw8IGZvdW5kIDw8ICJ8IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgaWQgPSAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiBpZlRydWU6IFsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgZm91bmQgPDwgIiA6PSB0cnVlLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiAiCi0gICAgICAgIDw8IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjogIiA8PCByZWFkX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIG91dCA8PCAiXS4iIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZm91bmQgPDwgIiBpZk5pbDogW2lwcm90IHNraXA6ICIgPDwgZGVzYyA8PCAiIHR5cGVdXS4iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCByZWFkU3RydWN0RW5kLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6d3JpdGVfdmFsKHRfdHlwZSogdCwgc3RyaW5nIGZuYW1lKSB7Ci0gIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOwotCi0gIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImlwcm90IHdyaXRlRG91YmxlOiAiICsgZm5hbWUgKyAiIGFzRmxvYXQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJpcHJvdCB3cml0ZSIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSkgKyAiOiAiICsgZm5hbWUgKyAiIGFzSW50ZWdlciI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lOwotICAgIH0KLSAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgewotICAgIHJldHVybiBtYXBfd3JpdGVyKCh0X21hcCopdCwgZm5hbWUpOwotICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gc3RydWN0X3dyaXRlcigodF9zdHJ1Y3QqKXQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gbGlzdF93cml0ZXIoKHRfbGlzdCopdCwgZm5hbWUpOwotICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuIHNldF93cml0ZXIoKHRfc2V0Kil0LCBmbmFtZSk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpcHJvdCB3cml0ZUkzMjogIiArIGZuYW1lOwotICB9IGVsc2UgewotICAgIHRocm93ICJTb3JyeSwgSSBkb24ndCBrbm93IGhvdyB0byB3cml0ZSB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOwotICB9Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6cmVhZF92YWwodF90eXBlKiB0KSB7Ci0gIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOwotCi0gIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiAiaXByb3QgcmVhZCIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gbWFwX3JlYWRlcigodF9tYXAqKXQpOwotICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gc3RydWN0X3JlYWRlcigodF9zdHJ1Y3QqKXQpOwotICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiBsaXN0X3JlYWRlcigodF9saXN0Kil0KTsKLSAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgewotICAgIHJldHVybiBzZXRfcmVhZGVyKCh0X3NldCopdCk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpcHJvdCByZWFkSTMyIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gcmVhZCB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOwotICB9Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlbmRfbWV0aG9kKHRfZnVuY3Rpb24qIGZ1bmN0aW9uKSB7Ci0gIHN0cmluZyBmdW5uYW1lID0gZnVuY3Rpb24tPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOwotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLQotICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksICJzZW5kIiArIGNhcGl0YWxpemUoc2lnbmF0dXJlKSk7Ci0gIGZfIDw8ICJvcHJvdCB3cml0ZU1lc3NhZ2VCZWdpbjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfIDw8IGluZGVudCgpIDw8ICIoVENhbGxNZXNzYWdlIG5ldyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl8gPDwgaW5kZW50KCkgPDwgIm5hbWU6ICciIDw8IGZ1bm5hbWUgPDwgIic7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VxaWQ6IHNlbGYgbmV4dFNlcWlkKS4iCi0gICAgIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlU3RydWN0QmVnaW46ICIKLSAgICAgPDwgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIGNhcGl0YWxpemUoY2FtZWxjYXNlKGZ1bm5hbWUpKSArICJfYXJncycpLiIgPDwgZW5kbDsKLQotICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgIHN0cmluZyBmbmFtZSA9IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICBmXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEJlZ2luOiAoVEZpZWxkIG5ldyBuYW1lOiAnIiA8PCBmbmFtZQotICAgICAgIDw8ICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsgaWQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKQotICAgICAgIDw8ICIpLiIgPDwgZW5kbDsKLQotICAgIGZfIDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSwgZm5hbWUpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgPDwgIm9wcm90IHdyaXRlRmllbGRFbmQuIiA8PCBlbmRsOwotICB9Ci0KLSAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRTdG9wOyB3cml0ZVN0cnVjdEVuZDsgd3JpdGVNZXNzYWdlRW5kLiIgPDwgZW5kbDsKLSAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHRyYW5zcG9ydCBmbHVzaCI7Ci0KLSAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKLX0KLQotLy8gV2Ugb25seSBzdXBwb3J0IHJlY2VpdmluZyBUUmVzdWx0IHN0cnVjdHVyZXMgKHNvIHRoaXMgd29uJ3Qgd29yayBvbiB0aGUgc2VydmVyIHNpZGUpCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWN2X21ldGhvZCh0X2Z1bmN0aW9uKiBmdW5jdGlvbikgewotICBzdHJpbmcgZnVubmFtZSA9IGNhbWVsY2FzZShmdW5jdGlvbi0+Z2V0X25hbWUoKSk7Ci0gIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOwotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgIlRSZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLQotICB0X3N0cnVjdCogeHMgPSBmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8vIGR1cGxpY2F0ZSB0aGUgZmllbGQsIGJ1dCBjYWxsIGl0ICJleGNlcHRpb24iLi4uIHdlIGRvbid0IG5lZWQgYSBkeW5hbWljIG5hbWUKLSAgICB0X2ZpZWxkKiBleGNlcHRpb24gPSBuZXcgdF9maWVsZCgoKmZfaXRlciktPmdldF90eXBlKCksICJleGNlcHRpb24iLCAoKmZfaXRlciktPmdldF9rZXkoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChleGNlcHRpb24pOwotICB9Ci0KLSAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCAicmVjdiIgKyBjYXBpdGFsaXplKGZ1bm5hbWUpKTsKLSAgZl8gPDwgInwgZiBtc2cgcmVzIHwgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJtc2cgOj0gb3Byb3QgcmVhZE1lc3NhZ2VCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgPDwgInNlbGYgdmFsaWRhdGVSZW1vdGVNZXNzYWdlOiBtc2cuIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgIDw8ICJyZXMgOj0gIiA8PCBzdHJ1Y3RfcmVhZGVyKCZyZXN1bHQpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCByZWFkTWVzc2FnZUVuZC4iCi0gICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHRyYW5zcG9ydCBmbHVzaC4iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgPDwgInJlcyBleGNlcHRpb24gaWZOb3ROaWw6IFtyZXMgZXhjZXB0aW9uIHNpZ25hbF0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJeIHJlcyI7Ci0gIHN0X2Nsb3NlX21ldGhvZChmXyk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbikgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBmbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCAiXCIiOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKChmX2l0ZXIgKyAxKSAhPSBmaWVsZHMuZW5kKCkpIHsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCAiXCIiOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICJUQ2xpZW50IjsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiQ2xpZW50IjsKLSAgfQotCi0gIGZfIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChjbGllbnRfY2xhc3NfbmFtZSgpKSA8PCBlbmRsCi0gICAgIDw8ICJcdGluc3RhbmNlVmFyaWFibGVOYW1lczogJydcbiIKLSAgICAgPDwgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIgotICAgICA8PCAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIgotICAgICA8PCAiXHRjYXRlZ29yeTogJyIgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichXG5cbiI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7Ci0KLSAgICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksIHNpZ25hdHVyZSk7Ci0gICAgZl8gPDwgZnVuY3Rpb25fdHlwZXNfY29tbWVudCgqZl9pdGVyKSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZWxmIHNlbmQiCi0gICAgICAgPDwgY2FwaXRhbGl6ZShzaWduYXR1cmUpIDw8ICIuIiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmXyA8PCBpbmRlbnQoKSA8PCAiXiBzZWxmIHJlY3YiIDw8IGNhcGl0YWxpemUoZnVubmFtZSkgPDwgIiBzdWNjZXNzICIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBzdF9jbG9zZV9tZXRob2QoZl8pOwotCi0gICAgZ2VuZXJhdGVfc2VuZF9tZXRob2QoKmZfaXRlcik7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBnZW5lcmF0ZV9yZWN2X21ldGhvZCgqZl9pdGVyKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICByZXR1cm4gY2FtZWxjYXNlKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyBjYXBpdGFsaXplKGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgIjsKLSAgICB9Ci0gICAgc3RyaW5nIG5hbWUgPSBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICByZXN1bHQgKz0gbmFtZSArICI6ICIgKyBuYW1lOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7Ci0gICAgICBwcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIl90eXBlcy4iOwotICAgIH0KLSAgfQotCi0gIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7Ci0gIH0KLQotICByZXR1cm4gcHJlZml4ICsgbmFtZTsKLX0KLQotLyogQ29udmVydCB0X3R5cGUgdG8gU21hbGx0YWxrIHR5cGUgY29kZSAqLwotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZSBzdHJpbmciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUgYm9vbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZSBieXRlIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUgaTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUgaTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUgaTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUgZG91YmxlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBpMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlIHN0cnVjdCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlIG1hcCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlIHNldCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBsaXN0IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihzdCwgIlNtYWxsdGFsayIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3NmJlYy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBYU0QgZ2VuZXJhdG9yLCBjcmVhdGVzIGFuIFhTRCBmb3IgdGhlIGJhc2UgdHlwZXMgZXRjLgotICoKLSAqLwotY2xhc3MgdF94c2RfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF94c2RfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgKHZvaWQpcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi14c2QiOwotICB9Ci0KLSAgdmlydHVhbCB+dF94c2RfZ2VuZXJhdG9yKCkge30KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeyAodm9pZCl0ZW51bTsgfQotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi1wcml2YXRlOgotICB2b2lkIGdlbmVyYXRlX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiBhdHRycyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIG5pbGxhYmxlID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGxpc3RfZWxlbWVudCA9IGZhbHNlKTsKLQotICBzdGQ6OnN0cmluZyBucyhzdGQ6OnN0cmluZyBpbiwgc3RkOjpzdHJpbmcgbnMpIHsgcmV0dXJuIG5zICsgIjoiICsgaW47IH0KLQotICBzdGQ6OnN0cmluZyB4c2Qoc3RkOjpzdHJpbmcgaW4pIHsgcmV0dXJuIG5zKGluLCAieHNkIik7IH0KLQotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpOwotCi0gIC8qKgotICAgKiBPdXRwdXQgeHNkL3BocCBmaWxlCi0gICAqLwotICBzdGQ6Om9mc3RyZWFtIGZfeHNkXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3BocF87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCBzdHJpbmcgc3RyZWFtCi0gICAqLwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc194c2RfdHlwZXNfOwotfTsKLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3BocF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl94c2QucGhwIjsKLSAgZl9waHBfLm9wZW4oZl9waHBfbmFtZS5jX3N0cigpKTsKLQotICBmX3BocF8gPDwgIjw/cGhwIiA8PCBlbmRsOwotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICBmX3BocF8gPDwgIj8+IiA8PCBlbmRsOwotICBmX3BocF8uY2xvc2UoKTsKLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpzaW1wbGVUeXBlIG5hbWU9XCIiIDw8IHR0eXBlZGVmLT5nZXRfbmFtZSgpIDw8ICJcIj4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKXR0eXBlZGVmLT5nZXRfdHlwZSgpKS0+aXNfc3RyaW5nX2VudW0oKSkgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnJlc3RyaWN0aW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIlwiPiIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiB2YWx1ZXMgPSAoKHRfYmFzZV90eXBlKil0dHlwZWRlZi0+Z2V0X3R5cGUoKSktPmdldF9zdHJpbmdfZW51bV92YWxzKCk7Ci0gICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9XCIiIDw8ICgqdl9pdGVyKSA8PCAiXCIgLz4iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOnJlc3RyaWN0aW9uPiIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpyZXN0cmljdGlvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICJcIiAvPiIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpzaW1wbGVUeXBlPiIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGJvb2wgeHNkX2FsbCA9IHRzdHJ1Y3QtPmdldF94c2RfYWxsKCk7Ci0KLSAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6Y29tcGxleFR5cGUgbmFtZT1cIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCI+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHhzZF9hbGwpIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDphbGw+IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZWxlbWVudChzX3hzZF90eXBlc18sCi0gICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF94c2RfYXR0cnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3hzZF9vcHRpb25hbCgpIHx8IHhzZF9hbGwsCi0gICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF94c2RfbmlsbGFibGUoKSk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpZiAoeHNkX2FsbCkgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDphbGw+IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZWxlbWVudChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuaWxsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGlzdF9lbGVtZW50KSB7Ci0gIHN0cmluZyBzbWluT2NjdXJzID0gKG9wdGlvbmFsIHx8IGxpc3RfZWxlbWVudCkgPyAiIG1pbk9jY3Vycz1cIjBcIiIgOiAiIjsKLSAgc3RyaW5nIHNtYXhPY2N1cnMgPSBsaXN0X2VsZW1lbnQgPyAiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiIiA6ICIiOwotICBzdHJpbmcgc29wdGlvbmFsID0gc21pbk9jY3VycyArIHNtYXhPY2N1cnM7Ci0gIHN0cmluZyBzbmlsbGFibGUgPSBuaWxsYWJsZSA/ICIgbmlsbGFibGU9XCJ0cnVlXCIiIDogIiI7Ci0KLSAgaWYgKHR0eXBlLT5pc192b2lkKCkgfHwgdHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIj4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKGF0dHJzID09IE5VTEwgJiYgdHR5cGUtPmlzX3ZvaWQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleFR5cGUgLz4iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6c2VxdWVuY2UgbWluT2NjdXJzPVwiMFwiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiPiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIHN0cmluZyBzdWJuYW1lOwotICAgICAgICB0X3R5cGUqIHN1YnR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgIGlmIChzdWJ0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCBzdWJ0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgICAgIHN1Ym5hbWUgPSBuYW1lICsgIl9lbHQiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN1Ym5hbWUgPSB0eXBlX25hbWUoc3VidHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZl9waHBfIDw8ICIkR0xPQkFMU1snIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiX3hzZF9lbHRfIiA8PCBuYW1lIDw8ICInXSA9ICciIDw8IHN1Ym5hbWUKLSAgICAgICAgICAgICAgIDw8ICInOyIgPDwgZW5kbDsKLSAgICAgICAgZ2VuZXJhdGVfZWxlbWVudChvdXQsIHN1Ym5hbWUsIHN1YnR5cGUsIE5VTEwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwibGlzdFwiIHR5cGU9XCJ4c2Q6Ym9vbGVhblwiIC8+IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaWYgKGF0dHJzICE9IE5VTEwpIHsKLSAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGF0dHJzLT5nZXRfbWVtYmVycygpOwotICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgICAgIGZvciAoYV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBhX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKythX2l0ZXIpIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cIiIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiB0eXBlPVwiIgotICAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmFfaXRlciktPmdldF90eXBlKCkpIDw8ICJcIiAvPiIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGlmIChhdHRycyA9PSBOVUxMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIgotICAgICAgICAgICAgICAgICAgPDwgIiB0eXBlPVwiIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiIC8+IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gV293LCBhbGwgdGhpcyB3b3JrIGZvciBhIFNJTVBMRSBUWVBFIHdpdGggYXR0cmlidXRlcz8hPyE/IQotICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiPiIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpleHRlbnNpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiXCI+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gYXR0cnMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgICBmb3IgKGFfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgYV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwiIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU9XCIiCi0gICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmFfaXRlciktPmdldF90eXBlKCkpIDw8ICJcIiAvPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZXh0ZW5zaW9uPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfeHNkX25hbWUgPSBnZXRfb3V0X2RpcigpICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiLnhzZCI7Ci0gIGZfeHNkXy5vcGVuKGZfeHNkX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIG5zID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInhzZCIpOwotICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgIG5zID0gIiB0YXJnZXROYW1lc3BhY2U9XCIiICsgbnMgKyAiXCIgeG1sbnM9XCIiICsgbnMgKyAiXCIgIgotICAgICAgICAgKyAiZWxlbWVudEZvcm1EZWZhdWx0PVwicXVhbGlmaWVkXCIiOwotICB9Ci0KLSAgLy8gUHJpbnQgdGhlIFhTRCBoZWFkZXIKLSAgZl94c2RfIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+IiA8PCBlbmRsCi0gICAgICAgICA8PCAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiIgPDwgbnMgPDwgIj4iIDw8IGVuZGwKLSAgICAgICAgIDw8IGVuZGwgPDwgIjwhLS0gWW8geW8geW8sIHRoaXMgWFNEIHdveiBiZSBnZW5lcmF0ZWQgYnkgVGhyaWZ0LiAtLT4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBQcmludCBvdXQgdGhlIHR5cGUgZGVmaW5pdGlvbnMKLSAgaW5kZW50KGZfeHNkXykgPDwgc194c2RfdHlwZXNfLnN0cigpOwotCi0gIC8vIEtlZXAgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgZXhjZXB0aW9ucyB0aGF0IG1pZ2h0IGdldCB0aHJvd24KLSAgbWFwPHN0cmluZywgdF9zdHJ1Y3QqPiBhbGxfeGNlcHRpb25zOwotCi0gIC8vIExpc3QgdGhlIGVsZW1lbnRzIHRoYXQgeW91IG1pZ2h0IGFjdHVhbGx5IGdldAotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZWxlbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3BvbnNlIjsKLSAgICB0X3R5cGUqIHJldHVybnR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgZ2VuZXJhdGVfZWxlbWVudChmX3hzZF8sIGVsZW1uYW1lLCByZXR1cm50eXBlKTsKLSAgICBmX3hzZF8gPDwgZW5kbDsKLQotICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBhbGxfeGNlcHRpb25zWygqeF9pdGVyKS0+Z2V0X25hbWUoKV0gPSAodF9zdHJ1Y3QqKSgoKnhfaXRlciktPmdldF90eXBlKCkpOwotICAgIH0KLSAgfQotCi0gIG1hcDxzdHJpbmcsIHRfc3RydWN0Kj46Oml0ZXJhdG9yIGF4X2l0ZXI7Ci0gIGZvciAoYXhfaXRlciA9IGFsbF94Y2VwdGlvbnMuYmVnaW4oKTsgYXhfaXRlciAhPSBhbGxfeGNlcHRpb25zLmVuZCgpOyArK2F4X2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbGVtZW50KGZfeHNkXywgYXhfaXRlci0+Zmlyc3QsIGF4X2l0ZXItPnNlY29uZCk7Ci0gIH0KLQotICAvLyBDbG9zZSB0aGUgWFNEIGRvY3VtZW50Ci0gIGZfeHNkXyA8PCBlbmRsIDw8ICI8L3hzZDpzY2hlbWE+IiA8PCBlbmRsOwotICBmX3hzZF8uY2xvc2UoKTsKLX0KLQotc3RyaW5nIHRfeHNkX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIHhzZChiYXNlX3R5cGVfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuIHhzZCgiaW50Iik7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgcmV0dXJuICJjb250YWluZXIiOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIFhTRCB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcmV0dXJuIEV4cGxpY2l0IFhTRCB0eXBlLCBpLmUuIHhzZDpzdHJpbmcKLSAqLwotc3RyaW5nIHRfeHNkX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSkgewotICBzd2l0Y2ggKHRiYXNlKSB7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICByZXR1cm4gInZvaWQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICByZXR1cm4gInN0cmluZyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gImJvb2xlYW4iOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuICJieXRlIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuICJzaG9ydCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIHJldHVybiAiaW50IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuICJsb25nIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJkZWNpbWFsIjsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFhTRCBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoeHNkLCAiWFNEIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dsb2JhbHMuaCBiL2NvbXBpbGVyL2NwcC9zcmMvZ2xvYmFscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjkwNjE2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2xvYmFscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0dMT0JBTFNfSAotI2RlZmluZSBUX0dMT0JBTFNfSAotCi0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHN0YWNrPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLS8qKgotICogVGhpcyBtb2R1bGUgY29udGFpbnMgYWxsIHRoZSBnbG9iYWwgdmFyaWFibGVzIChzbGFwIG9uIHRoZSB3cmlzdCkgdGhhdCBhcmUKLSAqIHNoYXJlZCB0aHJvdWdob3V0IHRoZSBwcm9ncmFtLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRvIGZhY2lsaXRhdGUgc2ltcGxlCi0gKiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBwYXJzZXIgYW5kIHRoZSByZXN0IG9mIHRoZSBwcm9ncmFtLiBCZWZvcmUgY2FsbGluZwotICogeXlwYXJzZSgpLCB0aGUgbWFpbi5jYyBwcm9ncmFtIHdpbGwgbWFrZSBuZWNlc3NhcnkgYWRqdXN0bWVudHMgdG8gdGhlc2UKLSAqIGdsb2JhbCB2YXJpYWJsZXMgc3VjaCB0aGF0IHRoZSBwYXJzZXIgZG9lcyB0aGUgcmlnaHQgdGhpbmcgYW5kIHB1dHMgZW50cmllcwotICogaW50byB0aGUgcmlnaHQgY29udGFpbmVycywgZXRjLgotICoKLSAqLwotCi0vKioKLSAqIEhvb3JheSBmb3IgZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0eXBlcyEKLSAqLwotCi1jbGFzcyB0X3Byb2dyYW07Ci1jbGFzcyB0X3Njb3BlOwotY2xhc3MgdF90eXBlOwotCi0vKioKLSAqIFBhcnNpbmcgbW9kZSwgdHdvIHBhc3NlcyB1cCBpbiB0aGlzIGdpbiBydW1teSEKLSAqLwotCi1lbnVtIFBBUlNFX01PREUgeyBJTkNMVURFUyA9IDEsIFBST0dSQU0gPSAyIH07Ci0KLS8qKgotICogU3RyaWN0bmVzcyBsZXZlbAotICovCi1leHRlcm4gaW50IGdfc3RyaWN0OwotCi0vKioKLSAqIFRoZSBtYXN0ZXIgcHJvZ3JhbSBwYXJzZSB0cmVlLiBUaGlzIGlzIGFjY2Vzc2VkIGZyb20gd2l0aGluIHRoZSBwYXJzZXIgY29kZQotICogdG8gYnVpbGQgdXAgdGhlIHByb2dyYW0gZWxlbWVudHMuCi0gKi8KLWV4dGVybiB0X3Byb2dyYW0qIGdfcHJvZ3JhbTsKLQotLyoqCi0gKiBHbG9iYWwgdHlwZXMgZm9yIHRoZSBwYXJzZXIgdG8gYmUgYWJsZSB0byByZWZlcmVuY2UKLSAqLwotCi1leHRlcm4gdF90eXBlKiBnX3R5cGVfdm9pZDsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9zdHJpbmc7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfYmluYXJ5OwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX3NsaXN0OwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2Jvb2w7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfYnl0ZTsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9pMTY7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfaTMyOwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2k2NDsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9kb3VibGU7Ci0KLS8qKgotICogVGhlIHNjb3BlIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBwYXJzaW5nIGludG8KLSAqLwotZXh0ZXJuIHRfc2NvcGUqIGdfc2NvcGU7Ci0KLS8qKgotICogVGhlIHBhcmVudCBzY29wZSB0byBhbHNvIGxvYWQgc3ltYm9scyBpbnRvCi0gKi8KLWV4dGVybiB0X3Njb3BlKiBnX3BhcmVudF9zY29wZTsKLQotLyoqCi0gKiBUaGUgcHJlZml4IGZvciB0aGUgcGFyZW50IHNjb3BlIGVudHJpZXMKLSAqLwotZXh0ZXJuIHN0ZDo6c3RyaW5nIGdfcGFyZW50X3ByZWZpeDsKLQotLyoqCi0gKiBUaGUgcGFyc2luZyBwYXNzIHRoYXQgd2UgYXJlIG9uLiBXZSBkbyBkaWZmZXJlbnQgdGhpbmdzIG9uIGVhY2ggcGFzcy4KLSAqLwotZXh0ZXJuIFBBUlNFX01PREUgZ19wYXJzZV9tb2RlOwotCi0vKioKLSAqIEdsb2JhbCB0aW1lIHN0cmluZywgdXNlZCBpbiBmb3JtYXR0aW5nIGVycm9yIG1lc3NhZ2VzIGV0Yy4KLSAqLwotZXh0ZXJuIGNoYXIqIGdfdGltZV9zdHI7Ci0KLS8qKgotICogVGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KLSAqLwotZXh0ZXJuIGNoYXIqIGdfZG9jdGV4dDsKLQotLyoqCi0gKiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KLSAqLwotZXh0ZXJuIGludCBnX2RvY3RleHRfbGluZW5vOwotCi0vKioKLSAqIFN0YXR1cyBvZiBwcm9ncmFtIGxldmVsIGRvY3RleHQgY2FuZGlkYXRlCi0gKi8KLWVudW0gUFJPR0RPQ1RFWFRfU1RBVFVTIHsKLSAgSU5WQUxJRCA9IDAsCi0gIFNUSUxMX0NBTkRJREFURSA9IDEsICAgLy8gdGhlIHRleHQgbWF5IG9yIG1heSBub3QgYmUgdGhlIHByb2dyYW0gZG9jdGV4dAotICBBTFJFQURZX1BST0NFU1NFRCA9IDIsIC8vIGRvY3RleHQgaGFzIGJlZW4gdXNlZCBhbmQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZQotICBBQlNPTFVURUxZX1NVUkUgPSAzLCAgIC8vIHRoaXMgaXMgdGhlIHByb2dyYW0gZG9jdGV4dAotICBOT19QUk9HUkFNX0RPQ1RFWFQgPSA0IC8vIHRoZXJlIGlzIG5vIHByb2dyYW0gZG9jdGV4dAotfTsKLQotLyoqCi0gKiBUaGUgcHJvZ3JhbSBsZXZlbCBkb2N0ZXh0LiBTdG9yZWQgc2VwYXJhdGVseSB0byBtYWtlIHBhcnNpbmcgZWFzaWVyLgotICovCi1leHRlcm4gY2hhciogZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlOwotZXh0ZXJuIGludCBnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm87Ci1leHRlcm4gUFJPR0RPQ1RFWFRfU1RBVFVTIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1czsKLQotLyoqCi0gKiBXaGV0aGVyIG9yIG5vdCBuZWdhdGl2ZSBmaWVsZCBrZXlzIGFyZSBhY2NlcHRlZC4KLSAqCi0gKiBXaGVuIGEgZmllbGQgZG9lcyBub3QgaGF2ZSBhIHVzZXItc3BlY2lmaWVkIGtleSwgdGhyaWZ0IGF1dG9tYXRpY2FsbHkKLSAqIGFzc2lnbnMgYSBuZWdhdGl2ZSB2YWx1ZS4gIEhvd2V2ZXIsIHRoaXMgaXMgZnJhZ2lsZSBzaW5jZSBjaGFuZ2VzIHRvIHRoZQotICogZmlsZSBtYXkgdW5pbnRlbnRpb25hbGx5IGNoYW5nZSB0aGUga2V5IG51bWJlcmluZywgcmVzdWx0aW5nIGluIGEgbmV3Ci0gKiBwcm90b2NvbCB0aGF0IGlzIG5vdCBiYWNrd2FyZHMgY29tcGF0aWJsZS4KLSAqCi0gKiBXaGVuIGdfYWxsb3dfbmVnX2ZpZWxkX2tleXMgaXMgZW5hYmxlZCwgdXNlcnMgY2FuIGV4cGxpY2l0bHkgc3BlY2lmeQotICogbmVnYXRpdmUga2V5cy4gIFRoaXMgd2F5IHRoZXkgY2FuIHdyaXRlIGEgLnRocmlmdCBmaWxlIHdpdGggZXhwbGljaXRseQotICogc3BlY2lmaWVkIGtleXMgdGhhdCBpcyBzdGlsbCBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIG9sZGVyIC50aHJpZnQgZmlsZXMKLSAqIHRoYXQgZGlkIG5vdCBzcGVjaWZ5IGtleSB2YWx1ZXMuCi0gKi8KLWV4dGVybiBpbnQgZ19hbGxvd19uZWdfZmllbGRfa2V5czsKLQotLyoqCi0gKiBXaGV0aGVyIG9yIG5vdCA2NC1iaXQgY29uc3RhbnRzIHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nLgotICoKLSAqIFNvbWUgbGFuZ3VhZ2VzIGRvbid0IHN1cHBvcnQgNjQtYml0IGNvbnN0YW50cywgYnV0IG1hbnkgZG8sIHNvIHdlIGNhbgotICogc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGZvciBwcm9qZWN0cyB0aGF0IGRvbid0IHVzZSBhbnkgbm9uLTY0LWJpdC1zYWZlCi0gKiBsYW5ndWFnZXMuCi0gKi8KLWV4dGVybiBpbnQgZ19hbGxvd182NGJpdF9jb25zdHM7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9sb2dnaW5nLmggYi9jb21waWxlci9jcHAvc3JjL2xvZ2dpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YxZmNlOC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2xvZ2dpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0xPR0dJTkdfSAotI2RlZmluZSBUX0xPR0dJTkdfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0vKioKLSAqIFBhcnNlIGRlYnVnZ2luZyBvdXRwdXQsIHVzZWQgdG8gcHJpbnQgaGVscGZ1bCBpbmZvCi0gKi8KLXZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKLQotLyoqCi0gKiBQYXJzZXIgd2FybmluZwotICovCi12b2lkIHB3YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pOwotCi0vKioKLSAqIFByaW50IHZlcmJvc2Ugb3V0cHV0IG1lc3NhZ2UKLSAqLwotdm9pZCBwdmVyYm9zZShjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0KLS8qKgotICogRmFpbHVyZSEKLSAqLwotdm9pZCBmYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL21haW4uY2MgYi9jb21waWxlci9jcHAvc3JjL21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMWQ5YjAuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogdGhyaWZ0IC0gYSBsaWdodHdlaWdodCBjcm9zcy1sYW5ndWFnZSBycGMvc2VyaWFsaXphdGlvbiB0b29sCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIGNvbXBpbGVyIGVuZ2luZSBmb3IgVGhyaWZ0LCB3aGljaCBpbnZva2VzIHRoZQotICogc2Nhbm5lci9wYXJzZXIgdG8gYnVpbGQgdGhlIHRocmlmdCBvYmplY3QgdHJlZS4gVGhlIGludGVyZmFjZSBnZW5lcmF0aW9uCi0gKiBjb2RlIGZvciBlYWNoIGxhbmd1YWdlIGxpdmVzIGluIGEgZmlsZSBieSB0aGUgbGFuZ3VhZ2UgbmFtZSB1bmRlciB0aGUKLSAqIGdlbmVyYXRlLyBmb2xkZXIsIGFuZCBhbGwgcGFyc2Ugc3RydWN0dXJlcyBsaXZlIGluIHBhcnNlLwotICoKLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI2lmZGVmIF9XSU4zMgotI2luY2x1ZGUgPHdpbmRvd3MuaD4gLyogZm9yIEdldEZ1bGxQYXRoTmFtZSAqLwotI2VuZGlmCi0KLS8vIENhcmVmdWw6IG11c3QgaW5jbHVkZSBnbG9iYWxzIGZpcnN0IGZvciBleHRlcm4gZGVmaW5pdGlvbnMKLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Byb2dyYW0uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Njb3BlLmgiCi0jaW5jbHVkZSAiZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJhdWRpdC90X2F1ZGl0LmgiCi0KLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLS8qKgotICogR2xvYmFsIHByb2dyYW0gdHJlZQotICovCi10X3Byb2dyYW0qIGdfcHJvZ3JhbTsKLQotLyoqCi0gKiBHbG9iYWwgdHlwZXMKLSAqLwotCi10X3R5cGUqIGdfdHlwZV92b2lkOwotdF90eXBlKiBnX3R5cGVfc3RyaW5nOwotdF90eXBlKiBnX3R5cGVfYmluYXJ5OwotdF90eXBlKiBnX3R5cGVfc2xpc3Q7Ci10X3R5cGUqIGdfdHlwZV9ib29sOwotdF90eXBlKiBnX3R5cGVfYnl0ZTsKLXRfdHlwZSogZ190eXBlX2kxNjsKLXRfdHlwZSogZ190eXBlX2kzMjsKLXRfdHlwZSogZ190eXBlX2k2NDsKLXRfdHlwZSogZ190eXBlX2RvdWJsZTsKLQotLyoqCi0gKiBHbG9iYWwgc2NvcGUKLSAqLwotdF9zY29wZSogZ19zY29wZTsKLQotLyoqCi0gKiBQYXJlbnQgc2NvcGUgdG8gYWxzbyBwYXJzZSB0eXBlcwotICovCi10X3Njb3BlKiBnX3BhcmVudF9zY29wZTsKLQotLyoqCi0gKiBQcmVmaXggZm9yIHB1dHRpbmcgdHlwZXMgaW4gcGFyZW50IHNjb3BlCi0gKi8KLXN0cmluZyBnX3BhcmVudF9wcmVmaXg7Ci0KLS8qKgotICogUGFyc2luZyBwYXNzCi0gKi8KLVBBUlNFX01PREUgZ19wYXJzZV9tb2RlOwotCi0vKioKLSAqIEN1cnJlbnQgZGlyZWN0b3J5IG9mIGZpbGUgYmVpbmcgcGFyc2VkCi0gKi8KLXN0cmluZyBnX2N1cmRpcjsKLQotLyoqCi0gKiBDdXJyZW50IGZpbGUgYmVpbmcgcGFyc2VkCi0gKi8KLXN0cmluZyBnX2N1cnBhdGg7Ci0KLS8qKgotICogU2VhcmNoIHBhdGggZm9yIGluY2x1c2lvbnMKLSAqLwotdmVjdG9yPHN0cmluZz4gZ19pbmNsX3NlYXJjaHBhdGg7Ci0KLS8qKgotICogR2xvYmFsIGRlYnVnIHN0YXRlCi0gKi8KLWludCBnX2RlYnVnID0gMDsKLQotLyoqCi0gKiBTdHJpY3RuZXNzIGxldmVsCi0gKi8KLWludCBnX3N0cmljdCA9IDEyNzsKLQotLyoqCi0gKiBXYXJuaW5nIGxldmVsCi0gKi8KLWludCBnX3dhcm4gPSAxOwotCi0vKioKLSAqIFZlcmJvc2Ugb3V0cHV0Ci0gKi8KLWludCBnX3ZlcmJvc2UgPSAwOwotCi0vKioKLSAqIEdsb2JhbCB0aW1lIHN0cmluZwotICovCi1jaGFyKiBnX3RpbWVfc3RyOwotCi0vKioKLSAqIFRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCi0gKi8KLWNoYXIqIGdfZG9jdGV4dDsKLQotLyoqCi0gKiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KLSAqLwotaW50IGdfZG9jdGV4dF9saW5lbm87Ci0KLS8qKgotICogVGhlIEZpcnN0IGRvY3RleHQgY29tbWVudAotICovCi1jaGFyKiBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGU7Ci1pbnQgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vID0gMDsKLVBST0dET0NURVhUX1NUQVRVUyBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBJTlZBTElEOwotCi0vKioKLSAqIFdoZXRoZXIgb3Igbm90IG5lZ2F0aXZlIGZpZWxkIGtleXMgYXJlIGFjY2VwdGVkLgotICovCi1pbnQgZ19hbGxvd19uZWdfZmllbGRfa2V5czsKLQotLyoqCi0gKiBXaGV0aGVyIG9yIG5vdCA2NC1iaXQgY29uc3RhbnRzIHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nLgotICovCi1pbnQgZ19hbGxvd182NGJpdF9jb25zdHMgPSAwOwotCi0vKioKLSAqIEZsYWdzIHRvIGNvbnRyb2wgY29kZSBnZW5lcmF0aW9uCi0gKi8KLWJvb2wgZ2VuX3JlY3Vyc2UgPSBmYWxzZTsKLQotLyoqCi0gKiBGbGFncyB0byBjb250cm9sIHRocmlmdCBhdWRpdAotICovCi1ib29sIGdfYXVkaXQgPSBmYWxzZTsKLQotLyoqCi0gKiBGbGFnIHRvIGNvbnRyb2wgcmV0dXJuIHN0YXR1cwotICovCi1ib29sIGdfcmV0dXJuX2ZhaWx1cmUgPSBmYWxzZTsKLWJvb2wgZ19hdWRpdF9mYXRhbCA9IHRydWU7Ci0KLS8qKgotICogV2luMzIgZG9lc24ndCBoYXZlIHJlYWxwYXRoLCBzbyB1c2UgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaW4gdGhhdCBjYXNlLAotICogb3RoZXJ3aXNlIHRoaXMganVzdCBjYWxscyB0aHJvdWdoIHRvIHJlYWxwYXRoCi0gKi8KLWNoYXIqIHNhZmVyZWFscGF0aChjb25zdCBjaGFyKiBwYXRoLCBjaGFyKiByZXNvbHZlZF9wYXRoKSB7Ci0jaWZkZWYgX1dJTjMyCi0gIGNoYXIgYnVmW01BWF9QQVRIXTsKLSAgY2hhciogYmFzZW5hbWU7Ci0gIERXT1JEIGxlbiA9IEdldEZ1bGxQYXRoTmFtZShwYXRoLCBNQVhfUEFUSCwgYnVmLCAmYmFzZW5hbWUpOwotICBpZiAobGVuID09IDAgfHwgbGVuID4gTUFYX1BBVEggLSAxKSB7Ci0gICAgc3RyY3B5KHJlc29sdmVkX3BhdGgsIHBhdGgpOwotICB9IGVsc2UgewotICAgIHN0cmNweShyZXNvbHZlZF9wYXRoLCBidWYpOwotICB9Ci0KLSAgLy8gUmVwbGFjZSBiYWNrc2xhc2hlcyB3aXRoIGZvcndhcmQgc2xhc2hlcyBzbyB0aGUKLSAgLy8gcmVzdCBvZiB0aGUgY29kZSBiZWhhdmVzIGNvcnJlY3RseS4KLSAgc2l6ZV90IHJlc29sdmVkX2xlbiA9IHN0cmxlbihyZXNvbHZlZF9wYXRoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvbHZlZF9sZW47IGkrKykgewotICAgIGlmIChyZXNvbHZlZF9wYXRoW2ldID09ICdcXCcpIHsKLSAgICAgIHJlc29sdmVkX3BhdGhbaV0gPSAnLyc7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXNvbHZlZF9wYXRoOwotI2Vsc2UKLSAgcmV0dXJuIHJlYWxwYXRoKHBhdGgsIHJlc29sdmVkX3BhdGgpOwotI2VuZGlmCi19Ci0KLWJvb2wgY2hlY2tfaXNfZGlyZWN0b3J5KGNvbnN0IGNoYXIqIGRpcl9uYW1lKSB7Ci0jaWZkZWYgX1dJTjMyCi0gIERXT1JEIGF0dHJpYnV0ZXMgPSA6OkdldEZpbGVBdHRyaWJ1dGVzQShkaXJfbmFtZSk7Ci0gIGlmIChhdHRyaWJ1dGVzID09IElOVkFMSURfRklMRV9BVFRSSUJVVEVTKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAiT3V0cHV0IGRpcmVjdG9yeSAlcyBpcyB1bnVzYWJsZTogR2V0TGFzdEVycm9yKCkgPSAlbGRcbiIsCi0gICAgICAgICAgICBkaXJfbmFtZSwKLSAgICAgICAgICAgIEdldExhc3RFcnJvcigpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKChhdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSAhPSBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnlcbiIsIGRpcl9uYW1lKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci0jZWxzZQotICBzdHJ1Y3Qgc3RhdCBzYjsKLSAgaWYgKHN0YXQoZGlyX25hbWUsICZzYikgPCAwKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGlzIHVudXNhYmxlOiAlc1xuIiwgZGlyX25hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghU19JU0RJUihzYi5zdF9tb2RlKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGRpcmVjdG9yeSAlcyBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeVxuIiwgZGlyX25hbWUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotfQotCi0vKioKLSAqIFJlcG9ydCBhbiBlcnJvciB0byB0aGUgdXNlci4gVGhpcyBpcyBjYWxsZWQgeXllcnJvciBmb3IgaGlzdG9yaWNhbAotICogcmVhc29ucyAobGV4IGFuZCB5YWNjIGV4cGVjdCB0aGUgZXJyb3IgcmVwb3J0aW5nIHJvdXRpbmUgdG8gYmUgY2FsbGVkCi0gKiB0aGlzKS4gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHJlcG9ydCBhbnkgZXJyb3JzIHRvIHRoZSB1c2VyLgotICogeXllcnJvciB0YWtlcyBwcmludGYgc3R5bGUgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgeXllcnJvcihjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICB2YV9saXN0IGFyZ3M7Ci0gIGZwcmludGYoc3RkZXJyLCAiW0VSUk9SOiVzOiVkXSAobGFzdCB0b2tlbiB3YXMgJyVzJylcbiIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubywgeXl0ZXh0KTsKLQotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLQotICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgZGVidWcgbWVzc2FnZSBmcm9tIHRoZSBwYXJzZXIuCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCBwZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgaWYgKGdfZGVidWcgPT0gMCkgewotICAgIHJldHVybjsKLSAgfQotICB2YV9saXN0IGFyZ3M7Ci0gIHByaW50ZigiW1BBUlNFOiVkXSAiLCB5eWxpbmVubyk7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gIHZwcmludGYoZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotICBwcmludGYoIlxuIik7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgdmVyYm9zZSBvdXRwdXQgbW9kZSBtZXNzYWdlCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCBwdmVyYm9zZShjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICBpZiAoZ192ZXJib3NlID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdmFfbGlzdCBhcmdzOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB2cHJpbnRmKGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLX0KLQotLyoqCi0gKiBQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UKLSAqCi0gKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cwotICovCi12b2lkIHB3YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgaWYgKGdfd2FybiA8IGxldmVsKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHZhX2xpc3QgYXJnczsKLSAgcHJpbnRmKCJbV0FSTklORzolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdnByaW50ZihmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci0gIHByaW50ZigiXG4iKTsKLX0KLQotLyoqCi0gKiBQcmludHMgYSBmYWlsdXJlIG1lc3NhZ2UgYW5kIGV4aXRzCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCBmYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXJnczsKLSAgZnByaW50ZihzdGRlcnIsICJbRkFJTFVSRTolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci0gIHByaW50ZigiXG4iKTsKLSAgZXhpdCgxKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyBhIHN0cmluZyBmaWxlbmFtZSBpbnRvIGEgdGhyaWZ0IHByb2dyYW0gbmFtZQotICovCi1zdHJpbmcgcHJvZ3JhbV9uYW1lKHN0cmluZyBmaWxlbmFtZSkgewotICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaCA9IGZpbGVuYW1lLnJmaW5kKCIvIik7Ci0gIGlmIChzbGFzaCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cihzbGFzaCArIDEpOwotICB9Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGRvdCA9IGZpbGVuYW1lLnJmaW5kKCIuIik7Ci0gIGlmIChkb3QgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoMCwgZG90KTsKLSAgfQotICByZXR1cm4gZmlsZW5hbWU7Ci19Ci0KLS8qKgotICogR2V0cyB0aGUgZGlyZWN0b3J5IHBhdGggb2YgYSBmaWxlbmFtZQotICovCi1zdHJpbmcgZGlyZWN0b3J5X25hbWUoc3RyaW5nIGZpbGVuYW1lKSB7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIHNsYXNoID0gZmlsZW5hbWUucmZpbmQoIi8iKTsKLSAgLy8gTm8gc2xhc2gsIGp1c3QgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeQotICBpZiAoc2xhc2ggPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmV0dXJuICIuIjsKLSAgfQotICByZXR1cm4gZmlsZW5hbWUuc3Vic3RyKDAsIHNsYXNoKTsKLX0KLQotLyoqCi0gKiBGaW5kcyB0aGUgYXBwcm9wcmlhdGUgZmlsZSBwYXRoIGZvciB0aGUgZ2l2ZW4gZmlsZW5hbWUKLSAqLwotc3RyaW5nIGluY2x1ZGVfZmlsZShzdHJpbmcgZmlsZW5hbWUpIHsKLSAgLy8gQWJzb2x1dGUgcGF0aD8gSnVzdCB0cnkgdGhhdAotICBpZiAoZmlsZW5hbWVbMF0gPT0gJy8nKSB7Ci0gICAgLy8gUmVhbHBhdGghCi0gICAgY2hhciBycFtUSFJJRlRfUEFUSF9NQVhdOwotICAgIGlmIChzYWZlcmVhbHBhdGgoZmlsZW5hbWUuY19zdHIoKSwgcnApID09IE5VTEwpIHsKLSAgICAgIHB3YXJuaW5nKDAsICJDYW5ub3Qgb3BlbiBpbmNsdWRlIGZpbGUgJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLy8gU3RhdCB0aGlzIGZpbGUKLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSAgICBpZiAoc3RhdChycCwgJmZpbmZvKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gcnA7Ci0gICAgfQotICB9IGVsc2UgeyAvLyByZWxhdGl2ZSBwYXRoLCBzdGFydCBzZWFyY2hpbmcKLSAgICAvLyBuZXcgc2VhcmNoIHBhdGggd2l0aCBjdXJyZW50IGRpciBnbG9iYWwKLSAgICB2ZWN0b3I8c3RyaW5nPiBzcCA9IGdfaW5jbF9zZWFyY2hwYXRoOwotICAgIHNwLmluc2VydChzcC5iZWdpbigpLCBnX2N1cmRpcik7Ci0KLSAgICAvLyBpdGVyYXRlIHRocm91Z2ggcGF0aHMKLSAgICB2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgaXQ7Ci0gICAgZm9yIChpdCA9IHNwLmJlZ2luKCk7IGl0ICE9IHNwLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBzdHJpbmcgc2ZpbGVuYW1lID0gKihpdCkgKyAiLyIgKyBmaWxlbmFtZTsKLQotICAgICAgLy8gUmVhbHBhdGghCi0gICAgICBjaGFyIHJwW1RIUklGVF9QQVRIX01BWF07Ci0gICAgICBpZiAoc2FmZXJlYWxwYXRoKHNmaWxlbmFtZS5jX3N0cigpLCBycCkgPT0gTlVMTCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLy8gU3RhdCB0aGlzIGZpbGVzCi0gICAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSAgICAgIGlmIChzdGF0KHJwLCAmZmluZm8pID09IDApIHsKLSAgICAgICAgcmV0dXJuIHJwOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFVoIG9oCi0gIHB3YXJuaW5nKDAsICJDb3VsZCBub3QgZmluZCBpbmNsdWRlIGZpbGUgJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOwotICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKLX0KLQotLyoqCi0gKiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc3RvcmVkIGRvY3RleHQgc3RyaW5nLgotICogQWxzbyBwcmludHMgYSB3YXJuaW5nIGlmIHdlIGFyZSBkaXNjYXJkaW5nIGluZm9ybWF0aW9uLgotICovCi12b2lkIGNsZWFyX2RvY3RleHQoKSB7Ci0gIGlmIChnX2RvY3RleHQgIT0gTlVMTCkgewotICAgIHB3YXJuaW5nKDIsICJVbmNhcHR1cmVkIGRvY3RleHQgYXQgb24gbGluZSAlZC4iLCBnX2RvY3RleHRfbGluZW5vKTsKLSAgfQotICBmcmVlKGdfZG9jdGV4dCk7Ci0gIGdfZG9jdGV4dCA9IE5VTEw7Ci19Ci0KLS8qKgotICogUmVzZXQgcHJvZ3JhbSBkb2N0ZXh0IGluZm9ybWF0aW9uIGFmdGVyIHByb2Nlc3NpbmcgYSBmaWxlCi0gKi8KLXZvaWQgcmVzZXRfcHJvZ3JhbV9kb2N0ZXh0X2luZm8oKSB7Ci0gIGlmIChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgIT0gTlVMTCkgewotICAgIGZyZWUoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlKTsKLSAgICBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgPSBOVUxMOwotICB9Ci0gIGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9IDA7Ci0gIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IElOVkFMSUQ7Ci0gIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBJTlZBTElEIik7Ci19Ci0KLS8qKgotICogV2UgYXJlIHN1cmUgdGhlIHByb2dyYW0gZG9jdGV4dCBjYW5kaWRhdGUgaXMgcmVhbGx5IHRoZSBwcm9ncmFtIGRvY3RleHQuCi0gKi8KLXZvaWQgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKSB7Ci0gIGlmICgoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlICE9IE5VTEwpICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPT0gU1RJTExfQ0FORElEQVRFKSkgewotICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IEFCU09MVVRFTFlfU1VSRTsKLSAgICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gQUJTT0xVVEVMWV9TVVJFIik7Ci0gIH0gZWxzZSB7Ci0gICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gTk9fUFJPR1JBTV9ET0NURVhUOwotICAgIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBOT19QUk9HUkFNX0RPQ1RFWFQiKTsKLSAgfQotfQotCi0vKioKLSAqIENsZWFucyB1cCB0ZXh0IGNvbW1vbmx5IGZvdW5kIGluIGRveHlnZW4tbGlrZSBjb21tZW50cwotICoKLSAqIFdhcm5pbmc6IGlmIHlvdSBtaXggdGFicyBhbmQgc3BhY2VzIGluIGEgbm9uLXVuaWZvcm0gd2F5LAotICogeW91IHdpbGwgZ2V0IHdoYXQgeW91IGRlc2VydmUuCi0gKi8KLWNoYXIqIGNsZWFuX3VwX2RvY3RleHQoY2hhciogZG9jdGV4dCkgewotICAvLyBDb252ZXJ0IHRvIEMrKyBzdHJpbmcsIGFuZCByZW1vdmUgV2luZG93cydzIGNhcnJpYWdlIHJldHVybnMuCi0gIHN0cmluZyBkb2NzdHJpbmcgPSBkb2N0ZXh0OwotICBkb2NzdHJpbmcuZXJhc2UocmVtb3ZlKGRvY3N0cmluZy5iZWdpbigpLCBkb2NzdHJpbmcuZW5kKCksICdccicpLCBkb2NzdHJpbmcuZW5kKCkpOwotCi0gIC8vIFNlcGFyYXRlIGludG8gbGluZXMuCi0gIHZlY3RvcjxzdHJpbmc+IGxpbmVzOwotICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBzdHJpbmc6Om5wb3M7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Q7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgbGFzdCA9IChwb3MgPT0gc3RyaW5nOjpucG9zKSA/IDAgOiBwb3MgKyAxOwotICAgIHBvcyA9IGRvY3N0cmluZy5maW5kKCdcbicsIGxhc3QpOwotICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAvLyBGaXJzdCBiaXQgb2YgY2xlYW5pbmcuICBJZiB0aGUgbGFzdCBsaW5lIGlzIG9ubHkgd2hpdGVzcGFjZSwgZHJvcCBpdC4KLSAgICAgIHN0cmluZzo6c2l6ZV90eXBlIG5vbndoaXRlID0gZG9jc3RyaW5nLmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiLCBsYXN0KTsKLSAgICAgIGlmIChub253aGl0ZSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgbGluZXMucHVzaF9iYWNrKGRvY3N0cmluZy5zdWJzdHIobGFzdCkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGxpbmVzLnB1c2hfYmFjayhkb2NzdHJpbmcuc3Vic3RyKGxhc3QsIHBvcyAtIGxhc3QpKTsKLSAgfQotCi0gIC8vIEEgdmVyeSBwcm9mb3VuZCBkb2NzdHJpbmcuCi0gIGlmIChsaW5lcy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBDbGVhciBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZmlyc3QgbGluZS4KLSAgcG9zID0gbGluZXMuZnJvbnQoKS5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7Ci0gIGxpbmVzLmZyb250KCkuZXJhc2UoMCwgcG9zKTsKLQotICAvLyBJZiBldmVyeSBub25ibGFuayBsaW5lIGFmdGVyIHRoZSBmaXJzdCBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIHNwYWNlcy90YWJzLAotICAvLyB0aGVuIGEgc3RhciwgcmVtb3ZlIHRoZW0uCi0gIGJvb2wgaGF2ZV9wcmVmaXggPSB0cnVlOwotICBib29sIGZvdW5kX3ByZWZpeCA9IGZhbHNlOwotICBzdHJpbmc6OnNpemVfdHlwZSBwcmVmaXhfbGVuID0gMDsKLSAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGxfaXRlcjsKLSAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgewotICAgIGlmIChsX2l0ZXItPmVtcHR5KCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIHBvcyA9IGxfaXRlci0+ZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOwotICAgIGlmICghZm91bmRfcHJlZml4KSB7Ci0gICAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcykgewotICAgICAgICBpZiAobF9pdGVyLT5hdChwb3MpID09ICcqJykgewotICAgICAgICAgIGZvdW5kX3ByZWZpeCA9IHRydWU7Ci0gICAgICAgICAgcHJlZml4X2xlbiA9IHBvczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBoYXZlX3ByZWZpeCA9IGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBXaGl0ZXNwYWNlLW9ubHkgbGluZS4gIFRydW5jYXRlIGl0LgotICAgICAgICBsX2l0ZXItPmNsZWFyKCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChsX2l0ZXItPnNpemUoKSA+IHBvcyAmJiBsX2l0ZXItPmF0KHBvcykgPT0gJyonICYmIHBvcyA9PSBwcmVmaXhfbGVuKSB7Ci0gICAgICAvLyBCdXNpbmVzcyBhcyB1c3VhbC4KLSAgICB9IGVsc2UgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIC8vIFdoaXRlc3BhY2Utb25seSBsaW5lLiAgTGV0J3MgdHJ1bmNhdGUgaXQgZm9yIHRoZW0uCi0gICAgICBsX2l0ZXItPmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRoZSBwYXR0ZXJuIGhhcyBiZWVuIGJyb2tlbi4KLSAgICAgIGhhdmVfcHJlZml4ID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiBvdXIgcHJlZml4IHN1cnZpdmVkLCBkZWxldGUgaXQgZnJvbSBldmVyeSBsaW5lLgotICBpZiAoaGF2ZV9wcmVmaXgpIHsKLSAgICAvLyBHZXQgdGhlIHN0YXIgdG9vLgotICAgIHByZWZpeF9sZW4rKzsKLSAgICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkgKyAxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgICBsX2l0ZXItPmVyYXNlKDAsIHByZWZpeF9sZW4pOwotICAgIH0KLSAgfQotCi0gIC8vIE5vdyBkZWxldGUgdGhlIG1pbmltdW0gYW1vdW50IG9mIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGVhY2ggbGluZS4KLSAgcHJlZml4X2xlbiA9IHN0cmluZzo6bnBvczsKLSAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgewotICAgIGlmIChsX2l0ZXItPmVtcHR5KCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKLSAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcyAmJiAocHJlZml4X2xlbiA9PSBzdHJpbmc6Om5wb3MgfHwgcG9zIDwgcHJlZml4X2xlbikpIHsKLSAgICAgIHByZWZpeF9sZW4gPSBwb3M7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KLSAgaWYgKHByZWZpeF9sZW4gIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgewotICAgICAgbF9pdGVyLT5lcmFzZSgwLCBwcmVmaXhfbGVuKTsKLSAgICB9Ci0gIH0KLQotICAvLyBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGV2ZXJ5IGxpbmUuCi0gIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgewotICAgIHBvcyA9IGxfaXRlci0+ZmluZF9sYXN0X25vdF9vZigiIFx0Iik7Ci0gICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgcG9zICE9IGxfaXRlci0+bGVuZ3RoKCkgLSAxKSB7Ci0gICAgICBsX2l0ZXItPmVyYXNlKHBvcyArIDEpOwotICAgIH0KLSAgfQotCi0gIC8vIElmIHRoZSBmaXJzdCBsaW5lIGlzIGVtcHR5LCByZW1vdmUgaXQuCi0gIC8vIERvbid0IGRvIHRoaXMgZWFybGllciBiZWNhdXNlIGEgbG90IG9mIHN0ZXBzIHNraXAgdGhlIGZpcnN0IGxpbmUuCi0gIGlmIChsaW5lcy5mcm9udCgpLmVtcHR5KCkpIHsKLSAgICBsaW5lcy5lcmFzZShsaW5lcy5iZWdpbigpKTsKLSAgfQotCi0gIC8vIE5vdyByZWpvaW4gdGhlIGxpbmVzIGFuZCBjb3B5IHRoZW0gYmFjayBpbnRvIGRvY3RleHQuCi0gIGRvY3N0cmluZy5jbGVhcigpOwotICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBkb2NzdHJpbmcgKz0gKmxfaXRlcjsKLSAgICBkb2NzdHJpbmcgKz0gJ1xuJzsKLSAgfQotCi0gIC8vIGFzc2VydChkb2NzdHJpbmcubGVuZ3RoKCkgPD0gc3RybGVuKGRvY3RleHQpKTsgIG1heSBoYXBwZW4sIHNlZSBUSFJJRlQtMTc1NQotICBpZiAoZG9jc3RyaW5nLmxlbmd0aCgpIDw9IHN0cmxlbihkb2N0ZXh0KSkgewotICAgIHN0cmNweShkb2N0ZXh0LCBkb2NzdHJpbmcuY19zdHIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgZnJlZShkb2N0ZXh0KTsgLy8gdG9vIHNob3J0Ci0gICAgZG9jdGV4dCA9IHN0cmR1cChkb2NzdHJpbmcuY19zdHIoKSk7Ci0gIH0KLSAgcmV0dXJuIGRvY3RleHQ7Ci19Ci0KLS8qKiBTZXQgdG8gdHJ1ZSB0byBkZWJ1ZyBkb2NzdHJpbmcgcGFyc2luZyAqLwotc3RhdGljIGJvb2wgZHVtcF9kb2NzID0gZmFsc2U7Ci0KLS8qKgotICogRHVtcHMgZG9jc3RyaW5ncyB0byBzdGRvdXQKLSAqIE9ubHkgd29ya3MgZm9yIHRvcC1sZXZlbCBkZWZpbml0aW9ucyBhbmQgdGhlIHdob2xlIHByb2dyYW0gZG9jCi0gKiAoaS5lLiwgbm90IGVudW0gY29uc3RhbnRzLCBzdHJ1Y3QgZmllbGRzLCBvciBmdW5jdGlvbnMuCi0gKi8KLXZvaWQgZHVtcF9kb2NzdHJpbmdzKHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotICBzdHJpbmcgcHJvZ2RvYyA9IHByb2dyYW0tPmdldF9kb2MoKTsKLSAgaWYgKCFwcm9nZG9jLmVtcHR5KCkpIHsKLSAgICBwcmludGYoIldob2xlIHByb2dyYW0gZG9jOlxuJXNcbiIsIHByb2dkb2MuY19zdHIoKSk7Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfdHlwZWRlZio+JiB0eXBlZGVmcyA9IHByb2dyYW0tPmdldF90eXBlZGVmcygpOwotICB2ZWN0b3I8dF90eXBlZGVmKj46OmNvbnN0X2l0ZXJhdG9yIHRfaXRlcjsKLSAgZm9yICh0X2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0X2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdF9pdGVyKSB7Ci0gICAgdF90eXBlZGVmKiB0ZCA9ICp0X2l0ZXI7Ci0gICAgaWYgKHRkLT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50ZigidHlwZWRlZiAlczpcbiVzXG4iLCB0ZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0ZC0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9lbnVtKj4mIGVudW1zID0gcHJvZ3JhbS0+Z2V0X2VudW1zKCk7Ci0gIHZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgZV9pdGVyOwotICBmb3IgKGVfaXRlciA9IGVudW1zLmJlZ2luKCk7IGVfaXRlciAhPSBlbnVtcy5lbmQoKTsgKytlX2l0ZXIpIHsKLSAgICB0X2VudW0qIGVuID0gKmVfaXRlcjsKLSAgICBpZiAoZW4tPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJlbnVtICVzOlxuJXNcbiIsIGVuLT5nZXRfbmFtZSgpLmNfc3RyKCksIGVuLT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X2NvbnN0Kj4mIGNvbnN0cyA9IHByb2dyYW0tPmdldF9jb25zdHMoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHRfY29uc3QqIGNvID0gKmNfaXRlcjsKLSAgICBpZiAoY28tPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJjb25zdCAlczpcbiVzXG4iLCBjby0+Z2V0X25hbWUoKS5jX3N0cigpLCBjby0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgc3RydWN0cyA9IHByb2dyYW0tPmdldF9zdHJ1Y3RzKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7Ci0gIGZvciAoc19pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzX2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogc3QgPSAqc19pdGVyOwotICAgIGlmIChzdC0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoInN0cnVjdCAlczpcbiVzXG4iLCBzdC0+Z2V0X25hbWUoKS5jX3N0cigpLCBzdC0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgeGNlcHRpb25zID0gcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIHRfc3RydWN0KiB4biA9ICp4X2l0ZXI7Ci0gICAgaWYgKHhuLT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50ZigieGNlcHRpb24gJXM6XG4lc1xuIiwgeG4tPmdldF9uYW1lKCkuY19zdHIoKSwgeG4tPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfc2VydmljZSo+JiBzZXJ2aWNlcyA9IHByb2dyYW0tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgZm9yICh2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyB2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgdF9zZXJ2aWNlKiBzdiA9ICp2X2l0ZXI7Ci0gICAgaWYgKHN2LT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50Zigic2VydmljZSAlczpcbiVzXG4iLCBzdi0+Z2V0X25hbWUoKS5jX3N0cigpLCBzdi0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIEVtaXRzIGEgd2FybmluZyBvbiBsaXN0PGJ5dGU+LCBiaW5hcnkgdHlwZSBpcyB0eXBpY2FsbHkgYSBtdWNoIGJldHRlciBjaG9pY2UuCi0gKi8KLXZvaWQgY2hlY2tfZm9yX2xpc3Rfb2ZfYnl0ZXModF90eXBlKiBsaXN0X2VsZW1fdHlwZSkgewotICBpZiAoKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSAmJiAobGlzdF9lbGVtX3R5cGUgIT0gTlVMTCkgJiYgbGlzdF9lbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGUqIHRiYXNlID0gKHRfYmFzZV90eXBlKilsaXN0X2VsZW1fdHlwZTsKLSAgICBpZiAodGJhc2UtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQllURSkgewotICAgICAgcHdhcm5pbmcoMSwgIkNvbnNpZGVyIHVzaW5nIHRoZSBtb3JlIGVmZmljaWVudCBcImJpbmFyeVwiIHR5cGUgaW5zdGVhZCBvZiBcImxpc3Q8Ynl0ZT5cIi4iKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZlcnNpb24gbnVtYmVyCi0gKi8KLXZvaWQgdmVyc2lvbigpIHsKLSAgcHJpbnRmKCJUaHJpZnQgdmVyc2lvbiAlc1xuIiwgVEhSSUZUX1ZFUlNJT04pOwotfQotCi0vKioKLSAqIERpc3BsYXkgdGhlIHVzYWdlIG1lc3NhZ2UgYW5kIHRoZW4gZXhpdCB3aXRoIGFuIGVycm9yIGNvZGUuCi0gKi8KLXZvaWQgdXNhZ2UoKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHRocmlmdCBbb3B0aW9uc10gZmlsZVxuXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJVc2UgdGhyaWZ0IC1oZWxwIGZvciBhIGxpc3Qgb2Ygb3B0aW9uc1xuIik7Ci0gIGV4aXQoMSk7Ci19Ci0KLS8qKgotICogRGlwbGF5cyB0aGUgaGVscCBtZXNzYWdlIGFuZCB0aGVuIGV4aXRzIHdpdGggYW4gZXJyb3IgY29kZS4KLSAqLwotdm9pZCBoZWxwKCkgewotICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0aHJpZnQgW29wdGlvbnNdIGZpbGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJzaW9uICAgIFByaW50IHRoZSBjb21waWxlciB2ZXJzaW9uXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1vIGRpciAgICAgIFNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgZ2VuLSogcGFja2FnZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIChkZWZhdWx0OiBjdXJyZW50IGRpcmVjdG9yeSlcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dCBkaXIgICAgU2V0IHRoZSBvdXB1dCBsb2NhdGlvbiBmb3IgZ2VuZXJhdGVkIGZpbGVzLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgKG5vIGdlbi0qIGZvbGRlciB3aWxsIGJlIGNyZWF0ZWQpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1JIGRpciAgICAgIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIHNlYXJjaGVkIGZvciBpbmNsdWRlIGRpcmVjdGl2ZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW5vd2FybiAgICAgU3VwcHJlc3MgYWxsIGNvbXBpbGVyIHdhcm5pbmdzIChCQUQhKVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtc3RyaWN0ICAgICBTdHJpY3QgY29tcGlsZXIgd2FybmluZ3Mgb25cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZbZXJib3NlXSAgVmVyYm9zZSBtb2RlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1yW2VjdXJzZV0gIEFsc28gZ2VuZXJhdGUgaW5jbHVkZWQgZmlsZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRlYnVnICAgICAgUGFyc2UgZGVidWcgdHJhY2UgdG8gc3Rkb3V0XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgIiAgLS1hbGxvdy1uZWcta2V5cyAgQWxsb3cgbmVnYXRpdmUgZmllbGQga2V5cyAoVXNlZCB0byAiCi0gICAgICAgICAgInByZXNlcnZlIHByb3RvY29sXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIC50aHJpZnQgZmlsZXMpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC0tYWxsb3ctNjRiaXQtY29uc3RzICBEbyBub3QgcHJpbnQgd2FybmluZ3MgYWJvdXQgdXNpbmcgNjQtYml0IGNvbnN0YW50c1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtLWdlbiBTVFIgICBHZW5lcmF0ZSBjb2RlIHdpdGggYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIGdlbmVyYXRvci5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBTVFIgaGFzIHRoZSBmb3JtIGxhbmd1YWdlWzprZXkxPXZhbDFbLGtleTJbLGtleTM9dmFsM11dXS5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBLZXlzIGFuZCB2YWx1ZXMgYXJlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBnZW5lcmF0b3IuXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgTWFueSBvcHRpb25zIHdpbGwgbm90IHJlcXVpcmUgdmFsdWVzLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJPcHRpb25zIHJlbGF0ZWQgdG8gYXVkaXQgb3BlcmF0aW9uXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAtLWF1ZGl0IE9sZEZpbGUgICBPbGQgVGhyaWZ0IGZpbGUgdG8gYmUgYXVkaXRlZCB3aXRoICdmaWxlJ1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtSW9sZCBkaXIgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIGluY2x1ZGUgZGlyZWN0aXZlcyBmb3Igb2xkIHRocmlmdCBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1JbmV3IGRpciAgICBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBzZWFyY2hlZCBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIGZvciBuZXcgdGhyaWZ0IGZpbGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiQXZhaWxhYmxlIGdlbmVyYXRvcnMgKGFuZCBvcHRpb25zKTpcbiIpOwotCi0gIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QgZ2VuX21hcCA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpOwotICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90OjppdGVyYXRvciBpdGVyOwotICBmb3IgKGl0ZXIgPSBnZW5fbWFwLmJlZ2luKCk7IGl0ZXIgIT0gZ2VuX21hcC5lbmQoKTsgKytpdGVyKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAiICAlcyAoJXMpOlxuIiwKLSAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+Z2V0X3Nob3J0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5nZXRfbG9uZ19uYW1lKCkuY19zdHIoKSk7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlcyIsIGl0ZXItPnNlY29uZC0+Z2V0X2RvY3VtZW50YXRpb24oKS5jX3N0cigpKTsKLSAgfQotICBleGl0KDEpOwotfQotCi0vKioKLSAqIFlvdSBrbm93LCB3aGVuIEkgc3RhcnRlZCB3b3JraW5nIG9uIFRocmlmdCBJIHJlYWxseSB0aG91Z2h0IGl0IHdhc24ndCBnb2luZwotICogdG8gYmVjb21lIGEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgYmVjYXVzZSBpdCB3YXMganVzdCBhIGdlbmVyYXRvciBhbmQgaXQKLSAqIHdvdWxkbid0IG5lZWQgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGFuZCBhbGwgdGhhdCBqYXp6LiBCdXQgdGhlbiB3ZQotICogZGVjaWRlZCB0byBhZGQgY29uc3RhbnRzLCBhbmQgYWxsIG9mIGEgc3VkZGVuIHRoYXQgbWVhbnMgcnVudGltZSB0eXBlCi0gKiB2YWxpZGF0aW9uIGFuZCBpbmZlcmVuY2UsIGV4Y2VwdCB0aGUgInJ1bnRpbWUiIGlzIHRoZSBjb2RlIGdlbmVyYXRvcgotICogcnVudGltZS4KLSAqLwotdm9pZCB2YWxpZGF0ZV9jb25zdF9yZWMoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgInR5cGUgZXJyb3I6IGNhbm5vdCBkZWNsYXJlIGEgdm9pZCBjb25zdDogIiArIG5hbWU7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX1NUUklORykgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgc3RyaW5nIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBib29sIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBieXRlIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGkxNiI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpMzIiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTY0IjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIKLSAgICAgICAgICAmJiB2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEUpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGRvdWJsZSI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUikgewotICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGVudW0iOwotICAgIH0KLQotICAgIC8vIHNlZSBpZiB0aGVyZSdzIGEgZG90IGluIHRoZSBpZGVudGlmaWVyCi0gICAgc3RkOjpzdHJpbmcgbmFtZV9wb3J0aW9uID0gdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSAoKHRfZW51bSopdHlwZSktPmdldF9jb25zdGFudHMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0KLSAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGlmICgoKmNfaXRlciktPmdldF9uYW1lKCkgPT0gbmFtZV9wb3J0aW9uKSB7Ci0gICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghZm91bmQpIHsKLSAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCAiICsgbmFtZSArICIgd2FzIGRlY2xhcmVkIGFzIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCkKLSAgICAgICAgICArICIgd2hpY2ggaXMgYW4gZW51bSwgYnV0ICIgKyB2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKQotICAgICAgICAgICsgIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVApIHsKLSAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJ1Y3QveGNlcHRpb24iOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAodl9pdGVyLT5maXJzdC0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkcpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyBuYW1lICsgIiBzdHJ1Y3Qga2V5IG11c3QgYmUgc3RyaW5nIjsKLSAgICAgIH0KLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiLiIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCksIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGtfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8a2V5PiIsIGtfdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8dmFsPiIsIHZfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGVfdHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBlX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8ZWxlbT4iLCBlX3R5cGUsICp2X2l0ZXIpOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIENoZWNrIHNpbXBsZSBpZGVudGlmaWVyIG5hbWVzCi0gKiBJdCdzIGVhc2llciB0byBkbyBpdCB0aGlzIHdheSBpbnN0ZWFkIG9mIHJld3JpdGluZyB0aGUgd2hvbGUgZ3JhbW1hciBldGMuCi0gKi8KLXZvaWQgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoY29uc3QgY2hhciogaWRlbnRpZmllcikgewotICBzdHJpbmcgbmFtZShpZGVudGlmaWVyKTsKLSAgaWYgKG5hbWUuZmluZCgiLiIpICE9IHN0cmluZzo6bnBvcykgewotICAgIHl5ZXJyb3IoIklkZW50aWZpZXIgJXMgY2FuJ3QgaGF2ZSBhIGRvdC4iLCBpZGVudGlmaWVyKTsKLSAgICBleGl0KDEpOwotICB9Ci19Ci0KLS8qKgotICogQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHBhcnNlZCBjb25zdCBpbmZvcm1hdGlvbiBhZ2FpbnN0IGl0cyBkZWNsYXJlZCB0eXBlCi0gKi8KLXZvaWQgdmFsaWRhdGVfY29uc3RfdHlwZSh0X2NvbnN0KiBjKSB7Ci0gIHZhbGlkYXRlX2NvbnN0X3JlYyhjLT5nZXRfbmFtZSgpLCBjLT5nZXRfdHlwZSgpLCBjLT5nZXRfdmFsdWUoKSk7Ci19Ci0KLS8qKgotICogQ2hlY2sgdGhlIHR5cGUgb2YgYSBkZWZhdWx0IHZhbHVlIGFzc2lnbmVkIHRvIGEgZmllbGQuCi0gKi8KLXZvaWQgdmFsaWRhdGVfZmllbGRfdmFsdWUodF9maWVsZCogZmllbGQsIHRfY29uc3RfdmFsdWUqIGN2KSB7Ci0gIHZhbGlkYXRlX2NvbnN0X3JlYyhmaWVsZC0+Z2V0X25hbWUoKSwgZmllbGQtPmdldF90eXBlKCksIGN2KTsKLX0KLQotLyoqCi0gKiBDaGVjayB0aGF0IGFsbCB0aGUgZWxlbWVudHMgb2YgYSB0aHJvd3MgYmxvY2sgYXJlIGFjdHVhbGx5IGV4Y2VwdGlvbnMuCi0gKi8KLWJvb2wgdmFsaWRhdGVfdGhyb3dzKHRfc3RydWN0KiB0aHJvd3MpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRocm93cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCF0X2dlbmVyYXRvcjo6Z2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFNraXBzIFVURi04IEJPTSBpZiB0aGVyZSBpcyBvbmUKLSAqLwotYm9vbCBza2lwX3V0ZjhfYm9tKEZJTEUqIGYpIHsKLQotICAvLyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLCBidXQgd29ya3MKLSAgaWYgKGZnZXRjKGYpID09IDB4RUYpIHsKLSAgICBpZiAoZmdldGMoZikgPT0gMHhCQikgewotICAgICAgaWYgKGZnZXRjKGYpID09IDB4QkYpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV3aW5kKGYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogUGFyc2VzIGEgcHJvZ3JhbQotICovCi12b2lkIHBhcnNlKHRfcHJvZ3JhbSogcHJvZ3JhbSwgdF9wcm9ncmFtKiBwYXJlbnRfcHJvZ3JhbSkgewotICAvLyBHZXQgc2NvcGUgZmlsZSBwYXRoCi0gIHN0cmluZyBwYXRoID0gcHJvZ3JhbS0+Z2V0X3BhdGgoKTsKLQotICAvLyBTZXQgY3VycmVudCBkaXIgZ2xvYmFsLCB3aGljaCBpcyB1c2VkIGluIHRoZSBpbmNsdWRlX2ZpbGUgZnVuY3Rpb24KLSAgZ19jdXJkaXIgPSBkaXJlY3RvcnlfbmFtZShwYXRoKTsKLSAgZ19jdXJwYXRoID0gcGF0aDsKLQotICAvLyBPcGVuIHRoZSBmaWxlCi0gIC8vIHNraXAgVVRGLTggQk9NIGlmIHRoZXJlIGlzIG9uZQotICB5eWluID0gZm9wZW4ocGF0aC5jX3N0cigpLCAiciIpOwotICBpZiAoeXlpbiA9PSAwKSB7Ci0gICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZTogXCIlc1wiIiwgcGF0aC5jX3N0cigpKTsKLSAgfQotICBpZiAoc2tpcF91dGY4X2JvbSh5eWluKSkKLSAgICBwdmVyYm9zZSgiU2tpcHBlZCBVVEYtOCBCT00gYXQgJXNcbiIsIHBhdGguY19zdHIoKSk7Ci0KLSAgLy8gQ3JlYXRlIG5ldyBzY29wZSBhbmQgc2NhbiBmb3IgaW5jbHVkZXMKLSAgcHZlcmJvc2UoIlNjYW5uaW5nICVzIGZvciBpbmNsdWRlc1xuIiwgcGF0aC5jX3N0cigpKTsKLSAgZ19wYXJzZV9tb2RlID0gSU5DTFVERVM7Ci0gIGdfcHJvZ3JhbSA9IHByb2dyYW07Ci0gIGdfc2NvcGUgPSBwcm9ncmFtLT5zY29wZSgpOwotICB0cnkgewotICAgIHl5bGluZW5vID0gMTsKLSAgICBpZiAoeXlwYXJzZSgpICE9IDApIHsKLSAgICAgIGZhaWx1cmUoIlBhcnNlciBlcnJvciBkdXJpbmcgaW5jbHVkZSBwYXNzLiIpOwotICAgIH0KLSAgfSBjYXRjaCAoc3RyaW5nIHgpIHsKLSAgICBmYWlsdXJlKHguY19zdHIoKSk7Ci0gIH0KLSAgZmNsb3NlKHl5aW4pOwotCi0gIC8vIFJlY3Vyc2l2ZWx5IHBhcnNlIGFsbCB0aGUgaW5jbHVkZSBwcm9ncmFtcwotICB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlcjsKLSAgZm9yIChpdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgcGFyc2UoKml0ZXIsIHByb2dyYW0pOwotICB9Ci0KLSAgLy8gcmVzZXQgcHJvZ3JhbSBkb2N0ZXh0IHN0YXR1cyBiZWZvcmUgcGFyc2luZyBhIG5ldyBmaWxlCi0gIHJlc2V0X3Byb2dyYW1fZG9jdGV4dF9pbmZvKCk7Ci0KLSAgLy8gUGFyc2UgdGhlIHByb2dyYW0gZmlsZQotICBnX3BhcnNlX21vZGUgPSBQUk9HUkFNOwotICBnX3Byb2dyYW0gPSBwcm9ncmFtOwotICBnX3Njb3BlID0gcHJvZ3JhbS0+c2NvcGUoKTsKLSAgZ19wYXJlbnRfc2NvcGUgPSAocGFyZW50X3Byb2dyYW0gIT0gTlVMTCkgPyBwYXJlbnRfcHJvZ3JhbS0+c2NvcGUoKSA6IE5VTEw7Ci0gIGdfcGFyZW50X3ByZWZpeCA9IHByb2dyYW0tPmdldF9uYW1lKCkgKyAiLiI7Ci0gIGdfY3VycGF0aCA9IHBhdGg7Ci0KLSAgLy8gT3BlbiB0aGUgZmlsZQotICAvLyBza2lwIFVURi04IEJPTSBpZiB0aGVyZSBpcyBvbmUKLSAgeXlpbiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInIiKTsKLSAgaWYgKHl5aW4gPT0gMCkgewotICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6IFwiJXNcIiIsIHBhdGguY19zdHIoKSk7Ci0gIH0KLSAgaWYgKHNraXBfdXRmOF9ib20oeXlpbikpCi0gICAgcHZlcmJvc2UoIlNraXBwZWQgVVRGLTggQk9NIGF0ICVzXG4iLCBwYXRoLmNfc3RyKCkpOwotCi0gIHB2ZXJib3NlKCJQYXJzaW5nICVzIGZvciB0eXBlc1xuIiwgcGF0aC5jX3N0cigpKTsKLSAgeXlsaW5lbm8gPSAxOwotICB0cnkgewotICAgIGlmICh5eXBhcnNlKCkgIT0gMCkgewotICAgICAgZmFpbHVyZSgiUGFyc2VyIGVycm9yIGR1cmluZyB0eXBlcyBwYXNzLiIpOwotICAgIH0KLSAgfSBjYXRjaCAoc3RyaW5nIHgpIHsKLSAgICBmYWlsdXJlKHguY19zdHIoKSk7Ci0gIH0KLSAgZmNsb3NlKHl5aW4pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGNvZGUKLSAqLwotdm9pZCBnZW5lcmF0ZSh0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBnZW5lcmF0b3Jfc3RyaW5ncykgewotICAvLyBPb29vaGgsIHJlY3Vyc2l2ZSBjb2RlIGdlbmVyYXRpb24sIGhvdCEhCi0gIGlmIChnZW5fcmVjdXJzZSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAvLyBQcm9wYWdhdGUgb3V0cHV0IHBhdGggZnJvbSBwYXJlbnQgdG8gY2hpbGQgcHJvZ3JhbXMKLSAgICAgIGluY2x1ZGVzW2ldLT5zZXRfb3V0X3BhdGgocHJvZ3JhbS0+Z2V0X291dF9wYXRoKCksIHByb2dyYW0tPmlzX291dF9wYXRoX2Fic29sdXRlKCkpOwotCi0gICAgICBnZW5lcmF0ZShpbmNsdWRlc1tpXSwgZ2VuZXJhdG9yX3N0cmluZ3MpOwotICAgIH0KLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNvZGUhCi0gIHRyeSB7Ci0gICAgcHZlcmJvc2UoIlByb2dyYW06ICVzXG4iLCBwcm9ncmFtLT5nZXRfcGF0aCgpLmNfc3RyKCkpOwotCi0gICAgLy8gQ29tcHV0ZSBmaW5nZXJwcmludHMuIC0gbm90IGFueW1vcmUsIHdlIGRvIGl0IG9uIHRoZSBmbHkgbm93Ci0gICAgLy8gZ2VuZXJhdGVfYWxsX2ZpbmdlcnByaW50cyhwcm9ncmFtKTsKLQotICAgIGlmIChkdW1wX2RvY3MpIHsKLSAgICAgIGR1bXBfZG9jc3RyaW5ncyhwcm9ncmFtKTsKLSAgICB9Ci0KLSAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSBnZW5lcmF0b3Jfc3RyaW5ncy5iZWdpbigpOyBpdGVyICE9IGdlbmVyYXRvcl9zdHJpbmdzLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgIHRfZ2VuZXJhdG9yKiBnZW5lcmF0b3IgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcihwcm9ncmFtLCAqaXRlcik7Ci0KLSAgICAgIGlmIChnZW5lcmF0b3IgPT0gTlVMTCkgewotICAgICAgICBwd2FybmluZygxLCAiVW5hYmxlIHRvIGdldCBhIGdlbmVyYXRvciBmb3IgXCIlc1wiLlxuIiwgaXRlci0+Y19zdHIoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwdmVyYm9zZSgiR2VuZXJhdGluZyBcIiVzXCJcbiIsIGl0ZXItPmNfc3RyKCkpOwotICAgICAgICBnZW5lcmF0b3ItPmdlbmVyYXRlX3Byb2dyYW0oKTsKLSAgICAgICAgZGVsZXRlIGdlbmVyYXRvcjsKLSAgICAgIH0KLSAgICB9Ci0gIH0gY2F0Y2ggKHN0cmluZyBzKSB7Ci0gICAgcHJpbnRmKCJFcnJvcjogJXNcbiIsIHMuY19zdHIoKSk7Ci0gIH0gY2F0Y2ggKGNvbnN0IGNoYXIqIGV4YykgewotICAgIHByaW50ZigiRXJyb3I6ICVzXG4iLCBleGMpOwotICB9Ci19Ci0KLXZvaWQgYXVkaXQodF9wcm9ncmFtKiBuZXdfcHJvZ3JhbSwgdF9wcm9ncmFtKiBvbGRfcHJvZ3JhbSwgc3RyaW5nIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoLCBzdHJpbmcgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGgpCi17Ci0gIHZlY3RvcjxzdHJpbmc+IHRlbXBfaW5jbF9zZWFyY2hwYXRoID0gZ19pbmNsX3NlYXJjaHBhdGg7Ci0gIGlmKCFvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aC5lbXB0eSgpKSB7Ci0gICAgZ19pbmNsX3NlYXJjaHBhdGgucHVzaF9iYWNrKG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoKTsKLSAgfQotCi0gIHBhcnNlKG9sZF9wcm9ncmFtLCBOVUxMKTsKLQotICBnX2luY2xfc2VhcmNocGF0aCA9IHRlbXBfaW5jbF9zZWFyY2hwYXRoOwotICBpZighbmV3X3RocmlmdF9pbmNsdWRlX3BhdGguZW1wdHkoKSkgewotICAgIGdfaW5jbF9zZWFyY2hwYXRoLnB1c2hfYmFjayhuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aCk7Ci0gIH0KLQotICBwYXJzZShuZXdfcHJvZ3JhbSwgTlVMTCk7Ci0KLSAgY29tcGFyZV9uYW1lc3BhY2UobmV3X3Byb2dyYW0sIG9sZF9wcm9ncmFtKTsKLSAgY29tcGFyZV9zZXJ2aWNlcyhuZXdfcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCksIG9sZF9wcm9ncmFtLT5nZXRfc2VydmljZXMoKSk7Ci0gIGNvbXBhcmVfZW51bXMobmV3X3Byb2dyYW0tPmdldF9lbnVtcygpLCBvbGRfcHJvZ3JhbS0+Z2V0X2VudW1zKCkpOwotICBjb21wYXJlX3N0cnVjdHMobmV3X3Byb2dyYW0tPmdldF9zdHJ1Y3RzKCksIG9sZF9wcm9ncmFtLT5nZXRfc3RydWN0cygpKTsKLSAgY29tcGFyZV9zdHJ1Y3RzKG5ld19wcm9ncmFtLT5nZXRfeGNlcHRpb25zKCksIG9sZF9wcm9ncmFtLT5nZXRfeGNlcHRpb25zKCkpOwotICBjb21wYXJlX2NvbnN0cyhuZXdfcHJvZ3JhbS0+Z2V0X2NvbnN0cygpLCBvbGRfcHJvZ3JhbS0+Z2V0X2NvbnN0cygpKTsKLX0KLQotLyoqCi0gKiBQYXJzZSBpdCB1cC4uIHRoZW4gc3BpdCBpdCBiYWNrIG91dCwgaW4gcHJldHR5IG11Y2ggZXZlcnkgbGFuZ3VhZ2UuIEFscmlnaHQKLSAqIG5vdCB0aGF0IG1hbnkgbGFuZ3VhZ2VzLCBidXQgdGhlIGNvb2wgb25lcyB0aGF0IHdlIGNhcmUgYWJvdXQuCi0gKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBpbnQgaTsKLSAgc3RkOjpzdHJpbmcgb3V0X3BhdGg7Ci0gIGJvb2wgb3V0X3BhdGhfaXNfYWJzb2x1dGUgPSBmYWxzZTsKLQotICAvLyBTZXR1cCB0aW1lIHN0cmluZwotICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKLSAgZ190aW1lX3N0ciA9IGN0aW1lKCZub3cpOwotCi0gIC8vIENoZWNrIGZvciBuZWNlc3NhcnkgYXJndW1lbnRzLCB5b3UgZ290dGEgaGF2ZSBhdCBsZWFzdCBhIGZpbGVuYW1lIGFuZAotICAvLyBhbiBvdXRwdXQgbGFuZ3VhZ2UgZmxhZwotICBpZiAoYXJnYyA8IDIpIHsKLSAgICB1c2FnZSgpOwotICB9Ci0KLSAgdmVjdG9yPHN0cmluZz4gZ2VuZXJhdG9yX3N0cmluZ3M7Ci0gIHN0cmluZyBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aDsKLSAgc3RyaW5nIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoOwotICBzdHJpbmcgb2xkX2lucHV0X2ZpbGU7Ci0KLSAgLy8gU2V0IHRoZSBjdXJyZW50IHBhdGggdG8gYSBkdW1teSB2YWx1ZSB0byBtYWtlIHdhcm5pbmcgbWVzc2FnZXMgY2xlYXJlci4KLSAgZ19jdXJwYXRoID0gImFyZ3VtZW50cyI7Ci0KLSAgLy8gSGFja3kgcGFyYW1ldGVyIGhhbmRsaW5nLi4uIEkgZGlkbid0IGZlZWwgbGlrZSB1c2luZyBhIGxpYnJhcnkgc29ycnkhCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjIC0gMTsgaSsrKSB7Ci0gICAgY2hhciogYXJnOwotCi0gICAgYXJnID0gc3RydG9rKGFyZ3ZbaV0sICIgIik7Ci0gICAgd2hpbGUgKGFyZyAhPSBOVUxMKSB7Ci0gICAgICAvLyBUcmVhdCBkb3VibGUgZGFzaGVzIGFzIHNpbmdsZSBkYXNoZXMKLSAgICAgIGlmIChhcmdbMF0gPT0gJy0nICYmIGFyZ1sxXSA9PSAnLScpIHsKLSAgICAgICAgKythcmc7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdHJjbXAoYXJnLCAiLWhlbHAiKSA9PSAwKSB7Ci0gICAgICAgIGhlbHAoKTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi12ZXJzaW9uIikgPT0gMCkgewotICAgICAgICB2ZXJzaW9uKCk7Ci0gICAgICAgIGV4aXQoMCk7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZGVidWciKSA9PSAwKSB7Ci0gICAgICAgIGdfZGVidWcgPSAxOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLW5vd2FybiIpID09IDApIHsKLSAgICAgICAgZ193YXJuID0gMDsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1zdHJpY3QiKSA9PSAwKSB7Ci0gICAgICAgIGdfc3RyaWN0ID0gMjU1OwotICAgICAgICBnX3dhcm4gPSAyOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXYiKSA9PSAwIHx8IHN0cmNtcChhcmcsICItdmVyYm9zZSIpID09IDApIHsKLSAgICAgICAgZ192ZXJib3NlID0gMTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1yIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXJlY3Vyc2UiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9yZWN1cnNlID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hbGxvdy1uZWcta2V5cyIpID09IDApIHsKLSAgICAgICAgZ19hbGxvd19uZWdfZmllbGRfa2V5cyA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYWxsb3ctNjRiaXQtY29uc3RzIikgPT0gMCkgewotICAgICAgICBnX2FsbG93XzY0Yml0X2NvbnN0cyA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZ2VuIikgPT0gMCkgewotICAgICAgICBhcmcgPSBhcmd2WysraV07Ci0gICAgICAgIGlmIChhcmcgPT0gTlVMTCkgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBnZW5lcmF0b3Igc3BlY2lmaWNhdGlvblxuIik7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soYXJnKTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1JIikgPT0gMCkgewotICAgICAgICAvLyBBbiBhcmd1bWVudCBvZiAiLUlcIGFzZGYiIGlzIGludmFsaWQgYW5kIGhhcyB1bmtub3duIHJlc3VsdHMKLSAgICAgICAgYXJnID0gYXJndlsrK2ldOwotCi0gICAgICAgIGlmIChhcmcgPT0gTlVMTCkgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBJbmNsdWRlIGRpcmVjdG9yeVxuIik7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBnX2luY2xfc2VhcmNocGF0aC5wdXNoX2JhY2soYXJnKTsKLSAgICAgIH0gZWxzZSBpZiAoKHN0cmNtcChhcmcsICItbyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAiLW91dCIpID09IDApKSB7Ci0gICAgICAgIG91dF9wYXRoX2lzX2Fic29sdXRlID0gKHN0cmNtcChhcmcsICItb3V0IikgPT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKLSAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICItbzogbWlzc2luZyBvdXRwdXQgZGlyZWN0b3J5XG4iKTsKLSAgICAgICAgICB1c2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIG91dF9wYXRoID0gYXJnOwotCi0jaWZkZWYgX1dJTjMyCi0gICAgICAgIC8vIHN0cmlwIG91dCB0cmFpbGluZyBcIG9uIFdpbmRvd3MKLSAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0ID0gb3V0X3BhdGgubGVuZ3RoKCkgLSAxOwotICAgICAgICBpZiAob3V0X3BhdGhbbGFzdF0gPT0gJ1xcJykgewotICAgICAgICAgIG91dF9wYXRoLmVyYXNlKGxhc3QpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKCFjaGVja19pc19kaXJlY3Rvcnkob3V0X3BhdGguY19zdHIoKSkpCi0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWF1ZGl0IikgPT0gMCkgewotICAgICAgICBnX2F1ZGl0ID0gdHJ1ZTsKLSAgICAgICAgYXJnID0gYXJndlsrK2ldOwotICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3Npbmcgb2xkIHRocmlmdCBmaWxlIG5hbWUgZm9yIGF1ZGl0IG9wZXJhdGlvblxuIik7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBjaGFyIG9sZF90aHJpZnRfZmlsZV9ycFtUSFJJRlRfUEFUSF9NQVhdOwotCi0gICAgICAgIGlmIChzYWZlcmVhbHBhdGgoYXJnLCBvbGRfdGhyaWZ0X2ZpbGVfcnApID09IE5VTEwpIHsKLSAgICAgICAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJnKTsKLSAgICAgICAgfQotICAgICAgICBvbGRfaW5wdXRfZmlsZSA9IHN0cmluZyhvbGRfdGhyaWZ0X2ZpbGVfcnApOwotICAgICAgfSBlbHNlIGlmKHN0cmNtcChhcmcsICItYXVkaXQtbm9mYXRhbCIpID09IDApewotICAgICAgICBnX2F1ZGl0X2ZhdGFsID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItSW9sZCIpID09IDApIHsKLSAgICAgICAgYXJnID0gYXJndlsrK2ldOwotICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgSW5jbHVkZSBkaXJlY3RvcnkgZm9yIG9sZCB0aHJpZnQgZmlsZVxuIik7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCA9IHN0cmluZyhhcmcpOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLUluZXciKSA9PSAwKSB7Ci0gICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKLSAgICAgICAgaWYoYXJnID09IE5VTEwpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIEluY2x1ZGUgZGlyZWN0b3J5IGZvciBuZXcgdGhyaWZ0IGZpbGVcbiIpOwotICAgICAgICB1c2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoID0gc3RyaW5nKGFyZyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBvcHRpb246ICVzXG4iLCBhcmcpOwotICAgICAgICB1c2FnZSgpOwotICAgICAgfQotCi0gICAgICAvLyBUb2tlbml6ZSBtb3JlCi0gICAgICBhcmcgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICB9Ci0gIH0KLQotICAvLyBkaXNwbGF5IGhlbHAKLSAgaWYgKChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItaGVscCIpID09IDApIHx8IChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItLWhlbHAiKSA9PSAwKSkgewotICAgIGhlbHAoKTsKLSAgfQotCi0gIC8vIGlmIHlvdSdyZSBhc2tpbmcgZm9yIHZlcnNpb24sIHlvdSBoYXZlIGEgcmlnaHQgbm90IHRvIHBhc3MgYSBmaWxlCi0gIGlmICgoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLXZlcnNpb24iKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLS12ZXJzaW9uIikgPT0gMCkpIHsKLSAgICB2ZXJzaW9uKCk7Ci0gICAgZXhpdCgwKTsKLSAgfQotCi0gIC8vIEluaXRpYWxpemUgZ2xvYmFsIHR5cGVzCi0gIGdfdHlwZV92b2lkID0gbmV3IHRfYmFzZV90eXBlKCJ2b2lkIiwgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCk7Ci0gIGdfdHlwZV9zdHJpbmcgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7Ci0gIGdfdHlwZV9iaW5hcnkgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7Ci0gICgodF9iYXNlX3R5cGUqKWdfdHlwZV9iaW5hcnkpLT5zZXRfYmluYXJ5KHRydWUpOwotICBnX3R5cGVfc2xpc3QgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7Ci0gICgodF9iYXNlX3R5cGUqKWdfdHlwZV9zbGlzdCktPnNldF9zdHJpbmdfbGlzdCh0cnVlKTsKLSAgZ190eXBlX2Jvb2wgPSBuZXcgdF9iYXNlX3R5cGUoImJvb2wiLCB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKTsKLSAgZ190eXBlX2J5dGUgPSBuZXcgdF9iYXNlX3R5cGUoImJ5dGUiLCB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFKTsKLSAgZ190eXBlX2kxNiA9IG5ldyB0X2Jhc2VfdHlwZSgiaTE2IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTE2KTsKLSAgZ190eXBlX2kzMiA9IG5ldyB0X2Jhc2VfdHlwZSgiaTMyIiwgdF9iYXNlX3R5cGU6OlRZUEVfSTMyKTsKLSAgZ190eXBlX2k2NCA9IG5ldyB0X2Jhc2VfdHlwZSgiaTY0IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTY0KTsKLSAgZ190eXBlX2RvdWJsZSA9IG5ldyB0X2Jhc2VfdHlwZSgiZG91YmxlIiwgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKTsKLQotICBpZihnX2F1ZGl0KQotICB7Ci0gICAgLy8gQXVkaXQgb3BlcmF0aW9uCi0KLSAgICBpZiAob2xkX2lucHV0X2ZpbGUuZW1wdHkoKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGZpbGUgbmFtZSBvZiBvbGQgdGhyaWZ0IGZpbGUgZm9yIGF1ZGl0XG4iKTsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotCi0gICAgY2hhciBuZXdfdGhyaWZ0X2ZpbGVfcnBbVEhSSUZUX1BBVEhfTUFYXTsKLSAgICBpZiAoYXJndltpXSA9PSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZmlsZSBuYW1lIG9mIG5ldyB0aHJpZnQgZmlsZSBmb3IgYXVkaXRcbiIpOwotICAgICAgdXNhZ2UoKTsKLSAgICB9Ci0gICAgaWYgKHNhZmVyZWFscGF0aChhcmd2W2ldLCBuZXdfdGhyaWZ0X2ZpbGVfcnApID09IE5VTEwpIHsKLSAgICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGUgd2l0aCByZWFscGF0aDogJXMiLCBhcmd2W2ldKTsKLSAgICB9Ci0gICAgc3RyaW5nIG5ld19pbnB1dF9maWxlKG5ld190aHJpZnRfZmlsZV9ycCk7Ci0KLSAgICB0X3Byb2dyYW0gbmV3X3Byb2dyYW0obmV3X2lucHV0X2ZpbGUpOwotICAgIHRfcHJvZ3JhbSBvbGRfcHJvZ3JhbShvbGRfaW5wdXRfZmlsZSk7Ci0KLSAgICBhdWRpdCgmbmV3X3Byb2dyYW0sICZvbGRfcHJvZ3JhbSwgbmV3X3RocmlmdF9pbmNsdWRlX3BhdGgsIG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoKTsKLQotICB9IGVsc2UgewotICAgIC8vIEdlbmVyYXRlIG9wdGlvbnMKLSAgICAKLSAgICAvLyBZb3UgZ290dGEgZ2VuZXJhdGUgc29tZXRoaW5nIQotICAgIGlmIChnZW5lcmF0b3Jfc3RyaW5ncy5lbXB0eSgpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIG91dHB1dCBsYW5ndWFnZShzKSBzcGVjaWZpZWRcbiIpOwotICAgICAgdXNhZ2UoKTsKLSAgICB9Ci0KLSAgICAvLyBSZWFsLXBhdGhpZnkgaXQKLSAgICBjaGFyIHJwW1RIUklGVF9QQVRIX01BWF07Ci0gICAgaWYgKGFyZ3ZbaV0gPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGZpbGUgbmFtZVxuIik7Ci0gICAgICB1c2FnZSgpOwotICAgIH0KLSAgICBpZiAoc2FmZXJlYWxwYXRoKGFyZ3ZbaV0sIHJwKSA9PSBOVUxMKSB7Ci0gICAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJndltpXSk7Ci0gICAgfQotICAgIHN0cmluZyBpbnB1dF9maWxlKHJwKTsKLQotICAgIC8vIEluc3RhbmNlIG9mIHRoZSBnbG9iYWwgcGFyc2UgdHJlZQotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0oaW5wdXRfZmlsZSk7Ci0gICAgaWYgKG91dF9wYXRoLnNpemUoKSkgewotICAgICAgcHJvZ3JhbS0+c2V0X291dF9wYXRoKG91dF9wYXRoLCBvdXRfcGF0aF9pc19hYnNvbHV0ZSk7Ci0gICAgfQotCi0gICAgLy8gQ29tcHV0ZSB0aGUgY3BwIGluY2x1ZGUgcHJlZml4LgotICAgIC8vIGluZmVyIHRoaXMgZnJvbSB0aGUgZmlsZW5hbWUgcGFzc2VkIGluCi0gICAgc3RyaW5nIGlucHV0X2ZpbGVuYW1lID0gYXJndltpXTsKLSAgICBzdHJpbmcgaW5jbHVkZV9wcmVmaXg7Ci0KLSAgICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RyaW5nOjpucG9zOwotICAgIGlmICgobGFzdF9zbGFzaCA9IGlucHV0X2ZpbGVuYW1lLnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgewotICAgICAgaW5jbHVkZV9wcmVmaXggPSBpbnB1dF9maWxlbmFtZS5zdWJzdHIoMCwgbGFzdF9zbGFzaCk7Ci0gICAgfQotCi0gICAgcHJvZ3JhbS0+c2V0X2luY2x1ZGVfcHJlZml4KGluY2x1ZGVfcHJlZml4KTsKLQotICAgIC8vIFBhcnNlIGl0IQotICAgIHBhcnNlKHByb2dyYW0sIE5VTEwpOwotCi0gICAgLy8gVGhlIGN1cnJlbnQgcGF0aCBpcyBub3QgcmVhbGx5IHJlbGV2YW50IHdoZW4gd2UgYXJlIGRvaW5nIGdlbmVyYXRpb24uCi0gICAgLy8gUmVzZXQgdGhlIHZhcmlhYmxlIHRvIG1ha2Ugd2FybmluZyBtZXNzYWdlcyBjbGVhcmVyLgotICAgIGdfY3VycGF0aCA9ICJnZW5lcmF0aW9uIjsKLSAgICAvLyBSZXNldCB5eWxpbmVubyBmb3IgdGhlIGhlY2sgb2YgaXQuICBVc2UgMSBpbnN0ZWFkIG9mIDAgYmVjYXVzZQotICAgIC8vIFRoYXQgaXMgd2hhdCBzaG93cyB1cCBkdXJpbmcgYXJndW1lbnQgcGFyc2luZy4KLSAgICB5eWxpbmVubyA9IDE7Ci0KLSAgICAvLyBHZW5lcmF0ZSBpdCEKLSAgICBnZW5lcmF0ZShwcm9ncmFtLCBnZW5lcmF0b3Jfc3RyaW5ncyk7Ci0gICAgZGVsZXRlIHByb2dyYW07Ci0gIH0KLQotICAvLyBDbGVhbiB1cC4gV2hvIGFtIEkga2lkZGluZy4uLiB0aGlzIHByb2dyYW0gcHJvYmFibHkgb3JwaGFucyBoZWFwIG1lbW9yeQotICAvLyBhbGwgb3ZlciB0aGUgcGxhY2UsIGJ1dCB3aG8gY2FyZXMgYmVjYXVzZSBpdCBpcyBhYm91dCB0byBleGl0IGFuZCBpdCBpcwotICAvLyBhbGwgcmVmZXJlbmNlZCBhbmQgdXNlZCBieSB0aGlzIHdhY2t5IHBhcnNlIHRyZWUgdXAgdW50aWwgbm93IGFueXdheXMuCi0KLSAgZGVsZXRlIGdfdHlwZV92b2lkOwotICBkZWxldGUgZ190eXBlX3N0cmluZzsKLSAgZGVsZXRlIGdfdHlwZV9ib29sOwotICBkZWxldGUgZ190eXBlX2J5dGU7Ci0gIGRlbGV0ZSBnX3R5cGVfaTE2OwotICBkZWxldGUgZ190eXBlX2kzMjsKLSAgZGVsZXRlIGdfdHlwZV9pNjQ7Ci0gIGRlbGV0ZSBnX3R5cGVfZG91YmxlOwotCi0gIC8vIEZpbmlzaGVkCi0gIGlmIChnX3JldHVybl9mYWlsdXJlICYmIGdfYXVkaXRfZmF0YWwpIHsKLSAgICBleGl0KDIpOwotICB9Ci0gIC8vIEZpbmlzaGVkCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9tYWluLmggYi9jb21waWxlci9jcHAvc3JjL21haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q0YjAzMi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9NQUlOX0gKLSNkZWZpbmUgVF9NQUlOX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0KLSNpbmNsdWRlICJsb2dnaW5nLmgiCi0KLSNpbmNsdWRlICJwYXJzZS90X2NvbnN0LmgiCi0jaW5jbHVkZSAicGFyc2UvdF9maWVsZC5oIgotCi0vKioKLSAqIERlZmluZWQgaW4gdGhlIGZsZXggbGlicmFyeQotICovCi0KLWV4dGVybiAiQyIgeyBpbnQgeXlsZXgodm9pZCk7IH0KLQotaW50IHl5cGFyc2Uodm9pZCk7Ci0KLS8qKgotICogRXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCBieSBGbGV4L0Jpc29uCi0gKi8KLXZvaWQgeXllcnJvcihjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0KLS8qKgotICogQ2hlY2sgc2ltcGxlIGlkZW50aWZpZXIgbmFtZXMKLSAqLwotdm9pZCB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllcihjb25zdCBjaGFyKiBpZGVudGlmaWVyKTsKLQotLyoqCi0gKiBDaGVjayBjb25zdGFudCB0eXBlcwotICovCi12b2lkIHZhbGlkYXRlX2NvbnN0X3R5cGUodF9jb25zdCogYyk7Ci0KLS8qKgotICogQ2hlY2sgY29uc3RhbnQgdHlwZXMKLSAqLwotdm9pZCB2YWxpZGF0ZV9maWVsZF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCwgdF9jb25zdF92YWx1ZSogY3YpOwotCi0vKioKLSAqIENoZWNrIG1lbWJlcnMgb2YgYSB0aHJvd3MgYmxvY2sKLSAqLwotYm9vbCB2YWxpZGF0ZV90aHJvd3ModF9zdHJ1Y3QqIHRocm93cyk7Ci0KLS8qKgotICogQ29udmVydHMgYSBzdHJpbmcgZmlsZW5hbWUgaW50byBhIHRocmlmdCBwcm9ncmFtIG5hbWUKLSAqLwotc3RkOjpzdHJpbmcgcHJvZ3JhbV9uYW1lKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKLQotLyoqCi0gKiBHZXRzIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIGZpbGVuYW1lCi0gKi8KLXN0ZDo6c3RyaW5nIGRpcmVjdG9yeV9uYW1lKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKLQotLyoqCi0gKiBHZXQgdGhlIGFic29sdXRlIHBhdGggZm9yIGFuIGluY2x1ZGUgZmlsZQotICovCi1zdGQ6OnN0cmluZyBpbmNsdWRlX2ZpbGUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOwotCi0vKioKLSAqIENsZWFycyBhbnkgcHJldmlvdXNseSBzdG9yZWQgZG9jdGV4dCBzdHJpbmcuCi0gKi8KLXZvaWQgY2xlYXJfZG9jdGV4dCgpOwotCi0vKioKLSAqIENsZWFucyB1cCB0ZXh0IGNvbW1vbmx5IGZvdW5kIGluIGRveHlnZW4tbGlrZSBjb21tZW50cwotICovCi1jaGFyKiBjbGVhbl91cF9kb2N0ZXh0KGNoYXIqIGRvY3RleHQpOwotCi0vKioKLSAqIFdlIGFyZSBzdXJlIHRoZSBwcm9ncmFtIGRvY3RleHQgY2FuZGlkYXRlIGlzIHJlYWxseSB0aGUgcHJvZ3JhbSBkb2N0ZXh0LgotICovCi12b2lkIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0KLS8qKgotICogRW1pdHMgYSB3YXJuaW5nIG9uIGxpc3Q8Ynl0ZT4sIGJpbmFyeSB0eXBlIGlzIHR5cGljYWxseSBhIG11Y2ggYmV0dGVyIGNob2ljZS4KLSAqLwotdm9pZCBjaGVja19mb3JfbGlzdF9vZl9ieXRlcyh0X3R5cGUqIGxpc3RfZWxlbV90eXBlKTsKLQotLyoqCi0gKiBGbGV4IHV0aWxpdGllcwotICovCi0KLWV4dGVybiBpbnQgeXlsaW5lbm87Ci1leHRlcm4gY2hhciB5eXRleHRbXTsKLWV4dGVybiBzdGQ6OkZJTEUqIHl5aW47Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9tZDUuYyBiL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNWQ5NmMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9tZDUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKgotICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIEwuIFBldGVyIERldXRzY2gKLSAgZ2hvc3RAYWxhZGRpbi5jb20KLQotICovCi0vKiAkSWQ6IG1kNS5jLHYgMS42IDIwMDIvMDQvMTMgMTk6MjA6MjggbHBkIEV4cCAkICovCi0vKgotICBJbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBNRDUgKFJGQyAxMzIxKS4KLQotICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IEFsZ29yaXRobSBkZWZpbmVkIGluIFJGQyAxMzIxLCB3aG9zZQotICB0ZXh0IGlzIGF2YWlsYWJsZSBhdAotCWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0Ci0gIFRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGV4dCBvZiB0aGUgUkZDLCBpbmNsdWRpbmcgdGhlIHRlc3Qgc3VpdGUKLSAgKHNlY3Rpb24gQS41KSBidXQgZXhjbHVkaW5nIHRoZSByZXN0IG9mIEFwcGVuZGl4IEEuICBJdCBkb2VzIG5vdCBpbmNsdWRlCi0gIGFueSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdGhhdCBpcyBpZGVudGlmaWVkIGluIHRoZSBSRkMgYXMgYmVpbmcKLSAgY29weXJpZ2h0ZWQuCi0KLSAgVGhlIG9yaWdpbmFsIGFuZCBwcmluY2lwYWwgYXV0aG9yIG9mIG1kNS5jIGlzIEwuIFBldGVyIERldXRzY2gKLSAgPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQotICB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6Ci0KLSAgMjAwMi0wNC0xMyBscGQgQ2xhcmlmaWVkIGRlcml2YXRpb24gZnJvbSBSRkMgMTMyMTsgbm93IGhhbmRsZXMgYnl0ZSBvcmRlcgotCWVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5OyBhZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdHJpbmcuaD4KLQlpbiBsaWJyYXJ5LgotICAyMDAyLTAzLTExIGxwZCBDb3JyZWN0ZWQgYXJndW1lbnQgbGlzdCBmb3IgbWFpbigpLCBhbmQgYWRkZWQgaW50IHJldHVybgotCXR5cGUsIGluIHRlc3QgcHJvZ3JhbSBhbmQgVCB2YWx1ZSBwcm9ncmFtLgotICAyMDAyLTAyLTIxIGxwZCBBZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdGRpby5oPiBpbiB0ZXN0IHByb2dyYW0uCi0gIDIwMDAtMDctMDMgbHBkIFBhdGNoZWQgdG8gZWxpbWluYXRlIHdhcm5pbmdzIGFib3V0ICJjb25zdGFudCBpcwotCXVuc2lnbmVkIGluIEFOU0kgQywgc2lnbmVkIGluIHRyYWRpdGlvbmFsIjsgbWFkZSB0ZXN0IHByb2dyYW0KLQlzZWxmLWNoZWNraW5nLgotICAxOTk5LTExLTA0IGxwZCBFZGl0ZWQgY29tbWVudHMgc2xpZ2h0bHkgZm9yIGF1dG9tYXRpYyBUT0MgZXh0cmFjdGlvbi4KLSAgMTk5OS0xMC0xOCBscGQgRml4ZWQgdHlwbyBpbiBoZWFkZXIgY29tbWVudCAoYW5zaTJrbnIgcmF0aGVyIHRoYW4gbWQ1KS4KLSAgMTk5OS0wNS0wMyBscGQgT3JpZ2luYWwgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSAibWQ1LmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSN1bmRlZiBCWVRFX09SREVSCS8qIDEgPSBiaWctZW5kaWFuLCAtMSA9IGxpdHRsZS1lbmRpYW4sIDAgPSB1bmtub3duICovCi0jaWZkZWYgQVJDSF9JU19CSUdfRU5ESUFOCi0jICBkZWZpbmUgQllURV9PUkRFUiAoQVJDSF9JU19CSUdfRU5ESUFOID8gMSA6IC0xKQotI2Vsc2UKLSMgIGRlZmluZSBCWVRFX09SREVSIDAKLSNlbmRpZgotCi0jZGVmaW5lIFRfTUFTSyAoKG1kNV93b3JkX3QpfjApCi0jZGVmaW5lIFQxIC8qIDB4ZDc2YWE0NzggKi8gKFRfTUFTSyBeIDB4Mjg5NTViODcpCi0jZGVmaW5lIFQyIC8qIDB4ZThjN2I3NTYgKi8gKFRfTUFTSyBeIDB4MTczODQ4YTkpCi0jZGVmaW5lIFQzICAgIDB4MjQyMDcwZGIKLSNkZWZpbmUgVDQgLyogMHhjMWJkY2VlZSAqLyAoVF9NQVNLIF4gMHgzZTQyMzExMSkKLSNkZWZpbmUgVDUgLyogMHhmNTdjMGZhZiAqLyAoVF9NQVNLIF4gMHgwYTgzZjA1MCkKLSNkZWZpbmUgVDYgICAgMHg0Nzg3YzYyYQotI2RlZmluZSBUNyAvKiAweGE4MzA0NjEzICovIChUX01BU0sgXiAweDU3Y2ZiOWVjKQotI2RlZmluZSBUOCAvKiAweGZkNDY5NTAxICovIChUX01BU0sgXiAweDAyYjk2YWZlKQotI2RlZmluZSBUOSAgICAweDY5ODA5OGQ4Ci0jZGVmaW5lIFQxMCAvKiAweDhiNDRmN2FmICovIChUX01BU0sgXiAweDc0YmIwODUwKQotI2RlZmluZSBUMTEgLyogMHhmZmZmNWJiMSAqLyAoVF9NQVNLIF4gMHgwMDAwYTQ0ZSkKLSNkZWZpbmUgVDEyIC8qIDB4ODk1Y2Q3YmUgKi8gKFRfTUFTSyBeIDB4NzZhMzI4NDEpCi0jZGVmaW5lIFQxMyAgICAweDZiOTAxMTIyCi0jZGVmaW5lIFQxNCAvKiAweGZkOTg3MTkzICovIChUX01BU0sgXiAweDAyNjc4ZTZjKQotI2RlZmluZSBUMTUgLyogMHhhNjc5NDM4ZSAqLyAoVF9NQVNLIF4gMHg1OTg2YmM3MSkKLSNkZWZpbmUgVDE2ICAgIDB4NDliNDA4MjEKLSNkZWZpbmUgVDE3IC8qIDB4ZjYxZTI1NjIgKi8gKFRfTUFTSyBeIDB4MDllMWRhOWQpCi0jZGVmaW5lIFQxOCAvKiAweGMwNDBiMzQwICovIChUX01BU0sgXiAweDNmYmY0Y2JmKQotI2RlZmluZSBUMTkgICAgMHgyNjVlNWE1MQotI2RlZmluZSBUMjAgLyogMHhlOWI2YzdhYSAqLyAoVF9NQVNLIF4gMHgxNjQ5Mzg1NSkKLSNkZWZpbmUgVDIxIC8qIDB4ZDYyZjEwNWQgKi8gKFRfTUFTSyBeIDB4MjlkMGVmYTIpCi0jZGVmaW5lIFQyMiAgICAweDAyNDQxNDUzCi0jZGVmaW5lIFQyMyAvKiAweGQ4YTFlNjgxICovIChUX01BU0sgXiAweDI3NWUxOTdlKQotI2RlZmluZSBUMjQgLyogMHhlN2QzZmJjOCAqLyAoVF9NQVNLIF4gMHgxODJjMDQzNykKLSNkZWZpbmUgVDI1ICAgIDB4MjFlMWNkZTYKLSNkZWZpbmUgVDI2IC8qIDB4YzMzNzA3ZDYgKi8gKFRfTUFTSyBeIDB4M2NjOGY4MjkpCi0jZGVmaW5lIFQyNyAvKiAweGY0ZDUwZDg3ICovIChUX01BU0sgXiAweDBiMmFmMjc4KQotI2RlZmluZSBUMjggICAgMHg0NTVhMTRlZAotI2RlZmluZSBUMjkgLyogMHhhOWUzZTkwNSAqLyAoVF9NQVNLIF4gMHg1NjFjMTZmYSkKLSNkZWZpbmUgVDMwIC8qIDB4ZmNlZmEzZjggKi8gKFRfTUFTSyBeIDB4MDMxMDVjMDcpCi0jZGVmaW5lIFQzMSAgICAweDY3NmYwMmQ5Ci0jZGVmaW5lIFQzMiAvKiAweDhkMmE0YzhhICovIChUX01BU0sgXiAweDcyZDViMzc1KQotI2RlZmluZSBUMzMgLyogMHhmZmZhMzk0MiAqLyAoVF9NQVNLIF4gMHgwMDA1YzZiZCkKLSNkZWZpbmUgVDM0IC8qIDB4ODc3MWY2ODEgKi8gKFRfTUFTSyBeIDB4Nzg4ZTA5N2UpCi0jZGVmaW5lIFQzNSAgICAweDZkOWQ2MTIyCi0jZGVmaW5lIFQzNiAvKiAweGZkZTUzODBjICovIChUX01BU0sgXiAweDAyMWFjN2YzKQotI2RlZmluZSBUMzcgLyogMHhhNGJlZWE0NCAqLyAoVF9NQVNLIF4gMHg1YjQxMTViYikKLSNkZWZpbmUgVDM4ICAgIDB4NGJkZWNmYTkKLSNkZWZpbmUgVDM5IC8qIDB4ZjZiYjRiNjAgKi8gKFRfTUFTSyBeIDB4MDk0NGI0OWYpCi0jZGVmaW5lIFQ0MCAvKiAweGJlYmZiYzcwICovIChUX01BU0sgXiAweDQxNDA0MzhmKQotI2RlZmluZSBUNDEgICAgMHgyODliN2VjNgotI2RlZmluZSBUNDIgLyogMHhlYWExMjdmYSAqLyAoVF9NQVNLIF4gMHgxNTVlZDgwNSkKLSNkZWZpbmUgVDQzIC8qIDB4ZDRlZjMwODUgKi8gKFRfTUFTSyBeIDB4MmIxMGNmN2EpCi0jZGVmaW5lIFQ0NCAgICAweDA0ODgxZDA1Ci0jZGVmaW5lIFQ0NSAvKiAweGQ5ZDRkMDM5ICovIChUX01BU0sgXiAweDI2MmIyZmM2KQotI2RlZmluZSBUNDYgLyogMHhlNmRiOTllNSAqLyAoVF9NQVNLIF4gMHgxOTI0NjYxYSkKLSNkZWZpbmUgVDQ3ICAgIDB4MWZhMjdjZjgKLSNkZWZpbmUgVDQ4IC8qIDB4YzRhYzU2NjUgKi8gKFRfTUFTSyBeIDB4M2I1M2E5OWEpCi0jZGVmaW5lIFQ0OSAvKiAweGY0MjkyMjQ0ICovIChUX01BU0sgXiAweDBiZDZkZGJiKQotI2RlZmluZSBUNTAgICAgMHg0MzJhZmY5NwotI2RlZmluZSBUNTEgLyogMHhhYjk0MjNhNyAqLyAoVF9NQVNLIF4gMHg1NDZiZGM1OCkKLSNkZWZpbmUgVDUyIC8qIDB4ZmM5M2EwMzkgKi8gKFRfTUFTSyBeIDB4MDM2YzVmYzYpCi0jZGVmaW5lIFQ1MyAgICAweDY1NWI1OWMzCi0jZGVmaW5lIFQ1NCAvKiAweDhmMGNjYzkyICovIChUX01BU0sgXiAweDcwZjMzMzZkKQotI2RlZmluZSBUNTUgLyogMHhmZmVmZjQ3ZCAqLyAoVF9NQVNLIF4gMHgwMDEwMGI4MikKLSNkZWZpbmUgVDU2IC8qIDB4ODU4NDVkZDEgKi8gKFRfTUFTSyBeIDB4N2E3YmEyMmUpCi0jZGVmaW5lIFQ1NyAgICAweDZmYTg3ZTRmCi0jZGVmaW5lIFQ1OCAvKiAweGZlMmNlNmUwICovIChUX01BU0sgXiAweDAxZDMxOTFmKQotI2RlZmluZSBUNTkgLyogMHhhMzAxNDMxNCAqLyAoVF9NQVNLIF4gMHg1Y2ZlYmNlYikKLSNkZWZpbmUgVDYwICAgIDB4NGUwODExYTEKLSNkZWZpbmUgVDYxIC8qIDB4Zjc1MzdlODIgKi8gKFRfTUFTSyBeIDB4MDhhYzgxN2QpCi0jZGVmaW5lIFQ2MiAvKiAweGJkM2FmMjM1ICovIChUX01BU0sgXiAweDQyYzUwZGNhKQotI2RlZmluZSBUNjMgICAgMHgyYWQ3ZDJiYgotI2RlZmluZSBUNjQgLyogMHhlYjg2ZDM5MSAqLyAoVF9NQVNLIF4gMHgxNDc5MmM2ZSkKLQotCi1zdGF0aWMgdm9pZAotbWQ1X3Byb2Nlc3MobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSAvKls2NF0qLykKLXsKLSAgICBtZDVfd29yZF90Ci0JYSA9IHBtcy0+YWJjZFswXSwgYiA9IHBtcy0+YWJjZFsxXSwKLQljID0gcG1zLT5hYmNkWzJdLCBkID0gcG1zLT5hYmNkWzNdOwotICAgIG1kNV93b3JkX3QgdDsKLSNpZiBCWVRFX09SREVSID4gMAotICAgIC8qIERlZmluZSBzdG9yYWdlIG9ubHkgZm9yIGJpZy1lbmRpYW4gQ1BVcy4gKi8KLSAgICBtZDVfd29yZF90IFhbMTZdOwotI2Vsc2UKLSAgICAvKiBEZWZpbmUgc3RvcmFnZSBmb3IgbGl0dGxlLWVuZGlhbiBvciBib3RoIHR5cGVzIG9mIENQVXMuICovCi0gICAgbWQ1X3dvcmRfdCB4YnVmWzE2XTsKLSAgICBjb25zdCBtZDVfd29yZF90ICpYOwotI2VuZGlmCi0KLSAgICB7Ci0jaWYgQllURV9PUkRFUiA9PSAwCi0JLyoKLQkgKiBEZXRlcm1pbmUgZHluYW1pY2FsbHkgd2hldGhlciB0aGlzIGlzIGEgYmlnLWVuZGlhbiBvcgotCSAqIGxpdHRsZS1lbmRpYW4gbWFjaGluZSwgc2luY2Ugd2UgY2FuIHVzZSBhIG1vcmUgZWZmaWNpZW50Ci0JICogYWxnb3JpdGhtIG9uIHRoZSBsYXR0ZXIuCi0JICovCi0Jc3RhdGljIGNvbnN0IGludCB3ID0gMTsKLQotCWlmICgqKChjb25zdCBtZDVfYnl0ZV90ICopJncpKSAvKiBkeW5hbWljIGxpdHRsZS1lbmRpYW4gKi8KLSNlbmRpZgotI2lmIEJZVEVfT1JERVIgPD0gMAkJLyogbGl0dGxlLWVuZGlhbiAqLwotCXsKLQkgICAgLyoKLQkgICAgICogT24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgd2UgY2FuIHByb2Nlc3MgcHJvcGVybHkgYWxpZ25lZAotCSAgICAgKiBkYXRhIHdpdGhvdXQgY29weWluZyBpdC4KLQkgICAgICovCi0JICAgIGlmICghKChkYXRhIC0gKGNvbnN0IG1kNV9ieXRlX3QgKikwKSAmIDMpKSB7Ci0JCS8qIGRhdGEgYXJlIHByb3Blcmx5IGFsaWduZWQgKi8KLQkJWCA9IChjb25zdCBtZDVfd29yZF90ICopZGF0YTsKLQkgICAgfSBlbHNlIHsKLQkJLyogbm90IGFsaWduZWQgKi8KLQkJbWVtY3B5KHhidWYsIGRhdGEsIDY0KTsKLQkJWCA9IHhidWY7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLSNpZiBCWVRFX09SREVSID09IDAKLQllbHNlCQkJLyogZHluYW1pYyBiaWctZW5kaWFuICovCi0jZW5kaWYKLSNpZiBCWVRFX09SREVSID49IDAJCS8qIGJpZy1lbmRpYW4gKi8KLQl7Ci0JICAgIC8qCi0JICAgICAqIE9uIGJpZy1lbmRpYW4gbWFjaGluZXMsIHdlIG11c3QgYXJyYW5nZSB0aGUgYnl0ZXMgaW4gdGhlCi0JICAgICAqIHJpZ2h0IG9yZGVyLgotCSAgICAgKi8KLQkgICAgY29uc3QgbWQ1X2J5dGVfdCAqeHAgPSBkYXRhOwotCSAgICBpbnQgaTsKLQotIyAgaWYgQllURV9PUkRFUiA9PSAwCi0JICAgIFggPSB4YnVmOwkJLyogKGR5bmFtaWMgb25seSkgKi8KLSMgIGVsc2UKLSMgICAgZGVmaW5lIHhidWYgWAkJLyogKHN0YXRpYyBvbmx5KSAqLwotIyAgZW5kaWYKLQkgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2ksIHhwICs9IDQpCi0JCXhidWZbaV0gPSB4cFswXSArICh4cFsxXSA8PCA4KSArICh4cFsyXSA8PCAxNikgKyAoeHBbM10gPDwgMjQpOwotCX0KLSNlbmRpZgotICAgIH0KLQotI2RlZmluZSBST1RBVEVfTEVGVCh4LCBuKSAoKCh4KSA8PCAobikpIHwgKCh4KSA+PiAoMzIgLSAobikpKSkKLQotICAgIC8qIFJvdW5kIDEuICovCi0gICAgLyogTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAgIGEgPSBiICsgKChhICsgRihiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLwotI2RlZmluZSBGKHgsIHksIHopICgoKHgpICYgKHkpKSB8ICh+KHgpICYgKHopKSkKLSNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKLSAgdCA9IGEgKyBGKGIsYyxkKSArIFhba10gKyBUaTtcCi0gIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKLSAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCi0gICAgU0VUKGEsIGIsIGMsIGQsICAwLCAgNywgIFQxKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDEsIDEyLCAgVDIpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgMiwgMTcsICBUMyk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICAzLCAyMiwgIFQ0KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDQsICA3LCAgVDUpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgNSwgMTIsICBUNik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICA2LCAxNywgIFQ3KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDcsIDIyLCAgVDgpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOCwgIDcsICBUOSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA5LCAxMiwgVDEwKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTAsIDE3LCBUMTEpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxMSwgMjIsIFQxMik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsIDEyLCAgNywgVDEzKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTMsIDEyLCBUMTQpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxNCwgMTcsIFQxNSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDE1LCAyMiwgVDE2KTsKLSN1bmRlZiBTRVQKLQotICAgICAvKiBSb3VuZCAyLiAqLwotICAgICAvKiBMZXQgW2FiY2QgayBzIGldIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgYSA9IGIgKyAoKGEgKyBHKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCi0jZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmIH4oeikpKQotI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAotICB0ID0gYSArIEcoYixjLGQpICsgWFtrXSArIFRpO1wKLSAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgotICAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCi0gICAgU0VUKGEsIGIsIGMsIGQsICAxLCAgNSwgVDE3KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDYsICA5LCBUMTgpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxMSwgMTQsIFQxOSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICAwLCAyMCwgVDIwKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDUsICA1LCBUMjEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxMCwgIDksIFQyMik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDE1LCAxNCwgVDIzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDQsIDIwLCBUMjQpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOSwgIDUsIFQyNSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDE0LCAgOSwgVDI2KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDMsIDE0LCBUMjcpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgOCwgMjAsIFQyOCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsIDEzLCAgNSwgVDI5KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDIsICA5LCBUMzApOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNywgMTQsIFQzMSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDEyLCAyMCwgVDMyKTsKLSN1bmRlZiBTRVQKLQotICAgICAvKiBSb3VuZCAzLiAqLwotICAgICAvKiBMZXQgW2FiY2QgayBzIHRdIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgYSA9IGIgKyAoKGEgKyBIKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCi0jZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKLSNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKLSAgdCA9IGEgKyBIKGIsYyxkKSArIFhba10gKyBUaTtcCi0gIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKLSAgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLwotICAgIFNFVChhLCBiLCBjLCBkLCAgNSwgIDQsIFQzMyk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA4LCAxMSwgVDM0KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTEsIDE2LCBUMzUpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxNCwgMjMsIFQzNik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICAxLCAgNCwgVDM3KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDQsIDExLCBUMzgpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNywgMTYsIFQzOSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDEwLCAyMywgVDQwKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgMTMsICA0LCBUNDEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgMCwgMTEsIFQ0Mik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICAzLCAxNiwgVDQzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDYsIDIzLCBUNDQpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOSwgIDQsIFQ0NSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDEyLCAxMSwgVDQ2KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTUsIDE2LCBUNDcpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgMiwgMjMsIFQ0OCk7Ci0jdW5kZWYgU0VUCi0KLSAgICAgLyogUm91bmQgNC4gKi8KLSAgICAgLyogTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAgICAgIGEgPSBiICsgKChhICsgSShiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLwotI2RlZmluZSBJKHgsIHksIHopICgoeSkgXiAoKHgpIHwgfih6KSkpCi0jZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCi0gIHQgPSBhICsgSShiLGMsZCkgKyBYW2tdICsgVGk7XAotICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCi0gICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KLSAgICBTRVQoYSwgYiwgYywgZCwgIDAsICA2LCBUNDkpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgNywgMTAsIFQ1MCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDE0LCAxNSwgVDUxKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDUsIDIxLCBUNTIpOwotICAgIFNFVChhLCBiLCBjLCBkLCAxMiwgIDYsIFQ1Myk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICAzLCAxMCwgVDU0KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTAsIDE1LCBUNTUpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgMSwgMjEsIFQ1Nik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA4LCAgNiwgVDU3KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTUsIDEwLCBUNTgpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNiwgMTUsIFQ1OSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDEzLCAyMSwgVDYwKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDQsICA2LCBUNjEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxMSwgMTAsIFQ2Mik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICAyLCAxNSwgVDYzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDksIDIxLCBUNjQpOwotI3VuZGVmIFNFVAotCi0gICAgIC8qIFRoZW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucy4gKFRoYXQgaXMgaW5jcmVtZW50IGVhY2gKLSAgICAgICAgb2YgdGhlIGZvdXIgcmVnaXN0ZXJzIGJ5IHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHRoaXMgYmxvY2sKLSAgICAgICAgd2FzIHN0YXJ0ZWQuKSAqLwotICAgIHBtcy0+YWJjZFswXSArPSBhOwotICAgIHBtcy0+YWJjZFsxXSArPSBiOwotICAgIHBtcy0+YWJjZFsyXSArPSBjOwotICAgIHBtcy0+YWJjZFszXSArPSBkOwotfQotCi12b2lkCi1tZDVfaW5pdChtZDVfc3RhdGVfdCAqcG1zKQotewotICAgIHBtcy0+Y291bnRbMF0gPSBwbXMtPmNvdW50WzFdID0gMDsKLSAgICBwbXMtPmFiY2RbMF0gPSAweDY3NDUyMzAxOwotICAgIHBtcy0+YWJjZFsxXSA9IC8qMHhlZmNkYWI4OSovIFRfTUFTSyBeIDB4MTAzMjU0NzY7Ci0gICAgcG1zLT5hYmNkWzJdID0gLyoweDk4YmFkY2ZlKi8gVF9NQVNLIF4gMHg2NzQ1MjMwMTsKLSAgICBwbXMtPmFiY2RbM10gPSAweDEwMzI1NDc2OwotfQotCi12b2lkCi1tZDVfYXBwZW5kKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEsIGludCBuYnl0ZXMpCi17Ci0gICAgY29uc3QgbWQ1X2J5dGVfdCAqcCA9IGRhdGE7Ci0gICAgaW50IGxlZnQgPSBuYnl0ZXM7Ci0gICAgaW50IG9mZnNldCA9IChwbXMtPmNvdW50WzBdID4+IDMpICYgNjM7Ci0gICAgbWQ1X3dvcmRfdCBuYml0cyA9IChtZDVfd29yZF90KShuYnl0ZXMgPDwgMyk7Ci0KLSAgICBpZiAobmJ5dGVzIDw9IDApCi0JcmV0dXJuOwotCi0gICAgLyogVXBkYXRlIHRoZSBtZXNzYWdlIGxlbmd0aC4gKi8KLSAgICBwbXMtPmNvdW50WzFdICs9IG5ieXRlcyA+PiAyOTsKLSAgICBwbXMtPmNvdW50WzBdICs9IG5iaXRzOwotICAgIGlmIChwbXMtPmNvdW50WzBdIDwgbmJpdHMpCi0JcG1zLT5jb3VudFsxXSsrOwotCi0gICAgLyogUHJvY2VzcyBhbiBpbml0aWFsIHBhcnRpYWwgYmxvY2suICovCi0gICAgaWYgKG9mZnNldCkgewotCWludCBjb3B5ID0gKG9mZnNldCArIG5ieXRlcyA+IDY0ID8gNjQgLSBvZmZzZXQgOiBuYnl0ZXMpOwotCi0JbWVtY3B5KHBtcy0+YnVmICsgb2Zmc2V0LCBwLCBjb3B5KTsKLQlpZiAob2Zmc2V0ICsgY29weSA8IDY0KQotCSAgICByZXR1cm47Ci0JcCArPSBjb3B5OwotCWxlZnQgLT0gY29weTsKLQltZDVfcHJvY2VzcyhwbXMsIHBtcy0+YnVmKTsKLSAgICB9Ci0KLSAgICAvKiBQcm9jZXNzIGZ1bGwgYmxvY2tzLiAqLwotICAgIGZvciAoOyBsZWZ0ID49IDY0OyBwICs9IDY0LCBsZWZ0IC09IDY0KQotCW1kNV9wcm9jZXNzKHBtcywgcCk7Ci0KLSAgICAvKiBQcm9jZXNzIGEgZmluYWwgcGFydGlhbCBibG9jay4gKi8KLSAgICBpZiAobGVmdCkKLQltZW1jcHkocG1zLT5idWYsIHAsIGxlZnQpOwotfQotCi12b2lkCi1tZDVfZmluaXNoKG1kNV9zdGF0ZV90ICpwbXMsIG1kNV9ieXRlX3QgZGlnZXN0WzE2XSkKLXsKLSAgICBzdGF0aWMgY29uc3QgbWQ1X2J5dGVfdCBwYWRbNjRdID0gewotCTB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLSAgICB9OwotICAgIG1kNV9ieXRlX3QgZGF0YVs4XTsKLSAgICBpbnQgaTsKLQotICAgIC8qIFNhdmUgdGhlIGxlbmd0aCBiZWZvcmUgcGFkZGluZy4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQotCWRhdGFbaV0gPSAobWQ1X2J5dGVfdCkocG1zLT5jb3VudFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKLSAgICAvKiBQYWQgdG8gNTYgYnl0ZXMgbW9kIDY0LiAqLwotICAgIG1kNV9hcHBlbmQocG1zLCBwYWQsICgoNTUgLSAocG1zLT5jb3VudFswXSA+PiAzKSkgJiA2MykgKyAxKTsKLSAgICAvKiBBcHBlbmQgdGhlIGxlbmd0aC4gKi8KLSAgICBtZDVfYXBwZW5kKHBtcywgZGF0YSwgOCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpCi0JZGlnZXN0W2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+YWJjZFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKLX0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmggYi9jb21waWxlci9jcHAvc3JjL21kNS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmJlNDk4Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIEwuIFBldGVyIERldXRzY2gKLSAgZ2hvc3RAYWxhZGRpbi5jb20KLQotICovCi0vKiAkSWQ6IG1kNS5oLHYgMS40IDIwMDIvMDQvMTMgMTk6MjA6MjggbHBkIEV4cCAkICovCi0vKgotICBJbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBNRDUgKFJGQyAxMzIxKS4KLQotICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IEFsZ29yaXRobSBkZWZpbmVkIGluIFJGQyAxMzIxLCB3aG9zZQotICB0ZXh0IGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0Ci0gIFRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGV4dCBvZiB0aGUgUkZDLCBpbmNsdWRpbmcgdGhlIHRlc3Qgc3VpdGUKLSAgKHNlY3Rpb24gQS41KSBidXQgZXhjbHVkaW5nIHRoZSByZXN0IG9mIEFwcGVuZGl4IEEuICBJdCBkb2VzIG5vdCBpbmNsdWRlCi0gIGFueSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdGhhdCBpcyBpZGVudGlmaWVkIGluIHRoZSBSRkMgYXMgYmVpbmcKLSAgY29weXJpZ2h0ZWQuCi0KLSAgVGhlIG9yaWdpbmFsIGFuZCBwcmluY2lwYWwgYXV0aG9yIG9mIG1kNS5oIGlzIEwuIFBldGVyIERldXRzY2gKLSAgPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQotICB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6Ci0KLSAgMjAwMi0wNC0xMyBscGQgUmVtb3ZlZCBzdXBwb3J0IGZvciBub24tQU5TSSBjb21waWxlcnM7IHJlbW92ZWQKLSAgICByZWZlcmVuY2VzIHRvIEdob3N0c2NyaXB0OyBjbGFyaWZpZWQgZGVyaXZhdGlvbiBmcm9tIFJGQyAxMzIxOwotICAgIG5vdyBoYW5kbGVzIGJ5dGUgb3JkZXIgZWl0aGVyIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkuCi0gIDE5OTktMTEtMDQgbHBkIEVkaXRlZCBjb21tZW50cyBzbGlnaHRseSBmb3IgYXV0b21hdGljIFRPQyBleHRyYWN0aW9uLgotICAxOTk5LTEwLTE4IGxwZCBGaXhlZCB0eXBvIGluIGhlYWRlciBjb21tZW50IChhbnNpMmtuciByYXRoZXIgdGhhbiBtZDUpOwotICAgIGFkZGVkIGNvbmRpdGlvbmFsaXphdGlvbiBmb3IgQysrIGNvbXBpbGF0aW9uIGZyb20gTWFydGluCi0gICAgUHVyc2Noa2UgPHB1cnNjaGtlQGJubC5nb3Y+LgotICAxOTk5LTA1LTAzIGxwZCBPcmlnaW5hbCB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgbWQ1X0lOQ0xVREVECi0jZGVmaW5lIG1kNV9JTkNMVURFRAotCi0vKgotICogVGhpcyBwYWNrYWdlIHN1cHBvcnRzIGJvdGggY29tcGlsZS10aW1lIGFuZCBydW4tdGltZSBkZXRlcm1pbmF0aW9uIG9mIENQVQotICogYnl0ZSBvcmRlci4gIElmIEFSQ0hfSVNfQklHX0VORElBTiBpcyBkZWZpbmVkIGFzIDAsIHRoZSBjb2RlIHdpbGwgYmUKLSAqIGNvbXBpbGVkIHRvIHJ1biBvbmx5IG9uIGxpdHRsZS1lbmRpYW4gQ1BVczsgaWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzCi0gKiBkZWZpbmVkIGFzIG5vbi16ZXJvLCB0aGUgY29kZSB3aWxsIGJlIGNvbXBpbGVkIHRvIHJ1biBvbmx5IG9uIGJpZy1lbmRpYW4KLSAqIENQVXM7IGlmIEFSQ0hfSVNfQklHX0VORElBTiBpcyBub3QgZGVmaW5lZCwgdGhlIGNvZGUgd2lsbCBiZSBjb21waWxlZCB0bwotICogcnVuIG9uIGVpdGhlciBiaWctIG9yIGxpdHRsZS1lbmRpYW4gQ1BVcywgYnV0IHdpbGwgcnVuIHNsaWdodGx5IGxlc3MKLSAqIGVmZmljaWVudGx5IG9uIGVpdGhlciBvbmUgdGhhbiBpZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMgZGVmaW5lZC4KLSAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgbWQ1X2J5dGVfdDsgLyogOC1iaXQgYnl0ZSAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgbWQ1X3dvcmRfdDsgIC8qIDMyLWJpdCB3b3JkICovCi0KLS8qIERlZmluZSB0aGUgc3RhdGUgb2YgdGhlIE1ENSBBbGdvcml0aG0uICovCi10eXBlZGVmIHN0cnVjdCBtZDVfc3RhdGVfcyB7Ci0gIG1kNV93b3JkX3QgY291bnRbMl07IC8qIG1lc3NhZ2UgbGVuZ3RoIGluIGJpdHMsIGxzdyBmaXJzdCAqLwotICBtZDVfd29yZF90IGFiY2RbNF07ICAvKiBkaWdlc3QgYnVmZmVyICovCi0gIG1kNV9ieXRlX3QgYnVmWzY0XTsgIC8qIGFjY3VtdWxhdGUgYmxvY2sgKi8KLX0gbWQ1X3N0YXRlX3Q7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogSW5pdGlhbGl6ZSB0aGUgYWxnb3JpdGhtLiAqLwotdm9pZCBtZDVfaW5pdChtZDVfc3RhdGVfdCogcG1zKTsKLQotLyogQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSBtZXNzYWdlLiAqLwotdm9pZCBtZDVfYXBwZW5kKG1kNV9zdGF0ZV90KiBwbXMsIGNvbnN0IG1kNV9ieXRlX3QqIGRhdGEsIGludCBuYnl0ZXMpOwotCi0vKiBGaW5pc2ggdGhlIG1lc3NhZ2UgYW5kIHJldHVybiB0aGUgZGlnZXN0LiAqLwotdm9pZCBtZDVfZmluaXNoKG1kNV9zdGF0ZV90KiBwbXMsIG1kNV9ieXRlX3QgZGlnZXN0WzE2XSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvKiBlbmQgZXh0ZXJuICJDIiAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBtZDVfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvcGFyc2UuY2MgYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3BhcnNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjJlZTUyLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvcGFyc2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLSNpbmNsdWRlICJ0X3R5cGVkZWYuaCIKLQotI2luY2x1ZGUgIm1haW4uaCIKLQotdF90eXBlKiB0X3R5cGU6OmdldF90cnVlX3R5cGUoKSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRoaXM7Ci0gIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0gIHJldHVybiB0eXBlOwotfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Jhc2VfdHlwZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Jhc2VfdHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmUxZjgwLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9iYXNlX3R5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9CQVNFX1RZUEVfSAotI2RlZmluZSBUX0JBU0VfVFlQRV9ICi0KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgInRfdHlwZS5oIgotCi0vKioKLSAqIEEgdGhyaWZ0IGJhc2UgdHlwZSwgd2hpY2ggbXVzdCBiZSBvbmUgb2YgdGhlIGRlZmluZWQgZW51bWVyYXRlZCB0eXBlcyBpbnNpZGUKLSAqIHRoaXMgZGVmaW5pdGlvbi4KLSAqCi0gKi8KLWNsYXNzIHRfYmFzZV90eXBlIDogcHVibGljIHRfdHlwZSB7Ci1wdWJsaWM6Ci0gIC8qKgotICAgKiBFbnVtZXJhdGlvbiBvZiB0aHJpZnQgYmFzZSB0eXBlcwotICAgKi8KLSAgZW51bSB0X2Jhc2UgewotICAgIFRZUEVfVk9JRCwKLSAgICBUWVBFX1NUUklORywKLSAgICBUWVBFX0JPT0wsCi0gICAgVFlQRV9CWVRFLAotICAgIFRZUEVfSTE2LAotICAgIFRZUEVfSTMyLAotICAgIFRZUEVfSTY0LAotICAgIFRZUEVfRE9VQkxFCi0gIH07Ci0KLSAgdF9iYXNlX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF9iYXNlIGJhc2UpCi0gICAgOiB0X3R5cGUobmFtZSksIGJhc2VfKGJhc2UpLCBzdHJpbmdfbGlzdF8oZmFsc2UpLCBiaW5hcnlfKGZhbHNlKSwgc3RyaW5nX2VudW1fKGZhbHNlKSB7fQotCi0gIHRfYmFzZSBnZXRfYmFzZSgpIGNvbnN0IHsgcmV0dXJuIGJhc2VfOyB9Ci0KLSAgYm9vbCBpc192b2lkKCkgY29uc3QgeyByZXR1cm4gYmFzZV8gPT0gVFlQRV9WT0lEOyB9Ci0KLSAgYm9vbCBpc19zdHJpbmcoKSBjb25zdCB7IHJldHVybiBiYXNlXyA9PSBUWVBFX1NUUklORzsgfQotCi0gIGJvb2wgaXNfYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGJhc2VfID09IFRZUEVfQk9PTDsgfQotCi0gIHZvaWQgc2V0X3N0cmluZ19saXN0KGJvb2wgdmFsKSB7IHN0cmluZ19saXN0XyA9IHZhbDsgfQotCi0gIGJvb2wgaXNfc3RyaW5nX2xpc3QoKSBjb25zdCB7IHJldHVybiAoYmFzZV8gPT0gVFlQRV9TVFJJTkcpICYmIHN0cmluZ19saXN0XzsgfQotCi0gIHZvaWQgc2V0X2JpbmFyeShib29sIHZhbCkgeyBiaW5hcnlfID0gdmFsOyB9Ci0KLSAgYm9vbCBpc19iaW5hcnkoKSBjb25zdCB7IHJldHVybiAoYmFzZV8gPT0gVFlQRV9TVFJJTkcpICYmIGJpbmFyeV87IH0KLQotICB2b2lkIHNldF9zdHJpbmdfZW51bShib29sIHZhbCkgeyBzdHJpbmdfZW51bV8gPSB2YWw7IH0KLQotICBib29sIGlzX3N0cmluZ19lbnVtKCkgY29uc3QgeyByZXR1cm4gYmFzZV8gPT0gVFlQRV9TVFJJTkcgJiYgc3RyaW5nX2VudW1fOyB9Ci0KLSAgdm9pZCBhZGRfc3RyaW5nX2VudW1fdmFsKHN0ZDo6c3RyaW5nIHZhbCkgeyBzdHJpbmdfZW51bV92YWxzXy5wdXNoX2JhY2sodmFsKTsgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X3N0cmluZ19lbnVtX3ZhbHMoKSBjb25zdCB7IHJldHVybiBzdHJpbmdfZW51bV92YWxzXzsgfQotCi0gIGJvb2wgaXNfYmFzZV90eXBlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyB0X2Jhc2VfbmFtZSh0X2Jhc2UgdGJhc2UpIHsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSBUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gInZvaWQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVFlQRV9CT09MOgotICAgICAgcmV0dXJuICJib29sIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJieXRlIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVFlQRV9JMTY6Ci0gICAgICByZXR1cm4gImkxNiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRZUEVfSTMyOgotICAgICAgcmV0dXJuICJpMzIiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiaTY0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImRvdWJsZSI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICIodW5rbm93bikiOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLXByaXZhdGU6Ci0gIHRfYmFzZSBiYXNlXzsKLQotICBib29sIHN0cmluZ19saXN0XzsKLSAgYm9vbCBiaW5hcnlfOwotICBib29sIHN0cmluZ19lbnVtXzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ19lbnVtX3ZhbHNfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY0YmIxLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfQ09OU1RfSAotI2RlZmluZSBUX0NPTlNUX0gKLQotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfY29uc3RfdmFsdWUuaCIKLQotLyoqCi0gKiBBIGNvbnN0IGlzIGEgY29uc3RhbnQgdmFsdWUgZGVmaW5lZCBhY3Jvc3MgbGFuZ3VhZ2VzIHRoYXQgaGFzIGEgdHlwZSBhbmQKLSAqIGEgdmFsdWUuIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgdGhlIGRlY2xhcmVkIHR5cGUgbWlnaHQgbm90IG1hdGNoIHRoZSB0eXBlCi0gKiBvZiB0aGUgdmFsdWUgb2JqZWN0LCBzaW5jZSB0aGF0IGlzIG5vdCBkZXRlcm1pbmVkIHVudGlsIGFmdGVyIHBhcnNpbmcgdGhlCi0gKiB3aG9sZSB0aGluZyBvdXQuCi0gKgotICovCi1jbGFzcyB0X2NvbnN0IDogcHVibGljIHRfZG9jIHsKLXB1YmxpYzoKLSAgdF9jb25zdCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQotICAgIDogdHlwZV8odHlwZSksIG5hbWVfKG5hbWUpLCB2YWx1ZV8odmFsdWUpIHt9Ci0KLSAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQotCi0gIHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotCi1wcml2YXRlOgotICB0X3R5cGUqIHR5cGVfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWVfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3RfdmFsdWUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdF92YWx1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTZlM2Y2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdF92YWx1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0NPTlNUX1ZBTFVFX0gKLSNkZWZpbmUgVF9DT05TVF9WQUxVRV9ICi0KLSNpbmNsdWRlICJ0X2VudW0uaCIKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0cmluZz4KLQotLyoqCi0gKiBBIGNvbnN0IHZhbHVlIGlzIHNvbWV0aGluZyBwYXJzZWQgdGhhdCBjb3VsZCBiZSBhIG1hcCwgc2V0LCBsaXN0LCBzdHJ1Y3QKLSAqIG9yIHdoYXRldmVyLgotICoKLSAqLwotY2xhc3MgdF9jb25zdF92YWx1ZSB7Ci1wdWJsaWM6Ci0gIGVudW0gdF9jb25zdF92YWx1ZV90eXBlIHsgQ1ZfSU5URUdFUiwgQ1ZfRE9VQkxFLCBDVl9TVFJJTkcsIENWX01BUCwgQ1ZfTElTVCwgQ1ZfSURFTlRJRklFUiB9OwotCi0gIHRfY29uc3RfdmFsdWUoKSB7fQotCi0gIHRfY29uc3RfdmFsdWUoaW50NjRfdCB2YWwpIHsgc2V0X2ludGVnZXIodmFsKTsgfQotCi0gIHRfY29uc3RfdmFsdWUoc3RkOjpzdHJpbmcgdmFsKSB7IHNldF9zdHJpbmcodmFsKTsgfQotCi0gIHZvaWQgc2V0X3N0cmluZyhzdGQ6OnN0cmluZyB2YWwpIHsKLSAgICB2YWxUeXBlXyA9IENWX1NUUklORzsKLSAgICBzdHJpbmdWYWxfID0gdmFsOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ1ZhbF87IH0KLQotICB2b2lkIHNldF9pbnRlZ2VyKGludDY0X3QgdmFsKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9JTlRFR0VSOwotICAgIGludFZhbF8gPSB2YWw7Ci0gIH0KLQotICBpbnQ2NF90IGdldF9pbnRlZ2VyKCkgY29uc3QgewotICAgIGlmICh2YWxUeXBlXyA9PSBDVl9JREVOVElGSUVSKSB7Ci0gICAgICBpZiAoZW51bV8gPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAiaGF2ZSBpZGVudGlmaWVyIFwiIiArIGdldF9pZGVudGlmaWVyKCkgKyAiXCIsIGJ1dCB1bnNldCBlbnVtIG9uIGxpbmUhIjsKLSAgICAgIH0KLSAgICAgIHN0ZDo6c3RyaW5nIGlkZW50aWZpZXIgPSBnZXRfaWRlbnRpZmllcigpOwotICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBkb3QgPSBpZGVudGlmaWVyLnJmaW5kKCcuJyk7Ci0gICAgICBpZiAoZG90ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIGlkZW50aWZpZXIgPSBpZGVudGlmaWVyLnN1YnN0cihkb3QgKyAxKTsKLSAgICAgIH0KLSAgICAgIHRfZW51bV92YWx1ZSogdmFsID0gZW51bV8tPmdldF9jb25zdGFudF9ieV9uYW1lKGlkZW50aWZpZXIpOwotICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJVbmFibGUgdG8gZmluZCBlbnVtIHZhbHVlIFwiIiArIGlkZW50aWZpZXIgKyAiXCIgaW4gZW51bSBcIiIgKyBlbnVtXy0+Z2V0X25hbWUoKQotICAgICAgICAgICAgKyAiXCIiOwotICAgICAgfQotICAgICAgcmV0dXJuIHZhbC0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBpbnRWYWxfOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgdmFsKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9ET1VCTEU7Ci0gICAgZG91YmxlVmFsXyA9IHZhbDsKLSAgfQotCi0gIGRvdWJsZSBnZXRfZG91YmxlKCkgY29uc3QgeyByZXR1cm4gZG91YmxlVmFsXzsgfQotCi0gIHZvaWQgc2V0X21hcCgpIHsgdmFsVHlwZV8gPSBDVl9NQVA7IH0KLQotICB2b2lkIGFkZF9tYXAodF9jb25zdF92YWx1ZSoga2V5LCB0X2NvbnN0X3ZhbHVlKiB2YWwpIHsgbWFwVmFsX1trZXldID0gdmFsOyB9Ci0KLSAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgZ2V0X21hcCgpIGNvbnN0IHsgcmV0dXJuIG1hcFZhbF87IH0KLQotICB2b2lkIHNldF9saXN0KCkgeyB2YWxUeXBlXyA9IENWX0xJU1Q7IH0KLQotICB2b2lkIGFkZF9saXN0KHRfY29uc3RfdmFsdWUqIHZhbCkgeyBsaXN0VmFsXy5wdXNoX2JhY2sodmFsKTsgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgZ2V0X2xpc3QoKSBjb25zdCB7IHJldHVybiBsaXN0VmFsXzsgfQotCi0gIHZvaWQgc2V0X2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgdmFsKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9JREVOVElGSUVSOwotICAgIGlkZW50aWZpZXJWYWxfID0gdmFsOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBpZGVudGlmaWVyVmFsXzsgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9pZGVudGlmaWVyX25hbWUoKSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmcgcmV0ID0gZ2V0X2lkZW50aWZpZXIoKTsKLSAgICBzaXplX3QgcyA9IHJldC5maW5kKCcuJyk7Ci0gICAgaWYgKHMgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHRocm93ICJlcnJvcjogaWRlbnRpZmllciAiICsgcmV0ICsgIiBpcyB1bnF1YWxpZmllZCEiOwotICAgIH0KLSAgICByZXQgPSByZXQuc3Vic3RyKHMgKyAxKTsKLSAgICBzID0gcmV0LmZpbmQoJy4nKTsKLSAgICBpZiAocyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgcmV0ID0gcmV0LnN1YnN0cihzICsgMSk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcl93aXRoX3BhcmVudCgpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyByZXQgPSBnZXRfaWRlbnRpZmllcigpOwotICAgIHNpemVfdCBzID0gcmV0LmZpbmQoJy4nKTsKLSAgICBpZiAocyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgdGhyb3cgImVycm9yOiBpZGVudGlmaWVyICIgKyByZXQgKyAiIGlzIHVucXVhbGlmaWVkISI7Ci0gICAgfQotICAgIHNpemVfdCBzMiA9IHJldC5maW5kKCcuJywgcyArIDEpOwotICAgIGlmIChzMiAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgcmV0ID0gcmV0LnN1YnN0cihzICsgMSk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICB2b2lkIHNldF9lbnVtKHRfZW51bSogdGVudW0pIHsgZW51bV8gPSB0ZW51bTsgfQotCi0gIHRfY29uc3RfdmFsdWVfdHlwZSBnZXRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHZhbFR5cGVfOyB9Ci0KLXByaXZhdGU6Ci0gIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gbWFwVmFsXzsKLSAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RWYWxfOwotICBzdGQ6OnN0cmluZyBzdHJpbmdWYWxfOwotICBpbnQ2NF90IGludFZhbF87Ci0gIGRvdWJsZSBkb3VibGVWYWxfOwotICBzdGQ6OnN0cmluZyBpZGVudGlmaWVyVmFsXzsKLSAgdF9lbnVtKiBlbnVtXzsKLQotICB0X2NvbnN0X3ZhbHVlX3R5cGUgdmFsVHlwZV87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb250YWluZXIuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb250YWluZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5OTJiNy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29udGFpbmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9DT05UQUlORVJfSAotI2RlZmluZSBUX0NPTlRBSU5FUl9ICi0KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLQotY2xhc3MgdF9jb250YWluZXIgOiBwdWJsaWMgdF90eXBlIHsKLXB1YmxpYzoKLSAgdF9jb250YWluZXIoKSA6IGNwcF9uYW1lXygpLCBoYXNfY3BwX25hbWVfKGZhbHNlKSB7fQotCi0gIHZpcnR1YWwgfnRfY29udGFpbmVyKCkge30KLQotICB2b2lkIHNldF9jcHBfbmFtZShzdGQ6OnN0cmluZyBjcHBfbmFtZSkgewotICAgIGNwcF9uYW1lXyA9IGNwcF9uYW1lOwotICAgIGhhc19jcHBfbmFtZV8gPSB0cnVlOwotICB9Ci0KLSAgYm9vbCBoYXNfY3BwX25hbWUoKSB7IHJldHVybiBoYXNfY3BwX25hbWVfOyB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2NwcF9uYW1lKCkgeyByZXR1cm4gY3BwX25hbWVfOyB9Ci0KLSAgYm9vbCBpc19jb250YWluZXIoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLXByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIGNwcF9uYW1lXzsKLSAgYm9vbCBoYXNfY3BwX25hbWVfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZG9jLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZG9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzEwYjcuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2RvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfRE9DX0gKLSNkZWZpbmUgVF9ET0NfSAotCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotI2luY2x1ZGUgImxvZ2dpbmcuaCIKLQotLyoqCi0gKiBEb2N1bWVudGF0aW9uIHN0dWJzCi0gKgotICovCi1jbGFzcyB0X2RvYyB7Ci0KLXB1YmxpYzoKLSAgdF9kb2MoKSA6IGhhc19kb2NfKGZhbHNlKSB7fQotCi0gIHZvaWQgc2V0X2RvYyhjb25zdCBzdGQ6OnN0cmluZyYgZG9jKSB7Ci0gICAgZG9jXyA9IGRvYzsKLSAgICBoYXNfZG9jXyA9IHRydWU7Ci0gICAgaWYgKChnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPT0gZ19kb2N0ZXh0X2xpbmVubykKLSAgICAgICAgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9PSBTVElMTF9DQU5ESURBVEUpKSB7Ci0gICAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBBTFJFQURZX1BST0NFU1NFRDsKLSAgICAgIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBBTFJFQURZX1BST0NFU1NFRCIpOwotICAgIH0KLSAgfQotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfZG9jKCkgY29uc3QgeyByZXR1cm4gZG9jXzsgfQotCi0gIGJvb2wgaGFzX2RvYygpIHsgcmV0dXJuIGhhc19kb2NfOyB9Ci0KLXByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIGRvY187Ci0gIGJvb2wgaGFzX2RvY187Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjZhMDIwLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfRU5VTV9ICi0jZGVmaW5lIFRfRU5VTV9ICi0KLSNpbmNsdWRlICJ0X2VudW1fdmFsdWUuaCIKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLS8qKgotICogQW4gZW51bWVyYXRlZCB0eXBlLiBBIGxpc3Qgb2YgY29uc3RhbnQgb2JqZWN0cyB3aXRoIGEgbmFtZSBmb3IgdGhlIHR5cGUuCi0gKgotICovCi1jbGFzcyB0X2VudW0gOiBwdWJsaWMgdF90eXBlIHsKLXB1YmxpYzoKLSAgdF9lbnVtKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOiB0X3R5cGUocHJvZ3JhbSkge30KLQotICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IG5hbWVfID0gbmFtZTsgfQotCi0gIHZvaWQgYXBwZW5kKHRfZW51bV92YWx1ZSogY29uc3RhbnQpIHsgY29uc3RhbnRzXy5wdXNoX2JhY2soY29uc3RhbnQpOyB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGdldF9jb25zdGFudHMoKSB7IHJldHVybiBjb25zdGFudHNfOyB9Ci0KLSAgdF9lbnVtX3ZhbHVlKiBnZXRfY29uc3RhbnRfYnlfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKLSAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X25hbWUoKSA9PSBuYW1lKSB7Ci0gICAgICAgIHJldHVybiAqY19pdGVyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHRfZW51bV92YWx1ZSogZ2V0X2NvbnN0YW50X2J5X3ZhbHVlKGludDY0X3QgdmFsdWUpIHsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7Ci0gICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGlmICgoKmNfaXRlciktPmdldF92YWx1ZSgpID09IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAqY19pdGVyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHRfZW51bV92YWx1ZSogZ2V0X21pbl92YWx1ZSgpIHsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7Ci0gICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICB0X2VudW1fdmFsdWUqIG1pbl92YWx1ZTsKLSAgICBpZiAoZW51bV92YWx1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgIG1pbl92YWx1ZSA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGludCBtaW5fdmFsdWVfdmFsdWU7Ci0gICAgICBtaW5fdmFsdWUgPSBlbnVtX3ZhbHVlcy5mcm9udCgpOwotICAgICAgbWluX3ZhbHVlX3ZhbHVlID0gbWluX3ZhbHVlLT5nZXRfdmFsdWUoKTsKLSAgICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA8IG1pbl92YWx1ZV92YWx1ZSkgewotICAgICAgICAgIG1pbl92YWx1ZSA9ICgqY19pdGVyKTsKLSAgICAgICAgICBtaW5fdmFsdWVfdmFsdWUgPSBtaW5fdmFsdWUtPmdldF92YWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtaW5fdmFsdWU7Ci0gIH0KLQotICB0X2VudW1fdmFsdWUqIGdldF9tYXhfdmFsdWUoKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOwotICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgdF9lbnVtX3ZhbHVlKiBtYXhfdmFsdWU7Ci0gICAgaWYgKGVudW1fdmFsdWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICBtYXhfdmFsdWUgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbnQgbWF4X3ZhbHVlX3ZhbHVlOwotICAgICAgbWF4X3ZhbHVlID0gZW51bV92YWx1ZXMuYmFjaygpOwotICAgICAgbWF4X3ZhbHVlX3ZhbHVlID0gbWF4X3ZhbHVlLT5nZXRfdmFsdWUoKTsKLSAgICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA+IG1heF92YWx1ZV92YWx1ZSkgewotICAgICAgICAgIG1heF92YWx1ZSA9ICgqY19pdGVyKTsKLSAgICAgICAgICBtYXhfdmFsdWVfdmFsdWUgPSBtYXhfdmFsdWUtPmdldF92YWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXhfdmFsdWU7Ci0gIH0KLQotICBib29sIGlzX2VudW0oKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7IHJldHVybiAiZW51bSI7IH0KLQotcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2VudW1fdmFsdWUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtX3ZhbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NzlmMDYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2VudW1fdmFsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0VOVU1fVkFMVUVfSAotI2RlZmluZSBUX0VOVU1fVkFMVUVfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgInRfZG9jLmgiCi0KLS8qKgotICogQSBjb25zdGFudC4gVGhlc2UgYXJlIHVzZWQgaW5zaWRlIG9mIGVudW0gZGVmaW5pdGlvbnMuIENvbnN0YW50cyBhcmUganVzdAotICogc3ltYm9sIGlkZW50aWZpZXJzIHRoYXQgbWF5IG9yIG1heSBub3QgaGF2ZSBhbiBleHBsaWNpdCB2YWx1ZSBhc3NvY2lhdGVkCi0gKiB3aXRoIHRoZW0uCi0gKgotICovCi1jbGFzcyB0X2VudW1fdmFsdWUgOiBwdWJsaWMgdF9kb2MgewotcHVibGljOgotICB0X2VudW1fdmFsdWUoc3RkOjpzdHJpbmcgbmFtZSwgaW50IHZhbHVlKSA6IG5hbWVfKG5hbWUpLCB2YWx1ZV8odmFsdWUpIHt9Ci0KLSAgfnRfZW51bV92YWx1ZSgpIHt9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KLQotICBpbnQgZ2V0X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187Ci0KLXByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICBpbnQgdmFsdWVfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZmllbGQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9maWVsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWNlN2JiLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9maWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0ZJRUxEX0gKLSNkZWZpbmUgVF9GSUVMRF9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInRfZG9jLmgiCi0KLS8vIEZvcndhcmQgZGVjbGFyZSBmb3IgeHNkX2F0dHJzCi1jbGFzcyB0X3N0cnVjdDsKLQotLyoqCi0gKiBDbGFzcyB0byByZXByZXNlbnQgYSBmaWVsZCBpbiBhIHRocmlmdCBzdHJ1Y3R1cmUuIEEgZmllbGQgaGFzIGEgZGF0YSB0eXBlLAotICogYSBzeW1ib2xpYyBuYW1lLCBhbmQgYSBudW1lcmljIGlkZW50aWZpZXIuCi0gKgotICovCi1jbGFzcyB0X2ZpZWxkIDogcHVibGljIHRfZG9jIHsKLXB1YmxpYzoKLSAgdF9maWVsZCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUpCi0gICAgOiB0eXBlXyh0eXBlKSwKLSAgICAgIG5hbWVfKG5hbWUpLAotICAgICAga2V5XygwKSwKLSAgICAgIHZhbHVlXyhOVUxMKSwKLSAgICAgIHhzZF9vcHRpb25hbF8oZmFsc2UpLAotICAgICAgeHNkX25pbGxhYmxlXyhmYWxzZSksCi0gICAgICB4c2RfYXR0cnNfKE5VTEwpLAotICAgICAgcmVmZXJlbmNlXyhmYWxzZSkge30KLQotICB0X2ZpZWxkKHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgbmFtZSwgaW50MzJfdCBrZXkpCi0gICAgOiB0eXBlXyh0eXBlKSwKLSAgICAgIG5hbWVfKG5hbWUpLAotICAgICAga2V5XyhrZXkpLAotICAgICAgcmVxXyhUX09QVF9JTl9SRVFfT1VUKSwKLSAgICAgIHZhbHVlXyhOVUxMKSwKLSAgICAgIHhzZF9vcHRpb25hbF8oZmFsc2UpLAotICAgICAgeHNkX25pbGxhYmxlXyhmYWxzZSksCi0gICAgICB4c2RfYXR0cnNfKE5VTEwpLAotICAgICAgcmVmZXJlbmNlXyhmYWxzZSkge30KLQotICB+dF9maWVsZCgpIHt9Ci0KLSAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KLQotICBpbnQzMl90IGdldF9rZXkoKSBjb25zdCB7IHJldHVybiBrZXlfOyB9Ci0KLSAgZW51bSBlX3JlcSB7IFRfUkVRVUlSRUQsIFRfT1BUSU9OQUwsIFRfT1BUX0lOX1JFUV9PVVQgfTsKLQotICB2b2lkIHNldF9yZXEoZV9yZXEgcmVxKSB7IHJlcV8gPSByZXE7IH0KLQotICBlX3JlcSBnZXRfcmVxKCkgY29uc3QgeyByZXR1cm4gcmVxXzsgfQotCi0gIHZvaWQgc2V0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7IHZhbHVlXyA9IHZhbHVlOyB9Ci0KLSAgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgeyByZXR1cm4gdmFsdWVfOyB9Ci0KLSAgdm9pZCBzZXRfeHNkX29wdGlvbmFsKGJvb2wgeHNkX29wdGlvbmFsKSB7IHhzZF9vcHRpb25hbF8gPSB4c2Rfb3B0aW9uYWw7IH0KLQotICBib29sIGdldF94c2Rfb3B0aW9uYWwoKSBjb25zdCB7IHJldHVybiB4c2Rfb3B0aW9uYWxfOyB9Ci0KLSAgdm9pZCBzZXRfeHNkX25pbGxhYmxlKGJvb2wgeHNkX25pbGxhYmxlKSB7IHhzZF9uaWxsYWJsZV8gPSB4c2RfbmlsbGFibGU7IH0KLQotICBib29sIGdldF94c2RfbmlsbGFibGUoKSBjb25zdCB7IHJldHVybiB4c2RfbmlsbGFibGVfOyB9Ci0KLSAgdm9pZCBzZXRfeHNkX2F0dHJzKHRfc3RydWN0KiB4c2RfYXR0cnMpIHsgeHNkX2F0dHJzXyA9IHhzZF9hdHRyczsgfQotCi0gIHRfc3RydWN0KiBnZXRfeHNkX2F0dHJzKCkgeyByZXR1cm4geHNkX2F0dHJzXzsgfQotCi0gIC8qKgotICAgKiBDb21wYXJhdG9yIHRvIHNvcnQgZmllbGRzIGluIGFzY2VuZGluZyBvcmRlciBieSBrZXkuCi0gICAqIE1ha2UgdGhpcyBhIGZ1bmN0b3IgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIHRvIGhlbHAgR0NDIGlubGluZSBpdC4KLSAgICogVGhlIGFyZ3VtZW50cyBhcmUgKGNvbnN0KSByZWZlcmVuY2VzIHRvIGNvbnN0IHBvaW50ZXJzIHRvIGNvbnN0IHRfZmllbGRzLgotICAgKi8KLSAgc3RydWN0IGtleV9jb21wYXJlIHsKLSAgICBib29sIG9wZXJhdG9yKCkodF9maWVsZCBjb25zdCogY29uc3QmIGEsIHRfZmllbGQgY29uc3QqIGNvbnN0JiBiKSB7Ci0gICAgICByZXR1cm4gYS0+Z2V0X2tleSgpIDwgYi0+Z2V0X2tleSgpOwotICAgIH0KLSAgfTsKLQotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKLQotICBib29sIGdldF9yZWZlcmVuY2UoKSB7IHJldHVybiByZWZlcmVuY2VfOyB9Ci0KLSAgdm9pZCBzZXRfcmVmZXJlbmNlKGJvb2wgcmVmZXJlbmNlKSB7IHJlZmVyZW5jZV8gPSByZWZlcmVuY2U7IH0KLQotcHJpdmF0ZToKLSAgdF90eXBlKiB0eXBlXzsKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIGludDMyX3Qga2V5XzsKLSAgZV9yZXEgcmVxXzsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWVfOwotCi0gIGJvb2wgeHNkX29wdGlvbmFsXzsKLSAgYm9vbCB4c2RfbmlsbGFibGVfOwotICB0X3N0cnVjdCogeHNkX2F0dHJzXzsKLSAgYm9vbCByZWZlcmVuY2VfOwotfTsKLQotLyoqCi0gKiBBIHNpbXBsZSBzdHJ1Y3QgZm9yIHRoZSBwYXJzZXIgdG8gdXNlIHRvIHN0b3JlIGEgZmllbGQgSUQsIGFuZCB3aGV0aGVyIG9yCi0gKiBub3QgaXQgd2FzIHNwZWNpZmllZCBieSB0aGUgdXNlciBvciBhdXRvbWF0aWNhbGx5IGNob3Nlbi4KLSAqLwotc3RydWN0IHRfZmllbGRfaWQgewotICBpbnQzMl90IHZhbHVlOwotICBib29sIGF1dG9fYXNzaWduZWQ7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9mdW5jdGlvbi5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Z1bmN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ODg2ZjMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Z1bmN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9GVU5DVElPTl9ICi0jZGVmaW5lIFRfRlVOQ1RJT05fSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfc3RydWN0LmgiCi0jaW5jbHVkZSAidF9kb2MuaCIKLQotLyoqCi0gKiBSZXByZXNlbnRhdGlvbiBvZiBhIGZ1bmN0aW9uLiBLZXkgcGFydHMgYXJlIHJldHVybiB0eXBlLCBmdW5jdGlvbiBuYW1lLAotICogb3B0aW9uYWwgbW9kaWZpZXJzLCBhbmQgYW4gYXJndW1lbnQgbGlzdCwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYXMgYSB0aHJpZnQKLSAqIHN0cnVjdC4KLSAqCi0gKi8KLWNsYXNzIHRfZnVuY3Rpb24gOiBwdWJsaWMgdF9kb2MgewotcHVibGljOgotICB0X2Z1bmN0aW9uKHRfdHlwZSogcmV0dXJudHlwZSwgc3RkOjpzdHJpbmcgbmFtZSwgdF9zdHJ1Y3QqIGFyZ2xpc3QsIGJvb2wgb25ld2F5ID0gZmFsc2UpCi0gICAgOiByZXR1cm50eXBlXyhyZXR1cm50eXBlKSwgbmFtZV8obmFtZSksIGFyZ2xpc3RfKGFyZ2xpc3QpLCBvbmV3YXlfKG9uZXdheSkgewotICAgIHhjZXB0aW9uc18gPSBuZXcgdF9zdHJ1Y3QoTlVMTCk7Ci0gICAgaWYgKG9uZXdheV8gJiYgKCFyZXR1cm50eXBlXy0+aXNfdm9pZCgpKSkgewotICAgICAgcHdhcm5pbmcoMSwgIk9uZXdheSBtZXRob2RzIHNob3VsZCByZXR1cm4gdm9pZC5cbiIpOwotICAgIH0KLSAgfQotCi0gIHRfZnVuY3Rpb24odF90eXBlKiByZXR1cm50eXBlLAotICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QsCi0gICAgICAgICAgICAgdF9zdHJ1Y3QqIHhjZXB0aW9ucywKLSAgICAgICAgICAgICBib29sIG9uZXdheSA9IGZhbHNlKQotICAgIDogcmV0dXJudHlwZV8ocmV0dXJudHlwZSksCi0gICAgICBuYW1lXyhuYW1lKSwKLSAgICAgIGFyZ2xpc3RfKGFyZ2xpc3QpLAotICAgICAgeGNlcHRpb25zXyh4Y2VwdGlvbnMpLAotICAgICAgb25ld2F5XyhvbmV3YXkpIHsKLSAgICBpZiAob25ld2F5XyAmJiAheGNlcHRpb25zXy0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7Ci0gICAgICB0aHJvdyBzdGQ6OnN0cmluZygiT25ld2F5IG1ldGhvZHMgY2FuJ3QgdGhyb3cgZXhjZXB0aW9ucy4iKTsKLSAgICB9Ci0gICAgaWYgKG9uZXdheV8gJiYgKCFyZXR1cm50eXBlXy0+aXNfdm9pZCgpKSkgewotICAgICAgcHdhcm5pbmcoMSwgIk9uZXdheSBtZXRob2RzIHNob3VsZCByZXR1cm4gdm9pZC5cbiIpOwotICAgIH0KLSAgfQotCi0gIH50X2Z1bmN0aW9uKCkge30KLQotICB0X3R5cGUqIGdldF9yZXR1cm50eXBlKCkgY29uc3QgeyByZXR1cm4gcmV0dXJudHlwZV87IH0KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQotCi0gIHRfc3RydWN0KiBnZXRfYXJnbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGFyZ2xpc3RfOyB9Ci0KLSAgdF9zdHJ1Y3QqIGdldF94Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiB4Y2VwdGlvbnNfOyB9Ci0KLSAgYm9vbCBpc19vbmV3YXkoKSBjb25zdCB7IHJldHVybiBvbmV3YXlfOyB9Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187Ci0KLXByaXZhdGU6Ci0gIHRfdHlwZSogcmV0dXJudHlwZV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICB0X3N0cnVjdCogYXJnbGlzdF87Ci0gIHRfc3RydWN0KiB4Y2VwdGlvbnNfOwotICBib29sIG9uZXdheV87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9saXN0LmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzBkOTgxLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9saXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9MSVNUX0gKLSNkZWZpbmUgVF9MSVNUX0gKLQotI2luY2x1ZGUgInRfY29udGFpbmVyLmgiCi0KLS8qKgotICogQSBsaXN0IGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgZGF0YSB0eXBlLgotICoKLSAqLwotY2xhc3MgdF9saXN0IDogcHVibGljIHRfY29udGFpbmVyIHsKLXB1YmxpYzoKLSAgdF9saXN0KHRfdHlwZSogZWxlbV90eXBlKSA6IGVsZW1fdHlwZV8oZWxlbV90eXBlKSB7fQotCi0gIHRfdHlwZSogZ2V0X2VsZW1fdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGVsZW1fdHlwZV87IH0KLQotICBib29sIGlzX2xpc3QoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLXByaXZhdGU6Ci0gIHRfdHlwZSogZWxlbV90eXBlXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X21hcC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjlhZWFiLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX01BUF9ICi0jZGVmaW5lIFRfTUFQX0gKLQotI2luY2x1ZGUgInRfY29udGFpbmVyLmgiCi0KLS8qKgotICogQSBtYXAgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciB0d28gZGF0YQotICogdHlwZXMuCi0gKgotICovCi1jbGFzcyB0X21hcCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7Ci1wdWJsaWM6Ci0gIHRfbWFwKHRfdHlwZSoga2V5X3R5cGUsIHRfdHlwZSogdmFsX3R5cGUpIDoga2V5X3R5cGVfKGtleV90eXBlKSwgdmFsX3R5cGVfKHZhbF90eXBlKSB7fQotCi0gIHRfdHlwZSogZ2V0X2tleV90eXBlKCkgY29uc3QgeyByZXR1cm4ga2V5X3R5cGVfOyB9Ci0KLSAgdF90eXBlKiBnZXRfdmFsX3R5cGUoKSBjb25zdCB7IHJldHVybiB2YWxfdHlwZV87IH0KLQotICBib29sIGlzX21hcCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotcHJpdmF0ZToKLSAgdF90eXBlKiBrZXlfdHlwZV87Ci0gIHRfdHlwZSogdmFsX3R5cGVfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfcHJvZ3JhbS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2ZWU2Yy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfcHJvZ3JhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1BST0dSQU1fSAotI2RlZmluZSBUX1BST0dSQU1fSAotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLS8vIEZvciBwcm9ncmFtX25hbWUoKQotI2luY2x1ZGUgIm1haW4uaCIKLQotI2luY2x1ZGUgInRfZG9jLmgiCi0jaW5jbHVkZSAidF9zY29wZS5oIgotI2luY2x1ZGUgInRfYmFzZV90eXBlLmgiCi0jaW5jbHVkZSAidF90eXBlZGVmLmgiCi0jaW5jbHVkZSAidF9lbnVtLmgiCi0jaW5jbHVkZSAidF9jb25zdC5oIgotI2luY2x1ZGUgInRfc3RydWN0LmgiCi0jaW5jbHVkZSAidF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAidF9saXN0LmgiCi0jaW5jbHVkZSAidF9tYXAuaCIKLSNpbmNsdWRlICJ0X3NldC5oIgotI2luY2x1ZGUgImdlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCi0vLyNpbmNsdWRlICJ0X2RvYy5oIgotCi0vKioKLSAqIFRvcCBsZXZlbCBjbGFzcyByZXByZXNlbnRpbmcgYW4gZW50aXJlIHRocmlmdCBwcm9ncmFtLiBBIHByb2dyYW0gY29uc2lzdHMKLSAqIGZ1bmRhbWVudGFsbHkgb2YgdGhlIGZvbGxvd2luZzoKLSAqCi0gKiAgIFR5cGVkZWZzCi0gKiAgIEVudW1lcmF0aW9ucwotICogICBDb25zdGFudHMKLSAqICAgU3RydWN0cwotICogICBFeGNlcHRpb25zCi0gKiAgIFNlcnZpY2VzCi0gKgotICogVGhlIHByb2dyYW0gbW9kdWxlIGFsc28gY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBiYXNlIHR5cGVzLgotICoKLSAqLwotY2xhc3MgdF9wcm9ncmFtIDogcHVibGljIHRfZG9jIHsKLXB1YmxpYzoKLSAgdF9wcm9ncmFtKHN0ZDo6c3RyaW5nIHBhdGgsIHN0ZDo6c3RyaW5nIG5hbWUpCi0gICAgOiBwYXRoXyhwYXRoKSwgbmFtZV8obmFtZSksIG91dF9wYXRoXygiLi8iKSwgb3V0X3BhdGhfaXNfYWJzb2x1dGVfKGZhbHNlKSB7Ci0gICAgc2NvcGVfID0gbmV3IHRfc2NvcGUoKTsKLSAgfQotCi0gIHRfcHJvZ3JhbShzdGQ6OnN0cmluZyBwYXRoKSA6IHBhdGhfKHBhdGgpLCBvdXRfcGF0aF8oIi4vIiksIG91dF9wYXRoX2lzX2Fic29sdXRlXyhmYWxzZSkgewotICAgIG5hbWVfID0gcHJvZ3JhbV9uYW1lKHBhdGgpOwotICAgIHNjb3BlXyA9IG5ldyB0X3Njb3BlKCk7Ci0gIH0KLQotICB+dF9wcm9ncmFtKCkgewotICAgIGlmIChzY29wZV8pIHsKLSAgICAgIGRlbGV0ZSBzY29wZV87Ci0gICAgICBzY29wZV8gPSBOVUxMOwotICAgIH0KLSAgfQotCi0gIC8vIFBhdGggYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9wYXRoKCkgY29uc3QgeyByZXR1cm4gcGF0aF87IH0KLQotICAvLyBPdXRwdXQgcGF0aCBhY2Nlc3NvcgotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X291dF9wYXRoKCkgY29uc3QgeyByZXR1cm4gb3V0X3BhdGhfOyB9Ci0KLSAgLy8gQ3JlYXRlIGdlbi0qIGRpciBhY2Nlc3NvcgotICBib29sIGlzX291dF9wYXRoX2Fic29sdXRlKCkgY29uc3QgeyByZXR1cm4gb3V0X3BhdGhfaXNfYWJzb2x1dGVfOyB9Ci0KLSAgLy8gTmFtZSBhY2Nlc3NvcgotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQotCi0gIC8vIE5hbWVzcGFjZQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWVzcGFjZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVzcGFjZV87IH0KLQotICAvLyBJbmNsdWRlIHByZWZpeCBhY2Nlc3NvcgotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X2luY2x1ZGVfcHJlZml4KCkgY29uc3QgeyByZXR1cm4gaW5jbHVkZV9wcmVmaXhfOyB9Ci0KLSAgLy8gQWNjZXNzb3JzIGZvciBwcm9ncmFtIGVsZW1lbnRzCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfdHlwZWRlZio+JiBnZXRfdHlwZWRlZnMoKSBjb25zdCB7IHJldHVybiB0eXBlZGVmc187IH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIGdldF9lbnVtcygpIGNvbnN0IHsgcmV0dXJuIGVudW1zXzsgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIGdldF9jb25zdHMoKSBjb25zdCB7IHJldHVybiBjb25zdHNfOyB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIGdldF9zdHJ1Y3RzKCkgY29uc3QgeyByZXR1cm4gc3RydWN0c187IH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgZ2V0X3hjZXB0aW9ucygpIGNvbnN0IHsgcmV0dXJuIHhjZXB0aW9uc187IH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgZ2V0X29iamVjdHMoKSBjb25zdCB7IHJldHVybiBvYmplY3RzXzsgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgZ2V0X3NlcnZpY2VzKCkgY29uc3QgeyByZXR1cm4gc2VydmljZXNfOyB9Ci0gIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGdldF9uYW1lc3BhY2VzKCkgY29uc3QgeyByZXR1cm4gbmFtZXNwYWNlc187IH0KLQotICAvLyBQcm9ncmFtIGVsZW1lbnRzCi0gIHZvaWQgYWRkX3R5cGVkZWYodF90eXBlZGVmKiB0ZCkgeyB0eXBlZGVmc18ucHVzaF9iYWNrKHRkKTsgfQotICB2b2lkIGFkZF9lbnVtKHRfZW51bSogdGUpIHsgZW51bXNfLnB1c2hfYmFjayh0ZSk7IH0KLSAgdm9pZCBhZGRfY29uc3QodF9jb25zdCogdGMpIHsgY29uc3RzXy5wdXNoX2JhY2sodGMpOyB9Ci0gIHZvaWQgYWRkX3N0cnVjdCh0X3N0cnVjdCogdHMpIHsKLSAgICBvYmplY3RzXy5wdXNoX2JhY2sodHMpOwotICAgIHN0cnVjdHNfLnB1c2hfYmFjayh0cyk7Ci0gIH0KLSAgdm9pZCBhZGRfeGNlcHRpb24odF9zdHJ1Y3QqIHR4KSB7Ci0gICAgb2JqZWN0c18ucHVzaF9iYWNrKHR4KTsKLSAgICB4Y2VwdGlvbnNfLnB1c2hfYmFjayh0eCk7Ci0gIH0KLSAgdm9pZCBhZGRfc2VydmljZSh0X3NlcnZpY2UqIHRzKSB7IHNlcnZpY2VzXy5wdXNoX2JhY2sodHMpOyB9Ci0KLSAgLy8gUHJvZ3JhbXMgdG8gaW5jbHVkZQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZ2V0X2luY2x1ZGVzKCkgY29uc3QgeyByZXR1cm4gaW5jbHVkZXNfOyB9Ci0KLSAgdm9pZCBzZXRfb3V0X3BhdGgoc3RkOjpzdHJpbmcgb3V0X3BhdGgsIGJvb2wgb3V0X3BhdGhfaXNfYWJzb2x1dGUpIHsKLSAgICBvdXRfcGF0aF8gPSBvdXRfcGF0aDsKLSAgICBvdXRfcGF0aF9pc19hYnNvbHV0ZV8gPSBvdXRfcGF0aF9pc19hYnNvbHV0ZTsKLSAgICAvLyBFbnN1cmUgdGhhdCBpdCBlbmRzIHdpdGggYSB0cmFpbGluZyAnLycgKG9yICdcJyBmb3Igd2luZG93cyBtYWNoaW5lcykKLSAgICBjaGFyIGMgPSBvdXRfcGF0aF8uYXQob3V0X3BhdGhfLnNpemUoKSAtIDEpOwotICAgIGlmICghKGMgPT0gJy8nIHx8IGMgPT0gJ1xcJykpIHsKLSAgICAgIG91dF9wYXRoXy5wdXNoX2JhY2soJy8nKTsKLSAgICB9Ci0gIH0KLQotICAvLyBUeXBlbmFtZSBjb2xsaXNpb24gZGV0ZWN0aW9uCi0gIC8qKgotICAgKiBTZWFyY2ggZm9yIHR5cGVuYW1lIGNvbGxpc2lvbnMKLSAgICogQHBhcmFtIHQgICAgdGhlIHR5cGUgdG8gdGVzdCBmb3IgY29sbGlzaW9ucwotICAgKiBAcmV0dXJuICAgICB0cnVlIGlmIGEgY2VydGFpbiBjb2xsaXNpb24gd2FzIGZvdW5kLCBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIGJvb2wgaXNfdW5pcXVlX3R5cGVuYW1lKHRfdHlwZSogdCkgewotICAgIGludCBvY2N1cnJlbmNlcyA9IHByb2dyYW1fdHlwZW5hbWVfY291bnQodGhpcywgdCk7Ci0gICAgZm9yIChzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXQgPSBpbmNsdWRlc18uYmVnaW4oKTsgaXQgIT0gaW5jbHVkZXNfLmVuZCgpOyArK2l0KSB7Ci0gICAgICBvY2N1cnJlbmNlcyArPSBwcm9ncmFtX3R5cGVuYW1lX2NvdW50KCppdCwgdCk7Ci0gICAgfQotICAgIHJldHVybiAwID09IG9jY3VycmVuY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNlYXJjaCBhbGwgdHlwZSBjb2xsZWN0aW9ucyBmb3IgZHVwbGljYXRlIHR5cGVuYW1lcwotICAgKiBAcGFyYW0gcHJvZyB0aGUgcHJvZ3JhbSB0byBzZWFyY2gKLSAgICogQHBhcmFtIHQgICAgdGhlIHR5cGUgdG8gdGVzdCBmb3IgY29sbGlzaW9ucwotICAgKiBAcmV0dXJuICAgICB0aGUgbnVtYmVyIG9mIGNlcnRhaW4gdHlwZW5hbWUgY29sbGlzaW9ucwotICAgKi8KLSAgaW50IHByb2dyYW1fdHlwZW5hbWVfY291bnQodF9wcm9ncmFtKiBwcm9nLCB0X3R5cGUqIHQpIHsKLSAgICBpbnQgb2NjdXJyZW5jZXMgPSAwOwotICAgIG9jY3VycmVuY2VzICs9IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQocHJvZywgcHJvZy0+dHlwZWRlZnNfLCB0KTsKLSAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPmVudW1zXywgdCk7Ci0gICAgb2NjdXJyZW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT5vYmplY3RzXywgdCk7Ci0gICAgb2NjdXJyZW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT5zZXJ2aWNlc18sIHQpOwotICAgIHJldHVybiBvY2N1cnJlbmNlczsKLSAgfQotCi0gIC8qKgotICAgKiBTZWFyY2ggYSB0eXBlIGNvbGxlY3Rpb24gZm9yIGR1cGxpY2F0ZSB0eXBlbmFtZXMKLSAgICogQHBhcmFtIHByb2cgICAgICAgICAgICB0aGUgcHJvZ3JhbSB0byBzZWFyY2gKLSAgICogQHBhcmFtIHR5cGVfY29sbGVjdGlvbiB0aGUgdHlwZSBjb2xsZWN0aW9uIHRvIHNlYXJjaAotICAgKiBAcGFyYW0gdCAgICAgICAgICAgICAgIHRoZSB0eXBlIHRvIHRlc3QgZm9yIGNvbGxpc2lvbnMKLSAgICogQHJldHVybiAgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNlcnRhaW4gdHlwZW5hbWUgY29sbGlzaW9ucwotICAgKi8KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gIGludCBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHRfcHJvZ3JhbSogcHJvZywgVCB0eXBlX2NvbGxlY3Rpb24sIHRfdHlwZSogdCkgewotICAgIGludCBvY2N1cnJlbmNlcyA9IDA7Ci0gICAgZm9yICh0eXBlbmFtZSBUOjppdGVyYXRvciBpdCA9IHR5cGVfY29sbGVjdGlvbi5iZWdpbigpOyBpdCAhPSB0eXBlX2NvbGxlY3Rpb24uZW5kKCk7ICsraXQpCi0gICAgICBpZiAodCAhPSAqaXQgJiYgMCA9PSB0LT5nZXRfbmFtZSgpLmNvbXBhcmUoKCppdCktPmdldF9uYW1lKCkpICYmIGlzX2NvbW1vbl9uYW1lc3BhY2UocHJvZywgdCkpCi0gICAgICAgICsrb2NjdXJyZW5jZXM7Ci0gICAgcmV0dXJuIG9jY3VycmVuY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSB3aGV0aGVyIGlkZW50aWNhbCB0eXBlbmFtZXMgd2lsbCBjb2xsaWRlIGJhc2VkIG9uIG5hbWVzcGFjZXMuCi0gICAqCi0gICAqIEJlY2F1c2Ugd2UgZG8gbm90IGtub3cgd2hpY2ggbGFuZ3VhZ2VzIHRoZSB1c2VyIHdpbGwgZ2VuZXJhdGUgY29kZSBmb3IsCi0gICAqIGNvbGxpc2lvbnMgd2l0aGluIHByb2dyYW1zIChJREwgZmlsZXMpIGhhdmluZyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGNhbiBiZQotICAgKiBkaWZmaWN1bHQgdG8gZGV0ZXJtaW5lLiBPbmx5IGd1YXJhbnRlZWQgY29sbGlzaW9ucyByZXR1cm4gdHJ1ZSAoY2F1c2UgYW4gZXJyb3IpLgotICAgKiBQb3NzaWJsZSBjb2xsaXNpb25zIGludm9sdmluZyBleHBsaWNpdCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIHByb2R1Y2UgYSB3YXJuaW5nLgotICAgKiBPdGhlciBwb3NzaWJsZSBjb2xsaXNpb25zIGdvIHVucmVwb3J0ZWQuCi0gICAqIEBwYXJhbSBwcm9nIHRoZSBwcm9ncmFtIGNvbnRhaW5pbmcgdGhlIHByZWV4aXN0aW5nIHR5cGVuYW1lCi0gICAqIEBwYXJhbSB0ICAgIHRoZSB0eXBlIGNvbnRhaW5pbmcgdGhlIHR5cGVuYW1lIG1hdGNoCi0gICAqIEByZXR1cm4gICAgIHRydWUgaWYgYSBjb2xsaXNpb24gd2l0aGluIG5hbWVzcGFjZXMgaXMgZm91bmQsIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgYm9vbCBpc19jb21tb25fbmFtZXNwYWNlKHRfcHJvZ3JhbSogcHJvZywgdF90eXBlKiB0KSB7Ci0gICAgLy8gQ2FzZSAxOiBUeXBlbmFtZXMgYXJlIGluIHRoZSBzYW1lIHByb2dyYW0gW2NvbGxpc2lvbl0KLSAgICBpZiAocHJvZyA9PSB0LT5nZXRfcHJvZ3JhbSgpKSB7Ci0gICAgICBwd2FybmluZygxLAotICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcyIsCi0gICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gQ2FzZSAyOiBCb3RoIHByb2dyYW1zIGhhdmUgaWRlbnRpY2FsIG5hbWVzcGFjZSBzY29wZS9uYW1lIGRlY2xhcmF0aW9ucyBbY29sbGlzaW9uXQotICAgIGJvb2wgbWF0Y2ggPSB0cnVlOwotICAgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBwcm9nLT5uYW1lc3BhY2VzXy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gcHJvZy0+bmFtZXNwYWNlc18uZW5kKCk7Ci0gICAgICAgICArK2l0KSB7Ci0gICAgICBpZiAoMCA9PSBpdC0+c2Vjb25kLmNvbXBhcmUodC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZShpdC0+Zmlyc3QpKSkgewotICAgICAgICBwd2FybmluZygxLAotICAgICAgICAgICAgICAgICAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzLCVzLCVzIGFuZCAlcywlcywlcyBbZmlsZSxzY29wZSxuc10iLAotICAgICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgcHJvZy0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5jX3N0cigpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1hdGNoID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0LT5nZXRfcHJvZ3JhbSgpLT5uYW1lc3BhY2VzXy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gdC0+Z2V0X3Byb2dyYW0oKS0+bmFtZXNwYWNlc18uZW5kKCk7Ci0gICAgICAgICArK2l0KSB7Ci0gICAgICBpZiAoMCA9PSBpdC0+c2Vjb25kLmNvbXBhcmUocHJvZy0+Z2V0X25hbWVzcGFjZShpdC0+Zmlyc3QpKSkgewotICAgICAgICBwd2FybmluZygxLAotICAgICAgICAgICAgICAgICAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzLCVzLCVzIGFuZCAlcywlcywlcyBbZmlsZSxzY29wZSxuc10iLAotICAgICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgcHJvZy0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5jX3N0cigpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1hdGNoID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICgwID09IHByb2ctPm5hbWVzcGFjZXNfLnNpemUoKSAmJiAwID09IHQtPmdldF9wcm9ncmFtKCktPm5hbWVzcGFjZXNfLnNpemUoKSkgewotICAgICAgcHdhcm5pbmcoMSwKLSAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMgYW5kICVzIiwKLSAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgIHByb2ctPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgfQotICAgIHJldHVybiBtYXRjaDsKLSAgfQotCi0gIC8vIFNjb3BpbmcgYW5kIG5hbWVzcGFjaW5nCi0gIHZvaWQgc2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBuYW1lKSB7IG5hbWVzcGFjZV8gPSBuYW1lOyB9Ci0KLSAgLy8gU2NvcGUgYWNjZXNzb3IKLSAgdF9zY29wZSogc2NvcGUoKSBjb25zdCB7IHJldHVybiBzY29wZV87IH0KLQotICAvLyBJbmNsdWRlcwotCi0gIHZvaWQgYWRkX2luY2x1ZGUoc3RkOjpzdHJpbmcgcGF0aCwgc3RkOjpzdHJpbmcgaW5jbHVkZV9zaXRlKSB7Ci0gICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoKTsKLQotICAgIC8vIGluY2x1ZGUgcHJlZml4IGZvciB0aGlzIHByb2dyYW0gaXMgdGhlIHNpdGUgYXQgd2hpY2ggaXQgd2FzIGluY2x1ZGVkCi0gICAgLy8gKG1pbnVzIHRoZSBmaWxlbmFtZSkKLSAgICBzdGQ6OnN0cmluZyBpbmNsdWRlX3ByZWZpeDsKLSAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdGQ6OnN0cmluZzo6bnBvczsKLSAgICBpZiAoKGxhc3Rfc2xhc2ggPSBpbmNsdWRlX3NpdGUucmZpbmQoIi8iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGluY2x1ZGVfcHJlZml4ID0gaW5jbHVkZV9zaXRlLnN1YnN0cigwLCBsYXN0X3NsYXNoKTsKLSAgICB9Ci0KLSAgICBwcm9ncmFtLT5zZXRfaW5jbHVkZV9wcmVmaXgoaW5jbHVkZV9wcmVmaXgpOwotICAgIGluY2x1ZGVzXy5wdXNoX2JhY2socHJvZ3JhbSk7Ci0gIH0KLQotICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZ2V0X2luY2x1ZGVzKCkgeyByZXR1cm4gaW5jbHVkZXNfOyB9Ci0KLSAgdm9pZCBzZXRfaW5jbHVkZV9wcmVmaXgoc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXgpIHsKLSAgICBpbmNsdWRlX3ByZWZpeF8gPSBpbmNsdWRlX3ByZWZpeDsKLQotICAgIC8vIHRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYSBkaXJlY3Rvcnk7IGFkZCBhIHRyYWlsaW5nIHNsYXNoIGlmIG5lY2Vzc2FyeQotICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGVuID0gaW5jbHVkZV9wcmVmaXhfLnNpemUoKTsKLSAgICBpZiAobGVuID4gMCAmJiBpbmNsdWRlX3ByZWZpeF9bbGVuIC0gMV0gIT0gJy8nKSB7Ci0gICAgICBpbmNsdWRlX3ByZWZpeF8gKz0gJy8nOwotICAgIH0KLSAgfQotCi0gIC8vIExhbmd1YWdlIG5ldXRyYWwgbmFtZXNwYWNlIC8gcGFja2FnaW5nCi0gIHZvaWQgc2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBsYW5ndWFnZSwgc3RkOjpzdHJpbmcgbmFtZV9zcGFjZSkgewotICAgIGlmIChsYW5ndWFnZSAhPSAiKiIpIHsKLSAgICAgIHNpemVfdCBzdWJfaW5kZXggPSBsYW5ndWFnZS5maW5kKCcuJyk7Ci0gICAgICBzdGQ6OnN0cmluZyBiYXNlX2xhbmd1YWdlID0gbGFuZ3VhZ2Uuc3Vic3RyKDAsIHN1Yl9pbmRleCk7Ci0gICAgICBzdGQ6OnN0cmluZyBzdWJfbmFtZXNwYWNlOwotCi0gICAgICBpZiAoYmFzZV9sYW5ndWFnZSA9PSAic21hbGx0YWxrIikgewotICAgICAgICBwd2FybmluZygxLCAiTmFtZXNwYWNlICdzbWFsbHRhbGsnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnc3QnIGluc3RlYWQiKTsKLSAgICAgICAgYmFzZV9sYW5ndWFnZSA9ICJzdCI7Ci0gICAgICB9Ci0KLSAgICAgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QgbXlfY29weSA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpOwotCi0gICAgICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90OjppdGVyYXRvciBpdDsKLSAgICAgIGl0ID0gbXlfY29weS5maW5kKGJhc2VfbGFuZ3VhZ2UpOwotCi0gICAgICBpZiAoaXQgPT0gbXlfY29weS5lbmQoKSkgewotICAgICAgICBzdGQ6OnN0cmluZyB3YXJuaW5nID0gIk5vIGdlbmVyYXRvciBuYW1lZCAnIiArIGJhc2VfbGFuZ3VhZ2UgKyAiJyBjb3VsZCBiZSBmb3VuZCEiOwotICAgICAgICBwd2FybmluZygxLCB3YXJuaW5nLmNfc3RyKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHN1Yl9pbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1Yl9uYW1lc3BhY2UgPSBsYW5ndWFnZS5zdWJzdHIoc3ViX2luZGV4ICsgMSk7Ci0gICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5pc192YWxpZF9uYW1lc3BhY2Uoc3ViX25hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHdhcm5pbmcgPSBiYXNlX2xhbmd1YWdlICsgIiBnZW5lcmF0b3IgZG9lcyBub3QgYWNjZXB0ICciICsgc3ViX25hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgYXMgc3ViLW5hbWVzcGFjZSEiOwotICAgICAgICAgICAgcHdhcm5pbmcoMSwgd2FybmluZy5jX3N0cigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBuYW1lc3BhY2VzX1tsYW5ndWFnZV0gPSBuYW1lX3NwYWNlOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBsYW5ndWFnZSkgY29uc3QgewotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgaWYgKChpdGVyID0gbmFtZXNwYWNlc18uZmluZChsYW5ndWFnZSkpICE9IG5hbWVzcGFjZXNfLmVuZCgpCi0gICAgICAgIHx8IChpdGVyID0gbmFtZXNwYWNlc18uZmluZCgiKiIpKSAhPSBuYW1lc3BhY2VzXy5lbmQoKSkgewotICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKLSAgICB9Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci0gIH0KLQotICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBnZXRfYWxsX25hbWVzcGFjZXMoKXsKLSAgICAgcmV0dXJuIG5hbWVzcGFjZXNfOwotICB9Ci0gIC8vIExhbmd1YWdlIHNwZWNpZmljIG5hbWVzcGFjZSAvIHBhY2thZ2luZwotCi0gIHZvaWQgYWRkX2NwcF9pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgpIHsgY3BwX2luY2x1ZGVzXy5wdXNoX2JhY2socGF0aCk7IH0KLQotICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9jcHBfaW5jbHVkZXMoKSB7IHJldHVybiBjcHBfaW5jbHVkZXNfOyB9Ci0KLSAgdm9pZCBhZGRfY19pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgpIHsgY19pbmNsdWRlc18ucHVzaF9iYWNrKHBhdGgpOyB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfY19pbmNsdWRlcygpIHsgcmV0dXJuIGNfaW5jbHVkZXNfOyB9Ci0KLXByaXZhdGU6Ci0gIC8vIEZpbGUgcGF0aAotICBzdGQ6OnN0cmluZyBwYXRoXzsKLQotICAvLyBOYW1lCi0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotCi0gIC8vIE91dHB1dCBkaXJlY3RvcnkKLSAgc3RkOjpzdHJpbmcgb3V0X3BhdGhfOwotCi0gIC8vIE91dHB1dCBkaXJlY3RvcnkgaXMgYWJzb2x1dGUgbG9jYXRpb24gZm9yIGdlbmVyYXRlZCBzb3VyY2UgKG5vIGdlbi0qKQotICBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlXzsKLQotICAvLyBOYW1lc3BhY2UKLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlXzsKLQotICAvLyBJbmNsdWRlZCBwcm9ncmFtcwotICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlc187Ci0KLSAgLy8gSW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSwgaWYgYW55Ci0gIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4XzsKLQotICAvLyBJZGVudGlmaWVyIGxvb2t1cCBzY29wZQotICB0X3Njb3BlKiBzY29wZV87Ci0KLSAgLy8gQ29tcG9uZW50cyB0byBnZW5lcmF0ZSBjb2RlIGZvcgotICBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmc187Ci0gIHN0ZDo6dmVjdG9yPHRfZW51bSo+IGVudW1zXzsKLSAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187Ci0gIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0c187Ci0gIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gc3RydWN0c187Ci0gIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4geGNlcHRpb25zXzsKLSAgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXNfOwotCi0gIC8vIER5bmFtaWMgbmFtZXNwYWNlcwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG5hbWVzcGFjZXNfOwotCi0gIC8vIEMrKyBleHRyYSBpbmNsdWRlcwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY3BwX2luY2x1ZGVzXzsKLQotICAvLyBDIGV4dHJhIGluY2x1ZGVzCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjX2luY2x1ZGVzXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Njb3BlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2NvcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwOGZkZC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2NvcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9TQ09QRV9ICi0jZGVmaW5lIFRfU0NPUEVfSAotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAidF90eXBlLmgiCi0jaW5jbHVkZSAidF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAidF9jb25zdC5oIgotI2luY2x1ZGUgInRfY29uc3RfdmFsdWUuaCIKLSNpbmNsdWRlICJ0X2Jhc2VfdHlwZS5oIgotI2luY2x1ZGUgInRfbWFwLmgiCi0jaW5jbHVkZSAidF9saXN0LmgiCi0KLS8qKgotICogVGhpcyByZXByZXNlbnRzIGEgdmFyaWFibGUgc2NvcGUgdXNlZCBmb3IgbG9va2luZyB1cCBwcmVkZWZpbmVkIHR5cGVzIGFuZAotICogc2VydmljZXMuIFR5cGljYWxseSwgYSBzY29wZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB0X3Byb2dyYW0uIFNjb3BlcyBhcmUgbm90Ci0gKiB1c2VkIHRvIGRldGVybWluZSBjb2RlIGdlbmVyYXRpb24sIGJ1dCByYXRoZXIgdG8gcmVzb2x2ZSBpZGVudGlmaWVycyBhdAotICogcGFyc2UgdGltZS4KLSAqCi0gKi8KLWNsYXNzIHRfc2NvcGUgewotcHVibGljOgotICB0X3Njb3BlKCkge30KLQotICB2b2lkIGFkZF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSkgeyB0eXBlc19bbmFtZV0gPSB0eXBlOyB9Ci0KLSAgdF90eXBlKiBnZXRfdHlwZShzdGQ6OnN0cmluZyBuYW1lKSB7IHJldHVybiB0eXBlc19bbmFtZV07IH0KLQotICB2b2lkIGFkZF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfc2VydmljZSogc2VydmljZSkgeyBzZXJ2aWNlc19bbmFtZV0gPSBzZXJ2aWNlOyB9Ci0KLSAgdF9zZXJ2aWNlKiBnZXRfc2VydmljZShzdGQ6OnN0cmluZyBuYW1lKSB7IHJldHVybiBzZXJ2aWNlc19bbmFtZV07IH0KLQotICB2b2lkIGFkZF9jb25zdGFudChzdGQ6OnN0cmluZyBuYW1lLCB0X2NvbnN0KiBjb25zdGFudCkgewotICAgIGlmIChjb25zdGFudHNfLmZpbmQobmFtZSkgIT0gY29uc3RhbnRzXy5lbmQoKSkgewotICAgICAgdGhyb3cgIkVudW0gIiArIG5hbWUgKyAiIGlzIGFscmVhZHkgZGVmaW5lZCEiOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb25zdGFudHNfW25hbWVdID0gY29uc3RhbnQ7Ci0gICAgfQotICB9Ci0KLSAgdF9jb25zdCogZ2V0X2NvbnN0YW50KHN0ZDo6c3RyaW5nIG5hbWUpIHsgcmV0dXJuIGNvbnN0YW50c19bbmFtZV07IH0KLQotICB2b2lkIHByaW50KCkgewotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3R5cGUqPjo6aXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSB0eXBlc18uYmVnaW4oKTsgaXRlciAhPSB0eXBlc18uZW5kKCk7ICsraXRlcikgewotICAgICAgcHJpbnRmKCIlcyA9PiAlc1xuIiwgaXRlci0+Zmlyc3QuY19zdHIoKSwgaXRlci0+c2Vjb25kLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgcmVzb2x2ZV9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWwsIHRfdHlwZSogdHR5cGUpIHsKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiBtYXAgPSBjb25zdF92YWwtPmdldF9tYXAoKTsKLSAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUodl9pdGVyLT5maXJzdCwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUodl9pdGVyLT5zZWNvbmQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gY29uc3RfdmFsLT5nZXRfbGlzdCgpOwotICAgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKCgqdl9pdGVyKSwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QgPSAodF9zdHJ1Y3QqKXR0eXBlOwotICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgbWFwID0gY29uc3RfdmFsLT5nZXRfbWFwKCk7Ci0gICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICB0X2ZpZWxkKiBmaWVsZCA9IHRzdHJ1Y3QtPmdldF9maWVsZF9ieV9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgdGhyb3cgIk5vIGZpZWxkIG5hbWVkIFwiIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKQotICAgICAgICAgICAgICArICJcIiB3YXMgZm91bmQgaW4gc3RydWN0IG9mIHR5cGUgXCIiICsgdHN0cnVjdC0+Z2V0X25hbWUoKSArICJcIiI7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgZmllbGQtPmdldF90eXBlKCkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoY29uc3RfdmFsLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKLSAgICAgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0oKHRfZW51bSopdHR5cGUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdF9jb25zdCogY29uc3RhbnQgPSBnZXRfY29uc3RhbnQoY29uc3RfdmFsLT5nZXRfaWRlbnRpZmllcigpKTsKLSAgICAgICAgaWYgKGNvbnN0YW50ID09IE5VTEwpIHsKLSAgICAgICAgICB0aHJvdyAiTm8gZW51bSB2YWx1ZSBvciBjb25zdGFudCBmb3VuZCBuYW1lZCBcIiIgKyBjb25zdF92YWwtPmdldF9pZGVudGlmaWVyKCkgKyAiXCIhIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlc29sdmUgdHlwZWRlZnMgdG8gdGhlIHVuZGVybHlpbmcgdHlwZQotICAgICAgICB0X3R5cGUqIGNvbnN0X3R5cGUgPSBjb25zdGFudC0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOwotCi0gICAgICAgIGlmIChjb25zdF90eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopY29uc3RfdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgY29uc3RfdmFsLT5zZXRfaW50ZWdlcihjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICBjb25zdF92YWwtPnNldF9zdHJpbmcoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfc3RyaW5nKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBjb25zdF92YWwtPnNldF9kb3VibGUoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfZG91YmxlKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgdGhyb3cgIkNvbnN0YW50cyBjYW5ub3QgYmUgb2YgdHlwZSBWT0lEIjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uc3RfdHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiBtYXAgPSBjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9tYXAoKTsKLSAgICAgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICAgICAgICBjb25zdF92YWwtPnNldF9tYXAoKTsKLSAgICAgICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgICAgY29uc3RfdmFsLT5hZGRfbWFwKHZfaXRlci0+Zmlyc3QsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uc3RfdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9saXN0KCk7Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICAgICAgICBjb25zdF92YWwtPnNldF9saXN0KCk7Ci0gICAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgICAgIGNvbnN0X3ZhbC0+YWRkX2xpc3QoKnZfaXRlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAvLyBlbnVtIGNvbnN0YW50IHdpdGggbm9uLWlkZW50aWZpZXIgdmFsdWUuIHNldCB0aGUgZW51bSBhbmQgZmluZCB0aGUKLSAgICAgIC8vIHZhbHVlJ3MgbmFtZS4KLSAgICAgIHRfZW51bSogdGVudW0gPSAodF9lbnVtKil0dHlwZTsKLSAgICAgIHRfZW51bV92YWx1ZSogZW51bV92YWx1ZSA9IHRlbnVtLT5nZXRfY29uc3RhbnRfYnlfdmFsdWUoY29uc3RfdmFsLT5nZXRfaW50ZWdlcigpKTsKLSAgICAgIGlmIChlbnVtX3ZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhbHN0bTsKLSAgICAgICAgdmFsc3RtIDw8IGNvbnN0X3ZhbC0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgdGhyb3cgIkNvdWxkbid0IGZpbmQgYSBuYW1lZCB2YWx1ZSBpbiBlbnVtICIgKyB0ZW51bS0+Z2V0X25hbWUoKSArICIgZm9yIHZhbHVlICIKLSAgICAgICAgICAgICsgdmFsc3RtLnN0cigpOwotICAgICAgfQotICAgICAgY29uc3RfdmFsLT5zZXRfaWRlbnRpZmllcih0ZW51bS0+Z2V0X25hbWUoKSArICIuIiArIGVudW1fdmFsdWUtPmdldF9uYW1lKCkpOwotICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSh0ZW51bSk7Ci0gICAgfQotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIE1hcCBvZiBuYW1lcyB0byB0eXBlcwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF90eXBlKj4gdHlwZXNfOwotCi0gIC8vIE1hcCBvZiBuYW1lcyB0byBjb25zdGFudHMKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfY29uc3QqPiBjb25zdGFudHNfOwotCi0gIC8vIE1hcCBvZiBuYW1lcyB0byBzZXJ2aWNlcwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zZXJ2aWNlKj4gc2VydmljZXNfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2VydmljZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwMWY5Yy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU0VSVklDRV9ICi0jZGVmaW5lIFRfU0VSVklDRV9ICi0KLSNpbmNsdWRlICJ0X2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSA8dmVjdG9yPgotCi1jbGFzcyB0X3Byb2dyYW07Ci0KLS8qKgotICogQSBzZXJ2aWNlIGNvbnNpc3RzIG9mIGEgc2V0IG9mIGZ1bmN0aW9ucy4KLSAqCi0gKi8KLWNsYXNzIHRfc2VydmljZSA6IHB1YmxpYyB0X3R5cGUgewotcHVibGljOgotICB0X3NlcnZpY2UodF9wcm9ncmFtKiBwcm9ncmFtKSA6IHRfdHlwZShwcm9ncmFtKSwgZXh0ZW5kc18oTlVMTCkge30KLQotICBib29sIGlzX3NlcnZpY2UoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgdm9pZCBzZXRfZXh0ZW5kcyh0X3NlcnZpY2UqIGV4dGVuZHMpIHsgZXh0ZW5kc18gPSBleHRlbmRzOyB9Ci0KLSAgdm9pZCBhZGRfZnVuY3Rpb24odF9mdW5jdGlvbiogZnVuYykgewotICAgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSBmdW5jdGlvbnNfLmJlZ2luKCk7IGl0ZXIgIT0gZnVuY3Rpb25zXy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgICBpZiAoZnVuYy0+Z2V0X25hbWUoKSA9PSAoKml0ZXIpLT5nZXRfbmFtZSgpKSB7Ci0gICAgICAgIHRocm93ICJGdW5jdGlvbiAiICsgZnVuYy0+Z2V0X25hbWUoKSArICIgaXMgYWxyZWFkeSBkZWZpbmVkIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZnVuY3Rpb25zXy5wdXNoX2JhY2soZnVuYyk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGdldF9mdW5jdGlvbnMoKSBjb25zdCB7IHJldHVybiBmdW5jdGlvbnNfOyB9Ci0KLSAgdF9zZXJ2aWNlKiBnZXRfZXh0ZW5kcygpIHsgcmV0dXJuIGV4dGVuZHNfOyB9Ci0KLXByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnNfOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2V0LmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDY0ODAuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU0VUX0gKLSNkZWZpbmUgVF9TRVRfSAotCi0jaW5jbHVkZSAidF9jb250YWluZXIuaCIKLQotLyoqCi0gKiBBIHNldCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIGRhdGEgdHlwZS4KLSAqCi0gKi8KLWNsYXNzIHRfc2V0IDogcHVibGljIHRfY29udGFpbmVyIHsKLXB1YmxpYzoKLSAgdF9zZXQodF90eXBlKiBlbGVtX3R5cGUpIDogZWxlbV90eXBlXyhlbGVtX3R5cGUpIHt9Ci0KLSAgdF90eXBlKiBnZXRfZWxlbV90eXBlKCkgY29uc3QgeyByZXR1cm4gZWxlbV90eXBlXzsgfQotCi0gIGJvb2wgaXNfc2V0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi1wcml2YXRlOgotICB0X3R5cGUqIGVsZW1fdHlwZV87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zdHJ1Y3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zdHJ1Y3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjYjA4OS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc3RydWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU1RSVUNUX0gKLSNkZWZpbmUgVF9TVFJVQ1RfSAotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfZmllbGQuaCIKLQotLy8gRm9yd2FyZCBkZWNsYXJlIHRoYXQgcHVwcHkKLWNsYXNzIHRfcHJvZ3JhbTsKLQotLyoqCi0gKiBBIHN0cnVjdCBpcyBhIGNvbnRhaW5lciBmb3IgYSBzZXQgb2YgbWVtYmVyIGZpZWxkcyB0aGF0IGhhcyBhIG5hbWUuIFN0cnVjdHMKLSAqIGFyZSBhbHNvIHVzZWQgdG8gaW1wbGVtZW50IGV4Y2VwdGlvbiB0eXBlcy4KLSAqCi0gKi8KLWNsYXNzIHRfc3RydWN0IDogcHVibGljIHRfdHlwZSB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnNfdHlwZTsKLQotICB0X3N0cnVjdCh0X3Byb2dyYW0qIHByb2dyYW0pCi0gICAgOiB0X3R5cGUocHJvZ3JhbSksCi0gICAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAotICAgICAgaXNfdW5pb25fKGZhbHNlKSwKLSAgICAgIG1lbWJlcnNfdmFsaWRhdGVkKGZhbHNlKSwKLSAgICAgIG1lbWJlcnNfd2l0aF92YWx1ZSgwKSwKLSAgICAgIHhzZF9hbGxfKGZhbHNlKSB7fQotCi0gIHRfc3RydWN0KHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCi0gICAgOiB0X3R5cGUocHJvZ3JhbSwgbmFtZSksCi0gICAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAotICAgICAgaXNfdW5pb25fKGZhbHNlKSwKLSAgICAgIG1lbWJlcnNfdmFsaWRhdGVkKGZhbHNlKSwKLSAgICAgIG1lbWJlcnNfd2l0aF92YWx1ZSgwKSwKLSAgICAgIHhzZF9hbGxfKGZhbHNlKSB7fQotCi0gIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICBuYW1lXyA9IG5hbWU7Ci0gICAgdmFsaWRhdGVfdW5pb25fbWVtYmVycygpOwotICB9Ci0KLSAgdm9pZCBzZXRfeGNlcHRpb24oYm9vbCBpc194Y2VwdGlvbikgeyBpc194Y2VwdGlvbl8gPSBpc194Y2VwdGlvbjsgfQotCi0gIHZvaWQgdmFsaWRhdGVfdW5pb25fbWVtYmVyKHRfZmllbGQqIGZpZWxkKSB7Ci0gICAgaWYgKGlzX3VuaW9uXyAmJiAoIW5hbWVfLmVtcHR5KCkpKSB7Ci0KLSAgICAgIC8vIHVuaW9ucyBjYW4ndCBoYXZlIHJlcXVpcmVkIGZpZWxkcwotICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBwd2FybmluZygxLAotICAgICAgICAgICAgICAgICAiUmVxdWlyZWQgZmllbGQgJXMgb2YgdW5pb24gJXMgc2V0IHRvIG9wdGlvbmFsLlxuIiwKLSAgICAgICAgICAgICAgICAgZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgbmFtZV8uY19zdHIoKSk7Ci0gICAgICAgIGZpZWxkLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOwotICAgICAgfQotCi0gICAgICAvLyB1bmlvbnMgbWF5IGhhdmUgdXAgdG8gb25lIG1lbWJlciBkZWZhdWx0ZWQsIGJ1dCBub3QgbW9yZQotICAgICAgaWYgKGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgxIDwgKyttZW1iZXJzX3dpdGhfdmFsdWUpIHsKLSAgICAgICAgICB0aHJvdyAiRXJyb3I6IEZpZWxkICIgKyBmaWVsZC0+Z2V0X25hbWUoKSArICIgcHJvdmlkZXMgYW5vdGhlciBkZWZhdWx0IHZhbHVlIGZvciB1bmlvbiAiCi0gICAgICAgICAgICAgICsgbmFtZV87Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKSB7Ci0gICAgaWYgKGlzX3VuaW9uXyAmJiAoIW5hbWVfLmVtcHR5KCkpICYmICghbWVtYmVyc192YWxpZGF0ZWQpKSB7Ci0gICAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgewotICAgICAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXIoKm1faXRlcik7Ci0gICAgICB9Ci0gICAgICBtZW1iZXJzX3ZhbGlkYXRlZCA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzZXRfdW5pb24oYm9vbCBpc191bmlvbikgewotICAgIGlzX3VuaW9uXyA9IGlzX3VuaW9uOwotICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKTsKLSAgfQotCi0gIHZvaWQgc2V0X3hzZF9hbGwoYm9vbCB4c2RfYWxsKSB7IHhzZF9hbGxfID0geHNkX2FsbDsgfQotCi0gIGJvb2wgZ2V0X3hzZF9hbGwoKSBjb25zdCB7IHJldHVybiB4c2RfYWxsXzsgfQotCi0gIGJvb2wgYXBwZW5kKHRfZmllbGQqIGVsZW0pIHsKLSAgICB0eXBlZGVmIG1lbWJlcnNfdHlwZTo6aXRlcmF0b3IgaXRlcl90eXBlOwotICAgIHN0ZDo6cGFpcjxpdGVyX3R5cGUsIGl0ZXJfdHlwZT4gYm91bmRzID0gc3RkOjplcXVhbF9yYW5nZShtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZDo6a2V5X2NvbXBhcmUoKSk7Ci0gICAgaWYgKGJvdW5kcy5maXJzdCAhPSBib3VuZHMuc2Vjb25kKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8vIHJldHVybnMgZmFsc2Ugd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0IG9mIGZpZWxkIG5hbWVzCi0gICAgaWYgKGdldF9maWVsZF9ieV9uYW1lKGVsZW0tPmdldF9uYW1lKCkpICE9IE5VTEwpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbWVtYmVyc18ucHVzaF9iYWNrKGVsZW0pOwotICAgIG1lbWJlcnNfaW5faWRfb3JkZXJfLmluc2VydChib3VuZHMuc2Vjb25kLCBlbGVtKTsKLSAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXIoZWxlbSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjb25zdCBtZW1iZXJzX3R5cGUmIGdldF9tZW1iZXJzKCkgeyByZXR1cm4gbWVtYmVyc187IH0KLQotICBjb25zdCBtZW1iZXJzX3R5cGUmIGdldF9zb3J0ZWRfbWVtYmVycygpIHsgcmV0dXJuIG1lbWJlcnNfaW5faWRfb3JkZXJfOyB9Ci0KLSAgYm9vbCBpc19zdHJ1Y3QoKSBjb25zdCB7IHJldHVybiAhaXNfeGNlcHRpb25fOyB9Ci0KLSAgYm9vbCBpc194Y2VwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGlzX3hjZXB0aW9uXzsgfQotCi0gIGJvb2wgaXNfdW5pb24oKSBjb25zdCB7IHJldHVybiBpc191bmlvbl87IH0KLQotICB0X2ZpZWxkKiBnZXRfZmllbGRfYnlfbmFtZShzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7Ci0gICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfbmFtZSgpID09IGZpZWxkX25hbWUpIHsKLSAgICAgICAgcmV0dXJuICptX2l0ZXI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLXByaXZhdGU6Ci0gIG1lbWJlcnNfdHlwZSBtZW1iZXJzXzsKLSAgbWVtYmVyc190eXBlIG1lbWJlcnNfaW5faWRfb3JkZXJfOwotICBib29sIGlzX3hjZXB0aW9uXzsKLSAgYm9vbCBpc191bmlvbl87Ci0gIGJvb2wgbWVtYmVyc192YWxpZGF0ZWQ7Ci0gIGludCBtZW1iZXJzX3dpdGhfdmFsdWU7Ci0KLSAgYm9vbCB4c2RfYWxsXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNmNjNmYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9UWVBFX0gKLSNkZWZpbmUgVF9UWVBFX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlICJ0X2RvYy5oIgotCi1jbGFzcyB0X3Byb2dyYW07Ci0KLS8qKgotICogR2VuZXJpYyByZXByZXNlbnRhdGlvbiBvZiBhIHRocmlmdCB0eXBlLiBUaGVzZSBvYmplY3RzIGFyZSB1c2VkIGJ5IHRoZQotICogcGFyc2VyIG1vZHVsZSB0byBidWlsZCB1cCBhIHRyZWUgb2Ygb2JqZWN0IHRoYXQgYXJlIGFsbCBleHBsaWNpdGx5IHR5cGVkLgotICogVGhlIGdlbmVyaWMgdF90eXBlIGNsYXNzIGV4cG9ydHMgYSB2YXJpZXR5IG9mIHVzZWZ1bCBtZXRob2RzIHRoYXQgYXJlCi0gKiB1c2VkIGJ5IHRoZSBjb2RlIGdlbmVyYXRvciB0byBicmFuY2ggYmFzZWQgdXBvbiBkaWZmZXJlbnQgaGFuZGxpbmcgZm9yIHRoZQotICogdmFyaW91cyB0eXBlcy4KLSAqCi0gKi8KLWNsYXNzIHRfdHlwZSA6IHB1YmxpYyB0X2RvYyB7Ci1wdWJsaWM6Ci0gIHZpcnR1YWwgfnRfdHlwZSgpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IG5hbWVfID0gbmFtZTsgfQotCi0gIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KLQotICB2aXJ0dWFsIGJvb2wgaXNfdm9pZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19iYXNlX3R5cGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX2Jvb2woKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfdHlwZWRlZigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19lbnVtKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3N0cnVjdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc194Y2VwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19jb250YWluZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19zZXQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfbWFwKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3NlcnZpY2UoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gIHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSB7IHJldHVybiBwcm9ncmFtXzsgfQotCi0gIGNvbnN0IHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSBjb25zdCB7IHJldHVybiBwcm9ncmFtXzsgfQotCi0gIHRfdHlwZSogZ2V0X3RydWVfdHlwZSgpOwotCi0gIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBicmVhayAobWF5YmUgYmFkbHkpIHVubGVzcyAwIDw9IG51bSA8PSAxNi4KLSAgc3RhdGljIGNoYXIgbnliYmxlX3RvX3hkaWdpdChpbnQgbnVtKSB7Ci0gICAgaWYgKG51bSA8IDEwKSB7Ci0gICAgICByZXR1cm4gJzAnICsgbnVtOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gJ0EnICsgbnVtIC0gMTA7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIGJ5dGVfdG9faGV4KHVpbnQ4X3QgYnl0ZSkgewotICAgIHN0ZDo6c3RyaW5nIHJ2OwotICAgIHJ2ICs9IG55YmJsZV90b194ZGlnaXQoYnl0ZSA+PiA0KTsKLSAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgJiAweDBmKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKLQotcHJvdGVjdGVkOgotICB0X3R5cGUoKSA6IHByb2dyYW1fKE5VTEwpIHsgOyB9Ci0KLSAgdF90eXBlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOiBwcm9ncmFtXyhwcm9ncmFtKSB7IDsgfQotCi0gIHRfdHlwZSh0X3Byb2dyYW0qIHByb2dyYW0sIHN0ZDo6c3RyaW5nIG5hbWUpIDogcHJvZ3JhbV8ocHJvZ3JhbSksIG5hbWVfKG5hbWUpIHsgOyB9Ci0KLSAgdF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUpIDogcHJvZ3JhbV8oTlVMTCksIG5hbWVfKG5hbWUpIHsgOyB9Ci0KLSAgdF9wcm9ncmFtKiBwcm9ncmFtXzsKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci19OwotCi0vKioKLSAqIFBsYWNlaG9sZGVyIHN0cnVjdCBmb3IgcmV0dXJuaW5nIHRoZSBrZXkgYW5kIHZhbHVlIG9mIGFuIGFubm90YXRpb24KLSAqIGR1cmluZyBwYXJzaW5nLgotICovCi1zdHJ1Y3QgdF9hbm5vdGF0aW9uIHsKLSAgc3RkOjpzdHJpbmcga2V5OwotICBzdGQ6OnN0cmluZyB2YWw7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlZGVmLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYmU3NDkuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSA8Y3N0ZGlvPgotCi0jaW5jbHVkZSAidF90eXBlZGVmLmgiCi0jaW5jbHVkZSAidF9wcm9ncmFtLmgiCi0KLXRfdHlwZSogdF90eXBlZGVmOjpnZXRfdHlwZSgpIGNvbnN0IHsKLSAgaWYgKHR5cGVfID09IE5VTEwpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfcHJvZ3JhbSgpLT5zY29wZSgpLT5nZXRfdHlwZShzeW1ib2xpY18pOwotICAgIGlmICh0eXBlID09IE5VTEwpIHsKLSAgICAgIHByaW50ZigiVHlwZSBcIiVzXCIgbm90IGRlZmluZWRcbiIsIHN5bWJvbGljXy5jX3N0cigpKTsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIHJldHVybiB0eXBlOwotICB9Ci0gIHJldHVybiB0eXBlXzsKLX0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlZGVmLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZWRlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzlhMjQ2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlZGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9UWVBFREVGX0gKLSNkZWZpbmUgVF9UWVBFREVGX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLQotLyoqCi0gKiBBIHR5cGVkZWYgaXMgYSBtYXBwaW5nIGZyb20gYSBzeW1ib2xpYyBuYW1lIHRvIGFub3RoZXIgdHlwZS4gSW4gZHltYW5pY2FsbHkKLSAqIHR5cGVkIGxhbmd1YWdlcyAoaS5lLiBwaHAvcHl0aG9uKSB0aGUgY29kZSBnZW5lcmF0b3IgY2FuIGFjdHVhbGx5IHVzdWFsbHkKLSAqIGlnbm9yZSB0eXBlZGVmcyBhbmQganVzdCB1c2UgdGhlIHVuZGVybHlpbmcgdHlwZSBkaXJlY3RseSwgdGhvdWdoIGluIEMrKwotICogdGhlIHN5bWJvbGljIG5hbWluZyBjYW4gYmUgcXVpdGUgdXNlZnVsIGZvciBjb2RlIGNsYXJpdHkuCi0gKgotICovCi1jbGFzcyB0X3R5cGVkZWYgOiBwdWJsaWMgdF90eXBlIHsKLXB1YmxpYzoKLSAgdF90eXBlZGVmKHRfcHJvZ3JhbSogcHJvZ3JhbSwgdF90eXBlKiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9saWMpCi0gICAgOiB0X3R5cGUocHJvZ3JhbSwgc3ltYm9saWMpLCB0eXBlXyh0eXBlKSwgc3ltYm9saWNfKHN5bWJvbGljKSwgZm9yd2FyZF8oZmFsc2UpLCBzZWVuXyhmYWxzZSkge30KLQotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgdHlwZSB0aGF0IGlzIGxhemlseQotICAgKiByZXNvbHZlZCBhdCBhIGxhdGVyIHRpbWUsIGxpa2UgZm9yIGZvcndhcmQgZGVjbGFyYXRpb25zIG9yCi0gICAqIHJlY3Vyc2l2ZSB0eXBlcy4KLSAgICovCi0gIHRfdHlwZWRlZih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzeW1ib2xpYywgYm9vbCBmb3J3YXJkKQotICAgIDogdF90eXBlKHByb2dyYW0sIHN5bWJvbGljKSwKLSAgICAgIHR5cGVfKE5VTEwpLAotICAgICAgc3ltYm9saWNfKHN5bWJvbGljKSwKLSAgICAgIGZvcndhcmRfKGZvcndhcmQpLAotICAgICAgc2Vlbl8oZmFsc2UpIHt9Ci0KLSAgfnRfdHlwZWRlZigpIHt9Ci0KLSAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0OwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfc3ltYm9saWMoKSBjb25zdCB7IHJldHVybiBzeW1ib2xpY187IH0KLQotICBib29sIGlzX2ZvcndhcmRfdHlwZWRlZigpIGNvbnN0IHsgcmV0dXJuIGZvcndhcmRfOyB9Ci0KLSAgYm9vbCBpc190eXBlZGVmKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi1wcml2YXRlOgotICB0X3R5cGUqIHR5cGVfOwotICBzdGQ6OnN0cmluZyBzeW1ib2xpY187Ci0gIGJvb2wgZm9yd2FyZF87Ci0gIG11dGFibGUgYm9vbCBzZWVuXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wbGF0Zm9ybS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wbGF0Zm9ybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2JlOWRiLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGxhdGZvcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBkZWZpbmUgZm9yIG1rZGlyLHNpbmNlIHRoZSBtZXRob2Qgc2lnbmF0dXJlCi0gKiBpcyBkaWZmZXJlbnQgZm9yIHRoZSBub24tUE9TSVggTWluR1cKLSAqLwotCi0jaWZkZWYgX01TQ19WRVIKLSNpbmNsdWRlICJ3aW5kb3dzL2NvbmZpZy5oIgotI2VuZGlmCi0KLSNpZmRlZiBfV0lOMzIKLSNpbmNsdWRlIDxkaXJlY3QuaD4KLSNpbmNsdWRlIDxpby5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2VuZGlmCi0KLSNpZmRlZiBfV0lOMzIKLSNkZWZpbmUgTUtESVIoeCkgbWtkaXIoeCkKLSNlbHNlCi0jZGVmaW5lIE1LRElSKHgpIG1rZGlyKHgsIFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTykKLSNlbmRpZgotCi0jaWZkZWYgUEFUSF9NQVgKLSNkZWZpbmUgVEhSSUZUX1BBVEhfTUFYIFBBVEhfTUFYCi0jZWxzZQotI2RlZmluZSBUSFJJRlRfUEFUSF9NQVggTUFYX1BBVEgKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmNlMTVjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAKQEAgLTAsMCArMSw0NTQgQEAKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8vIENhcmVmdWw6IG11c3QgaW5jbHVkZSBnbG9iYWxzIGZpcnN0IGZvciBleHRlcm4gZGVmaW5pdGlvbnMKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Njb3BlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9maWVsZC5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKworI2luY2x1ZGUgInRocmlmdC9hdWRpdC90X2F1ZGl0LmgiCisKK2V4dGVybiBpbnQgZ193YXJuOworZXh0ZXJuIHN0ZDo6c3RyaW5nIGdfY3VycGF0aDsKK2V4dGVybiBib29sIGdfcmV0dXJuX2ZhaWx1cmU7CisKK3ZvaWQgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICAgaWYgKGdfd2FybiA8IGxldmVsKSB7CisgICAgICByZXR1cm47CisgICB9CisgICB2YV9saXN0IGFyZ3M7CisgICBwcmludGYoIltUaHJpZnQgQXVkaXQgV2FybmluZzolc10gIiwgZ19jdXJwYXRoLmNfc3RyKCkpOworICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgIHZhX2VuZChhcmdzKTsKKyAgIHByaW50ZigiXG4iKTsKK30KKwordm9pZCB0aHJpZnRfYXVkaXRfZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIGZwcmludGYoc3RkZXJyLCAiW1RocmlmdCBBdWRpdCBGYWlsdXJlOiVzXSAiLCBnX2N1cnBhdGguY19zdHIoKSk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIGdfcmV0dXJuX2ZhaWx1cmUgPSB0cnVlOworfQorCit2b2lkIGNvbXBhcmVfbmFtZXNwYWNlKHRfcHJvZ3JhbSogbmV3UHJvZ3JhbSwgdF9wcm9ncmFtKiBvbGRQcm9ncmFtKQoreworICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgbmV3TmFtZXNwYWNlTWFwID0gbmV3UHJvZ3JhbS0+Z2V0X2FsbF9uYW1lc3BhY2VzKCk7CisgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBvbGROYW1lc3BhY2VNYXAgPSBvbGRQcm9ncmFtLT5nZXRfYWxsX25hbWVzcGFjZXMoKTsKKworICAgZm9yKGNvbnN0IGF1dG8gJiBvbGROYW1lc3BhY2VNYXBJdCA6IG9sZE5hbWVzcGFjZU1hcCkKKyAgIHsKKyAgICAgIGF1dG8gbmV3TmFtZXNwYWNlTWFwSXQgPSBuZXdOYW1lc3BhY2VNYXAuZmluZChvbGROYW1lc3BhY2VNYXBJdC5maXJzdCk7CisgICAgICBpZihuZXdOYW1lc3BhY2VNYXBJdCA9PSBuZXdOYW1lc3BhY2VNYXAuZW5kKCkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiTGFuZ3VhZ2UgJXMgbm90IGZvdW5kIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwgKG9sZE5hbWVzcGFjZU1hcEl0LmZpcnN0KS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoKG5ld05hbWVzcGFjZU1hcEl0LT5zZWNvbmQpICE9IG9sZE5hbWVzcGFjZU1hcEl0LnNlY29uZCkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJOYW1lc3BhY2UgJXMgY2hhbmdlZCBpbiBuZXcgdGhyaWZ0IGZpbGVcbiIsIChvbGROYW1lc3BhY2VNYXBJdC5zZWNvbmQpLmNfc3RyKCkpOworICAgICAgfQorICAgfQorfQorCit2b2lkIGNvbXBhcmVfZW51bV92YWx1ZXModF9lbnVtKiBuZXdFbnVtLHRfZW51bSogb2xkRW51bSkKK3sKKyAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBvbGRFbnVtVmFsdWVzID0gb2xkRW51bS0+Z2V0X2NvbnN0YW50cygpOworICAgZm9yKGF1dG8gb2xkRW51bVZhbHVlIDogb2xkRW51bVZhbHVlcykKKyAgIHsKKyAgICAgIGludCBlbnVtVmFsdWUgPSBvbGRFbnVtVmFsdWUtPmdldF92YWx1ZSgpOworICAgICAgdF9lbnVtX3ZhbHVlKiBuZXdFbnVtVmFsdWUgPSBuZXdFbnVtLT5nZXRfY29uc3RhbnRfYnlfdmFsdWUoZW51bVZhbHVlKTsKKyAgICAgIGlmKG5ld0VudW1WYWx1ZSAhPSBudWxscHRyKQorICAgICAgeworICAgICAgICAgc3RkOjpzdHJpbmcgZW51bU5hbWUgPSBvbGRFbnVtVmFsdWUtPmdldF9uYW1lKCk7CisgICAgICAgICBpZihlbnVtTmFtZSAhPSBuZXdFbnVtVmFsdWUtPmdldF9uYW1lKCkpCisgICAgICAgICB7CisgICAgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiTmFtZSBvZiB0aGUgdmFsdWUgJWQgY2hhbmdlZCBpbiBlbnVtICVzXG4iLCBlbnVtVmFsdWUsIG9sZEVudW0tPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiRW51bSB2YWx1ZSAlZCBtaXNzaW5nIGluICVzXG4iLCBlbnVtVmFsdWUsIG9sZEVudW0tPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICB9CisKKyAgIH0KK30KKwordm9pZCBjb21wYXJlX2VudW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBuZXdFbnVtTGlzdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG9sZEVudW1MaXN0KQoreworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsdF9lbnVtKj4gbmV3RW51bU1hcDsKKyAgIHN0ZDo6dmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBuZXdFbnVtSXQ7CisgICBmb3IobmV3RW51bUl0ID0gbmV3RW51bUxpc3QuYmVnaW4oKTsgbmV3RW51bUl0ICE9IG5ld0VudW1MaXN0LmVuZCgpOyBuZXdFbnVtSXQrKykKKyAgIHsKKyAgICAgIG5ld0VudW1NYXBbKCpuZXdFbnVtSXQpLT5nZXRfbmFtZSgpXSA9ICpuZXdFbnVtSXQ7CisgICB9CisgICBzdGQ6OnZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3Igb2xkRW51bUl0OworICAgZm9yKG9sZEVudW1JdCA9IG9sZEVudW1MaXN0LmJlZ2luKCk7IG9sZEVudW1JdCAhPSBvbGRFbnVtTGlzdC5lbmQoKTsgb2xkRW51bUl0KyspCisgICB7CisgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZyx0X2VudW0qPjo6aXRlcmF0b3IgbmV3RW51bU1hcEl0OworICAgICAgbmV3RW51bU1hcEl0ID0gbmV3RW51bU1hcC5maW5kKCgqb2xkRW51bUl0KS0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGlmKG5ld0VudW1NYXBJdCA9PSBuZXdFbnVtTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkVudW0gJXMgbm90IGZvdW5kIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwoKm9sZEVudW1JdCktPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBjb21wYXJlX2VudW1fdmFsdWVzKG5ld0VudW1NYXBJdC0+c2Vjb25kLCAqb2xkRW51bUl0KTsKKyAgICAgIH0KKyAgIH0KK30KKworLy9UaGlzIGZ1bmN0aW9uIHJldHVybnMgJ3RydWUnIGlmIHRoZSB0d28gYXJndWVtZW50cyBhcmUgb2Ygc2FtZSB0eXBlcy4KKy8vUmV0dXJucyBmYWxzZSBpZiB0aGV5IGFyZSBvZiBkaWZmZXJlbnQgdHlwZQorYm9vbCBjb21wYXJlX3R5cGUodF90eXBlKiBuZXdUeXBlLCB0X3R5cGUqIG9sZFR5cGUpCit7CisgICAvL0NvbXBhcmluZyBuYW1lcyBvZiB0d28gdHlwZXMgd2lsbCB3b3JrIHdoZW4gdGhlIG5ld1R5cGUgYW5kIG9sZFR5cGUgYXJlIGJhc2ljIHR5cGVzIG9yIHN0cnVjdHMgb3IgZW51bXMuCisgICAvL0hvd2V2ZXIsIHdoZW4gdGhleSBhcmUgY29udGFpbmVycywgZ2V0X25hbWUoKSByZXR1cm5zIGVtcHR5IGZvciB3aGljaCB3ZSBoYXZlIHRvIGNvbXBhcmUgdGhlIHR5cGUgb2YKKyAgIC8vdGhlaXIgZWxlbWVudHMgYXMgd2VsbC4KKyAgIGlmKChuZXdUeXBlLT5nZXRfbmFtZSgpKS5lbXB0eSgpICYmIChvbGRUeXBlLT5nZXRfbmFtZSgpKS5lbXB0eSgpKQorICAgeworCisgICAgICBpZihuZXdUeXBlLT5pc19saXN0KCkgJiYgb2xkVHlwZS0+aXNfbGlzdCgpKQorICAgICAgeworICAgICAgICAgdF90eXBlKiBuZXdFbGVtZW50VHlwZSA9ICgodF9saXN0KiluZXdUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRFbGVtZW50VHlwZSA9ICgodF9saXN0KilvbGRUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICAgcmV0dXJuIGNvbXBhcmVfdHlwZShuZXdFbGVtZW50VHlwZSwgb2xkRWxlbWVudFR5cGUpOworICAgICAgfQorICAgICAgZWxzZSBpZihuZXdUeXBlLT5pc19tYXAoKSAmJiBvbGRUeXBlLT5pc19tYXAoKSkKKyAgICAgIHsKKyAgICAgICAgIHRfdHlwZSogbmV3S2V5VHlwZSA9ICgodF9tYXAqKW5ld1R5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgICAgIHRfdHlwZSogb2xkS2V5VHlwZSA9ICgodF9tYXAqKW9sZFR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKworICAgICAgICAgdF90eXBlKiBuZXdWYWxUeXBlID0gKCh0X21hcCopbmV3VHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRWYWxUeXBlID0gKCh0X21hcCopb2xkVHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgICAgICByZXR1cm4gKGNvbXBhcmVfdHlwZShuZXdLZXlUeXBlLCBvbGRLZXlUeXBlKSAmJiBjb21wYXJlX3R5cGUobmV3VmFsVHlwZSwgb2xkVmFsVHlwZSkpOworICAgICAgfQorICAgICAgZWxzZSBpZihuZXdUeXBlLT5pc19zZXQoKSAmJiBvbGRUeXBlLT5pc19zZXQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRfdHlwZSogbmV3RWxlbWVudFR5cGUgPSAoKHRfc2V0KiluZXdUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRFbGVtZW50VHlwZSA9ICgodF9zZXQqKW9sZFR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgICByZXR1cm4gY29tcGFyZV90eXBlKG5ld0VsZW1lbnRUeXBlLCBvbGRFbGVtZW50VHlwZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICB9CisgICBlbHNlIGlmKG5ld1R5cGUtPmdldF9uYW1lKCkgPT0gb2xkVHlwZS0+Z2V0X25hbWUoKSkKKyAgIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorfQorCitib29sIGNvbXBhcmVfcGFpcihzdGQ6OnBhaXI8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBuZXdNYXBQYWlyLCBzdGQ6OnBhaXI8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBvbGRNYXBQYWlyKQoreworICAgcmV0dXJuIGNvbXBhcmVfZGVmYXVsdHMobmV3TWFwUGFpci5maXJzdCwgb2xkTWFwUGFpci5maXJzdCkgJiYgY29tcGFyZV9kZWZhdWx0cyhuZXdNYXBQYWlyLnNlY29uZCwgb2xkTWFwUGFpci5zZWNvbmQpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgJ3RydWUnIGlmIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgc2FtZS4gUmV0dXJucyBmYWxzZSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQuCitib29sIGNvbXBhcmVfZGVmYXVsdHModF9jb25zdF92YWx1ZSogbmV3U3RydWN0RGVmYXVsdCwgdF9jb25zdF92YWx1ZSogb2xkU3RydWN0RGVmYXVsdCkKK3sKKyAgIGlmKG5ld1N0cnVjdERlZmF1bHQgPT0gbnVsbHB0ciAmJiBvbGRTdHJ1Y3REZWZhdWx0ID09IG51bGxwdHIpIHJldHVybiB0cnVlOworICAgZWxzZSBpZihuZXdTdHJ1Y3REZWZhdWx0ID09IG51bGxwdHIgJiYgb2xkU3RydWN0RGVmYXVsdCAhPSBudWxscHRyKSByZXR1cm4gZmFsc2U7CisgICBlbHNlIGlmIChuZXdTdHJ1Y3REZWZhdWx0ICE9IG51bGxwdHIgJiYgb2xkU3RydWN0RGVmYXVsdCA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CisKKyAgIGlmKG5ld1N0cnVjdERlZmF1bHQtPmdldF90eXBlKCkgIT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X3R5cGUoKSkKKyAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgc3dpdGNoKG5ld1N0cnVjdERlZmF1bHQtPmdldF90eXBlKCkpCisgICB7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgICAgICByZXR1cm4gKG5ld1N0cnVjdERlZmF1bHQtPmdldF9pbnRlZ2VyKCkgPT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2ludGVnZXIoKSk7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X2RvdWJsZSgpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9kb3VibGUoKSk7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X3N0cmluZygpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9zdHJpbmcoKSk7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIG9sZERlZmF1bHRMaXN0ID0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2xpc3QoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgbmV3RGVmYXVsdExpc3QgPSBuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfbGlzdCgpOworICAgICAgICAgICAgYm9vbCBkZWZhdWx0VmFsdWVzQ29tcGFyZSA9IChvbGREZWZhdWx0TGlzdC5zaXplKCkgPT0gbmV3RGVmYXVsdExpc3Quc2l6ZSgpKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXNDb21wYXJlICYmIHN0ZDo6ZXF1YWwobmV3RGVmYXVsdExpc3QuYmVnaW4oKSwgbmV3RGVmYXVsdExpc3QuZW5kKCksIG9sZERlZmF1bHRMaXN0LmJlZ2luKCksIGNvbXBhcmVfZGVmYXVsdHMpOworICAgICAgICAgfQorICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG5ld01hcCA9IG5ld1N0cnVjdERlZmF1bHQtPmdldF9tYXAoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gb2xkTWFwID0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X21hcCgpOworCisgICAgICAgICAgICBib29sIGRlZmF1bHRWYWx1ZXNDb21wYXJlID0gKG9sZE1hcC5zaXplKCkgPT0gbmV3TWFwLnNpemUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzQ29tcGFyZSAmJiBzdGQ6OmVxdWFsKG5ld01hcC5iZWdpbigpLCBuZXdNYXAuZW5kKCksIG9sZE1hcC5iZWdpbigpLCBjb21wYXJlX3BhaXIpOworICAgICAgICAgfQorICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgICAgICAgcmV0dXJuIChuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfaWRlbnRpZmllcigpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9pZGVudGlmaWVyKCkpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworfQorCit2b2lkIGNvbXBhcmVfc3RydWN0X2ZpZWxkKHRfZmllbGQqIG5ld0ZpZWxkLCB0X2ZpZWxkKiBvbGRGaWVsZCwgc3RkOjpzdHJpbmcgb2xkU3RydWN0TmFtZSkKK3sKKyAgIHRfdHlwZSogbmV3RmllbGRUeXBlID0gbmV3RmllbGQtPmdldF90eXBlKCk7CisgICB0X3R5cGUqIG9sZEZpZWxkVHlwZSA9IG9sZEZpZWxkLT5nZXRfdHlwZSgpOworICAgaWYoIWNvbXBhcmVfdHlwZShuZXdGaWVsZFR5cGUsIG9sZEZpZWxkVHlwZSkpCisgICB7CisgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIFR5cGUgQ2hhbmdlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsIG5ld0ZpZWxkLT5nZXRfa2V5KCksIG9sZFN0cnVjdE5hbWUuY19zdHIoKSk7CisgICB9CisKKyAgIC8vIEEgU3RydWN0IG1lbWJlciBjYW4gYmUgb3B0aW9uYWwgaWYgaXQgaXMgbWVudGlvbmVkIGV4cGxpY2l0bHksIG9yIGlmIGl0IGlzIGFzc2lnbmVkIHdpdGggZGVmYXVsdCB2YWx1ZXMuCisgICBib29sIG5ld1N0cnVjdEZpZWxkT3B0aW9uYWwgPSAobmV3RmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKyAgIGJvb2wgb2xkU3RydWN0RmllbGRPcHRpb25hbCA9IChvbGRGaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworCisgICBpZihuZXdTdHJ1Y3RGaWVsZE9wdGlvbmFsICE9IG9sZFN0cnVjdEZpZWxkT3B0aW9uYWwpCisgICB7CisgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIFJlcXVpcmVkbmVzcyBDaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgbmV3RmllbGQtPmdldF9rZXkoKSwgb2xkU3RydWN0TmFtZS5jX3N0cigpKTsKKyAgIH0KKyAgIGlmKG5ld1N0cnVjdEZpZWxkT3B0aW9uYWwgfHwgb2xkU3RydWN0RmllbGRPcHRpb25hbCkKKyAgIHsKKyAgICAgIGlmKCFjb21wYXJlX2RlZmF1bHRzKG5ld0ZpZWxkLT5nZXRfdmFsdWUoKSwgb2xkRmllbGQtPmdldF92YWx1ZSgpKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJEZWZhdWx0IHZhbHVlIGNoYW5nZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgICAgfQorICAgfQorCisgICBzdGQ6OnN0cmluZyBmaWVsZE5hbWUgPSBuZXdGaWVsZC0+Z2V0X25hbWUoKTsKKyAgIGlmKGZpZWxkTmFtZSAhPSBvbGRGaWVsZC0+Z2V0X25hbWUoKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJTdHJ1Y3QgZmllbGQgbmFtZSBjaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9zaW5nbGVfc3RydWN0KHRfc3RydWN0KiBuZXdTdHJ1Y3QsIHRfc3RydWN0KiBvbGRTdHJ1Y3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBvbGRTdHJ1Y3ROYW1lID0gc3RkOjpzdHJpbmcoKSkKK3sKKyAgIHN0ZDo6c3RyaW5nIHN0cnVjdE5hbWUgPSBvbGRTdHJ1Y3ROYW1lLmVtcHR5KCkgPyBvbGRTdHJ1Y3QtPmdldF9uYW1lKCkgOiBvbGRTdHJ1Y3ROYW1lOworICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBvbGRTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyID0gb2xkU3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlciA9IG5ld1N0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICBhdXRvIG9sZFN0cnVjdE1lbWJlckl0ID0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5iZWdpbigpOworICAgYXV0byBuZXdTdHJ1Y3RNZW1iZXJJdCA9IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuYmVnaW4oKTsKKworICAgLy8gU2luY2Ugd2UgaGF2ZSB0aGUgc3RydWN0IG1lbWJlcnMgaW4gdGhlaXIgSUQgb3JkZXIsIGNvbXBhcmluZyB0aGVpciBJRHMgY2FuIGJlIGRvbmUgYnkgdHJhdmVyc2luZyB0aGUgdHdvIG1lbWJlcgorICAgLy8gbGlzdHMgdG9nZXRoZXIuCisgICB3aGlsZSghKG9sZFN0cnVjdE1lbWJlckl0ID09IG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkgJiYgbmV3U3RydWN0TWVtYmVySXQgPT0gbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSkpCisgICB7CisgICAgICBpZihuZXdTdHJ1Y3RNZW1iZXJJdCA9PSBuZXdTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpICYmIG9sZFN0cnVjdE1lbWJlckl0ICE9IG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkpCisgICAgICB7CisgICAgICAgICAvLyBBIGZpZWxkIElEIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZW5kLgorICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCBGaWVsZCByZW1vdmVkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgc3RydWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgIG9sZFN0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKG5ld1N0cnVjdE1lbWJlckl0ICE9IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkgJiYgb2xkU3RydWN0TWVtYmVySXQgPT0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vTmV3IGZpZWxkIElEIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBlbmQuCisgICAgICAgICBpZigoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICAgICB7CisgICAgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiUmVxdWlyZWQgU3RydWN0IEZpZWxkIEFkZGVkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgc3RydWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIG5ld1N0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkgPT0gKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vRmllbGQgSUQgZm91bmQgaW4gYm90aCBzdHJ1Y3RzLiBDb21wYXJlIGZpZWxkIHR5cGVzLCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgIGNvbXBhcmVfc3RydWN0X2ZpZWxkKCpuZXdTdHJ1Y3RNZW1iZXJJdCwgKm9sZFN0cnVjdE1lbWJlckl0LCBzdHJ1Y3ROYW1lKTsKKworICAgICAgICAgbmV3U3RydWN0TWVtYmVySXQrKzsKKyAgICAgICAgIG9sZFN0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkgPCAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpKQorICAgICAgeworICAgICAgICAgLy9OZXcgRmllbGQgSWQgaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbgorICAgICAgICAgLy9BZGRpbmcgZmllbGRzIHRvIHN0cnVjdCBpcyBmaW5lLCBidXQgYWRkaW5nIHRoZW0gaW4gdGhlIG1pZGRsZSBpcyBzdXNwaWNpb3VzLiBFcnJvciEhCisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IGZpZWxkIGlzIGFkZGVkIGluIHRoZSBtaWRkbGUgd2l0aCBJZCA9ICVkIGluICVzXG4iLCAgKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgIHN0cnVjdE5hbWUuY19zdHIoKSk7CisgICAgICAgICBuZXdTdHJ1Y3RNZW1iZXJJdCsrOworICAgICAgfQorICAgICAgZWxzZSBpZigoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpID4gKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vQSBmaWVsZCBpcyBkZWxldGVkIGluIG5ld1N0cnVjdC4KKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgRmllbGQgcmVtb3ZlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsICAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCBzdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgICAgICAgb2xkU3RydWN0TWVtYmVySXQrKzsKKyAgICAgIH0KKworICAgfQorfQorCit2b2lkIGNvbXBhcmVfc3RydWN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBuZXdTdHJ1Y3RMaXN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBvbGRTdHJ1Y3RMaXN0KQoreworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsdF9zdHJ1Y3QqPiBuZXdTdHJ1Y3RNYXA7CisgICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBuZXdTdHJ1Y3RMaXN0SXQ7CisgICBmb3IobmV3U3RydWN0TGlzdEl0ID0gbmV3U3RydWN0TGlzdC5iZWdpbigpOyBuZXdTdHJ1Y3RMaXN0SXQgIT0gbmV3U3RydWN0TGlzdC5lbmQoKTsgbmV3U3RydWN0TGlzdEl0KyspCisgICB7CisgICAgICBuZXdTdHJ1Y3RNYXBbKCpuZXdTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpXSA9ICpuZXdTdHJ1Y3RMaXN0SXQ7CisgICB9CisKKyAgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIG9sZFN0cnVjdExpc3RJdDsKKyAgIGZvcihvbGRTdHJ1Y3RMaXN0SXQgPSBvbGRTdHJ1Y3RMaXN0LmJlZ2luKCk7IG9sZFN0cnVjdExpc3RJdCAhPSBvbGRTdHJ1Y3RMaXN0LmVuZCgpOyBvbGRTdHJ1Y3RMaXN0SXQrKykKKyAgIHsKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3N0cnVjdCo+OjppdGVyYXRvciBuZXdTdHJ1Y3RNYXBJdDsKKyAgICAgIG5ld1N0cnVjdE1hcEl0ID0gbmV3U3RydWN0TWFwLmZpbmQoKCpvbGRTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGlmKG5ld1N0cnVjdE1hcEl0ID09IG5ld1N0cnVjdE1hcC5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgJXMgbm90IGZvdW5kIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwgKCpvbGRTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgY29tcGFyZV9zaW5nbGVfc3RydWN0KG5ld1N0cnVjdE1hcEl0LT5zZWNvbmQsICpvbGRTdHJ1Y3RMaXN0SXQpOworICAgICAgfQorICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9zaW5nbGVfZnVuY3Rpb24odF9mdW5jdGlvbiogbmV3RnVuY3Rpb24sIHRfZnVuY3Rpb24qIG9sZEZ1bmN0aW9uKQoreworICAgdF90eXBlKiBuZXdGdW5jdGlvblJldHVyblR5cGUgPSBuZXdGdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKworICAgaWYobmV3RnVuY3Rpb24tPmlzX29uZXdheSgpICE9IG9sZEZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJPbmV3YXkgYXR0cmlidXRlIGNoYW5nZWQgZm9yIGZ1bmN0aW9uICVzXG4iLG9sZEZ1bmN0aW9uLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgfQorICAgaWYoIWNvbXBhcmVfdHlwZShuZXdGdW5jdGlvblJldHVyblR5cGUsIG9sZEZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJSZXR1cm4gdHlwZSBjaGFuZ2VkIGZvciBmdW5jdGlvbiAlc1xuIixvbGRGdW5jdGlvbi0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgIH0KKworICAgLy9Db21wYXJlIGZ1bmN0aW9uIGFyZ3VtZW50cy4KKyAgIGNvbXBhcmVfc2luZ2xlX3N0cnVjdChuZXdGdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgb2xkRnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICAgc3RkOjpzdHJpbmcgZXhjZXB0aW9uTmFtZSA9IG9sZEZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICAgZXhjZXB0aW9uTmFtZSArPSAiX2V4Y2VwdGlvbiI7CisgICBjb21wYXJlX3NpbmdsZV9zdHJ1Y3QobmV3RnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKSwgb2xkRnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKSwgZXhjZXB0aW9uTmFtZSk7Cit9CisKK3ZvaWQgY29tcGFyZV9mdW5jdGlvbnMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+JiBuZXdGdW5jdGlvbkxpc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiYgb2xkRnVuY3Rpb25MaXN0KQoreworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfZnVuY3Rpb24qPiBuZXdGdW5jdGlvbk1hcDsKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIG5ld0Z1bmN0aW9uTWFwSXQ7CisgICBmb3IoYXV0byBuZXdGdW5jdGlvbkl0IDogbmV3RnVuY3Rpb25MaXN0KQorICAgeworICAgICAgbmV3RnVuY3Rpb25NYXBbbmV3RnVuY3Rpb25JdC0+Z2V0X25hbWUoKV0gPSBuZXdGdW5jdGlvbkl0OworICAgfQorCisgICBmb3IoYXV0byBvbGRGdW5jdGlvbkl0IDogb2xkRnVuY3Rpb25MaXN0KQorICAgeworICAgICAgbmV3RnVuY3Rpb25NYXBJdCA9IG5ld0Z1bmN0aW9uTWFwLmZpbmQob2xkRnVuY3Rpb25JdC0+Z2V0X25hbWUoKSk7CisgICAgICBpZihuZXdGdW5jdGlvbk1hcEl0ID09IG5ld0Z1bmN0aW9uTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIk5ldyBUaHJpZnQgRmlsZSBoYXMgbWlzc2luZyBmdW5jdGlvbiAlc1xuIixvbGRGdW5jdGlvbkl0LT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvL0Z1bmN0aW9uIGlzIGZvdW5kIGluIGJvdGggdGhyaWZ0IGZpbGVzLiBDb21wYXJlIHJldHVybiB0eXBlIGFuZCBhcmd1bWVudCBsaXN0CisgICAgICAgICBjb21wYXJlX3NpbmdsZV9mdW5jdGlvbihuZXdGdW5jdGlvbk1hcEl0LT5zZWNvbmQsIG9sZEZ1bmN0aW9uSXQpOworICAgICAgfQorICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9zZXJ2aWNlcyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgbmV3U2VydmljZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBvbGRTZXJ2aWNlcykKK3sKKyAgIHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciBvbGRTZXJ2aWNlSXQ7CisKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3NlcnZpY2UqPiBuZXdTZXJ2aWNlTWFwOworICAgZm9yKGF1dG8gbmV3U2VydmljZSA6IG5ld1NlcnZpY2VzKQorICAgeworICAgICAgbmV3U2VydmljZU1hcFtuZXdTZXJ2aWNlLT5nZXRfbmFtZSgpXSA9IG5ld1NlcnZpY2U7CisgICB9CisKKworICAgZm9yKG9sZFNlcnZpY2VJdCA9IG9sZFNlcnZpY2VzLmJlZ2luKCk7IG9sZFNlcnZpY2VJdCAhPSBvbGRTZXJ2aWNlcy5lbmQoKTsgb2xkU2VydmljZUl0KyspCisgICB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBvbGRTZXJ2aWNlTmFtZSA9ICgqb2xkU2VydmljZUl0KS0+Z2V0X25hbWUoKTsKKyAgICAgIGF1dG8gbmV3U2VydmljZU1hcEl0ID0gbmV3U2VydmljZU1hcC5maW5kKG9sZFNlcnZpY2VOYW1lKTsKKworICAgICAgaWYobmV3U2VydmljZU1hcEl0ID09IG5ld1NlcnZpY2VNYXAuZW5kKCkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiTmV3IFRocmlmdCBmaWxlIGlzIG1pc3NpbmcgYSBzZXJ2aWNlICVzXG4iLCBvbGRTZXJ2aWNlTmFtZS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHRfc2VydmljZSogb2xkU2VydmljZUV4dGVuZHMgPSAoKm9sZFNlcnZpY2VJdCktPmdldF9leHRlbmRzKCk7CisgICAgICAgICB0X3NlcnZpY2UqIG5ld1NlcnZpY2VFeHRlbmRzID0gKG5ld1NlcnZpY2VNYXBJdC0+c2Vjb25kKS0+Z2V0X2V4dGVuZHMoKTsKKworICAgICAgICAgaWYob2xkU2VydmljZUV4dGVuZHMgPT0gbnVsbHB0cikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEl0IGlzIGZpbmUgdG8gYWRkIGV4dGVuZHMuIFNvIGlmIHNlcnZpY2UgaW4gb2xkZXIgdGhyaWZ0IGRpZCBub3QgaGF2ZSBhbnkgZXh0ZW5kcywgd2UgYXJlIGZpbmUuCisgICAgICAgICAgICAvLyBETyBOb3RoaW5nCisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmKG9sZFNlcnZpY2VFeHRlbmRzICE9IG51bGxwdHIgJiYgbmV3U2VydmljZUV4dGVuZHMgPT0gbnVsbHB0cikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJDaGFuZ2UgaW4gU2VydmljZSBpbmhlcml0YW5jZSBmb3IgJXNcbiIsIG9sZFNlcnZpY2VOYW1lLmNfc3RyKCkpOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2xkRXh0ZW5kc05hbWUgPSBvbGRTZXJ2aWNlRXh0ZW5kcy0+Z2V0X25hbWUoKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5ld0V4dGVuZHNOYW1lID0gbmV3U2VydmljZUV4dGVuZHMtPmdldF9uYW1lKCk7CisKKyAgICAgICAgICAgIGlmKCBuZXdFeHRlbmRzTmFtZSAhPSBvbGRFeHRlbmRzTmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJDaGFuZ2UgaW4gU2VydmljZSBpbmhlcml0YW5jZSBmb3IgJXNcbiIsIG9sZFNlcnZpY2VOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBjb21wYXJlX2Z1bmN0aW9ucygobmV3U2VydmljZU1hcEl0LT5zZWNvbmQpLT5nZXRfZnVuY3Rpb25zKCksICgqb2xkU2VydmljZUl0KS0+Z2V0X2Z1bmN0aW9ucygpKTsKKyAgICAgIH0KKworICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9jb25zdHMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBuZXdDb25zdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBvbGRDb25zdCkKK3sKKyAgIHN0ZDo6dmVjdG9yPHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3IgbmV3Q29uc3RJdDsKKyAgIHN0ZDo6dmVjdG9yPHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3Igb2xkQ29uc3RJdDsKKworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfY29uc3QqPiBuZXdDb25zdE1hcDsKKworICAgZm9yKG5ld0NvbnN0SXQgPSBuZXdDb25zdC5iZWdpbigpOyBuZXdDb25zdEl0ICE9IG5ld0NvbnN0LmVuZCgpOyBuZXdDb25zdEl0KyspCisgICB7CisgICAgICBuZXdDb25zdE1hcFsoKm5ld0NvbnN0SXQpLT5nZXRfbmFtZSgpXSA9ICpuZXdDb25zdEl0OworICAgfQorCisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBuZXdDb25zdE1hcEl0OworICAgZm9yKG9sZENvbnN0SXQgPSBvbGRDb25zdC5iZWdpbigpOyBvbGRDb25zdEl0ICE9IG9sZENvbnN0LmVuZCgpOyBvbGRDb25zdEl0KyspCisgICB7CisgICAgICBuZXdDb25zdE1hcEl0ID0gbmV3Q29uc3RNYXAuZmluZCgoKm9sZENvbnN0SXQpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGlmKG5ld0NvbnN0TWFwSXQgPT0gbmV3Q29uc3RNYXAuZW5kKCkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiQ29uc3RhbnRzIE1pc3NpbmcgJXMgXG4iLCAoKCpvbGRDb25zdEl0KS0+Z2V0X25hbWUoKSkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKCFjb21wYXJlX3R5cGUoKG5ld0NvbnN0TWFwSXQtPnNlY29uZCktPmdldF90eXBlKCksICgqb2xkQ29uc3RJdCktPmdldF90eXBlKCkpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkNvbnN0YW50ICVzIGlzIG9mIGRpZmZlcmVudCB0eXBlIFxuIiwgKCgqb2xkQ29uc3RJdCktPmdldF9uYW1lKCkpLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZSBpZighY29tcGFyZV9kZWZhdWx0cygobmV3Q29uc3RNYXBJdC0+c2Vjb25kKS0+Z2V0X3ZhbHVlKCksICgqb2xkQ29uc3RJdCktPmdldF92YWx1ZSgpKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJDb25zdGFudCAlcyBoYXMgZGlmZmVyZW50IHZhbHVlXG4iLCAoKCpvbGRDb25zdEl0KS0+Z2V0X25hbWUoKSkuY19zdHIoKSk7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3OWUzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIFRfQVVESVRfSAorI2RlZmluZSBUX0FVRElUX0gKKwordm9pZCBjb21wYXJlX25hbWVzcGFjZSh0X3Byb2dyYW0qIG5ld1Byb2dyYW0sIHRfcHJvZ3JhbSogb2xkUHJvZ3JhbSk7Cit2b2lkIGNvbXBhcmVfZW51bXMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG5ld0VudW1MaXN0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBvbGRFbnVtTGlzdCk7Citib29sIGNvbXBhcmVfZGVmYXVsdHModF9jb25zdF92YWx1ZSogbmV3U3RydWN0RGVmYXVsdCwgdF9jb25zdF92YWx1ZSogb2xkU3RydWN0RGVmYXVsdCk7Cit2b2lkIGNvbXBhcmVfc3RydWN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBuZXdTdHJ1Y3RMaXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgb2xkU3RydWN0TGlzdCk7Cit2b2lkIGNvbXBhcmVfc2VydmljZXMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIG5ld1NlcnZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBvbGRTZXJ2aWNlcyk7Cit2b2lkIGNvbXBhcmVfY29uc3RzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgbmV3Q29uc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgb2xkQ29uc3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjE4MzJkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmNjCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCIKKwordF90eXBlKiBnX3R5cGVfdm9pZDsKK3RfdHlwZSogZ190eXBlX3N0cmluZzsKK3RfdHlwZSogZ190eXBlX2JpbmFyeTsKK3RfdHlwZSogZ190eXBlX3NsaXN0OwordF90eXBlKiBnX3R5cGVfYm9vbDsKK3RfdHlwZSogZ190eXBlX2k4OwordF90eXBlKiBnX3R5cGVfaTE2OwordF90eXBlKiBnX3R5cGVfaTMyOwordF90eXBlKiBnX3R5cGVfaTY0OwordF90eXBlKiBnX3R5cGVfZG91YmxlOworCit2b2lkIGluaXRHbG9iYWxzKCkgeworICBnX3R5cGVfdm9pZCA9IG5ldyB0X2Jhc2VfdHlwZSgidm9pZCIsIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQpOworICBnX3R5cGVfc3RyaW5nID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOworICBnX3R5cGVfYmluYXJ5ID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOworICAoKHRfYmFzZV90eXBlKilnX3R5cGVfYmluYXJ5KS0+c2V0X2JpbmFyeSh0cnVlKTsKKyAgZ190eXBlX3NsaXN0ID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOworICAoKHRfYmFzZV90eXBlKilnX3R5cGVfc2xpc3QpLT5zZXRfc3RyaW5nX2xpc3QodHJ1ZSk7CisgIGdfdHlwZV9ib29sID0gbmV3IHRfYmFzZV90eXBlKCJib29sIiwgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCk7CisgIGdfdHlwZV9pOCA9IG5ldyB0X2Jhc2VfdHlwZSgiaTgiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JOCk7CisgIGdfdHlwZV9pMTYgPSBuZXcgdF9iYXNlX3R5cGUoImkxNiIsIHRfYmFzZV90eXBlOjpUWVBFX0kxNik7CisgIGdfdHlwZV9pMzIgPSBuZXcgdF9iYXNlX3R5cGUoImkzMiIsIHRfYmFzZV90eXBlOjpUWVBFX0kzMik7CisgIGdfdHlwZV9pNjQgPSBuZXcgdF9iYXNlX3R5cGUoImk2NCIsIHRfYmFzZV90eXBlOjpUWVBFX0k2NCk7CisgIGdfdHlwZV9kb3VibGUgPSBuZXcgdF9iYXNlX3R5cGUoImRvdWJsZSIsIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSk7Cit9CisKK3ZvaWQgY2xlYXJHbG9iYWxzKCkgeworICBkZWxldGUgZ190eXBlX3ZvaWQ7CisgIGRlbGV0ZSBnX3R5cGVfc3RyaW5nOworICBkZWxldGUgZ190eXBlX2Jvb2w7CisgIGRlbGV0ZSBnX3R5cGVfaTg7CisgIGRlbGV0ZSBnX3R5cGVfaTE2OworICBkZWxldGUgZ190eXBlX2kzMjsKKyAgZGVsZXRlIGdfdHlwZV9pNjQ7CisgIGRlbGV0ZSBnX3R5cGVfZG91YmxlOworfQorCisvKioKKyAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgorICovCitpbnQgZ19kb2N0ZXh0X2xpbmVubzsKK2ludCBnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPSAwOworUFJPR0RPQ1RFWFRfU1RBVFVTIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IElOVkFMSUQ7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9jb21tb24uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDg4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9jb21tb24uaApAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9DT01NT05fSAorI2RlZmluZSBUX0NPTU1PTl9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKKy8qKgorICogR2xvYmFsIHR5cGVzIGZvciB0aGUgcGFyc2VyIHRvIGJlIGFibGUgdG8gcmVmZXJlbmNlCisgKi8KKworZXh0ZXJuIHRfdHlwZSogZ190eXBlX3ZvaWQ7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfc3RyaW5nOworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2JpbmFyeTsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9zbGlzdDsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9ib29sOworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2k4OworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2kxNjsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9pMzI7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfaTY0OworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2RvdWJsZTsKKwordm9pZCBpbml0R2xvYmFscygpOwordm9pZCBjbGVhckdsb2JhbHMoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0ZDE2NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI1OTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEFTMyBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfYXMzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2FzM19nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgYmluZGFibGVfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYmluZGFibGUiKSA9PSAwKSB7CisgICAgICAgIGJpbmRhYmxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gYXMzOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1hczMiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpIG92ZXJyaWRlOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIG92ZXJyaWRlOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSBvdmVycmlkZTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgLy8gcmVtb3ZlZCAtLSBlcXVhbGl0eSxjb21wYXJlX3RvCisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9hczNfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICAvLyByZW1vdmVkIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2FzM19kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKworICB2b2lkIGdlbmVyYXRlX2FzM19kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBhczNfcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyBhczNfdHlwZV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcmIGltcG9ydHMpOworICBzdGQ6OnN0cmluZyBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwgYm9vbCBpbl9pbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSBvdmVycmlkZTsKKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworCitwcml2YXRlOgorICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOworCisgIGJvb2wgYmluZGFibGVfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKworICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKGRpci5zaXplKCkgPiAwKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgfQorCisgIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKK30KKworLyoqCisgKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfcGFja2FnZSgpIHsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICIgIjsKKyAgfQorICByZXR1cm4gInBhY2thZ2UgIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgYXMzIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgQXMzIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdHlwZV9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlNldDtcbiIgKyAiaW1wb3J0IGZsYXNoLnV0aWxzLkJ5dGVBcnJheTtcbiIKKyAgICAgICAgICsgImltcG9ydCBmbGFzaC51dGlscy5EaWN0aW9uYXJ5O1xuXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBhczMgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0CisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfaW1wb3J0cygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iCisgICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjtcblxuIjsKK30KKworLyoqCisgKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQorICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3N0cnVjdAorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcmIGltcG9ydHMpIHsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8vIEZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcm5ldCBuYW1lc3BhY2UKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisgICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgeworICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgeworICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgKyAiO1xuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGltcG9ydHM7Cit9CisKKy8qKgorICogUHJpbnRzIGltcG9ydHMgbmVlZGVkIGZvciBhIGdpdmVuIHR5cGUKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGEgZ2l2ZW4gdF9zZXJ2aWNlCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgaW1wb3J0czsKKyAgY29uc3QgdmVjdG9yPHRfZnVuY3Rpb24qPiYgZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcm5ldCBuYW1lc3BhY2UKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOworICAgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKGltcG9ydHMuZmluZChwYWNrYWdlICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpKSA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBpbXBvcnRzLmFwcGVuZCgiaW1wb3J0ICIgKyBwYWNrYWdlICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAiO1xuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwgaW1wb3J0cyk7CisgICAgYXMzX3RocmlmdF9nZW5faW1wb3J0cygoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSwgaW1wb3J0cyk7CisgIH0KKworICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBOb3RoaW5nIGluIEFzMworICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gQXMzLCBzaW5jZSBpdCBkb2VzCisgKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKKyAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmFzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CisgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lKTsKKworICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0CisgIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKyAgLy8gQWRkIGFzMyBpbXBvcnRzCisgIGZfZW51bSA8PCBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2V0OyIgPDwgZW5kbCA8PCAiaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7IgorICAgICAgICAgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiAiOworICBzY29wZV91cChmX2VudW0pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6aW50ID0gIiA8PCB2YWx1ZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc3RhdGljIFNldCB3aXRoIGFsbCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQorICBmX2VudW0gPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBjb25zdCBWQUxJRF9WQUxVRVM6U2V0ID0gbmV3IFNldCgiOworICBpbmRlbnRfdXAoKTsKKyAgYm9vbCBmaXJzdFZhbHVlID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAvLyBwb3B1bGF0ZSBzZXQKKyAgICBmX2VudW0gPDwgKGZpcnN0VmFsdWUgPyAiIiA6ICIsICIpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmaXJzdFZhbHVlID0gZmFsc2U7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9lbnVtIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBjb25zdCBWQUxVRVNfVE9fTkFNRVM6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOworCisgIHNjb3BlX3VwKGZfZW51bSk7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW5kZW50KGZfZW51bSkgPDwgIlZBTFVFU19UT19OQU1FU1siIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXSA9IFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOworICB9CisgIGZfZW51bSA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsKKworICBzY29wZV9kb3duKGZfZW51bSk7IC8vIGVuZCBjbGFzcworCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIHBhY2thZ2UKKworICBmX2VudW0uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIkNvbnN0YW50cy5hcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7CisKKyAgc2NvcGVfdXAoZl9jb25zdHMpOworICBmX2NvbnN0cyA8PCBlbmRsOworCisgIGZfY29uc3RzIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKKworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgeyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfY29uc3RzKSA8PCAifSIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX2NvbnN0cyk7CisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaW5kZW50KG91dCk7CisgIGlmICghZGVmdmFsKSB7CisgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAidmFyICIgOiAicHVibGljIHN0YXRpYyBjb25zdCAiKTsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvdXQgPDwgbmFtZSA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiCisgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCk6dm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7CisgICAgICBvdXQgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCk6dm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCAodHlwZS0+aXNfbGlzdCgpID8gInB1c2giIDogImFkZCIpIDw8ICIoIiA8PCB2YWwgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKKyAqIHdpdGggZGF0YSBtZW1iZXJzLCByZWFkKCksIHdyaXRlKCksIGFuZCBhbiBpbm5lciBJc3NldCBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9hczNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2FzM19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBBczMgc3RydWN0IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5hcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOworCisgIHNjb3BlX3VwKGZfc3RydWN0KTsKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBzdHJpbmcgaW1wb3J0czsKKworICBmX3N0cnVjdCA8PCBhczNfdHlwZV9pbXBvcnRzKCkgPDwgYXMzX3RocmlmdF9pbXBvcnRzKCkgPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c3RydWN0LCBpbXBvcnRzKQorICAgICAgICAgICA8PCBlbmRsOworCisgIGlmIChiaW5kYWJsZV8gJiYgIWlzX2V4Y2VwdGlvbikgeworICAgIGZfc3RydWN0IDw8ICJpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50OyIgPDwgZW5kbCA8PCAiaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudERpc3BhdGNoZXI7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgImltcG9ydCBteC5ldmVudHMuUHJvcGVydHlDaGFuZ2VFdmVudDsiIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisKKyAgc2NvcGVfZG93bihmX3N0cnVjdCk7IC8vIGVuZCBvZiBwYWNrYWdlCisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKKy8qKgorICogQXMzIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCisgKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKKyAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/CisgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIHRzdHJ1Y3QpOworCisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKyAgYm9vbCBiaW5kYWJsZSA9ICFpc19leGNlcHRpb24gJiYgIWluX2NsYXNzICYmIGJpbmRhYmxlXzsKKworICBpbmRlbnQob3V0KSA8PCAoaW5fY2xhc3MgPyAiIiA6ICJwdWJsaWMgIikgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiZXh0ZW5kcyBFcnJvciAiOworICB9IGVsc2UgaWYgKGJpbmRhYmxlKSB7CisgICAgb3V0IDw8ICJleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciAiOworICB9CisgIG91dCA8PCAiaW1wbGVtZW50cyBUQmFzZSAiOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGNvbnN0IFNUUlVDVF9ERVNDOlRTdHJ1Y3QgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiXCIpOyIgPDwgZW5kbDsKKworICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1hczMsIHByaXZhdGUgZm9yIC1hczNiZWFuCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjb25zdCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQzpURmllbGQgPSBuZXcgVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBjb25zdCAiIDw8IHVwY2FzZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICI6aW50ID0gIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIElubmVyIElzc2V0IGNsYXNzCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2YXIgX19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOkJvb2xlYW4gPSBmYWxzZTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAob3V0LCB0c3RydWN0KTsKKworICAvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgdG8gcG9wdWxhdGUgZ2xvYmFsIGNsYXNzIHRvIHN0cnVjdCBtZXRhZGF0YSBtYXAKKyAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCBtZXRhRGF0YU1hcCk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF92YWx1ZSgpLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCwgYmluZGFibGUpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGlmIChpc19yZXN1bHQpIHsKKyAgICBnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0LCBiaW5kYWJsZSk7CisgIGdlbmVyYXRlX2FzM192YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZDpURmllbGQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuaWQpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGluIG5vbi1iZWFucyBzdHlsZSwgY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZQorICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghX19pc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIGdlbmVyYXRlcyBhczMgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKKy8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM192YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKCk6dm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZSBhbmQgeW91IGNob3NlIHRoZSBub24tYmVhbnMgZ2VuZXJhdG9yLiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIgJiYgISIgPDwgZ2V0X2VudW1fY2xhc3NfbmFtZSh0eXBlKQorICAgICAgICAgICAgICAgICAgPDwgIi5WQUxJRF9WQUxVRVMuY29udGFpbnMoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSl7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yLlVOS05PV04sIFwiVGhlIGZpZWxkICciCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiJyBoYXMgYmVlbiBhc3NpZ25lZCB0aGUgaW52YWxpZCB2YWx1ZSBcIiArICIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKKyAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgorICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KKyAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiBlbHNlIGlmICI7CisgICAgfQorCisgICAgb3V0IDw8ICIodGhpcy4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgICh2b2lkKXR5cGU7CisgICh2b2lkKWNhcF9uYW1lOworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgICh2b2lkKXR5cGU7CisgICh2b2lkKWNhcF9uYW1lOworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKKworICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgc2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0RmllbGRWYWx1ZShmaWVsZElEOmludCwgdmFsdWU6Kik6dm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOworCisgIG91dCA8PCBzZXR0ZXJfc3RyZWFtLnN0cigpOworCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGdldHRlcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUoZmllbGRJRDppbnQpOiogeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKworICBvdXQgPDwgZ2V0dGVyX3N0cmVhbS5zdHIoKTsKKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gQ3JlYXRlcyBhIGdlbmVyaWMgaXNTZXQgbWV0aG9kIHRoYXQgdGFrZXMgdGhlIGZpZWxkIG51bWJlciBhcyBhcmd1bWVudAordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKKyAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhICIKKyAgICAgICAgICAgICAgICAgInZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzU2V0KGZpZWxkSUQ6aW50KTpCb29sZWFuIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNldCBvZiBBczMgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCisgKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJpbmRhYmxlKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgLy8gU2ltcGxlIGdldHRlcgorICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCBmaWVsZCk7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIoKToiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCBmaWVsZCk7CisgICAgc3RkOjpzdHJpbmcgcHJvcE5hbWUgPSB0bXAoInRocmlmdFByb3BlcnR5Q2hhbmdlIik7CisgICAgaWYgKGJpbmRhYmxlKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiW0JpbmRhYmxlKGV2ZW50PVwiIiA8PCBwcm9wTmFtZSA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIoIiA8PCBmaWVsZF9uYW1lIDw8ICI6IgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKKworICAgIGlmIChiaW5kYWJsZSkgeworICAgICAgLy8gV2UgaGF2ZSB0byB1c2UgYSBjdXN0b20gZXZlbnQgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQsIGJlY2F1c2UgaWYgeW91IHVzZSB0aGUgZGVmYXVsdCwKKyAgICAgIC8vIHRoZSBzZXR0ZXIgb25seSBnZXRzIGNhbGxlZCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgLSB0aGlzIG1lYW5zIGNhbGxpbmcKKyAgICAgIC8vIGZvby5zZXRJbnRWYWx1ZSgwKQorICAgICAgLy8gd2lsbCBub3QgY2F1c2UgZm9vLmlzSW50VmFsdWVTZXQoKSB0byByZXR1cm4gdHJ1ZSBzaW5jZSB0aGUgdmFsdWUgb2YgZm9vLl9pbnRWYWx1ZSB3YXNuJ3QKKyAgICAgIC8vIGNoYW5nZWQKKyAgICAgIC8vIHNvIHRoZSBzZXR0ZXIgd2FzIG5ldmVyIGNhbGxlZC4KKyAgICAgIGluZGVudChvdXQpIDw8ICJkaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcIiIgPDwgcHJvcE5hbWUgPDwgIlwiKSk7IiA8PCBlbmRsOworCisgICAgICAvLyBIb3dldmVyLCBpZiB5b3UganVzdCB1c2UgYSBjdXN0b20gZXZlbnQsIHRoZW4gY29sbGVjdGlvbnMgd29uJ3QgYmUgYWJsZSB0byBkZXRlY3Qgd2hlbgorICAgICAgLy8gZWxlbWVudHMKKyAgICAgIC8vIGluIHRoZSBjb2xsZWN0aW9ucyBoYXZlIGNoYW5nZWQgc2luY2UgdGhleSBsaXN0ZWQgZm9yIFByb3BlcnR5Q2hhbmdlRXZlbnRzLiAgU28sIHdlCisgICAgICAvLyBkaXNwYXRjaCBib3RoLgorICAgICAgaW5kZW50KG91dCkgPDwgImRpc3BhdGNoRXZlbnQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudC5QUk9QRVJUWV9DSEFOR0UpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBVbnNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIGlzU2V0IG1ldGhvZAorICAgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCk6Qm9vbGVhbiB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmluZGFibGUpIHsKKyAgLy8gSWYgaXQncyBiaW5kYWJsZSwgaXQgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgc28gdG9TdHJpbmcgaXMgYW4gb3ZlcnJpZGUuCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgKGJpbmRhYmxlID8gIm92ZXJyaWRlICIgOiAiIikgPDwgImZ1bmN0aW9uIHRvU3RyaW5nKCk6U3RyaW5nIHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciByZXQ6U3RyaW5nID0gbmV3IFN0cmluZyhcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpcnN0OkJvb2xlYW4gPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworCisgICAgaWYgKCFmaXJzdCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHJldCArPSAgXCIsIFwiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInJldCArPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCI7IiA8PCBlbmRsOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJudWxsXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiQklOQVJZXCI7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiX25hbWU6U3RyaW5nID0gIiA8PCBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIi5WQUxVRVNfVE9fTkFNRVNbdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWU7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiIChcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiKVwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0ICs9IFwiKVwiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJldDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdGF0aWMgbWFwIHdpdGggbWV0YSBkYXRhIHRvIHN0b3JlIGluZm9ybWF0aW9uIHN1Y2ggYXMgZmllbGRJRCB0bworICogZmllbGROYW1lIG1hcHBpbmcKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19tZXRhX2RhdGFfbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIFN0YXRpYyBNYXAgd2l0aCBmaWVsZElEIC0+IEZpZWxkTWV0YURhdGEgbWFwcGluZ3MKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgbWV0YURhdGFNYXA6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIC8vIFBvcHVsYXRlIG1hcAorICAgIHNjb3BlX3VwKG91dCk7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRhRGF0YU1hcFsiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIl0gPSBuZXcgRmllbGRNZXRhRGF0YShcIiIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUgPDwgIlwiLCAiOworCisgICAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQorICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgIjsKKyAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKKyAgICAgIH0KKworICAgICAgLy8gQ3JlYXRlIHZhbHVlIG1ldGEgZGF0YQorICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOworICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBhczMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCisgKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCisgKi8KK3N0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdldF9hczNfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlRUeXBlLlZPSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2FzM19nZW5lcmF0b3I6OmdldF9hczNfdHlwZV9zdHJpbmchIik7CisgICAgICBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoCisgICAgICAgICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICB9Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgeworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudF91cCgpOworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTGlzdE1ldGFEYXRhKFRUeXBlLkxJU1QsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IFNldE1ldGFEYXRhKFRUeXBlLlNFVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSB7IC8vIG1hcAorICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7CisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKKyAgICAgIG91dCA8PCAiLCAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9hczNfdHlwZV9zdHJpbmcodHlwZSk7CisgIH0KKyAgb3V0IDw8ICIpIjsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQorICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCisgKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCisgKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBpbnRlcmZhY2UgZmlsZQorICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5hcyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7CisKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGFzM190eXBlX2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKQorICAgICAgICAgICAgIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgdF90eXBlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBzdHJpbmcgcGFyZW50X25hbWVzcGFjZSA9IHBhcmVudC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisgICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8uY2xvc2UoKTsKKworICAvLyBOb3cgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24vY2xpZW50IGZpbGUKKyAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIkltcGwuYXMiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOworCisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBhczNfdHlwZV9pbXBvcnRzKCkgPDwgYXMzX3RocmlmdF9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHRfdHlwZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgc3RyaW5nIHBhcmVudF9uYW1lc3BhY2UgPSBwYXJlbnQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImFzMyIpOworICAgIGlmICghcGFyZW50X25hbWVzcGFjZS5lbXB0eSgpICYmIHBhcmVudF9uYW1lc3BhY2UgIT0gcGFja2FnZV9uYW1lXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgdHlwZV9uYW1lKHBhcmVudCkgPDwgIkltcGw7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdHlwZV9pbXBvcnRzKCk7CisgIGZfc2VydmljZV8gPDwgYXMzX3RocmlmdF9pbXBvcnRzKCk7CisgIGZfc2VydmljZV8gPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7CisgIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisKKyAgLy8gTm93IG1ha2UgdGhlIHByb2Nlc3Nvci9zZXJ2ZXIgZmlsZQorICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yLmFzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKKworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgYXMzX3R5cGVfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdHlwZV9pbXBvcnRzKCk7CisgIGZfc2VydmljZV8gPDwgYXMzX3RocmlmdF9pbXBvcnRzKCk7CisgIGZfc2VydmljZV8gPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSkgPDwgZW5kbDsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuKjsiIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICB9CisKKyAgZ2VuZXJhdGVfYXMzX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2FzM19kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCk6dm9pZDsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik6dm9pZDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSBhcmdzIGFuZCByZXR1cm4gdHlwZXMKKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiSW1wbCI7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkltcGwiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJbXBsIgorICAgICAgICAgICAgICAgICAgICAgPDwgIihpcHJvdDpUUHJvdG9jb2wsIG9wcm90OlRQcm90b2NvbD1udWxsKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG9wcm90ID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gaXByb3Q7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgdmFyIGlwcm90XzpUUHJvdG9jb2w7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIHZhciBvcHJvdF86VFByb3RvY29sOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIHZhciBzZXFpZF86aW50OyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0SW5wdXRQcm90b2NvbCgpOlRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0aGlzLmlwcm90XzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXRQcm90b2NvbCgpOlRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0aGlzLm9wcm90XzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlLkNBTEwiKQorICAgICAgICAgICAgICAgPDwgIiwgc2VxaWRfKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJnczoiIDw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICAgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goZnVuY3Rpb24oZXJyb3I6RXJyb3IpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGVycm9yICE9IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihlcnJvcik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybjsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInZhciBtc2c6VE1lc3NhZ2UgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgdmFyIHg6VEFwcGxpY2F0aW9uRXJyb3IgPSBUQXBwbGljYXRpb25FcnJvci5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0IDoiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiCisgICAgICAgICAgICAgICAgIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnJlYWQoaXByb3RfKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcyhyZXN1bHQuc3VjY2Vzcyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yLk1JU1NJTkdfUkVTVUxULCBcIiIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoZTpURXJyb3IpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEV4dGVuZHMgc3R1ZmYKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yKGlmYWNlOiIgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgPDwgIikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiUFJPQ0VTU19NQVBbXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiXSA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSB2YXIgaWZhY2VfOiIgPDwgc2VydmljZV9uYW1lXyA8PCAiOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGNvbnN0IFBST0NFU1NfTUFQOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIHN0cmluZyBvdmVycmlkZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIG92ZXJyaWRlID0gIm92ZXJyaWRlICI7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICA8PCAicHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2wpOkJvb2xlYW4iIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBtc2c6VE1lc3NhZ2UgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZSwgd2FzIHRoZSBzZXFpZCBldGMuIGxlZ2l0PworICAvLyBBUy0gSWYgYWxsIG1ldGhvZCBpcyBvbmV3YXk6CisgIC8vIGRvIHlvdSBoYXZlIGFuIG9wcm90PworICAvLyBkbyB5b3UgeW91IG5lZWQgbnVsbGNoZWNrPworICBmX3NlcnZpY2VfCisgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIGZuOkZ1bmN0aW9uID0gUFJPQ0VTU19NQVBbbXNnLm5hbWVdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlmIChmbiA9PSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICB2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IG5ldyBUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5VTktOT1dOX01FVEhPRCwgIgorICAgICAgICAgIlwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4uY2FsbCh0aGlzLG1zZy5zZXFpZCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBjbGFzcworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgZnVuY3Rpb24gIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigpOkZ1bmN0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZnVuY3Rpb24oc2VxaWQ6aW50LCBpcHJvdDpUUHJvdG9jb2wsIG9wcm90OlRQcm90b2NvbCk6dm9pZCIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3M6IiA8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQ6IiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgImlmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiLy8gc29ycnkgdGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCB5ZXQiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IEVycm9yKFwiVGhpcyBpcyBub3QgeWV0IHN1cHBvcnRlZFwiKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCisgICAgICAmJiAhdHlwZV9jYW5fYmVfbnVsbCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiCisgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIn0iOworICAgICAgfQorICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKHRoOkVycm9yKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyYWNlKFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCB0aCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAidmFyIHg6VEFwcGxpY2F0aW9uRXJyb3IgPSBuZXcgIgorICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yLklOVEVSTkFMX0VSUk9SLCBcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIgorICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgLy8gQ2xvc2UgY2xhc3MKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBDbG9zZSBjbGFzcworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZworICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBvYmo7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIjpUTWFwID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIjpUU2V0ID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICI6VExpc3QgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAvLyBzaXplIHRoZSBjb2xsZWN0aW9uIGNvcnJlY3RseQorICAgICAgICAgICAgICA8PCAiKCIKKyAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGkgPDwgIjppbnQgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgICAgICAgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBBczMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgorICogQHBhcmFtIHByZWZpeCBTdHJpbmcgcHJlZml4IGZvciBmaWVsZHMKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfa2V5Iik7CisgICAgc3RyaW5nIGNvdW50ZXIgPSB0bXAoIl9zaXplQ291bnRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBjb3VudGVyIDw8ICI6aW50ID0gMDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IGNvdW50ZXIgPDwgKyIrKzsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgY291bnRlciA8PCAiKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5zaXplKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLmxlbmd0aCkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoImVsZW0iKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGVhY2ggKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIudG9BcnJheSgpKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgZWFjaCAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBBczMgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KKyAqIEByZXR1cm4gQXMzIHR5cGUgbmFtZSwgaS5lLiBIYXNoTWFwPEtleSxWYWx1ZT4KKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQpIHsKKyAgKHZvaWQpaW5faW5pdDsKKyAgLy8gSW4gQXMzIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQorICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHJlZml4OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpbnQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiRGljdGlvbmFyeSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJTZXQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIkFycmF5IjsKKyAgfQorCisgIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKyAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHBhY2thZ2UgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgQVMzIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqIEBwYXJhbSBjb250YWluZXIgSXMgaXQgZ29pbmcgaW4gYSBBczMgY29udGFpbmVyPworICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSwgYm9vbCBpbl9jb250YWluZXIpIHsKKyAgKHZvaWQpaW5fY29udGFpbmVyOworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiQnl0ZUFycmF5IjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJTdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiQm9vbGVhbiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImludCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHRocm93ICJpNjQgaXMgbm90IHlldCBzdXBwb3J0ZWQgaW4gYXMzIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJOdW1iZXIiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQXMzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgeworICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KKyAgc3RyaW5nIHJlc3VsdCA9ICJ2YXIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHN0ZDo6b2ZzdHJlYW0gZHVtbXk7CisgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICA7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaWYgKGFyZ3VtZW50cyAhPSAiIikgeworICAgICAgYXJndW1lbnRzICs9ICIsICI7CisgICAgfQorICAgIGFyZ3VtZW50cyArPSAib25FcnJvcjpGdW5jdGlvbiwgb25TdWNjZXNzOkZ1bmN0aW9uIjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIik6dm9pZCI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXworICovCitzdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOworICByZXR1cm4gbmFtZTsKK30KKworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOworICBmb3IgKGNoYXIgY2hhcmFjdGVyIDogbmFtZSkgeworICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgeworICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7CisgICAgfQorICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOworCisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOworICB9CisKKyAgcmV0dXJuIGNvbnN0YW50X25hbWU7Cit9CisKKy8qKgorICogRW1pdHMgYSBBczNEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgdGRvYy0+Z2V0X2RvYygpLCAiICovXG4iKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgQXMzRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgeworICAgIHN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9CisgICAgfQorICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHNzLnN0cigpLCAiICovXG4iKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKSB7CisgIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZC0+Z2V0X25hbWUoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcGFja2FnZSA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIikgKyAiLiI7CisgIH0KKyAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGFzMywKKyAgICAiQVMzIiwKKyAgICAiICAgIGJpbmRhYmxlOiAgICAgICAgQWRkIFtiaW5kYWJsZV0gbWV0YWRhdGEgdG8gYWxsIHRoZSBzdHJ1Y3QgY2xhc3Nlcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1MzFjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDQ1ODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpOworc3RyaW5nIHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhzdHJpbmcgbmFtZSk7CitzdHJpbmcgdG9fdXBwZXJfY2FzZShzdHJpbmcgbmFtZSk7CitzdHJpbmcgdG9fbG93ZXJfY2FzZShzdHJpbmcgbmFtZSk7CisKKy8qKgorICogQyBjb2RlIGdlbmVyYXRvciwgdXNpbmcgZ2xpYiBmb3IgQyB0eXBpbmcuCisgKi8KK2NsYXNzIHRfY19nbGliX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICAvKiBjb25zdHJ1Y3RvciAqLworICB0X2NfZ2xpYl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIHNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSAqLworICAgIHRoaXMtPm91dF9kaXJfYmFzZV8gPSAiZ2VuLWNfZ2xpYiI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGNfZ2xpYjoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgLyogc2V0IHRoZSBuYW1lc3BhY2UgKi8KKyAgICB0aGlzLT5uc3BhY2UgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY19nbGliIik7CisKKyAgICBpZiAodGhpcy0+bnNwYWNlLmVtcHR5KCkpIHsKKyAgICAgIHRoaXMtPm5zcGFjZSA9ICIiOworICAgICAgdGhpcy0+bnNwYWNlX3UgPSAiIjsKKyAgICAgIHRoaXMtPm5zcGFjZV91YyA9ICIiOworICAgICAgdGhpcy0+bnNwYWNlX2xjID0gIiI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHJlcGxhY2UgZG90cyB3aXRoIHVuZGVyc2NvcmVzICovCisgICAgICBjaGFyKiB0bXAgPSBzdHJkdXAodGhpcy0+bnNwYWNlLmNfc3RyKCkpOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzdHJsZW4odG1wKTsgaSsrKSB7CisgICAgICAgIGlmICh0bXBbaV0gPT0gJy4nKSB7CisgICAgICAgICAgdG1wW2ldID0gJ18nOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aGlzLT5uc3BhY2UgPSBzdHJpbmcodG1wLCBzdHJsZW4odG1wKSk7CisgICAgICBmcmVlKHRtcCk7CisKKyAgICAgIC8qIGNsZWFuIHVwIHRoZSBuYW1lc3BhY2UgZm9yIEMuCisgICAgICAgKiBBbiBpbnB1dCBvZiAnbmFtZXNwYWNlIGZvbycgc2hvdWxkIHJlc3VsdCBpbjoKKyAgICAgICAqICAtIG5zcGFjZSA9IGZvbyAgICAgICAtIGZvciB0aHJpZnQgb2JqZWN0cyBhbmQgdHlwZWRlZnMKKyAgICAgICAqICAtIG5zcGFjZV91ID0gRm9vICAgICAtIGZvciBpbnRlcm5hbCBHT2JqZWN0IHByZWZpeGVzCisgICAgICAgKiAgLSBuc3BhY2VfdWMgPSBGT09fICAgLSBmb3IgbWFjcm8gcHJlZml4ZXMKKyAgICAgICAqICAtIG5zcGFjZV9sYyA9IGZvb18gICAtIGZvciBmaWxlbmFtZSBhbmQgbWV0aG9kIHByZWZpeGVzCisgICAgICAgKiBUaGUgdW5kZXJzY29yZXMgYXJlIHRoZXJlIHNpbmNlIHVjIGFuZCBsYyBzdHJpbmdzIGFyZSB1c2VkIGFzIGZpbGUgYW5kCisgICAgICAgKiB2YXJpYWJsZSBwcmVmaXhlcy4KKyAgICAgICAqLworICAgICAgdGhpcy0+bnNwYWNlX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModGhpcy0+bnNwYWNlKTsKKyAgICAgIHRoaXMtPm5zcGFjZV91YyA9IHRvX3VwcGVyX2Nhc2UodGhpcy0+bnNwYWNlX3UpICsgIl8iOworICAgICAgdGhpcy0+bnNwYWNlX2xjID0gdG9fbG93ZXJfY2FzZSh0aGlzLT5uc3BhY2VfdSkgKyAiXyI7CisgICAgfQorICB9CisKKyAgLyogaW5pdGlhbGl6YXRpb24gYW5kIGRlc3RydWN0aW9uICovCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICAvKiBnZW5lcmF0aW9uIGZ1bmN0aW9ucyAqLworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIC8qIGZpbGUgc3RyZWFtcyAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfaW1wbF87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWFkZXJfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgLyogbmFtZXNwYWNlIHZhcmlhYmxlcyAqLworICBzdHJpbmcgbnNwYWNlOworICBzdHJpbmcgbnNwYWNlX3U7CisgIHN0cmluZyBuc3BhY2VfdWM7CisgIHN0cmluZyBuc3BhY2VfbGM7CisKKyAgLyogaGVscGVyIGZ1bmN0aW9ucyAqLworICBib29sIGlzX2NvbXBsZXhfdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgYm9vbCBpc19udW1lcmljKHRfdHlwZSogdHR5cGUpOworICBzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiA9IGZhbHNlLCBib29sIGlzX2NvbnN0ID0gZmFsc2UpOworICBzdHJpbmcgcHJvcGVydHlfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiA9IGZhbHNlLCBib29sIGlzX2NvbnN0ID0gZmFsc2UpOworICBzdHJpbmcgYmFzZV90eXBlX25hbWUodF90eXBlKiB0eXBlKTsKKyAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpOworICBzdHJpbmcgY29uc3RhbnRfbGl0ZXJhbCh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgc3RyaW5nIGNvbnN0YW50X3ZhbHVlKHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgc3RyaW5nIGNvbnN0YW50X3ZhbHVlX3dpdGhfc3RvcmFnZShzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdHJpbmcgeGNlcHRpb25fbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVmZXJlbmNlID0gZmFsc2UpOworICB2b2lkIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcmIGJhc2VfbmFtZSwgYm9vbCBmb3JfaGFzaF90YWJsZSk7CisgIHZvaWQgZGVjbG9yZV9sb2NhbF92YXJpYWJsZV9mb3Jfd3JpdGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcmIGJhc2VfbmFtZSk7CisKKyAgLyogZ2VuZXJhdGlvbiBmdW5jdGlvbnMgKi8KKyAgdm9pZCBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0b3BfbGV2ZWwgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGFuZGxlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9vYmplY3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Z1bmN0aW9uID0gdHJ1ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24gPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBlbGVtZW50LCBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlID0gdHJ1ZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb2NhdGUgPSB0cnVlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpOworCisgIHN0cmluZyBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUodF90eXBlKiBrZXksIHRfdHlwZSogdmFsdWUpOworICBzdHJpbmcgZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKKworICBzdHJpbmcgZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RyaW5nIGdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHN0cmluZyBnZW5lcmF0ZV9jbXBfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSk7Cit9OworCisvKioKKyAqIFByZXBhcmUgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZQorICogb3V0cHV0IHN0cmVhbXMuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLyogY3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgKi8KKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocHJvZ3JhbV9uYW1lXyk7CisgIHN0cmluZyBwcm9ncmFtX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHByb2dyYW1fbmFtZV91KTsKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOworCisgIC8qIGNyZWF0ZSBvdXRwdXQgZmlsZXMgKi8KKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyB0aGlzLT5uc3BhY2VfbGMgKyBwcm9ncmFtX25hbWVfbGMgKyAiX3R5cGVzLmgiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKyAgc3RyaW5nIGZfdHlwZXNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHRoaXMtPm5zcGFjZV9sYyArIHByb2dyYW1fbmFtZV9sYyArICJfdHlwZXMuYyI7CisgIGZfdHlwZXNfaW1wbF8ub3BlbihmX3R5cGVzX2ltcGxfbmFtZS5jX3N0cigpKTsKKworICAvKiBhZGQgdGhyaWZ0IGJvaWxlcnBsYXRlIGhlYWRlcnMgKi8KKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfdHlwZXNfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLyogaW5jbHVkZSBpbmNsdXNpb24gZ3VhcmQgKi8KKyAgZl90eXBlc18gPDwgIiNpZm5kZWYgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgcHJvZ3JhbV9uYW1lX3VjIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBwcm9ncmFtX25hbWVfdWMgPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLyogaW5jbHVkZSBiYXNlIHR5cGVzICovCisgIGZfdHlwZXNfIDw8ICIvKiBiYXNlIGluY2x1ZGVzICovIiA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPiIgPDwgZW5kbDsKKworICAvKiBpbmNsdWRlIG90aGVyIHRocmlmdCBpbmNsdWRlcyAqLworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBpZiAoIWluY2x1ZGVzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCAiLyogb3RoZXIgdGhyaWZ0IGluY2x1ZGVzICovIiA8PCBlbmRsOworCisgICAgZm9yIChhdXRvIGluY2x1ZGUgOiBpbmNsdWRlcykgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluY2x1ZGVfbnNwYWNlID0gaW5jbHVkZS0+Z2V0X25hbWVzcGFjZSgiY19nbGliIik7CisgICAgICBzdGQ6OnN0cmluZyBpbmNsdWRlX25zcGFjZV9wcmVmaXggPQorICAgICAgICBpbmNsdWRlX25zcGFjZS5lbXB0eSgpID8gIiIgOiBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoaW5jbHVkZV9uc3BhY2UpICsgIl8iOworCisgICAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGluY2x1ZGVfbnNwYWNlX3ByZWZpeAorICAgICAgICAgICAgICAgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGluY2x1ZGUtPmdldF9uYW1lKCkpIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisKKyAgLyogaW5jbHVkZSBjdXN0b20gaGVhZGVycyAqLworICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgY19pbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfY19pbmNsdWRlcygpOworICBmX3R5cGVzXyA8PCAiLyogY3VzdG9tIHRocmlmdCBpbmNsdWRlcyAqLyIgPDwgZW5kbDsKKyAgZm9yIChjb25zdCBhdXRvICYgY19pbmNsdWRlIDogY19pbmNsdWRlcykgeworICAgIGlmIChjX2luY2x1ZGVbMF0gPT0gJzwnKSB7CisgICAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgIiA8PCBjX2luY2x1ZGUgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBjX2luY2x1ZGUgPDwgIlwiIiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX3R5cGVzXyA8PCBlbmRsOworCisgIC8qIGluY2x1ZGUgbWF0aC5oIChmb3IgIklORklOSVRZIikgaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUsIGluIGNhc2Ugd2UKKyAgICAgZW5jb3VudGVyIGEgc3RydWN0IHdpdGggYSBtZW1iZXIgb2YgdHlwZSBkb3VibGUgKi8KKyAgZl90eXBlc19pbXBsXyA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8bWF0aC5oPiIgPDwgZW5kbDsKKworICAvLyBpbmNsdWRlIHRoZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBwcm9ncmFtX25hbWVfdSA8PCAiX3R5cGVzLmhcIiIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzXyA8PCAiLyogYmVnaW4gdHlwZXMgKi8iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiAgRmluaXNoIHVwIGdlbmVyYXRpb24gYW5kIGNsb3NlIGFsbCBmaWxlIHN0cmVhbXMuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIHN0cmluZyBwcm9ncmFtX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKSk7CisKKyAgLyogZW5kIHRoZSBoZWFkZXIgaW5jbHVzaW9uIGd1YXJkICovCisgIGZfdHlwZXNfIDw8ICIjZW5kaWYgLyogIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgcHJvZ3JhbV9uYW1lX3VjIDw8ICJfVFlQRVNfSCAqLyIgPDwgZW5kbDsKKworICAvKiBjbG9zZSBvdXRwdXQgZmlsZSAqLworICBmX3R5cGVzXy5jbG9zZSgpOworICBmX3R5cGVzX2ltcGxfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgVGhyaWZ0IHR5cGVkZWYgaW4gQyBjb2RlLiAgRm9yIGV4YW1wbGU6CisgKgorICogVGhyaWZ0OgorICogdHlwZWRlZiBtYXA8aTMyLGkzMj4gU29tZU1hcAorICoKKyAqIEM6CisgKiB0eXBlZGVmIEdIYXNoVGFibGUgKiBUaHJpZnRTb21lTWFwOworICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIEMgZW51bWVyYXRpb24uICBGb3IgZXhhbXBsZToKKyAqCisgKiBUaHJpZnQ6CisgKiBlbnVtIE15RW51bSB7CisgKiAgIE9ORSA9IDEsCisgKiAgIFRXTworICogfQorICoKKyAqIEM6CisgKiBlbnVtIF9UaHJpZnRNeUVudW0geworICogICBUSFJJRlRfTVlfRU5VTV9PTkUgPSAxLAorICogICBUSFJJRlRfTVlfRU5VTV9UV08KKyAqIH07CisgKiB0eXBlZGVmIGVudW0gX1RocmlmdE15RW51bSBUaHJpZnRNeUVudW07CisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RyaW5nIG5hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKSk7CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgLyogb3V0cHV0IGVhY2ggb2YgdGhlIGVudW1lcmF0aW9uIGVsZW1lbnRzICovCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3R5cGVzXyA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfdHlwZXNfIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBlbnVtIF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfdHlwZXNfIDw8ICIvKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50ICovIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiY29uc3QgY2hhciAqIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAidG9TdHJpbmdfIiA8PCBuYW1lIDw8ICIoaW50IHZhbHVlKTsgIiA8PCBlbmRsIDw8IGVuZGw7CisgIDsKKyAgZl90eXBlc19pbXBsXyA8PCAiLyogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCAqLyIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiY29uc3QgY2hhciAqIiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICJ0b1N0cmluZ18iIDw8IG5hbWUgPDwgIihpbnQgdmFsdWUpICIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAieyIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiICBzdGF0aWMgX190aHJlYWQgY2hhciBidWZbMTZdID0gezB9OyIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiICBzd2l0Y2godmFsdWUpIHsiIDw8IGVuZGw7CisgIHN0ZDo6c2V0PGludD4gZG9uZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIC8vIFNraXBwaW5nIGR1cGxpY2F0ZSB2YWx1ZQorICAgIGlmIChkb25lLmZpbmQodmFsdWUpID09IGRvbmUuZW5kKCkpIHsKKyAgICAgIGRvbmUuaW5zZXJ0KHZhbHVlKTsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgIiAgY2FzZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIjoiCisgICAgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gXCIiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIlwiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl90eXBlc19pbXBsXyA8PCAiICBkZWZhdWx0OiBnX3NucHJpbnRmKGJ1ZiwgMTYsIFwiJWRcIiwgdmFsdWUpOyByZXR1cm4gYnVmOyIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiICB9IiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIFRocmlmdCBjb25zdGFudHMgaW4gQyBjb2RlLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGZfdHlwZXNfIDw8ICIvKiBjb25zdGFudHMgKi8iIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIi8qIGNvbnN0YW50cyAqLyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWUpOworICAgIHN0cmluZyBuYW1lX2xjID0gdG9fbG93ZXJfY2FzZShuYW1lKTsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0eXBlKSkgeworICAgICAgZl90eXBlc18gPDwgdHlwZV9uYW1lKHR5cGUpIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjCisgICAgICAgICAgICAgICA8PCAiX2NvbnN0YW50KCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIiAiCisgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUobmFtZV9sYywgdHlwZSwgdmFsdWUpIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihuYW1lX2xjLCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgIH0KKworICBmX3R5cGVzXyA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgVGhyaWZ0IHN0cnVjdHMgaW4gQyBjb2RlLCBhcyBHT2JqZWN0cy4gIEV4YW1wbGU6CisgKgorICogVGhyaWZ0OgorICogc3RydWN0IEJvbmsKKyAqIHsKKyAqICAgMTogc3RyaW5nIG1lc3NhZ2UsCisgKiAgIDI6IGkzMiB0eXBlCisgKiB9CisgKgorICogQyBHT2JqZWN0IGluc3RhbmNlIGhlYWRlcjoKKyAqIHN0cnVjdCBfVGhyaWZ0Qm9uaworICogeworICogICBHT2JqZWN0IHBhcmVudDsKKyAqCisgKiAgIGdjaGFyICogbWVzc2FnZTsKKyAqICAgZ2ludDMyIHR5cGU7CisgKiB9OworICogdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJvbmsgVGhyaWZ0Qm9uaworICogLy8gLi4uIGFkZGl0aW9uYWwgR09iamVjdCBib2lsZXJwbGF0ZSAuLi4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBmX3R5cGVzXyA8PCAiLyogc3RydWN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICovIiA8PCBlbmRsOworICBnZW5lcmF0ZV9vYmplY3QodHN0cnVjdCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgQyBjb2RlIHRvIHJlcHJlc2VudCBUaHJpZnQgc2VydmljZXMuICBDcmVhdGVzIGEgbmV3IEdPYmplY3QKKyAqIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgc2VydmljZS4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgc3ZjbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIHN2Y25hbWVfdWMgPSB0aGlzLT5uc3BhY2VfdWMgKyB0b191cHBlcl9jYXNlKHN2Y25hbWVfdSk7CisgIHN0cmluZyBmaWxlbmFtZSA9IHRoaXMtPm5zcGFjZV9sYyArIHRvX2xvd2VyX2Nhc2Uoc3ZjbmFtZV91KTsKKworICAvLyBtYWtlIG91dHB1dCBmaWxlcworICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmaWxlbmFtZSArICIuaCI7CisgIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHByb2dyYW1fbmFtZV8pOworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7CisKKyAgLy8gYWRkIGhlYWRlciBmaWxlIGJvaWxlcnBsYXRlCisgIGZfaGVhZGVyXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKworICAvLyBhZGQgYW4gaW5jbHVzaW9uIGd1YXJkCisgIGZfaGVhZGVyXyA8PCAiI2lmbmRlZiAiIDw8IHN2Y25hbWVfdWMgPDwgIl9IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgc3ZjbmFtZV91YyA8PCAiX0giIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gYWRkIHN0YW5kYXJkIGluY2x1ZGVzCisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaD4iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHByb2dyYW1fbmFtZV9sYyA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbDsKKworICAvLyBpZiB3ZSBhcmUgaW5oZXJpdGluZyBmcm9tIGFub3RoZXIgc2VydmljZSwgaW5jbHVkZSBpdHMgaGVhZGVyCisgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3NlcnZpY2UgIT0gTlVMTCkgeworICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYworICAgICAgICAgICAgICA8PCB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkpKSA8PCAiLmhcIiIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24KKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGZpbGVuYW1lICsgIi5jIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIC8vIGFkZCB0aGUgYm9pbGVycGxhY2UgaGVhZGVyCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLy8gaW5jbHVkZSB0aGUgaGVhZGVycworICBmX3NlcnZpY2VfIDw8ICIjaW5jbHVkZSA8c3RyaW5nLmg+IiA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPiIgPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiCisgICAgICAgICAgICAgPDwgZmlsZW5hbWUgPDwgIi5oXCIiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSB0aGUgc2VydmljZS1oZWxwZXIgY2xhc3NlcworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIC8vIGdlbmVyYXRlIHRoZSBjbGllbnQgb2JqZWN0cworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHNlcnZlciBvYmplY3RzCisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKworICAvLyBlbmQgdGhlIGhlYWRlciBpbmNsdXNpb24gZ3VhcmQKKyAgZl9oZWFkZXJfIDw8ICIjZW5kaWYgLyogIiA8PCBzdmNuYW1lX3VjIDw8ICJfSCAqLyIgPDwgZW5kbDsKKworICAvLyBjbG9zZSB0aGUgZmlsZXMKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworICBmX2hlYWRlcl8uY2xvc2UoKTsKK30KKworLyoqCisgKgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZV91KTsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7CisKKyAgZ2VuZXJhdGVfb2JqZWN0KHRzdHJ1Y3QpOworCisgIGZfdHlwZXNfIDw8ICIvKiBleGNlcHRpb24gKi8iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInR5cGVkZWYgZW51bSIgPDwgZW5kbAorICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1JfQ09ERSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgIn0gIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiRXJyb3I7IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIkdRdWFyayAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjCisgICAgICAgICAgIDw8ICJfZXJyb3JfcXVhcmsgKHZvaWQpOyIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1IgKCIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9lcnJvcl9xdWFyaygpKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCAiLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBleGNlcHRpb25zICovIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SX0RPTUFJTiBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMKKyAgICAgICAgICAgICAgICA8PCAiX2Vycm9yX3F1YXJrXCIiIDw8IGVuZGwgPDwgIkdRdWFyayIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYworICAgICAgICAgICAgICAgIDw8ICJfZXJyb3JfcXVhcmsgKHZvaWQpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjCisgICAgICAgICAgICAgICAgPDwgIl9FUlJPUl9ET01BSU4pOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioqKioqKioqKioqKioqKioqKioKKyAqIEhFTFBFUiBGVU5DVElPTlMgKgorICoqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0dHlwZSBpcyBub3QgYSBwcmltaXRpdmUuCisgKi8KK2Jvb2wgdF9jX2dsaWJfZ2VuZXJhdG9yOjppc19jb21wbGV4X3R5cGUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpOworfQorCitib29sIHRfY19nbGliX2dlbmVyYXRvcjo6aXNfbnVtZXJpYyh0X3R5cGUqIHR0eXBlKSB7CisgIHJldHVybiB0dHlwZS0+aXNfZW51bSgpIHx8ICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR0eXBlLT5pc19zdHJpbmcoKSk7Cit9CisKKy8qKgorICogTWFwcyBhIFRocmlmdCB0X3R5cGUgdG8gYSBDIHR5cGUuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYsIGJvb2wgaXNfY29uc3QpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyBibmFtZSA9IGJhc2VfdHlwZV9uYW1lKHR0eXBlKTsKKworICAgIGlmIChpc19jb25zdCkgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBibmFtZTsKKyAgICB9CisgIH0KKworICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgc3RyaW5nIGNuYW1lOworCisgICAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOworICAgIGlmICh0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKSkgeworICAgICAgY25hbWUgPSB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgY25hbWUgPSAiR0hhc2hUYWJsZSI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIC8vIHNpbmNlIGEgc2V0IHJlcXVpcmVzIHVuaXF1ZSBlbGVtZW50cywgdXNlIGEgR0hhc2hUYWJsZSwgYW5kCisgICAgICAvLyBwb3B1bGF0ZSB0aGUga2V5cyBhbmQgdmFsdWVzIHdpdGggdGhlIHNhbWUgZGF0YSwgdXNpbmcga2V5cyBmb3IKKyAgICAgIC8vIHRoZSBhY3R1YWwgd3JpdGVzIGFuZCByZWFkcy4KKyAgICAgIC8vIFRPRE86IGRpc2N1c3Mgd2hldGhlciBvciBub3QgdG8gaW1wbGVtZW50IFRTZXQsIFRIYXNoU2V0IG9yIEdIYXNoU2V0CisgICAgICBjbmFtZSA9ICJHSGFzaFRhYmxlIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIHRfdHlwZSogZXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICBpZiAoZXR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBsaXN0IGVsZW1lbnQgdHlwZSBjYW5ub3QgYmUgdm9pZCIpOworICAgICAgfQorICAgICAgLy8gVE9ETzogaW52ZXN0aWdhdGUgb3RoZXIgaW1wbGVtZW50YXRpb25zIGJlc2lkZXMgR1B0ckFycmF5CisgICAgICBjbmFtZSA9IGlzX251bWVyaWMoZXR5cGUpID8gIkdBcnJheSIgOiAiR1B0ckFycmF5IjsKKyAgICB9CisKKyAgICAvKiBPbWl0IHRoZSBkZXJlZmVyZW5jZSBvcGVyYXRvciBpZiB3ZSBhcmUgYWxpYXNpbmcgdGhpcyB0eXBlIHdpdGhpbiBhCisgICAgICAgdHlwZWRlZiwgdG8gYWxsb3cgdGhlIHR5cGUgdG8gYmUgdXNlZCBtb3JlIG5hdHVyYWxseSBpbiBjbGllbnQgY29kZTsKKyAgICAgICBvdGhlcndpc2UsIGluY2x1ZGUgaXQgKi8KKyAgICBpZiAoIWluX3R5cGVkZWYpIHsKKyAgICAgIGNuYW1lICs9ICIgKiI7CisgICAgfQorCisgICAgaWYgKGlzX2NvbnN0KSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBjbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGNuYW1lOworICAgIH0KKyAgfQorCisgIC8vIGNoZWNrIGZvciBhIG5hbWVzcGFjZQorICB0X3Byb2dyYW0qIHRwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIHN0cmluZyBwbmFtZSA9ICh0cHJvZ3JhbSA/IHRwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKSA6ICIiKSArIHR0eXBlLT5nZXRfbmFtZSgpOworCisgIGlmIChpc19jb21wbGV4X3R5cGUodHR5cGUpKSB7CisgICAgcG5hbWUgKz0gIiAqIjsKKyAgfQorCisgIGlmIChpc19jb25zdCkgeworICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lOworICB9IGVsc2UgeworICAgIHJldHVybiBwbmFtZTsKKyAgfQorfQorCisvKioKKyAqIE1hcHMgYSBUaHJpZnQgcHJpbWl0aXZlIHRvIHRoZSB0eXBlIG5lZWRlZCB0byBob2xkIGl0cyB2YWx1ZSB3aGVuIHVzZWQgYXMgYW4KKyAqIG9iamVjdCBwcm9wZXJ0eS4KKyAqCisgKiBUaGlzIG1ldGhvZCBpcyBuZWVkZWQgYmVjYXVzZSBhbGwgaW50ZWdlciBwcm9wZXJ0aWVzIG9mIHdpZHRoIGxlc3MgdGhhbiA2NAorICogYml0cyBtYXAgdG8gdGhlIHNhbWUgdHlwZSwgZ2ludCwgYXMgb3Bwb3NlZCB0byB0aGVpciB3aWR0aC1zcGVjaWZpYyB0eXBlCisgKiAoZ2ludDgsIGdpbnQxNiBvciBnaW50MzIpLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpwcm9wZXJ0eV90eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGlzX2NvbnN0KSB7CisgIHN0cmluZyByZXN1bHQ7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGlmIChpc19jb25zdCkgeworICAgICAgICByZXN1bHQgPSAiY29uc3QgZ2ludCI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSAiZ2ludCI7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQgPSB0eXBlX25hbWUodHR5cGUsIGluX3R5cGVkZWYsIGlzX2NvbnN0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlLCBpbl90eXBlZGVmLCBpc19jb25zdCk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIE1hcHMgYSBUaHJpZnQgcHJpbWl0aXZlIHRvIGEgQyBwcmltaXRpdmUuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSh0eXBlKTsKKyAgfQorICBpZiAoIXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJPbmx5IGJhc2UgdHlwZXMgYXJlIHN1cHBwb3J0ZWQuIik7CisgIH0KKyAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKTsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKTsKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiR0J5dGVBcnJheSAqIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJnY2hhciAqIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gImdib29sZWFuIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gImdpbnQ4IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJnaW50MTYiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImdpbnQzMiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiZ2ludDY0IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJnZG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJjb21waWxlciBlcnJvcjogbm8gQyBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSk7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGEgbWVtYmVyIG9mIHRoZSBUaHJpZnRUeXBlIEMgZW51bWVyYXRpb24gaW4gdGhyaWZ0X3Byb3RvY29sLmgKKyAqIGZvciBhIFRocmlmdCB0eXBlLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRfU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVF9CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVF9JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRfSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVF9ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRfSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAiVF9TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVF9NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUX1NFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUX0xJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgYSBUaHJpZnQgY29uc3RhbnQgZm9ybWF0dGVkIGFzIGEgbGl0ZXJhbCBmb3IgaW5jbHVzaW9uIGluIEMgY29kZS4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Y29uc3RhbnRfbGl0ZXJhbCh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIG9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIC8qIHByaW1pdGl2ZXMgKi8KKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgIlwiIiArIHZhbHVlLT5nZXRfc3RyaW5nKCkgKyAiXCIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgIT0gMCkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdmFsdWVfdHlwZSA9IHZhbHVlLT5nZXRfdHlwZSgpOworCisgICAgc3dpdGNoICh2YWx1ZV90eXBlKSB7CisgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgICAgcmVuZGVyIDw8ICJ7ICI7CisgICAgICB7CisgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGxpc3QgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgbGlzdF9pdGVyOworCisgICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICBsaXN0X2l0ZXIgPSBsaXN0LmJlZ2luKCk7CisgICAgICAgICAgcmVuZGVyIDw8IGNvbnN0YW50X2xpdGVyYWwoZWxlbV90eXBlLCAqbGlzdF9pdGVyKTsKKworICAgICAgICAgIHdoaWxlICgrK2xpc3RfaXRlciAhPSBsaXN0LmVuZCgpKSB7CisgICAgICAgICAgICByZW5kZXIgPDwgIiwgIiA8PCBjb25zdGFudF9saXRlcmFsKGVsZW1fdHlwZSwgKmxpc3RfaXRlcik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZW5kZXIgPDwgIiB9IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgorICAgIGRlZmF1bHQ6CisgICAgICByZW5kZXIgPDwgIk5VTEwgLyogbm90IHN1cHBvcnRlZCAqLyI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgY29uc3RhbnQuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNvbnN0YW50X3ZhbHVlKHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIG9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIC8qIHByaW1pdGl2ZXMgKi8KKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICJnX3N0cmR1cCAoXCIiICsgdmFsdWUtPmdldF9zdHJpbmcoKSArICJcIikiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgIT0gMCkgPyAxIDogMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgIkdfR0lOVDY0X0NPTlNUQU5UICgiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmIChpc19jb21wbGV4X3R5cGUodHlwZSkpIHsKKyAgICByZW5kZXIgPDwgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCB0b19sb3dlcl9jYXNlKG5hbWUpIDw8ICJfY29uc3RhbnQoKSkiOworICB9IGVsc2UgeworICAgIHJlbmRlciA8PCAiTlVMTCAvKiBub3Qgc3VwcG9ydGVkICovIjsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHRfc3RydWN0KiBhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICB0X3N0cnVjdCogeGxpc3QgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgc3RyaW5nIGZuYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7CisgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgcmV0dXJuICJnYm9vbGVhbiAiICsgdGhpcy0+bnNwYWNlX2xjICsgZm5hbWUgKyAiICgiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqIGlmYWNlIgorICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCkpKQorICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhsaXN0KSkpICsgIiwgR0Vycm9yICoqIGVycm9yKSI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEByZXR1cm4gQ29tbWEgc2VwZWFyYXRlZCBsaXN0IG9mIGFsbCBmaWVsZCBuYW1lcyBpbiB0aGF0IHN0cnVjdAorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIG11dGFibGUgZXhjZXB0aW9uIGxpc3RzCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6eGNlcHRpb25fbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIqICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCBpbmNsdWRpbmcgYW55IG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGlmIChjb25zdGFudCkgeworICAgIHJlc3VsdCArPSAiY29uc3QgIjsKKyAgfQorICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChwb2ludGVyKSB7CisgICAgcmVzdWx0ICs9ICIqIjsKKyAgfQorICBpZiAocmVmZXJlbmNlKSB7CisgICAgcmVzdWx0ICs9ICIqIjsKKyAgfQorICByZXN1bHQgKz0gIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGdkb3VibGUpIDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IE5VTEwiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyBpbnRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gKCIgKyB0eXBlX25hbWUodHlwZSkgKyAiKSAwIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IE5VTEwiOworICAgIH0KKyAgfQorCisgIGlmICghcmVmZXJlbmNlKSB7CisgICAgcmVzdWx0ICs9ICI7IjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNvbnN0YW50X3ZhbHVlX3dpdGhfc3RvcmFnZShzdHJpbmcgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiBldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKyAgaWYgKGlzX251bWVyaWMoZXR5cGUpKSB7CisgICAgcmVuZGVyIDw8ICIgICAgIiA8PCB0eXBlX25hbWUoZXR5cGUpIDw8ICIgKiIgPDwgZm5hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgPDwgImdfbmV3ICgiIDw8IGJhc2VfdHlwZV9uYW1lKGV0eXBlKSA8PCAiLCAxKTsiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiAgICAqIiA8PCBmbmFtZSA8PCAiID0gIiA8PCBjb25zdGFudF92YWx1ZShmbmFtZSwgKHRfdHlwZSopZXR5cGUsIHZhbHVlKSA8PCAiOyIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXIgPDwgIiAgICAiIDw8IHR5cGVfbmFtZShldHlwZSkgPDwgIiAiIDw8IGZuYW1lIDw8ICIgPSAiCisgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKGZuYW1lLCAodF90eXBlKilldHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IGluaXRpYWxpemVzIGNvbXBsZXggY29uc3RhbnRzLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdG9wX2xldmVsKSB7CisgIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBuYW1lX2xjID0gdG9fbG93ZXJfY2FzZShuYW1lX3UpOworICBzdHJpbmcgdHlwZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHR5cGUtPmdldF9uYW1lKCkpOworICBzdHJpbmcgdHlwZV91YyA9IHRvX3VwcGVyX2Nhc2UodHlwZV91KTsKKyAgc3RyaW5nIG1heWJlX3N0YXRpYyA9IHRvcF9sZXZlbCA/ICIiIDogInN0YXRpYyAiOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7CisKKyAgICAvLyBpbml0aWFsaXplIGFueSBjb25zdGFudHMgdGhhdCBtYXkgYmUgcmVmZXJlbmNlZCBieSB0aGlzIGluaXRpYWxpemVyCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9ICIiOworCisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiCisgICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBmaWVsZF9uYW1lID0gdG1wKGZpZWxkX25hbWUpOworCisgICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihuYW1lICsgIl9jb25zdGFudF8iICsgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbml0aWFsaXplcnMgPDwgIiAgICBjb25zdGFudC0+IiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShuYW1lICsgIl9jb25zdGFudF8iICsgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfaXRlci0+c2Vjb25kKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8ICIgICAgY29uc3RhbnQtPl9faXNzZXRfIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiID0gVFJVRTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gaW1wbGVtZW50IHRoZSBpbml0aWFsaXplcgorICAgIGZfdHlwZXNfaW1wbF8gPDwgbWF5YmVfc3RhdGljIDw8IHRoaXMtPm5zcGFjZSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIgKiIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IHRoaXMtPm5zcGFjZSA8PCB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gZ19vYmplY3RfbmV3ICgiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgICAgICAgPDwgIlRZUEVfIiA8PCB0eXBlX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5pdGlhbGl6ZXJzLnN0cigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gIiI7CisKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKKyAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGZpZWxkX25hbWUgPSB0bXAoZmllbGRfbmFtZSk7CisgICAgfQorCisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgbGlzdF90eXBlID0gIkdQdHJBcnJheSAqIjsKKyAgICBzdHJpbmcgZnJlZV9mdW5jCisgICAgICAgID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZShyZWludGVycHJldF9jYXN0PHRfbGlzdCo+KHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIHN0cmluZyBsaXN0X2luaXRpYWxpemVyID0gImdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoIiArIGZyZWVfZnVuYyArICIpOyI7CisgICAgc3RyaW5nIGxpc3RfYXBwZW5kZXIgPSAiZ19wdHJfYXJyYXlfYWRkIjsKKyAgICBib29sIGxpc3RfdmFyaWFibGUgPSBmYWxzZTsKKworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7CisgICAgb3N0cmluZ3N0cmVhbSBhcHBlbmRlcnM7CisKKyAgICBsaXN0X2luaXRpYWxpemVyID0gZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZShldHlwZSk7CisgICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKWV0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBsaXN0X3R5cGUgPSAiR0FycmF5ICoiOworICAgICAgICBsaXN0X2FwcGVuZGVyID0gImdfYXJyYXlfYXBwZW5kX3ZhbCI7CisgICAgICAgIGxpc3RfdmFyaWFibGUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChldHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBsaXN0X3R5cGUgPSAiR0FycmF5ICoiOworICAgICAgbGlzdF9hcHBlbmRlciA9ICJnX2FycmF5X2FwcGVuZF92YWwiOworICAgICAgbGlzdF92YXJpYWJsZSA9IHRydWU7CisgICAgfQorCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmbmFtZSA9IHRtcChuYW1lKTsKKworICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoZm5hbWUsIGV0eXBlLCAoKnZfaXRlcikpOworICAgICAgaWYgKGxpc3RfdmFyaWFibGUpIHsKKyAgICAgICAgaW5pdGlhbGl6ZXJzIDw8ICIgICAgIiA8PCB0eXBlX25hbWUoZXR5cGUpIDw8ICIgIiA8PCBmbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCAoKnZfaXRlcikpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgYXBwZW5kZXJzIDw8ICIgICAgIiA8PCBsaXN0X2FwcGVuZGVyIDw8ICIoY29uc3RhbnQsICIgPDwgZm5hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFwcGVuZGVycyA8PCAiICAgICIgPDwgbGlzdF9hcHBlbmRlciA8PCAiKGNvbnN0YW50LCAiCisgICAgICAgICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShmbmFtZSwgKHRfdHlwZSopZXR5cGUsICgqdl9pdGVyKSkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmX3R5cGVzX2ltcGxfIDw8IG1heWJlX3N0YXRpYyA8PCBsaXN0X3R5cGUgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljICIgPDwgbGlzdF90eXBlIDw8ICIgY29uc3RhbnQgPSBOVUxMOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgaWYgKCFpbml0aWFsaXplcnMuc3RyKCkuZW1wdHkoKSkgeworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbml0aWFsaXplcnMuc3RyKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY29uc3RhbnQgPSAiIDw8IGxpc3RfaW5pdGlhbGl6ZXIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXBwZW5kZXJzLnN0cigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKKyAgICBvc3RyaW5nc3RyZWFtIGFwcGVuZGVyczsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgZm5hbWUgPSB0bXAobmFtZSk7CisgICAgICBzdHJpbmcgcHRyID0gaXNfbnVtZXJpYyhldHlwZSkgPyAiKiIgOiAiIjsKKyAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKGZuYW1lLCBldHlwZSwgKCp2X2l0ZXIpKTsKKyAgICAgIGluaXRpYWxpemVycyA8PCBjb25zdGFudF92YWx1ZV93aXRoX3N0b3JhZ2UoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGFwcGVuZGVycyA8PCAiICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnN0YW50LCAiIDw8IGZuYW1lIDw8ICIsIDApOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzX2ltcGxfIDw8IG1heWJlX3N0YXRpYyA8PCAiR0hhc2hUYWJsZSAqIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2NvbnN0YW50ICh2b2lkKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzdGF0aWMgR0hhc2hUYWJsZSAqY29uc3RhbnQgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluaXRpYWxpemVycy5zdHIoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY29uc3RhbnQgPSAiIDw8IGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZShldHlwZSwgTlVMTCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXBwZW5kZXJzLnN0cigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOworICAgIG9zdHJpbmdzdHJlYW0gYXBwZW5kZXJzOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmbmFtZSA9IHRtcChuYW1lKTsKKyAgICAgIHN0cmluZyBrbmFtZSA9IGZuYW1lICsgImtleSI7CisgICAgICBzdHJpbmcgdm5hbWUgPSBmbmFtZSArICJ2YWwiOworICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoa25hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKHZuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworCisgICAgICBpbml0aWFsaXplcnMgPDwgY29uc3RhbnRfdmFsdWVfd2l0aF9zdG9yYWdlKGtuYW1lLCAodF90eXBlKilrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBpbml0aWFsaXplcnMgPDwgY29uc3RhbnRfdmFsdWVfd2l0aF9zdG9yYWdlKHZuYW1lLCAodF90eXBlKil2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgYXBwZW5kZXJzIDw8ICIgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoY29uc3RhbnQsICIgPDwga25hbWUgPDwgIiwgIiA8PCB2bmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc19pbXBsXyA8PCBtYXliZV9zdGF0aWMgPDwgIkdIYXNoVGFibGUgKiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljIEdIYXNoVGFibGUgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gIiA8PCBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUoa3R5cGUsIHZ0eXBlKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBhcHBlbmRlcnMuc3RyKCk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29uc3RhbnQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBjbGFzc2VzIGZvciBhIHNlcnZpY2UsIGNvbnNpc3Rpbmcgb2YgYSBUaHJpZnRTdHJ1Y3Qgc3ViY2xhc3MKKyAqIGZvciB0aGUgYXJndW1lbnRzIHRvIGFuZCB0aGUgcmVzdWx0IGZyb20gZWFjaCBtZXRob2QuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBnZW5lcmF0ZSBoZWxwZXIgY2xhc3NlcworICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmdW5jdGlvbl9pdGVyOworCisgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc2VydmljZSdzIG1ldGhvZHMKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgYXJnX2xpc3RfbmFtZV9vcmlnID0gYXJnX2xpc3QtPmdldF9uYW1lKCk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgYXJndW1lbnRzIGNsYXNzCisgICAgYXJnX2xpc3QtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKGZ1bmN0aW9uX25hbWUpICsgIkFyZ3MiKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3QoYXJnX2xpc3QpOworCisgICAgYXJnX2xpc3QtPnNldF9uYW1lKGFyZ19saXN0X25hbWVfb3JpZyk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgcmVzdWx0IGNsYXNzCisgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLAorICAgICAgICAgICAgICAgICAgICAgIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKGZ1bmN0aW9uX25hbWUpICsgIlJlc3VsdCIpOworICAgICAgdF9maWVsZCBzdWNjZXNzKCgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgICBzdWNjZXNzLnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmaWVsZF9pdGVyOworICAgICAgZm9yIChmaWVsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZpZWxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKKyAgICAgICAgKCpmaWVsZF9pdGVyKS0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgqZmllbGRfaXRlcik7CisgICAgICB9CisKKyAgICAgIGdlbmVyYXRlX3N0cnVjdCgmcmVzdWx0KTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIGNsaWVudC4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLyogZ2V0IHNvbWUgQyBmcmllbmRseSBzZXJ2aWNlIG5hbWVzICovCisgIHN0cmluZyBzZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKSk7CisgIHN0cmluZyBzZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfbmFtZV9sYyk7CisKKyAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWU7CisgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX2xjOworICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV91YzsKKworICBzdHJpbmcgcGFyZW50X2NsYXNzX25hbWUgPSAiR09iamVjdCI7CisgIHN0cmluZyBwYXJlbnRfdHlwZV9uYW1lID0gIkdfVFlQRV9PQkpFQ1QiOworCisgIC8vIFRoZSBzZXJ2aWNlIHRoaXMgc2VydmljZSBleHRlbmRzLCBvciBOVUxMIGlmIGl0IGV4dGVuZHMgbm8KKyAgLy8gc2VydmljZQorICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgLy8gVGhlIG5hbWUgb2YgdGhlIHBhcmVudCBzZXJ2aWNlCisgICAgcGFyZW50X3NlcnZpY2VfbmFtZSA9IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICBwYXJlbnRfc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocGFyZW50X3NlcnZpY2VfbmFtZSkpOworICAgIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHBhcmVudF9zZXJ2aWNlX25hbWVfbGMpOworCisgICAgLy8gVGhlIG5hbWVzIG9mIHRoZSBjbGllbnQgY2xhc3MnIHBhcmVudCBjbGFzcyBhbmQgdHlwZQorICAgIHBhcmVudF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJDbGllbnQiOworICAgIHBhcmVudF90eXBlX25hbWUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgcGFyZW50X3NlcnZpY2VfbmFtZV91YyArICJfQ0xJRU5UIjsKKyAgfQorCisgIC8vIFRoZSBiYXNlIHNlcnZpY2UgKHRoZSB0b3Btb3N0IGluIHRoZSAiZXh0ZW5kcyIgaGllcmFyY2h5KSwgb24KKyAgLy8gd2hvc2UgY2xpZW50IGNsYXNzIHRoZSAiaW5wdXRfcHJvdG9jb2wiIGFuZCAib3V0cHV0X3Byb3RvY29sIgorICAvLyBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkCisgIHRfc2VydmljZSogYmFzZV9zZXJ2aWNlID0gdHNlcnZpY2U7CisgIHdoaWxlIChiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICBiYXNlX3NlcnZpY2UgPSBiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIH0KKworICBzdHJpbmcgYmFzZV9zZXJ2aWNlX25hbWUgPSBiYXNlX3NlcnZpY2UtPmdldF9uYW1lKCk7CisgIHN0cmluZyBiYXNlX3NlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGJhc2Vfc2VydmljZV9uYW1lKSk7CisgIHN0cmluZyBiYXNlX3NlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoYmFzZV9zZXJ2aWNlX25hbWVfbGMpOworCisgIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgaW50ZXJmYWNlIGR1bW15IG9iamVjdCBpbiB0aGUgaGVhZGVyLgorICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHNlcnZpY2UgaW50ZXJmYWNlICovIiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmOyAiCisgICAgICAgICAgICA8PCAiIC8qIGR1bW15IG9iamVjdCAqLyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgaW50ZXJmYWNlIG9iamVjdCBpbiB0aGUgaGVhZGVyLgorICBmX2hlYWRlcl8gPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIgIEdUeXBlSW50ZXJmYWNlIHBhcmVudDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvKiB3cml0ZSBvdXQgdGhlIGZ1bmN0aW9ucyBmb3IgdGhpcyBpbnRlcmZhY2UgKi8KKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLworICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKKyAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKworICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdsaXN0KSkpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4bGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7CisKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiZ2Jvb2xlYW4gKCoiIDw8IGZ1bm5hbWUgPDwgIikgIiA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGFsbCB0aGUgaW50ZXJmYWNlIGJvaWxlcnBsYXRlCisgIGZfaGVhZGVyXyA8PCAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiAiCisgICAgICAgICAgICA8PCAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYpKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUZfR0VUX0lOVEVSRkFDRShpbnN0KSAoR19UWVBFX0lOU1RBTkNFX0dFVF9JTlRFUkZBQ0UgKChpbnN0KSwgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsICIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSkpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgb3V0IGFsbCB0aGUgaW50ZXJmYWNlIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KKyAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgdF9zdHJ1Y3QqIHhsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7CisgICAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgICAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisKKyAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeGxpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOworCisgICAgZl9oZWFkZXJfIDw8ICJnYm9vbGVhbiAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl8iIDw8IGZ1bm5hbWUgPDwgIiAiCisgICAgICAgICAgICAgIDw8IHBhcmFtcyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IG9iamVjdCBpbnN0YW5jZSBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIuCisgIGZfaGVhZGVyXyA8PCAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgc2VydmljZSBjbGllbnQgKi8iIDw8IGVuZGwgPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICAiIDw8IHBhcmVudF9jbGFzc19uYW1lCisgICAgICAgICAgICA8PCAiIHBhcmVudDsiIDw8IGVuZGw7CisgIGlmICghZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgLy8gRGVmaW5lICJpbnB1dF9wcm90b2NvbCIgYW5kICJvdXRwdXRfcHJvdG9jb2wiIHByb3BlcnRpZXMgb25seQorICAgIC8vIGZvciBiYXNlIHNlcnZpY2VzOyBjaGlsZCBzZXJ2aWNlLWNsaWVudCBjbGFzc2VzIHdpbGwgaW5oZXJpdAorICAgIC8vIHRoZXNlCisgICAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIiAgVGhyaWZ0UHJvdG9jb2wgKmlucHV0X3Byb3RvY29sOyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCAiICBUaHJpZnRQcm90b2NvbCAqb3V0cHV0X3Byb3RvY29sOyIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNsYXNzIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlci4KKyAgZl9oZWFkZXJfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiICAiIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gQ3JlYXRlIGFsbCB0aGUgR09iamVjdCBib2lsZXJwbGF0ZQorICBmX2hlYWRlcl8gPDwgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCAiCisgICAgICAgICAgICA8PCAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfdHlwZSgpKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50KSkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9DTEFTUyhjKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0NMSUVOVCwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSVNfQ0xJRU5UKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JU19DTElFTlRfQ0xBU1MoYykgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9DTElFTlQpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfQ0xJRU5UX0dFVF9DTEFTUyhvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MpKSIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAvKiB3cml0ZSBvdXQgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KKyAgICBzdHJpbmcgZnVubmFtZSA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOworCisgICAgdF9mdW5jdGlvbiBzZXJ2aWNlX2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50XyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZXJ2aWNlX2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKKworICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50X3NlbmRfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7CisKKyAgICAvLyBpbXBsZW1lbnQgcmVjdiBpZiBub3QgYSBvbmV3YXkgc2VydmljZQorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50X3JlY3ZfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvKiB3cml0ZSBvdXQgdGhlIGdldC9zZXQgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworICBmX2hlYWRlcl8gPDwgInZvaWQgIiArIHNlcnZpY2VfbmFtZV9sYyArICJfY2xpZW50X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnR5X2lkLCBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYyk7IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9oZWFkZXJfIDw8ICJ2b2lkICIgKyBzZXJ2aWNlX25hbWVfbGMgKyAiX2NsaWVudF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eV9pZCwgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpOyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgZl9oZWFkZXJfIDw8IGVuZGw7CisgIC8vIGVuZCBvZiBoZWFkZXIgY29kZQorCisgIC8vIEdlbmVyYXRlIGludGVyZmFjZSBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCisgICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4bGlzdCA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOworICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworCisgICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgorICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhsaXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKKworICAgIHN0cmluZyBwYXJhbXNfd2l0aG91dF90eXBlID0gc3RyaW5nKCJpZmFjZSwgIikgKyAoaGFzX3JldHVybiA/ICJfcmV0dXJuLCAiIDogIiIpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXJfZmllbGQ7CisgICAgZm9yIChmX2l0ZXJfZmllbGQgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyX2ZpZWxkICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXJfZmllbGQpIHsKKyAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gKCpmX2l0ZXJfZmllbGQpLT5nZXRfbmFtZSgpOworICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAiLCAiOworICAgIH0KKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICIsICI7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiZ2Jvb2xlYW4iIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmXyIgPDwgZnVubmFtZQorICAgICAgICAgICAgICAgPDwgIiAiIDw8IHBhcmFtcyA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsIDw8ICIgIHJldHVybiAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUZfR0VUX0lOVEVSRkFDRSAoaWZhY2UpLT4iIDw8IGZ1bm5hbWUgPDwgIiAoIgorICAgICAgICAgICAgICAgPDwgcGFyYW1zX3dpdGhvdXRfdHlwZSA8PCAiZXJyb3IpOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgaW50ZXJmYWNlIGJvaWxlcnBsYXRlCisgIGZfc2VydmljZV8gPDwgIkdUeXBlIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9nZXRfdHlwZSAodm9pZCkiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICBzdGF0aWMgR1R5cGUgdHlwZSA9IDA7IiA8PCBlbmRsIDw8ICIgIGlmICh0eXBlID09IDApIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgeyIgPDwgZW5kbCA8PCAiICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gdHlwZV9pbmZvID0iIDw8IGVuZGwgPDwgIiAgICB7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UpLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAgLyogYmFzZV9pbml0ICovIiA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAgLyogYmFzZV9maW5hbGl6ZSAqLyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAgLyogY2xhc3NfaW5pdCAqLyIgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgIC8qIGNsYXNzX2ZpbmFsaXplICovIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsICAvKiBjbGFzc19kYXRhICovIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgIDAsICAgICAvKiBpbnN0YW5jZV9zaXplICovIiA8PCBlbmRsIDw8ICIgICAgICAwLCAgICAgLyogbl9wcmVhbGxvY3MgKi8iCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgIC8qIGluc3RhbmNlX2luaXQgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCAgIC8qIHZhbHVlX3RhYmxlICovIiA8PCBlbmRsIDw8ICIgICAgfTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHX1RZUEVfSU5URVJGQUNFLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZcIiwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV9pbmZvLCAwKTsiIDw8IGVuZGwgPDwgIiAgfSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHJldHVybiB0eXBlOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBib2lsZXJwbGF0ZQorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCAiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCAiR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICA8PCAiQ2xpZW50LCAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnQsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAiIDw8IHBhcmVudF90eXBlX25hbWUgPDwgIiwgIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA8PCB0aGlzLT5uc3BhY2VfbGMKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCkpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvcGVydHktcmVsYXRlZCBjb2RlIG9ubHkgZm9yIGJhc2Ugc2VydmljZXMtLS1jaGlsZAorICAvLyBzZXJ2aWNlLWNsaWVudCBjbGFzc2VzIGhhdmUgb25seSBwcm9wZXJ0aWVzIGluaGVyaXRlZCBmcm9tIHRoZWlyCisgIC8vIHBhcmVudCBjbGFzcworICBpZiAoIWV4dGVuZHNfc2VydmljZSkgeworICAgIC8vIEdlbmVyYXRlIGNsaWVudCBwcm9wZXJ0aWVzCisgICAgZl9zZXJ2aWNlXyA8PCAiZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50UHJvcGVydGllcyIgPDwgZW5kbCA8PCAieyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgUFJPUF8wLCIgPDwgZW5kbCA8PCAiICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0wsIiA8PCBlbmRsIDw8ICIgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0wiIDw8IGVuZGwgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBzZXR0ZXIKKyAgICBmX3NlcnZpY2VfIDw8ICJ2b2lkIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfc2V0X3Byb3BlcnR5ICgiCisgICAgICAgICAgICAgICA8PCAiR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgY29uc3QgR1ZhbHVlICp2YWx1ZSwgIgorICAgICAgICAgICAgICAgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UIChvYmplY3QpOyIgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBjYXNlIFBST1BfIgorICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBjbGllbnQtPmlucHV0X3Byb3RvY29sID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8ICIgICAgY2FzZSBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGNsaWVudC0+b3V0cHV0X3Byb3RvY29sID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8ICIgIH0iIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIGdlbmVyYXRlIHByb3BlcnR5IGdldHRlcgorICAgIGZfc2VydmljZV8gPDwgInZvaWQiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfcHJvcGVydHkgKCIKKyAgICAgICAgICAgICAgIDw8ICJHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLCBHVmFsdWUgKnZhbHVlLCAiCisgICAgICAgICAgICAgICA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsIDw8ICIgICIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlQgKG9iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgc3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGwgPDwgIiAgeyIgPDwgZW5kbCA8PCAiICAgIGNhc2UgUFJPUF8iCisgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIGNsaWVudC0+aW5wdXRfcHJvdG9jb2wpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICAgIGNhc2UgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBjbGllbnQtPm91dHB1dF9wcm90b2NvbCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8ICIgIH0iIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcyBhbmQgZXhjZXB0aW9ucworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgLy8gRnVuY3Rpb24gZm9yIHNlbmRpbmcKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9zZW5kXyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKworICAgIC8vIE9wZW4gdGhlIHNlbmQgZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgc3RyaW5nIHJlcVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRfT05FV0FZIiA6ICJUX0NBTEwiOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIGNzZXFpZCA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKiBwcm90b2NvbCA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IGJhc2Vfc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVCAoaWZhY2UpLT5vdXRwdXRfcHJvdG9jb2w7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCBcIiIgPDwgbmFtZSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8IHJlcVR5cGUgPDwgIiwgY3NlcWlkLCBlcnJvcikgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihmX3NlcnZpY2VfLCBhcmdfc3RydWN0LCAiIiwgIiIsIGZhbHNlKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBlcnJvcikgPCAwKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgImlmICghdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgImlmICghdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFRSVUU7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgLy8gR2VuZXJhdGUgcmVjdiBmdW5jdGlvbiBvbmx5IGlmIG5vdCBhbiBhc3luYyBmdW5jdGlvbgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50X3JlY3ZfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnaW50MzIgcnNlcWlkOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ2NoYXIgKiBmbmFtZSA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRNZXNzYWdlVHlwZSBtdHlwZTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFByb3RvY29sICogcHJvdG9jb2wgPSAiCisgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBiYXNlX3NlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgICA8PCAiX0NMSUVOVCAoaWZhY2UpLT5pbnB1dF9wcm90b2NvbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gIgorICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLCAmZm5hbWUsICZtdHlwZSwgJnJzZXFpZCwgZXJyb3IpIDwgMCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gVF9FWENFUFRJT04pIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ4Y2VwdGlvbiA9IGdfb2JqZWN0X25ldyAiCisgICAgICAgICAgICAgICAgICAgICIoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoeGNlcHRpb24pLCAiCisgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbCwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAiCisgICAgICAgICAgICAgICAgICAgICIocHJvdG9jb2wsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAiCisgICAgICAgICAgICAgICAgICAgICIocHJvdG9jb2wtPnRyYW5zcG9ydCwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnX3NldF9lcnJvciAoZXJyb3IsICIKKyAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IseGNlcHRpb24tPnR5cGUsICIKKyAgICAgICAgICAgICAgICAgICAgIlwiYXBwbGljYXRpb24gZXJyb3I6ICVzXCIsIHhjZXB0aW9uLT5tZXNzYWdlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiAobXR5cGUgIT0gVF9SRVBMWSkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgVF9TVFJVQ1QsICIKKyAgICAgICAgICAgICAgICAgICAgIk5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICAgICAgICAgICJOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKCIKKyAgICAgICAgICAgICAgICAgICAgInByb3RvY29sLT50cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19zZXRfZXJyb3IgKGVycm9yLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfTUVTU0FHRV9UWVBFLCAiCisgICAgICAgICAgICAgICAgICAgICJcImludmFsaWQgbWVzc2FnZSB0eXBlICVkLCBleHBlY3RlZCBUX1JFUExZXCIsIG10eXBlKTsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIChzdHJuY21wIChmbmFtZSwgXCIiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICAgPDwgIlwiLCAiIDw8IG5hbWUubGVuZ3RoKCkgPDwgIikgIT0gMCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBUX1NUUlVDVCwgIgorICAgICAgICAgICAgICAgICAgICAiTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIgorICAgICAgICAgICAgICAgICAgICAiZXJyb3IpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoIgorICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19zZXRfZXJyb3IgKGVycm9yLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1dST05HX01FVEhPRF9OQU1FLCAiCisgICAgICAgICAgICAgICAgICAgICJcIndyb25nIG1ldGhvZCBuYW1lICVzLCBleHBlY3RlZCAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICAgIHsKKyAgICAgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgICAgIHRfZmllbGQgc3VjY2VzcygoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICIqX3JldHVybiIsIDApOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgcmVhZGVycyBmb3IgZXhjZXB0aW9ucywgZGVyZWZlcmVuY2luZyB0aGUgcG9pbnRlci4KKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgeF9pdGVyKyspIHsKKyAgICAgICAgICB0X2ZpZWxkKiB4Y2VwdGlvbiA9IG5ldyB0X2ZpZWxkKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqIiArICgqeF9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X2tleSgpKTsKKyAgICAgICAgICByZXN1bHQuYXBwZW5kKHhjZXB0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoZl9zZXJ2aWNlXywgJnJlc3VsdCwgIiIsICIiLCBmYWxzZSk7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIGVycm9yKSA8IDApIgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiaWYgKCF0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcikpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgLy8gY29weSBvdmVyIGFueSB0aHJvdyBleGNlcHRpb25zIGFuZCByZXR1cm4gZmFpbHVyZQorICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgeF9pdGVyKyspIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCoiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBnX3NldF9lcnJvciAoZXJyb3IsICIKKyAgICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgICAgICA8PCB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpKQorICAgICAgICAgICAgICAgICAgIDw8ICJfRVJST1IsICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICAgICAgPDwgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICA8PCAiX0VSUk9SX0NPREUsIFwiIiA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gVFJVRTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICB0X2Z1bmN0aW9uIHNlcnZpY2VfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcoIl9jbGllbnRfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZXJ2aWNlX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gd3JhcCBlYWNoIGZ1bmN0aW9uCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfc2VuZF8iCisgICAgICAgICAgICAgICA8PCBmdW5uYW1lIDw8ICIgKGlmYWNlIjsKKworICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiLCBlcnJvcikpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisKKyAgICAvLyBpZiBub3Qgb25ld2F5LCBpbXBsZW1lbnQgcmVjdgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJldCA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpID8gIiIgOiAiX3JldHVybiwgIjsKKworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICByZXQgKz0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICByZXQgKz0gIiwgIjsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfcmVjdl8iCisgICAgICAgICAgICAgICAgIDw8IGZ1bm5hbWUgPDwgIiAoaWZhY2UsICIgPDwgcmV0IDw8ICJlcnJvcikpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gcmV0dXJuIFRSVUUgd2hpY2ggbWVhbnMgYWxsIGZ1bmN0aW9ucyB3ZXJlIGNhbGxlZCBPSworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIFRSVUU7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgLy8gY3JlYXRlIHRoZSBpbnRlcmZhY2UgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgKmlmYWNlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KKyAgICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlLT4iIDw8IGZ1bm5hbWUgPDwgIiA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjCisgICAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF8iIDw8IGZ1bm5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGNsaWVudCBpbnN0YW5jZSBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfaW5pdCAoIgorICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoIWV4dGVuZHNfc2VydmljZSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNsaWVudC0+aW5wdXRfcHJvdG9jb2wgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNsaWVudC0+b3V0cHV0X3Byb3RvY29sID0gTlVMTDsiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGNsaWVudCk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGNsaWVudCBjbGFzcyBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgPDwgIl9jbGllbnRfY2xhc3NfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MgKmNscykiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgICA8PCAiX2NsaWVudF9zZXRfcHJvcGVydHk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMKKyAgICAgICAgICAgICAgIDw8ICJfY2xpZW50X2dldF9wcm9wZXJ0eTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwiaW5wdXRfcHJvdG9jb2xcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlucHV0IHByb3RvY29sIChjb25zdHJ1Y3QpXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTZXQgdGhlIGNsaWVudCBpbnB1dCBwcm90b2NvbFwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0wsIHBhcmFtX3NwZWMpOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoXCJvdXRwdXRfcHJvdG9jb2xcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm91dHB1dCBwcm90b2NvbCAoY29uc3RydWN0KVwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2V0IHRoZSBjbGllbnQgb3V0cHV0IHByb3RvY29sXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0wsIHBhcmFtX3NwZWMpOyIgPDwgZW5kbDsKKyAgfQorICBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgIFRIUklGVF9VTlVTRURfVkFSIChjbHMpOyIgPDwgZW5kbDsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBoYW5kbGVyLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgYSBoYW5kbGVyLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oYW5kbGVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jdGlvbl9pdGVyOworCisgIHN0cmluZyBzZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKSk7CisgIHN0cmluZyBzZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfbmFtZV9sYyk7CisKKyAgc3RyaW5nIHNlcnZpY2VfaGFuZGxlcl9uYW1lID0gc2VydmljZV9uYW1lXyArICJIYW5kbGVyIjsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfaGFuZGxlcl9uYW1lOworICBzdHJpbmcgY2xhc3NfbmFtZV9sYyA9IHRoaXMtPm5zcGFjZV9sYyArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2hhbmRsZXJfbmFtZSk7CisgIHN0cmluZyBjbGFzc19uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShjbGFzc19uYW1lX2xjKTsKKworICBzdHJpbmcgcGFyZW50X2NsYXNzX25hbWU7CisgIHN0cmluZyBwYXJlbnRfdHlwZV9uYW1lOworCisgIHN0cmluZyBhcmdzX2luZGVudDsKKworICAvLyBUaGUgc2VydmljZSB0aGlzIHNlcnZpY2UgZXh0ZW5kcywgb3IgTlVMTCBpZiBpdCBleHRlbmRzIG5vIHNlcnZpY2UKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBEZXRlcm1pbmUgdGhlIG5hbWUgb2Ygb3VyIHBhcmVudCBzZXJ2aWNlIChpZiBhbnkpIGFuZCB0aGUgaGFuZGxlciBjbGFzcycKKyAgLy8gcGFyZW50IGNsYXNzIG5hbWUgYW5kIHR5cGUKKyAgaWYgKGV4dGVuZHNfc2VydmljZSkgeworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lID0gZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocGFyZW50X3NlcnZpY2VfbmFtZSkpOworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwYXJlbnRfc2VydmljZV9uYW1lX2xjKTsKKworICAgIHBhcmVudF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJIYW5kbGVyIjsKKyAgICBwYXJlbnRfdHlwZV9uYW1lID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgKyAiX0hBTkRMRVIiOworICB9IGVsc2UgeworICAgIHBhcmVudF9jbGFzc19uYW1lID0gIkdPYmplY3QiOworICAgIHBhcmVudF90eXBlX25hbWUgPSAiR19UWVBFX09CSkVDVCI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcycgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyIGZpbGUKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBpbnN0YW5jZSBkZWZpbml0aW9uCisgIGZfaGVhZGVyXyA8PCAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgaGFuZGxlciAoYWJzdHJhY3QgYmFzZSBjbGFzcykgKi8iIDw8IGVuZGwgPDwgInN0cnVjdCBfIgorICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICIgcGFyZW50OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiICIgPDwgY2xhc3NfbmFtZSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcyBkZWZpbml0aW9uLCBpbmNsdWRpbmcgaXRzIGNsYXNzIG1lbWJlcnMKKyAgLy8gKG1ldGhvZHMpCisgIGZfaGVhZGVyXyA8PCAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdF90eXBlKiByZXR1cm5fdHlwZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeF9saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGJvb2wgaGFzX3JldHVybiA9ICFyZXR1cm5fdHlwZS0+aXNfdm9pZCgpOworICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4X2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisKKyAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHJldHVybl90eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnX2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhfbGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7CisKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiZ2Jvb2xlYW4gKCoiIDw8IG1ldGhvZF9uYW1lIDw8ICIpICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MgIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICA8PCAiQ2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHJlbWFpbmluZyBoZWFkZXIgYm9pbGVycGxhdGUKKyAgZl9oZWFkZXJfIDw8ICJHVHlwZSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIgIgorICAgICAgICAgICAgPDwgIigiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICIob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiwgIiA8PCBjbGFzc19uYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSLCAiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVJfQ0xBU1MoYykgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9IQU5ETEVSKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MnIG1ldGhvZCBkZWZpbml0aW9ucworICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4X2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgYm9vbCBoYXNfcmV0dXJuID0gIXJldHVybl90eXBlLT5pc192b2lkKCk7CisgICAgYm9vbCBoYXNfYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKworICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUocmV0dXJuX3R5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdfbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeF9saXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKKworICAgIGZfaGVhZGVyXyA8PCAiZ2Jvb2xlYW4gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBtZXRob2RfbmFtZSA8PCAiICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyJ3MgaW1wbGVtZW50YXRpb24gaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUKKworICAvLyBHZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gYm9pbGVycGxhdGUKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgKmlmYWNlKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKDI1LCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoIiA8PCBjbGFzc19uYW1lIDw8ICIsICIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfbGMgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgcGFyZW50X3R5cGVfbmFtZSA8PCAiLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwiIDw8IGVuZGw7CisgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCkpIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhmdW5jdGlvbl9uYW1lKTsKKyAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4X2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX2xpc3QtPmdldF9tZW1iZXJzKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geF9saXN0LT5nZXRfbWVtYmVycygpOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmllbGRfaXRlcjsKKworICAgIHRfZnVuY3Rpb24gaW1wbGVtZW50aW5nX2Z1bmN0aW9uKHJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArICJfaGFuZGxlcl8iICsgbWV0aG9kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKTsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJmltcGxlbWVudGluZ19mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3JldHVybl92YWxfaWZfZmFpbCAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIgKGlmYWNlKSwgRkFMU0UpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicmV0dXJuICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0dFVF9DTEFTUyAoaWZhY2UpIgorICAgICAgICAgICAgICAgPDwgIi0+IiA8PCBtZXRob2RfbmFtZSA8PCAiIChpZmFjZSwgIjsKKworICAgIGlmICghcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiX3JldHVybiwgIjsKKyAgICB9CisgICAgZm9yIChmaWVsZF9pdGVyID0gYXJncy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrZmllbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZpZWxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICI7CisgICAgfQorICAgIGZvciAoZmllbGRfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICgqZmllbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGludGVyZmFjZSBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBzZXJ2aWNlX25hbWVfbGMKKyAgICAgICAgICAgICA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZS0+IiA8PCBtZXRob2RfbmFtZSA8PCAiID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIgorICAgICAgICAgICAgICAgICA8PCBtZXRob2RfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGluc3RhbmNlIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9pbml0ICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZikiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcyBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9jbGFzc19pbml0ICgiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzICpjbHMpIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOworICAgICAgICAgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7CisgICAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoZnVuY3Rpb25fbmFtZSk7CisKKyAgICAgIC8vIEFsbCBtZXRob2RzIGFyZSBwdXJlIHZpcnR1YWwgYW5kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2xzLT4iIDw8IG1ldGhvZF9uYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGNscyk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIHByb2Nlc3Nvci4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIGEgcHJvY2Vzc29yCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY3Rpb25faXRlcjsKKworICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOworICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOworCisgIHN0cmluZyBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lID0gc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IiOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9wcm9jZXNzb3JfbmFtZTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfbGMgPSB0aGlzLT5uc3BhY2VfbGMgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9wcm9jZXNzb3JfbmFtZSk7CisgIHN0cmluZyBjbGFzc19uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShjbGFzc19uYW1lX2xjKTsKKworICBzdHJpbmcgcGFyZW50X2NsYXNzX25hbWU7CisgIHN0cmluZyBwYXJlbnRfdHlwZV9uYW1lOworCisgIHN0cmluZyBoYW5kbGVyX2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIkhhbmRsZXIiOworICBzdHJpbmcgaGFuZGxlcl9jbGFzc19uYW1lX2xjID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGhhbmRsZXJfY2xhc3NfbmFtZSk7CisKKyAgc3RyaW5nIHByb2Nlc3NfZnVuY3Rpb25fdHlwZV9uYW1lID0gY2xhc3NfbmFtZSArICJQcm9jZXNzRnVuY3Rpb24iOworICBzdHJpbmcgcHJvY2Vzc19mdW5jdGlvbl9kZWZfdHlwZV9uYW1lID0KKyAgICBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZiI7CisKKyAgc3RyaW5nIGZ1bmN0aW9uX25hbWU7CisgIHN0cmluZyBhcmdzX2luZGVudDsKKworICAvLyBUaGUgc2VydmljZSB0aGlzIHNlcnZpY2UgZXh0ZW5kcywgb3IgTlVMTCBpZiBpdCBleHRlbmRzIG5vIHNlcnZpY2UKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBEZXRlcm1pbmUgdGhlIG5hbWUgb2Ygb3VyIHBhcmVudCBzZXJ2aWNlIChpZiBhbnkpIGFuZCB0aGUKKyAgLy8gcHJvY2Vzc29yIGNsYXNzJyBwYXJlbnQgY2xhc3MgbmFtZSBhbmQgdHlwZQorICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWUgPSBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhwYXJlbnRfc2VydmljZV9uYW1lKSk7CisgICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHBhcmVudF9zZXJ2aWNlX25hbWVfbGMpOworCisgICAgcGFyZW50X2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBwYXJlbnRfc2VydmljZV9uYW1lICsgIlByb2Nlc3NvciI7CisgICAgcGFyZW50X3R5cGVfbmFtZSA9IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBwYXJlbnRfc2VydmljZV9uYW1lX3VjICsgIl9QUk9DRVNTT1IiOworICB9IGVsc2UgeworICAgIHBhcmVudF9jbGFzc19uYW1lID0gIlRocmlmdERpc3BhdGNoUHJvY2Vzc29yIjsKKyAgICBwYXJlbnRfdHlwZV9uYW1lID0gIlRIUklGVF9UWVBFX0RJU1BBVENIX1BST0NFU1NPUiI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yIGNsYXNzJyBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIgZmlsZQorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IgaW5zdGFuY2UgZGVmaW5pdGlvbgorICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHByb2Nlc3NvciAqLyIgPDwgZW5kbCA8PCAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgZW5kbAorICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIiBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICIvKiBwcm90ZWN0ZWQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSGFuZGxlciAqaGFuZGxlcjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJHSGFzaFRhYmxlICpwcm9jZXNzX21hcDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIiAiIDw8IGNsYXNzX25hbWUgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvciBjbGFzcyBkZWZpbml0aW9uCisgIGZfaGVhZGVyXyA8PCAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICIvKiBwcm90ZWN0ZWQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJnYm9vbGVhbiAoKmRpc3BhdGNoX2NhbGwpIChUaHJpZnREaXNwYXRjaFByb2Nlc3NvciAqcHJvY2Vzc29yLCIgPDwgZW5kbDsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygyNywgJyAnKTsKKyAgZl9oZWFkZXJfIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqaW4sIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqb3V0LCIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdjaGFyICpmbmFtZSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiBzZXFpZCwiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHRXJyb3IgKiplcnJvcik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyAiIDw8IGNsYXNzX25hbWUKKyAgICAgICAgICAgIDw8ICJDbGFzczsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcmVtYWluaW5nIGhlYWRlciBib2lsZXJwbGF0ZQorICBmX2hlYWRlcl8gPDwgIkdUeXBlICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SICIKKyAgICAgICAgICAgIDw8ICIoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3R5cGUoKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjCisgICAgICAgICAgICA8PCAiKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiwgIiA8PCBjbGFzc19uYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgY2xhc3NfbmFtZV91YworICAgICAgICAgICAgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SLCAiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUl9DTEFTUyhjKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX1BST0NFU1NPUikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9QUk9DRVNTT1JfR0VUX0NMQVNTKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SLCAiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgaW1wbGVtZW50YXRpb24gaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvcGVydGllcyBlbnVtCisgIGZfc2VydmljZV8gPDwgImVudW0gXyIgPDwgY2xhc3NfbmFtZSA8PCAiUHJvcGVydGllcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfMCwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlBST1BfIgorICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBib2lsZXJwbGF0ZQorICBhcmdzX2luZGVudCA9IHN0cmluZygxNSwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAiR19ERUZJTkVfVFlQRSAoIiA8PCBjbGFzc19uYW1lIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IGNsYXNzX25hbWVfbGMKKyAgICAgICAgICAgICA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBwYXJlbnRfdHlwZV9uYW1lIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb2Nlc3NpbmctZnVuY3Rpb24gdHlwZQorICBhcmdzX2luZGVudCA9IHN0cmluZyhwcm9jZXNzX2Z1bmN0aW9uX3R5cGVfbmFtZS5sZW5ndGgoKSArIDIzLCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJ0eXBlZGVmIGdib29sZWFuICgqICIgPDwgcHJvY2Vzc19mdW5jdGlvbl90eXBlX25hbWUgPDwgIikgKCIKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lIDw8ICIgKiwgIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nLWZ1bmN0aW9uLWRlZmluaXRpb24gdHlwZQorICBmX3NlcnZpY2VfIDw8ICJ0eXBlZGVmIHN0cnVjdCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2NoYXIgKm5hbWU7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgcHJvY2Vzc19mdW5jdGlvbl90eXBlX25hbWUgPDwgIiBmdW5jdGlvbjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgIn0gIiA8PCBwcm9jZXNzX2Z1bmN0aW9uX2RlZl90eXBlX25hbWUgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBzbyB3ZQorICAvLyBjYW4gcmVmZXIgdG8gdGhlbSBpbiB0aGUgcHJvY2Vzc2luZy1mdW5jdGlvbi1kZWZpbml0aW9uIHN0cnVjdCBiZWxvdyBhbmQKKyAgLy8ga2VlcCBhbGwgb2YgdGhlIHByb2Nlc3NvcidzIGRlY2xhcmF0aW9ucyBpbiBvbmUgcGxhY2UKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgICAgICAgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7CisgICAgICAgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3Byb2Nlc3NfIgorICAgICAgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgZ2Jvb2xlYW4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoIgorICAgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCAiICosIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJHRXJyb3IgKiopOyIgPDwgZW5kbDsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb2Nlc3NpbmctZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGlmIHRoZSBzZXJ2aWNlCisgIC8vIGRlZmluZXMgYW55IG1ldGhvZHMKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljICIgPDwgcHJvY2Vzc19mdW5jdGlvbl9kZWZfdHlwZV9uYW1lCisgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcHJvY2Vzc19mdW5jdGlvbl9kZWZzWyIKKyAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9ucy5zaXplKCkgPDwgIl0gPSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICAgICAgICAgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7CisgICAgICAgICArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIHByb2Nlc3NfZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3Byb2Nlc3NfIgorICAgICAgICArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJcIiIgPDwgc2VydmljZV9mdW5jdGlvbl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgcHJvY2Vzc19mdW5jdGlvbl9uYW1lIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICAgICAgICAgPDwgKGZ1bmN0aW9uX2l0ZXIgPT0gLS1mdW5jdGlvbnMuZW5kKCkgPyAiIiA6ICIsIikgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nIGZ1bmN0aW9ucworICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfaWMgPSB1bmRlcnNjb3Jlc190b19pbml0aWFsX2NhcHMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKKyAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lX2xjID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfZnVuY3Rpb25fbmFtZSk7CisgICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2Uoc2VydmljZV9mdW5jdGlvbl9uYW1lX2xjKTsKKworICAgIHRfdHlwZSogcmV0dXJuX3R5cGUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIGJvb2wgaGFzX3JldHVybl92YWx1ZSA9ICFyZXR1cm5fdHlwZS0+aXNfdm9pZCgpOworCisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX2xpc3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYXJnX2l0ZXI7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeGNlcHRpb25faXRlcjsKKworICAgIHN0cmluZyBhcmdzX2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX2ljICsgIkFyZ3MiOworICAgIHN0cmluZyBhcmdzX2NsYXNzX3R5cGUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgc2VydmljZV9uYW1lX3VjICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX3VjICsgIl9BUkdTIjsKKworICAgIHN0cmluZyByZXN1bHRfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfaWMgKyAiUmVzdWx0IjsKKyAgICBzdHJpbmcgcmVzdWx0X2NsYXNzX3R5cGUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgc2VydmljZV9uYW1lX3VjICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfdWMgKyAiX1JFU1VMVCI7CisKKyAgICBzdHJpbmcgaGFuZGxlcl9mdW5jdGlvbl9uYW1lID0gaGFuZGxlcl9jbGFzc19uYW1lX2xjICsgIl8iICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX2xjOworCisgICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3Byb2Nlc3NfIgorICAgICAgICAgICAgICAgICAgICArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOworCisgICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIGdib29sZWFuIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoIiA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYsIgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyIHNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8ICJUaHJpZnRQcm90b2NvbCAqb3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqZXJyb3IpIgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnYm9vbGVhbiByZXN1bHQgPSBUUlVFOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb247IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBhcmdzX2NsYXNzX25hbWUgKyAiICogYXJncyA9IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X25ldyAoIiA8PCBhcmdzX2NsYXNzX3R5cGUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpZiAoKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChzZXF1ZW5jZV9pZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAob3V0cHV0X3Byb3RvY29sKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfZ2V0IChpbnB1dF9wcm90b2NvbCwgXCJ0cmFuc3BvcnRcIiwgIgorICAgICAgICAgICAgICAgPDwgIiZ0cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gUmVhZCB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzIGZyb20gdGhlIGNhbGxlcgorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgodGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUIChhcmdzKSwgIgorICAgICAgICAgICAgICAgPDwgImlucHV0X3Byb3RvY29sLCBlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICAgICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoaW5wdXRfcHJvdG9jb2wsICIKKyAgICAgICAgICAgICAgIDw8ICJlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICAgICh0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsIGVycm9yKSAhPSBGQUxTRSkpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgZm9yIChhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBwcm9wZXJ0eV90eXBlX25hbWUoKCphcmdfaXRlciktPmdldF90eXBlKCkpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZm9yICh4Y2VwdGlvbl9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhjZXB0aW9uX2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKCgqeGNlcHRpb25faXRlciktPmdldF90eXBlKCkpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBwcm9wZXJ0eV90eXBlX25hbWUocmV0dXJuX3R5cGUpIDw8ICIgcmV0dXJuX3ZhbHVlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRfY2xhc3NfbmFtZSA8PCAiICogcmVzdWx0X3N0cnVjdDsiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmIChhcmdzLnNpemUoKSA+IDApIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2dldCAoYXJncywiIDw8IGVuZGw7CisgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDE0LCAnICcpOworICAgICAgZm9yIChhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdfaXRlcikgeworICAgICAgICBzdHJpbmcgYXJnX25hbWUgPSAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgYXJnX25hbWUgPDwgIlwiLCAmIiA8PCBhcmdfbmFtZSA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwpOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiZ19vYmplY3RfZ2V0IChvdXRwdXRfcHJvdG9jb2wsIFwidHJhbnNwb3J0XCIsICIKKyAgICAgICAgICAgICAgICAgPDwgIiZ0cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHRfc3RydWN0ID0gZ19vYmplY3RfbmV3ICgiIDw8IHJlc3VsdF9jbGFzc190eXBlIDw8ICIsIE5VTEwpOyIgPDwgZW5kbDsKKyAgICAgIGlmIChoYXNfcmV0dXJuX3ZhbHVlKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2dldCAocmVzdWx0X3N0cnVjdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcInN1Y2Nlc3NcIiwgJnJldHVybl92YWx1ZSwgTlVMTCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFBhc3MgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgaW4gdGhlIGhhbmRsZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBoYW5kbGVyX2Z1bmN0aW9uX25hbWUgPDwgIiAoIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGIChzZWxmLT5oYW5kbGVyKSwiIDw8IGVuZGw7CisgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyhoYW5kbGVyX2Z1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyA2LCAnICcpOworICAgIGlmIChoYXNfcmV0dXJuX3ZhbHVlKSB7CisgICAgICBzdHJpbmcgcmV0dXJuX3R5cGVfbmFtZSA9IHR5cGVfbmFtZShyZXR1cm5fdHlwZSk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQ7CisKKyAgICAgIC8vIENhc3QgcmV0dXJuX3ZhbHVlIGlmIGl0IHdhcyBkZWNsYXJlZCBhcyBhIHR5cGUgb3RoZXIgdGhhbiB0aGUgcmV0dXJuCisgICAgICAvLyB2YWx1ZSdzIGFjdHVhbCB0eXBlLS0tdGhpcyBpcyB0cnVlIGZvciBpbnRlZ2VyIHZhbHVlcyAzMiBiaXRzIG9yIGZld2VyCisgICAgICAvLyBpbiB3aWR0aCwgZm9yIHdoaWNoIEdMaWIgcmVxdWlyZXMgYSBwbGFpbiBnaW50IHR5cGUgYmUgdXNlZCB3aGVuCisgICAgICAvLyBzdG9yaW5nIG9yIHJldHJpZXZpbmcgYXMgYW4gb2JqZWN0IHByb3BlcnR5CisgICAgICBpZiAocmV0dXJuX3R5cGVfbmFtZSAhPSBwcm9wZXJ0eV90eXBlX25hbWUocmV0dXJuX3R5cGUpKSB7CisgICAgICAgIGlmIChyZXR1cm5fdHlwZV9uYW1lW3JldHVybl90eXBlX25hbWUubGVuZ3RoKCkgLSAxXSAhPSAnKicpIHsKKyAgICAgICAgICByZXR1cm5fdHlwZV9uYW1lICs9ICcgJzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm5fdHlwZV9uYW1lICs9ICcqJzsKKworICAgICAgICBmX3NlcnZpY2VfIDw8ICIoIiA8PCByZXR1cm5fdHlwZV9uYW1lIDw8ICIpIjsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCAiJnJldHVybl92YWx1ZSwiIDw8IGVuZGw7CisgICAgfQorICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGZvciAoeGNlcHRpb25faXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICImIiA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKSA9PSBUUlVFKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIFRoZSBoYW5kbGVyIHJlcG9ydGVkIHN1Y2Nlc3M7IHJldHVybiB0aGUgcmVzdWx0LCBpZiBhbnksIHRvIHRoZSBjYWxsZXIKKyAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9zZXQgKHJlc3VsdF9zdHJ1Y3QsIFwic3VjY2Vzc1wiLCAiOworICAgICAgICBpZiAodHlwZV9uYW1lKHJldHVybl90eXBlKSAhPSBwcm9wZXJ0eV90eXBlX25hbWUocmV0dXJuX3R5cGUpKSB7CisgICAgICAgICAgLy8gUm91bmR0cmlwIGNhc3QgdG8gZml4IHRoZSBwb3NpdGlvbiBvZiBzaWduIGJpdC4KKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIoIiA8PCBwcm9wZXJ0eV90eXBlX25hbWUocmV0dXJuX3R5cGUpIDw8ICIpIgorICAgICAgICAgICAgICAgICAgICAgPDwgIigiIDw8IHR5cGVfbmFtZShyZXR1cm5fdHlwZSkgPDwgIikiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybl92YWx1ZSwgIgorICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMKTsiIDw8IGVuZGw7CisKKyAgICAgICAgLy8gRGVhbGxvY2F0ZSAob3IgdW5yZWYpIHJldHVybl92YWx1ZQorICAgICAgICByZXR1cm5fdHlwZSA9IGdldF90cnVlX3R5cGUocmV0dXJuX3R5cGUpOworICAgICAgICBpZiAocmV0dXJuX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKXJldHVybl90eXBlKTsKKworICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmV0dXJuX3ZhbHVlICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICBpZiAoYmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2J5dGVfYXJyYXlfdW5yZWYgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19mcmVlIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJldHVybl90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXR1cm5fdmFsdWUgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICBpZiAocmV0dXJuX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopcmV0dXJuX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICAgICAgICBpZiAoaXNfbnVtZXJpYyhlbGVtX3R5cGUpKSB7CisgICAgICAgICAgICAgIGZfc2VydmljZV8gPDwgImdfYXJyYXlfdW5yZWYiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiZ19wdHJfYXJyYXlfdW5yZWYiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgaWYgKHJldHVybl90eXBlLT5pc19tYXAoKSB8fCByZXR1cm5fdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV91bnJlZiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5fdHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmV0dXJuX3ZhbHVlICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKG91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGw7CisgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDM5LCAnICcpOworICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8IHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgIDw8ICJUX1JFUExZLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgIDw8ICJlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHJlc3VsdF9zdHJ1Y3QpLCIgPDwgZW5kbDsKKyAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjMsICcgJyk7CisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgIT0gLTEpKTsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBUaGUgaGFuZGxlciByZXBvcnRlZCBmYWlsdXJlOyBjaGVjayB0byBzZWUgaWYgYW4gYXBwbGljYXRpb24tZGVmaW5lZAorICAgIC8vIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGFuZCBpZiBzbywgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgZm9yICh4Y2VwdGlvbl9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhjZXB0aW9uX2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiaWYgKCIgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3NldCAocmVzdWx0X3N0cnVjdCwiIDw8IGVuZGw7CisgICAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMTQsICcgJyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCAoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgICAgIDw8ICgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbDsKKyAgICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzOSwgJyAnKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8IHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgPDwgIlRfUkVQTFksIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHJlc3VsdF9zdHJ1Y3QpLCIgPDwgZW5kbDsKKyAgICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygyMywgJyAnKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpICE9IC0xKSk7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgaGFuZGxlciByZXBvcnRlZCBmYWlsdXJlIGJ1dCByYWlzZWQgbm8gYXBwbGljYXRpb24tZGVmaW5lZAorICAgIC8vIGV4Y2VwdGlvbiwgcmV0dXJuIGEgVGhyaWZ0IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB3aXRoIHRoZSBpbmZvcm1hdGlvbgorICAgIC8vIHJldHVybmVkIHZpYSBHTGliJ3Mgb3duIGVycm9yLXJlcG9ydGluZyBtZWNoYW5pc20KKyAgICBmX3NlcnZpY2VfIDw8ICJpZiAoKmVycm9yID09IE5VTEwpIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfd2FybmluZyAoXCIiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIi4iCisgICAgICAgICAgICAgICA8PCAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgRkFMU0UgXCIiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHN0cmluZygxMSwgJyAnKSA8PCAiXCJidXQgZGlkIG5vdCBzZXQgYW4gZXJyb3JcIik7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ4Y2VwdGlvbiA9IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCIgPDwgZW5kbDsKKyAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDE0LCAnICcpOworICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwidHlwZVwiLCAgICAqZXJyb3IgIT0gTlVMTCA/ICgqZXJyb3IpLT5jb2RlIDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8IHN0cmluZygxMSwgJyAnKSA8PCAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOLCIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIlwibWVzc2FnZVwiLCAqZXJyb3IgIT0gTlVMTCA/ICgqZXJyb3IpLT5tZXNzYWdlIDogTlVMTCwiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2NsZWFyX2Vycm9yIChlcnJvcik7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsOworICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzksICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8IHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCAiVF9FWENFUFRJT04sIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8ICJlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksIiA8PCBlbmRsOworICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjMsICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpICE9IC0xKSk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgLy8gRGVsbG9jYXRlIG9yIHVucmVmIHJldHJpZXZlZCBhcmd1bWVudCB2YWx1ZXMgYXMgbmVjZXNzYXJ5CisgICAgZm9yIChhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdfaXRlcikgeworICAgICAgc3RyaW5nIGFyZ19uYW1lID0gKCphcmdfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB0X3R5cGUqIGFyZ190eXBlID0gZ2V0X3RydWVfdHlwZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIGlmIChhcmdfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKWFyZ190eXBlKTsKKworICAgICAgICBpZiAoYmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGFyZ19uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfYnl0ZV9hcnJheV91bnJlZiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfZnJlZSAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoYXJnX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGFyZ19uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGlmIChhcmdfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopYXJnX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICAgIGlmIChpc19udW1lcmljKGVsZW1fdHlwZSkpIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgImdfYXJyYXlfdW5yZWYiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJnX3B0cl9hcnJheV91bnJlZiI7CisgICAgICAgICAgfQorICAgICAgICAgIGZfc2VydmljZV8gPDwgIiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnX3R5cGUtPmlzX21hcCgpIHx8IGFyZ190eXBlLT5pc19zZXQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV91bnJlZiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChhcmdfdHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgYXJnX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICgiIDw8IGFyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAocmVzdWx0X3N0cnVjdCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImlmIChyZXN1bHQgPT0gVFJVRSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAiCisgICAgICAgICAgICAgICAgIDw8ICIob3V0cHV0X3Byb3RvY29sLCBlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIGVycm9yKSAiCisgICAgICAgICAgICAgICAgIDw8ICIhPSBGQUxTRSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAodGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBlcnJvcikgIgorICAgICAgICAgICAgICAgICA8PCAiIT0gRkFMU0UpKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IEZBTFNFOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJnX29iamVjdF91bnJlZiAoYXJncyk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgZGlzcGF0Y2hfY2FsbCBpbXBsZW1lbnRhdGlvbgorICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfZGlzcGF0Y2hfY2FsbCI7CisgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgIGZfc2VydmljZV8gPDwgInN0YXRpYyBnYm9vbGVhbiIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lCisgICAgICAgICAgICAgPDwgIiAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKmRpc3BhdGNoX3Byb2Nlc3NvciwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKmlucHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJUaHJpZnRQcm90b2NvbCAqb3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2NoYXIgKm1ldGhvZF9uYW1lLCIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIgc2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIkdFcnJvciAqKmVycm9yKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmICoiCisgICAgICAgICAgICAgPDwgInByb2Nlc3NfZnVuY3Rpb25fZGVmOyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2Jvb2xlYW4gZGlzcGF0Y2hfcmVzdWx0ID0gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAoZGlzcGF0Y2hfcHJvY2Vzc29yKTsiIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIkNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKnBhcmVudF9jbGFzcyA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50ICgiIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9HRVRfQ0xBU1MgKHNlbGYpKTsiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInByb2Nlc3NfZnVuY3Rpb25fZGVmID0gIgorICAgICAgICAgICAgIDw8ICJnX2hhc2hfdGFibGVfbG9va3VwIChzZWxmLT5wcm9jZXNzX21hcCwgbWV0aG9kX25hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAocHJvY2Vzc19mdW5jdGlvbl9kZWYgIT0gTlVMTCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDUzLCAnICcpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2ZyZWUgKG1ldGhvZF9uYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZGlzcGF0Y2hfcmVzdWx0ID0gIgorICAgICAgICAgICAgIDw8ICIoKnByb2Nlc3NfZnVuY3Rpb25fZGVmLT5mdW5jdGlvbikgKHNlbGYsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgInNlcXVlbmNlX2lkLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJpbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcik7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAvLyBNZXRob2QgbmFtZSBub3QgcmVjb2duaXplZDsgY2hhaW4gdXAgdG8gb3VyIHBhcmVudCBwcm9jZXNzb3ItLS1ub3RlIHRoZQorICAvLyB0b3AtbW9zdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCwgaW4gVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgaXRzZWxmLAorICAvLyB3aWxsIHJldHVybiBhbiBhcHBsaWNhdGlvbiBleGNlcHRpb24gdG8gdGhlIGNhbGxlciBpZiBubyBjbGFzcyBpbiB0aGUKKyAgLy8gaGllcmFyY2h5IHJlY29nbml6ZXMgdGhlIG1ldGhvZCBuYW1lCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRpc3BhdGNoX3Jlc3VsdCA9IHBhcmVudF9jbGFzcy0+ZGlzcGF0Y2hfY2FsbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihkaXNwYXRjaF9wcm9jZXNzb3IsIiA8PCBlbmRsOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDQ3LCAnICcpOworICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJpbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAibWV0aG9kX25hbWUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZGlzcGF0Y2hfcmVzdWx0OyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9wZXJ0eSBzZXR0ZXIKKyAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3NldF9wcm9wZXJ0eSI7CisgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKEdPYmplY3QgKm9iamVjdCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJjb25zdCBHVmFsdWUgKnZhbHVlLCIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSBQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0hBTkRMRVI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPmhhbmRsZXIgIT0gTlVMTCkiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLT5oYW5kbGVyID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImdfb2JqZWN0X3JlZiAoc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsOworICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgLy8gQ2hhaW4gdXAgdG8gc2V0IHRoZSBoYW5kbGVyIGluIGV2ZXJ5IHN1cGVyY2xhc3MgYXMgd2VsbAorICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfQ0xBU1MgKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3BhcmVudF9jbGFzcyktPiIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2V0X3Byb3BlcnR5IChvYmplY3QsIHByb3BlcnR5X2lkLCB2YWx1ZSwgcHNwZWMpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yJ3MgcHJvcGVydHkgZ2V0dGVyCisgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9nZXRfcHJvcGVydHkiOworICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1ZhbHVlICp2YWx1ZSwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhc2UgUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRvciB0aGUgcHJvY2Vzc29yJ3MgZGlzcG9zZSBmdW5jdGlvbgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcG9zZSAoR09iamVjdCAqZ29iamVjdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChnb2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+aGFuZGxlciAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChzZWxmLT5oYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAic2VsZi0+aGFuZGxlciA9IE5VTEw7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX0NMQVNTICgiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wYXJlbnRfY2xhc3MpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+ZGlzcG9zZSAoZ29iamVjdCk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBwcm9jZXNzb3IgZmluYWxpemUgZnVuY3Rpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2ZpbmFsaXplIChHT2JqZWN0ICpnb2JqZWN0KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciAqc2VsZiA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SIChnb2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJ0aHJpZnRfc2FmZV9oYXNoX3RhYmxlX2Rlc3Ryb3kgKHNlbGYtPnByb2Nlc3NfbWFwKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJHX09CSkVDVF9DTEFTUyAoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcGFyZW50X2NsYXNzKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5maW5hbGl6ZSAoZ29iamVjdCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yIGluc3RhbmNlIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9pbml0ICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZikiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImd1aW50IGluZGV4OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLT5oYW5kbGVyID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAic2VsZi0+cHJvY2Vzc19tYXAgPSAiCisgICAgICAgICAgICAgICAgImdfaGFzaF90YWJsZV9uZXcgKGdfc3RyX2hhc2gsIGdfc3RyX2VxdWFsKTsiIDw8IGVuZGw7CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKDIxLCAnICcpOworICAgIGZfc2VydmljZV8gPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaW5kZXggPSAwOyBpbmRleCA8ICIKKyAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9ucy5zaXplKCkgPDwgIjsgaW5kZXggKz0gMSkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX2luc2VydCAoc2VsZi0+cHJvY2Vzc19tYXAsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmc1tpbmRleF0ubmFtZSwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCAiJiIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmc1tpbmRleF0iIDw8ICIpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yIGNsYXNzIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9jbGFzc19pbml0ICgiIDw8IGNsYXNzX25hbWUKKyAgICAgICAgICAgICA8PCAiQ2xhc3MgKmNscykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcyAqZGlzcGF0Y2hfcHJvY2Vzc29yX2NsYXNzID0iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0NMQVNTIChjbHMpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcG9zZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9maW5hbGl6ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfcHJvcGVydHk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJkaXNwYXRjaF9wcm9jZXNzb3JfY2xhc3MtPmRpc3BhdGNoX2NhbGwgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9kaXNwYXRjaF9jYWxsOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjbHMtPmRpc3BhdGNoX2NhbGwgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9kaXNwYXRjaF9jYWxsOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0IChcImhhbmRsZXJcIiwiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzNCwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCJTZXJ2aWNlIGhhbmRsZXIgaW1wbGVtZW50YXRpb25cIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCAiXCJUaGUgc2VydmljZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uIFwiIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIlwidG8gd2hpY2ggbWV0aG9kIGNhbGxzIGFyZSBkaXNwYXRjaGVkLlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBzZXJ2aWNlX25hbWVfdWMgKyAiX0hBTkRMRVIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDMzLCAnICcpOworICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0hBTkRMRVIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgInBhcmFtX3NwZWMpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIHNlcnZlci4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2aWNlJ3MgaGFuZGxlciBjbGFzcworICBnZW5lcmF0ZV9zZXJ2aWNlX2hhbmRsZXIodHNlcnZpY2UpOworCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2aWNlJ3MgcHJvY2Vzc29yIGNsYXNzCisgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRvIHJlcHJlc2VudCBhIFRIcmlmdCBzdHJ1Y3R1cmUgYXMgYSBHT2JqZWN0LgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2JqZWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBuYW1lOworICBzdHJpbmcgY2xhc3NfbmFtZV9sYyA9IHRoaXMtPm5zcGFjZV9sYyArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGNsYXNzX25hbWVfbGMpOworCisgIHN0cmluZyBmdW5jdGlvbl9uYW1lOworICBzdHJpbmcgYXJnc19pbmRlbnQ7CisKKyAgLy8gd3JpdGUgdGhlIGluc3RhbmNlIGRlZmluaXRpb24KKyAgZl90eXBlc18gPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCBlbmRsIDw8ICJ7ICIgPDwgZW5kbAorICAgICAgICAgICA8PCAiICBUaHJpZnRTdHJ1Y3QgcGFyZW50OyAiIDw8IGVuZGwgPDwgZW5kbCA8PCAiICAvKiBwdWJsaWMgKi8iIDw8IGVuZGw7CisKKyAgLy8gZm9yIGVhY2ggZmllbGQsIGFkZCBhIG1lbWJlciB2YXJpYWJsZQorICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGZfdHlwZXNfIDw8ICIgICIgPDwgdHlwZV9uYW1lKHQpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIgIGdib29sZWFuIF9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gY2xvc2UgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uIGFuZCBjcmVhdGUgYSB0eXBlZGVmCisgIGZfdHlwZXNfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgdGhlIGNsYXNzIGRlZmluaXRpb24KKyAgZl90eXBlc18gPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiAgVGhyaWZ0U3RydWN0Q2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcyAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzczsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyB3cml0ZSB0aGUgc3RhbmRhcmQgR09iamVjdCBib2lsZXJwbGF0ZQorICBmX3R5cGVzXyA8PCAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiAoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91CisgICAgICAgICAgIDw8ICJfZ2V0X3R5cGUoKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YworICAgICAgICAgICA8PCAiKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjCisgICAgICAgICAgIDw8ICIsICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgIDw8IG5hbWVfdWMgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIl9UWVBFXyIKKyAgICAgICAgICAgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IG5hbWVfdWMgPDwgIihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgPDwgIklTXyIgPDwgbmFtZV91YyA8PCAiX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMKKyAgICAgICAgICAgPDwgIl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gc3RhcnQgd3JpdGluZyB0aGUgb2JqZWN0IGltcGxlbWVudGF0aW9uIC5jIGZpbGUKKworICAvLyBnZW5lcmF0ZSBwcm9wZXJ0aWVzIGVudW0KKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZfdHlwZXNfaW1wbF8gPDwgImVudW0gXyIgPDwgY2xhc3NfbmFtZSA8PCAiUHJvcGVydGllcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiXzAiOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZV91YworICAgICAgICAgID0gdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKm1faXRlciktPmdldF9uYW1lKCkpKSk7CisKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfIiA8PCBtZW1iZXJfbmFtZV91YzsKKyAgICB9CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc19pbXBsXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIGdlbmVyYXRlIHN0cnVjdCBJL08gbWV0aG9kcworICBzdHJpbmcgdGhpc19nZXQgPSB0aGlzLT5uc3BhY2UgKyBuYW1lICsgIiAqIHRoaXNfb2JqZWN0ID0gIiArIHRoaXMtPm5zcGFjZV91YyArIG5hbWVfdWMKKyAgICAgICAgICAgICAgICAgICAgKyAiKG9iamVjdCk7IjsKKyAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCAidGhpc19vYmplY3QtPiIsIHRoaXNfZ2V0KTsKKyAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCAidGhpc19vYmplY3QtPiIsIHRoaXNfZ2V0KTsKKworICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBzZXR0ZXIgYW5kIGdldHRlcgorICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgc2V0dGVyCisgICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3NldF9wcm9wZXJ0eSI7CisgICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgICAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICA8PCAiY29uc3QgR1ZhbHVlICp2YWx1ZSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCisgICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl9uYW1lKSkpOworICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKworICAgICAgc3RyaW5nIHByb3BlcnR5X2lkZW50aWZpZXIgPSAiUFJPUF8iICsgY2xhc3NfbmFtZV91YyArICJfIiArIG1lbWJlcl9uYW1lX3VjOworCisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgcHJvcGVydHlfaWRlbnRpZmllciArICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKW1lbWJlcl90eXBlKTsKKyAgICAgICAgc3RyaW5nIGFzc2lnbl9mdW5jdGlvbl9uYW1lOworCisgICAgICAgIGlmIChiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgc3RyaW5nIHJlbGVhc2VfZnVuY3Rpb25fbmFtZTsKKworICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICBpZiAoYmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfYnl0ZV9hcnJheV91bnJlZiI7CisgICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2R1cF9ib3hlZCI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2ZyZWUiOworICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfc3RyaW5nIjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA8PCAiIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2Jvb2xlYW4iOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfaW50IjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2dldF9pbnQ2NCI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfZG91YmxlIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBiYXNlIHR5cGUgXCIiICsgYmFzZV90eXBlLT5nZXRfbmFtZSgpICsgIlwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igc3RydWN0IG1lbWJlciBcIiIKKyAgICAgICAgICAgICAgICArIG1lbWJlcl9uYW1lICsgIlwiIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiA9ICIgPDwgYXNzaWduX2Z1bmN0aW9uX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiICh2YWx1ZSk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgc3RyaW5nIHJlbGVhc2VfZnVuY3Rpb25fbmFtZTsKKyAgICAgICAgc3RyaW5nIGFzc2lnbl9mdW5jdGlvbl9uYW1lOworCisgICAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopbWVtYmVyX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICAgICAgICAvLyBMaXN0cyBvZiBiYXNlIHR5cGVzIG90aGVyIHRoYW4gc3RyaW5ncyBhcmUgcmVwcmVzZW50ZWQgYXMgR0FycmF5czsKKyAgICAgICAgICAvLyBhbGwgb3RoZXJzIGFzIEdQdHJBcnJheXMKKyAgICAgICAgICBpZiAoaXNfbnVtZXJpYyhlbGVtX3R5cGUpKSB7CisgICAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19hcnJheV91bnJlZiI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX3B0cl9hcnJheV91bnJlZiI7CisgICAgICAgICAgfQorCisgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfYm94ZWQiOworICAgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zZXQoKSB8fCBtZW1iZXJfdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19oYXNoX3RhYmxlX3VucmVmIjsKKyAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2R1cF9ib3hlZCI7CisgICAgICAgIH0KKworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPDwgIiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gIiA8PCBhc3NpZ25fZnVuY3Rpb25fbmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgKHZhbHVlKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zdHJ1Y3QoKSB8fCBtZW1iZXJfdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaWYgKG1lbWJlci0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+X19pc3NldF8iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSBUUlVFOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworCisgICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgZ2V0dGVyCisgICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX2dldF9wcm9wZXJ0eSI7CisgICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgICAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHVmFsdWUgKnZhbHVlLCIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCisgICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl9uYW1lKSkpOworICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKworICAgICAgc3RyaW5nIHByb3BlcnR5X2lkZW50aWZpZXIgPSAiUFJPUF8iICsgY2xhc3NfbmFtZV91YyArICJfIiArIG1lbWJlcl9uYW1lX3VjOworCisgICAgICBzdHJpbmcgc2V0dGVyX2Z1bmN0aW9uX25hbWU7CisKKyAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKW1lbWJlcl90eXBlKTsKKworICAgICAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfYm9vbGVhbiI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2ludCI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfaW50NjQiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2RvdWJsZSI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2JveGVkIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfc3RyaW5nIjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIGJhc2UgdHlwZSBcIiIgKyBiYXNlX3R5cGUtPmdldF9uYW1lKCkgKyAiXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igc3RydWN0IG1lbWJlciBcIiIKKyAgICAgICAgICAgICAgKyBtZW1iZXJfbmFtZSArICJcIiI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9pbnQiOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc3RydWN0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfb2JqZWN0IjsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2JveGVkIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogIgorICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIHR5cGUgZm9yIHN0cnVjdCBtZW1iZXIgXCIiICsgbWVtYmVyX25hbWUgKyAiXCIiOworICAgICAgfQorCisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgcHJvcGVydHlfaWRlbnRpZmllciArICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IHNldHRlcl9mdW5jdGlvbl9uYW1lIDw8ICIgKHZhbHVlLCBzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworICB9CisKKyAgLy8gZ2VuZXJhdGUgdGhlIGluc3RhbmNlIGluaXQgZnVuY3Rpb24KKworICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgdm9pZCAiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2luc3RhbmNlX2luaXQgKCIKKyAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICogb2JqZWN0KSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gZ2VuZXJhdGUgZGVmYXVsdC12YWx1ZSBzdHJ1Y3R1cmVzIGZvciBjb250YWluZXItdHlwZSBtZW1iZXJzCisgIGJvb2wgY29uc3RhbnRfZGVjbGFyYXRpb25fb3V0cHV0ID0gZmFsc2U7CisgIGJvb2wgc3RyaW5nX2xpc3RfY29uc3RhbnRfb3V0cHV0ID0gZmFsc2U7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAqbV9pdGVyOworICAgIHRfY29uc3RfdmFsdWUqIG1lbWJlcl92YWx1ZSA9IG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisKKyAgICBpZiAobWVtYmVyX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZSA9IG1lbWJlci0+Z2V0X25hbWUoKTsKKyAgICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGxpc3QgPSBtZW1iZXJfdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKW1lbWJlcl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgICAgIC8vIEdlbmVyYXRlIGFuIGFycmF5IHdpdGggdGhlIGxpc3QgbGl0ZXJhbAorICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgInN0YXRpYyAiIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIGZhbHNlLCB0cnVlKSA8PCAiIF9fZGVmYXVsdF8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBtZW1iZXJfbmFtZSA8PCAiWyIgPDwgbGlzdC5zaXplKCkgPDwgIl0gPSAiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGNvbnN0YW50X2xpdGVyYWwobWVtYmVyX3R5cGUsIG1lbWJlcl92YWx1ZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgICAgY29uc3RhbnRfZGVjbGFyYXRpb25fb3V0cHV0ID0gdHJ1ZTsKKworICAgICAgICAvLyBJZiB3ZSBhcmUgZ2VuZXJhdGluZyB2YWx1ZXMgZm9yIGEgcG9pbnRlciBhcnJheSAoaS5lLiBhIGxpc3Qgb2YKKyAgICAgICAgLy8gc3RyaW5ncyksIHNldCBhIGZsYWcgc28gd2Uga25vdyB0byBhbHNvIGRlY2xhcmUgYW4gaW5kZXggdmFyaWFibGUgdG8KKyAgICAgICAgLy8gdXNlIGluIHByZS1wb3B1bGF0aW5nIHRoZSBhcnJheQorICAgICAgICBpZiAoZWxlbV90eXBlLT5pc19zdHJpbmcoKSkgeworICAgICAgICAgIHN0cmluZ19saXN0X2NvbnN0YW50X291dHB1dCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gVE9ETzogSGFuZGxlIGNvbnRhaW5lciB0eXBlcyBvdGhlciB0aGFuIGxpc3QKKyAgICB9CisgIH0KKyAgaWYgKGNvbnN0YW50X2RlY2xhcmF0aW9uX291dHB1dCkgeworICAgIGlmIChzdHJpbmdfbGlzdF9jb25zdGFudF9vdXRwdXQpIHsKKyAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAidW5zaWduZWQgaW50IGxpc3RfaW5kZXg7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfQorCisgIC8vIHNhdGlzZnkgY29tcGlsZXJzIHdpdGggLVdhbGwgdHVybmVkIG9uCisgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAiLyogc2F0aXNmeSAtV2FsbCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRIUklGVF9VTlVTRURfVkFSIChvYmplY3QpOyIgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlcl90eXBlKTsKKyAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHN0cmluZyBkdmFsID0gIiA9ICI7CisgICAgICBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICAgIGR2YWwgKz0gIigiICsgdHlwZV9uYW1lKHQpICsgIikiOworICAgICAgfQorICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKKyAgICAgICAgZHZhbCArPSBjb25zdGFudF92YWx1ZSgiIiwgdCwgY3YpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZHZhbCArPSB0LT5pc19zdHJpbmcoKSA/ICJOVUxMIiA6ICIwIjsKKyAgICAgIH0KKyAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgdF9wcm9ncmFtKiB0eXBlX3Byb2dyYW0gPSBtZW1iZXJfdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICAgIHN0cmluZyB0eXBlX25zcGFjZSA9IHR5cGVfcHJvZ3JhbSA/IHR5cGVfcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY19nbGliIikgOiAiIjsKKyAgICAgIHN0cmluZyB0eXBlX25zcGFjZV9wcmVmaXggPQorICAgICAgICB0eXBlX25zcGFjZS5lbXB0eSgpID8gIiIgOiBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHlwZV9uc3BhY2UpICsgIl8iOworICAgICAgc3RyaW5nIHR5cGVfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl90eXBlLT5nZXRfbmFtZSgpKSk7CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBnX29iamVjdF9uZXcgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0b191cHBlcl9jYXNlKHR5cGVfbnNwYWNlX3ByZWZpeCkgPDwgIlRZUEVfIiA8PCB0eXBlX25hbWVfdWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBOVUxMKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIGluaXRfZnVuY3Rpb247CisgICAgICB0X3R5cGUqIGV0eXBlID0gTlVMTDsKKworICAgICAgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgICAgIHRfdHlwZSoga2V5ID0gKCh0X21hcCopdCktPmdldF9rZXlfdHlwZSgpOworICAgICAgICB0X3R5cGUqIHZhbHVlID0gKCh0X21hcCopdCktPmdldF92YWxfdHlwZSgpOworICAgICAgICBpbml0X2Z1bmN0aW9uID0gZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKGtleSwgdmFsdWUpOworICAgICAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgICAgICBldHlwZSA9ICgodF9zZXQqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGluaXRfZnVuY3Rpb24gPSBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUoZXR5cGUsIE5VTEwpOworICAgICAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgaW5pdF9mdW5jdGlvbiA9IGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUoZXR5cGUpOworICAgICAgfQorCisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSAiIDw8IGluaXRfZnVuY3Rpb24gPDwgZW5kbDsKKworICAgICAgLy8gUHJlLXBvcHVsYXRlIHRoZSBjb250YWluZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWVzLCBpZiBhbnkKKyAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpKSB7CisgICAgICAgIHRfY29uc3RfdmFsdWUqIG1lbWJlcl92YWx1ZSA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICAgICAgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGxpc3QgPSBtZW1iZXJfdmFsdWUtPmdldF9saXN0KCk7CisKKyAgICAgICAgICBpZiAoaXNfbnVtZXJpYyhldHlwZSkpIHsKKyAgICAgICAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PAorICAgICAgICAgICAgICAiZ19hcnJheV9hcHBlbmRfdmFscyAob2JqZWN0LT4iIDw8IG5hbWUgPDwgIiwgJl9fZGVmYXVsdF8iIDw8CisgICAgICAgICAgICAgIG5hbWUgPDwgIiwgIiA8PCBsaXN0LnNpemUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8CisgICAgICAgICAgICAgICJmb3IgKGxpc3RfaW5kZXggPSAwOyBsaXN0X2luZGV4IDwgIiA8PCBsaXN0LnNpemUoKSA8PCAiOyAiIDw8CisgICAgICAgICAgICAgICJsaXN0X2luZGV4ICs9IDEpIiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwKKyAgICAgICAgICAgICAgImdfcHRyX2FycmF5X2FkZCAob2JqZWN0LT4iIDw8IG5hbWUgPDwgIiwiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgICAgaW5kZW50KCkgPDwgc3RyaW5nKDE3LCAnICcpIDw8ICJnX3N0cmR1cCAoX19kZWZhdWx0XyIgPDwKKyAgICAgICAgICAgICAgbmFtZSA8PCAiW2xpc3RfaW5kZXhdKSk7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBIYW5kbGUgY29udGFpbmVyIHR5cGVzIG90aGVyIHRoYW4gbGlzdAorICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vdCByZXF1aXJlZCwgaW5pdGlhbGl6ZSB0aGUgX19pc3NldCB2YXJpYWJsZSAqLworICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+X19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gRkFMU0U7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfaW1wbF8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvKiBjcmVhdGUgdGhlIGRlc3RydWN0b3IgKi8KKyAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQgIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UKKyAgICAgICAgICAgICAgICA8PCAiX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgKnRvYmplY3QgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjCisgICAgICAgICAgICAgICAgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICIvKiBzYXRpc2Z5IC1XYWxsIGluIGNhc2Ugd2UgZG9uJ3QgdXNlIHRvYmplY3QgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRvYmplY3QpOyIgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICh0LT5pc19jb250YWluZXIoKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBpZiAodC0+aXNfbWFwKCkgfHwgdC0+aXNfc2V0KCkpIHsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgICAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIHN0cmluZyBkZXN0cnVjdG9yX2Z1bmN0aW9uID0gImdfcHRyX2FycmF5X3VucmVmIjsKKworICAgICAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKWV0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX2FycmF5X3VucmVmIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgICBkZXN0cnVjdG9yX2Z1bmN0aW9uID0gImdfYXJyYXlfdW5yZWYiOworICAgICAgICB9CisKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBkZXN0cnVjdG9yX2Z1bmN0aW9uIDw8ICIgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIC8vIFRPRE86IGdfY2xlYXJfb2JqZWN0IG5lZWRzIGdsaWIgPj0gMi4yOAorICAgICAgLy8gZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19jbGVhcl9vYmplY3QgKCYodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgICAvLyBkb2VzIGdfb2JqZWN0X3VucmVmIHRoZSB0cmljaz8KKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19zdHJpbmcoKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodCkgPDwgIih0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfaW1wbF8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSB0aGUgY2xhc3MgaW5pdCBmdW5jdGlvbgorCisgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9jbGFzc19pbml0ICgiIDw8IGNsYXNzX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiQ2xhc3MgKiBjbHMpIiA8PCBlbmRsOworICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0U3RydWN0Q2xhc3MgKnN0cnVjdF9jbGFzcyA9ICIKKyAgICAgICAgICAgICAgICA8PCAiVEhSSUZUX1NUUlVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJzdHJ1Y3RfY2xhc3MtPnJlYWQgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9yZWFkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJzdHJ1Y3RfY2xhc3MtPndyaXRlID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfd3JpdGU7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9maW5hbGl6ZTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9ICIgPDwgY2xhc3NfbmFtZV9sYworICAgICAgICAgICAgICAgICAgPDwgIl9nZXRfcHJvcGVydHk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbDsKKworICAgIC8vIGluc3RhbGwgYSBwcm9wZXJ0eSBmb3IgZWFjaCBtZW1iZXIKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1faXRlcik7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWVfdWMKKyAgICAgICAgICA9IHRvX3VwcGVyX2Nhc2UodG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobWVtYmVyX25hbWUpKSk7CisgICAgICB0X3R5cGUqIG1lbWJlcl90eXBlID0gZ2V0X3RydWVfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworICAgICAgdF9jb25zdF92YWx1ZSogbWVtYmVyX3ZhbHVlID0gbWVtYmVyLT5nZXRfdmFsdWUoKTsKKworICAgICAgc3RyaW5nIHByb3BlcnR5X2lkZW50aWZpZXIgPSAiUFJPUF8iICsgY2xhc3NfbmFtZV91YyArICJfIiArIG1lbWJlcl9uYW1lX3VjOworCisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyAnICc7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICIoZ29iamVjdF9jbGFzcywiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgcHJvcGVydHlfaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudDsKKworICAgICAgaWYgKG1lbWJlcl90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKW1lbWJlcl90eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgICBpZiAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgICAgIGlmICgoKHRfYmFzZV90eXBlKiltZW1iZXJfdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjAsICcgJyk7CisgICAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm94ZWQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkdfVFlQRV9CWVRFX0FSUkFZLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMSwgJyAnKTsKKyAgICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19zdHJpbmcgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKChtZW1iZXJfdmFsdWUgIT0gTlVMTCkgPyAiXCIiICsgbWVtYmVyX3ZhbHVlLT5nZXRfc3RyaW5nKCkgKyAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5VTEwiKSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7CisgICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIyLCAnICcpOworICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19ib29sZWFuIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCgobWVtYmVyX3ZhbHVlICE9IE5VTEwpICYmIChtZW1iZXJfdmFsdWUtPmdldF9pbnRlZ2VyKCkgIT0gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlRSVUUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkZBTFNFIikgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIGlmICgoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0k4KSB8fCAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0kxNikKKyAgICAgICAgICAgICAgICAgICB8fCAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0kzMikgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpCisgICAgICAgICAgICAgICAgICAgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpKSB7CisgICAgICAgICAgc3RyaW5nIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfaW50IjsKKyAgICAgICAgICBzdHJpbmcgbWluX3ZhbHVlOworICAgICAgICAgIHN0cmluZyBtYXhfdmFsdWU7CisgICAgICAgICAgb3N0cmluZ3N0cmVhbSBkZWZhdWx0X3ZhbHVlOworCisgICAgICAgICAgc3dpdGNoIChiYXNlX3R5cGUpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UOCI7CisgICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQ4IjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICBtaW5fdmFsdWUgPSAiR19NSU5JTlQxNiI7CisgICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQxNiI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UMzIiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UMzIiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfaW50NjQiOworICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UNjQiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UNjQiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfZG91YmxlIjsKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9ICItSU5GSU5JVFkiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIklORklOSVRZIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBiYXNlIHR5cGUgXCIiICsgbWVtYmVyX3R5cGUtPmdldF9uYW1lKCkgKyAiXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHN0cnVjdCBtZW1iZXIgXCIiCisgICAgICAgICAgICAgICAgKyBtZW1iZXJfbmFtZSArICJcIiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobWVtYmVyX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUgPDwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUgPyBtZW1iZXJfdmFsdWUtPmdldF9kb3VibGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1lbWJlcl92YWx1ZS0+Z2V0X2ludGVnZXIoKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUgPDwgIjAiOworICAgICAgICAgIH0KKworICAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZyhwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgcGFyYW1fc3BlY19mdW5jdGlvbl9uYW1lIDw8ICIgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCBtaW5fdmFsdWUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgbWF4X3ZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBkZWZhdWx0X3ZhbHVlLnN0cigpIDw8ICIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIHRfZW51bV92YWx1ZSogZW51bV9taW5fdmFsdWUgPSAoKHRfZW51bSopbWVtYmVyX3R5cGUpLT5nZXRfbWluX3ZhbHVlKCk7CisgICAgICAgIHRfZW51bV92YWx1ZSogZW51bV9tYXhfdmFsdWUgPSAoKHRfZW51bSopbWVtYmVyX3R5cGUpLT5nZXRfbWF4X3ZhbHVlKCk7CisgICAgICAgIGludCBtaW5fdmFsdWUgPSAoZW51bV9taW5fdmFsdWUgIT0gTlVMTCkgPyBlbnVtX21pbl92YWx1ZS0+Z2V0X3ZhbHVlKCkgOiAwOworICAgICAgICBpbnQgbWF4X3ZhbHVlID0gKGVudW1fbWF4X3ZhbHVlICE9IE5VTEwpID8gZW51bV9tYXhfdmFsdWUtPmdldF92YWx1ZSgpIDogMDsKKworICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMTgsICcgJyk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19pbnQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8IG1pbl92YWx1ZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBtYXhfdmFsdWUgPDwgIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCBtaW5fdmFsdWUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zdHJ1Y3QoKSB8fCBtZW1iZXJfdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICB0X3Byb2dyYW0qIHR5cGVfcHJvZ3JhbSA9IG1lbWJlcl90eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgICAgICBzdHJpbmcgdHlwZV9uc3BhY2UgPSB0eXBlX3Byb2dyYW0gPyB0eXBlX3Byb2dyYW0tPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpIDogIiI7CisgICAgICAgIHN0cmluZyB0eXBlX25zcGFjZV9wcmVmaXggPQorICAgICAgICAgIHR5cGVfbnNwYWNlLmVtcHR5KCkgPyAiIiA6IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0eXBlX25zcGFjZSkgKyAiXyI7CisKKyAgICAgICAgc3RyaW5nIHBhcmFtX3R5cGUgPSB0b191cHBlcl9jYXNlKHR5cGVfbnNwYWNlX3ByZWZpeCkgKyAiVFlQRV8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfdHlwZS0+Z2V0X25hbWUoKSkpOworCisgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMCwgJyAnKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX29iamVjdCAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1fdHlwZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopbWVtYmVyX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIHN0cmluZyBwYXJhbV90eXBlOworCisgICAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICFlbGVtX3R5cGUtPmlzX3N0cmluZygpKSB7CisgICAgICAgICAgcGFyYW1fdHlwZSA9ICJHX1RZUEVfQVJSQVkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBhcmFtX3R5cGUgPSAiR19UWVBFX1BUUl9BUlJBWSI7CisgICAgICAgIH0KKworICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjAsICcgJyk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19ib3hlZCAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1fdHlwZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zZXQoKSB8fCBtZW1iZXJfdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm94ZWQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJHX1RZUEVfSEFTSF9UQUJMRSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgfQorICB9CisgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKworICBmX3R5cGVzX2ltcGxfIDw8ICJHVHlwZSIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfZ2V0X3R5cGUgKHZvaWQpIiA8PCBlbmRsIDw8ICJ7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOyIgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIGlmICh0eXBlID09IDApICIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBzdGF0aWMgY29uc3QgR1R5cGVJbmZvIHR5cGVfaW5mbyA9ICIgPDwgZW5kbCA8PCAiICAgIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgc2l6ZW9mICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcyksIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgICAgIE5VTEwsIC8qIGJhc2VfaW5pdCAqLyIgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgLyogYmFzZV9maW5hbGl6ZSAqLyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICAoR0NsYXNzSW5pdEZ1bmMpICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2NsYXNzX2luaXQsIgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsIC8qIGNsYXNzX2ZpbmFsaXplICovIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgICAgIE5VTEwsIC8qIGNsYXNzX2RhdGEgKi8iIDw8IGVuZGwgPDwgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgICAgICA8PCBuYW1lIDw8ICIpLCIgPDwgZW5kbCA8PCAiICAgICAgMCwgLyogbl9wcmVhbGxvY3MgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICAgICAgKEdJbnN0YW5jZUluaXRGdW5jKSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9pbnN0YW5jZV9pbml0LCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAvKiB2YWx1ZV90YWJsZSAqLyIgPDwgZW5kbCA8PCAiICAgIH07IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICAgIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChUSFJJRlRfVFlQRV9TVFJVQ1QsICIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiVHlwZVwiLCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX2luZm8sIDApOyIgPDwgZW5kbCA8PCAiICB9IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCAiICByZXR1cm4gdHlwZTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgZnVuY3Rpb25zIHRvIHdyaXRlIFRocmlmdCBzdHJ1Y3R1cmVzIHRvIGEgc3RyZWFtLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Z1bmN0aW9uKSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBpbnQgZXJyb3JfcmV0ID0gMDsKKworICBpZiAoaXNfZnVuY3Rpb24pIHsKKyAgICBlcnJvcl9yZXQgPSAtMTsKKyAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGdpbnQzMiIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91CisgICAgICAgICAgICAgICAgPDwgIl93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdpbnQzMiB4ZmVyID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCB0aGlzX2dldCA8PCBlbmRsOworICAvLyBzYXRpc2Z5IC1XYWxsIGluIHRoZSBjYXNlIG9mIGFuIGVtcHR5IHN0cnVjdAorICBpZiAoIXRoaXNfZ2V0LmVtcHR5KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRoaXNfb2JqZWN0KTsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsIFwiIiA8PCBuYW1lCisgICAgICA8PCAiXCIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzX29iamVjdC0+X19pc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IFRSVUUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICA8PCAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0CisgICAgICAgIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgdGhpc19uYW1lLCAiIiwgZXJyb3JfcmV0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIKKyAgICAgICAgPDwgZW5kbDsKKworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gd3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICA8PCBlbmRsOworCisgIGlmIChpc19mdW5jdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIHJlYWQgVGhyaWZ0IHN0cnVjdHVyZXMgZnJvbSBhIHN0cmVhbS4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbikgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOworICBpbnQgZXJyb3JfcmV0ID0gMDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChpc19mdW5jdGlvbikgeworICAgIGVycm9yX3JldCA9IC0xOworICAgIGluZGVudChvdXQpIDw8ICIvKiByZWFkcyBhICIgPDwgbmFtZV91IDw8ICIgb2JqZWN0ICovIiA8PCBlbmRsIDw8ICJzdGF0aWMgZ2ludDMyIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdQorICAgICAgICAgICAgICAgIDw8ICJfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGRlY2xhcmUgc3RhY2sgdGVtcCB2YXJpYWJsZXMKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJnaW50MzIgcmV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHhmZXIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImdjaGFyICpuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZnR5cGU7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZ2ludDE2IGZpZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgbGVuID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJncG9pbnRlciBkYXRhID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdGhpc19nZXQgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZ2Jvb2xlYW4gaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IEZBTFNFOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBzYXRpc2Z5IC1XYWxsIGluIGNhc2Ugd2UgZG9uJ3QgdXNlIHNvbWUgdmFyaWFibGVzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHRoZXNlIGFyZW4ndCB1c2VkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGxlbik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoZGF0YSk7IiA8PCBlbmRsOworCisgIGlmICghdGhpc19nZXQuZW1wdHkoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRoaXNfb2JqZWN0KTsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gcmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgc3RydWN0IGJlZ2luIG1hcmtlciAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJm5hbWUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm5hbWUgPSBOVUxMOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHJlYWQgdGhlIHN0cnVjdCBmaWVsZHMKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBzdHJ1Y3QgZmllbGRzICovIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ3aGlsZSAoMSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gcmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgZmllbGQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJm5hbWUsICZmdHlwZSwgJmZpZCwgZXJyb3IpKSA8IDApIgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibmFtZSA9IE5VTEw7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gY2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogYnJlYWsgaWYgd2UgZ2V0IGEgU1RPUCBmaWVsZCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlmIChmdHlwZSA9PSBUX1NUT1ApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBzd2l0Y2ggZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZCkiIDw8IGVuZGw7CisKKyAgLy8gc3RhcnQgc3dpdGNoCisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gZ2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIHR5cGVzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvLyBnZW5lcmF0ZSBkZXNlcmlhbGl6ZSBmaWVsZAorICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgdGhpc19uYW1lLCAiIiwgZXJyb3JfcmV0LCBmYWxzZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgZGVmYXVsdCBjYXNlCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICAgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKworICAvLyBlbmQgc3dpdGNoCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyByZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisKKyAgLy8gZW5kIHdoaWxlIGxvb3AKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICAvLyByZWFkIHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZQorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gaWYgYSByZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nLCB0aHJvdyBhbiBlcnJvcgorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0lOVkFMSURfREFUQSwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgXCJtaXNzaW5nIGZpZWxkXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gLTE7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAoaXNfZnVuY3Rpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gZW5kIHRoZSBmdW5jdGlvbi9zdHJ1Y3R1cmUKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBlcnJvcl9yZXQpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUsIGVycm9yX3JldCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlXyI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJib29sIChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiYnl0ZSAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJpMTYgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgImk2NCAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJkb3VibGUgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAiYmluYXJ5IChwcm90b2NvbCwgIiA8PCBuYW1lIDw8ICIgPyAoKEdCeXRlQXJyYXkgKikgIiA8PCBuYW1lIDw8ICIpLT5kYXRhIDogTlVMTCwgIgorICAgICAgICAgICAgICA8PCBuYW1lIDw8ICIgPyAoKEdCeXRlQXJyYXkgKikgIiA8PCBuYW1lIDw8ICIpLT5sZW4gOiAwIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInN0cmluZyAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyB3cml0ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgKGdpbnQzMikgIiA8PCBuYW1lOworICAgIH0KKyAgICBvdXQgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnIiArIG5hbWUgKyAiJyBUWVBFICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0eXBlKSk7CisgIH0KK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAoIiA8PCBwcmVmaXgKKyAgICAgIDw8ICIpLCBwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiB0a2V5ID0gKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHR2YWwgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHN0cmluZyB0a2V5X25hbWUgPSB0eXBlX25hbWUodGtleSk7CisgICAgc3RyaW5nIHR2YWxfbmFtZSA9IHR5cGVfbmFtZSh0dmFsKTsKKyAgICBzdHJpbmcgdGtleV9wdHI7CisgICAgc3RyaW5nIHR2YWxfcHRyOworICAgIHN0cmluZyBrZXluYW1lID0gdG1wKCJrZXkiKTsKKyAgICBzdHJpbmcgdmFsbmFtZSA9IHRtcCgidmFsIik7CisKKyAgICBkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvdXQsIHRrZXksIGtleW5hbWUpOworICAgIGRlY2xvcmVfbG9jYWxfdmFyaWFibGVfZm9yX3dyaXRlKG91dCwgdHZhbCwgdmFsbmFtZSk7CisKKyAgICAvKiBJZiBlaXRoZXIgdGhlIGtleSBvciB2YWx1ZSB0eXBlIGlzIGEgdHlwZWRlZiwgZmluZCBpdHMgdW5kZXJseWluZyB0eXBlIHNvCisgICAgICAgd2UgY2FuIGNvcnJlY3RseSBkZXRlcm1pbmUgaG93IHRvIGdlbmVyYXRlIGEgcG9pbnRlciB0byBpdCAqLworICAgIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKHRrZXkpOworICAgIHR2YWwgPSBnZXRfdHJ1ZV90eXBlKHR2YWwpOworCisgICAgdGtleV9wdHIgPSB0a2V5LT5pc19zdHJpbmcoKSB8fCAhdGtleS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKyAgICB0dmFsX3B0ciA9IHR2YWwtPmlzX3N0cmluZygpIHx8ICF0dmFsLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOworCisgICAgLyoKKyAgICAgKiBTb21lIHVnbGluZXNzIGhlcmUuICBUbyBtYXhpbWl6ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UKKyAgICAgKiBhdm9pZCB1c2luZyBHSGFzaFRhYmxlSXRlciBhbmQgaW5zdGVhZCBnZXQgYSBHTGlzdCBvZiBhbGwga2V5cywKKyAgICAgKiB0aGVuIGNvcHkgaXQgaW50byBhIGFycmF5IG9uIHRoZSBzdGFjaywgYW5kIGZyZWUgaXQuCisgICAgICogVGhpcyBpcyBiZWNhdXNlIHdlIG1heSBleGl0IGVhcmx5IGJlZm9yZSB3ZSBnZXQgYSBjaGFuY2UgdG8gZnJlZSB0aGUKKyAgICAgKiBHTGlzdC4KKyAgICAgKi8KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkdMaXN0ICprZXlfbGlzdCA9IE5VTEwsICppdGVyID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyIDw8ICIqIGtleXM7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpbnQgaSA9IDAsIGtleV9jb3VudDsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0odGtleSkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0odHZhbCkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIiA/ICIKKyAgICAgICAgPDwgIihnaW50MzIpIGdfaGFzaF90YWJsZV9zaXplICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PCAiKSA6IDAiCisgICAgICAgIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4CisgICAgICAgIDw8ICIsIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzLCAma2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5X2NvdW50ID0gZ19saXN0X2xlbmd0aCAoa2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5cyA9IGdfbmV3YSAoIiA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIKKyAgICAgICAgPDwgIiwga2V5X2NvdW50KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaXRlciA9IGdfbGlzdF9maXJzdCAoa2V5X2xpc3QpOyBpdGVyOyAiCisgICAgICAgICAgICJpdGVyID0gaXRlci0+bmV4dCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJrZXlzW2krK10gPSAoIiA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIKKyAgICAgICAgPDwgIikgaXRlci0+ZGF0YTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdfbGlzdF9mcmVlIChrZXlfbGlzdCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBrZXlfY291bnQ7ICsraSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwga2V5bmFtZSA8PCAiID0ga2V5c1tpXTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgdmFsbmFtZSA8PCAiID0gKCIgPDwgdHZhbF9uYW1lIDw8IHR2YWxfcHRyCisgICAgICAgIDw8ICIpIGdfaGFzaF90YWJsZV9sb29rdXAgKCgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeAorICAgICAgICA8PCAiKSwgKGdwb2ludGVyKSAiIDw8IGtleW5hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfbWFwKil0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGtleV9wdHIgKyAiICIgKyBrZXluYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dmFsX3B0ciArICIgIiArIHZhbG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogdGVsZW0gPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBzdHJpbmcgdGVsZW1fbmFtZSA9IHR5cGVfbmFtZSh0ZWxlbSk7CisgICAgc3RyaW5nIHRlbGVtX3B0ciA9IHRlbGVtLT5pc19zdHJpbmcoKSB8fCAhdGVsZW0tPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJHTGlzdCAqa2V5X2xpc3QgPSBOVUxMLCAqaXRlciA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICIqIGtleXM7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpbnQgaSA9IDAsIGtleV9jb3VudDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIgPDwgIiBlbGVtOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ3BvaW50ZXIgdmFsdWU7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAodmFsdWUpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLCAiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSh0ZWxlbSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIiA/ICIKKyAgICAgICAgPDwgIihnaW50MzIpIGdfaGFzaF90YWJsZV9zaXplICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PCAiKSA6IDAiCisgICAgICAgIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4CisgICAgICAgIDw8ICIsIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzLCAma2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5X2NvdW50ID0gZ19saXN0X2xlbmd0aCAoa2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5cyA9IGdfbmV3YSAoIiA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0cgorICAgICAgICA8PCAiLCBrZXlfY291bnQpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpdGVyID0gZ19saXN0X2ZpcnN0IChrZXlfbGlzdCk7IGl0ZXI7ICIKKyAgICAgICAgICAgIml0ZXIgPSBpdGVyLT5uZXh0KSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImtleXNbaSsrXSA9ICgiIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyCisgICAgICAgIDw8ICIpIGl0ZXItPmRhdGE7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwga2V5X2NvdW50OyArK2kpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbGVtID0ga2V5c1tpXTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhbHVlID0gKGdwb2ludGVyKSBnX2hhc2hfdGFibGVfbG9va3VwICIKKyAgICAgICAgICAgIigoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIiksIChncG9pbnRlcikgZWxlbSk7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc2V0Kil0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsZW1fcHRyICsgImVsZW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGxlbmd0aCA9ICIoIiArIHByZWZpeCArICIgPyAiICsgcHJlZml4ICsgIi0+bGVuIDogMCkiOworICAgIHN0cmluZyBpID0gdG1wKCJpIik7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJndWludCAiIDw8IGkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgKGdpbnQzMikgIgorICAgICAgICA8PCBsZW5ndGggPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgbGVuZ3RoIDw8ICI7ICIKKyAgICAgICAgPDwgaSA8PCAiKyspIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgsIGksIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsdWUpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtZW50KTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOworCisgIC8vIGNhc3QgdG8gbm9uLWNvbnN0CisgIHN0cmluZyBjYXN0ID0gIiI7CisgIHN0cmluZyBuYW1lID0gImdfcHRyX2FycmF5X2luZGV4ICgoR1B0ckFycmF5ICopICIgKyBsaXN0ICsgIiwgIiArIGluZGV4ICsgIikiOworCisgIGlmICh0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogbGlzdCBlbGVtZW50IHR5cGUgY2Fubm90IGJlIHZvaWQiKTsKKyAgfSBlbHNlIGlmIChpc19udW1lcmljKHR0eXBlKSkgeworICAgIG5hbWUgPSAiZ19hcnJheV9pbmRleCAoIiArIGxpc3QgKyAiLCAiICsgYmFzZV90eXBlX25hbWUodHR5cGUpICsgIiwgIiArIGluZGV4ICsgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJpbmcoKSkgeworICAgIGNhc3QgPSAiKGdjaGFyKikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBjYXN0ID0gIihHSGFzaFRhYmxlKikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGlmIChldHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBsaXN0IGVsZW1lbnQgdHlwZSBjYW5ub3QgYmUgdm9pZCIpOworICAgIH0KKyAgICBjYXN0ID0gaXNfbnVtZXJpYyhldHlwZSkgPyAiKEdBcnJheSopIiA6ICIoR1B0ckFycmF5KikiOworICB9CisKKyAgdF9maWVsZCBlZmllbGQodHR5cGUsICIoIiArIGNhc3QgKyBuYW1lICsgIikiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOworfQorCisvKiBkZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4gKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb2NhdGUpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGVycm9yX3JldCwgYWxsb2NhdGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZ19mcmVlKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfIjsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBvdXQgPDwgImJpbmFyeSAocHJvdG9jb2wsICZkYXRhLCAmbGVuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAic3RyaW5nIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAiYm9vbCAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJieXRlIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgb3V0IDw8ICJpMTYgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAiaTY0IChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgb3V0IDw8ICJkb3VibGUgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyByZWFkZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7CisgICAgfQorICAgIG91dCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IgorICAgICAgICA8PCBlbmRsOworCisgICAgLy8gbG9hZCB0aGUgYnl0ZSBhcnJheSB3aXRoIHRoZSBkYXRhCisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiB0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gZ19ieXRlX2FycmF5X25ldygpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJnX2J5dGVfYXJyYXlfYXBwZW5kICgiIDw8IG5hbWUgPDwgIiwgKGd1aW50OCAqKSBkYXRhLCAoZ3VpbnQpIGxlbik7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImdfZnJlZSAoZGF0YSk7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgiZWNhc3QiKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdpbnQzMiAiIDw8IHQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJiIgPDwgdCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB0IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiJyBUWVBFICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0eXBlKSk7CisgIH0KKworICAvLyBpZiB0aGUgdHlwZSBpcyBub3QgcmVxdWlyZWQgYW5kIHRoaXMgaXMgYSB0aHJpZnQgc3RydWN0IChubyBwcmVmaXgpLAorICAvLyBzZXQgdGhlIGlzc2V0IHZhcmlhYmxlLiAgaWYgdGhlIHR5cGUgaXMgcmVxdWlyZWQsIHRoZW4gc2V0IHRoZQorICAvLyBsb2NhbCB2YXJpYWJsZSBpbmRpY2F0aW5nIHRoZSB2YWx1ZSB3YXMgc2V0LCBzbyB0aGF0IHdlIGNhbiBkbyAgICAvLyB2YWxpZGF0aW9uIGxhdGVyLgorICBpZiAocHJlZml4ICE9ICIiICYmIHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIl9faXNzZXRfIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgc3VmZml4IDw8ICIgPSBUUlVFOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmIChwcmVmaXggIT0gIiIgJiYgdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgIGluZGVudChvdXQpIDw8ICJpc3NldF8iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gVFJVRTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlKSB7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHN0cnVjdC0+Z2V0X25hbWUoKSkpOworICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogVGhpcyBzdHJ1Y3QgaXMgYW4gZXhjZXB0aW9uICovIiA8PCBlbmRsOworICAgIGFsbG9jYXRlID0gdHJ1ZTsKKyAgfQorCisgIGlmIChhbGxvY2F0ZSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCAiIDw8IHByZWZpeCA8PCAiICE9IE5VTEwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKCIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IGdfb2JqZWN0X25ldyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICgiIDw8IHByZWZpeAorICAgICAgPDwgIiksIHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoYWxsb2NhdGUpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZ19vYmplY3RfdW5yZWYgKCIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUga2V5X3R5cGU7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIHZhbHVlX3R5cGU7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIG1hcCBiZWdpbiBtYXJrZXIgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICAgICAiJmtleV90eXBlLCAmdmFsdWVfdHlwZSwgJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBpdGVyYXRlIG92ZXIgbWFwIGVsZW1lbnRzCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggZWFjaCBvZiB0aGUgbWFwJ3MgZmllbGRzICovIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4LCBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIHJlYWQgbWFwIGVuZAorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgbWFwIGVuZCBtYXJrZXIgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBzaXplOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGU7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICAgICAiJmVsZW1lbnRfdHlwZSwgJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggdGhlIHNldCBlbGVtZW50cyAqLyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCwgZXJyb3JfcmV0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAvLyByZWFkIHNldCBlbmQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBzaXplOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGU7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgICAgIiZlbGVtZW50X3R5cGUsJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggbGlzdCBlbGVtZW50cyAqLyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9saXN0Kil0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgLy8gcmVhZCBsaXN0IGVuZAorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyYgbmFtZSwgYm9vbCBmb3JfaGFzaF90YWJsZSkgeworICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHR5cGUpOworCisgIC8qIElmIHRoZSBnaXZlbiB0eXBlIGlzIGEgdHlwZWRlZiwgZmluZCBpdHMgdW5kZXJseWluZyB0eXBlIHNvIHdlCisgICAgIGNhbiBjb3JyZWN0bHkgZGV0ZXJtaW5lIGhvdyB0byBnZW5lcmF0ZSBhIHBvaW50ZXIgdG8gaXQgKi8KKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHB0ciA9ICFpc19udW1lcmljKHR0eXBlKSA/ICIiIDogIioiOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZSA8PCAiID0gIgorICAgICAgICA8PCBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRtYXAtPmdldF92YWxfdHlwZSgpKSA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZSA8PCAiID0gIgorICAgICAgICA8PCBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAoZm9yX2hhc2hfdGFibGUgJiYgdHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCAiICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8ICIgIiA8PCBuYW1lCisgICAgICAgIDw8IChwdHIgIT0gIiIgPyAiID0gZ19uZXcgKCIgKyB0bmFtZSArICIsIDEpIiA6ICIgPSBOVUxMIikgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmRlY2xvcmVfbG9jYWxfdmFyaWFibGVfZm9yX3dyaXRlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyYgbmFtZSkgeworICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHR5cGUpOworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHRyID0gdHR5cGUtPmlzX3N0cmluZygpIHx8ICF0dHlwZS0+aXNfYmFzZV90eXBlKCkgPyAiICIgOiAiKiAiOworICBzdHJpbmcgaW5pdF92YWwgPSB0dHlwZS0+aXNfZW51bSgpID8gIiIgOiAiID0gTlVMTCI7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCBwdHIgPDwgbmFtZSA8PCBpbml0X3ZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF90eXBlKiB0a2V5ID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7CisgIHRfdHlwZSogdHZhbCA9IHRtYXAtPmdldF92YWxfdHlwZSgpOworICBzdHJpbmcga2V5bmFtZSA9IHRtcCgia2V5Iik7CisgIHN0cmluZyB2YWxuYW1lID0gdG1wKCJ2YWwiKTsKKworICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdGtleSwga2V5bmFtZSwgdHJ1ZSk7CisgIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0dmFsLCB2YWxuYW1lLCB0cnVlKTsKKworICAvKiBJZiBlaXRoZXIgdGhlIGtleSBvciB2YWx1ZSB0eXBlIGlzIGEgdHlwZWRlZiwgZmluZCBpdHMgdW5kZXJseWluZworICAgICB0eXBlIHNvIHdlIGNhbiBjb3JyZWN0bHkgZGV0ZXJtaW5lIGhvdyB0byBnZW5lcmF0ZSBhIHBvaW50ZXIgdG8KKyAgICAgaXQgKi8KKyAgdGtleSA9IGdldF90cnVlX3R5cGUodGtleSk7CisgIHR2YWwgPSBnZXRfdHJ1ZV90eXBlKHR2YWwpOworCisgIHN0cmluZyB0a2V5X3B0ciA9IHRrZXktPmlzX3N0cmluZygpIHx8ICF0a2V5LT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOworICBzdHJpbmcgdHZhbF9wdHIgPSB0dmFsLT5pc19zdHJpbmcoKSB8fCAhdHZhbC0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKworICAvLyBkZXNlcmlhbGl6ZSB0aGUgZmllbGRzIG9mIHRoZSBtYXAgZWxlbWVudAorICB0X2ZpZWxkIGZrZXkodGtleSwgdGtleV9wdHIgKyBrZXluYW1lKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgIiIsICIiLCBlcnJvcl9yZXQpOworICB0X2ZpZWxkIGZ2YWwodHZhbCwgdHZhbF9wdHIgKyB2YWxuYW1lKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgIiIsICIiLCBlcnJvcl9yZXQpOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIiAmJiAiIDw8IGtleW5hbWUgPDwgIikiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikiIDw8IHByZWZpeCA8PCAiLCAoZ3BvaW50ZXIpICIgPDwga2V5bmFtZQorICAgICAgICAgICAgICA8PCAiLCAoZ3BvaW50ZXIpICIgPDwgdmFsbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfdHlwZSogdGVsZW0gPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICBzdHJpbmcgdGVsZW1fcHRyID0gdGVsZW0tPmlzX3N0cmluZygpIHx8ICF0ZWxlbS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKworICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdGVsZW0sIGVsZW0sIHRydWUpOworCisgIHRfZmllbGQgZmVsZW0odGVsZW0sIHRlbGVtX3B0ciArIGVsZW0pOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgIiIsICIiLCBlcnJvcl9yZXQpOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIiAmJiAiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIiwgKGdwb2ludGVyKSAiIDw8IGVsZW0KKyAgICAgICAgICAgICAgPDwgIiwgKGdwb2ludGVyKSAiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgICh2b2lkKWluZGV4OworICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHN0cmluZyB0ZWxlbV9wdHIgPSAhaXNfbnVtZXJpYyh0dHlwZSkgPyAiIiA6ICIqIjsKKworICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdHR5cGUsIGVsZW0sIGZhbHNlKTsKKworICB0X2ZpZWxkIGZlbGVtKHR0eXBlLCB0ZWxlbV9wdHIgKyBlbGVtKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCAiIiwgZXJyb3JfcmV0KTsKKworICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiY29tcGlsZXIgZXJyb3I6IGxpc3QgZWxlbWVudCB0eXBlIGNhbm5vdCBiZSB2b2lkIik7CisgIH0gZWxzZSBpZiAoaXNfbnVtZXJpYyh0dHlwZSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZ19hcnJheV9hcHBlbmRfdmFscyAoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIsIDEpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZ19wdHJfYXJyYXlfYWRkICgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworICB9Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gIk5VTEwiOworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgaGFzaCB0eXBlIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJnX2ZyZWUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuICJ0aHJpZnRfc3RyaW5nX2ZyZWUiOworICAgICAgfQorICAgICAgcmV0dXJuICJnX2ZyZWUiOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIk5VTEwiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgdGhyaWZ0X3NhZmVfaGFzaF90YWJsZV9kZXN0cm95IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gImdfb2JqZWN0X3VucmVmIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopZXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19hcnJheV91bnJlZiI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfcHRyX2FycmF5X3VucmVmIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChldHlwZS0+aXNfY29udGFpbmVyKCkgfHwgZXR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19wdHJfYXJyYXlfdW5yZWYiOworICAgICAgOworICAgIH0gZWxzZSBpZiAoZXR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfYXJyYXlfdW5yZWYiOworICAgIH0KKyAgICBwcmludGYoIlR5cGUgbm90IGV4cGVjdGVkIGluc2lkZSB0aGUgYXJyYXk6ICVzXG4iLCBldHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICB0aHJvdyAiVHlwZSBub3QgZXhwZWN0ZWQgaW5zaWRlIGFycmF5IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUoKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0KKyAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZDogJXNcbiIsIHR0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB0aHJvdyAiVHlwZSBub3QgZXhwZWN0ZWQiOworfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlID09IE5VTEwpCisgICAgcmV0dXJuICJOVUxMIjsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gInRocmlmdF9ib29sZWFuX2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gInRocmlmdF9pbnQ4X2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJ0aHJpZnRfaW50MTZfaGFzaCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImdfaW50X2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJnX2ludDY0X2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJnX2RvdWJsZV9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiZ19zdHJfaGFzaCI7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaGFzaCB0YWJsZSBpbmZvIGZvciB0eXBlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiZ19kaXJlY3RfaGFzaCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAiZ19kaXJlY3RfaGFzaCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKCgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCkpOworICB9CisgIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlID09IE5VTEwpCisgICAgcmV0dXJuICJOVUxMIjsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gInRocmlmdF9ib29sZWFuX2VxdWFsIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJ0aHJpZnRfaW50OF9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gInRocmlmdF9pbnQxNl9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImdfaW50X2VxdWFsIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiZ19pbnQ2NF9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImdfZG91YmxlX2VxdWFsIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiZ19zdHJfZXF1YWwiOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImdfZGlyZWN0X2VxdWFsIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgcmV0dXJuICJnX2RpcmVjdF9lcXVhbCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZW5lcmF0ZV9jbXBfZnVuY19mcm9tX3R5cGUoKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0KKyAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZDogJXNcbiIsIHR0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB0aHJvdyAiVHlwZSBub3QgZXhwZWN0ZWQiOworfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUodF90eXBlKiBrZXksIHRfdHlwZSogdmFsdWUpIHsKKyAgc3RyaW5nIGhhc2hfZnVuYyA9IGdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUoa2V5KTsKKyAgc3RyaW5nIGNtcF9mdW5jID0gZ2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKGtleSk7CisgIHN0cmluZyBrZXlfZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZShrZXkpOworICBzdHJpbmcgdmFsdWVfZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh2YWx1ZSk7CisKKyAgcmV0dXJuICJnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKCIgKyBoYXNoX2Z1bmMgKyAiLCAiICsgY21wX2Z1bmMgKyAiLCAiICsga2V5X2ZyZWVfZnVuYyArICIsICIKKyAgICAgICAgICsgdmFsdWVfZnJlZV9mdW5jICsgIik7IjsKK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIik7CisgIH0gZWxzZSBpZiAoaXNfbnVtZXJpYyh0dHlwZSkpIHsKKyAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKCIgKyBiYXNlX3R5cGVfbmFtZSh0dHlwZSkgKyAiKSk7IjsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0dHlwZSk7CisgICAgcmV0dXJuICJnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKCIgKyBmcmVlX2Z1bmMgKyAiKTsiOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVUSUxJVFkgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVXBwZXIgY2FzZSBhIHN0cmluZy4KKyAqLworc3RyaW5nIHRvX3VwcGVyX2Nhc2Uoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHMobmFtZSk7CisgIHN0ZDo6dHJhbnNmb3JtKHMuYmVnaW4oKSwgcy5lbmQoKSwgcy5iZWdpbigpLCA6OnRvdXBwZXIpOworICByZXR1cm4gczsKK30KKworLyoqCisgKiBMb3dlciBjYXNlIGEgc3RyaW5nLgorICovCitzdHJpbmcgdG9fbG93ZXJfY2FzZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgcyhuYW1lKTsKKyAgc3RkOjp0cmFuc2Zvcm0ocy5iZWdpbigpLCBzLmVuZCgpLCBzLmJlZ2luKCksIDo6dG9sb3dlcik7CisgIHJldHVybiBzOworfQorCisvKioKKyAqIE1ha2VzIGEgc3RyaW5nIGZyaWVuZGx5IHRvIEMgY29kZSBzdGFuZGFyZHMgYnkgbG93ZXJjYXNpbmcgYW5kIGFkZGluZworICogdW5kZXJzY29yZXMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLiAgRm9yIGV4YW1wbGU6CisgKgorICogSW5wdXQ6ICJab21nQ2FtZWxDYXNlIgorICogT3V0cHV0OiAiem9tZ19jYW1lbF9jYXNlIgorICovCitzdHJpbmcgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyByZXQ7CisgIGNvbnN0IGNoYXIqIHRtcCA9IG5hbWUuY19zdHIoKTsKKyAgaW50IHBvcyA9IDA7CisKKyAgLyogdGhlIGZpcnN0IGNoYXJhY3RlciBpc24ndCB1bmRlcnNjb3JlZCBpZiB1cHBlcmNhc2UsIGp1c3QgbG93ZXJjYXNlZCAqLworICByZXQgKz0gdG9sb3dlcih0bXBbcG9zXSk7CisgIHBvcysrOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gcG9zOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgY2hhciBsYyA9IHRvbG93ZXIodG1wW2ldKTsKKyAgICBpZiAobGMgIT0gdG1wW2ldKSB7CisgICAgICByZXQgKz0gJ18nOworICAgIH0KKyAgICByZXQgKz0gbGM7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIFBlcmZvcm1zIHRoZSByZXZlcnNlIG9wZXJhdGlvbiBvZiBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXM6IFRoZSBmaXJzdAorICogY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgaXMgbWFkZSB1cHBlcmNhc2UsIGFsb25nIHdpdGggZWFjaCBjaGFyYWN0ZXIgdGhhdAorICogZm9sbG93cyBhbiB1bmRlcnNjb3JlICh3aGljaCBpcyByZW1vdmVkKS4gVXNlZnVsIGZvciBjb252ZXJ0aW5nIFRocmlmdAorICogc2VydmljZS1tZXRob2QgbmFtZXMgaW50byBHT2JqZWN0LXN0eWxlIGNsYXNzIG5hbWVzLgorICoKKyAqIElucHV0OiAiem9tZ19jYW1lbF9jYXNlIgorICogT3V0cHV0OiAiWm9tZ0NhbWVsQ2FzZSIKKyAqLworc3RyaW5nIHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgcmV0OworICBjb25zdCBjaGFyKiB0bXAgPSBuYW1lLmNfc3RyKCk7CisgIGJvb2wgdXBwZXJjYXNlX25leHQgPSB0cnVlOworCisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgY2hhciBjID0gdG1wW2ldOworICAgIGlmIChjID09ICdfJykgeworICAgICAgdXBwZXJjYXNlX25leHQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodXBwZXJjYXNlX25leHQpIHsKKyAgICAgICAgcmV0ICs9IHRvdXBwZXIoYyk7CisgICAgICAgIHVwcGVyY2FzZV9uZXh0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgKz0gYzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiByZWdpc3RlciB0aGlzIGdlbmVyYXRvciB3aXRoIHRoZSBtYWluIHByb2dyYW0gKi8KK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoY19nbGliLCAiQywgdXNpbmcgR0xpYiIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NsX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDdjMGVmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jbF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw1NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtIFBhdHJpY2sgQ29sbGlzb24gPHBhdHJpY2tAY29sbGlzb24uaWU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtIEZhY2Vib29rCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKKy8qKgorICogQ29tbW9uIExpc3AgY29kZSBnZW5lcmF0b3IuCisgKgorICogQGF1dGhvciBQYXRyaWNrIENvbGxpc29uIDxwYXRyaWNrQGNvbGxpc29uLmllPgorICovCitjbGFzcyB0X2NsX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgdF9jbF9nZW5lcmF0b3IoCisgICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCisgIHsKKyAgICBub19hc2QgPSBmYWxzZTsKKyAgICBzeXN0ZW1fcHJlZml4ID0gInRocmlmdC1nZW4tIjsKKworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBmb3IoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fYXNkIikgPT0gMCkgeworICAgICAgICBub19hc2QgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJzeXNfcHJlZiIpID09IDApIHsKKwlzeXN0ZW1fcHJlZml4ID0gaXRlci0+c2Vjb25kOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGNsOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jbCI7CisgICAgY29weV9vcHRpb25zXyA9IG9wdGlvbl9zdHJpbmc7CisgIH0KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAgICAodF90eXBlZGVmKiAgdHR5cGVkZWYpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICAgICh0X2VudW0qICAgICB0ZW51bSkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgICAgKHRfY29uc3QqICAgIHRjb25zdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICAgICh0X3N0cnVjdCogICB0eGNlcHRpb24pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICAgICh0X3NlcnZpY2UqICB0c2VydmljZSkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfY2xfc3RydWN0IChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jbF9zdHJ1Y3RfaW50ZXJuYWwgKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2V4Y2VwdGlvbl9zaWcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGYpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgc3RkOjpzdHJpbmcgY2xfYXV0b2dlbl9jb21tZW50KCk7CisgIHZvaWQgYXNkZl9kZWYoc3RkOjpvc3RyZWFtICZvdXQpOworICB2b2lkIHBhY2thZ2VfZGVmKHN0ZDo6b3N0cmVhbSAmb3V0KTsKKyAgdm9pZCBwYWNrYWdlX2luKHN0ZDo6b3N0cmVhbSAmb3V0KTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgcHJlZml4KHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX29mKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7CisKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlc3BlYyAodF90eXBlICp0KTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHN0ZDo6c3RyaW5nIGNsX2RvY3N0cmluZyhzdGQ6OnN0cmluZyByYXcpOworCisgcHJpdmF0ZToKKworICBpbnQgdGVtcG9yYXJ5X3ZhcjsKKyAgLyoqCisgICAqIElzb2xhdGUgdGhlIHZhcmlhYmxlIGRlZmluaXRpb25zLCBhcyB0aGV5IGNhbiByZXF1aXJlIHN0cnVjdHVyZSBkZWZpbml0aW9ucworICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2FzZF87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl92YXJzXzsKKworICBzdGQ6OnN0cmluZyBjb3B5X29wdGlvbnNfOworCisgIGJvb2wgbm9fYXNkOworICBzdGQ6OnN0cmluZyBzeXN0ZW1fcHJlZml4OworfTsKKworCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgc3RyaW5nIHByb2dyYW1fZGlyID0gZ2V0X291dF9kaXIoKSArICIvIiArIHByb2dyYW1fbmFtZV87CisgIE1LRElSKHByb2dyYW1fZGlyLmNfc3RyKCkpOworCisgIHRlbXBvcmFyeV92YXIgPSAwOworCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBwcm9ncmFtX2RpciArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiLXR5cGVzLmxpc3AiOworICBzdHJpbmcgZl92YXJzX25hbWUgPSBwcm9ncmFtX2RpciArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiLXZhcnMubGlzcCI7CisKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUpOworICBmX3R5cGVzXyA8PCBjbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICBmX3ZhcnNfLm9wZW4oZl92YXJzX25hbWUpOworICBmX3ZhcnNfIDw8IGNsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgcGFja2FnZV9kZWYoZl90eXBlc18pOworICBwYWNrYWdlX2luKGZfdHlwZXNfKTsKKyAgcGFja2FnZV9pbihmX3ZhcnNfKTsKKworICBpZiAoIW5vX2FzZCkgeworICAgIHN0cmluZyBmX2FzZF9uYW1lID0gcHJvZ3JhbV9kaXIgKyAiLyIgKyBzeXN0ZW1fcHJlZml4ICsgcHJvZ3JhbV9uYW1lXyArICIuYXNkIjsKKyAgICBmX2FzZF8ub3BlbihmX2FzZF9uYW1lKTsKKyAgICBmX2FzZF8gPDwgY2xfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgICBhc2RmX2RlZihmX2FzZF8pOworICB9Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQorICovCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICByZXN1bHQgKz0gIjpkZXBlbmRzLW9uICg6dGhyaWZ0IjsKKyAgZm9yIChhdXRvIGluY2x1ZGUgOiBpbmNsdWRlcykgeworICAgIHJlc3VsdCArPSAiIDoiICsgc3lzdGVtX3ByZWZpeCArIHVuZGVyc2NvcmUoaW5jbHVkZS0+Z2V0X25hbWUoKSk7CisgIH0KKyAgcmVzdWx0ICs9ICIpXG4iOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnBhY2thZ2Vfb2YodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHN0cmluZyBwcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjbCIpOworICByZXR1cm4gcHJlZml4LmVtcHR5KCkgPyAidGhyaWZ0LWdlbmVyYXRlZCIgOiBwcmVmaXg7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZSgpIHsKKyAgcmV0dXJuIHBhY2thZ2Vfb2YocHJvZ3JhbV8pOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnByZWZpeChzdHJpbmcgc3ltYm9sKSB7CisgIHJldHVybiAiXCIiICsgc3ltYm9sICsgIlwiIjsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpjbF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybgorICAgIHN0ZDo6c3RyaW5nKCI7OzsgIikgKyAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKworICAgICI7OzsgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCisgICAgIjs7OyBvcHRpb25zIHN0cmluZzogIiArIGNvcHlfb3B0aW9uc18gKyAiXG4iOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OmNsX2RvY3N0cmluZyhzdHJpbmcgcmF3KSB7CisgIHJlcGxhY2UocmF3LmJlZ2luKCksIHJhdy5lbmQoKSwgJyInLCAnXCcnKTsKKyAgcmV0dXJuIHJhdzsKK30KKworCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfYXNkXy5jbG9zZSgpOworICBmX3R5cGVzXy5jbG9zZSgpOworICBmX3ZhcnNfLmNsb3NlKCk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVkX3BhY2thZ2UoKSB7CisgIHJldHVybiBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIik7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmFzZGZfZGVmKHN0ZDo6b3N0cmVhbSAmb3V0KSB7CisgIG91dCA8PCAiKGFzZGY6ZGVmc3lzdGVtICM6IiA8PCBzeXN0ZW1fcHJlZml4IDw8IHByb2dyYW1fbmFtZV8gPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfaW5jbHVkZXMoKQorICAgICAgPDwgaW5kZW50KCkgPDwgIjpzZXJpYWwgdCIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjpjb21wb25lbnRzICgiCisgICAgICA8PCAiKDpmaWxlIFwiIiA8PCBwcm9ncmFtX25hbWVfIDw8ICItdHlwZXNcIikgIgorICAgICAgPDwgIig6ZmlsZSBcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiLXZhcnNcIikpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqKgorICogR2VuZXJhdGUgYSBwYWNrYWdlIGRlZmluaXRpb24uIEFkZCB1c2UgcmVmZXJlbmNlcyBlcXVpdmFsZW50IHRvIHRoZSBpZGwgZmlsZSdzIGluY2x1ZGUgc3RhdGVtZW50cy4KKyAqLwordm9pZCB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZV9kZWYoc3RkOjpvc3RyZWFtICZvdXQpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKworICBvdXQgPDwgIih0aHJpZnQ6ZGVmLXBhY2thZ2UgOiIgPDwgcGFja2FnZSgpOworICBpZiAoIGluY2x1ZGVzLnNpemUoKSA+IDAgKSB7CisgICAgb3V0IDw8ICIgOnVzZSAoIjsKKyAgICBmb3IgKGF1dG8gaW5jbHVkZSA6IGluY2x1ZGVzKSB7CisgICAgICBvdXQgPDwgIiA6IiA8PCBpbmNsdWRlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBvdXQgPDwgIikiOworICB9CisgIG91dCA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpwYWNrYWdlX2luKHN0ZDo6b3N0cmVhbSAmb3V0KSB7CisgIG91dCA8PCAiKGNsOmluLXBhY2thZ2UgOiIgPDwgcGFja2FnZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBDb21tb24gTGlzcCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBmX3R5cGVzXyA8PCAiKHRocmlmdDpkZWYtZW51bSAiIDw8IHByZWZpeCh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGludCB2YWx1ZSA9IC0xOworCisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiKCI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgaWYoY19pdGVyICE9IGNvbnN0YW50cy5iZWdpbigpKSBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIjsKKworICAgIGZfdHlwZXNfIDw8ICIoXCIiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgLiAiIDw8IHZhbHVlIDw8ICIpIjsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCAiKSkiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl92YXJzXyA8PCAiKHRocmlmdDpkZWYtY29uc3RhbnQgIiA8PCBwcmVmaXgobmFtZSkgPDwgIiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIikiCisgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgIlwiIiA8PCB2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICJcIiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0IiA6ICJuaWwiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICh0eXBlLT5pc19zdHJ1Y3QoKSA/ICIobWFrZS1pbnN0YW5jZSAnIiA6ICIobWFrZS1leGNlcHRpb24gJyIpIDw8CisgICAgICAgICAgIGxvd2VyY2FzZSh0eXBlLT5nZXRfbmFtZSgpKSA8PCAiICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6IiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiAiIDw8CisgICAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIpIjsKKworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAvLyBlbWl0IGFuIGhhc2ggZm9ybSB3aXRoIGJvdGgga2V5cyBhbmQgdmFsdWVzIHRvIGJlIGV2YWx1YXRlZAorICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgIih0aHJpZnQ6bWFwICI7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiKGNsOmNvbnMgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpIDw8ICIgIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIpIjsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIikiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiKHRocmlmdDpzZXQiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKHRocmlmdDpsaXN0IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9jbF9zdHJ1Y3QoZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9jbF9zdHJ1Y3QoZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NsX3N0cnVjdF9pbnRlcm5hbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgICh2b2lkKWlzX2V4Y2VwdGlvbjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBvdXQgPDwgIigiOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworCisgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmJlZ2luKCkpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIjsKKyAgICB9CisgICAgb3V0IDw8ICIoIiA8PCBwcmVmaXgoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiICIgPDwKKyAgICAgICAgKCAoTlVMTCAhPSB2YWx1ZSkgPyByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDogIm5pbCIgKSA8PAorICAgICAgICAiIDppZCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpOworICAgIGlmICggdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgInN0cmluZyIgPT0gdHlwZXNwZWModHlwZSkgKQorICAgICAgaWYgKCAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgKQorICAgICAgICBvdXQgPDwgIiA6dHlwZSBiaW5hcnkiOworICAgICAgZWxzZQorICAgICAgICBvdXQgPDwgIiA6dHlwZSBzdHJpbmciOworICAgIGVsc2UKKyAgICAgIG91dCA8PCAiIDp0eXBlICIgPDwgdHlwZXNwZWModHlwZSk7CisgICAgaWYgKCAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMICkgeworICAgICAgb3V0IDw8ICIgOm9wdGlvbmFsIHQiOworICAgIH0KKyAgICBpZiAoICgqbV9pdGVyKS0+aGFzX2RvYygpKSB7CisgICAgICBvdXQgPDwgIiA6ZG9jdW1lbnRhdGlvbiBcIiIgPDwgY2xfZG9jc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X2RvYygpKSA8PCAiXCIiOworICAgIH0KKyAgICBvdXQgPDwiKSI7CisgIH0KKworICBvdXQgPDwgIikiOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbF9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlKSB7CisgIHN0ZDo6c3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIG91dCA8PCAoaXNfZXhjZXB0aW9uID8gIih0aHJpZnQ6ZGVmLWV4Y2VwdGlvbiAiIDogIih0aHJpZnQ6ZGVmLXN0cnVjdCAiKSA8PAorICAgICAgcHJlZml4KG5hbWUpIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoIHRzdHJ1Y3QtPmhhc19kb2MoKSApIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgOworICAgIG91dCA8PCAiXCIiIDw8IGNsX2RvY3N0cmluZyh0c3RydWN0LT5nZXRfZG9jKCkpIDw8ICJcIiIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgOworICBnZW5lcmF0ZV9jbF9zdHJ1Y3RfaW50ZXJuYWwob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXhjZXB0aW9uX3NpZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogZikgeworICBnZW5lcmF0ZV9jbF9zdHJ1Y3RfaW50ZXJuYWwob3V0LCBmLT5nZXRfeGNlcHRpb25zKCksIHRydWUpOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50OworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfY2xpZW50ID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgfQorCisgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kc19jbGllbnQuZW1wdHkoKSA/ICJuaWwiIDogcHJlZml4KGV4dGVuZHNfY2xpZW50KTsKKworICBmX3R5cGVzXyA8PCAiKHRocmlmdDpkZWYtc2VydmljZSAiIDw8IHByZWZpeChzZXJ2aWNlX25hbWVfKSA8PCAiICIKKyAgICAgICAgICAgPDwgZXh0ZW5kc19jbGllbnQ7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKCB0c2VydmljZS0+aGFzX2RvYygpKSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiKDpkb2N1bWVudGF0aW9uIFwiIiA8PCBjbF9kb2NzdHJpbmcodHNlcnZpY2UtPmdldF9kb2MoKSkgPDwgIlwiKSI7CisgICAgfQorCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogZnVuY3Rpb24gPSAqZl9pdGVyOworICAgIHN0cmluZyBmbmFtZSA9IGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOworICAgIHRfc3RydWN0KiBleGNlcHRpb25zID0gZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4bWVtYmVycyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7CisKKyAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIoOm1ldGhvZCAiIDw8IHByZWZpeChmbmFtZSk7CisgICAgZl90eXBlc18gPDwgIiAoIiA8PCBzaWduYXR1cmUgPDwgIiAiICA8PCB0eXBlc3BlYygoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIpIjsKKyAgICBpZiAoeG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiIDpleGNlcHRpb25zICIgOworICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uX3NpZyhmX3R5cGVzXywgZnVuY3Rpb24pOworICAgIH0KKyAgICBpZiAoICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgKSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgOm9uZXdheSB0IjsKKyAgICB9CisgICAgaWYgKCAoKmZfaXRlciktPmhhc19kb2MoKSApIHsKKyAgICAgIGZfdHlwZXNfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiA6ZG9jdW1lbnRhdGlvbiBcIiIKKyAgICAgICAgICAgICAgIDw8IGNsX2RvY3N0cmluZygoKmZfaXRlciktPmdldF9kb2MoKSkgPDwgIlwiIjsKKyAgfQorICAgIGZfdHlwZXNfIDw8ICIpIjsKKyAgfQorCisgIGZfdHlwZXNfIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjp0eXBlc3BlYyh0X3R5cGUgKnQpIHsKKyAgdCA9IGdldF90cnVlX3R5cGUodCk7CisKKyAgaWYgKHQgLT4gaXNfYmluYXJ5KCkpeworICAgIHJldHVybiAiYmluYXJ5IjsKKyAgfSBlbHNlIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiB0eXBlX25hbWUodCk7CisgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCAqbSA9ICh0X21hcCopIHQ7CisgICAgcmV0dXJuICIodGhyaWZ0Om1hcCAiICsgdHlwZXNwZWMobS0+Z2V0X2tleV90eXBlKCkpICsgIiAiICsKKyAgICAgIHR5cGVzcGVjKG0tPmdldF92YWxfdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICIoc3RydWN0ICIgKyBwcmVmaXgodHlwZV9uYW1lKHQpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIih0aHJpZnQ6bGlzdCAiICsgdHlwZXNwZWMoKCh0X2xpc3QqKSB0KS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgIHJldHVybiAiKHRocmlmdDpzZXQgIiArIHR5cGVzcGVjKCgodF9zZXQqKSB0KS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIihlbnVtIFwiIiArICgodF9lbnVtKikgdCktPmdldF9uYW1lKCkgKyAiXCIpIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gZ2VuZXJhdGUgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKKyAgfQorfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgcmV0dXJuIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZ3N0cmVhbSByZXM7CisgIHJlcyA8PCAiKCI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcyA8PCAiICI7CisgICAgfQorICAgIHJlcyA8PCAiKCIgKyBwcmVmaXgoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiICIgPDwKKyAgICAgIHR5cGVzcGVjKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8CisgICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAgIikiOworCisKKyAgfQorICByZXMgPDwgIikiOworICByZXR1cm4gcmVzLnN0cigpOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQorICAgIHByZWZpeCA9IHBhY2thZ2Vfb2YocHJvZ3JhbSkgPT0gcGFja2FnZSgpID8gIiIgOiBwYWNrYWdlX29mKHByb2dyYW0pICsgIjoiOworCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICBuYW1lID0gbG93ZXJjYXNlKHR0eXBlLT5nZXRfbmFtZSgpKTsKKworICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBjbCwKKyAgICAiQ29tbW9uIExpc3AiLAorICAgICIgICAgbm9fYXNkOiAgICAgICAgICBEbyBub3QgZGVmaW5lIEFTREYgc3lzdGVtcyBmb3IgZWFjaCBnZW5lcmF0ZWQgVGhyaWZ0IHByb2dyYW0uXG4iCisgICAgIiAgICBzeXNfcHJlZj0gICAgICAgIFRoZSBwcmVmaXggdG8gZ2l2ZSBBU0RGIHN5c3RlbSBuYW1lcy4gRGVmYXVsdDogdGhyaWZ0LWdlbi1cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhMzE2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDQ1MTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogQysrIGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGlzIGxlZ2l0aW1hY3kgaW5jYXJuYXRlLgorICoKKyAqLworY2xhc3MgdF9jcHBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfY3BwX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKworICAgIGdlbl9wdXJlX2VudW1zXyA9IGZhbHNlOworICAgIHVzZV9pbmNsdWRlX3ByZWZpeF8gPSBmYWxzZTsKKyAgICBnZW5fY29iX3N0eWxlXyA9IGZhbHNlOworICAgIGdlbl9ub19jbGllbnRfY29tcGxldGlvbl8gPSBmYWxzZTsKKyAgICBnZW5fbm9fZGVmYXVsdF9vcGVyYXRvcnNfID0gZmFsc2U7CisgICAgZ2VuX3RlbXBsYXRlc18gPSBmYWxzZTsKKyAgICBnZW5fdGVtcGxhdGVzX29ubHlfID0gZmFsc2U7CisgICAgZ2VuX21vdmVhYmxlXyA9IGZhbHNlOworICAgIGdlbl9ub19vc3RyZWFtX29wZXJhdG9yc18gPSBmYWxzZTsKKyAgICBnZW5fbm9fc2tlbGV0b25fID0gZmFsc2U7CisKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwdXJlX2VudW1zIikgPT0gMCkgeworICAgICAgICBnZW5fcHVyZV9lbnVtc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJpbmNsdWRlX3ByZWZpeCIpID09IDApIHsKKyAgICAgICAgdXNlX2luY2x1ZGVfcHJlZml4XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNvYl9zdHlsZSIpID09IDApIHsKKyAgICAgICAgZ2VuX2NvYl9zdHlsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19jbGllbnRfY29tcGxldGlvbiIpID09IDApIHsKKyAgICAgICAgZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX2RlZmF1bHRfb3BlcmF0b3JzIikgPT0gMCkgeworICAgICAgICBnZW5fbm9fZGVmYXVsdF9vcGVyYXRvcnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidGVtcGxhdGVzIikgPT0gMCkgeworICAgICAgICBnZW5fdGVtcGxhdGVzXyA9IHRydWU7CisgICAgICAgIGdlbl90ZW1wbGF0ZXNfb25seV8gPSAoaXRlci0+c2Vjb25kID09ICJvbmx5Iik7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm1vdmVhYmxlX3R5cGVzIikgPT0gMCkgeworICAgICAgICBnZW5fbW92ZWFibGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX29zdHJlYW1fb3BlcmF0b3JzIikgPT0gMCkgeworICAgICAgICBnZW5fbm9fb3N0cmVhbV9vcGVyYXRvcnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX3NrZWxldG9uIikgPT0gMCkgeworICAgICAgICBnZW5fbm9fc2tlbGV0b25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBjcHA6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNwcCI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgb3ZlcnJpZGU7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yX2RlY2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZSB7IGdlbmVyYXRlX2NwcF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOyB9CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgb3ZlcnJpZGUgeyBnZW5lcmF0ZV9jcHBfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7IH0KKyAgdm9pZCBnZW5lcmF0ZV9jcHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIG92ZXJyaWRlOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlYWQgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzd2FwID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdXNlcl9zdHJ1Y3QgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBmb3JjZV9jcHBfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0dGVycyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191c2VyX3N0cnVjdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb3B5X2NvbnN0cnVjdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX21vdmVfY29uc3RydWN0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RydWN0b3JfaGVscGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNwZXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbW92ZSk7CisgIHZvaWQgZ2VuZXJhdGVfYXNzaWdubWVudF9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX21vdmVfYXNzaWdubWVudF9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2Fzc2lnbm1lbnRfaGVscGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19tb3ZlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3N3YXAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlX2ZhY3RvcnkodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24odF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzcGVjaWFsaXplZCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwdXNoX2JhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4KTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9jYWxsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYXJnX3ByZWZpeCk7CisgIC8qCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9wcmVmaXgoc3RkOjpzdHJpbmcgbnMpOworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2Vfb3BlbihzdGQ6OnN0cmluZyBucyk7CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9jbG9zZShzdGQ6OnN0cmluZyBucyk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYgPSBmYWxzZSwgYm9vbCBhcmcgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZlcmVuY2UgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuYW1lX3BhcmFtcyA9IHRydWUpOworICBzdGQ6OnN0cmluZyBjb2JfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVfcGFyYW1zID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgbmFtZV9wYXJhbXMgPSB0cnVlLCBib29sIHN0YXJ0X2NvbW1hID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvc3RyZWFtJiBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGNvbnN0YW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV92YWx1ZXMpOworCisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3JfZGVjbChzdGQ6Om9zdHJlYW0mIGYsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIGYsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kX2RlY2woc3RkOjpvc3RyZWFtJiBmLCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kX2RlY2woc3RkOjpvc3RyZWFtJiBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZXJuYWwgPSBmYWxzZSk7CisKKyAgYm9vbCBpc19yZWZlcmVuY2UodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF9yZWZlcmVuY2UoKTsgfQorCisgIGJvb2wgaXNfY29tcGxleF90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkKKyAgICAgICAgICAgfHwgKHR0eXBlLT5pc19iYXNlX3R5cGUoKQorICAgICAgICAgICAgICAgJiYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpKTsKKyAgfQorCisgIHZvaWQgc2V0X3VzZV9pbmNsdWRlX3ByZWZpeChib29sIHVzZV9pbmNsdWRlX3ByZWZpeCkgeyB1c2VfaW5jbHVkZV9wcmVmaXhfID0gdXNlX2luY2x1ZGVfcHJlZml4OyB9CisKKyAgLyoqCisgICAqIFRoZSBjb21waWxlciBvcHRpb24gIm5vX3RocmlmdF9vc3RyZWFtX2ltcGwiIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQKKyAgICogdGhlIGNvbXBpbGVyIGZyb20gZW1pdHRpbmcgaW1wbGVtZW50YXRpb25zIGZvciBvcGVyYXRvciA8PC4gIEluIHRoaXMKKyAgICogY2FzZSB0aGUgY29uc3VtaW5nIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBhbnkgbmVlZGVkIHRvIGJ1aWxkLgorICAgKgorICAgKiBUbyBkaXNhYmxlIHRoaXMgb24gYSBwZXIgc3RydWN0dXJlIGJhc2VzLCBvbmUgY2FuIGFsdGVybmF0aXZlbHkgc2V0CisgICAqIHRoZSBhbm5vdGF0aW9uICJjcHAuY3VzdG9tb3N0cmVhbSIgdG8gcHJldmVudCB0aHJpZnQgZnJvbSBlbWl0dGluZyBhbgorICAgKiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtJikuCisgICAqCisgICAqIFNlZSBBbm5vdGF0aW9uVGVzdCBmb3IgdmFsaWRhdGlvbiBvZiB0aGlzIGFubm90YXRpb24gZmVhdHVyZS4KKyAgICovCisgIGJvb2wgaGFzX2N1c3RvbV9vc3RyZWFtKHRfdHlwZSogdHR5cGUpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdlbl9ub19vc3RyZWFtX29wZXJhdG9yc18pIHx8CisgICAgICAgICAgICh0dHlwZS0+YW5ub3RhdGlvbnNfLmZpbmQoImNwcC5jdXN0b21vc3RyZWFtIikgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGluY2x1ZGUgcHJlZml4IHRvIHVzZSBmb3IgYSBmaWxlIGdlbmVyYXRlZCBieSBwcm9ncmFtLCBvciB0aGUKKyAgICogZW1wdHkgc3RyaW5nIGlmIG5vIGluY2x1ZGUgcHJlZml4IHNob3VsZCBiZSB1c2VkLgorICAgKi8KKyAgc3RkOjpzdHJpbmcgZ2V0X2luY2x1ZGVfcHJlZml4KGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3Q7CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHB1cmUgZW51bXMgZm9yIFRocmlmdCBlbnVtcywgaW5zdGVhZCBvZiB3cmFwcGVyIGNsYXNzZXMuCisgICAqLworICBib29sIGdlbl9wdXJlX2VudW1zXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgdGVtcGxhdGl6ZWQgcmVhZGVyL3dyaXRlciBtZXRob2RzLgorICAgKi8KKyAgYm9vbCBnZW5fdGVtcGxhdGVzXzsKKworICAvKioKKyAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIGdlbmVyYXRlIHByb2Nlc3MgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIG9ubHkgdGVtcGxhdGl6ZWQKKyAgICogcmVhZGVyL3dyaXRlciBtZXRob2RzLgorICAgKi8KKyAgYm9vbCBnZW5fdGVtcGxhdGVzX29ubHlfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBtb3ZlIGNvbnN0cnVjdG9ycyAmIGFzc2lnbm1lbnQgb3BlcmF0b3JzLgorICAgKi8KKyAgYm9vbCBnZW5fbW92ZWFibGVfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBvc3RyZWFtIGRlZmluaXRpb25zCisgICAqLworICBib29sIGdlbl9ub19vc3RyZWFtX29wZXJhdG9yc187CisKKyAgLyoqCisgICAqIFRydWUgaWZmIHdlIHNob3VsZCB1c2UgYSBwYXRoIHByZWZpeCBpbiBvdXIgI2luY2x1ZGUgc3RhdGVtZW50cyBmb3Igb3RoZXIKKyAgICogdGhyaWZ0LWdlbmVyYXRlZCBoZWFkZXIgZmlsZXMuCisgICAqLworICBib29sIHVzZV9pbmNsdWRlX3ByZWZpeF87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlICJDb250aW51YXRpb24gT0JqZWN0Ii1zdHlsZSBjbGFzc2VzIGFzIHdlbGwuCisgICAqLworICBib29sIGdlbl9jb2Jfc3R5bGVfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBvbWl0IGNhbGxzIHRvIGNvbXBsZXRpb25fXygpIGluIENvYkNsaWVudCBjbGFzcy4KKyAgICovCisgIGJvb2wgZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgb21pdCBnZW5lcmF0aW5nIHRoZSBkZWZhdWx0IG9wZWFydG9ycyA9PSwgIT0gYW5kIDwuCisgICAqLworICBib29sIGdlbl9ub19kZWZhdWx0X29wZXJhdG9yc187CisKKyAgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBza2VsZXRvbi4KKyAgICovCisgIGJvb2wgZ2VuX25vX3NrZWxldG9uXzsKKworICAvKioKKyAgICogU3RyaW5ncyBmb3IgbmFtZXNwYWNlLCBjb21wdXRlZCBvbmNlIHVwIGZyb250IHRoZW4gdXNlZCBkaXJlY3RseQorICAgKi8KKworICBzdGQ6OnN0cmluZyBuc19vcGVuXzsKKyAgc3RkOjpzdHJpbmcgbnNfY2xvc2VfOworCisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMsIHN0b3JlZCBoZXJlIHRvIGF2b2lkIHBhc3NpbmcgdGhlbSBhcyBwYXJhbWV0ZXJzIHRvIGV2ZXJ5CisgICAqIGZ1bmN0aW9uLgorICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfaW1wbF87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc190Y2NfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaGVhZGVyXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV90Y2NfOworCisgIC8vIFRoZSBQcm9jZXNzb3JHZW5lcmF0b3IgaXMgdXNlZCB0byBnZW5lcmF0ZSBwYXJ0cyBvZiB0aGUgY29kZSwKKyAgLy8gc28gaXQgbmVlZHMgYWNjZXNzIHRvIG1hbnkgb2Ygb3VyIHByb3RlY3RlZCBtZW1iZXJzIGFuZCBtZXRob2RzLgorICAvLworICAvLyBUT0RPOiBUaGUgY29kZSByZWFsbHkgc2hvdWxkIGJlIGNsZWFuZWQgdXAgc28gdGhhdCBoZWxwZXIgbWV0aG9kcyBmb3IKKyAgLy8gd3JpdGluZyB0byB0aGUgb3V0cHV0IGZpbGVzIGFyZSBzZXBhcmF0ZSBmcm9tIHRoZSBnZW5lcmF0b3IgY2xhc3NlcworICAvLyB0aGVtc2VsdmVzLgorICBmcmllbmQgY2xhc3MgUHJvY2Vzc29yR2VuZXJhdG9yOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMuaCI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lKTsKKworICBzdHJpbmcgZl90eXBlc19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMuY3BwIjsKKyAgZl90eXBlc19pbXBsXy5vcGVuKGZfdHlwZXNfaW1wbF9uYW1lLmNfc3RyKCkpOworCisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIC8vIElmIHdlIGRvbid0IG9wZW4gdGhlIHN0cmVhbSwgaXQgYXBwZWFycyB0byBqdXN0IGRpc2NhcmQgZGF0YSwKKyAgICAvLyB3aGljaCBpcyBmaW5lLgorICAgIHN0cmluZyBmX3R5cGVzX3RjY19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLnRjYyI7CisgICAgZl90eXBlc190Y2NfLm9wZW4oZl90eXBlc190Y2NfbmFtZS5jX3N0cigpKTsKKyAgfQorCisgIC8vIFByaW50IGhlYWRlcgorICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl90eXBlc19pbXBsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl90eXBlc190Y2NfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIC8vIFN0YXJ0IGlmbmRlZgorICBmX3R5cGVzXyA8PCAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl90eXBlc190Y2NfIDw8ICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX1RZUEVTX1RDQyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgIDw8ICJfVFlQRVNfVENDIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gSW5jbHVkZSBiYXNlIHR5cGVzCisgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSA8aW9zZndkPiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvVEJhc2UuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGw7CisgIC8vIEluY2x1ZGUgQysreHggY29tcGF0aWJpbGl0eSBoZWFkZXIKKyAgZl90eXBlc18gPDwgIiNpbmNsdWRlIDxmdW5jdGlvbmFsPiIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIiNpbmNsdWRlIDxtZW1vcnk+IiA8PCBlbmRsOworCisgIC8vIEluY2x1ZGUgb3RoZXIgVGhyaWZ0IGluY2x1ZGVzCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGZvciAoYXV0byBpbmNsdWRlIDogaW5jbHVkZXMpIHsKKyAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqaW5jbHVkZSkgPDwgaW5jbHVkZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsOworCisgICAgLy8gWFhYKHNpbXBraW5zKTogSWYgZ2VuX3RlbXBsYXRlc18gaXMgZW5hYmxlZCwgd2UgY3VycmVudGx5IGFzc3VtZSBhbGwKKyAgICAvLyBpbmNsdWRlZCBmaWxlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCisgICAgZl90eXBlc190Y2NfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCppbmNsdWRlKSA8PCBpbmNsdWRlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJfdHlwZXMudGNjXCIiIDw8IGVuZGw7CisgIH0KKyAgZl90eXBlc18gPDwgZW5kbDsKKworICAvLyBJbmNsdWRlIGN1c3RvbSBoZWFkZXJzCisgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjcHBfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2NwcF9pbmNsdWRlcygpOworICBmb3IgKGNvbnN0IGF1dG8gJiBjcHBfaW5jbHVkZSA6IGNwcF9pbmNsdWRlcykgeworICAgIGlmIChjcHBfaW5jbHVkZVswXSA9PSAnPCcpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSAiIDw8IGNwcF9pbmNsdWRlIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgY3BwX2luY2x1ZGUgPDwgIlwiIiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX3R5cGVzXyA8PCBlbmRsOworCisgIC8vIEluY2x1ZGUgdGhlIHR5cGVzIGZpbGUKKyAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfdGNjXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBUaGUgc3dhcCgpIGNvZGUgbmVlZHMgPGFsZ29yaXRobT4gZm9yIHN0ZDo6c3dhcCgpCisgIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIDxhbGdvcml0aG0+IiA8PCBlbmRsOworICAvLyBmb3Igb3BlcmF0b3I8PAorICBmX3R5cGVzX2ltcGxfIDw8ICIjaW5jbHVkZSA8b3N0cmVhbT4iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBPcGVuIG5hbWVzcGFjZQorICBuc19vcGVuXyA9IG5hbWVzcGFjZV9vcGVuKHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7CisgIG5zX2Nsb3NlXyA9IG5hbWVzcGFjZV9jbG9zZShwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOworCisgIGZfdHlwZXNfIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX2ltcGxfIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX3RjY18gPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgb3V0cHV0IGZpbGVzLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSBuYW1lc3BhY2UKKyAgZl90eXBlc18gPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCBuc19jbG9zZV8gPDwgZW5kbDsKKyAgZl90eXBlc190Y2NfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gSW5jbHVkZSB0aGUgdHlwZXMudGNjIGZpbGUgZnJvbSB0aGUgdHlwZXMgaGVhZGVyIGZpbGUsCisgIC8vIHNvIGNsaWVudHMgZG9uJ3QgaGF2ZSB0byBleHBsaWNpdGx5IGluY2x1ZGUgdGhlIHRjYyBmaWxlLgorICAvLyBUT0RPKHNpbXBraW5zKTogTWFrZSB0aGlzIGEgc2VwYXJhdGUgb3B0aW9uLgorICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgIDw8ICJfdHlwZXMudGNjXCIiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIENsb3NlIGlmbmRlZgorICBmX3R5cGVzXyA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBmX3R5cGVzX3RjY18gPDwgIiNlbmRpZiIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBvdXRwdXQgZmlsZQorICBmX3R5cGVzXy5jbG9zZSgpOworICBmX3R5cGVzX2ltcGxfLmNsb3NlKCk7CisgIGZfdHlwZXNfdGNjXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIEMrKworICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCksIHRydWUpIDw8ICIgIgorICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChzdGQ6Om9zdHJlYW0mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgY29uc3RhbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3ZhbHVlcykgeworICBmIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZiA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KGYpIDw8IHByZWZpeCA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgc3VmZml4OworICAgIGlmIChpbmNsdWRlX3ZhbHVlcykgeworICAgICAgZiA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIH0KKyAgfQorCisgIGYgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGYpIDw8ICJ9OyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBJbiBDKyssIHRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUKKyAqIGFzIHRoZSB0aHJpZnQgZGVmaW5pdGlvbiBpdHNlbGYsIHVzaW5nIHRoZSBlbnVtIGtleXdvcmQgaW4gQysrLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKworICBzdGQ6OnN0cmluZyBlbnVtX25hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgaWYgKCFnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBlbnVtX25hbWUgPSAidHlwZSI7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInN0cnVjdCAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZW51bSAiIDw8IGVudW1fbmFtZTsKKworICBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3QoZl90eXBlc18sIGNvbnN0YW50cywgIiIsICIiLCB0cnVlKTsKKworICBpZiAoIWdlbl9wdXJlX2VudW1zXykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgIn07IiA8PCBlbmRsOworICB9CisKKyAgZl90eXBlc18gPDwgZW5kbDsKKworICAvKioKKyAgICAgR2VuZXJhdGUgYSBjaGFyYWN0ZXIgYXJyYXkgb2YgZW51bSBuYW1lcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAqLworICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIjsKKyAgaWYgKCFnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBwcmVmaXggPSB0ZW51bS0+Z2V0X25hbWUoKSArICI6OiI7CisgIH0KKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpbnQgX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJWYWx1ZXNbXSA9IjsKKyAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfaW1wbF8sIGNvbnN0YW50cywgcHJlZml4LmNfc3RyKCksICIiLCBmYWxzZSk7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY29uc3QgY2hhciogX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJOYW1lc1tdID0iOworICBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3QoZl90eXBlc19pbXBsXywgY29uc3RhbnRzLCAiXCIiLCAiXCIiLCBmYWxzZSk7CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImV4dGVybiBjb25zdCBzdGQ6Om1hcDxpbnQsIGNvbnN0IGNoYXIqPiBfIiA8PCB0ZW51bS0+Z2V0X25hbWUoKQorICAgICAgICAgICA8PCAiX1ZBTFVFU19UT19OQU1FUzsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjb25zdCBzdGQ6Om1hcDxpbnQsIGNvbnN0IGNoYXIqPiBfIiA8PCB0ZW51bS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICJfVkFMVUVTX1RPX05BTUVTKDo6YXBhY2hlOjp0aHJpZnQ6OlRFbnVtSXRlcmF0b3IoIiA8PCBjb25zdGFudHMuc2l6ZSgpIDw8ICIsIF9rIgorICAgICAgICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJWYWx1ZXMiCisgICAgICAgICAgICAgICAgPDwgIiwgX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJOYW1lcyksICIKKyAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VEVudW1JdGVyYXRvcigtMSwgTlVMTCwgTlVMTCkpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcl9kZWNsKGZfdHlwZXNfLCB0ZW51bSk7CisgIGdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcihmX3R5cGVzX2ltcGxfLCB0ZW51bSk7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3JfZGVjbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSkgeworCisgIG91dCA8PCAic3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCAiOworICBpZiAoZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgb3V0IDw8IHRlbnVtLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIG91dCA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiOjp0eXBlJiI7CisgIH0KKyAgb3V0IDw8ICIgdmFsKTsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKSB7CisKKyAgLy8gSWYgd2UndmUgYmVlbiB0b2xkIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24gd2lsbCBwcm92aWRlIGFuIG9zdHJlYW0KKyAgLy8gb3BlcmF0b3IgZGVmaW5pdGlvbiB0aGVuIHdlIG9ubHkgbWFrZSBhIGRlY2xhcmF0aW9uOgorCisgIGlmICghaGFzX2N1c3RvbV9vc3RyZWFtKHRlbnVtKSkgeworICAgIG91dCA8PCAic3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCAiOworICAgIGlmIChnZW5fcHVyZV9lbnVtc18pIHsKKyAgICAgIG91dCA8PCB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICI6OnR5cGUmIjsKKyAgICB9CisgICAgb3V0IDw8ICIgdmFsKSAiOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN0ZDo6bWFwPGludCwgY29uc3QgY2hhcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IF8iCisgICAgICAgICAgICAgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIl9WQUxVRVNfVE9fTkFNRVMuZmluZCh2YWwpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChpdCAhPSBfIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiX1ZBTFVFU19UT19OQU1FUy5lbmQoKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dCA8PCBpdC0+c2Vjb25kOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXQgPDwgc3RhdGljX2Nhc3Q8aW50Pih2YWwpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG91dDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0YW50cy5oIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lKTsKKworICBzdHJpbmcgZl9jb25zdHNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0YW50cy5jcHAiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzX2ltcGw7CisgIGZfY29uc3RzX2ltcGwub3BlbihmX2NvbnN0c19pbXBsX25hbWUpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl9jb25zdHNfaW1wbCA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKworICAvLyBTdGFydCBpZm5kZWYKKyAgZl9jb25zdHMgPDwgIiNpZm5kZWYgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfQ09OU1RBTlRTX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgIDw8ICJfQ09OU1RBTlRTX0giIDw8IGVuZGwgPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX2NvbnN0c19pbXBsIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgICAgPDwgIl9jb25zdGFudHMuaFwiIiA8PCBlbmRsIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworCisgIGZfY29uc3RzIDw8ICJjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbCA8PCAiICAiCisgICAgICAgICAgIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cygpOyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBmX2NvbnN0cyA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9jb25zdHMgPDwgIn07IiA8PCBlbmRsOworCisgIGZfY29uc3RzX2ltcGwgPDwgImNvbnN0ICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIGdfIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfY29uc3RhbnRzOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzOjoiIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgICA8PCAiQ29uc3RhbnRzKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHNfaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0c19pbXBsKSA8PCAifSIgPDwgZW5kbDsKKworICBmX2NvbnN0cyA8PCBlbmRsIDw8ICJleHRlcm4gY29uc3QgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgZ18iIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgPDwgIl9jb25zdGFudHM7IiA8PCBlbmRsIDw8IGVuZGwgPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbCA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBmX2NvbnN0cy5jbG9zZSgpOworCisgIGZfY29uc3RzX2ltcGwgPDwgZW5kbCA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworICBmX2NvbnN0c19pbXBsLmNsb3NlKCk7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGJvb2wgaXNfbm9ucmVxdWlyZWRfZmllbGQgPSBmYWxzZTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gZmFsc2U7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgaXNfbm9ucmVxdWlyZWRfZmllbGQgPSAoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGlmIChpc19ub25yZXF1aXJlZF9maWVsZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuX19pc3NldC4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5pbnNlcnQoc3RkOjptYWtlX3BhaXIoIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIikpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXNoX2JhY2soIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5pbnNlcnQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHByaW50X2NvbnN0X3ZhbHVlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCisvKioKKyAqCisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkxMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8ICJzdGF0aWNfY2FzdDxkb3VibGU+KCIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IHQgPDwgIjsiIDw8IGVuZGw7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBGb3J3YXJkIGRlY2xhcmUgc3RydWN0IGRlZgorICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCisgKiB3aXRoIGRhdGEgbWVtYmVycyBhbmQgYSByZWFkL3dyaXRlKCkgZnVuY3Rpb24sIHBsdXMgYSBtaXJyb3JpbmcgaXNzZXQKKyAqIGlubmVyIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3BwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24sIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc19pbXBsXywgZl90eXBlc19pbXBsXywgdHN0cnVjdCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3R5cGVzX3RjY18gOiBmX3R5cGVzX2ltcGxfKTsKKyAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX3N0cnVjdF9zd2FwKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9jb3B5X2NvbnN0cnVjdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGlmIChnZW5fbW92ZWFibGVfKSB7CisgICAgZ2VuZXJhdGVfbW92ZV9jb25zdHJ1Y3RvcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICB9CisgIGdlbmVyYXRlX2Fzc2lnbm1lbnRfb3BlcmF0b3IoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7CisgIGlmIChnZW5fbW92ZWFibGVfKSB7CisgICAgZ2VuZXJhdGVfbW92ZV9hc3NpZ25tZW50X29wZXJhdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICB9CisKKyAgaWYgKCFoYXNfY3VzdG9tX29zdHJlYW0odHN0cnVjdCkpIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICB9CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZChmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKyAgfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29weV9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgLyppc19tb3ZlPSovZmFsc2UpOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbW92ZV9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgLyppc19tb3ZlPSovdHJ1ZSk7Cit9CisKK25hbWVzcGFjZSB7CisvLyBIZWxwZXIgdG8gY29udmVydCBhIHZhcmlhYmxlIHRvIHJ2YWx1ZSwgaWYgbW92ZSBpcyBlbmFibGVkCitzdGQ6OnN0cmluZyBtYXliZU1vdmUoc3RkOjpzdHJpbmcgY29uc3QmIG90aGVyLCBib29sIG1vdmUpIHsKKyAgaWYgKG1vdmUpIHsKKyAgICByZXR1cm4gInN0ZDo6bW92ZSgiICsgb3RoZXIgKyAiKSI7CisgIH0KKyAgcmV0dXJuIG90aGVyOworfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RydWN0b3JfaGVscGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21vdmUpIHsKKworICBzdGQ6OnN0cmluZyB0bXBfbmFtZSA9IHRtcCgib3RoZXIiKTsKKworICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICBpZiAoaXNfbW92ZSkgeworICAgIG91dCA8PCAiKCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYmICI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImICI7CisgIH0KKyAgb3V0IDw8IHRtcF9uYW1lIDw8ICIpICI7CisgIGlmIChpc19leGNlcHRpb24pCisgICAgb3V0IDw8ICI6IFRFeGNlcHRpb24oKSAiOworICBvdXQgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIC8vIGVsaW1pbmF0ZSBjb21waWxlciB1bnVzZWQgd2FybmluZworICBpZiAobWVtYmVycy5lbXB0eSgpKQorICAgIGluZGVudChvdXQpIDw8ICIodm9pZCkgIiA8PCB0bXBfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBmb3IgKGZfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgZl9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICBpbmRlbnQob3V0KSA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICA8PCBtYXliZU1vdmUodG1wX25hbWUgKyAiLiIgKyAoKmZfaXRlciktPmdldF9uYW1lKCksIGlzX21vdmUpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldCA9ICIgPDwgbWF5YmVNb3ZlKHRtcF9uYW1lICsgIi5fX2lzc2V0IiwgaXNfbW92ZSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Fzc2lnbm1lbnRfb3BlcmF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihvdXQsIHRzdHJ1Y3QsIC8qaXNfbW92ZT0qL2ZhbHNlKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX21vdmVfYXNzaWdubWVudF9vcGVyYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2Fzc2lnbm1lbnRfaGVscGVyKG91dCwgdHN0cnVjdCwgLyppc19tb3ZlPSovdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX21vdmUpIHsKKyAgc3RkOjpzdHJpbmcgdG1wX25hbWUgPSB0bXAoIm90aGVyIik7CisKKyAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6b3BlcmF0b3I9KCI7CisKKyAgaWYgKGlzX21vdmUpIHsKKyAgICBvdXQgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiYgIjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgImNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiAiOworICB9CisgIG91dCA8PCB0bXBfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIC8vIGVsaW1pbmF0ZSBjb21waWxlciB1bnVzZWQgd2FybmluZworICBpZiAobWVtYmVycy5lbXB0eSgpKQorICAgIGluZGVudChvdXQpIDw8ICIodm9pZCkgIiA8PCB0bXBfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBmb3IgKGZfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgZl9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICBpbmRlbnQob3V0KSA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICA8PCBtYXliZU1vdmUodG1wX25hbWUgKyAiLiIgKyAoKmZfaXRlciktPmdldF9uYW1lKCksIGlzX21vdmUpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzKSB7CisgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQgPSAiIDw8IG1heWJlTW92ZSh0bXBfbmFtZSArICIuX19pc3NldCIsIGlzX21vdmUpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAqdGhpczsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlcyB0aGUgc3RydWN0IGRlY2xhcmF0aW9uIGludG8gdGhlIGhlYWRlciBmaWxlCisgKgorICogQHBhcmFtIG91dCBPdXRwdXQgc3RyZWFtCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzd2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VzZXJfc3RydWN0KSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBleHRlbmRzID0gIiA6IHB1YmxpYyA6OmFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNfdXNlcl9zdHJ1Y3QgJiYgIWdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBleHRlbmRzID0gIiA6IHB1YmxpYyB2aXJ0dWFsIDo6YXBhY2hlOjp0aHJpZnQ6OlRCYXNlIjsKKyAgICB9CisgIH0KKworICAvLyBHZXQgbWVtYmVycworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIC8vIFdyaXRlIHRoZSBpc3NldCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb24gb3V0c2lkZSB0aGUgY2xhc3MuIFRoaXMgbWFrZXMKKyAgLy8gdGhlIGdlbmVyYXRlZCBjb2RlIGFtZW5hYmxlIHRvIHByb2Nlc3NpbmcgYnkgU1dJRy4KKyAgLy8gV2Ugb25seSBkZWNsYXJlIHRoZSBzdHJ1Y3QgaWYgaXQgZ2V0cyB1c2VkIGluIHRoZSBjbGFzcy4KKworICAvLyBJc3NldCBzdHJ1Y3QgaGFzIGJvb2xlYW4gZmllbGRzLCBidXQgb25seSBmb3Igbm9uLXJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gZmFsc2U7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICB9CisKKyAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMgJiYgKCFwb2ludGVycyB8fCByZWFkKSkgeworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCgpICI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBzdHJpbmcgaXNTZXQgPSAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgb3V0IDw8ICI6ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBpc1NldCA8PCAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGlzU2V0IDw8ICIpIjsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIge30iIDw8IGVuZGw7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIDoxOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IF8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQ7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gT3BlbiBzdHJ1Y3QgZGVmCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiIHB1YmxpYzoiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKCFwb2ludGVycykgeworICAgIC8vIENvcHkgY29uc3RydWN0b3IKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImKTsiIDw8IGVuZGw7CisKKyAgICAvLyBNb3ZlIGNvbnN0cnVjdG9yCisgICAgaWYgKGdlbl9tb3ZlYWJsZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYmKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQXNzaWdubWVudCBPcGVyYXRvcgorICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgb3BlcmF0b3I9KGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJik7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBNb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgICBpZiAoZ2VuX21vdmVhYmxlXykgeworICAgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiBvcGVyYXRvcj0oIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImJik7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSI7CisKKyAgICBib29sIGluaXRfY3RvciA9IGZhbHNlOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpIHx8IHQtPmlzX2VudW0oKSB8fCBpc19yZWZlcmVuY2UoKm1faXRlcikpIHsKKyAgICAgICAgc3RyaW5nIGR2YWw7CisgICAgICAgIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgICAgICBkdmFsICs9ICIoIiArIHR5cGVfbmFtZSh0KSArICIpIjsKKyAgICAgICAgfQorICAgICAgICBkdmFsICs9ICh0LT5pc19zdHJpbmcoKSB8fCBpc19yZWZlcmVuY2UoKm1faXRlcikpID8gIiIgOiAiMCI7CisgICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKKyAgICAgICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCBjdik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpbml0X2N0b3IpIHsKKyAgICAgICAgICBpbml0X2N0b3IgPSB0cnVlOworICAgICAgICAgIG91dCA8PCAiIDogIjsKKyAgICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBkdmFsIDw8ICIpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGR2YWwgPDwgIikiOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gVE9ETyhkcmVpc3MpOiBXaGVuIGV2ZXJ5dGhpbmcgZWxzZSBpbiBUaHJpZnQgaXMgcGVyZmVjdCwKKyAgICAvLyBkbyBtb3JlIG9mIHRoZXNlIGluIHRoZSBpbml0aWFsaXplciBsaXN0LgorICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKworICAgICAgaWYgKCF0LT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIGlmIChjdiAhPSBOVUxMKSB7CisgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAoKm1faXRlciktPmdldF9uYW1lKCksIHQsIGN2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgPT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7CisgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgbm9leGNlcHQ7IiA8PCBlbmRsOworICB9CisKKyAgLy8gRGVjbGFyZSBhbGwgZmllbGRzCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludGVycyAmJiAhKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZWFkKSA8PCBlbmRsOworICB9CisKKyAgLy8gQWRkIHRoZSBfX2lzc2V0IGRhdGEgbWVtYmVyIGlmIHdlIG5lZWQgaXQsIHVzaW5nIHRoZSBkZWZpbml0aW9uIGZyb20gYWJvdmUKKyAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMgJiYgKCFwb2ludGVycyB8fCByZWFkKSkgeworICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0IF9faXNzZXQ7IiA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc2V0dGVyIGZ1bmN0aW9uIGZvciBlYWNoIGZpZWxkCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAocG9pbnRlcnMpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoaXNfcmVmZXJlbmNlKCgqbV9pdGVyKSkpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkIF9fc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoOjpzdGQ6OnNoYXJlZF9wdHI8IgorICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIj4iOworICAgICAgb3V0IDw8ICIgdmFsKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkIF9fc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKTsKKyAgICAgIG91dCA8PCAiIHZhbCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBpZiAoIXBvaW50ZXJzKSB7CisgICAgLy8gU2hvdWxkIHdlIGdlbmVyYXRlIGRlZmF1bHQgb3BlcmF0b3JzPworICAgIGlmICghZ2VuX25vX2RlZmF1bHRfb3BlcmF0b3JzXykgeworICAgICAgLy8gR2VuZXJhdGUgYW4gZXF1YWxpdHkgdGVzdGluZyBvcGVyYXRvci4gIE1ha2UgaXQgaW5saW5lIHNpbmNlIHRoZSBjb21waWxlcgorICAgICAgLy8gd2lsbCBkbyBhIGJldHRlciBqb2IgdGhhbiB3ZSB3b3VsZCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gaW5saW5lIGl0LgorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yID09IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmICIKKyAgICAgICAgICA8PCAobWVtYmVycy5zaXplKCkgPiAwID8gInJocyIgOiAiLyogcmhzICovIikgPDwgIikgY29uc3QiIDw8IGVuZGw7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKKyAgICAgICAgLy8gc28gd2UgdHJlYXQgImRlZmF1bHQiIGZpZWxkcyBhcyByZXF1aXJlZC4KKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghKCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gcmhzLiIKKyAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSByaHMuX19pc3NldC4iCisgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJlbHNlIGlmIChfX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgJiYgISgiCisgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IHJocy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJnJocykgY29uc3QgeyIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAhKCp0aGlzID09IHJocyk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgLy8gR2VuZXJhdGUgdGhlIGRlY2xhcmF0aW9uIG9mIGEgbGVzcy10aGFuIG9wZXJhdG9yLiAgVGhpcyBtdXN0IGJlCisgICAgICAvLyBpbXBsZW1lbnRlZCBieSB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIGlmIHRoZXkgd2lzaCB0byB1c2UgaXQuICAoVGhleQorICAgICAgLy8gd2lsbCBnZXQgYSBsaW5rIGVycm9yIGlmIHRoZXkgdHJ5IHRvIHVzZSBpdCB3aXRob3V0IGFuIGltcGxlbWVudGF0aW9uLikKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBvcGVyYXRvciA8IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmICkgY29uc3Q7IiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAocmVhZCkgeworICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ1aW50MzJfdCByZWFkKFByb3RvY29sXyogaXByb3QpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCByZWFkKCIKKyAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKHdyaXRlKSB7CisgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgInVpbnQzMl90IHdyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0OyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCB3cml0ZSgiCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdDsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBlbmRsOworCisgIGlmIChpc191c2VyX3N0cnVjdCAmJiAhaGFzX2N1c3RvbV9vc3RyZWFtKHRzdHJ1Y3QpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICI7CisgICAgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZF9kZWNsKG91dCwgTlVMTCk7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gc3RkOjpleGNlcHRpb246OndoYXQoKQorICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJtdXRhYmxlIHN0ZDo6c3RyaW5nIHRocmlmdFRFeGNlcHRpb25NZXNzYWdlSG9sZGVyXzsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKG91dCwgdHN0cnVjdCwgZmFsc2UpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChzd2FwKSB7CisgICAgLy8gR2VuZXJhdGUgYSBuYW1lc3BhY2Utc2NvcGUgc3dhcCgpIGZ1bmN0aW9uCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkIHN3YXAoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJmEsICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiICZiKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGlmIChpc191c2VyX3N0cnVjdCkgeworICAgIGdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2RlY2wob3V0LCB0c3RydWN0KTsKKyAgfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGZvcmNlX2NwcF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXR0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdXNlcl9zdHJ1Y3QpIHsKKyAgLy8gR2V0IG1lbWJlcnMKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAvLyBEZXN0cnVjdG9yCisgIGlmICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSA9PSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKKyAgICBmb3JjZV9jcHBfb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjp+IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiKCkgbm9leGNlcHQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgZm9yY2VfY3BwX291dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc2V0dGVyIGZ1bmN0aW9uIGZvciBlYWNoIGZpZWxkCisgIGlmIChzZXR0ZXJzKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKGlzX3JlZmVyZW5jZSgoKm1faXRlcikpKSB7CisgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkICIgPDwgdHN0cnVjdC0+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+Z2V0X21lbWJlcnMoKTsKKyAgZm9yIChhdXRvIHRmaWVsZCA6IGZpZWxkcykgeworICAgIGlmICh0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN3YXAoYS4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBiLiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIKKyAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzd2FwKGEuX19pc3NldCwgYi5fX2lzc2V0KTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBoYW5kbGUgZW1wdHkgc3RydWN0cworICBpZiAoZmllbGRzLnNpemUoKSA9PSAwKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgYTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgYjsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3JfZGVjbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8ICJzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0ICIKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgIDw8ICImIG9iaik7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpZiAoIWhhc19jdXN0b21fb3N0cmVhbSh0c3RydWN0KSkgeworICAgIC8vIHRocmlmdCBkZWZpbmVzIHRoaXMgYmVoYXZpb3IKKyAgICBvdXQgPDwgInN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgIgorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICImIG9iaikiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9iai5wcmludFRvKG91dCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gb3V0OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8ICJ2b2lkICI7CisgIGlmICh0c3RydWN0KSB7CisgICAgb3V0IDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6IjsKKyAgfQorICBvdXQgPDwgInByaW50VG8oc3RkOjpvc3RyZWFtJiBvdXQpIGNvbnN0IjsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZXJuYWwpIHsKKyAgb3V0IDw8ICJjb25zdCBjaGFyKiAiOworICBpZiAoZXh0ZXJuYWwpIHsKKyAgICBvdXQgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjoiOworICB9CisgIG91dCA8PCAid2hhdCgpIGNvbnN0IG5vZXhjZXB0IjsKK30KKworbmFtZXNwYWNlIHN0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2dlbmVyYXRvciB7Cit2b2lkIGdlbmVyYXRlX3JlcXVpcmVkX2ZpZWxkX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgeworICBvdXQgPDwgIiA8PCB0b19zdHJpbmcoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSI7Cit9CisKK3ZvaWQgZ2VuZXJhdGVfb3B0aW9uYWxfZmllbGRfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7CisgIG91dCA8PCAiOyAoX19pc3NldC4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPyAob3V0IjsKKyAgZ2VuZXJhdGVfcmVxdWlyZWRfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7CisgIG91dCA8PCAiKSA6IChvdXQgPDwgXCI8bnVsbD5cIikpIjsKK30KKwordm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkKKyAgICBnZW5lcmF0ZV9vcHRpb25hbF9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKKyAgZWxzZQorICAgIGdlbmVyYXRlX3JlcXVpcmVkX2ZpZWxkX3ZhbHVlKG91dCwgZmllbGQpOworfQorCit2b2lkIGdlbmVyYXRlX2ZpZWxkX25hbWUoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7CisgIG91dCA8PCAiXCIiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI9XCIiOworfQorCit2b2lkIGdlbmVyYXRlX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgeworICBnZW5lcmF0ZV9maWVsZF9uYW1lKG91dCwgZmllbGQpOworICBnZW5lcmF0ZV9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKK30KKwordm9pZCBnZW5lcmF0ZV9maWVsZHMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5kZW50KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGJlZyA9IGZpZWxkcy5iZWdpbigpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBmaWVsZHMuZW5kKCk7CisKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGJlZzsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgb3V0IDw8IGluZGVudCA8PCAib3V0IDw8ICI7CisKKyAgICBpZiAoaXQgIT0gYmVnKSB7CisgICAgICBvdXQgPDwgIlwiLCBcIiA8PCAiOworICAgIH0KKworICAgIGdlbmVyYXRlX2ZpZWxkKG91dCwgKml0KTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgb3BlcmF0b3I8PAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpOworICBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kX2RlY2wob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OnRvX3N0cmluZzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0IDw8IFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCI7IiA8PCBlbmRsOworICBzdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkcyhvdXQsIHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIGluZGVudCgpKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXQgPDwgXCIpXCI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB3aGF0KCkgbWV0aG9kIGZvciBleGNlcHRpb25zCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKTsKKyAgZ2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kX2RlY2wob3V0LCB0c3RydWN0LCB0cnVlKTsKKyAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZ3N0cmVhbSBzczsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic3MgPDwgXCJURXhjZXB0aW9uIC0gc2VydmljZSBoYXMgdGhyb3duOiBcIiA8PCAqdGhpczsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy0+dGhyaWZ0VEV4Y2VwdGlvbk1lc3NhZ2VIb2xkZXJfID0gc3Muc3RyKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLT50aHJpZnRURXhjZXB0aW9uTWVzc2FnZUhvbGRlcl8uY19zdHIoKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFwiVEV4Y2VwdGlvbiAtIHNlcnZpY2UgaGFzIHRocm93bjogIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIjsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQorICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCisgKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCisgKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlcworICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIi5oIjsKKyAgZl9oZWFkZXJfLm9wZW4oZl9oZWFkZXJfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIgZmlsZSBpbmNsdWRlcworICBmX2hlYWRlcl8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfaGVhZGVyXyA8PCAiI2lmbmRlZiAiIDw8IHN2Y25hbWUgPDwgIl9IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgc3ZjbmFtZSA8PCAiX0giIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGVuZGw7CisgIGlmIChnZW5fY29iX3N0eWxlXykgeworICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4iIDw8IGVuZGwgLy8gVE1lbW9yeUJ1ZmZlcgorICAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPGZ1bmN0aW9uYWw+IiA8PCBlbmRsIAorICAgICAgICAgICAgICA8PCAibmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCAiY2xhc3MgVEFzeW5jQ2hhbm5lbDsiIDw8IGVuZGwgPDwgIn19fSIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmg+IiA8PCBlbmRsOworICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaD4iIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaD4iIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPG1lbW9yeT4iIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhcIiIKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+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+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiLCBwdWJsaWMgIiArIGV4dGVuZHMgKyBzdHlsZSArIGNsaWVudF9zdWZmaXg7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgIGZfaGVhZGVyXyA8PCAiLy8gVGhlIFwnY29uY3VycmVudFwnIGNsaWVudCBpcyBhIHRocmVhZCBzYWZlIGNsaWVudCB0aGF0IGNvcnJlY3RseSBoYW5kbGVzXG4iCisgICAgICAgICAgICAgICAgICIvLyBvdXQgb2Ygb3JkZXIgcmVzcG9uc2VzLiAgSXQgaXMgc2xvd2VyIHRoYW4gdGhlIHJlZ3VsYXIgY2xpZW50LCBzbyBzaG91bGRcbiIKKyAgICAgICAgICAgICAgICAgIi8vIG9ubHkgYmUgdXNlZCB3aGVuIHlvdSBuZWVkIHRvIHNoYXJlIGEgY29ubmVjdGlvbiBhbW9uZyBtdWx0aXBsZSB0aHJlYWRzXG4iOworICB9CisgIGZfaGVhZGVyXyA8PCB0ZW1wbGF0ZV9oZWFkZXIgPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXgKKyAgICAgICAgICAgIDw8ICIgOiAiCisgICAgICAgICAgICA8PCAidmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IGlmc3R5bGUgPDwgaWZfc3VmZml4IDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgeyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoc3R5bGUgIT0gIkNvYiIpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIigiIDw8IHByb3RfcHRyCisJCTw8ICIgcHJvdCI7CisJaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworCQlmX2hlYWRlcl8gPDwgIiwgc3RkOjpzaGFyZWRfcHRyPDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQ29uY3VycmVudENsaWVudFN5bmNJbmZvPiBzeW5jIjsKKwl9CisJZl9oZWFkZXJfIDw8ICIpICI7CisKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCAiOiBzeW5jXyhzeW5jKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfaGVhZGVyXyA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIocHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeCA8PCAiKHByb3QsIHByb3QiOworICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIGZfaGVhZGVyXyA8PCAiLCBzeW5jIjsKKyAgICAgIH0KKyAgICAgIGZfaGVhZGVyXyA8PCAiKSB7fSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIigiIDw8IHByb3RfcHRyCisJCTw8ICIgaXByb3QsICIgPDwgcHJvdF9wdHIgPDwgIiBvcHJvdCI7CisJaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworCQlmX2hlYWRlcl8gPDwgIiwgc3RkOjpzaGFyZWRfcHRyPDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQ29uY3VycmVudENsaWVudFN5bmNJbmZvPiBzeW5jIjsKKwl9CisJZl9oZWFkZXJfIDw8ICIpICI7CisJCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICBmX2hlYWRlcl8gPDwgIjogc3luY18oc3luYykiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX2hlYWRlcl8gPDwgInsiIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKGlwcm90LG9wcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9oZWFkZXJfIDw8ICI6IiA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeAorICAgICAgICAgICAgICAgIDw8ICIoaXByb3QsIG9wcm90IjsKKyAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBmX2hlYWRlcl8gPDwgIiwgc3luYyI7CisgICAgICB9CisgICAgICBmX2hlYWRlcl8gPDwgIikge30iIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gY3JlYXRlIHRoZSBzZXRQcm90b2NvbCBtZXRob2RzCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgICAgZl9oZWFkZXJfIDw8ICIgcHJpdmF0ZToiIDw8IGVuZGw7CisgICAgICAvLyAxOiBvbmUgcGFyYW1ldGVyCisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwgcHJvdF9wdHIgPDwgIiBwcm90KSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIihwcm90LHByb3QpOyIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIC8vIDI6IHR3byBwYXJhbWV0ZXIKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIiA8PCBwcm90X3B0ciA8PCAiIGlwcm90LCAiCisgICAgICAgICAgICAgICAgPDwgcHJvdF9wdHIgPDwgIiBvcHJvdCkgeyIgPDwgZW5kbDsKKworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHBpcHJvdF89aXByb3Q7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHBvcHJvdF89b3Byb3Q7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gaXByb3QuZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgb3Byb3RfID0gb3Byb3QuZ2V0KCk7IiA8PCBlbmRsOworCisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIEdlbmVyYXRlIGdldHRlcnMgZm9yIHRoZSBwcm90b2NvbHMuCisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGFyZSBub3QgY3VycmVudGx5IHRlbXBsYXRlZCBmb3Igc2ltcGxpY2l0eS4KKyAgICAvLyBUT0RPKHNpbXBraW5zKTogc2hvdWxkIHRoZXkgYmUgdGVtcGxhdGVkPworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAic3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBnZXRJbnB1dFByb3RvY29sKCkgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBfdGhpcyA8PCAicGlwcm90XzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gZ2V0T3V0cHV0UHJvdG9jb2woKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IF90aGlzIDw8ICJwb3Byb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICB9IGVsc2UgLyogaWYgKHN0eWxlID09ICJDb2IiKSAqLyB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIgorICAgICAgICAgICAgICA8PCAic3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbCwgIgorICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3RvcnkqIHByb3RvY29sRmFjdG9yeSkgOiIgPDwgZW5kbDsKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgY2hhbm5lbF8oY2hhbm5lbCksIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgaXRyYW5zXyhuZXcgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKCkpLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG90cmFuc18obmV3IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcigpKSwiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICAvLyBUUHJvdG9jb2xGYWN0b3J5IGNsYXNzZXMgcmV0dXJuIGdlbmVyaWMgVFByb3RvY29sIHBvaW50ZXJzLgorICAgICAgICAvLyBXZSBoYXZlIHRvIGR5bmFtaWMgY2FzdCB0byB0aGUgUHJvdG9jb2xfIHR5cGUgd2UgYXJlIGV4cGVjdGluZy4KKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHBpcHJvdF8oOjpzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFByb3RvY29sXz4oIgorICAgICAgICAgICAgICAgICAgPDwgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpKSwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgIHBvcHJvdF8oOjpzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFByb3RvY29sXz4oIgorICAgICAgICAgICAgICAgICAgPDwgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wob3RyYW5zXykpKSB7IiA8PCBlbmRsOworICAgICAgICAvLyBUaHJvdyBhIFRFeGNlcHRpb24gaWYgZWl0aGVyIGR5bmFtaWMgY2FzdCBmYWlsZWQuCisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpZiAoIXBpcHJvdF8gfHwgIXBvcHJvdF8pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgICAgdGhyb3cgOjphcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihcIiIKKyAgICAgICAgICAgICAgICAgIDw8ICJUUHJvdG9jb2xGYWN0b3J5IHJldHVybmVkIHVuZXhwZWN0ZWQgcHJvdG9jb2wgdHlwZSBpbiAiIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiIGNvbnN0cnVjdG9yXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBwaXByb3RfKHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcG9wcm90Xyhwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKG90cmFuc18pKSB7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90XyA9IHBpcHJvdF8uZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgb3Byb3RfID0gcG9wcm90Xy5nZXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeAorICAgICAgICAgICAgICAgIDw8ICIoY2hhbm5lbCwgcHJvdG9jb2xGYWN0b3J5KSB7fSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gZ2V0Q2hhbm5lbCgpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgImNoYW5uZWxfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpZiAoIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB2b2lkIGNvbXBsZXRlZF9fKGJvb2wgLyogc3VjY2VzcyAqLykge30iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGlmc3R5bGUpIDw8ICI7IiA8PCBlbmRsOworICAgIC8vIFRPRE8oZHJlaXNzKTogVXNlIHByaXZhdGUgaW5oZXJpdGFuY2UgdG8gYXZvaWQgZ2VuZXJhdGluZyB0aGlzZSBpbiBjb2Itc3R5bGUuCisgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IiAmJiAhKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgLy8gY29uY3VycmVudCBjbGllbnRzIG5lZWQgdG8gbW92ZSB0aGUgc2VxaWQgZnJvbSB0aGUgc2VuZCBmdW5jdGlvbiB0byB0aGUKKyAgICAgIC8vIHJlY3YgZnVuY3Rpb24uICBPbmV3YXkgbWV0aG9kcyBkb24ndCBoYXZlIGEgcmVjdiBmdW5jdGlvbiwgc28gd2UgZG9uJ3QgbmVlZCB0bworICAgICAgLy8gbW92ZSB0aGUgc2VxaWQgZm9yIHRoZW0uICBBdHRlbXB0aW5nIHRvIGRvIHNvIHdvdWxkIHJlc3VsdCBpbiBhIHNlcWlkIGxlYWsuCisgICAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX2kzMiwgLypyZXR1cm5pbmcgc2VxaWQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgdF9maWVsZCBzZXFJZEFyZyhnX3R5cGVfaTMyLCAic2VxaWQiKTsKKyAgICAgICAgdF9zdHJ1Y3Qgc2VxSWRBcmdTdHJ1Y3QocHJvZ3JhbV8pOworICAgICAgICBzZXFJZEFyZ1N0cnVjdC5hcHBlbmQoJnNlcUlkQXJnKTsKKyAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXFJZEFyZ1N0cnVjdCk7CisgICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sICIiKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9oZWFkZXJfIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChzdHlsZSA9PSAiQ29iIikgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbF87IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gaXRyYW5zXzsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBvdHJhbnNfOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBmX2hlYWRlcl8gPDwKKyAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcGlwcm90XzsiIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcG9wcm90XzsiIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8IHByb3RvY29sX3R5cGUgPDwgIiogaXByb3RfOyIgPDwgZW5kbCA8PAorICAgICAgaW5kZW50KCkgPDwgcHJvdG9jb2xfdHlwZSA8PCAiKiBvcHJvdF87IiA8PCBlbmRsOworCisgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgZl9oZWFkZXJfIDw8CisgICAgICAgIGluZGVudCgpIDw8ICJzdGQ6OnNoYXJlZF9wdHI8OjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRDb25jdXJyZW50Q2xpZW50U3luY0luZm8+IHN5bmNfOyI8PGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgLy8gT3V0cHV0IGEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdHlwZWRlZiB1c2luZworICAgIC8vIFRQcm90b2NvbCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorICAgIGZfaGVhZGVyXyA8PCAidHlwZWRlZiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUKKyAgICAgICAgICAgICAgPDwgIkNsaWVudFQ8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+ICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZQorICAgICAgICAgICAgICA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIHNjb3BlID0gc2VydmljZV9uYW1lXyArIHN0eWxlICsgY2xpZW50X3N1ZmZpeCArICI6OiI7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgc2VxSWRDYXB0dXJlOworICAgIHN0cmluZyBzZXFJZFVzZTsKKyAgICBzdHJpbmcgc2VxSWRDb21tYVVzZTsKKyAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiICYmICEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzZXFJZENhcHR1cmUgPSAiaW50MzJfdCBzZXFpZCA9ICI7CisgICAgICBzZXFJZFVzZSA9ICJzZXFpZCI7CisgICAgICBzZXFJZENvbW1hVXNlID0gIiwgc2VxaWQiOworICAgIH0KKworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgaW5kZW50KG91dCkgPDwgdGVtcGxhdGVfaGVhZGVyOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgaWZzdHlsZSwgc2NvcGUpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCBzZXFJZENhcHR1cmUgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgaWYgKHN0eWxlICE9ICJDb2IiKSB7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgICAgICBvdXQgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoX3JldHVybiIgPDwgc2VxSWRDb21tYVVzZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCAicmV0dXJuIHJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBzZXFJZFVzZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IHNlcUlkVXNlIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IF90aGlzIDw8ICJjaGFubmVsXy0+c2VuZEFuZFJlY3ZNZXNzYWdlKCIKKyAgICAgICAgICAgIDw8ICI6OnN0ZDo6YmluZChjb2IsIHRoaXMpLCAiIDw8IF90aGlzIDw8ICJvdHJhbnNfLmdldCgpLCAiIDw8IF90aGlzIDw8ICJpdHJhbnNfLmdldCgpKTsiCisgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IF90aGlzIDw8ICJjaGFubmVsXy0+c2VuZE1lc3NhZ2UoIgorICAgICAgICAgICAgPDwgIjo6c3RkOjpiaW5kKGNvYiwgdGhpcyksICIgPDwgX3RoaXMgPDwgIm90cmFuc18uZ2V0KCkpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gaWYgKHN0eWxlICE9ICJDb2IiKSAvLyBUT0RPKGRyZWlzcyk6IExpYmlmeSB0aGUgY2xpZW50IGFuZCBkb24ndCBnZW5lcmF0ZSB0aGlzIGZvciBjb2Itc3R5bGUKKyAgICBpZiAodHJ1ZSkgeworICAgICAgdF90eXBlKiBzZW5kX2Z1bmNfcmV0dXJuX3R5cGUgPSBnX3R5cGVfdm9pZDsKKyAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIgJiYgISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgc2VuZF9mdW5jX3JldHVybl90eXBlID0gZ190eXBlX2kzMjsKKyAgICAgIH0KKyAgICAgIC8vIEZ1bmN0aW9uIGZvciBzZW5kaW5nCisgICAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oc2VuZF9mdW5jX3JldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgICAvLyBPcGVuIHRoZSBzZW5kIGZ1bmN0aW9uCisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgdGVtcGxhdGVfaGVhZGVyOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCAiIiwgc2NvcGUpIDw8IGVuZGw7CisgICAgICBzY29wZV91cChvdXQpOworCisgICAgICAvLyBGdW5jdGlvbiBhcmd1bWVudHMgYW5kIHJlc3VsdHMKKyAgICAgIHN0cmluZyBhcmdzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9wYXJncyI7CisgICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9wcmVzdWx0IjsKKworICAgICAgc3RyaW5nIGNzZXFpZFZhbCA9ICIwIjsKKyAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgY3NlcWlkVmFsID0gInRoaXMtPnN5bmNfLT5nZW5lcmF0ZVNlcUlkKCkiOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICAgIG91dCA8PAorICAgICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCBjc2VxaWQgPSAiIDw8IGNzZXFpZFZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGlmKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRDb25jdXJyZW50U2VuZFNlbnRyeSBzZW50cnkodGhpcy0+c3luY18uZ2V0KCkpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGlmIChzdHlsZSA9PSAiQ29iIikgeworICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAib3RyYW5zXy0+cmVzZXRCdWZmZXIoKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwKKyAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgIm9wcm90Xy0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8CisgICAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PAorICAgICAgICAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjoiIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRfT05FV0FZIiA6ICJUX0NBTEwiKSA8PAorICAgICAgICAiLCBjc2VxaWQpOyIgPDwgZW5kbCA8PCBlbmRsIDw8CisgICAgICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJnczsiIDw8IGVuZGw7CisKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAmIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZSgiIDw8IF90aGlzIDw8ICJvcHJvdF8pOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCisgICAgICAgICAgPDwgIm9wcm90Xy0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCisgICAgICAgICAgPDwgIm9wcm90Xy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCisgICAgICAgICAgPDwgIm9wcm90Xy0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOworCisgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOworCisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNzZXFpZDsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIG91dCA8PCBlbmRsOworCisgICAgICAvLyBHZW5lcmF0ZSByZWN2IGZ1bmN0aW9uIG9ubHkgaWYgbm90IGFuIG9uZXdheSBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgICAgdF9maWVsZCBzZXFJZEFyZyhnX3R5cGVfaTMyLCAic2VxaWQiKTsKKyAgICAgICAgdF9zdHJ1Y3Qgc2VxSWRBcmdTdHJ1Y3QocHJvZ3JhbV8pOworICAgICAgICBzZXFJZEFyZ1N0cnVjdC5hcHBlbmQoJnNlcUlkQXJnKTsKKworICAgICAgICB0X3N0cnVjdCogcmVjdl9mdW5jdGlvbl9hcmdzID0gJm5vYXJnczsKKyAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIHJlY3ZfZnVuY3Rpb25fYXJncyA9ICZzZXFJZEFyZ1N0cnVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN2X2Z1bmN0aW9uX2FyZ3MpOworICAgICAgICAvLyBPcGVuIHRoZSByZWN2IGZ1bmN0aW9uCisgICAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sICIiLCBzY29wZSkgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfdXAob3V0KTsKKworICAgICAgICBvdXQgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJpbnQzMl90IHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nIGZuYW1lOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOyIgPDwgZW5kbDsKKyAgICAgICAgaWYoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiLy8gdGhlIHJlYWQgbXV0ZXggZ2V0cyBkcm9wcGVkIGFuZCByZWFjcXVpcmVkIGFzIHBhcnQgb2Ygd2FpdEZvcldvcmsoKSIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIi8vIFRoZSBkZXN0cnVjdG9yIG9mIHRoaXMgc2VudHJ5IHdha2VzIHVwIG90aGVyIGNsaWVudHMiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VENvbmN1cnJlbnRSZWN2U2VudHJ5IHNlbnRyeSh0aGlzLT5zeW5jXy5nZXQoKSwgc2VxaWQpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgY29tcGxldGVkID0gZmFsc2U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInRyeSB7IjsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIndoaWxlKHRydWUpIHsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlmKCF0aGlzLT5zeW5jXy0+Z2V0UGVuZGluZyhmbmFtZSwgbXR5cGUsIHJzZXFpZCkpIHsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHJzZXFpZCk7IiA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYoc2VxaWQgPT0gcnNlcWlkKSB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHg7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgeC5yZWFkKCIgPDwgX3RoaXMgPDwgImlwcm90Xyk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHg7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlICE9IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZKSB7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5za2lwKCIgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyhmYWxzZSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChmbmFtZS5jb21wYXJlKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSAhPSAwKSB7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5za2lwKCIgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyhmYWxzZSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBvdXQgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgLy8gaW4gYSBiYWQgc3RhdGUsIGRvbid0IGNvbW1pdCIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdXNpbmcgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbjsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCisgICAgICAgICAgICAmJiAhaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgICB0X2ZpZWxkIHJldHVybmZpZWxkKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgIl9yZXR1cm4iKTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQpIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAmX3JldHVybjsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKCIgPDwgX3RoaXMgPDwgImlwcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCisgICAgICAgICAgICA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgICAgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICAvLyBDYXJlZnVsLCBvbmx5IGxvb2sgZm9yIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsOworICAgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIF9yZXR1cm4gcG9pbnRlciBoYXMgbm93IGJlZW4gZmlsbGVkIiA8PCBlbmRsOworICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgc2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8CisgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsOworICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgc2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gX3JldHVybjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgc2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHRocm93IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIG9ubHkgZ2V0IGhlcmUgaWYgd2UgYXJlIGEgdm9pZCBmdW5jdGlvbgorICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRlZF9fKHRydWUpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gaW4gYSBiYWQgc3RhdGUsIGRvbid0IGNvbW1pdCIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24oOjphcGFjaGU6OnRocmlmdDo6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBzZXFpZCAhPSByc2VxaWQiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPnN5bmNfLT51cGRhdGVQZW5kaW5nKGZuYW1lLCBtdHlwZSwgcnNlcWlkKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIHRoaXMgd2lsbCB0ZW1wb3JhcmlseSB1bmxvY2sgdGhlIHJlYWRNdXRleCwgYW5kIGxldCBvdGhlciBjbGllbnRzIGdldCB3b3JrIGRvbmUiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPnN5bmNfLT53YWl0Rm9yV29yayhzZXFpZCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSAvLyBlbmQgd2hpbGUodHJ1ZSkiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKC4uLikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoIWNvbXBsZXRlZCkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIGNvbXBsZXRlZF9fKGZhbHNlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworY2xhc3MgUHJvY2Vzc29yR2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgUHJvY2Vzc29yR2VuZXJhdG9yKHRfY3BwX2dlbmVyYXRvciogZ2VuZXJhdG9yLCB0X3NlcnZpY2UqIHNlcnZpY2UsIGNvbnN0IHN0cmluZyYgc3R5bGUpOworCisgIHZvaWQgcnVuKCkgeworICAgIGdlbmVyYXRlX2NsYXNzX2RlZmluaXRpb24oKTsKKworICAgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaENhbGwoKSBmdW5jdGlvbgorICAgIGdlbmVyYXRlX2Rpc3BhdGNoX2NhbGwoZmFsc2UpOworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgZ2VuZXJhdGVfZGlzcGF0Y2hfY2FsbCh0cnVlKTsKKyAgICB9CisKKyAgICAvLyBHZW5lcmF0ZSBhbGwgb2YgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbnMoKTsKKworICAgIGdlbmVyYXRlX2ZhY3RvcnkoKTsKKyAgfQorCisgIHZvaWQgZ2VuZXJhdGVfY2xhc3NfZGVmaW5pdGlvbigpOworICB2b2lkIGdlbmVyYXRlX2Rpc3BhdGNoX2NhbGwoYm9vbCB0ZW1wbGF0ZV9wcm90b2NvbCk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbnMoKTsKKyAgdm9pZCBnZW5lcmF0ZV9mYWN0b3J5KCk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiA9IGZhbHNlLCBib29sIGFyZyA9IGZhbHNlKSB7CisgICAgcmV0dXJuIGdlbmVyYXRvcl8tPnR5cGVfbmFtZSh0dHlwZSwgaW5fdHlwZWRlZiwgYXJnKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGluZGVudCgpIHsgcmV0dXJuIGdlbmVyYXRvcl8tPmluZGVudCgpOyB9CisgIHN0ZDo6b3N0cmVhbSYgaW5kZW50KHN0ZDo6b3N0cmVhbSYgb3MpIHsgcmV0dXJuIGdlbmVyYXRvcl8tPmluZGVudChvcyk7IH0KKworICB2b2lkIGluZGVudF91cCgpIHsgZ2VuZXJhdG9yXy0+aW5kZW50X3VwKCk7IH0KKyAgdm9pZCBpbmRlbnRfZG93bigpIHsgZ2VuZXJhdG9yXy0+aW5kZW50X2Rvd24oKTsgfQorCisgIHRfY3BwX2dlbmVyYXRvciogZ2VuZXJhdG9yXzsKKyAgdF9zZXJ2aWNlKiBzZXJ2aWNlXzsKKyAgc3RkOjpvc3RyZWFtJiBmX2hlYWRlcl87CisgIHN0ZDo6b3N0cmVhbSYgZl9vdXRfOworICBzdHJpbmcgc2VydmljZV9uYW1lXzsKKyAgc3RyaW5nIHN0eWxlXzsKKyAgc3RyaW5nIHBzdHlsZV87CisgIHN0cmluZyBjbGFzc19uYW1lXzsKKyAgc3RyaW5nIGlmX25hbWVfOworICBzdHJpbmcgZmFjdG9yeV9jbGFzc19uYW1lXzsKKyAgc3RyaW5nIGZpbmlzaF9jb2JfOworICBzdHJpbmcgZmluaXNoX2NvYl9kZWNsXzsKKyAgc3RyaW5nIHJldF90eXBlXzsKKyAgc3RyaW5nIGNhbGxfY29udGV4dF87CisgIHN0cmluZyBjb2JfYXJnXzsKKyAgc3RyaW5nIGNhbGxfY29udGV4dF9hcmdfOworICBzdHJpbmcgY2FsbF9jb250ZXh0X2RlY2xfOworICBzdHJpbmcgdGVtcGxhdGVfaGVhZGVyXzsKKyAgc3RyaW5nIHRlbXBsYXRlX3N1ZmZpeF87CisgIHN0cmluZyB0eXBlbmFtZV9zdHJfOworICBzdHJpbmcgY2xhc3Nfc3VmZml4XzsKKyAgc3RyaW5nIGV4dGVuZHNfOworfTsKKworUHJvY2Vzc29yR2VuZXJhdG9yOjpQcm9jZXNzb3JHZW5lcmF0b3IodF9jcHBfZ2VuZXJhdG9yKiBnZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN0eWxlKQorICA6IGdlbmVyYXRvcl8oZ2VuZXJhdG9yKSwKKyAgICBzZXJ2aWNlXyhzZXJ2aWNlKSwKKyAgICBmX2hlYWRlcl8oZ2VuZXJhdG9yLT5mX2hlYWRlcl8pLAorICAgIGZfb3V0XyhnZW5lcmF0b3ItPmdlbl90ZW1wbGF0ZXNfID8gZ2VuZXJhdG9yLT5mX3NlcnZpY2VfdGNjXyA6IGdlbmVyYXRvci0+Zl9zZXJ2aWNlXyksCisgICAgc2VydmljZV9uYW1lXyhnZW5lcmF0b3ItPnNlcnZpY2VfbmFtZV8pLAorICAgIHN0eWxlXyhzdHlsZSkgeworICBpZiAoc3R5bGVfID09ICJDb2IiKSB7CisgICAgcHN0eWxlXyA9ICJBc3luYyI7CisgICAgY2xhc3NfbmFtZV8gPSBzZXJ2aWNlX25hbWVfICsgcHN0eWxlXyArICJQcm9jZXNzb3IiOworICAgIGlmX25hbWVfID0gc2VydmljZV9uYW1lXyArICJDb2JTdklmIjsKKworICAgIGZpbmlzaF9jb2JfID0gIjo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsICI7CisgICAgZmluaXNoX2NvYl9kZWNsXyA9ICI6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4sICI7CisgICAgY29iX2FyZ18gPSAiY29iLCAiOworICAgIHJldF90eXBlXyA9ICJ2b2lkICI7CisgIH0gZWxzZSB7CisgICAgY2xhc3NfbmFtZV8gPSBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3NvciI7CisgICAgaWZfbmFtZV8gPSBzZXJ2aWNlX25hbWVfICsgIklmIjsKKworICAgIHJldF90eXBlXyA9ICJib29sICI7CisgICAgLy8gVE9ETyhlZGhhbGwpIGNhbGxDb250ZXh0IHNob3VsZCBldmVudHVhbGx5IGJlIGFkZGVkIHRvIFRBc3luY1Byb2Nlc3NvcgorICAgIGNhbGxfY29udGV4dF8gPSAiLCB2b2lkKiBjYWxsQ29udGV4dCI7CisgICAgY2FsbF9jb250ZXh0X2FyZ18gPSAiLCBjYWxsQ29udGV4dCI7CisgICAgY2FsbF9jb250ZXh0X2RlY2xfID0gIiwgdm9pZCoiOworICB9CisKKyAgZmFjdG9yeV9jbGFzc19uYW1lXyA9IGNsYXNzX25hbWVfICsgIkZhY3RvcnkiOworCisgIGlmIChnZW5lcmF0b3ItPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgdGVtcGxhdGVfaGVhZGVyXyA9ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPlxuIjsKKyAgICB0ZW1wbGF0ZV9zdWZmaXhfID0gIjxQcm90b2NvbF8+IjsKKyAgICB0eXBlbmFtZV9zdHJfID0gInR5cGVuYW1lICI7CisgICAgY2xhc3NfbmFtZV8gKz0gIlQiOworICAgIGZhY3RvcnlfY2xhc3NfbmFtZV8gKz0gIlQiOworICB9CisKKyAgaWYgKHNlcnZpY2VfLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzXyA9IHR5cGVfbmFtZShzZXJ2aWNlXy0+Z2V0X2V4dGVuZHMoKSkgKyBwc3R5bGVfICsgIlByb2Nlc3NvciI7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAvLyBUT0RPKHNpbXBraW5zKTogSWYgZ2VuX3RlbXBsYXRlc18gaXMgZW5hYmxlZCwgd2UgY3VycmVudGx5IGFzc3VtZSBhbGwKKyAgICAgIC8vIHBhcmVudCBzZXJ2aWNlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCisgICAgICBleHRlbmRzXyArPSAiVDxQcm90b2NvbF8+IjsKKyAgICB9CisgIH0KK30KKwordm9pZCBQcm9jZXNzb3JHZW5lcmF0b3I6OmdlbmVyYXRlX2NsYXNzX2RlZmluaXRpb24oKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gc2VydmljZV8tPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBwYXJlbnRfY2xhc3M7CisgIGlmIChzZXJ2aWNlXy0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgcGFyZW50X2NsYXNzID0gZXh0ZW5kc187CisgIH0gZWxzZSB7CisgICAgaWYgKHN0eWxlXyA9PSAiQ29iIikgeworICAgICAgcGFyZW50X2NsYXNzID0gIjo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNEaXNwYXRjaFByb2Nlc3NvciI7CisgICAgfSBlbHNlIHsKKyAgICAgIHBhcmVudF9jbGFzcyA9ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGlzcGF0Y2hQcm9jZXNzb3IiOworICAgIH0KKworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgcGFyZW50X2NsYXNzICs9ICJUPFByb3RvY29sXz4iOworICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBmX2hlYWRlcl8gPDwgdGVtcGxhdGVfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBjbGFzc19uYW1lXyA8PCAiIDogcHVibGljICIgPDwgcGFyZW50X2NsYXNzIDw8ICIgeyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gUHJvdGVjdGVkIGRhdGEgbWVtYmVycworICBmX2hlYWRlcl8gPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IGlmX25hbWVfIDw8ICI+IGlmYWNlXzsiIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IHJldF90eXBlXyA8PCAiZGlzcGF0Y2hDYWxsKCIgPDwgZmluaXNoX2NvYl8KKyAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgIgorICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCAiCisgICAgICAgICAgICA8PCAiY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfIDw8ICIpOyIgPDwgZW5kbDsKKyAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgcmV0X3R5cGVfIDw8ICJkaXNwYXRjaENhbGxUZW1wbGF0ZWQoIiA8PCBmaW5pc2hfY29iXworICAgICAgICAgICAgICA8PCAiUHJvdG9jb2xfKiBpcHJvdCwgUHJvdG9jb2xfKiBvcHJvdCwgIgorICAgICAgICAgICAgICA8PCAiY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIC8vIFByb2Nlc3MgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisgIGZfaGVhZGVyXyA8PCAiIHByaXZhdGU6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBEZWNsYXJlIHByb2Nlc3NNYXBfCisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiAgdm9pZCAoIiA8PCBjbGFzc19uYW1lXyA8PCAiOjoqIgorICAgICAgICAgICAgPDwgIlByb2Nlc3NGdW5jdGlvbikoIiA8PCBmaW5pc2hfY29iX2RlY2xfIDw8ICJpbnQzMl90LCAiCisgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCosICIKKyAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiIgPDwgY2FsbF9jb250ZXh0X2RlY2xfIDw8ICIpOyIgPDwgZW5kbDsKKyAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmIHZvaWQgKCIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6KiIKKyAgICAgICAgICAgICAgPDwgIlNwZWNpYWxpemVkUHJvY2Vzc0Z1bmN0aW9uKSgiIDw8IGZpbmlzaF9jb2JfZGVjbF8gPDwgImludDMyX3QsICIKKyAgICAgICAgICAgICAgPDwgIlByb3RvY29sXyosIFByb3RvY29sXyoiIDw8IGNhbGxfY29udGV4dF9kZWNsXyA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInN0cnVjdCBQcm9jZXNzRnVuY3Rpb25zIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgUHJvY2Vzc0Z1bmN0aW9uIGdlbmVyaWM7IgorICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFNwZWNpYWxpemVkUHJvY2Vzc0Z1bmN0aW9uIHNwZWNpYWxpemVkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiICBQcm9jZXNzRnVuY3Rpb25zKFByb2Nlc3NGdW5jdGlvbiBnLCAiCisgICAgICAgICAgICAgIDw8ICJTcGVjaWFsaXplZFByb2Nlc3NGdW5jdGlvbiBzKSA6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgZ2VuZXJpYyhnKSwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICBzcGVjaWFsaXplZChzKSB7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiICBQcm9jZXNzRnVuY3Rpb25zKCkgOiBnZW5lcmljKE5VTEwpLCBzcGVjaWFsaXplZChOVUxMKSAiCisgICAgICAgICAgICAgIDw8ICJ7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbnM+ICIKKyAgICAgICAgICAgICAgPDwgIlByb2Nlc3NNYXA7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPiAiCisgICAgICAgICAgICAgIDw8ICJQcm9jZXNzTWFwOyIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIlByb2Nlc3NNYXAgcHJvY2Vzc01hcF87IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgInZvaWQgcHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZmluaXNoX2NvYl8KKyAgICAgICAgICAgICAgICAgICAgICA8PCAiaW50MzJfdCBzZXFpZCwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QiIDw8IGNhbGxfY29udGV4dF8gPDwgIik7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAidm9pZCBwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBmaW5pc2hfY29iXworICAgICAgICAgICAgICAgICAgICAgICAgPDwgImludDMyX3Qgc2VxaWQsIFByb3RvY29sXyogaXByb3QsIFByb3RvY29sXyogb3Byb3QiIDw8IGNhbGxfY29udGV4dF8KKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKHN0eWxlXyA9PSAiQ29iIikgeworICAgICAgLy8gWFhYIEZhY3RvciB0aGlzIG91dCwgZXZlbiBpZiBpdCBpcyBhIHBhaW4uCisgICAgICBzdHJpbmcgcmV0X2FyZyA9ICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIsIGNvbnN0ICIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSArICImIF9yZXR1cm4iKTsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCByZXR1cm5fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsICIKKyAgICAgICAgICAgICAgICA8PCAidm9pZCogY3R4IiA8PCByZXRfYXJnIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgcmV0dXJuXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qIG9wcm90LCB2b2lkKiBjdHgiIDw8IHJldF9hcmcgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gWFhYIERvbid0IGRlY2xhcmUgdGhyb3cgaWYgaXQgZG9lc24ndCBleGlzdAorICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHRocm93XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCB2b2lkKiBjdHgsICIKKyAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk7IiA8PCBlbmRsOworICAgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCB0aHJvd18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgICAgICAgICA8PCAiUHJvdG9jb2xfKiBvcHJvdCwgdm9pZCogY3R4LCAiCisgICAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZfaGVhZGVyXyA8PCAiIHB1YmxpYzoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZV8gPDwgIig6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IGlmX25hbWVfCisgICAgICAgICAgICA8PCAiPiBpZmFjZSkgOiIgPDwgZW5kbDsKKyAgaWYgKCFleHRlbmRzXy5lbXB0eSgpKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kc18gPDwgIihpZmFjZSksIiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpZmFjZV8oaWZhY2UpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSAiOworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgZl9oZWFkZXJfIDw8ICJQcm9jZXNzRnVuY3Rpb25zKCIgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzX29ubHlfKSB7CisgICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICIgIE5VTEwsIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgIiAgJiIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6cHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICIgICYiIDw8IGNsYXNzX25hbWVfIDw8ICI6OnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiOworICAgIH0gZWxzZSB7CisgICAgICBmX2hlYWRlcl8gPDwgIiYiIDw8IGNsYXNzX25hbWVfIDw8ICI6OnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfaGVhZGVyXyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IGNsYXNzX25hbWVfIDw8ICIoKSB7fSIKKyAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAvLyBHZW5lcmF0ZSBhIGJhY2t3YXJkcyBjb21wYXRpYmxlIHR5cGVkZWYsIGZvciBjYWxsZXJzIHdobyBkb24ndCBrbm93CisgICAgLy8gYWJvdXQgdGhlIG5ldyB0ZW1wbGF0ZS1zdHlsZSBjb2RlLgorICAgIC8vCisgICAgLy8gV2UgY2FuJ3QgdXNlIFRQcm90b2NvbCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLCBzaW5jZSBQcm9jZXNzb3JUCisgICAgLy8gcHJvdmlkZXMgb3ZlcmxvYWRlZCB2ZXJzaW9ucyBvZiBtb3N0IG1ldGhvZHMsIG9uZSBvZiB3aGljaCBhY2NlcHRzCisgICAgLy8gVFByb3RvY29sIHBvaW50ZXJzLCBhbmQgb25lIHdoaWNoIGFjY2VwdHMgUHJvdG9jb2xfIHBvaW50ZXJzLiAgVGhpcworICAgIC8vIHJlc3VsdHMgaW4gYSBjb21waWxlIGVycm9yIGlmIGluc3RhbnRpYXRlZCB3aXRoIFByb3RvY29sXyA9PSBUUHJvdG9jb2wuCisgICAgLy8gVGhlcmVmb3JlLCB3ZSBkZWZpbmUgVER1bW15UHJvdG9jb2wgc29sZWx5IHNvIHdlIGNhbiB1c2UgaXQgYXMgdGhlCisgICAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyIGhlcmUuCisgICAgZl9oZWFkZXJfIDw8ICJ0eXBlZGVmICIgPDwgY2xhc3NfbmFtZV8gPDwgIjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlREdW1teVByb3RvY29sID4gIgorICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8IHBzdHlsZV8gPDwgIlByb2Nlc3NvcjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChib29sIHRlbXBsYXRlX3Byb3RvY29sKSB7CisgIHN0cmluZyBwcm90b2NvbCA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIjsKKyAgc3RyaW5nIGZ1bmN0aW9uX3N1ZmZpeDsKKyAgaWYgKHRlbXBsYXRlX3Byb3RvY29sKSB7CisgICAgcHJvdG9jb2wgPSAiUHJvdG9jb2xfIjsKKyAgICAvLyBXZSBjYWxsIHRoZSBnZW5lcmljIHZlcnNpb24gZGlzcGF0Y2hDYWxsKCksIGFuZCB0aGUgc3BlY2lhbGl6ZWQKKyAgICAvLyB2ZXJzaW9uIGRpc3BhdGNoQ2FsbFRlbXBsYXRlZCgpLiAgV2UgY2FuJ3QgY2FsbCB0aGVtIGJvdGgKKyAgICAvLyBkaXNwYXRjaENhbGwoKSwgc2luY2UgdGhpcyB3aWxsIGNhdXNlIHRoZSBjb21waWxlciB0byBpc3N1ZSBhIHdhcm5pbmcgaWYKKyAgICAvLyBhIHNlcnZpY2UgdGhhdCBkb2Vzbid0IHVzZSB0ZW1wbGF0ZXMgaW5oZXJpdHMgZnJvbSBhIHNlcnZpY2UgdGhhdCBkb2VzCisgICAgLy8gdXNlIHRlbXBsYXRlczogdGhlIGNvbXBpbGVyIGNvbXBsYWlucyB0aGF0IHRoZSBzdWJjbGFzcyBvbmx5IGltcGxlbWVudHMKKyAgICAvLyB0aGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIGRpc3BhdGNoQ2FsbCgpLCBhbmQgaGlkZXMgdGhlIHRlbXBsYXRlZCB2ZXJzaW9uLgorICAgIC8vIFVzaW5nIGRpZmZlcmVudCBuYW1lcyBmb3IgdGhlIHR3byBmdW5jdGlvbnMgcHJldmVudHMgdGhpcy4KKyAgICBmdW5jdGlvbl9zdWZmaXggPSAiVGVtcGxhdGVkIjsKKyAgfQorCisgIGZfb3V0XyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8IHJldF90eXBlXyA8PCBjbGFzc19uYW1lXyA8PCB0ZW1wbGF0ZV9zdWZmaXhfIDw8ICI6OmRpc3BhdGNoQ2FsbCIKKyAgICAgICAgIDw8IGZ1bmN0aW9uX3N1ZmZpeCA8PCAiKCIgPDwgZmluaXNoX2NvYl8gPDwgcHJvdG9jb2wgPDwgIiogaXByb3QsICIgPDwgcHJvdG9jb2wKKyAgICAgICAgIDw8ICIqIG9wcm90LCAiCisgICAgICAgICA8PCAiY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfIDw8ICIpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEhPVDogbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIgbWFwCisgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCB0eXBlbmFtZV9zdHJfIDw8ICJQcm9jZXNzTWFwOjppdGVyYXRvciBwZm47IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICA8PCAicGZuID0gcHJvY2Vzc01hcF8uZmluZChmbmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICA8PCAiaWYgKHBmbiA9PSBwcm9jZXNzTWFwXy5lbmQoKSkgeyIgPDwgZW5kbDsKKyAgaWYgKGV4dGVuZHNfLmVtcHR5KCkpIHsKKyAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QtPnNraXAoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24gIgorICAgICAgICAgICAgICAieCg6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICIKKyAgICAgICAgICAgICAgIidcIitmbmFtZStcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIG9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihmbmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IgorICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gIiAgcmV0dXJuIGNvYih0cnVlKTsiIDogIiAgcmV0dXJuIHRydWU7IikgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXh0ZW5kc18gPDwgIjo6ZGlzcGF0Y2hDYWxsKCIKKyAgICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJjb2IsICIgOiAiIikgPDwgImlwcm90LCBvcHJvdCwgZm5hbWUsIHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfYXJnXworICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpZiAodGVtcGxhdGVfcHJvdG9jb2wpIHsKKyAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kLnNwZWNpYWxpemVkKSkiOworICB9IGVsc2UgeworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzX29ubHlfKSB7CisgICAgICAvLyBUT0RPOiBUaGlzIGlzIGEgbnVsbCBwb2ludGVyLCBzbyBub3RoaW5nIGdvb2Qgd2lsbCBjb21lIGZyb20gY2FsbGluZworICAgICAgLy8gaXQuICBUaHJvdyBhbiBleGNlcHRpb24gaW5zdGVhZC4KKyAgICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQuZ2VuZXJpYykpIjsKKyAgICB9IGVsc2UgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kLmdlbmVyaWMpKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQpKSI7CisgICAgfQorICB9CisgIGZfb3V0XyA8PCAiKCIgPDwgY29iX2FyZ18gPDwgInNlcWlkLCBpcHJvdCwgb3Byb3QiIDw8IGNhbGxfY29udGV4dF9hcmdfIDw8ICIpOyIgPDwgZW5kbDsKKworICAvLyBUT0RPKGRyZWlzcyk6IHJldHVybiBwZm4gcmV0PworICBpZiAoc3R5bGVfID09ICJDb2IiKSB7CisgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9vdXRfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9ucygpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSBzZXJ2aWNlXy0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBnZW5lcmF0b3JfLT5nZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHNlcnZpY2VfLCAqZl9pdGVyLCBzdHlsZV8sIGZhbHNlKTsKKyAgICAgIGdlbmVyYXRvcl8tPmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc2VydmljZV8sICpmX2l0ZXIsIHN0eWxlXywgdHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRvcl8tPmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc2VydmljZV8sICpmX2l0ZXIsIHN0eWxlXywgZmFsc2UpOworICAgIH0KKyAgfQorfQorCit2b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfZmFjdG9yeSgpIHsKKyAgc3RyaW5nIGlmX2ZhY3RvcnlfbmFtZSA9IGlmX25hbWVfICsgIkZhY3RvcnkiOworCisgIC8vIEdlbmVyYXRlIHRoZSBmYWN0b3J5IGNsYXNzIGRlZmluaXRpb24KKyAgZl9oZWFkZXJfIDw8IHRlbXBsYXRlX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgZmFjdG9yeV9jbGFzc19uYW1lXyA8PCAiIDogcHVibGljIDo6YXBhY2hlOjp0aHJpZnQ6OiIKKyAgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvckZhY3RvcnkiIDogIlRQcm9jZXNzb3JGYWN0b3J5IikgPDwgIiB7IgorICAgICAgICAgICAgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBmYWN0b3J5X2NsYXNzX25hbWVfIDw8ICIoY29uc3QgOjpzdGQ6OnNoYXJlZF9wdHI8ICIgPDwgaWZfZmFjdG9yeV9uYW1lCisgICAgICAgICAgICA8PCAiID4mIGhhbmRsZXJGYWN0b3J5KSA6IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiICAgIGhhbmRsZXJGYWN0b3J5XyhoYW5kbGVyRmFjdG9yeSkge30iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiCisgICAgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3IiIDogIlRQcm9jZXNzb3IiKSA8PCAiID4gIgorICAgICAgICAgICAgPDwgImdldFByb2Nlc3Nvcihjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKTsiIDw8IGVuZGw7CisKKyAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgIgorICAgICAgICAgICAgPDwgaWZfZmFjdG9yeV9uYW1lIDw8ICIgPiBoYW5kbGVyRmFjdG9yeV87IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBJZiB3ZSBhcmUgZ2VuZXJhdGluZyB0ZW1wbGF0ZXMsIG91dHB1dCBhIHR5cGVkZWYgZm9yIHRoZSBwbGFpbgorICAvLyBmYWN0b3J5IG5hbWUuCisgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgIGZfaGVhZGVyXyA8PCAidHlwZWRlZiAiIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8KKyAgICAgICAgICAgICAgPDwgIjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlREdW1teVByb3RvY29sID4gIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHBzdHlsZV8KKyAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvckZhY3Rvcnk7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZ2V0UHJvY2Vzc29yKCkgbWV0aG9kCisgIGZfb3V0XyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6IgorICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yIiA6ICJUUHJvY2Vzc29yIikgPDwgIiA+ICIKKyAgICAgICAgIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8gPDwgdGVtcGxhdGVfc3VmZml4XyA8PCAiOjpnZXRQcm9jZXNzb3IoIgorICAgICAgICAgPDwgImNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6UmVsZWFzZUhhbmRsZXI8ICIgPDwgaWZfZmFjdG9yeV9uYW1lCisgICAgICAgICA8PCAiID4gY2xlYW51cChoYW5kbGVyRmFjdG9yeV8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8ICIKKyAgICAgICAgIDw8IGlmX25hbWVfIDw8ICIgPiBoYW5kbGVyKCIKKyAgICAgICAgIDw8ICJoYW5kbGVyRmFjdG9yeV8tPmdldEhhbmRsZXIoY29ubkluZm8pLCBjbGVhbnVwKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6IgorICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yIiA6ICJUUHJvY2Vzc29yIikgPDwgIiA+ICIKKyAgICAgICAgIDw8ICJwcm9jZXNzb3IobmV3ICIgPDwgY2xhc3NfbmFtZV8gPDwgdGVtcGxhdGVfc3VmZml4XyA8PCAiKGhhbmRsZXIpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgIDw8ICJyZXR1cm4gcHJvY2Vzc29yOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX291dF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHByb2Nlc3NvciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb2Nlc3NvciBmb3IuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKKyAgUHJvY2Vzc29yR2VuZXJhdG9yIGdlbmVyYXRvcih0aGlzLCB0c2VydmljZSwgc3R5bGUpOworICBnZW5lcmF0b3IucnVuKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6b3N0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX2hlYWRlcl8sICZyZXN1bHQsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3V0LCBmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7CisgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCAmcmVzdWx0KTsKKyAgZ2VuZXJhdGVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCAmcmVzdWx0KTsKKworICByZXN1bHQuc2V0X25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3ByZXN1bHQiKTsKKyAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfaGVhZGVyXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUsIGdlbl9jb2Jfc3R5bGVfKTsKKyAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3V0LCBmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7CisgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCAmcmVzdWx0LCB0cnVlKTsKKyAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsICZyZXN1bHQsIHRydWUpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3BlY2lhbGl6ZWQpIHsKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgIHN0cmluZyBzZXJ2aWNlX2Z1bmNfbmFtZSA9ICJcIiIgKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICIuIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJcIiI7CisKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOworCisgIHN0cmluZyBwcm90X3R5cGUgPSAoc3BlY2lhbGl6ZWQgPyAiUHJvdG9jb2xfIiA6ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIik7CisgIHN0cmluZyBjbGFzc19zdWZmaXg7CisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIGNsYXNzX3N1ZmZpeCA9ICJUPFByb3RvY29sXz4iOworICB9CisKKyAgLy8gSSB0cmllZCB0byBkbyB0aGlzIGFzIG9uZSBmdW5jdGlvbi4gIEkgcmVhbGx5IGRpZC4gIEJ1dCBpdCB3YXMgdG9vIGhhcmQuCisgIGlmIChzdHlsZSAhPSAiQ29iIikgeworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgICAgfQorICAgIGNvbnN0IGJvb2wgdW5uYW1lZF9vcHJvdF9zZXFpZCA9IHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIShnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpOworICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjoiCisgICAgICAgIDw8ICJwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICA8PCAiaW50MzJfdCIgPDwgKHVubmFtZWRfb3Byb3Rfc2VxaWQgPyAiLCAiIDogIiBzZXFpZCwgIikgPDwgcHJvdF90eXBlIDw8ICIqIGlwcm90LCAiCisgICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiIgPDwgKHVubmFtZWRfb3Byb3Rfc2VxaWQgPyAiLCAiIDogIiBvcHJvdCwgIikgPDwgInZvaWQqIGNhbGxDb250ZXh0KSIKKyAgICAgICAgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICAgIHN0cmluZyByZXN1bHRuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdW5uYW1lZF9vcHJvdF9zZXFpZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgc2VxaWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIodm9pZCkgb3Byb3Q7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCogY3R4ID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGNhbGxDb250ZXh0KTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIgorICAgICAgICA8PCAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVJlYWQoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJnczsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInVpbnQzMl90IGJ5dGVzID0gaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFJlYWQoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIERlY2xhcmUgcmVzdWx0CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gVHJ5IGJsb2NrIGZvciBmdW5jdGlvbnMgd2l0aCBleGNlcHRpb25zCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGlmIChpc19jb21wbGV4X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBvdXQgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihyZXN1bHQuc3VjY2VzcyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInJlc3VsdC5zdWNjZXNzID0gaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgfQorICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSI7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIG91dCA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgJiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJ9IjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8ICIgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mKSB7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5oYW5kbGVyRXJyb3IoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KGUud2hhdCgpKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmFzeW5jQ29tcGxldGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXN1bHQgaW50byBhIHN0cnVjdAorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJieXRlcyA9IG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0V3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIC8vIENvYiBzdHlsZS4KKyAgZWxzZSB7CisgICAgLy8gUHJvY2Vzc29yIGVudHJ5IHBvaW50LgorICAgIC8vIFRPRE8oZWRoYWxsKSB1cGRhdGUgZm9yIGNhbGxDb250ZXh0IHdoZW4gVEV2ZW50U2VydmVyIGlzIHJlYWR5CisgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjpwcm9jZXNzXyIKKyAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICA8PCBwcm90X3R5cGUgPDwgIiogaXByb3QsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90KSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgLy8gVE9ETyhzaW1wa2lucyk6IHdlIGNvdWxkIHRyeSB0byBjb25zb2xkYXRlIHRoaXMKKyAgICAvLyB3aXRoIHRoZSBub24tY29iIGNvZGUgYWJvdmUKKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7CisgICAgICAvLyBJZiB0aGVzZSBhcmUgaW5zdGFuY2VzIG9mIFByb3RvY29sXywgaW5zdGVhZCBvZiBhbnkgb2xkIFRQcm90b2NvbCwKKyAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgcHJvY2VzcyBmdW5jdGlvbiBpbnN0ZWFkLgorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9pcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIlByb3RvY29sXyogX29wcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiaWYgKF9pcHJvdCAmJiBfb3Byb3QpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHByb2Nlc3NfIgorICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKGNvYiwgc2VxaWQsIF9pcHJvdCwgX29wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIGlwcm90LCBfaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3Byb3QsIF9vcHJvdCk7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIHNlcWlkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIG9wcm90OyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIl9hcmdzIGFyZ3M7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2b2lkKiBjdHggPSBOVUxMOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKCIKKyAgICAgICAgPDwgInRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVJlYWQoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAidWludDMyX3QgYnl0ZXMgPSBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFJlYWQoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgLy8gVE9ETyhkcmVpc3MpOiBIYW5kbGUgVEV4Y2VwdGlvbnM/ICBFeHBvc2UgdG8gc2VydmVyPworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgICAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+aGFuZGxlckVycm9yKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gY29iKGZhbHNlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+YXN5bmNDb21wbGV0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIC8vIFRPRE8oZHJlaXNzKTogRmlndXJlIG91dCBhIHN0cmF0ZWd5IGZvciBleGNlcHRpb25zIGluIGFzeW5jIGhhbmRsZXJzLgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnJlZXIudW5yZWdpc3RlcigpOyIgPDwgZW5kbDsKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgLy8gTm8gcmV0dXJuLiAgSnVzdCBoYW5kIG9mZiBvdXIgY29iLgorICAgICAgLy8gVE9ETyhkcmVpc3MpOiBDYWxsIHRoZSBjb2IgaW1tZWRpYXRlbHk/CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgPDwgIjo6c3RkOjpiaW5kKGNvYiwgdHJ1ZSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0gZWxzZSB7CisgICAgICBzdHJpbmcgcmV0X2FyZywgcmV0X3BsYWNlaG9sZGVyOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICByZXRfYXJnID0gIiwgY29uc3QgIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiI7CisgICAgICAgIHJldF9wbGFjZWhvbGRlciA9ICIsIDo6c3RkOjpwbGFjZWhvbGRlcnM6Ol8xIjsKKyAgICAgIH0KKworICAgICAgLy8gV2hlbiBnZW5fdGVtcGxhdGVzXyBpcyB0cnVlLCB0aGUgcmV0dXJuXyBhbmQgdGhyb3dfIGZ1bmN0aW9ucyBhcmUKKyAgICAgIC8vIG92ZXJsb2FkZWQuICBXZSBoYXZlIHRvIGRlY2xhcmUgcG9pbnRlcnMgdG8gdGhlbSBzbyB0aGF0IHRoZSBjb21waWxlcgorICAgICAgLy8gY2FuIHJlc29sdmUgdGhlIGNvcnJlY3Qgb3ZlcmxvYWRlZCB2ZXJzaW9uLgorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkICgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4CisgICAgICAgICAgPDwgIjo6KnJldHVybl9mbikoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+ICIKKyAgICAgICAgICA8PCAiY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4IiA8PCByZXRfYXJnCisgICAgICAgICAgPDwgIikgPSIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAmIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeAorICAgICAgICAgIDw8ICI6OnJldHVybl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkICgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4CisgICAgICAgICAgICA8PCAiOjoqdGhyb3dfZm4pKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiAiCisgICAgICAgICAgICA8PCAiY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4LCAiCisgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdykgPSIgPDwgZW5kbDsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICYiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4CisgICAgICAgICAgICA8PCAiOjp0aHJvd18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OmJpbmQocmV0dXJuX2ZuLCB0aGlzLCBjb2IsIHNlcWlkLCBvcHJvdCwgY3R4IiA8PCByZXRfcGxhY2Vob2xkZXIKKyAgICAgICAgICA8PCAiKSI7CisgICAgICBpZiAoIXhjZXB0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIG91dCA8PCAnLCcgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OmJpbmQodGhyb3dfZm4sIHRoaXMsIGNvYiwgc2VxaWQsIG9wcm90LCAiCisgICAgICAgICAgICA8PCAiY3R4LCA6OnN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkiOworICAgICAgfQorICAgIH0KKworICAgIC8vIFhYWCBXaGl0ZXNwYWNlIGNsZWFudXAuCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIG91dCA8PCAnLCcgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gTm9ybWFsIHJldHVybi4KKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXRfYXJnX2RlY2wsIHJldF9hcmdfbmFtZTsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgcmV0X2FyZ19kZWNsID0gIiwgY29uc3QgIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiI7CisgICAgICAgIHJldF9hcmdfbmFtZSA9ICIsIF9yZXR1cm4iOworICAgICAgfQorICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjpyZXR1cm5fIgorICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZ19kZWNsIDw8ICcpJyA8PCBlbmRsOworICAgICAgc2NvcGVfdXAob3V0KTsKKworICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCkgeworICAgICAgICAvLyBJZiBvcHJvdCBpcyBhIFByb3RvY29sXyBpbnN0YW5jZSwKKyAgICAgICAgLy8gdXNlIHRoZSBzcGVjaWFsaXplZCByZXR1cm4gZnVuY3Rpb24gaW5zdGVhZC4KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKF9vcHJvdCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmV0dXJuXyIKKyAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKGNvYiwgc2VxaWQsIF9vcHJvdCwgY3R4IiA8PCByZXRfYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIl9wcmVzdWx0IHJlc3VsdDsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgLy8gVGhlIGNvbnN0X2Nhc3QgaGVyZSBpcyB1bmZvcnR1bmF0ZSwgYnV0IGl0IHdvdWxkIGJlIGEgcGFpbiB0byBhdm9pZCwKKyAgICAgICAgLy8gYW5kIHdlIG9ubHkgZG8gYSB3cml0ZSB3aXRoIHRoaXMgc3RydWN0LCB3aGljaCBpcyBjb25zdC1zYWZlLgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gY29uc3RfY2FzdDwiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpCisgICAgICAgICAgICA8PCAiKj4oJl9yZXR1cm4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuc3VjY2VzcyA9IHRydWU7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gU2VyaWFsaXplIHRoZSByZXN1bHQgaW50byBhIHN0cnVjdAorICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiCisgICAgICAgICAgPDwgInRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlV3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIKKyAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCBieXRlcyA9IG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IodHJ1ZSk7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gRXhjZXB0aW9uIHJldHVybi4KKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXhjZXB0aW9ucy5lbXB0eSgpKSB7CisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OnRocm93XyIKKyAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgsICIKKyAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdykiIDw8IGVuZGw7CisgICAgICBzY29wZV91cChvdXQpOworCisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7CisgICAgICAgIC8vIElmIG9wcm90IGlzIGEgUHJvdG9jb2xfIGluc3RhbmNlLAorICAgICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHRocm93IGZ1bmN0aW9uIGluc3RlYWQuCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChfb3Byb3QpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocm93XyIKKyAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKGNvYiwgc2VxaWQsIF9vcHJvdCwgY3R4LCBfdGhyb3cpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIEdldCB0aGUgZXZlbnQgaGFuZGxlciBjb250ZXh0CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKCIKKyAgICAgICAgICA8PCAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAvLyBUaHJvdyB0aGUgVERlbGF5ZWRFeGNlcHRpb24sIGFuZCBjYXRjaCB0aGUgcmVzdWx0CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiX3Jlc3VsdCByZXN1bHQ7IgorICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX3Rocm93LT50aHJvd19pdCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYihmYWxzZSk7IgorICAgICAgICAgIDw8IGVuZGw7IC8vIElzIHRoaXMgcG9zc2libGU/ICBUQkQuCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICd9JzsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIG91dCA8PCAiICBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICYiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIH0KKworICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIHVuZGVjbGFyZWQgZXhjZXB0aW9uIGlzIHRocm93bgorICAgICAgb3V0IDw8ICIgY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5oYW5kbGVyRXJyb3IoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgoZS53aGF0KCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAvLyBXZSBwYXNzIHRydWUgdG8gdGhlIGNvYiBoZXJlLCBzaW5jZSB3ZSBkaWQgc3VjY2Vzc2Z1bGx5IHdyaXRlIGEKKyAgICAgICAgICAvLyByZXNwb25zZSwgZXZlbiB0aG91Z2ggaXQgaXMgYW4gZXhjZXB0aW9uIHJlc3BvbnNlLgorICAgICAgICAgIC8vIEl0IGxvb2tzIGxpa2UgdGhlIGFyZ3VtZW50IGlzIGN1cnJlbnRseSBpZ25vcmVkLCBhbnl3YXkuCisgICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBjb2IodHJ1ZSk7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IGJ5dGVzID0gb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0V3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9IC8vIGZvciBlYWNoIGZ1bmN0aW9uCisgIH0gICAvLyBjb2Igc3R5bGUKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBza2VsZXRvbiBmaWxlIG9mIGEgc2VydmVyCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24odF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgc3ZjbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworCisgIC8vIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gZmlsZSBpbmNsdWRlcworICBzdHJpbmcgZl9za2VsZXRvbl9uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiX3NlcnZlci5za2VsZXRvbi5jcHAiOworCisgIHN0cmluZyBucyA9IG5hbWVzcGFjZV9wcmVmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2tlbGV0b247CisgIGZfc2tlbGV0b24ub3BlbihmX3NrZWxldG9uX25hbWUuY19zdHIoKSk7CisgIGZfc2tlbGV0b24gPDwgIi8vIFRoaXMgYXV0b2dlbmVyYXRlZCBza2VsZXRvbiBmaWxlIGlsbHVzdHJhdGVzIGhvdyB0byBidWlsZCBhIHNlcnZlci4iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiLy8gWW91IHNob3VsZCBjb3B5IGl0IHRvIGFub3RoZXIgZmlsZW5hbWUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQuIiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4iIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6c2VydmVyOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBub3QgY29tcGlsZToKKyAgLy8gdXNpbmcgbmFtZXNwYWNlIDsKKyAgLy8gdXNpbmcgbmFtZXNwYWNlIDo6OworICBpZiAoKCFucy5lbXB0eSgpKSAmJiAobnMuY29tcGFyZSgiIDo6IikgIT0gMCkpIHsKKyAgICBmX3NrZWxldG9uIDw8ICJ1c2luZyBuYW1lc3BhY2UgIiA8PCBzdHJpbmcobnMsIDAsIG5zLnNpemUoKSAtIDIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmX3NrZWxldG9uIDw8ICJjbGFzcyAiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IHN2Y25hbWUgPDwgIklmIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIoKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgLy8gWW91ciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NrZWxldG9uLCAqZl9pdGVyKTsKKyAgICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIikgPDwgIiB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICAvLyBZb3VyIGltcGxlbWVudGF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBwcmludGYoXCIiCisgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlxcblwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2tlbGV0b24gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAiaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9za2VsZXRvbgorICAgICAgPDwgaW5kZW50KCkgPDwgImludCBwb3J0ID0gOTA5MDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgc3ZjbmFtZQorICAgICAgPDwgIkhhbmRsZXI+IGhhbmRsZXIobmV3ICIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcigpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3ICIgPDwgc3ZjbmFtZSA8PCAiUHJvY2Vzc29yKGhhbmRsZXIpKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7IgorICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiVFNpbXBsZVNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VydmVyLnNlcnZlKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2tlbGV0b24gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBDbG9zZSB0aGUgZmlsZXMKKyAgZl9za2VsZXRvbi5jbG9zZSgpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBpc19yZWZlcmVuY2UodGZpZWxkKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT4iOworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICJyZWFkQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBvdXQgPDwgInJlYWRCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBvdXQgPDwgInJlYWRJMTYoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCAicmVhZEkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8ICJyZWFkSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBvdXQgPDwgInJlYWREb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgcmVhZGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgiZWNhc3QiKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImludDMyX3QgIiA8PCB0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkSTMyKCIgPDwgdAorICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB0IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAorICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCisgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAorICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyKSB7CisgIGlmIChwb2ludGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghIiA8PCBwcmVmaXggPDwgIikgeyAiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBwcmVmaXggPDwgIiA9IDo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICI+KG5ldyAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLT5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImJvb2wgd2FzU2V0ID0gZmFsc2U7IiA8PCBlbmRsOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgZl9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIi0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIikgeyB3YXNTZXQgPSB0cnVlOyB9IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCF3YXNTZXQpIHsgIiA8PCBwcmVmaXggPDwgIi5yZXNldCgpOyB9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOworICBib29sIHVzZV9wdXNoID0gdGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuY2xlYXIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIgPDwgc2l6ZSA8PCAiOyIgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwga3R5cGUgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IHZ0eXBlIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTWFwQmVnaW4oIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBldHlwZSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAieGZlciArPSBpcHJvdC0+cmVhZFNldEJlZ2luKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBldHlwZSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAieGZlciArPSBpcHJvdC0+cmVhZExpc3RCZWdpbigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaWYgKCF1c2VfcHVzaCkgeworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucmVzaXplKCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IGkgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkKKyAgICAgIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCwgdXNlX3B1c2gsIGkpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5CisgICAgICAgICAgICAgIDw8ICJdOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuaW5zZXJ0KCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9wdXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgpIHsKKyAgaWYgKHVzZV9wdXNoKSB7CisgICAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgICAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKyAgICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaF9iYWNrKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBwcmVmaXggKyAiWyIgKyBpbmRleCArICJdIik7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBpc19yZWZlcmVuY2UodGZpZWxkKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+IjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgd3JpdGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkKKyAgICAgICAgICAgICsgbmFtZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigoaW50MzJfdCkiIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcikgeworICBpZiAocG9pbnRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICItPndyaXRlKG9wcm90KTsgIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIKKyAgICAgICAgICAgICAgICA8PCAib3Byb3QtPndyaXRlU3RydWN0QmVnaW4oXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsgIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBvcHJvdC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAic3RhdGljX2Nhc3Q8dWludDMyX3Q+KCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAic3RhdGljX2Nhc3Q8dWludDMyX3Q+KCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVMaXN0QmVnaW4oIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAic3RhdGljX2Nhc3Q8dWludDMyX3Q+KCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICI6OmNvbnN0X2l0ZXJhdG9yICIgPDwgaXRlciA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImZvciAoIiA8PCBpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmJlZ2luKCk7ICIgPDwgaXRlciA8PCAiICE9ICIgPDwgcHJlZml4CisgICAgICA8PCAiLmVuZCgpOyArKyIgPDwgaXRlciA8PCAiKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICoKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlciArICItPmZpcnN0Iik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaXRlciArICItPnNlY29uZCIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksICIoKiIgKyBpdGVyICsgIikiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICIoKiIgKyBpdGVyICsgIikiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIE1ha2VzIGEgOjogcHJlZml4IGZvciBhIG5hbWVzcGFjZQorICoKKyAqIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlLCB3LyBwZXJpb2RzIGluIGl0CisgKiBAcmV0dXJuIE5hbWVzcGFjZXMKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX3ByZWZpeChzdHJpbmcgbnMpIHsKKyAgLy8gQWx3YXlzIHN0YXJ0IHdpdGggIjo6IiwgdG8gYXZvaWQgcG9zc2libGUgbmFtZSBjb2xsaXNpb25zIHdpdGgKKyAgLy8gb3RoZXIgbmFtZXMgaW4gb25lIG9mIHRoZSBjdXJyZW50IG5hbWVzcGFjZXMuCisgIC8vCisgIC8vIFdlIGFsc28gbmVlZCBhIGxlYWRpbmcgc3BhY2UsIGluIGNhc2UgdGhlIG5hbWUgaXMgdXNlZCBpbnNpZGUgb2YgYQorICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICAiTXlUZW1wbGF0ZTw6OmZvbzo6QmFyPiIgaXMgbm90IHZhbGlkIEMrKywKKyAgLy8gc2luY2UgIjw6IiBpcyBhbiBhbHRlcm5hdGl2ZSB0b2tlbiBmb3IgIlsiLgorICBzdHJpbmcgcmVzdWx0ID0gIiA6OiI7CisKKyAgaWYgKG5zLnNpemUoKSA9PSAwKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7CisgICAgcmVzdWx0ICs9ICI6OiI7CisgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgKz0gbnMgKyAiOjoiOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogT3BlbnMgbmFtZXNwYWNlLgorICoKKyAqIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlLCB3LyBwZXJpb2RzIGluIGl0CisgKiBAcmV0dXJuIE5hbWVzcGFjZXMKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX29wZW4oc3RyaW5nIG5zKSB7CisgIGlmIChucy5zaXplKCkgPT0gMCkgeworICAgIHJldHVybiAiIjsKKyAgfQorICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIHN0cmluZyBzZXBhcmF0b3IgPSAiIjsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmVzdWx0ICs9IHNlcGFyYXRvcjsKKyAgICByZXN1bHQgKz0gIm5hbWVzcGFjZSAiOworICAgIHJlc3VsdCArPSBucy5zdWJzdHIoMCwgbG9jKTsKKyAgICByZXN1bHQgKz0gIiB7IjsKKyAgICBzZXBhcmF0b3IgPSAiICI7CisgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgKz0gc2VwYXJhdG9yICsgIm5hbWVzcGFjZSAiICsgbnMgKyAiIHsiOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ2xvc2VzIG5hbWVzcGFjZS4KKyAqCisgKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAorICogQHJldHVybiBOYW1lc3BhY2VzCisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9jbG9zZShzdHJpbmcgbnMpIHsKKyAgaWYgKG5zLnNpemUoKSA9PSAwKSB7CisgICAgcmV0dXJuICIiOworICB9CisgIHN0cmluZyByZXN1bHQgPSAifSI7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHJlc3VsdCArPSAifSI7CisgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgcmVzdWx0ICs9ICIgLy8gbmFtZXNwYWNlIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgQysrIHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHR5cGUgbmFtZSwgaS5lLiBzdGQ6OnNldDx0eXBlPgorICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGFyZykgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIGJuYW1lID0gYmFzZV90eXBlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKTsKKyAgICBzdGQ6Om1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdHR5cGUtPmFubm90YXRpb25zXy5maW5kKCJjcHAudHlwZSIpOworICAgIGlmIChpdCAhPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7CisgICAgICBibmFtZSA9IGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgaWYgKCFhcmcpIHsKKyAgICAgIHJldHVybiBibmFtZTsKKyAgICB9CisKKyAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWUgKyAiJiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lOworICAgIH0KKyAgfQorCisgIC8vIENoZWNrIGZvciBhIGN1c3RvbSBvdmVybG9hZGVkIEMrKyBuYW1lCisgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBzdHJpbmcgY25hbWU7CisKKyAgICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHR5cGU7CisgICAgaWYgKHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpKSB7CisgICAgICBjbmFtZSA9IHRjb250YWluZXItPmdldF9jcHBfbmFtZSgpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgICBjbmFtZSA9ICJzdGQ6Om1hcDwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpbl90eXBlZGVmKSArICIsICIKKyAgICAgICAgICAgICAgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgICAgY25hbWUgPSAic3RkOjpzZXQ8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICAgIGNuYW1lID0gInN0ZDo6dmVjdG9yPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOworICAgIH0KKworICAgIGlmIChhcmcpIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIGNuYW1lICsgIiYiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY25hbWU7CisgICAgfQorICB9CisKKyAgc3RyaW5nIGNsYXNzX3ByZWZpeDsKKyAgaWYgKGluX3R5cGVkZWYgJiYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICBjbGFzc19wcmVmaXggPSAiY2xhc3MgIjsKKyAgfQorCisgIC8vIENoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIG5hbWVzcGFjZWQKKyAgc3RyaW5nIHBuYW1lOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgcG5hbWUgPSBjbGFzc19wcmVmaXggKyBuYW1lc3BhY2VfcHJlZml4KHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNwcCIpKSArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIHBuYW1lID0gY2xhc3NfcHJlZml4ICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2VudW0oKSAmJiAhZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgcG5hbWUgKz0gIjo6dHlwZSI7CisgIH0KKworICBpZiAoYXJnKSB7CisgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0dHlwZSkpIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lICsgIiYiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHBuYW1lOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgQysrIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqIEByZXR1cm4gRXhwbGljaXQgQysrIHR5cGUsIGkuZS4gImludDMyX3QiCisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpIHsKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgcmV0dXJuICJzdGQ6OnN0cmluZyI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gImJvb2wiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAiaW50OF90IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJpbnQxNl90IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJpbnQzMl90IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJpbnQ2NF90IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJkb3VibGUiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIGJhc2UgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcmV0dXJuIEZpZWxkIGRlY2xhcmF0aW9uLCBpLmUuIGludCB4ID0gMDsKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSkgeworICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBpZiAoY29uc3RhbnQpIHsKKyAgICByZXN1bHQgKz0gImNvbnN0ICI7CisgIH0KKyAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAoaXNfcmVmZXJlbmNlKHRmaWVsZCkpIHsKKyAgICByZXN1bHQgPSAiOjpzdGQ6OnNoYXJlZF9wdHI8IiArIHJlc3VsdCArICI+IjsKKyAgfQorICBpZiAocG9pbnRlcikgeworICAgIHJlc3VsdCArPSAiKiI7CisgIH0KKyAgaWYgKHJlZmVyZW5jZSkgeworICAgIHJlc3VsdCArPSAiJiI7CisgIH0KKyAgcmVzdWx0ICs9ICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gKCIgKyB0eXBlX25hbWUodHlwZSkgKyAiKTAiOworICAgIH0KKyAgfQorICBpZiAoIXJlZmVyZW5jZSkgeworICAgIHJlc3VsdCArPSAiOyI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuYW1lX3BhcmFtcykgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICB0X3N0cnVjdCogYXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgYm9vbCBoYXNfeGNlcHRpb25zID0gIXRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpLmVtcHR5KCk7CisKKyAgaWYgKHN0eWxlID09ICIiKSB7CisgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0dHlwZSkpIHsKKyAgICAgIHJldHVybiAidm9pZCAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgdHlwZV9uYW1lKHR0eXBlKQorICAgICAgICAgICAgICsgKG5hbWVfcGFyYW1zID8gIiYgX3JldHVybiIgOiAiJiAvKiBfcmV0dXJuICovIikKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMsIHRydWUpICsgIikiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIgorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdChhcmdsaXN0LCBuYW1lX3BhcmFtcykgKyAiKSI7CisgICAgfQorICB9IGVsc2UgaWYgKHN0eWxlLnN1YnN0cigwLCAzKSA9PSAiQ29iIikgeworICAgIHN0cmluZyBjb2JfdHlwZTsKKyAgICBzdHJpbmcgZXhuX2NvYjsKKyAgICBpZiAoc3R5bGUgPT0gIkNvYkNsIikgeworICAgICAgY29iX3R5cGUgPSAiKCIgKyBzZXJ2aWNlX25hbWVfICsgIkNvYkNsaWVudCI7CisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgY29iX3R5cGUgKz0gIlQ8UHJvdG9jb2xfPiI7CisgICAgICB9CisgICAgICBjb2JfdHlwZSArPSAiKiBjbGllbnQpIjsKKyAgICB9IGVsc2UgaWYgKHN0eWxlID09ICJDb2JTdiIpIHsKKyAgICAgIGNvYl90eXBlID0gKHR0eXBlLT5pc192b2lkKCkgPyAiKCkiIDogKCIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiIGNvbnN0JiBfcmV0dXJuKSIpKTsKKyAgICAgIGlmIChoYXNfeGNlcHRpb25zKSB7CisgICAgICAgIGV4bl9jb2IKKyAgICAgICAgICAgID0gIiwgOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IC8qIGV4bl9jb2IgKi8iOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyAiVU5LTk9XTiBTVFlMRSI7CisgICAgfQorCisgICAgcmV0dXJuICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkIiArIGNvYl90eXBlICsgIj4gY29iIgorICAgICAgICAgICArIGV4bl9jb2IgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zLCB0cnVlKSArICIpIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiVU5LTk9XTiBTVFlMRSI7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHJldHVybiBDb21tYSBzZXBlYXJhdGVkIGxpc3Qgb2YgYWxsIGZpZWxkIG5hbWVzIGluIHRoYXQgc3RydWN0CisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgbmFtZV9wYXJhbXMsIGJvb2wgc3RhcnRfY29tbWEpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9ICFzdGFydF9jb21tYTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpICsgIiAiCisgICAgICAgICAgICAgICsgKG5hbWVfcGFyYW1zID8gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDogIi8qICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiICovIik7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKgorICogQHBhcmFtIHR5cGUgVGhyaWZ0IFR5cGUKKyAqIEByZXR1cm4gU3RyaW5nIG9mIEMrKyBjb2RlIHRvIGRlZmluaXRpb24gb2YgdGhhdCB0eXBlIGNvbnN0YW50CisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX01BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6Z2V0X2luY2x1ZGVfcHJlZml4KGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3QgeworICBzdHJpbmcgaW5jbHVkZV9wcmVmaXggPSBwcm9ncmFtLmdldF9pbmNsdWRlX3ByZWZpeCgpOworICBpZiAoIXVzZV9pbmNsdWRlX3ByZWZpeF8gfHwgKGluY2x1ZGVfcHJlZml4LnNpemUoKSA+IDAgJiYgaW5jbHVkZV9wcmVmaXhbMF0gPT0gJy8nKSkgeworICAgIC8vIGlmIGZsYWcgaXMgdHVybmVkIG9mZiBvciB0aGlzIGlzIGFic29sdXRlIHBhdGgsIHJldHVybiBlbXB0eSBwcmVmaXgKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RyaW5nOjpucG9zOworICBpZiAoKGxhc3Rfc2xhc2ggPSBpbmNsdWRlX3ByZWZpeC5yZmluZCgiLyIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXR1cm4gaW5jbHVkZV9wcmVmaXguc3Vic3RyKDAsIGxhc3Rfc2xhc2gpCisgICAgICAgICAgICsgKGdldF9wcm9ncmFtKCktPmlzX291dF9wYXRoX2Fic29sdXRlKCkgPyAiLyIgOiAiLyIgKyBvdXRfZGlyX2Jhc2VfICsgIi8iKTsKKyAgfQorCisgIHJldHVybiAiIjsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBjcHAsCisgICAgIkMrKyIsCisgICAgIiAgICBjb2Jfc3R5bGU6ICAgICAgIEdlbmVyYXRlIFwiQ29udGludWF0aW9uIE9CamVjdFwiLXN0eWxlIGNsYXNzZXMuXG4iCisgICAgIiAgICBub19jbGllbnRfY29tcGxldGlvbjpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgT21pdCBjYWxscyB0byBjb21wbGV0aW9uX18oKSBpbiBDb2JDbGllbnQgY2xhc3MuXG4iCisgICAgIiAgICBub19kZWZhdWx0X29wZXJhdG9yczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgT21pdHMgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IG9wZXJhdG9ycyA9PSwgIT0gYW5kIDxcbiIKKyAgICAiICAgIHRlbXBsYXRlczogICAgICAgR2VuZXJhdGUgdGVtcGxhdGl6ZWQgcmVhZGVyL3dyaXRlciBtZXRob2RzLlxuIgorICAgICIgICAgcHVyZV9lbnVtczogICAgICBHZW5lcmF0ZSBwdXJlIGVudW1zIGluc3RlYWQgb2Ygd3JhcHBlciBjbGFzc2VzLlxuIgorICAgICIgICAgaW5jbHVkZV9wcmVmaXg6ICBVc2UgZnVsbCBpbmNsdWRlIHBhdGhzIGluIGdlbmVyYXRlZCBmaWxlcy5cbiIKKyAgICAiICAgIG1vdmVhYmxlX3R5cGVzOiAgR2VuZXJhdGUgbW92ZSBjb25zdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3JzLlxuIgorICAgICIgICAgbm9fb3N0cmVhbV9vcGVyYXRvcnM6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIE9taXQgZ2VuZXJhdGlvbiBvZiBvc3RyZWFtIGRlZmluaXRpb25zLlxuIgorICAgICIgICAgbm9fc2tlbGV0b246ICAgICBPbWl0cyBnZW5lcmF0aW9uIG9mIHNrZWxldG9uLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQ5OWIyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzI1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCitzdHJ1Y3QgbWVtYmVyX21hcHBpbmdfc2NvcGUgeworICB2b2lkKiBzY29wZV9tZW1iZXI7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbWFwcGluZ190YWJsZTsKK307CisKK2NsYXNzIHRfY3NoYXJwX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2NzaGFycF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBhc3luY18gPSBmYWxzZTsKKyAgICBudWxsYWJsZV8gPSBmYWxzZTsKKyAgICBoYXNoY29kZV8gPSBmYWxzZTsKKyAgICB1bmlvbl8gPSBmYWxzZTsKKyAgICBzZXJpYWxpemVfID0gZmFsc2U7CisgICAgd2NmXyA9IGZhbHNlOworICAgIHdjZl9uYW1lc3BhY2VfLmNsZWFyKCk7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYXN5bmMiKSA9PSAwKSB7CisgICAgICAgIGFzeW5jXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm51bGxhYmxlIikgPT0gMCkgeworICAgICAgICBudWxsYWJsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJoYXNoY29kZSIpID09IDApIHsKKyAgICAgICAgaGFzaGNvZGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidW5pb24iKSA9PSAwKSB7CisgICAgICAgIHVuaW9uXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInNlcmlhbCIpID09IDApIHsKKyAgICAgICAgc2VyaWFsaXplXyA9IHRydWU7CisgICAgICAgIHdjZl9uYW1lc3BhY2VfID0gaXRlci0+c2Vjb25kOyAvLyBzaW5jZSB0aGVyZSBjYW4gYmUgb25seSBvbmUgbmFtZXNwYWNlCisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIndjZiIpID09IDApIHsKKyAgICAgICAgd2NmXyA9IHRydWU7CisgICAgICAgIHdjZl9uYW1lc3BhY2VfID0gaXRlci0+c2Vjb25kOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGNzaGFycDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY3NoYXJwIjsKKyAgfQorICB2b2lkIGluaXRfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlSXNzZXQgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCA9ICIiKTsKKyAgYm9vbCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHR5cGUgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgcHJpbnRfY29uc3RfY29uc3RydWN0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworICB2b2lkIHByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2NsYXNzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uLCB0X2ZpZWxkKiB0ZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9lcXVhbHMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2hhc2hjb2RlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VwYXJhdGVfc2VydmljZV9pbnRlcmZhY2VzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N5bmNfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfYXN5bmNfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29tYmluZWRfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2lsdmVybGlnaHRfYXN5bmNfbWV0aG9kcyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfc3luYyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9hc3luYyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5bGVzcyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIGxpc3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZWxlbWVudCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5bGVzcyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisKKyAgdm9pZCBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKyAgdm9pZCBlbmRfY3NoYXJwX25hbWVzcGFjZShzdGQ6Om9zdHJlYW0mIG91dCk7CisKKyAgc3RkOjpzdHJpbmcgY3NoYXJwX3R5cGVfdXNpbmdzKCk7CisgIHN0ZDo6c3RyaW5nIGNzaGFycF90aHJpZnRfdXNpbmdzKCk7CisKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvdW50YWluZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9wYXJhbSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3BhcmFtID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSBvdmVycmlkZTsKKworICBib29sIGZpZWxkX2hhc19kZWZhdWx0KHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMOyB9CisKKyAgYm9vbCBmaWVsZF9pc19yZXF1aXJlZCh0X2ZpZWxkKiB0ZmllbGQpIHsgcmV0dXJuIHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQ7IH0KKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkKKyAgICAgICAgICAgfHwgdHR5cGUtPmlzX3N0cmluZygpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKKyAgYm9vbCBhc3luY187CisgIGJvb2wgbnVsbGFibGVfOworICBib29sIHVuaW9uXzsKKyAgYm9vbCBoYXNoY29kZV87CisgIGJvb2wgc2VyaWFsaXplXzsKKyAgYm9vbCB3Y2ZfOworICBzdGQ6OnN0cmluZyB3Y2ZfbmFtZXNwYWNlXzsKKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBjc2hhcnBfa2V5d29yZHM7CisgIHN0ZDo6dmVjdG9yPG1lbWJlcl9tYXBwaW5nX3Njb3BlPiAgbWVtYmVyX21hcHBpbmdfc2NvcGVzOworCisgIHZvaWQgaW5pdF9rZXl3b3JkcygpOworICBzdGQ6OnN0cmluZyBub3JtYWxpemVfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworICB2b2lkIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN0cnVjdG5hbWUpOworICB2b2lkIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSk7CisgIHN0cmluZyBnZXRfbWFwcGVkX21lbWJlcl9uYW1lKHN0cmluZyBvbGRuYW1lKTsKK307CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNzaGFycCIpOworCisgIHN0cmluZyBkaXIgPSBuYW1lc3BhY2VfbmFtZV87CisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpLmNfc3RyKCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAoZGlyLnNpemUoKSA+IDApIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICB9CisKKyAgbmFtZXNwYWNlX2Rpcl8gPSBzdWJkaXI7CisgIGluaXRfa2V5d29yZHMoKTsKKworICB3aGlsZSggISBtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkgeworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyggbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKS5zY29wZV9tZW1iZXIpOworICB9CisKKyAgcHZlcmJvc2UoIkMjIG9wdGlvbnM6XG4iKTsKKyAgcHZlcmJvc2UoIi0gYXN5bmMgLi4uLi4uICVzXG4iLCAoYXN5bmNfID8gIk9OIiA6ICJvZmYiKSk7CisgIHB2ZXJib3NlKCItIG51bGxhYmxlIC4uLiAlc1xuIiwgKG51bGxhYmxlXyA/ICJPTiIgOiAib2ZmIikpOworICBwdmVyYm9zZSgiLSB1bmlvbiAuLi4uLi4gJXNcbiIsICh1bmlvbl8gPyAiT04iIDogIm9mZiIpKTsKKyAgcHZlcmJvc2UoIi0gaGFzaGNvZGUgLi4uICVzXG4iLCAoaGFzaGNvZGVfID8gIk9OIiA6ICJvZmYiKSk7CisgIHB2ZXJib3NlKCItIHNlcmlhbGl6ZSAuLiAlc1xuIiwgKHNlcmlhbGl6ZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgcHZlcmJvc2UoIi0gd2NmIC4uLi4uLi4uICVzXG4iLCAod2NmXyA/ICJPTiIgOiAib2ZmIikpOworfQorCitzdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHRtcChuYW1lKTsKKyAgc3RkOjp0cmFuc2Zvcm0odG1wLmJlZ2luKCksIHRtcC5lbmQoKSwgdG1wLmJlZ2luKCksIHN0YXRpY19jYXN0PGludCAoKikoaW50KT4oc3RkOjp0b2xvd2VyKSk7CisKKyAgLy8gdW4tY29uZmxpY3Qga2V5d29yZHMgYnkgcHJlZml4aW5nIHdpdGggIkAiCisgIGlmIChjc2hhcnBfa2V5d29yZHMuZmluZCh0bXApICE9IGNzaGFycF9rZXl3b3Jkcy5lbmQoKSkgeworICAgIHJldHVybiAiQCIgKyBuYW1lOworICB9CisKKyAgLy8gbm8gY2hhbmdlcyBuZWNlc3NhcnkKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjppbml0X2tleXdvcmRzKCkgeworICBjc2hhcnBfa2V5d29yZHMuY2xlYXIoKTsKKworICAvLyBDIyBrZXl3b3JkcworICBjc2hhcnBfa2V5d29yZHNbImFic3RyYWN0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImFzIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImJhc2UiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYm9vbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJicmVhayJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJieXRlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNhc2UiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY2F0Y2giXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY2hhciJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjaGVja2VkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNsYXNzIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNvbnN0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNvbnRpbnVlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRlY2ltYWwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZGVmYXVsdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkZWxlZ2F0ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkbyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkb3VibGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZWxzZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJlbnVtIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImV2ZW50Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImV4cGxpY2l0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImV4dGVybiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmYWxzZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmaW5hbGx5Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZpeGVkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZsb2F0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZvciJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmb3JlYWNoIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImdvdG8iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaWYiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaW1wbGljaXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaW4iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaW50Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImludGVyZmFjZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbnRlcm5hbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpcyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJsb2NrIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImxvbmciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibmFtZXNwYWNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm5ldyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJudWxsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm9iamVjdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJvcGVyYXRvciJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJvdXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sib3ZlcnJpZGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicGFyYW1zIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInByaXZhdGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicHJvdGVjdGVkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInB1YmxpYyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJyZWFkb25seSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJyZWYiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicmV0dXJuIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNieXRlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNlYWxlZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzaG9ydCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzaXplb2YiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic3RhY2thbGxvYyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzdGF0aWMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic3RyaW5nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInN0cnVjdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzd2l0Y2giXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidGhpcyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ0aHJvdyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ0cnVlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInRyeSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ0eXBlb2YiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidWludCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1bG9uZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1bmNoZWNrZWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidW5zYWZlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVzaG9ydCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1c2luZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ2aXJ0dWFsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInZvaWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidm9sYXRpbGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sid2hpbGUiXSA9IDE7CisKKyAgLy8gQyMgY29udGV4dHVhbCBrZXl3b3JkcworICBjc2hhcnBfa2V5d29yZHNbImFkZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJhbGlhcyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJhc2NlbmRpbmciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYXN5bmMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYXdhaXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZGVzY2VuZGluZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkeW5hbWljIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZyb20iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZ2V0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImdsb2JhbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJncm91cCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbnRvIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImpvaW4iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibGV0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm9yZGVyYnkiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicGFydGlhbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJyZW1vdmUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2VsZWN0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNldCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ2YWx1ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ2YXIiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sid2hlcmUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sieWllbGQiXSA9IDE7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkgeworICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgb3V0IDw8ICJuYW1lc3BhY2UgIiA8PCBuYW1lc3BhY2VfbmFtZV8gPDwgIlxuIjsKKyAgICBzY29wZV91cChvdXQpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjplbmRfY3NoYXJwX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpIHsKKyAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkgeworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjc2hhcnBfdHlwZV91c2luZ3MoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJ1c2luZyBTeXN0ZW07XG4iICsgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgICsgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIiArICJ1c2luZyBTeXN0ZW0uVGV4dDtcbiIgKyAidXNpbmcgU3lzdGVtLklPO1xuIgorICAgICAgICAgKyAoKGFzeW5jXykgPyAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIgOiAiIikgKyAidXNpbmcgVGhyaWZ0O1xuIgorICAgICAgICAgKyAidXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zO1xuIiArICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSA/ICIjaWYgIVNJTFZFUkxJR0hUXG4iIDogIiIpCisgICAgICAgICArICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSA/ICJ1c2luZyBTeXN0ZW0uWG1sLlNlcmlhbGl6YXRpb247XG4iIDogIiIpCisgICAgICAgICArICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSA/ICIjZW5kaWZcbiIgOiAiIikKKyAgICAgICAgICsgInVzaW5nIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb247XG4iOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgInVzaW5nIFRocmlmdC5Qcm90b2NvbDtcbiIgKyAidXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDtcbiI7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9Cit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBmX2VudW1fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuY3MiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX2VudW0pOworCisgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9lbnVtLCB0ZW51bSk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIlxuIjsKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX2VudW0sICpjX2l0ZXIpOworCisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIiwiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfZW51bSk7CisKKyAgZW5kX2NzaGFycF9uYW1lc3BhY2UoZl9lbnVtKTsKKworICBmX2VudW0uY2xvc2UoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGlmIChjb25zdHMuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgJy8nICsgcHJvZ3JhbV9uYW1lXyArICIuQ29uc3RhbnRzLmNzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGNzaGFycF90eXBlX3VzaW5ncygpIDw8IGVuZGw7CisKKyAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX2NvbnN0cyk7CisKKyAgaW5kZW50KGZfY29uc3RzKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykKKyAgICAgICAgICAgICAgICAgICA8PCAiQ29uc3RhbnRzIiA8PCBlbmRsOworICBzY29wZV91cChmX2NvbnN0cyk7CisKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gZmFsc2U7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX2NvbnN0cywgKCpjX2l0ZXIpKTsKKyAgICBpZiAocHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKKyAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAobmVlZF9zdGF0aWNfY29uc3RydWN0b3IpIHsKKyAgICBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihmX2NvbnN0cywgY29uc3RzKTsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9jb25zdHMpOworICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX2NvbnN0cyk7CisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKCh0X3N0cnVjdCopdHlwZSk7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGQgPSAoKmZfaXRlcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCBwcm9wX25hbWUoZmllbGQpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCh0X3N0cnVjdCopdHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdIgorICAgICAgICAgICAgICAgICAgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuQWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2NvbnN0cnVjdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgIiA8PCBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHByb2dyYW1fbmFtZV8pLmNfc3RyKCkgPDwgIkNvbnN0YW50cygpIgorICAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgfQorICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8vIGl0IHNlZW1zIGxpa2UgYWxsIHRoYXQgbWV0aG9kcyB0aGF0IGNhbGwgdGhpcyBhcmUgdXNpbmcgaW5fc3RhdGljIHRvIGJlIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IGl0CisvLyB3b3VsZCBpbXBseQorYm9vbCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWR0eXBlKSB7CisgIGluZGVudChvdXQpOworICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9ICFpbl9zdGF0aWM7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKCFkZWZ2YWwgfHwgbmVlZHR5cGUpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICIiIDogdHlwZS0+aXNfYmFzZV90eXBlKCkgPyAicHVibGljIGNvbnN0ICIgOiAicHVibGljIHN0YXRpYyAiKQorICAgICAgICA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICB9CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKKyAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSBmYWxzZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpCisgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGRlZnZhbCAmJiAhdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX2VudW0oKSkgeworICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgfQorCisgIHJldHVybiBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb247Cit9CisKK3N0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICh1bmlvbl8gJiYgdHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGdlbmVyYXRlX2NzaGFycF91bmlvbih0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5jcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGNzaGFycF90eXBlX3VzaW5ncygpIDw8IGNzaGFycF90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKworICBpZiAoIWluX2NsYXNzKSB7CisgICAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShvdXQpOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhvdXQsIHRzdHJ1Y3QpOworICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmICFpc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiW0RhdGFDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7IC8vIGRvIG5vdCBtYWtlIGV4Y2VwdGlvbiBjbGFzc2VzIGRpcmVjdGx5IFdDRiBzZXJpYWxpemFibGUsIHdlIHByb3ZpZGUgYQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlICJmYXVsdCIgZm9yIHRoYXQKKyAgfQorICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiCisgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpIDw8ICIgOiAiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIlRFeGNlcHRpb24sICI7CisgIH0KKyAgb3V0IDw8ICJUQmFzZSI7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIC8vIGlmIHRoZSBmaWVsZCBpcyByZXF1aWVkLCB0aGVuIHdlIHVzZSBhdXRvLXByb3BlcnRpZXMKKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkgJiYgKCFudWxsYWJsZV8gfHwgZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgIH0KKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBib29sIGhhc19ub25fcmVxdWlyZWRfZmllbGRzID0gZmFsc2U7CisgIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IGZhbHNlOworICBib29sIGhhc19yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2Mob3V0LCAqbV9pdGVyKTsKKyAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIHRydWUpOworICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOworICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgIGlmIChpc19yZXF1aXJlZCkgeworICAgICAgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChoYXNfZGVmYXVsdCkgeworICAgICAgICBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGhhc19ub25fcmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBib29sIGdlbmVyYXRlX2lzc2V0ID0gKG51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCFudWxsYWJsZV8gJiYgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMpOworICBpZiAoZ2VuZXJhdGVfaXNzZXQpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltYbWxJZ25vcmVdIC8vIFhtbFNlcmlhbGl6ZXIiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiW0RhdGFNZW1iZXIoT3JkZXIgPSAxKV0gIC8vIFhtbE9iamVjdFNlcmlhbGl6ZXIsIERhdGFDb250cmFjdEpzb25TZXJpYWxpemVyLCBldGMuIgorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIElzc2V0IF9faXNzZXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIjaWYgIVNJTFZFUkxJR0hUIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJbRGF0YUNvbnRyYWN0XSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdHJ1Y3QgSXNzZXQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKKyAgICAgIC8vIGlmIGl0IGlzIG5vdCByZXF1aXJlZCwgaWYgaXQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBJc3NldAorICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAorICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpIHsKKyAgICAgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJbRGF0YU1lbWJlcl0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAoZ2VuZXJhdGVfaXNzZXQgJiYgKHNlcmlhbGl6ZV8gfHwgd2NmXykpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIjcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOworICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKTsKKyAgICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKKyAgICAgICAgLy8gaWYgaXQgaXMgbm90IHJlcXVpcmVkLCBpZiBpdCBoYXMgYSBkZWZhdWx0IHZhbHVlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIElzc2V0CisgICAgICAgIC8vIGlmIHdlIGFyZSBub3QgbnVsbGFibGUsIHRoZW4gd2UgZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2wgU2hvdWxkU2VyaWFsaXplIiA8PCBwcm9wX25hbWUoKCptX2l0ZXIpKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCkgPDwgIiNlbmRyZWdpb24gWG1sU2VyaWFsaXplciBzdXBwb3J0IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gV2UgYWx3YXlzIHdhbnQgYSBkZWZhdWx0LCBubyBhcmd1bWVudCBjb25zdHJ1Y3RvciBmb3IgUmVhZGluZworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgbm9ybWFsaXplX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKKyAgICB9CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkpIHsKKyAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgcHJvcF9uYW1lKCptX2l0ZXIpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuXyIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAvLyBPcHRpb25hbHMgd2l0aCBkZWZhdWx0cyBhcmUgbWFya2VkIHNldAorICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ1ZTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGhhc19yZXF1aXJlZF9maWVsZHMpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiKSA6IHRoaXMoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBwcm9wX25hbWUoKCptX2l0ZXIpKSA8PCAiID0gIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGlmIChpc19yZXN1bHQpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGlmIChoYXNoY29kZV8pIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2VxdWFscyhvdXQsIHRzdHJ1Y3QpOworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfaGFzaGNvZGUob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgYSBjb3JyZXNwb25kaW5nIFdDRiBmYXVsdCB0byB3cmFwIHRoZSBleGNlcHRpb24KKyAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmIGlzX2V4Y2VwdGlvbikgeworICAgIGdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QpOworICBpZiAoIWluX2NsYXNzKSB7CisgICAgZW5kX2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIjaWYgIVNJTFZFUkxJR0hUIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiW1NlcmlhbGl6YWJsZV0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJbRGF0YUNvbnRyYWN0XSIgPDwgZW5kbDsKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJGYXVsdCIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gbWFrZSBwcml2YXRlIG1lbWJlcnMgd2l0aCBwdWJsaWMgUHJvcGVydGllcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgLy8gaWYgdGhlIGZpZWxkIGlzIHJlcXVpZWQsIHRoZW4gd2UgdXNlIGF1dG8tcHJvcGVydGllcworICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSAmJiAoIW51bGxhYmxlXyB8fCBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIiA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiXyIpIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBSZWFkIChUUHJvdG9jb2wgaXByb3QpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBSZXF1aXJlZCB2YXJpYWJsZXMgYXJlbid0IGluIF9faXNzZXQsIHNvIHdlIG5lZWQgdG1wIHZhcnMgdG8gY2hlY2sgdGhlbQorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5SZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpOworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisgICAgaWYgKGlzX3JlcXVpcmVkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICIKKyAgICAgICAgICA8PCAiXCJyZXF1aXJlZCBmaWVsZCAiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgbm90IHNldFwiKTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIlRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSk7CisgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKTsKKyAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworCisgICAgICBpZiAoaXNfcmVxdWlyZWQpCisgICAgICB7CisgICAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiA9PSBudWxsKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIgorICAgICAgICAgICAgICA8PCAiXCJyZXF1aXJlZCBmaWVsZCAiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgbm90IHNldFwiKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCkgeworICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIKKyAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsiIDw8IGVuZGw7CisKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworCisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgICAgIGlmICghaXNfcmVxdWlyZWQpIHsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIlRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgICAgfQorCisgICAgICBpZiAobnVsbGFibGVfKSB7CisgICAgICAgIG91dCA8PCAiKHRoaXMuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIih0aGlzLl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSAhbnVsbGFibGVfICYmIHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIlwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsiIDw8IGVuZGw7CisKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworCisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJTdHJpbmdCdWlsZGVyIF9fc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGJvb2wgdXNlRmlyc3RGbGFnID0gZmFsc2U7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBfX2ZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICB1c2VGaXJzdEZsYWcgPSB0cnVlOworICAgIH0KKyAgICBicmVhazsKKyAgfQorCisgIGJvb2wgaGFkX3JlcXVpcmVkID0gZmFsc2U7IC8vIHNldCB0byB0cnVlIGFmdGVyIGZpcnN0IHJlcXVpcmVkIGZpZWxkIGhhcyBiZWVuIHByb2Nlc3NlZAorCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSk7CisgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSk7CisgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfSBlbHNlIGlmICghaXNfcmVxdWlyZWQpIHsKKyAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIgorICAgICAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodXNlRmlyc3RGbGFnICYmICghaGFkX3JlcXVpcmVkKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmKCFfX2ZpcnN0KSB7IF9fc2IuQXBwZW5kKFwiLCBcIik7IH0iIDw8IGVuZGw7CisgICAgICBpZiAoIWlzX3JlcXVpcmVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJfX2ZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgIl9fc2IuQXBwZW5kKFwiIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiOiBcIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoXCIsICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIjogXCIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpCisgICAgICAgICAgICAgICAgICA8PCAiPT0gbnVsbCA/IFwiPG51bGw+XCIgOiAiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIuVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCFpc19yZXF1aXJlZCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBoYWRfcmVxdWlyZWQgPSB0cnVlOyAvLyBub3cgX19maXJzdCBtdXN0IGJlIGZhbHNlLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGl0IGFueW1vcmUKKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoXCIpXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBfX3NiLlRvU3RyaW5nKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbikgeworICBzdHJpbmcgZl91bmlvbl9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodHVuaW9uLT5nZXRfbmFtZSgpKSArICIuY3MiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdW5pb247CisKKyAgZl91bmlvbi5vcGVuKGZfdW5pb25fbmFtZS5jX3N0cigpKTsKKworICBmX3VuaW9uIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGNzaGFycF90eXBlX3VzaW5ncygpIDw8IGNzaGFycF90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fZGVmaW5pdGlvbihmX3VuaW9uLCB0dW5pb24pOworCisgIGZfdW5pb24uY2xvc2UoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbl9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKSB7CisgIC8vIExldCdzIGRlZmluZSB0aGUgY2xhc3MgZmlyc3QKKyAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIDogVEFic3RyYWN0QmFzZSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZShUUHJvdG9jb2wgcHJvdG9jb2wpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyByZWFkb25seSBpbnQgSXNzZXQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGFic3RyYWN0IG9iamVjdCBEYXRhIHsgZ2V0OyB9IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIihpbnQgaXNzZXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiSXNzZXQgPSBpc3NldDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyBfX191bmRlZmluZWQgOiAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gbnVsbDsgfSB9IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgX19fdW5kZWZpbmVkKCkgOiBiYXNlKDApIHt9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKFRQcm90b2NvbCBwcm90b2NvbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCBcIkNhbm5vdCBwZXJzaXN0ICIKKyAgICAgICAgICAgICAgICAgImFuIHVuaW9uIHR5cGUgd2hpY2ggaXMgbm90IHNldC5cIik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHVuaW9uLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fY2xhc3Mob3V0LCB0dW5pb24sICgqZl9pdGVyKSk7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fcmVhZGVyKG91dCwgdHVuaW9uKTsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb25fY2xhc3Moc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0dW5pb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBBc18iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJnZXQiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAoIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiID09IElzc2V0KSA/ICgiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIpRGF0YSA6IGRlZmF1bHQoIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbAorICAgICAgPDwgZW5kbDsKKwkKKwkKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIF9kYXRhOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBvYmplY3QgRGF0YSB7IGdldCB7IHJldHVybiBfZGF0YTsgfSB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICA8PCAiIGRhdGEpIDogYmFzZSgiPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwiKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRoaXMuX2RhdGEgPSBkYXRhOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0odGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkLklEID0gIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIHRmaWVsZCwgIl9kYXRhIiwgdHJ1ZSwgdHJ1ZSk7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZXF1YWxzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3QgdGhhdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInZhciBvdGhlciA9IHRoYXQgYXMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIChSZWZlcmVuY2VFcXVhbHModGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiYmICI7CisgICAgfQorICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpIHsKKyAgICAgIG91dCA8PCAiKChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID09IG90aGVyLl9faXNzZXQuIgorICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgJiYgKCghX19pc3NldC4iCisgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB8fCAoIjsKKyAgICB9CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICJUQ29sbGVjdGlvbnMuRXF1YWxzKCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiU3lzdGVtLk9iamVjdC5FcXVhbHMoIjsKKyAgICB9CisgICAgb3V0IDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIsIG90aGVyLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikiOworICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpIHsKKyAgICAgIG91dCA8PCAiKSkpIjsKKyAgICB9CisgIH0KKyAgaWYgKGZpcnN0KSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaW50IGhhc2hjb2RlID0gMDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ1bmNoZWNrZWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaGFzaGNvZGUgPSAoaGFzaGNvZGUgKiAzOTcpIF4gIjsKKyAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkgeworICAgICAgb3V0IDw8ICIoIjsKKyAgICB9IGVsc2UgaWYgKG51bGxhYmxlXykgeworICAgICAgb3V0IDw8ICIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiID09IG51bGwgPyAwIDogIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIoIV9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPyAwIDogIjsKKyAgICB9CisgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgb3V0IDw8ICIoVENvbGxlY3Rpb25zLkdldEhhc2hDb2RlKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikpIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLkdldEhhc2hDb2RlKCkpIjsKKyAgICB9CisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGhhc2hjb2RlOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIuY3MiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX3NlcnZpY2VfKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBwYXJ0aWFsIGNsYXNzICIgPDwgbm9ybWFsaXplX25hbWUoc2VydmljZV9uYW1lXykgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBnZW5lcmF0ZV9zZXBhcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZXModHNlcnZpY2UpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VwYXJhdGVfc2VydmljZV9pbnRlcmZhY2VzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisKKyAgaWYgKGFzeW5jXykgeworICAgIGdlbmVyYXRlX2FzeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgfQorCisgIGdlbmVyYXRlX2NvbWJpbmVkX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N5bmNfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWZhY2UgPSAiIDogIiArIGV4dGVuZHMgKyAiLklTeW5jIjsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIGlmICh3Y2ZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5TZXJ2aWNlQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBpbnRlcmZhY2UgSVN5bmMiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworCisgICAgLy8gaWYgd2UncmUgdXNpbmcgV0NGLCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcworICAgIGlmICh3Y2ZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLk9wZXJhdGlvbkNvbnRyYWN0XSIgPDwgZW5kbDsKKworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuRmF1bHRDb250cmFjdCh0eXBlb2YoIgorICAgICAgICAgICsgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICJGYXVsdCkpXSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2FzeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmYWNlID0gIiA6ICIgKyBleHRlbmRzICsgIi5JQXN5bmMiOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgaWYgKHdjZl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLlNlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGludGVyZmFjZSBJQXN5bmMiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworCisgICAgLy8gaWYgd2UncmUgdXNpbmcgV0NGLCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcworICAgIGlmICh3Y2ZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLk9wZXJhdGlvbkNvbnRyYWN0XSIgPDwgZW5kbDsKKworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuRmF1bHRDb250cmFjdCh0eXBlb2YoIgorICAgICAgICAgICsgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICJGYXVsdCkpXSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbWJpbmVkX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIDogSVN5bmMiOworCisgIGlmIChhc3luY18pIHsKKyAgICBleHRlbmRzX2lmYWNlICs9ICIsIElBc3luYyI7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICBpZiAod2NmXykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vIFdlIG5lZWQgdG8gZ2VuZXJhdGUgZXh0cmEgb2xkIHN0eWxlIGFzeW5jIG1ldGhvZHMgZm9yIHNpbHZlcmxpZ2h0LiBTaW5jZQorICAvLyB0aGlzIGlzbid0IHNvbWV0aGluZyB5b3UnZCB3YW50IHRvIGltcGxlbWVudCBzZXJ2ZXItc2lkZSwganVzdCBwdXQgdGhlbSBpbnRvCisgIC8vIHRoZSBtYWluIElmYWNlIGludGVyZmFjZS4KKyAgZ2VuZXJhdGVfc2lsdmVybGlnaHRfYXN5bmNfbWV0aG9kcyh0c2VydmljZSk7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zaWx2ZXJsaWdodF9hc3luY19tZXRob2RzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKworICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaW5jbHVkZSB0aGUgQmVnaW5fLCBFbmRfIG1ldGhvZHMgaWYgd2UncmUgZ2VuZXJhdGluZworICAgIC8vIHdpdGggdGhlIGFzeW5jIGZsYWcuIEknbSBub3Qgc3VyZSB0aGlzIGlzIG5lY2Vzc2FyeSwgc28gc29tZW9uZSB3aXRoIG1vcmUga25vd2xlZGdlCisgICAgLy8gY2FuIG1heWJlIHJlbW92ZSB0aGVzZSBjaGVja3MgaWYgdGhleSBrbm93IGl0J3Mgc2FmZS4KKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigqZl9pdGVyLCAiQmVnaW5fIikgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQoKmZfaXRlciwgIkVuZF8iKSA8PCAiOyIgPDwgZW5kbDsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7CisgIH0gZWxzZSB7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiSURpc3Bvc2FibGUsICI7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBjbGFzcyBDbGllbnQgOiAiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICJJZmFjZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90KSA6IHRoaXMocHJvdCwgcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSI7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiIDogYmFzZShpcHJvdCwgb3Byb3QpIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBpcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBvcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgaW50IHNlcWlkXzsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgVFByb3RvY29sIElucHV0UHJvdG9jb2wiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJnZXQgeyByZXR1cm4gaXByb3RfOyB9IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgVFByb3RvY29sIE91dHB1dFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZ2V0IHsgcmV0dXJuIG9wcm90XzsgfSIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjcmVnaW9uIFwiIElEaXNwb3NhYmxlIFN1cHBvcnQgXCIiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvLyBJRGlzcG9zYWJsZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIERpc3Bvc2UoKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIkRpc3Bvc2UodHJ1ZSk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoIV9Jc0Rpc3Bvc2VkKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChkaXNwb3NpbmcpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGlwcm90XyAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigoSURpc3Bvc2FibGUpaXByb3RfKS5EaXNwb3NlKCk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob3Byb3RfICE9IG51bGwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKChJRGlzcG9zYWJsZSlvcHJvdF8pLkRpc3Bvc2UoKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfSXNEaXNwb3NlZCA9IHRydWU7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kcmVnaW9uIiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOworICAgIH0KKyAgICAvLyBCZWdpbl8KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigqZl9pdGVyLCAiQmVnaW5fIikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKGNhbGxiYWNrLCBzdGF0ZSI7CisKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICBmX3NlcnZpY2VfIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAvLyBFbmQKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQoKmZfaXRlciwgIkVuZF8iKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5FbmRGbHVzaChhc3luY1Jlc3VsdCk7IiA8PCBlbmRsOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIC8vIGFzeW5jCisgICAgYm9vbCBmaXJzdDsKKyAgICBpZiAoYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBhc3luYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyLCAiIikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiIHJldHZhbDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dmFsID0gIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKTsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImF3YWl0IFRhc2suUnVuKCgpID0+IiA8PCBlbmRsOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBmdW5uYW1lIDw8ICIoIjsKKyAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcmV0dmFsOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gc2lsdmVybGlnaHQgaW52b2tlCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciBhc3luY1Jlc3VsdCA9IEJlZ2luXyIgPDwgZnVubmFtZSA8PCAiKG51bGwsIG51bGwiOworICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICAgICAgCisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgIkVuZF8iIDw8IGZ1bm5hbWUgPDwgIihhc3luY1Jlc3VsdCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbHNlIiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIHN5bmNocm9ub3VzIGludm9rZQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworICAKKyAgICBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICAKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgLy8gU2VuZAorICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IiA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpCisgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUKKyAgICAgICAgICAgICAgIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBvcHJvdF8uVHJhbnNwb3J0LkJlZ2luRmx1c2goY2FsbGJhY2ssIHN0YXRlKTsiIDw8IGVuZGw7CisgICAgICAKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbHNlIiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PbmV3YXkiIDogIlRNZXNzYWdlVHlwZS5DYWxsIikKKyAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuV3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdF8uVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAobXNnLlR5cGUgPT0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZChpcHJvdF8pOyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ0aHJvdyB4OyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIgorICAgICAgICAgICAgICAgICA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaWYgKG51bGxhYmxlXykgeworICAgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2VzcyAhPSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2Vzcy5IYXNWYWx1ZSkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gcmVzdWx0LlN1Y2Nlc3MuVmFsdWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgaWYgKG51bGxhYmxlXykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTWlzc2luZ1Jlc3VsdCwgXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKGFzeW5jXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX2FzeW5jKHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9zeW5jKHRzZXJ2aWNlKTsKKyAgfQorICBlbHNlIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9zeW5jKHRzZXJ2aWNlKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfc3luYyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yLCAiOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgUHJvY2Vzc29yIDogIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiVFByb2Nlc3NvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBQcm9jZXNzb3IoSVN5bmMgaWZhY2UpIjsKKworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaWZhY2UpIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICA8PCAiXCJdID0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9Qcm9jZXNzOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJwcm90ZWN0ZWQgZGVsZWdhdGUgdm9pZCBQcm9jZXNzRnVuY3Rpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7IgorICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgSVN5bmMgaWZhY2VfOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3ICIKKyAgICAgICJEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgfQorICBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBuZXcgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgfQorICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXworICAgIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm47IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgInByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBvdXQgZm4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gIgorICAgICIoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIgKyAiCisgICAgIm1zZy5OYW1lICsgXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKSk7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoIChJT0V4Y2VwdGlvbikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfYXN5bmModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLkFzeW5jUHJvY2Vzc29yLCAiOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgQXN5bmNQcm9jZXNzb3IgOiAiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUQXN5bmNQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQXN5bmNQcm9jZXNzb3IoSUFzeW5jIGlmYWNlKSI7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiIDogYmFzZShpZmFjZSkiOworICB9CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3NBc3luYzsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIFRhc2sgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOyIKKyAgICAgIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIElBc3luYyBpZmFjZV87IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPSBuZXcgIgorICAgICAgIkRpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+KCk7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgbmV3IGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgfQorICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXworICAgIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm47IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgInByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBvdXQgZm4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gIgorICAgICIoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIgKyAiCisgICAgIm1zZy5OYW1lICsgXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKSk7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoIChJT0V4Y2VwdGlvbikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJfUHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MuUmVhZChpcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5TdWNjZXNzID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJpZmFjZV8uIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKKyAgICBpZiAobnVsbGFibGVfICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIi5WYWx1ZSI7CisgICAgfQorICB9CisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKSk7ICIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh4cyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChFeGNlcHRpb24gZXgpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBDb25zb2xlLkVycm9yLldyaXRlTGluZShcIkVycm9yIG9jY3VycmVkIGluIHByb2Nlc3NvcjpcIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoZXguVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcixcIiBJbnRlcm5hbCBlcnJvci5cIik7IgorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgc2VxaWQpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYXN5bmMgVGFzayAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgIDw8ICJfUHJvY2Vzc0FzeW5jKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiYXJncy5SZWFkKGlwcm90KTsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LlN1Y2Nlc3MgPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgImF3YWl0IGlmYWNlXy4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIkFzeW5jKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKKyAgICBpZiAobnVsbGFibGVfICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIi5WYWx1ZSI7CisgICAgfQorICB9CisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIKKyAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKSk7ICIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh4cyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93OyIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChFeGNlcHRpb24gZXgpIiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiICBDb25zb2xlLkVycm9yLldyaXRlTGluZShcIkVycm9yIG9jY3VycmVkIGluIHByb2Nlc3NvcjpcIik7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgIiAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoZXguVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcixcIiBJbnRlcm5hbCBlcnJvci5cIik7IgorICAgICAgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgc2VxaWQpKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb25fcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKSB7CisgIC8vIFRoYW5rcyB0byBUSFJJRlQtMTc2OCwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIGluIHRoZSB1bmlvbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0dW5pb24tPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIFJlYWQoVFByb3RvY29sIGlwcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiByZXR2YWw7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisgIC8vIHdlIGNhbm5vdCBoYXZlIHRoZSBmaXJzdCBmaWVsZCBiZSBhIHN0b3AgLS0gd2UgbXVzdCBoYXZlIGEgc2luZ2xlIGZpZWxkIGRlZmluZWQKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuSUQpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0ZW1wOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInRlbXAiLCB0cnVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dmFsID0gbmV3ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIodGVtcCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIChpcHJvdC5SZWFkRmllbGRCZWdpbigpLlR5cGUgIT0gVFR5cGUuU3RvcCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIGVuZCBvZiBlbHNlIGZvciBUU3RvcAorICBzY29wZV9kb3duKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzKSB7CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiOworCisgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIpIjsKKyAgICB9CisKKyAgICBvdXQgPDwgImlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIlJlYWRCaW5hcnkoKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiUmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiUmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIlJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKHVuaW9uXyAmJiB0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5SZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgcHJlZml4IDw8ICIuUmVhZChpcHJvdCk7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IoIGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5Db3VudCIKKyAgICAgICAgICAgICAgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcm9wZXJ0eWxlc3MpIHsKKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgKGlzX3Byb3BlcnR5bGVzcyA/ICIiIDogcHJvcF9uYW1lKHRmaWVsZCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKKworICAgIHN0cmluZyBudWxsYWJsZV9uYW1lID0gbnVsbGFibGVfICYmICFpc19lbGVtZW50ICYmICFmaWVsZF9pc19yZXF1aXJlZCh0ZmllbGQpID8gbmFtZSArICIuVmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuYW1lOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmcoIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJvb2woIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMTYoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMzIoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiV3JpdGVJNjQoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiV3JpdGVJMzIoKGludCkiIDw8IG51bGxhYmxlX25hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICA8PCAiLkNvdW50KSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLktleXMpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCB0cnVlKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdlbmVyYXRlSXNzZXQpIHsKKyAgZ2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG91dCwgdGZpZWxkLCBpc1B1YmxpYywgZ2VuZXJhdGVJc3NldCwgIl8iKTsKK30KK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfcHJvcGVydHkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ2VuZXJhdGVJc3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgpIHsKKyAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmIGlzUHVibGljKSB7CisgICAgaW5kZW50KG91dCkgPDwgIltEYXRhTWVtYmVyKE9yZGVyID0gMCldIiA8PCBlbmRsOworICB9CisgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCh0ZmllbGQpOworICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQodGZpZWxkKTsKKyAgaWYgKChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0KSB8fCAoaXNfcmVxdWlyZWQpKSB7CisgICAgaW5kZW50KG91dCkgPDwgKGlzUHVibGljID8gInB1YmxpYyAiIDogInByaXZhdGUgIikKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGlzX3JlcXVpcmVkKSA8PCAiICIKKyAgICAgICAgICAgICAgICA8PCBwcm9wX25hbWUodGZpZWxkKSA8PCAiIHsgZ2V0OyBzZXQ7IH0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgKGlzUHVibGljID8gInB1YmxpYyAiIDogInByaXZhdGUgIikKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UsIHRydWUpIDw8ICIgIiA8PCBwcm9wX25hbWUodGZpZWxkKQorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZ2V0IiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgYm9vbCB1c2VfbnVsbGFibGUgPSBmYWxzZTsKKyAgICBpZiAobnVsbGFibGVfKSB7CisgICAgICB0X3R5cGUqIHR0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICAgICAgfQorICAgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB1c2VfbnVsbGFibGUgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgIT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOworICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIHVzZV9udWxsYWJsZSA9IHRydWU7CisgICAgICB9CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmICh1c2VfbnVsbGFibGUpIHsKKyAgICAgIGlmIChnZW5lcmF0ZUlzc2V0KSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiID0gdmFsdWUuSGFzVmFsdWU7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZS5IYXNWYWx1ZSkgdGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiID0gdmFsdWUuVmFsdWU7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoZ2VuZXJhdGVJc3NldCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisgIG91dCA8PCBlbmRsOworfQorCitzdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIGZyb21OYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHN0ciA9IGZyb21OYW1lOworICBpZiAoc3RyLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgLy8gdGVzdHMgcmVseSBvbiB0aGlzCisgIGFzc2VydCgoJ0EnIDwgJ1onKSAmJiAoJ2EnIDwgJ3onKSAmJiAoJzAnIDwgJzknKSk7CisKKyAgLy8gaWYgdGhlIGZpcnN0IGxldHRlciBpcyBhIG51bWJlciwgd2UgYWRkIGFuIGFkZGl0aW9uYWwgdW5kZXJzY29yZSBpbiBmcm9udCBvZiBpdAorICBjaGFyIGMgPSBzdHIuYXQoMCk7CisgIGlmICgoJzAnIDw9IGMpICYmIChjIDw9ICc5JykpIHsKKyAgICBzdHIgPSAiXyIgKyBzdHI7CisgIH0KKworICAvLyBmb2xsb3dpbmcgY2hhcnM6IGxldHRlciwgbnVtYmVyIG9yIHVuZGVyc2NvcmUKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpIHsKKyAgICBjID0gc3RyLmF0KGkpOworICAgIGlmICgoKCdBJyA+IGMpIHx8IChjID4gJ1onKSkgJiYgKCgnYScgPiBjKSB8fCAoYyA+ICd6JykpICYmICgoJzAnID4gYykgfHwgKGMgPiAnOScpKQorICAgICAgICAmJiAoJ18nICE9IGMpKSB7CisgICAgICBzdHIucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUpIHsKKyAgaWYoIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKSB7CisgICAgdGhyb3cgImludGVybmFsIGVycm9yOiBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKSBubyBzY29wZSBhY3RpdmUiOworICB9CisKKyAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CisgIGlmIChhY3RpdmUuc2NvcGVfbWVtYmVyICE9IHNjb3BlKSB7CisgICAgdGhyb3cgImludGVybmFsIGVycm9yOiBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKSBjYWxsZWQgZm9yIHdyb25nIHN0cnVjdCI7CisgIH0KKworICBtZW1iZXJfbWFwcGluZ19zY29wZXMucG9wX2JhY2soKTsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2V0X21hcHBlZF9tZW1iZXJfbmFtZShzdHJpbmcgbmFtZSkgeworICBpZiggISBtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkgeworICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBhY3RpdmUubWFwcGluZ190YWJsZS5maW5kKG5hbWUpOworICAgIGlmIChhY3RpdmUubWFwcGluZ190YWJsZS5lbmQoKSAhPSBpdGVyKSB7CisgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgIH0KKyAgfQorCisgIHB2ZXJib3NlKCJubyBtYXBwaW5nIGZvciBtZW1iZXIgJXNcbiIsIG5hbWUuY19zdHIoKSk7CisgIHJldHVybiBuYW1lOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0LCB0c3RydWN0LT5nZXRfbWVtYmVycygpLCB0c3RydWN0LT5nZXRfbmFtZSgpKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RuYW1lKSB7CisgIC8vIGJlZ2luIG5ldyBzY29wZQorICBtZW1iZXJfbWFwcGluZ19zY29wZSBkdW1teTsKKyAgZHVtbXkuc2NvcGVfbWVtYmVyID0gMDsKKyAgbWVtYmVyX21hcHBpbmdfc2NvcGVzLnB1c2hfYmFjayhkdW1teSk7CisgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICBhY3RpdmUuc2NvcGVfbWVtYmVyID0gc2NvcGU7CisKKyAgLy8gY3VycmVudCBDIyBnZW5lcmF0b3IgcG9saWN5OgorICAvLyAtIHByb3AgbmFtZXMgYXJlIGFsd2F5cyByZW5kZXJlZCB3aXRoIGFuIFVwcGVyY2FzZSBmaXJzdCBsZXR0ZXIKKyAgLy8gLSBzdHJ1Y3QgbmFtZXMgYXJlIHVzZWQgYXMgZ2l2ZW4KKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHVzZWRfbWVtYmVyX25hbWVzOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgIC8vIHByZXZlbnQgbmFtZSBjb25mbGljdHMgd2l0aCBzdHJ1Y3QgKENTMDU0MiBlcnJvcikKKyAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KHN0cnVjdG5hbWUpOworCisgIC8vIHByZXZlbnQgbmFtZSBjb25mbGljdHMgd2l0aCBrbm93biBtZXRob2RzIChUSFJJRlQtMjk0MikKKyAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KCJSZWFkIik7CisgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiV3JpdGUiKTsKKworICBmb3IgKGl0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGl0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytpdGVyKSB7CisgICAgc3RyaW5nIG9sZG5hbWUgPSAoKml0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBuZXduYW1lID0gcHJvcF9uYW1lKCppdGVyLCB0cnVlKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworCisgICAgICAvLyBuZXcgbmFtZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlcgorICAgICAgaWYgKHVzZWRfbWVtYmVyX25hbWVzLmZpbmQobmV3bmFtZSkgIT0gdXNlZF9tZW1iZXJfbmFtZXMuZW5kKCkpIHsKKyAgICAgICAgcHZlcmJvc2UoInN0cnVjdCAlczogbWVtYmVyICVzIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgbWVtYmVyXG4iLAorICAgICAgICAgICAgICAgICBzdHJ1Y3RuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIG5ld25hbWUuY19zdHIoKSk7CisgICAgICAgIG5ld25hbWUgKz0gJ18nOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gYWRkIGFsd2F5cywgdGhpcyBoZWxwcyB1cyB0byBkZXRlY3QgZWRnZSBjYXNlcyBsaWtlCisgICAgICAvLyBkaWZmZXJlbnQgc3BlbGxpbmdzICgiZm9vIiBhbmQgIkZvbyIpIHdpdGhpbiB0aGUgc2FtZSBzdHJ1Y3QKKyAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciBtYXBwaW5nICVzID0+ICVzXG4iLAorICAgICAgICAgICAgICAgc3RydWN0bmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgb2xkbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgbmV3bmFtZS5jX3N0cigpKTsKKyAgICAgIGFjdGl2ZS5tYXBwaW5nX3RhYmxlW29sZG5hbWVdID0gbmV3bmFtZTsKKyAgICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChuZXduYW1lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgc3VwcHJlc3NfbWFwcGluZykgeworICBzdHJpbmcgbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpOworICBpZiAoc3VwcHJlc3NfbWFwcGluZykgeworICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOworICB9IGVsc2UgeworICAgIG5hbWUgPSBnZXRfbWFwcGVkX21lbWJlcl9uYW1lKG5hbWUpOworICB9CisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkKSB7CisgICh2b2lkKWluX2luaXQ7CisgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIsIGluX3BhcmFtLCBpc19yZXF1aXJlZCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIHJldHVybiAiRGljdGlvbmFyeTwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSArICIsICIKKyAgICAgICAgICAgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICByZXR1cm4gIlRIYXNoU2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIHJldHVybiAiTGlzdDwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOworICB9CisKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIHN0cmluZyBwb3N0Zml4ID0gKCFpc19yZXF1aXJlZCAmJiBudWxsYWJsZV8gJiYgaW5fcGFyYW0gJiYgdHR5cGUtPmlzX2VudW0oKSkgPyAiPyIgOiAiIjsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgc3RyaW5nIG5zID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIik7CisgICAgaWYgKCFucy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gbnMgKyAiLiIgKyBub3JtYWxpemVfbmFtZSh0dHlwZS0+Z2V0X25hbWUoKSkgKyBwb3N0Zml4OworICAgIH0KKyAgfQorCisgIHJldHVybiBub3JtYWxpemVfbmFtZSh0dHlwZS0+Z2V0X25hbWUoKSkgKyBwb3N0Zml4OworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkKSB7CisgICh2b2lkKWluX2NvbnRhaW5lcjsKKyAgc3RyaW5nIHBvc3RmaXggPSAoIWlzX3JlcXVpcmVkICYmIG51bGxhYmxlXyAmJiBpbl9wYXJhbSkgPyAiPyIgOiAiIjsKKyAgc3dpdGNoICh0YmFzZS0+Z2V0X2Jhc2UoKSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHRiYXNlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJieXRlW10iOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJib29sIiArIHBvc3RmaXg7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJzYnl0ZSIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gInNob3J0IiArIHBvc3RmaXg7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaW50IiArIHBvc3RmaXg7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAibG9uZyIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gImRvdWJsZSIgKyBwb3N0Zml4OworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UtPmdldF9iYXNlKCkpOworICB9Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIHN0ZDo6c3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIGZpZWxkX2hhc19kZWZhdWx0KHRmaWVsZCkpIHsKKyAgICAgIHN0ZDo6b2ZzdHJlYW0gZHVtbXk7CisgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKTAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIoIgorICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGNvbW1hID0gKHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPiAwID8gIiwgIiA6ICIiKTsKKyAgcmV0dXJuICJJQXN5bmNSZXN1bHQgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICsgIihBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUiICsgY29tbWEgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkKKyAgICAgICAgICsgIikiOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICsgIihJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQpIjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICBzdHJpbmcgdGFzayA9ICJUYXNrIjsKKyAgaWYgKCF0dHlwZS0+aXNfdm9pZCgpKQorICAgIHRhc2sgKz0gIjwiICsgdHlwZV9uYW1lKHR0eXBlKSArICI+IjsKKyAgcmV0dXJuIHRhc2sgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIkFzeW5jKCIKKyAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIgKyBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJ5dGUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTWFwIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU2V0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxpc3QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKSB7CisgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8vLyA8c3VtbWFyeT5cbiIsICIvLy8gIiwgY29udGVudHMsICIvLy8gPC9zdW1tYXJ5PlxuIik7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICBzdHJpbmcgY29tYmluZWRfbWVzc2FnZSA9IGZpZWxkLT5nZXRfZG9jKCkgKyAiXG48c2VlYWxzbyBjcmVmPVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSArICJcIi8+IjsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gcHM7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBwcyA8PCAiXG48cGFyYW0gbmFtZT1cIiIgPDwgcC0+Z2V0X25hbWUoKSA8PCAiXCI+IjsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyID0gcC0+Z2V0X2RvYygpOworICAgICAgICBzdHIuZXJhc2Uoc3RkOjpyZW1vdmUoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwgJ1xuJyksCisgICAgICAgICAgICAgICAgICBzdHIuZW5kKCkpOyAvLyByZW1vdmUgdGhlIG5ld2xpbmVzIHRoYXQgYXBwZWFyIGZyb20gdGhlIHBhcnNlcgorICAgICAgICBwcyA8PCBzdHI7CisgICAgICB9CisgICAgICBwcyA8PCAiPC9wYXJhbT4iOworICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VtbWFyeT5cbiIgKyB0ZnVuY3Rpb24tPmdldF9kb2MoKSArICI8L3N1bW1hcnk+IiArIHBzLnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyBwYWNrYWdlID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjc2hhcnAiKSArICIuIjsKKyAgfQorICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBjc2hhcnAsCisgICAgIkMjIiwKKyAgICAiICAgIGFzeW5jOiAgICAgICAgICAgQWRkcyBBc3luYyBzdXBwb3J0IHVzaW5nIFRhc2suUnVuLlxuIgorICAgICIgICAgd2NmOiAgICAgICAgICAgICBBZGRzIGJpbmRpbmdzIGZvciBXQ0YgdG8gZ2VuZXJhdGVkIGNsYXNzZXMuXG4iCisgICAgIiAgICBzZXJpYWw6ICAgICAgICAgIEFkZCBzZXJpYWxpemF0aW9uIHN1cHBvcnQgdG8gZ2VuZXJhdGVkIGNsYXNzZXMuXG4iCisgICAgIiAgICBudWxsYWJsZTogICAgICAgIFVzZSBudWxsYWJsZSB0eXBlcyBmb3IgcHJvcGVydGllcy5cbiIKKyAgICAiICAgIGhhc2hjb2RlOiAgICAgICAgR2VuZXJhdGUgYSBoYXNoY29kZSBhbmQgZXF1YWxzIGltcGxlbWVudGF0aW9uIGZvciBjbGFzc2VzLlxuIgorICAgICIgICAgdW5pb246ICAgICAgICAgICBVc2UgbmV3IHVuaW9uIHR5cGluZywgd2hpY2ggaW5jbHVkZXMgYSBzdGF0aWMgcmVhZCBmdW5jdGlvbiBmb3IgdW5pb24gIgorICAgICJ0eXBlcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjUxOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDc0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnNldDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBEIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIGdlbmVyYXRlXyooKSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSB0aGUgYmFzZSBjbGFzcyB0byBlbWl0IGNvZGUgZm9yIHRoZQorICogZ2l2ZW4gZW50aXR5LCBwcmludF8qKCkgZnVuY3Rpb25zIHdyaXRlIGEgcGllY2Ugb2YgY29kZSB0byB0aGUgcGFzc2VkCisgKiBzdHJlYW0sIGFuZCByZW5kZXJfKigpIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBEIHJlcHJlc2VudGF0aW9uIG9mCisgKiB0aGUgcGFzc2VkIGVudGl0eS4KKyAqLworY2xhc3MgdF9kX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2RfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBkOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kIjsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSBvdmVycmlkZSB7CisgICAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgICAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAgIHN0cmluZyBkaXIgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZCIpOworICAgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOworICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgICB9CisgICAgaWYgKCFkaXIuZW1wdHkoKSkgeworICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIH0KKworICAgIHBhY2thZ2VfZGlyXyA9IHN1YmRpciArICIvIjsKKworICAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMuZCI7CisgICAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgICAvLyBQcmludCBoZWFkZXIKKyAgICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgPDwgIl90eXBlczsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIHByaW50X2RlZmF1bHRfaW1wb3J0cyhmX3R5cGVzXyk7CisKKyAgICAvLyBJbmNsdWRlIHR5cGUgbW9kdWxlcyBmcm9tIG90aGVyIGltcG9ydGVkIHByb2dyYW1zLgorICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgICAgZm9yIChhdXRvIGluY2x1ZGUgOiBpbmNsdWRlcykgeworICAgICAgZl90eXBlc18gPDwgInB1YmxpYyBpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqaW5jbHVkZSkgPDwgaW5jbHVkZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIl90eXBlczsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5jbHVkZXMuZW1wdHkoKSkKKyAgICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgIH0KKworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIG92ZXJyaWRlIHsKKyAgICAvLyBDbG9zZSBvdXRwdXQgZmlsZQorICAgIGZfdHlwZXNfLmNsb3NlKCk7CisgIH0KKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSBvdmVycmlkZSB7CisgICAgaWYgKCFjb25zdHMuZW1wdHkoKSkgeworICAgICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBwcm9ncmFtX25hbWVfICsgIl9jb25zdGFudHMuZCI7CisgICAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICAgICAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgICAgICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgICA8PCAiX2NvbnN0YW50czsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfY29uc3RzKTsKKworICAgICAgZl9jb25zdHMgPDwgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXM7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICB0aGlzLT5lbWl0X2RvYygqY19pdGVyLCBmX2NvbnN0cyk7CisgICAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIGluZGVudChmX2NvbnN0cykgPDwgImltbXV0YWJsZSgiIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIikgIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBmX2NvbnN0cyA8PCBlbmRsIDw8ICJzdGF0aWMgdGhpcygpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfY29uc3RzIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICBpbmRlbnQoZl9jb25zdHMpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKKyAgICAgICAgaWYgKCFpc19pbW11dGFibGVfdHlwZSh0eXBlKSkgeworICAgICAgICAgIGZfY29uc3RzIDw8ICJjYXN0KGltbXV0YWJsZSgiIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIikpICI7CisgICAgICAgIH0KKyAgICAgICAgZl9jb25zdHMgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIG92ZXJyaWRlIHsKKyAgICB0aGlzLT5lbWl0X2RvYyh0dHlwZWRlZiwgZl90eXBlc18pOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJhbGlhcyAiIDw8IHJlbmRlcl90eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICIgIgorICAgICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIG92ZXJyaWRlIHsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKworICAgIHRoaXMtPmVtaXRfZG9jKHRlbnVtLCBmX3R5cGVzXyk7CisgICAgc3RyaW5nIGVudW1fbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJlbnVtICIgPDwgZW51bV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHRoaXMtPmVtaXRfZG9jKCpjX2l0ZXIsIGZfdHlwZXNfKTsKKyAgICAgIGluZGVudChmX3R5cGVzXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgZl90eXBlc18gPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA8PCAiLCI7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIG92ZXJyaWRlIHsKKyAgICBwcmludF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworICB9CisKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSBvdmVycmlkZSB7CisgICAgcHJpbnRfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7CisgIH0KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgb3ZlcnJpZGUgeworICAgIHN0cmluZyBzdmNfbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworCisgICAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCisgICAgc3RyaW5nIGZfc2VydmljZW5hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzdmNfbmFtZSArICIuZCI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2U7CisgICAgZl9zZXJ2aWNlLm9wZW4oZl9zZXJ2aWNlbmFtZS5jX3N0cigpKTsKKyAgICBmX3NlcnZpY2UgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCpwcm9ncmFtXykgPDwgc3ZjX25hbWUgPDwgIjsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIHByaW50X2RlZmF1bHRfaW1wb3J0cyhmX3NlcnZpY2UpOworCisgICAgZl9zZXJ2aWNlIDw8ICJpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzOyIgPDwgZW5kbDsKKworICAgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7CisgICAgICBmX3NlcnZpY2UgPDwgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCooZXh0ZW5kc19zZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSkKKyAgICAgICAgICAgICAgICA8PCBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlIDw8IGVuZGw7CisKKyAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICAgIGlmICh0c2VydmljZS0+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+aXNfZW51bSgpOworICB9CisKKyAgLyoKKyAgICogRmlsZSBzdHJlYW1zLCBzdG9yZWQgaGVyZSB0byBhdm9pZCBwYXNzaW5nIHRoZW0gYXMgcGFyYW1ldGVycyB0byBldmVyeQorICAgKiBmdW5jdGlvbi4KKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWFkZXJfOworCisgIHN0cmluZyBwYWNrYWdlX2Rpcl87Cit9OworCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGQsICJEIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kYXJ0X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmJiOWU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kYXJ0X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI1MTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsMiA9ICJcblxuIjsKKworLyoqCisgKiBVc2UgdGhlIGN1cnJlbnQgVGhyaWZ0IHZlcnNpb24gZm9yIHN0YXRpYyBsaWJyYXJpZXMuICBXaGVuIHJlbGVhc2luZywgdXBkYXRlCisgKiB0aGUgdmVyc2lvbiBpbiB0aGVzZSBmaWxlcy4KKyAqIC0gbGliL2RhcnQvcHVic3BlYy55YW1sCisgKiAtIHRlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWwKKyAqIC0gdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sCisgKiAtIHR1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvcHVic3BlYy55YW1sCisgKiAtIHR1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbAorICogU2VlIGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG9jcy9jb21taXR0ZXJzL0hvd1RvVmVyc2lvbgorICovCitzdGF0aWMgY29uc3Qgc3RyaW5nIGRhcnRfdGhyaWZ0X3ZlcnNpb24gPSBUSFJJRlRfVkVSU0lPTjsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpOworCisvKioKKyAqIERhcnQgY29kZSBnZW5lcmF0b3IKKyAqCisgKi8KK2NsYXNzIHRfZGFydF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9kYXJ0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBsaWJyYXJ5X25hbWVfID0gIiI7CisgICAgbGlicmFyeV9wcmVmaXhfID0gIiI7CisgICAgcGFja2FnZV9wcmVmaXhfID0gIiI7CisgICAgcHVic3BlY19saWJfID0gIiI7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibGlicmFyeV9uYW1lIikgPT0gMCkgeworICAgICAgICBsaWJyYXJ5X25hbWVfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImxpYnJhcnlfcHJlZml4IikgPT0gMCkgeworICAgICAgICBsaWJyYXJ5X3ByZWZpeF8gPSAoaXRlci0+c2Vjb25kKSArICIuIjsKKyAgICAgICAgcGFja2FnZV9wcmVmaXhfID0gcmVwbGFjZV9hbGwobGlicmFyeV9wcmVmaXhfLCAiLiIsICIvIik7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInB1YnNwZWNfbGliIikgPT0gMCkgeworICAgICAgICBwdWJzcGVjX2xpYl8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBkYXJ0OiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kYXJ0IjsKKyAgfQorCisgIHZvaWQgc2NvcGVfdXAoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHByZWZpeD0iICIpIHsKKyAgICBvdXQgPDwgcHJlZml4IDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgdm9pZCBzY29wZV9kb3duKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBwb3N0Zml4PWVuZGwpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBwb3N0Zml4OworICB9CisKKyAgc3RyaW5nIHJlcGxhY2VfYWxsKHN0cmluZyBjb250ZW50cywgc3RyaW5nIHNlYXJjaCwgc3RyaW5nIHJlcGwpIHsKKyAgICBzdHJpbmcgc3RyKGNvbnRlbnRzKTsKKworICAgIHNpemVfdCBzbGVuID0gc2VhcmNoLmxlbmd0aCgpOworICAgIHNpemVfdCBybGVuID0gcmVwbC5sZW5ndGgoKTsKKyAgICBzaXplX3QgaW5jciA9IChybGVuID4gMCkgPyBybGVuIDogMTsKKworICAgIGlmIChzbGVuID4gMCkgeworICAgICAgc2l6ZV90IGZvdW5kID0gc3RyLmZpbmQoc2VhcmNoKTsKKyAgICAgIHdoaWxlICgoZm91bmQgIT0gc3RyaW5nOjpucG9zKSAmJiAoZm91bmQgPCBzdHIubGVuZ3RoKCkpKSB7CisgICAgICAgIHN0ci5yZXBsYWNlKGZvdW5kLCBzbGVuLCByZXBsKTsKKyAgICAgICAgZm91bmQgPSBzdHIuZmluZChzZWFyY2gsIGZvdW5kICsgaW5jcik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpIG92ZXJyaWRlOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIHZvaWQgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoc3RyaW5nIGZpbGVfbmFtZSwgc3RyaW5nIGNsYXNzX25hbWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9saWJyYXJ5KCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9wdWJzcGVjKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgb3ZlcnJpZGU7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIG92ZXJyaWRlOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXhwb3J0X2ZpbGVfbmFtZSA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyBnZXRfZGFydF90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGluaXRfdmFsdWUodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZXRfbWVtYmVyX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9hcmdzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9yZXN1bHRfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2ZpbGVfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NvbnN0YW50c19jbGFzc19uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBmaW5kX2xpYnJhcnlfbmFtZSh0X3Byb2dyYW0qIHByb2dyYW0pOworICBzdGQ6OnN0cmluZyBkYXJ0X2xpYnJhcnkoc3RyaW5nIGZpbGVfbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHNlcnZpY2VfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBkYXJ0X3RocmlmdF9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF90dHlwZV9jbGFzc19uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCisgICAgICAgICAgIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKKyAgfQorCisgIHZlY3RvcjxzdGQ6OnN0cmluZz4gc3BsaXQoY29uc3Qgc3RyaW5nJiBzLCBjaGFyIGRlbGltKSB7CisgICAgdmVjdG9yPHN0ZDo6c3RyaW5nPiBlbGVtczsKKyAgICBzdHJpbmdzdHJlYW0gc3Mocyk7CisgICAgc3RyaW5nIGl0ZW07CisgICAgd2hpbGUgKGdldGxpbmUoc3MsIGl0ZW0sIGRlbGltKSkgeworICAgICAgZWxlbXMucHVzaF9iYWNrKGl0ZW0pOworICAgIH0KKyAgICByZXR1cm4gZWxlbXM7CisgIH0KKworICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworCitwcml2YXRlOgorICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgc3RkOjpzdHJpbmcgbGlicmFyeV9uYW1lXzsKKyAgc3RkOjpzdHJpbmcgbGlicmFyeV9wcmVmaXhfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX3ByZWZpeF87CisgIHN0ZDo6c3RyaW5nIHB1YnNwZWNfbGliXzsKKworICBzdGQ6OnN0cmluZyBiYXNlX2Rpcl87CisgIHN0ZDo6c3RyaW5nIHNyY19kaXJfOworICBzdGQ6OnN0cmluZyBsaWJyYXJ5X2V4cG9ydHNfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBpZiAobGlicmFyeV9uYW1lXy5lbXB0eSgpKSB7CisgICAgbGlicmFyeV9uYW1lXyA9IGZpbmRfbGlicmFyeV9uYW1lKHByb2dyYW1fKTsKKyAgfQorCisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgbGlicmFyeV9uYW1lXzsKKyAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICBiYXNlX2Rpcl8gPSBzdWJkaXI7CisKKyAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgc3ViZGlyICs9ICIvbGliIjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgc3ViZGlyICs9ICIvc3JjIjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgc3JjX2Rpcl8gPSBzdWJkaXI7CisgIH0gZWxzZSB7CisgICAgc3JjX2Rpcl8gPSBiYXNlX2Rpcl87CisgIH0KK30KKworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmZpbmRfbGlicmFyeV9uYW1lKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICBzdHJpbmcgbmFtZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImRhcnQiKTsKKyAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgIG5hbWUgPSBwcm9ncmFtLT5nZXRfbmFtZSgpOworICB9CisgIG5hbWUgPSByZXBsYWNlX2FsbChuYW1lLCAiLiIsICJfIik7CisgIG5hbWUgPSByZXBsYWNlX2FsbChuYW1lLCAiLSIsICJfIik7CisgIHJldHVybiBuYW1lOworfQorCisvKioKKyAqIFRoZSBEYXJ0IGxpYnJhcnkKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgbGlicmFyeSwgZS5nLiAibGlicmFyeSBteXNlcnZpY2U7IgorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6ZGFydF9saWJyYXJ5KHN0cmluZyBmaWxlX25hbWUpIHsKKyAgc3RyaW5nIG91dCA9ICJsaWJyYXJ5ICIgKyBsaWJyYXJ5X3ByZWZpeF8gKyBsaWJyYXJ5X25hbWVfOworICBpZiAoIWZpbGVfbmFtZS5lbXB0eSgpKSB7CisgICAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgICBvdXQgKz0gIi5zcmMuIiArIGZpbGVfbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0ICs9ICIuIiArIGZpbGVfbmFtZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG91dCArICI7XG4iOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIGZvciBzZXJ2aWNlcworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBzZXJ2aWNlcworICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6c2VydmljZV9pbXBvcnRzKCkgeworICByZXR1cm4gImltcG9ydCAnZGFydDphc3luYyc7IiArIGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGRhcnQgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0CisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpkYXJ0X3RocmlmdF9pbXBvcnRzKCkgeworICBzdHJpbmcgaW1wb3J0cyA9ICJpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7IiArIGVuZGwgKworICAgICAgICAgICAgICAgICAgICJpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsiICsgZW5kbDsKKworICAvLyBhZGQgaW1wb3J0IGZvciB0aGlzIGxpYnJhcnkKKyAgaWYgKHBhY2thZ2VfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgaW1wb3J0cyArPSAiaW1wb3J0ICdwYWNrYWdlOiIgKyBsaWJyYXJ5X25hbWVfICsgIi8iICsgbGlicmFyeV9uYW1lXyArICIuZGFydCc7IiArIGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW1wb3J0cyArPSAiaW1wb3J0ICdwYWNrYWdlOiIgKyBwYWNrYWdlX3ByZWZpeF8gKyBsaWJyYXJ5X25hbWVfICsgIi5kYXJ0JzsiICsgZW5kbDsKKyAgfQorCisgIC8vIGFkZCBpbXBvcnRzIGZvciBpbmNsdWRlZCB0aHJpZnQgZmlsZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChhdXRvIGluY2x1ZGUgOiBpbmNsdWRlcykgeworICAgIHN0cmluZyBpbmNsdWRlX25hbWUgPSBmaW5kX2xpYnJhcnlfbmFtZShpbmNsdWRlKTsKKyAgICBzdHJpbmcgbmFtZWRfaW1wb3J0ID0gInRfIiArIGluY2x1ZGVfbmFtZTsKKyAgICBpZiAocGFja2FnZV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICAgIGltcG9ydHMgKz0gImltcG9ydCAncGFja2FnZToiICsgaW5jbHVkZV9uYW1lICsgIi8iICsgaW5jbHVkZV9uYW1lICsgIi5kYXJ0JyBhcyAiICsgbmFtZWRfaW1wb3J0ICsgIjsiICsgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW1wb3J0cyArPSAiaW1wb3J0ICdwYWNrYWdlOiIgKyBwYWNrYWdlX3ByZWZpeF8gKyBpbmNsdWRlX25hbWUgKyAiLmRhcnQnIGFzICIgKyBuYW1lZF9pbXBvcnQgKyAiOyIgKyBlbmRsOworICAgIH0KKyAgfQorCisgIHJldHVybiBpbXBvcnRzOworfQorCisvKioKKyAqIE5vdCB1c2VkCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBnZW5lcmF0ZV9kYXJ0X2xpYnJhcnkoKTsKKworICBpZiAobGlicmFyeV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBnZW5lcmF0ZV9kYXJ0X3B1YnNwZWMoKTsKKyAgfQorfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfbGlicmFyeSgpIHsKKyAgc3RyaW5nIGZfbGlicmFyeV9uYW1lOworICBpZiAobGlicmFyeV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBmX2xpYnJhcnlfbmFtZSA9IGJhc2VfZGlyXyArICIvbGliLyIgKyBsaWJyYXJ5X25hbWVfICsgIi5kYXJ0IjsKKyAgfSBlbHNlIHsKKyAgICBmX2xpYnJhcnlfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyBsaWJyYXJ5X25hbWVfICsgIi5kYXJ0IjsKKyAgfQorCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9saWJyYXJ5OworICBmX2xpYnJhcnkub3BlbihmX2xpYnJhcnlfbmFtZS5jX3N0cigpKTsKKworICBmX2xpYnJhcnkgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl9saWJyYXJ5IDw8ICJsaWJyYXJ5ICIgPDwgbGlicmFyeV9wcmVmaXhfIDw8IGxpYnJhcnlfbmFtZV8gPDwgIjsiIDw8IGVuZGwyOworICBmX2xpYnJhcnkgPDwgbGlicmFyeV9leHBvcnRzXzsKKworICBmX2xpYnJhcnkuY2xvc2UoKTsKK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpleHBvcnRfY2xhc3NfdG9fbGlicmFyeShzdHJpbmcgZmlsZV9uYW1lLCBzdHJpbmcgY2xhc3NfbmFtZSkgeworICBzdHJpbmcgc3ViZGlyOworICBpZiAobGlicmFyeV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBzdWJkaXIgPSAic3JjIjsKKyAgfSBlbHNlIHsKKyAgICBzdWJkaXIgPSBsaWJyYXJ5X25hbWVfOworICB9CisgIGxpYnJhcnlfZXhwb3J0c18gKz0gImV4cG9ydCAnIiArIHN1YmRpciArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCcgc2hvdyAiICsgY2xhc3NfbmFtZSArICI7IiArIGVuZGw7Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9wdWJzcGVjKCkgeworICBzdHJpbmcgZl9wdWJzcGVjX25hbWUgPSBiYXNlX2Rpcl8gKyAiL3B1YnNwZWMueWFtbCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9wdWJzcGVjOworICBmX3B1YnNwZWMub3BlbihmX3B1YnNwZWNfbmFtZS5jX3N0cigpKTsKKworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAibmFtZTogIiA8PCBsaWJyYXJ5X25hbWVfIDw8IGVuZGw7CisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJ2ZXJzaW9uOiAwLjAuMSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfcHVic3BlYykgPDwgImRlc2NyaXB0aW9uOiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciIgPDwgZW5kbDsKKyAgZl9wdWJzcGVjIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfcHVic3BlYykgPDwgImVudmlyb25tZW50OiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJzZGs6ICc+PTEuMjQuMyA8My4wLjAnIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3B1YnNwZWMgPDwgZW5kbDsKKworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAiZGVwZW5kZW5jaWVzOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHB1YnNwZWNfbGliXy5lbXB0eSgpKSB7CisgICAgLy8gZGVmYXVsdCB0byByZWxhdGl2ZSBwYXRoIHdpdGhpbiB3b3JraW5nIGRpcmVjdG9yeSwgd2hpY2ggd29ya3MgZm9yIHRlc3RzCisgICAgaW5kZW50KGZfcHVic3BlYykgPDwgInRocmlmdDogICMgXiIgPDwgZGFydF90aHJpZnRfdmVyc2lvbiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3B1YnNwZWMpIDw8ICJwYXRoOiAuLi8uLi8uLi8uLi9saWIvZGFydCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXMgPSBzcGxpdChwdWJzcGVjX2xpYl8sICd8Jyk7CisgICAgZm9yIChjb25zdCBhdXRvICYgbGluZSA6IGxpbmVzKSB7CisgICAgICBpbmRlbnQoZl9wdWJzcGVjKSA8PCBsaW5lIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gYWRkIGluY2x1ZGVkIHRocmlmdCBmaWxlcyBhcyBkZXBlbmRlbmNpZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChhdXRvIGluY2x1ZGUgOiBpbmNsdWRlcykgeworICAgIHN0cmluZyBpbmNsdWRlX25hbWUgPSBmaW5kX2xpYnJhcnlfbmFtZShpbmNsdWRlKTsKKyAgICBpbmRlbnQoZl9wdWJzcGVjKSA8PCBpbmNsdWRlX25hbWUgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfcHVic3BlYykgPDwgInBhdGg6IC4uLyIgPDwgaW5jbHVkZV9uYW1lIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfcHVic3BlYyA8PCBlbmRsOworCisgIGZfcHVic3BlYy5jbG9zZSgpOworfQorCisvKioKKyAqIE5vdCB1c2VkCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZmlsZV9uYW1lID0gZ2V0X2ZpbGVfbmFtZSh0ZW51bS0+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+Z2V0X2Jhc2UoKTsKKworICAvLyBJbml0aWFsaXplIGJvb2xzLCBpbnRzLCBhbmQgZG91YmxlcyB3aXRoIHNhbmUgZGVmYXVsdHMKKyAgc3RyaW5nIHJlc3VsdDsKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmVzdWx0ID0gIiA9IGZhbHNlIjsKKyAgICBicmVhazsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXN1bHQgPSAiID0gMCI7CisgICAgYnJlYWs7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJlc3VsdCA9ICIgPSAwLjAiOworICAgIGJyZWFrOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIHJlc3VsdCA9ICIiOworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisgIHJldHVybiBuYW1lOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfbWVtYmVyX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBuYW1lWzBdID0gdG9sb3dlcihuYW1lWzBdKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9hcmdzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICByZXR1cm4gbmFtZSArICJfYXJncyI7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9yZXN1bHRfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIHJldHVybiBuYW1lICsgIl9yZXN1bHQiOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfZmlsZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgLy8gZS5nLiBjaGFuZ2UgQVBJRm9yRmlsZUlPIHRvIGFwaV9mb3JfZmlsZV9pbworCisgIHN0cmluZyByZXQ7CisgIGNvbnN0IGNoYXIqIHRtcCA9IG5hbWUuY19zdHIoKTsKKyAgYm9vbCBpc19wcmV2X2xjID0gdHJ1ZTsKKyAgYm9vbCBpc19jdXJyZW50X2xjID0gdG1wWzBdID09IHRvbG93ZXIodG1wWzBdKTsKKyAgYm9vbCBpc19uZXh0X2xjID0gZmFsc2U7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBjaGFyIGxjID0gdG9sb3dlcih0bXBbaV0pOworCisgICAgaWYgKGkgPT0gbmFtZS5sZW5ndGgoKSAtIDEpIHsKKyAgICAgIGlzX25leHRfbGMgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaXNfbmV4dF9sYyA9ICh0bXBbaSsxXSA9PSB0b2xvd2VyKHRtcFtpKzFdKSk7CisgICAgfQorCisgICAgaWYgKGkgIT0gMCAmJiAhaXNfY3VycmVudF9sYyAmJiAoaXNfcHJldl9sYyB8fCBpc19uZXh0X2xjKSkgeworICAgICAgcmV0ICs9ICJfIjsKKyAgICB9CisgICAgcmV0ICs9IGxjOworCisgICAgaXNfcHJldl9sYyA9IGlzX2N1cnJlbnRfbGM7CisgICAgaXNfY3VycmVudF9sYyA9IGlzX25leHRfbGM7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfY29uc3RhbnRzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICAvLyBlLmcuIGNoYW5nZSBteV9ncmVhdF9tb2RlbCB0byBNeUdyZWF0TW9kZWxDb25zdGFudHMKKyAgc3RyaW5nIHJldDsKKyAgY29uc3QgY2hhciogdG1wID0gbmFtZS5jX3N0cigpOworICBib29sIGlzX3ByZXZfdW5kZXJzY29yZSA9IHRydWU7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBpZiAodG1wW2ldID09ICdfJykgeworICAgICAgaXNfcHJldl91bmRlcnNjb3JlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGlzX3ByZXZfdW5kZXJzY29yZSkgeworICAgICAgICByZXQgKz0gdG91cHBlcih0bXBbaV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ICs9IHRtcFtpXTsKKyAgICAgIH0KKworICAgICAgaXNfcHJldl91bmRlcnNjb3JlID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldCArICJDb25zdGFudHMiOworfQorCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOworICBmb3IgKGNoYXIgY2hhcmFjdGVyIDogbmFtZSkgeworICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgeworICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7CisgICAgfQorICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOworCisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOworICB9CisKKyAgcmV0dXJuIGNvbnN0YW50X25hbWU7Cit9CisKKy8qKgorICogRW1pdHMgYSBkb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIiLCAiLy8vICIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBkb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShwLT5nZXRfbmFtZSgpKTsKKyAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IGZpZWxkX25hbWU7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9CisgICAgfQorICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIvLy8gIiwgc3Muc3RyKCksICIiKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZF9uYW1lKTsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF90dHlwZV9jbGFzc19uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHByb2dyYW1fID09IHR0eXBlLT5nZXRfcHJvZ3JhbSgpKSB7CisgICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIHN0cmluZyBuYW1lZF9pbXBvcnQgPSAidF8iICsgZmluZF9saWJyYXJ5X25hbWUodHR5cGUtPmdldF9wcm9ncmFtKCkpOworICAgIHJldHVybiBuYW1lZF9pbXBvcnQgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGRhcnQsCisgICAgIkRhcnQiLAorICAgICIgICAgbGlicmFyeV9uYW1lOiAgICBPcHRpb25hbCBvdmVycmlkZSBmb3IgbGlicmFyeSBuYW1lLlxuIgorICAgICIgICAgbGlicmFyeV9wcmVmaXg6ICBHZW5lcmF0ZSBjb2RlIHRoYXQgY2FuIGJlIHVzZWQgd2l0aGluIGFuIGV4aXN0aW5nIGxpYnJhcnkuXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFVzZSBhIGRvdC1zZXBhcmF0ZWQgc3RyaW5nLCBlLmcuIFwibXlfcGFyZW50X2xpYi5zcmMuZ2VuXCJcbiIKKyAgICAiICAgIHB1YnNwZWNfbGliOiAgICAgT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIHRocmlmdCBsaWIgZGVwZW5kZW5jeSBpbiBwdWJzcGVjLnlhbWwsXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIGUuZy4gXCJ0aHJpZnQ6IDAueC54XCIuICBVc2UgYSBwaXBlIGRlbGltaXRlciB0byBzZXBhcmF0ZSBsaW5lcyxcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgZS5nLiBcInRocmlmdDp8ICBnaXQ6fCAgICB1cmw6IGdpdEBmb28uY29tXCJcbiIKKykKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDUxMjBlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNDAwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCitjbGFzcyB0X2RlbHBoaV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9kZWxwaGlfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgaW5kZW50X2ltcGxfID0gMDsKKyAgICBoYXNfZm9yd2FyZCA9IGZhbHNlOworICAgIGhhc19lbnVtID0gZmFsc2U7CisgICAgaGFzX2NvbnN0ID0gZmFsc2U7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGFuc2lzdHJfYmluYXJ5XyA9IGZhbHNlOworICAgIHJlZ2lzdGVyX3R5cGVzXyA9IGZhbHNlOworICAgIGNvbnN0cHJlZml4XyA9IGZhbHNlOworICAgIGV2ZW50c18gPSBmYWxzZTsKKyAgICB4bWxkb2NfID0gZmFsc2U7CisgICAgYXN5bmNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYW5zaXN0cl9iaW5hcnkiKSA9PSAwKSB7CisgICAgICAgIGFuc2lzdHJfYmluYXJ5XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJlZ2lzdGVyX3R5cGVzIikgPT0gMCkgeworICAgICAgICByZWdpc3Rlcl90eXBlc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJjb25zdHByZWZpeCIpID09IDApIHsKKyAgICAgICAgY29uc3RwcmVmaXhfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZXZlbnRzIikgPT0gMCkgeworICAgICAgICBldmVudHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgieG1sZG9jIikgPT0gMCkgeworICAgICAgICB4bWxkb2NfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYXN5bmMiKSA9PSAwKSB7CisgICAgICAgIGFzeW5jXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZGVscGhpOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kZWxwaGkiOworICAgIGVzY2FwZV8uY2xlYXIoKTsKKyAgICBlc2NhcGVfWydcJyddID0gIicnIjsKKyAgfQorCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSBvdmVycmlkZTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgaXNfeGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5X3dyaXRlcl8ob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJ1Y3RfaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2NsZWFyX3VuaW9uX3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KTsKKworICB2b2lkIGFkZF9kZWxwaGlfdXNlc19saXN0KHN0cmluZyB1bml0bmFtZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfY3JlYXRlX2V4Y2VwdGlvbl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgYm9vbCBjb25zdF9uZWVkc192YXIodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBwcmludF9jb25zdF9wcm9wKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgcHJpbnRfcHJpdmF0ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgaW5pdGlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgZmluYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX25tID0gIiIpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIHByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfbm0gPSAiIik7CisgIHN0ZDo6c3RyaW5nIG1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7CisgIHZvaWQgcHJpbnRfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfZnVuYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSwgYm9vbCBmb3JfYXN5bmMpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworCisgIHZvaWQgZGVscGhpX3R5cGVfdXNpbmdzKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKyAgc3RkOjpzdHJpbmcgZGVscGhpX3RocmlmdF91c2luZ3MoKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9jbHMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9ub19wb3N0Zml4ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX2ZhY3RvcnkgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBub3JtYWxpemVfY2xzbm0oc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9ub19jaGVja19rZXl3b3JkID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2RlbHBoaV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisgIHN0ZDo6c3RyaW5nIGlucHV0X2FyZ19wcmVmaXgodF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yX2FzeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZnVsbF9jbHMgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBjdXJyZW50X2luZGVudCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX3BhcmFtX25hbWUoc3RyaW5nIG5hbWUpOworCisgIHZvaWQgd3JpdGVfZW51bShzdGQ6OnN0cmluZyBsaW5lKTsKKyAgdm9pZCB3cml0ZV9mb3J3YXJkX2RlY3Ioc3RkOjpzdHJpbmcgbGluZSk7CisgIHZvaWQgd3JpdGVfY29uc3Qoc3RkOjpzdHJpbmcgbGluZSk7CisgIHZvaWQgd3JpdGVfc3RydWN0KHN0ZDo6c3RyaW5nIGxpbmUpOworICB2b2lkIHdyaXRlX3NlcnZpY2Uoc3RkOjpzdHJpbmcgbGluZSk7CisKKyAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiKCoqXG4iKSArICIgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICAgKyAiICpcbiIgKyAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgorICAgICAgICAgICArICIgKilcbiI7CisgIH0KKworICBzdHJpbmcgcmVwbGFjZV9hbGwoc3RyaW5nIGNvbnRlbnRzLCBzdHJpbmcgc2VhcmNoLCBzdHJpbmcgcmVwbGFjZSk7CisgIHN0cmluZyB4bWxfZW5jb2RlKHN0cmluZyBjb250ZW50cyk7CisgIHN0cmluZyB4bWxkb2NfZW5jb2RlKHN0cmluZyBjb250ZW50cyk7CisgIHN0cmluZyB4bWxhdHRyaWJfZW5jb2RlKHN0cmluZyBjb250ZW50cyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9uYW1lXzsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfZm9yd2FyZF9kZWNyOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19lbnVtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19jb25zdDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc3RydWN0OworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zZXJ2aWNlOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19jb25zdF9pbXBsOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zdHJ1Y3RfaW1wbDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc2VydmljZV9pbXBsOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc190eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc190eXBlX2ZhY3RvcnlfZnVuY3M7CisgIGJvb2wgaGFzX2ZvcndhcmQ7CisgIGJvb2wgaGFzX2VudW07CisgIGJvb2wgaGFzX2NvbnN0OworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gZGVscGhpX2tleXdvcmRzOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvbjsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gdHlwZXNfa25vd247CisgIHN0ZDo6bGlzdDx0X3R5cGVkZWYqPiB0eXBlZGVmc19wZW5kaW5nOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdXNlc19saXN0OworICB2b2lkIGNyZWF0ZV9rZXl3b3JkcygpOworICBib29sIGZpbmRfa2V5d29yZChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiYga2V5d29yZF9tYXAsIHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBub3JtYWxpemVfbmFtZShzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfbWV0aG9kID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9leGNlcHRpb25fbWV0aG9kID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBlbXB0eV92YWx1ZSh0X3R5cGUqIHR5cGUpOworICBib29sIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCBhZGRfZGVmaW5lZF90eXBlKHRfdHlwZSogdHR5cGUpOworICB2b2lkIGluaXRfa25vd25fdHlwZXNfbGlzdCgpOworICBib29sIGlzX3ZvaWQodF90eXBlKiB0eXBlKTsKKyAgaW50IGluZGVudF9pbXBsXzsKKyAgYm9vbCBhbnNpc3RyX2JpbmFyeV87CisgIGJvb2wgcmVnaXN0ZXJfdHlwZXNfOworICBib29sIGNvbnN0cHJlZml4XzsKKyAgYm9vbCBldmVudHNfOworICBib29sIHhtbGRvY187CisgIGJvb2wgYXN5bmNfOworICB2b2lkIGluZGVudF91cF9pbXBsKCkgeyArK2luZGVudF9pbXBsXzsgfTsKKyAgdm9pZCBpbmRlbnRfZG93bl9pbXBsKCkgeyAtLWluZGVudF9pbXBsXzsgfTsKKyAgc3RkOjpzdHJpbmcgaW5kZW50X2ltcGwoKSB7CisgICAgc3RkOjpzdHJpbmcgaW5kID0gIiI7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGluZGVudF9pbXBsXzsgKytpKSB7CisgICAgICBpbmQgKz0gIiAgIjsKKyAgICB9CisgICAgcmV0dXJuIGluZDsKKyAgfTsKKyAgc3RkOjpvc3RyZWFtJiBpbmRlbnRfaW1wbChzdGQ6Om9zdHJlYW0mIG9zKSB7IHJldHVybiBvcyA8PCBpbmRlbnRfaW1wbCgpOyB9OworfTsKKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cmVwbGFjZV9hbGwoc3RyaW5nIGNvbnRlbnRzLCBzdHJpbmcgc2VhcmNoLCBzdHJpbmcgcmVwbCkgeworICBzdHJpbmcgc3RyKGNvbnRlbnRzKTsKKworICBzaXplX3Qgc2xlbiA9IHNlYXJjaC5sZW5ndGgoKTsKKyAgc2l6ZV90IHJsZW4gPSByZXBsLmxlbmd0aCgpOworICBzaXplX3QgaW5jciA9IChybGVuID4gMCkgPyBybGVuIDogMTsKKworICBpZiAoc2xlbiA+IDApIHsKKyAgICBzaXplX3QgZm91bmQgPSBzdHIuZmluZChzZWFyY2gpOworICAgIHdoaWxlICgoZm91bmQgIT0gc3RyaW5nOjpucG9zKSAmJiAoZm91bmQgPCBzdHIubGVuZ3RoKCkpKSB7CisgICAgICBzdHIucmVwbGFjZShmb3VuZCwgc2xlbiwgcmVwbCk7CisgICAgICBmb3VuZCA9IHN0ci5maW5kKHNlYXJjaCwgZm91bmQgKyBpbmNyKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCisvLyBYTUwgZW5jb2RpbmcKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnhtbF9lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKSB7CisgIHN0cmluZyBzdHIoY29udGVudHMpOworCisgIC8vIGVzY2FwZSB0aGUgZXNjYXBlCisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIiYiLCAiJmFtcDsiKTsKKworICAvLyBvdGhlciBzdGFuZGFyZCBYTUwgZW50aXRpZXMKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiPCIsICImbHQ7Iik7CisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIj4iLCAiJmd0OyIpOworCisgIHJldHVybiBzdHI7Cit9CisKKy8vIFhNTCBhdHRyaWJ1dGUgZW5jb2RpbmcKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnhtbGF0dHJpYl9lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKSB7CisgIHN0cmluZyBzdHIoeG1sX2VuY29kZShjb250ZW50cykpOworCisgIC8vIG91ciBhdHRyaWJzIGFyZSBlbmNsb3NlZCBpbiAiCisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIlwiIiwgIlxcXCIiKTsKKworICByZXR1cm4gc3RyOworfQorCisvLyBYTUwgZW5jb2RpbmcgZm9yIGRvYyBjb21tZW50cworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6eG1sZG9jX2VuY29kZShzdHJpbmcgY29udGVudHMpIHsKKyAgc3RyaW5nIHN0cih4bWxfZW5jb2RlKGNvbnRlbnRzKSk7CisKKyAgLy8gWE1MRG9jIHNwZWNpZmljOiBjb252ZXJ0IGxpbmVicmVha3MgaW50byA8cGFyYT5ncmFwaHM8L3BhcmE+CisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIlxyXG4iLCAiXHIiKTsKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXG4iLCAiXHIiKTsKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXHIiLCAiPC9wYXJhPlxuPHBhcmE+Iik7CisKKyAgcmV0dXJuIHN0cjsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgeworICBpZiAoeG1sZG9jXykgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyRSRUdJT04gJ1hNTERvYyd9Ly8vIDxzdW1tYXJ5PlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxwYXJhPiIgKyBjb250ZW50cyArICI8L3BhcmE+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vIDwvc3VtbWFyeT5cbnskRU5EUkVHSU9OfVxuIik7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoeG1sZG9jXykgeworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBzdHJpbmcgY29tYmluZWRfbWVzc2FnZSA9IHhtbGRvY19lbmNvZGUoZmllbGQtPmdldF9kb2MoKSkgKyAiXG48c2VlYWxzbyBjcmVmPVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHhtbGRvY19lbmNvZGUodHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSkgKyAiXCIvPiI7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkgJiYgeG1sZG9jXykgeworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChvdXQsIHhtbGRvY19lbmNvZGUodGRvYy0+Z2V0X2RvYygpKSk7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpICYmIHhtbGRvY18pIHsKKyAgICBzdHJpbmdzdHJlYW0gcHM7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBwcyA8PCAiXG48cGFyYW0gbmFtZT1cIiIgPDwgeG1sYXR0cmliX2VuY29kZShwLT5nZXRfbmFtZSgpKSA8PCAiXCI+IjsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyID0gcC0+Z2V0X2RvYygpOworICAgICAgICBzdHIuZXJhc2Uoc3RkOjpyZW1vdmUoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwgJ1xuJyksCisgICAgICAgICAgICAgICAgICBzdHIuZW5kKCkpOyAvLyByZW1vdmUgdGhlIG5ld2xpbmVzIHRoYXQgYXBwZWFyIGZyb20gdGhlIHBhcnNlcgorICAgICAgICBwcyA8PCB4bWxkb2NfZW5jb2RlKHN0cik7CisgICAgICB9CisgICAgICBwcyA8PCAiPC9wYXJhbT4iOworICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInskUkVHSU9OICdYTUxEb2MnfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VtbWFyeT48cGFyYT4iICsgeG1sZG9jX2VuY29kZSh0ZnVuY3Rpb24tPmdldF9kb2MoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI8L3BhcmE+PC9zdW1tYXJ5PiIgKyBwcy5zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyRFTkRSRUdJT059XG4iKTsKKyAgfQorfQorCitib29sIHRfZGVscGhpX2dlbmVyYXRvcjo6ZmluZF9rZXl3b3JkKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+JiBrZXl3b3JkX21hcCwgc3RkOjpzdHJpbmcgbmFtZSkgeworICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxlbiA9IG5hbWUubGVuZ3RoKCk7CisKKyAgaWYgKGxlbiA8PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBubGFzdCA9IG5hbWUuZmluZF9sYXN0X29mKCdfJyk7CisKKyAgaWYgKG5sYXN0ID49IDEpIHsKKyAgICBpZiAobmxhc3QgPT0gKGxlbiAtIDEpKSB7CisgICAgICBzdHJpbmcgbmV3X25hbWUobmFtZSwgMCwgbmxhc3QpOworICAgICAgcmV0dXJuIGZpbmRfa2V5d29yZChrZXl3b3JkX21hcCwgbmV3X25hbWUpOworICAgIH0KKyAgfQorICByZXR1cm4gKGtleXdvcmRfbWFwW25hbWVdID09IDEpOworfQorCitzdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9leGNlcHRpb25fbWV0aG9kKSB7CisgIHN0cmluZyB0bXAobmFtZSk7CisgIHN0ZDo6dHJhbnNmb3JtKHRtcC5iZWdpbigpLCB0bXAuZW5kKCksIHRtcC5iZWdpbigpLCBzdGF0aWNfY2FzdDxpbnQgKCopKGludCk+KHN0ZDo6dG9sb3dlcikpOworCisgIGJvb2wgYl9mb3VuZCA9IGZhbHNlOworCisgIGlmIChmaW5kX2tleXdvcmQoZGVscGhpX2tleXdvcmRzLCB0bXApKSB7CisgICAgYl9mb3VuZCA9IHRydWU7CisgIH0gZWxzZSBpZiAoYl9tZXRob2QgJiYgZmluZF9rZXl3b3JkKGRlbHBoaV9yZXNlcnZlZF9tZXRob2QsIHRtcCkpIHsKKyAgICBiX2ZvdW5kID0gdHJ1ZTsKKyAgfSBlbHNlIGlmIChiX2V4Y2VwdGlvbl9tZXRob2QgJiYgZmluZF9rZXl3b3JkKGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uLCB0bXApKSB7CisgICAgYl9mb3VuZCA9IHRydWU7CisgIH0KKworICBpZiAoYl9mb3VuZCkgeworICAgIHJldHVybiBuYW1lICsgIl8iOworICB9IGVsc2UgeworICAgIHJldHVybiBuYW1lOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjcmVhdGVfa2V5d29yZHMoKSB7CisgIGRlbHBoaV9rZXl3b3Jkc1siYW5kIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImVuZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbnRlcmZhY2UiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicmFpc2UiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidXNlcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhcnJheSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJleGNlcHQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaXMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicmVjb3JkIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInZhciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJleHBvcnRzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImxhYmVsIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInJlcGVhdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ3aGlsZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhc20iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZmlsZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJsaWJyYXJ5Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInJlc291cmNlc3RyaW5nIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIndpdGgiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYmVnaW4iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZmluYWxpemF0aW9uIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm1vZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzZXQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sieG9yIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImNhc2UiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZmluYWxseSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJuaWwiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic2hsIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImNsYXNzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImZvciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJub3QiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic2hyIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImNvbnN0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImZ1bmN0aW9uIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm9iamVjdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzdHJpbmciXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siY29uc3RydWN0b3IiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZ290byJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJvZiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0aGVuIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImRlc3RydWN0b3IiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaWYiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sib3IiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidGhyZWFkdmFyIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImRpc3BpbnRlcmZhY2UiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW1wbGVtZW50YXRpb24iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sib3V0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRvIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImRpdiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwYWNrZWQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidHJ5Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImRvIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImluaGVyaXRlZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwcm9jZWR1cmUiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidHlwZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJkb3dudG8iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW5pdGlhbGl6YXRpb24iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHJvZ3JhbSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ1bml0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImVsc2UiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW5saW5lIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInByb3BlcnR5Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInVudGlsIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInByaXZhdGUiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHJvdGVjdGVkIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInB1YmxpYyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwdWJsaXNoZWQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYXV0b21hdGVkIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImF0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm9uIl0gPSAxOworCisgIC8vIHJlc2VydmVkL3ByZWRlZmluZWQgdmFyaWFibGVzIGFuZCB0eXBlcyAobG93ZXJjYXNlISkKKyAgZGVscGhpX2tleXdvcmRzWyJyZXN1bHQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic3lzdGVtIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInN5c3V0aWxzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRocmlmdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0Ynl0ZXMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidG9iamVjdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0Y2xhc3MiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidGludGVyZmFjZWRvYmplY3QiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYW5zaXN0cmluZyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzdHJpbmciXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYm9vbGVhbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzaG9ydGludCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzbWFsbGludCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbnRlZ2VyIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImludDY0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImRvdWJsZSJdID0gMTsKKworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjcmVhdGUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZyZWUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImluaXRpbnN0YW5jZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xlYW51cGluc3RhbmNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc3R5cGUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzbmFtZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NuYW1laXMiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzcGFyZW50Il0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc2luZm8iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImluc3RhbmNlc2l6ZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiaW5oZXJpdHNmcm9tIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJtZXRob2RhZGRyZXNzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJtZXRob2RuYW1lIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmaWVsZGFkZHJlc3MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGludGVyZmFjZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aW50ZXJmYWNlZW50cnkiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGludGVyZmFjZXRhYmxlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJ1bml0bmFtZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZXF1YWxzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRoYXNoY29kZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsidG9zdHJpbmciXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInNhZmVjYWxsZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJhZnRlcmNvbnN0cnVjdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiYmVmb3JlZGVzdHJ1Y3Rpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImRpc3BhdGNoIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJkZWZhdWx0aGFuZGxlciJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsibmV3aW5zdGFuY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZyZWVpbnN0YW5jZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZGVzdHJveSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsicmVhZCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsid3JpdGUiXSA9IDE7CisKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInNldGlubmVyZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic2V0c3RhY2tpbmZvIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0c3RhY2t0cmFjZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInJhaXNpbmdleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVmbXQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXMiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXNmbXQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVoZWxwIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlZm10aGVscCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZXJlc2hlbHAiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXNmbXRoZWxwIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0YmFzZWV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImJhc2VleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJoZWxwY29udGV4dCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImlubmVyZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsibWVzc2FnZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInN0YWNrdHJhY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzdGFja2luZm8iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJnZXRleGNlcHRpb25zdGFja2luZm9wcm9jIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0c3RhY2tpbmZvc3RyaW5ncHJvYyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNsZWFudXBzdGFja2luZm9wcm9jIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsicmFpc2VvdXRlcmV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInRocm93b3V0ZXJleGNlcHRpb24iXSA9IDE7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjphZGRfZGVscGhpX3VzZXNfbGlzdChzdHJpbmcgdW5pdG5hbWUpIHsKKyAgdmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOworICBib29sIGZvdW5kID0gZmFsc2U7CisgIGZvciAoc19pdGVyID0gdXNlc19saXN0LmJlZ2luKCk7IHNfaXRlciAhPSB1c2VzX2xpc3QuZW5kKCk7ICsrc19pdGVyKSB7CisgICAgaWYgKCgqc19pdGVyKSA9PSB1bml0bmFtZSkgeworICAgICAgZm91bmQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmICghZm91bmQpIHsKKyAgICB1c2VzX2xpc3QucHVzaF9iYWNrKHVuaXRuYW1lKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIGluZGVudF9pbXBsXyA9IDA7CisgIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJkZWxwaGkiKTsKKyAgaGFzX2ZvcndhcmQgPSBmYWxzZTsKKyAgaGFzX2VudW0gPSBmYWxzZTsKKyAgaGFzX2NvbnN0ID0gZmFsc2U7CisgIGNyZWF0ZV9rZXl3b3JkcygpOworCisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJDbGFzc2VzIik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJTeXNVdGlscyIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiR2VuZXJpY3MuQ29sbGVjdGlvbnMiKTsKKyAgaWYoYXN5bmNfKSB7CisgICAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlN5c3RlbS5UaHJlYWRpbmciKTsKKyAgfQorCisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5VdGlscyIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LkNvbGxlY3Rpb25zIik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuUHJvdG9jb2wiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5UcmFuc3BvcnQiKTsKKyAgaWYgKHJlZ2lzdGVyX3R5cGVzXykgeworICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuVHlwZVJlZ2lzdHJ5Iik7CisgIH0KKworICBpbml0X2tub3duX3R5cGVzX2xpc3QoKTsKKworICBzdHJpbmcgdW5pdG5hbWUsIG5zbmFtZTsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChhdXRvIGluY2x1ZGUgOiBpbmNsdWRlcykgeworICAgIHVuaXRuYW1lID0gaW5jbHVkZS0+Z2V0X25hbWUoKTsKKyAgICBuc25hbWUgPSBpbmNsdWRlLT5nZXRfbmFtZXNwYWNlKCJkZWxwaGkiKTsKKyAgICBpZiAoIiIgIT0gbnNuYW1lKSB7CisgICAgICB1bml0bmFtZSA9IG5vcm1hbGl6ZV9uYW1lKG5zbmFtZSk7CisgICAgfQorICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KHVuaXRuYW1lKTsKKyAgfQorCisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIHN0ZDo6c3RyaW5nIHVuaXRuYW1lID0gcHJvZ3JhbV9uYW1lXzsKKyAgaWYgKCIiICE9IG5hbWVzcGFjZV9uYW1lXykgeworICAgIHVuaXRuYW1lID0gbmFtZXNwYWNlX25hbWVfOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXVuaXRuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHVuaXRuYW1lW2ldID09ICcgJykgeworICAgICAgdW5pdG5hbWUucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIHVuaXRuYW1lID0gbm9ybWFsaXplX25hbWUodW5pdG5hbWUpOworICAKKyAgc3RkOjpzdHJpbmcgZl9uYW1lID0gZ2V0X291dF9kaXIoKSArICIvIiArIHVuaXRuYW1lICsgIi5wYXMiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfYWxsOworCisgIGZfYWxsLm9wZW4oZl9uYW1lKTsKKworICBmX2FsbCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKGZfYWxsLCBwcm9ncmFtXyk7CisgIGZfYWxsIDw8ICJ1bml0ICIgPDwgdW5pdG5hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9hbGwgPDwgImludGVyZmFjZSIgPDwgZW5kbCA8PCBlbmRsOworICBmX2FsbCA8PCAidXNlcyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CisgIGZvciAoc19pdGVyID0gdXNlc19saXN0LmJlZ2luKCk7IHNfaXRlciAhPSB1c2VzX2xpc3QuZW5kKCk7ICsrc19pdGVyKSB7CisgICAgaWYgKHNfaXRlciAhPSB1c2VzX2xpc3QuYmVnaW4oKSkgeworICAgICAgZl9hbGwgPDwgIiwiOworICAgICAgZl9hbGwgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KGZfYWxsKSA8PCAqc19pdGVyOworICB9CisKKyAgZl9hbGwgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIHN0cmluZyB0bXBfdW5pdCh1bml0bmFtZSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCl0bXBfdW5pdC5zaXplKCk7IGkrKykgeworICAgIGlmICh0bXBfdW5pdFtpXSA9PSAnLicpIHsKKyAgICAgIHRtcF91bml0LnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICBmX2FsbCA8PCAiY29uc3QiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdAorICAgICAgICAgICAgICAgIDw8ICJfT3B0aW9uX0Fuc2lTdHJfQmluYXJ5ID0gIiA8PCAoYW5zaXN0cl9iaW5hcnlfID8gIlRydWUiIDogIkZhbHNlIikgPDwgIjsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQKKyAgICAgICAgICAgICAgICA8PCAiX09wdGlvbl9SZWdpc3Rlcl9UeXBlcyA9ICIgPDwgKHJlZ2lzdGVyX3R5cGVzXyA/ICJUcnVlIiA6ICJGYWxzZSIpIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0CisgICAgICAgICAgICAgICAgPDwgIl9PcHRpb25fQ29uc3RQcmVmaXggICAgPSAiIDw8IChjb25zdHByZWZpeF8gPyAiVHJ1ZSIgOiAiRmFsc2UiKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQgPDwgIl9PcHRpb25fRXZlbnRzICAgICAgICAgPSAiIDw8IChldmVudHNfID8gIlRydWUiIDogIkZhbHNlIikKKyAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQgPDwgIl9PcHRpb25fWG1sRG9jICAgICAgICAgPSAiIDw8ICh4bWxkb2NfID8gIlRydWUiIDogIkZhbHNlIikKKyAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2FsbCA8PCBlbmRsOworICBmX2FsbCA8PCAidHlwZSIgPDwgZW5kbDsKKyAgaWYgKGhhc19mb3J3YXJkKSB7CisgICAgZl9hbGwgPDwgc19mb3J3YXJkX2RlY3Iuc3RyKCkgPDwgZW5kbDsKKyAgfQorICBpZiAoaGFzX2VudW0pIHsKKyAgICBpbmRlbnQoZl9hbGwpIDw8IGVuZGw7CisgICAgaW5kZW50KGZfYWxsKSA8PCAieyRTQ09QRURFTlVNUyBPTn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCBzX2VudW0uc3RyKCk7CisgICAgaW5kZW50KGZfYWxsKSA8PCAieyRTQ09QRURFTlVNUyBPRkZ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgZl9hbGwgPDwgc19zdHJ1Y3Quc3RyKCk7CisgIGZfYWxsIDw8IHNfc2VydmljZS5zdHIoKTsKKyAgZl9hbGwgPDwgc19jb25zdC5zdHIoKTsKKyAgZl9hbGwgPDwgImltcGxlbWVudGF0aW9uIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfYWxsIDw8IHNfc3RydWN0X2ltcGwuc3RyKCk7CisgIGZfYWxsIDw8IHNfc2VydmljZV9pbXBsLnN0cigpOworICBmX2FsbCA8PCBzX2NvbnN0X2ltcGwuc3RyKCk7CisKKyAgaWYgKHJlZ2lzdGVyX3R5cGVzXykgeworICAgIGZfYWxsIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgIi8vIFR5cGUgZmFjdG9yeSBtZXRob2RzIGFuZCByZWdpc3RyYXRpb24iIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgc190eXBlX2ZhY3RvcnlfZnVuY3Muc3RyKCk7CisgICAgZl9hbGwgPDwgInByb2NlZHVyZSBSZWdpc3RlclR5cGVGYWN0b3JpZXM7IiA8PCBlbmRsOworICAgIGZfYWxsIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCBzX3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24uc3RyKCk7CisgICAgZl9hbGwgPDwgImVuZDsiIDw8IGVuZGw7CisgIH0KKyAgZl9hbGwgPDwgZW5kbDsKKworICBzdHJpbmcgY29uc3RhbnRzX2NsYXNzID0gbWFrZV9jb25zdGFudHNfY2xhc3NuYW1lKCk7CisKKyAgZl9hbGwgPDwgImluaXRpYWxpemF0aW9uIiA8PCBlbmRsOworICBpZiAoaGFzX2NvbnN0KSB7CisgICAgZl9hbGwgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjEuMH0gIC8vIEQyMDEwIiA8PCBlbmRsOworICAgIGZfYWxsIDw8ICIgICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIl9Jbml0aWFsaXplOyIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAieyRJRkVORH0iIDw8IGVuZGw7CisgIH0KKyAgaWYgKHJlZ2lzdGVyX3R5cGVzXykgeworICAgIGZfYWxsIDw8ICIgIFJlZ2lzdGVyVHlwZUZhY3RvcmllczsiIDw8IGVuZGw7CisgIH0KKyAgZl9hbGwgPDwgZW5kbDsKKworICBmX2FsbCA8PCAiZmluYWxpemF0aW9uIiA8PCBlbmRsOworICBpZiAoaGFzX2NvbnN0KSB7CisgICAgZl9hbGwgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjEuMH0gIC8vIEQyMDEwIiA8PCBlbmRsOworICAgIGZfYWxsIDw8ICIgICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIl9GaW5hbGl6ZTsiIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgInskSUZFTkR9IiA8PCBlbmRsOworICB9CisgIGZfYWxsIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX2FsbCA8PCAiZW5kLiIgPDwgZW5kbDsKKyAgZl9hbGwuY2xvc2UoKTsKKworICBpZiAoIXR5cGVkZWZzX3BlbmRpbmcuZW1wdHkoKSkgeworICAgIHB3YXJuaW5nKDAsICIlZCB0eXBlZGVmcyB3aXRoIHVucmVzb2x2ZWQgdHlwZSByZWZlcmVuY2VzIGxlZnQ6XG4iLCB0eXBlZGVmc19wZW5kaW5nLnNpemUoKSk7CisgICAgZm9yIChzdGQ6Omxpc3Q8dF90eXBlZGVmKj46Oml0ZXJhdG9yIGl0ZXIgPSB0eXBlZGVmc19wZW5kaW5nLmJlZ2luKCk7CisgICAgICAgICB0eXBlZGVmc19wZW5kaW5nLmVuZCgpICE9IGl0ZXI7CisgICAgICAgICArK2l0ZXIpIHsKKyAgICAgIHB3YXJuaW5nKDAsICItICVzXG4iLCAoKml0ZXIpLT5nZXRfc3ltYm9saWMoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmRlbHBoaV90eXBlX3VzaW5ncyhvc3RyZWFtJiBvdXQpIHsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJDbGFzc2VzLCBTeXNVdGlscywgR2VuZXJpY3MuQ29sbGVjdGlvbnMsIFRocmlmdC5Db2xsZWN0aW9ucywgVGhyaWZ0LlByb3RvY29sLCIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIlRocmlmdC5UcmFuc3BvcnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIEZvcndhcmQgZGVjbGFyZSBzdHJ1Y3QgZGVmCisgIGhhc19mb3J3YXJkID0gdHJ1ZTsKKyAgcHZlcmJvc2UoImZvcndhcmQgZGVjbGFyYXRpb24gb2YgJXNcbiIsIHR5cGVfbmFtZSh0c3RydWN0KS5jX3N0cigpKTsKKworICBzdHJpbmcgd2hhdCA9IHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkgPyAiY2xhc3MiIDogImludGVyZmFjZSI7CisKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChzX2ZvcndhcmRfZGVjcikgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCksIHRydWUpIDw8ICIgPSAiIDw8IHdoYXQgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBhZGRfZGVmaW5lZF90eXBlKHRzdHJ1Y3QpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHRfdHlwZSogdHlwZSA9IHR0eXBlZGVmLT5nZXRfdHlwZSgpOworCisgIC8vIHdyaXRlIG5vdyBvciBzYXZlIGZvciBsYXRlcj8KKyAgaWYgKCFpc19mdWxseV9kZWZpbmVkX3R5cGUodHlwZSkpIHsKKyAgICBwdmVyYm9zZSgidHlwZWRlZiAlczogdW5yZXNvbHZlZCBkZXBlbmRlbmNpZXMgZm91bmRcbiIsIHR5cGVfbmFtZSh0dHlwZWRlZikuY19zdHIoKSk7CisgICAgdHlwZWRlZnNfcGVuZGluZy5wdXNoX2JhY2sodHR5cGVkZWYpOworICAgIHJldHVybjsKKyAgfQorCisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc3RydWN0LCB0dHlwZWRlZik7CisgIGluZGVudChzX3N0cnVjdCkgPDwgdHlwZV9uYW1lKHR0eXBlZGVmKSA8PCAiID0gIjsKKworICAvLyBjb21tZW50ZWQgb3V0OiB0aGUgYmVuZWZpdCBpcyBub3QgYmlnIGVub3VnaCB0byByaXNrIGJyZWFraW5nIGV4aXN0aW5nIGNvZGUKKyAgLy8gYm9vbCBjb250YWluZXIgPSB0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCk7CisgIC8vIGlmKCAhIGNvbnRhaW5lcikKKyAgLy8gIHNfc3RydWN0IDw8ICJ0eXBlICI7ICAvL3RoZSAidHlwZSBBID0gdHlwZSBCIiBzeW50YXggbGVhZHMgdG8gRTI1NzQgd2l0aCBnZW5lcmljcworCisgIHNfc3RydWN0IDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBhZGRfZGVmaW5lZF90eXBlKHR0eXBlZGVmKTsKK30KKworYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICgoTlVMTCAhPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKSkgJiYgKHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IHByb2dyYW1fKSkgeworICAgIHRfc2NvcGUqIHNjb3BlID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPnNjb3BlKCk7CisgICAgaWYgKE5VTEwgIT0gc2NvcGUtPmdldF90eXBlKHR0eXBlLT5nZXRfbmFtZSgpKSkgeworICAgICAgLy8gcHJpbnRmKCJ0eXBlICVzIGZvdW5kIGluIGluY2x1ZGVkIHNjb3BlICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgLy8gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiAoMSA9PSB0eXBlc19rbm93blt0eXBlX25hbWUodHR5cGUpXSk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuICgxID09IHR5cGVzX2tub3duW2Jhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpXSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiB0cnVlOyAvLyBlbnVtcyBhcmUgd3JpdHRlbiBmaXJzdCwgYmVmb3JlIGFsbCBvdGhlciB0eXBlcworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICByZXR1cm4gaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAmJiBpc19mdWxseV9kZWZpbmVkX3R5cGUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICByZXR1cm4gaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICByZXR1cm4gaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOworICB9CisKKyAgcmV0dXJuICgxID09IHR5cGVzX2tub3duW3R5cGVfbmFtZSh0dHlwZSldKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmFkZF9kZWZpbmVkX3R5cGUodF90eXBlKiB0dHlwZSkgeworICAvLyBtYXJrIGFzIGtub3duIHR5cGUKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKHR0eXBlKV0gPSAxOworCisgIC8vIGNoZWNrIGFsbCBwZW5kaW5nIHR5cGVkZWZzCisgIHN0ZDo6bGlzdDx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgaXRlcjsKKyAgYm9vbCBtb3JlID0gdHJ1ZTsKKyAgd2hpbGUgKG1vcmUgJiYgKCF0eXBlZGVmc19wZW5kaW5nLmVtcHR5KCkpKSB7CisgICAgbW9yZSA9IGZhbHNlOworCisgICAgZm9yIChpdGVyID0gdHlwZWRlZnNfcGVuZGluZy5iZWdpbigpOyB0eXBlZGVmc19wZW5kaW5nLmVuZCgpICE9IGl0ZXI7ICsraXRlcikgeworICAgICAgdF90eXBlZGVmKiB0dHlwZWRlZiA9ICgqaXRlcik7CisgICAgICBpZiAoaXNfZnVsbHlfZGVmaW5lZF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBwdmVyYm9zZSgidHlwZWRlZiAlczogYWxsIHBlbmRpbmcgcmVmZXJlbmNlcyBhcmUgbm93IHJlc29sdmVkXG4iLAorICAgICAgICAgICAgICAgICB0eXBlX25hbWUodHR5cGVkZWYpLmNfc3RyKCkpOworICAgICAgICB0eXBlZGVmc19wZW5kaW5nLmVyYXNlKGl0ZXIpOworICAgICAgICBnZW5lcmF0ZV90eXBlZGVmKHR0eXBlZGVmKTsKKyAgICAgICAgbW9yZSA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5pdF9rbm93bl90eXBlc19saXN0KCkgeworICAvLyBrbm93biBiYXNlIHR5cGVzCisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfc3RyaW5nKV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2JpbmFyeSldID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9ib29sKV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2k4KV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2kxNildID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9pMzIpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfaTY0KV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2RvdWJsZSldID0gMTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBoYXNfZW51bSA9IHRydWU7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfZW51bSwgdGVudW0pOworICBpbmRlbnQoc19lbnVtKSA8PCB0eXBlX25hbWUodGVudW0sIHRydWUsIHRydWUpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8ICIoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIGlmIChjb25zdGFudHMuZW1wdHkoKSkgeworICAgIGluZGVudChzX2VudW0pIDw8ICJkdW1teSA9IDAgIC8vIGVtcHR5IGVudW1zIGFyZSBub3QgYWxsb3dlZCI7CisgIH0gZWxzZSB7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5iZWdpbigpKSB7CisgICAgICAgIHNfZW51bSA8PCAiLCI7CisgICAgICAgIHNfZW51bSA8PCBlbmRsOworICAgICAgfQorICAgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX2VudW0sICpjX2l0ZXIpOworICAgICAgaW5kZW50KHNfZW51bSkgPDwgbm9ybWFsaXplX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gIiA8PCB2YWx1ZTsKKyAgICB9CisgIH0KKyAgc19lbnVtIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX2VudW0pIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCitzdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfZGVscGhpX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIGZyb21OYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHN0ciA9IGZyb21OYW1lOworICBpZiAoc3RyLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgLy8gdGVzdHMgcmVseSBvbiB0aGlzCisgIGFzc2VydCgoJ0EnIDwgJ1onKSAmJiAoJ2EnIDwgJ3onKSAmJiAoJzAnIDwgJzknKSk7CisKKyAgLy8gaWYgdGhlIGZpcnN0IGxldHRlciBpcyBhIG51bWJlciwgd2UgYWRkIGFuIGFkZGl0aW9uYWwgdW5kZXJzY29yZSBpbiBmcm9udCBvZiBpdAorICBjaGFyIGMgPSBzdHIuYXQoMCk7CisgIGlmICgoJzAnIDw9IGMpICYmIChjIDw9ICc5JykpIHsKKyAgICBzdHIgPSAiXyIgKyBzdHI7CisgIH0KKworICAvLyBmb2xsb3dpbmcgY2hhcnM6IGxldHRlciwgbnVtYmVyIG9yIHVuZGVyc2NvcmUKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpIHsKKyAgICBjID0gc3RyLmF0KGkpOworICAgIGlmICgoKCdBJyA+IGMpIHx8IChjID4gJ1onKSkgJiYgKCgnYScgPiBjKSB8fCAoYyA+ICd6JykpICYmICgoJzAnID4gYykgfHwgKGMgPiAnOScpKQorICAgICAgICAmJiAoJ18nICE9IGMpKSB7CisgICAgICBzdHIucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bWFrZV9jb25zdGFudHNfY2xhc3NuYW1lKCkgeworICBpZiAoY29uc3RwcmVmaXhfKSB7CisgICAgcmV0dXJuIG1ha2VfdmFsaWRfZGVscGhpX2lkZW50aWZpZXIoIlQiICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMiKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIlRDb25zdGFudHMiOyAvLyBjb21wYXRpYmlsaXR5CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGlmIChjb25zdHMuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGhhc19jb25zdCA9IHRydWU7CisgIHN0cmluZyBjb25zdGFudHNfY2xhc3MgPSBtYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKTsKKworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KHNfY29uc3QpIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICIgPSBjbGFzcyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJwcml2YXRlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGlmIChjb25zdF9uZWVkc192YXIoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgcHJpbnRfcHJpdmF0ZV9maWVsZChzX2NvbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19jb25zdCkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX2NvbnN0LCAqY19pdGVyKTsKKyAgICBwcmludF9jb25zdF9wcm9wKHNfY29uc3QsCisgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgIH0KKyAgaW5kZW50KHNfY29uc3QpIDw8ICJ7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfSIgPDwgZW5kbDsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJjbGFzcyBjb25zdHJ1Y3RvciBDcmVhdGU7IiA8PCBlbmRsOworICBpbmRlbnQoc19jb25zdCkgPDwgImNsYXNzIGRlc3RydWN0b3IgRGVzdHJveTsiIDw8IGVuZGw7CisgIGluZGVudChzX2NvbnN0KSA8PCAieyRJRkVORH0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX2NvbnN0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YXJzLCBjb2RlOworCisgIGluZGVudF91cF9pbXBsKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW5pdGlhbGl6ZV9maWVsZCh2YXJzLAorICAgICAgICAgICAgICAgICAgICAgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICJGIiArIHByb3BfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworCisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJjbGFzcyBjb25zdHJ1Y3RvciAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICIuQ3JlYXRlOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGlmICghdmFycy5zdHIoKS5lbXB0eSgpKSB7CisgICAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICAgIHNfY29uc3RfaW1wbCA8PCB2YXJzLnN0cigpOworICB9CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpZiAoIWNvZGUuc3RyKCkuZW1wdHkoKSkgeworICAgIHNfY29uc3RfaW1wbCA8PCBjb2RlLnN0cigpOworICB9CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiY2xhc3MgZGVzdHJ1Y3RvciAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICIuRGVzdHJveTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGNvbnN0X25lZWRzX3ZhcigoKmNfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBmaW5hbGl6ZV9maWVsZChzX2NvbnN0X2ltcGwsCisgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgfQorICB9CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAieyRFTFNFfSIgPDwgZW5kbDsKKworICB2YXJzLnN0cigiIik7CisgIGNvZGUuc3RyKCIiKTsKKworICBpbmRlbnRfdXBfaW1wbCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGlmIChjb25zdF9uZWVkc192YXIoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgaW5pdGlhbGl6ZV9maWVsZCh2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudHNfY2xhc3MgKyAiLkYiICsgcHJvcF9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgfQorICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJwcm9jZWR1cmUgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0luaXRpYWxpemU7IiA8PCBlbmRsOworICBpZiAoIXZhcnMuc3RyKCkuZW1wdHkoKSkgeworICAgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgICBzX2NvbnN0X2ltcGwgPDwgdmFycy5zdHIoKTsKKyAgfQorICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaWYgKCFjb2RlLnN0cigpLmVtcHR5KCkpIHsKKyAgICBzX2NvbnN0X2ltcGwgPDwgY29kZS5zdHIoKTsKKyAgfQorICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAicHJvY2VkdXJlICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIl9GaW5hbGl6ZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZpbmFsaXplX2ZpZWxkKHNfY29uc3RfaW1wbCwKKyAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgIGNvbnN0YW50c19jbGFzcyk7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ7JElGRU5EfSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX25tKSB7CisKKyAgc3RyaW5nIGNsc19wcmVmaXg7CisKKyAgaWYgKGNsc19ubSA9PSAiIikgeworICAgIGNsc19wcmVmaXggPSAiIjsKKyAgfSBlbHNlIHsKKyAgICBjbHNfcHJlZml4ID0gY2xzX25tICsgIi4iOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgY2xzX3ByZWZpeCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBjbHNfcHJlZml4IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICJbIiA8PCBrZXkgPDwgIl0iCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgY2xzX3ByZWZpeCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiLkFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9wcml2YXRlX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCl2YWx1ZTsKKyAgaW5kZW50KG91dCkgPDwgImNsYXNzIHZhciBGIiA8PCBuYW1lIDw8ICI6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICI7IiA8PCBlbmRsOworfQorCitib29sIHRfZGVscGhpX2dlbmVyYXRvcjo6Y29uc3RfbmVlZHNfdmFyKHRfdHlwZSogdHlwZSkgeworICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKKyAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7CisgIH0KKyAgcmV0dXJuICghdHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3Byb3Aoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKXZhbHVlOworICBpZiAoY29uc3RfbmVlZHNfdmFyKHR5cGUpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNsYXNzIHByb3BlcnR5ICIgPDwgbmFtZSA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIHJlYWQgRiIgPDwgbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YXJzOyAvLyBkdW1teQorICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY29uc3QgIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHRfdHlwZSogdHJ1ZXR5cGUgPSB0eXBlOworICB3aGlsZSAodHJ1ZXR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRydWV0eXBlID0gKCh0X3R5cGVkZWYqKXRydWV0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAvLyBhbHJlYWR5IGRvbmUKKyAgICAvLyBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUoIHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIC8vIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdHlwbmFtZTsKKyAgICB0eXBuYW1lID0gdHlwZV9uYW1lKHRydWV0eXBlLCB0cnVlLCBmYWxzZSwgdHlwZS0+aXNfeGNlcHRpb24oKSwgdHlwZS0+aXNfeGNlcHRpb24oKSk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBuYW1lIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgICBwcmludF9jb25zdF9kZWZfdmFsdWUodmFycywgb3V0LCBuYW1lLCB0cnVldHlwZSwgdmFsdWUpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjppbml0aWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBwcmludF9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmZpbmFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX25tKSB7CisgICh2b2lkKW91dDsKKyAgKHZvaWQpbmFtZTsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpdmFsdWU7CisgICh2b2lkKWNsc19ubTsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworCisgIHRfdHlwZSogdHJ1ZXR5cGUgPSB0eXBlOworICB3aGlsZSAodHJ1ZXR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRydWV0eXBlID0gKCh0X3R5cGVkZWYqKXRydWV0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHRydWV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0cnVldHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICInIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICInIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZW5kZXIgPDwgIlNob3J0SW50KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmVuZGVyIDw8ICJTbWFsbEludCggIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCAiTG9uZ0ludCggIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCAiSW50NjQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIi4wIjsgLy8gbWFrZSBpdCBhIGRvdWJsZSBjb25zdGFudCBieSBhZGRpbmcgIi4wIgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgdmFycyA8PCAiICAiIDw8IHQgPDwgIiA6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICI7IiA8PCBlbmRsOworICAgIHByaW50X2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgdCwgdHlwZSwgdmFsdWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihzX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgaW5kZW50X2Rvd24oKTsKKworICBhZGRfZGVmaW5lZF90eXBlKHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChzX3N0cnVjdF9pbXBsLCAiIiwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgaWYgKHJlZ2lzdGVyX3R5cGVzXykgeworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5KHNfdHlwZV9mYWN0b3J5X2Z1bmNzLCAiIiwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24oc190eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGlzX3Jlc3VsdCwgdHJ1ZSk7CisgIH0KKworICBzdHJpbmcgY2xzX25tOworCisgIHN0cmluZyBleGNlcHRpb25fZmFjdG9yeV9uYW1lOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBleGNlcHRpb25fZmFjdG9yeV9uYW1lID0gbm9ybWFsaXplX2Nsc25tKHRzdHJ1Y3QtPmdldF9uYW1lKCksICIiLCB0cnVlKSArICJGYWN0b3J5IjsKKyAgfQorCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgKCFpc194X2ZhY3RvcnkpLCBpc194X2ZhY3RvcnksIHRydWUpOworICB9IGVsc2UgeworICAgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gdmFycywgY29kZTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGluZGVudF91cF9pbXBsKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKKyAgICB9CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgaW5pdGlhbGl6ZV9maWVsZCh2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAiRiIgKyBwcm9wX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19leGNlcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGluZGVudF9pbXBsKGNvZGUpIDw8ICJGX19pc3NldF8iIDw8IHByb3BfbmFtZSgoKm1faXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIiA6PSBUcnVlOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImNvbnN0cnVjdG9yICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iCisgICAgICAgICAgICAgICAgICAgPDwgIkNyZWF0ZTsiIDw8IGVuZGw7CisKKyAgaWYgKCF2YXJzLnN0cigpLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgInZhciIgPDwgZW5kbDsKKyAgICBvdXQgPDwgdmFycy5zdHIoKTsKKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZCBDcmVhdGUoJycpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpbmhlcml0ZWQ7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCFjb2RlLnN0cigpLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgY29kZS5zdHIoKTsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmICgobWVtYmVycy5zaXplKCkgPiAwKSAmJiBpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiY29uc3RydWN0b3IgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJDcmVhdGUoIiA8PCBjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRzdHJ1Y3QsIGluZGVudF9pbXBsKCkpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJDcmVhdGU7IiA8PCBlbmRsOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBwcm9wbmFtZSA9IHByb3BfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCksIGlzX2V4Y2VwdGlvbik7CisgICAgICBzdHJpbmcgcGFyYW1fbmFtZSA9IGNvbnN0cnVjdG9yX3BhcmFtX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgcHJvcG5hbWUgPDwgIiA6PSAiIDw8IHBhcmFtX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgImRlc3RydWN0b3IgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICA8PCAiRGVzdHJveTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKKyAgICB9CisgICAgZmluYWxpemVfZmllbGQob3V0LCBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpbmhlcml0ZWQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI6IEkiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiBGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgPSBuaWwiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAidGhlbiBGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgOj0gVCIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJyZXN1bHQgOj0gRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGVhclVuaW9uVmFsdWVzOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKKyAgICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKKyAgICAgIH0KKworICAgICAgZ2VuZXJhdGVfZGVscGhpX2NsZWFyX3VuaW9uX3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc19ubSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LT5pc191bmlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3hfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fZmFjdG9yeV9uYW1lKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKKyAgICB9CisgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgY2xzX25tLCB0LCAqbV9pdGVyLCAiRiIsIGlzX2V4Y2VwdGlvbik7CisgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzX25tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0cnVjdC0+aXNfdW5pb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfeF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fZmFjdG9yeV9uYW1lKTsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgY2xzX25tLCB0LCAqbV9pdGVyLCAiRiIsIGlzX2V4Y2VwdGlvbik7CisgICAgfQorICB9CisKKyAgaWYgKCghaXNfZXhjZXB0aW9uKSB8fCBpc194X2ZhY3RvcnkpIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgICBpZiAoaXNfcmVzdWx0KSB7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3Rfd3JpdGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAgIH0KKyAgfQorICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGlzX3hfZmFjdG9yeSk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiBpc194X2ZhY3RvcnkpIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfY3JlYXRlX2V4Y2VwdGlvbl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfZnVuYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBvdXQgPDwgIkNyZWF0ZV8iOworICBvdXQgPDwgc3RydWN0X2ludGZfbmFtZTsKKyAgb3V0IDw8ICJfSW1wbCI7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKKyAgKHZvaWQpY2xzX3ByZWZpeDsKKyAgaWYgKGlzX2V4Y2VwdGlvbikKKyAgICByZXR1cm47CisgIGlmIChpc19yZXN1bHQpCisgICAgcmV0dXJuOworICBpZiAoaXNfeF9mYWN0b3J5KQorICAgIHJldHVybjsKKworICBzdHJpbmcgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgc3RyaW5nIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSk7CisKKyAgb3V0IDw8ICJmdW5jdGlvbiAiOworICBwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCAiOiAiOworICBvdXQgPDwgc3RydWN0X2ludGZfbmFtZTsKKyAgb3V0IDw8ICI7IiA8PCBlbmRsOworICBvdXQgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IGNsc19ubSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7CisgICh2b2lkKWNsc19wcmVmaXg7CisgIGlmIChpc19leGNlcHRpb24pCisgICAgcmV0dXJuOworICBpZiAoaXNfcmVzdWx0KQorICAgIHJldHVybjsKKyAgaWYgKGlzX3hfZmFjdG9yeSkKKyAgICByZXR1cm47CisKKyAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiAgVHlwZVJlZ2lzdHJ5LlJlZ2lzdGVyVHlwZUZhY3Rvcnk8IiA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICI+KCI7CisgIHByaW50X2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X2Z1bmMob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8ICIpOyI7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworICBzdHJpbmcgc3RydWN0X2ludGZfbmFtZTsKKyAgc3RyaW5nIHN0cnVjdF9uYW1lOworICBzdHJpbmcgaXNzZXRfbmFtZTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBzdHJpbmcgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA9IG5vcm1hbGl6ZV9jbHNubSh0c3RydWN0LT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSkgKyAiRmFjdG9yeSI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICB9CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIHN0cnVjdF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsICghaXNfeF9mYWN0b3J5KSwgaXNfeF9mYWN0b3J5KTsKKyAgfSBlbHNlIHsKKyAgICBzdHJ1Y3RfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlKTsKKyAgfQorCisgIGlmICgoIWlzX2V4Y2VwdGlvbikgfHwgaXNfeF9mYWN0b3J5KSB7CisKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgdHN0cnVjdCk7CisgICAgaW5kZW50KG91dCkgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiID0gaW50ZXJmYWNlKElCYXNlKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgIH0KKworICAgIGlmIChpc194X2ZhY3RvcnkpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIi8vIENyZWF0ZSBFeGNlcHRpb24gT2JqZWN0IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIENyZWF0ZUV4Y2VwdGlvbjogIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgaXNfZXhjZXB0aW9uKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgICBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgICAgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuIHJlYWQgR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgdHN0cnVjdCk7CisgIGluZGVudChvdXQpIDw8IHN0cnVjdF9uYW1lIDw8ICIgPSAiOworICBpZiAoaXNfZmluYWwpIHsKKyAgICBvdXQgPDwgInNlYWxlZCAiOworICB9CisgIG91dCA8PCAiY2xhc3MoIjsKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBvdXQgPDwgIlRFeGNlcHRpb24iOworICB9IGVsc2UgeworICAgIG91dCA8PCAiVEludGVyZmFjZWRPYmplY3QsIElCYXNlLCAiIDw8IHN0cnVjdF9pbnRmX25hbWU7CisgIH0KKyAgb3V0IDw8ICIpIiA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidHlwZSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24ob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGluX2NsYXNzLCBpc19yZXN1bHQsIHRydWUpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGluZGVudChvdXQpIDw8ICJGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgOiIgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJGIiwgaXNfZXhjZXB0aW9uKSA8PCBlbmRsOworICB9CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaXNzZXRfbmFtZSA9ICJGX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICAgIGluZGVudChvdXQpIDw8IGlzc2V0X25hbWUgPDwgIjogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgfQorCisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIi8vIENsZWFyIHZhbHVlcyhmb3IgdW5pb24ncyBwcm9wZXJ0eSBzZXR0ZXIpIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgQ2xlYXJVbmlvblZhbHVlczsiIDw8IGVuZGw7CisgIH0KKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoKG1lbWJlcnMuc2l6ZSgpID4gMCkgJiYgaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlKCIgPDwgY29uc3RydWN0b3JfYXJndW1lbnRfbGlzdCh0c3RydWN0LCBpbmRlbnQoKSkKKyAgICAgICAgICAgICAgICA8PCAiKTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGU7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7IiA8PCBlbmRsOworCisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gVG9TdHJpbmc6IHN0cmluZzsgb3ZlcnJpZGU7IiA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIi8vIEV4Y2VwdGlvbiBGYWN0b3J5IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIjogIiA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCghaXNfZXhjZXB0aW9uKSB8fCBpc194X2ZhY3RvcnkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gSUJhc2UiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBSZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBXcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiBpc194X2ZhY3RvcnkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gQ3JlYXRlIEV4Y2VwdGlvbiBPYmplY3QiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIENyZWF0ZUV4Y2VwdGlvbjogIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIi8vIFByb3BlcnRpZXMiIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCBpc19leGNlcHRpb24pOworICAgIH0KKyAgfQorCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gaXNzZXQiIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbiByZWFkIEdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSA8PCAiID0gY2xhc3MiIDw8IGVuZGw7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAidHlwZSIgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudChzX3NlcnZpY2UpIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLGZhbHNlKTsKKyAgaWYoYXN5bmNfKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsdHJ1ZSk7CisgIH0KK30KKworCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSwgYm9vbCBmb3JfYXN5bmMpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgc3RyaW5nIGlmYWNlX25hbWUgPSBmb3JfYXN5bmMgPyAiSUFzeW5jIiA6ICJJZmFjZSI7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLCB0cnVlLCB0cnVlKTsKKyAgICBleHRlbmRzX2lmYWNlID0gZXh0ZW5kcyArICIuIiArIGlmYWNlX25hbWU7CisgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBpZmFjZV9uYW1lIDw8ICIgPSBpbnRlcmZhY2UoIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGlmYWNlX25hbWUgPDwgIiA9IGludGVyZmFjZSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgKmZfaXRlcik7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZvcl9hc3luYykgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc19zZXJ2aWNlLCB0cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChzX3NlcnZpY2VfaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpbmRlbnRfdXAoKTsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIlRJbnRlcmZhY2VkT2JqZWN0IjsKKyAgc3RyaW5nIGltcGxlbWVudHMgPSBhc3luY18gPyAiSWZhY2UsIElBc3luYyIgOiAiSWZhY2UiOworCisgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5UQ2xpZW50IjsKKyAgfQorICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiVENsaWVudCA9IGNsYXNzKCAiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIsICIgPDwgaW1wbGVtZW50cyA8PCAiKSIgPDwgZW5kbDsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlKCBwcm90OiBJUHJvdG9jb2wpOyBvdmVybG9hZDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLlRDbGllbnQuQ3JlYXRlKCBwcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJDcmVhdGUoIHByb3QsIHByb3QgKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KHNfc2VydmljZSkKKyAgICAgIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyBvdmVybG9hZDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLlRDbGllbnQuQ3JlYXRlKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZCBDcmVhdGU7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90XyA6PSBpcHJvdDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfIDo9IG9wcm90OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJpcHJvdF86IElQcm90b2NvbDsiIDw8IGVuZGw7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgIm9wcm90XzogSVByb3RvY29sOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAic2VxaWRfOiBTeXN0ZW0uSW50ZWdlcjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3BlcnR5IElucHV0UHJvdG9jb2w6IElQcm90b2NvbCByZWFkIGlwcm90XzsiIDw8IGVuZGw7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3BlcnR5IE91dHB1dFByb3RvY29sOiBJUHJvdG9jb2wgcmVhZCBvcHJvdF87IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiLy8gSWZhY2UiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsICpmX2l0ZXIpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgZW5kbDsKKyAgfQorCisgIGlmKCBhc3luY18pIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICIvLyBJQXN5bmMiIDw8IGVuZGw7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsICpmX2l0ZXIpOworICAgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgZnVsbF9jbHMgPSBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuVENsaWVudCI7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgICAvLyBvbmUgZm9yIHN5bmMgb25seSwgdHdvIGZvciBhc3luYytzeW5jCisgICAgaW50IG1vZGUgPSBhc3luY18gPyAxIDogMDsKKyAgICB3aGlsZSggbW9kZSA+PSAwKSB7CisgICAgICBib29sIGZvcl9hc3luYyA9IChtb2RlICE9IDApOworICAgICAgbW9kZS0tOworCisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZvcl9hc3luYywgZnVsbF9jbHMpIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKworICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICAgIGlmKCBmb3JfYXN5bmMpIHsKKyAgICAgICAgaWYgKGlzX3ZvaWQodHR5cGUpKSB7CisgICAgICAgICAgIC8vIERlbHBoaSBmb3JjZXMgdXMgdG8gc3BlY2lmeSBhIHR5cGUgd2l0aCBJRnV0dXJlPFQ+LCBzbyB3ZSB1c2UgSW50ZWdlcj0wIGZvciB2b2lkIG1ldGhvZHMKKyAgICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJlc3VsdCA6PSBUVGFzay5GdXR1cmU8U3lzdGVtLkludGVnZXI+KGZ1bmN0aW9uOiBTeXN0ZW0uSW50ZWdlciIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdHJpbmcgcmV0dHlwZSA9IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJlc3VsdCA6PSBUVGFzay5GdXR1cmU8IiA8PCByZXR0eXBlIDw8ICI+KGZ1bmN0aW9uOiAiIDw8IHJldHR5cGUgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgfQorCisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNfc2VydmljZV9pbXBsIDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgfQorICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgIik7IiA8PCBlbmRsOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgaW5kZW50X2ltcGwoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIHNfc2VydmljZV9pbXBsIDw8ICJSZXN1bHQgOj0gIjsKKyAgICAgICAgfQorICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaWYoIGZvcl9hc3luYykgeworICAgICAgICBpZiAoaXNfdm9pZCh0dHlwZSkpIHsKKyAgICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSAwOyIgPDwgZW5kbDsgIC8vIG5vIElGdXR1cmU8dm9pZD4gaW4gRGVscGhpCisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZCk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgc3RyaW5nIGFyZ3NfY2xzbm0gPSBub3JtYWxpemVfY2xzbm0oYXJnc25hbWUsICJUIik7CisgICAgc3RyaW5nIGFyZ3NfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKGFyZ3NuYW1lLCAiSSIpOworCisgICAgc3RyaW5nIGFyZ3N2YXIgPSB0bXAoIl9hcmdzIik7CisgICAgc3RyaW5nIG1zZ3ZhciA9IHRtcCgiX21zZyIpOworCisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCBmYWxzZSkgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCBmYWxzZSwgZnVsbF9jbHMpIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiIDogIiA8PCBhcmdzX2ludGZubSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgbXNndmFyIDw8ICIgOiBUaHJpZnQuUHJvdG9jb2wuVFRocmlmdE1lc3NhZ2U7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInNlcWlkXyA6PSBzZXFpZF8gKyAxOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCAiIDw8IG1zZ3ZhciA8PCAiLCAnIiA8PCBmdW5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PbmV3YXkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRNZXNzYWdlVHlwZS5DYWxsIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgc2VxaWRfKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VCZWdpbiggIiA8PCBtc2d2YXIgPDwgIiApOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiIDo9ICIgPDwgYXJnc19jbHNubSA8PCAiSW1wbC5DcmVhdGUoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIi4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgZW1wdHlfdmFsdWUoKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90Xy5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyBvcmdfcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgICAgIHN0cmluZyByZXN1bHRfY2xzbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJUIik7CisgICAgICBzdHJpbmcgcmVzdWx0X2ludGZubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIkkiKTsKKworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisKKyAgICAgIHN0cmluZyBleGNlcHR2YXIgPSB0bXAoIl9leCIpOworICAgICAgc3RyaW5nIGFwcGV4dmFyID0gdG1wKCJfYXgiKTsKKyAgICAgIHN0cmluZyByZXR2YXIgPSB0bXAoIl9yZXQiKTsKKworICAgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCBmYWxzZSkgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sIGZhbHNlLCBmdWxsX2NscykgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBtc2d2YXIgPDwgIiA6IFRocmlmdC5Qcm90b2NvbC5UVGhyaWZ0TWVzc2FnZTsiIDw8IGVuZGw7CisgICAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGV4Y2VwdHZhciA8PCAiIDogRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcHBleHZhciA8PCAiIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCByZXR2YXIgPDwgIiA6ICIgPDwgcmVzdWx0X2ludGZubSA8PCAiOyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgbXNndmFyIDw8ICIgOj0gaXByb3RfLlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmICgiIDw8IG1zZ3ZhciA8PCAiLlR5cGVfID0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikgdGhlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXBwZXh2YXIgPDwgIiA6PSBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyYWlzZSAiIDw8IGFwcGV4dmFyIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIgOj0gIiA8PCByZXN1bHRfY2xzbm0gPDwgIkltcGwuQ3JlYXRlKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IHJldHZhciA8PCAiLlJlYWQoaXByb3RfKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmICgiIDw8IHJldHZhciA8PCAiLl9faXNzZXRfc3VjY2VzcykgdGhlbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gIiA8PCByZXR2YXIgPDwgIi5TdWNjZXNzOyIgPDwgZW5kbDsKKyAgICAgICAgdF90eXBlKiB0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgICAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19saXN0KCkKKyAgICAgICAgICAgIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IHJldHZhciA8PCAiLlN1Y2Nlc3MgOj0gbmlsOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiAoIiA8PCByZXR2YXIgPDwgIi5fX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSB0aGVuIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZXhjZXB0dmFyIDw8ICIgOj0gIiA8PCByZXR2YXIgPDwgIi4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5DcmVhdGVFeGNlcHRpb247IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJhaXNlICIgPDwgZXhjZXB0dmFyIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkKKyAgICAgICAgICAgIDw8ICJyYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb25NaXNzaW5nUmVzdWx0LkNyZWF0ZSgnIgorICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdCcpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisKKyAgc3RyaW5nIGZ1bGxfY2xzID0gbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLlRQcm9jZXNzb3JJbXBsIjsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCksIHRydWUsIHRydWUpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuVFByb2Nlc3NvckltcGwiOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUUHJvY2Vzc29ySW1wbCA9IGNsYXNzKCIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiwgSVByb2Nlc3NvcikiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRQcm9jZXNzb3JJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvY2Vzc29yKSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlKCBpZmFjZV86IElmYWNlICk7IiA8PCBlbmRsOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IGZ1bGxfY2xzIDw8ICIuQ3JlYXRlKCBpZmFjZV86IElmYWNlICk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkIENyZWF0ZSggaWZhY2VfKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpbmhlcml0ZWQgQ3JlYXRlOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlNlbGYuaWZhY2VfIDo9IGlmYWNlXzsiIDw8IGVuZGw7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJBU1NFUlQoIHByb2Nlc3NNYXBfIDw+IG5pbCk7ICAvLyBpbmhlcml0ZWQiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpCisgICAgICAgIDw8ICJwcm9jZXNzTWFwXyA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8c3RyaW5nLCBUUHJvY2Vzc0Z1bmN0aW9uPi5DcmVhdGU7IiA8PCBlbmRsOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInByb2Nlc3NNYXBfLkFkZE9yU2V0VmFsdWUoICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9Qcm9jZXNzKTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImRlc3RydWN0b3IgIiA8PCBmdWxsX2NscyA8PCAiLkRlc3Ryb3k7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInByaXZhdGUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiaWZhY2VfOiBJZmFjZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJ0eXBlIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUUHJvY2Vzc0Z1bmN0aW9uID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZSggc2VxaWQ6IFN5c3RlbS5JbnRlZ2VyOyBjb25zdCBpcHJvdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICJJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wiCisgICAgICAgICAgICAgICAgICAgICAgPDwgKGV2ZW50c18gPyAiOyBjb25zdCBldmVudHMgOiBJUmVxdWVzdEV2ZW50cyIgOiAiIikgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm9jZXNzTWFwXzogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLCBUUHJvY2Vzc0Z1bmN0aW9uPjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgImZ1bmN0aW9uIFByb2Nlc3MoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzIDogSVByb2Nlc3NvckV2ZW50cyk6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbDsgY29uc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzKTogU3lzdGVtLkJvb2xlYW47IHJlaW50cm9kdWNlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZnVuY3Rpb24gIiA8PCBmdWxsX2NscyA8PCAiLlByb2Nlc3MoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCBldmVudHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogSVByb2Nlc3NvckV2ZW50cyk6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOiBUaHJpZnQuUHJvdG9jb2wuVFRocmlmdE1lc3NhZ2U7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZuIDogVFByb2Nlc3NGdW5jdGlvbjsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAieCA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsiIDw8IGVuZGw7CisgIGlmIChldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb250ZXh0IDogSVJlcXVlc3RFdmVudHM7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAibXNnIDo9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4gOj0gbmlsOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBub3QgcHJvY2Vzc01hcF8uVHJ5R2V0VmFsdWUobXNnLk5hbWUsIGZuKSIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvciBub3QgQXNzaWduZWQoZm4pIHRoZW4iIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBUVHlwZS5TdHJ1Y3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4IDo9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duTWV0aG9kLkNyZWF0ZSgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ0ludmFsaWQgbWV0aG9kIG5hbWU6ICcnJyArIG1zZy5OYW1lICsgJycnJyk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkKKyAgICAgIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggbXNnLCBtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKTsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gVHJ1ZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpZiAoZXZlbnRzXykgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRoZW4gY29udGV4dCA6PSBldmVudHMuQ3JlYXRlUmVxdWVzdENvbnRleHQobXNnLk5hbWUpIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZWxzZSBjb250ZXh0IDo9IG5pbDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0cnkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90LCBjb250ZXh0KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgY29udGV4dCA8PiBuaWwgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29udGV4dC5DbGVhbnVwQ29udGV4dDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb250ZXh0IDo9IG5pbDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZXhjZXB0IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9uIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dCBkbyBiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gVHJ1ZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVsc2UgYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IEZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBUcnVlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAiU3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHNfc2VydmljZSwgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwoc19zZXJ2aWNlX2ltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgc3RyaW5nIGZ1bmNuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBzdHJpbmcgZnVsbF9jbHMgPSBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuVFByb2Nlc3NvckltcGwiOworCisgIHN0cmluZyBvcmdfYXJnc25hbWUgPSBmdW5jbmFtZSArICJfYXJncyI7CisgIHN0cmluZyBhcmdzX2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19hcmdzbmFtZSwgIlQiKTsKKyAgc3RyaW5nIGFyZ3NfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19hcmdzbmFtZSwgIkkiKTsKKworICBzdHJpbmcgb3JnX3Jlc3VsdG5hbWUgPSBmdW5jbmFtZSArICJfcmVzdWx0IjsKKyAgc3RyaW5nIHJlc3VsdF9jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIlQiKTsKKyAgc3RyaW5nIHJlc3VsdF9pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJJIik7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb2NlZHVyZSAiIDw8IGZ1bmNuYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICJfUHJvY2Vzcyggc2VxaWQ6IFN5c3RlbS5JbnRlZ2VyOyBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sIgorICAgICAgICAgICAgICAgICAgICA8PCAoZXZlbnRzXyA/ICI7IGNvbnN0IGV2ZW50cyA6IElSZXF1ZXN0RXZlbnRzIiA6ICIiKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIi8vIG9uZSB3YXkgcHJvY2Vzc29yIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiLy8gYm90aCB3YXkgcHJvY2Vzc29yIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpCisgICAgICA8PCAicHJvY2VkdXJlICIgPDwgZnVsbF9jbHMgPDwgIi4iIDw8IGZ1bmNuYW1lCisgICAgICA8PCAiX1Byb2Nlc3MoIHNlcWlkOiBTeXN0ZW0uSW50ZWdlcjsgY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCIKKyAgICAgIDw8IChldmVudHNfID8gIjsgY29uc3QgZXZlbnRzIDogSVJlcXVlc3RFdmVudHMiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXJnczogIiA8PCBhcmdzX2ludGZubSA8PCAiOyIgPDwgZW5kbDsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2c6IFRocmlmdC5Qcm90b2NvbC5UVGhyaWZ0TWVzc2FnZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQ6ICIgPDwgcmVzdWx0X2ludGZubSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFwcHggOiBUQXBwbGljYXRpb25FeGNlcHRpb247IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGlmIChldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlByZVJlYWQ7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXJncyA6PSAiIDw8IGFyZ3NfY2xzbm0gPDwgIkltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgaWYgKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUG9zdFJlYWQ7IiA8PCBlbmRsOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJldCA6PSAiIDw8IHJlc3VsdF9jbHNubSA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHNfc2VydmljZV9pbXBsIDw8IGluZGVudF9pbXBsKCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBzX3NlcnZpY2VfaW1wbCA8PCAicmV0LlN1Y2Nlc3MgOj0gIjsKKyAgfQorICBzX3NlcnZpY2VfaW1wbCA8PCAiaWZhY2VfLiIgPDwgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgIiwgIjsKKyAgICB9CisgICAgc19zZXJ2aWNlX2ltcGwgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7CisgIH0KKyAgc19zZXJ2aWNlX2ltcGwgPDwgIik7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gIiA8PCBlbXB0eV92YWx1ZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImV4Y2VwdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib24gRTogIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGRvIGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBzdHJpbmcgZmFjdG9yeV9uYW1lID0gbm9ybWFsaXplX2Nsc25tKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSwgIiIsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRmFjdG9yeSI7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJldC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiIDo9IEUuIiA8PCBmYWN0b3J5X25hbWUgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib24gRTogRXhjZXB0aW9uIGRvIGJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpZihldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlVuaGFuZGxlZEVycm9yKEUpOyIgPDwgZW5kbDsKKyAgfQorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFwcHggOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvci5DcmVhdGUoRS5NZXNzYWdlKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0cnkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpZihldmVudHNfKSB7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUHJlV3JpdGU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBtc2csICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgc2VxaWQpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFwcHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgICBpZihldmVudHNfKSB7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUG9zdFdyaXRlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcHB4LkZyZWU7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaWYgKGV2ZW50c18pIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5QcmVXcml0ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIG1zZywgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKTsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7ICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJldC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICAgIGlmIChldmVudHNfKSB7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUG9zdFdyaXRlOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAoZXZlbnRzXykgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5PbmV3YXlDb21wbGV0ZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbik7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsICIiKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIGlzX3hjZXB0aW9uLCB0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiOworCisgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSkgPDwgIigiOworICAgIH0KKworICAgIG91dCA8PCAiaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKKyAgICAgICAgICAgIG91dCA8PCAiUmVhZEFuc2lTdHJpbmcoKTsiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgIlJlYWRCaW5hcnkoKTsiOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTE2KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERlbHBoaSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiUmVhZEkzMigpIjsKKyAgICAgIG91dCA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyB0eXBfbmFtZTsKKworICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgIHR5cF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICB0eXBfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBfbmFtZSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8IG5hbWUgPDwgIi5SZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisKKyAgc3RyaW5nIG9iajsKKyAgc3RyaW5nIGNvdW50ZXI7CisgIHN0cmluZyBsb2NhbF92YXI7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgbG9jYWxfdmFyID0gb2JqICsgIjogVFRocmlmdE1hcDsiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGxvY2FsX3ZhciA9IG9iaiArICI6IFRUaHJpZnRTZXQ7IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgbG9jYWxfdmFyID0gb2JqICsgIjogVFRocmlmdExpc3Q7IjsKKyAgfQorICBsb2NhbF92YXJzIDw8ICIgICIgPDwgbG9jYWxfdmFyIDw8IGVuZGw7CisgIGNvdW50ZXIgPSB0bXAoIl9pIik7CisgIGxvY2FsX3ZhciA9IGNvdW50ZXIgKyAiOiBTeXN0ZW0uSW50ZWdlcjsiOworICBsb2NhbF92YXJzIDw8ICIgICIgPDwgbG9jYWxfdmFyIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBlX25hbWUodHR5cGUsIHRydWUpIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBpcHJvdC5SZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBpcHJvdC5SZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gaXByb3QuUmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgImZvciAiIDw8IGNvdW50ZXIgPDwgIiA6PSAwIHRvICIgPDwgb2JqIDw8ICIuQ291bnQgLSAxIGRvIiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X21hcCopdHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X3NldCopdHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbGlzdCopdHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaXByb3QuUmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpcHJvdC5SZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpcHJvdC5SZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHN0cmluZyBsb2NhbF92YXI7CisKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZma2V5LCAiIiwgbG9jYWxfdmFycyk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZmdmFsLCAiIiwgbG9jYWxfdmFycyk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgIi5BZGRPclNldFZhbHVlKCAiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZmVsZW0sICIiLCBsb2NhbF92YXJzKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZlbGVtLCAiIiwgbG9jYWxfdmFycyk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgKHZvaWQpbG9jYWxfdmFyczsKKworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbik7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIGlzX3hjZXB0aW9uLCB0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKKyAgICAgICAgICAgIG91dCA8PCAiV3JpdGVBbnNpU3RyaW5nKCI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnkoIjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZygiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIldyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJXcml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERlbHBoaSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiV3JpdGVJMzIoU3lzdGVtLkludGVnZXIoIiA8PCBuYW1lIDw8ICIpKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICAodm9pZClsb2NhbF92YXJzOworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50X2ltcGwoKSA8PCBwcmVmaXggPDwgIi5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHN0cmluZyBvYmo7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIm1hcCIpOworICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IFRUaHJpZnRNYXA7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCAiIDw8IG9iaiA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICA8PCAiLkNvdW50KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBCZWdpbiggIiA8PCBvYmogPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgic2V0XyIpOworICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IFRUaHJpZnRTZXQ7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCAiIDw8IG9iaiA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICA8PCAiLkNvdW50KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRCZWdpbiggIiA8PCBvYmogPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoImxpc3RfIik7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogVFRocmlmdExpc3Q7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCAiIDw8IG9iaiA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgPDwgIi5Db3VudCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBpdGVyIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLktleXMgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgaXRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiIGRvIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBpdGVyIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiIGRvIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X3NldCopdHR5cGUsIGl0ZXIsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X2xpc3QqKXR0eXBlLCBpdGVyLCBsb2NhbF92YXJzKTsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZrZmllbGQsICIiLCBsb2NhbF92YXJzKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJnZmaWVsZCwgIiIsIGxvY2FsX3ZhcnMpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZWZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmVmaWVsZCwgIiIsIGxvY2FsX3ZhcnMpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5KG91dCwgaXNfeGNlcHRpb24sIHRmaWVsZCwgaXNQdWJsaWMsICJHZXQiKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RydWN0X2lzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4KSB7CisgICh2b2lkKWlzUHVibGljOworCisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhvdXQsIHRmaWVsZCk7CisgIGluZGVudChvdXQpIDw8ICJwcm9wZXJ0eSAiIDw8IHByb3BfbmFtZSh0ZmllbGQsIHN0cnVjdF9pc194Y2VwdGlvbikgPDwgIjogIgorICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIiByZWFkICIKKyAgICAgICAgICAgICAgPDwgZmllbGRQcmVmaXggKyBwcm9wX25hbWUodGZpZWxkLCBzdHJ1Y3RfaXNfeGNlcHRpb24pIDw8ICIgd3JpdGUgU2V0IgorICAgICAgICAgICAgICA8PCBwcm9wX25hbWUodGZpZWxkLCBzdHJ1Y3RfaXNfeGNlcHRpb24pIDw8ICI7IiA8PCBlbmRsOworfQorCitzdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfeGNlcHRpb24pIHsKKyAgcmV0dXJuIHByb3BfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCksIGlzX3hjZXB0aW9uKTsKK30KKworc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcm9wX25hbWUoc3RyaW5nIG5hbWUsIGJvb2wgaXNfeGNlcHRpb24pIHsKKyAgc3RyaW5nIHJldCA9IG5hbWU7CisgIHJldFswXSA9IHRvdXBwZXIocmV0WzBdKTsKKyAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKHJldCwgdHJ1ZSwgaXNfeGNlcHRpb24pOworfQorCitzdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmNvbnN0cnVjdG9yX3BhcmFtX25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHJldCA9IG5hbWU7CisgIHJldFswXSA9IHRvdXBwZXIocmV0WzBdKTsKKyAgcmV0ID0gIkEiICsgcmV0OworICByZXR1cm4gbm9ybWFsaXplX25hbWUocmV0LCBmYWxzZSwgZmFsc2UpOworfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpub3JtYWxpemVfY2xzbm0oc3RyaW5nIGNsc25tLCBzdHJpbmcgcHJlZml4LCBib29sIGJfbm9fY2hlY2tfa2V5d29yZCkgeworICBpZiAoY2xzbm0uc2l6ZSgpID4gMCkgeworICAgIGNsc25tWzBdID0gdG91cHBlcihjbHNubVswXSk7CisgIH0KKyAgaWYgKGJfbm9fY2hlY2tfa2V5d29yZCkgeworICAgIHJldHVybiBwcmVmaXggKyBjbHNubTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbm9ybWFsaXplX25hbWUocHJlZml4ICsgY2xzbm0pOworICB9Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9jbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX25vX3Bvc3RmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2V4Y2VwdGlvbl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5KSB7CisKKyAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0X3R5cGVkZWYqIHRkZWYgPSAodF90eXBlZGVmKil0dHlwZTsKKyAgICBpZiAodGRlZi0+aXNfZm9yd2FyZF90eXBlZGVmKCkpIHsgLy8gZm9yd2FyZCB0eXBlcyBhY2NvcmRpbmcgdG8gVEhSSUZULTI0MjEKKyAgICAgIGlmICh0ZGVmLT5nZXRfdHlwZSgpICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVfbmFtZSh0ZGVmLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJfY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJfbm9fcG9zdGZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiX2V4Y2VwdGlvbl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJfZnVsbF9leGNlcHRpb25fZmFjdG9yeSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5yZXNvbHZlZCBmb3J3YXJkIGRlY2xhcmF0aW9uOiAiICsgdGRlZi0+Z2V0X3N5bWJvbGljKCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBub3JtYWxpemVfbmFtZSgiVCIgKyB0ZGVmLT5nZXRfc3ltYm9saWMoKSk7CisgICAgfQorICB9CisKKyAgc3RyaW5nIHR5cF9ubTsKKworICBzdHJpbmcgc19mYWN0b3J5OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIGJfY2xzID0gdHJ1ZTsKKyAgICBiX25vX3Bvc3RmaXggPSB0cnVlOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICBpZiAoYl9jbHMpIHsKKyAgICAgIHR5cF9ubSA9ICJUVGhyaWZ0RGljdGlvbmFyeUltcGwiOworICAgIH0gZWxzZSB7CisgICAgICB0eXBfbm0gPSAiSVRocmlmdERpY3Rpb25hcnkiOworICAgIH0KKyAgICByZXR1cm4gdHlwX25tICsgIjwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpKSArICIsICIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpCisgICAgICAgICAgICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICBpZiAoYl9jbHMpIHsKKyAgICAgIHR5cF9ubSA9ICJUSGFzaFNldEltcGwiOworICAgIH0gZWxzZSB7CisgICAgICB0eXBfbm0gPSAiSUhhc2hTZXQiOworICAgIH0KKyAgICByZXR1cm4gdHlwX25tICsgIjwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICBpZiAoYl9jbHMpIHsKKyAgICAgIHR5cF9ubSA9ICJUVGhyaWZ0TGlzdEltcGwiOworICAgIH0gZWxzZSB7CisgICAgICB0eXBfbm0gPSAiSVRocmlmdExpc3QiOworICAgIH0KKyAgICByZXR1cm4gdHlwX25tICsgIjwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9CisKKyAgc3RyaW5nIHR5cGVfcHJlZml4OworCisgIGlmIChiX2NscykgeworICAgIHR5cGVfcHJlZml4ID0gIlQiOworICB9IGVsc2UgeworICAgIHR5cGVfcHJlZml4ID0gIkkiOworICB9CisKKyAgc3RyaW5nIG5tID0gbm9ybWFsaXplX2Nsc25tKHR0eXBlLT5nZXRfbmFtZSgpLCB0eXBlX3ByZWZpeCk7CisKKyAgaWYgKGJfZXhjZXB0aW9uX2ZhY3RvcnkpIHsKKyAgICBubSA9IG5tICsgIkZhY3RvcnkiOworICB9CisKKyAgaWYgKGJfY2xzKSB7CisgICAgaWYgKCFiX25vX3Bvc3RmaXgpIHsKKyAgICAgIG5tID0gbm0gKyAiSW1wbCI7CisgICAgfQorICB9CisKKyAgaWYgKGJfZXhjZXB0aW9uX2ZhY3RvcnkgJiYgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5KSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKSArICIuIiArIG5tOworICB9CisKKyAgcmV0dXJuIG5tOworfQorCisvLyByZXR1cm5zICJjb25zdCAiIGZvciBzb21lIGFyZ3VtZW50IHR5cGVzCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjppbnB1dF9hcmdfcHJlZml4KHRfdHlwZSogdHR5cGUpIHsKKworICAvLyBiYXNlIHR5cGVzCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSkgeworCisgICAgLy8gdGhlc2Ugc2hvdWxkIGJlIGNvbnN0J2VkIGZvciBvcHRpbWFsIHBlcmZvcm1hbWNlCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6IC8vIHJlZmNvdW50ZWQgcG9pbnRlcgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OiAgICAvLyBsYXJnZXIgdGhhbiAzMiBiaXQKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRTogLy8gbGFyZ2VyIHRoYW4gMzIgYml0CisgICAgICByZXR1cm4gImNvbnN0ICI7CisKKyAgICAvLyBhbGwgb3RoZXJzIGRvbid0IG5lZWQgdG8gYmUKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIiI7CisKKyAgICAvLyB3ZSBiZXR0ZXIgYWx3YXlzIHJlcG9ydCBhbnkgdW5rbm93biB0eXBlcworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGlucHV0X2FyZ19wcmVmaXgoKSBmb3IgYmFzZSB0eXBlICIKKyAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpOworICAgIH0KKworICAgIC8vIGVudW1zCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiIjsgLy8gdXN1YWxseSA8PSAzMiBiaXQKKworICAgIC8vIGNvbnRhaW5lcnMKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gImNvbnN0ICI7IC8vIHJlZmNvdW50ZWQgcG9pbnRlcgorCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJjb25zdCAiOyAvLyByZWZjb3VudGVkIHBvaW50ZXIKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gImNvbnN0ICI7IC8vIHJlZmNvdW50ZWQgcG9pbnRlcgorICB9CisKKyAgLy8gYW55IG90aGVyIHR5cGUsIGVpdGhlciBUU29tZXRoaW5nIG9yIElTb21ldGhpbmcKKyAgcmV0dXJuICJjb25zdCAiOyAvLyBwb3NzaWJseSByZWZjb3VudGVkIHBvaW50ZXIKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKSB7CisgIHN3aXRjaCAodGJhc2UtPmdldF9iYXNlKCkpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIC8vIG5vICJ2b2lkIiBpbiBEZWxwaGkgbGFuZ3VhZ2UKKyAgICByZXR1cm4gIiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKKyAgICAgICAgcmV0dXJuICJTeXN0ZW0uQW5zaVN0cmluZyI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIlN5c1V0aWxzLlRCeXRlcyI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiU3lzdGVtLnN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJTeXN0ZW0uQm9vbGVhbiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJTeXN0ZW0uU2hvcnRJbnQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gIlN5c3RlbS5TbWFsbEludCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiU3lzdGVtLkludGVnZXIiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gIlN5c3RlbS5JbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiU3lzdGVtLkRvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEZWxwaGkgbmFtZSBmb3IgYmFzZSB0eXBlICIKKyAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UtPmdldF9iYXNlKCkpOworICB9Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcykgeworICAodm9pZClpbml0OworCisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKworICBzdHJpbmcgcmVzdWx0ID0gcHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpICsgIjogIgorICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgKyAiOyI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JfYXN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZnVsbF9jbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICBzdHJpbmcgcHJlZml4OworICBpZiAoZnVsbF9jbHMgPT0gIiIpIHsKKyAgICBwcmVmaXggPSAiIjsKKyAgfSBlbHNlIHsKKyAgICBwcmVmaXggPSBmdWxsX2NscyArICIuIjsKKyAgfQorCisgIGlmKCBmb3JfYXN5bmMpIHsKKyAgICBpZiAoaXNfdm9pZCh0dHlwZSkpIHsKKyAgICAgIHJldHVybiAiZnVuY3Rpb24gIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIkFzeW5jKCIKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOiBJRnV0dXJlPEludGVnZXI+OyI7ICAvLyBubyBJRnV0dXJlPHZvaWQ+IGluIERlbHBoaQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImZ1bmN0aW9uICIgKyBwcmVmaXggKyBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUsIGlzX3hjZXB0aW9uKSArICJBc3luYygiCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKTogSUZ1dHVyZTwiCisgICAgICAgICAgICAgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgKyAiPjsiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNfdm9pZCh0dHlwZSkpIHsKKyAgICAgIHJldHVybiAicHJvY2VkdXJlICIgKyBwcmVmaXggKyBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUsIGlzX3hjZXB0aW9uKSArICIoIgorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik7IjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJmdW5jdGlvbiAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgKyAiKCIKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOiAiCisgICAgICAgICAgICAgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgKyAiOyI7CisgICAgfQorICB9Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICB0X3R5cGUqIHR0OworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIjsgIjsKKyAgICB9CisKKyAgICB0dCA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICByZXN1bHQgKz0gaW5wdXRfYXJnX3ByZWZpeCh0dCk7IC8vIGNvbnN0PworICAgIHJlc3VsdCArPSBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIjogIgorICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0dCwgZmFsc2UsIHRydWUsIHR0LT5pc194Y2VwdGlvbigpLCB0cnVlKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgY3VycmVudF9pbmRlbnQpIHsKKyAgb3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHRfdHlwZSogdHQ7CisgIHN0cmluZyBsaW5lID0gIiI7CisgIHN0cmluZyBuZXdsaW5lX2luZGVudCA9IGN1cnJlbnRfaW5kZW50ICsgIiAgIjsKKworICBib29sIGZpcnN0bGluZSA9IHRydWU7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUgKz0gIjsiOworICAgIH0KKworICAgIGlmIChsaW5lLnNpemUoKSA+IDgwKSB7CisgICAgICBpZiAoZmlyc3RsaW5lKSB7CisgICAgICAgIHJlc3VsdCA8PCBlbmRsIDw8IG5ld2xpbmVfaW5kZW50OworICAgICAgICBmaXJzdGxpbmUgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCA8PCBsaW5lIDw8IGVuZGw7CisgICAgICBsaW5lID0gbmV3bGluZV9pbmRlbnQ7CisgICAgfSBlbHNlIGlmIChsaW5lLnNpemUoKSA+IDApIHsKKyAgICAgIGxpbmUgKz0gIiAiOworICAgIH0KKworICAgIHR0ID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGxpbmUgKz0gaW5wdXRfYXJnX3ByZWZpeCh0dCk7IC8vIGNvbnN0PworICAgIGxpbmUgKz0gY29uc3RydWN0b3JfcGFyYW1fbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIjogIgorICAgICAgICAgICAgKyB0eXBlX25hbWUodHQsIGZhbHNlLCB0cnVlLCB0dC0+aXNfeGNlcHRpb24oKSwgdHJ1ZSk7CisgIH0KKworICBpZiAobGluZS5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0IDw8IGxpbmU7CisgIH0KKworICBzdHJpbmcgcmVzdWx0X3N0cjsKKworICBpZiAoZmlyc3RsaW5lKSB7CisgICAgcmVzdWx0X3N0ciA9ICIgIiArIHJlc3VsdC5zdHIoKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHRfc3RyID0gcmVzdWx0LnN0cigpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdF9zdHI7Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU3RyaW5nXyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5Cb29sXyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQnl0ZV8iOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGVfIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1hcCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNldF8iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTGlzdCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmVtcHR5X3ZhbHVlKHRfdHlwZSogdHlwZSkgeworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7CisgICAgICAgICAgcmV0dXJuICInJyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuICJuaWwiOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIicnIjsKKyAgICAgIH0KKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIkZhbHNlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiMC4wIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiKDApIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJuaWwiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJuaWwiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJuaWwiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAibmlsIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcykgeworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBTZXQiIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKQorICAgICAgICAgICAgICA8PCAiKCBjb25zdCBWYWx1ZTogIiA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIik7IgorICAgICAgICAgICAgICA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7CisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKworICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gR2V0IiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIjogIgorICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pIHsKKyAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldF9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbikgPDwgIjogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2NsZWFyX3VuaW9uX3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSkgeworICAodm9pZCljbHNfcHJlZml4OworICAodm9pZCluYW1lOworICAodm9pZCl0eXBlOworICAodm9pZClpc191bmlvbjsKKyAgKHZvaWQpaXNfeGNlcHRpb25fZmFjdG9yeTsKKyAgKHZvaWQpeGNlcHRpb25fZmFjdG9yeV9uYW1lOworCisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiBGX19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIHRoZW4gYmVnaW4iCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiRl9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSBGYWxzZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgZmllbGRQcmVmaXggPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgOj0gIgorICAgICAgICAgICAgICAgICAgIDw8ICJEZWZhdWx0KCAiIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSkgeworICAodm9pZCl0eXBlOworCisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IG5hbWUgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgPDwgIlNldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpCisgICAgICAgICAgICAgICAgICAgPDwgIiggY29uc3QgVmFsdWU6ICIgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaWYgKGlzX3VuaW9uKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiQ2xlYXJVbmlvblZhbHVlczsiIDw8IGVuZGw7CisgIH0KKyAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJGX19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9IFRydWU7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9pbXBsKG91dCkgPDwgZmllbGRQcmVmaXggPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgOj0gVmFsdWU7IiA8PCBlbmRsOworCisgIGlmIChpc194Y2VwdGlvbl9jbGFzcyAmJiAoIWlzX3hjZXB0aW9uX2ZhY3RvcnkpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCB4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIi4iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSBWYWx1ZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcykgeworICAodm9pZCl0eXBlOworCisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19wcmVmaXggPDwgbmFtZSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICA8PCAiR2V0IiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIjogIgorICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IGZpZWxkUHJlZml4IDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgeworICAodm9pZCl0eXBlOworCisgIHN0cmluZyBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IG5hbWUgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgPDwgIkdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBmaWVsZFByZWZpeCA8PCBpc3NldF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9jcmVhdGVfZXhjZXB0aW9uX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgICh2b2lkKWNsc19wcmVmaXg7CisKKyAgc3RyaW5nIGV4Y2VwdGlvbl9jbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgdHJ1ZSk7CisgIHN0cmluZyBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIGlzX2V4Y2VwdGlvbiwgaXNfZXhjZXB0aW9uKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19ubSA8PCAiLkNyZWF0ZUV4Y2VwdGlvbjogIiA8PCBleGNlcHRpb25fY2xzX25tIDw8ICI7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgZXhjZXB0aW9uX2Nsc19ubSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7CisgIHN0cmluZyBmYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0odHN0cnVjdC0+Z2V0X25hbWUoKSwgIiIsIHRydWUpICsgIkZhY3RvcnkiOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQuRiIgPDwgZmFjdG9yeV9uYW1lIDw8ICIgOj0gU2VsZjsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBwcm9wbmFtZTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHByb3BuYW1lID0gcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIF9faXNzZXRfIiA8PCBwcm9wbmFtZSA8PCAiIHRoZW4gYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQuIiA8PCBwcm9wbmFtZSA8PCAiIDo9ICIgPDwgcHJvcG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0LlVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIG9zdHJpbmdzdHJlYW0gbG9jYWxfdmFyczsKKyAgb3N0cmluZ3N0cmVhbSBjb2RlX2Jsb2NrOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgInRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRyYWNrZXIgOj0gaXByb3QuTmV4dFJlY3Vyc2lvbkxldmVsOyIgPDwgZW5kbDsKKworICAvLyBsb2NhbCBib29scyBmb3IgcmVxdWlyZWQgZmllbGRzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGluZGVudF9pbXBsKGxvY2FsX3ZhcnMpIDw8ICJfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIiA6IFN5c3RlbS5Cb29sZWFuOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOj0gRkFMU0U7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAic3RydWMgOj0gaXByb3QuUmVhZFN0cnVjdEJlZ2luOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJ5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ3aGlsZSAodHJ1ZSkgZG8iIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoZmllbGRfLlR5cGVfID0gVFR5cGUuU3RvcCkgdGhlbiIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiQnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJjYXNlIGZpZWxkXy5JRCBvZiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgfQorCisgICAgZmlyc3QgPSBmYWxzZTsKKyAgICBpZiAoZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7CisgICAgICBjb2RlX2Jsb2NrIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoZmllbGRfLlR5cGVfID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHRoZW4gYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGNvZGVfYmxvY2ssIGlzX2V4Y2VwdGlvbiwgKmZfaXRlciwgIlNlbGYuIiwgbG9jYWxfdmFycyk7CisKKyAgICAvLyByZXF1aXJlZCBmaWVsZD8KKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIl9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIDo9IFRSVUU7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kIGVsc2UgYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZF8uVHlwZV8pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQiOworICB9CisKKyAgaWYgKCFmaXJzdCkgeworICAgIGNvZGVfYmxvY2sgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZWxzZSBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICB9CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGRfLlR5cGVfKTsiIDw8IGVuZGw7CisKKyAgaWYgKCFmaXJzdCkgeworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlwcm90LlJlYWRTdHJ1Y3RFbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIC8vIGFsbCByZXF1aXJlZCBmaWVsZHMgaGF2ZSBiZWVuIHJlYWQ/CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiBub3QgX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKQorICAgICAgICAgIDw8ICJ0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgiCisgICAgICAgICAgPDwgIidyZXF1aXJlZCBmaWVsZCAiIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgbm90IHNldCcpOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBzdHJpbmcgY2xzX25tOworCisgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSwgaXNfZXhjZXB0aW9uLCBpc19leGNlcHRpb24pOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuUmVhZCggY29uc3QgaXByb3Q6IElQcm90b2NvbCk7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmllbGRfIDogVFRocmlmdEZpZWxkOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBUVGhyaWZ0U3RydWN0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBvdXQgPDwgbG9jYWxfdmFycy5zdHIoKSA8PCBlbmRsOworICBvdXQgPDwgY29kZV9ibG9jay5zdHIoKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIG9zdHJpbmdzdHJlYW0gbG9jYWxfdmFyczsKKyAgb3N0cmluZ3N0cmVhbSBjb2RlX2Jsb2NrOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgInRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRyYWNrZXIgOj0gb3Byb3QuTmV4dFJlY3Vyc2lvbkxldmVsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIHN0cnVjLCAnIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBmaWVsZF8pOyIgPDwgZW5kbDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIikgdGhlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5OYW1lIDo9ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLlR5cGVfICA6PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uSUQgOj0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGRfKTsiIDw8IGVuZGw7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoY29kZV9ibG9jaywgaXNfZXhjZXB0aW9uLCAqZl9pdGVyLCAiU2VsZi4iLCBsb2NhbF92YXJzKTsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIH0KKyAgfQorCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBzdHJpbmcgY2xzX25tOworCisgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSwgaXNfZXhjZXB0aW9uLCBpc19leGNlcHRpb24pOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInN0cnVjIDogVFRocmlmdFN0cnVjdDsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmllbGRfIDogVFRocmlmdEZpZWxkOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBsb2NhbF92YXJzLnN0cigpOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIG91dCA8PCBjb2RlX2Jsb2NrLnN0cigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKworICBvc3RyaW5nc3RyZWFtIGxvY2FsX3ZhcnM7CisgIG9zdHJpbmdzdHJlYW0gY29kZV9ibG9jazsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKGxvY2FsX3ZhcnMpIDw8ICJ0cmFja2VyIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0cmFja2VyIDo9IG9wcm90Lk5leHRSZWN1cnNpb25MZXZlbDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBzdHJ1YywgJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggZmllbGRfKTsiIDw8IGVuZGw7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmaWVsZG5hbWUgPSBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pOworICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGJvb2wgaXNfcmVxdWlyZWQgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7CisgICAgYm9vbCBoYXNfaXNzZXQgPSAoIWlzX3JlcXVpcmVkKTsKKyAgICBpZiAoaXNfcmVxdWlyZWQgJiYgbnVsbF9hbGxvd2VkKSB7CisgICAgICBudWxsX2FsbG93ZWQgPSBmYWxzZTsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoU2VsZi4iIDw8IGZpZWxkbmFtZSA8PCAiID0gbmlsKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJ3JlcXVpcmVkIGZpZWxkICIgPDwgZmllbGRuYW1lIDw8ICIgbm90IHNldCcpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoU2VsZi4iIDw8IGZpZWxkbmFtZSA8PCAiIDw+IG5pbCkiOworICAgICAgaWYgKGhhc19pc3NldCkgeworICAgICAgICBjb2RlX2Jsb2NrIDw8ICIgYW5kIF9faXNzZXRfIiA8PCBmaWVsZG5hbWU7CisgICAgICB9CisgICAgICBjb2RlX2Jsb2NrIDw8ICIgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChoYXNfaXNzZXQpIHsKKyAgICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChfX2lzc2V0XyIgPDwgZmllbGRuYW1lIDw8ICIpIHRoZW4gYmVnaW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICB9CisgICAgfQorICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uTmFtZSA6PSAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uVHlwZV8gIDo9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLklEIDo9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZF8pOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoY29kZV9ibG9jaywgaXNfZXhjZXB0aW9uLCAqZl9pdGVyLCAiU2VsZi4iLCBsb2NhbF92YXJzKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgICBpZiAobnVsbF9hbGxvd2VkIHx8IGhhc19pc3NldCkgeworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0cmluZyBjbHNfbm07CisKKyAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5Xcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBUVGhyaWZ0U3RydWN0OyIgPDwgZW5kbDsKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmllbGRfIDogVFRocmlmdEZpZWxkOyIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgbG9jYWxfdmFycy5zdHIoKTsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBvdXQgPDwgY29kZV9ibG9jay5zdHIoKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmdfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBjbHNfbm07CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCAoIWlzX3hfZmFjdG9yeSksIGlzX3hfZmFjdG9yeSwgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIHN0cmluZyB0bXBfc2IgPSB0bXAoIl9zYiIpOworICBzdHJpbmcgdG1wX2ZpcnN0ID0gdG1wKCJfZmlyc3QiKTsKKyAgYm9vbCB1c2VGaXJzdEZsYWcgPSBmYWxzZTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuVG9TdHJpbmc6IHN0cmluZzsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIiA6IFRUaHJpZnRTdHJpbmdCdWlsZGVyOyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGlzX29wdGlvbmFsID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfZmlyc3QgPDwgIiA6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgICAgIHVzZUZpcnN0RmxhZyA9IHRydWU7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIiA6PSBUVGhyaWZ0U3RyaW5nQnVpbGRlci5DcmVhdGUoJygnKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpZiAodXNlRmlyc3RGbGFnKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfZmlyc3QgPDwgIiA6PSBUUlVFOyIgPDwgZW5kbDsKKyAgfQorCisgIGJvb2wgaGFkX3JlcXVpcmVkID0gZmFsc2U7IC8vIHNldCB0byB0cnVlIGFmdGVyIGZpcnN0IHJlcXVpcmVkIGZpZWxkIGhhcyBiZWVuIHByb2Nlc3NlZAorCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgYm9vbCBpc19vcHRpb25hbCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiAoU2VsZi4iIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIiA8PiBuaWwpIjsKKyAgICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgICBvdXQgPDwgIiBhbmQgX19pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgfQorICAgICAgb3V0IDw8ICIgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiAoX19pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIpIHRoZW4gYmVnaW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodXNlRmlyc3RGbGFnICYmICghaGFkX3JlcXVpcmVkKSkgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgbm90ICIgPDwgdG1wX2ZpcnN0IDw8ICIgdGhlbiAiIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCgnLCcpOyIgPDwgZW5kbDsKKyAgICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9maXJzdCA8PCAiIDo9IEZBTFNFOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCciIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIjogJyk7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCgnLCAiIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIjogJyk7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiAoU2VsZi4iIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIiA9IG5pbCkgdGhlbiAiIDw8IHRtcF9zYgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLkFwcGVuZCgnPG51bGw+JykgZWxzZSAiIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCggU2VsZi4iCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIi5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZChTeXN0ZW0uSW50ZWdlciggU2VsZi4iIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIikpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoIFNlbGYuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAobnVsbF9hbGxvd2VkIHx8IGlzX29wdGlvbmFsKSB7CisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghaXNfb3B0aW9uYWwpIHsKKyAgICAgIGhhZF9yZXF1aXJlZCA9IHRydWU7IC8vIG5vdyBfX2ZpcnN0IG11c3QgYmUgZmFsc2UsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQgYW55bW9yZQorICAgIH0KKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCcpJyk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCB0bXBfc2IgPDwgIi5Ub1N0cmluZzsiIDw8IGVuZGw7CisgIGlmICh1c2VGaXJzdEZsYWcpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiAiIDw8IHRtcF9maXJzdCA8PCAiIHRoZW4ge3ByZXZlbnQgd2FybmluZ307IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkZyZWU7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK2Jvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjppc192b2lkKHRfdHlwZSogdHlwZSkgeworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBkZWxwaGksCisgICAgImRlbHBoaSIsCisgICAgIiAgICBhbnNpc3RyX2JpbmFyeTogIFVzZSBBbnNpU3RyaW5nIGZvciBiaW5hcnkgZGF0YXR5cGUgKGRlZmF1bHQgaXMgVEJ5dGVzKS5cbiIKKyAgICAiICAgIHJlZ2lzdGVyX3R5cGVzOiAgRW5hYmxlIFR5cGVSZWdpc3RyeSwgYWxsb3dzIGZvciBjcmVhdGlvbiBvZiBzdHJ1Y3QsIHVuaW9uXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIGFuZCBjb250YWluZXIgaW5zdGFuY2VzIGJ5IGludGVyZmFjZSBvciBUeXBlSW5mbygpXG4iCisgICAgIiAgICBjb25zdHByZWZpeDogICAgIE5hbWUgVENvbnN0YW50cyBjbGFzc2VzIGFmdGVyIElETCB0byByZWR1Y2UgYW1iaWd1aXRpZXNcbiIKKyAgICAiICAgIGV2ZW50czogICAgICAgICAgRW5hYmxlIGFuZCB1c2UgcHJvY2Vzc2luZyBldmVudHMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLlxuIgorICAgICIgICAgeG1sZG9jOiAgICAgICAgICBFbmFibGUgWE1MRG9jIGNvbW1lbnRzIGZvciBIZWxwIEluc2lnaHQgZXRjLlxuIgorICAgICIgICAgYXN5bmM6ICAgICAgICAgICBHZW5lcmF0ZSBJQXN5bmMgaW50ZXJmYWNlIHRvIHVzZSBQYXJhbGxlbCBQcm9ncmFtbWluZyBMaWJyYXJ5IChYRTcrIG9ubHkpLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzMxZWNjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTI4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEVybGFuZyBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfZXJsX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfZXJsX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGxlZ2FjeV9uYW1lc18gPSBmYWxzZTsKKyAgICBtYXBzXyA9IGZhbHNlOworICAgIG90cDE2XyA9IGZhbHNlOworICAgIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOworICAgIGV4cG9ydF90eXBlc19saW5lc19maXJzdF8gPSB0cnVlOworCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibGVnYWN5bmFtZXMiKSA9PSAwKSB7CisgICAgICAgIGxlZ2FjeV9uYW1lc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJtYXBzIikgPT0gMCkgeworICAgICAgICBtYXBzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm90cDE2IikgPT0gMCkgeworICAgICAgICBvdHAxNl8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGVybDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG1hcHNfICYmIG90cDE2XykgeworICAgICAgdGhyb3cgImFyZ3VtZW50IGVycm9yOiBDYW5ub3Qgc3BlY2lmeSBib3RoIG1hcHMgYW5kIG90cDE2OyBtYXBzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBFcmxhbmcvT1RQIFIxNiBvciBvbGRlciI7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZXJsIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9tZW1iZXJfdHlwZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9tZW1iZXJfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfdHlwZSh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfdmFsdWUodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyByZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgLy8gIHN0ZDo6c3RyaW5nIHJlbmRlcl9kZWZhdWx0X3ZhbHVlKHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBzdGQ6OnN0cmluZyByZW5kZXJfdHlwZV90ZXJtKHRfdHlwZSogdHR5cGUsIGJvb2wgZXhwYW5kX3N0cnVjdHMsIGJvb2wgZXh0ZW5kZWRfaW5mbyA9IGZhbHNlKTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0X21lbWJlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdG1lbWJlcik7CisgIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV90eXBlX21ldGFkYXRhKHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX25hbWUsIHZlY3RvcjxzdHJpbmc+IG5hbWVzKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX2luZm8odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfZW51bV9tZXRhZGF0YSgpOworICB2b2lkIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9uKHRfY29uc3QqIHRjb25zdCwgb3N0cmluZ3N0cmVhbSYgZXhwb3J0cywgb3N0cmluZ3N0cmVhbSYgZnVuY3Rpb25zKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbnMoKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX21ldGFkYXRhKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2luZm8odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgZXJsX2F1dG9nZW5fY29tbWVudCgpOworICBzdGQ6OnN0cmluZyBlcmxfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfbGlzdF92YWx1ZXModF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbW9kdWxlKHRfdHlwZSogdHR5cGUpOworCisgIHN0ZDo6c3RyaW5nIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBpZiAobGVnYWN5X25hbWVzXykgeworICAgICAgcmV0dXJuIGRlY2FwaXRhbGl6ZShpbik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB1bmRlcnNjb3JlKGluKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBhdG9taWZ5KHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaWYgKGxlZ2FjeV9uYW1lc18pIHsKKyAgICAgIHJldHVybiAiJyIgKyBkZWNhcGl0YWxpemUoaW4pICsgIiciOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIiciICsgaW4gKyAiJyI7CisgICAgfQorICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RpZnkoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBpZiAobGVnYWN5X25hbWVzXykgeworICAgICAgcmV0dXJuIGNhcGl0YWxpemUoaW4pOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdXBwZXJjYXNlKGluKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgY29tbWVudChzdHJpbmcgaW4pOworCitwcml2YXRlOgorICBib29sIGhhc19kZWZhdWx0X3ZhbHVlKHRfZmllbGQqKTsKKworICAvKiBpZiB0cnVlIHJldGFpbiBwcmUgMC45LjIgbmFtaW5nIHNjaGVtZSBmb3IgZnVuY3Rpb25zLCBhdG9tcyBhbmQgY29uc3RzICovCisgIGJvb2wgbGVnYWN5X25hbWVzXzsKKworICAvKiBpZiB0cnVlIHVzZSBtYXBzIGluc3RlYWQgb2YgZGljdHMgaW4gZ2VuZXJhdGVkIGNvZGUgKi8KKyAgYm9vbCBtYXBzXzsKKworICAvKiBpZiB0cnVlIHVzZSBub24tbmFtZXNwYWNlZCBkaWN0IGFuZCBzZXQgaW5zdGVhZCBvZiBkaWN0OmRpY3QgYW5kIHNldHM6c2V0ICovCisgIGJvb2wgb3RwMTZfOworCisgIC8qKgorICAgKiBhZGQgZnVuY3Rpb24gdG8gZXhwb3J0IGxpc3QKKyAgICovCisKKyAgdm9pZCBleHBvcnRfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZXhwb3J0X3N0cmluZyhzdGQ6OnN0cmluZyBuYW1lLCBpbnQgbnVtKTsKKworICB2b2lkIGV4cG9ydF90eXBlc19zdHJpbmcoc3RkOjpzdHJpbmcgbmFtZSwgaW50IG51bSk7CisKKyAgLyoqCisgICAqIHdyaXRlIG91dCBoZWFkZXJzIGFuZCBmb290ZXJzIGZvciBocmwgZmlsZXMKKyAgICovCisKKyAgdm9pZCBocmxfaGVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgdm9pZCBocmxfZm9vdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKKworICAvKioKKyAgICogc3R1ZmYgdG8gc3BpdCBvdXQgYXQgdGhlIHRvcCBvZiBnZW5lcmF0ZWQgZmlsZXMKKyAgICovCisKKyAgYm9vbCBleHBvcnRfbGluZXNfZmlyc3RfOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZXhwb3J0X2xpbmVzXzsKKworICBib29sIGV4cG9ydF90eXBlc19saW5lc19maXJzdF87CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBleHBvcnRfdHlwZXNfbGluZXNfOworCisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfaW5mb187CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX2luZm9fZXh0XzsKKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfZmlsZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19ocmxfZmlsZV87CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c19maWxlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c19ocmxfZmlsZV87CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlX2ZpbGVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV9ocmxfOworCisgIC8qKgorICAgKiBNZXRhZGF0YSBjb250YWluZXJzCisgICAqLworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdl9zdHJ1Y3RfbmFtZXNfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdl9lbnVtX25hbWVzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZfZXhjZXB0aW9uX25hbWVzXzsKKyAgc3RkOjp2ZWN0b3I8dF9lbnVtKj4gdl9lbnVtc187CisgIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiB2X2NvbnN0c187Cit9OworCisvKioKKyAqIFVJIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIHNldHVwIGV4cG9ydCBsaW5lcworICBleHBvcnRfbGluZXNfZmlyc3RfID0gdHJ1ZTsKKyAgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XyA9IHRydWU7CisKKyAgc3RyaW5nIHByb2dyYW1fbW9kdWxlX25hbWUgPSBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pOworCisgIC8vIHR5cGVzIGZpbGVzCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9tb2R1bGVfbmFtZSArICJfdHlwZXMuZXJsIjsKKyAgc3RyaW5nIGZfdHlwZXNfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9tb2R1bGVfbmFtZSArICJfdHlwZXMuaHJsIjsKKworICBmX3R5cGVzX2ZpbGVfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBmX3R5cGVzX2hybF9maWxlXy5vcGVuKGZfdHlwZXNfaHJsX25hbWUuY19zdHIoKSk7CisKKyAgaHJsX2hlYWRlcihmX3R5cGVzX2hybF9maWxlXywgcHJvZ3JhbV9tb2R1bGVfbmFtZSArICJfdHlwZXMiKTsKKworICBmX3R5cGVzX2ZpbGVfIDw8IGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIi1tb2R1bGUoIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfdHlwZXMpLiIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGVybF9pbXBvcnRzKCkgPDwgZW5kbDsKKworICBmX3R5cGVzX2ZpbGVfIDw8ICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9tb2R1bGVfbmFtZSA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgZl90eXBlc19ocmxfZmlsZV8gPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKKworICAvLyBjb25zdHMgZmlsZXMKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9tb2R1bGVfbmFtZSArICJfY29uc3RhbnRzLmVybCI7CisgIHN0cmluZyBmX2NvbnN0c19ocmxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl9jb25zdGFudHMuaHJsIjsKKworICBmX2NvbnN0c19maWxlXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisgIGZfY29uc3RzX2hybF9maWxlXy5vcGVuKGZfY29uc3RzX2hybF9uYW1lLmNfc3RyKCkpOworCisgIGZfY29uc3RzX2ZpbGVfIDw8IGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8ICItbW9kdWxlKCIgPDwgcHJvZ3JhbV9tb2R1bGVfbmFtZSA8PCAiX2NvbnN0YW50cykuIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGVybF9pbXBvcnRzKCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCAiLWluY2x1ZGUoXCIiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl90eXBlcy5ocmxcIikuIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgZl9jb25zdHNfaHJsX2ZpbGVfIDw8IGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IGVybF9pbXBvcnRzKCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgPDwgIi1pbmNsdWRlKFwiIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEJvaWxlcnBsYXRlIGF0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGhlYWRlciBmaWxlcworICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6aHJsX2hlYWRlcihvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lKSB7CisgIG91dCA8PCAiLWlmbmRlZihfIiA8PCBuYW1lIDw8ICJfaW5jbHVkZWQpLiIgPDwgZW5kbCA8PCAiLWRlZmluZShfIiA8PCBuYW1lIDw8ICJfaW5jbHVkZWQsIHllYWgpLiIKKyAgICAgIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpocmxfZm9vdGVyKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgb3V0IDw8ICItZW5kaWYuIiA8PCBlbmRsOworfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGZvciAoYXV0byBpbmNsdWRlIDogaW5jbHVkZXMpIHsKKyAgICByZXN1bHQgKz0gIi1pbmNsdWRlKFwiIiArIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUoaW5jbHVkZS0+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+Z2V0X25hbWUoKTsKK30KKworc3RkOjpzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX21vZHVsZSh0X3R5cGUqIHR0eXBlKSB7CisgIHJldHVybiBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSArICJfdHlwZXMiOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGVybCwKKyAgICAiRXJsYW5nIiwKKyAgICAiICAgIGxlZ2FjeW5hbWVzOiAgICAgT3V0cHV0IGZpbGVzIHJldGFpbiBuYW1pbmcgY29udmVudGlvbnMgb2YgVGhyaWZ0IDAuOS4xIGFuZCBlYXJsaWVyLlxuIgorICAgICIgICAgbWFwczogICAgICAgICAgICBHZW5lcmF0ZSBtYXBzIGluc3RlYWQgb2YgZGljdHMuXG4iCisgICAgIiAgICBvdHAxNjogICAgICAgICAgIEdlbmVyYXRlIG5vbi1uYW1lc3BhY2VkIGRpY3QgYW5kIHNldCBpbnN0ZWFkIG9mIGRpY3Q6ZGljdCBhbmQgc2V0czpzZXQuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTNmNWRkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLyoqCisgKiBUb3AgbGV2ZWwgcHJvZ3JhbSBnZW5lcmF0aW9uIGZ1bmN0aW9uLiBDYWxscyB0aGUgZ2VuZXJhdG9yIHN1YmNsYXNzIG1ldGhvZHMKKyAqIGZvciBwcmVwYXJpbmcgZmlsZSBzdHJlYW1zIGV0Yy4gdGhlbiBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgcGFydHMgb2YgdGhlCisgKiBwcm9ncmFtIHRvIHBlcmZvcm0gdGhlIGNvcnJlY3QgYWN0aW9ucy4KKyAqCisgKiBAcGFyYW0gcHJvZ3JhbSBUaGUgdGhyaWZ0IHByb2dyYW0gdG8gY29tcGlsZSBpbnRvIEMrKyBzb3VyY2UKKyAqLwordm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2VuZXJhdG9yCisgIGluaXRfZ2VuZXJhdG9yKCk7CisKKyAgLy8gR2VuZXJhdGUgZW51bXMKKyAgdmVjdG9yPHRfZW51bSo+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+IG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3ZjcxMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0dFTkVSQVRPUl9SRUdJU1RSWV9ICisjZGVmaW5lIFRfR0VORVJBVE9SX1JFR0lTVFJZX0gKKworY2xhc3MgdF9nZW5lcmF0b3I7CisKKy8qKgorICogQSBmYWN0b3J5IGZvciBwcm9kdWNpbmcgZ2VuZXJhdG9yIGNsYXNzZXMgb2YgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgYWxzbyByZXNwb25zaWJsZSBmb3I6CisgKiAgLSBSZWdpc3RlcmluZyBpdHNlbGYgd2l0aCB0aGUgZ2VuZXJhdG9yIHJlZ2lzdHJ5LgorICogIC0gUHJvdmlkaW5nIGRvY3VtZW50YXRpb24gZm9yIHRoZSBnZW5lcmF0b3JzIGl0IHByb2R1Y2VzLgorICovCitjbGFzcyB0X2dlbmVyYXRvcl9mYWN0b3J5IHsKK3B1YmxpYzoKKyAgdF9nZW5lcmF0b3JfZmFjdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgc2hvcnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKTsKKworICB2aXJ0dWFsIH50X2dlbmVyYXRvcl9mYWN0b3J5KCkgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IoCisgICAgICAvLyBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZS4KKyAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgIC8vIE5vdGU6IHBhcnNlZF9vcHRpb25zIHdpbGwgbm90IGV4aXN0IGJleW9uZCB0aGUgY2FsbCB0byBnZXRfZ2VuZXJhdG9yLgorICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAvLyBOb3RlOiBvcHRpb25fc3RyaW5nIG1pZ2h0IG5vdCBleGlzdCBiZXlvbmQgdGhlIGNhbGwgdG8gZ2V0X2dlbmVyYXRvci4KKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKSA9IDA7CisKKyAgdmlydHVhbCBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgPSAwOworCisgIHN0ZDo6c3RyaW5nIGdldF9zaG9ydF9uYW1lKCkgeyByZXR1cm4gc2hvcnRfbmFtZV87IH0KKyAgc3RkOjpzdHJpbmcgZ2V0X2xvbmdfbmFtZSgpIHsgcmV0dXJuIGxvbmdfbmFtZV87IH0KKyAgc3RkOjpzdHJpbmcgZ2V0X2RvY3VtZW50YXRpb24oKSB7IHJldHVybiBkb2N1bWVudGF0aW9uXzsgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBzaG9ydF9uYW1lXzsKKyAgc3RkOjpzdHJpbmcgbG9uZ19uYW1lXzsKKyAgc3RkOjpzdHJpbmcgZG9jdW1lbnRhdGlvbl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgZ2VuZXJhdG9yPgorY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnkgeworcHVibGljOgorICB0X2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwoY29uc3Qgc3RkOjpzdHJpbmcmIHNob3J0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pCisgICAgOiB0X2dlbmVyYXRvcl9mYWN0b3J5KHNob3J0X25hbWUsIGxvbmdfbmFtZSwgZG9jdW1lbnRhdGlvbikge30KKworICB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbmV3IGdlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgIH0KKworICBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZW5lcmF0b3I6OmlzX3ZhbGlkX25hbWVzcGFjZShzdWJfbmFtZXNwYWNlKTsKKyAgfQorfTsKKworY2xhc3MgdF9nZW5lcmF0b3JfcmVnaXN0cnkgeworcHVibGljOgorICBzdGF0aWMgdm9pZCByZWdpc3Rlcl9nZW5lcmF0b3IodF9nZW5lcmF0b3JfZmFjdG9yeSogZmFjdG9yeSk7CisKKyAgc3RhdGljIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMpOworICBzdGF0aWMgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhdWduYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucyk7CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9nZW5lcmF0b3JfZmFjdG9yeSo+IGdlbl9tYXBfdDsKKyAgc3RhdGljIGdlbl9tYXBfdCYgZ2V0X2dlbmVyYXRvcl9tYXAoKTsKKworcHJpdmF0ZToKKyAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoKTsKKyAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoY29uc3QgdF9nZW5lcmF0b3JfcmVnaXN0cnkmKTsKK307CisKKyNkZWZpbmUgVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihsYW5ndWFnZSwgbG9uZ19uYW1lLCBkb2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgdF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbDx0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3I+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsPHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcj4oI2xhbmd1YWdlLCBsb25nX25hbWUsIGRvYykge30gICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwgX3JlZ2lzdGVyZXI7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmJiNjUzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzNzE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvZ3JhbW1hdGljYWxseSBzYW5pdGl6ZWQgZm9yIHN0eWxlOgorICogYXN0eWxlIC0tc3R5bGU9MXRicyAtZiAtcCAtSCAtaiAtVSB0X2dvX2dlbmVyYXRvci5jYworICoKKyAqIFRoZSBvdXRwdXQgb2YgYXN0eWxlIHNob3VsZCBub3QgYmUgdGFrZW4gdW5xdWVzdGlvbmluZ2x5LCBidXQgaXQgaXMgYSBnb29kCisgKiBndWlkZSBmb3IgZW5zdXJpbmcgdW5pZm9ybWl0eSBhbmQgcmVhZGFiaWxpdHkuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNsb2NhbGU+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBBIGhlbHBlciBmb3IgYXV0b21hdGljYWxseSBmb3JtYXR0aW5nIHRoZSBlbWl0dGVkIEdvIGNvZGUgZnJvbSB0aGUgVGhyaWZ0CisgKiBJREwgcGVyIHRoZSBHbyBzdHlsZSBndWlkZS4KKyAqCisgKiBSZXR1cm5zOgorICogIC0gdHJ1ZSwgaWYgdGhlIGZvcm1hdHRpbmcgcHJvY2VzcyBzdWNjZWVkZWQuCisgKiAgLSBmYWxzZSwgaWYgdGhlIGZvcm1hdHRpbmcgcHJvY2VzcyBmYWlsZWQsIHdoaWNoIG1lYW5zIHRoZSBiYXNpYyBvdXRwdXQgd2FzCisgKiAgICAgICAgICAgc3RpbGwgZ2VuZXJhdGVkLgorICovCitib29sIGZvcm1hdF9nb19vdXRwdXQoY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgpOworCitjb25zdCBzdHJpbmcgREVGQVVMVF9USFJJRlRfSU1QT1JUID0gImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IjsKK3N0YXRpYyBzdGQ6OnN0cmluZyBwYWNrYWdlX2ZsYWc7CisKKy8qKgorICogR28gY29kZSBnZW5lcmF0b3IuCisgKi8KK2NsYXNzIHRfZ29fZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9nb19nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisKKyAgICBnZW5fdGhyaWZ0X2ltcG9ydF8gPSBERUZBVUxUX1RIUklGVF9JTVBPUlQ7CisgICAgZ2VuX3BhY2thZ2VfcHJlZml4XyA9ICIiOworICAgIHBhY2thZ2VfZmxhZyA9ICIiOworICAgIHJlYWRfd3JpdGVfcHJpdmF0ZV8gPSBmYWxzZTsKKyAgICBpZ25vcmVfaW5pdGlhbGlzbXNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicGFja2FnZV9wcmVmaXgiKSA9PSAwKSB7CisgICAgICAgIGdlbl9wYWNrYWdlX3ByZWZpeF8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidGhyaWZ0X2ltcG9ydCIpID09IDApIHsKKyAgICAgICAgZ2VuX3RocmlmdF9pbXBvcnRfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInBhY2thZ2UiKSA9PSAwKSB7CisgICAgICAgIHBhY2thZ2VfZmxhZyA9IChpdGVyLT5zZWNvbmQpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJyZWFkX3dyaXRlX3ByaXZhdGUiKSA9PSAwKSB7CisgICAgICAgIHJlYWRfd3JpdGVfcHJpdmF0ZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJpZ25vcmVfaW5pdGlhbGlzbXMiKSA9PSAwKSB7CisgICAgICAgIGlnbm9yZV9pbml0aWFsaXNtc18gPSAgdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBnbzoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZ28iOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpIG92ZXJyaWRlOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBjb25zdCBzdHJpbmcmIG5hbWUsIGJvb2wgb3B0ID0gZmFsc2UpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfaGVscGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb3VudHNldGZpZWxkc19oZWxwZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZXNfY291bnRzZXRmaWVsZHMgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ29fZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogT1VUX3B1Yl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiogT1VUX2RlZl92YWx1ZSkgY29uc3Q7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29lcmNlRGF0YSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5rZXkgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5rZXkgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgZ29fYXV0b2dlbl9jb21tZW50KCk7CisgIHN0ZDo6c3RyaW5nIGdvX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgZ29faW1wb3J0c19iZWdpbihib29sIGNvbnN0cyk7CisgIHN0ZDo6c3RyaW5nIGdvX2ltcG9ydHNfZW5kKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcyhib29sIGNvbnN0cyk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlZF9wcm9ncmFtcyhzdHJpbmcmIHVudXNlZF9wcm90ZWN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2ltcG9ydF9wcm90ZWN0aW9uKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2ZpZWxkX2luaXRpYWxfdmFsdWUodF9maWVsZCogdGZpZWxkLCBjb25zdCBzdHJpbmcmIG5hbWUsIGJvb2wgb3B0aW9uYWxfZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIG1vZHVsZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkRXJyb3IgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZ29fdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19nb190eXBlX3dpdGhfb3B0KHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsX2ZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19nb19rZXlfdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSk7CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldF9yZWFsX2dvX21vZHVsZShjb25zdCB0X3Byb2dyYW0qIHByb2dyYW0pIHsKKworICAgIGlmICghcGFja2FnZV9mbGFnLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwYWNrYWdlX2ZsYWc7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiZ28iKTsKKyAgICBpZiAoIXJlYWxfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiByZWFsX21vZHVsZTsKKyAgICB9CisKKyAgICByZXR1cm4gbG93ZXJjYXNlKHByb2dyYW0tPmdldF9uYW1lKCkpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGdlbl9wYWNrYWdlX3ByZWZpeF87CisgIHN0ZDo6c3RyaW5nIGdlbl90aHJpZnRfaW1wb3J0XzsKKyAgYm9vbCByZWFkX3dyaXRlX3ByaXZhdGVfOworICBib29sIGlnbm9yZV9pbml0aWFsaXNtc187CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBzdGQ6OnN0cmluZyBmX3R5cGVzX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgc3RkOjpzdHJpbmcgZl9jb25zdHNfbmFtZV87CisgIHN0ZDo6c3RyaW5nc3RyZWFtIGZfY29uc3RfdmFsdWVzXzsKKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisgIHN0ZDo6c3RyaW5nIHJlYWRfbWV0aG9kX25hbWVfOworICBzdGQ6OnN0cmluZyB3cml0ZV9tZXRob2RfbmFtZV87CisKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvbW1vbkluaXRpYWxpc21zOworCisgIHN0ZDo6c3RyaW5nIGNhbWVsY2FzZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0OworICB2b2lkIGZpeF9jb21tb25faW5pdGlhbGlzbShzdGQ6OnN0cmluZyYgdmFsdWUsIGludCBpKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgcHVibGljaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCA9IGZhbHNlKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgcHJpdmF0aXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIG5ld19wcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdDsKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGF0aWMgYm9vbCBpc19wb2ludGVyX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7CisgIHN0YXRpYyBib29sIG9taXRfaW5pdGlhbGl6YXRpb24odF9maWVsZCogdGZpZWxkKTsKK307CisKKy8vIHJldHVybnMgdHJ1ZSBpZiBmaWVsZCBpbml0aWFsaXphdGlvbiBjYW4gYmUgb21pdHRlZCBzaW5jZSBpdCBoYXMgY29ycmVzcG9uZGluZyBnbyB0eXBlIHplcm8gdmFsdWUKKy8vIG9yIGRlZmF1bHQgdmFsdWUgaXMgbm90IHNldAorYm9vbCB0X2dvX2dlbmVyYXRvcjo6b21pdF9pbml0aWFsaXphdGlvbih0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0ZmllbGQtPmdldF92YWx1ZSgpOworICBpZiAoIXZhbHVlKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIC8vW11ieXRlIGFyZSBhbHdheXMgaW5saW5lCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vIHN0cmluZ3MgYXJlIHBvaW50ZXJzIGlmIGhhcyBubyBkZWZhdWx0CisgICAgICByZXR1cm4gdmFsdWUtPmdldF9zdHJpbmcoKS5lbXB0eSgpOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gdmFsdWUtPmdldF9pbnRlZ2VyKCkgPT0gMDsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA9PSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfZG91YmxlKCkgPT0gMC47CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIG5lZWQgYSByZWZlcmVuY2UgaWYgdXNlZCBhcyBvcHRpb25hbCB3aXRob3V0IGRlZmF1bHQKK3N0YXRpYyBib29sIHR5cGVfbmVlZF9yZWZlcmVuY2UodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSB0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgIGlmICh0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc3RydWN0KCkKKyAgICAgIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHJldHVybnMgZmFsc2UgaWYgZmllbGQgY291bGQgbm90IHVzZSBjb21wYXJpc29uIHRvIGRlZmF1bHQgdmFsdWUgYXMgIUlzU2V0KgorYm9vbCB0X2dvX2dlbmVyYXRvcjo6aXNfcG9pbnRlcl9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5fY29udGFpbmVyX3ZhbHVlKSB7CisgICh2b2lkKWluX2NvbnRhaW5lcl92YWx1ZTsKKyAgaWYgKHRmaWVsZC0+YW5ub3RhdGlvbnNfLmNvdW50KCJjcHAucmVmIikgIT0gMCkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICAvLyBTdHJ1Y3RzIGluIGNvbnRhaW5lcnMgYXJlIHBvaW50ZXJzCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKCEodGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYm9vbCBoYXNfZGVmYXVsdCA9IHRmaWVsZC0+Z2V0X3ZhbHVlKCk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIC8vW11ieXRlIGFyZSBhbHdheXMgaW5saW5lCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vIHN0cmluZ3MgYXJlIHBvaW50ZXJzIGlmIGhhcyBubyBkZWZhdWx0CisgICAgICByZXR1cm4gIWhhc19kZWZhdWx0OworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIWhhc19kZWZhdWx0OworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIWhhc19kZWZhdWx0OworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiBoYXNfZGVmYXVsdDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiBoYXNfZGVmYXVsdDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gaGFzX2RlZmF1bHQ7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGhhc19kZWZhdWx0OworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2dvX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6Y2FtZWxjYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3QgeworICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpOworICBzdGQ6OnNldGxvY2FsZShMQ19BTEwsICJDIik7IC8vIHNldCBsb2NhbGUgdG8gY2xhc3NpYworCisgIC8vIEZpeCBjb21tb24gaW5pdGlhbGlzbSBpbiBmaXJzdCB3b3JkCisgIGZpeF9jb21tb25faW5pdGlhbGlzbSh2YWx1ZTIsIDApOworCisgIC8vIGFzIGxvbmcgYXMgd2UgYXJlIGNoYW5naW5nIHRoaW5ncywgbGV0J3MgY2hhbmdlIF8gZm9sbG93ZWQgYnkgbG93ZXJjYXNlIHRvCisgIC8vIGNhcGl0YWwgYW5kIGZpeCBjb21tb24gaW5pdGlhbGlzbXMKKyAgZm9yIChzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGkgPSAxOyBpIDwgdmFsdWUyLnNpemUoKSAtIDE7ICsraSkgeworICAgIGlmICh2YWx1ZTJbaV0gPT0gJ18nKSB7CisgICAgICBpZiAoaXNsb3dlcih2YWx1ZTJbaSArIDFdKSkgeworICAgICAgICB2YWx1ZTIucmVwbGFjZShpLCAyLCAxLCB0b3VwcGVyKHZhbHVlMltpICsgMV0pKTsKKyAgICAgIH0KKworICAgICAgaWYgKGkgPiBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZzo6c2l6ZV90eXBlPihzdGQ6Om51bWVyaWNfbGltaXRzPGludD4oKS5tYXgoKSkpIHsKKyAgICAgICAgdGhyb3cgImludGVnZXIgb3ZlcmZsb3cgaW4gdF9nb19nZW5lcmF0b3I6OmNhbWVsY2FzZSwgdmFsdWUgPSAiICsgdmFsdWU7CisgICAgICB9CisgICAgICBmaXhfY29tbW9uX2luaXRpYWxpc20odmFsdWUyLCBzdGF0aWNfY2FzdDxpbnQ+KGkpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdmFsdWUyOworfQorCisvLyBDaGVja3MgdG8gc2VlIGlmIHRoZSB3b3JkIHN0YXJ0aW5nIGF0IGkgaW4gdmFsdWUgY29udGFpbnMgYSBjb21tb24gaW5pdGlhbGlzbQorLy8gYW5kIGlmIHNvIHJlcGxhY2VzIGl0IHdpdGggdGhlIHVwcGVyIGNhc2UgdmVyc2lvbiBvZiB0aGUgd29yZC4KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmZpeF9jb21tb25faW5pdGlhbGlzbShzdGQ6OnN0cmluZyYgdmFsdWUsIGludCBpKSBjb25zdCB7CisgIGlmICghaWdub3JlX2luaXRpYWxpc21zXykgeworICAgIHNpemVfdCB3b3JkTGVuID0gdmFsdWUuZmluZCgnXycsIGkpOworICAgIGlmICh3b3JkTGVuICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICB3b3JkTGVuIC09IGk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHdvcmQgPSB2YWx1ZS5zdWJzdHIoaSwgd29yZExlbik7CisgICAgc3RkOjp0cmFuc2Zvcm0od29yZC5iZWdpbigpLCB3b3JkLmVuZCgpLCB3b3JkLmJlZ2luKCksIDo6dG91cHBlcik7CisgICAgaWYgKGNvbW1vbkluaXRpYWxpc21zLmZpbmQod29yZCkgIT0gY29tbW9uSW5pdGlhbGlzbXMuZW5kKCkpIHsKKyAgICAgIHZhbHVlLnJlcGxhY2UoaSwgd29yZC5sZW5ndGgoKSwgd29yZCk7CisgICAgfQorICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpwdWJsaWNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBib29sIGlzX2FyZ3Nfb3JfcmVzdWx0KSBjb25zdCB7CisgIGlmICh2YWx1ZS5zaXplKCkgPD0gMCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHZhbHVlMih2YWx1ZSksIHByZWZpeDsKKworICBzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gdmFsdWUucmZpbmQoJy4nKTsKKyAgaWYgKGRvdF9wb3MgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcHJlZml4ID0gdmFsdWUuc3Vic3RyKDAsIGRvdF9wb3MgKyAxKSArIHByZWZpeDsKKyAgICB2YWx1ZTIgPSB2YWx1ZS5zdWJzdHIoZG90X3BvcyArIDEpOworICB9CisKKyAgaWYgKCFpc3VwcGVyKHZhbHVlMlswXSkpIHsKKyAgICB2YWx1ZTJbMF0gPSB0b3VwcGVyKHZhbHVlMlswXSk7CisgIH0KKworICB2YWx1ZTIgPSBjYW1lbGNhc2UodmFsdWUyKTsKKworICAvLyBmaW5hbCBsZW5ndGggYmVmb3JlIGZ1cnRoZXIgY2hlY2tzLCB0aGUgc3RyaW5nIG1heSBiZWNvbWUgbG9uZ2VyCisgIHNpemVfdCBsZW5fYmVmb3JlID0gdmFsdWUyLmxlbmd0aCgpOworCisgIC8vIElETCBpZGVudGlmaWVycyBtYXkgc3RhcnQgd2l0aCAiTmV3IiB3aGljaCBpbnRlcmZlcmVzIHdpdGggdGhlIENUT1IgcGF0dGVybgorICAvLyBBZGRpbmcgYW4gZXh0cmEgdW5kZXJzY29yZSB0byBhbGwgdGhvc2UgaWRlbnRpZmllcnMgc29sdmVzIHRoaXMKKyAgaWYgKChsZW5fYmVmb3JlID49IDMpICYmICh2YWx1ZTIuc3Vic3RyKDAsIDMpID09ICJOZXciKSkgeworICAgIHZhbHVlMiArPSAnXyc7CisgIH0KKworICAvLyBJREwgaWRlbnRpZmllcnMgbWF5IGVuZCB3aXRoICJBcmdzIi8iUmVzdWx0IiB3aGljaCBpbnRlcmZlcmVzIHdpdGggdGhlIGltcGxpY2l0IHNlcnZpY2UKKyAgLy8gZnVuY3Rpb24gc3RydWN0cworICAvLyBBZGRpbmcgYW5vdGhlciBleHRyYSB1bmRlcnNjb3JlIHRvIGFsbCB0aG9zZSBpZGVudGlmaWVycyBzb2x2ZXMgdGhpcworICAvLyBTdXBwcmVzcyB0aGlzIGNoZWNrIGZvciB0aGUgYWN0dWFsIGhlbHBlciBzdHJ1Y3QgbmFtZXMKKyAgaWYgKCFpc19hcmdzX29yX3Jlc3VsdCkgeworICAgIGJvb2wgZW5kc193aXRoX2FyZ3MgPSAobGVuX2JlZm9yZSA+PSA0KSAmJiAodmFsdWUyLnN1YnN0cihsZW5fYmVmb3JlIC0gNCwgNCkgPT0gIkFyZ3MiKTsKKyAgICBib29sIGVuZHNfd2l0aF9yc2x0ID0gKGxlbl9iZWZvcmUgPj0gNikgJiYgKHZhbHVlMi5zdWJzdHIobGVuX2JlZm9yZSAtIDYsIDYpID09ICJSZXN1bHQiKTsKKyAgICBpZiAoZW5kc193aXRoX2FyZ3MgfHwgZW5kc193aXRoX3JzbHQpIHsKKyAgICAgIHZhbHVlMiArPSAnXyc7CisgICAgfQorICB9CisKKyAgLy8gQXZvaWQgbmFtaW5nIGNvbGxpc2lvbnMgd2l0aCBvdGhlciBzZXJ2aWNlcworICBpZiAoaXNfYXJnc19vcl9yZXN1bHQpIHsKKyAgICBwcmVmaXggKz0gcHVibGljaXplKHNlcnZpY2VfbmFtZV8pOworICB9CisKKyAgcmV0dXJuIHByZWZpeCArIHZhbHVlMjsKK30KKworc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6Om5ld19wcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdCB7CisgIGlmICh2YWx1ZS5zaXplKCkgPD0gMCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHN0cmluZzo6c2l6ZV90eXBlIGRvdF9wb3MgPSB2YWx1ZS5yZmluZCgnLicpOworICBpZiAoZG90X3BvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXR1cm4gdmFsdWUuc3Vic3RyKDAsIGRvdF9wb3MgKyAxKSArICJOZXciICsgcHVibGljaXplKHZhbHVlLnN1YnN0cihkb3RfcG9zICsgMSkpOworICB9CisgIHJldHVybiAiTmV3IiArIHB1YmxpY2l6ZSh2YWx1ZSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpwcml2YXRpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdCB7CisgIGlmICh2YWx1ZS5zaXplKCkgPD0gMCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHZhbHVlMih2YWx1ZSk7CisKKyAgaWYgKCFpc2xvd2VyKHZhbHVlMlswXSkpIHsKKyAgICB2YWx1ZTJbMF0gPSB0b2xvd2VyKHZhbHVlMlswXSk7CisgIH0KKworICB2YWx1ZTIgPSBjYW1lbGNhc2UodmFsdWUyKTsKKworICByZXR1cm4gdmFsdWUyOworfQorCitzdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dmFyaWFibGVfbmFtZV90b19nb19uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBpZiAodmFsdWUuc2l6ZSgpIDw9IDApIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpOworICBzdGQ6OnRyYW5zZm9ybSh2YWx1ZTIuYmVnaW4oKSwgdmFsdWUyLmVuZCgpLCB2YWx1ZTIuYmVnaW4oKSwgOjp0b2xvd2VyKTsKKworICBzd2l0Y2ggKHZhbHVlWzBdKSB7CisgIGNhc2UgJ2InOgorICBjYXNlICdCJzoKKyAgICBpZiAodmFsdWUyICE9ICJicmVhayIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdjJzoKKyAgY2FzZSAnQyc6CisgICAgaWYgKHZhbHVlMiAhPSAiY2FzZSIgJiYgdmFsdWUyICE9ICJjaGFuIiAmJiB2YWx1ZTIgIT0gImNvbnN0IiAmJiB2YWx1ZTIgIT0gImNvbnRpbnVlIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2QnOgorICBjYXNlICdEJzoKKyAgICBpZiAodmFsdWUyICE9ICJkZWZhdWx0IiAmJiB2YWx1ZTIgIT0gImRlZmVyIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2UnOgorICBjYXNlICdFJzoKKyAgICBpZiAodmFsdWUyICE9ICJlbHNlIiAmJiB2YWx1ZTIgIT0gImVycm9yIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2YnOgorICBjYXNlICdGJzoKKyAgICBpZiAodmFsdWUyICE9ICJmYWxsdGhyb3VnaCIgJiYgdmFsdWUyICE9ICJmb3IiICYmIHZhbHVlMiAhPSAiZnVuYyIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdnJzoKKyAgY2FzZSAnRyc6CisgICAgaWYgKHZhbHVlMiAhPSAiZ28iICYmIHZhbHVlMiAhPSAiZ290byIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdpJzoKKyAgY2FzZSAnSSc6CisgICAgaWYgKHZhbHVlMiAhPSAiaWYiICYmIHZhbHVlMiAhPSAiaW1wb3J0IiAmJiB2YWx1ZTIgIT0gImludGVyZmFjZSIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdtJzoKKyAgY2FzZSAnTSc6CisgICAgaWYgKHZhbHVlMiAhPSAibWFwIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ3AnOgorICBjYXNlICdQJzoKKyAgICBpZiAodmFsdWUyICE9ICJwYWNrYWdlIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ3InOgorICBjYXNlICdSJzoKKyAgICBpZiAodmFsdWUyICE9ICJyYW5nZSIgJiYgdmFsdWUyICE9ICJyZXR1cm4iKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAncyc6CisgIGNhc2UgJ1MnOgorICAgIGlmICh2YWx1ZTIgIT0gInNlbGVjdCIgJiYgdmFsdWUyICE9ICJzdHJ1Y3QiICYmIHZhbHVlMiAhPSAic3dpdGNoIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ3QnOgorICBjYXNlICdUJzoKKyAgICBpZiAodmFsdWUyICE9ICJ0eXBlIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ3YnOgorICBjYXNlICdWJzoKKyAgICBpZiAodmFsdWUyICE9ICJ2YXIiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICByZXR1cm4gdmFsdWUyICsgIl9hMSI7Cit9CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgc3RyaW5nIG1vZHVsZSA9IGdldF9yZWFsX2dvX21vZHVsZShwcm9ncmFtXyk7CisgIHN0cmluZyB0YXJnZXQgPSBtb2R1bGU7CisgIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7CisKKyAgLy8gVGhpcyBzZXQgaXMgdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZ29sYW5nL2xpbnQvYmxvYi9tYXN0ZXIvbGludC5nbyNMNjkyCisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiQVBJIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiQVNDSUkiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJDUFUiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJDU1MiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJETlMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJFT0YiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJHVUlEIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSFRNTCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkhUVFAiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJIVFRQUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIklEIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSVAiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJKU09OIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiTEhTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiUVBTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiUkFNIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiUkhTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiUlBDIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiU0xBIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiU01UUCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlNTSCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlRDUCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlRMUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlRUTCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVEUCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVJIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVUlEIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVVJRCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVSSSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVSTCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVURjgiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJWTSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlhNTCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlhTUkYiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJYU1MiKTsKKworICAvLyBuYW1lcyBvZiByZWFkIGFuZCB3cml0ZSBtZXRob2RzCisgIGlmIChyZWFkX3dyaXRlX3ByaXZhdGVfKSB7CisgICAgcmVhZF9tZXRob2RfbmFtZV8gPSAicmVhZCI7CisgICAgd3JpdGVfbWV0aG9kX25hbWVfID0gIndyaXRlIjsKKyAgfSBlbHNlIHsKKyAgICByZWFkX21ldGhvZF9uYW1lXyA9ICJSZWFkIjsKKyAgICB3cml0ZV9tZXRob2RfbmFtZV8gPSAiV3JpdGUiOworICB9CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICAvLyBUT0RPOiBEbyBiZXR0ZXIgZXJyb3IgY2hlY2tpbmcgaGVyZS4KKyAgICBNS0RJUihwYWNrYWdlX2Rpcl8uY19zdHIoKSk7CisKKyAgICBpZiAobW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IG1vZHVsZS5maW5kKCcuJyk7CisKKyAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgcGFja2FnZV9kaXJfICs9ICIvIjsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSBtb2R1bGU7CisgICAgICBwYWNrYWdlX25hbWVfID0gbW9kdWxlOworICAgICAgbW9kdWxlLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlLnN1YnN0cigwLCBwb3MpOworICAgICAgbW9kdWxlLmVyYXNlKDAsIHBvcyArIDEpOworICAgIH0KKyAgfQorCisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICB3aGlsZSAoKGxvYyA9IHRhcmdldC5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHRhcmdldC5yZXBsYWNlKGxvYywgMSwgMSwgJy8nKTsKKyAgfQorCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGVzCisgIGZfdHlwZXNfbmFtZV8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIi5nbyI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lXyk7CisKKyAgZl9jb25zdHNfbmFtZV8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIi1jb25zdHMuZ28iOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lXyk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpIDw8IGdvX3BhY2thZ2UoKSA8PCByZW5kZXJfaW5jbHVkZXMoZmFsc2UpOworCisgIGZfY29uc3RzXyA8PCBnb19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBnb19wYWNrYWdlKCkgPDwgcmVuZGVyX2luY2x1ZGVzKHRydWUpOworCisgIGZfY29uc3RfdmFsdWVzXyA8PCBlbmRsIDw8ICJmdW5jIGluaXQoKSB7IiA8PCBlbmRsOworCisgIC8vIENyZWF0ZSBmaWxlIGZvciB0aGUgR29VbnVzZWRQcm90ZWN0aW9uX18gdmFyaWFibGUKKyAgc3RyaW5nIGZfdW51c2VkX3Byb3RfbmFtZV8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAiR29VbnVzZWRQcm90ZWN0aW9uX18uZ28iOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdW51c2VkX3Byb3RfOworICBmX3VudXNlZF9wcm90Xy5vcGVuKGZfdW51c2VkX3Byb3RfbmFtZV8uY19zdHIoKSk7CisgIGZfdW51c2VkX3Byb3RfIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpIDw8IGdvX3BhY2thZ2UoKSA8PCByZW5kZXJfaW1wb3J0X3Byb3RlY3Rpb24oKTsKKyAgZl91bnVzZWRfcHJvdF8uY2xvc2UoKTsKK30KKworCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlZF9wcm9ncmFtcyhzdHJpbmcmIHVudXNlZF9wcm90ZWN0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICB1bnVzZWRfcHJvdGVjdGlvbiA9ICIiOworCisgIHN0cmluZyBsb2NhbF9uYW1lc3BhY2UgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZ28iKTsKKyAgZm9yIChhdXRvIGluY2x1ZGUgOiBpbmNsdWRlcykgeworICAgIGlmICghbG9jYWxfbmFtZXNwYWNlLmVtcHR5KCkgJiYgbG9jYWxfbmFtZXNwYWNlID09IGluY2x1ZGUtPmdldF9uYW1lc3BhY2UoImdvIikpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHN0cmluZyBnb19tb2R1bGUgPSBnZXRfcmVhbF9nb19tb2R1bGUoaW5jbHVkZSk7CisgICAgc2l6ZV90IGZvdW5kID0gMDsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGdvX21vZHVsZS5zaXplKCk7IGorKykgeworICAgICAgLy8gSW1wb3J0IHN0YXRlbWVudCB1c2VzIHNsYXNoZXMgKCcvJykgaW4gbmFtZXNwYWNlCisgICAgICBpZiAoZ29fbW9kdWxlW2pdID09ICcuJykgeworICAgICAgICBnb19tb2R1bGVbal0gPSAnLyc7CisgICAgICAgIGZvdW5kID0gaiArIDE7CisgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ICs9ICJcdFwiIiArIGdlbl9wYWNrYWdlX3ByZWZpeF8gKyBnb19tb2R1bGUgKyAiXCJcbiI7CisgICAgdW51c2VkX3Byb3RlY3Rpb24gKz0gInZhciBfID0gIiArIGdvX21vZHVsZS5zdWJzdHIoZm91bmQpICsgIi5Hb1VudXNlZFByb3RlY3Rpb25fX1xuIjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbS4KKyAqIElmIGNvbnN0cyBpbmNsdWRlIHRoZSBhZGRpdGlvbmFsIGltcG9ydHMuCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKGJvb2wgY29uc3RzKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgc3RyaW5nIHVudXNlZF9wcm90ID0gIiI7CisKKyAgc3RyaW5nIGxvY2FsX25hbWVzcGFjZSA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJnbyIpOworICBmb3IgKGF1dG8gaW5jbHVkZSA6IGluY2x1ZGVzKSB7CisgICAgaWYgKCFsb2NhbF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBsb2NhbF9uYW1lc3BhY2UgPT0gaW5jbHVkZS0+Z2V0X25hbWVzcGFjZSgiZ28iKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgc3RyaW5nIGdvX21vZHVsZSA9IGdldF9yZWFsX2dvX21vZHVsZShpbmNsdWRlKTsKKyAgICBzaXplX3QgZm91bmQgPSAwOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZ29fbW9kdWxlLnNpemUoKTsgaisrKSB7CisgICAgICAvLyBJbXBvcnQgc3RhdGVtZW50IHVzZXMgc2xhc2hlcyAoJy8nKSBpbiBuYW1lc3BhY2UKKyAgICAgIGlmIChnb19tb2R1bGVbal0gPT0gJy4nKSB7CisgICAgICAgIGdvX21vZHVsZVtqXSA9ICcvJzsKKyAgICAgICAgZm91bmQgPSBqICsgMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQgKz0gIlx0XCIiICsgZ2VuX3BhY2thZ2VfcHJlZml4XyArIGdvX21vZHVsZSArICJcIlxuIjsKKyAgICB1bnVzZWRfcHJvdCArPSAidmFyIF8gPSAiICsgZ29fbW9kdWxlLnN1YnN0cihmb3VuZCkgKyAiLkdvVW51c2VkUHJvdGVjdGlvbl9fXG4iOworICB9CisKKyAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgKz0gIlxuIjsKKyAgfQorCisgIHJldHVybiBnb19pbXBvcnRzX2JlZ2luKGNvbnN0cykgKyByZXN1bHQgKyBnb19pbXBvcnRzX2VuZCgpICsgdW51c2VkX3Byb3Q7Cit9CisKK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2ltcG9ydF9wcm90ZWN0aW9uKCkgeworICByZXR1cm4gc3RyaW5nKCJ2YXIgR29VbnVzZWRQcm90ZWN0aW9uX18gaW50O1xuXG4iKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBhY2NlbGVyYXRlZCBUQmluYXJ5UHJvdG9jb2wKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIHsKKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29fYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4KKyAgICAgICAgc3RkOjpzdHJpbmcoKSArCisgICAgICAgICIvLyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgIi8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcblxuIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IHBhY2thZ2UKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpnb19wYWNrYWdlKCkgeworICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICJcblxuIjsKK30KKworLyoqCisgKiBSZW5kZXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW1wb3J0IHN0YXRlbWVudC4KKyAqIElmIGNvbnN0cyBpbmNsdWRlIHRoZSBhZGRpdGlvbmFsIGltcG9ydHMuCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29faW1wb3J0c19iZWdpbihib29sIGNvbnN0cykgeworICBzdHJpbmcgZXh0cmE7CisKKyAgLy8gSWYgbm90IHdyaXRpbmcgY29uc3RhbnRzLCBhbmQgdGhlcmUgYXJlIGVudW1zLCBuZWVkIGV4dHJhIGltcG9ydHMuCisgIGlmICghY29uc3RzICYmIGdldF9wcm9ncmFtKCktPmdldF9lbnVtcygpLnNpemUoKSA+IDApIHsKKyAgICBleHRyYSArPQorICAgICAgIlx0XCJkYXRhYmFzZS9zcWwvZHJpdmVyXCJcbiIKKyAgICAgICJcdFwiZXJyb3JzXCJcbiI7CisgIH0KKyAgcmV0dXJuIHN0cmluZygKKyAgICAgICJpbXBvcnQgKFxuIgorICAgICAgIlx0XCJieXRlc1wiXG4iCisgICAgICAiXHRcImNvbnRleHRcIlxuIgorICAgICAgIlx0XCJyZWZsZWN0XCJcbiIKKyAgICAgICsgZXh0cmEgKworICAgICAgIlx0XCJmbXRcIlxuIgorICAgICAgIlx0XCIiICsgZ2VuX3RocmlmdF9pbXBvcnRfICsgIlwiXG4iKTsKK30KKworLyoqCisgKiBFbmQgdGhlIGltcG9ydCBzdGF0ZW1lbnQsIGluY2x1ZGUgdW5kc2NvcmUtYXNzaWdubWVudHMKKyAqCisgKiBUaGVzZSAiXyA9IiBwcmV2ZW50IHRoZSBnbyBjb21waWxlciBjb21wbGFpbmluZyBhYm91dCB1bnVzZWQgaW1wb3J0cy4KKyAqIFRoaXMgd2lsbCBoYXZlIHRvIGRvIGluIGxpZXUgb2YgbW9yZSBpbnRlbGxpZ2VudCBpbXBvcnQgc3RhdGVtZW50IGNvbnN0cnVjdGlvbgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2ltcG9ydHNfZW5kKCkgeworICByZXR1cm4gc3RyaW5nKAorICAgICAgIilcblxuIgorICAgICAgIi8vIChuZWVkZWQgdG8gZW5zdXJlIHNhZmV0eSBiZWNhdXNlIG9mIG5haXZlIGltcG9ydCBsaXN0IGNvbnN0cnVjdGlvbi4pXG4iCisgICAgICAidmFyIF8gPSB0aHJpZnQuWkVST1xuIgorICAgICAgInZhciBfID0gZm10LlByaW50ZlxuIgorICAgICAgInZhciBfID0gY29udGV4dC5CYWNrZ3JvdW5kXG4iCisgICAgICAidmFyIF8gPSByZWZsZWN0LkRlZXBFcXVhbFxuIgorICAgICAgInZhciBfID0gYnl0ZXMuRXF1YWxcblxuIik7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl9jb25zdF92YWx1ZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfY29uc3RzXyA8PCBmX2NvbnN0X3ZhbHVlc18uc3RyKCk7CisKKyAgLy8gQ2xvc2UgdHlwZXMgYW5kIGNvbnN0YW50cyBmaWxlcworICBmX2NvbnN0c18uY2xvc2UoKTsKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZm9ybWF0X2dvX291dHB1dChmX3R5cGVzX25hbWVfKTsKKyAgZm9ybWF0X2dvX291dHB1dChmX2NvbnN0c19uYW1lXyk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0dHlwZWRlZik7CisgIHN0cmluZyBuZXdfdHlwZV9uYW1lKHB1YmxpY2l6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpKTsKKyAgc3RyaW5nIGJhc2VfdHlwZSh0eXBlX3RvX2dvX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpKTsKKworICBpZiAoYmFzZV90eXBlID09IG5ld190eXBlX25hbWUpIHsKKyAgICByZXR1cm47CisgIH0KKworICBmX3R5cGVzXyA8PCAidHlwZSAiIDw8IG5ld190eXBlX25hbWUgPDwgIiAiIDw8IGJhc2VfdHlwZSA8PCBlbmRsIDw8IGVuZGw7CisgIC8vIEdlbmVyYXRlIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBhbiBpbnN0YW5jZSBvZiBhIHR5cGUKKyAgLy8gKHdoaWNoIG1heSBiZSBhIGNvbnN0YW50KSBpbnRvIGEgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBvZiBhIHR5cGUuCisgIGZfdHlwZXNfIDw8ICJmdW5jICIgPDwgbmV3X3R5cGVfbmFtZSA8PCAiUHRyKHYgIiA8PCBuZXdfdHlwZV9uYW1lIDw8ICIpICoiIDw8IG5ld190eXBlX25hbWUKKyAgICAgICAgICAgPDwgIiB7IHJldHVybiAmdiB9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSB0b19zdHJpbmdfbWFwcGluZywgZnJvbV9zdHJpbmdfbWFwcGluZzsKKyAgc3RkOjpzdHJpbmcgdGVudW1fbmFtZShwdWJsaWNpemUodGVudW0tPmdldF9uYW1lKCkpKTsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0ZW51bSk7CisgIGZfdHlwZXNfIDw8ICJ0eXBlICIgPDwgdGVudW1fbmFtZSA8PCAiIGludDY0IiA8PCBlbmRsIDw8ICJjb25zdCAoIiA8PCBlbmRsOworCisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICIgPDwgdGVudW1fbmFtZSA8PCAiKSBTdHJpbmcoKSBzdHJpbmcgeyIgPDwgZW5kbDsKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgc3dpdGNoIHAgeyIgPDwgZW5kbDsKKworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJmdW5jICIgPDwgdGVudW1fbmFtZSA8PCAiRnJvbVN0cmluZyhzIHN0cmluZykgKCIgPDwgdGVudW1fbmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGVycm9yKSB7IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIHN3aXRjaCBzIHsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBpbnQgdmFsdWUgPSAtMTsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIHN0cmluZyBpdGVyX3N0ZF9uYW1lKGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSk7CisgICAgc3RyaW5nIGl0ZXJfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgdGVudW1fbmFtZSA8PCAiXyIgPDwgaXRlcl9uYW1lIDw8ICcgJyA8PCB0ZW51bV9uYW1lIDw8ICIgPSAiCisgICAgICAgICAgICAgPDwgdmFsdWUgPDwgZW5kbDsKKyAgICAvLyBEaWN0aW9uYXJpZXMgdG8vZnJvbSBzdHJpbmcgbmFtZXMgb2YgZW51bXMKKyAgICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlICIgPDwgdGVudW1fbmFtZSA8PCAiXyIgPDwgaXRlcl9uYW1lIDw8ICI6IHJldHVybiBcIiIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIiIgPDwgZW5kbDsKKworICAgIGlmIChpdGVyX3N0ZF9uYW1lICE9IGVzY2FwZV9zdHJpbmcoaXRlcl9uYW1lKSkgeworICAgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlIFwiIiA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIiwgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcoaXRlcl9uYW1lKSA8PCAiXCI6IHJldHVybiAiIDw8IHRlbnVtX25hbWUgPDwgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGl0ZXJfbmFtZSA8PCAiLCBuaWwgIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIGNhc2UgXCIiIDw8IGl0ZXJfc3RkX25hbWUgPDwgIlwiOiByZXR1cm4gIiA8PCB0ZW51bV9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJfIiA8PCBpdGVyX25hbWUgPDwgIiwgbmlsICIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gXCI8VU5TRVQ+XCIiIDw8IGVuZGw7CisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgdGVudW1fbmFtZSA8PCAiKDApLCIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZtdC5FcnJvcmYoXCJub3QgYSB2YWxpZCAiIDw8IHRlbnVtX25hbWUgPDwgIiBzdHJpbmdcIikiIDw8IGVuZGw7CisgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgZl90eXBlc18gPDwgIikiIDw8IGVuZGwgPDwgZW5kbCA8PCB0b19zdHJpbmdfbWFwcGluZy5zdHIoKSA8PCBlbmRsIDw8IGZyb21fc3RyaW5nX21hcHBpbmcuc3RyKCkKKyAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBhbiBpbnN0YW5jZSBvZiBhbiBlbnVtCisgIC8vICh3aGljaCBtYXkgYmUgYSBjb25zdGFudCkgaW50byBhIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgdGhhdCBlbnVtCisgIC8vIHR5cGUuCisgIGZfdHlwZXNfIDw8ICJmdW5jICIgPDwgdGVudW1fbmFtZSA8PCAiUHRyKHYgIiA8PCB0ZW51bV9uYW1lIDw8ICIpICoiIDw8IHRlbnVtX25hbWUKKyAgICAgICAgICAgPDwgIiB7IHJldHVybiAmdiB9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgTWFyc2hhbFRleHQKKyAgZl90eXBlc18gPDwgImZ1bmMgKHAgIiA8PCB0ZW51bV9uYW1lIDw8ICIpIE1hcnNoYWxUZXh0KCkgKFtdYnl0ZSwgZXJyb3IpIHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJyZXR1cm4gW11ieXRlKHAuU3RyaW5nKCkpLCBuaWwiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgVW5tYXJzaGFsVGV4dAorICBmX3R5cGVzXyA8PCAiZnVuYyAocCAqIiA8PCB0ZW51bV9uYW1lIDw8ICIpIFVubWFyc2hhbFRleHQodGV4dCBbXWJ5dGUpIGVycm9yIHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJxLCBlcnIgOj0gIiA8PCB0ZW51bV9uYW1lIDw8ICJGcm9tU3RyaW5nKHN0cmluZyh0ZXh0KSkiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJpZiAoZXJyICE9IG5pbCkgeyIgPDwgZW5kbCA8PCAicmV0dXJuIGVyciIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIipwID0gcSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgU2NhbiBmb3Igc3FsLlNjYW5uZXIgaW50ZXJmYWNlCisgIGZfdHlwZXNfIDw8ICJmdW5jIChwICoiIDw8IHRlbnVtX25hbWUgPDwgIikgU2Nhbih2YWx1ZSBpbnRlcmZhY2V7fSkgZXJyb3IgeyIgPDxlbmRsOworICBmX3R5cGVzXyA8PCAidiwgb2sgOj0gdmFsdWUuKGludDY0KSIgPDxlbmRsOworICBmX3R5cGVzXyA8PCAiaWYgIW9rIHsiIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgInJldHVybiBlcnJvcnMuTmV3KFwiU2NhbiB2YWx1ZSBpcyBub3QgaW50NjRcIikiIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgIn0iIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgIipwID0gIiA8PCB0ZW51bV9uYW1lIDw8ICIodikiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIFZhbHVlIGZvciBkcml2ZXIuVmFsdWVyIGludGVyZmFjZQorICBmX3R5cGVzXyA8PCAiZnVuYyAocCAqICIgPDwgdGVudW1fbmFtZSA8PCAiKSBWYWx1ZSgpIChkcml2ZXIuVmFsdWUsIGVycm9yKSB7IiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICIgIGlmIHAgPT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICIgICAgcmV0dXJuIG5pbCwgbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiICB9IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAicmV0dXJuIGludDY0KCpwKSwgbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKKworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSBwdWJsaWNpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KGZfY29uc3RzXykgPDwgImNvbnN0ICIgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUsIG5hbWUpIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9jb25zdF92YWx1ZXNfIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlLCBuYW1lKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBmX2NvbnN0c18gPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IG5hbWUgPDwgIiAiIDw8IHR5cGVfdG9fZ29fdHlwZSh0eXBlKSA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lLCBib29sIG9wdCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBpZiAob3B0KSB7CisgICAgICBvdXQgPDwgIiYoJnN0cnVjdHt4ICI7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBvdXQgPDwgImJvb2x9eyI7CisgICAgICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIG91dCA8PCAiaW50OH17IjsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIG91dCA8PCAiaW50MTZ9eyI7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBvdXQgPDwgImludDMyfXsiOworICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgb3V0IDw8ICJpbnQ2NH17IjsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgb3V0IDw8ICJmbG9hdDY0fXsiOworICAgICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBvdXQgPDwgInN0cmluZ317IjsKKyAgICAgICAgICBvdXQgPDwgJyInICsgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSArICciJzsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgICAgb3V0IDw8ICJ9KS54IjsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIG91dCA8PCAiW11ieXRlKFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICJcIikiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgaWYgKG9wdCkgeworICAgICAgICAgICAgb3V0IDw8ICImKCZzdHJ1Y3R7eCBpbnR9eyI7CisgICAgICAgICAgfQorICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBpZiAob3B0KSB7CisgICAgICAgICAgICBvdXQgPDwgIn0pLngiOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICImIiA8PCBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKSA8PCAieyI7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGJvb2wgaXNfb3B0aW9uYWwgPSBmYWxzZTsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICBpc19vcHRpb25hbCA9IGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHVibGljaXplKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCwgbmFtZSwgaXNfb3B0aW9uYWwpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8ICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG91dCA8PCAibWFwWyIgPDwgdHlwZV90b19nb190eXBlKGt0eXBlKSA8PCAiXSIgPDwgdHlwZV90b19nb190eXBlKHZ0eXBlKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QsIG5hbWUpIDw8ICI6ICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kLCBuYW1lKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIG91dCA8PCAiW10iIDw8IHR5cGVfdG9fZ29fdHlwZShldHlwZSkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIsIG5hbWUpIDw8ICIsICI7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgb3V0IDw8ICJbXSIgPDwgdHlwZV90b19nb19rZXlfdHlwZShldHlwZSkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIsIG5hbWUpIDw8ICIsICI7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBnbyBzdHJ1Y3QKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2dvX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZ28gc3RydWN0CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBPVVRfcHViX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSoqIE9VVF9kZWZfdmFsdWUpIGNvbnN0IHsKKyAgY29uc3Qgc3RyaW5nIGJhc2VfZmllbGRfbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfZmllbGRfbmFtZSA9IGVzY2FwZV9zdHJpbmcoYmFzZV9maWVsZF9uYW1lKTsKKyAgKk9VVF9wdWJfbmFtZSA9IHB1YmxpY2l6ZShlc2NhcGVkX2ZpZWxkX25hbWUpOworICAqT1VUX2RlZl92YWx1ZSA9IHRmaWVsZC0+Z2V0X3ZhbHVlKCk7Cit9CisKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCkgeworICBvdXQgPDwgcHVibGljaXplKHR5cGVfbmFtZSh0c3RydWN0KSwgaXNfYXJnc19vcl9yZXN1bHQpIDw8ICJ7IjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGZvciAoYXV0byBtZW1iZXIgOiBtZW1iZXJzKSB7CisgICAgYm9vbCBwb2ludGVyX2ZpZWxkID0gaXNfcG9pbnRlcl9maWVsZChtZW1iZXIpOworICAgIHN0cmluZyBwdWJsaWNpemVkX25hbWU7CisgICAgdF9jb25zdF92YWx1ZSogZGVmX3ZhbHVlOworICAgIGdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZShtZW1iZXIsICZwdWJsaWNpemVkX25hbWUsICZkZWZfdmFsdWUpOworICAgIGlmICghcG9pbnRlcl9maWVsZCAmJiBkZWZfdmFsdWUgIT0gTlVMTCAmJiAhb21pdF9pbml0aWFsaXphdGlvbihtZW1iZXIpKSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwdWJsaWNpemVkX25hbWUgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9maWVsZF9pbml0aWFsX3ZhbHVlKG1lbWJlciwgbWVtYmVyLT5nZXRfbmFtZSgpLCBwb2ludGVyX2ZpZWxkKSA8PCAiLCIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FyZ3MpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHNvcnRlZF9tZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCksIGlzX2FyZ3MgfHwgaXNfcmVzdWx0KSk7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCB0c3RydWN0X25hbWUgPDwgIiBzdHJ1Y3QgeyIgPDwgZW5kbDsKKyAgLyoKKyAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgorICAgICBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICAgICB0aHJpZnRfc3BlYyAtPiB0dXBsZSBvZiBpdGVtX3NwZWMKKyAgICAgaXRlbV9zcGVjIC0+IG5pbCB8ICh0YWcsIHR5cGVfZW51bSwgbmFtZSwgc3BlY19hcmdzLCBkZWZhdWx0KQorICAgICB0YWcgLT4gaW50ZWdlcgorICAgICB0eXBlX2VudW0gLT4gVFR5cGUuSTMyIHwgVFR5cGUuU1RSSU5HIHwgVFR5cGUuU1RSVUNUIHwgLi4uCisgICAgIG5hbWUgLT4gc3RyaW5nX2xpdGVyYWwKKyAgICAgZGVmYXVsdCAtPiBuaWwgICMgSGFuZGxlZCBieSBfX2luaXRfXworICAgICBzcGVjX2FyZ3MgLT4gbmlsICAjIEZvciBzaW1wbGUgdHlwZXMKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncywgdHlwZV9lbnVtLCBzcGVjX2FyZ3MpCisgICAgICAgICAgICAgICAgICAjIEtleSBhbmQgdmFsdWUgZm9yIG1hcAorICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KKyAgICAgY2xhc3NfbmFtZSAtPiBpZGVudGlmaWVyICAjIEJhc2ljYWxseSBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzCisgICAgIHNwZWNfYXJnc19wdHIgLT4gZXhwcmVzc2lvbiAgIyBqdXN0IGNsYXNzX25hbWUuc3BlY19hcmdzCisKKyAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KKyAgKi8KKyAgLy8gVE9ETyhkcmVpc3MpOiBMb29rIGludG8gZ2VuZXJhdGluZyBhbiBlbXB0eSB0dXBsZSBpbnN0ZWFkIG9mIG5pbAorICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCisgIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cworICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgorICBpbmRlbnRfdXAoKTsKKworICBpbnQgbnVtX3NldGFibGUgPSAwOworICBpZiAoc29ydGVkX21lbWJlcnMuZW1wdHkoKSB8fCAoc29ydGVkX21lbWJlcnNbMF0tPmdldF9rZXkoKSA+PSAwKSkgeworICAgIGludCBzb3J0ZWRfa2V5c19wb3MgPSAwOworCisgICAgZm9yIChtX2l0ZXIgPSBzb3J0ZWRfbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gc29ydGVkX21lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAvLyBTZXQgZmllbGQgdG8gb3B0aW9uYWwgaWYgZmllbGQgaXMgdW5pb24sIHRoaXMgaXMgc28gd2UgY2FuIGdldCBhCisgICAgICAvLyBwb2ludGVyIHRvIHRoZSBmaWVsZC4KKyAgICAgIGlmICh0c3RydWN0LT5pc191bmlvbigpKQorICAgICAgICAoKm1faXRlciktPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgICBpZiAoc29ydGVkX2tleXNfcG9zICE9ICgqbV9pdGVyKS0+Z2V0X2tleSgpKSB7CisgICAgICAgIGludCBmaXJzdF91bnVzZWQgPSAoc3RkOjptYXgpKDEsIHNvcnRlZF9rZXlzX3BvcysrKTsKKyAgICAgICAgd2hpbGUgKHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKSkgeworICAgICAgICAgICsrc29ydGVkX2tleXNfcG9zOworICAgICAgICB9CisgICAgICAgIGludCBsYXN0X3VudXNlZCA9IHNvcnRlZF9rZXlzX3BvcyAtIDE7CisgICAgICAgIGlmIChmaXJzdF91bnVzZWQgPCBsYXN0X3VudXNlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyB1bnVzZWQgZmllbGRzICMgIiA8PCBmaXJzdF91bnVzZWQgPDwgIiB0byAiIDw8IGxhc3RfdW51c2VkIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RfdW51c2VkID09IGxhc3RfdW51c2VkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIHVudXNlZCBmaWVsZCAjICIgPDwgZmlyc3RfdW51c2VkIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdF90eXBlKiBmaWVsZFR5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgICBzdHJpbmcgZ29UeXBlID0gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KGZpZWxkVHlwZSwgaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKSk7CisgICAgICBzdHJpbmcgZ290YWcgPSAiZGI6XCIiICsgZXNjYXBlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpICArICJcIiAiOworCisgICAgICAvLyBPbmx5IGFkZCB0aGUgYG9taXRlbXB0eWAgdGFnIGlmIHRoaXMgZmllbGQgaXMgb3B0aW9uYWwgYW5kIGhhcyBubyBkZWZhdWx0IHZhbHVlLgorICAgICAgLy8gT3RoZXJ3aXNlIGEgcHJvcGVyIHZhbHVlIGxpa2UgYGZhbHNlYCBmb3IgYSBib29sIGZpZWxkIHdpbGwgYmUgb21taXR0ZWQgZnJvbQorICAgICAgLy8gdGhlIEpTT04gb3V0cHV0IHNpbmNlIEdvIE1hcnNoYWwgd29uJ3Qgb3V0cHV0IGB6ZXJvIHZhbHVlc2AuCisgICAgICBib29sIGhhc19kZWZhdWx0ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgICAgaWYgKGlzX29wdGlvbmFsICYmICFoYXNfZGVmYXVsdCkgeworICAgICAgICBnb3RhZyArPSAianNvbjpcIiIgKyBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiLG9taXRlbXB0eVwiIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdGFnICs9ICJqc29uOlwiIiArIGVzY2FwZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSArICJcIiI7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIGZvciB1c2VyIG92ZXJyaWRlIG9mIGRiIGFuZCBqc29uIHRhZ3MgdXNpbmcgImdvLnRhZyIKKyAgICAgIHN0ZDo6bWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSAoKm1faXRlciktPmFubm90YXRpb25zXy5maW5kKCJnby50YWciKTsKKyAgICAgIGlmIChpdCAhPSAoKm1faXRlciktPmFubm90YXRpb25zXy5lbmQoKSkgeworICAgICAgICBnb3RhZyA9IGl0LT5zZWNvbmQ7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCBwdWJsaWNpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiICIgPDwgZ29UeXBlIDw8ICIgYHRocmlmdDpcIiIKKyAgICAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiLCIgPDwgc29ydGVkX2tleXNfcG9zOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgb3V0IDw8ICIscmVxdWlyZWQiOworICAgICAgfQorCisgICAgICBvdXQgPDwgIlwiICIgPDwgZ290YWcgPDwgImAiIDw8IGVuZGw7CisgICAgICBzb3J0ZWRfa2V5c19wb3MrKzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgLy8gVGhpcyBmaWxscyBpbiBkZWZhdWx0IHZhbHVlcywgYXMgb3Bwb3NlZCB0byBudWxscworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHB1YmxpY2l6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIgIgorICAgICAgICAgIDw8IHR5cGVfdG9fZ29fdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCkgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAmIjsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0IHx8IGlzX2FyZ3MpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgLy8gRGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbmFsIGZpZWxkcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIHB1YmxpY2l6ZWRfbmFtZTsKKyAgICB0X2NvbnN0X3ZhbHVlKiBkZWZfdmFsdWU7CisgICAgZ2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKCptX2l0ZXIsICZwdWJsaWNpemVkX25hbWUsICZkZWZfdmFsdWUpOworICAgIHRfdHlwZSogZmllbGRUeXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHN0cmluZyBnb1R5cGUgPSB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQoZmllbGRUeXBlLCBmYWxzZSk7CisgICAgc3RyaW5nIGRlZl92YXJfbmFtZSA9IHRzdHJ1Y3RfbmFtZSArICJfIiArIHB1YmxpY2l6ZWRfbmFtZSArICJfREVGQVVMVCI7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBkZWZfdmFyX25hbWUgPDwgIiAiIDw8IGdvVHlwZTsKKyAgICAgIGlmIChkZWZfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICBvdXQgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkVHlwZSwgZGVmX3ZhbHVlLCAoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gbnVtX3NldGFibGUgaXMgdXNlZCBmb3IgZGVjaWRpbmcgaWYgQ291bnQqIG1ldGhvZHMgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHVuaW9uIGZpZWxkcy4KKyAgICAvLyBUaGlzIGFwcGxpZXMgdG8gYWxsIG51bGxhYmxlIGZpZWxkcyBpbmNsdWRpbmcgc2xpY2VzICh1c2VkIGZvciBzZXQsIGxpc3QgYW5kIGJpbmFyeSkgYW5kIG1hcHMsIG5vdCBqdXN0IHBvaW50ZXJzLgorICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkVHlwZS0+Z2V0X3RydWVfdHlwZSgpOworICAgIGlmIChpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICBudW1fc2V0YWJsZSArPSAxOworICAgIH0KKworICAgIGlmIChpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpKSB7CisgICAgICBzdHJpbmcgZ29PcHRUeXBlID0gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KGZpZWxkVHlwZSwgdHJ1ZSk7CisgICAgICBzdHJpbmcgbWF5YmVwb2ludGVyID0gZ29PcHRUeXBlICE9IGdvVHlwZSA/ICIqIiA6ICIiOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBHZXQiIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiKCkgIgorICAgICAgICAgIDw8IGdvVHlwZSA8PCAiIHsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgIXAuSXNTZXQiIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiAiIDw8IGRlZl92YXJfbmFtZSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IG1heWJlcG9pbnRlciA8PCAicC4iIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgR2V0IiA8PCBwdWJsaWNpemVkX25hbWUgPDwgIigpICIKKyAgICAgICAgICA8PCBnb1R5cGUgPDwgIiB7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwLiIgPDwgcHVibGljaXplZF9uYW1lIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkgJiYgbnVtX3NldGFibGUgPiAwKSB7CisgICAgZ2VuZXJhdGVfY291bnRzZXRmaWVsZHNfaGVscGVyKG91dCwgdHN0cnVjdCwgdHN0cnVjdF9uYW1lLCBpc19yZXN1bHQpOworICB9CisKKyAgZ2VuZXJhdGVfaXNzZXRfaGVscGVycyhvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0LCBudW1fc2V0YWJsZSA+IDApOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiBwID09IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gXCI8bmlsPlwiIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuU3ByaW50ZihcIiIgPDwgZXNjYXBlX3N0cmluZyh0c3RydWN0X25hbWUpIDw8ICIoJSt2KVwiLCAqcCkiCisgICAgICA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBFcnJvcigpIHN0cmluZyB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5TdHJpbmcoKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgSXNTZXQgaGVscGVyIG1ldGhvZHMgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2hlbHBlcnMob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgICh2b2lkKWlzX3Jlc3VsdDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBjb25zdCBzdHJpbmcgZXNjYXBlZF90c3RydWN0X25hbWUoZXNjYXBlX3N0cmluZyh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgaXNfcG9pbnRlcl9maWVsZCgqZl9pdGVyKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBJc1NldCIgPDwgZmllbGRfbmFtZSA8PCAiKCkgYm9vbCB7IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICAgIGJvb2wgaXNfYnl0ZXNsaWNlID0gdHR5cGUtPmlzX2JpbmFyeSgpOworICAgICAgYm9vbCBjb21wYXJlX3RvX25pbF9vbmx5ID0gdHR5cGUtPmlzX3NldCgpIHx8IHR0eXBlLT5pc19saXN0KCkgfHwgdHR5cGUtPmlzX21hcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaXNfYnl0ZXNsaWNlICYmICEoKmZfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIGlmIChpc19wb2ludGVyX2ZpZWxkKCpmX2l0ZXIpIHx8IGNvbXBhcmVfdG9fbmlsX29ubHkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBuaWwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHJpbmcgZGVmX3Zhcl9uYW1lID0gdHN0cnVjdF9uYW1lICsgIl8iICsgZmllbGRfbmFtZSArICJfREVGQVVMVCI7CisgICAgICAgIGlmIChpc19ieXRlc2xpY2UpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAhYnl0ZXMuRXF1YWwocC4iIDw8IGZpZWxkX25hbWUgPDwgIiwgIiA8PCBkZWZfdmFyX25hbWUgPDwgIikiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSAiIDw8IGRlZl92YXJfbmFtZSA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBDb3VudFNldEZpZWxkcyBoZWxwZXIgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb3VudHNldGZpZWxkc19oZWxwZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgICh2b2lkKWlzX3Jlc3VsdDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBjb25zdCBzdHJpbmcgZXNjYXBlZF90c3RydWN0X25hbWUoZXNjYXBlX3N0cmluZyh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBDb3VudFNldEZpZWxkcyIgPDwgdHN0cnVjdF9uYW1lIDw8ICIoKSBpbnQgeyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImNvdW50IDo9IDAiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBjb250aW51ZTsKKworICAgIHRfdHlwZSogdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworCisgICAgaWYgKCEoaXNfcG9pbnRlcl9maWVsZCgqZl9pdGVyKSB8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfYmluYXJ5KCkpKQorICAgICAgY29udGludWU7CisKKyAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChwLklzU2V0IiA8PCBmaWVsZF9uYW1lIDw8ICIoKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNvdW50KysiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBjb3VudCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICAodm9pZClpc19yZXN1bHQ7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgIihpcHJvdCB0aHJpZnQuVFByb3RvY29sKSBlcnJvciB7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgXywgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIHJlYWQgZXJyb3I6IFwiLCBwKSwgZXJyKSIKKyAgICAgIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBkb2VzIG5vdCBoYXZlIElzU2V0IGZ1bmN0aW9ucywgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtLgorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyIGlzc2V0IiA8PCBmaWVsZF9uYW1lIDw8ICIgYm9vbCA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJmb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIGZpZWxkVHlwZUlkLCBmaWVsZElkLCBlcnIgOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiCisgICAgICAgICAgICAgICAgICAgICAiXCIlVCBmaWVsZCAlZCByZWFkIGVycm9yOiBcIiwgcCwgZmllbGRJZCksIGVycikiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkVHlwZUlkID09IHRocmlmdC5TVE9QIHsgYnJlYWs7IH0iIDw8IGVuZGw7CisKKyAgc3RyaW5nIHRocmlmdEZpZWxkVHlwZUlkOworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgaW50MzJfdCBmaWVsZF9pZCA9IC0xOworCisgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nLCBmYWxzZSBpZiBubyBmaWVsZHMgcHJlc2VudAorICBib29sIGhhdmVfc3dpdGNoID0gIWZpZWxkcy5lbXB0eSgpOworICBpZiAoaGF2ZV9zd2l0Y2gpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIGZpZWxkSWQgeyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEFsbCB0aGUgZmllbGRzIHdlIGtub3cKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworCisgICAgLy8gaWYgbmVnYXRpdmUgaWQsIGVuc3VyZSB3ZSBnZW5lcmF0ZSBhIHZhbGlkIG1ldGhvZCBuYW1lCisgICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIlJlYWRGaWVsZCIpOworICAgIGludDMyX3QgZmllbGRfbWV0aG9kX3N1ZmZpeCA9IGZpZWxkX2lkOworCisgICAgaWYgKGZpZWxkX21ldGhvZF9zdWZmaXggPCAwKSB7CisgICAgICBmaWVsZF9tZXRob2RfcHJlZml4ICs9ICJfIjsKKyAgICAgIGZpZWxkX21ldGhvZF9zdWZmaXggKj0gLTE7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgZmllbGRfaWQgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgdGhyaWZ0RmllbGRUeXBlSWQgPSB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKworICAgIGlmICh0aHJpZnRGaWVsZFR5cGVJZCA9PSAidGhyaWZ0LkJJTkFSWSIpIHsKKyAgICAgIHRocmlmdEZpZWxkVHlwZUlkID0gInRocmlmdC5TVFJJTkciOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZmllbGRUeXBlSWQgPT0gIiA8PCB0aHJpZnRGaWVsZFR5cGVJZCA8PCAiIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciA6PSBwLiIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9tZXRob2Rfc3VmZml4IDw8ICIoaXByb3QpOyBlcnIgIT0gbmlsIHsiCisgICAgICAgIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKworICAgIC8vIE1hcmsgcmVxdWlyZWQgZmllbGQgYXMgcmVhZAorICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaXNzZXQiIDw8IGZpZWxkX25hbWUgPDwgIiA9IHRydWUiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyIDo9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBCZWdpbiBzd2l0Y2ggZGVmYXVsdCBjYXNlCisgIGlmIChoYXZlX3N3aXRjaCkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBTa2lwIHVua25vd24gZmllbGRzIGluIGVpdGhlciBjYXNlCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZXJyIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gRW5kIHN3aXRjaCBkZWZhdWx0IGNhc2UKKyAgaWYgKGhhdmVfc3dpdGNoKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZEZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBlcnIiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIKKyAgICAgICAgICAgICAgICAgICAgICJcIiVUIHJlYWQgc3RydWN0IGVuZCBlcnJvcjogXCIsIHApLCBlcnIpIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gUmV0dXJuIGVycm9yIGlmIGFueSByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcuCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGNvbnN0IHN0cmluZyBmaWVsZF9uYW1lKHB1YmxpY2l6ZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgIWlzc2V0IiA8PCBmaWVsZF9uYW1lIDw8ICJ7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUodGhyaWZ0LklOVkFMSURfREFUQSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmbXQuRXJyb3JmKFwiUmVxdWlyZWQgZmllbGQgIiA8PCBmaWVsZF9uYW1lIDw8ICIgaXMgbm90IHNldFwiKSk7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGRfdHlwZV9uYW1lKHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpKTsKKyAgICBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7CisgICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIlJlYWRGaWVsZCIpOworICAgIGludDMyX3QgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBpbnQzMl90IGZpZWxkX21ldGhvZF9zdWZmaXggPSBmaWVsZF9pZDsKKworICAgIGlmIChmaWVsZF9tZXRob2Rfc3VmZml4IDwgMCkgeworICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7CisgICAgICBmaWVsZF9tZXRob2Rfc3VmZml4ICo9IC0xOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgICIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9tZXRob2Rfc3VmZml4CisgICAgICAgIDw8ICIoaXByb3QgdGhyaWZ0LlRQcm90b2NvbCkgZXJyb3IgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIGZhbHNlLCAicC4iKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gbmlsIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZXNfY291bnRzZXRmaWVsZHMpIHsKKyAgKHZvaWQpaXNfcmVzdWx0OworICBzdHJpbmcgbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgaW5kZW50KG91dCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgZXJyb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpICYmIHVzZXNfY291bnRzZXRmaWVsZHMpIHsKKyAgICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGMgOj0gcC5Db3VudFNldEZpZWxkcyIgPDwgdHN0cnVjdF9uYW1lIDw8ICIoKTsgYyAhPSAxIHsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcmV0dXJuIGZtdC5FcnJvcmYoXCIlVCB3cml0ZSB1bmlvbjogZXhhY3RseSBvbmUgZmllbGQgbXVzdCBiZSBzZXQgKCVkIHNldCkuXCIsIHAsIGMpIgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlU3RydWN0QmVnaW4oXCIiIDw8IG5hbWUgPDwgIlwiKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIgorICAgICAgICAgICAgICAgICAgICAgIlwiJVQgd3JpdGUgc3RydWN0IGJlZ2luIGVycm9yOiBcIiwgcCksIGVycikgfSIgPDwgZW5kbDsKKworICBzdHJpbmcgZmllbGRfbmFtZTsKKyAgc3RyaW5nIGVzY2FwZV9maWVsZF9uYW1lOworICAvLyB0X2NvbnN0X3ZhbHVlKiBmaWVsZF9kZWZhdWx0X3ZhbHVlOworICB0X2ZpZWxkOjplX3JlcSBmaWVsZF9yZXF1aXJlZDsKKyAgaW50MzJfdCBmaWVsZF9pZCA9IC0xOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgcCAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGRfbWV0aG9kX3ByZWZpeCgid3JpdGVGaWVsZCIpOworICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgZXNjYXBlX2ZpZWxkX25hbWUgPSBlc2NhcGVfc3RyaW5nKGZpZWxkX25hbWUpOworICAgIGZpZWxkX2lkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgaW50MzJfdCBmaWVsZF9tZXRob2Rfc3VmZml4ID0gZmllbGRfaWQ7CisKKyAgICBpZiAoZmllbGRfbWV0aG9kX3N1ZmZpeCA8IDApIHsKKyAgICAgIGZpZWxkX21ldGhvZF9wcmVmaXggKz0gIl8iOworICAgICAgZmllbGRfbWV0aG9kX3N1ZmZpeCAqPSAtMTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBwLiIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9tZXRob2Rfc3VmZml4CisgICAgICAgIDw8ICIob3Byb3QpOyBlcnIgIT0gbmlsIHsgcmV0dXJuIGVyciB9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRTdG9wKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwid3JpdGUgZmllbGQgc3RvcCBlcnJvcjogXCIsIGVycikgfSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJ3cml0ZSBzdHJ1Y3Qgc3RvcCBlcnJvcjogXCIsIGVycikgfSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJ3cml0ZUZpZWxkIik7CisgICAgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGVzY2FwZV9maWVsZF9uYW1lID0gZXNjYXBlX3N0cmluZyhmaWVsZF9uYW1lKTsKKyAgICAvLyBmaWVsZF9kZWZhdWx0X3ZhbHVlID0gKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBmaWVsZF9yZXF1aXJlZCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpOworICAgIGludDMyX3QgZmllbGRfbWV0aG9kX3N1ZmZpeCA9IGZpZWxkX2lkOworCisgICAgaWYgKGZpZWxkX21ldGhvZF9zdWZmaXggPCAwKSB7CisgICAgICBmaWVsZF9tZXRob2RfcHJlZml4ICs9ICJfIjsKKyAgICAgIGZpZWxkX21ldGhvZF9zdWZmaXggKj0gLTE7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSAiIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfbWV0aG9kX3N1ZmZpeAorICAgICAgICA8PCAiKG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAoZmllbGRfcmVxdWlyZWQgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBwLklzU2V0IiA8PCBwdWJsaWNpemUoZmllbGRfbmFtZSkgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oXCIiIDw8IGVzY2FwZV9maWVsZF9uYW1lIDw8ICJcIiwgIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8IGZpZWxkX2lkIDw8ICIpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgIgorICAgICAgICA8PCBmaWVsZF9pZCA8PCAiOiIgPDwgZXNjYXBlX2ZpZWxkX25hbWUgPDwgIjogXCIsIHApLCBlcnIpIH0iIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJwLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yICIKKyAgICAgICAgPDwgZmllbGRfaWQgPDwgIjoiIDw8IGVzY2FwZV9maWVsZF9uYW1lIDw8ICI6IFwiLCBwKSwgZXJyKSB9IiA8PCBlbmRsOworCisgICAgaWYgKGZpZWxkX3JlcXVpcmVkID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgdGVzdF9zdWZmaXgoIl90ZXN0Iik7CisgIHN0cmluZyBmaWxlbmFtZSA9IGxvd2VyY2FzZShzZXJ2aWNlX25hbWVfKTsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lOworCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRzZXJ2aWNlKTsKKyAgZl90eXBlc18gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZl90eXBlc18gPDwgIi8vIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHMsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZ29fZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBzdWNjZXNzLnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZiA9ICpmX2l0ZXI7CisgICAgICBmLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgICAgcmVzdWx0LmFwcGVuZChmKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICBzdHJpbmcgc2VydmljZU5hbWUocHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7CisgIHN0cmluZyBpbnRlcmZhY2VOYW1lID0gc2VydmljZU5hbWU7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBzaXplX3QgaW5kZXggPSBleHRlbmRzLnJmaW5kKCIuIik7CisKKyAgICBpZiAoaW5kZXggIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBleHRlbmRzX2lmID0gIlxuIiArIGluZGVudCgpICsgIiAgIiArIGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkKKyAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4dGVuZHNfaWYgPSAiXG4iICsgaW5kZW50KCkgKyBwdWJsaWNpemUoZXh0ZW5kcykgKyAiXG4iOworICAgIH0KKyAgfQorCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgaW50ZXJmYWNlTmFtZSA8PCAiIGludGVyZmFjZSB7IiA8PCBleHRlbmRzX2lmOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0c2VydmljZSk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKworICBpZiAoIWZ1bmN0aW9ucy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCAoKmZfaXRlcikpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2lmKCpmX2l0ZXIsICIiLCB0cnVlKSA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2ZpZWxkID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnRfbmV3ID0gIiI7CisgIHN0cmluZyBzZXJ2aWNlTmFtZShwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIHNpemVfdCBpbmRleCA9IGV4dGVuZHMucmZpbmQoIi4iKTsKKworICAgIGlmIChpbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKQorICAgICAgICAgICAgICAgICAgICAgICArICJDbGllbnQiOworICAgICAgZXh0ZW5kc19jbGllbnRfbmV3ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArICJOZXciCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJDbGllbnQiOworICAgIH0gZWxzZSB7CisgICAgICBleHRlbmRzX2NsaWVudCA9IHB1YmxpY2l6ZShleHRlbmRzKSArICJDbGllbnQiOworICAgICAgZXh0ZW5kc19jbGllbnRfbmV3ID0gIk5ldyIgKyBleHRlbmRzX2NsaWVudDsKKyAgICB9CisgIH0KKworICBleHRlbmRzX2ZpZWxkID0gZXh0ZW5kc19jbGllbnQuc3Vic3RyKGV4dGVuZHNfY2xpZW50LmZpbmQoIi4iKSArIDEpOworCisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdHNlcnZpY2UpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQgc3RydWN0IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICghZXh0ZW5kc19jbGllbnQuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIqIiA8PCBleHRlbmRzX2NsaWVudCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjIHRocmlmdC5UQ2xpZW50IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBMZWdhY3kgY29uc3RydWN0b3IgZnVuY3Rpb24KKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgIDw8ICJDbGllbnRGYWN0b3J5KHQgdGhyaWZ0LlRUcmFuc3BvcnQsIGYgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkpICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgPDwgIkNsaWVudCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAmIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IjsKKworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8ICJ7IiA8PCBleHRlbmRzX2ZpZWxkIDw8ICI6ICIgPDwgZXh0ZW5kc19jbGllbnRfbmV3IDw8ICJGYWN0b3J5KHQsIGYpfSI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc18gPDwgInsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImM6IHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoZi5HZXRQcm90b2NvbCh0KSwgZi5HZXRQcm90b2NvbCh0KSksIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAvLyBMZWdhY3kgY29uc3RydWN0b3IgZnVuY3Rpb24gd2l0aCBjdXN0b20gaW5wdXQgJiBvdXRwdXQgcHJvdG9jb2xzCisgIGZfdHlwZXNfCisgICAgICA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lCisgICAgICA8PCAiQ2xpZW50UHJvdG9jb2wodCB0aHJpZnQuVFRyYW5zcG9ydCwgaXByb3QgdGhyaWZ0LlRQcm90b2NvbCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKiIKKyAgICAgIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCI7CisKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCAieyIgPDwgZXh0ZW5kc19maWVsZCA8PCAiOiAiIDw8IGV4dGVuZHNfY2xpZW50X25ldyA8PCAiUHJvdG9jb2wodCwgaXByb3QsIG9wcm90KX0iCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF91cCgpOworICAgIGZfdHlwZXNfIDw8ICJ7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjOiB0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCksIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUKKyAgICA8PCAiQ2xpZW50KGMgdGhyaWZ0LlRDbGllbnQpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgZXh0ZW5kc19maWVsZCA8PCAiOiAiIDw8IGV4dGVuZHNfY2xpZW50X25ldyA8PCAiKGMpLCIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYzogYywiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCkgQ2xpZW50XygpIHRocmlmdC5UQ2xpZW50IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiBwLmMiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl90eXBlc18sICgqZl9pdGVyKSk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCkgIgorICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2lmKCpmX2l0ZXIsICIiLCB0cnVlKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBtZXRob2QgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgYXJnc1R5cGUgPSBwdWJsaWNpemUobWV0aG9kICsgIl9hcmdzIiwgdHJ1ZSk7CisgICAgc3RkOjpzdHJpbmcgYXJnc05hbWUgPSB0bXAoIl9hcmdzIik7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IGFyZ3NOYW1lIDw8ICIgIiA8PCBhcmdzVHlwZSA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IGFyZ3NOYW1lIDw8ICIuIiA8PCBwdWJsaWNpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICA8PCAiID0gIiA8PCB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHROYW1lID0gdG1wKCJfcmVzdWx0Iik7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHRUeXBlID0gcHVibGljaXplKG1ldGhvZCArICJfcmVzdWx0IiwgdHJ1ZSk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgcmVzdWx0TmFtZSA8PCAiICIgPDwgcmVzdWx0VHlwZSA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVyciA9IHAuQ2xpZW50XygpLkNhbGwoY3R4LCBcIiIKKyAgICAgICAgPDwgbWV0aG9kIDw8ICJcIiwgJiIgPDwgYXJnc05hbWUgPDwgIiwgJiIgPDwgcmVzdWx0TmFtZSA8PCAiKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgICAgaWYgKCF4Y2VwdGlvbnMuZW1wdHkoKSkgeworICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHsiIDw8IGVuZGw7CisKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwdWJuYW1lID0gcHVibGljaXplKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGQgPSByZXN1bHROYW1lICsgIi4iICsgcHVibmFtZTsKKworICAgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgZmllbGQgPDwgIiE9IG5pbDoiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHIsICIgPDwgZmllbGQgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAiPDwgZmllbGQgPDwgZW5kbDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisKKyAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgcmVzdWx0TmFtZSA8PCAiLkdldFN1Y2Nlc3MoKSwgbmlsIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRPRE86IHdvdWxkIGJlIG5pY2UgdG8gbm90IHRvIGR1cGxpY2F0ZSB0aGUgY2FsbCBnZW5lcmF0aW9uCisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IHAuQ2xpZW50XygpLkNhbGwoY3R4LCBcIiIKKyAgICAgIDw8IG1ldGhvZCA8PCAiXCIsICYiPDwgYXJnc05hbWUgPDwgIiwgbmlsKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZXJyIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY29tbWFuZCBsaW5lIHRvb2wgZm9yIG1ha2luZyByZW1vdGUgcmVxdWVzdHMKKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSByZW1vdGUgZm9yLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdF9zZXJ2aWNlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBjb2xsZWN0IGluaGVyaXRlZCBmdW5jdGlvbnMKKyAgd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBwX2Z1bmN0aW9ucyA9IHBhcmVudC0+Z2V0X2Z1bmN0aW9ucygpOworICAgIGZ1bmN0aW9ucy5pbnNlcnQoZnVuY3Rpb25zLmVuZCgpLCBwX2Z1bmN0aW9ucy5iZWdpbigpLCBwX2Z1bmN0aW9ucy5lbmQoKSk7CisgICAgcGFyZW50ID0gcGFyZW50LT5nZXRfZXh0ZW5kcygpOworICB9CisKKyAgLy8gVGhpcyBmaWxlIGlzIG5vdCB1c2VmdWwgaWYgdGhlcmUgYXJlIG5vIGZ1bmN0aW9uczsgZG9uJ3QgZ2VuZXJhdGUgaXQKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZyBmX3JlbW90ZV9kaXIgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyB1bmRlcnNjb3JlKHNlcnZpY2VfbmFtZV8pICsgIi1yZW1vdGUiOworICBNS0RJUihmX3JlbW90ZV9kaXIuY19zdHIoKSk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBzdHJpbmcgZl9yZW1vdGVfbmFtZSA9IGZfcmVtb3RlX2RpciArICIvIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICItcmVtb3RlLmdvIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3JlbW90ZTsKKyAgZl9yZW1vdGUub3BlbihmX3JlbW90ZV9uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgc2VydmljZV9tb2R1bGUgPSBnZXRfcmVhbF9nb19tb2R1bGUocHJvZ3JhbV8pOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgd2hpbGUgKChsb2MgPSBzZXJ2aWNlX21vZHVsZS5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHNlcnZpY2VfbW9kdWxlLnJlcGxhY2UobG9jLCAxLCAxLCAnLycpOworICB9CisgIGlmICghZ2VuX3BhY2thZ2VfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgc2VydmljZV9tb2R1bGUgPSBnZW5fcGFja2FnZV9wcmVmaXhfICsgc2VydmljZV9tb2R1bGU7CisgIH0KKworICBzdHJpbmcgdW51c2VkX3Byb3RlY3Rpb247CisKKyAgc3RyaW5nIGN0eFBhY2thZ2UgPSAiY29udGV4dCI7CisKKyAgZl9yZW1vdGUgPDwgZ29fYXV0b2dlbl9jb21tZW50KCk7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJwYWNrYWdlIG1haW4iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImltcG9ydCAoIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIiIgPDwgY3R4UGFja2FnZSA8PCAiXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwiZmxhZ1wiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcImZtdFwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIm1hdGhcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJuZXRcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJuZXQvdXJsXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwib3NcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJzdHJjb252XCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwic3RyaW5nc1wiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIiIgKyBnZW5fdGhyaWZ0X2ltcG9ydF8gKyAiXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IHJlbmRlcl9pbmNsdWRlZF9wcm9ncmFtcyh1bnVzZWRfcHJvdGVjdGlvbik7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwiIiA8PCBzZXJ2aWNlX21vZHVsZSA8PCAiXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCB1bnVzZWRfcHJvdGVjdGlvbjsgLy8gZmlsbGVkIGluIHJlbmRlcl9pbmNsdWRlZF9wcm9ncmFtcygpCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmdW5jIFVzYWdlKCkgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJVc2FnZSBvZiBcIiwgb3MuQXJnc1swXSwgXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiWy1oIGhvc3Q6cG9ydF0gWy11IHVybF0gWy1mW3JhbWVkXV0gZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXTpcIikiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZsYWcuUHJpbnREZWZhdWx0cygpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIlxcbkZ1bmN0aW9uczpcIikiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3JlbW90ZSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIiAgIiA8PCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiCisgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIG51bV9hcmdzID0gYXJncy5zaXplKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCAiLCAiOworICAgICAgfQorCisgICAgICBmX3JlbW90ZSA8PCBhcmdzW2ldLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCBhcmdzW2ldLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIGZfcmVtb3RlIDw8ICIpXCIpIiA8PCBlbmRsOworICB9CisKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0eXBlIGh0dHBIZWFkZXJzIG1hcFtzdHJpbmddc3RyaW5nIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyAoaCBodHRwSGVhZGVycykgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHZhciBtIG1hcFtzdHJpbmddc3RyaW5nID0gaCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZtdC5TcHJpbnRmKFwiJXNcIiwgbSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyAoaCBodHRwSGVhZGVycykgU2V0KHZhbHVlIHN0cmluZykgZXJyb3IgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcGFydHMgOj0gc3RyaW5ncy5TcGxpdCh2YWx1ZSwgXCI6IFwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgbGVuKHBhcnRzKSAhPSAyIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGZtdC5FcnJvcmYoXCJoZWFkZXIgc2hvdWxkIGJlIG9mIGZvcm1hdCAnS2V5OiBWYWx1ZSdcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGhbcGFydHNbMF1dID0gcGFydHNbMV0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBuaWwiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmdW5jIG1haW4oKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuVXNhZ2UgPSBVc2FnZSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBob3N0IHN0cmluZyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBwb3J0IGludCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBwcm90b2NvbCBzdHJpbmciIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgdXJsU3RyaW5nIHN0cmluZyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBmcmFtZWQgYm9vbCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciB1c2VIdHRwIGJvb2wiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJoZWFkZXJzIDo9IG1ha2UoaHR0cEhlYWRlcnMpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHBhcnNlZFVybCAqdXJsLlVSTCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciB0cmFucyB0aHJpZnQuVFRyYW5zcG9ydCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIl8gPSBzdHJjb252LkF0b2kiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfID0gbWF0aC5BYnMiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlVzYWdlID0gVXNhZ2UiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlN0cmluZ1ZhcigmaG9zdCwgXCJoXCIsIFwibG9jYWxob3N0XCIsIFwiU3BlY2lmeSBob3N0IGFuZCBwb3J0XCIpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5JbnRWYXIoJnBvcnQsIFwicFwiLCA5MDkwLCBcIlNwZWNpZnkgcG9ydFwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuU3RyaW5nVmFyKCZwcm90b2NvbCwgXCJQXCIsIFwiYmluYXJ5XCIsIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiU3BlY2lmeSB0aGUgcHJvdG9jb2wgKGJpbmFyeSwgY29tcGFjdCwgc2ltcGxlanNvbiwganNvbilcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlN0cmluZ1ZhcigmdXJsU3RyaW5nLCBcInVcIiwgXCJcIiwgXCJTcGVjaWZ5IHRoZSB1cmxcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLkJvb2xWYXIoJmZyYW1lZCwgXCJmcmFtZWRcIiwgZmFsc2UsIFwiVXNlIGZyYW1lZCB0cmFuc3BvcnRcIikiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLkJvb2xWYXIoJnVzZUh0dHAsIFwiaHR0cFwiLCBmYWxzZSwgXCJVc2UgaHR0cFwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuVmFyKGhlYWRlcnMsIFwiSFwiLCBcIkhlYWRlcnMgdG8gc2V0IG9uIHRoZSBodHRwKHMpIHJlcXVlc3QgKGUuZy4gLUggXFxcIktleTogVmFsdWVcXFwiKVwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuUGFyc2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGxlbih1cmxTdHJpbmcpID4gMCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB2YXIgZXJyIGVycm9yIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwYXJzZWRVcmwsIGVyciA9IHVybC5QYXJzZSh1cmxTdHJpbmcpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBwYXJzaW5nIFVSTDogXCIsIGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZmxhZy5Vc2FnZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBob3N0ID0gcGFyc2VkVXJsLkhvc3QiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHVzZUh0dHAgPSBsZW4ocGFyc2VkVXJsLlNjaGVtZSkgPD0gMCB8fCBwYXJzZWRVcmwuU2NoZW1lID09IFwiaHR0cFwiIHx8IHBhcnNlZFVybC5TY2hlbWUgPT0gXCJodHRwc1wiIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIHVzZUh0dHAgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgXywgZXJyIDo9IHVybC5QYXJzZShmbXQuU3ByaW50KFwiaHR0cDovL1wiLCBob3N0LCBcIjpcIiwgcG9ydCkpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBwYXJzaW5nIFVSTDogXCIsIGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZmxhZy5Vc2FnZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNtZCA6PSBmbGFnLkFyZygwKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBlcnIgZXJyb3IiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiB1c2VIdHRwIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBDbGllbnQocGFyc2VkVXJsLlN0cmluZygpKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgbGVuKGhlYWRlcnMpID4gMCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGh0dHB0cmFucyA6PSB0cmFucy4oKnRocmlmdC5USHR0cENsaWVudCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZm9yIGtleSwgdmFsdWUgOj0gcmFuZ2UgaGVhZGVycyB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgaHR0cHRyYW5zLlNldEhlYWRlcihrZXksIHZhbHVlKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHBvcnRTdHIgOj0gZm10LlNwcmludChwb3J0KSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgc3RyaW5ncy5Db250YWlucyhob3N0LCBcIjpcIikgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgIGhvc3QsIHBvcnRTdHIsIGVyciA9IG5ldC5TcGxpdEhvc3RQb3J0KGhvc3QpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcImVycm9yIHdpdGggaG9zdDpcIiwgZXJyKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VFNvY2tldChuZXQuSm9pbkhvc3RQb3J0KGhvc3QsIHBvcnRTdHIpKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiZXJyb3IgcmVzb2x2aW5nIGFkZHJlc3M6XCIsIGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZnJhbWVkIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgdHJhbnMgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFucykiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkVycm9yIGNyZWF0aW5nIHRyYW5zcG9ydFwiLCBlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDEpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmVyIHRyYW5zLkNsb3NlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHByb3RvY29sIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiY29tcGFjdFwiOiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcInNpbXBsZWpzb25cIjoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJqc29uXCI6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiYmluYXJ5XCIsIFwiXCI6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZDogXCIsIHByb3RvY29sKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAib3Byb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNsaWVudCA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi5OZXciIDw8IHB1YmxpY2l6ZShzZXJ2aWNlX25hbWVfKQorICAgICAgICAgICA8PCAiQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoaXByb3QsIG9wcm90KSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gdHJhbnMuT3BlbigpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3Igb3BlbmluZyBzb2NrZXQgdG8gXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3QsIFwiOlwiLCBwb3J0LCBcIiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggY21kIHsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIG51bV9hcmdzID0gYXJncy5zaXplKCk7CisgICAgc3RyaW5nIGZ1bmNOYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgc3RyaW5nIHB1Yk5hbWUocHVibGljaXplKGZ1bmNOYW1lKSk7CisgICAgc3RyaW5nIGFyZ3VtZW50c05hbWUocHVibGljaXplKGZ1bmNOYW1lICsgIl9hcmdzIiwgdHJ1ZSkpOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiIiA8PCBlc2NhcGVfc3RyaW5nKGZ1bmNOYW1lKSA8PCAiXCI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBmbGFnLk5BcmcoKSAtIDEgIT0gIiA8PCBudW1fYXJncyA8PCAiIHsiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCIiIDw8IGVzY2FwZV9zdHJpbmcocHViTmFtZSkgPDwgIiByZXF1aXJlcyAiCisgICAgICAgICAgICAgPDwgbnVtX2FyZ3MgPDwgIiBhcmdzXCIpIiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CisgICAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBmbGFnQXJnID0gaSArIDE7CisgICAgICB0X3R5cGUqIHRoZV90eXBlKGFyZ3NbaV0tPmdldF90eXBlKCkpOworICAgICAgdF90eXBlKiB0aGVfdHlwZTIoZ2V0X3RydWVfdHlwZSh0aGVfdHlwZSkpOworCisgICAgICBpZiAodGhlX3R5cGUyLT5pc19lbnVtKCkpIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCBlcnIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4iCisgICAgICAgICAgICAgICAgIDw8IHB1YmxpY2l6ZSh0aGVfdHlwZS0+Z2V0X25hbWUoKSkgPDwgIih0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKHRoZV90eXBlMi0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBlID0gKCh0X2Jhc2VfdHlwZSopdGhlX3R5cGUyKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgc3RyaW5nIGVycih0bXAoImVyciIpKTsKKworICAgICAgICBzd2l0Y2ggKGUpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGlmICh0aGVfdHlwZTItPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBbXWJ5dGUoZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSA9PSBcInRydWVcIiIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIgorICAgICAgICAgICAgICAgICAgIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBpbnQ4KHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsICIgPDwgZXJyIDw8ICIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiCisgICAgICAgICAgICAgICAgICAgPDwgZmxhZ0FyZyA8PCAiKSkpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGludDE2KHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsICIgPDwgZXJyIDw8ICIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiCisgICAgICAgICAgICAgICAgICAgPDwgZmxhZ0FyZyA8PCAiKSkpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGludDMyKHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiwgIiA8PCBlcnIKKyAgICAgICAgICAgICAgICAgICA8PCAiIDo9IChzdHJjb252LlBhcnNlSW50KGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSwgMTAsIDY0KSkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIsICIgPDwgZXJyCisgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAoc3RyY29udi5QYXJzZUZsb2F0KGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSwgNjQpKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93KCJJbnZhbGlkIGJhc2UgdHlwZSBpbiBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZl9yZW1vdGUgPDwgcHVibGljaXplKGFyZ3NbaV0tPmdldF9uYW1lKCkpIDw8ICIoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PAorICAgICAgICAvLyAiKSkpIjsKKyAgICAgIH0gZWxzZSBpZiAodGhlX3R5cGUyLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBzdHJpbmcgYXJnKHRtcCgiYXJnIikpOworICAgICAgICBzdHJpbmcgbWJUcmFucyh0bXAoIm1iVHJhbnMiKSk7CisgICAgICAgIHN0cmluZyBlcnIxKHRtcCgiZXJyIikpOworICAgICAgICBzdHJpbmcgZmFjdG9yeSh0bXAoImZhY3RvcnkiKSk7CisgICAgICAgIHN0cmluZyBqc1Byb3QodG1wKCJqc1Byb3QiKSk7CisgICAgICAgIHN0cmluZyBlcnIyKHRtcCgiZXJyIikpOworICAgICAgICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRzdHJ1Y3RfbW9kdWxlKCBtb2R1bGVfbmFtZSh0aGVfdHlwZSkpOworICAgICAgICBpZih0c3RydWN0X21vZHVsZS5lbXB0eSgpKSB7CisgICAgICAgICAgdHN0cnVjdF9tb2R1bGUgPSBwYWNrYWdlX25hbWVfOworICAgICAgICB9CisKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgYXJnIDw8ICIgOj0gZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBtYlRyYW5zIDw8ICIgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXJMZW4obGVuKCIgPDwgYXJnIDw8ICIpKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmVyICIgPDwgbWJUcmFucyA8PCAiLkNsb3NlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfLCAiIDw8IGVycjEgPDwgIiA6PSAiIDw8IG1iVHJhbnMgPDwgIi5Xcml0ZVN0cmluZygiIDw8IGFyZyA8PCAiKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMSA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBmYWN0b3J5IDw8ICIgOj0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGpzUHJvdCA8PCAiIDo9ICIgPDwgZmFjdG9yeSA8PCAiLkdldFByb3RvY29sKCIgPDwgbWJUcmFucyA8PCAiKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gIiA8PCB0c3RydWN0X21vZHVsZSA8PCAiLk5ldyIgPDwgdHN0cnVjdF9uYW1lCisgICAgICAgICAgICAgICAgIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZXJyMiA8PCAiIDo9IGFyZ3ZhbHVlIiA8PCBpIDw8ICIuIiA8PCByZWFkX21ldGhvZF9uYW1lXyA8PCAgIigiIDw8IGpzUHJvdCA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMiA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmICh0aGVfdHlwZTItPmlzX2NvbnRhaW5lcigpIHx8IHRoZV90eXBlMi0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBzdHJpbmcgYXJnKHRtcCgiYXJnIikpOworICAgICAgICBzdHJpbmcgbWJUcmFucyh0bXAoIm1iVHJhbnMiKSk7CisgICAgICAgIHN0cmluZyBlcnIxKHRtcCgiZXJyIikpOworICAgICAgICBzdHJpbmcgZmFjdG9yeSh0bXAoImZhY3RvcnkiKSk7CisgICAgICAgIHN0cmluZyBqc1Byb3QodG1wKCJqc1Byb3QiKSk7CisgICAgICAgIHN0cmluZyBlcnIyKHRtcCgiZXJyIikpOworICAgICAgICBzdGQ6OnN0cmluZyBhcmdOYW1lKHB1YmxpY2l6ZShhcmdzW2ldLT5nZXRfbmFtZSgpKSk7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGFyZyA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgbWJUcmFucyA8PCAiIDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyTGVuKGxlbigiIDw8IGFyZyA8PCAiKSkiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZlciAiIDw8IG1iVHJhbnMgPDwgIi5DbG9zZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiXywgIiA8PCBlcnIxIDw8ICIgOj0gIiA8PCBtYlRyYW5zIDw8ICIuV3JpdGVTdHJpbmcoIiA8PCBhcmcgPDwgIikiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjEgPDwgIiAhPSBuaWwgeyAiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGZhY3RvcnkgPDwgIiA6PSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwganNQcm90IDw8ICIgOj0gIiA8PCBmYWN0b3J5IDw8ICIuR2V0UHJvdG9jb2woIiA8PCBtYlRyYW5zIDw8ICIpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY29udGFpbmVyU3RydWN0IiA8PCBpIDw8ICIgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuTmV3IgorICAgICAgICAgICAgICAgICA8PCBhcmd1bWVudHNOYW1lIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZXJyMiA8PCAiIDo9IGNvbnRhaW5lclN0cnVjdCIgPDwgaSA8PCAiLlJlYWRGaWVsZCIgPDwgKGkgKyAxKSA8PCAiKCIKKyAgICAgICAgICAgICAgICAgPDwganNQcm90IDw8ICIpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGNvbnRhaW5lclN0cnVjdCIgPDwgaSA8PCAiLiIgPDwgYXJnTmFtZQorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3coIkludmFsaWQgYXJndW1lbnQgdHlwZSBpbiBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSIpOworICAgICAgfQorCisgICAgICBpZiAodGhlX3R5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlZGVmX21vZHVsZSggbW9kdWxlX25hbWUodGhlX3R5cGUpKTsKKyAgICAgICAgaWYodHlwZWRlZl9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgICAgIHR5cGVkZWZfbW9kdWxlID0gcGFja2FnZV9uYW1lXzsKKyAgICAgICAgfQorICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHR5cGVkZWZfbW9kdWxlIDw8ICIuIgorICAgICAgICAgICAgICAgICA8PCBwdWJsaWNpemUodGhlX3R5cGUtPmdldF9uYW1lKCkpIDw8ICIoYXJndmFsdWUiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFsdWUiIDw8IGkgPDwgIiA6PSBhcmd2YWx1ZSIgPDwgaSA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbXQuUHJpbnQoY2xpZW50LiIgPDwgcHViTmFtZSA8PCAiKCI7CisgICAgYm9vbCBhcmdGaXJzdCA9IHRydWU7CisKKyAgICBmX3JlbW90ZSA8PCAiY29udGV4dC5CYWNrZ3JvdW5kKCkiOworICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CisgICAgICBpZiAoYXJnRmlyc3QpIHsKKyAgICAgICAgYXJnRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICIsICI7CisgICAgICB9CisKKyAgICAgIGlmIChhcmdzW2ldLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOworICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLT5nZXRfdHlwZSgpLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIGUgPSAoKHRfYmFzZV90eXBlKikoYXJnc1tpXS0+Z2V0X3R5cGUoKSkpLT5nZXRfYmFzZSgpOworCisgICAgICAgIHN3aXRjaCAoZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3coIkludmFsaWQgYmFzZSB0eXBlIGluIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBmX3JlbW90ZSA8PCBwdWJsaWNpemUoYXJnc1tpXS0+Z2V0X25hbWUoKSkgPDwgIihzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8CisgICAgICAgIC8vICIpKSkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOworICAgICAgfQorICAgIH0KKworICAgIGZfcmVtb3RlIDw8ICIpKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZm10LlByaW50KFwiXFxuXCIpIiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJicmVhayIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJcIjoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiSW52YWxpZCBmdW5jdGlvbiBcIiwgY21kKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9yZW1vdGUuY2xvc2UoKTsKKyAgZm9ybWF0X2dvX291dHB1dChmX3JlbW90ZV9uYW1lKTsKKyNpZm5kZWYgX01TQ19WRVIKKyAgLy8gTWFrZSBmaWxlIGV4ZWN1dGFibGUsIGxvdmUgdGhhdCBiaXR3aXNlIE9SIGFjdGlvbgorICBjaG1vZChmX3JlbW90ZV9uYW1lLmNfc3RyKCksCisgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JWFVTUgorI2lmbmRlZiBfV0lOMzIKKyAgICAgICAgfCBTX0lSR1JQIHwgU19JWEdSUCB8IFNfSVJPVEggfCBTX0lYT1RICisjZW5kaWYKKyAgICAgICAgKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPSAiIjsKKyAgc3RyaW5nIHNlcnZpY2VOYW1lKHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgc2l6ZV90IGluZGV4ID0gZXh0ZW5kcy5yZmluZCgiLiIpOworCisgICAgaWYgKGluZGV4ICE9IHN0cmluZzo6bnBvcykgeworICAgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpICsgcHVibGljaXplKGV4dGVuZHMuc3Vic3RyKGluZGV4ICsgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlByb2Nlc3NvciI7CisgICAgICBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPSBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpICsgIk5ldyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHVibGljaXplKGV4dGVuZHMuc3Vic3RyKGluZGV4ICsgMSkpICsgIlByb2Nlc3NvciI7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gcHVibGljaXplKGV4dGVuZHMpICsgIlByb2Nlc3NvciI7CisgICAgICBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPSAiTmV3IiArIGV4dGVuZHNfcHJvY2Vzc29yOworICAgIH0KKyAgfQorCisgIHN0cmluZyBwU2VydmljZU5hbWUocHJpdmF0aXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7CisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBzdHJpbmcgc2VsZih0bXAoInNlbGYiKSk7CisKKyAgaWYgKGV4dGVuZHNfcHJvY2Vzc29yLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3Igc3RydWN0IHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcHJvY2Vzc29yTWFwIG1hcFtzdHJpbmdddGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBoYW5kbGVyICIgPDwgc2VydmljZU5hbWUgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBBZGRUb1Byb2Nlc3Nvck1hcChrZXkgc3RyaW5nLCBwcm9jZXNzb3IgdGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbikgeyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcC5wcm9jZXNzb3JNYXBba2V5XSA9IHByb2Nlc3NvciIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBHZXRQcm9jZXNzb3JGdW5jdGlvbihrZXkgc3RyaW5nKSAiCisgICAgICAgICAgICAgICAgICAiKHByb2Nlc3NvciB0aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uLCBvayBib29sKSB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHByb2Nlc3Nvciwgb2sgPSBwLnByb2Nlc3Nvck1hcFtrZXldIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwcm9jZXNzb3IsIG9rIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpIFByb2Nlc3Nvck1hcCgpIG1hcFtzdHJpbmdddGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwLnByb2Nlc3Nvck1hcCIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyICIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICIpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IgeyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiIDo9ICYiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgIDw8ICJQcm9jZXNzb3J7aGFuZGxlcjpoYW5kbGVyLCBwcm9jZXNzb3JNYXA6bWFrZShtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24pfSIKKyAgICAgICAgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBzdHJpbmcgZXNjYXBlZEZ1bmNOYW1lKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIi5wcm9jZXNzb3JNYXBbXCIiIDw8IGVzY2FwZWRGdW5jTmFtZSA8PCAiXCJdID0gJiIKKyAgICAgICAgICAgICAgICAgPDwgcFNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IiIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgIDw8ICJ7aGFuZGxlcjpoYW5kbGVyfSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdHJpbmcgeCh0bXAoIngiKSk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IHNlbGYgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIGlwcm90LCBvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoc3VjY2VzcyBib29sLCBlcnIgIgorICAgICAgICAgICAgICAgICAgInRocmlmdC5URXhjZXB0aW9uKSB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG5hbWUsIF8sIHNlcUlkLCBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyByZXR1cm4gZmFsc2UsIGVyciB9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlmIHByb2Nlc3Nvciwgb2sgOj0gcC5HZXRQcm9jZXNzb3JGdW5jdGlvbihuYW1lKTsgb2sgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBwcm9jZXNzb3IuUHJvY2VzcyhjdHgsIHNlcUlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QuU2tpcCh0aHJpZnQuU1RSVUNUKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgeAorICAgICAgICAgICAgICAgPDwgIiA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5VTktOT1dOX01FVEhPRCwgXCJVbmtub3duIGZ1bmN0aW9uICIKKyAgICAgICAgICAgICAgICAgICJcIiArIG5hbWUpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHRocmlmdC5FWENFUFRJT04sIHNlcUlkKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHggPDwgIi5Xcml0ZShvcHJvdCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goY3R4KSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2UsICIgPDwgeCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3Igc3RydWN0IHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgKiIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyICIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICIpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIiA6PSAmIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yeyIKKyAgICAgICAgICAgICAgIDw8IGV4dGVuZHNfcHJvY2Vzc29yX25ldyA8PCAiKGhhbmRsZXIpfSIgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBzdHJpbmcgZXNjYXBlZEZ1bmNOYW1lKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIi5BZGRUb1Byb2Nlc3Nvck1hcChcIiIgPDwgZXNjYXBlZEZ1bmNOYW1lCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgJiIgPDwgcFNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IiIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgIDw8ICJ7aGFuZGxlcjpoYW5kbGVyfSkiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgc2VsZiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBzdHJpbmcgcHJvY2Vzc29yTmFtZSA9IHByaXZhdGl6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiUHJvY2Vzc29yIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyBhcmdzbmFtZSA9IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiLCB0cnVlKTsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiLCB0cnVlKTsKKworICAvLyB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgLy8gY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBwcm9jZXNzb3JOYW1lIDw8ICIgc3RydWN0IHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGhhbmRsZXIgIiA8PCBwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHByb2Nlc3Nvck5hbWUKKyAgICAgICAgICAgICA8PCAiKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIHNlcUlkIGludDMyLCBpcHJvdCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHN1Y2Nlc3MgYm9vbCwgZXJyICIKKyAgICAgICAgICAgICAgICAidGhyaWZ0LlRFeGNlcHRpb24pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA6PSAiIDw8IGFyZ3NuYW1lIDw8ICJ7fSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVyciA9IGFyZ3MuIiA8PCByZWFkX21ldGhvZF9uYW1lXyA8PCAgIihpcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIgIHggOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuUFJPVE9DT0xfRVJST1IsIGVyci5FcnJvcigpKSIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgPDwgIlwiLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goY3R4KSIgPDwgZW5kbDsKKyAgfQorICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2UsIGVyciIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA6PSAiIDw8IHJlc3VsdG5hbWUgPDwgInt9IiA8PCBlbmRsOworICB9CisgIGJvb2wgbmVlZF9yZWZlcmVuY2UgPSB0eXBlX25lZWRfcmVmZXJlbmNlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3R5cGVzXyA8PCAidmFyIHJldHZhbCAiIDw8IHR5cGVfdG9fZ29fdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidmFyIGVycjIgZXJyb3IiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiAiOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICJyZXR2YWwsICI7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmX3R5cGVzXyA8PCAiZXJyMiA9IHAuaGFuZGxlci4iIDw8IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgZl90eXBlc18gPDwgImN0eCI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgZl90eXBlc18gPDwgIiwgIjsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgIiwgIjsKKyAgICB9CisKKyAgICBmX3R5cGVzXyA8PCAiYXJncy4iIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICB9CisKKyAgZl90eXBlc18gPDwgIik7IGVycjIgIT0gbmlsIHsiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeF9maWVsZHMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICBpZiAoIXhfZmllbGRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHYgOj0gZXJyMi4odHlwZSkgeyIgPDwgZW5kbDsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhmX2l0ZXI7CisKKyAgICBmb3IgKHhmX2l0ZXIgPSB4X2ZpZWxkcy5iZWdpbigpOyB4Zl9pdGVyICE9IHhfZmllbGRzLmVuZCgpOyArK3hmX2l0ZXIpIHsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGNhc2UgIiA8PCB0eXBlX3RvX2dvX3R5cGUoKCgqeGZfaXRlciktPmdldF90eXBlKCkpKSA8PCAiOiIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCBwdWJsaWNpemUoKCp4Zl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHYiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZGVmYXVsdDoiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICB4IDo9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICA8PCAiOiBcIiArIGVycjIuRXJyb3IoKSkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgPDwgIlwiLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goY3R4KSIgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlLCBlcnIyIiA8PCBlbmRsOworCisgIGlmICgheF9maWVsZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iOyAvLyBjbG9zZXMgZXJyMiAhPSBuaWwKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3R5cGVzXyA8PCAiIGVsc2UgeyIgPDwgZW5kbDsgLy8gbWFrZSBzdXJlIHdlIHNldCBTdWNjZXNzIHJldHZhbCBvbmx5IG9uIHN1Y2Nlc3MKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJlc3VsdC5TdWNjZXNzID0gIjsKKyAgICAgIGlmIChuZWVkX3JlZmVyZW5jZSkgeworICAgICAgICBmX3R5cGVzXyA8PCAiJiI7CisgICAgICB9CisgICAgICBmX3R5cGVzXyA8PCAicmV0dmFsIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgICAgICAgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJcIiwgdGhyaWZ0LlJFUExZLCBzZXFJZCk7IGVycjIgIT0gbmlsIHsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVycjIgPSByZXN1bHQuIiA8PCB3cml0ZV9tZXRob2RfbmFtZV8gPDwgIihvcHJvdCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIyID0gb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IG9wcm90LkZsdXNoKGN0eCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZSwgZXJyIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlLCBuaWwiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29lcmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lcl92YWx1ZSkgeworICAodm9pZClpbmNsYXNzOworICAodm9pZCljb2VyY2VEYXRhOworICB0X3R5cGUqIG9yaWdfdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShvcmlnX3R5cGUpOworICBzdHJpbmcgbmFtZShwcmVmaXggKyBwdWJsaWNpemUodGZpZWxkLT5nZXRfbmFtZSgpKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19wb2ludGVyX2ZpZWxkKHRmaWVsZCwgaW5fY29udGFpbmVyX3ZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCBvcmlnX3R5cGUsIGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSwgZGVjbGFyZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpZiAoZGVjbGFyZSkgeworICAgICAgc3RyaW5nIHR5cGVfbmFtZSA9IGlua2V5ID8gdHlwZV90b19nb19rZXlfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlX3RvX2dvX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAgICAgb3V0IDw8ICJ2YXIgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiAiIDw8IHR5cGVfbmFtZSA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJpZiB2LCBlcnIgOj0gaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkgJiYgIWlua2V5KSB7CisgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5KCkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpIjsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiUmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiUmVhZEkxNigpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiUmVhZERvdWJsZSgpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gR28gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7CisgICAgfQorCisgICAgb3V0IDw8ICI7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBmaWVsZCAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpCisgICAgICAgIDw8ICI6IFwiLCBlcnIpIiA8PCBlbmRsOworCisgICAgb3V0IDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBzdHJpbmcgd3JhcDsKKworICAgIGlmICh0eXBlLT5pc19lbnVtKCkgfHwgb3JpZ190eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHdyYXAgPSBwdWJsaWNpemUodHlwZV9uYW1lKG9yaWdfdHlwZSkpOworICAgIH0gZWxzZSBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTgpIHsKKyAgICAgIHdyYXAgPSAiaW50OCI7CisgICAgfQorCisgICAgc3RyaW5nIG1heWJlX2FkZHJlc3MgPSAoaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQpID8gIiYiIDogIiIpOworICAgIGlmICh3cmFwID09ICIiKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IG1heWJlX2FkZHJlc3MgPDwgInYiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0ZW1wIDo9ICIgPDwgd3JhcCA8PCAiKHYpIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCBtYXliZV9hZGRyZXNzIDw8ICJ0ZW1wIiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICciICsgdHlwZS0+Z2V0X25hbWUoKSArICInIGZvciBmaWVsZCAnIgorICAgICAgICArIHRmaWVsZC0+Z2V0X25hbWUoKSArICInIjsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZXEoZGVjbGFyZSA/ICIgOj0gIiA6ICIgPSAiKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpOworICBnZW5lcmF0ZV9nb19zdHJ1Y3RfaW5pdGlhbGl6ZXIob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gIiA8PCBwcmVmaXggPDwgIi4iIDw8IHJlYWRfbWV0aG9kX25hbWVfIDw8ICAiKGlwcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCBlcnJvciByZWFkaW5nIHN0cnVjdDogXCIsICIKKyAgICAgIDw8IHByZWZpeCA8PCAiKSwgZXJyKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5CisgKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogb3JpZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZShvcmlnX3R5cGUpOworICBzdHJpbmcgZXEoIiA9ICIpOworCisgIGlmIChkZWNsYXJlKSB7CisgICAgZXEgPSAiIDo9ICI7CisgIH0KKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXywgXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRNYXBCZWdpbigpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgbWFwIGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0TWFwIDo9IG1ha2UoIiA8PCB0eXBlX3RvX2dvX3R5cGUob3JpZ190eXBlKSA8PCAiLCBzaXplKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8ICIgIiA8PCAocG9pbnRlcl9maWVsZCA/ICImIiA6ICIiKSA8PCAidE1hcCIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIHNldCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidFNldCA6PSBtYWtlKCIgPDwgdHlwZV90b19nb190eXBlKG9yaWdfdHlwZSkgPDwgIiwgMCwgc2l6ZSkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRTZXQiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRMaXN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIGxpc3QgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRTbGljZSA6PSBtYWtlKCIgPDwgdHlwZV90b19nb190eXBlKG9yaWdfdHlwZSkgPDwgIiwgMCwgc2l6ZSkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRTbGljZSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAnIiArIHR0eXBlLT5nZXRfbmFtZSgpICsgIicgZm9yIHByZWZpeCAnIgorICAgICAgICArIHByZWZpeCArICInIjsKKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSArKyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAocG9pbnRlcl9maWVsZCkgeworICAgIHByZWZpeCA9ICIoKiIgKyBwcmVmaXggKyAiKSI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgZGVjbGFyZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGRlY2xhcmUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBkZWNsYXJlLCBwcmVmaXgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZE1hcEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBtYXAgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZFNldEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBzZXQgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRMaXN0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIGxpc3QgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpZGVjbGFyZTsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworICBma2V5LnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGZ2YWwuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlIGEgc2V0IGVsZW1lbnQKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKWRlY2xhcmU7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisgIGZlbGVtLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gYXBwZW5kKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpZGVjbGFyZTsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0oKCh0X2xpc3QqKXRsaXN0KS0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKyAgZmVsZW0uc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBhcHBlbmQoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgc3RyaW5nIG5hbWUocHJlZml4ICsgcHVibGljaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGdlbmVyYXRlIHNlcmlhbGl6ZSBmb3Igdm9pZCB0eXBlOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQpLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgZXJyIDo9IG9wcm90LiI7CisKKyAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQpKSB7CisgICAgICBuYW1lID0gIioiICsgbmFtZTsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpICYmICFpbmtleSkgeworICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKHN0cmluZygiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiV3JpdGVCb29sKGJvb2woIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZShpbnQ4KCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMTYoaW50MTYoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUkzMihpbnQzMigiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIldyaXRlSTY0KGludDY0KCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoZmxvYXQ2NCgiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gR28gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIldyaXRlSTMyKGludDMyKCIgPDwgbmFtZSA8PCAiKSkiOworICAgIH0KKworICAgIG91dCA8PCAiOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVULiIKKyAgICAgICAgPDwgZXNjYXBlX3N0cmluZyh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgKCIgPDwgdGZpZWxkLT5nZXRfa2V5KCkKKyAgICAgICAgPDwgIikgZmllbGQgd3JpdGUgZXJyb3I6IFwiLCBwKSwgZXJyKSB9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogSW52YWxpZCB0eXBlIGluIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAnIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgKyAiJyBmb3IgZmllbGQgJyIgKyBuYW1lICsgIiciOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9ICIgPDwgcHJlZml4IDw8ICIuIiA8PCB3cml0ZV9tZXRob2RfbmFtZV8gPDwgIihvcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgZXJyb3Igd3JpdGluZyBzdHJ1Y3Q6IFwiLCAiCisgICAgICA8PCBwcmVmaXggPDwgIiksIGVycikiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBpZiAocG9pbnRlcl9maWVsZCkgeworICAgIHByZWZpeCA9ICIqIiArIHByZWZpeDsKKyAgfQorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBCZWdpbigiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBtYXAgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZVNldEJlZ2luKCIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBzZXQgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0QmVnaW4oIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBsaXN0IGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHR5cGUgaW4gZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAnIiArIHR0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIicgZm9yIHByZWZpeCAnIiArIHByZWZpeCArICInIjsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgaywgdiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgdG1hcCwgImsiLCAidiIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIGkgOj0gMDsgaTxsZW4oIiA8PCBwcmVmaXggPDwgIik7IGkrKyB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBmb3IgaiA6PSBpKzE7IGo8bGVuKCIgPDwgcHJlZml4IDw8ICIpOyBqKysgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiByZWZsZWN0LkRlZXBFcXVhbCgiIDw8IHByZWZpeCA8PCAiW2ldLCIgPDwgcHJlZml4IDw8ICJbal0pIHsgIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJcIiwgZm10LkVycm9yZihcIiVUIGVycm9yIHdyaXRpbmcgc2V0IGZpZWxkOiBzbGljZSBpcyBub3QgdW5pcXVlXCIsICIgPDwgcHJlZml4IDw8ICJbaV0pKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICB9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvciBfLCB2IDo9IHJhbmdlICIgPDwgcHJlZml4IDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCB0c2V0LCAidiIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvciBfLCB2IDo9IHJhbmdlICIgPDwgcHJlZml4IDw8ICIgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCB0bGlzdCwgInYiKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlTWFwRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciB3cml0aW5nIG1hcCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZVNldEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBzZXQgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBsaXN0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgIiIpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgIiIpOworICBrZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgdmZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsIGtpdGVyLCB0cnVlKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgdml0ZXIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgIiIpOworICBlZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgcHJlZml4KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIiIpOworICBlZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgcHJlZml4KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBzdHJ1Y3QuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3QsICJBdHRyaWJ1dGVzIik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3V0LCB0ZnVuY3Rpb24sIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIlBhcmFtZXRlcnMiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBzdHJ1Y3Qgb3IgZnVuY3Rpb24uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKSB7CisgIGJvb2wgaGFzX2RvYyA9IGZhbHNlOworICBzdHJpbmdzdHJlYW0gc3M7CisKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGhhc19kb2MgPSB0cnVlOworICAgIHNzIDw8IHRkb2MtPmdldF9kb2MoKTsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaWYgKGhhc19kb2MpIHsKKyAgICAgIHNzIDw8IGVuZGw7CisgICAgfQorCisgICAgaGFzX2RvYyA9IHRydWU7CisgICAgc3MgPDwgc3ViaGVhZGVyIDw8ICI6XG4iOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHNzIDw8ICIgLSAiIDw8IHB1YmxpY2l6ZShwLT5nZXRfbmFtZSgpKTsKKworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzcyA8PCAiOiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNzIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGhhc19kb2MpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIiLCAiLy8gIiwgc3Muc3RyKCksICIiKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdlbmVyaWMgb2JqZWN0LgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIi8vIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhbiBhcmd1bWVudCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgcmVzdWx0IDw8IHB1YmxpY2l6ZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICI9IjsKKworICBpZiAodGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgcmVzdWx0IDw8ICJ0aHJpZnRfc3BlY1siIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICJdWzRdIjsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPDwgIm5pbCI7CisgIH0KKworICByZXR1cm4gcmVzdWx0LnN0cigpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBzdHJ1Y3QgZmllbGQgaW5pdGlhbCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCwgd2hpY2ggbXVzdCBoYXZlIGB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTExgCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2ZpZWxkX2luaXRpYWxfdmFsdWUodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWxfZmllbGQpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmIChvcHRpb25hbF9maWVsZCkgeworICAgIC8vIFRoZSBjYWxsZXIgd2lsbCBtYWtlIGEgc2Vjb25kIHBhc3MgZm9yIG9wdGlvbmFsIGZpZWxkcywKKyAgICAvLyBhc3NpZ25pbmcgdGhlIHJlc3VsdCBvZiByZW5kZXJfY29uc3RfdmFsdWUgdG8gIipmaWVsZF9uYW1lIi4gSXQKKyAgICAvLyBpcyBtYWRkZW5pbmcgdGhhdCBHbyBzeW50YXggZG9lcyBub3QgYWxsb3cgZm9yIGEgdHlwZS1hZ25vc3RpYworICAgIC8vIHdheSB0byBpbml0aWFsaXplIGEgcG9pbnRlciB0byBhIGNvbnN0IHZhbHVlLCBidXQgc28gaXQgZ29lcy4KKyAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gd3JpdGUgdHlwZSBzcGVjaWZpYyBmdW5jdGlvbnMgdGhhdAorICAgIC8vIGNvbnZlcnQgZnJvbSBjb25zdCB2YWx1ZXMgdG8gcG9pbnRlciB0eXBlcywgYnV0IGdpdmVuIHRoZSBsYWNrCisgICAgLy8gb2Ygb3ZlcmxvYWRpbmcgaXQgd291bGQgYmUgbWVzc3kuCisgICAgcmV0dXJuICJuZXcoIiArIHR5cGVfdG9fZ29fdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIikiOworICB9IGVsc2UgeworICAgIHJldHVybiByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSwgbmFtZSk7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQorICByZXR1cm4gcHVibGljaXplKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkKKyAgICAgICAgICsgIikiOworfQorCisvKioKKyAqIFJlbmRlcnMgYW4gaW50ZXJmYWNlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgsIGJvb2wgYWRkRXJyb3IpIHsKKyAgc3RyaW5nIHNpZ25hdHVyZSA9IHB1YmxpY2l6ZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIigiOworICBzaWduYXR1cmUgKz0gImN0eCBjb250ZXh0LkNvbnRleHQiOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgc2lnbmF0dXJlICs9ICIsICIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisgIH0KKyAgc2lnbmF0dXJlICs9ICIpICgiOworCisgIHRfdHlwZSogcmV0ID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBzdHJpbmcgZXJycyA9IGFyZ3VtZW50X2xpc3QoZXhjZXB0aW9ucyk7CisKKyAgaWYgKCFyZXQtPmlzX3ZvaWQoKSkgeworICAgIHNpZ25hdHVyZSArPSAiciAiICsgdHlwZV90b19nb190eXBlKHJldCk7CisKKyAgICBpZiAoYWRkRXJyb3IgfHwgZXJycy5zaXplKCkgPT0gMCkgeworICAgICAgc2lnbmF0dXJlICs9ICIsICI7CisgICAgfQorICB9CisKKyAgaWYgKGFkZEVycm9yKSB7CisgICAgc2lnbmF0dXJlICs9ICJlcnIgZXJyb3IiOworICB9CisKKyAgc2lnbmF0dXJlICs9ICIpIjsKKyAgcmV0dXJuIHNpZ25hdHVyZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisKKyAgICByZXN1bHQgKz0gdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiICIKKyAgICAgICAgICAgICAgKyB0eXBlX3RvX2dvX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIG1vZHVsZSggbW9kdWxlX25hbWUodHR5cGUpKTsKKyAgaWYoICEgbW9kdWxlLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gbW9kdWxlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6bW9kdWxlX25hbWUodF90eXBlKiB0dHlwZSkgeworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBpZiAocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiZ28iKS5lbXB0eSgpIHx8CisgICAgICAgIHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJnbyIpLmVtcHR5KCkgfHwKKyAgICAgICAgcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiZ28iKSAhPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZ28iKSkgeworICAgICAgc3RyaW5nIG1vZHVsZShnZXRfcmVhbF9nb19tb2R1bGUocHJvZ3JhbSkpOworICAgICAgLy8gZm9yIG5hbWVzcGFjZWQgaW5jbHVkZXMsIG9ubHkga2VlcCBwYXJ0IGFmdGVyIGRvdC4KKyAgICAgIHNpemVfdCBkb3QgPSBtb2R1bGUucmZpbmQoJy4nKTsKKyAgICAgIGlmIChkb3QgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIG1vZHVsZSA9IG1vZHVsZS5zdWJzdHIoZG90ICsgMSk7CisgICAgICB9CisgICAgICByZXR1cm4gbW9kdWxlOworICAgIH0KKyAgfQorCisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGdvIHR5b2UKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIC8qIHRoaXMgaXMgd3JvbmcsIGJpbmFyeSBpcyBzdGlsbCBhIHN0cmluZyB0eXBlIGludGVybmFsbHkKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIHJldHVybiAidGhyaWZ0LkJJTkFSWSI7CisgICAgICB9CisgICAgICAqLworICAgICAgcmV0dXJuICJ0aHJpZnQuU1RSSU5HIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAidGhyaWZ0LkJPT0wiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAidGhyaWZ0LkJZVEUiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gInRocmlmdC5JMTYiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gInRocmlmdC5JMzIiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gInRocmlmdC5JNjQiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gInRocmlmdC5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gInRocmlmdC5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gInRocmlmdC5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJ0aHJpZnQuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAidGhyaWZ0LlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJ0aHJpZnQuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyBtYXAgdHlwZSwgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgd2lsbAorICogbm90IHByb2R1Y2UgYSB2YWxpZCBnbyBtYXAgdHlwZS4KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2dvX2tleV90eXBlKHRfdHlwZSogdHlwZSkgeworICB0X3R5cGUqIHJlc29sdmVkX3R5cGUgPSB0eXBlOworCisgIHdoaWxlIChyZXNvbHZlZF90eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXNvbHZlZF90eXBlID0gKCh0X3R5cGVkZWYqKXJlc29sdmVkX3R5cGUpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgIH0KKworICBpZiAocmVzb2x2ZWRfdHlwZS0+aXNfbWFwKCkgfHwgcmVzb2x2ZWRfdHlwZS0+aXNfbGlzdCgpIHx8IHJlc29sdmVkX3R5cGUtPmlzX3NldCgpKSB7CisgICAgdGhyb3cgIkNhbm5vdCBwcm9kdWNlIGEgdmFsaWQgdHlwZSBmb3IgYSBHbyBtYXAga2V5OiAiICsgdHlwZV90b19nb190eXBlKHR5cGUpICsgIiAtIGFib3J0aW5nLiI7CisgIH0KKworICBpZiAocmVzb2x2ZWRfdHlwZS0+aXNfYmluYXJ5KCkpCisgICAgcmV0dXJuICJzdHJpbmciOworCisgIHJldHVybiB0eXBlX3RvX2dvX3R5cGUodHlwZSk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eXBlCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19nb190eXBlKHRfdHlwZSogdHlwZSkgeworICByZXR1cm4gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KHR5cGUsIGZhbHNlKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGdvIHR5cGUsIHRha2luZyBpbnRvIGFjY291bnQgd2hldGhlciB0aGUgZmllbGQKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHlwZSBpcyBUX09QVElPTkFMLgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fZ29fdHlwZV93aXRoX29wdCh0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsX2ZpZWxkKSB7CisgIHN0cmluZyBtYXliZV9wb2ludGVyKG9wdGlvbmFsX2ZpZWxkID8gIioiIDogIiIpOworCisgIGlmICh0eXBlLT5pc190eXBlZGVmKCkgJiYgKCh0X3R5cGVkZWYqKXR5cGUpLT5pc19mb3J3YXJkX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90cnVlX3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgIltdYnl0ZSI7CisgICAgICB9CisKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgInN0cmluZyI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJib29sIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQ4IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiaW50MTYiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQzMiI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImludDY0IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiZmxvYXQ2NCI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKiIgKyBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0ID0gKHRfbWFwKil0eXBlOworICAgIHN0cmluZyBrZXlUeXBlID0gdHlwZV90b19nb19rZXlfdHlwZSh0LT5nZXRfa2V5X3R5cGUoKSk7CisgICAgc3RyaW5nIHZhbHVlVHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfdmFsX3R5cGUoKSk7CisgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBzdHJpbmcoIm1hcFsiKSArIGtleVR5cGUgKyAiXSIgKyB2YWx1ZVR5cGU7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdCA9ICh0X3NldCopdHlwZTsKKyAgICBzdHJpbmcgZWxlbVR5cGUgPSB0eXBlX3RvX2dvX3R5cGUodC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHN0cmluZygiW10iKSArIGVsZW1UeXBlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdCA9ICh0X2xpc3QqKXR5cGU7CisgICAgc3RyaW5nIGVsZW1UeXBlID0gdHlwZV90b19nb190eXBlKHQtPmdldF9lbGVtX3R5cGUoKSk7CisgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBzdHJpbmcoIltdIikgKyBlbGVtVHlwZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHB1YmxpY2l6ZSh0eXBlX25hbWUodHlwZSkpOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2dvX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKiogU2VlIHRoZSBjb21tZW50IGluc2lkZSBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbiBmb3Igd2hhdCB0aGlzIGlzLiAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKSB7CisgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJuaWwiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiLnRocmlmdF9zcGVjKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiCisgICAgICAgICAgICsgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIiwiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fc3BlY19hcmdzOiAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK2Jvb2wgZm9ybWF0X2dvX291dHB1dChjb25zdCBzdHJpbmcmIGZpbGVfcGF0aCkgeworCisgIC8vIGZvcm1hdHRpbmcgdmlhIGdvZm10IGRlYWN0aXZhdGVkIGR1ZSB0byBUSFJJRlQtMzg5MworICAvLyBQbGVhc2UgbG9vayBhdCB0aGUgdGlja2V0IGFuZCBtYWtlIHN1cmUgeW91IGZ1bGx5IHVuZGVyc3RhbmQgYWxsIHRoZSBpbXBsaWNhdGlvbnMKKyAgLy8gYmVmb3JlIHN1Ym1pdHRpbmcgYSBwYXRjaCB0aGF0IGVuYWJsZXMgdGhpcyBmZWF0dXJlIGFnYWluLiBUaGFuayB5b3UuCisgICh2b2lkKSBmaWxlX3BhdGg7CisgIHJldHVybiBmYWxzZTsKKworICAvKgorICBjb25zdCBzdHJpbmcgY29tbWFuZCA9ICJnb2ZtdCAtdyAiICsgZmlsZV9wYXRoOworCisgIGlmIChzeXN0ZW0oY29tbWFuZC5jX3N0cigpKSA9PSAwKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkcgLSBSdW5uaW5nICclcycgZmFpbGVkLlxuIiwgY29tbWFuZC5jX3N0cigpKTsKKyAgcmV0dXJuIGZhbHNlOworICAqLworIH0KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihnbywgIkdvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBwYWNrYWdlX3ByZWZpeD0gIFBhY2thZ2UgcHJlZml4IGZvciBnZW5lcmF0ZWQgZmlsZXMuXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB0aHJpZnRfaW1wb3J0PSAgIE92ZXJyaWRlIHRocmlmdCBwYWNrYWdlIGltcG9ydCBwYXRoIChkZWZhdWx0OiIgKyBERUZBVUxUX1RIUklGVF9JTVBPUlQgKyAiKVxuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcGFja2FnZT0gICAgICAgICBQYWNrYWdlIG5hbWUgKGRlZmF1bHQ6IGluZmVycmVkIGZyb20gdGhyaWZ0IGZpbGUgbmFtZSlcbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGlnbm9yZV9pbml0aWFsaXNtc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBhdXRvbWF0aWMgc3BlbGxpbmcgY29ycmVjdGlvbiBvZiBpbml0aWFsaXNtcyAoZS5nLiBcIlVSTFwiKVxuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcmVhZF93cml0ZV9wcml2YXRlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICBNYWtlIHJlYWQvd3JpdGUgbWV0aG9kcyBwcml2YXRlLCBkZWZhdWx0IGlzIHB1YmxpYyBSZWFkL1dyaXRlXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2d2X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzBhY2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpwYWlyOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogR3JhcGh2aXogY29kZSBnZW5lcmF0b3IKKyAqLworY2xhc3MgdF9ndl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2d2X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBleGNlcHRpb25fYXJyb3dzID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZXhjZXB0aW9ucyIpID09IDApIHsKKyAgICAgICAgZXhjZXB0aW9uX2Fycm93cyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZ3Y6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWd2IjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBlbmQgb2YgZ2VuZXJhdG9yCisgICAqLworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBIZWxwZXJzCisgICAqLworICB2b2lkIHByaW50X3R5cGUodF90eXBlKiB0dHlwZSwgc3RyaW5nIHN0cnVjdF9maWVsZF9yZWYpOworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworcHJpdmF0ZToKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX291dF87CisgIHN0ZDo6bGlzdDxzdHJpbmc+IGVkZ2VzOworICBib29sIGV4Y2VwdGlvbl9hcnJvd3M7Cit9OworCisvKioKKyAqIEluaXQgZ2VuZXJhdG9yOgorICogLSBBZGRzIHNvbWUgZXNjYXBpbmcgZm9yIHRoZSBHcmFwaHZpeiBkb21haW4uCisgKiAtIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGFuZCBvcGVuIGZpbGUgZm9yIHdyaXR0aW5nLgorICogLSBXcml0ZSB0aGUgZmlsZSBoZWFkZXIuCisgKi8KK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBlc2NhcGVfWyd7J10gPSAiXFx7IjsKKyAgZXNjYXBlX1snfSddID0gIlxcfSI7CisKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHN0cmluZyBmbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuZ3YiOworICBmX291dF8ub3BlbihmbmFtZS5jX3N0cigpKTsKKyAgZl9vdXRfIDw8ICJkaWdyYXBoIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHByb2dyYW1fbmFtZV8pIDw8ICJcIiB7IiA8PCBlbmRsOworICBmX291dF8gPDwgIm5vZGUgW3N0eWxlPWZpbGxlZCwgc2hhcGU9cmVjb3JkXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiZWRnZSBbYXJyb3dzaXplPTAuNV07IiA8PCBlbmRsOworICBmX291dF8gPDwgInJhbmtkaXI9TFIiIDw8IGVuZGw7Cit9CisKKy8qKgorICogQ2xvc2VzIGdlbmVyYXRvcjoKKyAqIC0gUHJpbnQgYWNjdW11bGF0ZWQgbm9kZXMgY29ubmVjdGlvbnMuCisgKiAtIFByaW50IGZvb3Rub3RlLgorICogLSBDbG9zZXMgZmlsZS4KKyAqLwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBQcmludCBlZGdlcworICBzdGQ6Omxpc3Q8c3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IGVkZ2VzLmJlZ2luKCk7CisgIGZvciAoOyBpdGVyICE9IGVkZ2VzLmVuZCgpOyBpdGVyKyspIHsKKyAgICBmX291dF8gPDwgKCppdGVyKSA8PCBlbmRsOworICB9CisKKyAgLy8gUHJpbnQgZ3JhcGggZW5kIH0gYW5kIGNsb3NlIGZpbGUKKyAgZl9vdXRfIDw8ICJ9IiA8PCBlbmRsOworICBmX291dF8uY2xvc2UoKTsKK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0cmluZyBuYW1lID0gdHR5cGVkZWYtPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWF6dXJlXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiIjsKKworICBmX291dF8gPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKyAgZl9vdXRfIDw8ICIgOjogIjsKKyAgcHJpbnRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgbmFtZSk7CisKKyAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RyaW5nIG5hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9d2hpdGVdOyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCJlbnVtICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKKyAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKKyAgICBmX291dF8gPDwgJ3wnIDw8ICgqdmFsX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiID0gIjsKKyAgICBmX291dF8gPDwgKCp2YWxfaXRlciktPmdldF92YWx1ZSgpOworICB9CisKKyAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisKKyAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YWxpY2VibHVlXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiY29uc3RfIiA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiIjsKKworICBmX291dF8gPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKyAgZl9vdXRfIDw8ICIgPSAiOworICBwcmludF9jb25zdF92YWx1ZSh0Y29uc3QtPmdldF90eXBlKCksIHRjb25zdC0+Z2V0X3ZhbHVlKCkpOworICBmX291dF8gPDwgIiA6OiAiOworICBwcmludF90eXBlKHRjb25zdC0+Z2V0X3R5cGUoKSwgImNvbnN0XyIgKyBuYW1lKTsKKworICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1saWdodHBpbmtdOyIgPDwgZW5kbDsKKyAgICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisgICAgZl9vdXRfIDw8ICJleGNlcHRpb24gIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOworICB9IGVsc2UgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1saWdodGN5YW5dOyIgPDwgZW5kbDsKKyAgICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisgICAgZl9vdXRfIDw8ICJ1bmlvbiAiIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YmVpZ2VdOyIgPDwgZW5kbDsKKyAgICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisgICAgZl9vdXRfIDw8ICJzdHJ1Y3QgIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOworICB9CisKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7CisgIGZvciAoOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgc3RyaW5nIGZpZWxkX25hbWUgPSAoKm1lbV9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIHByaW50IHBvcnQgKGFuY2hvciByZWZlcmVuY2UpCisgICAgZl9vdXRfIDw8ICJ8PGZpZWxkXyIgPDwgZmllbGRfbmFtZSA8PCAnPic7CisKKyAgICAvLyBmaWVsZCBuYW1lIDo6IGZpZWxkIHR5cGUKKyAgICBmX291dF8gPDwgKCptZW1faXRlciktPmdldF9uYW1lKCk7CisgICAgZl9vdXRfIDw8ICIgOjogIjsKKyAgICBwcmludF90eXBlKCgqbWVtX2l0ZXIpLT5nZXRfdHlwZSgpLCBuYW1lICsgIjpmaWVsZF8iICsgZmllbGRfbmFtZSk7CisgIH0KKworICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OnByaW50X3R5cGUodF90eXBlKiB0dHlwZSwgc3RyaW5nIHN0cnVjdF9maWVsZF9yZWYpIHsKKyAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBmX291dF8gPDwgImxpc3RcXDwiOworICAgICAgcHJpbnRfdHlwZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHN0cnVjdF9maWVsZF9yZWYpOworICAgICAgZl9vdXRfIDw8ICJcXD4iOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBmX291dF8gPDwgInNldFxcPCI7CisgICAgICBwcmludF90eXBlKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgICAgIGZfb3V0XyA8PCAiXFw+IjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgZl9vdXRfIDw8ICJtYXBcXDwiOworICAgICAgcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgICAgIGZfb3V0XyA8PCAiXFw+IjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgZl9vdXRfIDw8ICh0dHlwZS0+aXNfYmluYXJ5KCkgPyAiYmluYXJ5IiA6IHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgZWRnZXMucHVzaF9iYWNrKHN0cnVjdF9maWVsZF9yZWYgKyAiIC0+ICIgKyB0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgb3V0IGFuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2d2X2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHN3aXRjaCAodHZhbHVlLT5nZXRfdHlwZSgpKSB7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIGZfb3V0XyA8PCAiXFxcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHR2YWx1ZSkgPDwgIlxcXCIiOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDogeworICAgIGZfb3V0XyA8PCAiXFx7ICI7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gbWFwX2VsZW1zID0gdHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46Oml0ZXJhdG9yIG1hcF9pdGVyOworICAgIGZvciAobWFwX2l0ZXIgPSBtYXBfZWxlbXMuYmVnaW4oKTsgbWFwX2l0ZXIgIT0gbWFwX2VsZW1zLmVuZCgpOyBtYXBfaXRlcisrKSB7CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgbWFwX2l0ZXItPmZpcnN0KTsKKyAgICAgIGZfb3V0XyA8PCAiID0gIjsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgbWFwX2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGZfb3V0XyA8PCAiIFxcfSI7CisgIH0gYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDogeworICAgIGZfb3V0XyA8PCAiXFx7ICI7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0X2VsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOworICAgIDsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXN0X2l0ZXI7CisgICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOyBsaXN0X2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICpsaXN0X2l0ZXIpOworICAgICAgfQorICAgIH0KKyAgICBmX291dF8gPDwgIiBcXH0iOworICB9IGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgZl9vdXRfIDw8IGVzY2FwZV9zdHJpbmcodHlwZS0+Z2V0X25hbWUoKSkgPDwgIi4iCisgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcodHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGZfb3V0XyA8PCAiVU5LTk9XTiI7CisgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBzZXJ2aWNlX25hbWUgPSBnZXRfc2VydmljZV9uYW1lKHRzZXJ2aWNlKTsKKyAgZl9vdXRfIDw8ICJzdWJncmFwaCBjbHVzdGVyXyIgPDwgc2VydmljZV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YmlzcXVlXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAic3R5bGU9ZGFzaGVkOyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJsYWJlbCA9IFwiIiA8PCBlc2NhcGVfc3RyaW5nKHNlcnZpY2VfbmFtZSkgPDwgIiBzZXJ2aWNlXCI7IiA8PCBlbmRsOworCisgIC8vIFRPRE86IHNlcnZpY2UgZXh0ZW5kcworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICBmb3IgKDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgeworICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGZfb3V0XyA8PCAiZnVuY3Rpb25fIiA8PCBzZXJ2aWNlX25hbWUgPDwgZm5fbmFtZTsKKyAgICBmX291dF8gPDwgIltsYWJlbD1cIjxyZXR1cm5fdHlwZT5mdW5jdGlvbiAiIDw8IGVzY2FwZV9zdHJpbmcoZm5fbmFtZSk7CisgICAgZl9vdXRfIDw8ICIgOjogIjsKKyAgICBwcmludF90eXBlKCgqZm5faXRlciktPmdldF9yZXR1cm50eXBlKCksICJmdW5jdGlvbl8iICsgc2VydmljZV9uYW1lICsgZm5fbmFtZSArICI6cmV0dXJuX3R5cGUiKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7CisgICAgZm9yICg7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKKyAgICAgIGZfb3V0XyA8PCAifDxwYXJhbV8iIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI+IjsKKyAgICAgIGZfb3V0XyA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICgoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICBmX291dF8gPDwgIiA9ICI7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgfQorICAgICAgZl9vdXRfIDw8ICIgOjogIjsKKyAgICAgIHByaW50X3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICJmdW5jdGlvbl8iICsgc2VydmljZV9uYW1lICsgZm5fbmFtZSArICI6cGFyYW1fIiArICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgLy8gZW5kIG9mIG5vZGUKKyAgICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7CisKKyAgICAvLyBFeGNlcHRpb24gZWRnZXMKKyAgICBpZiAoZXhjZXB0aW9uX2Fycm93cykgeworICAgICAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKKyAgICAgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgICAgICBlZGdlcy5wdXNoX2JhY2soImZ1bmN0aW9uXyIgKyBzZXJ2aWNlX25hbWUgKyBmbl9uYW1lICsgIiAtPiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICgqZXhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgKyAiIFtjb2xvcj1yZWRdIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZl9vdXRfIDw8ICIgfSIgPDwgZW5kbDsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBndiwKKyAgICAiR3JhcGh2aXoiLAorICAgICIgICAgZXhjZXB0aW9uczogICAgICBXaGV0aGVyIHRvIGRyYXcgYXJyb3dzIGZyb20gZnVuY3Rpb25zIHRvIGV4Y2VwdGlvbi5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hheGVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2YyY2QxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI5ODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEhheGUgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2hheGVfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfaGF4ZV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBjYWxsYmFja3NfID0gZmFsc2U7CisgICAgcnR0aV8gPSBmYWxzZTsKKyAgICBidWlsZG1hY3JvXyA9ICIiOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNhbGxiYWNrcyIpID09IDApIHsKKyAgICAgICAgY2FsbGJhY2tzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJ0dGkiKSA9PSAwKSB7CisgICAgICAgIHJ0dGlfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYnVpbGRtYWNybyIpID09IDApIHsKKyAgICAgICAgYnVpbGRtYWNyb18gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBoYXhlOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1oYXhlIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSBvdmVycmlkZTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIC8vIHJlbW92ZWQgLS0gZXF1YWxpdHksY29tcGFyZV90bworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9tZXRhX2RhdGFfbWFwKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfaGF4ZV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHlfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICAvLyByZW1vdmVkIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpc19pbnRlcmZhY2UpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworCisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oc3RkOjpvc3RyZWFtJiBvdXQpOworICB2b2lkIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oc3RkOjpvc3RyZWFtJiBvdXQpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBoYXhlX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgaGF4ZV90eXBlX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgaGF4ZV90aHJpZnRfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKTsKKyAgc3RkOjpzdHJpbmcgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLCBib29sIGluX2luaXQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSBvdmVycmlkZTsKKyAgc3RyaW5nIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX29uc3VjY2Vzcyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgYXNfdHlwZSwgYm9vbCBvbWl0X25hbWUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfbm9ybWFsKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpc19pbnRlcmZhY2UpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAvLyBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDogIC0gSW50NjQgaXMgbm90IHJlYWxseSBudWxsYWJsZSwgZXZlbiB0aG91Z2ggaXQgYmVoYXZlZCB0aGF0CisgICAgICAgIC8vIHdheSBiZWZvcmUgSGF4ZSAzLjIuMAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworCitwcml2YXRlOgorICBib29sIGNhbGxiYWNrc187CisgIGJvb2wgcnR0aV87CisgIHN0cmluZyBidWlsZG1hY3JvXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHBhY2thZ2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworCisgIC8vIEhheGUgcGFja2FnZSBuYW1lcyBhcmUgbG93ZXJjYXNlCisgIGlmIChwYWNrYWdlX25hbWVfLmxlbmd0aCgpID4gMCkgeworICAgIHBhY2thZ2VfbmFtZV9bMF0gPSB0b2xvd2VyKHBhY2thZ2VfbmFtZV9bMF0pOworICAgIHNpemVfdCBpbmRleCA9IHBhY2thZ2VfbmFtZV8uZmluZCgnLicpOworICAgIHdoaWxlIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgaWYgKCsraW5kZXggPCBwYWNrYWdlX25hbWVfLmxlbmd0aCgpKSB7CisgICAgICAgIHBhY2thZ2VfbmFtZV9baW5kZXhdID0gdG9sb3dlcihwYWNrYWdlX25hbWVfW2luZGV4XSk7CisgICAgICB9CisgICAgICBpbmRleCA9IHBhY2thZ2VfbmFtZV8uZmluZCgnLicsIGluZGV4KTsKKyAgICB9CisgIH0KKworICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKGRpci5zaXplKCkgPiAwKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgfQorCisgIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKK30KKworLyoqCisgKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV9wYWNrYWdlKCkgeworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfOworICB9CisgIHJldHVybiAicGFja2FnZSI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGhheGUgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBoYXhlIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV90eXBlX2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyLio7XG4iICsgImltcG9ydCBoYXhlLmlvLkJ5dGVzO1xuIgorICAgICAgICAgKyAiaW1wb3J0IGhheGUuZHMuSW50TWFwO1xuIiArICJpbXBvcnQgaGF4ZS5kcy5TdHJpbmdNYXA7XG4iCisgICAgICAgICArICJpbXBvcnQgaGF4ZS5kcy5PYmplY3RNYXA7XG4iICsgIlxuIiArICIjaWYgZmxhc2hcbiIKKyAgICAgICAgICsgImltcG9ydCBmbGFzaC5lcnJvcnMuQXJndW1lbnRFcnJvcjtcbiIgKyAiI2VuZFxuIiArICJcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGhheGUgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0CisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpoYXhlX3RocmlmdF9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjtcbiIKKyAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuIiArICJcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIGltcG9ydHMgbmVlZGVkIGZvciBhIGdpdmVuIHR5cGUKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGEgZ2l2ZW4gdF9zdHJ1Y3QKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcmIGltcG9ydHMpIHsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8vIEZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcmVudCBuYW1lc3BhY2UKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworICAgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKGltcG9ydHMuZmluZChwYWNrYWdlICsgIi4iICsgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBpbXBvcnRzLmFwcGVuZCgiaW1wb3J0ICIgKyBwYWNrYWdlICsgIi4iICsgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpICsgIjtcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBpbXBvcnRzOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc2VydmljZQorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgaW1wb3J0czsKKyAgY29uc3QgdmVjdG9yPHRfZnVuY3Rpb24qPiYgZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcmVudCBuYW1lc3BhY2UKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKyAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIjtcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLCBpbXBvcnRzKTsKKyAgICBoYXhlX3RocmlmdF9nZW5faW1wb3J0cygoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSwgaW1wb3J0cyk7CisgIH0KKworICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBOb3RoaW5nIGluIGhheGUKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBoYXhlLCBzaW5jZSBpdCBkb2VzCisgKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKKyAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuaHgiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAorICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBBZGQgaGF4ZSBpbXBvcnRzCisgIGZfZW51bSA8PCBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyLio7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKGZfZW51bSk7CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9lbnVtKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgImNsYXNzICIgPDwgZ2V0X2NhcF9uYW1lKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiICI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIDogSW50ID0gIiA8PCB2YWx1ZQorICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc3RhdGljIFNldCB3aXRoIGFsbCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQorICBmX2VudW0gPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyB2YXIgVkFMSURfVkFMVUVTID0geyBuZXcgSW50U2V0KCBbIjsKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZmlyc3RWYWx1ZSA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgLy8gcG9wdWxhdGUgc2V0CisgICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgZmlyc3RWYWx1ZSA9IGZhbHNlOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfZW51bSA8PCAiXSk7IH07IiA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIHZhciBWQUxVRVNfVE9fTkFNRVMgPSB7IFsiOworICBpbmRlbnRfdXAoKTsKKyAgZmlyc3RWYWx1ZSA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCIpIDw8IGVuZGw7CisgICAgaW5kZW50KGZfZW51bSkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gXCIiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIiOworICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKKyAgfQorICBmX2VudW0gPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgIl07IH07IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIGNsYXNzCisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShwcm9ncmFtX25hbWVfKSArICJDb25zdGFudHMuaHgiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9jb25zdHMgPDwgZW5kbDsKKworICBmX2NvbnN0cyA8PCBoYXhlX3R5cGVfaW1wb3J0cygpOworCisgIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX2NvbnN0cyk7CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9jb25zdHMpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJjbGFzcyAiIDw8IGdldF9jYXBfbmFtZShwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7CisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaW5kZW50KG91dCk7CisgIGlmICghZGVmdmFsKSB7CisgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAidmFyICIgOiAicHVibGljIHN0YXRpYyBpbmxpbmUgdmFyICAiKTsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvdXQgPDwgbmFtZSA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiCisgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKKyAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpIDogVm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCAodHlwZS0+aXNfbGlzdCgpID8gInB1c2giIDogImFkZCIpIDw8ICIoIiA8PCB2YWwgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCisgKiB3aXRoIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgYW4gaW5uZXIgSXNzZXQgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2hheGVfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEhheGUgc3RydWN0IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGlzX3Jlc3VsdCkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5oeCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbDsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIHN0cmluZyBpbXBvcnRzOworCisgIGZfc3RydWN0IDw8IGhheGVfdHlwZV9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfaW1wb3J0cygpCisgICAgICAgICAgIDw8IGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzdHJ1Y3QsIGltcG9ydHMpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBpc19yZXN1bHQpOworCisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKKy8qKgorICogaGF4ZSBzdHJ1Y3QgZGVmaW5pdGlvbi4gVGhpcyBoYXMgdmFyaW91cyBwYXJhbWV0ZXJzLCBhcyBpdCBjb3VsZCBiZQorICogZ2VuZXJhdGVkIHN0YW5kYWxvbmUgb3IgaW5zaWRlIGFub3RoZXIgY2xhc3MgYXMgYSBoZWxwZXIuIElmIGl0CisgKiBpcyBhIGhlbHBlciB0aGFuIGl0IGlzIGEgc3RhdGljIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPworICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCisgKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgZ2VuZXJhdGVfaGF4ZV9kb2Mob3V0LCB0c3RydWN0KTsKKworICBzdHJpbmcgY2xzbmFtZSA9IGdldF9jYXBfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKKworICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24ob3V0KTsKKyAgZ2VuZXJhdGVfbWFjcm9fZGVjb3JhdGlvbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCBjbHNuYW1lIDw8ICIgIjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJleHRlbmRzIFRFeGNlcHRpb24gIjsKKyAgfQorICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UgIjsKKworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgdmFyIFNUUlVDVF9ERVNDID0geyBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyB9OyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHZhciAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IHsgbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IH07IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgKm1faXRlcik7CisgICAgLy8gaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArICIgOiAiICsKKyAgICAvLyB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiQDppc1ZhciIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZhciAiCisgICAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsgIihnZXQsc2V0KSA6ICIKKyAgICAgICAgICAgICAgICAgICArIGdldF9jYXBfbmFtZSh0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlubGluZSBzdGF0aWMgdmFyICIgPDwgdXBjYXNlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9JRCA6IEludCA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBJbm5lciBJc3NldCBjbGFzcworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA6IEJvb2wgPSBmYWxzZTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gU3RhdGljIGluaXRpYWxpemVyIHRvIHBvcHVsYXRlIGdsb2JhbCBjbGFzcyB0byBzdHJ1Y3QgbWV0YWRhdGEgbWFwCisgIGlmIChmYWxzZSkgeworICAgIC8vIFRPRE86IHJlYWN0aXZhdGUgd2hlbiBuZWVkZWQKKyAgICBnZW5lcmF0ZV9oYXhlX21ldGFfZGF0YV9tYXAob3V0LCB0c3RydWN0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCBtZXRhRGF0YU1hcCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJzdXBlcigpOyIgPDwgZW5kbDsKKyAgfQorICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcHJvcGVydHlfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGlmIChpc19yZXN1bHQpIHsKKyAgICBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfaGF4ZV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcmVhZCggaXByb3QgOiBUUHJvdG9jb2wpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkIDogVEZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IgorICAgICAgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0lEOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAqZl9pdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCisgICAgICA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJjYXRjaChlOkR5bmFtaWMpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKKyAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlLCB3aGljaCBjYW4ndCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIV9faXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIGdlbmVyYXRlcyBoYXhlIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCisvLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZS4iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICAgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCisgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiICYmICEiCisgICAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUoZ2V0X2VudW1fY2xhc3NfbmFtZSh0eXBlKSkgPDwgIi5WQUxJRF9WQUxVRVMuY29udGFpbnMoIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikpeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlVOS05PV04sIFwiVGhlIGZpZWxkICciCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiJyBoYXMgYmVlbiBhc3NpZ25lZCB0aGUgaW52YWxpZCB2YWx1ZSBcIiArICIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImNhdGNoKGU6RHluYW1pYykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IGU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKKyAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgorICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KKyAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImNhdGNoKGU6RHluYW1pYykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IGU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgICh2b2lkKXR5cGU7CisgICh2b2lkKWNhcF9uYW1lOworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIl9GSUVMRF9JRDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICAodm9pZCl0eXBlOworICAodm9pZCljYXBfbmFtZTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKKworICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgc2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0RmllbGRWYWx1ZShmaWVsZElEIDogSW50LCB2YWx1ZSA6IER5bmFtaWMpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOworICAgIG91dCA8PCBzZXR0ZXJfc3RyZWFtLnN0cigpOworICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShmaWVsZElEIDogSW50KSA6IER5bmFtaWMgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgZ2V0dGVyX3N0cmVhbS5zdHIoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Cit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKKyAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhICIKKyAgICAgICAgICAgICAgICAgInZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzU2V0KGZpZWxkSUQgOiBJbnQpIDogQm9vbCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXQgb2YgcHJvcGVydHkgc2V0dGVycy9nZXR0ZXJzIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5X2dldHRlcnNfc2V0dGVycyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgLy8gU2ltcGxlIGdldHRlcgorICAgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiKCkgOiAiIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUodHlwZSkpCisgICAgICAgICAgICAgICAgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiKCIgPDwgZmllbGRfbmFtZSA8PCAiOiIKKyAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHR5cGUpKSA8PCAiKSA6ICIgPDwgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0eXBlKSkgPDwgIiB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBVbnNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSA6IEJvb2wgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiCisgICAgICA8PCAiZnVuY3Rpb24gdG9TdHJpbmcoKSA6IFN0cmluZyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciByZXQgOiBTdHJpbmcgPSBcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmlyc3QgOiBCb29sID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSByZXQgKz0gIFwiLCBcIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiOyIgPDwgZW5kbDsKKyAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwibnVsbFwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIkJJTkFSWVwiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIl9uYW1lIDogU3RyaW5nID0gIiA8PCBnZXRfY2FwX25hbWUoZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkpCisgICAgICAgICAgICAgICAgICA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIgKFwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIpXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXQgKz0gXCIpXCI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmV0OyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCisgKiBmaWVsZE5hbWUgbWFwcGluZworICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfbWV0YV9kYXRhX21hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBGaWVsZE1ldGFEYXRhIG1hcHBpbmdzCisgIGluZGVudChvdXQpIDw8ICJpbmxpbmUgc3RhdGljIHZhciBtZXRhRGF0YU1hcCA6IEludE1hcCA9IG5ldyBJbnRNYXAoKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgLy8gUG9wdWxhdGUgbWFwCisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGFEYXRhTWFwWyIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKQorICAgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9JRF0gPSBuZXcgRmllbGRNZXRhRGF0YShcIiIgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7CisKKyAgICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOworICAgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOworICAgICAgfQorCisgICAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhCisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGhheGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCisgKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCisgKi8KK3N0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9oYXhlX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2V0X2hheGVfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlRUeXBlLlZPSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfaGF4ZV90eXBlX3N0cmluZyEiKTsKKyAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgICAgfQorICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigKKyAgICAgICAgIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2hheGVfdHlwZV9zdHJpbmchIik7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgfQorfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTGlzdE1ldGFEYXRhKFRUeXBlLkxJU1QsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IFNldE1ldGFEYXRhKFRUeXBlLlNFVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSB7IC8vIG1hcAorICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7CisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKKyAgICAgIG91dCA8PCAiLCAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9oYXhlX3R5cGVfc3RyaW5nKHR5cGUpOworICB9CisgIG91dCA8PCAiKSI7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKKyAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcworICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBNYWtlIGludGVyZmFjZSBmaWxlCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSArICIuaHgiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKSA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisgICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKworICAvLyBOb3cgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24vY2xpZW50IGZpbGUKKyAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgKyAiSW1wbC5oeCI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKQorICAgICAgICAgICAgIDw8IGhheGVfdGhyaWZ0X2ltcG9ydHMoKSA8PCBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSkgPDwgZW5kbDsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHRfdHlwZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgc3RyaW5nIHBhcmVudF9uYW1lc3BhY2UgPSBwYXJlbnQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKyAgICBpZiAoIXBhcmVudF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBwYXJlbnRfbmFtZXNwYWNlICE9IHBhY2thZ2VfbmFtZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHR5cGVfbmFtZShwYXJlbnQpIDw8ICJJbXBsOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKworICAvLyBOb3cgbWFrZSB0aGUgaGVscGVyIGNsYXNzIGZpbGVzCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgLy8gTm93IG1ha2UgdGhlIHByb2Nlc3Nvci9zZXJ2ZXIgZmlsZQorICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSArICJQcm9jZXNzb3IuaHgiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGhheGVfdHlwZV9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7CisKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuKjsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLiIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pLmNfc3RyKCkKKyAgICAgICAgICAgICAgIDw8ICJJbXBsOyIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgY29kZSBzbmlwcGV0IGZvciB0aGUgb25TdWNjZXNzIGNhbGxiYWNrcworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29kZSBmb3IuCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFzX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb21pdF9uYW1lKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSAiIjsKKyAgaWYgKCFvbWl0X25hbWUpIHsKKyAgICBuYW1lID0gIm9uU3VjY2VzcyI7CisgICAgaWYgKGFzX3R5cGUpIHsKKyAgICAgIG5hbWUgKz0gIiA6ICI7CisgICAgfQorICB9CisKKyAgaWYgKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgaWYgKGFzX3R5cGUpIHsKKyAgICAgIHJldHVybiBuYW1lICsgIlZvaWQtPlZvaWQgPSBudWxsIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5hbWUgKyAiKCkgOiBWb2lkIjsKKyAgICB9CisgIH0KKworICBpZiAoYXNfdHlwZSkgeworICAgIHJldHVybiBuYW1lICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiLT5Wb2lkID0gbnVsbCI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5hbWUgKyAiKCByZXR2YWwgOiAiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiKSI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKSB7CisgIGlmIChjYWxsYmFja3NfKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX2NhbGxiYWNrKHRmdW5jdGlvbiwgaXNfaW50ZXJmYWNlKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfbm9ybWFsKHRmdW5jdGlvbiwgaXNfaW50ZXJmYWNlKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgbWV0aG9kIGhlYWRlciBpbiAibm9ybWFsIiBzdHlsZQorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29kZSBmb3IuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbnRlcmZhY2UpIHsKKyAgaWYgKGlzX2ludGVyZmFjZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRmdW5jdGlvbikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9ub3JtYWwodGZ1bmN0aW9uKSA8PCAiIHsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIgaW4gImNhbGxiYWNrIiBzdHlsZQorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29kZSBmb3IuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX2NhbGxiYWNrKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW50ZXJmYWNlKSB7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHN0ZDo6c3RyaW5nIG9uX3N1Y2Nlc3NfaW1wbCA9IGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX29uc3VjY2Vzcyh0ZnVuY3Rpb24sIGZhbHNlLCBmYWxzZSk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvLyBmdW5jdGlvbiBvbkVycm9yKER5bmFtaWMpIDogVm9pZDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvLyBmdW5jdGlvbiAiIDw8IG9uX3N1Y2Nlc3NfaW1wbC5jX3N0cigpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGlzX2ludGVyZmFjZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfY2FsbGJhY2sodGZ1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2NhbGxiYWNrKHRmdW5jdGlvbikgPDwgIiB7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgIH0KKworICBnZW5lcmF0ZV9oYXhlX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIC8vIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX3NlcnZpY2VfKTsgLSBub3QgeWV0LCBiZWNhdXNlIG9mCisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy8zNjI2CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImludGVyZmFjZSAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9oYXhlX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSk7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZ2V0X2NhcF9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJJbXBsIjsKKyAgfQorCisgIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX3NlcnZpY2VfKTsKKyAgLy8gYnVpbGQgbWFjcm8gaXMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIkltcGwiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIG5ldyggaXByb3QgOiBUUHJvdG9jb2wsIG9wcm90IDogVFByb3RvY29sID0gbnVsbCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvcHJvdCA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHZhciBpcHJvdF8gOiBUUHJvdG9jb2w7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJpdmF0ZSB2YXIgb3Byb3RfIDogVFByb3RvY29sOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByaXZhdGUgdmFyIHNlcWlkXyA6IEludDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldElucHV0UHJvdG9jb2woKSA6IFRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0aGlzLmlwcm90XzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXRQcm90b2NvbCgpIDogVFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIHN0cmluZyBjYWxsdHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiT05FV0FZIiA6ICJDQUxMIjsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lCisgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS4iIDw8IGNhbGx0eXBlIDw8ICIsIHNlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInZhciBhcmdzIDogIiA8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoISgoKmZfaXRlciktPmlzX29uZXdheSgpIHx8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJldHZhbCA6ICIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goZnVuY3Rpb24oZXJyb3I6RHluYW1pYykgOiBWb2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGVycm9yICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihlcnJvcik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IGVycm9yOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciBtc2cgOiBUTWVzc2FnZSA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgeCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoeCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IHg7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIHJlc3VsdCA6ICIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MocmVzdWx0LnN1Y2Nlc3MpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR2YWwgPSByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykKKyAgICAgICAgICAgICAgPDwgIm9uRXJyb3IoIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBjYXRjaCggZSA6IFRFeGNlcHRpb24pIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoISgoKmZfaXRlciktPmlzX29uZXdheSgpIHx8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIlByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSB2YXIgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykKKyAgICAgICAgICAgICA8PCAiX2lmYWNlXyA6ICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICI7IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJpdmF0ZSB2YXIgUFJPQ0VTU19NQVAgPSBuZXcgU3RyaW5nTWFwPCBJbnQtPlRQcm90b2NvbC0+VFByb3RvY29sLT5Wb2lkID4oKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIG5ldyggaWZhY2UgOiAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiKSIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIl9pZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQUk9DRVNTX01BUC5zZXQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIHN0cmluZyBvdmVycmlkZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIG92ZXJyaWRlID0gIm92ZXJyaWRlICI7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICA8PCAicHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoIGlwcm90IDogVFByb3RvY29sLCBvcHJvdCA6IFRQcm90b2NvbCkgOiBCb29sIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZyA6IFRNZXNzYWdlID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KKyAgLy8gQVMtIElmIGFsbCBtZXRob2QgaXMgb25ld2F5OgorICAvLyBkbyB5b3UgaGF2ZSBhbiBvcHJvdD8KKyAgLy8gZG8geW91IHlvdSBuZWVkIG51bGxjaGVjaz8KKyAgZl9zZXJ2aWNlXworICAgICAgPDwgaW5kZW50KCkgPDwgInZhciBmbiAgPSBQUk9DRVNTX01BUC5nZXQobXNnLm5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlmIChmbiA9PSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICB2YXIgeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELCBcIkludmFsaWQgIgorICAgICAgICAgIm1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJmbiggbXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGdldF9jYXBfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHJlc3VsdG5hbWUpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QoJnJlc3VsdCwgZmFsc2UsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gY2xhc3MKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGZ1bmN0aW9uICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiKCkgOiBJbnQtPlRQcm90b2NvbC0+VFByb3RvY29sLT5Wb2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZnVuY3Rpb24oIHNlcWlkIDogSW50LCBpcHJvdCA6IFRQcm90b2NvbCwgb3Byb3QgOiBUUHJvdG9jb2wpIDogVm9pZCIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGdldF9jYXBfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfY2FwX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJncyA6ICIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0IDogIiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhbnkgIGZ1bmN0aW9uIHRvIGNhdGNoIChkZWZpbmVkIG9yIHVuZGVmaW5lZCkgZXhjZXB0aW9ucworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiBzdHlsZSBvbkVycm9yL29uU3VjY2VzcworCisgICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiX2lmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgc3RyaW5nIG9uX3N1Y2Nlc3MgPSBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModGZ1bmN0aW9uLCBmYWxzZSwgdHJ1ZSk7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibnVsbCwgIC8vIGVycm9ycyBhcmUgdGhyb3duIGJ5IHRoZSBoYW5kbGVyIiA8PCBlbmRsOworICAgICAgaWYgKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibnVsbCk7IC8vIG5vIHJldHZhbCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb24iIDw8IG9uX3N1Y2Nlc3MuY19zdHIoKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zdWNjZXNzID0gcmV0dmFsOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICAvLyBub3JtYWwgZnVuY3Rpb24oKTpyZXN1bHQgc3R5bGUKKworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgaWYgKCEodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSB8fCB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIl9pZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIC8vIGNhdGNoIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgSURMCisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiCisgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gYWx3YXlzIGNhdGNoIGFsbCBleGNlcHRpb25zIHRvIHByZXZlbnQgZnJvbSBzZXJ2aWNlIGRlbmlhbAorICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKHRoIDogRHluYW1pYykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJhY2UoXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgdGgpOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIC8vIENsb3NlIGNsYXNzCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSGF4ZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHRzdHJ1Y3QpKSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBvYmo7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCisgICAgICAgICAgICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5CisgICAgICAgICAgICAgIDw8ICIoIgorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpIDw8ICIgaW4gMCAuLi4gIiA8PCBvYmogPDwgIi5zaXplKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5zZXQoICIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEhheGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9rZXkiKTsKKyAgICBzdHJpbmcgY291bnRlciA9IHRtcCgiX3NpemVDb3VudGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGNvdW50ZXIgPDwgIiA6IEludCA9IDA7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBjb3VudGVyIDw8ICsiKys7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IGNvdW50ZXIgPDwgIikpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJlbGVtIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLmtleXMoKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi50b0FycmF5KCkpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiLmdldCgiICsgaXRlciArICIpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGhheGUgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KKyAqIEByZXR1cm4gaGF4ZSB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+CisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCkgeworICAodm9pZClpbl9pbml0OworCisgIC8vIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQorICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHJlZml4OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJJbnQiOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSogdGtleSA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgdF90eXBlKiB0dmFsID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKKyAgICBpZiAodGtleS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0a2V5KS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAoISh0a2V5LT5pc19iaW5hcnkoKSkpIHsKKyAgICAgICAgICByZXR1cm4gIlN0cmluZ01hcDwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RNYXA8PgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIHJldHVybiAiSW50TWFwPCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAiSW50NjRNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RNYXA8PgorICAgICAgfQorICAgIH0KKyAgICBpZiAodGtleS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gIkludE1hcDwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKKyAgICB9CisgICAgcmV0dXJuICJPYmplY3RNYXA8ICIgKyB0eXBlX25hbWUodGtleSkgKyAiLCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogdGtleSA9IGdldF90cnVlX3R5cGUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIGlmICh0a2V5LT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXRrZXkpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICghKHRrZXktPmlzX2JpbmFyeSgpKSkgeworICAgICAgICAgIHJldHVybiAiU3RyaW5nU2V0IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RTZXQKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICByZXR1cm4gIkludFNldCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmV0dXJuICJJbnQ2NFNldCI7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RTZXQKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHRrZXktPmlzX2VudW0oKSkgeworICAgICAgcmV0dXJuICJJbnRTZXQiOworICAgIH0KKyAgICByZXR1cm4gIk9iamVjdFNldDwgIiArIHR5cGVfbmFtZSh0a2V5KSArICI+IjsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiB0ZWxtID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHJldHVybiAiTGlzdDwgIiArIHR5cGVfbmFtZSh0ZWxtKSArICI+IjsKKyAgfQorCisgIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGhheGUgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIGhheGUgY29udGFpbmVyPworICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsIGJvb2wgaW5fY29udGFpbmVyKSB7CisgICh2b2lkKWluX2NvbnRhaW5lcjsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7CisKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJWb2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gImhheGUuaW8uQnl0ZXMiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJCb29sIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaGF4ZS5JbnQzMiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiaGF4ZS5JbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiRmxvYXQiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSGF4ZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7CisgIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPworICBzdHJpbmcgcmVzdWx0ID0gInZhciAiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIiA6ICIgKyB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RkOjpzdHJpbmcgb25fZXJyb3Jfc3VjY2VzcyA9ICJvbkVycm9yIDogRHluYW1pYy0+Vm9pZCA9IG51bGwsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRmdW5jdGlvbiwgdHJ1ZSwgZmFsc2UpOworCisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaWYgKGFyZ3VtZW50cyAhPSAiIikgeworICAgICAgYXJndW1lbnRzICs9ICIsICI7CisgICAgfQorICAgIGFyZ3VtZW50cyArPSBvbl9lcnJvcl9zdWNjZXNzOyAvLyJvbkVycm9yIDogRnVuY3Rpb24sIG9uU3VjY2VzcyA6IEZ1bmN0aW9uIjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIikgOiBWb2lkIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBzdGQ6OnN0cmluZyBhcmd1bWVudHMgPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0dHlwZTsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgfHwgdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHR0eXBlID0gIlZvaWQiOworICB9IGVsc2UgeworICAgIHJlc3VsdHR5cGUgPSB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIikgOiAiICsgcmVzdWx0dHlwZTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29tbWEgc2VwYXJhdGVkIGZpZWxkIGxpc3QsIHdpdGggdHlwZSBuYW1lcworICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA6ICIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBIYXhlIGNsYXNzIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCB1cHBlcmNhc2UgbGV0dGVyLCBidXQgSGF4ZSBuYW1lc3BhY2VzIG11c3Qgbm90LgorICovCitzdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICAvLyB0ZXN0LmZvci5HZW5lcmljPCBkYXRhLlR5cGUsIG9yLnRoZS5MaWtlPiBhbmQgaGFuZGxlIGl0IHJlY3Vyc2l2ZWx5CisgIHNpemVfdCBnZW5lcmljX2ZpcnN0ID0gbmFtZS5maW5kKCc8Jyk7CisgIHNpemVfdCBnZW5lcmljX2xhc3QgPSBuYW1lLnJmaW5kKCc+Jyk7CisgIGlmICgoZ2VuZXJpY19maXJzdCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgJiYgKGdlbmVyaWNfbGFzdCAhPSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKKyAgICBzdHJpbmcgb3V0ZXJfdHlwZSA9IG5hbWUuc3Vic3RyKDAsIGdlbmVyaWNfZmlyc3QpOworICAgIHN0cmluZyBpbm5lcl90eXBlcyA9IG5hbWUuc3Vic3RyKGdlbmVyaWNfZmlyc3QgKyAxLCBnZW5lcmljX2xhc3QgLSBnZW5lcmljX2ZpcnN0IC0gMSk7CisKKyAgICBzdHJpbmcgbmV3X2lubmVyID0gIiI7CisgICAgc2l6ZV90IGNvbW1hX3N0YXJ0ID0gMDsKKyAgICB3aGlsZSAoY29tbWFfc3RhcnQgPCBpbm5lcl90eXBlcy5sZW5ndGgoKSkgeworICAgICAgc2l6ZV90IGNvbW1hX3BvcyA9IGNvbW1hX3N0YXJ0OworICAgICAgaW50IG5lc3RlZCA9IDA7CisKKyAgICAgIHdoaWxlIChjb21tYV9wb3MgPCBpbm5lcl90eXBlcy5sZW5ndGgoKSkgeworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAoaW5uZXJfdHlwZXNbY29tbWFfcG9zXSkgeworICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICArK25lc3RlZDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgLS1uZXN0ZWQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgIGZvdW5kID0gKG5lc3RlZCA9PSAwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICArK2NvbW1hX3BvczsKKyAgICAgIH0KKworICAgICAgaWYgKG5ld19pbm5lci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgbmV3X2lubmVyICs9ICIsIjsKKyAgICAgIH0KKworICAgICAgc3RyaW5nIGlubmVyID0gaW5uZXJfdHlwZXMuc3Vic3RyKGNvbW1hX3N0YXJ0LCBjb21tYV9wb3MgLSBjb21tYV9zdGFydCk7CisgICAgICBuZXdfaW5uZXIgKz0gZ2V0X2NhcF9uYW1lKGlubmVyKTsKKyAgICAgIGNvbW1hX3N0YXJ0ID0gKytjb21tYV9wb3M7CisgICAgfQorCisgICAgcmV0dXJuIGdldF9jYXBfbmFtZShvdXRlcl90eXBlKSArICI8IiArIG5ld19pbm5lciArICI+IjsKKyAgfQorCisgIC8vIHBhY2thZ2UgbmFtZQorICBzaXplX3QgaW5kZXggPSBuYW1lLmZpbmRfZmlyc3Rfbm90X29mKCIgXG5cclx0Iik7CisgIGlmIChpbmRleCA8IG5hbWUubGVuZ3RoKCkpIHsKKyAgICBuYW1lW2luZGV4XSA9IHRvbG93ZXIobmFtZVtpbmRleF0pOworICAgIGluZGV4ID0gbmFtZS5maW5kKCcuJyk7CisgICAgd2hpbGUgKGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBpZiAoKytpbmRleCA8IG5hbWUubGVuZ3RoKCkpIHsKKyAgICAgICAgbmFtZVtpbmRleF0gPSB0b2xvd2VyKG5hbWVbaW5kZXhdKTsKKyAgICAgIH0KKyAgICAgIGluZGV4ID0gbmFtZS5maW5kKCcuJywgaW5kZXgpOworICAgIH0KKyAgfQorCisgIC8vIGNsYXNzIG5hbWUKKyAgaW5kZXggPSBuYW1lLnJmaW5kKCcuJyk7CisgIGlmIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICsraW5kZXg7CisgIH0gZWxzZSB7CisgICAgaW5kZXggPSBuYW1lLmZpbmRfZmlyc3Rfbm90X29mKCIgXG5cclx0Iik7CisgIH0KKworICBpZiAoaW5kZXggPCBuYW1lLmxlbmd0aCgpKSB7CisgICAgbmFtZVtpbmRleF0gPSB0b3VwcGVyKG5hbWVbaW5kZXhdKTsKKyAgfQorCisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOworICBmb3IgKGNoYXIgY2hhcmFjdGVyIDogbmFtZSkgeworICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgeworICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7CisgICAgfQorICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOworCisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOworICB9CisKKyAgcmV0dXJuIGNvbnN0YW50X25hbWU7Cit9CisKKy8qKgorICogRW5hYmxlcyBSVFRJIGZvciBhIGNsYXNzIG9yIGludGVyZmFjZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihvc3RyZWFtJiBvdXQpIHsKKyAgaWYgKHJ0dGlfKSB7CisgICAgb3V0IDw8ICJAOnJ0dGkiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBBZGRzIGJ1aWxkIG1hY3JvcyB0byBhIGNsYXNzIG9yIGludGVyZmFjZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24ob3N0cmVhbSYgb3V0KSB7CisgIGlmICghYnVpbGRtYWNyb18uZW1wdHkoKSkgeworICAgIG91dCA8PCAiI2lmICEgbWFjcm8iIDw8IGVuZGw7CisgICAgb3V0IDw8ICJAOmJ1aWxkKCAiIDw8IGJ1aWxkbWFjcm9fIDw8ICIpIiA8PCBlbmRsOyAgICAgLy8gY3VycmVudCBjbGFzcy9pbnRlcmZhY2UKKyAgICBvdXQgPDwgIkA6YXV0b0J1aWxkKCAiIDw8IGJ1aWxkbWFjcm9fIDw8ICIpIiA8PCBlbmRsOyAvLyBpbmhlcml0ZWQgY2xhc3Nlcy9pbnRlcmZhY2VzCisgICAgb3V0IDw8ICIjZW5kIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBoYXhlRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgdGRvYy0+Z2V0X2RvYygpLCAiICovXG4iKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgaGF4ZURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgeworICAgIHN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9CisgICAgfQorICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHNzLnN0cigpLCAiICovXG4iKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOworfQorCitzdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Cit9CisKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAvKiYmIHByb2dyYW0gIT0gcHJvZ3JhbV8qLykgeworICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIikgKyAiLiI7CisgIH0KKyAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGhheGUsCisgICAgIkhheGUiLAorICAgICIgICAgY2FsbGJhY2tzICAgICAgICBVc2Ugb25FcnJvcigpL29uU3VjY2VzcygpIGNhbGxiYWNrcyBmb3Igc2VydmljZSBtZXRob2RzIChsaWtlIEFTMylcbiIKKyAgICAiICAgIHJ0dGkgICAgICAgICAgICAgRW5hYmxlIEA6cnR0aSBmb3IgZ2VuZXJhdGVkIGNsYXNzZXMgYW5kIGludGVyZmFjZXNcbiIKKyAgICAiICAgIGJ1aWxkbWFjcm89bXkubWFjcm9zLkNsYXNzLm1ldGhvZChhcmdzKVxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBZGQgQDpidWlsZCBtYWNybyBjYWxscyB0byBnZW5lcmF0ZWQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlc1xuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5ZGVlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTcxNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBIYXNrZWxsIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9oc19nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9oc19nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGhzOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ocyI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIG92ZXJyaWRlOworCisgIHN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoZWxwZXIgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9hcmJpdHJhcnkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc190eXBlbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfZGVmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgbmFtZSA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBhcmcgPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgYXJnID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBuYW1lID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGtpdGVyLCBzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcik7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0cmluZyBoc19hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RyaW5nIGhzX2xhbmd1YWdlX3ByYWdtYSgpOworICBzdHJpbmcgaHNfaW1wb3J0cygpOworCisgIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgc3RyaW5nIGZ1bmN0aW9uX3ByZWZpeCA9ICIiKTsKKworICBzdHJpbmcgZmllbGRfbmFtZShzdHJpbmcgdG5hbWUsIHN0cmluZyBmbmFtZSk7CisKKyAgc3RyaW5nIGZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9ucyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWV0aG9kID0gZmFsc2UpOworCisgIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisKKyAgc3RyaW5nIHR5cGVfdG9fZGVmYXVsdCh0X3R5cGUqIHR0eXBlKTsKKworICBzdHJpbmcgcmVuZGVyX2hzX3R5cGUodF90eXBlKiB0eXBlLCBib29sIG5lZWRzX3BhcmVucyk7CisKKyAgc3RyaW5nIHR5cGVfdG9fY29uc3RydWN0b3IodF90eXBlKiB0dHlwZSk7CisKKyAgc3RyaW5nIHJlbmRlcl9oc190eXBlX2Zvcl9mdW5jdGlvbl9uYW1lKHRfdHlwZSogdHlwZSk7CisKK3ByaXZhdGU6CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9pZmFjZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jbGllbnRfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIHBuYW1lID0gY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKTsKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwbmFtZSArICJfVHlwZXMuaHMiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwbmFtZSArICJfQ29uc3RzLmhzIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIm1vZHVsZSAiIDw8IHBuYW1lIDw8ICJfVHlwZXMgd2hlcmUiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGZfY29uc3RzXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8ICJtb2R1bGUgIiA8PCBwbmFtZSA8PCAiX0NvbnN0cyB3aGVyZSIgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgImltcG9ydCAiIDw8IHBuYW1lIDw8ICJfVHlwZXMiIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfbGFuZ3VhZ2VfcHJhZ21hKCkgeworICByZXR1cm4gc3RyaW5nKAorICAgICAgInstIyBMQU5HVUFHRSBEZXJpdmVEYXRhVHlwZWFibGUgIy19XG4iCisgICAgICAiey0jIExBTkdVQUdFIERlcml2ZUdlbmVyaWMgIy19XG4iCisgICAgICAiey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfVxuIgorICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tbWlzc2luZy1maWVsZHMgIy19XG4iCisgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1taXNzaW5nLXNpZ25hdHVyZXMgIy19XG4iCisgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1uYW1lLXNoYWRvd2luZyAjLX1cbiIKKyAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLXVudXNlZC1pbXBvcnRzICMtfVxuIgorICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tdW51c2VkLW1hdGNoZXMgIy19XG4iKTsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuIHN0cmluZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpCisgICAgICAgICArICItLSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIikgICAgICAgICAgICAgICAgICAgICAgLS1cbiIKKyAgICAgICAgICsgIi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tXG4iCisgICAgICAgICArICItLSBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORyAtLVxuIgorICAgICAgICAgKyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCisgKi8KK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfaW1wb3J0cygpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgc3RyaW5nIHJlc3VsdCA9IHN0cmluZygKKyAgICAgICJpbXBvcnQgUHJlbHVkZSAoKCQpLCAoLiksICg+Pj0pLCAoPT0pLCAoKyspKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgUHJlbHVkZSBhcyBQXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBDb250cm9sLkV4Y2VwdGlvbiBhcyBYXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBDb250cm9sLk1vbmFkIGFzIE0gKCBsaWZ0TSwgYXAsIHdoZW4gKVxuIgorICAgICAgImltcG9ydCBEYXRhLkZ1bmN0b3IgKCAoPCQ+KSApXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlNcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaGFibGUgYXMgSFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5JbnQgYXMgSVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXliZSBhcyBNIChjYXRNYXliZXMpXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZyBhcyBFICggZGVjb2RlVXRmOCwgZW5jb2RlVXRmOCApXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBMVFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgR0hDLkdlbmVyaWNzIGFzIEcgKEdlbmVyaWMpXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlR5cGVhYmxlIGFzIFRZICggVHlwZWFibGUgKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXBcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXRcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvclxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGVzdC5RdWlja0NoZWNrLkFyYml0cmFyeSBhcyBRQyAoIEFyYml0cmFyeSguLikgKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGVzdC5RdWlja0NoZWNrIGFzIFFDICggZWxlbWVudHMgKVxuIgorICAgICAgIlxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0IGFzIFRcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRocmlmdC5UeXBlcyBhcyBUXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBUaHJpZnQuQXJiaXRyYXJpZXMgYXMgVFxuIgorICAgICAgIlxuIik7CisKKyAgZm9yIChhdXRvIGluY2x1ZGUgOiBpbmNsdWRlcykKKyAgICByZXN1bHQgKz0gImltcG9ydCBxdWFsaWZpZWQgIiArIGNhcGl0YWxpemUoaW5jbHVkZS0+Z2V0X25hbWUoKSkgKyAiX1R5cGVzXG4iOworCisgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKQorICAgIHJlc3VsdCArPSAiXG4iOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICBmX3R5cGVzXy5jbG9zZSgpOworICBmX2NvbnN0c18uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBFei4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgc3RyaW5nIHRuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpOworICBzdHJpbmcgdGRlZiA9IHJlbmRlcl9oc190eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCBmYWxzZSk7CisgIGluZGVudChmX3R5cGVzXykgPDwgInR5cGUgIiA8PCB0bmFtZSA8PCAiID0gIiA8PCB0ZGVmIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZGF0YSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgPSAiOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGZfdHlwZXNfIDw8IChmaXJzdCA/ICIiIDogInwiKTsKKyAgICBmX3R5cGVzXyA8PCBuYW1lOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZGVyaXZpbmcgKFAuU2hvdywgUC5FcSwgRy5HZW5lcmljLCBUWS5UeXBlYWJsZSwgUC5PcmQsIFAuQm91bmRlZCkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSk7CisKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaW5zdGFuY2UgUC5FbnVtICIgPDwgZW5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgImZyb21FbnVtIHQgPSBjYXNlIHQgb2YiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgInRvRW51bSB0ID0gY2FzZSB0IG9mIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgdmFsdWUgPDwgIiAtPiAiIDw8IG5hbWUgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl90eXBlc18pIDw8ICJfIC0+IFgudGhyb3cgVC5UaHJpZnRFeGNlcHRpb24iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaW5zdGFuY2UgSC5IYXNoYWJsZSAiIDw8IGVuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJoYXNoV2l0aFNhbHQgc2FsdCA9IEguaGFzaFdpdGhTYWx0IHNhbHQgUC4uIFAuZnJvbUVudW0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaW5zdGFuY2UgUUMuQXJiaXRyYXJ5ICIgPDwgZW5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgImFyYml0cmFyeSA9IFFDLmVsZW1lbnRzIChQLmVudW1Gcm9tVG8gUC5taW5Cb3VuZCBQLm1heEJvdW5kKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7CisKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA6OiAiIDw8IHJlbmRlcl9oc190eXBlKHR5cGUsIGZhbHNlKSA8PCBlbmRsOworICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICByZXR1cm4gdHlwZV90b19kZWZhdWx0KHR5cGUpOworCisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBvc3RyaW5nc3RyZWFtIG91dDsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJQLlRydWUiIDogIlAuRmFsc2UiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAiKCIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCAiKCIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpIDw8ICIpIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHRfZW51bSogdGVudW0gPSAodF9lbnVtKil0eXBlOworICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICAgIGZvciAoYXV0byAmIGNvbnN0YW50IDogY29uc3RhbnRzKSB7CisgICAgICBpbnQgdmFsID0gY29uc3RhbnQtPmdldF92YWx1ZSgpOworICAgICAgaWYgKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSkgeworICAgICAgICB0X3Byb2dyYW0qIHByb2cgPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgICAgICBpZiAocHJvZyAhPSBOVUxMICYmIHByb2cgIT0gcHJvZ3JhbV8pCisgICAgICAgICAgb3V0IDw8IGNhcGl0YWxpemUocHJvZy0+Z2V0X25hbWUoKSkgPDwgIl9UeXBlcy4iOworICAgICAgICBvdXQgPDwgY2FwaXRhbGl6ZShjb25zdGFudC0+Z2V0X25hbWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBzdHJpbmcgY25hbWUgPSB0eXBlX25hbWUodHlwZSk7CisgICAgb3V0IDw8ICJkZWZhdWx0XyIgPDwgY25hbWUgPDwgInsiOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGF1dG8gdl9pdGVyIDogdmFsKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9IE5VTEw7CisKKyAgICAgIGZvciAoYXV0byBmX2l0ZXIgOiBmaWVsZHMpCisgICAgICAgIGlmIChmX2l0ZXItPmdldF9uYW1lKCkgPT0gdl9pdGVyLmZpcnN0LT5nZXRfc3RyaW5nKCkpCisgICAgICAgICAgZmllbGQgPSBmX2l0ZXI7CisKKyAgICAgIGlmIChmaWVsZCA9PSBOVUxMKQorICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIGNuYW1lICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci5maXJzdC0+Z2V0X3N0cmluZygpOworCisgICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXIuZmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIHN0cmluZyBjb25zdF92YWx1ZSA9IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZC0+Z2V0X3R5cGUoKSwgdl9pdGVyLnNlY29uZCk7CisKKyAgICAgIG91dCA8PCAoZmlyc3QgPyAiIiA6ICIsICIpOworICAgICAgb3V0IDw8IGZpZWxkX25hbWUoY25hbWUsIGZuYW1lKSA8PCAiID0gIjsKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgKCh0X3R5cGUqKWZpZWxkLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgIlAuSnVzdCAiOworICAgICAgfQorICAgICAgb3V0IDw8IGNvbnN0X3ZhbHVlOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisKKyAgICBvdXQgPDwgIn0iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0IFsiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKKyAgICAgIG91dCA8PCAiKCIgPDwga2V5IDw8ICIsIiA8PCB2YWwgPDwgIikiOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgb3V0IDw8ICJdKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gdHlwZS0+aXNfbGlzdCgpID8gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGlmICh0eXBlLT5pc19zZXQoKSkKKyAgICAgIG91dCA8PCAiKFNldC5mcm9tTGlzdCBbIjsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIihWZWN0b3IuZnJvbUxpc3QgWyI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisKKyAgICBvdXQgPDwgIl0pIjsKKworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSAic3RydWN0IgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfaHNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0LCBidXQgYWxzbyBoYXMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfaHNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgSGFza2VsbCBzdHJ1Y3QKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVscGVyKSB7CisgICh2b2lkKWhlbHBlcjsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGluZGVudChvdXQpIDw8ICJkYXRhICIgPDwgdG5hbWUgPDwgIiA9ICIgPDwgdG5hbWU7CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGF1dG8gbWVtYmVyIDogbWVtYmVycykgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ7ICI7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLCAiOworICAgICAgfQorICAgICAgc3RyaW5nIG1uYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOworICAgICAgb3V0IDw8IGZpZWxkX25hbWUodG5hbWUsIG1uYW1lKSA8PCAiIDo6ICI7CisgICAgICBpZiAobWVtYmVyLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgodF90eXBlKiltZW1iZXItPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIG91dCA8PCAiUC5NYXliZSAiOworICAgICAgfQorICAgICAgb3V0IDw8IHJlbmRlcl9oc190eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBvdXQgPDwgIiBkZXJpdmluZyAoUC5TaG93LFAuRXEsRy5HZW5lcmljLFRZLlR5cGVhYmxlKSIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIG91dCA8PCAiaW5zdGFuY2UgWC5FeGNlcHRpb24gIiA8PCB0bmFtZSA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpbnN0YW5jZSBILkhhc2hhYmxlICIgPDwgdG5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJoYXNoV2l0aFNhbHQgc2FsdCByZWNvcmQgPSBzYWx0IjsKKyAgZm9yIChhdXRvIG1lbWJlciA6IG1lbWJlcnMpIHsKKyAgICBzdHJpbmcgbW5hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7CisgICAgaW5kZW50KG91dCkgPDwgIiBgSC5oYXNoV2l0aFNhbHRgICIgPDwgZmllbGRfbmFtZSh0bmFtZSwgbW5hbWUpIDw8ICIgcmVjb3JkIjsKKyAgfQorICBpbmRlbnQob3V0KSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGdlbmVyYXRlX2hzX3N0cnVjdF9hcmJpdHJhcnkob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2hzX3R5cGVtYXAob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfaHNfZGVmYXVsdChvdXQsIHRzdHJ1Y3QpOworfQorCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfYXJiaXRyYXJ5KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGluZGVudChvdXQpIDw8ICJpbnN0YW5jZSBRQy5BcmJpdHJhcnkgIiA8PCB0bmFtZSA8PCAiIHdoZXJlICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiYXJiaXRyYXJ5ID0gTS5saWZ0TSAiIDw8IHRuYW1lOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudF91cCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoYXV0byBtZW1iZXIgOiBtZW1iZXJzKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgb3V0IDw8ICIgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJgTS5hcGAiOworICAgICAgfQorICAgICAgb3V0IDw8ICIoIjsKKyAgICAgIGlmIChtZW1iZXItPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgfHwgKCh0X3R5cGUqKW1lbWJlci0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgb3V0IDw8ICJNLmxpZnRNIFAuSnVzdCAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJRQy5hcmJpdHJhcnkpIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgLy8gU2hyaW5rCisgICAgaW5kZW50KG91dCkgPDwgInNocmluayBvYmogfCBvYmogPT0gZGVmYXVsdF8iIDw8IHRuYW1lIDw8ICIgPSBbXSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAgICAgICAgICB8IFAub3RoZXJ3aXNlID0gTS5jYXRNYXliZXMiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZmlyc3QgPSB0cnVlOworICAgIGZvciAoYXV0byBtZW1iZXIgOiBtZW1iZXJzKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIlsgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIsICI7CisgICAgICB9CisgICAgICBzdHJpbmcgZm5hbWUgPSBmaWVsZF9uYW1lKHRuYW1lLCBtZW1iZXItPmdldF9uYW1lKCkpOworICAgICAgb3V0IDw8ICJpZiBvYmogPT0gZGVmYXVsdF8iIDw8IHRuYW1lOworICAgICAgb3V0IDw8ICJ7IiA8PCBmbmFtZSA8PCAiID0gIiA8PCBmbmFtZSA8PCAiIG9ian0gIjsKKyAgICAgIG91dCA8PCAidGhlbiBQLk5vdGhpbmcgIjsKKyAgICAgIG91dCA8PCAiZWxzZSBQLkp1c3QgJCBkZWZhdWx0XyIgPDwgdG5hbWU7CisgICAgICBvdXQgPDwgInsiIDw8IGZuYW1lIDw8ICIgPSAiIDw8IGZuYW1lIDw8ICIgb2JqfSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgIl0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsgLyogMCA9PSBtZW1iZXJzLnNpemUoKSAqLworICAgIGluZGVudChvdXQpIDw8ICJhcmJpdHJhcnkgPSBRQy5lbGVtZW50cyBbIiA8PCB0bmFtZSA8PCAiXSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIHN0cmluZyBzbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgc3RyaW5nIGlkID0gdG1wKCJfaWQiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworCisgIGluZGVudChvdXQpIDw8ICJ0b18iIDw8IHNuYW1lIDw8ICIgOjogVC5UaHJpZnRWYWwgLT4gIiA8PCBzbmFtZSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidG9fIiA8PCBzbmFtZSA8PCAiIChULlRTdHJ1Y3QgZmllbGRzKSA9ICIgPDwgc25hbWUgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGF1dG8gZmllbGQgOiBmaWVsZHMpIHsKKyAgICBpbnQzMl90IGtleSA9IGZpZWxkLT5nZXRfa2V5KCk7CisgICAgc3RyaW5nIGV0eXBlID0gdHlwZV90b19lbnVtKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdHJpbmcgZm5hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIEZpbGwgaW4gRmllbGQKKyAgICBpbmRlbnQob3V0KSA8PCBmaWVsZF9uYW1lKHNuYW1lLCBmbmFtZSkgPDwgIiA9ICI7CisKKyAgICBvdXQgPDwgIlAubWF5YmUgKCI7CisgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0IDw8ICJQLmVycm9yIFwiTWlzc2luZyByZXF1aXJlZCBmaWVsZDogIiA8PCBmbmFtZSA8PCAiXCIiOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgICB8fCAoKHRfdHlwZSopZmllbGQtPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSAmJiBmaWVsZC0+Z2V0X3ZhbHVlKCkgPT0gTlVMTCkgeworICAgICAgICBvdXQgPDwgIlAuTm90aGluZyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZmllbGRfbmFtZShzbmFtZSwgZm5hbWUpIDw8ICIgZGVmYXVsdF8iIDw8IHNuYW1lOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikgIjsKKworICAgIG91dCA8PCAiKFxcKF8sIiA8PCB2YWwgPDwgIikgLT4gIjsKKyAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgodF90eXBlKilmaWVsZC0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpCisgICAgICBvdXQgPDwgIlAuSnVzdCAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsIHZhbCk7CisgICAgb3V0IDw8ICIpIjsKKyAgICBvdXQgPDwgIiAoTWFwLmxvb2t1cCAoIiA8PCBrZXkgPDwgIikgZmllbGRzKSI7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gcmVhZAorICBzdHJpbmcgdG1hcCA9IHR5cGVfbmFtZSh0c3RydWN0LCAidHlwZW1hcF8iKTsKKyAgaW5kZW50KG91dCkgPDwgInRvXyIgPDwgc25hbWUgPDwgIiBfID0gUC5lcnJvciBcIm5vdCBhIHN0cnVjdFwiIiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIiA6OiBULlByb3RvY29sIHAgPT4gcCAtPiBQLklPICIgPDwgc25hbWUKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiIGlwcm90ID0gdG9fIiA8PCBzbmFtZTsKKyAgb3V0IDw8ICIgPCQ+IFQucmVhZFZhbCBpcHJvdCAoVC5UX1NUUlVDVCAiIDw8IHRtYXAgPDwgIikiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImRlY29kZV8iIDw8IHNuYW1lCisgICAgICAgICAgICAgIDw8ICIgOjogVC5TdGF0ZWxlc3NQcm90b2NvbCBwID0+IHAgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gIiA8PCBzbmFtZSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZGVjb2RlXyIgPDwgc25hbWUgPDwgIiBpcHJvdCBicyA9IHRvXyIgPDwgc25hbWUgPDwgIiAkICI7CisgIG91dCA8PCAiVC5kZXNlcmlhbGl6ZVZhbCBpcHJvdCAoVC5UX1NUUlVDVCAiIDw8IHRtYXAgPDwgIikgYnMiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKKyAgc3RyaW5nIGYgPSB0bXAoIl9mIik7CisgIHN0cmluZyB2ID0gdG1wKCJfdiIpOworCisgIGluZGVudChvdXQpIDw8ICJmcm9tXyIgPDwgbmFtZSA8PCAiIDo6ICIgPDwgbmFtZSA8PCAiIC0+IFQuVGhyaWZ0VmFsIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZnJvbV8iIDw8IG5hbWUgPDwgIiByZWNvcmQgPSBULlRTdHJ1Y3QgJCBNYXAuZnJvbUxpc3QgIjsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2V0IEV4Y2VwdGlvbnMKKyAgYm9vbCBoYXNFeG4gPSBmYWxzZTsKKyAgZm9yIChhdXRvIGZpZWxkIDogZmllbGRzKSB7CisgICAgaWYgKCgodF90eXBlKilmaWVsZC0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGhhc0V4biA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBib29sIGlzZmlyc3QgPSB0cnVlOworICBpZiAoaGFzRXhuKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgZXhucyA9IE0uY2F0TWF5YmVzICI7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yIChhdXRvIGZpZWxkIDogZmllbGRzKSB7CisgICAgICBpZiAoKCh0X3R5cGUqKWZpZWxkLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBpZiAoaXNmaXJzdCkgeworICAgICAgICAgIG91dCA8PCAiWyAiOworICAgICAgICAgIGlzZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBzdHJpbmcgbW5hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgICAgaW50MzJfdCBrZXkgPSBmaWVsZC0+Z2V0X2tleSgpOworICAgICAgICBvdXQgPDwgIihcXCIgPDwgdiA8PCAiIC0+ICgiIDw8IGtleSA8PCAiLCAoXCIiIDw8IG1uYW1lIDw8ICJcIiwiOworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsIGZpZWxkLT5nZXRfdHlwZSgpLCB2KTsKKyAgICAgICAgb3V0IDw8ICIpKSkgPCQ+ICIgPDwgZmllbGRfbmFtZShuYW1lLCBtbmFtZSkgPDwgIiByZWNvcmQiOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWlzZmlyc3QpIHsKKyAgICAgIG91dCA8PCAiXSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW4gaWYgUC5ub3QgKFAubnVsbCBleG5zKSB0aGVuIGV4bnMgZWxzZSAiOworICAgIGluZGVudF91cCgpOworICB9IGVsc2UgeworICAgIG91dCA8PCAiJCAiOworICB9CisKKyAgb3V0IDw8ICJNLmNhdE1heWJlcyIgPDwgZW5kbDsKKyAgLy8gR2V0IHRoZSBSZXN0CisgIGlzZmlyc3QgPSB0cnVlOworICBmb3IgKGF1dG8gZmllbGQgOiBmaWVsZHMpIHsKKyAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKKyAgICBpZiAoaXNmaXJzdCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIlsgIjsKKyAgICAgIGlzZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiwgIjsKKyAgICB9CisgICAgc3RyaW5nIG1uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgaW50MzJfdCBrZXkgPSBmaWVsZC0+Z2V0X2tleSgpOworICAgIG91dCA8PCAiKFxcIjsKKyAgICBvdXQgPDwgdiA8PCAiIC0+ICI7CisgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAmJiAhKCh0X3R5cGUqKWZpZWxkLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgb3V0IDw8ICJQLkp1c3QgIjsKKyAgICB9CisgICAgb3V0IDw8ICIoIiA8PCBrZXkgPDwgIiwgKFwiIiA8PCBtbmFtZSA8PCAiXCIsIjsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsIGZpZWxkLT5nZXRfdHlwZSgpLCB2KTsKKyAgICBvdXQgPDwgIikpKSAiOworICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgJiYgISgodF90eXBlKilmaWVsZC0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIG91dCA8PCAiJCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiPCQ+IjsKKyAgICB9CisgICAgb3V0IDw8ICIgIiA8PCBmaWVsZF9uYW1lKG5hbWUsIG1uYW1lKSA8PCAiIHJlY29yZCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIGlmIChpc2ZpcnN0KSB7CisgICAgaW5kZW50KG91dCkgPDwgIltdIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJdIiA8PCBlbmRsOworICB9CisgIGlmIChoYXNFeG4pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gd3JpdGUKKyAgaW5kZW50KG91dCkgPDwgIndyaXRlXyIgPDwgbmFtZSA8PCAiIDo6IFQuUHJvdG9jb2wgcCA9PiBwIC0+ICIgPDwgbmFtZQorICAgICAgICAgICAgICA8PCAiIC0+IFAuSU8gKCkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ3cml0ZV8iIDw8IG5hbWUgPDwgIiBvcHJvdCByZWNvcmQgPSBULndyaXRlVmFsIG9wcm90ICQgZnJvbV8iOworICBvdXQgPDwgbmFtZSA8PCAiIHJlY29yZCIgPDwgZW5kbDsKKworICAvLyBlbmNvZGUKKyAgaW5kZW50KG91dCkgPDwgImVuY29kZV8iIDw8IG5hbWUgPDwgIiA6OiBULlN0YXRlbGVzc1Byb3RvY29sIHAgPT4gcCAtPiAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgPDwgIiAtPiBMQlMuQnl0ZVN0cmluZyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImVuY29kZV8iIDw8IG5hbWUgPDwgIiBvcHJvdCByZWNvcmQgPSBULnNlcmlhbGl6ZVZhbCBvcHJvdCAkICI7CisgIG91dCA8PCAiZnJvbV8iIDw8IG5hbWUgPDwgIiByZWNvcmQiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIi5ocyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiIHdoZXJlIiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgeworICAgIGZfc2VydmljZV8gPDwgImltcG9ydCBxdWFsaWZpZWQgIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgcXVhbGlmaWVkICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiX0lmYWNlIGFzIElmYWNlIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi0tIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMgLS0iIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGZpZWxkX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCAicmVzdWx0IikpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworCisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworCisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKworICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIG1hcCBmcm9tIGZpZWxkIG5hbWVzIHRvICh0eXBlLCBpZCkKKyAqIEBwYXJhbSB0c3RydWN0IHRoZSBTdHJ1Y3QKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfdHlwZW1hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKworICBpbmRlbnQob3V0KSA8PCAidHlwZW1hcF8iIDw8IG5hbWUgPDwgIiA6OiBULlR5cGVNYXAiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0eXBlbWFwXyIgPDwgbmFtZSA8PCAiID0gTWFwLmZyb21MaXN0IFsiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChhdXRvIGZpZWxkIDogZmllbGRzKSB7CisgICAgc3RyaW5nIG1uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgaWYgKCFmaXJzdCkgeworICAgICAgb3V0IDw8ICIsIjsKKyAgICB9CisKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpbnQzMl90IGtleSA9IGZpZWxkLT5nZXRfa2V5KCk7CisgICAgb3V0IDw8ICIoIiA8PCBrZXkgPDwgIiwoXCIiIDw8IG1uYW1lIDw8ICJcIiwiIDw8IHR5cGVfdG9fZW51bSh0eXBlKSA8PCAiKSkiOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8ICJdIiA8PCBlbmRsOworfQorCisvKioKKyAqIGdlbmVyYXRlIHRoZSBzdHJ1Y3Qgd2l0aCBkZWZhdWx0IHZhbHVlcyBmaWxsZWQgaW4KKyAqIEBwYXJhbSB0c3RydWN0IHRoZSBTdHJ1Y3QKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfZGVmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgZm5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgImRlZmF1bHRfIik7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworCisgIGluZGVudChvdXQpIDw8IGZuYW1lIDw8ICIgOjogIiA8PCBuYW1lIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGZuYW1lIDw8ICIgPSAiIDw8IG5hbWUgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChhdXRvIGZpZWxkIDogZmllbGRzKSB7CisgICAgc3RyaW5nIG1uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSBmaWVsZC0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KG91dCkgPDwgZmllbGRfbmFtZShuYW1lLCBtbmFtZSkgPDwgIiA9ICI7CisgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICB8fCAoKHRfdHlwZSopZmllbGQtPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBvdXQgPDwgIlAuTm90aGluZyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIlAuSnVzdCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOworICAgIH0KKyAgfQorICBvdXQgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9pZmFjZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiX0lmYWNlLmhzIjsKKyAgZl9pZmFjZV8ub3BlbihmX2lmYWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9pZmFjZV8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKKyAgZl9pZmFjZV8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBmX2lmYWNlXyA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiX0lmYWNlIHdoZXJlIiA8PCBlbmRsOworCisgIGZfaWZhY2VfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX2lmYWNlXyA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOworICBmX2lmYWNlXyA8PCBlbmRsOworCisgIHN0cmluZyBzbmFtZSA9IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXyk7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgc3RyaW5nIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworCisgICAgaW5kZW50KGZfaWZhY2VfKSA8PCAiaW1wb3J0ICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIiA8PCBlbmRsOworICAgIGluZGVudChmX2lmYWNlXykgPDwgImNsYXNzICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIGEgPT4gIiA8PCBzbmFtZSA8PCAiX0lmYWNlIGEgd2hlcmUiIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJjbGFzcyAiIDw8IHNuYW1lIDw8ICJfSWZhY2UgYSB3aGVyZSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdCA9IGZ1bmN0aW9uX3R5cGUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgaW5kZW50KGZfaWZhY2VfKSA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDo6IGEgLT4gIiA8PCBmdCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9pZmFjZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLiBOb3RlIHRoYXQgaW4gSGFza2VsbCwgdGhlIGNsaWVudCBkb2Vzbid0IGltcGxlbWVudCBpZmFjZS4KKyAqVGhpcyBpcyBiZWNhdXNlCisgKiBUaGUgY2xpZW50IGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCBoYXZlIHRvKSBkZWFsIHdpdGggYXJndW1lbnRzIGJlaW5nIE5vdGhpbmcuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9jbGllbnRfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIl9DbGllbnQuaHMiOworICBmX2NsaWVudF8ub3BlbihmX2NsaWVudF9uYW1lLmNfc3RyKCkpOworICBmX2NsaWVudF8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKKyAgZl9jbGllbnRfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4cG9ydHMgPSAiIjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBleHBvcnRzICs9IChmaXJzdCA/ICIiIDogIiwiKTsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBleHBvcnRzICs9IGRlY2FwaXRhbGl6ZShmdW5uYW1lKTsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisKKyAgc3RyaW5nIHNuYW1lID0gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKTsKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgIm1vZHVsZSAiIDw8IHNuYW1lIDw8ICJfQ2xpZW50KCIgPDwgZXhwb3J0cyA8PCAiKSB3aGVyZSIgPDwgZW5kbDsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBleHRlbmRzIDw8ICJfQ2xpZW50IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5JT1JlZiBhcyBSIiA8PCBlbmRsOworICBpbmRlbnQoZl9jbGllbnRfKSA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgZW5kbDsKKworICAvLyBEQVRTIFJJVEUgQSBHTE9CQUwgVkFSCisgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZXFpZCA9IFIubmV3SU9SZWYgMCIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBzdHJpbmcgZmFyZ3MgPSAiIjsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikKKyAgICAgIGZhcmdzICs9ICIgYXJnXyIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCBkZWNhcGl0YWxpemUoZnVubmFtZSkgPDwgIiAoaXAsb3ApIiA8PCBmYXJncyA8PCAiID0gZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgb3AiIDw8IGZhcmdzOworCisgICAgZl9jbGllbnRfIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpCisgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIiBpcCIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiBvcCIgPDwgZmFyZ3MgPDwgIiA9IGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlcSA8LSBzZXFpZCIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxbiA8LSBSLnJlYWRJT1JlZiBzZXEiIDw8IGVuZGw7CisgICAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBzdHJpbmcgZm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIG1zZ1R5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlQuTV9PTkVXQVkiIDogIlQuTV9DQUxMIjsKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiVC53cml0ZU1lc3NhZ2Ugb3AgKFwiIiA8PCBmbmFtZSA8PCAiXCIsICIgPDwgbXNnVHlwZSA8PCAiLCBzZXFuKSAkIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIndyaXRlXyIgPDwgYXJnc25hbWUgPDwgIiBvcCAoIiA8PCBhcmdzbmFtZSA8PCAieyI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGF1dG8gZmllbGQgOiBmaWVsZHMpIHsKKyAgICAgIHN0cmluZyBmaWVsZG5hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgIGZfY2xpZW50XyA8PCAoZmlyc3QgPyAiIiA6ICIsIik7CisgICAgICBmX2NsaWVudF8gPDwgZmllbGRfbmFtZShhcmdzbmFtZSwgZmllbGRuYW1lKSA8PCAiPSI7CisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgfHwgKCh0X3R5cGUqKWZpZWxkLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkKKyAgICAgICAgZl9jbGllbnRfIDw8ICJQLkp1c3QgIjsKKyAgICAgIGZfY2xpZW50XyA8PCAiYXJnXyIgPDwgZmllbGRuYW1lOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgZl9jbGllbnRfIDw8ICJ9KSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgc3RyaW5nIGZ1bm5hbWUgPSBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCBmdW5uYW1lLCAmbm9hcmdzKTsKKworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgZnVubmFtZSA8PCAiIGlwID0gZG8iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlQucmVhZE1lc3NhZ2UgaXAgJCBcXChmbmFtZSwgbXR5cGUsIHJzZXFpZCkgLT4gZG8iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJNLndoZW4gKG10eXBlID09IFQuTV9FWENFUFRJT04pICQgZG8geyBleG4gPC0gVC5yZWFkQXBwRXhuIGlwIDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlgudGhyb3cgZXhuIH0iIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJyZXMgPC0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcCIgPDwgZW5kbDsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgICAgZm9yIChhdXRvIHhjZXB0aW9uIDogeGNlcHRpb25zKSB7CisgICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJQLm1heWJlIChQLnJldHVybiAoKSkgWC50aHJvdyAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsIHhjZXB0aW9uLT5nZXRfbmFtZSgpKSA8PCAiIHJlcykiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJQLnJldHVybiAkICIgPDwgZmllbGRfbmFtZShyZXN1bHRuYW1lLCAic3VjY2VzcyIpIDw8ICIgcmVzIiA8PCBlbmRsOworICAgICAgZWxzZQorICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiUC5yZXR1cm4gKCkiIDw8IGVuZGw7CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBmX2NsaWVudF8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpIChuYW1lLHR5cCxzZXFpZCkgPSBjYXNlIG5hbWUgb2YiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXCIiIDw8IGZuYW1lIDw8ICJcIiAtPiBwcm9jZXNzXyIgPDwgZGVjYXBpdGFsaXplKGZuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIChzZXFpZCxpcHJvdCxvcHJvdCxoYW5kbGVyKSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXyAtPiAiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGZfc2VydmljZV8gPDwgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKQorICAgICAgICAgICAgICAgPDwgIi5wcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSIgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgImRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXyA8LSBULnJlYWRWYWwgaXByb3QgKFQuVF9TVFJVQ1QgTWFwLmVtcHR5KSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChuYW1lLFQuTV9FWENFUFRJT04sc2VxaWQpICQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlQXBwRXhuIG9wcm90IChULkFwcEV4biBULkFFX1VOS05PV05fTUVUSE9EIChcIlVua25vd24gZnVuY3Rpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgKysgTFQudW5wYWNrIG5hbWUpKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzIGhhbmRsZXIgKGlwcm90LCBvcHJvdCkgPSBkbyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULnJlYWRNZXNzYWdlIGlwcm90ICgiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkpIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuIFAuVHJ1ZSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworYm9vbCBoYXNOb0FyZ3VtZW50cyh0X2Z1bmN0aW9uKiBmdW5jKSB7CisgIHJldHVybiAoZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKTsKK30KKworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfaHNfdHlwZV9mb3JfZnVuY3Rpb25fbmFtZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RyaW5nIHR5cGVfc3RyID0gcmVuZGVyX2hzX3R5cGUodHlwZSwgZmFsc2UpOworICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGZvdW5kID0gLTE7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBmb3VuZCA9IHR5cGVfc3RyLmZpbmRfZmlyc3Rfb2YoIltdLiAiLCBmb3VuZCArIDEpOworICAgIGlmIChzdHJpbmc6Om5wb3MgPT0gc2l6ZV90KGZvdW5kKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHR5cGVfc3RyW2ZvdW5kXSA9PSAnLicpCisgICAgICB0eXBlX3N0cltmb3VuZF0gPSAnXyc7CisgICAgZWxzZQorICAgICAgdHlwZV9zdHJbZm91bmRdID0gJ1onOworICB9CisgIHJldHVybiB0eXBlX3N0cjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBzdHJpbmcgZnVubmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3NfIiA8PCBmdW5uYW1lIDw8ICIgKHNlcWlkLCBpcHJvdCwgb3Byb3QsIGhhbmRsZXIpID0gZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOworCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzIDwtIHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIHNpemVfdCBuID0geGNlcHRpb25zLnNpemUoKSArIDE7CisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKG4gPiAwKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKFguY2F0Y2giIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgIH0KKworICBpZiAobiA+IDApIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIihkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXyk7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICBmX3NlcnZpY2VfIDw8ICJ2YWwgPC0gIjsKKworICBmX3NlcnZpY2VfIDw8ICJJZmFjZS4iIDw8IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIgaGFuZGxlciI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIGZfc2VydmljZV8gPDwgIiAoIiA8PCBmaWVsZF9uYW1lKGFyZ3NuYW1lLCAoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgYXJncykiOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJsZXQgcmVzID0gZGVmYXVsdF8iIDw8IHJlc3VsdG5hbWUgPDwgInsiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgInN1Y2Nlc3MiKSA8PCAiID0gdmFsfSI7CisKKyAgfSBlbHNlIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImxldCByZXMgPSBkZWZhdWx0XyIgPDwgcmVzdWx0bmFtZTsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuICgpIjsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVC5NX1JFUExZLCBzZXFpZCkgJCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndyaXRlXyIgPDwgcmVzdWx0bmFtZSA8PCAiIG9wcm90IHJlcyI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBpZiAobiA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIpIjsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAobiA+IDApIHsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoXFxlICAtPiBkbyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJsZXQgcmVzID0gZGVmYXVsdF8iIDw8IHJlc3VsdG5hbWUgPDwgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IFAuSnVzdCBlfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2Ugb3Byb3QgKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVC5NX1JFUExZLCBzZXFpZCkgJCIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid3JpdGVfIiA8PCByZXN1bHRuYW1lIDw8ICIgb3Byb3QgcmVzIjsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gKCkiOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8ICIpKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigoXFxfIC0+IGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBULk1fRVhDRVBUSU9OLCBzZXFpZCkgJCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlQXBwRXhuIG9wcm90IChULkFwcEV4biBULkFFX1VOS05PV04gXCJcIikiOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQLnJldHVybiAoKSI7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiKSA6OiBYLlNvbWVFeGNlcHRpb24gLT4gUC5JTyAoKSkpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICAvLyBDbG9zZSBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZClwcmVmaXg7CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsIHR5cGUsIHByZWZpeCk7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBhcmcpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgb3V0IDw8ICIoY2FzZSAiIDw8IGFyZyA8PCAiIG9mIHsiIDw8IHR5cGVfdG9fY29uc3RydWN0b3IodHlwZSkgPDwgIiAiIDw8IHZhbCA8PCAiIC0+ICI7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRSI7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHZhbCk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHZhbCk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HICYmICF0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICJFLmRlY29kZVV0ZjggIjsKKyAgICB9CisgICAgb3V0IDw8IHZhbDsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIC8vIFNpbmNlIHdpcmUgdHlwZSBvZiBiaW5hcnkgaXMgdGhlIHNhbWUgYXMgc3RyaW5nLCB3ZSBhY3R1YWxseSByZWNlaXZlIFQuVFN0cmluZyBub3QKKyAgICAgIC8vIFQuVEJpbmFyeQorICAgICAgb3V0IDw8ICI7IFQuVFN0cmluZyAiIDw8IHZhbCA8PCAiIC0+ICIgPDwgdmFsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgIlAudG9FbnVtICQgUC5mcm9tSW50ZWdyYWwgIiA8PCB2YWw7CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgb3V0IDw8ICI7IF8gLT4gUC5lcnJvciBcIndyb25nIHR5cGVcIn0pIjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBuYW1lKSB7CisKKyAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgInRvXyIpIDw8ICIgKFQuVFN0cnVjdCAiIDw8IG5hbWUgPDwgIikpIjsKK30KKworLyoqCisgKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQorICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIGFyZykgeworCisgIHN0cmluZyB2YWwgPSB0bXAoIl92Iik7CisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtleSA9IHRtcCgiX2siKTsKKyAgICBvdXQgPDwgIihNYXAuZnJvbUxpc3QgJCBQLm1hcCAoXFwoIiA8PCBrZXkgPDwgIiwiIDw8IHZhbCA8PCAiKSAtPiAoIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKworICAgIG91dCA8PCAiLCI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgICBvdXQgPDwgIikpICIgPDwgYXJnIDw8ICIpIjsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCAiKFNldC5mcm9tTGlzdCAkIFAubWFwIChcXCIgPDwgdmFsIDw8ICIgLT4gIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHZhbCk7CisgICAgb3V0IDw8ICIpICIgPDwgYXJnIDw8ICIpIjsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgIihWZWN0b3IuZnJvbUxpc3QgJCBQLm1hcCAoXFwiIDw8IHZhbCA8PCAiIC0+ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdmFsKTsKKyAgICBvdXQgPDwgIikgIiA8PCBhcmcgPDwgIikiOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIG5hbWUpIHsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKQorICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRSI7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBvdXQgPDwgdHlwZV90b19jb25zdHJ1Y3Rvcih0eXBlKSA8PCAiICI7CisgICAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HICYmICF0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBvdXQgPDwgIiQgRS5lbmNvZGVVdGY4ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgbmFtZTsKKworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOworICAgICAgb3V0IDw8ICJULlRJMzIgJCBQLmZyb21JbnRlZ3JhbCAkIFAuZnJvbUVudW0gIiA8PCBuYW1lOworICAgIH0KKworICB9IGVsc2UgeworICAgIHRocm93ICJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEIE9GIFRZUEUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IHR5cGVfbmFtZSh0c3RydWN0LCAiZnJvbV8iKSA8PCAiICIgPDwgcHJlZml4OworfQorCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgayA9IHRtcCgiX2siKTsKKyAgc3RyaW5nIHYgPSB0bXAoIl92Iik7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAiVC5UTWFwICIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiICIgPDwgdHlwZV90b19lbnVtKHZ0eXBlKTsKKyAgICBvdXQgPDwgIiAkIFAubWFwIChcXCgiIDw8IGsgPDwgIiwiIDw8IHYgPDwgIikgLT4gKCI7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCBrdHlwZSwgayk7CisgICAgb3V0IDw8ICIsICI7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCB2dHlwZSwgdik7CisgICAgb3V0IDw8ICIpKSAkIE1hcC50b0xpc3QgIiA8PCBwcmVmaXg7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgIlQuVFNldCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgb3V0IDw8ICIgJCBQLm1hcCAoXFwiIDw8IHYgPDwgIiAtPiAiOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHYpOworICAgIG91dCA8PCAiKSAkIFNldC50b0xpc3QgIiA8PCBwcmVmaXg7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8ICJULlRMaXN0ICIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgb3V0IDw8ICIgJCBQLm1hcCAoXFwiIDw8IHYgPDwgIiAtPiAiOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB2KTsKKyAgICBvdXQgPDwgIikgJCBWZWN0b3IudG9MaXN0ICIgPDwgcHJlZml4OworICB9Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBvcHRpb25zLCBib29sIGlvLCBib29sIG1ldGhvZCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIGZvciAoYXV0byBmaWVsZCA6IGZpZWxkcykgeworICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgfHwgKCh0X3R5cGUqKWZpZWxkLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkKKyAgICAgIHJlc3VsdCArPSAiUC5NYXliZSAiOworICAgIHJlc3VsdCArPSByZW5kZXJfaHNfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSwgb3B0aW9ucyk7CisgICAgcmVzdWx0ICs9ICIgLT4gIjsKKyAgfQorCisgIGlmIChmaWVsZHMuZW1wdHkoKSAmJiAhbWV0aG9kKQorICAgIHJlc3VsdCArPSAiKCkgLT4gIjsKKworICBpZiAoaW8pCisgICAgcmVzdWx0ICs9ICJQLklPICI7CisKKyAgcmVzdWx0ICs9IHJlbmRlcl9oc190eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLCBpbyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIHN0cmluZyBmdW5jdGlvbl9wcmVmaXgpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pCisgICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKQorICAgICAgcHJlZml4ID0gY2FwaXRhbGl6ZShwcm9ncmFtLT5nZXRfbmFtZSgpKSArICJfVHlwZXMuIjsKKworICByZXR1cm4gcHJlZml4ICsgZnVuY3Rpb25fcHJlZml4ICsgY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6ZmllbGRfbmFtZShzdHJpbmcgdG5hbWUsIHN0cmluZyBmbmFtZSkgeworICByZXR1cm4gZGVjYXBpdGFsaXplKHRuYW1lKSArICJfIiArIGZuYW1lOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHJvdG9jb2wudF90eXBlIGVudW0KKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJULlRfVk9JRCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gdHlwZS0+aXNfYmluYXJ5KCkgPyAiVC5UX0JJTkFSWSIgOiAiVC5UX1NUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJULlRfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVC5UX0JZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJULlRfSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVC5UX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlQuVF9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJULlRfRE9VQkxFIjsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlQuVF9JMzIiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKFQuVF9TVFJVQ1QgIiArIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUsICJ0eXBlbWFwXyIpICsgIikiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga3R5cGUgPSB0eXBlX3RvX2VudW0oKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICBzdHJpbmcgdnR5cGUgPSB0eXBlX3RvX2VudW0oKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpKTsKKyAgICByZXR1cm4gIihULlRfTUFQICIgKyBrdHlwZSArICIgIiArIHZ0eXBlICsgIikiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIihULlRfU0VUICIgKyB0eXBlX3RvX2VudW0oKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIihULlRfTElTVCAiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGRlZmF1bHQgdmFsdWUKKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2RlZmF1bHQodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJQLmVycm9yIFwiTm8gZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUX1ZPSURcIiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlwiXCIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiUC5GYWxzZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIjAiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiKFAudG9FbnVtIDApIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSwgImRlZmF1bHRfIik7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiTWFwLmVtcHR5IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJTZXQuZW1wdHkiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJWZWN0b3IuZW1wdHkiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2RlZmF1bHQ6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIGhhc2tlbGwgdHlwZQorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwgYm9vbCBuZWVkc19wYXJlbnMpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0cmluZyB0eXBlX3JlcHI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIigpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAodHlwZS0+aXNfYmluYXJ5KCkgPyAiTEJTLkJ5dGVTdHJpbmciIDogIkxULlRleHQiKTsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlAuQm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiSS5JbnQ4IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiSS5JbnQxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIkkuSW50MzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJJLkludDY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiUC5Eb3VibGUiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiB0eXBlX25hbWUoKHRfZW51bSopdHlwZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgdHlwZV9yZXByID0gIk1hcC5IYXNoTWFwICIgKyByZW5kZXJfaHNfdHlwZShrdHlwZSwgdHJ1ZSkgKyAiICIgKyByZW5kZXJfaHNfdHlwZSh2dHlwZSwgdHJ1ZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHR5cGVfcmVwciA9ICJTZXQuSGFzaFNldCAiICsgcmVuZGVyX2hzX3R5cGUoZXR5cGUsIHRydWUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHR5cGVfcmVwciA9ICJWZWN0b3IuVmVjdG9yICIgKyByZW5kZXJfaHNfdHlwZShldHlwZSwgdHJ1ZSk7CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gbmVlZHNfcGFyZW5zID8gIigiICsgdHlwZV9yZXByICsgIikiIDogdHlwZV9yZXByOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgaGFza2VsbCBjb25zdHJ1Y3RvcgorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfdG9fY29uc3RydWN0b3IodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImludmFsaWQgdHlwZTogVF9WT0lEIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiB0eXBlLT5pc19iaW5hcnkoKSA/ICJULlRCaW5hcnkiIDogIlQuVFN0cmluZyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJULlRCb29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJULlRCeXRlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVC5USTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVC5USTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVC5USTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVC5URG91YmxlIjsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlQuVEkzMiI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJULlRTdHJ1Y3QiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlQuVE1hcCBfIF8iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlQuVFNldCBfIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVC5UTGlzdCBfIjsKKyAgfQorICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoaHMsICJIYXNrZWxsIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjFhNzEyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEwODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpwYWlyOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKK2VudW0gaW5wdXRfdHlwZSB7IElOUFVUX1VOS05PV04sIElOUFVUX1VURjgsIElOUFVUX1BMQUlOIH07CisKKy8qKgorICogSFRNTCBjb2RlIGdlbmVyYXRvcgorICoKKyAqIG1vc3RseSBjb3B5L3Bhc3RpbmcvdHdlYWtpbmcgZnJvbSBtY3NsZWUncyB3b3JrLgorICovCitjbGFzcyB0X2h0bWxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9odG1sX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgc3RhbmRhbG9uZV8gPSBmYWxzZTsKKyAgICB1bnNhZmVfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic3RhbmRhbG9uZSIpID09IDApIHsKKyAgICAgICAgc3RhbmRhbG9uZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub2VzY2FwZSIpID09IDApIHsKKyAgICAgICAgdW5zYWZlXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gaHRtbDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1odG1sIjsKKyAgICBpbnB1dF90eXBlXyA9IElOUFVUX1VOS05PV047CisKKyAgICBlc2NhcGVfLmNsZWFyKCk7CisgICAgZXNjYXBlX1snJiddID0gIiZhbXA7IjsKKyAgICBlc2NhcGVfWyc8J10gPSAiJmx0OyI7CisgICAgZXNjYXBlX1snPiddID0gIiZndDsiOworICAgIGVzY2FwZV9bJyInXSA9ICImcXVvdDsiOworICAgIGVzY2FwZV9bJ1wnJ10gPSAiJmFwb3M7IjsKKworICAgIGluaXRfYWxsb3dlZF9fbWFya3VwKCk7CisgIH0KKworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0X3Byb2dyYW0qIHRwcm9nKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCk7CisgIHZvaWQgZ2VuZXJhdGVfaW5kZXgoKTsKKyAgc3RkOjpzdHJpbmcgZXNjYXBlX2h0bWwoc3RkOjpzdHJpbmcgY29uc3QmIHN0cik7CisgIHN0ZDo6c3RyaW5nIGVzY2FwZV9odG1sX3RhZ3Moc3RkOjpzdHJpbmcgY29uc3QmIHN0cik7CisgIHZvaWQgZ2VuZXJhdGVfY3NzKCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoc3RkOjpvc3RyZWFtJiBmX3RhcmdldCk7CisgIHZvaWQgZ2VuZXJhdGVfc3R5bGVfdGFnKCk7CisgIHN0ZDo6c3RyaW5nIG1ha2VfZmlsZV9saW5rKHN0ZDo6c3RyaW5nIG5hbWUpOworICBib29sIGlzX3V0Zjhfc2VxdWVuY2Uoc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc2l6ZV90IGZpcnN0cG9zKTsKKyAgdm9pZCBkZXRlY3RfaW5wdXRfZW5jb2Rpbmcoc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc2l6ZV90IGZpcnN0cG9zKTsKKyAgdm9pZCBpbml0X2FsbG93ZWRfX21hcmt1cCgpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIG92ZXJyaWRlOworCisgIHZvaWQgcHJpbnRfZG9jKHRfZG9jKiB0ZG9jKTsKKyAgaW50IHByaW50X3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworICB2b2lkIHByaW50X2ZuX2FyZ3NfZG9jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKK3ByaXZhdGU6CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9vdXRfOworICBzdGQ6OnN0cmluZyBjdXJyZW50X2ZpbGVfOworICBpbnB1dF90eXBlIGlucHV0X3R5cGVfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBhbGxvd2VkX21hcmt1cDsKKyAgYm9vbCBzdGFuZGFsb25lXzsKKyAgYm9vbCB1bnNhZmVfOworfTsKKworLyoqCisgKiBFbWl0cyB0aGUgVGFibGUgb2YgQ29udGVudHMgbGlua3MgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlJ3MgcGFnZQorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jKCkgeworICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgIgorICAgICAgICAgICAgInRhYmxlLWNvbmRlbnNlZFwiPjx0aGVhZD48dHI+PHRoPk1vZHVsZTwvdGg+PHRoPlNlcnZpY2VzPC90aD4iCisgICAgICAgICA8PCAiPHRoPkRhdGEgdHlwZXM8L3RoPjx0aD5Db25zdGFudHM8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+IiA8PCBlbmRsOworICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3cocHJvZ3JhbV8pOworICBmX291dF8gPDwgIjwvdGJvZHk+PC90YWJsZT4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVjdXJzZXMgdGhyb3VnaCBmcm9tIHRoZSBwcm92aWRlZCBwcm9ncmFtIGFuZCBnZW5lcmF0ZXMgYSBUb0Mgcm93CisgKiBmb3IgZWFjaCBkaXNjb3ZlcmVkIHByb2dyYW0gZXhhY3RseSBvbmNlIGJ5IG1haW50YWluaW5nIHRoZSBsaXN0IG9mCisgKiBjb21wbGV0ZWQgcm93cyBpbiAnZmluaXNoZWQnCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cyh0X3Byb2dyYW0qIHRwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCkgeworICBmb3IgKGF1dG8gJiBpdGVyIDogZmluaXNoZWQpIHsKKyAgICBpZiAodHByb2ctPmdldF9wYXRoKCkgPT0gaXRlci0+Z2V0X3BhdGgoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBmaW5pc2hlZC5wdXNoX2JhY2sodHByb2cpOworICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codHByb2cpOworICB2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXMgPSB0cHJvZy0+Z2V0X2luY2x1ZGVzKCk7CisgIGZvciAoYXV0byAmIGluY2x1ZGUgOiBpbmNsdWRlcykgeworICAgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3MoaW5jbHVkZSwgZmluaXNoZWQpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgdGhlIFRhYmxlIG9mIENvbnRlbnRzIGxpbmtzIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSdzIHBhZ2UKKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codF9wcm9ncmFtKiB0cHJvZykgeworICBzdHJpbmcgZm5hbWUgPSB0cHJvZy0+Z2V0X25hbWUoKSArICIuaHRtbCI7CisgIGZfb3V0XyA8PCAiPHRyPiIgPDwgZW5kbCA8PCAiPHRkPiIgPDwgdHByb2ctPmdldF9uYW1lKCkgPDwgIjwvdGQ+PHRkPiI7CisgIGlmICghdHByb2ctPmdldF9zZXJ2aWNlcygpLmVtcHR5KCkpIHsKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSB0cHJvZy0+Z2V0X3NlcnZpY2VzKCk7CisgICAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKKyAgICAgIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsoZm5hbWUpIDw8ICIjU3ZjXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCisgICAgICAgICAgICAgPDwgIjwvYT48YnIvPiIgPDwgZW5kbDsKKyAgICAgIGZfb3V0XyA8PCAiPHVsPiIgPDwgZW5kbDsKKyAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gZm5faHRtbDsKKyAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gKCpzdl9pdGVyKS0+Z2V0X2Z1bmN0aW9ucygpOworICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKKyAgICAgIGZvciAoZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmbl9pdGVyKSB7CisgICAgICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgc3RyaW5nIGh0bWwgPSAiPGxpPjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNGbl8iICsgbmFtZSArICJfIiArIGZuX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICArICJcIj4iICsgZm5fbmFtZSArICI8L2E+PC9saT4iOworICAgICAgICBmbl9odG1sLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihmbl9uYW1lLCBodG1sKSk7CisgICAgICB9CisgICAgICBmb3IgKGF1dG8gJiBodG1sX2l0ZXIgOiBmbl9odG1sKSB7CisgICAgICAgIGZfb3V0XyA8PCBodG1sX2l0ZXIuc2Vjb25kIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX291dF8gPDwgIjwvdWw+IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX291dF8gPDwgIjwvdGQ+IiA8PCBlbmRsIDw8ICI8dGQ+IjsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBkYXRhX3R5cGVzOworICBpZiAoIXRwcm9nLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7CisgICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gdHByb2ctPmdldF9lbnVtcygpOworICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCplbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIC8vIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsoZm5hbWUpIDw8ICIjRW51bV8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQorICAgICAgLy8gPDwgICI8L2E+PGJyLz4iIDw8IGVuZGw7CisgICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjRW51bV8iICsgbmFtZSArICJcIj4iICsgbmFtZSArICI8L2E+IjsKKyAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KG5hbWUsIGh0bWwpKTsKKyAgICB9CisgIH0KKyAgaWYgKCF0cHJvZy0+Z2V0X3R5cGVkZWZzKCkuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHRwcm9nLT5nZXRfdHlwZWRlZnMoKTsKKyAgICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7CisgICAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqdGRfaXRlciktPmdldF9zeW1ib2xpYygpOworICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNUeXBlZGVmXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCisgICAgICAvLyA8PCAiPC9hPjxici8+IiA8PCBlbmRsOworICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI1R5cGVkZWZfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiPC9hPiI7CisgICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7CisgICAgfQorICB9CisgIGlmICghdHByb2ctPmdldF9vYmplY3RzKCkuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSB0cHJvZy0+Z2V0X29iamVjdHMoKTsKKyAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpvX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNTdHJ1Y3RfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKKyAgICAgIC8vPDwgIjwvYT48YnIvPiIgPDwgZW5kbDsKKyAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNTdHJ1Y3RfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiPC9hPiI7CisgICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7CisgICAgfQorICB9CisgIGZvciAoYXV0byAmIGRhdGFfdHlwZSA6IGRhdGFfdHlwZXMpIHsKKyAgICBmX291dF8gPDwgZGF0YV90eXBlLnNlY29uZCA8PCAiPGJyLz4iIDw8IGVuZGw7CisgIH0KKyAgZl9vdXRfIDw8ICI8L3RkPiIgPDwgZW5kbCA8PCAiPHRkPiI7CisgIGlmICghdHByb2ctPmdldF9jb25zdHMoKS5lbXB0eSgpKSB7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBjb25zdF9odG1sOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gdHByb2ctPmdldF9jb25zdHMoKTsKKyAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjb25faXRlcjsKKyAgICBmb3IgKGNvbl9pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNvbl9pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjb25faXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKmNvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBodG1sID0gIjxjb2RlPjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNDb25zdF8iICsgbmFtZSArICJcIj4iICsgbmFtZQorICAgICAgICAgICAgICAgICAgICArICI8L2E+PC9jb2RlPiI7CisgICAgICBjb25zdF9odG1sLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7CisgICAgfQorICAgIGZvciAoYXV0byAmIGNvbl9pdGVyIDogY29uc3RfaHRtbCkgeworICAgICAgZl9vdXRfIDw8IGNvbl9pdGVyLnNlY29uZCA8PCAiPGJyLz4iIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZfb3V0XyA8PCAiPC90ZD4iIDw8IGVuZGwgPDwgIjwvdHI+IjsKK30KKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtLgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBjdXJyZW50X2ZpbGVfID0gcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmh0bWwiOworICBzdHJpbmcgZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgY3VycmVudF9maWxlXzsKKyAgZl9vdXRfLm9wZW4oZm5hbWUuY19zdHIoKSk7CisgIGZfb3V0XyA8PCAiPCFET0NUWVBFIGh0bWw+IiA8PCBlbmRsOworICBmX291dF8gPDwgIjxodG1sIGxhbmc9XCJlblwiPiIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICI8aGVhZD4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPG1ldGEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOFwiIC8+IiA8PCBlbmRsOworICBnZW5lcmF0ZV9zdHlsZV90YWcoKTsKKyAgZl9vdXRfIDw8ICI8dGl0bGU+VGhyaWZ0IG1vZHVsZTogIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiPC90aXRsZT48L2hlYWQ+PGJvZHk+IiA8PCBlbmRsCisgICAgICAgICA8PCAiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPiIgPDwgZW5kbAorICAgICAgICAgPDwgIjxoMT5UaHJpZnQgbW9kdWxlOiAiIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICI8L2gxPiIgPDwgZW5kbDsKKworICBwcmludF9kb2MocHJvZ3JhbV8pOworCisgIGdlbmVyYXRlX3Byb2dyYW1fdG9jKCk7CisKKyAgaWYgKCFwcm9ncmFtXy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKKyAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiQ29uc3RhbnRzXCI+Q29uc3RhbnRzPC9oMj4iIDw8IGVuZGw7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOworICAgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOworICAgIGZfb3V0XyA8PCAiPHRoZWFkPjx0cj48dGg+Q29uc3RhbnQ8L3RoPjx0aD5UeXBlPC90aD48dGg+VmFsdWU8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2NvbnN0cyhjb25zdHMpOworICAgIGZfb3V0XyA8PCAiPC90Ym9keT48L3RhYmxlPiI7CisgIH0KKworICBpZiAoIXByb2dyYW1fLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIkVudW1lcmF0aW9uc1wiPkVudW1lcmF0aW9uczwvaDI+IiA8PCBlbmRsOworICAgIC8vIEdlbmVyYXRlIGVudW1zCisgICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOworICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICAgIH0KKyAgfQorCisgIGlmICghcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpLmVtcHR5KCkpIHsKKyAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiVHlwZWRlZnNcIj5UeXBlIGRlY2xhcmF0aW9uczwvaDI+IiA8PCBlbmRsOworICAgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCisgICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOworICAgIH0KKyAgfQorCisgIGlmICghcHJvZ3JhbV8tPmdldF9vYmplY3RzKCkuZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJTdHJ1Y3RzXCI+RGF0YSBzdHJ1Y3R1cmVzPC9oMj4iIDw8IGVuZGw7CisgICAgLy8gR2VuZXJhdGUgc3RydWN0cyBhbmQgZXhjZXB0aW9ucyBpbiBkZWNsYXJlZCBvcmRlcgorICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKKyAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKKyAgICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKCFwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCkuZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJTZXJ2aWNlc1wiPlNlcnZpY2VzPC9oMj4iIDw8IGVuZGw7CisgICAgLy8gR2VuZXJhdGUgc2VydmljZXMKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgICAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOworICAgICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7CisgICAgfQorICB9CisKKyAgZl9vdXRfIDw8ICI8L2Rpdj48L2JvZHk+PC9odG1sPiIgPDwgZW5kbDsKKyAgZl9vdXRfLmNsb3NlKCk7CisKKyAgZ2VuZXJhdGVfaW5kZXgoKTsKKyAgZ2VuZXJhdGVfY3NzKCk7Cit9CisKKy8qKgorICogRW1pdHMgdGhlIGluZGV4Lmh0bWwgZmlsZSBmb3IgdGhlIHJlY3Vyc2l2ZSBzZXQgb2YgVGhyaWZ0IHByb2dyYW1zCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaW5kZXgoKSB7CisgIGN1cnJlbnRfZmlsZV8gPSAiaW5kZXguaHRtbCI7CisgIHN0cmluZyBpbmRleF9mbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjdXJyZW50X2ZpbGVfOworICBmX291dF8ub3BlbihpbmRleF9mbmFtZS5jX3N0cigpKTsKKyAgZl9vdXRfIDw8ICI8IURPQ1RZUEUgaHRtbD4iIDw8IGVuZGwgPDwgIjxodG1sIGxhbmc9XCJlblwiPjxoZWFkPiIgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc3R5bGVfdGFnKCk7CisgIGZfb3V0XyA8PCAiPHRpdGxlPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC90aXRsZT48L2hlYWQ+PGJvZHk+IiA8PCBlbmRsCisgICAgICAgICA8PCAiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPiIgPDwgZW5kbCA8PCAiPGgxPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC9oMT4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCAiCisgICAgICAgICAgICAidGFibGUtY29uZGVuc2VkXCI+PHRoZWFkPjx0cj48dGg+TW9kdWxlPC90aD48dGg+U2VydmljZXM8L3RoPjx0aD5EYXRhIHR5cGVzPC90aD4iCisgICAgICAgICA8PCAiPHRoPkNvbnN0YW50czwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4iIDw8IGVuZGw7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPiBwcm9ncmFtczsKKyAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cyhwcm9ncmFtXywgcHJvZ3JhbXMpOworICBmX291dF8gPDwgIjwvdGJvZHk+PC90YWJsZT4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPC9kaXY+PC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7CisgIGZfb3V0Xy5jbG9zZSgpOworfQorCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzcygpIHsKKyAgaWYgKCFzdGFuZGFsb25lXykgeworICAgIGN1cnJlbnRfZmlsZV8gPSAic3R5bGUuY3NzIjsKKyAgICBzdHJpbmcgY3NzX2ZuYW1lID0gZ2V0X291dF9kaXIoKSArIGN1cnJlbnRfZmlsZV87CisgICAgZl9vdXRfLm9wZW4oY3NzX2ZuYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX2Nzc19jb250ZW50KGZfb3V0Xyk7CisgICAgZl9vdXRfLmNsb3NlKCk7CisgIH0KK30KKwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc3NfY29udGVudChzdGQ6Om9zdHJlYW0mIGZfdGFyZ2V0KSB7CisgIGZfdGFyZ2V0IDw8IEJPT1RTVFJBUF9DU1MoKSA8PCBlbmRsOworICBmX3RhcmdldCA8PCAiLyogQXV0by1nZW5lcmF0ZWQgQ1NTIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IGRvY3MgKi8iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJoMywgaDQgeyBtYXJnaW4tYm90dG9tOiA2cHg7IH0iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJkaXYuZGVmaW5pdGlvbiB7IGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7IG1hcmdpbi1ib3R0b206IDEwcHg7IHBhZGRpbmc6IDEwcHg7IH0iCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJkaXYuZXh0ZW5kcyB7IG1hcmdpbjogLTAuNWVtIDAgMWVtIDVlbSB9IiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAidGQgeyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB9IiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAidGFibGUgeyBlbXB0eS1jZWxsczogc2hvdzsgfSIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgImNvZGUgeyBsaW5lLWhlaWdodDogMjBweDsgfSIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgIi50YWJsZS1ib3JkZXJlZCB0aCwgLnRhYmxlLWJvcmRlcmVkIHRkIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNEREREREQ7IH0iCisgICAgICAgICAgIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBDU1MgdGFnLgorICogRGVwZW5kaW5nIG9uICJzdGFuZGFsb25lIiwgZWl0aGVyIGEgQ1NTIGZpbGUgbGluayAoZGVmYXVsdCksIG9yIHRoZSBlbnRpcmUgQ1NTIGlzIGVtYmVkZGVkCisgKiBpbmxpbmUuCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3R5bGVfdGFnKCkgeworICBpZiAoIXN0YW5kYWxvbmVfKSB7CisgICAgZl9vdXRfIDw8ICI8bGluayBocmVmPVwic3R5bGUuY3NzXCIgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiLz4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8ICI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCIvPjwhLS0iIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoZl9vdXRfKTsKKyAgICBmX291dF8gPDwgIi0tPjwvc3R5bGU+IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgdGFyZ2V0IGZpbGUgZm9yIGEgPGEgaHJlZj4gbGluaworICogVGhlIHJldHVybmVkIHN0cmluZyBpcyBlbXB0eSwgd2hlbmV2ZXIgZmlsZW5hbWUgcmVmZXJzIHRvIHRoZSBjdXJyZW50IGZpbGUuCisgKi8KK3N0ZDo6c3RyaW5nIHRfaHRtbF9nZW5lcmF0b3I6Om1ha2VfZmlsZV9saW5rKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKSB7CisgIHJldHVybiAoY3VycmVudF9maWxlXy5jb21wYXJlKGZpbGVuYW1lKSAhPSAwKSA/IGZpbGVuYW1lIDogIiI7Cit9CisKKy8qKgorICogSWYgdGhlIHByb3ZpZGVkIGRvY3VtZW50YWJsZSBvYmplY3QgaGFzIGRvY3VtZW50YXRpb24gYXR0YWNoZWQsIHRoaXMKKyAqIHdpbGwgZW1pdCBpdCB0byB0aGUgb3V0cHV0IHN0cmVhbSBpbiBIVE1MIGZvcm1hdC4KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9kb2ModF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGlmICh1bnNhZmVfKSB7CisgICAgICBmX291dF8gPDwgdGRvYy0+Z2V0X2RvYygpIDw8ICI8YnIvPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfb3V0XyA8PCAiPHByZT4iIDw8IGVzY2FwZV9odG1sKHRkb2MtPmdldF9kb2MoKSkgPDwgIjwvcHJlPjxici8+IjsKKyAgICB9CisgIH0KK30KKworYm9vbCB0X2h0bWxfZ2VuZXJhdG9yOjppc191dGY4X3NlcXVlbmNlKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcykgeworICAvLyBsZWFkaW5nIGNoYXIgZGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZQorICB1bnNpZ25lZCBjaGFyIGMgPSBzdHIuYXQoZmlyc3Rwb3MpOworICBpbnQgY291bnQgPSAwOworICBpZiAoKGMgJiAweEUwKSA9PSAweEMwKSB7CisgICAgY291bnQgPSAxOworICB9IGVsc2UgaWYgKChjICYgMHhGMCkgPT0gMHhFMCkgeworICAgIGNvdW50ID0gMjsKKyAgfSBlbHNlIGlmICgoYyAmIDB4RjgpID09IDB4RjApIHsKKyAgICBjb3VudCA9IDM7CisgIH0gZWxzZSBpZiAoKGMgJiAweEZDKSA9PSAweEY4KSB7CisgICAgY291bnQgPSA0OworICB9IGVsc2UgaWYgKChjICYgMHhGRSkgPT0gMHhGQykgeworICAgIGNvdW50ID0gNTsKKyAgfSBlbHNlIHsKKyAgICAvLyBwZGVidWcoIlVURi04IHRlc3Q6IGNoYXIgJyVjJyAoJWQpIGlzIG5vdCBhIHZhbGlkIFVURi04IGxlYWRpbmcgYnl0ZSIsIGMsIGludChjKSk7CisgICAgcmV0dXJuIGZhbHNlOyAvLyBubyBVVEYtOAorICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzCisgIHNpemVfdCBwb3MgPSBmaXJzdHBvcyArIDE7CisgIHdoaWxlICgocG9zIDwgc3RyLmxlbmd0aCgpKSAmJiAoMCA8IGNvdW50KSkgeworICAgIGMgPSBzdHIuYXQocG9zKTsKKyAgICBpZiAoKGMgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAvLyBwZGVidWcoIlVURi04IHRlc3Q6IGNoYXIgJyVjJyAoJWQpIGlzIG5vdCBhIHZhbGlkIFVURi04IGZvbGxvd2luZyBieXRlIiwgYywgaW50KGMpKTsKKyAgICAgIHJldHVybiBmYWxzZTsgLy8gbm8gVVRGLTgKKyAgICB9CisgICAgLS1jb3VudDsKKyAgICArK3BvczsKKyAgfQorCisgIC8vIHRydWUgaWYgdGhlIHNlcXVlbmNlIGlzIGNvbXBsZXRlCisgIHJldHVybiAoMCA9PSBjb3VudCk7Cit9CisKK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6ZGV0ZWN0X2lucHV0X2VuY29kaW5nKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcykgeworICBpZiAoaXNfdXRmOF9zZXF1ZW5jZShzdHIsIGZpcnN0cG9zKSkgeworICAgIHBkZWJ1ZygiSW5wdXQgc2VlbXMgdG8gYmUgYWxyZWFkeSBVVEYtOCBlbmNvZGVkIik7CisgICAgaW5wdXRfdHlwZV8gPSBJTlBVVF9VVEY4OworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGZhbGxiYWNrCisgIHB3YXJuaW5nKDEsICJJbnB1dCBpcyBub3QgVVRGLTgsIHRyZWF0aW5nIGFzIHBsYWluIEFOU0kiKTsKKyAgaW5wdXRfdHlwZV8gPSBJTlBVVF9QTEFJTjsKK30KKwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjppbml0X2FsbG93ZWRfX21hcmt1cCgpIHsKKyAgYWxsb3dlZF9tYXJrdXAuY2xlYXIoKTsKKyAgLy8gc3RhbmRhbG9uZSB0YWdzCisgIGFsbG93ZWRfbWFya3VwWyJiciJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImJyLyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImltZyJdID0gMTsKKyAgLy8gcGFpcmVkIHRhZ3MKKyAgYWxsb3dlZF9tYXJrdXBbImIiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvYiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInUiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvdSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImkiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInMiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvcyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImJpZyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9iaWciXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJzbWFsbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9zbWFsbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInN1cCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9zdXAiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJzdWIiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvc3ViIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsicHJlIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3ByZSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInR0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3R0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsidWwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvdWwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJvbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9vbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImxpIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2xpIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiYSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9hIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsicCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9wIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiY29kZSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9jb2RlIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiZGwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvZGwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJkdCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9kdCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImRkIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2RkIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDEiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDEiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoMiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oMiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImgzIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2gzIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoNSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oNSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImg2Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2g2Il0gPSAxOworfQorCitzdGQ6OnN0cmluZyB0X2h0bWxfZ2VuZXJhdG9yOjplc2NhcGVfaHRtbF90YWdzKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKworICB1bnNpZ25lZCBjaGFyIGMgPSAnPyc7CisgIHNpemVfdCBsYXN0cG9zOworICBzaXplX3QgZmlyc3Rwb3MgPSAwOworICB3aGlsZSAoZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKworICAgIC8vIGxvb2sgZm9yIG5vbi1BU0NJSSBjaGFyCisgICAgbGFzdHBvcyA9IGZpcnN0cG9zOworICAgIHdoaWxlIChsYXN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7CisgICAgICBjID0gc3RyLmF0KGxhc3Rwb3MpOworICAgICAgaWYgKCgnPCcgPT0gYykgfHwgKCc+JyA9PSBjKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsrbGFzdHBvczsKKyAgICB9CisKKyAgICAvLyBjb3B5IHdoYXQgd2UgZ290IHNvIGZhcgorICAgIGlmIChsYXN0cG9zID4gZmlyc3Rwb3MpIHsKKyAgICAgIHJlc3VsdCA8PCBzdHIuc3Vic3RyKGZpcnN0cG9zLCBsYXN0cG9zIC0gZmlyc3Rwb3MpOworICAgICAgZmlyc3Rwb3MgPSBsYXN0cG9zOworICAgIH0KKworICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KKyAgICBpZiAoZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyB0YWcgZW5kIHdpdGhvdXQgY29ycmVzcG9uZGluZyBiZWdpbgorICAgICsrZmlyc3Rwb3M7CisgICAgaWYgKCc+JyA9PSBjKSB7CisgICAgICByZXN1bHQgPDwgIiZndDsiOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gZXh0cmFjdCB0aGUgdGFnCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHRhZ3N0cmVhbTsKKyAgICB3aGlsZSAoZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGMgPSBzdHIuYXQoZmlyc3Rwb3MpOworICAgICAgKytmaXJzdHBvczsKKyAgICAgIGlmICgnPCcgPT0gYykgeworICAgICAgICB0YWdzdHJlYW0gPDwgIiZsdDsiOyAvLyBuZXN0ZWQgYmVnaW4/CisgICAgICB9IGVsc2UgaWYgKCc+JyA9PSBjKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFnc3RyZWFtIDw8IGM7IC8vIG5vdCB2ZXJ5IGVmZmljaWVudCwgYnV0IHRhZ3Mgc2hvdWxkIGJlIHF1aXRlIHNob3J0CisgICAgICB9CisgICAgfQorCisgICAgLy8gd2UgYWxsb3cgZm9yIHNldmVyYWwgbWFya3VwIGluIGRvY3N0cmluZ3MsIGFsbCBlbHNlIHdpbGwgYmVjb21lIGVzY2FwZWQKKyAgICBzdHJpbmcgdGFnX2NvbnRlbnQgPSB0YWdzdHJlYW0uc3RyKCk7CisgICAgc3RyaW5nIHRhZ19rZXkgPSB0YWdfY29udGVudDsKKyAgICBzaXplX3QgZmlyc3Rfd2hpdGUgPSB0YWdfa2V5LmZpbmRfZmlyc3Rfb2YoIiBcdFxmXHZcblxyIik7CisgICAgaWYgKGZpcnN0X3doaXRlICE9IHN0cmluZzo6bnBvcykgeworICAgICAgdGFnX2tleS5lcmFzZShmaXJzdF93aGl0ZSk7CisgICAgfQorICAgIGZvciAoY2hhciAmIGkgOiB0YWdfa2V5KSB7CisgICAgICBpID0gdG9sb3dlcihpKTsKKyAgICB9CisgICAgaWYgKGFsbG93ZWRfbWFya3VwLmZpbmQodGFnX2tleSkgIT0gYWxsb3dlZF9tYXJrdXAuZW5kKCkpIHsKKyAgICAgIHJlc3VsdCA8PCAiPCIgPDwgdGFnX2NvbnRlbnQgPDwgIj4iOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPDwgIiZsdDsiIDw8IHRhZ3N0cmVhbS5zdHIoKSA8PCAiJmd0OyI7CisgICAgICBwdmVyYm9zZSgiaWxsZWdhbCBtYXJrdXAgPCVzPiBpbiBkb2MtY29tbWVudFxuIiwgdGFnX2tleS5jX3N0cigpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0LnN0cigpOworfQorCitzdGQ6OnN0cmluZyB0X2h0bWxfZ2VuZXJhdG9yOjplc2NhcGVfaHRtbChzdGQ6OnN0cmluZyBjb25zdCYgc3RyKSB7CisgIC8vIHRoZSBnZW5lcmF0ZWQgSFRNTCBoZWFkZXIgc2F5cyBpdCBpcyBVVEYtOCBlbmNvZGVkCisgIC8vIGlmIFVURi04IGlucHV0IGhhcyBiZWVuIGRldGVjdGVkIGJlZm9yZSwgd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcKKyAgaWYgKGlucHV0X3R5cGVfID09IElOUFVUX1VURjgpIHsKKyAgICByZXR1cm4gZXNjYXBlX2h0bWxfdGFncyhzdHIpOworICB9CisKKyAgLy8gY29udmVydCB1bnNhZmUgY2hhcnMgdG8gdGhlaXIgJiM8bnVtPjsgZXF1aXZhbGVudAorICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworICB1bnNpZ25lZCBjaGFyIGMgPSAnPyc7CisgIHVuc2lnbmVkIGludCBpYyA9IDA7CisgIHNpemVfdCBsYXN0cG9zOworICBzaXplX3QgZmlyc3Rwb3MgPSAwOworICB3aGlsZSAoZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKworICAgIC8vIGxvb2sgZm9yIG5vbi1BU0NJSSBjaGFyCisgICAgbGFzdHBvcyA9IGZpcnN0cG9zOworICAgIHdoaWxlIChsYXN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7CisgICAgICBjID0gc3RyLmF0KGxhc3Rwb3MpOworICAgICAgaWMgPSBjOworICAgICAgaWYgKCgzMiA+IGljKSB8fCAoMTI3IDwgaWMpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytsYXN0cG9zOworICAgIH0KKworICAgIC8vIGNvcHkgd2hhdCB3ZSBnb3Qgc28gZmFyCisgICAgaWYgKGxhc3Rwb3MgPiBmaXJzdHBvcykgeworICAgICAgcmVzdWx0IDw8IHN0ci5zdWJzdHIoZmlyc3Rwb3MsIGxhc3Rwb3MgLSBmaXJzdHBvcyk7CisgICAgICBmaXJzdHBvcyA9IGxhc3Rwb3M7CisgICAgfQorCisgICAgLy8gcmVhY2hlZCB0aGUgZW5kPworICAgIGlmIChmaXJzdHBvcyA+PSBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIHNvbWUgY29udHJvbCBjb2RlPworICAgIGlmIChpYyA8PSAzMSkgeworICAgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlICdccic6CisgICAgICBjYXNlICdcbic6CisgICAgICBjYXNlICdcdCc6CisgICAgICAgIHJlc3VsdCA8PCBjOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IC8vIHNpbGVudGx5IGNvbnN1bWUgYWxsIG90aGVyIGN0cmwgY2hhcnMKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK2ZpcnN0cG9zOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gcmVhY2hlZCB0aGUgZW5kPworICAgIGlmIChmaXJzdHBvcyA+PSBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIHRyeSB0byBkZXRlY3QgaW5wdXQgZW5jb2RpbmcKKyAgICBpZiAoaW5wdXRfdHlwZV8gPT0gSU5QVVRfVU5LTk9XTikgeworICAgICAgZGV0ZWN0X2lucHV0X2VuY29kaW5nKHN0ciwgZmlyc3Rwb3MpOworICAgICAgaWYgKGlucHV0X3R5cGVfID09IElOUFVUX1VURjgpIHsKKyAgICAgICAgbGFzdHBvcyA9IHN0ci5sZW5ndGgoKTsKKyAgICAgICAgcmVzdWx0IDw8IHN0ci5zdWJzdHIoZmlyc3Rwb3MsIGxhc3Rwb3MgLSBmaXJzdHBvcyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8vIGNvbnZlcnQgdGhlIGNoYXJhY3RlciB0byBzb21ldGhpbmcgdXNlZnVsIGJhc2VkIG9uIHRoZSBkZXRlY3RlZCBlbmNvZGluZworICAgIHN3aXRjaCAoaW5wdXRfdHlwZV8pIHsKKyAgICBjYXNlIElOUFVUX1BMQUlOOgorICAgICAgcmVzdWx0IDw8ICImIyIgPDwgaWMgPDwgIjsiOworICAgICAgKytmaXJzdHBvczsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiVW5leHBlY3RlZCBvciB1bnJlY29nbml6ZWQgaW5wdXQgZW5jb2RpbmciOworICAgIH0KKyAgfQorCisgIHJldHVybiBlc2NhcGVfaHRtbF90YWdzKHJlc3VsdC5zdHIoKSk7Cit9CisKKy8qKgorICogUHJpbnRzIG91dCB0aGUgcHJvdmlkZWQgdHlwZSBpbiBIVE1MCisgKi8KK2ludCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsZW4gPSAwOworICBmX291dF8gPDwgIjxjb2RlPiI7CisgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZl9vdXRfIDw8ICJsaXN0Jmx0OyI7CisgICAgICBsZW4gPSA2ICsgcHJpbnRfdHlwZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgZl9vdXRfIDw8ICJzZXQmbHQ7IjsKKyAgICAgIGxlbiA9IDUgKyBwcmludF90eXBlKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgIGZfb3V0XyA8PCAiJmd0OyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAibWFwJmx0OyI7CisgICAgICBsZW4gPSA1ICsgcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgbGVuICs9IHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgICBmX291dF8gPDwgIiZndDsiOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBmX291dF8gPDwgKHR0eXBlLT5pc19iaW5hcnkoKSA/ICJiaW5hcnkiIDogdHR5cGUtPmdldF9uYW1lKCkpOworICAgIGxlbiA9IHR0eXBlLT5nZXRfbmFtZSgpLnNpemUoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgcHJvZ19uYW1lID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIHR5cGVfbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsocHJvZ19uYW1lICsgIi5odG1sIikgPDwgIiMiOworICAgIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICBmX291dF8gPDwgIlN0cnVjdF8iOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBmX291dF8gPDwgIlN0cnVjdF8iOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgZl9vdXRfIDw8ICJFbnVtXyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgICBmX291dF8gPDwgIlN2Y18iOworICAgIH0KKyAgICBmX291dF8gPDwgdHlwZV9uYW1lIDw8ICJcIj4iOworICAgIGxlbiA9IHR5cGVfbmFtZS5zaXplKCk7CisgICAgaWYgKHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IHByb2dyYW1fKSB7CisgICAgICBmX291dF8gPDwgcHJvZ19uYW1lIDw8ICIuIjsKKyAgICAgIGxlbiArPSBwcm9nX25hbWUuc2l6ZSgpICsgMTsKKyAgICB9CisgICAgZl9vdXRfIDw8IHR5cGVfbmFtZSA8PCAiPC9hPiI7CisgIH0KKyAgZl9vdXRfIDw8ICI8L2NvZGU+IjsKKyAgcmV0dXJuIChpbnQpbGVuOworfQorCisvKioKKyAqIFByaW50cyBvdXQgYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworCisgIC8vIGlmIHR2YWx1ZSBpcyBhbiBpZGVudGlmaWVyLCB0aGUgY29uc3RhbnQgY29udGVudCBpcyBhbHJlYWR5IHNob3duIGVsc2V3aGVyZQorICBpZiAodHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKKyAgICBzdHJpbmcgZm5hbWUgPSBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuaHRtbCI7CisgICAgc3RyaW5nIG5hbWUgPSBlc2NhcGVfaHRtbCh0dmFsdWUtPmdldF9pZGVudGlmaWVyKCkpOworICAgIGZfb3V0XyA8PCAiPGNvZGU+PGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI0NvbnN0XyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lCisgICAgICAgICAgICAgICsgIjwvYT48L2NvZGU+IjsKKyAgICByZXR1cm47CisgIH0KKworICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKKyAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgaWYgKHRydWV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0cnVldHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgZl9vdXRfIDw8ICciJyA8PCBlc2NhcGVfaHRtbChnZXRfZXNjYXBlZF9zdHJpbmcodHZhbHVlKSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgZl9vdXRfIDw8ICgodHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHR2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZl9vdXRfIDw8ICJVTktOT1dOIEJBU0UgVFlQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2VudW0oKSkgeworICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCh0cnVldHlwZS0+Z2V0X25hbWUoKSkgPDwgIi4iCisgICAgICAgICAgIDw8IGVzY2FwZV9odG1sKHR2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfc3RydWN0KCkgfHwgdHJ1ZXR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBmX291dF8gPDwgInsgIjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0cnVldHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB0dmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHJ1ZXR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiCisgICAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgPDwgIiA9ICI7CisgICAgICBwcmludF9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGZfb3V0XyA8PCAiIH0iOworICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19tYXAoKSkgeworICAgIGZfb3V0XyA8PCAieyAiOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG1hcF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+OjppdGVyYXRvciBtYXBfaXRlcjsKKyAgICBmb3IgKG1hcF9pdGVyID0gbWFwX2VsZW1zLmJlZ2luKCk7IG1hcF9pdGVyICE9IG1hcF9lbGVtcy5lbmQoKTsgbWFwX2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbWFwKil0cnVldHlwZSktPmdldF9rZXlfdHlwZSgpLCBtYXBfaXRlci0+Zmlyc3QpOworICAgICAgZl9vdXRfIDw8ICIgPSAiOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X21hcCopdHJ1ZXR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgbWFwX2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGZfb3V0XyA8PCAiIH0iOworICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19saXN0KCkpIHsKKyAgICBmX291dF8gPDwgInsgIjsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RfZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7CisgICAgOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpc3RfaXRlcjsKKyAgICBmb3IgKGxpc3RfaXRlciA9IGxpc3RfZWxlbXMuYmVnaW4oKTsgbGlzdF9pdGVyICE9IGxpc3RfZWxlbXMuZW5kKCk7IGxpc3RfaXRlcisrKSB7CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9saXN0Kil0cnVldHlwZSktPmdldF9lbGVtX3R5cGUoKSwgKmxpc3RfaXRlcik7CisgICAgfQorICAgIGZfb3V0XyA8PCAiIH0iOworICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19zZXQoKSkgeworICAgIGZfb3V0XyA8PCAieyAiOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICA7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOworICAgIGZvciAobGlzdF9pdGVyID0gbGlzdF9lbGVtcy5iZWdpbigpOyBsaXN0X2l0ZXIgIT0gbGlzdF9lbGVtcy5lbmQoKTsgbGlzdF9pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X3NldCopdHJ1ZXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICpsaXN0X2l0ZXIpOworICAgIH0KKyAgICBmX291dF8gPDwgIiB9IjsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgIlVOS05PV04gVFlQRSI7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgb3V0IGRvY3VtZW50YXRpb24gZm9yIGFyZ3VtZW50cy9leGNlcHRpb25zIG9mIGEgZnVuY3Rpb24sIGlmIGFueSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuCisgKiBzdXBwbGllZC4KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9mbl9hcmdzX2RvYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgYm9vbCBoYXNfZG9jcyA9IGZhbHNlOworICB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOworICBpZiAoYXJnX2l0ZXIgIT0gYXJncy5lbmQoKSkgeworICAgIGZvciAoOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7CisgICAgICBpZiAoKCphcmdfaXRlciktPmhhc19kb2MoKSAmJiAhKCphcmdfaXRlciktPmdldF9kb2MoKS5lbXB0eSgpKQorICAgICAgICBoYXNfZG9jcyA9IHRydWU7CisgICAgfQorICAgIGlmIChoYXNfZG9jcykgeworICAgICAgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7CisgICAgICBmX291dF8gPDwgIjxici8+PGg0IGlkPVwiUGFyYW1ldGVyc18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIj5QYXJhbWV0ZXJzPC9oND4iIDw8IGVuZGw7CisgICAgICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKKyAgICAgIGZfb3V0XyA8PCAiPHRoZWFkPjx0cj48dGg+TmFtZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PiI7CisgICAgICBmb3IgKDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgeworICAgICAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOworICAgICAgICBmX291dF8gPDwgZXNjYXBlX2h0bWwoKCphcmdfaXRlciktPmdldF9kb2MoKSk7CisgICAgICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCAiPC90Ym9keT48L3RhYmxlPiI7CisgICAgfQorICB9CisKKyAgaGFzX2RvY3MgPSBmYWxzZTsKKyAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgIGlmIChleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCkpIHsKKyAgICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICAgIGlmICgoKmV4X2l0ZXIpLT5oYXNfZG9jKCkgJiYgISgqZXhfaXRlciktPmdldF9kb2MoKS5lbXB0eSgpKQorICAgICAgICBoYXNfZG9jcyA9IHRydWU7CisgICAgfQorICAgIGlmIChoYXNfZG9jcykgeworICAgICAgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKKyAgICAgIGZfb3V0XyA8PCAiPGJyLz48aDQgaWQ9XCJFeGNlcHRpb25zXyIgPDwgc2VydmljZV9uYW1lXyA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiPkV4Y2VwdGlvbnM8L2g0PiIgPDwgZW5kbDsKKyAgICAgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOworICAgICAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRyPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+IjsKKyAgICAgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgICAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOworICAgICAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCgoKmV4X2l0ZXIpLT5nZXRfZG9jKCkpOworICAgICAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX291dF8gPDwgIjwvdGJvZHk+PC90YWJsZT4iOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgc3RyaW5nIG5hbWUgPSB0dHlwZWRlZi0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7CisgIGZfb3V0XyA8PCAiPGgzIGlkPVwiVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPlR5cGVkZWY6ICIgPDwgbmFtZSA8PCAiPC9oMz4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPHA+PHN0cm9uZz5CYXNlIHR5cGU6PC9zdHJvbmc+Jm5ic3A7IjsKKyAgcHJpbnRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSk7CisgIGZfb3V0XyA8PCAiPC9wPiIgPDwgZW5kbDsKKyAgcHJpbnRfZG9jKHR0eXBlZGVmKTsKKyAgZl9vdXRfIDw8ICI8L2Rpdj4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOworICBmX291dF8gPDwgIjxoMyBpZD1cIkVudW1fIiA8PCBuYW1lIDw8ICJcIj5FbnVtZXJhdGlvbjogIiA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKKyAgcHJpbnRfZG9jKHRlbnVtKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7CisgIGZfb3V0XyA8PCAiPGJyLz48dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiIgPDwgZW5kbDsKKyAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKKyAgICBmX291dF8gPDwgIjx0cj48dGQ+PGNvZGU+IjsKKyAgICBmX291dF8gPDwgKCp2YWxfaXRlciktPmdldF9uYW1lKCk7CisgICAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48dGQ+PGNvZGU+IjsKKyAgICBmX291dF8gPDwgKCp2YWxfaXRlciktPmdldF92YWx1ZSgpOworICAgIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PHRkPiIgPDwgZW5kbDsKKyAgICBwcmludF9kb2MoKCp2YWxfaXRlcikpOworICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKKyAgfQorICBmX291dF8gPDwgIjwvdGFibGU+PC9kaXY+IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICBmX291dF8gPDwgIjx0ciBpZD1cIkNvbnN0XyIgPDwgbmFtZSA8PCAiXCI+PHRkPjxjb2RlPiIgPDwgbmFtZSA8PCAiPC9jb2RlPjwvdGQ+PHRkPiI7CisgIHByaW50X3R5cGUodGNvbnN0LT5nZXRfdHlwZSgpKTsKKyAgZl9vdXRfIDw8ICI8L3RkPjx0ZD48Y29kZT4iOworICBwcmludF9jb25zdF92YWx1ZSh0Y29uc3QtPmdldF90eXBlKCksIHRjb25zdC0+Z2V0X3ZhbHVlKCkpOworICBmX291dF8gPDwgIjwvY29kZT48L3RkPjwvdHI+IjsKKyAgaWYgKHRjb25zdC0+aGFzX2RvYygpKSB7CisgICAgZl9vdXRfIDw8ICI8dHI+PHRkIGNvbHNwYW49XCIzXCI+PGJsb2NrcXVvdGU+IjsKKyAgICBwcmludF9kb2ModGNvbnN0KTsKKyAgICBmX291dF8gPDwgIjwvYmxvY2txdW90ZT48L3RkPjwvdHI+IjsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7CisgIGZfb3V0XyA8PCAiPGgzIGlkPVwiU3RydWN0XyIgPDwgbmFtZSA8PCAiXCI+IjsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBmX291dF8gPDwgIkV4Y2VwdGlvbjogIjsKKyAgfSBlbHNlIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJVbmlvbjogIjsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgIlN0cnVjdDogIjsKKyAgfQorICBmX291dF8gPDwgbmFtZSA8PCAiPC9oMz4iIDw8IGVuZGw7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKKyAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRyPjx0aD5LZXk8L3RoPjx0aD5GaWVsZDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PHRoPlJlcXVpcmVkbmVzczwvIgorICAgICAgICAgICAgInRoPjx0aD5EZWZhdWx0IHZhbHVlPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PiIgPDwgZW5kbDsKKyAgZm9yICg7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKm1lbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI8L3RkPjx0ZD4iOworICAgIGZfb3V0XyA8PCAoKm1lbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgcHJpbnRfdHlwZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOworICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCgoKm1lbV9pdGVyKS0+Z2V0X2RvYygpKTsKKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgaWYgKCgqbWVtX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgZl9vdXRfIDw8ICJvcHRpb25hbCI7CisgICAgfSBlbHNlIGlmICgoKm1lbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGZfb3V0XyA8PCAicmVxdWlyZWQiOworICAgIH0gZWxzZSB7CisgICAgICBmX291dF8gPDwgImRlZmF1bHQiOworICAgIH0KKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgdF9jb25zdF92YWx1ZSogZGVmYXVsdF92YWwgPSAoKm1lbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaWYgKGRlZmF1bHRfdmFsICE9IE5VTEwpIHsKKyAgICAgIGZfb3V0XyA8PCAiPGNvZGU+IjsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgqbWVtX2l0ZXIpLT5nZXRfdHlwZSgpLCBkZWZhdWx0X3ZhbCk7CisgICAgICBmX291dF8gPDwgIjwvY29kZT4iOworICAgIH0KKyAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7CisgIH0KKyAgZl9vdXRfIDw8ICI8L3Rib2R5PjwvdGFibGU+PGJyLz4iOworICBwcmludF9kb2ModHN0cnVjdCk7CisgIGZfb3V0XyA8PCAiPC9kaXY+IjsKK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzcGVjaWFsIHN0cnVjdHMKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3N0cnVjdCh0eGNlcHRpb24pOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgSFRNTCBibG9jayBmb3IgYSBUaHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBmX291dF8gPDwgIjxoMyBpZD1cIlN2Y18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlwiPlNlcnZpY2U6ICIgPDwgc2VydmljZV9uYW1lXyA8PCAiPC9oMz4iIDw8IGVuZGw7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZXh0ZW5kc1wiPjxlbT5leHRlbmRzPC9lbT4gIjsKKyAgICBwcmludF90eXBlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBmX291dF8gPDwgIjwvZGl2PlxuIjsKKyAgfQorICBwcmludF9kb2ModHNlcnZpY2UpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgZm9yICg7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyBmbl9pdGVyKyspIHsKKyAgICBzdHJpbmcgZm5fbmFtZSA9ICgqZm5faXRlciktPmdldF9uYW1lKCk7CisgICAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7CisgICAgZl9vdXRfIDw8ICI8aDQgaWQ9XCJGbl8iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl8iIDw8IGZuX25hbWUgPDwgIlwiPkZ1bmN0aW9uOiAiIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgPDwgIi4iIDw8IGZuX25hbWUgPDwgIjwvaDQ+IiA8PCBlbmRsOworICAgIGZfb3V0XyA8PCAiPHByZT4iOworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgb2Zmc2V0ID0gcHJpbnRfdHlwZSgoKmZuX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmX291dF8gPDwgIiAiIDw8IGZuX25hbWUgPDwgIigiOworICAgIG9mZnNldCArPSBmbl9uYW1lLnNpemUoKSArIDI7CisgICAgdmVjdG9yPHRfZmllbGQqPiBhcmdzID0gKCpmbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsKKyAgICBmb3IgKDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwiIDw8IGVuZGw7CisgICAgICAgIGZvciAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IG9mZnNldDsgKytpKSB7CisgICAgICAgICAgZl9vdXRfIDw8ICIgIjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHByaW50X3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCkpOworICAgICAgZl9vdXRfIDw8ICIgIiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICgoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICBmX291dF8gPDwgIiA9ICI7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgfQorICAgIH0KKyAgICBmX291dF8gPDwgIikiIDw8IGVuZGw7CisgICAgZmlyc3QgPSB0cnVlOworICAgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICAgIGlmIChleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAiICAgIHRocm93cyAiOworICAgICAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBwcmludF90eXBlKCgqZXhfaXRlciktPmdldF90eXBlKCkpOworICAgICAgfQorICAgICAgZl9vdXRfIDw8IGVuZGw7CisgICAgfQorICAgIGZfb3V0XyA8PCAiPC9wcmU+IjsKKyAgICBwcmludF9kb2MoKmZuX2l0ZXIpOworICAgIHByaW50X2ZuX2FyZ3NfZG9jKCpmbl9pdGVyKTsKKyAgICBmX291dF8gPDwgIjwvZGl2PiI7CisgIH0KK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBodG1sLAorICAgICJIVE1MIiwKKyAgICAiICAgIHN0YW5kYWxvbmU6ICAgICAgU2VsZi1jb250YWluZWQgbW9kZSwgaW5jbHVkZXMgYWxsIENTUyBpbiB0aGUgSFRNTCBmaWxlcy5cbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVzIG5vIHN0eWxlLmNzcyBmaWxlLCBidXQgSFRNTCBmaWxlcyB3aWxsIGJlIGxhcmdlci5cbiIKKyAgICAiICAgIG5vZXNjYXBlOiAgICAgICAgRG8gbm90IGVzY2FwZSBodG1sIGluIGRvYyB0ZXh0LlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaApyZW5hbWUgdG8gY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmIxZjFhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDU0NTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3RpbWU+CisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnNldGZpbGw7Cit1c2luZyBzdGQ6OnNldHc7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBKYXZhIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9qYXZhX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2phdmFfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgYmVhbl9zdHlsZV8gPSBmYWxzZTsKKyAgICBhbmRyb2lkX3N0eWxlXyA9IGZhbHNlOworICAgIHByaXZhdGVfbWVtYmVyc18gPSBmYWxzZTsKKyAgICBub2NhbWVsX3N0eWxlXyA9IGZhbHNlOworICAgIGZ1bGxjYW1lbF9zdHlsZV8gPSBmYWxzZTsKKyAgICBhbmRyb2lkX2xlZ2FjeV8gPSBmYWxzZTsKKyAgICBzb3J0ZWRfY29udGFpbmVyc18gPSBmYWxzZTsKKyAgICBqYXZhNV8gPSBmYWxzZTsKKyAgICByZXVzZV9vYmplY3RzXyA9IGZhbHNlOworICAgIHVzZV9vcHRpb25fdHlwZV8gPSBmYWxzZTsKKyAgICB1bmRhdGVkX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18gID0gZmFsc2U7CisgICAgc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyA9IGZhbHNlOworICAgIHJldGhyb3dfdW5oYW5kbGVkX2V4Y2VwdGlvbnNfID0gZmFsc2U7CisgICAgdW5zYWZlX2JpbmFyaWVzXyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImJlYW5zIikgPT0gMCkgeworICAgICAgICBiZWFuX3N0eWxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFuZHJvaWQiKSA9PSAwKSB7CisgICAgICAgIGFuZHJvaWRfc3R5bGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHJpdmF0ZS1tZW1iZXJzIikgPT0gMCkgeworICAgICAgICBwcml2YXRlX21lbWJlcnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9jYW1lbCIpID09IDApIHsKKyAgICAgICAgbm9jYW1lbF9zdHlsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJmdWxsY2FtZWwiKSA9PSAwKSB7CisgICAgICAgIGZ1bGxjYW1lbF9zdHlsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhbmRyb2lkX2xlZ2FjeSIpID09IDApIHsKKyAgICAgICAgYW5kcm9pZF9sZWdhY3lfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic29ydGVkX2NvbnRhaW5lcnMiKSA9PSAwKSB7CisgICAgICAgIHNvcnRlZF9jb250YWluZXJzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImphdmE1IikgPT0gMCkgeworICAgICAgICBqYXZhNV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJyZXVzZS1vYmplY3RzIikgPT0gMCkgeworICAgICAgICByZXVzZV9vYmplY3RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm9wdGlvbl90eXBlIikgPT0gMCkgeworICAgICAgICB1c2Vfb3B0aW9uX3R5cGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9ucyIpID09IDApIHsKKyAgICAgICAgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJnZW5lcmF0ZWRfYW5ub3RhdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGlmKCBpdGVyLT5zZWNvbmQuY29tcGFyZSgidW5kYXRlZCIpID09IDApIHsKKyAgICAgICAgICB1bmRhdGVkX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18gID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmKGl0ZXItPnNlY29uZC5jb21wYXJlKCJzdXBwcmVzcyIpID09IDApIHsKKyAgICAgICAgICBzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gamF2YToiICsgaXRlci0+Zmlyc3QgKyAiPSIgKyBpdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidW5zYWZlX2JpbmFyaWVzIikgPT0gMCkgeworICAgICAgICB1bnNhZmVfYmluYXJpZXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBqYXZhOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoamF2YTVfKSB7CisgICAgICBhbmRyb2lkX2xlZ2FjeV8gPSB0cnVlOworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAoYmVhbl9zdHlsZV8gPyAiZ2VuLWphdmFiZWFuIiA6ICJnZW4tamF2YSIpOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpIG92ZXJyaWRlOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIG92ZXJyaWRlOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSBvdmVycmlkZTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3BhcmNlbGFibGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXNfY2FtZWxfY2FzZShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVjZmlyc3QgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X3JwY19tZXRob2RfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4KTsKKyAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2lzX3NldF9tZXRob2RzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY2hlY2tfdHlwZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfc2NoZW1lX21hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9zdGFuZGFyZF9zY2hlbWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfc2NoZW1lKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3NjaGVtZV9sb29rdXAob3N0cmVhbSYgb3V0KTsKKworICB2b2lkIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKG9zdHJlYW0mIG91dCk7CisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvYmogPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2JqID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9iaiA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKworICBlbnVtIGlzc2V0X3R5cGUgeyBJU1NFVF9OT05FLCBJU1NFVF9QUklNSVRJVkUsIElTU0VUX0JJVFNFVCB9OworICBpc3NldF90eXBlIG5lZWRzX2lzc2V0KHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyogb3V0UHJpbWl0aXZlVHlwZSA9IE5VTEwpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBqYXZhX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV9zdXBwcmVzc2lvbnMoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dlbmVyaWMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VfbmFtZXNwYWNlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgY29tbWVudCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Jhc2VfbWV0aG9kID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOworICBzdGQ6OnN0cmluZyBhc3luY19hcmd1bWVudF9saXN0KHRfZnVuY3Rpb24qIHRmdW5jdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+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+ICc5JykpCisgICAgICAgICYmICgnXycgIT0gYykpIHsKKyAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0cjsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXNfY2FtZWxfY2FzZShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVjZmlyc3QpIHsKKyAgc3RkOjpzdHJpbmcgbmV3X25hbWU7CisgIHNpemVfdCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAobmFtZVtpXSAhPSAnXycpCisgICAgICBicmVhazsKKyAgfQorICBpZiAodWNmaXJzdCkgeworICAgIG5ld19uYW1lICs9IHRvdXBwZXIobmFtZVtpKytdKTsKKyAgfSBlbHNlIHsKKyAgICBuZXdfbmFtZSArPSB0b2xvd2VyKG5hbWVbaSsrXSk7CisgIH0KKyAgZm9yICg7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKG5hbWVbaV0gPT0gJ18nKSB7CisgICAgICBpZiAoaSA8IG5hbWUuc2l6ZSgpIC0gMSkgeworICAgICAgICBpKys7CisgICAgICAgIG5ld19uYW1lICs9IHRvdXBwZXIobmFtZVtpXSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG5ld19uYW1lICs9IG5hbWVbaV07CisgICAgfQorICB9CisgIHJldHVybiBuZXdfbmFtZTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X3JwY19tZXRob2RfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIGlmIChmdWxsY2FtZWxfc3R5bGVfKSB7CisgICAgcmV0dXJuIGFzX2NhbWVsX2Nhc2UobmFtZSwgZmFsc2UpOworICB9IGVsc2UgeworICAgIHJldHVybiBuYW1lOworICB9Cit9CisKKy8qKgorICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KKyAqIGFuZC9vciBmdWxsY2FtZWxfc3R5bGVfCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIGlmIChub2NhbWVsX3N0eWxlXykgeworICAgIHJldHVybiAiXyIgKyBuYW1lOworICB9IGVsc2UgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKKyAgICByZXR1cm4gYXNfY2FtZWxfY2FzZShuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOworICBmb3IgKGNoYXIgY2hhcmFjdGVyIDogbmFtZSkgeworICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgeworICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7CisgICAgfQorICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOworCisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOworICB9CisKKyAgcmV0dXJuIGNvbnN0YW50X25hbWU7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7CisKKyAgdF9jb250YWluZXIqIGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHlwZTsKKyAgc3RkOjpzdHJpbmcgc291cmNlX25hbWU7CisgIGlmIChzb3VyY2VfbmFtZV9wMiA9PSAiIikKKyAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOworICBlbHNlCisgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOworCisgIGJvb2wgY29weV9jb25zdHJ1Y3RfY29udGFpbmVyOworICBpZiAoY29udGFpbmVyLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKiljb250YWluZXI7CisgICAgY29weV9jb25zdHJ1Y3RfY29udGFpbmVyID0gdG1hcC0+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/IFNUQU5EQVJEX1NDSEVNRV9GQUNUT1JZICIKKyAgICAgIDw8ICI6IFRVUExFX1NDSEVNRV9GQUNUT1JZIgorICAgICAgPDwgIikuZ2V0U2NoZW1lKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZheF9nZW5lcmF0ZWRfYW5ub3RhdGlvbihvc3RyZWFtJiBvdXQpIHsKKyAgdGltZV90IHNlY29uZHMgPSB0aW1lKE5VTEwpOworICBzdHJ1Y3QgdG0qIG5vdyA9IGxvY2FsdGltZSgmc2Vjb25kcyk7CisgIGluZGVudChvdXQpIDw8ICJAamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQodmFsdWUgPSBcIiIgPDwgYXV0b2dlbl9zdW1tYXJ5KCkgPDwgIlwiIjsKKyAgaWYgKHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiLCBkYXRlID0gXCIiIDw8IChub3ctPnRtX3llYXIgKyAxOTAwKSA8PCAiLSIgPDwgc2V0ZmlsbCgnMCcpIDw8IHNldHcoMikKKyAgICAgICAgICAgICAgICA8PCAobm93LT50bV9tb24gKyAxKSA8PCAiLSIgPDwgc2V0ZmlsbCgnMCcpIDw8IHNldHcoMikgPDwgbm93LT50bV9tZGF5CisgICAgICAgICAgICAgICAgPDwgIlwiKSIgPDwgZW5kbDsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGphdmEsCisgICAgIkphdmEiLAorICAgICIgICAgYmVhbnM6ICAgICAgICAgICBNZW1iZXJzIHdpbGwgYmUgcHJpdmF0ZSwgYW5kIHNldHRlciBtZXRob2RzIHdpbGwgcmV0dXJuIHZvaWQuXG4iCisgICAgIiAgICBwcml2YXRlLW1lbWJlcnM6IE1lbWJlcnMgd2lsbCBiZSBwcml2YXRlLCBidXQgc2V0dGVyIG1ldGhvZHMgd2lsbCByZXR1cm4gJ3RoaXMnIGxpa2UgIgorICAgICJ1c3VhbC5cbiIKKyAgICAiICAgIG5vY2FtZWw6ICAgICAgICAgRG8gbm90IHVzZSBDYW1lbENhc2UgZmllbGQgYWNjZXNzb3JzIHdpdGggYmVhbnMuXG4iCisgICAgIiAgICBmdWxsY2FtZWw6ICAgICAgIENvbnZlcnQgdW5kZXJzY29yZWRfYWNjZXNzb3Jfb3Jfc2VydmljZV9uYW1lcyB0byBjYW1lbENhc2UuXG4iCisgICAgIiAgICBhbmRyb2lkOiAgICAgICAgIEdlbmVyYXRlZCBzdHJ1Y3R1cmVzIGFyZSBQYXJjZWxhYmxlLlxuIgorICAgICIgICAgYW5kcm9pZF9sZWdhY3k6ICBEbyBub3QgdXNlIGphdmEuaW8uSU9FeGNlcHRpb24odGhyb3dhYmxlKSAoYXZhaWxhYmxlIGZvciBBbmRyb2lkIDIuMyBhbmQgIgorICAgICJhYm92ZSkuXG4iCisgICAgIiAgICBvcHRpb25fdHlwZTogICAgIFdyYXAgb3B0aW9uYWwgZmllbGRzIGluIGFuIE9wdGlvbiB0eXBlLlxuIgorICAgICIgICAgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIHJldGhyb3cgb2YgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgYW5kIGxldCB0aGVtIHByb3BhZ2F0ZSBmdXRoZXIuIgorICAgICIgKERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2F0Y2ggYW5kIGxvZyBpdC4pXG4iCisgICAgIiAgICBqYXZhNTogICAgICAgICAgIEdlbmVyYXRlIEphdmEgMS41IGNvbXBsaWFudCBjb2RlIChpbmNsdWRlcyBhbmRyb2lkX2xlZ2FjeSBmbGFnKS5cbiIKKyAgICAiICAgIHJldXNlLW9iamVjdHM6ICAgRGF0YSBvYmplY3RzIHdpbGwgbm90IGJlIGFsbG9jYXRlZCwgYnV0IGV4aXN0aW5nIGluc3RhbmNlcyB3aWxsIGJlIHVzZWQgIgorICAgICIocmVhZCBhbmQgd3JpdGUpLlxuIgorICAgICIgICAgc29ydGVkX2NvbnRhaW5lcnM6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFVzZSBUcmVlU2V0L1RyZWVNYXAgaW5zdGVhZCBvZiBIYXNoU2V0L0hhc2hNYXAgYXMgYSBpbXBsZW1lbnRhdGlvbiBvZiAiCisgICAgInNldC9tYXAuXG4iCisgICAgIiAgICBnZW5lcmF0ZWRfYW5ub3RhdGlvbnM9W3VuZGF0ZWR8c3VwcHJlc3NdOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICB1bmRhdGVkOiBzdXBwcmVzcyB0aGUgZGF0ZSBhdCBAR2VuZXJhdGVkIGFubm90YXRpb25zXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzOiBzdXBwcmVzcyBAR2VuZXJhdGVkIGFubm90YXRpb25zIGVudGlyZWx5XG4iCisgICAgIiAgICB1bnNhZmVfYmluYXJpZXM6IERvIG5vdCBjb3B5IEJ5dGVCdWZmZXJzIGluIGNvbnN0cnVjdG9ycywgZ2V0dGVycywgYW5kIHNldHRlcnMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjk0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMjk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBKYXZhIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9qYXZhbWVfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfamF2YW1lX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClwYXJzZWRfb3B0aW9uczsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGphdmFtZToiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tamF2YW1lIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSBvdmVycmlkZTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfcHJpbWl0aXZlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY2hlY2tfdHlwZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIG92ZXJyaWRlOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSBvdmVycmlkZTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKSBvdmVycmlkZTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKworICBib29sIGhhc19iaXRfdmVjdG9yKHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgamF2YV9wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIGphdmFfdHlwZV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIGJveF90eXBlKHRfdHlwZSogdHlwZSwgc3RyaW5nIHZhbHVlKTsKKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+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+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBjb25zdGFudF9uYW1lOworCisgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7CisgIGZvciAoY2hhciBjaGFyYWN0ZXIgOiBuYW1lKSB7CisgICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7CisgICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKKyAgICB9CisgICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpc19maXJzdCA9IGZhbHNlOworICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7CisgIH0KKworICByZXR1cm4gY29uc3RhbnRfbmFtZTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpIHsKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbkBzZWUgIiArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpOworICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgcC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgIH0KKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworICB9Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSkgeworCisgIHRfY29udGFpbmVyKiBjb250YWluZXIgPSAodF9jb250YWluZXIqKXR5cGU7CisgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lOworICBpZiAoc291cmNlX25hbWVfcDIgPT0gIiIpCisgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMTsKKyAgZWxzZQorICAgIHNvdXJjZV9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiLiIgKyBzb3VyY2VfbmFtZV9wMjsKKworICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfbmFtZSA8PCAiID0gbmV3ICIKKyAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgc3RkOjpzdHJpbmcgaXRlcmF0b3JfZWxlbWVudF9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiX2VsZW1lbnQiOworICBzdGQ6OnN0cmluZyBlbnVtZXJhdGlvbl9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiX2VudW0iOworICBzdGQ6OnN0cmluZyByZXN1bHRfZWxlbWVudF9uYW1lID0gcmVzdWx0X25hbWUgKyAiX2NvcHkiOworCisgIGlmIChjb250YWluZXItPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiID0gIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmtleXMoKTsgIgorICAgICAgICAgICAgICAgIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgc291cmNlX25hbWUgPDwgIi5nZXQoIgorICAgICAgICAgICAgICAgIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX2tleSk7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJfdmFsdWUpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICB0X3R5cGUqIGVsZW1fdHlwZTsKKworICAgIGlmIChjb250YWluZXItPmlzX3NldCgpKSB7CisgICAgICBlbGVtX3R5cGUgPSAoKHRfc2V0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVsZW1fdHlwZSA9ICgodF9saXN0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIgPSAiIDw8IHNvdXJjZV9uYW1lCisgICAgICAgICAgICAgICAgPDwgIi5lbGVtZW50cygpOyAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOworICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkRWxlbWVudCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICIsICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGl0ZXJhdGl2ZSBjb3B5CisgICAgICBpZiAoZWxlbV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiB0ZW1wX2JpbmFyeV9lbGVtZW50ID0gIjsKKyAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wX2JpbmFyeV9lbGVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpZiAoZWxlbV90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZEVsZW1lbnQodGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KHRlbXBfYmluYXJ5X2VsZW1lbnQsIHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCI7CisgICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgLy8gYmluYXJ5IGZpZWxkcyBuZWVkIHRvIGJlIGNvcGllZCB3aXRoIFN5c3RlbS5hcnJheWNvcHkKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG91dCA8PCAibmV3IGJ5dGVbIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aF07IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIlN5c3RlbS5hcnJheWNvcHkoIiA8PCBzb3VyY2VfbmFtZSA8PCAiLCAwLCAiIDw8IGRlc3RfbmFtZSA8PCAiLCAwLCAiCisgICAgICAgICAgICAgICAgICA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aCkiOworICAgIH0KKyAgICAvLyBldmVyeXRoaW5nIGVsc2UgY2FuIGJlIGNvcGllZCBkaXJlY3RseQorICAgIGVsc2UKKyAgICAgIG91dCA8PCBzb3VyY2VfbmFtZTsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIm5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIikiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKKyAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjppc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gIl9fIiArIHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkgKyAiX2lzc2V0X2lkIik7Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcGFja2FnZSA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpICsgIi4iOworICB9CisgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiXCIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgIihzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorfQorCitib29sIHRfamF2YW1lX2dlbmVyYXRvcjo6aGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIGNsZWFyKCkgeyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbXVzdCBiZSBhIGJhc2UgdHlwZQorICAgICAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICAgIDw8ICIoZmFsc2UpOyIgPDwgZW5kbDsKKyAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDAuMDsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBwcmV2ZW50IGdjYyBjb21waWxlciB3YXJuaW5nCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGphdmFtZSwgIkphdmEgTUUiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0MDJhNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjc5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKy8vIGxhcmdlc3QgY29uc2VjdXRpdmUgaW50ZWdlciByZXByZXNlbnRhYmxlIGJ5IGEgZG91YmxlICgyIF4gNTMgLSAxKQorc3RhdGljIGNvbnN0IGludDY0X3QgbWF4X3NhZmVfaW50ZWdlciA9IDB4MWZmZmZmZmZmZmZmZmY7CisvLyBzbWFsbGVzdCBjb25zZWN1dGl2ZSBudW1iZXIgcmVwcmVzZW50YWJsZSBieSBhIGRvdWJsZSAoLTIgXiA1MyArIDEpCitzdGF0aWMgY29uc3QgaW50NjRfdCBtaW5fc2FmZV9pbnRlZ2VyID0gLW1heF9zYWZlX2ludGVnZXI7CisKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKKworLyoqCisgKiBKUyBjb2RlIGdlbmVyYXRvci4KKyAqLworY2xhc3MgdF9qc19nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9qc19nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGdlbl9ub2RlXyA9IGZhbHNlOworICAgIGdlbl9qcXVlcnlfID0gZmFsc2U7CisgICAgZ2VuX3RzXyA9IGZhbHNlOworICAgIGdlbl9lczZfID0gZmFsc2U7CisKKyAgICBib29sIHdpdGhfbnNfID0gZmFsc2U7CisKKyAgICBmb3IgKGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub2RlIikgPT0gMCkgeworICAgICAgICBnZW5fbm9kZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJqcXVlcnkiKSA9PSAwKSB7CisgICAgICAgIGdlbl9qcXVlcnlfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidHMiKSA9PSAwKSB7CisgICAgICAgIGdlbl90c18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ3aXRoX25zIikgPT0gMCkgeworICAgICAgICB3aXRoX25zXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImVzNiIpID09IDApIHsKKyAgICAgICAgZ2VuX2VzNl8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGpzOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2VuX2VzNl8gJiYgZ2VuX2pxdWVyeV8pIHsKKyAgICAgIHRocm93ICJJbnZhbGlkIHN3aXRjaDogWy1nZW4ganM6ZXM2LGpxdWVyeV0gb3B0aW9ucyBub3QgY29tcGF0aWJsZSI7CisgICAgfQorCisgICAgaWYgKGdlbl9ub2RlXyAmJiBnZW5fanF1ZXJ5XykgeworICAgICAgdGhyb3cgIkludmFsaWQgc3dpdGNoOiBbLWdlbiBqczpub2RlLGpxdWVyeV0gb3B0aW9ucyBub3QgY29tcGF0aWJsZSwgdHJ5OiBbLWdlbiBqczpub2RlIC1nZW4gIgorICAgICAgICAgICAgImpzOmpxdWVyeV0iOworICAgIH0KKworICAgIGlmICghZ2VuX25vZGVfICYmIHdpdGhfbnNfKSB7CisgICAgICB0aHJvdyAiSW52YWxpZCBzd2l0Y2g6IFstZ2VuIGpzOndpdGhfbnNdIGlzIG9ubHkgdmFsaWQgd2hlbiB1c2luZyBub2RlLmpzIjsKKyAgICB9CisKKyAgICAvLyBEZXBlbmRpbmcgb24gdGhlIHByb2Nlc3NpbmcgZmxhZ3MsIHdlIHdpbGwgdXBkYXRlIHRoZXNlIHRvIGJlIEVTNiBjb21wYXRpYmxlCisgICAganNfY29uc3RfdHlwZV8gPSAidmFyICI7CisgICAganNfbGV0X3R5cGVfID0gInZhciAiOworICAgIGpzX3Zhcl90eXBlXyA9ICJ2YXIgIjsKKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGpzX2NvbnN0X3R5cGVfID0gImNvbnN0ICI7CisgICAgICBqc19sZXRfdHlwZV8gPSAibGV0ICI7CisgICAgfQorCisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tbm9kZWpzIjsKKyAgICAgIG5vX25zXyA9ICF3aXRoX25zXzsKKyAgICB9IGVsc2UgeworICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tanMiOworICAgICAgbm9fbnNfID0gZmFsc2U7CisgICAgfQorCisgICAgZXNjYXBlX1snXCcnXSA9ICJcXCciOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpIG92ZXJyaWRlOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9yZWN2X3Rocm93KHN0ZDo6c3RyaW5nIHZhcik7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9yZWN2X3JldHVybihzdGQ6OnN0cmluZyB2YXIpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU3RydWN0cyEKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhwb3J0ZWQgPSB0cnVlKTsKKyAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcganNfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgdHNfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgdHNfc2VydmljZV9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX3RzX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgYm9vbCBvYmogPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV9jYWxsYmFjayA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfbm9kZUpzX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUpOworCisgIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIi8vXG4iKSArICIvLyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICAgKyAiLy9cbiIgKyAiLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgorICAgICAgICAgICArICIvL1xuIjsKKyAgfQorCisgIHRfdHlwZSogZ2V0X2NvbnRhaW5lZF90eXBlKHRfdHlwZSogdCk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGpzX25hbWVzcGFjZV9waWVjZXModF9wcm9ncmFtKiBwKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOworCisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBpZWNlczsKKworICAgIGlmIChub19uc18pIHsKKyAgICAgIHJldHVybiBwaWVjZXM7CisgICAgfQorCisgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBwaWVjZXMucHVzaF9iYWNrKG5zLnN1YnN0cigwLCBsb2MpKTsKKyAgICAgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgIHBpZWNlcy5wdXNoX2JhY2sobnMpOworICAgIH0KKworICAgIHJldHVybiBwaWVjZXM7CisgIH0KKworICBzdGQ6OnN0cmluZyBqc190eXBlX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBpZiAocCAhPSBOVUxMICYmIHAgIT0gcHJvZ3JhbV8pIHsKKyAgICAgICAgcmV0dXJuIG1ha2VfdmFsaWRfbm9kZUpzX2lkZW50aWZpZXIocC0+Z2V0X25hbWUoKSkgKyAiX3R0eXBlcy4iOworICAgICAgfQorICAgICAgcmV0dXJuICJ0dHlwZXMuIjsKKyAgICB9CisgICAgcmV0dXJuIGpzX25hbWVzcGFjZShwKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGpzX2V4cG9ydF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgcmV0dXJuICJleHBvcnRzLiI7CisgICAgfQorICAgIHJldHVybiBqc19uYW1lc3BhY2UocCk7CisgIH0KKworICBib29sIGhhc19qc19uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7CisgICAgaWYgKG5vX25zXykgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoImpzIik7CisgICAgcmV0dXJuIChucy5zaXplKCkgPiAwKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGpzX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKKyAgICBpZiAobm9fbnNfKSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgianMiKTsKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgbnMgKz0gIi4iOworICAgIH0KKworICAgIHJldHVybiBuczsKKyAgfQorCisgIC8qKgorICAgKiBUeXBlU2NyaXB0IERlZmluaXRpb24gRmlsZSBoZWxwZXIgZnVuY3Rpb25zCisgICAqLworCisgIHN0cmluZyB0c19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfY2FsbGJhY2spOworICBzdHJpbmcgdHNfZ2V0X3R5cGUodF90eXBlKiB0eXBlKTsKKworICAvKioKKyAgICogU3BlY2lhbCBpbmRlbnRhdGlvbiBmb3IgVHlwZVNjcmlwdCBEZWZpbml0aW9ucyBiZWNhdXNlIG9mIHRoZSBtb2R1bGUuCisgICAqIFJldHVybnMgdGhlIG5vcm1hbCBpbmRlbnRhdGlvbiArICIgICIgaWYgYSBtb2R1bGUgd2FzIGRlZmluZWQuCisgICAqIEByZXR1cm4gc3RyaW5nCisgICAqLworICBzdHJpbmcgdHNfaW5kZW50KCkgeyByZXR1cm4gaW5kZW50KCkgKyAoIXRzX21vZHVsZV8uZW1wdHkoKSA/ICIgICIgOiAiIik7IH0KKworICAvKioKKyAgICogUmV0dXJucyAiZGVjbGFyZSAiIGlmIG5vIG1vZHVsZSB3YXMgZGVmaW5lZC4KKyAgICogQHJldHVybiBzdHJpbmcKKyAgICovCisgIHN0cmluZyB0c19kZWNsYXJlKCkgeyByZXR1cm4gKHRzX21vZHVsZV8uZW1wdHkoKSA/IChnZW5fbm9kZV8gPyAiZGVjbGFyZSAiIDogImV4cG9ydCBkZWNsYXJlICIpIDogIiIpOyB9CisKKyAgLyoqCisgICAqIFJldHVybnMgIj8iIGlmIHRoZSBnaXZlbiBmaWVsZCBpcyBvcHRpb25hbCBvciBoYXMgYSBkZWZhdWx0IHZhbHVlLgorICAgKiBAcGFyYW0gdF9maWVsZCBUaGUgZmllbGQgdG8gY2hlY2sKKyAgICogQHJldHVybiBzdHJpbmcKKyAgICovCisgIHN0cmluZyB0c19nZXRfcmVxKHRfZmllbGQqIGZpZWxkKSB7cmV0dXJuIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwgPyAiPyIgOiAiIik7IH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgZG9jdW1lbnRhdGlvbiwgaWYgdGhlIHByb3ZpZGVkIGRvY3VtZW50YWJsZSBvYmplY3QgaGFzIG9uZS4KKyAgICogQHBhcmFtIHRfZG9jIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBkb2N1bWVudGF0aW9uIGZyb20KKyAgICogQHJldHVybiBzdHJpbmcgVGhlIGRvY3VtZW50YXRpb24KKyAgICovCisgIHN0cmluZyB0c19wcmludF9kb2ModF9kb2MqIHRkb2MpIHsKKyAgICBzdHJpbmcgcmVzdWx0ID0gZW5kbDsKKworICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGRvYyh0ZG9jLT5nZXRfZG9jKCkpOworICAgICAgc3RyaW5nIGl0ZW07CisKKyAgICAgIHJlc3VsdCArPSB0c19pbmRlbnQoKSArICIvKioiICsgZW5kbDsKKyAgICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoZG9jLCBpdGVtKSkgeworICAgICAgICByZXN1bHQgKz0gdHNfaW5kZW50KCkgKyAiICogIiArIGl0ZW0gKyBlbmRsOworICAgICAgfQorICAgICAgcmVzdWx0ICs9IHRzX2luZGVudCgpICsgIiAqLyIgKyBlbmRsOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBOb2RlSlMtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLgorICAgKi8KKyAgYm9vbCBnZW5fbm9kZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHNlcnZpY2VzIHRoYXQgdXNlIGpRdWVyeSBhamF4IChhc3luYy9zeW5jKS4KKyAgICovCisgIGJvb2wgZ2VuX2pxdWVyeV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGEgVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGUgZm9yIGVhY2ggc2VydmljZS4KKyAgICovCisgIGJvb2wgZ2VuX3RzXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgRVM2IGNvZGUsIGkuZS4gd2l0aCBQcm9taXNlcworICAgKi8KKyAgYm9vbCBnZW5fZXM2XzsKKworICAvKioKKyAgICogVGhlIG5hbWUgb2YgdGhlIGRlZmluZWQgbW9kdWxlKHMpLCBmb3IgVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGVzLgorICAgKi8KKyAgc3RyaW5nIHRzX21vZHVsZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIG5vdCBnZW5lcmF0ZSBuYW1lc3BhY2Ugb2JqZWN0cyBmb3Igbm9kZS4KKyAgICovCisgIGJvb2wgbm9fbnNfOworCisgIC8qKgorICAgKiBUaGUgdmFyaWFibGUgZGVjb3JhdG9yIGZvciAiY29uc3QiIHZhcmlhYmxlcy4gV2lsbCBkZWZhdWx0IHRvICJ2YXIiIGlmIGluIGFuIGluY29tcGF0aWJsZSBsYW5ndWFnZS4KKyAgICovCisgIHN0cmluZyBqc19jb25zdF90eXBlXzsKKworICAgLyoqCisgICAqIFRoZSB2YXJpYWJsZSBkZWNvcmF0b3IgZm9yICJsZXQiIHZhcmlhYmxlcy4gV2lsbCBkZWZhdWx0IHRvICJ2YXIiIGlmIGluIGFuIGluY29tcGF0aWJsZSBsYW5ndWFnZS4KKyAgICovCisgIHN0cmluZyBqc19sZXRfdHlwZV87CisKKyAgIC8qKgorICAgKiBUaGUgZGVmYXVsdCB2YXJpYWJsZSBkZWNvcmF0b3IuIFN1cHBvcnRzIGFsbCBqYXZhc2NyaXB0IGxhbmd1YWdlcywgYnV0IGlzIG5vdCBzY29wZWQgdG8gZnVuY3Rpb25zIG9yIGNsb3N1cmVzLgorICAgKi8KKyAgc3RyaW5nIGpzX3Zhcl90eXBlXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc190c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlX3RzXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlKHMpCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBvdXRkaXIgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfdHlwZXMuanMiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBpZiAoZ2VuX3RzXykgeworICAgIHN0cmluZyBmX3R5cGVzX3RzX25hbWUgPSBvdXRkaXIgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfdHlwZXMuZC50cyI7CisgICAgZl90eXBlc190c18ub3BlbihmX3R5cGVzX3RzX25hbWUuY19zdHIoKSk7CisgIH0KKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgaWYgKChnZW5fbm9kZV8gfHwgZ2VuX2VzNl8pICYmIG5vX25zXykgeworICAgIGZfdHlwZXNfIDw8ICJcInVzZSBzdHJpY3RcIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGpzX2luY2x1ZGVzKCkgPDwgZW5kbCA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgdHNfaW5jbHVkZXMoKSA8PCBlbmRsOworICB9CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGZfdHlwZXNfIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJ0dHlwZXMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9OyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBwbnM7CisKKyAgLy8gc2V0dXAgdGhlIG5hbWVzcGFjZQorICAvLyBUT0RPIHNob3VsZCB0aGUgbmFtZXNwYWNlIGp1c3QgYmUgaW4gdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIG5vZGU/CisgIHZlY3RvcjxzdHJpbmc+IG5zX3BpZWNlcyA9IGpzX25hbWVzcGFjZV9waWVjZXMocHJvZ3JhbV8pOworICBpZiAobnNfcGllY2VzLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5zX3BpZWNlcy5zaXplKCk7ICsraSkgeworICAgICAgcG5zICs9ICgoaSA9PSAwKSA/ICIiIDogIi4iKSArIG5zX3BpZWNlc1tpXTsKKyAgICAgIGZfdHlwZXNfIDw8ICJpZiAodHlwZW9mICIgPDwgcG5zIDw8ICIgPT09ICd1bmRlZmluZWQnKSB7IiA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgIiAgIiA8PCBwbnMgPDwgIiA9IHt9OyIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgIiIgPDwgImlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgeyIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8ICIgIG1vZHVsZS5leHBvcnRzLiIgPDwgcG5zIDw8ICIgPSAiIDw8IHBucyA8PCAiOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIHRzX21vZHVsZV8gPSBwbnM7CisgICAgICBmX3R5cGVzX3RzXyA8PCAiZGVjbGFyZSBtb2R1bGUgIiA8PCB0c19tb2R1bGVfIDw8ICIgeyI7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGpzIGltcG9ydHMKKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpqc19pbmNsdWRlcygpIHsKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHN0cmluZyByZXN1bHQgPSBqc19jb25zdF90eXBlXyArICJ0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTtcbiIKKyAgICAgICAgKyBqc19jb25zdF90eXBlXyArICJUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0O1xuIjsKKyAgICBpZiAoIWdlbl9lczZfKSB7CisgICAgICByZXN1bHQgKz0ganNfY29uc3RfdHlwZV8gKyAiUSA9IHRocmlmdC5RO1xuIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IGpzX2NvbnN0X3R5cGVfICsgIkludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpO1xuIjsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHN0cmluZyByZXN1bHQgPSAiaWYgKHR5cGVvZiBJbnQ2NCA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgIiArIGpzX2NvbnN0X3R5cGVfICsgIkludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpO1xufVxuIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdHMgaW1wb3J0cworICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2luY2x1ZGVzKCkgeworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgcmV0dXJuIHN0cmluZygKKyAgICAgICAgImltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTtcbiIKKyAgICAgICAgImltcG9ydCBUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0O1xuIgorICAgICAgICAiaW1wb3J0IFEgPSB0aHJpZnQuUTtcbiIKKyAgICAgICAgImltcG9ydCBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsiKTsKKyAgfQorICByZXR1cm4gc3RyaW5nKCJpbXBvcnQgSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7Iik7Cit9CisKKy8qKgorICogUHJpbnRzIHNlcnZpY2UgdHMgaW1wb3J0cworICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX3NlcnZpY2VfaW5jbHVkZXMoKSB7CisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICByZXR1cm4gc3RyaW5nKAorICAgICAgICAiaW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpO1xuIgorICAgICAgICAiaW1wb3J0IFRocmlmdCA9IHRocmlmdC5UaHJpZnQ7XG4iCisgICAgICAgICJpbXBvcnQgUSA9IHRocmlmdC5RO1xuIgorICAgICAgICAiaW1wb3J0IEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOyIpOworICB9CisgIHJldHVybiBzdHJpbmcoImltcG9ydCBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsiKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgICAgZm9yIChhdXRvIGluY2x1ZGUgOiBpbmNsdWRlcykgeworICAgICAgcmVzdWx0ICs9IGpzX2NvbnN0X3R5cGVfICsgbWFrZV92YWxpZF9ub2RlSnNfaWRlbnRpZmllcihpbmNsdWRlLT5nZXRfbmFtZSgpKSArICJfdHR5cGVzID0gcmVxdWlyZSgnLi8iICsgaW5jbHVkZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICsgIl90eXBlcycpO1xuIjsKKyAgICB9CisgICAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKKyAgICAgIHJlc3VsdCArPSAiXG4iOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl90c19pbmNsdWRlcygpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKworICBpZiAoIWdlbl9ub2RlXykgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChhdXRvIGluY2x1ZGUgOiBpbmNsdWRlcykgeworICAgIHJlc3VsdCArPSAiaW1wb3J0ICIgKyBtYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKGluY2x1ZGUtPmdldF9uYW1lKCkpICsgIl90dHlwZXMgPSByZXF1aXJlKCcuLyIgKyBpbmNsdWRlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICsgIl90eXBlcycpO1xuIjsKKyAgfQorICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgeworICAgIHJlc3VsdCArPSAiXG4iOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDbG9zZSB1cCAob3IgZG93bikgc29tZSBmaWxlei4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSB0eXBlcyBmaWxlKHMpCisKKyAgZl90eXBlc18uY2xvc2UoKTsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGlmICghdHNfbW9kdWxlXy5lbXB0eSgpKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCAifSI7CisgICAgfQorICAgIGZfdHlwZXNfdHNfLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEpTLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBTaW5jZSBkZWZpbmUgaXMgZXhwZW5zaXZlIHRvIGxvb2t1cAorICogaW4gSlMsIHdlIHVzZSBhIGdsb2JhbCBhcnJheSBmb3IgdGhpcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBmX3R5cGVzXyA8PCBqc190eXBlX25hbWVzcGFjZSh0ZW51bS0+Z2V0X3Byb2dyYW0oKSkgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiA9IHsiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBmX3R5cGVzX3RzXyA8PCB0c19wcmludF9kb2ModGVudW0pIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCAiZW51bSAiCisgICAgICAgICAgICAgICAgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0JiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIiwiIDw8IGVuZGw7CisgICAgICAvLyBhZGQgJ3ZhbHVlOiBrZXknIGluIGFkZGl0aW9uIHRvICdrZXk6IHZhbHVlJyBmb3IgVHlwZVNjcmlwdCBlbnVtcworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiciIDw8IHZhbHVlIDw8ICInIDogJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKKyAgICB9CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyA6ICIgPDwgdmFsdWU7CisgICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCkgLSAxKSB7CisgICAgICBmX3R5cGVzXyA8PCAiLCI7CisgICAgfQorICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIGZfdHlwZXNfIDw8ICJ9OyIgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfdHlwZXNfIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBuYW1lIDw8ICIgPSAiOworICBmX3R5cGVzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgdHNfcHJpbnRfZG9jKHRjb25zdCkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IG5hbWUgPDwgIjogIgorICAgICAgICAgICAgICAgIDw8IHRzX2dldF90eXBlKHR5cGUpIDw8ICI7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworCisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgIiciIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIiciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHsKKyAgICAgICAgaW50NjRfdCBjb25zdCYgaW50ZWdlcl92YWx1ZSA9IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICBpZiAoaW50ZWdlcl92YWx1ZSA8PSBtYXhfc2FmZV9pbnRlZ2VyICYmIGludGVnZXJfdmFsdWUgPj0gbWluX3NhZmVfaW50ZWdlcikgeworICAgICAgICAgIG91dCA8PCAibmV3IEludDY0KCIgPDwgaW50ZWdlcl92YWx1ZSA8PCAiKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJuZXcgSW50NjQoJyIgPDwgc3RkOjpoZXggPDwgaW50ZWdlcl92YWx1ZSA8PCBzdGQ6OmRlYyA8PCAiJykiOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICJuZXcgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoeyI7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmJlZ2luKCkpCisgICAgICAgIG91dCA8PCAiLCI7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA6ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgb3V0IDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaWYgKHZfaXRlciAhPSB2YWwuYmVnaW4oKSkKKyAgICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgICAgCisgICAgICBpZiAoa3R5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKWdldF90cnVlX3R5cGUoa3R5cGUpKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlwiIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfaW50ZWdlcigpIDw8ICJcIiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIH0KKworICAgICAgb3V0IDw8ICIgOiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgb3V0IDw8ICJbIjsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmJlZ2luKCkpCisgICAgICAgIG91dCA8PCAiLCI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICB9CisgICAgb3V0IDw8ICJdIjsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIE1ha2UgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2pzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfanNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogU3RydWN0cyBjYW4gYmUgbm9ybWFsIG9yIGV4Y2VwdGlvbnMuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKKy8qKgorICogUmV0dXJuIHR5cGUgb2YgY29udGFpbmVkIGVsZW1lbnRzIGZvciBhIGNvbnRhaW5lciB0eXBlLiBGb3IgbWFwcworICogdGhpcyBpcyB0eXBlIG9mIHZhbHVlIChrZXlzIGFyZSBhbHdheXMgc3RyaW5ncyBpbiBqcykKKyAqLwordF90eXBlKiB0X2pzX2dlbmVyYXRvcjo6Z2V0X2NvbnRhaW5lZF90eXBlKHRfdHlwZSogdCkgeworICB0X3R5cGUqIGV0eXBlOworICBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgZXR5cGUgPSAoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKTsKKyAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgIGV0eXBlID0gKCh0X3NldCopdCktPmdldF9lbGVtX3R5cGUoKTsKKyAgfSBlbHNlIHsKKyAgICBldHlwZSA9ICgodF9tYXAqKXQpLT5nZXRfdmFsX3R5cGUoKTsKKyAgfQorICByZXR1cm4gZXR5cGU7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIEpTCisgKiB3aGVyZSB0aGUgb2JqZWN0cyBhcmUgYWxsIGp1c3QgYXNzb2NpYXRpdmUgYXJyYXlzICh1bmxlc3Mgb2YgY291cnNlIHdlCisgKiBkZWNpZGUgdG8gc3RhcnQgdXNpbmcgb2JqZWN0cyBmb3IgdGhlbS4uLikKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhwb3J0ZWQpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgc3RyaW5nIHByZWZpeCA9IGhhc19qc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPyBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgOiBqc19jb25zdF90eXBlXzsKKyAgICBvdXQgPDwgcHJlZml4IDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKKyAgICAgIChpc19leHBvcnRlZCA/ICIgPSBtb2R1bGUuZXhwb3J0cy4iICsgdHN0cnVjdC0+Z2V0X25hbWUoKSA6ICIiKTsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl90eXBlc190c18gPDwgdHNfcHJpbnRfZG9jKHRzdHJ1Y3QpIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCAiY2xhc3MgIgorICAgICAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAoaXNfZXhjZXB0aW9uID8gIiBleHRlbmRzIFRocmlmdC5URXhjZXB0aW9uIiA6ICIiKQorICAgICAgICAgICAgICAgICAgPDwgIiB7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0c3RydWN0KSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgKGlzX2V4Y2VwdGlvbiA/ICIgZXh0ZW5kcyBUaHJpZnQuVEV4Y2VwdGlvbiIgOiAiIikKKyAgICAgICAgICAgICAgICAgIDw8ICIgeyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpZiAoZ2VuX25vZGVfICYmIGlzX2V4Y2VwdGlvbikgeworICAgICAgb3V0IDw8ICIgPSBjbGFzcyBleHRlbmRzIFRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiID0gY2xhc3MgeyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImNvbnN0cnVjdG9yKGFyZ3MpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIgPSBmdW5jdGlvbihhcmdzKSB7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gQ2FsbCBzdXBlcigpIG1ldGhvZCBvbiBpbmhlcml0ZWQgRXJyb3IgY2xhc3MKKyAgaWYgKGdlbl9ub2RlXyAmJiBpc19leGNlcHRpb24pIHsKKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdXBlcihhcmdzKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJUaHJpZnQuVEV4Y2VwdGlvbi5jYWxsKHRoaXMsIFwiIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLm5hbWUgPSBcIiIgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIG1lbWJlcnMgd2l0aCBhcmd1bWVudHMKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHN0cmluZyBkdmFsID0gZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgdHJ1ZSk7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAicHVibGljICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgIDw8IHRzX2dldF90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICAKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFYXJseSByZXR1cm5zIGZvciBleGNlcHRpb25zCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoYXJncyBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgIDw8IHQtPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAidGhpcy4iCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGFyZ3M7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IgorICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGFyZ3MpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfdHlwZXNfdHNfIDw8IGVuZGwgPDwgdHNfaW5kZW50KCkgPDwgImNvbnN0cnVjdG9yKGFyZ3M/OiB7ICI7CisgICAgfQorCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmIChhcmdzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IHVuZGVmaW5lZCAmJiBhcmdzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgICBpZiAodC0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgb3V0IDw8ICgiID0gbmV3ICIgKyBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSArIHQtPmdldF9uYW1lKCkgKworICAgICAgICAgICAgICAgICIoYXJncy4iKygqbV9pdGVyKS0+Z2V0X25hbWUoKSArIik7Iik7CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmICh0LT5pc19jb250YWluZXIoKSkgeworICAgICAgICB0X3R5cGUqIGV0eXBlID0gZ2V0X2NvbnRhaW5lZF90eXBlKHQpOworICAgICAgICBzdHJpbmcgY29weUZ1bmMgPSB0LT5pc19tYXAoKSA/ICJUaHJpZnQuY29weU1hcCIgOiAiVGhyaWZ0LmNvcHlMaXN0IjsKKyAgICAgICAgc3RyaW5nIHR5cGVfbGlzdCA9ICIiOworCisgICAgICAgIHdoaWxlIChldHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgICBpZiAodHlwZV9saXN0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgdHlwZV9saXN0ICs9ICIsICI7CisgICAgICAgICAgfQorICAgICAgICAgIHR5cGVfbGlzdCArPSBldHlwZS0+aXNfbWFwKCkgPyAiVGhyaWZ0LmNvcHlNYXAiIDogIlRocmlmdC5jb3B5TGlzdCI7CisgICAgICAgICAgZXR5cGUgPSBnZXRfY29udGFpbmVkX3R5cGUoZXR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICAgIGlmICh0eXBlX2xpc3QubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICB0eXBlX2xpc3QgKz0gIiwgIjsKKyAgICAgICAgICB9CisgICAgICAgICAgdHlwZV9saXN0ICs9IGpzX3R5cGVfbmFtZXNwYWNlKGV0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIGV0eXBlLT5nZXRfbmFtZSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGlmICh0eXBlX2xpc3QubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICB0eXBlX2xpc3QgKz0gIiwgIjsKKyAgICAgICAgICB9CisgICAgICAgICAgdHlwZV9saXN0ICs9ICJudWxsIjsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCAoIiA9ICIgKyBjb3B5RnVuYyArICIoYXJncy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsKKyAgICAgICAgICAgICAgICAiLCBbIiArIHR5cGVfbGlzdCArICJdKTsiKTsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiA9IGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpZiAoISgqbV9pdGVyKS0+Z2V0X3JlcSgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5VTktOT1dOLCAiCisgICAgICAgICAgICAgICAiJ1JlcXVpcmVkIGZpZWxkICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJyk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpZiAoZ2VuX3RzXykgeworICAgICAgICBmX3R5cGVzX3RzXyA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgdHNfZ2V0X3JlcSgqbV9pdGVyKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgIDw8IHRzX2dldF90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsgIjsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfdHlwZXNfdHNfIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gRG9uZSB3aXRoIGNvbnN0cnVjdG9yCisgIGluZGVudF9kb3duKCk7CisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghZ2VuX2VzNl8pIHsKKyAgICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgICBvdXQgPDwgIlRocmlmdC5pbmhlcml0cygiIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIiwgVGhyaWZ0LlRFeGNlcHRpb24pOyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnByb3RvdHlwZS5uYW1lID0gJyIKKyAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gaW5pdCBwcm90b3R5cGUgbWFudWFsbHkgaWYgd2UgYXJlbid0IHVzaW5nIGVzNgorICAgICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIucHJvdG90eXBlID0ge307IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgIH0KKworICBnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKworICAvLyBDbG9zZSBvdXQgdGhlIGNsYXNzIGRlZmluaXRpb24KKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifTsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlYWQoKSBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJlYWQgKGlucHV0KSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihpbnB1dCkgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCBqc19jb25zdF90eXBlXyA8PCAicmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJmdHlwZSA9IHJldC5mdHlwZTsiIDw8IGVuZGw7CisgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBqc19jb25zdF90eXBlXyA8PCAiZmlkID0gcmV0LmZpZDsiIDw8IGVuZGw7CisgIH0KKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiAoZnR5cGUgPT0gVGhyaWZ0LlR5cGUuU1RPUCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWQpIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnQob3V0KSA8PCAiICBpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoZmllbGRzLnNpemUoKSA9PSAxKSB7CisgICAgICAvLyBwc2V1ZG8gY2FzZSB0byBtYWtlIGpzbGludCBoYXBweQorICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgMDoiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBicmVhazsiIDw8IGVuZGw7CisgICAgfQorICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQpOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIndyaXRlIChvdXRwdXQpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihvdXRwdXQpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlU3RydWN0QmVnaW4oJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsICYmIHRoaXMuIgorICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gdW5kZWZpbmVkKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICAgICAgICAgIDw8ICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZVN0cnVjdEVuZCgpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGlmIChnZW5fZXM2XykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc2VydmljZV9uYW1lXyArICIuanMiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc2VydmljZV9uYW1lXyArICIuZC50cyI7CisgICAgZl9zZXJ2aWNlX3RzXy5vcGVuKGZfc2VydmljZV90c19uYW1lLmNfc3RyKCkpOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKworICBpZiAoKGdlbl9ub2RlXyB8fCBnZW5fZXM2XykgJiYgbm9fbnNfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiXCJ1c2Ugc3RyaWN0XCI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGpzX2luY2x1ZGVzKCkgPDwgZW5kbCA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICIuZC50c1wiIC8+IiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfdHNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgdHNfaW5jbHVkZXMoKSA8PCBlbmRsIDw8IHJlbmRlcl90c19pbmNsdWRlcygpIDw8IGVuZGw7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiaW1wb3J0IHR0eXBlcyA9IHJlcXVpcmUoJy4vIiArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl90eXBlcycpOyIgPDwgZW5kbDsKKyAgICAgIC8vIEdlbmVyYXRlIHR5cGUgYWxpYXNlcworICAgICAgLy8gZW51bQorICAgICAgdmVjdG9yPHRfZW51bSo+IGNvbnN0JiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgICAgIHZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgZV9pdGVyOworICAgICAgZm9yIChlX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZV9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqZV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCplX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBjb25zdAorICAgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdCYgY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKKyAgICAgIHZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBleGNlcHRpb24KKyAgICAgIHZlY3Rvcjx0X3N0cnVjdCo+IGNvbnN0JiBleGNlcHRpb25zID0gcHJvZ3JhbV8tPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IGV4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBzdHJ1Y3RzCisgICAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBjb25zdCYgc3RydWN0cyA9IHByb2dyYW1fLT5nZXRfc3RydWN0cygpOworICAgICAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgICAgIGZvciAoc19pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzX2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiaW1wb3J0ICIgPDwgKCpzX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0dHlwZXMuIgorICAgICAgICAgICAgICAgICAgPDwganNfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCAoKnNfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiaW1wb3J0IHsgIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiIH0gZnJvbSBcIi4vIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiX3R5cGVzXCI7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghdHNfbW9kdWxlXy5lbXB0eSgpKSB7CisgICAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImRlY2xhcmUgbW9kdWxlICIgPDwgdHNfbW9kdWxlXyA8PCAiIHsiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiZGVjbGFyZSBtb2R1bGUgXCIuLyIgPDwgcHJvZ3JhbV8tPmdldF9uYW1lKCkgPDwgIl90eXBlc1wiIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJtb2R1bGUgIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBqc19jb25zdF90eXBlXyA8PCAgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIiA9IHJlcXVpcmUoJy4vIgorICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiJyk7IiA8PCBlbmRsIDw8IGpzX2NvbnN0X3R5cGVfCisgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQgPSAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIuQ2xpZW50OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBqc19jb25zdF90eXBlXyA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yID0gIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLlByb2Nlc3NvcjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBqc19jb25zdF90eXBlXyA8PCAidHR5cGVzID0gcmVxdWlyZSgnLi8iICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzJyk7IiA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKKyAgfQorCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKyAgaWYgKGdlbl90c18pIHsKKyAgICBpZiAoIXRzX21vZHVsZV8uZW1wdHkoKSkgeworICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlX3RzXy5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBzdHJpbmcgcHJlZml4ID0gaGFzX2pzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPyBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDoganNfY29uc3RfdHlwZV87CisgICAgZl9zZXJ2aWNlXyA8PCBwcmVmaXggPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yID0gIiA8PCAiZXhwb3J0cy5Qcm9jZXNzb3IiOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IGVuZGwgPDwgImRlY2xhcmUgY2xhc3MgUHJvY2Vzc29yICI7CisgICAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAicHJpdmF0ZSBfaGFuZGxlcjogb2JqZWN0OyIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAiY29uc3RydWN0b3IoaGFuZGxlcjogb2JqZWN0KTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJwcm9jZXNzKGlucHV0OiB0aHJpZnQuVFByb3RvY29sLCBvdXRwdXQ6IHRocmlmdC5UUHJvdG9jb2wpOiB2b2lkOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgPSAiCisgICAgICAgICAgICAgPDwgImV4cG9ydHMuUHJvY2Vzc29yIjsKKyAgfQorCisgIGJvb2wgaXNfc3ViY2xhc3Nfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEw7CisKKyAgLy8gRVM2IENvbnN0cnVjdG9yCisgIGlmIChnZW5fZXM2XykgeworICAgIGlmIChpc19zdWJjbGFzc19zZXJ2aWNlKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyBleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyB7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNvbnN0cnVjdG9yKGhhbmRsZXIpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiID0gZnVuY3Rpb24oaGFuZGxlcikgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworICBpZiAoZ2VuX2VzNl8gJiYgaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic3VwZXIoaGFuZGxlcik7IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5faGFuZGxlciA9IGhhbmRsZXI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIC8vIERvbmUgd2l0aCBjb25zdHJ1Y3RvcgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEVTNSBzZXJ2aWNlIGluaGVyaXRhbmNlCisgIGlmICghZ2VuX2VzNl8gJiYgaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IsICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3Nvcik7IiA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3MgKGlucHV0LCBvdXRwdXQpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IucHJvdG90eXBlLnByb2Nlc3MgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyID0gaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJpZiAodGhpc1sncHJvY2Vzc18nICsgci5mbmFtZV0pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICByZXR1cm4gdGhpc1sncHJvY2Vzc18nICsgci5mbmFtZV0uY2FsbCh0aGlzLCByLnJzZXFpZCwgaW5wdXQsIG91dHB1dCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlucHV0LnNraXAoVGhyaWZ0LlR5cGUuU1RSVUNUKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICIgPDwganNfY29uc3RfdHlwZV8gPDwgInggPSBuZXcgIgorICAgICAgICAgICAgICAgICJUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV05fTUVUSE9ELCAiCisgICAgICAgICAgICAgICAgIidVbmtub3duIGZ1bmN0aW9uICcgKyByLmZuYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oci5mbmFtZSwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgci5yc2VxaWQpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICAvLyBDbG9zZSBvZmYgdGhlIHByb2Nlc3NvciBjbGFzcyBkZWZpbml0aW9uCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorICBpZiAoZ2VuX25vZGVfICYmIGdlbl90c18pIHsKKyAgICBmX3NlcnZpY2VfdHNfIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiIChzZXFpZCwgaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3Nvci5wcm90b3R5cGUucHJvY2Vzc18iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA9IGZ1bmN0aW9uKHNlcWlkLCBpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICB9CisgIGlmIChnZW5fdHNfKSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAicHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHNlcWlkOiBudW1iZXIsIGlucHV0OiB0aHJpZnQuVFByb3RvY29sLCBvdXRwdXQ6IHRocmlmdC5UUHJvdG9jb2wpOiB2b2lkOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0ganNfbmFtZXNwYWNlKHByb2dyYW1fKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGpzX25hbWVzcGFjZShwcm9ncmFtXykgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgKyAiX3Jlc3VsdCI7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJhcmdzLnJlYWQoaW5wdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvLyBQcm9taXNlIHN0eWxlIGludm9jYXRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAodGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICIubGVuZ3RoID09PSAiIDw8IGZpZWxkcy5zaXplKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQcm9taXNlLnJlc29sdmUodGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLmJpbmQodGhpcy5faGFuZGxlcikoIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHN0cmluZyBtYXliZUNvbW1hID0gKGZpZWxkcy5zaXplKCkgPiAwID8gIiwiIDogIiIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUS5mY2FsbCh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIuYmluZCh0aGlzLl9oYW5kbGVyKSIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgbWF5YmVDb21tYSA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIG1heWJlQ29tbWEgPSAoZl9pdGVyICE9IGZpZWxkcy5lbmQoKSAtIDEgPyAiLCIgOiAiIik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IG1heWJlQ29tbWEgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKSkudGhlbihyZXN1bHQgPT4geyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIikudGhlbihmdW5jdGlvbihyZXN1bHQpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicmVzdWx0X29iaiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIih7c3VjY2VzczogcmVzdWx0fSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAicmVzdWx0X29iai53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KS5jYXRjaChlcnIgPT4geyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19sZXRfdHlwZV8gPDwgInJlc3VsdDsiIDw8IGVuZGw7CisKKyAgYm9vbCBoYXNfZXhjZXB0aW9uID0gZmFsc2U7CisgIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGlmIChleGNlcHRpb25zKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7CisgICAgZm9yIChhdXRvIG1lbWJlciA6IG1lbWJlcnMpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGlmICghaGFzX2V4Y2VwdGlvbikgeworICAgICAgICAgIGhhc19leGNlcHRpb24gPSB0cnVlOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGVyciBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgfHwgZXJyIGluc3RhbmNlb2YgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChoYXNfZXhjZXB0aW9uKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIihlcnIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuVU5LTk9XTiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBlcnIubWVzc2FnZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiCisgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbDsKKworICBpZiAoaGFzX2V4Y2VwdGlvbikgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIC8vIEVuZCBwcm9taXNlIHN0eWxlIGludm9jYXRpb24KKworICAvLyBDYWxsYmFjayBzdHlsZSBpbnZvY2F0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOworICB9CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiKGVyciwgcmVzdWx0KSA9PiB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgImZ1bmN0aW9uIChlcnIsIHJlc3VsdCkgeyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2xldF90eXBlXyA8PCAicmVzdWx0X29iajsiIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoKGVyciA9PT0gbnVsbCB8fCB0eXBlb2YgZXJyID09PSAndW5kZWZpbmVkJykiOworICBpZiAoaGFzX2V4Y2VwdGlvbikgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICAgIGZvciAoYXV0byBtZW1iZXIgOiBtZW1iZXJzKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAodC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIgfHwgZXJyIGluc3RhbmNlb2YgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0LT5nZXRfbmFtZSgpOworICAgICAgfQorICAgIH0KKyAgfQorICBmX3NlcnZpY2VfIDw8ICIpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHRfb2JqID0gbmV3ICIgPDwgcmVzdWx0bmFtZQorICAgICAgICAgICAgIDw8ICIoKGVyciAhPT0gbnVsbCB8fCB0eXBlb2YgZXJyID09PSAndW5kZWZpbmVkJykgPyBlcnIgOiB7c3VjY2VzczogcmVzdWx0fSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHRfb2JqID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGVyci5tZXNzYWdlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIKKyAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHRfb2JqLndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAvLyBFbmQgY2FsbGJhY2sgc3R5bGUgaW52b2NhdGlvbgorCisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBEbyBub3QgZ2VuZXJhdGUgVFMgZGVmaW5pdGlvbnMgZm9yIGhlbHBlciBmdW5jdGlvbnMKKyAgYm9vbCBnZW5fdHNfdG1wID0gZ2VuX3RzXzsKKyAgZ2VuX3RzXyA9IGZhbHNlOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgIi8vSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHN0cmluZyBuYW1lID0gdHMtPmdldF9uYW1lKCk7CisgICAgdHMtPnNldF9uYW1lKHNlcnZpY2VfbmFtZV8gKyAiXyIgKyBuYW1lKTsKKyAgICBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9qc19mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKKyAgfQorCisgIGdlbl90c18gPSBnZW5fdHNfdG1wOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgICh2b2lkKXRzZXJ2aWNlOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIFJFU1QgaW50ZXJmYWNlCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgICh2b2lkKXRzZXJ2aWNlOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworCisgIGJvb2wgaXNfc3ViY2xhc3Nfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEw7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHN0cmluZyBwcmVmaXggPSBoYXNfanNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA/IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgOiBqc19jb25zdF90eXBlXzsKKyAgICBmX3NlcnZpY2VfIDw8IHByZWZpeCA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgPSAiIDw8ICJleHBvcnRzLkNsaWVudCI7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfcHJpbnRfZG9jKHRzZXJ2aWNlKSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudCAiOworICAgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiZXh0ZW5kcyAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV90c18gPDwgInsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICA8PCAiQ2xpZW50IjsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2ModHNlcnZpY2UpIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCAiY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgIjsKKyAgICAgIGlmIChpc19zdWJjbGFzc19zZXJ2aWNlKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImV4dGVuZHMgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50ICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJ7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIEVTNiBDb25zdHJ1Y3RvcgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpZiAoaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gY2xhc3MgZXh0ZW5kcyAiIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIkNsaWVudCB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyB7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNvbnN0cnVjdG9yKG91dHB1dCwgcENsYXNzKSB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNvbnN0cnVjdG9yKGlucHV0LCBvdXRwdXQpIHsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiA9IGZ1bmN0aW9uKG91dHB1dCwgcENsYXNzKSB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF91cCgpOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMub3V0cHV0ID0gb3V0cHV0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMucENsYXNzID0gcENsYXNzOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX3NlcWlkID0gMDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9yZXFzID0ge307IiA8PCBlbmRsOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJwcml2YXRlIG91dHB1dDogdGhyaWZ0LlRUcmFuc3BvcnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IHRzX2luZGVudCgpIDw8ICJwcml2YXRlIHBDbGFzczogdGhyaWZ0LlRQcm90b2NvbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgdHNfaW5kZW50KCkgPDwgInByaXZhdGUgX3NlcWlkOiBudW1iZXI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgdHNfaW5kZW50KCkgPDwgImNvbnN0cnVjdG9yKG91dHB1dDogdGhyaWZ0LlRUcmFuc3BvcnQsIHBDbGFzczogeyBuZXcodHJhbnM6IHRocmlmdC5UVHJhbnNwb3J0KTogdGhyaWZ0LlRQcm90b2NvbCB9KTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5pbnB1dCA9IGlucHV0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMub3V0cHV0ID0gKCFvdXRwdXQpID8gaW5wdXQgOiBvdXRwdXQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5zZXFpZCA9IDA7IiA8PCBlbmRsOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJvdXRwdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKSA8PCAic2VxaWQ6IG51bWJlcjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCB0c19pbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICA8PCAiY29uc3RydWN0b3IoaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sLCBvdXRwdXQ/OiBUaHJpZnQuVEpTT05Qcm90b2NvbCk7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgaWYgKGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50KTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGluaXQgcHJvdG90eXBlCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZSA9IHt9OyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyB1dGlscyBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZXFpZCAoKSB7IHJldHVybiB0aGlzLl9zZXFpZDsgfSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibmV3X3NlcWlkICgpIHsgcmV0dXJuIHRoaXMuX3NlcWlkICs9IDE7IH0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlLnNlcWlkID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zZXFpZDsgfTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zZXFpZCArPSAxOyB9OyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgYXJnbGlzdCA9IGFyZ3VtZW50X2xpc3QoYXJnX3N0cnVjdCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bm5hbWUgPDwgIiAoIiA8PCBhcmdsaXN0IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudC5wcm90b3R5cGUuIgorICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIiwgIWdlbl9lczZfKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgLy8gZnVuY3Rpb24gZGVmaW5pdGlvbiB3aXRob3V0IGNhbGxiYWNrCisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYygqZl9pdGVyKSA8PCB0c19pbmRlbnQoKSA8PCB0c19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8IGVuZGw7CisgICAgICBpZiAoIWdlbl9lczZfKSB7CisgICAgICAgIC8vIG92ZXJsb2FkIHdpdGggY2FsbGJhY2sKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2MoKmZfaXRlcikgPDwgdHNfaW5kZW50KCkgPDwgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBvdmVybG9hZCB3aXRoIGNhbGxiYWNrCisgICAgICAgIGZfc2VydmljZV90c18gPDwgdHNfcHJpbnRfZG9jKCpmX2l0ZXIpIDw8IHRzX2luZGVudCgpIDw8IHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGlmIChnZW5fZXM2XyAmJiBnZW5fbm9kZV8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5fc2VxaWQgPSB0aGlzLm5ld19zZXFpZCgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19jb25zdF90eXBlXyA8PCAic2VsZiA9IHRoaXM7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLl9yZXFzW3NlbGYuc2VxaWQoKV0gPSAoZXJyb3IsIHJlc3VsdCkgPT4geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZXJyb3IgPyByZWplY3QoZXJyb3IpIDogcmVzb2x2ZShyZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGdlbl9ub2RlXykgeyAvLyBOb2RlLmpzIG91dHB1dCAgICAgIC4vZ2VuLW5vZGVqcworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5fc2VxaWQgPSB0aGlzLm5ld19zZXFpZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgIl9kZWZlciA9IFEuZGVmZXIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXSA9IGZ1bmN0aW9uKGVycm9yLCByZXN1bHQpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGVycm9yKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl9kZWZlci5yZWplY3QoZXJyb3IpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl9kZWZlci5yZXNvbHZlKHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdCA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBfZGVmZXIucHJvbWlzZTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldID0gY2FsbGJhY2s7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChnZW5fZXM2XykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAic2VsZiA9IHRoaXM7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdAorICAgICAgICAgICAgICAgICA8PCAoYXJnbGlzdC5lbXB0eSgpID8gIiIgOiAiLCAiKSA8PCAiKGVycm9yLCByZXN1bHQpID0+IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGVycm9yID8gcmVqZWN0KGVycm9yKSA6IHJlc29sdmUocmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0pOyIgPDwgZW5kbDsKKworICAgIH0gZWxzZSBpZiAoZ2VuX2pxdWVyeV8pIHsgLy8galF1ZXJ5IG91dHB1dCAgICAgICAuL2dlbi1qcworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsOworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICJ0aGlzLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInBvc3REYXRhID0gdGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdAorICAgICAgICAgICAgICAgICA8PCAoYXJnbGlzdC5lbXB0eSgpID8gIiIgOiAiLCAiKSA8PCAidHJ1ZSk7IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIuanFSZXF1ZXN0KHRoaXMsIHBvc3REYXRhLCBhcmd1bWVudHMsIHRoaXMucmVjdl8iIDw8IGZ1bm5hbWUKKyAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7IC8vIFN0YW5kYXJkIEphdmFTY3JpcHQgLi9nZW4tanMKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QKKyAgICAgICAgICAgICAgICAgPDwgKGFyZ2xpc3QuZW1wdHkoKSA/ICIiIDogIiwgIikgPDwgImNhbGxiYWNrKTsgIiA8PCBlbmRsOworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICghY2FsbGJhY2spIHsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgIHJldHVybiAiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgInRoaXMucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFNlbmQgZnVuY3Rpb24KKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiICgiIDw8IGFyZ2xpc3QgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVTNiBqcyBzdGlsbCB1c2VzIGNhbGxiYWNrcyBoZXJlLiBTaG91bGQgcmVmYWN0b3IgdGhpcyB0byBwcm9taXNlIHN0eWxlIGxhdGVyLi4KKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiICgiIDw8IGFyZ3VtZW50X2xpc3QoYXJnX3N0cnVjdCwgdHJ1ZSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LnByb3RvdHlwZS5zZW5kXyIKKyAgICAgICAgICAgICAgICA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIsICFnZW5fbm9kZV8pIDw8ICIgeyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0ZDo6c3RyaW5nIG91dHB1dFZhcjsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJvdXRwdXQgPSBuZXcgdGhpcy5wQ2xhc3ModGhpcy5vdXRwdXQpOyIgPDwgZW5kbDsKKyAgICAgIG91dHB1dFZhciA9ICJvdXRwdXQiOworICAgIH0gZWxzZSB7CisgICAgICBvdXRwdXRWYXIgPSAidGhpcy5vdXRwdXQiOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0ganNfbmFtZXNwYWNlKHByb2dyYW1fKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl9hcmdzIjsKKworICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUaHJpZnQuTWVzc2FnZVR5cGUuT05FV0FZIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJUaHJpZnQuTWVzc2FnZVR5cGUuQ0FMTCI7CisgICAgLy8gQnVpbGQgYXJncworICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCl7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJwYXJhbXMgPSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgaWYgKGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKS0xKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIihwYXJhbXMpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIgd2l0aGluIHRyeS9jYXRjaAorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IG91dHB1dFZhciA8PCAiLndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiJywgIiA8PCBtZXNzYWdlVHlwZSA8PCAiLCB0aGlzLnNlcWlkKCkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBvdXRwdXRWYXIgPDwgIi53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgbWVzc2FnZVR5cGUgPDwgIiwgdGhpcy5zZXFpZCk7IiA8PCBlbmRsOworICAgIH0KKworCisgICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUoIiA8PCBvdXRwdXRWYXIgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IG91dHB1dFZhcgorICAgICAgICAgICAgICAgPDwgIi53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBpZigoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJjYWxsYmFjayA9IHRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXSB8fCBmdW5jdGlvbigpIHt9OyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVsZXRlIHRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXTsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrKG51bGwpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGdlbl9qcXVlcnlfKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaChjYWxsYmFjayk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmIChnZW5fZXM2XykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJzZWxmID0gdGhpczsiIDw8IGVuZGw7CisgICAgICAgIGlmKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCBudWxsKTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2soKTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2godHJ1ZSwgKCkgPT4geyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2xldF90eXBlXyA8PCAiZXJyb3IgPSBudWxsLCByZXN1bHQgPSBudWxsOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJlc3VsdCA9IHNlbGYucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChlKSB7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgZXJyb3IgPSBlOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrKGVycm9yLCByZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGNhbGxiYWNrKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaWYoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKHRydWUsIG51bGwpOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYWxsYmFjaygpOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJzZWxmID0gdGhpczsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2godHJ1ZSwgZnVuY3Rpb24oKSB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfbGV0X3R5cGVfIDw8ICJyZXN1bHQgPSBudWxsOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJlc3VsdCA9IHNlbGYucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChlKSB7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0ID0gZTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYWxsYmFjayhyZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgLy8gUmVzZXQgdGhlIHRyYW5zcG9ydCBhbmQgZGVsZXRlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgaWYgdGhlcmUgd2FzIGEgc2VyaWFsaXphdGlvbiBlcnJvcgorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoIChlKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlbGV0ZSB0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV07IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHR5cGVvZiAiIDw8IG91dHB1dFZhciA8PCAiLnJlc2V0ID09PSAnZnVuY3Rpb24nKSB7IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IG91dHB1dFZhciA8PCAiLnJlc2V0KCk7IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHR5cGVvZiAiIDw8IG91dHB1dFZhciA8PCAiLmdldFRyYW5zcG9ydCgpLnJlc2V0ID09PSAnZnVuY3Rpb24nKSB7IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IG91dHB1dFZhciA8PCAiLmdldFRyYW5zcG9ydCgpLnJlc2V0KCk7IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyb3cgZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIC8vIENsb3NlIHNlbmQgZnVuY3Rpb24KKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBSZWNlaXZlIGZ1bmN0aW9uCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0ganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgLy8gT3BlbiByZWNlaXZlIGZ1bmN0aW9uCisgICAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICAgIGlmIChnZW5fZXM2XykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIChpbnB1dCwgbXR5cGUsIHJzZXFpZCkgeyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUucmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgPSBmdW5jdGlvbihpbnB1dCxtdHlwZSxyc2VxaWQpIHsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChnZW5fZXM2XykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICgpIHsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUuIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICIgeyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgc3RkOjpzdHJpbmcgaW5wdXRWYXI7CisgICAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICAgIGlucHV0VmFyID0gImlucHV0IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlucHV0VmFyID0gInRoaXMuaW5wdXQiOworICAgICAgfQorCisgICAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgImNhbGxiYWNrID0gdGhpcy5fcmVxc1tyc2VxaWRdIHx8IGZ1bmN0aW9uKCkge307IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImRlbGV0ZSB0aGlzLl9yZXFzW3JzZXFpZF07IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicmV0ID0gdGhpcy5pbnB1dC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgIm10eXBlID0gcmV0Lm10eXBlOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAieCA9IG5ldyBUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ4LnJlYWQoIiA8PCBpbnB1dFZhciA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5wdXRWYXIgPDwgIi5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCByZW5kZXJfcmVjdl90aHJvdygieCIpIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInJlc3VsdC5yZWFkKCIgPDwgaW5wdXRWYXIgPDwgIik7IiA8PCBlbmRsOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGlucHV0VmFyIDw8ICIucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG51bGwgIT09IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCByZW5kZXJfcmVjdl90aHJvdygicmVzdWx0LiIgKyAoKnhfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG51bGwgIT09IHJlc3VsdC5zdWNjZXNzKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICIKKyAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfcmVjdl9yZXR1cm4oInJlc3VsdC5zdWNjZXNzIikgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9yZWN2X3Rocm93KCInIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdCciKQorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjYWxsYmFjayhudWxsKTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIHJlY2VpdmUgZnVuY3Rpb24KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBGaW5pc2ggY2xhc3MgZGVmaW5pdGlvbnMKKyAgaWYgKGdlbl90c18pIHsKKyAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCAifTsiIDw8IGVuZGw7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9yZWN2X3Rocm93KHN0ZDo6c3RyaW5nIHZhcikgeworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgcmV0dXJuICJyZXR1cm4gY2FsbGJhY2soIiArIHZhciArICIpOyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICJ0aHJvdyAiICsgdmFyICsgIjsiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfcmVjdl9yZXR1cm4oc3RkOjpzdHJpbmcgdmFyKSB7CisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICByZXR1cm4gInJldHVybiBjYWxsYmFjayhudWxsLCAiICsgdmFyICsgIik7IjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gInJldHVybiAiICsgdmFyICsgIjsiOworICB9Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKKyAgKHZvaWQpaW5jbGFzczsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlucHV0LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgKHR5cGUtPmlzX2JpbmFyeSgpID8gInJlYWRCaW5hcnkoKSIgOiAicmVhZFN0cmluZygpIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNigpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgIH0KKworICAgIGlmICghZ2VuX25vZGVfKSB7CisgICAgICBvdXQgPDwgIi52YWx1ZSI7CisgICAgfQorCisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKKyAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQorICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKKyAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaW5wdXQpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKKyAgc3RyaW5nIHJ0bXAzID0gdG1wKCJfcnRtcDMiKTsKKworICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0ge307IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHJ0bXAzIDw8ICIgPSBpbnB1dC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHNpemUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5zaXplIHx8IDA7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBzaXplIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIuc2l6ZSB8fCAwOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IFtdOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBzaXplIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIuc2l6ZSB8fCAwOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwganNfbGV0X3R5cGVfIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBzaXplIDw8ICI7ICsrIiA8PCBpIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGlmICghZ2VuX25vZGVfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGkgPDwgIiA+IDAgKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgaWYgKGlucHV0LnJzdGFjay5sZW5ndGggPiBpbnB1dC5ycG9zW2lucHV0LnJwb3MubGVuZ3RoIC0xXSArIDEpIHsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIGlucHV0LnJzdGFjay5wb3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgia2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoInZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5LCBmYWxzZSwgZmFsc2UpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCBmYWxzZSwgZmFsc2UpIDw8ICI7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBqc19sZXRfdHlwZV8gPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1c2goIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBqc19sZXRfdHlwZV8gPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1c2goIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAgIC8vIEhhY2sgZm9yIHdoZW4gcHJlZml4IGlzIGRlZmluZWQgKGFsd2F5cyBhIGhhc2ggcmVmKQorICAgIGlmICghcHJlZml4LmVtcHR5KCkpCisgICAgICBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICh0eXBlLT5pc19iaW5hcnkoKSA/ICJ3cml0ZUJpbmFyeSgiIDogIndyaXRlU3RyaW5nKCIpIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKUyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICB9CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworCisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi53cml0ZShvdXRwdXQpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlTWFwQmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgIlRocmlmdC5vYmplY3RMZW5ndGgoIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCBwcmVmaXggPDwgIi5sZW5ndGgpOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOworICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IGpzX2xldF90eXBlXyA8PCBraXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLmhhc093blByb3BlcnR5KCIgPDwga2l0ZXIgPDwgIikpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwganNfbGV0X3R5cGVfIDw8IHZpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiWyIgPDwga2l0ZXIgPDwgIl07IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBqc19sZXRfdHlwZV8gPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLmhhc093blByb3BlcnR5KCIgPDwgaXRlciA8PCAiKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCBpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiWyIgPDwgaXRlciA8PCAiXTsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwganNfbGV0X3R5cGVfIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIi5oYXNPd25Qcm9wZXJ0eSgiIDw8IGl0ZXIgPDwgIikpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGl0ZXIgPDwgIl07IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgb2JqKSB7CisgIHN0cmluZyByZXN1bHQgPSAidGhpcy4iICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICghb2JqKSB7CisgICAgcmVzdWx0ID0ganNfbGV0X3R5cGVfICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKUyBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGlmIChvYmopIHsKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIGpzX3R5cGVfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICIoKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX2NhbGxiYWNrKSB7CisKKyAgc3RyaW5nIHN0cjsKKworICBzdHIgPSBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiID0gZnVuY3Rpb24oIjsKKworICBzdHIgKz0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksIGluY2x1ZGVfY2FsbGJhY2spOworCisgIHN0ciArPSAiKSI7CisgIHJldHVybiBzdHI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfY2FsbGJhY2spIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmIChpbmNsdWRlX2NhbGxiYWNrKSB7CisgICAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAiY2FsbGJhY2siOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdC5UeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRocmlmdC5UeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIGEgdF90eXBlIHRvIGEgVHlwZVNjcmlwdCB0eXBlIChzdHJpbmcpLgorICogQHBhcmFtIHRfdHlwZSBUeXBlIHRvIGNvbnZlcnQgdG8gVHlwZVNjcmlwdAorICogQHJldHVybiBTdHJpbmcgVHlwZVNjcmlwdCB0eXBlCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6dHNfZ2V0X3R5cGUodF90eXBlKiB0eXBlKSB7CisgIHN0ZDo6c3RyaW5nIHRzX3R5cGU7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHRzX3R5cGUgPSAic3RyaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHRzX3R5cGUgPSAiYm9vbGVhbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgdHNfdHlwZSA9ICJhbnkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICB0c190eXBlID0gIm51bWJlciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHRzX3R5cGUgPSAiSW50NjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdHNfdHlwZSA9ICJ2b2lkIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBzdGQ6OnN0cmluZyB0eXBlX25hbWU7CisgICAgaWYgKHR5cGUtPmdldF9wcm9ncmFtKCkpIHsKKyAgICAgIHR5cGVfbmFtZSA9IGpzX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKTsKKyAgICB9CisgICAgdHlwZV9uYW1lLmFwcGVuZCh0eXBlLT5nZXRfbmFtZSgpKTsKKyAgICB0c190eXBlID0gdHlwZV9uYW1lOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgdHNfdHlwZSA9IHRzX2dldF90eXBlKGV0eXBlKSArICJbXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga3R5cGUgPSB0c19nZXRfdHlwZSgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCkpOworICAgIHN0cmluZyB2dHlwZSA9IHRzX2dldF90eXBlKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisKKworICAgIGlmIChrdHlwZSA9PSAibnVtYmVyIiB8fCBrdHlwZSA9PSAic3RyaW5nIiApIHsKKyAgICAgIHRzX3R5cGUgPSAieyBbazogIiArIGt0eXBlICsgIl06ICIgKyB2dHlwZSArICI7IH0iOworICAgIH0gZWxzZSBpZiAoKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgICAgLy8gTm90IHlldCBzdXBwb3J0ZWQgKGVudW0gbWFwKTogaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L3B1bGwvMjY1MgorICAgICAgLy90c190eXBlID0gInsgW2s6ICIgKyBrdHlwZSArICJdOiAiICsgdnR5cGUgKyAiOyB9IjsKKyAgICAgIHRzX3R5cGUgPSAieyBbazogbnVtYmVyIC8qIiArIGt0eXBlICsgIiovXTogIiArIHZ0eXBlICsgIjsgfSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHRzX3R5cGUgPSAiYW55IjsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHNfdHlwZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgVHlwZVNjcmlwdCBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ25hbWUoYXJnczogdHlwZXMpOiB0eXBlOycKKyAqCisgKiBAcGFyYW0gdF9mdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcGFyYW0gYm9vbCBpbi0vZXhjbHVkZSB0aGUgY2FsbGJhY2sgYXJndW1lbnQKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9jYWxsYmFjaykgeworICBzdHJpbmcgc3RyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzdHIgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHIgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgdHNfZ2V0X3JlcSgqZl9pdGVyKSArICI6ICIgKyB0c19nZXRfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworCisgICAgaWYgKGZfaXRlciArIDEgIT0gZmllbGRzLmVuZCgpIHx8IChpbmNsdWRlX2NhbGxiYWNrICYmIGZpZWxkcy5zaXplKCkgPiAwKSkgeworICAgICAgc3RyICs9ICIsICI7CisgICAgfQorICB9CisKKyAgaWYgKGluY2x1ZGVfY2FsbGJhY2spIHsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgc3RyaW5nIGV4Y2VwdGlvbl90eXBlczsKKyAgICAgIGlmIChleGNlcHRpb25zKSB7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICAgICAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVtYmVycy5iZWdpbigpOyBpdCAhPSBtZW1iZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKml0KS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgaWYgKGl0ID09IG1lbWJlcnMuYmVnaW4oKSkgeworICAgICAgICAgICAgZXhjZXB0aW9uX3R5cGVzID0ganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkgKyB0LT5nZXRfbmFtZSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBleGNlcHRpb25fdHlwZXMgKz0gIiB8ICIgKyBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSArIHQtPmdldF9uYW1lKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZXhjZXB0aW9uX3R5cGVzID09ICIiKSB7CisgICAgICAgIHN0ciArPSAiY2FsbGJhY2s/OiAoZXJyb3I6IHZvaWQsIHJlc3BvbnNlOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICIpPT52b2lkKTogIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ciArPSAiY2FsbGJhY2s/OiAoZXJyb3I6ICIgKyBleGNlcHRpb25fdHlwZXMgKyAiLCByZXNwb25zZTogIiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiKT0+dm9pZCk6ICI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ciArPSAiY2FsbGJhY2s/OiAoZGF0YTogIiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiKT0+dm9pZCk6ICI7CisgICAgfQorCisgICAgaWYgKGdlbl9qcXVlcnlfKSB7CisgICAgICBzdHIgKz0gIkpRdWVyeVByb21pc2U8IiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyI+OyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ciArPSAidm9pZDsiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIHN0ciArPSAiKTogUHJvbWlzZTwiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI+OyI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc3RyICs9ICIpOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI7IjsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCisvKioKKyAqIFRha2VzIGEgbmFtZSBhbmQgcHJvZHVjZXMgYSB2YWxpZCBOb2RlSlMgaWRlbnRpZmllciBmcm9tIGl0CisgKgorICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgd2hpY2ggc2hhbGwgYmVjb21lIGEgdmFsaWQgTm9kZUpTIGlkZW50aWZpZXIKKyAqIEByZXR1cm4gVGhlIG1vZGlmaWVkIG5hbWUgd2l0aCB0aGUgdXBkYXRlZCBpZGVudGlmaWVyCisgKi8KK3N0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHN0ciA9IG5hbWU7CisgIGlmIChzdHIuZW1wdHkoKSkgeworICAgIHJldHVybiBzdHI7CisgIH0KKworICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKKyAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgIGNoYXIgYyA9IHN0ci5hdCgwKTsKKyAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgeworICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgfQorCisgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgeworICAgIGMgPSBzdHIuYXQoaSk7CisgICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCisgICAgICAgICYmICgnXycgIT0gYykgJiYgKCckJyAhPSBjKSkgeworICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSmF2YXNjcmlwdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAganF1ZXJ5OiAgICAgICAgICBHZW5lcmF0ZSBqUXVlcnkgY29tcGF0aWJsZSBjb2RlLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIG5vZGU6ICAgICAgICAgICAgR2VuZXJhdGUgbm9kZS5qcyBjb21wYXRpYmxlIGNvZGUuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdHM6ICAgICAgICAgICAgICBHZW5lcmF0ZSBUeXBlU2NyaXB0IGRlZmluaXRpb24gZmlsZXMuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgd2l0aF9uczogICAgICAgICBDcmVhdGUgZ2xvYmFsIG5hbWVzcGFjZSBvYmplY3RzIHdoZW4gdXNpbmcgbm9kZS5qc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGVzNjogICAgICAgICAgICAgQ3JlYXRlIEVTNiBjb2RlIHdpdGggUHJvbWlzZXNcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjRlZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDc5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzdGFjazsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsKK3N0YXRpYyBjb25zdCBzdHJpbmcgcXVvdCA9ICJcIiI7CitzdGF0aWMgY29uc3QgYm9vbCBOT19JTkRFTlQgPSBmYWxzZTsKK3N0YXRpYyBjb25zdCBib29sIEZPUkNFX1NUUklORyA9IHRydWU7CisKK2NsYXNzIHRfanNvbl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2pzb25fZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibWVyZ2UiKSA9PSAwKSB7CisgICAgICAgIHNob3VsZF9tZXJnZV9pbmNsdWRlc18gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGpzb246IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWpzb24iOworICB9CisKKyAgfnRfanNvbl9nZW5lcmF0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgLyoqCisgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgYm9vbCBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9qc29uXzsKKyAgc3RkOjpzdGFjazxib29sPiBjb21tYV9uZWVkZWRfOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJpbmcgbnVtYmVyX3RvX3N0cmluZyhUIHQpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICAgIG91dC5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKKyAgICBvdXQucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0czEwKTsKKyAgICBvdXQgPDwgdDsKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgd3JpdGVfbnVtYmVyKFQgbikgeworICAgIGZfanNvbl8gPDwgbnVtYmVyX3RvX3N0cmluZyhuKTsKKyAgfQorCisgIHN0cmluZyBnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdHJpbmcgZ2V0X3F1YWxpZmllZF9uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIHZvaWQgc3RhcnRfb2JqZWN0KGJvb2wgc2hvdWxkX2luZGVudCA9IHRydWUpOworICB2b2lkIHN0YXJ0X2FycmF5KCk7CisgIHZvaWQgZW5kX29iamVjdCgpOworICB2b2lkIGVuZF9hcnJheSgpOworICB2b2lkIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICB2b2lkIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICBzdHJpbmcgZXNjYXBlX2pzb25fc3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQpOworICBzdHJpbmcganNvbl9zdHIoY29uc3Qgc3RyaW5nJiBzdHIpOworICB2b2lkIG1lcmdlX2luY2x1ZGVzKHRfcHJvZ3JhbSopOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKTsKKworICB2b2lkIHdyaXRlX3R5cGVfc3BlY19lbnRyeShjb25zdCBjaGFyKiBuYW1lLCB0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpOworICB2b2lkIHdyaXRlX3R5cGVfc3BlYyh0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCB3cml0ZV9zdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgd3JpdGVfdmFsdWUodF90eXBlKiB0dmFsdWUpOworICB2b2lkIHdyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGZvcmNlX3N0cmluZyA9IGZhbHNlKTsKKyAgdm9pZCB3cml0ZV9rZXlfYW5kKHN0cmluZyBrZXkpOworICB2b2lkIHdyaXRlX2tleV9hbmRfc3RyaW5nKHN0cmluZyBrZXksIHN0cmluZyB2YWwpOworICB2b2lkIHdyaXRlX2tleV9hbmRfaW50ZWdlcihzdHJpbmcga2V5LCBpbnQgdmFsKTsKKyAgdm9pZCB3cml0ZV9rZXlfYW5kX2Jvb2woc3RyaW5nIGtleSwgYm9vbCB2YWwpOworfTsKKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9qc29uX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmpzb24iOworICBmX2pzb25fLm9wZW4oZl9qc29uX25hbWUuY19zdHIoKSk7CisKKyAgLy8gTWVyZ2UgYWxsIGluY2x1ZGVkIHByb2dyYW1zIGludG8gdGhpcyBvbmUgc28gd2UgY2FuIG91dHB1dCBvbmUgYmlnIGZpbGUuCisgIGlmIChzaG91bGRfbWVyZ2VfaW5jbHVkZXNfKSB7CisgICAgbWVyZ2VfaW5jbHVkZXMocHJvZ3JhbV8pOworICB9Cit9CisKK3N0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjplc2NhcGVfanNvbl9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgIGZvciAoY2hhciBpdGVyIDogaW5wdXQpIHsKKyAgICBzd2l0Y2ggKGl0ZXIpIHsKKyAgICBjYXNlICdcXCc6CisgICAgICBzcyA8PCAiXFxcXCI7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIHNzIDw8ICJcXFwiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJy8nOgorICAgICAgc3MgPDwgIlxcLyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcYic6CisgICAgICBzcyA8PCAiXFxiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1xmJzoKKyAgICAgIHNzIDw8ICJcXGYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXG4nOgorICAgICAgc3MgPDwgIlxcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdccic6CisgICAgICBzcyA8PCAiXFxyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1x0JzoKKyAgICAgIHNzIDw8ICJcXHQiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNzIDw8IGl0ZXI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OnN0YXJ0X29iamVjdChib29sIHNob3VsZF9pbmRlbnQpIHsKKyAgZl9qc29uXyA8PCAoc2hvdWxkX2luZGVudCA/IGluZGVudCgpIDogIiIpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgY29tbWFfbmVlZGVkXy5wdXNoKGZhbHNlKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpzdGFydF9hcnJheSgpIHsKKyAgZl9qc29uXyA8PCAiWyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGNvbW1hX25lZWRlZF8ucHVzaChmYWxzZSk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfY29tbWFfaWZfbmVlZGVkKCkgeworICBpZiAoY29tbWFfbmVlZGVkXy50b3AoKSkgeworICAgIGZfanNvbl8gPDwgIiwiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjppbmRpY2F0ZV9jb21tYV9uZWVkZWQoKSB7CisgIGNvbW1hX25lZWRlZF8ucG9wKCk7CisgIGNvbW1hX25lZWRlZF8ucHVzaCh0cnVlKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9rZXlfYW5kKHN0cmluZyBrZXkpIHsKKyAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgIGluZGVudChmX2pzb25fKSA8PCBqc29uX3N0cihrZXkpIDw8ICI6ICI7CisgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleV9hbmRfaW50ZWdlcihzdHJpbmcga2V5LCBpbnQgdmFsKSB7CisgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICBpbmRlbnQoZl9qc29uXykgPDwganNvbl9zdHIoa2V5KSA8PCAiOiAiIDw8IG51bWJlcl90b19zdHJpbmcodmFsKTsKKyAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2FuZF9zdHJpbmcoc3RyaW5nIGtleSwgc3RyaW5nIHZhbCkgeworICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgaW5kZW50KGZfanNvbl8pIDw8IGpzb25fc3RyKGtleSkgPDwgIjogIiA8PCBqc29uX3N0cih2YWwpOworICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9rZXlfYW5kX2Jvb2woc3RyaW5nIGtleSwgYm9vbCB2YWwpIHsKKyAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgIGluZGVudChmX2pzb25fKSA8PCBqc29uX3N0cihrZXkpIDw8ICI6ICIgPDwgKHZhbCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjplbmRfb2JqZWN0KCkgeworICBpbmRlbnRfZG93bigpOworICBmX2pzb25fIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iOworICBjb21tYV9uZWVkZWRfLnBvcCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmVuZF9hcnJheSgpIHsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaWYgKGNvbW1hX25lZWRlZF8udG9wKCkpIHsKKyAgICBmX2pzb25fIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfanNvbl8pIDw8ICJdIjsKKyAgY29tbWFfbmVlZGVkXy5wb3AoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV90eXBlX3NwZWNfb2JqZWN0KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSB0dHlwZS0+Z2V0X3RydWVfdHlwZSgpOworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIHdyaXRlX2tleV9hbmQobmFtZSk7CisgICAgc3RhcnRfb2JqZWN0KE5PX0lOREVOVCk7CisgICAgd3JpdGVfa2V5X2FuZCgidHlwZUlkIik7CisgICAgd3JpdGVfdHlwZV9zcGVjKHR0eXBlKTsKKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV90eXBlX3NwZWNfZW50cnkoY29uc3QgY2hhciogbmFtZSwgdF90eXBlKiB0dHlwZSkgeworICB3cml0ZV9rZXlfYW5kKG5hbWUpOworICB3cml0ZV90eXBlX3NwZWModHR5cGUpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX3R5cGVfc3BlYyh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gdHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKworICB3cml0ZV9zdHJpbmcoZ2V0X3R5cGVfbmFtZSh0dHlwZSkpOworCisgIGlmICh0dHlwZS0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJhbm5vdGF0aW9ucyIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIGZvciAoYXV0byAmIGFubm90YXRpb24gOiB0dHlwZS0+YW5ub3RhdGlvbnNfKSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhhbm5vdGF0aW9uLmZpcnN0LCBhbm5vdGF0aW9uLnNlY29uZCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiY2xhc3MiLCBnZXRfcXVhbGlmaWVkX25hbWUodHR5cGUpKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygia2V5VHlwZUlkIiwgZ2V0X3R5cGVfbmFtZShrdHlwZSkpOworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJ2YWx1ZVR5cGVJZCIsIGdldF90eXBlX25hbWUodnR5cGUpKTsKKyAgICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJrZXlUeXBlIiwga3R5cGUpOworICAgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInZhbHVlVHlwZSIsIHZ0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZWxlbVR5cGVJZCIsIGdldF90eXBlX25hbWUoZXR5cGUpKTsKKyAgICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJlbGVtVHlwZSIsIGV0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImVsZW1UeXBlSWQiLCBnZXRfdHlwZV9uYW1lKGV0eXBlKSk7CisgICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgiZWxlbVR5cGUiLCBldHlwZSk7CisgIH0KK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfanNvbl8gPDwgZW5kbDsKKyAgZl9qc29uXy5jbG9zZSgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6Om1lcmdlX2luY2x1ZGVzKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICB2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpbmNfaXRlcjsKKyAgZm9yIChpbmNfaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7IGluY19pdGVyICE9IGluY2x1ZGVzLmVuZCgpOyArK2luY19pdGVyKSB7CisgICAgdF9wcm9ncmFtKiBpbmNsdWRlID0gKmluY19pdGVyOworICAgIC8vIHJlY3Vyc2UgaW4gY2FzZSB3ZSBnZXQgY3JhenkKKyAgICBtZXJnZV9pbmNsdWRlcyhpbmNsdWRlKTsKKyAgICAvLyBtZXJnZSBlbnVtcworICAgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IGluY2x1ZGUtPmdldF9lbnVtcygpOworICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICAgIHByb2dyYW0tPmFkZF9lbnVtKCplbl9pdGVyKTsKKyAgICB9CisgICAgLy8gbWVyZ2UgdHlwZWRlZnMKKyAgICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBpbmNsdWRlLT5nZXRfdHlwZWRlZnMoKTsKKyAgICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7CisgICAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgICBwcm9ncmFtLT5hZGRfdHlwZWRlZigqdGRfaXRlcik7CisgICAgfQorICAgIC8vIG1lcmdlIHN0cnVjdHMKKyAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gaW5jbHVkZS0+Z2V0X29iamVjdHMoKTsKKyAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKKyAgICAgIHByb2dyYW0tPmFkZF9zdHJ1Y3QoKm9faXRlcik7CisgICAgfQorICAgIC8vIG1lcmdlIGNvbnN0YW50cworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gaW5jbHVkZS0+Z2V0X2NvbnN0cygpOworICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgcHJvZ3JhbS0+YWRkX2NvbnN0KCpjX2l0ZXIpOworICAgIH0KKworICAgIC8vIG1lcmdlIHNlcnZpY2VzCisgICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gaW5jbHVkZS0+Z2V0X3NlcnZpY2VzKCk7CisgICAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgICAgcHJvZ3JhbS0+YWRkX3NlcnZpY2UoKnN2X2l0ZXIpOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7CisKKyAgaW5pdF9nZW5lcmF0b3IoKTsKKworICBzdGFydF9vYmplY3QoKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBwcm9ncmFtXy0+Z2V0X25hbWUoKSk7CisgIGlmIChwcm9ncmFtXy0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHByb2dyYW1fLT5nZXRfZG9jKCkpOworICB9CisKKyAgLy8gV2hlbiBtZXJnaW5nIGluY2x1ZGVzLCB0aGUgIm5hbWVzcGFjZXMiIGFuZCAiaW5jbHVkZXMiIHNlY3Rpb25zCisgIC8vIGJlY29tZSBhbWJpZ3VvdXMsIHNvIGp1c3Qgc2tpcCB0aGVtLgorICBpZiAoIXNob3VsZF9tZXJnZV9pbmNsdWRlc18pIHsKKyAgICAvLyBHZW5lcmF0ZSBuYW1lc3BhY2VzCisgICAgd3JpdGVfa2V5X2FuZCgibmFtZXNwYWNlcyIpOworICAgIHN0YXJ0X29iamVjdChOT19JTkRFTlQpOworICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIG5hbWVzcGFjZXMgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZXMoKTsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBuc19pdDsKKyAgICBmb3IgKG5zX2l0ID0gbmFtZXNwYWNlcy5iZWdpbigpOyBuc19pdCAhPSBuYW1lc3BhY2VzLmVuZCgpOyArK25zX2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhuc19pdC0+Zmlyc3QsIG5zX2l0LT5zZWNvbmQpOworICAgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKworICAgIC8vIEdlbmVyYXRlIGluY2x1ZGVzCisgICAgd3JpdGVfa2V5X2FuZCgiaW5jbHVkZXMiKTsKKyAgICBzdGFydF9hcnJheSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgICB2ZWN0b3I8dF9wcm9ncmFtKj46OmNvbnN0X2l0ZXJhdG9yIGluY19pdDsKKyAgICBmb3IgKGluY19pdCA9IGluY2x1ZGVzLmJlZ2luKCk7IGluY19pdCAhPSBpbmNsdWRlcy5lbmQoKTsgKytpbmNfaXQpIHsKKyAgICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgICAgd3JpdGVfc3RyaW5nKCgqaW5jX2l0KS0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgICB9CisgICAgZW5kX2FycmF5KCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSBlbnVtcworICB3cml0ZV9rZXlfYW5kKCJlbnVtcyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7CisgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgLy8gR2VuZXJhdGUgdHlwZWRlZnMKKyAgd3JpdGVfa2V5X2FuZCgidHlwZWRlZnMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOworICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7CisgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIC8vIEdlbmVyYXRlIHN0cnVjdHMsIGV4Y2VwdGlvbnMsIGFuZCB1bmlvbnMgaW4gZGVjbGFyZWQgb3JkZXIKKyAgd3JpdGVfa2V5X2FuZCgic3RydWN0cyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gcHJvZ3JhbV8tPmdldF9vYmplY3RzKCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7CisgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBpZiAoKCpvX2l0ZXIpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOworICAgIH0KKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKKyAgd3JpdGVfa2V5X2FuZCgiY29uc3RhbnRzIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2NvbnN0YW50KCpjX2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIC8vIEdlbmVyYXRlIHNlcnZpY2VzCisgIHdyaXRlX2tleV9hbmQoInNlcnZpY2VzIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICBlbmRfb2JqZWN0KCk7CisKKyAgLy8gQ2xvc2UgdGhlIGdlbmVyYXRvcgorICBjbG9zZV9nZW5lcmF0b3IoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgZ2V0X3F1YWxpZmllZF9uYW1lKHR0eXBlZGVmKSk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJ0eXBlSWQiLCBnZXRfdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHJ1ZV90eXBlKCkpKTsKKyAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgidHlwZSIsIHR0eXBlZGVmLT5nZXRfdHJ1ZV90eXBlKCkpOworICBpZiAodHR5cGVkZWYtPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0dHlwZWRlZi0+Z2V0X2RvYygpKTsKKyAgfQorICBpZiAodHR5cGVkZWYtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKGF1dG8gJiBhbm5vdGF0aW9uIDogdHR5cGVkZWYtPmFubm90YXRpb25zXykgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoYW5ub3RhdGlvbi5maXJzdCwgYW5ub3RhdGlvbi5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKyAgZW5kX29iamVjdCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX3N0cmluZyhjb25zdCBzdHJpbmcmIHZhbHVlKSB7CisgIGZfanNvbl8gPDwgcXVvdCA8PCBlc2NhcGVfanNvbl9zdHJpbmcodmFsdWUpIDw8IHF1b3Q7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgc2hvdWxkX2ZvcmNlX3N0cmluZykgeworCisgIHN3aXRjaCAodmFsdWUtPmdldF90eXBlKCkpIHsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICBpZiAoc2hvdWxkX2ZvcmNlX3N0cmluZykgeworICAgICAgd3JpdGVfc3RyaW5nKG51bWJlcl90b19zdHJpbmcodmFsdWUtPmdldF9pbnRlZ2VyKCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVfbnVtYmVyKHZhbHVlLT5nZXRfaW50ZWdlcigpKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgaWYgKHNob3VsZF9mb3JjZV9zdHJpbmcpIHsKKyAgICAgIHdyaXRlX3N0cmluZyhudW1iZXJfdG9fc3RyaW5nKHZhbHVlLT5nZXRfZG91YmxlKCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVfbnVtYmVyKHZhbHVlLT5nZXRfZG91YmxlKCkpOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICB3cml0ZV9zdHJpbmcodmFsdWUtPmdldF9zdHJpbmcoKSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOiB7CisgICAgc3RhcnRfYXJyYXkoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGl0OworICAgIGZvciAobGl0ID0gbGlzdC5iZWdpbigpOyBsaXQgIT0gbGlzdC5lbmQoKTsgKytsaXQpIHsKKyAgICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgICAgZl9qc29uXyA8PCBpbmRlbnQoKTsKKyAgICAgIHdyaXRlX2NvbnN0X3ZhbHVlKCpsaXQpOworICAgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgICAgfQorICAgIGVuZF9hcnJheSgpOworICAgIGJyZWFrOworICB9CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6IHsKKyAgICBzdGFydF9vYmplY3QoTk9fSU5ERU5UKTsKKyAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG1hcCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6aXRlcmF0b3IgbWl0OworICAgIGZvciAobWl0ID0gbWFwLmJlZ2luKCk7IG1pdCAhPSBtYXAuZW5kKCk7ICsrbWl0KSB7CisgICAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICAgIGZfanNvbl8gPDwgaW5kZW50KCk7CisgICAgICAvLyBKU09OIG9iamVjdHMgb25seSBhbGxvdyBzdHJpbmcga2V5cworICAgICAgd3JpdGVfY29uc3RfdmFsdWUobWl0LT5maXJzdCwgRk9SQ0VfU1RSSU5HKTsKKyAgICAgIGZfanNvbl8gPDwgIjogIjsKKyAgICAgIHdyaXRlX2NvbnN0X3ZhbHVlKG1pdC0+c2Vjb25kKTsKKyAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgICAgYnJlYWs7CisgIH0KKworICBkZWZhdWx0OgorICAgIGZfanNvbl8gPDwgIm51bGwiOworICAgIGJyZWFrOworICB9Cit9CisKK3N0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjpqc29uX3N0cihjb25zdCBzdHJpbmcmIHN0cikgeworICByZXR1cm4gcXVvdCArIGVzY2FwZV9qc29uX3N0cmluZyhzdHIpICsgcXVvdDsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdGFudCh0X2NvbnN0KiBjb24pIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBjb24tPmdldF9uYW1lKCkpOworICB3cml0ZV9rZXlfYW5kX3N0cmluZygidHlwZUlkIiwgZ2V0X3R5cGVfbmFtZShjb24tPmdldF90eXBlKCkpKTsKKyAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgidHlwZSIsIGNvbi0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKGNvbi0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIGNvbi0+Z2V0X2RvYygpKTsKKyAgfQorCisgIHdyaXRlX2tleV9hbmQoInZhbHVlIik7CisgIHdyaXRlX2NvbnN0X3ZhbHVlKGNvbi0+Z2V0X3ZhbHVlKCkpOworCisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCB0ZW51bS0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKHRlbnVtLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdGVudW0tPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAodGVudW0tPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgICB3cml0ZV9rZXlfYW5kKCJhbm5vdGF0aW9ucyIpOworICAgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgICBmb3IgKGF1dG8gJiBhbm5vdGF0aW9uIDogdGVudW0tPmFubm90YXRpb25zXykgeworICAgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhhbm5vdGF0aW9uLmZpcnN0LCBhbm5vdGF0aW9uLnNlY29uZCk7CisgICAgICB9CisgICAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJtZW1iZXJzIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiB2YWx1ZXMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIHZhbF9pdGVyOworICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIHRfZW51bV92YWx1ZSogdmFsID0gKCp2YWxfaXRlcik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCB2YWwtPmdldF9uYW1lKCkpOworICAgIHdyaXRlX2tleV9hbmRfaW50ZWdlcigidmFsdWUiLCB2YWwtPmdldF92YWx1ZSgpKTsKKyAgICBpZiAodmFsLT5oYXNfZG9jKCkpIHsKKyAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB2YWwtPmdldF9kb2MoKSk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0YXJ0X29iamVjdCgpOworCisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgdHN0cnVjdC0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKHRzdHJ1Y3QtPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0c3RydWN0LT5nZXRfZG9jKCkpOworICB9CisKKyAgaWYgKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKGF1dG8gJiBhbm5vdGF0aW9uIDogdHN0cnVjdC0+YW5ub3RhdGlvbnNfKSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhhbm5vdGF0aW9uLmZpcnN0LCBhbm5vdGF0aW9uLnNlY29uZCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgfQorCisgIHdyaXRlX2tleV9hbmRfYm9vbCgiaXNFeGNlcHRpb24iLCB0c3RydWN0LT5pc194Y2VwdGlvbigpKTsKKworICB3cml0ZV9rZXlfYW5kX2Jvb2woImlzVW5pb24iLCB0c3RydWN0LT5pc191bmlvbigpKTsKKworICB3cml0ZV9rZXlfYW5kKCJmaWVsZHMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXI7CisgIGZvciAobWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqbWVtX2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBnZXRfcXVhbGlmaWVkX25hbWUodHNlcnZpY2UpKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZXh0ZW5kcyIsIGdldF9xdWFsaWZpZWRfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkpOworICB9CisKKyAgaWYgKHRzZXJ2aWNlLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdHNlcnZpY2UtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAodHNlcnZpY2UtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKGF1dG8gJiBhbm5vdGF0aW9uIDogdHNlcnZpY2UtPmFubm90YXRpb25zXykgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoYW5ub3RhdGlvbi5maXJzdCwgYW5ub3RhdGlvbi5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJmdW5jdGlvbnMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgIGZvciAoOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb24oKmZuX2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBzdGFydF9vYmplY3QoKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHRmdW5jLT5nZXRfbmFtZSgpKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygicmV0dXJuVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSkpOworICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJyZXR1cm5UeXBlIiwgdGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworCisgIHdyaXRlX2tleV9hbmRfYm9vbCgib25ld2F5IiwgdGZ1bmMtPmlzX29uZXdheSgpKTsKKworICBpZiAodGZ1bmMtPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0ZnVuYy0+Z2V0X2RvYygpKTsKKyAgfQorCisgIGlmICh0ZnVuYy0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJhbm5vdGF0aW9ucyIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIGZvciAoYXV0byAmIGFubm90YXRpb24gOiB0ZnVuYy0+YW5ub3RhdGlvbnNfKSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhhbm5vdGF0aW9uLmZpcnN0LCBhbm5vdGF0aW9uLnNlY29uZCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgfQorCisgIHdyaXRlX2tleV9hbmQoImFyZ3VtZW50cyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7CisgIGZvciAoOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfZmllbGQoKm1lbV9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICB3cml0ZV9rZXlfYW5kKCJleGNlcHRpb25zIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2ZpZWxkKCpleF9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGQodF9maWVsZCogZmllbGQpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9pbnRlZ2VyKCJrZXkiLCBmaWVsZC0+Z2V0X2tleSgpKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBmaWVsZC0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJ0eXBlSWQiLCBnZXRfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSk7CisgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInR5cGUiLCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKGZpZWxkLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgZmllbGQtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAoZmllbGQtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKGF1dG8gJiBhbm5vdGF0aW9uIDogZmllbGQtPmFubm90YXRpb25zXykgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoYW5ub3RhdGlvbi5maXJzdCwgYW5ub3RhdGlvbi5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJyZXF1aXJlZCIpOworICBzd2l0Y2ggKGZpZWxkLT5nZXRfcmVxKCkpIHsKKyAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgorICAgIHdyaXRlX3N0cmluZygicmVxdWlyZWQiKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOgorICAgIHdyaXRlX3N0cmluZygicmVxX291dCIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHdyaXRlX3N0cmluZygib3B0aW9uYWwiKTsKKyAgICBicmVhazsKKyAgfQorCisgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJkZWZhdWx0Iik7CisgICAgd3JpdGVfY29uc3RfdmFsdWUoZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgfQorCisgIGVuZF9vYmplY3QoKTsKK30KKworc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6OmdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJsaXN0IjsKKyAgfQorICBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJzZXQiOworICB9CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIm1hcCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImkzMiI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAoKHRfc3RydWN0Kil0dHlwZSktPmlzX3VuaW9uKCkgPyAidW5pb24iIDogInN0cnVjdCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJleGNlcHRpb24iOworICB9CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2V0eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICByZXR1cm4gdGJhc2V0eXBlLT5pc19iaW5hcnkoKSA/ICJiaW5hcnkiIDogdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNldHlwZS0+Z2V0X2Jhc2UoKSk7CisgIH0KKworICByZXR1cm4gIih1bmtub3duKSI7Cit9CisKK3N0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjpnZXRfcXVhbGlmaWVkX25hbWUodF90eXBlKiB0dHlwZSkgeworICBpZiAoc2hvdWxkX21lcmdlX2luY2x1ZGVzXyB8fCB0dHlwZS0+Z2V0X3Byb2dyYW0oKSA9PSBwcm9ncmFtXykgeworICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihqc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSlNPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgbWVyZ2U6ICAgICAgICAgICBHZW5lcmF0ZSBvdXRwdXQgd2l0aCBpbmNsdWRlZCBmaWxlcyBtZXJnZWRcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0MzJjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDExMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjptYXA7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBMVUEgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2x1YV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9sdWFfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGdlbl9yZXF1aXJlc18gPSB0cnVlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm9taXRfcmVxdWlyZXMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9yZXF1aXJlc18gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBsdWE6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWx1YSI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpIG92ZXJyaWRlOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSBvdmVycmlkZTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbHVhIHJlcXVpcmUgc3RhdGVtZW50cy4KKyAgICovCisgIGJvb2wgZ2VuX3JlcXVpcmVzXzsKKworICAvKioKKyAgICogU3RydWN0LWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfbHVhX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIERlc2VyaWFsaXphdGlvbiAoUmVhZCkKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gKFdyaXRlKQorICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKyAgc3RkOjpzdHJpbmcgbHVhX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisKKyAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiLS1cbiIpICsgIi0tIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsgIi0tXG4iCisgICAgICAgICAgICsgIi0tIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiLS0gQCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0ZWRcbiIKKyAgICAgICAgICAgKyAiLS1cbiI7CisgIH0KKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworfTsKKworLyoqCisgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOworICBNS0RJUihvdXRkaXIuY19zdHIoKSk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKKyAgc3RyaW5nIGN1cl9uYW1lc3BhY2UgPSBnZXRfbmFtZXNwYWNlKHByb2dyYW1fKTsKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBvdXRkaXIgKyBjdXJfbmFtZXNwYWNlICsgImNvbnN0YW50cy5sdWEiOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl90eXBlc19uYW1lID0gb3V0ZGlyICsgY3VyX25hbWVzcGFjZSArICJ0dHlwZXMubHVhIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQWRkIGhlYWRlcnMKKyAgZl9jb25zdHNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGx1YV9pbmNsdWRlcygpOworICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBsdWFfaW5jbHVkZXMoKTsKKyAgaWYgKGdlbl9yZXF1aXJlc18pIHsKKyAgICBmX3R5cGVzXyA8PCBlbmRsIDw8ICJyZXF1aXJlICciIDw8IGN1cl9uYW1lc3BhY2UgPDwgImNvbnN0YW50cyciOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSB0eXBlZGVmIChlc3NlbnRpYWxseSBhIGNvbnN0YW50KQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGZfdHlwZXNfIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIiA9ICIKKyAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF90eXBlKCktPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZSAodGFibGUpCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwgZW5kbCA8PCBlbmRsIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTspIHsKKyAgICBpbnQzMl90IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIGZfdHlwZXNfIDw8ICIgICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlOworICAgICsrY19pdGVyOworICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpKSB7CisgICAgICBmX3R5cGVzXyA8PCAiLCI7CisgICAgfQorICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgIH0KKyAgZl90eXBlc18gPDwgIn0iOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgKG5vbi1sb2NhbCkgdmFsdWUKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl9jb25zdHNfIDw8IGVuZGwgPDwgZW5kbCA8PCBuYW1lIDw8ICIgPSAiOworICBmX2NvbnN0c18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiJyIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8ICJsdWFsb25nbnVtYmVyLm5ldygnIiA8PCB2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICInKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgPSAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICArK3ZfaXRlcjsKKyAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCI7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8ICJ9IjsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KQorICAgICAgICAgICAgICAgICAgPDwgIl0gPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgKyt2X2l0ZXI7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwiOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBvdXQgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIGluZGVudChvdXQpOworICAgICAgb3V0IDw8ICJbIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpIDw8ICJdIjsKKyAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgICBvdXQgPDwgIiA9IHRydWUiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgPSBmYWxzZSI7CisgICAgICB9CisgICAgICArK3ZfaXRlcjsKKyAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICJ9IjsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IHN0cnVjdAorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IGV4Y2VwdGlvbgorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSB0aHJpZnQgc3RydWN0IG9yIGV4Y2VwdGlvbiAobHVhIHRhYmxlKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCBlbmRsIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIiA9IFRFeGNlcHRpb246bmV3eyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBfX3R5cGUgPSAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInIjsKKyAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBvdXQgPDwgIiwiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIiA9IF9fVE9iamVjdDpuZXd7IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7KSB7CisgICAgaW5kZW50KG91dCk7CisgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICArK21faXRlcjsKKyAgICBpZiAobV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCk7CisgIG91dCA8PCBlbmRsIDw8ICJ9IjsKKworICBnZW5lcmF0ZV9sdWFfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgc3RydWN0L2V4Y2VwdGlvbiByZWFkZXIKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6cmVhZChpcHJvdCkiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKworICAvLyB3aGlsZTogUmVhZCBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlIHRydWUgZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGlmOiBDaGVjayB3aGF0IHRvIHJlYWQKKyAgaW5kZW50KG91dCkgPDwgImxvY2FsIGZuYW1lLCBmdHlwZSwgZmlkID0gaXByb3Q6cmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09IFRUeXBlLlNUT1AgdGhlbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhayIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVsc2VpZiBmaWQgPT0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIHRoZW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0aGVuIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gUmVhZCBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgZmFsc2UsICJzZWxmLiIpOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBpcHJvdDpza2lwKGZ0eXBlKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICB9CisKKyAgLy8gZW5kIGlmCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbHNlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBpcHJvdDpza2lwKGZ0eXBlKSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgIC8vIGVuZCB3aGlsZQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOworCisgIC8vIGVuZCBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KTsKKyAgb3V0IDw8ICJlbmQiOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgc3RydWN0L2V4Y2VwdGlvbiB3cml0ZXIKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6d3JpdGUob3Byb3QpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInKSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBUbyBjaGVjayBlbGVtZW50IG9mIHNlbGYgd2hldGhlciBuaWwgb3Igbm90LgorICAgIC8vIGF2b2lkIHRoZSB2YWx1ZShmYWxzZSkgb2YgQk9PTCBpcyBsb3N0LgorICAgIGluZGVudChvdXQpIDw8ICJpZiBzZWxmLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgfj0gbmlsIHRoZW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRFbmQoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZVN0cnVjdEVuZCgpIiA8PCBlbmRsOworCisgIC8vIGVuZCBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KTsKKyAgb3V0IDw8ICJlbmQiOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IHNlcnZpY2UKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZXQgb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBPcGVuIHRoZSBmaWxlIGZvciB3cml0aW5nCisgIHN0cmluZyBjdXJfbnMgPSBnZXRfbmFtZXNwYWNlKHByb2dyYW1fKTsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gb3V0ZGlyICsgY3VyX25zICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiLmx1YSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICAvLyBIZWFkZXJzCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbHVhX2luY2x1ZGVzKCk7CisgIGlmIChnZW5fcmVxdWlyZXNfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8ICJyZXF1aXJlICciIDw8IGN1cl9ucyA8PCAidHR5cGVzJyIgPDwgZW5kbDsKKworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXF1aXJlICciIDw8IGdldF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICInIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIC8vIENsb3NlIHRoZSBmaWxlCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgY2xhc3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiSWZhY2UiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworCisgIC8vIEludGVyZmFjZSBvYmplY3QgZGVmaW5pdGlvbgorICBvdXQgPDwgY2xhc3NuYW1lIDw8ICIgPSAiOworICBpZiAoZXh0ZW5kc19zKSB7CisgICAgb3V0IDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiSWZhY2U6bmV3eyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIl9fVE9iamVjdDpuZXd7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCAiICBfX3R5cGUgPSAnIiA8PCBjbGFzc25hbWUgPDwgIiciIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgY2xhc3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQ2xpZW50IjsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBDbGllbnQgb2JqZWN0IGRlZmluaXRpb24KKyAgb3V0IDw8IGNsYXNzbmFtZSA8PCAiID0gX19UT2JqZWN0Lm5ldygiOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBvdXQgPDwgZXh0ZW5kc19zLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQiOworICB9IGVsc2UgeworICAgIG91dCA8PCAiX19UQ2xpZW50IjsKKyAgfQorICBvdXQgPDwgIiwgeyIgPDwgZW5kbCA8PCAiICBfX3R5cGUgPSAnIiA8PCBjbGFzc25hbWUgPDwgIiciIDw8IGVuZGwgPDwgIn0pIiA8PCBlbmRsOworCisgIC8vIFNlbmQvUmVjdiBmdW5jdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIHNpZyA9IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKTsKKyAgICBzdHJpbmcgZnVuY25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBXcmFwcGVyIGZ1bmN0aW9uCisgICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjoiIDw8IHNpZyA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgInNlbGY6c2VuZF8iIDw8IHNpZyA8PCBlbmRsIDw8IGluZGVudCgpOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJzZWxmOnJlY3ZfIiA8PCBzaWcgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgICAvLyBTZW5kIGZ1bmN0aW9uCisgICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpzZW5kXyIgPDwgc2lnIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdDp3cml0ZU1lc3NhZ2VCZWdpbignIiA8PCBmdW5jbmFtZSA8PCAiJywgIgorICAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKKyAgICAgICAgICAgICAgICA8PCAiLCBzZWxmLl9zZXFpZCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxvY2FsIGFyZ3MgPSAiIDw8IGZ1bmNuYW1lIDw8ICJfYXJnczpuZXd7fSIgPDwgZW5kbDsKKworICAgIC8vIFNldCB0aGUgYXJncworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgZm9yIChmbGRfaXRlciA9IGFyZ3MuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gYXJncy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgc3RkOjpzdHJpbmcgYXJnbmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaW5kZW50KG91dCkgPDwgImFyZ3MuIiA8PCBhcmduYW1lIDw8ICIgPSAiIDw8IGFyZ25hbWUgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiYXJnczp3cml0ZShzZWxmLm9wcm90KSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdDp3cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgICAgLy8gUmVjdiBmdW5jdGlvbgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpyZWN2XyIgPDwgc2lnIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJsb2NhbCBmbmFtZSwgbXR5cGUsIHJzZXFpZCA9IHNlbGYuaXByb3Q6IgorICAgICAgICAgIDw8ICJyZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIG10eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04gdGhlbiIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGxvY2FsIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb246bmV3e30iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB4OnJlYWQoc2VsZi5pcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgc2VsZi5pcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZXJyb3IoeCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJsb2NhbCByZXN1bHQgPSAiIDw8IGZ1bmNuYW1lIDw8ICJfcmVzdWx0Om5ld3t9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgInJlc3VsdDpyZWFkKHNlbGYuaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZWxmLmlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisKKyAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0IGlmIGl0J3Mgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIHJlc3VsdC5zdWNjZXNzIH49IG5pbCB0aGVuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuc3VjY2VzcyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgICAgLy8gVGhyb3cgY3VzdG9tIGV4Y2VwdGlvbnMKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4ZiA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICAgIGZvciAoeF9pdGVyID0geGYuYmVnaW4oKTsgeF9pdGVyICE9IHhmLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZWlmIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHRoZW4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZXJyb3IocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJlcnJvcihUQXBwbGljYXRpb25FeGNlcHRpb246bmV3e2Vycm9yQ29kZSA9ICIKKyAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFR9KSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gRGVmaW5lIHByb2Nlc3NvciB0YWJsZQorICBvdXQgPDwgZW5kbCA8PCBjbGFzc25hbWUgPDwgIiA9IF9fVE9iamVjdC5uZXcoIjsKKyAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CisgICAgb3V0IDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiX19UUHJvY2Vzc29yIiA8PCBlbmRsOworICB9CisgIG91dCA8PCAiLCB7IiA8PCBlbmRsIDw8ICIgX190eXBlID0gJyIgPDwgY2xhc3NuYW1lIDw8ICInIiA8PCBlbmRsIDw8ICJ9KSIgPDwgZW5kbDsKKworICAvLyBQcm9jZXNzIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6cHJvY2VzcyhpcHJvdCwgb3Byb3QsIHNlcnZlcl9jdHgpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAibG9jYWwgbmFtZSwgbXR5cGUsIHNlcWlkID0gaXByb3Q6cmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibG9jYWwgZnVuY19uYW1lID0gJ3Byb2Nlc3NfJyAuLiBuYW1lIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgbm90IHNlbGZbZnVuY19uYW1lXSBvciB0dHlwZShzZWxmW2Z1bmNfbmFtZV0pIH49ICdmdW5jdGlvbicgdGhlbiI7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3Q6c2tpcChUVHlwZS5TVFJVQ1QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiaXByb3Q6cmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjpuZXd7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICBlcnJvckNvZGUgPSBUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdDp3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCAiCisgICAgICA8PCAic2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4OndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90OndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiICBzZWxmW2Z1bmNfbmFtZV0oc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCwgc2VydmVyX2N0eCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgImVuZCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICBzdHJpbmcgZm5fbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKworICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8ICJmdW5jdGlvbiAiIDw8IGNsYXNzbmFtZSA8PCAiOnByb2Nlc3NfIiA8PCBmbl9uYW1lCisgICAgICAgICAgICAgIDw8ICIoc2VxaWQsIGlwcm90LCBvcHJvdCwgc2VydmVyX2N0eCkiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIFJlYWQgdGhlIHJlcXVlc3QKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJsb2NhbCBhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiOm5ld3t9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibG9jYWwgcmVwbHlfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJnczpyZWFkKGlwcm90KSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImxvY2FsIHJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZQorICAgICAgPDwgIjpuZXd7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibG9jYWwgc3RhdHVzLCByZXMgPSBwY2FsbChzZWxmLmhhbmRsZXIuIiA8PCBmbl9uYW1lCisgICAgICA8PCAiLCBzZWxmLmhhbmRsZXIiOworCisgIC8vIFByaW50IGFyZ3VtZW50cworICB0X3N0cnVjdCogYXJncyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgaWYgKGFyZ3MtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCAiLCAiIDw8IGFyZ3VtZW50X2xpc3QoYXJncywgImFyZ3MuIik7CisgIH0KKworICAvLyBDaGVjayBmb3IgZXJyb3JzCisgIG91dCA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgbm90IHN0YXR1cyB0aGVuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXBseV90eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gcmVzfSIgPDwgZW5kbDsKKworICAvLyBIYW5kbGUgY3VzdG9tIGV4Y2VwdGlvbnMKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4ZiA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICBpZiAoeGYuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhmLmJlZ2luKCk7IHhfaXRlciAhPSB4Zi5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZWlmIHR0eXBlKHJlcykgPT0gJyIgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICInIHRoZW4iCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHJlcyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBTZXQgdGhlIHJlc3VsdCBhbmQgd3JpdGUgdGhlIHJlcGx5CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQuc3VjY2VzcyA9IHJlcyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImVuZCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Q6d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgZm5fbmFtZSA8PCAiJywgcmVwbHlfdHlwZSwgIgorICAgICAgPDwgInNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0OndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90OndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Cit9CisKKy8vIFNlcnZpY2UgaGVscGVycwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGVuZGwgPDwgIi0tIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24ob3V0LCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3V0LCAqZl9pdGVyKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgICAgfQorICAgIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsICZyZXN1bHQsIGZhbHNlKTsKKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplIChSZWFkKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBsb2NhbCwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBsb2NhbCwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgbmFtZSA8PCAiID0gaXByb3Q6IjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjpuZXd7fSIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIjpyZWFkKGlwcm90KSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgcHJlZml4IDw8ICIgPSB7fSIgPDwgZW5kbDsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJsb2NhbCAiIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgPSBpcHJvdDpyZWFkTWFwQmVnaW4oKSAiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiA9IGlwcm90OnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiA9IGlwcm90OnJlYWRMaXN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIERlc2VyaWFsaXplCisgIGluZGVudChvdXQpIDw8ICJmb3IgX2k9MSwiIDw8IHNpemUgPDwgIiBkbyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkTWFwRW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRTZXRFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRMaXN0RW5kKCkiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gQSBtYXAgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGFibGUgYnkgYW55IGx1YSB0eXBlCisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCB0cnVlKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdHJ1ZSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCBlbmRsOworfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICAvLyBBIHNldCBpcyByZXByZXNlbnRlZCBieSBhIHRhYmxlIGluZGV4ZWQgYnkgdGhlIHZhbHVlCisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwgZWxlbSA8PCAiXSA9ICIgPDwgZWxlbSA8PCBlbmRsOworfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAvLyBBIGxpc3QgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGVkIGJ5IGludGVnZXIgdmFsdWVzCisgIC8vIExVQSBuYXRpdmVseSBwcm92aWRlcyBhbGwgb2YgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCB0byBtYWludGFpbiBhIGxpc3QKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUpOworCisgIGluZGVudChvdXQpIDw8ICJ0YWJsZS5pbnNlcnQoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZSAoV3JpdGUpCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6IjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiOndyaXRlKG9wcm90KSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIC8vIEJlZ2luIHdyaXRpbmcKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJ0dGFibGVfc2l6ZSgiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAidHRhYmxlX3NpemUoIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAiIyIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICB9CisKKyAgLy8gU2VyaWFsaXplCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBraXRlciA8PCAiLCIgPDwgdml0ZXIgPDwgIiBpbiBwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIsXyBpbiBwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBfLCIgPDwgaXRlciA8PCAiIGluIGlwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEZpbmlzaCB3cml0aW5nCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiAgSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAqLworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6bHVhX2luY2x1ZGVzKCkgeworICBpZiAoZ2VuX3JlcXVpcmVzXykgeworICAgIHJldHVybiAiXG5cbnJlcXVpcmUgJ1RocmlmdCciOworICB9IGVsc2UgeworICAgIHJldHVybiAiIjsKKyAgfQorfQorCitzdHJpbmcgdF9sdWFfZ2VuZXJhdG9yOjpnZXRfbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICBzdGQ6OnN0cmluZyByZWFsX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImx1YSIpOworICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgeworICAgIHJldHVybiBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIl8iOworICB9CisgIHJldHVybiByZWFsX21vZHVsZSArICJfIjsKK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZClwcmVmaXg7CisgIHN0ZDo6c3RyaW5nIHJldCA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKKyAgcmV0dXJuIHJldDsKK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgc3RkOjpzdHJpbmcgcmV0ID0gIiI7CisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgIHJldCArPSBwcmVmaXggKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICArK2ZsZF9pdGVyOworICAgIGlmIChmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgIHJldCArPSAiLCAiOworICAgIH0KKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdHJpbmcgdF9sdWFfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgbHVhLAorICAgICJMdWEiLAorICAgICIgICAgb21pdF9yZXF1aXJlczogICBTdXBwcmVzcyBnZW5lcmF0aW9uIG9mIHJlcXVpcmUgJ3NvbWVmaWxlJy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTVjMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMxMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworLy9UT0RPOiBjaGVjayBmb3IgaW5kZW50YXRpb24KKy8vVE9ETzogRG8gd2UgbmVlZCBzZXFJZF8gaW4gZ2VuZXJhdGlvbj8KKwordF9uZXRjb3JlX2dlbmVyYXRvcjo6dF9uZXRjb3JlX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLCBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKK3sKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworCisgICAgbnVsbGFibGVfID0gZmFsc2U7CisgICAgaGFzaGNvZGVfID0gZmFsc2U7CisgICAgdW5pb25fID0gZmFsc2U7CisgICAgc2VyaWFsaXplXyA9IGZhbHNlOworICAgIHdjZl8gPSBmYWxzZTsKKyAgICB3Y2ZfbmFtZXNwYWNlXy5jbGVhcigpOworCisgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGZvciAoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJudWxsYWJsZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG51bGxhYmxlXyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiaGFzaGNvZGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBoYXNoY29kZV8gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInVuaW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdW5pb25fID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJzZXJpYWwiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBzZXJpYWxpemVfID0gdHJ1ZTsKKyAgICAgICAgICAgIHdjZl9uYW1lc3BhY2VfID0gaXRlci0+c2Vjb25kOyAvLyBzaW5jZSB0aGVyZSBjYW4gYmUgb25seSBvbmUgbmFtZXNwYWNlCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgid2NmIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgd2NmXyA9IHRydWU7CisgICAgICAgICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBuZXRjb3JlOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW5ldGNvcmUiOworfQorCitzdGF0aWMgc3RyaW5nIGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmMoc3RyaW5nIGNvbnN0JiBmdW5jdGlvbl9uYW1lKQoreworICAgIHN0cmluZyBjb25zdCBhc3luY19lbmQgPSAiQXN5bmMiOworICAgIHNpemVfdCBpID0gZnVuY3Rpb25fbmFtZS5maW5kKGFzeW5jX2VuZCk7CisgICAgaWYgKGkgIT0gc3RyaW5nOjpucG9zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uX25hbWUgKyBhc3luY19lbmQ7CisgICAgfQorCisgICAgcmV0dXJuIGZ1bmN0aW9uX25hbWU7Cit9CisKKy8qKgorKiBcYnJpZWYgU2VhcmNoIGFuZCByZXBsYWNlICJfYXJncyIgc3Vic3RyaW5nIGluIHN0cnVjdCBuYW1lIGlmIGV4aXN0IChmb3IgQyMgY2xhc3MgbmFtaW5nKQorKiBccGFyYW0gc3RydWN0X25hbWUKKyogXHJldHVybiBNb2RpZmllZCBzdHJ1Y3QgbmFtZSAoIlN0cnVjdF9hcmdzIiAtPiAiU3RydWN0QXJncyIpIG9yIG9yaWdpbmFsIG5hbWUKKyovCitzdGF0aWMgc3RyaW5nIGNoZWNrX2FuZF9jb3JyZWN0X3N0cnVjdF9uYW1lKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUpCit7CisgICAgc3RyaW5nIGFyZ3NfZW5kID0gIl9hcmdzIjsKKyAgICBzaXplX3QgaSA9IHN0cnVjdF9uYW1lLmZpbmQoYXJnc19lbmQpOworICAgIGlmIChpICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHN0cmluZyBuZXdfc3RydWN0X25hbWUgPSBzdHJ1Y3RfbmFtZTsKKyAgICAgICAgbmV3X3N0cnVjdF9uYW1lLnJlcGxhY2UoaSwgYXJnc19lbmQubGVuZ3RoKCksICJBcmdzIik7CisgICAgICAgIHJldHVybiBuZXdfc3RydWN0X25hbWU7CisgICAgfQorCisgICAgc3RyaW5nIHJlc3VsdF9lbmQgPSAiX3Jlc3VsdCI7CisgICAgc2l6ZV90IGogPSBzdHJ1Y3RfbmFtZS5maW5kKHJlc3VsdF9lbmQpOworICAgIGlmIChqICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHN0cmluZyBuZXdfc3RydWN0X25hbWUgPSBzdHJ1Y3RfbmFtZTsKKyAgICAgICAgbmV3X3N0cnVjdF9uYW1lLnJlcGxhY2UoaiwgcmVzdWx0X2VuZC5sZW5ndGgoKSwgIlJlc3VsdCIpOworICAgICAgICByZXR1cm4gbmV3X3N0cnVjdF9uYW1lOworICAgIH0KKworICAgIHJldHVybiBzdHJ1Y3RfbmFtZTsKK30KKworc3RhdGljIGJvb2wgZmllbGRfaGFzX2RlZmF1bHQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEw7IH0KKworc3RhdGljIGJvb2wgZmllbGRfaXNfcmVxdWlyZWQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEOyB9CisKK3N0YXRpYyBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkKK3sKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKK30KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc193Y2ZfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIHdjZl87IH0KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc19udWxsYWJsZV9lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVfOyB9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aXNfaGFzaGNvZGVfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGhhc2hjb2RlXzsgfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmlzX3NlcmlhbGl6ZV9lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gc2VyaWFsaXplXzsgfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmlzX3VuaW9uX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiB1bmlvbl87IH0KKworbWFwPHN0cmluZywgaW50PiB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZXRfa2V5d29yZHNfbGlzdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG5ldGNvcmVfa2V5d29yZHM7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKQoreworICAgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgICAvLyBmb3IgdXNhZ2Ugb2YgY3NoYXJwIG5hbWVzcGFjZXMgaW4gdGhyaWZ0IGZpbGVzIChmcm9tIGZpbGVzIGZvciBjc2hhcnApCisgICAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoIm5ldGNvcmUiKTsKKyAgICBpZiAobmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpCisgICAgeworICAgICAgICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgibmV0Y29yZSIpOworICAgIH0KKworICAgIHN0cmluZyBkaXIgPSBuYW1lc3BhY2VfbmFtZV87CisgICAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCkuY19zdHIoKTsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgICAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICAgIH0KKyAgICBpZiAoZGlyLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICB9CisKKyAgICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKKyAgICBpbml0X2tleXdvcmRzKCk7CisKKyAgICB3aGlsZSAoIW1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCkuc2NvcGVfbWVtYmVyKTsKKyAgICB9CisKKyAgICBwdmVyYm9zZSgiLk5FVCBDb3JlIG9wdGlvbnM6XG4iKTsKKyAgICBwdmVyYm9zZSgiLSBudWxsYWJsZSAuLi4gJXNcbiIsIChudWxsYWJsZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSB1bmlvbiAuLi4uLi4gJXNcbiIsICh1bmlvbl8gPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSBoYXNoY29kZSAuLi4gJXNcbiIsIChoYXNoY29kZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSBzZXJpYWxpemUgLi4gJXNcbiIsIChzZXJpYWxpemVfID8gIk9OIiA6ICJvZmYiKSk7CisgICAgcHZlcmJvc2UoIi0gd2NmIC4uLi4uLi4uICVzXG4iLCAod2NmXyA/ICJPTiIgOiAib2ZmIikpOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6bm9ybWFsaXplX25hbWUoc3RyaW5nIG5hbWUpCit7CisgICAgc3RyaW5nIHRtcChuYW1lKTsKKyAgICB0cmFuc2Zvcm0odG1wLmJlZ2luKCksIHRtcC5lbmQoKSwgdG1wLmJlZ2luKCksIHN0YXRpY19jYXN0PGludCgqKShpbnQpPih0b2xvd2VyKSk7CisKKyAgICAvLyB1bi1jb25mbGljdCBrZXl3b3JkcyBieSBwcmVmaXhpbmcgd2l0aCAiQCIKKyAgICBpZiAobmV0Y29yZV9rZXl3b3Jkcy5maW5kKHRtcCkgIT0gbmV0Y29yZV9rZXl3b3Jkcy5lbmQoKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiQCIgKyBuYW1lOworICAgIH0KKworICAgIC8vIG5vIGNoYW5nZXMgbmVjZXNzYXJ5CisgICAgcmV0dXJuIG5hbWU7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aW5pdF9rZXl3b3JkcygpCit7CisgICAgbmV0Y29yZV9rZXl3b3Jkcy5jbGVhcigpOworCisgICAgLy8gQyMga2V5d29yZHMKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhYnN0cmFjdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJiYXNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImJvb2wiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYnJlYWsiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYnl0ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjYXNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNhdGNoIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNoYXIiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY2hlY2tlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjbGFzcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjb25zdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjb250aW51ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkZWNpbWFsIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRlZmF1bHQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZGVsZWdhdGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZG8iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZG91YmxlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImVsc2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZW51bSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJldmVudCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJleHBsaWNpdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJleHRlcm4iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZmFsc2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZmluYWxseSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmaXhlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmbG9hdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmb3IiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZm9yZWFjaCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJnb3RvIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImlmIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImltcGxpY2l0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImluIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImludCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbnRlcmZhY2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaW50ZXJuYWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibG9jayJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJsb25nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm5hbWVzcGFjZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJuZXciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibnVsbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJvYmplY3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sib3BlcmF0b3IiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sib3V0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm92ZXJyaWRlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInBhcmFtcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwcml2YXRlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInByb3RlY3RlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwdWJsaWMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicmVhZG9ubHkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicmVmIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInJldHVybiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzYnl0ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzZWFsZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2hvcnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2l6ZW9mIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN0YWNrYWxsb2MiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic3RhdGljIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN0cmluZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzdHJ1Y3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic3dpdGNoIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInRoaXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidGhyb3ciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidHJ1ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ0cnkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidHlwZW9mIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVpbnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidWxvbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidW5jaGVja2VkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVuc2FmZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ1c2hvcnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidXNpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidmlydHVhbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2b2lkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInZvbGF0aWxlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIndoaWxlIl0gPSAxOworCisgICAgLy8gQyMgY29udGV4dHVhbCBrZXl3b3JkcworICAgIG5ldGNvcmVfa2V5d29yZHNbImFkZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhbGlhcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhc2NlbmRpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXN5bmMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXdhaXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZGVzY2VuZGluZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkeW5hbWljIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZyb20iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZ2V0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImdsb2JhbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJncm91cCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbnRvIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImpvaW4iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibGV0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm9yZGVyYnkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicGFydGlhbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJyZW1vdmUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2VsZWN0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNldCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2YWx1ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2YXIiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sid2hlcmUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sieWllbGQiXSA9IDE7CisKKwluZXRjb3JlX2tleXdvcmRzWyJ3aGVuIl0gPSAxOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkKK3sKKyAgICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJuYW1lc3BhY2UgIiA8PCBuYW1lc3BhY2VfbmFtZV8gPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZW5kX25ldGNvcmVfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkKK3sKKyAgICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6Om5ldGNvcmVfdHlwZV91c2luZ3MoKSBjb25zdAoreworICAgIHN0cmluZyBuYW1lc3BhY2VzID0KKyAgICAgICAgInVzaW5nIFN5c3RlbTtcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLlRleHQ7XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiI7CisKKyAgICBpZiAod2NmXykKKyAgICB7CisgICAgICAgIG5hbWVzcGFjZXMgKz0gInVzaW5nIFN5c3RlbS5TZXJ2aWNlTW9kZWw7XG4iOworICAgICAgICBuYW1lc3BhY2VzICs9ICJ1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uO1xuIjsKKyAgICB9CisKKyAgICByZXR1cm4gbmFtZXNwYWNlcyArIGVuZGw7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpuZXRjb3JlX3RocmlmdF91c2luZ3MoKSBjb25zdAoreworICAgIHN0cmluZyBuYW1lc3BhY2VzID0KKyAgICAgICAgInVzaW5nIFRocmlmdC5Qcm90b2NvbHM7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXM7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0cztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDtcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcjtcbiI7CisKKyAgICByZXR1cm4gbmFtZXNwYWNlcyArIGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkKK3sKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpCit7CisgICAgKHZvaWQpdHR5cGVkZWY7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKQoreworCWludCBpYyA9IGluZGVudF9jb3VudCgpOworICAgIHN0cmluZyBmX2VudW1fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgdGVudW0tPmdldF9uYW1lKCkgKyAiLmNzIjsKKworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICAgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisJZ2VuZXJhdGVfZW51bShmX2VudW0sIHRlbnVtKTsKKworICAgIGZfZW51bS5jbG9zZSgpOworCWluZGVudF92YWxpZGF0ZShpYywgImdlbmVyYXRlX2VudW0iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKG9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSkKK3sKKwlvdXQgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworCXN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKG91dCk7CisJZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0ZW51bSk7CisKKwlvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgZW5kbDsKKwlzY29wZV91cChvdXQpOworCisJdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisJdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisKKwlmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikKKwl7CisJCWdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgKmNfaXRlcik7CisJCWludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisJCW91dCA8PCBpbmRlbnQoKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIiwiIDw8IGVuZGw7CisJfQorCisJc2NvcGVfZG93bihvdXQpOworCWVuZF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykKK3sKKyAgICBpZiAoY29uc3RzLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICcvJyArIHByb2dyYW1fbmFtZV8gKyAiLkNvbnN0YW50cy5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgICBnZW5lcmF0ZV9jb25zdHMoZl9jb25zdHMsIGNvbnN0cyk7CisKKyAgICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhvc3RyZWFtJiBvdXQsIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKQoreworICAgIGlmIChjb25zdHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvdXQgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbmV0Y29yZV90eXBlX3VzaW5ncygpIDw8IGVuZGw7CisKKyAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIiA8PCBlbmRsOworCisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gZmFsc2U7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICpjX2l0ZXIpOworICAgICAgICBpZiAocHJpbnRfY29uc3RfdmFsdWUob3V0LCAoKmNfaXRlciktPmdldF9uYW1lKCksICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwgZmFsc2UpKQorICAgICAgICB7CisgICAgICAgICAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmVlZF9zdGF0aWNfY29uc3RydWN0b3IpCisgICAgeworICAgICAgICBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihvdXQsIGNvbnN0cyk7CisgICAgfQorCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIGVuZF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQoreworICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSkpOworCisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0X2ZpZWxkKiBmaWVsZCA9IE5VTEw7CisKKyAgICAgICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQgPSAqZl9pdGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiLiIgPDwgcHJvcF9uYW1lKGZpZWxkKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgdF90eXBlKiBrdHlwZSA9IHN0YXRpY19jYXN0PHRfbWFwKj4odHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgICB0X3R5cGUqIHZ0eXBlID0gc3RhdGljX2Nhc3Q8dF9tYXAqPih0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSIgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIHRfdHlwZSogZXR5cGU7CisgICAgICAgIGlmICh0eXBlLT5pc19saXN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV0eXBlID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGV0eXBlID0gc3RhdGljX2Nhc3Q8dF9zZXQqPih0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiLkFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykuY19zdHIoKSA8PCAiQ29uc3RhbnRzKCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikKKyAgICB7CisgICAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgICAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwsIGJvb2wgbmVlZHR5cGUpCit7CisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gIWluX3N0YXRpYzsKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICghZGVmdmFsIHx8IG5lZWR0eXBlKQorICAgIHsKKyAgICAgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAiIiA6IHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gInB1YmxpYyBjb25zdCAiIDogInB1YmxpYyBzdGF0aWMgIikgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgeworICAgICAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgIG91dCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChkZWZ2YWwgJiYgIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbjsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQoreworICAgICh2b2lkKW5hbWU7CisgICAgb3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgc3dpdGNoICh0YmFzZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIHJlbmRlciA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUsIHRydWUsIHRydWUpOworICAgICAgICByZW5kZXIgPDwgdDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBpZiAodW5pb25fICYmIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uKHRzdHJ1Y3QpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pCit7CisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pCit7CisgICAgaW50IGljID0gaW5kZW50X2NvdW50KCk7CisKKyAgICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKworICAgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICAgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IG5ldGNvcmVfdHlwZV91c2luZ3MoKSA8PCBuZXRjb3JlX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKworICAgIGZfc3RydWN0LmNsb3NlKCk7CisKKyAgICBpbmRlbnRfdmFsaWRhdGUoaWMsICJnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCIpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaW5fY2xhc3MsIGJvb2wgaXNfcmVzdWx0KQoreworICAgIGlmICghaW5fY2xhc3MpCisgICAgeworICAgICAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0c3RydWN0KTsKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCk7CisKKyAgICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgIWlzX2V4Y2VwdGlvbikKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICAgIH0KKworICAgIGJvb2wgaXNfZmluYWwgPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCk7CisKKyAgICBzdHJpbmcgc2hhcnBfc3RydWN0X25hbWUgPSBjaGVja19hbmRfY29ycmVjdF9zdHJ1Y3RfbmFtZShub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiIDw8IHNoYXJwX3N0cnVjdF9uYW1lIDw8ICIgOiAiOworCisgICAgaWYgKGlzX2V4Y2VwdGlvbikKKyAgICB7CisgICAgICAgIG91dCA8PCAiVEV4Y2VwdGlvbiwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIlRCYXNlIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgICAgLy8gbWFrZSBwcml2YXRlIG1lbWJlcnMgd2l0aCBwdWJsaWMgUHJvcGVydGllcworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICAvLyBpZiB0aGUgZmllbGQgaXMgcmVxdWllZCwgdGhlbiB3ZSB1c2UgYXV0by1wcm9wZXJ0aWVzCisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSAmJiAoIW51bGxhYmxlXyB8fCBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIG91dCA8PCBlbmRsOworCisgICAgYm9vbCBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICAgIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IGZhbHNlOworICAgIGJvb2wgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICptX2l0ZXIpOworICAgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIHRydWUpOworICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7CisgICAgICAgIGlmIChpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaGFzX2RlZmF1bHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGdlbmVyYXRlX2lzc2V0ID0gKG51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzKSB8fCAoIW51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyk7CisgICAgaWYgKGdlbmVyYXRlX2lzc2V0KQorICAgIHsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFNZW1iZXIoT3JkZXIgPSAxKV0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgSXNzZXQgX19pc3NldDsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBzdHJ1Y3QgSXNzZXQiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICAgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKKyAgICAgICAgICAgIC8vIGlmIGl0IGlzIG5vdCByZXF1aXJlZCwgaWYgaXQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBJc3NldAorICAgICAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAorICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFNZW1iZXJdIiA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgIGlmIChnZW5lcmF0ZV9pc3NldCAmJiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIjcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgqbV9pdGVyKTsKKyAgICAgICAgICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKm1faXRlcik7CisgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IG51bGxhYmxlLCB0aGVuIHdlIGdlbmVyYXRlIElzc2V0CisgICAgICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sIFNob3VsZFNlcmlhbGl6ZSIgPDwgcHJvcF9uYW1lKCptX2l0ZXIpIDw8ICIoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiNlbmRyZWdpb24gWG1sU2VyaWFsaXplciBzdXBwb3J0IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXZSBhbHdheXMgd2FudCBhIGRlZmF1bHQsIG5vIGFyZ3VtZW50IGNvbnN0cnVjdG9yIGZvciBSZWFkaW5nCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCBzaGFycF9zdHJ1Y3RfbmFtZSA8PCAiKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKQorICAgICAgICB7CisgICAgICAgICAgICB0ID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odCktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgcHJvcF9uYW1lKCptX2l0ZXIpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLl8iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAvLyBPcHRpb25hbHMgd2l0aCBkZWZhdWx0cyBhcmUgbWFya2VkIHNldAorICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmIChoYXNfcmVxdWlyZWRfZmllbGRzKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCBzaGFycF9zdHJ1Y3RfbmFtZSA8PCAiKCI7CisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKm1faXRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKSA6IHRoaXMoKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgqbV9pdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCBwcm9wX25hbWUoKm1faXRlcikgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgICAgaWYgKGlzX3Jlc3VsdCkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGlmIChoYXNoY29kZV8pCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9lcXVhbHMob3V0LCB0c3RydWN0KTsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfaGFzaGNvZGUob3V0LCB0c3RydWN0KTsKKyAgICB9CisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBnZW5lcmF0ZSBhIGNvcnJlc3BvbmRpbmcgV0NGIGZhdWx0IHRvIHdyYXAgdGhlIGV4Y2VwdGlvbgorICAgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiBpc19leGNlcHRpb24pCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3djZmZhdWx0KG91dCwgdHN0cnVjdCk7CisgICAgfQorCisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QpOworICAgIGlmICghaW5fY2xhc3MpCisgICAgeworICAgICAgICBlbmRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV93Y2ZmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7CisKKyAgICBib29sIGlzX2ZpbmFsID0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJGYXVsdCIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAgIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2sgUmVhZEFzeW5jKFRQcm90b2NvbCBpcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0KKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgqZl9pdGVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpZWxkID0gYXdhaXQgaXByb3QuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCpmX2l0ZXIpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisgICAgICAgIGlmIChpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6ICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCpmX2l0ZXIpOworICAgICAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCpmX2l0ZXIpOworICAgICAgICAgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghaXNfcmVxdWlyZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlIGlmIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG51bGxhYmxlXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIih0aGlzLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIih0aGlzLl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gIW51bGxhYmxlXyAmJiB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIlwiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkU3RvcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgYm9vbCB1c2VGaXJzdEZsYWcgPSBmYWxzZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIF9fZmlyc3QgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIHVzZUZpcnN0RmxhZyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYm9vbCBoYWRfcmVxdWlyZWQgPSBmYWxzZTsgLy8gc2V0IHRvIHRydWUgYWZ0ZXIgZmlyc3QgcmVxdWlyZWQgZmllbGQgaGFzIGJlZW4gcHJvY2Vzc2VkCisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpOworICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKTsKKyAgICAgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHVzZUZpcnN0RmxhZyAmJiAoIWhhZF9yZXF1aXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYoIV9fZmlyc3QpIHsgc2IuQXBwZW5kKFwiLCBcIik7IH0iIDw8IGVuZGw7CisgICAgICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19maXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKFwiIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIjogXCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKFwiLCAiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiOiBcIik7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIj09IG51bGwgPyBcIjxudWxsPlwiIDogIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIi5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaGFkX3JlcXVpcmVkID0gdHJ1ZTsgLy8gbm93IF9fZmlyc3QgbXVzdCBiZSBmYWxzZSwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpdCBhbnltb3JlCisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZChcIilcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2IuVG9TdHJpbmcoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKQoreworICAgIGludCBpYyA9IGluZGVudF9jb3VudCgpOworCisgICAgc3RyaW5nIGZfdW5pb25fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHR1bmlvbi0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdW5pb247CisKKyAgICBmX3VuaW9uLm9wZW4oZl91bmlvbl9uYW1lLmNfc3RyKCkpOworCisgICAgZl91bmlvbiA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBuZXRjb3JlX3R5cGVfdXNpbmdzKCkgPDwgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fZGVmaW5pdGlvbihmX3VuaW9uLCB0dW5pb24pOworCisgICAgZl91bmlvbi5jbG9zZSgpOworCisgICAgaW5kZW50X3ZhbGlkYXRlKGljLCAiZ2VuZXJhdGVfbmV0Y29yZV91bmlvbi4iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKQoreworICAgIC8vIExldCdzIGRlZmluZSB0aGUgY2xhc3MgZmlyc3QKKyAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIDogVEFic3RyYWN0QmFzZSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgdFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgcmVhZG9ubHkgaW50IElzc2V0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFic3RyYWN0IG9iamVjdCBEYXRhIHsgZ2V0OyB9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIihpbnQgaXNzZXQpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiSXNzZXQgPSBpc3NldDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGNsYXNzIF9fX3VuZGVmaW5lZCA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBvYmplY3QgRGF0YSB7IGdldCB7IHJldHVybiBudWxsOyB9IH0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBfX191bmRlZmluZWQoKSA6IGJhc2UoMCkge30iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsIFwiQ2Fubm90IHBlcnNpc3QgYW4gdW5pb24gdHlwZSB3aGljaCBpcyBub3Qgc2V0LlwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHVuaW9uLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9jbGFzcyhvdXQsIHR1bmlvbiwgKCpmX2l0ZXIpKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX3JlYWRlcihvdXQsIHR1bmlvbik7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZW5kX25ldGNvcmVfbmFtZXNwYWNlKG91dCk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbl9jbGFzcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24sIHRfZmllbGQqIHRmaWVsZCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIgQXNfIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnZXQiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICgiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICIgPT0gSXNzZXQpID8gKCIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIilEYXRhIDogZGVmYXVsdCgiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorCQk8PCBlbmRsOworCQorCQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGNsYXNzICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgOiAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBfZGF0YTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBvYmplY3QgRGF0YSB7IGdldCB7IHJldHVybiBfZGF0YTsgfSB9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIgZGF0YSkgOiBiYXNlKCI8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy5fZGF0YSA9IGRhdGE7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0QmVnaW5Bc3luYyhzdHJ1YywgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLklEID0gIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCB0ZmllbGQsICJfZGF0YSIsIHRydWUsIHRydWUpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9lcXVhbHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3QgdGhhdCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgb3RoZXIgPSB0aGF0IGFzICIgPDwgY2hlY2tfYW5kX2NvcnJlY3Rfc3RydWN0X25hbWUobm9ybWFsaXplX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKFJlZmVyZW5jZUVxdWFscyh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICI7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICImJiAiOworICAgICAgICB9CisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID09IG90aGVyLl9faXNzZXQuIgorICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgJiYgKCghX19pc3NldC4iCisgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB8fCAoIjsKKyAgICAgICAgfQorICAgICAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19iaW5hcnkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJUQ29sbGVjdGlvbnMuRXF1YWxzKCI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIlN5c3RlbS5PYmplY3QuRXF1YWxzKCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIsIG90aGVyLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikiOworICAgICAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkgJiYgIShudWxsYWJsZV8gJiYgIWZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSkpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIikpKSI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZpcnN0KQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaW50IGhhc2hjb2RlID0gMDsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ1bmNoZWNrZWQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImhhc2hjb2RlID0gKGhhc2hjb2RlICogMzk3KSBeICI7CisgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG51bGxhYmxlXykKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiID09IG51bGwgPyAwIDogIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCFfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID8gMCA6ICI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoVENvbGxlY3Rpb25zLkdldEhhc2hDb2RlKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikpIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIi5HZXRIYXNoQ29kZSgpKSI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBoYXNoY29kZTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkKK3sKKyAgICBpbnQgaWMgPSBpbmRlbnRfY291bnQoKTsKKworICAgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIuY3MiOworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlOworICAgIGZfc2VydmljZS5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgICAgZl9zZXJ2aWNlIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IG5ldGNvcmVfdHlwZV91c2luZ3MoKSA8PCBuZXRjb3JlX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgICAgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2UoZl9zZXJ2aWNlKTsKKworICAgIGZfc2VydmljZSA8PCBpbmRlbnQoKSA8PCAicHVibGljIHBhcnRpYWwgY2xhc3MgIiA8PCBub3JtYWxpemVfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UoZl9zZXJ2aWNlLCB0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQoZl9zZXJ2aWNlLCB0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIoZl9zZXJ2aWNlLCB0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKGZfc2VydmljZSwgdHNlcnZpY2UpOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2UgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBlbmRfbmV0Y29yZV9uYW1lc3BhY2UoZl9zZXJ2aWNlKTsKKyAgICBmX3NlcnZpY2UuY2xvc2UoKTsKKworICAgIGluZGVudF92YWxpZGF0ZShpYywgImdlbmVyYXRlX3NlcnZpY2UuIik7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIHN0cmluZyBleHRlbmRzID0gIiI7CisgICAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgICAgICBleHRlbmRzX2lmYWNlID0gIiA6ICIgKyBleHRlbmRzICsgIi5JQXN5bmMiOworICAgIH0KKworICAgIC8vb3V0IDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgdHNlcnZpY2UpOworCisgICAgaWYgKHdjZl8pCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltTZXJ2aWNlQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSUFzeW5jIiA8PCBleHRlbmRzX2lmYWNlIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCAqZl9pdGVyKTsKKworICAgICAgICAvLyBpZiB3ZSdyZSB1c2luZyBXQ0YsIGFkZCB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVzCisgICAgICAgIGlmICh3Y2ZfKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltPcGVyYXRpb25Db250cmFjdF0iIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbRmF1bHRDb250cmFjdCh0eXBlb2YoIiArIHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiRmF1bHQpKV0iIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkKK3sKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24ob3V0LCB0cywgZmFsc2UsIHRydWUpOworICAgICAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG91dCwgKmZfaXRlcik7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkKK3sKKyAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICAgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50LCAiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBleHRlbmRzX2NsaWVudCA9ICJUQmFzZUNsaWVudCwgSURpc3Bvc2FibGUsICI7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsIHRzZXJ2aWNlKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGNsYXNzIENsaWVudCA6ICIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIklBc3luYyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdG9jb2wpIDogdGhpcyhwcm90b2NvbCwgcHJvdG9jb2wpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCkgOiBiYXNlKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSIKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY3Rpb25zX2l0ZXJhdG9yOworCisgICAgZm9yIChmdW5jdGlvbnNfaXRlcmF0b3IgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25zX2l0ZXJhdG9yICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbnNfaXRlcmF0b3IpCisgICAgeworICAgICAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9IGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmMoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfbmFtZSgpKTsKKworICAgICAgICAvLyBhc3luYworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZnVuY3Rpb25zX2l0ZXJhdG9yLCAiIikgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X25hbWUoKSArICJBcmdzIjsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IE91dHB1dFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5jdGlvbl9uYW1lCisgICAgICAgICAgICA8PCAiXCIsICIgPDwgKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9uZXdheSIgOiAiVE1lc3NhZ2VUeXBlLkNhbGwiKSA8PCAiLCBTZXFJZCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICAgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9hcmdsaXN0KCk7CisgICAgICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisKKyAgICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgPSAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgYXJncy5Xcml0ZUFzeW5jKE91dHB1dFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgT3V0cHV0UHJvdG9jb2wuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IE91dHB1dFByb3RvY29sLlRyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCEoKmZ1bmN0aW9uc19pdGVyYXRvciktPmlzX29uZXdheSgpKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X25hbWUoKSArICJSZXN1bHQiOworICAgICAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgICAgICAgIHRfc3RydWN0KiB4cyA9ICgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhciBtc2cgPSBhd2FpdCBJbnB1dFByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChtc2cuVHlwZSA9PSBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHggPSBhd2FpdCBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZEFzeW5jKElucHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgSW5wdXRQcm90b2NvbC5SZWFkTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyb3cgeDsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgcmVzdWx0LlJlYWRBc3luYyhJbnB1dFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IElucHV0UHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBpZiAoISgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChudWxsYWJsZV8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9yZXR1cm50eXBlKCkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2VzcyAhPSBudWxsKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LlN1Y2Nlc3MuSGFzVmFsdWUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdC5TdWNjZXNzLlZhbHVlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0LlN1Y2Nlc3M7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChudWxsYWJsZV8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiAhPSBudWxsKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQsIFwiIgorICAgICAgICAgICAgICAgICAgICA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIHN0cmluZyBleHRlbmRzID0gIiI7CisgICAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpCisgICAgeworICAgICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICAgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Bc3luY1Byb2Nlc3NvciwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBjbGFzcyBBc3luY1Byb2Nlc3NvciA6ICIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIklUQXN5bmNQcm9jZXNzb3IiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJQXN5bmMgX2lBc3luYzsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIEFzeW5jUHJvY2Vzc29yKElBc3luYyBpQXN5bmMpIjsKKworICAgIGlmICghZXh0ZW5kcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICIgOiBiYXNlKGlBc3luYykiOworICAgIH0KKworICAgIG91dCA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoaUFzeW5jID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlBc3luYykpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJfaUFzeW5jID0gaUFzeW5jOyIgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF9bXCIiIDw8IGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmMoZnVuY3Rpb25fbmFtZSkgPDwgIlwiXSA9ICIgPDwgZnVuY3Rpb25fbmFtZSA8PCAiX1Byb2Nlc3NBc3luYzsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBkZWxlZ2F0ZSBUYXNrIFByb2Nlc3NGdW5jdGlvbihpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPiBwcm9jZXNzTWFwXyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPigpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gYXdhaXQgUHJvY2Vzc0FzeW5jKGlwcm90LCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBuZXcgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGF3YWl0IFByb2Nlc3NBc3luYyhpcHJvdCwgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgbmV3IGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZyA9IGF3YWl0IGlwcm90LlJlYWRNZXNzYWdlQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlByb2Nlc3NGdW5jdGlvbiBmbjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBvdXQgZm4pOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZm4gPT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpcHJvdCwgVFR5cGUuU3RydWN0LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhciB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIgKyBtc2cuTmFtZSArIFwiJ1wiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCB4LldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LlRyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKElPRXhjZXB0aW9uKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25fYXN5bmMob3V0LCB0c2VydmljZSwgKmZfaXRlcik7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKQoreworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgeworICAgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICAgIH0KKworICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24ob3V0LCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikKK3sKKyAgICAodm9pZCl0c2VydmljZTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICJfUHJvY2Vzc0FzeW5jKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJBcmdzIjsKKyAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJSZXN1bHQiOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGFyZ3MuUmVhZEFzeW5jKGlwcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCAicmVzdWx0LlN1Y2Nlc3MgPSAiOworICAgIH0KKworICAgIG91dCA8PCAiYXdhaXQgX2lBc3luYy4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIkFzeW5jKCI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKKyAgICAgICAgaWYgKG51bGxhYmxlXyAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIi5WYWx1ZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisKKyAgICBpZiAoIWZpcnN0KQorICAgIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgfQorCisgICAgb3V0IDw8ICJjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKFwiIgorICAgICAgICAgICAgICAgIDw8IGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmModGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SZXBseSwgc2VxaWQpLCBjYW5jZWxsYXRpb25Ub2tlbik7ICIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IHJlc3VsdC5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKEV4Y2VwdGlvbiBleCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkNvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKFwiRXJyb3Igb2NjdXJyZWQgaW4gcHJvY2Vzc29yOlwiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIkNvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGV4LlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgIHsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yLFwiIEludGVybmFsIGVycm9yLlwiKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZShcIiIgPDwgY29ycmVjdF9mdW5jdGlvbl9uYW1lX2Zvcl9hc3luYyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCisgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIHNlcWlkKSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IHguV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuVHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfdW5pb25fcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbikKK3sKKyAgICAvLyBUaGFua3MgdG8gVEhSSUZULTE3NjgsIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgdW5pb24KKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0dW5pb24tPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RhdGljIGFzeW5jIFRhc2s8IiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIj4gUmVhZEFzeW5jKFRQcm90b2NvbCBpcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgcmV0dmFsOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJURmllbGQgZmllbGQgPSBhd2FpdCBpcHJvdC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgLy8gd2UgY2Fubm90IGhhdmUgdGhlIGZpcnN0IGZpZWxkIGJlIGEgc3RvcCAtLSB3ZSBtdXN0IGhhdmUgYSBzaW5nbGUgZmllbGQgZGVmaW5lZAorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAoZmllbGQuSUQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRlbXA7IiA8PCBlbmRsOworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInRlbXAiLCB0cnVlKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR2YWwgPSBuZXcgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIih0ZW1wKTsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiBhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpcHJvdCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6ICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJyZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgoYXdhaXQgaXByb3QuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbikpLlR5cGUgIT0gVFR5cGUuU3RvcCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIC8vIGVuZCBvZiBlbHNlIGZvciBUU3RvcAorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4LCBib29sIGlzX3Byb3BlcnR5bGVzcykKK3sKKyAgICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyAoaXNfcHJvcGVydHlsZXNzID8gIiIgOiBwcm9wX25hbWUodGZpZWxkKSk7CisKKyAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsIHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSksIG5hbWUpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIjsKKworICAgICAgICBpZiAodHlwZS0+aXNfZW51bSgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIikiOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICJhd2FpdCBpcHJvdC4iOworCisgICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkQm9vbEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTY0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWREb3VibGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIlJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KQoreworICAgIGlmICh1bmlvbl8gJiYgdHN0cnVjdC0+aXNfdW5pb24oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IGF3YWl0ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIuUmVhZEFzeW5jKGlwcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0ICIgPDwgcHJlZml4IDw8ICIuUmVhZEFzeW5jKGlwcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0cmluZyBvYmo7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb2JqID0gdG1wKCJfbWFwIik7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG9iaiA9IHRtcCgiX3NldCIpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gYXdhaXQgaXByb3QuUmVhZE1hcEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBhd2FpdCBpcHJvdC5SZWFkU2V0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gYXdhaXQgaXByb3QuUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLkNvdW50OyArKyIgPDwgaSA8PCAiKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLCBwcmVmaXgpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpLCBwcmVmaXgpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpLCBwcmVmaXgpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZE1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZFNldEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KQoreworICAgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisKKyAgICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgICAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpCit7CisgICAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgICAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXgpCit7CisgICAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgICAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgsIGJvb2wgaXNfZWxlbWVudCwgYm9vbCBpc19wcm9wZXJ0eWxlc3MpCit7CisgICAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyAoaXNfcHJvcGVydHlsZXNzID8gIiIgOiBwcm9wX25hbWUodGZpZWxkKSk7CisKKyAgICBpZiAodHlwZS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCBzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuIjsKKworICAgICAgICBzdHJpbmcgbnVsbGFibGVfbmFtZSA9IG51bGxhYmxlXyAmJiAhaXNfZWxlbWVudCAmJiAhZmllbGRfaXNfcmVxdWlyZWQodGZpZWxkKSA/IG5hbWUgKyAiLlZhbHVlIiA6IG5hbWU7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeUFzeW5jKCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmdBc3luYygiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlQm9vbEFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGVBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlSTE2QXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUkzMkFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVJNjRBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlQXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiV3JpdGVJMzJBc3luYygoaW50KSIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFICclcyVzJyBUWVBFICclcydcbiIsIHByZWZpeC5jX3N0cigpLCB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpCit7CisgICAgKHZvaWQpdHN0cnVjdDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0ICIgPDwgcHJlZml4IDw8ICIuV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1hcEJlZ2luQXN5bmMobmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgPDwgIi5Db3VudCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTZXRCZWdpbkFzeW5jKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLkNvdW50KSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVMaXN0QmVnaW5Bc3luYyhuZXcgVExpc3QoIgorICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKHN0YXRpY19jYXN0PHRfbGlzdCo+KHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLkNvdW50KSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLktleXMpIjsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZShzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKHN0YXRpY19jYXN0PHRfbGlzdCo+KHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLCBpdGVyLCBwcmVmaXgpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKSwgaXRlcik7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpLCBpdGVyKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWFwRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVNldEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTGlzdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBpdGVyLCBzdHJpbmcgbWFwKQoreworICAgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgdHJ1ZSk7CisgICAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpCit7CisgICAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKQoreworICAgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBnZW5lcmF0ZUlzc2V0KQoreworICAgIGdlbmVyYXRlX25ldGNvcmVfcHJvcGVydHkob3V0LCB0ZmllbGQsIGlzUHVibGljLCBnZW5lcmF0ZUlzc2V0LCAiXyIpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCwgc3RyaW5nIGZpZWxkUHJlZml4KQoreworICAgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiBpc1B1YmxpYykKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFNZW1iZXIoT3JkZXIgPSAwKV0iIDw8IGVuZGw7CisgICAgfQorICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCh0ZmllbGQpOworICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCh0ZmllbGQpOworICAgIGlmICgobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCkgfHwgaXNfcmVxdWlyZWQpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgKGlzUHVibGljID8gInB1YmxpYyAiIDogInByaXZhdGUgIikgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBpc19yZXF1aXJlZCkgPDwgIiAiIDw8IHByb3BfbmFtZSh0ZmllbGQpIDw8ICIgeyBnZXQ7IHNldDsgfSIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpICA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UsIHRydWUpIDw8ICIgIiA8PCBwcm9wX25hbWUodGZpZWxkKSA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnZXQiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBib29sIHVzZV9udWxsYWJsZSA9IGZhbHNlOworICAgICAgICBpZiAobnVsbGFibGVfKQorICAgICAgICB7CisgICAgICAgICAgICB0X3R5cGUqIHR0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgICAgICAgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0dHlwZSktPmdldF90eXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzZV9udWxsYWJsZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHR5cGUpLT5nZXRfYmFzZSgpICE9IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNldCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGlmICh1c2VfbnVsbGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0ZUlzc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHZhbHVlLkhhc1ZhbHVlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHZhbHVlLkhhc1ZhbHVlKSB0aGlzLiIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHZhbHVlLlZhbHVlOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0ZUlzc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIoc3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkKK3sKKyAgICBzdHJpbmcgc3RyID0gZnJvbU5hbWU7CisgICAgaWYgKHN0ci5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKKyAgICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOworCisgICAgLy8gaWYgdGhlIGZpcnN0IGxldHRlciBpcyBhIG51bWJlciwgd2UgYWRkIGFuIGFkZGl0aW9uYWwgdW5kZXJzY29yZSBpbiBmcm9udCBvZiBpdAorICAgIGNoYXIgYyA9IHN0ci5hdCgwKTsKKyAgICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKQorICAgIHsKKyAgICAgICAgc3RyID0gIl8iICsgc3RyOworICAgIH0KKworICAgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKQorICAgIHsKKyAgICAgICAgYyA9IHN0ci5hdChpKTsKKyAgICAgICAgaWYgKCgnQScgPiBjIHx8IGMgPiAnWicpICYmICgnYScgPiBjIHx8IGMgPiAneicpICYmICgnMCcgPiBjIHx8IGMgPiAnOScpICYmICdfJyAhPSBjKQorICAgICAgICB7CisgICAgICAgICAgICBzdHIucmVwbGFjZShpLCAxLCAiXyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0cjsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUpCit7CisgICAgaWYgKG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgdGhyb3cgImludGVybmFsIGVycm9yOiBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKSBubyBzY29wZSBhY3RpdmUiOworICAgIH0KKworICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICAgIGlmIChhY3RpdmUuc2NvcGVfbWVtYmVyICE9IHNjb3BlKQorICAgIHsKKyAgICAgICAgdGhyb3cgImludGVybmFsIGVycm9yOiBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKSBjYWxsZWQgZm9yIHdyb25nIHN0cnVjdCI7CisgICAgfQorCisgICAgbWVtYmVyX21hcHBpbmdfc2NvcGVzLnBvcF9iYWNrKCk7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZXRfbWFwcGVkX21lbWJlcl9uYW1lKHN0cmluZyBuYW1lKQoreworICAgIGlmICghbWVtYmVyX21hcHBpbmdfc2NvcGVzLmVtcHR5KCkpCisgICAgeworICAgICAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IGFjdGl2ZS5tYXBwaW5nX3RhYmxlLmZpbmQobmFtZSk7CisgICAgICAgIGlmIChhY3RpdmUubWFwcGluZ190YWJsZS5lbmQoKSAhPSBpdGVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorCisgICAgcHZlcmJvc2UoIm5vIG1hcHBpbmcgZm9yIG1lbWJlciAlc1xuIiwgbmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gbmFtZTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QsIHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycywgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RuYW1lKQoreworICAgIC8vIGJlZ2luIG5ldyBzY29wZQorICAgIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXBsYWNlX2JhY2soKTsKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICBhY3RpdmUuc2NvcGVfbWVtYmVyID0gc2NvcGU7CisKKyAgICAvLyBjdXJyZW50IEMjIGdlbmVyYXRvciBwb2xpY3k6CisgICAgLy8gLSBwcm9wIG5hbWVzIGFyZSBhbHdheXMgcmVuZGVyZWQgd2l0aCBhbiBVcHBlcmNhc2UgZmlyc3QgbGV0dGVyCisgICAgLy8gLSBzdHJ1Y3QgbmFtZXMgYXJlIHVzZWQgYXMgZ2l2ZW4KKyAgICBzdGQ6OnNldDxzdHJpbmc+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+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBuZXRjb3JlLAorICAgICJDIyIsCisgICAgIiAgICB3Y2Y6ICAgICAgICAgICAgIEFkZHMgYmluZGluZ3MgZm9yIFdDRiB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKKyAgICAiICAgIHNlcmlhbDogICAgICAgICAgQWRkIHNlcmlhbGl6YXRpb24gc3VwcG9ydCB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKKyAgICAiICAgIG51bGxhYmxlOiAgICAgICAgVXNlIG51bGxhYmxlIHR5cGVzIGZvciBwcm9wZXJ0aWVzLlxuIgorICAgICIgICAgaGFzaGNvZGU6ICAgICAgICBHZW5lcmF0ZSBhIGhhc2hjb2RlIGFuZCBlcXVhbHMgaW1wbGVtZW50YXRpb24gZm9yIGNsYXNzZXMuXG4iCisgICAgIiAgICB1bmlvbjogICAgICAgICAgIFVzZSBuZXcgdW5pb24gdHlwaW5nLCB3aGljaCBpbmNsdWRlcyBhIHN0YXRpYyByZWFkIGZ1bmN0aW9uIGZvciB1bmlvbiB0eXBlcy5cbiIKKykKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTg5ODBhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKK2NsYXNzIHRfbmV0Y29yZV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yCit7CisKKyAgICBzdHJ1Y3QgbWVtYmVyX21hcHBpbmdfc2NvcGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBtZW1iZXJfbWFwcGluZ19zY29wZSgpIDogc2NvcGVfbWVtYmVyKDApIHsgfQorICAgICAgICB2b2lkKiBzY29wZV9tZW1iZXI7CisgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gbWFwcGluZ190YWJsZTsKKyAgICB9OworCitwdWJsaWM6CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLCBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpOworCisgICAgYm9vbCBpc193Y2ZfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfbnVsbGFibGVfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfaGFzaGNvZGVfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfc2VyaWFsaXplX2VuYWJsZWQoKSBjb25zdDsKKyAgICBib29sIGlzX3VuaW9uX2VuYWJsZWQoKSBjb25zdDsKKyAgICBtYXA8c3RyaW5nLCBpbnQ+IGdldF9rZXl3b3Jkc19saXN0KCkgY29uc3Q7CisKKyAgICAvLyBvdmVycmlkZXMKKyAgICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgICAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKyAgICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgICAgdm9pZCBnZW5lcmF0ZV9jb25zdHMob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgICAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICAgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgICB2b2lkIGdlbmVyYXRlX2VudW0ob3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKTsKKyAgICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBpbmNsdWRlSXNzZXQgPSB0cnVlLCBzdHJpbmcgZmllbGRQcmVmaXggPSAiIik7CisgICAgYm9vbCBwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwgPSBmYWxzZSwgYm9vbCBuZWVkdHlwZSA9IGZhbHNlKTsKKyAgICBzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICAgIHZvaWQgcHJpbnRfY29uc3RfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgICAgdm9pZCBwcmludF9jb25zdF9kZWZfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLCBib29sIGluX2NsYXNzID0gZmFsc2UsIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2NsYXNzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbiwgdF9maWVsZCogdGZpZWxkKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfd2NmZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9lcXVhbHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICAgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4ID0gIiIsIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIGxpc3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXggPSAiIiwgYm9vbCBpc19lbGVtZW50ID0gZmFsc2UsIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIsIHN0cmluZyBtYXApOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0cmluZyBpdGVyKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcik7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpOworICAgIHZvaWQgZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBjb25zdCBzdHJpbmcmIGNvbW1lbnRfc3RhcnQsIGNvbnN0IHN0cmluZyYgbGluZV9wcmVmaXgsIGNvbnN0IHN0cmluZyYgY29udGVudHMsIGNvbnN0IHN0cmluZyYgY29tbWVudF9lbmQpOworICAgIHZvaWQgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KTsKKyAgICB2b2lkIGVuZF9uZXRjb3JlX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpOworCisgICAgc3RyaW5nIG5ldGNvcmVfdHlwZV91c2luZ3MoKSBjb25zdDsKKyAgICBzdHJpbmcgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgY29uc3Q7CisKKyAgICBzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY291bnRhaW5lciA9IGZhbHNlLCBib29sIGluX2luaXQgPSBmYWxzZSwgYm9vbCBpbl9wYXJhbSA9IGZhbHNlLCBib29sIGlzX3JlcXVpcmVkID0gZmFsc2UpOworICAgIHN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsIGJvb2wgaW5fcGFyYW0gPSBmYWxzZSwgYm9vbCBpc19yZXF1aXJlZCA9IGZhbHNlKTsKKyAgICBzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICBzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICAgIHN0cmluZyBwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcgPSBmYWxzZSk7CisgICAgc3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKKworcHJpdmF0ZToKKyAgICBzdHJpbmcgbmFtZXNwYWNlX25hbWVfOworICAgIHN0cmluZyBuYW1lc3BhY2VfZGlyXzsKKworICAgIGJvb2wgbnVsbGFibGVfOworICAgIGJvb2wgdW5pb25fOworICAgIGJvb2wgaGFzaGNvZGVfOworICAgIGJvb2wgc2VyaWFsaXplXzsKKyAgICBib29sIHdjZl87CisKKyAgICBzdHJpbmcgd2NmX25hbWVzcGFjZV87CisgICAgbWFwPHN0cmluZywgaW50PiBuZXRjb3JlX2tleXdvcmRzOworICAgIHZlY3RvcjxtZW1iZXJfbWFwcGluZ19zY29wZT4gbWVtYmVyX21hcHBpbmdfc2NvcGVzOworCisgICAgdm9pZCBpbml0X2tleXdvcmRzKCk7CisgICAgc3RyaW5nIG5vcm1hbGl6ZV9uYW1lKHN0cmluZyBuYW1lKTsKKyAgICBzdHJpbmcgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihzdHJpbmcgY29uc3QmIGZyb21OYW1lKTsKKyAgICB2b2lkIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSk7CisgICAgdm9pZCBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUpOworICAgIHN0cmluZyBnZXRfbWFwcGVkX21lbWJlcl9uYW1lKHN0cmluZyBvbGRuYW1lKTsKK307CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldHN0ZF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldHN0ZF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhMWRkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0c3RkX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMwMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9uZXRzdGRfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCisvL1RPRE86IGNoZWNrIGZvciBpbmRlbnRhdGlvbgorLy9UT0RPOiBEbyB3ZSBuZWVkIHNlcUlkXyBpbiBnZW5lcmF0aW9uPworCit0X25ldHN0ZF9nZW5lcmF0b3I6OnRfbmV0c3RkX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLCBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKK3sKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworCisgICAgdW5pb25fID0gZmFsc2U7CisgICAgc2VyaWFsaXplXyA9IGZhbHNlOworICAgIHdjZl8gPSBmYWxzZTsKKyAgICB3Y2ZfbmFtZXNwYWNlXy5jbGVhcigpOworCisgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGZvciAoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJ1bmlvbiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuaW9uXyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgic2VyaWFsIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VyaWFsaXplXyA9IHRydWU7CisgICAgICAgICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsgLy8gc2luY2UgdGhlcmUgY2FuIGJlIG9ubHkgb25lIG5hbWVzcGFjZQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoIndjZiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdjZl8gPSB0cnVlOworICAgICAgICAgICAgd2NmX25hbWVzcGFjZV8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gbmV0c3RkOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW5ldHN0ZCI7Cit9CisKK3N0YXRpYyBzdHJpbmcgY29ycmVjdF9mdW5jdGlvbl9uYW1lX2Zvcl9hc3luYyhzdHJpbmcgY29uc3QmIGZ1bmN0aW9uX25hbWUpCit7CisgICAgc3RyaW5nIGNvbnN0IGFzeW5jX2VuZCA9ICJBc3luYyI7CisgICAgc2l6ZV90IGkgPSBmdW5jdGlvbl9uYW1lLmZpbmQoYXN5bmNfZW5kKTsKKyAgICBpZiAoaSAhPSBzdHJpbmc6Om5wb3MpCisgICAgeworICAgICAgICByZXR1cm4gZnVuY3Rpb25fbmFtZSArIGFzeW5jX2VuZDsKKyAgICB9CisKKyAgICByZXR1cm4gZnVuY3Rpb25fbmFtZTsKK30KKworLyoqCisqIFxicmllZiBTZWFyY2ggYW5kIHJlcGxhY2UgIl9hcmdzIiBzdWJzdHJpbmcgaW4gc3RydWN0IG5hbWUgaWYgZXhpc3QgKGZvciBDIyBjbGFzcyBuYW1pbmcpCisqIFxwYXJhbSBzdHJ1Y3RfbmFtZQorKiBccmV0dXJuIE1vZGlmaWVkIHN0cnVjdCBuYW1lICgiU3RydWN0X2FyZ3MiIC0+ICJTdHJ1Y3RBcmdzIikgb3Igb3JpZ2luYWwgbmFtZQorKi8KK3N0YXRpYyBzdHJpbmcgY2hlY2tfYW5kX2NvcnJlY3Rfc3RydWN0X25hbWUoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSkKK3sKKyAgICBzdHJpbmcgYXJnc19lbmQgPSAiX2FyZ3MiOworICAgIHNpemVfdCBpID0gc3RydWN0X25hbWUuZmluZChhcmdzX2VuZCk7CisgICAgaWYgKGkgIT0gc3RyaW5nOjpucG9zKQorICAgIHsKKyAgICAgICAgc3RyaW5nIG5ld19zdHJ1Y3RfbmFtZSA9IHN0cnVjdF9uYW1lOworICAgICAgICBuZXdfc3RydWN0X25hbWUucmVwbGFjZShpLCBhcmdzX2VuZC5sZW5ndGgoKSwgIkFyZ3MiKTsKKyAgICAgICAgcmV0dXJuIG5ld19zdHJ1Y3RfbmFtZTsKKyAgICB9CisKKyAgICBzdHJpbmcgcmVzdWx0X2VuZCA9ICJfcmVzdWx0IjsKKyAgICBzaXplX3QgaiA9IHN0cnVjdF9uYW1lLmZpbmQocmVzdWx0X2VuZCk7CisgICAgaWYgKGogIT0gc3RyaW5nOjpucG9zKQorICAgIHsKKyAgICAgICAgc3RyaW5nIG5ld19zdHJ1Y3RfbmFtZSA9IHN0cnVjdF9uYW1lOworICAgICAgICBuZXdfc3RydWN0X25hbWUucmVwbGFjZShqLCByZXN1bHRfZW5kLmxlbmd0aCgpLCAiUmVzdWx0Iik7CisgICAgICAgIHJldHVybiBuZXdfc3RydWN0X25hbWU7CisgICAgfQorCisgICAgcmV0dXJuIHN0cnVjdF9uYW1lOworfQorCitzdGF0aWMgYm9vbCBmaWVsZF9oYXNfZGVmYXVsdCh0X2ZpZWxkKiB0ZmllbGQpIHsgcmV0dXJuIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTDsgfQorCitzdGF0aWMgYm9vbCBmaWVsZF9pc19yZXF1aXJlZCh0X2ZpZWxkKiB0ZmllbGQpIHsgcmV0dXJuIHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQ7IH0KKworc3RhdGljIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKQoreworICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0dHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cmluZygpOworfQorCitib29sIHRfbmV0c3RkX2dlbmVyYXRvcjo6aXNfd2NmX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiB3Y2ZfOyB9CisKK2Jvb2wgdF9uZXRzdGRfZ2VuZXJhdG9yOjppc19zZXJpYWxpemVfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIHNlcmlhbGl6ZV87IH0KKworYm9vbCB0X25ldHN0ZF9nZW5lcmF0b3I6OmlzX3VuaW9uX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiB1bmlvbl87IH0KKworbWFwPHN0cmluZywgaW50PiB0X25ldHN0ZF9nZW5lcmF0b3I6OmdldF9rZXl3b3Jkc19saXN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbmV0c3RkX2tleXdvcmRzOworfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKQoreworICAgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgICAvLyBmb3IgdXNhZ2Ugb2YgY3NoYXJwIG5hbWVzcGFjZXMgaW4gdGhyaWZ0IGZpbGVzIChmcm9tIGZpbGVzIGZvciBjc2hhcnApCisgICAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoIm5ldHN0ZCIpOworICAgIGlmIChuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJuZXRzdGQiKTsKKyAgICB9CisKKyAgICBzdHJpbmcgZGlyID0gbmFtZXNwYWNlX25hbWVfOworICAgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpLmNfc3RyKCk7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgICAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpCisgICAgeworICAgICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgICB9CisgICAgaWYgKGRpci5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgfQorCisgICAgbmFtZXNwYWNlX2Rpcl8gPSBzdWJkaXI7CisgICAgaW5pdF9rZXl3b3JkcygpOworCisgICAgd2hpbGUgKCFtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpLnNjb3BlX21lbWJlcik7CisgICAgfQorCisgICAgcHZlcmJvc2UoIi5ORVQgU3RhbmRhcmQgb3B0aW9uczpcbiIpOworICAgIHB2ZXJib3NlKCItIHVuaW9uIC4uLi4uLiAlc1xuIiwgKGlzX3VuaW9uX2VuYWJsZWQoKSA/ICJPTiIgOiAib2ZmIikpOworICAgIHB2ZXJib3NlKCItIHNlcmlhbGl6ZSAuLiAlc1xuIiwgKGlzX3NlcmlhbGl6ZV9lbmFibGVkKCkgPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSB3Y2YgLi4uLi4uLi4gJXNcbiIsIChpc193Y2ZfZW5hYmxlZCgpID8gIk9OIiA6ICJvZmYiKSk7Cit9CisKK3N0cmluZyB0X25ldHN0ZF9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9uYW1lKHN0cmluZyBuYW1lKQoreworICAgIHN0cmluZyB0bXAobmFtZSk7CisgICAgdHJhbnNmb3JtKHRtcC5iZWdpbigpLCB0bXAuZW5kKCksIHRtcC5iZWdpbigpLCBzdGF0aWNfY2FzdDxpbnQoKikoaW50KT4odG9sb3dlcikpOworCisgICAgLy8gdW4tY29uZmxpY3Qga2V5d29yZHMgYnkgcHJlZml4aW5nIHdpdGggIkAiCisgICAgaWYgKG5ldHN0ZF9rZXl3b3Jkcy5maW5kKHRtcCkgIT0gbmV0c3RkX2tleXdvcmRzLmVuZCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJAIiArIG5hbWU7CisgICAgfQorCisgICAgLy8gbm8gY2hhbmdlcyBuZWNlc3NhcnkKKyAgICByZXR1cm4gbmFtZTsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmluaXRfa2V5d29yZHMoKQoreworICAgIG5ldHN0ZF9rZXl3b3Jkcy5jbGVhcigpOworCisgICAgLy8gQyMga2V5d29yZHMKKyAgICBuZXRzdGRfa2V5d29yZHNbImFic3RyYWN0Il0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siYXMiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJiYXNlIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siYm9vbCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImJyZWFrIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siYnl0ZSJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImNhc2UiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJjYXRjaCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImNoYXIiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJjaGVja2VkIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siY2xhc3MiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJjb25zdCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImNvbnRpbnVlIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siZGVjaW1hbCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImRlZmF1bHQiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJkZWxlZ2F0ZSJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImRvIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siZG91YmxlIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siZWxzZSJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImVudW0iXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJldmVudCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImV4cGxpY2l0Il0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siZXh0ZXJuIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siZmFsc2UiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJmaW5hbGx5Il0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siZml4ZWQiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJmbG9hdCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImZvciJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImZvcmVhY2giXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJnb3RvIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siaWYiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJpbXBsaWNpdCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImluIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siaW50Il0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siaW50ZXJmYWNlIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siaW50ZXJuYWwiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJpcyJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImxvY2siXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJsb25nIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sibmFtZXNwYWNlIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sibmV3Il0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sibnVsbCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbIm9iamVjdCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbIm9wZXJhdG9yIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sib3V0Il0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sib3ZlcnJpZGUiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJwYXJhbXMiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJwcml2YXRlIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sicHJvdGVjdGVkIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sicHVibGljIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sicmVhZG9ubHkiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJyZWYiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJyZXR1cm4iXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJzYnl0ZSJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbInNlYWxlZCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbInNob3J0Il0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sic2l6ZW9mIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sic3RhY2thbGxvYyJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbInN0YXRpYyJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbInN0cmluZyJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbInN0cnVjdCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbInN3aXRjaCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbInRoaXMiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJ0aHJvdyJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbInRydWUiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJ0cnkiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJ0eXBlb2YiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJ1aW50Il0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sidWxvbmciXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJ1bmNoZWNrZWQiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJ1bnNhZmUiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJ1c2hvcnQiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJ1c2luZyJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbInZpcnR1YWwiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJ2b2lkIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sidm9sYXRpbGUiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJ3aGlsZSJdID0gMTsKKworICAgIC8vIEMjIGNvbnRleHR1YWwga2V5d29yZHMKKyAgICBuZXRzdGRfa2V5d29yZHNbImFkZCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImFsaWFzIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siYXNjZW5kaW5nIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siYXN5bmMiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJhd2FpdCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImRlc2NlbmRpbmciXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJkeW5hbWljIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siZnJvbSJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImdldCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImdsb2JhbCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImdyb3VwIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1siaW50byJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbImpvaW4iXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJsZXQiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJvcmRlcmJ5Il0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sicGFydGlhbCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbInJlbW92ZSJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbInNlbGVjdCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbInNldCJdID0gMTsKKyAgICBuZXRzdGRfa2V5d29yZHNbInZhbHVlIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sidmFyIl0gPSAxOworICAgIG5ldHN0ZF9rZXl3b3Jkc1sid2hlcmUiXSA9IDE7CisgICAgbmV0c3RkX2tleXdvcmRzWyJ5aWVsZCJdID0gMTsKKworICAgIG5ldHN0ZF9rZXl3b3Jkc1sid2hlbiJdID0gMTsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OnN0YXJ0X25ldHN0ZF9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KQoreworICAgIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgIm5hbWVzcGFjZSAiIDw8IG5hbWVzcGFjZV9uYW1lXyA8PCBlbmRsOworICAgICAgICBzY29wZV91cChvdXQpOworICAgIH0KK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmVuZF9uZXRzdGRfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkKK3sKKyAgICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KK30KKworc3RyaW5nIHRfbmV0c3RkX2dlbmVyYXRvcjo6bmV0c3RkX3R5cGVfdXNpbmdzKCkgY29uc3QKK3sKKyAgICBzdHJpbmcgbmFtZXNwYWNlcyA9CisgICAgICAgICJ1c2luZyBTeXN0ZW07XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5UZXh0O1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLklPO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZztcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQ7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iOworCisgICAgaWYgKGlzX3djZl9lbmFibGVkKCkpCisgICAgeworICAgICAgICBuYW1lc3BhY2VzICs9ICJ1c2luZyBTeXN0ZW0uU2VydmljZU1vZGVsO1xuIjsKKyAgICAgICAgbmFtZXNwYWNlcyArPSAidXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjtcbiI7CisgICAgfQorCisgICAgcmV0dXJuIG5hbWVzcGFjZXMgKyBlbmRsOworfQorCitzdHJpbmcgdF9uZXRzdGRfZ2VuZXJhdG9yOjpuZXRzdGRfdGhyaWZ0X3VzaW5ncygpIGNvbnN0Cit7CisgICAgc3RyaW5nIG5hbWVzcGFjZXMgPQorICAgICAgICAidXNpbmcgVGhyaWZ0LlByb3RvY29sO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlByb3RvY29sLkVudGl0aWVzO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlByb3RvY29sLlV0aWxpdGllcztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0LkNsaWVudDtcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5UcmFuc3BvcnQuU2VydmVyO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlByb2Nlc3NvcjtcbiI7CisKKyAgICByZXR1cm4gbmFtZXNwYWNlcyArIGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKQoreworfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKQoreworICAgICh2b2lkKXR0eXBlZGVmOworfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKQoreworICAgIGludCBpYyA9IGluZGVudF9jb3VudCgpOworICAgIHN0cmluZyBmX2VudW1fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgdGVudW0tPmdldF9uYW1lKCkgKyAiLmNzIjsKKworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICAgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisgICAgZ2VuZXJhdGVfZW51bShmX2VudW0sIHRlbnVtKTsKKworICAgIGZfZW51bS5jbG9zZSgpOworICAgIGluZGVudF92YWxpZGF0ZShpYywgImdlbmVyYXRlX2VudW0iKTsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0ob3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKQoreworICAgIG91dCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgICAgc3RhcnRfbmV0c3RkX25hbWVzcGFjZShvdXQpOworICAgIGdlbmVyYXRlX25ldHN0ZF9kb2Mob3V0LCB0ZW51bSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldHN0ZF9kb2Mob3V0LCAqY19pdGVyKTsKKyAgICAgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgZW5kX25ldHN0ZF9uYW1lc3BhY2Uob3V0KTsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykKK3sKKyAgICBpZiAoY29uc3RzLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICcvJyArIHByb2dyYW1fbmFtZV8gKyAiLkNvbnN0YW50cy5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgICBnZW5lcmF0ZV9jb25zdHMoZl9jb25zdHMsIGNvbnN0cyk7CisKKyAgICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKG9zdHJlYW0mIG91dCwgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMpCit7CisgICAgaWYgKGNvbnN0cy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG91dCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBuZXRzdGRfdHlwZV91c2luZ3MoKSA8PCBlbmRsOworCisgICAgc3RhcnRfbmV0c3RkX25hbWVzcGFjZShvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIiA8PCBlbmRsOworCisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gZmFsc2U7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRzdGRfZG9jKG91dCwgKmNfaXRlcik7CisgICAgICAgIGlmIChwcmludF9jb25zdF92YWx1ZShvdXQsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmNfaXRlciktPmdldF92YWx1ZSgpLCBmYWxzZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuZWVkX3N0YXRpY19jb25zdHJ1Y3RvcikKKyAgICB7CisgICAgICAgIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKG91dCwgY29uc3RzKTsKKyAgICB9CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgZW5kX25ldHN0ZF9uYW1lc3BhY2Uob3V0KTsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQoreworICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSkpOworCisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0X2ZpZWxkKiBmaWVsZCA9IE5VTEw7CisKKyAgICAgICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQgPSAqZl9pdGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiLiIgPDwgcHJvcF9uYW1lKGZpZWxkKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgdF90eXBlKiBrdHlwZSA9IHN0YXRpY19jYXN0PHRfbWFwKj4odHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgICB0X3R5cGUqIHZ0eXBlID0gc3RhdGljX2Nhc3Q8dF9tYXAqPih0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSIgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIHRfdHlwZSogZXR5cGU7CisgICAgICAgIGlmICh0eXBlLT5pc19saXN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV0eXBlID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGV0eXBlID0gc3RhdGljX2Nhc3Q8dF9zZXQqPih0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiLkFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3RhdGljICIgPDwgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKS5jX3N0cigpIDw8ICJDb25zdGFudHMoKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKQorICAgIHsKKyAgICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworfQorCitib29sIHRfbmV0c3RkX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsLCBib29sIG5lZWR0eXBlKQoreworICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9ICFpbl9zdGF0aWM7CisgICAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBpZiAoIWRlZnZhbCB8fCBuZWVkdHlwZSkKKyAgICB7CisgICAgICAgIG91dCA8PCAoaW5fc3RhdGljID8gIiIgOiB0eXBlLT5pc19iYXNlX3R5cGUoKSA/ICJwdWJsaWMgY29uc3QgIiA6ICJwdWJsaWMgc3RhdGljICIpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgIHsKKyAgICAgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgICAgICBvdXQgPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChkZWZ2YWwgJiYgIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbjsKK30KKworc3RyaW5nIHRfbmV0c3RkX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpCit7CisgICAgKHZvaWQpbmFtZTsKKyAgICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgcmVuZGVyIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIHJlbmRlciA8PCB0OworICAgIH0KKworICAgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgaWYgKGlzX3VuaW9uX2VuYWJsZWQoKSAmJiB0c3RydWN0LT5pc191bmlvbigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0c3RkX3VuaW9uKHRzdHJ1Y3QpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRzdGRfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKQoreworICAgIGdlbmVyYXRlX25ldHN0ZF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldHN0ZF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKQoreworICAgIGludCBpYyA9IGluZGVudF9jb3VudCgpOworCisgICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuY3MiOworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisKKyAgICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBuZXRzdGRfdHlwZV91c2luZ3MoKSA8PCBuZXRzdGRfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9uZXRzdGRfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisKKyAgICBmX3N0cnVjdC5jbG9zZSgpOworCisgICAgaW5kZW50X3ZhbGlkYXRlKGljLCAiZ2VuZXJhdGVfbmV0c3RkX3N0cnVjdCIpOworfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0c3RkX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGluX2NsYXNzLCBib29sIGlzX3Jlc3VsdCkKK3sKKyAgICBpZiAoIWluX2NsYXNzKQorICAgIHsKKyAgICAgICAgc3RhcnRfbmV0c3RkX25hbWVzcGFjZShvdXQpOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0c3RkX2RvYyhvdXQsIHRzdHJ1Y3QpOworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0KTsKKworICAgIGlmICgoaXNfc2VyaWFsaXplX2VuYWJsZWQoKSB8fCBpc193Y2ZfZW5hYmxlZCgpKSAmJiAhaXNfZXhjZXB0aW9uKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbRGF0YUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CisgICAgfQorCisgICAgYm9vbCBpc19maW5hbCA9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKTsKKworICAgIHN0cmluZyBzaGFycF9zdHJ1Y3RfbmFtZSA9IGNoZWNrX2FuZF9jb3JyZWN0X3N0cnVjdF9uYW1lKG5vcm1hbGl6ZV9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIgPDwgc2hhcnBfc3RydWN0X25hbWUgPDwgIiA6ICI7CisKKyAgICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJURXhjZXB0aW9uLCAiOworICAgIH0KKworICAgIG91dCA8PCAiVEJhc2UiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgICAvLyBtYWtlIHByaXZhdGUgbWVtYmVycyB3aXRoIHB1YmxpYyBQcm9wZXJ0aWVzCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICB7CisgICAgICAgIC8vIGlmIHRoZSBmaWVsZCBpcyByZXF1aXJlZCwgdGhlbiB3ZSB1c2UgYXV0by1wcm9wZXJ0aWVzCisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIG91dCA8PCBlbmRsOworCisgICAgYm9vbCBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICAgIGJvb2wgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRzdGRfZG9jKG91dCwgKm1faXRlcik7CisgICAgICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOworICAgICAgICBpZiAoaXNfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhc19yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBnZW5lcmF0ZV9pc3NldCA9IGhhc19ub25fcmVxdWlyZWRfZmllbGRzOworICAgIGlmIChnZW5lcmF0ZV9pc3NldCkKKyAgICB7CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgICBpZiAoaXNfc2VyaWFsaXplX2VuYWJsZWQoKSB8fCBpc193Y2ZfZW5hYmxlZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhTWVtYmVyKE9yZGVyID0gMSldIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIElzc2V0IF9faXNzZXQ7IiA8PCBlbmRsOworICAgICAgICBpZiAoaXNfc2VyaWFsaXplX2VuYWJsZWQoKSB8fCBpc193Y2ZfZW5hYmxlZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RydWN0IElzc2V0IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgICAgICAgICAvLyBpZiBpdCBpcyByZXF1aXJlZCwgZG9uJ3QgbmVlZCBJc3NldCBmb3IgdGhhdCB2YXJpYWJsZQorICAgICAgICAgICAgLy8gaWYgaXQgaXMgbm90IHJlcXVpcmVkLCBpZiBpdCBoYXMgYSBkZWZhdWx0IHZhbHVlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIElzc2V0CisgICAgICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpc19zZXJpYWxpemVfZW5hYmxlZCgpIHx8IGlzX3djZl9lbmFibGVkKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhTWVtYmVyXSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbCAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICBpZiAoZ2VuZXJhdGVfaXNzZXQgJiYgKGlzX3NlcmlhbGl6ZV9lbmFibGVkKCkgfHwgaXNfd2NmX2VuYWJsZWQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiI3JlZ2lvbiBYbWxTZXJpYWxpemVyIHN1cHBvcnQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKm1faXRlcik7CisgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbCBTaG91bGRTZXJpYWxpemUiIDw8IHByb3BfbmFtZSgqbV9pdGVyKSA8PCAiKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIjZW5kcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UgYWx3YXlzIHdhbnQgYSBkZWZhdWx0LCBubyBhcmd1bWVudCBjb25zdHJ1Y3RvciBmb3IgUmVhZGluZworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgc2hhcnBfc3RydWN0X25hbWUgPDwgIigpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICB7CisgICAgICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdCA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHQpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArIHByb3BfbmFtZSgqbV9pdGVyKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy5fIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgLy8gT3B0aW9uYWxzIHdpdGggZGVmYXVsdHMgYXJlIG1hcmtlZCBzZXQKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAoaGFzX3JlcXVpcmVkX2ZpZWxkcykKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgc2hhcnBfc3RydWN0X25hbWUgPDwgIigiOworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCptX2l0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIikgOiB0aGlzKCkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKm1faXRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgcHJvcF9uYW1lKCptX2l0ZXIpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGdlbmVyYXRlX25ldHN0ZF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgICAgaWYgKGlzX3Jlc3VsdCkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldHN0ZF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRzdGRfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICAgIH0KKyAgICBnZW5lcmF0ZV9uZXRzdGRfc3RydWN0X2VxdWFscyhvdXQsIHRzdHJ1Y3QpOworICAgIGdlbmVyYXRlX25ldHN0ZF9zdHJ1Y3RfaGFzaGNvZGUob3V0LCB0c3RydWN0KTsKKyAgICBnZW5lcmF0ZV9uZXRzdGRfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gZ2VuZXJhdGUgYSBjb3JyZXNwb25kaW5nIFdDRiBmYXVsdCB0byB3cmFwIHRoZSBleGNlcHRpb24KKyAgICBpZiAoKGlzX3NlcmlhbGl6ZV9lbmFibGVkKCkgfHwgaXNfd2NmX2VuYWJsZWQoKSkgJiYgaXNfZXhjZXB0aW9uKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0c3RkX3djZmZhdWx0KG91dCwgdHN0cnVjdCk7CisgICAgfQorCisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QpOworICAgIGlmICghaW5fY2xhc3MpCisgICAgeworICAgICAgICBlbmRfbmV0c3RkX25hbWVzcGFjZShvdXQpOworICAgIH0KK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldHN0ZF93Y2ZmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7CisKKyAgICBib29sIGlzX2ZpbmFsID0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJGYXVsdCIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAgIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0c3RkX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrIFJlYWRBc3luYyhUUHJvdG9jb2wgaXByb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBhcmVuJ3QgaW4gX19pc3NldCwgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKmZfaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJURmllbGQgZmllbGQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmaWVsZCA9IGF3YWl0IGlwcm90LlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgqZl9pdGVyKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworICAgICAgICBpZiAoaXNfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpcHJvdCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRzdGRfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoc3RydWMsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoZmllbGRzLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7CisgICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKmZfaXRlcik7CisgICAgICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgICAgICAgICAgIGlmIChudWxsX2FsbG93ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGlmICghaXNfcmVxdWlyZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRTdG9wQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldHN0ZF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoc3RydWMsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoZmllbGRzLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7CisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UgaWYiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQgPDwgIih0aGlzLl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIlwiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkU3RvcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRzdGRfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGJvb2wgdXNlRmlyc3RGbGFnID0gZmFsc2U7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBfX2ZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB1c2VGaXJzdEZsYWcgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJvb2wgaGFkX3JlcXVpcmVkID0gZmFsc2U7IC8vIHNldCB0byB0cnVlIGFmdGVyIGZpcnN0IHJlcXVpcmVkIGZpZWxkIGhhcyBiZWVuIHByb2Nlc3NlZAorCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKKyAgICAgICAgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHVzZUZpcnN0RmxhZyAmJiAoIWhhZF9yZXF1aXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYoIV9fZmlyc3QpIHsgc2IuQXBwZW5kKFwiLCBcIik7IH0iIDw8IGVuZGw7CisgICAgICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19maXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKFwiIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIjogXCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKFwiLCAiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiOiBcIik7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIj09IG51bGwgPyBcIjxudWxsPlwiIDogIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIi5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaGFkX3JlcXVpcmVkID0gdHJ1ZTsgLy8gbm93IF9fZmlyc3QgbXVzdCBiZSBmYWxzZSwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpdCBhbnltb3JlCisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZChcIilcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2IuVG9TdHJpbmcoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRzdGRfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbikKK3sKKyAgICBpbnQgaWMgPSBpbmRlbnRfY291bnQoKTsKKworICAgIHN0cmluZyBmX3VuaW9uX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0dW5pb24tPmdldF9uYW1lKCkpICsgIi5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3VuaW9uOworCisgICAgZl91bmlvbi5vcGVuKGZfdW5pb25fbmFtZS5jX3N0cigpKTsKKworICAgIGZfdW5pb24gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbmV0c3RkX3R5cGVfdXNpbmdzKCkgPDwgbmV0c3RkX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0c3RkX3VuaW9uX2RlZmluaXRpb24oZl91bmlvbiwgdHVuaW9uKTsKKworICAgIGZfdW5pb24uY2xvc2UoKTsKKworICAgIGluZGVudF92YWxpZGF0ZShpYywgImdlbmVyYXRlX25ldHN0ZF91bmlvbi4iKTsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldHN0ZF91bmlvbl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbikKK3sKKyAgICAvLyBMZXQncyBkZWZpbmUgdGhlIGNsYXNzIGZpcnN0CisgICAgc3RhcnRfbmV0c3RkX25hbWVzcGFjZShvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIDogVFVuaW9uQmFzZSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgdFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgcmVhZG9ubHkgaW50IElzc2V0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFic3RyYWN0IG9iamVjdCBEYXRhIHsgZ2V0OyB9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIihpbnQgaXNzZXQpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiSXNzZXQgPSBpc3NldDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGNsYXNzIF9fX3VuZGVmaW5lZCA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBvYmplY3QgRGF0YSB7IGdldCB7IHJldHVybiBudWxsOyB9IH0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBfX191bmRlZmluZWQoKSA6IGJhc2UoMCkge30iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsIFwiQ2Fubm90IHBlcnNpc3QgYW4gdW5pb24gdHlwZSB3aGljaCBpcyBub3Qgc2V0LlwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHVuaW9uLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0c3RkX3VuaW9uX2NsYXNzKG91dCwgdHVuaW9uLCAoKmZfaXRlcikpOworICAgIH0KKworICAgIGdlbmVyYXRlX25ldHN0ZF91bmlvbl9yZWFkZXIob3V0LCB0dW5pb24pOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGVuZF9uZXRzdGRfbmFtZXNwYWNlKG91dCk7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRzdGRfdW5pb25fY2xhc3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uLCB0X2ZpZWxkKiB0ZmllbGQpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIEFzXyIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ2V0IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAoIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiID09IElzc2V0KSA/ICgiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIpRGF0YSA6IGRlZmF1bHQoIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICAKKyAgICAKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIgX2RhdGE7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gX2RhdGE7IH0gfSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIGRhdGEpIDogYmFzZSgiPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwiKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuX2RhdGEgPSBkYXRhOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoc3RydWMsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5JRCA9ICIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdGZpZWxkLCAiX2RhdGEiLCB0cnVlKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRTdG9wQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRzdGRfc3RydWN0X2VxdWFscyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCB0aGF0KSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBvdGhlciA9IHRoYXQgYXMgIiA8PCBjaGVja19hbmRfY29ycmVjdF9zdHJ1Y3RfbmFtZShub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoUmVmZXJlbmNlRXF1YWxzKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIjsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiYmICI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PSBvdGhlci5fX2lzc2V0LiIKKyAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpICYmICgoIV9faXNzZXQuIgorICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgfHwgKCI7CisgICAgICAgIH0KKyAgICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfYmluYXJ5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiVENvbGxlY3Rpb25zLkVxdWFscygiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJTeXN0ZW0uT2JqZWN0LkVxdWFscygiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLCBvdGhlci4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpIjsKKyAgICAgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIikpKSI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZpcnN0KQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0c3RkX3N0cnVjdF9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImludCBoYXNoY29kZSA9IDA7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidW5jaGVja2VkIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJoYXNoY29kZSA9IChoYXNoY29kZSAqIDM5NykgXiAiOworICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCFfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID8gMCA6ICI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoVENvbGxlY3Rpb25zLkdldEhhc2hDb2RlKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikpIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIi5HZXRIYXNoQ29kZSgpKSI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBoYXNoY29kZTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIGludCBpYyA9IGluZGVudF9jb3VudCgpOworCisgICAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2U7CisgICAgZl9zZXJ2aWNlLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgICBmX3NlcnZpY2UgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbmV0c3RkX3R5cGVfdXNpbmdzKCkgPDwgbmV0c3RkX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgICAgc3RhcnRfbmV0c3RkX25hbWVzcGFjZShmX3NlcnZpY2UpOworCisgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgcGFydGlhbCBjbGFzcyAiIDw8IG5vcm1hbGl6ZV9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcihmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMoZl9zZXJ2aWNlLCB0c2VydmljZSk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGVuZF9uZXRzdGRfbmFtZXNwYWNlKGZfc2VydmljZSk7CisgICAgZl9zZXJ2aWNlLmNsb3NlKCk7CisKKyAgICBpbmRlbnRfdmFsaWRhdGUoaWMsICJnZW5lcmF0ZV9zZXJ2aWNlLiIpOworfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIHN0cmluZyBleHRlbmRzID0gIiI7CisgICAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgICAgICBleHRlbmRzX2lmYWNlID0gIiA6ICIgKyBleHRlbmRzICsgIi5JQXN5bmMiOworICAgIH0KKworICAgIC8vb3V0IDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldHN0ZF9kb2Mob3V0LCB0c2VydmljZSk7CisKKyAgICBpZiAoaXNfd2NmX2VuYWJsZWQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW1NlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBJQXN5bmMiIDw8IGV4dGVuZHNfaWZhY2UgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRzdGRfZG9jKG91dCwgKmZfaXRlcik7CisKKyAgICAgICAgLy8gaWYgd2UncmUgdXNpbmcgV0NGLCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcworICAgICAgICBpZiAoaXNfd2NmX2VuYWJsZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbT3BlcmF0aW9uQ29udHJhY3RdIiA8PCBlbmRsOworCisgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0ZhdWx0Q29udHJhY3QodHlwZW9mKCIgKyB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSArICJGYXVsdCkpXSIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgICAgICBnZW5lcmF0ZV9uZXRzdGRfc3RydWN0X2RlZmluaXRpb24ob3V0LCB0cywgZmFsc2UsIHRydWUpOworICAgICAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG91dCwgKmZfaXRlcik7CisgICAgfQorfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIHN0cmluZyBleHRlbmRzID0gIiI7CisgICAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpCisgICAgeworICAgICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGV4dGVuZHNfY2xpZW50ID0gIlRCYXNlQ2xpZW50LCBJRGlzcG9zYWJsZSwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldHN0ZF9kb2Mob3V0LCB0c2VydmljZSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBjbGFzcyBDbGllbnQgOiAiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICJJQXN5bmMiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIHByb3RvY29sKSA6IHRoaXMocHJvdG9jb2wsIHByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpbnB1dFByb3RvY29sLCBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wpIDogYmFzZShpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkiCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmN0aW9uc19pdGVyYXRvcjsKKworICAgIGZvciAoZnVuY3Rpb25zX2l0ZXJhdG9yID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uc19pdGVyYXRvciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25zX2l0ZXJhdG9yKQorICAgIHsKKyAgICAgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X25hbWUoKSk7CisKKyAgICAgICAgLy8gYXN5bmMKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZ1bmN0aW9uc19pdGVyYXRvciwgIiIpIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9uYW1lKCkgKyAiQXJncyI7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBPdXRwdXRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVuY3Rpb25fbmFtZQorICAgICAgICAgICAgPDwgIlwiLCAiIDw8ICgoKmZ1bmN0aW9uc19pdGVyYXRvciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PbmV3YXkiIDogIlRNZXNzYWdlVHlwZS5DYWxsIikgPDwgIiwgU2VxSWQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfYXJnbGlzdCgpOworICAgICAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworCisgICAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKSA8PCAiID0gIiA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGFyZ3MuV3JpdGVBc3luYyhPdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IE91dHB1dFByb3RvY29sLldyaXRlTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBPdXRwdXRQcm90b2NvbC5UcmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgIGlmICghKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5pc19vbmV3YXkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9uYW1lKCkgKyAiUmVzdWx0IjsKKyAgICAgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICAgICAgICB0X3N0cnVjdCogeHMgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgICAgICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgbXNnID0gYXdhaXQgSW5wdXRQcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAobXNnLlR5cGUgPT0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciB4ID0gYXdhaXQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWRBc3luYyhJbnB1dFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IElucHV0UHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocm93IHg7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IHJlc3VsdC5SZWFkQXN5bmMoSW5wdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBJbnB1dFByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgICAgICAgICAgaWYgKCEoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKnhfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0LCBcIiIKKyAgICAgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIHN0cmluZyBleHRlbmRzID0gIiI7CisgICAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpCisgICAgeworICAgICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICAgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Bc3luY1Byb2Nlc3NvciwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBjbGFzcyBBc3luY1Byb2Nlc3NvciA6ICIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIklUQXN5bmNQcm9jZXNzb3IiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJQXN5bmMgX2lBc3luYzsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIEFzeW5jUHJvY2Vzc29yKElBc3luYyBpQXN5bmMpIjsKKworICAgIGlmICghZXh0ZW5kcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICIgOiBiYXNlKGlBc3luYykiOworICAgIH0KKworICAgIG91dCA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoaUFzeW5jID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlBc3luYykpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJfaUFzeW5jID0gaUFzeW5jOyIgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF9bXCIiIDw8IGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmMoZnVuY3Rpb25fbmFtZSkgPDwgIlwiXSA9ICIgPDwgZnVuY3Rpb25fbmFtZSA8PCAiX1Byb2Nlc3NBc3luYzsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBkZWxlZ2F0ZSBUYXNrIFByb2Nlc3NGdW5jdGlvbihpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPiBwcm9jZXNzTWFwXyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPigpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gYXdhaXQgUHJvY2Vzc0FzeW5jKGlwcm90LCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBuZXcgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGF3YWl0IFByb2Nlc3NBc3luYyhpcHJvdCwgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgbmV3IGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZyA9IGF3YWl0IGlwcm90LlJlYWRNZXNzYWdlQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlByb2Nlc3NGdW5jdGlvbiBmbjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBvdXQgZm4pOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZm4gPT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpcHJvdCwgVFR5cGUuU3RydWN0LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhciB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIgKyBtc2cuTmFtZSArIFwiJ1wiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCB4LldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LlRyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKElPRXhjZXB0aW9uKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25fYXN5bmMob3V0LCB0c2VydmljZSwgKmZfaXRlcik7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pCit7CisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICAgIH0KKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfbmV0c3RkX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikKK3sKKyAgICAodm9pZCl0c2VydmljZTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICJfUHJvY2Vzc0FzeW5jKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJBcmdzIjsKKyAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJSZXN1bHQiOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGFyZ3MuUmVhZEFzeW5jKGlwcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCAicmVzdWx0LlN1Y2Nlc3MgPSAiOworICAgIH0KKworICAgIG91dCA8PCAiYXdhaXQgX2lBc3luYy4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIkFzeW5jKCI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKKyAgICB9CisKKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisKKyAgICBpZiAoIWZpcnN0KQorICAgIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgfQorCisgICAgb3V0IDw8ICJjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICAgICAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZShcIiIKKyAgICAgICAgICAgICAgICA8PCBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKSwgY2FuY2VsbGF0aW9uVG9rZW4pOyAiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCByZXN1bHQuV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh4cyk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChFeGNlcHRpb24gZXgpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJDb25zb2xlLkVycm9yLldyaXRlTGluZShcIkVycm9yIG9jY3VycmVkIGluIHByb2Nlc3NvcjpcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJDb25zb2xlLkVycm9yLldyaXRlTGluZShleC5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcixcIiBJbnRlcm5hbCBlcnJvci5cIik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UoXCIiIDw8IGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmModGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBzZXFpZCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCB4LldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LlRyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldHN0ZF91bmlvbl9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKQoreworICAgIC8vIFRoYW5rcyB0byBUSFJJRlQtMTc2OCwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIGluIHRoZSB1bmlvbgorICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHR1bmlvbi0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBzdGF0aWMgYXN5bmMgVGFzazwiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiPiBSZWFkQXN5bmMoVFByb3RvY29sIGlwcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiByZXR2YWw7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZFN0cnVjdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRGaWVsZCBmaWVsZCA9IGF3YWl0IGlwcm90LlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICAvLyB3ZSBjYW5ub3QgaGF2ZSB0aGUgZmlyc3QgZmllbGQgYmUgYSBzdG9wIC0tIHdlIG11c3QgaGF2ZSBhIHNpbmdsZSBmaWVsZCBkZWZpbmVkCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGVtcDsiIDw8IGVuZGw7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAidGVtcCIsIHRydWUpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHZhbCA9IG5ldyAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKHRlbXApOyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiIGF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IgorICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDogIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChhd2FpdCBpcHJvdC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSkuVHlwZSAhPSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgLy8gZW5kIG9mIGVsc2UgZm9yIFRTdG9wCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZFN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmV0dmFsOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCwgYm9vbCBpc19wcm9wZXJ0eWxlc3MpCit7CisgICAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgKGlzX3Byb3BlcnR5bGVzcyA/ICIiIDogcHJvcF9uYW1lKHRmaWVsZCkpOworCisgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCBzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICI7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICJhd2FpdCBpcHJvdC4iOworCisgICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkQm9vbEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTY0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWREb3VibGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIlJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpCit7CisgICAgaWYgKGlzX3VuaW9uX2VuYWJsZWQoKSAmJiB0c3RydWN0LT5pc191bmlvbigpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gYXdhaXQgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5SZWFkQXN5bmMoaXByb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgIiA8PCBwcmVmaXggPDwgIi5SZWFkQXN5bmMoaXByb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgb2JqOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG9iaiA9IHRtcCgiX21hcCIpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gYXdhaXQgaXByb3QuUmVhZE1hcEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBhd2FpdCBpcHJvdC5SZWFkU2V0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gYXdhaXQgaXByb3QuUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLkNvdW50OyArKyIgPDwgaSA8PCAiKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLCBwcmVmaXgpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpLCBwcmVmaXgpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpLCBwcmVmaXgpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZE1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZFNldEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpCit7CisgICAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICAgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKworICAgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KQoreworICAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICAgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXgpCit7CisgICAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgICAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCwgYm9vbCBpc19wcm9wZXJ0eWxlc3MpCit7CisgICAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyAoaXNfcHJvcGVydHlsZXNzID8gIiIgOiBwcm9wX25hbWUodGZpZWxkKSk7CisKKyAgICBpZiAodHlwZS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCBzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuIjsKKworICAgICAgICBzdHJpbmcgbnVsbGFibGVfbmFtZSA9IG5hbWU7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeUFzeW5jKCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmdBc3luYygiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlQm9vbEFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGVBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlSTE2QXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUkzMkFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVJNjRBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlQXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiV3JpdGVJMzJBc3luYygoaW50KSIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFICclcyVzJyBUWVBFICclcydcbiIsIHByZWZpeC5jX3N0cigpLCB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICAgIH0KK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICAodm9pZCl0c3RydWN0OworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgIiA8PCBwcmVmaXggPDwgIi5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNYXBCZWdpbkFzeW5jKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgIDw8ICIuQ291bnQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU2V0QmVnaW5Bc3luYyhuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5Db3VudCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTGlzdEJlZ2luQXN5bmMobmV3IFRMaXN0KCIKKyAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5Db3VudCksIGNhbmNlbGxhdGlvblRva2VuKTsiCisgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5LZXlzKSI7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZShzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKSwgaXRlciwgcHJlZml4KTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSksIGl0ZXIpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfbGlzdCo+KHR0eXBlKSwgaXRlcik7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUxpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBpdGVyLCBzdHJpbmcgbWFwKQoreworICAgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisgICAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikKK3sKKyAgICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikKK3sKKyAgICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBnZW5lcmF0ZUlzc2V0KQoreworICAgIGdlbmVyYXRlX25ldHN0ZF9wcm9wZXJ0eShvdXQsIHRmaWVsZCwgaXNQdWJsaWMsIGdlbmVyYXRlSXNzZXQsICJfIik7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRzdGRfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCwgc3RyaW5nIGZpZWxkUHJlZml4KQoreworICAgIGlmICgoaXNfc2VyaWFsaXplX2VuYWJsZWQoKSB8fCBpc193Y2ZfZW5hYmxlZCgpKSAmJiBpc1B1YmxpYykKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFNZW1iZXIoT3JkZXIgPSAwKV0iIDw8IGVuZGw7CisgICAgfQorICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCh0ZmllbGQpOworICAgIGlmIChpc19yZXF1aXJlZCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAoaXNQdWJsaWMgPyAicHVibGljICIgOiAicHJpdmF0ZSAiKSA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgIiB7IGdldDsgc2V0OyB9IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgKGlzUHVibGljID8gInB1YmxpYyAiIDogInByaXZhdGUgIikgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIgIiA8PCBwcm9wX25hbWUodGZpZWxkKSA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnZXQiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBib29sIHVzZV9udWxsYWJsZSA9IGZhbHNlOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNldCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGlmICh1c2VfbnVsbGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0ZUlzc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHZhbHVlLkhhc1ZhbHVlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHZhbHVlLkhhc1ZhbHVlKSB0aGlzLiIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHZhbHVlLlZhbHVlOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0ZUlzc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfbmV0c3RkX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihzdHJpbmcgY29uc3QmIGZyb21OYW1lKQoreworICAgIHN0cmluZyBzdHIgPSBmcm9tTmFtZTsKKyAgICBpZiAoc3RyLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKworICAgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICAgIGFzc2VydCgoJ0EnIDwgJ1onKSAmJiAoJ2EnIDwgJ3onKSAmJiAoJzAnIDwgJzknKSk7CisKKyAgICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgICAgY2hhciBjID0gc3RyLmF0KDApOworICAgIGlmICgoJzAnIDw9IGMpICYmIChjIDw9ICc5JykpCisgICAgeworICAgICAgICBzdHIgPSAiXyIgKyBzdHI7CisgICAgfQorCisgICAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpCisgICAgeworICAgICAgICBjID0gc3RyLmF0KGkpOworICAgICAgICBpZiAoKCdBJyA+IGMgfHwgYyA+ICdaJykgJiYgKCdhJyA+IGMgfHwgYyA+ICd6JykgJiYgKCcwJyA+IGMgfHwgYyA+ICc5JykgJiYgJ18nICE9IGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RyOworfQorCit2b2lkIHRfbmV0c3RkX2dlbmVyYXRvcjo6Y2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlKQoreworICAgIGlmIChtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgbm8gc2NvcGUgYWN0aXZlIjsKKyAgICB9CisKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICBpZiAoYWN0aXZlLnNjb3BlX21lbWJlciAhPSBzY29wZSkKKyAgICB7CisgICAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgY2FsbGVkIGZvciB3cm9uZyBzdHJ1Y3QiOworICAgIH0KKworICAgIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5wb3BfYmFjaygpOworfQorCitzdHJpbmcgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZXRfbWFwcGVkX21lbWJlcl9uYW1lKHN0cmluZyBuYW1lKQoreworICAgIGlmICghbWVtYmVyX21hcHBpbmdfc2NvcGVzLmVtcHR5KCkpCisgICAgeworICAgICAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IGFjdGl2ZS5tYXBwaW5nX3RhYmxlLmZpbmQobmFtZSk7CisgICAgICAgIGlmIChhY3RpdmUubWFwcGluZ190YWJsZS5lbmQoKSAhPSBpdGVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorCisgICAgcHZlcmJvc2UoIm5vIG1hcHBpbmcgZm9yIG1lbWJlciAlc1xuIiwgbmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gbmFtZTsKK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCwgdHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgdHN0cnVjdC0+Z2V0X25hbWUoKSk7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSkKK3sKKyAgICAvLyBiZWdpbiBuZXcgc2NvcGUKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wbGFjZV9iYWNrKCk7CisgICAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CisgICAgYWN0aXZlLnNjb3BlX21lbWJlciA9IHNjb3BlOworCisgICAgLy8gY3VycmVudCBDIyBnZW5lcmF0b3IgcG9saWN5OgorICAgIC8vIC0gcHJvcCBuYW1lcyBhcmUgYWx3YXlzIHJlbmRlcmVkIHdpdGggYW4gVXBwZXJjYXNlIGZpcnN0IGxldHRlcgorICAgIC8vIC0gc3RydWN0IG5hbWVzIGFyZSB1c2VkIGFzIGdpdmVuCisgICAgc3RkOjpzZXQ8c3RyaW5nPiB1c2VkX21lbWJlcl9uYW1lczsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLy8gcHJldmVudCBuYW1lIGNvbmZsaWN0cyB3aXRoIHN0cnVjdCAoQ1MwNTQyIGVycm9yKQorICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChzdHJ1Y3RuYW1lKTsKKworICAgIC8vIHByZXZlbnQgbmFtZSBjb25mbGljdHMgd2l0aCBrbm93biBtZXRob2RzIChUSFJJRlQtMjk0MikKKyAgICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQoIlJlYWQiKTsKKyAgICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQoIldyaXRlIik7CisKKyAgICBmb3IgKGl0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGl0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytpdGVyKQorICAgIHsKKyAgICAgICAgc3RyaW5nIG9sZG5hbWUgPSAoKml0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBzdHJpbmcgbmV3bmFtZSA9IHByb3BfbmFtZSgqaXRlciwgdHJ1ZSk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBuZXcgbmFtZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlcgorICAgICAgICAgICAgaWYgKHVzZWRfbWVtYmVyX25hbWVzLmZpbmQobmV3bmFtZSkgIT0gdXNlZF9tZW1iZXJfbmFtZXMuZW5kKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHZlcmJvc2UoInN0cnVjdCAlczogbWVtYmVyICVzIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgbWVtYmVyXG4iLCBzdHJ1Y3RuYW1lLmNfc3RyKCksIG5ld25hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbmV3bmFtZSArPSAnXyc7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFkZCBhbHdheXMsIHRoaXMgaGVscHMgdXMgdG8gZGV0ZWN0IGVkZ2UgY2FzZXMgbGlrZQorICAgICAgICAgICAgLy8gZGlmZmVyZW50IHNwZWxsaW5ncyAoImZvbyIgYW5kICJGb28iKSB3aXRoaW4gdGhlIHNhbWUgc3RydWN0CisgICAgICAgICAgICBwdmVyYm9zZSgic3RydWN0ICVzOiBtZW1iZXIgbWFwcGluZyAlcyA9PiAlc1xuIiwgc3RydWN0bmFtZS5jX3N0cigpLCBvbGRuYW1lLmNfc3RyKCksIG5ld25hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBhY3RpdmUubWFwcGluZ190YWJsZVtvbGRuYW1lXSA9IG5ld25hbWU7CisgICAgICAgICAgICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQobmV3bmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RyaW5nIHRfbmV0c3RkX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBzdXBwcmVzc19tYXBwaW5nKQoreworICAgIHN0cmluZyBuYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgaWYgKHN1cHByZXNzX21hcHBpbmcpCisgICAgeworICAgICAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbmFtZSA9IGdldF9tYXBwZWRfbWVtYmVyX25hbWUobmFtZSk7CisgICAgfQorICAgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9uZXRzdGRfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkKK3sKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgeworICAgICAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0dHlwZSkpOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICB0X21hcCogdG1hcCA9IHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpOworICAgICAgICByZXR1cm4gIkRpY3Rpb25hcnk8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpKSArICI+IjsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgdF9zZXQqIHRzZXQgPSBzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKTsKKyAgICAgICAgcmV0dXJuICJUSGFzaFNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICB0X2xpc3QqIHRsaXN0ID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpOworICAgICAgICByZXR1cm4gIkxpc3Q8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgICB9CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pCisgICAgeworICAgICAgICBzdHJpbmcgbnMgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJuZXRzdGQiKTsKKyAgICAgICAgaWYgKCFucy5lbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnMgKyAiLiIgKyBub3JtYWxpemVfbmFtZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpOworfQorCitzdHJpbmcgdF9uZXRzdGRfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpCit7CisgICAgc3dpdGNoICh0YmFzZS0+Z2V0X2Jhc2UoKSkKKyAgICB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICByZXR1cm4gInZvaWQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiYnl0ZVtdIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICAgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmV0dXJuICJib29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICByZXR1cm4gInNieXRlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgcmV0dXJuICJzaG9ydCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmV0dXJuICJsb25nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmV0dXJuICJkb3VibGUiOworICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UtPmdldF9iYXNlKCkpOworICAgIH0KK30KKworc3RyaW5nIHRfbmV0c3RkX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgaWYgKGluaXQpCisgICAgeworICAgICAgICB0X3R5cGUqIHR0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgICAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0dHlwZSktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiBmaWVsZF9oYXNfZGVmYXVsdCh0ZmllbGQpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR0eXBlKSArICIpMCI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIoKSI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIoKSI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworc3RyaW5nIHRfbmV0c3RkX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKK30KKworc3RyaW5nIHRfbmV0c3RkX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHN0cmluZyB0YXNrID0gIlRhc2siOworICAgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHRhc2sgKz0gIjwiICsgdHlwZV9uYW1lKHR0eXBlKSArICI+IjsKKyAgICB9CisKKyAgICBzdHJpbmcgcmVzdWx0ID0gdGFzayArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiQXN5bmMoIjsKKyAgICBzdHJpbmcgYXJncyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKyAgICByZXN1bHQgKz0gYXJnczsKKyAgICBpZiAoIWFyZ3MuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gIkNhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuID0gZGVmYXVsdChDYW5jZWxsYXRpb25Ub2tlbikpIjsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X25ldHN0ZF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgc3RyaW5nIHJlc3VsdCA9ICIiOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiICsgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfbmV0c3RkX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkKK3sKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZyI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuQm9vbCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkJ5dGUiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJUVHlwZS5NYXAiOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiVFR5cGUuU2V0IjsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKKyAgICB9CisKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRzdGRfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpCit7CisgICAgZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLy8vIDxzdW1tYXJ5PiIgKyBlbmRsLCAiLy8vICIsIGNvbnRlbnRzLCAiLy8vIDwvc3VtbWFyeT4iICsgZW5kbCk7Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRzdGRfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpCit7CisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBzdHJpbmcgY29tYmluZWRfbWVzc2FnZSA9IGZpZWxkLT5nZXRfZG9jKCkgKyBlbmRsICsgIjxzZWVhbHNvIGNyZWY9XCIiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiXCIvPiI7CisgICAgICAgIGdlbmVyYXRlX25ldHN0ZF9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRzdGRfZG9jKG91dCwgc3RhdGljX2Nhc3Q8dF9kb2MqPihmaWVsZCkpOworICAgIH0KK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldHN0ZF9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykKK3sKKyAgICBpZiAodGRvYy0+aGFzX2RvYygpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0c3RkX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRzdGRfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKQoreworICAgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkKKyAgICB7CisgICAgICAgIHN0cmluZ3N0cmVhbSBwczsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgICAgICAgIHBzIDw8IGVuZGwgPDwgIjxwYXJhbSBuYW1lPVwiIiA8PCBwLT5nZXRfbmFtZSgpIDw8ICJcIj4iOworICAgICAgICAgICAgaWYgKHAtPmhhc19kb2MoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgc3RyID0gcC0+Z2V0X2RvYygpOworICAgICAgICAgICAgICAgIHN0ci5lcmFzZShyZW1vdmUoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwgJ1xuJyksIHN0ci5lbmQoKSk7CisgICAgICAgICAgICAgICAgcHMgPDwgc3RyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHMgPDwgIjwvcGFyYW0+IjsKKyAgICAgICAgfQorCisgICAgICAgIGRvY3N0cmluZ19jb21tZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdW1tYXJ5PiIgKyBlbmRsICsgdGZ1bmN0aW9uLT5nZXRfZG9jKCkgKyAiPC9zdW1tYXJ5PiIgKyBwcy5zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpOworICAgIH0KK30KKwordm9pZCB0X25ldHN0ZF9nZW5lcmF0b3I6OmRvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgY29uc3Qgc3RyaW5nJiBjb21tZW50X3N0YXJ0LCBjb25zdCBzdHJpbmcmIGxpbmVfcHJlZml4LCBjb25zdCBzdHJpbmcmIGNvbnRlbnRzLCBjb25zdCBzdHJpbmcmIGNvbW1lbnRfZW5kKQoreworICAgIGlmIChjb21tZW50X3N0YXJ0ICE9ICIiKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGNvbW1lbnRfc3RhcnQ7CisgICAgfQorCisgICAgc3RyaW5nc3RyZWFtIGRvY3MoY29udGVudHMsIHN0ZDo6aW9zX2Jhc2U6OmluKTsKKworICAgIHdoaWxlICghKGRvY3MuZW9mKCkgfHwgZG9jcy5mYWlsKCkpKQorICAgIHsKKyAgICAgICAgY2hhciBsaW5lWzEwMjRdOworICAgICAgICBkb2NzLmdldGxpbmUobGluZSwgMTAyNCk7CisKKyAgICAgICAgLy8gSnVzdCBwcm50IGEgbmV3bGluZSB3aGVuIHRoZSBsaW5lICYgcHJlZml4IGFyZSBlbXB0eS4KKyAgICAgICAgaWYgKHN0cmxlbihsaW5lKSA9PSAwICYmIGxpbmVfcHJlZml4ID09ICIiICYmICFkb2NzLmVvZigpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdHJsZW4obGluZSkgPiAwIHx8ICFkb2NzLmVvZigpKQorICAgICAgICB7IC8vIHNraXAgdGhlIGVtcHR5IGxhc3QgbGluZQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGxpbmVfcHJlZml4IDw8IGxpbmUgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY29tbWVudF9lbmQgIT0gIiIpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgY29tbWVudF9lbmQ7CisgICAgfQorfQorCitzdHJpbmcgdF9uZXRzdGRfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkKK3sKKyAgICBzdHJpbmcgcGFja2FnZSA9ICIiOworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQorICAgIHsKKyAgICAgICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoIm5ldHN0ZCIpICsgIi4iOworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgbmV0c3RkLAorICAgICJDIyIsCisgICAgIiAgICB3Y2Y6ICAgICAgICAgICAgIEFkZHMgYmluZGluZ3MgZm9yIFdDRiB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKKyAgICAiICAgIHNlcmlhbDogICAgICAgICAgQWRkIHNlcmlhbGl6YXRpb24gc3VwcG9ydCB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKKyAgICAiICAgIHVuaW9uOiAgICAgICAgICAgVXNlIG5ldyB1bmlvbiB0eXBpbmcsIHdoaWNoIGluY2x1ZGVzIGEgc3RhdGljIHJlYWQgZnVuY3Rpb24gZm9yIHVuaW9uIHR5cGVzLlxuIgorKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRzdGRfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldHN0ZF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDllNmMwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRzdGRfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworY2xhc3MgdF9uZXRzdGRfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvcgoreworCisgIHN0cnVjdCBtZW1iZXJfbWFwcGluZ19zY29wZQorICB7CisgICAgcHVibGljOgorICAgICAgbWVtYmVyX21hcHBpbmdfc2NvcGUoKSA6IHNjb3BlX21lbWJlcigwKSB7IH0KKyAgICAgIHZvaWQqIHNjb3BlX21lbWJlcjsKKyAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gbWFwcGluZ190YWJsZTsKKyAgfTsKKworcHVibGljOgorICB0X25ldHN0ZF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywgY29uc3Qgc3RyaW5nJiBvcHRpb25fc3RyaW5nKTsKKworICBib29sIGlzX3djZl9lbmFibGVkKCkgY29uc3Q7CisgIGJvb2wgaXNfbnVsbGFibGVfZW5hYmxlZCgpIGNvbnN0OworICBib29sIGlzX2hhc2hjb2RlX2VuYWJsZWQoKSBjb25zdDsKKyAgYm9vbCBpc19zZXJpYWxpemVfZW5hYmxlZCgpIGNvbnN0OworICBib29sIGlzX3VuaW9uX2VuYWJsZWQoKSBjb25zdDsKKyAgbWFwPHN0cmluZywgaW50PiBnZXRfa2V5d29yZHNfbGlzdCgpIGNvbnN0OworCisgIC8vIG92ZXJyaWRlcworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2VudW0ob3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBnZW5lcmF0ZUlzc2V0KTsKKyAgdm9pZCBnZW5lcmF0ZV9uZXRzdGRfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgaW5jbHVkZUlzc2V0ID0gdHJ1ZSwgc3RyaW5nIGZpZWxkUHJlZml4ID0gIiIpOworICBib29sIHByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCA9IGZhbHNlLCBib29sIG5lZWR0eXBlID0gZmFsc2UpOworICBzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworICB2b2lkIHByaW50X2NvbnN0X2RlZl92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdm9pZCBnZW5lcmF0ZV9uZXRzdGRfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfbmV0c3RkX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOworICB2b2lkIGdlbmVyYXRlX25ldHN0ZF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfbmV0c3RkX3VuaW9uX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9uZXRzdGRfdW5pb25fY2xhc3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uLCB0X2ZpZWxkKiB0ZmllbGQpOworICB2b2lkIGdlbmVyYXRlX25ldHN0ZF93Y2ZmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9uZXRzdGRfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9uZXRzdGRfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfbmV0c3RkX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfbmV0c3RkX3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9uZXRzdGRfc3RydWN0X2VxdWFscyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9uZXRzdGRfc3RydWN0X2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX25ldHN0ZF91bmlvbl9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4ID0gIiIsIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogbGlzdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXggPSAiIiwgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgaXRlciwgc3RyaW5nIG1hcCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX25ldHN0ZF9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfbmV0c3RkX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9uZXRzdGRfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfbmV0c3RkX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKyAgdm9pZCBkb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIGNvbnN0IHN0cmluZyYgY29tbWVudF9zdGFydCwgY29uc3Qgc3RyaW5nJiBsaW5lX3ByZWZpeCwgY29uc3Qgc3RyaW5nJiBjb250ZW50cywgY29uc3Qgc3RyaW5nJiBjb21tZW50X2VuZCk7CisgIHZvaWQgc3RhcnRfbmV0c3RkX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpOworICB2b2lkIGVuZF9uZXRzdGRfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCk7CisKKyAgc3RyaW5nIG5ldHN0ZF90eXBlX3VzaW5ncygpIGNvbnN0OworICBzdHJpbmcgbmV0c3RkX3RocmlmdF91c2luZ3MoKSBjb25zdDsKKworICBzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0cmluZyBwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcgPSBmYWxzZSk7CisgIHN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7CisKK3ByaXZhdGU6CisgIHN0cmluZyBuYW1lc3BhY2VfbmFtZV87CisgIHN0cmluZyBuYW1lc3BhY2VfZGlyXzsKKworICBib29sIG51bGxhYmxlXzsKKyAgYm9vbCB1bmlvbl87CisgIGJvb2wgaGFzaGNvZGVfOworICBib29sIHNlcmlhbGl6ZV87CisgIGJvb2wgd2NmXzsKKworICBzdHJpbmcgd2NmX25hbWVzcGFjZV87CisgIG1hcDxzdHJpbmcsIGludD4gbmV0c3RkX2tleXdvcmRzOworICB2ZWN0b3I8bWVtYmVyX21hcHBpbmdfc2NvcGU+IG1lbWJlcl9tYXBwaW5nX3Njb3BlczsKKworICB2b2lkIGluaXRfa2V5d29yZHMoKTsKKyAgc3RyaW5nIG5vcm1hbGl6ZV9uYW1lKHN0cmluZyBuYW1lKTsKKyAgc3RyaW5nIG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIoc3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisgIHZvaWQgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSk7CisgIHZvaWQgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlKTsKKyAgc3RyaW5nIGdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG9sZG5hbWUpOworfTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3ODFlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTc2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6OmlvczsKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogT0NhbWwgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X29jYW1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X29jYW1sX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBvY2FtbDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tb2NhbWwiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpIG92ZXJyaWRlOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgb3ZlcnJpZGU7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBib29sIHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgYm9vbCBzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRfZmllbGQqIHRtZW1iZXIpOworICBib29sIHN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodF9maWVsZCogdG1lbWJlcik7CisgIHN0ZDo6c3RyaW5nIHN0cnVjdF9tZW1iZXJfY29weV9vZih0X3R5cGUqIHR5cGUsIHN0cmluZyB3aGF0KTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIHRuYW1lLCB0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogbWVtYmVyKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBuYW1lID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgb2NhbWxfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBtZXRob2QgPSBmYWxzZSwgYm9vbCBvcHRpb25zID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyByZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpOworCitwcml2YXRlOgorICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2lfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV9pXzsKK307CisKKy8qCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIHdhbnQgdHlwZWRlZnMgdG8gYXBwZWFyIGxhdGVyLAorICogYWZ0ZXIgYWxsIHRoZSB0eXBlcyBoYXZlIGJlZW4gZGVjbGFyZWQuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7CisgIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyYXRvcgorICBpbml0X2dlbmVyYXRvcigpOworCisgIC8vIEdlbmVyYXRlIGVudW1zCisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHN0cnVjdHMKKyAgdmVjdG9yPHRfc3RydWN0Kj4gc3RydWN0cyA9IHByb2dyYW1fLT5nZXRfc3RydWN0cygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igc3RfaXRlcjsKKyAgZm9yIChzdF9pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzdF9pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc3RfaXRlcikgeworICAgIGdlbmVyYXRlX3N0cnVjdCgqc3RfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSB4Y2VwdGlvbnMKKyAgdmVjdG9yPHRfc3RydWN0Kj4geGNlcHRpb25zID0gcHJvZ3JhbV8tPmdldF94Y2VwdGlvbnMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV94Y2VwdGlvbigqeF9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCisgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHNlcnZpY2VzCisgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7CisgICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKKyAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOworICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKKworICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCisgIGNsb3NlX2dlbmVyYXRvcigpOworfQorCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLm1sIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgIHN0cmluZyBmX3R5cGVzX2lfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5tbGkiOworICBmX3R5cGVzX2lfLm9wZW4oZl90eXBlc19pX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RzLm1sIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl90eXBlc19pXyA8PCBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbCA8PCAib3BlbiAiCisgICAgICAgICAgICA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMiIDw8IGVuZGw7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybiBzdGQ6OnN0cmluZygiKCpcbiIpICsgIiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKyAiXG4iCisgICAgICAgICArICIgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiKilcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6b2NhbWxfaW1wb3J0cygpIHsKKyAgcmV0dXJuICJvcGVuIFRocmlmdCI7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICBmX3R5cGVzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IGRlY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiCisgICAgICAgICAgIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfaV8gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBkZWNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIgorICAgICAgICAgICAgIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIgPDwgZW5kbCA8PCAic3RydWN0IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIgPDwgZW5kbCA8PCAic2lnIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgInR5cGUgdCA9ICIgPDwgZW5kbDsKKyAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ0eXBlIHQgPSAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IG5hbWUgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl90eXBlc19pXykgPDwgInwgIiA8PCBuYW1lIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJsZXQgdG9faSA9IGZ1bmN0aW9uIiA8PCBlbmRsOworICBpbmRlbnQoZl90eXBlc19pXykgPDwgInZhbCB0b19pIDogdCAtPiBJbnQzMi50IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCAibCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX3R5cGVzXykgPDwgImxldCBvZl9pID0gZnVuY3Rpb24iIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAidmFsIG9mX2kgOiBJbnQzMi50IC0+IHQiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IHZhbHVlIDw8ICJsIC0+ICIgPDwgbmFtZSA8PCBlbmRsOworICB9CisgIGluZGVudChmX3R5cGVzXykgPDwgInwgXyAtPiByYWlzZSBUaHJpZnRfZXJyb3IiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgImVuZCIgPDwgZW5kbDsKKyAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJlbmQiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaW5kZW50KGZfY29uc3RzXykgPDwgImxldCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgLy8gT0NhbWwgcmVxdWlyZXMgYWxsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgY29udGFpbiBhIGRlY2ltYWwgcG9pbnQKKyAgb3V0LnNldGYoaW9zOjpzaG93cG9pbnQpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgImwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIi4wIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHlwZTsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaW50IHZhbCA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICBpZiAodmFsID09IHZhbHVlLT5nZXRfaW50ZWdlcigpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIuIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgc3RyaW5nIGNuYW1lID0gdHlwZV9uYW1lKHR5cGUpOworICAgIHN0cmluZyBjdCA9IHRtcCgiX2MiKTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGN0IDw8ICIgPSBuZXcgIiA8PCBjbmFtZSA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgY3QgPDwgIiNzZXRfIiA8PCBmbmFtZSA8PCAiICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgY3QgPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIHN0cmluZyBobSA9IHRtcCgiX2htIik7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBobSA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCB2YWwuc2l6ZSgpIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgaG0gPDwgIiAiIDw8IGtleSA8PCAiICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCBobSA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBvdXQgPDwgIlsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgc3RyaW5nIGhtID0gdG1wKCJfaG0iKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGhtIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHZhbC5zaXplKCkgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBobSA8PCAiICIgPDwgdmFsIDw8ICIgdHJ1ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8IGhtIDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSAic3RydWN0IgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0LCBidXQgYWxzbyBoYXMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIE9DYW1sIHN0cnVjdAorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKGZfdHlwZXNfaV8sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KG9zdHJlYW0mIG91dCwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycykgeworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLyogQ3JlYXRlIGEgY29weSBvZiB0aGUgY3VycmVudCBvYmplY3QgKi8KKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBjb3B5ID0iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImxldCBfbmV3ID0gT28uY29weSBzZWxmIGluIiA8PCBlbmRsOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIGdlbmVyYXRlX29jYW1sX21lbWJlcl9jb3B5KG91dCwgKm1faXRlcik7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIl9uZXciIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9jb3B5X29mKHRfdHlwZSogdHlwZSwgc3RyaW5nIHdoYXQpIHsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gd2hhdCArIHN0cmluZygiI2NvcHkiKTsKKyAgfQorICBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcgY29weV9vZl9rID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgImsiKTsKKyAgICBzdHJpbmcgY29weV9vZl92ID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgInYiKTsKKworICAgIGlmIChjb3B5X29mX2sgPT0gImsiICYmIGNvcHlfb2ZfdiA9PSAidiIpIHsKKyAgICAgIHJldHVybiBzdHJpbmcoIihIYXNodGJsLmNvcHkgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBzdHJpbmcoCisgICAgICAgICAgICAgICAgICIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAiCisgICAgICAgICAgICAgICAgICItPiBIYXNodGJsLmFkZCBuaCAiKSArIGNvcHlfb2ZfayArIHN0cmluZygiICIpICsgY29weV9vZl92ICsgc3RyaW5nKCIpIG9oOyBuaCkgIikKKyAgICAgICAgICAgICArIHdoYXQgKyAiKSI7CisgICAgfQorICB9CisgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICJrIik7CisKKyAgICBpZiAoY29weV9vZiA9PSAiayIpIHsKKyAgICAgIHJldHVybiBzdHJpbmcoIihIYXNodGJsLmNvcHkgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBzdHJpbmcoCisgICAgICAgICAgICAgICAgICIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAiCisgICAgICAgICAgICAgICAgICItPiBIYXNodGJsLmFkZCBuaCAiKSArIGNvcHlfb2YgKyBzdHJpbmcoIiB0cnVlIikgKyBzdHJpbmcoIikgb2g7IG5oKSAiKSArIHdoYXQKKyAgICAgICAgICAgICArICIpIjsKKyAgICB9CisgIH0KKyAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAieCIpOworICAgIGlmIChjb3B5X29mICE9ICJ4IikgeworICAgICAgcmV0dXJuIHN0cmluZygiKExpc3QubWFwIChmdW4geCAtPiAiKSArIGNvcHlfb2YgKyBzdHJpbmcoIikgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB3aGF0OworICAgIH0KKyAgfQorICByZXR1cm4gd2hhdDsKK30KKwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0bWVtYmVyKSB7CisgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKKworICBzdHJpbmcgZ3JhYl9maWVsZCA9IHN0cmluZygic2VsZiNncmFiXyIpICsgbW5hbWU7CisgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKHR5cGUsIGdyYWJfZmllbGQpOworICBpZiAoY29weV9vZiAhPSBncmFiX2ZpZWxkKSB7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKKyAgICAgIG91dCA8PCAiaWYgXyIgPDwgbW5hbWUgPDwgIiA8PiBOb25lIHRoZW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAiOworICAgIH0KKyAgICBvdXQgPDwgIl9uZXcjc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IGNvcHlfb2YgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihvdXQsIHRuYW1lLCAoKm1faXRlcikpOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9CisgIGdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KG91dCwgbWVtYmVycyk7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8ICIgb2YgIiA8PCB0bmFtZSA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdHVyZSBtZW1iZXIgZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdG5hbWUgTmFtZSBvZiB0aGUgcGFyZW50IHN0cnVjdHVyZSBmb3IgdGhlIG1lbWJlcgorICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdG1lbWJlcikgeworICBzdHJpbmcgeCA9IHRtcCgiX3giKTsKKyAgc3RyaW5nIG1uYW1lID0gZGVjYXBpdGFsaXplKHRtZW1iZXItPmdldF9uYW1lKCkpOworCisgIGluZGVudChvdXQpIDw8ICJ2YWwgbXV0YWJsZSBfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCByZW5kZXJfb2NhbWxfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisgIGlmICh2YWwpIHsKKyAgICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQorICAgICAgb3V0IDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIiBvcHRpb24gPSBTb21lICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKQorICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgLy8gYXNzZXJ0KCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpCisgICAgb3V0IDw8ICIgb3B0aW9uID0gTm9uZSIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdldF8iIDw8IG1uYW1lIDw8ICIgPSBTb21lIF8iIDw8IG1uYW1lIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiICIgPDwgeCA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSAiIDw8IHggPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdldF8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgPSBtYXRjaCBfIiA8PCBtbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgd2l0aCBOb25lLT5yYWlzZSAoRmllbGRfZW1wdHkgXCIiIDw8IHRuYW1lIDw8ICIuIiA8PCBtbmFtZSA8PCAiXCIpIHwgU29tZSAiCisgICAgICAgICAgICAgICAgPDwgeCA8PCAiIC0+ICIgPDwgeCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IHggPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gU29tZSAiIDw8IHgKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgdW5zZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSBOb25lIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCByZXNldF8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCAiIDwtICI7CisgIGlmICh2YWwpIHsKKyAgICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQorICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIlNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJOb25lIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogQ2hlY2sgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGNhbiBub3QgaGF2ZSB1bmRlZmluZWQgdmFsdWUKKyAqCisgKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgorICovCitib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodF9maWVsZCogdG1lbWJlcikgeworICB0X2NvbnN0X3ZhbHVlKiB2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKKyAgcmV0dXJuICh2YWwgPyB0cnVlIDogZmFsc2UpOworfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBjYW4gYmUgc2tpcHBlZCBkdXJpbmcgZW5jb2RpbmcKKyAqCisgKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgorICovCitib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgcmV0dXJuICh0bWVtYmVyLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7Cit9CisKKy8qKgorICogRmlndXJlIG91dCB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgaGFzCisgKiBhIGNoZWFwbHkgY29tcGFyYWJsZSBkZWZhdWx0IHZhbHVlLgorICoKKyAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCisgKi8KK2Jvb2wgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodF9maWVsZCogdG1lbWJlcikgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtZW1iZXItPmdldF90eXBlKCkpOworICB0X2NvbnN0X3ZhbHVlKiB2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKKyAgaWYgKCF2YWwpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAvLyBCYXNlIHR5cGVzIGFyZSBnZW5lcmFsbHkgY2hlYXBseSBjb21wYXJlZCBmb3Igc3RydWN0dXJhbCBlcXVpdmFsZW5jZS4KKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsLT5nZXRfZG91YmxlKCkgPT0gMC4wKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgLy8gRW1wdHkgbGlzdHMgYXJlIGNoZWFwbHkgY29tcGFyZWQgZm9yIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuCisgICAgLy8gSXMgZW1wdHkgbGlzdD8KKyAgICBpZiAodmFsLT5nZXRfbGlzdCgpLnNpemUoKSA9PSAwKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0bmFtZSA8PCAiIDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvYmplY3QgKCdhKSIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgeCA9IHRtcCgiX3giKTsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgc3RyaW5nIHR5cGUgPSByZW5kZXJfb2NhbWxfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCB0eXBlIDw8ICIgb3B0aW9uIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCB0eXBlIDw8ICIgLT4gdW5pdCIgPDwgZW5kbDsKKyAgICAgIGlmICghc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KCptX2l0ZXIpKQorICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHJlc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudChvdXQpIDw8ICJtZXRob2QgY29weSA6ICdhIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHdyaXRlIDogUHJvdG9jb2wudCAtPiB1bml0IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZXhjZXB0aW9uICIgPDwgY2FwaXRhbGl6ZSh0bmFtZSkgPDwgIiBvZiAiIDw8IHRuYW1lIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAidmFsIHJlYWRfIiA8PCB0bmFtZSA8PCAiIDogUHJvdG9jb2wudCAtPiAiIDw8IHRuYW1lIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7CisgIHN0cmluZyB0ID0gdG1wKCJfdCIpOworICBzdHJpbmcgaWQgPSB0bXAoIl9pZCIpOworICBpbmRlbnQob3V0KSA8PCAibGV0IHJlYyByZWFkXyIgPDwgc25hbWUgPDwgIiAoaXByb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IHN0ciA8PCAiID0gbmV3ICIgPDwgc25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZ25vcmUoaXByb3QjcmVhZFN0cnVjdEJlZ2luKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICIodHJ5IHdoaWxlIHRydWUgZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImxldCAoXywiIDw8IHQgPDwgIiwiIDw8IGlkIDw8ICIpID0gaXByb3QjcmVhZEZpZWxkQmVnaW4gaW4iIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgIiA8PCB0IDw8ICIgPSBQcm90b2NvbC5UX1NUT1AgdGhlbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyYWlzZSBCcmVhayIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVsc2UgKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBpZCA8PCAiIHdpdGggIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIC0+ICgiOworICAgIG91dCA8PCAiaWYgIiA8PCB0IDw8ICIgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGhlbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHN0cik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcCAiIDw8IHQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ8IF8gLT4gIgorICAgICAgPDwgImlwcm90I3NraXAgIiA8PCB0IDw8ICIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkRmllbGRFbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZG9uZTsgKCkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ3aXRoIEJyZWFrIC0+ICgpKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90I3JlYWRTdHJ1Y3RFbmQ7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8IHN0ciA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKKyAgc3RyaW5nIGYgPSB0bXAoIl9mIik7CisKKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB3cml0ZSAob3Byb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlU3RydWN0QmVnaW4gXCIiIDw8IG5hbWUgPDwgIlwiOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIHRtZW1iZXIgPSAoKmZfaXRlcik7CisgICAgc3RyaW5nIG1uYW1lID0gIl8iICsgZGVjYXBpdGFsaXplKHRtZW1iZXItPmdldF9uYW1lKCkpOworICAgIHN0cmluZyBfdjsKKworICAgIGlmIChzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKKworICAgICAgaWYgKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikgJiYgc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgeworICAgICAgICBfdiA9ICJfdiI7CisgICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgIiAtPiAoKSB8ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgX3YgPDwgIiAtPiAiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBfdiA9IG1uYW1lOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKCIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBtbmFtZSA8PCAiIHdpdGggIjsKKworICAgICAgaWYgKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikpIHsKKyAgICAgICAgb3V0IDw8ICJOb25lIC0+ICgpIjsKKworICAgICAgICBpZiAoc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgeworICAgICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgICBvdXQgPDwgIiB8IFNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCisgICAgICAgICAgICAgIDw8ICIgLT4gKCkiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiIHwgU29tZSBfdiAtPiAiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInwgTm9uZSAtPiByYWlzZSAoRmllbGRfZW1wdHkgXCIiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLiIgPDwgbW5hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIlwiKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInwgU29tZSBfdiAtPiAiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIF92ID0gIl92IjsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRCZWdpbihcIiIgPDwgdG1lbWJlci0+Z2V0X25hbWUoKSA8PCAiXCIsIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSh0bWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiLCIgPDwgdG1lbWJlci0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdG1lbWJlciwgX3YpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRFbmQiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVGaWVsZFN0b3A7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZVN0cnVjdEVuZCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICIubWwiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisgIHN0cmluZyBmX3NlcnZpY2VfaV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiLm1saSI7CisgIGZfc2VydmljZV9pXy5vcGVuKGZfc2VydmljZV9pX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX3NlcnZpY2VfaV8gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKworICAvKiBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGZfc2VydmljZV8gPDwKKyAgICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfaV8gPDwKKyAgICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgfQorICAqLworICBmX3NlcnZpY2VfIDw8ICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlX2lfIDw8ICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworICBmX3NlcnZpY2VfaV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigqIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMgKikiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgdmlydHVhbCBpZmFjZSA9IiA8PCBlbmRsIDw8ICJvYmplY3QgKHNlbGYpIiA8PCBlbmRsOworICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgImNsYXNzIHZpcnR1YWwgaWZhY2UgOiIgPDwgZW5kbCA8PCAib2JqZWN0IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgc3RyaW5nIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5pZmFjZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5pZmFjZSIgPDwgZW5kbDsKKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdCA9IGZ1bmN0aW9uX3R5cGUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibWV0aG9kIHZpcnR1YWwgIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIgorICAgICAgICAgICAgICAgPDwgZnQgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgIm1ldGhvZCB2aXJ0dWFsICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICAgPDwgZnQgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIE9DYW1sLCB0aGUgY2xpZW50IGRvZXNuJ3QgaW1wbGVtZW50IGlmYWNlLgorICpUaGlzIGlzIGJlY2F1c2UKKyAqIFRoZSBjbGllbnQgZG9lcyBub3QgKGFuZCBzaG91bGQgbm90IGhhdmUgdG8pIGRlYWwgd2l0aCBhcmd1bWVudHMgYmVpbmcgTm9uZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgY2xpZW50IChpcHJvdCA6IFByb3RvY29sLnQpIChvcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJvYmplY3QgKHNlbGYpIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiY2xhc3MgY2xpZW50IDogUHJvdG9jb2wudCAtPiBQcm90b2NvbC50IC0+ICIgPDwgZW5kbCA8PCAib2JqZWN0IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5jbGllbnQgaXByb3Qgb3Byb3QgYXMgc3VwZXIiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuY2xpZW50IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFsIG11dGFibGUgc2VxaWQgPSAwIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiA9ICIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAibWV0aG9kICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsIHRydWUsIGZhbHNlKSA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZiNzZW5kXyIgPDwgZnVubmFtZTsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgIiA8PCBkZWNhcGl0YWxpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICI7IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCAic2VsZiNyZWN2XyIgPDwgZnVubmFtZSA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgcHJpdmF0ZSBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgPSAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbiAoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlByb3RvY29sLk9ORVdBWSIgOiAiUHJvdG9jb2wuQ0FMTCIpIDw8ICIsIHNlcWlkKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mjc2V0XyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzI3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtZXRob2QgcHJpdmF0ZSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIiA9IgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IChmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBpcHJvdCNyZWFkTWVzc2FnZUJlZ2luIGluIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoaWYgbXR5cGUgPSBQcm90b2NvbC5FWENFUFRJT04gdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBsZXQgeCA9IEFwcGxpY2F0aW9uX0V4bi5yZWFkIGlwcm90IGluIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIChpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgICByYWlzZSAoQXBwbGljYXRpb25fRXhuLkUgeCkpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UgKCkpOyIgPDwgZW5kbDsKKyAgICAgIHN0cmluZyByZXMgPSAiXyI7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSB8fCB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICByZXMgPSAicmVzdWx0IjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHJlcyA8PCAiID0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggcmVzdWx0I2dldF9zdWNjZXNzIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+ICgiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorCisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIobWF0Y2ggcmVzdWx0I2dldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgd2l0aCBOb25lIC0+ICgpIHwgU29tZSBfdiAtPiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJhaXNlICgiIDw8IGNhcGl0YWxpemUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIF92KSk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXworICAgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJyYWlzZSAoQXBwbGljYXRpb25fRXhuLkUgKEFwcGxpY2F0aW9uX0V4bi5jcmVhdGUgQXBwbGljYXRpb25fRXhuLk1JU1NJTkdfUkVTVUxUIFwiIgorICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSkpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorCisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgcHJvY2Vzc29yIChoYW5kbGVyIDogaWZhY2UpID0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCAoc2VsZikiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiY2xhc3MgcHJvY2Vzc29yIDogaWZhY2UgLT4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgImluaGVyaXQgUHJvY2Vzc29yLnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiICsgZXh0ZW5kcyArICIucHJvY2Vzc29yIChoYW5kbGVyIDo+ICIgKyBleHRlbmRzICsgIi5pZmFjZSkiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiArIGV4dGVuZHMgKyAiLnByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhbCBwcm9jZXNzTWFwID0gSGFzaHRibC5jcmVhdGUgIiA8PCBmdW5jdGlvbnMuc2l6ZSgpIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV9pXykKKyAgICAgIDw8ICJ2YWwgcHJvY2Vzc01hcCA6IChzdHJpbmcsIGludCAqIFByb3RvY29sLnQgKiBQcm90b2NvbC50IC0+IHVuaXQpIEhhc2h0YmwudCIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kIHByb2Nlc3MgaXByb3Qgb3Byb3QgPSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgIm1ldGhvZCBwcm9jZXNzIDogUHJvdG9jb2wudCAtPiBQcm90b2NvbC50IC0+IGJvb2wiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAobmFtZSwgdHlwLCBzZXFpZCkgID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQorCisgIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgSGFzaHRibC5tZW0gcHJvY2Vzc01hcCBuYW1lIHRoZW4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICAoSGFzaHRibC5maW5kIHByb2Nlc3NNYXAgbmFtZSkgKHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImVsc2UgKCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdCNza2lwKFByb3RvY29sLlRfU1RSVUNUKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBsZXQgeCA9IEFwcGxpY2F0aW9uX0V4bi5jcmVhdGUgQXBwbGljYXRpb25fRXhuLlVOS05PV05fTUVUSE9EIChcIlVua25vd24gIgorICAgICAgICAgICAgICAgICJmdW5jdGlvbiBcIl5uYW1lKSBpbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICAgb3Byb3Qjd3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgUHJvdG9jb2wuRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgICB4I3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgIG9wcm90I3dyaXRlTWVzc2FnZUVuZDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIG9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ1ZSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaXRpYWxpemVyIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJIYXNodGJsLmFkZCBwcm9jZXNzTWFwIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiBzZWxmI3Byb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgcHJpdmF0ZSBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIChzZXFpZCwgaXByb3QsIG9wcm90KSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBhcmdzID0gImFyZ3MiOworICBpZiAoZmllbGRzLnNpemUoKSA9PSAwKSB7CisgICAgYXJncyA9ICJfIjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IGFyZ3MgPDwgIiA9IHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IGluIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKHRyeSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQjc2V0X3N1Y2Nlc3MgIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIoaGFuZGxlciMiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgYXJncyNnZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndpdGgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInwgIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgLT4gIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQjc2V0XyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKSI7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUJlZ2luIChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBQcm90b2NvbC5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0I3dyaXRlIG9wcm90OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisKKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIjc2V0XyIgPDwgbmFtZSA8PCAiICI7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCB0eXBlKTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFIjsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgb3V0IDw8ICJpcHJvdCMiOworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3QiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgInJlYWRTdHJpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICJyZWFkQm9vbCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJyZWFkQnl0ZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAicmVhZEkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCAicmVhZEkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAicmVhZEk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAicmVhZERvdWJsZSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7CisgICAgb3V0IDw8ICIoIiA8PCBlbmFtZSA8PCAiLm9mX2kgaXByb3QjcmVhZEkzMikiOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgJyVzJ1xuIiwgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcHJlZml4ID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzLiI7CisgIH0KKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodHN0cnVjdC0+Z2V0X25hbWUoKSk7CisgIG91dCA8PCAiKCIgPDwgcHJlZml4IDw8ICJyZWFkXyIgPDwgbmFtZSA8PCAiIGlwcm90KSI7Cit9CisKKy8qKgorICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKKyAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisgIHN0cmluZyBjb24gPSB0bXAoIl9jb24iKTsKKworICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOworICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfaTgsIGt0eXBlKTsKKyAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2k4LCB2dHlwZSk7CisgIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9pOCwgZXR5cGUpOworCisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBrdHlwZSA8PCAiLCIgPDwgdnR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPSBpcHJvdCNyZWFkTWFwQmVnaW4gaW4iCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgY29uIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHNpemUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGkgPSAxIHRvICIgPDwgc2l6ZSA8PCAiIGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJsZXQgX2sgPSAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICBvdXQgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF92ID0gIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgb3V0IDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgY29uIDw8ICIgX2sgX3YiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJkb25lOyBpcHJvdCNyZWFkTWFwRW5kOyAiIDw8IGNvbiA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBldHlwZSA8PCAiLCIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90I3JlYWRTZXRCZWdpbiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgY29uIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHNpemUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGkgPSAxIHRvICIgPDwgc2l6ZSA8PCAiIGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGNvbiA8PCAiICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICBvdXQgPDwgIiB0cnVlIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImRvbmU7IGlwcm90I3JlYWRTZXRFbmQ7ICIgPDwgY29uIDw8ICIpIjsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBldHlwZSA8PCAiLCIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90I3JlYWRMaXN0QmVnaW4gaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IGNvbiA8PCAiID0gKEFycmF5LnRvX2xpc3QgKEFycmF5LmluaXQgIiA8PCBzaXplIDw8ICIgKGZ1biBfIC0+ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgb3V0IDw8ICIpKSkgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90I3JlYWRMaXN0RW5kOyAiIDw8IGNvbiA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBuYW1lKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCMiOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgZW5hbWUgPDwgIi50b19pICIgPDwgbmFtZSA8PCAiKSI7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorICBvdXQgPDwgIjsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiI3dyaXRlKG9wcm90KSI7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCI7CisgICAgb3V0IDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCI7CisgICAgb3V0IDw8ICJIYXNodGJsLmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIjsKKyAgICBvdXQgPDwgIkhhc2h0YmwubGVuZ3RoICIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCI7CisgICAgb3V0IDw8ICJMaXN0Lmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtpdGVyID0gdG1wKCJfa2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoIl92aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLml0ZXIgKGZ1biAiIDw8IGtpdGVyIDw8ICIgLT4gZnVuICIgPDwgdml0ZXIgPDwgIiAtPiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLml0ZXIgKGZ1biAiIDw8IGl0ZXIgPDwgIiAtPiBmdW4gXyAtPiAiOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJMaXN0Lml0ZXIgKGZ1biAiIDw8IGl0ZXIgPDwgIiAtPiAiOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVNYXBFbmQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZVNldEVuZCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUxpc3RFbmQiOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAnbmFtZSBhcmdzJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgcmV0dXJuIHByZWZpeCArIGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIiAiCisgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKK30KKworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIG1ldGhvZCwgYm9vbCBvcHRpb25zKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdCArPSByZW5kZXJfb2NhbWxfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmIChvcHRpb25zKQorICAgICAgcmVzdWx0ICs9ICIgb3B0aW9uIjsKKyAgICByZXN1bHQgKz0gIiAtPiAiOworICB9CisgIGlmIChmaWVsZHMuZW1wdHkoKSAmJiAhbWV0aG9kKSB7CisgICAgcmVzdWx0ICs9ICJ1bml0IC0+ICI7CisgIH0KKyAgcmVzdWx0ICs9IHJlbmRlcl9vY2FtbF90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl90eXBlcy4iOworICAgIH0KKyAgfQorCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisgIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgbmFtZSA9IGNhcGl0YWxpemUobmFtZSk7CisgIH0gZWxzZSB7CisgICAgbmFtZSA9IGRlY2FwaXRhbGl6ZShuYW1lKTsKKyAgfQorICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFByb3RvY29sLnRfdHlwZSBlbnVtCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9WT0lEIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0JZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0kxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0RPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlByb3RvY29sLlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJQcm90b2NvbC5UX1NFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJQcm90b2NvbC5UX0xJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIG9jYW1sIHR5cGUKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpyZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gInVuaXQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiSW50MzIudCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIkludDY0LnQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJmbG9hdCI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiBjYXBpdGFsaXplKCgodF9lbnVtKil0eXBlKS0+Z2V0X25hbWUoKSkgKyAiLnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgcmV0dXJuICIoIiArIHJlbmRlcl9vY2FtbF90eXBlKGt0eXBlKSArICIsIiArIHJlbmRlcl9vY2FtbF90eXBlKHZ0eXBlKSArICIpIEhhc2h0YmwudCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICByZXR1cm4gIigiICsgcmVuZGVyX29jYW1sX3R5cGUoZXR5cGUpICsgIixib29sKSBIYXNodGJsLnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICByZXR1cm4gcmVuZGVyX29jYW1sX3R5cGUoZXR5cGUpICsgIiBsaXN0IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihvY2FtbCwgIk9DYW1sIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZGE1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfT09QX0dFTkVSQVRPUl9ICisjZGVmaW5lIFRfT09QX0dFTkVSQVRPUl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKy8qKgorICogQ2xhc3Mgd2l0aCB1dGlsaXR5IG1ldGhvZHMgc2hhcmVkIGFjcm9zcyBjb21tb24gb2JqZWN0IG9yaWVudGVkIGxhbmd1YWdlcy4KKyAqIFNwZWNpZmljYWxseSwgbW9zdCBvZiB0aGlzIHN0dWZmIGlzIGZvciBDKysvSmF2YS4KKyAqCisgKi8KK2NsYXNzIHRfb29wX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfb29wX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0pIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkge30KKworICAvKioKKyAgICogU2NvcGluZywgdXNpbmcgY3VybHkgYnJhY2VzIQorICAgKi8KKworICB2b2lkIHNjb3BlX3VwKHN0ZDo6b3N0cmVhbSYgb3V0KSB7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IHN0ZDo6ZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIHZvaWQgc2NvcGVfZG93bihzdGQ6Om9zdHJlYW0mIG91dCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHVwY2FzZV9zdHJpbmcoc3RkOjpzdHJpbmcgb3JpZ2luYWwpIHsKKyAgICBzdGQ6OnRyYW5zZm9ybShvcmlnaW5hbC5iZWdpbigpLCBvcmlnaW5hbC5lbmQoKSwgb3JpZ2luYWwuYmVnaW4oKSwgKGludCAoKikoaW50KSl0b3VwcGVyKTsKKyAgICByZXR1cm4gb3JpZ2luYWw7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgICAgc3RkOjpzdHJpbmcgcGFja2FnZSA9ICIiOworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpICsgIi4iOworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY29udGVudHMpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBjb250ZW50cywgIiAqL1xuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCAodF9kb2MqKWZpZWxkKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgICAqLworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgICAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7CisgICAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgICB9CisgICAgICB9CisgICAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7CisgICAgfQorICB9Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNzI5Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTY4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogUEVSTCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfcGVybF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9wZXJsX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSksIGZfdHlwZXNfdXNlX2luY2x1ZGVzX2VtaXR0ZWRfKGZhbHNlKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBwZXJsOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1wZXJsIjsKKyAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKKyAgICBlc2NhcGVfWydAJ10gPSAiXFxAIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSBvdmVycmlkZTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdHMhCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfdXNlX2luY2x1ZGVzKHN0ZDo6b3N0cmVhbSYgb3MsIGJvb2wmIGRvbmUsIHRfdHlwZSAqdHlwZSwgYm9vbCBzZWxmaXNoKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGVybF9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiI1xuIikgKyAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICAgKyAiI1xuIiArICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiI1xuIjsKKyAgfQorCisgIHZvaWQgcGVybF9uYW1lc3BhY2VfZGlycyh0X3Byb2dyYW0qIHAsIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4mIGRpcnMpIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgZGlycy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOworICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgZGlycy5wdXNoX2JhY2sobnMpOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIHBlcmxfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGVybCIpOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICIiOworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7CisgICAgICAgIHJlc3VsdCArPSAiOjoiOworICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgICAgIH0KKworICAgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmVzdWx0ICs9IG5zICsgIjo6IjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkgeworICAgIHN0ZDo6c3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7CisgICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBkaXJzOworICAgIHBlcmxfbmFtZXNwYWNlX2RpcnMocHJvZ3JhbV8sIGRpcnMpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBkaXJzLmJlZ2luKCk7IGl0ICE9IGRpcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgIG91dGRpciArPSAqaXQgKyAiLyI7CisgICAgfQorICAgIHJldHVybiBvdXRkaXI7CisgIH0KKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWxwZXJzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworCisgIGJvb2wgZl90eXBlc191c2VfaW5jbHVkZXNfZW1pdHRlZF87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBkaXJzOworICBwZXJsX25hbWVzcGFjZV9kaXJzKHByb2dyYW1fLCBkaXJzKTsKKyAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQ7CisgIGZvciAoaXQgPSBkaXJzLmJlZ2luKCk7IGl0ICE9IGRpcnMuZW5kKCk7IGl0KyspIHsKKyAgICBvdXRkaXIgKz0gKml0ICsgIi8iOworICAgIE1LRElSKG91dGRpci5jX3N0cigpKTsKKyAgfQorCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpciArICJUeXBlcy5wbSI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG91dGRpciArICJDb25zdGFudHMucG0iOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwZXJsX2luY2x1ZGVzKCk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCAiQ29uc3RhbnRzOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgcGVybF9pbmNsdWRlcygpIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cworICovCitzdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cGVybF9pbmNsdWRlcygpIHsKKyAgc3RyaW5nIGluYzsKKworICBpbmMgID0gInVzZSA1LjEwLjA7XG4iOworICBpbmMgKz0gInVzZSBzdHJpY3Q7XG4iOworICBpbmMgKz0gInVzZSB3YXJuaW5ncztcbiI7CisgIGluYyArPSAidXNlIFRocmlmdDo6RXhjZXB0aW9uO1xuIjsKKyAgaW5jICs9ICJ1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTtcbiI7CisgIGluYyArPSAidXNlIFRocmlmdDo6VHlwZTtcblxuIjsKKworICByZXR1cm4gaW5jOworfQorCisvKioKKyAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICBmX3R5cGVzXyA8PCAiMTsiIDw8IGVuZGw7CisgIGZfdHlwZXNfLmNsb3NlKCk7CisKKyAgZl9jb25zdHNfIDw8ICIxOyIgPDwgZW5kbDsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQRVJMLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCisgKiBpbiBQRVJMLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBmX3R5cGVzXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBmX3R5cGVzXyA8PCAidXNlIGNvbnN0YW50ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfY29uc3RzXyA8PCAidXNlIGNvbnN0YW50ICIgPDwgbmFtZSA8PCAiID0+ICI7CisgIGZfY29uc3RzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOworICBmX2NvbnN0c18gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIjEiIDogIjAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICItPm5ldyh7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIG91dCA8PCAiID0+ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAiLCI7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA9PiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgb3V0IDw8ICJbIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgb3V0IDw8ICIgPT4gMSI7CisgICAgICB9CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIl0iOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogTWFrZSBhIHN0cnVjdAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV91c2VfaW5jbHVkZXMoZl90eXBlc18sIGZfdHlwZXNfdXNlX2luY2x1ZGVzX2VtaXR0ZWRfLCB0c3RydWN0LCBmYWxzZSk7CisgIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIFBFUkwKKyAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKKyAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiO1xuIjsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAidXNlIGJhc2UgcXcoVGhyaWZ0OjpURXhjZXB0aW9uKTtcbiI7CisgIH0KKworICAvLyBDcmVhdGUgc2ltcGxlIGFjZXNzb3IgbWV0aG9kcworICBvdXQgPDwgInVzZSBiYXNlIHF3KENsYXNzOjpBY2Nlc3Nvcik7XG4iOworCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLT5ta19hY2Nlc3NvcnMoIHF3KCAiOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICghdC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgIikgKTtcbiI7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBuZXcoKQorICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8ICJzdWIgbmV3IHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRjbGFzc25hbWUgPSBzaGlmdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkdmFscyAgICAgID0gc2hpZnQgfHwge307IiA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBzdHJpbmcgZHZhbCA9ICJ1bmRlZiI7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJ9ID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoVU5JVkVSU0FMOjppc2EoJHZhbHMsJ0hBU0gnKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICR2YWxzLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJHZhbHMtPnsiCisgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcyAoJHNlbGYsICRjbGFzc25hbWUpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICJ9XG5cbiI7CisKKyAgb3V0IDw8ICJzdWIgZ2V0TmFtZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgInN1YiByZWFkIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRpbnB1dCkgPSBAXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICR4ZmVyICA9IDA7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZ0eXBlID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJteSAkZmlkICAgPSAwOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oXFwkZm5hbWUpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICgxKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKFxcJGZuYW1lLCBcXCRmdHlwZSwgXFwkZmlkKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImxhc3Q7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAiU1dJVENIOiBmb3IoJGZpZCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGluZGVudChvdXQpIDw8ICIvXiIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiQvICYmIGRveyI7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi0+Iik7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibGFzdDsgfTsiIDw8IGVuZGw7CisgIH0KKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorCisgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCAic3ViIHdyaXRlIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJteSAoJHNlbGYsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibXkgJHhmZXIgICA9IDA7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHNlbGYtPnsiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICAgICAgICAgIDw8ICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYtPiIpOworCisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdXNlIGNsYXVzZXMgZm9yIGluY2x1ZGVkIGVudGl0aWVzCisgKgorICogQHBhcmFtICBvcyAgICAgICBUaGUgb3V0cHV0IHN0cmVhbQorICogQHBhcmFtICBkb25lICAgICBBIGZsYWcgcmVmZXJlbmNlIHRvIGRlYm91bmNlIHRoZSBhY3Rpb24KKyAqIEBwYXJhbSAgdHlwZSAgICAgVGhlIHR5cGUgYmVpbmcgcHJvY2Vzc2VkCisgKiBAcGFyYW0gIHNlbGZpc2ggIEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIHR5cGVzIHNob3VsZCBiZSAidXNlImQgYXMgd2VsbC4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91c2VfaW5jbHVkZXMoc3RkOjpvc3RyZWFtJiBvcywgYm9vbCYgZG9uZSwgdF90eXBlICp0eXBlLCBib29sIHNlbGZpc2gpIHsKKyAgdF9wcm9ncmFtICpjdXJyZW50ID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKGN1cnJlbnQgJiYgIWRvbmUpIHsKKyAgICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgY3VyckluYyA9IGN1cnJlbnQtPmdldF9pbmNsdWRlcygpOworICAgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+OjpzaXplX3R5cGUgbnVtSW5jID0gY3VyckluYy5zaXplKCk7CisgICAgaWYgKHNlbGZpc2gpIHsKKyAgICAgIG9zIDw8ICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShjdXJyZW50KSA8PCAiVHlwZXM7IiA8PCBlbmRsOworICAgIH0KKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1JbmM7ICsraSkgeworICAgICAgdF9wcm9ncmFtKiBpbmNQcm9ncmFtID0gY3VyckluYy5hdChpKTsKKyAgICAgIG9zIDw8ICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShpbmNQcm9ncmFtKSA8PCAiVHlwZXM7IiA8PCBlbmRsOworICAgIH0KKyAgICBvcyA8PCBlbmRsOworICAgIGRvbmUgPSB0cnVlOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5wbSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IHBlcmxfaW5jbHVkZXMoKTsKKworICBib29sIGRvbmUgPSBmYWxzZTsKKyAgZ2VuZXJhdGVfdXNlX2luY2x1ZGVzKGZfc2VydmljZV8sIGRvbmUsIHRzZXJ2aWNlLCB0cnVlKTsKKworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpIDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBFUkwpCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8gPDwgIjE7IiA8PCBlbmRsOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gInVzZSBiYXNlIHF3KCIgKyBleHRlbmRzICsgIlByb2Nlc3Nvcik7IjsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBmX3NlcnZpY2VfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvcjsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRoYW5kbGVyKSA9IEBfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm15ICRzZWxmICAgICAgPSB7fTsiIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e2hhbmRsZXJ9ID0gJGhhbmRsZXI7IiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzICgkc2VsZiwgJGNsYXNzbmFtZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3ViIHByb2Nlc3MgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lICA9IHVuZGVmOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJteSAkbXR5cGUgID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oXFwkZm5hbWUsIFxcJG10eXBlLCBcXCRyc2VxaWQpOyIgPDwgZW5kbDsKKworICAvLyBIT1Q6IGNoZWNrIGZvciBtZXRob2QgaW1wbGVtZW50YXRpb24KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJG1ldGhvZG5hbWUgPSAncHJvY2Vzc18nLiRmbmFtZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiaWYgKCEkc2VsZi0+Y2FuKCRtZXRob2RuYW1lKSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5za2lwKFRocmlmdDo6VFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAibXkgJHggPSBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi0+bmV3KCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCAiCisgICAgICAgICAgICAgICAgIlRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHJzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR4LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRzZWxmLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIDE7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3ViIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJHNlcWlkLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIi0+bmV3KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXZhbCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIkcmVzdWx0LT57c3VjY2Vzc30gPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgIiRzZWxmLT57aGFuZGxlcn0tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIiRhcmdzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9OyBpZiggVU5JVkVSU0FMOjppc2EoJEAsJyIKKyAgICAgICAgICAgICAgICAgPDwgcGVybF9uYW1lc3BhY2UoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIicpICl7ICIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkQDsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkQCA9IHVuZGVmOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworCisgICAgLy8gY2F0Y2gtYWxsIGZvciB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMgKFRIUklGVC0zMTkxKQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgkQCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkQCA9fiBzL15cXHMrfFxccyskLy9nOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRlcnIgPSBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi0+bmV3KFwiVW5leHBlY3RlZCBFeGNlcHRpb246IFwiIC4gJEAsIFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRlcnItPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRAID0gdW5kZWY7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSB0aGUgcmVwbHkKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6UkVQTFksICRzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHN0cmluZyBuYW1lID0gdHMtPmdldF9uYW1lKCk7CisgICAgdHMtPnNldF9uYW1lKHNlcnZpY2VfbmFtZV8gKyAiXyIgKyBuYW1lKTsKKyAgICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2lmID0gInVzZSBiYXNlIHF3KCIgKyBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICsgIklmKTsiOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZjsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAic3ViICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGwgPDwgIiAgZGllICdpbXBsZW1lbnQgaW50ZXJmYWNlJztcbn0iCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmID0gIiI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBleHRlbmRzX3MtPmdldF9uYW1lKCk7CisgICAgZXh0ZW5kc19pZiA9ICJ1c2UgYmFzZSBxdygiICsgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICArICJSZXN0KTsiOworICB9CisgIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiUmVzdDsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAic3ViIG5ldyB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGltcGwpID0gQF87IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAibXkgJHNlbGYgICAgID17IGltcGwgPT4gJGltcGwgfTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAic3ViICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRyZXF1ZXN0KSA9IEBfOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisgICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgeworICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3QtPnsnIiArICgqYV9pdGVyKS0+Z2V0X25hbWUoKSArICInfSI7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICgiIDw8IHJlcSA8PCAiKSA/ICIgPDwgcmVxCisgICAgICAgICAgICAgICAgIDw8ICIgOiB1bmRlZjsiIDw8IGVuZGw7CisgICAgICBpZiAoYXR5cGUtPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSBAIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHNwbGl0KC8sLywgJCIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIgorICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gXFxAIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICRzZWxmLT57aW1wbH0tPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICAgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfY2xpZW50ID0gInVzZSBiYXNlIHF3KCIgKyBleHRlbmRzICsgIkNsaWVudCk7IjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbCA8PCAidXNlIGJhc2UgcXcoIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZik7IiA8PCBlbmRsOworCisgIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsOworCisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9ICA9ICRpbnB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIkc2VsZi0+e291dHB1dH0gPSBkZWZpbmVkICRvdXRwdXQgPyAkb3V0cHV0IDogJGlucHV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiRzZWxmLT57c2VxaWR9ICA9IDA7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGZfc2VydmljZV8gPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgaW5kZW50KCkgPDwgIiRzZWxmLT5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiJHNlbGYtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgInN1YiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fS0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiJywgIiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6T05FV0FZIiA6ICJUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6Q0FMTCIpCisgICAgICAgICAgICAgICA8PCAiLCAkc2VsZi0+e3NlcWlkfSk7IiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkYXJncy0+eyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCRzZWxmLT57b3V0cHV0fSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiJHNlbGYtPntvdXRwdXR9LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIkc2VsZi0+e291dHB1dH0tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJG10eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlQmVnaW4oXFwkZm5hbWUsIFxcJG10eXBlLCBcXCRyc2VxaWQpOyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRtdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG15ICR4ID0gVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24tPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICAkeC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgICRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBkaWUgJHg7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiJHJlc3VsdC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+e3N1Y2Nlc3N9ICkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiAkcmVzdWx0LT57c3VjY2Vzc307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBkaWUgJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9OyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkaWUgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKKyAgKHZvaWQpaW5jbGFzczsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIC8vIEhhY2sgZm9yIHdoZW4gcHJlZml4IGlzIGRlZmluZWQgKGFsd2F5cyBhIGhhc2ggcmVmKQorICBpZiAoIXByZWZpeC5lbXB0eSgpKSB7CisgICAgbmFtZSA9IHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9IjsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNihcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZShcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworCisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAorICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCisgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAorICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gIiA8PCBwZXJsX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLT5uZXcoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeAorICAgICAgPDwgIi0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IHNpemUgPDwgIiA9IDA7IiA8PCBlbmRsOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwga3R5cGUgPDwgIiA9IDA7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCB2dHlwZSA8PCAiID0gMDsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCIKKyAgICAgICAgPDwgIlxcJCIgPDwga3R5cGUgPDwgIiwgXFwkIiA8PCB2dHlwZSA8PCAiLCBcXCQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0ge307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCIKKyAgICAgICAgPDwgIlxcJCIgPDwgZXR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IGV0eXBlIDw8ICIgPSAwOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCIKKyAgICAgICAgPDwgIlxcJCIgPDwgZXR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKG15ICQiIDw8IGkgPDwgIiA9IDA7ICQiIDw8IGkgPDwgIiA8ICQiIDw8IHNpemUgPDwgIjsgKyskIiA8PCBpIDw8ICIpIgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgia2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoInZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5LCB0cnVlLCB0cnVlKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICItPnskIiA8PCBrZXkgPDwgIn0gPSAkIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIm15ICQiIDw8IGVsZW0gPDwgIiA9IHVuZGVmOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiLT57JCIgPDwgZWxlbSA8PCAifSA9IDE7IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICJteSAkIiA8PCBlbGVtIDw8ICIgPSB1bmRlZjsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICJwdXNoKEB7JCIgPDwgcHJlZml4IDw8ICJ9LCQiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIn0iKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSIpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICAvLyBIYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKKyAgICBpZiAoIXByZWZpeC5lbXB0eSgpKQorICAgICAgbmFtZSA9IHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9IjsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGVzIG91dCBhIGNvbnRhaW5lcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNjYWxhcihrZXlzICV7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAic2NhbGFyKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworCisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNjYWxhcihAeyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgIndoaWxlKCBteSAoJCIgPDwga2l0ZXIgPDwgIiwkIiA8PCB2aXRlciA8PCAiKSA9IGVhY2ggJXskIiA8PCBwcmVmaXggPDwgIn0pICIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggbXkgJCIgPDwgaXRlciA8PCAiIChAeyQiIDw8IHByZWZpeCA8PCAifSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCBteSAkIiA8PCBpdGVyIDw8ICIgKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSAiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICoKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIG9iaikgeworICBzdHJpbmcgcmVzdWx0ID0gIm15ICQiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAnJyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gMC4wIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiCisgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBbXSI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpZiAob2JqKSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gIiArIHBlcmxfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICItPm5ldygpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gdW5kZWYiOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKworICBzdHJpbmcgc3RyOworCisgIHN0ciA9IHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJ7XG4iOworICBzdHIgKz0gIiAgbXkgJHNlbGYgPSBzaGlmdDtcbiI7CisKKyAgLy8gTmVlZCB0byBjcmVhdGUgcGVybCBmdW5jdGlvbiBhcmcgaW5wdXRzCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyICs9ICIgIG15ICQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA9IHNoaWZ0O1xuIjsKKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICIkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpCT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpCWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6RE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpJMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6Ok1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpMSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihwZXJsLCAiUGVybCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YmQ1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNzg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisjZGVmaW5lIE5TR0xPQkFMIChuc2dsb2JhbF8uc2l6ZSgpID8gbnNnbG9iYWxfIDogIiIpCisjZGVmaW5lIE5TR0xPQkFMX0EgKCJcXCIgKyBOU0dMT0JBTCkKKyNkZWZpbmUgTlNHTE9CQUxfQiAoTlNHTE9CQUwgKyAiXFwiKQorI2RlZmluZSBOU0dMT0JBTF9BQiAoIlxcIiArIE5TR0xPQkFMICsgIlxcIikKKworLyoqCisgKiBQSFAgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X3BocF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9waHBfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGJpbmFyeV9pbmxpbmVfID0gZmFsc2U7CisgICAgcmVzdF8gPSBmYWxzZTsKKyAgICBwaHBzXyA9IGZhbHNlOworICAgIG9vcF8gPSBmYWxzZTsKKyAgICB2YWxpZGF0ZV8gPSBmYWxzZTsKKyAgICBqc29uX3NlcmlhbGl6YWJsZV8gPSBmYWxzZTsKKyAgICBuc2dsb2JhbF8gPSAiIjsgLy8gYnkgZGVmYXVsdCBnbG9iYWwgbmFtZXNwYWNlIGlzIGVtcHR5CisgICAgY2xhc3NtYXBfID0gZmFsc2U7CisgICAgZm9yIChpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiaW5saW5lZCIpID09IDApIHsKKyAgICAgICAgYmluYXJ5X2lubGluZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJyZXN0IikgPT0gMCkgeworICAgICAgICByZXN0XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInNlcnZlciIpID09IDApIHsKKyAgICAgICAgcGhwc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJvb3AiKSA9PSAwKSB7CisgICAgICAgIG9vcF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJ2YWxpZGF0ZSIpID09IDApIHsKKyAgICAgICAgdmFsaWRhdGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgianNvbiIpID09IDApIHsKKyAgICAgICAganNvbl9zZXJpYWxpemFibGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgibnNnbG9iYWwiKSA9PSAwKSB7CisgICAgICAgIG5zZ2xvYmFsXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiY2xhc3NtYXAiKSA9PSAwKSB7CisgICAgICAgIGNsYXNzbWFwXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInBzcjQiKSA9PSAwKSB7CisgICAgICAgIGlmKGNsYXNzbWFwXyl7CisgICAgICAgICAgdGhyb3cgInBzcjQgYW5kIGNsYXNzbWFwIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwd2FybmluZygwLCAicHNyNCBpcyBkZWZhdWx0IG9wdGlvbiEgbmVlZG4ndCBhZGQgcHNyNCBvcHRpb24hXG4iKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHBocDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG9vcF8gJiYgYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIHRocm93ICJvb3AgYW5kIGlubGluZWQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4iOworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAoYmluYXJ5X2lubGluZV8gPyAiZ2VuLXBocGkiIDogImdlbi1waHAiKTsKKyAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGluZGVudF9zdHIoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuICIgICAgIjsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpIG92ZXJyaWRlOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU3RydWN0cyEKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlX21vZGUpOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9qc29uX3NlcmlhbGl6ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisgIGJvb2wgbmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICBib29sIG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICBpbnQgZ2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcywgYm9vbCB3cml0ZV9tb2RlKTsKKworICB2b2lkIGdlbmVyYXRlX3BocF90eXBlX3NwZWMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RkOjpvc3RyZWFtJiBmaWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihzdGQ6Om9zdHJlYW0mIGZpbGUpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3BocF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHBocF9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYWRkVHlwZUhpbnRzID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fY2FzdCh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX3BocGRvYyh0X3R5cGUqIHR0eXBlKTsKKworICBib29sIHBocF9pc19zY2FsYXIodF90eXBlICp0dHlwZSkgeworICAgIHR0eXBlID0gdHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgICBpZih0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZih0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIHBocF9uYW1lc3BhY2VfYmFzZShjb25zdCB0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBocCIpOworICAgIGNvbnN0IGNoYXIqIGRlbGltaXRlciA9ICJcXCI7CisgICAgc2l6ZV90IHBvc2l0aW9uID0gbnMuZmluZCgnLicpOworICAgIHdoaWxlIChwb3NpdGlvbiAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIG5zLnJlcGxhY2UocG9zaXRpb24sIDEsIGRlbGltaXRlcik7CisgICAgICBwb3NpdGlvbiA9IG5zLmZpbmQoJy4nLCBwb3NpdGlvbiArIDEpOworICAgIH0KKyAgICByZXR1cm4gbnM7CisgIH0KKworICAvLyBnZW5lcmFsIHVzZSBuYW1lc3BhY2UgcHJlZml4aW5nOiBcbXlcbmFtZXNwYWNlXCBvciBteV9uYW1lc3BhY2VfCisgIHN0cmluZyBwaHBfbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0cmluZyBucyA9IHBocF9uYW1lc3BhY2VfYmFzZShwKTsKKyAgICByZXR1cm4gKG5zZ2xvYmFsXy5zaXplKCkgPyBOU0dMT0JBTF9BQiA6IE5TR0xPQkFMX0IpICsgKG5zLnNpemUoKSA/IChucyArICJcXCIpIDogIiIpOworICB9CisKKyAgLy8gcmV0dXJuIHRoZSBuYW1lc3BhY2Ugb2YgYSBmaWxlOgorICAvLyBnbG9iYWxcbnNcc3ViXG5zIG9yIGdsb2JhbFxucyBvciBzdWJcbnMKKyAgc3RyaW5nIHBocF9uYW1lc3BhY2Vfc3VmZml4KGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0cmluZyBucyA9IHBocF9uYW1lc3BhY2VfYmFzZShwKTsKKworICAgIHJldHVybiBOU0dMT0JBTAorICAgICAgKyAobnMuc2l6ZSgpICYmIE5TR0xPQkFMLnNpemUoKSA/ICJcXCIgOiAiIikKKyAgICAgICsgbnM7CisgIH0KKworICAvLyBhZGQgYSBkaXJlY3RvcnkgdG8gYWxyZWFkeSBleGlzdGluZyBuYW1lc3BhY2UKKyAgc3RyaW5nIHBocF9uYW1lc3BhY2VfZGlyZWN0b3J5KHN0cmluZyBkaXJlY3RvcnksIGJvb2wgZW5kID0gdHJ1ZSkgeworICAgICh2b2lkKWRpcmVjdG9yeTsKKyAgICBpZiAoZW5kKSB7CisgICAgICByZXR1cm4gIjsiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICB9CisKKyAgLy8gd3JpdGluZyBhbiBhdXRsb2FkIGlkZW50aWZpZXIgaW50byBnbG9iYTtsczogbXlcbmFtZXNwYWNlXCBvciBteV9uYW1lc3BhY2VfCisgIHN0cmluZyBwaHBfbmFtZXNwYWNlX2F1dG9sb2FkKGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOworICAgIHJldHVybiAobnNnbG9iYWxfLnNpemUoKSA/IE5TR0xPQkFMX0IgOiBOU0dMT0JBTCkgKyAobnMuc2l6ZSgpID8gKG5zICsgIlxcIikgOiAiIik7CisgIH0KKworICAvLyBkZWNsYXJpbmcgYSB0eXBlOiB0eXBlbmFtZSBvciBteV9uYW1lc3BhY2VfdHlwZW5hbWUKKyAgc3RyaW5nIHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odF90eXBlKiB0KSB7IHJldHVybiB0LT5nZXRfbmFtZSgpOyB9CisKKyAgc3RkOjpzdHJpbmcgcGhwX3BhdGgodF9wcm9ncmFtKiBwKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwaHAucGF0aCIpOworICAgIGlmIChucy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcC0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICAvLyBUcmFuc2Zvcm0gdGhlIGphdmEtc3R5bGUgbmFtZXNwYWNlIGludG8gYSBwYXRoLgorICAgIGZvciAoY2hhciAmIG4gOiBucykgeworICAgICAgaWYgKG4gPT0gJy4nKSB7CisgICAgICAgIG4gPSAnLyc7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5zICsgJy8nOworICB9CisKKyAgLyoqCisgICAqIFRyYW5zZm9ybSBjbGFzc19tZXRob2QgaW50byBDbGFzc01ldGhvZAorICAgKgorICAgKiBAcGFyYW0gc3RyCisgICAqIEByZXR1cm4gc3Rpcm5nCisgICAqLworICBzdHJpbmcgY2xhc3NpZnkoc3RyaW5nIHN0cikgeworICAgIHN0cmluZyBjbGFzc2UgPSAiIjsKKworICAgIHZlY3RvcjxzdHJpbmc+IHggPSBzcGxpdChzdHIsICdfJyk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJiBpIDogeCkgeworICAgICAgY2xhc3NlID0gY2xhc3NlICsgY2FwaXRhbGl6ZShpKTsKKyAgICB9CisKKyAgICByZXR1cm4gY2xhc3NlOworICB9CisKKyAgLyoqCisgICAqIFNwbGl0IG1ldGhvZAorICAgKiBAcGFyYW0gcworICAgKiBAcGFyYW0gZGVsaW0KKyAgICogQHBhcmFtIGVsZW1zCisgICAqIEByZXR1cm4KKyAgICovCisgIHZlY3RvcjxzdHJpbmc+JiBzcGxpdChjb25zdCBzdHJpbmcmIHMsIGNoYXIgZGVsaW0sIHZlY3RvcjxzdHJpbmc+JiBlbGVtcykgeworICAgIHN0cmluZ3N0cmVhbSBzcyhzKTsKKyAgICBzdHJpbmcgaXRlbTsKKworICAgIHdoaWxlIChnZXRsaW5lKHNzLCBpdGVtLCBkZWxpbSkpIHsKKyAgICAgIGVsZW1zLnB1c2hfYmFjayhpdGVtKTsKKyAgICB9CisKKyAgICByZXR1cm4gZWxlbXM7CisgIH0KKworICB2ZWN0b3I8c3RyaW5nPiBzcGxpdChjb25zdCBzdHJpbmcmIHMsIGNoYXIgZGVsaW0pIHsKKyAgICB2ZWN0b3I8c3RyaW5nPiBlbGVtczsKKworICAgIHJldHVybiBzcGxpdChzLCBkZWxpbSwgZWxlbXMpOworICB9CisKKyAgLyoqCisgICAqIENhcGl0YWxpemUgbWV0aG9kCisgICAqIEBwYXJhbSBzdHIKKyAgICogQHJldHVybgorICAgKi8KKyAgc3RyaW5nIGNhcGl0YWxpemUoc3RyaW5nIHN0cikgeworICAgIHN0cmluZzo6aXRlcmF0b3IgaXQoc3RyLmJlZ2luKCkpOworCisgICAgaWYgKGl0ICE9IHN0ci5lbmQoKSkKKyAgICAgIHN0clswXSA9IHRvdXBwZXIoKHVuc2lnbmVkIGNoYXIpc3RyWzBdKTsKKworICAgIC8vICAgIHdoaWxlKCsraXQgIT0gc3RyLmVuZCgpKQorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICppdCA9IHRvbG93ZXIoKHVuc2lnbmVkIGNoYXIpKml0KTsKKyAgICAvLyAgICB9CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOworICAvKioKKyAgICogR2VuZXJhdGUgcHJvdG9jb2wtaW5kZXBlbmRlbnQgdGVtcGxhdGU/IE9yIEJpbmFyeSBpbmxpbmUgY29kZT8KKyAgICovCisgIGJvb2wgYmluYXJ5X2lubGluZV87CisKKyAgLyoqCisgICAqIEdlbmVyYXRlIGEgUkVTVCBoYW5kbGVyIGNsYXNzCisgICAqLworICBib29sIHJlc3RfOworCisgIC8qKgorICAgKiBHZW5lcmF0ZSBzdHVicyBmb3IgYSBQSFAgc2VydmVyCisgICAqLworICBib29sIHBocHNfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIHVzZSBPT1AgYmFzZSBjbGFzcyBUQmFzZQorICAgKi8KKyAgYm9vbCBvb3BfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG9sZC1zdHlsZSBQSFAgZmlsZSB0byB1c2UgY2xhc3NtYXAgYXV0b2xvYWRpbmcKKyAgICovCisgIGJvb2wgY2xhc3NtYXBfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIHZhbGlkYXRvciBjb2RlCisgICAqLworICBib29sIHZhbGlkYXRlXzsKKworICAvKioKKyAgICogV2hldGhlciB0byBnZW5lcmF0ZSBKc29uU2VyaWFsaXphYmxlIGNsYXNzZXMKKyAgICovCisgIGJvb2wganNvbl9zZXJpYWxpemFibGVfOworCisgIC8qKgorICAgKiBHbG9iYWwgbmFtZXNwYWNlIGZvciBQSFAgNS4zCisgICAqLworICBzdGQ6OnN0cmluZyBuc2dsb2JhbF87Cit9OworCitib29sIHRfcGhwX2dlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7CisgIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJwYXRoIjsKK30KKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBDcmVhdGUgUmVhbCBkaXJlY3RvcnkgTmFtZXNwYWNlcworICB2ZWN0b3I8c3RyaW5nPiBOU3ggPSBzcGxpdChwaHBfbmFtZXNwYWNlX3N1ZmZpeChnZXRfcHJvZ3JhbSgpKSwgJ1xcJyk7CisgIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7CisKKyAgZm9yIChjb25zdCBhdXRvICYgaSA6IE5TeCkgeworICAgIHBhY2thZ2VfZGlyXyA9IHBhY2thZ2VfZGlyXyArICIvIiArIGkgKyAiLyI7CisgICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOworICB9CisKKyAgLy8gUHJlcGFyZSBvdXRwdXQgZmlsZSBmb3IgYWxsIHRoZSB0eXBlcyBpbiBjbGFzc21hcCBtb2RlCisgIGlmIChjbGFzc21hcF8pIHsKKyAgICAvLyBNYWtlIG91dHB1dCBmaWxlCisgICAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICJUeXBlcy5waHAiOworICAgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKGZfdHlwZXNfKTsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBwaHAgaW5jbHVkZXMKKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cGhwX2luY2x1ZGVzKCkgeworICBzdHJpbmcgaW5jbHVkZXMgPSAidXNlIFRocmlmdFxcQmFzZVxcVEJhc2U7XG4iCisgICAgICAgICAgICAgICAgICAgICJ1c2UgVGhyaWZ0XFxUeXBlXFxUVHlwZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFR5cGVcXFRNZXNzYWdlVHlwZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVEV4Y2VwdGlvbjtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVFByb3RvY29sRXhjZXB0aW9uO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcUHJvdG9jb2xcXFRQcm90b2NvbDtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFByb3RvY29sXFxUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZDtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVEFwcGxpY2F0aW9uRXhjZXB0aW9uO1xuIjsKKworICBpZiAoanNvbl9zZXJpYWxpemFibGVfKSB7CisgICAgaW5jbHVkZXMgKz0gInVzZSBKc29uU2VyaWFsaXphYmxlO1xuIgorICAgICAgICAgICAgICAgICJ1c2Ugc3RkQ2xhc3M7XG4iOworICB9CisKKyAgcmV0dXJuIGluY2x1ZGVzOworfQorCisvKioKKyAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBpZiAoY2xhc3NtYXBfKSB7CisgICAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICAgIGZfdHlwZXNfLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFBIUCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzZXJ2aWNlIGhlYWRlciBjb250YWlucyBuYW1lc3BhY2Ugc3VmZml4IGFuZCBpbmNsdWRlcyBpbnNpZGUgZmlsZSBzcGVjaWZpZWQKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRfc2VydmljZSogdHNlcnZpY2UsIHN0ZDo6b3N0cmVhbSYgZmlsZSkgeworICBmaWxlIDw8ICI8P3BocCIgPDwgZW5kbDsKKyAgaWYgKCFwaHBfbmFtZXNwYWNlX3N1ZmZpeCh0c2VydmljZS0+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+PSA1LjQpXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ2MmY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNzc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogUHl0aG9uIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9weV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3B5X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yIChwcm9ncmFtKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGdlbl9uZXdzdHlsZV8gPSB0cnVlOworICAgIGdlbl91dGY4c3RyaW5nc18gPSB0cnVlOworICAgIGdlbl9keW5iYXNlXyA9IGZhbHNlOworICAgIGdlbl9zbG90c18gPSBmYWxzZTsKKyAgICBnZW5fdG9ybmFkb18gPSBmYWxzZTsKKyAgICBnZW5fem9wZV9pbnRlcmZhY2VfID0gZmFsc2U7CisgICAgZ2VuX3R3aXN0ZWRfID0gZmFsc2U7CisgICAgZ2VuX2R5bmFtaWNfID0gZmFsc2U7CisgICAgY29kaW5nXyA9ICIiOworICAgIGdlbl9keW5iYXNlY2xhc3NfID0gIiI7CisgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gIiI7CisgICAgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fID0gIiI7CisgICAgaW1wb3J0X2R5bmJhc2VfID0gIiI7CisgICAgcGFja2FnZV9wcmVmaXhfID0gIiI7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibmV3X3N0eWxlIikgPT0gMCkgeworICAgICAgICBwd2FybmluZygwLCAibmV3X3N0eWxlIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCwgc28gdGhlIG9wdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlLlxuIik7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm9sZF9zdHlsZSIpID09IDApIHsKKyAgICAgICAgZ2VuX25ld3N0eWxlXyA9IGZhbHNlOworICAgICAgICBwd2FybmluZygwLCAib2xkX3N0eWxlIGlzIGRlcHJlY2F0ZWQgYW5kIG1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4iKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidXRmOHN0cmluZ3MiKSA9PSAwKSB7CisgICAgICAgIHB3YXJuaW5nKDAsICJ1dGY4c3RyaW5ncyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIHNvIHRoZSBvcHRpb24gd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZS5cbiIpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub191dGY4c3RyaW5ncyIpID09IDApIHsKKyAgICAgICAgZ2VuX3V0ZjhzdHJpbmdzXyA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJzbG90cyIpID09IDApIHsKKyAgICAgICAgZ2VuX3Nsb3RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInBhY2thZ2VfcHJlZml4IikgPT0gMCkgeworICAgICAgICBwYWNrYWdlX3ByZWZpeF8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmFtaWMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9keW5hbWljXyA9IHRydWU7CisgICAgICAgIGdlbl9uZXdzdHlsZV8gPSBmYWxzZTsgLy8gZHluYW1pYyBpcyBuZXdzdHlsZQorICAgICAgICBpZiggZ2VuX2R5bmJhc2VjbGFzc18uZW1wdHkoKSkgeworICAgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfID0gIlRCYXNlIjsKKyAgICAgICAgfQorICAgICAgICBpZiggZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fLmVtcHR5KCkpIHsKKyAgICAgICAgICBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8gPSAiVEZyb3plbkJhc2UiOworICAgICAgICB9CisgICAgICAgIGlmKCBnZW5fZHluYmFzZWNsYXNzX2V4Y18uZW1wdHkoKSkgeworICAgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfZXhjXyA9ICJURXhjZXB0aW9uQmFzZSI7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGltcG9ydF9keW5iYXNlXy5lbXB0eSgpKSB7CisgICAgICAgICAgaW1wb3J0X2R5bmJhc2VfID0gImZyb20gdGhyaWZ0LnByb3RvY29sLlRCYXNlIGltcG9ydCBUQmFzZSwgVEZyb3plbkJhc2UsIFRFeGNlcHRpb25CYXNlLCBUVHJhbnNwb3J0XG4iOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmJhc2UiKSA9PSAwKSB7CisgICAgICAgIGdlbl9keW5iYXNlXyA9IHRydWU7CisgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmZyb3plbiIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmV4YyIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmltcG9ydCIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VfID0gdHJ1ZTsKKyAgICAgICAgaW1wb3J0X2R5bmJhc2VfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInpvcGUuaW50ZXJmYWNlIikgPT0gMCkgeworICAgICAgICBnZW5fem9wZV9pbnRlcmZhY2VfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidHdpc3RlZCIpID09IDApIHsKKyAgICAgICAgZ2VuX3R3aXN0ZWRfID0gdHJ1ZTsKKyAgICAgICAgZ2VuX3pvcGVfaW50ZXJmYWNlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInRvcm5hZG8iKSA9PSAwKSB7CisgICAgICAgIGdlbl90b3JuYWRvXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNvZGluZyIpID09IDApIHsKKyAgICAgICAgY29kaW5nXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBweToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdlbl90d2lzdGVkXyAmJiBnZW5fdG9ybmFkb18pIHsKKyAgICAgIHRocm93ICJhdCBtb3N0IG9uZSBvZiAndHdpc3RlZCcgYW5kICd0b3JuYWRvJyBhcmUgYWxsb3dlZCI7CisgICAgfQorCisgICAgY29weV9vcHRpb25zXyA9IG9wdGlvbl9zdHJpbmc7CisKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1weS50d2lzdGVkIjsKKyAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkudG9ybmFkbyI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5IjsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBpbmRlbnRfc3RyKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiAiICAgICI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgb3ZlcnJpZGU7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcHlfYXV0b2dlbl9jb21tZW50KCk7CisgIHN0ZDo6c3RyaW5nIHB5X2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGludGVyZmFjZSA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHByZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwb3N0ID0gTlVMTCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSk7CisKKyAgc3RhdGljIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7CisgICAgcmV0dXJuIHN1Yl9uYW1lc3BhY2UgPT0gInR3aXN0ZWQiOworICB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldF9yZWFsX3B5X21vZHVsZShjb25zdCB0X3Byb2dyYW0qIHByb2dyYW0sIGJvb2wgZ2VuX3R3aXN0ZWQsIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyPSIiKSB7CisgICAgaWYgKGdlbl90d2lzdGVkKSB7CisgICAgICBzdGQ6OnN0cmluZyB0d2lzdGVkX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoInB5LnR3aXN0ZWQiKTsKKyAgICAgIGlmICghdHdpc3RlZF9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gdHdpc3RlZF9tb2R1bGU7CisgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJweSIpOworICAgIGlmIChyZWFsX21vZHVsZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgcmV0dXJuIHBhY2thZ2VfZGlyICsgcmVhbF9tb2R1bGU7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc19pbW11dGFibGUodF90eXBlKiB0dHlwZSkgeworICAgIHJldHVybiB0dHlwZS0+YW5ub3RhdGlvbnNfLmZpbmQoInB5dGhvbi5pbW11dGFibGUiKSAhPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmVuZCgpOworICB9CisKK3ByaXZhdGU6CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIG5ldy1zdHlsZSBjbGFzc2VzLgorICAgKi8KKyAgYm9vbCBnZW5fbmV3c3R5bGVfOworCisgIC8qKgorICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGR5bmFtaWMgc3R5bGUgY2xhc3Nlcy4KKyAgKi8KKyAgYm9vbCBnZW5fZHluYW1pY187CisKKyAgYm9vbCBnZW5fZHluYmFzZV87CisgIHN0ZDo6c3RyaW5nIGdlbl9keW5iYXNlY2xhc3NfOworICBzdGQ6OnN0cmluZyBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl87CisgIHN0ZDo6c3RyaW5nIGdlbl9keW5iYXNlY2xhc3NfZXhjXzsKKworICBzdGQ6OnN0cmluZyBpbXBvcnRfZHluYmFzZV87CisKKyAgYm9vbCBnZW5fc2xvdHNfOworCisgIHN0ZDo6c3RyaW5nIGNvcHlfb3B0aW9uc187CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGNvZGUgZm9yIHVzZSB3aXRoIHpvcGUuaW50ZXJmYWNlLgorICAgKi8KKyAgYm9vbCBnZW5fem9wZV9pbnRlcmZhY2VfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBUd2lzdGVkLWZyaWVuZGx5IFJQQyBzZXJ2aWNlcy4KKyAgICovCisgIGJvb2wgZ2VuX3R3aXN0ZWRfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCBUb3JuYWRvCisgICAqLworICBib29sIGdlbl90b3JuYWRvXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiBzdHJpbmdzIHNob3VsZCBiZSBlbmNvZGVkIHVzaW5nIHV0Zi04LgorICAgKi8KKyAgYm9vbCBnZW5fdXRmOHN0cmluZ3NfOworCisgIC8qKgorICAgKiBzcGVjaWZ5IGdlbmVyYXRlZCBmaWxlIGVuY29kaW5nCisgICAqIGVnLiAjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorICAgKi8KKyAgc3RyaW5nIGNvZGluZ187CisKKyAgc3RyaW5nIHBhY2thZ2VfcHJlZml4XzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOworICBzdGQ6OnN0cmluZyBtb2R1bGVfOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBsYW5nX2tleXdvcmRzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHN0ZDo6c3RyaW5nIGtleXdvcmRzW10gPSB7ICJGYWxzZSIsICJOb25lIiwgIlRydWUiLCAiYW5kIiwgImFzIiwgImFzc2VydCIsICJicmVhayIsICJjbGFzcyIsCisgICAgICAgICAgImNvbnRpbnVlIiwgImRlZiIsICJkZWwiLCAiZWxpZiIsICJlbHNlIiwgImV4Y2VwdCIsICJleGVjIiwgImZpbmFsbHkiLCAiZm9yIiwgImZyb20iLAorICAgICAgICAgICJnbG9iYWwiLCAiaWYiLCAiaW1wb3J0IiwgImluIiwgImlzIiwgImxhbWJkYSIsICJub25sb2NhbCIsICJub3QiLCAib3IiLCAicGFzcyIsICJwcmludCIsCisgICAgICAgICAgInJhaXNlIiwgInJldHVybiIsICJ0cnkiLCAid2hpbGUiLCAid2l0aCIsICJ5aWVsZCIgfTsKKyAgICByZXR1cm4gc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KGtleXdvcmRzLCBrZXl3b3JkcyArIHNpemVvZihrZXl3b3Jkcykvc2l6ZW9mKGtleXdvcmRzWzBdKSApOworICB9Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbV8sIGdlbl90d2lzdGVkXyk7CisgIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7CisgIG1vZHVsZV8gPSBtb2R1bGU7CisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCisgICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOworICAgIHN0ZDo6b2ZzdHJlYW0gaW5pdF9weSgocGFja2FnZV9kaXJfICsgIi9fX2luaXRfXy5weSIpLmNfc3RyKCksIHN0ZDo6aW9zX2Jhc2U6OmFwcCk7CisgICAgaW5pdF9weS5jbG9zZSgpOworICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IG1vZHVsZS5maW5kKCcuJyk7CisgICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlOworICAgICAgbW9kdWxlLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlLnN1YnN0cigwLCBwb3MpOworICAgICAgbW9kdWxlLmVyYXNlKDAsIHBvcyArIDEpOworICAgIH0KKyAgfQorCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICJ0dHlwZXMucHkiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICJjb25zdGFudHMucHkiOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBmX2luaXRfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvX19pbml0X18ucHkiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaW5pdDsKKyAgZl9pbml0Lm9wZW4oZl9pbml0X25hbWUuY19zdHIoKSk7CisgIGZfaW5pdCA8PCAiX19hbGxfXyA9IFsndHR5cGVzJywgJ2NvbnN0YW50cyciOworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgZl9pbml0IDw8ICIsICciIDw8ICgqc3ZfaXRlciktPmdldF9uYW1lKCkgPDwgIiciOworICB9CisgIGZfaW5pdCA8PCAiXSIgPDwgZW5kbDsKKyAgZl9pbml0LmNsb3NlKCk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgPDwgcHlfaW1wb3J0cygpIDw8IGVuZGwKKyAgICAgICAgICAgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbAorICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGltcG9ydF9keW5iYXNlXzsKKworICBmX3R5cGVzXyA8PCAiYWxsX3N0cnVjdHMgPSBbXSIgPDwgZW5kbDsKKworICBmX2NvbnN0c18gPDwKKyAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8CisgICAgcHlfaW1wb3J0cygpIDw8IGVuZGwgPDwKKyAgICAiZnJvbSAudHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsOworfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgZm9yIChhdXRvIGluY2x1ZGUgOiBpbmNsdWRlcykgeworICAgIHJlc3VsdCArPSAiaW1wb3J0ICIgKyBnZXRfcmVhbF9weV9tb2R1bGUoaW5jbHVkZSwgZ2VuX3R3aXN0ZWRfLCBwYWNrYWdlX3ByZWZpeF8pICsgIi50dHlwZXNcbiI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnB5X2F1dG9nZW5fY29tbWVudCgpIHsKKyAgc3RyaW5nIGNvZGluZzsKKyAgaWYgKCFjb2RpbmdfLmVtcHR5KCkpIHsKKyAgICAgIGNvZGluZyA9ICIjIC0qLSBjb2Rpbmc6ICIgKyBjb2RpbmdfICsgIiAtKi1cbiI7CisgIH0KKyAgcmV0dXJuIGNvZGluZyArIHN0ZDo6c3RyaW5nKCIjXG4iKSArICIjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgKyAiI1xuIiArICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiI1xuIgorICAgICAgICAgKyAiIyAgb3B0aW9ucyBzdHJpbmc6ICIgKyBjb3B5X29wdGlvbnNfICsgIlxuIiArICIjXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cworICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnB5X2ltcG9ydHMoKSB7CisgIG9zdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8ICJmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRUeXBlLCBUTWVzc2FnZVR5cGUsIFRGcm96ZW5EaWN0LCBURXhjZXB0aW9uLCAiCisgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24iCisgICAgIDw8IGVuZGwKKyAgICAgPDwgImZyb20gdGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpbXBvcnQgVFByb3RvY29sRXhjZXB0aW9uIgorICAgICA8PCBlbmRsCisgICAgIDw8ICJmcm9tIHRocmlmdC5UUmVjdXJzaXZlIGltcG9ydCBmaXhfc3BlYyIKKyAgICAgPDwgZW5kbDsKKworICBpZiAoZ2VuX3V0ZjhzdHJpbmdzXykgeworICAgIHNzIDw8IGVuZGwgPDwgImltcG9ydCBzeXMiOworICB9CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworCisgIC8vIEZpeCB0aHJpZnRfc3BlYyBkZWZpbml0aW9ucyBmb3IgcmVjdXJzaXZlIHN0cnVjdHMuCisgIGZfdHlwZXNfIDw8ICJmaXhfc3BlYyhhbGxfc3RydWN0cykiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJkZWwgYWxsX3N0cnVjdHMiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICBmX3R5cGVzXy5jbG9zZSgpOworICBmX2NvbnN0c18uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFB5dGhvbiwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSB0b19zdHJpbmdfbWFwcGluZywgZnJvbV9zdHJpbmdfbWFwcGluZzsKKworICBmX3R5cGVzXyA8PCBlbmRsIDw8IGVuZGwgPDwgImNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgKGdlbl9uZXdzdHlsZV8gPyAiKG9iamVjdCkiIDogIiIpCisgICAgICAgICAgIDw8IChnZW5fZHluYW1pY18gPyAiKCIgKyBnZW5fZHluYmFzZWNsYXNzXyArICIpIiA6ICIiKSA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl90eXBlc18sIHRlbnVtKTsKKworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiX1ZBTFVFU19UT19OQU1FUyA9IHsiIDw8IGVuZGw7CisgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIl9OQU1FU19UT19WQUxVRVMgPSB7IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8IGVuZGw7CisKKyAgICAvLyBEaWN0aW9uYXJpZXMgdG8vZnJvbSBzdHJpbmcgbmFtZXMgb2YgZW51bXMKKyAgICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCB2YWx1ZSA8PCAiOiBcIiIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIlwiLCIgPDwgZW5kbDsKKyAgICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICciJyA8PCBlc2NhcGVfc3RyaW5nKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIjogIiA8PCB2YWx1ZSA8PCAnLCcgPDwgZW5kbDsKKyAgfQorICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBlbmRsOworICBmX3R5cGVzXyA8PCB0b19zdHJpbmdfbWFwcGluZy5zdHIoKSA8PCBlbmRsIDw8IGZyb21fc3RyaW5nX21hcHBpbmcuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKKyAgZl9jb25zdHNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIlRydWUiIDogIkZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgImZsb2F0KCIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKip7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0pIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBpZiAoaXNfaW1tdXRhYmxlKHR5cGUpKSB7CisgICAgICBvdXQgPDwgIlRGcm96ZW5EaWN0KCI7CisgICAgfQorICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpIDw8ICI6ICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0eXBlKSkgeworICAgICAgb3V0IDw8ICIpIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgaWYgKGlzX2ltbXV0YWJsZSh0eXBlKSkgeworICAgICAgICBvdXQgPDwgImZyb3plbiI7CisgICAgICB9CisgICAgICBvdXQgPDwgInNldCgiOworICAgIH0KKyAgICBpZiAoaXNfaW1tdXRhYmxlKHR5cGUpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQgPDwgIigiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGlmIChpc19pbW11dGFibGUodHlwZSkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl0iOworICAgIH0KKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiKSI7CisgICAgfQorICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlICJmb3J3YXJkIGRlY2xhcmF0aW9ucyIgZm9yIHB5dGhvbiBzdHJ1Y3RzLgorICogVGhlc2UgYXJlIGFjdHVhbGx5IGZ1bGwgY2xhc3MgZGVmaW5pdGlvbnMgc28gdGhhdCBjYWxscyB0byBnZW5lcmF0ZV9zdHJ1Y3QKKyAqIGNhbiBhZGQgdGhlIHRocmlmdF9zcGVjIGZpZWxkLiAgVGhpcyBpcyBuZWVkZWQgc28gdGhhdCBhbGwgdGhyaWZ0X3NwZWMKKyAqIGRlZmluaXRpb25zIGFyZSBncm91cGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgdG8gZW5hYmxlIGNvLXJlY3Vyc2l2ZSBzdHJ1Y3RzLgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KSB7CisgICAgZ2VuZXJhdGVfcHlfc3RydWN0KHRzdHJ1Y3QsIHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHB5dGhvbiBzdHJ1Y3QKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMoZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHl0aG9uIHN0cnVjdAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworfQorCisKKy8qKgorICogR2VuZXJhdGUgdGhlIHRocmlmdF9zcGVjIGZvciBhIHN0cnVjdAorICogRm9yIGV4YW1wbGUsCisgKiAgIGFsbF9zdHJ1Y3RzLmFwcGVuZChSZWN1cnNpdmUpCisgKiAgIFJlY3Vyc2l2ZS50aHJpZnRfc3BlYyA9ICgKKyAqICAgICAgIE5vbmUsICAjIDAKKyAqICAgICAgICgxLCBUVHlwZS5MSVNULCAnQ2hpbGRyZW4nLCAoVFR5cGUuU1RSVUNULCAoUmVjdXJzaXZlLCBOb25lKSwgRmFsc2UpLCBOb25lLCApLCAgIyAxCisgKiAgICkKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qaXNfZXhjZXB0aW9uKi8pIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgc29ydGVkX21lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8vIEFkZCBzdHJ1Y3QgZGVmaW5pdGlvbiB0byBsaXN0IHNvIHRocmlmdF9zcGVjIGNhbiBiZSBmaXhlZCBmb3IgcmVjdXJzaXZlIHN0cnVjdHVyZXMuCisgIGluZGVudChvdXQpIDw8ICJhbGxfc3RydWN0cy5hcHBlbmQoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOworCisgIGlmIChzb3J0ZWRfbWVtYmVycy5lbXB0eSgpIHx8IChzb3J0ZWRfbWVtYmVyc1swXS0+Z2V0X2tleSgpID49IDApKSB7CisgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnRocmlmdF9zcGVjID0gKCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGludCBzb3J0ZWRfa2V5c19wb3MgPSAwOworICAgIGZvciAobV9pdGVyID0gc29ydGVkX21lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IHNvcnRlZF9tZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworCisgICAgICBmb3IgKDsgc29ydGVkX2tleXNfcG9zICE9ICgqbV9pdGVyKS0+Z2V0X2tleSgpOyBzb3J0ZWRfa2V5c19wb3MrKykgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiTm9uZSwgICMgIiA8PCBzb3J0ZWRfa2V5c19wb3MgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCkgPDwgIigiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8ICInIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiciCisgICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fc3BlY19hcmdzKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUoKm1faXRlcikgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgIiksIgorICAgICAgICAgICAgICAgICAgPDwgIiAgIyAiIDw8IHNvcnRlZF9rZXlzX3BvcyA8PCBlbmRsOworCisgICAgICBzb3J0ZWRfa2V5c19wb3MrKzsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi50aHJpZnRfc3BlYyA9ICgpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgc29ydGVkX21lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIG91dCA8PCBlbmRsIDw8IGVuZGwgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGlmIChnZW5fZHluYW1pY18pIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgZ2VuX2R5bmJhc2VjbGFzc19leGNfIDw8ICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIoVEV4Y2VwdGlvbikiOworICAgIH0KKyAgfSBlbHNlIGlmIChnZW5fZHluYW1pY18pIHsKKyAgICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgICBvdXQgPDwgIigiIDw8IGdlbl9keW5iYXNlY2xhc3NfZnJvemVuXyA8PCAiKSI7CisgICAgfSBlbHNlICB7CisgICAgICBvdXQgPDwgIigiIDw8IGdlbl9keW5iYXNlY2xhc3NfIDw8ICIpIjsKKyAgICB9CisgIH0gZWxzZSBpZiAoZ2VuX25ld3N0eWxlXykgeworICAgIG91dCA8PCAiKG9iamVjdCkiOworICB9CisgIG91dCA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0c3RydWN0KTsKKworICBvdXQgPDwgZW5kbDsKKworICAvKgorICAgICBIZXJlIHdlIGdlbmVyYXRlIHRoZSBzdHJ1Y3R1cmUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGZhc3RiaW5hcnkgY29kZWMuCisgICAgIFRoZXNlIHNwZWNpZmljYXRpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgICAgIHRocmlmdF9zcGVjIC0+IHR1cGxlIG9mIGl0ZW1fc3BlYworICAgICBpdGVtX3NwZWMgLT4gTm9uZSB8ICh0YWcsIHR5cGVfZW51bSwgbmFtZSwgc3BlY19hcmdzLCBkZWZhdWx0KQorICAgICB0YWcgLT4gaW50ZWdlcgorICAgICB0eXBlX2VudW0gLT4gVFR5cGUuSTMyIHwgVFR5cGUuU1RSSU5HIHwgVFR5cGUuU1RSVUNUIHwgLi4uCisgICAgIG5hbWUgLT4gc3RyaW5nX2xpdGVyYWwKKyAgICAgZGVmYXVsdCAtPiBOb25lICAjIEhhbmRsZWQgYnkgX19pbml0X18KKyAgICAgc3BlY19hcmdzIC0+IE5vbmUgICMgRm9yIHNpbXBsZSB0eXBlcworICAgICAgICAgICAgICAgIHwgKHR5cGVfZW51bSwgc3BlY19hcmdzKSAgIyBWYWx1ZSB0eXBlIGZvciBsaXN0L3NldAorICAgICAgICAgICAgICAgIHwgKHR5cGVfZW51bSwgc3BlY19hcmdzLCB0eXBlX2VudW0sIHNwZWNfYXJncykKKyAgICAgICAgICAgICAgICAgICMgS2V5IGFuZCB2YWx1ZSBmb3IgbWFwCisgICAgICAgICAgICAgICAgfCAoY2xhc3NfbmFtZSwgc3BlY19hcmdzX3B0cikgIyBGb3Igc3RydWN0L2V4Y2VwdGlvbgorICAgICBjbGFzc19uYW1lIC0+IGlkZW50aWZpZXIgICMgQmFzaWNhbGx5IGEgcG9pbnRlciB0byB0aGUgY2xhc3MKKyAgICAgc3BlY19hcmdzX3B0ciAtPiBleHByZXNzaW9uICAjIGp1c3QgY2xhc3NfbmFtZS5zcGVjX2FyZ3MKKworICAgICBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIG1ha2luZyB0aGlzIHdvcmsgZm9yIHN0cnVjdHMgd2l0aCBuZWdhdGl2ZSB0YWdzLgorICAqLworCisgIGlmIChnZW5fc2xvdHNfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIl9fc2xvdHNfXyA9ICgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yIChtX2l0ZXIgPSBzb3J0ZWRfbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gc29ydGVkX21lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gVE9ETyhkcmVpc3MpOiBMb29rIGludG8gZ2VuZXJhdGluZyBhbiBlbXB0eSB0dXBsZSBpbnN0ZWFkIG9mIE5vbmUKKyAgLy8gZm9yIHN0cnVjdHVyZXMgd2l0aCBubyBtZW1iZXJzLgorICAvLyBUT0RPKGRyZWlzcyk6IFRlc3QgZW5jb2Rpbmcgb2Ygc3RydWN0cyB3aGVyZSBzb21lIGlubmVyIHN0cnVjdHMKKyAgLy8gZG9uJ3QgaGF2ZSB0aHJpZnRfc3BlYy4KKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwiOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgb3V0IDw8ICIgIiA8PCBkZWNsYXJlX2FyZ3VtZW50KCptX2l0ZXIpIDw8ICIsIjsKKyAgICB9CisgICAgb3V0IDw8ICIpOiIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgLy8gSW5pdGlhbGl6ZSBmaWVsZHMKKyAgICAgIHRfdHlwZSogdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgIGlmICghdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX2VudW0oKSAmJiAoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaXMgIgorICAgICAgICAgICAgICAgICAgICA8PCAic2VsZi50aHJpZnRfc3BlY1siIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICJdWzRdOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSgqbV9pdGVyKQorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorCisgICAgICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgICAgIGlmIChnZW5fbmV3c3R5bGVfIHx8IGdlbl9keW5hbWljXykgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJzdXBlcigiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgc2VsZikuX19zZXRhdHRyX18oJyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJzZWxmLl9fZGljdF9fWyciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInXSA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJzZWxmLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19zZXRhdHRyX18oc2VsZiwgKmFyZ3MpOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIFR5cGVFcnJvcihcImNhbid0IG1vZGlmeSBpbW11dGFibGUgaW5zdGFuY2VcIikiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX2RlbGF0dHJfXyhzZWxmLCAqYXJncyk6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UgVHlwZUVycm9yKFwiY2FuJ3QgbW9kaWZ5IGltbXV0YWJsZSBpbnN0YW5jZVwiKSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgLy8gSGFzaCBhbGwgb2YgdGhlIG1lbWJlcnMgaW4gb3JkZXIsIGFuZCBhbHNvIGhhc2ggaW4gdGhlIGNsYXNzCisgICAgLy8gdG8gYXZvaWQgY29sbGlzaW9ucyBmb3Igc3R1ZmYgbGlrZSBzaW5nbGUtZmllbGQgc3RydWN0dXJlcy4KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX2hhc2hfXyhzZWxmKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gaGFzaChzZWxmLl9fY2xhc3NfXykgXiBoYXNoKCgiOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgb3V0IDw8ICJzZWxmLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICI7CisgICAgfQorCisgICAgb3V0IDw8ICIpKSIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghZ2VuX2R5bmFtaWNfKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICAgIGdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorCisgIC8vIEZvciBleGNlcHRpb25zIG9ubHksIGdlbmVyYXRlIGEgX19zdHJfXyBtZXRob2QuIFRoaXMgaXMKKyAgLy8gYmVjYXVzZSB3aGVuIHJhaXNlZCBleGNlcHRpb25zIGFyZSBwcmludGVkIHRvIHRoZSBjb25zb2xlLCBfX3JlcHJfXworICAvLyBpc24ndCB1c2VkLiBTZWUgcHl0aG9uIGJ1ZyAjNTg4MgorICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19zdHJfXyhzZWxmKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gcmVwcihzZWxmKSIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghZ2VuX3Nsb3RzXykgeworICAgIG91dCA8PCBlbmRsOworICAgIC8vIFByaW50aW5nIHV0aWxpdGllcyBzbyB0aGF0IG9uIHRoZSBjb21tYW5kIGxpbmUgdGhyaWZ0CisgICAgLy8gc3RydWN0cyBsb29rIHByZXR0eSBsaWtlIGRpY3Rpb25hcmllcworICAgIGluZGVudChvdXQpIDw8ICJkZWYgX19yZXByX18oc2VsZik6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuX19kaWN0X18uaXRlbXMoKV0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICAvLyBFcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSBtZXRob2RzIHRoYXQgY29tcGFyZSBieSB2YWx1ZQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKSBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAic2VsZi5fX2RpY3RfXyA9PSBvdGhlci5fX2RpY3RfXyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19uZV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAoIWdlbl9keW5hbWljXykgeworICAgIG91dCA8PCBlbmRsOworICAgIC8vIG5vIGJhc2UgY2xhc3MgYXZhaWxhYmxlIHRvIGltcGxlbWVudCBfX2VxX18gYW5kIF9fcmVwcl9fIGFuZCBfX25lX18gZm9yIHVzCisgICAgLy8gc28gd2UgbXVzdCBwcm92aWRlIG9uZSB0aGF0IHVzZXMgX19zbG90c19fCisgICAgaW5kZW50KG91dCkgPDwgImRlZiBfX3JlcHJfXyhzZWxmKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJMID0gWyclcz0lcicgJSAoa2V5LCBnZXRhdHRyKHNlbGYsIGtleSkpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgIGZvciBrZXkgaW4gc2VsZi5fX3Nsb3RzX19dIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgLy8gRXF1YWxpdHkgbWV0aG9kIHRoYXQgY29tcGFyZXMgZWFjaCBhdHRyaWJ1dGUgYnkgdmFsdWUgYW5kIHR5cGUsIHdhbGtpbmcgX19zbG90c19fCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19lcV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiBGYWxzZSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIGF0dHIgaW4gc2VsZi5fX3Nsb3RzX186IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAibXlfdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm90aGVyX3ZhbCA9IGdldGF0dHIob3RoZXIsIGF0dHIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgbXlfdmFsICE9IG90aGVyX3ZhbDoiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIEZhbHNlIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gVHJ1ZSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX25lX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJAY2xhc3NtZXRob2QiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImRlZiByZWFkKGNscywgaXByb3QpOiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmIHJlYWQoc2VsZiwgaXByb3QpOiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKworICBjb25zdCBjaGFyKiBpZCA9IGlzX2ltbXV0YWJsZSh0c3RydWN0KSA/ICJjbHMiIDogInNlbGYiOworCisgIGluZGVudChvdXQpIDw8ICJpZiBpcHJvdC5fZmFzdF9kZWNvZGUgaXMgbm90IE5vbmUgIgorICAgICAgICAgICAgICAgICAiYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSAiCisgICAgICAgICAgICAgICAgICJhbmQgIgorICAgICAgICAgICAgICA8PCBpZCA8PCAiLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gaXByb3QuX2Zhc3RfZGVjb2RlKE5vbmUsIGlwcm90LCBbY2xzLCBjbHMudGhyaWZ0X3NwZWNdKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuX2Zhc3RfZGVjb2RlKHNlbGYsIGlwcm90LCBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpIiA8PCBlbmRsOworICAKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiB0ZmllbGQgPSAqZl9pdGVyOworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgICAgIHJlc3VsdCA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9ICI7CisgICAgICBpZiAodGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICAgIHJlc3VsdCA8PCByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0ZmllbGQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0IDw8ICJOb25lIjsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdC5zdHIoKSA8PCBlbmRsOworICAgICB9CisgIH0KKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlIFRydWU6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgIihmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09IFRUeXBlLlNUT1A6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbGlmICI7CisgICAgfQorICAgIG91dCA8PCAiZmlkID09ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi4iKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiaXByb3Quc2tpcChmdHlwZSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImlwcm90LnNraXAoZnR5cGUpIiA8PCBlbmRsOworCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOworCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGNscygiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiPSIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgImRlZiB3cml0ZShzZWxmLCBvcHJvdCk6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgb3Byb3QuX2Zhc3RfZW5jb2RlIGlzIG5vdCBOb25lIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJvcHJvdC50cmFucy53cml0ZShvcHJvdC5fZmFzdF9lbmNvZGUoc2VsZiwgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkpIgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKSIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgorICAgIGluZGVudChvdXQpIDw8ICJpZiBzZWxmLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaXMgbm90IE5vbmU6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICAgICAgICAgIDw8ICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpIgorICAgICAgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Cit9CisKK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiZGVmIHZhbGlkYXRlKHNlbGYpOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiBzZWxmLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyBOb25lOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24obWVzc2FnZT0nUmVxdWlyZWQgZmllbGQgIgorICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIGlzIHVuc2V0IScpIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLnB5IjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBweV9pbXBvcnRzKCkgPDwgZW5kbDsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiCisgICAgICAgICAgICAgICA8PCBnZXRfcmVhbF9weV9tb2R1bGUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCksIGdlbl90d2lzdGVkXywgcGFja2FnZV9wcmVmaXhfKSA8PCAiLiIKKyAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgbG9nZ2luZyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJmcm9tIC50dHlwZXMgaW1wb3J0ICoiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUUHJvY2Vzc29yIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGltcG9ydF9keW5iYXNlXzsKKyAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJmcm9tIHpvcGUuaW50ZXJmYWNlIGltcG9ydCBJbnRlcmZhY2UsIGltcGxlbWVudGVyIiA8PCBlbmRsOworICB9CisKKyAgaWYgKGdlbl90d2lzdGVkXykgeworICAgIGZfc2VydmljZV8gPDwgImZyb20gdHdpc3RlZC5pbnRlcm5ldCBpbXBvcnQgZGVmZXIiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgIGZfc2VydmljZV8gPDwgImZyb20gdG9ybmFkbyBpbXBvcnQgZ2VuIiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgImZyb20gdG9ybmFkbyBpbXBvcnQgY29uY3VycmVudCIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgImFsbF9zdHJ1Y3RzID0gW10iIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUodHNlcnZpY2UpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfIDw8ICJmaXhfc3BlYyhhbGxfc3RydWN0cykiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiZGVsIGFsbF9zdHJ1Y3RzIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgICAgfQorICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19pZiA9ICIoIiArIGV4dGVuZHMgKyAiLklmYWNlKSI7CisgIH0gZWxzZSB7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICAgIGV4dGVuZHNfaWYgPSAiKEludGVyZmFjZSkiOworICAgIH0gZWxzZSBpZiAoZ2VuX25ld3N0eWxlXyB8fCBnZW5fZHluYW1pY18gfHwgZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBleHRlbmRzX2lmID0gIihvYmplY3QpIjsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbCA8PCAiY2xhc3MgSWZhY2UiIDw8IGV4dGVuZHNfaWYgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBpZiAoZnVuY3Rpb25zLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwYXNzIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSkgPDwgIjoiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgKCpmX2l0ZXIpKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInBhc3MiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgICBleHRlbmRzX2NsaWVudCA9ICIoIiArIGV4dGVuZHMgKyAiLkNsaWVudCkiOworICAgIH0gZWxzZSB7CisgICAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8gJiYgKGdlbl9uZXdzdHlsZV8gfHwgZ2VuX2R5bmFtaWNfKSkgeworICAgICAgZXh0ZW5kc19jbGllbnQgPSAiKG9iamVjdCkiOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiQGltcGxlbWVudGVyKElmYWNlKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgImNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiY2xhc3MgQ2xpZW50KCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIklmYWNlKToiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCisgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBvcHJvdF9mYWN0b3J5KToiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgImRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSk6IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCBpcHJvdCwgb3Byb3Q9Tm9uZSk6IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdF9mYWN0b3J5ID0gb3Byb3RfZmFjdG9yeSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fc2VxaWQgPSAwIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9yZXFzID0ge30iIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5faXByb3RfZmFjdG9yeSA9IGlwcm90X2ZhY3RvcnkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX29wcm90X2ZhY3RvcnkgPSAob3Byb3RfZmFjdG9yeSBpZiBvcHJvdF9mYWN0b3J5IGlzIG5vdCBOb25lIgorICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaXByb3RfZmFjdG9yeSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3NlcWlkID0gMCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fcmVxcyA9IHt9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl90cmFuc3BvcnQuaW9fbG9vcC5zcGF3bl9jYWxsYmFjayhzZWxmLl9zdGFydF9yZWNlaXZpbmcpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9pcHJvdCA9IHNlbGYuX29wcm90ID0gaXByb3QiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIG9wcm90IGlzIG5vdCBOb25lOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInNlbGYuX29wcm90ID0gb3Byb3QiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3NlcWlkID0gMCIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBleHRlbmRzCisgICAgICAgICAgICAgICAgIDw8ICIuQ2xpZW50Ll9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgb3Byb3RfZmFjdG9yeSkiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcworICAgICAgICAgICAgICAgICA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3RvcnkpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGV4dGVuZHMgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX3Rvcm5hZG9fICYmIGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PAorICAgICAgaW5kZW50KCkgPDwgIkBnZW4uZW5naW5lIiA8PCBlbmRsIDw8CisgICAgICBpbmRlbnQoKSA8PCAiZGVmIF9zdGFydF9yZWNlaXZpbmcoc2VsZik6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid2hpbGUgVHJ1ZToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJmcmFtZSA9IHlpZWxkIHNlbGYuX3RyYW5zcG9ydC5yZWFkRnJhbWUoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24gYXMgZToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZm9yIGZ1dHVyZSBpbiBzZWxmLl9yZXFzLnZhbHVlcygpOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAiZnV0dXJlLnNldF9leGNlcHRpb24oZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAic2VsZi5fcmVxcyA9IHt9IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGZyYW1lKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90ID0gc2VsZi5faXByb3RfZmFjdG9yeS5nZXRQcm90b2NvbCh0cikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibWV0aG9kID0gZ2V0YXR0cihzZWxmLCAncmVjdl8nICsgZm5hbWUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZnV0dXJlID0gc2VsZi5fcmVxcy5wb3AocnNlcWlkLCBOb25lKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIG5vdCBmdXR1cmU6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIiMgZnV0dXJlIGhhcyBhbHJlYWR5IGJlZW4gZGlzY2FyZGVkIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImNvbnRpbnVlIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXN1bHQgPSBtZXRob2QoaXByb3QsIG10eXBlLCByc2VxaWQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJmdXR1cmUuc2V0X2V4Y2VwdGlvbihlKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImZ1dHVyZS5zZXRfcmVzdWx0KHJlc3VsdCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgKCpmX2l0ZXIpKTsKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlcWlkID0gc2VsZi5fc2VxaWQgPSBzZWxmLl9zZXFpZCArIDEiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuX3JlcXNbc2VxaWRdID0gZGVmZXIuRGVmZXJyZWQoKSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkID0gZGVmZXIubWF5YmVEZWZlcnJlZChzZWxmLnNlbmRfIiA8PCBmdW5uYW1lOworCisgICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5fc2VxaWQgKz0gMSIgPDwgZW5kbDsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1dHVyZSA9IHNlbGYuX3JlcXNbc2VsZi5fc2VxaWRdID0gY29uY3VycmVudC5GdXR1cmUoKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKyAgICB9CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAvLyB3ZSBuZWVkIGEgbGVhZGluZyBjb21tYSBpZiB0aGVyZSBhcmUgYXJncywgc2luY2UgaXQncyBjYWxsZWQgYXMgbWF5YmVEZWZlcnJlZChmdW5jbmFtZSwKKyAgICAgIC8vIGFyZykKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICAvLyBub3RoaW5nLiBTZWUgdGhlIG5leHQgYmxvY2suCisgICAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBmdXR1cmUiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICAgIH0KKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAic2VsZi5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCkiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAvLyBUaGlzIGJsb2NrIGluamVjdHMgdGhlIGJvZHkgb2YgdGhlIHNlbmRfPD4gbWV0aG9kIGZvciB0d2lzdGVkIChhbmQgYSBjYi9lYiBwYWlyKQorICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImQuYWRkQ2FsbGJhY2tzKCIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYWxsYmFjaz1zZWxmLmNiX3NlbmRfIiA8PCBmdW5uYW1lIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJjYWxsYmFja0FyZ3M9KHNlcWlkLCksIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJlcnJiYWNrPXNlbGYuZWJfc2VuZF8iCisgICAgICAgICAgICAgICAgIDw8IGZ1bm5hbWUgPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVycmJhY2tBcmdzPShzZXFpZCwpKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGQiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiBjYl9zZW5kXyIgPDwgZnVubmFtZSA8PCAiKHNlbGYsIF8sIHNlcWlkKToiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIC8vIGlmIG9uZS13YXksIGZpcmUgdGhlIGRlZmVycmVkICYgcmVtb3ZlIGl0IGZyb20gX3JlcXMKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZCA9IHNlbGYuX3JlcXMucG9wKHNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJkLmNhbGxiYWNrKE5vbmUpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmLl9yZXFzW3NlcWlkXSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAgIC8vIGFkZCBhbiBlcnJiYWNrIHRvIGZhaWwgdGhlIHJlcXVlc3QgaWYgdGhlIGNhbGwgdG8gc2VuZF88PiByYWlzZWQgYW4gZXhjZXB0aW9uCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiBlYl9zZW5kXyIgPDwgZnVubmFtZSA8PCAiKHNlbGYsIGYsIHNlcWlkKToiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQgPSBzZWxmLl9yZXFzLnBvcChzZXFpZCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImQuZXJyYmFjayhmKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgICBzdGQ6OnN0cmluZyBtZXNzYWdlVHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlLkNBTEwiOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgorICAgIGlmIChnZW5fdHdpc3RlZF8gfHwgZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdCA9IHNlbGYuX29wcm90X2ZhY3RvcnkuZ2V0UHJvdG9jb2woc2VsZi5fdHJhbnNwb3J0KSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCisgICAgICAgICAgICAgICAgIDw8IG1lc3NhZ2VUeXBlIDw8ICIsIHNlbGYuX3NlcWlkKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCisgICAgICAgICAgICAgICAgIDw8IG1lc3NhZ2VUeXBlIDw8ICIsIHNlbGYuX3NlcWlkKSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiKCkiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQorICAgIGlmIChnZW5fdHdpc3RlZF8gfHwgZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUoc2VsZi5fb3Byb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAic2VsZi5fb3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKHNlbGYsIGlwcm90LCBtdHlwZSwgcnNlcWlkKToiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIjoiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgorCisgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQgPSBzZWxmLl9yZXFzLnBvcChyc2VxaWQpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90ID0gc2VsZi5faXByb3QiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgbXR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJ4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkiIDw8IGVuZGw7CisKKyAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIngucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gZC5lcnJiYWNrKHgpIgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAicmVzdWx0LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIngucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSB4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAicmVzdWx0LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgcmVzdWx0LnN1Y2Nlc3MgaXMgbm90IE5vbmU6IiA8PCBlbmRsOworICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiBkLmNhbGxiYWNrKHJlc3VsdC5zdWNjZXNzKSIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIHJlc3VsdC5zdWNjZXNzIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGNvbnN0IHN0cmluZyYgeG5hbWUgPSAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIHJlc3VsdC4iIDw8IHhuYW1lIDw8ICIgaXMgbm90IE5vbmU6IiA8PCBlbmRsOworICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiBkLmVycmJhY2socmVzdWx0LiIgPDwgeG5hbWUgPDwgIikiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSByZXN1bHQuIiA8PCB4bmFtZSA8PCAiIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZC5jYWxsYmFjayhOb25lKSIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgICBmX3NlcnZpY2VfCisgICAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJyZXR1cm4gZC5lcnJiYWNrKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIgorICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpKSIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICA8PCAicmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY29tbWFuZCBsaW5lIHRvb2wgZm9yIG1ha2luZyByZW1vdGUgcmVxdWVzdHMKKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSByZW1vdGUgZm9yLgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgLy8gR2V0IGFsbCBmdW5jdGlvbiBmcm9tIHBhcmVudHMKKyAgdF9zZXJ2aWNlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBwX2Z1bmN0aW9ucyA9IHBhcmVudC0+Z2V0X2Z1bmN0aW9ucygpOworICAgIGZ1bmN0aW9ucy5pbnNlcnQoZnVuY3Rpb25zLmVuZCgpLCBwX2Z1bmN0aW9ucy5iZWdpbigpLCBwX2Z1bmN0aW9ucy5lbmQoKSk7CisgICAgcGFyZW50ID0gcGFyZW50LT5nZXRfZXh0ZW5kcygpOworICB9CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZl9yZW1vdGVfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLXJlbW90ZSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9yZW1vdGU7CisgIGZfcmVtb3RlLm9wZW4oZl9yZW1vdGVfbmFtZS5jX3N0cigpKTsKKworICBmX3JlbW90ZSA8PAorICAgICIjIS91c3IvYmluL2VudiBweXRob24iIDw8IGVuZGwgPDwKKyAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8CisgICAgImltcG9ydCBzeXMiIDw8IGVuZGwgPDwKKyAgICAiaW1wb3J0IHBwcmludCIgPDwgZW5kbCA8PAorICAgICJpZiBzeXMudmVyc2lvbl9pbmZvWzBdID4gMjoiIDw8IGVuZGwgPDwKKyAgICBpbmRlbnRfc3RyKCkgPDwgImZyb20gdXJsbGliLnBhcnNlIGltcG9ydCB1cmxwYXJzZSIgPDwgZW5kbCA8PAorICAgICJlbHNlOiIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAiZnJvbSB1cmxwYXJzZSBpbXBvcnQgdXJscGFyc2UiIDw8IGVuZGwgPDwKKyAgICAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0LCBUU29ja2V0LCBUU1NMU29ja2V0LCBUSHR0cENsaWVudCIgPDwgZW5kbCA8PAorICAgICJmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCIgPDwgZW5kbCA8PAorICAgIGVuZGw7CisKKyAgZl9yZW1vdGUgPDwKKyAgICAiZnJvbSAiIDw8IG1vZHVsZV8gPDwgIiBpbXBvcnQgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IGVuZGwgPDwKKyAgICAiZnJvbSAiIDw8IG1vZHVsZV8gPDwgIi50dHlwZXMgaW1wb3J0ICoiIDw8IGVuZGwgPDwKKyAgICBlbmRsOworCisgIGZfcmVtb3RlIDw8CisgICAgImlmIGxlbihzeXMuYXJndikgPD0gMSBvciBzeXMuYXJndlsxXSA9PSAnLS1oZWxwJzoiIDw8IGVuZGwgPDwKKyAgICBpbmRlbnRfc3RyKCkgPDwgInByaW50KCcnKSIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAicHJpbnQoJ1VzYWdlOiAnICsgc3lzLmFyZ3ZbMF0gKyAnIFstaCBob3N0Wzpwb3J0XV0gWy11IHVybF0gWy1mW3JhbWVkXV0gWy1zW3NsXV0gWy1ub3ZhbGlkYXRlXSBbLWNhX2NlcnRzIGNlcnRzXSBbLWtleWZpbGUga2V5ZmlsZV0gWy1jZXJ0ZmlsZSBjZXJ0ZmlsZV0gZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXScpIiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJwcmludCgnJykiIDw8IGVuZGwgPDwKKyAgICBpbmRlbnRfc3RyKCkgPDwgInByaW50KCdGdW5jdGlvbnM6JykiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50X3N0cigpIDw8ICJwcmludCgnICAiIDw8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICIKKyAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiOworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9yZW1vdGUgPDwgYXJnc1tpXS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgYXJnc1tpXS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9yZW1vdGUgPDwgIiknKSIgPDwgZW5kbDsKKyAgfQorICBmX3JlbW90ZSA8PCBpbmRlbnRfc3RyKCkgPDwgInByaW50KCcnKSIgPDwgZW5kbCA8PCBpbmRlbnRfc3RyKCkgPDwgInN5cy5leGl0KDApIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9yZW1vdGUgPDwgInBwID0gcHByaW50LlByZXR0eVByaW50ZXIoaW5kZW50PTIpIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJob3N0ID0gJ2xvY2FsaG9zdCciIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInBvcnQgPSA5MDkwIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJ1cmkgPSAnJyIgPDwgZW5kbAorICAgICAgICAgICA8PCAiZnJhbWVkID0gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInNzbCA9IEZhbHNlIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJ2YWxpZGF0ZSA9IFRydWUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImNhX2NlcnRzID0gTm9uZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAia2V5ZmlsZSA9IE5vbmUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImNlcnRmaWxlID0gTm9uZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiaHR0cCA9IEZhbHNlIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJhcmdpID0gMSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLWgnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInBhcnRzID0gc3lzLmFyZ3ZbYXJnaSArIDFdLnNwbGl0KCc6JykiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJob3N0ID0gcGFydHNbMF0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpZiBsZW4ocGFydHMpID4gMToiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAicG9ydCA9IGludChwYXJ0c1sxXSkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDIiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy11JzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJ1cmwgPSB1cmxwYXJzZShzeXMuYXJndlthcmdpICsgMV0pIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAicGFydHMgPSB1cmxbMV0uc3BsaXQoJzonKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImhvc3QgPSBwYXJ0c1swXSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIGxlbihwYXJ0cykgPiAxOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJwb3J0ID0gaW50KHBhcnRzWzFdKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImVsc2U6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInBvcnQgPSA4MCIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInVyaSA9IHVybFsyXSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIHVybFs0XToiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAidXJpICs9ICc/JXMnICUgdXJsWzRdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaHR0cCA9IFRydWUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDIiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1mJyBvciBzeXMuYXJndlthcmdpXSA9PSAnLWZyYW1lZCc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiZnJhbWVkID0gVHJ1ZSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLXMnIG9yIHN5cy5hcmd2W2FyZ2ldID09ICctc3NsJzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJzc2wgPSBUcnVlIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAxIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctbm92YWxpZGF0ZSc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAidmFsaWRhdGUgPSBGYWxzZSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLWNhX2NlcnRzJzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJjYV9jZXJ0cyA9IHN5cy5hcmd2W2FyZ2krMV0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDIiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1rZXlmaWxlJzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJrZXlmaWxlID0gc3lzLmFyZ3ZbYXJnaSsxXSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLWNlcnRmaWxlJzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJjZXJ0ZmlsZSA9IHN5cy5hcmd2W2FyZ2krMV0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDIiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiY21kID0gc3lzLmFyZ3ZbYXJnaV0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImFyZ3MgPSBzeXMuYXJndlthcmdpICsgMTpdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIGh0dHA6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAidHJhbnNwb3J0ID0gVEh0dHBDbGllbnQuVEh0dHBDbGllbnQoaG9zdCwgcG9ydCwgdXJpKSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiZWxzZToiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpZiBzc2w6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInNvY2tldCA9IFRTU0xTb2NrZXQuVFNTTFNvY2tldChob3N0LCBwb3J0LCAiCisgICAgICAgICAgICAgICJ2YWxpZGF0ZT12YWxpZGF0ZSwgY2FfY2VydHM9Y2FfY2VydHMsIGtleWZpbGU9a2V5ZmlsZSwgY2VydGZpbGU9Y2VydGZpbGUpIgorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiZWxzZToiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAic29ja2V0ID0gVFNvY2tldC5UU29ja2V0KGhvc3QsIHBvcnQpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgZnJhbWVkOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJ0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImVsc2U6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInByb3RvY29sID0gVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImNsaWVudCA9ICIgPDwgc2VydmljZV9uYW1lXyA8PCAiLkNsaWVudChwcm90b2NvbCkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInRyYW5zcG9ydC5vcGVuKCkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9yZW1vdGUgPDwgImVsIjsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIG51bV9hcmdzID0gYXJncy5zaXplKCk7CisKKyAgICBmX3JlbW90ZSA8PCAiaWYgY21kID09ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJzoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGxlbihhcmdzKSAhPSAiIDw8IG51bV9hcmdzIDw8ICI6IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJwcmludCgnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiByZXF1aXJlcyAiIDw8IG51bV9hcmdzCisgICAgICAgICAgICAgPDwgIiBhcmdzJykiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInN5cy5leGl0KDEpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInBwLnBwcmludChjbGllbnQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiOworICAgIGluZGVudF9kb3duKCk7CisgICAgYm9vbCBmaXJzdF9hcmcgPSB0cnVlOworICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CisgICAgICBpZiAoZmlyc3RfYXJnKQorICAgICAgICBmaXJzdF9hcmcgPSBmYWxzZTsKKyAgICAgIGVsc2UKKyAgICAgICAgZl9yZW1vdGUgPDwgIiAiOworICAgICAgaWYgKGFyZ3NbaV0tPmdldF90eXBlKCktPmlzX3N0cmluZygpKSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICJhcmdzWyIgPDwgaSA8PCAiXSwiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgImV2YWwoYXJnc1siIDw8IGkgPDwgIl0pLCI7CisgICAgICB9CisgICAgfQorICAgIGZfcmVtb3RlIDw8ICIpKSIgPDwgZW5kbDsKKworICAgIGZfcmVtb3RlIDw8IGVuZGw7CisgIH0KKworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3JlbW90ZSA8PCAiZWxzZToiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50X3N0cigpIDw8ICJwcmludCgnVW5yZWNvZ25pemVkIG1ldGhvZCAlcycgJSBjbWQpIiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudF9zdHIoKSA8PCAic3lzLmV4aXQoMSkiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgZW5kbDsKKyAgfQorCisgIGZfcmVtb3RlIDw8ICJ0cmFuc3BvcnQuY2xvc2UoKSIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9yZW1vdGUuY2xvc2UoKTsKKworI2lmbmRlZiBfTVNDX1ZFUgorCisgIC8vIE1ha2UgZmlsZSBleGVjdXRhYmxlLCBsb3ZlIHRoYXQgYml0d2lzZSBPUiBhY3Rpb24KKyAgY2htb2QoZl9yZW1vdGVfbmFtZS5jX3N0cigpLAorICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVhVU1IKKyNpZm5kZWYgX1dJTjMyCisgICAgICAgIHwgU19JUkdSUCB8IFNfSVhHUlAgfCBTX0lST1RIIHwgU19JWE9USAorI2VuZGlmCisgICAgICAgICk7CisKKyNlbmRpZiAvLyBfTVNDX1ZFUgorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvciwgIjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgIGZfc2VydmljZV8gPDwgIkBpbXBsZW1lbnRlcihJZmFjZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICJjbGFzcyBQcm9jZXNzb3IoIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiVFByb2Nlc3Nvcik6IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJJZmFjZSwgVFByb2Nlc3Nvcik6IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlcik6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9oYW5kbGVyID0gSWZhY2UoaGFuZGxlcikiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX2hhbmRsZXIgPSBoYW5kbGVyIiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX3Byb2Nlc3NNYXAgPSB7fSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBleHRlbmRzIDw8ICIuUHJvY2Vzc29yLl9faW5pdF9fKHNlbGYsIElmYWNlKGhhbmRsZXIpKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBleHRlbmRzIDw8ICIuUHJvY2Vzc29yLl9faW5pdF9fKHNlbGYsIGhhbmRsZXIpIiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX3Byb2Nlc3NNYXBbXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiXSA9IFByb2Nlc3Nvci5wcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fb25fbWVzc2FnZV9iZWdpbiA9IE5vbmUiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgb25fbWVzc2FnZV9iZWdpbihzZWxmLCBmdW5jKToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX29uX21lc3NhZ2VfYmVnaW4gPSBmdW5jIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKG5hbWUsIHR5cGUsIHNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgc2VsZi5fb25fbWVzc2FnZV9iZWdpbjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX29uX21lc3NhZ2VfYmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQorCisgIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgbmFtZSBub3QgaW4gc2VsZi5fcHJvY2Vzc01hcDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5za2lwKFRUeXBlLlNUUlVDVCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInggPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELCAnVW5rbm93biAiCisgICAgICAgICAgICAgICAgImZ1bmN0aW9uICVzJyAlIChuYW1lKSkiCisgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKworICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGRlZmVyLnN1Y2NlZWQoTm9uZSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgPDwgInJldHVybiBzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIFJlYWQgZW5kIG9mIGFyZ3MgZmllbGQsIHRoZSBUX1NUT1AsIGFuZCB0aGUgc3RydWN0IGNsb3NlCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaWYgKGdlbl90b3JuYWRvXykgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkBnZW4uY29yb3V0aW5lIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJkZWYgcHJvY2Vzc18iCisgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KToiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKGdlbl90d2lzdGVkXykgeworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQgPSBkZWZlci5tYXliZURlZmVycmVkKHNlbGYuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICIsICI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkLmFkZEVycmJhY2soc2VsZi5oYW5kbGVfZXhjZXB0aW9uXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZC5hZGRDYWxsYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImQuYWRkRXJyYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfZXhjZXB0aW9uXyIKKyAgICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIsIHJlc3VsdCwgc2VxaWQsIG9wcm90KSIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgaGFuZGxlX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgZXJyb3IsIHNlcWlkKToiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIHdyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgc3VjY2VzcywgcmVzdWx0LCBzZXFpZCwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9IHN1Y2Nlc3MiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiB3cml0ZV9yZXN1bHRzX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgZXJyb3IsIHJlc3VsdCwgc2VxaWQsIG9wcm90KToiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7CisKKyAgICAvLyBLaW5kYSBhYnN1cmQKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZXJyb3IucmFpc2VFeGNlcHRpb24oKSIgPDwgZW5kbDsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGNvbnN0IHN0cmluZyYgeG5hbWUgPSAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgYXMgIiA8PCB4bmFtZQorICAgICAgICAgICAgICAgICAgIDw8ICI6IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgeG5hbWUgPDwgIiA9ICIgPDwgeG5hbWUgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IGV4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIG1zZ190eXBlLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdFeGNlcHRpb24gaW4gb25ld2F5IGhhbmRsZXInKSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAieWllbGQgZ2VuLm1heWJlX2Z1dHVyZShzZWxmLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIgPDwgeG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmVzdWx0LiIgPDwgeG5hbWUgPDwgIiA9ICIgPDwgeG5hbWUgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IGV4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignRXhjZXB0aW9uIGluIG9uZXdheSBoYW5kbGVyJykiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgbXNnX3R5cGUsIHNlcWlkKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBpbmRlbnRfZG93bigpOworCisgIH0gZWxzZSB7IC8vIHB5CisgICAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICAgIC8vIEl0IGFsc28gY2F0Y2hlcyBhcmJpdHJhcnkgZXhjZXB0aW9ucyByYWlzZWQgYnkgaGFuZGxlciBtZXRob2QgdG8gcHJvcGFnYXRlIHRoZW0gdG8gdGhlIGNsaWVudAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAic2VsZi5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgImV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIiA8PCBlbmRsOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIgPDwgeG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCB4bmFtZSA8PCAiID0gIiA8PCB4bmFtZSA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IGV4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIG1zZ190eXBlLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdFeGNlcHRpb24gaW4gb25ld2F5IGhhbmRsZXInKSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgIGluZGVudF9kb3duKCk7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCkiOworICAgICAgICB9IGVsc2UgaWYoIWdlbl91dGY4c3RyaW5nc18pIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBlbHNlIGlwcm90LnJlYWRTdHJpbmcoKSI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUHl0aG9uIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5yZWFkKGlwcm90KSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCkiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQorICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKKyAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKKyAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKKyAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKKworICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOworICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfaTgsIGt0eXBlKTsKKyAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2k4LCB2dHlwZSk7CisgIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9pOCwgZXR5cGUpOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0ge30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIigiIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUKKyAgICAgICAgPDwgIiwgIiA8PCBzaXplIDw8ICIpID0gaXByb3QucmVhZE1hcEJlZ2luKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gc2V0KCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZQorICAgICAgICA8PCAiKSA9IGlwcm90LnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplCisgICAgICAgIDw8ICIpID0gaXByb3QucmVhZExpc3RCZWdpbigpIiA8PCBlbmRsOworICB9CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwKKyAgICAiZm9yICIgPDwgaSA8PCAiIGluIHJhbmdlKCIgPDwgc2l6ZSA8PCAiKToiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCkiIDw8IGVuZGw7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0dHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gVEZyb3plbkRpY3QoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCkiIDw8IGVuZGw7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0dHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gZnJvemVuc2V0KCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0dHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gdHVwbGUoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYXBwZW5kKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICB9IGVsc2UgaWYgKCFnZW5fdXRmOHN0cmluZ3NfKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIuZW5jb2RlKCd1dGYtOCcpIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBlbHNlICIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUHl0aG9uIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgImxlbigiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAiIDw8IGtpdGVyIDw8ICIsICIgPDwgdml0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLml0ZW1zKCk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIHN0cnVjdC4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0c3RydWN0LCB0c3RydWN0LCAiQXR0cmlidXRlcyIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0ZnVuY3Rpb24sIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIlBhcmFtZXRlcnMiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBzdHJ1Y3Qgb3IgZnVuY3Rpb24uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcikgeworICBib29sIGhhc19kb2MgPSBmYWxzZTsKKyAgc3RyaW5nc3RyZWFtIHNzOworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgaGFzX2RvYyA9IHRydWU7CisgICAgc3MgPDwgdGRvYy0+Z2V0X2RvYygpOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaWYgKGhhc19kb2MpIHsKKyAgICAgIHNzIDw8IGVuZGw7CisgICAgfQorICAgIGhhc19kb2MgPSB0cnVlOworICAgIHNzIDw8IHN1YmhlYWRlciA8PCAiOlxuIjsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3MgPDwgIiAtICIgPDwgcC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIjogIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChoYXNfZG9jKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiXCJcIlwiXG4iLCAiIiwgc3Muc3RyKCksICJcIlwiXCJcbiIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2VuZXJpYyBvYmplY3QuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiXCJcIlwiXG4iLCAiIiwgdGRvYy0+Z2V0X2RvYygpLCAiXCJcIlwiXG4iKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGFuIGFyZ3VtZW50LCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworICByZXN1bHQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI9IjsKKyAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgIHJlc3VsdCA8PCByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0ZmllbGQpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA8PCAiTm9uZSI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgZGVmYXVsdCB2YWx1ZSwgcmV0dXJucyBOb25lIG90aGVyd2lzZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIHRmaWVsZCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICB9IGVsc2UgeworICAgIHJldHVybiAiTm9uZSI7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbnRlcmZhY2UpIHsKKyAgdmVjdG9yPHN0cmluZz4gcHJlOworICB2ZWN0b3I8c3RyaW5nPiBwb3N0OworICBzdHJpbmcgc2lnbmF0dXJlID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiOworCisgIGlmICghKGdlbl96b3BlX2ludGVyZmFjZV8gJiYgaW50ZXJmYWNlKSkgeworICAgIHByZS5lbXBsYWNlX2JhY2soInNlbGYiKTsKKyAgfQorCisgIHNpZ25hdHVyZSArPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgJnByZSwgJnBvc3QpICsgIikiOworICByZXR1cm4gc2lnbmF0dXJlOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgdmVjdG9yPHN0cmluZz4qIHByZSwgdmVjdG9yPHN0cmluZz4qIHBvc3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGlmIChwcmUpIHsKKyAgICBmb3IgKHNfaXRlciA9IHByZS0+YmVnaW4oKTsgc19pdGVyICE9IHByZS0+ZW5kKCk7ICsrc19pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiLCAiOworICAgICAgfQorICAgICAgcmVzdWx0ICs9ICpzX2l0ZXI7CisgICAgfQorICB9CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAocG9zdCkgeworICAgIGZvciAoc19pdGVyID0gcG9zdC0+YmVnaW4oKTsgc19pdGVyICE9IHBvc3QtPmVuZCgpOyArK3NfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSAqc19pdGVyOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgcmV0dXJuIGdldF9yZWFsX3B5X21vZHVsZShwcm9ncmFtLCBnZW5fdHdpc3RlZF8sIHBhY2thZ2VfcHJlZml4XykgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICByZXR1cm4gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW0sIGdlbl90d2lzdGVkXywgcGFja2FnZV9wcmVmaXhfKSArICIudHR5cGVzLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQeXRob24gdHlvZQorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqIFNlZSB0aGUgY29tbWVudCBpbnNpZGUgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24gZm9yIHdoYXQgdGhpcyBpcy4gKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6dHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSkgeworICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICByZXR1cm4gICInQklOQVJZJyI7CisgIH0gZWxzZSBpZiAoZ2VuX3V0ZjhzdHJpbmdzXyAmJiB0dHlwZS0+aXNfYmFzZV90eXBlKCkKKyAgICAgICAgICAgICAmJiByZWludGVycHJldF9jYXN0PHRfYmFzZV90eXBlKj4odHR5cGUpLT5pc19zdHJpbmcoKSkgeworICAgIHJldHVybiAiJ1VURjgnIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAgIk5vbmUiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiWyIgKyB0eXBlX25hbWUodHR5cGUpICsgIiwgTm9uZV0iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIChpc19pbW11dGFibGUodHR5cGUpID8gIlRydWUiIDogIkZhbHNlIikgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgKGlzX2ltbXV0YWJsZSh0dHlwZSkgPyAiVHJ1ZSIgOiAiRmFsc2UiKSArICIpIjsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyAoaXNfaW1tdXRhYmxlKHR0eXBlKSA/ICJUcnVlIiA6ICJGYWxzZSIpICsgIikiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX3NwZWNfYXJnczogIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIHB5LAorICAgICJQeXRob24iLAorICAgICIgICAgem9wZS5pbnRlcmZhY2U6ICBHZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCB6b3BlLmludGVyZmFjZS5cbiIKKyAgICAiICAgIHR3aXN0ZWQ6ICAgICAgICAgR2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuXG4iCisgICAgIiAgICB0b3JuYWRvOiAgICAgICAgIEdlbmVyYXRlIGNvZGUgZm9yIHVzZSB3aXRoIFRvcm5hZG8uXG4iCisgICAgIiAgICBub191dGY4c3RyaW5nczogIERvIG5vdCBFbmNvZGUvZGVjb2RlIHN0cmluZ3MgdXNpbmcgdXRmOCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuIEJhc2ljYWxseSBubyBlZmZlY3QgZm9yIFB5dGhvbiAzLlxuIgorICAgICIgICAgY29kaW5nPUNPRElORzogICBBZGQgZmlsZSBlbmNvZGluZyBkZWNsYXJlIGluIGdlbmVyYXRlZCBmaWxlLlxuIgorICAgICIgICAgc2xvdHM6ICAgICAgICAgICBHZW5lcmF0ZSBjb2RlIHVzaW5nIHNsb3RzIGZvciBpbnN0YW5jZSBtZW1iZXJzLlxuIgorICAgICIgICAgZHluYW1pYzogICAgICAgICBHZW5lcmF0ZSBkeW5hbWljIGNvZGUsIGxlc3MgY29kZSBnZW5lcmF0ZWQgYnV0IHNsb3dlci5cbiIKKyAgICAiICAgIGR5bmJhc2U9Q0xTICAgICAgRGVyaXZlIGdlbmVyYXRlZCBjbGFzc2VzIGZyb20gY2xhc3MgQ0xTIGluc3RlYWQgb2YgVEJhc2UuXG4iCisgICAgIiAgICBkeW5mcm96ZW49Q0xTICAgIERlcml2ZSBnZW5lcmF0ZWQgaW1tdXRhYmxlIGNsYXNzZXMgZnJvbSBjbGFzcyBDTFMgaW5zdGVhZCBvZiBURnJvemVuQmFzZS5cbiIKKyAgICAiICAgIGR5bmV4Yz1DTFMgICAgICAgRGVyaXZlIGdlbmVyYXRlZCBleGNlcHRpb25zIGZyb20gQ0xTIGluc3RlYWQgb2YgVEV4Y2VwdGlvbkJhc2UuXG4iCisgICAgIiAgICBkeW5pbXBvcnQ9J2Zyb20gZm9vLmJhciBpbXBvcnQgQ0xTJ1xuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBZGQgYW4gaW1wb3J0IGxpbmUgdG8gZ2VuZXJhdGVkIGNvZGUgdG8gZmluZCB0aGUgZHluYmFzZSBjbGFzcy5cbiIKKyAgICAiICAgIHBhY2thZ2VfcHJlZml4PSd0b3AucGFja2FnZS4nXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2UgcHJlZml4IGZvciBnZW5lcmF0ZWQgZmlsZXMuXG4iCisgICAgIiAgICBvbGRfc3R5bGU6ICAgICAgIERlcHJlY2F0ZWQuIEdlbmVyYXRlIG9sZC1zdHlsZSBjbGFzc2VzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFjMzQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTI4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogQSBzdWJjbGFzcyBvZiBzdGQ6Om9mc3RyZWFtIHRoYXQgaW5jbHVkZXMgaW5kZW50aW5nIGZ1bmN0aW9uYWxpdHkuCisgKi8KK2NsYXNzIHRfcmJfb2ZzdHJlYW0gOiBwdWJsaWMgc3RkOjpvZnN0cmVhbSB7Citwcml2YXRlOgorICBpbnQgaW5kZW50XzsKKworcHVibGljOgorICB0X3JiX29mc3RyZWFtKCkgOiBzdGQ6Om9mc3RyZWFtKCksIGluZGVudF8oMCkge30KKyAgZXhwbGljaXQgdF9yYl9vZnN0cmVhbShjb25zdCBjaGFyKiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IGlvc19iYXNlOjpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGVudCA9IDApCisgICAgOiBzdGQ6Om9mc3RyZWFtKGZpbGVuYW1lLCBtb2RlKSwgaW5kZW50XyhpbmRlbnQpIHt9CisKKyAgdF9yYl9vZnN0cmVhbSYgaW5kZW50KCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50XzsgKytpKSB7CisgICAgICAqdGhpcyA8PCAiICAiOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIGluZGVudF91cCgpIHsgaW5kZW50XysrOyB9CisgIHZvaWQgaW5kZW50X2Rvd24oKSB7IGluZGVudF8tLTsgfQorfTsKKworLyoqCisgKiBSdWJ5IGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9yYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9yYl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIHJlcXVpcmVfcnVieWdlbXNfID0gZmFsc2U7CisgICAgbmFtZXNwYWNlZF8gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJydWJ5Z2VtcyIpID09IDApIHsKKyAgICAgICAgcmVxdWlyZV9ydWJ5Z2Vtc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJuYW1lc3BhY2VkIikgPT0gMCkgeworICAgICAgICBuYW1lc3BhY2VkXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gcnVieToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcmIiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpIG92ZXJyaWRlOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIG92ZXJyaWRlOworCisgIHRfcmJfb2ZzdHJlYW0mIHJlbmRlcl9jb25zdF92YWx1ZSh0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfcmJfc3RydWN0X2RlY2xhcmF0aW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcmJfdW5pb24odF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcmJfc2ltcGxlX2NvbnN0cnVjdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZWZucyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kYXRhKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogZmllbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9yZG9jKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyByYl9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZnVsbF90eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcmJfbmFtZXNwYWNlX3RvX3BhdGhfcHJlZml4KHN0ZDo6c3RyaW5nIHJiX25hbWVzcGFjZSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJ1YnlfbW9kdWxlcyhjb25zdCB0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInJiIik7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXM7CisgICAgaWYgKG5zLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBtb2R1bGVzOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nOjppdGVyYXRvciBwb3MgPSBucy5iZWdpbigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzdGQ6OnN0cmluZzo6aXRlcmF0b3IgZGVsaW0gPSBzdGQ6OmZpbmQocG9zLCBucy5lbmQoKSwgJy4nKTsKKyAgICAgIG1vZHVsZXMucHVzaF9iYWNrKGNhcGl0YWxpemUoc3RkOjpzdHJpbmcocG9zLCBkZWxpbSkpKTsKKyAgICAgIHBvcyA9IGRlbGltOworICAgICAgaWYgKHBvcyA9PSBucy5lbmQoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsrcG9zOworICAgIH0KKworICAgIHJldHVybiBtb2R1bGVzOworICB9CisKKyAgdm9pZCBiZWdpbl9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPik7CisgIHZvaWQgZW5kX25hbWVzcGFjZSh0X3JiX29mc3RyZWFtJiwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICB0X3JiX29mc3RyZWFtIGZfdHlwZXNfOworICB0X3JiX29mc3RyZWFtIGZfY29uc3RzXzsKKyAgdF9yYl9vZnN0cmVhbSBmX3NlcnZpY2VfOworCisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9kaXJfOworICBzdGQ6OnN0cmluZyByZXF1aXJlX3ByZWZpeF87CisKKyAgLyoqIElmIHRydWUsIGFkZCBhICJyZXF1aXJlICdydWJ5Z2VtcyciIGxpbmUgdG8gdGhlIHRvcCBvZiBlYWNoIGdlbi1yYiBmaWxlLiAqLworICBib29sIHJlcXVpcmVfcnVieWdlbXNfOworCisgIC8qKiBJZiB0cnVlLCBnZW5lcmF0ZSBmaWxlcyBpbiBpZGlvbWF0aWMgbmFtZXNwYWNlZCBkaXJlY3Rvcmllcy4gKi8KKyAgYm9vbCBuYW1lc3BhY2VkXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworCisgIGlmIChuYW1lc3BhY2VkXykgeworICAgIHJlcXVpcmVfcHJlZml4XyA9IHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgicmIiKSk7CisKKyAgICBzdHJpbmcgZGlyID0gcmVxdWlyZV9wcmVmaXhfOworICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICAgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi8iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBzdWJkaXIgPSBzdWJkaXIgKyBkaXIuc3Vic3RyKDAsIGxvYykgKyAiLyI7CisgICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICAgIH0KKyAgfQorCisgIG5hbWVzcGFjZV9kaXJfID0gc3ViZGlyOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSArICJfdHlwZXMucmIiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSArICJfY29uc3RhbnRzLnJiIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKSA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOworICBiZWdpbl9uYW1lc3BhY2UoZl90eXBlc18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOworCisgIGZfY29uc3RzXyA8PCByYl9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpIDw8ICJyZXF1aXJlICciCisgICAgICAgICAgICA8PCByZXF1aXJlX3ByZWZpeF8gPDwgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzJyIgPDwgZW5kbCA8PCBlbmRsOworICBiZWdpbl9uYW1lc3BhY2UoZl9jb25zdHNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKK30KKworLyoqCisgKiBSZW5kZXJzIHRoZSByZXF1aXJlIG9mIHRocmlmdCBpdHNlbGYsIGFuZCBwb3NzaWJseSBvZiB0aGUgcnVieWdlbXMgZGVwZW5kZW5jeS4KKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyZW5kZXJfcmVxdWlyZV90aHJpZnQoKSB7CisgIGlmIChyZXF1aXJlX3J1YnlnZW1zXykgeworICAgIHJldHVybiAicmVxdWlyZSAncnVieWdlbXMnXG5yZXF1aXJlICd0aHJpZnQnXG4iOworICB9IGVsc2UgeworICAgIHJldHVybiAicmVxdWlyZSAndGhyaWZ0J1xuIjsKKyAgfQorfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgZm9yIChhdXRvIGluY2x1ZGUgOiBpbmNsdWRlcykgeworICAgIGlmIChuYW1lc3BhY2VkXykgeworICAgICAgdF9wcm9ncmFtKiBpbmNsdWRlZCA9IGluY2x1ZGU7CisgICAgICBzdGQ6OnN0cmluZyBpbmNsdWRlZF9yZXF1aXJlX3ByZWZpeAorICAgICAgICAgID0gcmJfbmFtZXNwYWNlX3RvX3BhdGhfcHJlZml4KGluY2x1ZGVkLT5nZXRfbmFtZXNwYWNlKCJyYiIpKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVkX25hbWUgPSBpbmNsdWRlZC0+Z2V0X25hbWUoKTsKKyAgICAgIHJlc3VsdCArPSAicmVxdWlyZSAnIiArIGluY2x1ZGVkX3JlcXVpcmVfcHJlZml4ICsgdW5kZXJzY29yZShpbmNsdWRlZF9uYW1lKSArICJfdHlwZXMnXG4iOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gInJlcXVpcmUgJyIgKyB1bmRlcnNjb3JlKGluY2x1ZGUtPmdldF9uYW1lKCkpICsgIl90eXBlcydcbiI7CisgICAgfQorICB9CisgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0ICs9ICJcbiI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJiX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIjXG4iKSArICIjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgKyAiI1xuIiArICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiI1xuIjsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgIGVuZF9uYW1lc3BhY2UoZl90eXBlc18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOworICBlbmRfbmFtZXNwYWNlKGZfY29uc3RzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7CisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUnVieSwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfdHlwZXNfLmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICBmX3R5cGVzXy5pbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+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+IG1vZHVsZXMpIHsKKyAgZm9yIChhdXRvICYgbW9kdWxlIDogbW9kdWxlcykgeworICAgIG91dC5pbmRlbnQoKSA8PCAibW9kdWxlICIgPDwgbW9kdWxlIDw8IGVuZGw7CisgICAgb3V0LmluZGVudF91cCgpOworICB9Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmVuZF9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKKyAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjpyZXZlcnNlX2l0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMucmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLnJlbmQoKTsKKyAgICAgICArK21faXRlcikgeworICAgIG91dC5pbmRlbnRfZG93bigpOworICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICIucmIiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCByYl9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgaWYgKG5hbWVzcGFjZWRfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXF1aXJlICciIDw8IHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJyYiIpKQorICAgICAgICAgICAgICAgICA8PCB1bmRlcnNjb3JlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCAiJyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCByZXF1aXJlX3ByZWZpeF8KKyAgICAgICAgICAgICAgICAgPDwgdW5kZXJzY29yZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgIiciIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCByZXF1aXJlX3ByZWZpeF8gPDwgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzJyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgYmVnaW5fbmFtZXNwYWNlKGZfc2VydmljZV8sIHJ1YnlfbW9kdWxlcyh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpOworCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKworICBlbmRfbmFtZXNwYWNlKGZfc2VydmljZV8sIHJ1YnlfbW9kdWxlcyh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfc2VydmljZV8sIHRzKTsKKyAgICBnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl9zZXJ2aWNlXywgJnJlc3VsdCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBmdWxsX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIDwgIiArIGV4dGVuZHMgKyAiOjpDbGllbnQgIjsKKyAgfQorCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpDbGllbnQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZGVmIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOworICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VTZW5kUHJvYyA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAic2VuZF9vbmV3YXlfbWVzc2FnZSIgOiAic2VuZF9tZXNzYWdlIjsKKworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgbWVzc2FnZVNlbmRQcm9jIDw8ICIoJyIgPDwgZnVubmFtZSA8PCAiJywgIiA8PCBhcmdzbmFtZTsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsIDoiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKworICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgorCisgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXN1bHQgPSByZWNlaXZlX21lc3NhZ2UoIiA8PCByZXN1bHRuYW1lIDw8ICIpIiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdC5zdWNjZXNzIHVubGVzcyByZXN1bHQuc3VjY2Vzcy5uaWw/IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyYWlzZSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiB1bmxlc3MgcmVzdWx0LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIi5uaWw/IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyYWlzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjo6VGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1JU1NJTkdfUkVTVUxULCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnKSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBmdWxsX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIDwgIiArIGV4dGVuZHMgKyAiOjpQcm9jZXNzb3IgIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6UHJvY2Vzc29yIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoc2VxaWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiYXJncyA9IHJlYWRfYXJncyhpcHJvdCwgIiA8PCBhcmdzbmFtZSA8PCAiKSIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiLm5ldygpIiA8PCBlbmRsOworICB9CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8uaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiQGhhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzY3VlICIgPDwgZnVsbF90eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiID0+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIndyaXRlX3Jlc3VsdChyZXN1bHQsIG9wcm90LCAnIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIHNlcWlkKSIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKKyAgcmV0dXJuIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnR5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0KKworICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpmdWxsX3R5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiOjoiOworICB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMgPSBydWJ5X21vZHVsZXModHR5cGUtPmdldF9wcm9ncmFtKCkpOworICBmb3IgKGF1dG8gJiBtb2R1bGUgOiBtb2R1bGVzKSB7CisgICAgcHJlZml4ICs9IG1vZHVsZSArICI6OiI7CisgIH0KKyAgcmV0dXJuIHByZWZpeCArIHR5cGVfbmFtZSh0dHlwZSk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBSdWJ5IHR5b2UKKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6QllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6Okk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6RE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6Ok1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6TElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmJfbmFtZXNwYWNlX3RvX3BhdGhfcHJlZml4KHN0cmluZyByYl9uYW1lc3BhY2UpIHsKKyAgc3RyaW5nIG5hbWVzcGFjZXNfbGVmdCA9IHJiX25hbWVzcGFjZTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgIHN0cmluZyBwYXRoX3ByZWZpeCA9ICIiOworCisgIHdoaWxlICgobG9jID0gbmFtZXNwYWNlc19sZWZ0LmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcGF0aF9wcmVmaXggPSBwYXRoX3ByZWZpeCArIHVuZGVyc2NvcmUobmFtZXNwYWNlc19sZWZ0LnN1YnN0cigwLCBsb2MpKSArICIvIjsKKyAgICBuYW1lc3BhY2VzX2xlZnQgPSBuYW1lc3BhY2VzX2xlZnQuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChuYW1lc3BhY2VzX2xlZnQuc2l6ZSgpID4gMCkgeworICAgIHBhdGhfcHJlZml4ID0gcGF0aF9wcmVmaXggKyB1bmRlcnNjb3JlKG5hbWVzcGFjZXNfbGVmdCkgKyAiLyI7CisgIH0KKyAgcmV0dXJuIHBhdGhfcHJlZml4OworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZG9jKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIG91dC5pbmRlbnQoKTsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIiLCAiIyAiLCB0ZG9jLT5nZXRfZG9jKCksICIiKTsKKyAgfQorfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0LmluZGVudCgpIDw8ICJkZWYgdmFsaWRhdGUiIDw8IGVuZGw7CisgIG91dC5pbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvdXQuaW5kZW50KCkgPDwgInJhaXNlIDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpVTktOT1dOLCAiCisgICAgICAgICAgICAgICAgICAgICAgIidSZXF1aXJlZCBmaWVsZCAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJykiOworICAgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19ib29sKCkpIHsKKyAgICAgICAgb3V0IDw8ICIgaWYgQCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIi5uaWw/IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiIHVubGVzcyBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgICAgb3V0LmluZGVudCgpIDw8ICJ1bmxlc3MgQCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIi5uaWw/IHx8ICIKKyAgICAgICAgICAgICAgICAgICA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjo6VkFMSURfVkFMVUVTLmluY2x1ZGU/KEAiCisgICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50X3VwKCk7CisgICAgICBvdXQuaW5kZW50KCkgPDwgInJhaXNlIDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpVTktOT1dOLCAiCisgICAgICAgICAgICAgICAgICAgICAgIidJbnZhbGlkIHZhbHVlIG9mIGZpZWxkICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiEnKSIgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnRfZG93bigpOworICAgICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0LmluZGVudF9kb3duKCk7CisgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dC5pbmRlbnQoKSA8PCAiZGVmIHZhbGlkYXRlIiA8PCBlbmRsOworICBvdXQuaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dC5pbmRlbnQoKQorICAgICAgPDwgInJhaXNlKFN0YW5kYXJkRXJyb3IsICdVbmlvbiBmaWVsZHMgYXJlIG5vdCBzZXQuJykgaWYgZ2V0X3NldF9maWVsZC5uaWw/IHx8IGdldF92YWx1ZS5uaWw/IgorICAgICAgPDwgZW5kbDsKKworICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGNvbnN0IHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworCisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiaWYgZ2V0X3NldF9maWVsZCA9PSA6IiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgb3V0LmluZGVudCgpIDw8ICIgIHJhaXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAiOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICIKKyAgICAgICAgICAgICAgICAgICAgICAiJ0ludmFsaWQgdmFsdWUgb2YgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIScpIHVubGVzcyAiCisgICAgICAgICAgICAgICAgICAgPDwgZnVsbF90eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICI6OlZBTElEX1ZBTFVFUy5pbmNsdWRlPyhnZXRfdmFsdWUpIgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICByYiwKKyAgICAiUnVieSIsCisgICAgIiAgICBydWJ5Z2VtczogICAgICAgIEFkZCBhIFwicmVxdWlyZSAncnVieWdlbXMnXCIgbGluZSB0byB0aGUgdG9wIG9mIGVhY2ggZ2VuZXJhdGVkIGZpbGUuXG4iCisgICAgIiAgICBuYW1lc3BhY2VkOiAgICAgIEdlbmVyYXRlIGZpbGVzIGluIGlkaW9tYXRpYyBuYW1lc3BhY2VkIGRpcmVjdG9yaWVzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcnNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yc19nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmNjg2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcnNfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzMzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKK3VzaW5nIHN0ZDo6c2V0OworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwoIlxuIik7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKK3N0YXRpYyBjb25zdCBzdHJpbmcgU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUoInJlc3VsdF92YWx1ZSIpOworc3RhdGljIGNvbnN0IHN0cmluZyBSRVNVTFRfU1RSVUNUX1NVRkZJWCgiUmVzdWx0Iik7CitzdGF0aWMgY29uc3Qgc3RyaW5nIFJVU1RfUkVTRVJWRURfV09SRFNbXSA9IHsKKyAgImFic3RyYWN0IiwgImFsaWdub2YiLCAiYXMiLCAiYmVjb21lIiwKKyAgImJveCIsICJicmVhayIsICJjb25zdCIsICJjb250aW51ZSIsCisgICJjcmF0ZSIsICJkbyIsICJlbHNlIiwgImVudW0iLAorICAiZXh0ZXJuIiwgImZhbHNlIiwgImZpbmFsIiwgImZuIiwKKyAgImZvciIsICJpZiIsICJpbXBsIiwgImluIiwKKyAgImxldCIsICJsb29wIiwgIm1hY3JvIiwgIm1hdGNoIiwKKyAgIm1vZCIsICJtb3ZlIiwgIm11dCIsICJvZmZzZXRvZiIsCisgICJvdmVycmlkZSIsICJwcml2IiwgInByb2MiLCAicHViIiwKKyAgInB1cmUiLCAicmVmIiwgInJldHVybiIsICJTZWxmIiwKKyAgInNlbGYiLCAic2l6ZW9mIiwgInN0YXRpYyIsICJzdHJ1Y3QiLAorICAic3VwZXIiLCAidHJhaXQiLCAidHJ1ZSIsICJ0eXBlIiwKKyAgInR5cGVvZiIsICJ1bnNhZmUiLCAidW5zaXplZCIsICJ1c2UiLAorICAidmlydHVhbCIsICJ3aGVyZSIsICJ3aGlsZSIsICJ5aWVsZCIKK307Citjb25zdCBzZXQ8c3RyaW5nPiBSVVNUX1JFU0VSVkVEX1dPUkRTX1NFVCgKKyAgUlVTVF9SRVNFUlZFRF9XT1JEUywKKyAgUlVTVF9SRVNFUlZFRF9XT1JEUyArIHNpemVvZihSVVNUX1JFU0VSVkVEX1dPUkRTKS9zaXplb2YoUlVTVF9SRVNFUlZFRF9XT1JEU1swXSkKKyk7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTKCI8SVAsIE9QPiIpOworc3RhdGljIGNvbnN0IHN0cmluZyBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EUygid2hlcmUgSVA6IFRJbnB1dFByb3RvY29sLCBPUDogVE91dHB1dFByb3RvY29sIik7CisKKy8vIEZJWE1FOiBleHRyYWN0IGNvbW1vbiBUTWVzc2FnZUlkZW50aWZpZXIgZnVuY3Rpb24KKy8vIEZJWE1FOiBoYXZlIHRvX3J1c3RfdHlwZSBkZWFsIHdpdGggT3B0aW9uCisKK2NsYXNzIHRfcnNfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9yc19nZW5lcmF0b3IoCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAorICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJgorICApIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgIGdlbl9kaXJfID0gZ2V0X291dF9kaXIoKTsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgLy8gc3RydWN0IHR5cGUKKyAgLy8gVF9SRUdVTEFSOiB1c2VyLWRlZmluZWQgc3RydWN0IGluIHRoZSBJREwKKyAgLy8gVF9BUkdTOiBzdHJ1Y3QgdXNlZCB0byBob2xkIGFsbCBzZXJ2aWNlLWNhbGwgcGFyYW1ldGVycworICAvLyBUX1JFU1VMVDogc3RydWN0IHVzZWQgdG8gaG9sZCBhbGwgc2VydmljZS1jYWxsIHJldHVybnMgYW5kIGV4Y2VwdGlvbnMKKyAgLy8gVF9FWENFUFRJT046IHVzZXItZGVmaW5lZCBleGNlcHRpb24gaW4gdGhlIElETAorICBlbnVtIGVfc3RydWN0X3R5cGUgeyBUX1JFR1VMQVIsIFRfQVJHUywgVF9SRVNVTFQsIFRfRVhDRVBUSU9OIH07CisKKyAgLy8gRGlyZWN0b3J5IHRvIHdoaWNoIGdlbmVyYXRlZCBjb2RlIGlzIHdyaXR0ZW4uCisgIHN0cmluZyBnZW5fZGlyXzsKKworICAvLyBGaWxlIHRvIHdoaWNoIGdlbmVyYXRlZCBjb2RlIGlzIHdyaXR0ZW4uCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9nZW5fOworCisgIC8vIFdyaXRlIHRoZSBjb21tb24gY29tcGlsZXIgYXR0cmlidXRlcyBhbmQgbW9kdWxlIGluY2x1ZGVzIHRvIHRoZSB0b3Agb2YgdGhlIGF1dG8tZ2VuZXJhdGVkIGZpbGUuCisgIHZvaWQgcmVuZGVyX2F0dHJpYnV0ZXNfYW5kX2luY2x1ZGVzKCk7CisKKyAgLy8gQ3JlYXRlIHRoZSBjbG9zdXJlIG9mIFJ1c3QgbW9kdWxlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc2VydmljZS4KKyAgdm9pZCBjb21wdXRlX3NlcnZpY2VfcmVmZXJlbmNlZF9tb2R1bGVzKHRfc2VydmljZSAqdHNlcnZpY2UsIHNldDxzdHJpbmc+ICZyZWZlcmVuY2VkX21vZHVsZXMpOworCisgIC8vIFdyaXRlIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGFuIGVudW0uCisgIHZvaWQgcmVuZGVyX2VudW1fZGVmaW5pdGlvbih0X2VudW0qIHRlbnVtLCBjb25zdCBzdHJpbmcmIGVudW1fbmFtZSk7CisKKyAgLy8gV3JpdGUgdGhlIGltcGwgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhaXRzIG5lY2Vzc2FyeSB0byBjb252ZXJ0IGFuIGVudW0gdG8vZnJvbSBhbiBpMzIuCisgIHZvaWQgcmVuZGVyX2VudW1fY29udmVyc2lvbih0X2VudW0qIHRlbnVtLCBjb25zdCBzdHJpbmcmIGVudW1fbmFtZSk7CisKKyAgLy8gV3JpdGUgdGhlIGltcGwgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGFuIGVudW0uIFRoaXMgaW5jbHVkZXMgbWV0aG9kcworICAvLyB0byB3cml0ZSB0aGUgZW51bSB0byBhIHByb3RvY29sLCByZWFkIGl0IGZyb20gYSBwcm90b2NvbCwgZXRjLgorICB2b2lkIHJlbmRlcl9lbnVtX2ltcGwoY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpOworCisgIC8vIFdyaXRlIGEgc2ltcGxlIHJ1c3QgY29uc3QgdmFsdWUgKGllLiBgcHViIGNvbnN0IEZPTzogZm9vLi4uYCkuCisgIHZvaWQgcmVuZGVyX2NvbnN0X3ZhbHVlKGNvbnN0IHN0cmluZyYgbmFtZSwgdF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSBhIGNvbnN0YW50IGxpc3QsIHNldCwgbWFwIG9yIHN0cnVjdC4gVGhlc2UgY29uc3RhbnRzIHJlcXVpcmUgYWxsb2NhdGlvbiBhbmQgY2Fubm90IGJlIGRlZmluZWQKKyAgLy8gdXNpbmcgYSAncHViIGNvbnN0Jy4gQXMgYSByZXN1bHQsIEkgY3JlYXRlIGEgaG9sZGVyIHN0cnVjdCB3aXRoIGEgc2luZ2xlIGBjb25zdF92YWx1ZWAgbWV0aG9kIHRoYXQKKyAgLy8gcmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgaW5zdGFuY2UuCisgIHZvaWQgcmVuZGVyX2NvbnN0X3ZhbHVlX2hvbGRlcihjb25zdCBzdHJpbmcmIG5hbWUsIHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgdGhlIGFjdHVhbCBjb25zdCB2YWx1ZSAtIHRoZSByaWdodCBzaWRlIG9mIGEgY29uc3QgZGVmaW5pdGlvbi4KKyAgdm9pZCByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlLCBib29sIGlzX293bmVkID0gdHJ1ZSk7CisKKyAgLy8gV3JpdGUgYSBjb25zdCBzdHJ1Y3QgKHJldHVybmVkIGZyb20gYGNvbnN0X3ZhbHVlYCBtZXRob2QpLgorICB2b2lkIHJlbmRlcl9jb25zdF9zdHJ1Y3QodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSBhIGNvbnN0IGxpc3QgKHJldHVybmVkIGZyb20gYGNvbnN0X3ZhbHVlYCBtZXRob2QpLgorICB2b2lkIHJlbmRlcl9jb25zdF9saXN0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgYSBjb25zdCBzZXQgKHJldHVybmVkIGZyb20gYGNvbnN0X3ZhbHVlYCBtZXRob2QpLgorICB2b2lkIHJlbmRlcl9jb25zdF9zZXQodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSBhIGNvbnN0IG1hcCAocmV0dXJuZWQgZnJvbSBgY29uc3RfdmFsdWVgIG1ldGhvZCkuCisgIHZvaWQgcmVuZGVyX2NvbnN0X21hcCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIHRoZSBjb2RlIHRvIGluc2VydCBjb25zdGFudCB2YWx1ZXMgaW50byBhIHJ1c3QgdmVjIG9yIHNldC4gVGhlCisgIC8vIGBpbnNlcnRfZnVuY3Rpb25gIGlzIHRoZSBydXN0IGZ1bmN0aW9uIHRoYXQgd2UnbGwgdXNlIHRvIGluc2VydCB0aGUgZWxlbWVudHMuCisgIHZvaWQgcmVuZGVyX2NvbnRhaW5lcl9jb25zdF92YWx1ZSgKKyAgICBjb25zdCBzdHJpbmcmIGluc2VydF9mdW5jdGlvbiwKKyAgICB0X3R5cGUqIHR0eXBlLAorICAgIHRfY29uc3RfdmFsdWUqIHR2YWx1ZQorICApOworCisgIC8vIFdyaXRlIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgdGhyaWZ0IHN0cnVjdCB0byB0aGUgZ2VuZXJhdGVkIGZpbGUuIFNldCBgc3RydWN0X3R5cGVgIHRvIGBUX0FSR1NgCisgIC8vIGlmIHJlbmRlcmluZyB0aGUgc3RydWN0IHVzZWQgdG8gcGFjayBhcmd1bWVudHMgZm9yIGEgc2VydmljZSBjYWxsLiBXaGVuIGBzdHJ1Y3RfdHlwZWAgaXMgYFRfQVJHU2AgdGhlCisgIC8vIHN0cnVjdCBhbmQgaXRzIG1lbWJlcnMgaGF2ZSBtb2R1bGUgdmlzaWJpbGl0eSwgYW5kIGFsbCBmaWVsZHMgYXJlIHJlcXVpcmVkLiBXaGVuIGBzdHJ1Y3RfdHlwZWAgaXMKKyAgLy8gYW55dGhpbmcgZWxzZSB0aGUgc3RydWN0IGFuZCBpdHMgbWVtYmVycyBoYXZlIHB1YmxpYyB2aXNpYmlsaXR5IGFuZCBmaWVsZHMgaGF2ZSB0aGUgdmlzaWJpbGl0eSBzZXQKKyAgLy8gaW4gdGhlaXIgZGVmaW5pdGlvbi4KKyAgdm9pZCByZW5kZXJfc3RydWN0KGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsIHRfc3RydWN0KiB0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gV3JpdGUgdGhlIGNvbW1lbnQgYmxvY2sgcHJlY2VkaW5nIGEgdHlwZSBkZWZpbml0aW9uIChhbmQgaW1wbGVtZW50YXRpb24pLgorICB2b2lkIHJlbmRlcl90eXBlX2NvbW1lbnQoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSk7CisKKyAgLy8gV3JpdGUgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJpZnQgc3RydWN0LiBTdXBwb3J0cyBhcmd1bWVudCBzdHJ1Y3RzLCByZXN1bHQgc3RydWN0cywKKyAgLy8gdXNlci1kZWZpbmVkIHN0cnVjdHMgYW5kIGV4Y2VwdGlvbiBzdHJ1Y3RzLiBUaGUgZXhhY3Qgc3RydWN0IHR5cGUgdG8gYmUgZ2VuZXJhdGVkIGlzIGNvbnRyb2xsZWQKKyAgLy8gYnkgdGhlIGBzdHJ1Y3RfdHlwZWAgcGFyYW1ldGVyLCB3aGljaCAoYW1vbmcgb3RoZXIgdGhpbmdzKSBtb2RpZmllcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUKKyAgLy8gd3JpdHRlbiBzdHJ1Y3QgYW5kIG1lbWJlcnMsIGNvbnRyb2xzIHdoaWNoIHRyYWl0IGltcGxlbWVudGF0aW9ucyBhcmUgZ2VuZXJhdGVkLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3RfZGVmaW5pdGlvbigKKyAgICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCisgICk7CisKKyAgLy8gV3JpdGVzIHRoZSBpbXBsIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIHN0cnVjdC4gQXQgbWluaW11bSB0aGlzCisgIC8vIGNvbnRhaW5zIHRoZSBtZXRob2RzIHRvIHJlYWQgZnJvbSBhIHByb3RvY29sIGFuZCB3cml0ZSB0byBhIHByb3RvY29sLiBBZGRpdGlvbmFsIG1ldGhvZHMgbWF5CisgIC8vIGJlIGdlbmVyYXRlZCBkZXBlbmRpbmcgb24gYHN0cnVjdF90eXBlYC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X2ltcGwoCisgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorICApOworCisgIC8vIEdlbmVyYXRlIGEgYGZuIG5ldyguLi4pYCBmb3IgYSBzdHJ1Y3Qgd2l0aCBuYW1lIGBzdHJ1Y3RfbmFtZWAgYW5kIHR5cGUgYHRfc3RydWN0YC4gVGhlIGF1dG8tZ2VuZXJhdGVkCisgIC8vIGNvZGUgbWF5IGluY2x1ZGUgZ2VuZXJpYyB0eXBlIHBhcmFtZXRlcnMgdG8gbWFrZSB0aGUgY29uc3RydWN0b3IgbW9yZSBlcmdvbm9taWMuIGBzdHJ1Y3RfdHlwZWAgY29udHJvbHMKKyAgLy8gdGhlIHZpc2liaWxpdHkgb2YgdGhlIGdlbmVyYXRlZCBjb25zdHJ1Y3Rvci4KKyAgdm9pZCByZW5kZXJfc3RydWN0X2NvbnN0cnVjdG9yKAorICAgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKyAgKTsKKworICAvLyBXcml0ZSB0aGUgYG9rX29yYCBtZXRob2QgYWRkZWQgdG8gYWxsIFRocmlmdCBzZXJ2aWNlIGNhbGwgcmVzdWx0IHN0cnVjdHMuIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kCisgIC8vIHRvIGNvbnZlcnQgYSBzdHJ1Y3QgaW50byBhIGBSZXN1bHRgIGFuZCB1c2UgaXQgaW4gYSBgdHJ5IWAgb3IgY29tYmluYXRvciBjaGFpbi4KKyAgdm9pZCByZW5kZXJfcmVzdWx0X3N0cnVjdF90b19yZXN1bHRfbWV0aG9kKHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgYEVycm9yYCBhbmQgYERlYnVnYCB0cmFpdHMuIFRoZXNlIHRyYWl0cyBhcmUgbmVjZXNzYXJ5IGZvciBhCisgIC8vIHVzZXItZGVmaW5lZCBleGNlcHRpb24gdG8gYmUgcHJvcGVybHkgaGFuZGxlZCBhcyBSdXN0IGVycm9ycy4KKyAgdm9pZCByZW5kZXJfZXhjZXB0aW9uX3N0cnVjdF9lcnJvcl90cmFpdF9pbXBscyhjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGBEZWZhdWx0YC4gVGhpcyB0cmFpdCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgb25seSB0aGUgZmllbGRzIHlvdSB3YW50CisgIC8vIGFuZCB1c2UgYC4uRGVmYXVsdDo6ZGVmYXVsdCgpYCB0byBmaWxsIGluIHRoZSByZXN0LgorICB2b2lkIHJlbmRlcl9zdHJ1Y3RfZGVmYXVsdF90cmFpdF9pbXBsKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgZnVuY3Rpb24gdGhhdCBzZXJpYWxpemVzIGEgc3RydWN0IHRvIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uLiBJZiBgc3RydWN0X3R5cGVgIGlzIGBUX0FSR1NgCisgIC8vIHRoZW4gYWxsIGZpZWxkcyBhcmUgY29uc2lkZXJlZCAicmVxdWlyZWQiLCBpZiBub3QsIHRoZSBkZWZhdWx0IG9wdGlvbmFsaXR5IGlzIHVzZWQuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9zeW5jX3dyaXRlKHRfc3RydWN0ICp0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9uIHRoYXQgc2VyaWFsaXplcyBhIHNpbmdsZSBzdHJ1Y3QgZmllbGQgdG8gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uIFVucGFja3MgdGhlCisgIC8vIHZhcmlhYmxlIChzaW5jZSBpdCBtYXkgYmUgb3B0aW9uYWwpIGFuZCBzZXJpYWxpemVzIGFjY29yZGluZyB0byB0aGUgb3B0aW9uYWxpdHkgcnVsZXMgcmVxdWlyZWQgYnkgYHJlcWAuCisgIC8vIFZhcmlhYmxlcyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgaW4KKyAgLy8gY29udGV4dHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzICphbHJlYWR5KiBhIHJlZmVyZW5jZSB5b3UgY2FuIHNldCBgZmllbGRfdmFyX2lzX3JlZmAgdG8gYHRydWVgIHRvIGF2b2lkCisgIC8vIGdlbmVyYXRpbmcgYW4gZXh0cmEsIHVubmVjZXNzYXJ5IGAmYCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGhhdmUgdG8gYXV0b21hdGljYWxseSBkZXJlZmVyZW5jZS4KKyAgdm9pZCByZW5kZXJfc3RydWN0X2ZpZWxkX3N5bmNfd3JpdGUoCisgICAgY29uc3Qgc3RyaW5nICZmaWVsZF92YXIsCisgICAgYm9vbCBmaWVsZF92YXJfaXNfcmVmLAorICAgIHRfZmllbGQgKnRmaWVsZCwKKyAgICB0X2ZpZWxkOjplX3JlcSByZXEpOworCisgIC8vIFdyaXRlIHRoZSBydXN0IGZ1bmN0aW9uIHRoYXQgc2VyaWFsaXplcyBhIHNpbmdsZSB0eXBlIChpLmUuIGEgaTMyIGV0Yy4pIHRvIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uLgorICAvLyBWYXJpYWJsZXMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluCisgIC8vIGNvbnRleHRzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyAqYWxyZWFkeSogYSByZWZlcmVuY2UgeW91IGNhbiBzZXQgYHR5cGVfdmFyX2lzX3JlZmAgdG8gYHRydWVgIHRvIGF2b2lkCisgIC8vIGdlbmVyYXRpbmcgYW4gZXh0cmEsIHVubmVjZXNzYXJ5IGAmYCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGhhdmUgdG8gYXV0b21hdGljYWxseSBkZXJlZmVyZW5jZS4KKyAgdm9pZCByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmdHlwZV92YXIsIGJvb2wgdHlwZV92YXJfaXNfcmVmLCB0X3R5cGUgKnR0eXBlKTsKKworICAvLyBXcml0ZSBhIGxpc3QgdG8gdGhlIG91dHB1dCBwcm90b2NvbC4gYGxpc3RfdmFyaWFibGVgIGlzIHRoZSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBsaXN0CisgIC8vIHRoYXQgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuCisgIC8vIFZhcmlhYmxlcyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgaW4KKyAgLy8gY29udGV4dHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzICphbHJlYWR5KiBhIHJlZmVyZW5jZSB5b3UgY2FuIHNldCBgbGlzdF92YXJfaXNfcmVmYCB0byBgdHJ1ZWAgdG8gYXZvaWQKKyAgLy8gZ2VuZXJhdGluZyBhbiBleHRyYSwgdW5uZWNlc3NhcnkgYCZgIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0byBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlLgorICB2b2lkIHJlbmRlcl9saXN0X3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZsaXN0X3ZhciwgYm9vbCBsaXN0X3Zhcl9pc19yZWYsIHRfbGlzdCAqdGxpc3QpOworCisgIC8vIFdyaXRlIGEgc2V0IHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuIGBzZXRfdmFyaWFibGVgIGlzIHRoZSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBzZXQgdGhhdCB3aWxsCisgIC8vIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwcm90b2NvbC4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGBzZXRfdmFyX2lzX3JlZmAgdG8gYHRydWVgIHRvIGF2b2lkCisgIC8vIGdlbmVyYXRpbmcgYW4gZXh0cmEsIHVubmVjZXNzYXJ5IGAmYCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGhhdmUgdG8gYXV0b21hdGljYWxseSBkZXJlZmVyZW5jZS4KKyAgdm9pZCByZW5kZXJfc2V0X3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZzZXRfdmFyLCBib29sIHNldF92YXJfaXNfcmVmLCB0X3NldCAqdHNldCk7CisKKyAgLy8gV3JpdGUgYSBtYXAgdG8gdGhlIG91dHB1dCBwcm90b2NvbC4gYG1hcF92YXJpYWJsZWAgaXMgdGhlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIG1hcCB0aGF0IHdpbGwKKyAgLy8gYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHByb3RvY29sLgorICAvLyBWYXJpYWJsZXMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluCisgIC8vIGNvbnRleHRzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyAqYWxyZWFkeSogYSByZWZlcmVuY2UgeW91IGNhbiBzZXQgYG1hcF92YXJfaXNfcmVmYCB0byBgdHJ1ZWAgdG8gYXZvaWQKKyAgLy8gZ2VuZXJhdGluZyBhbiBleHRyYSwgdW5uZWNlc3NhcnkgYCZgIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0byBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlLgorICB2b2lkIHJlbmRlcl9tYXBfc3luY193cml0ZShjb25zdCBzdHJpbmcgJm1hcF92YXIsIGJvb2wgbWFwX3Zhcl9pc19yZWYsIHRfbWFwICp0c2V0KTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHdlIG5lZWQgdG8gZGVyZWZlcmVuY2UgdGhzIHR5cGUgd2hlbiB3cml0aW5nIGFuIGVsZW1lbnQgZnJvbSBhIGNvbnRhaW5lci4KKyAgLy8gSXRlcmF0aW9ucyBvbiBydXN0IGNvbnRhaW5lcnMgYXJlIHBlcmZvcm1lZCBhcyBmb2xsb3dzOiBgZm9yIHYgaW4gJnZhbHVlcyB7IC4uLiB9YAorICAvLyB3aGVyZSBgdmAgaGFzIHR5cGUgYCZSVVNUX1RZUEVgIEFsbCBkZWZpbmVkIGZ1bmN0aW9ucyB0YWtlIHByaW1pdGl2ZXMgYnkgdmFsdWUsIHNvLCBpZiB0aGUKKyAgLy8gcmVuZGVyZWQgY29kZSBpcyBjYWxsaW5nIHN1Y2ggYSBmdW5jdGlvbiBpdCBoYXMgdG8gZGVyZWZlcmVuY2UgYHZgLgorICBib29sIG5lZWRzX2RlcmVmX29uX2NvbnRhaW5lcl93cml0ZSh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gdGhlIHZhcmlhYmxlIChpbmNsdWRpbmcgYWxsIGRlcmVmZXJlbmNlcykgcmVxdWlyZWQgdG8gd3JpdGUgdmFsdWVzIGZyb20gYSBydXN0IGNvbnRhaW5lcgorICAvLyB0byB0aGUgb3V0cHV0IHByb3RvY29sLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdlcmUgaXRlcmF0aW5nIHRocm91Z2ggYSBjb250YWluZXIgYW5kIHVzaW5nIHRoZSB0ZW1wCisgIC8vIHZhcmlhYmxlIGB2YCB0byByZXByZXNlbnQgZWFjaCBlbGVtZW50LCB0aGVuIGB0dHlwZWAgaXMgdGhlIHR5cGUgc3RvcmVkIGluIHRoZSBjb250YWluZXIgYW5kCisgIC8vIGBiYXNlX3ZhcmAgaXMgInYiLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBhY3R1YWwgc3RyaW5nIHlvdSB3aWxsIGhhdmUgdG8gdXNlIHRvIHByb3Blcmx5IHJlZmVyZW5jZQorICAvLyB0aGUgdGVtcCB2YXJpYWJsZSBmb3Igd3JpdGluZyB0byB0aGUgb3V0cHV0IHByb3RvY29sLgorICBzdHJpbmcgc3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZSh0X3R5cGUqIHR0eXBlLCBjb25zdCBzdHJpbmcmIGJhc2VfdmFyKTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byByZWFkIGJ5dGVzIGZyb20gdGhlIHdpcmUgaW50byB0aGUgZ2l2ZW4gYHRfc3RydWN0YC4gYHN0cnVjdF9uYW1lYCBpcyB0aGUKKyAgLy8gYWN0dWFsIFJ1c3QgbmFtZSBvZiB0aGUgYHRfc3RydWN0YC4gSWYgYHN0cnVjdF90eXBlYCBpcyBgVF9BUkdTYCB0aGVuIGFsbCBzdHJ1Y3QgZmllbGRzIGFyZQorICAvLyBuZWNlc3NhcnkuIE90aGVyd2lzZSwgdGhlIGZpZWxkJ3MgZGVmYXVsdCBvcHRpb25hbGl0eSBpcyB1c2VkLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3Rfc3luY19yZWFkKGNvbnN0IHN0cmluZyAmc3RydWN0X25hbWUsIHRfc3RydWN0ICp0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gV3JpdGUgdGhlIHJ1c3QgZnVuY3Rpb24gdGhhdCBkZXNlcmlhbGl6ZXMgYSBzaW5nbGUgdHlwZSAoaS5lLiBpMzIgZXRjLikgZnJvbSBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4KKyAgLy8gU2V0IGBpc19ib3hlZGAgdG8gYHRydWVgIGlmIHRoZSByZXN1bHRpbmcgdmFsdWUgc2hvdWxkIGJlIHdyYXBwZWQgaW4gYSBgQm94OjpuZXcoLi4uKWAuCisgIHZvaWQgcmVuZGVyX3R5cGVfc3luY19yZWFkKGNvbnN0IHN0cmluZyAmdHlwZV92YXIsIHRfdHlwZSAqdHR5cGUsIGJvb2wgaXNfYm94ZWQgPSBmYWxzZSk7CisKKyAgLy8gUmVhZCB0aGUgd2lyZSByZXByZXNlbnRhdGlvbiBvZiBhIGxpc3QgYW5kIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgcnVzdCBpbXBsZW1lbnRhdGlvbi4KKyAgLy8gVGhlIGRlc2VyaWFsaXplZCBsaXN0IGlzIHN0b3JlZCBpbiBgbGlzdF92YXJpYWJsZWAuCisgIHZvaWQgcmVuZGVyX2xpc3Rfc3luY19yZWFkKHRfbGlzdCAqdGxpc3QsIGNvbnN0IHN0cmluZyAmbGlzdF92YXJpYWJsZSk7CisKKyAgLy8gUmVhZCB0aGUgd2lyZSByZXByZXNlbnRhdGlvbiBvZiBhIHNldCBhbmQgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyBydXN0IGltcGxlbWVudGF0aW9uLgorICAvLyBUaGUgZGVzZXJpYWxpemVkIHNldCBpcyBzdG9yZWQgaW4gYHNldF92YXJpYWJsZWAuCisgIHZvaWQgcmVuZGVyX3NldF9zeW5jX3JlYWQodF9zZXQgKnRzZXQsIGNvbnN0IHN0cmluZyAmc2V0X3ZhcmlhYmxlKTsKKworICAvLyBSZWFkIHRoZSB3aXJlIHJlcHJlc2VudGF0aW9uIG9mIGEgbWFwIGFuZCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIHJ1c3QgaW1wbGVtZW50YXRpb24uCisgIC8vIFRoZSBkZXNlcmlhbGl6ZWQgbWFwIGlzIHN0b3JlZCBpbiBgbWFwX3ZhcmlhYmxlYC4KKyAgdm9pZCByZW5kZXJfbWFwX3N5bmNfcmVhZCh0X21hcCAqdG1hcCwgY29uc3Qgc3RyaW5nICZtYXBfdmFyaWFibGUpOworCisgIC8vIFJldHVybiBhIHRlbXBvcmFyeSB2YXJpYWJsZSB1c2VkIHRvIHN0b3JlIHZhbHVlcyB3aGVuIGRlc2VyaWFsaXppbmcgbmVzdGVkIGNvbnRhaW5lcnMuCisgIHN0cmluZyBzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKHRfZmllbGQqIHRmaWVsZCk7CisKKyAgLy8gVG9wLWxldmVsIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIHZhcmlvdXMgcmVuZGVyIGZ1bmN0aW9ucyBuZWNlc3NhcnkgdG8gd3JpdGUgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24KKyAgLy8gb2YgYSB0aHJpZnQgdW5pb24gKGkuZS4gYW4gZW51bSkuCisgIHZvaWQgcmVuZGVyX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgZW51bSBjb3JyZXNwb25kaW5nIHRvIHRoZSBUaHJpZnQgdW5pb24uCisgIHZvaWQgcmVuZGVyX3VuaW9uX2RlZmluaXRpb24oY29uc3Qgc3RyaW5nJiB1bmlvbl9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGVudW0gaW1wbCAod2l0aCByZWFkL3dyaXRlIGZ1bmN0aW9ucykgZm9yIHRoZSBUaHJpZnQgdW5pb24uCisgIHZvaWQgcmVuZGVyX3VuaW9uX2ltcGwoY29uc3Qgc3RyaW5nJiB1bmlvbl9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGBFTlVNOjp3cml0ZV90b19vdXRfcHJvdG9jb2xgIGZ1bmN0aW9uLgorICB2b2lkIHJlbmRlcl91bmlvbl9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmdW5pb25fbmFtZSwgdF9zdHJ1Y3QgKnRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBgRU5VTTo6cmVhZF9mcm9tX2luX3Byb3RvY29sYCBmdW5jdGlvbi4KKyAgdm9pZCByZW5kZXJfdW5pb25fc3luY19yZWFkKGNvbnN0IHN0cmluZyAmdW5pb25fbmFtZSwgdF9zdHJ1Y3QgKnRzdHJ1Y3QpOworCisgIC8vIFRvcC1sZXZlbCBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSB2YXJpb3VzIHJlbmRlciBmdW5jdGlvbnMgbmVjZXNzYXJ5IHRvIHdyaXRlIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uCisgIC8vIG9mIGEgVGhyaWZ0IGNsaWVudC4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gV3JpdGUgdGhlIHRyYWl0IHdpdGggdGhlIHNlcnZpY2UtY2FsbCBtZXRob2RzIGZvciBgdHNlcnZpY2VgLgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKworICAvLyBXcml0ZSB0aGUgdHJhaXQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNsaWVudCBpbXBsIGlmIGVuZCB1c2VycyBjYW4gdXNlIGl0IHRvIG1ha2Ugc2VydmljZSBjYWxscy4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpOworCisgIC8vIFdyaXRlIHRoZSBjb2RlIHRvIGNyZWF0ZSB0aGUgVGhyaWZ0IHNlcnZpY2Ugc3luYyBjbGllbnQgc3RydWN0IGFuZCBpdHMgbWF0Y2hpbmcgJ2ltcGwnIGJsb2NrLgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF9kZWZpbml0aW9uX2FuZF9pbXBsKGNvbnN0IHN0cmluZyYgY2xpZW50X2ltcGxfbmFtZSk7CisKKyAgLy8gV3JpdGUgdGhlIGNvZGUgdG8gY3JlYXRlIHRoZSBgU3luY0NsaWVudDo6bmV3YCBmdW5jdGlvbnMgYXMgd2VsbCBhcyBhbnkgb3RoZXIgZnVuY3Rpb25zCisgIC8vIGNhbGxlcnMgd291bGQgbGlrZSB0byB1c2Ugb24gdGhlIFRocmlmdCBzZXJ2aWNlIHN5bmMgY2xpZW50LgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF9saWZlY3ljbGVfZnVuY3Rpb25zKGNvbnN0IHN0cmluZyYgY2xpZW50X3N0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGNvZGUgdG8gY3JlYXRlIHRoZSBpbXBsIGJsb2NrIGZvciB0aGUgYFRUaHJpZnRDbGllbnRgIHRyYWl0LiBTaW5jZSBnZW5lcmF0ZWQKKyAgLy8gUnVzdCBUaHJpZnQgY2xpZW50cyBwZXJmb3JtIGFsbCB0aGVpciBvcGVyYXRpb25zIHVzaW5nIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIHRyYWl0LCB3ZQorICAvLyBoYXZlIHRvIGltcGxlbWVudCBpdCBmb3IgdGhlIGNsaWVudCBzdHJ1Y3RzLgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF90dGhyaWZ0Y2xpZW50X2ltcGwoY29uc3Qgc3RyaW5nICZjbGllbnRfaW1wbF9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgbWFya2VyIHRyYWl0cyBmb3IgYW55IHNlcnZpY2UocykgYmVpbmcgZXh0ZW5kZWQsIGluY2x1ZGluZyB0aGUgb25lIGZvciB0aGUgY3VycmVudAorICAvLyBzZXJ2aWNlIGl0c2VsZiAoaS5lLiBgdHNlcnZpY2VgKQorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfaW1wbHModF9zZXJ2aWNlICp0c2VydmljZSwgY29uc3Qgc3RyaW5nICZpbXBsX3N0cnVjdF9uYW1lKTsKKworICAvLyBHZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsIHRoZSB0cmFpdHMgdGhpcyBUaHJpZnQgY2xpZW50IHN0cnVjdCBleHRlbmRzLgorICBzdHJpbmcgc3luY19jbGllbnRfbWFya2VyX3RyYWl0c19mb3JfZXh0ZW5zaW9uKHRfc2VydmljZSAqdHNlcnZpY2UpOworCisgIC8vIFRvcC1sZXZlbCBmdW5jdGlvbiB0aGF0IHdyaXRlcyB0aGUgY29kZSB0byBtYWtlIHRoZSBUaHJpZnQgc2VydmljZSBjYWxscy4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfcHJvY2Vzc19pbXBsKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFdyaXRlIHRoZSBhY3R1YWwgZnVuY3Rpb24gdGhhdCBjYWxscyBvdXQgdG8gdGhlIHJlbW90ZSBzZXJ2aWNlIGFuZCBwcm9jZXNzZXMgaXRzIHJlc3BvbnNlLgorICB2b2lkIHJlbmRlcl9zeW5jX3NlbmRfcmVjdl93cmFwcGVyKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBXcml0ZSB0aGUgYHNlbmRgIGZ1bmN0aW9uYWxpdHkgZm9yIGEgVGhyaWZ0IHNlcnZpY2UgY2FsbCByZXByZXNlbnRlZCBieSBhIGB0X3NlcnZpY2UtPnRfZnVuY3Rpb25gLgorICB2b2lkIHJlbmRlcl9zeW5jX3NlbmQodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFdyaXRlIHRoZSBgcmVjdmAgZnVuY3Rpb25hbGl0eSBmb3IgYSBUaHJpZnQgc2VydmljZSBjYWxsIHJlcHJlc2VudGVkIGJ5IGEgYHRfc2VydmljZS0+dF9mdW5jdGlvbmAuCisgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgcmVuZGVyZWQgaWYgdGhlIGZ1bmN0aW9uIGlzICpub3QqIG9uZXdheS4KKyAgdm9pZCByZW5kZXJfc3luY19yZWN2KHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICB2b2lkIHJlbmRlcl9zeW5jX3Byb2Nlc3Nvcih0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSk7CisgIHZvaWQgcmVuZGVyX3N5bmNfcHJvY2Vzc29yX2RlZmluaXRpb25fYW5kX2ltcGwodF9zZXJ2aWNlICp0c2VydmljZSk7CisgIHZvaWQgcmVuZGVyX3N5bmNfcHJvY2Vzc19kZWxlZ2F0aW9uX2Z1bmN0aW9ucyh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKyAgdm9pZCByZW5kZXJfc3luY19wcm9jZXNzX2Z1bmN0aW9uKHRfZnVuY3Rpb24gKnRmdW5jLCBjb25zdCBzdHJpbmcgJmhhbmRsZXJfdHlwZSk7CisgIHZvaWQgcmVuZGVyX3Byb2Nlc3NfbWF0Y2hfc3RhdGVtZW50cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX3N1Y2NlZWRlZCh0X2Z1bmN0aW9uICp0ZnVuYyk7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWQodF9mdW5jdGlvbiAqdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX3VzZXJfZXhjZXB0aW9uX2JyYW5jaCh0X2Z1bmN0aW9uICp0ZnVuYyk7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2JyYW5jaCh0X2Z1bmN0aW9uICp0ZnVuYywgY29uc3Qgc3RyaW5nICZhcHBfZXJyX3Zhcik7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfZGVmYXVsdF9leGNlcHRpb25fYnJhbmNoKHRfZnVuY3Rpb24gKnRmdW5jKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX3NlbmRfZXhjZXB0aW9uX3Jlc3BvbnNlKHRfZnVuY3Rpb24gKnRmdW5jLCBjb25zdCBzdHJpbmcgJmVycl92YXIpOworICB2b2lkIHJlbmRlcl9zZXJ2aWNlX2NhbGxfc3RydWN0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCByZW5kZXJfc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKTsKKyAgdm9pZCByZW5kZXJfc2VydmljZV9jYWxsX3Jlc3VsdF92YWx1ZV9zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIHN0cmluZyBoYW5kbGVyX3N1Y2Nlc3NmdWxfcmV0dXJuX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gV3JpdGVzIHRoZSByZXN1bHQgb2YgYHJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0YCB3cmFwcGVkIGluIGFuIGBFcnIodGhyaWZ0OjpFcnJvciguLi4pKWAuCisgIHZvaWQgcmVuZGVyX3RocmlmdF9lcnJvcigKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yX2tpbmQsCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9zdHJ1Y3QsCisgICAgY29uc3Qgc3RyaW5nJiBzdWJfZXJyb3Jfa2luZCwKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yX21lc3NhZ2UKKyAgKTsKKworICAvLyBXcml0ZSBhIHRocmlmdDo6RXJyb3IgdmFyaWFudCBzdHJ1Y3QuIEVycm9yIHN0cnVjdHMgdGFrZSB0aGUgZm9ybToKKyAgLy8gYGBgCisgIC8vIHB1YiBzdHJ1Y3QgZXJyb3Jfc3RydWN0IHsKKyAgLy8gICBraW5kOiBzdWJfZXJyb3Jfa2luZCwKKyAgLy8gICBtZXNzYWdlOiBlcnJvcl9tZXNzYWdlLAorICAvLyB9CisgIC8vIGBgYAorICAvLyBBIGNvbmNyZXRlIGV4YW1wbGUgaXM6CisgIC8vIGBgYAorICAvLyAgcHViIHN0cnVjdCBBcHBsaWNhdGlvbkVycm9yIHsKKyAgLy8gICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgIC8vICAgIG1lc3NhZ2U6ICJUaGlzIGlzIHNvbWUgZXJyb3IgbWVzc2FnZSIsCisgIC8vICB9CisgIC8vIGBgYAorICB2b2lkIHJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0KAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3Jfc3RydWN0LAorICAgIGNvbnN0IHN0cmluZyYgc3ViX2Vycm9yX2tpbmQsCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9tZXNzYWdlCisgICk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZSB1bnBhY2tlZCBzZXJ2aWNlIGNhbGwgYXJncyBnaXZlbiBhIHNlcnZpY2UgY2FsbCBmdW5jdGlvbgorICAvLyBgdF9mdW5jdGlvbmAuIFByZXBlbmRzIHRoZSBhcmdzIHdpdGggZWl0aGVyIGAmbXV0IHNlbGZgIG9yIGAmc2VsZmAgYW5kIGluY2x1ZGVzIHRoZSBhcmcgdHlwZXMKKyAgLy8gaW4gdGhlIHJldHVybmVkIHN0cmluZywgZm9yIGV4YW1wbGU6CisgIC8vIGBmbiBmb28oJm11dCBzZWxmLCBmaWVsZF8wOiBTdHJpbmcpYC4KKyAgc3RyaW5nIHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgc2VsZl9pc19tdXRhYmxlKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIHVucGFja2VkIHNlcnZpY2UgY2FsbCBhcmdzIGdpdmVuIGEgc2VydmljZSBjYWxsIGZ1bmN0aW9uCisgIC8vIGB0X2Z1bmN0aW9uYC4gT25seSBpbmNsdWRlcyB0aGUgYXJnIG5hbWVzLCBlYWNoIG9mIHdoaWNoIGlzIHByZWZpeGVkIHdpdGggdGhlIG9wdGlvbmFsIHByZWZpeAorICAvLyBgZmllbGRfcHJlZml4YCwgZm9yIGV4YW1wbGU6IGBzZWxmLmZpZWxkXzBgLgorICBzdHJpbmcgcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9pbnZvY2F0aW9uKHRfZnVuY3Rpb24qIHRmdW5jLCBjb25zdCBzdHJpbmcmIGZpZWxkX3ByZWZpeCA9ICIiKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgZmllbGRzIGluIHRoZSBzdHJ1Y3QgYHRzdHJ1Y3RgIGZvciB1c2UgaW4gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KKyAgLy8gRWFjaCBmaWVsZCBpcyBmb2xsb3dlZCBieSBpdHMgdHlwZSwgZm9yIGV4YW1wbGU6IGBmaWVsZF8wOiBTdHJpbmdgLgorICBzdHJpbmcgc3RydWN0X3RvX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0IGB0c3RydWN0YCBmb3IgdXNlIGluIGEgZnVuY3Rpb24gY2FsbCwKKyAgLy8gZm9yIGV4YW1wbGU6IGBmaWVsZF8wOiBTdHJpbmdgLgorICBzdHJpbmcgc3RydWN0X3RvX2ludm9jYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QsIGNvbnN0IHN0cmluZyYgZmllbGRfcHJlZml4ID0gIiIpOworCisgIC8vIFdyaXRlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBhIHN0cnVjdCwgc2VydmljZS1jYWxsIG9yIG90aGVyIGRvY3VtZW50YXRpb24tYW5ub3RhdGVkIGVsZW1lbnQuCisgIHZvaWQgcmVuZGVyX3J1c3Rkb2ModF9kb2MqIHRkb2MpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIHRydWUgdHlwZSBvZiBgdHR5cGVgIGlzIGEgdGhyaWZ0IGRvdWJsZSwgYGZhbHNlYCBvdGhlcndpc2UuCisgIGJvb2wgaXNfZG91YmxlKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJ1c3QgdHlwZSBnaXZlbiBhIGB0X3R5cGVgLgorICBzdHJpbmcgdG9fcnVzdF90eXBlKHRfdHlwZSogdHR5cGUsIGJvb2wgb3JkZXJlZF9mbG9hdCA9IHRydWUpOworCisgIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGBjb25zdGAgcnVzdCB0eXBlIGdpdmVuIGEgYHRfdHlwZWAKKyAgc3RyaW5nIHRvX3J1c3RfY29uc3RfdHlwZSh0X3R5cGUqIHR0eXBlLCBib29sIG9yZGVyZWRfZmxvYXQgPSB0cnVlKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByaWZ0IGBwcm90b2NvbDo6VFR5cGVgIGdpdmVuIGEgYHRfdHlwZWAuCisgIHN0cmluZyB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bSh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgdG8gYmUgdXNlZCB3aGVuIGluaXRpYWxpemluZyBhIHN0cnVjdCBmaWVsZCB3aGljaCBoYXMgYE9QVF9JTl9SRVFfT1VUYAorICAvLyBvcHRpb25hbGl0eS4KKyAgc3RyaW5nIG9wdF9pbl9yZXFfb3V0X3ZhbHVlKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgd2UgY2FuIHdyaXRlIGEgY29uc3Qgb2YgdGhlIGZvcm0gYHB1YiBjb25zdCBGT086IC4uLmAuCisgIGJvb2wgY2FuX2dlbmVyYXRlX3NpbXBsZV9jb25zdCh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHdlIGNhbm5vdCB3cml0ZSBhIHN0YW5kYXJkIFJ1c3QgY29uc3RhbnQgKGJlY2F1c2UgdGhlIHR5cGUgbmVlZHMgc29tZSBhbGxvY2F0aW9uKS4KKyAgYm9vbCBjYW5fZ2VuZXJhdGVfY29uc3RfaG9sZGVyKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0eXBlIGlzIGEgdm9pZCwgYW5kIHNob3VsZCBiZSByZXByZXNlbnRlZCBieSB0aGUgcnVzdCBgKClgIHR5cGUuCisgIGJvb2wgaXNfdm9pZCh0X3R5cGUqIHR0eXBlKTsKKworICB0X2ZpZWxkOjplX3JlcSBhY3R1YWxfZmllbGRfcmVxKHRfZmllbGQqIHRmaWVsZCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBgdF9maWVsZDo6ZV9yZXFgIGlzIGVpdGhlciBgdF9maWVsZDo6VF9PUFRJT05BTGAgb3IgYHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVRgCisgIC8vIGFuZCBuZWVkcyB0byBiZSB3cmFwcGVkIGJ5IGFuIGBPcHRpb248VFlQRV9OQU1FPmAsIGBmYWxzZWAgb3RoZXJ3aXNlLgorICBib29sIGlzX29wdGlvbmFsKHRfZmllbGQ6OmVfcmVxIHJlcSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgc2VydmljZSBjYWxsIGhhcyBhcmd1bWVudHMsIGBmYWxzZWAgb3RoZXJ3aXNlLgorICBib29sIGhhc19hcmdzKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIGEgc2VydmljZSBjYWxsIGhhcyBub24tYCgpYCBhcmd1bWVudHMsIGBmYWxzZWAgb3RoZXJ3aXNlLgorICBib29sIGhhc19ub25fdm9pZF9hcmdzKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBSZXR1cm4gYHB1YiBgIChub3RpY2UgdHJhaWxpbmcgd2hpdGVzcGFjZSEpIGlmIHRoZSBzdHJ1Y3Qgc2hvdWxkIGJlIHB1YmxpYywgYGAgKGVtcHR5IHN0cmluZykgb3RoZXJ3aXNlLgorICBzdHJpbmcgdmlzaWJpbGl0eV9xdWFsaWZpZXIodF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIFJldHVybnMgdGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIGEgZ2l2ZW4gVGhyaWZ0IHNlcnZpY2UuIElmIHRoZSB0eXBlIGlzIGRlZmluZWQgaW4gdGhlIHByZXNlbnRseS1jb21wdXRlZAorICAvLyBUaHJpZnQgcHJvZ3JhbSwgdGhlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisgIHN0cmluZyBydXN0X25hbWVzcGFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm5zIHRoZSBuYW1lc3BhY2UgcHJlZml4IGZvciBhIGdpdmVuIFRocmlmdCB0eXBlLiBJZiB0aGUgdHlwZSBpcyBkZWZpbmVkIGluIHRoZSBwcmVzZW50bHktY29tcHV0ZWQKKyAgLy8gVGhyaWZ0IHByb2dyYW0sIHRoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorICBzdHJpbmcgcnVzdF9uYW1lc3BhY2UodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJucyB0aGUgY2FtZWwtY2FzZWQgbmFtZSBmb3IgYSBSdXN0IHN0cnVjdCB0eXBlLiBIYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGB0c3RydWN0LT5nZXRfbmFtZSgpYCBpcworICAvLyBhIHJlc2VydmVkIHdvcmQuCisgIHN0cmluZyBydXN0X3N0cnVjdF9uYW1lKHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBSZXR1cm5zIHRoZSBzbmFrZS1jYXNlZCBuYW1lIGZvciBhIFJ1c3QgZmllbGQgb3IgbG9jYWwgdmFyaWFibGUuIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUKKyAgLy8gYHRmaWVsZC0+Z2V0X25hbWUoKWAgaXMgYSByZXNlcnZlZCB3b3JkLgorICBzdHJpbmcgcnVzdF9maWVsZF9uYW1lKHRfZmllbGQqIHRzdHJ1Y3QpOworCisgIC8vIFJldHVybnMgdGhlIGNhbWVsLWNhc2VkIG5hbWUgZm9yIGEgUnVzdCB1bmlvbiB0eXBlLiBIYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGB0c3RydWN0LT5nZXRfbmFtZSgpYCBpcworICAvLyBhIHJlc2VydmVkIHdvcmQuCisgIHN0cmluZyBydXN0X3VuaW9uX2ZpZWxkX25hbWUodF9maWVsZCogdHN0cnVjdCk7CisKKyAgLy8gQ29udmVydHMgYW55IHZhcmlhYmxlIG5hbWUgaW50byBhICdzYWZlJyB2YXJpYW50IHRoYXQgZG9lcyBub3QgY2xhc2ggd2l0aCBhbnkgUnVzdCByZXNlcnZlZCBrZXl3b3Jkcy4KKyAgc3RyaW5nIHJ1c3Rfc2FmZV9uYW1lKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgbmFtZSBpcyBhIHJlc2VydmVkIFJ1c3Qga2V5d29yZCwgYGZhbHNlYCBvdGhlcndpc2UuCisgIGJvb2wgaXNfcmVzZXJ2ZWQoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgdXNlcnMgd2lsbCBpbnZva2UgdG8gbWFrZSBvdXRnb2luZyBzZXJ2aWNlIGNhbGxzLgorICBzdHJpbmcgc2VydmljZV9jYWxsX2NsaWVudF9mdW5jdGlvbl9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgdXNlcnMgd2lsbCBoYXZlIHRvIGltcGxlbWVudCB0byBoYW5kbGUgaW5jb21pbmcgc2VydmljZSBjYWxscy4KKyAgc3RyaW5nIHNlcnZpY2VfY2FsbF9oYW5kbGVyX2Z1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc3RydWN0IHVzZWQgdG8gcGFjayB0aGUgYXJndW1lbnRzIGZvciB0aGUgdGhyaWZ0IHNlcnZpY2UgY2FsbC4KKyAgc3RyaW5nIHNlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdF9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHN0cnVjdCB1c2VkIHRvIHBhY2sgdGhlIHJldHVybiB2YWx1ZQorICAvLyBhbmQgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMgZm9yIHRoZSB0aHJpZnQgc2VydmljZSBjYWxsLgorICBzdHJpbmcgc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgc3RyaW5nIHJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSB0cmFpdCBuYW1lIGZvciB0aGUgc3luYyBzZXJ2aWNlIGNsaWVudCBnaXZlbiBhIGB0X3NlcnZpY2VgLgorICBzdHJpbmcgcnVzdF9zeW5jX2NsaWVudF90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgbmFtZSBmb3IgdGhlIHN5bmMgc2VydmljZSBjbGllbnQgc3RydWN0IGdpdmVuIGEgYHRfc2VydmljZWAuCisgIHN0cmluZyBydXN0X3N5bmNfY2xpZW50X2ltcGxfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHRyYWl0IG5hbWUgdGhhdCB1c2VycyB3aWxsIGhhdmUgdG8gaW1wbGVtZW50IGZvciB0aGUgc2VydmVyIGhhbGYgb2YgYSBUaHJpZnQgc2VydmljZS4KKyAgc3RyaW5nIHJ1c3Rfc3luY19oYW5kbGVyX3RyYWl0X25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBzdHJ1Y3QgbmFtZSBmb3IgdGhlICBzZXJ2ZXIgaGFsZiBvZiBhIFRocmlmdCBzZXJ2aWNlLgorICBzdHJpbmcgcnVzdF9zeW5jX3Byb2Nlc3Nvcl9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgc3RydWN0IG5hbWUgZm9yIHRoZSBzdHJ1Y3QgdGhhdCBjb250YWlucyBhbGwgdGhlIHNlcnZpY2UtY2FsbCBpbXBsZW1lbnRhdGlvbnMgZm9yCisgIC8vIHRoZSBzZXJ2ZXIgaGFsZiBvZiBhIFRocmlmdCBzZXJ2aWNlLgorICBzdHJpbmcgcnVzdF9zeW5jX3Byb2Nlc3Nvcl9pbXBsX25hbWUodF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSB2YXJpYW50IG5hbWUgZm9yIGFuIGVudW0gdmFyaWFudAorICBzdHJpbmcgcnVzdF9lbnVtX3ZhcmlhbnRfbmFtZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFByb3Blcmx5IHVwcGVyY2FzZSBuYW1lcyBmb3IgdXNlIGluIFJ1c3QuCisgIHN0cmluZyBydXN0X3VwcGVyX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBTbmFrZS1jYXNlIGZpZWxkLCBwYXJhbWV0ZXIgYW5kIGZ1bmN0aW9uIG5hbWVzIGFuZCBtYWtlIHRoZW0gUnVzdCBmcmllbmRseS4KKyAgc3RyaW5nIHJ1c3Rfc25ha2VfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIENhbWVsLWNhc2UgdHlwZS92YXJpYW50IG5hbWVzIGFuZCBtYWtlIHRoZW0gUnVzdCBmcmllbmRseS4KKyAgc3RyaW5nIHJ1c3RfY2FtZWxfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiBgc2VhcmNoX3N0cmluZ2Agd2l0aCBgcmVwbGFjZV9zdHJpbmdgIGluIGB0YXJnZXRgLgorICB2b2lkIHN0cmluZ19yZXBsYWNlKHN0cmluZyYgdGFyZ2V0LCBjb25zdCBzdHJpbmcmIHNlYXJjaF9zdHJpbmcsIGNvbnN0IHN0cmluZyYgcmVwbGFjZV9zdHJpbmcpOworfTsKKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIG1ha2Ugb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhpcyB0aHJpZnQgcHJvZ3JhbQorICBNS0RJUihnZW5fZGlyXy5jX3N0cigpKTsKKworICAvLyBjcmVhdGUgdGhlIGZpbGUgaW50byB3aGljaCB3ZSdyZSBnb2luZyB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGNvZGUKKyAgc3RyaW5nIGZfZ2VuX25hbWUgPSBnZW5fZGlyXyArICIvIiArIHJ1c3Rfc25ha2VfY2FzZShnZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSArICIucnMiOworICBmX2dlbl8ub3BlbihmX2dlbl9uYW1lLmNfc3RyKCkpOworCisgIC8vIGhlYWRlciBjb21tZW50CisgIGZfZ2VuXyA8PCAiLy8gIiA8PCBhdXRvZ2VuX3N1bW1hcnkoKSA8PCBlbmRsOworICBmX2dlbl8gPDwgIi8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkciIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIHJlbmRlcl9hdHRyaWJ1dGVzX2FuZF9pbmNsdWRlcygpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfYXR0cmlidXRlc19hbmRfaW5jbHVkZXMoKSB7CisgIC8vIHR1cm4gb2ZmIHNvbWUgY29tcGlsZXIvY2xpcHB5IHdhcm5pbmdzCisKKyAgLy8gY29kZSBhbHdheXMgaW5jbHVkZXMgQlRyZWVNYXAvQlRyZWVTZXQvT3JkZXJlZEZsb2F0CisgIGZfZ2VuXyA8PCAiIyFbYWxsb3codW51c2VkX2ltcG9ydHMpXSIgPDwgZW5kbDsKKyAgLy8gY29kZSBtaWdodCBub3QgaW5jbHVkZSBpbXBvcnRzIGZyb20gY3JhdGVzCisgIGZfZ2VuXyA8PCAiIyFbYWxsb3codW51c2VkX2V4dGVybl9jcmF0ZXMpXSIgPDwgZW5kbDsKKyAgLy8gY29uc3RydWN0b3JzIHRha2UgKmFsbCogc3RydWN0IHBhcmFtZXRlcnMsIHdoaWNoIGNhbiB0cmlnZ2VyIHRoZSAidG9vIG1hbnkgYXJndW1lbnRzIiB3YXJuaW5nCisgIC8vIHNvbWUgYXV0by1nZW4nZCB0eXBlcyBjYW4gYmUgZGVlcGx5IG5lc3RlZC4gY2xpcHB5IHJlY29tbWVuZHMgZmFjdG9yaW5nIHRoZW0gb3V0IHdoaWNoIGlzIGhhcmQgdG8gYXV0b2dlbgorICBmX2dlbl8gPDwgIiMhW2NmZ19hdHRyKGZlYXR1cmUgPSBcImNhcmdvLWNsaXBweVwiLCBhbGxvdyh0b29fbWFueV9hcmd1bWVudHMsIHR5cGVfY29tcGxleGl0eSkpXSIgPDwgZW5kbDsKKyAgLy8gcHJldmVudCBydXN0Zm10IGZyb20gcnVubmluZyBhZ2FpbnN0IHRoaXMgZmlsZQorICAvLyBsaW5lcyBhcmUgdG9vIGxvbmcsIGNvZGUgaXMgKHRoYW5rZnVsbHkhKSBub3QgdmlzdWFsLWluZGVudGVkLCBldGMuCisgIGZfZ2VuXyA8PCAiIyFbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdF9za2lwKV0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGFkZCBzdGFuZGFyZCBpbmNsdWRlcworICBmX2dlbl8gPDwgImV4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJleHRlcm4gY3JhdGUgdGhyaWZ0OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJleHRlcm4gY3JhdGUgdHJ5X2Zyb207IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugb3JkZXJlZF9mbG9hdDo6T3JkZXJlZEZsb2F0OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpjZWxsOjpSZWZDZWxsOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpjb2xsZWN0aW9uczo6e0JUcmVlTWFwLCBCVHJlZVNldH07IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmNvbnZlcnQ6OkZyb207IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmRlZmF1bHQ6OkRlZmF1bHQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmVycm9yOjpFcnJvcjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Zm10OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpmbXQ6OntEaXNwbGF5LCBGb3JtYXR0ZXJ9OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpyYzo6UmM7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0cnlfZnJvbTo6VHJ5RnJvbTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OntBcHBsaWNhdGlvbkVycm9yLCBBcHBsaWNhdGlvbkVycm9yS2luZCwgUHJvdG9jb2xFcnJvciwgUHJvdG9jb2xFcnJvcktpbmQsIFRUaHJpZnRDbGllbnR9OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RGaWVsZElkZW50aWZpZXIsIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLCBUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sLCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlfTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OmZpZWxkX2lkOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6dmVyaWZ5X2V4cGVjdGVkX21lc3NhZ2VfdHlwZTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OnZlcmlmeV9leHBlY3RlZF9zZXF1ZW5jZV9udW1iZXI7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp2ZXJpZnlfZXhwZWN0ZWRfc2VydmljZV9jYWxsOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6dmVyaWZ5X3JlcXVpcmVkX2ZpZWxkX2V4aXN0czsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6c2VydmVyOjpUUHJvY2Vzc29yOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gYWRkIGFsbCB0aGUgcHJvZ3JhbSBpbmNsdWRlcworICAvLyBOT1RFOiB0aGlzIGlzIG1vcmUgaW52b2x2ZWQgdGhhbiB5b3Ugd291bGQgZXhwZWN0IGJlY2F1c2Ugb2Ygc2VydmljZSBleHRlbnNpb24KKyAgLy8gQmFzaWNhbGx5LCBJIGhhdmUgdG8gZmluZCB0aGUgY2xvc3VyZSBvZiBhbGwgdGhlIHNlcnZpY2VzIGFuZCBpbmNsdWRlIHRoZWlyIG1vZHVsZXMgYXQgdGhlIHRvcC1sZXZlbAorCisgIHNldDxzdHJpbmc+IHJlZmVyZW5jZWRfbW9kdWxlczsKKworICAvLyBmaXJzdCwgc3RhcnQgYnkgYWRkaW5nIGV4cGxpY2l0IHRocmlmdCBpbmNsdWRlcworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXMgPSBnZXRfcHJvZ3JhbSgpLT5nZXRfaW5jbHVkZXMoKTsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBpbmNsdWRlc19pdGVyOworICBmb3IoaW5jbHVkZXNfaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7IGluY2x1ZGVzX2l0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7ICsraW5jbHVkZXNfaXRlcikgeworICAgIHJlZmVyZW5jZWRfbW9kdWxlcy5pbnNlcnQoKCppbmNsdWRlc19pdGVyKS0+Z2V0X25hbWUoKSk7CisgIH0KKworICAvLyBuZXh0LCByZWN1cnNpdmVseSBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBzZXJ2aWNlcyBhbmQgYWRkIHRoZSBuYW1lcyBvZiBhbnkgcHJvZ3JhbXMgdGhleSByZWZlcmVuY2UKKyAgY29uc3QgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gZ2V0X3Byb2dyYW0oKS0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3Igc2VydmljZV9pdGVyOworICBmb3IgKHNlcnZpY2VfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHNlcnZpY2VfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzZXJ2aWNlX2l0ZXIpIHsKKyAgICBjb21wdXRlX3NlcnZpY2VfcmVmZXJlbmNlZF9tb2R1bGVzKCpzZXJ2aWNlX2l0ZXIsIHJlZmVyZW5jZWRfbW9kdWxlcyk7CisgIH0KKworICAvLyBmaW5hbGx5LCB3cml0ZSBhbGwgdGhlICJwdWIgdXNlLi4uIiBkZWNsYXJhdGlvbnMKKyAgaWYgKCFyZWZlcmVuY2VkX21vZHVsZXMuZW1wdHkoKSkgeworICAgIHNldDxzdHJpbmc+OjppdGVyYXRvciBtb2R1bGVfaXRlcjsKKyAgICBmb3IgKG1vZHVsZV9pdGVyID0gcmVmZXJlbmNlZF9tb2R1bGVzLmJlZ2luKCk7IG1vZHVsZV9pdGVyICE9IHJlZmVyZW5jZWRfbW9kdWxlcy5lbmQoKTsgKyttb2R1bGVfaXRlcikgeworICAgICAgZl9nZW5fIDw8ICJ1c2UgIiA8PCBydXN0X3NuYWtlX2Nhc2UoKm1vZHVsZV9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9nZW5fIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Y29tcHV0ZV9zZXJ2aWNlX3JlZmVyZW5jZWRfbW9kdWxlcygKKyAgdF9zZXJ2aWNlICp0c2VydmljZSwKKyAgc2V0PHN0cmluZz4gJnJlZmVyZW5jZWRfbW9kdWxlcworKSB7CisgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kcykgeworICAgIGlmIChleHRlbmRzLT5nZXRfcHJvZ3JhbSgpICE9IGdldF9wcm9ncmFtKCkpIHsKKyAgICAgIHJlZmVyZW5jZWRfbW9kdWxlcy5pbnNlcnQoZXh0ZW5kcy0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIGNvbXB1dGVfc2VydmljZV9yZWZlcmVuY2VkX21vZHVsZXMoZXh0ZW5kcywgcmVmZXJlbmNlZF9tb2R1bGVzKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfZ2VuXy5jbG9zZSgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29uc3RzCisvLworLy8gTk9URTogY29uc2lkZXIgdXNpbmcgbWFjcm9zIHRvIGdlbmVyYXRlIGNvbnN0YW50cworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBpcyB3b3JzZSB0aGFuIGl0IHNob3VsZCBiZSBiZWNhdXNlIGNvbnN0YW50cworLy8gYXJlbid0IChzZW5zaWJseSkgbGltaXRlZCB0byBzY2FsYXIgdHlwZXMKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF90eXBlKiB0dHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgdF9jb25zdF92YWx1ZSogdHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBpZiAoY2FuX2dlbmVyYXRlX3NpbXBsZV9jb25zdCh0dHlwZSkpIHsKKyAgICByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgdHR5cGUsIHR2YWx1ZSk7CisgIH0gZWxzZSBpZiAoY2FuX2dlbmVyYXRlX2NvbnN0X2hvbGRlcih0dHlwZSkpIHsKKyAgICByZW5kZXJfY29uc3RfdmFsdWVfaG9sZGVyKG5hbWUsIHR0eXBlLCB0dmFsdWUpOworICB9IGVsc2UgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3QgZm9yICIgKyBuYW1lOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShjb25zdCBzdHJpbmcmIG5hbWUsIHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICBpZiAoIWNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QodHR5cGUpKSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBzaW1wbGUgcnVzdCBjb25zdGFudCBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgZl9nZW5fIDw8ICJwdWIgY29uc3QgIiA8PCBydXN0X3VwcGVyX2Nhc2UobmFtZSkgPDwgIjogIiA8PCB0b19ydXN0X2NvbnN0X3R5cGUodHR5cGUpIDw8ICIgPSAiOworICByZW5kZXJfY29uc3RfdmFsdWUodHR5cGUsIHR2YWx1ZSwgZmFsc2UpOworICBmX2dlbl8gPDwgIjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWVfaG9sZGVyKGNvbnN0IHN0cmluZyYgbmFtZSwgdF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIGlmICghY2FuX2dlbmVyYXRlX2NvbnN0X2hvbGRlcih0dHlwZSkpIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIGNvbnN0YW50IGhvbGRlciBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIGhvbGRlcl9uYW1lKCJDb25zdCIgKyBydXN0X2NhbWVsX2Nhc2UobmFtZSkpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicHViIHN0cnVjdCAiIDw8IGhvbGRlcl9uYW1lIDw8ICI7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImltcGwgIiA8PCBob2xkZXJfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicHViIGZuIGNvbnN0X3ZhbHVlKCkgLT4gIiA8PCB0b19ydXN0X3R5cGUodHR5cGUpIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9jb25zdF92YWx1ZSh0dHlwZSwgdHZhbHVlKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUsIGJvb2wgaXNfb3duZWQpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICBzd2l0Y2ggKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpZiAoaXNfb3duZWQpIHsKKyAgICAgICAgICBmX2dlbl8gPDwgIlwiIiA8PCB0dmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiXCIiPDwgICIudG9fb3duZWQoKS5pbnRvX2J5dGVzKCkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfZ2VuXyA8PCAiYlwiIiA8PCB0dmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiXCIiOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8gPDwgIlwiIiA8PCB0dmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiXCIiOworICAgICAgICBpZiAoaXNfb3duZWQpIHsKKyAgICAgICAgICBmX2dlbl8gPDwgIi50b19vd25lZCgpIjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgZl9nZW5fIDw8ICh0dmFsdWUtPmdldF9pbnRlZ2VyKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBmX2dlbl8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBmX2dlbl8gPDwgIk9yZGVyZWRGbG9hdDo6ZnJvbSgiIDw8IHR2YWx1ZS0+Z2V0X2RvdWJsZSgpIDw8ICIgYXMgZjY0KSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBjb25zdCB2YWx1ZSBmb3IgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJlbmRlcl9jb25zdF92YWx1ZShnZXRfdHJ1ZV90eXBlKHR0eXBlKSwgdHZhbHVlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8IHRvX3J1c3RfdHlwZSh0dHlwZSkKKyAgICAgIDw8ICI6OnRyeV9mcm9tKCIKKyAgICAgIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKQorICAgICAgPDwgIikuZXhwZWN0KFwiZXhwZWN0aW5nIHZhbGlkIGNvbnN0IHZhbHVlXCIpIgorICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZW5kZXJfY29uc3Rfc3RydWN0KHR0eXBlLCB0dmFsdWUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICByZW5kZXJfY29uc3RfbGlzdCh0dHlwZSwgdHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgcmVuZGVyX2NvbnN0X3NldCh0dHlwZSwgdHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgcmVuZGVyX2NvbnN0X21hcCh0dHlwZSwgdHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBjb25zdCBjb250YWluZXIgdmFsdWUgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIGNvbnN0IHZhbHVlIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3N0cnVjdCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKikgeworICBpZiAoKCh0X3N0cnVjdCopdHR5cGUpLT5pc191bmlvbigpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidW5pbXBsZW1lbnRlZCEoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ1bmltcGxlbWVudGVkISgpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF9saXN0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbXV0IGw6IFZlYzwiIDw8IHRvX3J1c3RfdHlwZShlbGVtX3R5cGUpIDw8ICI+ID0gVmVjOjpuZXcoKTsiIDw8IGVuZGw7CisgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGVsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOworICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBlbGVtX2l0ZXI7CisgIGZvcihlbGVtX2l0ZXIgPSBlbGVtcy5iZWdpbigpOyBlbGVtX2l0ZXIgIT0gZWxlbXMuZW5kKCk7ICsrZWxlbV9pdGVyKSB7CisgICAgdF9jb25zdF92YWx1ZSogZWxlbV92YWx1ZSA9ICgqZWxlbV9pdGVyKTsKKyAgICByZW5kZXJfY29udGFpbmVyX2NvbnN0X3ZhbHVlKCJsLnB1c2giLCBlbGVtX3R5cGUsIGVsZW1fdmFsdWUpOworICB9CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibCIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3NldCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbXV0IHM6IEJUcmVlU2V0PCIgPDwgdG9fcnVzdF90eXBlKGVsZW1fdHlwZSkgPDwgIj4gPSBCVHJlZVNldDo6bmV3KCk7IiA8PCBlbmRsOworICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBlbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgZWxlbV9pdGVyOworICBmb3IoZWxlbV9pdGVyID0gZWxlbXMuYmVnaW4oKTsgZWxlbV9pdGVyICE9IGVsZW1zLmVuZCgpOyArK2VsZW1faXRlcikgeworICAgIHRfY29uc3RfdmFsdWUqIGVsZW1fdmFsdWUgPSAoKmVsZW1faXRlcik7CisgICAgcmVuZGVyX2NvbnRhaW5lcl9jb25zdF92YWx1ZSgicy5pbnNlcnQiLCBlbGVtX3R5cGUsIGVsZW1fdmFsdWUpOworICB9CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X21hcCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgbXV0IG06IEJUcmVlTWFwPCIKKyAgICA8PCB0b19ydXN0X3R5cGUoa2V5X3R5cGUpIDw8ICIsICIgPDwgdG9fcnVzdF90eXBlKHZhbF90eXBlKQorICAgIDw8ICI+ID0gQlRyZWVNYXA6Om5ldygpOyIKKyAgICA8PCBlbmRsOworICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgZWxlbXMgPSB0dmFsdWUtPmdldF9tYXAoKTsKKyAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIGVsZW1faXRlcjsKKyAgZm9yIChlbGVtX2l0ZXIgPSBlbGVtcy5iZWdpbigpOyBlbGVtX2l0ZXIgIT0gZWxlbXMuZW5kKCk7ICsrZWxlbV9pdGVyKSB7CisgICAgdF9jb25zdF92YWx1ZSoga2V5X3ZhbHVlID0gZWxlbV9pdGVyLT5maXJzdDsKKyAgICB0X2NvbnN0X3ZhbHVlKiB2YWxfdmFsdWUgPSBlbGVtX2l0ZXItPnNlY29uZDsKKyAgICBpZiAoZ2V0X3RydWVfdHlwZShrZXlfdHlwZSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBrID0gIjsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShrZXlfdHlwZSwga2V5X3ZhbHVlKTsKKyAgICAgIGZfZ2VuXyA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgayA9IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShrZXlfdHlwZSwga2V5X3ZhbHVlKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoZ2V0X3RydWVfdHlwZSh2YWxfdHlwZSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCB2ID0gIjsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZSh2YWxfdHlwZSwgdmFsX3ZhbHVlKTsKKyAgICAgIGZfZ2VuXyA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgdiA9IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZSh2YWxfdHlwZSwgdmFsX3ZhbHVlKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKyAgICBmX2dlbl8gPDwgIGluZGVudCgpIDw8ICJtLmluc2VydChrLCB2KTsiIDw8IGVuZGw7CisgIH0KKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtIiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29udGFpbmVyX2NvbnN0X3ZhbHVlKAorICBjb25zdCBzdHJpbmcmIGluc2VydF9mdW5jdGlvbiwKKyAgdF90eXBlKiB0dHlwZSwKKyAgdF9jb25zdF92YWx1ZSogdHZhbHVlCispIHsKKyAgaWYgKGdldF90cnVlX3R5cGUodHR5cGUpLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBpbnNlcnRfZnVuY3Rpb24gPDwgIigiOworICAgIHJlbmRlcl9jb25zdF92YWx1ZSh0dHlwZSwgdHZhbHVlKTsKKyAgICBmX2dlbl8gPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBpbnNlcnRfZnVuY3Rpb24gPDwgIigiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR0eXBlLCB0dmFsdWUpOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVHlwZWRlZnMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBzdGQ6OnN0cmluZyBhY3R1YWxfdHlwZSA9IHRvX3J1c3RfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSk7CisgIGZfZ2VuXyA8PCAicHViIHR5cGUgIiA8PCBydXN0X3NhZmVfbmFtZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiIDw8IGFjdHVhbF90eXBlIDw8ICI7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEVudW1zCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RyaW5nIGVudW1fbmFtZShydXN0X2NhbWVsX2Nhc2UodGVudW0tPmdldF9uYW1lKCkpKTsKKyAgcmVuZGVyX2VudW1fZGVmaW5pdGlvbih0ZW51bSwgZW51bV9uYW1lKTsKKyAgcmVuZGVyX2VudW1faW1wbChlbnVtX25hbWUpOworICByZW5kZXJfZW51bV9jb252ZXJzaW9uKHRlbnVtLCBlbnVtX25hbWUpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfZW51bV9kZWZpbml0aW9uKHRfZW51bSogdGVudW0sIGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKSB7CisgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRlbnVtKTsKKyAgZl9nZW5fIDw8ICIjW2Rlcml2ZShDb3B5LCBDbG9uZSwgRGVidWcsIEVxLCBIYXNoLCBPcmQsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldIiA8PCBlbmRsOworICBmX2dlbl8gPDwgInB1YiBlbnVtICIgPDwgZW51bV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY29uc3RhbnRzX2l0ZXI7CisgIGZvciAoY29uc3RhbnRzX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY29uc3RhbnRzX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NvbnN0YW50c19pdGVyKSB7CisgICAgdF9lbnVtX3ZhbHVlKiB2YWwgPSAoKmNvbnN0YW50c19pdGVyKTsKKyAgICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB2YWwpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8IHJ1c3RfZW51bV92YXJpYW50X25hbWUodmFsLT5nZXRfbmFtZSgpKQorICAgICAgPDwgIiA9ICIKKyAgICAgIDw8IHZhbC0+Z2V0X3ZhbHVlKCkKKyAgICAgIDw8ICIsIgorICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9lbnVtX2ltcGwoY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpIHsKKyAgZl9nZW5fIDw8ICJpbXBsICIgPDwgZW51bV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIHdyaXRlX3RvX291dF9wcm90b2NvbCgmc2VsZiwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2kzMigqc2VsZiBhcyBpMzIpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIHJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgZW51bV9uYW1lIDw8ICI+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZW51bV92YWx1ZSA9IGlfcHJvdC5yZWFkX2kzMigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBlbnVtX25hbWUgPDwgIjo6dHJ5X2Zyb20oZW51bV92YWx1ZSkiOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfZW51bV9jb252ZXJzaW9uKHRfZW51bSogdGVudW0sIGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKSB7CisgIGZfZ2VuXyA8PCAiaW1wbCBUcnlGcm9tPGkzMj4gZm9yICIgPDwgZW51bV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0eXBlIEVyciA9IHRocmlmdDo6RXJyb3I7IjsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIHRyeV9mcm9tKGk6IGkzMikgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycj4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtYXRjaCBpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNvbnN0YW50c19pdGVyOworICBmb3IgKGNvbnN0YW50c19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNvbnN0YW50c19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjb25zdGFudHNfaXRlcikgeworICAgIHRfZW51bV92YWx1ZSogdmFsID0gKCpjb25zdGFudHNfaXRlcik7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgdmFsLT5nZXRfdmFsdWUoKQorICAgICAgPDwgIiA9PiBPaygiIDw8IGVudW1fbmFtZSA8PCAiOjoiIDw8IHJ1c3RfZW51bV92YXJpYW50X25hbWUodmFsLT5nZXRfbmFtZSgpKSA8PCAiKSwiCisgICAgICA8PCBlbmRsOworICB9CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXyA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcigKKyAgICAiUHJvdG9jb2wiLAorICAgICJQcm90b2NvbEVycm9yIiwKKyAgICAiUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhIiwKKyAgICAiZm9ybWF0IShcImNhbm5vdCBjb252ZXJ0IGVudW0gY29uc3RhbnQge30gdG8gIiArIGVudW1fbmFtZSArICJcIiwgaSkiCisgICk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3RydWN0cywgVW5pb25zIGFuZCBFeGNlcHRpb25zCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIHJlbmRlcl9zdHJ1Y3QocnVzdF9zdHJ1Y3RfbmFtZSh0eGNlcHRpb24pLCB0eGNlcHRpb24sIHRfcnNfZ2VuZXJhdG9yOjpUX0VYQ0VQVElPTik7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIHJlbmRlcl91bmlvbih0c3RydWN0KTsKKyAgfSBlbHNlIGlmICh0c3RydWN0LT5pc19zdHJ1Y3QoKSkgeworICAgIHJlbmRlcl9zdHJ1Y3QocnVzdF9zdHJ1Y3RfbmFtZSh0c3RydWN0KSwgdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OlRfUkVHVUxBUik7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBzdHJ1Y3QgZm9yIGV4Y2VwdGlvbiI7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdCgKKyAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgcmVuZGVyX3R5cGVfY29tbWVudChzdHJ1Y3RfbmFtZSk7CisgIHJlbmRlcl9zdHJ1Y3RfZGVmaW5pdGlvbihzdHJ1Y3RfbmFtZSwgdHN0cnVjdCwgc3RydWN0X3R5cGUpOworICByZW5kZXJfc3RydWN0X2ltcGwoc3RydWN0X25hbWUsIHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKyAgaWYgKHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX1JFR1VMQVIgfHwgc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfRVhDRVBUSU9OKSB7CisgICAgcmVuZGVyX3N0cnVjdF9kZWZhdWx0X3RyYWl0X2ltcGwoc3RydWN0X25hbWUsIHRzdHJ1Y3QpOworICB9CisgIGlmIChzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9FWENFUFRJT04pIHsKKyAgICByZW5kZXJfZXhjZXB0aW9uX3N0cnVjdF9lcnJvcl90cmFpdF9pbXBscyhzdHJ1Y3RfbmFtZSwgdHN0cnVjdCk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9kZWZpbml0aW9uKAorICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0c3RydWN0KTsKKyAgZl9nZW5fIDw8ICIjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBIYXNoLCBPcmQsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldIiA8PCBlbmRsOworICBmX2dlbl8gPDwgdmlzaWJpbGl0eV9xdWFsaWZpZXIoc3RydWN0X3R5cGUpIDw8ICJzdHJ1Y3QgIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisKKyAgLy8gcmVuZGVyIHRoZSBtZW1iZXJzCisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIGluZGVudF91cCgpOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtYmVyc19pdGVyOworICAgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisKKyAgICAgIHN0cmluZyBydXN0X3R5cGUgPSB0b19ydXN0X3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICAgIHJ1c3RfdHlwZSA9IGlzX29wdGlvbmFsKG1lbWJlcl9yZXEpID8gIk9wdGlvbjwiICsgcnVzdF90eXBlICsgIj4iIDogcnVzdF90eXBlOworCisgICAgICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSBtZW1iZXIpOworICAgICAgZl9nZW5fCisgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgIDw8IHZpc2liaWxpdHlfcXVhbGlmaWVyKHN0cnVjdF90eXBlKQorICAgICAgICA8PCBydXN0X2ZpZWxkX25hbWUobWVtYmVyKSA8PCAiOiAiIDw8IHJ1c3RfdHlwZSA8PCAiLCIKKyAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2V4Y2VwdGlvbl9zdHJ1Y3RfZXJyb3JfdHJhaXRfaW1wbHMoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gZXJyb3I6OkVycm9yIHRyYWl0CisgIGZfZ2VuXyA8PCAiaW1wbCBFcnJvciBmb3IgIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIlwiIiA8PCAicmVtb3RlIHNlcnZpY2UgdGhyZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIiIgPDwgZW5kbDsgLy8gdXNlICpvcmlnaW5hbCogbmFtZQorICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gY29udmVydDo6RnJvbSB0cmFpdAorICBmX2dlbl8gPDwgImltcGwgRnJvbTwiIDw8IHN0cnVjdF9uYW1lIDw8ICI+IGZvciB0aHJpZnQ6OkVycm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIGZyb20oZTogIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiKSAtPiBTZWxmIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInRocmlmdDo6RXJyb3I6OlVzZXIoQm94OjpuZXcoZSkpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gZm10OjpEaXNwbGF5IHRyYWl0CisgIGZfZ2VuXyA8PCAiaW1wbCBEaXNwbGF5IGZvciAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5kZXNjcmlwdGlvbigpLmZtdChmKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2RlZmF1bHRfdHJhaXRfaW1wbChjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBib29sIGhhc19yZXF1aXJlZF9maWVsZCA9IGZhbHNlOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKm1lbWJlcnNfaXRlcjsKKyAgICBpZiAoIWlzX29wdGlvbmFsKG1lbWJlci0+Z2V0X3JlcSgpKSkgeworICAgICAgaGFzX3JlcXVpcmVkX2ZpZWxkID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChoYXNfcmVxdWlyZWRfZmllbGQpIHsKKyAgICByZXR1cm47CisgIH0KKworICBmX2dlbl8gPDwgImltcGwgRGVmYXVsdCBmb3IgIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIGRlZmF1bHQoKSAtPiBTZWxmIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X25hbWUgPDwgInt9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdHJ1Y3RfbmFtZSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkICptZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUocnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgb3B0X2luX3JlcV9vdXRfdmFsdWUobWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3RfaW1wbCgKKyAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgZl9nZW5fIDw8ICJpbXBsICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfUkVHVUxBUiB8fCBzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9FWENFUFRJT04pIHsKKyAgICByZW5kZXJfc3RydWN0X2NvbnN0cnVjdG9yKHN0cnVjdF9uYW1lLCB0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisgIH0KKworICByZW5kZXJfc3RydWN0X3N5bmNfcmVhZChzdHJ1Y3RfbmFtZSwgdHN0cnVjdCwgc3RydWN0X3R5cGUpOworICByZW5kZXJfc3RydWN0X3N5bmNfd3JpdGUodHN0cnVjdCwgc3RydWN0X3R5cGUpOworCisgIGlmIChzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9SRVNVTFQpIHsKKyAgICByZW5kZXJfcmVzdWx0X3N0cnVjdF90b19yZXN1bHRfbWV0aG9kKHRzdHJ1Y3QpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9jb25zdHJ1Y3RvcigKKyAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisKKyAgLy8gYnVpbGQgdGhlIGNvbnZlbmllbmNlIHR5cGUgcGFyYW1ldGVycyB0aGF0IGFsbG93cyB1cyB0byBwYXNzIHVud3JhcHBlZCB2YWx1ZXMgdG8gYSBjb25zdHJ1Y3RvciBhbmQKKyAgLy8gaGF2ZSB0aGVtIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIGludG8gT3B0aW9uPHZhbHVlPgorICBib29sIGZpcnN0X2FyZyA9IHRydWU7CisKKyAgb3N0cmluZ3N0cmVhbSBnZW5lcmljX3R5cGVfcGFyYW1ldGVyczsKKyAgb3N0cmluZ3N0cmVhbSBnZW5lcmljX3R5cGVfcXVhbGlmaWVyczsKKyAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworCisgICAgaWYgKGlzX29wdGlvbmFsKG1lbWJlcl9yZXEpKSB7CisgICAgICBpZiAoZmlyc3RfYXJnKSB7CisgICAgICAgIGZpcnN0X2FyZyA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuZXJpY190eXBlX3BhcmFtZXRlcnMgPDwgIiwgIjsKKyAgICAgICAgZ2VuZXJpY190eXBlX3F1YWxpZmllcnMgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGdlbmVyaWNfdHlwZV9wYXJhbWV0ZXJzIDw8ICJGIiA8PCBtZW1iZXItPmdldF9rZXkoKTsKKyAgICAgIGdlbmVyaWNfdHlwZV9xdWFsaWZpZXJzIDw8ICJGIiA8PCBtZW1iZXItPmdldF9rZXkoKSA8PCAiOiBJbnRvPE9wdGlvbjwiIDw8IHRvX3J1c3RfdHlwZShtZW1iZXItPmdldF90eXBlKCkpIDw8ICI+PiI7CisgICAgfQorICB9CisKKyAgc3RyaW5nIHR5cGVfcGFyYW1ldGVyX3N0cmluZyA9IGdlbmVyaWNfdHlwZV9wYXJhbWV0ZXJzLnN0cigpOworICBpZiAodHlwZV9wYXJhbWV0ZXJfc3RyaW5nLmxlbmd0aCgpICE9IDApIHsKKyAgICB0eXBlX3BhcmFtZXRlcl9zdHJpbmcgPSAiPCIgKyB0eXBlX3BhcmFtZXRlcl9zdHJpbmcgKyAiPiI7CisgIH0KKworICBzdHJpbmcgdHlwZV9xdWFsaWZpZXJfc3RyaW5nID0gZ2VuZXJpY190eXBlX3F1YWxpZmllcnMuc3RyKCk7CisgIGlmICh0eXBlX3F1YWxpZmllcl9zdHJpbmcubGVuZ3RoKCkgIT0gMCkgeworICAgIHR5cGVfcXVhbGlmaWVyX3N0cmluZyA9ICJ3aGVyZSAiICsgdHlwZV9xdWFsaWZpZXJfc3RyaW5nICsgIiAiOworICB9CisKKyAgLy8gbm93IGJ1aWxkIHRoZSBhY3R1YWwgY29uc3RydWN0b3IgYXJnIGxpc3QKKyAgLy8gd2hlbiB3ZSdyZSBidWlsZGluZyB0aGlzIGxpc3Qgd2UgaGF2ZSB0byB1c2UgdGhlIHR5cGUgcGFyYW1ldGVycyBpbiBwbGFjZSBvZiB0aGUgYWN0dWFsIHR5cGUgbmFtZXMKKyAgLy8gaWYgbmVjZXNzYXJ5CisgIG9zdHJpbmdzdHJlYW0gYXJnczsKKyAgZmlyc3RfYXJnID0gdHJ1ZTsKKyAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworICAgIHN0cmluZyBtZW1iZXJfbmFtZShydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisKKyAgICBpZiAoZmlyc3RfYXJnKSB7CisgICAgICBmaXJzdF9hcmcgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgYXJncyA8PCAiLCAiOworICAgIH0KKworICAgIGlmIChpc19vcHRpb25hbChtZW1iZXJfcmVxKSkgeworICAgICAgYXJncyA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8ICJGIiA8PCBtZW1iZXItPmdldF9rZXkoKTsKKyAgICB9IGVsc2UgeworICAgICAgYXJncyA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8IHRvX3J1c3RfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworICAgIH0KKyAgfQorCisgIHN0cmluZyBhcmdfc3RyaW5nID0gYXJncy5zdHIoKTsKKworICBzdHJpbmcgdmlzaWJpbGl0eSh2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkpOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8IHZpc2liaWxpdHkKKyAgICA8PCAiZm4gbmV3IgorICAgIDw8IHR5cGVfcGFyYW1ldGVyX3N0cmluZworICAgIDw8ICIoIgorICAgIDw8IGFyZ19zdHJpbmcKKyAgICA8PCAiKSAtPiAiCisgICAgPDwgc3RydWN0X25hbWUKKyAgICA8PCAiICIKKyAgICA8PCB0eXBlX3F1YWxpZmllcl9zdHJpbmcKKyAgICA8PCAieyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobWVtYmVycy5zaXplKCkgPT0gMCkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHt9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKworICAgICAgaWYgKGlzX29wdGlvbmFsKG1lbWJlcl9yZXEpKSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8IG1lbWJlcl9uYW1lIDw8ICIuaW50bygpLCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8IG1lbWJlcl9uYW1lIDw8ICIsIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfcmVzdWx0X3N0cnVjdF90b19yZXN1bHRfbWV0aG9kKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIHdlIGRvbid0IHVzZSB0aGUgcnVzdCBzdHJ1Y3QgbmFtZSBpbiB0aGlzIG1ldGhvZCwganVzdCB0aGUgc2VydmljZSBjYWxsIG5hbWUKKyAgc3RyaW5nIHNlcnZpY2VfY2FsbF9uYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICAvLyBjaGVjayB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgYSByZXN1bHQKKyAgc2l6ZV90IGluZGV4ID0gc2VydmljZV9jYWxsX25hbWUuZmluZChSRVNVTFRfU1RSVUNUX1NVRkZJWCwgMCk7CisgIGlmIChpbmRleCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIHRocm93ICJyZXN1bHQgc3RydWN0ICIgKyBzZXJ2aWNlX2NhbGxfbmFtZSArICIgbWlzc2luZyByZXN1bHQgc3VmZml4IjsKKyAgfSBlbHNlIHsKKyAgICAgc2VydmljZV9jYWxsX25hbWUucmVwbGFjZShpbmRleCwgNiwgIiIpOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisKKyAgLy8gZmluZCBvdXQgd2hhdCB0aGUgY2FsbCdzIGV4cGVjdGVkIHJldHVybiB0eXBlIHdhcworICBzdHJpbmcgcnVzdF9yZXR1cm5fdHlwZSA9ICIoKSI7CisgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICBpZiAobWVtYmVyLT5nZXRfbmFtZSgpID09IFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFKSB7IC8vIGRvbid0IGhhdmUgdG8gY2hlY2sgc2FmZSBuYW1lIGhlcmUKKyAgICAgIHJ1c3RfcmV0dXJuX3R5cGUgPSB0b19ydXN0X3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIE5PVEU6IGlkZWFsbHkgSSB3b3VsZCBnZW5lcmF0ZSB0aGUgYnJhbmNoZXMgYW5kIHJlbmRlciB0aGVtIHNlcGFyYXRlbHkKKyAgLy8gSSB0cmllZCB0aGlzIGhvd2V2ZXIsIGFuZCB0aGUgcmVzdWx0aW5nIGNvZGUgd2FzIGhhcmRlciB0byB1bmRlcnN0YW5kCisgIC8vIG1haW50YWluaW5nIGEgcmVuZGVyZWQgYnJhbmNoIGNvdW50ICh3aGlsZSBhIGxpdHRsZSB1Z2x5KSBnb3QgbWUgdGhlCisgIC8vIHJlbmRlcmluZyBJIHdhbnRlZCB3aXRoIGNvZGUgdGhhdCB3YXMgcmVhc29uYWJseSB1bmRlcnN0YW5kYWJsZQorCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gb2tfb3Ioc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBydXN0X3JldHVybl90eXBlIDw8ICI+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGludCByZW5kZXJlZF9icmFuY2hfY291bnQgPSAwOworCisgIC8vIHJlbmRlciB0aGUgZXhjZXB0aW9uIGJyYW5jaGVzCisgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICBpZiAodGZpZWxkLT5nZXRfbmFtZSgpICE9IFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFKSB7IC8vIGRvbid0IGhhdmUgdG8gY2hlY2sgc2FmZSBuYW1lIGhlcmUKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lKCJzZWxmLiIgKyBydXN0X2ZpZWxkX25hbWUodGZpZWxkKSk7CisgICAgICBzdHJpbmcgYnJhbmNoX3N0YXRlbWVudCA9IHJlbmRlcmVkX2JyYW5jaF9jb3VudCA9PSAwID8gImlmIiA6ICJ9IGVsc2UgaWYiOworCisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgYnJhbmNoX3N0YXRlbWVudCA8PCAiICIgPDwgZmllbGRfbmFtZSA8PCAiLmlzX3NvbWUoKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIkVycih0aHJpZnQ6OkVycm9yOjpVc2VyKEJveDo6bmV3KCIgPDwgZmllbGRfbmFtZSA8PCAiLnVud3JhcCgpKSkpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgcmVuZGVyZWRfYnJhbmNoX2NvdW50Kys7CisgICAgfQorICB9CisKKyAgLy8gcmVuZGVyIHRoZSByZXR1cm4gdmFsdWUgYnJhbmNoZXMKKyAgaWYgKHJ1c3RfcmV0dXJuX3R5cGUgPT0gIigpIikgeworICAgIGlmIChyZW5kZXJlZF9icmFuY2hfY291bnQgPT0gMCkgeworICAgICAgLy8gd2UgaGF2ZSB0aGUgdW5pdCByZXR1cm4gYW5kIHRoaXMgc2VydmljZSBjYWxsIGhhcyBubyB1c2VyLWRlZmluZWQKKyAgICAgIC8vIGV4Y2VwdGlvbnMuIHRoaXMgbWVhbnMgdGhhdCB3ZSd2ZSBhIHRyaXZpYWwgcmV0dXJuIChoYXBwZW5zIHdpdGggb25ld2F5cykKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soKCkpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICAvLyB3ZSBoYXZlIHRoZSB1bml0IHJldHVybiwgYnV0IHRoZXJlIGFyZSB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucworICAgICAgLy8gaWYgd2UndmUgZ290dGVuIHRoaXMgZmFyIHRoZW4gd2UgaGF2ZSB0aGUgZGVmYXVsdCByZXR1cm4gKGkuZS4gY2FsbCBzdWNjZXNzZnVsKQorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPaygoKSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgYnJhbmNoX3N0YXRlbWVudCA9IHJlbmRlcmVkX2JyYW5jaF9jb3VudCA9PSAwID8gImlmIiA6ICJ9IGVsc2UgaWYiOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBicmFuY2hfc3RhdGVtZW50IDw8ICIgc2VsZi4iIDw8IFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFIDw8ICIuaXNfc29tZSgpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPayhzZWxmLiIgPDwgU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUgPDwgIi51bndyYXAoKSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIC8vIGlmIHdlIGhhdmVuJ3QgZm91bmQgYSB2YWxpZCByZXR1cm4gdmFsdWUgKm9yKiBhIHVzZXIgZXhjZXB0aW9uCisgICAgLy8gdGhlbiB3ZSdyZSBpbiB0cm91YmxlOyByZXR1cm4gYSBkZWZhdWx0IGVycm9yCisgICAgcmVuZGVyX3RocmlmdF9lcnJvcigKKyAgICAgICJBcHBsaWNhdGlvbiIsCisgICAgICAiQXBwbGljYXRpb25FcnJvciIsCisgICAgICAiQXBwbGljYXRpb25FcnJvcktpbmQ6Ok1pc3NpbmdSZXN1bHQiLAorICAgICAgIlwibm8gcmVzdWx0IHJlY2VpdmVkIGZvciAiICsgc2VydmljZV9jYWxsX25hbWUgKyAiXCIiCisgICAgKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyB1bmlvbl9uYW1lKHJ1c3Rfc3RydWN0X25hbWUodHN0cnVjdCkpOworICByZW5kZXJfdHlwZV9jb21tZW50KHVuaW9uX25hbWUpOworICByZW5kZXJfdW5pb25fZGVmaW5pdGlvbih1bmlvbl9uYW1lLCB0c3RydWN0KTsKKyAgcmVuZGVyX3VuaW9uX2ltcGwodW5pb25fbmFtZSwgdHN0cnVjdCk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl91bmlvbl9kZWZpbml0aW9uKGNvbnN0IHN0cmluZyYgdW5pb25fbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBpZiAobWVtYmVycy5lbXB0eSgpKSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBydXN0IGVudW0gd2l0aCAwIG1lbWJlcnMiOyAvLyBtYXkgYmUgdmFsaWQgdGhyaWZ0LCBidXQgaXQncyBpbnZhbGlkIHJ1c3QKKyAgfQorCisgIGZfZ2VuXyA8PCAiI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgSGFzaCwgT3JkLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJwdWIgZW51bSAiIDw8IHVuaW9uX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJfaXRlcjsKKyAgZm9yKG1lbWJlcl9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcl9pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJfaXRlcik7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgcnVzdF91bmlvbl9maWVsZF9uYW1lKHRmaWVsZCkKKyAgICAgIDw8ICIoIiA8PCB0b19ydXN0X3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiKSwiCisgICAgICA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3VuaW9uX2ltcGwoY29uc3Qgc3RyaW5nJiB1bmlvbl9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBmX2dlbl8gPDwgImltcGwgIiA8PCB1bmlvbl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgcmVuZGVyX3VuaW9uX3N5bmNfcmVhZCh1bmlvbl9uYW1lLCB0c3RydWN0KTsKKyAgcmVuZGVyX3VuaW9uX3N5bmNfd3JpdGUodW5pb25fbmFtZSwgdHN0cnVjdCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFN5bmMgU3RydWN0IFdyaXRlCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X3N5bmNfd3JpdGUoCisgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsCisgICAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8IHZpc2liaWxpdHlfcXVhbGlmaWVyKHN0cnVjdF90eXBlKQorICAgIDw8ICJmbiB3cml0ZV90b19vdXRfcHJvdG9jb2woJnNlbGYsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIHdyaXRlIHN0cnVjdCBoZWFkZXIgdG8gb3V0cHV0IHByb3RvY29sCisgIC8vIG5vdGU6IHVzZSB0aGUgKm9yaWdpbmFsKiBzdHJ1Y3QgbmFtZSBoZXJlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHN0cnVjdF9pZGVudCA9IFRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoXCIiICsgdHN0cnVjdC0+Z2V0X25hbWUoKSArICJcIik7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJnN0cnVjdF9pZGVudCk/OyIgPDwgZW5kbDsKKworICAvLyB3cml0ZSBzdHJ1Y3QgbWVtYmVycyB0byBvdXRwdXQgcHJvdG9jb2wKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtYmVyc19pdGVyOworICAgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisgICAgICBzdHJpbmcgbWVtYmVyX3Zhcigic2VsZi4iICsgcnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworICAgICAgcmVuZGVyX3N0cnVjdF9maWVsZF9zeW5jX3dyaXRlKG1lbWJlcl92YXIsIGZhbHNlLCBtZW1iZXIsIG1lbWJlcl9yZXEpOworICAgIH0KKyAgfQorCisgIC8vIHdyaXRlIHN0cnVjdCBmb290ZXIgdG8gb3V0cHV0IHByb3RvY29sCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb25fc3luY193cml0ZShjb25zdCBzdHJpbmcgJnVuaW9uX25hbWUsIHRfc3RydWN0ICp0c3RydWN0KSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiB3cml0ZV90b19vdXRfcHJvdG9jb2woJnNlbGYsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIHdyaXRlIHN0cnVjdCBoZWFkZXIgdG8gb3V0cHV0IHByb3RvY29sCisgIC8vIG5vdGU6IHVzZSB0aGUgKm9yaWdpbmFsKiBzdHJ1Y3QgbmFtZSBoZXJlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHN0cnVjdF9pZGVudCA9IFRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoXCIiICsgdHN0cnVjdC0+Z2V0X25hbWUoKSArICJcIik7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJnN0cnVjdF9pZGVudCk/OyIgPDwgZW5kbDsKKworICAvLyB3cml0ZSB0aGUgZW51bSBmaWVsZCB0byB0aGUgb3V0cHV0IHByb3RvY29sCisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggKnNlbGYgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgICAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gdF9maWVsZDo6VF9SRVFVSVJFRDsKKyAgICAgIHRfdHlwZSogdHR5cGUgPSBtZW1iZXItPmdldF90eXBlKCk7CisgICAgICBzdHJpbmcgbWF0Y2hfdmFyKCh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR0eXBlLT5pc19zdHJpbmcoKSkgPyAiZiIgOiAicmVmIGYiKTsKKyAgICAgIGZfZ2VuXworICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICA8PCB1bmlvbl9uYW1lIDw8ICI6OiIgPDwgcnVzdF91bmlvbl9maWVsZF9uYW1lKG1lbWJlcikKKyAgICAgICAgPDwgIigiIDw8IG1hdGNoX3ZhciA8PCAiKSA9PiB7IgorICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICByZW5kZXJfc3RydWN0X2ZpZWxkX3N5bmNfd3JpdGUoImYiLCB0cnVlLCBtZW1iZXIsIG1lbWJlcl9yZXEpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gd3JpdGUgc3RydWN0IGZvb3RlciB0byBvdXRwdXQgcHJvdG9jb2wKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3RfZmllbGRfc3luY193cml0ZSgKKyAgY29uc3Qgc3RyaW5nICZmaWVsZF92YXIsCisgIGJvb2wgZmllbGRfdmFyX2lzX3JlZiwKKyAgdF9maWVsZCAqdGZpZWxkLAorICB0X2ZpZWxkOjplX3JlcSByZXEKKykgeworICB0X3R5cGUqIGZpZWxkX3R5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIHRfdHlwZSogYWN0dWFsX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkX3R5cGUpOworCisgIG9zdHJpbmdzdHJlYW0gZmllbGRfc3RyZWFtOworICBmaWVsZF9zdHJlYW0KKyAgICA8PCAiVEZpZWxkSWRlbnRpZmllcjo6bmV3KCIKKyAgICA8PCAiXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCIiIDw8ICIsICIgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgIDw8IHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKGZpZWxkX3R5cGUpIDw8ICIsICIKKyAgICA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiKSI7CisgIHN0cmluZyBmaWVsZF9pZGVudF9zdHJpbmcgPSBmaWVsZF9zdHJlYW0uc3RyKCk7CisKKyAgaWYgKGlzX29wdGlvbmFsKHJlcSkpIHsKKyAgICBzdHJpbmcgbGV0X3ZhcigoYWN0dWFsX3R5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICFhY3R1YWxfdHlwZS0+aXNfc3RyaW5nKCkpID8gImZsZF92YXIiIDogInJlZiBmbGRfdmFyIik7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiBsZXQgU29tZSgiIDw8IGxldF92YXIgPDwgIikgPSAiIDw8IGZpZWxkX3ZhciA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJiIgPDwgZmllbGRfaWRlbnRfc3RyaW5nIDw8ICIpPzsiIDw8IGVuZGw7CisgICAgcmVuZGVyX3R5cGVfc3luY193cml0ZSgiZmxkX3ZhciIsIHRydWUsIGZpZWxkX3R5cGUpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2VuZCgpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIoKSIgPDwgZW5kbDsgLy8gRklYTUU6IHJlbW92ZSB0aGlzIGV4dHJhbmVvdXMgJygpJworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsgLy8gRklYTUU6IHJlbW92ZSBlbHNlIGJyYW5jaAorICAgIGluZGVudF91cCgpOworICAgIC8qIEZJWE1FOiByZXRoaW5rIGhvdyBJIGRlYWwgd2l0aCBPUFRfSU5fUkVRX09VVAorICAgIGlmIChyZXEgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZmllbGRfaWRlbnQgPSAiIDw8IGZpZWxkX2lkZW50X3N0cmluZyA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudCk/OyIgPDwgZW5kbDsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2VuZCgpPzsiIDw8IGVuZGw7CisgICAgfSovCisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmIiA8PCBmaWVsZF9pZGVudF9zdHJpbmcgPDwgIik/OyIgPDwgZW5kbDsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKGZpZWxkX3ZhciwgZmllbGRfdmFyX2lzX3JlZiwgdGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9lbmQoKT87IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl90eXBlX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZ0eXBlX3ZhciwgYm9vbCB0eXBlX3Zhcl9pc19yZWYsIHRfdHlwZSAqdHR5cGUpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICBzd2l0Y2ggKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY2Fubm90IHdyaXRlIGZpZWxkIG9mIHR5cGUgVFlQRV9WT0lEIHRvIG91dHB1dCBwcm90b2NvbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6IHsKKyAgICAgIHN0cmluZyByZWYodHlwZV92YXJfaXNfcmVmID8gIiIgOiAiJiIpOworICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2J5dGVzKCIgKyByZWYgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9zdHJpbmcoIiArIHJlZiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfYm9vbCgiICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9pOCgiICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTE2KCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9pMzIoIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2k2NCgiICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZG91YmxlKCIgKyB0eXBlX3ZhciArICIuaW50bygpKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdF90eXBlZGVmKiB0dHlwZWRlZiA9ICh0X3R5cGVkZWYqKSB0dHlwZTsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKHR5cGVfdmFyLCB0eXBlX3Zhcl9pc19yZWYsIHR0eXBlZGVmLT5nZXRfdHlwZSgpKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgdHlwZV92YXIgKyAiLndyaXRlX3RvX291dF9wcm90b2NvbChvX3Byb3QpPzsiIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJlbmRlcl9tYXBfc3luY193cml0ZSh0eXBlX3ZhciwgdHlwZV92YXJfaXNfcmVmLCAodF9tYXAgKikgdHR5cGUpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZW5kZXJfc2V0X3N5bmNfd3JpdGUodHlwZV92YXIsIHR5cGVfdmFyX2lzX3JlZiwgKHRfc2V0ICopIHR0eXBlKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJlbmRlcl9saXN0X3N5bmNfd3JpdGUodHlwZV92YXIsIHR5cGVfdmFyX2lzX3JlZiwgKHRfbGlzdCAqKSB0dHlwZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgdGhyb3cgImNhbm5vdCB3cml0ZSB1bnN1cHBvcnRlZCB0eXBlICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2xpc3Rfc3luY193cml0ZShjb25zdCBzdHJpbmcgJmxpc3RfdmFyLCBib29sIGxpc3RfdmFyX2lzX3JlZiwgdF9saXN0ICp0bGlzdCkgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAib19wcm90LndyaXRlX2xpc3RfYmVnaW4oIgorICAgIDw8ICImVExpc3RJZGVudGlmaWVyOjpuZXcoIgorICAgIDw8IHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKGVsZW1fdHlwZSkgPDwgIiwgIgorICAgIDw8IGxpc3RfdmFyIDw8ICIubGVuKCkgYXMgaTMyIiA8PCAiKSIKKyAgICA8PCAiKT87IgorICAgIDw8IGVuZGw7CisKKyAgc3RyaW5nIHJlZihsaXN0X3Zhcl9pc19yZWYgPyAiIiA6ICImIik7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIGUgaW4gIiA8PCByZWYgPDwgbGlzdF92YXIgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3R5cGVfc3luY193cml0ZShzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKGVsZW1fdHlwZSwgImUiKSwgdHJ1ZSwgZWxlbV90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbGlzdF9lbmQoKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zZXRfc3luY193cml0ZShjb25zdCBzdHJpbmcgJnNldF92YXIsIGJvb2wgc2V0X3Zhcl9pc19yZWYsIHRfc2V0ICp0c2V0KSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgIm9fcHJvdC53cml0ZV9zZXRfYmVnaW4oIgorICAgIDw8ICImVFNldElkZW50aWZpZXI6Om5ldygiCisgICAgPDwgdG9fcnVzdF9maWVsZF90eXBlX2VudW0oZWxlbV90eXBlKSA8PCAiLCAiCisgICAgPDwgc2V0X3ZhciA8PCAiLmxlbigpIGFzIGkzMiIgPDwgIikiCisgICAgPDwgIik/OyIKKyAgICA8PCBlbmRsOworCisgIHN0cmluZyByZWYoc2V0X3Zhcl9pc19yZWYgPyAiIiA6ICImIik7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIGUgaW4gIiA8PCByZWYgPDwgc2V0X3ZhciA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUoZWxlbV90eXBlLCAiZSIpLCB0cnVlLCBlbGVtX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9zZXRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfbWFwX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZtYXBfdmFyLCBib29sIG1hcF92YXJfaXNfcmVmLCB0X21hcCAqdG1hcCkgeworICB0X3R5cGUqIGtleV90eXBlID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7CisgIHRfdHlwZSogdmFsX3R5cGUgPSB0bWFwLT5nZXRfdmFsX3R5cGUoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCIKKyAgICA8PCAiJlRNYXBJZGVudGlmaWVyOjpuZXcoIgorICAgIDw8IHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKGtleV90eXBlKSA8PCAiLCAiCisgICAgPDwgdG9fcnVzdF9maWVsZF90eXBlX2VudW0odmFsX3R5cGUpIDw8ICIsICIKKyAgICA8PCBtYXBfdmFyIDw8ICIubGVuKCkgYXMgaTMyKSIKKyAgICA8PCAiKT87IgorICAgIDw8IGVuZGw7CisKKyAgc3RyaW5nIHJlZihtYXBfdmFyX2lzX3JlZiA/ICIiIDogIiYiKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgKGssIHYpIGluICIgPDwgcmVmIDw8IG1hcF92YXIgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3R5cGVfc3luY193cml0ZShzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKGtleV90eXBlLCAiayIpLCB0cnVlLCBrZXlfdHlwZSk7CisgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoc3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZSh2YWxfdHlwZSwgInYiKSwgdHJ1ZSwgdmFsX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tYXBfZW5kKCk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUodF90eXBlKiB0dHlwZSwgY29uc3Qgc3RyaW5nJiBiYXNlX3ZhcikgeworICBib29sIHR5cGVfbmVlZHNfZGVyZWYgPSBuZWVkc19kZXJlZl9vbl9jb250YWluZXJfd3JpdGUodHR5cGUpOworICBib29sIHR5cGVfaXNfZG91YmxlID0gaXNfZG91YmxlKHR0eXBlKTsKKworICBzdHJpbmcgd3JpdGVfdmFyaWFibGU7CisKKyAgaWYgKHR5cGVfaXNfZG91YmxlICYmIHR5cGVfbmVlZHNfZGVyZWYpIHsKKyAgICB3cml0ZV92YXJpYWJsZSA9ICIoKiIgKyBiYXNlX3ZhciArICIpIjsKKyAgfSBlbHNlIGlmICh0eXBlX25lZWRzX2RlcmVmKSB7CisgICAgd3JpdGVfdmFyaWFibGUgPSAiKiIgKyBiYXNlX3ZhcjsKKyAgfSBlbHNlIHsKKyAgICB3cml0ZV92YXJpYWJsZSA9IGJhc2VfdmFyOworICB9CisKKyAgcmV0dXJuIHdyaXRlX3ZhcmlhYmxlOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjpuZWVkc19kZXJlZl9vbl9jb250YWluZXJfd3JpdGUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICByZXR1cm4gdHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0dHlwZS0+aXNfc3RyaW5nKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTeW5jIFN0cnVjdCBSZWFkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X3N5bmNfcmVhZCgKKyAgICBjb25zdCBzdHJpbmcgJnN0cnVjdF9uYW1lLAorICAgIHRfc3RydWN0ICp0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgdmlzaWJpbGl0eV9xdWFsaWZpZXIoc3RydWN0X3R5cGUpCisgICAgPDwgImZuIHJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgc3RydWN0X25hbWUgPDwgIj4geyIKKyAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCk/OyIgPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGVtcG9yYXJ5IHZhcmlhYmxlczogb25lIGZvciBlYWNoIGZpZWxkIGluIHRoZSBzdHJ1Y3QKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgbXV0ICIgPDwgc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZShtZW1iZXIpCisgICAgICA8PCAiOiBPcHRpb248IiA8PCB0b19ydXN0X3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiPiA9ICI7CisgICAgICBpZiAobWVtYmVyX3JlcSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgIGZfZ2VuXyA8PCBvcHRfaW5fcmVxX291dF92YWx1ZShtZW1iZXItPmdldF90eXBlKCkpIDw8ICI7IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXyA8PCAiTm9uZTsiOworICAgICAgfQorICAgICAgZl9nZW5fIDw8IGVuZGw7CisgIH0KKworICAvLyBub3cgbG9vcCB0aHJvdWdoIHRoZSBmaWVsZHMgd2UndmUgcmVjZWl2ZWQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsb29wIHsiIDw8IGVuZGw7IC8vIHN0YXJ0IGxvb3AKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gYnJlYWsgb3V0IGlmIHlvdSd2ZSBmb3VuZCB0aGUgU3RvcCBmaWVsZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBmaWVsZF9pZGVudCA9IGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiBmaWVsZF9pZGVudC5maWVsZF90eXBlID09IFRUeXBlOjpTdG9wIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIG5vdyByZWFkIGFsbCB0aGUgZmllbGRzIGZvdW5kCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkID0gZmllbGRfaWQoJmZpZWxkX2lkZW50KT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1hdGNoIGZpZWxkX2lkIHsiIDw8IGVuZGw7IC8vIHN0YXJ0IG1hdGNoCisgIGluZGVudF91cCgpOworCisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICIgPT4geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3JlYWQoInZhbCIsIHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUodGZpZWxkKSA8PCAiID0gU29tZSh2YWwpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgIH0KKworICAvLyBkZWZhdWx0IGNhc2UgKHNraXAgZmllbGRzKQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl8gPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnNraXAoZmllbGRfaWRlbnQuZmllbGRfdHlwZSk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOyAvLyBmaW5pc2ggbWF0Y2gKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9maWVsZF9lbmQoKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7IC8vIGZpbmlzaCBsb29wCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpPzsiIDw8IGVuZGw7IC8vIHJlYWQgbWVzc2FnZSBmb290ZXIgZnJvbSB0aGUgd2lyZQorCisgIC8vIHZlcmlmeSB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgZXhpc3QKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICB0X2ZpZWxkOjplX3JlcSByZXEgPSBhY3R1YWxfZmllbGRfcmVxKHRmaWVsZCwgc3RydWN0X3R5cGUpOworICAgIGlmICghaXNfb3B0aW9uYWwocmVxKSkgeworICAgICAgZl9nZW5fCisgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ2ZXJpZnlfcmVxdWlyZWRfZmllbGRfZXhpc3RzKCIKKyAgICAgICAgPDwgIlwiIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiLiIgPDwgcnVzdF9maWVsZF9uYW1lKHRmaWVsZCkgPDwgIlwiIgorICAgICAgICA8PCAiLCAiCisgICAgICAgIDw8ICImIiA8PCBzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKHRmaWVsZCkKKyAgICAgICAgPDwgIik/OyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBjb25zdHJ1Y3QgdGhlIHN0cnVjdAorICBpZiAobWVtYmVycy5zaXplKCkgPT0gMCkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJldCA9ICIgPDwgc3RydWN0X25hbWUgPDwgIiB7fTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmV0ID0gIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICB0X2ZpZWxkOjplX3JlcSByZXEgPSBhY3R1YWxfZmllbGRfcmVxKHRmaWVsZCwgc3RydWN0X3R5cGUpOworICAgICAgc3RyaW5nIGZpZWxkX25hbWUocnVzdF9maWVsZF9uYW1lKHRmaWVsZCkpOworICAgICAgc3RyaW5nIGZpZWxkX2tleSA9IHN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUodGZpZWxkKTsKKyAgICAgIGlmIChpc19vcHRpb25hbChyZXEpKSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBmaWVsZF9uYW1lIDw8ICI6ICIgPDwgZmllbGRfa2V5IDw8ICIsIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fCisgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgPDwgIjogIgorICAgICAgICAgIDw8IGZpZWxkX2tleQorICAgICAgICAgIDw8ICIuZXhwZWN0KFwiYXV0by1nZW5lcmF0ZWQgY29kZSBzaG91bGQgaGF2ZSBjaGVja2VkIGZvciBwcmVzZW5jZSBvZiByZXF1aXJlZCBmaWVsZHNcIikiCisgICAgICAgICAgPDwgIiwiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgIH0KKworICAvLyByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIHZhbHVlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2socmV0KSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl91bmlvbl9zeW5jX3JlYWQoY29uc3Qgc3RyaW5nICZ1bmlvbl9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCkgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gcmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCB1bmlvbl9uYW1lIDw8ICI+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gY3JlYXRlIHRlbXBvcmFyeSB2YXJpYWJsZXMgdG8gaG9sZCB0aGUKKyAgLy8gY29tcGxldGVkIHVuaW9uIGFzIHdlbGwgYXMgYSBjb3VudCBvZiBmaWVsZHMgcmVhZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtdXQgcmV0OiBPcHRpb248IiA8PCB1bmlvbl9uYW1lIDw8ICI+ID0gTm9uZTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG11dCByZWNlaXZlZF9maWVsZF9jb3VudCA9IDA7IiA8PCBlbmRsOworCisgIC8vIHJlYWQgdGhlIHN0cnVjdCBwcmVhbWJsZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpPzsiIDw8IGVuZGw7CisKKyAgLy8gbm93IGxvb3AgdGhyb3VnaCB0aGUgZmllbGRzIHdlJ3ZlIHJlY2VpdmVkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibG9vcCB7IiA8PCBlbmRsOyAvLyBzdGFydCBsb29wCisgIGluZGVudF91cCgpOworCisgIC8vIGJyZWFrIG91dCBpZiB5b3UndmUgZm91bmQgdGhlIFN0b3AgZmllbGQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZmllbGRfaWRlbnQgPSBpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgZmllbGRfaWRlbnQuZmllbGRfdHlwZSA9PSBUVHlwZTo6U3RvcCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBub3cgcmVhZCBhbGwgdGhlIGZpZWxkcyBmb3VuZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBmaWVsZF9pZCA9IGZpZWxkX2lkKCZmaWVsZF9pZGVudCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtYXRjaCBmaWVsZF9pZCB7IiA8PCBlbmRsOyAvLyBzdGFydCBtYXRjaAorICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBtZW1iZXItPmdldF9rZXkoKSA8PCAiID0+IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgcmVuZGVyX3R5cGVfc3luY19yZWFkKCJ2YWwiLCBtZW1iZXItPmdldF90eXBlKCkpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgcmV0LmlzX25vbmUoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJyZXQgPSBTb21lKCIgPDwgdW5pb25fbmFtZSA8PCAiOjoiIDw8IHJ1c3RfdW5pb25fZmllbGRfbmFtZShtZW1iZXIpIDw8ICIodmFsKSk7IgorICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJlY2VpdmVkX2ZpZWxkX2NvdW50ICs9IDE7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGRlZmF1bHQgY2FzZSAoc2tpcCBmaWVsZHMpCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXyA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3Quc2tpcChmaWVsZF9pZGVudC5maWVsZF90eXBlKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJlY2VpdmVkX2ZpZWxkX2NvdW50ICs9IDE7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7IC8vIGZpbmlzaCBtYXRjaAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsgLy8gZmluaXNoIGxvb3AKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCk/OyIgPDwgZW5kbDsgLy8gZmluaXNoIHJlYWRpbmcgbWVzc2FnZSBmcm9tIHdpcmUKKworICAvLyByZXR1cm4gdGhlIHZhbHVlIG9yIGFuIGVycm9yCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgcmVjZWl2ZWRfZmllbGRfY291bnQgPT0gMCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcigKKyAgICAiUHJvdG9jb2wiLAorICAgICJQcm90b2NvbEVycm9yIiwKKyAgICAiUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhIiwKKyAgICAiXCJyZWNlaXZlZCBlbXB0eSB1bmlvbiBmcm9tIHJlbW90ZSAiICsgdW5pb25fbmFtZSArICJcIiIKKyAgKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgcmVjZWl2ZWRfZmllbGRfY291bnQgPiAxIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICJQcm90b2NvbCIsCisgICAgIlByb3RvY29sRXJyb3IiLAorICAgICJQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEiLAorICAgICJcInJlY2VpdmVkIG11bHRpcGxlIGZpZWxkcyBmb3IgdW5pb24gZnJvbSByZW1vdGUgIiArIHVuaW9uX25hbWUgKyAiXCIiCisgICk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKHJldC5leHBlY3QoXCJyZXR1cm4gdmFsdWUgc2hvdWxkIGhhdmUgYmVlbiBjb25zdHJ1Y3RlZFwiKSkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8vIENvbnN0cnVjdCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhbGwgc3VwcG9ydGVkIHR5cGVzIGZyb20gdGhlIHdpcmUuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV9zeW5jX3JlYWQoY29uc3Qgc3RyaW5nICZ0eXBlX3ZhciwgdF90eXBlICp0dHlwZSwgYm9vbCBpc19ib3hlZCkgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR0eXBlOworICAgIHN3aXRjaCAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjYW5ub3QgcmVhZCBmaWVsZCBvZiB0eXBlIFRZUEVfVk9JRCBmcm9tIGlucHV0IHByb3RvY29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9ieXRlcygpPzsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9zdHJpbmcoKT87IiA8PCBlbmRsOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2Jvb2woKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9pOCgpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9pMTYoKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfaTMyKCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2k2NCgpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBPcmRlcmVkRmxvYXQ6OmZyb20oaV9wcm90LnJlYWRfZG91YmxlKCk/KTsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAvLyBGSVhNRTogbm90IGEgZmFuIG9mIHNlcGFyYXRlIGBpc19ib3hlZGAgcGFyYW1ldGVyCisgICAgLy8gVGhpcyBpcyBwcm9ibGVtYXRpYyBiZWNhdXNlIGl0J3MgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLCBhbmQgb25seSBjb21lcworICAgIC8vIGludG8gcGxheSBvbmNlLiBUaGUgY29yZSBpc3N1ZSBpcyB0aGF0IEkgbG9zZSBhbiBpbXBvcnRhbnQgcGllY2Ugb2YgdHlwZQorICAgIC8vIGluZm9ybWF0aW9uICh3aGV0aGVyIHRoZSB0eXBlIGlzIGEgZndkIHJlZikgYnkgdW53cmFwcGluZyB0aGUgdHlwZWRlZidkCisgICAgLy8gdHlwZSBhbmQgbWFraW5nIHRoZSByZWN1cnNpdmUgY2FsbCB1c2luZyBpdC4gSSBjYW4ndCBtb2RpZnkgb3Igd3JhcCB0aGUKKyAgICAvLyBnZW5lcmF0ZWQgc3RyaW5nIGFmdGVyIHRoZSBmYWN0IGJlY2F1c2UgaXQncyB3cml0dGVuIGRpcmVjdGx5IGludG8gdGhlIGZpbGUsCisgICAgLy8gc28gSSBoYXZlIHRvIHBhc3MgdGhpcyBwYXJhbWV0ZXIgYWxvbmcuIEdvaW5nIHdpdGggdGhpcyBhcHByb2FjaCBiZWNhdXNlIGl0CisgICAgLy8gc2VlbXMgbGlrZSB0aGUgbG93ZXN0LWNvc3Qgb3B0aW9uIHRvIGVhc2lseSBzdXBwb3J0IHJlY3Vyc2l2ZSB0eXBlcy4KKyAgICB0X3R5cGVkZWYqIHR0eXBlZGVmID0gKHRfdHlwZWRlZiopdHR5cGU7CisgICAgcmVuZGVyX3R5cGVfc3luY19yZWFkKHR5cGVfdmFyLCB0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgdHR5cGVkZWYtPmlzX2ZvcndhcmRfdHlwZWRlZigpKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBzdHJpbmcgcmVhZF9jYWxsKHRvX3J1c3RfdHlwZSh0dHlwZSkgKyAiOjpyZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90KT8iKTsKKyAgICByZWFkX2NhbGwgPSBpc19ib3hlZCA/ICJCb3g6Om5ldygiICsgcmVhZF9jYWxsICsgIikiIDogcmVhZF9jYWxsOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gIiA8PCAgcmVhZF9jYWxsIDw8ICI7IgorICAgICAgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmVuZGVyX21hcF9zeW5jX3JlYWQoKHRfbWFwICopIHR0eXBlLCB0eXBlX3Zhcik7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJlbmRlcl9zZXRfc3luY19yZWFkKCh0X3NldCAqKSB0dHlwZSwgdHlwZV92YXIpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmVuZGVyX2xpc3Rfc3luY19yZWFkKCh0X2xpc3QgKikgdHR5cGUsIHR5cGVfdmFyKTsKKyAgICByZXR1cm47CisgIH0KKworICB0aHJvdyAiY2Fubm90IHJlYWQgdW5zdXBwb3J0ZWQgdHlwZSAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8vIENvbnN0cnVjdCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIGxpc3QgZnJvbSB0aGUgd2lyZS4KK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9saXN0X3N5bmNfcmVhZCh0X2xpc3QgKnRsaXN0LCBjb25zdCBzdHJpbmcgJmxpc3RfdmFyKSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBsaXN0X2lkZW50ID0gaV9wcm90LnJlYWRfbGlzdF9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtdXQgIiA8PCBsaXN0X3ZhciA8PCAiOiAiIDw8IHRvX3J1c3RfdHlwZSgodF90eXBlKikgdGxpc3QpCisgICAgPDwgIiA9IFZlYzo6d2l0aF9jYXBhY2l0eShsaXN0X2lkZW50LnNpemUgYXMgdXNpemUpOyIKKyAgICA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciBfIGluIDAuLmxpc3RfaWRlbnQuc2l6ZSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBsaXN0X2VsZW1fdmFyID0gdG1wKCJsaXN0X2VsZW1fIik7CisgIHJlbmRlcl90eXBlX3N5bmNfcmVhZChsaXN0X2VsZW1fdmFyLCBlbGVtX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbGlzdF92YXIgPDwgIi5wdXNoKCIgPDwgbGlzdF9lbGVtX3ZhciA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfbGlzdF9lbmQoKT87IiA8PCBlbmRsOworfQorCisvLyBDb25zdHJ1Y3QgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSBzZXQgZnJvbSB0aGUgd2lyZS4KK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zZXRfc3luY19yZWFkKHRfc2V0ICp0c2V0LCBjb25zdCBzdHJpbmcgJnNldF92YXIpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgc2V0X2lkZW50ID0gaV9wcm90LnJlYWRfc2V0X2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG11dCAiIDw8IHNldF92YXIgPDwgIjogIiA8PCB0b19ydXN0X3R5cGUoKHRfdHlwZSopIHRzZXQpCisgICAgPDwgIiA9IEJUcmVlU2V0OjpuZXcoKTsiCisgICAgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgXyBpbiAwLi5zZXRfaWRlbnQuc2l6ZSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBzZXRfZWxlbV92YXIgPSB0bXAoInNldF9lbGVtXyIpOworICByZW5kZXJfdHlwZV9zeW5jX3JlYWQoc2V0X2VsZW1fdmFyLCBlbGVtX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc2V0X3ZhciA8PCAiLmluc2VydCgiIDw8IHNldF9lbGVtX3ZhciA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfc2V0X2VuZCgpPzsiIDw8IGVuZGw7Cit9CisKKy8vIENvbnN0cnVjdCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIG1hcCBmcm9tIHRoZSB3aXJlLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX21hcF9zeW5jX3JlYWQodF9tYXAgKnRtYXAsIGNvbnN0IHN0cmluZyAmbWFwX3ZhcikgeworICB0X3R5cGUqIGtleV90eXBlID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7CisgIHRfdHlwZSogdmFsX3R5cGUgPSB0bWFwLT5nZXRfdmFsX3R5cGUoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtYXBfaWRlbnQgPSBpX3Byb3QucmVhZF9tYXBfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgbXV0ICIgPDwgbWFwX3ZhciA8PCAiOiAiIDw8IHRvX3J1c3RfdHlwZSgodF90eXBlKikgdG1hcCkKKyAgICA8PCAiID0gQlRyZWVNYXA6Om5ldygpOyIKKyAgICA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciBfIGluIDAuLm1hcF9pZGVudC5zaXplIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGtleV9lbGVtX3ZhciA9IHRtcCgibWFwX2tleV8iKTsKKyAgcmVuZGVyX3R5cGVfc3luY19yZWFkKGtleV9lbGVtX3Zhciwga2V5X3R5cGUpOworICBzdHJpbmcgdmFsX2VsZW1fdmFyID0gdG1wKCJtYXBfdmFsXyIpOworICByZW5kZXJfdHlwZV9zeW5jX3JlYWQodmFsX2VsZW1fdmFyLCB2YWxfdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBtYXBfdmFyIDw8ICIuaW5zZXJ0KCIgPDwga2V5X2VsZW1fdmFyIDw8ICIsICIgPDwgdmFsX2VsZW1fdmFyIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9tYXBfZW5kKCk/OyIgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKHRfZmllbGQqIHRmaWVsZCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZm9zczsKKyAgZm9zcyA8PCAiZl8iIDw8IHRmaWVsZC0+Z2V0X2tleSgpOworICByZXR1cm4gZm9zcy5zdHIoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFN5bmMgQ2xpZW50CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmVuZGVyX3N5bmNfY2xpZW50KHRzZXJ2aWNlKTsKKyAgcmVuZGVyX3N5bmNfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKKyAgcmVuZGVyX3NlcnZpY2VfY2FsbF9zdHJ1Y3RzKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3NlcnZpY2VfY2FsbF9zdHJ1Y3RzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY19pdGVyOworCisgIC8vIHRocmlmdCBhcmdzIGZvciBzZXJ2aWNlIGNhbGxzIGFyZSBwYWNrZWQKKyAgLy8gaW50byBhIHN0cnVjdCB0aGF0J3MgdHJhbnNtaXR0ZWQgb3ZlciB0aGUgd2lyZSwgc28KKyAgLy8gZ2VuZXJhdGUgc3RydWN0cyBmb3IgdGhvc2UgdG9vCisgIC8vCisgIC8vIHRocmlmdCByZXR1cm5zIGFyZSAqYWxzbyogcGFja2VkIGludG8gYSBzdHJ1Y3QKKyAgLy8gdGhhdCdzIHBhc3NlZCBvdmVyIHRoZSB3aXJlLCBzbywgZ2VuZXJhdGUgdGhlIHN0cnVjdAorICAvLyBmb3IgdGhhdCB0b28uIE5vdGUgdGhhdCB0aGlzIHJlc3VsdCBzdHJ1Y3QgKmFsc28qCisgIC8vIGNvbnRhaW5zIHRoZSBleGNlcHRpb25zIGFzIHdlbGwKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHJlbmRlcl9zZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3QodGZ1bmMpOworICAgIGlmICghdGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgICByZW5kZXJfc2VydmljZV9jYWxsX3Jlc3VsdF92YWx1ZV9zdHJ1Y3QodGZ1bmMpOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgY2xpZW50X2ltcGxfbmFtZShydXN0X3N5bmNfY2xpZW50X2ltcGxfbmFtZSh0c2VydmljZSkpOworCisgIHJlbmRlcl90eXBlX2NvbW1lbnQodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiIHNlcnZpY2UgY2xpZW50Iik7IC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgcmVuZGVyX3N5bmNfY2xpZW50X3RyYWl0KHRzZXJ2aWNlKTsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdCh0c2VydmljZSk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF9kZWZpbml0aW9uX2FuZF9pbXBsKGNsaWVudF9pbXBsX25hbWUpOworICByZW5kZXJfc3luY19jbGllbnRfdHRocmlmdGNsaWVudF9pbXBsKGNsaWVudF9pbXBsX25hbWUpOworICByZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X2ltcGxzKHRzZXJ2aWNlLCBjbGllbnRfaW1wbF9uYW1lKTsgZl9nZW5fIDw8IGVuZGw7CisgIHJlbmRlcl9zeW5jX2NsaWVudF9wcm9jZXNzX2ltcGwodHNlcnZpY2UpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5zaW9uID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgeworICAgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIGV4dGVuc2lvbiA9ICIgOiAiICsgcnVzdF9uYW1lc3BhY2UoZXh0ZW5kcykgKyBydXN0X3N5bmNfY2xpZW50X3RyYWl0X25hbWUoZXh0ZW5kcyk7CisgIH0KKworICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0c2VydmljZSk7CisgIGZfZ2VuXyA8PCAicHViIHRyYWl0ICIgPDwgcnVzdF9zeW5jX2NsaWVudF90cmFpdF9uYW1lKHRzZXJ2aWNlKSA8PCBleHRlbnNpb24gPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jX2l0ZXI7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICBzdHJpbmcgZnVuY19uYW1lID0gc2VydmljZV9jYWxsX2NsaWVudF9mdW5jdGlvbl9uYW1lKHRmdW5jKTsKKyAgICBzdHJpbmcgZnVuY19hcmdzID0gcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9kZWNsYXJhdGlvbih0ZnVuYywgdHJ1ZSk7CisgICAgc3RyaW5nIGZ1bmNfcmV0dXJuID0gdG9fcnVzdF90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0ZnVuYyk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiAiIDw8IGZ1bmNfbmFtZSA8PCAgZnVuY19hcmdzIDw8ICIgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBmdW5jX3JldHVybiA8PCAiPjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJwdWIgdHJhaXQgIiA8PCBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRzZXJ2aWNlKSA8PCAiIHt9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9pbXBscyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCBjb25zdCBzdHJpbmcgJmltcGxfc3RydWN0X25hbWUpIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiaW1wbCAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgcnVzdF9uYW1lc3BhY2UodHNlcnZpY2UpIDw8IHJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUodHNlcnZpY2UpCisgICAgPDwgIiBmb3IgIgorICAgIDw8IGltcGxfc3RydWN0X25hbWUgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORFMKKyAgICA8PCAiIHt9IgorICAgIDw8IGVuZGw7CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzKSB7CisgICAgcmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9pbXBscyhleHRlbmRzLCBpbXBsX3N0cnVjdF9uYW1lKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfZGVmaW5pdGlvbl9hbmRfaW1wbChjb25zdCBzdHJpbmcmIGNsaWVudF9pbXBsX25hbWUpIHsKKworICAvLyByZW5kZXIgdGhlIGRlZmluaXRpb24gZm9yIHRoZSBjbGllbnQgc3RydWN0CisgIGZfZ2VuXworICAgIDw8ICJwdWIgc3RydWN0ICIKKyAgICA8PCBjbGllbnRfaW1wbF9uYW1lCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORFMKKyAgICA8PCAiIHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiX2lfcHJvdDogSVAsIiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl9vX3Byb3Q6IE9QLCIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfc2VxdWVuY2VfbnVtYmVyOiBpMzIsIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIHJlbmRlciB0aGUgc3RydWN0IGltcGxlbWVudGF0aW9uCisgIC8vIHRoaXMgaW5jbHVkZXMgdGhlIG5ldygpIGZ1bmN0aW9uIGFzIHdlbGwgYXMgdGhlIGhlbHBlciBzZW5kL3JlY3YgbWV0aG9kcyBmb3IgZWFjaCBzZXJ2aWNlIGNhbGwKKyAgZl9nZW5fCisgICAgPDwgImltcGwgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IGNsaWVudF9pbXBsX25hbWUKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EUworICAgIDw8ICIgeyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X2xpZmVjeWNsZV9mdW5jdGlvbnMoY2xpZW50X2ltcGxfbmFtZSk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9saWZlY3ljbGVfZnVuY3Rpb25zKGNvbnN0IHN0cmluZyYgY2xpZW50X3N0cnVjdCkgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gbmV3KGlucHV0X3Byb3RvY29sOiBJUCwgb3V0cHV0X3Byb3RvY29sOiBPUCkgLT4gIgorICAgIDw8IGNsaWVudF9zdHJ1Y3QKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiIHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCBjbGllbnRfc3RydWN0CisgICAgPDwgIiB7IF9pX3Byb3Q6IGlucHV0X3Byb3RvY29sLCBfb19wcm90OiBvdXRwdXRfcHJvdG9jb2wsIF9zZXF1ZW5jZV9udW1iZXI6IDAgfSIKKyAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X3R0aHJpZnRjbGllbnRfaW1wbChjb25zdCBzdHJpbmcgJmNsaWVudF9pbXBsX25hbWUpIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiaW1wbCAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiBUVGhyaWZ0Q2xpZW50IGZvciAiCisgICAgPDwgY2xpZW50X2ltcGxfbmFtZQorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTCisgICAgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIGlfcHJvdF9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IFRJbnB1dFByb3RvY29sIHsgJm11dCBzZWxmLl9pX3Byb3QgfSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBvX3Byb3RfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBUT3V0cHV0UHJvdG9jb2wgeyAmbXV0IHNlbGYuX29fcHJvdCB9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIHNlcXVlbmNlX251bWJlcigmc2VsZikgLT4gaTMyIHsgc2VsZi5fc2VxdWVuY2VfbnVtYmVyIH0iIDw8IGVuZGw7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImZuIGluY3JlbWVudF9zZXF1ZW5jZV9udW1iZXIoJm11dCBzZWxmKSAtPiBpMzIgeyBzZWxmLl9zZXF1ZW5jZV9udW1iZXIgKz0gMTsgc2VsZi5fc2VxdWVuY2VfbnVtYmVyIH0iCisgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfcHJvY2Vzc19pbXBsKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIG1hcmtlcl9leHRlbnNpb24gPSAiIiArIHN5bmNfY2xpZW50X21hcmtlcl90cmFpdHNfZm9yX2V4dGVuc2lvbih0c2VydmljZSk7CisKKyAgZl9nZW5fCisgICAgPDwgImltcGwgPEM6IFRUaHJpZnRDbGllbnQgKyAiIDw8IHJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUodHNlcnZpY2UpIDw8IG1hcmtlcl9leHRlbnNpb24gPDwgIj4gIgorICAgIDw8IHJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZSh0c2VydmljZSkKKyAgICA8PCAiIGZvciBDIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgcmVuZGVyX3N5bmNfc2VuZF9yZWN2X3dyYXBwZXIoZnVuYyk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnN5bmNfY2xpZW50X21hcmtlcl90cmFpdHNfZm9yX2V4dGVuc2lvbih0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHN0cmluZyBtYXJrZXJfZXh0ZW5zaW9uOworCisgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kcykgeworICAgIG1hcmtlcl9leHRlbnNpb24gPSAiICsgIiArIHJ1c3RfbmFtZXNwYWNlKGV4dGVuZHMpICsgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZShleHRlbmRzKTsKKyAgICBtYXJrZXJfZXh0ZW5zaW9uID0gbWFya2VyX2V4dGVuc2lvbiArIHN5bmNfY2xpZW50X21hcmtlcl90cmFpdHNfZm9yX2V4dGVuc2lvbihleHRlbmRzKTsKKyAgfQorCisgIHJldHVybiBtYXJrZXJfZXh0ZW5zaW9uOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19zZW5kX3JlY3Zfd3JhcHBlcih0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBzdHJpbmcgZnVuY19uYW1lID0gc2VydmljZV9jYWxsX2NsaWVudF9mdW5jdGlvbl9uYW1lKHRmdW5jKTsKKyAgc3RyaW5nIGZ1bmNfZGVjbF9hcmdzID0gcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9kZWNsYXJhdGlvbih0ZnVuYywgdHJ1ZSk7CisgIHN0cmluZyBmdW5jX2NhbGxfYXJncyA9IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfaW52b2NhdGlvbih0ZnVuYyk7CisgIHN0cmluZyBmdW5jX3JldHVybiA9IHRvX3J1c3RfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiZm4gIiA8PCBmdW5jX25hbWUgPDwgIGZ1bmNfZGVjbF9hcmdzIDw8ICIgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBmdW5jX3JldHVybgorICAgIDw8ICI+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfc2VuZCh0ZnVuYyk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKT87IiA8PCBlbmRsOworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPaygoKSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcmVuZGVyX3N5bmNfcmVjdih0ZnVuYyk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3NlbmQodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBpbmNyZW1lbnQgdGhlIHNlcXVlbmNlIG51bWJlciBhbmQgZ2VuZXJhdGUgdGhlIGNhbGwgaGVhZGVyCisgIHN0cmluZyBtZXNzYWdlX3R5cGUgPSB0ZnVuYy0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlOjpPbmVXYXkiIDogIlRNZXNzYWdlVHlwZTo6Q2FsbCI7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5pbmNyZW1lbnRfc2VxdWVuY2VfbnVtYmVyKCk7IiA8PCBlbmRsOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9ICIKKyAgICA8PCAiVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgPDwgbWVzc2FnZV90eXBlIDw8ICIsICIKKyAgICA8PCAic2VsZi5zZXF1ZW5jZV9udW1iZXIoKSk7IgorICAgIDw8IGVuZGw7CisgIC8vIHBhY2sgdGhlIGFyZ3VtZW50cyBpbnRvIHRoZSBjb250YWluaW5nIHN0cnVjdCB0aGF0IHdlJ2xsIHdyaXRlIG91dCBvdmVyIHRoZSB3aXJlCisgIC8vIG5vdGUgdGhhdCB0aGlzIHN0cnVjdCBpcyBnZW5lcmF0ZWQgZXZlbiBpZiB3ZSBoYXZlIDAgYXJncworICBvc3RyaW5nc3RyZWFtIHN0cnVjdF9kZWZpbml0aW9uOworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICBzdHJpbmcgbWVtYmVyX25hbWUocnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworICAgIHN0cnVjdF9kZWZpbml0aW9uIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgbWVtYmVyX25hbWUgPDwgIiwgIjsKKyAgfQorICBzdHJpbmcgc3RydWN0X2ZpZWxkcyA9IHN0cnVjdF9kZWZpbml0aW9uLnN0cigpOworICBpZiAoc3RydWN0X2ZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgc3RydWN0X2ZpZWxkcyA9IHN0cnVjdF9maWVsZHMuc3Vic3RyKDAsIHN0cnVjdF9maWVsZHMuc2l6ZSgpIC0gMik7IC8vIHN0cmlwIHRyYWlsaW5nIGNvbW1hCisgIH0KKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IGNhbGxfYXJncyA9ICIKKyAgICA8PCBzZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3RfbmFtZSh0ZnVuYykKKyAgICA8PCAiIHsgIgorICAgIDw8IHN0cnVjdF9maWVsZHMKKyAgICA8PCAiIH07IgorICAgIDw8IGVuZGw7CisgIC8vIHdyaXRlIGV2ZXJ5dGhpbmcgb3ZlciB0aGUgd2lyZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYub19wcm90X211dCgpLndyaXRlX21lc3NhZ2VfYmVnaW4oJm1lc3NhZ2VfaWRlbnQpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiY2FsbF9hcmdzLndyaXRlX3RvX291dF9wcm90b2NvbChzZWxmLm9fcHJvdF9tdXQoKSk/OyIgPDwgZW5kbDsgLy8gd3JpdHRlbiBldmVuIGlmIHdlIGhhdmUgMCBhcmdzCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5vX3Byb3RfbXV0KCkud3JpdGVfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYub19wcm90X211dCgpLmZsdXNoKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19yZWN2KHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9IHNlbGYuaV9wcm90X211dCgpLnJlYWRfbWVzc2FnZV9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidmVyaWZ5X2V4cGVjdGVkX3NlcXVlbmNlX251bWJlcihzZWxmLnNlcXVlbmNlX251bWJlcigpLCBtZXNzYWdlX2lkZW50LnNlcXVlbmNlX251bWJlcik/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ2ZXJpZnlfZXhwZWN0ZWRfc2VydmljZV9jYWxsKFwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCJcIiwgJm1lc3NhZ2VfaWRlbnQubmFtZSk/OyIgPDwgZW5kbDsgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAvLyBGSVhNRTogcmVwbGFjZSB3aXRoIGEgInRyeSIgYmxvY2sKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiBtZXNzYWdlX2lkZW50Lm1lc3NhZ2VfdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmVtb3RlX2Vycm9yID0gdGhyaWZ0OjpFcnJvcjo6cmVhZF9hcHBsaWNhdGlvbl9lcnJvcl9mcm9tX2luX3Byb3RvY29sKHNlbGYuaV9wcm90X211dCgpKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYuaV9wcm90X211dCgpLnJlYWRfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJldHVybiBFcnIodGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24ocmVtb3RlX2Vycm9yKSkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ2ZXJpZnlfZXhwZWN0ZWRfbWVzc2FnZV90eXBlKFRNZXNzYWdlVHlwZTo6UmVwbHksIG1lc3NhZ2VfaWRlbnQubWVzc2FnZV90eXBlKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXN1bHQgPSAiIDw8IHNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodGZ1bmMpIDw8ICI6OnJlYWRfZnJvbV9pbl9wcm90b2NvbChzZWxmLmlfcHJvdF9tdXQoKSk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLmlfcHJvdF9tdXQoKS5yZWFkX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZXN1bHQub2tfb3IoKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9kZWNsYXJhdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBzZWxmX2lzX211dGFibGUpIHsKKyAgb3N0cmluZ3N0cmVhbSBmdW5jX2FyZ3M7CisKKyAgaWYgKHNlbGZfaXNfbXV0YWJsZSkgeworICAgIGZ1bmNfYXJncyA8PCAiKCZtdXQgc2VsZiI7CisgIH0gZWxzZSB7CisgICAgZnVuY19hcmdzIDw8ICIoJnNlbGYiOworICB9CisKKyAgaWYgKGhhc19hcmdzKHRmdW5jKSkgeworICAgIGZ1bmNfYXJncyA8PCAiLCAiOyAvLyBwdXQgY29tbWEgYWZ0ZXIgInNlbGYiCisgICAgZnVuY19hcmdzIDw8IHN0cnVjdF90b19kZWNsYXJhdGlvbih0ZnVuYy0+Z2V0X2FyZ2xpc3QoKSwgVF9BUkdTKTsKKyAgfQorCisgIGZ1bmNfYXJncyA8PCAiKSI7CisgIHJldHVybiBmdW5jX2FyZ3Muc3RyKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9pbnZvY2F0aW9uKHRfZnVuY3Rpb24qIHRmdW5jLCBjb25zdCBzdHJpbmcmIGZpZWxkX3ByZWZpeCkgeworICBvc3RyaW5nc3RyZWFtIGZ1bmNfYXJnczsKKyAgZnVuY19hcmdzIDw8ICIoIjsKKworICBpZiAoaGFzX2FyZ3ModGZ1bmMpKSB7CisgICAgZnVuY19hcmdzIDw8IHN0cnVjdF90b19pbnZvY2F0aW9uKHRmdW5jLT5nZXRfYXJnbGlzdCgpLCBmaWVsZF9wcmVmaXgpOworICB9CisKKyAgZnVuY19hcmdzIDw8ICIpIjsKKyAgcmV0dXJuIGZ1bmNfYXJncy5zdHIoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzdHJ1Y3RfdG9fZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKSB7CisgIG9zdHJpbmdzdHJlYW0gYXJnczsKKworICBib29sIGZpcnN0X2FyZyA9IHRydWU7CisgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBmaWVsZF9pdGVyOworICBmb3IgKGZpZWxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmllbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmllbGRfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqZmllbGRfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgZmllbGRfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcSh0ZmllbGQsIHN0cnVjdF90eXBlKTsKKyAgICBzdHJpbmcgcnVzdF90eXBlID0gdG9fcnVzdF90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgcnVzdF90eXBlID0gaXNfb3B0aW9uYWwoZmllbGRfcmVxKSA/ICJPcHRpb248IiArIHJ1c3RfdHlwZSArICI+IiA6IHJ1c3RfdHlwZTsKKworICAgIGlmIChmaXJzdF9hcmcpIHsKKyAgICAgIGZpcnN0X2FyZyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBhcmdzIDw8ICIsICI7CisgICAgfQorCisgICAgYXJncyA8PCBydXN0X2ZpZWxkX25hbWUodGZpZWxkKSA8PCAiOiAiIDw8IHJ1c3RfdHlwZTsKKyAgfQorCisgIHJldHVybiBhcmdzLnN0cigpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnN0cnVjdF90b19pbnZvY2F0aW9uKHRfc3RydWN0KiB0c3RydWN0LCBjb25zdCBzdHJpbmcmIGZpZWxkX3ByZWZpeCkgeworICBvc3RyaW5nc3RyZWFtIGFyZ3M7CisKKyAgYm9vbCBmaXJzdF9hcmcgPSB0cnVlOworICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4gZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZmllbGRfaXRlcjsKKyAgZm9yIChmaWVsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZpZWxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKmZpZWxkX2l0ZXIpOworCisgICAgaWYgKGZpcnN0X2FyZykgeworICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3MgPDwgIiwgIjsKKyAgICB9CisKKyAgICBhcmdzIDw8IGZpZWxkX3ByZWZpeCA8PCBydXN0X2ZpZWxkX25hbWUodGZpZWxkKTsKKyAgfQorCisgIHJldHVybiBhcmdzLnN0cigpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgICAgc3RyaW5nIGFyZ3Nfc3RydWN0X25hbWUoc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodGZ1bmMpKTsKKyAgICByZW5kZXJfc3RydWN0KGFyZ3Nfc3RydWN0X25hbWUsIHRmdW5jLT5nZXRfYXJnbGlzdCgpLCB0X3JzX2dlbmVyYXRvcjo6VF9BUkdTKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3NlcnZpY2VfY2FsbF9yZXN1bHRfdmFsdWVfc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHN0cmluZyByZXN1bHRfc3RydWN0X25hbWUgPSBzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRmdW5jKTsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCByZXN1bHRfc3RydWN0X25hbWUpOworCisgIHRfZmllbGQgcmV0dXJuX3ZhbHVlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLCBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSwgMCk7CisgIHJldHVybl92YWx1ZS5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICBpZiAoIXRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZyZXR1cm5fdmFsdWUpOworICB9CisKKyAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBleGNlcHRpb25fdHlwZXMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBleGNlcHRpb25faXRlcjsKKyAgZm9yKGV4Y2VwdGlvbl9pdGVyID0gZXhjZXB0aW9uX3R5cGVzLmJlZ2luKCk7IGV4Y2VwdGlvbl9pdGVyICE9IGV4Y2VwdGlvbl90eXBlcy5lbmQoKTsgKytleGNlcHRpb25faXRlcikgeworICAgIHRfZmllbGQqIGV4Y2VwdGlvbl90eXBlID0gKmV4Y2VwdGlvbl9pdGVyOworICAgIGV4Y2VwdGlvbl90eXBlLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgIHJlc3VsdC5hcHBlbmQoZXhjZXB0aW9uX3R5cGUpOworICB9CisKKyAgcmVuZGVyX3N0cnVjdChyZXN1bHRfc3RydWN0X25hbWUsICZyZXN1bHQsIHRfcnNfZ2VuZXJhdG9yOjpUX1JFU1VMVCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTeW5jIFByb2Nlc3NvcgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfcHJvY2Vzc29yKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgcmVuZGVyX3R5cGVfY29tbWVudCh0c2VydmljZS0+Z2V0X25hbWUoKSArICIgc2VydmljZSBwcm9jZXNzb3IiKTsgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICByZW5kZXJfc3luY19oYW5kbGVyX3RyYWl0KHRzZXJ2aWNlKTsKKyAgcmVuZGVyX3N5bmNfcHJvY2Vzc29yX2RlZmluaXRpb25fYW5kX2ltcGwodHNlcnZpY2UpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuc2lvbiA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIGV4dGVuc2lvbiA9ICIgOiAiICsgcnVzdF9uYW1lc3BhY2UoZXh0ZW5kcykgKyBydXN0X3N5bmNfaGFuZGxlcl90cmFpdF9uYW1lKGV4dGVuZHMpOworICB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY19pdGVyOworCisgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRzZXJ2aWNlKTsKKyAgZl9nZW5fIDw8ICJwdWIgdHJhaXQgIiA8PCBydXN0X3N5bmNfaGFuZGxlcl90cmFpdF9uYW1lKHRzZXJ2aWNlKSA8PCBleHRlbnNpb24gPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHN0cmluZyBmdW5jX25hbWUgPSBzZXJ2aWNlX2NhbGxfaGFuZGxlcl9mdW5jdGlvbl9uYW1lKHRmdW5jKTsKKyAgICBzdHJpbmcgZnVuY19hcmdzID0gcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9kZWNsYXJhdGlvbih0ZnVuYywgZmFsc2UpOworICAgIHN0cmluZyBmdW5jX3JldHVybiA9IHRvX3J1c3RfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdGZ1bmMpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJmbiAiCisgICAgICA8PCBmdW5jX25hbWUgPDwgIGZ1bmNfYXJncworICAgICAgPDwgIiAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IGZ1bmNfcmV0dXJuIDw8ICI+OyIKKyAgICAgIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfcHJvY2Vzc29yX2RlZmluaXRpb25fYW5kX2ltcGwodF9zZXJ2aWNlICp0c2VydmljZSkgeworICBzdHJpbmcgc2VydmljZV9wcm9jZXNzb3JfbmFtZSA9IHJ1c3Rfc3luY19wcm9jZXNzb3JfbmFtZSh0c2VydmljZSk7CisgIHN0cmluZyBoYW5kbGVyX3RyYWl0X25hbWUgPSBydXN0X3N5bmNfaGFuZGxlcl90cmFpdF9uYW1lKHRzZXJ2aWNlKTsKKworICAvLyBzdHJ1Y3QKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIHN0cnVjdCAiIDw8IHNlcnZpY2VfcHJvY2Vzc29yX25hbWUKKyAgICA8PCAiPEg6ICIgPDwgaGFuZGxlcl90cmFpdF9uYW1lCisgICAgPDwgIj4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJoYW5kbGVyOiBILCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBkZWxlZ2F0aW5nIGltcGwKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiaW1wbCA8SDogIiA8PCBoYW5kbGVyX3RyYWl0X25hbWUgPDwgIj4gIgorICAgIDw8IHNlcnZpY2VfcHJvY2Vzc29yX25hbWUKKyAgICA8PCAiPEg+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicHViIGZuIG5ldyhoYW5kbGVyOiBIKSAtPiAiIDw8IHNlcnZpY2VfcHJvY2Vzc29yX25hbWUgPDwgIjxIPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfcHJvY2Vzc29yX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJoYW5kbGVyLCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZGVsZWdhdGlvbl9mdW5jdGlvbnModHNlcnZpY2UpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGFjdHVhbCBpbXBsCisgIHN0cmluZyBzZXJ2aWNlX2FjdHVhbF9wcm9jZXNzb3JfbmFtZSA9IHJ1c3Rfc3luY19wcm9jZXNzb3JfaW1wbF9uYW1lKHRzZXJ2aWNlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJwdWIgc3RydWN0ICIgPDwgc2VydmljZV9hY3R1YWxfcHJvY2Vzc29yX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImltcGwgIiA8PCBzZXJ2aWNlX2FjdHVhbF9wcm9jZXNzb3JfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgcmVuZGVyX3N5bmNfcHJvY2Vzc19mdW5jdGlvbih0ZnVuYywgaGFuZGxlcl90cmFpdF9uYW1lKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gcHJvY2Vzc29yIGltcGwKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiaW1wbCA8SDogIgorICAgIDw8IGhhbmRsZXJfdHJhaXRfbmFtZSA8PCAiPiBUUHJvY2Vzc29yIGZvciAiCisgICAgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZQorICAgIDw8ICI8SD4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJmbiBwcm9jZXNzKCZzZWxmLCBpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSBpX3Byb3QucmVhZF9tZXNzYWdlX2JlZ2luKCk/OyIgPDwgZW5kbDsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXMgPSBtYXRjaCAmKm1lc3NhZ2VfaWRlbnQubmFtZSB7IiA8PCBlbmRsOyAvLyBbc2lnaF0gZXhwbGljaXQgZGVyZWYgY29lcmNpb24KKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9wcm9jZXNzX21hdGNoX3N0YXRlbWVudHModHNlcnZpY2UpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1ldGhvZCA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcigKKyAgICAiQXBwbGljYXRpb24iLAorICAgICJBcHBsaWNhdGlvbkVycm9yIiwKKyAgICAiQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd25NZXRob2QiLAorICAgICJmb3JtYXQhKFwidW5rbm93biBtZXRob2Qge31cIiwgbWV0aG9kKSIKKyAgKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInRocmlmdDo6c2VydmVyOjpoYW5kbGVfcHJvY2Vzc19yZXN1bHQoJm1lc3NhZ2VfaWRlbnQsIHJlcywgb19wcm90KSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfcHJvY2Vzc19kZWxlZ2F0aW9uX2Z1bmN0aW9ucyh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHN0cmluZyBhY3R1YWxfcHJvY2Vzc29yKHJ1c3RfbmFtZXNwYWNlKHRzZXJ2aWNlKSArIHJ1c3Rfc3luY19wcm9jZXNzb3JfaW1wbF9uYW1lKHRzZXJ2aWNlKSk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmdW5jX2l0ZXI7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSgicHJvY2Vzc18iICsgcnVzdF9zbmFrZV9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKSk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImZuICIgPDwgZnVuY3Rpb25fbmFtZQorICAgICAgPDwgIigmc2VsZiwgIgorICAgICAgPDwgImluY29taW5nX3NlcXVlbmNlX251bWJlcjogaTMyLCAiCisgICAgICA8PCAiaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sLCAiCisgICAgICA8PCAib19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgIgorICAgICAgPDwgIi0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8IGFjdHVhbF9wcm9jZXNzb3IKKyAgICAgIDw8ICI6OiIgPDwgZnVuY3Rpb25fbmFtZQorICAgICAgPDwgIigiCisgICAgICA8PCAiJnNlbGYuaGFuZGxlciwgIgorICAgICAgPDwgImluY29taW5nX3NlcXVlbmNlX251bWJlciwgIgorICAgICAgPDwgImlfcHJvdCwgIgorICAgICAgPDwgIm9fcHJvdCIKKyAgICAgIDw8ICIpIgorICAgICAgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzKSB7CisgICAgcmVuZGVyX3N5bmNfcHJvY2Vzc19kZWxlZ2F0aW9uX2Z1bmN0aW9ucyhleHRlbmRzKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfcHJvY2Vzc19tYXRjaF9zdGF0ZW1lbnRzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmdW5jX2l0ZXI7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIlwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCAiXCIiIDw8ICIgPT4geyIgPDwgZW5kbDsgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJzZWxmLnByb2Nlc3NfIiA8PCBydXN0X3NuYWtlX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpCisgICAgICA8PCAiKG1lc3NhZ2VfaWRlbnQuc2VxdWVuY2VfbnVtYmVyLCBpX3Byb3QsIG9fcHJvdCkiCisgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgfQorCisgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kcykgeworICAgIHJlbmRlcl9wcm9jZXNzX21hdGNoX3N0YXRlbWVudHMoZXh0ZW5kcyk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfcHJvY2Vzc19mdW5jdGlvbih0X2Z1bmN0aW9uICp0ZnVuYywgY29uc3Qgc3RyaW5nICZoYW5kbGVyX3R5cGUpIHsKKyAgc3RyaW5nIHNlcXVlbmNlX251bWJlcl9wYXJhbSgiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyIik7CisgIHN0cmluZyBvdXRwdXRfcHJvdG9jb2xfcGFyYW0oIm9fcHJvdCIpOworCisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICBzZXF1ZW5jZV9udW1iZXJfcGFyYW0gPSAiXyI7CisgICAgb3V0cHV0X3Byb3RvY29sX3BhcmFtID0gIl8iOworICB9CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIHByb2Nlc3NfIiA8PCBydXN0X3NuYWtlX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpCisgICAgPDwgIjxIOiAiIDw8IGhhbmRsZXJfdHlwZSA8PCAiPiIKKyAgICA8PCAiKGhhbmRsZXI6ICZILCAiCisgICAgPDwgc2VxdWVuY2VfbnVtYmVyX3BhcmFtIDw8ICI6IGkzMiwgIgorICAgIDw8ICJpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wsICIKKyAgICA8PCBvdXRwdXRfcHJvdG9jb2xfcGFyYW0gPDwgIjogJm11dCBUT3V0cHV0UHJvdG9jb2wpICIKKyAgICA8PCAiLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICAvLyAqYWx3YXlzKiByZWFkIGFyZ3VtZW50cyBmcm9tIHRoZSBpbnB1dCBwcm90b2NvbAorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgIgorICAgIDw8IChoYXNfbm9uX3ZvaWRfYXJncyh0ZnVuYykgPyAiYXJncyIgOiAiXyIpCisgICAgPDwgIiA9ICIKKyAgICA8PCBzZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3RfbmFtZSh0ZnVuYykKKyAgICA8PCAiOjpyZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90KT87IgorICAgIDw8IGVuZGw7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibWF0Y2ggaGFuZGxlci4iCisgICAgPDwgc2VydmljZV9jYWxsX2hhbmRsZXJfZnVuY3Rpb25fbmFtZSh0ZnVuYykKKyAgICA8PCBydXN0X3N5bmNfc2VydmljZV9jYWxsX2ludm9jYXRpb24odGZ1bmMsICJhcmdzLiIpCisgICAgPDwgIiB7IgorICAgIDw8IGVuZGw7IC8vIHN0YXJ0IG1hdGNoCisgIGluZGVudF91cCgpOworCisgIC8vIGhhbmRsZXIgc3VjY2VlZGVkCisgIHN0cmluZyBoYW5kbGVyX3JldHVybl92YXJpYWJsZSA9IHRmdW5jLT5pc19vbmV3YXkoKSB8fCB0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpID8gIl8iIDogImhhbmRsZXJfcmV0dXJuIjsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPaygiIDw8IGhhbmRsZXJfcmV0dXJuX3ZhcmlhYmxlIDw8ICIpID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19oYW5kbGVyX3N1Y2NlZWRlZCh0ZnVuYyk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgIC8vIGhhbmRsZXIgZmFpbGVkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKGUpID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZCh0ZnVuYyk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOyAvLyBlbmQgbWF0Y2gKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7IC8vIGVuZCBmdW5jdGlvbgorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX3N1Y2NlZWRlZCh0X2Z1bmN0aW9uICp0ZnVuYykgeworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPaygoKSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIgorICAgICAgPDwgIlwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCAiXCIsICIgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6UmVwbHksICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIpOyIKKyAgICAgIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmbWVzc2FnZV9pZGVudCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXQgPSAiIDw8IGhhbmRsZXJfc3VjY2Vzc2Z1bF9yZXR1cm5fc3RydWN0KHRmdW5jKSA8PCI7IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmV0LndyaXRlX3RvX291dF9wcm90b2NvbChvX3Byb3QpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LmZsdXNoKCkiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWQodF9mdW5jdGlvbiAqdGZ1bmMpIHsKKyAgc3RyaW5nIGVycl92YXIoImUiKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1hdGNoICIgPDwgZXJyX3ZhciA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGlmIHRoZXJlIGFyZSBhbnkgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMgZm9yIHRoaXMgc2VydmljZSBjYWxsIGhhbmRsZSB0aGVtIGZpcnN0CisgIGlmICh0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpICE9IE5VTEwgJiYgdGZ1bmMtPmdldF94Y2VwdGlvbnMoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgeworICAgIHN0cmluZyB1c2VyX2Vycl92YXIoInVzcl9lcnIiKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInRocmlmdDo6RXJyb3I6OlVzZXIoIiA8PCB1c2VyX2Vycl92YXIgPDwgIikgPT4geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF91c2VyX2V4Y2VwdGlvbl9icmFuY2godGZ1bmMpOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGFwcGxpY2F0aW9uIGVycm9yCisgIHN0cmluZyBhcHBfZXJyX3ZhcigiYXBwX2VyciIpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKCIgPDwgYXBwX2Vycl92YXIgPDwgIikgPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9icmFuY2godGZ1bmMsIGFwcF9lcnJfdmFyKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICAvLyBkZWZhdWx0IGNhc2UKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9kZWZhdWx0X2V4Y2VwdGlvbl9icmFuY2godGZ1bmMpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfdXNlcl9leGNlcHRpb25fYnJhbmNoKHRfZnVuY3Rpb24gKnRmdW5jKSB7CisgIGlmICh0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpID09IE5VTEwgfHwgdGZ1bmMtPmdldF94Y2VwdGlvbnMoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgIHRocm93ICJjYW5ub3QgcmVuZGVyIHVzZXIgZXhjZXB0aW9uIGJyYW5jaGVzIGlmIG5vIHVzZXIgZXhjZXB0aW9ucyBkZWZpbmVkIjsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gdHhjZXB0aW9ucyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4Y2VwdGlvbl9pdGVyOworICBpbnQgYnJhbmNoZXNfcmVuZGVyZWQgPSAwOworCisgIC8vIHJ1biB0aHJvdWdoIGFsbCB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucworICBmb3IgKHhjZXB0aW9uX2l0ZXIgPSB0eGNlcHRpb25zLmJlZ2luKCk7IHhjZXB0aW9uX2l0ZXIgIT0gdHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9pdGVyKSB7CisgICAgdF9maWVsZCogeGNlcHRpb25fZmllbGQgPSAoKnhjZXB0aW9uX2l0ZXIpOworCisgICAgc3RyaW5nIGlmX3N0YXRlbWVudChicmFuY2hlc19yZW5kZXJlZCA9PSAwID8gImlmIHVzcl9lcnIiIDogIn0gZWxzZSBpZiB1c3JfZXJyIik7CisgICAgc3RyaW5nIGV4Y2VwdGlvbl90eXBlKHRvX3J1c3RfdHlwZSh4Y2VwdGlvbl9maWVsZC0+Z2V0X3R5cGUoKSkpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBpZl9zdGF0ZW1lbnQgPDwgIi5kb3duY2FzdF9yZWY6OjwiIDw8IGV4Y2VwdGlvbl90eXBlIDw8ICI+KCkuaXNfc29tZSgpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IGVyciA9IHVzcl9lcnIuZG93bmNhc3Q6OjwiIDw8IGV4Y2VwdGlvbl90eXBlIDw8ICI+KCkuZXhwZWN0KFwiZG93bmNhc3QgYWxyZWFkeSBjaGVja2VkXCIpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgICAvLyByZW5kZXIgdGhlIG1lbWJlcnMgb2YgdGhlIHJldHVybiBzdHJ1Y3QKKyAgICBvc3RyaW5nc3RyZWFtIG1lbWJlcnM7CisKKyAgICBib29sIGhhc19yZXN1bHRfdmFyaWFibGUgPSAhKHRmdW5jLT5pc19vbmV3YXkoKSB8fCB0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKTsKKyAgICBpZiAoaGFzX3Jlc3VsdF92YXJpYWJsZSkgeworICAgICAgbWVtYmVycyA8PCBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSA8PCAiOiBOb25lLCAiOworICAgIH0KKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhjZXB0aW9uX21lbWJlcnNfaXRlcjsKKyAgICBmb3IoeGNlcHRpb25fbWVtYmVyc19pdGVyID0gdHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9tZW1iZXJzX2l0ZXIgIT0gdHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9tZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqeGNlcHRpb25fbWVtYmVyc19pdGVyKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZShydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisgICAgICBpZiAobWVtYmVyID09IHhjZXB0aW9uX2ZpZWxkKSB7CisgICAgICAgIG1lbWJlcnMgPDwgbWVtYmVyX25hbWUgPDwgIjogU29tZSgqZXJyKSwgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWJlcnMgPDwgbWVtYmVyX25hbWUgPDwgIjogTm9uZSwgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdHJpbmcgbWVtYmVyX3N0cmluZyA9IG1lbWJlcnMuc3RyKCk7CisgICAgbWVtYmVyX3N0cmluZy5yZXBsYWNlKG1lbWJlcl9zdHJpbmcuc2l6ZSgpIC0gMiwgMiwgIiAiKTsgLy8gdHJpbSB0cmFpbGluZyBjb21tYQorCisgICAgLy8gbm93IHdyaXRlIG91dCB0aGUgcmV0dXJuIHN0cnVjdAorICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgcmV0X2VyciA9ICIKKyAgICAgIDw8IHNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodGZ1bmMpCisgICAgICA8PCAieyAiIDw8IG1lbWJlcl9zdHJpbmcgPDwgIn07IgorICAgICAgPDwgZW5kbDsKKworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9ICIKKyAgICAgIDw8ICJUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiCisgICAgICA8PCAiXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpSZXBseSwgIgorICAgICAgPDwgImluY29taW5nX3NlcXVlbmNlX251bWJlcik7IgorICAgICAgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZtZXNzYWdlX2lkZW50KT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmV0X2Vyci53cml0ZV90b19vdXRfcHJvdG9jb2wob19wcm90KT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC5mbHVzaCgpIiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGJyYW5jaGVzX3JlbmRlcmVkKys7CisgIH0KKworICAvLyB0aGUgY2F0Y2ggYWxsLCBpZiBzb21laG93IGl0IHdhcyBhIHVzZXIgZXhjZXB0aW9uIHRoYXQgd2UgZG9uJ3Qgc3VwcG9ydAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBGSVhNRTogc2FtZSBhcyBkZWZhdWx0IGJsb2NrIGJlbG93CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmV0X2VyciA9IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdCgiQXBwbGljYXRpb25FcnJvciIsICJBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biIsICJ1c3JfZXJyLmRlc2NyaXB0aW9uKCkiKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9zZW5kX2V4Y2VwdGlvbl9yZXNwb25zZSh0ZnVuYywgInJldF9lcnIiKTsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9icmFuY2goCisgICAgdF9mdW5jdGlvbiAqdGZ1bmMsCisgICAgY29uc3Qgc3RyaW5nICZhcHBfZXJyX3ZhcgorKSB7CisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIkVycih0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbigiIDw8IGFwcF9lcnJfdmFyIDw8ICIpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXJfc3luY19oYW5kbGVyX3NlbmRfZXhjZXB0aW9uX3Jlc3BvbnNlKHRmdW5jLCBhcHBfZXJyX3Zhcik7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfZGVmYXVsdF9leGNlcHRpb25fYnJhbmNoKHRfZnVuY3Rpb24gKnRmdW5jKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJldF9lcnIgPSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoIkFwcGxpY2F0aW9uRXJyb3IiLCAiQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24iLCAiZS5kZXNjcmlwdGlvbigpIik7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIkVycih0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbihyZXRfZXJyKSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcmVuZGVyX3N5bmNfaGFuZGxlcl9zZW5kX2V4Y2VwdGlvbl9yZXNwb25zZSh0ZnVuYywgInJldF9lcnIiKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX3NlbmRfZXhjZXB0aW9uX3Jlc3BvbnNlKHRfZnVuY3Rpb24gKnRmdW5jLCBjb25zdCBzdHJpbmcgJmVycl92YXIpIHsKKyAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIgorICAgICAgPDwgIlwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCAiXCIsICIgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uLCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyKTsiCisgICAgICA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZtZXNzYWdlX2lkZW50KT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInRocmlmdDo6RXJyb3I6OndyaXRlX2FwcGxpY2F0aW9uX2Vycm9yX3RvX291dF9wcm90b2NvbCgmIiA8PCBlcnJfdmFyIDw8ICIsIG9fcHJvdCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC5mbHVzaCgpIiA8PCBlbmRsOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OmhhbmRsZXJfc3VjY2Vzc2Z1bF9yZXR1cm5fc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIGludCBtZW1iZXJfY291bnQgPSAwOworICBvc3RyaW5nc3RyZWFtIHJldHVybl9zdHJ1Y3Q7CisKKyAgcmV0dXJuX3N0cnVjdCA8PCBzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRmdW5jKSA8PCAiIHsgIjsKKworICAvLyBhY3R1YWwgcmV0dXJuCisgIGlmICghdGZ1bmMtPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJldHVybl9zdHJ1Y3QgPDwgInJlc3VsdF92YWx1ZTogU29tZShoYW5kbGVyX3JldHVybikiOworICAgIG1lbWJlcl9jb3VudCsrOworICB9CisKKyAgLy8gYW55IHVzZXItZGVmaW5lZCBleGNlcHRpb25zCisgIGlmICh0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpICE9IE5VTEwpIHsKKyAgICB0X3N0cnVjdCogdHhjZXB0aW9ucyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHhjZXB0aW9ucy0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworICAgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHhjZXB0aW9uX2ZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgaWYgKG1lbWJlcl9jb3VudCA+IDApIHsgcmV0dXJuX3N0cnVjdCA8PCAiLCAiOyB9CisgICAgICByZXR1cm5fc3RydWN0IDw8IHJ1c3RfZmllbGRfbmFtZSh4Y2VwdGlvbl9maWVsZCkgPDwgIjogTm9uZSI7CisgICAgICBtZW1iZXJfY291bnQrKzsKKyAgICB9CisgIH0KKworICByZXR1cm5fc3RydWN0IDw8ICIgfSI7CisKKyAgcmV0dXJuICByZXR1cm5fc3RydWN0LnN0cigpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVXRpbGl0eQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3R5cGVfY29tbWVudChjb25zdCBzdHJpbmcmIHR5cGVfbmFtZSkgeworICBmX2dlbl8gPDwgIi8vIiA8PCBlbmRsOworICBmX2dlbl8gPDwgIi8vICIgPDwgdHlwZV9uYW1lIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiLy8iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCisvLyBOT1RFOiBkbyAqbm90KiBwdXQgaW4gYW4gZXh0cmEgbmV3bGluZSBhZnRlciBkb2MgaXMgZ2VuZXJhdGVkLgorLy8gVGhpcyBpcyBiZWNhdXNlIHJ1c3QgZG9jcyBoYXZlIHRvIGFidXQgdGhlIGxpbmUgdGhleSdyZSBkb2N1bWVudGluZy4KK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9ydXN0ZG9jKHRfZG9jKiB0ZG9jKSB7CisgIGlmICghdGRvYy0+aGFzX2RvYygpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQoZl9nZW5fLCAiIiwgIi8vLyAiLCB0ZG9jLT5nZXRfZG9jKCksICIiKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3RocmlmdF9lcnJvcigKKyAgY29uc3Qgc3RyaW5nJiBlcnJvcl9raW5kLAorICBjb25zdCBzdHJpbmcmIGVycm9yX3N0cnVjdCwKKyAgY29uc3Qgc3RyaW5nJiBzdWJfZXJyb3Jfa2luZCwKKyAgY29uc3Qgc3RyaW5nJiBlcnJvcl9tZXNzYWdlCispIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjoiIDw8IGVycm9yX2tpbmQgPDwgIigiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdChlcnJvcl9zdHJ1Y3QsIHN1Yl9lcnJvcl9raW5kLCBlcnJvcl9tZXNzYWdlKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIikiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0KAorICBjb25zdCBzdHJpbmcmIGVycm9yX3N0cnVjdCwKKyAgY29uc3Qgc3RyaW5nJiBzdWJfZXJyb3Jfa2luZCwKKyAgY29uc3Qgc3RyaW5nJiBlcnJvcl9tZXNzYWdlCispIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGVycm9yX3N0cnVjdCA8PCAiOjpuZXcoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN1Yl9lcnJvcl9raW5kIDw8ICIsIiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgZXJyb3JfbWVzc2FnZSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIikiIDw8IGVuZGw7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmlzX2RvdWJsZSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjp0b19ydXN0X3R5cGUodF90eXBlKiB0dHlwZSwgYm9vbCBvcmRlcmVkX2Zsb2F0KSB7CisgIC8vIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7IDwtLSByZWN1cnNlcyB0aHJvdWdoIGFzIG1hbnkgdHlwZWRlZiBsYXllcnMgYXMgbmVjZXNzYXJ5CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgICBzd2l0Y2ggKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIigpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICByZXR1cm4gIlZlYzx1OD4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJTdHJpbmciOworICAgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiaTgiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJpMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJpMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJpNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKG9yZGVyZWRfZmxvYXQpIHsKKyAgICAgICAgcmV0dXJuICJPcmRlcmVkRmxvYXQ8ZjY0PiI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gImY2NCI7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0X3R5cGVkZWYqIHR0eXBlZGVmID0gKHRfdHlwZWRlZiopdHR5cGU7CisgICAgc3RyaW5nIHJ1c3RfdHlwZSA9IHJ1c3RfbmFtZXNwYWNlKHR0eXBlKSArIHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKTsKKyAgICBydXN0X3R5cGUgPSAgdHR5cGVkZWYtPmlzX2ZvcndhcmRfdHlwZWRlZigpID8gIkJveDwiICsgcnVzdF90eXBlICsgIj4iIDogcnVzdF90eXBlOworICAgIHJldHVybiBydXN0X3R5cGU7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiBydXN0X25hbWVzcGFjZSh0dHlwZSkgKyBydXN0X2NhbWVsX2Nhc2UodHR5cGUtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiBydXN0X25hbWVzcGFjZSh0dHlwZSkgKyBydXN0X2NhbWVsX2Nhc2UodHR5cGUtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICByZXR1cm4gIkJUcmVlTWFwPCIgKyB0b19ydXN0X3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIiArIHRvX3J1c3RfdHlwZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIHJldHVybiAiQlRyZWVTZXQ8IiArIHRvX3J1c3RfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgcmV0dXJuICJWZWM8IiArIHRvX3J1c3RfdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfQorCisgIHRocm93ICJjYW5ub3QgZmluZCBydXN0IHR5cGUgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjp0b19ydXN0X2NvbnN0X3R5cGUodF90eXBlKiB0dHlwZSwgYm9vbCBvcmRlcmVkX2Zsb2F0KSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgICBpZiAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICByZXR1cm4gIiZbdThdIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiJnN0ciI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRvX3J1c3RfdHlwZSh0dHlwZSwgb3JkZXJlZF9mbG9hdCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6dG9fcnVzdF9maWVsZF90eXBlX2VudW0odF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIndpbGwgbm90IGdlbmVyYXRlIHByb3RvY29sOjpUVHlwZSBmb3IgVFlQRV9WT0lEIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzogLy8gYm90aCBzdHJpbmdzIGFuZCBiaW5hcnkgYXJlIGFjdHVhbGx5IGVuY29kZWQgYXMgVFR5cGU6OlN0cmluZworICAgICAgcmV0dXJuICJUVHlwZTo6U3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlOjpCb29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZTo6STA4IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGU6OkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlOjpJMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZTo6STY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGU6OkRvdWJsZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpJMzIiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGU6OlN0cnVjdCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6TWFwIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpTZXQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpMaXN0IjsKKyAgfQorCisgIHRocm93ICJjYW5ub3QgZmluZCBUVHlwZSBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6Om9wdF9pbl9yZXFfb3V0X3ZhbHVlKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICAgIHN3aXRjaCAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgT1BUX0lOX1JFUV9PVVQgdmFsdWUgZm9yIHZvaWQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiAiU29tZShWZWM6Om5ldygpKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIlNvbWUoXCJcIi50b19vd25lZCgpKSI7CisgICAgICB9CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJTb21lKGZhbHNlKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiU29tZSgwKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlNvbWUoT3JkZXJlZEZsb2F0Ojpmcm9tKDAuMCkpIjsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiTm9uZSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiU29tZShWZWM6Om5ldygpKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJTb21lKEJUcmVlU2V0OjpuZXcoKSkiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiU29tZShCVHJlZU1hcDo6bmV3KCkpIjsKKyAgfQorCisgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgb3B0LWluLXJlcS1vdXQgdmFsdWUgZm9yIHR5cGUgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjpjYW5fZ2VuZXJhdGVfc2ltcGxlX2NvbnN0KHRfdHlwZSogdHR5cGUpIHsKKyAgdF90eXBlKiBhY3R1YWxfdHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAoYWN0dWFsX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKWFjdHVhbF90eXBlOworICAgIHJldHVybiAhKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6Y2FuX2dlbmVyYXRlX2NvbnN0X2hvbGRlcih0X3R5cGUqIHR0eXBlKSB7CisgIHRfdHlwZSogYWN0dWFsX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgcmV0dXJuICFjYW5fZ2VuZXJhdGVfc2ltcGxlX2NvbnN0KGFjdHVhbF90eXBlKSAmJiAhYWN0dWFsX3R5cGUtPmlzX3NlcnZpY2UoKTsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aXNfdm9pZCh0X3R5cGUqIHR0eXBlKSB7CisgIHJldHVybiB0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmlzX29wdGlvbmFsKHRfZmllbGQ6OmVfcmVxIHJlcSkgeworICByZXR1cm4gcmVxID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgcmVxID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ7Cit9CisKK3RfZmllbGQ6OmVfcmVxIHRfcnNfZ2VuZXJhdG9yOjphY3R1YWxfZmllbGRfcmVxKHRfZmllbGQqIHRmaWVsZCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpIHsKKyAgcmV0dXJuIHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX0FSR1MgPyB0X2ZpZWxkOjpUX1JFUVVJUkVEIDogdGZpZWxkLT5nZXRfcmVxKCk7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6Omhhc19hcmdzKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHJldHVybiB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKSAhPSBOVUxMICYmICF0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCkuZW1wdHkoKTsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aGFzX25vbl92b2lkX2FyZ3ModF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgYm9vbCBoYXNfbm9uX3ZvaWRfYXJncyA9IGZhbHNlOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYXJnc19pdGVyOworICBmb3IgKGFyZ3NfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnc19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnc19pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCphcmdzX2l0ZXIpOworICAgIGlmICghdGZpZWxkLT5nZXRfdHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGhhc19ub25fdm9pZF9hcmdzID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBoYXNfbm9uX3ZvaWRfYXJnczsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjp2aXNpYmlsaXR5X3F1YWxpZmllcih0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSkgeworICBzd2l0Y2goc3RydWN0X3R5cGUpIHsKKyAgY2FzZSB0X3JzX2dlbmVyYXRvcjo6VF9BUkdTOgorICBjYXNlIHRfcnNfZ2VuZXJhdG9yOjpUX1JFU1VMVDoKKyAgICByZXR1cm4gIiI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuICJwdWIgIjsKKyAgfQorfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfbmFtZXNwYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpICE9IGdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpIHsKKyAgICByZXR1cm4gcnVzdF9zbmFrZV9jYXNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSArICI6OiI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICIiOworICB9Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9uYW1lc3BhY2UodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkgIT0gZ2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgeworICAgIHJldHVybiBydXN0X3NuYWtlX2Nhc2UodHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpICsgIjo6IjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIiI7CisgIH0KK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aXNfcmVzZXJ2ZWQoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIHJldHVybiBSVVNUX1JFU0VSVkVEX1dPUkRTX1NFVC5maW5kKG5hbWUpICE9IFJVU1RfUkVTRVJWRURfV09SRFNfU0VULmVuZCgpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3RydWN0X25hbWUodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIGJhc2Vfc3RydWN0X25hbWUocnVzdF9jYW1lbF9jYXNlKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKyAgcmV0dXJuIHJ1c3Rfc2FmZV9uYW1lKGJhc2Vfc3RydWN0X25hbWUpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfZmllbGRfbmFtZSh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RyaW5nIGJhc2VfZmllbGRfbmFtZShydXN0X3NuYWtlX2Nhc2UodGZpZWxkLT5nZXRfbmFtZSgpKSk7CisgIHJldHVybiBydXN0X3NhZmVfbmFtZShiYXNlX2ZpZWxkX25hbWUpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfdW5pb25fZmllbGRfbmFtZSh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RyaW5nIGJhc2VfZmllbGRfbmFtZShydXN0X2NhbWVsX2Nhc2UodGZpZWxkLT5nZXRfbmFtZSgpKSk7CisgIHJldHVybiBydXN0X3NhZmVfbmFtZShiYXNlX2ZpZWxkX25hbWUpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc2FmZV9uYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBpZiAoaXNfcmVzZXJ2ZWQobmFtZSkpIHsKKyAgICByZXR1cm4gbmFtZSArICJfIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnNlcnZpY2VfY2FsbF9jbGllbnRfZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICByZXR1cm4gcnVzdF9zbmFrZV9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzZXJ2aWNlX2NhbGxfaGFuZGxlcl9mdW5jdGlvbl9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHJldHVybiAiaGFuZGxlXyIgKyBydXN0X3NuYWtlX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnNlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdF9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIC8vIFRocmlmdCBhdXRvbWF0aWNhbGx5IGFwcGVuZHMgYEFyZ3NgIHRvIHRoZSBhcmdsaXN0IG5hbWUuIE5vIG5lZWQgdG8gZG8gaXQgaGVyZS4KKyAgcmV0dXJuIHJ1c3RfY2FtZWxfY2FzZShzZXJ2aWNlX25hbWVfKSArIHJ1c3RfY2FtZWxfY2FzZSh0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X25hbWUoKSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICByZXR1cm4gcnVzdF9jYW1lbF9jYXNlKHNlcnZpY2VfbmFtZV8pICsgcnVzdF9jYW1lbF9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKSArIFJFU1VMVF9TVFJVQ1RfU1VGRklYOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZXR1cm4gIlQiICsgcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJTeW5jQ2xpZW50TWFya2VyIjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfY2xpZW50X3RyYWl0X25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZXR1cm4gIlQiICsgcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJTeW5jQ2xpZW50IjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfY2xpZW50X2ltcGxfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNDbGllbnQiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19oYW5kbGVyX3RyYWl0X25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZXR1cm4gcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJTeW5jSGFuZGxlciI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX3Byb2Nlc3Nvcl9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY1Byb2Nlc3NvciI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX3Byb2Nlc3Nvcl9pbXBsX25hbWUodF9zZXJ2aWNlICp0c2VydmljZSkgeworICByZXR1cm4gIlQiICsgcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJQcm9jZXNzRnVuY3Rpb25zIjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X2VudW1fdmFyaWFudF9uYW1lKGNvbnN0IHN0cmluZyAmbmFtZSkgeworICBib29sIGFsbF91cHBlcmNhc2UgPSB0cnVlOworCisgIGZvciAoY2hhciBpIDogbmFtZSkgeworICAgIGlmIChpc2FsbnVtKGkpICYmIGlzbG93ZXIoaSkpIHsKKyAgICAgIGFsbF91cHBlcmNhc2UgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChhbGxfdXBwZXJjYXNlKSB7CisgICAgcmV0dXJuIGNhcGl0YWxpemUoY2FtZWxjYXNlKGxvd2VyY2FzZShuYW1lKSkpOworICB9IGVsc2UgeworICAgIHJldHVybiBjYXBpdGFsaXplKGNhbWVsY2FzZShuYW1lKSk7CisgIH0KK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3VwcGVyX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIHN0cmluZyBzdHIodXBwZXJjYXNlKHVuZGVyc2NvcmUobmFtZSkpKTsKKyAgc3RyaW5nX3JlcGxhY2Uoc3RyLCAiX18iLCAiXyIpOworICByZXR1cm4gc3RyOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc25ha2VfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgc3RyaW5nIHN0cihkZWNhcGl0YWxpemUodW5kZXJzY29yZShuYW1lKSkpOworICBzdHJpbmdfcmVwbGFjZShzdHIsICJfXyIsICJfIik7CisgIHJldHVybiBzdHI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9jYW1lbF9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBzdHJpbmcgc3RyKGNhcGl0YWxpemUoY2FtZWxjYXNlKG5hbWUpKSk7CisgIHN0cmluZ19yZXBsYWNlKHN0ciwgIl8iLCAiIik7CisgIHJldHVybiBzdHI7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnN0cmluZ19yZXBsYWNlKHN0cmluZyYgdGFyZ2V0LCBjb25zdCBzdHJpbmcmIHNlYXJjaF9zdHJpbmcsIGNvbnN0IHN0cmluZyYgcmVwbGFjZV9zdHJpbmcpIHsKKyAgaWYgKHRhcmdldC5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc2l6ZV90IG1hdGNoX2xlbiA9IHNlYXJjaF9zdHJpbmcubGVuZ3RoKCk7CisgIHNpemVfdCByZXBsYWNlX2xlbiA9IHJlcGxhY2Vfc3RyaW5nLmxlbmd0aCgpOworCisgIHNpemVfdCBzZWFyY2hfaWR4ID0gMDsKKyAgc2l6ZV90IG1hdGNoX2lkeDsKKyAgd2hpbGUgKChtYXRjaF9pZHggPSB0YXJnZXQuZmluZChzZWFyY2hfc3RyaW5nLCBzZWFyY2hfaWR4KSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgdGFyZ2V0LnJlcGxhY2UobWF0Y2hfaWR4LCBtYXRjaF9sZW4sIHJlcGxhY2Vfc3RyaW5nKTsKKyAgICBzZWFyY2hfaWR4ID0gbWF0Y2hfaWR4ICsgcmVwbGFjZV9sZW47CisgIH0KK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgcnMsCisgICJSdXN0IiwKKyAgIlxuIikgLy8gbm8gUnVzdC1nZW5lcmF0b3Itc3BlY2lmaWMgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzk1ZmViCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwxMDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBTbWFsbHRhbGsgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X3N0X2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3N0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICB0ZW1wb3JhcnlfdmFyID0gMDsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBzdDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tc3QiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpIG92ZXJyaWRlOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIG92ZXJyaWRlOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpOworICB2b2lkIGdlbmVyYXRlX2ZvcmNlX2NvbnN0cygpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3N0X3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9hY2Nlc3NvcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VuZF9tZXRob2QodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWN2X21ldGhvZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIHN0ZDo6c3RyaW5nIG1hcF9yZWFkZXIodF9tYXAqIHRtYXApOworICBzdGQ6OnN0cmluZyBsaXN0X3JlYWRlcih0X2xpc3QqIHRsaXN0KTsKKyAgc3RkOjpzdHJpbmcgc2V0X3JlYWRlcih0X3NldCogdHNldCk7CisgIHN0ZDo6c3RyaW5nIHN0cnVjdF9yZWFkZXIodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIGNsc05hbWUpOworCisgIHN0ZDo6c3RyaW5nIG1hcF93cml0ZXIodF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBsaXN0X3dyaXRlcih0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgc2V0X3dyaXRlcih0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHN0cnVjdF93cml0ZXIodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIGZuYW1lKTsKKworICBzdGQ6OnN0cmluZyB3cml0ZV92YWwodF90eXBlKiB0LCBzdGQ6OnN0cmluZyBmbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHJlYWRfdmFsKHRfdHlwZSogdCk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHN0X2F1dG9nZW5fY29tbWVudCgpOworCisgIHZvaWQgc3RfY2xhc3NfZGVmKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgdm9pZCBzdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHZvaWQgc3RfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIGNhdGVnb3J5KTsKKyAgdm9pZCBzdF9jbG9zZV9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQpOworICB2b2lkIHN0X2NsYXNzX21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgdm9pZCBzdF9jbGFzc19tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgY2F0ZWdvcnkpOworICB2b2lkIHN0X3NldHRlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlKTsKKyAgdm9pZCBzdF9nZXR0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHZvaWQgc3RfYWNjZXNzb3JzKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGUpOworCisgIHN0ZDo6c3RyaW5nIGNsYXNzX25hbWUoKTsKKyAgc3RhdGljIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKTsKKyAgc3RkOjpzdHJpbmcgY2xpZW50X2NsYXNzX25hbWUoKTsKKyAgc3RkOjpzdHJpbmcgcHJlZml4KHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3R5cGVzX2NvbW1lbnQodF9mdW5jdGlvbiogZm4pOworCisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgYV90eXBlKHRfdHlwZSogdHlwZSk7CisgIGJvb2wgaXNfdm93ZWwoY2hhciBjKTsKKyAgc3RkOjpzdHJpbmcgdGVtcF9uYW1lKCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlZF9jYXRlZ29yeSgpOworCitwcml2YXRlOgorICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworICBpbnQgdGVtcG9yYXJ5X3ZhcjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICB0ZW1wb3JhcnlfdmFyID0gMDsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX25hbWUgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICIuc3QiOworICBmXy5vcGVuKGZfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl8gPDwgc3RfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBzdF9jbGFzc19kZWYoZl8sIHByb2dyYW1fbmFtZV8pOworICBnZW5lcmF0ZV9jbGFzc19zaWRlX2RlZmluaXRpb24oKTsKKworICAvLyBHZW5lcmF0ZSBlbnVtcworICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7CisgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7CisgIH0KK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpjbGFzc19uYW1lKCkgeworICByZXR1cm4gY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKTsKK30KKworYm9vbCB0X3N0X2dlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7CisgIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJwcmVmaXgiIHx8IHN1Yl9uYW1lc3BhY2UgPT0gImNhdGVnb3J5IjsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpwcmVmaXgoc3RyaW5nIGNsYXNzX25hbWUpIHsKKyAgc3RyaW5nIHByZWZpeCA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsucHJlZml4Iik7CisgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZShjbGFzc19uYW1lKTsKKyAgbmFtZSA9IHByZWZpeC5lbXB0eSgpID8gbmFtZSA6IChwcmVmaXggKyBuYW1lKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6Y2xpZW50X2NsYXNzX25hbWUoKSB7CisgIHJldHVybiBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIkNsaWVudCI7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzdF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybiBzdGQ6OnN0cmluZygiJyIpICsgIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIiArICJcbiIKKyAgICAgICAgICsgIkRPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiJyFcbiI7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcmNlX2NvbnN0cygpIHsKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtcyBrZXlzQW5kVmFsdWVzRG86IFs6ayA6diB8ICIgPDwgcHJlZml4KGNsYXNzX25hbWUoKSkKKyAgICAgPDwgIiBlbnVtcyBhdDogayBwdXQ6IHYgdmFsdWVdLiEiIDw8IGVuZGw7CisKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHMga2V5c0FuZFZhbHVlc0RvOiBbOmsgOnYgfCAiIDw8IHByZWZpeChjbGFzc19uYW1lKCkpCisgICAgIDw8ICIgY29uc3RhbnRzIGF0OiBrIHB1dDogdiB2YWx1ZV0uISIgPDwgZW5kbDsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBnZW5lcmF0ZV9mb3JjZV9jb25zdHMoKTsKKyAgZl8uY2xvc2UoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZWRfY2F0ZWdvcnkoKSB7CisgIHN0cmluZyBjYXQgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgic21hbGx0YWxrLmNhdGVnb3J5Iik7CisgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFRocmlmdCBncmFtbWFyLCB0aGUgY2F0ZWdvcnkgbXVzdAorICAvLyBiZSBwdW5jdHVhdGVkIGJ5IGRvdHMuICBSZXBsYWNlcyB0aGVtIHdpdGggZGFzaGVzIGhlcmUuCisgIGZvciAoY2hhciAmIGl0ZXIgOiBjYXQpIHsKKyAgICBpZiAoaXRlciA9PSAnLicpIHsKKyAgICAgIGl0ZXIgPSAnLSc7CisgICAgfQorICB9CisgIHJldHVybiBjYXQuc2l6ZSgpID8gY2F0IDogIkdlbmVyYXRlZC0iICsgY2xhc3NfbmFtZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gU21hbGx0YWxrLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfZGVmKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgeworICBvdXQgPDwgIk9iamVjdCBzdWJjbGFzczogIyIgPDwgcHJlZml4KG5hbWUpIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImluc3RhbmNlVmFyaWFibGVOYW1lczogJyciIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNsYXNzVmFyaWFibGVOYW1lczogJyciCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwb29sRGljdGlvbmFyaWVzOiAnJyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiY2F0ZWdvcnk6ICciCisgICAgICA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyEiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgeworICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsICJhcyB5ZXQgdW5jYXRlZ29yaXplZCIpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbGFzc19tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7CisgIHN0X21ldGhvZChvdXQsIGNscyArICIgY2xhc3MiLCBuYW1lKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIGNhdGVnb3J5KSB7CisgIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSwgY2F0ZWdvcnkpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgY2F0ZWdvcnkpIHsKKyAgY2hhciB0aW1lc3RyWzUwXTsKKyAgdGltZV90IHJhd3RpbWU7CisgIHN0cnVjdCB0bSogdGluZm87CisKKyAgdGltZSgmcmF3dGltZSk7CisgIHRpbmZvID0gbG9jYWx0aW1lKCZyYXd0aW1lKTsKKyAgc3RyZnRpbWUodGltZXN0ciwgNTAsICIlbS8lZC8lWSAlSDolTSIsIHRpbmZvKTsKKworICBvdXQgPDwgIiEiIDw8IHByZWZpeChjbHMpIDw8ICIgbWV0aG9kc0ZvcjogJyIgKyBjYXRlZ29yeSArICInIHN0YW1wOiAndGhyaWZ0ICIgPDwgdGltZXN0cgorICAgICAgPDwgIichXG4iIDw8IG5hbWUgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbG9zZV9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgb3V0IDw8ICIhICEiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3Rfc2V0dGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHR5cGUgPSAiYW5PYmplY3QiKSB7CisgIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSArICI6ICIgKyB0eXBlKTsKKyAgb3V0IDw8IG5hbWUgPDwgIiA6PSAiICsgdHlwZTsKKyAgc3RfY2xvc2VfbWV0aG9kKG91dCk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2dldHRlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKKyAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lICsgIiIpOworICBvdXQgPDwgIl4gIiA8PCBuYW1lOworICBzdF9jbG9zZV9tZXRob2Qob3V0KTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfYWNjZXNzb3JzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHR5cGUgPSAiYW5PYmplY3QiKSB7CisgIHN0X3NldHRlcihvdXQsIGNscywgbmFtZSwgdHlwZSk7CisgIHN0X2dldHRlcihvdXQsIGNscywgbmFtZSk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpIHsKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjbGFzcyIgPDwgZW5kbCA8PCAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICdjb25zdGFudHMgZW51bXMnISIKKyAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0X2FjY2Vzc29ycyhmXywgY2xhc3NfbmFtZSgpICsgIiBjbGFzcyIsICJlbnVtcyIpOworICBzdF9hY2Nlc3NvcnMoZl8sIGNsYXNzX25hbWUoKSArICIgY2xhc3MiLCAiY29uc3RhbnRzIik7CisKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtczogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50czogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOworCisgIGZfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBjbHNfbmFtZSA9IHByb2dyYW1fbmFtZV8gKyBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKTsKKworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGF0OiAnIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiJyBwdXQ6IFsiCisgICAgIDw8ICIoRGljdGlvbmFyeSBuZXcgIiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGZfIDw8ICJcdGF0OiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicgcHV0OiAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgZl8gPDwgIlx0eW91cnNlbGYpXSEiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHMgYXQ6ICciIDw8IG5hbWUgPDwgIicgcHV0OiBbIgorICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICJdISIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICIoIiA8PCBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpIDw8ICIgbmV3ICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ5b3Vyc2VsZikiOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgIihEaWN0aW9uYXJ5IG5ldyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgImF0OiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiBwdXQ6ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICIoU2V0IG5ldyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIoT3JkZXJlZENvbGxlY3Rpb24gbmV3IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKTsKKyAgICAgIG91dCA8PCAiYWRkOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBTbWFsbHRhbGsgc3RydWN0CisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc21hbGx0YWxrIGNsYXNzIHRvIHJlcHJlc2VudCBhIHN0cnVjdAorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdF9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGlmIChpc19leGNlcHRpb24pCisgICAgb3V0IDw8ICJFcnJvciI7CisgIGVsc2UKKyAgICBvdXQgPDwgIk9iamVjdCI7CisKKyAgb3V0IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeCh0eXBlX25hbWUodHN0cnVjdCkpIDw8IGVuZGwgPDwgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnIjsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmJlZ2luKCkpCisgICAgICAgIG91dCA8PCAiICI7CisgICAgICBvdXQgPDwgY2FtZWxjYXNlKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICB9CisKKyAgb3V0IDw8ICInXG4iCisgICAgICA8PCAiXHRjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnXG4iCisgICAgICA8PCAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIgorICAgICAgPDwgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOworCisgIGdlbmVyYXRlX2FjY2Vzc29ycyhvdXQsIHRzdHJ1Y3QpOworfQorCitib29sIHRfc3RfZ2VuZXJhdG9yOjppc192b3dlbChjaGFyIGMpIHsKKyAgc3dpdGNoICh0b2xvd2VyKGMpKSB7CisgIGNhc2UgJ2EnOgorICBjYXNlICdlJzoKKyAgY2FzZSAnaSc6CisgIGNhc2UgJ28nOgorICBjYXNlICd1JzoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6YV90eXBlKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcHJlZml4OworCisgIGlmIChpc192b3dlbCh0eXBlX25hbWUodHlwZSlbMF0pKQorICAgIHByZWZpeCA9ICJhbiI7CisgIGVsc2UKKyAgICBwcmVmaXggPSAiYSI7CisKKyAgcmV0dXJuIHByZWZpeCArIGNhcGl0YWxpemUodHlwZV9uYW1lKHR5cGUpKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfYWNjZXNzb3JzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBzdHJpbmcgdHlwZTsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgc3RfYWNjZXNzb3JzKG91dCwKKyAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKHR5cGVfbmFtZSh0c3RydWN0KSksCisgICAgICAgICAgICAgICAgICAgY2FtZWxjYXNlKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgYV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIC8vIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp0ZW1wX25hbWUoKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIG91dCA8PCAidGVtcCIgPDwgdGVtcG9yYXJ5X3ZhcisrOworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6Om1hcF93cml0ZXIodF9tYXAqIHRtYXAsIHN0cmluZyBmbmFtZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBzdHJpbmcga2V5ID0gdGVtcF9uYW1lKCk7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIltvcHJvdCB3cml0ZU1hcEJlZ2luOiAoVE1hcCBuZXcga2V5VHlwZTogIiA8PCB0eXBlX3RvX2VudW0odG1hcC0+Z2V0X2tleV90eXBlKCkpCisgICAgICA8PCAiOyB2YWx1ZVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRtYXAtPmdldF92YWxfdHlwZSgpKSA8PCAiOyBzaXplOiAiIDw8IGZuYW1lIDw8ICIgc2l6ZSkuIgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIga2V5c0FuZFZhbHVlc0RvOiBbOiIgPDwga2V5IDw8ICIgOiIgPDwgdmFsIDw8ICIgfCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KSA8PCAiLiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgd3JpdGVfdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlTWFwRW5kXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjptYXBfcmVhZGVyKHRfbWFwKiB0bWFwKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRNYXBCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdmFsCisgICAgICA8PCAiIDo9IERpY3Rpb25hcnkgbmV3LiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgc2l6ZSB0aW1lc1JlcGVhdDogWyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIGF0OiAiIDw8IHJlYWRfdmFsKHRtYXAtPmdldF9rZXlfdHlwZSgpKQorICAgICAgPDwgIiBwdXQ6ICIgPDwgcmVhZF92YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCkpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRNYXBFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpsaXN0X3dyaXRlcih0X2xpc3QqIHRsaXN0LCBzdHJpbmcgZm5hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW29wcm90IHdyaXRlTGlzdEJlZ2luOiAoVExpc3QgbmV3IGVsZW1UeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdmFsKSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlTGlzdEVuZF0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6bGlzdF9yZWFkZXIodF9saXN0KiB0bGlzdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7CisKKyAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRMaXN0QmVnaW4uIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gT3JkZXJlZENvbGxlY3Rpb24gbmV3LiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBkZXNjCisgICAgICA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhZGQ6ICIgPDwgcmVhZF92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZExpc3RFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzZXRfd3JpdGVyKHRfc2V0KiB0c2V0LCBzdHJpbmcgZm5hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW29wcm90IHdyaXRlU2V0QmVnaW46IChUU2V0IG5ldyBlbGVtVHlwZTogIiA8PCB0eXBlX3RvX2VudW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVTZXRFbmRdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnNldF9yZWFkZXIodF9zZXQqIHRzZXQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkU2V0QmVnaW4uIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gU2V0IG5ldy4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYWRkOiAiIDw8IHJlYWRfdmFsKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZFNldEVuZC4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0cnVjdF93cml0ZXIodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBzbmFtZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisKKyAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVTdHJ1Y3RCZWdpbjogIgorICAgICAgPDwgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiJykuIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIGJvb2wgb3B0aW9uYWwgPSAoKmZsZF9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgc3RyaW5nIGZuYW1lID0gY2FtZWxjYXNlKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBzdHJpbmcgYWNjZXNzb3IgPSBzbmFtZSArICIgIiArIGNhbWVsY2FzZShmbmFtZSk7CisKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBhY2Nlc3NvciA8PCAiIGlmTm90TmlsOiBbIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkQmVnaW46IChURmllbGQgbmV3IG5hbWU6ICciIDw8IGZuYW1lCisgICAgICAgIDw8ICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgPDwgIjsgaWQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiKS4iIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpLCBhY2Nlc3NvcikgPDwgIi4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIm9wcm90IHdyaXRlRmllbGRFbmQiOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBvdXQgPDwgIl0iOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBvdXQgPDwgIi4iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRTdG9wOyB3cml0ZVN0cnVjdEVuZF0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RydWN0X3JlYWRlcih0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIGNsc05hbWUgPSAiIikgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgZm91bmQgPSB0ZW1wX25hbWUoKTsKKworICBpZiAoY2xzTmFtZS5zaXplKCkgPT0gMCkgeworICAgIGNsc05hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICB9CisKKyAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBUaGlzIGlzIG5hc3R5LCBidXQgd2l0aG91dCBpdCB3ZSdsbCBicmVhayB0aGluZ3MgYnkgcHJlZml4aW5nIFRSZXN1bHQuCisgIHN0cmluZyBuYW1lID0gKChjYXBpdGFsaXplKGNsc05hbWUpID09ICJUUmVzdWx0IikgPyBjYXBpdGFsaXplKGNsc05hbWUpIDogcHJlZml4KGNsc05hbWUpKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9ICIgPDwgbmFtZSA8PCAiIG5ldy4iIDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdCByZWFkU3RydWN0QmVnaW4uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJbIiA8PCBkZXNjCisgICAgICA8PCAiIDo9IGlwcm90IHJlYWRGaWVsZEJlZ2luLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBkZXNjCisgICAgICA8PCAiIHR5cGUgPSBUVHlwZSBzdG9wXSB3aGlsZUZhbHNlOiBbfCIgPDwgZm91bmQgPDwgInwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiBpZCA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiIGlmVHJ1ZTogWyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBmb3VuZCA8PCAiIDo9IHRydWUuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiICIKKyAgICAgICAgPDwgY2FtZWxjYXNlKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiAiIDw8IHJlYWRfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgb3V0IDw8ICJdLiIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCBmb3VuZCA8PCAiIGlmTmlsOiBbaXByb3Qgc2tpcDogIiA8PCBkZXNjIDw8ICIgdHlwZV1dLiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHJlYWRTdHJ1Y3RFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp3cml0ZV92YWwodF90eXBlKiB0LCBzdHJpbmcgZm5hbWUpIHsKKyAgdCA9IGdldF90cnVlX3R5cGUodCk7CisKKyAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiaXByb3Qgd3JpdGVEb3VibGU6ICIgKyBmbmFtZSArICIgYXNGbG9hdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJpcHJvdCB3cml0ZSIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSkgKyAiOiAiICsgZm5hbWUgKyAiIGFzSW50ZWdlciI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lOworICAgIH0KKyAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgeworICAgIHJldHVybiBtYXBfd3JpdGVyKCh0X21hcCopdCwgZm5hbWUpOworICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gc3RydWN0X3dyaXRlcigodF9zdHJ1Y3QqKXQsIGZuYW1lKTsKKyAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gbGlzdF93cml0ZXIoKHRfbGlzdCopdCwgZm5hbWUpOworICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuIHNldF93cml0ZXIoKHRfc2V0Kil0LCBmbmFtZSk7CisgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpcHJvdCB3cml0ZUkzMjogIiArIGZuYW1lOworICB9IGVsc2UgeworICAgIHRocm93ICJTb3JyeSwgSSBkb24ndCBrbm93IGhvdyB0byB3cml0ZSB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOworICB9Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6cmVhZF92YWwodF90eXBlKiB0KSB7CisgIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOworCisgIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiAiaXByb3QgcmVhZCIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSk7CisgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gbWFwX3JlYWRlcigodF9tYXAqKXQpOworICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gc3RydWN0X3JlYWRlcigodF9zdHJ1Y3QqKXQpOworICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiBsaXN0X3JlYWRlcigodF9saXN0Kil0KTsKKyAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgIHJldHVybiBzZXRfcmVhZGVyKCh0X3NldCopdCk7CisgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpcHJvdCByZWFkSTMyIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gcmVhZCB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOworICB9Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlbmRfbWV0aG9kKHRfZnVuY3Rpb24qIGZ1bmN0aW9uKSB7CisgIHN0cmluZyBmdW5uYW1lID0gZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKworICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksICJzZW5kIiArIGNhcGl0YWxpemUoc2lnbmF0dXJlKSk7CisgIGZfIDw8ICJvcHJvdCB3cml0ZU1lc3NhZ2VCZWdpbjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfIDw8IGluZGVudCgpIDw8ICIoVENhbGxNZXNzYWdlIG5ldyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm5hbWU6ICciIDw8IGZ1bm5hbWUgPDwgIic7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VxaWQ6IHNlbGYgbmV4dFNlcWlkKS4iCisgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlU3RydWN0QmVnaW46ICIKKyAgICAgPDwgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIGNhcGl0YWxpemUoY2FtZWxjYXNlKGZ1bm5hbWUpKSArICJfYXJncycpLiIgPDwgZW5kbDsKKworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIHN0cmluZyBmbmFtZSA9IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICBmXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEJlZ2luOiAoVEZpZWxkIG5ldyBuYW1lOiAnIiA8PCBmbmFtZQorICAgICAgIDw8ICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsgaWQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKQorICAgICAgIDw8ICIpLiIgPDwgZW5kbDsKKworICAgIGZfIDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSwgZm5hbWUpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgPDwgIm9wcm90IHdyaXRlRmllbGRFbmQuIiA8PCBlbmRsOworICB9CisKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRTdG9wOyB3cml0ZVN0cnVjdEVuZDsgd3JpdGVNZXNzYWdlRW5kLiIgPDwgZW5kbDsKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHRyYW5zcG9ydCBmbHVzaCI7CisKKyAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKK30KKworLy8gV2Ugb25seSBzdXBwb3J0IHJlY2VpdmluZyBUUmVzdWx0IHN0cnVjdHVyZXMgKHNvIHRoaXMgd29uJ3Qgd29yayBvbiB0aGUgc2VydmVyIHNpZGUpCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWN2X21ldGhvZCh0X2Z1bmN0aW9uKiBmdW5jdGlvbikgeworICBzdHJpbmcgZnVubmFtZSA9IGNhbWVsY2FzZShmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOworCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgIlRSZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKworICB0X3N0cnVjdCogeHMgPSBmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8vIGR1cGxpY2F0ZSB0aGUgZmllbGQsIGJ1dCBjYWxsIGl0ICJleGNlcHRpb24iLi4uIHdlIGRvbid0IG5lZWQgYSBkeW5hbWljIG5hbWUKKyAgICB0X2ZpZWxkKiBleGNlcHRpb24gPSBuZXcgdF9maWVsZCgoKmZfaXRlciktPmdldF90eXBlKCksICJleGNlcHRpb24iLCAoKmZfaXRlciktPmdldF9rZXkoKSk7CisgICAgcmVzdWx0LmFwcGVuZChleGNlcHRpb24pOworICB9CisKKyAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCAicmVjdiIgKyBjYXBpdGFsaXplKGZ1bm5hbWUpKTsKKyAgZl8gPDwgInwgZiBtc2cgcmVzIHwgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJtc2cgOj0gb3Byb3QgcmVhZE1lc3NhZ2VCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgPDwgInNlbGYgdmFsaWRhdGVSZW1vdGVNZXNzYWdlOiBtc2cuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgIDw8ICJyZXMgOj0gIiA8PCBzdHJ1Y3RfcmVhZGVyKCZyZXN1bHQpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCByZWFkTWVzc2FnZUVuZC4iCisgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHRyYW5zcG9ydCBmbHVzaC4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgPDwgInJlcyBleGNlcHRpb24gaWZOb3ROaWw6IFtyZXMgZXhjZXB0aW9uIHNpZ25hbF0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJeIHJlcyI7CisgIHN0X2Nsb3NlX21ldGhvZChmXyk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbikgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBmbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCAiXCIiOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKChmX2l0ZXIgKyAxKSAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKyAgfQorCisgIG91dCA8PCAiXCIiOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICJUQ2xpZW50IjsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiQ2xpZW50IjsKKyAgfQorCisgIGZfIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChjbGllbnRfY2xhc3NfbmFtZSgpKSA8PCBlbmRsCisgICAgIDw8ICJcdGluc3RhbmNlVmFyaWFibGVOYW1lczogJydcbiIKKyAgICAgPDwgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIgorICAgICA8PCAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIgorICAgICA8PCAiXHRjYXRlZ29yeTogJyIgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichXG5cbiI7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisKKyAgICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksIHNpZ25hdHVyZSk7CisgICAgZl8gPDwgZnVuY3Rpb25fdHlwZXNfY29tbWVudCgqZl9pdGVyKSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZWxmIHNlbmQiCisgICAgICAgPDwgY2FwaXRhbGl6ZShzaWduYXR1cmUpIDw8ICIuIiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmXyA8PCBpbmRlbnQoKSA8PCAiXiBzZWxmIHJlY3YiIDw8IGNhcGl0YWxpemUoZnVubmFtZSkgPDwgIiBzdWNjZXNzICIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdF9jbG9zZV9tZXRob2QoZl8pOworCisgICAgZ2VuZXJhdGVfc2VuZF9tZXRob2QoKmZfaXRlcik7CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBnZW5lcmF0ZV9yZWN2X21ldGhvZCgqZl9pdGVyKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gY2FtZWxjYXNlKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyBjYXBpdGFsaXplKGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgIjsKKyAgICB9CisgICAgc3RyaW5nIG5hbWUgPSBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICByZXN1bHQgKz0gbmFtZSArICI6ICIgKyBuYW1lOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgICBwcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIl90eXBlcy4iOworICAgIH0KKyAgfQorCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0KKworICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworLyogQ29udmVydCB0X3R5cGUgdG8gU21hbGx0YWxrIHR5cGUgY29kZSAqLworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZSBzdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUgYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUgYnl0ZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlIGkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlIGkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlIGk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlIGRvdWJsZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUgaTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZSBzdHJ1Y3QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZSBtYXAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZSBzZXQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUgbGlzdCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1Ioc3QsICJTbWFsbHRhbGsiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9zd2lmdF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3NDZjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzE5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzZXQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBTd2lmdCAzIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIERlc2lnbmVkIGZyb20gdGhlIFN3aWZ0L0NvY29hIGNvZGUgZ2VuZXJhdG9yKHMpCisgKi8KK2NsYXNzIHRfc3dpZnRfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfc3dpZnRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgbG9nX3VuZXhwZWN0ZWRfID0gZmFsc2U7CisgICAgYXN5bmNfY2xpZW50c18gPSBmYWxzZTsKKyAgICBkZWJ1Z19kZXNjcmlwdGlvbnNfID0gZmFsc2U7CisgICAgbm9fc3RyaWN0XyA9IGZhbHNlOworICAgIG5hbWVzcGFjZWRfID0gZmFsc2U7CisgICAgZ2VuX2NvY29hXyA9IGZhbHNlOworICAgIHByb21pc2Vfa2l0XyA9IGZhbHNlOworICAgIHNhZmVfZW51bXNfID0gZmFsc2U7CisKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJsb2dfdW5leHBlY3RlZCIpID09IDApIHsKKyAgICAgICAgbG9nX3VuZXhwZWN0ZWRfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYXN5bmNfY2xpZW50cyIpID09IDApIHsKKyAgICAgICAgYXN5bmNfY2xpZW50c18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19zdHJpY3QiKSA9PSAwKSB7CisgICAgICAgIG5vX3N0cmljdF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJkZWJ1Z19kZXNjcmlwdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGRlYnVnX2Rlc2NyaXB0aW9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJuYW1lc3BhY2VkIikgPT0gMCkgeworICAgICAgICBuYW1lc3BhY2VkXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNvY29hIikgPT0gMCkgeworICAgICAgICBnZW5fY29jb2FfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic2FmZV9lbnVtcyIpID09IDApIHsKKyAgICAgICAgc2FmZV9lbnVtc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwcm9taXNlX2tpdCIpID09IDApIHsKKyAgICAgICAgaWYgKGdlbl9jb2NvYV8gPT0gZmFsc2UpIHsKKyAgICAgICAgICB0aHJvdyAiUHJvbWlzZUtpdCBvbmx5IGF2YWlsYWJsZSB3aXRoIFN3aWZ0IDIueCwgdXNlIGBjb2NvYWAgb3B0aW9uIiArIGl0ZXItPmZpcnN0OworICAgICAgICB9CisgICAgICAgIHByb21pc2Vfa2l0XyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gc3dpZnQ6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXN3aWZ0IjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSBvdmVycmlkZTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgb3ZlcnJpZGU7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIG92ZXJyaWRlOworCisKKyAgdm9pZCByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2luaXQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2hhc2hhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2VxdWF0YWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3RocmlmdF9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3ByaXZhdGUpOworCisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfcHJpbnRhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF91bmlvbl9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RyaW5nIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RyaW5nIGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfcHJvdG9jb2xfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3NlcnZlcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdHJpbmcgc3dpZnRfaW1wb3J0cygpOworICBzdHJpbmcgc3dpZnRfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGlzX29wdGlvbmFsPWZhbHNlLCBib29sIGlzX2ZvcmNlZD1mYWxzZSk7CisgIHN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOworICBzdHJpbmcgZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RyaW5nIGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisKKyAgc3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcm90b2NvbF9uYW1lLCBib29sIGlzX2ludGVybmFsKTsKKyAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlLCBib29sIHF1YWxpZmllZD1mYWxzZSk7CisgIHN0cmluZyBtYXliZV9lc2NhcGVfaWRlbnRpZmllcihjb25zdCBzdHJpbmcmIGlkZW50aWZpZXIpOworICB2b2lkIHBvcHVsYXRlX3Jlc2VydmVkX3dvcmRzKCk7CisgIC8qKiBTd2lmdCAzIHNwZWNpZmljICovCisgIHN0cmluZyBlbnVtX2Nhc2VfbmFtZSh0X2VudW1fdmFsdWUqIHRlbnVtX2Nhc2UsIGJvb2wgZGVjbGFyYXRpb24pOworICBzdHJpbmcgZW51bV9jb25zdF9uYW1lKHN0cmluZyBlbnVtX2lkZW50aWZpZXIpOworICB2b2lkIGZ1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgYXN5bmNfZnVuY3Rpb25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCBzdHJpbmcmIGRvYyk7CisKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgY2FycnlvdmVyICovCisgIHN0cmluZyBwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdHJpbmcgZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCx0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19wcml2YXRlKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqLworICB2b2lkIGdlbmVyYXRlX29sZF9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9zd2lmdF9tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJzd2lmdCIpOworICAgIGlmIChyZWFsX21vZHVsZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlYWxfbW9kdWxlOworICB9Citwcml2YXRlOgorCisgIHZvaWQgYmxvY2tfb3Blbihvc3RyZWFtJiBvdXQpIHsKKyAgICBvdXQgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgdm9pZCBibG9ja19jbG9zZShvc3RyZWFtJiBvdXQsIGJvb2wgZW5kX2xpbmU9dHJ1ZSkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICAgIGlmIChlbmRfbGluZSkgb3V0IDw8IGVuZGw7CisgIH0KKworICBib29sIGZpZWxkX2lzX29wdGlvbmFsKHRfZmllbGQqIHRmaWVsZCkgeworICAgIGJvb2wgb3B0ID0gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAodGZpZWxkLT5hbm5vdGF0aW9uc18uZmluZCgic3dpZnQubnVsbGFibGUiKSAhPSB0ZmllbGQtPmFubm90YXRpb25zXy5lbmQoKSAmJiB0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvcHQgPSB0cnVlOworICAgIH0KKyAgICBpZiAoZ2VuX2NvY29hXykgeyAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgb25seSBpZiBpdHMgYWN0dWFsbHkgIm9wdGlvbmFsIgorICAgICAgb3B0ID0gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICB9CisgICAgcmV0dXJuIG9wdDsKKyAgfQorCisgIGJvb2wgc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCFmaWVsZF9pc19vcHRpb25hbCgqbV9pdGVyKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBzdHJ1Y3RfaGFzX29wdGlvbmFsX2ZpZWxkcyh0X3N0cnVjdCogdHN0cnVjdCkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmllbGRfaXNfb3B0aW9uYWwoKm1faXRlcikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0cmluZyBjb25zdGFudHNfZGVjbGFyYXRpb25zXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9kZWNsXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2ltcGxfOworCisgIGJvb2wgbG9nX3VuZXhwZWN0ZWRfOworICBib29sIGFzeW5jX2NsaWVudHNfOworCisgIGJvb2wgZGVidWdfZGVzY3JpcHRpb25zXzsKKyAgYm9vbCBub19zdHJpY3RfOworICBib29sIG5hbWVzcGFjZWRfOworICBib29sIHNhZmVfZW51bXNfOworICBzZXQ8c3RyaW5nPiBzd2lmdF9yZXNlcnZlZF93b3Jkc187CisKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgY29tcGF0aWJpbGl0eSAqLworICBib29sIGdlbl9jb2NvYV87CisgIGJvb2wgcHJvbWlzZV9raXRfOworCit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbV8pOworICBzdHJpbmcgb3V0X2RpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZyBtb2R1bGVfcGF0aCA9IG91dF9kaXI7CisgIHN0cmluZyBuYW1lID0gcHJvZ3JhbV9uYW1lXzsKKyAgaWYgKG5hbWVzcGFjZWRfICYmICFtb2R1bGUuZW1wdHkoKSkgeworICAgIG1vZHVsZV9wYXRoID0gbW9kdWxlX3BhdGggKyAiLyIgKyBtb2R1bGU7CisgICAgbmFtZSA9IG1vZHVsZTsKKyAgfQorICBNS0RJUihtb2R1bGVfcGF0aC5jX3N0cigpKTsKKworICBwb3B1bGF0ZV9yZXNlcnZlZF93b3JkcygpOworCisgIC8vIHdlIGhhdmUgYSAuc3dpZnQgZGVjbGFyYXRpb25zIGZpbGUuLi4KKyAgc3RyaW5nIGZfZGVjbF9uYW1lID0gbmFtZSArICIuc3dpZnQiOworICBzdHJpbmcgZl9kZWNsX2Z1bGxuYW1lID0gbW9kdWxlX3BhdGggKyAiLyIgKyBmX2RlY2xfbmFtZTsKKyAgZl9kZWNsXy5vcGVuKGZfZGVjbF9mdWxsbmFtZS5jX3N0cigpKTsKKworICBmX2RlY2xfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgZl9kZWNsXyA8PCBzd2lmdF9pbXBvcnRzKCkgPDwgc3dpZnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworCisgIC8vIC4uLmFuZCBhIC5zd2lmdCBpbXBsZW1lbnRhdGlvbiBleHRlbnNpb25zIGZpbGUKKyAgc3RyaW5nIGZfaW1wbF9uYW1lID0gbmFtZSArICIrRXh0cy5zd2lmdCI7CisgIHN0cmluZyBmX2ltcGxfZnVsbG5hbWUgPSBtb2R1bGVfcGF0aCArICIvIiArIGZfaW1wbF9uYW1lOworICBmX2ltcGxfLm9wZW4oZl9pbXBsX2Z1bGxuYW1lLmNfc3RyKCkpOworCisgIGZfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IHN3aWZ0X2ltcG9ydHMoKSA8PCBzd2lmdF90aHJpZnRfaW1wb3J0cygpIDw8IGVuZGw7CisKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgQ29jb2EgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBDb2NvYSBsaWJyYXJpZXMKKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpzd2lmdF9pbXBvcnRzKCkgeworCisgIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVzX2xpc3Q7CisgIGluY2x1ZGVzX2xpc3QuZW1wbGFjZV9iYWNrKCJGb3VuZGF0aW9uIik7CisKKyAgb3N0cmluZ3N0cmVhbSBpbmNsdWRlczsKKworICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOworICBmb3IgKGlfaXRlcj1pbmNsdWRlc19saXN0LmJlZ2luKCk7IGlfaXRlciE9aW5jbHVkZXNfbGlzdC5lbmQoKTsgKytpX2l0ZXIpIHsKKyAgICBpbmNsdWRlcyA8PCAiaW1wb3J0ICIgPDwgKmlfaXRlciA8PCBlbmRsOworICB9CisKKyAgaWYgKG5hbWVzcGFjZWRfKSB7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBwcm9ncmFtX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICAgIGZvciAoYXV0byBwcm9ncmFtX2luY2x1ZGUgOiBwcm9ncmFtX2luY2x1ZGVzKSB7CisgICAgICBpbmNsdWRlcyA8PCAoImltcG9ydCAiICsgZ2V0X3JlYWxfc3dpZnRfbW9kdWxlKHByb2dyYW1faW5jbHVkZSkpIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluY2x1ZGVzIDw8IGVuZGw7CisKKyAgcmV0dXJuIGluY2x1ZGVzLnN0cigpOworfQorCisvKioKKyAqIFByaW50cyBUaHJpZnQgcnVudGltZSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBUaHJpZnQgcnVudGltZQorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OnN3aWZ0X3RocmlmdF9pbXBvcnRzKCkgeworCisgIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVzX2xpc3Q7CisgIGluY2x1ZGVzX2xpc3QuZW1wbGFjZV9iYWNrKCJUaHJpZnQiKTsKKworICBpZiAoZ2VuX2NvY29hXyAmJiBwcm9taXNlX2tpdF8pIHsKKyAgICBpbmNsdWRlc19saXN0LmVtcGxhY2VfYmFjaygiUHJvbWlzZUtpdCIpOworICB9CisKKyAgb3N0cmluZ3N0cmVhbSBpbmNsdWRlczsKKworICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOworICBmb3IgKGlfaXRlcj1pbmNsdWRlc19saXN0LmJlZ2luKCk7IGlfaXRlciE9aW5jbHVkZXNfbGlzdC5lbmQoKTsgKytpX2l0ZXIpIHsKKyAgICBpbmNsdWRlcyA8PCAiaW1wb3J0ICIgPDwgKmlfaXRlciA8PCBlbmRsOworICB9CisKKyAgaW5jbHVkZXMgPDwgZW5kbDsKKworICByZXR1cm4gaW5jbHVkZXMuc3RyKCk7Cit9CisKKy8qKgorICogRmluaXNoIHVwIGdlbmVyYXRpb24uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gc3RpY2sgb3VyIGNvbnN0YW50cyBkZWNsYXJhdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyIGZpbGUKKyAgLy8gc2luY2UgdGhleSByZWZlciB0byB0aGluZ3Mgd2UgYXJlIGRlZmluaW5nLgorICBmX2RlY2xfIDw8IGNvbnN0YW50c19kZWNsYXJhdGlvbnNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIDEtbGluZXIgaW4gU3dpZnQKKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIHR5cGVhbGlhcyAiIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKQorICAgICAgICAgIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+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+aXNfc2V0KCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiU0VUIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJMSVNUIjsKKyAgICB9CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBzd2lmdCwKKyAgICAiU3dpZnQgMy4wIiwKKyAgICAiICAgIGxvZ191bmV4cGVjdGVkOiAgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLlxuIgorICAgICIgICAgZGVidWdfZGVzY3JpcHRpb25zOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvblxuIgorICAgICIgICAgYXN5bmNfY2xpZW50czogICBHZW5lcmF0ZSBjbGllbnRzIHdoaWNoIGludm9rZSBhc3luY2hyb25vdXNseSB2aWEgYmxvY2sgc3ludGF4LlxuIgorICAgICIgICAgbmFtZXNwYWNlZDogICAgICBHZW5lcmF0ZSBzb3VyY2UgaW4gTW9kdWxlIHNjb3BlZCBvdXRwdXQgZGlyZWN0b3JpZXMgZm9yIFN3aWZ0IE5hbWVzcGFjaW5nLlxuIgorICAgICIgICAgY29jb2E6ICAgICAgICAgICBHZW5lcmF0ZSBTd2lmdCAyLnggY29kZSBjb21wYXRpYmxlIHdpdGggdGhlIFRocmlmdC9Db2NvYSBsaWJyYXJ5XG4iCisgICAgIiAgICBwcm9taXNlX2tpdDogICAgIEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBwcm9taXNlcyAob25seSB1c2Ugd2l0aCBjb2NvYSBmbGFnKVxuIgorICAgICIgICAgc2FmZV9lbnVtczogICAgICBHZW5lcmF0ZSBlbnVtIHR5cGVzIHdpdGggYW4gdW5rbm93biBjYXNlIHRvIGhhbmRsZSB1bnNwZWNpZmllZCB2YWx1ZXMgcmF0aGVyIHRoYW4gdGhyb3cgYSBzZXJpYWxpemF0aW9uIGVycm9yXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94bWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94bWxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjkyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3htbF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw2OTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzdGFjazsKK3VzaW5nIHN0ZDo6c2V0OworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOworc3RhdGljIGNvbnN0IHN0cmluZyBxdW90ID0gIlwiIjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBkZWZhdWx0X25zX3ByZWZpeCA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcveG1sL25zLyI7CisKKy8qKgorICogVGhpcyBnZW5lcmF0b3IgY3JlYXRlcyBhbiBYTUwgbW9kZWwgb2YgdGhlIHBhcnNlZCBJREwgdHJlZSwgYW5kIGlzIGRlc2lnbmVkCisgKiB0byBtYWtlIGl0IGVhc3kgdG8gdXNlIHRoaXMgZmlsZSBhcyB0aGUgaW5wdXQgZm9yIG90aGVyIHRlbXBsYXRlIGVuZ2luZXMsCisgKiBzdWNoIGFzIFhTTFQuICBUbyB0aGlzIGVuZCwgdGhlIGdlbmVyYXRlZCBYTUwgaXMgc2xpZ2h0bHkgbW9yZSB2ZXJib3NlIHRoYW4KKyAqIHlvdSBtaWdodCBleHBlY3QuLi4gZm9yIGV4YW1wbGUsIHJlZmVyZW5jZXMgdG8gImlkIiB0eXBlcyAoc3VjaCBhcyBzdHJ1Y3RzLAorICogdW5pb25zLCBldGMpIGFsd2F5cyBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBJREwgZG9jdW1lbnQsIGV2ZW4gaWYgdGhlIHR5cGUKKyAqIGlzIGRlZmluZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgYXMgdGhlIHJlZmVyZW5jZS4KKyAqLworY2xhc3MgdF94bWxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF94bWxfZ2VuZXJhdG9yKCB0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgc2hvdWxkX21lcmdlX2luY2x1ZGVzXyA9IGZhbHNlOworICAgIHNob3VsZF91c2VfZGVmYXVsdF9uc18gPSB0cnVlOworICAgIHNob3VsZF91c2VfbmFtZXNwYWNlc18gPSB0cnVlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm1lcmdlIikgPT0gMCkgeworICAgICAgICBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fZGVmYXVsdF9ucyIpID09IDApIHsKKyAgICAgICAgc2hvdWxkX3VzZV9kZWZhdWx0X25zXyA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19uYW1lc3BhY2VzIikgPT0gMCkgeworICAgICAgICBzaG91bGRfdXNlX25hbWVzcGFjZXNfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24geG1sOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi14bWwiOworICB9CisKKyAgfnRfeG1sX2dlbmVyYXRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisgIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSgpIG92ZXJyaWRlOworCisgIHZvaWQgaXRlcmF0ZV9wcm9ncmFtKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jKTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZW5lcmF0ZV9hbm5vdGF0aW9ucyhzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zKTsKKworcHJpdmF0ZToKKyAgYm9vbCBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfOworICBib29sIHNob3VsZF91c2VfZGVmYXVsdF9uc187CisgIGJvb2wgc2hvdWxkX3VzZV9uYW1lc3BhY2VzXzsKKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfeG1sXzsKKworICBzdGQ6OnNldDxzdHJpbmc+IHByb2dyYW1zXzsKKyAgc3RkOjpzdGFjazxzdHJpbmc+IGVsZW1lbnRzXzsKKyAgYm9vbCB0b3BfZWxlbWVudF9pc19lbXB0eTsKKyAgYm9vbCB0b3BfZWxlbWVudF9pc19vcGVuOworCisgIHN0cmluZyB0YXJnZXRfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgIHZvaWQgd3JpdGVfZWxlbWVudF9zdGFydChjb25zdCBzdHJpbmcgbmFtZSk7CisgIHZvaWQgY2xvc2VfdG9wX2VsZW1lbnQoKTsKKyAgdm9pZCB3cml0ZV9lbGVtZW50X2VuZCgpOworICB2b2lkIHdyaXRlX2F0dHJpYnV0ZShzdHJpbmcga2V5LCBzdHJpbmcgdmFsKTsKKyAgdm9pZCB3cml0ZV9pbnRfYXR0cmlidXRlKHN0cmluZyBrZXksIGludCB2YWwpOworICBzdHJpbmcgZXNjYXBlX3htbF9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCk7CisKKyAgdm9pZCB3cml0ZV94bWxfY29tbWVudChzdHJpbmcgbXNnKTsKKworICB2b2lkIHdyaXRlX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHZvaWQgd3JpdGVfZG9jKHRfZG9jKiB0ZG9jKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RyaW5nIG51bWJlcl90b19zdHJpbmcoVCB0KSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgICBvdXQuaW1idWUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSk7CisgICAgb3V0LnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHMxMCk7CisgICAgb3V0IDw8IHQ7CisgICAgcmV0dXJuIG91dC5zdHIoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIHdyaXRlX251bWJlcihUIG4pIHsKKyAgICBmX3htbF8gPDwgbnVtYmVyX3RvX3N0cmluZyhuKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIHdyaXRlX2VsZW1lbnRfbnVtYmVyKHN0cmluZyBuYW1lLCBUIG4pIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0cmluZyhuYW1lLCBudW1iZXJfdG9fc3RyaW5nKG4pKTsKKyAgfQorCisgIHN0cmluZyBnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKTsKKworICB2b2lkIHdyaXRlX2VsZW1lbnRfc3RyaW5nKHN0cmluZyBuYW1lLCBzdHJpbmcgdmFsdWUpOworICB2b2lkIHdyaXRlX3ZhbHVlKHRfdHlwZSogdHZhbHVlKTsKKyAgdm9pZCB3cml0ZV9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgeG1sX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlxuIikgKyAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIiAqXG4iICsgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiI7CisgIH0KK307CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgZl94bWxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIueG1sIjsKKyAgZl94bWxfLm9wZW4oZl94bWxfbmFtZS5jX3N0cigpKTsKKworICB0b3BfZWxlbWVudF9pc19vcGVuID0gZmFsc2U7Cit9CisKK3N0cmluZyB0X3htbF9nZW5lcmF0b3I6OnRhcmdldF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbWFwOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdGVyOworICBtYXAgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKCJ4bWwiKTsKKyAgaWYgKChpdGVyID0gbWFwLmZpbmQoInRhcmdldE5hbWVzcGFjZSIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICB9CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VzKCk7CisgIGlmICgoaXRlciA9IG1hcC5maW5kKCJ4bWwiKSkgIT0gbWFwLmVuZCgpKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfbnNfcHJlZml4ICsgaXRlci0+c2Vjb25kOworICB9CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoIioiKTsKKyAgaWYgKChpdGVyID0gbWFwLmZpbmQoInhtbC50YXJnZXROYW1lc3BhY2UiKSkgIT0gbWFwLmVuZCgpKSB7CisgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKKyAgfQorICBtYXAgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlcygpOworICBpZiAoKGl0ZXIgPSBtYXAuZmluZCgiKiIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9uc19wcmVmaXggKyBpdGVyLT5zZWNvbmQ7CisgIH0KKyAgcmV0dXJuIGRlZmF1bHRfbnNfcHJlZml4ICsgcHJvZ3JhbS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX3htbF9jb21tZW50KHN0cmluZyBtc2cpIHsKKyAgY2xvc2VfdG9wX2VsZW1lbnQoKTsKKyAgLy8gVE9ETzogaW5kZW50IGFueSBFT0xzIHRoYXQgbWF5IG9jY3VyIHdpdGggbXNnCisgIC8vIFRPRE86IHByb3BlciBtc2cgZXNjYXBpbmcgbmVlZGVkPworICBmX3htbF8gPDwgaW5kZW50KCkgPDwgIjwhLS0gIiA8PCBtc2cgPDwgIiAtLT4iICA8PCBlbmRsOworICB0b3BfZWxlbWVudF9pc19lbXB0eSA9IGZhbHNlOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Y2xvc2VfdG9wX2VsZW1lbnQoKSB7CisgIGlmKCB0b3BfZWxlbWVudF9pc19vcGVuKSB7CisgICAgdG9wX2VsZW1lbnRfaXNfb3BlbiA9IGZhbHNlOworICAgIGlmIChlbGVtZW50c18uc2l6ZSgpID4gMCAmJiB0b3BfZWxlbWVudF9pc19lbXB0eSkgeworICAgICAgZl94bWxfIDw8ICI+IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZWxlbWVudF9zdGFydChzdHJpbmcgbmFtZSkgeworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXyAmJiAhc2hvdWxkX3VzZV9kZWZhdWx0X25zXykgeworICAgIG5hbWUgPSAiaWRsOiIgKyBuYW1lOworICB9CisgIGNsb3NlX3RvcF9lbGVtZW50KCk7CisgIGZfeG1sXyA8PCBpbmRlbnQoKSA8PCAiPCIgPDwgbmFtZTsKKyAgZWxlbWVudHNfLnB1c2gobmFtZSk7CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gdHJ1ZTsKKyAgdG9wX2VsZW1lbnRfaXNfb3BlbiA9IHRydWU7CisgIGluZGVudF91cCgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZWxlbWVudF9lbmQoKSB7CisgIGluZGVudF9kb3duKCk7CisgIGlmICh0b3BfZWxlbWVudF9pc19lbXB0eSAmJiB0b3BfZWxlbWVudF9pc19vcGVuKSB7CisgICAgZl94bWxfIDw8ICIgLz4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl94bWxfIDw8IGluZGVudCgpIDw8ICI8LyIgPDwgZWxlbWVudHNfLnRvcCgpIDw8ICI+IiA8PCBlbmRsOworICB9CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gZmFsc2U7CisgIGVsZW1lbnRzXy5wb3AoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2F0dHJpYnV0ZShzdHJpbmcga2V5LCBzdHJpbmcgdmFsKSB7CisgIGZfeG1sXyA8PCAiICIgPDwga2V5IDw8ICI9XCIiIDw8IGVzY2FwZV94bWxfc3RyaW5nKHZhbCkgPDwgIlwiIjsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2ludF9hdHRyaWJ1dGUoc3RyaW5nIGtleSwgaW50IHZhbCkgeworICB3cml0ZV9hdHRyaWJ1dGUoa2V5LCBudW1iZXJfdG9fc3RyaW5nKHZhbCkpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZWxlbWVudF9zdHJpbmcoc3RyaW5nIG5hbWUsIHN0cmluZyB2YWwpIHsKKyAgaWYgKHNob3VsZF91c2VfbmFtZXNwYWNlc18gJiYgIXNob3VsZF91c2VfZGVmYXVsdF9uc18pIHsKKyAgICBuYW1lID0gImlkbDoiICsgbmFtZTsKKyAgfQorICBjbG9zZV90b3BfZWxlbWVudCgpOworICB0b3BfZWxlbWVudF9pc19lbXB0eSA9IGZhbHNlOworICBmX3htbF8gPDwgaW5kZW50KCkKKyAgICA8PCAiPCIgPDwgbmFtZSA8PCAiPiIgPDwgZXNjYXBlX3htbF9zdHJpbmcodmFsKSA8PCAiPC8iIDw8IG5hbWUgPDwgIj4iCisgICAgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfeG1sX2dlbmVyYXRvcjo6ZXNjYXBlX3htbF9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgIGZvciAoY2hhciBpdGVyIDogaW5wdXQpIHsKKyAgICBzd2l0Y2ggKGl0ZXIpIHsKKyAgICBjYXNlICcmJzoKKyAgICAgIHNzIDw8ICImYW1wOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIHNzIDw8ICImcXVvdDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXCcnOgorICAgICAgc3MgPDwgIiZhcG9zOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgIHNzIDw8ICImbHQ7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgc3MgPDwgIiZndDsiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNzIDw8IGl0ZXI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBmX3htbF8uY2xvc2UoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7CisKKyAgaW5pdF9nZW5lcmF0b3IoKTsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJpZGwiKTsKKyAgaWYgKHNob3VsZF91c2VfbmFtZXNwYWNlc18pIHsKKyAgICBpZiAoc2hvdWxkX3VzZV9kZWZhdWx0X25zXykgeworICAgICAgd3JpdGVfYXR0cmlidXRlKCJ4bWxucyIsICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcveG1sL2lkbCIpOworICAgIH0KKyAgICB3cml0ZV9hdHRyaWJ1dGUoInhtbG5zOmlkbCIsICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcveG1sL2lkbCIpOworICB9CisKKyAgd3JpdGVfeG1sX2NvbW1lbnQoIHhtbF9hdXRvZ2VuX2NvbW1lbnQoKSk7CisKKyAgaXRlcmF0ZV9wcm9ncmFtKHByb2dyYW1fKTsKKworICB3cml0ZV9lbGVtZW50X2VuZCgpOworCisgIGNsb3NlX2dlbmVyYXRvcigpOworCit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjppdGVyYXRlX3Byb2dyYW0odF9wcm9ncmFtKiBwcm9ncmFtKSB7CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgiZG9jdW1lbnQiKTsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgcHJvZ3JhbS0+Z2V0X25hbWUoKSk7CisgIGlmIChzaG91bGRfdXNlX25hbWVzcGFjZXNfKSB7CisgICAgY29uc3Qgc3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHRhcmdldF9uYW1lc3BhY2UocHJvZ3JhbSk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiLCB0YXJnZXROYW1lc3BhY2UpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgieG1sbnM6IiArIHByb2dyYW0tPmdldF9uYW1lKCksIHRhcmdldE5hbWVzcGFjZSk7CisgIH0KKyAgd3JpdGVfZG9jKHByb2dyYW0pOworCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOworICB2ZWN0b3I8dF9wcm9ncmFtKj46OmNvbnN0X2l0ZXJhdG9yIGluY19pdDsKKyAgZm9yIChpbmNfaXQgPSBpbmNsdWRlcy5iZWdpbigpOyBpbmNfaXQgIT0gaW5jbHVkZXMuZW5kKCk7ICsraW5jX2l0KSB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgiaW5jbHVkZSIpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsICgqaW5jX2l0KS0+Z2V0X25hbWUoKSk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIG5hbWVzcGFjZXMgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlcygpOworICBtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBuc19pdDsKKyAgZm9yIChuc19pdCA9IG5hbWVzcGFjZXMuYmVnaW4oKTsgbnNfaXQgIT0gbmFtZXNwYWNlcy5lbmQoKTsgKytuc19pdCkgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoIm5hbWVzcGFjZSIpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIG5zX2l0LT5maXJzdCk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ2YWx1ZSIsIG5zX2l0LT5zZWNvbmQpOworICAgIGdlbmVyYXRlX2Fubm90YXRpb25zKHByb2dyYW0tPmdldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMobnNfaXQtPmZpcnN0KSk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIC8vIFRPRE86IGNhbiBjb25zdGFudHMgaGF2ZSBhbm5vdGF0aW9ucz8KKyAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtLT5nZXRfY29uc3RzKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jb25zdGFudCgqY19pdGVyKTsKKyAgfQorCisgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW0tPmdldF90eXBlZGVmcygpOworICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7CisgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgeworICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOworICB9CisKKyAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbS0+Z2V0X2VudW1zKCk7CisgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7CisgIH0KKworICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gcHJvZ3JhbS0+Z2V0X29iamVjdHMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKKyAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGdlbmVyYXRlX3hjZXB0aW9uKCpvX2l0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7CisgICAgfQorICB9CisKKyAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7CisgIH0KKworICB3cml0ZV9lbGVtZW50X2VuZCgpOworCisgIGlmIChzaG91bGRfbWVyZ2VfaW5jbHVkZXNfKSB7CisgICAgcHJvZ3JhbXNfLmluc2VydChwcm9ncmFtLT5nZXRfbmFtZSgpKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4gcHJvZ3JhbXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKKyAgICB2ZWN0b3I8dF9wcm9ncmFtKj46OmNvbnN0X2l0ZXJhdG9yIHByb2dfaXQ7CisgICAgZm9yIChwcm9nX2l0ID0gcHJvZ3JhbXMuYmVnaW4oKTsgcHJvZ19pdCAhPSBwcm9ncmFtcy5lbmQoKTsgKytwcm9nX2l0KSB7CisgICAgICBpZiAoIXByb2dyYW1zXy5jb3VudCgoKnByb2dfaXQpLT5nZXRfbmFtZSgpKSkgeworICAgICAgICBpdGVyYXRlX3Byb2dyYW0oKnByb2dfaXQpOworICAgICAgfQorICAgIH0KKyAgfQorCit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgidHlwZWRlZiIpOworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCB0dHlwZWRlZi0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2RvYyh0dHlwZWRlZik7CisgIHdyaXRlX3R5cGUodHR5cGVkZWYtPmdldF90cnVlX3R5cGUoKSk7CisgIGdlbmVyYXRlX2Fubm90YXRpb25zKHR0eXBlZGVmLT5hbm5vdGF0aW9uc18pOworICB3cml0ZV9lbGVtZW50X2VuZCgpOworICByZXR1cm47Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjp3cml0ZV90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgY29uc3Qgc3RyaW5nIHR5cGUgPSBnZXRfdHlwZV9uYW1lKHR0eXBlKTsKKyAgd3JpdGVfYXR0cmlidXRlKCJ0eXBlIiwgdHlwZSk7CisgIGlmICh0eXBlID09ICJpZCIpIHsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInR5cGUtbW9kdWxlIiwgdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgidHlwZS1pZCIsIHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlID09ICJsaXN0IikgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgiZWxlbVR5cGUiKTsKKyAgICB3cml0ZV90eXBlKGV0eXBlKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gInNldCIpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgiZWxlbVR5cGUiKTsKKyAgICB3cml0ZV90eXBlKGV0eXBlKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gIm1hcCIpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJrZXlUeXBlIik7CisgICAgd3JpdGVfdHlwZShrdHlwZSk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJ2YWx1ZVR5cGUiKTsKKyAgICB3cml0ZV90eXBlKHZ0eXBlKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjp3cml0ZV9kb2ModF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIHN0cmluZyBkb2MgPSB0ZG9jLT5nZXRfZG9jKCk7CisgICAgLy8gZm9yIHNvbWUgcmVhc29uIHRoZXJlIGFsd2F5cyBzZWVtcyB0byBiZSBhIHRyYWlsaW5nIG5ld2xpbmUgb24gZG9jCisgICAgLy8gY29tbWVudHM7IGxvb3AgYmVsb3cgbmFpdmVseSB0cmllcyB0byBzdHJpcCBvZmYgdHJhaWxpbmcgY3IvbGYKKyAgICBpbnQgbiA9IDA7CisgICAgZm9yIChzdHJpbmc6OnJldmVyc2VfaXRlcmF0b3IgaSA9IGRvYy5yYmVnaW4oKTsgaSAhPSBkb2MucmVuZCgpOyBpKyssbisrKSB7CisgICAgICBpZiAoKmkgIT0gJ1xuJyB8fCAqaSA9PSAnXHInKSB7CisgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgIGRvYy5lcmFzZShkb2MubGVuZ3RoKCkgLSBuKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgd3JpdGVfYXR0cmlidXRlKCJkb2MiLCBkb2MpOworICB9Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hbm5vdGF0aW9ucygKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zKSB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ZXI7CisgIGZvciAoaXRlciA9IGFubm90YXRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gYW5ub3RhdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImFubm90YXRpb24iKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoImtleSIsIGl0ZXItPmZpcnN0KTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInZhbHVlIiwgaXRlci0+c2Vjb25kKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdGFudCh0X2NvbnN0KiBjb24pIHsKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgiY29uc3QiKTsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgY29uLT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfZG9jKGNvbik7CisgIHdyaXRlX3R5cGUoY29uLT5nZXRfdHlwZSgpKTsKKyAgd3JpdGVfY29uc3RfdmFsdWUoY29uLT5nZXRfdmFsdWUoKSk7CisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjp3cml0ZV9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworCisgIHN3aXRjaCAodmFsdWUtPmdldF90eXBlKCkpIHsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICB3cml0ZV9lbGVtZW50X251bWJlcigiaW50IiwgdmFsdWUtPmdldF9pbnRlZ2VyKCkpOworICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgIHdyaXRlX2VsZW1lbnRfbnVtYmVyKCJkb3VibGUiLCB2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICB3cml0ZV9lbGVtZW50X3N0cmluZygic3RyaW5nIiwgdmFsdWUtPmdldF9zdHJpbmcoKSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOiB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgibGlzdCIpOworICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0ID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXQ7CisgICAgZm9yIChsaXQgPSBsaXN0LmJlZ2luKCk7IGxpdCAhPSBsaXN0LmVuZCgpOyArK2xpdCkgeworICAgICAgd3JpdGVfZWxlbWVudF9zdGFydCgiZW50cnkiKTsKKyAgICAgIHdyaXRlX2NvbnN0X3ZhbHVlKCpsaXQpOworICAgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICB9CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOiB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgibWFwIik7CisgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiBtYXAgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46Oml0ZXJhdG9yIG1pdDsKKyAgICBmb3IgKG1pdCA9IG1hcC5iZWdpbigpOyBtaXQgIT0gbWFwLmVuZCgpOyArK21pdCkgeworICAgICAgd3JpdGVfZWxlbWVudF9zdGFydCgiZW50cnkiKTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImtleSIpOworICAgICAgd3JpdGVfY29uc3RfdmFsdWUobWl0LT5maXJzdCk7CisgICAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgICAgd3JpdGVfZWxlbWVudF9zdGFydCgidmFsdWUiKTsKKyAgICAgIHdyaXRlX2NvbnN0X3ZhbHVlKG1pdC0+c2Vjb25kKTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgIH0KKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgIGJyZWFrOworICB9CisKKyAgZGVmYXVsdDoKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3htbF8gPDwgaW5kZW50KCkgPDwgIjxudWxsIC8+IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgYnJlYWs7CisgIH0KKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgiZW51bSIpOworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCB0ZW51bS0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2RvYyh0ZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7CisgIGZvciAodmFsX2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdmFsX2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZhbF9pdGVyKSB7CisgICAgdF9lbnVtX3ZhbHVlKiB2YWwgPSAoKnZhbF9pdGVyKTsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJtZW1iZXIiKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCB2YWwtPmdldF9uYW1lKCkpOworICAgIHdyaXRlX2ludF9hdHRyaWJ1dGUoInZhbHVlIiwgdmFsLT5nZXRfdmFsdWUoKSk7CisgICAgd3JpdGVfZG9jKHZhbCk7CisgICAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModmFsLT5hbm5vdGF0aW9uc18pOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyh0ZW51bS0+YW5ub3RhdGlvbnNfKTsKKworICB3cml0ZV9lbGVtZW50X2VuZCgpOworCit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICBzdHJpbmcgdGFnbmFtZSA9ICJzdHJ1Y3QiOworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIHRhZ25hbWUgPSAidW5pb24iOworICB9IGVsc2UgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICB0YWduYW1lID0gImV4Y2VwdGlvbiI7CisgIH0KKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KHRhZ25hbWUpOworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCB0c3RydWN0LT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfZG9jKHRzdHJ1Y3QpOworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1faXRlcjsKKyAgZm9yIChtZW1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImZpZWxkIik7CisgICAgZ2VuZXJhdGVfZmllbGQoKm1lbV9pdGVyKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModHN0cnVjdC0+YW5ub3RhdGlvbnNfKTsKKworICB3cml0ZV9lbGVtZW50X2VuZCgpOworCit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZCh0X2ZpZWxkKiBmaWVsZCkgeworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCBmaWVsZC0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2ludF9hdHRyaWJ1dGUoImZpZWxkLWlkIiwgZmllbGQtPmdldF9rZXkoKSk7CisgIHdyaXRlX2RvYyhmaWVsZCk7CisgIHN0cmluZyByZXF1aXJlZG5lc3M7CisgIHN3aXRjaCAoZmllbGQtPmdldF9yZXEoKSkgeworICBjYXNlIHRfZmllbGQ6OlRfUkVRVUlSRUQ6CisgICAgcmVxdWlyZWRuZXNzID0gInJlcXVpcmVkIjsKKyAgICBicmVhazsKKyAgY2FzZSB0X2ZpZWxkOjpUX09QVElPTkFMOgorICAgIHJlcXVpcmVkbmVzcyA9ICJvcHRpb25hbCI7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmVxdWlyZWRuZXNzID0gIiI7CisgICAgYnJlYWs7CisgIH0KKyAgaWYgKHJlcXVpcmVkbmVzcyAhPSAiIikgeworICAgIHdyaXRlX2F0dHJpYnV0ZSgicmVxdWlyZWQiLCByZXF1aXJlZG5lc3MpOworICB9CisgIHdyaXRlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICBpZiAoZmllbGQtPmdldF92YWx1ZSgpKSB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgiZGVmYXVsdCIpOworICAgIHdyaXRlX2NvbnN0X3ZhbHVlKGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyhmaWVsZC0+YW5ub3RhdGlvbnNfKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInNlcnZpY2UiKTsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdHNlcnZpY2UtPmdldF9uYW1lKCkpOworCisgIGlmIChzaG91bGRfdXNlX25hbWVzcGFjZXNfKSB7CisgICAgc3RyaW5nIHByb2dfbnMgPSB0YXJnZXRfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKTsKKyAgICBpZiAoKnByb2dfbnMucmJlZ2luKCkgIT0gJy8nKSB7CisgICAgICBwcm9nX25zLnB1c2hfYmFjaygnLycpOworICAgIH0KKyAgICBjb25zdCBzdHJpbmcgdG5zID0gcHJvZ19ucyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgdG5zKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInhtbG5zOnRucyIsIHRucyk7CisgIH0KKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICBjb25zdCB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInBhcmVudC1tb2R1bGUiLCBleHRlbmRzLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInBhcmVudC1pZCIsIGV4dGVuZHMtPmdldF9uYW1lKCkpOworICB9CisKKyAgd3JpdGVfZG9jKHRzZXJ2aWNlKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgZm9yICg7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyBmbl9pdGVyKyspIHsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbigqZm5faXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyh0c2VydmljZS0+YW5ub3RhdGlvbnNfKTsKKworICB3cml0ZV9lbGVtZW50X2VuZCgpOworCit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYykgeworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoIm1ldGhvZCIpOworCisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHRmdW5jLT5nZXRfbmFtZSgpKTsKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIHdyaXRlX2F0dHJpYnV0ZSgib25ld2F5IiwgInRydWUiKTsKKyAgfQorCisgIHdyaXRlX2RvYyh0ZnVuYyk7CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgicmV0dXJucyIpOworICB3cml0ZV90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7CisgIGZvciAoOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgiYXJnIik7CisgICAgZ2VuZXJhdGVfZmllbGQoKm1lbV9pdGVyKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gdGZ1bmMtPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKKyAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgidGhyb3dzIik7CisgICAgZ2VuZXJhdGVfZmllbGQoKmV4X2l0ZXIpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyh0ZnVuYy0+YW5ub3RhdGlvbnNfKTsKKworICB3cml0ZV9lbGVtZW50X2VuZCgpOworCit9CisKK3N0cmluZyB0X3htbF9nZW5lcmF0b3I6OmdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAibGlzdCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAic2V0IjsKKyAgfQorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJtYXAiOworICB9CisgIGlmICgodHR5cGUtPmlzX2VudW0oKSAgICApfHwKKyAgICAgICh0dHlwZS0+aXNfc3RydWN0KCkgICl8fAorICAgICAgKHR0eXBlLT5pc190eXBlZGVmKCkgKXx8CisgICAgICAodHR5cGUtPmlzX3hjZXB0aW9uKCkpKXsKKyAgICByZXR1cm4gImlkIjsKKyAgfQorICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNldHlwZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgaWYgKHRiYXNldHlwZS0+aXNfYmluYXJ5KCkgKSB7CisgICAgICByZXR1cm4gImJpbmFyeSI7CisgICAgfQorICAgIHJldHVybiB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2V0eXBlLT5nZXRfYmFzZSgpKTsKKyAgfQorICByZXR1cm4gIih1bmtub3duKSI7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgIHhtbCwKKyAgIlhNTCIsCisgICIgICAgbWVyZ2U6ICAgICAgICAgICBHZW5lcmF0ZSBvdXRwdXQgd2l0aCBpbmNsdWRlZCBmaWxlcyBtZXJnZWRcbiIKKyAgIiAgICBub19kZWZhdWx0X25zOiAgIE9taXQgZGVmYXVsdCB4bWxucyBhbmQgYWRkIGlkbDogcHJlZml4IHRvIGFsbCBlbGVtZW50c1xuIgorICAiICAgIG5vX25hbWVzcGFjZXM6ICAgRG8gbm90IGFkZCBuYW1lc3BhY2UgZGVmaW5pdGlvbnMgdG8gdGhlIFhNTCBtb2RlbFxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzllNWE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogWFNEIGdlbmVyYXRvciwgY3JlYXRlcyBhbiBYU0QgZm9yIHRoZSBiYXNlIHR5cGVzIGV0Yy4KKyAqCisgKi8KK2NsYXNzIHRfeHNkX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfeHNkX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24geHNkOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi14c2QiOworICB9CisKKyAgfnRfeHNkX2dlbmVyYXRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkgb3ZlcnJpZGU7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIG92ZXJyaWRlOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgb3ZlcnJpZGUgeyAodm9pZCl0ZW51bTsgfQorCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSBvdmVycmlkZTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIG92ZXJyaWRlOworCitwcml2YXRlOgorICB2b2lkIGdlbmVyYXRlX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiBhdHRycyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5pbGxhYmxlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxpc3RfZWxlbWVudCA9IGZhbHNlKTsKKworICBzdGQ6OnN0cmluZyBucyhzdGQ6OnN0cmluZyBpbiwgc3RkOjpzdHJpbmcgbnMpIHsgcmV0dXJuIG5zICsgIjoiICsgaW47IH0KKworICBzdGQ6OnN0cmluZyB4c2Qoc3RkOjpzdHJpbmcgaW4pIHsgcmV0dXJuIG5zKGluLCAieHNkIik7IH0KKworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpOworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgeG1sX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIjwhLS1cbiIpICsgIiAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgICArICIgKlxuIiArICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCisgICAgICAgICAgICsgIiAtLT5cbiI7CisgIH0KKworICAvKioKKyAgICogT3V0cHV0IHhzZC9waHAgZmlsZQorICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3hzZF87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9waHBfOworCisgIC8qKgorICAgKiBPdXRwdXQgc3RyaW5nIHN0cmVhbQorICAgKi8KKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfeHNkX3R5cGVzXzsKK307CisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9waHBfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfeHNkLnBocCI7CisgIGZfcGhwXy5vcGVuKGZfcGhwX25hbWUuY19zdHIoKSk7CisKKyAgZl9waHBfIDw8ICI8P3BocCIgPDwgZW5kbAorICAgICAgICAgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKK30KKwordm9pZCB0X3hzZF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl9waHBfIDw8ICI/PiIgPDwgZW5kbDsKKyAgZl9waHBfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6c2ltcGxlVHlwZSBuYW1lPVwiIiA8PCB0dHlwZWRlZi0+Z2V0X25hbWUoKSA8PCAiXCI+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSAmJiAoKHRfYmFzZV90eXBlKil0dHlwZWRlZi0+Z2V0X3R5cGUoKSktPmlzX3N0cmluZ19lbnVtKCkpIHsKKyAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpyZXN0cmljdGlvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICJcIj4iCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgdmFsdWVzID0gKCh0X2Jhc2VfdHlwZSopdHR5cGVkZWYtPmdldF90eXBlKCkpLT5nZXRfc3RyaW5nX2VudW1fdmFscygpOworICAgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdl9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOmVudW1lcmF0aW9uIHZhbHVlPVwiIiA8PCAoKnZfaXRlcikgPDwgIlwiIC8+IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpyZXN0cmljdGlvbj4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiXCIgLz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6c2ltcGxlVHlwZT4iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBib29sIHhzZF9hbGwgPSB0c3RydWN0LT5nZXRfeHNkX2FsbCgpOworCisgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOmNvbXBsZXhUeXBlIG5hbWU9XCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh4c2RfYWxsKSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6YWxsPiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX2VsZW1lbnQoc194c2RfdHlwZXNfLAorICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfeHNkX2F0dHJzKCksCisgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF94c2Rfb3B0aW9uYWwoKSB8fCB4c2RfYWxsLAorICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfeHNkX25pbGxhYmxlKCkpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaWYgKHhzZF9hbGwpIHsKKyAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6YWxsPiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmlsbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxpc3RfZWxlbWVudCkgeworICBzdHJpbmcgc21pbk9jY3VycyA9IChvcHRpb25hbCB8fCBsaXN0X2VsZW1lbnQpID8gIiBtaW5PY2N1cnM9XCIwXCIiIDogIiI7CisgIHN0cmluZyBzbWF4T2NjdXJzID0gbGlzdF9lbGVtZW50ID8gIiBtYXhPY2N1cnM9XCJ1bmJvdW5kZWRcIiIgOiAiIjsKKyAgc3RyaW5nIHNvcHRpb25hbCA9IHNtaW5PY2N1cnMgKyBzbWF4T2NjdXJzOworICBzdHJpbmcgc25pbGxhYmxlID0gbmlsbGFibGUgPyAiIG5pbGxhYmxlPVwidHJ1ZVwiIiA6ICIiOworCisgIGlmICh0dHlwZS0+aXNfdm9pZCgpIHx8IHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICI+IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmIChhdHRycyA9PSBOVUxMICYmIHR0eXBlLT5pc192b2lkKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhUeXBlIC8+IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOnNlcXVlbmNlIG1pbk9jY3Vycz1cIjBcIiBtYXhPY2N1cnM9XCJ1bmJvdW5kZWRcIj4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBzdHJpbmcgc3VibmFtZTsKKyAgICAgICAgdF90eXBlKiBzdWJ0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBpZiAoc3VidHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgc3VidHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgICBzdWJuYW1lID0gbmFtZSArICJfZWx0IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdWJuYW1lID0gdHlwZV9uYW1lKHN1YnR5cGUpOworICAgICAgICB9CisgICAgICAgIGZfcGhwXyA8PCAiJEdMT0JBTFNbJyIgPDwgcHJvZ3JhbV8tPmdldF9uYW1lKCkgPDwgIl94c2RfZWx0XyIgPDwgbmFtZSA8PCAiJ10gPSAnIiA8PCBzdWJuYW1lCisgICAgICAgICAgICAgICA8PCAiJzsiIDw8IGVuZGw7CisgICAgICAgIGdlbmVyYXRlX2VsZW1lbnQob3V0LCBzdWJuYW1lLCBzdWJ0eXBlLCBOVUxMLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cImxpc3RcIiB0eXBlPVwieHNkOmJvb2xlYW5cIiAvPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGlmIChhdHRycyAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBhdHRycy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworICAgICAgICBmb3IgKGFfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgYV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrYV9pdGVyKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCIiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgdHlwZT1cIiIKKyAgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiXCIgLz4iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDplbGVtZW50PiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoYXR0cnMgPT0gTlVMTCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIKKyAgICAgICAgICAgICAgICAgIDw8ICIgdHlwZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIiAvPiIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdvdywgYWxsIHRoaXMgd29yayBmb3IgYSBTSU1QTEUgVFlQRSB3aXRoIGF0dHJpYnV0ZXM/IT8hPyEKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIj4iCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhDb250ZW50PiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZXh0ZW5zaW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIlwiPiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGF0dHJzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworICAgICAgZm9yIChhX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGFfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2FfaXRlcikgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cIiIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiB0eXBlPVwiIgorICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiXCIgLz4iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmV4dGVuc2lvbj4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmNvbXBsZXhDb250ZW50PiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDplbGVtZW50PiIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKworCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfeHNkX25hbWUgPSBnZXRfb3V0X2RpcigpICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiLnhzZCI7CisgIGZfeHNkXy5vcGVuKGZfeHNkX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIG5zID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInhzZCIpOworICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoInhzZCIpOworICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciB1cmkgPSBhbm5vdC5maW5kKCJ1cmkiKTsKKyAgaWYgKHVyaSAhPSBhbm5vdC5lbmQoKSkgeworICAgIG5zID0gdXJpLT5zZWNvbmQ7CisgIH0KKyAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICBucyA9ICIgdGFyZ2V0TmFtZXNwYWNlPVwiIiArIG5zICsgIlwiIHhtbG5zPVwiIiArIG5zICsgIlwiICIKKyAgICAgICAgICsgImVsZW1lbnRGb3JtRGVmYXVsdD1cInF1YWxpZmllZFwiIjsKKyAgfQorCisgIC8vIFByaW50IHRoZSBYU0QgaGVhZGVyCisgIGZfeHNkXyA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PiIgPDwgZW5kbAorICAgICAgICAgPDwgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIiIDw8IG5zIDw8ICI+IiA8PCBlbmRsCisgICAgICAgICA8PCB4bWxfYXV0b2dlbl9jb21tZW50KCkKKyAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gUHJpbnQgb3V0IHRoZSB0eXBlIGRlZmluaXRpb25zCisgIGluZGVudChmX3hzZF8pIDw8IHNfeHNkX3R5cGVzXy5zdHIoKTsKKworICAvLyBLZWVwIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbnMgdGhhdCBtaWdodCBnZXQgdGhyb3duCisgIG1hcDxzdHJpbmcsIHRfc3RydWN0Kj4gYWxsX3hjZXB0aW9uczsKKworICAvLyBMaXN0IHRoZSBlbGVtZW50cyB0aGF0IHlvdSBtaWdodCBhY3R1YWxseSBnZXQKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGVsZW1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXNwb25zZSI7CisgICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIGdlbmVyYXRlX2VsZW1lbnQoZl94c2RfLCBlbGVtbmFtZSwgcmV0dXJudHlwZSk7CisgICAgZl94c2RfIDw8IGVuZGw7CisKKyAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgYWxsX3hjZXB0aW9uc1soKnhfaXRlciktPmdldF9uYW1lKCldID0gKHRfc3RydWN0KikoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICB9CisgIH0KKworICBtYXA8c3RyaW5nLCB0X3N0cnVjdCo+OjppdGVyYXRvciBheF9pdGVyOworICBmb3IgKGF4X2l0ZXIgPSBhbGxfeGNlcHRpb25zLmJlZ2luKCk7IGF4X2l0ZXIgIT0gYWxsX3hjZXB0aW9ucy5lbmQoKTsgKytheF9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZWxlbWVudChmX3hzZF8sIGF4X2l0ZXItPmZpcnN0LCBheF9pdGVyLT5zZWNvbmQpOworICB9CisKKyAgLy8gQ2xvc2UgdGhlIFhTRCBkb2N1bWVudAorICBmX3hzZF8gPDwgZW5kbCA8PCAiPC94c2Q6c2NoZW1hPiIgPDwgZW5kbDsKKyAgZl94c2RfLmNsb3NlKCk7Cit9CisKK3N0cmluZyB0X3hzZF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiB4c2QoYmFzZV90eXBlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiB4c2QoImludCIpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHJldHVybiAiY29udGFpbmVyIjsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBYU0QgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHJldHVybiBFeHBsaWNpdCBYU0QgdHlwZSwgaS5lLiB4c2Q6c3RyaW5nCisgKi8KK3N0cmluZyB0X3hzZF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpIHsKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgcmV0dXJuICJzdHJpbmciOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJib29sZWFuIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gImJ5dGUiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gInNob3J0IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJpbnQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImxvbmciOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gImRlY2ltYWwiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gWFNEIGJhc2UgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUih4c2QsICJYU0QiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RocmlmdC10X3BocF9nZW5lcmF0b3Iuby1hNjBhMzhlOSBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RocmlmdC10X3BocF9nZW5lcmF0b3Iuby1hNjBhMzhlOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdGhyaWZ0LXRfcGhwX2dlbmVyYXRvci5vLWE2MGEzOGU5CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nbG9iYWxzLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nbG9iYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxYzZlZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dsb2JhbHMuaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfR0xPQkFMU19ICisjZGVmaW5lIFRfR0xPQkFMU19ICisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworLyoqCisgKiBUaGlzIG1vZHVsZSBjb250YWlucyBhbGwgdGhlIGdsb2JhbCB2YXJpYWJsZXMgKHNsYXAgb24gdGhlIHdyaXN0KSB0aGF0IGFyZQorICogc2hhcmVkIHRocm91Z2hvdXQgdGhlIHByb2dyYW0uIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdG8gZmFjaWxpdGF0ZSBzaW1wbGUKKyAqIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIHBhcnNlciBhbmQgdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0uIEJlZm9yZSBjYWxsaW5nCisgKiB5eXBhcnNlKCksIHRoZSBtYWluLmNjIHByb2dyYW0gd2lsbCBtYWtlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyB0byB0aGVzZQorICogZ2xvYmFsIHZhcmlhYmxlcyBzdWNoIHRoYXQgdGhlIHBhcnNlciBkb2VzIHRoZSByaWdodCB0aGluZyBhbmQgcHV0cyBlbnRyaWVzCisgKiBpbnRvIHRoZSByaWdodCBjb250YWluZXJzLCBldGMuCisgKgorICovCisKKy8qKgorICogSG9vcmF5IGZvciBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHR5cGVzIQorICovCisKK2NsYXNzIHRfcHJvZ3JhbTsKK2NsYXNzIHRfc2NvcGU7CitjbGFzcyB0X3R5cGU7CisKKy8qKgorICogUGFyc2luZyBtb2RlLCB0d28gcGFzc2VzIHVwIGluIHRoaXMgZ2luIHJ1bW15IQorICovCisKK2VudW0gUEFSU0VfTU9ERSB7IElOQ0xVREVTID0gMSwgUFJPR1JBTSA9IDIgfTsKKworLyoqCisgKiBTdHJpY3RuZXNzIGxldmVsCisgKi8KK2V4dGVybiBpbnQgZ19zdHJpY3Q7CisKKy8qKgorICogVGhlIG1hc3RlciBwcm9ncmFtIHBhcnNlIHRyZWUuIFRoaXMgaXMgYWNjZXNzZWQgZnJvbSB3aXRoaW4gdGhlIHBhcnNlciBjb2RlCisgKiB0byBidWlsZCB1cCB0aGUgcHJvZ3JhbSBlbGVtZW50cy4KKyAqLworZXh0ZXJuIHRfcHJvZ3JhbSogZ19wcm9ncmFtOworCisvKioKKyAqIFRoZSBzY29wZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZyBpbnRvCisgKi8KK2V4dGVybiB0X3Njb3BlKiBnX3Njb3BlOworCisvKioKKyAqIFRoZSBwYXJlbnQgc2NvcGUgdG8gYWxzbyBsb2FkIHN5bWJvbHMgaW50bworICovCitleHRlcm4gdF9zY29wZSogZ19wYXJlbnRfc2NvcGU7CisKKy8qKgorICogVGhlIHByZWZpeCBmb3IgdGhlIHBhcmVudCBzY29wZSBlbnRyaWVzCisgKi8KK2V4dGVybiBzdGQ6OnN0cmluZyBnX3BhcmVudF9wcmVmaXg7CisKKy8qKgorICogVGhlIHBhcnNpbmcgcGFzcyB0aGF0IHdlIGFyZSBvbi4gV2UgZG8gZGlmZmVyZW50IHRoaW5ncyBvbiBlYWNoIHBhc3MuCisgKi8KK2V4dGVybiBQQVJTRV9NT0RFIGdfcGFyc2VfbW9kZTsKKworLyoqCisgKiBHbG9iYWwgdGltZSBzdHJpbmcsIHVzZWQgaW4gZm9ybWF0dGluZyBlcnJvciBtZXNzYWdlcyBldGMuCisgKi8KK2V4dGVybiBjaGFyKiBnX3RpbWVfc3RyOworCisvKioKKyAqIFRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2V4dGVybiBjaGFyKiBnX2RvY3RleHQ7CisKKy8qKgorICogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2V4dGVybiBpbnQgZ19kb2N0ZXh0X2xpbmVubzsKKworLyoqCisgKiBTdGF0dXMgb2YgcHJvZ3JhbSBsZXZlbCBkb2N0ZXh0IGNhbmRpZGF0ZQorICovCitlbnVtIFBST0dET0NURVhUX1NUQVRVUyB7CisgIElOVkFMSUQgPSAwLAorICBTVElMTF9DQU5ESURBVEUgPSAxLCAgIC8vIHRoZSB0ZXh0IG1heSBvciBtYXkgbm90IGJlIHRoZSBwcm9ncmFtIGRvY3RleHQKKyAgQUxSRUFEWV9QUk9DRVNTRUQgPSAyLCAvLyBkb2N0ZXh0IGhhcyBiZWVuIHVzZWQgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUKKyAgQUJTT0xVVEVMWV9TVVJFID0gMywgICAvLyB0aGlzIGlzIHRoZSBwcm9ncmFtIGRvY3RleHQKKyAgTk9fUFJPR1JBTV9ET0NURVhUID0gNCAvLyB0aGVyZSBpcyBubyBwcm9ncmFtIGRvY3RleHQKK307CisKKy8qKgorICogVGhlIHByb2dyYW0gbGV2ZWwgZG9jdGV4dC4gU3RvcmVkIHNlcGFyYXRlbHkgdG8gbWFrZSBwYXJzaW5nIGVhc2llci4KKyAqLworZXh0ZXJuIGNoYXIqIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZTsKK2V4dGVybiBpbnQgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vOworZXh0ZXJuIFBST0dET0NURVhUX1NUQVRVUyBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXM7CisKKy8qKgorICogV2hldGhlciBvciBub3QgbmVnYXRpdmUgZmllbGQga2V5cyBhcmUgYWNjZXB0ZWQuCisgKgorICogV2hlbiBhIGZpZWxkIGRvZXMgbm90IGhhdmUgYSB1c2VyLXNwZWNpZmllZCBrZXksIHRocmlmdCBhdXRvbWF0aWNhbGx5CisgKiBhc3NpZ25zIGEgbmVnYXRpdmUgdmFsdWUuICBIb3dldmVyLCB0aGlzIGlzIGZyYWdpbGUgc2luY2UgY2hhbmdlcyB0byB0aGUKKyAqIGZpbGUgbWF5IHVuaW50ZW50aW9uYWxseSBjaGFuZ2UgdGhlIGtleSBudW1iZXJpbmcsIHJlc3VsdGluZyBpbiBhIG5ldworICogcHJvdG9jb2wgdGhhdCBpcyBub3QgYmFja3dhcmRzIGNvbXBhdGlibGUuCisgKgorICogV2hlbiBnX2FsbG93X25lZ19maWVsZF9rZXlzIGlzIGVuYWJsZWQsIHVzZXJzIGNhbiBleHBsaWNpdGx5IHNwZWNpZnkKKyAqIG5lZ2F0aXZlIGtleXMuICBUaGlzIHdheSB0aGV5IGNhbiB3cml0ZSBhIC50aHJpZnQgZmlsZSB3aXRoIGV4cGxpY2l0bHkKKyAqIHNwZWNpZmllZCBrZXlzIHRoYXQgaXMgc3RpbGwgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBvbGRlciAudGhyaWZ0IGZpbGVzCisgKiB0aGF0IGRpZCBub3Qgc3BlY2lmeSBrZXkgdmFsdWVzLgorICovCitleHRlcm4gaW50IGdfYWxsb3dfbmVnX2ZpZWxkX2tleXM7CisKKy8qKgorICogV2hldGhlciBvciBub3QgNjQtYml0IGNvbnN0YW50cyB3aWxsIGdlbmVyYXRlIGEgd2FybmluZy4KKyAqCisgKiBTb21lIGxhbmd1YWdlcyBkb24ndCBzdXBwb3J0IDY0LWJpdCBjb25zdGFudHMsIGJ1dCBtYW55IGRvLCBzbyB3ZSBjYW4KKyAqIHN1cHByZXNzIHRoaXMgd2FybmluZyBmb3IgcHJvamVjdHMgdGhhdCBkb24ndCB1c2UgYW55IG5vbi02NC1iaXQtc2FmZQorICogbGFuZ3VhZ2VzLgorICovCitleHRlcm4gaW50IGdfYWxsb3dfNjRiaXRfY29uc3RzOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MTFjNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmNjCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9sb2dnaW5nLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKyNpbmNsdWRlIDxjc3RkYXJnPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorCitpbnQgZ19kZWJ1ZyA9IDA7CitpbnQgZ193YXJuID0gMTsKK2ludCBnX3ZlcmJvc2UgPSAwOworCit2b2lkIHBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ19kZWJ1ZyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgLy8gcHJpbnRmKCJbUEFSU0U6JWRdICIsIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKK30KKwordm9pZCBwdmVyYm9zZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ192ZXJib3NlID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKK30KKwordm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX3dhcm4gPCBsZXZlbCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIC8vIHByaW50ZigiW1dBUk5JTkc6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7Cit9CisKK3ZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIC8vIGZwcmludGYoc3RkZXJyLCAiW0ZBSUxVUkU6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7CisgIGV4aXQoMSk7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlZmJmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9MT0dHSU5HX0gKKyNkZWZpbmUgVF9MT0dHSU5HX0gKKworZXh0ZXJuIGludCBnX2RlYnVnOworZXh0ZXJuIGludCBnX3dhcm47CitleHRlcm4gaW50IGdfdmVyYm9zZTsKKworLyoqCisgKiBQYXJzZSBkZWJ1Z2dpbmcgb3V0cHV0LCB1c2VkIHRvIHByaW50IGhlbHBmdWwgaW5mbworICovCit2b2lkIHBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKy8qKgorICogUGFyc2VyIHdhcm5pbmcKKyAqLwordm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworLyoqCisgKiBQcmludCB2ZXJib3NlIG91dHB1dCBtZXNzYWdlCisgKi8KK3ZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pOworCisvKioKKyAqIEZhaWx1cmUhCisgKi8KK3ZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2OWRjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uY2MKQEAgLTAsMCArMSwxMjg3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogdGhyaWZ0IC0gYSBsaWdodHdlaWdodCBjcm9zcy1sYW5ndWFnZSBycGMvc2VyaWFsaXphdGlvbiB0b29sCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIGNvbXBpbGVyIGVuZ2luZSBmb3IgVGhyaWZ0LCB3aGljaCBpbnZva2VzIHRoZQorICogc2Nhbm5lci9wYXJzZXIgdG8gYnVpbGQgdGhlIHRocmlmdCBvYmplY3QgdHJlZS4gVGhlIGludGVyZmFjZSBnZW5lcmF0aW9uCisgKiBjb2RlIGZvciBlYWNoIGxhbmd1YWdlIGxpdmVzIGluIGEgZmlsZSBieSB0aGUgbGFuZ3VhZ2UgbmFtZSB1bmRlciB0aGUKKyAqIGdlbmVyYXRlLyBmb2xkZXIsIGFuZCBhbGwgcGFyc2Ugc3RydWN0dXJlcyBsaXZlIGluIHBhcnNlLworICoKKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4gLyogZm9yIEdldEZ1bGxQYXRoTmFtZSAqLworI2VuZGlmCisKKy8vIENhcmVmdWw6IG11c3QgaW5jbHVkZSBnbG9iYWxzIGZpcnN0IGZvciBleHRlcm4gZGVmaW5pdGlvbnMKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9tYWluLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Njb3BlLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCIKKworI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKy8qKgorICogR2xvYmFsIHByb2dyYW0gdHJlZQorICovCit0X3Byb2dyYW0qIGdfcHJvZ3JhbTsKKworLyoqCisgKiBHbG9iYWwgc2NvcGUKKyAqLwordF9zY29wZSogZ19zY29wZTsKKworLyoqCisgKiBQYXJlbnQgc2NvcGUgdG8gYWxzbyBwYXJzZSB0eXBlcworICovCit0X3Njb3BlKiBnX3BhcmVudF9zY29wZTsKKworLyoqCisgKiBQcmVmaXggZm9yIHB1dHRpbmcgdHlwZXMgaW4gcGFyZW50IHNjb3BlCisgKi8KK3N0cmluZyBnX3BhcmVudF9wcmVmaXg7CisKKy8qKgorICogUGFyc2luZyBwYXNzCisgKi8KK1BBUlNFX01PREUgZ19wYXJzZV9tb2RlOworCisvKioKKyAqIEN1cnJlbnQgZGlyZWN0b3J5IG9mIGZpbGUgYmVpbmcgcGFyc2VkCisgKi8KK3N0cmluZyBnX2N1cmRpcjsKKworLyoqCisgKiBDdXJyZW50IGZpbGUgYmVpbmcgcGFyc2VkCisgKi8KK3N0cmluZyBnX2N1cnBhdGg7CisKKy8qKgorICogU2VhcmNoIHBhdGggZm9yIGluY2x1c2lvbnMKKyAqLwordmVjdG9yPHN0cmluZz4gZ19pbmNsX3NlYXJjaHBhdGg7CisKKy8qKgorICogR2xvYmFsIGRlYnVnIHN0YXRlCisgKi8KK2ludCBnX2RlYnVnID0gMDsKKworLyoqCisgKiBTdHJpY3RuZXNzIGxldmVsCisgKi8KK2ludCBnX3N0cmljdCA9IDEyNzsKKworLyoqCisgKiBXYXJuaW5nIGxldmVsCisgKi8KK2ludCBnX3dhcm4gPSAxOworCisvKioKKyAqIFZlcmJvc2Ugb3V0cHV0CisgKi8KK2ludCBnX3ZlcmJvc2UgPSAwOworCisvKioKKyAqIEdsb2JhbCB0aW1lIHN0cmluZworICovCitjaGFyKiBnX3RpbWVfc3RyOworCisvKioKKyAqIFRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2NoYXIqIGdfZG9jdGV4dDsKKworLyoqCisgKiBUaGUgRmlyc3QgZG9jdGV4dCBjb21tZW50CisgKi8KK2NoYXIqIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZTsKKworLyoqCisgKiBXaGV0aGVyIG9yIG5vdCBuZWdhdGl2ZSBmaWVsZCBrZXlzIGFyZSBhY2NlcHRlZC4KKyAqLworaW50IGdfYWxsb3dfbmVnX2ZpZWxkX2tleXM7CisKKy8qKgorICogV2hldGhlciBvciBub3QgNjQtYml0IGNvbnN0YW50cyB3aWxsIGdlbmVyYXRlIGEgd2FybmluZy4KKyAqLworaW50IGdfYWxsb3dfNjRiaXRfY29uc3RzID0gMDsKKworLyoqCisgKiBGbGFncyB0byBjb250cm9sIGNvZGUgZ2VuZXJhdGlvbgorICovCitib29sIGdlbl9yZWN1cnNlID0gZmFsc2U7CisKKy8qKgorICogRmxhZ3MgdG8gY29udHJvbCB0aHJpZnQgYXVkaXQKKyAqLworYm9vbCBnX2F1ZGl0ID0gZmFsc2U7CisKKy8qKgorICogRmxhZyB0byBjb250cm9sIHJldHVybiBzdGF0dXMKKyAqLworYm9vbCBnX3JldHVybl9mYWlsdXJlID0gZmFsc2U7Citib29sIGdfYXVkaXRfZmF0YWwgPSB0cnVlOworYm9vbCBnX2dlbmVyYXRvcl9mYWlsdXJlID0gZmFsc2U7CisKKy8qKgorICogV2luMzIgZG9lc24ndCBoYXZlIHJlYWxwYXRoLCBzbyB1c2UgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaW4gdGhhdCBjYXNlLAorICogb3RoZXJ3aXNlIHRoaXMganVzdCBjYWxscyB0aHJvdWdoIHRvIHJlYWxwYXRoCisgKi8KK2NoYXIqIHNhZmVyZWFscGF0aChjb25zdCBjaGFyKiBwYXRoLCBjaGFyKiByZXNvbHZlZF9wYXRoKSB7CisjaWZkZWYgX1dJTjMyCisgIGNoYXIgYnVmW01BWF9QQVRIXTsKKyAgY2hhciogYmFzZW5hbWU7CisgIERXT1JEIGxlbiA9IEdldEZ1bGxQYXRoTmFtZUEocGF0aCwgTUFYX1BBVEgsIGJ1ZiwgJmJhc2VuYW1lKTsKKyAgaWYgKGxlbiA9PSAwIHx8IGxlbiA+IE1BWF9QQVRIIC0gMSkgeworICAgIHN0cmNweShyZXNvbHZlZF9wYXRoLCBwYXRoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJjcHkocmVzb2x2ZWRfcGF0aCwgYnVmKTsKKyAgfQorCisgIC8vIFJlcGxhY2UgYmFja3NsYXNoZXMgd2l0aCBmb3J3YXJkIHNsYXNoZXMgc28gdGhlCisgIC8vIHJlc3Qgb2YgdGhlIGNvZGUgYmVoYXZlcyBjb3JyZWN0bHkuCisgIHNpemVfdCByZXNvbHZlZF9sZW4gPSBzdHJsZW4ocmVzb2x2ZWRfcGF0aCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb2x2ZWRfbGVuOyBpKyspIHsKKyAgICBpZiAocmVzb2x2ZWRfcGF0aFtpXSA9PSAnXFwnKSB7CisgICAgICByZXNvbHZlZF9wYXRoW2ldID0gJy8nOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzb2x2ZWRfcGF0aDsKKyNlbHNlCisgIHJldHVybiByZWFscGF0aChwYXRoLCByZXNvbHZlZF9wYXRoKTsKKyNlbmRpZgorfQorCitib29sIGNoZWNrX2lzX2RpcmVjdG9yeShjb25zdCBjaGFyKiBkaXJfbmFtZSkgeworI2lmZGVmIF9XSU4zMgorICBEV09SRCBhdHRyaWJ1dGVzID0gOjpHZXRGaWxlQXR0cmlidXRlc0EoZGlyX25hbWUpOworICBpZiAoYXR0cmlidXRlcyA9PSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUykgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIk91dHB1dCBkaXJlY3RvcnkgJXMgaXMgdW51c2FibGU6IEdldExhc3RFcnJvcigpID0gJWxkXG4iLAorICAgICAgICAgICAgZGlyX25hbWUsCisgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICgoYXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgIT0gRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBkaXJfbmFtZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgc3RydWN0IHN0YXQgc2I7CisgIGlmIChzdGF0KGRpcl9uYW1lLCAmc2IpIDwgMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGRpcmVjdG9yeSAlcyBpcyB1bnVzYWJsZTogJXNcbiIsIGRpcl9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIVNfSVNESVIoc2Iuc3RfbW9kZSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnlcbiIsIGRpcl9uYW1lKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworLyoqCisgKiBSZXBvcnQgYW4gZXJyb3IgdG8gdGhlIHVzZXIuIFRoaXMgaXMgY2FsbGVkIHl5ZXJyb3IgZm9yIGhpc3RvcmljYWwKKyAqIHJlYXNvbnMgKGxleCBhbmQgeWFjYyBleHBlY3QgdGhlIGVycm9yIHJlcG9ydGluZyByb3V0aW5lIHRvIGJlIGNhbGxlZAorICogdGhpcykuIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZXBvcnQgYW55IGVycm9ycyB0byB0aGUgdXNlci4KKyAqIHl5ZXJyb3IgdGFrZXMgcHJpbnRmIHN0eWxlIGFyZ3VtZW50cy4KKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIHl5ZXJyb3IoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICBmcHJpbnRmKHN0ZGVyciwgIltFUlJPUjolczolZF0gKGxhc3QgdG9rZW4gd2FzICclcycpXG4iLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8sIHl5dGV4dCk7CisKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisKKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorCisvKioKKyAqIFByaW50cyBhIGRlYnVnIG1lc3NhZ2UgZnJvbSB0aGUgcGFyc2VyLgorICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX2RlYnVnID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICBwcmludGYoIltQQVJTRTolZF0gIiwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCisvKioKKyAqIFByaW50cyBhIHZlcmJvc2Ugb3V0cHV0IG1vZGUgbWVzc2FnZQorICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfdmVyYm9zZSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7Cit9CisKKy8qKgorICogUHJpbnRzIGEgd2FybmluZyBtZXNzYWdlCisgKgorICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAqLwordm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX3dhcm4gPCBsZXZlbCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIHByaW50ZigiW1dBUk5JTkc6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7Cit9CisKKy8qKgorICogUHJpbnRzIGEgZmFpbHVyZSBtZXNzYWdlIGFuZCBleGl0cworICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIGZwcmludGYoc3RkZXJyLCAiW0ZBSUxVUkU6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7CisgIGV4aXQoMSk7Cit9CisKKy8qKgorICogQ29udmVydHMgYSBzdHJpbmcgZmlsZW5hbWUgaW50byBhIHRocmlmdCBwcm9ncmFtIG5hbWUKKyAqLworc3RyaW5nIHByb2dyYW1fbmFtZShzdHJpbmcgZmlsZW5hbWUpIHsKKyAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBmaWxlbmFtZS5yZmluZCgiLyIpOworICBpZiAoc2xhc2ggIT0gc3RyaW5nOjpucG9zKSB7CisgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoc2xhc2ggKyAxKTsKKyAgfQorICBzdHJpbmc6OnNpemVfdHlwZSBkb3QgPSBmaWxlbmFtZS5yZmluZCgiLiIpOworICBpZiAoZG90ICE9IHN0cmluZzo6bnBvcykgeworICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKDAsIGRvdCk7CisgIH0KKyAgcmV0dXJuIGZpbGVuYW1lOworfQorCisvKioKKyAqIEdldHMgdGhlIGRpcmVjdG9yeSBwYXRoIG9mIGEgZmlsZW5hbWUKKyAqLworc3RyaW5nIGRpcmVjdG9yeV9uYW1lKHN0cmluZyBmaWxlbmFtZSkgeworICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaCA9IGZpbGVuYW1lLnJmaW5kKCIvIik7CisgIC8vIE5vIHNsYXNoLCBqdXN0IHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkKKyAgaWYgKHNsYXNoID09IHN0cmluZzo6bnBvcykgeworICAgIHJldHVybiAiLiI7CisgIH0KKyAgcmV0dXJuIGZpbGVuYW1lLnN1YnN0cigwLCBzbGFzaCk7Cit9CisKKy8qKgorICogRmluZHMgdGhlIGFwcHJvcHJpYXRlIGZpbGUgcGF0aCBmb3IgdGhlIGdpdmVuIGZpbGVuYW1lCisgKi8KK3N0cmluZyBpbmNsdWRlX2ZpbGUoc3RyaW5nIGZpbGVuYW1lKSB7CisgIC8vIEFic29sdXRlIHBhdGg/IEp1c3QgdHJ5IHRoYXQKKyAgaWYgKGZpbGVuYW1lWzBdID09ICcvJykgeworICAgIC8vIFJlYWxwYXRoIQorICAgIGNoYXIgcnBbVEhSSUZUX1BBVEhfTUFYXTsKKyAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICBpZiAoc2FmZXJlYWxwYXRoKGZpbGVuYW1lLmNfc3RyKCksIHJwKSA9PSBOVUxMKSB7CisgICAgICBwd2FybmluZygwLCAiQ2Fubm90IG9wZW4gaW5jbHVkZSBmaWxlICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgIH0KKworICAgIC8vIFN0YXQgdGhpcyBmaWxlCisgICAgc3RydWN0IHN0YXQgZmluZm87CisgICAgaWYgKHN0YXQocnAsICZmaW5mbykgPT0gMCkgeworICAgICAgcmV0dXJuIHJwOworICAgIH0KKyAgfSBlbHNlIHsgLy8gcmVsYXRpdmUgcGF0aCwgc3RhcnQgc2VhcmNoaW5nCisgICAgLy8gbmV3IHNlYXJjaCBwYXRoIHdpdGggY3VycmVudCBkaXIgZ2xvYmFsCisgICAgdmVjdG9yPHN0cmluZz4gc3AgPSBnX2luY2xfc2VhcmNocGF0aDsKKyAgICBzcC5pbnNlcnQoc3AuYmVnaW4oKSwgZ19jdXJkaXIpOworCisgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHBhdGhzCisgICAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBzcC5iZWdpbigpOyBpdCAhPSBzcC5lbmQoKTsgaXQrKykgeworICAgICAgc3RyaW5nIHNmaWxlbmFtZSA9ICooaXQpICsgIi8iICsgZmlsZW5hbWU7CisKKyAgICAgIC8vIFJlYWxwYXRoIQorICAgICAgY2hhciBycFtUSFJJRlRfUEFUSF9NQVhdOworICAgICAgLy8gY3BwY2hlY2stc3VwcHJlc3MgdW5pbml0dmFyCisgICAgICBpZiAoc2FmZXJlYWxwYXRoKHNmaWxlbmFtZS5jX3N0cigpLCBycCkgPT0gTlVMTCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gU3RhdCB0aGlzIGZpbGVzCisgICAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKKyAgICAgIGlmIChzdGF0KHJwLCAmZmluZm8pID09IDApIHsKKyAgICAgICAgcmV0dXJuIHJwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFVoIG9oCisgIHB3YXJuaW5nKDAsICJDb3VsZCBub3QgZmluZCBpbmNsdWRlIGZpbGUgJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOworICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKK30KKworLyoqCisgKiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc3RvcmVkIGRvY3RleHQgc3RyaW5nLgorICogQWxzbyBwcmludHMgYSB3YXJuaW5nIGlmIHdlIGFyZSBkaXNjYXJkaW5nIGluZm9ybWF0aW9uLgorICovCit2b2lkIGNsZWFyX2RvY3RleHQoKSB7CisgIGlmIChnX2RvY3RleHQgIT0gTlVMTCkgeworICAgIHB3YXJuaW5nKDIsICJVbmNhcHR1cmVkIGRvY3RleHQgYXQgb24gbGluZSAlZC4iLCBnX2RvY3RleHRfbGluZW5vKTsKKyAgfQorICBmcmVlKGdfZG9jdGV4dCk7CisgIGdfZG9jdGV4dCA9IE5VTEw7Cit9CisKKy8qKgorICogUmVzZXQgcHJvZ3JhbSBkb2N0ZXh0IGluZm9ybWF0aW9uIGFmdGVyIHByb2Nlc3NpbmcgYSBmaWxlCisgKi8KK3ZvaWQgcmVzZXRfcHJvZ3JhbV9kb2N0ZXh0X2luZm8oKSB7CisgIGlmIChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgIT0gTlVMTCkgeworICAgIGZyZWUoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlKTsKKyAgICBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgPSBOVUxMOworICB9CisgIGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9IDA7CisgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IElOVkFMSUQ7CisgIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBJTlZBTElEIik7Cit9CisKKy8qKgorICogV2UgYXJlIHN1cmUgdGhlIHByb2dyYW0gZG9jdGV4dCBjYW5kaWRhdGUgaXMgcmVhbGx5IHRoZSBwcm9ncmFtIGRvY3RleHQuCisgKi8KK3ZvaWQgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKSB7CisgIGlmICgoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlICE9IE5VTEwpICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPT0gU1RJTExfQ0FORElEQVRFKSkgeworICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IEFCU09MVVRFTFlfU1VSRTsKKyAgICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gQUJTT0xVVEVMWV9TVVJFIik7CisgIH0gZWxzZSB7CisgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gTk9fUFJPR1JBTV9ET0NURVhUOworICAgIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBOT19QUk9HUkFNX0RPQ1RFWFQiKTsKKyAgfQorfQorCisvKioKKyAqIENsZWFucyB1cCB0ZXh0IGNvbW1vbmx5IGZvdW5kIGluIGRveHlnZW4tbGlrZSBjb21tZW50cworICoKKyAqIFdhcm5pbmc6IGlmIHlvdSBtaXggdGFicyBhbmQgc3BhY2VzIGluIGEgbm9uLXVuaWZvcm0gd2F5LAorICogeW91IHdpbGwgZ2V0IHdoYXQgeW91IGRlc2VydmUuCisgKi8KK2NoYXIqIGNsZWFuX3VwX2RvY3RleHQoY2hhciogZG9jdGV4dCkgeworICAvLyBDb252ZXJ0IHRvIEMrKyBzdHJpbmcsIGFuZCByZW1vdmUgV2luZG93cydzIGNhcnJpYWdlIHJldHVybnMuCisgIHN0cmluZyBkb2NzdHJpbmcgPSBkb2N0ZXh0OworICBkb2NzdHJpbmcuZXJhc2UocmVtb3ZlKGRvY3N0cmluZy5iZWdpbigpLCBkb2NzdHJpbmcuZW5kKCksICdccicpLCBkb2NzdHJpbmcuZW5kKCkpOworCisgIC8vIFNlcGFyYXRlIGludG8gbGluZXMuCisgIHZlY3RvcjxzdHJpbmc+IGxpbmVzOworICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBzdHJpbmc6Om5wb3M7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Q7CisgIHdoaWxlICh0cnVlKSB7CisgICAgbGFzdCA9IChwb3MgPT0gc3RyaW5nOjpucG9zKSA/IDAgOiBwb3MgKyAxOworICAgIHBvcyA9IGRvY3N0cmluZy5maW5kKCdcbicsIGxhc3QpOworICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAvLyBGaXJzdCBiaXQgb2YgY2xlYW5pbmcuICBJZiB0aGUgbGFzdCBsaW5lIGlzIG9ubHkgd2hpdGVzcGFjZSwgZHJvcCBpdC4KKyAgICAgIHN0cmluZzo6c2l6ZV90eXBlIG5vbndoaXRlID0gZG9jc3RyaW5nLmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiLCBsYXN0KTsKKyAgICAgIGlmIChub253aGl0ZSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgbGluZXMucHVzaF9iYWNrKGRvY3N0cmluZy5zdWJzdHIobGFzdCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGxpbmVzLnB1c2hfYmFjayhkb2NzdHJpbmcuc3Vic3RyKGxhc3QsIHBvcyAtIGxhc3QpKTsKKyAgfQorCisgIC8vIEEgdmVyeSBwcm9mb3VuZCBkb2NzdHJpbmcuCisgIGlmIChsaW5lcy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBDbGVhciBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZmlyc3QgbGluZS4KKyAgcG9zID0gbGluZXMuZnJvbnQoKS5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7CisgIGxpbmVzLmZyb250KCkuZXJhc2UoMCwgcG9zKTsKKworICAvLyBJZiBldmVyeSBub25ibGFuayBsaW5lIGFmdGVyIHRoZSBmaXJzdCBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIHNwYWNlcy90YWJzLAorICAvLyB0aGVuIGEgc3RhciwgcmVtb3ZlIHRoZW0uCisgIGJvb2wgaGF2ZV9wcmVmaXggPSB0cnVlOworICBib29sIGZvdW5kX3ByZWZpeCA9IGZhbHNlOworICBzdHJpbmc6OnNpemVfdHlwZSBwcmVmaXhfbGVuID0gMDsKKyAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGxfaXRlcjsKKyAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgIGlmIChsX2l0ZXItPmVtcHR5KCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHBvcyA9IGxfaXRlci0+ZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOworICAgIGlmICghZm91bmRfcHJlZml4KSB7CisgICAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcykgeworICAgICAgICBpZiAobF9pdGVyLT5hdChwb3MpID09ICcqJykgeworICAgICAgICAgIGZvdW5kX3ByZWZpeCA9IHRydWU7CisgICAgICAgICAgcHJlZml4X2xlbiA9IHBvczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBoYXZlX3ByZWZpeCA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBXaGl0ZXNwYWNlLW9ubHkgbGluZS4gIFRydW5jYXRlIGl0LgorICAgICAgICBsX2l0ZXItPmNsZWFyKCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChsX2l0ZXItPnNpemUoKSA+IHBvcyAmJiBsX2l0ZXItPmF0KHBvcykgPT0gJyonICYmIHBvcyA9PSBwcmVmaXhfbGVuKSB7CisgICAgICAvLyBCdXNpbmVzcyBhcyB1c3VhbC4KKyAgICB9IGVsc2UgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIC8vIFdoaXRlc3BhY2Utb25seSBsaW5lLiAgTGV0J3MgdHJ1bmNhdGUgaXQgZm9yIHRoZW0uCisgICAgICBsX2l0ZXItPmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoZSBwYXR0ZXJuIGhhcyBiZWVuIGJyb2tlbi4KKyAgICAgIGhhdmVfcHJlZml4ID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBJZiBvdXIgcHJlZml4IHN1cnZpdmVkLCBkZWxldGUgaXQgZnJvbSBldmVyeSBsaW5lLgorICBpZiAoaGF2ZV9wcmVmaXgpIHsKKyAgICAvLyBHZXQgdGhlIHN0YXIgdG9vLgorICAgIHByZWZpeF9sZW4rKzsKKyAgICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkgKyAxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgICBsX2l0ZXItPmVyYXNlKDAsIHByZWZpeF9sZW4pOworICAgIH0KKyAgfQorCisgIC8vIE5vdyBkZWxldGUgdGhlIG1pbmltdW0gYW1vdW50IG9mIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGVhY2ggbGluZS4KKyAgcHJlZml4X2xlbiA9IHN0cmluZzo6bnBvczsKKyAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgIGlmIChsX2l0ZXItPmVtcHR5KCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKKyAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcyAmJiAocHJlZml4X2xlbiA9PSBzdHJpbmc6Om5wb3MgfHwgcG9zIDwgcHJlZml4X2xlbikpIHsKKyAgICAgIHByZWZpeF9sZW4gPSBwb3M7CisgICAgfQorICB9CisKKyAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KKyAgaWYgKHByZWZpeF9sZW4gIT0gc3RyaW5nOjpucG9zKSB7CisgICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgICAgbF9pdGVyLT5lcmFzZSgwLCBwcmVmaXhfbGVuKTsKKyAgICB9CisgIH0KKworICAvLyBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGV2ZXJ5IGxpbmUuCisgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgIHBvcyA9IGxfaXRlci0+ZmluZF9sYXN0X25vdF9vZigiIFx0Iik7CisgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgcG9zICE9IGxfaXRlci0+bGVuZ3RoKCkgLSAxKSB7CisgICAgICBsX2l0ZXItPmVyYXNlKHBvcyArIDEpOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoZSBmaXJzdCBsaW5lIGlzIGVtcHR5LCByZW1vdmUgaXQuCisgIC8vIERvbid0IGRvIHRoaXMgZWFybGllciBiZWNhdXNlIGEgbG90IG9mIHN0ZXBzIHNraXAgdGhlIGZpcnN0IGxpbmUuCisgIGlmIChsaW5lcy5mcm9udCgpLmVtcHR5KCkpIHsKKyAgICBsaW5lcy5lcmFzZShsaW5lcy5iZWdpbigpKTsKKyAgfQorCisgIC8vIE5vdyByZWpvaW4gdGhlIGxpbmVzIGFuZCBjb3B5IHRoZW0gYmFjayBpbnRvIGRvY3RleHQuCisgIGRvY3N0cmluZy5jbGVhcigpOworICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICBkb2NzdHJpbmcgKz0gKmxfaXRlcjsKKyAgICBkb2NzdHJpbmcgKz0gJ1xuJzsKKyAgfQorCisgIC8vIGFzc2VydChkb2NzdHJpbmcubGVuZ3RoKCkgPD0gc3RybGVuKGRvY3RleHQpKTsgIG1heSBoYXBwZW4sIHNlZSBUSFJJRlQtMTc1NQorICBpZiAoZG9jc3RyaW5nLmxlbmd0aCgpIDw9IHN0cmxlbihkb2N0ZXh0KSkgeworICAgIHN0cmNweShkb2N0ZXh0LCBkb2NzdHJpbmcuY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgZnJlZShkb2N0ZXh0KTsgLy8gdG9vIHNob3J0CisgICAgZG9jdGV4dCA9IHN0cmR1cChkb2NzdHJpbmcuY19zdHIoKSk7CisgIH0KKyAgcmV0dXJuIGRvY3RleHQ7Cit9CisKKy8qKiBTZXQgdG8gdHJ1ZSB0byBkZWJ1ZyBkb2NzdHJpbmcgcGFyc2luZyAqLworc3RhdGljIGJvb2wgZHVtcF9kb2NzID0gZmFsc2U7CisKKy8qKgorICogRHVtcHMgZG9jc3RyaW5ncyB0byBzdGRvdXQKKyAqIE9ubHkgd29ya3MgZm9yIHRvcC1sZXZlbCBkZWZpbml0aW9ucyBhbmQgdGhlIHdob2xlIHByb2dyYW0gZG9jCisgKiAoaS5lLiwgbm90IGVudW0gY29uc3RhbnRzLCBzdHJ1Y3QgZmllbGRzLCBvciBmdW5jdGlvbnMuCisgKi8KK3ZvaWQgZHVtcF9kb2NzdHJpbmdzKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICBzdHJpbmcgcHJvZ2RvYyA9IHByb2dyYW0tPmdldF9kb2MoKTsKKyAgaWYgKCFwcm9nZG9jLmVtcHR5KCkpIHsKKyAgICBwcmludGYoIldob2xlIHByb2dyYW0gZG9jOlxuJXNcbiIsIHByb2dkb2MuY19zdHIoKSk7CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfdHlwZWRlZio+JiB0eXBlZGVmcyA9IHByb2dyYW0tPmdldF90eXBlZGVmcygpOworICB2ZWN0b3I8dF90eXBlZGVmKj46OmNvbnN0X2l0ZXJhdG9yIHRfaXRlcjsKKyAgZm9yICh0X2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0X2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdF9pdGVyKSB7CisgICAgdF90eXBlZGVmKiB0ZCA9ICp0X2l0ZXI7CisgICAgaWYgKHRkLT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50ZigidHlwZWRlZiAlczpcbiVzXG4iLCB0ZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0ZC0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9lbnVtKj4mIGVudW1zID0gcHJvZ3JhbS0+Z2V0X2VudW1zKCk7CisgIHZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgZV9pdGVyOworICBmb3IgKGVfaXRlciA9IGVudW1zLmJlZ2luKCk7IGVfaXRlciAhPSBlbnVtcy5lbmQoKTsgKytlX2l0ZXIpIHsKKyAgICB0X2VudW0qIGVuID0gKmVfaXRlcjsKKyAgICBpZiAoZW4tPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJlbnVtICVzOlxuJXNcbiIsIGVuLT5nZXRfbmFtZSgpLmNfc3RyKCksIGVuLT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9CisgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0Kj4mIGNvbnN0cyA9IHByb2dyYW0tPmdldF9jb25zdHMoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHRfY29uc3QqIGNvID0gKmNfaXRlcjsKKyAgICBpZiAoY28tPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJjb25zdCAlczpcbiVzXG4iLCBjby0+Z2V0X25hbWUoKS5jX3N0cigpLCBjby0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgc3RydWN0cyA9IHByb2dyYW0tPmdldF9zdHJ1Y3RzKCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CisgIGZvciAoc19pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzX2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogc3QgPSAqc19pdGVyOworICAgIGlmIChzdC0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoInN0cnVjdCAlczpcbiVzXG4iLCBzdC0+Z2V0X25hbWUoKS5jX3N0cigpLCBzdC0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgeGNlcHRpb25zID0gcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgIHRfc3RydWN0KiB4biA9ICp4X2l0ZXI7CisgICAgaWYgKHhuLT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50ZigieGNlcHRpb24gJXM6XG4lc1xuIiwgeG4tPmdldF9uYW1lKCkuY19zdHIoKSwgeG4tPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfc2VydmljZSo+JiBzZXJ2aWNlcyA9IHByb2dyYW0tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgZm9yICh2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyB2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgdF9zZXJ2aWNlKiBzdiA9ICp2X2l0ZXI7CisgICAgaWYgKHN2LT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50Zigic2VydmljZSAlczpcbiVzXG4iLCBzdi0+Z2V0X25hbWUoKS5jX3N0cigpLCBzdi0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgd2FybmluZyBvbiBsaXN0PGJ5dGU+LCBiaW5hcnkgdHlwZSBpcyB0eXBpY2FsbHkgYSBtdWNoIGJldHRlciBjaG9pY2UuCisgKi8KK3ZvaWQgY2hlY2tfZm9yX2xpc3Rfb2ZfYnl0ZXModF90eXBlKiBsaXN0X2VsZW1fdHlwZSkgeworICBpZiAoKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSAmJiAobGlzdF9lbGVtX3R5cGUgIT0gTlVMTCkgJiYgbGlzdF9lbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlID0gKHRfYmFzZV90eXBlKilsaXN0X2VsZW1fdHlwZTsKKyAgICBpZiAodGJhc2UtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTgpIHsKKyAgICAgIHB3YXJuaW5nKDEsICJDb25zaWRlciB1c2luZyB0aGUgbW9yZSBlZmZpY2llbnQgXCJiaW5hcnlcIiB0eXBlIGluc3RlYWQgb2YgXCJsaXN0PGJ5dGU+XCIuIik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBib29sIGdfYnl0ZV93YXJuaW5nX2VtaXR0ZWQgPSBmYWxzZTsKKworLyoqCisgKiBFbWl0cyBhIG9uZS10aW1lIHdhcm5pbmcgb24gYnl0ZSB0eXBlLCBwcm9tb3RpbmcgdGhlIG5ldyBpOCB0eXBlIGluc3RlYWQKKyAqLwordm9pZCBlbWl0X2J5dGVfdHlwZV93YXJuaW5nKCkgeworICBpZiAoIWdfYnl0ZV93YXJuaW5nX2VtaXR0ZWQpIHsKKyAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICJUaGUgXCJieXRlXCIgdHlwZSBpcyBhIGNvbXBhdGliaWxpdHkgYWxpYXMgZm9yIFwiaThcIi4gVXNlIFwiaThcIiB0byBlbXBoYXNpemUgdGhlICIKKyAgICAgICAgICAgICAic2lnbmVkbmVzcyBvZiB0aGlzIHR5cGUuXG4iKTsKKyAgICBnX2J5dGVfd2FybmluZ19lbWl0dGVkID0gdHJ1ZTsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyBkZXByZWNhdGlvbiBub3RpY2UgZm9yIG9sZCBOUyBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZAorICogSWYgbmV3X2Zvcm0gaXMgTlVMTCwgb2xkX2Zvcm0gaXMgYXNzdW1lZCB0byBiZSBhIGxhbmd1YWdlIGlkZW50aWZpZXIsIHN1Y2ggYXMgImNwcCIKKyAqIElmIG5ld19mb3JtIGlzIG5vdCBOVUxMLCBib3RoIGFyZ3VtZW50cyBhcmUgdXNlZCBleGFjdGx5IGFzIGdpdmVuCisgKi8KK3ZvaWQgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woY29uc3QgY2hhciogb2xkX2Zvcm0sIGNvbnN0IGNoYXIqIG5ld19mb3JtKSB7CisgIGNvbnN0IGNoYXIqIHJlbWFpbmRlciA9ICIiOworICBpZiggbmV3X2Zvcm0gPT0gTlVMTCkgeworICAgIG5ld19mb3JtID0gb2xkX2Zvcm07CisgICAgcmVtYWluZGVyID0gIl9uYW1lc3BhY2UiOworICB9CisgIGZhaWx1cmUoIlVuc3VwcG9ydGVkIGRlY2xhcmF0aW9uICclcyVzJy4gVXNlICduYW1lc3BhY2UgJXMnIGluc3RlYWQuIiwgb2xkX2Zvcm0sIHJlbWFpbmRlciwgbmV3X2Zvcm0pOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIKKyAqLwordm9pZCB2ZXJzaW9uKCkgeworICBwcmludGYoIlRocmlmdCB2ZXJzaW9uICVzXG4iLCBUSFJJRlRfVkVSU0lPTik7Cit9CisKKy8qKgorICogRGlzcGxheSB0aGUgdXNhZ2UgbWVzc2FnZSBhbmQgdGhlbiBleGl0IHdpdGggYW4gZXJyb3IgY29kZS4KKyAqLwordm9pZCB1c2FnZSgpIHsKKyAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogdGhyaWZ0IFtvcHRpb25zXSBmaWxlXG5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIlVzZSB0aHJpZnQgLWhlbHAgZm9yIGEgbGlzdCBvZiBvcHRpb25zXG4iKTsKKyAgZXhpdCgxKTsKK30KKworLyoqCisgKiBEaXBsYXlzIHRoZSBoZWxwIG1lc3NhZ2UgYW5kIHRoZW4gZXhpdHMgd2l0aCBhbiBlcnJvciBjb2RlLgorICovCit2b2lkIGhlbHAoKSB7CisgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHRocmlmdCBbb3B0aW9uc10gZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiT3B0aW9uczpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcnNpb24gICAgUHJpbnQgdGhlIGNvbXBpbGVyIHZlcnNpb25cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW8gZGlyICAgICAgU2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciBnZW4tKiBwYWNrYWdlc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGN1cnJlbnQgZGlyZWN0b3J5KVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtb3V0IGRpciAgICBTZXQgdGhlIG91cHV0IGxvY2F0aW9uIGZvciBnZW5lcmF0ZWQgZmlsZXMuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAobm8gZ2VuLSogZm9sZGVyIHdpbGwgYmUgY3JlYXRlZClcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLUkgZGlyICAgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIGluY2x1ZGUgZGlyZWN0aXZlc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtbm93YXJuICAgICBTdXBwcmVzcyBhbGwgY29tcGlsZXIgd2FybmluZ3MgKEJBRCEpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1zdHJpY3QgICAgIFN0cmljdCBjb21waWxlciB3YXJuaW5ncyBvblxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdltlcmJvc2VdICBWZXJib3NlIG1vZGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJbZWN1cnNlXSAgQWxzbyBnZW5lcmF0ZSBpbmNsdWRlZCBmaWxlc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtZGVidWcgICAgICBQYXJzZSBkZWJ1ZyB0cmFjZSB0byBzdGRvdXRcbiIpOworICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAiICAtLWFsbG93LW5lZy1rZXlzICBBbGxvdyBuZWdhdGl2ZSBmaWVsZCBrZXlzIChVc2VkIHRvICIKKyAgICAgICAgICAicHJlc2VydmUgcHJvdG9jb2xcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgLnRocmlmdCBmaWxlcylcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLS1hbGxvdy02NGJpdC1jb25zdHMgIERvIG5vdCBwcmludCB3YXJuaW5ncyBhYm91dCB1c2luZyA2NC1iaXQgY29uc3RhbnRzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC0tZ2VuIFNUUiAgIEdlbmVyYXRlIGNvZGUgd2l0aCBhIGR5bmFtaWNhbGx5LXJlZ2lzdGVyZWQgZ2VuZXJhdG9yLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIFNUUiBoYXMgdGhlIGZvcm0gbGFuZ3VhZ2VbOmtleTE9dmFsMVssa2V5Mlssa2V5Mz12YWwzXV1dLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIEtleXMgYW5kIHZhbHVlcyBhcmUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGdlbmVyYXRvci5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBNYW55IG9wdGlvbnMgd2lsbCBub3QgcmVxdWlyZSB2YWx1ZXMuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnMgcmVsYXRlZCB0byBhdWRpdCBvcGVyYXRpb25cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgIC0tYXVkaXQgT2xkRmlsZSAgIE9sZCBUaHJpZnQgZmlsZSB0byBiZSBhdWRpdGVkIHdpdGggJ2ZpbGUnXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1Jb2xkIGRpciAgICBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBzZWFyY2hlZCBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIGZvciBvbGQgdGhyaWZ0IGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLUluZXcgZGlyICAgIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIHNlYXJjaGVkIGZvciBpbmNsdWRlIGRpcmVjdGl2ZXMgZm9yIG5ldyB0aHJpZnQgZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJBdmFpbGFibGUgZ2VuZXJhdG9ycyAoYW5kIG9wdGlvbnMpOlxuIik7CisKKyAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCBnZW5fbWFwID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCk7CisgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0ZXI7CisgIGZvciAoaXRlciA9IGdlbl9tYXAuYmVnaW4oKTsgaXRlciAhPSBnZW5fbWFwLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICIgICVzICglcyk6XG4iLAorICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5nZXRfc2hvcnRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9sb25nX25hbWUoKS5jX3N0cigpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgaXRlci0+c2Vjb25kLT5nZXRfZG9jdW1lbnRhdGlvbigpLmNfc3RyKCkpOworICB9CisgIGV4aXQoMSk7Cit9CisKKy8qKgorICogWW91IGtub3csIHdoZW4gSSBzdGFydGVkIHdvcmtpbmcgb24gVGhyaWZ0IEkgcmVhbGx5IHRob3VnaHQgaXQgd2Fzbid0IGdvaW5nCisgKiB0byBiZWNvbWUgYSBwcm9ncmFtbWluZyBsYW5ndWFnZSBiZWNhdXNlIGl0IHdhcyBqdXN0IGEgZ2VuZXJhdG9yIGFuZCBpdAorICogd291bGRuJ3QgbmVlZCBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gYW5kIGFsbCB0aGF0IGphenouIEJ1dCB0aGVuIHdlCisgKiBkZWNpZGVkIHRvIGFkZCBjb25zdGFudHMsIGFuZCBhbGwgb2YgYSBzdWRkZW4gdGhhdCBtZWFucyBydW50aW1lIHR5cGUKKyAqIHZhbGlkYXRpb24gYW5kIGluZmVyZW5jZSwgZXhjZXB0IHRoZSAicnVudGltZSIgaXMgdGhlIGNvZGUgZ2VuZXJhdG9yCisgKiBydW50aW1lLgorICovCit2b2lkIHZhbGlkYXRlX2NvbnN0X3JlYyhzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAidHlwZSBlcnJvcjogY2Fubm90IGRlY2xhcmUgYSB2b2lkIGNvbnN0OiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJpbmciOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGJvb2wiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBieXRlIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGkxNiI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpMzIiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTY0IjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIKKyAgICAgICAgICAmJiB2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEUpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGRvdWJsZSI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUikgeworICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGVudW0iOworICAgIH0KKworICAgIC8vIHNlZSBpZiB0aGVyZSdzIGEgZG90IGluIHRoZSBpZGVudGlmaWVyCisgICAgc3RkOjpzdHJpbmcgbmFtZV9wb3J0aW9uID0gdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSAoKHRfZW51bSopdHlwZSktPmdldF9jb25zdGFudHMoKTsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisKKyAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGlmICgoKmNfaXRlciktPmdldF9uYW1lKCkgPT0gbmFtZV9wb3J0aW9uKSB7CisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICghZm91bmQpIHsKKyAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCAiICsgbmFtZSArICIgd2FzIGRlY2xhcmVkIGFzIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICArICIgd2hpY2ggaXMgYW4gZW51bSwgYnV0ICIgKyB2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKQorICAgICAgICAgICsgIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVApIHsKKyAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJ1Y3QveGNlcHRpb24iOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpZiAodl9pdGVyLT5maXJzdC0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkcpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyBuYW1lICsgIiBzdHJ1Y3Qga2V5IG11c3QgYmUgc3RyaW5nIjsKKyAgICAgIH0KKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiLiIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCksIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGtfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8a2V5PiIsIGtfdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8dmFsPiIsIHZfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGVfdHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBlX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8ZWxlbT4iLCBlX3R5cGUsICp2X2l0ZXIpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIENoZWNrIHNpbXBsZSBpZGVudGlmaWVyIG5hbWVzCisgKiBJdCdzIGVhc2llciB0byBkbyBpdCB0aGlzIHdheSBpbnN0ZWFkIG9mIHJld3JpdGluZyB0aGUgd2hvbGUgZ3JhbW1hciBldGMuCisgKi8KK3ZvaWQgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoY29uc3QgY2hhciogaWRlbnRpZmllcikgeworICBzdHJpbmcgbmFtZShpZGVudGlmaWVyKTsKKyAgaWYgKG5hbWUuZmluZCgiLiIpICE9IHN0cmluZzo6bnBvcykgeworICAgIHl5ZXJyb3IoIklkZW50aWZpZXIgJXMgY2FuJ3QgaGF2ZSBhIGRvdC4iLCBpZGVudGlmaWVyKTsKKyAgICBleGl0KDEpOworICB9Cit9CisKKy8qKgorICogQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHBhcnNlZCBjb25zdCBpbmZvcm1hdGlvbiBhZ2FpbnN0IGl0cyBkZWNsYXJlZCB0eXBlCisgKi8KK3ZvaWQgdmFsaWRhdGVfY29uc3RfdHlwZSh0X2NvbnN0KiBjKSB7CisgIHZhbGlkYXRlX2NvbnN0X3JlYyhjLT5nZXRfbmFtZSgpLCBjLT5nZXRfdHlwZSgpLCBjLT5nZXRfdmFsdWUoKSk7Cit9CisKKy8qKgorICogQ2hlY2sgdGhlIHR5cGUgb2YgYSBkZWZhdWx0IHZhbHVlIGFzc2lnbmVkIHRvIGEgZmllbGQuCisgKi8KK3ZvaWQgdmFsaWRhdGVfZmllbGRfdmFsdWUodF9maWVsZCogZmllbGQsIHRfY29uc3RfdmFsdWUqIGN2KSB7CisgIHZhbGlkYXRlX2NvbnN0X3JlYyhmaWVsZC0+Z2V0X25hbWUoKSwgZmllbGQtPmdldF90eXBlKCksIGN2KTsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IGFsbCB0aGUgZWxlbWVudHMgb2YgYSB0aHJvd3MgYmxvY2sgYXJlIGFjdHVhbGx5IGV4Y2VwdGlvbnMuCisgKi8KK2Jvb2wgdmFsaWRhdGVfdGhyb3dzKHRfc3RydWN0KiB0aHJvd3MpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRocm93cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCF0X2dlbmVyYXRvcjo6Z2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFNraXBzIFVURi04IEJPTSBpZiB0aGVyZSBpcyBvbmUKKyAqLworYm9vbCBza2lwX3V0ZjhfYm9tKEZJTEUqIGYpIHsKKworICAvLyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLCBidXQgd29ya3MKKyAgaWYgKGZnZXRjKGYpID09IDB4RUYpIHsKKyAgICBpZiAoZmdldGMoZikgPT0gMHhCQikgeworICAgICAgaWYgKGZnZXRjKGYpID09IDB4QkYpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV3aW5kKGYpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogUGFyc2VzIGEgcHJvZ3JhbQorICovCit2b2lkIHBhcnNlKHRfcHJvZ3JhbSogcHJvZ3JhbSwgdF9wcm9ncmFtKiBwYXJlbnRfcHJvZ3JhbSkgeworICAvLyBHZXQgc2NvcGUgZmlsZSBwYXRoCisgIHN0cmluZyBwYXRoID0gcHJvZ3JhbS0+Z2V0X3BhdGgoKTsKKworICAvLyBTZXQgY3VycmVudCBkaXIgZ2xvYmFsLCB3aGljaCBpcyB1c2VkIGluIHRoZSBpbmNsdWRlX2ZpbGUgZnVuY3Rpb24KKyAgZ19jdXJkaXIgPSBkaXJlY3RvcnlfbmFtZShwYXRoKTsKKyAgZ19jdXJwYXRoID0gcGF0aDsKKworICAvLyBPcGVuIHRoZSBmaWxlCisgIC8vIHNraXAgVVRGLTggQk9NIGlmIHRoZXJlIGlzIG9uZQorICB5eWluID0gZm9wZW4ocGF0aC5jX3N0cigpLCAiciIpOworICBpZiAoeXlpbiA9PSAwKSB7CisgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZTogXCIlc1wiIiwgcGF0aC5jX3N0cigpKTsKKyAgfQorICBpZiAoc2tpcF91dGY4X2JvbSh5eWluKSkKKyAgICBwdmVyYm9zZSgiU2tpcHBlZCBVVEYtOCBCT00gYXQgJXNcbiIsIHBhdGguY19zdHIoKSk7CisKKyAgLy8gQ3JlYXRlIG5ldyBzY29wZSBhbmQgc2NhbiBmb3IgaW5jbHVkZXMKKyAgcHZlcmJvc2UoIlNjYW5uaW5nICVzIGZvciBpbmNsdWRlc1xuIiwgcGF0aC5jX3N0cigpKTsKKyAgZ19wYXJzZV9tb2RlID0gSU5DTFVERVM7CisgIGdfcHJvZ3JhbSA9IHByb2dyYW07CisgIGdfc2NvcGUgPSBwcm9ncmFtLT5zY29wZSgpOworICB0cnkgeworICAgIHl5bGluZW5vID0gMTsKKyAgICBpZiAoeXlwYXJzZSgpICE9IDApIHsKKyAgICAgIGZhaWx1cmUoIlBhcnNlciBlcnJvciBkdXJpbmcgaW5jbHVkZSBwYXNzLiIpOworICAgIH0KKyAgfSBjYXRjaCAoc3RyaW5nIHgpIHsKKyAgICBmYWlsdXJlKHguY19zdHIoKSk7CisgIH0KKyAgZmNsb3NlKHl5aW4pOworCisgIC8vIFJlY3Vyc2l2ZWx5IHBhcnNlIGFsbCB0aGUgaW5jbHVkZSBwcm9ncmFtcworICB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlcjsKKyAgZm9yIChpdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgKytpdGVyKSB7CisgICAgcGFyc2UoKml0ZXIsIHByb2dyYW0pOworICB9CisKKyAgLy8gcmVzZXQgcHJvZ3JhbSBkb2N0ZXh0IHN0YXR1cyBiZWZvcmUgcGFyc2luZyBhIG5ldyBmaWxlCisgIHJlc2V0X3Byb2dyYW1fZG9jdGV4dF9pbmZvKCk7CisKKyAgLy8gUGFyc2UgdGhlIHByb2dyYW0gZmlsZQorICBnX3BhcnNlX21vZGUgPSBQUk9HUkFNOworICBnX3Byb2dyYW0gPSBwcm9ncmFtOworICBnX3Njb3BlID0gcHJvZ3JhbS0+c2NvcGUoKTsKKyAgZ19wYXJlbnRfc2NvcGUgPSAocGFyZW50X3Byb2dyYW0gIT0gTlVMTCkgPyBwYXJlbnRfcHJvZ3JhbS0+c2NvcGUoKSA6IE5VTEw7CisgIGdfcGFyZW50X3ByZWZpeCA9IHByb2dyYW0tPmdldF9uYW1lKCkgKyAiLiI7CisgIGdfY3VycGF0aCA9IHBhdGg7CisKKyAgLy8gT3BlbiB0aGUgZmlsZQorICAvLyBza2lwIFVURi04IEJPTSBpZiB0aGVyZSBpcyBvbmUKKyAgeXlpbiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInIiKTsKKyAgaWYgKHl5aW4gPT0gMCkgeworICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6IFwiJXNcIiIsIHBhdGguY19zdHIoKSk7CisgIH0KKyAgaWYgKHNraXBfdXRmOF9ib20oeXlpbikpCisgICAgcHZlcmJvc2UoIlNraXBwZWQgVVRGLTggQk9NIGF0ICVzXG4iLCBwYXRoLmNfc3RyKCkpOworCisgIHB2ZXJib3NlKCJQYXJzaW5nICVzIGZvciB0eXBlc1xuIiwgcGF0aC5jX3N0cigpKTsKKyAgeXlsaW5lbm8gPSAxOworICB0cnkgeworICAgIGlmICh5eXBhcnNlKCkgIT0gMCkgeworICAgICAgZmFpbHVyZSgiUGFyc2VyIGVycm9yIGR1cmluZyB0eXBlcyBwYXNzLiIpOworICAgIH0KKyAgfSBjYXRjaCAoc3RyaW5nIHgpIHsKKyAgICBmYWlsdXJlKHguY19zdHIoKSk7CisgIH0KKyAgZmNsb3NlKHl5aW4pOworfQorCisvKioKKyAqIEdlbmVyYXRlIGNvZGUKKyAqLwordm9pZCBnZW5lcmF0ZSh0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBnZW5lcmF0b3Jfc3RyaW5ncykgeworICAvLyBPb29vaGgsIHJlY3Vyc2l2ZSBjb2RlIGdlbmVyYXRpb24sIGhvdCEhCisgIGlmIChnZW5fcmVjdXJzZSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKKyAgICBmb3IgKGF1dG8gaW5jbHVkZSA6IGluY2x1ZGVzKSB7CisgICAgICAvLyBQcm9wYWdhdGUgb3V0cHV0IHBhdGggZnJvbSBwYXJlbnQgdG8gY2hpbGQgcHJvZ3JhbXMKKyAgICAgIGluY2x1ZGUtPnNldF9vdXRfcGF0aChwcm9ncmFtLT5nZXRfb3V0X3BhdGgoKSwgcHJvZ3JhbS0+aXNfb3V0X3BhdGhfYWJzb2x1dGUoKSk7CisKKyAgICAgIGdlbmVyYXRlKGluY2x1ZGUsIGdlbmVyYXRvcl9zdHJpbmdzKTsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb2RlIQorICB0cnkgeworICAgIHB2ZXJib3NlKCJQcm9ncmFtOiAlc1xuIiwgcHJvZ3JhbS0+Z2V0X3BhdGgoKS5jX3N0cigpKTsKKworICAgIGlmIChkdW1wX2RvY3MpIHsKKyAgICAgIGR1bXBfZG9jc3RyaW5ncyhwcm9ncmFtKTsKKyAgICB9CisKKyAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKyAgICBmb3IgKGl0ZXIgPSBnZW5lcmF0b3Jfc3RyaW5ncy5iZWdpbigpOyBpdGVyICE9IGdlbmVyYXRvcl9zdHJpbmdzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRfZ2VuZXJhdG9yKiBnZW5lcmF0b3IgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcihwcm9ncmFtLCAqaXRlcik7CisKKyAgICAgIGlmIChnZW5lcmF0b3IgPT0gTlVMTCkgeworICAgICAgICBwd2FybmluZygxLCAiVW5hYmxlIHRvIGdldCBhIGdlbmVyYXRvciBmb3IgXCIlc1wiLlxuIiwgaXRlci0+Y19zdHIoKSk7CisgICAgICAgIGdfZ2VuZXJhdG9yX2ZhaWx1cmUgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChnZW5lcmF0b3IpIHsKKyAgICAgICAgZ2VuZXJhdG9yLT52YWxpZGF0ZV9pbnB1dCgpOworICAgICAgICBwdmVyYm9zZSgiR2VuZXJhdGluZyBcIiVzXCJcbiIsIGl0ZXItPmNfc3RyKCkpOworICAgICAgICBnZW5lcmF0b3ItPmdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgICAgICAgZGVsZXRlIGdlbmVyYXRvcjsKKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKHN0cmluZyBzKSB7CisgICAgZmFpbHVyZSgiRXJyb3I6ICVzXG4iLCBzLmNfc3RyKCkpOworICB9IGNhdGNoIChjb25zdCBjaGFyKiBleGMpIHsKKyAgICBmYWlsdXJlKCJFcnJvcjogJXNcbiIsIGV4Yyk7CisgIH0KK30KKwordm9pZCBhdWRpdCh0X3Byb2dyYW0qIG5ld19wcm9ncmFtLAorICAgICAgICAgICB0X3Byb2dyYW0qIG9sZF9wcm9ncmFtLAorICAgICAgICAgICBzdHJpbmcgbmV3X3RocmlmdF9pbmNsdWRlX3BhdGgsCisgICAgICAgICAgIHN0cmluZyBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCkgeworICB2ZWN0b3I8c3RyaW5nPiB0ZW1wX2luY2xfc2VhcmNocGF0aCA9IGdfaW5jbF9zZWFyY2hwYXRoOworICBpZiAoIW9sZF90aHJpZnRfaW5jbHVkZV9wYXRoLmVtcHR5KCkpIHsKKyAgICBnX2luY2xfc2VhcmNocGF0aC5wdXNoX2JhY2sob2xkX3RocmlmdF9pbmNsdWRlX3BhdGgpOworICB9CisKKyAgcGFyc2Uob2xkX3Byb2dyYW0sIE5VTEwpOworCisgIGdfaW5jbF9zZWFyY2hwYXRoID0gdGVtcF9pbmNsX3NlYXJjaHBhdGg7CisgIGlmICghbmV3X3RocmlmdF9pbmNsdWRlX3BhdGguZW1wdHkoKSkgeworICAgIGdfaW5jbF9zZWFyY2hwYXRoLnB1c2hfYmFjayhuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aCk7CisgIH0KKworICBwYXJzZShuZXdfcHJvZ3JhbSwgTlVMTCk7CisKKyAgY29tcGFyZV9uYW1lc3BhY2UobmV3X3Byb2dyYW0sIG9sZF9wcm9ncmFtKTsKKyAgY29tcGFyZV9zZXJ2aWNlcyhuZXdfcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCksIG9sZF9wcm9ncmFtLT5nZXRfc2VydmljZXMoKSk7CisgIGNvbXBhcmVfZW51bXMobmV3X3Byb2dyYW0tPmdldF9lbnVtcygpLCBvbGRfcHJvZ3JhbS0+Z2V0X2VudW1zKCkpOworICBjb21wYXJlX3N0cnVjdHMobmV3X3Byb2dyYW0tPmdldF9zdHJ1Y3RzKCksIG9sZF9wcm9ncmFtLT5nZXRfc3RydWN0cygpKTsKKyAgY29tcGFyZV9zdHJ1Y3RzKG5ld19wcm9ncmFtLT5nZXRfeGNlcHRpb25zKCksIG9sZF9wcm9ncmFtLT5nZXRfeGNlcHRpb25zKCkpOworICBjb21wYXJlX2NvbnN0cyhuZXdfcHJvZ3JhbS0+Z2V0X2NvbnN0cygpLCBvbGRfcHJvZ3JhbS0+Z2V0X2NvbnN0cygpKTsKK30KKworLyoqCisgKiBQYXJzZSBpdCB1cC4uIHRoZW4gc3BpdCBpdCBiYWNrIG91dCwgaW4gcHJldHR5IG11Y2ggZXZlcnkgbGFuZ3VhZ2UuIEFscmlnaHQKKyAqIG5vdCB0aGF0IG1hbnkgbGFuZ3VhZ2VzLCBidXQgdGhlIGNvb2wgb25lcyB0aGF0IHdlIGNhcmUgYWJvdXQuCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBpbnQgaTsKKyAgc3RkOjpzdHJpbmcgb3V0X3BhdGg7CisgIGJvb2wgb3V0X3BhdGhfaXNfYWJzb2x1dGUgPSBmYWxzZTsKKworICAvLyBTZXR1cCB0aW1lIHN0cmluZworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgZ190aW1lX3N0ciA9IGN0aW1lKCZub3cpOworCisgIC8vIENoZWNrIGZvciBuZWNlc3NhcnkgYXJndW1lbnRzLCB5b3UgZ290dGEgaGF2ZSBhdCBsZWFzdCBhIGZpbGVuYW1lIGFuZAorICAvLyBhbiBvdXRwdXQgbGFuZ3VhZ2UgZmxhZworICBpZiAoYXJnYyA8IDIpIHsKKyAgICB1c2FnZSgpOworICB9CisKKyAgdmVjdG9yPHN0cmluZz4gZ2VuZXJhdG9yX3N0cmluZ3M7CisgIHN0cmluZyBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aDsKKyAgc3RyaW5nIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoOworICBzdHJpbmcgb2xkX2lucHV0X2ZpbGU7CisKKyAgLy8gU2V0IHRoZSBjdXJyZW50IHBhdGggdG8gYSBkdW1teSB2YWx1ZSB0byBtYWtlIHdhcm5pbmcgbWVzc2FnZXMgY2xlYXJlci4KKyAgZ19jdXJwYXRoID0gImFyZ3VtZW50cyI7CisKKyAgLy8gSGFja3kgcGFyYW1ldGVyIGhhbmRsaW5nLi4uIEkgZGlkbid0IGZlZWwgbGlrZSB1c2luZyBhIGxpYnJhcnkgc29ycnkhCisgIGZvciAoaSA9IDE7IGkgPCBhcmdjIC0gMTsgaSsrKSB7CisgICAgY2hhciogYXJnOworCisgICAgYXJnID0gc3RydG9rKGFyZ3ZbaV0sICIgIik7CisgICAgd2hpbGUgKGFyZyAhPSBOVUxMKSB7CisgICAgICAvLyBUcmVhdCBkb3VibGUgZGFzaGVzIGFzIHNpbmdsZSBkYXNoZXMKKyAgICAgIGlmIChhcmdbMF0gPT0gJy0nICYmIGFyZ1sxXSA9PSAnLScpIHsKKyAgICAgICAgKythcmc7CisgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAoYXJnLCAiLWhlbHAiKSA9PSAwKSB7CisgICAgICAgIGhlbHAoKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi12ZXJzaW9uIikgPT0gMCkgeworICAgICAgICB2ZXJzaW9uKCk7CisgICAgICAgIGV4aXQoMCk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZGVidWciKSA9PSAwKSB7CisgICAgICAgIGdfZGVidWcgPSAxOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLW5vd2FybiIpID09IDApIHsKKyAgICAgICAgZ193YXJuID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1zdHJpY3QiKSA9PSAwKSB7CisgICAgICAgIGdfc3RyaWN0ID0gMjU1OworICAgICAgICBnX3dhcm4gPSAyOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXYiKSA9PSAwIHx8IHN0cmNtcChhcmcsICItdmVyYm9zZSIpID09IDApIHsKKyAgICAgICAgZ192ZXJib3NlID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1yIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXJlY3Vyc2UiKSA9PSAwKSB7CisgICAgICAgIGdlbl9yZWN1cnNlID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hbGxvdy1uZWcta2V5cyIpID09IDApIHsKKyAgICAgICAgZ19hbGxvd19uZWdfZmllbGRfa2V5cyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYWxsb3ctNjRiaXQtY29uc3RzIikgPT0gMCkgeworICAgICAgICBnX2FsbG93XzY0Yml0X2NvbnN0cyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZ2VuIikgPT0gMCkgeworICAgICAgICBhcmcgPSBhcmd2WysraV07CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBnZW5lcmF0b3Igc3BlY2lmaWNhdGlvblxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0b3Jfc3RyaW5ncy5lbXBsYWNlX2JhY2soYXJnKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1JIikgPT0gMCkgeworICAgICAgICAvLyBBbiBhcmd1bWVudCBvZiAiLUlcIGFzZGYiIGlzIGludmFsaWQgYW5kIGhhcyB1bmtub3duIHJlc3VsdHMKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworCisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBJbmNsdWRlIGRpcmVjdG9yeVxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBnX2luY2xfc2VhcmNocGF0aC5lbXBsYWNlX2JhY2soYXJnKTsKKyAgICAgIH0gZWxzZSBpZiAoKHN0cmNtcChhcmcsICItbyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAiLW91dCIpID09IDApKSB7CisgICAgICAgIG91dF9wYXRoX2lzX2Fic29sdXRlID0gKHN0cmNtcChhcmcsICItb3V0IikgPT0gMCkgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICItbzogbWlzc2luZyBvdXRwdXQgZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIG91dF9wYXRoID0gYXJnOworCisjaWZkZWYgX1dJTjMyCisgICAgICAgIC8vIHN0cmlwIG91dCB0cmFpbGluZyBcIG9uIFdpbmRvd3MKKyAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0ID0gb3V0X3BhdGgubGVuZ3RoKCkgLSAxOworICAgICAgICBpZiAob3V0X3BhdGhbbGFzdF0gPT0gJ1xcJykgeworICAgICAgICAgIG91dF9wYXRoLmVyYXNlKGxhc3QpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKCFjaGVja19pc19kaXJlY3Rvcnkob3V0X3BhdGguY19zdHIoKSkpCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWF1ZGl0IikgPT0gMCkgeworICAgICAgICBnX2F1ZGl0ID0gdHJ1ZTsKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3Npbmcgb2xkIHRocmlmdCBmaWxlIG5hbWUgZm9yIGF1ZGl0IG9wZXJhdGlvblxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBjaGFyIG9sZF90aHJpZnRfZmlsZV9ycFtUSFJJRlRfUEFUSF9NQVhdOworCisgICAgICAgIC8vIGNwcGNoZWNrLXN1cHByZXNzIHVuaW5pdHZhcgorICAgICAgICBpZiAoc2FmZXJlYWxwYXRoKGFyZywgb2xkX3RocmlmdF9maWxlX3JwKSA9PSBOVUxMKSB7CisgICAgICAgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSB3aXRoIHJlYWxwYXRoOiAlcyIsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgb2xkX2lucHV0X2ZpbGUgPSBzdHJpbmcob2xkX3RocmlmdF9maWxlX3JwKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hdWRpdC1ub2ZhdGFsIikgPT0gMCkgeworICAgICAgICBnX2F1ZGl0X2ZhdGFsID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItSW9sZCIpID09IDApIHsKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgSW5jbHVkZSBkaXJlY3RvcnkgZm9yIG9sZCB0aHJpZnQgZmlsZVxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCA9IHN0cmluZyhhcmcpOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLUluZXciKSA9PSAwKSB7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIEluY2x1ZGUgZGlyZWN0b3J5IGZvciBuZXcgdGhyaWZ0IGZpbGVcbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgbmV3X3RocmlmdF9pbmNsdWRlX3BhdGggPSBzdHJpbmcoYXJnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5yZWNvZ25pemVkIG9wdGlvbjogJXNcbiIsIGFyZyk7CisgICAgICAgIHVzYWdlKCk7CisgICAgICB9CisKKyAgICAgIC8vIFRva2VuaXplIG1vcmUKKyAgICAgIGFyZyA9IHN0cnRvayhOVUxMLCAiICIpOworICAgIH0KKyAgfQorCisgIC8vIGRpc3BsYXkgaGVscAorICBpZiAoKHN0cmNtcChhcmd2W2FyZ2MgLSAxXSwgIi1oZWxwIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2W2FyZ2MgLSAxXSwgIi0taGVscCIpID09IDApKSB7CisgICAgaGVscCgpOworICB9CisKKyAgLy8gaWYgeW91J3JlIGFza2luZyBmb3IgdmVyc2lvbiwgeW91IGhhdmUgYSByaWdodCBub3QgdG8gcGFzcyBhIGZpbGUKKyAgaWYgKChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItdmVyc2lvbiIpID09IDApIHx8IChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItLXZlcnNpb24iKSA9PSAwKSkgeworICAgIHZlcnNpb24oKTsKKyAgICBleGl0KDApOworICB9CisKKyAgLy8gSW5pdGlhbGl6ZSBnbG9iYWwgdHlwZXMKKyAgaW5pdEdsb2JhbHMoKTsKKworICBpZiAoZ19hdWRpdCkgeworICAgIC8vIEF1ZGl0IG9wZXJhdGlvbgorCisgICAgaWYgKG9sZF9pbnB1dF9maWxlLmVtcHR5KCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBmaWxlIG5hbWUgb2Ygb2xkIHRocmlmdCBmaWxlIGZvciBhdWRpdFxuIik7CisgICAgICB1c2FnZSgpOworICAgIH0KKworICAgIGNoYXIgbmV3X3RocmlmdF9maWxlX3JwW1RIUklGVF9QQVRIX01BWF07CisgICAgaWYgKGFyZ3ZbaV0gPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGZpbGUgbmFtZSBvZiBuZXcgdGhyaWZ0IGZpbGUgZm9yIGF1ZGl0XG4iKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICAgIC8vIGNwcGNoZWNrLXN1cHByZXNzIHVuaW5pdHZhcgorICAgIGlmIChzYWZlcmVhbHBhdGgoYXJndltpXSwgbmV3X3RocmlmdF9maWxlX3JwKSA9PSBOVUxMKSB7CisgICAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJndltpXSk7CisgICAgfQorICAgIHN0cmluZyBuZXdfaW5wdXRfZmlsZShuZXdfdGhyaWZ0X2ZpbGVfcnApOworCisgICAgdF9wcm9ncmFtIG5ld19wcm9ncmFtKG5ld19pbnB1dF9maWxlKTsKKyAgICB0X3Byb2dyYW0gb2xkX3Byb2dyYW0ob2xkX2lucHV0X2ZpbGUpOworCisgICAgYXVkaXQoJm5ld19wcm9ncmFtLCAmb2xkX3Byb2dyYW0sIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoLCBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCk7CisKKyAgfSBlbHNlIHsKKyAgICAvLyBHZW5lcmF0ZSBvcHRpb25zCisKKyAgICAvLyBZb3UgZ290dGEgZ2VuZXJhdGUgc29tZXRoaW5nIQorICAgIGlmIChnZW5lcmF0b3Jfc3RyaW5ncy5lbXB0eSgpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIG91dHB1dCBsYW5ndWFnZShzKSBzcGVjaWZpZWRcbiIpOworICAgICAgdXNhZ2UoKTsKKyAgICB9CisKKyAgICAvLyBSZWFsLXBhdGhpZnkgaXQKKyAgICBjaGFyIHJwW1RIUklGVF9QQVRIX01BWF07CisgICAgaWYgKGFyZ3ZbaV0gPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGZpbGUgbmFtZVxuIik7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICBpZiAoc2FmZXJlYWxwYXRoKGFyZ3ZbaV0sIHJwKSA9PSBOVUxMKSB7CisgICAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJndltpXSk7CisgICAgfQorICAgIHN0cmluZyBpbnB1dF9maWxlKHJwKTsKKworICAgIC8vIEluc3RhbmNlIG9mIHRoZSBnbG9iYWwgcGFyc2UgdHJlZQorICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0oaW5wdXRfZmlsZSk7CisgICAgaWYgKG91dF9wYXRoLnNpemUoKSkgeworICAgICAgcHJvZ3JhbS0+c2V0X291dF9wYXRoKG91dF9wYXRoLCBvdXRfcGF0aF9pc19hYnNvbHV0ZSk7CisgICAgfQorCisgICAgLy8gQ29tcHV0ZSB0aGUgY3BwIGluY2x1ZGUgcHJlZml4LgorICAgIC8vIGluZmVyIHRoaXMgZnJvbSB0aGUgZmlsZW5hbWUgcGFzc2VkIGluCisgICAgc3RyaW5nIGlucHV0X2ZpbGVuYW1lID0gYXJndltpXTsKKyAgICBzdHJpbmcgaW5jbHVkZV9wcmVmaXg7CisKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RyaW5nOjpucG9zOworICAgIGlmICgobGFzdF9zbGFzaCA9IGlucHV0X2ZpbGVuYW1lLnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgeworICAgICAgaW5jbHVkZV9wcmVmaXggPSBpbnB1dF9maWxlbmFtZS5zdWJzdHIoMCwgbGFzdF9zbGFzaCk7CisgICAgfQorCisgICAgcHJvZ3JhbS0+c2V0X2luY2x1ZGVfcHJlZml4KGluY2x1ZGVfcHJlZml4KTsKKworICAgIC8vIFBhcnNlIGl0IQorICAgIHBhcnNlKHByb2dyYW0sIE5VTEwpOworCisgICAgLy8gVGhlIGN1cnJlbnQgcGF0aCBpcyBub3QgcmVhbGx5IHJlbGV2YW50IHdoZW4gd2UgYXJlIGRvaW5nIGdlbmVyYXRpb24uCisgICAgLy8gUmVzZXQgdGhlIHZhcmlhYmxlIHRvIG1ha2Ugd2FybmluZyBtZXNzYWdlcyBjbGVhcmVyLgorICAgIGdfY3VycGF0aCA9ICJnZW5lcmF0aW9uIjsKKyAgICAvLyBSZXNldCB5eWxpbmVubyBmb3IgdGhlIGhlY2sgb2YgaXQuICBVc2UgMSBpbnN0ZWFkIG9mIDAgYmVjYXVzZQorICAgIC8vIFRoYXQgaXMgd2hhdCBzaG93cyB1cCBkdXJpbmcgYXJndW1lbnQgcGFyc2luZy4KKyAgICB5eWxpbmVubyA9IDE7CisKKyAgICAvLyBHZW5lcmF0ZSBpdCEKKyAgICBnZW5lcmF0ZShwcm9ncmFtLCBnZW5lcmF0b3Jfc3RyaW5ncyk7CisgICAgZGVsZXRlIHByb2dyYW07CisgIH0KKworICAvLyBDbGVhbiB1cC4gV2hvIGFtIEkga2lkZGluZy4uLiB0aGlzIHByb2dyYW0gcHJvYmFibHkgb3JwaGFucyBoZWFwIG1lbW9yeQorICAvLyBhbGwgb3ZlciB0aGUgcGxhY2UsIGJ1dCB3aG8gY2FyZXMgYmVjYXVzZSBpdCBpcyBhYm91dCB0byBleGl0IGFuZCBpdCBpcworICAvLyBhbGwgcmVmZXJlbmNlZCBhbmQgdXNlZCBieSB0aGlzIHdhY2t5IHBhcnNlIHRyZWUgdXAgdW50aWwgbm93IGFueXdheXMuCisgIGNsZWFyR2xvYmFscygpOworCisgIC8vIEZpbmlzaGVkCisgIGlmIChnX3JldHVybl9mYWlsdXJlICYmIGdfYXVkaXRfZmF0YWwpIHsKKyAgICBleGl0KDIpOworICB9CisgIGlmIChnX2dlbmVyYXRvcl9mYWlsdXJlKSB7CisgICAgZXhpdCgzKTsKKyAgfQorICAvLyBGaW5pc2hlZAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjNiMDJlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9NQUlOX0gKKyNkZWZpbmUgVF9NQUlOX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjc3RkaW8+CisKKyNpbmNsdWRlICJ0aHJpZnQvbG9nZ2luZy5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9maWVsZC5oIgorCisvKioKKyAqIERlZmluZWQgaW4gdGhlIGZsZXggbGlicmFyeQorICovCisKK2V4dGVybiAiQyIgeyBpbnQgeXlsZXgodm9pZCk7IH0KKworaW50IHl5cGFyc2Uodm9pZCk7CisKKy8qKgorICogRXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCBieSBGbGV4L0Jpc29uCisgKi8KK3ZvaWQgeXllcnJvcihjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKy8qKgorICogQ2hlY2sgc2ltcGxlIGlkZW50aWZpZXIgbmFtZXMKKyAqLwordm9pZCB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllcihjb25zdCBjaGFyKiBpZGVudGlmaWVyKTsKKworLyoqCisgKiBDaGVjayBjb25zdGFudCB0eXBlcworICovCit2b2lkIHZhbGlkYXRlX2NvbnN0X3R5cGUodF9jb25zdCogYyk7CisKKy8qKgorICogQ2hlY2sgY29uc3RhbnQgdHlwZXMKKyAqLwordm9pZCB2YWxpZGF0ZV9maWVsZF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCwgdF9jb25zdF92YWx1ZSogY3YpOworCisvKioKKyAqIENoZWNrIG1lbWJlcnMgb2YgYSB0aHJvd3MgYmxvY2sKKyAqLworYm9vbCB2YWxpZGF0ZV90aHJvd3ModF9zdHJ1Y3QqIHRocm93cyk7CisKKy8qKgorICogQ29udmVydHMgYSBzdHJpbmcgZmlsZW5hbWUgaW50byBhIHRocmlmdCBwcm9ncmFtIG5hbWUKKyAqLworc3RkOjpzdHJpbmcgcHJvZ3JhbV9uYW1lKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKKworLyoqCisgKiBHZXRzIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIGZpbGVuYW1lCisgKi8KK3N0ZDo6c3RyaW5nIGRpcmVjdG9yeV9uYW1lKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKKworLyoqCisgKiBHZXQgdGhlIGFic29sdXRlIHBhdGggZm9yIGFuIGluY2x1ZGUgZmlsZQorICovCitzdGQ6OnN0cmluZyBpbmNsdWRlX2ZpbGUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOworCisvKioKKyAqIENsZWFycyBhbnkgcHJldmlvdXNseSBzdG9yZWQgZG9jdGV4dCBzdHJpbmcuCisgKi8KK3ZvaWQgY2xlYXJfZG9jdGV4dCgpOworCisvKioKKyAqIENsZWFucyB1cCB0ZXh0IGNvbW1vbmx5IGZvdW5kIGluIGRveHlnZW4tbGlrZSBjb21tZW50cworICovCitjaGFyKiBjbGVhbl91cF9kb2N0ZXh0KGNoYXIqIGRvY3RleHQpOworCisvKioKKyAqIFdlIGFyZSBzdXJlIHRoZSBwcm9ncmFtIGRvY3RleHQgY2FuZGlkYXRlIGlzIHJlYWxseSB0aGUgcHJvZ3JhbSBkb2N0ZXh0LgorICovCit2b2lkIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7CisKKy8qKgorICogRW1pdHMgYSB3YXJuaW5nIG9uIGxpc3Q8Ynl0ZT4sIGJpbmFyeSB0eXBlIGlzIHR5cGljYWxseSBhIG11Y2ggYmV0dGVyIGNob2ljZS4KKyAqLwordm9pZCBjaGVja19mb3JfbGlzdF9vZl9ieXRlcyh0X3R5cGUqIGxpc3RfZWxlbV90eXBlKTsKKworLyoqCisgKiBFbWl0cyBhIG9uZS10aW1lIHdhcm5pbmcgb24gYnl0ZSB0eXBlLCBwcm9tb3RpbmcgdGhlIG5ldyBpOCB0eXBlIGluc3RlYWQKKyAqLwordm9pZCBlbWl0X2J5dGVfdHlwZV93YXJuaW5nKCk7CisKKy8qKgorICogUHJpbnRzIGRlcHJlY2F0aW9uIG5vdGljZSBmb3Igb2xkIE5TIGRlY2xhcmF0aW9ucyB0aGF0IGFyZSBubyBsb25nZXIgc3VwcG9ydGVkCisgKiBJZiBuZXdfZm9ybSBpcyBOVUxMLCBvbGRfZm9ybSBpcyBhc3N1bWVkIHRvIGJlIGEgbGFuZ3VhZ2UgaWRlbnRpZmllciwgc3VjaCBhcyAiY3BwIgorICogSWYgbmV3X2Zvcm0gaXMgbm90IE5VTEwsIGJvdGggYXJndW1lbnRzIGFyZSB1c2VkIGV4YWN0bHkgYXMgZ2l2ZW4KKyAqLwordm9pZCBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbChjb25zdCBjaGFyKiBvbGRfZm9ybSwgY29uc3QgY2hhciogbmV3X2Zvcm0gPSBudWxscHRyKTsKKworLyoqCisgKiBGbGV4IHV0aWxpdGllcworICovCisKK2V4dGVybiBpbnQgeXlsaW5lbm87CitleHRlcm4gY2hhciB5eXRleHRbXTsKK2V4dGVybiBzdGQ6OkZJTEUqIHl5aW47CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2RiNjFjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGVkZWYuaCIKKworI2luY2x1ZGUgInRocmlmdC9tYWluLmgiCisKK3RfdHlwZSogdF90eXBlOjpnZXRfdHJ1ZV90eXBlKCkgeworICByZXR1cm4gY29uc3RfY2FzdDx0X3R5cGUqPihjb25zdF9jYXN0PGNvbnN0IHRfdHlwZSo+KHRoaXMpLT5nZXRfdHJ1ZV90eXBlKCkpOworfQorCitjb25zdCB0X3R5cGUqIHRfdHlwZTo6Z2V0X3RydWVfdHlwZSgpIGNvbnN0IHsKKyAgY29uc3QgdF90eXBlKiB0eXBlID0gdGhpczsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTJiMGY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQkFTRV9UWVBFX0gKKyNkZWZpbmUgVF9CQVNFX1RZUEVfSAorCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKKy8qKgorICogQSB0aHJpZnQgYmFzZSB0eXBlLCB3aGljaCBtdXN0IGJlIG9uZSBvZiB0aGUgZGVmaW5lZCBlbnVtZXJhdGVkIHR5cGVzIGluc2lkZQorICogdGhpcyBkZWZpbml0aW9uLgorICoKKyAqLworY2xhc3MgdF9iYXNlX3R5cGUgOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIEVudW1lcmF0aW9uIG9mIHRocmlmdCBiYXNlIHR5cGVzCisgICAqLworICBlbnVtIHRfYmFzZSB7CisgICAgVFlQRV9WT0lELAorICAgIFRZUEVfU1RSSU5HLAorICAgIFRZUEVfQk9PTCwKKyAgICBUWVBFX0k4LAorICAgIFRZUEVfSTE2LAorICAgIFRZUEVfSTMyLAorICAgIFRZUEVfSTY0LAorICAgIFRZUEVfRE9VQkxFCisgIH07CisKKyAgdF9iYXNlX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF9iYXNlIGJhc2UpCisgICAgOiB0X3R5cGUobmFtZSksIGJhc2VfKGJhc2UpLCBzdHJpbmdfbGlzdF8oZmFsc2UpLCBiaW5hcnlfKGZhbHNlKSwgc3RyaW5nX2VudW1fKGZhbHNlKSB7fQorCisgIHRfYmFzZSBnZXRfYmFzZSgpIGNvbnN0IHsgcmV0dXJuIGJhc2VfOyB9CisKKyAgYm9vbCBpc192b2lkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gYmFzZV8gPT0gVFlQRV9WT0lEOyB9CisKKyAgYm9vbCBpc19zdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBiYXNlXyA9PSBUWVBFX1NUUklORzsgfQorCisgIGJvb2wgaXNfYm9vbCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGJhc2VfID09IFRZUEVfQk9PTDsgfQorCisgIHZvaWQgc2V0X3N0cmluZ19saXN0KGJvb2wgdmFsKSB7IHN0cmluZ19saXN0XyA9IHZhbDsgfQorCisgIGJvb2wgaXNfc3RyaW5nX2xpc3QoKSBjb25zdCB7IHJldHVybiBzdHJpbmdfbGlzdF8gJiYgKGJhc2VfID09IFRZUEVfU1RSSU5HKTsgfQorCisgIHZvaWQgc2V0X2JpbmFyeShib29sIHZhbCkgeyBiaW5hcnlfID0gdmFsOyB9CisKKyAgYm9vbCBpc19iaW5hcnkoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBiaW5hcnlfICYmIChiYXNlXyA9PSBUWVBFX1NUUklORyk7IH0KKworICB2b2lkIHNldF9zdHJpbmdfZW51bShib29sIHZhbCkgeyBzdHJpbmdfZW51bV8gPSB2YWw7IH0KKworICBib29sIGlzX3N0cmluZ19lbnVtKCkgY29uc3QgeyByZXR1cm4gc3RyaW5nX2VudW1fICYmIGJhc2VfID09IFRZUEVfU1RSSU5HOyB9CisKKyAgdm9pZCBhZGRfc3RyaW5nX2VudW1fdmFsKHN0ZDo6c3RyaW5nIHZhbCkgeyBzdHJpbmdfZW51bV92YWxzXy5wdXNoX2JhY2sodmFsKTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X3N0cmluZ19lbnVtX3ZhbHMoKSBjb25zdCB7IHJldHVybiBzdHJpbmdfZW51bV92YWxzXzsgfQorCisgIGJvb2wgaXNfYmFzZV90eXBlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyB0X2Jhc2VfbmFtZSh0X2Jhc2UgdGJhc2UpIHsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSBUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gInZvaWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9CT09MOgorICAgICAgcmV0dXJuICJib29sIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9JODoKKyAgICAgIHJldHVybiAiaTgiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9JMzI6CisgICAgICByZXR1cm4gImkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfSTY0OgorICAgICAgcmV0dXJuICJpNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIih1bmtub3duKSI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgdF9iYXNlIGJhc2VfOworCisgIGJvb2wgc3RyaW5nX2xpc3RfOworICBib29sIGJpbmFyeV87CisgIGJvb2wgc3RyaW5nX2VudW1fOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nX2VudW1fdmFsc187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzA4ZTBkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0NPTlNUX0gKKyNkZWZpbmUgVF9DT05TVF9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCIKKworLyoqCisgKiBBIGNvbnN0IGlzIGEgY29uc3RhbnQgdmFsdWUgZGVmaW5lZCBhY3Jvc3MgbGFuZ3VhZ2VzIHRoYXQgaGFzIGEgdHlwZSBhbmQKKyAqIGEgdmFsdWUuIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgdGhlIGRlY2xhcmVkIHR5cGUgbWlnaHQgbm90IG1hdGNoIHRoZSB0eXBlCisgKiBvZiB0aGUgdmFsdWUgb2JqZWN0LCBzaW5jZSB0aGF0IGlzIG5vdCBkZXRlcm1pbmVkIHVudGlsIGFmdGVyIHBhcnNpbmcgdGhlCisgKiB3aG9sZSB0aGluZyBvdXQuCisgKgorICovCitjbGFzcyB0X2NvbnN0IDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdF9jb25zdCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQorICAgIDogdHlwZV8odHlwZSksIG5hbWVfKG5hbWUpLCB2YWx1ZV8odmFsdWUpIHt9CisKKyAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIHR5cGVfOworICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI4MTU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQ09OU1RfVkFMVUVfSAorI2RlZmluZSBUX0NPTlNUX1ZBTFVFX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2VudW0uaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworLyoqCisgKiBBIGNvbnN0IHZhbHVlIGlzIHNvbWV0aGluZyBwYXJzZWQgdGhhdCBjb3VsZCBiZSBhIG1hcCwgc2V0LCBsaXN0LCBzdHJ1Y3QKKyAqIG9yIHdoYXRldmVyLgorICoKKyAqLworY2xhc3MgdF9jb25zdF92YWx1ZSB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb21wYXJhdG9yIHRvIHNvcnQgZmllbGRzIGluIGFzY2VuZGluZyBvcmRlciBieSBrZXkuCisgICAqIE1ha2UgdGhpcyBhIGZ1bmN0b3IgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIHRvIGhlbHAgR0NDIGlubGluZSBpdC4KKyAgICovCisgIHN0cnVjdCB2YWx1ZV9jb21wYXJlIHsKKyAgcHVibGljOgorICAgIGJvb2wgb3BlcmF0b3IoKSh0X2NvbnN0X3ZhbHVlIGNvbnN0KiBjb25zdCYgbGVmdCwgdF9jb25zdF92YWx1ZSBjb25zdCogY29uc3QmIHJpZ2h0KSBjb25zdCB7CisgICAgICByZXR1cm4gKmxlZnQgPCAqcmlnaHQ7CisgICAgfQorICB9OworCisgIGVudW0gdF9jb25zdF92YWx1ZV90eXBlIHsgQ1ZfSU5URUdFUiwgQ1ZfRE9VQkxFLCBDVl9TVFJJTkcsIENWX01BUCwgQ1ZfTElTVCwgQ1ZfSURFTlRJRklFUiwgQ1ZfVU5LTk9XTiB9OworCisgIHRfY29uc3RfdmFsdWUoKSA6IGludFZhbF8oMCksIGRvdWJsZVZhbF8oMC4wZiksIGVudW1fKCh0X2VudW0qKW51bGxwdHIpLCB2YWxUeXBlXyhDVl9VTktOT1dOKSB7fQorCisgIHRfY29uc3RfdmFsdWUoaW50NjRfdCB2YWwpIDogZG91YmxlVmFsXygwLjBmKSwgZW51bV8oKHRfZW51bSopbnVsbHB0ciksIHZhbFR5cGVfKENWX1VOS05PV04pIHsgc2V0X2ludGVnZXIodmFsKTsgfQorCisgIHRfY29uc3RfdmFsdWUoc3RkOjpzdHJpbmcgdmFsKSA6IGludFZhbF8oMCksIGRvdWJsZVZhbF8oMC4wZiksIGVudW1fKCh0X2VudW0qKW51bGxwdHIpLCB2YWxUeXBlXyhDVl9VTktOT1dOKSB7IHNldF9zdHJpbmcodmFsKTsgfQorCisgIHZvaWQgc2V0X3N0cmluZyhzdGQ6OnN0cmluZyB2YWwpIHsKKyAgICB2YWxUeXBlXyA9IENWX1NUUklORzsKKyAgICBzdHJpbmdWYWxfID0gdmFsOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ1ZhbF87IH0KKworICB2b2lkIHNldF9pbnRlZ2VyKGludDY0X3QgdmFsKSB7CisgICAgdmFsVHlwZV8gPSBDVl9JTlRFR0VSOworICAgIGludFZhbF8gPSB2YWw7CisgIH0KKworICBpbnQ2NF90IGdldF9pbnRlZ2VyKCkgY29uc3QgeworICAgIGlmICh2YWxUeXBlXyA9PSBDVl9JREVOVElGSUVSKSB7CisgICAgICBpZiAoZW51bV8gPT0gbnVsbHB0cikgeworICAgICAgICB0aHJvdyAiaGF2ZSBpZGVudGlmaWVyIFwiIiArIGdldF9pZGVudGlmaWVyKCkgKyAiXCIsIGJ1dCB1bnNldCBlbnVtIG9uIGxpbmUhIjsKKyAgICAgIH0KKyAgICAgIHN0ZDo6c3RyaW5nIGlkZW50aWZpZXIgPSBnZXRfaWRlbnRpZmllcigpOworICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBkb3QgPSBpZGVudGlmaWVyLnJmaW5kKCcuJyk7CisgICAgICBpZiAoZG90ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGlkZW50aWZpZXIgPSBpZGVudGlmaWVyLnN1YnN0cihkb3QgKyAxKTsKKyAgICAgIH0KKyAgICAgIHRfZW51bV92YWx1ZSogdmFsID0gZW51bV8tPmdldF9jb25zdGFudF9ieV9uYW1lKGlkZW50aWZpZXIpOworICAgICAgaWYgKHZhbCA9PSBudWxscHRyKSB7CisgICAgICAgIHRocm93ICJVbmFibGUgdG8gZmluZCBlbnVtIHZhbHVlIFwiIiArIGlkZW50aWZpZXIgKyAiXCIgaW4gZW51bSBcIiIgKyBlbnVtXy0+Z2V0X25hbWUoKQorICAgICAgICAgICAgKyAiXCIiOworICAgICAgfQorICAgICAgcmV0dXJuIHZhbC0+Z2V0X3ZhbHVlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBpbnRWYWxfOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgdmFsKSB7CisgICAgdmFsVHlwZV8gPSBDVl9ET1VCTEU7CisgICAgZG91YmxlVmFsXyA9IHZhbDsKKyAgfQorCisgIGRvdWJsZSBnZXRfZG91YmxlKCkgY29uc3QgeyByZXR1cm4gZG91YmxlVmFsXzsgfQorCisgIHZvaWQgc2V0X21hcCgpIHsgdmFsVHlwZV8gPSBDVl9NQVA7IH0KKworICB2b2lkIGFkZF9tYXAodF9jb25zdF92YWx1ZSoga2V5LCB0X2NvbnN0X3ZhbHVlKiB2YWwpIHsgbWFwVmFsX1trZXldID0gdmFsOyB9CisKKyAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgZ2V0X21hcCgpIGNvbnN0IHsgcmV0dXJuIG1hcFZhbF87IH0KKworICB2b2lkIHNldF9saXN0KCkgeyB2YWxUeXBlXyA9IENWX0xJU1Q7IH0KKworICB2b2lkIGFkZF9saXN0KHRfY29uc3RfdmFsdWUqIHZhbCkgeyBsaXN0VmFsXy5wdXNoX2JhY2sodmFsKTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgZ2V0X2xpc3QoKSBjb25zdCB7IHJldHVybiBsaXN0VmFsXzsgfQorCisgIHZvaWQgc2V0X2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgdmFsKSB7CisgICAgdmFsVHlwZV8gPSBDVl9JREVOVElGSUVSOworICAgIGlkZW50aWZpZXJWYWxfID0gdmFsOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBpZGVudGlmaWVyVmFsXzsgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9pZGVudGlmaWVyX25hbWUoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgcmV0ID0gZ2V0X2lkZW50aWZpZXIoKTsKKyAgICBzaXplX3QgcyA9IHJldC5maW5kKCcuJyk7CisgICAgaWYgKHMgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHRocm93ICJlcnJvcjogaWRlbnRpZmllciAiICsgcmV0ICsgIiBpcyB1bnF1YWxpZmllZCEiOworICAgIH0KKyAgICByZXQgPSByZXQuc3Vic3RyKHMgKyAxKTsKKyAgICBzID0gcmV0LmZpbmQoJy4nKTsKKyAgICBpZiAocyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgcmV0ID0gcmV0LnN1YnN0cihzICsgMSk7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcl93aXRoX3BhcmVudCgpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyByZXQgPSBnZXRfaWRlbnRpZmllcigpOworICAgIHNpemVfdCBzID0gcmV0LmZpbmQoJy4nKTsKKyAgICBpZiAocyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgdGhyb3cgImVycm9yOiBpZGVudGlmaWVyICIgKyByZXQgKyAiIGlzIHVucXVhbGlmaWVkISI7CisgICAgfQorICAgIHNpemVfdCBzMiA9IHJldC5maW5kKCcuJywgcyArIDEpOworICAgIGlmIChzMiAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgcmV0ID0gcmV0LnN1YnN0cihzICsgMSk7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICB2b2lkIHNldF9lbnVtKHRfZW51bSogdGVudW0pIHsgZW51bV8gPSB0ZW51bTsgfQorCisgIHRfY29uc3RfdmFsdWVfdHlwZSBnZXRfdHlwZSgpIGNvbnN0IHsgaWYgKHZhbFR5cGVfID09IENWX1VOS05PV04pIHsgdGhyb3cgc3RkOjpzdHJpbmcoInVua25vd24gdF9jb25zdF92YWx1ZSIpOyB9IHJldHVybiB2YWxUeXBlXzsgfQorCisgIC8qKgorICAgKiBDb21wYXJhdG9yIHRvIHNvcnQgbWFwIGZpZWxkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5IGFuZCB0aGVuIHZhbHVlLgorICAgKiBUaGlzIGlzIHVzZWQgZm9yIG1hcCBjb21wYXJpc29uIGluIGxleGljb2dyYXBoaWMgb3JkZXIuCisgICAqLworICBzdHJ1Y3QgbWFwX2VudHJ5X2NvbXBhcmUgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpwYWlyPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gQ29uc3RQYWlyOworICBwdWJsaWM6CisgICAgYm9vbCBvcGVyYXRvcigpKENvbnN0UGFpciBsZWZ0LCBDb25zdFBhaXIgcmlnaHQpIGNvbnN0IHsKKyAgICAgIGlmICgqKGxlZnQuZmlyc3QpIDwgKihyaWdodC5maXJzdCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKihyaWdodC5maXJzdCkgPCAqKGxlZnQuZmlyc3QpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAqKGxlZnQuc2Vjb25kKSA8ICoocmlnaHQuc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKKworICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IHRfY29uc3RfdmFsdWUmIHRoYXQpIGNvbnN0IHsKKyAgICA6OnRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSB0MSA9IGdldF90eXBlKCk7CisgICAgOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdDIgPSB0aGF0LmdldF90eXBlKCk7CisgICAgaWYgKHQxICE9IHQyKQorICAgICAgcmV0dXJuIHQxIDwgdDI7CisgICAgc3dpdGNoICh0MSkgeworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgICAgcmV0dXJuIGludFZhbF8gPCB0aGF0LmludFZhbF87CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICAgIHJldHVybiBkb3VibGVWYWxfIDwgdGhhdC5kb3VibGVWYWxfOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgICByZXR1cm4gc3RyaW5nVmFsXyA8IHRoYXQuc3RyaW5nVmFsXzsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgICAgIHJldHVybiBpZGVudGlmaWVyVmFsXyA8IHRoYXQuaWRlbnRpZmllclZhbF87CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICAgIHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKAorICAgICAgICAgIG1hcFZhbF8uYmVnaW4oKSwgbWFwVmFsXy5lbmQoKSwgdGhhdC5tYXBWYWxfLmJlZ2luKCksIHRoYXQubWFwVmFsXy5lbmQoKSwgbWFwX2VudHJ5X2NvbXBhcmUoKSk7CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgKKyAgICAgICAgICBsaXN0VmFsXy5iZWdpbigpLCBsaXN0VmFsXy5lbmQoKSwgdGhhdC5saXN0VmFsXy5iZWdpbigpLCB0aGF0Lmxpc3RWYWxfLmVuZCgpLCB2YWx1ZV9jb21wYXJlKCkpOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAidW5rbm93biB2YWx1ZSB0eXBlIjsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB2YWx1ZV9jb21wYXJlPiBtYXBWYWxfOworICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdFZhbF87CisgIHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbF87CisgIGludDY0X3QgaW50VmFsXzsKKyAgZG91YmxlIGRvdWJsZVZhbF87CisgIHN0ZDo6c3RyaW5nIGlkZW50aWZpZXJWYWxfOworICB0X2VudW0qIGVudW1fOworCisgIHRfY29uc3RfdmFsdWVfdHlwZSB2YWxUeXBlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEyNGQzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQ09OVEFJTkVSX0gKKyNkZWZpbmUgVF9DT05UQUlORVJfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCitjbGFzcyB0X2NvbnRhaW5lciA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICB0X2NvbnRhaW5lcigpIDogY3BwX25hbWVfKCksIGhhc19jcHBfbmFtZV8oZmFsc2UpIHt9CisKKyAgfnRfY29udGFpbmVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIHZvaWQgc2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nIGNwcF9uYW1lKSB7CisgICAgY3BwX25hbWVfID0gY3BwX25hbWU7CisgICAgaGFzX2NwcF9uYW1lXyA9IHRydWU7CisgIH0KKworICBib29sIGhhc19jcHBfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGhhc19jcHBfbmFtZV87IH0KKworICBzdGQ6OnN0cmluZyBnZXRfY3BwX25hbWUoKSBjb25zdCB7IHJldHVybiBjcHBfbmFtZV87IH0KKworICBib29sIGlzX2NvbnRhaW5lcigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgY3BwX25hbWVfOworICBib29sIGhhc19jcHBfbmFtZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZG9jLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2RvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZjg5M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2RvYy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0RPQ19ICisjZGVmaW5lIFRfRE9DX0gKKworI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisjaW5jbHVkZSAidGhyaWZ0L2xvZ2dpbmcuaCIKKworLyoqCisgKiBEb2N1bWVudGF0aW9uIHN0dWJzCisgKgorICovCitjbGFzcyB0X2RvYyB7CisKK3B1YmxpYzoKKyAgdF9kb2MoKSA6IGhhc19kb2NfKGZhbHNlKSB7fQorICB2aXJ0dWFsIH50X2RvYygpID0gZGVmYXVsdDsKKworICB2b2lkIHNldF9kb2MoY29uc3Qgc3RkOjpzdHJpbmcmIGRvYykgeworICAgIGRvY18gPSBkb2M7CisgICAgaGFzX2RvY18gPSB0cnVlOworICAgIGlmICgoZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vID09IGdfZG9jdGV4dF9saW5lbm8pCisgICAgICAgICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPT0gU1RJTExfQ0FORElEQVRFKSkgeworICAgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gQUxSRUFEWV9QUk9DRVNTRUQ7CisgICAgICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gQUxSRUFEWV9QUk9DRVNTRUQiKTsKKyAgICB9CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X2RvYygpIGNvbnN0IHsgcmV0dXJuIGRvY187IH0KKworICBib29sIGhhc19kb2MoKSB7IHJldHVybiBoYXNfZG9jXzsgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBkb2NfOworICBib29sIGhhc19kb2NfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMDEzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfRU5VTV9ICisjZGVmaW5lIFRfRU5VTV9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvKioKKyAqIEFuIGVudW1lcmF0ZWQgdHlwZS4gQSBsaXN0IG9mIGNvbnN0YW50IG9iamVjdHMgd2l0aCBhIG5hbWUgZm9yIHRoZSB0eXBlLgorICoKKyAqLworY2xhc3MgdF9lbnVtIDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHRfZW51bSh0X3Byb2dyYW0qIHByb2dyYW0pIDogdF90eXBlKHByb2dyYW0pIHt9CisKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgb3ZlcnJpZGUgeyBuYW1lXyA9IG5hbWU7IH0KKworICB2b2lkIGFwcGVuZCh0X2VudW1fdmFsdWUqIGNvbnN0YW50KSB7IGNvbnN0YW50c18ucHVzaF9iYWNrKGNvbnN0YW50KTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBnZXRfY29uc3RhbnRzKCkgY29uc3QgeyByZXR1cm4gY29uc3RhbnRzXzsgfQorCisgIHRfZW51bV92YWx1ZSogZ2V0X2NvbnN0YW50X2J5X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGlmICgoKmNfaXRlciktPmdldF9uYW1lKCkgPT0gbmFtZSkgeworICAgICAgICByZXR1cm4gKmNfaXRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB0X2VudW1fdmFsdWUqIGdldF9jb25zdGFudF9ieV92YWx1ZShpbnQ2NF90IHZhbHVlKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOworICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA9PSB2YWx1ZSkgeworICAgICAgICByZXR1cm4gKmNfaXRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB0X2VudW1fdmFsdWUqIGdldF9taW5fdmFsdWUoKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOworICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgdF9lbnVtX3ZhbHVlKiBtaW5fdmFsdWU7CisgICAgaWYgKGVudW1fdmFsdWVzLnNpemUoKSA9PSAwKSB7CisgICAgICBtaW5fdmFsdWUgPSBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgbWluX3ZhbHVlX3ZhbHVlOworICAgICAgbWluX3ZhbHVlID0gZW51bV92YWx1ZXMuZnJvbnQoKTsKKyAgICAgIG1pbl92YWx1ZV92YWx1ZSA9IG1pbl92YWx1ZS0+Z2V0X3ZhbHVlKCk7CisgICAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPCBtaW5fdmFsdWVfdmFsdWUpIHsKKyAgICAgICAgICBtaW5fdmFsdWUgPSAoKmNfaXRlcik7CisgICAgICAgICAgbWluX3ZhbHVlX3ZhbHVlID0gbWluX3ZhbHVlLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWluX3ZhbHVlOworICB9CisKKyAgdF9lbnVtX3ZhbHVlKiBnZXRfbWF4X3ZhbHVlKCkgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgIHRfZW51bV92YWx1ZSogbWF4X3ZhbHVlOworICAgIGlmIChlbnVtX3ZhbHVlcy5zaXplKCkgPT0gMCkgeworICAgICAgbWF4X3ZhbHVlID0gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgaW50IG1heF92YWx1ZV92YWx1ZTsKKyAgICAgIG1heF92YWx1ZSA9IGVudW1fdmFsdWVzLmJhY2soKTsKKyAgICAgIG1heF92YWx1ZV92YWx1ZSA9IG1heF92YWx1ZS0+Z2V0X3ZhbHVlKCk7CisgICAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPiBtYXhfdmFsdWVfdmFsdWUpIHsKKyAgICAgICAgICBtYXhfdmFsdWUgPSAoKmNfaXRlcik7CisgICAgICAgICAgbWF4X3ZhbHVlX3ZhbHVlID0gbWF4X3ZhbHVlLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWF4X3ZhbHVlOworICB9CisKKyAgYm9vbCBpc19lbnVtKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHNfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZWVlODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9FTlVNX1ZBTFVFX0gKKyNkZWZpbmUgVF9FTlVNX1ZBTFVFX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisKKy8qKgorICogQSBjb25zdGFudC4gVGhlc2UgYXJlIHVzZWQgaW5zaWRlIG9mIGVudW0gZGVmaW5pdGlvbnMuIENvbnN0YW50cyBhcmUganVzdAorICogc3ltYm9sIGlkZW50aWZpZXJzIHRoYXQgbWF5IG9yIG1heSBub3QgaGF2ZSBhbiBleHBsaWNpdCB2YWx1ZSBhc3NvY2lhdGVkCisgKiB3aXRoIHRoZW0uCisgKgorICovCitjbGFzcyB0X2VudW1fdmFsdWUgOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X2VudW1fdmFsdWUoc3RkOjpzdHJpbmcgbmFtZSwgaW50IHZhbHVlKSA6IG5hbWVfKG5hbWUpLCB2YWx1ZV8odmFsdWUpIHt9CisKKyAgfnRfZW51bV92YWx1ZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIGludCBnZXRfdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIGludCB2YWx1ZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmU4NzcwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9maWVsZC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9GSUVMRF9ICisjZGVmaW5lIFRfRklFTERfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvLyBGb3J3YXJkIGRlY2xhcmUgZm9yIHhzZF9hdHRycworY2xhc3MgdF9zdHJ1Y3Q7CisKKy8qKgorICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgZmllbGQgaW4gYSB0aHJpZnQgc3RydWN0dXJlLiBBIGZpZWxkIGhhcyBhIGRhdGEgdHlwZSwKKyAqIGEgc3ltYm9saWMgbmFtZSwgYW5kIGEgbnVtZXJpYyBpZGVudGlmaWVyLgorICoKKyAqLworY2xhc3MgdF9maWVsZCA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfZmllbGQodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lKQorICAgIDogdHlwZV8odHlwZSksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIGtleV8oMCksCisgICAgICB2YWx1ZV8obnVsbHB0ciksCisgICAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKKyAgICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAorICAgICAgeHNkX2F0dHJzXyhudWxscHRyKSwKKyAgICAgIHJlZmVyZW5jZV8oZmFsc2UpIHt9CisKKyAgdF9maWVsZCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIGludDMyX3Qga2V5KQorICAgIDogdHlwZV8odHlwZSksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIGtleV8oa2V5KSwKKyAgICAgIHJlcV8oVF9PUFRfSU5fUkVRX09VVCksCisgICAgICB2YWx1ZV8obnVsbHB0ciksCisgICAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKKyAgICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAorICAgICAgeHNkX2F0dHJzXyhudWxscHRyKSwKKyAgICAgIHJlZmVyZW5jZV8oZmFsc2UpIHt9CisKKyAgfnRfZmllbGQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgdF90eXBlKiBnZXRfdHlwZSgpIHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgY29uc3QgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICBpbnQzMl90IGdldF9rZXkoKSBjb25zdCB7IHJldHVybiBrZXlfOyB9CisKKyAgZW51bSBlX3JlcSB7IFRfUkVRVUlSRUQsIFRfT1BUSU9OQUwsIFRfT1BUX0lOX1JFUV9PVVQgfTsKKworICB2b2lkIHNldF9yZXEoZV9yZXEgcmVxKSB7IHJlcV8gPSByZXE7IH0KKworICBlX3JlcSBnZXRfcmVxKCkgY29uc3QgeyByZXR1cm4gcmVxXzsgfQorCisgIHZvaWQgc2V0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7IHZhbHVlXyA9IHZhbHVlOyB9CisKKyAgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgeyByZXR1cm4gdmFsdWVfOyB9CisKKyAgY29uc3QgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyAgdm9pZCBzZXRfeHNkX29wdGlvbmFsKGJvb2wgeHNkX29wdGlvbmFsKSB7IHhzZF9vcHRpb25hbF8gPSB4c2Rfb3B0aW9uYWw7IH0KKworICBib29sIGdldF94c2Rfb3B0aW9uYWwoKSBjb25zdCB7IHJldHVybiB4c2Rfb3B0aW9uYWxfOyB9CisKKyAgdm9pZCBzZXRfeHNkX25pbGxhYmxlKGJvb2wgeHNkX25pbGxhYmxlKSB7IHhzZF9uaWxsYWJsZV8gPSB4c2RfbmlsbGFibGU7IH0KKworICBib29sIGdldF94c2RfbmlsbGFibGUoKSBjb25zdCB7IHJldHVybiB4c2RfbmlsbGFibGVfOyB9CisKKyAgdm9pZCBzZXRfeHNkX2F0dHJzKHRfc3RydWN0KiB4c2RfYXR0cnMpIHsgeHNkX2F0dHJzXyA9IHhzZF9hdHRyczsgfQorCisgIHRfc3RydWN0KiBnZXRfeHNkX2F0dHJzKCkgeyByZXR1cm4geHNkX2F0dHJzXzsgfQorCisgIGNvbnN0IHRfc3RydWN0KiBnZXRfeHNkX2F0dHJzKCkgY29uc3QgeyByZXR1cm4geHNkX2F0dHJzXzsgfQorCisgIC8qKgorICAgKiBDb21wYXJhdG9yIHRvIHNvcnQgZmllbGRzIGluIGFzY2VuZGluZyBvcmRlciBieSBrZXkuCisgICAqIE1ha2UgdGhpcyBhIGZ1bmN0b3IgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIHRvIGhlbHAgR0NDIGlubGluZSBpdC4KKyAgICogVGhlIGFyZ3VtZW50cyBhcmUgKGNvbnN0KSByZWZlcmVuY2VzIHRvIGNvbnN0IHBvaW50ZXJzIHRvIGNvbnN0IHRfZmllbGRzLgorICAgKi8KKyAgc3RydWN0IGtleV9jb21wYXJlIHsKKyAgICBib29sIG9wZXJhdG9yKCkodF9maWVsZCBjb25zdCogY29uc3QmIGEsIHRfZmllbGQgY29uc3QqIGNvbnN0JiBiKSB7CisgICAgICByZXR1cm4gYS0+Z2V0X2tleSgpIDwgYi0+Z2V0X2tleSgpOworICAgIH0KKyAgfTsKKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKKworICBib29sIGdldF9yZWZlcmVuY2UoKSBjb25zdCB7IHJldHVybiByZWZlcmVuY2VfOyB9CisKKyAgdm9pZCBzZXRfcmVmZXJlbmNlKGJvb2wgcmVmZXJlbmNlKSB7IHJlZmVyZW5jZV8gPSByZWZlcmVuY2U7IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiB0eXBlXzsKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIGludDMyX3Qga2V5XzsKKyAgZV9yZXEgcmVxXzsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWVfOworCisgIGJvb2wgeHNkX29wdGlvbmFsXzsKKyAgYm9vbCB4c2RfbmlsbGFibGVfOworICB0X3N0cnVjdCogeHNkX2F0dHJzXzsKKyAgYm9vbCByZWZlcmVuY2VfOworfTsKKworLyoqCisgKiBBIHNpbXBsZSBzdHJ1Y3QgZm9yIHRoZSBwYXJzZXIgdG8gdXNlIHRvIHN0b3JlIGEgZmllbGQgSUQsIGFuZCB3aGV0aGVyIG9yCisgKiBub3QgaXQgd2FzIHNwZWNpZmllZCBieSB0aGUgdXNlciBvciBhdXRvbWF0aWNhbGx5IGNob3Nlbi4KKyAqLworc3RydWN0IHRfZmllbGRfaWQgeworICBpbnQzMl90IHZhbHVlOworICBib29sIGF1dG9fYXNzaWduZWQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzBjOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0ZVTkNUSU9OX0gKKyNkZWZpbmUgVF9GVU5DVElPTl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3N0cnVjdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGEgZnVuY3Rpb24uIEtleSBwYXJ0cyBhcmUgcmV0dXJuIHR5cGUsIGZ1bmN0aW9uIG5hbWUsCisgKiBvcHRpb25hbCBtb2RpZmllcnMsIGFuZCBhbiBhcmd1bWVudCBsaXN0LCB3aGljaCBpcyBpbXBsZW1lbnRlZCBhcyBhIHRocmlmdAorICogc3RydWN0LgorICoKKyAqLworY2xhc3MgdF9mdW5jdGlvbiA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfZnVuY3Rpb24odF90eXBlKiByZXR1cm50eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCB0X3N0cnVjdCogYXJnbGlzdCwgYm9vbCBvbmV3YXkgPSBmYWxzZSkKKyAgICA6IHJldHVybnR5cGVfKHJldHVybnR5cGUpLAorICAgICAgbmFtZV8obmFtZSksCisgICAgICBhcmdsaXN0XyhhcmdsaXN0KSwKKyAgICAgIHhjZXB0aW9uc18obmV3IHRfc3RydWN0KG51bGxwdHIpKSwKKyAgICAgIG93bl94Y2VwdGlvbnNfKHRydWUpLAorICAgICAgb25ld2F5XyhvbmV3YXkpIHsKKyAgICBpZiAob25ld2F5XyAmJiAoIXJldHVybnR5cGVfLT5pc192b2lkKCkpKSB7CisgICAgICBwd2FybmluZygxLCAiT25ld2F5IG1ldGhvZHMgc2hvdWxkIHJldHVybiB2b2lkLlxuIik7CisgICAgfQorICB9CisKKyAgdF9mdW5jdGlvbih0X3R5cGUqIHJldHVybnR5cGUsCisgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICB0X3N0cnVjdCogYXJnbGlzdCwKKyAgICAgICAgICAgICB0X3N0cnVjdCogeGNlcHRpb25zLAorICAgICAgICAgICAgIGJvb2wgb25ld2F5ID0gZmFsc2UpCisgICAgOiByZXR1cm50eXBlXyhyZXR1cm50eXBlKSwKKyAgICAgIG5hbWVfKG5hbWUpLAorICAgICAgYXJnbGlzdF8oYXJnbGlzdCksCisgICAgICB4Y2VwdGlvbnNfKHhjZXB0aW9ucyksCisgICAgICBvd25feGNlcHRpb25zXyhmYWxzZSksCisgICAgICBvbmV3YXlfKG9uZXdheSkgeworICAgIGlmIChvbmV3YXlfICYmICF4Y2VwdGlvbnNfLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpIHsKKyAgICAgIHRocm93IHN0ZDo6c3RyaW5nKCJPbmV3YXkgbWV0aG9kcyBjYW4ndCB0aHJvdyBleGNlcHRpb25zLiIpOworICAgIH0KKyAgICBpZiAob25ld2F5XyAmJiAoIXJldHVybnR5cGVfLT5pc192b2lkKCkpKSB7CisgICAgICBwd2FybmluZygxLCAiT25ld2F5IG1ldGhvZHMgc2hvdWxkIHJldHVybiB2b2lkLlxuIik7CisgICAgfQorICB9CisKKyAgfnRfZnVuY3Rpb24oKSBvdmVycmlkZSB7CisgICAgaWYgKG93bl94Y2VwdGlvbnNfKQorICAgICAgZGVsZXRlIHhjZXB0aW9uc187CisgIH0KKworICB0X3R5cGUqIGdldF9yZXR1cm50eXBlKCkgY29uc3QgeyByZXR1cm4gcmV0dXJudHlwZV87IH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIHRfc3RydWN0KiBnZXRfYXJnbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGFyZ2xpc3RfOyB9CisKKyAgdF9zdHJ1Y3QqIGdldF94Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiB4Y2VwdGlvbnNfOyB9CisKKyAgYm9vbCBpc19vbmV3YXkoKSBjb25zdCB7IHJldHVybiBvbmV3YXlfOyB9CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187CisKK3ByaXZhdGU6CisgIHRfdHlwZSogcmV0dXJudHlwZV87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICB0X3N0cnVjdCogYXJnbGlzdF87CisgIHRfc3RydWN0KiB4Y2VwdGlvbnNfOworICBib29sIG93bl94Y2VwdGlvbnNfOworICBib29sIG9uZXdheV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiODk2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0xJU1RfSAorI2RlZmluZSBUX0xJU1RfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgiCisKKy8qKgorICogQSBsaXN0IGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgZGF0YSB0eXBlLgorICoKKyAqLworY2xhc3MgdF9saXN0IDogcHVibGljIHRfY29udGFpbmVyIHsKK3B1YmxpYzoKKyAgdF9saXN0KHRfdHlwZSogZWxlbV90eXBlKSA6IGVsZW1fdHlwZV8oZWxlbV90eXBlKSB7fQorCisgIHRfdHlwZSogZ2V0X2VsZW1fdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGVsZW1fdHlwZV87IH0KKworICBib29sIGlzX2xpc3QoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogZWxlbV90eXBlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9tYXAuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxNGU2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfTUFQX0gKKyNkZWZpbmUgVF9NQVBfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgiCisKKy8qKgorICogQSBtYXAgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciB0d28gZGF0YQorICogdHlwZXMuCisgKgorICovCitjbGFzcyB0X21hcCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7CitwdWJsaWM6CisgIHRfbWFwKHRfdHlwZSoga2V5X3R5cGUsIHRfdHlwZSogdmFsX3R5cGUpIDoga2V5X3R5cGVfKGtleV90eXBlKSwgdmFsX3R5cGVfKHZhbF90eXBlKSB7fQorCisgIHRfdHlwZSogZ2V0X2tleV90eXBlKCkgY29uc3QgeyByZXR1cm4ga2V5X3R5cGVfOyB9CisKKyAgdF90eXBlKiBnZXRfdmFsX3R5cGUoKSBjb25zdCB7IHJldHVybiB2YWxfdHlwZV87IH0KKworICBib29sIGlzX21hcCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiBrZXlfdHlwZV87CisgIHRfdHlwZSogdmFsX3R5cGVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzY2IyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaApAQCAtMCwwICsxLDQwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfUFJPR1JBTV9ICisjZGVmaW5lIFRfUFJPR1JBTV9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gRm9yIHByb2dyYW1fbmFtZSgpCisjaW5jbHVkZSAidGhyaWZ0L21haW4uaCIKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Njb3BlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2VudW0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3N0cnVjdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3NlcnZpY2UuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9saXN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfbWFwLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2V0LmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCisvLyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKworLyoqCisgKiBUb3AgbGV2ZWwgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGVudGlyZSB0aHJpZnQgcHJvZ3JhbS4gQSBwcm9ncmFtIGNvbnNpc3RzCisgKiBmdW5kYW1lbnRhbGx5IG9mIHRoZSBmb2xsb3dpbmc6CisgKgorICogICBUeXBlZGVmcworICogICBFbnVtZXJhdGlvbnMKKyAqICAgQ29uc3RhbnRzCisgKiAgIFN0cnVjdHMKKyAqICAgRXhjZXB0aW9ucworICogICBTZXJ2aWNlcworICoKKyAqIFRoZSBwcm9ncmFtIG1vZHVsZSBhbHNvIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgYmFzZSB0eXBlcy4KKyAqCisgKi8KK2NsYXNzIHRfcHJvZ3JhbSA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfcHJvZ3JhbShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyBuYW1lKQorICAgIDogcGF0aF8ocGF0aCksIG5hbWVfKG5hbWUpLCBvdXRfcGF0aF8oIi4vIiksIG91dF9wYXRoX2lzX2Fic29sdXRlXyhmYWxzZSksIHNjb3BlXyhuZXcgdF9zY29wZSkge30KKworICB0X3Byb2dyYW0oc3RkOjpzdHJpbmcgcGF0aCkgOiBwYXRoXyhwYXRoKSwgb3V0X3BhdGhfKCIuLyIpLCBvdXRfcGF0aF9pc19hYnNvbHV0ZV8oZmFsc2UpIHsKKyAgICBuYW1lXyA9IHByb2dyYW1fbmFtZShwYXRoKTsKKyAgICBzY29wZV8gPSBuZXcgdF9zY29wZSgpOworICB9CisKKyAgfnRfcHJvZ3JhbSgpIG92ZXJyaWRlIHsKKyAgICBpZiAoc2NvcGVfKSB7CisgICAgICBkZWxldGUgc2NvcGVfOworICAgICAgc2NvcGVfID0gbnVsbHB0cjsKKyAgICB9CisgIH0KKworICAvLyBQYXRoIGFjY2Vzc29yCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIHBhdGhfOyB9CisKKyAgLy8gT3V0cHV0IHBhdGggYWNjZXNzb3IKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9vdXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG91dF9wYXRoXzsgfQorCisgIC8vIENyZWF0ZSBnZW4tKiBkaXIgYWNjZXNzb3IKKyAgYm9vbCBpc19vdXRfcGF0aF9hYnNvbHV0ZSgpIGNvbnN0IHsgcmV0dXJuIG91dF9wYXRoX2lzX2Fic29sdXRlXzsgfQorCisgIC8vIE5hbWUgYWNjZXNzb3IKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICAvLyBOYW1lc3BhY2UKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lc3BhY2UoKSBjb25zdCB7IHJldHVybiBuYW1lc3BhY2VfOyB9CisKKyAgLy8gSW5jbHVkZSBwcmVmaXggYWNjZXNzb3IKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9pbmNsdWRlX3ByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIGluY2x1ZGVfcHJlZml4XzsgfQorCisgIC8vIEFjY2Vzc29ycyBmb3IgcHJvZ3JhbSBlbGVtZW50cworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiYgZ2V0X3R5cGVkZWZzKCkgY29uc3QgeyByZXR1cm4gdHlwZWRlZnNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBnZXRfZW51bXMoKSBjb25zdCB7IHJldHVybiBlbnVtc187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBnZXRfY29uc3RzKCkgY29uc3QgeyByZXR1cm4gY29uc3RzXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBnZXRfc3RydWN0cygpIGNvbnN0IHsgcmV0dXJuIHN0cnVjdHNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIGdldF94Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiB4Y2VwdGlvbnNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIGdldF9vYmplY3RzKCkgY29uc3QgeyByZXR1cm4gb2JqZWN0c187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIGdldF9zZXJ2aWNlcygpIGNvbnN0IHsgcmV0dXJuIHNlcnZpY2VzXzsgfQorICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBnZXRfbmFtZXNwYWNlcygpIGNvbnN0IHsgcmV0dXJuIG5hbWVzcGFjZXNfOyB9CisKKyAgLy8gUHJvZ3JhbSBlbGVtZW50cworICB2b2lkIGFkZF90eXBlZGVmKHRfdHlwZWRlZiogdGQpIHsgdHlwZWRlZnNfLnB1c2hfYmFjayh0ZCk7IH0KKyAgdm9pZCBhZGRfZW51bSh0X2VudW0qIHRlKSB7IGVudW1zXy5wdXNoX2JhY2sodGUpOyB9CisgIHZvaWQgYWRkX2NvbnN0KHRfY29uc3QqIHRjKSB7IGNvbnN0c18ucHVzaF9iYWNrKHRjKTsgfQorICB2b2lkIGFkZF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzKSB7CisgICAgb2JqZWN0c18ucHVzaF9iYWNrKHRzKTsKKyAgICBzdHJ1Y3RzXy5wdXNoX2JhY2sodHMpOworICB9CisgIHZvaWQgYWRkX3hjZXB0aW9uKHRfc3RydWN0KiB0eCkgeworICAgIG9iamVjdHNfLnB1c2hfYmFjayh0eCk7CisgICAgeGNlcHRpb25zXy5wdXNoX2JhY2sodHgpOworICB9CisgIHZvaWQgYWRkX3NlcnZpY2UodF9zZXJ2aWNlKiB0cykgeyBzZXJ2aWNlc18ucHVzaF9iYWNrKHRzKTsgfQorCisgIC8vIFByb2dyYW1zIHRvIGluY2x1ZGUKKyAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGdldF9pbmNsdWRlcygpIHsgcmV0dXJuIGluY2x1ZGVzXzsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBnZXRfaW5jbHVkZXMoKSBjb25zdCB7IHJldHVybiBpbmNsdWRlc187IH0KKworICB2b2lkIHNldF9vdXRfcGF0aChzdGQ6OnN0cmluZyBvdXRfcGF0aCwgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZSkgeworICAgIG91dF9wYXRoXyA9IG91dF9wYXRoOworICAgIG91dF9wYXRoX2lzX2Fic29sdXRlXyA9IG91dF9wYXRoX2lzX2Fic29sdXRlOworICAgIC8vIEVuc3VyZSB0aGF0IGl0IGVuZHMgd2l0aCBhIHRyYWlsaW5nICcvJyAob3IgJ1wnIGZvciB3aW5kb3dzIG1hY2hpbmVzKQorICAgIGNoYXIgYyA9IG91dF9wYXRoXy5hdChvdXRfcGF0aF8uc2l6ZSgpIC0gMSk7CisgICAgaWYgKCEoYyA9PSAnLycgfHwgYyA9PSAnXFwnKSkgeworICAgICAgb3V0X3BhdGhfLnB1c2hfYmFjaygnLycpOworICAgIH0KKyAgfQorCisgIC8vIFR5cGVuYW1lIGNvbGxpc2lvbiBkZXRlY3Rpb24KKyAgLyoqCisgICAqIFNlYXJjaCBmb3IgdHlwZW5hbWUgY29sbGlzaW9ucworICAgKiBAcGFyYW0gdCAgICB0aGUgdHlwZSB0byB0ZXN0IGZvciBjb2xsaXNpb25zCisgICAqIEByZXR1cm4gICAgIHRydWUgaWYgYSBjZXJ0YWluIGNvbGxpc2lvbiB3YXMgZm91bmQsIG90aGVyd2lzZSBmYWxzZQorICAgKi8KKyAgYm9vbCBpc191bmlxdWVfdHlwZW5hbWUoY29uc3QgdF90eXBlKiB0KSBjb25zdCB7CisgICAgaW50IG9jY3VycmVuY2VzID0gcHJvZ3JhbV90eXBlbmFtZV9jb3VudCh0aGlzLCB0KTsKKyAgICBmb3IgKGF1dG8gaXQgPSBpbmNsdWRlc18uY2JlZ2luKCk7IGl0ICE9IGluY2x1ZGVzXy5jZW5kKCk7ICsraXQpIHsKKyAgICAgIG9jY3VycmVuY2VzICs9IHByb2dyYW1fdHlwZW5hbWVfY291bnQoKml0LCB0KTsKKyAgICB9CisgICAgcmV0dXJuIDAgPT0gb2NjdXJyZW5jZXM7CisgIH0KKworICAvKioKKyAgICogU2VhcmNoIGFsbCB0eXBlIGNvbGxlY3Rpb25zIGZvciBkdXBsaWNhdGUgdHlwZW5hbWVzCisgICAqIEBwYXJhbSBwcm9nIHRoZSBwcm9ncmFtIHRvIHNlYXJjaAorICAgKiBAcGFyYW0gdCAgICB0aGUgdHlwZSB0byB0ZXN0IGZvciBjb2xsaXNpb25zCisgICAqIEByZXR1cm4gICAgIHRoZSBudW1iZXIgb2YgY2VydGFpbiB0eXBlbmFtZSBjb2xsaXNpb25zCisgICAqLworICBpbnQgcHJvZ3JhbV90eXBlbmFtZV9jb3VudChjb25zdCB0X3Byb2dyYW0qIHByb2csIGNvbnN0IHRfdHlwZSogdCkgY29uc3QgeworICAgIGludCBvY2N1cnJlbmNlcyA9IDA7CisgICAgb2NjdXJyZW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT50eXBlZGVmc18sIHQpOworICAgIG9jY3VycmVuY2VzICs9IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQocHJvZywgcHJvZy0+ZW51bXNfLCB0KTsKKyAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPm9iamVjdHNfLCB0KTsKKyAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPnNlcnZpY2VzXywgdCk7CisgICAgcmV0dXJuIG9jY3VycmVuY2VzOworICB9CisKKyAgLyoqCisgICAqIFNlYXJjaCBhIHR5cGUgY29sbGVjdGlvbiBmb3IgZHVwbGljYXRlIHR5cGVuYW1lcworICAgKiBAcGFyYW0gcHJvZyAgICAgICAgICAgIHRoZSBwcm9ncmFtIHRvIHNlYXJjaAorICAgKiBAcGFyYW0gdHlwZV9jb2xsZWN0aW9uIHRoZSB0eXBlIGNvbGxlY3Rpb24gdG8gc2VhcmNoCisgICAqIEBwYXJhbSB0ICAgICAgICAgICAgICAgdGhlIHR5cGUgdG8gdGVzdCBmb3IgY29sbGlzaW9ucworICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2VydGFpbiB0eXBlbmFtZSBjb2xsaXNpb25zCisgICAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgaW50IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQoY29uc3QgdF9wcm9ncmFtKiBwcm9nLCBjb25zdCBUIHR5cGVfY29sbGVjdGlvbiwgY29uc3QgdF90eXBlKiB0KSBjb25zdCB7CisgICAgaW50IG9jY3VycmVuY2VzID0gMDsKKyAgICBmb3IgKGF1dG8gaXQgPSB0eXBlX2NvbGxlY3Rpb24uY2JlZ2luKCk7IGl0ICE9IHR5cGVfY29sbGVjdGlvbi5jZW5kKCk7ICsraXQpCisgICAgICBpZiAodCAhPSAqaXQgJiYgMCA9PSB0LT5nZXRfbmFtZSgpLmNvbXBhcmUoKCppdCktPmdldF9uYW1lKCkpICYmIGlzX2NvbW1vbl9uYW1lc3BhY2UocHJvZywgdCkpCisgICAgICAgICsrb2NjdXJyZW5jZXM7CisgICAgcmV0dXJuIG9jY3VycmVuY2VzOworICB9CisKKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIGlkZW50aWNhbCB0eXBlbmFtZXMgd2lsbCBjb2xsaWRlIGJhc2VkIG9uIG5hbWVzcGFjZXMuCisgICAqCisgICAqIEJlY2F1c2Ugd2UgZG8gbm90IGtub3cgd2hpY2ggbGFuZ3VhZ2VzIHRoZSB1c2VyIHdpbGwgZ2VuZXJhdGUgY29kZSBmb3IsCisgICAqIGNvbGxpc2lvbnMgd2l0aGluIHByb2dyYW1zIChJREwgZmlsZXMpIGhhdmluZyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGNhbiBiZQorICAgKiBkaWZmaWN1bHQgdG8gZGV0ZXJtaW5lLiBPbmx5IGd1YXJhbnRlZWQgY29sbGlzaW9ucyByZXR1cm4gdHJ1ZSAoY2F1c2UgYW4gZXJyb3IpLgorICAgKiBQb3NzaWJsZSBjb2xsaXNpb25zIGludm9sdmluZyBleHBsaWNpdCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIHByb2R1Y2UgYSB3YXJuaW5nLgorICAgKiBPdGhlciBwb3NzaWJsZSBjb2xsaXNpb25zIGdvIHVucmVwb3J0ZWQuCisgICAqIEBwYXJhbSBwcm9nIHRoZSBwcm9ncmFtIGNvbnRhaW5pbmcgdGhlIHByZWV4aXN0aW5nIHR5cGVuYW1lCisgICAqIEBwYXJhbSB0ICAgIHRoZSB0eXBlIGNvbnRhaW5pbmcgdGhlIHR5cGVuYW1lIG1hdGNoCisgICAqIEByZXR1cm4gICAgIHRydWUgaWYgYSBjb2xsaXNpb24gd2l0aGluIG5hbWVzcGFjZXMgaXMgZm91bmQsIG90aGVyd2lzZSBmYWxzZQorICAgKi8KKyAgYm9vbCBpc19jb21tb25fbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZywgY29uc3QgdF90eXBlKiB0KSBjb25zdCB7CisgICAgLy8gQ2FzZSAxOiBUeXBlbmFtZXMgYXJlIGluIHRoZSBzYW1lIHByb2dyYW0gW2NvbGxpc2lvbl0KKyAgICBpZiAocHJvZyA9PSB0LT5nZXRfcHJvZ3JhbSgpKSB7CisgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcyIsCisgICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gQ2FzZSAyOiBCb3RoIHByb2dyYW1zIGhhdmUgaWRlbnRpY2FsIG5hbWVzcGFjZSBzY29wZS9uYW1lIGRlY2xhcmF0aW9ucyBbY29sbGlzaW9uXQorICAgIGJvb2wgbWF0Y2ggPSB0cnVlOworICAgIGZvciAoYXV0byBpdCA9IHByb2ctPm5hbWVzcGFjZXNfLmNiZWdpbigpOworICAgICAgICAgaXQgIT0gcHJvZy0+bmFtZXNwYWNlc18uY2VuZCgpOworICAgICAgICAgKytpdCkgeworICAgICAgaWYgKDAgPT0gaXQtPnNlY29uZC5jb21wYXJlKHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoaXQtPmZpcnN0KSkpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcywlcywlcyBhbmQgJXMsJXMsJXMgW2ZpbGUsc2NvcGUsbnNdIiwKKyAgICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHByb2ctPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuY19zdHIoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXRjaCA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1dG8gaXQgPSB0LT5nZXRfcHJvZ3JhbSgpLT5uYW1lc3BhY2VzXy5jYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHQtPmdldF9wcm9ncmFtKCktPm5hbWVzcGFjZXNfLmNlbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGlmICgwID09IGl0LT5zZWNvbmQuY29tcGFyZShwcm9nLT5nZXRfbmFtZXNwYWNlKGl0LT5maXJzdCkpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMsJXMsJXMgYW5kICVzLCVzLCVzIFtmaWxlLHNjb3BlLG5zXSIsCisgICAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBwcm9nLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWF0Y2ggPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKDAgPT0gcHJvZy0+bmFtZXNwYWNlc18uc2l6ZSgpICYmIDAgPT0gdC0+Z2V0X3Byb2dyYW0oKS0+bmFtZXNwYWNlc18uc2l6ZSgpKSB7CisgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcyBhbmQgJXMiLAorICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgcHJvZy0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIG1hdGNoOworICB9CisKKyAgLy8gU2NvcGluZyBhbmQgbmFtZXNwYWNpbmcKKyAgdm9pZCBzZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIG5hbWUpIHsgbmFtZXNwYWNlXyA9IG5hbWU7IH0KKworICAvLyBTY29wZSBhY2Nlc3NvcgorICB0X3Njb3BlKiBzY29wZSgpIHsgcmV0dXJuIHNjb3BlXzsgfQorCisgIGNvbnN0IHRfc2NvcGUqIHNjb3BlKCkgY29uc3QgeyByZXR1cm4gc2NvcGVfOyB9CisKKyAgLy8gSW5jbHVkZXMKKworICB2b2lkIGFkZF9pbmNsdWRlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGluY2x1ZGVzXy5wdXNoX2JhY2socHJvZ3JhbSk7CisgIH0KKworICB2b2lkIGFkZF9pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgsIHN0ZDo6c3RyaW5nIGluY2x1ZGVfc2l0ZSkgeworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCk7CisKKyAgICAvLyBpbmNsdWRlIHByZWZpeCBmb3IgdGhpcyBwcm9ncmFtIGlzIHRoZSBzaXRlIGF0IHdoaWNoIGl0IHdhcyBpbmNsdWRlZAorICAgIC8vIChtaW51cyB0aGUgZmlsZW5hbWUpCisgICAgc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXg7CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgaWYgKChsYXN0X3NsYXNoID0gaW5jbHVkZV9zaXRlLnJmaW5kKCIvIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBpbmNsdWRlX3ByZWZpeCA9IGluY2x1ZGVfc2l0ZS5zdWJzdHIoMCwgbGFzdF9zbGFzaCk7CisgICAgfQorCisgICAgcHJvZ3JhbS0+c2V0X2luY2x1ZGVfcHJlZml4KGluY2x1ZGVfcHJlZml4KTsKKyAgICBpbmNsdWRlc18ucHVzaF9iYWNrKHByb2dyYW0pOworICB9CisKKyAgdm9pZCBzZXRfaW5jbHVkZV9wcmVmaXgoc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXgpIHsKKyAgICBpbmNsdWRlX3ByZWZpeF8gPSBpbmNsdWRlX3ByZWZpeDsKKworICAgIC8vIHRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYSBkaXJlY3Rvcnk7IGFkZCBhIHRyYWlsaW5nIHNsYXNoIGlmIG5lY2Vzc2FyeQorICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGVuID0gaW5jbHVkZV9wcmVmaXhfLnNpemUoKTsKKyAgICBpZiAobGVuID4gMCAmJiBpbmNsdWRlX3ByZWZpeF9bbGVuIC0gMV0gIT0gJy8nKSB7CisgICAgICBpbmNsdWRlX3ByZWZpeF8gKz0gJy8nOworICAgIH0KKyAgfQorCisgIC8vIExhbmd1YWdlIG5ldXRyYWwgbmFtZXNwYWNlIC8gcGFja2FnaW5nCisgIHZvaWQgc2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBsYW5ndWFnZSwgc3RkOjpzdHJpbmcgbmFtZV9zcGFjZSkgeworICAgIGlmIChsYW5ndWFnZSAhPSAiKiIpIHsKKyAgICAgIHNpemVfdCBzdWJfaW5kZXggPSBsYW5ndWFnZS5maW5kKCcuJyk7CisgICAgICBzdGQ6OnN0cmluZyBiYXNlX2xhbmd1YWdlID0gbGFuZ3VhZ2Uuc3Vic3RyKDAsIHN1Yl9pbmRleCk7CisKKyAgICAgIGlmIChiYXNlX2xhbmd1YWdlID09ICJzbWFsbHRhbGsiKSB7CisgICAgICAgIHB3YXJuaW5nKDEsICJOYW1lc3BhY2UgJ3NtYWxsdGFsaycgaXMgZGVwcmVjYXRlZC4gVXNlICdzdCcgaW5zdGVhZCIpOworICAgICAgICBiYXNlX2xhbmd1YWdlID0gInN0IjsKKyAgICAgIH0KKworICAgICAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCBteV9jb3B5ID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCk7CisKKyAgICAgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0OworICAgICAgaXQgPSBteV9jb3B5LmZpbmQoYmFzZV9sYW5ndWFnZSk7CisKKyAgICAgIGlmIChpdCA9PSBteV9jb3B5LmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHdhcm5pbmcgPSAiTm8gZ2VuZXJhdG9yIG5hbWVkICciICsgYmFzZV9sYW5ndWFnZSArICInIGNvdWxkIGJlIGZvdW5kISI7CisgICAgICAgIHB3YXJuaW5nKDEsIHdhcm5pbmcuY19zdHIoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3ViX2luZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgc3RkOjpzdHJpbmcgc3ViX25hbWVzcGFjZSA9IGxhbmd1YWdlLnN1YnN0cihzdWJfaW5kZXggKyAxKTsKKyAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmlzX3ZhbGlkX25hbWVzcGFjZShzdWJfbmFtZXNwYWNlKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgd2FybmluZyA9IGJhc2VfbGFuZ3VhZ2UgKyAiIGdlbmVyYXRvciBkb2VzIG5vdCBhY2NlcHQgJyIgKyBzdWJfbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBhcyBzdWItbmFtZXNwYWNlISI7CisgICAgICAgICAgICBwd2FybmluZygxLCB3YXJuaW5nLmNfc3RyKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIG5hbWVzcGFjZXNfW2xhbmd1YWdlXSA9IG5hbWVfc3BhY2U7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIGxhbmd1YWdlKSBjb25zdCB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoKGl0ZXIgPSBuYW1lc3BhY2VzXy5maW5kKGxhbmd1YWdlKSkgIT0gbmFtZXNwYWNlc18uZW5kKCkKKyAgICAgICAgfHwgKGl0ZXIgPSBuYW1lc3BhY2VzXy5maW5kKCIqIikpICE9IG5hbWVzcGFjZXNfLmVuZCgpKSB7CisgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGdldF9hbGxfbmFtZXNwYWNlcygpIGNvbnN0IHsKKyAgICAgcmV0dXJuIG5hbWVzcGFjZXNfOworICB9CisKKyAgdm9pZCBzZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKHN0ZDo6c3RyaW5nIGxhbmd1YWdlLCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zKSB7CisgICAgbmFtZXNwYWNlX2Fubm90YXRpb25zX1tsYW5ndWFnZV0gPSBhbm5vdGF0aW9uczsKKyAgfQorCisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGdldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmd1YWdlKSBjb25zdCB7CisgICAgYXV0byBpdCA9IG5hbWVzcGFjZV9hbm5vdGF0aW9uc18uZmluZChsYW5ndWFnZSk7CisgICAgaWYgKG5hbWVzcGFjZV9hbm5vdGF0aW9uc18uZW5kKCkgIT0gaXQpIHsKKyAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBlbXB0eU1hcDsKKyAgICByZXR1cm4gZW1wdHlNYXA7CisgIH0KKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBnZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKGNvbnN0IHN0ZDo6c3RyaW5nJiBsYW5ndWFnZSkgeworICAgIHJldHVybiBuYW1lc3BhY2VfYW5ub3RhdGlvbnNfW2xhbmd1YWdlXTsKKyAgfQorCisgIC8vIExhbmd1YWdlIHNwZWNpZmljIG5hbWVzcGFjZSAvIHBhY2thZ2luZworCisgIHZvaWQgYWRkX2NwcF9pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgpIHsgY3BwX2luY2x1ZGVzXy5wdXNoX2JhY2socGF0aCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9jcHBfaW5jbHVkZXMoKSBjb25zdCB7IHJldHVybiBjcHBfaW5jbHVkZXNfOyB9CisKKyAgdm9pZCBhZGRfY19pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgpIHsgY19pbmNsdWRlc18ucHVzaF9iYWNrKHBhdGgpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfY19pbmNsdWRlcygpIGNvbnN0IHsgcmV0dXJuIGNfaW5jbHVkZXNfOyB9CisKK3ByaXZhdGU6CisgIC8vIEZpbGUgcGF0aAorICBzdGQ6OnN0cmluZyBwYXRoXzsKKworICAvLyBOYW1lCisgIHN0ZDo6c3RyaW5nIG5hbWVfOworCisgIC8vIE91dHB1dCBkaXJlY3RvcnkKKyAgc3RkOjpzdHJpbmcgb3V0X3BhdGhfOworCisgIC8vIE91dHB1dCBkaXJlY3RvcnkgaXMgYWJzb2x1dGUgbG9jYXRpb24gZm9yIGdlbmVyYXRlZCBzb3VyY2UgKG5vIGdlbi0qKQorICBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlXzsKKworICAvLyBOYW1lc3BhY2UKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlXzsKKworICAvLyBJbmNsdWRlZCBwcm9ncmFtcworICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlc187CisKKyAgLy8gSW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSwgaWYgYW55CisgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4XzsKKworICAvLyBJZGVudGlmaWVyIGxvb2t1cCBzY29wZQorICB0X3Njb3BlKiBzY29wZV87CisKKyAgLy8gQ29tcG9uZW50cyB0byBnZW5lcmF0ZSBjb2RlIGZvcgorICBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmc187CisgIHN0ZDo6dmVjdG9yPHRfZW51bSo+IGVudW1zXzsKKyAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0c187CisgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gc3RydWN0c187CisgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4geGNlcHRpb25zXzsKKyAgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXNfOworCisgIC8vIER5bmFtaWMgbmFtZXNwYWNlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG5hbWVzcGFjZXNfOworCisgIC8vIEFubm90YXRpb25zIGZvciBkeW5hbWljIG5hbWVzcGFjZXMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gPiBuYW1lc3BhY2VfYW5ub3RhdGlvbnNfOworCisgIC8vIEMrKyBleHRyYSBpbmNsdWRlcworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY3BwX2luY2x1ZGVzXzsKKworICAvLyBDIGV4dHJhIGluY2x1ZGVzCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjX2luY2x1ZGVzXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMmM0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1NDT1BFX0gKKyNkZWZpbmUgVF9TQ09QRV9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9tYXAuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9saXN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2V0LmgiCisKKy8qKgorICogVGhpcyByZXByZXNlbnRzIGEgdmFyaWFibGUgc2NvcGUgdXNlZCBmb3IgbG9va2luZyB1cCBwcmVkZWZpbmVkIHR5cGVzIGFuZAorICogc2VydmljZXMuIFR5cGljYWxseSwgYSBzY29wZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB0X3Byb2dyYW0uIFNjb3BlcyBhcmUgbm90CisgKiB1c2VkIHRvIGRldGVybWluZSBjb2RlIGdlbmVyYXRpb24sIGJ1dCByYXRoZXIgdG8gcmVzb2x2ZSBpZGVudGlmaWVycyBhdAorICogcGFyc2UgdGltZS4KKyAqCisgKi8KK2NsYXNzIHRfc2NvcGUgeworcHVibGljOgorICB0X3Njb3BlKCkgPSBkZWZhdWx0OworCisgIHZvaWQgYWRkX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlKSB7IHR5cGVzX1tuYW1lXSA9IHR5cGU7IH0KKworICB0X3R5cGUqIGdldF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUpIHsgcmV0dXJuIHR5cGVzX1tuYW1lXTsgfQorCisgIGNvbnN0IHRfdHlwZSogZ2V0X3R5cGUoc3RkOjpzdHJpbmcgbmFtZSkgY29uc3QgeworICAgIGNvbnN0IGF1dG8gaXQgPSB0eXBlc18uZmluZChuYW1lKTsKKyAgICBpZiAodHlwZXNfLmVuZCgpICE9IGl0KQorICAgIHsKKyAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB2b2lkIGFkZF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfc2VydmljZSogc2VydmljZSkgeyBzZXJ2aWNlc19bbmFtZV0gPSBzZXJ2aWNlOyB9CisKKyAgdF9zZXJ2aWNlKiBnZXRfc2VydmljZShzdGQ6OnN0cmluZyBuYW1lKSB7IHJldHVybiBzZXJ2aWNlc19bbmFtZV07IH0KKworICBjb25zdCB0X3NlcnZpY2UqIGdldF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUpIGNvbnN0IHsgCisgICAgY29uc3QgYXV0byBpdCA9IHNlcnZpY2VzXy5maW5kKG5hbWUpOworICAgIGlmIChzZXJ2aWNlc18uZW5kKCkgIT0gaXQpCisgICAgeworICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHZvaWQgYWRkX2NvbnN0YW50KHN0ZDo6c3RyaW5nIG5hbWUsIHRfY29uc3QqIGNvbnN0YW50KSB7CisgICAgaWYgKGNvbnN0YW50c18uZmluZChuYW1lKSAhPSBjb25zdGFudHNfLmVuZCgpKSB7CisgICAgICB0aHJvdyAiRW51bSAiICsgbmFtZSArICIgaXMgYWxyZWFkeSBkZWZpbmVkISI7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0YW50c19bbmFtZV0gPSBjb25zdGFudDsKKyAgICB9CisgIH0KKworICB0X2NvbnN0KiBnZXRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSkgeyByZXR1cm4gY29uc3RhbnRzX1tuYW1lXTsgfQorCisgIGNvbnN0IHRfY29uc3QqIGdldF9jb25zdGFudChzdGQ6OnN0cmluZyBuYW1lKSBjb25zdCB7IAorICAgIGNvbnN0IGF1dG8gaXQgPSBjb25zdGFudHNfLmZpbmQobmFtZSk7CisgICAgaWYgKGNvbnN0YW50c18uZW5kKCkgIT0gaXQpCisgICAgeworICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHZvaWQgcHJpbnQoKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfdHlwZSo+OjppdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IHR5cGVzXy5iZWdpbigpOyBpdGVyICE9IHR5cGVzXy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBwcmludGYoIiVzID0+ICVzXG4iLCBpdGVyLT5maXJzdC5jX3N0cigpLCBpdGVyLT5zZWNvbmQtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgfQorICB9CisKKyAgdm9pZCByZXNvbHZlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCwgdF90eXBlKiB0dHlwZSkgeworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOworICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPmZpcnN0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0X3ZhbC0+Z2V0X2xpc3QoKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSgoKnZfaXRlciksICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gY29uc3RfdmFsLT5nZXRfbGlzdCgpOworICAgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKCgqdl9pdGVyKSwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICBhdXRvKiB0c3RydWN0ID0gKHRfc3RydWN0Kil0dHlwZTsKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOworICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogZmllbGQgPSB0c3RydWN0LT5nZXRfZmllbGRfYnlfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOworICAgICAgICBpZiAoZmllbGQgPT0gbnVsbHB0cikgeworICAgICAgICAgIHRocm93ICJObyBmaWVsZCBuYW1lZCBcIiIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkKKyAgICAgICAgICAgICAgKyAiXCIgd2FzIGZvdW5kIGluIHN0cnVjdCBvZiB0eXBlIFwiIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiXCIiOworICAgICAgICB9CisgICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUodl9pdGVyLT5zZWNvbmQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNvbnN0X3ZhbC0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7CisgICAgICBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBjb25zdF92YWwtPnNldF9lbnVtKCh0X2VudW0qKXR0eXBlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRfY29uc3QqIGNvbnN0YW50ID0gZ2V0X2NvbnN0YW50KGNvbnN0X3ZhbC0+Z2V0X2lkZW50aWZpZXIoKSk7CisgICAgICAgIGlmIChjb25zdGFudCA9PSBudWxscHRyKSB7CisgICAgICAgICAgdGhyb3cgIk5vIGVudW0gdmFsdWUgb3IgY29uc3RhbnQgZm91bmQgbmFtZWQgXCIiICsgY29uc3RfdmFsLT5nZXRfaWRlbnRpZmllcigpICsgIlwiISI7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvbHZlIHR5cGVkZWZzIHRvIHRoZSB1bmRlcmx5aW5nIHR5cGUKKyAgICAgICAgdF90eXBlKiBjb25zdF90eXBlID0gY29uc3RhbnQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKworICAgICAgICBpZiAoY29uc3RfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKWNvbnN0X3R5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBjb25zdF92YWwtPnNldF9pbnRlZ2VyKGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2ludGVnZXIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X3N0cmluZyhjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9zdHJpbmcoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2RvdWJsZShjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9kb3VibGUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICB0aHJvdyAiQ29uc3RhbnRzIGNhbm5vdCBiZSBvZiB0eXBlIFZPSUQiOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb25zdF90eXBlLT5pc19tYXAoKSkgeworICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIG1hcCA9IGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X21hcCgpOworICAgICAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X21hcCgpOworICAgICAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgICAgICBjb25zdF92YWwtPmFkZF9tYXAodl9pdGVyLT5maXJzdCwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb25zdF90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2xpc3QoKTsKKyAgICAgICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2xpc3QoKTsKKyAgICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgICAgY29uc3RfdmFsLT5hZGRfbGlzdCgqdl9pdGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIC8vIGVudW0gY29uc3RhbnQgd2l0aCBub24taWRlbnRpZmllciB2YWx1ZS4gc2V0IHRoZSBlbnVtIGFuZCBmaW5kIHRoZQorICAgICAgLy8gdmFsdWUncyBuYW1lLgorICAgICAgYXV0byogdGVudW0gPSAodF9lbnVtKil0dHlwZTsKKyAgICAgIHRfZW51bV92YWx1ZSogZW51bV92YWx1ZSA9IHRlbnVtLT5nZXRfY29uc3RhbnRfYnlfdmFsdWUoY29uc3RfdmFsLT5nZXRfaW50ZWdlcigpKTsKKyAgICAgIGlmIChlbnVtX3ZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhbHN0bTsKKyAgICAgICAgdmFsc3RtIDw8IGNvbnN0X3ZhbC0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgdGhyb3cgIkNvdWxkbid0IGZpbmQgYSBuYW1lZCB2YWx1ZSBpbiBlbnVtICIgKyB0ZW51bS0+Z2V0X25hbWUoKSArICIgZm9yIHZhbHVlICIKKyAgICAgICAgICAgICsgdmFsc3RtLnN0cigpOworICAgICAgfQorICAgICAgY29uc3RfdmFsLT5zZXRfaWRlbnRpZmllcih0ZW51bS0+Z2V0X25hbWUoKSArICIuIiArIGVudW1fdmFsdWUtPmdldF9uYW1lKCkpOworICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSh0ZW51bSk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIC8vIE1hcCBvZiBuYW1lcyB0byB0eXBlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF90eXBlKj4gdHlwZXNfOworCisgIC8vIE1hcCBvZiBuYW1lcyB0byBjb25zdGFudHMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfY29uc3QqPiBjb25zdGFudHNfOworCisgIC8vIE1hcCBvZiBuYW1lcyB0byBzZXJ2aWNlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zZXJ2aWNlKj4gc2VydmljZXNfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NlcnZpY2UuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0M2E1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NlcnZpY2UuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9TRVJWSUNFX0gKKyNkZWZpbmUgVF9TRVJWSUNFX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCitjbGFzcyB0X3Byb2dyYW07CisKKy8qKgorICogQSBzZXJ2aWNlIGNvbnNpc3RzIG9mIGEgc2V0IG9mIGZ1bmN0aW9ucy4KKyAqCisgKi8KK2NsYXNzIHRfc2VydmljZSA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICB0X3NlcnZpY2UodF9wcm9ncmFtKiBwcm9ncmFtKSA6IHRfdHlwZShwcm9ncmFtKSwgZXh0ZW5kc18obnVsbHB0cikge30KKworICBib29sIGlzX3NlcnZpY2UoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKKyAgdm9pZCBzZXRfZXh0ZW5kcyh0X3NlcnZpY2UqIGV4dGVuZHMpIHsgZXh0ZW5kc18gPSBleHRlbmRzOyB9CisKKyAgdm9pZCBhZGRfZnVuY3Rpb24odF9mdW5jdGlvbiogZnVuYykgeworICAgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKyAgICBmb3IgKGl0ZXIgPSBmdW5jdGlvbnNfLmJlZ2luKCk7IGl0ZXIgIT0gZnVuY3Rpb25zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiAoZnVuYy0+Z2V0X25hbWUoKSA9PSAoKml0ZXIpLT5nZXRfbmFtZSgpKSB7CisgICAgICAgIHRocm93ICJGdW5jdGlvbiAiICsgZnVuYy0+Z2V0X25hbWUoKSArICIgaXMgYWxyZWFkeSBkZWZpbmVkIjsKKyAgICAgIH0KKyAgICB9CisgICAgZnVuY3Rpb25zXy5wdXNoX2JhY2soZnVuYyk7CisgIH0KKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGdldF9mdW5jdGlvbnMoKSBjb25zdCB7IHJldHVybiBmdW5jdGlvbnNfOyB9CisKKyAgdF9zZXJ2aWNlKiBnZXRfZXh0ZW5kcygpIHsgcmV0dXJuIGV4dGVuZHNfOyB9CisKKyAgY29uc3QgdF9zZXJ2aWNlKiBnZXRfZXh0ZW5kcygpIGNvbnN0IHsgcmV0dXJuIGV4dGVuZHNfOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnNfOworICB0X3NlcnZpY2UqIGV4dGVuZHNfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NldC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQ0YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXQuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9TRVRfSAorI2RlZmluZSBUX1NFVF9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCIKKworLyoqCisgKiBBIHNldCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIGRhdGEgdHlwZS4KKyAqCisgKi8KK2NsYXNzIHRfc2V0IDogcHVibGljIHRfY29udGFpbmVyIHsKK3B1YmxpYzoKKyAgdF9zZXQodF90eXBlKiBlbGVtX3R5cGUpIDogZWxlbV90eXBlXyhlbGVtX3R5cGUpIHt9CisKKyAgY29uc3QgdF90eXBlKiBnZXRfZWxlbV90eXBlKCkgY29uc3QgeyByZXR1cm4gZWxlbV90eXBlXzsgfQorCisgIHRfdHlwZSogZ2V0X2VsZW1fdHlwZSgpIHsgcmV0dXJuIGVsZW1fdHlwZV87IH0KKworICBib29sIGlzX3NldCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiBlbGVtX3R5cGVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTFlNmNhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfU1RSVUNUX0gKKyNkZWZpbmUgVF9TVFJVQ1RfSAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9maWVsZC5oIgorCisvLyBGb3J3YXJkIGRlY2xhcmUgdGhhdCBwdXBweQorY2xhc3MgdF9wcm9ncmFtOworCisvKioKKyAqIEEgc3RydWN0IGlzIGEgY29udGFpbmVyIGZvciBhIHNldCBvZiBtZW1iZXIgZmllbGRzIHRoYXQgaGFzIGEgbmFtZS4gU3RydWN0cworICogYXJlIGFsc28gdXNlZCB0byBpbXBsZW1lbnQgZXhjZXB0aW9uIHR5cGVzLgorICoKKyAqLworY2xhc3MgdF9zdHJ1Y3QgOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVyc190eXBlOworCisgIHRfc3RydWN0KHRfcHJvZ3JhbSogcHJvZ3JhbSkKKyAgICA6IHRfdHlwZShwcm9ncmFtKSwKKyAgICAgIGlzX3hjZXB0aW9uXyhmYWxzZSksCisgICAgICBpc191bmlvbl8oZmFsc2UpLAorICAgICAgbWVtYmVyc192YWxpZGF0ZWQoZmFsc2UpLAorICAgICAgbWVtYmVyc193aXRoX3ZhbHVlKDApLAorICAgICAgeHNkX2FsbF8oZmFsc2UpIHt9CisKKyAgdF9zdHJ1Y3QodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkKKyAgICA6IHRfdHlwZShwcm9ncmFtLCBuYW1lKSwKKyAgICAgIGlzX3hjZXB0aW9uXyhmYWxzZSksCisgICAgICBpc191bmlvbl8oZmFsc2UpLAorICAgICAgbWVtYmVyc192YWxpZGF0ZWQoZmFsc2UpLAorICAgICAgbWVtYmVyc193aXRoX3ZhbHVlKDApLAorICAgICAgeHNkX2FsbF8oZmFsc2UpIHt9CisKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgb3ZlcnJpZGUgeworICAgIG5hbWVfID0gbmFtZTsKKyAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXJzKCk7CisgIH0KKworICB2b2lkIHNldF94Y2VwdGlvbihib29sIGlzX3hjZXB0aW9uKSB7IGlzX3hjZXB0aW9uXyA9IGlzX3hjZXB0aW9uOyB9CisKKyAgdm9pZCB2YWxpZGF0ZV91bmlvbl9tZW1iZXIodF9maWVsZCogZmllbGQpIHsKKyAgICBpZiAoaXNfdW5pb25fICYmICghbmFtZV8uZW1wdHkoKSkpIHsKKworICAgICAgLy8gMSkgdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzCisgICAgICAvLyAyKSB1bmlvbiBtZW1iZXJzIGFyZSBpbXBsaWNpdGx5IG9wdGlvbmFsLCBvdGhlcndpc2UgYnVncyBsaWtlIFRIUklGVC0zNjUwIHdhaXQgdG8gaGFwcGVuCisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIC8vIG5vIHdhcm5pbmcgb24gZGVmYXVsdCByZXF1aXJlZG5lc3MsIGJ1dCBkbyB3YXJuIG9uIGFueXRoaW5nIGVsc2UgdGhhdCBpcyBleHBsaWNpdGx5IGFza2VkIGZvcgorICAgICAgICBpZihmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgICAgICJVbmlvbiAlcyBmaWVsZCAlczogdW5pb24gbWVtYmVycyBtdXN0IGJlIG9wdGlvbmFsLCBpZ25vcmluZyBzcGVjaWZpZWQgcmVxdWlyZWRuZXNzLlxuIiwKKyAgICAgICAgICAgICAgICAgICBuYW1lXy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGZpZWxkLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgICAgfQorCisgICAgICAvLyB1bmlvbnMgbWF5IGhhdmUgdXAgdG8gb25lIG1lbWJlciBkZWZhdWx0ZWQsIGJ1dCBub3QgbW9yZQorICAgICAgaWYgKGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmICgxIDwgKyttZW1iZXJzX3dpdGhfdmFsdWUpIHsKKyAgICAgICAgICB0aHJvdyAiRXJyb3I6IEZpZWxkICIgKyBmaWVsZC0+Z2V0X25hbWUoKSArICIgcHJvdmlkZXMgYW5vdGhlciBkZWZhdWx0IHZhbHVlIGZvciB1bmlvbiAiCisgICAgICAgICAgICAgICsgbmFtZV87CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKSB7CisgICAgaWYgKGlzX3VuaW9uXyAmJiAoIW5hbWVfLmVtcHR5KCkpICYmICghbWVtYmVyc192YWxpZGF0ZWQpKSB7CisgICAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgeworICAgICAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXIoKm1faXRlcik7CisgICAgICB9CisgICAgICBtZW1iZXJzX3ZhbGlkYXRlZCA9IHRydWU7CisgICAgfQorICB9CisKKyAgdm9pZCBzZXRfdW5pb24oYm9vbCBpc191bmlvbikgeworICAgIGlzX3VuaW9uXyA9IGlzX3VuaW9uOworICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKTsKKyAgfQorCisgIHZvaWQgc2V0X3hzZF9hbGwoYm9vbCB4c2RfYWxsKSB7IHhzZF9hbGxfID0geHNkX2FsbDsgfQorCisgIGJvb2wgZ2V0X3hzZF9hbGwoKSBjb25zdCB7IHJldHVybiB4c2RfYWxsXzsgfQorCisgIGJvb2wgYXBwZW5kKHRfZmllbGQqIGVsZW0pIHsKKyAgICB0eXBlZGVmIG1lbWJlcnNfdHlwZTo6aXRlcmF0b3IgaXRlcl90eXBlOworICAgIHN0ZDo6cGFpcjxpdGVyX3R5cGUsIGl0ZXJfdHlwZT4gYm91bmRzID0gc3RkOjplcXVhbF9yYW5nZShtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZDo6a2V5X2NvbXBhcmUoKSk7CisgICAgaWYgKGJvdW5kcy5maXJzdCAhPSBib3VuZHMuc2Vjb25kKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHJldHVybnMgZmFsc2Ugd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0IG9mIGZpZWxkIG5hbWVzCisgICAgaWYgKGdldF9maWVsZF9ieV9uYW1lKGVsZW0tPmdldF9uYW1lKCkpICE9IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtYmVyc18ucHVzaF9iYWNrKGVsZW0pOworICAgIG1lbWJlcnNfaW5faWRfb3JkZXJfLmluc2VydChib3VuZHMuc2Vjb25kLCBlbGVtKTsKKyAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXIoZWxlbSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb25zdCBtZW1iZXJzX3R5cGUmIGdldF9tZW1iZXJzKCkgY29uc3QgeyByZXR1cm4gbWVtYmVyc187IH0KKworICBjb25zdCBtZW1iZXJzX3R5cGUmIGdldF9zb3J0ZWRfbWVtYmVycygpIGNvbnN0IHsgcmV0dXJuIG1lbWJlcnNfaW5faWRfb3JkZXJfOyB9CisKKyAgYm9vbCBpc19zdHJ1Y3QoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAhaXNfeGNlcHRpb25fOyB9CisKKyAgYm9vbCBpc194Y2VwdGlvbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGlzX3hjZXB0aW9uXzsgfQorCisgIGJvb2wgaXNfdW5pb24oKSBjb25zdCB7IHJldHVybiBpc191bmlvbl87IH0KKworICB0X2ZpZWxkKiBnZXRfZmllbGRfYnlfbmFtZShzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8dF9maWVsZCo+KGNvbnN0X2Nhc3Q8Y29uc3QgdF9zdHJ1Y3QmPigqdGhpcykuZ2V0X2ZpZWxkX2J5X25hbWUoZmllbGRfbmFtZSkpOworICB9CisKKyAgY29uc3QgdF9maWVsZCogZ2V0X2ZpZWxkX2J5X25hbWUoc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgY29uc3QgeworICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSA9PSBmaWVsZF9uYW1lKSB7CisgICAgICAgIHJldHVybiAqbV9pdGVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCitwcml2YXRlOgorICBtZW1iZXJzX3R5cGUgbWVtYmVyc187CisgIG1lbWJlcnNfdHlwZSBtZW1iZXJzX2luX2lkX29yZGVyXzsKKyAgYm9vbCBpc194Y2VwdGlvbl87CisgIGJvb2wgaXNfdW5pb25fOworICBib29sIG1lbWJlcnNfdmFsaWRhdGVkOworICBpbnQgbWVtYmVyc193aXRoX3ZhbHVlOworCisgIGJvb2wgeHNkX2FsbF87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmOTllZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9UWVBFX0gKKyNkZWZpbmUgVF9UWVBFX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKworY2xhc3MgdF9wcm9ncmFtOworCisvKioKKyAqIEdlbmVyaWMgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJpZnQgdHlwZS4gVGhlc2Ugb2JqZWN0cyBhcmUgdXNlZCBieSB0aGUKKyAqIHBhcnNlciBtb2R1bGUgdG8gYnVpbGQgdXAgYSB0cmVlIG9mIG9iamVjdCB0aGF0IGFyZSBhbGwgZXhwbGljaXRseSB0eXBlZC4KKyAqIFRoZSBnZW5lcmljIHRfdHlwZSBjbGFzcyBleHBvcnRzIGEgdmFyaWV0eSBvZiB1c2VmdWwgbWV0aG9kcyB0aGF0IGFyZQorICogdXNlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IgdG8gYnJhbmNoIGJhc2VkIHVwb24gZGlmZmVyZW50IGhhbmRsaW5nIGZvciB0aGUKKyAqIHZhcmlvdXMgdHlwZXMuCisgKgorICovCitjbGFzcyB0X3R5cGUgOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB+dF90eXBlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBuYW1lXyA9IG5hbWU7IH0KKworICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgdmlydHVhbCBib29sIGlzX3ZvaWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfYmFzZV90eXBlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19iaW5hcnkoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc190eXBlZGVmKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2VudW0oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfc3RydWN0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3hjZXB0aW9uKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2NvbnRhaW5lcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19saXN0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3NldCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19tYXAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfc2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgdF9wcm9ncmFtKiBnZXRfcHJvZ3JhbSgpIHsgcmV0dXJuIHByb2dyYW1fOyB9CisKKyAgY29uc3QgdF9wcm9ncmFtKiBnZXRfcHJvZ3JhbSgpIGNvbnN0IHsgcmV0dXJuIHByb2dyYW1fOyB9CisKKyAgdF90eXBlKiBnZXRfdHJ1ZV90eXBlKCk7CisgIGNvbnN0IHRfdHlwZSogZ2V0X3RydWVfdHlwZSgpIGNvbnN0OworCisgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBicmVhayAobWF5YmUgYmFkbHkpIHVubGVzcyAwIDw9IG51bSA8PSAxNi4KKyAgc3RhdGljIGNoYXIgbnliYmxlX3RvX3hkaWdpdChpbnQgbnVtKSB7CisgICAgaWYgKG51bSA8IDEwKSB7CisgICAgICByZXR1cm4gJzAnICsgbnVtOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gJ0EnICsgbnVtIC0gMTA7CisgICAgfQorICB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGJ5dGVfdG9faGV4KHVpbnQ4X3QgYnl0ZSkgeworICAgIHN0ZDo6c3RyaW5nIHJ2OworICAgIHJ2ICs9IG55YmJsZV90b194ZGlnaXQoYnl0ZSA+PiA0KTsKKyAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgJiAweDBmKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKKworcHJvdGVjdGVkOgorICB0X3R5cGUoKSA6IHByb2dyYW1fKG51bGxwdHIpIHsgOyB9CisKKyAgdF90eXBlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOiBwcm9ncmFtXyhwcm9ncmFtKSB7IDsgfQorCisgIHRfdHlwZSh0X3Byb2dyYW0qIHByb2dyYW0sIHN0ZDo6c3RyaW5nIG5hbWUpIDogcHJvZ3JhbV8ocHJvZ3JhbSksIG5hbWVfKG5hbWUpIHsgOyB9CisKKyAgdF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUpIDogcHJvZ3JhbV8obnVsbHB0ciksIG5hbWVfKG5hbWUpIHsgOyB9CisKKyAgdF9wcm9ncmFtKiBwcm9ncmFtXzsKKyAgc3RkOjpzdHJpbmcgbmFtZV87Cit9OworCisvKioKKyAqIFBsYWNlaG9sZGVyIHN0cnVjdCBmb3IgcmV0dXJuaW5nIHRoZSBrZXkgYW5kIHZhbHVlIG9mIGFuIGFubm90YXRpb24KKyAqIGR1cmluZyBwYXJzaW5nLgorICovCitzdHJ1Y3QgdF9hbm5vdGF0aW9uIHsKKyAgc3RkOjpzdHJpbmcga2V5OworICBzdGQ6OnN0cmluZyB2YWw7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODA4Njg1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxjc3RkaW8+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorCit0X3R5cGUqIHRfdHlwZWRlZjo6Z2V0X3R5cGUoKSB7CisgIHJldHVybiBjb25zdF9jYXN0PHRfdHlwZSo+KGNvbnN0X2Nhc3Q8Y29uc3QgdF90eXBlZGVmKj4odGhpcyktPmdldF90eXBlKCkpOworfQorCitjb25zdCB0X3R5cGUqIHRfdHlwZWRlZjo6Z2V0X3R5cGUoKSBjb25zdCB7CisgIGlmICh0eXBlXyA9PSBOVUxMKSB7CisgICAgY29uc3QgdF90eXBlKiB0eXBlID0gZ2V0X3Byb2dyYW0oKS0+c2NvcGUoKS0+Z2V0X3R5cGUoc3ltYm9saWNfKTsKKyAgICBpZiAodHlwZSA9PSBOVUxMKSB7CisgICAgICBwcmludGYoIlR5cGUgXCIlc1wiIG5vdCBkZWZpbmVkXG4iLCBzeW1ib2xpY18uY19zdHIoKSk7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgICByZXR1cm4gdHlwZTsKKyAgfQorICByZXR1cm4gdHlwZV87Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMWQ4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9UWVBFREVGX0gKKyNkZWZpbmUgVF9UWVBFREVGX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKKy8qKgorICogQSB0eXBlZGVmIGlzIGEgbWFwcGluZyBmcm9tIGEgc3ltYm9saWMgbmFtZSB0byBhbm90aGVyIHR5cGUuIEluIGR5bWFuaWNhbGx5CisgKiB0eXBlZCBsYW5ndWFnZXMgKGkuZS4gcGhwL3B5dGhvbikgdGhlIGNvZGUgZ2VuZXJhdG9yIGNhbiBhY3R1YWxseSB1c3VhbGx5CisgKiBpZ25vcmUgdHlwZWRlZnMgYW5kIGp1c3QgdXNlIHRoZSB1bmRlcmx5aW5nIHR5cGUgZGlyZWN0bHksIHRob3VnaCBpbiBDKysKKyAqIHRoZSBzeW1ib2xpYyBuYW1pbmcgY2FuIGJlIHF1aXRlIHVzZWZ1bCBmb3IgY29kZSBjbGFyaXR5LgorICoKKyAqLworY2xhc3MgdF90eXBlZGVmIDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHRfdHlwZWRlZih0X3Byb2dyYW0qIHByb2dyYW0sIHRfdHlwZSogdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbGljKQorICAgIDogdF90eXBlKHByb2dyYW0sIHN5bWJvbGljKSwgdHlwZV8odHlwZSksIHN5bWJvbGljXyhzeW1ib2xpYyksIGZvcndhcmRfKGZhbHNlKSB7fQorCisgIC8qKgorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSB0eXBlIHRoYXQgaXMgbGF6aWx5CisgICAqIHJlc29sdmVkIGF0IGEgbGF0ZXIgdGltZSwgbGlrZSBmb3IgZm9yd2FyZCBkZWNsYXJhdGlvbnMgb3IKKyAgICogcmVjdXJzaXZlIHR5cGVzLgorICAgKi8KKyAgdF90eXBlZGVmKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbGljLCBib29sIGZvcndhcmQpCisgICAgOiB0X3R5cGUocHJvZ3JhbSwgc3ltYm9saWMpLAorICAgICAgdHlwZV8obnVsbHB0ciksCisgICAgICBzeW1ib2xpY18oc3ltYm9saWMpLAorICAgICAgZm9yd2FyZF8oZm9yd2FyZCkKKyAge30KKworICB+dF90eXBlZGVmKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIHRfdHlwZSogZ2V0X3R5cGUoKTsKKworICBjb25zdCB0X3R5cGUqIGdldF90eXBlKCkgY29uc3Q7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9zeW1ib2xpYygpIGNvbnN0IHsgcmV0dXJuIHN5bWJvbGljXzsgfQorCisgIGJvb2wgaXNfZm9yd2FyZF90eXBlZGVmKCkgY29uc3QgeyByZXR1cm4gZm9yd2FyZF87IH0KKworICBib29sIGlzX3R5cGVkZWYoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogdHlwZV87CisgIHN0ZDo6c3RyaW5nIHN5bWJvbGljXzsKKyAgYm9vbCBmb3J3YXJkXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGxhdGZvcm0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5YWRiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsYXRmb3JtLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIGRlZmluZSBmb3IgbWtkaXIsc2luY2UgdGhlIG1ldGhvZCBzaWduYXR1cmUKKyAqIGlzIGRpZmZlcmVudCBmb3IgdGhlIG5vbi1QT1NJWCBNaW5HVworICovCisKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgInRocmlmdC93aW5kb3dzL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxkaXJlY3QuaD4KKyNpbmNsdWRlIDxpby5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjZXJybm8+CisKKy8vIGlnbm9yZSBFRVhJU1QsIHRocm93IG9uIGFueSBvdGhlciBlcnJvcgorI2lmZGVmIF9XSU4zMgorI2RlZmluZSBNS0RJUih4KSB7IGludCByID0gX21rZGlyKHgpOyBpZiAociA9PSAtMSAmJiBlcnJubyAhPSBFRVhJU1QpIHsgdGhyb3cgKHN0ZDo6c3RyaW5nKHgpICsgIjogIikgKyBzdHJlcnJvcihlcnJubyk7IH0gfQorI2Vsc2UKKyNkZWZpbmUgTUtESVIoeCkgeyBpbnQgciA9IG1rZGlyKHgsIFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTyk7IGlmIChyID09IC0xICYmIGVycm5vICE9IEVFWElTVCkgeyB0aHJvdyAoc3RkOjpzdHJpbmcoeCkgKyAiOiAiKSArIHN0cmVycm9yKGVycm5vKTsgfSB9CisjZW5kaWYKKworI2lmZGVmIFBBVEhfTUFYCisjZGVmaW5lIFRIUklGVF9QQVRIX01BWCBQQVRIX01BWAorI2Vsc2UKKyNkZWZpbmUgVEhSSUZUX1BBVEhfTUFYIE1BWF9QQVRICisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwubGwgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnRsLmxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MmUwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnRsLmxsCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVGhyaWZ0IHNjYW5uZXIuCisgKgorICogVG9rZW5pemVzIGEgdGhyaWZ0IGRlZmluaXRpb24gZmlsZS4KKyAqLworCisleworCisvKiBUaGlzIGlzIHJlZHVuZGFudCB3aXRoIHNvbWUgb2YgdGhlIGZsYWdzIGluIE1ha2VmaWxlLmFtLCBidXQgaXQgd29ya3MKKyAqIHdoZW4gcGVvcGxlIG92ZXJyaWRlIENYWEZMQUdTIHdpdGhvdXQgYmVpbmcgY2FyZWZ1bC4gVGhlIHByYWdtYXMgYXJlCisgKiB0aGUgJ3JpZ2h0JyB3YXkgdG8gZG8gaXQsIGJ1dCBkb24ndCB3b3JrIG9uIG9sZC1lbm91Z2ggR0NDIChpbiBwYXJ0aWN1bGFyCisgKiB0aGUgR0NDIHRoYXQgc2hpcCBvbiBNYWMgT1MgWCAxMC42LjUsICpjb3VudGVyKiB0byB3aGF0IHRoZSBHTlUgZG9jcyBzYXkpCisgKgorICogV2Ugc2hvdWxkIHJldmVydCB0aGUgTWFrZWZpbGUuYW0gY2hhbmdlcyBvbmNlIEFwcGxlIHNoaXBzIGEgcmVhc29uYWJsZQorICogR0NDLgorICovCisjaWZkZWYgX19HTlVDX18KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtZnVuY3Rpb24iCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLWxhYmVsIgorI2VuZGlmCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKworLy8gd2FybmluZyBDNDEwMjogJ2ZpbmRfcnVsZScgOiB1bnJlZmVyZW5jZWQgbGFiZWwKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMDIgKQorCisvLyB3YXJuaW5nIEM0MjY3OiAnYXJndW1lbnQnIDogY29udmVyc2lvbiBmcm9tICdzaXplX3QnIHRvICdpbnQnLCBwb3NzaWJsZSBsb3NzIG9mIGRhdGEKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyNjcgKQorCisvLyBhdm9pZCBpc2F0dHkgcmVkZWZpbml0aW9uCisjZGVmaW5lIFlZX05FVkVSX0lOVEVSQUNUSVZFIDEKKworI2RlZmluZSBZWV9OT19VTklTVERfSCAxCisjZW5kaWYKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgInRocmlmdC93aW5kb3dzL2NvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSAidGhyaWZ0L21haW4uaCIKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisKKy8qKgorICogTXVzdCBiZSBpbmNsdWRlZCBBRlRFUiBwYXJzZS90X3Byb2dyYW0uaCwgYnV0IEkgY2FuJ3QgcmVtZW1iZXIgd2h5IGFueW1vcmUKKyAqIGJlY2F1c2UgSSB3cm90ZSB0aGlzIGEgd2hpbGUgYWdvLgorICovCisjaWYgZGVmaW5lZChCSVNPTl9VU0VfUEFSU0VSX0hfRVhURU5TSU9OKQorI2luY2x1ZGUgInRocmlmdC90aHJpZnR5LmgiCisjZWxzZQorI2luY2x1ZGUgInRocmlmdC90aHJpZnR5LmhoIgorI2VuZGlmCisKK3ZvaWQgaW50ZWdlcl9vdmVyZmxvdyhjaGFyKiB0ZXh0KSB7CisgIHl5ZXJyb3IoIlRoaXMgaW50ZWdlciBpcyB0b28gYmlnOiBcIiVzXCJcbiIsIHRleHQpOworICBleGl0KDEpOworfQorCit2b2lkIHVuZXhwZWN0ZWRfdG9rZW4oY2hhciogdGV4dCkgeworICB5eWVycm9yKCJVbmV4cGVjdGVkIHRva2VuIGluIGlucHV0OiBcIiVzXCJcbiIsIHRleHQpOworICBleGl0KDEpOworfQorCislfQorCisvKioKKyAqIFByb3ZpZGVzIHRoZSB5eWxpbmVubyBnbG9iYWwsIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG91dHB1dAorICovCislb3B0aW9uIGxleC1jb21wYXQKKworLyoqCisgKiBPdXIgaW5wdXRzIGFyZSBhbGwgc2luZ2xlIGZpbGVzLCBzbyBubyBuZWVkIGZvciB5eXdyYXAKKyAqLworJW9wdGlvbiBub3l5d3JhcAorCisvKioKKyAqIFdlIGRvbid0IHVzZSBpdCwgYW5kIGl0IGZpcmVzIHVwIHdhcm5pbmdzIGF0IC1XYWxsCisgKi8KKyVvcHRpb24gbm91bnB1dAorCisvKioKKyAqIEhlbHBlciBkZWZpbml0aW9ucywgY29tbWVudHMsIGNvbnN0YW50cywgYW5kIHdoYXRub3QKKyAqLworCitpbnRjb25zdGFudCAgIChbKy1dP1swLTldKykKK2hleGNvbnN0YW50ICAgKFsrLV0/IjB4IlswLTlBLUZhLWZdKykKK2R1YmNvbnN0YW50ICAgKFsrLV0/WzAtOV0qKFwuWzAtOV0rKT8oW2VFXVsrLV0/WzAtOV0rKT8pCitpZGVudGlmaWVyICAgIChbYS16QS1aX10oXC5bYS16QS1aXzAtOV18W2EtekEtWl8wLTldKSopCit3aGl0ZXNwYWNlICAgIChbIFx0XHJcbl0qKQorc2lsbHljb21tICAgICAoIi8qIiIqIioiKi8iKQorbXVsdGljbV9iZWdpbiAoIi8qIikKK2RvY3RleHRfYmVnaW4gKCIvKioiKQorY29tbWVudCAgICAgICAoIi8vIlteXG5dKikKK3VuaXhjb21tZW50ICAgKCIjIlteXG5dKikKK3N5bWJvbCAgICAgICAgKFs6O1wsXHtcfVwoXClcPTw+XFtcXV0pCitsaXRlcmFsX2JlZ2luIChbJ1wiXSkKKworJSUKKwore3doaXRlc3BhY2V9ICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Cit7c2lsbHljb21tfSAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KKwore2RvY3RleHRfYmVnaW59IHsKKyAgc3RkOjpzdHJpbmcgcGFyc2VkKCIvKioiKTsKKyAgaW50IHN0YXRlID0gMDsgIC8vIDAgPSBub3JtYWwsIDEgPSAiKiIgc2VlbiwgIiovIiBzZWVuCisgIHdoaWxlKHN0YXRlIDwgMikKKyAgeworICAgIGludCBjaCA9IHl5aW5wdXQoKTsKKyAgICBwYXJzZWQucHVzaF9iYWNrKGNoKTsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlIEVPRjoKKyAgICAgICAgeXllcnJvcigiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBkb2MtY29tbWVudCBhdCAlZFxuIiwgeXlsaW5lbm8pOworICAgICAgICBleGl0KDEpOworICAgICAgY2FzZSAnKic6CisgICAgICAgIHN0YXRlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgc3RhdGUgPSAoc3RhdGUgPT0gMSkgPyAyIDogMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBwZGVidWcoImRvY3RleHQgPSBcIiVzXCJcbiIscGFyc2VkLmNfc3RyKCkpOworCisgLyogVGhpcyBkb2VzIG5vdCBzaG93IHVwIGluIHRoZSBwYXJzZSB0cmVlLiAqLworIC8qIFJhdGhlciwgdGhlIHBhcnNlciB3aWxsIGdyYWIgaXQgb3V0IG9mIHRoZSBnbG9iYWwuICovCisgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgIGNsZWFyX2RvY3RleHQoKTsKKyAgICBnX2RvY3RleHQgPSBzdHJkdXAocGFyc2VkLmNfc3RyKCkgKyAzKTsKKyAgICBhc3NlcnQoc3RybGVuKGdfZG9jdGV4dCkgPj0gMik7CisgICAgZ19kb2N0ZXh0W3N0cmxlbihnX2RvY3RleHQpIC0gMl0gPSAnICc7CisgICAgZ19kb2N0ZXh0W3N0cmxlbihnX2RvY3RleHQpIC0gMV0gPSAnXDAnOworICAgIGdfZG9jdGV4dCA9IGNsZWFuX3VwX2RvY3RleHQoZ19kb2N0ZXh0KTsKKyAgICBnX2RvY3RleHRfbGluZW5vID0geXlsaW5lbm87CisgICAgaWYoIChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgPT0gTlVMTCkgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9PSBJTlZBTElEKSl7CisgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgPSBzdHJkdXAoZ19kb2N0ZXh0KTsKKyAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9IGdfZG9jdGV4dF9saW5lbm87CisgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBTVElMTF9DQU5ESURBVEU7CisgICAgICBwZGVidWcoIiVzIiwicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBTVElMTF9DQU5ESURBVEUiKTsKKyAgICB9CisgIH0KK30KKwore211bHRpY21fYmVnaW59ICB7IC8qIHBhcnNlZCwgYnV0IHRocm93biBhd2F5ICovCisgIHN0ZDo6c3RyaW5nIHBhcnNlZCgiLyoiKTsKKyAgaW50IHN0YXRlID0gMDsgIC8vIDAgPSBub3JtYWwsIDEgPSAiKiIgc2VlbiwgIiovIiBzZWVuCisgIHdoaWxlKHN0YXRlIDwgMikKKyAgeworICAgIGludCBjaCA9IHl5aW5wdXQoKTsKKyAgICBwYXJzZWQucHVzaF9iYWNrKGNoKTsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlIEVPRjoKKyAgICAgICAgeXllcnJvcigiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBtdWx0aWxpbmUgY29tbWVudCBhdCAlZFxuIiwgeXlsaW5lbm8pOworICAgICAgICBleGl0KDEpOworICAgICAgY2FzZSAnKic6CisgICAgICAgIHN0YXRlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgc3RhdGUgPSAoc3RhdGUgPT0gMSkgPyAyIDogMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBwZGVidWcoIm11bHRpX2NvbW0gPSBcIiVzXCJcbiIscGFyc2VkLmNfc3RyKCkpOworfQorCit7Y29tbWVudH0gICAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KK3t1bml4Y29tbWVudH0gICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQorCit7c3ltYm9sfSAgICAgICAgICAgICB7IHJldHVybiB5eXRleHRbMF07ICAgICAgICAgICAgICAgIH0KKyIqIiAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHl5dGV4dFswXTsgICAgICAgICAgICAgICAgfQorCisiZmFsc2UiICAgICAgICAgICAgICB7IHl5bHZhbC5pY29uc3Q9MDsgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7IH0KKyJ0cnVlIiAgICAgICAgICAgICAgIHsgeXlsdmFsLmljb25zdD0xOyByZXR1cm4gdG9rX2ludF9jb25zdGFudDsgfQorCisibmFtZXNwYWNlIiAgICAgICAgICB7IHJldHVybiB0b2tfbmFtZXNwYWNlOyAgICAgICAgICAgIH0KKyJjcHBfbmFtZXNwYWNlIiAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImNwcCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJjcHBfaW5jbHVkZSIgICAgICAgIHsgcmV0dXJuIHRva19jcHBfaW5jbHVkZTsgICAgICAgICAgfQorImNwcF90eXBlIiAgICAgICAgICAgeyByZXR1cm4gdG9rX2NwcF90eXBlOyAgICAgICAgICAgICB9CisiamF2YV9wYWNrYWdlIiAgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJqYXZhX3BhY2thZ2UiLCAiamF2YSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJjc2hhcnBfbmFtZXNwYWNlIiAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImNzaGFycCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJkZWxwaGlfbmFtZXNwYWNlIiAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImRlbHBoaSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJwaHBfbmFtZXNwYWNlIiAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInBocCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJweV9tb2R1bGUiICAgICAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInB5X21vZHVsZSIsICJweSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJwZXJsX3BhY2thZ2UiICAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInBlcmxfcGFja2FnZSIsICJwZXJsIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInJ1YnlfbmFtZXNwYWNlIiAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgicnVieSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJzbWFsbHRhbGtfY2F0ZWdvcnkiIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInNtYWxsdGFsa19jYXRlZ29yeSIsICJzdCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJzbWFsbHRhbGtfcHJlZml4IiAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInNtYWxsdGFsa19wcmVmaXgiLCAic3QiKTsgLyogZG8gbm90aGluZyAqLyB9CisieHNkX2FsbCIgICAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2FsbDsgICAgICAgICAgICAgIH0KKyJ4c2Rfb3B0aW9uYWwiICAgICAgIHsgcmV0dXJuIHRva194c2Rfb3B0aW9uYWw7ICAgICAgICAgfQorInhzZF9uaWxsYWJsZSIgICAgICAgeyByZXR1cm4gdG9rX3hzZF9uaWxsYWJsZTsgICAgICAgICB9CisieHNkX25hbWVzcGFjZSIgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJ4c2QiKTsgLyogZG8gbm90aGluZyAqLyB9CisieHNkX2F0dHJzIiAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2F0dHJzOyAgICAgICAgICAgIH0KKyJpbmNsdWRlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19pbmNsdWRlOyAgICAgICAgICAgICAgfQorInZvaWQiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3ZvaWQ7ICAgICAgICAgICAgICAgICB9CisiYm9vbCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfYm9vbDsgICAgICAgICAgICAgICAgIH0KKyJieXRlIiAgICAgICAgICAgICAgIHsKKyAgZW1pdF9ieXRlX3R5cGVfd2FybmluZygpOworICByZXR1cm4gdG9rX2k4OworfQorImk4IiAgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2k4OyAgICAgICAgICAgICAgICAgICB9CisiaTE2IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTE2OyAgICAgICAgICAgICAgICAgIH0KKyJpMzIiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pMzI7ICAgICAgICAgICAgICAgICAgfQorImk2NCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2k2NDsgICAgICAgICAgICAgICAgICB9CisiZG91YmxlIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfZG91YmxlOyAgICAgICAgICAgICAgIH0KKyJzdHJpbmciICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zdHJpbmc7ICAgICAgICAgICAgICAgfQorImJpbmFyeSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2JpbmFyeTsgICAgICAgICAgICAgICB9Cisic2xpc3QiIHsKKyAgcHdhcm5pbmcoMCwgIlwic2xpc3RcIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgY29tcGlsZXIgdmVyc2lvbi4gIFRoaXMgdHlwZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBcInN0cmluZ1wiLlxuIik7CisgIHJldHVybiB0b2tfc2xpc3Q7Cit9Cisic2VudW0iIHsKKyAgcHdhcm5pbmcoMCwgIlwic2VudW1cIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgY29tcGlsZXIgdmVyc2lvbi4gIFRoaXMgdHlwZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBcInN0cmluZ1wiLlxuIik7CisgIHJldHVybiB0b2tfc2VudW07Cit9CisibWFwIiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfbWFwOyAgICAgICAgICAgICAgICAgIH0KKyJsaXN0IiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19saXN0OyAgICAgICAgICAgICAgICAgfQorInNldCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NldDsgICAgICAgICAgICAgICAgICB9Cisib25ld2F5IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfb25ld2F5OyAgICAgICAgICAgICAgIH0KKyJ0eXBlZGVmIiAgICAgICAgICAgIHsgcmV0dXJuIHRva190eXBlZGVmOyAgICAgICAgICAgICAgfQorInN0cnVjdCIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3N0cnVjdDsgICAgICAgICAgICAgICB9CisidW5pb24iICAgICAgICAgICAgICB7IHJldHVybiB0b2tfdW5pb247ICAgICAgICAgICAgICAgIH0KKyJleGNlcHRpb24iICAgICAgICAgIHsgcmV0dXJuIHRva194Y2VwdGlvbjsgICAgICAgICAgICAgfQorImV4dGVuZHMiICAgICAgICAgICAgeyByZXR1cm4gdG9rX2V4dGVuZHM7ICAgICAgICAgICAgICB9CisidGhyb3dzIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfdGhyb3dzOyAgICAgICAgICAgICAgIH0KKyJzZXJ2aWNlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19zZXJ2aWNlOyAgICAgICAgICAgICAgfQorImVudW0iICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2VudW07ICAgICAgICAgICAgICAgICB9CisiY29uc3QiICAgICAgICAgICAgICB7IHJldHVybiB0b2tfY29uc3Q7ICAgICAgICAgICAgICAgIH0KKyJyZXF1aXJlZCIgICAgICAgICAgIHsgcmV0dXJuIHRva19yZXF1aXJlZDsgICAgICAgICAgICAgfQorIm9wdGlvbmFsIiAgICAgICAgICAgeyByZXR1cm4gdG9rX29wdGlvbmFsOyAgICAgICAgICAgICB9CisiYXN5bmMiIHsKKyAgcHdhcm5pbmcoMCwgIlwiYXN5bmNcIiBpcyBkZXByZWNhdGVkLiAgSXQgaXMgY2FsbGVkIFwib25ld2F5XCIgbm93LlxuIik7CisgIHJldHVybiB0b2tfb25ld2F5OworfQorIiYiICAgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3JlZmVyZW5jZTsgICAgICAgICAgICB9CisKK3tpbnRjb25zdGFudH0geworICBlcnJubyA9IDA7CisgIHl5bHZhbC5pY29uc3QgPSBzdHJ0b2xsKHl5dGV4dCwgTlVMTCwgMTApOworICBpZiAoZXJybm8gPT0gRVJBTkdFKSB7CisgICAgaW50ZWdlcl9vdmVyZmxvdyh5eXRleHQpOworICB9CisgIHJldHVybiB0b2tfaW50X2NvbnN0YW50OworfQorCit7aGV4Y29uc3RhbnR9IHsKKyAgZXJybm8gPSAwOworICBjaGFyIHNpZ24gPSB5eXRleHRbMF07CisgIGludCBzaGlmdCA9IHNpZ24gPT0gJzAnID8gMiA6IDM7CisgIHl5bHZhbC5pY29uc3QgPSBzdHJ0b2xsKHl5dGV4dCtzaGlmdCwgTlVMTCwgMTYpOworICBpZiAoc2lnbiA9PSAnLScpIHsKKyAgICB5eWx2YWwuaWNvbnN0ID0gLXl5bHZhbC5pY29uc3Q7CisgIH0KKyAgaWYgKGVycm5vID09IEVSQU5HRSkgeworICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKKyAgfQorICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKK30KKwore2lkZW50aWZpZXJ9IHsKKyAgeXlsdmFsLmlkID0gc3RyZHVwKHl5dGV4dCk7CisgIHJldHVybiB0b2tfaWRlbnRpZmllcjsKK30KKwore2R1YmNvbnN0YW50fSB7CisgLyogRGVsaWJlcmF0ZWx5IHBsYWNlZCBhZnRlciBpZGVudGlmaWVyLCBzaW5jZSAiZTEwIiBpcyBOT1QgYSBkb3VibGUgbGl0ZXJhbCAoVEhSSUZULTM0NzcpICovCisgIHl5bHZhbC5kY29uc3QgPSBhdG9mKHl5dGV4dCk7CisgIHJldHVybiB0b2tfZHViX2NvbnN0YW50OworfQorCit7bGl0ZXJhbF9iZWdpbn0geworICBjaGFyIG1hcmsgPSB5eXRleHRbMF07CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgZm9yKDs7KQorICB7CisgICAgaW50IGNoID0geXlpbnB1dCgpOworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgRU9GOgorICAgICAgICB5eWVycm9yKCJFbmQgb2YgZmlsZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8pOworICAgICAgICBleGl0KDEpOworICAgICAgY2FzZSAnXG4nOgorICAgICAgICB5eWVycm9yKCJFbmQgb2YgbGluZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8gLSAxKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgY2ggPSB5eWlucHV0KCk7CisgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xyJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xuJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1x0Jyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJyInKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1wnJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcXCcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHl5ZXJyb3IoIkJhZCBlc2NhcGUgY2hhcmFjdGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChjaCA9PSBtYXJrKSB7CisgICAgICAgICAgeXlsdmFsLmlkID0gc3RyZHVwKHJlc3VsdC5jX3N0cigpKTsKKyAgICAgICAgICByZXR1cm4gdG9rX2xpdGVyYWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaCk7CisgICAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisuIHsKKyAgdW5leHBlY3RlZF90b2tlbih5eXRleHQpOworfQorCislJQorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorCisvKiB2aW06IGZpbGV0eXBlPWxleAorKi8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdHkueXkgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5Lnl5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMzRhZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5Lnl5CkBAIC0wLDAgKzEsMTIwMSBAQAorJWNvZGUgcmVxdWlyZXMgeworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKK30KKyV7CisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVGhyaWZ0IHBhcnNlci4KKyAqCisgKiBUaGlzIHBhcnNlciBpcyB1c2VkIG9uIGEgdGhyaWZ0IGRlZmluaXRpb24gZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNlbmRpZgorI2lmbmRlZiBfX1NURENfRk9STUFUX01BQ1JPUworI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUworI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZm5kZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSAidGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorCisjaWZkZWYgX01TQ19WRVIKKy8vd2FybmluZyBDNDA2NTogc3dpdGNoIHN0YXRlbWVudCBjb250YWlucyAnZGVmYXVsdCcgYnV0IG5vICdjYXNlJyBsYWJlbHMKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQwNjUpCisjZW5kaWYKKworLyoqCisgKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIGZvciBhdXRvbWF0aWMgbnVtYmVyaW5nIG9mIGZpZWxkIGluZGljZXMgZXRjLgorICogd2hlbiBwYXJzaW5nIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LiBGaWVsZCB2YWx1ZXMgYXJlIGF1dG9tYXRpY2FsbHkKKyAqIGFzc2lnbmVkIHN0YXJ0aW5nIGZyb20gLTEgYW5kIHdvcmtpbmcgdGhlaXIgd2F5IGRvd24uCisgKi8KK2ludCB5X2ZpZWxkX3ZhbCA9IC0xOworLyoqCisgKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIGZvciBhdXRvbWF0aWMgbnVtYmVyaW5nIG9mIGVudW0gdmFsdWVzLgorICogeV9lbnVtX3ZhbCBpcyB0aGUgbGFzdCB2YWx1ZSBhc3NpZ25lZDsgdGhlIG5leHQgYXV0by1hc3NpZ25lZCB2YWx1ZSB3aWxsIGJlCisgKiB5X2VudW1fdmFsKzEsIGFuZCB0aGVuIGl0IGNvbnRpbnVlcyB3b3JraW5nIHVwd2FyZHMuICBFeHBsaWNpdGx5IHNwZWNpZmllZAorICogZW51bSB2YWx1ZXMgcmVzZXQgeV9lbnVtX3ZhbCB0byB0aGF0IHZhbHVlLgorICovCitpbnQzMl90IHlfZW51bV92YWwgPSAtMTsKK2ludCBnX2FyZ2xpc3QgPSAwOworY29uc3QgaW50IHN0cnVjdF9pc19zdHJ1Y3QgPSAwOworY29uc3QgaW50IHN0cnVjdF9pc191bmlvbiA9IDE7CisKKyV9CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGhvbGQgdGhlIGRhdGEgdHlwZXMgYXNzb2NpYXRlZCB3aXRoCisgKiB2YXJpb3VzIHBhcnNlIG5vZGVzLgorICovCisldW5pb24geworICBjaGFyKiAgICAgICAgICBpZDsKKyAgaW50NjRfdCAgICAgICAgaWNvbnN0OworICBkb3VibGUgICAgICAgICBkY29uc3Q7CisgIGJvb2wgICAgICAgICAgIHRib29sOworICB0X2RvYyogICAgICAgICB0ZG9jOworICB0X3R5cGUqICAgICAgICB0dHlwZTsKKyAgdF9iYXNlX3R5cGUqICAgdGJhc2U7CisgIHRfdHlwZWRlZiogICAgIHR0eXBlZGVmOworICB0X2VudW0qICAgICAgICB0ZW51bTsKKyAgdF9lbnVtX3ZhbHVlKiAgdGVudW12OworICB0X2NvbnN0KiAgICAgICB0Y29uc3Q7CisgIHRfY29uc3RfdmFsdWUqIHRjb25zdHY7CisgIHRfc3RydWN0KiAgICAgIHRzdHJ1Y3Q7CisgIHRfc2VydmljZSogICAgIHRzZXJ2aWNlOworICB0X2Z1bmN0aW9uKiAgICB0ZnVuY3Rpb247CisgIHRfZmllbGQqICAgICAgIHRmaWVsZDsKKyAgY2hhciogICAgICAgICAgZHRleHQ7CisgIHRfZmllbGQ6OmVfcmVxIGVyZXE7CisgIHRfYW5ub3RhdGlvbiogIHRhbm5vdDsKKyAgdF9maWVsZF9pZCAgICAgdGZpZWxkaWQ7Cit9CisKKy8qKgorICogU3RyaW5ncyBpZGVudGlmaWVyCisgKi8KKyV0b2tlbjxpZD4gICAgIHRva19pZGVudGlmaWVyCisldG9rZW48aWQ+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+ID0gdG9rX2xpdGVyYWwiKTsKKyAgICAgICQkID0gJDI7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25WYWx1ZSAtPiIpOworICAgICAgJCQgPSBzdHJkdXAoIjEiKTsKKyAgICB9CisKKyUlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmguaW4gYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmMDc2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbgpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9WRVJTSU9OX0hfCisjZGVmaW5lIF9USFJJRlRfVkVSU0lPTl9IXyAxCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2RlZmluZSBUSFJJRlRfVkVSU0lPTiAiQFBBQ0tBR0VfVkVSU0lPTkAiCisKKyNlbmRpZiAvLyBfVEhSSUZUX1ZFUlNJT05fSF8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYTRmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCisjZGVmaW5lIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8gMQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgIlRoaXMgaXMgYSBXaW5kb3dzIGhlYWRlciBvbmx5IgorI2VuZGlmCisKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRpcmVjdC5oPgorCisjZGVmaW5lIHN0cnRvbGwoYmVnaW5fcHRyLCBlbmRfcHRyLCBsZW5ndGgpIF9zdHJ0b2k2NChiZWdpbl9wdHIsIGVuZF9wdHIsIGxlbmd0aCkKKworI2lmbmRlZiBQUkl1NjQKKyNkZWZpbmUgUFJJdTY0ICJJNjR1IgorI2VuZGlmCisKKyNpZm5kZWYgUFJJaTY0CisjZGVmaW5lIFBSSWk2NCAiSTY0aSIKKyNlbmRpZgorLy8gc3F1ZWxjaCBkZXByZWNhdGlvbiB3YXJuaW5ncworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0OTk2KQorLy8gc3F1ZWxjaCBib29sIGNvbnZlcnNpb24gcGVyZm9ybWFuY2Ugd2FybmluZworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0ODAwKQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5sbCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5sbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3MTI2OTcuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmxsCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBUaHJpZnQgc2Nhbm5lci4KLSAqCi0gKiBUb2tlbml6ZXMgYSB0aHJpZnQgZGVmaW5pdGlvbiBmaWxlLgotICovCi0KLSV7Ci0KLS8qIFRoaXMgaXMgcmVkdW5kYW50IHdpdGggc29tZSBvZiB0aGUgZmxhZ3MgaW4gTWFrZWZpbGUuYW0sIGJ1dCBpdCB3b3JrcwotICogd2hlbiBwZW9wbGUgb3ZlcnJpZGUgQ1hYRkxBR1Mgd2l0aG91dCBiZWluZyBjYXJlZnVsLiBUaGUgcHJhZ21hcyBhcmUKLSAqIHRoZSAncmlnaHQnIHdheSB0byBkbyBpdCwgYnV0IGRvbid0IHdvcmsgb24gb2xkLWVub3VnaCBHQ0MgKGluIHBhcnRpY3VsYXIKLSAqIHRoZSBHQ0MgdGhhdCBzaGlwIG9uIE1hYyBPUyBYIDEwLjYuNSwgKmNvdW50ZXIqIHRvIHdoYXQgdGhlIEdOVSBkb2NzIHNheSkKLSAqCi0gKiBXZSBzaG91bGQgcmV2ZXJ0IHRoZSBNYWtlZmlsZS5hbSBjaGFuZ2VzIG9uY2UgQXBwbGUgc2hpcHMgYSByZWFzb25hYmxlCi0gKiBHQ0MuCi0gKi8KLSNpZmRlZiBfX0dOVUNfXwotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1mdW5jdGlvbiIKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtbGFiZWwiCi0jZW5kaWYKLQotI2lmZGVmIF9NU0NfVkVSCi0vL3dhcm5pbmcgQzQxMDI6ICdmaW5kX3J1bGUnIDogdW5yZWZlcmVuY2VkIGxhYmVsCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTAyKQotLy9hdm9pZCBpc2F0dHkgcmVkZWZpbml0aW9uCi0jZGVmaW5lIFlZX05FVkVSX0lOVEVSQUNUSVZFIDEKLQotI2RlZmluZSBZWV9OT19VTklTVERfSCAxCi0jZW5kaWYKLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpZmRlZiBfTVNDX1ZFUgotI2luY2x1ZGUgIndpbmRvd3MvY29uZmlnLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotI2luY2x1ZGUgInBhcnNlL3RfcHJvZ3JhbS5oIgotCi0vKioKLSAqIE11c3QgYmUgaW5jbHVkZWQgQUZURVIgcGFyc2UvdF9wcm9ncmFtLmgsIGJ1dCBJIGNhbid0IHJlbWVtYmVyIHdoeSBhbnltb3JlCi0gKiBiZWNhdXNlIEkgd3JvdGUgdGhpcyBhIHdoaWxlIGFnby4KLSAqLwotI2lmIGRlZmluZWQoQklTT05fVVNFX1BBUlNFUl9IX0VYVEVOU0lPTikKLSNpbmNsdWRlICJ0aHJpZnR5LmgiCi0jZWxzZQotI2luY2x1ZGUgInRocmlmdHkuaGgiCi0jZW5kaWYKLQotdm9pZCB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZChjaGFyKiBrZXl3b3JkKSB7Ci0gIHl5ZXJyb3IoIkNhbm5vdCB1c2UgcmVzZXJ2ZWQgbGFuZ3VhZ2Uga2V5d29yZDogXCIlc1wiXG4iLCBrZXl3b3JkKTsKLSAgZXhpdCgxKTsKLX0KLQotdm9pZCBpbnRlZ2VyX292ZXJmbG93KGNoYXIqIHRleHQpIHsKLSAgeXllcnJvcigiVGhpcyBpbnRlZ2VyIGlzIHRvbyBiaWc6IFwiJXNcIlxuIiwgdGV4dCk7Ci0gIGV4aXQoMSk7Ci19Ci0KLXZvaWQgdW5leHBlY3RlZF90b2tlbihjaGFyKiB0ZXh0KSB7Ci0gIHl5ZXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gaW4gaW5wdXQ6IFwiJXNcIlxuIiwgdGV4dCk7Ci0gIGV4aXQoMSk7Ci19Ci0KLSV9Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIHl5bGluZW5vIGdsb2JhbCwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgb3V0cHV0Ci0gKi8KLSVvcHRpb24gbGV4LWNvbXBhdAotCi0vKioKLSAqIE91ciBpbnB1dHMgYXJlIGFsbCBzaW5nbGUgZmlsZXMsIHNvIG5vIG5lZWQgZm9yIHl5d3JhcAotICovCi0lb3B0aW9uIG5veXl3cmFwCi0KLS8qKgotICogV2UgZG9uJ3QgdXNlIGl0LCBhbmQgaXQgZmlyZXMgdXAgd2FybmluZ3MgYXQgLVdhbGwKLSAqLwotJW9wdGlvbiBub3VucHV0Ci0KLS8qKgotICogSGVscGVyIGRlZmluaXRpb25zLCBjb21tZW50cywgY29uc3RhbnRzLCBhbmQgd2hhdG5vdAotICovCi0KLWludGNvbnN0YW50ICAgKFsrLV0/WzAtOV0rKQotaGV4Y29uc3RhbnQgICAoWystXT8iMHgiWzAtOUEtRmEtZl0rKQotZHViY29uc3RhbnQgICAoWystXT9bMC05XSooXC5bMC05XSspPyhbZUVdWystXT9bMC05XSspPykKLWlkZW50aWZpZXIgICAgKFthLXpBLVpfXShcLlthLXpBLVpfMC05XXxbYS16QS1aXzAtOV0pKikKLXdoaXRlc3BhY2UgICAgKFsgXHRcclxuXSopCi1zaWxseWNvbW0gICAgICgiLyoiIioiKiIqLyIpCi1tdWx0aWNvbW0gICAgICgiLyoiW14qXSIvIiooW14qL118W14qXSIvInwiKiJbXi9dKSoiKiIqIiovIikKLWRvY3RleHQgICAgICAgKCIvKioiKFteKi9dfFteKl0iLyJ8IioiW14vXSkqIioiKiIqLyIpCi1jb21tZW50ICAgICAgICgiLy8iW15cbl0qKQotdW5peGNvbW1lbnQgICAoIiMiW15cbl0qKQotc3ltYm9sICAgICAgICAoWzo7XCxce1x9XChcKVw9PD5cW1xdXSkKLXN0X2lkZW50aWZpZXIgKFthLXpBLVotXShcLlthLXpBLVpfMC05LV18W2EtekEtWl8wLTktXSkqKQotbGl0ZXJhbF9iZWdpbiAoWydcIl0pCi0KLSUlCi0KLXt3aGl0ZXNwYWNlfSAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQote3NpbGx5Y29tbX0gICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Ci17bXVsdGljb21tfSAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLXtjb21tZW50fSAgICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQote3VuaXhjb21tZW50fSAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Ci0KLXtzeW1ib2x9ICAgICAgICAgICAgIHsgcmV0dXJuIHl5dGV4dFswXTsgICAgICAgICAgICAgICAgfQotIioiICAgICAgICAgICAgICAgICAgeyByZXR1cm4geXl0ZXh0WzBdOyAgICAgICAgICAgICAgICB9Ci0KLSJmYWxzZSIgICAgICAgICAgICAgIHsgeXlsdmFsLmljb25zdD0wOyByZXR1cm4gdG9rX2ludF9jb25zdGFudDsgfQotInRydWUiICAgICAgICAgICAgICAgeyB5eWx2YWwuaWNvbnN0PTE7IHJldHVybiB0b2tfaW50X2NvbnN0YW50OyB9Ci0KLSJuYW1lc3BhY2UiICAgICAgICAgIHsgcmV0dXJuIHRva19uYW1lc3BhY2U7ICAgICAgICAgICAgfQotImNwcF9uYW1lc3BhY2UiICAgICAgeyByZXR1cm4gdG9rX2NwcF9uYW1lc3BhY2U7ICAgICAgICB9Ci0iY3BwX2luY2x1ZGUiICAgICAgICB7IHJldHVybiB0b2tfY3BwX2luY2x1ZGU7ICAgICAgICAgIH0KLSJjcHBfdHlwZSIgICAgICAgICAgIHsgcmV0dXJuIHRva19jcHBfdHlwZTsgICAgICAgICAgICAgfQotImphdmFfcGFja2FnZSIgICAgICAgeyByZXR1cm4gdG9rX2phdmFfcGFja2FnZTsgICAgICAgICB9Ci0iY29jb2FfcHJlZml4IiAgICAgICB7IHJldHVybiB0b2tfY29jb2FfcHJlZml4OyAgICAgICAgIH0KLSJjc2hhcnBfbmFtZXNwYWNlIiAgIHsgcmV0dXJuIHRva19jc2hhcnBfbmFtZXNwYWNlOyAgICAgfQotImRlbHBoaV9uYW1lc3BhY2UiICAgeyByZXR1cm4gdG9rX2RlbHBoaV9uYW1lc3BhY2U7ICAgICB9Ci0icGhwX25hbWVzcGFjZSIgICAgICB7IHJldHVybiB0b2tfcGhwX25hbWVzcGFjZTsgICAgICAgIH0KLSJweV9tb2R1bGUiICAgICAgICAgIHsgcmV0dXJuIHRva19weV9tb2R1bGU7ICAgICAgICAgICAgfQotInBlcmxfcGFja2FnZSIgICAgICAgeyByZXR1cm4gdG9rX3BlcmxfcGFja2FnZTsgICAgICAgICB9Ci0icnVieV9uYW1lc3BhY2UiICAgICB7IHJldHVybiB0b2tfcnVieV9uYW1lc3BhY2U7ICAgICAgIH0KLSJzbWFsbHRhbGtfY2F0ZWdvcnkiIHsgcmV0dXJuIHRva19zbWFsbHRhbGtfY2F0ZWdvcnk7ICAgfQotInNtYWxsdGFsa19wcmVmaXgiICAgeyByZXR1cm4gdG9rX3NtYWxsdGFsa19wcmVmaXg7ICAgICB9Ci0ieHNkX2FsbCIgICAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2FsbDsgICAgICAgICAgICAgIH0KLSJ4c2Rfb3B0aW9uYWwiICAgICAgIHsgcmV0dXJuIHRva194c2Rfb3B0aW9uYWw7ICAgICAgICAgfQotInhzZF9uaWxsYWJsZSIgICAgICAgeyByZXR1cm4gdG9rX3hzZF9uaWxsYWJsZTsgICAgICAgICB9Ci0ieHNkX25hbWVzcGFjZSIgICAgICB7IHJldHVybiB0b2tfeHNkX25hbWVzcGFjZTsgICAgICAgIH0KLSJ4c2RfYXR0cnMiICAgICAgICAgIHsgcmV0dXJuIHRva194c2RfYXR0cnM7ICAgICAgICAgICAgfQotImluY2x1ZGUiICAgICAgICAgICAgeyByZXR1cm4gdG9rX2luY2x1ZGU7ICAgICAgICAgICAgICB9Ci0idm9pZCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfdm9pZDsgICAgICAgICAgICAgICAgIH0KLSJib29sIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19ib29sOyAgICAgICAgICAgICAgICAgfQotImJ5dGUiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2J5dGU7ICAgICAgICAgICAgICAgICB9Ci0iaTE2IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTE2OyAgICAgICAgICAgICAgICAgIH0KLSJpMzIiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pMzI7ICAgICAgICAgICAgICAgICAgfQotImk2NCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2k2NDsgICAgICAgICAgICAgICAgICB9Ci0iZG91YmxlIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfZG91YmxlOyAgICAgICAgICAgICAgIH0KLSJzdHJpbmciICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zdHJpbmc7ICAgICAgICAgICAgICAgfQotImJpbmFyeSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2JpbmFyeTsgICAgICAgICAgICAgICB9Ci0ic2xpc3QiIHsKLSAgcHdhcm5pbmcoMCwgIlwic2xpc3RcIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgY29tcGlsZXIgdmVyc2lvbi4gIFRoaXMgdHlwZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBcInN0cmluZ1wiLlxuIik7Ci0gIHJldHVybiB0b2tfc2xpc3Q7Ci19Ci0ic2VudW0iIHsKLSAgcHdhcm5pbmcoMCwgIlwic2VudW1cIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgY29tcGlsZXIgdmVyc2lvbi4gIFRoaXMgdHlwZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBcInN0cmluZ1wiLlxuIik7Ci0gIHJldHVybiB0b2tfc2VudW07Ci19Ci0ibWFwIiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfbWFwOyAgICAgICAgICAgICAgICAgIH0KLSJsaXN0IiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19saXN0OyAgICAgICAgICAgICAgICAgfQotInNldCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NldDsgICAgICAgICAgICAgICAgICB9Ci0ib25ld2F5IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfb25ld2F5OyAgICAgICAgICAgICAgIH0KLSJ0eXBlZGVmIiAgICAgICAgICAgIHsgcmV0dXJuIHRva190eXBlZGVmOyAgICAgICAgICAgICAgfQotInN0cnVjdCIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3N0cnVjdDsgICAgICAgICAgICAgICB9Ci0idW5pb24iICAgICAgICAgICAgICB7IHJldHVybiB0b2tfdW5pb247ICAgICAgICAgICAgICAgIH0KLSJleGNlcHRpb24iICAgICAgICAgIHsgcmV0dXJuIHRva194Y2VwdGlvbjsgICAgICAgICAgICAgfQotImV4dGVuZHMiICAgICAgICAgICAgeyByZXR1cm4gdG9rX2V4dGVuZHM7ICAgICAgICAgICAgICB9Ci0idGhyb3dzIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfdGhyb3dzOyAgICAgICAgICAgICAgIH0KLSJzZXJ2aWNlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19zZXJ2aWNlOyAgICAgICAgICAgICAgfQotImVudW0iICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2VudW07ICAgICAgICAgICAgICAgICB9Ci0iY29uc3QiICAgICAgICAgICAgICB7IHJldHVybiB0b2tfY29uc3Q7ICAgICAgICAgICAgICAgIH0KLSJyZXF1aXJlZCIgICAgICAgICAgIHsgcmV0dXJuIHRva19yZXF1aXJlZDsgICAgICAgICAgICAgfQotIm9wdGlvbmFsIiAgICAgICAgICAgeyByZXR1cm4gdG9rX29wdGlvbmFsOyAgICAgICAgICAgICB9Ci0iYXN5bmMiIHsKLSAgcHdhcm5pbmcoMCwgIlwiYXN5bmNcIiBpcyBkZXByZWNhdGVkLiAgSXQgaXMgY2FsbGVkIFwib25ld2F5XCIgbm93LlxuIik7Ci0gIHJldHVybiB0b2tfb25ld2F5OwotfQotIiYiICAgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3JlZmVyZW5jZTsgICAgICAgICAgICB9Ci0KLQotIkJFR0lOIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iRU5EIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0NMQVNTX18iICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fRElSX18iICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19GSUxFX18iICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0ZVTkNUSU9OX18iICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fTElORV9fIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19NRVRIT0RfXyIgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX05BTUVTUEFDRV9fIiAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFic3RyYWN0IiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYWxpYXMiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhbmQiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFyZ3MiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYXMiICAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhc3NlcnQiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImJlZ2luIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYnJlYWsiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjYXNlIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImNhdGNoIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2xhc3MiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjbG9uZSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImNvbnRpbnVlIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVjbGFyZSIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkZWYiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlZmF1bHQiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVsIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkZWxldGUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRvIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZHluYW1pYyIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbGlmIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVsc2UiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxzZWlmIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbHNpZiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kZGVjbGFyZSIgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmRmb3IiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZGZvcmVhY2giICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kaWYiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmRzd2l0Y2giICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZHdoaWxlIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5zdXJlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJleGNlcHQiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImV4ZWMiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZmluYWxseSIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmbG9hdCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZvciIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZm9yZWFjaCIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmcm9tIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZ1bmN0aW9uIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZ2xvYmFsIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJnb3RvIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImlmIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW1wbGVtZW50cyIgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbXBvcnQiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImluIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW5saW5lIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbnN0YW5jZW9mIiAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImludGVyZmFjZSIgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaXMiICAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJsYW1iZGEiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm1vZHVsZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibmF0aXZlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJuZXciICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5leHQiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibmlsIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJub3QiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm9yIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icGFja2FnZSIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwYXNzIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInB1YmxpYyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHJpbnQiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwcml2YXRlIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInByb3RlY3RlZCIgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHVibGljIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyYWlzZSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJlZG8iICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmVzY3VlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyZXRyeSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJlZ2lzdGVyIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmV0dXJuIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzZWxmIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInNpemVvZiIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic3RhdGljIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzdXBlciIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInN3aXRjaCIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic3luY2hyb25pemVkIiAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0aGVuIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRoaXMiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idGhyb3ciICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0cmFuc2llbnQiICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRyeSIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW5kZWYiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bmlvbiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVubGVzcyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW5zaWduZWQiICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bnRpbCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVzZSIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idmFyIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ2aXJ0dWFsIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInZvbGF0aWxlIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0id2hlbiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ3aGlsZSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIndpdGgiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ieG9yIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ5aWVsZCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotCi17aW50Y29uc3RhbnR9IHsKLSAgZXJybm8gPSAwOwotICB5eWx2YWwuaWNvbnN0ID0gc3RydG9sbCh5eXRleHQsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vID09IEVSQU5HRSkgewotICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKLSAgfQotICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKLX0KLQote2hleGNvbnN0YW50fSB7Ci0gIGVycm5vID0gMDsKLSAgY2hhciBzaWduID0geXl0ZXh0WzBdOwotICBpbnQgc2hpZnQgPSBzaWduID09ICcwJyA/IDIgOiAzOwotICB5eWx2YWwuaWNvbnN0ID0gc3RydG9sbCh5eXRleHQrc2hpZnQsIE5VTEwsIDE2KTsKLSAgaWYgKHNpZ24gPT0gJy0nKSB7Ci0gICAgeXlsdmFsLmljb25zdCA9IC15eWx2YWwuaWNvbnN0OwotICB9Ci0gIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKLSAgICBpbnRlZ2VyX292ZXJmbG93KHl5dGV4dCk7Ci0gIH0KLSAgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7Ci19Ci0KLXtkdWJjb25zdGFudH0gewotICB5eWx2YWwuZGNvbnN0ID0gYXRvZih5eXRleHQpOwotICByZXR1cm4gdG9rX2R1Yl9jb25zdGFudDsKLX0KLQote2lkZW50aWZpZXJ9IHsKLSAgeXlsdmFsLmlkID0gc3RyZHVwKHl5dGV4dCk7Ci0gIHJldHVybiB0b2tfaWRlbnRpZmllcjsKLX0KLQote3N0X2lkZW50aWZpZXJ9IHsKLSAgeXlsdmFsLmlkID0gc3RyZHVwKHl5dGV4dCk7Ci0gIHJldHVybiB0b2tfc3RfaWRlbnRpZmllcjsKLX0KLQote2xpdGVyYWxfYmVnaW59IHsKLSAgY2hhciBtYXJrID0geXl0ZXh0WzBdOwotICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gIGZvcig7OykKLSAgewotICAgIGludCBjaCA9IHl5aW5wdXQoKTsKLSAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICBjYXNlIEVPRjoKLSAgICAgICAgeXllcnJvcigiRW5kIG9mIGZpbGUgd2hpbGUgcmVhZCBzdHJpbmcgYXQgJWRcbiIsIHl5bGluZW5vKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgeXllcnJvcigiRW5kIG9mIGxpbmUgd2hpbGUgcmVhZCBzdHJpbmcgYXQgJWRcbiIsIHl5bGluZW5vIC0gMSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICBjYXNlICdcXCc6Ci0gICAgICAgIGNoID0geXlpbnB1dCgpOwotICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgY2FzZSAncic6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdccicpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgY2FzZSAnbic6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcbicpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcdCcpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgY2FzZSAnIic6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCciJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcJycpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXFwnKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB5eWVycm9yKCJCYWQgZXNjYXBlIGNoYXJhY3RlclxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoY2ggPT0gbWFyaykgewotICAgICAgICAgIHl5bHZhbC5pZCA9IHN0cmR1cChyZXN1bHQuY19zdHIoKSk7Ci0gICAgICAgICAgcmV0dXJuIHRva19saXRlcmFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soY2gpOwotICAgICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQote2RvY3RleHR9IHsKLSAvKiBUaGlzIGRvZXMgbm90IHNob3cgdXAgaW4gdGhlIHBhcnNlIHRyZWUuICovCi0gLyogUmF0aGVyLCB0aGUgcGFyc2VyIHdpbGwgZ3JhYiBpdCBvdXQgb2YgdGhlIGdsb2JhbC4gKi8KLSAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgY2xlYXJfZG9jdGV4dCgpOwotICAgIGdfZG9jdGV4dCA9IHN0cmR1cCh5eXRleHQgKyAzKTsKLSAgICBhc3NlcnQoc3RybGVuKGdfZG9jdGV4dCkgPj0gMik7Ci0gICAgZ19kb2N0ZXh0W3N0cmxlbihnX2RvY3RleHQpIC0gMl0gPSAnICc7Ci0gICAgZ19kb2N0ZXh0W3N0cmxlbihnX2RvY3RleHQpIC0gMV0gPSAnXDAnOwotICAgIGdfZG9jdGV4dCA9IGNsZWFuX3VwX2RvY3RleHQoZ19kb2N0ZXh0KTsKLSAgICBnX2RvY3RleHRfbGluZW5vID0geXlsaW5lbm87Ci0gICAgaWYoIChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgPT0gTlVMTCkgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9PSBJTlZBTElEKSl7Ci0gICAgICBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgPSBzdHJkdXAoZ19kb2N0ZXh0KTsKLSAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9IGdfZG9jdGV4dF9saW5lbm87Ci0gICAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBTVElMTF9DQU5ESURBVEU7Ci0gICAgICBwZGVidWcoIiVzIiwicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBTVElMTF9DQU5ESURBVEUiKTsKLSAgICB9Ci0gIH0KLX0KLQotLiB7Ci0gIHVuZXhwZWN0ZWRfdG9rZW4oeXl0ZXh0KTsKLX0KLQotCi0uIHsKLSAgLyogQ2F0Y2gtYWxsIHRvIGxldCB1cyBjYXRjaCAiKiIgaW4gdGhlIHBhcnNlci4gKi8KLSAgcmV0dXJuIChpbnQpIHl5dGV4dFswXTsKLX0KLQotJSUKLQotLyogdmltOiBmaWxldHlwZT1sZXgKLSovCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdHkueXkgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdHkueXkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZDQyMzEuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5CisrKyAvZGV2L251bGwKQEAgLTEsMTMxMiArMCwwIEBACi0lewotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFRocmlmdCBwYXJzZXIuCi0gKgotICogVGhpcyBwYXJzZXIgaXMgdXNlZCBvbiBhIHRocmlmdCBkZWZpbml0aW9uIGZpbGUuCi0gKgotICovCi0KLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUwotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZuZGVmIF9NU0NfVkVSCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpZmRlZiBfTVNDX1ZFUgotI2luY2x1ZGUgIndpbmRvd3MvY29uZmlnLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotI2luY2x1ZGUgInBhcnNlL3RfcHJvZ3JhbS5oIgotI2luY2x1ZGUgInBhcnNlL3Rfc2NvcGUuaCIKLQotI2lmZGVmIF9NU0NfVkVSCi0vL3dhcm5pbmcgQzQwNjU6IHN3aXRjaCBzdGF0ZW1lbnQgY29udGFpbnMgJ2RlZmF1bHQnIGJ1dCBubyAnY2FzZScgbGFiZWxzCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MDY1KQotI2VuZGlmCi0KLS8qKgotICogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgdXNlZCBmb3IgYXV0b21hdGljIG51bWJlcmluZyBvZiBmaWVsZCBpbmRpY2VzIGV0Yy4KLSAqIHdoZW4gcGFyc2luZyB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4gRmllbGQgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5Ci0gKiBhc3NpZ25lZCBzdGFydGluZyBmcm9tIC0xIGFuZCB3b3JraW5nIHRoZWlyIHdheSBkb3duLgotICovCi1pbnQgeV9maWVsZF92YWwgPSAtMTsKLS8qKgotICogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgdXNlZCBmb3IgYXV0b21hdGljIG51bWJlcmluZyBvZiBlbnVtIHZhbHVlcy4KLSAqIHlfZW51bV92YWwgaXMgdGhlIGxhc3QgdmFsdWUgYXNzaWduZWQ7IHRoZSBuZXh0IGF1dG8tYXNzaWduZWQgdmFsdWUgd2lsbCBiZQotICogeV9lbnVtX3ZhbCsxLCBhbmQgdGhlbiBpdCBjb250aW51ZXMgd29ya2luZyB1cHdhcmRzLiAgRXhwbGljaXRseSBzcGVjaWZpZWQKLSAqIGVudW0gdmFsdWVzIHJlc2V0IHlfZW51bV92YWwgdG8gdGhhdCB2YWx1ZS4KLSAqLwotaW50MzJfdCB5X2VudW1fdmFsID0gLTE7Ci1pbnQgZ19hcmdsaXN0ID0gMDsKLWNvbnN0IGludCBzdHJ1Y3RfaXNfc3RydWN0ID0gMDsKLWNvbnN0IGludCBzdHJ1Y3RfaXNfdW5pb24gPSAxOwotCi0lfQotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgdGhlIHBhcnNlciB0byBob2xkIHRoZSBkYXRhIHR5cGVzIGFzc29jaWF0ZWQgd2l0aAotICogdmFyaW91cyBwYXJzZSBub2Rlcy4KLSAqLwotJXVuaW9uIHsKLSAgY2hhciogICAgICAgICAgaWQ7Ci0gIGludDY0X3QgICAgICAgIGljb25zdDsKLSAgZG91YmxlICAgICAgICAgZGNvbnN0OwotICBib29sICAgICAgICAgICB0Ym9vbDsKLSAgdF9kb2MqICAgICAgICAgdGRvYzsKLSAgdF90eXBlKiAgICAgICAgdHR5cGU7Ci0gIHRfYmFzZV90eXBlKiAgIHRiYXNlOwotICB0X3R5cGVkZWYqICAgICB0dHlwZWRlZjsKLSAgdF9lbnVtKiAgICAgICAgdGVudW07Ci0gIHRfZW51bV92YWx1ZSogIHRlbnVtdjsKLSAgdF9jb25zdCogICAgICAgdGNvbnN0OwotICB0X2NvbnN0X3ZhbHVlKiB0Y29uc3R2OwotICB0X3N0cnVjdCogICAgICB0c3RydWN0OwotICB0X3NlcnZpY2UqICAgICB0c2VydmljZTsKLSAgdF9mdW5jdGlvbiogICAgdGZ1bmN0aW9uOwotICB0X2ZpZWxkKiAgICAgICB0ZmllbGQ7Ci0gIGNoYXIqICAgICAgICAgIGR0ZXh0OwotICB0X2ZpZWxkOjplX3JlcSBlcmVxOwotICB0X2Fubm90YXRpb24qICB0YW5ub3Q7Ci0gIHRfZmllbGRfaWQgICAgIHRmaWVsZGlkOwotfQotCi0vKioKLSAqIFN0cmluZ3MgaWRlbnRpZmllcgotICovCi0ldG9rZW48aWQ+ICAgICB0b2tfaWRlbnRpZmllcgotJXRva2VuPGlkPiAgICAgdG9rX2xpdGVyYWwKLSV0b2tlbjxkdGV4dD4gIHRva19kb2N0ZXh0Ci0ldG9rZW48aWQ+ICAgICB0b2tfc3RfaWRlbnRpZmllcgotCi0vKioKLSAqIENvbnN0YW50IHZhbHVlcwotICovCi0ldG9rZW48aWNvbnN0PiB0b2tfaW50X2NvbnN0YW50Ci0ldG9rZW48ZGNvbnN0PiB0b2tfZHViX2NvbnN0YW50Ci0KLS8qKgotICogSGVhZGVyIGtleXdvcmRzCi0gKi8KLSV0b2tlbiB0b2tfaW5jbHVkZQotJXRva2VuIHRva19uYW1lc3BhY2UKLSV0b2tlbiB0b2tfY3BwX25hbWVzcGFjZQotJXRva2VuIHRva19jcHBfaW5jbHVkZQotJXRva2VuIHRva19jcHBfdHlwZQotJXRva2VuIHRva19waHBfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX3B5X21vZHVsZQotJXRva2VuIHRva19wZXJsX3BhY2thZ2UKLSV0b2tlbiB0b2tfamF2YV9wYWNrYWdlCi0ldG9rZW4gdG9rX3hzZF9hbGwKLSV0b2tlbiB0b2tfeHNkX29wdGlvbmFsCi0ldG9rZW4gdG9rX3hzZF9uaWxsYWJsZQotJXRva2VuIHRva194c2RfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX3hzZF9hdHRycwotJXRva2VuIHRva19ydWJ5X25hbWVzcGFjZQotJXRva2VuIHRva19zbWFsbHRhbGtfY2F0ZWdvcnkKLSV0b2tlbiB0b2tfc21hbGx0YWxrX3ByZWZpeAotJXRva2VuIHRva19jb2NvYV9wcmVmaXgKLSV0b2tlbiB0b2tfY3NoYXJwX25hbWVzcGFjZQotJXRva2VuIHRva19kZWxwaGlfbmFtZXNwYWNlCi0KLS8qKgotICogQmFzZSBkYXRhdHlwZSBrZXl3b3JkcwotICovCi0ldG9rZW4gdG9rX3ZvaWQKLSV0b2tlbiB0b2tfYm9vbAotJXRva2VuIHRva19ieXRlCi0ldG9rZW4gdG9rX3N0cmluZwotJXRva2VuIHRva19iaW5hcnkKLSV0b2tlbiB0b2tfc2xpc3QKLSV0b2tlbiB0b2tfc2VudW0KLSV0b2tlbiB0b2tfaTE2Ci0ldG9rZW4gdG9rX2kzMgotJXRva2VuIHRva19pNjQKLSV0b2tlbiB0b2tfZG91YmxlCi0KLS8qKgotICogQ29tcGxleCB0eXBlIGtleXdvcmRzCi0gKi8KLSV0b2tlbiB0b2tfbWFwCi0ldG9rZW4gdG9rX2xpc3QKLSV0b2tlbiB0b2tfc2V0Ci0KLS8qKgotICogRnVuY3Rpb24gbW9kaWZpZXJzCi0gKi8KLSV0b2tlbiB0b2tfb25ld2F5Ci0KLS8qKgotICogVGhyaWZ0IGxhbmd1YWdlIGtleXdvcmRzCi0gKi8KLSV0b2tlbiB0b2tfdHlwZWRlZgotJXRva2VuIHRva19zdHJ1Y3QKLSV0b2tlbiB0b2tfeGNlcHRpb24KLSV0b2tlbiB0b2tfdGhyb3dzCi0ldG9rZW4gdG9rX2V4dGVuZHMKLSV0b2tlbiB0b2tfc2VydmljZQotJXRva2VuIHRva19lbnVtCi0ldG9rZW4gdG9rX2NvbnN0Ci0ldG9rZW4gdG9rX3JlcXVpcmVkCi0ldG9rZW4gdG9rX29wdGlvbmFsCi0ldG9rZW4gdG9rX3VuaW9uCi0ldG9rZW4gdG9rX3JlZmVyZW5jZQotCi0vKioKLSAqIEdyYW1tYXIgbm9kZXMKLSAqLwotCi0ldHlwZTx0dHlwZT4gICAgIEJhc2VUeXBlCi0ldHlwZTx0dHlwZT4gICAgIFNpbXBsZUJhc2VUeXBlCi0ldHlwZTx0dHlwZT4gICAgIENvbnRhaW5lclR5cGUKLSV0eXBlPHR0eXBlPiAgICAgU2ltcGxlQ29udGFpbmVyVHlwZQotJXR5cGU8dHR5cGU+ICAgICBNYXBUeXBlCi0ldHlwZTx0dHlwZT4gICAgIFNldFR5cGUKLSV0eXBlPHR0eXBlPiAgICAgTGlzdFR5cGUKLQotJXR5cGU8dGRvYz4gICAgICBEZWZpbml0aW9uCi0ldHlwZTx0dHlwZT4gICAgIFR5cGVEZWZpbml0aW9uCi0KLSV0eXBlPHR0eXBlZGVmPiAgVHlwZWRlZgotCi0ldHlwZTx0dHlwZT4gICAgIFR5cGVBbm5vdGF0aW9ucwotJXR5cGU8dHR5cGU+ICAgICBUeXBlQW5ub3RhdGlvbkxpc3QKLSV0eXBlPHRhbm5vdD4gICAgVHlwZUFubm90YXRpb24KLSV0eXBlPGlkPiAgICAgICAgVHlwZUFubm90YXRpb25WYWx1ZQotCi0ldHlwZTx0ZmllbGQ+ICAgIEZpZWxkCi0ldHlwZTx0ZmllbGRpZD4gIEZpZWxkSWRlbnRpZmllcgotJXR5cGU8ZXJlcT4gICAgICBGaWVsZFJlcXVpcmVkbmVzcwotJXR5cGU8dHR5cGU+ICAgICBGaWVsZFR5cGUKLSV0eXBlPHRjb25zdHY+ICAgRmllbGRWYWx1ZQotJXR5cGU8dHN0cnVjdD4gICBGaWVsZExpc3QKLSV0eXBlPHRib29sPiAgICAgRmllbGRSZWZlcmVuY2UKLQotJXR5cGU8dGVudW0+ICAgICBFbnVtCi0ldHlwZTx0ZW51bT4gICAgIEVudW1EZWZMaXN0Ci0ldHlwZTx0ZW51bXY+ICAgIEVudW1EZWYKLSV0eXBlPHRlbnVtdj4gICAgRW51bVZhbHVlCi0KLSV0eXBlPHR0eXBlZGVmPiAgU2VudW0KLSV0eXBlPHRiYXNlPiAgICAgU2VudW1EZWZMaXN0Ci0ldHlwZTxpZD4gICAgICAgIFNlbnVtRGVmCi0KLSV0eXBlPHRjb25zdD4gICAgQ29uc3QKLSV0eXBlPHRjb25zdHY+ICAgQ29uc3RWYWx1ZQotJXR5cGU8dGNvbnN0dj4gICBDb25zdExpc3QKLSV0eXBlPHRjb25zdHY+ICAgQ29uc3RMaXN0Q29udGVudHMKLSV0eXBlPHRjb25zdHY+ICAgQ29uc3RNYXAKLSV0eXBlPHRjb25zdHY+ICAgQ29uc3RNYXBDb250ZW50cwotCi0ldHlwZTxpY29uc3Q+ICAgIFN0cnVjdEhlYWQKLSV0eXBlPHRzdHJ1Y3Q+ICAgU3RydWN0Ci0ldHlwZTx0c3RydWN0PiAgIFhjZXB0aW9uCi0ldHlwZTx0c2VydmljZT4gIFNlcnZpY2UKLQotJXR5cGU8dGZ1bmN0aW9uPiBGdW5jdGlvbgotJXR5cGU8dHR5cGU+ICAgICBGdW5jdGlvblR5cGUKLSV0eXBlPHRzZXJ2aWNlPiAgRnVuY3Rpb25MaXN0Ci0KLSV0eXBlPHRzdHJ1Y3Q+ICAgVGhyb3dzCi0ldHlwZTx0c2VydmljZT4gIEV4dGVuZHMKLSV0eXBlPHRib29sPiAgICAgT25ld2F5Ci0ldHlwZTx0Ym9vbD4gICAgIFhzZEFsbAotJXR5cGU8dGJvb2w+ICAgICBYc2RPcHRpb25hbAotJXR5cGU8dGJvb2w+ICAgICBYc2ROaWxsYWJsZQotJXR5cGU8dHN0cnVjdD4gICBYc2RBdHRyaWJ1dGVzCi0ldHlwZTxpZD4gICAgICAgIENwcFR5cGUKLQotJXR5cGU8ZHRleHQ+ICAgICBDYXB0dXJlRG9jVGV4dAotCi0lJQotCi0vKioKLSAqIFRocmlmdCBHcmFtbWFyIEltcGxlbWVudGF0aW9uLgotICoKLSAqIEZvciB0aGUgbW9zdCBwYXJ0IHRoaXMgc291cmNlIGZpbGUgd29ya3MgaXRzIHdheSB0b3AgZG93biBmcm9tIHdoYXQgeW91Ci0gKiBtaWdodCBleHBlY3QgdG8gZmluZCBpbiBhIHR5cGljYWwgLnRocmlmdCBmaWxlLCBpLmUuIHR5cGUgZGVmaW5pdGlvbnMgYW5kCi0gKiBuYW1lc3BhY2VzIHVwIHRvcCBmb2xsb3dlZCBieSBzZXJ2aWNlIGRlZmluaXRpb25zIHVzaW5nIHRob3NlIHR5cGVzLgotICovCi0KLVByb2dyYW06Ci0gIEhlYWRlckxpc3QgRGVmaW5pdGlvbkxpc3QKLSAgICB7Ci0gICAgICBwZGVidWcoIlByb2dyYW0gLT4gSGVhZGVycyBEZWZpbml0aW9uTGlzdCIpOwotICAgICAgaWYoKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSAhPSBOVUxMKSAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzICE9IEFMUkVBRFlfUFJPQ0VTU0VEKSkKLSAgICAgIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfZG9jKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSk7Ci0gICAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IEFMUkVBRFlfUFJPQ0VTU0VEOwotICAgICAgfQotICAgICAgY2xlYXJfZG9jdGV4dCgpOwotICAgIH0KLQotQ2FwdHVyZURvY1RleHQ6Ci0gICAgewotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgICQkID0gZ19kb2N0ZXh0OwotICAgICAgICBnX2RvY3RleHQgPSBOVUxMOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQgPSBOVUxMOwotICAgICAgfQotICAgIH0KLQotLyogVE9ETyhkcmVpc3MpOiBUcnkgdG8gRGVzdHJveURvY1RleHQgaW4gYWxsIHNvcnRzIG9yIHJhbmRvbSBwbGFjZXMuICovCi1EZXN0cm95RG9jVGV4dDoKLSAgICB7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgY2xlYXJfZG9jdGV4dCgpOwotICAgICAgfQotICAgIH0KLQotLyogV2UgaGF2ZSB0byBEZXN0cm95RG9jVGV4dCBoZXJlLCBvdGhlcndpc2UgaXQgY2F0Y2hlcyB0aGUgZG9jdGV4dAotICAgb24gdGhlIGZpcnN0IHJlYWwgZWxlbWVudC4gKi8KLUhlYWRlckxpc3Q6Ci0gIEhlYWRlckxpc3QgRGVzdHJveURvY1RleHQgSGVhZGVyCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXJMaXN0IC0+IEhlYWRlckxpc3QgSGVhZGVyIik7Ci0gICAgfQotfAotICAgIHsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyTGlzdCAtPiAiKTsKLSAgICB9Ci0KLUhlYWRlcjoKLSAgSW5jbHVkZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IEluY2x1ZGUiKTsKLSAgICB9Ci18IHRva19uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgkMiwgJDMpOwotICAgICAgfQotICAgIH0KLXwgdG9rX25hbWVzcGFjZSAnKicgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfbmFtZXNwYWNlICogdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCIqIiwgJDMpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfY3BwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInY3BwX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY3BwJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfY3BwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImNwcCIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci18IHRva19jcHBfaW5jbHVkZSB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jcHBfaW5jbHVkZSB0b2tfbGl0ZXJhbCIpOwotICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF9jcHBfaW5jbHVkZSgkMik7Ci0gICAgICB9Ci0gICAgfQotfCB0b2tfcGhwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIncGhwX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgcGhwJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfcGhwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInBocCIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3B5X21vZHVsZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIncHlfbW9kdWxlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBweScgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3B5X21vZHVsZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInB5IiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfcGVybF9wYWNrYWdlIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidwZXJsX3BhY2thZ2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHBlcmwnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19wZXJsX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInBlcmwiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19ydWJ5X25hbWVzcGFjZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIncnVieV9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHJiJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfcnVieV9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJyYiIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3NtYWxsdGFsa19jYXRlZ29yeSB0b2tfc3RfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInc21hbGx0YWxrX2NhdGVnb3J5JyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBzbWFsbHRhbGsuY2F0ZWdvcnknIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19zbWFsbHRhbGtfY2F0ZWdvcnkgdG9rX3N0X2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsuY2F0ZWdvcnkiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19zbWFsbHRhbGtfcHJlZml4IHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidzbWFsbHRhbGtfcHJlZml4JyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBzbWFsbHRhbGsucHJlZml4JyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfc21hbGx0YWxrX3ByZWZpeCB0b2tfaWRlbnRpZmllciIpOwotICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInNtYWxsdGFsay5wcmVmaXgiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19qYXZhX3BhY2thZ2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ2phdmFfcGFja2FnZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgamF2YScgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX2phdmFfcGFja2FnZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImphdmEiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19jb2NvYV9wcmVmaXggdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ2NvY29hX3ByZWZpeCcgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY29jb2EnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jb2NvYV9wcmVmaXggdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJjb2NvYSIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3hzZF9uYW1lc3BhY2UgdG9rX2xpdGVyYWwKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3hzZF9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHhzZCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3hzZF9uYW1lc3BhY2UgdG9rX2xpdGVyYWwiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJjb2NvYSIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX2NzaGFycF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgIHsKLSAgICAgcHdhcm5pbmcoMSwgIidjc2hhcnBfbmFtZXNwYWNlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBjc2hhcnAnIGluc3RlYWQiKTsKLSAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX2NzaGFycF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKLSAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJjc2hhcnAiLCAkMik7Ci0gICAgIH0KLSAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfZGVscGhpX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllcgotICAgewotICAgICBwd2FybmluZygxLCAiJ2RlbHBoaV9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIGRlbHBoaScgaW5zdGVhZCIpOwotICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfZGVscGhpX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciIpOwotICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOwotICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImRlbHBoaSIsICQyKTsKLSAgICAgfQotICAgfQotCi1JbmNsdWRlOgotICB0b2tfaW5jbHVkZSB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiSW5jbHVkZSAtPiB0b2tfaW5jbHVkZSB0b2tfbGl0ZXJhbCIpOwotICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gSU5DTFVERVMpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGluY2x1ZGVfZmlsZShzdGQ6OnN0cmluZygkMikpOwotICAgICAgICBpZiAoIXBhdGguZW1wdHkoKSkgewotICAgICAgICAgIGdfcHJvZ3JhbS0+YWRkX2luY2x1ZGUocGF0aCwgc3RkOjpzdHJpbmcoJDIpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotRGVmaW5pdGlvbkxpc3Q6Ci0gIERlZmluaXRpb25MaXN0IENhcHR1cmVEb2NUZXh0IERlZmluaXRpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIkRlZmluaXRpb25MaXN0IC0+IERlZmluaXRpb25MaXN0IERlZmluaXRpb24iKTsKLSAgICAgIGlmICgkMiAhPSBOVUxMICYmICQzICE9IE5VTEwpIHsKLSAgICAgICAgJDMtPnNldF9kb2MoJDIpOwotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkRlZmluaXRpb25MaXN0IC0+ICIpOwotICAgIH0KLQotRGVmaW5pdGlvbjoKLSAgQ29uc3QKLSAgICB7Ci0gICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gQ29uc3QiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF9jb25zdCgkMSk7Ci0gICAgICB9Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgVHlwZURlZmluaXRpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gVHlwZURlZmluaXRpb24iKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Njb3BlLT5hZGRfdHlwZSgkMS0+Z2V0X25hbWUoKSwgJDEpOwotICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgewotICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfdHlwZShnX3BhcmVudF9wcmVmaXggKyAkMS0+Z2V0X25hbWUoKSwgJDEpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghIGdfcHJvZ3JhbS0+aXNfdW5pcXVlX3R5cGVuYW1lKCQxKSkgewotICAgICAgICAgIHl5ZXJyb3IoIlR5cGUgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZC4iLCAkMS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgU2VydmljZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbiAtPiBTZXJ2aWNlIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19zY29wZS0+YWRkX3NlcnZpY2UoJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKLSAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX3NlcnZpY2UoZ19wYXJlbnRfcHJlZml4ICsgJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgfQotICAgICAgICBnX3Byb2dyYW0tPmFkZF9zZXJ2aWNlKCQxKTsKLSAgICAgICAgaWYgKCEgZ19wcm9ncmFtLT5pc191bmlxdWVfdHlwZW5hbWUoJDEpKSB7Ci0gICAgICAgICAgeXllcnJvcigiVHlwZSBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkLiIsICQxLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICQkID0gJDE7Ci0gICAgfQotCi1UeXBlRGVmaW5pdGlvbjoKLSAgVHlwZWRlZgotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gVHlwZWRlZiIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX3R5cGVkZWYoJDEpOwotICAgICAgfQotICAgIH0KLXwgRW51bQotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gRW51bSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX2VudW0oJDEpOwotICAgICAgfQotICAgIH0KLXwgU2VudW0KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFNlbnVtIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfdHlwZWRlZigkMSk7Ci0gICAgICB9Ci0gICAgfQotfCBTdHJ1Y3QKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFN0cnVjdCIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX3N0cnVjdCgkMSk7Ci0gICAgICB9Ci0gICAgfQotfCBYY2VwdGlvbgotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gWGNlcHRpb24iKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF94Y2VwdGlvbigkMSk7Ci0gICAgICB9Ci0gICAgfQotCi1Db21tYU9yU2VtaWNvbG9uT3B0aW9uYWw6Ci0gICcsJwotICAgIHt9Ci18ICc7JwotICAgIHt9Ci18Ci0gICAge30KLQotVHlwZWRlZjoKLSAgdG9rX3R5cGVkZWYgRmllbGRUeXBlIHRva19pZGVudGlmaWVyIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWYgLT4gdG9rX3R5cGVkZWYgRmllbGRUeXBlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDMpOwotICAgICAgdF90eXBlZGVmICp0ZCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkMiwgJDMpOwotICAgICAgJCQgPSB0ZDsKLSAgICAgIGlmICgkNCAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNC0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDQ7Ci0gICAgICB9Ci0gICAgfQotCi1FbnVtOgotICB0b2tfZW51bSB0b2tfaWRlbnRpZmllciAneycgRW51bURlZkxpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiRW51bSAtPiB0b2tfZW51bSB0b2tfaWRlbnRpZmllciB7IEVudW1EZWZMaXN0IH0iKTsKLSAgICAgICQkID0gJDQ7Ci0gICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOwotICAgICAgJCQtPnNldF9uYW1lKCQyKTsKLSAgICAgIGlmICgkNiAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDY7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG1ha2UgY29uc3RhbnRzIGZvciBhbGwgdGhlIGVudW0gdmFsdWVzCi0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gJCQtPmdldF9jb25zdGFudHMoKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICAgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3RfbmFtZSA9ICQkLT5nZXRfbmFtZSgpICsgIi4iICsgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0oJCQpOwotICAgICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudChjb25zdF9uYW1lLCBuZXcgdF9jb25zdChnX3R5cGVfaTMyLCAoKmNfaXRlciktPmdldF9uYW1lKCksIGNvbnN0X3ZhbCkpOwotICAgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX2NvbnN0YW50KGdfcGFyZW50X3ByZWZpeCArIGNvbnN0X25hbWUsIG5ldyB0X2NvbnN0KGdfdHlwZV9pMzIsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgY29uc3RfdmFsKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi1FbnVtRGVmTGlzdDoKLSAgRW51bURlZkxpc3QgRW51bURlZgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRW51bURlZkxpc3QgLT4gRW51bURlZkxpc3QgRW51bURlZiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hcHBlbmQoJDIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1EZWZMaXN0IC0+ICIpOwotICAgICAgJCQgPSBuZXcgdF9lbnVtKGdfcHJvZ3JhbSk7Ci0gICAgICB5X2VudW1fdmFsID0gLTE7Ci0gICAgfQotCi1FbnVtRGVmOgotICBDYXB0dXJlRG9jVGV4dCBFbnVtVmFsdWUgVHlwZUFubm90YXRpb25zIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRW51bURlZiAtPiBFbnVtVmFsdWUiKTsKLSAgICAgICQkID0gJDI7Ci0gICAgICBpZiAoJDEgIT0gTlVMTCkgewotICAgICAgICAkJC0+c2V0X2RvYygkMSk7Ci0gICAgICB9Ci0JICBpZiAoJDMgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDMtPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQzOwotICAgICAgfQotICAgIH0KLQotRW51bVZhbHVlOgotICB0b2tfaWRlbnRpZmllciAnPScgdG9rX2ludF9jb25zdGFudAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRW51bVZhbHVlIC0+IHRva19pZGVudGlmaWVyID0gdG9rX2ludF9jb25zdGFudCIpOwotICAgICAgaWYgKCQzIDwgSU5UMzJfTUlOIHx8ICQzID4gSU5UMzJfTUFYKSB7Ci0gICAgICAgIC8vIE5vdGU6IHRoaXMgdXNlZCB0byBiZSBqdXN0IGEgd2FybmluZy4gIEhvd2V2ZXIsIHNpbmNlIHRocmlmdCBhbHdheXMKLSAgICAgICAgLy8gdHJlYXRzIGVudW1zIGFzIGkzMiB2YWx1ZXMsIEknbSBjaGFuZ2luZyBpdCB0byBhIGZhdGFsIGVycm9yLgotICAgICAgICAvLyBJIGRvdWJ0IHRoaXMgd2lsbCBhZmZlY3QgbWFueSBwZW9wbGUsIGJ1dCB1c2VycyB3aG8gcnVuIGludG8gdGhpcwotICAgICAgICAvLyB3aWxsIGhhdmUgdG8gdXBkYXRlIHRoZWlyIHRocmlmdCBmaWxlcyB0byBtYW51YWxseSBzcGVjaWZ5IHRoZQotICAgICAgICAvLyB0cnVuY2F0ZWQgaTMyIHZhbHVlIHRoYXQgdGhyaWZ0IGhhcyBhbHdheXMgYmVlbiB1c2luZyBhbnl3YXkuCi0gICAgICAgIGZhaWx1cmUoIjY0LWJpdCB2YWx1ZSBzdXBwbGllZCBmb3IgZW51bSAlcyB3aWxsIGJlIHRydW5jYXRlZC4iLCAkMSk7Ci0gICAgICB9Ci0gICAgICB5X2VudW1fdmFsID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oJDMpOwotICAgICAgJCQgPSBuZXcgdF9lbnVtX3ZhbHVlKCQxLCB5X2VudW1fdmFsKTsKLSAgICB9Ci0gfAotICB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRW51bVZhbHVlIC0+IHRva19pZGVudGlmaWVyIik7Ci0gICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDEpOwotICAgICAgaWYgKHlfZW51bV92YWwgPT0gSU5UMzJfTUFYKSB7Ci0gICAgICAgIGZhaWx1cmUoImVudW0gdmFsdWUgb3ZlcmZsb3cgYXQgZW51bSAlcyIsICQxKTsKLSAgICAgIH0KLSAgICAgICsreV9lbnVtX3ZhbDsKLSAgICAgICQkID0gbmV3IHRfZW51bV92YWx1ZSgkMSwgeV9lbnVtX3ZhbCk7Ci0gICAgfQotCi1TZW51bToKLSAgdG9rX3NlbnVtIHRva19pZGVudGlmaWVyICd7JyBTZW51bURlZkxpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2VudW0gLT4gdG9rX3NlbnVtIHRva19pZGVudGlmaWVyIHsgU2VudW1EZWZMaXN0IH0iKTsKLSAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7Ci0gICAgICAkJCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkNCwgJDIpOwotICAgICAgaWYgKCQ2ICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ2LT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkNjsKLSAgICAgIH0KLSAgICB9Ci0KLVNlbnVtRGVmTGlzdDoKLSAgU2VudW1EZWZMaXN0IFNlbnVtRGVmCi0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZkxpc3QgLT4gU2VudW1EZWZMaXN0IFNlbnVtRGVmIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgJCQtPmFkZF9zdHJpbmdfZW51bV92YWwoJDIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIlNlbnVtRGVmTGlzdCAtPiAiKTsKLSAgICAgICQkID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOwotICAgICAgJCQtPnNldF9zdHJpbmdfZW51bSh0cnVlKTsKLSAgICB9Ci0KLVNlbnVtRGVmOgotICB0b2tfbGl0ZXJhbCBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIlNlbnVtRGVmIC0+IHRva19saXRlcmFsIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotQ29uc3Q6Ci0gIHRva19jb25zdCBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIgJz0nIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdCAtPiB0b2tfY29uc3QgRmllbGRUeXBlIHRva19pZGVudGlmaWVyID0gQ29uc3RWYWx1ZSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMyk7Ci0gICAgICAgIGdfc2NvcGUtPnJlc29sdmVfY29uc3RfdmFsdWUoJDUsICQyKTsKLSAgICAgICAgJCQgPSBuZXcgdF9jb25zdCgkMiwgJDMsICQ1KTsKLSAgICAgICAgdmFsaWRhdGVfY29uc3RfdHlwZSgkJCk7Ci0KLSAgICAgICAgZ19zY29wZS0+YWRkX2NvbnN0YW50KCQzLCAkJCk7Ci0gICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9jb25zdGFudChnX3BhcmVudF9wcmVmaXggKyAkMywgJCQpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotCi1Db25zdFZhbHVlOgotICB0b2tfaW50X2NvbnN0YW50Ci0gICAgewotICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19pbnRfY29uc3RhbnQiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKLSAgICAgICQkLT5zZXRfaW50ZWdlcigkMSk7Ci0gICAgICBpZiAoIWdfYWxsb3dfNjRiaXRfY29uc3RzICYmICgkMSA8IElOVDMyX01JTiB8fCAkMSA+IElOVDMyX01BWCkpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIjY0LWJpdCBjb25zdGFudCBcIiUiIFBSSWk2NCJcIiBtYXkgbm90IHdvcmsgaW4gYWxsIGxhbmd1YWdlcy5cbiIsICQxKTsKLSAgICAgIH0KLSAgICB9Ci18IHRva19kdWJfY29uc3RhbnQKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2R1Yl9jb25zdGFudCIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9kb3VibGUoJDEpOwotICAgIH0KLXwgdG9rX2xpdGVyYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2xpdGVyYWwiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoJDEpOwotICAgIH0KLXwgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKLSAgICAgICQkLT5zZXRfaWRlbnRpZmllcigkMSk7Ci0gICAgfQotfCBDb25zdExpc3QKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RMaXN0Iik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgQ29uc3RNYXAKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RNYXAiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotCi1Db25zdExpc3Q6Ci0gICdbJyBDb25zdExpc3RDb250ZW50cyAnXScKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TGlzdCA9PiBbIENvbnN0TGlzdENvbnRlbnRzIF0iKTsKLSAgICAgICQkID0gJDI7Ci0gICAgfQotCi1Db25zdExpc3RDb250ZW50czoKLSAgQ29uc3RMaXN0Q29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TGlzdENvbnRlbnRzID0+IENvbnN0TGlzdENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgJCQtPmFkZF9saXN0KCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJDb25zdExpc3RDb250ZW50cyA9PiIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9saXN0KCk7Ci0gICAgfQotCi1Db25zdE1hcDoKLSAgJ3snIENvbnN0TWFwQ29udGVudHMgJ30nCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdE1hcCA9PiB7IENvbnN0TWFwQ29udGVudHMgfSIpOwotICAgICAgJCQgPSAkMjsKLSAgICB9Ci0KLUNvbnN0TWFwQ29udGVudHM6Ci0gIENvbnN0TWFwQ29udGVudHMgQ29uc3RWYWx1ZSAnOicgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TWFwQ29udGVudHMgPT4gQ29uc3RNYXBDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbCIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hZGRfbWFwKCQyLCAkNCk7Ci0gICAgfQotfAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RNYXBDb250ZW50cyA9PiIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9tYXAoKTsKLSAgICB9Ci0KLVN0cnVjdEhlYWQ6Ci0gIHRva19zdHJ1Y3QKLSAgICB7Ci0gICAgICAkJCA9IHN0cnVjdF9pc19zdHJ1Y3Q7Ci0gICAgfQotfCB0b2tfdW5pb24KLSAgICB7Ci0gICAgICAkJCA9IHN0cnVjdF9pc191bmlvbjsKLSAgICB9Ci0KLVN0cnVjdDoKLSAgU3RydWN0SGVhZCB0b2tfaWRlbnRpZmllciBYc2RBbGwgJ3snIEZpZWxkTGlzdCAnfScgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJTdHJ1Y3QgLT4gdG9rX3N0cnVjdCB0b2tfaWRlbnRpZmllciB7IEZpZWxkTGlzdCB9Iik7Ci0gICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOwotICAgICAgJDUtPnNldF94c2RfYWxsKCQzKTsKLSAgICAgICQ1LT5zZXRfdW5pb24oJDEgPT0gc3RydWN0X2lzX3VuaW9uKTsKLSAgICAgICQkID0gJDU7Ci0gICAgICAkJC0+c2V0X25hbWUoJDIpOwotICAgICAgaWYgKCQ3ICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ3LT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkNzsKLSAgICAgIH0KLSAgICB9Ci0KLVhzZEFsbDoKLSAgdG9rX3hzZF9hbGwKLSAgICB7Ci0gICAgICAkJCA9IHRydWU7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gZmFsc2U7Ci0gICAgfQotCi1Yc2RPcHRpb25hbDoKLSAgdG9rX3hzZF9vcHRpb25hbAotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBmYWxzZTsKLSAgICB9Ci0KLVhzZE5pbGxhYmxlOgotICB0b2tfeHNkX25pbGxhYmxlCi0gICAgewotICAgICAgJCQgPSB0cnVlOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IGZhbHNlOwotICAgIH0KLQotWHNkQXR0cmlidXRlczoKLSAgdG9rX3hzZF9hdHRycyAneycgRmllbGRMaXN0ICd9JwotICAgIHsKLSAgICAgICQkID0gJDM7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLVhjZXB0aW9uOgotICB0b2tfeGNlcHRpb24gdG9rX2lkZW50aWZpZXIgJ3snIEZpZWxkTGlzdCAnfScgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJYY2VwdGlvbiAtPiB0b2tfeGNlcHRpb24gdG9rX2lkZW50aWZpZXIgeyBGaWVsZExpc3QgfSIpOwotICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKLSAgICAgICQ0LT5zZXRfbmFtZSgkMik7Ci0gICAgICAkNC0+c2V0X3hjZXB0aW9uKHRydWUpOwotICAgICAgJCQgPSAkNDsKLSAgICAgIGlmICgkNiAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDY7Ci0gICAgICB9Ci0gICAgfQotCi1TZXJ2aWNlOgotICB0b2tfc2VydmljZSB0b2tfaWRlbnRpZmllciBFeHRlbmRzICd7JyBGbGFnQXJncyBGdW5jdGlvbkxpc3QgVW5mbGFnQXJncyAnfScgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJTZXJ2aWNlIC0+IHRva19zZXJ2aWNlIHRva19pZGVudGlmaWVyIHsgRnVuY3Rpb25MaXN0IH0iKTsKLSAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7Ci0gICAgICAkJCA9ICQ2OwotICAgICAgJCQtPnNldF9uYW1lKCQyKTsKLSAgICAgICQkLT5zZXRfZXh0ZW5kcygkMyk7Ci0gICAgICBpZiAoJDkgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDktPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQ5OwotICAgICAgfQotICAgIH0KLQotRmxhZ0FyZ3M6Ci0gICAgewotICAgICAgIGdfYXJnbGlzdCA9IDE7Ci0gICAgfQotCi1VbmZsYWdBcmdzOgotICAgIHsKLSAgICAgICBnX2FyZ2xpc3QgPSAwOwotICAgIH0KLQotRXh0ZW5kczoKLSAgdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkV4dGVuZHMgLT4gdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgICQkID0gTlVMTDsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF9zZXJ2aWNlKCQyKTsKLSAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKLSAgICAgICAgICB5eWVycm9yKCJTZXJ2aWNlIFwiJXNcIiBoYXMgbm90IGJlZW4gZGVmaW5lZC4iLCAkMik7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgfQotCi1GdW5jdGlvbkxpc3Q6Ci0gIEZ1bmN0aW9uTGlzdCBGdW5jdGlvbgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRnVuY3Rpb25MaXN0IC0+IEZ1bmN0aW9uTGlzdCBGdW5jdGlvbiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQxLT5hZGRfZnVuY3Rpb24oJDIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uTGlzdCAtPiAiKTsKLSAgICAgICQkID0gbmV3IHRfc2VydmljZShnX3Byb2dyYW0pOwotICAgIH0KLQotRnVuY3Rpb246Ci0gIENhcHR1cmVEb2NUZXh0IE9uZXdheSBGdW5jdGlvblR5cGUgdG9rX2lkZW50aWZpZXIgJygnIEZpZWxkTGlzdCAnKScgVGhyb3dzIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDQpOwotICAgICAgJDYtPnNldF9uYW1lKHN0ZDo6c3RyaW5nKCQ0KSArICJfYXJncyIpOwotICAgICAgJCQgPSBuZXcgdF9mdW5jdGlvbigkMywgJDQsICQ2LCAkOCwgJDIpOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotICAgICAgaWYgKCQ5ICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ5LT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkOTsKLSAgICAgIH0KLSAgICB9Ci0KLU9uZXdheToKLSAgdG9rX29uZXdheQotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBmYWxzZTsKLSAgICB9Ci0KLVRocm93czoKLSAgdG9rX3Rocm93cyAnKCcgRmllbGRMaXN0ICcpJwotICAgIHsKLSAgICAgIHBkZWJ1ZygiVGhyb3dzIC0+IHRva190aHJvd3MgKCBGaWVsZExpc3QgKSIpOwotICAgICAgJCQgPSAkMzsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSAmJiAhdmFsaWRhdGVfdGhyb3dzKCQkKSkgewotICAgICAgICB5eWVycm9yKCJUaHJvd3MgY2xhdXNlIG1heSBub3QgY29udGFpbiBub24tZXhjZXB0aW9uIHR5cGVzIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1GaWVsZExpc3Q6Ci0gIEZpZWxkTGlzdCBGaWVsZAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRMaXN0IC0+IEZpZWxkTGlzdCAsIEZpZWxkIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgaWYgKCEoJCQtPmFwcGVuZCgkMikpKSB7Ci0gICAgICAgIHl5ZXJyb3IoIlwiJWQ6ICVzXCIgLSBmaWVsZCBpZGVudGlmaWVyL25hbWUgaGFzIGFscmVhZHkgYmVlbiB1c2VkIiwgJDItPmdldF9rZXkoKSwgJDItPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRMaXN0IC0+ICIpOwotICAgICAgeV9maWVsZF92YWwgPSAtMTsKLSAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1GaWVsZDoKLSAgQ2FwdHVyZURvY1RleHQgRmllbGRJZGVudGlmaWVyIEZpZWxkUmVxdWlyZWRuZXNzIEZpZWxkVHlwZSBGaWVsZFJlZmVyZW5jZSB0b2tfaWRlbnRpZmllciBGaWVsZFZhbHVlIFhzZE9wdGlvbmFsIFhzZE5pbGxhYmxlIFhzZEF0dHJpYnV0ZXMgVHlwZUFubm90YXRpb25zIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgIHBkZWJ1ZygidG9rX2ludF9jb25zdGFudCA6IEZpZWxkIC0+IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKCQyLmF1dG9fYXNzaWduZWQpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIk5vIGZpZWxkIGtleSBzcGVjaWZpZWQgZm9yICVzLCByZXN1bHRpbmcgcHJvdG9jb2wgbWF5IGhhdmUgY29uZmxpY3RzIG9yIG5vdCBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSFcbiIsICQ2KTsKLSAgICAgICAgaWYgKGdfc3RyaWN0ID49IDE5MikgewotICAgICAgICAgIHl5ZXJyb3IoIkltcGxpY2l0IGZpZWxkIGtleXMgYXJlIGRlcHJlY2F0ZWQgYW5kIG5vdCBhbGxvd2VkIHdpdGggLXN0cmljdCIpOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCQ2KTsKLSAgICAgICQkID0gbmV3IHRfZmllbGQoJDQsICQ2LCAkMi52YWx1ZSk7Ci0gICAgICAkJC0+c2V0X3JlZmVyZW5jZSgkNSk7Ci0gICAgICAkJC0+c2V0X3JlcSgkMyk7Ci0gICAgICBpZiAoJDcgIT0gTlVMTCkgewotICAgICAgICBnX3Njb3BlLT5yZXNvbHZlX2NvbnN0X3ZhbHVlKCQ3LCAkNCk7Ci0gICAgICAgIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKCQkLCAkNyk7Ci0gICAgICAgICQkLT5zZXRfdmFsdWUoJDcpOwotICAgICAgfQotICAgICAgJCQtPnNldF94c2Rfb3B0aW9uYWwoJDgpOwotICAgICAgJCQtPnNldF94c2RfbmlsbGFibGUoJDkpOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotICAgICAgaWYgKCQxMCAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfeHNkX2F0dHJzKCQxMCk7Ci0gICAgICB9Ci0gICAgICBpZiAoJDExICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQxMS0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDExOwotICAgICAgfQotICAgIH0KLQotRmllbGRJZGVudGlmaWVyOgotICB0b2tfaW50X2NvbnN0YW50ICc6JwotICAgIHsKLSAgICAgIGlmICgkMSA8PSAwKSB7Ci0gICAgICAgIGlmIChnX2FsbG93X25lZ19maWVsZF9rZXlzKSB7Ci0gICAgICAgICAgLyoKLSAgICAgICAgICAgKiBnX2FsbG93X25lZ19maWVsZF9rZXlzIGV4aXN0cyB0byBhbGxvdyB1c2VycyB0byBhZGQgZXhwbGljaXRseQotICAgICAgICAgICAqIHNwZWNpZmllZCBrZXkgdmFsdWVzIHRvIG9sZCAudGhyaWZ0IGZpbGVzIHdpdGhvdXQgYnJlYWtpbmcKLSAgICAgICAgICAgKiBwcm90b2NvbCBjb21wYXRpYmlsaXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIGlmICgkMSAhPSB5X2ZpZWxkX3ZhbCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIHdhcm4gaWYgdGhlIHVzZXItc3BlY2lmaWVkIG5lZ2F0aXZlIHZhbHVlIGlzbid0IHdoYXQKLSAgICAgICAgICAgICAqIHRocmlmdCB3b3VsZCBoYXZlIGF1dG8tYXNzaWduZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB3YXJuaW5nKDEsICJOb25wb3NpdGl2ZSBmaWVsZCBrZXkgKCUiIFBSSWk2NCIpIGRpZmZlcnMgZnJvbSB3aGF0IHdvdWxkIGJlICIKLSAgICAgICAgICAgICAgICAgICAgICJhdXRvLWFzc2lnbmVkIGJ5IHRocmlmdCAoJWQpLlxuIiwgJDEsIHlfZmllbGRfdmFsKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLyoKLSAgICAgICAgICAgKiBMZWF2ZSAkMSBhcy1pcywgYW5kIHVwZGF0ZSB5X2ZpZWxkX3ZhbCB0byBiZSBvbmUgbGVzcyB0aGFuICQxLgotICAgICAgICAgICAqIFRoZSBGaWVsZExpc3QgcGFyc2luZyB3aWxsIGNhdGNoIGFueSBkdXBsaWNhdGUga2V5IHZhbHVlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICB5X2ZpZWxkX3ZhbCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQxIC0gMSk7Ci0gICAgICAgICAgJCQudmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMSk7Ci0gICAgICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHB3YXJuaW5nKDEsICJOb25wb3NpdGl2ZSB2YWx1ZSAoJWQpIG5vdCBhbGxvd2VkIGFzIGEgZmllbGQga2V5LlxuIiwKLSAgICAgICAgICAgICAgICAgICAkMSk7Ci0gICAgICAgICAgJCQudmFsdWUgPSB5X2ZpZWxkX3ZhbC0tOwotICAgICAgICAgICQkLmF1dG9fYXNzaWduZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJC52YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQxKTsKLSAgICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJC52YWx1ZSA9IHlfZmllbGRfdmFsLS07Ci0gICAgICAkJC5hdXRvX2Fzc2lnbmVkID0gdHJ1ZTsKLSAgICB9Ci0KLUZpZWxkUmVmZXJlbmNlOgotICB0b2tfcmVmZXJlbmNlCi0gICAgewotICAgICAgJCQgPSB0cnVlOwotICAgIH0KLXwKLSAgIHsKLSAgICAgJCQgPSBmYWxzZTsKLSAgIH0KLQotRmllbGRSZXF1aXJlZG5lc3M6Ci0gIHRva19yZXF1aXJlZAotICAgIHsKLSAgICAgICQkID0gdF9maWVsZDo6VF9SRVFVSVJFRDsKLSAgICB9Ci18IHRva19vcHRpb25hbAotICAgIHsKLSAgICAgIGlmIChnX2FyZ2xpc3QpIHsKLSAgICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgICAgcHdhcm5pbmcoMSwgIm9wdGlvbmFsIGtleXdvcmQgaXMgaWdub3JlZCBpbiBhcmd1bWVudCBsaXN0cy5cbiIpOwotICAgICAgICB9Ci0gICAgICAgICQkID0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICQkID0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOwotICAgIH0KLQotRmllbGRWYWx1ZToKLSAgJz0nIENvbnN0VmFsdWUKLSAgICB7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgJCQgPSAkMjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICQkID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBOVUxMOwotICAgIH0KLQotRnVuY3Rpb25UeXBlOgotICBGaWVsZFR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uVHlwZSAtPiBGaWVsZFR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotfCB0b2tfdm9pZAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRnVuY3Rpb25UeXBlIC0+IHRva192b2lkIik7Ci0gICAgICAkJCA9IGdfdHlwZV92b2lkOwotICAgIH0KLQotRmllbGRUeXBlOgotICB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IElOQ0xVREVTKSB7Ci0gICAgICAgIC8vIElnbm9yZSBpZGVudGlmaWVycyBpbiBpbmNsdWRlIG1vZGUKLSAgICAgICAgJCQgPSBOVUxMOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTG9va3VwIHRoZSBpZGVudGlmaWVyIGluIHRoZSBjdXJyZW50IHNjb3BlCi0gICAgICAgICQkID0gZ19zY29wZS0+Z2V0X3R5cGUoJDEpOwotICAgICAgICBpZiAoJCQgPT0gTlVMTCkgewotICAgICAgICAgIC8qCi0gICAgICAgICAgICogRWl0aGVyIHRoaXMgdHlwZSBpc24ndCB5ZXQgZGVjbGFyZWQsIG9yIGl0J3MgbmV2ZXIKLSAgICAgICAgICAgICBkZWNsYXJlZC4gIEVpdGhlciB3YXkgYWxsb3cgaXQgYW5kIHdlJ2xsIGZpZ3VyZSBpdCBvdXQKLSAgICAgICAgICAgICBkdXJpbmcgZ2VuZXJhdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICAkJCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkMSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci18IEJhc2VUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJGaWVsZFR5cGUgLT4gQmFzZVR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotfCBDb250YWluZXJUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJGaWVsZFR5cGUgLT4gQ29udGFpbmVyVHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLUJhc2VUeXBlOiBTaW1wbGVCYXNlVHlwZSBUeXBlQW5ub3RhdGlvbnMKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IFNpbXBsZUJhc2VUeXBlIFR5cGVBbm5vdGF0aW9ucyIpOwotICAgICAgaWYgKCQyICE9IE5VTEwpIHsKLSAgICAgICAgJCQgPSBuZXcgdF9iYXNlX3R5cGUoKnN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4oJDEpKTsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQyLT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkMjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICQkID0gJDE7Ci0gICAgICB9Ci0gICAgfQotCi1TaW1wbGVCYXNlVHlwZToKLSAgdG9rX3N0cmluZwotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX3N0cmluZyIpOwotICAgICAgJCQgPSBnX3R5cGVfc3RyaW5nOwotICAgIH0KLXwgdG9rX2JpbmFyeQotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2JpbmFyeSIpOwotICAgICAgJCQgPSBnX3R5cGVfYmluYXJ5OwotICAgIH0KLXwgdG9rX3NsaXN0Ci0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfc2xpc3QiKTsKLSAgICAgICQkID0gZ190eXBlX3NsaXN0OwotICAgIH0KLXwgdG9rX2Jvb2wKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19ib29sIik7Ci0gICAgICAkJCA9IGdfdHlwZV9ib29sOwotICAgIH0KLXwgdG9rX2J5dGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19ieXRlIik7Ci0gICAgICAkJCA9IGdfdHlwZV9ieXRlOwotICAgIH0KLXwgdG9rX2kxNgotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2kxNiIpOwotICAgICAgJCQgPSBnX3R5cGVfaTE2OwotICAgIH0KLXwgdG9rX2kzMgotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2kzMiIpOwotICAgICAgJCQgPSBnX3R5cGVfaTMyOwotICAgIH0KLXwgdG9rX2k2NAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2k2NCIpOwotICAgICAgJCQgPSBnX3R5cGVfaTY0OwotICAgIH0KLXwgdG9rX2RvdWJsZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2RvdWJsZSIpOwotICAgICAgJCQgPSBnX3R5cGVfZG91YmxlOwotICAgIH0KLQotQ29udGFpbmVyVHlwZTogU2ltcGxlQ29udGFpbmVyVHlwZSBUeXBlQW5ub3RhdGlvbnMKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnRhaW5lclR5cGUgLT4gU2ltcGxlQ29udGFpbmVyVHlwZSBUeXBlQW5ub3RhdGlvbnMiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDItPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQyOwotICAgICAgfQotICAgIH0KLQotU2ltcGxlQ29udGFpbmVyVHlwZToKLSAgTWFwVHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBNYXBUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgU2V0VHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBTZXRUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgTGlzdFR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gTGlzdFR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotCi1NYXBUeXBlOgotICB0b2tfbWFwIENwcFR5cGUgJzwnIEZpZWxkVHlwZSAnLCcgRmllbGRUeXBlICc+JwotICAgIHsKLSAgICAgIHBkZWJ1ZygiTWFwVHlwZSAtPiB0b2tfbWFwIDxGaWVsZFR5cGUsIEZpZWxkVHlwZT4iKTsKLSAgICAgICQkID0gbmV3IHRfbWFwKCQ0LCAkNik7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCkgewotICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkMikpOwotICAgICAgfQotICAgIH0KLQotU2V0VHlwZToKLSAgdG9rX3NldCBDcHBUeXBlICc8JyBGaWVsZFR5cGUgJz4nCi0gICAgewotICAgICAgcGRlYnVnKCJTZXRUeXBlIC0+IHRva19zZXQ8RmllbGRUeXBlPiIpOwotICAgICAgJCQgPSBuZXcgdF9zZXQoJDQpOwotICAgICAgaWYgKCQyICE9IE5VTEwpIHsKLSAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDIpKTsKLSAgICAgIH0KLSAgICB9Ci0KLUxpc3RUeXBlOgotICB0b2tfbGlzdCAnPCcgRmllbGRUeXBlICc+JyBDcHBUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJMaXN0VHlwZSAtPiB0b2tfbGlzdDxGaWVsZFR5cGU+Iik7Ci0gICAgICBjaGVja19mb3JfbGlzdF9vZl9ieXRlcygkMyk7Ci0gICAgICAkJCA9IG5ldyB0X2xpc3QoJDMpOwotICAgICAgaWYgKCQ1ICE9IE5VTEwpIHsKLSAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDUpKTsKLSAgICAgIH0KLSAgICB9Ci0KLUNwcFR5cGU6Ci0gIHRva19jcHBfdHlwZSB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgICQkID0gJDI7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLVR5cGVBbm5vdGF0aW9uczoKLSAgJygnIFR5cGVBbm5vdGF0aW9uTGlzdCAnKScKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9ucyAtPiAoIFR5cGVBbm5vdGF0aW9uTGlzdCApIik7Ci0gICAgICAkJCA9ICQyOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgfQotCi1UeXBlQW5ub3RhdGlvbkxpc3Q6Ci0gIFR5cGVBbm5vdGF0aW9uTGlzdCBUeXBlQW5ub3RhdGlvbgotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25MaXN0IC0+IFR5cGVBbm5vdGF0aW9uTGlzdCAsIFR5cGVBbm5vdGF0aW9uIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgJCQtPmFubm90YXRpb25zX1skMi0+a2V5XSA9ICQyLT52YWw7Ci0gICAgICBkZWxldGUgJDI7Ci0gICAgfQotfAotICAgIHsKLSAgICAgIC8qIEp1c3QgdXNlIGEgZHVtbXkgc3RydWN0dXJlIHRvIGhvbGQgdGhlIGFubm90YXRpb25zLiAqLwotICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKLSAgICB9Ci0KLVR5cGVBbm5vdGF0aW9uOgotICB0b2tfaWRlbnRpZmllciBUeXBlQW5ub3RhdGlvblZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb24gLT4gVHlwZUFubm90YXRpb25WYWx1ZSIpOwotICAgICAgJCQgPSBuZXcgdF9hbm5vdGF0aW9uOwotICAgICAgJCQtPmtleSA9ICQxOwotICAgICAgJCQtPnZhbCA9ICQyOwotICAgIH0KLQotVHlwZUFubm90YXRpb25WYWx1ZToKLSAgJz0nIHRva19saXRlcmFsCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvblZhbHVlIC0+ID0gdG9rX2xpdGVyYWwiKTsKLSAgICAgICQkID0gJDI7Ci0gICAgfQotfAotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25WYWx1ZSAtPiIpOwotICAgICAgJCQgPSBzdHJkdXAoIjEiKTsKLSAgICB9Ci0KLSUlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3dpbmRvd3MvY29uZmlnLmggYi9jb21waWxlci9jcHAvc3JjL3dpbmRvd3MvY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MDAwODAuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy93aW5kb3dzL2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8KLSNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX0NPTkZJR19IXyAxCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQotI3ByYWdtYSBvbmNlCi0jZW5kaWYgLy8gX01TQ19WRVIKLQotI2lmbmRlZiBfV0lOMzIKLSNlcnJvciAiVGhpcyBpcyBhIFdpbmRvd3MgaGVhZGVyIG9ubHkiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0KLSNkZWZpbmUgc3RydG9sbChiZWdpbl9wdHIsIGVuZF9wdHIsIGxlbmd0aCkgX3N0cnRvaTY0KGJlZ2luX3B0ciwgZW5kX3B0ciwgbGVuZ3RoKQotCi0jZGVmaW5lIFBSSXU2NCAiSTY0ZCIKLSNkZWZpbmUgUFJJaTY0ICJJNjRkIgotCi0vLyBzcXVlbGNoIGRlcHJlY2F0aW9uIHdhcm5pbmdzCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ5OTYpCi0vLyBzcXVlbGNoIGJvb2wgY29udmVyc2lvbiBwZXJmb3JtYW5jZSB3YXJuaW5nCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ4MDApCi0KLSNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3dpbmRvd3MvdmVyc2lvbi5oLmluIGIvY29tcGlsZXIvY3BwL3NyYy93aW5kb3dzL3ZlcnNpb24uaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlYmNhNi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3dpbmRvd3MvdmVyc2lvbi5oLmluCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfV0lORE9XU19WRVJTSU9OX0hfCi0jZGVmaW5lIF9USFJJRlRfV0lORE9XU19WRVJTSU9OX0hfIDEKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDEyMDApCi0jcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBfTVNDX1ZFUgotCi0jaWZuZGVmIF9XSU4zMgotI2Vycm9yICJUaGlzIGlzIGEgV2luZG93cyBoZWFkZXIgb25seSIKLSNlbmRpZgotCi0jZGVmaW5lIFRIUklGVF9WRVJTSU9OICJAUEFDS0FHRV9WRVJTSU9OQCIKLQotI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19WRVJTSU9OX0hfCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL2NvbXBpbGVyL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzdlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDQzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBVbml0IHRlc3RzIGZvciB0aGUgY29tcGlsZXIgc3RpbGwgcmVxdWlyZSBib29zdAoraW5jbHVkZShCb29zdE1hY3JvcykKK1JFUVVJUkVfQk9PU1RfSEVBREVSUygpCitzZXQoQk9PU1RfQ09NUE9ORU5UUyB1bml0X3Rlc3RfZnJhbWV3b3JrKQorUkVRVUlSRV9CT09TVF9MSUJSQVJJRVMoQk9PU1RfQ09NUE9ORU5UUykKKworZmlsZShHTE9CIEtFWVdPUkRfU0FNUExFUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2tleXdvcmQtc2FtcGxlcy8qLnRocmlmdCIpCitmb3JlYWNoKExBTkcgJHt0aHJpZnRfY29tcGlsZXJfTEFOR1N9KQorICAgIGZvcmVhY2goU0FNUExFICR7S0VZV09SRF9TQU1QTEVTfSkKKyAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChGSUxFTkFNRSAke1NBTVBMRX0gTkFNRV9XRSkKKyAgICAgICAgYWRkX3Rlc3QoTkFNRSAiJHtMQU5HfV8ke0ZJTEVOQU1FfSIKKyAgICAgICAgICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuICR7TEFOR30gJHtTQU1QTEV9KQorICAgICAgICBzZXRfdGVzdHNfcHJvcGVydGllcygiJHtMQU5HfV8ke0ZJTEVOQU1FfSIgUFJPUEVSVElFUworICAgICAgICAgICAgUEFTU19SRUdVTEFSX0VYUFJFU1NJT04gIkNhbm5vdCB1c2UgcmVzZXJ2ZWQgbGFuZ3VhZ2Uga2V5d29yZCIpCisgICAgZW5kZm9yZWFjaCgpCitlbmRmb3JlYWNoKCkKKworCitmaW5kX3BhY2thZ2UoUHl0aG9uSW50ZXJwIFFVSUVUKQoraWYoUFlUSE9OSU5URVJQX0ZPVU5EKQorICBhZGRfdGVzdChOQU1FIFN0YWxlbmVzc0NoZWNrVGVzdCBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb21waWxlci9zdGFsZW5lc3NfY2hlY2sucHkgJHtUSFJJRlRfQ09NUElMRVJ9KQorZWxzZSgpCisgIG1lc3NhZ2UoV0FSTklORyAiU2tpcHBpbmcgU3RhbGVuZXNzQ2hlY2tUZXN0IGFzIHRoZXJlIGlzIG5vIHB5dGhvbiBpbnRlcnByZXRlciBhdmFpbGFibGUuIikKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlLmFtIGIvY29tcGlsZXIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyNTgzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIworIyBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorIyBkZXRhaWxzLgorCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCisKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC9zcmMKK0FNX0xERkxBR1MgPSAkKEJPT1NUX0xERkxBR1MpCitBTV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9iaW5jYXQuc2ggYi9jb21waWxlci9jcHAvdGVzdC9iaW5jYXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzdmOTA3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2JpbmNhdC5zaApAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9iYXNoCisKK2V4ZWMgL2Jpbi9jYXQKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGVkLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGVkLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTg0YWI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkZWQudGhyaWZ0CkBAIC0wLDAgKzEsMTggQEAKK2NvbnN0IHN0cmluZyBmb28gPSAiYmFyIgorCitzdHJ1Y3QgYV9zdHJ1Y3QgeworICAxOiBib29sIGltX3RydWUsCisgIDI6IGJvb2wgaW1fZmFsc2UsCisgIDM6IGk4IGFfYml0ZSwKKyAgNDogaTE2IGludGVnZXIxNiwKKyAgNTogaTMyIGludGVnZXIzMiwKKyAgNjogaTY0IGludGVnZXI2NCwKKyAgNzogZG91YmxlIGRvdWJsZV9wcmVjaXNpb24sCisgIDg6IHN0cmluZyBzb21lX2NoYXJhY3RlcnMsCisgIDk6IHN0cmluZyB6b21nX3VuaWNvZGUsCisgIDEwOiBib29sIHdoYXRfd2hvLAorfQorCitzZXJ2aWNlIEFTZXJ2aWNlIHsKKyAgaTMyIGFfcHJvY2VkdXJlKDE6IGkzMiBhcmcpCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRpbmcudGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkaW5nLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzdhZjdiCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkaW5nLnRocmlmdApAQCAtMCwwICsxLDcgQEAKK2luY2x1ZGUgIkluY2x1ZGVkLnRocmlmdCIKKworY29uc3Qgc3RyaW5nIHMgPSAic3RyaW5nIgorCitzdHJ1Y3QgQlN0cnVjdCB7CisgIDE6IEluY2x1ZGVkLmFfc3RydWN0IG9uZV9vZl9lYWNoCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9TaW5nbGUudGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvU2luZ2xlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWMzMDFmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvU2luZ2xlLnRocmlmdApAQCAtMCwwICsxIEBACitjb25zdCBzdHJpbmcgZm9vID0gImJhciIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL3N0YWxlbmVzc19jaGVjay5weSBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL3N0YWxlbmVzc19jaGVjay5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YjExZGZmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5CkBAIC0wLDAgKzEsMTQyIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIFRlc3RTdGFsZW5lc3NDaGVjayh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBDVVJSRU5UX0RJUl9QQVRIID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKQorICAgIFRIUklGVF9FWEVDVVRBQkxFX1BBVEggPSBOb25lCisgICAgU0lOR0xFX1RIUklGVF9GSUxFX1BBVEggPSBvcy5wYXRoLmpvaW4oQ1VSUkVOVF9ESVJfUEFUSCwgIlNpbmdsZS50aHJpZnQiKQorICAgIElOQ0xVRElOR19USFJJRlRfRklMRV9QQVRIID0gb3MucGF0aC5qb2luKENVUlJFTlRfRElSX1BBVEgsICJJbmNsdWRpbmcudGhyaWZ0IikKKyAgICBJTkNMVURFRF9USFJJRlRfRklMRV9QQVRIID0gb3MucGF0aC5qb2luKENVUlJFTlRfRElSX1BBVEgsICJJbmNsdWRlZC50aHJpZnQiKQorCisgICAgZGVmIHRlc3Rfc3RhbGVuZXNzX2NoZWNrX29mX3NpbmdsZV90aHJpZnRfZmlsZV93aXRob3V0X2NoYW5nZWRfb3V0cHV0KHNlbGYpOgorICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoZGlyPVRlc3RTdGFsZW5lc3NDaGVjay5DVVJSRU5UX0RJUl9QQVRIKQorCisgICAgICAgIGNvbW1hbmQgPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlRIUklGVF9FWEVDVVRBQkxFX1BBVEgsICItZ2VuIiwgImNwcCIsICItbyIsIHRlbXBfZGlyXQorICAgICAgICBjb21tYW5kICs9IFtUZXN0U3RhbGVuZXNzQ2hlY2suU0lOR0xFX1RIUklGVF9GSUxFX1BBVEhdCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIHVzZWRfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiZ2VuLWNwcCIsICJTaW5nbGVfY29uc3RhbnRzLmNwcCIpCisKKyAgICAgICAgZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKG9zLnBhdGguam9pbih1c2VkX2ZpbGVfcGF0aCkpCisKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZSh1c2VkX2ZpbGVfcGF0aCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlY29uZF9tb2RpZmljYXRpb25fdGltZSwgZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUpCisKKyAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wX2RpciwgaWdub3JlX2Vycm9ycz1UcnVlKQorCisgICAgZGVmIHRlc3Rfc3RhbGVuZXNzX2NoZWNrX29mX3NpbmdsZV90aHJpZnRfZmlsZV93aXRoX2NoYW5nZWRfb3V0cHV0KHNlbGYpOgorICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoZGlyPVRlc3RTdGFsZW5lc3NDaGVjay5DVVJSRU5UX0RJUl9QQVRIKQorCisgICAgICAgIGNvbW1hbmQgPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlRIUklGVF9FWEVDVVRBQkxFX1BBVEgsICItZ2VuIiwgImNwcCIsICItbyIsIHRlbXBfZGlyXQorICAgICAgICBjb21tYW5kICs9IFtUZXN0U3RhbGVuZXNzQ2hlY2suU0lOR0xFX1RIUklGVF9GSUxFX1BBVEhdCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIHVzZWRfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiZ2VuLWNwcCIsICJTaW5nbGVfY29uc3RhbnRzLmNwcCIpCisKKyAgICAgICAgZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKG9zLnBhdGguam9pbih1c2VkX2ZpbGVfcGF0aCkpCisgICAgICAgIHVzZWRfZmlsZSA9IG9wZW4odXNlZF9maWxlX3BhdGgsICJyIikKKyAgICAgICAgZmlyc3RfY29udGVudHMgPSB1c2VkX2ZpbGUucmVhZCgpCisgICAgICAgIHVzZWRfZmlsZS5jbG9zZSgpCisKKyAgICAgICAgdXNlZF9maWxlID0gb3Blbih1c2VkX2ZpbGVfcGF0aCwgImEiKQorICAgICAgICB1c2VkX2ZpbGUud3JpdGUoIlxuLyogVGhpcyBpcyBhIGNvbW1lbnQgKi9cbiIpCisgICAgICAgIHVzZWRfZmlsZS5jbG9zZSgpCisKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZSh1c2VkX2ZpbGVfcGF0aCkKKyAgICAgICAgdXNlZF9maWxlID0gb3Blbih1c2VkX2ZpbGVfcGF0aCwgInIiKQorICAgICAgICBzZWNvbmRfY29udGVudHMgPSB1c2VkX2ZpbGUucmVhZCgpCisgICAgICAgIHVzZWRfZmlsZS5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKHNlY29uZF9tb2RpZmljYXRpb25fdGltZSwgZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfY29udGVudHMsIHNlY29uZF9jb250ZW50cykKKworICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKyAgICBkZWYgdGVzdF9zdGFsZW5lc3NfY2hlY2tfb2ZfaW5jbHVkZWRfZmlsZShzZWxmKToKKyAgICAgICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKGRpcj1UZXN0U3RhbGVuZXNzQ2hlY2suQ1VSUkVOVF9ESVJfUEFUSCkKKworICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgIkluY2x1ZGVkLnRocmlmdCIpCisgICAgICAgIHRlbXBfaW5jbHVkaW5nX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgIkluY2x1ZGluZy50aHJpZnQiKQorCisgICAgICAgIHNodXRpbC5jb3B5MihUZXN0U3RhbGVuZXNzQ2hlY2suSU5DTFVERURfVEhSSUZUX0ZJTEVfUEFUSCwgdGVtcF9pbmNsdWRlZF9maWxlX3BhdGgpCisgICAgICAgIHNodXRpbC5jb3B5MihUZXN0U3RhbGVuZXNzQ2hlY2suSU5DTFVESU5HX1RIUklGVF9GSUxFX1BBVEgsIHRlbXBfaW5jbHVkaW5nX2ZpbGVfcGF0aCkKKworICAgICAgICBjb21tYW5kID0gW1Rlc3RTdGFsZW5lc3NDaGVjay5USFJJRlRfRVhFQ1VUQUJMRV9QQVRILCAiLWdlbiIsICJjcHAiLCAiLXJlY3Vyc2UiLCAiLW8iLCB0ZW1wX2Rpcl0KKyAgICAgICAgY29tbWFuZCArPSBbdGVtcF9pbmNsdWRpbmdfZmlsZV9wYXRoXQorCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiZ2VuLWNwcCIsICJJbmNsdWRlZF9jb25zdGFudHMuY3BwIikKKyAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiZ2VuLWNwcCIsICJJbmNsdWRpbmdfY29uc3RhbnRzLmNwcCIpCisKKyAgICAgICAgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maXJzdF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maWxlX3BhdGgpCisgICAgICAgIGluY2x1ZGluZ19jb25zdGFudHNfY3BwX2ZpcnN0X21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maWxlX3BhdGgpCisKKyAgICAgICAgdGVtcF9pbmNsdWRlZF9maWxlID0gb3Blbih0ZW1wX2luY2x1ZGVkX2ZpbGVfcGF0aCwgImEiKQorICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGUud3JpdGUoIlxuY29uc3QgaTMyIGFuX2ludGVnZXIgPSA0MlxuIikKKyAgICAgICAgdGVtcF9pbmNsdWRlZF9maWxlLmNsb3NlKCkKKworICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICBpbmNsdWRlZF9jb25zdGFudHNfY3BwX3NlY29uZF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maWxlX3BhdGgpCisgICAgICAgIGluY2x1ZGluZ19jb25zdGFudHNfY3BwX3NlY29uZF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcigKKyAgICAgICAgICAgIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lLCBpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpcnN0X21vZGlmaWNhdGlvbl90aW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUsIGluY2x1ZGluZ19jb25zdGFudHNfY3BwX3NlY29uZF9tb2RpZmljYXRpb25fdGltZSkKKworICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0U3RhbGVuZXNzQ2hlY2spKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgIyBUaGUgcGF0aCBvZiBUaHJpZnQgY29tcGlsZXIgIGlzICBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIHRlc3Qgc2NyaXB0LgorICAgICMgUmVtb3ZlIGl0IHRvIG5vdCBjb25mdXNlIHRoZSB1bml0IHRlc3RpbmcgZnJhbWV3b3JrCisgICAgVGVzdFN0YWxlbmVzc0NoZWNrLlRIUklGVF9FWEVDVVRBQkxFX1BBVEggPSBzeXMuYXJndlstMV0KKyAgICBkZWwgc3lzLmFyZ3ZbLTFdCisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9jb25zdDFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9jb25zdDFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzVlNGFjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2NvbnN0MV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK2NvbnN0IGJvb2wgcmV0dXJuID0gMApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0xX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDgzNGUxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0xX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwyIEBACitlbnVtIHJldHVybiB7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMl9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyY2FhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK2VudW0gZW51bV9uYW1lIHsKKyAgcmV0dXJuCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWRiMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACitleGNlcHRpb24gcmV0dXJuIHt9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTNjMzUyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK2V4Y2VwdGlvbiBleGNlcHRpb25fbmFtZSB7CisgIDE6IHJlcXVpcmVkIGk4IHJldHVybgorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UxX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg2YTM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UxX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAorc2VydmljZSByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UyX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3MzMxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc2VydmljZSBzZXJ2aWNlX25hbWUgeworICBib29sIGZ1bmN0aW9uX25hbWUoMTogaTMyIHJldHVybikKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlM19yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UzX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkZDk0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlM19yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc2VydmljZSBzZXJ2aWNlX25hbWUgeworICB2b2lkIHJldHVybigpCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTRfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlNF9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzg3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTRfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDUgQEAKK2V4Y2VwdGlvbiBleGNlcHRpb25fbmFtZSB7fQorCitzZXJ2aWNlIHNlcnZpY2VfbmFtZSB7CisgIHZvaWQgZnVuY3Rpb25fbmFtZSgpIHRocm93cyAoIDE6IGV4Y2VwdGlvbl9uYW1lIHJldHVybikKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QxX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0MV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MmI4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0MV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK3N0cnVjdCByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QyX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0Ml9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzAwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0Ml9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc3RydWN0IHN0cnVjdF9uYW1lIHsKKyAgMTogcmVxdWlyZWQgYm9vbCByZXR1cm4gPSAxCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdHlwZWRlZjFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy90eXBlZGVmMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNTliYjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdHlwZWRlZjFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACit0eXBlZGVmIGJvb2wgcmV0dXJuCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24xX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24xX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4ZGYxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACit1bmlvbiByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzE5ZDFlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAordW5pb24gdW5pb25fbmFtZSB7CisgIDE6IG9wdGlvbmFsIGJvb2wgcmV0dXJuPTEKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9DTWFrZUxpc3RzLnR4dCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGU5MDczCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTUzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjguMTIpCisKK3Byb2plY3QodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzKQorCitzZXQoVEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVIKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4KKykKKworIyBkb24ndCBnZW5lcmF0ZSBaRVJPX0NIRUNLCitzZXQoQ01BS0VfU1VQUFJFU1NfUkVHRU5FUkFUSU9OIHRydWUpCisKK2NvbmZpZ3VyZV9maWxlKCR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdmVyc2lvbi5oLmluICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdmVyc2lvbi5oKQoraWYoTVNWQykKKyAgICAjIFRoZSB3aW5mbGV4Ymlzb24gZ2VuZXJhdG9yIG91dHB1dHMgc29tZSBtYWNyb3MgdGhhdCBjb25mbGljdCB3aXRoIHRoZSBWaXN1YWwgU3R1ZGlvIDIwMTAgY29weSBvZiBzdGRpbnQuaAorICAgICMgVGhpcyBtaWdodCBiZSBmaXhlZCBpbiBsYXRlciB2ZXJzaW9ucyBvZiBWaXN1YWwgU3R1ZGlvLCBidXQgYW4gZWFzeSBzb2x1dGlvbiBpcyB0byBpbmNsdWRlIHN0ZGludC5oIGZpcnN0CisgICAgaWYoSEFWRV9TVERJTlRfSCkKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EX19TVERDX0xJTUlUX01BQ1JPUykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC9GSSJzdGRpbnQuaCIpCisgICAgZW5kaWYoSEFWRV9TVERJTlRfSCkKK2VuZGlmKCkKKworZmluZF9wYWNrYWdlKEZMRVggUkVRVUlSRUQpCitmaW5kX3BhY2thZ2UoQklTT04gUkVRVUlSRUQpCisKKyMgY3JlYXRlIGRpcmVjdG9yeSBmb3IgdGhyaWZ0eSBhbmQgdGhyaWZ0bAorZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0LykKKworIyBDcmVhdGUgZmxleCBhbmQgYmlzb24gZmlsZXMgYW5kIGJ1aWxkIHRoZSBsaWIgcGFyc2Ugc3RhdGljIGxpYnJhcnkKK0JJU09OX1RBUkdFVCh0aHJpZnR5ICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdGhyaWZ0eS55eSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuY2MpCitGTEVYX1RBUkdFVCh0aHJpZnRsICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdGhyaWZ0bC5sbCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdGwuY2MpCitBRERfRkxFWF9CSVNPTl9ERVBFTkRFTkNZKHRocmlmdGwgdGhyaWZ0eSkKKworc2V0KHBhcnNlX1NPVVJDRVMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdGwuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuaGgKKykKKworYWRkX2xpYnJhcnkocGFyc2UgU1RBVElDICR7cGFyc2VfU09VUkNFU30pCisKKyMgVGhyaWZ0IGNvbXBpbGVyIHRlc3RzCitzZXQodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzCispCisKKyMgeW91IGNhbiBhZGQgc29tZSBmaWxlcyBtYW51YWxseSB0aGVyZSAKK3NldCh0aHJpZnRfY29tcGlsZXJfdGVzdHNfbWFudWFsX1NPVVJDRVMKKyAgICAjIHRlc3RzIGZpbGUgdG8gYXZvaWQgbWFpbiBpbiBldmVyeSB0ZXN0IGZpbGUKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdHNfbWFpbi5jYworKQorCisjIHNldCB2YXJpYWJsZSBmb3IgdGVzdHMgc291cmNlcyAtIHdpbGwgYmUgZmlsbGVkIGxhdGVyCitzZXQodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX1NPVVJDRVMKKykKKworc2V0KHRocmlmdF9jb21waWxlcl9TT1VSQ0VTCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9sb2dnaW5nLmNjICMgd2UgdXNlIGxvZ2dpbmcgaW5zdGVhZCBvZiBtYWluIHRvIGF2b2lkIGJyZWFraW5nIGNvbXBpbGxhdGlvbiAoMiBtYWluIHYpCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAorICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvY29tbW9uLmNjCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYworICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdmVyc2lvbi5oCispCisKKyMgVGhpcyBtYWNybyBhZGRzIGFuIG9wdGlvbiBUSFJJRlRfQ09NUElMRVJfJHtOQU1FfQorIyB0aGF0IGFsbG93cyBlbmFibGluZyBvciBkaXNhYmxpbmcgY2VydGFpbiBsYW5ndWFnZXMKK21hY3JvKFRIUklGVF9BRERfQ09NUElMRVIgbmFtZSBkZXNjcmlwdGlvbiBpbml0aWFsKQorICAgIHN0cmluZyhUT1VQUEVSICJUSFJJRlRfQ09NUElMRVJfJHtuYW1lfSIgZW5hYmxlcikKKyAgICBzZXQoc3JjICIke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfJHtuYW1lfV9nZW5lcmF0b3IuY2MiKQorICAgIG9wdGlvbigke2VuYWJsZXJ9ICR7ZGVzY3JpcHRpb259ICR7aW5pdGlhbH0pCisgICAgaWYoJHtlbmFibGVyfSkKKyAgICAgICAgbGlzdChBUFBFTkQgdGhyaWZ0X2NvbXBpbGVyX1NPVVJDRVMgJHtzcmN9KQorICAgICAgICBmaWxlKEdMT0IgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX1NPVVJDRVMKKyAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtuYW1lfS8qLmMqIgorICAgICAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke25hbWV9LyoudGhyaWZ0IgorICAgICAgICApCisgICAgZW5kaWYoKQorZW5kbWFjcm8oKQorCisjIFRoZSBmb2xsb3dpbmcgY29tcGlsZXIgd2l0aCB1bml0IHRlc3RzIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkCitUSFJJRlRfQUREX0NPTVBJTEVSKGFzMyAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQWN0aW9uU2NyaXB0IDMiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoY19nbGliICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDIHdpdGggR2xpYiIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihjbCAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIENvbW1vbiBMSVNQIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGNwcCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQysrIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGNzaGFycCAgIkVuYWJsZSBjb21waWxlciBmb3IgQyMiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZCAgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGRhcnQgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRGFydCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihkZWxwaGkgICJFbmFibGUgY29tcGlsZXIgZm9yIERlbHBoaSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihlcmwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEVybGFuZyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihnbyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEdvIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGd2ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR3JhcGhWaXoiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoaGF4ZSAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIYXhlIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGhzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGFza2VsbCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihodG1sICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhUTUwgRG9jdW1lbnRhdGlvbiIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihqYXZhICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEiICAgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihqYXZhbWUgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEgTUUiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoanMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKYXZhU2NyaXB0IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGpzb24gICAgIkVuYWJsZSBjb21waWxlciBmb3IgSlNPTiIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihsdWEgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEx1YSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihuZXRjb3JlICJFbmFibGUgY29tcGlsZXIgZm9yIC5ORVQgQ29yZSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKG9jYW1sICAgIkVuYWJsZSBjb21waWxlciBmb3IgT0NhbWwiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIocGVybCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQZXJsIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHBocCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUEhQIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHB5ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUHl0aG9uIDIuMCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihyYiAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1YnkiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIocnMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBSdXN0IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHN0ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgU21hbGx0YWxrIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHN3aWZ0ICAgIkVuYWJsZSBjb21waWxlciBmb3IgU3dpZnQiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoeG1sICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBYTUwiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoeHNkICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBYU0QiIE9GRikKKworIyBUaHJpZnQgaXMgbG9va2luZyBmb3IgaW5jbHVkZSBmaWxlcyBpbiB0aGUgc3JjIGRpcmVjdG9yeQorIyB3ZSBhbHNvIGFkZCB0aGUgY3VycmVudCBiaW5hcnkgZGlyZWN0b3J5IGZvciBnZW5lcmF0ZWQgZmlsZXMKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9ICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY2F0Y2gpCisKK2FkZF9saWJyYXJ5KHRocmlmdF9jb21waWxlciAke3RocmlmdF9jb21waWxlcl9TT1VSQ0VTfSkKKworI2xpbmsgcGFyc2UgbGliIHRvIHRocmlmdF9jb21waWxlciBsaWIKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnRfY29tcGlsZXIgcGFyc2UpCisKKyMgYWRkIHRlc3RzIGV4ZWN1dGFibGUKK2FkZF9leGVjdXRhYmxlKHRocmlmdF9jb21waWxlcl90ZXN0cyAke3RocmlmdF9jb21waWxlcl90ZXN0c19tYW51YWxfU09VUkNFU30gJHt0aHJpZnRfY29tcGlsZXJfdGVzdHNfU09VUkNFU30pCisKKyMgaWYgZ2VuZXJhdGVzIGZvciBWaXN1YWwgU3R1ZGlvIHNldCB0aHJpZnRfY29tcGlsZXJfdGVzdHMgYXMgZGVmYXVsdCBwcm9qZWN0CitpZihNU1ZDKQorICAgIHNldF9wcm9wZXJ0eShUQVJHRVQgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIFBST1BFUlRZIFZTX1NUQVJUVVBfUFJPSkVDVCB0aHJpZnRfY29tcGlsZXJfdGVzdHMpCitlbmRpZigpCisKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnRfY29tcGlsZXJfdGVzdHMgUFJPUEVSVElFUyBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkgYmluLykKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnRfY29tcGlsZXJfdGVzdHMgUFJPUEVSVElFUyBPVVRQVVRfTkFNRSB0aHJpZnRfY29tcGlsZXJfdGVzdHMpCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnRfY29tcGlsZXJfdGVzdHMgdGhyaWZ0X2NvbXBpbGVyKQorCitlbmFibGVfdGVzdGluZygpCithZGRfdGVzdChOQU1FIFRocmlmdFRlc3RzIENPTU1BTkQgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL1JFQURNRS5tZCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiZTQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9SRUFETUUubWQKQEAgLTAsMCArMSw4OCBAQAorIyBCdWlsZCBhbmQgcnVuIGNvbXBpbGVyIHRlc3RzIHVzaW5nIENNYWtlCisKKzwhLS0gVE9DIC0tPgorCistIFtCdWlsZCBhbmQgcnVuIGNvbXBpbGVyIHRlc3RzIHVzaW5nIENNYWtlXSgjYnVpbGQtYW5kLXJ1bi1jb21waWxlci10ZXN0cy11c2luZy1jbWFrZSkKKyAgICAtIFtHZW5lcmFsIGluZm9ybWF0aW9uXSgjZ2VuZXJhbC1pbmZvcm1hdGlvbikKKyAgICAtIFtIb3cgdG8gYWRkIHlvdXIgdGVzdHNdKCNob3ctdG8tYWRkLXlvdXItdGVzdHMpCisgICAgLSBbQnVpbGQgYW5kIHJ1biB0ZXN0cyBvbiBVbml4LWxpa2Ugc3lzdGVtc10oI2J1aWxkLWFuZC1ydW4tdGVzdHMtb24tdW5peC1saWtlLXN5c3RlbXMpCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXM6XSgjcHJlcmVxdWlzaXRlcykKKyAgICAgICAgLSBbQnVpbGQgYW5kIHJ1biB0ZXN0IHdpdGggQ01ha2VdKCNidWlsZC1hbmQtcnVuLXRlc3Qtd2l0aC1jbWFrZSkKKyAgICAtIFtCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFdpbmRvd3NdKCNidWlsZC1hbmQtcnVuLXRlc3RzLW9uLXdpbmRvd3MpCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXM6XSgjcHJlcmVxdWlzaXRlcy0xKQorICAgICAgICAtIFtHZW5lcmF0aW9uIG9mIFZTIHByb2plY3Qgd2l0aCBDTWFrZSwgYnVpbGQgYW5kIHJ1biBvbiBXaW5kb3dzXSgjZ2VuZXJhdGlvbi1vZi12cy1wcm9qZWN0LXdpdGgtY21ha2UtYnVpbGQtYW5kLXJ1bi1vbi13aW5kb3dzKQorCis8IS0tIC9UT0MgLS0+CisKKyMjIEdlbmVyYWwgaW5mb3JtYXRpb24gCisKK0FkZGVkIGdlbmVyaWMgd2F5IHRvIGNvdmVyIGNvZGUgYnkgdGVzdHMgZm9yIG1hbnkgbGFuZ3VhZ2VzICh5b3UganVzdCBuZWVkIHRvIG1ha2UgYSBjb3JyZWN0IGhlYWRlciBmaWxlIGZvciBnZW5lcmF0b3IgZm9yIHlvdXIgbGFuZ3VhZ2UgLSBleGFtcGxlIGluICoqbmV0Y29yZSoqIGltcGxlbWVudGF0aW9uKQorCitBdCBjdXJyZW50IG1vbWVudCB0aGVzZSB0ZXN0cyB1c2UgZnJlZSBDYXRjaCBsaWJyYXJ5IChodHRwczovL2dpdGh1Yi5jb20vY2F0Y2hvcmcvQ2F0Y2gyL3RyZWUvQ2F0Y2gxLngpIGZvciBlYXN5IHRlc3QgY3JlYXRpb24gYW5kIHVzYWdlLgorRGVjaXNpb24gdG8gdXNlIGl0IHdhcyBiZWNhdXNlIG9mIHNpbXBsaWNpdHksIGVhc3kgdXNhZ2UsIG9uZSBoZWFkZXIgZmlsZSB0byB1c2UsIHN0YWJsZSBjb21tdW5pdHkgYW5kIGdyb3dpbmcgaW50ZXJlc3QgIChodHRwczovL2NwcC5saWJodW50LmNvbS9wcm9qZWN0L2dvb2dsZXRlc3QtZ29vZ2xlL3ZzL2NhdGNoP3JlbD1jbXAtY21wKQorCitBbHNvLCBtYXliZSwgbGF0ZXIgaXQgd2lsbCBiZSBtaWdyYXRlZCB0byBDYXRjaDIgKGh0dHBzOi8vZ2l0aHViLmNvbS9waGlsc3F1YXJlZC9DYXRjaCkgLSBkZXBlbmRzIG9uIG5lZWQgdG8gc3VwcG9ydCBsZWdhY3kgY29tcGlsZXJzIChjKys5OCkKKworIyMgSG93IHRvIGFkZCB5b3VyIHRlc3RzCisKKy0gT3BlbiAqKkNNYWtlTGlzdHMudHh0KioKKy0gU2V0ICoqT24qKiB0byBjYWxsIG9mICoqVEhSSUZUX0FERF9DT01QSUxFUioqIGZvciB5b3VyIGxhbmd1YWdlCisKK2BgYCBjbWFrZSAKK1RIUklGVF9BRERfQ09NUElMRVIobmV0Y29yZSAiRW5hYmxlIGNvbXBpbGVyIGZvciAuTkVUIENvcmUiIE9OKQorYGBgCisKKy0gQ3JlYXRlIGZvbGRlciB3aXRoIG5hbWUgc3BlY2lmaWVkIGluIGxpc3Qgb2YgbGFuZ3VhZ2VzIGluICoqQ01ha2VMaXN0cy50eHQqKgorLSBDcmVhdGUgdGVzdHMgaW4gZm9sZGVyIGZvciB5b3VyIGxhbmd1YWdlICh3aXRoIGV4dGVuc2lvbnMgbGlrZSAqLmMqIC0gY2MsIGNwcCwgZXRjKQorICAtIERvbid0IGZvcmdldCB0byBhZGQgaW5jbHVkZSBvZiBjYXRjaC5ocHAgaW4geW91ciB0ZXN0IGZpbGUKKyAgYGBgIEMKKyAgI2luY2x1ZGUgIi4uL2NhdGNoL2NhdGNoLmhwcCIKKyAgYGBgCisKKy0gSWYgeW91IG5lZWQgLSBhZGQgZmlsZXMgbWFudWFsbHkgdG8gKip0aHJpZnRfY29tcGlsZXJfdGVzdHNfbWFudWFsX1NPVVJDRVMqKiBpbiAqKkNNYWtlTGlzdHMudHh0Kiogc2ltaWxhciB0byAKKworYGBgIGNtYWtlCisjIHlvdSBjYW4gYWRkIHNvbWUgZmlsZXMgbWFudWFsbHkgdGhlcmUgCitzZXQodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX21hbnVhbF9TT1VSQ0VTCisgICAgIyB0ZXN0cyBmaWxlIHRvIGF2b2lkIG1haW4gaW4gZXZlcnkgdGVzdCBmaWxlCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3RzX21haW4uY2MKKykKK2BgYAorCistIFJ1biAqKmNtYWtlKiogd2l0aCBhcmd1bWVudHMgZm9yIHlvdXIgZW52aXJvbm1lbnQgYW5kIGNvbXBpbGVyIAorLSBFbmpveQorCisjIyBCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFVuaXgtbGlrZSBzeXN0ZW1zCisKKyMjIyBQcmVyZXF1aXNpdGVzOgorLSBJbnN0YWxsIENNYWtlIC0gPGh0dHBzOi8vY21ha2Uub3JnL2Rvd25sb2FkLz4KKy0gSW5zdGFsbCB3aW5mbGV4Ymlzb24gLSA8aHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvd2luZmxleGJpc29uLz4KKworIyMjIEJ1aWxkIGFuZCBydW4gdGVzdCB3aXRoIENNYWtlCisKKy0gUnVuIGNvbW1hbmRzIGluIGNvbW1hbmQgbGluZSBpbiBjdXJyZW50IGRpcmVjdG9yeToKKworYGBgCitta2RpciBjbWFrZS12cyAmJiBjZCBjbWFrZS12cworY21ha2UgLi4KK2NtYWtlIC0tYnVpbGQgLgorY3Rlc3QgLUMgRGVidWcgLVYKK2BgYAorCisjIyBCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFdpbmRvd3MKKworIyMjIFByZXJlcXVpc2l0ZXM6CistIEluc3RhbGwgQ01ha2UgLSA8aHR0cHM6Ly9jbWFrZS5vcmcvZG93bmxvYWQvPgorLSBJbnN0YWxsIHdpbmZsZXhiaXNvbiAtIDxodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vPgorLSBJbnN0YWxsIFZTMjAxNyBDb21tdW5pdHkgRWRpdGlvbiAtIDxodHRwczovL3d3dy52aXN1YWxzdHVkaW8uY29tL3ZzL3doYXRzbmV3Lz4gKGVuc3VyZSB0aGF0IHlvdSBpbnN0YWxsZWQgd29ya2xvYWQgIkRlc2t0b3AgRGV2ZWxvcG1lbnQgd2l0aCBDKysiIGZvciBWUzIwMTcpCisKKyMjIyBHZW5lcmF0aW9uIG9mIFZTIHByb2plY3Qgd2l0aCBDTWFrZSwgYnVpbGQgYW5kIHJ1biBvbiBXaW5kb3dzCistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmUgaW4gY3VycmVudCBkaXJlY3RvcnkgKGVuc3VyZSB0aGF0IFZTIGluc3RhbGxlZCk6CisKK2BgYAorbWtkaXIgY21ha2UtdnMKK2NkIGNtYWtlLXZzCitjbWFrZSAuLgorY21ha2UgLS1idWlsZCAuCitjdGVzdCAtQyBEZWJ1ZyAtVgorYGBgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL2NhdGNoL2NhdGNoLmhwcCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9jYXRjaC9jYXRjaC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkMDM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9jYXRjaC9jYXRjaC5ocHAKQEAgLTAsMCArMSwxMTUwOCBAQAorLyoKKyAqICBDYXRjaCB2MS45LjQKKyAqICBHZW5lcmF0ZWQ6IDIwMTctMDUtMTYgMTM6NTE6NTUuNTA2NTE5CisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRoaXMgZmlsZSBoYXMgYmVlbiBtZXJnZWQgZnJvbSBtdWx0aXBsZSBoZWFkZXJzLiBQbGVhc2UgZG9uJ3QgZWRpdCBpdCBkaXJlY3RseQorICogIENvcHlyaWdodCAoYykgMjAxMiBUd28gQmx1ZSBDdWJlcyBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKKyAqICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworI2lmbmRlZiBUV09CTFVFQ1VCRVNfU0lOR0xFX0lOQ0xVREVfQ0FUQ0hfSFBQX0lOQ0xVREVECisjZGVmaW5lIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVERUQKKworI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyMgICAgcHJhZ21hIGNsYW5nIHN5c3RlbV9oZWFkZXIKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKyMgICAgcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3N1cHByZXNzX3dhcm5pbmdzLmgKKworI2lmZGVmIF9fY2xhbmdfXworIyAgIGlmZGVmIF9fSUNDIC8vIGljcGMgZGVmaW5lcyB0aGUgX19jbGFuZ19fIG1hY3JvCisjICAgICAgIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjICAgICAgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDE2MSAxNjgyKQorIyAgIGVsc2UgLy8gX19JQ0MKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdnbG9iYWwtY29uc3RydWN0b3JzIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3ZhcmlhZGljLW1hY3JvcyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjOTktZXh0ZW5zaW9ucyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFyaWFibGUiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrOTgtY29tcGF0IgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzk4LWNvbXBhdC1wZWRhbnRpYyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzd2l0Y2gtZW51bSIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjb3ZlcmVkLXN3aXRjaC1kZWZhdWx0IgorIyAgICBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd2YXJpYWRpYy1tYWNyb3MiCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YXJpYWJsZSIKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFyZW50aGVzZXMiCisKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfTUFJTikgfHwgZGVmaW5lZChDQVRDSF9DT05GSUdfUlVOTkVSKQorIyAgZGVmaW5lIENBVENIX0lNUEwKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfSU1QTAorIyAgaWZuZGVmIENMQVJBX0NPTkZJR19NQUlOCisjICAgIGRlZmluZSBDTEFSQV9DT05GSUdfTUFJTl9OT1RfREVGSU5FRAorIyAgICBkZWZpbmUgQ0xBUkFfQ09ORklHX01BSU4KKyMgIGVuZGlmCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX25vdGltcGxlbWVudGVkX2V4Y2VwdGlvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9OT1RJTVBMRU1FTlRFRF9FWENFUFRJT05fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29tbW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTU1PTl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb21waWxlcl9jYXBhYmlsaXRpZXMuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NUElMRVJfQ0FQQUJJTElUSUVTX0hQUF9JTkNMVURFRAorCisvLyBEZXRlY3QgYSBudW1iZXIgb2YgY29tcGlsZXIgZmVhdHVyZXMgLSBtb3N0bHkgQysrMTEvMTQgY29uZm9ybWFuY2UgLSBieSBjb21waWxlcgorLy8gVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgZGVmaW5lZDoKKy8vCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUiA6IGlzIG51bGxwdHIgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX05PRVhDRVBUIDogaXMgbm9leGNlcHQgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTIDogVGhlIGRlbGV0ZSBhbmQgZGVmYXVsdCBrZXl3b3JkcyBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIG1ldGhvZHMKKy8vIENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNIDogc3RkOjppc19lbnVtIGlzIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRSA6IHN0ZDo6dHVwbGUgaXMgc3VwcG9ydGVkCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HIDogaXMgbG9uZyBsb25nIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9PVkVSUklERSA6IGlzIG92ZXJyaWRlIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSIDogaXMgdW5pcXVlX3B0ciBzdXBwb3J0ZWQgKG90aGVyd2lzZSB1c2UgYXV0b19wdHIpCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRSA6IGlzIHN0ZDo6c2h1ZmZsZSBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMgOiBhcmUgdHlwZV90cmFpdHMgYW5kIGVuYWJsZV9pZiBzdXBwb3J0ZWQ/CisKKy8vIENBVENIX0NPTkZJR19DUFAxMV9PUl9HUkVBVEVSIDogSXMgQysrMTEgc3VwcG9ydGVkPworCisvLyBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TIDogYXJlIHZhcmlhZGljIG1hY3JvcyBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ09VTlRFUiA6IGlzIHRoZSBfX0NPVU5URVJfXyBtYWNybyBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfV0lORE9XU19TRUggOiBpcyBXaW5kb3dzIFNFSCBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUyA6IGFyZSBQT1NJWCBzaWduYWxzIHN1cHBvcnRlZD8KKy8vICoqKioqKioqKioqKioqKioKKy8vIE5vdGUgdG8gbWFpbnRhaW5lcnM6IGlmIG5ldyB0b2dnbGVzIGFyZSBhZGRlZCBwbGVhc2UgZG9jdW1lbnQgdGhlbQorLy8gaW4gY29uZmlndXJhdGlvbi5tZCwgdG9vCisvLyAqKioqKioqKioqKioqKioqCisKKy8vIEluIGdlbmVyYWwgZWFjaCBtYWNybyBoYXMgYSBfTk9fPGZlYXR1cmUgbmFtZT4gZm9ybQorLy8gKGUuZy4gQ0FUQ0hfQ09ORklHX0NQUDExX05PX05VTExQVFIpIHdoaWNoIGRpc2FibGVzIHRoZSBmZWF0dXJlLgorLy8gTWFueSBmZWF0dXJlcywgYXQgcG9pbnQgb2YgZGV0ZWN0aW9uLCBkZWZpbmUgYW4gX0lOVEVSTkFMXyBtYWNybywgc28gdGhleQorLy8gY2FuIGJlIGNvbWJpbmVkLCBlbi1tYXNzLCB3aXRoIHRoZSBfTk9fIGZvcm1zIGxhdGVyLgorCisvLyBBbGwgdGhlIEMrKzExIGZlYXR1cmVzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIENBVENIX0NPTkZJR19OT19DUFAxMQorCisjaWZkZWYgX19jcGx1c3BsdXMKKworIyAgaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyAgICBkZWZpbmUgQ0FUQ0hfQ1BQMTFfT1JfR1JFQVRFUgorIyAgZW5kaWYKKworIyAgaWYgX19jcGx1c3BsdXMgPj0gMjAxNDAyTAorIyAgICBkZWZpbmUgQ0FUQ0hfQ1BQMTRfT1JfR1JFQVRFUgorIyAgZW5kaWYKKworI2VuZGlmCisKKyNpZmRlZiBfX2NsYW5nX18KKworIyAgaWYgX19oYXNfZmVhdHVyZShjeHhfbnVsbHB0cikKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICBlbmRpZgorCisjICBpZiBfX2hhc19mZWF0dXJlKGN4eF9ub2V4Y2VwdCkKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorIyAgZW5kaWYKKworIyAgIGlmIGRlZmluZWQoQ0FUQ0hfQ1BQMTFfT1JfR1JFQVRFUikKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIiApIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2V4aXQtdGltZS1kZXN0cnVjdG9yc1wiIiApCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwb3AiICkKKworIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgcHVzaCIgKSBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdwYXJlbnRoZXNlc1wiIiApCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIHBvcCIgKQorIyAgIGVuZGlmCisKKyNlbmRpZiAvLyBfX2NsYW5nX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFdlIGtub3cgc29tZSBlbnZpcm9ubWVudHMgbm90IHRvIHN1cHBvcnQgZnVsbCBQT1NJWCBzaWduYWxzCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fUU5YX18pCisKKyMgICBpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUykKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19QT1NJWF9TSUdOQUxTCisjICAgZW5kaWYKKworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDeWd3aW4KKyNpZmRlZiBfX0NZR1dJTl9fCisKKy8vIFJlcXVpcmVkIGZvciBzb21lIHZlcnNpb25zIG9mIEN5Z3dpbiB0byBkZWNsYXJlIGdldHRpbWVvZmRheQorLy8gc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM2OTAxODAzL2dldHRpbWVvZmRheS1ub3QtZGVjbGFyZWQtaW4tdGhpcy1zY29wZS1jeWd3aW4KKyMgICBkZWZpbmUgX0JTRF9TT1VSQ0UKKworI2VuZGlmIC8vIF9fQ1lHV0lOX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJvcmxhbmQKKyNpZmRlZiBfX0JPUkxBTkRDX18KKworI2VuZGlmIC8vIF9fQk9STEFORENfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRURHCisjaWZkZWYgX19FREdfVkVSU0lPTl9fCisKKyNlbmRpZiAvLyBfX0VER19WRVJTSU9OX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERpZ2l0YWwgTWFycworI2lmZGVmIF9fRE1DX18KKworI2VuZGlmIC8vIF9fRE1DX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdDQworI2lmZGVmIF9fR05VQ19fCisKKyMgICBpZiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDYgJiYgZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICAgZW5kaWYKKworLy8gLSBvdGhlcndpc2UgbW9yZSByZWNlbnQgdmVyc2lvbnMgZGVmaW5lIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKy8vIGFuZCB3aWxsIGdldCBwaWNrZWQgdXAgYmVsb3cKKworI2VuZGlmIC8vIF9fR05VQ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWaXN1YWwgQysrCisjaWZkZWYgX01TQ19WRVIKKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfV0lORE9XU19TRUgKKworI2lmIChfTVNDX1ZFUiA+PSAxNjAwKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisKKyNpZiAoX01TQ19WRVIgPj0gMTkwMCApIC8vIChWQysrIDEzIChWUzIwMTUpKQorI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9TSFVGRkxFCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUworI2VuZGlmCisKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBVc2UgdmFyaWFkaWMgbWFjcm9zIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGVtCisjaWYgKCBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID4gMTQwMCAmJiAhZGVmaW5lZCBfX0VER0VfXykgfHwgXAorICAgICggZGVmaW5lZCBfX1dBVkVfXyAmJiBfX1dBVkVfSEFTX1ZBUklBRElDUyApIHx8IFwKKyAgICAoIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMyApIHx8IFwKKyAgICAoICFkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMICkKKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisKKyNlbmRpZgorCisvLyBVc2UgX19DT1VOVEVSX18gaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGl0CisjaWYgKCBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDEzMDAgKSB8fCBcCisgICAgKCBkZWZpbmVkIF9fR05VQ19fICAmJiBfX0dOVUNfXyA+PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMgKSB8fCBcCisgICAgKCBkZWZpbmVkIF9fY2xhbmdfXyAmJiBfX2NsYW5nX21ham9yX18gPj0gMyApCisKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NPVU5URVIKKworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDKysgbGFuZ3VhZ2UgZmVhdHVyZSBzdXBwb3J0CisKKy8vIGNhdGNoIGFsbCBzdXBwb3J0IGZvciBDKysxMQorI2lmIGRlZmluZWQoQ0FUQ0hfQ1BQMTFfT1JfR1JFQVRFUikKKworIyAgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfSVNfRU5VTQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0lTX0VOVU0KKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFVQTEUKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UVVBMRQorIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9MT05HX0xPTkcpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjICBlbmRpZgorIyBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfU0hVRkZMRSkKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1NIVUZGTEUKKyMgIGVuZGlmCisjIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykKKyMgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMKKyMgZW5kaWYKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworLy8gTm93IHNldCB0aGUgYWN0dWFsIGRlZmluZXMgYmFzZWQgb24gdGhlIGFib3ZlICsgYW55dGhpbmcgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fTlVMTFBUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fTk9FWENFUFQpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0lTX0VOVU0pICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19JU19FTlVNKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTQorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFVQTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19UVVBMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRQorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfVkFSSUFESUNfTUFDUk9TKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fVkFSSUFESUNfTUFDUk9TKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9MT05HX0xPTkcpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19MT05HX0xPTkcpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19PVkVSUklERSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKy8vIFVzZSBvZiBfX0NPVU5URVJfXyBpcyBzdXBwcmVzc2VkIGlmIF9fSkVUQlJBSU5TX0lERV9fIGlzICNkZWZpbmVkIChtZWFuaW5nIHdlJ3JlIGJlaW5nIHBhcnNlZCBieSBhIEpldEJyYWlucyBJREUgZm9yCisvLyBhbmFseXRpY3MpIGJlY2F1c2UsIGF0IHRpbWUgb2Ygd3JpdGluZywgX19DT1VOVEVSX18gaXMgbm90IHByb3Blcmx5IGhhbmRsZWQgYnkgaXQuCisvLyBUaGlzIGRvZXMgbm90IGFmZmVjdCBjb21waWxhdGlvbgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NPVU5URVIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DT1VOVEVSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ09VTlRFUikgJiYgIWRlZmluZWQoX19KRVRCUkFJTlNfSURFX18pCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DT1VOVEVSCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9TSFVGRkxFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fU0hVRkZMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUKKyNlbmRpZgorIyBpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX1RZUEVfVFJBSVRTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMKKyMgZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19XSU5ET1dTX1NFSCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1dJTkRPV1NfU0VIKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfV0lORE9XU19TRUgpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSAorI2VuZGlmCisvLyBUaGlzIGlzIHNldCBieSBkZWZhdWx0LCBiZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHVuaXggY29tcGlsZXJzIGFyZSBwb3NpeC1zaWduYWwtY29tcGF0aWJsZSBieSBkZWZhdWx0LgorI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19QT1NJWF9TSUdOQUxTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fUE9TSVhfU0lHTkFMUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUworIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTCisjZW5kaWYKKyNpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MpCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUworIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworI2VuZGlmCisKKy8vIG5vZXhjZXB0IHN1cHBvcnQ6CisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENBVENIX05PRVhDRVBUKQorIyAgZGVmaW5lIENBVENIX05PRVhDRVBUIG5vZXhjZXB0CisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFRfSVMoeCkgbm9leGNlcHQoeCkKKyNlbHNlCisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFQgdGhyb3coKQorIyAgZGVmaW5lIENBVENIX05PRVhDRVBUX0lTKHgpCisjZW5kaWYKKworLy8gbnVsbHB0ciBzdXBwb3J0CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKyMgICBkZWZpbmUgQ0FUQ0hfTlVMTCBudWxscHRyCisjZWxzZQorIyAgIGRlZmluZSBDQVRDSF9OVUxMIE5VTEwKKyNlbmRpZgorCisvLyBvdmVycmlkZSBzdXBwb3J0CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFCisjICAgZGVmaW5lIENBVENIX09WRVJSSURFIG92ZXJyaWRlCisjZWxzZQorIyAgIGRlZmluZSBDQVRDSF9PVkVSUklERQorI2VuZGlmCisKKy8vIHVuaXF1ZV9wdHIgc3VwcG9ydAorI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjICAgZGVmaW5lIENBVENIX0FVVE9fUFRSKCBUICkgc3RkOjp1bmlxdWVfcHRyPFQ+CisjZWxzZQorIyAgIGRlZmluZSBDQVRDSF9BVVRPX1BUUiggVCApIHN0ZDo6YXV0b19wdHI8VD4KKyNlbmRpZgorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUyKCBuYW1lLCBsaW5lICkgbmFtZSMjbGluZQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FKCBuYW1lLCBsaW5lICkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORTIoIG5hbWUsIGxpbmUgKQorI2lmZGVmIENBVENIX0NPTkZJR19DT1VOVEVSCisjICBkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIG5hbWUgKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FKCBuYW1lLCBfX0NPVU5URVJfXyApCisjZWxzZQorIyAgZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBuYW1lICkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORSggbmFtZSwgX19MSU5FX18gKQorI2VuZGlmCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSUZZMiggZXhwciApICNleHByCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NUUklOR0lGWSggZXhwciApIElOVEVSTkFMX0NBVENIX1NUUklOR0lGWTIoIGV4cHIgKQorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSUNvbmZpZzsKKworICAgIHN0cnVjdCBDYXNlU2Vuc2l0aXZlIHsgZW51bSBDaG9pY2UgeworICAgICAgICBZZXMsCisgICAgICAgIE5vCisgICAgfTsgfTsKKworICAgIGNsYXNzIE5vbkNvcHlhYmxlIHsKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlhYmxlIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlhYmxlICYmICkgICAgICAgICAgICAgICAgICA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUmIG9wZXJhdG9yID0gKCBOb25Db3B5YWJsZSBjb25zdCYgKSA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUmIG9wZXJhdG9yID0gKCBOb25Db3B5YWJsZSAmJiApICAgICA9IGRlbGV0ZTsKKyNlbHNlCisgICAgICAgIE5vbkNvcHlhYmxlKCBOb25Db3B5YWJsZSBjb25zdCYgaW5mbyApOworICAgICAgICBOb25Db3B5YWJsZSYgb3BlcmF0b3IgPSAoIE5vbkNvcHlhYmxlIGNvbnN0JiApOworI2VuZGlmCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIE5vbkNvcHlhYmxlKCkge30KKyAgICAgICAgdmlydHVhbCB+Tm9uQ29weWFibGUoKTsKKyAgICB9OworCisgICAgY2xhc3MgU2FmZUJvb2wgeworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiB2b2lkIChTYWZlQm9vbDo6KnR5cGUpKCkgY29uc3Q7CisKKyAgICAgICAgc3RhdGljIHR5cGUgbWFrZVNhZmUoIGJvb2wgdmFsdWUgKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPyAmU2FmZUJvb2w6OnRydWVWYWx1ZSA6IDA7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHRydWVWYWx1ZSgpIGNvbnN0IHt9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lclQ+CisgICAgaW5saW5lIHZvaWQgZGVsZXRlQWxsKCBDb250YWluZXJUJiBjb250YWluZXIgKSB7CisgICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29udGFpbmVyLmJlZ2luKCk7CisgICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gY29udGFpbmVyLmVuZCgpOworICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICBkZWxldGUgKml0OworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBc3NvY2lhdGl2ZUNvbnRhaW5lclQ+CisgICAgaW5saW5lIHZvaWQgZGVsZXRlQWxsVmFsdWVzKCBBc3NvY2lhdGl2ZUNvbnRhaW5lclQmIGNvbnRhaW5lciApIHsKKyAgICAgICAgdHlwZW5hbWUgQXNzb2NpYXRpdmVDb250YWluZXJUOjpjb25zdF9pdGVyYXRvciBpdCA9IGNvbnRhaW5lci5iZWdpbigpOworICAgICAgICB0eXBlbmFtZSBBc3NvY2lhdGl2ZUNvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gY29udGFpbmVyLmVuZCgpOworICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICBkZWxldGUgaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJlZml4ICk7CisgICAgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgY2hhciBwcmVmaXggKTsKKyAgICBib29sIGVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIHN1ZmZpeCApOworICAgIGJvb2wgZW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBjaGFyIHN1ZmZpeCApOworICAgIGJvb2wgY29udGFpbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgaW5maXggKTsKKyAgICB2b2lkIHRvTG93ZXJJblBsYWNlKCBzdGQ6OnN0cmluZyYgcyApOworICAgIHN0ZDo6c3RyaW5nIHRvTG93ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzICk7CisgICAgc3RkOjpzdHJpbmcgdHJpbSggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApOworICAgIGJvb2wgcmVwbGFjZUluUGxhY2UoIHN0ZDo6c3RyaW5nJiBzdHIsIHN0ZDo6c3RyaW5nIGNvbnN0JiByZXBsYWNlVGhpcywgc3RkOjpzdHJpbmcgY29uc3QmIHdpdGhUaGlzICk7CisKKyAgICBzdHJ1Y3QgcGx1cmFsaXNlIHsKKyAgICAgICAgcGx1cmFsaXNlKCBzdGQ6OnNpemVfdCBjb3VudCwgc3RkOjpzdHJpbmcgY29uc3QmIGxhYmVsICk7CisKKyAgICAgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBwbHVyYWxpc2UgY29uc3QmIHBsdXJhbGlzZXIgKTsKKworICAgICAgICBzdGQ6OnNpemVfdCBtX2NvdW50OworICAgICAgICBzdGQ6OnN0cmluZyBtX2xhYmVsOworICAgIH07CisKKyAgICBzdHJ1Y3QgU291cmNlTGluZUluZm8geworCisgICAgICAgIFNvdXJjZUxpbmVJbmZvKCk7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvKCBjaGFyIGNvbnN0KiBfZmlsZSwgc3RkOjpzaXplX3QgX2xpbmUgKTsKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBTb3VyY2VMaW5lSW5mbyhTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIpICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgU291cmNlTGluZUluZm8oIFNvdXJjZUxpbmVJbmZvICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvJiBvcGVyYXRvciA9ICggU291cmNlTGluZUluZm8gY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyYgb3BlcmF0b3IgPSAoIFNvdXJjZUxpbmVJbmZvICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisgICAgICAgIGJvb2wgZW1wdHkoKSBjb25zdDsKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdDsKKworICAgICAgICBjaGFyIGNvbnN0KiBmaWxlOworICAgICAgICBzdGQ6OnNpemVfdCBsaW5lOworICAgIH07CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgU291cmNlTGluZUluZm8gY29uc3QmIGluZm8gKTsKKworICAgIC8vIFRoaXMgaXMganVzdCBoZXJlIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzIHdpdGggbWFjcm8gY29uc3RhbnRzIGFuZCBib29sZWFuIGxpdGVyYWxzCisgICAgaW5saW5lIGJvb2wgaXNUcnVlKCBib29sIHZhbHVlICl7IHJldHVybiB2YWx1ZTsgfQorICAgIGlubGluZSBib29sIGFsd2F5c1RydWUoKSB7IHJldHVybiB0cnVlOyB9CisgICAgaW5saW5lIGJvb2wgYWx3YXlzRmFsc2UoKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdm9pZCB0aHJvd0xvZ2ljRXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbG9jYXRpb25JbmZvICk7CisKKyAgICB2b2lkIHNlZWRSbmcoIElDb25maWcgY29uc3QmIGNvbmZpZyApOworICAgIHVuc2lnbmVkIGludCBybmdTZWVkKCk7CisKKyAgICAvLyBVc2UgdGhpcyBpbiB2YXJpYWRpYyBzdHJlYW1pbmcgbWFjcm9zIHRvIGFsbG93CisgICAgLy8gICAgPj4gK1N0cmVhbUVuZFN0b3AKKyAgICAvLyBhcyB3ZWxsIGFzCisgICAgLy8gICAgPj4gc3R1ZmYgK1N0cmVhbUVuZFN0b3AKKyAgICBzdHJ1Y3QgU3RyZWFtRW5kU3RvcCB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG9wZXJhdG9yKygpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQgY29uc3QmIG9wZXJhdG9yICsgKCBUIGNvbnN0JiB2YWx1ZSwgU3RyZWFtRW5kU3RvcCApIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KK30KKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyA6OkNhdGNoOjpTb3VyY2VMaW5lSW5mbyggX19GSUxFX18sIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggX19MSU5FX18gKSApCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0VSUk9SKCBtc2cgKSA6OkNhdGNoOjp0aHJvd0xvZ2ljRXJyb3IoIG1zZywgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworICAgICAgICBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiggTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gY29uc3QmICkge30KKworICAgICAgICB2aXJ0dWFsIH5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpIENBVENIX05PRVhDRVBUIHt9CisKKyAgICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgQ0FUQ0hfTk9FWENFUFQ7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBtX3doYXQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIG1fbGluZUluZm87CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgQ0FUQ0hfTk9UX0lNUExFTUVOVEVEIHRocm93IENhdGNoOjpOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfY29udGV4dC5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05URVhUX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfZ2VuZXJhdG9ycy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX0dFTkVSQVRPUlNfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IElHZW5lcmF0b3JJbmZvIHsKKyAgICAgICAgdmlydHVhbCB+SUdlbmVyYXRvckluZm8oKTsKKyAgICAgICAgdmlydHVhbCBib29sIG1vdmVOZXh0KCkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IGdldEN1cnJlbnRJbmRleCgpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElHZW5lcmF0b3JzRm9yVGVzdCB7CisgICAgICAgIHZpcnR1YWwgfklHZW5lcmF0b3JzRm9yVGVzdCgpOworCisgICAgICAgIHZpcnR1YWwgSUdlbmVyYXRvckluZm8mIGdldEdlbmVyYXRvckluZm8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlSW5mbywgc3RkOjpzaXplX3Qgc2l6ZSApID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIG1vdmVOZXh0KCkgPSAwOworICAgIH07CisKKyAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGNyZWF0ZUdlbmVyYXRvcnNGb3JUZXN0KCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcHRyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUFRSX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBBbiBpbnRydXNpdmUgcmVmZXJlbmNlIGNvdW50aW5nIHNtYXJ0IHBvaW50ZXIuCisgICAgLy8gVCBtdXN0IGltcGxlbWVudCBhZGRSZWYoKSBhbmQgcmVsZWFzZSgpIG1ldGhvZHMKKyAgICAvLyB0eXBpY2FsbHkgaW1wbGVtZW50aW5nIHRoZSBJU2hhcmVkIGludGVyZmFjZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgUHRyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFB0cigpIDogbV9wKCBDQVRDSF9OVUxMICl7fQorICAgICAgICBQdHIoIFQqIHAgKSA6IG1fcCggcCApeworICAgICAgICAgICAgaWYoIG1fcCApCisgICAgICAgICAgICAgICAgbV9wLT5hZGRSZWYoKTsKKyAgICAgICAgfQorICAgICAgICBQdHIoIFB0ciBjb25zdCYgb3RoZXIgKSA6IG1fcCggb3RoZXIubV9wICl7CisgICAgICAgICAgICBpZiggbV9wICkKKyAgICAgICAgICAgICAgICBtX3AtPmFkZFJlZigpOworICAgICAgICB9CisgICAgICAgIH5QdHIoKXsKKyAgICAgICAgICAgIGlmKCBtX3AgKQorICAgICAgICAgICAgICAgIG1fcC0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiggbV9wICkKKyAgICAgICAgICAgICAgICBtX3AtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1fcCA9IENBVENIX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHRyJiBvcGVyYXRvciA9ICggVCogcCApeworICAgICAgICAgICAgUHRyIHRlbXAoIHAgKTsKKyAgICAgICAgICAgIHN3YXAoIHRlbXAgKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBQdHImIG9wZXJhdG9yID0gKCBQdHIgY29uc3QmIG90aGVyICl7CisgICAgICAgICAgICBQdHIgdGVtcCggb3RoZXIgKTsKKyAgICAgICAgICAgIHN3YXAoIHRlbXAgKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHN3YXAoIFB0ciYgb3RoZXIgKSB7IHN0ZDo6c3dhcCggbV9wLCBvdGhlci5tX3AgKTsgfQorICAgICAgICBUKiBnZXQoKSBjb25zdHsgcmV0dXJuIG1fcDsgfQorICAgICAgICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqbV9wOyB9CisgICAgICAgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBtX3A7IH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciAhKCkgY29uc3QgeyByZXR1cm4gbV9wID09IENBVENIX05VTEw7IH0KKyAgICAgICAgb3BlcmF0b3IgU2FmZUJvb2w6OnR5cGUoKSBjb25zdCB7IHJldHVybiBTYWZlQm9vbDo6bWFrZVNhZmUoIG1fcCAhPSBDQVRDSF9OVUxMICk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFQqIG1fcDsKKyAgICB9OworCisgICAgc3RydWN0IElTaGFyZWQgOiBOb25Db3B5YWJsZSB7CisgICAgICAgIHZpcnR1YWwgfklTaGFyZWQoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkZFJlZigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBJU2hhcmVkPgorICAgIHN0cnVjdCBTaGFyZWRJbXBsIDogVCB7CisKKyAgICAgICAgU2hhcmVkSW1wbCgpIDogbV9yYyggMCApe30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkUmVmKCkgY29uc3QgeworICAgICAgICAgICAgKyttX3JjOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgY29uc3QgeworICAgICAgICAgICAgaWYoIC0tbV9yYyA9PSAwICkKKyAgICAgICAgICAgICAgICBkZWxldGUgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIG11dGFibGUgdW5zaWduZWQgaW50IG1fcmM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgY2xhc3MgU3RyZWFtOworICAgIHN0cnVjdCBJUmVzdWx0Q2FwdHVyZTsKKyAgICBzdHJ1Y3QgSVJ1bm5lcjsKKyAgICBzdHJ1Y3QgSUdlbmVyYXRvcnNGb3JUZXN0OworICAgIHN0cnVjdCBJQ29uZmlnOworCisgICAgc3RydWN0IElDb250ZXh0CisgICAgeworICAgICAgICB2aXJ0dWFsIH5JQ29udGV4dCgpOworCisgICAgICAgIHZpcnR1YWwgSVJlc3VsdENhcHR1cmUqIGdldFJlc3VsdENhcHR1cmUoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgSVJ1bm5lciogZ2V0UnVubmVyKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRHZW5lcmF0b3JJbmRleCggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzaXplX3QgdG90YWxTaXplICkgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgYWR2YW5jZUdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpID0gMDsKKyAgICAgICAgdmlydHVhbCBQdHI8SUNvbmZpZyBjb25zdD4gZ2V0Q29uZmlnKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSU11dGFibGVDb250ZXh0IDogSUNvbnRleHQKKyAgICB7CisgICAgICAgIHZpcnR1YWwgfklNdXRhYmxlQ29udGV4dCgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmVzdWx0Q2FwdHVyZSggSVJlc3VsdENhcHR1cmUqIHJlc3VsdENhcHR1cmUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSdW5uZXIoIElSdW5uZXIqIHJ1bm5lciApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldENvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcgKSA9IDA7CisgICAgfTsKKworICAgIElDb250ZXh0JiBnZXRDdXJyZW50Q29udGV4dCgpOworICAgIElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCk7CisgICAgdm9pZCBjbGVhblVwQ29udGV4dCgpOworICAgIFN0cmVhbSBjcmVhdGVTdHJlYW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJlYW1OYW1lICk7CisKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3Rlc3RfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX1JFR0lTVFJZX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc190ZXN0Y2FzZS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1RFU1RDQVNFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RTcGVjOworCisgICAgc3RydWN0IElUZXN0Q2FzZSA6IElTaGFyZWQgeworICAgICAgICB2aXJ0dWFsIHZvaWQgaW52b2tlICgpIGNvbnN0ID0gMDsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgfklUZXN0Q2FzZSgpOworICAgIH07CisKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKyAgICBzdHJ1Y3QgSUNvbmZpZzsKKworICAgIHN0cnVjdCBJVGVzdENhc2VSZWdpc3RyeSB7CisgICAgICAgIHZpcnR1YWwgfklUZXN0Q2FzZVJlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0cygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIGJvb2wgbWF0Y2hUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGZpbHRlclRlc3RzKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHRlc3RDYXNlcywgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisKK30KKworbmFtZXNwYWNlIENhdGNoIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgQz4KK2NsYXNzIE1ldGhvZFRlc3RDYXNlIDogcHVibGljIFNoYXJlZEltcGw8SVRlc3RDYXNlPiB7CisKK3B1YmxpYzoKKyAgICBNZXRob2RUZXN0Q2FzZSggdm9pZCAoQzo6Km1ldGhvZCkoKSApIDogbV9tZXRob2QoIG1ldGhvZCApIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgaW52b2tlKCkgY29uc3QgeworICAgICAgICBDIG9iajsKKyAgICAgICAgKG9iai4qbV9tZXRob2QpKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHZpcnR1YWwgfk1ldGhvZFRlc3RDYXNlKCkge30KKworICAgIHZvaWQgKEM6OiptX21ldGhvZCkoKTsKK307CisKK3R5cGVkZWYgdm9pZCgqVGVzdEZ1bmN0aW9uKSgpOworCitzdHJ1Y3QgTmFtZUFuZERlc2MgeworICAgIE5hbWVBbmREZXNjKCBjb25zdCBjaGFyKiBfbmFtZSA9ICIiLCBjb25zdCBjaGFyKiBfZGVzY3JpcHRpb249ICIiICkKKyAgICA6IG5hbWUoIF9uYW1lICksIGRlc2NyaXB0aW9uKCBfZGVzY3JpcHRpb24gKQorICAgIHt9CisKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uOworfTsKKwordm9pZCByZWdpc3RlclRlc3RDYXNlCisgICAgKCAgIElUZXN0Q2FzZSogdGVzdENhc2UsCisgICAgICAgIGNoYXIgY29uc3QqIGNsYXNzTmFtZSwKKyAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjLAorICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKKworc3RydWN0IEF1dG9SZWcgeworCisgICAgQXV0b1JlZworICAgICAgICAoICAgVGVzdEZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjICk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgIEF1dG9SZWcKKyAgICAgICAgKCAgIHZvaWQgKEM6OiptZXRob2QpKCksCisgICAgICAgICAgICBjaGFyIGNvbnN0KiBjbGFzc05hbWUsCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MsCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisKKyAgICAgICAgcmVnaXN0ZXJUZXN0Q2FzZQorICAgICAgICAgICAgKCAgIG5ldyBNZXRob2RUZXN0Q2FzZTxDPiggbWV0aG9kICksCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgIG5hbWVBbmREZXNjLAorICAgICAgICAgICAgICAgIGxpbmVJbmZvICk7CisgICAgfQorCisgICAgfkF1dG9SZWcoKTsKKworcHJpdmF0ZToKKyAgICBBdXRvUmVnKCBBdXRvUmVnIGNvbnN0JiApOworICAgIHZvaWQgb3BlcmF0b3I9ICggQXV0b1JlZyBjb25zdCYgKTsKK307CisKK3ZvaWQgcmVnaXN0ZXJUZXN0Q2FzZUZ1bmN0aW9uCisgICAgKCAgIFRlc3RGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBUZXN0TmFtZSwgLi4uICkgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlRlc3ROYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApICk7IH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCAuLi4gKSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18gKSwgX19WQV9BUkdTX18gKQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggUXVhbGlmaWVkTWV0aG9kLCAuLi4gKSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlF1YWxpZmllZE1ldGhvZCwgIiYiICNRdWFsaWZpZWRNZXRob2QsIENhdGNoOjpOYW1lQW5kRGVzYyggX19WQV9BUkdTX18gKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggVGVzdE5hbWUsIENsYXNzTmFtZSwgLi4uIClcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgXAorICAgICAgICAgICAgc3RydWN0IFRlc3ROYW1lIDogQ2xhc3NOYW1leyBcCisgICAgICAgICAgICAgICAgdm9pZCB0ZXN0KCk7IFwKKyAgICAgICAgICAgIH07IFwKKyAgICAgICAgICAgIENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkgKCAmVGVzdE5hbWU6OnRlc3QsICNDbGFzc05hbWUsIENhdGNoOjpOYW1lQW5kRGVzYyggX19WQV9BUkdTX18gKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICB2b2lkIFRlc3ROYW1lOjp0ZXN0KCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIENsYXNzTmFtZSwgLi4uICkgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18gKSwgQ2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggRnVuY3Rpb24sIC4uLiApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgQ2F0Y2g6OkF1dG9SZWcoIEZ1bmN0aW9uLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApICk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworI2Vsc2UKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRTIoIFRlc3ROYW1lLCBOYW1lLCBEZXNjICkgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlRlc3ROYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBOYW1lLCBEZXNjICkgKTsgfVwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggTmFtZSwgRGVzYyApIFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBOYW1lLCBEZXNjICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIFF1YWxpZmllZE1ldGhvZCwgTmFtZSwgRGVzYyApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCAmUXVhbGlmaWVkTWV0aG9kLCAiJiIgI1F1YWxpZmllZE1ldGhvZCwgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBOYW1lLCBEZXNjICksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRDIoIFRlc3RDYXNlTmFtZSwgQ2xhc3NOYW1lLCBUZXN0TmFtZSwgRGVzYyApXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IFwKKyAgICAgICAgICAgIHN0cnVjdCBUZXN0Q2FzZU5hbWUgOiBDbGFzc05hbWV7IFwKKyAgICAgICAgICAgICAgICB2b2lkIHRlc3QoKTsgXAorICAgICAgICAgICAgfTsgXAorICAgICAgICAgICAgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSAoICZUZXN0Q2FzZU5hbWU6OnRlc3QsICNDbGFzc05hbWUsIENhdGNoOjpOYW1lQW5kRGVzYyggVGVzdE5hbWUsIERlc2MgKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICB2b2lkIFRlc3RDYXNlTmFtZTo6dGVzdCgpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBDbGFzc05hbWUsIFRlc3ROYW1lLCBEZXNjIClcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBDbGFzc05hbWUsIFRlc3ROYW1lLCBEZXNjICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgTmFtZSwgRGVzYyApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgQ2F0Y2g6OkF1dG9SZWcoIEZ1bmN0aW9uLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBOYW1lLCBEZXNjICkgKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2NhcHR1cmUuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DQVBUVVJFX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVzdWx0X2J1aWxkZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVTVUxUX0JVSUxERVJfSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVzdWx0X3R5cGUuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVTVUxUX1RZUEVfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gUmVzdWx0V2FzOjpPZlR5cGUgZW51bQorICAgIHN0cnVjdCBSZXN1bHRXYXMgeyBlbnVtIE9mVHlwZSB7CisgICAgICAgIFVua25vd24gPSAtMSwKKyAgICAgICAgT2sgPSAwLAorICAgICAgICBJbmZvID0gMSwKKyAgICAgICAgV2FybmluZyA9IDIsCisKKyAgICAgICAgRmFpbHVyZUJpdCA9IDB4MTAsCisKKyAgICAgICAgRXhwcmVzc2lvbkZhaWxlZCA9IEZhaWx1cmVCaXQgfCAxLAorICAgICAgICBFeHBsaWNpdEZhaWx1cmUgPSBGYWlsdXJlQml0IHwgMiwKKworICAgICAgICBFeGNlcHRpb24gPSAweDEwMCB8IEZhaWx1cmVCaXQsCisKKyAgICAgICAgVGhyZXdFeGNlcHRpb24gPSBFeGNlcHRpb24gfCAxLAorICAgICAgICBEaWRudFRocm93RXhjZXB0aW9uID0gRXhjZXB0aW9uIHwgMiwKKworICAgICAgICBGYXRhbEVycm9yQ29uZGl0aW9uID0gMHgyMDAgfCBGYWlsdXJlQml0CisKKyAgICB9OyB9OworCisgICAgaW5saW5lIGJvb2wgaXNPayggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZSApIHsKKyAgICAgICAgcmV0dXJuICggcmVzdWx0VHlwZSAmIFJlc3VsdFdhczo6RmFpbHVyZUJpdCApID09IDA7CisgICAgfQorICAgIGlubGluZSBib29sIGlzSnVzdEluZm8oIGludCBmbGFncyApIHsKKyAgICAgICAgcmV0dXJuIGZsYWdzID09IFJlc3VsdFdhczo6SW5mbzsKKyAgICB9CisKKyAgICAvLyBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgZW51bQorICAgIHN0cnVjdCBSZXN1bHREaXNwb3NpdGlvbiB7IGVudW0gRmxhZ3MgeworICAgICAgICBOb3JtYWwgPSAweDAxLAorCisgICAgICAgIENvbnRpbnVlT25GYWlsdXJlID0gMHgwMiwgICAvLyBGYWlsdXJlcyBmYWlsIHRlc3QsIGJ1dCBleGVjdXRpb24gY29udGludWVzCisgICAgICAgIEZhbHNlVGVzdCA9IDB4MDQsICAgICAgICAgICAvLyBQcmVmaXggZXhwcmVzc2lvbiB3aXRoICEKKyAgICAgICAgU3VwcHJlc3NGYWlsID0gMHgwOCAgICAgICAgIC8vIEZhaWx1cmVzIGFyZSByZXBvcnRlZCBidXQgZG8gbm90IGZhaWwgdGhlIHRlc3QKKyAgICB9OyB9OworCisgICAgaW5saW5lIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBvcGVyYXRvciB8ICggUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIGxocywgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJocyApIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncz4oIHN0YXRpY19jYXN0PGludD4oIGxocyApIHwgc3RhdGljX2Nhc3Q8aW50PiggcmhzICkgKTsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBzaG91bGRDb250aW51ZU9uRmFpbHVyZSggaW50IGZsYWdzICkgICAgeyByZXR1cm4gKCBmbGFncyAmIFJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSApICE9IDA7IH0KKyAgICBpbmxpbmUgYm9vbCBpc0ZhbHNlVGVzdCggaW50IGZsYWdzICkgICAgICAgICAgICAgICAgeyByZXR1cm4gKCBmbGFncyAmIFJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QgKSAhPSAwOyB9CisgICAgaW5saW5lIGJvb2wgc2hvdWxkU3VwcHJlc3NGYWlsdXJlKCBpbnQgZmxhZ3MgKSAgICAgIHsgcmV0dXJuICggZmxhZ3MgJiBSZXN1bHREaXNwb3NpdGlvbjo6U3VwcHJlc3NGYWlsICkgIT0gMDsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2Fzc2VydGlvbnJlc3VsdC5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9BU1NFUlRJT05SRVNVTFRfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbjsKKworICAgIHN0cnVjdCBEZWNvbXBvc2VkRXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgdmlydHVhbCB+RGVjb21wb3NlZEV4cHJlc3Npb24oKSB7fQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNCaW5hcnlFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgPSAwOworCisgICAgICAgIC8vIE9ubHkgc2ltcGxlIGJpbmFyeSBjb21wYXJpc29ucyBjYW4gYmUgZGVjb21wb3NlZC4KKyAgICAgICAgLy8gSWYgbW9yZSBjb21wbGV4IGNoZWNrIGlzIHJlcXVpcmVkIHRoZW4gd3JhcCBzdWItZXhwcmVzc2lvbnMgaW4gcGFyZW50aGVzZXMuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgKyAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgLSAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgKiAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgLyAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgJSAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgJiYgKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yIHx8ICggVCBjb25zdCYgKTsKKworCXByaXZhdGU6CisJCURlY29tcG9zZWRFeHByZXNzaW9uJiBvcGVyYXRvciA9IChEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYpOworICAgIH07CisKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uSW5mbworICAgIHsKKyAgICAgICAgQXNzZXJ0aW9uSW5mbygpIHt9CisgICAgICAgIEFzc2VydGlvbkluZm8oICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NhcHR1cmVkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBfcmVzdWx0RGlzcG9zaXRpb24gKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBtYWNyb05hbWU7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgICAgICBzdGQ6OnN0cmluZyBjYXB0dXJlZEV4cHJlc3Npb247CisgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbjsKKyAgICB9OworCisgICAgc3RydWN0IEFzc2VydGlvblJlc3VsdERhdGEKKyAgICB7CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEoKSA6IGRlY29tcG9zZWRFeHByZXNzaW9uKCBDQVRDSF9OVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcmVzdWx0VHlwZSggUmVzdWx0V2FzOjpVbmtub3duICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbmVnYXRlZCggZmFsc2UgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBwYXJlbnRoZXNpemVkKCBmYWxzZSApIHt9CisKKyAgICAgICAgdm9pZCBuZWdhdGUoIGJvb2wgcGFyZW50aGVzaXplICkgeworICAgICAgICAgICAgbmVnYXRlZCA9ICFuZWdhdGVkOworICAgICAgICAgICAgcGFyZW50aGVzaXplZCA9IHBhcmVudGhlc2l6ZTsKKyAgICAgICAgICAgIGlmKCByZXN1bHRUeXBlID09IFJlc3VsdFdhczo6T2sgKQorICAgICAgICAgICAgICAgIHJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ7CisgICAgICAgICAgICBlbHNlIGlmKCByZXN1bHRUeXBlID09IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZCApCisgICAgICAgICAgICAgICAgcmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6T2s7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgaWYoIGRlY29tcG9zZWRFeHByZXNzaW9uICE9IENBVENIX05VTEwgKSB7CisgICAgICAgICAgICAgICAgZGVjb21wb3NlZEV4cHJlc3Npb24tPnJlY29uc3RydWN0RXhwcmVzc2lvbiggcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gKTsKKyAgICAgICAgICAgICAgICBpZiggcGFyZW50aGVzaXplZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24uaW5zZXJ0KCAwLCAxLCAnKCcgKTsKKyAgICAgICAgICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24uYXBwZW5kKCAxLCAnKScgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIG5lZ2F0ZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uLmluc2VydCggMCwgMSwgJyEnICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlY29tcG9zZWRFeHByZXNzaW9uID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIG11dGFibGUgRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QqIGRlY29tcG9zZWRFeHByZXNzaW9uOworICAgICAgICBtdXRhYmxlIHN0ZDo6c3RyaW5nIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uOworICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOworICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlOworICAgICAgICBib29sIG5lZ2F0ZWQ7CisgICAgICAgIGJvb2wgcGFyZW50aGVzaXplZDsKKyAgICB9OworCisgICAgY2xhc3MgQXNzZXJ0aW9uUmVzdWx0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEFzc2VydGlvblJlc3VsdCgpOworICAgICAgICBBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8sIEFzc2VydGlvblJlc3VsdERhdGEgY29uc3QmIGRhdGEgKTsKKyAgICAgICAgfkFzc2VydGlvblJlc3VsdCgpOworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgICBBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgIEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3IgPSAoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgICBBc3NlcnRpb25SZXN1bHQmIG9wZXJhdG9yID0gKCBBc3NlcnRpb25SZXN1bHQgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBib29sIGlzT2soKSBjb25zdDsKKyAgICAgICAgYm9vbCBzdWNjZWVkZWQoKSBjb25zdDsKKyAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgZ2V0UmVzdWx0VHlwZSgpIGNvbnN0OworICAgICAgICBib29sIGhhc0V4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgYm9vbCBoYXNNZXNzYWdlKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0RXhwcmVzc2lvbkluTWFjcm8oKSBjb25zdDsKKyAgICAgICAgYm9vbCBoYXNFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldE1lc3NhZ2UoKSBjb25zdDsKKyAgICAgICAgU291cmNlTGluZUluZm8gZ2V0U291cmNlSW5mbygpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRUZXN0TWFjcm9OYW1lKCkgY29uc3Q7CisgICAgICAgIHZvaWQgZGlzY2FyZERlY29tcG9zZWRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIHZvaWQgZXhwYW5kRGVjb21wb3NlZEV4cHJlc3Npb24oKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgQXNzZXJ0aW9uSW5mbyBtX2luZm87CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgbV9yZXN1bHREYXRhOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWF0Y2hlcnMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NQVRDSEVSU19IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisgICAgbmFtZXNwYWNlIEltcGwgeworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+IHN0cnVjdCBNYXRjaEFsbE9mOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPiBzdHJ1Y3QgTWF0Y2hBbnlPZjsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4gc3RydWN0IE1hdGNoTm90T2Y7CisKKyAgICAgICAgY2xhc3MgTWF0Y2hlclVudHlwZWRCYXNlIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIG1fY2FjaGVkVG9TdHJpbmcuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIG1fY2FjaGVkVG9TdHJpbmcgPSBkZXNjcmliZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBtX2NhY2hlZFRvU3RyaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIHZpcnR1YWwgfk1hdGNoZXJVbnR5cGVkQmFzZSgpOworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIG11dGFibGUgc3RkOjpzdHJpbmcgbV9jYWNoZWRUb1N0cmluZzsKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIE1hdGNoZXJVbnR5cGVkQmFzZSYgb3BlcmF0b3IgPSAoIE1hdGNoZXJVbnR5cGVkQmFzZSBjb25zdCYgKTsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hlck1ldGhvZCB7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE9iamVjdFQgY29uc3QmIGFyZyApIGNvbnN0ID0gMDsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHRyVD4KKyAgICAgICAgc3RydWN0IE1hdGNoZXJNZXRob2Q8UHRyVCo+IHsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggUHRyVCogYXJnICkgY29uc3QgPSAwOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQsIHR5cGVuYW1lIENvbXBhcmF0b3JUID0gT2JqZWN0VD4KKyAgICAgICAgc3RydWN0IE1hdGNoZXJCYXNlIDogTWF0Y2hlclVudHlwZWRCYXNlLCBNYXRjaGVyTWV0aG9kPE9iamVjdFQ+IHsKKworICAgICAgICAgICAgTWF0Y2hBbGxPZjxDb21wYXJhdG9yVD4gb3BlcmF0b3IgJiYgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgICAgIE1hdGNoQW55T2Y8Q29tcGFyYXRvclQ+IG9wZXJhdG9yIHx8ICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgICAgICBNYXRjaE5vdE9mPENvbXBhcmF0b3JUPiBvcGVyYXRvciAhICgpIGNvbnN0OworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+CisgICAgICAgIHN0cnVjdCBNYXRjaEFsbE9mIDogTWF0Y2hlckJhc2U8QXJnVD4geworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBBcmdUIGNvbnN0JiBhcmcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbV9tYXRjaGVyc1tpXS0+bWF0Y2goYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnJlc2VydmUoIDQgKyBtX21hdGNoZXJzLnNpemUoKSozMiApOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIoICI7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiBhbmQgIjsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9tYXRjaGVyc1tpXS0+dG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiApIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1hdGNoQWxsT2Y8QXJnVD4mIG9wZXJhdG9yICYmICggTWF0Y2hlckJhc2U8QXJnVD4gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgICAgIG1fbWF0Y2hlcnMucHVzaF9iYWNrKCAmb3RoZXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0Kj4gbV9tYXRjaGVyczsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4KKyAgICAgICAgc3RydWN0IE1hdGNoQW55T2YgOiBNYXRjaGVyQmFzZTxBcmdUPiB7CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggQXJnVCBjb25zdCYgYXJnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX21hdGNoZXJzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAobV9tYXRjaGVyc1tpXS0+bWF0Y2goYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnJlc2VydmUoIDQgKyBtX21hdGNoZXJzLnNpemUoKSozMiApOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIoICI7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiBvciAiOworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX21hdGNoZXJzW2ldLT50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiICkiOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWF0Y2hBbnlPZjxBcmdUPiYgb3BlcmF0b3IgfHwgKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICAgICAgbV9tYXRjaGVycy5wdXNoX2JhY2soICZvdGhlciApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWF0Y2hlckJhc2U8QXJnVD4gY29uc3QqPiBtX21hdGNoZXJzOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+CisgICAgICAgIHN0cnVjdCBNYXRjaE5vdE9mIDogTWF0Y2hlckJhc2U8QXJnVD4geworCisgICAgICAgICAgICBNYXRjaE5vdE9mKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgdW5kZXJseWluZ01hdGNoZXIgKSA6IG1fdW5kZXJseWluZ01hdGNoZXIoIHVuZGVybHlpbmdNYXRjaGVyICkge30KKworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBBcmdUIGNvbnN0JiBhcmcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFtX3VuZGVybHlpbmdNYXRjaGVyLm1hdGNoKCBhcmcgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm5vdCAiICsgbV91bmRlcmx5aW5nTWF0Y2hlci50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWF0Y2hlckJhc2U8QXJnVD4gY29uc3QmIG1fdW5kZXJseWluZ01hdGNoZXI7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VCwgdHlwZW5hbWUgQ29tcGFyYXRvclQ+CisgICAgICAgIE1hdGNoQWxsT2Y8Q29tcGFyYXRvclQ+IE1hdGNoZXJCYXNlPE9iamVjdFQsIENvbXBhcmF0b3JUPjo6b3BlcmF0b3IgJiYgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gTWF0Y2hBbGxPZjxDb21wYXJhdG9yVD4oKSAmJiAqdGhpcyAmJiBvdGhlcjsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RULCB0eXBlbmFtZSBDb21wYXJhdG9yVD4KKyAgICAgICAgTWF0Y2hBbnlPZjxDb21wYXJhdG9yVD4gTWF0Y2hlckJhc2U8T2JqZWN0VCwgQ29tcGFyYXRvclQ+OjpvcGVyYXRvciB8fCAoIE1hdGNoZXJCYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBNYXRjaEFueU9mPENvbXBhcmF0b3JUPigpIHx8ICp0aGlzIHx8IG90aGVyOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQsIHR5cGVuYW1lIENvbXBhcmF0b3JUPgorICAgICAgICBNYXRjaE5vdE9mPENvbXBhcmF0b3JUPiBNYXRjaGVyQmFzZTxPYmplY3RULCBDb21wYXJhdG9yVD46Om9wZXJhdG9yICEgKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIE1hdGNoTm90T2Y8Q29tcGFyYXRvclQ+KCAqdGhpcyApOworICAgICAgICB9CisKKyAgICB9IC8vIG5hbWVzcGFjZSBJbXBsCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjcmVhdGUgdGhlIGFjdHVhbCBtYXRjaGVyIG9iamVjdHMuCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHR5cGVzIHRvIGJlIGluZmVycmVkCisgICAgLy8gLSBkZXByZWNhdGVkOiBwcmVmZXIgfHwsICYmIGFuZCAhCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hOb3RPZjxUPiBOb3QoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiB1bmRlcmx5aW5nTWF0Y2hlciApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoTm90T2Y8VD4oIHVuZGVybHlpbmdNYXRjaGVyICk7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoQWxsT2Y8VD4gQWxsT2YoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMSwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0yICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbGxPZjxUPigpICYmIG0xICYmIG0yOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaEFsbE9mPFQ+IEFsbE9mKCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTEsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMiwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0zICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbGxPZjxUPigpICYmIG0xICYmIG0yICYmIG0zOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaEFueU9mPFQ+IEFueU9mKCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTEsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMiApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoQW55T2Y8VD4oKSB8fCBtMSB8fCBtMjsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hBbnlPZjxUPiBBbnlPZiggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0xLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTIsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMyApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoQW55T2Y8VD4oKSB8fCBtMSB8fCBtMiB8fCBtMzsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCisKK3VzaW5nIG5hbWVzcGFjZSBNYXRjaGVyczsKK3VzaW5nIE1hdGNoZXJzOjpJbXBsOjpNYXRjaGVyQmFzZTsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBUZXN0RmFpbHVyZUV4Y2VwdGlvbnt9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgRXhwcmVzc2lvbkxoczsKKworICAgIHN0cnVjdCBDb3B5YWJsZVN0cmVhbSB7CisgICAgICAgIENvcHlhYmxlU3RyZWFtKCkge30KKyAgICAgICAgQ29weWFibGVTdHJlYW0oIENvcHlhYmxlU3RyZWFtIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgIG9zcyA8PCBvdGhlci5vc3Muc3RyKCk7CisgICAgICAgIH0KKyAgICAgICAgQ29weWFibGVTdHJlYW0mIG9wZXJhdG9yPSggQ29weWFibGVTdHJlYW0gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgb3NzLnN0cihzdGQ6OnN0cmluZygpKTsKKyAgICAgICAgICAgIG9zcyA8PCBvdGhlci5vc3Muc3RyKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICB9OworCisgICAgY2xhc3MgUmVzdWx0QnVpbGRlciA6IHB1YmxpYyBEZWNvbXBvc2VkRXhwcmVzc2lvbiB7CisgICAgcHVibGljOgorICAgICAgICBSZXN1bHRCdWlsZGVyKCAgY2hhciBjb25zdCogbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogc2Vjb25kQXJnID0gIiIgKTsKKyAgICAgICAgflJlc3VsdEJ1aWxkZXIoKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBFeHByZXNzaW9uTGhzPFQgY29uc3QmPiBvcGVyYXRvciA8PSAoIFQgY29uc3QmIG9wZXJhbmQgKTsKKyAgICAgICAgRXhwcmVzc2lvbkxoczxib29sPiBvcGVyYXRvciA8PSAoIGJvb2wgdmFsdWUgKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBSZXN1bHRCdWlsZGVyJiBvcGVyYXRvciA8PCAoIFQgY29uc3QmIHZhbHVlICkgeworICAgICAgICAgICAgbV9zdHJlYW0ub3NzIDw8IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgUmVzdWx0QnVpbGRlciYgc2V0UmVzdWx0VHlwZSggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0ICk7CisgICAgICAgIFJlc3VsdEJ1aWxkZXImIHNldFJlc3VsdFR5cGUoIGJvb2wgcmVzdWx0ICk7CisKKyAgICAgICAgdm9pZCBlbmRFeHByZXNzaW9uKCBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYgZXhwciApOworCisgICAgICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGJ1aWxkKCkgY29uc3Q7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCBidWlsZCggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKSBjb25zdDsKKworICAgICAgICB2b2lkIHVzZUFjdGl2ZUV4Y2VwdGlvbiggUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uID0gUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCApOworICAgICAgICB2b2lkIGNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUgKTsKKyAgICAgICAgdm9pZCBjYXB0dXJlRXhwcmVzc2lvbigpOworICAgICAgICB2b2lkIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIGV4cGVjdGVkTWVzc2FnZSApOworICAgICAgICB2b2lkIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJCYXNlPHN0ZDo6c3RyaW5nPiBjb25zdCYgbWF0Y2hlciApOworICAgICAgICB2b2lkIGhhbmRsZVJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKTsKKyAgICAgICAgdm9pZCByZWFjdCgpOworICAgICAgICBib29sIHNob3VsZERlYnVnQnJlYWsoKSBjb25zdDsKKyAgICAgICAgYm9vbCBhbGxvd1Rocm93cygpIGNvbnN0OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorICAgICAgICB2b2lkIGNhcHR1cmVNYXRjaCggQXJnVCBjb25zdCYgYXJnLCBNYXRjaGVyVCBjb25zdCYgbWF0Y2hlciwgY2hhciBjb25zdCogbWF0Y2hlclN0cmluZyApOworCisgICAgICAgIHZvaWQgc2V0RXhjZXB0aW9uR3VhcmQoKTsKKyAgICAgICAgdm9pZCB1bnNldEV4Y2VwdGlvbkd1YXJkKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBBc3NlcnRpb25JbmZvIG1fYXNzZXJ0aW9uSW5mbzsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBtX2RhdGE7CisgICAgICAgIENvcHlhYmxlU3RyZWFtIG1fc3RyZWFtOworCisgICAgICAgIGJvb2wgbV9zaG91bGREZWJ1Z0JyZWFrOworICAgICAgICBib29sIG1fc2hvdWxkVGhyb3c7CisgICAgICAgIGJvb2wgbV9ndWFyZEV4Y2VwdGlvbjsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyBJbmNsdWRlIGFmdGVyIGR1ZSB0byBjaXJjdWxhciBkZXBlbmRlbmN5OgorLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2V4cHJlc3Npb25fbGhzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVhQUkVTU0lPTl9MSFNfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9ldmFsdWF0ZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0VWQUxVQVRFX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDM4OSkgLy8gJz09JyA6IHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaAorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDMxMikgLy8gQ29udmVydGluZyBpbnQgdG8gVCogdXNpbmcgcmVpbnRlcnByZXRfY2FzdCAoaXNzdWUgb24geDY0IHBsYXRmb3JtKQorI2VuZGlmCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIEludGVybmFsIHsKKworICAgIGVudW0gT3BlcmF0b3IgeworICAgICAgICBJc0VxdWFsVG8sCisgICAgICAgIElzTm90RXF1YWxUbywKKyAgICAgICAgSXNMZXNzVGhhbiwKKyAgICAgICAgSXNHcmVhdGVyVGhhbiwKKyAgICAgICAgSXNMZXNzVGhhbk9yRXF1YWxUbywKKyAgICAgICAgSXNHcmVhdGVyVGhhbk9yRXF1YWxUbworICAgIH07CisKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzICAgICAgICAgICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICIqZXJyb3IqIjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzRXF1YWxUbz4gICAgICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIj09IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzTm90RXF1YWxUbz4gICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIiE9IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzTGVzc1RoYW4+ICAgICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIjwiOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNHcmVhdGVyVGhhbj4gICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPiI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0xlc3NUaGFuT3JFcXVhbFRvPiAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI8PSI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvPnsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI+PSI7IH0gfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIFQmIG9wQ2FzdChUIGNvbnN0JiB0KSB7IHJldHVybiBjb25zdF9jYXN0PFQmPih0KTsgfQorCisvLyBudWxscHRyX3Qgc3VwcG9ydCBiYXNlZCBvbiBwdWxsIHJlcXVlc3QgIzE1NCBmcm9tIEtvbnN0YW50aW4gQmF1bWFubgorI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisgICAgaW5saW5lIHN0ZDo6bnVsbHB0cl90IG9wQ2FzdChzdGQ6Om51bGxwdHJfdCkgeyByZXR1cm4gbnVsbHB0cjsgfQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisKKyAgICAvLyBTbyB0aGUgY29tcGFyZSBvdmVybG9hZHMgY2FuIGJlIG9wZXJhdG9yIGFnbm9zdGljIHdlIGNvbnZleSB0aGUgb3BlcmF0b3IgYXMgYSB0ZW1wbGF0ZQorICAgIC8vIGVudW0sIHdoaWNoIGlzIHVzZWQgdG8gc3BlY2lhbGlzZSBhbiBFdmFsdWF0b3IgZm9yIGRvaW5nIHRoZSBjb21wYXJpc29uLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgT3BlcmF0b3IgT3A+CisgICAgY2xhc3MgRXZhbHVhdG9ye307CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzRXF1YWxUbz4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocykgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPT0gIG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc05vdEVxdWFsVG8+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSAhPSBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNMZXNzVGhhbj4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApIDwgb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzR3JlYXRlclRoYW4+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA+IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPj0gb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzTGVzc1RoYW5PckVxdWFsVG8+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA8PSBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBib29sIGFwcGx5RXZhbHVhdG9yKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQxLCBUMiwgT3A+OjpldmFsdWF0ZSggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGxldmVsIG9mIGluZGlyZWN0aW9uIGFsbG93cyB1cyB0byBzcGVjaWFsaXNlIGZvciBpbnRlZ2VyIHR5cGVzCisgICAgLy8gdG8gYXZvaWQgc2lnbmVkLyB1bnNpZ25lZCB3YXJuaW5ncworCisgICAgLy8gImJhc2UiIG92ZXJsb2FkCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBib29sIGNvbXBhcmUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VDEsIFQyLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJocyApOworICAgIH0KKworICAgIC8vIHVuc2lnbmVkIFggdG8gaW50CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgaW50IGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBjaGFyIGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCByaHMgKSApOworICAgIH0KKworICAgIC8vIHVuc2lnbmVkIFggdG8gbG9uZworICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGludCBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIHJocyApICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGNoYXIgbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggcmhzICkgKTsKKyAgICB9CisKKyAgICAvLyBpbnQgdG8gdW5zaWduZWQgWAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGludCBsaHMsIHVuc2lnbmVkIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggaW50IGxocywgdW5zaWduZWQgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggaW50IGxocywgdW5zaWduZWQgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIGxocyApLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBsb25nIHRvIHVuc2lnbmVkIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgdW5zaWduZWQgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsaHMsIHVuc2lnbmVkIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgdW5zaWduZWQgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gcG9pbnRlciB0byBsb25nICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IE5VTEwpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggbG9uZyBsaHMsIFQqIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIFQqIGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCByaHMgKSApOworICAgIH0KKworICAgIC8vIHBvaW50ZXIgdG8gaW50ICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IE5VTEwpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggaW50IGxocywgVCogcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggcmVpbnRlcnByZXRfY2FzdDxUKj4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggVCogbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbGhzLCByZWludGVycHJldF9jYXN0PFQqPiggcmhzICkgKTsKKyAgICB9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisgICAgLy8gbG9uZyBsb25nIHRvIHVuc2lnbmVkIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgdW5zaWduZWQgbG9uZyBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgdW5zaWduZWQgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gdW5zaWduZWQgbG9uZyBsb25nIHRvIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDxsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8bG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsb25nIGxocywgbG9uZyBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8bG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsb25nIGxocywgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gcG9pbnRlciB0byBsb25nIGxvbmcgKHdoZW4gY29tcGFyaW5nIGFnYWluc3QgTlVMTCkKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCBUKiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCByZWludGVycHJldF9jYXN0PFQqPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBUKiBsaHMsIGxvbmcgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCByaHMgKSApOworICAgIH0KKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorICAgIC8vIHBvaW50ZXIgdG8gbnVsbHB0cl90ICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IG51bGxwdHIpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggc3RkOjpudWxscHRyX3QsIFQqIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIG51bGxwdHIsIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBUKiBsaHMsIHN0ZDo6bnVsbHB0cl90ICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbGhzLCBudWxscHRyICk7CisgICAgfQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisKK30gLy8gZW5kIG9mIG5hbWVzcGFjZSBJbnRlcm5hbAorfSAvLyBlbmQgb2YgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdG9zdHJpbmcuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVE9TVFJJTkdfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworI2lmZGVmIF9fT0JKQ19fCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfb2JqY19hcmMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9PQkpDX0FSQ19IUFBfSU5DTFVERUQKKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKyNpZmRlZiBfX2hhc19mZWF0dXJlCisjZGVmaW5lIENBVENIX0FSQ19FTkFCTEVEIF9faGFzX2ZlYXR1cmUob2JqY19hcmMpCisjZWxzZQorI2RlZmluZSBDQVRDSF9BUkNfRU5BQkxFRCAwCisjZW5kaWYKKwordm9pZCBhcmNTYWZlUmVsZWFzZSggTlNPYmplY3QqIG9iaiApOworaWQgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGlkIG9iaiwgU0VMIHNlbCApOworCisjaWYgIUNBVENIX0FSQ19FTkFCTEVECitpbmxpbmUgdm9pZCBhcmNTYWZlUmVsZWFzZSggTlNPYmplY3QqIG9iaiApIHsKKyAgICBbb2JqIHJlbGVhc2VdOworfQoraW5saW5lIGlkIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBpZCBvYmosIFNFTCBzZWwgKSB7CisgICAgaWYoIFtvYmogcmVzcG9uZHNUb1NlbGVjdG9yOiBzZWxdICkKKyAgICAgICAgcmV0dXJuIFtvYmogcGVyZm9ybVNlbGVjdG9yOiBzZWxdOworICAgIHJldHVybiBuaWw7Cit9CisjZGVmaW5lIENBVENIX1VOU0FGRV9VTlJFVEFJTkVECisjZGVmaW5lIENBVENIX0FSQ19TVFJPTkcKKyNlbHNlCitpbmxpbmUgdm9pZCBhcmNTYWZlUmVsZWFzZSggTlNPYmplY3QqICl7fQoraW5saW5lIGlkIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBpZCBvYmosIFNFTCBzZWwgKSB7CisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYXJjLXBlcmZvcm1TZWxlY3Rvci1sZWFrcyIKKyNlbmRpZgorICAgIGlmKCBbb2JqIHJlc3BvbmRzVG9TZWxlY3Rvcjogc2VsXSApCisgICAgICAgIHJldHVybiBbb2JqIHBlcmZvcm1TZWxlY3Rvcjogc2VsXTsKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorICAgIHJldHVybiBuaWw7Cit9CisjZGVmaW5lIENBVENIX1VOU0FGRV9VTlJFVEFJTkVEIF9fdW5zYWZlX3VucmV0YWluZWQKKyNkZWZpbmUgQ0FUQ0hfQVJDX1NUUk9ORyBfX3N0cm9uZworI2VuZGlmCisKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFCisjaW5jbHVkZSA8dHVwbGU+CisjZW5kaWYKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworLy8gV2h5IHdlJ3JlIGhlcmUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIFQgY29uc3QmIHZhbHVlICk7CisKKy8vIEJ1aWx0IGluIG92ZXJsb2FkcworCitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjp3c3RyaW5nIGNvbnN0JiB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY2hhciogY29uc3QgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCB3Y2hhcl90KiBjb25zdCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHdjaGFyX3QqIGNvbnN0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggaW50IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgbG9uZyB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGludCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGRvdWJsZSB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGZsb2F0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggYm9vbCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNoYXIgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzaWduZWQgY2hhciB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGNoYXIgdmFsdWUgKTsKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBsb25nIGxvbmcgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUgKTsKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6Om51bGxwdHJfdCApOworI2VuZGlmCisKKyNpZmRlZiBfX09CSkNfXworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyBjb25zdCAqIGNvbnN0JiBuc3N0cmluZyApOworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyAqIENBVENIX0FSQ19TVFJPTkcgY29uc3QmIG5zc3RyaW5nICk7CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TT2JqZWN0KiBjb25zdCYgbnNPYmplY3QgKTsKKyNlbmRpZgorCituYW1lc3BhY2UgRGV0YWlsIHsKKworICAgIGV4dGVybiBjb25zdCBzdGQ6OnN0cmluZyB1bnByaW50YWJsZVN0cmluZzsKKworICNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfU1RSRUFNX0lOU0VSVEFCTEVfQ0hFQ0spCisgICAgc3RydWN0IEJvcmdUeXBlIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gQm9yZ1R5cGUoIFQgY29uc3QmICk7CisgICAgfTsKKworICAgIHN0cnVjdCBUcnVlVHlwZSB7IGNoYXIgc2l6ZXJbMV07IH07CisgICAgc3RydWN0IEZhbHNlVHlwZSB7IGNoYXIgc2l6ZXJbMl07IH07CisKKyAgICBUcnVlVHlwZSYgdGVzdFN0cmVhbWFibGUoIHN0ZDo6b3N0cmVhbSYgKTsKKyAgICBGYWxzZVR5cGUgdGVzdFN0cmVhbWFibGUoIEZhbHNlVHlwZSApOworCisgICAgRmFsc2VUeXBlIG9wZXJhdG9yPDwoIHN0ZDo6b3N0cmVhbSBjb25zdCYsIEJvcmdUeXBlIGNvbnN0JiApOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgSXNTdHJlYW1JbnNlcnRhYmxlIHsKKyAgICAgICAgc3RhdGljIHN0ZDo6b3N0cmVhbSAmczsKKyAgICAgICAgc3RhdGljIFQgIGNvbnN0JnQ7CisgICAgICAgIGVudW0geyB2YWx1ZSA9IHNpemVvZiggdGVzdFN0cmVhbWFibGUocyA8PCB0KSApID09IHNpemVvZiggVHJ1ZVR5cGUgKSB9OworICAgIH07CisjZWxzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgSXNTdHJlYW1JbnNlcnRhYmxlIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgU1MsIHR5cGVuYW1lIFRUPgorICAgICAgICBzdGF0aWMgYXV0byB0ZXN0KGludCkKKyAgICAgICAgLT4gZGVjbHR5cGUoIHN0ZDo6ZGVjbHZhbDxTUyY+KCkgPDwgc3RkOjpkZWNsdmFsPFRUPigpLCBzdGQ6OnRydWVfdHlwZSgpICk7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgICAgICBzdGF0aWMgYXV0byB0ZXN0KC4uLikgLT4gc3RkOjpmYWxzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGRlY2x0eXBlKHRlc3Q8c3RkOjpvc3RyZWFtLGNvbnN0IFQmPigwKSk6OnZhbHVlOworICAgIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0pCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgICBib29sIElzRW51bSA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUKKyAgICAgICAgICAgICA+CisgICAgc3RydWN0IEVudW1TdHJpbmdNYWtlcgorICAgIHsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmICkgeyByZXR1cm4gdW5wcmludGFibGVTdHJpbmc7IH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgRW51bVN0cmluZ01ha2VyPFQsdHJ1ZT4KKyAgICB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiB2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDo6Q2F0Y2g6OnRvU3RyaW5nKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlPih2KQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9OworI2VuZGlmCisgICAgdGVtcGxhdGU8Ym9vbCBDPgorICAgIHN0cnVjdCBTdHJpbmdNYWtlckJhc2UgeworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0pCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiB2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVudW1TdHJpbmdNYWtlcjxUPjo6Y29udmVydCggdiApOworICAgICAgICB9CisjZWxzZQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgKSB7IHJldHVybiB1bnByaW50YWJsZVN0cmluZzsgfQorI2VuZGlmCisgICAgfTsKKworICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFrZXJCYXNlPHRydWU+IHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmIF92YWx1ZSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgX3ZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdGQ6OnN0cmluZyByYXdNZW1vcnlUb1N0cmluZyggY29uc3Qgdm9pZCAqb2JqZWN0LCBzdGQ6OnNpemVfdCBzaXplICk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBzdGQ6OnN0cmluZyByYXdNZW1vcnlUb1N0cmluZyggY29uc3QgVCYgb2JqZWN0ICkgeworICAgICAgcmV0dXJuIHJhd01lbW9yeVRvU3RyaW5nKCAmb2JqZWN0LCBzaXplb2Yob2JqZWN0KSApOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIERldGFpbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFN0cmluZ01ha2VyIDoKKyAgICBEZXRhaWw6OlN0cmluZ01ha2VyQmFzZTxEZXRhaWw6OklzU3RyZWFtSW5zZXJ0YWJsZTxUPjo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFN0cmluZ01ha2VyPFQqPiB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVSogcCApIHsKKyAgICAgICAgaWYoICFwICkKKyAgICAgICAgICAgIHJldHVybiAiTlVMTCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBEZXRhaWw6OnJhd01lbW9yeVRvU3RyaW5nKCBwICk7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQz4KK3N0cnVjdCBTdHJpbmdNYWtlcjxSIEM6Oio+IHsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggUiBDOjoqIHAgKSB7CisgICAgICAgIGlmKCAhcCApCisgICAgICAgICAgICByZXR1cm4gIk5VTEwiOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gRGV0YWlsOjpyYXdNZW1vcnlUb1N0cmluZyggcCApOworICAgIH0KK307CisKK25hbWVzcGFjZSBEZXRhaWwgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgICAgc3RkOjpzdHJpbmcgcmFuZ2VUb1N0cmluZyggSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0ICk7Cit9CisKKy8vdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQWxsb2NhdG9yPgorLy9zdHJ1Y3QgU3RyaW5nTWFrZXI8c3RkOjp2ZWN0b3I8VCwgQWxsb2NhdG9yPiA+IHsKKy8vICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBzdGQ6OnZlY3RvcjxULEFsbG9jYXRvcj4gY29uc3QmIHYgKSB7CisvLyAgICAgICAgcmV0dXJuIERldGFpbDo6cmFuZ2VUb1N0cmluZyggdi5iZWdpbigpLCB2LmVuZCgpICk7CisvLyAgICB9CisvL307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jYXRvcj4KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OnZlY3RvcjxULEFsbG9jYXRvcj4gY29uc3QmIHYgKSB7CisgICAgcmV0dXJuIERldGFpbDo6cmFuZ2VUb1N0cmluZyggdi5iZWdpbigpLCB2LmVuZCgpICk7Cit9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUKKworLy8gdG9TdHJpbmcgZm9yIHR1cGxlcworbmFtZXNwYWNlIFR1cGxlRGV0YWlsIHsKKyAgdGVtcGxhdGU8CisgICAgICB0eXBlbmFtZSBUdXBsZSwKKyAgICAgIHN0ZDo6c2l6ZV90IE4gPSAwLAorICAgICAgYm9vbCA9IChOIDwgc3RkOjp0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWUpCisgICAgICA+CisgIHN0cnVjdCBFbGVtZW50UHJpbnRlciB7CisgICAgICBzdGF0aWMgdm9pZCBwcmludCggY29uc3QgVHVwbGUmIHR1cGxlLCBzdGQ6Om9zdHJlYW0mIG9zICkKKyAgICAgIHsKKyAgICAgICAgICBvcyA8PCAoIE4gPyAiLCAiIDogIiAiICkKKyAgICAgICAgICAgICA8PCBDYXRjaDo6dG9TdHJpbmcoc3RkOjpnZXQ8Tj4odHVwbGUpKTsKKyAgICAgICAgICBFbGVtZW50UHJpbnRlcjxUdXBsZSxOKzE+OjpwcmludCh0dXBsZSxvcyk7CisgICAgICB9CisgIH07CisKKyAgdGVtcGxhdGU8CisgICAgICB0eXBlbmFtZSBUdXBsZSwKKyAgICAgIHN0ZDo6c2l6ZV90IE4KKyAgICAgID4KKyAgc3RydWN0IEVsZW1lbnRQcmludGVyPFR1cGxlLE4sZmFsc2U+IHsKKyAgICAgIHN0YXRpYyB2b2lkIHByaW50KCBjb25zdCBUdXBsZSYsIHN0ZDo6b3N0cmVhbSYgKSB7fQorICB9OworCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIC4uLlR5cGVzPgorc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6dHVwbGU8VHlwZXMuLi4+PiB7CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggY29uc3Qgc3RkOjp0dXBsZTxUeXBlcy4uLj4mIHR1cGxlICkKKyAgICB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgICAgb3MgPDwgJ3snOworICAgICAgICBUdXBsZURldGFpbDo6RWxlbWVudFByaW50ZXI8c3RkOjp0dXBsZTxUeXBlcy4uLj4+OjpwcmludCggdHVwbGUsIG9zICk7CisgICAgICAgIG9zIDw8ICIgfSI7CisgICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9Cit9OworI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRQorCituYW1lc3BhY2UgRGV0YWlsIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0ZDo6c3RyaW5nIG1ha2VTdHJpbmcoIFQgY29uc3QmIHZhbHVlICkgeworICAgICAgICByZXR1cm4gU3RyaW5nTWFrZXI8VD46OmNvbnZlcnQoIHZhbHVlICk7CisgICAgfQorfSAvLyBlbmQgbmFtZXNwYWNlIERldGFpbAorCisvLy8gXGJyaWVmIGNvbnZlcnRzIGFueSB0eXBlIHRvIGEgc3RyaW5nCisvLy8KKy8vLyBUaGUgZGVmYXVsdCB0ZW1wbGF0ZSBmb3J3YXJkcyBvbiB0byBvc3RyaW5nc3RyZWFtIC0gZXhjZXB0IHdoZW4gYW4KKy8vLyBvc3RyaW5nc3RyZWFtIG92ZXJsb2FkIGRvZXMgbm90IGV4aXN0IC0gaW4gd2hpY2ggY2FzZSBpdCBhdHRlbXB0cyB0byBkZXRlY3QKKy8vLyB0aGF0IGFuZCB3cml0ZXMgez99LgorLy8vIE92ZXJsb2FkIChub3Qgc3BlY2lhbGlzZSkgdGhpcyB0ZW1wbGF0ZSBmb3IgY3VzdG9tIHR5cHMgdGhhdCB5b3UgZG9uJ3Qgd2FudAorLy8vIHRvIHByb3ZpZGUgYW4gb3N0cmVhbSBvdmVybG9hZCBmb3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIFQgY29uc3QmIHZhbHVlICkgeworICAgIHJldHVybiBTdHJpbmdNYWtlcjxUPjo6Y29udmVydCggdmFsdWUgKTsKK30KKworICAgIG5hbWVzcGFjZSBEZXRhaWwgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgICAgc3RkOjpzdHJpbmcgcmFuZ2VUb1N0cmluZyggSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0ICkgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICBvc3MgPDwgInsgIjsKKyAgICAgICAgaWYoIGZpcnN0ICE9IGxhc3QgKSB7CisgICAgICAgICAgICBvc3MgPDwgQ2F0Y2g6OnRvU3RyaW5nKCAqZmlyc3QgKTsKKyAgICAgICAgICAgIGZvciggKytmaXJzdCA7IGZpcnN0ICE9IGxhc3QgOyArK2ZpcnN0ICkKKyAgICAgICAgICAgICAgICBvc3MgPDwgIiwgIiA8PCBDYXRjaDo6dG9TdHJpbmcoICpmaXJzdCApOworICAgICAgICB9CisgICAgICAgIG9zcyA8PCAiIH0iOworICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1QsIEludGVybmFsOjpPcGVyYXRvciBPcCwgdHlwZW5hbWUgUmhzVD4KK2NsYXNzIEJpbmFyeUV4cHJlc3Npb247CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorY2xhc3MgTWF0Y2hFeHByZXNzaW9uOworCisvLyBXcmFwcyB0aGUgTEhTIG9mIGFuIGV4cHJlc3Npb24gYW5kIG92ZXJsb2FkcyBjb21wYXJpc29uIG9wZXJhdG9ycworLy8gZm9yIGFsc28gY2FwdHVyaW5nIHRob3NlIGFuZCBSSFMgKGlmIGFueSkKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBFeHByZXNzaW9uTGhzIDogcHVibGljIERlY29tcG9zZWRFeHByZXNzaW9uIHsKK3B1YmxpYzoKKyAgICBFeHByZXNzaW9uTGhzKCBSZXN1bHRCdWlsZGVyJiByYiwgVCBsaHMgKSA6IG1fcmIoIHJiICksIG1fbGhzKCBsaHMgKSwgbV90cnV0aHkoZmFsc2UpIHt9CisKKyAgICBFeHByZXNzaW9uTGhzJiBvcGVyYXRvciA9ICggY29uc3QgRXhwcmVzc2lvbkxocyYgKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNFcXVhbFRvLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA9PSAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0VxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzTm90RXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgIT0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNOb3RFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0xlc3NUaGFuLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA8ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzTGVzc1RoYW4+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzR3JlYXRlclRoYW4sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yID4gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbj4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNMZXNzVGhhbk9yRXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPD0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNMZXNzVGhhbk9yRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbk9yRXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPj0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbk9yRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzRXF1YWxUbywgYm9vbD4gb3BlcmF0b3IgPT0gKCBib29sIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0VxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc05vdEVxdWFsVG8sIGJvb2w+IG9wZXJhdG9yICE9ICggYm9vbCByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNOb3RFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgdm9pZCBlbmRFeHByZXNzaW9uKCkgeworICAgICAgICBtX3RydXRoeSA9IG1fbGhzID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBtX3JiCisgICAgICAgICAgICAuc2V0UmVzdWx0VHlwZSggbV90cnV0aHkgKQorICAgICAgICAgICAgLmVuZEV4cHJlc3Npb24oICp0aGlzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGRlc3QgPSBDYXRjaDo6dG9TdHJpbmcoIG1fdHJ1dGh5ICk7CisgICAgfQorCitwcml2YXRlOgorICAgIHRlbXBsYXRlPEludGVybmFsOjpPcGVyYXRvciBPcCwgdHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBSaHNUJj4gY2FwdHVyZUV4cHJlc3Npb24oIFJoc1QmIHJocyApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEJpbmFyeUV4cHJlc3Npb248VCwgT3AsIFJoc1QmPiggbV9yYiwgbV9saHMsIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPEludGVybmFsOjpPcGVyYXRvciBPcD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBib29sPiBjYXB0dXJlRXhwcmVzc2lvbiggYm9vbCByaHMgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBib29sPiggbV9yYiwgbV9saHMsIHJocyApOworICAgIH0KKworcHJpdmF0ZToKKyAgICBSZXN1bHRCdWlsZGVyJiBtX3JiOworICAgIFQgbV9saHM7CisgICAgYm9vbCBtX3RydXRoeTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1QsIEludGVybmFsOjpPcGVyYXRvciBPcCwgdHlwZW5hbWUgUmhzVD4KK2NsYXNzIEJpbmFyeUV4cHJlc3Npb24gOiBwdWJsaWMgRGVjb21wb3NlZEV4cHJlc3Npb24geworcHVibGljOgorICAgIEJpbmFyeUV4cHJlc3Npb24oIFJlc3VsdEJ1aWxkZXImIHJiLCBMaHNUIGxocywgUmhzVCByaHMgKQorICAgICAgICA6IG1fcmIoIHJiICksIG1fbGhzKCBsaHMgKSwgbV9yaHMoIHJocyApIHt9CisKKyAgICBCaW5hcnlFeHByZXNzaW9uJiBvcGVyYXRvciA9ICggQmluYXJ5RXhwcmVzc2lvbiYgKTsKKworICAgIHZvaWQgZW5kRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgbV9yYgorICAgICAgICAgICAgLnNldFJlc3VsdFR5cGUoIEludGVybmFsOjpjb21wYXJlPE9wPiggbV9saHMsIG1fcmhzICkgKQorICAgICAgICAgICAgLmVuZEV4cHJlc3Npb24oICp0aGlzICk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzQmluYXJ5RXhwcmVzc2lvbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxocyA9IENhdGNoOjp0b1N0cmluZyggbV9saHMgKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmhzID0gQ2F0Y2g6OnRvU3RyaW5nKCBtX3JocyApOworICAgICAgICBjaGFyIGRlbGltID0gbGhzLnNpemUoKSArIHJocy5zaXplKCkgPCA0MCAmJgorICAgICAgICAgICAgICAgICAgICAgbGhzLmZpbmQoJ1xuJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYKKyAgICAgICAgICAgICAgICAgICAgIHJocy5maW5kKCdcbicpID09IHN0ZDo6c3RyaW5nOjpucG9zID8gJyAnIDogJ1xuJzsKKyAgICAgICAgZGVzdC5yZXNlcnZlKCA3ICsgbGhzLnNpemUoKSArIHJocy5zaXplKCkgKTsKKyAgICAgICAgICAgICAgICAgICAvLyAyIGZvciBzcGFjZXMgYXJvdW5kIG9wZXJhdG9yCisgICAgICAgICAgICAgICAgICAgLy8gMiBmb3Igb3BlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAvLyAyIGZvciBwYXJlbnRoZXNlcyAoY29uZGl0aW9uYWxseSBhZGRlZCBsYXRlcikKKyAgICAgICAgICAgICAgICAgICAvLyAxIGZvciBuZWdhdGlvbiAoY29uZGl0aW9uYWxseSBhZGRlZCBsYXRlcikKKyAgICAgICAgZGVzdCA9IGxoczsKKyAgICAgICAgZGVzdCArPSBkZWxpbTsKKyAgICAgICAgZGVzdCArPSBJbnRlcm5hbDo6T3BlcmF0b3JUcmFpdHM8T3A+OjpnZXROYW1lKCk7CisgICAgICAgIGRlc3QgKz0gZGVsaW07CisgICAgICAgIGRlc3QgKz0gcmhzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBSZXN1bHRCdWlsZGVyJiBtX3JiOworICAgIExoc1QgbV9saHM7CisgICAgUmhzVCBtX3JoczsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorY2xhc3MgTWF0Y2hFeHByZXNzaW9uIDogcHVibGljIERlY29tcG9zZWRFeHByZXNzaW9uIHsKK3B1YmxpYzoKKyAgICBNYXRjaEV4cHJlc3Npb24oIEFyZ1QgYXJnLCBNYXRjaGVyVCBtYXRjaGVyLCBjaGFyIGNvbnN0KiBtYXRjaGVyU3RyaW5nICkKKyAgICAgICAgOiBtX2FyZyggYXJnICksIG1fbWF0Y2hlciggbWF0Y2hlciApLCBtX21hdGNoZXJTdHJpbmcoIG1hdGNoZXJTdHJpbmcgKSB7fQorCisgICAgdmlydHVhbCBib29sIGlzQmluYXJ5RXhwcmVzc2lvbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1hdGNoZXJBc1N0cmluZyA9IG1fbWF0Y2hlci50b1N0cmluZygpOworICAgICAgICBkZXN0ID0gQ2F0Y2g6OnRvU3RyaW5nKCBtX2FyZyApOworICAgICAgICBkZXN0ICs9ICcgJzsKKyAgICAgICAgaWYoIG1hdGNoZXJBc1N0cmluZyA9PSBEZXRhaWw6OnVucHJpbnRhYmxlU3RyaW5nICkKKyAgICAgICAgICAgIGRlc3QgKz0gbV9tYXRjaGVyU3RyaW5nOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkZXN0ICs9IG1hdGNoZXJBc1N0cmluZzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQXJnVCBtX2FyZzsKKyAgICBNYXRjaGVyVCBtX21hdGNoZXI7CisgICAgY2hhciBjb25zdCogbV9tYXRjaGVyU3RyaW5nOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEV4cHJlc3Npb25MaHM8VCBjb25zdCY+IFJlc3VsdEJ1aWxkZXI6Om9wZXJhdG9yIDw9ICggVCBjb25zdCYgb3BlcmFuZCApIHsKKyAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25MaHM8VCBjb25zdCY+KCAqdGhpcywgb3BlcmFuZCApOworICAgIH0KKworICAgIGlubGluZSBFeHByZXNzaW9uTGhzPGJvb2w+IFJlc3VsdEJ1aWxkZXI6Om9wZXJhdG9yIDw9ICggYm9vbCB2YWx1ZSApIHsKKyAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25MaHM8Ym9vbD4oICp0aGlzLCB2YWx1ZSApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorICAgIGlubGluZSB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVNYXRjaCggQXJnVCBjb25zdCYgYXJnLCBNYXRjaGVyVCBjb25zdCYgbWF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIG1hdGNoZXJTdHJpbmcgKSB7CisgICAgICAgIE1hdGNoRXhwcmVzc2lvbjxBcmdUIGNvbnN0JiwgTWF0Y2hlclQgY29uc3QmPiBleHByKCBhcmcsIG1hdGNoZXIsIG1hdGNoZXJTdHJpbmcgKTsKKyAgICAgICAgc2V0UmVzdWx0VHlwZSggbWF0Y2hlci5tYXRjaCggYXJnICkgKTsKKyAgICAgICAgZW5kRXhwcmVzc2lvbiggZXhwciApOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX21lc3NhZ2UuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUVTU0FHRV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgTWVzc2FnZUluZm8geworICAgICAgICBNZXNzYWdlSW5mbyggICAgc3RkOjpzdHJpbmcgY29uc3QmIF9tYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgX3R5cGUgKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBtYWNyb05hbWU7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSB0eXBlOworICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOworICAgICAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIE1lc3NhZ2VJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZSA9PSBvdGhlci5zZXF1ZW5jZTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBNZXNzYWdlSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2UgPCBvdGhlci5zZXF1ZW5jZTsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2xvYmFsQ291bnQ7CisgICAgfTsKKworICAgIHN0cnVjdCBNZXNzYWdlQnVpbGRlciB7CisgICAgICAgIE1lc3NhZ2VCdWlsZGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgdHlwZSApCisgICAgICAgIDogbV9pbmZvKCBtYWNyb05hbWUsIGxpbmVJbmZvLCB0eXBlICkKKyAgICAgICAge30KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBNZXNzYWdlQnVpbGRlciYgb3BlcmF0b3IgPDwgKCBUIGNvbnN0JiB2YWx1ZSApIHsKKyAgICAgICAgICAgIG1fc3RyZWFtIDw8IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgTWVzc2FnZUluZm8gbV9pbmZvOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbV9zdHJlYW07CisgICAgfTsKKworICAgIGNsYXNzIFNjb3BlZE1lc3NhZ2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgU2NvcGVkTWVzc2FnZSggTWVzc2FnZUJ1aWxkZXIgY29uc3QmIGJ1aWxkZXIgKTsKKyAgICAgICAgU2NvcGVkTWVzc2FnZSggU2NvcGVkTWVzc2FnZSBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgflNjb3BlZE1lc3NhZ2UoKTsKKworICAgICAgICBNZXNzYWdlSW5mbyBtX2luZm87CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX2NhcHR1cmUuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19DQVBUVVJFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RDYXNlOworICAgIGNsYXNzIEFzc2VydGlvblJlc3VsdDsKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uSW5mbzsKKyAgICBzdHJ1Y3QgU2VjdGlvbkluZm87CisgICAgc3RydWN0IFNlY3Rpb25FbmRJbmZvOworICAgIHN0cnVjdCBNZXNzYWdlSW5mbzsKKyAgICBjbGFzcyBTY29wZWRNZXNzYWdlQnVpbGRlcjsKKyAgICBzdHJ1Y3QgQ291bnRzOworCisgICAgc3RydWN0IElSZXN1bHRDYXB0dXJlIHsKKworICAgICAgICB2aXJ0dWFsIH5JUmVzdWx0Q2FwdHVyZSgpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBzZWN0aW9uU3RhcnRlZCggICAgU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cyYgYXNzZXJ0aW9ucyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWRFYXJseSggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBwdXNoU2NvcGVkTWVzc2FnZSggTWVzc2FnZUluZm8gY29uc3QmIG1lc3NhZ2UgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBwb3BTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEN1cnJlbnRUZXN0TmFtZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBjb25zdCBBc3NlcnRpb25SZXN1bHQqIGdldExhc3RSZXN1bHQoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGV4Y2VwdGlvbkVhcmx5UmVwb3J0ZWQoKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGhhbmRsZUZhdGFsRXJyb3JDb25kaXRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkgPSAwOworICAgIH07CisKKyAgICBJUmVzdWx0Q2FwdHVyZSYgZ2V0UmVzdWx0Q2FwdHVyZSgpOworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZGVidWdnZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfREVCVUdHRVJfSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcGxhdGZvcm0uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUExBVEZPUk1fSF9JTkNMVURFRAorCisjaWYgZGVmaW5lZChfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEKQorIyAgZGVmaW5lIENBVENIX1BMQVRGT1JNX01BQworI2VsaWYgIGRlZmluZWQoX19JUEhPTkVfT1NfVkVSU0lPTl9NSU5fUkVRVUlSRUQpCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fSVBIT05FCisjZWxpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fbGludXgpIHx8IGRlZmluZWQoX19saW51eF9fKQorIyAgZGVmaW5lIENBVENIX1BMQVRGT1JNX0xJTlVYCisjZWxpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX01TQ19WRVIpCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworIyAgaWYgIWRlZmluZWQoTk9NSU5NQVgpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19OT01JTk1BWCkKKyMgICAgZGVmaW5lIENBVENIX0RFRklORVNfTk9NSU5NQVgKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChXSU4zMl9MRUFOX0FORF9NRUFOKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fV0lOMzJfTEVBTl9BTkRfTUVBTikKKyMgICAgZGVmaW5lIENBVENIX0RFRklORVNfV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2h7CisKKyAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKTsKKyAgICB2b2lkIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICk7Cit9CisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9NQUMKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBzbmlwcGV0IGJhc2VkIG9uOgorICAgIC8vIGh0dHA6Ly9jb2NvYXdpdGhsb3ZlLmNvbS8yMDA4LzAzL2JyZWFrLWludG8tZGVidWdnZXIuaHRtbAorICAgICNpZiBkZWZpbmVkKF9fcHBjNjRfXykgfHwgZGVmaW5lZChfX3BwY19fKQorICAgICAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBcCisgICAgICAgICAgICAgICAgX19hc21fXygibGkgcjAsIDIwXG5zY1xubm9wXG5saSByMCwgMzdcbmxpIHI0LCAyXG5zY1xubm9wXG4iIFwKKyAgICAgICAgICAgICAgICA6IDogOiAibWVtb3J5IiwicjAiLCJyMyIsInI0IiApCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgX19hc21fXygiaW50ICQzXG4iIDogOiApCisgICAgI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoQ0FUQ0hfUExBVEZPUk1fTElOVVgpCisgICAgLy8gSWYgd2UgY2FuIHVzZSBpbmxpbmUgYXNzZW1ibGVyLCBkbyBpdCBiZWNhdXNlIHRoaXMgYWxsb3dzIHVzIHRvIGJyZWFrCisgICAgLy8gZGlyZWN0bHkgYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBmYWlsaW5nIGNoZWNrIGluc3RlYWQgb2YgYnJlYWtpbmcgaW5zaWRlCisgICAgLy8gcmFpc2UoKSBjYWxsZWQgZnJvbSBpdCwgaS5lLiBvbmUgc3RhY2sgZnJhbWUgYmVsb3cuCisgICAgI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX3g4Nl82NCkpCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIGFzbSB2b2xhdGlsZSAoImludCAkMyIpCisgICAgI2Vsc2UgLy8gRmFsbCBiYWNrIHRvIHRoZSBnZW5lcmljIHdheS4KKyAgICAgICAgI2luY2x1ZGUgPHNpZ25hbC5oPgorCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIHJhaXNlKFNJR1RSQVApCisgICAgI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIF9fZGVidWdicmVhaygpCisjZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAgIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgX19zdGRjYWxsIERlYnVnQnJlYWsoKTsKKyAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBEZWJ1Z0JyZWFrKCkKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfVFJBUAorICAgICNkZWZpbmUgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUigpIGlmKCBDYXRjaDo6aXNEZWJ1Z2dlckFjdGl2ZSgpICkgeyBDQVRDSF9UUkFQKCk7IH0KKyNlbHNlCisgICAgI2RlZmluZSBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSKCkgQ2F0Y2g6OmFsd2F5c1RydWUoKTsKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19ydW5uZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19SVU5ORVJfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIGNsYXNzIFRlc3RDYXNlOworCisgICAgc3RydWN0IElSdW5uZXIgeworICAgICAgICB2aXJ0dWFsIH5JUnVubmVyKCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBhYm9ydGluZygpIGNvbnN0ID0gMDsKKyAgICB9OworfQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gV2UgY2FuIHNwZWVkdXAgY29tcGlsYXRpb24gc2lnbmlmaWNhbnRseSBieSBicmVha2luZyBpbnRvIGRlYnVnZ2VyIGxvd2VyIGluCisvLyB0aGUgY2FsbHN0YWNrLCBiZWNhdXNlIHRoZW4gd2UgZG9uJ3QgaGF2ZSB0byBleHBhbmQgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUgorLy8gbWFjcm8gaW4gZWFjaCBhc3NlcnRpb24KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIHJlc3VsdEJ1aWxkZXIgKSBcCisgICAgcmVzdWx0QnVpbGRlci5yZWFjdCgpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBbm90aGVyIHdheSB0byBzcGVlZC11cCBjb21waWxhdGlvbiBpcyB0byBvbWl0IGxvY2FsIHRyeS1jYXRjaCBmb3IgUkVRVUlSRSoKKy8vIG1hY3Jvcy4KKy8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGNhdXNlIGZhbHNlIG5lZ2F0aXZlLCBpZiB0aGUgdGVzdCBjb2RlIGNhdGNoZXMKKy8vIHRoZSBleGNlcHRpb24gYmVmb3JlIGl0IHByb3BhZ2F0ZXMgYmFjayB1cCB0byB0aGUgcnVubmVyLgorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX05PX1RSWSggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC5zZXRFeGNlcHRpb25HdWFyZCgpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgKCBfX2NhdGNoUmVzdWx0IDw9IGV4cHIgKS5lbmRFeHByZXNzaW9uKCk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQudW5zZXRFeGNlcHRpb25HdWFyZCgpOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjppc1RydWUoIGZhbHNlICYmIHN0YXRpY19jYXN0PGJvb2w+KCAhIShleHByKSApICkgKSAvLyBleHByIGhlcmUgaXMgbmV2ZXIgZXZhbHVhdGVkIGF0IHJ1bnRpbWUgYnV0IGl0IGZvcmNlcyB0aGUgY29tcGlsZXIgdG8gZ2l2ZSBpdCBhIGxvb2sKKy8vIFRoZSBkb3VibGUgbmVnYXRpb24gc2lsZW5jZXMgTVNWQydzIEM0ODAwIHdhcm5pbmcsIHRoZSBzdGF0aWNfY2FzdCBmb3JjZXMgc2hvcnQtY2lyY3VpdCBldmFsdWF0aW9uIGlmIHRoZSB0eXBlIGhhcyBvdmVybG9hZGVkICYmLgorCisjZGVmaW5lIElOVEVSTkFMX0NIRUNLX1RIQVRfTk9fVFJZKCBtYWNyb05hbWUsIG1hdGNoZXIsIHJlc3VsdERpc3Bvc2l0aW9uLCBhcmcgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNhcmcgIiwgIiAjbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LnNldEV4Y2VwdGlvbkd1YXJkKCk7IFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlTWF0Y2goIGFyZywgbWF0Y2hlciwgI21hdGNoZXIgKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LnVuc2V0RXhjZXB0aW9uR3VhcmQoKTsgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKyNlbHNlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlIHdvcmtzIG91dCBpZiB0aGUgZGVidWdnZXIgbmVlZHMgdG8gYmUgaW52b2tlZAorLy8gYW5kL29yIGFuIGV4Y2VwdGlvbiB0aHJvd24gYW5kIHRha2VzIGFwcHJvcHJpYXRlIGFjdGlvbi4KKy8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBhcyBhIG1hY3JvIHNvIHRoZSBkZWJ1Z2dlciB3aWxsIHN0b3AgaW4gdGhlIHVzZXIKKy8vIHNvdXJjZSBjb2RlIHJhdGhlciB0aGFuIGluIENhdGNoIGxpYnJhcnkgY29kZQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUFDVCggcmVzdWx0QnVpbGRlciApIFwKKyAgICBpZiggcmVzdWx0QnVpbGRlci5zaG91bGREZWJ1Z0JyZWFrKCkgKSBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSKCk7IFwKKyAgICByZXN1bHRCdWlsZGVyLnJlYWN0KCk7CisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgICAgICAoIF9fY2F0Y2hSZXN1bHQgPD0gZXhwciApLmVuZEV4cHJlc3Npb24oKTsgXAorICAgICAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgIH0gXAorICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmlzVHJ1ZSggZmFsc2UgJiYgc3RhdGljX2Nhc3Q8Ym9vbD4oICEhKGV4cHIpICkgKSApIC8vIGV4cHIgaGVyZSBpcyBuZXZlciBldmFsdWF0ZWQgYXQgcnVudGltZSBidXQgaXQgZm9yY2VzIHRoZSBjb21waWxlciB0byBnaXZlIGl0IGEgbG9vaworICAgIC8vIFRoZSBkb3VibGUgbmVnYXRpb24gc2lsZW5jZXMgTVNWQydzIEM0ODAwIHdhcm5pbmcsIHRoZSBzdGF0aWNfY2FzdCBmb3JjZXMgc2hvcnQtY2lyY3VpdCBldmFsdWF0aW9uIGlmIHRoZSB0eXBlIGhhcyBvdmVybG9hZGVkICYmLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0lGKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIElOVEVSTkFMX0NBVENIX1RFU1QoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKTsgXAorICAgIGlmKCBDYXRjaDo6Z2V0UmVzdWx0Q2FwdHVyZSgpLmdldExhc3RSZXN1bHQoKS0+c3VjY2VlZGVkKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0VMU0UoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVCggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApOyBcCisgICAgaWYoICFDYXRjaDo6Z2V0UmVzdWx0Q2FwdHVyZSgpLmdldExhc3RSZXN1bHQoKS0+c3VjY2VlZGVkKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihleHByKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgIH0gXAorICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RIUk9XUyggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgbWF0Y2hlciwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIsIHJlc3VsdERpc3Bvc2l0aW9uLCAjbWF0Y2hlciApOyBcCisgICAgICAgIGlmKCBfX2NhdGNoUmVzdWx0LmFsbG93VGhyb3dzKCkgKSBcCisgICAgICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZD4oZXhwcik7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb24gKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIG1hdGNoZXIgKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoIG1hY3JvTmFtZSwgZXhjZXB0aW9uVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByICIsICIgI2V4Y2VwdGlvblR5cGUsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgaWYoIF9fY2F0Y2hSZXN1bHQuYWxsb3dUaHJvd3MoKSApIFwKKyAgICAgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihleHByKTsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbiApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGNhdGNoKCBleGNlcHRpb25UeXBlICkgeyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01TRyggbWFjcm9OYW1lLCBtZXNzYWdlVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIC4uLiApIFwKKyAgICAgICAgZG8geyBcCisgICAgICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAiIiwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdCA8PCBfX1ZBX0FSR1NfXyArIDo6Q2F0Y2g6OlN0cmVhbUVuZFN0b3AoKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBtZXNzYWdlVHlwZSApOyBcCisgICAgICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICAgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorI2Vsc2UKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01TRyggbWFjcm9OYW1lLCBtZXNzYWdlVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIGxvZyApIFwKKyAgICAgICAgZG8geyBcCisgICAgICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAiIiwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdCA8PCBsb2cgKyA6OkNhdGNoOjpTdHJlYW1FbmRTdG9wKCk7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggbWVzc2FnZVR5cGUgKTsgXAorICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0lORk8oIG1hY3JvTmFtZSwgbG9nICkgXAorICAgIENhdGNoOjpTY29wZWRNZXNzYWdlIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBzY29wZWRNZXNzYWdlICkgPSBDYXRjaDo6TWVzc2FnZUJ1aWxkZXIoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpSZXN1bHRXYXM6OkluZm8gKSA8PCBsb2c7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0hFQ0tfVEhBVCggbWFjcm9OYW1lLCBtYXRjaGVyLCByZXN1bHREaXNwb3NpdGlvbiwgYXJnICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjYXJnICIsICIgI21hdGNoZXIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgdHJ5IHsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlTWF0Y2goIGFyZywgbWF0Y2hlciwgI21hdGNoZXIgKTsgXAorICAgICAgICB9IGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQudXNlQWN0aXZlRXhjZXB0aW9uKCByZXN1bHREaXNwb3NpdGlvbiB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfc2VjdGlvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TRUNUSU9OX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3NlY3Rpb25faW5mby5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TRUNUSU9OX0lORk9fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdG90YWxzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVE9UQUxTX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb3VudHMgeworICAgICAgICBDb3VudHMoKSA6IHBhc3NlZCggMCApLCBmYWlsZWQoIDAgKSwgZmFpbGVkQnV0T2soIDAgKSB7fQorCisgICAgICAgIENvdW50cyBvcGVyYXRvciAtICggQ291bnRzIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIENvdW50cyBkaWZmOworICAgICAgICAgICAgZGlmZi5wYXNzZWQgPSBwYXNzZWQgLSBvdGhlci5wYXNzZWQ7CisgICAgICAgICAgICBkaWZmLmZhaWxlZCA9IGZhaWxlZCAtIG90aGVyLmZhaWxlZDsKKyAgICAgICAgICAgIGRpZmYuZmFpbGVkQnV0T2sgPSBmYWlsZWRCdXRPayAtIG90aGVyLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgcmV0dXJuIGRpZmY7CisgICAgICAgIH0KKyAgICAgICAgQ291bnRzJiBvcGVyYXRvciArPSAoIENvdW50cyBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICBwYXNzZWQgKz0gb3RoZXIucGFzc2VkOworICAgICAgICAgICAgZmFpbGVkICs9IG90aGVyLmZhaWxlZDsKKyAgICAgICAgICAgIGZhaWxlZEJ1dE9rICs9IG90aGVyLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgdG90YWwoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gcGFzc2VkICsgZmFpbGVkICsgZmFpbGVkQnV0T2s7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBhbGxQYXNzZWQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gZmFpbGVkID09IDAgJiYgZmFpbGVkQnV0T2sgPT0gMDsKKyAgICAgICAgfQorICAgICAgICBib29sIGFsbE9rKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGZhaWxlZCA9PSAwOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgcGFzc2VkOworICAgICAgICBzdGQ6OnNpemVfdCBmYWlsZWQ7CisgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZEJ1dE9rOworICAgIH07CisKKyAgICBzdHJ1Y3QgVG90YWxzIHsKKworICAgICAgICBUb3RhbHMgb3BlcmF0b3IgLSAoIFRvdGFscyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICBUb3RhbHMgZGlmZjsKKyAgICAgICAgICAgIGRpZmYuYXNzZXJ0aW9ucyA9IGFzc2VydGlvbnMgLSBvdGhlci5hc3NlcnRpb25zOworICAgICAgICAgICAgZGlmZi50ZXN0Q2FzZXMgPSB0ZXN0Q2FzZXMgLSBvdGhlci50ZXN0Q2FzZXM7CisgICAgICAgICAgICByZXR1cm4gZGlmZjsKKyAgICAgICAgfQorCisgICAgICAgIFRvdGFscyBkZWx0YSggVG90YWxzIGNvbnN0JiBwcmV2VG90YWxzICkgY29uc3QgeworICAgICAgICAgICAgVG90YWxzIGRpZmYgPSAqdGhpcyAtIHByZXZUb3RhbHM7CisgICAgICAgICAgICBpZiggZGlmZi5hc3NlcnRpb25zLmZhaWxlZCA+IDAgKQorICAgICAgICAgICAgICAgICsrZGlmZi50ZXN0Q2FzZXMuZmFpbGVkOworICAgICAgICAgICAgZWxzZSBpZiggZGlmZi5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rID4gMCApCisgICAgICAgICAgICAgICAgKytkaWZmLnRlc3RDYXNlcy5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICArK2RpZmYudGVzdENhc2VzLnBhc3NlZDsKKyAgICAgICAgICAgIHJldHVybiBkaWZmOworICAgICAgICB9CisKKyAgICAgICAgVG90YWxzJiBvcGVyYXRvciArPSAoIFRvdGFscyBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICBhc3NlcnRpb25zICs9IG90aGVyLmFzc2VydGlvbnM7CisgICAgICAgICAgICB0ZXN0Q2FzZXMgKz0gb3RoZXIudGVzdENhc2VzOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQ291bnRzIGFzc2VydGlvbnM7CisgICAgICAgIENvdW50cyB0ZXN0Q2FzZXM7CisgICAgfTsKK30KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTZWN0aW9uSW5mbyB7CisgICAgICAgIFNlY3Rpb25JbmZvCisgICAgICAgICAgICAoICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjcmlwdGlvbiA9IHN0ZDo6c3RyaW5nKCkgKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgfTsKKworICAgIHN0cnVjdCBTZWN0aW9uRW5kSW5mbyB7CisgICAgICAgIFNlY3Rpb25FbmRJbmZvKCBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvLCBDb3VudHMgY29uc3QmIF9wcmV2QXNzZXJ0aW9ucywgZG91YmxlIF9kdXJhdGlvbkluU2Vjb25kcyApCisgICAgICAgIDogc2VjdGlvbkluZm8oIF9zZWN0aW9uSW5mbyApLCBwcmV2QXNzZXJ0aW9ucyggX3ByZXZBc3NlcnRpb25zICksIGR1cmF0aW9uSW5TZWNvbmRzKCBfZHVyYXRpb25JblNlY29uZHMgKQorICAgICAgICB7fQorCisgICAgICAgIFNlY3Rpb25JbmZvIHNlY3Rpb25JbmZvOworICAgICAgICBDb3VudHMgcHJldkFzc2VydGlvbnM7CisgICAgICAgIGRvdWJsZSBkdXJhdGlvbkluU2Vjb25kczsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RpbWVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RJTUVSX0hfSU5DTFVERUQKKworI2lmZGVmIF9NU0NfVkVSCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUludDY0OworfQorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KK25hbWVzcGFjZSBDYXRjaCB7CisgICAgdHlwZWRlZiB1aW50NjRfdCBVSW50NjQ7Cit9CisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBjbGFzcyBUaW1lciB7CisgICAgcHVibGljOgorICAgICAgICBUaW1lcigpIDogbV90aWNrcyggMCApIHt9CisgICAgICAgIHZvaWQgc3RhcnQoKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGdldEVsYXBzZWRNaWNyb3NlY29uZHMoKSBjb25zdDsKKyAgICAgICAgdW5zaWduZWQgaW50IGdldEVsYXBzZWRNaWxsaXNlY29uZHMoKSBjb25zdDsKKyAgICAgICAgZG91YmxlIGdldEVsYXBzZWRTZWNvbmRzKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBVSW50NjQgbV90aWNrczsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgU2VjdGlvbiA6IE5vbkNvcHlhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFNlY3Rpb24oIFNlY3Rpb25JbmZvIGNvbnN0JiBpbmZvICk7CisgICAgICAgIH5TZWN0aW9uKCk7CisKKyAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90CisgICAgICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIFNlY3Rpb25JbmZvIG1faW5mbzsKKworICAgICAgICBzdGQ6OnN0cmluZyBtX25hbWU7CisgICAgICAgIENvdW50cyBtX2Fzc2VydGlvbnM7CisgICAgICAgIGJvb2wgbV9zZWN0aW9uSW5jbHVkZWQ7CisgICAgICAgIFRpbWVyIG1fdGltZXI7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCAuLi4gKSBcCisgICAgICAgIGlmKCBDYXRjaDo6U2VjdGlvbiBjb25zdCYgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX1NlY3Rpb24gKSA9IENhdGNoOjpTZWN0aW9uSW5mbyggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIF9fVkFfQVJHU19fICkgKQorI2Vsc2UKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIG5hbWUsIGRlc2MgKSBcCisgICAgICAgIGlmKCBDYXRjaDo6U2VjdGlvbiBjb25zdCYgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX1NlY3Rpb24gKSA9IENhdGNoOjpTZWN0aW9uSW5mbyggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIG5hbWUsIGRlc2MgKSApCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2dlbmVyYXRvcnMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9HRU5FUkFUT1JTX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBJR2VuZXJhdG9yIHsKKyAgICB2aXJ0dWFsIH5JR2VuZXJhdG9yKCkge30KKyAgICB2aXJ0dWFsIFQgZ2V0VmFsdWUoIHN0ZDo6c2l6ZV90IGluZGV4ICkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RkOjpzaXplX3Qgc2l6ZSAoKSBjb25zdCA9IDA7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQmV0d2VlbkdlbmVyYXRvciA6IHB1YmxpYyBJR2VuZXJhdG9yPFQ+IHsKK3B1YmxpYzoKKyAgICBCZXR3ZWVuR2VuZXJhdG9yKCBUIGZyb20sIFQgdG8gKSA6IG1fZnJvbSggZnJvbSApLCBtX3RvKCB0byApe30KKworICAgIHZpcnR1YWwgVCBnZXRWYWx1ZSggc3RkOjpzaXplX3QgaW5kZXggKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2Zyb20rc3RhdGljX2Nhc3Q8aW50PiggaW5kZXggKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIDErbV90by1tX2Zyb20gKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBUIG1fZnJvbTsKKyAgICBUIG1fdG87Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgVmFsdWVzR2VuZXJhdG9yIDogcHVibGljIElHZW5lcmF0b3I8VD4geworcHVibGljOgorICAgIFZhbHVlc0dlbmVyYXRvcigpe30KKworICAgIHZvaWQgYWRkKCBUIHZhbHVlICkgeworICAgICAgICBtX3ZhbHVlcy5wdXNoX2JhY2soIHZhbHVlICk7CisgICAgfQorCisgICAgdmlydHVhbCBUIGdldFZhbHVlKCBzdGQ6OnNpemVfdCBpbmRleCApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlcy5zaXplKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPFQ+IG1fdmFsdWVzOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIENvbXBvc2l0ZUdlbmVyYXRvciB7CitwdWJsaWM6CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yKCkgOiBtX3RvdGFsU2l6ZSggMCApIHt9CisKKyAgICAvLyAqKiogTW92ZSBzZW1hbnRpY3MsIHNpbWlsYXIgdG8gYXV0b19wdHIgKioqCisgICAgQ29tcG9zaXRlR2VuZXJhdG9yKCBDb21wb3NpdGVHZW5lcmF0b3ImIG90aGVyICkKKyAgICA6ICAgbV9maWxlSW5mbyggb3RoZXIubV9maWxlSW5mbyApLAorICAgICAgICBtX3RvdGFsU2l6ZSggMCApCisgICAgeworICAgICAgICBtb3ZlKCBvdGhlciApOworICAgIH0KKworICAgIENvbXBvc2l0ZUdlbmVyYXRvciYgc2V0RmlsZUluZm8oIGNvbnN0IGNoYXIqIGZpbGVJbmZvICkgeworICAgICAgICBtX2ZpbGVJbmZvID0gZmlsZUluZm87CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB+Q29tcG9zaXRlR2VuZXJhdG9yKCkgeworICAgICAgICBkZWxldGVBbGwoIG1fY29tcG9zZWQgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBUICgpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IG92ZXJhbGxJbmRleCA9IGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0R2VuZXJhdG9ySW5kZXgoIG1fZmlsZUluZm8sIG1fdG90YWxTaXplICk7CisKKyAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8Y29uc3QgSUdlbmVyYXRvcjxUPio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fY29tcG9zZWQuYmVnaW4oKTsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8Y29uc3QgSUdlbmVyYXRvcjxUPio+Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1fY29tcG9zZWQuZW5kKCk7CisgICAgICAgIGZvciggc2l6ZV90IGluZGV4ID0gMDsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBJR2VuZXJhdG9yPFQ+KiBnZW5lcmF0b3IgPSAqaXQ7CisgICAgICAgICAgICBpZiggb3ZlcmFsbEluZGV4ID49IGluZGV4ICYmIG92ZXJhbGxJbmRleCA8IGluZGV4ICsgZ2VuZXJhdG9yLT5zaXplKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3ItPmdldFZhbHVlKCBvdmVyYWxsSW5kZXgtaW5kZXggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4ICs9IGdlbmVyYXRvci0+c2l6ZSgpOworICAgICAgICB9CisgICAgICAgIENBVENIX0lOVEVSTkFMX0VSUk9SKCAiSW5kZXhlZCBwYXN0IGVuZCBvZiBnZW5lcmF0ZWQgcmFuZ2UiICk7CisgICAgICAgIHJldHVybiBUKCk7IC8vIFN1cHByZXNzIHNwdXJpb3VzICJub3QgYWxsIGNvbnRyb2wgcGF0aHMgcmV0dXJuIGEgdmFsdWUiIHdhcm5pbmcgaW4gVmlzdWFsIFN0dWRpbyAtIGlmIHlvdSBrbm93IGhvdyB0byBmaXggdGhpcyBwbGVhc2UgZG8gc28KKyAgICB9CisKKyAgICB2b2lkIGFkZCggY29uc3QgSUdlbmVyYXRvcjxUPiogZ2VuZXJhdG9yICkgeworICAgICAgICBtX3RvdGFsU2l6ZSArPSBnZW5lcmF0b3ItPnNpemUoKTsKKyAgICAgICAgbV9jb21wb3NlZC5wdXNoX2JhY2soIGdlbmVyYXRvciApOworICAgIH0KKworICAgIENvbXBvc2l0ZUdlbmVyYXRvciYgdGhlbiggQ29tcG9zaXRlR2VuZXJhdG9yJiBvdGhlciApIHsKKyAgICAgICAgbW92ZSggb3RoZXIgKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbXBvc2l0ZUdlbmVyYXRvciYgdGhlbiggVCB2YWx1ZSApIHsKKyAgICAgICAgVmFsdWVzR2VuZXJhdG9yPFQ+KiB2YWx1ZXNHZW4gPSBuZXcgVmFsdWVzR2VuZXJhdG9yPFQ+KCk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWx1ZSApOworICAgICAgICBhZGQoIHZhbHVlc0dlbiApOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCitwcml2YXRlOgorCisgICAgdm9pZCBtb3ZlKCBDb21wb3NpdGVHZW5lcmF0b3ImIG90aGVyICkgeworICAgICAgICBtX2NvbXBvc2VkLmluc2VydCggbV9jb21wb3NlZC5lbmQoKSwgb3RoZXIubV9jb21wb3NlZC5iZWdpbigpLCBvdGhlci5tX2NvbXBvc2VkLmVuZCgpICk7CisgICAgICAgIG1fdG90YWxTaXplICs9IG90aGVyLm1fdG90YWxTaXplOworICAgICAgICBvdGhlci5tX2NvbXBvc2VkLmNsZWFyKCk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgSUdlbmVyYXRvcjxUPio+IG1fY29tcG9zZWQ7CisgICAgc3RkOjpzdHJpbmcgbV9maWxlSW5mbzsKKyAgICBzaXplX3QgbV90b3RhbFNpemU7Cit9OworCituYW1lc3BhY2UgR2VuZXJhdG9ycworeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGJldHdlZW4oIFQgZnJvbSwgVCB0byApIHsKKyAgICAgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGdlbmVyYXRvcnM7CisgICAgICAgIGdlbmVyYXRvcnMuYWRkKCBuZXcgQmV0d2VlbkdlbmVyYXRvcjxUPiggZnJvbSwgdG8gKSApOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiB2YWx1ZXMoIFQgdmFsMSwgVCB2YWwyICkgeworICAgICAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gZ2VuZXJhdG9yczsKKyAgICAgICAgVmFsdWVzR2VuZXJhdG9yPFQ+KiB2YWx1ZXNHZW4gPSBuZXcgVmFsdWVzR2VuZXJhdG9yPFQ+KCk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwxICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwyICk7CisgICAgICAgIGdlbmVyYXRvcnMuYWRkKCB2YWx1ZXNHZW4gKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvcnM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gdmFsdWVzKCBUIHZhbDEsIFQgdmFsMiwgVCB2YWwzICl7CisgICAgICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiBnZW5lcmF0b3JzOworICAgICAgICBWYWx1ZXNHZW5lcmF0b3I8VD4qIHZhbHVlc0dlbiA9IG5ldyBWYWx1ZXNHZW5lcmF0b3I8VD4oKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDEgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDIgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDMgKTsKKyAgICAgICAgZ2VuZXJhdG9ycy5hZGQoIHZhbHVlc0dlbiApOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiB2YWx1ZXMoIFQgdmFsMSwgVCB2YWwyLCBUIHZhbDMsIFQgdmFsNCApIHsKKyAgICAgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGdlbmVyYXRvcnM7CisgICAgICAgIFZhbHVlc0dlbmVyYXRvcjxUPiogdmFsdWVzR2VuID0gbmV3IFZhbHVlc0dlbmVyYXRvcjxUPigpOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMSApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMiApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMyApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsNCApOworICAgICAgICBnZW5lcmF0b3JzLmFkZCggdmFsdWVzR2VuICk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3JzOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIEdlbmVyYXRvcnMKKwordXNpbmcgbmFtZXNwYWNlIEdlbmVyYXRvcnM7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0xJTkVTVFIyKCBsaW5lICkgI2xpbmUKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTElORVNUUiggbGluZSApIElOVEVSTkFMX0NBVENIX0xJTkVTVFIyKCBsaW5lICkKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9HRU5FUkFURSggZXhwciApIGV4cHIuc2V0RmlsZUluZm8oIF9fRklMRV9fICIoIiBJTlRFUk5BTF9DQVRDSF9MSU5FU1RSKCBfX0xJTkVfXyApICIpIiApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9pbnRlcmZhY2VzX2V4Y2VwdGlvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX0VYQ0VQVElPTl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19yZWdpc3RyeV9odWIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19SRUdJU1RSWV9IVUJfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgc3RydWN0IElUZXN0Q2FzZVJlZ2lzdHJ5OworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5OworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvcjsKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyUmVnaXN0cnk7CisgICAgc3RydWN0IElSZXBvcnRlckZhY3Rvcnk7CisgICAgc3RydWN0IElUYWdBbGlhc1JlZ2lzdHJ5OworCisgICAgc3RydWN0IElSZWdpc3RyeUh1YiB7CisgICAgICAgIHZpcnR1YWwgfklSZWdpc3RyeUh1YigpOworCisgICAgICAgIHZpcnR1YWwgSVJlcG9ydGVyUmVnaXN0cnkgY29uc3QmIGdldFJlcG9ydGVyUmVnaXN0cnkoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgSVRlc3RDYXNlUmVnaXN0cnkgY29uc3QmIGdldFRlc3RDYXNlUmVnaXN0cnkoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldFRhZ0FsaWFzUmVnaXN0cnkoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5JiBnZXRFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJTXV0YWJsZVJlZ2lzdHJ5SHViIHsKKyAgICAgICAgdmlydHVhbCB+SU11dGFibGVSZWdpc3RyeUh1YigpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJSZXBvcnRlciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUcmFuc2xhdG9yKCBjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvciogdHJhbnNsYXRvciApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGFnQWxpYXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgPSAwOworICAgIH07CisKKyAgICBJUmVnaXN0cnlIdWImIGdldFJlZ2lzdHJ5SHViKCk7CisgICAgSU11dGFibGVSZWdpc3RyeUh1YiYgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCk7CisgICAgdm9pZCBjbGVhblVwKCk7CisgICAgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCk7CisKK30KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHR5cGVkZWYgc3RkOjpzdHJpbmcoKmV4Y2VwdGlvblRyYW5zbGF0ZUZ1bmN0aW9uKSgpOworCisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Y29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqPiBFeGNlcHRpb25UcmFuc2xhdG9yczsKKworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvciB7CisgICAgICAgIHZpcnR1YWwgfklFeGNlcHRpb25UcmFuc2xhdG9yKCk7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdHJhbnNsYXRlKCBFeGNlcHRpb25UcmFuc2xhdG9yczo6Y29uc3RfaXRlcmF0b3IgaXQsIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdEVuZCApIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkgeworICAgICAgICB2aXJ0dWFsIH5JRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCk7CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIGNsYXNzIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyYXIgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBjbGFzcyBFeGNlcHRpb25UcmFuc2xhdG9yIDogcHVibGljIElFeGNlcHRpb25UcmFuc2xhdG9yIHsKKyAgICAgICAgcHVibGljOgorCisgICAgICAgICAgICBFeGNlcHRpb25UcmFuc2xhdG9yKCBzdGQ6OnN0cmluZygqdHJhbnNsYXRlRnVuY3Rpb24pKCBUJiApICkKKyAgICAgICAgICAgIDogbV90cmFuc2xhdGVGdW5jdGlvbiggdHJhbnNsYXRlRnVuY3Rpb24gKQorICAgICAgICAgICAge30KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGUoIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdCwgRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpdCA9PSBpdEVuZCApCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgqaXQpLT50cmFuc2xhdGUoIGl0KzEsIGl0RW5kICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKCBUJiBleCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fdHJhbnNsYXRlRnVuY3Rpb24oIGV4ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCptX3RyYW5zbGF0ZUZ1bmN0aW9uKSggVCYgKTsKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJhciggc3RkOjpzdHJpbmcoKnRyYW5zbGF0ZUZ1bmN0aW9uKSggVCYgKSApIHsKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVHJhbnNsYXRvcgorICAgICAgICAgICAgICAgICggbmV3IEV4Y2VwdGlvblRyYW5zbGF0b3I8VD4oIHRyYW5zbGF0ZUZ1bmN0aW9uICkgKTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTjIoIHRyYW5zbGF0b3JOYW1lLCBzaWduYXR1cmUgKSBcCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHRyYW5zbGF0b3JOYW1lKCBzaWduYXR1cmUgKTsgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyYXIgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX0V4Y2VwdGlvblJlZ2lzdHJhciApKCAmdHJhbnNsYXRvck5hbWUgKTsgfVwKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgdHJhbnNsYXRvck5hbWUoIHNpZ25hdHVyZSApCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTiggc2lnbmF0dXJlICkgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTjIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBjYXRjaF9pbnRlcm5hbF9FeGNlcHRpb25UcmFuc2xhdG9yICksIHNpZ25hdHVyZSApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9hcHByb3guaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9BUFBST1hfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIERldGFpbCB7CisKKyAgICBjbGFzcyBBcHByb3ggeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQXBwcm94ICggZG91YmxlIHZhbHVlICkKKyAgICAgICAgOiAgIG1fZXBzaWxvbiggc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmVwc2lsb24oKSoxMDAgKSwKKyAgICAgICAgICAgIG1fbWFyZ2luKCAwLjAgKSwKKyAgICAgICAgICAgIG1fc2NhbGUoIDEuMCApLAorICAgICAgICAgICAgbV92YWx1ZSggdmFsdWUgKQorICAgICAgICB7fQorCisgICAgICAgIEFwcHJveCggQXBwcm94IGNvbnN0JiBvdGhlciApCisgICAgICAgIDogICBtX2Vwc2lsb24oIG90aGVyLm1fZXBzaWxvbiApLAorICAgICAgICAgICAgbV9tYXJnaW4oIG90aGVyLm1fbWFyZ2luICksCisgICAgICAgICAgICBtX3NjYWxlKCBvdGhlci5tX3NjYWxlICksCisgICAgICAgICAgICBtX3ZhbHVlKCBvdGhlci5tX3ZhbHVlICkKKyAgICAgICAge30KKworICAgICAgICBzdGF0aWMgQXBwcm94IGN1c3RvbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBBcHByb3goIDAgKTsKKyAgICAgICAgfQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpCisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94IG9wZXJhdG9yKCkoIFQgdmFsdWUgKSB7CisgICAgICAgICAgICBBcHByb3ggYXBwcm94KCBzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSApOworICAgICAgICAgICAgYXBwcm94LmVwc2lsb24oIG1fZXBzaWxvbiApOworICAgICAgICAgICAgYXBwcm94Lm1hcmdpbiggbV9tYXJnaW4gKTsKKyAgICAgICAgICAgIGFwcHJveC5zY2FsZSggbV9zY2FsZSApOworICAgICAgICAgICAgcmV0dXJuIGFwcHJveDsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGV4cGxpY2l0IEFwcHJveCggVCB2YWx1ZSApOiBBcHByb3goc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZSkpCisgICAgICAgIHt9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBjb25zdCBUJiBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgLy8gVGhhbmtzIHRvIFJpY2hhcmQgSGFycmlzIGZvciBoaXMgaGVscCByZWZpbmluZyB0aGlzIGZvcm11bGEKKyAgICAgICAgICAgIGF1dG8gbGhzX3YgPSBkb3VibGUobGhzKTsKKyAgICAgICAgICAgIGJvb2wgcmVsYXRpdmVPSyA9IHN0ZDo6ZmFicyhsaHNfdiAtIHJocy5tX3ZhbHVlKSA8IHJocy5tX2Vwc2lsb24gKiAocmhzLm1fc2NhbGUgKyAoc3RkOjptYXgpKHN0ZDo6ZmFicyhsaHNfdiksIHN0ZDo6ZmFicyhyaHMubV92YWx1ZSkpKTsKKyAgICAgICAgICAgIGlmIChyZWxhdGl2ZU9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RkOjpmYWJzKGxoc192IC0gcmhzLm1fdmFsdWUpIDwgcmhzLm1fbWFyZ2luOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBBcHByb3ggY29uc3QmIGxocywgY29uc3QgVCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPSAoIFQgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yICE9ICggQXBwcm94IGNvbnN0JiBsaHMsIFQgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMsIGxocyApOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPD0gKCBUIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gZG91YmxlKGxocykgPCByaHMubV92YWx1ZSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPD0gKCBBcHByb3ggY29uc3QmIGxocywgVCByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPCBkb3VibGUocmhzKSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPj0gKCBUIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gZG91YmxlKGxocykgPiByaHMubV92YWx1ZSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPj0gKCBBcHByb3ggY29uc3QmIGxocywgVCByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPiBkb3VibGUocmhzKSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94JiBlcHNpbG9uKCBUIG5ld0Vwc2lsb24gKSB7CisgICAgICAgICAgICBtX2Vwc2lsb24gPSBkb3VibGUobmV3RXBzaWxvbik7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3gmIG1hcmdpbiggVCBuZXdNYXJnaW4gKSB7CisgICAgICAgICAgICBtX21hcmdpbiA9IGRvdWJsZShuZXdNYXJnaW4pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94JiBzY2FsZSggVCBuZXdTY2FsZSApIHsKKyAgICAgICAgICAgIG1fc2NhbGUgPSBkb3VibGUobmV3U2NhbGUpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyNlbHNlCisKKyAgICAgICAgQXBwcm94IG9wZXJhdG9yKCkoIGRvdWJsZSB2YWx1ZSApIHsKKyAgICAgICAgICAgIEFwcHJveCBhcHByb3goIHZhbHVlICk7CisgICAgICAgICAgICBhcHByb3guZXBzaWxvbiggbV9lcHNpbG9uICk7CisgICAgICAgICAgICBhcHByb3gubWFyZ2luKCBtX21hcmdpbiApOworICAgICAgICAgICAgYXBwcm94LnNjYWxlKCBtX3NjYWxlICk7CisgICAgICAgICAgICByZXR1cm4gYXBwcm94OworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBkb3VibGUgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIC8vIFRoYW5rcyB0byBSaWNoYXJkIEhhcnJpcyBmb3IgaGlzIGhlbHAgcmVmaW5pbmcgdGhpcyBmb3JtdWxhCisgICAgICAgICAgICBib29sIHJlbGF0aXZlT0sgPSBzdGQ6OmZhYnMoIGxocyAtIHJocy5tX3ZhbHVlICkgPCByaHMubV9lcHNpbG9uICogKHJocy5tX3NjYWxlICsgKHN0ZDo6bWF4KSggc3RkOjpmYWJzKGxocyksIHN0ZDo6ZmFicyhyaHMubV92YWx1ZSkgKSApOworICAgICAgICAgICAgaWYgKHJlbGF0aXZlT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmZhYnMobGhzIC0gcmhzLm1fdmFsdWUpIDwgcmhzLm1fbWFyZ2luOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBBcHByb3ggY29uc3QmIGxocywgZG91YmxlIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBvcGVyYXRvcj09KCByaHMsIGxocyApOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgIT0gKCBkb3VibGUgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yICE9ICggQXBwcm94IGNvbnN0JiBsaHMsIGRvdWJsZSByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocyA8IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIEFwcHJveCBjb25zdCYgbGhzLCBkb3VibGUgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlIDwgcmhzIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocyA+IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIEFwcHJveCBjb25zdCYgbGhzLCBkb3VibGUgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlID4gcmhzIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBBcHByb3gmIGVwc2lsb24oIGRvdWJsZSBuZXdFcHNpbG9uICkgeworICAgICAgICAgICAgbV9lcHNpbG9uID0gbmV3RXBzaWxvbjsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEFwcHJveCYgbWFyZ2luKCBkb3VibGUgbmV3TWFyZ2luICkgeworICAgICAgICAgICAgbV9tYXJnaW4gPSBuZXdNYXJnaW47CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBBcHByb3gmIHNjYWxlKCBkb3VibGUgbmV3U2NhbGUgKSB7CisgICAgICAgICAgICBtX3NjYWxlID0gbmV3U2NhbGU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiQXBwcm94KCAiIDw8IENhdGNoOjp0b1N0cmluZyggbV92YWx1ZSApIDw8ICIgKSI7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBkb3VibGUgbV9lcHNpbG9uOworICAgICAgICBkb3VibGUgbV9tYXJnaW47CisgICAgICAgIGRvdWJsZSBtX3NjYWxlOworICAgICAgICBkb3VibGUgbV92YWx1ZTsKKyAgICB9OworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmc8RGV0YWlsOjpBcHByb3g+KCBEZXRhaWw6OkFwcHJveCBjb25zdCYgdmFsdWUgKSB7CisgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfbWF0Y2hlcnNfc3RyaW5nLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01BVENIRVJTX1NUUklOR19IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMgeworCisgICAgbmFtZXNwYWNlIFN0ZFN0cmluZyB7CisKKyAgICAgICAgc3RydWN0IENhc2VkU3RyaW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIENhc2VkU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBhZGp1c3RTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpIGNvbnN0OworCisgICAgICAgICAgICBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgbV9jYXNlU2Vuc2l0aXZpdHk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtX3N0cjsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgU3RyaW5nTWF0Y2hlckJhc2UgOiBNYXRjaGVyQmFzZTxzdGQ6OnN0cmluZz4geworICAgICAgICAgICAgU3RyaW5nTWF0Y2hlckJhc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRpb24sIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgICAgIENhc2VkU3RyaW5nIG1fY29tcGFyYXRvcjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1fb3BlcmF0aW9uOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBFcXVhbHNNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgeworICAgICAgICAgICAgRXF1YWxzTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IENBVENIX09WRVJSSURFOworICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgQ29udGFpbnNNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgeworICAgICAgICAgICAgQ29udGFpbnNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBTdGFydHNXaXRoTWF0Y2hlciA6IFN0cmluZ01hdGNoZXJCYXNlIHsKKyAgICAgICAgICAgIFN0YXJ0c1dpdGhNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBFbmRzV2l0aE1hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBFbmRzV2l0aE1hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgfTsKKworICAgIH0gLy8gbmFtZXNwYWNlIFN0ZFN0cmluZworCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIHRoZSBhY3R1YWwgbWF0Y2hlciBvYmplY3RzLgorICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB0eXBlcyB0byBiZSBpbmZlcnJlZAorCisgICAgU3RkU3RyaW5nOjpFcXVhbHNNYXRjaGVyIEVxdWFscyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOworICAgIFN0ZFN0cmluZzo6Q29udGFpbnNNYXRjaGVyIENvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ID0gQ2FzZVNlbnNpdGl2ZTo6WWVzICk7CisgICAgU3RkU3RyaW5nOjpFbmRzV2l0aE1hdGNoZXIgRW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKyAgICBTdGRTdHJpbmc6OlN0YXJ0c1dpdGhNYXRjaGVyIFN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9tYXRjaGVyc192ZWN0b3IuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUFUQ0hFUlNfVkVDVE9SX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisKKyAgICBuYW1lc3BhY2UgVmVjdG9yIHsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgQ29udGFpbnNFbGVtZW50TWF0Y2hlciA6IE1hdGNoZXJCYXNlPHN0ZDo6dmVjdG9yPFQ+LCBUPiB7CisKKyAgICAgICAgICAgIENvbnRhaW5zRWxlbWVudE1hdGNoZXIoVCBjb25zdCAmY29tcGFyYXRvcikgOiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IpIHt9CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goc3RkOjp2ZWN0b3I8VD4gY29uc3QgJnYpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpmaW5kKHYuYmVnaW4oKSwgdi5lbmQoKSwgbV9jb21wYXJhdG9yKSAhPSB2LmVuZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAiQ29udGFpbnM6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fY29tcGFyYXRvciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUIGNvbnN0JiBtX2NvbXBhcmF0b3I7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RydWN0IENvbnRhaW5zTWF0Y2hlciA6IE1hdGNoZXJCYXNlPHN0ZDo6dmVjdG9yPFQ+LCBzdGQ6OnZlY3RvcjxUPiA+IHsKKworICAgICAgICAgICAgQ29udGFpbnNNYXRjaGVyKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZjb21wYXJhdG9yKSA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goc3RkOjp2ZWN0b3I8VD4gY29uc3QgJnYpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAvLyAhVEJEOiBzZWUgbm90ZSBpbiBFcXVhbHNNYXRjaGVyCisgICAgICAgICAgICAgICAgaWYgKG1fY29tcGFyYXRvci5zaXplKCkgPiB2LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9jb21wYXJhdG9yLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKHYuYmVnaW4oKSwgdi5lbmQoKSwgbV9jb21wYXJhdG9yW2ldKSA9PSB2LmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNvbnRhaW5zOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX2NvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gY29uc3QmIG1fY29tcGFyYXRvcjsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgRXF1YWxzTWF0Y2hlciA6IE1hdGNoZXJCYXNlPHN0ZDo6dmVjdG9yPFQ+LCBzdGQ6OnZlY3RvcjxUPiA+IHsKKworICAgICAgICAgICAgRXF1YWxzTWF0Y2hlcihzdGQ6OnZlY3RvcjxUPiBjb25zdCAmY29tcGFyYXRvcikgOiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgICAgICBib29sIG1hdGNoKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZ2KSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgLy8gIVRCRDogVGhpcyBjdXJyZW50bHkgd29ya3MgaWYgYWxsIGVsZW1lbnRzIGNhbiBiZSBjb21wYXJlZCB1c2luZyAhPQorICAgICAgICAgICAgICAgIC8vIC0gYSBtb3JlIGdlbmVyYWwgYXBwcm9hY2ggd291bGQgYmUgdmlhIGEgY29tcGFyZSB0ZW1wbGF0ZSB0aGF0IGRlZmF1bHRzCisgICAgICAgICAgICAgICAgLy8gdG8gdXNpbmcgIT0uIGJ1dCBjb3VsZCBiZSBzcGVjaWFsaXNlZCBmb3IsIGUuZy4gc3RkOjp2ZWN0b3I8VD4gZXRjCisgICAgICAgICAgICAgICAgLy8gLSB0aGVuIGp1c3QgY2FsbCB0aGF0IGRpcmVjdGx5CisgICAgICAgICAgICAgICAgaWYgKG1fY29tcGFyYXRvci5zaXplKCkgIT0gdi5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHYuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGlmIChtX2NvbXBhcmF0b3JbaV0gIT0gdltpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJFcXVhbHM6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fY29tcGFyYXRvciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gY29uc3QmIG1fY29tcGFyYXRvcjsKKyAgICAgICAgfTsKKworICAgIH0gLy8gbmFtZXNwYWNlIFZlY3RvcgorCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIHRoZSBhY3R1YWwgbWF0Y2hlciBvYmplY3RzLgorICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB0eXBlcyB0byBiZSBpbmZlcnJlZAorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBWZWN0b3I6OkNvbnRhaW5zTWF0Y2hlcjxUPiBDb250YWlucyggc3RkOjp2ZWN0b3I8VD4gY29uc3QmIGNvbXBhcmF0b3IgKSB7CisgICAgICAgIHJldHVybiBWZWN0b3I6OkNvbnRhaW5zTWF0Y2hlcjxUPiggY29tcGFyYXRvciApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVmVjdG9yOjpDb250YWluc0VsZW1lbnRNYXRjaGVyPFQ+IFZlY3RvckNvbnRhaW5zKCBUIGNvbnN0JiBjb21wYXJhdG9yICkgeworICAgICAgICByZXR1cm4gVmVjdG9yOjpDb250YWluc0VsZW1lbnRNYXRjaGVyPFQ+KCBjb21wYXJhdG9yICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBWZWN0b3I6OkVxdWFsc01hdGNoZXI8VD4gRXF1YWxzKCBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgY29tcGFyYXRvciApIHsKKyAgICAgICAgcmV0dXJuIFZlY3Rvcjo6RXF1YWxzTWF0Y2hlcjxUPiggY29tcGFyYXRvciApOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9pbnRlcmZhY2VzX3RhZ19hbGlhc19yZWdpc3RyeS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1RBR19BTElBU19SRUdJU1RSWV9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90YWdfYWxpYXMuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEFHX0FMSUFTX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBUYWdBbGlhcyB7CisgICAgICAgIFRhZ0FsaWFzKCBzdGQ6OnN0cmluZyBjb25zdCYgX3RhZywgU291cmNlTGluZUluZm8gX2xpbmVJbmZvICkgOiB0YWcoIF90YWcgKSwgbGluZUluZm8oIF9saW5lSW5mbyApIHt9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFnOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICB9OworCisgICAgc3RydWN0IFJlZ2lzdHJhckZvclRhZ0FsaWFzZXMgeworICAgICAgICBSZWdpc3RyYXJGb3JUYWdBbGlhc2VzKCBjaGFyIGNvbnN0KiBhbGlhcywgY2hhciBjb25zdCogdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9UQUdfQUxJQVMoIGFsaWFzLCBzcGVjICkgbmFtZXNwYWNleyBDYXRjaDo6UmVnaXN0cmFyRm9yVGFnQWxpYXNlcyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQXV0b1JlZ2lzdGVyVGFnQWxpYXMgKSggYWxpYXMsIHNwZWMsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IH0KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9vcHRpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9PUFRJT05fSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBBbiBvcHRpb25hbCB0eXBlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBPcHRpb24geworICAgIHB1YmxpYzoKKyAgICAgICAgT3B0aW9uKCkgOiBudWxsYWJsZVZhbHVlKCBDQVRDSF9OVUxMICkge30KKyAgICAgICAgT3B0aW9uKCBUIGNvbnN0JiBfdmFsdWUgKQorICAgICAgICA6IG51bGxhYmxlVmFsdWUoIG5ldyggc3RvcmFnZSApIFQoIF92YWx1ZSApICkKKyAgICAgICAge30KKyAgICAgICAgT3B0aW9uKCBPcHRpb24gY29uc3QmIF9vdGhlciApCisgICAgICAgIDogbnVsbGFibGVWYWx1ZSggX290aGVyID8gbmV3KCBzdG9yYWdlICkgVCggKl9vdGhlciApIDogQ0FUQ0hfTlVMTCApCisgICAgICAgIHt9CisKKyAgICAgICAgfk9wdGlvbigpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBPcHRpb24mIG9wZXJhdG9yPSAoIE9wdGlvbiBjb25zdCYgX290aGVyICkgeworICAgICAgICAgICAgaWYoICZfb3RoZXIgIT0gdGhpcyApIHsKKyAgICAgICAgICAgICAgICByZXNldCgpOworICAgICAgICAgICAgICAgIGlmKCBfb3RoZXIgKQorICAgICAgICAgICAgICAgICAgICBudWxsYWJsZVZhbHVlID0gbmV3KCBzdG9yYWdlICkgVCggKl9vdGhlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIE9wdGlvbiYgb3BlcmF0b3IgPSAoIFQgY29uc3QmIF92YWx1ZSApIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICBudWxsYWJsZVZhbHVlID0gbmV3KCBzdG9yYWdlICkgVCggX3ZhbHVlICk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYoIG51bGxhYmxlVmFsdWUgKQorICAgICAgICAgICAgICAgIG51bGxhYmxlVmFsdWUtPn5UKCk7CisgICAgICAgICAgICBudWxsYWJsZVZhbHVlID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIFQmIG9wZXJhdG9yKigpIHsgcmV0dXJuICpudWxsYWJsZVZhbHVlOyB9CisgICAgICAgIFQgY29uc3QmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpudWxsYWJsZVZhbHVlOyB9CisgICAgICAgIFQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBudWxsYWJsZVZhbHVlOyB9CisgICAgICAgIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBudWxsYWJsZVZhbHVlOyB9CisKKyAgICAgICAgVCB2YWx1ZU9yKCBUIGNvbnN0JiBkZWZhdWx0VmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbnVsbGFibGVWYWx1ZSA/ICpudWxsYWJsZVZhbHVlIDogZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBzb21lKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZSAhPSBDQVRDSF9OVUxMOyB9CisgICAgICAgIGJvb2wgbm9uZSgpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWUgPT0gQ0FUQ0hfTlVMTDsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IgISgpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWUgPT0gQ0FUQ0hfTlVMTDsgfQorICAgICAgICBvcGVyYXRvciBTYWZlQm9vbDo6dHlwZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBTYWZlQm9vbDo6bWFrZVNhZmUoIHNvbWUoKSApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBUICpudWxsYWJsZVZhbHVlOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBjaGFyIHN0b3JhZ2Vbc2l6ZW9mKFQpXTsKKworICAgICAgICAgICAgLy8gVGhlc2UgYXJlIGhlcmUgdG8gZm9yY2UgYWxpZ25tZW50IGZvciB0aGUgc3RvcmFnZQorICAgICAgICAgICAgbG9uZyBkb3VibGUgZHVtbXkxOworICAgICAgICAgICAgdm9pZCAoKmR1bW15MikoKTsKKyAgICAgICAgICAgIGxvbmcgZG91YmxlIGR1bW15MzsKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisgICAgICAgICAgICBsb25nIGxvbmcgZHVtbXk0OworI2VuZGlmCisgICAgICAgIH07CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSVRhZ0FsaWFzUmVnaXN0cnkgeworICAgICAgICB2aXJ0dWFsIH5JVGFnQWxpYXNSZWdpc3RyeSgpOworICAgICAgICB2aXJ0dWFsIE9wdGlvbjxUYWdBbGlhcz4gZmluZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzICkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGV4cGFuZEFsaWFzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdCA9IDA7CisKKyAgICAgICAgc3RhdGljIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiBnZXQoKTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gVGhlc2UgZmlsZXMgYXJlIGluY2x1ZGVkIGhlcmUgc28gdGhlIHNpbmdsZV9pbmNsdWRlIHNjcmlwdCBkb2Vzbid0IHB1dCB0aGVtCisvLyBpbiB0aGUgY29uZGl0aW9uYWxseSBjb21waWxlZCBzZWN0aW9ucworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3Rlc3RfY2FzZV9pbmZvLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfQ0FTRV9JTkZPX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJVGVzdENhc2U7CisKKyAgICBzdHJ1Y3QgVGVzdENhc2VJbmZvIHsKKyAgICAgICAgZW51bSBTcGVjaWFsUHJvcGVydGllc3sKKyAgICAgICAgICAgIE5vbmUgPSAwLAorICAgICAgICAgICAgSXNIaWRkZW4gPSAxIDw8IDEsCisgICAgICAgICAgICBTaG91bGRGYWlsID0gMSA8PCAyLAorICAgICAgICAgICAgTWF5RmFpbCA9IDEgPDwgMywKKyAgICAgICAgICAgIFRocm93cyA9IDEgPDwgNCwKKyAgICAgICAgICAgIE5vblBvcnRhYmxlID0gMSA8PCA1CisgICAgICAgIH07CisKKyAgICAgICAgVGVzdENhc2VJbmZvKCAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICk7CisKKyAgICAgICAgVGVzdENhc2VJbmZvKCBUZXN0Q2FzZUluZm8gY29uc3QmIG90aGVyICk7CisKKyAgICAgICAgZnJpZW5kIHZvaWQgc2V0VGFncyggVGVzdENhc2VJbmZvJiB0ZXN0Q2FzZUluZm8sIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgdGFncyApOworCisgICAgICAgIGJvb2wgaXNIaWRkZW4oKSBjb25zdDsKKyAgICAgICAgYm9vbCB0aHJvd3MoKSBjb25zdDsKKyAgICAgICAgYm9vbCBva1RvRmFpbCgpIGNvbnN0OworICAgICAgICBib29sIGV4cGVjdGVkVG9GYWlsKCkgY29uc3Q7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2xhc3NOYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRhZ3M7CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBsY2FzZVRhZ3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ3NBc1N0cmluZzsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgICAgIFNwZWNpYWxQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisgICAgfTsKKworICAgIGNsYXNzIFRlc3RDYXNlIDogcHVibGljIFRlc3RDYXNlSW5mbyB7CisgICAgcHVibGljOgorCisgICAgICAgIFRlc3RDYXNlKCBJVGVzdENhc2UqIHRlc3RDYXNlLCBUZXN0Q2FzZUluZm8gY29uc3QmIGluZm8gKTsKKyAgICAgICAgVGVzdENhc2UoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApOworCisgICAgICAgIFRlc3RDYXNlIHdpdGhOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgX25ld05hbWUgKSBjb25zdDsKKworICAgICAgICB2b2lkIGludm9rZSgpIGNvbnN0OworCisgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBzd2FwKCBUZXN0Q2FzZSYgb3RoZXIgKTsKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgVGVzdENhc2UmIG9wZXJhdG9yID0gKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFB0cjxJVGVzdENhc2U+IHRlc3Q7CisgICAgfTsKKworICAgIFRlc3RDYXNlIG1ha2VUZXN0Q2FzZSggIElUZXN0Q2FzZSogdGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7Cit9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisKKyNpZmRlZiBfX09CSkNfXworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX29iamMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9PQkpDX0hQUF9JTkNMVURFRAorCisjaW1wb3J0IDxvYmpjL3J1bnRpbWUuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworLy8gTkIuIEFueSBnZW5lcmFsIGNhdGNoIGhlYWRlcnMgaW5jbHVkZWQgaGVyZSBtdXN0IGJlIGluY2x1ZGVkCisvLyBpbiBjYXRjaC5ocHAgZmlyc3QgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGluY2x1ZGVkIGJ5IHRoZSBzaW5nbGUKKy8vIGhlYWRlciBmb3Igbm9uIG9iai11c2FnZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUaGlzIHByb3RvY29sIGlzIHJlYWxseSBvbmx5IGhlcmUgZm9yIChzZWxmKSBkb2N1bWVudGluZyBwdXJwb3Nlcywgc2luY2UKKy8vIGFsbCBpdHMgbWV0aG9kcyBhcmUgb3B0aW9uYWwuCitAcHJvdG9jb2wgT2NGaXh0dXJlCisKK0BvcHRpb25hbAorCistKHZvaWQpIHNldFVwOworLSh2b2lkKSB0ZWFyRG93bjsKKworQGVuZAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgT2NNZXRob2QgOiBwdWJsaWMgU2hhcmVkSW1wbDxJVGVzdENhc2U+IHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgT2NNZXRob2QoIENsYXNzIGNscywgU0VMIHNlbCApIDogbV9jbHMoIGNscyApLCBtX3NlbCggc2VsICkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgaW52b2tlKCkgY29uc3QgeworICAgICAgICAgICAgaWQgb2JqID0gW1ttX2NscyBhbGxvY10gaW5pdF07CisKKyAgICAgICAgICAgIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBvYmosIEBzZWxlY3RvcihzZXRVcCkgICk7CisgICAgICAgICAgICBwZXJmb3JtT3B0aW9uYWxTZWxlY3Rvciggb2JqLCBtX3NlbCApOworICAgICAgICAgICAgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIG9iaiwgQHNlbGVjdG9yKHRlYXJEb3duKSAgKTsKKworICAgICAgICAgICAgYXJjU2FmZVJlbGVhc2UoIG9iaiApOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB+T2NNZXRob2QoKSB7fQorCisgICAgICAgIENsYXNzIG1fY2xzOworICAgICAgICBTRUwgbV9zZWw7CisgICAgfTsKKworICAgIG5hbWVzcGFjZSBEZXRhaWx7CisKKyAgICAgICAgaW5saW5lIHN0ZDo6c3RyaW5nIGdldEFubm90YXRpb24oICAgQ2xhc3MgY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgYW5ub3RhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXN0Q2FzZU5hbWUgKSB7CisgICAgICAgICAgICBOU1N0cmluZyogc2VsU3RyID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCJDYXRjaF8lc18lcyIsIGFubm90YXRpb25OYW1lLmNfc3RyKCksIHRlc3RDYXNlTmFtZS5jX3N0cigpXTsKKyAgICAgICAgICAgIFNFTCBzZWwgPSBOU1NlbGVjdG9yRnJvbVN0cmluZyggc2VsU3RyICk7CisgICAgICAgICAgICBhcmNTYWZlUmVsZWFzZSggc2VsU3RyICk7CisgICAgICAgICAgICBpZCB2YWx1ZSA9IHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBjbHMsIHNlbCApOworICAgICAgICAgICAgaWYoIHZhbHVlICkKKyAgICAgICAgICAgICAgICByZXR1cm4gWyhOU1N0cmluZyopdmFsdWUgVVRGOFN0cmluZ107CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgc2l6ZV90IHJlZ2lzdGVyVGVzdE1ldGhvZHMoKSB7CisgICAgICAgIHNpemVfdCBub1Rlc3RNZXRob2RzID0gMDsKKyAgICAgICAgaW50IG5vQ2xhc3NlcyA9IG9iamNfZ2V0Q2xhc3NMaXN0KCBDQVRDSF9OVUxMLCAwICk7CisKKyAgICAgICAgQ2xhc3MqIGNsYXNzZXMgPSAoQ0FUQ0hfVU5TQUZFX1VOUkVUQUlORUQgQ2xhc3MgKiltYWxsb2MoIHNpemVvZihDbGFzcykgKiBub0NsYXNzZXMpOworICAgICAgICBvYmpjX2dldENsYXNzTGlzdCggY2xhc3Nlcywgbm9DbGFzc2VzICk7CisKKyAgICAgICAgZm9yKCBpbnQgYyA9IDA7IGMgPCBub0NsYXNzZXM7IGMrKyApIHsKKyAgICAgICAgICAgIENsYXNzIGNscyA9IGNsYXNzZXNbY107CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdV9pbnQgY291bnQ7CisgICAgICAgICAgICAgICAgTWV0aG9kKiBtZXRob2RzID0gY2xhc3NfY29weU1ldGhvZExpc3QoIGNscywgJmNvdW50ICk7CisgICAgICAgICAgICAgICAgZm9yKCB1X2ludCBtID0gMDsgbSA8IGNvdW50IDsgbSsrICkgeworICAgICAgICAgICAgICAgICAgICBTRUwgc2VsZWN0b3IgPSBtZXRob2RfZ2V0TmFtZShtZXRob2RzW21dKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kTmFtZSA9IHNlbF9nZXROYW1lKHNlbGVjdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIG1ldGhvZE5hbWUsICJDYXRjaF9UZXN0Q2FzZV8iICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0ZXN0Q2FzZU5hbWUgPSBtZXRob2ROYW1lLnN1YnN0ciggMTUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBEZXRhaWw6OmdldEFubm90YXRpb24oIGNscywgIk5hbWUiLCB0ZXN0Q2FzZU5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2MgPSBEZXRhaWw6OmdldEFubm90YXRpb24oIGNscywgIkRlc2NyaXB0aW9uIiwgdGVzdENhc2VOYW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGFzc05hbWUgPSBjbGFzc19nZXROYW1lKCBjbHMgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUZXN0KCBtYWtlVGVzdENhc2UoIG5ldyBPY01ldGhvZCggY2xzLCBzZWxlY3RvciApLCBjbGFzc05hbWUsIG5hbWUuY19zdHIoKSwgZGVzYy5jX3N0cigpLCBTb3VyY2VMaW5lSW5mbygpICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vVGVzdE1ldGhvZHMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmVlKG1ldGhvZHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBub1Rlc3RNZXRob2RzOworICAgIH0KKworICAgIG5hbWVzcGFjZSBNYXRjaGVycyB7CisgICAgICAgIG5hbWVzcGFjZSBJbXBsIHsKKyAgICAgICAgbmFtZXNwYWNlIE5TU3RyaW5nTWF0Y2hlcnMgeworCisgICAgICAgICAgICBzdHJ1Y3QgU3RyaW5nSG9sZGVyIDogTWF0Y2hlckJhc2U8TlNTdHJpbmcqPnsKKyAgICAgICAgICAgICAgICBTdHJpbmdIb2xkZXIoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IG1fc3Vic3RyKCBbc3Vic3RyIGNvcHldICl7fQorICAgICAgICAgICAgICAgIFN0cmluZ0hvbGRlciggU3RyaW5nSG9sZGVyIGNvbnN0JiBvdGhlciApIDogbV9zdWJzdHIoIFtvdGhlci5tX3N1YnN0ciBjb3B5XSApe30KKyAgICAgICAgICAgICAgICBTdHJpbmdIb2xkZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIGFyY1NhZmVSZWxlYXNlKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIGFyZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIE5TU3RyaW5nKiBtX3N1YnN0cjsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBFcXVhbHMgOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIEVxdWFscyggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBzdHIgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKHN0ciAhPSBuaWwgfHwgbV9zdWJzdHIgPT0gbmlsICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyIGlzRXF1YWxUb1N0cmluZzptX3N1YnN0cl07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJlcXVhbHMgc3RyaW5nOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBDb250YWlucyA6IFN0cmluZ0hvbGRlciB7CisgICAgICAgICAgICAgICAgQ29udGFpbnMoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IFN0cmluZ0hvbGRlciggc3Vic3RyICl7fQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciByYW5nZU9mU3RyaW5nOm1fc3Vic3RyXS5sb2NhdGlvbiAhPSBOU05vdEZvdW5kOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29udGFpbnMgc3RyaW5nOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBTdGFydHNXaXRoIDogU3RyaW5nSG9sZGVyIHsKKyAgICAgICAgICAgICAgICBTdGFydHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciApe30KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoc3RyICE9IG5pbCB8fCBtX3N1YnN0ciA9PSBuaWwgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIgcmFuZ2VPZlN0cmluZzptX3N1YnN0cl0ubG9jYXRpb24gPT0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN0YXJ0cyB3aXRoOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzdHJ1Y3QgRW5kc1dpdGggOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIEVuZHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciApe30KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoc3RyICE9IG5pbCB8fCBtX3N1YnN0ciA9PSBuaWwgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIgcmFuZ2VPZlN0cmluZzptX3N1YnN0cl0ubG9jYXRpb24gPT0gW3N0ciBsZW5ndGhdIC0gW21fc3Vic3RyIGxlbmd0aF07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJlbmRzIHdpdGg6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICB9IC8vIG5hbWVzcGFjZSBOU1N0cmluZ01hdGNoZXJzCisgICAgICAgIH0gLy8gbmFtZXNwYWNlIEltcGwKKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RXF1YWxzCisgICAgICAgICAgICBFcXVhbHMoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkVxdWFscyggc3Vic3RyICk7IH0KKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6Q29udGFpbnMKKyAgICAgICAgICAgIENvbnRhaW5zKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpDb250YWlucyggc3Vic3RyICk7IH0KKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6U3RhcnRzV2l0aAorICAgICAgICAgICAgU3RhcnRzV2l0aCggTlNTdHJpbmcqIHN1YnN0ciApeyByZXR1cm4gSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6U3RhcnRzV2l0aCggc3Vic3RyICk7IH0KKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RW5kc1dpdGgKKyAgICAgICAgICAgIEVuZHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFbmRzV2l0aCggc3Vic3RyICk7IH0KKworICAgIH0gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCisKKyAgICB1c2luZyBuYW1lc3BhY2UgTWF0Y2hlcnM7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgT0NfVEVTVF9DQVNFKCBuYW1lLCBkZXNjIClcCisrKE5TU3RyaW5nKikgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENhdGNoX05hbWVfdGVzdCApIFwKK3tcCityZXR1cm4gQCBuYW1lOyBcCit9XAorKyhOU1N0cmluZyopIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDYXRjaF9EZXNjcmlwdGlvbl90ZXN0ICkgXAoreyBcCityZXR1cm4gQCBkZXNjOyBcCit9IFwKKy0odm9pZCkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENhdGNoX1Rlc3RDYXNlX3Rlc3QgKQorCisjZW5kaWYKKworI2lmZGVmIENBVENIX0lNUEwKKworLy8gIVRCRDogTW92ZSB0aGUgbGVhayBkZXRlY3RvciBjb2RlIGludG8gYSBzZXBhcmF0ZSBoZWFkZXIKKyNpZmRlZiBDQVRDSF9DT05GSUdfV0lORE9XU19DUlREQkcKKyNpbmNsdWRlIDxjcnRkYmcuaD4KK2NsYXNzIExlYWtEZXRlY3RvciB7CitwdWJsaWM6CisJTGVha0RldGVjdG9yKCkgeworCQlpbnQgZmxhZyA9IF9DcnRTZXREYmdGbGFnKF9DUlREQkdfUkVQT1JUX0ZMQUcpOworCQlmbGFnIHw9IF9DUlREQkdfTEVBS19DSEVDS19ERjsKKwkJZmxhZyB8PSBfQ1JUREJHX0FMTE9DX01FTV9ERjsKKwkJX0NydFNldERiZ0ZsYWcoZmxhZyk7CisJCV9DcnRTZXRSZXBvcnRNb2RlKF9DUlRfV0FSTiwgX0NSVERCR19NT0RFX0ZJTEUgfCBfQ1JUREJHX01PREVfREVCVUcpOworCQlfQ3J0U2V0UmVwb3J0RmlsZShfQ1JUX1dBUk4sIF9DUlREQkdfRklMRV9TVERFUlIpOworCQkvLyBDaGFuZ2UgdGhpcyB0byBsZWFraW5nIGFsbG9jYXRpb24ncyBudW1iZXIgdG8gYnJlYWsgdGhlcmUKKwkJX0NydFNldEJyZWFrQWxsb2MoLTEpOworCX0KK307CisjZWxzZQorY2xhc3MgTGVha0RldGVjdG9yIHt9OworI2VuZGlmCisKK0xlYWtEZXRlY3RvciBsZWFrRGV0ZWN0b3I7CisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU1QTF9IUFBfSU5DTFVERUQKKworLy8gQ29sbGVjdCBhbGwgdGhlIGltcGxlbWVudGF0aW9uIGZpbGVzIHRvZ2V0aGVyIGhlcmUKKy8vIFRoZXNlIGFyZSB0aGUgZXF1aXZhbGVudCBvZiB3aGF0IHdvdWxkIHVzdWFsbHkgYmUgY3BwIGZpbGVzCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd3ZWFrLXZ0YWJsZXMiCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL2NhdGNoX3Nlc3Npb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SVU5ORVJfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9jb21tYW5kbGluZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTU1BTkRMSU5FX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29uZmlnLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09ORklHX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9zcGVjX3BhcnNlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfU1BFQ19QQVJTRVJfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3Rfc3BlYy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfU1BFQ19IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfd2lsZGNhcmRfcGF0dGVybi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1dJTERDQVJEX1BBVFRFUk5fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKK25hbWVzcGFjZSBDYXRjaAoreworICAgIGNsYXNzIFdpbGRjYXJkUGF0dGVybiB7CisgICAgICAgIGVudW0gV2lsZGNhcmRQb3NpdGlvbiB7CisgICAgICAgICAgICBOb1dpbGRjYXJkID0gMCwKKyAgICAgICAgICAgIFdpbGRjYXJkQXRTdGFydCA9IDEsCisgICAgICAgICAgICBXaWxkY2FyZEF0RW5kID0gMiwKKyAgICAgICAgICAgIFdpbGRjYXJkQXRCb3RoRW5kcyA9IFdpbGRjYXJkQXRTdGFydCB8IFdpbGRjYXJkQXRFbmQKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBXaWxkY2FyZFBhdHRlcm4oIHN0ZDo6c3RyaW5nIGNvbnN0JiBwYXR0ZXJuLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkKKyAgICAgICAgOiAgIG1fY2FzZVNlbnNpdGl2aXR5KCBjYXNlU2Vuc2l0aXZpdHkgKSwKKyAgICAgICAgICAgIG1fd2lsZGNhcmQoIE5vV2lsZGNhcmQgKSwKKyAgICAgICAgICAgIG1fcGF0dGVybiggYWRqdXN0Q2FzZSggcGF0dGVybiApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIG1fcGF0dGVybiwgJyonICkgKSB7CisgICAgICAgICAgICAgICAgbV9wYXR0ZXJuID0gbV9wYXR0ZXJuLnN1YnN0ciggMSApOworICAgICAgICAgICAgICAgIG1fd2lsZGNhcmQgPSBXaWxkY2FyZEF0U3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggZW5kc1dpdGgoIG1fcGF0dGVybiwgJyonICkgKSB7CisgICAgICAgICAgICAgICAgbV9wYXR0ZXJuID0gbV9wYXR0ZXJuLnN1YnN0ciggMCwgbV9wYXR0ZXJuLnNpemUoKS0xICk7CisgICAgICAgICAgICAgICAgbV93aWxkY2FyZCA9IHN0YXRpY19jYXN0PFdpbGRjYXJkUG9zaXRpb24+KCBtX3dpbGRjYXJkIHwgV2lsZGNhcmRBdEVuZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfldpbGRjYXJkUGF0dGVybigpOworICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgIHN3aXRjaCggbV93aWxkY2FyZCApIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5vV2lsZGNhcmQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3BhdHRlcm4gPT0gYWRqdXN0Q2FzZSggc3RyICk7CisgICAgICAgICAgICAgICAgY2FzZSBXaWxkY2FyZEF0U3RhcnQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRzV2l0aCggYWRqdXN0Q2FzZSggc3RyICksIG1fcGF0dGVybiApOworICAgICAgICAgICAgICAgIGNhc2UgV2lsZGNhcmRBdEVuZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0c1dpdGgoIGFkanVzdENhc2UoIHN0ciApLCBtX3BhdHRlcm4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIFdpbGRjYXJkQXRCb3RoRW5kczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKCBhZGp1c3RDYXNlKCBzdHIgKSwgbV9wYXR0ZXJuICk7CisgICAgICAgICAgICB9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnJlYWNoYWJsZS1jb2RlIgorI2VuZGlmCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiVW5rbm93biBlbnVtIiApOworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBhZGp1c3RDYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6Ok5vID8gdG9Mb3dlciggc3RyICkgOiBzdHI7CisgICAgICAgIH0KKyAgICAgICAgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIG1fY2FzZVNlbnNpdGl2aXR5OworICAgICAgICBXaWxkY2FyZFBvc2l0aW9uIG1fd2lsZGNhcmQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fcGF0dGVybjsKKyAgICB9OworfQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RTcGVjIHsKKyAgICAgICAgc3RydWN0IFBhdHRlcm4gOiBTaGFyZWRJbXBsPD4geworICAgICAgICAgICAgdmlydHVhbCB+UGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCA9IDA7CisgICAgICAgIH07CisgICAgICAgIGNsYXNzIE5hbWVQYXR0ZXJuIDogcHVibGljIFBhdHRlcm4geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBOYW1lUGF0dGVybiggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKQorICAgICAgICAgICAgOiBtX3dpbGRjYXJkUGF0dGVybiggdG9Mb3dlciggbmFtZSApLCBDYXNlU2Vuc2l0aXZlOjpObyApCisgICAgICAgICAgICB7fQorICAgICAgICAgICAgdmlydHVhbCB+TmFtZVBhdHRlcm4oKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3dpbGRjYXJkUGF0dGVybi5tYXRjaGVzKCB0b0xvd2VyKCB0ZXN0Q2FzZS5uYW1lICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFdpbGRjYXJkUGF0dGVybiBtX3dpbGRjYXJkUGF0dGVybjsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBUYWdQYXR0ZXJuIDogcHVibGljIFBhdHRlcm4geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBUYWdQYXR0ZXJuKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnICkgOiBtX3RhZyggdG9Mb3dlciggdGFnICkgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB+VGFnUGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RDYXNlLmxjYXNlVGFncy5maW5kKCBtX3RhZyApICE9IHRlc3RDYXNlLmxjYXNlVGFncy5lbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1fdGFnOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIEV4Y2x1ZGVkUGF0dGVybiA6IHB1YmxpYyBQYXR0ZXJuIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgRXhjbHVkZWRQYXR0ZXJuKCBQdHI8UGF0dGVybj4gY29uc3QmIHVuZGVybHlpbmdQYXR0ZXJuICkgOiBtX3VuZGVybHlpbmdQYXR0ZXJuKCB1bmRlcmx5aW5nUGF0dGVybiApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5FeGNsdWRlZFBhdHRlcm4oKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeyByZXR1cm4gIW1fdW5kZXJseWluZ1BhdHRlcm4tPm1hdGNoZXMoIHRlc3RDYXNlICk7IH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFB0cjxQYXR0ZXJuPiBtX3VuZGVybHlpbmdQYXR0ZXJuOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBGaWx0ZXIgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFBhdHRlcm4+ID4gbV9wYXR0ZXJuczsKKworICAgICAgICAgICAgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICAgICAgICAgIC8vIEFsbCBwYXR0ZXJucyBpbiBhIGZpbHRlciBtdXN0IG1hdGNoIGZvciB0aGUgZmlsdGVyIHRvIGJlIGEgbWF0Y2gKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFB0cjxQYXR0ZXJuPiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcGF0dGVybnMuYmVnaW4oKSwgaXRFbmQgPSBtX3BhdHRlcm5zLmVuZCgpOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICEoKml0KS0+bWF0Y2hlcyggdGVzdENhc2UgKSApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc0ZpbHRlcnMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gIW1fZmlsdGVycy5lbXB0eSgpOworICAgICAgICB9CisgICAgICAgIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IHsKKyAgICAgICAgICAgIC8vIEEgVGVzdFNwZWMgbWF0Y2hlcyBpZiBhbnkgZmlsdGVyIG1hdGNoZXMKKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8RmlsdGVyPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2ZpbHRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX2ZpbHRlcnMuZW5kKCk7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICBpZiggaXQtPm1hdGNoZXMoIHRlc3RDYXNlICkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8RmlsdGVyPiBtX2ZpbHRlcnM7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIFRlc3RTcGVjUGFyc2VyOworICAgIH07Cit9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdFNwZWNQYXJzZXIgeworICAgICAgICBlbnVtIE1vZGV7IE5vbmUsIE5hbWUsIFF1b3RlZE5hbWUsIFRhZywgRXNjYXBlZE5hbWUgfTsKKyAgICAgICAgTW9kZSBtX21vZGU7CisgICAgICAgIGJvb2wgbV9leGNsdXNpb247CisgICAgICAgIHN0ZDo6c2l6ZV90IG1fc3RhcnQsIG1fcG9zOworICAgICAgICBzdGQ6OnN0cmluZyBtX2FyZzsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+IG1fZXNjYXBlQ2hhcnM7CisgICAgICAgIFRlc3RTcGVjOjpGaWx0ZXIgbV9jdXJyZW50RmlsdGVyOworICAgICAgICBUZXN0U3BlYyBtX3Rlc3RTcGVjOworICAgICAgICBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCogbV90YWdBbGlhc2VzOworCisgICAgcHVibGljOgorICAgICAgICBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIHRhZ0FsaWFzZXMgKSA6IG1fdGFnQWxpYXNlcyggJnRhZ0FsaWFzZXMgKSB7fQorCisgICAgICAgIFRlc3RTcGVjUGFyc2VyJiBwYXJzZSggc3RkOjpzdHJpbmcgY29uc3QmIGFyZyApIHsKKyAgICAgICAgICAgIG1fbW9kZSA9IE5vbmU7CisgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IGZhbHNlOworICAgICAgICAgICAgbV9zdGFydCA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgICAgICAgICAgbV9hcmcgPSBtX3RhZ0FsaWFzZXMtPmV4cGFuZEFsaWFzZXMoIGFyZyApOworICAgICAgICAgICAgbV9lc2NhcGVDaGFycy5jbGVhcigpOworICAgICAgICAgICAgZm9yKCBtX3BvcyA9IDA7IG1fcG9zIDwgbV9hcmcuc2l6ZSgpOyArK21fcG9zICkKKyAgICAgICAgICAgICAgICB2aXNpdENoYXIoIG1fYXJnW21fcG9zXSApOworICAgICAgICAgICAgaWYoIG1fbW9kZSA9PSBOYW1lICkKKyAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpOYW1lUGF0dGVybj4oKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYygpIHsKKyAgICAgICAgICAgIGFkZEZpbHRlcigpOworICAgICAgICAgICAgcmV0dXJuIG1fdGVzdFNwZWM7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHZpc2l0Q2hhciggY2hhciBjICkgeworICAgICAgICAgICAgaWYoIG1fbW9kZSA9PSBOb25lICkgeworICAgICAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICBjYXNlICcgJzogcmV0dXJuOworICAgICAgICAgICAgICAgIGNhc2UgJ34nOiBtX2V4Y2x1c2lvbiA9IHRydWU7IHJldHVybjsKKyAgICAgICAgICAgICAgICBjYXNlICdbJzogcmV0dXJuIHN0YXJ0TmV3TW9kZSggVGFnLCArK21fcG9zICk7CisgICAgICAgICAgICAgICAgY2FzZSAnIic6IHJldHVybiBzdGFydE5ld01vZGUoIFF1b3RlZE5hbWUsICsrbV9wb3MgKTsKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6IHJldHVybiBlc2NhcGUoKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBzdGFydE5ld01vZGUoIE5hbWUsIG1fcG9zICk7IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtX21vZGUgPT0gTmFtZSApIHsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnLCcgKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6Ok5hbWVQYXR0ZXJuPigpOworICAgICAgICAgICAgICAgICAgICBhZGRGaWx0ZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYyA9PSAnWycgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzdWJTdHJpbmcoKSA9PSAiZXhjbHVkZToiICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZXhjbHVzaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6TmFtZVBhdHRlcm4+KCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0TmV3TW9kZSggVGFnLCArK21fcG9zICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIGMgPT0gJ1xcJyApCisgICAgICAgICAgICAgICAgICAgIGVzY2FwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggbV9tb2RlID09IEVzY2FwZWROYW1lICkKKyAgICAgICAgICAgICAgICBtX21vZGUgPSBOYW1lOworICAgICAgICAgICAgZWxzZSBpZiggbV9tb2RlID09IFF1b3RlZE5hbWUgJiYgYyA9PSAnIicgKQorICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6Ok5hbWVQYXR0ZXJuPigpOworICAgICAgICAgICAgZWxzZSBpZiggbV9tb2RlID09IFRhZyAmJiBjID09ICddJyApCisgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6VGFnUGF0dGVybj4oKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHN0YXJ0TmV3TW9kZSggTW9kZSBtb2RlLCBzdGQ6OnNpemVfdCBzdGFydCApIHsKKyAgICAgICAgICAgIG1fbW9kZSA9IG1vZGU7CisgICAgICAgICAgICBtX3N0YXJ0ID0gc3RhcnQ7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBlc2NhcGUoKSB7CisgICAgICAgICAgICBpZiggbV9tb2RlID09IE5vbmUgKQorICAgICAgICAgICAgICAgIG1fc3RhcnQgPSBtX3BvczsKKyAgICAgICAgICAgIG1fbW9kZSA9IEVzY2FwZWROYW1lOworICAgICAgICAgICAgbV9lc2NhcGVDaGFycy5wdXNoX2JhY2soIG1fcG9zICk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgc3ViU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbV9hcmcuc3Vic3RyKCBtX3N0YXJ0LCBtX3BvcyAtIG1fc3RhcnQgKTsgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGFkZFBhdHRlcm4oKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0b2tlbiA9IHN1YlN0cmluZygpOworICAgICAgICAgICAgZm9yKCBzaXplX3QgaSA9IDA7IGkgPCBtX2VzY2FwZUNoYXJzLnNpemUoKTsgKytpICkKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0ciggMCwgbV9lc2NhcGVDaGFyc1tpXS1tX3N0YXJ0LWkgKSArIHRva2VuLnN1YnN0ciggbV9lc2NhcGVDaGFyc1tpXS1tX3N0YXJ0LWkrMSApOworICAgICAgICAgICAgbV9lc2NhcGVDaGFycy5jbGVhcigpOworICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIHRva2VuLCAiZXhjbHVkZToiICkgKSB7CisgICAgICAgICAgICAgICAgbV9leGNsdXNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKCA4ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIXRva2VuLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgUHRyPFRlc3RTcGVjOjpQYXR0ZXJuPiBwYXR0ZXJuID0gbmV3IFQoIHRva2VuICk7CisgICAgICAgICAgICAgICAgaWYoIG1fZXhjbHVzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9IG5ldyBUZXN0U3BlYzo6RXhjbHVkZWRQYXR0ZXJuKCBwYXR0ZXJuICk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50RmlsdGVyLm1fcGF0dGVybnMucHVzaF9iYWNrKCBwYXR0ZXJuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IGZhbHNlOworICAgICAgICAgICAgbV9tb2RlID0gTm9uZTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGFkZEZpbHRlcigpIHsKKyAgICAgICAgICAgIGlmKCAhbV9jdXJyZW50RmlsdGVyLm1fcGF0dGVybnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX3Rlc3RTcGVjLm1fZmlsdGVycy5wdXNoX2JhY2soIG1fY3VycmVudEZpbHRlciApOworICAgICAgICAgICAgICAgIG1fY3VycmVudEZpbHRlciA9IFRlc3RTcGVjOjpGaWx0ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgaW5saW5lIFRlc3RTcGVjIHBhcnNlVGVzdFNwZWMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcgKSB7CisgICAgICAgIHJldHVybiBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoIGFyZyApLnRlc3RTcGVjKCk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfY29uZmlnLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfQ09ORklHX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFZlcmJvc2l0eSB7IGVudW0gTGV2ZWwgeworICAgICAgICBOb091dHB1dCA9IDAsCisgICAgICAgIFF1aWV0LAorICAgICAgICBOb3JtYWwKKyAgICB9OyB9OworCisgICAgc3RydWN0IFdhcm5BYm91dCB7IGVudW0gV2hhdCB7CisgICAgICAgIE5vdGhpbmcgPSAweDAwLAorICAgICAgICBOb0Fzc2VydGlvbnMgPSAweDAxCisgICAgfTsgfTsKKworICAgIHN0cnVjdCBTaG93RHVyYXRpb25zIHsgZW51bSBPck5vdCB7CisgICAgICAgIERlZmF1bHRGb3JSZXBvcnRlciwKKyAgICAgICAgQWx3YXlzLAorICAgICAgICBOZXZlcgorICAgIH07IH07CisgICAgc3RydWN0IFJ1blRlc3RzIHsgZW51bSBJbldoYXRPcmRlciB7CisgICAgICAgIEluRGVjbGFyYXRpb25PcmRlciwKKyAgICAgICAgSW5MZXhpY29ncmFwaGljYWxPcmRlciwKKyAgICAgICAgSW5SYW5kb21PcmRlcgorICAgIH07IH07CisgICAgc3RydWN0IFVzZUNvbG91ciB7IGVudW0gWWVzT3JObyB7CisgICAgICAgIEF1dG8sCisgICAgICAgIFllcywKKyAgICAgICAgTm8KKyAgICB9OyB9OworCisgICAgY2xhc3MgVGVzdFNwZWM7CisKKyAgICBzdHJ1Y3QgSUNvbmZpZyA6IElTaGFyZWQgeworCisgICAgICAgIHZpcnR1YWwgfklDb25maWcoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgYWxsb3dUaHJvd3MoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHNob3VsZERlYnVnQnJlYWsoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCB3YXJuQWJvdXRNaXNzaW5nQXNzZXJ0aW9ucygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBpbnQgYWJvcnRBZnRlcigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHNob3dJbnZpc2libGVzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIFNob3dEdXJhdGlvbnM6Ok9yTm90IHNob3dEdXJhdGlvbnMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIFJ1blRlc3RzOjpJbldoYXRPcmRlciBydW5PcmRlcigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcm5nU2VlZCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBVc2VDb2xvdXI6Olllc09yTm8gdXNlQ29sb3VyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZ2V0U2VjdGlvbnNUb1J1bigpIGNvbnN0ID0gMDsKKworICAgIH07Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zdHJlYW0uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU1RSRUFNX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3N0cmVhbWJ1Zi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TVFJFQU1CVUZfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyZWFtYnVmPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgU3RyZWFtQnVmQmFzZSA6IHB1YmxpYyBzdGQ6OnN0cmVhbWJ1ZiB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5TdHJlYW1CdWZCYXNlKCkgQ0FUQ0hfTk9FWENFUFQ7CisgICAgfTsKK30KKworI2luY2x1ZGUgPHN0cmVhbWJ1Zj4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RkOjpvc3RyZWFtJiBjb3V0KCk7CisgICAgc3RkOjpvc3RyZWFtJiBjZXJyKCk7CisKKyAgICBzdHJ1Y3QgSVN0cmVhbSB7CisgICAgICAgIHZpcnR1YWwgfklTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgY2xhc3MgRmlsZVN0cmVhbSA6IHB1YmxpYyBJU3RyZWFtIHsKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om9mc3RyZWFtIG1fb2ZzOworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsZVN0cmVhbSggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVuYW1lICk7CisgICAgICAgIHZpcnR1YWwgfkZpbGVTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKyAgICBwdWJsaWM6IC8vIElTdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFOworICAgIH07CisKKyAgICBjbGFzcyBDb3V0U3RyZWFtIDogcHVibGljIElTdHJlYW0geworICAgICAgICBtdXRhYmxlIHN0ZDo6b3N0cmVhbSBtX29zOworICAgIHB1YmxpYzoKKyAgICAgICAgQ291dFN0cmVhbSgpOworICAgICAgICB2aXJ0dWFsIH5Db3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQ7CisKKyAgICBwdWJsaWM6IC8vIElTdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFOworICAgIH07CisKKyAgICBjbGFzcyBEZWJ1Z091dFN0cmVhbSA6IHB1YmxpYyBJU3RyZWFtIHsKKyAgICAgICAgQ0FUQ0hfQVVUT19QVFIoIFN0cmVhbUJ1ZkJhc2UgKSBtX3N0cmVhbUJ1ZjsKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om9zdHJlYW0gbV9vczsKKyAgICBwdWJsaWM6CisgICAgICAgIERlYnVnT3V0U3RyZWFtKCk7CisgICAgICAgIHZpcnR1YWwgfkRlYnVnT3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQ7CisKKyAgICBwdWJsaWM6IC8vIElTdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFOworICAgIH07Cit9CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpZm5kZWYgQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEggODAKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvbmZpZ0RhdGEgeworCisgICAgICAgIENvbmZpZ0RhdGEoKQorICAgICAgICA6ICAgbGlzdFRlc3RzKCBmYWxzZSApLAorICAgICAgICAgICAgbGlzdFRhZ3MoIGZhbHNlICksCisgICAgICAgICAgICBsaXN0UmVwb3J0ZXJzKCBmYWxzZSApLAorICAgICAgICAgICAgbGlzdFRlc3ROYW1lc09ubHkoIGZhbHNlICksCisgICAgICAgICAgICBzaG93U3VjY2Vzc2Z1bFRlc3RzKCBmYWxzZSApLAorICAgICAgICAgICAgc2hvdWxkRGVidWdCcmVhayggZmFsc2UgKSwKKyAgICAgICAgICAgIG5vVGhyb3coIGZhbHNlICksCisgICAgICAgICAgICBzaG93SGVscCggZmFsc2UgKSwKKyAgICAgICAgICAgIHNob3dJbnZpc2libGVzKCBmYWxzZSApLAorICAgICAgICAgICAgZmlsZW5hbWVzQXNUYWdzKCBmYWxzZSApLAorICAgICAgICAgICAgYWJvcnRBZnRlciggLTEgKSwKKyAgICAgICAgICAgIHJuZ1NlZWQoIDAgKSwKKyAgICAgICAgICAgIHZlcmJvc2l0eSggVmVyYm9zaXR5OjpOb3JtYWwgKSwKKyAgICAgICAgICAgIHdhcm5pbmdzKCBXYXJuQWJvdXQ6Ok5vdGhpbmcgKSwKKyAgICAgICAgICAgIHNob3dEdXJhdGlvbnMoIFNob3dEdXJhdGlvbnM6OkRlZmF1bHRGb3JSZXBvcnRlciApLAorICAgICAgICAgICAgcnVuT3JkZXIoIFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXIgKSwKKyAgICAgICAgICAgIHVzZUNvbG91ciggVXNlQ29sb3VyOjpBdXRvICkKKyAgICAgICAge30KKworICAgICAgICBib29sIGxpc3RUZXN0czsKKyAgICAgICAgYm9vbCBsaXN0VGFnczsKKyAgICAgICAgYm9vbCBsaXN0UmVwb3J0ZXJzOworICAgICAgICBib29sIGxpc3RUZXN0TmFtZXNPbmx5OworCisgICAgICAgIGJvb2wgc2hvd1N1Y2Nlc3NmdWxUZXN0czsKKyAgICAgICAgYm9vbCBzaG91bGREZWJ1Z0JyZWFrOworICAgICAgICBib29sIG5vVGhyb3c7CisgICAgICAgIGJvb2wgc2hvd0hlbHA7CisgICAgICAgIGJvb2wgc2hvd0ludmlzaWJsZXM7CisgICAgICAgIGJvb2wgZmlsZW5hbWVzQXNUYWdzOworCisgICAgICAgIGludCBhYm9ydEFmdGVyOworICAgICAgICB1bnNpZ25lZCBpbnQgcm5nU2VlZDsKKworICAgICAgICBWZXJib3NpdHk6OkxldmVsIHZlcmJvc2l0eTsKKyAgICAgICAgV2FybkFib3V0OjpXaGF0IHdhcm5pbmdzOworICAgICAgICBTaG93RHVyYXRpb25zOjpPck5vdCBzaG93RHVyYXRpb25zOworICAgICAgICBSdW5UZXN0czo6SW5XaGF0T3JkZXIgcnVuT3JkZXI7CisgICAgICAgIFVzZUNvbG91cjo6WWVzT3JObyB1c2VDb2xvdXI7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgb3V0cHV0RmlsZW5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIHByb2Nlc3NOYW1lOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXBvcnRlck5hbWVzOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdGVzdHNPclRhZ3M7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzZWN0aW9uc1RvUnVuOworICAgIH07CisKKyAgICBjbGFzcyBDb25maWcgOiBwdWJsaWMgU2hhcmVkSW1wbDxJQ29uZmlnPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgQ29uZmlnKCBDb25maWcgY29uc3QmIG90aGVyICk7CisgICAgICAgIENvbmZpZyYgb3BlcmF0b3IgPSAoIENvbmZpZyBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGR1bW15KCk7CisgICAgcHVibGljOgorCisgICAgICAgIENvbmZpZygpCisgICAgICAgIHt9CisKKyAgICAgICAgQ29uZmlnKCBDb25maWdEYXRhIGNvbnN0JiBkYXRhICkKKyAgICAgICAgOiAgIG1fZGF0YSggZGF0YSApLAorICAgICAgICAgICAgbV9zdHJlYW0oIG9wZW5TdHJlYW0oKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhZGF0YS50ZXN0c09yVGFncy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIFRlc3RTcGVjUGFyc2VyIHBhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICk7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGRhdGEudGVzdHNPclRhZ3Muc2l6ZSgpOyArK2kgKQorICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2UoIGRhdGEudGVzdHNPclRhZ3NbaV0gKTsKKyAgICAgICAgICAgICAgICBtX3Rlc3RTcGVjID0gcGFyc2VyLnRlc3RTcGVjKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5Db25maWcoKSB7fQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBnZXRGaWxlbmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2RhdGEub3V0cHV0RmlsZW5hbWUgOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBsaXN0VGVzdHMoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFRlc3RzOyB9CisgICAgICAgIGJvb2wgbGlzdFRlc3ROYW1lc09ubHkoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFRlc3ROYW1lc09ubHk7IH0KKyAgICAgICAgYm9vbCBsaXN0VGFncygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0VGFnczsgfQorICAgICAgICBib29sIGxpc3RSZXBvcnRlcnMoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFJlcG9ydGVyczsgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGdldFByb2Nlc3NOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnByb2Nlc3NOYW1lOyB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBnZXRSZXBvcnRlck5hbWVzKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnJlcG9ydGVyTmFtZXM7IH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBnZXRTZWN0aW9uc1RvUnVuKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV9kYXRhLnNlY3Rpb25zVG9SdW47IH0KKworICAgICAgICB2aXJ0dWFsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fdGVzdFNwZWM7IH0KKworICAgICAgICBib29sIHNob3dIZWxwKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnNob3dIZWxwOyB9CisKKyAgICAgICAgLy8gSUNvbmZpZyBpbnRlcmZhY2UKKyAgICAgICAgdmlydHVhbCBib29sIGFsbG93VGhyb3dzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgICAgICAgICAgICAgIHsgcmV0dXJuICFtX2RhdGEubm9UaHJvdzsgfQorICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgICAgICAgICAgeyByZXR1cm4gbV9zdHJlYW0tPnN0cmVhbSgpOyB9CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0IENBVENIX09WRVJSSURFICAgICAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEubmFtZS5lbXB0eSgpID8gbV9kYXRhLnByb2Nlc3NOYW1lIDogbV9kYXRhLm5hbWU7IH0KKyAgICAgICAgdmlydHVhbCBib29sIGluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIGNvbnN0IENBVENIX09WRVJSSURFICAgIHsgcmV0dXJuIG1fZGF0YS5zaG93U3VjY2Vzc2Z1bFRlc3RzOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCB3YXJuQWJvdXRNaXNzaW5nQXNzZXJ0aW9ucygpIGNvbnN0IENBVENIX09WRVJSSURFICB7IHJldHVybiBtX2RhdGEud2FybmluZ3MgJiBXYXJuQWJvdXQ6Ok5vQXNzZXJ0aW9uczsgfQorICAgICAgICB2aXJ0dWFsIFNob3dEdXJhdGlvbnM6Ok9yTm90IHNob3dEdXJhdGlvbnMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuc2hvd0R1cmF0aW9uczsgfQorICAgICAgICB2aXJ0dWFsIFJ1blRlc3RzOjpJbldoYXRPcmRlciBydW5PcmRlcigpIGNvbnN0IENBVENIX09WRVJSSURFICAgeyByZXR1cm4gbV9kYXRhLnJ1bk9yZGVyOyB9CisgICAgICAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJuZ1NlZWQoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEucm5nU2VlZDsgfQorICAgICAgICB2aXJ0dWFsIFVzZUNvbG91cjo6WWVzT3JObyB1c2VDb2xvdXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgeyByZXR1cm4gbV9kYXRhLnVzZUNvbG91cjsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRGVidWdCcmVhaygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5zaG91bGREZWJ1Z0JyZWFrOyB9CisgICAgICAgIHZpcnR1YWwgaW50IGFib3J0QWZ0ZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuYWJvcnRBZnRlcjsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvd0ludmlzaWJsZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuc2hvd0ludmlzaWJsZXM7IH0KKworICAgIHByaXZhdGU6CisKKyAgICAgICAgSVN0cmVhbSBjb25zdCogb3BlblN0cmVhbSgpIHsKKyAgICAgICAgICAgIGlmKCBtX2RhdGEub3V0cHV0RmlsZW5hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3V0U3RyZWFtKCk7CisgICAgICAgICAgICBlbHNlIGlmKCBtX2RhdGEub3V0cHV0RmlsZW5hbWVbMF0gPT0gJyUnICkgeworICAgICAgICAgICAgICAgIGlmKCBtX2RhdGEub3V0cHV0RmlsZW5hbWUgPT0gIiVkZWJ1ZyIgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlYnVnT3V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggIlVucmVjb2duaXNlZCBzdHJlYW06ICIgKyBtX2RhdGEub3V0cHV0RmlsZW5hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVTdHJlYW0oIG1fZGF0YS5vdXRwdXRGaWxlbmFtZSApOworICAgICAgICB9CisgICAgICAgIENvbmZpZ0RhdGEgbV9kYXRhOworCisgICAgICAgIENBVENIX0FVVE9fUFRSKCBJU3RyZWFtIGNvbnN0ICkgbV9zdHJlYW07CisgICAgICAgIFRlc3RTcGVjIG1fdGVzdFNwZWM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jbGFyYS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DTEFSQV9IX0lOQ0xVREVECisKKy8vIFVzZSBDYXRjaCdzIHZhbHVlIGZvciBjb25zb2xlIHdpZHRoIChzdG9yZSBDbGFyYSdzIG9mZiB0byB0aGUgc2lkZSwgaWYgcHJlc2VudCkKKyNpZmRlZiBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI2RlZmluZSBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjdW5kZWYgQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNlbmRpZgorI2RlZmluZSBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSAorCisvLyBEZWNsYXJlIENsYXJhIGluc2lkZSB0aGUgQ2F0Y2ggbmFtZXNwYWNlCisjZGVmaW5lIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRSBuYW1lc3BhY2UgQ2F0Y2ggeworLy8gI2luY2x1ZGVkIGZyb206IC4uL2V4dGVybmFsL2NsYXJhLmgKKworLy8gVmVyc2lvbiAwLjAuMi40CisKKy8vIE9ubHkgdXNlIGhlYWRlciBndWFyZCBpZiB3ZSBhcmUgbm90IHVzaW5nIGFuIG91dGVyIG5hbWVzcGFjZQorI2lmICFkZWZpbmVkKFRXT0JMVUVDVUJFU19DTEFSQV9IX0lOQ0xVREVEKSB8fCBkZWZpbmVkKFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRSkKKworI2lmbmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NMQVJBX0hfSU5DTFVERUQKKyNkZWZpbmUgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisjZGVmaW5lIFNUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UKKyNlbHNlCisjZGVmaW5lIFNUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UgfQorI2VuZGlmCisKKyNkZWZpbmUgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PUEVOX05BTUVTUEFDRSBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKworLy8gLS0tLS0tLS0tLS0gI2luY2x1ZGVkIGZyb20gdGJjX3RleHRfZm9ybWF0LmggLS0tLS0tLS0tLS0KKworLy8gT25seSB1c2UgaGVhZGVyIGd1YXJkIGlmIHdlIGFyZSBub3QgdXNpbmcgYW4gb3V0ZXIgbmFtZXNwYWNlCisjaWYgIWRlZmluZWQoVEJDX1RFWFRfRk9STUFUX0hfSU5DTFVERUQpIHx8IGRlZmluZWQoU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UpCisjaWZuZGVmIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCisjZGVmaW5lIFRCQ19URVhUX0ZPUk1BVF9IX0lOQ0xVREVECisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisvLyBVc2Ugb3B0aW9uYWwgb3V0ZXIgbmFtZXNwYWNlCisjaWZkZWYgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK25hbWVzcGFjZSBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRSB7CisjZW5kaWYKKworbmFtZXNwYWNlIFRiYyB7CisKKyNpZmRlZiBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSAorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSDsKKyNlbHNlCisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IDgwOworI2VuZGlmCisKKyAgICBzdHJ1Y3QgVGV4dEF0dHJpYnV0ZXMgeworICAgICAgICBUZXh0QXR0cmlidXRlcygpCisgICAgICAgIDogICBpbml0aWFsSW5kZW50KCBzdGQ6OnN0cmluZzo6bnBvcyApLAorICAgICAgICAgICAgaW5kZW50KCAwICksCisgICAgICAgICAgICB3aWR0aCggY29uc29sZVdpZHRoLTEgKSwKKyAgICAgICAgICAgIHRhYkNoYXIoICdcdCcgKQorICAgICAgICB7fQorCisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRJbml0aWFsSW5kZW50KCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgeyBpbml0aWFsSW5kZW50ID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldEluZGVudCggc3RkOjpzaXplX3QgX3ZhbHVlICkgICAgICAgICB7IGluZGVudCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRXaWR0aCggc3RkOjpzaXplX3QgX3ZhbHVlICkgICAgICAgICAgeyB3aWR0aCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRUYWJDaGFyKCBjaGFyIF92YWx1ZSApICAgICAgICAgICAgICAgeyB0YWJDaGFyID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgICBzdGQ6OnNpemVfdCBpbml0aWFsSW5kZW50OyAgLy8gaW5kZW50IG9mIGZpcnN0IGxpbmUsIG9yIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3QgaW5kZW50OyAgICAgICAgIC8vIGluZGVudCBvZiBzdWJzZXF1ZW50IGxpbmVzLCBvciBhbGwgaWYgaW5pdGlhbEluZGVudCBpcyBucG9zCisgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoOyAgICAgICAgICAvLyBtYXhpbXVtIHdpZHRoIG9mIHRleHQsIGluY2x1ZGluZyBpbmRlbnQuIExvbmdlciB0ZXh0IHdpbGwgd3JhcAorICAgICAgICBjaGFyIHRhYkNoYXI7ICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBjaGFyIGlzIHNlZW4gdGhlIGluZGVudCBpcyBjaGFuZ2VkIHRvIGN1cnJlbnQgcG9zCisgICAgfTsKKworICAgIGNsYXNzIFRleHQgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIF9zdHIsIFRleHRBdHRyaWJ1dGVzIGNvbnN0JiBfYXR0ciA9IFRleHRBdHRyaWJ1dGVzKCkgKQorICAgICAgICA6IGF0dHIoIF9hdHRyICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgd3JhcHBhYmxlQ2hhcnMgPSAiIFsoey4sL3xcXC0iOworICAgICAgICAgICAgc3RkOjpzaXplX3QgaW5kZW50ID0gX2F0dHIuaW5pdGlhbEluZGVudCAhPSBzdGQ6OnN0cmluZzo6bnBvcworICAgICAgICAgICAgICAgID8gX2F0dHIuaW5pdGlhbEluZGVudAorICAgICAgICAgICAgICAgIDogX2F0dHIuaW5kZW50OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVtYWluZGVyID0gX3N0cjsKKworICAgICAgICAgICAgd2hpbGUoICFyZW1haW5kZXIuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBpZiggbGluZXMuc2l6ZSgpID49IDEwMDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2hfYmFjayggIi4uLiBtZXNzYWdlIHRydW5jYXRlZCBkdWUgdG8gZXhjZXNzaXZlIHNpemUiICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgdGFiUG9zID0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3Qgd2lkdGggPSAoc3RkOjptaW4pKCByZW1haW5kZXIuc2l6ZSgpLCBfYXR0ci53aWR0aCAtIGluZGVudCApOworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBvcyA9IHJlbWFpbmRlci5maW5kX2ZpcnN0X29mKCAnXG4nICk7CisgICAgICAgICAgICAgICAgaWYoIHBvcyA8PSB3aWR0aCApIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvcyA9IHJlbWFpbmRlci5maW5kX2xhc3Rfb2YoIF9hdHRyLnRhYkNoYXIsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFiUG9zID0gcG9zOworICAgICAgICAgICAgICAgICAgICBpZiggcmVtYWluZGVyW3dpZHRoXSA9PSAnXG4nICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLS07CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlci5zdWJzdHIoIDAsIHRhYlBvcyApICsgcmVtYWluZGVyLnN1YnN0ciggdGFiUG9zKzEgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggd2lkdGggPT0gcmVtYWluZGVyLnNpemUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIHJlbWFpbmRlclt3aWR0aF0gPT0gJ1xuJyApIHsKKyAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCB3aWR0aCA8PSAxIHx8IHJlbWFpbmRlci5zaXplKCkgIT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIgPSByZW1haW5kZXIuc3Vic3RyKCAxICk7CisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IF9hdHRyLmluZGVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBvcyA9IHJlbWFpbmRlci5maW5kX2xhc3Rfb2YoIHdyYXBwYWJsZUNoYXJzLCB3aWR0aCApOworICAgICAgICAgICAgICAgICAgICBpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIHBvcyA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2VMaW5lKCBpbmRlbnQsIHJlbWFpbmRlciwgcG9zICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVtYWluZGVyWzBdID09ICcgJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyID0gcmVtYWluZGVyLnN1YnN0ciggMSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHdpZHRoLTEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmJhY2soKSArPSAiLSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIGxpbmVzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IF9hdHRyLmluZGVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHRhYlBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiUG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc3BsaWNlTGluZSggc3RkOjpzaXplX3QgX2luZGVudCwgc3RkOjpzdHJpbmcmIF9yZW1haW5kZXIsIHN0ZDo6c2l6ZV90IF9wb3MgKSB7CisgICAgICAgICAgICBsaW5lcy5wdXNoX2JhY2soIHN0ZDo6c3RyaW5nKCBfaW5kZW50LCAnICcgKSArIF9yZW1haW5kZXIuc3Vic3RyKCAwLCBfcG9zICkgKTsKKyAgICAgICAgICAgIF9yZW1haW5kZXIgPSBfcmVtYWluZGVyLnN1YnN0ciggX3BvcyApOworICAgICAgICB9CisKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmVnaW4oKTsgfQorICAgICAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBsaW5lcy5lbmQoKTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbGFzdCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmJhY2soKTsgfQorICAgICAgICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbGluZXMuc2l6ZSgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRvcltdKCBzdGQ6OnNpemVfdCBfaW5kZXggKSBjb25zdCB7IHJldHVybiBsaW5lc1tfaW5kZXhdOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAqdGhpczsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIFRleHQgY29uc3QmIF90ZXh0ICkgeworICAgICAgICAgICAgZm9yKCBUZXh0Ojpjb25zdF9pdGVyYXRvciBpdCA9IF90ZXh0LmJlZ2luKCksIGl0RW5kID0gX3RleHQuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IF90ZXh0LmJlZ2luKCkgKQorICAgICAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA8PCAqaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICAgICBUZXh0QXR0cmlidXRlcyBhdHRyOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFRiYworCisjaWZkZWYgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK30gLy8gZW5kIG91dGVyIG5hbWVzcGFjZQorI2VuZGlmCisKKyNlbmRpZiAvLyBUQkNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRAorCisvLyAtLS0tLS0tLS0tLSBlbmQgb2YgI2luY2x1ZGUgZnJvbSB0YmNfdGV4dF9mb3JtYXQuaCAtLS0tLS0tLS0tLQorLy8gLi4uLi4uLi4uLi4gYmFjayBpbiBjbGFyYS5oCisKKyN1bmRlZiBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09QRU5fTkFNRVNQQUNFCisKKy8vIC0tLS0tLS0tLS0tICNpbmNsdWRlZCBmcm9tIGNsYXJhX2NvbXBpbGVycy5oIC0tLS0tLS0tLS0tCisKKyNpZm5kZWYgVFdPQkxVRUNVQkVTX0NMQVJBX0NPTVBJTEVSU19IX0lOQ0xVREVECisjZGVmaW5lIFRXT0JMVUVDVUJFU19DTEFSQV9DT01QSUxFUlNfSF9JTkNMVURFRAorCisvLyBEZXRlY3QgYSBudW1iZXIgb2YgY29tcGlsZXIgZmVhdHVyZXMgLSBtb3N0bHkgQysrMTEvMTQgY29uZm9ybWFuY2UgLSBieSBjb21waWxlcgorLy8gVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgZGVmaW5lZDoKKy8vCisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUiA6IGlzIG51bGxwdHIgc3VwcG9ydGVkPworLy8gQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUIDogaXMgbm9leGNlcHQgc3VwcG9ydGVkPworLy8gQ0xBUkFfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTIDogVGhlIGRlbGV0ZSBhbmQgZGVmYXVsdCBrZXl3b3JkcyBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIG1ldGhvZHMKKy8vIENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERSA6IGlzIG92ZXJyaWRlIHN1cHBvcnRlZD8KKy8vIENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSIDogaXMgdW5pcXVlX3B0ciBzdXBwb3J0ZWQgKG90aGVyd2lzZSB1c2UgYXV0b19wdHIpCisKKy8vIENMQVJBX0NPTkZJR19DUFAxMV9PUl9HUkVBVEVSIDogSXMgQysrMTEgc3VwcG9ydGVkPworCisvLyBDTEFSQV9DT05GSUdfVkFSSUFESUNfTUFDUk9TIDogYXJlIHZhcmlhZGljIG1hY3JvcyBzdXBwb3J0ZWQ/CisKKy8vIEluIGdlbmVyYWwgZWFjaCBtYWNybyBoYXMgYSBfTk9fPGZlYXR1cmUgbmFtZT4gZm9ybQorLy8gKGUuZy4gQ0xBUkFfQ09ORklHX0NQUDExX05PX05VTExQVFIpIHdoaWNoIGRpc2FibGVzIHRoZSBmZWF0dXJlLgorLy8gTWFueSBmZWF0dXJlcywgYXQgcG9pbnQgb2YgZGV0ZWN0aW9uLCBkZWZpbmUgYW4gX0lOVEVSTkFMXyBtYWNybywgc28gdGhleQorLy8gY2FuIGJlIGNvbWJpbmVkLCBlbi1tYXNzLCB3aXRoIHRoZSBfTk9fIGZvcm1zIGxhdGVyLgorCisvLyBBbGwgdGhlIEMrKzExIGZlYXR1cmVzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIENMQVJBX0NPTkZJR19OT19DUFAxMQorCisjaWZkZWYgX19jbGFuZ19fCisKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9udWxscHRyKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9ub2V4Y2VwdCkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZW5kaWYKKworI2VuZGlmIC8vIF9fY2xhbmdfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR0NDCisjaWZkZWYgX19HTlVDX18KKworI2lmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gNiAmJiBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisKKy8vIC0gb3RoZXJ3aXNlIG1vcmUgcmVjZW50IHZlcnNpb25zIGRlZmluZSBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisvLyBhbmQgd2lsbCBnZXQgcGlja2VkIHVwIGJlbG93CisKKyNlbmRpZiAvLyBfX0dOVUNfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVmlzdWFsIEMrKworI2lmZGVmIF9NU0NfVkVSCisKKyNpZiAoX01TQ19WRVIgPj0gMTYwMCkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorCisjaWYgKF9NU0NfVkVSID49IDE5MDAgKSAvLyAoVkMrKyAxMyAoVlMyMDE1KSkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2VuZGlmCisKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQysrIGxhbmd1YWdlIGZlYXR1cmUgc3VwcG9ydAorCisvLyBjYXRjaCBhbGwgc3VwcG9ydCBmb3IgQysrMTEKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKyNkZWZpbmUgQ0xBUkFfQ1BQMTFfT1JfR1JFQVRFUgorCisjaWYgIWRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKworI2lmbmRlZiBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZW5kaWYKKworI2lmbmRlZiBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERSkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFCisjZW5kaWYKKyNpZiAhZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorCisjZW5kaWYgLy8gX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisvLyBOb3cgc2V0IHRoZSBhY3R1YWwgZGVmaW5lcyBiYXNlZCBvbiB0aGUgYWJvdmUgKyBhbnl0aGluZyB0aGUgdXNlciBoYXMgY29uZmlndXJlZAorI2lmIGRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT19OVUxMUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX0NQUDExKQorI2RlZmluZSBDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT19OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT19HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19PVkVSUklERSkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX09WRVJSSURFKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKworLy8gbm9leGNlcHQgc3VwcG9ydDoKKyNpZiBkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0xBUkFfTk9FWENFUFQpCisjZGVmaW5lIENMQVJBX05PRVhDRVBUIG5vZXhjZXB0CisjICBkZWZpbmUgQ0xBUkFfTk9FWENFUFRfSVMoeCkgbm9leGNlcHQoeCkKKyNlbHNlCisjZGVmaW5lIENMQVJBX05PRVhDRVBUIHRocm93KCkKKyMgIGRlZmluZSBDTEFSQV9OT0VYQ0VQVF9JUyh4KQorI2VuZGlmCisKKy8vIG51bGxwdHIgc3VwcG9ydAorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZGVmaW5lIENMQVJBX05VTEwgbnVsbHB0cgorI2Vsc2UKKyNkZWZpbmUgQ0xBUkFfTlVMTCBOVUxMCisjZW5kaWYKKworLy8gb3ZlcnJpZGUgc3VwcG9ydAorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2RlZmluZSBDTEFSQV9PVkVSUklERSBvdmVycmlkZQorI2Vsc2UKKyNkZWZpbmUgQ0xBUkFfT1ZFUlJJREUKKyNlbmRpZgorCisvLyB1bmlxdWVfcHRyIHN1cHBvcnQKKyNpZmRlZiBDTEFSQV9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorIyAgIGRlZmluZSBDTEFSQV9BVVRPX1BUUiggVCApIHN0ZDo6dW5pcXVlX3B0cjxUPgorI2Vsc2UKKyMgICBkZWZpbmUgQ0xBUkFfQVVUT19QVFIoIFQgKSBzdGQ6OmF1dG9fcHRyPFQ+CisjZW5kaWYKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19DTEFSQV9DT01QSUxFUlNfSF9JTkNMVURFRAorCisvLyAtLS0tLS0tLS0tLSBlbmQgb2YgI2luY2x1ZGUgZnJvbSBjbGFyYV9jb21waWxlcnMuaCAtLS0tLS0tLS0tLQorLy8gLi4uLi4uLi4uLi4gYmFjayBpbiBjbGFyYS5oCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgQ0xBUkFfUExBVEZPUk1fV0lORE9XUworI2VuZGlmCisKKy8vIFVzZSBvcHRpb25hbCBvdXRlciBuYW1lc3BhY2UKKyNpZmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKK1NUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorI2VuZGlmCisKK25hbWVzcGFjZSBDbGFyYSB7CisKKyAgICBzdHJ1Y3QgVW5wb3NpdGlvbmFsVGFnIHt9OworCisgICAgZXh0ZXJuIFVucG9zaXRpb25hbFRhZyBfOworCisjaWZkZWYgQ0xBUkFfQ09ORklHX01BSU4KKyAgICBVbnBvc2l0aW9uYWxUYWcgXzsKKyNlbmRpZgorCisgICAgbmFtZXNwYWNlIERldGFpbCB7CisKKyNpZmRlZiBDTEFSQV9DT05TT0xFX1dJRFRICisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIOworI2Vsc2UKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gODA7CisjZW5kaWYKKworICAgICAgICB1c2luZyBuYW1lc3BhY2UgVGJjOworCisgICAgICAgIGlubGluZSBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcmVmaXggKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyLnNpemUoKSA+PSBwcmVmaXguc2l6ZSgpICYmIHN0ci5zdWJzdHIoIDAsIHByZWZpeC5zaXplKCkgKSA9PSBwcmVmaXg7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlQ29uc3RSZWZ7IHR5cGVkZWYgVCB0eXBlOyB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlQ29uc3RSZWY8VCY+eyB0eXBlZGVmIFQgdHlwZTsgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFJlbW92ZUNvbnN0UmVmPFQgY29uc3QmPnsgdHlwZWRlZiBUIHR5cGU7IH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdFJlZjxUIGNvbnN0PnsgdHlwZWRlZiBUIHR5cGU7IH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gICAgc3RydWN0IElzQm9vbCAgICAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7IH07CisgICAgICAgIHRlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBJc0Jvb2w8Ym9vbD4geyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBjb252ZXJ0SW50byggc3RkOjpzdHJpbmcgY29uc3QmIF9zb3VyY2UsIFQmIF9kZXN0ICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCBfc291cmNlOworICAgICAgICAgICAgc3MgPj4gX2Rlc3Q7CisgICAgICAgICAgICBpZiggc3MuZmFpbCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJVbmFibGUgdG8gY29udmVydCAiICsgX3NvdXJjZSArICIgdG8gZGVzdGluYXRpb24gdHlwZSIgKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgdm9pZCBjb252ZXJ0SW50byggc3RkOjpzdHJpbmcgY29uc3QmIF9zb3VyY2UsIHN0ZDo6c3RyaW5nJiBfZGVzdCApIHsKKyAgICAgICAgICAgIF9kZXN0ID0gX3NvdXJjZTsKKyAgICAgICAgfQorICAgICAgICBjaGFyIHRvTG93ZXJDaChjaGFyIGMpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPiggc3RkOjp0b2xvd2VyKCBjICkgKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgdm9pZCBjb252ZXJ0SW50byggc3RkOjpzdHJpbmcgY29uc3QmIF9zb3VyY2UsIGJvb2wmIF9kZXN0ICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlTEMgPSBfc291cmNlOworICAgICAgICAgICAgc3RkOjp0cmFuc2Zvcm0oIHNvdXJjZUxDLmJlZ2luKCksIHNvdXJjZUxDLmVuZCgpLCBzb3VyY2VMQy5iZWdpbigpLCB0b0xvd2VyQ2ggKTsKKyAgICAgICAgICAgIGlmKCBzb3VyY2VMQyA9PSAieSIgfHwgc291cmNlTEMgPT0gIjEiIHx8IHNvdXJjZUxDID09ICJ0cnVlIiB8fCBzb3VyY2VMQyA9PSAieWVzIiB8fCBzb3VyY2VMQyA9PSAib24iICkKKyAgICAgICAgICAgICAgICBfZGVzdCA9IHRydWU7CisgICAgICAgICAgICBlbHNlIGlmKCBzb3VyY2VMQyA9PSAibiIgfHwgc291cmNlTEMgPT0gIjAiIHx8IHNvdXJjZUxDID09ICJmYWxzZSIgfHwgc291cmNlTEMgPT0gIm5vIiB8fCBzb3VyY2VMQyA9PSAib2ZmIiApCisgICAgICAgICAgICAgICAgX2Rlc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJFeHBlY3RlZCBhIGJvb2xlYW4gdmFsdWUgYnV0IGRpZCBub3QgcmVjb2duaXNlOlxuICAnIiArIF9zb3VyY2UgKyAiJyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbmZpZ1Q+CisgICAgICAgIHN0cnVjdCBJQXJnRnVuY3Rpb24geworICAgICAgICAgICAgdmlydHVhbCB+SUFyZ0Z1bmN0aW9uKCkge30KKyNpZmRlZiBDTEFSQV9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgICAgIElBcmdGdW5jdGlvbigpICAgICAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgICAgIElBcmdGdW5jdGlvbiggSUFyZ0Z1bmN0aW9uIGNvbnN0JiApID0gZGVmYXVsdDsKKyNlbmRpZgorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQ29uZmlnVCYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbiogY2xvbmUoKSBjb25zdCA9IDA7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICAgICAgY2xhc3MgQm91bmRBcmdGdW5jdGlvbiB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24oKSA6IGZ1bmN0aW9uT2JqKCBDTEFSQV9OVUxMICkge30KKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24oIElBcmdGdW5jdGlvbjxDb25maWdUPiogX2Z1bmN0aW9uT2JqICkgOiBmdW5jdGlvbk9iaiggX2Z1bmN0aW9uT2JqICkge30KKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24oIEJvdW5kQXJnRnVuY3Rpb24gY29uc3QmIG90aGVyICkgOiBmdW5jdGlvbk9iaiggb3RoZXIuZnVuY3Rpb25PYmogPyBvdGhlci5mdW5jdGlvbk9iai0+Y2xvbmUoKSA6IENMQVJBX05VTEwgKSB7fQorICAgICAgICAgICAgQm91bmRBcmdGdW5jdGlvbiYgb3BlcmF0b3IgPSAoIEJvdW5kQXJnRnVuY3Rpb24gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgICAgIElBcmdGdW5jdGlvbjxDb25maWdUPiogbmV3RnVuY3Rpb25PYmogPSBvdGhlci5mdW5jdGlvbk9iaiA/IG90aGVyLmZ1bmN0aW9uT2JqLT5jbG9uZSgpIDogQ0xBUkFfTlVMTDsKKyAgICAgICAgICAgICAgICBkZWxldGUgZnVuY3Rpb25PYmo7CisgICAgICAgICAgICAgICAgZnVuY3Rpb25PYmogPSBuZXdGdW5jdGlvbk9iajsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB+Qm91bmRBcmdGdW5jdGlvbigpIHsgZGVsZXRlIGZ1bmN0aW9uT2JqOyB9CisKKyAgICAgICAgICAgIHZvaWQgc2V0KCBDb25maWdUJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbk9iai0+c2V0KCBjb25maWcsIHZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gZnVuY3Rpb25PYmotPnRha2VzQXJnKCk7IH0KKworICAgICAgICAgICAgYm9vbCBpc1NldCgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25PYmogIT0gQ0xBUkFfTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIElBcmdGdW5jdGlvbjxDb25maWdUPiogZnVuY3Rpb25PYmo7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgc3RydWN0IE51bGxCaW5kZXIgOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiwgc3RkOjpzdHJpbmcgY29uc3QmICkgY29uc3Qge30KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBOdWxsQmluZGVyKCAqdGhpcyApOyB9CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgc3RydWN0IEJvdW5kRGF0YU1lbWJlciA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kRGF0YU1lbWJlciggTSBDOjoqIF9tZW1iZXIgKSA6IG1lbWJlciggX21lbWJlciApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBwLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCBwLiptZW1iZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuICFJc0Jvb2w8TT46OnZhbHVlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmREYXRhTWVtYmVyKCAqdGhpcyApOyB9CisgICAgICAgICAgICBNIEM6OiogbWVtYmVyOworICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICBzdHJ1Y3QgQm91bmRVbmFyeU1ldGhvZCA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kVW5hcnlNZXRob2QoIHZvaWQgKEM6OipfbWVtYmVyKSggTSApICkgOiBtZW1iZXIoIF9tZW1iZXIgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgcCwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHR5cGVuYW1lIFJlbW92ZUNvbnN0UmVmPE0+Ojp0eXBlIHZhbHVlOworICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRvKCBzdHJpbmdWYWx1ZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICAocC4qbWVtYmVyKSggdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuICFJc0Jvb2w8TT46OnZhbHVlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmRVbmFyeU1ldGhvZCggKnRoaXMgKTsgfQorICAgICAgICAgICAgdm9pZCAoQzo6Km1lbWJlcikoIE0gKTsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgc3RydWN0IEJvdW5kTnVsbGFyeU1ldGhvZCA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kTnVsbGFyeU1ldGhvZCggdm9pZCAoQzo6Kl9tZW1iZXIpKCkgKSA6IG1lbWJlciggX21lbWJlciApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBwLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgYm9vbCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgaWYoIHZhbHVlICkKKyAgICAgICAgICAgICAgICAgICAgKHAuKm1lbWJlcikoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmROdWxsYXJ5TWV0aG9kKCAqdGhpcyApOyB9CisgICAgICAgICAgICB2b2lkIChDOjoqbWVtYmVyKSgpOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgIHN0cnVjdCBCb3VuZFVuYXJ5RnVuY3Rpb24gOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICBCb3VuZFVuYXJ5RnVuY3Rpb24oIHZvaWQgKCpfZnVuY3Rpb24pKCBDJiApICkgOiBmdW5jdGlvbiggX2Z1bmN0aW9uICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIG9iaiwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIGJvb2wgdmFsdWU7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSApCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBvYmogKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmRVbmFyeUZ1bmN0aW9uKCAqdGhpcyApOyB9CisgICAgICAgICAgICB2b2lkICgqZnVuY3Rpb24pKCBDJiApOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFQ+CisgICAgICAgIHN0cnVjdCBCb3VuZEJpbmFyeUZ1bmN0aW9uIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmRCaW5hcnlGdW5jdGlvbiggdm9pZCAoKl9mdW5jdGlvbikoIEMmLCBUICkgKSA6IGZ1bmN0aW9uKCBfZnVuY3Rpb24gKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgb2JqLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgUmVtb3ZlQ29uc3RSZWY8VD46OnR5cGUgdmFsdWU7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBvYmosIHZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiAhSXNCb29sPFQ+Ojp2YWx1ZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IEJvdW5kQmluYXJ5RnVuY3Rpb24oICp0aGlzICk7IH0KKyAgICAgICAgICAgIHZvaWQgKCpmdW5jdGlvbikoIEMmLCBUICk7CisgICAgICAgIH07CisKKyAgICB9IC8vIG5hbWVzcGFjZSBEZXRhaWwKKworICAgIGlubGluZSBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJnc1RvVmVjdG9yKCBpbnQgYXJnYywgY2hhciBjb25zdCogY29uc3QqIGNvbnN0IGFyZ3YgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzKCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIGFyZ2MgKSApOworICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBhcmdjICk7ICsraSApCisgICAgICAgICAgICBhcmdzW2ldID0gYXJndltpXTsKKworICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisKKyAgICBjbGFzcyBQYXJzZXIgeworICAgICAgICBlbnVtIE1vZGUgeyBOb25lLCBNYXliZVNob3J0T3B0LCBTbGFzaE9wdCwgU2hvcnRPcHQsIExvbmdPcHQsIFBvc2l0aW9uYWwgfTsKKyAgICAgICAgTW9kZSBtb2RlOworICAgICAgICBzdGQ6OnNpemVfdCBmcm9tOworICAgICAgICBib29sIGluUXVvdGVzOworICAgIHB1YmxpYzoKKworICAgICAgICBzdHJ1Y3QgVG9rZW4geworICAgICAgICAgICAgZW51bSBUeXBlIHsgUG9zaXRpb25hbCwgU2hvcnRPcHQsIExvbmdPcHQgfTsKKyAgICAgICAgICAgIFRva2VuKCBUeXBlIF90eXBlLCBzdGQ6OnN0cmluZyBjb25zdCYgX2RhdGEgKSA6IHR5cGUoIF90eXBlICksIGRhdGEoIF9kYXRhICkge30KKyAgICAgICAgICAgIFR5cGUgdHlwZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisgICAgICAgIH07CisKKyAgICAgICAgUGFyc2VyKCkgOiBtb2RlKCBOb25lICksIGZyb20oIDAgKSwgaW5RdW90ZXMoIGZhbHNlICl7fQorCisgICAgICAgIHZvaWQgcGFyc2VJbnRvVG9rZW5zKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGFyZ3MsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZG91YmxlRGFzaCA9ICItLSI7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAxOyBpIDwgYXJncy5zaXplKCkgJiYgYXJnc1tpXSAhPSBkb3VibGVEYXNoOyArK2kgKQorICAgICAgICAgICAgICAgIHBhcnNlSW50b1Rva2VucyggYXJnc1tpXSwgdG9rZW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcGFyc2VJbnRvVG9rZW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBhcmcuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gYXJnW2ldOworICAgICAgICAgICAgICAgIGlmKCBjID09ICciJyApCisgICAgICAgICAgICAgICAgICAgIGluUXVvdGVzID0gIWluUXVvdGVzOworICAgICAgICAgICAgICAgIG1vZGUgPSBoYW5kbGVNb2RlKCBpLCBjLCBhcmcsIHRva2VucyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW9kZSA9IGhhbmRsZU1vZGUoIGFyZy5zaXplKCksICdcMCcsIGFyZywgdG9rZW5zICk7CisgICAgICAgIH0KKyAgICAgICAgTW9kZSBoYW5kbGVNb2RlKCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgc3dpdGNoKCBtb2RlICkgeworICAgICAgICAgICAgICAgIGNhc2UgTm9uZTogcmV0dXJuIGhhbmRsZU5vbmUoIGksIGMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIE1heWJlU2hvcnRPcHQ6IHJldHVybiBoYW5kbGVNYXliZVNob3J0T3B0KCBpLCBjICk7CisgICAgICAgICAgICAgICAgY2FzZSBTaG9ydE9wdDoKKyAgICAgICAgICAgICAgICBjYXNlIExvbmdPcHQ6CisgICAgICAgICAgICAgICAgY2FzZSBTbGFzaE9wdDogcmV0dXJuIGhhbmRsZU9wdCggaSwgYywgYXJnLCB0b2tlbnMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIFBvc2l0aW9uYWw6IHJldHVybiBoYW5kbGVQb3NpdGlvbmFsKCBpLCBjLCBhcmcsIHRva2VucyApOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJVbmtub3duIG1vZGUiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNb2RlIGhhbmRsZU5vbmUoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYyApIHsKKyAgICAgICAgICAgIGlmKCBpblF1b3RlcyApIHsKKyAgICAgICAgICAgICAgICBmcm9tID0gaTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUG9zaXRpb25hbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICBjYXNlICctJzogcmV0dXJuIE1heWJlU2hvcnRPcHQ7CisjaWZkZWYgQ0xBUkFfUExBVEZPUk1fV0lORE9XUworICAgICAgICAgICAgICAgIGNhc2UgJy8nOiBmcm9tID0gaSsxOyByZXR1cm4gU2xhc2hPcHQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBmcm9tID0gaTsgcmV0dXJuIFBvc2l0aW9uYWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTW9kZSBoYW5kbGVNYXliZVNob3J0T3B0KCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMgKSB7CisgICAgICAgICAgICBzd2l0Y2goIGMgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6IGZyb20gPSBpKzE7IHJldHVybiBMb25nT3B0OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZyb20gPSBpOyByZXR1cm4gU2hvcnRPcHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNb2RlIGhhbmRsZU9wdCggc3RkOjpzaXplX3QgaSwgY2hhciBjLCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIGlmKCBzdGQ6OnN0cmluZyggIjo9XDAiLCAzICkuZmluZCggYyApID09IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9kZTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgb3B0TmFtZSA9IGFyZy5zdWJzdHIoIGZyb20sIGktZnJvbSApOworICAgICAgICAgICAgaWYoIG1vZGUgPT0gU2hvcnRPcHQgKQorICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaiA9IDA7IGogPCBvcHROYW1lLnNpemUoKTsgKytqICkKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayggVG9rZW4oIFRva2VuOjpTaG9ydE9wdCwgb3B0TmFtZS5zdWJzdHIoIGosIDEgKSApICk7CisgICAgICAgICAgICBlbHNlIGlmKCBtb2RlID09IFNsYXNoT3B0ICYmIG9wdE5hbWUuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soIFRva2VuKCBUb2tlbjo6U2hvcnRPcHQsIG9wdE5hbWUgKSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soIFRva2VuKCBUb2tlbjo6TG9uZ09wdCwgb3B0TmFtZSApICk7CisgICAgICAgICAgICByZXR1cm4gTm9uZTsKKyAgICAgICAgfQorICAgICAgICBNb2RlIGhhbmRsZVBvc2l0aW9uYWwoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYywgc3RkOjpzdHJpbmcgY29uc3QmIGFyZywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBpZiggaW5RdW90ZXMgfHwgc3RkOjpzdHJpbmcoICJcMCIsIDEgKS5maW5kKCBjICkgPT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIHJldHVybiBtb2RlOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkYXRhID0gYXJnLnN1YnN0ciggZnJvbSwgaS1mcm9tICk7CisgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKCBUb2tlbiggVG9rZW46OlBvc2l0aW9uYWwsIGRhdGEgKSApOworICAgICAgICAgICAgcmV0dXJuIE5vbmU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICBzdHJ1Y3QgQ29tbW9uQXJnUHJvcGVydGllcyB7CisgICAgICAgIENvbW1vbkFyZ1Byb3BlcnRpZXMoKSB7fQorICAgICAgICBDb21tb25BcmdQcm9wZXJ0aWVzKCBEZXRhaWw6OkJvdW5kQXJnRnVuY3Rpb248Q29uZmlnVD4gY29uc3QmIF9ib3VuZEZpZWxkICkgOiBib3VuZEZpZWxkKCBfYm91bmRGaWVsZCApIHt9CisKKyAgICAgICAgRGV0YWlsOjpCb3VuZEFyZ0Z1bmN0aW9uPENvbmZpZ1Q+IGJvdW5kRmllbGQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBzdGQ6OnN0cmluZyBkZXRhaWw7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBsYWNlaG9sZGVyOyAvLyBPbmx5IHZhbHVlIGlmIGJvdW5kRmllbGQgdGFrZXMgYW4gYXJnCisKKyAgICAgICAgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAhcGxhY2Vob2xkZXIuZW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHZhbGlkYXRlKCkgY29uc3QgeworICAgICAgICAgICAgaWYoICFib3VuZEZpZWxkLmlzU2V0KCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJvcHRpb24gbm90IGJvdW5kIiApOworICAgICAgICB9CisgICAgfTsKKyAgICBzdHJ1Y3QgT3B0aW9uQXJnUHJvcGVydGllcyB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzaG9ydE5hbWVzOworICAgICAgICBzdGQ6OnN0cmluZyBsb25nTmFtZTsKKworICAgICAgICBib29sIGhhc1Nob3J0TmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIHNob3J0TmFtZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmZpbmQoIHNob3J0TmFtZXMuYmVnaW4oKSwgc2hvcnROYW1lcy5lbmQoKSwgc2hvcnROYW1lICkgIT0gc2hvcnROYW1lcy5lbmQoKTsKKyAgICAgICAgfQorICAgICAgICBib29sIGhhc0xvbmdOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgX2xvbmdOYW1lICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIF9sb25nTmFtZSA9PSBsb25nTmFtZTsKKyAgICAgICAgfQorICAgIH07CisgICAgc3RydWN0IFBvc2l0aW9uYWxBcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgUG9zaXRpb25hbEFyZ1Byb3BlcnRpZXMoKSA6IHBvc2l0aW9uKCAtMSApIHt9CisgICAgICAgIGludCBwb3NpdGlvbjsgLy8gLTEgbWVhbnMgbm9uLXBvc2l0aW9uYWwgKGZsb2F0aW5nKQorCisgICAgICAgIGJvb2wgaXNGaXhlZFBvc2l0aW9uYWwoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gcG9zaXRpb24gIT0gLTE7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICBjbGFzcyBDb21tYW5kTGluZSB7CisKKyAgICAgICAgc3RydWN0IEFyZyA6IENvbW1vbkFyZ1Byb3BlcnRpZXM8Q29uZmlnVD4sIE9wdGlvbkFyZ1Byb3BlcnRpZXMsIFBvc2l0aW9uYWxBcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgICAgIEFyZygpIHt9CisgICAgICAgICAgICBBcmcoIERldGFpbDo6Qm91bmRBcmdGdW5jdGlvbjxDb25maWdUPiBjb25zdCYgX2JvdW5kRmllbGQgKSA6IENvbW1vbkFyZ1Byb3BlcnRpZXM8Q29uZmlnVD4oIF9ib3VuZEZpZWxkICkge30KKworICAgICAgICAgICAgdXNpbmcgQ29tbW9uQXJnUHJvcGVydGllczxDb25maWdUPjo6cGxhY2Vob2xkZXI7IC8vICFUQkQKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGJnTmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIWxvbmdOYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIi0tIiArIGxvbmdOYW1lOworICAgICAgICAgICAgICAgIGlmKCAhc2hvcnROYW1lcy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICItIiArIHNob3J0TmFtZXNbMF07CisgICAgICAgICAgICAgICAgcmV0dXJuICJwb3NpdGlvbmFsIGFyZ3MiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29tbWFuZHMoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc2hvcnROYW1lcy5iZWdpbigpLCBpdEVuZCA9IHNob3J0TmFtZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBmaXJzdCApCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIiwgIjsKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICItIiA8PCAqaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCAhbG9uZ05hbWUuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFmaXJzdCApCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIiwgIjsKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICItLSIgPDwgbG9uZ05hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCAhcGxhY2Vob2xkZXIuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiIDwiIDw8IHBsYWNlaG9sZGVyIDw8ICI+IjsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHR5cGVkZWYgQ0xBUkFfQVVUT19QVFIoIEFyZyApIEFyZ0F1dG9QdHI7CisKKyAgICAgICAgZnJpZW5kIHZvaWQgYWRkT3B0TmFtZSggQXJnJiBhcmcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcHROYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG9wdE5hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYoIERldGFpbDo6c3RhcnRzV2l0aCggb3B0TmFtZSwgIi0tIiApICkgeworICAgICAgICAgICAgICAgIGlmKCAhYXJnLmxvbmdOYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiT25seSBvbmUgbG9uZyBvcHQgbWF5IGJlIHNwZWNpZmllZC4gJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYXJnLmxvbmdOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICInIGFscmVhZHkgc3BlY2lmaWVkLCBub3cgYXR0ZW1wdGluZyB0byBhZGQgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgb3B0TmFtZSArICInIiApOworICAgICAgICAgICAgICAgIGFyZy5sb25nTmFtZSA9IG9wdE5hbWUuc3Vic3RyKCAyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBEZXRhaWw6OnN0YXJ0c1dpdGgoIG9wdE5hbWUsICItIiApICkKKyAgICAgICAgICAgICAgICBhcmcuc2hvcnROYW1lcy5wdXNoX2JhY2soIG9wdE5hbWUuc3Vic3RyKCAxICkgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAib3B0aW9uIG11c3QgYmVnaW4gd2l0aCAtIG9yIC0tLiBPcHRpb24gd2FzOiAnIiArIG9wdE5hbWUgKyAiJyIgKTsKKyAgICAgICAgfQorICAgICAgICBmcmllbmQgdm9pZCBzZXRQb3NpdGlvbmFsQXJnKCBBcmcmIGFyZywgaW50IHBvc2l0aW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgYXJnLnBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBBcmdCdWlsZGVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXJnQnVpbGRlciggQXJnKiBhcmcgKSA6IG1fYXJnKCBhcmcgKSB7fQorCisgICAgICAgICAgICAvLyBCaW5kIGEgbm9uLWJvb2xlYW4gZGF0YSBtZW1iZXIgKHJlcXVpcmVzIHBsYWNlaG9sZGVyIHN0cmluZykKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgICAgICB2b2lkIGJpbmQoIE0gQzo6KiBmaWVsZCwgc3RkOjpzdHJpbmcgY29uc3QmIHBsYWNlaG9sZGVyICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmREYXRhTWVtYmVyPEMsTT4oIGZpZWxkICk7CisgICAgICAgICAgICAgICAgbV9hcmctPnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBCaW5kIGEgYm9vbGVhbiBkYXRhIG1lbWJlciAobm8gcGxhY2Vob2xkZXIgcmVxdWlyZWQpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICAgICAgdm9pZCBiaW5kKCBib29sIEM6OiogZmllbGQgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZERhdGFNZW1iZXI8Qyxib29sPiggZmllbGQgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIG1ldGhvZCB0YWtpbmcgYSBzaW5nbGUsIG5vbi1ib29sZWFuIGFyZ3VtZW50IChyZXF1aXJlcyBhIHBsYWNlaG9sZGVyIHN0cmluZykKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKEM6OiogdW5hcnlNZXRob2QpKCBNICksIHN0ZDo6c3RyaW5nIGNvbnN0JiBwbGFjZWhvbGRlciApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlNZXRob2Q8QyxNPiggdW5hcnlNZXRob2QgKTsKKyAgICAgICAgICAgICAgICBtX2FyZy0+cGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIG1ldGhvZCB0YWtpbmcgYSBzaW5nbGUsIGJvb2xlYW4gYXJndW1lbnQgKG5vIHBsYWNlaG9sZGVyIHN0cmluZyByZXF1aXJlZCkKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKEM6OiogdW5hcnlNZXRob2QpKCBib29sICkgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZFVuYXJ5TWV0aG9kPEMsYm9vbD4oIHVuYXJ5TWV0aG9kICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgKHdpbGwgYmUgY2FsbGVkIGlmIG9wdCBpcyBwcmVzZW50KQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoQzo6KiBudWxsYXJ5TWV0aG9kKSgpICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmROdWxsYXJ5TWV0aG9kPEM+KCBudWxsYXJ5TWV0aG9kICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBmcmVlIGZ1bmN0aW9uIHRha2luZyBhIHNpbmdsZSBhcmd1bWVudCAtIHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBvbiAobm8gcGxhY2Vob2xkZXIgc3RyaW5nIHJlcXVpcmVkKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoKiB1bmFyeUZ1bmN0aW9uKSggQyYgKSApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlGdW5jdGlvbjxDPiggdW5hcnlGdW5jdGlvbiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgZnJlZSBmdW5jdGlvbiB0YWtpbmcgYSBzaW5nbGUgYXJndW1lbnQgLSB0aGUgb2JqZWN0IHRvIG9wZXJhdGUgb24gKHJlcXVpcmVzIGEgcGxhY2Vob2xkZXIgc3RyaW5nKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgVD4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoKiBiaW5hcnlGdW5jdGlvbikoIEMmLCBUICksIHN0ZDo6c3RyaW5nIGNvbnN0JiBwbGFjZWhvbGRlciApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kQmluYXJ5RnVuY3Rpb248QywgVD4oIGJpbmFyeUZ1bmN0aW9uICk7CisgICAgICAgICAgICAgICAgbV9hcmctPnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFyZ0J1aWxkZXImIGRlc2NyaWJlKCBzdGQ6OnN0cmluZyBjb25zdCYgZGVzY3JpcHRpb24gKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXJnQnVpbGRlciYgZGV0YWlsKCBzdGQ6OnN0cmluZyBjb25zdCYgZGV0YWlsICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5kZXRhaWwgPSBkZXRhaWw7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIEFyZyogbV9hcmc7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgT3B0QnVpbGRlciA6IHB1YmxpYyBBcmdCdWlsZGVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgT3B0QnVpbGRlciggQXJnKiBhcmcgKSA6IEFyZ0J1aWxkZXIoIGFyZyApIHt9CisgICAgICAgICAgICBPcHRCdWlsZGVyKCBPcHRCdWlsZGVyJiBvdGhlciApIDogQXJnQnVpbGRlciggb3RoZXIgKSB7fQorCisgICAgICAgICAgICBPcHRCdWlsZGVyJiBvcGVyYXRvcltdKCBzdGQ6OnN0cmluZyBjb25zdCYgb3B0TmFtZSApIHsKKyAgICAgICAgICAgICAgICBhZGRPcHROYW1lKCAqQXJnQnVpbGRlcjo6bV9hcmcsIG9wdE5hbWUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgQ29tbWFuZExpbmUoKQorICAgICAgICA6ICAgbV9ib3VuZFByb2Nlc3NOYW1lKCBuZXcgRGV0YWlsOjpOdWxsQmluZGVyPENvbmZpZ1Q+KCkgKSwKKyAgICAgICAgICAgIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uKCAwICksCisgICAgICAgICAgICBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMoIGZhbHNlICkKKyAgICAgICAge30KKyAgICAgICAgQ29tbWFuZExpbmUoIENvbW1hbmRMaW5lIGNvbnN0JiBvdGhlciApCisgICAgICAgIDogICBtX2JvdW5kUHJvY2Vzc05hbWUoIG90aGVyLm1fYm91bmRQcm9jZXNzTmFtZSApLAorICAgICAgICAgICAgbV9vcHRpb25zICggb3RoZXIubV9vcHRpb25zICksCisgICAgICAgICAgICBtX3Bvc2l0aW9uYWxBcmdzKCBvdGhlci5tX3Bvc2l0aW9uYWxBcmdzICksCisgICAgICAgICAgICBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiggb3RoZXIubV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gKSwKKyAgICAgICAgICAgIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2Vucyggb3RoZXIubV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG90aGVyLm1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgIG1fZmxvYXRpbmdBcmcucmVzZXQoIG5ldyBBcmcoICpvdGhlci5tX2Zsb2F0aW5nQXJnICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbW1hbmRMaW5lJiBzZXRUaHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zKCBib29sIHNob3VsZFRocm93ID0gdHJ1ZSApIHsKKyAgICAgICAgICAgIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyA9IHNob3VsZFRocm93OworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgT3B0QnVpbGRlciBvcGVyYXRvcltdKCBzdGQ6OnN0cmluZyBjb25zdCYgb3B0TmFtZSApIHsKKyAgICAgICAgICAgIG1fb3B0aW9ucy5wdXNoX2JhY2soIEFyZygpICk7CisgICAgICAgICAgICBhZGRPcHROYW1lKCBtX29wdGlvbnMuYmFjaygpLCBvcHROYW1lICk7CisgICAgICAgICAgICBPcHRCdWlsZGVyIGJ1aWxkZXIoICZtX29wdGlvbnMuYmFjaygpICk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEFyZ0J1aWxkZXIgb3BlcmF0b3JbXSggaW50IHBvc2l0aW9uICkgeworICAgICAgICAgICAgbV9wb3NpdGlvbmFsQXJncy5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCBwb3NpdGlvbiwgQXJnKCkgKSApOworICAgICAgICAgICAgaWYoIHBvc2l0aW9uID4gbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gKQorICAgICAgICAgICAgICAgIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgICAgICBzZXRQb3NpdGlvbmFsQXJnKCBtX3Bvc2l0aW9uYWxBcmdzW3Bvc2l0aW9uXSwgcG9zaXRpb24gKTsKKyAgICAgICAgICAgIEFyZ0J1aWxkZXIgYnVpbGRlciggJm1fcG9zaXRpb25hbEFyZ3NbcG9zaXRpb25dICk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEludm9rZSB0aGlzIHdpdGggdGhlIF8gaW5zdGFuY2UKKyAgICAgICAgQXJnQnVpbGRlciBvcGVyYXRvcltdKCBVbnBvc2l0aW9uYWxUYWcgKSB7CisgICAgICAgICAgICBpZiggbV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIk9ubHkgb25lIHVucG9zaXRpb25hbCBhcmd1bWVudCBjYW4gYmUgYWRkZWQiICk7CisgICAgICAgICAgICBtX2Zsb2F0aW5nQXJnLnJlc2V0KCBuZXcgQXJnKCkgKTsKKyAgICAgICAgICAgIEFyZ0J1aWxkZXIgYnVpbGRlciggbV9mbG9hdGluZ0FyZy5nZXQoKSApOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICB2b2lkIGJpbmRQcm9jZXNzTmFtZSggTSBDOjoqIGZpZWxkICkgeworICAgICAgICAgICAgbV9ib3VuZFByb2Nlc3NOYW1lID0gbmV3IERldGFpbDo6Qm91bmREYXRhTWVtYmVyPEMsTT4oIGZpZWxkICk7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgdm9pZCBiaW5kUHJvY2Vzc05hbWUoIHZvaWQgKEM6OipfdW5hcnlNZXRob2QpKCBNICkgKSB7CisgICAgICAgICAgICBtX2JvdW5kUHJvY2Vzc05hbWUgPSBuZXcgRGV0YWlsOjpCb3VuZFVuYXJ5TWV0aG9kPEMsTT4oIF91bmFyeU1ldGhvZCApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBvcHRVc2FnZSggc3RkOjpvc3RyZWFtJiBvcywgc3RkOjpzaXplX3QgaW5kZW50ID0gMCwgc3RkOjpzaXplX3Qgd2lkdGggPSBEZXRhaWw6OmNvbnNvbGVXaWR0aCApIGNvbnN0IHsKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEFyZz46OmNvbnN0X2l0ZXJhdG9yIGl0QmVnaW4gPSBtX29wdGlvbnMuYmVnaW4oKSwgaXRFbmQgPSBtX29wdGlvbnMuZW5kKCksIGl0OworICAgICAgICAgICAgc3RkOjpzaXplX3QgbWF4V2lkdGggPSAwOworICAgICAgICAgICAgZm9yKCBpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IChzdGQ6Om1heCkoIG1heFdpZHRoLCBpdC0+Y29tbWFuZHMoKS5zaXplKCkgKTsKKworICAgICAgICAgICAgZm9yKCBpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgIERldGFpbDo6VGV4dCB1c2FnZSggaXQtPmNvbW1hbmRzKCksIERldGFpbDo6VGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2lkdGgoIG1heFdpZHRoK2luZGVudCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRlbnQoIGluZGVudCApICk7CisgICAgICAgICAgICAgICAgRGV0YWlsOjpUZXh0IGRlc2MoIGl0LT5kZXNjcmlwdGlvbiwgRGV0YWlsOjpUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaWR0aCggd2lkdGggLSBtYXhXaWR0aCAtIDMgKSApOworCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IChzdGQ6Om1heCkoIHVzYWdlLnNpemUoKSwgZGVzYy5zaXplKCkgKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB1c2FnZUNvbCA9IGkgPCB1c2FnZS5zaXplKCkgPyB1c2FnZVtpXSA6ICIiOworICAgICAgICAgICAgICAgICAgICBvcyA8PCB1c2FnZUNvbDsKKworICAgICAgICAgICAgICAgICAgICBpZiggaSA8IGRlc2Muc2l6ZSgpICYmICFkZXNjW2ldLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgb3MgIDw8IHN0ZDo6c3RyaW5nKCBpbmRlbnQgKyAyICsgbWF4V2lkdGggLSB1c2FnZUNvbC5zaXplKCksICcgJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZGVzY1tpXTsKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIlxuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgb3B0VXNhZ2UoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3B0VXNhZ2UoIG9zcyApOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYXJnU3lub3BzaXMoIHN0ZDo6b3N0cmVhbSYgb3MgKSBjb25zdCB7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMTsgaSA8PSBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbjsgKytpICkgeworICAgICAgICAgICAgICAgIGlmKCBpID4gMSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICIgIjsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQsIEFyZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9wb3NpdGlvbmFsQXJncy5maW5kKCBpICk7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IG1fcG9zaXRpb25hbEFyZ3MuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICBvcyA8PCAiPCIgPDwgaXQtPnNlY29uZC5wbGFjZWhvbGRlciA8PCAiPiI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiggbV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICI8IiA8PCBtX2Zsb2F0aW5nQXJnLT5wbGFjZWhvbGRlciA8PCAiPiI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAibm9uIGNvbnNlY3V0aXZlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHdpdGggbm8gZmxvYXRpbmcgYXJncyIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vICFUQkQgTm8gaW5kaWNhdGlvbiBvZiBtYW5kYXRvcnkgYXJncworICAgICAgICAgICAgaWYoIG1fZmxvYXRpbmdBcmcuZ2V0KCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uID4gMSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICIgIjsKKyAgICAgICAgICAgICAgICBvcyA8PCAiWzwiIDw8IG1fZmxvYXRpbmdBcmctPnBsYWNlaG9sZGVyIDw8ICI+IC4uLl0iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGFyZ1N5bm9wc2lzKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIGFyZ1N5bm9wc2lzKCBvc3MgKTsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHVzYWdlKCBzdGQ6Om9zdHJlYW0mIG9zLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJvY05hbWUgKSBjb25zdCB7CisgICAgICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICAgICAgb3MgPDwgInVzYWdlOlxuICAiIDw8IHByb2NOYW1lIDw8ICIgIjsKKyAgICAgICAgICAgIGFyZ1N5bm9wc2lzKCBvcyApOworICAgICAgICAgICAgaWYoICFtX29wdGlvbnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBvcyA8PCAiIFtvcHRpb25zXVxuXG53aGVyZSBvcHRpb25zIGFyZTogXG4iOworICAgICAgICAgICAgICAgIG9wdFVzYWdlKCBvcywgMiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3MgPDwgIlxuIjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyB1c2FnZSggc3RkOjpzdHJpbmcgY29uc3QmIHByb2NOYW1lICkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIHVzYWdlKCBvc3MsIHByb2NOYW1lICk7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgQ29uZmlnVCBwYXJzZSggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBhcmdzICkgY29uc3QgeworICAgICAgICAgICAgQ29uZmlnVCBjb25maWc7CisgICAgICAgICAgICBwYXJzZUludG8oIGFyZ3MsIGNvbmZpZyApOworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBhcnNlSW50byggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBhcmdzLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcm9jZXNzTmFtZSA9IGFyZ3MuZW1wdHkoKSA/IHN0ZDo6c3RyaW5nKCkgOiBhcmdzWzBdOworICAgICAgICAgICAgc3RkOjpzaXplX3QgbGFzdFNsYXNoID0gcHJvY2Vzc05hbWUuZmluZF9sYXN0X29mKCAiL1xcIiApOworICAgICAgICAgICAgaWYoIGxhc3RTbGFzaCAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcHJvY2Vzc05hbWUgPSBwcm9jZXNzTmFtZS5zdWJzdHIoIGxhc3RTbGFzaCsxICk7CisgICAgICAgICAgICBtX2JvdW5kUHJvY2Vzc05hbWUuc2V0KCBjb25maWcsIHByb2Nlc3NOYW1lICk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB0b2tlbnM7CisgICAgICAgICAgICBQYXJzZXIgcGFyc2VyOworICAgICAgICAgICAgcGFyc2VyLnBhcnNlSW50b1Rva2VucyggYXJncywgdG9rZW5zICk7CisgICAgICAgICAgICByZXR1cm4gcG9wdWxhdGUoIHRva2VucywgY29uZmlnICk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwb3B1bGF0ZSggc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gY29uc3QmIHRva2VucywgQ29uZmlnVCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VucyA9IHBvcHVsYXRlT3B0aW9ucyggdG9rZW5zLCBjb25maWcgKTsKKyAgICAgICAgICAgIHVudXNlZFRva2VucyA9IHBvcHVsYXRlRml4ZWRBcmdzKCB1bnVzZWRUb2tlbnMsIGNvbmZpZyApOworICAgICAgICAgICAgdW51c2VkVG9rZW5zID0gcG9wdWxhdGVGbG9hdGluZ0FyZ3MoIHVudXNlZFRva2VucywgY29uZmlnICk7CisgICAgICAgICAgICByZXR1cm4gdW51c2VkVG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcG9wdWxhdGVPcHRpb25zKCBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBjb25zdCYgdG9rZW5zLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB1bnVzZWRUb2tlbnM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXJyb3JzOworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHRva2Vucy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICBQYXJzZXI6OlRva2VuIGNvbnN0JiB0b2tlbiA9IHRva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxBcmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fb3B0aW9ucy5iZWdpbigpLCBpdEVuZCA9IG1fb3B0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgQXJnIGNvbnN0JiBhcmcgPSAqaXQ7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6U2hvcnRPcHQgJiYgYXJnLmhhc1Nob3J0TmFtZSggdG9rZW4uZGF0YSApICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6TG9uZ09wdCAmJiBhcmcuaGFzTG9uZ05hbWUoIHRva2VuLmRhdGEgKSApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhcmcudGFrZXNBcmcoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGkgPT0gdG9rZW5zLnNpemUoKS0xIHx8IHRva2Vuc1tpKzFdLnR5cGUgIT0gUGFyc2VyOjpUb2tlbjo6UG9zaXRpb25hbCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaF9iYWNrKCAiRXhwZWN0ZWQgYXJndW1lbnQgdG8gb3B0aW9uOiAiICsgdG9rZW4uZGF0YSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcuYm91bmRGaWVsZC5zZXQoIGNvbmZpZywgdG9rZW5zWysraV0uZGF0YSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLmJvdW5kRmllbGQuc2V0KCBjb25maWcsICJ0cnVlIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2hfYmFjayggc3RkOjpzdHJpbmcoIGV4LndoYXQoKSApICsgIlxuLSB3aGlsZSBwYXJzaW5nOiAoIiArIGFyZy5jb21tYW5kcygpICsgIikiICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGl0ID09IGl0RW5kICkgeworICAgICAgICAgICAgICAgICAgICBpZiggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpQb3NpdGlvbmFsIHx8ICFtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMgKQorICAgICAgICAgICAgICAgICAgICAgICAgdW51c2VkVG9rZW5zLnB1c2hfYmFjayggdG9rZW4gKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZXJyb3JzLmVtcHR5KCkgJiYgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoX2JhY2soICJ1bnJlY29nbmlzZWQgb3B0aW9uOiAiICsgdG9rZW4uZGF0YSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhZXJyb3JzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBlcnJvcnMuYmVnaW4oKSwgaXRFbmQgPSBlcnJvcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpdCAhPSBlcnJvcnMuYmVnaW4oKSApCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIlxuIjsKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICppdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCBvc3Muc3RyKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcG9wdWxhdGVGaXhlZEFyZ3MoIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IGNvbnN0JiB0b2tlbnMsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VuczsKKyAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IDE7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdG9rZW5zLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgIFBhcnNlcjo6VG9rZW4gY29uc3QmIHRva2VuID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGludCwgQXJnPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Bvc2l0aW9uYWxBcmdzLmZpbmQoIHBvc2l0aW9uICk7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IG1fcG9zaXRpb25hbEFyZ3MuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmJvdW5kRmllbGQuc2V0KCBjb25maWcsIHRva2VuLmRhdGEgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVudXNlZFRva2Vucy5wdXNoX2JhY2soIHRva2VuICk7CisgICAgICAgICAgICAgICAgaWYoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6UG9zaXRpb25hbCApCisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdW51c2VkVG9rZW5zOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBvcHVsYXRlRmxvYXRpbmdBcmdzKCBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBjb25zdCYgdG9rZW5zLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggIW1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB1bnVzZWRUb2tlbnM7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdG9rZW5zLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgIFBhcnNlcjo6VG9rZW4gY29uc3QmIHRva2VuID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIGlmKCB0b2tlbi50eXBlID09IFBhcnNlcjo6VG9rZW46OlBvc2l0aW9uYWwgKQorICAgICAgICAgICAgICAgICAgICBtX2Zsb2F0aW5nQXJnLT5ib3VuZEZpZWxkLnNldCggY29uZmlnLCB0b2tlbi5kYXRhICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB1bnVzZWRUb2tlbnMucHVzaF9iYWNrKCB0b2tlbiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVudXNlZFRva2VuczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdmFsaWRhdGUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBpZiggbV9vcHRpb25zLmVtcHR5KCkgJiYgbV9wb3NpdGlvbmFsQXJncy5lbXB0eSgpICYmICFtX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiTm8gb3B0aW9ucyBvciBhcmd1bWVudHMgc3BlY2lmaWVkIiApOworCisgICAgICAgICAgICBmb3IoIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEFyZz46OmNvbnN0X2l0ZXJhdG9yICBpdCA9IG1fb3B0aW9ucy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBtX29wdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICBpdC0+dmFsaWRhdGUoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgRGV0YWlsOjpCb3VuZEFyZ0Z1bmN0aW9uPENvbmZpZ1Q+IG1fYm91bmRQcm9jZXNzTmFtZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXJnPiBtX29wdGlvbnM7CisgICAgICAgIHN0ZDo6bWFwPGludCwgQXJnPiBtX3Bvc2l0aW9uYWxBcmdzOworICAgICAgICBBcmdBdXRvUHRyIG1fZmxvYXRpbmdBcmc7CisgICAgICAgIGludCBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbjsKKyAgICAgICAgYm9vbCBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENsYXJhCisKK1NUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UKKyN1bmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKyN1bmRlZiBTVElUQ0hfQ0xBUkFfQ0xPU0VfTkFNRVNQQUNFCisKKyNlbmRpZiAvLyBUV09CTFVFQ1VCRVNfQ0xBUkFfSF9JTkNMVURFRAorI3VuZGVmIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorCisvLyBSZXN0b3JlIENsYXJhJ3MgdmFsdWUgZm9yIGNvbnNvbGUgd2lkdGgsIGlmIHByZXNlbnQKKyNpZmRlZiBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZGVmaW5lIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyN1bmRlZiBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZW5kaWYKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8Y3RpbWU+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBpbmxpbmUgdm9pZCBhYm9ydEFmdGVyRmlyc3QoIENvbmZpZ0RhdGEmIGNvbmZpZyApIHsgY29uZmlnLmFib3J0QWZ0ZXIgPSAxOyB9CisgICAgaW5saW5lIHZvaWQgYWJvcnRBZnRlclgoIENvbmZpZ0RhdGEmIGNvbmZpZywgaW50IHggKSB7CisgICAgICAgIGlmKCB4IDwgMSApCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJWYWx1ZSBhZnRlciAteCBvciAtLWFib3J0QWZ0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIgKTsKKyAgICAgICAgY29uZmlnLmFib3J0QWZ0ZXIgPSB4OworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhZGRUZXN0T3JUYWdzKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfdGVzdFNwZWMgKSB7IGNvbmZpZy50ZXN0c09yVGFncy5wdXNoX2JhY2soIF90ZXN0U3BlYyApOyB9CisgICAgaW5saW5lIHZvaWQgYWRkU2VjdGlvblRvUnVuKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWN0aW9uTmFtZSApIHsgY29uZmlnLnNlY3Rpb25zVG9SdW4ucHVzaF9iYWNrKCBzZWN0aW9uTmFtZSApOyB9CisgICAgaW5saW5lIHZvaWQgYWRkUmVwb3J0ZXJOYW1lKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfcmVwb3J0ZXJOYW1lICkgeyBjb25maWcucmVwb3J0ZXJOYW1lcy5wdXNoX2JhY2soIF9yZXBvcnRlck5hbWUgKTsgfQorCisgICAgaW5saW5lIHZvaWQgYWRkV2FybmluZyggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgX3dhcm5pbmcgKSB7CisgICAgICAgIGlmKCBfd2FybmluZyA9PSAiTm9Bc3NlcnRpb25zIiApCisgICAgICAgICAgICBjb25maWcud2FybmluZ3MgPSBzdGF0aWNfY2FzdDxXYXJuQWJvdXQ6OldoYXQ+KCBjb25maWcud2FybmluZ3MgfCBXYXJuQWJvdXQ6Ok5vQXNzZXJ0aW9ucyApOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJVbnJlY29nbmlzZWQgd2FybmluZzogJyIgKyBfd2FybmluZyArICdcJycgKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgc2V0T3JkZXIoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIG9yZGVyICkgeworICAgICAgICBpZiggc3RhcnRzV2l0aCggImRlY2xhcmVkIiwgb3JkZXIgKSApCisgICAgICAgICAgICBjb25maWcucnVuT3JkZXIgPSBSdW5UZXN0czo6SW5EZWNsYXJhdGlvbk9yZGVyOworICAgICAgICBlbHNlIGlmKCBzdGFydHNXaXRoKCAibGV4aWNhbCIsIG9yZGVyICkgKQorICAgICAgICAgICAgY29uZmlnLnJ1bk9yZGVyID0gUnVuVGVzdHM6OkluTGV4aWNvZ3JhcGhpY2FsT3JkZXI7CisgICAgICAgIGVsc2UgaWYoIHN0YXJ0c1dpdGgoICJyYW5kb20iLCBvcmRlciApICkKKyAgICAgICAgICAgIGNvbmZpZy5ydW5PcmRlciA9IFJ1blRlc3RzOjpJblJhbmRvbU9yZGVyOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJVbnJlY29nbmlzZWQgb3JkZXJpbmc6ICciICsgb3JkZXIgKyAnXCcnICk7CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldFJuZ1NlZWQoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHNlZWQgKSB7CisgICAgICAgIGlmKCBzZWVkID09ICJ0aW1lIiApIHsKKyAgICAgICAgICAgIGNvbmZpZy5ybmdTZWVkID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Piggc3RkOjp0aW1lKDApICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8IHNlZWQ7CisgICAgICAgICAgICBzcyA+PiBjb25maWcucm5nU2VlZDsKKyAgICAgICAgICAgIGlmKCBzcy5mYWlsKCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIkFyZ3VtZW50IHRvIC0tcm5nLXNlZWQgc2hvdWxkIGJlIHRoZSB3b3JkICd0aW1lJyBvciBhIG51bWJlciIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRWZXJib3NpdHkoIENvbmZpZ0RhdGEmIGNvbmZpZywgaW50IGxldmVsICkgeworICAgICAgICAvLyAhVEJEOiBhY2NlcHQgc3RyaW5ncz8KKyAgICAgICAgY29uZmlnLnZlcmJvc2l0eSA9IHN0YXRpY19jYXN0PFZlcmJvc2l0eTo6TGV2ZWw+KCBsZXZlbCApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRTaG93RHVyYXRpb25zKCBDb25maWdEYXRhJiBjb25maWcsIGJvb2wgX3Nob3dEdXJhdGlvbnMgKSB7CisgICAgICAgIGNvbmZpZy5zaG93RHVyYXRpb25zID0gX3Nob3dEdXJhdGlvbnMKKyAgICAgICAgICAgID8gU2hvd0R1cmF0aW9uczo6QWx3YXlzCisgICAgICAgICAgICA6IFNob3dEdXJhdGlvbnM6Ok5ldmVyOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRVc2VDb2xvdXIoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICkgeworICAgICAgICBzdGQ6OnN0cmluZyBtb2RlID0gdG9Mb3dlciggdmFsdWUgKTsKKworICAgICAgICBpZiggbW9kZSA9PSAieWVzIiApCisgICAgICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpZZXM7CisgICAgICAgIGVsc2UgaWYoIG1vZGUgPT0gIm5vIiApCisgICAgICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpObzsKKyAgICAgICAgZWxzZSBpZiggbW9kZSA9PSAiYXV0byIgKQorICAgICAgICAgICAgY29uZmlnLnVzZUNvbG91ciA9IFVzZUNvbG91cjo6QXV0bzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiY29sb3VyIG1vZGUgbXVzdCBiZSBvbmUgb2Y6IGF1dG8sIHllcyBvciBubyIgKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgZm9yY2VDb2xvdXIoIENvbmZpZ0RhdGEmIGNvbmZpZyApIHsKKyAgICAgICAgY29uZmlnLnVzZUNvbG91ciA9IFVzZUNvbG91cjo6WWVzOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBsb2FkVGVzdE5hbWVzRnJvbUZpbGUoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIF9maWxlbmFtZSApIHsKKyAgICAgICAgc3RkOjppZnN0cmVhbSBmKCBfZmlsZW5hbWUuY19zdHIoKSApOworICAgICAgICBpZiggIWYuaXNfb3BlbigpICkKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCAiVW5hYmxlIHRvIGxvYWQgaW5wdXQgZmlsZTogIiArIF9maWxlbmFtZSApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGxpbmU7CisgICAgICAgIHdoaWxlKCBzdGQ6OmdldGxpbmUoIGYsIGxpbmUgKSApIHsKKyAgICAgICAgICAgIGxpbmUgPSB0cmltKGxpbmUpOworICAgICAgICAgICAgaWYoICFsaW5lLmVtcHR5KCkgJiYgIXN0YXJ0c1dpdGgoIGxpbmUsICcjJyApICkgeworICAgICAgICAgICAgICAgIGlmKCAhc3RhcnRzV2l0aCggbGluZSwgJyInICkgKQorICAgICAgICAgICAgICAgICAgICBsaW5lID0gJyInICsgbGluZSArICciJzsKKyAgICAgICAgICAgICAgICBhZGRUZXN0T3JUYWdzKCBjb25maWcsIGxpbmUgKyAnLCcgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBDbGFyYTo6Q29tbWFuZExpbmU8Q29uZmlnRGF0YT4gbWFrZUNvbW1hbmRMaW5lUGFyc2VyKCkgeworCisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBDbGFyYTsKKyAgICAgICAgQ29tbWFuZExpbmU8Q29uZmlnRGF0YT4gY2xpOworCisgICAgICAgIGNsaS5iaW5kUHJvY2Vzc05hbWUoICZDb25maWdEYXRhOjpwcm9jZXNzTmFtZSApOworCisgICAgICAgIGNsaVsiLT8iXVsiLWgiXVsiLS1oZWxwIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImRpc3BsYXkgdXNhZ2UgaW5mb3JtYXRpb24iICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvd0hlbHAgKTsKKworICAgICAgICBjbGlbIi1sIl1bIi0tbGlzdC10ZXN0cyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbC9tYXRjaGluZyB0ZXN0IGNhc2VzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Omxpc3RUZXN0cyApOworCisgICAgICAgIGNsaVsiLXQiXVsiLS1saXN0LXRhZ3MiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibGlzdCBhbGwvbWF0Y2hpbmcgdGFncyIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpsaXN0VGFncyApOworCisgICAgICAgIGNsaVsiLXMiXVsiLS1zdWNjZXNzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImluY2x1ZGUgc3VjY2Vzc2Z1bCB0ZXN0cyBpbiBvdXRwdXQiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvd1N1Y2Nlc3NmdWxUZXN0cyApOworCisgICAgICAgIGNsaVsiLWIiXVsiLS1icmVhayJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJicmVhayBpbnRvIGRlYnVnZ2VyIG9uIGZhaWx1cmUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvdWxkRGVidWdCcmVhayApOworCisgICAgICAgIGNsaVsiLWUiXVsiLS1ub3Rocm93Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNraXAgZXhjZXB0aW9uIHRlc3RzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Om5vVGhyb3cgKTsKKworICAgICAgICBjbGlbIi1pIl1bIi0taW52aXNpYmxlcyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzaG93IGludmlzaWJsZXMgKHRhYnMsIG5ld2xpbmVzKSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpzaG93SW52aXNpYmxlcyApOworCisgICAgICAgIGNsaVsiLW8iXVsiLS1vdXQiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAib3V0cHV0IGZpbGVuYW1lIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Om91dHB1dEZpbGVuYW1lLCAiZmlsZW5hbWUiICk7CisKKyAgICAgICAgY2xpWyItciJdWyItLXJlcG9ydGVyIl0KKy8vICAgICAgICAgICAgLnBsYWNlaG9sZGVyKCAibmFtZVs6ZmlsZW5hbWVdIiApCisgICAgICAgICAgICAuZGVzY3JpYmUoICJyZXBvcnRlciB0byB1c2UgKGRlZmF1bHRzIHRvIGNvbnNvbGUpIiApCisgICAgICAgICAgICAuYmluZCggJmFkZFJlcG9ydGVyTmFtZSwgIm5hbWUiICk7CisKKyAgICAgICAgY2xpWyItbiJdWyItLW5hbWUiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic3VpdGUgbmFtZSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpuYW1lLCAibmFtZSIgKTsKKworICAgICAgICBjbGlbIi1hIl1bIi0tYWJvcnQiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiYWJvcnQgYXQgZmlyc3QgZmFpbHVyZSIgKQorICAgICAgICAgICAgLmJpbmQoICZhYm9ydEFmdGVyRmlyc3QgKTsKKworICAgICAgICBjbGlbIi14Il1bIi0tYWJvcnR4Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImFib3J0IGFmdGVyIHggZmFpbHVyZXMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWJvcnRBZnRlclgsICJuby4gZmFpbHVyZXMiICk7CisKKyAgICAgICAgY2xpWyItdyJdWyItLXdhcm4iXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiZW5hYmxlIHdhcm5pbmdzIiApCisgICAgICAgICAgICAuYmluZCggJmFkZFdhcm5pbmcsICJ3YXJuaW5nIG5hbWUiICk7CisKKy8vIC0gbmVlZHMgdXBkYXRpbmcgaWYgcmVpbnN0YXRlZAorLy8gICAgICAgIGNsaS5pbnRvKCAmc2V0VmVyYm9zaXR5ICkKKy8vICAgICAgICAgICAgLmRlc2NyaWJlKCAibGV2ZWwgb2YgdmVyYm9zaXR5ICgwPW5vIG91dHB1dCkiICkKKy8vICAgICAgICAgICAgLnNob3J0T3B0KCAidiIpCisvLyAgICAgICAgICAgIC5sb25nT3B0KCAidmVyYm9zaXR5IiApCisvLyAgICAgICAgICAgIC5wbGFjZWhvbGRlciggImxldmVsIiApOworCisgICAgICAgIGNsaVtfXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAid2hpY2ggdGVzdCBvciB0ZXN0cyB0byB1c2UiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWRkVGVzdE9yVGFncywgInRlc3QgbmFtZSwgcGF0dGVybiBvciB0YWdzIiApOworCisgICAgICAgIGNsaVsiLWQiXVsiLS1kdXJhdGlvbnMiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2hvdyB0ZXN0IGR1cmF0aW9ucyIgKQorICAgICAgICAgICAgLmJpbmQoICZzZXRTaG93RHVyYXRpb25zLCAieWVzfG5vIiApOworCisgICAgICAgIGNsaVsiLWYiXVsiLS1pbnB1dC1maWxlIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxvYWQgdGVzdCBuYW1lcyB0byBydW4gZnJvbSBhIGZpbGUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmbG9hZFRlc3ROYW1lc0Zyb21GaWxlLCAiZmlsZW5hbWUiICk7CisKKyAgICAgICAgY2xpWyItIyJdWyItLWZpbGVuYW1lcy1hcy10YWdzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImFkZHMgYSB0YWcgZm9yIHRoZSBmaWxlbmFtZSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpmaWxlbmFtZXNBc1RhZ3MgKTsKKworICAgICAgICBjbGlbIi1jIl1bIi0tc2VjdGlvbiJdCisgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCAic3BlY2lmeSBzZWN0aW9uIHRvIHJ1biIgKQorICAgICAgICAgICAgICAgIC5iaW5kKCAmYWRkU2VjdGlvblRvUnVuLCAic2VjdGlvbiBuYW1lIiApOworCisgICAgICAgIC8vIExlc3MgY29tbW9uIGNvbW1hbmRzIHdoaWNoIGRvbid0IGhhdmUgYSBzaG9ydCBmb3JtCisgICAgICAgIGNsaVsiLS1saXN0LXRlc3QtbmFtZXMtb25seSJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbC9tYXRjaGluZyB0ZXN0IGNhc2VzIG5hbWVzIG9ubHkiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bGlzdFRlc3ROYW1lc09ubHkgKTsKKworICAgICAgICBjbGlbIi0tbGlzdC1yZXBvcnRlcnMiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibGlzdCBhbGwgcmVwb3J0ZXJzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Omxpc3RSZXBvcnRlcnMgKTsKKworICAgICAgICBjbGlbIi0tb3JkZXIiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAidGVzdCBjYXNlIG9yZGVyIChkZWZhdWx0cyB0byBkZWNsKSIgKQorICAgICAgICAgICAgLmJpbmQoICZzZXRPcmRlciwgImRlY2x8bGV4fHJhbmQiICk7CisKKyAgICAgICAgY2xpWyItLXJuZy1zZWVkIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNldCBhIHNwZWNpZmljIHNlZWQgZm9yIHJhbmRvbSBudW1iZXJzIiApCisgICAgICAgICAgICAuYmluZCggJnNldFJuZ1NlZWQsICIndGltZSd8bnVtYmVyIiApOworCisgICAgICAgIGNsaVsiLS1mb3JjZS1jb2xvdXIiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiZm9yY2UgY29sb3VyaXNlZCBvdXRwdXQgKGRlcHJlY2F0ZWQpIiApCisgICAgICAgICAgICAuYmluZCggJmZvcmNlQ29sb3VyICk7CisKKyAgICAgICAgY2xpWyItLXVzZS1jb2xvdXIiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2hvdWxkIG91dHB1dCBiZSBjb2xvdXJpc2VkIiApCisgICAgICAgICAgICAuYmluZCggJnNldFVzZUNvbG91ciwgInllc3xubyIgKTsKKworICAgICAgICByZXR1cm4gY2xpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9saXN0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTElTVF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RleHQuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVYVF9IX0lOQ0xVREVECisKKyNkZWZpbmUgVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgKKworI2RlZmluZSBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRSBDYXRjaAorLy8gI2luY2x1ZGVkIGZyb206IC4uL2V4dGVybmFsL3RiY190ZXh0X2Zvcm1hdC5oCisvLyBPbmx5IHVzZSBoZWFkZXIgZ3VhcmQgaWYgd2UgYXJlIG5vdCB1c2luZyBhbiBvdXRlciBuYW1lc3BhY2UKKyNpZm5kZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKKyMgaWZkZWYgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfSU5DTFVERUQKKyMgIGlmbmRlZiBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9BTFJFQURZX0lOQ0xVREVECisjICAgZGVmaW5lIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRAorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8vIFVzZSBvcHRpb25hbCBvdXRlciBuYW1lc3BhY2UKKyNpZmRlZiBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorbmFtZXNwYWNlIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFIHsKKyNlbmRpZgorCituYW1lc3BhY2UgVGJjIHsKKworI2lmZGVmIFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRICisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRIOworI2Vsc2UKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gODA7CisjZW5kaWYKKworICAgIHN0cnVjdCBUZXh0QXR0cmlidXRlcyB7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgOiAgIGluaXRpYWxJbmRlbnQoIHN0ZDo6c3RyaW5nOjpucG9zICksCisgICAgICAgICAgICBpbmRlbnQoIDAgKSwKKyAgICAgICAgICAgIHdpZHRoKCBjb25zb2xlV2lkdGgtMSApCisgICAgICAgIHt9CisKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldEluaXRpYWxJbmRlbnQoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICB7IGluaXRpYWxJbmRlbnQgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0SW5kZW50KCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgIHsgaW5kZW50ID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldFdpZHRoKCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgICB7IHdpZHRoID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgICBzdGQ6OnNpemVfdCBpbml0aWFsSW5kZW50OyAgLy8gaW5kZW50IG9mIGZpcnN0IGxpbmUsIG9yIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3QgaW5kZW50OyAgICAgICAgIC8vIGluZGVudCBvZiBzdWJzZXF1ZW50IGxpbmVzLCBvciBhbGwgaWYgaW5pdGlhbEluZGVudCBpcyBucG9zCisgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoOyAgICAgICAgICAvLyBtYXhpbXVtIHdpZHRoIG9mIHRleHQsIGluY2x1ZGluZyBpbmRlbnQuIExvbmdlciB0ZXh0IHdpbGwgd3JhcAorICAgIH07CisKKyAgICBjbGFzcyBUZXh0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RyLCBUZXh0QXR0cmlidXRlcyBjb25zdCYgX2F0dHIgPSBUZXh0QXR0cmlidXRlcygpICkKKyAgICAgICAgOiBhdHRyKCBfYXR0ciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHdyYXBwYWJsZUJlZm9yZUNoYXJzID0gIlsoezxcdCI7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB3cmFwcGFibGVBZnRlckNoYXJzID0gIl0pfT4tLC4vfFxcIjsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHdyYXBwYWJsZUluc3RlYWRPZkNoYXJzID0gIiBcblxyIjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGVudCA9IF9hdHRyLmluaXRpYWxJbmRlbnQgIT0gc3RkOjpzdHJpbmc6Om5wb3MKKyAgICAgICAgICAgICAgICA/IHN0ZDo6c3RyaW5nKCBfYXR0ci5pbml0aWFsSW5kZW50LCAnICcgKQorICAgICAgICAgICAgICAgIDogc3RkOjpzdHJpbmcoIF9hdHRyLmluZGVudCwgJyAnICk7CisKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICAgICAgaXRlcmF0b3IgaXQgPSBfc3RyLmJlZ2luKCk7CisgICAgICAgICAgICBjb25zdCBpdGVyYXRvciBzdHJFbmQgPSBfc3RyLmVuZCgpOworCisgICAgICAgICAgICB3aGlsZSggaXQgIT0gc3RyRW5kICkgeworCisgICAgICAgICAgICAgICAgaWYoIGxpbmVzLnNpemUoKSA+PSAxMDAwICkgeworICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoX2JhY2soICIuLi4gbWVzc2FnZSB0cnVuY2F0ZWQgZHVlIHRvIGV4Y2Vzc2l2ZSBzaXplIiApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4OworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoID0gKHN0ZDo6bWluKSggc3RhdGljX2Nhc3Q8c2l6ZV90Piggc3RyRW5kLWl0ICksIF9hdHRyLndpZHRoLXN0YXRpY19jYXN0PHNpemVfdD4oIGluZGVudC5zaXplKCkgKSApOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGl0RW5kID0gaXQrd2lkdGg7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IgaXROZXh0ID0gX3N0ci5lbmQoKTsKKworICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGl0TmV3TGluZSA9IHN0ZDo6ZmluZCggaXQsIGl0RW5kLCAnXG4nICk7CisgICAgICAgICAgICAgICAgaWYoIGl0TmV3TGluZSAhPSBpdEVuZCApCisgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gaXROZXdMaW5lOworCisgICAgICAgICAgICAgICAgaWYoIGl0RW5kICE9IHN0ckVuZCAgKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgZm91bmRXcmFwUG9pbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgZmluZEl0ID0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB3cmFwcGFibGVBZnRlckNoYXJzLmZpbmQoICpmaW5kSXQgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyAmJiBmaW5kSXQgIT0gaXRFbmQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBmaW5kSXQrMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBmaW5kSXQrMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdyYXBQb2ludCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaW5kSXQgPiBpdCAmJiB3cmFwcGFibGVCZWZvcmVDaGFycy5maW5kKCAqZmluZEl0ICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBmaW5kSXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXROZXh0ID0gZmluZEl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV3JhcFBvaW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHdyYXBwYWJsZUluc3RlYWRPZkNoYXJzLmZpbmQoICpmaW5kSXQgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBmaW5kSXQrMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IGZpbmRJdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdyYXBQb2ludCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggZmluZEl0ID09IGl0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWZpbmRJdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSggIWZvdW5kV3JhcFBvaW50ICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoICFmb3VuZFdyYXBQb2ludCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGdvb2Qgd3JhcCBjaGFyLCBzbyB3ZSdsbCBicmVhayBtaWQgd29yZCBhbmQgYWRkIGEgaHlwaGVuCisgICAgICAgICAgICAgICAgICAgICAgICAtLWl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgaXROZXh0ID0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiLSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggaXRFbmQgPiBpdCAmJiB3cmFwcGFibGVJbnN0ZWFkT2ZDaGFycy5maW5kKCAqKGl0RW5kLTEpICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taXRFbmQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZXMucHVzaF9iYWNrKCBpbmRlbnQgKyBzdGQ6OnN0cmluZyggaXQsIGl0RW5kICkgKyBzdWZmaXggKTsKKworICAgICAgICAgICAgICAgIGlmKCBpbmRlbnQuc2l6ZSgpICE9IF9hdHRyLmluZGVudCApCisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IHN0ZDo6c3RyaW5nKCBfYXR0ci5pbmRlbnQsICcgJyApOworICAgICAgICAgICAgICAgIGl0ID0gaXROZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmVnaW4oKTsgfQorICAgICAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBsaW5lcy5lbmQoKTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbGFzdCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmJhY2soKTsgfQorICAgICAgICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbGluZXMuc2l6ZSgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRvcltdKCBzdGQ6OnNpemVfdCBfaW5kZXggKSBjb25zdCB7IHJldHVybiBsaW5lc1tfaW5kZXhdOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAqdGhpczsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIFRleHQgY29uc3QmIF90ZXh0ICkgeworICAgICAgICAgICAgZm9yKCBUZXh0Ojpjb25zdF9pdGVyYXRvciBpdCA9IF90ZXh0LmJlZ2luKCksIGl0RW5kID0gX3RleHQuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IF90ZXh0LmJlZ2luKCkgKQorICAgICAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA8PCAqaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICAgICBUZXh0QXR0cmlidXRlcyBhdHRyOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFRiYworCisjaWZkZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK30gLy8gZW5kIG91dGVyIG5hbWVzcGFjZQorI2VuZGlmCisKKyNlbmRpZiAvLyBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9BTFJFQURZX0lOQ0xVREVECisjdW5kZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICB1c2luZyBUYmM6OlRleHQ7CisgICAgdXNpbmcgVGJjOjpUZXh0QXR0cmlidXRlczsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbnNvbGVfY29sb3VyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09OU09MRV9DT0xPVVJfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQ29sb3VyIHsKKyAgICAgICAgZW51bSBDb2RlIHsKKyAgICAgICAgICAgIE5vbmUgPSAwLAorCisgICAgICAgICAgICBXaGl0ZSwKKyAgICAgICAgICAgIFJlZCwKKyAgICAgICAgICAgIEdyZWVuLAorICAgICAgICAgICAgQmx1ZSwKKyAgICAgICAgICAgIEN5YW4sCisgICAgICAgICAgICBZZWxsb3csCisgICAgICAgICAgICBHcmV5LAorCisgICAgICAgICAgICBCcmlnaHQgPSAweDEwLAorCisgICAgICAgICAgICBCcmlnaHRSZWQgPSBCcmlnaHQgfCBSZWQsCisgICAgICAgICAgICBCcmlnaHRHcmVlbiA9IEJyaWdodCB8IEdyZWVuLAorICAgICAgICAgICAgTGlnaHRHcmV5ID0gQnJpZ2h0IHwgR3JleSwKKyAgICAgICAgICAgIEJyaWdodFdoaXRlID0gQnJpZ2h0IHwgV2hpdGUsCisKKyAgICAgICAgICAgIC8vIEJ5IGludGVudGlvbgorICAgICAgICAgICAgRmlsZU5hbWUgPSBMaWdodEdyZXksCisgICAgICAgICAgICBXYXJuaW5nID0gWWVsbG93LAorICAgICAgICAgICAgUmVzdWx0RXJyb3IgPSBCcmlnaHRSZWQsCisgICAgICAgICAgICBSZXN1bHRTdWNjZXNzID0gQnJpZ2h0R3JlZW4sCisgICAgICAgICAgICBSZXN1bHRFeHBlY3RlZEZhaWx1cmUgPSBXYXJuaW5nLAorCisgICAgICAgICAgICBFcnJvciA9IEJyaWdodFJlZCwKKyAgICAgICAgICAgIFN1Y2Nlc3MgPSBHcmVlbiwKKworICAgICAgICAgICAgT3JpZ2luYWxFeHByZXNzaW9uID0gQ3lhbiwKKyAgICAgICAgICAgIFJlY29uc3RydWN0ZWRFeHByZXNzaW9uID0gWWVsbG93LAorCisgICAgICAgICAgICBTZWNvbmRhcnlUZXh0ID0gTGlnaHRHcmV5LAorICAgICAgICAgICAgSGVhZGVycyA9IFdoaXRlCisgICAgICAgIH07CisKKyAgICAgICAgLy8gVXNlIGNvbnN0cnVjdGVkIG9iamVjdCBmb3IgUkFJSSBndWFyZAorICAgICAgICBDb2xvdXIoIENvZGUgX2NvbG91ckNvZGUgKTsKKyAgICAgICAgQ29sb3VyKCBDb2xvdXIgY29uc3QmIG90aGVyICk7CisgICAgICAgIH5Db2xvdXIoKTsKKworICAgICAgICAvLyBVc2Ugc3RhdGljIG1ldGhvZCBmb3Igb25lLXNob3QgY2hhbmdlcworICAgICAgICBzdGF0aWMgdm9pZCB1c2UoIENvZGUgX2NvbG91ckNvZGUgKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgbV9tb3ZlZDsKKyAgICB9OworCisgICAgaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBDb2xvdXIgY29uc3QmICkgeyByZXR1cm4gb3M7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX3JlcG9ydGVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfUkVQT1JURVJfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2gKK3sKKyAgICBzdHJ1Y3QgUmVwb3J0ZXJDb25maWcgeworICAgICAgICBleHBsaWNpdCBSZXBvcnRlckNvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBfZnVsbENvbmZpZyApCisgICAgICAgIDogICBtX3N0cmVhbSggJl9mdWxsQ29uZmlnLT5zdHJlYW0oKSApLCBtX2Z1bGxDb25maWcoIF9mdWxsQ29uZmlnICkge30KKworICAgICAgICBSZXBvcnRlckNvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBfZnVsbENvbmZpZywgc3RkOjpvc3RyZWFtJiBfc3RyZWFtICkKKyAgICAgICAgOiAgIG1fc3RyZWFtKCAmX3N0cmVhbSApLCBtX2Z1bGxDb25maWcoIF9mdWxsQ29uZmlnICkge30KKworICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0ICAgIHsgcmV0dXJuICptX3N0cmVhbTsgfQorICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gZnVsbENvbmZpZygpIGNvbnN0IHsgcmV0dXJuIG1fZnVsbENvbmZpZzsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpvc3RyZWFtKiBtX3N0cmVhbTsKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fZnVsbENvbmZpZzsKKyAgICB9OworCisgICAgc3RydWN0IFJlcG9ydGVyUHJlZmVyZW5jZXMgeworICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzKCkKKyAgICAgICAgOiBzaG91bGRSZWRpcmVjdFN0ZE91dCggZmFsc2UgKQorICAgICAgICB7fQorCisgICAgICAgIGJvb2wgc2hvdWxkUmVkaXJlY3RTdGRPdXQ7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IExhenlTdGF0IDogT3B0aW9uPFQ+IHsKKyAgICAgICAgTGF6eVN0YXQoKSA6IHVzZWQoIGZhbHNlICkge30KKyAgICAgICAgTGF6eVN0YXQmIG9wZXJhdG9yPSggVCBjb25zdCYgX3ZhbHVlICkgeworICAgICAgICAgICAgT3B0aW9uPFQ+OjpvcGVyYXRvcj0oIF92YWx1ZSApOworICAgICAgICAgICAgdXNlZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBPcHRpb248VD46OnJlc2V0KCk7CisgICAgICAgICAgICB1c2VkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCB1c2VkOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdFJ1bkluZm8geworICAgICAgICBUZXN0UnVuSW5mbyggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lICkgOiBuYW1lKCBfbmFtZSApIHt9CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgfTsKKyAgICBzdHJ1Y3QgR3JvdXBJbmZvIHsKKyAgICAgICAgR3JvdXBJbmZvKCAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBfZ3JvdXBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgX2dyb3Vwc0NvdW50ICkKKyAgICAgICAgOiAgIG5hbWUoIF9uYW1lICksCisgICAgICAgICAgICBncm91cEluZGV4KCBfZ3JvdXBJbmRleCApLAorICAgICAgICAgICAgZ3JvdXBzQ291bnRzKCBfZ3JvdXBzQ291bnQgKQorICAgICAgICB7fQorCisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c2l6ZV90IGdyb3VwSW5kZXg7CisgICAgICAgIHN0ZDo6c2l6ZV90IGdyb3Vwc0NvdW50czsKKyAgICB9OworCisgICAgc3RydWN0IEFzc2VydGlvblN0YXRzIHsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgX2Fzc2VydGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBjb25zdCYgX2luZm9NZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscyApCisgICAgICAgIDogICBhc3NlcnRpb25SZXN1bHQoIF9hc3NlcnRpb25SZXN1bHQgKSwKKyAgICAgICAgICAgIGluZm9NZXNzYWdlcyggX2luZm9NZXNzYWdlcyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGFzc2VydGlvblJlc3VsdC5oYXNNZXNzYWdlKCkgKSB7CisgICAgICAgICAgICAgICAgLy8gQ29weSBtZXNzYWdlIGludG8gbWVzc2FnZXMgbGlzdC4KKyAgICAgICAgICAgICAgICAvLyAhVEJEIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkb25lIGVhcmxpZXIsIHNvbWV3aGVyZQorICAgICAgICAgICAgICAgIE1lc3NhZ2VCdWlsZGVyIGJ1aWxkZXIoIGFzc2VydGlvblJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCksIGFzc2VydGlvblJlc3VsdC5nZXRTb3VyY2VJbmZvKCksIGFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyIDw8IGFzc2VydGlvblJlc3VsdC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5tX2luZm8ubWVzc2FnZSA9IGJ1aWxkZXIubV9zdHJlYW0uc3RyKCk7CisKKyAgICAgICAgICAgICAgICBpbmZvTWVzc2FnZXMucHVzaF9iYWNrKCBidWlsZGVyLm1faW5mbyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfkFzc2VydGlvblN0YXRzKCk7CisKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBBc3NlcnRpb25TdGF0cyggQXNzZXJ0aW9uU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMoIEFzc2VydGlvblN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIEFzc2VydGlvblN0YXRzJiBvcGVyYXRvciA9ICggQXNzZXJ0aW9uU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBBc3NlcnRpb25TdGF0cyYgb3BlcmF0b3IgPSAoIEFzc2VydGlvblN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IGluZm9NZXNzYWdlczsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICB9OworCisgICAgc3RydWN0IFNlY3Rpb25TdGF0cyB7CisgICAgICAgIFNlY3Rpb25TdGF0cyggICBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRzIGNvbnN0JiBfYXNzZXJ0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfZHVyYXRpb25JblNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9taXNzaW5nQXNzZXJ0aW9ucyApCisgICAgICAgIDogICBzZWN0aW9uSW5mbyggX3NlY3Rpb25JbmZvICksCisgICAgICAgICAgICBhc3NlcnRpb25zKCBfYXNzZXJ0aW9ucyApLAorICAgICAgICAgICAgZHVyYXRpb25JblNlY29uZHMoIF9kdXJhdGlvbkluU2Vjb25kcyApLAorICAgICAgICAgICAgbWlzc2luZ0Fzc2VydGlvbnMoIF9taXNzaW5nQXNzZXJ0aW9ucyApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflNlY3Rpb25TdGF0cygpOworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFNlY3Rpb25TdGF0cyggU2VjdGlvblN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0cyggU2VjdGlvblN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0cyYgb3BlcmF0b3IgPSAoIFNlY3Rpb25TdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0cyYgb3BlcmF0b3IgPSAoIFNlY3Rpb25TdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIFNlY3Rpb25JbmZvIHNlY3Rpb25JbmZvOworICAgICAgICBDb3VudHMgYXNzZXJ0aW9uczsKKyAgICAgICAgZG91YmxlIGR1cmF0aW9uSW5TZWNvbmRzOworICAgICAgICBib29sIG1pc3NpbmdBc3NlcnRpb25zOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdENhc2VTdGF0cyB7CisgICAgICAgIFRlc3RDYXNlU3RhdHMoICBUZXN0Q2FzZUluZm8gY29uc3QmIF90ZXN0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RkT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9zdGRFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApCisgICAgICAgIDogdGVzdEluZm8oIF90ZXN0SW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgICAgICBzdGRPdXQoIF9zdGRPdXQgKSwKKyAgICAgICAgICAgIHN0ZEVyciggX3N0ZEVyciApLAorICAgICAgICAgICAgYWJvcnRpbmcoIF9hYm9ydGluZyApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRlc3RDYXNlU3RhdHMoKTsKKworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFRlc3RDYXNlU3RhdHMoIFRlc3RDYXNlU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdENhc2VTdGF0cyggVGVzdENhc2VTdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0Q2FzZVN0YXRzJiBvcGVyYXRvciA9ICggVGVzdENhc2VTdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RDYXNlU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0Q2FzZVN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgVGVzdENhc2VJbmZvIHRlc3RJbmZvOworICAgICAgICBUb3RhbHMgdG90YWxzOworICAgICAgICBzdGQ6OnN0cmluZyBzdGRPdXQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ZEVycjsKKyAgICAgICAgYm9vbCBhYm9ydGluZzsKKyAgICB9OworCisgICAgc3RydWN0IFRlc3RHcm91cFN0YXRzIHsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIEdyb3VwSW5mbyBjb25zdCYgX2dyb3VwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2Fib3J0aW5nICkKKyAgICAgICAgOiAgIGdyb3VwSW5mbyggX2dyb3VwSW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgICAgICBhYm9ydGluZyggX2Fib3J0aW5nICkKKyAgICAgICAge30KKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIEdyb3VwSW5mbyBjb25zdCYgX2dyb3VwSW5mbyApCisgICAgICAgIDogICBncm91cEluZm8oIF9ncm91cEluZm8gKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBmYWxzZSApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRlc3RHcm91cFN0YXRzKCk7CisKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBUZXN0R3JvdXBTdGF0cyggVGVzdEdyb3VwU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIFRlc3RHcm91cFN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RHcm91cFN0YXRzJiBvcGVyYXRvciA9ICggVGVzdEdyb3VwU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBUZXN0R3JvdXBTdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RHcm91cFN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgR3JvdXBJbmZvIGdyb3VwSW5mbzsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICAgICAgYm9vbCBhYm9ydGluZzsKKyAgICB9OworCisgICAgc3RydWN0IFRlc3RSdW5TdGF0cyB7CisgICAgICAgIFRlc3RSdW5TdGF0cyggICBUZXN0UnVuSW5mbyBjb25zdCYgX3J1bkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90b3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApCisgICAgICAgIDogICBydW5JbmZvKCBfcnVuSW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgICAgICBhYm9ydGluZyggX2Fib3J0aW5nICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VGVzdFJ1blN0YXRzKCk7CisKKyMgIGlmbmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgVGVzdFJ1blN0YXRzKCBUZXN0UnVuU3RhdHMgY29uc3QmIF9vdGhlciApCisgICAgICAgIDogICBydW5JbmZvKCBfb3RoZXIucnVuSW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfb3RoZXIudG90YWxzICksCisgICAgICAgICAgICBhYm9ydGluZyggX290aGVyLmFib3J0aW5nICkKKyAgICAgICAge30KKyMgIGVsc2UKKyAgICAgICAgVGVzdFJ1blN0YXRzKCBUZXN0UnVuU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdFJ1blN0YXRzKCBUZXN0UnVuU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdFJ1blN0YXRzJiBvcGVyYXRvciA9ICggVGVzdFJ1blN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdFJ1blN0YXRzJiBvcGVyYXRvciA9ICggVGVzdFJ1blN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgVGVzdFJ1bkluZm8gcnVuSW5mbzsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICAgICAgYm9vbCBhYm9ydGluZzsKKyAgICB9OworCisgICAgY2xhc3MgTXVsdGlwbGVSZXBvcnRlcnM7CisKKyAgICBzdHJ1Y3QgSVN0cmVhbWluZ1JlcG9ydGVyIDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgfklTdHJlYW1pbmdSZXBvcnRlcigpOworCisgICAgICAgIC8vIEltcGxlbWVudGluZyBjbGFzcyBtdXN0IGFsc28gcHJvdmlkZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBtZXRob2Q6CisgICAgICAgIC8vIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHRlc3RSdW5JbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiBhc3NlcnRpb25JbmZvICkgPSAwOworCisgICAgICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlcyBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQ6CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIE11bHRpcGxlUmVwb3J0ZXJzKiB0cnlBc011bHRpKCkgeyByZXR1cm4gQ0FUQ0hfTlVMTDsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyRmFjdG9yeSA6IElTaGFyZWQgeworICAgICAgICB2aXJ0dWFsIH5JUmVwb3J0ZXJGYWN0b3J5KCk7CisgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJUmVwb3J0ZXJSZWdpc3RyeSB7CisgICAgICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiA+IEZhY3RvcnlNYXA7CisgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPElSZXBvcnRlckZhY3Rvcnk+ID4gTGlzdGVuZXJzOworCisgICAgICAgIHZpcnR1YWwgfklSZXBvcnRlclJlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZyApIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBGYWN0b3J5TWFwIGNvbnN0JiBnZXRGYWN0b3JpZXMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgTGlzdGVuZXJzIGNvbnN0JiBnZXRMaXN0ZW5lcnMoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGFkZFJlcG9ydGVyKCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgZXhpc3RpbmdSZXBvcnRlciwgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIGFkZGl0aW9uYWxSZXBvcnRlciApOworCit9CisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgaW5saW5lIHN0ZDo6c2l6ZV90IGxpc3RUZXN0cyggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisKKyAgICAgICAgVGVzdFNwZWMgdGVzdFNwZWMgPSBjb25maWcudGVzdFNwZWMoKTsKKyAgICAgICAgaWYoIGNvbmZpZy50ZXN0U3BlYygpLmhhc0ZpbHRlcnMoKSApCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJNYXRjaGluZyB0ZXN0IGNhc2VzOlxuIjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJBbGwgYXZhaWxhYmxlIHRlc3QgY2FzZXM6XG4iOworICAgICAgICAgICAgdGVzdFNwZWMgPSBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoICIqIiApLnRlc3RTcGVjKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCBtYXRjaGVkVGVzdHMgPSAwOworICAgICAgICBUZXh0QXR0cmlidXRlcyBuYW1lQXR0ciwgdGFnc0F0dHI7CisgICAgICAgIG5hbWVBdHRyLnNldEluaXRpYWxJbmRlbnQoIDIgKS5zZXRJbmRlbnQoIDQgKTsKKyAgICAgICAgdGFnc0F0dHIuc2V0SW5kZW50KCA2ICk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1hdGNoZWRUZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNwZWMsIGNvbmZpZyApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXRjaGVkVGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gbWF0Y2hlZFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgbWF0Y2hlZFRlc3RzKys7CisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyA9IGl0LT5nZXRUZXN0Q2FzZUluZm8oKTsKKyAgICAgICAgICAgIENvbG91cjo6Q29kZSBjb2xvdXIgPSB0ZXN0Q2FzZUluZm8uaXNIaWRkZW4oKQorICAgICAgICAgICAgICAgID8gQ29sb3VyOjpTZWNvbmRhcnlUZXh0CisgICAgICAgICAgICAgICAgOiBDb2xvdXI6Ok5vbmU7CisgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGNvbG91ciApOworCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IFRleHQoIHRlc3RDYXNlSW5mby5uYW1lLCBuYW1lQXR0ciApIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIGlmKCAhdGVzdENhc2VJbmZvLnRhZ3MuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBUZXh0KCB0ZXN0Q2FzZUluZm8udGFnc0FzU3RyaW5nLCB0YWdzQXR0ciApIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgcGx1cmFsaXNlKCBtYXRjaGVkVGVzdHMsICJ0ZXN0IGNhc2UiICkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgcGx1cmFsaXNlKCBtYXRjaGVkVGVzdHMsICJtYXRjaGluZyB0ZXN0IGNhc2UiICkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBtYXRjaGVkVGVzdHM7CisgICAgfQorCisgICAgaW5saW5lIHN0ZDo6c2l6ZV90IGxpc3RUZXN0c05hbWVzT25seSggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjID0gY29uZmlnLnRlc3RTcGVjKCk7CisgICAgICAgIGlmKCAhY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIHRlc3RTcGVjID0gVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApLnBhcnNlKCAiKiIgKS50ZXN0U3BlYygpOworICAgICAgICBzdGQ6OnNpemVfdCBtYXRjaGVkVGVzdHMgPSAwOworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbWF0Y2hlZFRlc3RDYXNlcyA9IGZpbHRlclRlc3RzKCBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApLCB0ZXN0U3BlYywgY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1hdGNoZWRUZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSBtYXRjaGVkVGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBtYXRjaGVkVGVzdHMrKzsKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gaXQtPmdldFRlc3RDYXNlSW5mbygpOworICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIHRlc3RDYXNlSW5mby5uYW1lLCAnIycgKSApCisgICAgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICciJyA8PCB0ZXN0Q2FzZUluZm8ubmFtZSA8PCAnIicgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCB0ZXN0Q2FzZUluZm8ubmFtZSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoZWRUZXN0czsKKyAgICB9CisKKyAgICBzdHJ1Y3QgVGFnSW5mbyB7CisgICAgICAgIFRhZ0luZm8oKSA6IGNvdW50ICggMCApIHt9CisgICAgICAgIHZvaWQgYWRkKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlbGxpbmcgKSB7CisgICAgICAgICAgICArK2NvdW50OworICAgICAgICAgICAgc3BlbGxpbmdzLmluc2VydCggc3BlbGxpbmcgKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBhbGwoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBvdXQ7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzcGVsbGluZ3MuYmVnaW4oKSwgaXRFbmQgPSBzcGVsbGluZ3MuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIG91dCArPSAiWyIgKyAqaXQgKyAiXSI7CisgICAgICAgICAgICByZXR1cm4gb3V0OworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBzcGVsbGluZ3M7CisgICAgICAgIHN0ZDo6c2l6ZV90IGNvdW50OworICAgIH07CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFRhZ3MoIENvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYyA9IGNvbmZpZy50ZXN0U3BlYygpOworICAgICAgICBpZiggY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIlRhZ3MgZm9yIG1hdGNoaW5nIHRlc3QgY2FzZXM6XG4iOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkFsbCBhdmFpbGFibGUgdGFnczpcbiI7CisgICAgICAgICAgICB0ZXN0U3BlYyA9IFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggIioiICkudGVzdFNwZWMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdJbmZvPiB0YWdDb3VudHM7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1hdGNoZWRUZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNwZWMsIGNvbmZpZyApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXRjaGVkVGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gbWF0Y2hlZFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgZm9yKCBzdGQ6OnNldDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yICB0YWdJdCA9IGl0LT5nZXRUZXN0Q2FzZUluZm8oKS50YWdzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0l0RW5kID0gaXQtPmdldFRlc3RDYXNlSW5mbygpLnRhZ3MuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHRhZ0l0ICE9IHRhZ0l0RW5kOworICAgICAgICAgICAgICAgICAgICArK3RhZ0l0ICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ05hbWUgPSAqdGFnSXQ7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGNhc2VUYWdOYW1lID0gdG9Mb3dlciggdGFnTmFtZSApOworICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdJbmZvPjo6aXRlcmF0b3IgY291bnRJdCA9IHRhZ0NvdW50cy5maW5kKCBsY2FzZVRhZ05hbWUgKTsKKyAgICAgICAgICAgICAgICBpZiggY291bnRJdCA9PSB0YWdDb3VudHMuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICBjb3VudEl0ID0gdGFnQ291bnRzLmluc2VydCggc3RkOjptYWtlX3BhaXIoIGxjYXNlVGFnTmFtZSwgVGFnSW5mbygpICkgKS5maXJzdDsKKyAgICAgICAgICAgICAgICBjb3VudEl0LT5zZWNvbmQuYWRkKCB0YWdOYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdJbmZvPjo6Y29uc3RfaXRlcmF0b3IgY291bnRJdCA9IHRhZ0NvdW50cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRJdEVuZCA9IHRhZ0NvdW50cy5lbmQoKTsKKyAgICAgICAgICAgICAgICBjb3VudEl0ICE9IGNvdW50SXRFbmQ7CisgICAgICAgICAgICAgICAgKytjb3VudEl0ICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiICAiIDw8IHN0ZDo6c2V0dygyKSA8PCBjb3VudEl0LT5zZWNvbmQuY291bnQgPDwgIiAgIjsKKyAgICAgICAgICAgIFRleHQgd3JhcHBlciggY291bnRJdC0+c2Vjb25kLmFsbCgpLCBUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluaXRpYWxJbmRlbnQoIDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRlbnQoIG9zcy5zdHIoKS5zaXplKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaWR0aCggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMTAgKSApOworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBvc3Muc3RyKCkgPDwgd3JhcHBlciA8PCAnXG4nOworICAgICAgICB9CisgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgcGx1cmFsaXNlKCB0YWdDb3VudHMuc2l6ZSgpLCAidGFnIiApIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gdGFnQ291bnRzLnNpemUoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFJlcG9ydGVycyggQ29uZmlnIGNvbnN0JiAvKmNvbmZpZyovICkgeworICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJBdmFpbGFibGUgcmVwb3J0ZXJzOlxuIjsKKyAgICAgICAgSVJlcG9ydGVyUmVnaXN0cnk6OkZhY3RvcnlNYXAgY29uc3QmIGZhY3RvcmllcyA9IGdldFJlZ2lzdHJ5SHViKCkuZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpLmdldEZhY3RvcmllcygpOworICAgICAgICBJUmVwb3J0ZXJSZWdpc3RyeTo6RmFjdG9yeU1hcDo6Y29uc3RfaXRlcmF0b3IgaXRCZWdpbiA9IGZhY3Rvcmllcy5iZWdpbigpLCBpdEVuZCA9IGZhY3Rvcmllcy5lbmQoKSwgaXQ7CisgICAgICAgIHN0ZDo6c2l6ZV90IG1heE5hbWVMZW4gPSAwOworICAgICAgICBmb3IoaXQgPSBpdEJlZ2luOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICBtYXhOYW1lTGVuID0gKHN0ZDo6bWF4KSggbWF4TmFtZUxlbiwgaXQtPmZpcnN0LnNpemUoKSApOworCisgICAgICAgIGZvcihpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgVGV4dCB3cmFwcGVyKCBpdC0+c2Vjb25kLT5nZXREZXNjcmlwdGlvbigpLCBUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsSW5kZW50KCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggNyttYXhOYW1lTGVuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpZHRoKCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCAtIG1heE5hbWVMZW4tOCApICk7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICIgICIKKyAgICAgICAgICAgICAgICAgICAgPDwgaXQtPmZpcnN0CisgICAgICAgICAgICAgICAgICAgIDw8ICc6JworICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OnN0cmluZyggbWF4TmFtZUxlbiAtIGl0LT5maXJzdC5zaXplKCkgKyAyLCAnICcgKQorICAgICAgICAgICAgICAgICAgICA8PCB3cmFwcGVyIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBmYWN0b3JpZXMuc2l6ZSgpOworICAgIH0KKworICAgIGlubGluZSBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3QoIENvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3RlZENvdW50OworICAgICAgICBpZiggY29uZmlnLmxpc3RUZXN0cygpICkKKyAgICAgICAgICAgIGxpc3RlZENvdW50ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RUZXN0cyggY29uZmlnICk7CisgICAgICAgIGlmKCBjb25maWcubGlzdFRlc3ROYW1lc09ubHkoKSApCisgICAgICAgICAgICBsaXN0ZWRDb3VudCA9IGxpc3RlZENvdW50LnZhbHVlT3IoMCkgKyBsaXN0VGVzdHNOYW1lc09ubHkoIGNvbmZpZyApOworICAgICAgICBpZiggY29uZmlnLmxpc3RUYWdzKCkgKQorICAgICAgICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRhZ3MoIGNvbmZpZyApOworICAgICAgICBpZiggY29uZmlnLmxpc3RSZXBvcnRlcnMoKSApCisgICAgICAgICAgICBsaXN0ZWRDb3VudCA9IGxpc3RlZENvdW50LnZhbHVlT3IoMCkgKyBsaXN0UmVwb3J0ZXJzKCBjb25maWcgKTsKKyAgICAgICAgcmV0dXJuIGxpc3RlZENvdW50OworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9ydW5fY29udGV4dC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JVTk5FUl9JTVBMX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9jYXNlX3RyYWNrZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX0NBU0VfVFJBQ0tFUl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgVGVzdENhc2VUcmFja2luZyB7CisKKyAgICBzdHJ1Y3QgTmFtZUFuZExvY2F0aW9uIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgU291cmNlTGluZUluZm8gbG9jYXRpb247CisKKyAgICAgICAgTmFtZUFuZExvY2F0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbG9jYXRpb24gKQorICAgICAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgICAgIGxvY2F0aW9uKCBfbG9jYXRpb24gKQorICAgICAgICB7fQorICAgIH07CisKKyAgICBzdHJ1Y3QgSVRyYWNrZXIgOiBTaGFyZWRJbXBsPD4geworICAgICAgICB2aXJ0dWFsIH5JVHJhY2tlcigpOworCisgICAgICAgIC8vIHN0YXRpYyBxdWVyaWVzCisgICAgICAgIHZpcnR1YWwgTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24oKSBjb25zdCA9IDA7CisKKyAgICAgICAgLy8gZHluYW1pYyBxdWVyaWVzCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3QgPSAwOyAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGVkIG9yIGZhaWxlZAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsbHlDb21wbGV0ZWQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc09wZW4oKSBjb25zdCA9IDA7IC8vIFN0YXJ0ZWQgYnV0IG5vdCBjb21wbGV0ZQorICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzQ2hpbGRyZW4oKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCBJVHJhY2tlciYgcGFyZW50KCkgPSAwOworCisgICAgICAgIC8vIGFjdGlvbnMKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOyAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGUKKyAgICAgICAgdmlydHVhbCB2b2lkIGZhaWwoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBtYXJrQXNOZWVkaW5nQW5vdGhlclJ1bigpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoIFB0cjxJVHJhY2tlcj4gY29uc3QmIGNoaWxkICkgPSAwOworICAgICAgICB2aXJ0dWFsIElUcmFja2VyKiBmaW5kQ2hpbGQoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgb3BlbkNoaWxkKCkgPSAwOworCisgICAgICAgIC8vIERlYnVnLyBjaGVja2luZworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uVHJhY2tlcigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5kZXhUcmFja2VyKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBjbGFzcyAgVHJhY2tlckNvbnRleHQgeworCisgICAgICAgIGVudW0gUnVuU3RhdGUgeworICAgICAgICAgICAgTm90U3RhcnRlZCwKKyAgICAgICAgICAgIEV4ZWN1dGluZywKKyAgICAgICAgICAgIENvbXBsZXRlZEN5Y2xlCisgICAgICAgIH07CisKKyAgICAgICAgUHRyPElUcmFja2VyPiBtX3Jvb3RUcmFja2VyOworICAgICAgICBJVHJhY2tlciogbV9jdXJyZW50VHJhY2tlcjsKKyAgICAgICAgUnVuU3RhdGUgbV9ydW5TdGF0ZTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBzdGF0aWMgVHJhY2tlckNvbnRleHQmIGluc3RhbmNlKCkgeworICAgICAgICAgICAgc3RhdGljIFRyYWNrZXJDb250ZXh0IHNfaW5zdGFuY2U7CisgICAgICAgICAgICByZXR1cm4gc19pbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIFRyYWNrZXJDb250ZXh0KCkKKyAgICAgICAgOiAgIG1fY3VycmVudFRyYWNrZXIoIENBVENIX05VTEwgKSwKKyAgICAgICAgICAgIG1fcnVuU3RhdGUoIE5vdFN0YXJ0ZWQgKQorICAgICAgICB7fQorCisgICAgICAgIElUcmFja2VyJiBzdGFydFJ1bigpOworCisgICAgICAgIHZvaWQgZW5kUnVuKCkgeworICAgICAgICAgICAgbV9yb290VHJhY2tlci5yZXNldCgpOworICAgICAgICAgICAgbV9jdXJyZW50VHJhY2tlciA9IENBVENIX05VTEw7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gTm90U3RhcnRlZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc3RhcnRDeWNsZSgpIHsKKyAgICAgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSBtX3Jvb3RUcmFja2VyLmdldCgpOworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGNvbXBsZXRlQ3ljbGUoKSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gQ29tcGxldGVkQ3ljbGU7CisgICAgICAgIH0KKworICAgICAgICBib29sIGNvbXBsZXRlZEN5Y2xlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgPT0gQ29tcGxldGVkQ3ljbGU7CisgICAgICAgIH0KKyAgICAgICAgSVRyYWNrZXImIGN1cnJlbnRUcmFja2VyKCkgeworICAgICAgICAgICAgcmV0dXJuICptX2N1cnJlbnRUcmFja2VyOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2V0Q3VycmVudFRyYWNrZXIoIElUcmFja2VyKiB0cmFja2VyICkgeworICAgICAgICAgICAgbV9jdXJyZW50VHJhY2tlciA9IHRyYWNrZXI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgY2xhc3MgVHJhY2tlckJhc2UgOiBwdWJsaWMgSVRyYWNrZXIgeworICAgIHByb3RlY3RlZDoKKyAgICAgICAgZW51bSBDeWNsZVN0YXRlIHsKKyAgICAgICAgICAgIE5vdFN0YXJ0ZWQsCisgICAgICAgICAgICBFeGVjdXRpbmcsCisgICAgICAgICAgICBFeGVjdXRpbmdDaGlsZHJlbiwKKyAgICAgICAgICAgIE5lZWRzQW5vdGhlclJ1biwKKyAgICAgICAgICAgIENvbXBsZXRlZFN1Y2Nlc3NmdWxseSwKKyAgICAgICAgICAgIEZhaWxlZAorICAgICAgICB9OworICAgICAgICBjbGFzcyBUcmFja2VySGFzTmFtZSB7CisgICAgICAgICAgICBOYW1lQW5kTG9jYXRpb24gbV9uYW1lQW5kTG9jYXRpb247CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFRyYWNrZXJIYXNOYW1lKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiApIDogbV9uYW1lQW5kTG9jYXRpb24oIG5hbWVBbmRMb2NhdGlvbiApIHt9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yICgpKCBQdHI8SVRyYWNrZXI+IGNvbnN0JiB0cmFja2VyICkgeworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICB0cmFja2VyLT5uYW1lQW5kTG9jYXRpb24oKS5uYW1lID09IG1fbmFtZUFuZExvY2F0aW9uLm5hbWUgJiYKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tlci0+bmFtZUFuZExvY2F0aW9uKCkubG9jYXRpb24gPT0gbV9uYW1lQW5kTG9jYXRpb24ubG9jYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPElUcmFja2VyPiA+IENoaWxkcmVuOworICAgICAgICBOYW1lQW5kTG9jYXRpb24gbV9uYW1lQW5kTG9jYXRpb247CisgICAgICAgIFRyYWNrZXJDb250ZXh0JiBtX2N0eDsKKyAgICAgICAgSVRyYWNrZXIqIG1fcGFyZW50OworICAgICAgICBDaGlsZHJlbiBtX2NoaWxkcmVuOworICAgICAgICBDeWNsZVN0YXRlIG1fcnVuU3RhdGU7CisgICAgcHVibGljOgorICAgICAgICBUcmFja2VyQmFzZSggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24sIFRyYWNrZXJDb250ZXh0JiBjdHgsIElUcmFja2VyKiBwYXJlbnQgKQorICAgICAgICA6ICAgbV9uYW1lQW5kTG9jYXRpb24oIG5hbWVBbmRMb2NhdGlvbiApLAorICAgICAgICAgICAgbV9jdHgoIGN0eCApLAorICAgICAgICAgICAgbV9wYXJlbnQoIHBhcmVudCApLAorICAgICAgICAgICAgbV9ydW5TdGF0ZSggTm90U3RhcnRlZCApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRyYWNrZXJCYXNlKCk7CisKKyAgICAgICAgdmlydHVhbCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX25hbWVBbmRMb2NhdGlvbjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1blN0YXRlID09IENvbXBsZXRlZFN1Y2Nlc3NmdWxseSB8fCBtX3J1blN0YXRlID09IEZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsbHlDb21wbGV0ZWQoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRTdWNjZXNzZnVsbHk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGlzT3BlbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1blN0YXRlICE9IE5vdFN0YXJ0ZWQgJiYgIWlzQ29tcGxldGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzQ2hpbGRyZW4oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gIW1fY2hpbGRyZW4uZW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZCggUHRyPElUcmFja2VyPiBjb25zdCYgY2hpbGQgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX2NoaWxkcmVuLnB1c2hfYmFjayggY2hpbGQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgSVRyYWNrZXIqIGZpbmRDaGlsZCggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBDaGlsZHJlbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdGQ6OmZpbmRfaWYoIG1fY2hpbGRyZW4uYmVnaW4oKSwgbV9jaGlsZHJlbi5lbmQoKSwgVHJhY2tlckhhc05hbWUoIG5hbWVBbmRMb2NhdGlvbiApICk7CisgICAgICAgICAgICByZXR1cm4oIGl0ICE9IG1fY2hpbGRyZW4uZW5kKCkgKQorICAgICAgICAgICAgICAgID8gaXQtPmdldCgpCisgICAgICAgICAgICAgICAgOiBDQVRDSF9OVUxMOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgSVRyYWNrZXImIHBhcmVudCgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGFzc2VydCggbV9wYXJlbnQgKTsgLy8gU2hvdWxkIGFsd2F5cyBiZSBub24tbnVsbCBleGNlcHQgZm9yIHJvb3QKKyAgICAgICAgICAgIHJldHVybiAqbV9wYXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgb3BlbkNoaWxkKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIG1fcnVuU3RhdGUgIT0gRXhlY3V0aW5nQ2hpbGRyZW4gKSB7CisgICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZ0NoaWxkcmVuOworICAgICAgICAgICAgICAgIGlmKCBtX3BhcmVudCApCisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5vcGVuQ2hpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25UcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5kZXhUcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICB2b2lkIG9wZW4oKSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICAgICAgbW92ZVRvVGhpcygpOworICAgICAgICAgICAgaWYoIG1fcGFyZW50ICkKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+b3BlbkNoaWxkKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSBDQVRDSF9PVkVSUklERSB7CisKKyAgICAgICAgICAgIC8vIENsb3NlIGFueSBzdGlsbCBvcGVuIGNoaWxkcmVuIChlLmcuIGdlbmVyYXRvcnMpCisgICAgICAgICAgICB3aGlsZSggJm1fY3R4LmN1cnJlbnRUcmFja2VyKCkgIT0gdGhpcyApCisgICAgICAgICAgICAgICAgbV9jdHguY3VycmVudFRyYWNrZXIoKS5jbG9zZSgpOworCisgICAgICAgICAgICBzd2l0Y2goIG1fcnVuU3RhdGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb3RTdGFydGVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OgorICAgICAgICAgICAgICAgIGNhc2UgRmFpbGVkOgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiSWxsb2dpY2FsIHN0YXRlIiApOworCisgICAgICAgICAgICAgICAgY2FzZSBOZWVkc0Fub3RoZXJSdW46CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOzsKKworICAgICAgICAgICAgICAgIGNhc2UgRXhlY3V0aW5nOgorICAgICAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4ZWN1dGluZ0NoaWxkcmVuOgorICAgICAgICAgICAgICAgICAgICBpZiggbV9jaGlsZHJlbi5lbXB0eSgpIHx8IG1fY2hpbGRyZW4uYmFjaygpLT5pc0NvbXBsZXRlKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IENvbXBsZXRlZFN1Y2Nlc3NmdWxseTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiVW5leHBlY3RlZCBzdGF0ZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vdmVUb1BhcmVudCgpOworICAgICAgICAgICAgbV9jdHguY29tcGxldGVDeWNsZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBmYWlsKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEZhaWxlZDsKKyAgICAgICAgICAgIGlmKCBtX3BhcmVudCApCisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm1hcmtBc05lZWRpbmdBbm90aGVyUnVuKCk7CisgICAgICAgICAgICBtb3ZlVG9QYXJlbnQoKTsKKyAgICAgICAgICAgIG1fY3R4LmNvbXBsZXRlQ3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgbWFya0FzTmVlZGluZ0Fub3RoZXJSdW4oKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gTmVlZHNBbm90aGVyUnVuOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBtb3ZlVG9QYXJlbnQoKSB7CisgICAgICAgICAgICBhc3NlcnQoIG1fcGFyZW50ICk7CisgICAgICAgICAgICBtX2N0eC5zZXRDdXJyZW50VHJhY2tlciggbV9wYXJlbnQgKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIG1vdmVUb1RoaXMoKSB7CisgICAgICAgICAgICBtX2N0eC5zZXRDdXJyZW50VHJhY2tlciggdGhpcyApOworICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIFNlY3Rpb25UcmFja2VyIDogcHVibGljIFRyYWNrZXJCYXNlIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1fZmlsdGVyczsKKyAgICBwdWJsaWM6CisgICAgICAgIFNlY3Rpb25UcmFja2VyKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgVHJhY2tlckNvbnRleHQmIGN0eCwgSVRyYWNrZXIqIHBhcmVudCApCisgICAgICAgIDogICBUcmFja2VyQmFzZSggbmFtZUFuZExvY2F0aW9uLCBjdHgsIHBhcmVudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwYXJlbnQgKSB7CisgICAgICAgICAgICAgICAgd2hpbGUoICFwYXJlbnQtPmlzU2VjdGlvblRyYWNrZXIoKSApCisgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9ICZwYXJlbnQtPnBhcmVudCgpOworCisgICAgICAgICAgICAgICAgU2VjdGlvblRyYWNrZXImIHBhcmVudFNlY3Rpb24gPSBzdGF0aWNfY2FzdDxTZWN0aW9uVHJhY2tlciY+KCAqcGFyZW50ICk7CisgICAgICAgICAgICAgICAgYWRkTmV4dEZpbHRlcnMoIHBhcmVudFNlY3Rpb24ubV9maWx0ZXJzICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+U2VjdGlvblRyYWNrZXIoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uVHJhY2tlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICBzdGF0aWMgU2VjdGlvblRyYWNrZXImIGFjcXVpcmUoIFRyYWNrZXJDb250ZXh0JiBjdHgsIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgeworICAgICAgICAgICAgU2VjdGlvblRyYWNrZXIqIHNlY3Rpb24gPSBDQVRDSF9OVUxMOworCisgICAgICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIgPSBjdHguY3VycmVudFRyYWNrZXIoKTsKKyAgICAgICAgICAgIGlmKCBJVHJhY2tlciogY2hpbGRUcmFja2VyID0gY3VycmVudFRyYWNrZXIuZmluZENoaWxkKCBuYW1lQW5kTG9jYXRpb24gKSApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tlciApOworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyLT5pc1NlY3Rpb25UcmFja2VyKCkgKTsKKyAgICAgICAgICAgICAgICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8U2VjdGlvblRyYWNrZXIqPiggY2hpbGRUcmFja2VyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZWN0aW9uID0gbmV3IFNlY3Rpb25UcmFja2VyKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgJmN1cnJlbnRUcmFja2VyICk7CisgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrZXIuYWRkQ2hpbGQoIHNlY3Rpb24gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhY3R4LmNvbXBsZXRlZEN5Y2xlKCkgKQorICAgICAgICAgICAgICAgIHNlY3Rpb24tPnRyeU9wZW4oKTsKKyAgICAgICAgICAgIHJldHVybiAqc2VjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdHJ5T3BlbigpIHsKKyAgICAgICAgICAgIGlmKCAhaXNDb21wbGV0ZSgpICYmIChtX2ZpbHRlcnMuZW1wdHkoKSB8fCBtX2ZpbHRlcnNbMF0uZW1wdHkoKSB8fCAgbV9maWx0ZXJzWzBdID09IG1fbmFtZUFuZExvY2F0aW9uLm5hbWUgKSApCisgICAgICAgICAgICAgICAgb3BlbigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRJbml0aWFsRmlsdGVycyggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBmaWx0ZXJzICkgeworICAgICAgICAgICAgaWYoICFmaWx0ZXJzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLnB1c2hfYmFjaygiIik7IC8vIFJvb3QgLSBzaG91bGQgbmV2ZXIgYmUgY29uc3VsdGVkCisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLnB1c2hfYmFjaygiIik7IC8vIFRlc3QgQ2FzZSAtIG5vdCBhIHNlY3Rpb24gZmlsdGVyCisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLmluc2VydCggbV9maWx0ZXJzLmVuZCgpLCBmaWx0ZXJzLmJlZ2luKCksIGZpbHRlcnMuZW5kKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2b2lkIGFkZE5leHRGaWx0ZXJzKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGZpbHRlcnMgKSB7CisgICAgICAgICAgICBpZiggZmlsdGVycy5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICBtX2ZpbHRlcnMuaW5zZXJ0KCBtX2ZpbHRlcnMuZW5kKCksICsrZmlsdGVycy5iZWdpbigpLCBmaWx0ZXJzLmVuZCgpICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgY2xhc3MgSW5kZXhUcmFja2VyIDogcHVibGljIFRyYWNrZXJCYXNlIHsKKyAgICAgICAgaW50IG1fc2l6ZTsKKyAgICAgICAgaW50IG1faW5kZXg7CisgICAgcHVibGljOgorICAgICAgICBJbmRleFRyYWNrZXIoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uLCBUcmFja2VyQ29udGV4dCYgY3R4LCBJVHJhY2tlciogcGFyZW50LCBpbnQgc2l6ZSApCisgICAgICAgIDogICBUcmFja2VyQmFzZSggbmFtZUFuZExvY2F0aW9uLCBjdHgsIHBhcmVudCApLAorICAgICAgICAgICAgbV9zaXplKCBzaXplICksCisgICAgICAgICAgICBtX2luZGV4KCAtMSApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgfkluZGV4VHJhY2tlcigpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0luZGV4VHJhY2tlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICBzdGF0aWMgSW5kZXhUcmFja2VyJiBhY3F1aXJlKCBUcmFja2VyQ29udGV4dCYgY3R4LCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgaW50IHNpemUgKSB7CisgICAgICAgICAgICBJbmRleFRyYWNrZXIqIHRyYWNrZXIgPSBDQVRDSF9OVUxMOworCisgICAgICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIgPSBjdHguY3VycmVudFRyYWNrZXIoKTsKKyAgICAgICAgICAgIGlmKCBJVHJhY2tlciogY2hpbGRUcmFja2VyID0gY3VycmVudFRyYWNrZXIuZmluZENoaWxkKCBuYW1lQW5kTG9jYXRpb24gKSApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tlciApOworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyLT5pc0luZGV4VHJhY2tlcigpICk7CisgICAgICAgICAgICAgICAgdHJhY2tlciA9IHN0YXRpY19jYXN0PEluZGV4VHJhY2tlcio+KCBjaGlsZFRyYWNrZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNrZXIgPSBuZXcgSW5kZXhUcmFja2VyKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgJmN1cnJlbnRUcmFja2VyLCBzaXplICk7CisgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrZXIuYWRkQ2hpbGQoIHRyYWNrZXIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICFjdHguY29tcGxldGVkQ3ljbGUoKSAmJiAhdHJhY2tlci0+aXNDb21wbGV0ZSgpICkgeworICAgICAgICAgICAgICAgIGlmKCB0cmFja2VyLT5tX3J1blN0YXRlICE9IEV4ZWN1dGluZ0NoaWxkcmVuICYmIHRyYWNrZXItPm1fcnVuU3RhdGUgIT0gTmVlZHNBbm90aGVyUnVuICkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tlci0+bW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgICB0cmFja2VyLT5vcGVuKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAqdHJhY2tlcjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KKworICAgICAgICB2b2lkIG1vdmVOZXh0KCkgeworICAgICAgICAgICAgbV9pbmRleCsrOworICAgICAgICAgICAgbV9jaGlsZHJlbi5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgVHJhY2tlckJhc2U6OmNsb3NlKCk7CisgICAgICAgICAgICBpZiggbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRTdWNjZXNzZnVsbHkgJiYgbV9pbmRleCA8IG1fc2l6ZS0xICkKKyAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICB9CisgICAgfTsKKworICAgIGlubGluZSBJVHJhY2tlciYgVHJhY2tlckNvbnRleHQ6OnN0YXJ0UnVuKCkgeworICAgICAgICBtX3Jvb3RUcmFja2VyID0gbmV3IFNlY3Rpb25UcmFja2VyKCBOYW1lQW5kTG9jYXRpb24oICJ7cm9vdH0iLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApLCAqdGhpcywgQ0FUQ0hfTlVMTCApOworICAgICAgICBtX2N1cnJlbnRUcmFja2VyID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgcmV0dXJuICptX3Jvb3RUcmFja2VyOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgVGVzdENhc2VUcmFja2luZworCit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpJVHJhY2tlcjsKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OlRyYWNrZXJDb250ZXh0OwordXNpbmcgVGVzdENhc2VUcmFja2luZzo6U2VjdGlvblRyYWNrZXI7Cit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpJbmRleFRyYWNrZXI7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKK0NBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9mYXRhbF9jb25kaXRpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9GQVRBTF9DT05ESVRJT05fSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gUmVwb3J0IHRoZSBlcnJvciBjb25kaXRpb24KKyAgICBpbmxpbmUgdm9pZCByZXBvcnRGYXRhbCggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKSB7CisgICAgICAgIElDb250ZXh0JiBjb250ZXh0ID0gQ2F0Y2g6OmdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgICAgIElSZXN1bHRDYXB0dXJlKiByZXN1bHRDYXB0dXJlID0gY29udGV4dC5nZXRSZXN1bHRDYXB0dXJlKCk7CisgICAgICAgIHJlc3VsdENhcHR1cmUtPmhhbmRsZUZhdGFsRXJyb3JDb25kaXRpb24oIG1lc3NhZ2UgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpZiBkZWZpbmVkICggQ0FUQ0hfUExBVEZPUk1fV0lORE9XUyApIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfd2luZG93c19oX3Byb3h5LmgKKworI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfV0lORE9XU19IX1BST1hZX0hfSU5DTFVERUQKKworI2lmZGVmIENBVENIX0RFRklORVNfTk9NSU5NQVgKKyMgIGRlZmluZSBOT01JTk1BWAorI2VuZGlmCisjaWZkZWYgQ0FUQ0hfREVGSU5FU19XSU4zMl9MRUFOX0FORF9NRUFOCisjICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2VuZGlmCisKKyNpZmRlZiBfX0FGWERMTAorI2luY2x1ZGUgPEFmeFdpbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmZGVmIENBVENIX0RFRklORVNfTk9NSU5NQVgKKyMgIHVuZGVmIE5PTUlOTUFYCisjZW5kaWYKKyNpZmRlZiBDQVRDSF9ERUZJTkVTX1dJTjMyX0xFQU5fQU5EX01FQU4KKyMgIHVuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNlbmRpZgorCisKKyMgIGlmICFkZWZpbmVkICggQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VIICkKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBzdHJ1Y3QgRmF0YWxDb25kaXRpb25IYW5kbGVyIHsKKyAgICAgICAgdm9pZCByZXNldCgpIHt9CisgICAgfTsKK30KKworIyAgZWxzZSAvLyBDQVRDSF9DT05GSUdfV0lORE9XU19TRUggaXMgZGVmaW5lZAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNpZ25hbERlZnMgeyBEV09SRCBpZDsgY29uc3QgY2hhciogbmFtZTsgfTsKKyAgICBleHRlcm4gU2lnbmFsRGVmcyBzaWduYWxEZWZzW107CisgICAgLy8gVGhlcmUgaXMgbm8gMS0xIG1hcHBpbmcgYmV0d2VlbiBzaWduYWxzIGFuZCB3aW5kb3dzIGV4Y2VwdGlvbnMuCisgICAgLy8gV2luZG93cyBjYW4gZWFzaWx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gU08gYW5kIFNpZ1NlZ1YsCisgICAgLy8gYnV0IFNpZ0ludCwgU2lnVGVybSwgZXRjIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LgorICAgIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdID0geworICAgICAgICB7IEVYQ0VQVElPTl9JTExFR0FMX0lOU1RSVUNUSU9OLCAgIlNJR0lMTCAtIElsbGVnYWwgaW5zdHJ1Y3Rpb24gc2lnbmFsIiB9LAorICAgICAgICB7IEVYQ0VQVElPTl9TVEFDS19PVkVSRkxPVywgIlNJR1NFR1YgLSBTdGFjayBvdmVyZmxvdyIgfSwKKyAgICAgICAgeyBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTiwgIlNJR1NFR1YgLSBTZWdtZW50YXRpb24gdmlvbGF0aW9uIHNpZ25hbCIgfSwKKyAgICAgICAgeyBFWENFUFRJT05fSU5UX0RJVklERV9CWV9aRVJPLCAiRGl2aWRlIGJ5IHplcm8gZXJyb3IiIH0sCisgICAgfTsKKworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworCisgICAgICAgIHN0YXRpYyBMT05HIENBTExCQUNLIGhhbmRsZVZlY3RvcmVkRXhjZXB0aW9uKFBFWENFUFRJT05fUE9JTlRFUlMgRXhjZXB0aW9uSW5mbykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmFsRGVmcykgLyBzaXplb2YoU2lnbmFsRGVmcyk7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChFeGNlcHRpb25JbmZvLT5FeGNlcHRpb25SZWNvcmQtPkV4Y2VwdGlvbkNvZGUgPT0gc2lnbmFsRGVmc1tpXS5pZCkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRGYXRhbChzaWduYWxEZWZzW2ldLm5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIGl0cyBub3QgYW4gZXhjZXB0aW9uIHdlIGNhcmUgYWJvdXQsIHBhc3MgaXQgYWxvbmcuCisgICAgICAgICAgICAvLyBUaGlzIHN0b3BzIHVzIGZyb20gZWF0aW5nIGRlYnVnZ2VyIGJyZWFrcyBldGMuCisgICAgICAgICAgICByZXR1cm4gRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSDsKKyAgICAgICAgfQorCisgICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIGlzU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIDMyayBzZWVtcyBlbm91Z2ggZm9yIENhdGNoIHRvIGhhbmRsZSBzdGFjayBvdmVyZmxvdywKKyAgICAgICAgICAgIC8vIGJ1dCB0aGUgdmFsdWUgd2FzIGZvdW5kIGV4cGVyaW1lbnRhbGx5LCBzbyB0aGVyZSBpcyBubyBzdHJvbmcgZ3VhcmFudGVlCisgICAgICAgICAgICBndWFyYW50ZWVTaXplID0gMzIgKiAxMDI0OworICAgICAgICAgICAgZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IENBVENIX05VTEw7CisgICAgICAgICAgICAvLyBSZWdpc3RlciBhcyBmaXJzdCBoYW5kbGVyIGluIGN1cnJlbnQgY2hhaW4KKyAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUgPSBBZGRWZWN0b3JlZEV4Y2VwdGlvbkhhbmRsZXIoMSwgaGFuZGxlVmVjdG9yZWRFeGNlcHRpb24pOworICAgICAgICAgICAgLy8gUGFzcyBpbiBndWFyYW50ZWUgc2l6ZSB0byBiZSBmaWxsZWQKKyAgICAgICAgICAgIFNldFRocmVhZFN0YWNrR3VhcmFudGVlKCZndWFyYW50ZWVTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYgKGlzU2V0KSB7CisgICAgICAgICAgICAgICAgLy8gVW5yZWdpc3RlciBoYW5kbGVyIGFuZCByZXN0b3JlIHRoZSBvbGQgZ3VhcmFudGVlCisgICAgICAgICAgICAgICAgUmVtb3ZlVmVjdG9yZWRFeGNlcHRpb25IYW5kbGVyKGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUpOworICAgICAgICAgICAgICAgIFNldFRocmVhZFN0YWNrR3VhcmFudGVlKCZndWFyYW50ZWVTaXplKTsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25IYW5kbGVySGFuZGxlID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgICAgICBpc1NldCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgfkZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBzdGF0aWMgYm9vbCBpc1NldDsKKyAgICAgICAgc3RhdGljIFVMT05HIGd1YXJhbnRlZVNpemU7CisgICAgICAgIHN0YXRpYyBQVk9JRCBleGNlcHRpb25IYW5kbGVySGFuZGxlOworICAgIH07CisKKyAgICBib29sIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6aXNTZXQgPSBmYWxzZTsKKyAgICBVTE9ORyBGYXRhbENvbmRpdGlvbkhhbmRsZXI6Omd1YXJhbnRlZVNpemUgPSAwOworICAgIFBWT0lEIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6ZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IENBVENIX05VTEw7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyMgIGVuZGlmIC8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSAorCisjZWxzZSAvLyBOb3QgV2luZG93cyAtIGFzc3VtZWQgdG8gYmUgUE9TSVggY29tcGF0aWJsZSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjICBpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUykKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBzdHJ1Y3QgRmF0YWxDb25kaXRpb25IYW5kbGVyIHsKKyAgICAgICAgdm9pZCByZXNldCgpIHt9CisgICAgfTsKK30KKworIyAgZWxzZSAvLyBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUyBpcyBkZWZpbmVkCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTaWduYWxEZWZzIHsKKyAgICAgICAgaW50IGlkOworICAgICAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIH07CisgICAgZXh0ZXJuIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdOworICAgIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdID0geworICAgICAgICAgICAgeyBTSUdJTlQsICAiU0lHSU5UIC0gVGVybWluYWwgaW50ZXJydXB0IHNpZ25hbCIgfSwKKyAgICAgICAgICAgIHsgU0lHSUxMLCAgIlNJR0lMTCAtIElsbGVnYWwgaW5zdHJ1Y3Rpb24gc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdGUEUsICAiU0lHRlBFIC0gRmxvYXRpbmcgcG9pbnQgZXJyb3Igc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdTRUdWLCAiU0lHU0VHViAtIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdURVJNLCAiU0lHVEVSTSAtIFRlcm1pbmF0aW9uIHJlcXVlc3Qgc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdBQlJULCAiU0lHQUJSVCAtIEFib3J0IChhYm5vcm1hbCB0ZXJtaW5hdGlvbikgc2lnbmFsIiB9CisgICAgfTsKKworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworCisgICAgICAgIHN0YXRpYyBib29sIGlzU2V0OworICAgICAgICBzdGF0aWMgc3RydWN0IHNpZ2FjdGlvbiBvbGRTaWdBY3Rpb25zIFtzaXplb2Yoc2lnbmFsRGVmcykvc2l6ZW9mKFNpZ25hbERlZnMpXTsKKyAgICAgICAgc3RhdGljIHN0YWNrX3Qgb2xkU2lnU3RhY2s7CisgICAgICAgIHN0YXRpYyBjaGFyIGFsdFN0YWNrTWVtW1NJR1NUS1NaXTsKKworICAgICAgICBzdGF0aWMgdm9pZCBoYW5kbGVTaWduYWwoIGludCBzaWcgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gIjx1bmtub3duIHNpZ25hbD4iOworICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKSAvIHNpemVvZihTaWduYWxEZWZzKTsgKytpKSB7CisgICAgICAgICAgICAgICAgU2lnbmFsRGVmcyAmZGVmID0gc2lnbmFsRGVmc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoc2lnID09IGRlZi5pZCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gZGVmLm5hbWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICByZXBvcnRGYXRhbChuYW1lKTsKKyAgICAgICAgICAgIHJhaXNlKCBzaWcgKTsKKyAgICAgICAgfQorCisgICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIGlzU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0YWNrX3Qgc2lnU3RhY2s7CisgICAgICAgICAgICBzaWdTdGFjay5zc19zcCA9IGFsdFN0YWNrTWVtOworICAgICAgICAgICAgc2lnU3RhY2suc3Nfc2l6ZSA9IFNJR1NUS1NaOworICAgICAgICAgICAgc2lnU3RhY2suc3NfZmxhZ3MgPSAwOworICAgICAgICAgICAgc2lnYWx0c3RhY2soJnNpZ1N0YWNrLCAmb2xkU2lnU3RhY2spOworICAgICAgICAgICAgc3RydWN0IHNpZ2FjdGlvbiBzYSA9IHsgMCB9OworCisgICAgICAgICAgICBzYS5zYV9oYW5kbGVyID0gaGFuZGxlU2lnbmFsOworICAgICAgICAgICAgc2Euc2FfZmxhZ3MgPSBTQV9PTlNUQUNLOworICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyk7ICsraSkgeworICAgICAgICAgICAgICAgIHNpZ2FjdGlvbihzaWduYWxEZWZzW2ldLmlkLCAmc2EsICZvbGRTaWdBY3Rpb25zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIH5GYXRhbENvbmRpdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYoIGlzU2V0ICkgeworICAgICAgICAgICAgICAgIC8vIFNldCBzaWduYWxzIGJhY2sgdG8gcHJldmlvdXMgdmFsdWVzIC0tIGhvcGVmdWxseSBub2JvZHkgb3Zlcndyb3RlIHRoZW0gaW4gdGhlIG1lYW50aW1lCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnYWN0aW9uKHNpZ25hbERlZnNbaV0uaWQsICZvbGRTaWdBY3Rpb25zW2ldLCBDQVRDSF9OVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBvbGQgc3RhY2sKKyAgICAgICAgICAgICAgICBzaWdhbHRzdGFjaygmb2xkU2lnU3RhY2ssIENBVENIX05VTEwpOworICAgICAgICAgICAgICAgIGlzU2V0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgYm9vbCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmlzU2V0ID0gZmFsc2U7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBGYXRhbENvbmRpdGlvbkhhbmRsZXI6Om9sZFNpZ0FjdGlvbnNbc2l6ZW9mKHNpZ25hbERlZnMpL3NpemVvZihTaWduYWxEZWZzKV0gPSB7fTsKKyAgICBzdGFja190IEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6b2xkU2lnU3RhY2sgPSB7fTsKKyAgICBjaGFyIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6YWx0U3RhY2tNZW1bU0lHU1RLU1pdID0ge307CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyMgIGVuZGlmIC8vIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTCisKKyNlbmRpZiAvLyBub3QgV2luZG93cworCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFN0cmVhbVJlZGlyZWN0IHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgU3RyZWFtUmVkaXJlY3QoIHN0ZDo6b3N0cmVhbSYgc3RyZWFtLCBzdGQ6OnN0cmluZyYgdGFyZ2V0U3RyaW5nICkKKyAgICAgICAgOiAgIG1fc3RyZWFtKCBzdHJlYW0gKSwKKyAgICAgICAgICAgIG1fcHJldkJ1Ziggc3RyZWFtLnJkYnVmKCkgKSwKKyAgICAgICAgICAgIG1fdGFyZ2V0U3RyaW5nKCB0YXJnZXRTdHJpbmcgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJlYW0ucmRidWYoIG1fb3NzLnJkYnVmKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIH5TdHJlYW1SZWRpcmVjdCgpIHsKKyAgICAgICAgICAgIG1fdGFyZ2V0U3RyaW5nICs9IG1fb3NzLnN0cigpOworICAgICAgICAgICAgbV9zdHJlYW0ucmRidWYoIG1fcHJldkJ1ZiApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om9zdHJlYW0mIG1fc3RyZWFtOworICAgICAgICBzdGQ6OnN0cmVhbWJ1ZiogbV9wcmV2QnVmOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbV9vc3M7CisgICAgICAgIHN0ZDo6c3RyaW5nJiBtX3RhcmdldFN0cmluZzsKKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBjbGFzcyBSdW5Db250ZXh0IDogcHVibGljIElSZXN1bHRDYXB0dXJlLCBwdWJsaWMgSVJ1bm5lciB7CisKKyAgICAgICAgUnVuQ29udGV4dCggUnVuQ29udGV4dCBjb25zdCYgKTsKKyAgICAgICAgdm9pZCBvcGVyYXRvciA9KCBSdW5Db250ZXh0IGNvbnN0JiApOworCisgICAgcHVibGljOgorCisgICAgICAgIGV4cGxpY2l0IFJ1bkNvbnRleHQoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgX2NvbmZpZywgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIHJlcG9ydGVyICkKKyAgICAgICAgOiAgIG1fcnVuSW5mbyggX2NvbmZpZy0+bmFtZSgpICksCisgICAgICAgICAgICBtX2NvbnRleHQoIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpICksCisgICAgICAgICAgICBtX2FjdGl2ZVRlc3RDYXNlKCBDQVRDSF9OVUxMICksCisgICAgICAgICAgICBtX2NvbmZpZyggX2NvbmZpZyApLAorICAgICAgICAgICAgbV9yZXBvcnRlciggcmVwb3J0ZXIgKSwKKyAgICAgICAgICAgIG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZCAoIHRydWUgKQorICAgICAgICB7CisgICAgICAgICAgICBtX2NvbnRleHQuc2V0UnVubmVyKCB0aGlzICk7CisgICAgICAgICAgICBtX2NvbnRleHQuc2V0Q29uZmlnKCBtX2NvbmZpZyApOworICAgICAgICAgICAgbV9jb250ZXh0LnNldFJlc3VsdENhcHR1cmUoIHRoaXMgKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RSdW5TdGFydGluZyggbV9ydW5JbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5SdW5Db250ZXh0KCkgeworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMoIG1fcnVuSW5mbywgbV90b3RhbHMsIGFib3J0aW5nKCkgKSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RTcGVjLCBzdGQ6OnNpemVfdCBncm91cEluZGV4LCBzdGQ6OnNpemVfdCBncm91cHNDb3VudCApIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8oIHRlc3RTcGVjLCBncm91cEluZGV4LCBncm91cHNDb3VudCApICk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCB0ZXN0R3JvdXBFbmRlZCggc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RTcGVjLCBUb3RhbHMgY29uc3QmIHRvdGFscywgc3RkOjpzaXplX3QgZ3JvdXBJbmRleCwgc3RkOjpzaXplX3QgZ3JvdXBzQ291bnQgKSB7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMoIEdyb3VwSW5mbyggdGVzdFNwZWMsIGdyb3VwSW5kZXgsIGdyb3Vwc0NvdW50ICksIHRvdGFscywgYWJvcnRpbmcoKSApICk7CisgICAgICAgIH0KKworICAgICAgICBUb3RhbHMgcnVuVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlICkgeworICAgICAgICAgICAgVG90YWxzIHByZXZUb3RhbHMgPSBtX3RvdGFsczsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVkaXJlY3RlZENvdXQ7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyByZWRpcmVjdGVkQ2VycjsKKworICAgICAgICAgICAgVGVzdENhc2VJbmZvIHRlc3RJbmZvID0gdGVzdENhc2UuZ2V0VGVzdENhc2VJbmZvKCk7CisKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RDYXNlU3RhcnRpbmcoIHRlc3RJbmZvICk7CisKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UgPSAmdGVzdENhc2U7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBJVHJhY2tlciYgcm9vdFRyYWNrZXIgPSBtX3RyYWNrZXJDb250ZXh0LnN0YXJ0UnVuKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCByb290VHJhY2tlci5pc1NlY3Rpb25UcmFja2VyKCkgKTsKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTZWN0aW9uVHJhY2tlciY+KCByb290VHJhY2tlciApLmFkZEluaXRpYWxGaWx0ZXJzKCBtX2NvbmZpZy0+Z2V0U2VjdGlvbnNUb1J1bigpICk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBtX3RyYWNrZXJDb250ZXh0LnN0YXJ0Q3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbV90ZXN0Q2FzZVRyYWNrZXIgPSAmU2VjdGlvblRyYWNrZXI6OmFjcXVpcmUoIG1fdHJhY2tlckNvbnRleHQsIFRlc3RDYXNlVHJhY2tpbmc6Ok5hbWVBbmRMb2NhdGlvbiggdGVzdEluZm8ubmFtZSwgdGVzdEluZm8ubGluZUluZm8gKSApOworICAgICAgICAgICAgICAgICAgICBydW5DdXJyZW50VGVzdCggcmVkaXJlY3RlZENvdXQsIHJlZGlyZWN0ZWRDZXJyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlKCAhbV90ZXN0Q2FzZVRyYWNrZXItPmlzU3VjY2Vzc2Z1bGx5Q29tcGxldGVkKCkgJiYgIWFib3J0aW5nKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vICFUQkQ6IGRlcHJlY2F0ZWQgLSB0aGlzIHdpbGwgYmUgcmVwbGFjZWQgYnkgaW5kZXhlZCB0cmFja2VycworICAgICAgICAgICAgd2hpbGUoIGdldEN1cnJlbnRDb250ZXh0KCkuYWR2YW5jZUdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpICYmICFhYm9ydGluZygpICk7CisKKyAgICAgICAgICAgIFRvdGFscyBkZWx0YVRvdGFscyA9IG1fdG90YWxzLmRlbHRhKCBwcmV2VG90YWxzICk7CisgICAgICAgICAgICBpZiggdGVzdEluZm8uZXhwZWN0ZWRUb0ZhaWwoKSAmJiBkZWx0YVRvdGFscy50ZXN0Q2FzZXMucGFzc2VkID4gMCApIHsKKyAgICAgICAgICAgICAgICBkZWx0YVRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5wYXNzZWQtLTsKKyAgICAgICAgICAgICAgICBkZWx0YVRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3RvdGFscy50ZXN0Q2FzZXMgKz0gZGVsdGFUb3RhbHMudGVzdENhc2VzOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyggICB0ZXN0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWRDb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkQ2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRpbmcoKSApICk7CisKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgbV90ZXN0Q2FzZVRyYWNrZXIgPSBDQVRDSF9OVUxMOworCisgICAgICAgICAgICByZXR1cm4gZGVsdGFUb3RhbHM7CisgICAgICAgIH0KKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gY29uZmlnKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY29uZmlnOworICAgICAgICB9CisKKyAgICBwcml2YXRlOiAvLyBJUmVzdWx0Q2FwdHVyZQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKSB7CisgICAgICAgICAgICBpZiggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSA9PSBSZXN1bHRXYXM6Ok9rICkgeworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMucGFzc2VkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCAhcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSBoYXZlIG5vIHVzZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAod2hldGhlciBtZXNzYWdlcyBzaG91bGQgYmUgY2xlYXJlZCksIGJlY2F1c2UgbWVzc2FnZXMgd2VyZSBtYWRlIHNjb3BlZAorICAgICAgICAgICAgLy8gYW5kIHNob3VsZCBiZSBsZXQgdG8gY2xlYXIgdGhlbXNlbHZlcyBvdXQuCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihtX3JlcG9ydGVyLT5hc3NlcnRpb25FbmRlZChBc3NlcnRpb25TdGF0cyhyZXN1bHQsIG1fbWVzc2FnZXMsIG1fdG90YWxzKSkpOworCisgICAgICAgICAgICAvLyBSZXNldCB3b3JraW5nIHN0YXRlCisgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvID0gQXNzZXJ0aW9uSW5mbyggc3RkOjpzdHJpbmcoKSwgbV9sYXN0QXNzZXJ0aW9uSW5mby5saW5lSW5mbywgIntVbmtub3duIGV4cHJlc3Npb24gYWZ0ZXIgdGhlIHJlcG9ydGVkIGxpbmV9IiAsIG1fbGFzdEFzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gKTsKKyAgICAgICAgICAgIG1fbGFzdFJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBzZWN0aW9uU3RhcnRlZCAoCisgICAgICAgICAgICBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8sCisgICAgICAgICAgICBDb3VudHMmIGFzc2VydGlvbnMKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBJVHJhY2tlciYgc2VjdGlvblRyYWNrZXIgPSBTZWN0aW9uVHJhY2tlcjo6YWNxdWlyZSggbV90cmFja2VyQ29udGV4dCwgVGVzdENhc2VUcmFja2luZzo6TmFtZUFuZExvY2F0aW9uKCBzZWN0aW9uSW5mby5uYW1lLCBzZWN0aW9uSW5mby5saW5lSW5mbyApICk7CisgICAgICAgICAgICBpZiggIXNlY3Rpb25UcmFja2VyLmlzT3BlbigpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLnB1c2hfYmFjayggJnNlY3Rpb25UcmFja2VyICk7CisKKyAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8ubGluZUluZm8gPSBzZWN0aW9uSW5mby5saW5lSW5mbzsKKworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvblN0YXJ0aW5nKCBzZWN0aW9uSW5mbyApOworCisgICAgICAgICAgICBhc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9uczsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCB0ZXN0Rm9yTWlzc2luZ0Fzc2VydGlvbnMoIENvdW50cyYgYXNzZXJ0aW9ucyApIHsKKyAgICAgICAgICAgIGlmKCBhc3NlcnRpb25zLnRvdGFsKCkgIT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYoICFtX2NvbmZpZy0+d2FybkFib3V0TWlzc2luZ0Fzc2VydGlvbnMoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYoIG1fdHJhY2tlckNvbnRleHQuY3VycmVudFRyYWNrZXIoKS5oYXNDaGlsZHJlbigpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgYXNzZXJ0aW9ucy5mYWlsZWQrKzsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSB7CisgICAgICAgICAgICBDb3VudHMgYXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnMgLSBlbmRJbmZvLnByZXZBc3NlcnRpb25zOworICAgICAgICAgICAgYm9vbCBtaXNzaW5nQXNzZXJ0aW9ucyA9IHRlc3RGb3JNaXNzaW5nQXNzZXJ0aW9ucyggYXNzZXJ0aW9ucyApOworCisgICAgICAgICAgICBpZiggIW1fYWN0aXZlU2VjdGlvbnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLmJhY2soKS0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzKCBlbmRJbmZvLnNlY3Rpb25JbmZvLCBhc3NlcnRpb25zLCBlbmRJbmZvLmR1cmF0aW9uSW5TZWNvbmRzLCBtaXNzaW5nQXNzZXJ0aW9ucyApICk7CisgICAgICAgICAgICBtX21lc3NhZ2VzLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkRWFybHkoIFNlY3Rpb25FbmRJbmZvIGNvbnN0JiBlbmRJbmZvICkgeworICAgICAgICAgICAgaWYoIG1fdW5maW5pc2hlZFNlY3Rpb25zLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMuYmFjaygpLT5mYWlsKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5iYWNrKCktPmNsb3NlKCk7CisgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLnBvcF9iYWNrKCk7CisKKyAgICAgICAgICAgIG1fdW5maW5pc2hlZFNlY3Rpb25zLnB1c2hfYmFjayggZW5kSW5mbyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHB1c2hTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgICAgIG1fbWVzc2FnZXMucHVzaF9iYWNrKCBtZXNzYWdlICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgcG9wU2NvcGVkTWVzc2FnZSggTWVzc2FnZUluZm8gY29uc3QmIG1lc3NhZ2UgKSB7CisgICAgICAgICAgICBtX21lc3NhZ2VzLmVyYXNlKCBzdGQ6OnJlbW92ZSggbV9tZXNzYWdlcy5iZWdpbigpLCBtX21lc3NhZ2VzLmVuZCgpLCBtZXNzYWdlICksIG1fbWVzc2FnZXMuZW5kKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q3VycmVudFRlc3ROYW1lKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fYWN0aXZlVGVzdENhc2UKKyAgICAgICAgICAgICAgICA/IG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpLm5hbWUKKyAgICAgICAgICAgICAgICA6IHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGNvbnN0IEFzc2VydGlvblJlc3VsdCogZ2V0TGFzdFJlc3VsdCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAmbV9sYXN0UmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGV4Y2VwdGlvbkVhcmx5UmVwb3J0ZWQoKSB7CisgICAgICAgICAgICBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVGYXRhbEVycm9yQ29uZGl0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgICAgIC8vIERvbid0IHJlYnVpbGQgdGhlIHJlc3VsdCAtLSB0aGUgc3RyaW5naWZpY2F0aW9uIGl0c2VsZiBjYW4gY2F1c2UgbW9yZSBmYXRhbCBlcnJvcnMKKyAgICAgICAgICAgIC8vIEluc3RlYWQsIGZha2UgYSByZXN1bHQgZGF0YS4KKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgdGVtcFJlc3VsdDsKKyAgICAgICAgICAgIHRlbXBSZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjsKKyAgICAgICAgICAgIHRlbXBSZXN1bHQubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0KG1fbGFzdEFzc2VydGlvbkluZm8sIHRlbXBSZXN1bHQpOworCisgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuYXNzZXJ0aW9uRW5kZWQocmVzdWx0KTsKKworICAgICAgICAgICAgaGFuZGxlVW5maW5pc2hlZFNlY3Rpb25zKCk7CisKKyAgICAgICAgICAgIC8vIFJlY3JlYXRlIHNlY3Rpb24gZm9yIHRlc3QgY2FzZSAoYXMgd2Ugd2lsbCBsb3NlIHRoZSBvbmUgdGhhdCB3YXMgaW4gc2NvcGUpCisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyA9IG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpOworICAgICAgICAgICAgU2VjdGlvbkluZm8gdGVzdENhc2VTZWN0aW9uKCB0ZXN0Q2FzZUluZm8ubGluZUluZm8sIHRlc3RDYXNlSW5mby5uYW1lLCB0ZXN0Q2FzZUluZm8uZGVzY3JpcHRpb24gKTsKKworICAgICAgICAgICAgQ291bnRzIGFzc2VydGlvbnM7CisgICAgICAgICAgICBhc3NlcnRpb25zLmZhaWxlZCA9IDE7CisgICAgICAgICAgICBTZWN0aW9uU3RhdHMgdGVzdENhc2VTZWN0aW9uU3RhdHMoIHRlc3RDYXNlU2VjdGlvbiwgYXNzZXJ0aW9ucywgMCwgZmFsc2UgKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25FbmRlZCggdGVzdENhc2VTZWN0aW9uU3RhdHMgKTsKKworICAgICAgICAgICAgVGVzdENhc2VJbmZvIHRlc3RJbmZvID0gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCk7CisKKyAgICAgICAgICAgIFRvdGFscyBkZWx0YVRvdGFsczsKKyAgICAgICAgICAgIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5mYWlsZWQgPSAxOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyggICB0ZXN0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlICkgKTsKKyAgICAgICAgICAgIG1fdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQrKzsKKyAgICAgICAgICAgIHRlc3RHcm91cEVuZGVkKCBzdGQ6OnN0cmluZygpLCBtX3RvdGFscywgMSwgMSApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMoIG1fcnVuSW5mbywgbV90b3RhbHMsIGZhbHNlICkgKTsKKyAgICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgICAvLyAhVEJEIFdlIG5lZWQgdG8gZG8gdGhpcyBhbm90aGVyIHdheSEKKyAgICAgICAgYm9vbCBhYm9ydGluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCA9PSBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIG1fY29uZmlnLT5hYm9ydEFmdGVyKCkgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgICB2b2lkIHJ1bkN1cnJlbnRUZXN0KCBzdGQ6OnN0cmluZyYgcmVkaXJlY3RlZENvdXQsIHN0ZDo6c3RyaW5nJiByZWRpcmVjdGVkQ2VyciApIHsKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCk7CisgICAgICAgICAgICBTZWN0aW9uSW5mbyB0ZXN0Q2FzZVNlY3Rpb24oIHRlc3RDYXNlSW5mby5saW5lSW5mbywgdGVzdENhc2VJbmZvLm5hbWUsIHRlc3RDYXNlSW5mby5kZXNjcmlwdGlvbiApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvblN0YXJ0aW5nKCB0ZXN0Q2FzZVNlY3Rpb24gKTsKKyAgICAgICAgICAgIENvdW50cyBwcmV2QXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnM7CisgICAgICAgICAgICBkb3VibGUgZHVyYXRpb24gPSAwOworICAgICAgICAgICAgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mbyA9IEFzc2VydGlvbkluZm8oICJURVNUX0NBU0UiLCB0ZXN0Q2FzZUluZm8ubGluZUluZm8sIHN0ZDo6c3RyaW5nKCksIFJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgKTsKKworICAgICAgICAgICAgICAgIHNlZWRSbmcoICptX2NvbmZpZyApOworCisgICAgICAgICAgICAgICAgVGltZXIgdGltZXI7CisgICAgICAgICAgICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBpZiggbV9yZXBvcnRlci0+Z2V0UHJlZmVyZW5jZXMoKS5zaG91bGRSZWRpcmVjdFN0ZE91dCApIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtUmVkaXJlY3QgY291dFJlZGlyKCBDYXRjaDo6Y291dCgpLCByZWRpcmVjdGVkQ291dCApOworICAgICAgICAgICAgICAgICAgICBTdHJlYW1SZWRpcmVjdCBjZXJyUmVkaXIoIENhdGNoOjpjZXJyKCksIHJlZGlyZWN0ZWRDZXJyICk7CisgICAgICAgICAgICAgICAgICAgIGludm9rZUFjdGl2ZVRlc3RDYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnZva2VBY3RpdmVUZXN0Q2FzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHRpbWVyLmdldEVsYXBzZWRTZWNvbmRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggVGVzdEZhaWx1cmVFeGNlcHRpb24mICkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMganVzdCBtZWFucyB0aGUgdGVzdCB3YXMgYWJvcnRlZCBkdWUgdG8gZmFpbHVyZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goLi4uKSB7CisgICAgICAgICAgICAgICAgLy8gVW5kZXIgQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSwgdW5leHBlY3RlZCBleGNlcHRpb25zIHVuZGVyIFJFUVVJUkUgYXNzZXJ0aW9ucworICAgICAgICAgICAgICAgIC8vIGFyZSByZXBvcnRlZCB3aXRob3V0IHRyYW5zbGF0aW9uIGF0IHRoZSBwb2ludCBvZiBvcmlnaW4uCisgICAgICAgICAgICAgICAgaWYgKG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZCkgeworICAgICAgICAgICAgICAgICAgICBtYWtlVW5leHBlY3RlZFJlc3VsdEJ1aWxkZXIoKS51c2VBY3RpdmVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3Rlc3RDYXNlVHJhY2tlci0+Y2xvc2UoKTsKKyAgICAgICAgICAgIGhhbmRsZVVuZmluaXNoZWRTZWN0aW9ucygpOworICAgICAgICAgICAgbV9tZXNzYWdlcy5jbGVhcigpOworCisgICAgICAgICAgICBDb3VudHMgYXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnMgLSBwcmV2QXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGJvb2wgbWlzc2luZ0Fzc2VydGlvbnMgPSB0ZXN0Rm9yTWlzc2luZ0Fzc2VydGlvbnMoIGFzc2VydGlvbnMgKTsKKworICAgICAgICAgICAgaWYoIHRlc3RDYXNlSW5mby5va1RvRmFpbCgpICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3dhcCggYXNzZXJ0aW9ucy5mYWlsZWRCdXRPaywgYXNzZXJ0aW9ucy5mYWlsZWQgKTsKKyAgICAgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCAtPSBhc3NlcnRpb25zLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKz0gYXNzZXJ0aW9ucy5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VjdGlvblN0YXRzIHRlc3RDYXNlU2VjdGlvblN0YXRzKCB0ZXN0Q2FzZVNlY3Rpb24sIGFzc2VydGlvbnMsIGR1cmF0aW9uLCBtaXNzaW5nQXNzZXJ0aW9ucyApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvbkVuZGVkKCB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBpbnZva2VBY3RpdmVUZXN0Q2FzZSgpIHsKKyAgICAgICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlciBmYXRhbENvbmRpdGlvbkhhbmRsZXI7IC8vIEhhbmRsZSBzaWduYWxzCisgICAgICAgICAgICBtX2FjdGl2ZVRlc3RDYXNlLT5pbnZva2UoKTsKKyAgICAgICAgICAgIGZhdGFsQ29uZGl0aW9uSGFuZGxlci5yZXNldCgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIFJlc3VsdEJ1aWxkZXIgbWFrZVVuZXhwZWN0ZWRSZXN1bHRCdWlsZGVyKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdEJ1aWxkZXIoICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5tYWNyb05hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8ubGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvLmNhcHR1cmVkRXhwcmVzc2lvbi5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBoYW5kbGVVbmZpbmlzaGVkU2VjdGlvbnMoKSB7CisgICAgICAgICAgICAvLyBJZiBzZWN0aW9ucyBlbmRlZCBwcmVtYXR1cmVseSBkdWUgdG8gYW4gZXhjZXB0aW9uIHdlIHN0b3JlZCB0aGVpcgorICAgICAgICAgICAgLy8gaW5mb3MgaGVyZSBzbyB3ZSBjYW4gdGVhciB0aGVtIGRvd24gb3V0c2lkZSB0aGUgdW53aW5kIHByb2Nlc3MuCisgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFNlY3Rpb25FbmRJbmZvPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCA9IG1fdW5maW5pc2hlZFNlY3Rpb25zLnJiZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBtX3VuZmluaXNoZWRTZWN0aW9ucy5yZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICBzZWN0aW9uRW5kZWQoICppdCApOworICAgICAgICAgICAgbV91bmZpbmlzaGVkU2VjdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RSdW5JbmZvIG1fcnVuSW5mbzsKKyAgICAgICAgSU11dGFibGVDb250ZXh0JiBtX2NvbnRleHQ7CisgICAgICAgIFRlc3RDYXNlIGNvbnN0KiBtX2FjdGl2ZVRlc3RDYXNlOworICAgICAgICBJVHJhY2tlciogbV90ZXN0Q2FzZVRyYWNrZXI7CisgICAgICAgIElUcmFja2VyKiBtX2N1cnJlbnRTZWN0aW9uVHJhY2tlcjsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IG1fbGFzdFJlc3VsdDsKKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9jb25maWc7CisgICAgICAgIFRvdGFscyBtX3RvdGFsczsKKyAgICAgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gbV9yZXBvcnRlcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IG1fbWVzc2FnZXM7CisgICAgICAgIEFzc2VydGlvbkluZm8gbV9sYXN0QXNzZXJ0aW9uSW5mbzsKKyAgICAgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbkVuZEluZm8+IG1fdW5maW5pc2hlZFNlY3Rpb25zOworICAgICAgICBzdGQ6OnZlY3RvcjxJVHJhY2tlcio+IG1fYWN0aXZlU2VjdGlvbnM7CisgICAgICAgIFRyYWNrZXJDb250ZXh0IG1fdHJhY2tlckNvbnRleHQ7CisgICAgICAgIGJvb2wgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkOworICAgIH07CisKKyAgICBJUmVzdWx0Q2FwdHVyZSYgZ2V0UmVzdWx0Q2FwdHVyZSgpIHsKKyAgICAgICAgaWYoIElSZXN1bHRDYXB0dXJlKiBjYXB0dXJlID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRSZXN1bHRDYXB0dXJlKCkgKQorICAgICAgICAgICAgcmV0dXJuICpjYXB0dXJlOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiTm8gcmVzdWx0IGNhcHR1cmUgaW5zdGFuY2UiICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3ZlcnNpb24uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVkVSU0lPTl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBWZXJzaW9uaW5nIGluZm9ybWF0aW9uCisgICAgc3RydWN0IFZlcnNpb24geworICAgICAgICBWZXJzaW9uKCAgICB1bnNpZ25lZCBpbnQgX21ham9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9taW5vclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfcGF0Y2hOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBfYnJhbmNoTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9idWlsZE51bWJlciApOworCisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBtYWpvclZlcnNpb247CisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBtaW5vclZlcnNpb247CisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBwYXRjaE51bWJlcjsKKworICAgICAgICAvLyBidWlsZE51bWJlciBpcyBvbmx5IHVzZWQgaWYgYnJhbmNoTmFtZSBpcyBub3QgbnVsbAorICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgYnJhbmNoTmFtZTsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IGJ1aWxkTnVtYmVyOworCisgICAgICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgVmVyc2lvbiBjb25zdCYgdmVyc2lvbiApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oIFZlcnNpb24gY29uc3QmICk7CisgICAgfTsKKworICAgIGlubGluZSBWZXJzaW9uIGxpYnJhcnlWZXJzaW9uKCk7Cit9CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNyZWF0ZVJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgcmVwb3J0ZXJOYW1lLCBQdHI8Q29uZmlnPiBjb25zdCYgY29uZmlnICkgeworICAgICAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXBvcnRlciA9IGdldFJlZ2lzdHJ5SHViKCkuZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpLmNyZWF0ZSggcmVwb3J0ZXJOYW1lLCBjb25maWcuZ2V0KCkgKTsKKyAgICAgICAgaWYoICFyZXBvcnRlciApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgIk5vIHJlcG9ydGVyIHJlZ2lzdGVyZWQgd2l0aCBuYW1lOiAnIiA8PCByZXBvcnRlck5hbWUgPDwgIiciOworICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoIG9zcy5zdHIoKSApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBvcnRlcjsKKyAgICB9CisKKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBtYWtlUmVwb3J0ZXIoIFB0cjxDb25maWc+IGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXBvcnRlcnMgPSBjb25maWctPmdldFJlcG9ydGVyTmFtZXMoKTsKKyAgICAgICAgaWYoIHJlcG9ydGVycy5lbXB0eSgpICkKKyAgICAgICAgICAgIHJlcG9ydGVycy5wdXNoX2JhY2soICJjb25zb2xlIiApOworCisgICAgICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVyOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSByZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICByZXBvcnRlciA9IGFkZFJlcG9ydGVyKCByZXBvcnRlciwgY3JlYXRlUmVwb3J0ZXIoICppdCwgY29uZmlnICkgKTsKKyAgICAgICAgcmV0dXJuIHJlcG9ydGVyOworICAgIH0KKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBhZGRMaXN0ZW5lcnMoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXBvcnRlcnMgKSB7CisgICAgICAgIElSZXBvcnRlclJlZ2lzdHJ5OjpMaXN0ZW5lcnMgbGlzdGVuZXJzID0gZ2V0UmVnaXN0cnlIdWIoKS5nZXRSZXBvcnRlclJlZ2lzdHJ5KCkuZ2V0TGlzdGVuZXJzKCk7CisgICAgICAgIGZvciggSVJlcG9ydGVyUmVnaXN0cnk6Okxpc3RlbmVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBsaXN0ZW5lcnMuYmVnaW4oKSwgaXRFbmQgPSBsaXN0ZW5lcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICByZXBvcnRlcnMgPSBhZGRSZXBvcnRlcihyZXBvcnRlcnMsICgqaXQpLT5jcmVhdGUoIFJlcG9ydGVyQ29uZmlnKCBjb25maWcgKSApICk7CisgICAgICAgIHJldHVybiByZXBvcnRlcnM7CisgICAgfQorCisgICAgVG90YWxzIHJ1blRlc3RzKCBQdHI8Q29uZmlnPiBjb25zdCYgY29uZmlnICkgeworCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBpY29uZmlnID0gY29uZmlnLmdldCgpOworCisgICAgICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVyID0gbWFrZVJlcG9ydGVyKCBjb25maWcgKTsKKyAgICAgICAgcmVwb3J0ZXIgPSBhZGRMaXN0ZW5lcnMoIGljb25maWcsIHJlcG9ydGVyICk7CisKKyAgICAgICAgUnVuQ29udGV4dCBjb250ZXh0KCBpY29uZmlnLCByZXBvcnRlciApOworCisgICAgICAgIFRvdGFscyB0b3RhbHM7CisKKyAgICAgICAgY29udGV4dC50ZXN0R3JvdXBTdGFydGluZyggY29uZmlnLT5uYW1lKCksIDEsIDEgKTsKKworICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYyA9IGNvbmZpZy0+dGVzdFNwZWMoKTsKKyAgICAgICAgaWYoICF0ZXN0U3BlYy5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgdGVzdFNwZWMgPSBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoICJ+Wy5dIiApLnRlc3RTcGVjKCk7IC8vIEFsbCBub3QgaGlkZGVuIHRlc3RzCisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBhbGxUZXN0Q2FzZXMgPSBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoICppY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFsbFRlc3RDYXNlcy5iZWdpbigpLCBpdEVuZCA9IGFsbFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgaWYoICFjb250ZXh0LmFib3J0aW5nKCkgJiYgbWF0Y2hUZXN0KCAqaXQsIHRlc3RTcGVjLCAqaWNvbmZpZyApICkKKyAgICAgICAgICAgICAgICB0b3RhbHMgKz0gY29udGV4dC5ydW5UZXN0KCAqaXQgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXBvcnRlci0+c2tpcFRlc3QoICppdCApOworICAgICAgICB9CisKKyAgICAgICAgY29udGV4dC50ZXN0R3JvdXBFbmRlZCggaWNvbmZpZy0+bmFtZSgpLCB0b3RhbHMsIDEsIDEgKTsKKyAgICAgICAgcmV0dXJuIHRvdGFsczsKKyAgICB9CisKKyAgICB2b2lkIGFwcGx5RmlsZW5hbWVzQXNUYWdzKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgdGVzdHMgPSBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApOworICAgICAgICBmb3Ioc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0ZXN0cy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgIFRlc3RDYXNlJiB0ZXN0ID0gY29uc3RfY2FzdDxUZXN0Q2FzZSY+KCB0ZXN0c1tpXSApOworICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRhZ3MgPSB0ZXN0LnRhZ3M7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gdGVzdC5saW5lSW5mby5maWxlOworICAgICAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0U2xhc2ggPSBmaWxlbmFtZS5maW5kX2xhc3Rfb2YoICJcXC8iICk7CisgICAgICAgICAgICBpZiggbGFzdFNsYXNoICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0ciggbGFzdFNsYXNoKzEgKTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0RG90ID0gZmlsZW5hbWUuZmluZF9sYXN0X29mKCAiLiIgKTsKKyAgICAgICAgICAgIGlmKCBsYXN0RG90ICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0ciggMCwgbGFzdERvdCApOworCisgICAgICAgICAgICB0YWdzLmluc2VydCggIiMiICsgZmlsZW5hbWUgKTsKKyAgICAgICAgICAgIHNldFRhZ3MoIHRlc3QsIHRhZ3MgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFNlc3Npb24gOiBOb25Db3B5YWJsZSB7CisgICAgICAgIHN0YXRpYyBib29sIGFscmVhZHlJbnN0YW50aWF0ZWQ7CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgc3RydWN0IE9uVW51c2VkT3B0aW9ucyB7IGVudW0gRG9XaGF0IHsgSWdub3JlLCBGYWlsIH07IH07CisKKyAgICAgICAgU2Vzc2lvbigpCisgICAgICAgIDogbV9jbGkoIG1ha2VDb21tYW5kTGluZVBhcnNlcigpICkgeworICAgICAgICAgICAgaWYoIGFscmVhZHlJbnN0YW50aWF0ZWQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbXNnID0gIk9ubHkgb25lIGluc3RhbmNlIG9mIENhdGNoOjpTZXNzaW9uIGNhbiBldmVyIGJlIHVzZWQiOworICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkgPDwgbXNnIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCBtc2cgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFscmVhZHlJbnN0YW50aWF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIH5TZXNzaW9uKCkgeworICAgICAgICAgICAgQ2F0Y2g6OmNsZWFuVXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2hvd0hlbHAoIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcm9jZXNzTmFtZSApIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIlxuQ2F0Y2ggdiIgPDwgbGlicmFyeVZlcnNpb24oKSA8PCAiXG4iOworCisgICAgICAgICAgICBtX2NsaS51c2FnZSggQ2F0Y2g6OmNvdXQoKSwgcHJvY2Vzc05hbWUgKTsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkZvciBtb3JlIGRldGFpbCB1c2FnZSBwbGVhc2Ugc2VlIHRoZSBwcm9qZWN0IGRvY3NcbiIgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW50IGFwcGx5Q29tbWFuZExpbmUoIGludCBhcmdjLCBjaGFyIGNvbnN0KiBjb25zdCogY29uc3QgYXJndiwgT25VbnVzZWRPcHRpb25zOjpEb1doYXQgdW51c2VkT3B0aW9uQmVoYXZpb3VyID0gT25VbnVzZWRPcHRpb25zOjpGYWlsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtX2NsaS5zZXRUaHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zKCB1bnVzZWRPcHRpb25CZWhhdmlvdXIgPT0gT25VbnVzZWRPcHRpb25zOjpGYWlsICk7CisgICAgICAgICAgICAgICAgbV91bnVzZWRUb2tlbnMgPSBtX2NsaS5wYXJzZUludG8oIENsYXJhOjphcmdzVG9WZWN0b3IoIGFyZ2MsIGFyZ3YgKSwgbV9jb25maWdEYXRhICk7CisgICAgICAgICAgICAgICAgaWYoIG1fY29uZmlnRGF0YS5zaG93SGVscCApCisgICAgICAgICAgICAgICAgICAgIHNob3dIZWxwKCBtX2NvbmZpZ0RhdGEucHJvY2Vzc05hbWUgKTsKKyAgICAgICAgICAgICAgICBtX2NvbmZpZy5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6ZXhjZXB0aW9uJiBleCApIHsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpSZWQgKTsKKyAgICAgICAgICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuRXJyb3IocykgaW4gaW5wdXQ6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBUZXh0KCBleC53aGF0KCksIFRleHRBdHRyaWJ1dGVzKCkuc2V0SW5kZW50KDIpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcblxuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbV9jbGkudXNhZ2UoIENhdGNoOjpjb3V0KCksIG1fY29uZmlnRGF0YS5wcm9jZXNzTmFtZSApOworICAgICAgICAgICAgICAgIHJldHVybiAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgpKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdXNlQ29uZmlnRGF0YSggQ29uZmlnRGF0YSBjb25zdCYgX2NvbmZpZ0RhdGEgKSB7CisgICAgICAgICAgICBtX2NvbmZpZ0RhdGEgPSBfY29uZmlnRGF0YTsKKyAgICAgICAgICAgIG1fY29uZmlnLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcnVuKCBpbnQgYXJnYywgY2hhciBjb25zdCogY29uc3QqIGNvbnN0IGFyZ3YgKSB7CisKKyAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gYXBwbHlDb21tYW5kTGluZSggYXJnYywgYXJndiApOworICAgICAgICAgICAgaWYoIHJldHVybkNvZGUgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSA9IHJ1bigpOworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKworICAgICNpZiBkZWZpbmVkKFdJTjMyKSAmJiBkZWZpbmVkKFVOSUNPREUpCisgICAgICAgIGludCBydW4oIGludCBhcmdjLCB3Y2hhcl90IGNvbnN0KiBjb25zdCogY29uc3QgYXJndiApIHsKKworICAgICAgICAgICAgY2hhciAqKnV0ZjhBcmd2ID0gbmV3IGNoYXIgKlsgYXJnYyBdOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kgKSB7CisgICAgICAgICAgICAgICAgaW50IGJ1ZlNpemUgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKCBDUF9VVEY4LCAwLCBhcmd2W2ldLCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCApOworCisgICAgICAgICAgICAgICAgdXRmOEFyZ3ZbIGkgXSA9IG5ldyBjaGFyWyBidWZTaXplIF07CisKKyAgICAgICAgICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKCBDUF9VVEY4LCAwLCBhcmd2W2ldLCAtMSwgdXRmOEFyZ3ZbaV0sIGJ1ZlNpemUsIE5VTEwsIE5VTEwgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSBhcHBseUNvbW1hbmRMaW5lKCBhcmdjLCB1dGY4QXJndiApOworICAgICAgICAgICAgaWYoIHJldHVybkNvZGUgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSA9IHJ1bigpOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kgKQorICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSB1dGY4QXJndlsgaSBdOworCisgICAgICAgICAgICBkZWxldGUgW10gdXRmOEFyZ3Y7CisKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5Db2RlOworICAgICAgICB9CisgICAgI2VuZGlmCisKKyAgICAgICAgaW50IHJ1bigpIHsKKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuc2hvd0hlbHAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWcoKTsgLy8gRm9yY2UgY29uZmlnIHRvIGJlIGNvbnN0cnVjdGVkCisKKyAgICAgICAgICAgICAgICBzZWVkUm5nKCAqbV9jb25maWcgKTsKKworICAgICAgICAgICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuZmlsZW5hbWVzQXNUYWdzICkKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlGaWxlbmFtZXNBc1RhZ3MoICptX2NvbmZpZyApOworCisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGxpc3QgcmVxdWVzdAorICAgICAgICAgICAgICAgIGlmKCBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3RlZCA9IGxpc3QoIGNvbmZpZygpICkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PiggKmxpc3RlZCApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oIHJ1blRlc3RzKCBtX2NvbmZpZyApLmFzc2VydGlvbnMuZmFpbGVkICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkgPDwgZXgud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ2xhcmE6OkNvbW1hbmRMaW5lPENvbmZpZ0RhdGE+IGNvbnN0JiBjbGkoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jbGk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8Q2xhcmE6OlBhcnNlcjo6VG9rZW4+IGNvbnN0JiB1bnVzZWRUb2tlbnMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV91bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKyAgICAgICAgQ29uZmlnRGF0YSYgY29uZmlnRGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbmZpZ0RhdGE7CisgICAgICAgIH0KKyAgICAgICAgQ29uZmlnJiBjb25maWcoKSB7CisgICAgICAgICAgICBpZiggIW1fY29uZmlnICkKKyAgICAgICAgICAgICAgICBtX2NvbmZpZyA9IG5ldyBDb25maWcoIG1fY29uZmlnRGF0YSApOworICAgICAgICAgICAgcmV0dXJuICptX2NvbmZpZzsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIENsYXJhOjpDb21tYW5kTGluZTxDb25maWdEYXRhPiBtX2NsaTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q2xhcmE6OlBhcnNlcjo6VG9rZW4+IG1fdW51c2VkVG9rZW5zOworICAgICAgICBDb25maWdEYXRhIG1fY29uZmlnRGF0YTsKKyAgICAgICAgUHRyPENvbmZpZz4gbV9jb25maWc7CisgICAgfTsKKworICAgIGJvb2wgU2Vzc2lvbjo6YWxyZWFkeUluc3RhbnRpYXRlZCA9IGZhbHNlOworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3JlZ2lzdHJ5X2h1Yi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFR0lTVFJZX0hVQl9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3RfY2FzZV9yZWdpc3RyeV9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9DQVNFX1JFR0lTVFJZX0lNUExfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFJhbmRvbU51bWJlckdlbmVyYXRvciB7CisgICAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgcmVzdWx0X3R5cGU7CisKKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSggcmVzdWx0X3R5cGUgbiApIGNvbnN0IHsgcmV0dXJuIHN0ZDo6cmFuZCgpICUgbjsgfQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBtaW4oKSB7IHJldHVybiAwOyB9CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbWF4KCkgeyByZXR1cm4gMTAwMDAwMDsgfQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gc3RkOjpyYW5kKCkgJSBtYXgoKTsgfQorI2VuZGlmCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFY+CisgICAgICAgIHN0YXRpYyB2b2lkIHNodWZmbGUoIFYmIHZlY3RvciApIHsKKyAgICAgICAgICAgIFJhbmRvbU51bWJlckdlbmVyYXRvciBybmc7CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUKKyAgICAgICAgICAgIHN0ZDo6c2h1ZmZsZSggdmVjdG9yLmJlZ2luKCksIHZlY3Rvci5lbmQoKSwgcm5nICk7CisjZWxzZQorICAgICAgICAgICAgc3RkOjpyYW5kb21fc2h1ZmZsZSggdmVjdG9yLmJlZ2luKCksIHZlY3Rvci5lbmQoKSwgcm5nICk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH07CisKKyAgICBpbmxpbmUgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IHNvcnRUZXN0cyggSUNvbmZpZyBjb25zdCYgY29uZmlnLCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHVuc29ydGVkVGVzdENhc2VzICkgeworCisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBzb3J0ZWQgPSB1bnNvcnRlZFRlc3RDYXNlczsKKworICAgICAgICBzd2l0Y2goIGNvbmZpZy5ydW5PcmRlcigpICkgeworICAgICAgICAgICAgY2FzZSBSdW5UZXN0czo6SW5MZXhpY29ncmFwaGljYWxPcmRlcjoKKyAgICAgICAgICAgICAgICBzdGQ6OnNvcnQoIHNvcnRlZC5iZWdpbigpLCBzb3J0ZWQuZW5kKCkgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUnVuVGVzdHM6OkluUmFuZG9tT3JkZXI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZWVkUm5nKCBjb25maWcgKTsKKyAgICAgICAgICAgICAgICAgICAgUmFuZG9tTnVtYmVyR2VuZXJhdG9yOjpzaHVmZmxlKCBzb3J0ZWQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXI6CisgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBpbiBkZWNsYXJhdGlvbiBvcmRlcgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzb3J0ZWQ7CisgICAgfQorICAgIGJvb2wgbWF0Y2hUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICByZXR1cm4gdGVzdFNwZWMubWF0Y2hlcyggdGVzdENhc2UgKSAmJiAoIGNvbmZpZy5hbGxvd1Rocm93cygpIHx8ICF0ZXN0Q2FzZS50aHJvd3MoKSApOworICAgIH0KKworICAgIHZvaWQgZW5mb3JjZU5vRHVwbGljYXRlVGVzdENhc2VzKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGZ1bmN0aW9ucyApIHsKKyAgICAgICAgc3RkOjpzZXQ8VGVzdENhc2U+IHNlZW5GdW5jdGlvbnM7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZ1bmN0aW9ucy5iZWdpbigpLCBpdEVuZCA9IGZ1bmN0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxzdGQ6OnNldDxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yLCBib29sPiBwcmV2ID0gc2VlbkZ1bmN0aW9ucy5pbnNlcnQoICppdCApOworICAgICAgICAgICAgaWYoICFwcmV2LnNlY29uZCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisKKyAgICAgICAgICAgICAgICBzcyAgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApCisgICAgICAgICAgICAgICAgICAgIDw8ICJlcnJvcjogVEVTVF9DQVNFKCBcIiIgPDwgaXQtPm5hbWUgPDwgIlwiICkgYWxyZWFkeSBkZWZpbmVkLlxuIgorICAgICAgICAgICAgICAgICAgICA8PCAiXHRGaXJzdCBzZWVuIGF0ICIgPDwgcHJldi5maXJzdC0+Z2V0VGVzdENhc2VJbmZvKCkubGluZUluZm8gPDwgJ1xuJworICAgICAgICAgICAgICAgICAgICA8PCAiXHRSZWRlZmluZWQgYXQgIiA8PCBpdC0+Z2V0VGVzdENhc2VJbmZvKCkubGluZUluZm8gPDwgc3RkOjplbmRsOworCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHNzLnN0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBmaWx0ZXJUZXN0cyggc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB0ZXN0Q2FzZXMsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gZmlsdGVyZWQ7CisgICAgICAgIGZpbHRlcmVkLnJlc2VydmUoIHRlc3RDYXNlcy5zaXplKCkgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gdGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgaWYoIG1hdGNoVGVzdCggKml0LCB0ZXN0U3BlYywgY29uZmlnICkgKQorICAgICAgICAgICAgICAgIGZpbHRlcmVkLnB1c2hfYmFjayggKml0ICk7CisgICAgICAgIHJldHVybiBmaWx0ZXJlZDsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgcmV0dXJuIGdldFJlZ2lzdHJ5SHViKCkuZ2V0VGVzdENhc2VSZWdpc3RyeSgpLmdldEFsbFRlc3RzU29ydGVkKCBjb25maWcgKTsKKyAgICB9CisKKyAgICBjbGFzcyBUZXN0UmVnaXN0cnkgOiBwdWJsaWMgSVRlc3RDYXNlUmVnaXN0cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGVzdFJlZ2lzdHJ5KCkKKyAgICAgICAgOiAgIG1fY3VycmVudFNvcnRPcmRlciggUnVuVGVzdHM6OkluRGVjbGFyYXRpb25PcmRlciApLAorICAgICAgICAgICAgbV91bm5hbWVkQ291bnQoIDAgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5UZXN0UmVnaXN0cnkoKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gdGVzdENhc2UuZ2V0VGVzdENhc2VJbmZvKCkubmFtZTsKKyAgICAgICAgICAgIGlmKCBuYW1lLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBvc3MgPDwgIkFub255bW91cyB0ZXN0IGNhc2UgIiA8PCArK21fdW5uYW1lZENvdW50OworICAgICAgICAgICAgICAgIHJldHVybiByZWdpc3RlclRlc3QoIHRlc3RDYXNlLndpdGhOYW1lKCBvc3Muc3RyKCkgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9mdW5jdGlvbnMucHVzaF9iYWNrKCB0ZXN0Q2FzZSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fZnVuY3Rpb25zOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0c1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgaWYoIG1fc29ydGVkRnVuY3Rpb25zLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIGVuZm9yY2VOb0R1cGxpY2F0ZVRlc3RDYXNlcyggbV9mdW5jdGlvbnMgKTsKKworICAgICAgICAgICAgaWYoICBtX2N1cnJlbnRTb3J0T3JkZXIgIT0gY29uZmlnLnJ1bk9yZGVyKCkgfHwgbV9zb3J0ZWRGdW5jdGlvbnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX3NvcnRlZEZ1bmN0aW9ucyA9IHNvcnRUZXN0cyggY29uZmlnLCBtX2Z1bmN0aW9ucyApOworICAgICAgICAgICAgICAgIG1fY3VycmVudFNvcnRPcmRlciA9IGNvbmZpZy5ydW5PcmRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1fc29ydGVkRnVuY3Rpb25zOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbV9mdW5jdGlvbnM7CisgICAgICAgIG11dGFibGUgUnVuVGVzdHM6OkluV2hhdE9yZGVyIG1fY3VycmVudFNvcnRPcmRlcjsKKyAgICAgICAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbV9zb3J0ZWRGdW5jdGlvbnM7CisgICAgICAgIHNpemVfdCBtX3VubmFtZWRDb3VudDsKKyAgICAgICAgc3RkOjppb3NfYmFzZTo6SW5pdCBtX29zdHJlYW1Jbml0OyAvLyBGb3JjZXMgY291dC8gY2VyciB0byBiZSBpbml0aWFsaXNlZAorICAgIH07CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGNsYXNzIEZyZWVGdW5jdGlvblRlc3RDYXNlIDogcHVibGljIFNoYXJlZEltcGw8SVRlc3RDYXNlPiB7CisgICAgcHVibGljOgorCisgICAgICAgIEZyZWVGdW5jdGlvblRlc3RDYXNlKCBUZXN0RnVuY3Rpb24gZnVuICkgOiBtX2Z1biggZnVuICkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgaW52b2tlKCkgY29uc3QgeworICAgICAgICAgICAgbV9mdW4oKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB+RnJlZUZ1bmN0aW9uVGVzdENhc2UoKTsKKworICAgICAgICBUZXN0RnVuY3Rpb24gbV9mdW47CisgICAgfTsKKworICAgIGlubGluZSBzdGQ6OnN0cmluZyBleHRyYWN0Q2xhc3NOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWUgKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lOworICAgICAgICBpZiggc3RhcnRzV2l0aCggY2xhc3NOYW1lLCAnJicgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGxhc3RDb2xvbnMgPSBjbGFzc05hbWUucmZpbmQoICI6OiIgKTsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBlbnVsdGltYXRlQ29sb25zID0gY2xhc3NOYW1lLnJmaW5kKCAiOjoiLCBsYXN0Q29sb25zLTEgKTsKKyAgICAgICAgICAgIGlmKCBwZW51bHRpbWF0ZUNvbG9ucyA9PSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcGVudWx0aW1hdGVDb2xvbnMgPSAxOworICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0ciggcGVudWx0aW1hdGVDb2xvbnMsIGxhc3RDb2xvbnMtcGVudWx0aW1hdGVDb2xvbnMgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworICAgIHZvaWQgcmVnaXN0ZXJUZXN0Q2FzZQorICAgICAgICAoICAgSVRlc3RDYXNlKiB0ZXN0Q2FzZSwKKyAgICAgICAgICAgIGNoYXIgY29uc3QqIGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgeworCisgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVGVzdAorICAgICAgICAgICAgKCBtYWtlVGVzdENhc2UKKyAgICAgICAgICAgICAgICAoICAgdGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RDbGFzc05hbWUoIGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lICksCisgICAgICAgICAgICAgICAgICAgIG5hbWVBbmREZXNjLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5hbWVBbmREZXNjLmRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICBsaW5lSW5mbyApICk7CisgICAgfQorICAgIHZvaWQgcmVnaXN0ZXJUZXN0Q2FzZUZ1bmN0aW9uCisgICAgICAgICggICBUZXN0RnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKSB7CisgICAgICAgIHJlZ2lzdGVyVGVzdENhc2UoIG5ldyBGcmVlRnVuY3Rpb25UZXN0Q2FzZSggZnVuY3Rpb24gKSwgIiIsIG5hbWVBbmREZXNjLCBsaW5lSW5mbyApOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQXV0b1JlZzo6QXV0b1JlZworICAgICAgICAoICAgVGVzdEZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjICkgeworICAgICAgICByZWdpc3RlclRlc3RDYXNlRnVuY3Rpb24oIGZ1bmN0aW9uLCBsaW5lSW5mbywgbmFtZUFuZERlc2MgKTsKKyAgICB9CisKKyAgICBBdXRvUmVnOjp+QXV0b1JlZygpIHt9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVwb3J0ZXJfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9SRUdJU1RSWV9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFJlcG9ydGVyUmVnaXN0cnkgOiBwdWJsaWMgSVJlcG9ydGVyUmVnaXN0cnkgeworCisgICAgcHVibGljOgorCisgICAgICAgIHZpcnR1YWwgflJlcG9ydGVyUmVnaXN0cnkoKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIEZhY3RvcnlNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gIG1fZmFjdG9yaWVzLmZpbmQoIG5hbWUgKTsKKyAgICAgICAgICAgIGlmKCBpdCA9PSBtX2ZhY3Rvcmllcy5lbmQoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIENBVENIX05VTEw7CisgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZC0+Y3JlYXRlKCBSZXBvcnRlckNvbmZpZyggY29uZmlnICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVnaXN0ZXJSZXBvcnRlciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApIHsKKyAgICAgICAgICAgIG1fZmFjdG9yaWVzLmluc2VydCggc3RkOjptYWtlX3BhaXIoIG5hbWUsIGZhY3RvcnkgKSApOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lciggUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgeworICAgICAgICAgICAgbV9saXN0ZW5lcnMucHVzaF9iYWNrKCBmYWN0b3J5ICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIEZhY3RvcnlNYXAgY29uc3QmIGdldEZhY3RvcmllcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX2ZhY3RvcmllczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIExpc3RlbmVycyBjb25zdCYgZ2V0TGlzdGVuZXJzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fbGlzdGVuZXJzOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBGYWN0b3J5TWFwIG1fZmFjdG9yaWVzOworICAgICAgICBMaXN0ZW5lcnMgbV9saXN0ZW5lcnM7CisgICAgfTsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2V4Y2VwdGlvbl90cmFuc2xhdG9yX3JlZ2lzdHJ5LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVhDRVBUSU9OX1RSQU5TTEFUT1JfUkVHSVNUUllfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX09CSkNfXworI2ltcG9ydCAiRm91bmRhdGlvbi9Gb3VuZGF0aW9uLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSA6IHB1YmxpYyBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIH5FeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSB7CisgICAgICAgICAgICBkZWxldGVBbGwoIG1fdHJhbnNsYXRvcnMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICkgeworICAgICAgICAgICAgbV90cmFuc2xhdG9ycy5wdXNoX2JhY2soIHRyYW5zbGF0b3IgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgdHJ5IHsKKyNpZmRlZiBfX09CSkNfXworICAgICAgICAgICAgICAgIC8vIEluIE9iamVjdGl2ZS1DIHRyeSBvYmplY3RpdmUtYyBleGNlcHRpb25zIGZpcnN0CisgICAgICAgICAgICAgICAgQHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnlUcmFuc2xhdG9ycygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBAY2F0Y2ggKE5TRXhjZXB0aW9uICpleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENhdGNoOjp0b1N0cmluZyggW2V4Y2VwdGlvbiBkZXNjcmlwdGlvbl0gKTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiB0cnlUcmFuc2xhdG9ycygpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggVGVzdEZhaWx1cmVFeGNlcHRpb24mICkgeworICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6ZXhjZXB0aW9uJiBleCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXgud2hhdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6c3RyaW5nJiBtc2cgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBjb25zdCBjaGFyKiBtc2cgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKC4uLikgeworICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBleGNlcHRpb24iOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgdHJ5VHJhbnNsYXRvcnMoKSBjb25zdCB7CisgICAgICAgICAgICBpZiggbV90cmFuc2xhdG9ycy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbV90cmFuc2xhdG9yc1swXS0+dHJhbnNsYXRlKCBtX3RyYW5zbGF0b3JzLmJlZ2luKCkrMSwgbV90cmFuc2xhdG9ycy5lbmQoKSApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvcio+IG1fdHJhbnNsYXRvcnM7CisgICAgfTsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RhZ19hbGlhc19yZWdpc3RyeS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UQUdfQUxJQVNfUkVHSVNUUllfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGFnQWxpYXNSZWdpc3RyeSA6IHB1YmxpYyBJVGFnQWxpYXNSZWdpc3RyeSB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5UYWdBbGlhc1JlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgT3B0aW9uPFRhZ0FsaWFzPiBmaW5kKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMgKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBleHBhbmRBbGlhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgdW5leHBhbmRlZFRlc3RTcGVjICkgY29uc3Q7CisgICAgICAgIHZvaWQgYWRkKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0FsaWFzPiBtX3JlZ2lzdHJ5OworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKworICAgICAgICBjbGFzcyBSZWdpc3RyeUh1YiA6IHB1YmxpYyBJUmVnaXN0cnlIdWIsIHB1YmxpYyBJTXV0YWJsZVJlZ2lzdHJ5SHViIHsKKworICAgICAgICAgICAgUmVnaXN0cnlIdWIoIFJlZ2lzdHJ5SHViIGNvbnN0JiApOworICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0oIFJlZ2lzdHJ5SHViIGNvbnN0JiApOworCisgICAgICAgIHB1YmxpYzogLy8gSVJlZ2lzdHJ5SHViCisgICAgICAgICAgICBSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSVJlcG9ydGVyUmVnaXN0cnkgY29uc3QmIGdldFJlcG9ydGVyUmVnaXN0cnkoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSVRlc3RDYXNlUmVnaXN0cnkgY29uc3QmIGdldFRlc3RDYXNlUmVnaXN0cnkoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdGVzdENhc2VSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSYgZ2V0RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2V4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldFRhZ0FsaWFzUmVnaXN0cnkoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdGFnQWxpYXNSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwdWJsaWM6IC8vIElNdXRhYmxlUmVnaXN0cnlIdWIKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fcmVwb3J0ZXJSZWdpc3RyeS5yZWdpc3RlclJlcG9ydGVyKCBuYW1lLCBmYWN0b3J5ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lciggUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fcmVwb3J0ZXJSZWdpc3RyeS5yZWdpc3Rlckxpc3RlbmVyKCBmYWN0b3J5ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV90ZXN0Q2FzZVJlZ2lzdHJ5LnJlZ2lzdGVyVGVzdCggdGVzdEluZm8gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fZXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5LnJlZ2lzdGVyVHJhbnNsYXRvciggdHJhbnNsYXRvciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGFnQWxpYXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fdGFnQWxpYXNSZWdpc3RyeS5hZGQoIGFsaWFzLCB0YWcsIGxpbmVJbmZvICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFRlc3RSZWdpc3RyeSBtX3Rlc3RDYXNlUmVnaXN0cnk7CisgICAgICAgICAgICBSZXBvcnRlclJlZ2lzdHJ5IG1fcmVwb3J0ZXJSZWdpc3RyeTsKKyAgICAgICAgICAgIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSBtX2V4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTsKKyAgICAgICAgICAgIFRhZ0FsaWFzUmVnaXN0cnkgbV90YWdBbGlhc1JlZ2lzdHJ5OworICAgICAgICB9OworCisgICAgICAgIC8vIFNpbmdsZSwgZ2xvYmFsLCBpbnN0YW5jZQorICAgICAgICBpbmxpbmUgUmVnaXN0cnlIdWIqJiBnZXRUaGVSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgICAgIHN0YXRpYyBSZWdpc3RyeUh1YiogdGhlUmVnaXN0cnlIdWIgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgaWYoICF0aGVSZWdpc3RyeUh1YiApCisgICAgICAgICAgICAgICAgdGhlUmVnaXN0cnlIdWIgPSBuZXcgUmVnaXN0cnlIdWIoKTsKKyAgICAgICAgICAgIHJldHVybiB0aGVSZWdpc3RyeUh1YjsKKyAgICAgICAgfQorICAgIH0KKworICAgIElSZWdpc3RyeUh1YiYgZ2V0UmVnaXN0cnlIdWIoKSB7CisgICAgICAgIHJldHVybiAqZ2V0VGhlUmVnaXN0cnlIdWIoKTsKKyAgICB9CisgICAgSU11dGFibGVSZWdpc3RyeUh1YiYgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkgeworICAgICAgICByZXR1cm4gKmdldFRoZVJlZ2lzdHJ5SHViKCk7CisgICAgfQorICAgIHZvaWQgY2xlYW5VcCgpIHsKKyAgICAgICAgZGVsZXRlIGdldFRoZVJlZ2lzdHJ5SHViKCk7CisgICAgICAgIGdldFRoZVJlZ2lzdHJ5SHViKCkgPSBDQVRDSF9OVUxMOworICAgICAgICBjbGVhblVwQ29udGV4dCgpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKSB7CisgICAgICAgIHJldHVybiBnZXRSZWdpc3RyeUh1YigpLmdldEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpLnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9ub3RpbXBsZW1lbnRlZF9leGNlcHRpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9OT1RJTVBMRU1FTlRFRF9FWENFUFRJT05fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgTm90SW1wbGVtZW50ZWRFeGNlcHRpb246Ok5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKQorICAgIDogICBtX2xpbmVJbmZvKCBsaW5lSW5mbyApIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgb3NzIDw8IGxpbmVJbmZvIDw8ICI6IGZ1bmN0aW9uICI7CisgICAgICAgIG9zcyA8PCAibm90IGltcGxlbWVudGVkIjsKKyAgICAgICAgbV93aGF0ID0gb3NzLnN0cigpOworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uOjp3aGF0KCkgY29uc3QgQ0FUQ0hfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gbV93aGF0LmNfc3RyKCk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbnRleHRfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTlRFWFRfSU1QTF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3N0cmVhbS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NUUkVBTV9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBXcml0ZXJGLCBzaXplX3QgYnVmZmVyU2l6ZT0yNTY+CisgICAgY2xhc3MgU3RyZWFtQnVmSW1wbCA6IHB1YmxpYyBTdHJlYW1CdWZCYXNlIHsKKyAgICAgICAgY2hhciBkYXRhW2J1ZmZlclNpemVdOworICAgICAgICBXcml0ZXJGIG1fd3JpdGVyOworCisgICAgcHVibGljOgorICAgICAgICBTdHJlYW1CdWZJbXBsKCkgeworICAgICAgICAgICAgc2V0cCggZGF0YSwgZGF0YSArIHNpemVvZihkYXRhKSApOworICAgICAgICB9CisKKyAgICAgICAgflN0cmVhbUJ1ZkltcGwoKSBDQVRDSF9OT0VYQ0VQVCB7CisgICAgICAgICAgICBzeW5jKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGludCBvdmVyZmxvdyggaW50IGMgKSB7CisgICAgICAgICAgICBzeW5jKCk7CisKKyAgICAgICAgICAgIGlmKCBjICE9IEVPRiApIHsKKyAgICAgICAgICAgICAgICBpZiggcGJhc2UoKSA9PSBlcHB0cigpICkKKyAgICAgICAgICAgICAgICAgICAgbV93cml0ZXIoIHN0ZDo6c3RyaW5nKCAxLCBzdGF0aWNfY2FzdDxjaGFyPiggYyApICkgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNwdXRjKCBzdGF0aWNfY2FzdDxjaGFyPiggYyApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzeW5jKCkgeworICAgICAgICAgICAgaWYoIHBiYXNlKCkgIT0gcHB0cigpICkgeworICAgICAgICAgICAgICAgIG1fd3JpdGVyKCBzdGQ6OnN0cmluZyggcGJhc2UoKSwgc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmc6OnNpemVfdHlwZT4oIHBwdHIoKSAtIHBiYXNlKCkgKSApICk7CisgICAgICAgICAgICAgICAgc2V0cCggcGJhc2UoKSwgZXBwdHIoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBGaWxlU3RyZWFtOjpGaWxlU3RyZWFtKCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZW5hbWUgKSB7CisgICAgICAgIG1fb2ZzLm9wZW4oIGZpbGVuYW1lLmNfc3RyKCkgKTsKKyAgICAgICAgaWYoIG1fb2ZzLmZhaWwoKSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgIlVuYWJsZSB0byBvcGVuIGZpbGU6ICciIDw8IGZpbGVuYW1lIDw8ICdcJyc7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6Om9zdHJlYW0mIEZpbGVTdHJlYW06OnN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb2ZzOworICAgIH0KKworICAgIHN0cnVjdCBPdXRwdXREZWJ1Z1dyaXRlciB7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKCBzdGQ6OnN0cmluZyBjb25zdCZzdHIgKSB7CisgICAgICAgICAgICB3cml0ZVRvRGVidWdDb25zb2xlKCBzdHIgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBEZWJ1Z091dFN0cmVhbTo6RGVidWdPdXRTdHJlYW0oKQorICAgIDogICBtX3N0cmVhbUJ1ZiggbmV3IFN0cmVhbUJ1ZkltcGw8T3V0cHV0RGVidWdXcml0ZXI+KCkgKSwKKyAgICAgICAgbV9vcyggbV9zdHJlYW1CdWYuZ2V0KCkgKQorICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIERlYnVnT3V0U3RyZWFtOjpzdHJlYW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX29zOworICAgIH0KKworICAgIC8vIFN0b3JlIHRoZSBzdHJlYW1idWYgZnJvbSBjb3V0IHVwLWZyb250IGJlY2F1c2UKKyAgICAvLyBjb3V0IG1heSBnZXQgcmVkaXJlY3RlZCB3aGVuIHJ1bm5pbmcgdGVzdHMKKyAgICBDb3V0U3RyZWFtOjpDb3V0U3RyZWFtKCkKKyAgICA6ICAgbV9vcyggQ2F0Y2g6OmNvdXQoKS5yZGJ1ZigpICkKKyAgICB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBDb3V0U3RyZWFtOjpzdHJlYW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX29zOworICAgIH0KKworI2lmbmRlZiBDQVRDSF9DT05GSUdfTk9TVERPVVQgLy8gSWYgeW91ICNkZWZpbmUgdGhpcyB5b3UgbXVzdCBpbXBsZW1lbnQgdGhlc2UgZnVuY3Rpb25zCisgICAgc3RkOjpvc3RyZWFtJiBjb3V0KCkgeworICAgICAgICByZXR1cm4gc3RkOjpjb3V0OworICAgIH0KKyAgICBzdGQ6Om9zdHJlYW0mIGNlcnIoKSB7CisgICAgICAgIHJldHVybiBzdGQ6OmNlcnI7CisgICAgfQorI2VuZGlmCit9CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBDb250ZXh0IDogcHVibGljIElNdXRhYmxlQ29udGV4dCB7CisKKyAgICAgICAgQ29udGV4dCgpIDogbV9jb25maWcoIENBVENIX05VTEwgKSwgbV9ydW5uZXIoIENBVENIX05VTEwgKSwgbV9yZXN1bHRDYXB0dXJlKCBDQVRDSF9OVUxMICkge30KKyAgICAgICAgQ29udGV4dCggQ29udGV4dCBjb25zdCYgKTsKKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oIENvbnRleHQgY29uc3QmICk7CisKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkNvbnRleHQoKSB7CisgICAgICAgICAgICBkZWxldGVBbGxWYWx1ZXMoIG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWUgKTsKKyAgICAgICAgfQorCisgICAgcHVibGljOiAvLyBJQ29udGV4dAorICAgICAgICB2aXJ0dWFsIElSZXN1bHRDYXB0dXJlKiBnZXRSZXN1bHRDYXB0dXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1fcmVzdWx0Q2FwdHVyZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIElSdW5uZXIqIGdldFJ1bm5lcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1bm5lcjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRHZW5lcmF0b3JJbmRleCggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzaXplX3QgdG90YWxTaXplICkgeworICAgICAgICAgICAgcmV0dXJuIGdldEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpCisgICAgICAgICAgICAuZ2V0R2VuZXJhdG9ySW5mbyggZmlsZUluZm8sIHRvdGFsU2l6ZSApCisgICAgICAgICAgICAuZ2V0Q3VycmVudEluZGV4KCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGFkdmFuY2VHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKSB7CisgICAgICAgICAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGdlbmVyYXRvcnMgPSBmaW5kR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCk7CisgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdG9ycyAmJiBnZW5lcmF0b3JzLT5tb3ZlTmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBQdHI8SUNvbmZpZyBjb25zdD4gZ2V0Q29uZmlnKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY29uZmlnOworICAgICAgICB9CisKKyAgICBwdWJsaWM6IC8vIElNdXRhYmxlQ29udGV4dAorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmVzdWx0Q2FwdHVyZSggSVJlc3VsdENhcHR1cmUqIHJlc3VsdENhcHR1cmUgKSB7CisgICAgICAgICAgICBtX3Jlc3VsdENhcHR1cmUgPSByZXN1bHRDYXB0dXJlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSdW5uZXIoIElSdW5uZXIqIHJ1bm5lciApIHsKKyAgICAgICAgICAgIG1fcnVubmVyID0gcnVubmVyOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDb25maWcoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnICkgeworICAgICAgICAgICAgbV9jb25maWcgPSBjb25maWc7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgSU11dGFibGVDb250ZXh0JiBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCogZmluZEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRlc3ROYW1lID0gZ2V0UmVzdWx0Q2FwdHVyZSgpLT5nZXRDdXJyZW50VGVzdE5hbWUoKTsKKworICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JzRm9yVGVzdCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICAgbV9nZW5lcmF0b3JzQnlUZXN0TmFtZS5maW5kKCB0ZXN0TmFtZSApOworICAgICAgICAgICAgcmV0dXJuIGl0ICE9IG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWUuZW5kKCkKKyAgICAgICAgICAgICAgICA/IGl0LT5zZWNvbmQKKyAgICAgICAgICAgICAgICA6IENBVENIX05VTEw7CisgICAgICAgIH0KKworICAgICAgICBJR2VuZXJhdG9yc0ZvclRlc3QmIGdldEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpIHsKKyAgICAgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCogZ2VuZXJhdG9ycyA9IGZpbmRHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKTsKKyAgICAgICAgICAgIGlmKCAhZ2VuZXJhdG9ycyApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0ZXN0TmFtZSA9IGdldFJlc3VsdENhcHR1cmUoKS0+Z2V0Q3VycmVudFRlc3ROYW1lKCk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdG9ycyA9IGNyZWF0ZUdlbmVyYXRvcnNGb3JUZXN0KCk7CisgICAgICAgICAgICAgICAgbV9nZW5lcmF0b3JzQnlUZXN0TmFtZS5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCB0ZXN0TmFtZSwgZ2VuZXJhdG9ycyApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKmdlbmVyYXRvcnM7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgSVJ1bm5lciogbV9ydW5uZXI7CisgICAgICAgIElSZXN1bHRDYXB0dXJlKiBtX3Jlc3VsdENhcHR1cmU7CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJR2VuZXJhdG9yc0ZvclRlc3QqPiBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lOworICAgIH07CisKKyAgICBuYW1lc3BhY2UgeworICAgICAgICBDb250ZXh0KiBjdXJyZW50Q29udGV4dCA9IENBVENIX05VTEw7CisgICAgfQorICAgIElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCkgeworICAgICAgICBpZiggIWN1cnJlbnRDb250ZXh0ICkKKyAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gbmV3IENvbnRleHQoKTsKKyAgICAgICAgcmV0dXJuICpjdXJyZW50Q29udGV4dDsKKyAgICB9CisgICAgSUNvbnRleHQmIGdldEN1cnJlbnRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCk7CisgICAgfQorCisgICAgdm9pZCBjbGVhblVwQ29udGV4dCgpIHsKKyAgICAgICAgZGVsZXRlIGN1cnJlbnRDb250ZXh0OworICAgICAgICBjdXJyZW50Q29udGV4dCA9IENBVENIX05VTEw7CisgICAgfQorfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29uc29sZV9jb2xvdXJfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTlNPTEVfQ09MT1VSX0lNUExfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9lcnJub19ndWFyZC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0VSUk5PX0dVQVJEX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y2Vycm5vPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgRXJybm9HdWFyZCB7CisgICAgcHVibGljOgorICAgICAgICBFcnJub0d1YXJkKCk6bV9vbGRFcnJubyhlcnJubyl7fQorICAgICAgICB+RXJybm9HdWFyZCgpIHsgZXJybm8gPSBtX29sZEVycm5vOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50IG1fb2xkRXJybm87CisgICAgfTsKKworfQorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIG5hbWVzcGFjZSB7CisKKyAgICAgICAgc3RydWN0IElDb2xvdXJJbXBsIHsKKyAgICAgICAgICAgIHZpcnR1YWwgfklDb2xvdXJJbXBsKCkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB1c2UoIENvbG91cjo6Q29kZSBfY29sb3VyQ29kZSApID0gMDsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgTm9Db2xvdXJJbXBsIDogSUNvbG91ckltcGwgeworICAgICAgICAgICAgdm9pZCB1c2UoIENvbG91cjo6Q29kZSApIHt9CisKKyAgICAgICAgICAgIHN0YXRpYyBJQ29sb3VySW1wbCogaW5zdGFuY2UoKSB7CisgICAgICAgICAgICAgICAgc3RhdGljIE5vQ29sb3VySW1wbCBzX2luc3RhbmNlOworICAgICAgICAgICAgICAgIHJldHVybiAmc19pbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIH0gLy8gYW5vbiBuYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpZiAhZGVmaW5lZCggQ0FUQ0hfQ09ORklHX0NPTE9VUl9OT05FICkgJiYgIWRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfV0lORE9XUyApICYmICFkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX0FOU0kgKQorIyAgIGlmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKyMgICAgICAgZGVmaW5lIENBVENIX0NPTkZJR19DT0xPVVJfV0lORE9XUworIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIENBVENIX0NPTkZJR19DT0xPVVJfQU5TSQorIyAgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKCBDQVRDSF9DT05GSUdfQ09MT1VSX1dJTkRPV1MgKSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIHsKKworICAgIGNsYXNzIFdpbjMyQ29sb3VySW1wbCA6IHB1YmxpYyBJQ29sb3VySW1wbCB7CisgICAgcHVibGljOgorICAgICAgICBXaW4zMkNvbG91ckltcGwoKSA6IHN0ZG91dEhhbmRsZSggR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGNzYmlJbmZvOworICAgICAgICAgICAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oIHN0ZG91dEhhbmRsZSwgJmNzYmlJbmZvICk7CisgICAgICAgICAgICBvcmlnaW5hbEZvcmVncm91bmRBdHRyaWJ1dGVzID0gY3NiaUluZm8ud0F0dHJpYnV0ZXMgJiB+KCBCQUNLR1JPVU5EX0dSRUVOIHwgQkFDS0dST1VORF9SRUQgfCBCQUNLR1JPVU5EX0JMVUUgfCBCQUNLR1JPVU5EX0lOVEVOU0lUWSApOworICAgICAgICAgICAgb3JpZ2luYWxCYWNrZ3JvdW5kQXR0cmlidXRlcyA9IGNzYmlJbmZvLndBdHRyaWJ1dGVzICYgfiggRk9SRUdST1VORF9HUkVFTiB8IEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9CTFVFIHwgRk9SRUdST1VORF9JTlRFTlNJVFkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB1c2UoIENvbG91cjo6Q29kZSBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgICAgIHN3aXRjaCggX2NvbG91ckNvZGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6Ok5vbmU6ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIG9yaWdpbmFsRm9yZWdyb3VuZEF0dHJpYnV0ZXMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6V2hpdGU6ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9HUkVFTiB8IEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9CTFVFICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlJlZDogICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfUkVEICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZWVuOiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Qmx1ZTogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9CTFVFICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkN5YW46ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfQkxVRSB8IEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6WWVsbG93OiAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0dSRUVOICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZXk6ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIDAgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpMaWdodEdyZXk6ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0UmVkOiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZIHwgRk9SRUdST1VORF9SRUQgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0R3JlZW46ICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZIHwgRk9SRUdST1VORF9HUkVFTiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRXaGl0ZTogICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgfCBGT1JFR1JPVU5EX0dSRUVOIHwgRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0JMVUUgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHQ6IHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJub3QgYSBjb2xvdXIiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgc2V0VGV4dEF0dHJpYnV0ZSggV09SRCBfdGV4dEF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKCBzdGRvdXRIYW5kbGUsIF90ZXh0QXR0cmlidXRlIHwgb3JpZ2luYWxCYWNrZ3JvdW5kQXR0cmlidXRlcyApOworICAgICAgICB9CisgICAgICAgIEhBTkRMRSBzdGRvdXRIYW5kbGU7CisgICAgICAgIFdPUkQgb3JpZ2luYWxGb3JlZ3JvdW5kQXR0cmlidXRlczsKKyAgICAgICAgV09SRCBvcmlnaW5hbEJhY2tncm91bmRBdHRyaWJ1dGVzOworICAgIH07CisKKyAgICBJQ29sb3VySW1wbCogcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpIHsKKyAgICAgICAgc3RhdGljIFdpbjMyQ29sb3VySW1wbCBzX2luc3RhbmNlOworCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25maWcgPSBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpOworICAgICAgICBVc2VDb2xvdXI6Olllc09yTm8gY29sb3VyTW9kZSA9IGNvbmZpZworICAgICAgICAgICAgPyBjb25maWctPnVzZUNvbG91cigpCisgICAgICAgICAgICA6IFVzZUNvbG91cjo6QXV0bzsKKyAgICAgICAgaWYoIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpBdXRvICkKKyAgICAgICAgICAgIGNvbG91ck1vZGUgPSAhaXNEZWJ1Z2dlckFjdGl2ZSgpCisgICAgICAgICAgICAgICAgPyBVc2VDb2xvdXI6OlllcworICAgICAgICAgICAgICAgIDogVXNlQ29sb3VyOjpObzsKKyAgICAgICAgcmV0dXJuIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpZZXMKKyAgICAgICAgICAgID8gJnNfaW5zdGFuY2UKKyAgICAgICAgICAgIDogTm9Db2xvdXJJbXBsOjppbnN0YW5jZSgpOworICAgIH0KKworfSAvLyBlbmQgYW5vbiBuYW1lc3BhY2UKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZWxpZiBkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX0FOU0kgKSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgeworCisgICAgLy8gdXNlIFBPU0lYLyBBTlNJIGNvbnNvbGUgdGVybWluYWwgY29kZXMKKyAgICAvLyBUaGFua3MgdG8gQWRhbSBTdHJ6ZWxlY2tpIGZvciBvcmlnaW5hbCBjb250cmlidXRpb24KKyAgICAvLyAoaHR0cDovL2dpdGh1Yi5jb20vbmFub2FudCkKKyAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcGhpbHNxdWFyZWQvQ2F0Y2gvcHVsbC8xMzEKKyAgICBjbGFzcyBQb3NpeENvbG91ckltcGwgOiBwdWJsaWMgSUNvbG91ckltcGwgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB2b2lkIHVzZSggQ29sb3VyOjpDb2RlIF9jb2xvdXJDb2RlICkgeworICAgICAgICAgICAgc3dpdGNoKCBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Tm9uZToKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6V2hpdGU6ICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzBtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpSZWQ6ICAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszMW0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZWVuOiAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzMybSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Qmx1ZTogICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzRtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpDeWFuOiAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszNm0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlllbGxvdzogICAgcmV0dXJuIHNldENvbG91ciggIlswOzMzbSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JleTogICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzE7MzBtIiApOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkxpZ2h0R3JleTogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszN20iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFJlZDogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszMW0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodEdyZWVuOiAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszMm0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFdoaXRlOiAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszN20iICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0OiB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAibm90IGEgY29sb3VyIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXRpYyBJQ29sb3VySW1wbCogaW5zdGFuY2UoKSB7CisgICAgICAgICAgICBzdGF0aWMgUG9zaXhDb2xvdXJJbXBsIHNfaW5zdGFuY2U7CisgICAgICAgICAgICByZXR1cm4gJnNfaW5zdGFuY2U7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgc2V0Q29sb3VyKCBjb25zdCBjaGFyKiBfZXNjYXBlQ29kZSApIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgJ1wwMzMnIDw8IF9lc2NhcGVDb2RlOworICAgICAgICB9CisgICAgfTsKKworICAgIElDb2xvdXJJbXBsKiBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCkgeworICAgICAgICBFcnJub0d1YXJkIGd1YXJkOworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gY29uZmlnID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKTsKKyAgICAgICAgVXNlQ29sb3VyOjpZZXNPck5vIGNvbG91ck1vZGUgPSBjb25maWcKKyAgICAgICAgICAgID8gY29uZmlnLT51c2VDb2xvdXIoKQorICAgICAgICAgICAgOiBVc2VDb2xvdXI6OkF1dG87CisgICAgICAgIGlmKCBjb2xvdXJNb2RlID09IFVzZUNvbG91cjo6QXV0byApCisgICAgICAgICAgICBjb2xvdXJNb2RlID0gKCFpc0RlYnVnZ2VyQWN0aXZlKCkgJiYgaXNhdHR5KFNURE9VVF9GSUxFTk8pICkKKyAgICAgICAgICAgICAgICA/IFVzZUNvbG91cjo6WWVzCisgICAgICAgICAgICAgICAgOiBVc2VDb2xvdXI6Ok5vOworICAgICAgICByZXR1cm4gY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OlllcworICAgICAgICAgICAgPyBQb3NpeENvbG91ckltcGw6Omluc3RhbmNlKCkKKyAgICAgICAgICAgIDogTm9Db2xvdXJJbXBsOjppbnN0YW5jZSgpOworICAgIH0KKworfSAvLyBlbmQgYW5vbiBuYW1lc3BhY2UKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZWxzZSAgLy8gbm90IFdpbmRvd3Mgb3IgQU5TSSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RhdGljIElDb2xvdXJJbXBsKiBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCkgeyByZXR1cm4gTm9Db2xvdXJJbXBsOjppbnN0YW5jZSgpOyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZW5kaWYgLy8gV2luZG93cy8gQU5TSS8gTm9uZQorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgQ29sb3VyOjpDb2xvdXIoIENvZGUgX2NvbG91ckNvZGUgKSA6IG1fbW92ZWQoIGZhbHNlICkgeyB1c2UoIF9jb2xvdXJDb2RlICk7IH0KKyAgICBDb2xvdXI6OkNvbG91ciggQ29sb3VyIGNvbnN0JiBfb3RoZXIgKSA6IG1fbW92ZWQoIGZhbHNlICkgeyBjb25zdF9jYXN0PENvbG91ciY+KCBfb3RoZXIgKS5tX21vdmVkID0gdHJ1ZTsgfQorICAgIENvbG91cjo6fkNvbG91cigpeyBpZiggIW1fbW92ZWQgKSB1c2UoIE5vbmUgKTsgfQorCisgICAgdm9pZCBDb2xvdXI6OnVzZSggQ29kZSBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgc3RhdGljIElDb2xvdXJJbXBsKiBpbXBsID0gcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpOworICAgICAgICBpbXBsLT51c2UoIF9jb2xvdXJDb2RlICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2dlbmVyYXRvcnNfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0dFTkVSQVRPUlNfSU1QTF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IEdlbmVyYXRvckluZm8gOiBJR2VuZXJhdG9ySW5mbyB7CisKKyAgICAgICAgR2VuZXJhdG9ySW5mbyggc3RkOjpzaXplX3Qgc2l6ZSApCisgICAgICAgIDogICBtX3NpemUoIHNpemUgKSwKKyAgICAgICAgICAgIG1fY3VycmVudEluZGV4KCAwICkKKyAgICAgICAge30KKworICAgICAgICBib29sIG1vdmVOZXh0KCkgeworICAgICAgICAgICAgaWYoICsrbV9jdXJyZW50SW5kZXggPT0gbV9zaXplICkgeworICAgICAgICAgICAgICAgIG1fY3VycmVudEluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IGdldEN1cnJlbnRJbmRleCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2N1cnJlbnRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IG1fc2l6ZTsKKyAgICAgICAgc3RkOjpzaXplX3QgbV9jdXJyZW50SW5kZXg7CisgICAgfTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgY2xhc3MgR2VuZXJhdG9yc0ZvclRlc3QgOiBwdWJsaWMgSUdlbmVyYXRvcnNGb3JUZXN0IHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgfkdlbmVyYXRvcnNGb3JUZXN0KCkgeworICAgICAgICAgICAgZGVsZXRlQWxsKCBtX2dlbmVyYXRvcnNJbk9yZGVyICk7CisgICAgICAgIH0KKworICAgICAgICBJR2VuZXJhdG9ySW5mbyYgZ2V0R2VuZXJhdG9ySW5mbyggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzdGQ6OnNpemVfdCBzaXplICkgeworICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9nZW5lcmF0b3JzQnlOYW1lLmZpbmQoIGZpbGVJbmZvICk7CisgICAgICAgICAgICBpZiggaXQgPT0gbV9nZW5lcmF0b3JzQnlOYW1lLmVuZCgpICkgeworICAgICAgICAgICAgICAgIElHZW5lcmF0b3JJbmZvKiBpbmZvID0gbmV3IEdlbmVyYXRvckluZm8oIHNpemUgKTsKKyAgICAgICAgICAgICAgICBtX2dlbmVyYXRvcnNCeU5hbWUuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggZmlsZUluZm8sIGluZm8gKSApOworICAgICAgICAgICAgICAgIG1fZ2VuZXJhdG9yc0luT3JkZXIucHVzaF9iYWNrKCBpbmZvICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICppbmZvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICppdC0+c2Vjb25kOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBtb3ZlTmV4dCgpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPElHZW5lcmF0b3JJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9nZW5lcmF0b3JzSW5PcmRlci5iZWdpbigpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SUdlbmVyYXRvckluZm8qPjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtX2dlbmVyYXRvcnNJbk9yZGVyLmVuZCgpOworICAgICAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoICgqaXQpLT5tb3ZlTmV4dCgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJR2VuZXJhdG9ySW5mbyo+IG1fZ2VuZXJhdG9yc0J5TmFtZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8SUdlbmVyYXRvckluZm8qPiBtX2dlbmVyYXRvcnNJbk9yZGVyOworICAgIH07CisKKyAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGNyZWF0ZUdlbmVyYXRvcnNGb3JUZXN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgR2VuZXJhdG9yc0ZvclRlc3QoKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfYXNzZXJ0aW9ucmVzdWx0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQVNTRVJUSU9OUkVTVUxUX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgQXNzZXJ0aW9uSW5mbzo6QXNzZXJ0aW9uSW5mbyggICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NhcHR1cmVkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBfcmVzdWx0RGlzcG9zaXRpb24gKQorICAgIDogICBtYWNyb05hbWUoIF9tYWNyb05hbWUgKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApLAorICAgICAgICBjYXB0dXJlZEV4cHJlc3Npb24oIF9jYXB0dXJlZEV4cHJlc3Npb24gKSwKKyAgICAgICAgcmVzdWx0RGlzcG9zaXRpb24oIF9yZXN1bHREaXNwb3NpdGlvbiApCisgICAge30KKworICAgIEFzc2VydGlvblJlc3VsdDo6QXNzZXJ0aW9uUmVzdWx0KCkge30KKworICAgIEFzc2VydGlvblJlc3VsdDo6QXNzZXJ0aW9uUmVzdWx0KCBBc3NlcnRpb25JbmZvIGNvbnN0JiBpbmZvLCBBc3NlcnRpb25SZXN1bHREYXRhIGNvbnN0JiBkYXRhICkKKyAgICA6ICAgbV9pbmZvKCBpbmZvICksCisgICAgICAgIG1fcmVzdWx0RGF0YSggZGF0YSApCisgICAge30KKworICAgIEFzc2VydGlvblJlc3VsdDo6fkFzc2VydGlvblJlc3VsdCgpIHt9CisKKyAgICAvLyBSZXN1bHQgd2FzIGEgc3VjY2VzcworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpzdWNjZWVkZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDYXRjaDo6aXNPayggbV9yZXN1bHREYXRhLnJlc3VsdFR5cGUgKTsKKyAgICB9CisKKyAgICAvLyBSZXN1bHQgd2FzIGEgc3VjY2Vzcywgb3IgZmFpbHVyZSBpcyBzdXBwcmVzc2VkCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6OmlzT2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDYXRjaDo6aXNPayggbV9yZXN1bHREYXRhLnJlc3VsdFR5cGUgKSB8fCBzaG91bGRTdXBwcmVzc0ZhaWx1cmUoIG1faW5mby5yZXN1bHREaXNwb3NpdGlvbiApOworICAgIH0KKworICAgIFJlc3VsdFdhczo6T2ZUeXBlIEFzc2VydGlvblJlc3VsdDo6Z2V0UmVzdWx0VHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcmVzdWx0RGF0YS5yZXN1bHRUeXBlOworICAgIH0KKworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpoYXNFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gIW1faW5mby5jYXB0dXJlZEV4cHJlc3Npb24uZW1wdHkoKTsKKyAgICB9CisKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6aGFzTWVzc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFtX3Jlc3VsdERhdGEubWVzc2FnZS5lbXB0eSgpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0RXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgaWYoIGlzRmFsc2VUZXN0KCBtX2luZm8ucmVzdWx0RGlzcG9zaXRpb24gKSApCisgICAgICAgICAgICByZXR1cm4gJyEnICsgbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0RXhwcmVzc2lvbkluTWFjcm8oKSBjb25zdCB7CisgICAgICAgIGlmKCBtX2luZm8ubWFjcm9OYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgcmV0dXJuIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBtX2luZm8ubWFjcm9OYW1lICsgIiggIiArIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb24gKyAiICkiOworICAgIH0KKworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpoYXNFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBoYXNFeHByZXNzaW9uKCkgJiYgZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgIT0gZ2V0RXhwcmVzc2lvbigpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9yZXN1bHREYXRhLnJlY29uc3RydWN0RXhwcmVzc2lvbigpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0TWVzc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcmVzdWx0RGF0YS5tZXNzYWdlOworICAgIH0KKyAgICBTb3VyY2VMaW5lSW5mbyBBc3NlcnRpb25SZXN1bHQ6OmdldFNvdXJjZUluZm8oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2luZm8ubGluZUluZm87CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRUZXN0TWFjcm9OYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9pbmZvLm1hY3JvTmFtZTsKKyAgICB9CisKKyAgICB2b2lkIEFzc2VydGlvblJlc3VsdDo6ZGlzY2FyZERlY29tcG9zZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICBtX3Jlc3VsdERhdGEuZGVjb21wb3NlZEV4cHJlc3Npb24gPSBDQVRDSF9OVUxMOworICAgIH0KKworICAgIHZvaWQgQXNzZXJ0aW9uUmVzdWx0OjpleHBhbmREZWNvbXBvc2VkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgbV9yZXN1bHREYXRhLnJlY29uc3RydWN0RXhwcmVzc2lvbigpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X2Nhc2VfaW5mby5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfQ0FTRV9JTkZPX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y2N0eXBlPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgaW5saW5lIFRlc3RDYXNlSW5mbzo6U3BlY2lhbFByb3BlcnRpZXMgcGFyc2VTcGVjaWFsVGFnKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnICkgeworICAgICAgICBpZiggc3RhcnRzV2l0aCggdGFnLCAnLicgKSB8fAorICAgICAgICAgICAgdGFnID09ICJoaWRlIiB8fAorICAgICAgICAgICAgdGFnID09ICIhaGlkZSIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6SXNIaWRkZW47CisgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIXRocm93cyIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6VGhyb3dzOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFzaG91bGRmYWlsIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpTaG91bGRGYWlsOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFtYXlmYWlsIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpNYXlGYWlsOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFub25wb3J0YWJsZSIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6Tm9uUG9ydGFibGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86Ok5vbmU7CisgICAgfQorICAgIGlubGluZSBib29sIGlzUmVzZXJ2ZWRUYWcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcgKSB7CisgICAgICAgIHJldHVybiBwYXJzZVNwZWNpYWxUYWcoIHRhZyApID09IFRlc3RDYXNlSW5mbzo6Tm9uZSAmJiB0YWcuc2l6ZSgpID4gMCAmJiAhc3RkOjppc2FsbnVtKCB0YWdbMF0gKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgZW5mb3JjZU5vdFJlc2VydmVkVGFnKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICkgeworICAgICAgICBpZiggaXNSZXNlcnZlZFRhZyggdGFnICkgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCBDb2xvdXIoQ29sb3VyOjpSZWQpCisgICAgICAgICAgICAgICA8PCAiVGFnIG5hbWUgWyIgPDwgdGFnIDw8ICJdIG5vdCBhbGxvd2VkLlxuIgorICAgICAgICAgICAgICAgPDwgIlRhZyBuYW1lcyBzdGFydGluZyB3aXRoIG5vbiBhbHBoYS1udW1lcmljIGNoYXJhY3RlcnMgYXJlIHJlc2VydmVkXG4iCisgICAgICAgICAgICAgICA8PCBDb2xvdXIoQ29sb3VyOjpGaWxlTmFtZSkKKyAgICAgICAgICAgICAgIDw8IF9saW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHNzLnN0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRlc3RDYXNlIG1ha2VUZXN0Q2FzZSggIElUZXN0Q2FzZSogX3Rlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NPclRhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbyApCisgICAgeworICAgICAgICBib29sIGlzSGlkZGVuKCBzdGFydHNXaXRoKCBfbmFtZSwgIi4vIiApICk7IC8vIExlZ2FjeSBzdXBwb3J0CisKKyAgICAgICAgLy8gUGFyc2Ugb3V0IHRhZ3MKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRhZ3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2MsIHRhZzsKKyAgICAgICAgYm9vbCBpblRhZyA9IGZhbHNlOworICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgX2Rlc2NPclRhZ3Muc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBfZGVzY09yVGFnc1tpXTsKKyAgICAgICAgICAgIGlmKCAhaW5UYWcgKSB7CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJ1snICkKKyAgICAgICAgICAgICAgICAgICAgaW5UYWcgPSB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGVzYyArPSBjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJ10nICkgeworICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZUluZm86OlNwZWNpYWxQcm9wZXJ0aWVzIHByb3AgPSBwYXJzZVNwZWNpYWxUYWcoIHRhZyApOworICAgICAgICAgICAgICAgICAgICBpZiggcHJvcCA9PSBUZXN0Q2FzZUluZm86OklzSGlkZGVuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcHJvcCA9PSBUZXN0Q2FzZUluZm86Ok5vbmUgKQorICAgICAgICAgICAgICAgICAgICAgICAgZW5mb3JjZU5vdFJlc2VydmVkVGFnKCB0YWcsIF9saW5lSW5mbyApOworCisgICAgICAgICAgICAgICAgICAgIHRhZ3MuaW5zZXJ0KCB0YWcgKTsKKyAgICAgICAgICAgICAgICAgICAgdGFnLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGluVGFnID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGFnICs9IGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoIGlzSGlkZGVuICkgeworICAgICAgICAgICAgdGFncy5pbnNlcnQoICJoaWRlIiApOworICAgICAgICAgICAgdGFncy5pbnNlcnQoICIuIiApOworICAgICAgICB9CisKKyAgICAgICAgVGVzdENhc2VJbmZvIGluZm8oIF9uYW1lLCBfY2xhc3NOYW1lLCBkZXNjLCB0YWdzLCBfbGluZUluZm8gKTsKKyAgICAgICAgcmV0dXJuIFRlc3RDYXNlKCBfdGVzdENhc2UsIGluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFRhZ3MoIFRlc3RDYXNlSW5mbyYgdGVzdENhc2VJbmZvLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29uc3QmIHRhZ3MgKQorICAgIHsKKyAgICAgICAgdGVzdENhc2VJbmZvLnRhZ3MgPSB0YWdzOworICAgICAgICB0ZXN0Q2FzZUluZm8ubGNhc2VUYWdzLmNsZWFyKCk7CisKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgZm9yKCBzdGQ6OnNldDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGFncy5iZWdpbigpLCBpdEVuZCA9IHRhZ3MuZW5kKCk7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgb3NzIDw8ICdbJyA8PCAqaXQgPDwgJ10nOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGNhc2VUYWcgPSB0b0xvd2VyKCAqaXQgKTsKKyAgICAgICAgICAgIHRlc3RDYXNlSW5mby5wcm9wZXJ0aWVzID0gc3RhdGljX2Nhc3Q8VGVzdENhc2VJbmZvOjpTcGVjaWFsUHJvcGVydGllcz4oIHRlc3RDYXNlSW5mby5wcm9wZXJ0aWVzIHwgcGFyc2VTcGVjaWFsVGFnKCBsY2FzZVRhZyApICk7CisgICAgICAgICAgICB0ZXN0Q2FzZUluZm8ubGNhc2VUYWdzLmluc2VydCggbGNhc2VUYWcgKTsKKyAgICAgICAgfQorICAgICAgICB0ZXN0Q2FzZUluZm8udGFnc0FzU3RyaW5nID0gb3NzLnN0cigpOworICAgIH0KKworICAgIFRlc3RDYXNlSW5mbzo6VGVzdENhc2VJbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29uc3QmIF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICkKKyAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgY2xhc3NOYW1lKCBfY2xhc3NOYW1lICksCisgICAgICAgIGRlc2NyaXB0aW9uKCBfZGVzY3JpcHRpb24gKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApLAorICAgICAgICBwcm9wZXJ0aWVzKCBOb25lICkKKyAgICB7CisgICAgICAgIHNldFRhZ3MoICp0aGlzLCBfdGFncyApOworICAgIH0KKworICAgIFRlc3RDYXNlSW5mbzo6VGVzdENhc2VJbmZvKCBUZXN0Q2FzZUluZm8gY29uc3QmIG90aGVyICkKKyAgICA6ICAgbmFtZSggb3RoZXIubmFtZSApLAorICAgICAgICBjbGFzc05hbWUoIG90aGVyLmNsYXNzTmFtZSApLAorICAgICAgICBkZXNjcmlwdGlvbiggb3RoZXIuZGVzY3JpcHRpb24gKSwKKyAgICAgICAgdGFncyggb3RoZXIudGFncyApLAorICAgICAgICBsY2FzZVRhZ3MoIG90aGVyLmxjYXNlVGFncyApLAorICAgICAgICB0YWdzQXNTdHJpbmcoIG90aGVyLnRhZ3NBc1N0cmluZyApLAorICAgICAgICBsaW5lSW5mbyggb3RoZXIubGluZUluZm8gKSwKKyAgICAgICAgcHJvcGVydGllcyggb3RoZXIucHJvcGVydGllcyApCisgICAge30KKworICAgIGJvb2wgVGVzdENhc2VJbmZvOjppc0hpZGRlbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIElzSGlkZGVuICkgIT0gMDsKKyAgICB9CisgICAgYm9vbCBUZXN0Q2FzZUluZm86OnRocm93cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIFRocm93cyApICE9IDA7CisgICAgfQorICAgIGJvb2wgVGVzdENhc2VJbmZvOjpva1RvRmFpbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIChTaG91bGRGYWlsIHwgTWF5RmFpbCApICkgIT0gMDsKKyAgICB9CisgICAgYm9vbCBUZXN0Q2FzZUluZm86OmV4cGVjdGVkVG9GYWlsKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgKFNob3VsZEZhaWwgKSApICE9IDA7CisgICAgfQorCisgICAgVGVzdENhc2U6OlRlc3RDYXNlKCBJVGVzdENhc2UqIHRlc3RDYXNlLCBUZXN0Q2FzZUluZm8gY29uc3QmIGluZm8gKSA6IFRlc3RDYXNlSW5mbyggaW5mbyApLCB0ZXN0KCB0ZXN0Q2FzZSApIHt9CisKKyAgICBUZXN0Q2FzZTo6VGVzdENhc2UoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApCisgICAgOiAgIFRlc3RDYXNlSW5mbyggb3RoZXIgKSwKKyAgICAgICAgdGVzdCggb3RoZXIudGVzdCApCisgICAge30KKworICAgIFRlc3RDYXNlIFRlc3RDYXNlOjp3aXRoTmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIF9uZXdOYW1lICkgY29uc3QgeworICAgICAgICBUZXN0Q2FzZSBvdGhlciggKnRoaXMgKTsKKyAgICAgICAgb3RoZXIubmFtZSA9IF9uZXdOYW1lOworICAgICAgICByZXR1cm4gb3RoZXI7CisgICAgfQorCisgICAgdm9pZCBUZXN0Q2FzZTo6c3dhcCggVGVzdENhc2UmIG90aGVyICkgeworICAgICAgICB0ZXN0LnN3YXAoIG90aGVyLnRlc3QgKTsKKyAgICAgICAgbmFtZS5zd2FwKCBvdGhlci5uYW1lICk7CisgICAgICAgIGNsYXNzTmFtZS5zd2FwKCBvdGhlci5jbGFzc05hbWUgKTsKKyAgICAgICAgZGVzY3JpcHRpb24uc3dhcCggb3RoZXIuZGVzY3JpcHRpb24gKTsKKyAgICAgICAgdGFncy5zd2FwKCBvdGhlci50YWdzICk7CisgICAgICAgIGxjYXNlVGFncy5zd2FwKCBvdGhlci5sY2FzZVRhZ3MgKTsKKyAgICAgICAgdGFnc0FzU3RyaW5nLnN3YXAoIG90aGVyLnRhZ3NBc1N0cmluZyApOworICAgICAgICBzdGQ6OnN3YXAoIFRlc3RDYXNlSW5mbzo6cHJvcGVydGllcywgc3RhdGljX2Nhc3Q8VGVzdENhc2VJbmZvJj4oIG90aGVyICkucHJvcGVydGllcyApOworICAgICAgICBzdGQ6OnN3YXAoIGxpbmVJbmZvLCBvdGhlci5saW5lSW5mbyApOworICAgIH0KKworICAgIHZvaWQgVGVzdENhc2U6Omludm9rZSgpIGNvbnN0IHsKKyAgICAgICAgdGVzdC0+aW52b2tlKCk7CisgICAgfQorCisgICAgYm9vbCBUZXN0Q2FzZTo6b3BlcmF0b3IgPT0gKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiAgdGVzdC5nZXQoKSA9PSBvdGhlci50ZXN0LmdldCgpICYmCisgICAgICAgICAgICAgICAgbmFtZSA9PSBvdGhlci5uYW1lICYmCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lID09IG90aGVyLmNsYXNzTmFtZTsKKyAgICB9CisKKyAgICBib29sIFRlc3RDYXNlOjpvcGVyYXRvciA8ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICByZXR1cm4gbmFtZSA8IG90aGVyLm5hbWU7CisgICAgfQorICAgIFRlc3RDYXNlJiBUZXN0Q2FzZTo6b3BlcmF0b3IgPSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgVGVzdENhc2UgdGVtcCggb3RoZXIgKTsKKyAgICAgICAgc3dhcCggdGVtcCApOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVGVzdENhc2VJbmZvIGNvbnN0JiBUZXN0Q2FzZTo6Z2V0VGVzdENhc2VJbmZvKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdmVyc2lvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1ZFUlNJT05fSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBWZXJzaW9uOjpWZXJzaW9uCisgICAgICAgICggICB1bnNpZ25lZCBpbnQgX21ham9yVmVyc2lvbiwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfbWlub3JWZXJzaW9uLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9wYXRjaE51bWJlciwKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBfYnJhbmNoTmFtZSwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfYnVpbGROdW1iZXIgKQorICAgIDogICBtYWpvclZlcnNpb24oIF9tYWpvclZlcnNpb24gKSwKKyAgICAgICAgbWlub3JWZXJzaW9uKCBfbWlub3JWZXJzaW9uICksCisgICAgICAgIHBhdGNoTnVtYmVyKCBfcGF0Y2hOdW1iZXIgKSwKKyAgICAgICAgYnJhbmNoTmFtZSggX2JyYW5jaE5hbWUgKSwKKyAgICAgICAgYnVpbGROdW1iZXIoIF9idWlsZE51bWJlciApCisgICAge30KKworICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBWZXJzaW9uIGNvbnN0JiB2ZXJzaW9uICkgeworICAgICAgICBvcyAgPDwgdmVyc2lvbi5tYWpvclZlcnNpb24gPDwgJy4nCisgICAgICAgICAgICA8PCB2ZXJzaW9uLm1pbm9yVmVyc2lvbiA8PCAnLicKKyAgICAgICAgICAgIDw8IHZlcnNpb24ucGF0Y2hOdW1iZXI7CisgICAgICAgIC8vIGJyYW5jaE5hbWUgaXMgbmV2ZXIgbnVsbCAtPiAwdGggY2hhciBpcyBcMCBpZiBpdCBpcyBlbXB0eQorICAgICAgICBpZiAodmVyc2lvbi5icmFuY2hOYW1lWzBdKSB7CisgICAgICAgICAgICBvcyA8PCAnLScgPDwgdmVyc2lvbi5icmFuY2hOYW1lCisgICAgICAgICAgICAgICA8PCAnLicgPDwgdmVyc2lvbi5idWlsZE51bWJlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3M7CisgICAgfQorCisgICAgaW5saW5lIFZlcnNpb24gbGlicmFyeVZlcnNpb24oKSB7CisgICAgICAgIHN0YXRpYyBWZXJzaW9uIHZlcnNpb24oIDEsIDksIDQsICIiLCAwICk7CisgICAgICAgIHJldHVybiB2ZXJzaW9uOworICAgIH0KKworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWVzc2FnZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01FU1NBR0VfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBNZXNzYWdlSW5mbzo6TWVzc2FnZUluZm8oICAgc3RkOjpzdHJpbmcgY29uc3QmIF9tYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIF90eXBlICkKKyAgICA6ICAgbWFjcm9OYW1lKCBfbWFjcm9OYW1lICksCisgICAgICAgIGxpbmVJbmZvKCBfbGluZUluZm8gKSwKKyAgICAgICAgdHlwZSggX3R5cGUgKSwKKyAgICAgICAgc2VxdWVuY2UoICsrZ2xvYmFsQ291bnQgKQorICAgIHt9CisKKyAgICAvLyBUaGlzIG1heSBuZWVkIHByb3RlY3RpbmcgaWYgdGhyZWFkaW5nIHN1cHBvcnQgaXMgYWRkZWQKKyAgICB1bnNpZ25lZCBpbnQgTWVzc2FnZUluZm86Omdsb2JhbENvdW50ID0gMDsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIFNjb3BlZE1lc3NhZ2U6OlNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VCdWlsZGVyIGNvbnN0JiBidWlsZGVyICkKKyAgICA6IG1faW5mbyggYnVpbGRlci5tX2luZm8gKQorICAgIHsKKyAgICAgICAgbV9pbmZvLm1lc3NhZ2UgPSBidWlsZGVyLm1fc3RyZWFtLnN0cigpOworICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkucHVzaFNjb3BlZE1lc3NhZ2UoIG1faW5mbyApOworICAgIH0KKyAgICBTY29wZWRNZXNzYWdlOjpTY29wZWRNZXNzYWdlKCBTY29wZWRNZXNzYWdlIGNvbnN0JiBvdGhlciApCisgICAgOiBtX2luZm8oIG90aGVyLm1faW5mbyApCisgICAge30KKworICAgIFNjb3BlZE1lc3NhZ2U6On5TY29wZWRNZXNzYWdlKCkgeworICAgICAgICBpZiAoICFzdGQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbigpICl7CisgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkucG9wU2NvcGVkTWVzc2FnZShtX2luZm8pOworICAgICAgICB9CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2xlZ2FjeV9yZXBvcnRlcl9hZGFwdGVyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTEVHQUNZX1JFUE9SVEVSX0FEQVBURVJfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9sZWdhY3lfcmVwb3J0ZXJfYWRhcHRlci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9MRUdBQ1lfUkVQT1JURVJfQURBUFRFUl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaAoreworICAgIC8vIERlcHJlY2F0ZWQKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyIDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgfklSZXBvcnRlcigpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG91bGRSZWRpcmVjdFN0ZG91dCgpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgU3RhcnRUZXN0aW5nKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRW5kVGVzdGluZyggVG90YWxzIGNvbnN0JiB0b3RhbHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBTdGFydEdyb3VwKCBzdGQ6OnN0cmluZyBjb25zdCYgZ3JvdXBOYW1lICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRW5kR3JvdXAoIHN0ZDo6c3RyaW5nIGNvbnN0JiBncm91cE5hbWUsIFRvdGFscyBjb25zdCYgdG90YWxzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgU3RhcnRUZXN0Q2FzZSggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIEVuZFRlc3RDYXNlKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvLCBUb3RhbHMgY29uc3QmIHRvdGFscywgc3RkOjpzdHJpbmcgY29uc3QmIHN0ZE91dCwgc3RkOjpzdHJpbmcgY29uc3QmIHN0ZEVyciApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIFN0YXJ0U2VjdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIHNlY3Rpb25OYW1lLCBzdGQ6OnN0cmluZyBjb25zdCYgZGVzY3JpcHRpb24gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBFbmRTZWN0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgc2VjdGlvbk5hbWUsIENvdW50cyBjb25zdCYgYXNzZXJ0aW9ucyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIE5vQXNzZXJ0aW9uc0luU2VjdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIHNlY3Rpb25OYW1lICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgTm9Bc3NlcnRpb25zSW5UZXN0Q2FzZSggc3RkOjpzdHJpbmcgY29uc3QmIHRlc3ROYW1lICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgQWJvcnRlZCgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIFJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKSA9IDA7CisgICAgfTsKKworICAgIGNsYXNzIExlZ2FjeVJlcG9ydGVyQWRhcHRlciA6IHB1YmxpYyBTaGFyZWRJbXBsPElTdHJlYW1pbmdSZXBvcnRlcj4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBMZWdhY3lSZXBvcnRlckFkYXB0ZXIoIFB0cjxJUmVwb3J0ZXI+IGNvbnN0JiBsZWdhY3lSZXBvcnRlciApOworICAgICAgICB2aXJ0dWFsIH5MZWdhY3lSZXBvcnRlckFkYXB0ZXIoKTsKKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApOworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFB0cjxJUmVwb3J0ZXI+IG1fbGVnYWN5UmVwb3J0ZXI7CisgICAgfTsKK30KKworbmFtZXNwYWNlIENhdGNoCit7CisgICAgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpMZWdhY3lSZXBvcnRlckFkYXB0ZXIoIFB0cjxJUmVwb3J0ZXI+IGNvbnN0JiBsZWdhY3lSZXBvcnRlciApCisgICAgOiAgIG1fbGVnYWN5UmVwb3J0ZXIoIGxlZ2FjeVJlcG9ydGVyICkKKyAgICB7fQorICAgIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6fkxlZ2FjeVJlcG9ydGVyQWRhcHRlcigpIHt9CisKKyAgICBSZXBvcnRlclByZWZlcmVuY2VzIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6Z2V0UHJlZmVyZW5jZXMoKSBjb25zdCB7CisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgcHJlZnM7CisgICAgICAgIHByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gbV9sZWdhY3lSZXBvcnRlci0+c2hvdWxkUmVkaXJlY3RTdGRvdXQoKTsKKyAgICAgICAgcmV0dXJuIHByZWZzOworICAgIH0KKworICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgKSB7fQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+U3RhcnRUZXN0aW5nKCk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlN0YXJ0R3JvdXAoIGdyb3VwSW5mby5uYW1lICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5TdGFydFRlc3RDYXNlKCB0ZXN0SW5mbyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6c2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlN0YXJ0U2VjdGlvbiggc2VjdGlvbkluZm8ubmFtZSwgc2VjdGlvbkluZm8uZGVzY3JpcHRpb24gKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OmFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIHsKKyAgICAgICAgLy8gTm90IG9uIGxlZ2FjeSBpbnRlcmZhY2UKKyAgICB9CisKKyAgICBib29sIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6YXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIHsKKyAgICAgICAgaWYoIGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgIT0gUmVzdWx0V2FzOjpPayApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpLCBpdEVuZCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoIGl0LT50eXBlID09IFJlc3VsdFdhczo6SW5mbyApIHsKKyAgICAgICAgICAgICAgICAgICAgUmVzdWx0QnVpbGRlciByYiggaXQtPm1hY3JvTmFtZS5jX3N0cigpLCBpdC0+bGluZUluZm8sICIiLCBSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsICk7CisgICAgICAgICAgICAgICAgICAgIHJiIDw8IGl0LT5tZXNzYWdlOworICAgICAgICAgICAgICAgICAgICByYi5zZXRSZXN1bHRUeXBlKCBSZXN1bHRXYXM6OkluZm8gKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdCA9IHJiLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlJlc3VsdCggcmVzdWx0ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlJlc3VsdCggYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6c2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApIHsKKyAgICAgICAgaWYoIHNlY3Rpb25TdGF0cy5taXNzaW5nQXNzZXJ0aW9ucyApCisgICAgICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5Ob0Fzc2VydGlvbnNJblNlY3Rpb24oIHNlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lICk7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPkVuZFNlY3Rpb24oIHNlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+RW5kVGVzdENhc2UKKyAgICAgICAgICAgICggICB0ZXN0Q2FzZVN0YXRzLnRlc3RJbmZvLAorICAgICAgICAgICAgICAgIHRlc3RDYXNlU3RhdHMudG90YWxzLAorICAgICAgICAgICAgICAgIHRlc3RDYXNlU3RhdHMuc3RkT3V0LAorICAgICAgICAgICAgICAgIHRlc3RDYXNlU3RhdHMuc3RkRXJyICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgeworICAgICAgICBpZiggdGVzdEdyb3VwU3RhdHMuYWJvcnRpbmcgKQorICAgICAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+QWJvcnRlZCgpOworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5FbmRHcm91cCggdGVzdEdyb3VwU3RhdHMuZ3JvdXBJbmZvLm5hbWUsIHRlc3RHcm91cFN0YXRzLnRvdGFscyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+RW5kVGVzdGluZyggdGVzdFJ1blN0YXRzLnRvdGFscyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6c2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSB7CisgICAgfQorfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGltZXIuaHBwCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxMS1sb25nLWxvbmciCisjZW5kaWYKKworI2lmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKworI2Vsc2UKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisgICAgICAgIFVJbnQ2NCBnZXRDdXJyZW50VGlja3MoKSB7CisgICAgICAgICAgICBzdGF0aWMgVUludDY0IGh6PTAsIGh6bz0wOworICAgICAgICAgICAgaWYgKCFoeikgeworICAgICAgICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koIHJlaW50ZXJwcmV0X2Nhc3Q8TEFSR0VfSU5URUdFUio+KCAmaHogKSApOworICAgICAgICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCByZWludGVycHJldF9jYXN0PExBUkdFX0lOVEVHRVIqPiggJmh6byApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVSW50NjQgdDsKKyAgICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCByZWludGVycHJldF9jYXN0PExBUkdFX0lOVEVHRVIqPiggJnQgKSApOworICAgICAgICAgICAgcmV0dXJuICgodC1oem8pKjEwMDAwMDApL2h6OworICAgICAgICB9CisjZWxzZQorICAgICAgICBVSW50NjQgZ2V0Q3VycmVudFRpY2tzKCkgeworICAgICAgICAgICAgdGltZXZhbCB0OworICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0LENBVENIX05VTEwpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFVJbnQ2ND4oIHQudHZfc2VjICkgKiAxMDAwMDAwdWxsICsgc3RhdGljX2Nhc3Q8VUludDY0PiggdC50dl91c2VjICk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHZvaWQgVGltZXI6OnN0YXJ0KCkgeworICAgICAgICBtX3RpY2tzID0gZ2V0Q3VycmVudFRpY2tzKCk7CisgICAgfQorICAgIHVuc2lnbmVkIGludCBUaW1lcjo6Z2V0RWxhcHNlZE1pY3Jvc2Vjb25kcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oZ2V0Q3VycmVudFRpY2tzKCkgLSBtX3RpY2tzKTsKKyAgICB9CisgICAgdW5zaWduZWQgaW50IFRpbWVyOjpnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkvMTAwMCk7CisgICAgfQorICAgIGRvdWJsZSBUaW1lcjo6Z2V0RWxhcHNlZFNlY29uZHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkvMTAwMDAwMC4wOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29tbW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NTU9OX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjY3R5cGU+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJlZml4ICkgeworICAgICAgICByZXR1cm4gcy5zaXplKCkgPj0gcHJlZml4LnNpemUoKSAmJiBzdGQ6OmVxdWFsKHByZWZpeC5iZWdpbigpLCBwcmVmaXguZW5kKCksIHMuYmVnaW4oKSk7CisgICAgfQorICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgcHJlZml4ICkgeworICAgICAgICByZXR1cm4gIXMuZW1wdHkoKSAmJiBzWzBdID09IHByZWZpeDsKKyAgICB9CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdWZmaXggKSB7CisgICAgICAgIHJldHVybiBzLnNpemUoKSA+PSBzdWZmaXguc2l6ZSgpICYmIHN0ZDo6ZXF1YWwoc3VmZml4LnJiZWdpbigpLCBzdWZmaXgucmVuZCgpLCBzLnJiZWdpbigpKTsKKyAgICB9CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgc3VmZml4ICkgeworICAgICAgICByZXR1cm4gIXMuZW1wdHkoKSAmJiBzW3Muc2l6ZSgpLTFdID09IHN1ZmZpeDsKKyAgICB9CisgICAgYm9vbCBjb250YWlucyggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBpbmZpeCApIHsKKyAgICAgICAgcmV0dXJuIHMuZmluZCggaW5maXggKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICB9CisgICAgY2hhciB0b0xvd2VyQ2goY2hhciBjKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPiggc3RkOjp0b2xvd2VyKCBjICkgKTsKKyAgICB9CisgICAgdm9pZCB0b0xvd2VySW5QbGFjZSggc3RkOjpzdHJpbmcmIHMgKSB7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKCBzLmJlZ2luKCksIHMuZW5kKCksIHMuYmVnaW4oKSwgdG9Mb3dlckNoICk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRvTG93ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzICkgeworICAgICAgICBzdGQ6OnN0cmluZyBsYyA9IHM7CisgICAgICAgIHRvTG93ZXJJblBsYWNlKCBsYyApOworICAgICAgICByZXR1cm4gbGM7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRyaW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSB7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0KiB3aGl0ZXNwYWNlQ2hhcnMgPSAiXG5cclx0ICI7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgc3RhcnQgPSBzdHIuZmluZF9maXJzdF9ub3Rfb2YoIHdoaXRlc3BhY2VDaGFycyApOworICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGVuZCA9IHN0ci5maW5kX2xhc3Rfbm90X29mKCB3aGl0ZXNwYWNlQ2hhcnMgKTsKKworICAgICAgICByZXR1cm4gc3RhcnQgIT0gc3RkOjpzdHJpbmc6Om5wb3MgPyBzdHIuc3Vic3RyKCBzdGFydCwgMStlbmQtc3RhcnQgKSA6IHN0ZDo6c3RyaW5nKCk7CisgICAgfQorCisgICAgYm9vbCByZXBsYWNlSW5QbGFjZSggc3RkOjpzdHJpbmcmIHN0ciwgc3RkOjpzdHJpbmcgY29uc3QmIHJlcGxhY2VUaGlzLCBzdGQ6OnN0cmluZyBjb25zdCYgd2l0aFRoaXMgKSB7CisgICAgICAgIGJvb2wgcmVwbGFjZWQgPSBmYWxzZTsKKyAgICAgICAgc3RkOjpzaXplX3QgaSA9IHN0ci5maW5kKCByZXBsYWNlVGhpcyApOworICAgICAgICB3aGlsZSggaSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgIHJlcGxhY2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoIDAsIGkgKSArIHdpdGhUaGlzICsgc3RyLnN1YnN0ciggaStyZXBsYWNlVGhpcy5zaXplKCkgKTsKKyAgICAgICAgICAgIGlmKCBpIDwgc3RyLnNpemUoKS13aXRoVGhpcy5zaXplKCkgKQorICAgICAgICAgICAgICAgIGkgPSBzdHIuZmluZCggcmVwbGFjZVRoaXMsIGkrd2l0aFRoaXMuc2l6ZSgpICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBsYWNlZDsKKyAgICB9CisKKyAgICBwbHVyYWxpc2U6OnBsdXJhbGlzZSggc3RkOjpzaXplX3QgY291bnQsIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYWJlbCApCisgICAgOiAgIG1fY291bnQoIGNvdW50ICksCisgICAgICAgIG1fbGFiZWwoIGxhYmVsICkKKyAgICB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIHBsdXJhbGlzZSBjb25zdCYgcGx1cmFsaXNlciApIHsKKyAgICAgICAgb3MgPDwgcGx1cmFsaXNlci5tX2NvdW50IDw8ICcgJyA8PCBwbHVyYWxpc2VyLm1fbGFiZWw7CisgICAgICAgIGlmKCBwbHVyYWxpc2VyLm1fY291bnQgIT0gMSApCisgICAgICAgICAgICBvcyA8PCAncyc7CisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICBTb3VyY2VMaW5lSW5mbzo6U291cmNlTGluZUluZm8oKSA6IGZpbGUoIiIpLCBsaW5lKCAwICl7fQorICAgIFNvdXJjZUxpbmVJbmZvOjpTb3VyY2VMaW5lSW5mbyggY2hhciBjb25zdCogX2ZpbGUsIHN0ZDo6c2l6ZV90IF9saW5lICkKKyAgICA6ICAgZmlsZSggX2ZpbGUgKSwKKyAgICAgICAgbGluZSggX2xpbmUgKQorICAgIHt9CisgICAgYm9vbCBTb3VyY2VMaW5lSW5mbzo6ZW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBmaWxlWzBdID09ICdcMCc7CisgICAgfQorICAgIGJvb2wgU291cmNlTGluZUluZm86Om9wZXJhdG9yID09ICggU291cmNlTGluZUluZm8gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICByZXR1cm4gbGluZSA9PSBvdGhlci5saW5lICYmIChmaWxlID09IG90aGVyLmZpbGUgfHwgc3RkOjpzdHJjbXAoZmlsZSwgb3RoZXIuZmlsZSkgPT0gMCk7CisgICAgfQorICAgIGJvb2wgU291cmNlTGluZUluZm86Om9wZXJhdG9yIDwgKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaW5lIDwgb3RoZXIubGluZSB8fCAoIGxpbmUgPT0gb3RoZXIubGluZSAmJiAoc3RkOjpzdHJjbXAoZmlsZSwgb3RoZXIuZmlsZSkgPCAwKSk7CisgICAgfQorCisgICAgdm9pZCBzZWVkUm5nKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIGlmKCBjb25maWcucm5nU2VlZCgpICE9IDAgKQorICAgICAgICAgICAgc3RkOjpzcmFuZCggY29uZmlnLnJuZ1NlZWQoKSApOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgcm5nU2VlZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPnJuZ1NlZWQoKTsKKyAgICB9CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgU291cmNlTGluZUluZm8gY29uc3QmIGluZm8gKSB7CisjaWZuZGVmIF9fR05VR19fCisgICAgICAgIG9zIDw8IGluZm8uZmlsZSA8PCAnKCcgPDwgaW5mby5saW5lIDw8ICcpJzsKKyNlbHNlCisgICAgICAgIG9zIDw8IGluZm8uZmlsZSA8PCAnOicgPDwgaW5mby5saW5lOworI2VuZGlmCisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICB2b2lkIHRocm93TG9naWNFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsb2NhdGlvbkluZm8gKSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgIG9zcyA8PCBsb2NhdGlvbkluZm8gPDwgIjogSW50ZXJuYWwgQ2F0Y2ggZXJyb3I6ICciIDw8IG1lc3NhZ2UgPDwgJ1wnJzsKKyAgICAgICAgaWYoIGFsd2F5c1RydWUoKSApCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCBvc3Muc3RyKCkgKTsKKyAgICB9Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zZWN0aW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU0VDVElPTl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIFNlY3Rpb25JbmZvOjpTZWN0aW9uSW5mbworICAgICAgICAoICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY3JpcHRpb24gKQorICAgIDogICBuYW1lKCBfbmFtZSApLAorICAgICAgICBkZXNjcmlwdGlvbiggX2Rlc2NyaXB0aW9uICksCisgICAgICAgIGxpbmVJbmZvKCBfbGluZUluZm8gKQorICAgIHt9CisKKyAgICBTZWN0aW9uOjpTZWN0aW9uKCBTZWN0aW9uSW5mbyBjb25zdCYgaW5mbyApCisgICAgOiAgIG1faW5mbyggaW5mbyApLAorICAgICAgICBtX3NlY3Rpb25JbmNsdWRlZCggZ2V0UmVzdWx0Q2FwdHVyZSgpLnNlY3Rpb25TdGFydGVkKCBtX2luZm8sIG1fYXNzZXJ0aW9ucyApICkKKyAgICB7CisgICAgICAgIG1fdGltZXIuc3RhcnQoKTsKKyAgICB9CisKKyAgICBTZWN0aW9uOjp+U2VjdGlvbigpIHsKKyAgICAgICAgaWYoIG1fc2VjdGlvbkluY2x1ZGVkICkgeworICAgICAgICAgICAgU2VjdGlvbkVuZEluZm8gZW5kSW5mbyggbV9pbmZvLCBtX2Fzc2VydGlvbnMsIG1fdGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKSApOworICAgICAgICAgICAgaWYoIHN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCkgKQorICAgICAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5zZWN0aW9uRW5kZWRFYXJseSggZW5kSW5mbyApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5zZWN0aW9uRW5kZWQoIGVuZEluZm8gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNlY3Rpb24gc2hvdWxkIGJlIGV4ZWN1dGVkIG9yIG5vdAorICAgIFNlY3Rpb246Om9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3NlY3Rpb25JbmNsdWRlZDsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZGVidWdnZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9ERUJVR0dFUl9IUFBfSU5DTFVERUQKKworI2lmZGVmIENBVENIX1BMQVRGT1JNX01BQworCisgICAgI2luY2x1ZGUgPGFzc2VydC5oPgorICAgICNpbmNsdWRlIDxzdGRib29sLmg+CisgICAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorCisgICAgbmFtZXNwYWNlIENhdGNoeworCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGUgZm9sbG93aW5nIHRlY2huaWNhbCBub3RlOgorICAgICAgICAvLyBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L21hYy8jcWEvcWEyMDA0L3FhMTM2MS5odG1sCisKKyAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgYmVpbmcgZGVidWdnZWQgKGVpdGhlcgorICAgICAgICAvLyBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciBvciBoYXMgYSBkZWJ1Z2dlciBhdHRhY2hlZCBwb3N0IGZhY3RvKS4KKyAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCl7CisKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbWliWzRdOworICAgICAgICAgICAgc3RydWN0IGtpbmZvX3Byb2MgICBpbmZvOworICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplOworCisgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBmbGFncyBzbyB0aGF0LCBpZiBzeXNjdGwgZmFpbHMgZm9yIHNvbWUgYml6YXJyZQorICAgICAgICAgICAgLy8gcmVhc29uLCB3ZSBnZXQgYSBwcmVkaWN0YWJsZSByZXN1bHQuCisKKyAgICAgICAgICAgIGluZm8ua3BfcHJvYy5wX2ZsYWcgPSAwOworCisgICAgICAgICAgICAvLyBJbml0aWFsaXplIG1pYiwgd2hpY2ggdGVsbHMgc3lzY3RsIHRoZSBpbmZvIHdlIHdhbnQsIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgLy8gd2UncmUgbG9va2luZyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBwcm9jZXNzIElELgorCisgICAgICAgICAgICBtaWJbMF0gPSBDVExfS0VSTjsKKyAgICAgICAgICAgIG1pYlsxXSA9IEtFUk5fUFJPQzsKKyAgICAgICAgICAgIG1pYlsyXSA9IEtFUk5fUFJPQ19QSUQ7CisgICAgICAgICAgICBtaWJbM10gPSBnZXRwaWQoKTsKKworICAgICAgICAgICAgLy8gQ2FsbCBzeXNjdGwuCisKKyAgICAgICAgICAgIHNpemUgPSBzaXplb2YoaW5mbyk7CisgICAgICAgICAgICBpZiggc3lzY3RsKG1pYiwgc2l6ZW9mKG1pYikgLyBzaXplb2YoKm1pYiksICZpbmZvLCAmc2l6ZSwgQ0FUQ0hfTlVMTCwgMCkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBDYXRjaDo6Y2VycigpIDw8ICJcbioqIENhbGwgdG8gc3lzY3RsIGZhaWxlZCAtIHVuYWJsZSB0byBkZXRlcm1pbmUgaWYgZGVidWdnZXIgaXMgYWN0aXZlICoqXG4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlJ3JlIGJlaW5nIGRlYnVnZ2VkIGlmIHRoZSBQX1RSQUNFRCBmbGFnIGlzIHNldC4KKworICAgICAgICAgICAgcmV0dXJuICggKGluZm8ua3BfcHJvYy5wX2ZsYWcgJiBQX1RSQUNFRCkgIT0gMCApOworICAgICAgICB9CisgICAgfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2VsaWYgZGVmaW5lZChDQVRDSF9QTEFURk9STV9MSU5VWCkKKyAgICAjaW5jbHVkZSA8ZnN0cmVhbT4KKyAgICAjaW5jbHVkZSA8c3RyaW5nPgorCisgICAgbmFtZXNwYWNlIENhdGNoeworICAgICAgICAvLyBUaGUgc3RhbmRhcmQgUE9TSVggd2F5IG9mIGRldGVjdGluZyBhIGRlYnVnZ2VyIGlzIHRvIGF0dGVtcHQgdG8KKyAgICAgICAgLy8gcHRyYWNlKCkgdGhlIHByb2Nlc3MsIGJ1dCB0aGlzIG5lZWRzIHRvIGJlIGRvbmUgZnJvbSBhIGNoaWxkIGFuZCBub3QKKyAgICAgICAgLy8gdGhpcyBwcm9jZXNzIGl0c2VsZiB0byBzdGlsbCBhbGxvdyBhdHRhY2hpbmcgdG8gdGhpcyBwcm9jZXNzIGxhdGVyCisgICAgICAgIC8vIGlmIHdhbnRlZCwgc28gaXMgcmF0aGVyIGhlYXZ5LiBVbmRlciBMaW51eCB3ZSBoYXZlIHRoZSBQSUQgb2YgdGhlCisgICAgICAgIC8vICJkZWJ1Z2dlciIgKHdoaWNoIGRvZXNuJ3QgbmVlZCB0byBiZSBnZGIsIG9mIGNvdXJzZSwgaXQgY291bGQgYWxzbworICAgICAgICAvLyBiZSBzdHJhY2UsIGZvciBleGFtcGxlKSBpbiAvcHJvYy8kUElEL3N0YXR1cywgc28ganVzdCBnZXQgaXQgZnJvbQorICAgICAgICAvLyB0aGVyZSBpbnN0ZWFkLgorICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKXsKKyAgICAgICAgICAgIC8vIExpYnN0ZGMrKyBoYXMgYSBidWcsIHdoZXJlIHN0ZDo6aWZzdHJlYW0gc2V0cyBlcnJubyB0byAwCisgICAgICAgICAgICAvLyBUaGlzIHdheSBvdXIgdXNlcnMgY2FuIHByb3Blcmx5IGFzc2VydCBvdmVyIGVycm5vIHZhbHVlcworICAgICAgICAgICAgRXJybm9HdWFyZCBndWFyZDsKKyAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0gaW4oIi9wcm9jL3NlbGYvc3RhdHVzIik7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c3RyaW5nIGxpbmU7IHN0ZDo6Z2V0bGluZShpbiwgbGluZSk7ICkgeworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgUFJFRklYX0xFTiA9IDExOworICAgICAgICAgICAgICAgIGlmKCBsaW5lLmNvbXBhcmUoMCwgUFJFRklYX0xFTiwgIlRyYWNlclBpZDpcdCIpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHRyYWNlZCBpZiB0aGUgUElEIGlzIG5vdCAwIGFuZCBubyBvdGhlciBQSUQgc3RhcnRzCisgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggMCBkaWdpdCwgc28gaXQncyBlbm91Z2ggdG8gY2hlY2sgZm9yIGp1c3QgYSBzaW5nbGUKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZS5sZW5ndGgoKSA+IFBSRUZJWF9MRU4gJiYgbGluZVtQUkVGSVhfTEVOXSAhPSAnMCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IC8vIG5hbWVzcGFjZSBDYXRjaAorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICBleHRlcm4gIkMiIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgX19zdGRjYWxsIElzRGVidWdnZXJQcmVzZW50KCk7CisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCkgeworICAgICAgICAgICAgcmV0dXJuIElzRGVidWdnZXJQcmVzZW50KCkgIT0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbGlmIGRlZmluZWQoX19NSU5HVzMyX18pCisgICAgZXh0ZXJuICJDIiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW50IF9fc3RkY2FsbCBJc0RlYnVnZ2VyUHJlc2VudCgpOworICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBJc0RlYnVnZ2VyUHJlc2VudCgpICE9IDA7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgaW5saW5lIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgfQorI2VuZGlmIC8vIFBsYXRmb3JtCisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICB2b2lkIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICkgeworICAgICAgICAgICAgOjpPdXRwdXREZWJ1Z1N0cmluZ0EoIHRleHQuY19zdHIoKSApOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICB2b2lkIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICkgeworICAgICAgICAgICAgLy8gIVRCRDogTmVlZCBhIHZlcnNpb24gZm9yIE1hYy8gWENvZGUgYW5kIG90aGVyIElERXMKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgdGV4dDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBQbGF0Zm9ybQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdG9zdHJpbmcuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UT1NUUklOR19IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworbmFtZXNwYWNlIERldGFpbCB7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyB1bnByaW50YWJsZVN0cmluZyA9ICJ7P30iOworCisgICAgbmFtZXNwYWNlIHsKKyAgICAgICAgY29uc3QgaW50IGhleFRocmVzaG9sZCA9IDI1NTsKKworICAgICAgICBzdHJ1Y3QgRW5kaWFubmVzcyB7CisgICAgICAgICAgICBlbnVtIEFyY2ggeyBCaWcsIExpdHRsZSB9OworCisgICAgICAgICAgICBzdGF0aWMgQXJjaCB3aGljaCgpIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBfeworICAgICAgICAgICAgICAgICAgICBpbnQgYXNJbnQ7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYXNDaGFyW3NpemVvZiAoaW50KV07CisgICAgICAgICAgICAgICAgfSB1OworCisgICAgICAgICAgICAgICAgdS5hc0ludCA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuICggdS5hc0NoYXJbc2l6ZW9mKGludCktMV0gPT0gMSApID8gQmlnIDogTGl0dGxlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCB2b2lkICpvYmplY3QsIHN0ZDo6c2l6ZV90IHNpemUgKQorICAgIHsKKyAgICAgICAgLy8gUmV2ZXJzZSBvcmRlciBmb3IgbGl0dGxlIGVuZGlhbiBhcmNoaXRlY3R1cmVzCisgICAgICAgIGludCBpID0gMCwgZW5kID0gc3RhdGljX2Nhc3Q8aW50Piggc2l6ZSApLCBpbmMgPSAxOworICAgICAgICBpZiggRW5kaWFubmVzczo6d2hpY2goKSA9PSBFbmRpYW5uZXNzOjpMaXR0bGUgKSB7CisgICAgICAgICAgICBpID0gZW5kLTE7CisgICAgICAgICAgICBlbmQgPSBpbmMgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgKmJ5dGVzID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhciBjb25zdCAqPihvYmplY3QpOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICAgIG9zIDw8ICIweCIgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpoZXg7CisgICAgICAgIGZvciggOyBpICE9IGVuZDsgaSArPSBpbmMgKQorICAgICAgICAgICAgIG9zIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYnl0ZXNbaV0pOworICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKSB7CisgICAgc3RkOjpzdHJpbmcgcyA9IHZhbHVlOworICAgIGlmKCBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5zaG93SW52aXNpYmxlcygpICkgeworICAgICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgcy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnM7CisgICAgICAgICAgICBzd2l0Y2goIHNbaV0gKSB7CisgICAgICAgICAgICBjYXNlICdcbic6IHN1YnMgPSAiXFxuIjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcdCc6IHN1YnMgPSAiXFx0IjsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhc3Vicy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIHMgPSBzLnN1YnN0ciggMCwgaSApICsgc3VicyArIHMuc3Vic3RyKCBpKzEgKTsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICciJyArIHMgKyAnIic7Cit9CitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjp3c3RyaW5nIGNvbnN0JiB2YWx1ZSApIHsKKworICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgcy5yZXNlcnZlKCB2YWx1ZS5zaXplKCkgKTsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWUuc2l6ZSgpOyArK2kgKQorICAgICAgICBzICs9IHZhbHVlW2ldIDw9IDB4ZmYgPyBzdGF0aWNfY2FzdDxjaGFyPiggdmFsdWVbaV0gKSA6ICc/JzsKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUgPyBDYXRjaDo6dG9TdHJpbmcoIHN0ZDo6c3RyaW5nKCB2YWx1ZSApICkgOiBzdGQ6OnN0cmluZyggIntudWxsIHN0cmluZ30iICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjaGFyKiBjb25zdCB2YWx1ZSApIHsKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oIHZhbHVlICkgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IHdjaGFyX3QqIGNvbnN0IHZhbHVlICkKK3sKKyAgICByZXR1cm4gdmFsdWUgPyBDYXRjaDo6dG9TdHJpbmcoIHN0ZDo6d3N0cmluZyh2YWx1ZSkgKSA6IHN0ZDo6c3RyaW5nKCAie251bGwgc3RyaW5nfSIgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHdjaGFyX3QqIGNvbnN0IHZhbHVlICkKK3sKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjb25zdCB3Y2hhcl90Kj4oIHZhbHVlICkgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGludCB2YWx1ZSApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBpZiggdmFsdWUgPiBEZXRhaWw6OmhleFRocmVzaG9sZCApCisgICAgICAgIG9zcyA8PCAiICgweCIgPDwgc3RkOjpoZXggPDwgdmFsdWUgPDwgJyknOworICAgIHJldHVybiBvc3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGludCB2YWx1ZSApIHsKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggdmFsdWUgKSApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgZnBUb1N0cmluZyggVCB2YWx1ZSwgaW50IHByZWNpc2lvbiApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbiggcHJlY2lzaW9uICkKKyAgICAgICAgPDwgc3RkOjpmaXhlZAorICAgICAgICA8PCB2YWx1ZTsKKyAgICBzdGQ6OnN0cmluZyBkID0gb3NzLnN0cigpOworICAgIHN0ZDo6c2l6ZV90IGkgPSBkLmZpbmRfbGFzdF9ub3Rfb2YoICcwJyApOworICAgIGlmKCBpICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIGkgIT0gZC5zaXplKCktMSApIHsKKyAgICAgICAgaWYoIGRbaV0gPT0gJy4nICkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgZCA9IGQuc3Vic3RyKCAwLCBpKzEgKTsKKyAgICB9CisgICAgcmV0dXJuIGQ7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBkb3VibGUgdmFsdWUgKSB7CisgICAgcmV0dXJuIGZwVG9TdHJpbmcoIHZhbHVlLCAxMCApOworfQorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGZsb2F0IHZhbHVlICkgeworICAgIHJldHVybiBmcFRvU3RyaW5nKCB2YWx1ZSwgNSApICsgJ2YnOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggYm9vbCB2YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggY2hhciB2YWx1ZSApIHsKKyAgICBpZiAoIHZhbHVlID09ICdccicgKQorICAgICAgICByZXR1cm4gIidcXHInIjsKKyAgICBpZiAoIHZhbHVlID09ICdcZicgKQorICAgICAgICByZXR1cm4gIidcXGYnIjsKKyAgICBpZiAoIHZhbHVlID09ICdcbicgKQorICAgICAgICByZXR1cm4gIidcXG4nIjsKKyAgICBpZiAoIHZhbHVlID09ICdcdCcgKQorICAgICAgICByZXR1cm4gIidcXHQnIjsKKyAgICBpZiAoICdcMCcgPD0gdmFsdWUgJiYgdmFsdWUgPCAnICcgKQorICAgICAgICByZXR1cm4gdG9TdHJpbmcoIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHZhbHVlICkgKTsKKyAgICBjaGFyIGNoc3RyW10gPSAiJyAnIjsKKyAgICBjaHN0clsxXSA9IHZhbHVlOworICAgIHJldHVybiBjaHN0cjsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHNpZ25lZCBjaGFyIHZhbHVlICkgeworICAgIHJldHVybiB0b1N0cmluZyggc3RhdGljX2Nhc3Q8Y2hhcj4oIHZhbHVlICkgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGNoYXIgdmFsdWUgKSB7CisgICAgcmV0dXJuIHRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjaGFyPiggdmFsdWUgKSApOworfQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGxvbmcgbG9uZyB2YWx1ZSApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBpZiggdmFsdWUgPiBEZXRhaWw6OmhleFRocmVzaG9sZCApCisgICAgICAgIG9zcyA8PCAiICgweCIgPDwgc3RkOjpoZXggPDwgdmFsdWUgPDwgJyknOworICAgIHJldHVybiBvc3Muc3RyKCk7Cit9CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6Om51bGxwdHJfdCApIHsKKyAgICByZXR1cm4gIm51bGxwdHIiOworfQorI2VuZGlmCisKKyNpZmRlZiBfX09CSkNfXworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyBjb25zdCAqIGNvbnN0JiBuc3N0cmluZyApIHsKKyAgICAgICAgaWYoICFuc3N0cmluZyApCisgICAgICAgICAgICByZXR1cm4gIm5pbCI7CisgICAgICAgIHJldHVybiAiQCIgKyB0b1N0cmluZyhbbnNzdHJpbmcgVVRGOFN0cmluZ10pOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNTdHJpbmcgKiBDQVRDSF9BUkNfU1RST05HIGNvbnN0JiBuc3N0cmluZyApIHsKKyAgICAgICAgaWYoICFuc3N0cmluZyApCisgICAgICAgICAgICByZXR1cm4gIm5pbCI7CisgICAgICAgIHJldHVybiAiQCIgKyB0b1N0cmluZyhbbnNzdHJpbmcgVVRGOFN0cmluZ10pOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNPYmplY3QqIGNvbnN0JiBuc09iamVjdCApIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCBbbnNPYmplY3QgZGVzY3JpcHRpb25dICk7CisgICAgfQorI2VuZGlmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVzdWx0X2J1aWxkZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVNVTFRfQlVJTERFUl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0ZDo6c3RyaW5nIGNhcHR1cmVkRXhwcmVzc2lvbldpdGhTZWNvbmRBcmd1bWVudCggc3RkOjpzdHJpbmcgY29uc3QmIGNhcHR1cmVkRXhwcmVzc2lvbiwgc3RkOjpzdHJpbmcgY29uc3QmIHNlY29uZEFyZyApIHsKKyAgICAgICAgcmV0dXJuIHNlY29uZEFyZy5lbXB0eSgpIHx8IHNlY29uZEFyZyA9PSAiXCJcIiIKKyAgICAgICAgICAgID8gY2FwdHVyZWRFeHByZXNzaW9uCisgICAgICAgICAgICA6IGNhcHR1cmVkRXhwcmVzc2lvbiArICIsICIgKyBzZWNvbmRBcmc7CisgICAgfQorICAgIFJlc3VsdEJ1aWxkZXI6OlJlc3VsdEJ1aWxkZXIoICAgY2hhciBjb25zdCogbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogc2Vjb25kQXJnICkKKyAgICA6ICAgbV9hc3NlcnRpb25JbmZvKCBtYWNyb05hbWUsIGxpbmVJbmZvLCBjYXB0dXJlZEV4cHJlc3Npb25XaXRoU2Vjb25kQXJndW1lbnQoIGNhcHR1cmVkRXhwcmVzc2lvbiwgc2Vjb25kQXJnICksIHJlc3VsdERpc3Bvc2l0aW9uICksCisgICAgICAgIG1fc2hvdWxkRGVidWdCcmVhayggZmFsc2UgKSwKKyAgICAgICAgbV9zaG91bGRUaHJvdyggZmFsc2UgKSwKKyAgICAgICAgbV9ndWFyZEV4Y2VwdGlvbiggZmFsc2UgKQorICAgIHt9CisKKyAgICBSZXN1bHRCdWlsZGVyOjp+UmVzdWx0QnVpbGRlcigpIHsKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisgICAgICAgIGlmICggbV9ndWFyZEV4Y2VwdGlvbiApIHsKKyAgICAgICAgICAgIG1fc3RyZWFtLm9zcyA8PCAiRXhjZXB0aW9uIHRyYW5zbGF0aW9uIHdhcyBkaXNhYmxlZCBieSBDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFIjsKKyAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb24gKTsKKyAgICAgICAgICAgIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0UmVzdWx0Q2FwdHVyZSgpLT5leGNlcHRpb25FYXJseVJlcG9ydGVkKCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIFJlc3VsdEJ1aWxkZXImIFJlc3VsdEJ1aWxkZXI6OnNldFJlc3VsdFR5cGUoIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdCApIHsKKyAgICAgICAgbV9kYXRhLnJlc3VsdFR5cGUgPSByZXN1bHQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgUmVzdWx0QnVpbGRlciYgUmVzdWx0QnVpbGRlcjo6c2V0UmVzdWx0VHlwZSggYm9vbCByZXN1bHQgKSB7CisgICAgICAgIG1fZGF0YS5yZXN1bHRUeXBlID0gcmVzdWx0ID8gUmVzdWx0V2FzOjpPayA6IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6ZW5kRXhwcmVzc2lvbiggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKSB7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQgPSBidWlsZCggZXhwciApOworICAgICAgICBoYW5kbGVSZXN1bHQoIHJlc3VsdCApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6dXNlQWN0aXZlRXhjZXB0aW9uKCBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb24gKSB7CisgICAgICAgIG1fYXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiA9IHJlc3VsdERpc3Bvc2l0aW9uOworICAgICAgICBtX3N0cmVhbS5vc3MgPDwgQ2F0Y2g6OnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgICAgICBjYXB0dXJlUmVzdWx0KCBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlUmVzdWx0KCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlICkgeworICAgICAgICBzZXRSZXN1bHRUeXBlKCByZXN1bHRUeXBlICk7CisgICAgICAgIGNhcHR1cmVFeHByZXNzaW9uKCk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBleHBlY3RlZE1lc3NhZ2UgKSB7CisgICAgICAgIGlmKCBleHBlY3RlZE1lc3NhZ2UuZW1wdHkoKSApCisgICAgICAgICAgICBjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIE1hdGNoZXJzOjpJbXBsOjpNYXRjaEFsbE9mPHN0ZDo6c3RyaW5nPigpICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkVxdWFscyggZXhwZWN0ZWRNZXNzYWdlICkgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJCYXNlPHN0ZDo6c3RyaW5nPiBjb25zdCYgbWF0Y2hlciApIHsKKworICAgICAgICBhc3NlcnQoICFpc0ZhbHNlVGVzdCggbV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICkgKTsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBkYXRhID0gbV9kYXRhOworICAgICAgICBkYXRhLnJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6Ok9rOworICAgICAgICBkYXRhLnJlY29uc3RydWN0ZWRFeHByZXNzaW9uID0gbV9hc3NlcnRpb25JbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKworICAgICAgICBzdGQ6OnN0cmluZyBhY3R1YWxNZXNzYWdlID0gQ2F0Y2g6OnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgICAgICBpZiggIW1hdGNoZXIubWF0Y2goIGFjdHVhbE1lc3NhZ2UgKSApIHsKKyAgICAgICAgICAgIGRhdGEucmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDsKKyAgICAgICAgICAgIGRhdGEucmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gPSBhY3R1YWxNZXNzYWdlOworICAgICAgICB9CisgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQoIG1fYXNzZXJ0aW9uSW5mbywgZGF0YSApOworICAgICAgICBoYW5kbGVSZXN1bHQoIHJlc3VsdCApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZUV4cHJlc3Npb24oKSB7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQgPSBidWlsZCgpOworICAgICAgICBoYW5kbGVSZXN1bHQoIHJlc3VsdCApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6aGFuZGxlUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApCisgICAgeworICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuYXNzZXJ0aW9uRW5kZWQoIHJlc3VsdCApOworCisgICAgICAgIGlmKCAhcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgIGlmKCBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5zaG91bGREZWJ1Z0JyZWFrKCkgKQorICAgICAgICAgICAgICAgIG1fc2hvdWxkRGVidWdCcmVhayA9IHRydWU7CisgICAgICAgICAgICBpZiggZ2V0Q3VycmVudENvbnRleHQoKS5nZXRSdW5uZXIoKS0+YWJvcnRpbmcoKSB8fCAobV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICYgUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCkgKQorICAgICAgICAgICAgICAgIG1fc2hvdWxkVGhyb3cgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpyZWFjdCgpIHsKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisgICAgICAgIGlmIChtX3Nob3VsZERlYnVnQnJlYWspIHsKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIC8vIFRvIGluc3BlY3QgdGhlIHN0YXRlIGR1cmluZyB0ZXN0LCB5b3UgbmVlZCB0byBnbyBvbmUgbGV2ZWwgdXAgdGhlIGNhbGxzdGFjaworICAgICAgICAgICAgLy8gVG8gZ28gYmFjayB0byB0aGUgdGVzdCBhbmQgY2hhbmdlIGV4ZWN1dGlvbiwganVtcCBvdmVyIHRoZSB0aHJvdyBzdGF0ZW1lbnQKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmKCBtX3Nob3VsZFRocm93ICkKKyAgICAgICAgICAgIHRocm93IENhdGNoOjpUZXN0RmFpbHVyZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIGJvb2wgUmVzdWx0QnVpbGRlcjo6c2hvdWxkRGVidWdCcmVhaygpIGNvbnN0IHsgcmV0dXJuIG1fc2hvdWxkRGVidWdCcmVhazsgfQorICAgIGJvb2wgUmVzdWx0QnVpbGRlcjo6YWxsb3dUaHJvd3MoKSBjb25zdCB7IHJldHVybiBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5hbGxvd1Rocm93cygpOyB9CisKKyAgICBBc3NlcnRpb25SZXN1bHQgUmVzdWx0QnVpbGRlcjo6YnVpbGQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkKCAqdGhpcyApOworICAgIH0KKworICAgIC8vIENBVkVBVDogVGhlIHJldHVybmVkIEFzc2VydGlvblJlc3VsdCBzdG9yZXMgYSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudCBleHByLAorICAgIC8vICAgICAgICAgYSB0ZW1wb3JhcnkgRGVjb21wb3NlZEV4cHJlc3Npb24sIHdoaWNoIGluIHR1cm4gaG9sZHMgcmVmZXJlbmNlcyB0bworICAgIC8vICAgICAgICAgb3BlcmFuZHMsIHBvc3NpYmx5IHRlbXBvcmFyeSBhcyB3ZWxsLgorICAgIC8vICAgICAgICAgSXQgc2hvdWxkIGltbWVkaWF0ZWx5IGJlIHBhc3NlZCB0byBoYW5kbGVSZXN1bHQ7IGlmIHRoZSBleHByZXNzaW9uCisgICAgLy8gICAgICAgICBuZWVkcyB0byBiZSByZXBvcnRlZCwgaXRzIHN0cmluZyBleHBhbnNpb24gbXVzdCBiZSBjb21wb3NlZCBiZWZvcmUKKyAgICAvLyAgICAgICAgIHRoZSB0ZW1wb3JhcmllcyBhcmUgZGVzdHJveWVkLgorICAgIEFzc2VydGlvblJlc3VsdCBSZXN1bHRCdWlsZGVyOjpidWlsZCggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKSBjb25zdAorICAgIHsKKyAgICAgICAgYXNzZXJ0KCBtX2RhdGEucmVzdWx0VHlwZSAhPSBSZXN1bHRXYXM6OlVua25vd24gKTsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBkYXRhID0gbV9kYXRhOworCisgICAgICAgIC8vIEZsaXAgYm9vbCByZXN1bHRzIGlmIEZhbHNlVGVzdCBmbGFnIGlzIHNldAorICAgICAgICBpZiggaXNGYWxzZVRlc3QoIG1fYXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiApICkgeworICAgICAgICAgICAgZGF0YS5uZWdhdGUoIGV4cHIuaXNCaW5hcnlFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEubWVzc2FnZSA9IG1fc3RyZWFtLm9zcy5zdHIoKTsKKyAgICAgICAgZGF0YS5kZWNvbXBvc2VkRXhwcmVzc2lvbiA9ICZleHByOyAvLyBmb3IgbGF6eSByZWNvbnN0cnVjdGlvbgorICAgICAgICByZXR1cm4gQXNzZXJ0aW9uUmVzdWx0KCBtX2Fzc2VydGlvbkluZm8sIGRhdGEgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCB7CisgICAgICAgIGRlc3QgPSBtX2Fzc2VydGlvbkluZm8uY2FwdHVyZWRFeHByZXNzaW9uOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6c2V0RXhjZXB0aW9uR3VhcmQoKSB7CisgICAgICAgIG1fZ3VhcmRFeGNlcHRpb24gPSB0cnVlOworICAgIH0KKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnVuc2V0RXhjZXB0aW9uR3VhcmQoKSB7CisgICAgICAgIG1fZ3VhcmRFeGNlcHRpb24gPSBmYWxzZTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGFnX2FsaWFzX3JlZ2lzdHJ5LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEFHX0FMSUFTX1JFR0lTVFJZX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgVGFnQWxpYXNSZWdpc3RyeTo6flRhZ0FsaWFzUmVnaXN0cnkoKSB7fQorCisgICAgT3B0aW9uPFRhZ0FsaWFzPiBUYWdBbGlhc1JlZ2lzdHJ5OjpmaW5kKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMgKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdBbGlhcz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZWdpc3RyeS5maW5kKCBhbGlhcyApOworICAgICAgICBpZiggaXQgIT0gbV9yZWdpc3RyeS5lbmQoKSApCisgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE9wdGlvbjxUYWdBbGlhcz4oKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBUYWdBbGlhc1JlZ2lzdHJ5OjpleHBhbmRBbGlhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgdW5leHBhbmRlZFRlc3RTcGVjICkgY29uc3QgeworICAgICAgICBzdGQ6OnN0cmluZyBleHBhbmRlZFRlc3RTcGVjID0gdW5leHBhbmRlZFRlc3RTcGVjOworICAgICAgICBmb3IoIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdBbGlhcz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZWdpc3RyeS5iZWdpbigpLCBpdEVuZCA9IG1fcmVnaXN0cnkuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBvcyA9IGV4cGFuZGVkVGVzdFNwZWMuZmluZCggaXQtPmZpcnN0ICk7CisgICAgICAgICAgICBpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgICAgIGV4cGFuZGVkVGVzdFNwZWMgPSAgZXhwYW5kZWRUZXN0U3BlYy5zdWJzdHIoIDAsIHBvcyApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQudGFnICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkVGVzdFNwZWMuc3Vic3RyKCBwb3MgKyBpdC0+Zmlyc3Quc2l6ZSgpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4cGFuZGVkVGVzdFNwZWM7CisgICAgfQorCisgICAgdm9pZCBUYWdBbGlhc1JlZ2lzdHJ5OjphZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgeworCisgICAgICAgIGlmKCAhc3RhcnRzV2l0aCggYWxpYXMsICJbQCIgKSB8fCAhZW5kc1dpdGgoIGFsaWFzLCAnXScgKSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApCisgICAgICAgICAgICAgICAgPDwgImVycm9yOiB0YWcgYWxpYXMsIFwiIiA8PCBhbGlhcyA8PCAiXCIgaXMgbm90IG9mIHRoZSBmb3JtIFtAYWxpYXMgbmFtZV0uXG4iCisgICAgICAgICAgICAgICAgPDwgQ29sb3VyKCBDb2xvdXI6OkZpbGVOYW1lICkKKyAgICAgICAgICAgICAgICA8PCBsaW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoIG9zcy5zdHIoKS5jX3N0cigpICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoICFtX3JlZ2lzdHJ5Lmluc2VydCggc3RkOjptYWtlX3BhaXIoIGFsaWFzLCBUYWdBbGlhcyggdGFnLCBsaW5lSW5mbyApICkgKS5zZWNvbmQgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKQorICAgICAgICAgICAgICAgIDw8ICJlcnJvcjogdGFnIGFsaWFzLCBcIiIgPDwgYWxpYXMgPDwgIlwiIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiIKKyAgICAgICAgICAgICAgICA8PCAiXHRGaXJzdCBzZWVuIGF0ICIKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkgPDwgZmluZChhbGlhcyktPmxpbmVJbmZvIDw8ICdcbicKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkgPDwgIlx0UmVkZWZpbmVkIGF0ICIKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6RmlsZU5hbWUpIDw8IGxpbmVJbmZvIDw8ICdcbic7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpLmNfc3RyKCkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElUYWdBbGlhc1JlZ2lzdHJ5Ojp+SVRhZ0FsaWFzUmVnaXN0cnkoKSB7fQorCisgICAgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSB7CisgICAgICAgIHJldHVybiBnZXRSZWdpc3RyeUh1YigpLmdldFRhZ0FsaWFzUmVnaXN0cnkoKTsKKyAgICB9CisKKyAgICBSZWdpc3RyYXJGb3JUYWdBbGlhc2VzOjpSZWdpc3RyYXJGb3JUYWdBbGlhc2VzKCBjaGFyIGNvbnN0KiBhbGlhcywgY2hhciBjb25zdCogdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVGFnQWxpYXMoIGFsaWFzLCB0YWcsIGxpbmVJbmZvICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX21hdGNoZXJzX3N0cmluZy5ocHAKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisKKyAgICBuYW1lc3BhY2UgU3RkU3RyaW5nIHsKKworICAgICAgICBDYXNlZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKQorICAgICAgICA6ICAgbV9jYXNlU2Vuc2l0aXZpdHkoIGNhc2VTZW5zaXRpdml0eSApLAorICAgICAgICAgICAgbV9zdHIoIGFkanVzdFN0cmluZyggc3RyICkgKQorICAgICAgICB7fQorICAgICAgICBzdGQ6OnN0cmluZyBDYXNlZFN0cmluZzo6YWRqdXN0U3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6Ok5vCisgICAgICAgICAgICAgICAgICAgPyB0b0xvd2VyKCBzdHIgKQorICAgICAgICAgICAgICAgICAgIDogc3RyOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIENhc2VkU3RyaW5nOjpjYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jYXNlU2Vuc2l0aXZpdHkgPT0gQ2FzZVNlbnNpdGl2ZTo6Tm8KKyAgICAgICAgICAgICAgICAgICA/ICIgKGNhc2UgaW5zZW5zaXRpdmUpIgorICAgICAgICAgICAgICAgICAgIDogc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ01hdGNoZXJCYXNlOjpTdHJpbmdNYXRjaGVyQmFzZSggc3RkOjpzdHJpbmcgY29uc3QmIG9wZXJhdGlvbiwgQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKQorICAgICAgICA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvciApLAorICAgICAgICAgIG1fb3BlcmF0aW9uKCBvcGVyYXRpb24gKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyBTdHJpbmdNYXRjaGVyQmFzZTo6ZGVzY3JpYmUoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uLnJlc2VydmUoNSArIG1fb3BlcmF0aW9uLnNpemUoKSArIG1fY29tcGFyYXRvci5tX3N0ci5zaXplKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29tcGFyYXRvci5jYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKS5zaXplKCkpOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9vcGVyYXRpb247CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiOiBcIiI7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX2NvbXBhcmF0b3IubV9zdHI7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiXCIiOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9jb21wYXJhdG9yLmNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpOworICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgRXF1YWxzTWF0Y2hlcjo6RXF1YWxzTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAiZXF1YWxzIiwgY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgYm9vbCBFcXVhbHNNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSA9PSBtX2NvbXBhcmF0b3IubV9zdHI7CisgICAgICAgIH0KKworICAgICAgICBDb250YWluc01hdGNoZXI6OkNvbnRhaW5zTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAiY29udGFpbnMiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIENvbnRhaW5zTWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbnMoIG1fY29tcGFyYXRvci5hZGp1c3RTdHJpbmcoIHNvdXJjZSApLCBtX2NvbXBhcmF0b3IubV9zdHIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0YXJ0c1dpdGhNYXRjaGVyOjpTdGFydHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAic3RhcnRzIHdpdGgiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIFN0YXJ0c1dpdGhNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGFydHNXaXRoKCBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSwgbV9jb21wYXJhdG9yLm1fc3RyICk7CisgICAgICAgIH0KKworICAgICAgICBFbmRzV2l0aE1hdGNoZXI6OkVuZHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAiZW5kcyB3aXRoIiwgY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgYm9vbCBFbmRzV2l0aE1hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGVuZHNXaXRoKCBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSwgbV9jb21wYXJhdG9yLm1fc3RyICk7CisgICAgICAgIH0KKworICAgIH0gLy8gbmFtZXNwYWNlIFN0ZFN0cmluZworCisgICAgU3RkU3RyaW5nOjpFcXVhbHNNYXRjaGVyIEVxdWFscyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6RXF1YWxzTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQorICAgIFN0ZFN0cmluZzo6Q29udGFpbnNNYXRjaGVyIENvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpDb250YWluc01hdGNoZXIoIFN0ZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ciwgY2FzZVNlbnNpdGl2aXR5KSApOworICAgIH0KKyAgICBTdGRTdHJpbmc6OkVuZHNXaXRoTWF0Y2hlciBFbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6RW5kc1dpdGhNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdHIsIGNhc2VTZW5zaXRpdml0eSkgKTsKKyAgICB9CisgICAgU3RkU3RyaW5nOjpTdGFydHNXaXRoTWF0Y2hlciBTdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpTdGFydHNXaXRoTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfbXVsdGkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9NVUxUSV9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworY2xhc3MgTXVsdGlwbGVSZXBvcnRlcnMgOiBwdWJsaWMgU2hhcmVkSW1wbDxJU3RyZWFtaW5nUmVwb3J0ZXI+IHsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+ID4gUmVwb3J0ZXJzOworICAgIFJlcG9ydGVycyBtX3JlcG9ydGVyczsKKworcHVibGljOgorICAgIHZvaWQgYWRkKCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgcmVwb3J0ZXIgKSB7CisgICAgICAgIG1fcmVwb3J0ZXJzLnB1c2hfYmFjayggcmVwb3J0ZXIgKTsKKyAgICB9CisKK3B1YmxpYzogLy8gSVN0cmVhbWluZ1JlcG9ydGVyCisKKyAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHJldHVybiBtX3JlcG9ydGVyc1swXS0+Z2V0UHJlZmVyZW5jZXMoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+bm9NYXRjaGluZ1Rlc3RDYXNlcyggc3BlYyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiB0ZXN0UnVuSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0UnVuU3RhcnRpbmcoIHRlc3RSdW5JbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0R3JvdXBTdGFydGluZyggZ3JvdXBJbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdENhc2VTdGFydGluZyggdGVzdEluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+c2VjdGlvblN0YXJ0aW5nKCBzZWN0aW9uSW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgYXNzZXJ0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5hc3NlcnRpb25TdGFydGluZyggYXNzZXJ0aW9uSW5mbyApOworICAgIH0KKworICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlcyBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQ6CisgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGJvb2wgY2xlYXJCdWZmZXIgPSBmYWxzZTsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgIGNsZWFyQnVmZmVyIHw9ICgqaXQpLT5hc3NlcnRpb25FbmRlZCggYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICAgICAgcmV0dXJuIGNsZWFyQnVmZmVyOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnNlY3Rpb25FbmRlZCggc2VjdGlvblN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RHcm91cEVuZGVkKCB0ZXN0R3JvdXBTdGF0cyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RSdW5FbmRlZCggdGVzdFJ1blN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnNraXBUZXN0KCB0ZXN0SW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgTXVsdGlwbGVSZXBvcnRlcnMqIHRyeUFzTXVsdGkoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworfTsKKworUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gYWRkUmVwb3J0ZXIoIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiBleGlzdGluZ1JlcG9ydGVyLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgYWRkaXRpb25hbFJlcG9ydGVyICkgeworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlc3VsdGluZ1JlcG9ydGVyOworCisgICAgaWYoIGV4aXN0aW5nUmVwb3J0ZXIgKSB7CisgICAgICAgIE11bHRpcGxlUmVwb3J0ZXJzKiBtdWx0aSA9IGV4aXN0aW5nUmVwb3J0ZXItPnRyeUFzTXVsdGkoKTsKKyAgICAgICAgaWYoICFtdWx0aSApIHsKKyAgICAgICAgICAgIG11bHRpID0gbmV3IE11bHRpcGxlUmVwb3J0ZXJzOworICAgICAgICAgICAgcmVzdWx0aW5nUmVwb3J0ZXIgPSBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiggbXVsdGkgKTsKKyAgICAgICAgICAgIGlmKCBleGlzdGluZ1JlcG9ydGVyICkKKyAgICAgICAgICAgICAgICBtdWx0aS0+YWRkKCBleGlzdGluZ1JlcG9ydGVyICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0aW5nUmVwb3J0ZXIgPSBleGlzdGluZ1JlcG9ydGVyOworICAgICAgICBtdWx0aS0+YWRkKCBhZGRpdGlvbmFsUmVwb3J0ZXIgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXN1bHRpbmdSZXBvcnRlciA9IGFkZGl0aW9uYWxSZXBvcnRlcjsKKworICAgIHJldHVybiByZXN1bHRpbmdSZXBvcnRlcjsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfeG1sLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfWE1MX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVwb3J0ZXJfYmFzZXMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9CQVNFU19IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y2Zsb2F0PgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIC8vIEJlY2F1c2UgZm9ybWF0dGluZyB1c2luZyBjKysgc3RyZWFtcyBpcyBzdGF0ZWZ1bCwgZHJvcCBkb3duIHRvIEMgaXMgcmVxdWlyZWQKKyAgICAgICAgLy8gQWx0ZXJuYXRpdmVseSB3ZSBjb3VsZCB1c2Ugc3RyaW5nc3RyZWFtLCBidXQgaXRzIHBlcmZvcm1hbmNlIGlzLi4uIG5vdCBnb29kLgorICAgICAgICBzdGQ6OnN0cmluZyBnZXRGb3JtYXR0ZWREdXJhdGlvbiggZG91YmxlIGR1cmF0aW9uICkgeworICAgICAgICAgICAgLy8gTWF4IGV4cG9uZW50ICsgMSBpcyByZXF1aXJlZCB0byByZXByZXNlbnQgdGhlIHdob2xlIHBhcnQKKyAgICAgICAgICAgIC8vICsgMSBmb3IgZGVjaW1hbCBwb2ludAorICAgICAgICAgICAgLy8gKyAzIGZvciB0aGUgMyBkZWNpbWFsIHBsYWNlcworICAgICAgICAgICAgLy8gKyAxIGZvciBudWxsIHRlcm1pbmF0b3IKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtYXhEb3VibGVTaXplID0gREJMX01BWF8xMF9FWFAgKyAxICsgMSArIDMgKyAxOworICAgICAgICAgICAgY2hhciBidWZmZXJbbWF4RG91YmxlU2l6ZV07CisKKyAgICAgICAgICAgIC8vIFNhdmUgcHJldmlvdXMgZXJybm8sIHRvIHByZXZlbnQgc3ByaW50ZiBmcm9tIG92ZXJ3cml0aW5nIGl0CisgICAgICAgICAgICBFcnJub0d1YXJkIGd1YXJkOworI2lmZGVmIF9NU0NfVkVSCisgICAgICAgICAgICBzcHJpbnRmX3MoYnVmZmVyLCAiJS4zZiIsIGR1cmF0aW9uKTsKKyNlbHNlCisgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiUuM2YiLCBkdXJhdGlvbik7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyhidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RydWN0IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSA6IFNoYXJlZEltcGw8SVN0cmVhbWluZ1JlcG9ydGVyPiB7CisKKyAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBtX2NvbmZpZyggX2NvbmZpZy5mdWxsQ29uZmlnKCkgKSwKKyAgICAgICAgICAgIHN0cmVhbSggX2NvbmZpZy5zdHJlYW0oKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJQcmVmczsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgflN0cmVhbWluZ1JlcG9ydGVyQmFzZSgpIENBVENIX09WRVJSSURFOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiBfdGVzdFJ1bkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50VGVzdFJ1bkluZm8gPSBfdGVzdFJ1bkluZm87CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIF9ncm91cEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvID0gX2dyb3VwSW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIF90ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZUluZm8gPSBfdGVzdEluZm87CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIF9zZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnB1c2hfYmFjayggX3NlY3Rpb25JbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIC8qIF9zZWN0aW9uU3RhdHMgKi8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiAvKiBfdGVzdENhc2VTdGF0cyAqLyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZUluZm8ucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiAvKiBfdGVzdEdyb3VwU3RhdHMgKi8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiAvKiBfdGVzdFJ1blN0YXRzICovICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudFRlc3RDYXNlSW5mby5yZXNldCgpOworICAgICAgICAgICAgY3VycmVudEdyb3VwSW5mby5yZXNldCgpOworICAgICAgICAgICAgY3VycmVudFRlc3RSdW5JbmZvLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIC8vIEl0IGNhbiBvcHRpb25hbGx5IGJlIG92ZXJyaWRkZW4gaW4gdGhlIGRlcml2ZWQgY2xhc3MuCisgICAgICAgIH0KKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9jb25maWc7CisgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOworCisgICAgICAgIExhenlTdGF0PFRlc3RSdW5JbmZvPiBjdXJyZW50VGVzdFJ1bkluZm87CisgICAgICAgIExhenlTdGF0PEdyb3VwSW5mbz4gY3VycmVudEdyb3VwSW5mbzsKKyAgICAgICAgTGF6eVN0YXQ8VGVzdENhc2VJbmZvPiBjdXJyZW50VGVzdENhc2VJbmZvOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFNlY3Rpb25JbmZvPiBtX3NlY3Rpb25TdGFjazsKKyAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBtX3JlcG9ydGVyUHJlZnM7CisgICAgfTsKKworICAgIHN0cnVjdCBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlIDogU2hhcmVkSW1wbDxJU3RyZWFtaW5nUmVwb3J0ZXI+IHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ2hpbGROb2RlVD4KKyAgICAgICAgc3RydWN0IE5vZGUgOiBTaGFyZWRJbXBsPD4geworICAgICAgICAgICAgZXhwbGljaXQgTm9kZSggVCBjb25zdCYgX3ZhbHVlICkgOiB2YWx1ZSggX3ZhbHVlICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgfk5vZGUoKSB7fQorCisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxDaGlsZE5vZGVUPiA+IENoaWxkTm9kZXM7CisgICAgICAgICAgICBUIHZhbHVlOworICAgICAgICAgICAgQ2hpbGROb2RlcyBjaGlsZHJlbjsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IFNlY3Rpb25Ob2RlIDogU2hhcmVkSW1wbDw+IHsKKyAgICAgICAgICAgIGV4cGxpY2l0IFNlY3Rpb25Ob2RlKCBTZWN0aW9uU3RhdHMgY29uc3QmIF9zdGF0cyApIDogc3RhdHMoIF9zdGF0cyApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5TZWN0aW9uTm9kZSgpOworCisgICAgICAgICAgICBib29sIG9wZXJhdG9yID09ICggU2VjdGlvbk5vZGUgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0cy5zZWN0aW9uSW5mby5saW5lSW5mbyA9PSBvdGhlci5zdGF0cy5zZWN0aW9uSW5mby5saW5lSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKCBQdHI8U2VjdGlvbk5vZGU+IGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmF0b3I9PSggKm90aGVyICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyBzdGF0czsKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPFNlY3Rpb25Ob2RlPiA+IENoaWxkU2VjdGlvbnM7CisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEFzc2VydGlvblN0YXRzPiBBc3NlcnRpb25zOworICAgICAgICAgICAgQ2hpbGRTZWN0aW9ucyBjaGlsZFNlY3Rpb25zOworICAgICAgICAgICAgQXNzZXJ0aW9ucyBhc3NlcnRpb25zOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3RkT3V0OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3RkRXJyOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBCeVNlY3Rpb25JbmZvIHsKKyAgICAgICAgICAgIEJ5U2VjdGlvbkluZm8oIFNlY3Rpb25JbmZvIGNvbnN0JiBvdGhlciApIDogbV9vdGhlciggb3RoZXIgKSB7fQorICAgICAgICAgICAgQnlTZWN0aW9uSW5mbyggQnlTZWN0aW9uSW5mbyBjb25zdCYgb3RoZXIgKSA6IG1fb3RoZXIoIG90aGVyLm1fb3RoZXIgKSB7fQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvcigpICggUHRyPFNlY3Rpb25Ob2RlPiBjb25zdCYgbm9kZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS0+c3RhdHMuc2VjdGlvbkluZm8ubGluZUluZm8gPT0gbV9vdGhlci5saW5lSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHZvaWQgb3BlcmF0b3I9KCBCeVNlY3Rpb25JbmZvIGNvbnN0JiApOworICAgICAgICAgICAgU2VjdGlvbkluZm8gY29uc3QmIG1fb3RoZXI7CisgICAgICAgIH07CisKKyAgICAgICAgdHlwZWRlZiBOb2RlPFRlc3RDYXNlU3RhdHMsIFNlY3Rpb25Ob2RlPiBUZXN0Q2FzZU5vZGU7CisgICAgICAgIHR5cGVkZWYgTm9kZTxUZXN0R3JvdXBTdGF0cywgVGVzdENhc2VOb2RlPiBUZXN0R3JvdXBOb2RlOworICAgICAgICB0eXBlZGVmIE5vZGU8VGVzdFJ1blN0YXRzLCBUZXN0R3JvdXBOb2RlPiBUZXN0UnVuTm9kZTsKKworICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBtX2NvbmZpZyggX2NvbmZpZy5mdWxsQ29uZmlnKCkgKSwKKyAgICAgICAgICAgIHN0cmVhbSggX2NvbmZpZy5zdHJlYW0oKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIH5DdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCk7CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJQcmVmczsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyBpbmNvbXBsZXRlU3RhdHMoIHNlY3Rpb25JbmZvLCBDb3VudHMoKSwgMCwgZmFsc2UgKTsKKyAgICAgICAgICAgIFB0cjxTZWN0aW9uTm9kZT4gbm9kZTsKKyAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25TdGFjay5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIGlmKCAhbV9yb290U2VjdGlvbiApCisgICAgICAgICAgICAgICAgICAgIG1fcm9vdFNlY3Rpb24gPSBuZXcgU2VjdGlvbk5vZGUoIGluY29tcGxldGVTdGF0cyApOworICAgICAgICAgICAgICAgIG5vZGUgPSBtX3Jvb3RTZWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgU2VjdGlvbk5vZGUmIHBhcmVudE5vZGUgPSAqbV9zZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICAgICAgICAgIFNlY3Rpb25Ob2RlOjpDaGlsZFNlY3Rpb25zOjpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZmluZF9pZiggICBwYXJlbnROb2RlLmNoaWxkU2VjdGlvbnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGRTZWN0aW9ucy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5U2VjdGlvbkluZm8oIHNlY3Rpb25JbmZvICkgKTsKKyAgICAgICAgICAgICAgICBpZiggaXQgPT0gcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLmVuZCgpICkgeworICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3IFNlY3Rpb25Ob2RlKCBpbmNvbXBsZXRlU3RhdHMgKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSAqaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgICAgIG1fZGVlcGVzdFNlY3Rpb24gPSBub2RlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBhc3NlcnQoICFtX3NlY3Rpb25TdGFjay5lbXB0eSgpICk7CisgICAgICAgICAgICBTZWN0aW9uTm9kZSYgc2VjdGlvbk5vZGUgPSAqbV9zZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICAgICAgc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5wdXNoX2JhY2soIGFzc2VydGlvblN0YXRzICk7CisgICAgICAgICAgICAvLyBBc3NlcnRpb25SZXN1bHQgaG9sZHMgYSBwb2ludGVyIHRvIGEgdGVtcG9yYXJ5IERlY29tcG9zZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgLy8gd2hpY2ggZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgY2FsbHMgdG8gYnVpbGQgdGhlIGV4cHJlc3Npb24gc3RyaW5nLgorICAgICAgICAgICAgLy8gT3VyIHNlY3Rpb24gc3RhY2sgY29weSBvZiB0aGUgYXNzZXJ0aW9uUmVzdWx0IHdpbGwgbGlrZWx5IG91dGxpdmUgdGhlCisgICAgICAgICAgICAvLyB0ZW1wb3JhcnksIHNvIGl0IG11c3QgYmUgZXhwYW5kZWQgb3IgZGlzY2FyZGVkIG5vdyB0byBhdm9pZCBjYWxsaW5nCisgICAgICAgICAgICAvLyBhIGRlc3Ryb3llZCBvYmplY3QgbGF0ZXIuCisgICAgICAgICAgICBwcmVwYXJlRXhwYW5kZWRFeHByZXNzaW9uKCBzZWN0aW9uTm9kZS5hc3NlcnRpb25zLmJhY2soKS5hc3NlcnRpb25SZXN1bHQgKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgYXNzZXJ0KCAhbV9zZWN0aW9uU3RhY2suZW1wdHkoKSApOworICAgICAgICAgICAgU2VjdGlvbk5vZGUmIG5vZGUgPSAqbV9zZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICAgICAgbm9kZS5zdGF0cyA9IHNlY3Rpb25TdGF0czsKKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBQdHI8VGVzdENhc2VOb2RlPiBub2RlID0gbmV3IFRlc3RDYXNlTm9kZSggdGVzdENhc2VTdGF0cyApOworICAgICAgICAgICAgYXNzZXJ0KCBtX3NlY3Rpb25TdGFjay5zaXplKCkgPT0gMCApOworICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4ucHVzaF9iYWNrKCBtX3Jvb3RTZWN0aW9uICk7CisgICAgICAgICAgICBtX3Rlc3RDYXNlcy5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgICAgIG1fcm9vdFNlY3Rpb24ucmVzZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0KCBtX2RlZXBlc3RTZWN0aW9uICk7CisgICAgICAgICAgICBtX2RlZXBlc3RTZWN0aW9uLT5zdGRPdXQgPSB0ZXN0Q2FzZVN0YXRzLnN0ZE91dDsKKyAgICAgICAgICAgIG1fZGVlcGVzdFNlY3Rpb24tPnN0ZEVyciA9IHRlc3RDYXNlU3RhdHMuc3RkRXJyOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgUHRyPFRlc3RHcm91cE5vZGU+IG5vZGUgPSBuZXcgVGVzdEdyb3VwTm9kZSggdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgICAgIG5vZGUtPmNoaWxkcmVuLnN3YXAoIG1fdGVzdENhc2VzICk7CisgICAgICAgICAgICBtX3Rlc3RHcm91cHMucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBQdHI8VGVzdFJ1bk5vZGU+IG5vZGUgPSBuZXcgVGVzdFJ1bk5vZGUoIHRlc3RSdW5TdGF0cyApOworICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4uc3dhcCggbV90ZXN0R3JvdXBzICk7CisgICAgICAgICAgICBtX3Rlc3RSdW5zLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgdGVzdFJ1bkVuZGVkQ3VtdWxhdGl2ZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWRDdW11bGF0aXZlKCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHByZXBhcmVFeHBhbmRlZEV4cHJlc3Npb24oIEFzc2VydGlvblJlc3VsdCYgcmVzdWx0ICkgY29uc3QgeworICAgICAgICAgICAgaWYoIHJlc3VsdC5pc09rKCkgKQorICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNjYXJkRGVjb21wb3NlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQuZXhwYW5kRGVjb21wb3NlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisgICAgICAgIHN0ZDo6dmVjdG9yPEFzc2VydGlvblN0YXRzPiBtX2Fzc2VydGlvbnM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFB0cjxTZWN0aW9uTm9kZT4gPiA+IG1fc2VjdGlvbnM7CisgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxUZXN0Q2FzZU5vZGU+ID4gbV90ZXN0Q2FzZXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxUZXN0R3JvdXBOb2RlPiA+IG1fdGVzdEdyb3VwczsKKworICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8VGVzdFJ1bk5vZGU+ID4gbV90ZXN0UnVuczsKKworICAgICAgICBQdHI8U2VjdGlvbk5vZGU+IG1fcm9vdFNlY3Rpb247CisgICAgICAgIFB0cjxTZWN0aW9uTm9kZT4gbV9kZWVwZXN0U2VjdGlvbjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFNlY3Rpb25Ob2RlPiA+IG1fc2VjdGlvblN0YWNrOworICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzIG1fcmVwb3J0ZXJQcmVmczsKKworICAgIH07CisKKyAgICB0ZW1wbGF0ZTxjaGFyIEM+CisgICAgY2hhciBjb25zdCogZ2V0TGluZU9mQ2hhcnMoKSB7CisgICAgICAgIHN0YXRpYyBjaGFyIGxpbmVbQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEhdID0gezB9OworICAgICAgICBpZiggISpsaW5lICkgeworICAgICAgICAgICAgc3RkOjptZW1zZXQoIGxpbmUsIEMsIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEgKTsKKyAgICAgICAgICAgIGxpbmVbQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMV0gPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaW5lOworICAgIH0KKworICAgIHN0cnVjdCBUZXN0RXZlbnRMaXN0ZW5lckJhc2UgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworICAgICAgICBUZXN0RXZlbnRMaXN0ZW5lckJhc2UoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApCisgICAgICAgIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9pbnRlcm5hbC9jYXRjaF9yZXBvcnRlcl9yZWdpc3RyYXJzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfUkVHSVNUUkFSU19IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgTGVnYWN5UmVwb3J0ZXJSZWdpc3RyYXIgeworCisgICAgICAgIGNsYXNzIFJlcG9ydGVyRmFjdG9yeSA6IHB1YmxpYyBJUmVwb3J0ZXJGYWN0b3J5IHsKKyAgICAgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMZWdhY3lSZXBvcnRlckFkYXB0ZXIoIG5ldyBUKCBjb25maWcgKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBUOjpnZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIExlZ2FjeVJlcG9ydGVyUmVnaXN0cmFyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyUmVwb3J0ZXIoIG5hbWUsIG5ldyBSZXBvcnRlckZhY3RvcnkoKSApOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgUmVwb3J0ZXJSZWdpc3RyYXIgeworCisgICAgICAgIGNsYXNzIFJlcG9ydGVyRmFjdG9yeSA6IHB1YmxpYyBTaGFyZWRJbXBsPElSZXBvcnRlckZhY3Rvcnk+IHsKKworICAgICAgICAgICAgLy8gKioqIFBsZWFzZSBOb3RlICoqKjoKKyAgICAgICAgICAgIC8vIC0gSWYgeW91IGVuZCB1cCBoZXJlIGxvb2tpbmcgYXQgYSBjb21waWxlciBlcnJvciBiZWNhdXNlIGl0J3MgdHJ5aW5nIHRvIHJlZ2lzdGVyCisgICAgICAgICAgICAvLyB5b3VyIGN1c3RvbSByZXBvcnRlciBjbGFzcyBiZSBhd2FyZSB0aGF0IHRoZSBuYXRpdmUgcmVwb3J0ZXIgaW50ZXJmYWNlIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAvLyB0byBJU3RyZWFtaW5nUmVwb3J0ZXIuIFRoZSAibGVnYWN5IiBpbnRlcmZhY2UsIElSZXBvcnRlciwgaXMgc3RpbGwgc3VwcG9ydGVkIHZpYQorICAgICAgICAgICAgLy8gYW4gYWRhcHRlci4gSnVzdCB1c2UgUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBhZGFwdGVyLgorICAgICAgICAgICAgLy8gSG93ZXZlciBwbGVhc2UgY29uc2lkZXIgdXBkYXRpbmcgdG8gdGhlIG5ldyBpbnRlcmZhY2UgYXMgdGhlIG9sZCBvbmUgaXMgbm93CisgICAgICAgICAgICAvLyBkZXByZWNhdGVkIGFuZCB3aWxsIHByb2JhYmx5IGJlIHJlbW92ZWQgcXVpdGUgc29vbiEKKyAgICAgICAgICAgIC8vIFBsZWFzZSBjb250YWN0IG1lIHZpYSBnaXRodWIgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBhdCBhbGwgYWJvdXQgdGhpcy4KKyAgICAgICAgICAgIC8vIEluIGZhY3QsIGlkZWFsbHksIHBsZWFzZSBjb250YWN0IG1lIGFueXdheSB0byBsZXQgbWUga25vdyB5b3UndmUgaGl0IHRoaXMgLSBhcyBJIGhhdmUKKyAgICAgICAgICAgIC8vIG5vIGlkZWEgd2hvIGlzIGFjdHVhbGx5IHVzaW5nIGN1c3RvbSByZXBvcnRlcnMgYXQgYWxsIChwb3NzaWJseSBuby1vbmUhKS4KKyAgICAgICAgICAgIC8vIFRoZSBuZXcgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIHRvIG1pbmltaXNlIGV4cG9zdXJlIHRvIGludGVyZmFjZSBjaGFuZ2VzIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVCggY29uZmlnICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFQ6OmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgUmVwb3J0ZXJSZWdpc3RyYXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJSZXBvcnRlciggbmFtZSwgbmV3IFJlcG9ydGVyRmFjdG9yeSgpICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBMaXN0ZW5lclJlZ2lzdHJhciB7CisKKyAgICAgICAgY2xhc3MgTGlzdGVuZXJGYWN0b3J5IDogcHVibGljIFNoYXJlZEltcGw8SVJlcG9ydGVyRmFjdG9yeT4geworCisgICAgICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVCggY29uZmlnICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIExpc3RlbmVyUmVnaXN0cmFyKCkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJMaXN0ZW5lciggbmV3IExpc3RlbmVyRmFjdG9yeSgpICk7CisgICAgICAgIH0KKyAgICB9OworfQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkxlZ2FjeVJlcG9ydGVyUmVnaXN0cmFyPHJlcG9ydGVyVHlwZT4gY2F0Y2hfaW50ZXJuYWxfUmVnaXN0cmFyRm9yIyNyZXBvcnRlclR5cGUoIG5hbWUgKTsgfQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6UmVwb3J0ZXJSZWdpc3RyYXI8cmVwb3J0ZXJUeXBlPiBjYXRjaF9pbnRlcm5hbF9SZWdpc3RyYXJGb3IjI3JlcG9ydGVyVHlwZSggbmFtZSApOyB9CisKKy8vIERlcHJlY2F0ZWQgLSB1c2UgdGhlIGZvcm0gd2l0aG91dCBJTlRFUk5BTF8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTElTVEVORVIoIGxpc3RlbmVyVHlwZSApIFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpMaXN0ZW5lclJlZ2lzdHJhcjxsaXN0ZW5lclR5cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjbGlzdGVuZXJUeXBlOyB9CisKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfTElTVEVORVIoIGxpc3RlbmVyVHlwZSApIFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpMaXN0ZW5lclJlZ2lzdHJhcjxsaXN0ZW5lclR5cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjbGlzdGVuZXJUeXBlOyB9CisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9pbnRlcm5hbC9jYXRjaF94bWx3cml0ZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9YTUxXUklURVJfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW9tYW5pcD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFhtbEVuY29kZSB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIEZvcldoYXQgeyBGb3JUZXh0Tm9kZXMsIEZvckF0dHJpYnV0ZXMgfTsKKworICAgICAgICBYbWxFbmNvZGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIEZvcldoYXQgZm9yV2hhdCA9IEZvclRleHROb2RlcyApCisgICAgICAgIDogICBtX3N0ciggc3RyICksCisgICAgICAgICAgICBtX2ZvcldoYXQoIGZvcldoYXQgKQorICAgICAgICB7fQorCisgICAgICAgIHZvaWQgZW5jb2RlVG8oIHN0ZDo6b3N0cmVhbSYgb3MgKSBjb25zdCB7CisKKyAgICAgICAgICAgIC8vIEFwb3N0cm9waGUgZXNjYXBpbmcgbm90IG5lY2Vzc2FyeSBpZiB3ZSBhbHdheXMgdXNlICIgdG8gd3JpdGUgYXR0cmlidXRlcworICAgICAgICAgICAgLy8gKHNlZTogaHR0cDovL3d3dy53My5vcmcvVFIveG1sLyNzeW50YXgpCisKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX3N0ci5zaXplKCk7ICsrIGkgKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gbV9zdHJbaV07CisgICAgICAgICAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICc8JzogICBvcyA8PCAiJmx0OyI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICcmJzogICBvcyA8PCAiJmFtcDsiOyBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZTogaHR0cDovL3d3dy53My5vcmcvVFIveG1sLyNzeW50YXgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpID4gMiAmJiBtX3N0cltpLTFdID09ICddJyAmJiBtX3N0cltpLTJdID09ICddJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgIiZndDsiOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8IGM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbV9mb3JXaGF0ID09IEZvckF0dHJpYnV0ZXMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8ICImcXVvdDsiOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8IGM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXNjYXBlIGNvbnRyb2wgY2hhcnMgLSBiYXNlZCBvbiBjb250cmlidXRpb24gYnkgQGVzcGVuYWxiIGluIFBSICM0NjUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBieSBAbXJwaSBQUiAjNTg4CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICggYyA+PSAwICYmIGMgPCAnXHgwOScgKSB8fCAoIGMgPiAnXHgwRCcgJiYgYyA8ICdceDIwJykgfHwgYz09J1x4N0YnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwNDEwNy93aHktYXJlLWNvbnRyb2wtY2hhcmFjdGVycy1pbGxlZ2FsLWluLXhtbC0xLTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCAiXFx4IiA8PCBzdGQ6OnVwcGVyY2FzZSA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KCBjICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIFhtbEVuY29kZSBjb25zdCYgeG1sRW5jb2RlICkgeworICAgICAgICAgICAgeG1sRW5jb2RlLmVuY29kZVRvKCBvcyApOworICAgICAgICAgICAgcmV0dXJuIG9zOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBtX3N0cjsKKyAgICAgICAgRm9yV2hhdCBtX2ZvcldoYXQ7CisgICAgfTsKKworICAgIGNsYXNzIFhtbFdyaXRlciB7CisgICAgcHVibGljOgorCisgICAgICAgIGNsYXNzIFNjb3BlZEVsZW1lbnQgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBTY29wZWRFbGVtZW50KCBYbWxXcml0ZXIqIHdyaXRlciApCisgICAgICAgICAgICA6ICAgbV93cml0ZXIoIHdyaXRlciApCisgICAgICAgICAgICB7fQorCisgICAgICAgICAgICBTY29wZWRFbGVtZW50KCBTY29wZWRFbGVtZW50IGNvbnN0JiBvdGhlciApCisgICAgICAgICAgICA6ICAgbV93cml0ZXIoIG90aGVyLm1fd3JpdGVyICl7CisgICAgICAgICAgICAgICAgb3RoZXIubV93cml0ZXIgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB+U2NvcGVkRWxlbWVudCgpIHsKKyAgICAgICAgICAgICAgICBpZiggbV93cml0ZXIgKQorICAgICAgICAgICAgICAgICAgICBtX3dyaXRlci0+ZW5kRWxlbWVudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTY29wZWRFbGVtZW50JiB3cml0ZVRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0LCBib29sIGluZGVudCA9IHRydWUgKSB7CisgICAgICAgICAgICAgICAgbV93cml0ZXItPndyaXRlVGV4dCggdGV4dCwgaW5kZW50ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICAgICAgU2NvcGVkRWxlbWVudCYgd3JpdGVBdHRyaWJ1dGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBUIGNvbnN0JiBhdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICAgICAgbV93cml0ZXItPndyaXRlQXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIG11dGFibGUgWG1sV3JpdGVyKiBtX3dyaXRlcjsKKyAgICAgICAgfTsKKworICAgICAgICBYbWxXcml0ZXIoKQorICAgICAgICA6ICAgbV90YWdJc09wZW4oIGZhbHNlICksCisgICAgICAgICAgICBtX25lZWRzTmV3bGluZSggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fb3MoIENhdGNoOjpjb3V0KCkgKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZURlY2xhcmF0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXIoIHN0ZDo6b3N0cmVhbSYgb3MgKQorICAgICAgICA6ICAgbV90YWdJc09wZW4oIGZhbHNlICksCisgICAgICAgICAgICBtX25lZWRzTmV3bGluZSggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fb3MoIG9zICkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVEZWNsYXJhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgflhtbFdyaXRlcigpIHsKKyAgICAgICAgICAgIHdoaWxlKCAhbV90YWdzLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIGVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgc3RhcnRFbGVtZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgbmV3bGluZUlmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICBtX29zIDw8IG1faW5kZW50IDw8ICc8JyA8PCBuYW1lOworICAgICAgICAgICAgbV90YWdzLnB1c2hfYmFjayggbmFtZSApOworICAgICAgICAgICAgbV9pbmRlbnQgKz0gIiAgIjsKKyAgICAgICAgICAgIG1fdGFnSXNPcGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFNjb3BlZEVsZW1lbnQgc2NvcGVkRWxlbWVudCggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKSB7CisgICAgICAgICAgICBTY29wZWRFbGVtZW50IHNjb3BlZCggdGhpcyApOworICAgICAgICAgICAgc3RhcnRFbGVtZW50KCBuYW1lICk7CisgICAgICAgICAgICByZXR1cm4gc2NvcGVkOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiBlbmRFbGVtZW50KCkgeworICAgICAgICAgICAgbmV3bGluZUlmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICBtX2luZGVudCA9IG1faW5kZW50LnN1YnN0ciggMCwgbV9pbmRlbnQuc2l6ZSgpLTIgKTsKKyAgICAgICAgICAgIGlmKCBtX3RhZ0lzT3BlbiApIHsKKyAgICAgICAgICAgICAgICBtX29zIDw8ICIvPiI7CisgICAgICAgICAgICAgICAgbV90YWdJc09wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQgPDwgIjwvIiA8PCBtX3RhZ3MuYmFjaygpIDw8ICI+IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fb3MgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgbV90YWdzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgc3RkOjpzdHJpbmcgY29uc3QmIGF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgIGlmKCAhbmFtZS5lbXB0eSgpICYmICFhdHRyaWJ1dGUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV9vcyA8PCAnICcgPDwgbmFtZSA8PCAiPVwiIiA8PCBYbWxFbmNvZGUoIGF0dHJpYnV0ZSwgWG1sRW5jb2RlOjpGb3JBdHRyaWJ1dGVzICkgPDwgJyInOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIGJvb2wgYXR0cmlidXRlICkgeworICAgICAgICAgICAgbV9vcyA8PCAnICcgPDwgbmFtZSA8PCAiPVwiIiA8PCAoIGF0dHJpYnV0ZSA/ICJ0cnVlIiA6ICJmYWxzZSIgKSA8PCAnIic7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBYbWxXcml0ZXImIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgVCBjb25zdCYgYXR0cmlidXRlICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCBhdHRyaWJ1dGU7CisgICAgICAgICAgICByZXR1cm4gd3JpdGVBdHRyaWJ1dGUoIG5hbWUsIG9zcy5zdHIoKSApOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZVRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0LCBib29sIGluZGVudCA9IHRydWUgKSB7CisgICAgICAgICAgICBpZiggIXRleHQuZW1wdHkoKSApeworICAgICAgICAgICAgICAgIGJvb2wgdGFnV2FzT3BlbiA9IG1fdGFnSXNPcGVuOworICAgICAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgICAgIGlmKCB0YWdXYXNPcGVuICYmIGluZGVudCApCisgICAgICAgICAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQ7CisgICAgICAgICAgICAgICAgbV9vcyA8PCBYbWxFbmNvZGUoIHRleHQgKTsKKyAgICAgICAgICAgICAgICBtX25lZWRzTmV3bGluZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQ29tbWVudCggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKSB7CisgICAgICAgICAgICBlbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQgPDwgIjwhLS0iIDw8IHRleHQgPDwgIi0tPiI7CisgICAgICAgICAgICBtX25lZWRzTmV3bGluZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlU3R5bGVzaGVldFJlZiggc3RkOjpzdHJpbmcgY29uc3QmIHVybCApIHsKKyAgICAgICAgICAgIG1fb3MgPDwgIjw/eG1sLXN0eWxlc2hlZXQgdHlwZT1cInRleHQveHNsXCIgaHJlZj1cIiIgPDwgdXJsIDw8ICJcIj8+XG4iOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUJsYW5rTGluZSgpIHsKKyAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgbV9vcyA8PCAnXG4nOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBlbnN1cmVUYWdDbG9zZWQoKSB7CisgICAgICAgICAgICBpZiggbV90YWdJc09wZW4gKSB7CisgICAgICAgICAgICAgICAgbV9vcyA8PCAiPiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIG1fdGFnSXNPcGVuID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFhtbFdyaXRlciggWG1sV3JpdGVyIGNvbnN0JiApOworICAgICAgICB2b2lkIG9wZXJhdG9yPSggWG1sV3JpdGVyIGNvbnN0JiApOworCisgICAgICAgIHZvaWQgd3JpdGVEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgICAgIG1fb3MgPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgbmV3bGluZUlmTmVjZXNzYXJ5KCkgeworICAgICAgICAgICAgaWYoIG1fbmVlZHNOZXdsaW5lICkgeworICAgICAgICAgICAgICAgIG1fb3MgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sIG1fdGFnSXNPcGVuOworICAgICAgICBib29sIG1fbmVlZHNOZXdsaW5lOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV90YWdzOworICAgICAgICBzdGQ6OnN0cmluZyBtX2luZGVudDsKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBtX29zOworICAgIH07CisKK30KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZWVuYWJsZV93YXJuaW5ncy5oCisKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFRU5BQkxFX1dBUk5JTkdTX0hfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworIyAgICBpZmRlZiBfX0lDQyAvLyBpY3BjIGRlZmluZXMgdGhlIF9fY2xhbmdfXyBtYWNybworIyAgICAgICAgcHJhZ21hIHdhcm5pbmcocG9wKQorIyAgICBlbHNlCisjICAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyMgICAgZW5kaWYKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBjbGFzcyBYbWxSZXBvcnRlciA6IHB1YmxpYyBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgWG1sUmVwb3J0ZXIoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApLAorICAgICAgICAgICAgbV94bWwoX2NvbmZpZy5zdHJlYW0oKSksCisgICAgICAgICAgICBtX3NlY3Rpb25EZXB0aCggMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5YbWxSZXBvcnRlcigpIENBVENIX09WRVJSSURFOworCisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0IHJlc3VsdHMgYXMgYW4gWE1MIGRvY3VtZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0U3R5bGVzaGVldFJlZigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVNvdXJjZUluZm8oIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBzb3VyY2VJbmZvICkgeworICAgICAgICAgICAgbV94bWwKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJmaWxlbmFtZSIsIHNvdXJjZUluZm8uZmlsZSApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibGluZSIsIHNvdXJjZUluZm8ubGluZSApOworICAgICAgICB9CisKKyAgICBwdWJsaWM6IC8vIFN0cmVhbWluZ1JlcG9ydGVyQmFzZQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgcyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6bm9NYXRjaGluZ1Rlc3RDYXNlcyggcyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuU3RhcnRpbmcoIHRlc3RJbmZvICk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdHlsZXNoZWV0UmVmID0gZ2V0U3R5bGVzaGVldFJlZigpOworICAgICAgICAgICAgaWYoICFzdHlsZXNoZWV0UmVmLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1feG1sLndyaXRlU3R5bGVzaGVldFJlZiggc3R5bGVzaGVldFJlZiApOworICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiQ2F0Y2giICk7CisgICAgICAgICAgICBpZiggIW1fY29uZmlnLT5uYW1lKCkuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgbV9jb25maWctPm5hbWUoKSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdEdyb3VwU3RhcnRpbmcoIGdyb3VwSW5mbyApOworICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiR3JvdXAiICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgZ3JvdXBJbmZvLm5hbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0Q2FzZVN0YXJ0aW5nKHRlc3RJbmZvKTsKKyAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIlRlc3RDYXNlIiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIHRyaW0oIHRlc3RJbmZvLm5hbWUgKSApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZGVzY3JpcHRpb24iLCB0ZXN0SW5mby5kZXNjcmlwdGlvbiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAidGFncyIsIHRlc3RJbmZvLnRhZ3NBc1N0cmluZyApOworCisgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHRlc3RJbmZvLmxpbmVJbmZvICk7CisKKyAgICAgICAgICAgIGlmICggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKQorICAgICAgICAgICAgICAgIG1fdGVzdENhc2VUaW1lci5zdGFydCgpOworICAgICAgICAgICAgbV94bWwuZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25TdGFydGluZyggc2VjdGlvbkluZm8gKTsKKyAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25EZXB0aCsrID4gMCApIHsKKyAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJTZWN0aW9uIiApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCB0cmltKCBzZWN0aW9uSW5mby5uYW1lICkgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJkZXNjcmlwdGlvbiIsIHNlY3Rpb25JbmZvLmRlc2NyaXB0aW9uICk7CisgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCBzZWN0aW9uSW5mby5saW5lSW5mbyApOworICAgICAgICAgICAgICAgIG1feG1sLmVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHsgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworCisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdDsKKworICAgICAgICAgICAgYm9vbCBpbmNsdWRlUmVzdWx0cyA9IG1fY29uZmlnLT5pbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSB8fCAhcmVzdWx0LmlzT2soKTsKKworICAgICAgICAgICAgaWYoIGluY2x1ZGVSZXN1bHRzICkgeworICAgICAgICAgICAgICAgIC8vIFByaW50IGFueSBpbmZvIG1lc3NhZ2VzIGluIDxJbmZvPiB0YWdzLgorICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpLCBpdEVuZCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGl0LT50eXBlID09IFJlc3VsdFdhczo6SW5mbyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJJbmZvIiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIGl0LT5tZXNzYWdlICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGl0LT50eXBlID09IFJlc3VsdFdhczo6V2FybmluZyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJXYXJuaW5nIiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIGl0LT5tZXNzYWdlICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERyb3Agb3V0IGlmIHJlc3VsdCB3YXMgc3VjY2Vzc2Z1bCBidXQgd2UncmUgbm90IHByaW50aW5nIHRoZW0uCisgICAgICAgICAgICBpZiggIWluY2x1ZGVSZXN1bHRzICYmIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgIT0gUmVzdWx0V2FzOjpXYXJuaW5nICkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgLy8gUHJpbnQgdGhlIGV4cHJlc3Npb24gaWYgdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRXhwcmVzc2lvbiIgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzIiwgcmVzdWx0LnN1Y2NlZWRlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAidHlwZSIsIHJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCkgKTsKKworICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUluZm8oKSApOworCisgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIk9yaWdpbmFsIiApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIHJlc3VsdC5nZXRFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiRXhwYW5kZWQiICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFuZC4uLiBQcmludCBhIHJlc3VsdCBhcHBsaWNhYmxlIHRvIGVhY2ggcmVzdWx0IHR5cGUuCisgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJFeGNlcHRpb24iICk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUluZm8oKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC53cml0ZVRleHQoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRmF0YWxFcnJvckNvbmRpdGlvbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiSW5mbyIgKQorICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgLy8gV2FybmluZyB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZToKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRmFpbHVyZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApCisgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uRW5kZWQoIHNlY3Rpb25TdGF0cyApOworICAgICAgICAgICAgaWYoIC0tbV9zZWN0aW9uRGVwdGggPiAwICkgeworICAgICAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0gbV94bWwuc2NvcGVkRWxlbWVudCggIk92ZXJhbGxSZXN1bHRzIiApOworICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzZXMiLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucy5wYXNzZWQgKTsKKyAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucy5mYWlsZWQgKTsKKyAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHNlY3Rpb25TdGF0cy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzICkKKyAgICAgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggImR1cmF0aW9uSW5TZWNvbmRzIiwgc2VjdGlvblN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzICk7CisKKyAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyApOworICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdCIgKTsKKyAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzIiwgdGVzdENhc2VTdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5hbGxPaygpICk7CisKKyAgICAgICAgICAgIGlmICggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKQorICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJkdXJhdGlvbkluU2Vjb25kcyIsIG1fdGVzdENhc2VUaW1lci5nZXRFbGFwc2VkU2Vjb25kcygpICk7CisKKyAgICAgICAgICAgIGlmKCAhdGVzdENhc2VTdGF0cy5zdGRPdXQuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIlN0ZE91dCIgKS53cml0ZVRleHQoIHRyaW0oIHRlc3RDYXNlU3RhdHMuc3RkT3V0ICksIGZhbHNlICk7CisgICAgICAgICAgICBpZiggIXRlc3RDYXNlU3RhdHMuc3RkRXJyLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJTdGRFcnIiICkud3JpdGVUZXh0KCB0cmltKCB0ZXN0Q2FzZVN0YXRzLnN0ZEVyciApLCBmYWxzZSApOworCisgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdEdyb3VwRW5kZWQoIHRlc3RHcm91cFN0YXRzICk7CisgICAgICAgICAgICAvLyBUT0RPOiBDaGVjayB0ZXN0R3JvdXBTdGF0cy5hYm9ydGluZyBhbmQgYWN0IGFjY29yZGluZ2x5LgorICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIk92ZXJhbGxSZXN1bHRzIiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAic3VjY2Vzc2VzIiwgdGVzdEdyb3VwU3RhdHMudG90YWxzLmFzc2VydGlvbnMucGFzc2VkICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHRlc3RHcm91cFN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHRlc3RHcm91cFN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICk7CisgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdFJ1bkVuZGVkKCB0ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0cyIgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3NlcyIsIHRlc3RSdW5TdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImZhaWx1cmVzIiwgdGVzdFJ1blN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHRlc3RSdW5TdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApOworICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBUaW1lciBtX3Rlc3RDYXNlVGltZXI7CisgICAgICAgIFhtbFdyaXRlciBtX3htbDsKKyAgICAgICAgaW50IG1fc2VjdGlvbkRlcHRoOworICAgIH07CisKKyAgICAgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoICJ4bWwiLCBYbWxSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX2p1bml0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfSlVOSVRfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEN1cnJlbnRUaW1lc3RhbXAoKSB7CisgICAgICAgICAgICAvLyBCZXdhcmUsIHRoaXMgaXMgbm90IHJlZW50cmFudCBiZWNhdXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWVzCisgICAgICAgICAgICAvLyBBbHNvLCBVVEMgb25seSwgYWdhaW4gYmVjYXVzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICgleiBpcyBDKysxMSkKKyAgICAgICAgICAgIHRpbWVfdCByYXd0aW1lOworICAgICAgICAgICAgc3RkOjp0aW1lKCZyYXd0aW1lKTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCB0aW1lU3RhbXBTaXplID0gc2l6ZW9mKCIyMDE3LTAxLTE2VDE3OjA2OjQ1WiIpOworCisjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgICAgIHN0ZDo6dG0gdGltZUluZm8gPSB7fTsKKyAgICAgICAgICAgIGdtdGltZV9zKCZ0aW1lSW5mbywgJnJhd3RpbWUpOworI2Vsc2UKKyAgICAgICAgICAgIHN0ZDo6dG0qIHRpbWVJbmZvOworICAgICAgICAgICAgdGltZUluZm8gPSBzdGQ6OmdtdGltZSgmcmF3dGltZSk7CisjZW5kaWYKKworICAgICAgICAgICAgY2hhciB0aW1lU3RhbXBbdGltZVN0YW1wU2l6ZV07CisgICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3QgZm10ID0gIiVZLSVtLSVkVCVIOiVNOiVTWiI7CisKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgICAgc3RkOjpzdHJmdGltZSh0aW1lU3RhbXAsIHRpbWVTdGFtcFNpemUsIGZtdCwgJnRpbWVJbmZvKTsKKyNlbHNlCisgICAgICAgICAgICBzdGQ6OnN0cmZ0aW1lKHRpbWVTdGFtcCwgdGltZVN0YW1wU2l6ZSwgZm10LCB0aW1lSW5mbyk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyh0aW1lU3RhbXApOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBjbGFzcyBKdW5pdFJlcG9ydGVyIDogcHVibGljIEN1bXVsYXRpdmVSZXBvcnRlckJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgSnVuaXRSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSggX2NvbmZpZyApLAorICAgICAgICAgICAgeG1sKCBfY29uZmlnLnN0cmVhbSgpICksCisgICAgICAgICAgICBtX29rVG9GYWlsKCBmYWxzZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5KdW5pdFJlcG9ydGVyKCkgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBpbiBhbiBYTUwgZm9ybWF0IHRoYXQgbG9va3MgbGlrZSBBbnQncyBqdW5pdHJlcG9ydCB0YXJnZXQiOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiAvKnNwZWMqLyApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHJ1bkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuU3RhcnRpbmcoIHJ1bkluZm8gKTsKKyAgICAgICAgICAgIHhtbC5zdGFydEVsZW1lbnQoICJ0ZXN0c3VpdGVzIiApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHN1aXRlVGltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIHN0ZE91dEZvclN1aXRlLnN0cigiIik7CisgICAgICAgICAgICBzdGRFcnJGb3JTdWl0ZS5zdHIoIiIpOworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbnMgPSAwOworICAgICAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdEdyb3VwU3RhcnRpbmcoIGdyb3VwSW5mbyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9va1RvRmFpbCA9IHRlc3RDYXNlSW5mby5va1RvRmFpbCgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgPT0gUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbiAmJiAhbV9va1RvRmFpbCApCisgICAgICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbnMrKzsKKyAgICAgICAgICAgIHJldHVybiBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjphc3NlcnRpb25FbmRlZCggYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgc3RkT3V0Rm9yU3VpdGUgPDwgdGVzdENhc2VTdGF0cy5zdGRPdXQ7CisgICAgICAgICAgICBzdGRFcnJGb3JTdWl0ZSA8PCB0ZXN0Q2FzZVN0YXRzLnN0ZEVycjsKKyAgICAgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RDYXNlRW5kZWQoIHRlc3RDYXNlU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgZG91YmxlIHN1aXRlVGltZSA9IHN1aXRlVGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKTsKKyAgICAgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RHcm91cEVuZGVkKCB0ZXN0R3JvdXBTdGF0cyApOworICAgICAgICAgICAgd3JpdGVHcm91cCggKm1fdGVzdEdyb3Vwcy5iYWNrKCksIHN1aXRlVGltZSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZEN1bXVsYXRpdmUoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICB4bWwuZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUdyb3VwKCBUZXN0R3JvdXBOb2RlIGNvbnN0JiBncm91cE5vZGUsIGRvdWJsZSBzdWl0ZVRpbWUgKSB7CisgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IHhtbC5zY29wZWRFbGVtZW50KCAidGVzdHN1aXRlIiApOworICAgICAgICAgICAgVGVzdEdyb3VwU3RhdHMgY29uc3QmIHN0YXRzID0gZ3JvdXBOb2RlLnZhbHVlOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIHN0YXRzLmdyb3VwSW5mby5uYW1lICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJlcnJvcnMiLCB1bmV4cGVjdGVkRXhjZXB0aW9ucyApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCBzdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQtdW5leHBlY3RlZEV4Y2VwdGlvbnMgKTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInRlc3RzIiwgc3RhdHMudG90YWxzLmFzc2VydGlvbnMudG90YWwoKSApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiaG9zdG5hbWUiLCAidGJkIiApOyAvLyAhVEJECisgICAgICAgICAgICBpZiggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpOZXZlciApCisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsICIiICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsIHN1aXRlVGltZSApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZXN0YW1wIiwgZ2V0Q3VycmVudFRpbWVzdGFtcCgpICk7CisKKyAgICAgICAgICAgIC8vIFdyaXRlIHRlc3QgY2FzZXMKKyAgICAgICAgICAgIGZvciggVGVzdEdyb3VwTm9kZTo6Q2hpbGROb2Rlczo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBncm91cE5vZGUuY2hpbGRyZW4uYmVnaW4oKSwgaXRFbmQgPSBncm91cE5vZGUuY2hpbGRyZW4uZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICB3cml0ZVRlc3RDYXNlKCAqKml0ICk7CisKKyAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLW91dCIgKS53cml0ZVRleHQoIHRyaW0oIHN0ZE91dEZvclN1aXRlLnN0cigpICksIGZhbHNlICk7CisgICAgICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5c3RlbS1lcnIiICkud3JpdGVUZXh0KCB0cmltKCBzdGRFcnJGb3JTdWl0ZS5zdHIoKSApLCBmYWxzZSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVRlc3RDYXNlKCBUZXN0Q2FzZU5vZGUgY29uc3QmIHRlc3RDYXNlTm9kZSApIHsKKyAgICAgICAgICAgIFRlc3RDYXNlU3RhdHMgY29uc3QmIHN0YXRzID0gdGVzdENhc2VOb2RlLnZhbHVlOworCisgICAgICAgICAgICAvLyBBbGwgdGVzdCBjYXNlcyBoYXZlIGV4YWN0bHkgb25lIHNlY3Rpb24gLSB3aGljaCByZXByZXNlbnRzIHRoZQorICAgICAgICAgICAgLy8gdGVzdCBjYXNlIGl0c2VsZi4gVGhhdCBzZWN0aW9uIG1heSBoYXZlIDAtbiBuZXN0ZWQgc2VjdGlvbnMKKyAgICAgICAgICAgIGFzc2VydCggdGVzdENhc2VOb2RlLmNoaWxkcmVuLnNpemUoKSA9PSAxICk7CisgICAgICAgICAgICBTZWN0aW9uTm9kZSBjb25zdCYgcm9vdFNlY3Rpb24gPSAqdGVzdENhc2VOb2RlLmNoaWxkcmVuLmZyb250KCk7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsYXNzTmFtZSA9IHN0YXRzLnRlc3RJbmZvLmNsYXNzTmFtZTsKKworICAgICAgICAgICAgaWYoIGNsYXNzTmFtZS5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIGlmKCByb290U2VjdGlvbi5jaGlsZFNlY3Rpb25zLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAiZ2xvYmFsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlU2VjdGlvbiggY2xhc3NOYW1lLCAiIiwgcm9vdFNlY3Rpb24gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVTZWN0aW9uKCAgc3RkOjpzdHJpbmcgY29uc3QmIGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgcm9vdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbk5vZGUgY29uc3QmIHNlY3Rpb25Ob2RlICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHRyaW0oIHNlY3Rpb25Ob2RlLnN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgKTsKKyAgICAgICAgICAgIGlmKCAhcm9vdE5hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbmFtZSA9IHJvb3ROYW1lICsgJy8nICsgbmFtZTsKKworICAgICAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5hc3NlcnRpb25zLmVtcHR5KCkgfHwKKyAgICAgICAgICAgICAgICAhc2VjdGlvbk5vZGUuc3RkT3V0LmVtcHR5KCkgfHwKKyAgICAgICAgICAgICAgICAhc2VjdGlvbk5vZGUuc3RkRXJyLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSB4bWwuc2NvcGVkRWxlbWVudCggInRlc3RjYXNlIiApOworICAgICAgICAgICAgICAgIGlmKCBjbGFzc05hbWUuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiY2xhc3NuYW1lIiwgbmFtZSApOworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgInJvb3QiICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJjbGFzc25hbWUiLCBjbGFzc05hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIG5hbWUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsIENhdGNoOjp0b1N0cmluZyggc2VjdGlvbk5vZGUuc3RhdHMuZHVyYXRpb25JblNlY29uZHMgKSApOworCisgICAgICAgICAgICAgICAgd3JpdGVBc3NlcnRpb25zKCBzZWN0aW9uTm9kZSApOworCisgICAgICAgICAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5zdGRPdXQuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLW91dCIgKS53cml0ZVRleHQoIHRyaW0oIHNlY3Rpb25Ob2RlLnN0ZE91dCApLCBmYWxzZSApOworICAgICAgICAgICAgICAgIGlmKCAhc2VjdGlvbk5vZGUuc3RkRXJyLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5c3RlbS1lcnIiICkud3JpdGVUZXh0KCB0cmltKCBzZWN0aW9uTm9kZS5zdGRFcnIgKSwgZmFsc2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciggU2VjdGlvbk5vZGU6OkNoaWxkU2VjdGlvbnM6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIGl0ID0gc2VjdGlvbk5vZGUuY2hpbGRTZWN0aW9ucy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IHNlY3Rpb25Ob2RlLmNoaWxkU2VjdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICBpZiggY2xhc3NOYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB3cml0ZVNlY3Rpb24oIG5hbWUsICIiLCAqKml0ICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZVNlY3Rpb24oIGNsYXNzTmFtZSwgbmFtZSwgKippdCApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUFzc2VydGlvbnMoIFNlY3Rpb25Ob2RlIGNvbnN0JiBzZWN0aW9uTm9kZSApIHsKKyAgICAgICAgICAgIGZvciggU2VjdGlvbk5vZGU6OkFzc2VydGlvbnM6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIGl0ID0gc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5iZWdpbigpLCBpdEVuZCA9IHNlY3Rpb25Ob2RlLmFzc2VydGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICB3cml0ZUFzc2VydGlvbiggKml0ICk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCB3cml0ZUFzc2VydGlvbiggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIHN0YXRzICkgeworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgPSBzdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisgICAgICAgICAgICBpZiggIXJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZWxlbWVudE5hbWU7CisgICAgICAgICAgICAgICAgc3dpdGNoKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJmYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgc2VlIHRoZXNlIGhlcmU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Ok9rOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VW5rbm93bjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJpbnRlcm5hbEVycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0geG1sLnNjb3BlZEVsZW1lbnQoIGVsZW1lbnROYW1lICk7CisKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJtZXNzYWdlIiwgcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpICk7CisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidHlwZSIsIHJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCkgKTsKKworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICAgICAgaWYoICFyZXN1bHQuZ2V0TWVzc2FnZSgpLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBvc3MgPDwgcmVzdWx0LmdldE1lc3NhZ2UoKSA8PCAnXG4nOworICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgaXQgPSBzdGF0cy5pbmZvTWVzc2FnZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gc3RhdHMuaW5mb01lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgICAgICBpZiggaXQtPnR5cGUgPT0gUmVzdWx0V2FzOjpJbmZvICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCBpdC0+bWVzc2FnZSA8PCAnXG4nOworCisgICAgICAgICAgICAgICAgb3NzIDw8ICJhdCAiIDw8IHJlc3VsdC5nZXRTb3VyY2VJbmZvKCk7CisgICAgICAgICAgICAgICAgeG1sLndyaXRlVGV4dCggb3NzLnN0cigpLCBmYWxzZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyIHhtbDsKKyAgICAgICAgVGltZXIgc3VpdGVUaW1lcjsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0ZE91dEZvclN1aXRlOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RkRXJyRm9yU3VpdGU7CisgICAgICAgIHVuc2lnbmVkIGludCB1bmV4cGVjdGVkRXhjZXB0aW9uczsKKyAgICAgICAgYm9vbCBtX29rVG9GYWlsOworICAgIH07CisKKyAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggImp1bml0IiwgSnVuaXRSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX2NvbnNvbGUuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9DT05TT0xFX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y2Zsb2F0PgorI2luY2x1ZGUgPGNzdGRpbz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb25zb2xlUmVwb3J0ZXIgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworICAgICAgICBDb25zb2xlUmVwb3J0ZXIoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApLAorICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkKCBmYWxzZSApCisgICAgICAgIHt9CisKKyAgICAgICAgdmlydHVhbCB+Q29uc29sZVJlcG9ydGVyKCkgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0IHJlc3VsdHMgYXMgcGxhaW4gbGluZXMgb2YgdGV4dCI7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBzdHJlYW0gPDwgIk5vIHRlc3QgY2FzZXMgbWF0Y2hlZCAnIiA8PCBzcGVjIDw8ICdcJycgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9hc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ID0gX2Fzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdDsKKworICAgICAgICAgICAgYm9vbCBpbmNsdWRlUmVzdWx0cyA9IG1fY29uZmlnLT5pbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSB8fCAhcmVzdWx0LmlzT2soKTsKKworICAgICAgICAgICAgLy8gRHJvcCBvdXQgaWYgcmVzdWx0IHdhcyBzdWNjZXNzZnVsIGJ1dCB3ZSdyZSBub3QgcHJpbnRpbmcgdGhlbS4KKyAgICAgICAgICAgIGlmKCAhaW5jbHVkZVJlc3VsdHMgJiYgcmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgbGF6eVByaW50KCk7CisKKyAgICAgICAgICAgIEFzc2VydGlvblByaW50ZXIgcHJpbnRlciggc3RyZWFtLCBfYXNzZXJ0aW9uU3RhdHMsIGluY2x1ZGVSZXN1bHRzICk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCk7CisgICAgICAgICAgICBzdHJlYW0gPDwgc3RkOjplbmRsOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25TdGFydGluZyggX3NlY3Rpb25JbmZvICk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBfc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIF9zZWN0aW9uU3RhdHMubWlzc2luZ0Fzc2VydGlvbnMgKSB7CisgICAgICAgICAgICAgICAgbGF6eVByaW50KCk7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggQ29sb3VyOjpSZXN1bHRFcnJvciApOworICAgICAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25TdGFjay5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJcbk5vIGFzc2VydGlvbnMgaW4gc2VjdGlvbiI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIlxuTm8gYXNzZXJ0aW9ucyBpbiB0ZXN0IGNhc2UiOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICciIDw8IF9zZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSA8PCAiJ1xuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGdldEZvcm1hdHRlZER1cmF0aW9uKF9zZWN0aW9uU3RhdHMuZHVyYXRpb25JblNlY29uZHMpIDw8ICIgczogIiA8PCBfc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIG1faGVhZGVyUHJpbnRlZCApIHsKKyAgICAgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvbkVuZGVkKCBfc2VjdGlvblN0YXRzICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgX3Rlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RDYXNlRW5kZWQoIF90ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiBfdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiggY3VycmVudEdyb3VwSW5mby51c2VkICkgeworICAgICAgICAgICAgICAgIHByaW50U3VtbWFyeURpdmlkZXIoKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIlN1bW1hcnkgZm9yIGdyb3VwICciIDw8IF90ZXN0R3JvdXBTdGF0cy5ncm91cEluZm8ubmFtZSA8PCAiJzpcbiI7CisgICAgICAgICAgICAgICAgcHJpbnRUb3RhbHMoIF90ZXN0R3JvdXBTdGF0cy50b3RhbHMgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RHcm91cEVuZGVkKCBfdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIF90ZXN0UnVuU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBwcmludFRvdGFsc0RpdmlkZXIoIF90ZXN0UnVuU3RhdHMudG90YWxzICk7CisgICAgICAgICAgICBwcmludFRvdGFscyggX3Rlc3RSdW5TdGF0cy50b3RhbHMgKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5FbmRlZCggX3Rlc3RSdW5TdGF0cyApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIGNsYXNzIEFzc2VydGlvblByaW50ZXIgeworICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0gKCBBc3NlcnRpb25QcmludGVyIGNvbnN0JiApOworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBc3NlcnRpb25QcmludGVyKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIEFzc2VydGlvblN0YXRzIGNvbnN0JiBfc3RhdHMsIGJvb2wgX3ByaW50SW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgIDogICBzdHJlYW0oIF9zdHJlYW0gKSwKKyAgICAgICAgICAgICAgICBzdGF0cyggX3N0YXRzICksCisgICAgICAgICAgICAgICAgcmVzdWx0KCBfc3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICksCisgICAgICAgICAgICAgICAgY29sb3VyKCBDb2xvdXI6Ok5vbmUgKSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlKCByZXN1bHQuZ2V0TWVzc2FnZSgpICksCisgICAgICAgICAgICAgICAgbWVzc2FnZXMoIF9zdGF0cy5pbmZvTWVzc2FnZXMgKSwKKyAgICAgICAgICAgICAgICBwcmludEluZm9NZXNzYWdlcyggX3ByaW50SW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpPazoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6U3VjY2VzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiUEFTU0VEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYoIHJlc3VsdC5oYXNNZXNzYWdlKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpTdWNjZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIC0gYnV0IHdhcyBvayI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAid2l0aCBtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImR1ZSB0byB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3aXRoICI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgKz0gIm1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgKz0gIm1lc3NhZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZHVlIHRvIGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiYmVjYXVzZSBubyBleGNlcHRpb24gd2FzIHRocm93biB3aGVyZSBvbmUgd2FzIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJpbmZvIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3YXJuaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZXhwbGljaXRseSB3aXRoIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImV4cGxpY2l0bHkgd2l0aCBtZXNzYWdlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgY2FzZXMgYXJlIGhlcmUgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VW5rbm93bjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIioqIGludGVybmFsIGVycm9yICoqIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnQoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcHJpbnRTb3VyY2VJbmZvKCk7CisgICAgICAgICAgICAgICAgaWYoIHN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgPiAwICkgeworICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgdm9pZCBwcmludFJlc3VsdFR5cGUoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoICFwYXNzT3JGYWlsLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggY29sb3VyICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBwYXNzT3JGYWlsIDw8ICI6XG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpPcmlnaW5hbEV4cHJlc3Npb24gKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtICA8PCAiICAiOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldEV4cHJlc3Npb25Jbk1hY3JvKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cGFuZGVkRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIndpdGggZXhwYW5zaW9uOlxuIjsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OlJlY29uc3RydWN0ZWRFeHByZXNzaW9uICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBUZXh0KCByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCksIFRleHRBdHRyaWJ1dGVzKCkuc2V0SW5kZW50KDIpICkgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHByaW50TWVzc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIW1lc3NhZ2VMYWJlbC5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IG1lc3NhZ2VMYWJlbCA8PCAnOicgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZXNzYWdlcy5iZWdpbigpLCBpdEVuZCA9IG1lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGFzc2VydGlvbiBpcyBhIHdhcm5pbmcgaWdub3JlIGFueSBJTkZPIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgIGlmKCBwcmludEluZm9NZXNzYWdlcyB8fCBpdC0+dHlwZSAhPSBSZXN1bHRXYXM6OkluZm8gKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IFRleHQoIGl0LT5tZXNzYWdlLCBUZXh0QXR0cmlidXRlcygpLnNldEluZGVudCgyKSApIDw8ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBwcmludFNvdXJjZUluZm8oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkZpbGVOYW1lICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgPDwgIjogIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisgICAgICAgICAgICBBc3NlcnRpb25TdGF0cyBjb25zdCYgc3RhdHM7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdDsKKyAgICAgICAgICAgIENvbG91cjo6Q29kZSBjb2xvdXI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXNzT3JGYWlsOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZUxhYmVsOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBtZXNzYWdlczsKKyAgICAgICAgICAgIGJvb2wgcHJpbnRJbmZvTWVzc2FnZXM7CisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCBsYXp5UHJpbnQoKSB7CisKKyAgICAgICAgICAgIGlmKCAhY3VycmVudFRlc3RSdW5JbmZvLnVzZWQgKQorICAgICAgICAgICAgICAgIGxhenlQcmludFJ1bkluZm8oKTsKKyAgICAgICAgICAgIGlmKCAhY3VycmVudEdyb3VwSW5mby51c2VkICkKKyAgICAgICAgICAgICAgICBsYXp5UHJpbnRHcm91cEluZm8oKTsKKworICAgICAgICAgICAgaWYoICFtX2hlYWRlclByaW50ZWQgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRUZXN0Q2FzZUFuZFNlY3Rpb25IZWFkZXIoKTsKKyAgICAgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgbGF6eVByaW50UnVuSW5mbygpIHsKKyAgICAgICAgICAgIHN0cmVhbSAgPDwgJ1xuJyA8PCBnZXRMaW5lT2ZDaGFyczwnfic+KCkgPDwgJ1xuJzsKKyAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6U2Vjb25kYXJ5VGV4dCApOworICAgICAgICAgICAgc3RyZWFtICA8PCBjdXJyZW50VGVzdFJ1bkluZm8tPm5hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyBhIENhdGNoIHYiICA8PCBsaWJyYXJ5VmVyc2lvbigpIDw8ICIgaG9zdCBhcHBsaWNhdGlvbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgIlJ1biB3aXRoIC0/IGZvciBvcHRpb25zXG5cbiI7CisKKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZy0+cm5nU2VlZCgpICE9IDAgKQorICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiUmFuZG9tbmVzcyBzZWVkZWQgdG86ICIgPDwgbV9jb25maWctPnJuZ1NlZWQoKSA8PCAiXG5cbiI7CisKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0UnVuSW5mby51c2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGxhenlQcmludEdyb3VwSW5mbygpIHsKKyAgICAgICAgICAgIGlmKCAhY3VycmVudEdyb3VwSW5mby0+bmFtZS5lbXB0eSgpICYmIGN1cnJlbnRHcm91cEluZm8tPmdyb3Vwc0NvdW50cyA+IDEgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRDbG9zZWRIZWFkZXIoICJHcm91cDogIiArIGN1cnJlbnRHcm91cEluZm8tPm5hbWUgKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvLnVzZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgcHJpbnRUZXN0Q2FzZUFuZFNlY3Rpb25IZWFkZXIoKSB7CisgICAgICAgICAgICBhc3NlcnQoICFtX3NlY3Rpb25TdGFjay5lbXB0eSgpICk7CisgICAgICAgICAgICBwcmludE9wZW5IZWFkZXIoIGN1cnJlbnRUZXN0Q2FzZUluZm8tPm5hbWUgKTsKKworICAgICAgICAgICAgaWYoIG1fc2VjdGlvblN0YWNrLnNpemUoKSA+IDEgKSB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkhlYWRlcnMgKTsKKworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNlY3Rpb25JbmZvPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtX3NlY3Rpb25TdGFjay5iZWdpbigpKzEsIC8vIFNraXAgZmlyc3Qgc2VjdGlvbiAodGVzdCBjYXNlKQorICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IG1fc2VjdGlvblN0YWNrLmVuZCgpOworICAgICAgICAgICAgICAgIGZvciggOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICAgICAgICAgIHByaW50SGVhZGVyU3RyaW5nKCBpdC0+bmFtZSwgMiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbyA9IG1fc2VjdGlvblN0YWNrLmJhY2soKS5saW5lSW5mbzsKKworICAgICAgICAgICAgaWYoICFsaW5lSW5mby5lbXB0eSgpICl7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCctJz4oKSA8PCAnXG4nOworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpGaWxlTmFtZSApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBsaW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCcuJz4oKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHJpbnRDbG9zZWRIZWFkZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSApIHsKKyAgICAgICAgICAgIHByaW50T3BlbkhlYWRlciggX25hbWUgKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRMaW5lT2ZDaGFyczwnLic+KCkgPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHByaW50T3BlbkhlYWRlciggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lICkgeworICAgICAgICAgICAgc3RyZWFtICA8PCBnZXRMaW5lT2ZDaGFyczwnLSc+KCkgPDwgJ1xuJzsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6SGVhZGVycyApOworICAgICAgICAgICAgICAgIHByaW50SGVhZGVyU3RyaW5nKCBfbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgc3RyaW5nIGhhcyBhIDogaW4gZmlyc3QgbGluZSB3aWxsIHNldCBpbmRlbnQgdG8gZm9sbG93IGl0IG9uCisgICAgICAgIC8vIHN1YnNlcXVlbnQgbGluZXMKKyAgICAgICAgdm9pZCBwcmludEhlYWRlclN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIF9zdHJpbmcsIHN0ZDo6c2l6ZV90IGluZGVudCA9IDAgKSB7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBpID0gX3N0cmluZy5maW5kKCAiOiAiICk7CisgICAgICAgICAgICBpZiggaSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgaSs9MjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBUZXh0KCBfc3RyaW5nLCBUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggaW5kZW50K2kpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluaXRpYWxJbmRlbnQoIGluZGVudCApICkgPDwgJ1xuJzsKKyAgICAgICAgfQorCisgICAgICAgIHN0cnVjdCBTdW1tYXJ5Q29sdW1uIHsKKworICAgICAgICAgICAgU3VtbWFyeUNvbHVtbiggc3RkOjpzdHJpbmcgY29uc3QmIF9sYWJlbCwgQ29sb3VyOjpDb2RlIF9jb2xvdXIgKQorICAgICAgICAgICAgOiAgIGxhYmVsKCBfbGFiZWwgKSwKKyAgICAgICAgICAgICAgICBjb2xvdXIoIF9jb2xvdXIgKQorICAgICAgICAgICAge30KKyAgICAgICAgICAgIFN1bW1hcnlDb2x1bW4gYWRkUm93KCBzdGQ6OnNpemVfdCBjb3VudCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIG9zcyA8PCBjb3VudDsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByb3cgPSBvc3Muc3RyKCk7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gcm93cy5iZWdpbigpOyBpdCAhPSByb3dzLmVuZCgpOyArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSggaXQtPnNpemUoKSA8IHJvdy5zaXplKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgKml0ID0gJyAnICsgKml0OworICAgICAgICAgICAgICAgICAgICB3aGlsZSggaXQtPnNpemUoKSA+IHJvdy5zaXplKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgcm93ID0gJyAnICsgcm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb3dzLnB1c2hfYmFjayggcm93ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBsYWJlbDsKKyAgICAgICAgICAgIENvbG91cjo6Q29kZSBjb2xvdXI7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcm93czsKKworICAgICAgICB9OworCisgICAgICAgIHZvaWQgcHJpbnRUb3RhbHMoIFRvdGFscyBjb25zdCYgdG90YWxzICkgeworICAgICAgICAgICAgaWYoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6V2FybmluZyApIDw8ICJObyB0ZXN0cyByYW5cbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID4gMCAmJiB0b3RhbHMudGVzdENhc2VzLmFsbFBhc3NlZCgpICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6UmVzdWx0U3VjY2VzcyApIDw8ICJBbGwgdGVzdHMgcGFzc2VkIjsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiAoIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQsICJhc3NlcnRpb24iICkgPDwgIiBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLCAidGVzdCBjYXNlIiApIDw8ICcpJworICAgICAgICAgICAgICAgICAgICAgICAgPDwgJ1xuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj4gY29sdW1uczsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggIiIsIENvbG91cjo6Tm9uZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpICkgKTsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggInBhc3NlZCIsIENvbG91cjo6U3VjY2VzcyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCApICk7CisgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoX2JhY2soIFN1bW1hcnlDb2x1bW4oICJmYWlsZWQiLCBDb2xvdXI6OlJlc3VsdEVycm9yICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkgKTsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggImZhaWxlZCBhcyBleHBlY3RlZCIsIENvbG91cjo6UmVzdWx0RXhwZWN0ZWRGYWlsdXJlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZEJ1dE9rICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApICk7CisKKyAgICAgICAgICAgICAgICBwcmludFN1bW1hcnlSb3coICJ0ZXN0IGNhc2VzIiwgY29sdW1ucywgMCApOworICAgICAgICAgICAgICAgIHByaW50U3VtbWFyeVJvdyggImFzc2VydGlvbnMiLCBjb2x1bW5zLCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBwcmludFN1bW1hcnlSb3coIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYWJlbCwgc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj4gY29uc3QmIGNvbHMsIHN0ZDo6c2l6ZV90IHJvdyApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29scy5iZWdpbigpOyBpdCAhPSBjb2xzLmVuZCgpOyArK2l0ICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gaXQtPnJvd3Nbcm93XTsKKyAgICAgICAgICAgICAgICBpZiggaXQtPmxhYmVsLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBsYWJlbCA8PCAiOiAiOworICAgICAgICAgICAgICAgICAgICBpZiggdmFsdWUgIT0gIjAiICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpXYXJuaW5nICkgPDwgIi0gbm9uZSAtIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggdmFsdWUgIT0gIjAiICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gIDw8IENvbG91ciggQ29sb3VyOjpMaWdodEdyZXkgKSA8PCAiIHwgIjsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtICA8PCBDb2xvdXIoIGl0LT5jb2xvdXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHZhbHVlIDw8ICcgJyA8PCBpdC0+bGFiZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgc3RkOjpzaXplX3QgbWFrZVJhdGlvKCBzdGQ6OnNpemVfdCBudW1iZXIsIHN0ZDo6c2l6ZV90IHRvdGFsICkgeworICAgICAgICAgICAgc3RkOjpzaXplX3QgcmF0aW8gPSB0b3RhbCA+IDAgPyBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCAqIG51bWJlci8gdG90YWwgOiAwOworICAgICAgICAgICAgcmV0dXJuICggcmF0aW8gPT0gMCAmJiBudW1iZXIgPiAwICkgPyAxIDogcmF0aW87CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90JiBmaW5kTWF4KCBzdGQ6OnNpemVfdCYgaSwgc3RkOjpzaXplX3QmIGosIHN0ZDo6c2l6ZV90JiBrICkgeworICAgICAgICAgICAgaWYoIGkgPiBqICYmIGkgPiBrICkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIGVsc2UgaWYoIGogPiBrICkKKyAgICAgICAgICAgICAgICByZXR1cm4gajsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gazsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHJpbnRUb3RhbHNEaXZpZGVyKCBUb3RhbHMgY29uc3QmIHRvdGFscyApIHsKKyAgICAgICAgICAgIGlmKCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgPiAwICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZFJhdGlvID0gbWFrZVJhdGlvKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCwgdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICk7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkQnV0T2tSYXRpbyA9IG1ha2VSYXRpbyggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWRCdXRPaywgdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICk7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgcGFzc2VkUmF0aW8gPSBtYWtlUmF0aW8oIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKTsKKyAgICAgICAgICAgICAgICB3aGlsZSggZmFpbGVkUmF0aW8gKyBmYWlsZWRCdXRPa1JhdGlvICsgcGFzc2VkUmF0aW8gPCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xICkKKyAgICAgICAgICAgICAgICAgICAgZmluZE1heCggZmFpbGVkUmF0aW8sIGZhaWxlZEJ1dE9rUmF0aW8sIHBhc3NlZFJhdGlvICkrKzsKKyAgICAgICAgICAgICAgICB3aGlsZSggZmFpbGVkUmF0aW8gKyBmYWlsZWRCdXRPa1JhdGlvICsgcGFzc2VkUmF0aW8gPiBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xICkKKyAgICAgICAgICAgICAgICAgICAgZmluZE1heCggZmFpbGVkUmF0aW8sIGZhaWxlZEJ1dE9rUmF0aW8sIHBhc3NlZFJhdGlvICktLTsKKworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6RXJyb3IgKSA8PCBzdGQ6OnN0cmluZyggZmFpbGVkUmF0aW8sICc9JyApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6UmVzdWx0RXhwZWN0ZWRGYWlsdXJlICkgPDwgc3RkOjpzdHJpbmcoIGZhaWxlZEJ1dE9rUmF0aW8sICc9JyApOworICAgICAgICAgICAgICAgIGlmKCB0b3RhbHMudGVzdENhc2VzLmFsbFBhc3NlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpSZXN1bHRTdWNjZXNzICkgPDwgc3RkOjpzdHJpbmcoIHBhc3NlZFJhdGlvLCAnPScgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6U3VjY2VzcyApIDw8IHN0ZDo6c3RyaW5nKCBwYXNzZWRSYXRpbywgJz0nICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6Oldhcm5pbmcgKSA8PCBzdGQ6OnN0cmluZyggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMSwgJz0nICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHByaW50U3VtbWFyeURpdmlkZXIoKSB7CisgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0TGluZU9mQ2hhcnM8Jy0nPigpIDw8ICdcbic7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgbV9oZWFkZXJQcmludGVkOworICAgIH07CisKKyAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggImNvbnNvbGUiLCBDb25zb2xlUmVwb3J0ZXIgKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl9jb21wYWN0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfQ09NUEFDVF9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb21wYWN0UmVwb3J0ZXIgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworCisgICAgICAgIENvbXBhY3RSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApCisgICAgICAgIHt9CisKKyAgICAgICAgdmlydHVhbCB+Q29tcGFjdFJlcG9ydGVyKCk7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBvbiBhIHNpbmdsZSBsaW5lLCBzdWl0YWJsZSBmb3IgSURFcyI7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCB7CisgICAgICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzIHByZWZzOworICAgICAgICAgICAgcHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBwcmVmczsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApIHsKKyAgICAgICAgICAgIHN0cmVhbSA8PCAiTm8gdGVzdCBjYXNlcyBtYXRjaGVkICciIDw8IHNwZWMgPDwgJ1wnJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkge30KKworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBfYXNzZXJ0aW9uU3RhdHMgKSB7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IF9hc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisKKyAgICAgICAgICAgIGJvb2wgcHJpbnRJbmZvTWVzc2FnZXMgPSB0cnVlOworCisgICAgICAgICAgICAvLyBEcm9wIG91dCBpZiByZXN1bHQgd2FzIHN1Y2Nlc3NmdWwgYW5kIHdlJ3JlIG5vdCBwcmludGluZyB0aG9zZQorICAgICAgICAgICAgaWYoICFtX2NvbmZpZy0+aW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgJiYgcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcHJpbnRJbmZvTWVzc2FnZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXNzZXJ0aW9uUHJpbnRlciBwcmludGVyKCBzdHJlYW0sIF9hc3NlcnRpb25TdGF0cywgcHJpbnRJbmZvTWVzc2FnZXMgKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoKTsKKworICAgICAgICAgICAgc3RyZWFtIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZChTZWN0aW9uU3RhdHMgY29uc3QmIF9zZWN0aW9uU3RhdHMpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGlmIChtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cykgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRGb3JtYXR0ZWREdXJhdGlvbihfc2VjdGlvblN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzKSA8PCAiIHM6ICIgPDwgX3NlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgX3Rlc3RSdW5TdGF0cyApIHsKKyAgICAgICAgICAgIHByaW50VG90YWxzKCBfdGVzdFJ1blN0YXRzLnRvdGFscyApOworICAgICAgICAgICAgc3RyZWFtIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuRW5kZWQoIF90ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY2xhc3MgQXNzZXJ0aW9uUHJpbnRlciB7CisgICAgICAgICAgICB2b2lkIG9wZXJhdG9yPSAoIEFzc2VydGlvblByaW50ZXIgY29uc3QmICk7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEFzc2VydGlvblByaW50ZXIoIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSwgQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9zdGF0cywgYm9vbCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgOiBzdHJlYW0oIF9zdHJlYW0gKQorICAgICAgICAgICAgLCBzdGF0cyggX3N0YXRzICkKKyAgICAgICAgICAgICwgcmVzdWx0KCBfc3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICkKKyAgICAgICAgICAgICwgbWVzc2FnZXMoIF9zdGF0cy5pbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgLCBpdE1lc3NhZ2UoIF9zdGF0cy5pbmZvTWVzc2FnZXMuYmVnaW4oKSApCisgICAgICAgICAgICAsIHByaW50SW5mb01lc3NhZ2VzKCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAge30KKworICAgICAgICAgICAgdm9pZCBwcmludCgpIHsKKyAgICAgICAgICAgICAgICBwcmludFNvdXJjZUluZm8oKTsKKworICAgICAgICAgICAgICAgIGl0TWVzc2FnZSA9IG1lc3NhZ2VzLmJlZ2luKCk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpPazoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpSZXN1bHRTdWNjZXNzLCBwYXNzZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCBDb2xvdXI6Ok5vbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MsIGZhaWxlZFN0cmluZygpICsgc3RkOjpzdHJpbmcoICIgLSBidXQgd2FzIG9rIiApICk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElzc3VlKCAidW5leHBlY3RlZCBleGNlcHRpb24gd2l0aCBtZXNzYWdlOiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFeHByZXNzaW9uV2FzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElzc3VlKCAiZmF0YWwgZXJyb3IgY29uZGl0aW9uIHdpdGggbWVzc2FnZToiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXhwcmVzc2lvbldhcygpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJc3N1ZSggImV4cGVjdGVkIGV4Y2VwdGlvbiwgZ290IG5vbmUiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludEV4cHJlc3Npb25XYXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpOb25lLCAiaW5mbyIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpXYXJuaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6Ok5vbmUsICJ3YXJuaW5nIiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SXNzdWUoICJleHBsaWNpdGx5IiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcyggQ29sb3VyOjpOb25lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgY2FzZXMgYXJlIGhlcmUgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VW5rbm93bjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsICIqKiBpbnRlcm5hbCBlcnJvciAqKiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgLy8gQ29sb3VyOjpMaWdodEdyZXkKKworICAgICAgICAgICAgc3RhdGljIENvbG91cjo6Q29kZSBkaW1Db2xvdXIoKSB7IHJldHVybiBDb2xvdXI6OkZpbGVOYW1lOyB9CisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9NQUMKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBmYWlsZWRTdHJpbmcoKSB7IHJldHVybiAiRkFJTEVEIjsgfQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIHBhc3NlZFN0cmluZygpIHsgcmV0dXJuICJQQVNTRUQiOyB9CisjZWxzZQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGZhaWxlZFN0cmluZygpIHsgcmV0dXJuICJmYWlsZWQiOyB9CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogcGFzc2VkU3RyaW5nKCkgeyByZXR1cm4gInBhc3NlZCI7IH0KKyNlbmRpZgorCisgICAgICAgICAgICB2b2lkIHByaW50U291cmNlSW5mbygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6RmlsZU5hbWUgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldFNvdXJjZUluZm8oKSA8PCAnOic7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkNvZGUgY29sb3VyLCBzdGQ6OnN0cmluZyBjb25zdCYgcGFzc09yRmFpbCApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIXBhc3NPckZhaWwuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnICcgPDwgcGFzc09yRmFpbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJzonOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludElzc3VlKCBzdGQ6OnN0cmluZyBjb25zdCYgaXNzdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICcgJyA8PCBpc3N1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludEV4cHJlc3Npb25XYXMoKSB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnOyc7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIGRpbUNvbG91cigpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiBleHByZXNzaW9uIHdhczoiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJyAnIDw8IHJlc3VsdC5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHBhbmRlZEV4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggZGltQ29sb3VyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiIGZvcjogIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludE1lc3NhZ2UoKSB7CisgICAgICAgICAgICAgICAgaWYgKCBpdE1lc3NhZ2UgIT0gbWVzc2FnZXMuZW5kKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICciIDw8IGl0TWVzc2FnZS0+bWVzc2FnZSA8PCAnXCcnOworICAgICAgICAgICAgICAgICAgICArK2l0TWVzc2FnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZW1haW5pbmdNZXNzYWdlcyggQ29sb3VyOjpDb2RlIGNvbG91ciA9IGRpbUNvbG91cigpICkgeworICAgICAgICAgICAgICAgIGlmICggaXRNZXNzYWdlID09IG1lc3NhZ2VzLmVuZCgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgLy8gdXNpbmcgbWVzc2FnZXMuZW5kKCkgZGlyZWN0bHkgeWllbGRzIGNvbXBpbGF0aW9uIGVycm9yOgorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCBOID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBzdGQ6OmRpc3RhbmNlKCBpdE1lc3NhZ2UsIGl0RW5kICkgKTsKKworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgd2l0aCAiIDw8IHBsdXJhbGlzZSggTiwgIm1lc3NhZ2UiICkgPDwgJzonOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcig7IGl0TWVzc2FnZSAhPSBpdEVuZDsgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgYXNzZXJ0aW9uIGlzIGEgd2FybmluZyBpZ25vcmUgYW55IElORk8gbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByaW50SW5mb01lc3NhZ2VzIHx8IGl0TWVzc2FnZS0+dHlwZSAhPSBSZXN1bHRXYXM6OkluZm8gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiAnIiA8PCBpdE1lc3NhZ2UtPm1lc3NhZ2UgPDwgJ1wnJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKytpdE1lc3NhZ2UgIT0gaXRFbmQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBkaW1Db2xvdXIoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiIGFuZCI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOworICAgICAgICAgICAgQXNzZXJ0aW9uU3RhdHMgY29uc3QmIHN0YXRzOworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQ7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gbWVzc2FnZXM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0TWVzc2FnZTsKKyAgICAgICAgICAgIGJvb2wgcHJpbnRJbmZvTWVzc2FnZXM7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQ29sb3VyLCBtZXNzYWdlIHZhcmlhbnRzOgorICAgICAgICAvLyAtIHdoaXRlOiBObyB0ZXN0cyByYW4uCisgICAgICAgIC8vIC0gICByZWQ6IEZhaWxlZCBbYm90aC9hbGxdIE4gdGVzdCBjYXNlcywgZmFpbGVkIFtib3RoL2FsbF0gTSBhc3NlcnRpb25zLgorICAgICAgICAvLyAtIHdoaXRlOiBQYXNzZWQgW2JvdGgvYWxsXSBOIHRlc3QgY2FzZXMgKG5vIGFzc2VydGlvbnMpLgorICAgICAgICAvLyAtICAgcmVkOiBGYWlsZWQgTiB0ZXN0cyBjYXNlcywgZmFpbGVkIE0gYXNzZXJ0aW9ucy4KKyAgICAgICAgLy8gLSBncmVlbjogUGFzc2VkIFtib3RoL2FsbF0gTiB0ZXN0cyBjYXNlcyB3aXRoIE0gYXNzZXJ0aW9ucy4KKworICAgICAgICBzdGQ6OnN0cmluZyBib3RoT3JBbGwoIHN0ZDo6c2l6ZV90IGNvdW50ICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGNvdW50ID09IDEgPyBzdGQ6OnN0cmluZygpIDogY291bnQgPT0gMiA/ICJib3RoICIgOiAiYWxsICIgOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwcmludFRvdGFscyggY29uc3QgVG90YWxzJiB0b3RhbHMgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJObyB0ZXN0cyByYW4uIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkID09IHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdEVycm9yICk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcXVhbGlmeV9hc3NlcnRpb25zX2ZhaWxlZCA9CisgICAgICAgICAgICAgICAgICAgIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCA9PSB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhPckFsbCggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkgOiBzdGQ6OnN0cmluZygpOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkICIgPDwgYm90aE9yQWxsKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkLCAidGVzdCBjYXNlIiAgKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgIiA8PCBxdWFsaWZ5X2Fzc2VydGlvbnNfZmFpbGVkIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVyYWxpc2UoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCwgImFzc2VydGlvbiIgKSA8PCAnLic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8CisgICAgICAgICAgICAgICAgICAgICJQYXNzZWQgIiA8PCBib3RoT3JBbGwoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSwgInRlc3QgY2FzZSIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAobm8gYXNzZXJ0aW9ucykuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdEVycm9yICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8CisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgIiA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkLCAidGVzdCBjYXNlIiAgKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgIiA8PCBwbHVyYWxpc2UoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCwgImFzc2VydGlvbiIgKSA8PCAnLic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwKKyAgICAgICAgICAgICAgICAgICAgIlBhc3NlZCAiIDw8IGJvdGhPckFsbCggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCwgInRlc3QgY2FzZSIgICkgPDwKKyAgICAgICAgICAgICAgICAgICAgIiB3aXRoICIgIDw8IHBsdXJhbGlzZSggdG90YWxzLmFzc2VydGlvbnMucGFzc2VkLCAiYXNzZXJ0aW9uIiApIDw8ICcuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggImNvbXBhY3QiLCBDb21wYWN0UmVwb3J0ZXIgKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICAvLyBUaGVzZSBhcmUgYWxsIGhlcmUgdG8gYXZvaWQgd2FybmluZ3MgYWJvdXQgbm90IGhhdmluZyBhbnkgb3V0IG9mIGxpbmUKKyAgICAvLyB2aXJ0dWFsIG1ldGhvZHMKKyAgICBOb25Db3B5YWJsZTo6fk5vbkNvcHlhYmxlKCkge30KKyAgICBJU2hhcmVkOjp+SVNoYXJlZCgpIHt9CisgICAgSVN0cmVhbTo6fklTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIEZpbGVTdHJlYW06On5GaWxlU3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBDb3V0U3RyZWFtOjp+Q291dFN0cmVhbSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgRGVidWdPdXRTdHJlYW06On5EZWJ1Z091dFN0cmVhbSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgU3RyZWFtQnVmQmFzZTo6flN0cmVhbUJ1ZkJhc2UoKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIElDb250ZXh0Ojp+SUNvbnRleHQoKSB7fQorICAgIElSZXN1bHRDYXB0dXJlOjp+SVJlc3VsdENhcHR1cmUoKSB7fQorICAgIElUZXN0Q2FzZTo6fklUZXN0Q2FzZSgpIHt9CisgICAgSVRlc3RDYXNlUmVnaXN0cnk6On5JVGVzdENhc2VSZWdpc3RyeSgpIHt9CisgICAgSVJlZ2lzdHJ5SHViOjp+SVJlZ2lzdHJ5SHViKCkge30KKyAgICBJTXV0YWJsZVJlZ2lzdHJ5SHViOjp+SU11dGFibGVSZWdpc3RyeUh1YigpIHt9CisgICAgSUV4Y2VwdGlvblRyYW5zbGF0b3I6On5JRXhjZXB0aW9uVHJhbnNsYXRvcigpIHt9CisgICAgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTo6fklFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSB7fQorICAgIElSZXBvcnRlcjo6fklSZXBvcnRlcigpIHt9CisgICAgSVJlcG9ydGVyRmFjdG9yeTo6fklSZXBvcnRlckZhY3RvcnkoKSB7fQorICAgIElSZXBvcnRlclJlZ2lzdHJ5Ojp+SVJlcG9ydGVyUmVnaXN0cnkoKSB7fQorICAgIElTdHJlYW1pbmdSZXBvcnRlcjo6fklTdHJlYW1pbmdSZXBvcnRlcigpIHt9CisgICAgQXNzZXJ0aW9uU3RhdHM6On5Bc3NlcnRpb25TdGF0cygpIHt9CisgICAgU2VjdGlvblN0YXRzOjp+U2VjdGlvblN0YXRzKCkge30KKyAgICBUZXN0Q2FzZVN0YXRzOjp+VGVzdENhc2VTdGF0cygpIHt9CisgICAgVGVzdEdyb3VwU3RhdHM6On5UZXN0R3JvdXBTdGF0cygpIHt9CisgICAgVGVzdFJ1blN0YXRzOjp+VGVzdFJ1blN0YXRzKCkge30KKyAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjpTZWN0aW9uTm9kZTo6flNlY3Rpb25Ob2RlKCkge30KKyAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp+Q3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSgpIHt9CisKKyAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6On5TdHJlYW1pbmdSZXBvcnRlckJhc2UoKSB7fQorICAgIENvbnNvbGVSZXBvcnRlcjo6fkNvbnNvbGVSZXBvcnRlcigpIHt9CisgICAgQ29tcGFjdFJlcG9ydGVyOjp+Q29tcGFjdFJlcG9ydGVyKCkge30KKyAgICBJUnVubmVyOjp+SVJ1bm5lcigpIHt9CisgICAgSU11dGFibGVDb250ZXh0Ojp+SU11dGFibGVDb250ZXh0KCkge30KKyAgICBJQ29uZmlnOjp+SUNvbmZpZygpIHt9CisgICAgWG1sUmVwb3J0ZXI6On5YbWxSZXBvcnRlcigpIHt9CisgICAgSnVuaXRSZXBvcnRlcjo6fkp1bml0UmVwb3J0ZXIoKSB7fQorICAgIFRlc3RSZWdpc3RyeTo6flRlc3RSZWdpc3RyeSgpIHt9CisgICAgRnJlZUZ1bmN0aW9uVGVzdENhc2U6On5GcmVlRnVuY3Rpb25UZXN0Q2FzZSgpIHt9CisgICAgSUdlbmVyYXRvckluZm86On5JR2VuZXJhdG9ySW5mbygpIHt9CisgICAgSUdlbmVyYXRvcnNGb3JUZXN0Ojp+SUdlbmVyYXRvcnNGb3JUZXN0KCkge30KKyAgICBXaWxkY2FyZFBhdHRlcm46On5XaWxkY2FyZFBhdHRlcm4oKSB7fQorICAgIFRlc3RTcGVjOjpQYXR0ZXJuOjp+UGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6Ok5hbWVQYXR0ZXJuOjp+TmFtZVBhdHRlcm4oKSB7fQorICAgIFRlc3RTcGVjOjpUYWdQYXR0ZXJuOjp+VGFnUGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6OkV4Y2x1ZGVkUGF0dGVybjo6fkV4Y2x1ZGVkUGF0dGVybigpIHt9CisgICAgTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJVbnR5cGVkQmFzZTo6fk1hdGNoZXJVbnR5cGVkQmFzZSgpIHt9CisKKyAgICB2b2lkIENvbmZpZzo6ZHVtbXkoKSB7fQorCisgICAgbmFtZXNwYWNlIFRlc3RDYXNlVHJhY2tpbmcgeworICAgICAgICBJVHJhY2tlcjo6fklUcmFja2VyKCkge30KKyAgICAgICAgVHJhY2tlckJhc2U6On5UcmFja2VyQmFzZSgpIHt9CisgICAgICAgIFNlY3Rpb25UcmFja2VyOjp+U2VjdGlvblRyYWNrZXIoKSB7fQorICAgICAgICBJbmRleFRyYWNrZXI6On5JbmRleFRyYWNrZXIoKSB7fQorICAgIH0KK30KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX01BSU4KKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9kZWZhdWx0X21haW4uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9ERUZBVUxUX01BSU5fSFBQX0lOQ0xVREVECisKKyNpZm5kZWYgX19PQkpDX18KKworI2lmIGRlZmluZWQoV0lOMzIpICYmIGRlZmluZWQoX1VOSUNPREUpICYmICFkZWZpbmVkKERPX05PVF9VU0VfV01BSU4pCisvLyBTdGFuZGFyZCBDL0MrKyBXaW4zMiBVbmljb2RlIHdtYWluIGVudHJ5IHBvaW50CitleHRlcm4gIkMiIGludCB3bWFpbiAoaW50IGFyZ2MsIHdjaGFyX3QgKiBhcmd2W10sIHdjaGFyX3QgKiBbXSkgeworI2Vsc2UKKy8vIFN0YW5kYXJkIEMvQysrIG1haW4gZW50cnkgcG9pbnQKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqIGFyZ3ZbXSkgeworI2VuZGlmCisKKwlpbnQgcmVzdWx0ID0gQ2F0Y2g6OlNlc3Npb24oKS5ydW4oIGFyZ2MsIGFyZ3YgKTsKKyAgICByZXR1cm4gKCByZXN1bHQgPCAweGZmID8gcmVzdWx0IDogMHhmZiApOworfQorCisjZWxzZSAvLyBfX09CSkNfXworCisvLyBPYmplY3RpdmUtQyBlbnRyeSBwb2ludAoraW50IG1haW4gKGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKSB7CisjaWYgIUNBVENIX0FSQ19FTkFCTEVECisgICAgTlNBdXRvcmVsZWFzZVBvb2wgKiBwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisjZW5kaWYKKworICAgIENhdGNoOjpyZWdpc3RlclRlc3RNZXRob2RzKCk7CisgICAgaW50IHJlc3VsdCA9IENhdGNoOjpTZXNzaW9uKCkucnVuKCBhcmdjLCAoY2hhciogY29uc3QqKWFyZ3YgKTsKKworI2lmICFDQVRDSF9BUkNfRU5BQkxFRAorICAgIFtwb29sIGRyYWluXTsKKyNlbmRpZgorCisgICAgcmV0dXJuICggcmVzdWx0IDwgMHhmZiA/IHJlc3VsdCA6IDB4ZmYgKTsKK30KKworI2VuZGlmIC8vIF9fT0JKQ19fCisKKyNlbmRpZgorCisjaWZkZWYgQ0xBUkFfQ09ORklHX01BSU5fTk9UX0RFRklORUQKKyMgIHVuZGVmIENMQVJBX0NPTkZJR19NQUlOCisjZW5kaWYKKworLy8vLy8vCisKKy8vIElmIHRoaXMgY29uZmlnIGlkZW50aWZpZXIgaXMgZGVmaW5lZCB0aGVuIGFsbCBDQVRDSCBtYWNyb3MgYXJlIHByZWZpeGVkIHdpdGggQ0FUQ0hfCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1BSRUZJWF9BTEwKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiQ0FUQ0hfUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiQ0FUQ0hfUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2Vsc2UKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9SRVFVSVJFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX1JFUVVJUkVfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICApCisjZW5kaWYKKworI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XUyggZXhwciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX1JFUVVJUkVfVEhST1dTIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsICIiLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoICJDQVRDSF9SRVFVSVJFX1RIUk9XU19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX1JFUVVJUkVfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgbWF0Y2hlciwgZXhwciApCisjZGVmaW5lIENBVENIX1JFUVVJUkVfTk9USFJPVyggZXhwciApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAiQ0FUQ0hfUkVRVUlSRV9OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorCisjZGVmaW5lIENBVENIX0NIRUNLKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX0NIRUNLX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tFRF9JRiggZXhwciApIElOVEVSTkFMX0NBVENIX0lGKCAiQ0FUQ0hfQ0hFQ0tFRF9JRiIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS0VEX0VMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9FTFNFKCAiQ0FUQ0hfQ0hFQ0tFRF9FTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX05PRkFJTCggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9DSEVDS19OT0ZBSUwiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpTdXBwcmVzc0ZhaWwsIGV4cHIgKQorCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XUyggZXhwciApICBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDQVRDSF9DSEVDS19USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCAiIiwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIkNBVENIX0NIRUNLX1RIUk9XU19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS19USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX0NIRUNLX1RIUk9XU19XSVRIIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbWF0Y2hlciwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX05PVEhST1coIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggIkNBVENIX0NIRUNLX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKworI2RlZmluZSBDQVRDSF9DSEVDS19USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiQ0FUQ0hfQ0hFQ0tfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGFyZyApCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVF9OT19UUlkoICJDQVRDSF9SRVFVSVJFX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgYXJnICkKKyNlbHNlCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVCggIkNBVENIX1JFUVVJUkVfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBhcmcgKQorI2VuZGlmCisKKyNkZWZpbmUgQ0FUQ0hfSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBVENIX0lORk8iLCBtc2cgKQorI2RlZmluZSBDQVRDSF9XQVJOKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9XQVJOIiwgQ2F0Y2g6OlJlc3VsdFdhczo6V2FybmluZywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyNkZWZpbmUgQ0FUQ0hfU0NPUEVEX0lORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVRDSF9JTkZPIiwgbXNnICkKKyNkZWZpbmUgQ0FUQ0hfQ0FQVFVSRSggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBVENIX0NBUFRVUkUiLCAjbXNnICIgOj0gIiA8PCBDYXRjaDo6dG9TdHJpbmcobXNnKSApCisjZGVmaW5lIENBVENIX1NDT1BFRF9DQVBUVVJFKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FUQ0hfQ0FQVFVSRSIsICNtc2cgIiA6PSAiIDw8IENhdGNoOjp0b1N0cmluZyhtc2cpICkKKworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAjZGVmaW5lIENBVENIX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIC4uLiApIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfVEVTVF9DQVNFKCBGdW5jdGlvbiwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIEZ1bmN0aW9uLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9TRUNUSU9OKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9GQUlMKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9GQUlMIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfRkFJTF9DSEVDSyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTF9DSEVDSyIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfU1VDQ0VFRCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisjZWxzZQorICAgICNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFKCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9URVNUX0NBU0UoIGZ1bmN0aW9uLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBmdW5jdGlvbiwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgQ0FUQ0hfU0VDVElPTiggbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9GQUlMKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9GQUlMIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgbXNnICkKKyAgICAjZGVmaW5lIENBVENIX0ZBSUxfQ0hFQ0soIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX0ZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisgICAgI2RlZmluZSBDQVRDSF9TVUNDRUVEKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9TVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisjZW5kaWYKKyNkZWZpbmUgQ0FUQ0hfQU5PTl9URVNUX0NBU0UoKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggIiIsICIiICkKKworI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKQorCisjZGVmaW5lIENBVENIX0dFTkVSQVRFKCBleHByKSBJTlRFUk5BTF9DQVRDSF9HRU5FUkFURSggZXhwciApCisKKy8vICJCREQtc3R5bGUiIGNvbnZlbmllbmNlIHdyYXBwZXJzCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworI2RlZmluZSBDQVRDSF9TQ0VOQVJJTyggLi4uICkgQ0FUQ0hfVEVTVF9DQVNFKCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2RlZmluZSBDQVRDSF9TQ0VOQVJJT19NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2Vsc2UKKyNkZWZpbmUgQ0FUQ0hfU0NFTkFSSU8oIG5hbWUsIHRhZ3MgKSBDQVRDSF9URVNUX0NBU0UoICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNkZWZpbmUgQ0FUQ0hfU0NFTkFSSU9fTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIHRhZ3MgKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNlbmRpZgorI2RlZmluZSBDQVRDSF9HSVZFTiggZGVzYyApICAgIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiR2l2ZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9XSEVOKCBkZXNjICkgICAgIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiIFdoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9BTkRfV0hFTiggZGVzYyApIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiICBBbmQ6ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9USEVOKCBkZXNjICkgICAgIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiIFRoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9BTkRfVEhFTiggZGVzYyApIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiICBBbmQ6ICIpICsgZGVzYywgIiIgKQorCisvLyBJZiBDQVRDSF9DT05GSUdfUFJFRklYX0FMTCBpcyBub3QgZGVmaW5lZCB0aGVuIHRoZSBDQVRDSF8gcHJlZml4IGlzIG5vdCByZXF1aXJlZAorI2Vsc2UKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgUkVRVUlSRV9GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorCisjZWxzZQorI2RlZmluZSBSRVFVSVJFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIlJFUVVJUkUiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciAgKQorI2RlZmluZSBSRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIlJFUVVJUkVfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKyNlbmRpZgorCisjZGVmaW5lIFJFUVVJUkVfVEhST1dTKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiUkVRVUlSRV9USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgIiIsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIlJFUVVJUkVfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiUkVRVUlSRV9USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgUkVRVUlSRV9OT1RIUk9XKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJSRVFVSVJFX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisKKyNkZWZpbmUgQ0hFQ0soIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0hFQ0siLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0hFQ0tfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2RlZmluZSBDSEVDS0VEX0lGKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfSUYoICJDSEVDS0VEX0lGIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENIRUNLRURfRUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX0VMU0UoICJDSEVDS0VEX0VMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfTk9GQUlMKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNIRUNLX05PRkFJTCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OlN1cHByZXNzRmFpbCwgZXhwciApCisKKyNkZWZpbmUgQ0hFQ0tfVEhST1dTKCBleHByICkgIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNIRUNLX1RIUk9XUyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsICIiLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCAiQ0hFQ0tfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENIRUNLX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0hFQ0tfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfTk9USFJPVyggZXhwciApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAiQ0hFQ0tfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorCisjZGVmaW5lIENIRUNLX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJDSEVDS19USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgYXJnICkKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUX05PX1RSWSggIlJFUVVJUkVfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBhcmcgKQorI2Vsc2UKKyNkZWZpbmUgUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiUkVRVUlSRV9USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyApCisjZW5kaWYKKworI2RlZmluZSBJTkZPKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiSU5GTyIsIG1zZyApCisjZGVmaW5lIFdBUk4oIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIldBUk4iLCBDYXRjaDo6UmVzdWx0V2FzOjpXYXJuaW5nLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorI2RlZmluZSBTQ09QRURfSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIklORk8iLCBtc2cgKQorI2RlZmluZSBDQVBUVVJFKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FQVFVSRSIsICNtc2cgIiA6PSAiIDw8IENhdGNoOjp0b1N0cmluZyhtc2cpICkKKyNkZWZpbmUgU0NPUEVEX0NBUFRVUkUoIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVBUVVJFIiwgI21zZyAiIDo9ICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKG1zZykgKQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworI2RlZmluZSBURVNUX0NBU0UoIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFRFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIE1FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFJFR0lTVEVSX1RFU1RfQ0FTRSggRnVuY3Rpb24sIC4uLiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgX19WQV9BUkdTX18gKQorI2RlZmluZSBTRUNUSU9OKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEZBSUwoIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUwiLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEZBSUxfQ0hFQ0soIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgU1VDQ0VFRCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisjZWxzZQorI2RlZmluZSBURVNUX0NBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIFRFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIE1FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIFJFR0lTVEVSX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIFNFQ1RJT04oIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgRkFJTCggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiRkFJTCIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIG1zZyApCisgICAgI2RlZmluZSBGQUlMX0NIRUNLKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJGQUlMX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorICAgICNkZWZpbmUgU1VDQ0VFRCggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorI2VuZGlmCisjZGVmaW5lIEFOT05fVEVTVF9DQVNFKCkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoICIiLCAiIiApCisKKyNkZWZpbmUgUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKQorI2RlZmluZSBSRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkKKworI2RlZmluZSBHRU5FUkFURSggZXhwcikgSU5URVJOQUxfQ0FUQ0hfR0VORVJBVEUoIGV4cHIgKQorCisjZW5kaWYKKworI2RlZmluZSBDQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OKCBzaWduYXR1cmUgKSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OKCBzaWduYXR1cmUgKQorCisvLyAiQkRELXN0eWxlIiBjb252ZW5pZW5jZSB3cmFwcGVycworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyNkZWZpbmUgU0NFTkFSSU8oIC4uLiApIFRFU1RfQ0FTRSggIlNjZW5hcmlvOiAiIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgU0NFTkFSSU9fTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgIlNjZW5hcmlvOiAiIF9fVkFfQVJHU19fICkKKyNlbHNlCisjZGVmaW5lIFNDRU5BUklPKCBuYW1lLCB0YWdzICkgVEVTVF9DQVNFKCAiU2NlbmFyaW86ICIgbmFtZSwgdGFncyApCisjZGVmaW5lIFNDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCB0YWdzICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAiU2NlbmFyaW86ICIgbmFtZSwgdGFncyApCisjZW5kaWYKKyNkZWZpbmUgR0lWRU4oIGRlc2MgKSAgICBTRUNUSU9OKCBzdGQ6OnN0cmluZygiICAgR2l2ZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBXSEVOKCBkZXNjICkgICAgIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICAgV2hlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIEFORF9XSEVOKCBkZXNjICkgU0VDVElPTiggc3RkOjpzdHJpbmcoIkFuZCB3aGVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgVEhFTiggZGVzYyApICAgICBTRUNUSU9OKCBzdGQ6OnN0cmluZygiICAgIFRoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBBTkRfVEhFTiggZGVzYyApIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICAgIEFuZDogIikgKyBkZXNjLCAiIiApCisKK3VzaW5nIENhdGNoOjpEZXRhaWw6OkFwcHJveDsKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVERUQKKwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOGM4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHMuY2MKQEAgLTAsMCArMSwzMzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICIuLi9jYXRjaC9jYXRjaC5ocHAiCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSAidF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaCIKKworVEVTVF9DQVNFKCAidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgZW51bSIsICJbZnVuY3Rpb25hbF0iICkKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfZW51bSo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZW51bV9kYXRhKHByb2dyYW0pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfZW51bSogdGVzdF9lbnVtID0gcGFpci5zZWNvbmQ7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gdGVzdF9lbnVtLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2VudW0ob3V0LCB0ZXN0X2VudW0pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSB0ZXN0X2VudW07CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsJCit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgdm9pZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3Rfdm9pZF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfVEhST1dTKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBzdHJpbmcgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3Rfc3RyaW5nX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGJvb2wgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfYm9vbF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBzYnl0ZSAoaTgpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2k4X2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIHNob3J0IChpMTYpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kxNl9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBpbnRlZ2VyIChpMzIpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kzMl9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBsb25nIChpNjQpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2k2NF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBkb3VibGUgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZG91YmxlX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuY2MgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmMxNzBiCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuY2MKQEAgLTAsMCArMSwyMzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSAidF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaCIKKworY29uc3Qgc3RyaW5nIFRlc3REYXRhR2VuZXJhdG9yOjpERUZBVUxUX0ZJTEVfSEVBREVSID0gIi8qKiIgIlxuIgorICAgICAgICAgICAgIiAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgpIiAiXG4iCisgICAgICAgICAgICAiICoiICJcbiIKKyAgICAgICAgICAgICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HIiAiXG4iCisgICAgICAgICAgICAiICogIEBnZW5lcmF0ZWQiICJcbiIKKyAgICAgICAgICAgICIgKi8iOworCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2VudW0qPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZW51bV9kYXRhKHRfcHJvZ3JhbSogcHJvZ3JhbSkKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArCisgICAgICAgICJcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIi8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICJwdWJsaWMgZW51bSBUZXN0TmFtZVxuIgorICAgICAgICAie1xuIgorICAgICAgICAiICBOb25lID0gMCxcbiIKKyAgICAgICAgIiAgRmlyc3QgPSAxLFxuIgorICAgICAgICAiICBTZWNvbmQgPSAyLFxuIgorICAgICAgICAifVxuIjsKKworICAgIHRfZW51bSogZW51bV8gPSBuZXcgdF9lbnVtKHByb2dyYW0pOworICAgIGVudW1fLT5zZXRfbmFtZSgiVGVzdE5hbWUiKTsKKyAgICBlbnVtXy0+c2V0X2RvYygiVGVzdERvYyIpOworICAgIGVudW1fLT5hcHBlbmQobmV3IHRfZW51bV92YWx1ZSgiTm9uZSIsIDApKTsKKyAgICBlbnVtXy0+YXBwZW5kKG5ldyB0X2VudW1fdmFsdWUoIkZpcnN0IiwgMSkpOworICAgIGVudW1fLT5hcHBlbmQobmV3IHRfZW51bV92YWx1ZSgiU2Vjb25kIiwgMikpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfZW51bSo+KGV4cGVjdGVkX3Jlc3VsdCwgZW51bV8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X3ZvaWRfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJ2b2lkIiwgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfc3RyaW5nKCJWb2lkVmFsdWUiKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAidm9pZCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9zdHJpbmdfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArIAorICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3Qgc3RyaW5nIEBzdHJpbmcgPSBcIlN0cmluZ1ZhbHVlXCI7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9zdHJpbmcoIlN0cmluZ1ZhbHVlIik7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgInN0cmluZyIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9ib29sX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3QgYm9vbCBAYm9vbCA9IHRydWU7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiYm9vbCIsIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoMSk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgImJvb2wiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaThfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBzYnl0ZSBAc2J5dGUgPSAxMjc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiSTgiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JOCk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcigxMjcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJzYnl0ZSIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pMTZfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBzaG9ydCBAc2hvcnQgPSAzMjc2NztcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJpMTYiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoMzI3NjcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJzaG9ydCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pMzJfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBpbnQgQGludCA9IDIxNDc0ODM2NDc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiaTMyIiwgdF9iYXNlX3R5cGU6OlRZUEVfSTMyKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDIxNDc0ODM2NDcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJpbnQiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTY0X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3QgbG9uZyBAbG9uZyA9IDkyMjMzNzIwMzY4NTQ3NzU4MDc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiaTY0IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTY0KTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDkyMjMzNzIwMzY4NTQ3NzU4MDcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJsb25nIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2RvdWJsZV9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IGRvdWJsZSBAZG91YmxlID0gOS4yMjMzN2UrMTg7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiZG91YmxlIiwgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9kb3VibGUoOTIyMzM3MjAzNjg1NDc3NTgwNy4xKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAiZG91YmxlIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlYWFjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKworY2xhc3MgVGVzdERhdGFHZW5lcmF0b3IKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RyaW5nIERFRkFVTFRfRklMRV9IRUFERVI7CisKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9lbnVtKj4gZ2V0X3Rlc3RfZW51bV9kYXRhKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF92b2lkX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X3N0cmluZ19jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9ib29sX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2k4X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2kxNl9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9pMzJfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfaTY0X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2RvdWJsZV9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7Cit9OwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9oZWxwZXJzX3Rlc3RzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9oZWxwZXJzX3Rlc3RzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiY2JlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2hlbHBlcnNfdGVzdHMuY2MKQEAgLTAsMCArMSwyMDkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICIuLi9jYXRjaC9jYXRjaC5ocHAiCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3I6Om5ldGNvcmVfdHlwZV91c2luZ3MoKSB3aXRob3V0IG9wdGlvbiB3Y2Ygc2hvdWxkIHJldHVybiB2YWxpZCBuYW1lc3BhY2VzIiwgIltoZWxwZXJzXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgInVuaW9uIiwgInVuaW9uIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHN0cmluZyBleHBlY3RlZF9uYW1lc3BhY2VzID0gInVzaW5nIFN5c3RlbTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRleHQ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiIgKyBlbmRsOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBSRVFVSVJFX0ZBTFNFKGdlbi0+aXNfd2NmX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRShnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSA9PSBleHBlY3RlZF9uYW1lc3BhY2VzKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvcjo6bmV0Y29yZV90eXBlX3VzaW5ncygpIHdpdGggb3B0aW9uIHdjZiBzaG91bGQgcmV0dXJuIHZhbGlkIG5hbWVzcGFjZXMiLCAiW2hlbHBlcnNdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICBzdHJpbmcgZXhwZWN0ZWRfbmFtZXNwYWNlc193Y2YgPSAidXNpbmcgU3lzdGVtO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGV4dDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlNlcnZpY2VNb2RlbDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uO1xuIiArIGVuZGw7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIFJFUVVJUkUoZ2VuLT5pc193Y2ZfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFKGdlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpID09IGV4cGVjdGVkX25hbWVzcGFjZXNfd2NmKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgY29udGFpbnMgbGF0ZXN0IEMjIGtleXdvcmRzIHRvIG5vcm1hbGl6ZSB3aXRoIEAiLCAiW2hlbHBlcnNdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisgICAgdmVjdG9yPHN0cmluZz4gY3VycmVudF9rZXl3b3JkcyA9IHsKKyAgICAgICAgeyAiYWJzdHJhY3QiIH0sCisgICAgICAgIHsgImFzIiB9LAorICAgICAgICB7ICJiYXNlIiB9LAorICAgICAgICB7ICJib29sIiB9LAorICAgICAgICB7ICJicmVhayIgfSwKKyAgICAgICAgeyAiYnl0ZSIgfSwKKyAgICAgICAgeyAiY2FzZSIgfSwKKyAgICAgICAgeyAiY2F0Y2giIH0sCisgICAgICAgIHsgImNoYXIiIH0sCisgICAgICAgIHsgImNoZWNrZWQiIH0sCisgICAgICAgIHsgImNsYXNzIiB9LAorICAgICAgICB7ICJjb25zdCIgfSwKKyAgICAgICAgeyAiY29udGludWUiIH0sCisgICAgICAgIHsgImRlY2ltYWwiIH0sCisgICAgICAgIHsgImRlZmF1bHQiIH0sCisgICAgICAgIHsgImRlbGVnYXRlIiB9LAorICAgICAgICB7ICJkbyIgfSwKKyAgICAgICAgeyAiZG91YmxlIiB9LAorICAgICAgICB7ICJlbHNlIiB9LAorICAgICAgICB7ICJlbnVtIiB9LAorICAgICAgICB7ICJldmVudCIgfSwKKyAgICAgICAgeyAiZXhwbGljaXQiIH0sCisgICAgICAgIHsgImV4dGVybiIgfSwKKyAgICAgICAgeyAiZmFsc2UiIH0sCisgICAgICAgIHsgImZpbmFsbHkiIH0sCisgICAgICAgIHsgImZpeGVkIiB9LAorICAgICAgICB7ICJmbG9hdCIgfSwKKyAgICAgICAgeyAiZm9yIiB9LAorICAgICAgICB7ICJmb3JlYWNoIiB9LAorICAgICAgICB7ICJnb3RvIiB9LAorICAgICAgICB7ICJpZiIgfSwKKyAgICAgICAgeyAiaW1wbGljaXQiIH0sCisgICAgICAgIHsgImluIiB9LAorICAgICAgICB7ICJpbnQiIH0sCisgICAgICAgIHsgImludGVyZmFjZSIgfSwKKyAgICAgICAgeyAiaW50ZXJuYWwiIH0sCisgICAgICAgIHsgImlzIiB9LAorICAgICAgICB7ICJsb2NrIiB9LAorICAgICAgICB7ICJsb25nIiB9LAorICAgICAgICB7ICJuYW1lc3BhY2UiIH0sCisgICAgICAgIHsgIm5ldyIgfSwKKyAgICAgICAgeyAibnVsbCIgfSwKKyAgICAgICAgeyAib2JqZWN0IiB9LAorICAgICAgICB7ICJvcGVyYXRvciIgfSwKKyAgICAgICAgeyAib3V0IiB9LAorICAgICAgICB7ICJvdmVycmlkZSIgfSwKKyAgICAgICAgeyAicGFyYW1zIiB9LAorICAgICAgICB7ICJwcml2YXRlIiB9LAorICAgICAgICB7ICJwcm90ZWN0ZWQiIH0sCisgICAgICAgIHsgInB1YmxpYyIgfSwKKyAgICAgICAgeyAicmVhZG9ubHkiIH0sCisgICAgICAgIHsgInJlZiIgfSwKKyAgICAgICAgeyAicmV0dXJuIiB9LAorICAgICAgICB7ICJzYnl0ZSIgfSwKKyAgICAgICAgeyAic2VhbGVkIiB9LAorICAgICAgICB7ICJzaG9ydCIgfSwKKyAgICAgICAgeyAic2l6ZW9mIiB9LAorICAgICAgICB7ICJzdGFja2FsbG9jIiB9LAorICAgICAgICB7ICJzdGF0aWMiIH0sCisgICAgICAgIHsgInN0cmluZyIgfSwKKyAgICAgICAgeyAic3RydWN0IiB9LAorICAgICAgICB7ICJzd2l0Y2giIH0sCisgICAgICAgIHsgInRoaXMiIH0sCisgICAgICAgIHsgInRocm93IiB9LAorICAgICAgICB7ICJ0cnVlIiB9LAorICAgICAgICB7ICJ0cnkiIH0sCisgICAgICAgIHsgInR5cGVvZiIgfSwKKyAgICAgICAgeyAidWludCIgfSwKKyAgICAgICAgeyAidWxvbmciIH0sCisgICAgICAgIHsgInVuY2hlY2tlZCIgfSwKKyAgICAgICAgeyAidW5zYWZlIiB9LAorICAgICAgICB7ICJ1c2hvcnQiIH0sCisgICAgICAgIHsgInVzaW5nIiB9LAorICAgICAgICB7ICJ2b2lkIiB9LAorICAgICAgICB7ICJ2b2xhdGlsZSIgfSwKKyAgICAgICAgeyAid2hpbGUiIH0sCisgICAgICAgIC8vIENvbnRleHR1YWwgS2V5d29yZHMKKyAgICAgICAgeyAiYWRkIiB9LAorICAgICAgICB7ICJhbGlhcyIgfSwKKyAgICAgICAgeyAiYXNjZW5kaW5nIiB9LAorICAgICAgICB7ICJhc3luYyIgfSwKKyAgICAgICAgeyAiYXdhaXQiIH0sCisgICAgICAgIHsgImRlc2NlbmRpbmciIH0sCisgICAgICAgIHsgImR5bmFtaWMiIH0sCisgICAgICAgIHsgImZyb20iIH0sCisgICAgICAgIHsgImdldCIgfSwKKyAgICAgICAgeyAiZ2xvYmFsIiB9LAorICAgICAgICB7ICJncm91cCIgfSwKKyAgICAgICAgeyAiaW50byIgfSwKKyAgICAgICAgeyAiam9pbiIgfSwKKyAgICAgICAgeyAibGV0IiB9LAorICAgICAgICB7ICJvcmRlcmJ5IiB9LAorICAgICAgICB7ICJwYXJ0aWFsIiB9LAorICAgICAgICB7ICJyZW1vdmUiIH0sCisgICAgICAgIHsgInNlbGVjdCIgfSwKKyAgICAgICAgeyAic2V0IiB9LAorICAgICAgICB7ICJ2YWx1ZSIgfSwKKyAgICAgICAgeyAidmFyIiB9LAorICAgICAgICB7ICJ3aGVuIiB9LAorICAgICAgICB7ICJ3aGVyZSIgfSwKKyAgICAgICAgeyAieWllbGQiIH0KKyAgICB9OworCisgICAgc3RyaW5nIG1pc3NlZF9rZXl3b3JkcyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworICAgIG1hcDxzdHJpbmcsIGludD4gZ2VuZXJhdG9yc19rZXl3b3JkcyA9IGdlbi0+Z2V0X2tleXdvcmRzX2xpc3QoKTsKKworICAgIGZvciAodmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gY3VycmVudF9rZXl3b3Jkcy5iZWdpbigpOyBpdCAhPSBjdXJyZW50X2tleXdvcmRzLmVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgICAgaWYgKGdlbmVyYXRvcnNfa2V5d29yZHMuZmluZCgqaXQpID09IGdlbmVyYXRvcnNfa2V5d29yZHMuZW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pc3NlZF9rZXl3b3JkcyA9IG1pc3NlZF9rZXl3b3JkcyArICppdCArICIsIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIFJFUVVJUkUobWlzc2VkX2tleXdvcmRzID09ICIiKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2luaXRpYWxpemF0aW9uX3Rlc3RzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9pbml0aWFsaXphdGlvbl90ZXN0cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzE3NzMzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9pbml0aWFsaXphdGlvbl90ZXN0cy5jYwpAQCAtMCwwICsxLDc0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiLi4vY2F0Y2gvY2F0Y2guaHBwIgorI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKyNpbmNsdWRlIDx0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oPgorCitURVNUX0NBU0UoICJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCB0aHJvdyBlcnJvciB3aXRoIHVua25vd24gb3B0aW9ucyIsICJbaW5pdGlhbGl6YXRpb25dIiApCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgImtleXMiLCAia2V5cyIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG51bGxwdHI7CisKKyAgICBSRVFVSVJFX1RIUk9XUyhnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZykpOwkKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07CQorfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGNyZWF0ZSB2YWxpZCBpbnN0YW5jZSB3aXRoIHZhbGlkIG9wdGlvbnMiLCAiW2luaXRpYWxpemF0aW9uXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0sIHsgIm51bGxhYmxlIiwgIm51bGxhYmxlIn0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBudWxscHRyOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKSk7CisgICAgUkVRVUlSRShnZW4gIT0gbnVsbHB0cik7CisgICAgUkVRVUlSRShnZW4tPmlzX3djZl9lbmFibGVkKCkpOworICAgIFJFUVVJUkUoZ2VuLT5pc19udWxsYWJsZV9lbmFibGVkKCkpOworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc19oYXNoY29kZV9lbmFibGVkKCkpOworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc19zZXJpYWxpemVfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFX0ZBTFNFKGdlbi0+aXNfdW5pb25fZW5hYmxlZCgpKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgcGFzcyBpbml0IHN1Y2Nlc2Z1bGx5IiwgIltpbml0aWFsaXphdGlvbl0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9LHsgIm51bGxhYmxlIiwgIm51bGxhYmxlIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+aW5pdF9nZW5lcmF0b3IoKSk7CisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL3Rlc3RzX21haW4uY2MgYi9jb21waWxlci9jcHAvdGVzdHMvdGVzdHNfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQwOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL3Rlc3RzX21haW4uY2MKQEAgLTAsMCArMSwxOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2RlZmluZSBDQVRDSF9DT05GSUdfTUFJTgorI2luY2x1ZGUgImNhdGNoL2NhdGNoLmhwcCIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC92ZXJzaW9uLmguaW4gYi9jb21waWxlci9jcHAvdmVyc2lvbi5oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzcwZWM5Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC92ZXJzaW9uLmguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZGVmaW5lIFRIUklGVF9WRVJTSU9OICJAUEFDS0FHRV9WRVJTSU9OQCIKZGlmZiAtLWdpdCBhL2NvbXBvc2VyLmpzb24gYi9jb21wb3Nlci5qc29uCmluZGV4IDBmMjJiNzYuLjFkM2E2YzAgMTAwNjQ0Ci0tLSBhL2NvbXBvc2VyLmpzb24KKysrIGIvY29tcG9zZXIuanNvbgpAQCAtMSw5ICsxLDExIEBACiB7CiAgICAgIm5hbWUiOiAiYXBhY2hlL3RocmlmdCIsCiAgICAgImRlc2NyaXB0aW9uIjogIkFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbSIsCi0gICAgImhvbWVwYWdlIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8iLAorICAgICJob21lcGFnZSI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciLAogICAgICJ0eXBlIjogImxpYnJhcnkiLAorICAgICJrZXl3b3JkcyI6IFsiUlBDIl0sCiAgICAgImxpY2Vuc2UiOiAiQXBhY2hlLTIuMCIsCisgICAgInJlYWRtZSI6ICJSRUFETUUubWQiLAogICAgICJhdXRob3JzIjogWwogICAgICAgICB7CiAgICAgICAgICAgICAibmFtZSI6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMiLApAQCAtMTYsMTIgKzE4LDE5IEBACiAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQiCiAgICAgfSwKICAgICAicmVxdWlyZSI6IHsKLSAgICAgICAgInBocCI6ICI+PTUuMy4wIgorICAgICAgICAicGhwIjogIl41LjUgfHwgXjcuMCIKKyAgICB9LAorICAgICJyZXF1aXJlLWRldiI6IHsKKyAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJ+NC44LjM2IiwKKyAgICAgICAgInNxdWl6bGFicy9waHBfY29kZXNuaWZmZXIiOiAiMy4qIgogICAgIH0sCiAgICAgImF1dG9sb2FkIjogewotICAgICAgICAicHNyLTAiOiB7IlRocmlmdCI6ICJsaWIvcGhwL2xpYi8ifQorICAgICAgICAicHNyLTQiOiB7IlRocmlmdFxcIjogImxpYi9waHAvbGliLyJ9CiAgICAgfSwKLSAgICAibWluaW11bS1zdGFiaWxpdHkiOiAiZGV2IiwKKyAgICAiYXV0b2xvYWQtZGV2IjogeworICAgICAgICAicHNyLTQiOiB7IlRlc3RcXFRocmlmdFxcIjogImxpYi9waHAvdGVzdC8ifQorICAgIH0sCisgICAgIm1pbmltdW0tc3RhYmlsaXR5IjogInN0YWJsZSIsCiAgICAgImV4dHJhIjogewogICAgICAgICAiYnJhbmNoLWFsaWFzIjogewogICAgICAgICAgICAgImRldi1tYXN0ZXIiOiAiMS4wLngtZGV2IgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCmluZGV4IDMxNmZiM2QuLmIwOWM5ODMgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25maWd1cmUuYWMKQEAgLTIwLDcgKzIwLDcgQEAKIEFDX1BSRVJFUSgyLjY1KQogQUNfQ09ORklHX01BQ1JPX0RJUihbLi9hY2xvY2FsXSkKIAotQUNfSU5JVChbdGhyaWZ0XSwgWzAuOS4zXSkKK0FDX0lOSVQoW3RocmlmdF0sIFswLjEzLjBdKQogCiBBQ19DT05GSUdfQVVYX0RJUihbLl0pCiAKQEAgLTM0LDEwICszNCwxMCBAQAogQVNfSUYoW3Rlc3QgIngkUFlfUFJFRklYIiA9IHhdLCBbUFlfUFJFRklYPSIvdXNyIl0pCiAKIEFDX0FSR19WQVIoW0pBVkFfUFJFRklYXSwgW1ByZWZpeCBmb3IgaW5zdGFsbGluZyB0aGUgSmF2YSBsaWIgamFyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vcm1hbCAtLXByZWZpeCBpcyBpZ25vcmVkIGZvciBKYXZhIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmEgaGFzIGRpZmZlcmVudCBjb252ZW50aW9ucy4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ID0gIi91c3IvbG9jYWwvbGliIl0pCi1BU19JRihbdGVzdCAieCRKQVZBX1BSRUZJWCIgPSB4XSwgW0pBVkFfUFJFRklYPSIvdXNyL2xvY2FsL2xpYiJdKQorQVNfSUYoW3Rlc3QgIngkSkFWQV9QUkVGSVgiICE9IHhdLCBbSkFWQV9QUkVGSVg9IiRKQVZBX1BSRUZJWC91c3IvbG9jYWwvbGliIl0sCisgICAgICBbdGVzdCAieCRQUkVGSVgiICE9IHhdLCBbSkFWQV9QUkVGSVg9IiRQUkVGSVgvdXNyL2xvY2FsL2xpYiJdLAorICAgICAgW0pBVkFfUFJFRklYPSIvdXNyL2xvY2FsL2xpYiJdKQogCiBBQ19BUkdfVkFSKFtSVUJZX1BSRUZJWF0sIFtQcmVmaXggZm9yIGluc3RhbGxpbmcgUnVieSBtb2R1bGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vcm1hbCAtLXByZWZpeCBpcyBpZ25vcmVkIGZvciBSdWJ5IGJlY2F1c2UKQEAgLTgzLDYgKzgzLDkgQEAKIEFDX0FSR19WQVIoW0RNRF9MSUJFVkVOVF9GTEFHU10sIFtETUQgZmxhZ3MgZm9yIGxpbmtpbmcgbGliZXZlbnQgKGF1dG8tZGV0ZWN0ZWQgaWYgbm90IHNldCkuXSkKIEFDX0FSR19WQVIoW0RNRF9PUEVOU1NMX0ZMQUdTXSwgW0RNRCBmbGFncyBmb3IgbGlua2luZyBPcGVuU1NMIChhdXRvLWRldGVjdGVkIGlmIG5vdCBzZXQpLl0pCiAKK0FDX0FSR19WQVIoW1RIUklGVF0sIFtQYXRoIHRvIHRoZSB0aHJpZnQgdG9vbCAobmVlZGVkIGZvciBjcm9zcy1jb21waWxhdGlvbikuXSkKK0FTX0lGKFt0ZXN0ICJ4JFRIUklGVCIgPSB4XSwgW1RIUklGVD1gcHdkYC9jb21waWxlci9jcHAvdGhyaWZ0XSkKKwogQUNfUFJPR19DQwogQUNfUFJPR19DUFAKIEFDX1BST0dfQ1hYCkBAIC05OSwxMCArMTAyLDEyIEBACiBBQ19QUk9HX1JBTkxJQgogCiBBQ19MQU5HKFtDKytdKQotQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExKFtub2V4dF0sIFtvcHRpb25hbF0pCitBWF9DWFhfQ09NUElMRV9TVERDWFhfMTEoW25vZXh0XSwgW21hbmRhdG9yeV0pCiAKIEFNX0VYVFJBX1JFQ1VSU0lWRV9UQVJHRVRTKFtzdHlsZV0pCiBBQ19TVUJTVChDUFBTVFlMRV9DTUQsICdmaW5kIC4gLXR5cGUgZiBcKCAtaW5hbWUgIiouaCIgLW9yIC1pbmFtZSAiKi5jcHAiIC1vciAtaW5hbWUgIiouY2MiIC1vciAtaW5hbWUgIioudGNjIiBcKSAtcHJpbnRmICJSZWZvcm1hdHRpbmc6ICVoLyVmXG4iIC1leGVjIGNsYW5nLWZvcm1hdCAtaSB7fSBcOycpCisjICcKKyMgVGhlIGFib3ZlIGNvbW1lbnQgaXMgdG8gZml4IGVkaXRvciBzeW50YXggaGlnaGxpZ2h0aW5nCiAKIEFDX0FSR19FTkFCTEUoW2xpYnNdLAogICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbGlic10sIFtidWlsZCB0aGUgQXBhY2hlIFRocmlmdCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXV0pLApAQCAtMTExLDI0ICsxMTYsNDQgQEAKIGhhdmVfbGlicz15ZXMKIGlmIHRlc3QgIiRlbmFibGVfbGlicyIgPSAibm8iOyB0aGVuCiAgIGhhdmVfbGlicz0ibm8iCisgIHdpdGhfYXMzPSJubyIKICAgd2l0aF9jcHA9Im5vIgogICB3aXRoX2NfZ2xpYj0ibm8iCisgIHdpdGhfY2w9Im5vIgogICB3aXRoX2phdmE9Im5vIgogICB3aXRoX2NzaGFycD0ibm8iCiAgIHdpdGhfcHl0aG9uPSJubyIKKyAgd2l0aF9weTM9Im5vIgogICB3aXRoX3J1Ynk9Im5vIgogICB3aXRoX2hhc2tlbGw9Im5vIgogICB3aXRoX2hheGU9Im5vIgorICB3aXRoX2RvdG5ldGNvcmU9Im5vIgorICB3aXRoX25ldHN0ZD0ibm8iCiAgIHdpdGhfcGVybD0ibm8iCiAgIHdpdGhfcGhwPSJubyIKICAgd2l0aF9waHBfZXh0ZW5zaW9uPSJubyIKKyAgd2l0aF9kYXJ0PSJubyIKICAgd2l0aF9lcmxhbmc9Im5vIgogICB3aXRoX2dvPSJubyIKICAgd2l0aF9kPSJubyIKICAgd2l0aF9ub2RlanM9Im5vIgorICB3aXRoX25vZGV0cz0ibm8iCiAgIHdpdGhfbHVhPSJubyIKKyAgd2l0aF9ycz0ibm8iCisgIHdpdGhfc3dpZnQ9Im5vIgogZmkKIAorQVhfVEhSSUZUX0xJQihhczMsIFthczNdLCB5ZXMpCitoYXZlX2FzMz1ubworaWYgdGVzdCAiJHdpdGhfYXMzIiA9ICJ5ZXMiOyB0aGVuCisgIGlmIHRlc3QgIiR7RkxFWF9IT01FK3NldH0iID0gc2V0OyB0aGVuIAorICAgIEFDX1BBVEhfUFJPR1MoW0ZMRVhfQ09NUENdLCBbY29tcGNdLCAiZmFpbCIsIFskUEFUSCRQQVRIX1NFUEFSQVRPUiRGTEVYX0hPTUUvYmluXSkKKyAgICBpZiB0ZXN0ICIkRkxFWF9DT01QQyIgIT0gImZhaWwiOyB0aGVuCisgICAgICBoYXZlX2FzMz0ieWVzIgorICAgIGZpCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9BUzMsIFt0ZXN0ICIkaGF2ZV9hczMiID0gInllcyJdKQogCiBBWF9USFJJRlRfTElCKGNwcCwgW0MrK10sIHllcykKIGhhdmVfY3BwPW5vCkBAIC0xNDQsMjYgKzE2OSwxMiBAQAogICAgIGhhdmVfY3BwPSJ5ZXMiCiAgIGZpCiAKLSAgQVhfQ0hFQ0tfT1BFTlNTTCgpCi0KLSAgQVhfTElCX0VWRU5UKFsxLjBdKQorICBBWF9MSUJfRVZFTlQoWzIuMF0pCiAgIGhhdmVfbGliZXZlbnQ9JHN1Y2Nlc3MKIAogICBBWF9MSUJfWkxJQihbMS4yLjNdKQogICBoYXZlX3psaWI9JHN1Y2Nlc3MKIAotICBBWF9USFJJRlRfTElCKHF0NCwgW1F0XSwgeWVzKQotICBoYXZlX3F0PW5vCi0gIGlmIHRlc3QgIiR3aXRoX3F0NCIgPSAieWVzIjsgIHRoZW4KLSAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhbUVRdLCBbUXRDb3JlID49IDQuMywgUXROZXR3b3JrID49IDQuM10sIGhhdmVfcXQ9eWVzLCBoYXZlX3F0PW5vKQotICBmaQotICBpZiB0ZXN0ICIkaGF2ZV9xdCIgPSAieWVzIjsgdGhlbgotICAgIEFDX1BBVEhfUFJPR1MoW1FUX01PQ10sIFttb2MtcXQ0IG1vY10sICJmYWlsIikKLSAgICBpZiB0ZXN0ICIkUVRfTU9DIiA9ICJmYWlsIjsgdGhlbgotICAgICAgaGF2ZV9xdD1ubwotICAgIGZpCi0gIGZpCi0KICAgQVhfVEhSSUZUX0xJQihxdDUsIFtRdDVdLCB5ZXMpCiAgIGhhdmVfcXQ1PW5vCiAgIHF0X3JlZHVjZV9yZWxvYz0iIgpAQCAtMTgyLDcgKzE5Myw2IEBACiBBTV9DT05ESVRJT05BTChbV0lUSF9DUFBdLCBbdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiXSkKIEFNX0NPTkRJVElPTkFMKFtBTVhfSEFWRV9MSUJFVkVOVF0sIFt0ZXN0ICIkaGF2ZV9saWJldmVudCIgPSAieWVzIl0pCiBBTV9DT05ESVRJT05BTChbQU1YX0hBVkVfWkxJQl0sIFt0ZXN0ICIkaGF2ZV96bGliIiA9ICJ5ZXMiXSkKLUFNX0NPTkRJVElPTkFMKFtBTVhfSEFWRV9RVF0sIFt0ZXN0ICIkaGF2ZV9xdCIgPSAieWVzIl0pCiBBTV9DT05ESVRJT05BTChbQU1YX0hBVkVfUVQ1XSwgW3Rlc3QgIiRoYXZlX3F0NSIgPSAieWVzIl0pCiBBTV9DT05ESVRJT05BTChbUVQ1X1JFRFVDRV9SRUxPQ0FUSU9OU10sIFt0ZXN0ICJ4JHF0X3JlZHVjZV9yZWxvYyIgIT0gIngiXSkKIApAQCAtMTkxLDExICsyMDEsMTggQEAKICAgUEtHX0NIRUNLX01PRFVMRVMoW0dMSUJdLCBbZ2xpYi0yLjAgPj0gMi4wXSwgaGF2ZV9nbGliMj15ZXMsIGhhdmVfZ2xpYjI9bm8pCiAgIFBLR19DSEVDS19NT0RVTEVTKFtHT0JKRUNUXSwgW2dvYmplY3QtMi4wID49IDIuMF0sIGhhdmVfZ29iamVjdDI9eWVzLCBoYXZlX2dvYmplY3QyPW5vKQogICBpZiB0ZXN0ICIkaGF2ZV9nbGliMiIgPSAieWVzIiAtYSAiJGhhdmVfZ29iamVjdDIiID0gInllcyIgOyB0aGVuCisgICAgQUNfUEFUSF9QUk9HKFtHU0VUVElOR1NdLCBbZ3NldHRpbmdzXSkKICAgICBoYXZlX2NfZ2xpYj0ieWVzIgogICBmaQogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfQ19HTElCLCBbdGVzdCAiJGhhdmVfZ2xpYjIiID0gInllcyIgLWEgIiRoYXZlX2dvYmplY3QyIiA9ICJ5ZXMiXSkKIAorIyBlY2hvICJPcGVuU1NMIGNoZWNrIgoraWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIC1vICIkaGF2ZV9jX2dsaWIiID0gInllcyI7ICB0aGVuCisgICMgZWNobyAiSGF2ZSBjcHAgb3IgYyBzbyB3ZSBjaGVjayBmb3IgT3BlblNTTCIKKyAgQVhfQ0hFQ0tfT1BFTlNTTCgpCitmaQorCiBBWF9USFJJRlRfTElCKGNzaGFycCwgW0MjXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfY3NoYXJwIiA9ICJ5ZXMiOyAgdGhlbgogICBQS0dfQ0hFQ0tfTU9EVUxFUyhNT05PLCBtb25vID49IDIuMTEuMCwgbW9ub18yXzExPXllcywgbW9ub18yXzExPW5vKQpAQCAtMjIyLDYgKzIzOSw3IEBACiAgIEFYX0NIRUNLX0FOVF9WRVJTSU9OKCRBTlQsIDEuNykKICAgQUNfU1VCU1QoQ0xBU1NQQVRIKQogICBBQ19TVUJTVChBTlRfRkxBR1MpCisgIEFDX1NVQlNUKEdSQURMRV9PUFRTKQogICBpZiB0ZXN0ICJ4JEpBVkEiICE9ICJ4IiAmJiB0ZXN0ICJ4JEpBVkFDIiAhPSAieCIgJiYgdGVzdCAieCRBTlQiICE9ICJ4IiA7IHRoZW4KICAgICBoYXZlX2phdmE9InllcyIKICAgZmkKQEAgLTIzMiwxMyArMjUwLDE0IEBACiBpZiB0ZXN0ICIkd2l0aF9lcmxhbmciID0gInllcyI7ICB0aGVuCiAgIEFDX0VSTEFOR19QQVRIX0VSTAogICBBQ19FUkxBTkdfUEFUSF9FUkxDCisgIEFDX1BBVEhfUFJPRyhbUkVCQVJdLCBbcmViYXJdKQogICBpZiB0ZXN0IC1uICIkRVJMQyIgOyB0aGVuCiAgICAgQUNfRVJMQU5HX1NVQlNUX0xJQl9ESVIKICAgICAjIEluc3RhbGwgaW50byB0aGUgZGV0ZWN0ZWQgRXJsYW5nIGRpcmVjdG9yeSBpbnN0ZWFkIG9mICRsaWJkaXIvZXJsYW5nL2xpYgogICAgIEVSTEFOR19JTlNUQUxMX0xJQl9ESVI9IiRFUkxBTkdfTElCX0RJUiIKICAgICBBQ19FUkxBTkdfU1VCU1RfSU5TVEFMTF9MSUJfU1VCRElSKEFDX1BBQ0tBR0VfTkFNRSwgQUNfUEFDS0FHRV9WRVJTSU9OKQogICBmaQotICBpZiB0ZXN0IC1uICIkRVJMIiAtYSAtbiAiJEVSTEMiIDsgdGhlbgorICBpZiB0ZXN0IC1uICIkRVJMIiAtYSAtbiAiJEVSTEMiICYmIHRlc3QgIngkUkVCQVIiICE9ICJ4IiA7IHRoZW4KICAgICBoYXZlX2VybGFuZz0ieWVzIgogCiAgICAgIyBvdHBfcmVsZWFzZSBpcyBzaW1wbHkgYSBudW1iZXIgKGxpa2UgIjE3IikgZm9yIE9UUDE3KyB3aGlsZSAiUjE2Li4uIiBmb3IgT1RQMTYgb3IgbGVzcy4KQEAgLTI2Myw2ICsyODIsMTggQEAKIEFNX0NPTkRJVElPTkFMKFdJVEhfTk9ERUpTLCBbdGVzdCAiJGhhdmVfbm9kZWpzIiA9ICJ5ZXMiXSkKIEFNX0NPTkRJVElPTkFMKEhBVkVfTlBNLCBbdGVzdCAieCROUE0iICE9ICJ4Il0pCiAKK0FYX1RIUklGVF9MSUIobm9kZXRzLCBbTm9kZXRzXSwgeWVzKQoraGF2ZV9ub2RldHM9bm8KK2lmIHRlc3QgIiR3aXRoX25vZGV0cyIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0dTKFtOT0RFVFNdLCBbbm9kZXRzIG5vZGVdKQorICBBQ19QQVRIX1BST0coW05QTV0sIFtucG1dKQorICBpZiB0ZXN0ICJ4JE5PREVUUyIgIT0gIngiIC1hICJ4JE5QTSIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9ub2RldHM9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX05PREVUUywgW3Rlc3QgIiRoYXZlX25vZGV0cyIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChIQVZFX05QTSwgW3Rlc3QgIngkTlBNIiAhPSAieCJdKQorCiBBWF9USFJJRlRfTElCKGx1YSwgW0x1YV0sIHllcykKIGhhdmVfbHVhPW5vCiBpZiB0ZXN0ICIkd2l0aF9sdWEiID0gInllcyI7IHRoZW4KQEAgLTI3NCwxNSArMzA1LDM1IEBACiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9MVUEsIFt0ZXN0ICIkaGF2ZV9sdWEiID0gInllcyJdKQogCisjIEZpbmQgcHl0aG9uIHJlZ2FyZGxlc3Mgb2Ygd2l0aF9weXRob24gdmFsdWUsIGJlY2F1c2UgaXQncyBuZWVkZWQgYnkgbWFrZSBjcm9zcworQU1fUEFUSF9QWVRIT04oMi42LCwgOikKIEFYX1RIUklGVF9MSUIocHl0aG9uLCBbUHl0aG9uXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfcHl0aG9uIiA9ICJ5ZXMiOyAgdGhlbgotICBBQ19QQVRIX1BST0coW1RSSUFMXSwgW3RyaWFsXSkKLSAgQU1fUEFUSF9QWVRIT04oMi40LCwgOikKLSAgaWYgdGVzdCAtbiAiJFRSSUFMIiAmJiB0ZXN0ICJ4JFBZVEhPTiIgIT0gIngiICYmIHRlc3QgIngkUFlUSE9OIiAhPSAieDoiIDsgdGhlbgorICBpZiB0ZXN0IC1uICIkUFlUSE9OIjsgdGhlbgogICAgIGhhdmVfcHl0aG9uPSJ5ZXMiCiAgIGZpCisgIEFDX1BBVEhfUFJPRyhbVFJJQUxdLCBbdHJpYWxdKQorICBpZiB0ZXN0IC1uICIkVFJJQUwiOyB0aGVuCisgICAgaGF2ZV90cmlhbD0ieWVzIgorICBmaQogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfUFlUSE9OLCBbdGVzdCAiJGhhdmVfcHl0aG9uIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFdJVEhfVFdJU1RFRF9URVNULCBbdGVzdCAiJGhhdmVfdHJpYWwiID0gInllcyJdKQorCisjIEZpbmQgInB5dGhvbjMiIGV4ZWN1dGFibGUuCisjIEl0J3MgZGlzdHJvIHNwZWNpZmljIGFuZCBmYXIgZnJvbSBpZGVhbCBidXQgbmVlZGVkIHRvIGNyb3NzIHRlc3QgcHkyLTMgYXQgb25jZS4KKyMgVE9ETzogZmluZCAicHl0aG9uMiIgaWYgaXQncyAzLngKK2hhdmVfcHkzPSJubyIKK0FYX1RIUklGVF9MSUIocHkzLCBbUHkzXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfcHkzIiA9ICJ5ZXMiOyB0aGVuCisgIGlmICRQWVRIT04gLS12ZXJzaW9uIDI+JjEgfCBncmVwIC1xICJQeXRob24gMiI7IHRoZW4KKyAgICBBQ19QQVRIX1BST0dTKFtQWVRIT04zXSwgW3B5dGhvbjMgcHl0aG9uMy43IHB5dGhvbjM3IHB5dGhvbjMuNiBweXRob24zNiBweXRob24zLjUgcHl0aG9uMzUgcHl0aG9uMy40IHB5dGhvbjM0XSkKKyAgICBpZiB0ZXN0IC1uICIkUFlUSE9OMyI7IHRoZW4KKyAgICAgIGhhdmVfcHkzPSJ5ZXMiCisgICAgZmkKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX1BZMywgW3Rlc3QgIiRoYXZlX3B5MyIgPSAieWVzIl0pCiAKIEFYX1RIUklGVF9MSUIocGVybCwgW1BlcmxdLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9wZXJsIiA9ICJ5ZXMiOyB0aGVuCkBAIC0zMjIsOCArMzczLDE1IEBACiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9QSFBfRVhURU5TSU9OLCBbdGVzdCAiJGhhdmVfcGhwX2V4dGVuc2lvbiIgPSAieWVzIl0pCiAKLUFDX1BBVEhfUFJPRyhbUEhQVU5JVF0sIFtwaHB1bml0XSkKLUFNX0NPTkRJVElPTkFMKEhBVkVfUEhQVU5JVCwgW3Rlc3QgIngkUEhQVU5JVCIgIT0gIngiXSkKK0FYX1RIUklGVF9MSUIoZGFydCwgW0RBUlRdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9kYXJ0IiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1BBVEhfUFJPRyhbREFSVF0sIFtkYXJ0XSkKKyAgQUNfUEFUSF9QUk9HKFtEQVJUUFVCXSwgW3B1Yl0pCisgIGlmIHRlc3QgIngkREFSVCIgIT0gIngiIC1hICJ4JERBUlRQVUIiICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfZGFydD0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfREFSVCwgW3Rlc3QgIiRoYXZlX2RhcnQiID0gInllcyJdKQogCiBBWF9USFJJRlRfTElCKHJ1YnksIFtSdWJ5XSwgeWVzKQogaGF2ZV9ydWJ5PW5vCkBAIC0zNjEsNiArNDE5LDcgQEAKICAgaWYgW1sgLXggIiRHTyIgXV0gOyB0aGVuCiAgICAgQVNfSUYoW3Rlc3QgLW4gIiRHTyJdLFsKICAgICAgIGF4X2dvX3ZlcnNpb249IjEuNCIKKyAgICAgIGF4X2dvMTdfdmVyc2lvbj0iMS43IgogCiAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHbyB2ZXJzaW9uXSkKICAgICAgIGdvbGFuZ192ZXJzaW9uPWAkR08gdmVyc2lvbiAyPiYxIHwgJFNFRCAtZSAncy9cKGdvIFwpXCh2ZXJzaW9uIFwpXChnb1wpXChAPDpAMC05QDo+QC5APDpAMC05QDo+QC5APDpAMC05QDo+QFwpXChAPDpAXCpAOj5AKlwpLiovXDQvJ2AKQEAgLTM3Myw2ICs0MzIsMTMgQEAKICAgICAgIDoKICAgICAgICAgaGF2ZV9nbz0ibm8iCiAgICAgICBdKQorICAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFskZ29sYW5nX3ZlcnNpb25dLFtsdF0sWyRheF9nbzE3X3ZlcnNpb25dLFsKKyAgICAgIDoKKyAgICAgICAgZ29fdmVyc2lvbl9sdF8xNz0ieWVzIgorICAgICAgXSxbCisgICAgICA6CisgICAgICAgIGdvX3ZlcnNpb25fbHRfMTc9Im5vIgorICAgICAgXSkKICAgICBdLFsKICAgICAgIEFDX01TR19XQVJOKFtjb3VsZCBub3QgZmluZCBHbyBdKQogICAgICAgaGF2ZV9nbz0ibm8iCkBAIC0zODAsNyArNDQ2LDUxIEBACiAgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9HTywgW3Rlc3QgIiRoYXZlX2dvIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFtHT1ZFUlNJT05fTFRfMTddLCBbdGVzdCAiJGdvX3ZlcnNpb25fbHRfMTciID0gInllcyJdKQogCitBWF9USFJJRlRfTElCKHN3aWZ0LCBbU3dpZnRdLCB5ZXMpCitoYXZlX3N3aWZ0PSJubyIKK2lmIHRlc3QgIiR3aXRoX3N3aWZ0IiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1BBVEhfUFJPRyhbU1dJRlRdLCBbc3dpZnRdKQorICBpZiB0ZXN0ICJ4JFNXSUZUIiAhPSAieCIgLWEgIngkU1dJRlQiICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfc3dpZnQ9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChbV0lUSF9TV0lGVF0sIFt0ZXN0ICIkaGF2ZV9zd2lmdCIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIocnMsIFtSdXN0XSwgeWVzKQoraGF2ZV9ycz0ibm8iCitpZiB0ZXN0ICIkd2l0aF9ycyIgPSAieWVzIjsgIHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtDQVJHT10sIFtjYXJnb10pCisgIEFDX1BBVEhfUFJPRyhbUlVTVENdLCBbcnVzdGNdKQorICBpZiBbWyAteCAiJENBUkdPIiBdXSAmJiBbWyAteCAiJFJVU1RDIiBdXTsgdGhlbgorICAgICAgbWluX3J1c3RjX3ZlcnNpb249IjEuMTMiCisKKyAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHJ1c3RjIHZlcnNpb25dKQorICAgICAgcnVzdGNfdmVyc2lvbj1gJFJVU1RDIC0tdmVyc2lvbiAyPiYxIHwgJFNFRCAtZSAncy9cKHJ1c3RjIFwpXChbMC05XVwpXC5cKFswLTldWzAtOV0qXClcLlwoWzAtOV1bMC05XSpcKS4qL1wyLlwzLydgCisgICAgICBBQ19NU0dfUkVTVUxUKCRydXN0Y192ZXJzaW9uKQorICAgICAgQUNfU1VCU1QoW3J1c3RjX3ZlcnNpb25dLFskcnVzdGNfdmVyc2lvbl0pCisKKyAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJG1pbl9ydXN0Y192ZXJzaW9uXSxbbGVdLFskcnVzdGNfdmVyc2lvbl0sWworICAgICAgOgorICAgICAgICBoYXZlX3JzPSJ5ZXMiCisgICAgICBdLFsKKyAgICAgIDoKKyAgICAgICAgaGF2ZV9ycz0ibm8iCisgICAgICBdKQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUlMsIFt0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIoY2wsIFtDb21tb24gTGlzcF0sIHllcykKK2hhdmVfY2w9Im5vIgoraWYgdGVzdCAiJHdpdGhfY2wiID0gInllcyI7ICB0aGVuCisgIEFDX1BBVEhfUFJPRyhbU0JDTF0sIFtzYmNsXSkKKyAgaWYgdGVzdCAieCRTQkNMIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX2NsPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9DTCwgW3Rlc3QgIiRoYXZlX2NsIiA9ICJ5ZXMiXSkKIAogQVhfVEhSSUZUX0xJQihoYXhlLCBbSGF4ZV0sIHllcykKIGlmIHRlc3QgIiR3aXRoX2hheGUiID0gInllcyI7ICB0aGVuCkBAIC0zOTIsNiArNTAyLDE2IEBACiBBTV9DT05ESVRJT05BTChXSVRIX0hBWEUsIFt0ZXN0ICIkaGF2ZV9oYXhlIiA9ICJ5ZXMiXSkKIAogCitBWF9USFJJRlRfTElCKGRvdG5ldGNvcmUsIFsuTkVUIENvcmVdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9kb3RuZXRjb3JlIiA9ICJ5ZXMiOyAgdGhlbgorICBBQ19QQVRIX1BST0coW0RPVE5FVENPUkVdLCBbZG90bmV0XSkKKyAgaWYgW1sgLXggIiRET1RORVRDT1JFIiBdXSA7IHRoZW4KKyAgICBBWF9QUk9HX0RPVE5FVENPUkVfVkVSU0lPTiggWzIuMC4wXSwgaGF2ZV9kb3RuZXRjb3JlPSJ5ZXMiLCBoYXZlX2RvdG5ldGNvcmU9Im5vIikKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0RPVE5FVCwgW3Rlc3QgIiRoYXZlX2RvdG5ldGNvcmUiID0gInllcyJdKQorCisKIEFYX1RIUklGVF9MSUIoZCwgW0RdLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9kIiA9ICJ5ZXMiOyAgdGhlbgogICBBWF9ETUQKQEAgLTQzMiw3ICs1NTIsNyBAQAogICAgICAgZWxzZQogICAgICAgICBBWF9MSUJfRVZFTlQoWzIuMF0pCiAgICAgICAgIGlmIHRlc3QgIiRzdWNjZXNzIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgRE1EX0xJQkVWRU5UX0ZMQUdTPSQoZWNobyAiJExJQkVWRU5UX0xERkxBR1MgJExJQkVWRU5UX0xJQlMiIHwgXAorICAgICAgICAgIERNRF9MSUJFVkVOVF9GTEFHUz0kKGVjaG8gIi1mdXNlLWxkPWdvbGQgJExJQkVWRU5UX0xERkxBR1MgJExJQkVWRU5UX0xJQlMiIHwgXAogICAgICAgICAgICAgc2VkIC1lICdzL14gKi8vZztzLyAqJC8vZztzL15cKC5cKS8tTFwxL2c7cy8gICovIC1ML2cnKQogICAgICAgICAgIHdpdGhfZF9ldmVudF90ZXN0cz0ieWVzIgogICAgICAgICBlbHNlCkBAIC00NTYsNyArNTc2LDcgQEAKICAgICAgIGVsc2UKICAgICAgICAgQVhfQ0hFQ0tfT1BFTlNTTChbd2l0aF9kX3NzbF90ZXN0cz0ieWVzIl0pCiAgICAgICAgIGlmIHRlc3QgIiR3aXRoX2Rfc3NsX3Rlc3RzIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgRE1EX09QRU5TU0xfRkxBR1M9JChlY2hvICIkT1BFTlNTTF9MREZMQUdTICRPUEVOU1NMX0xJQlMiIHwgXAorICAgICAgICAgIERNRF9PUEVOU1NMX0ZMQUdTPSQoZWNobyAiLWZ1c2UtbGQ9Z29sZCAkT1BFTlNTTF9MREZMQUdTICRPUEVOU1NMX0xJQlMiIHwgXAogICAgICAgICAgICAgc2VkIC1lICdzL14gKi8vZztzLyAqJC8vZztzL15cKC5cKS8tTFwxL2c7cy8gICovIC1ML2cnKQogICAgICAgICBlbHNlCiAgICAgICAgICAgQUNfTVNHX1dBUk4oW0QgT3BlblNTTCBpbnRlcmZhY2UgcHJlc2VudCwgYnV0IE9wZW5TU0wgbGlicmFyeSBub3QgZm91bmQuXSkKQEAgLTUyNywxMSArNjQ3LDE0IEBACiBBQ19DSEVDS19IRUFERVJTKFtuZXRkYi5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW25ldGluZXQvaW4uaF0pCiBBQ19DSEVDS19IRUFERVJTKFtwdGhyZWFkLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc2lnbmFsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3RkZGVmLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3RkbGliLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL2lvY3RsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3NvY2tldC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy90aW1lLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3VuLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbcG9sbC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy9wb2xsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3Jlc291cmNlLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbdW5pc3RkLmhdKQpAQCAtNTUyLDcgKzY3NSw2IEBACiBBQ19DSEVDS19MSUIocnQsIGNsb2NrX2dldHRpbWUpCiBBQ19DSEVDS19MSUIoc29ja2V0LCBzZXRzb2Nrb3B0KQogCi1pZiB0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyIgOyB0aGVuCiBBQ19UWVBFX0lOVDE2X1QKIEFDX1RZUEVfSU5UMzJfVAogQUNfVFlQRV9JTlQ2NF9UCkBAIC01NjUsNyArNjg3LDcgQEAKIEFDX1RZUEVfVUlOVDMyX1QKIEFDX1RZUEVfVUlOVDY0X1QKIEFDX1RZUEVfVUlOVDhfVAotQUNfQ0hFQ0tfVFlQRVMoW3B0cmRpZmZfdF0sIFtdLCBbZXhpdCAxXSkKK0FDX0NIRUNLX1RZUEVTKFtwdHJkaWZmX3RdLCBbXSwgW2VjaG8gInB0cmRpZmZfdCBub3QgZm91bmQgb3IgZysrIG5vdCBpbnN0YWxsZWQgLSBjYW5ub3QgY29udGludWUiICYmIGV4aXQgMV0pCiAKIEFDX1NUUlVDVF9UTQogCkBAIC02NTEsMjYgKzc3Myw5IEBACiBBQ19TVUJTVChHQ09WX0NYWEZMQUdTKQogQUNfU1VCU1QoR0NPVl9MREZMQUdTKQogCi1BQ19BUkdfRU5BQkxFKGJvb3N0dGhyZWFkcywKLSAgICAgICAgICAgICAgWyAgLS1lbmFibGUtYm9vc3R0aHJlYWRzICAgICAgdXNlIGJvb3N0IHRocmVhZHMsIGluc3RlYWQgb2YgUE9TSVggcHRocmVhZCAoZXhwZXJpbWVudGFsKSBdLAotICAgICAgICAgICAgICBbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICAgICAgICAgICAgICAgIHllcykgRU5BQkxFX0JPT1NUVEhSRUFEUz0xIDs7Ci0gICAgICAgICAgICAgICAgbm8pIEVOQUJMRV9CT09TVFRIUkVBRFM9MCA7OwotICAgICAgICAgICAgICAgICopIEFDX01TR19FUlJPUihiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1jb3YpIDs7Ci0gICAgICAgICAgICAgIGVzYWNdLAotICAgICAgICAgICAgICBbRU5BQkxFX0JPT1NUVEhSRUFEUz0yXSkKLQotCi1pZiB0ZXN0ICJ4WyRdRU5BQkxFX0JPT1NUVEhSRUFEUyIgPSAieDEiOyB0aGVuCi0gIEFDX01TR19XQVJOKGVuYWJsZSBib29zdHRocmVhZHMpCi0gIEFDX0RFRklORShbVVNFX0JPT1NUX1RIUkVBRF0sIFsxXSwgW2V4cGVyaW1lbnRhbCAtLWVuYWJsZS1ib29zdHRocmVhZHMgdGhhdCByZXBsYWNlcyBQT1NJWCBwdGhyZWFkIGJ5IGJvb3N0Ojp0aHJlYWRdKQotICBMSUJTPSItbGJvb3N0X3RocmVhZCAkTElCUyIKLWZpCi0KLUFNX0NPTkRJVElPTkFMKFtXSVRIX0JPT1NUVEhSRUFEU10sIFt0ZXN0ICJ4WyRdRU5BQkxFX0JPT1NUVEhSRUFEUyIgPSAieDEiXSkKLQogQUNfQ09ORklHX0hFQURFUlMoY29uZmlnLmg6Y29uZmlnLmhpbikKIEFDX0NPTkZJR19IRUFERVJTKGxpYi9jcHAvc3JjL3RocmlmdC9jb25maWcuaDpjb25maWcuaGluKQorQUNfQ09ORklHX0hFQURFUlMobGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NvbmZpZy5oOmNvbmZpZy5oaW4pCiAjIGdydWFyZCBhZ2FpbnN0IHByZSBkZWZpbmVkIGNvbmZpZy5oCiBBSF9UT1AoWwogI2lmbmRlZiBDT05GSUdfSApAQCAtNjg0LDIxICs3ODksMjMgQEAKIEFDX0NPTkZJR19GSUxFUyhbCiAgIE1ha2VmaWxlCiAgIGNvbXBpbGVyL2NwcC9NYWtlZmlsZQotICBjb21waWxlci9jcHAvdmVyc2lvbi5oCi0gIGNvbXBpbGVyL2NwcC9zcmMvd2luZG93cy92ZXJzaW9uLmgKKyAgY29tcGlsZXIvY3BwL3NyYy9NYWtlZmlsZQorICBjb21waWxlci9jcHAvdGVzdC9NYWtlZmlsZQorICBjb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmgKICAgbGliL01ha2VmaWxlCisgIGxpYi9hczMvTWFrZWZpbGUKKyAgbGliL2NsL01ha2VmaWxlCiAgIGxpYi9jcHAvTWFrZWZpbGUKICAgbGliL2NwcC90ZXN0L01ha2VmaWxlCiAgIGxpYi9jcHAvdGhyaWZ0LW5iLnBjCiAgIGxpYi9jcHAvdGhyaWZ0LXoucGMKLSAgbGliL2NwcC90aHJpZnQtcXQucGMKICAgbGliL2NwcC90aHJpZnQtcXQ1LnBjCiAgIGxpYi9jcHAvdGhyaWZ0LnBjCiAgIGxpYi9jX2dsaWIvTWFrZWZpbGUKICAgbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjCiAgIGxpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZQogICBsaWIvY3NoYXJwL01ha2VmaWxlCi0gIGxpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L01ha2VmaWxlCisgIGxpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTWFrZWZpbGUKICAgbGliL2QvTWFrZWZpbGUKICAgbGliL2QvdGVzdC9NYWtlZmlsZQogICBsaWIvZXJsL01ha2VmaWxlCkBAIC03MDcsNjUgKzgxNCwxMTQgQEAKICAgbGliL2hheGUvdGVzdC9NYWtlZmlsZQogICBsaWIvaHMvTWFrZWZpbGUKICAgbGliL2phdmEvTWFrZWZpbGUKKyAgbGliL2pzL01ha2VmaWxlCiAgIGxpYi9qcy90ZXN0L01ha2VmaWxlCisgIGxpYi9qc29uL01ha2VmaWxlCisgIGxpYi9qc29uL3Rlc3QvTWFrZWZpbGUKKyAgbGliL25ldGNvcmUvTWFrZWZpbGUKKyAgbGliL25ldHN0ZC9NYWtlZmlsZQogICBsaWIvbm9kZWpzL01ha2VmaWxlCisgIGxpYi9ub2RldHMvTWFrZWZpbGUKICAgbGliL3BlcmwvTWFrZWZpbGUKLSAgbGliL3BlcmwvdGVzdC9NYWtlZmlsZQorICBsaWIvcGVybC90L01ha2VmaWxlCiAgIGxpYi9waHAvTWFrZWZpbGUKICAgbGliL3BocC90ZXN0L01ha2VmaWxlCisgIGxpYi9kYXJ0L01ha2VmaWxlCiAgIGxpYi9weS9NYWtlZmlsZQogICBsaWIvcmIvTWFrZWZpbGUKKyAgbGliL3JzL01ha2VmaWxlCisgIGxpYi9ycy90ZXN0L01ha2VmaWxlCiAgIGxpYi9sdWEvTWFrZWZpbGUKKyAgbGliL3N3aWZ0L01ha2VmaWxlCisgIGxpYi90cy9NYWtlZmlsZQorICBsaWIveG1sL01ha2VmaWxlCisgIGxpYi94bWwvdGVzdC9NYWtlZmlsZQogICB0ZXN0L01ha2VmaWxlCisgIHRlc3QvZmVhdHVyZXMvTWFrZWZpbGUKICAgdGVzdC9jX2dsaWIvTWFrZWZpbGUKKyAgdGVzdC9jbC9NYWtlZmlsZQogICB0ZXN0L2NwcC9NYWtlZmlsZQorICB0ZXN0L2NzaGFycC9NYWtlZmlsZQogICB0ZXN0L2VybC9NYWtlZmlsZQogICB0ZXN0L2dvL01ha2VmaWxlCiAgIHRlc3QvaGF4ZS9NYWtlZmlsZQogICB0ZXN0L2hzL01ha2VmaWxlCisgIHRlc3QvbHVhL01ha2VmaWxlCisgIHRlc3QvbmV0Y29yZS9NYWtlZmlsZQorICB0ZXN0L25ldHN0ZC9NYWtlZmlsZQogICB0ZXN0L3BocC9NYWtlZmlsZQorICB0ZXN0L2RhcnQvTWFrZWZpbGUKICAgdGVzdC9wZXJsL01ha2VmaWxlCiAgIHRlc3QvcHkvTWFrZWZpbGUKICAgdGVzdC9weS50d2lzdGVkL01ha2VmaWxlCiAgIHRlc3QvcHkudG9ybmFkby9NYWtlZmlsZQogICB0ZXN0L3JiL01ha2VmaWxlCisgIHRlc3QvcnMvTWFrZWZpbGUKICAgdHV0b3JpYWwvTWFrZWZpbGUKICAgdHV0b3JpYWwvY19nbGliL01ha2VmaWxlCisgIHR1dG9yaWFsL2NsL01ha2VmaWxlCiAgIHR1dG9yaWFsL2NwcC9NYWtlZmlsZQorICB0dXRvcmlhbC9kL01ha2VmaWxlCiAgIHR1dG9yaWFsL2dvL01ha2VmaWxlCiAgIHR1dG9yaWFsL2hheGUvTWFrZWZpbGUKICAgdHV0b3JpYWwvaHMvTWFrZWZpbGUKICAgdHV0b3JpYWwvamF2YS9NYWtlZmlsZQogICB0dXRvcmlhbC9qcy9NYWtlZmlsZQorICB0dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlCisgIHR1dG9yaWFsL25ldHN0ZC9NYWtlZmlsZQogICB0dXRvcmlhbC9ub2RlanMvTWFrZWZpbGUKKyAgdHV0b3JpYWwvZGFydC9NYWtlZmlsZQogICB0dXRvcmlhbC9weS9NYWtlZmlsZQogICB0dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlCiAgIHR1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUKICAgdHV0b3JpYWwvcmIvTWFrZWZpbGUKKyAgdHV0b3JpYWwvcnMvTWFrZWZpbGUKIF0pCiAKK2lmIHRlc3QgIiRoYXZlX2FzMyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfQVMzPSJhczMiIDsgZWxzZSBNQVlCRV9BUzM9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0FTM10pCiBpZiB0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyIgOyB0aGVuIE1BWUJFX0NQUD0iY3BwIiA7IGVsc2UgTUFZQkVfQ1BQPSIiIDsgZmkKIEFDX1NVQlNUKFtNQVlCRV9DUFBdKQogaWYgdGVzdCAiJGhhdmVfY19nbGliIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9DX0dMSUI9ImNfZ2xpYiIgOyBlbHNlIE1BWUJFX0NfR0xJQj0iIiA7IGZpCiBBQ19TVUJTVChbTUFZQkVfQ19HTElCXSkKK2lmIHRlc3QgIiRoYXZlX2QiID0gInllcyIgLWEgIiRoYXZlX2RlaW1vc19ldmVudDIiID0gInllcyIgLWEgIiRoYXZlX2RlaW1vc19vcGVuc3NsIiA9ICJ5ZXMiOyB0aGVuIE1BWUJFX0Q9ImQiIDsgZWxzZSBNQVlCRV9EPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9EXSkKIGlmIHRlc3QgIiRoYXZlX2phdmEiID0gInllcyIgOyB0aGVuIE1BWUJFX0pBVkE9ImphdmEiIDsgZWxzZSBNQVlCRV9KQVZBPSIiIDsgZmkKIEFDX1NVQlNUKFtNQVlCRV9KQVZBXSkKIGlmIHRlc3QgIiRoYXZlX2NzaGFycCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfQ1NIQVJQPSJjc2hhcnAiIDsgZWxzZSBNQVlCRV9DU0hBUlA9IiIgOyBmaQogQUNfU1VCU1QoW01BWUJFX0NTSEFSUF0pCi1pZiB0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyIgOyB0aGVuIE1BWUJFX1BZVEhPTj0icHl0aG9uIiA7IGVsc2UgTUFZQkVfUFlUSE9OPSIiIDsgZmkKK2lmIHRlc3QgIiRoYXZlX3B5dGhvbiIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUFlUSE9OPSJweSIgOyBlbHNlIE1BWUJFX1BZVEhPTj0iIiA7IGZpCiBBQ19TVUJTVChbTUFZQkVfUFlUSE9OXSkKK2lmIHRlc3QgIiRoYXZlX3B5MyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUFkzPSJweTMiIDsgZWxzZSBNQVlCRV9QWTM9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1BZM10pCiBpZiB0ZXN0ICIkaGF2ZV9ydWJ5IiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9SVUJZPSJyYiIgOyBlbHNlIE1BWUJFX1JVQlk9IiIgOyBmaQogQUNfU1VCU1QoW01BWUJFX1JVQlldKQotaWYgdGVzdCAiJGhhdmVfaGFza2VsbCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfSEFTS0VMTD0iaGFza2VsbCIgOyBlbHNlIE1BWUJFX0hBU0tFTEw9IiIgOyBmaQoraWYgdGVzdCAiJGhhdmVfaGFza2VsbCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfSEFTS0VMTD0iaHMiIDsgZWxzZSBNQVlCRV9IQVNLRUxMPSIiIDsgZmkKIEFDX1NVQlNUKFtNQVlCRV9IQVNLRUxMXSkKIGlmIHRlc3QgIiRoYXZlX3BlcmwiID0gInllcyIgOyB0aGVuIE1BWUJFX1BFUkw9InBlcmwiIDsgZWxzZSBNQVlCRV9QRVJMPSIiIDsgZmkKIEFDX1NVQlNUKFtNQVlCRV9QRVJMXSkKIGlmIHRlc3QgIiRoYXZlX3BocCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUEhQPSJwaHAiIDsgZWxzZSBNQVlCRV9QSFA9IiIgOyBmaQogQUNfU1VCU1QoW01BWUJFX1BIUF0pCitpZiB0ZXN0ICIkaGF2ZV9kYXJ0IiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9EQVJUPSJkYXJ0IiA7IGVsc2UgTUFZQkVfREFSVD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfREFSVF0pCiBpZiB0ZXN0ICIkaGF2ZV9nbyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfR089ImdvIiA7IGVsc2UgTUFZQkVfR089IiIgOyBmaQogQUNfU1VCU1QoW01BWUJFX0dPXSkKIGlmIHRlc3QgIiRoYXZlX25vZGVqcyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfTk9ERUpTPSJub2RlanMiIDsgZWxzZSBNQVlCRV9OT0RFSlM9IiIgOyBmaQogQUNfU1VCU1QoW01BWUJFX05PREVKU10pCitpZiB0ZXN0ICIkaGF2ZV9ub2RldHMiID0gInllcyIgOyB0aGVuIE1BWUJFX05PREVUUz0ibm9kZXRzIiA7IGVsc2UgTUFZQkVfTk9ERVRTPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9OT0RFVFNdKQoraWYgdGVzdCAiJGhhdmVfZXJsYW5nIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9FUkxBTkc9ImVybCIgOyBlbHNlIE1BWUJFX0VSTEFORz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfRVJMQU5HXSkKK2lmIHRlc3QgIiRoYXZlX2x1YSIgPSAieWVzIiA7IHRoZW4gTUFZQkVfTFVBPSJsdWEiIDsgZWxzZSBNQVlCRV9MVUE9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0xVQV0pCitpZiB0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUlM9InJzIiA7IGVsc2UgTUFZQkVfUlM9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1JTXSkKK2lmIHRlc3QgIiRoYXZlX3N3aWZ0IiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9TV0lGVD0ic3dpZnQiIDsgZWxzZSBNQVlCRV9TV0lGVD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfU1dJRlRdKQoraWYgdGVzdCAiJGhhdmVfZG90bmV0Y29yZSIgPSAieWVzIiA7IHRoZW4gTUFZQkVfRE9UTkVUQ09SRT0ibmV0Y29yZSIgOyBlbHNlIE1BWUJFX0RPVE5FVENPUkU9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0RPVE5FVENPUkVdKQoraWYgdGVzdCAiJGhhdmVfY2wiID0gInllcyIgOyB0aGVuIE1BWUJFX0NMPSJjbCIgOyBlbHNlIE1BWUJFX0NMPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9DTF0pCiAKIEFDX09VVFBVVAogCkBAIC03NzMsODUgKzkyOSw2MSBAQAogZWNobwogZWNobyAiJFBBQ0tBR0UgJFZFUlNJT04iCiBlY2hvCi1lY2hvICJCdWlsZGluZyBDKysgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9jcHAiCitlY2hvICJCdWlsZGluZyBBY3Rpb25TY3JpcHQzIExpYnJhcnkgOiAkaGF2ZV9hczMiCiBlY2hvICJCdWlsZGluZyBDIChHTGliKSBMaWJyYXJ5IC4uLi4gOiAkaGF2ZV9jX2dsaWIiCi1lY2hvICJCdWlsZGluZyBKYXZhIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9qYXZhIgotZWNobyAiQnVpbGRpbmcgQyMgTGlicmFyeSAuLi4uLi4uLi4uIDogJGhhdmVfY3NoYXJwIgotZWNobyAiQnVpbGRpbmcgUHl0aG9uIExpYnJhcnkgLi4uLi4uIDogJGhhdmVfcHl0aG9uIgotZWNobyAiQnVpbGRpbmcgUnVieSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfcnVieSIKLWVjaG8gIkJ1aWxkaW5nIEhheGUgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2hheGUiCi1lY2hvICJCdWlsZGluZyBIYXNrZWxsIExpYnJhcnkgLi4uLi4gOiAkaGF2ZV9oYXNrZWxsIgotZWNobyAiQnVpbGRpbmcgUGVybCBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfcGVybCIKLWVjaG8gIkJ1aWxkaW5nIFBIUCBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX3BocCIKK2VjaG8gIkJ1aWxkaW5nIEMjIChNb25vKSBMaWJyYXJ5IC4uLiA6ICRoYXZlX2NzaGFycCIKK2VjaG8gIkJ1aWxkaW5nIEMrKyBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2NwcCIKK2VjaG8gIkJ1aWxkaW5nIENvbW1vbiBMaXNwIExpYnJhcnkuLiA6ICRoYXZlX2NsIgorZWNobyAiQnVpbGRpbmcgRCBMaWJyYXJ5IC4uLi4uLi4uLi4uIDogJGhhdmVfZCIKK2VjaG8gIkJ1aWxkaW5nIERhcnQgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2RhcnQiCitlY2hvICJCdWlsZGluZyBkb3RuZXRjb3JlIExpYnJhcnkgLi4gOiAkaGF2ZV9kb3RuZXRjb3JlIgorZWNobyAiQnVpbGRpbmcgLk5FVCBTdGFuZGFyZCBMaWJyYXJ5IDogJGhhdmVfZG90bmV0Y29yZSIKIGVjaG8gIkJ1aWxkaW5nIEVybGFuZyBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX2VybGFuZyIKIGVjaG8gIkJ1aWxkaW5nIEdvIExpYnJhcnkgLi4uLi4uLi4uLiA6ICRoYXZlX2dvIgotZWNobyAiQnVpbGRpbmcgRCBMaWJyYXJ5IC4uLi4uLi4uLi4uIDogJGhhdmVfZCIKLWVjaG8gIkJ1aWxkaW5nIE5vZGVKUyBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX25vZGVqcyIKK2VjaG8gIkJ1aWxkaW5nIEhhc2tlbGwgTGlicmFyeSAuLi4uLiA6ICRoYXZlX2hhc2tlbGwiCitlY2hvICJCdWlsZGluZyBIYXhlIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9oYXhlIgorZWNobyAiQnVpbGRpbmcgSmF2YSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfamF2YSIKIGVjaG8gIkJ1aWxkaW5nIEx1YSBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2x1YSIKK2VjaG8gIkJ1aWxkaW5nIE5vZGVKUyBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX25vZGVqcyIKK2VjaG8gIkJ1aWxkaW5nIFBlcmwgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3BlcmwiCitlY2hvICJCdWlsZGluZyBQSFAgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9waHAiCitlY2hvICJCdWlsZGluZyBQeXRob24gTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9weXRob24iCitlY2hvICJCdWlsZGluZyBQeTMgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9weTMiCitlY2hvICJCdWlsZGluZyBSdWJ5IExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9ydWJ5IgorZWNobyAiQnVpbGRpbmcgUnVzdCBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfcnMiCitlY2hvICJCdWlsZGluZyBTd2lmdCBMaWJyYXJ5IC4uLi4uLi4gOiAkaGF2ZV9zd2lmdCIKIAotaWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIDsgdGhlbgoraWYgdGVzdCAiJGhhdmVfYXMzIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCi0gIGVjaG8gIkMrKyBMaWJyYXJ5OiIKLSAgZWNobyAiICAgQnVpbGQgVFpsaWJUcmFuc3BvcnQgLi4uLi4uIDogJGhhdmVfemxpYiIKLSAgZWNobyAiICAgQnVpbGQgVE5vbmJsb2NraW5nU2VydmVyIC4uIDogJGhhdmVfbGliZXZlbnQiCi0gIGVjaG8gIiAgIEJ1aWxkIFRRVGNwU2VydmVyIChRdDQpIC4uLi4gOiAkaGF2ZV9xdCIKLSAgZWNobyAiICAgQnVpbGQgVFFUY3BTZXJ2ZXIgKFF0NSkgLi4uLiA6ICRoYXZlX3F0NSIKKyAgZWNobyAiQWN0aW9uU2NyaXB0IExpYnJhcnk6IgorICBlY2hvICIgICBGTEVYX0hPTUUgLi4uLi4uLi4uLi4uLi4uLi4gOiAkRkxFWF9IT01FIgorICBlY2hvICIgICBVc2luZyBjb21wYyB2ZXJzaW9uIC4uLi4uLi4gOiAkKCRGTEVYX0NPTVBDIC0tdmVyc2lvbikiCiBmaQotaWYgdGVzdCAiJGhhdmVfamF2YSIgPSAieWVzIiA7IHRoZW4KK2lmIHRlc3QgIiRoYXZlX2NfZ2xpYiIgPSAieWVzIiA7IHRoZW4KICAgZWNobwotICBlY2hvICJKYXZhIExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBqYXZhYyAuLi4uLi4uLi4uLi4uLi4gOiAkSkFWQUMiCi0gIGVjaG8gIiAgIFVzaW5nIGphdmEgLi4uLi4uLi4uLi4uLi4uLiA6ICRKQVZBIgotICBlY2hvICIgICBVc2luZyBhbnQgLi4uLi4uLi4uLi4uLi4uLi4gOiAkQU5UIgorICBlY2hvICJDIChnbGliKToiCisgIGVjaG8gIiAgIFVzaW5nIGdsaWIgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJEdTRVRUSU5HUyAtLXZlcnNpb24pIgogZmkKIGlmIHRlc3QgIiRoYXZlX2NzaGFycCIgPSAieWVzIiA7IHRoZW4KICAgZWNobwogICBlY2hvICJDIyBMaWJyYXJ5OiIKICAgZWNobyAiICAgVXNpbmcgLk5FVCAzLjUgLi4uLi4uLi4uLi4uIDogJG5ldF8zXzUiCisgIGVjaG8gIiAgIFVzaW5nIG1vbm8gdmVyc2lvbiAuLi4uLi4uLiA6ICQoJE1DUyAtLXZlcnNpb24gfCBoZWFkIC0xKSIKIGZpCi1pZiB0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyIgOyB0aGVuCitpZiB0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KLSAgZWNobyAiUHl0aG9uIExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBQeXRob24gLi4uLi4uLi4uLi4uLi4gOiAkUFlUSE9OIgotICBlY2hvICIgICBVc2luZyBUcmlhbCAuLi4uLi4uLi4uLi4uLi4gOiAkVFJJQUwiCisgIGVjaG8gIkMrKyBMaWJyYXJ5OiIKKyAgZWNobyAiICAgQysrIGNvbXBpbGVyIC4uLi4uLi4uLi4uLi4uIDogJENYWCIKKyAgZWNobyAiICAgQnVpbGQgVFpsaWJUcmFuc3BvcnQgLi4uLi4uIDogJGhhdmVfemxpYiIKKyAgZWNobyAiICAgQnVpbGQgVE5vbmJsb2NraW5nU2VydmVyIC4uIDogJGhhdmVfbGliZXZlbnQiCisgIGVjaG8gIiAgIEJ1aWxkIFRRVGNwU2VydmVyIChRdDUpIC4uLiA6ICRoYXZlX3F0NSIKKyAgZWNobyAiICAgQysrIGNvbXBpbGVyIHZlcnNpb24gLi4uLi4uIDogJCgkQ1hYIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgogZmkKLWlmIHRlc3QgIiRoYXZlX3BocCIgPSAieWVzIiA7IHRoZW4KK2lmIHRlc3QgIiRoYXZlX2NsIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCi0gIGVjaG8gIlBIUCBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgcGhwLWNvbmZpZyAuLi4uLi4uLi4uIDogJFBIUF9DT05GSUciCi1maQotaWYgdGVzdCAiJGhhdmVfcnVieSIgPSAieWVzIiA7IHRoZW4KLSAgZWNobwotICBlY2hvICJSdWJ5IExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBSdWJ5IC4uLi4uLi4uLi4uLi4uLi4gOiAkUlVCWSIKLWZpCi1pZiB0ZXN0ICIkaGF2ZV9oYXNrZWxsIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIkhhc2tlbGwgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIEhhc2tlbGwgLi4uLi4uLi4uLi4uLiA6ICRSVU5IQVNLRUxMIgotICBlY2hvICIgICBVc2luZyBDYWJhbCAuLi4uLi4uLi4uLi4uLi4gOiAkQ0FCQUwiCi1maQotaWYgdGVzdCAiJGhhdmVfaGF4ZSIgPSAieWVzIiA7IHRoZW4KLSAgZWNobwotICBlY2hvICJIYXhlIExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBIYXhlIC4uLi4uLi4uLi4uLi4uLi4gOiAkSEFYRSIKLSAgZWNobyAiICAgVXNpbmcgSGF4ZSB2ZXJzaW9uIC4uLi4uLi4uIDogJEhBWEVfVkVSU0lPTiIKLWZpCi1pZiB0ZXN0ICIkaGF2ZV9wZXJsIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIlBlcmwgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIFBlcmwgLi4uLi4uLi4uLi4uLi4uLiA6ICRQRVJMIgotZmkKLWlmIHRlc3QgIiRoYXZlX2VybGFuZyIgPSAieWVzIiA7IHRoZW4KLSAgZWNobwotICBlY2hvICJFcmxhbmcgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIGVybGMgLi4uLi4uLi4uLi4uLi4uLiA6ICRFUkxDIgotZmkKLWlmIHRlc3QgIiRoYXZlX2dvIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIkdvIExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBHby4uLi4uLi4uLi4uLi4uLi4uLi4gOiAkR08iCi0gIGVjaG8gIiAgIFVzaW5nIEdvIHZlcnNpb24uLi4uLi4uLi4uLiA6ICQoJEdPIHZlcnNpb24pIgorICBlY2hvICJDb21tb24gTGlzcCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgQ29tbW9uIExpc3AgLi4uLi4uLi4uIDogJFNCQ0wiCisgIGVjaG8gIiAgIFVzaW5nIENvbW1vbiBMaXNwIHZlcnNpb24gLiA6ICQoJFNCQ0wgLS12ZXJzaW9uKSIKIGZpCiBpZiB0ZXN0ICIkaGF2ZV9kIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCkBAIC04NTksNiArOTkxLDY3IEBACiAgIGVjaG8gIiAgIFVzaW5nIEQgQ29tcGlsZXIgLi4uLi4uLi4uLiA6ICRETUQiCiAgIGVjaG8gIiAgIEJ1aWxkaW5nIEQgbGliZXZlbnQgdGVzdHMgLiA6ICR3aXRoX2RfZXZlbnRfdGVzdHMiCiAgIGVjaG8gIiAgIEJ1aWxkaW5nIEQgU1NMIHRlc3RzIC4uLi4uLiA6ICR3aXRoX2Rfc3NsX3Rlc3RzIgorICBlY2hvICIgICBVc2luZyBEIHZlcnNpb24gLi4uLi4uLi4uLi4gOiAkKCRETUQgLS12ZXJzaW9uIHwgaGVhZCAtMSkiCitmaQoraWYgdGVzdCAiJGhhdmVfZGFydCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJEYXJ0IExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBEYXJ0IC4uLi4uLi4uLi4uLi4uLi4gOiAkREFSVCIKKyAgZWNobyAiICAgVXNpbmcgUHViIC4uLi4uLi4uLi4uLi4uLi4uIDogJERBUlRQVUIiCisgIGVjaG8gIiAgIFVzaW5nIERhcnQgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJERBUlQgLS12ZXJzaW9uIDI+JjEpIgorZmkKK2lmIHRlc3QgIiRoYXZlX2RvdG5ldGNvcmUiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiLk5FVCBDb3JlIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyAuTkVUIENvcmUgLi4uLi4uLi4uLi4gOiAkRE9UTkVUQ09SRSIKKyAgZWNobyAiICAgVXNpbmcgLk5FVCBDb3JlIHZlcnNpb24gLi4uIDogJERPVE5FVENPUkVfVkVSU0lPTiIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9kb3RuZXRjb3JlIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIi5ORVQgU3RhbmRhcmQgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIGRvdG5ldCAuLi4uLi4uLi4uLi4uLiA6ICRET1RORVRDT1JFIgorICBlY2hvICIgICBVc2luZyBkb3RuZXQgdmVyc2lvbiAuLi4uLi4gOiAkRE9UTkVUQ09SRV9WRVJTSU9OIgorZmkKK2lmIHRlc3QgIiRoYXZlX2VybGFuZyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJFcmxhbmcgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIGVybGMgLi4uLi4uLi4uLi4uLi4uLiA6ICRFUkxDIgorICBlY2hvICIgICBVc2luZyByZWJhciAuLi4uLi4uLi4uLi4uLi4gOiAkUkVCQVIiCisgIGVjaG8gIiAgIFVzaW5nIGVybGMgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJEVSTCAtZXZhbCAnZXJsYW5nOmRpc3BsYXkoZXJsYW5nOnN5c3RlbV9pbmZvKG90cF9yZWxlYXNlKSksIGhhbHQoKS4nIC1ub3NoZWxsIHwgdHIgLWQgJ1wiJykiCitmaQoraWYgdGVzdCAiJGhhdmVfZ28iID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiR28gTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIEdvLi4uLi4uLi4uLi4uLi4uLi4uLiA6ICRHTyIKKyAgZWNobyAiICAgVXNpbmcgR28gdmVyc2lvbi4uLi4uLi4uLi4uIDogJCgkR08gdmVyc2lvbikiCitmaQoraWYgdGVzdCAiJGhhdmVfaGFza2VsbCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJIYXNrZWxsIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBDYWJhbCAuLi4uLi4uLi4uLi4uLi4gOiAkQ0FCQUwiCisgIGVjaG8gIiAgIFVzaW5nIEhhc2tlbGwgLi4uLi4uLi4uLi4uLiA6ICRSVU5IQVNLRUxMIgorICBlY2hvICIgICBVc2luZyBIYXNrZWxsIHZlcnNpb24gLi4uLi4gOiAkKCRSVU5IQVNLRUxMIC0tdmVyc2lvbikiCitmaQoraWYgdGVzdCAiJGhhdmVfaGF4ZSIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJIYXhlIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBIYXhlIC4uLi4uLi4uLi4uLi4uLi4gOiAkSEFYRSIKKyAgZWNobyAiICAgVXNpbmcgSGF4ZSB2ZXJzaW9uIC4uLi4uLi4uIDogJEhBWEVfVkVSU0lPTiIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9qYXZhIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkphdmEgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIGdyYWRsZXcgLi4uLi4uLi4uLi4uLiA6IGxpYi9qYXZhL2dyYWRsZXciCisgIGVjaG8gIiAgIFVzaW5nIGphdmEgLi4uLi4uLi4uLi4uLi4uLiA6ICRKQVZBIgorICBlY2hvICIgICBVc2luZyBqYXZhYyAuLi4uLi4uLi4uLi4uLi4gOiAkSkFWQUMiCisgIGVjaG8gIiAgIFVzaW5nIEdyYWRsZSB2ZXJzaW9uIC4uLi4uLiA6ICQobGliL2phdmEvZ3JhZGxldyAtLXZlcnNpb24gLS1xdWlldCB8IGdyZXAgR3JhZGxlIDI+JjEpIgorICBlY2hvICIgICBVc2luZyBqYXZhIHZlcnNpb24gLi4uLi4uLi4gOiAkKCRKQVZBIC12ZXJzaW9uIDI+JjEgfCBncmVwICd2ZXJzaW9uICcpIgorZmkKK2lmIHRlc3QgIiRoYXZlX2x1YSIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJMdWEgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIEx1YSAuLi4uLi4uLi4uLi4uLi4uLiA6ICRMVUEiCisgIGVjaG8gIiAgIFVzaW5nIEx1YSB2ZXJzaW9uLi4uLi4uLi4uLiA6ICQoJExVQSAtdikiCiBmaQogaWYgdGVzdCAiJGhhdmVfbm9kZWpzIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCkBAIC04NjYsMTIgKzEwNTksNTIgQEAKICAgZWNobyAiICAgVXNpbmcgTm9kZUpTIC4uLi4uLi4uLi4uLi4uIDogJE5PREVKUyIKICAgZWNobyAiICAgVXNpbmcgTm9kZUpTIHZlcnNpb24uLi4uLi4uIDogJCgkTk9ERUpTIC0tdmVyc2lvbikiCiBmaQotaWYgdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiIDsgdGhlbgoraWYgdGVzdCAiJGhhdmVfcGVybCIgPSAieWVzIiA7IHRoZW4KICAgZWNobwotICBlY2hvICJMdWEgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIEx1YSAuLi4uLi4uLi4uLi4uLiA6ICRMVUEiCisgIGVjaG8gIlBlcmwgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFBlcmwgLi4uLi4uLi4uLi4uLi4uLiA6ICRQRVJMIgorICBlY2hvICIgICBVc2luZyBQZXJsIHZlcnNpb24gLi4uLi4uLi4gOiAkKCRQRVJMIC12IHwgZ3JlcCAndmVyc2lvbiAnKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9waHAiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUEhQIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBwaHAtY29uZmlnIC4uLi4uLi4uLi4gOiAkUEhQX0NPTkZJRyIKKyAgZWNobyAiICAgVXNpbmcgcGhwIHZlcnNpb24gLi4uLi4uLi4uIDogJCgkUEhQIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgorZmkKK2lmIHRlc3QgIiRoYXZlX3B5dGhvbiIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJQeXRob24gTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbiAuLi4uLi4uLi4uLi4uLiA6ICRQWVRIT04iCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbiB2ZXJzaW9uIC4uLi4uLiA6ICQoJFBZVEhPTiAtLXZlcnNpb24gMj4mMSkiCisgIGlmIHRlc3QgIiRoYXZlX3B5MyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobyAiICAgVXNpbmcgUHl0aG9uMyAuLi4uLi4uLi4uLi4uIDogJFBZVEhPTjMiCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbjMgdmVyc2lvbiAuLi4uLiA6ICQoJFBZVEhPTjMgLS12ZXJzaW9uKSIKKyAgZmkKKyAgaWYgdGVzdCAiJGhhdmVfdHJpYWwiID0gInllcyI7IHRoZW4KKyAgZWNobyAiICAgVXNpbmcgdHJpYWwgLi4uLi4uLi4uLi4uLi4uIDogJFRSSUFMIgorICBmaQorZmkKK2lmIHRlc3QgIiRoYXZlX3J1YnkiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUnVieSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgUnVieSAuLi4uLi4uLi4uLi4uLi4uIDogJFJVQlkiCisgIGVjaG8gIiAgIFVzaW5nIFJ1YnkgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJFJVQlkgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJSdXN0IExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBDYXJnby4uLi4uLi4uLi4uLi4uLi4gOiAkQ0FSR08iCisgIGVjaG8gIiAgIFVzaW5nIHJ1c3RjLi4uLi4uLi4uLi4uLi4uLiA6ICRSVVNUQyIKKyAgZWNobyAiICAgVXNpbmcgUnVzdCB2ZXJzaW9uLi4uLi4uLi4uIDogJCgkUlVTVEMgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9zd2lmdCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJTd2lmdCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgU3dpZnQgLi4uLi4uLi4uLi4uLi4uIDogJFNXSUZUIgorICBlY2hvICIgICBVc2luZyBTd2lmdCB2ZXJzaW9uIC4uLi4uLi4gOiAkKCRTV0lGVCAtLXZlcnNpb24gfCBoZWFkIC0xKSIKIGZpCiBlY2hvCiBlY2hvICJJZiBzb21ldGhpbmcgaXMgbWlzc2luZyB0aGF0IHlvdSB0aGluayBzaG91bGQgYmUgcHJlc2VudCwiCiBlY2hvICJwbGVhc2Ugc2tpbSB0aGUgb3V0cHV0IG9mIGNvbmZpZ3VyZSB0byBmaW5kIHRoZSBtaXNzaW5nIgogZWNobyAiY29tcG9uZW50LiAgRGV0YWlscyBhcmUgcHJlc2VudCBpbiBjb25maWcubG9nLiIKK2VjaG8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9jb250cmliL1JlYnVzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IDVkZTZhMTQuLmU0NzZlYWIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvUmVidXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvY29udHJpYi9SZWJ1cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMjYsNyArMjYsNyBAQAogW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlJlYnVzU2FtcGxlIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMTUiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAgMjAxNCIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCiAKQEAgLTM0LDUgKzM0LDUgQEAKIAogW2Fzc2VtYmx5OiBHdWlkKCIwYWYxMDk4NC00MGQzLTQ1M2QtYjFlNS00MjE1MjllOGM3ZTIiKV0KIAotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuOS4zLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC45LjMuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvY29udHJpYi9WYWdyYW50ZmlsZSBiL2NvbnRyaWIvVmFncmFudGZpbGUKaW5kZXggZDlhOTA4ZC4uYjM0MDU2MyAxMDA2NDQKLS0tIGEvY29udHJpYi9WYWdyYW50ZmlsZQorKysgYi9jb250cmliL1ZhZ3JhbnRmaWxlCkBAIC0zNywxNiArMzcsMTYgQEAKICMgSW5zdGFsbCBEZXBlbmRlbmNpZXMKICMgLS0tCiAjIEdlbmVyYWwgZGVwZW5kZW5jaWVzCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgYXV0b21ha2UgbGlidG9vbCBmbGV4IGJpc29uIHBrZy1jb25maWcgZysrIGxpYnNzbC1kZXYgbWFrZSBsaWJxdDQtZGV2IGdpdCBkZWJoZWxwZXIKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBhdXRvbWFrZSBsaWJ0b29sIGZsZXggYmlzb24gcGtnLWNvbmZpZyBnKysgbGlic3NsLWRldiBtYWtlIGdpdCBkZWJoZWxwZXIKIAogIyBDKysgZGVwZW5kZW5jaWVzCiBzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgbGliYm9vc3QtZGV2IGxpYmJvb3N0LXRlc3QtZGV2IGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgbGliYm9vc3Qtc3lzdGVtLWRldiBsaWJldmVudC1kZXYgCiAKICMgSmF2YSBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBhbnQgb3Blbmpkay03LWpkayBtYXZlbgorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGFudCBvcGVuamRrLTgtamRrIG1hdmVuCiAKICMgUHl0aG9uIGRlcGVuZGVuY2llcwotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHB5dGhvbi1hbGwgcHl0aG9uLWFsbC1kZXYgcHl0aG9uLWFsbC1kYmcgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXN1cHBvcnQKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnIHB5dGhvbi1zZXR1cHRvb2xzIHB5dGhvbi1zdXBwb3J0IHB5dGhvbi1zaXggcHl0aG9uMy1zaXgKIAogIyBSdWJ5IGRlcGVuZGVuY2llcwogc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHJ1YnkgcnVieS1kZXYKQEAgLTYyLDcgKzYyLDcgQEAKIHN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJnbGliMi4wLWRldgogCiAjIEVybGFuZyBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBlcmxhbmctYmFzZSBlcmxhbmctZXVuaXQgZXJsYW5nLWRldgorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGVybGFuZy1iYXNlIGVybGFuZy1ldW5pdCBlcmxhbmctZGV2IGVybGFuZy10b29scwogCiAjIEdPIGRlcGVuZGVuY2llcwogZWNobyAiZ29sYW5nLWdvIGdvbGFuZy1nby9kYXNoYm9hcmQgYm9vbGVhbiBmYWxzZSIgfCBkZWJjb25mLXNldC1zZWxlY3Rpb25zCkBAIC04OSw4ICs4OSw4IEBACiAKICMgQ3VzdG9taXplIHRoZSBzeXN0ZW0KICMgLS0tCi0jIERlZmF1bHQgamF2YSB0byBsYXRlc3QgMS43IHZlcnNpb24KLXVwZGF0ZS1qYXZhLWFsdGVybmF0aXZlcyAtcyBqYXZhLTEuNy4wLW9wZW5qZGstYW1kNjQgCisjIERlZmF1bHQgamF2YSB0byBsYXRlc3QgMS44IHZlcnNpb24KK3VwZGF0ZS1qYXZhLWFsdGVybmF0aXZlcyAtcyBqYXZhLTEuOC4wLW9wZW5qZGstYW1kNjQgCiAKICMgUEhQVW5pdCBwYWNrYWdlIGJyb2tlbiBpbiB1YnVudHUuIHNlZSBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9waHB1bml0LytidWcvNzAxNTQ0CiBzdWRvIGFwdC1nZXQgdXBncmFkZSBwZWFyCmRpZmYgLS1naXQgYS9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1sZWFmLnB5IGIvY29udHJpYi9hc3luYy10ZXN0L3Rlc3QtbGVhZi5weQppbmRleCA4YjdjM2UzLi40ZWE0YTliIDEwMDc1NQotLS0gYS9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1sZWFmLnB5CisrKyBiL2NvbnRyaWIvYXN5bmMtdGVzdC90ZXN0LWxlYWYucHkKQEAgLTcsMTYgKzcsMTcgQEAKIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVEh0dHBTZXJ2ZXIKIGZyb20gYWdnciBpbXBvcnQgQWdncgogCisKIGNsYXNzIEFnZ3JIYW5kbGVyKEFnZ3IuSWZhY2UpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi52YWx1ZXMgPSBbXQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbXQogCi0gIGRlZiBhZGRWYWx1ZShzZWxmLCB2YWx1ZSk6Ci0gICAgc2VsZi52YWx1ZXMuYXBwZW5kKHZhbHVlKQorICAgIGRlZiBhZGRWYWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYudmFsdWVzLmFwcGVuZCh2YWx1ZSkKIAotICBkZWYgZ2V0VmFsdWVzKHNlbGYsICk6Ci0gICAgdGltZS5zbGVlcCgxKQotICAgIHJldHVybiBzZWxmLnZhbHVlcworICAgIGRlZiBnZXRWYWx1ZXMoc2VsZiwgKToKKyAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZXMKIAogcHJvY2Vzc29yID0gQWdnci5Qcm9jZXNzb3IoQWdnckhhbmRsZXIoKSkKIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmggYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaAppbmRleCAyMTU5Yzk1Li5kYWE1MjQ2IDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaAorKysgYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaApAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSAiRmFjZWJvb2tTZXJ2aWNlLmgiCiAKKyNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KIApkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQgYi9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdAppbmRleCA2NmM4MzE1Li44OWJkNmViIDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdAorKysgYi9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdApAQCAtMjQsNiArMjQsNyBAQAogbmFtZXNwYWNlIGphdmEgY29tLmZhY2Vib29rLmZiMzAzCiBuYW1lc3BhY2UgY3BwIGZhY2Vib29rLmZiMzAzCiBuYW1lc3BhY2UgcGVybCBGYWNlYm9vay5GQjMwMworbmFtZXNwYWNlIG5ldGNvcmUgRmFjZWJvb2suRkIzMDMuVGVzdAogCiAvKioKICAqIENvbW1vbiBzdGF0dXMgcmVwb3J0aW5nIG1lY2hhbmlzbSBhY3Jvc3MgYWxsIHNlcnZpY2VzCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQucHJvcGVydGllcyBiL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjM2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKKyMgTWF2ZW4gQW50IHRhc2tzIEphciBkZXRhaWxzCittdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbCBiL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC54bWwKaW5kZXggOGYyZmE1MS4uN2ExYjhmMSAxMDA3NTUKLS0tIGEvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbAorKysgYi9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQueG1sCkBAIC03LDkgKzcsOSBAQAogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCisKICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAKKwogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQpAQCAtMjYsMjAgKzI2LDIwIEBACiAgIDxwcm9wZXJ0eSBuYW1lPSJpbnRlcmZhY2UuZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi9pZiIvPgogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQucm9vdH0vbGliL2phdmEiLz4KICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9jb21waWxlciIgdmFsdWU9IiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQiLz4gCisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnRfY29tcGlsZXIiIHZhbHVlPSIke3RocmlmdC5yb290fS9jb21waWxlci9jcHAvdGhyaWZ0Ii8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiLz4KIAogICA8IS0tIGluaGVyaXQgZnJvbSB0aGUgamF2YSBidWlsZCBmaWxlIGZvciB2ZXJzaW9uIGFuZCBvdGhlciBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkLnByb3BlcnRpZXMiIC8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vZ3JhZGxlLnByb3BlcnRpZXMiIC8+CiAKICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KIAogICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0iPgogICAgIDxpc3NldCBwcm9wZXJ0eT0icmVsZWFzZSIvPgogICA8L2NvbmRpdGlvbj4KLSAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufS1zbmFwc2hvdCIvPgorICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259LVNOQVBTSE9UIi8+CiAKICAgPHByb3BlcnR5IG5hbWU9ImZiMzAzLmZpbmFsLm5hbWUiIHZhbHVlPSIke2ZiMzAzLmFydGlmYWN0aWR9LSR7dmVyc2lvbn0iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmxpYnRocmlmdCIgdmFsdWU9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJ0aHJpZnQtJHt2ZXJzaW9ufS5qYXIiLz4KIAogICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iJHtiYXNlZGlyfS9zcmMiLz4KICAgPHByb3BlcnR5IG5hbWU9ImdlbiIgdmFsdWU9IiR7YmFzZWRpcn0vZ2VuLWphdmEiLz4KQEAgLTc0LDggKzc0LDEyIEBACiAgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRpbmcgJHtmYjMwMy5maW5hbC5uYW1lfS5qYXIiLz4KICAgICA8amF2YWMgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iIGRlYnVnPSJvbiI+CiAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEubGlidGhyaWZ0fSIvPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LnJvb3R9L2xpYi9qYXZhL2J1aWxkL2xpYiI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvZGVwcyI+CiAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KICAgICAgICAgPC9maWxlc2V0PgogICAgICAgPC9jbGFzc3BhdGg+CkBAIC0xMjAsMjEgKzEyNCwyMSBAQAogICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJhcGFjaGUiIHVybD0iJHthcGFjaGUucmVwb30iLz4KIAogICAgIDwhLS0gUG9tIGZpbGUgaW5mb3JtYXRpb24gLS0+Ci0gICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIiAKLSAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IiAKKyAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iCisgICAgICBncm91cElkPSIke3RocmlmdC5ncm91cGlkfSIKICAgICAgIGFydGlmYWN0SWQ9IiR7ZmIzMDMuYXJ0aWZhY3RpZH0iCi0gICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IiAKKyAgICAgIHZlcnNpb249IiR7dmVyc2lvbn0iCiAgICAgICB1cmw9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKICAgICAgIG5hbWU9IkFwYWNoZSBUaHJpZnQiCiAgICAgICBkZXNjcmlwdGlvbj0iVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4iCi0gICAgICBwYWNrYWdpbmc9InBvbSIKKyAgICAgIHBhY2thZ2luZz0iamFyIgogICAgID4KICAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJjZW50cmFsIi8+CiAgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iYXBhY2hlIi8+CiAgICAgICA8bGljZW5zZSBuYW1lPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wIiB1cmw9IiR7bGljZW5zZX0iLz4KLSAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdCIgCi0gICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IgotICAgICAgdXJsPSJodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD10aHJpZnQuZ2l0IgorICAgICAgPHNjbSBjb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKKyAgICAgIGRldmVsb3BlckNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IgorICAgICAgdXJsPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCIKICAgICAvPgogICAgICAgPCEtLSBUaHJpZnQgRGV2ZWxvcGVycyAtLT4KICAgICAgIDxkZXZlbG9wZXIgaWQ9Im1jc2xlZSIgbmFtZT0iTWFyayBTbGVlIi8+CmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL0ZhY2Vib29rQmFzZS5weSBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tCYXNlLnB5CmluZGV4IDY4NWZmMjAuLjA3ZGIxMGMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tCYXNlLnB5CisrKyBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tCYXNlLnB5CkBAIC0yNCw1OSArMjQsNjAgQEAKIGltcG9ydCB0aHJpZnQucmVmbGVjdGlvbi5saW1pdGVkCiBmcm9tIHR0eXBlcyBpbXBvcnQgZmJfc3RhdHVzCiAKKwogY2xhc3MgRmFjZWJvb2tCYXNlKEZhY2Vib29rU2VydmljZS5JZmFjZSk6CiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgotICAgIHNlbGYubmFtZSA9IG5hbWUKLSAgICBzZWxmLmFsaXZlID0gaW50KHRpbWUudGltZSgpKQotICAgIHNlbGYuY291bnRlcnMgPSB7fQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmFsaXZlID0gaW50KHRpbWUudGltZSgpKQorICAgICAgICBzZWxmLmNvdW50ZXJzID0ge30KIAotICBkZWYgZ2V0TmFtZShzZWxmLCApOgotICAgIHJldHVybiBzZWxmLm5hbWUKKyAgICBkZWYgZ2V0TmFtZShzZWxmLCApOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lCiAKLSAgZGVmIGdldFZlcnNpb24oc2VsZiwgKToKLSAgICByZXR1cm4gJycKKyAgICBkZWYgZ2V0VmVyc2lvbihzZWxmLCApOgorICAgICAgICByZXR1cm4gJycKIAotICBkZWYgZ2V0U3RhdHVzKHNlbGYsICk6Ci0gICAgcmV0dXJuIGZiX3N0YXR1cy5BTElWRQorICAgIGRlZiBnZXRTdGF0dXMoc2VsZiwgKToKKyAgICAgICAgcmV0dXJuIGZiX3N0YXR1cy5BTElWRQogCi0gIGRlZiBnZXRDb3VudGVycyhzZWxmKToKLSAgICByZXR1cm4gc2VsZi5jb3VudGVycworICAgIGRlZiBnZXRDb3VudGVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY291bnRlcnMKIAotICBkZWYgcmVzZXRDb3VudGVyKHNlbGYsIGtleSk6Ci0gICAgc2VsZi5jb3VudGVyc1trZXldID0gMAorICAgIGRlZiByZXNldENvdW50ZXIoc2VsZiwga2V5KToKKyAgICAgICAgc2VsZi5jb3VudGVyc1trZXldID0gMAogCi0gIGRlZiBnZXRDb3VudGVyKHNlbGYsIGtleSk6Ci0gICAgaWYgc2VsZi5jb3VudGVycy5oYXNfa2V5KGtleSk6Ci0gICAgICByZXR1cm4gc2VsZi5jb3VudGVyc1trZXldCi0gICAgcmV0dXJuIDAKKyAgICBkZWYgZ2V0Q291bnRlcihzZWxmLCBrZXkpOgorICAgICAgICBpZiBzZWxmLmNvdW50ZXJzLmhhc19rZXkoa2V5KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvdW50ZXJzW2tleV0KKyAgICAgICAgcmV0dXJuIDAKIAotICBkZWYgaW5jcmVtZW50Q291bnRlcihzZWxmLCBrZXkpOgotICAgIHNlbGYuY291bnRlcnNba2V5XSA9IHNlbGYuZ2V0Q291bnRlcihrZXkpICsgMQorICAgIGRlZiBpbmNyZW1lbnRDb3VudGVyKHNlbGYsIGtleSk6CisgICAgICAgIHNlbGYuY291bnRlcnNba2V5XSA9IHNlbGYuZ2V0Q291bnRlcihrZXkpICsgMQogCi0gIGRlZiBzZXRPcHRpb24oc2VsZiwga2V5LCB2YWx1ZSk6Ci0gICAgcGFzcworICAgIGRlZiBzZXRPcHRpb24oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgZ2V0T3B0aW9uKHNlbGYsIGtleSk6Ci0gICAgcmV0dXJuICIiCisgICAgZGVmIGdldE9wdGlvbihzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4gIiIKIAotICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKLSAgICByZXR1cm4ge30KKyAgICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHt9CiAKLSAgZGVmIGdldE9wdGlvbnMoc2VsZik6Ci0gICAgcmV0dXJuIHt9CisgICAgZGVmIGdldE9wdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiB7fQogCi0gIGRlZiBhbGl2ZVNpbmNlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLmFsaXZlCisgICAgZGVmIGFsaXZlU2luY2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmFsaXZlCiAKLSAgZGVmIGdldENwdVByb2ZpbGUoc2VsZiwgZHVyYXRpb24pOgotICAgIHJldHVybiAiIgorICAgIGRlZiBnZXRDcHVQcm9maWxlKHNlbGYsIGR1cmF0aW9uKToKKyAgICAgICAgcmV0dXJuICIiCiAKLSAgZGVmIGdldExpbWl0ZWRSZWZsZWN0aW9uKHNlbGYpOgotICAgIHJldHVybiB0aHJpZnQucmVmbGVjdGlvbi5saW1pdGVkLlNlcnZpY2UoKQorICAgIGRlZiBnZXRMaW1pdGVkUmVmbGVjdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHRocmlmdC5yZWZsZWN0aW9uLmxpbWl0ZWQuU2VydmljZSgpCiAKLSAgZGVmIHJlaW5pdGlhbGl6ZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlaW5pdGlhbGl6ZShzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBzaHV0ZG93bihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHNodXRkb3duKHNlbGYpOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL3B5L2ZiMzAzX3NjcmlwdHMvZmIzMDNfc2ltcGxlX21nbXQucHkgYi9jb250cmliL2ZiMzAzL3B5L2ZiMzAzX3NjcmlwdHMvZmIzMDNfc2ltcGxlX21nbXQucHkKaW5kZXggNGY4Y2U5OS4uNWM4ZjQwOSAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9weS9mYjMwM19zY3JpcHRzL2ZiMzAzX3NpbXBsZV9tZ210LnB5CisrKyBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDNfc2NyaXB0cy9mYjMwM19zaW1wbGVfbWdtdC5weQpAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uIAogCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTE5LDcgKzE5LDkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIG9zCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgogCiBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0ICoKQEAgLTMxLDExICszMywxMiBAQAogZnJvbSBmYjMwMyBpbXBvcnQgKgogZnJvbSBmYjMwMy50dHlwZXMgaW1wb3J0ICoKIAorCiBkZWYgc2VydmljZV9jdHJsKAotICAgICAgICAgICAgICAgICBjb21tYW5kLAotICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgICAgICB0cmFuc19mYWN0b3J5ID0gTm9uZSwKLSAgICAgICAgICAgICAgICAgcHJvdF9mYWN0b3J5ID0gTm9uZSk6CisgICAgICAgIGNvbW1hbmQsCisgICAgICAgIHBvcnQsCisgICAgICAgIHRyYW5zX2ZhY3Rvcnk9Tm9uZSwKKyAgICAgICAgcHJvdF9mYWN0b3J5PU5vbmUpOgogICAgICIiIgogICAgIHNlcnZpY2VfY3RybCBpcyBhIGdlbmVyaWMgZnVuY3Rpb24gdG8gZXhlY3V0ZSBzdGFuZGFyZCBmYjMwMyBmdW5jdGlvbnMKIApAQCAtNTUsNjYgKzU4LDU5IEBACiAgICAgICAgICAgICBtc2cgPSBmYl9zdGF0dXNfc3RyaW5nKHN0YXR1cykKICAgICAgICAgICAgIGlmIChsZW4oc3RhdHVzX2RldGFpbHMpKToKICAgICAgICAgICAgICAgICBtc2cgKz0gIiAtICVzIiAlIHN0YXR1c19kZXRhaWxzCi0gICAgICAgICAgICBwcmludCBtc2cKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBmYl9zdGF0dXMuQUxJVkUpOgotICAgICAgICAgICAgICAgIHJldHVybiAyCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJldHVybiAzCisgICAgICAgICAgICBwcmludChtc2cpCisgICAgICAgICAgICByZXR1cm4gMiBpZiBzdGF0dXMgPT0gZmJfc3RhdHVzLkFMSVZFIGVsc2UgMwogICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwcmludCAiRmFpbGVkIHRvIGdldCBzdGF0dXMiCisgICAgICAgICAgICBwcmludCgiRmFpbGVkIHRvIGdldCBzdGF0dXMiKQogICAgICAgICAgICAgcmV0dXJuIDMKIAogICAgICMgc2NhbGFyIGNvbW1hbmRzCi0gICAgaWYgY29tbWFuZCBpbiBbInZlcnNpb24iLCJhbGl2ZSIsIm5hbWUiXToKKyAgICBpZiBjb21tYW5kIGluIFsidmVyc2lvbiIsICJhbGl2ZSIsICJuYW1lIl06CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHJlc3VsdCA9IGZiMzAzX3dyYXBwZXIoY29tbWFuZCwgIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKLSAgICAgICAgICAgIHByaW50IHJlc3VsdAorICAgICAgICAgICAgcmVzdWx0ID0gZmIzMDNfd3JhcHBlcihjb21tYW5kLCBwb3J0LCB0cmFuc19mYWN0b3J5LCBwcm90X2ZhY3RvcnkpCisgICAgICAgICAgICBwcmludChyZXN1bHQpCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwcmludCAiZmFpbGVkIHRvIGdldCAiLGNvbW1hbmQKKyAgICAgICAgICAgIHByaW50KCJmYWlsZWQgdG8gZ2V0ICIsIGNvbW1hbmQpCiAgICAgICAgICAgICByZXR1cm4gMwogCiAgICAgIyBjb3VudGVycwogICAgIGlmIGNvbW1hbmQgaW4gWyJjb3VudGVycyJdOgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjb3VudGVycyA9IGZiMzAzX3dyYXBwZXIoJ2NvdW50ZXJzJywgIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKKyAgICAgICAgICAgIGNvdW50ZXJzID0gZmIzMDNfd3JhcHBlcignY291bnRlcnMnLCBwb3J0LCB0cmFuc19mYWN0b3J5LCBwcm90X2ZhY3RvcnkpCiAgICAgICAgICAgICBmb3IgY291bnRlciBpbiBjb3VudGVyczoKLSAgICAgICAgICAgICAgICBwcmludCAiJXM6ICVkIiAlIChjb3VudGVyLCBjb3VudGVyc1tjb3VudGVyXSkKKyAgICAgICAgICAgICAgICBwcmludCgiJXM6ICVkIiAlIChjb3VudGVyLmVuY29kZSgndXRmLTgnKSwgY291bnRlcnNbY291bnRlcl0pKQogICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcHJpbnQgImZhaWxlZCB0byBnZXQgY291bnRlcnMiCisgICAgICAgICAgICBwcmludCgiZmFpbGVkIHRvIGdldCBjb3VudGVycyIpCiAgICAgICAgICAgICByZXR1cm4gMwogCi0KICAgICAjIE9ubHkgcm9vdCBzaG91bGQgYmUgYWJsZSB0byBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kcwogICAgIGlmIG9zLmdldHVpZCgpID09IDA6CiAgICAgICAgICMgYXN5bmMgY29tbWFuZHMKLSAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCJyZWxvYWQiXSA6CisgICAgICAgIGlmIGNvbW1hbmQgaW4gWyJzdG9wIiwgInJlbG9hZCJdOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGZiMzAzX3dyYXBwZXIoY29tbWFuZCwgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQogICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgcHJpbnQgImZhaWxlZCB0byB0ZWxsIHRoZSBzZXJ2aWNlIHRvICIsIGNvbW1hbmQKKyAgICAgICAgICAgICAgICBwcmludCgiZmFpbGVkIHRvIHRlbGwgdGhlIHNlcnZpY2UgdG8gIiwgY29tbWFuZCkKICAgICAgICAgICAgICAgICByZXR1cm4gMwogICAgIGVsc2U6Ci0gICAgICAgIGlmIGNvbW1hbmQgaW4gWyJzdG9wIiwicmVsb2FkIl06Ci0gICAgICAgICAgICBwcmludCAicm9vdCBwcml2aWxlZ2VzIGFyZSByZXF1aXJlZCB0byBzdG9wIG9yIHJlbG9hZCB0aGUgc2VydmljZS4iCisgICAgICAgIGlmIGNvbW1hbmQgaW4gWyJzdG9wIiwgInJlbG9hZCJdOgorICAgICAgICAgICAgcHJpbnQoInJvb3QgcHJpdmlsZWdlcyBhcmUgcmVxdWlyZWQgdG8gc3RvcCBvciByZWxvYWQgdGhlIHNlcnZpY2UuIikKICAgICAgICAgICAgIHJldHVybiA0CiAKLSAgICBwcmludCAiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlOiIKLSAgICBmb3IgY29tbWFuZCBpbiBbImNvdW50ZXJzIiwibmFtZSIsInZlcnNpb24iLCJhbGl2ZSIsInN0YXR1cyJdOgotICAgICAgICBwcmludCAiXHQlcyIgJSBjb21tYW5kCi0gICAgcHJpbnQgIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgd2l0aCByb290IHByaXZpbGVnZXM6IgotICAgIGZvciBjb21tYW5kIGluIFsic3RvcCIsInJlbG9hZCJdOgotICAgICAgICBwcmludCAiXHQlcyIgJSBjb21tYW5kCisgICAgcHJpbnQoIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZToiKQorICAgIGZvciBjb21tYW5kIGluIFsiY291bnRlcnMiLCAibmFtZSIsICJ2ZXJzaW9uIiwgImFsaXZlIiwgInN0YXR1cyJdOgorICAgICAgICBwcmludCgiXHQlcyIgJSBjb21tYW5kKQorICAgIHByaW50KCJUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBhdmFpbGFibGUgZm9yIHVzZXJzIHdpdGggcm9vdCBwcml2aWxlZ2VzOiIpCisgICAgZm9yIGNvbW1hbmQgaW4gWyJzdG9wIiwgInJlbG9hZCJdOgorICAgICAgICBwcmludCgiXHQlcyIgJSBjb21tYW5kKQorCisgICAgcmV0dXJuIDAKIAogCi0KLSAgICByZXR1cm4gMDsKLQotCi1kZWYgZmIzMDNfd3JhcHBlcihjb21tYW5kLCBwb3J0LCB0cmFuc19mYWN0b3J5ID0gTm9uZSwgcHJvdF9mYWN0b3J5ID0gTm9uZSk6CitkZWYgZmIzMDNfd3JhcHBlcihjb21tYW5kLCBwb3J0LCB0cmFuc19mYWN0b3J5PU5vbmUsIHByb3RfZmFjdG9yeT1Ob25lKToKICAgICBzb2NrID0gVFNvY2tldC5UU29ja2V0KCdsb2NhbGhvc3QnLCBwb3J0KQogCiAgICAgIyB1c2UgaW5wdXQgdHJhbnNwb3J0IGZhY3RvcnkgaWYgcHJvdmlkZWQKQEAgLTE3OSwxMSArMTc1LDExIEBACiAKICAgICAjIHBhcnNlIGNvbW1hbmQgbGluZSBvcHRpb25zCiAgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLSAgICBjb21tYW5kcz1bInN0b3AiLCJjb3VudGVycyIsInN0YXR1cyIsInJlbG9hZCIsInZlcnNpb24iLCJuYW1lIiwiYWxpdmUiXQorICAgIGNvbW1hbmRzID0gWyJzdG9wIiwgImNvdW50ZXJzIiwgInN0YXR1cyIsICJyZWxvYWQiLCAidmVyc2lvbiIsICJuYW1lIiwgImFsaXZlIl0KIAogICAgIHBhcnNlci5hZGRfb3B0aW9uKCItYyIsICItLWNvbW1hbmQiLCBkZXN0PSJjb21tYW5kIiwgaGVscD0iZXhlY3V0ZSB0aGlzIEFQSSIsCiAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1jb21tYW5kcywgZGVmYXVsdD0ic3RhdHVzIikKLSAgICBwYXJzZXIuYWRkX29wdGlvbigiLXAiLCItLXBvcnQiLGRlc3Q9InBvcnQiLGhlbHA9InRoZSBzZXJ2aWNlJ3MgcG9ydCIsCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1wIiwgIi0tcG9ydCIsIGRlc3Q9InBvcnQiLCBoZWxwPSJ0aGUgc2VydmljZSdzIHBvcnQiLAogICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9OTA4MikKIAogICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvcHkvc2V0dXAucHkgYi9jb250cmliL2ZiMzAzL3B5L3NldHVwLnB5CmluZGV4IDZkNDJiZDEuLmQyN2MyOTYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvcHkvc2V0dXAucHkKKysrIGIvY29udHJpYi9mYjMwMy9weS9zZXR1cC5weQpAQCAtMjQsMjYgKzI0LDI1IEBACiAgICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCiBleGNlcHQ6CiAgICAgZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbiwgQ29tbWFuZAotICAgICAgICAKLXNldHVwKG5hbWUgPSAndGhyaWZ0X2ZiMzAzJywKLSAgICB2ZXJzaW9uID0gJzAuOS4zJywKLSAgICBkZXNjcmlwdGlvbiA9ICdQeXRob24gYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IEZCMzAzJywKLSAgICBhdXRob3IgPSBbJ1RocmlmdCBEZXZlbG9wZXJzJ10sCi0gICAgYXV0aG9yX2VtYWlsID0gWydkZXZAdGhyaWZ0LmFwYWNoZS5vcmcnXSwKLSAgICB1cmwgPSAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnJywKLSAgICBsaWNlbnNlID0gJ0FwYWNoZSBMaWNlbnNlIDIuMCcsCi0gICAgcGFja2FnZXMgPSBbCi0gICAgICAgICdmYjMwMycsCi0gICAgICAgICdmYjMwM19zY3JpcHRzJywKLSAgICBdLAotICAgIGNsYXNzaWZpZXJzID0gWwotICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZScsCi0gICAgICAgICdFbnZpcm9ubWVudCA6OiBDb25zb2xlJywKLSAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnLAotICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uJywKLSAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyJywKLSAgICAgICAgJ1RvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcycsCi0gICAgICAgICdUb3BpYyA6OiBTeXN0ZW0gOjogTmV0d29ya2luZycKLSAgICBdLAotKQogCitzZXR1cChuYW1lPSd0aHJpZnRfZmIzMDMnLAorICAgICAgdmVyc2lvbj0nMS4wLjAnLAorICAgICAgZGVzY3JpcHRpb249J1B5dGhvbiBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgRkIzMDMnLAorICAgICAgYXV0aG9yPVsnQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzJ10sCisgICAgICBhdXRob3JfZW1haWw9WydkZXZAdGhyaWZ0LmFwYWNoZS5vcmcnXSwKKyAgICAgIHVybD0naHR0cDovL3RocmlmdC5hcGFjaGUub3JnJywKKyAgICAgIGxpY2Vuc2U9J0FwYWNoZSBMaWNlbnNlIDIuMCcsCisgICAgICBwYWNrYWdlcz1bCisgICAgICAgICAgJ2ZiMzAzJywKKyAgICAgICAgICAnZmIzMDNfc2NyaXB0cycsCisgICAgICBdLAorICAgICAgY2xhc3NpZmllcnM9WworICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMgOjogNyAtIEluYWN0aXZlJywKKyAgICAgICAgICAnRW52aXJvbm1lbnQgOjogQ29uc29sZScsCisgICAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnLAorICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24nLAorICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMicsCisgICAgICAgICAgJ1RvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcycsCisgICAgICAgICAgJ1RvcGljIDo6IFN5c3RlbSA6OiBOZXR3b3JraW5nJworICAgICAgXSwKKyAgICAgICkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGFyc2VfcHJvZmlsaW5nLnB5IGIvY29udHJpYi9wYXJzZV9wcm9maWxpbmcucHkKaW5kZXggM2Q0NmZiOC4uMGJlNWYyOSAxMDA3NTUKLS0tIGEvY29udHJpYi9wYXJzZV9wcm9maWxpbmcucHkKKysrIGIvY29udHJpYi9wYXJzZV9wcm9maWxpbmcucHkKQEAgLTQ2LDYgKzQ2LDggQEAKIAogCiBnX2FkZHJzX2J5X2ZpbGVuYW1lID0ge30KKworCiBkZWYgZ2V0X2FkZHJlc3MoZmlsZW5hbWUsIGFkZHJlc3MpOgogICAgICIiIgogICAgIFJldHJpZXZlIGFuIEFkZHJlc3NJbmZvIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgZmlsZSBhbmQgYWRkcmVzcy4KQEAgLTEwMywxMiArMTA1LDEyIEBACiAgICAgICAgIGlkeCA9IGZpbGVfYW5kX2xpbmUucmZpbmQoJzonKQogICAgICAgICBpZiBpZHggPCAwOgogICAgICAgICAgICAgbXNnID0gJ2V4cGVjdGVkIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gYWRkcjJsaW5lOyBnb3QgJXInICUgXAotICAgICAgICAgICAgICAgICAgICAoZmlsZV9hbmRfbGluZSwpCisgICAgICAgICAgICAgICAgKGZpbGVfYW5kX2xpbmUsKQogICAgICAgICAgICAgbXNnICs9ICdcbmZpbGU9JXIsIGFkZHJlc3M9JXInICUgKGZpbGVuYW1lLCBhZGRyZXNzLmFkZHJlc3MpCiAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24obXNnKQogCiAgICAgICAgIGFkZHJlc3Muc291cmNlRmlsZSA9IGZpbGVfYW5kX2xpbmVbOmlkeF0KLSAgICAgICAgYWRkcmVzcy5zb3VyY2VMaW5lID0gZmlsZV9hbmRfbGluZVtpZHgrMTpdCisgICAgICAgIGFkZHJlc3Muc291cmNlTGluZSA9IGZpbGVfYW5kX2xpbmVbaWR4ICsgMTpdCiAKICAgICAocmVtYWluaW5nX291dCwgY21kX2VycikgPSBwcm9jLmNvbW11bmljYXRlKCkKICAgICByZXRjb2RlID0gcHJvYy53YWl0KCkKQEAgLTE4MCw3ICsxODIsNyBAQAogCiAgICAgdmlydF9jYWxsX3JlZ2V4ID0gcmUuY29tcGlsZShyJ15ccypUX1ZJUlRVQUxfQ0FMTDogKFxkKykgY2FsbHMgb24gKC4qKTokJykKICAgICBnZW5fcHJvdF9yZWdleCA9IHJlLmNvbXBpbGUoCi0gICAgICAgICAgICByJ15ccypUX0dFTkVSSUNfUFJPVE9DT0w6IChcZCspIGNhbGxzIHRvICguKikgd2l0aCBhICguKik6JCcpCisgICAgICAgIHInXlxzKlRfR0VORVJJQ19QUk9UT0NPTDogKFxkKykgY2FsbHMgdG8gKC4qKSB3aXRoIGEgKC4qKTokJykKICAgICBidF9yZWdleCA9IHJlLmNvbXBpbGUocideXHMqIyhcZCspXHMqKC4qKSBcWygweFswLTlBLVphLXpdKylcXSQnKQogCiAgICAgIyBQYXJzZSBhbGwgb2YgdGhlIGlucHV0LCBhbmQgc3RvcmUgaXQgYXMgRW50cnkgb2JqZWN0cwpAQCAtMjA5LDcgKzIxMSw3IEBACiAgICAgICAgICAgICAgICAgIyAiX1oiIHRvIHRoZSB0eXBlIG5hbWUgdG8gbWFrZSBpdCBsb29rIGxpa2UgYW4gZXh0ZXJuYWwgbmFtZS4KICAgICAgICAgICAgICAgICB0eXBlX25hbWUgPSAnX1onICsgdHlwZV9uYW1lCiAgICAgICAgICAgICBoZWFkZXIgPSAnVF9WSVJUVUFMX0NBTEw6ICVkIGNhbGxzIG9uICIlcyInICUgXAotICAgICAgICAgICAgICAgICAgICAobnVtX2NhbGxzLCB0eXBlX25hbWUpCisgICAgICAgICAgICAgICAgKG51bV9jYWxscywgdHlwZV9uYW1lKQogICAgICAgICAgICAgaWYgY3VycmVudF9lbnRyeSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBlbnRyaWVzLmFwcGVuZChjdXJyZW50X2VudHJ5KQogICAgICAgICAgICAgY3VycmVudF9lbnRyeSA9IEVudHJ5KGhlYWRlcikKQEAgLTIyNCw3ICsyMjYsNyBAQAogICAgICAgICAgICAgICAgIHR5cGVfbmFtZTEgPSAnX1onICsgdHlwZV9uYW1lMQogICAgICAgICAgICAgICAgIHR5cGVfbmFtZTIgPSAnX1onICsgdHlwZV9uYW1lMgogICAgICAgICAgICAgaGVhZGVyID0gJ1RfR0VORVJJQ19QUk9UT0NPTDogJWQgY2FsbHMgdG8gIiVzIiB3aXRoIGEgIiVzIicgJSBcCi0gICAgICAgICAgICAgICAgICAgIChudW1fY2FsbHMsIHR5cGVfbmFtZTEsIHR5cGVfbmFtZTIpCisgICAgICAgICAgICAgICAgKG51bV9jYWxscywgdHlwZV9uYW1lMSwgdHlwZV9uYW1lMikKICAgICAgICAgICAgIGlmIGN1cnJlbnRfZW50cnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgZW50cmllcy5hcHBlbmQoY3VycmVudF9lbnRyeSkKICAgICAgICAgICAgIGN1cnJlbnRfZW50cnkgPSBFbnRyeShoZWFkZXIpCmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vcG9tLnhtbCBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9wb20ueG1sCmluZGV4IGIxMmE4MjEuLmI2NWY2YWEgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9wb20ueG1sCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9wb20ueG1sCkBAIC03LDkgKzcsOSBAQAogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCisKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIAorCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCkBAIC0xNyw4ICsxNyw4IEBACiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIHVuZGVyIHRoZSBMaWNlbnNlLgogIC0tPgotPHByb2plY3QgCi0gIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIAorPHByb2plY3QKKyAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CiAKQEAgLTI3LDE1ICsyNywxNSBAQAogICA8YXJ0aWZhY3RJZD50aHJpZnQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgogICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgogICA8bmFtZT50aHJpZnQtbWF2ZW4tcGx1Z2luPC9uYW1lPgotICA8dmVyc2lvbj4wLjkuMzwvdmVyc2lvbj4KKyAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CiAgIDxidWlsZD4KICAgICA8cGx1Z2lucz4KICAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8c291cmNlPjEuNzwvc291cmNlPgotICAgICAgICAgIDx0YXJnZXQ+MS43PC90YXJnZXQ+CisgICAgICAgICAgPHNvdXJjZT4xLjg8L3NvdXJjZT4KKyAgICAgICAgICA8dGFyZ2V0PjEuODwvdGFyZ2V0PgogICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICA8L3BsdWdpbj4KICAgICAgIDxwbHVnaW4+CkBAIC03Nyw2ICs3NywxMiBAQAogICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+My4wLjE0PC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1hbGw8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjEwLjE5PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KICAgPHByb3BlcnRpZXM+CiAgICAgPHRocmlmdC5yb290PiR7YmFzZWRpcn0vLi4vLi48L3RocmlmdC5yb290PgpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9BYnN0cmFjdFRocmlmdE1vam8uamF2YQppbmRleCA2MzQ1MWMzLi44NjliZTk1IDEwMDY0NAotLS0gYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9BYnN0cmFjdFRocmlmdE1vam8uamF2YQorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9BYnN0cmFjdFRocmlmdE1vam8uamF2YQpAQCAtOTMsNyArOTMsNyBAQAogICAgICAqIGl0IHdpbGwgZ2VuZXJhdGUgSmF2YSBvdXRwdXQuIFRoZSBtYWluIHJlYXNvbiBmb3IgdGhpcyBvcHRpb24gaXMgdG8gYmUgYWJsZSB0byBhZGQgb3B0aW9ucwogICAgICAqIHRvIHRoZSBKYXZhIGdlbmVyYXRvciAtIGlmIHlvdSBnZW5lcmF0ZSBzb21ldGhpbmcgZWxzZSwgeW91J3JlIG9uIHlvdXIgb3duLgogICAgICAqCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJqYXZhOmhhc2hjb2RlIgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iamF2YSIKICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBnZW5lcmF0b3I7CiAKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgICAqIFNpbmNlIHtAY29kZSB0aHJpZnR9IGNhbm5vdCBhY2Nlc3MgamFycywgdGhyaWZ0IGZpbGVzIGluIGRlcGVuZGVuY2llcyBhcmUgZXh0cmFjdGVkIHRvIHRoaXMgbG9jYXRpb24KICAgICAgKiBhbmQgZGVsZXRlZCBvbiBleGl0LiBUaGlzIGRpcmVjdG9yeSBpcyBhbHdheXMgY2xlYW5lZCBkdXJpbmcgZXhlY3V0aW9uLgogICAgICAqCi0gICAgICogQHBhcmFtZXRlciBwcm9wZXJ0eT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGhyaWZ0LWRlcGVuZGVuY2llcyIKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3RocmlmdC1kZXBlbmRlbmNpZXMiCiAgICAgICogQHJlcXVpcmVkCiAgICAgICovCiAgICAgcHJpdmF0ZSBGaWxlIHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3Rvcnk7CkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7bG9jYWxSZXBvc2l0b3J5fSIKICAgICAgKiBAcmVxdWlyZWQKICAgICAgKi8KLSAgICBwcml2YXRlIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnk7CisgICAgcHJvdGVjdGVkIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnk7CiAKICAgICAvKioKICAgICAgKiBTZXQgdGhpcyB0byB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUgaGFzaGluZyBvZiBkZXBlbmRlbnQgamFyIHBhdGhzLgpAQCAtMTI5LDcgKzEyOSw3IEBACiAgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJ0cnVlIgogICAgICAqIEByZXF1aXJlZAogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNoRGVwZW5kZW50UGF0aHM7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzaERlcGVuZGVudFBhdGhzOwogCiAgICAgLyoqCiAgICAgICogQHBhcmFtZXRlcgpAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgICAgIGNoZWNrTm90TnVsbChnZW5lcmF0b3IsICJnZW5lcmF0b3IiKTsKICAgICAgICAgZmluYWwgRmlsZSB0aHJpZnRTb3VyY2VSb290ID0gZ2V0VGhyaWZ0U291cmNlUm9vdCgpOwogICAgICAgICBjaGVja05vdE51bGwodGhyaWZ0U291cmNlUm9vdCk7Ci0gICAgICAgIGNoZWNrQXJndW1lbnQoIXRocmlmdFNvdXJjZVJvb3QuaXNGaWxlKCksICJ0aHJpZnRTb3VyY2VSb290IGlzIGEgZmlsZSwgbm90IGEgZGlyZXRvcnkiKTsKKyAgICAgICAgY2hlY2tBcmd1bWVudCghdGhyaWZ0U291cmNlUm9vdC5pc0ZpbGUoKSwgInRocmlmdFNvdXJjZVJvb3QgaXMgYSBmaWxlLCBub3QgYSBkaXJlY3RvcnkiKTsKICAgICAgICAgY2hlY2tOb3ROdWxsKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksICJ0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5Iik7CiAgICAgICAgIGNoZWNrU3RhdGUoIXRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkuaXNGaWxlKCksICJ0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5IGlzIGEgZmlsZSwgbm90IGEgZGlyZWN0b3J5Iik7CiAgICAgICAgIGZpbmFsIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CkBAIC0yNjgsNyArMjY4LDkgQEAKICAgICAgICAgaWYgKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkuZXhpc3RzKCkpIHsKICAgICAgICAgICAgIGNsZWFuRGlyZWN0b3J5KHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkpOwogICAgICAgICB9CisKICAgICAgICAgU2V0PEZpbGU+IHRocmlmdERpcmVjdG9yaWVzID0gbmV3SGFzaFNldCgpOworCiAgICAgICAgIGZvciAoRmlsZSBjbGFzc3BhdGhFbGVtZW50RmlsZSA6IGNsYXNzcGF0aEVsZW1lbnRGaWxlcykgewogICAgICAgICAgICAgLy8gZm9yIHNvbWUgcmVhc29uIHVuZGVyIElBTSwgd2UgcmVjZWl2ZSBwb21zIGFzIGRlcGVuZGVudCBmaWxlcwogICAgICAgICAgICAgLy8gSSBhbSBleGNsdWRpbmcgLnhtbCByYXRoZXIgdGhhbiBpbmNsdWRpbmcgLmphciBhcyB0aGVyZSBtYXkgYmUgb3RoZXIgZXh0ZW5zaW9ucyBpbiB1c2UgKHNhciwgaGFyLCB6aXApCkBAIC0yODMsMTggKzI4NSwyNyBAQAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgd2FzIG5vdCBhIHJlYWRhYmxlIGFydGlmYWN0IiwgY2xhc3NwYXRoRWxlbWVudEZpbGUpKTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBDb3B5IGVhY2ggLnRocmlmdCBmaWxlIGZvdW5kIGluIHRoZSBKQVIgaW50byBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIHByZXNlcnZpbmcgdGhlCisgICAgICAgICAgICAgICAgICogZGlyZWN0b3J5IHBhdGggaXQgaGFkIHJlbGF0aXZlIHRvIGl0cyBjb250YWluaW5nIEpBUi4gQWRkIHRoZSByZXN1bHRpbmcgcm9vdCBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgKiAodW5pcXVlIGZvciBlYWNoIEpBUiBwcm9jZXNzZWQpIHRvIHRoZSBzZXQgb2YgdGhyaWZ0IGluY2x1ZGUgZGlyZWN0b3JpZXMgdG8gdXNlIHdoZW4KKyAgICAgICAgICAgICAgICAgKiBjb21waWxpbmcuCisgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgZm9yIChKYXJFbnRyeSBqYXJFbnRyeSA6IGxpc3QoY2xhc3NwYXRoSmFyLmVudHJpZXMoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGphckVudHJ5TmFtZSA9IGphckVudHJ5LmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGphckVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aChUSFJJRlRfRklMRV9TVUZGSVgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHJ1bmNhdGVkSmFyUGF0aCA9IHRydW5jYXRlUGF0aChjbGFzc3BhdGhKYXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0Um9vdERpcmVjdG9yeSA9IG5ldyBGaWxlKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksIHRydW5jYXRlZEphclBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSB1bmNvbXByZXNzZWRDb3B5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUobmV3IEZpbGUodGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZVBhdGgoY2xhc3NwYXRoSmFyLmdldE5hbWUoKSkpLCBqYXJFbnRyeU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSh0aHJpZnRSb290RGlyZWN0b3J5LCBqYXJFbnRyeU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkQ29weS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5U3RyZWFtVG9GaWxlKG5ldyBSYXdJbnB1dFN0cmVhbUZhY2FkZShjbGFzc3BhdGhKYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldElucHV0U3RyZWFtKGphckVudHJ5KSksIHVuY29tcHJlc3NlZENvcHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0RGlyZWN0b3JpZXMuYWRkKHVuY29tcHJlc3NlZENvcHkuZ2V0UGFyZW50RmlsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdERpcmVjdG9yaWVzLmFkZCh0aHJpZnRSb290RGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgfSBlbHNlIGlmIChjbGFzc3BhdGhFbGVtZW50RmlsZS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgICAgICAgRmlsZVtdIHRocmlmdEZpbGVzID0gY2xhc3NwYXRoRWxlbWVudEZpbGUubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewpAQCAtMzA3LDYgKzMxOCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YodGhyaWZ0RGlyZWN0b3JpZXMpOwogICAgIH0KIApAQCAtMzE5LDE1ICszMzEsNiBAQAogICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZih0aHJpZnRGaWxlc0luRGlyZWN0b3J5KTsKICAgICB9CiAKLSAgICBJbW11dGFibGVTZXQ8RmlsZT4gZmluZFRocmlmdEZpbGVzSW5EaXJlY3RvcmllcyhJdGVyYWJsZTxGaWxlPiBkaXJlY3RvcmllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tOb3ROdWxsKGRpcmVjdG9yaWVzKTsKLSAgICAgICAgU2V0PEZpbGU+IHRocmlmdEZpbGVzID0gbmV3SGFzaFNldCgpOwotICAgICAgICBmb3IgKEZpbGUgZGlyZWN0b3J5IDogZGlyZWN0b3JpZXMpIHsKLSAgICAgICAgICAgIHRocmlmdEZpbGVzLmFkZEFsbChmaW5kVGhyaWZ0RmlsZXNJbkRpcmVjdG9yeShkaXJlY3RvcnkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZih0aHJpZnRGaWxlcyk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogVHJ1bmNhdGVzIHRoZSBwYXRoIG9mIGphciBmaWxlcyBzbyB0aGF0IHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhbCByZXBvc2l0b3J5LgogICAgICAqCmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRUZXN0Q29tcGlsZU1vam8uamF2YSBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdFRlc3RDb21waWxlTW9qby5qYXZhCmluZGV4IGZiODlkOTYuLjFiMWQ5OWUgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdFRlc3RDb21waWxlTW9qby5qYXZhCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdFRlc3RDb21waWxlTW9qby5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKIAogLyoqCiAgKiBAcGhhc2UgZ2VuZXJhdGUtdGVzdC1zb3VyY2VzCkBAIC03MSw0ICs3MiwyMiBAQAogICAgIHByb3RlY3RlZCBGaWxlIGdldFRocmlmdFNvdXJjZVJvb3QoKSB7CiAgICAgICAgIHJldHVybiB0aHJpZnRUZXN0U291cmNlUm9vdDsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2FsIG1hdmVuIEFydGlmYWN0UmVwb3NpdG9yeS4gRXhwb3NlZCBvbmx5IHRvIGFsbG93IHRlc3Rpbmcgb3V0c2lkZSBvZiBNYXZlbiBpdHNlbGYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxSZXBvc2l0b3J5IGxvY2FsIEFydGlmYWN0UmVwb3NpdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsTWF2ZW5SZXBvc2l0b3J5KGZpbmFsIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnkpIHsKKyAgICAgICAgdGhpcy5sb2NhbFJlcG9zaXRvcnkgPSBsb2NhbFJlcG9zaXRvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvcHRpb24gdG8gaGFzaCBkZXBlbmRlbnQgSkFSIHBhdGhzLiBFeHBvc2VkIG9ubHkgdG8gYWxsb3cgdGVzdGluZyBvdXRzaWRlIG9mIE1hdmVuIGl0c2VsZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYXNoRGVwZW5kZW50UGF0aHMgd2hldGhlciBvciBub3QgdG8gaGFzaCBwYXRocyB0byBkZXBlbmRlbnQgSkFScworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhhc2hEZXBlbmRlbnRQYXRocyhmaW5hbCBib29sZWFuIGhhc2hEZXBlbmRlbnRQYXRocykgeworICAgICAgICB0aGlzLmhhc2hEZXBlbmRlbnRQYXRocyA9IGhhc2hEZXBlbmRlbnRQYXRoczsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0QWJzdHJhY3RUaHJpZnRNb2pvLmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0QWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExNzY3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RBYnN0cmFjdFRocmlmdE1vam8uamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tYXZlbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmFzc2VydEVxdWFsczsKKworCitwdWJsaWMgY2xhc3MgVGVzdEFic3RyYWN0VGhyaWZ0TW9qbyB7CisKKyAgICBwcml2YXRlIFRocmlmdFRlc3RDb21waWxlTW9qbyBtb2pvOworICAgIHByaXZhdGUgRmlsZSB0ZXN0Um9vdERpcjsKKyAgICBwcml2YXRlIEFydGlmYWN0UmVwb3NpdG9yeSBtYXZlblJlcG9zaXRvcnk7CisKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIHRtcERpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7CisgICAgICAgIHRlc3RSb290RGlyID0gbmV3IEZpbGUodG1wRGlyLCAidGhyaWZ0LXRlc3QiKTsKKworICAgICAgICAvLyB0aGUgdHJ1bmNhdGVQYXRoIG1ldGhvZCBhc3N1bWVzIGEgbWF2ZW4gcmVwb3NpdG9yeSwgYnV0IGl0IG9ubHkgY2FyZXMgYWJvdXQgdGhlIGJhc2UgZGlyCisgICAgICAgIG1hdmVuUmVwb3NpdG9yeSA9IE1vY2tpdG8ubW9jayhBcnRpZmFjdFJlcG9zaXRvcnkuY2xhc3MpOworICAgICAgICBNb2NraXRvLndoZW4obWF2ZW5SZXBvc2l0b3J5LmdldEJhc2VkaXIoKSkudGhlblJldHVybigiL3Rlc3QvbWF2ZW4vcmVwby9iYXNlZGlyIik7CisKKyAgICAgICAgbW9qbyA9IG5ldyBUaHJpZnRUZXN0Q29tcGlsZU1vam8oKTsKKyAgICAgICAgbW9qby5zZXRMb2NhbE1hdmVuUmVwb3NpdG9yeShtYXZlblJlcG9zaXRvcnkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ha2VUaHJpZnRQYXRoRnJvbUphcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgRmlsZSB0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5ID0gdGVzdFJvb3REaXI7CisKKyAgICAgICAgLy8gVGhlIFNoYXJlZElkbC5qYXIgZmlsZSBjb250YWlucyB0aGUgc2FtZSBpZGwvc2hhcmVkLnRocmlmdCBhbmQgaWRsL3R1dG9yaWFsLnRocmlmdCBoaWVyYXJjaHkKKyAgICAgICAgLy8gdXNlZCBieSBvdGhlciB0ZXN0cy4gSXQncyB1c2VkIGhlcmUgdG8gcmVwcmVzZW50IGEgZGVwZW5kZW5jeSBvZiB0aGUgcHJvamVjdCBtYXZlbiBpcyBidWlsZGluZywKKyAgICAgICAgLy8gb25lIHRoYXQgaXMgY29udHJpYnV0aW5nIC50aHJpZnQgSURMIGZpbGVzIGFzIHdlbGwgYXMgYW55IG90aGVyIGFydGlmYWN0cy4KKyAgICAgICAgZmluYWwgSXRlcmFibGU8RmlsZT4gY2xhc3NwYXRoRWxlbWVudEZpbGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvZGVwZW5kZW5jeS1qYXItdGVzdC9TaGFyZWRJZGwuamFyIikKKyAgICAgICAgKTsKKworICAgICAgICBmaW5hbCBTZXQ8RmlsZT4gdGhyaWZ0RGlyZWN0b3JpZXMgPSBtb2pvLm1ha2VUaHJpZnRQYXRoRnJvbUphcnModGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSwgY2xhc3NwYXRoRWxlbWVudEZpbGVzKTsKKworICAgICAgICAvLyBUaGUgcmVzdWx0cyBzaG91bGQgYmUgYSBwYXRoIHRvIGEgZGlyZWN0b3J5IG5hbWVkIGFmdGVyIHRoZSBKQVIgaXRzZWxmIChhc3N1bWluZyBubyBwYXRoIGhhc2hpbmcsCisgICAgICAgIC8vIGJ1dCBzZWUgYmVsb3cgZm9yIGEgc2VwYXJhdGUgdGVzdCBvZiB0aGF0KSByZXByZXNlbnRpbmcgdGhlIHJvb3Qgb2YgYSBoaWVyYXJjaHkgY29udGFpbmluZyB0aHJpZnQKKyAgICAgICAgLy8gZmlsZXMsIHN1aXRhYmxlIGZvciBwcm92aWRpbmcgdG8gdGhlIHRocmlmdCBjb21waWxlciBhcyBhbiBpbmNsdWRlIGRpcmVjdG9yeS4gSW4gdGhpcyBjYXNlLCB0aGF0CisgICAgICAgIC8vIG1lYW5zIGl0IHBvaW50cyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlICJpZGwiIGhpZXJhcmNoeSByYXRoZXIgdGhhbiB0byB0aGUgaWRsIGRpcmVjdG9yeQorICAgICAgICAvLyBpdHNlbGYuCisgICAgICAgIGZpbmFsIFNldDxGaWxlPiBleHBlY3RlZCA9IFNldHMubmV3SGFzaFNldCgKKyAgICAgICAgICAgICAgICBuZXcgRmlsZSh0ZXN0Um9vdERpciwgInNyYy90ZXN0L3Jlc291cmNlcy9kZXBlbmRlbmN5LWphci10ZXN0L1NoYXJlZElkbC5qYXIiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygibWFrZVRocmlmdFBhdGhGcm9tSmFycyBzaG91bGQgcmV0dXJuIHRocmlmdCBJREwgYmFzZSBwYXRoIGZyb20gd2l0aGluIEpBUiIsIGV4cGVjdGVkLCB0aHJpZnREaXJlY3Rvcmllcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJ1bmNhdGVQYXRoKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIC8vIEpBUiBwYXRoIGlzIHVucmVsYXRlZCB0byBtYXZlbiByZXBvLCBhbmQgc2hvdWxkIGJlIHVuY2hhbmdlZAorICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoL3RvL3NvbWVqYXIuamFyIiwgbW9qby50cnVuY2F0ZVBhdGgoIi9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworCisgICAgICAgIC8vIEpBUiBwYXRoIGlzIHdpdGhpbiBtYXZlbiByZXBvLCBhbmQgc2hvdWxkIGJlIG1hZGUgcmVsYXRpdmUgdG8gdGhlIHJlcG8KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXRoL3RvL3NvbWVqYXIuamFyIiwgbW9qby50cnVuY2F0ZVBhdGgoIi90ZXN0L21hdmVuL3JlcG8vYmFzZWRpci9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworCisgICAgICAgIC8vIEpBUiBwYXRoIGNvbnRhaW5zIGZvcndhcmQgc2xhc2hlcyB0aGF0IHNob3VsZCBiZSBub3JtYWxpemVkCisgICAgICAgIGFzc2VydEVxdWFscygiL3BhdGgvdG8vc29tZWphci5qYXIiLCBtb2pvLnRydW5jYXRlUGF0aCgiXFxwYXRoXFx0b1xcc29tZWphci5qYXIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJ1bmNhdGVQYXRoV2l0aERlcGVuZGVudFBhdGhIYXNoaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIG1vam8uc2V0SGFzaERlcGVuZGVudFBhdGhzKHRydWUpOworCisgICAgICAgIC8vIGhhc2hEZXBlbmRlbnRQYXRocyBzZXQgdG8gdHJ1ZSwgdGhlIEpBUiBwYXRoIGlzIGltbWVkaWF0ZWx5IGhhc2hlZCAoTUQ1KSBhbmQgY29udmVydGVkIHRvIGEgaGV4IHN0cmluZworCisgICAgICAgIGFzc2VydEVxdWFscygiMWM4NTk1MDk4N2IyMzQ5MzQ2MmNmM2MyNjFkOTUxMGEiLCBtb2pvLnRydW5jYXRlUGF0aCgiL3BhdGgvdG8vc29tZWphci5qYXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMzlmYzJiNGMzNGNiNmNiMGRhMzhiZWQ1ZDhiNWZjNjciLCBtb2pvLnRydW5jYXRlUGF0aCgiL3Rlc3QvbWF2ZW4vcmVwby9iYXNlZGlyL3BhdGgvdG8vc29tZWphci5qYXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjViNjkyNGY1YjBlMTk0ODZkMGZmODg0NDhlOTk5ZDUiLCBtb2pvLnRydW5jYXRlUGF0aCgiXFxwYXRoXFx0b1xcc29tZWphci5qYXIiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0VGhyaWZ0LmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0VGhyaWZ0LmphdmEKaW5kZXggM2VjZDA5NC4uN2M3ODkxZSAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdFRocmlmdC5qYXZhCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RUaHJpZnQuamF2YQpAQCAtNzMsNyArNzMsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyaWZ0Q29tcGlsZVdpdGhHZW5lcmF0b3JPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYnVpbGRlci5zZXRHZW5lcmF0b3IoImphdmE6cHJpdmF0ZS1tZW1iZXJzLGhhc2hjb2RlIik7CisgICAgICAgIGJ1aWxkZXIuc2V0R2VuZXJhdG9yKCJqYXZhOnByaXZhdGUtbWVtYmVycyIpOwogICAgICAgICBleGVjdXRlVGhyaWZ0Q29tcGlsZSgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQuc3BlYyBiL2NvbnRyaWIvdGhyaWZ0LnNwZWMKaW5kZXggZGFiMzI3NS4uY2JiMDhmYiAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQuc3BlYworKysgYi9jb250cmliL3RocmlmdC5zcGVjCkBAIC0yOCw3ICsyOCw3IEBACiBMaWNlbnNlOiAgICAgICAgQXBhY2hlIExpY2Vuc2UgdjIuMAogR3JvdXA6ICAgICAgICAgIERldmVsb3BtZW50CiBTdW1tYXJ5OiAgICAgICAgUlBDIGFuZCBzZXJpYWxpemF0aW9uIGZyYW1ld29yawotVmVyc2lvbjogICAgICAgIDAuOS4zCitWZXJzaW9uOiAgICAgICAgMC4xMy4wCiBSZWxlYXNlOiAgICAgICAgMAogVVJMOiAgICAgICAgICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZwogUGFja2FnZXI6ICAgICAgIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CkBAIC01OCw4ICs1OCw4IEBACiBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCiBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBwb3dlcmZ1bCBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uCiBlbmdpbmUgdG8gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gQysrLAotSmF2YSwgQyMsIFB5dGhvbiwgUnVieSwgUGVybCwgUEhQLCBPYmplY3RpdmUgQy9Db2NvYSwgU21hbGx0YWxrLCBFcmxhbmcsCi1PYmplY3RpdmUgQ2FtbCwgYW5kIEhhc2tlbGwuCitKYXZhLCBDIywgUHl0aG9uLCBSdWJ5LCBQZXJsLCBQSFAsIFNtYWxsdGFsaywgRXJsYW5nLCBPQ2FtbCwgSGFza2VsbCwgYW5kCitvdGhlciBsYW5ndWFnZXMuCiAKICVmaWxlcwogJWRlZmF0dHIoLSxyb290LHJvb3QpCkBAIC0xNzgsNiArMTc4LDE5IEBACiAgIC0td2l0aG91dC1jc2hhcnAgXAogICAtLXdpdGhvdXQtZXJsYW5nIFwKIAorJWlmIDAleyE/d2l0aG91dF9ydWJ5OjF9CitldmFsICQoZ3JlcCAiXldJVEhfUlVCWV9UUlVFIiBjb25maWcubG9nKQoraWYgW1sgIiR7V0lUSF9SVUJZX1RSVUV9IiAhPSAiIiBdXTsgdGhlbgorICBzZXQgK3gKKyAgZWNobyAiIgorICBlY2hvICJjb25maWd1cmUgZGV0ZXJtaW5lZCB0aGF0IHJ1YnkgcmVxdWlyZW1lbnRzIGFyZSBtaXNzaW5nIChidW5kbGVyIGdlbT8pLCBlaXRoZXIgaW5zdGFsbCBtaXNzaW5nIGNvbXBvbmVudHMiID4mMgorICBlY2hvICJvciBkaXNhYmxlIHRoZSBydWJ5IHN1Yi1wYWNrYWdlcyBhcyBmb2xsb3dzOiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4mMgorICBlY2hvICIgICAgIHJwbWJ1aWxkIC1EJyV3aXRob3V0X3J1YnkgMScgLi4uIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4mMgorICBlY2hvICIiCisgIGV4aXQgMQorZmkKKyVlbmRpZgorCiBtYWtlICV7P19zbXBfbWZsYWdzfQogCiAlaWYgMCV7IT93aXRob3V0X2phdmE6MX0KQEAgLTIzNCw1ICsyNDcsNyBAQAogL3NiaW4vbGRjb25maWcgPiAvZGV2L251bGwgMj4mMQogCiAlY2hhbmdlbG9nCi0qIFdlZCBTZXB0IDI1IDIwMTUgVGhyaWZ0IERldiA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgotLSBUaHJpZnQgMC45LjMgcmVsZWFzZS4KKyogV2VkIEF1ZyAyMSAyMDEzIFRocmlmdCBEZXYgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KKy0gVGhyaWZ0IDAuOS4xIHJlbGVhc2UuCisqIFdlZCBPY3QgMTAgMjAxMiBUaHJpZnQgRGV2IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IAorLSBUaHJpZnQgMC45LjAgcmVsZWFzZS4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LnZpbSBiL2NvbnRyaWIvdGhyaWZ0LnZpbQppbmRleCAzMDAwYjQ2Li42MjMxOTU1IDEwMDY0NAotLS0gYS9jb250cmliL3RocmlmdC52aW0KKysrIGIvY29udHJpYi90aHJpZnQudmltCkBAIC01MSw3ICs1MSw3IEBACiBzeW4ga2V5d29yZCB0aHJpZnRLZXl3b3JkIG5hbWVzcGFjZQogc3luIGtleXdvcmQgdGhyaWZ0S2V5d29yZCB4c2RfYWxsIHhzZF9vcHRpb25hbCB4c2RfbmlsbGFibGUgeHNkX2F0dHJzCiBzeW4ga2V5d29yZCB0aHJpZnRLZXl3b3JkIGluY2x1ZGUgY3BwX2luY2x1ZGUgY3BwX3R5cGUgY29uc3Qgb3B0aW9uYWwgcmVxdWlyZWQKLXN5biBrZXl3b3JkIHRocmlmdEJhc2ljVHlwZXMgdm9pZCBib29sIGJ5dGUgaTE2IGkzMiBpNjQgZG91YmxlIHN0cmluZyBiaW5hcnkKK3N5biBrZXl3b3JkIHRocmlmdEJhc2ljVHlwZXMgdm9pZCBib29sIGJ5dGUgaTggaTE2IGkzMiBpNjQgZG91YmxlIHN0cmluZyBiaW5hcnkKIHN5biBrZXl3b3JkIHRocmlmdFN0cnVjdHVyZSBtYXAgbGlzdCBzZXQgc3RydWN0IHR5cGVkZWYgZXhjZXB0aW9uIGVudW0gdGhyb3dzIHVuaW9uCiAKICIgU3BlY2lhbApkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1RocmlmdENvbW1vbi5oIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1RocmlmdENvbW1vbi5oCmluZGV4IGQyNGQxYTcuLjA3OGFkNDQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uaAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmgKQEAgLTE2LDggKzE2LDYgQEAKIC8vCiAKICNpZmRlZiBfV0lOMzIgLy90aHJpZnQgaXMgY3Jhc2hpbmcgd2hlbiB1c2luZyBib29zdCB0aHJlYWRzIG9uIE1hYyBPU1gKLSMgIGRlZmluZSBVU0VfQk9PU1RfVEhSRUFEIDEKLSMgIGluY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CiAjZWxzZQogIyAgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogIyAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgpAQCAtMjcsNyArMjUsNyBAQAogLy8gUmVxdWlyZWQgSW5jbHVkZXMKIC8vJ3NlcnZlcicgc2lkZSAjaW5jbHVkZXMKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KIC8vJ2NsaWVudCcgc2lkZSAjaW5jbHVkZXMKQEAgLTg5LDcgKzg3LDcgQEAKIAkJZWxzZQogCQl7CS8vTXVsdGktdGhyZWFkZWQgc2VydmVyCiAJCQlib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcihOdW1UaHJlYWRzKTsKLQkJCWJvb3N0OjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9IGJvb3N0OjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKKwkJCWJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPSBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PihuZXcgVGhyZWFkRmFjdG9yeSgpKTsKIAkJCXRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CiAJCQl0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwogCQkJc2VydmVyLnJlc2V0KG5ldyBUVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5LCB0aHJlYWRNYW5hZ2VyKSk7CmRpZmYgLS1naXQgYS9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9SRUFETUUubWQgYi9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9SRUFETUUubWQKaW5kZXggNzZkY2E0NC4uNTU1ODNmOSAxMDA2NDQKLS0tIGEvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvUkVBRE1FLm1kCisrKyBiL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1JFQURNRS5tZApAQCAtMTEsNyArMTEsNyBAQAogICAgJCB2YWdyYW50IHNzaAogICAgW3ZhZ3JhbnRAdGhyaWZ0IH5dJCBjZCAvdGhyaWZ0CiAgICBbdmFncmFudEB0aHJpZnQgdGhyaWZ0XSQgY29tcGlsZXIvY3BwL3RocmlmdCAtLXZlcnNpb24KLSAgIFRocmlmdCB2ZXJzaW9uIDEuMC4wLWRldgorICAgVGhyaWZ0IHZlcnNpb24gPHZlcnNpb24+CiAKIFRoZSBwcm92aXNpb25pbmcgc2NyaXB0IChpbnNpZGUgdGhlIFZhZ3JhbnRmaWxlKSBydW5zIC4vYm9vdHN0cmFwLnNoLCAuL2NvbmZpZ3VyZSwgbWFrZSBhbmQgbWFrZSBjaGVjaywgYnV0IGRvZXMgbm90IGluc3RhbGwgdGhyaWZ0LiBUbyBpbnN0YWxsIHRocmlmdCBydW4gIm1ha2UgaW5zdGFsbCIuCiAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1ZhZ3JhbnRmaWxlIGIvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvVmFncmFudGZpbGUKaW5kZXggNjIwNzk1OC4uNTFhMjIzOSAxMDA2NDQKLS0tIGEvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvVmFncmFudGZpbGUKKysrIGIvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvVmFncmFudGZpbGUKQEAgLTg3LDcgKzg3LDcgQEAKIAogIyBKYXZhIExJQiBEZXBlbmRlbmNpZXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXN1ZG8geXVtIGluc3RhbGwgLXkgYW50IGp1bml0IGFudC1ub2RlcHMgYW50LWp1bml0IGphdmEtMS43LjAtb3Blbmpkay1kZXZlbAorc3VkbyB5dW0gaW5zdGFsbCAteSBhbnQganVuaXQgYW50LW5vZGVwcyBhbnQtanVuaXQgamF2YS0xLjguMC1vcGVuamRrLWRldmVsCiAKICMgUHl0aG9uIExJQiBEZXBlbmRlbmNpZXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL01ha2VmaWxlIGIvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUKaW5kZXggYjA5ZjRlZS4uZWUzOThlMiAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUKKysrIGIvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUKQEAgLTI2LDcgKzI2LDcgQEAKIAogc3RvcmFnZS9fX2luaXRfXy5weTogc3RvcmFnZS50aHJpZnQKIAkkKFJNKSAkKGRpciAkQCkKLQkkKFRIUklGVCkgLS1nZW4gcHk6bmV3c3R5bGUgJDwKKwkkKFRIUklGVCkgLS1nZW4gcHkgJDwKIAltdiBnZW4tcHkvJChkaXIgJEApIC4KIAogJChHRU5TUkNTKTogc3RvcmFnZS50aHJpZnQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQucHkgYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LnB5CmluZGV4IGQ1NjA2OTcuLjFiZDYwYTEgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQucHkKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5weQpAQCAtMjAsNDQgKzIwLDQ1IEBACiBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIGZyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0CiAKKwogY2xhc3MgVFptcUNsaWVudChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGN0eCwgZW5kcG9pbnQsIHNvY2tfdHlwZSk6Ci0gICAgc2VsZi5fc29jayA9IGN0eC5zb2NrZXQoc29ja190eXBlKQotICAgIHNlbGYuX2VuZHBvaW50ID0gZW5kcG9pbnQKLSAgICBzZWxmLl93YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTygpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGN0eCwgZW5kcG9pbnQsIHNvY2tfdHlwZSk6CisgICAgICAgIHNlbGYuX3NvY2sgPSBjdHguc29ja2V0KHNvY2tfdHlwZSkKKyAgICAgICAgc2VsZi5fZW5kcG9pbnQgPSBlbmRwb2ludAorICAgICAgICBzZWxmLl93YnVmID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8oKQogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHNlbGYuX3NvY2suY29ubmVjdChzZWxmLl9lbmRwb2ludCkKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5fc29jay5jb25uZWN0KHNlbGYuX2VuZHBvaW50KQogCi0gIGRlZiByZWFkKHNlbGYsIHNpemUpOgotICAgIHJldCA9IHNlbGYuX3JidWYucmVhZChzaXplKQotICAgIGlmIGxlbihyZXQpICE9IDA6Ci0gICAgICByZXR1cm4gcmV0Ci0gICAgc2VsZi5fcmVhZF9tZXNzYWdlKCkKLSAgICByZXR1cm4gc2VsZi5fcmJ1Zi5yZWFkKHNpemUpCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldCA9IHNlbGYuX3JidWYucmVhZChzaXplKQorICAgICAgICBpZiBsZW4ocmV0KSAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAorICAgICAgICBzZWxmLl9yZWFkX21lc3NhZ2UoKQorICAgICAgICByZXR1cm4gc2VsZi5fcmJ1Zi5yZWFkKHNpemUpCiAKLSAgZGVmIF9yZWFkX21lc3NhZ2Uoc2VsZik6Ci0gICAgbXNnID0gc2VsZi5fc29jay5yZWN2KCkKLSAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8obXNnKQorICAgIGRlZiBfcmVhZF9tZXNzYWdlKHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9zb2NrLnJlY3YoKQorICAgICAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8obXNnKQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuX3didWYud3JpdGUoYnVmKQorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLl93YnVmLndyaXRlKGJ1ZikKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgbXNnID0gc2VsZi5fd2J1Zi5nZXR2YWx1ZSgpCi0gICAgc2VsZi5fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9zb2NrLnNlbmQobXNnKQorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX3didWYgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuX3NvY2suc2VuZChtc2cpCiAKLSAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gIEBwcm9wZXJ0eQotICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fcmJ1ZgorICAgICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmJ1ZgogCi0gICMgTk9URTogVGhpcyB3aWxsIHByb2JhYmx5IG5vdCBhY3R1YWxseSB3b3JrLgotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6Ci0gICAgd2hpbGUgbGVuKHByZWZpeCkgPCByZXFsZW46Ci0gICAgICBzZWxmLnJlYWRfbWVzc2FnZSgpCi0gICAgICBwcmVmaXggKz0gc2VsZi5fcmJ1Zi5nZXR2YWx1ZSgpCi0gICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKHByZWZpeCkKLSAgICByZXR1cm4gc2VsZi5fcmJ1ZgorICAgICMgTk9URTogVGhpcyB3aWxsIHByb2JhYmx5IG5vdCBhY3R1YWxseSB3b3JrLgorICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKKyAgICAgICAgd2hpbGUgbGVuKHByZWZpeCkgPCByZXFsZW46CisgICAgICAgICAgICBzZWxmLnJlYWRfbWVzc2FnZSgpCisgICAgICAgICAgICBwcmVmaXggKz0gc2VsZi5fcmJ1Zi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTyhwcmVmaXgpCisgICAgICAgIHJldHVybiBzZWxmLl9yYnVmCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmNwcCBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuY3BwCmluZGV4IGYwMzE0NTguLjg4NjYwYTMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuY3BwCisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7CiAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuaCBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuaAppbmRleCBhODQwYzg2Li5lY2QxM2I0IDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmgKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RaTVFTRVJWRVJfSF8KICNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFpNUVNFUlZFUl9IXyAxCiAKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8em1xLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KIApAQCAtMjgsNyArMjksNyBAQAogY2xhc3MgVFptcVNlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKICBwdWJsaWM6CiAgIFRabXFTZXJ2ZXIoCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAogICAgICAgem1xOjpjb250ZXh0X3QmIGN0eCwgY29uc3Qgc3RkOjpzdHJpbmcmIGVuZHBvaW50LCBpbnQgdHlwZSkKICAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yKQogICAgICwgcHJvY2Vzc29yXyhwcm9jZXNzb3IpCkBAIC01Niw3ICs1Nyw3IEBACiAgIH0KIAogIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwogICBpbnQgem1xX3R5cGVfOwogICB6bXE6OnNvY2tldF90IHNvY2tfOwogfTsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIucHkgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLnB5CmluZGV4IGM4M2NjOGQuLjE1YzE1NDMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIucHkKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5weQpAQCAtMjEsNTggKzIxLDU5IEBACiBpbXBvcnQgdGhyaWZ0LnNlcnZlci5UU2VydmVyCiBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0CiAKKwogY2xhc3MgVFptcVNlcnZlcih0aHJpZnQuc2VydmVyLlRTZXJ2ZXIuVFNlcnZlcik6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGN0eCwgZW5kcG9pbnQsIHNvY2tfdHlwZSk6Ci0gICAgdGhyaWZ0LnNlcnZlci5UU2VydmVyLlRTZXJ2ZXIuX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBOb25lKQotICAgIHNlbGYuem1xX3R5cGUgPSBzb2NrX3R5cGUKLSAgICBzZWxmLnNvY2tldCA9IGN0eC5zb2NrZXQoc29ja190eXBlKQotICAgIHNlbGYuc29ja2V0LmJpbmQoZW5kcG9pbnQpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgY3R4LCBlbmRwb2ludCwgc29ja190eXBlKToKKyAgICAgICAgdGhyaWZ0LnNlcnZlci5UU2VydmVyLlRTZXJ2ZXIuX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBOb25lKQorICAgICAgICBzZWxmLnptcV90eXBlID0gc29ja190eXBlCisgICAgICAgIHNlbGYuc29ja2V0ID0gY3R4LnNvY2tldChzb2NrX3R5cGUpCisgICAgICAgIHNlbGYuc29ja2V0LmJpbmQoZW5kcG9pbnQpCiAKLSAgZGVmIHNlcnZlT25lKHNlbGYpOgotICAgIG1zZyA9IHNlbGYuc29ja2V0LnJlY3YoKQotICAgIGl0cmFucyA9IHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKG1zZykKLSAgICBvdHJhbnMgPSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKyAgICBkZWYgc2VydmVPbmUoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuc29ja2V0LnJlY3YoKQorICAgICAgICBpdHJhbnMgPSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihtc2cpCisgICAgICAgIG90cmFucyA9IHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKKyAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCiAKLSAgICB0cnk6Ci0gICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICBleGNlcHQgRXhjZXB0aW9uOgotICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QiKQotICAgICAgIyBGYWxsIHRocm91Z2ggYW5kIHNlbmQgYmFjayBhIHJlc3BvbnNlLCBldmVuIGlmIGVtcHR5IG9yIGluY29tcGxldGUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QiKQorICAgICAgICAgICAgIyBGYWxsIHRocm91Z2ggYW5kIHNlbmQgYmFjayBhIHJlc3BvbnNlLCBldmVuIGlmIGVtcHR5IG9yIGluY29tcGxldGUuCiAKLSAgICBpZiBzZWxmLnptcV90eXBlID09IHptcS5SRVA6Ci0gICAgICBtc2cgPSBvdHJhbnMuZ2V0dmFsdWUoKQotICAgICAgc2VsZi5zb2NrZXQuc2VuZChtc2cpCisgICAgICAgIGlmIHNlbGYuem1xX3R5cGUgPT0gem1xLlJFUDoKKyAgICAgICAgICAgIG1zZyA9IG90cmFucy5nZXR2YWx1ZSgpCisgICAgICAgICAgICBzZWxmLnNvY2tldC5zZW5kKG1zZykKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHNlbGYuc2VydmVPbmUoKQorICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuc2VydmVPbmUoKQogCiAKIGNsYXNzIFRabXFNdWx0aVNlcnZlcihvYmplY3QpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi5zZXJ2ZXJzID0gW10KKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVycyA9IFtdCiAKLSAgZGVmIHNlcnZlT25lKHNlbGYsIHRpbWVvdXQgPSAtMSk6Ci0gICAgc2VsZi5fc2VydmVBY3RpdmUoc2VsZi5fc2V0dXBQb2xsKCksIHRpbWVvdXQpCisgICAgZGVmIHNlcnZlT25lKHNlbGYsIHRpbWVvdXQ9LTEpOgorICAgICAgICBzZWxmLl9zZXJ2ZUFjdGl2ZShzZWxmLl9zZXR1cFBvbGwoKSwgdGltZW91dCkKIAotICBkZWYgc2VydmVGb3JldmVyKHNlbGYpOgotICAgIHBvbGxfaW5mbyA9IHNlbGYuX3NldHVwUG9sbCgpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHNlbGYuX3NlcnZlQWN0aXZlKHBvbGxfaW5mbywgLTEpCisgICAgZGVmIHNlcnZlRm9yZXZlcihzZWxmKToKKyAgICAgICAgcG9sbF9pbmZvID0gc2VsZi5fc2V0dXBQb2xsKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuX3NlcnZlQWN0aXZlKHBvbGxfaW5mbywgLTEpCiAKLSAgZGVmIF9zZXR1cFBvbGwoc2VsZik6Ci0gICAgc2VydmVyX21hcCA9IHt9Ci0gICAgcG9sbGVyID0gem1xLlBvbGxlcigpCi0gICAgZm9yIHNlcnZlciBpbiBzZWxmLnNlcnZlcnM6Ci0gICAgICBzZXJ2ZXJfbWFwW3NlcnZlci5zb2NrZXRdID0gc2VydmVyCi0gICAgICBwb2xsZXIucmVnaXN0ZXIoc2VydmVyLnNvY2tldCwgem1xLlBPTExJTikKLSAgICByZXR1cm4gKHNlcnZlcl9tYXAsIHBvbGxlcikKKyAgICBkZWYgX3NldHVwUG9sbChzZWxmKToKKyAgICAgICAgc2VydmVyX21hcCA9IHt9CisgICAgICAgIHBvbGxlciA9IHptcS5Qb2xsZXIoKQorICAgICAgICBmb3Igc2VydmVyIGluIHNlbGYuc2VydmVyczoKKyAgICAgICAgICAgIHNlcnZlcl9tYXBbc2VydmVyLnNvY2tldF0gPSBzZXJ2ZXIKKyAgICAgICAgICAgIHBvbGxlci5yZWdpc3RlcihzZXJ2ZXIuc29ja2V0LCB6bXEuUE9MTElOKQorICAgICAgICByZXR1cm4gKHNlcnZlcl9tYXAsIHBvbGxlcikKIAotICBkZWYgX3NlcnZlQWN0aXZlKHNlbGYsIHBvbGxfaW5mbywgdGltZW91dCk6Ci0gICAgKHNlcnZlcl9tYXAsIHBvbGxlcikgPSBwb2xsX2luZm8KLSAgICByZWFkeSA9IGRpY3QocG9sbGVyLnBvbGwoKSkKLSAgICBmb3Igc29jaywgc3RhdGUgaW4gcmVhZHkuaXRlbXMoKToKLSAgICAgIGFzc2VydCAoc3RhdGUgJiB6bXEuUE9MTElOKSAhPSAwCi0gICAgICBzZXJ2ZXJfbWFwW3NvY2tdLnNlcnZlT25lKCkKKyAgICBkZWYgX3NlcnZlQWN0aXZlKHNlbGYsIHBvbGxfaW5mbywgdGltZW91dCk6CisgICAgICAgIChzZXJ2ZXJfbWFwLCBwb2xsZXIpID0gcG9sbF9pbmZvCisgICAgICAgIHJlYWR5ID0gZGljdChwb2xsZXIucG9sbCgpKQorICAgICAgICBmb3Igc29jaywgc3RhdGUgaW4gcmVhZHkuaXRlbXMoKToKKyAgICAgICAgICAgIGFzc2VydCAoc3RhdGUgJiB6bXEuUE9MTElOKSAhPSAwCisgICAgICAgICAgICBzZXJ2ZXJfbWFwW3NvY2tdLnNlcnZlT25lKCkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuY3Nwcm9qIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RocmlmdFpNUS5jc3Byb2oKaW5kZXggOTU4ZmM1NS4uODBhZDFkYiAxMDA3NTUKLS0tIGEvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RocmlmdFpNUS5jc3Byb2oKKysrIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RocmlmdFpNUS5jc3Byb2oKQEAgLTI1LDcgKzI1LDcgQEAKICAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgogICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KICAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgotICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MC45LjMuJTJhPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CiAgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KICAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KICAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQuY3BwIGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQuY3BwCmluZGV4IGQyZmM1NmMuLjE1OWMyNTAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LmNwcAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5jcHAKQEAgLTYsNyArNiw3IEBACiAjaW5jbHVkZSAiVFptcUNsaWVudC5oIgogI2luY2x1ZGUgIlN0b3JhZ2UuaCIKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFptcUNsaWVudDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwogCkBAIC0xNyw3ICsxNyw3IEBACiAgIGlmIChhcmdjID4gMSkgewogICAgIGluY3IgPSBhdG9pKGFyZ3ZbMV0pOwogICAgIGlmIChpbmNyKSB7Ci0gICAgICBzb2NrdHlwZSA9IFpNUV9ET1dOU1RSRUFNOworICAgICAgc29ja3R5cGUgPSBaTVFfUFVTSDsKICAgICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkxIjsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LnB5IGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkKaW5kZXggMTg4NmQ5Yy4uZDUxMjE2ZSAxMDA3NTUKLS0tIGEvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkKQEAgLTksMjggKzksMjggQEAKIAogCiBkZWYgbWFpbihhcmdzKToKLSAgZW5kcG9pbnQgPSAidGNwOi8vMTI3LjAuMC4xOjkwOTAiCi0gIHNvY2t0eXBlID0gem1xLlJFUQotICBpbmNyID0gMAotICBpZiBsZW4oYXJncykgPiAxOgotICAgIGluY3IgPSBpbnQoYXJnc1sxXSkKKyAgICBlbmRwb2ludCA9ICJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MCIKKyAgICBzb2NrdHlwZSA9IHptcS5SRVEKKyAgICBpbmNyID0gMAorICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgIGluY3IgPSBpbnQoYXJnc1sxXSkKKyAgICAgICAgaWYgaW5jcjoKKyAgICAgICAgICAgIHNvY2t0eXBlID0gem1xLlBVU0gKKyAgICAgICAgICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkxIgorCisgICAgY3R4ID0gem1xLkNvbnRleHQoKQorICAgIHRyYW5zcG9ydCA9IFRabXFDbGllbnQuVFptcUNsaWVudChjdHgsIGVuZHBvaW50LCBzb2NrdHlwZSkKKyAgICBwcm90b2NvbCA9IHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNwb3J0KQorICAgIGNsaWVudCA9IHN0b3JhZ2UuU3RvcmFnZS5DbGllbnQocHJvdG9jb2wpCisgICAgdHJhbnNwb3J0Lm9wZW4oKQorCiAgICAgaWYgaW5jcjoKLSAgICAgIHNvY2t0eXBlID0gem1xLkRPV05TVFJFQU0KLSAgICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkxIgotCi0gIGN0eCA9IHptcS5Db250ZXh0KCkKLSAgdHJhbnNwb3J0ID0gVFptcUNsaWVudC5UWm1xQ2xpZW50KGN0eCwgZW5kcG9pbnQsIHNvY2t0eXBlKQotICBwcm90b2NvbCA9IHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNwb3J0KQotICBjbGllbnQgPSBzdG9yYWdlLlN0b3JhZ2UuQ2xpZW50KHByb3RvY29sKQotICB0cmFuc3BvcnQub3BlbigpCi0KLSAgaWYgaW5jcjoKLSAgICBjbGllbnQuaW5jcihpbmNyKQotICAgIHRpbWUuc2xlZXAoMC4wNSkKLSAgZWxzZToKLSAgICB2YWx1ZSA9IGNsaWVudC5nZXQoKQotICAgIHByaW50IHZhbHVlCisgICAgICAgIGNsaWVudC5pbmNyKGluY3IpCisgICAgICAgIHRpbWUuc2xlZXAoMC4wNSkKKyAgICBlbHNlOgorICAgICAgICB2YWx1ZSA9IGNsaWVudC5nZXQoKQorICAgICAgICBwcmludCh2YWx1ZSkKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICBtYWluKHN5cy5hcmd2KQorICAgIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXJlY2VpdmVyLmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwCmluZGV4IDhmZTY5ZGEuLmQ0NjViZmYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwCisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgIlRabXFTZXJ2ZXIuaCIKICNpbmNsdWRlICJTdG9yYWdlLmgiCiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcVNlcnZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRabXFNdWx0aVNlcnZlcjsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcAppbmRleCA2YjBlZWYxLi41YzA4NmExIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS90ZXN0LXNlbmRlci5jcHAKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZW5kZXIuY3BwCkBAIC02LDcgKzYsNyBAQAogI2luY2x1ZGUgIlRabXFDbGllbnQuaCIKICNpbmNsdWRlICJTdG9yYWdlLmgiCiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRabXFDbGllbnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKIApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwCmluZGV4IGM2MjRiMGQuLmU2ZjFiMjAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLmNwcAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5jcHAKQEAgLTIsNyArMiw3IEBACiAjaW5jbHVkZSAiVFptcVNlcnZlci5oIgogI2luY2x1ZGUgIlN0b3JhZ2UuaCIKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUWm1xU2VydmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcU11bHRpU2VydmVyOwpAQCAtMzMsNyArMzMsNyBAQAogCiAgIHptcTo6Y29udGV4dF90IGN0eCgxKTsKICAgVFptcVNlcnZlciByZXFyZXBfc2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkwIiwgWk1RX1JFUCk7Ci0gIFRabXFTZXJ2ZXIgb25ld2F5X3NlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIFpNUV9VUFNUUkVBTSk7CisgIFRabXFTZXJ2ZXIgb25ld2F5X3NlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIFpNUV9QVUxMKTsKICAgVFptcU11bHRpU2VydmVyIG11bHRpc2VydmVyOwogICBtdWx0aXNlcnZlci5zZXJ2ZXJzKCkucHVzaF9iYWNrKCZyZXFyZXBfc2VydmVyKTsKICAgbXVsdGlzZXJ2ZXIuc2VydmVycygpLnB1c2hfYmFjaygmb25ld2F5X3NlcnZlcik7CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5weSBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5CmluZGV4IDU3NjdiNzEuLmQ4OWIzN2IgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5CisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5CkBAIC02LDI4ICs2LDI4IEBACiAKIAogY2xhc3MgU3RvcmFnZUhhbmRsZXIoc3RvcmFnZS5TdG9yYWdlLklmYWNlKToKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYudmFsdWUgPSAwCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbHVlID0gMAogCi0gIGRlZiBpbmNyKHNlbGYsIGFtb3VudCk6Ci0gICAgc2VsZi52YWx1ZSArPSBhbW91bnQKKyAgICBkZWYgaW5jcihzZWxmLCBhbW91bnQpOgorICAgICAgICBzZWxmLnZhbHVlICs9IGFtb3VudAogCi0gIGRlZiBnZXQoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYudmFsdWUKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQogCiAKIGRlZiBtYWluKCk6Ci0gIGhhbmRsZXIgPSBTdG9yYWdlSGFuZGxlcigpCi0gIHByb2Nlc3NvciA9IHN0b3JhZ2UuU3RvcmFnZS5Qcm9jZXNzb3IoaGFuZGxlcikKKyAgICBoYW5kbGVyID0gU3RvcmFnZUhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IHN0b3JhZ2UuU3RvcmFnZS5Qcm9jZXNzb3IoaGFuZGxlcikKIAotICBjdHggPSB6bXEuQ29udGV4dCgpCi0gIHJlcXJlcF9zZXJ2ZXIgPSBUWm1xU2VydmVyLlRabXFTZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTAiLCB6bXEuUkVQKQotICBvbmV3YXlfc2VydmVyID0gVFptcVNlcnZlci5UWm1xU2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkxIiwgem1xLlVQU1RSRUFNKQotICBtdWx0aXNlcnZlciA9IFRabXFTZXJ2ZXIuVFptcU11bHRpU2VydmVyKCkKLSAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQocmVxcmVwX3NlcnZlcikKLSAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQob25ld2F5X3NlcnZlcikKLSAgbXVsdGlzZXJ2ZXIuc2VydmVGb3JldmVyKCkKKyAgICBjdHggPSB6bXEuQ29udGV4dCgpCisgICAgcmVxcmVwX3NlcnZlciA9IFRabXFTZXJ2ZXIuVFptcVNlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MCIsIHptcS5SRVApCisgICAgb25ld2F5X3NlcnZlciA9IFRabXFTZXJ2ZXIuVFptcVNlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIHptcS5QVUxMKQorICAgIG11bHRpc2VydmVyID0gVFptcVNlcnZlci5UWm1xTXVsdGlTZXJ2ZXIoKQorICAgIG11bHRpc2VydmVyLnNlcnZlcnMuYXBwZW5kKHJlcXJlcF9zZXJ2ZXIpCisgICAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQob25ld2F5X3NlcnZlcikKKyAgICBtdWx0aXNlcnZlci5zZXJ2ZUZvcmV2ZXIoKQogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIG1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvZGViaWFuL1JFQURNRS5tZCBiL2RlYmlhbi9SRUFETUUubWQKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5OGQ0ZGEwLi44ZWJmZWVhCi0tLSBhL2RlYmlhbi9SRUFETUUubWQKKysrIGIvZGViaWFuL1JFQURNRS5tZApAQCAtMSwxOSArMSw0MSBAQAotc29tZSB0aXBzIG9uIERlYmlhbiBQYWNrYWdpbmcKKyMjIFNvbWUgdGlwcyBvbiBEZWJpYW4gUGFja2FnaW5nCisKIC0gRGViaWFuIE5ldyBNYWludGFpbmVycycgR3VpZGUgW2h0dHA6Ly93d3cuZGViaWFuLm9yZy9kb2MvZGViaWFuLXBvbGljeS9dCiAtIERlYmlhbiBQb2xpY3kgTWFudWFsIFtodHRwOi8vd3d3LmRlYmlhbi5vcmcvZG9jL21hbnVhbHMvbWFpbnQtZ3VpZGUvXQogLSBNYWNoaW5lLXJlYWRhYmxlIGRlYmlhbi9jb3B5cmlnaHQgZmlsZSBbaHR0cDovL2RlcC5kZWJpYW4ubmV0L2RlcHMvZGVwNS9dCistIERlYlNyYyAzLjAgZ3VpZGVsaW5lcyBbaHR0cHM6Ly93aWtpLmRlYmlhbi5vcmcvUHJvamVjdHMvRGViU3JjMy4wXQogCi1idWlsZAorCisjIyBCdWlsZCB1c2luZyBkcGtnLWJ1aWxkcGFja2FnZToKKworYGBgYmFzaAogJCBkcGtnLWJ1aWxkcGFja2FnZSAtZCAtdGMKLSAgLWQgICAgICAgICAgICAgZG8gbm90IGNoZWNrIGJ1aWxkIGRlcGVuZGVuY2llcyBhbmQgY29uZmxpY3RzLgotICAtdGMgICAgICAgICAgICBjbGVhbiBzb3VyY2UgdHJlZSB3aGVuIGZpbmlzaGVkLgorICAtZCAgICMgZG8gbm90IGNoZWNrIGJ1aWxkIGRlcGVuZGVuY2llcyBhbmQgY29uZmxpY3RzLgorICAtdGMgICMgY2xlYW4gc291cmNlIHRyZWUgd2hlbiBmaW5pc2hlZC4KK2BgYAogCi11cGRhdGUgY2hhbmdlbG9nCisKKyMjIFVwZGF0ZSBjaGFuZ2Vsb2c6CisKK2BgYGJhc2gKICQgZGF0ZSAtUgorYGBgCiAKLWNoZWNrIHBhY2thZ2VzCitPbmUgY2FuIGFsc28gaW5zdGFsbCBgZGV2c2NyaXB0c2AgcGFja2FnZSBhbmQgcnVuOgorCitgYGBiYXNoCiskIGRjaCAtaQorYGBgCisKKworIyMgQ2hlY2sgcGFja2FnZXM6CisKK2BgYGJhc2gKICQgZHBrZyAtYyAqLmRlYgogJCBsaW50aWFuICouZGViCitgYGAKIAotdG9kbwotbWFrZSBpdCBwZXJmZWN0IQorCisjIyBUT0RPCisKK01ha2UgaXQgcGVyZmVjdCEKZGlmZiAtLWdpdCBhL2RlYmlhbi9jaGFuZ2Vsb2cgYi9kZWJpYW4vY2hhbmdlbG9nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNDYzOGExZi4uNjliNWYyMAotLS0gYS9kZWJpYW4vY2hhbmdlbG9nCisrKyBiL2RlYmlhbi9jaGFuZ2Vsb2cKQEAgLTEsMTYgKzEsMjYgQEAKK3RocmlmdCAoMC4xMi4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC4xMi4wCisKKyAtLSBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4gIFdlZCwgMjggRGVjIDIwMTggMTI6MDA6MDAgLTA1MDAKKwordGhyaWZ0ICgwLjExLjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjExLjAKKworIC0tIEpha2UgRmFycmVsbCA8amZhcnJlbGxAYXBhY2hlLm9yZz4gIFdlZCwgMDcgRGVjIDIwMTcgMjA6MDc6MDAgLTA1MDAKKwordGhyaWZ0ICgwLjEwLjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjEwLjAKKworIC0tIEpha2UgRmFycmVsbCA8amZhcnJlbGxAYXBhY2hlLm9yZz4gIFdlZCwgMDMgSmFuIDIwMTcgMTY6NTI6MDAgLTA1MDAKKwogdGhyaWZ0ICgwLjkuMykgc3RhYmxlOyB1cmdlbmN5PWxvdworCiAgICogdXBkYXRlIHRvIDAuOS4zCiAKLSAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBGcmksIDI1IFNlcCAyMDE1IDEyOjAwOjAwIC0wNTAwCi0KLXRocmlmdCAoMC45LjIpIHN0YWJsZTsgdXJnZW5jeT1sb3cKLQotICAqIHVwZGF0ZSB0byAwLjkuMgotCi0gLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgVGh1LCAzMCBPY3QgMjAxNCAxMjowMDowMCAtMDUwMAotCi10aHJpZnQgKDAuOS4xKSBzdGFibGU7IHVyZ2VuY3k9bG93Ci0gICogdXBkYXRlIHRvIDAuOS4xCisgLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgV2VkLCAxMSBPY3QgMjAxNSAxNzoyMjowMCAtMDUwMAogCiB0aHJpZnQgKDAuOS4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CiAKZGlmZiAtLWdpdCBhL2RlYmlhbi9jb21wYXQgYi9kZWJpYW4vY29tcGF0CmluZGV4IDdlZDZmZjguLmVjNjM1MTQgMTAwNjQ0Ci0tLSBhL2RlYmlhbi9jb21wYXQKKysrIGIvZGViaWFuL2NvbXBhdApAQCAtMSArMSBAQAotNQorOQpkaWZmIC0tZ2l0IGEvZGViaWFuL2NvbnRyb2wgYi9kZWJpYW4vY29udHJvbAppbmRleCAzOWQ1N2Y5Li45ZGU2NmZjIDEwMDY0NAotLS0gYS9kZWJpYW4vY29udHJvbAorKysgYi9kZWJpYW4vY29udHJvbApAQCAtMSwxOCArMSwyMSBAQAogU291cmNlOiB0aHJpZnQKIFNlY3Rpb246IGRldmVsCiBQcmlvcml0eTogZXh0cmEKLUJ1aWxkLURlcGVuZHM6IGRlYmhlbHBlciAoPj0gNSksIGJ1aWxkLWVzc2VudGlhbCwgbW9uby1nbWNzLCBweXRob24tZGV2LCBhbnQsCi0gICAgbW9uby1kZXZlbCwgIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwsIGVybGFuZy1iYXNlLCBydWJ5MS44LWRldiwgYXV0b2NvbmYsIGF1dG9tYWtlLAotICAgIHBrZy1jb25maWcsIGxpYnRvb2wsIGJpc29uLCBmbGV4LCBsaWJib29zdC1kZXYgfCBsaWJib29zdDEuNDAtZGV2LCBweXRob24tYWxsLAotICAgIHB5dGhvbi1hbGwtZGV2LCBweXRob24tYWxsLWRiZywgb3Blbmpkay02LWpkayB8IGphdmEtc2RrLAotICAgIGxpYmJvb3N0LXRlc3QtZGV2IHwgbGliYm9vc3QtdGVzdDEuNDAtZGV2LCBsaWJldmVudC1kZXYsIHBlcmwgKD49IDUuOC4wLTcpLAotICAgIHBocDUsIHBocDUtZGV2LCBsaWJnbGliMi4wLWRldiwgbGlicXQ0LWRldgorQnVpbGQtRGVwZW5kczogZGViaGVscGVyICg+PSA5KSwgYnVpbGQtZXNzZW50aWFsLCBtb25vLW1jcywgcHl0aG9uLWRldiwgYW50LAorICAgIG1vbm8tZGV2ZWwsICBsaWJtb25vLXN5c3RlbS13ZWI0LjAtY2lsLCBlcmxhbmctYmFzZSwgcnVieS1kZXYgfCBydWJ5MS45LjEtZGV2LCBydWJ5LWJ1bmRsZXIgLGF1dG9jb25mLCBhdXRvbWFrZSwKKyAgICBwa2ctY29uZmlnLCBsaWJ0b29sLCBiaXNvbiwgZmxleCwgbGliYm9vc3QtZGV2IHwgbGliYm9vc3QxLjUzLWRldiB8IGxpYmJvb3N0MS42My1hbGwtZGV2LAorICAgIHB5dGhvbi1hbGwsIHB5dGhvbi1zZXR1cHRvb2xzLCBweXRob24tYWxsLWRldiwgcHl0aG9uLWFsbC1kYmcsCisgICAgcHl0aG9uMy1hbGwsIHB5dGhvbjMtc2V0dXB0b29scywgcHl0aG9uMy1hbGwtZGV2LCBweXRob24zLWFsbC1kYmcsCisgICAgb3Blbmpkay04LWpkayB8IG9wZW5qZGstOC1qZGstaGVhZGxlc3MgfCBvcGVuamRrLTExLWpkayB8IG9wZW5qZGstMTEtamRrLWhlYWRsZXNzIHwgZGVmYXVsdC1qZGssCisgICAgbGliYm9vc3QtdGVzdC1kZXYgfCBsaWJib29zdC10ZXN0MS41My1kZXYgfCBsaWJib29zdC10ZXN0MS42My1kZXYsIGxpYmV2ZW50LWRldiwgbGlic3NsLWRldiwgcGVybCAoPj0gNS44LjAtNyksCisgICAgcGhwICg+PSA1KSwgcGhwLWRldiAoPj0gNSksIGxpYmdsaWIyLjAtZGV2LCBxdGNob29zZXIsIHF0YmFzZTUtZGV2LXRvb2xzCiBNYWludGFpbmVyOiBUaHJpZnQgRGV2ZWxvcGVyJ3MgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KIEhvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvCi1WY3MtR2l0OiBodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdAotVmNzLUJyb3dzZXI6IGh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQKLVN0YW5kYXJkcy1WZXJzaW9uOiAzLjcuMgorVmNzLUdpdDogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0CitWY3MtQnJvd3NlcjogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQKK1N0YW5kYXJkcy1WZXJzaW9uOiAzLjkuNwogWC1QeXRob24tVmVyc2lvbjogPj0gMi42CitYLVB5dGhvbjMtVmVyc2lvbjogPj0gMy4zCiAKIFBhY2thZ2U6IHRocmlmdC1jb21waWxlcgogQXJjaGl0ZWN0dXJlOiBhbnkKQEAgLTI5LDEwICszMiwxMCBAQAogUGFja2FnZTogcHl0aG9uLXRocmlmdAogQXJjaGl0ZWN0dXJlOiBhbnkKIFNlY3Rpb246IHB5dGhvbgotRGVwZW5kczogJHtweXRob246RGVwZW5kc30sICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30KLVJlY29tbWVuZHM6IHB5dGhvbi10d2lzdGVkLWNvcmUKK0RlcGVuZHM6ICR7cHl0aG9uOkRlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBweXRob24tc2l4CitSZWNvbW1lbmRzOiBweXRob24tdHdpc3RlZC13ZWIsIHB5dGhvbi1iYWNrcG9ydHMuc3NsLW1hdGNoLWhvc3RuYW1lLCBweXRob24taXBhZGRyZXNzCiBQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9Ci1EZXNjcmlwdGlvbjogUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQKK0Rlc2NyaXB0aW9uOiBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdCAoUHl0aG9uIDIpCiAgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwogIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCiAgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgpAQCAtNDEsMTAgKzQ0LDEyIEBACiAgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBQeXRob24KICBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCiAgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorIC4KKyBUaGlzIHBhY2thZ2UgaW5zdGFsbHMgdGhlIGxpYnJhcnkgZm9yIFB5dGhvbiAyLgogCiBQYWNrYWdlOiBweXRob24tdGhyaWZ0LWRiZwogQXJjaGl0ZWN0dXJlOiBhbnkKLVNlY3Rpb246IHB5dGhvbgorU2VjdGlvbjogZGVidWcKIERlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIHB5dGhvbi10aHJpZnQgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCBweXRob24tYWxsLWRiZwogUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQogRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChkZWJ1ZyB2ZXJzaW9uKQpAQCAtNTcsNiArNjIsMzkgQEAKICBkZWZpbml0aW9uIHRvIFB5dGhvbiBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdwogIHlvdSB0byB1c2UgdGhvc2UgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgogCitQYWNrYWdlOiBweXRob24zLXRocmlmdAorQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IHB5dGhvbgorRGVwZW5kczogJHtweXRob24zOkRlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBweXRob24zLXNpeAorUmVjb21tZW5kczogcHl0aG9uMy10d2lzdGVkLXdlYgorUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQorRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChQeXRob24gMykKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAorIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUHl0aG9uCisgY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQorIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKyAuCisgVGhpcyBwYWNrYWdlIGluc3RhbGxzIHRoZSBsaWJyYXJ5IGZvciBQeXRob24gMy4KKworUGFja2FnZTogcHl0aG9uMy10aHJpZnQtZGJnCitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogZGVidWcKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIHB5dGhvbjMtdGhyaWZ0ICg9ICR7YmluYXJ5OlZlcnNpb259KSwgcHl0aG9uMy1hbGwtZGJnCitQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9CitEZXNjcmlwdGlvbjogUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgKGRlYnVnIHZlcnNpb24pCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IHdpdGggZGVidWdnaW5nIHN5bWJvbHMuCisgWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0IHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyCisgZGVmaW5pdGlvbiB0byBQeXRob24gY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cKKyB5b3UgdG8gdXNlIHRob3NlIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKwogUGFja2FnZTogcnVieS10aHJpZnQKIEFyY2hpdGVjdHVyZTogYWxsCiBTZWN0aW9uOiBsaWJzCkBAIC03Niw4ICsxMTQsOCBAQAogCiBQYWNrYWdlOiBsaWJ0aHJpZnQtamF2YQogQXJjaGl0ZWN0dXJlOiBhbGwKLVNlY3Rpb246IGxpYnMKLURlcGVuZHM6IGphdmEtZ2NqLWNvbXBhdCB8IGphdmExLXJ1bnRpbWUgfCBqYXZhMi1ydW50aW1lLCAke21pc2M6RGVwZW5kc30KK1NlY3Rpb246IGphdmEKK0RlcGVuZHM6ICR7bWlzYzpEZXBlbmRzfQogRGVzY3JpcHRpb246IEphdmEgYmluZGluZ3MgZm9yIFRocmlmdAogIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKICBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bwpAQCAtOTAsOSArMTI4LDkgQEAKIAogUGFja2FnZTogbGlidGhyaWZ0LWNpbAogQXJjaGl0ZWN0dXJlOiBhbGwKLVNlY3Rpb246IGxpYnMKLURlcGVuZHM6IGNsaS1jb21tb24sIGxpYm1vbm8tY29ybGliMS4wLWNpbCAoPj0gMS4wKSwgbGlibW9uby1zeXN0ZW0xLjAtY2lsICg+PSAxLjApLCAKLSAgICBsaWJtb25vLXN5c3RlbS13ZWIyLjAtY2lsLCAke21pc2M6RGVwZW5kc30KK1NlY3Rpb246IGNsaS1tb25vCitEZXBlbmRzOiBjbGktY29tbW9uLCBsaWJtb25vLWNvcmxpYjQuMC1jaWwgKD49IDIuMTApIHwgbGlibW9uby1jb3JsaWI0LjUtY2lsICg+PTMuMiksIGxpYm1vbm8tc3lzdGVtNC4wLWNpbCAoPj0gMi4xMCksCisgICAgbGlibW9uby1zeXN0ZW0td2ViNC4wLWNpbCAoPj0gMi4xMCksICR7bWlzYzpEZXBlbmRzfQogRGVzY3JpcHRpb246IENMSSBiaW5kaW5ncyBmb3IgVGhyaWZ0CiAgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwogIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCkBAIC0xMjgsMTAgKzE2NiwyMSBAQAogIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgcnVudGltZSBsaWJyYXJpZXMgbmVlZGVkIGZvciBDKysgYXBwbGljYXRpb25zCiAgdXNpbmcgVGhyaWZ0LgogCitQYWNrYWdlOiBsaWJ0aHJpZnQwLWRiZworQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IGRlYnVnCitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBsaWJ0aHJpZnQwICg9ICR7YmluYXJ5OlZlcnNpb259KQorRGVzY3JpcHRpb246IFRocmlmdCBDKysgbGlicmFyeSBkZWJ1ZyBzeW1ib2xzCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIGRlYnVnIHN5bWJvbHMgZm9yIHRoZSBUaHJpZnQgQysrIHJ1bnRpbWUgbGlicmFyaWVzLgorCiBQYWNrYWdlOiBsaWJ0aHJpZnQtZGV2CiBBcmNoaXRlY3R1cmU6IGFueQogU2VjdGlvbjogbGliZGV2ZWwKLURlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIGxpYnRocmlmdDAsIGxpYmdsaWIyLjAtZGV2CitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBsaWJ0aHJpZnQwICg9ICR7YmluYXJ5OlZlcnNpb259KSwgbGliZ2xpYjIuMC1kZXYKIERlc2NyaXB0aW9uOiBUaHJpZnQgQysrIGxpYnJhcnkgKGRldmVsb3BtZW50IGhlYWRlcnMpCiAgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwogIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCmRpZmYgLS1naXQgYS9kZWJpYW4vY29weXJpZ2h0IGIvZGViaWFuL2NvcHlyaWdodAppbmRleCAyNTU0NmI0Li4zZTZmY2Y3IDEwMDY0NAotLS0gYS9kZWJpYW4vY29weXJpZ2h0CisrKyBiL2RlYmlhbi9jb3B5cmlnaHQKQEAgLTQsNyArNCw3IEBACiBUaGlzIHBhY2thZ2UgYW5kIHRoZSBEZWJpYW4gcGFja2FnaW5nIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwKIHNlZSBgL3Vzci9zaGFyZS9jb21tb24tbGljZW5zZXMvQXBhY2hlLTIuMCcuCiAKLVRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb25zIHdhcyBjb3BpZWQgZnJvbSBBcGFjaGUgVGhyaWZ0IExJQ0VOU0UgZmlsZS4KK1RoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gd2FzIGNvcGllZCBmcm9tIEFwYWNoZSBUaHJpZnQgTElDRU5TRSBmaWxlLgogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU09GVFdBUkUgRElTVFJJQlVURUQgV0lUSCBUSFJJRlQ6CkBAIC0yOCw3ICsyOCw2IEBACiB1bmRlciB0aGUgQXBhY2hlIDIuMCBMaWNlbnNlOgogCiAgIGNvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCiAgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCiAgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCiAgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCmRpZmYgLS1naXQgYS9kZWJpYW4vbGlidGhyaWZ0MC5pbnN0YWxsIGIvZGViaWFuL2xpYnRocmlmdDAuaW5zdGFsbApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9kZWJpYW4vcnVsZXMgYi9kZWJpYW4vcnVsZXMKaW5kZXggZDg0NjJkMS4uZTIwOWJhMyAxMDA3NTUKLS0tIGEvZGViaWFuL3J1bGVzCisrKyBiL2RlYmlhbi9ydWxlcwpAQCAtMTgsMTIgKzE4LDE4IEBACiAKIFBZVkVSUyA6PSAkKHNoZWxsIHB5dmVyc2lvbnMgLXIpCiAKK2V4cG9ydCBDUFBGTEFHUzo9JChzaGVsbCBkcGtnLWJ1aWxkZmxhZ3MgLS1nZXQgQ1BQRkxBR1MpCitleHBvcnQgQ0ZMQUdTOj0kKHNoZWxsIGRwa2ctYnVpbGRmbGFncyAtLWdldCBDRkxBR1MpCitleHBvcnQgQ1hYRkxBR1M6PSQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IENYWEZMQUdTKQorZXhwb3J0IExERkxBR1M6PSQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IExERkxBR1MpCisKIGNvbmZpZ3VyZTogY29uZmlndXJlLXN0YW1wCiBjb25maWd1cmUtc3RhbXA6CiAJZGhfdGVzdGRpcgorCiAJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjb25maWd1cmUgdGhlIHBhY2thZ2UuCiAJaWYgWyAtZiBib290c3RyYXAuc2ggXTsgdGhlbiAkKENVUkRJUikvYm9vdHN0cmFwLnNoOyBmaQotCSQoQ1VSRElSKS9jb25maWd1cmUgLS1wcmVmaXg9L3VzciAtLXdpdGgtY19nbGliIC0td2l0aG91dC1lcmxhbmcKKwkkKENVUkRJUikvY29uZmlndXJlIC0tcHJlZml4PS91c3IgLS1lbmFibGUtcGx1Z2luPW5vCiAKIAl0b3VjaCBjb25maWd1cmUtc3RhbXAKIApAQCAtMzQsNyArNDAsNyBAQAogCSMgJChNQUtFKSAtQyB0ZXN0IGNoZWNrCiAKIGJ1aWxkLWFyY2g6IGJ1aWxkLWFyY2gtc3RhbXAKLWJ1aWxkLWFyY2gtc3RhbXA6IGNvbmZpZ3VyZS1zdGFtcAorJChDVVJESVIpL2NvbXBpbGVyL2NwcC90aHJpZnQgYnVpbGQtYXJjaC1zdGFtcDogY29uZmlndXJlLXN0YW1wCiAKIAkjIENvbXBpbGUgY29tcGlsZXIKIAkkKE1BS0UpIC1DICQoQ1VSRElSKS9jb21waWxlci9jcHAKQEAgLTU1LDE5ICs2MSwxOSBAQAogCSMgUEhQCiAJY2QgJChDVVJESVIpL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wgJiYgXAogCQlwaHBpemUgJiYgXAotCQkuL2NvbmZpZ3VyZSAmJiBtYWtlCisJCS4vY29uZmlndXJlICYmICQoTUFLRSkKIAogCXRvdWNoICRACiAKIGJ1aWxkLWluZGVwOiBidWlsZC1pbmRlcC1zdGFtcAotYnVpbGQtaW5kZXAtc3RhbXA6IGNvbmZpZ3VyZS1zdGFtcAorYnVpbGQtaW5kZXAtc3RhbXA6IGNvbmZpZ3VyZS1zdGFtcCAkKENVUkRJUikvY29tcGlsZXIvY3BwL3RocmlmdAogCiAJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjb21waWxlIHRoZSBpbmRlcCBwYXJ0IG9mIHRoZSBwYWNrYWdlLgogCSMkKE1BS0UpIGRvYwogCiAJIyBKYXZhCiAJY2QgJChDVVJESVIpL2xpYi9qYXZhICYmIFwKLQkJYW50CisJCS4vZ3JhZGxldyAtLW5vLWRhZW1vbiAtUHJlbGVhc2U9dHJ1ZSBqYXIKIAogCSMgQyMKIAkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvY3NoYXJwCkBAIC04NSw2ICs5MSw4IEBACiAJZGhfdGVzdHJvb3QKIAlybSAtZiBidWlsZC1hcmNoLXN0YW1wIGJ1aWxkLWluZGVwLXN0YW1wIGNvbmZpZ3VyZS1zdGFtcAogCisJY2QgJChDVVJESVIpL2xpYi9weSAmJiBweXRob24gc2V0dXAucHkgY2xlYW4gLS1hbGwKKwogCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gY2xlYW4gdXAgYWZ0ZXIgdGhlIGJ1aWxkIHByb2Nlc3MuCiAJLSQoTUFLRSkgY2xlYW4KIApAQCAtOTQsMjQgKzEwMiwxOSBAQAogaW5zdGFsbC1pbmRlcDoKIAlkaF90ZXN0ZGlyCiAJZGhfdGVzdHJvb3QKLQlkaF9jbGVhbiAtayAtaQorCWRoX3ByZXAgLWkKIAlkaF9pbnN0YWxsZGlycyAtaQogCiAJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBpbnN0YWxsIHRoZSBpbmRlcCBwYXJ0IG9mIHRoZSBwYWNrYWdlIGludG8KIAkjIGRlYmlhbi88cGFja2FnZT4tZG9jLgogCSNJTlNUQUxMRE9DIwogCi0gICAgICAgICMgSmF2YQorCSMgSmF2YQogCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWphdmEvdXNyL3NoYXJlL2phdmEvICYmIFwKLQljcCAkKENVUkRJUikvbGliL2phdmEvYnVpbGQvbGlidGhyaWZ0Ki5qYXIgXAorCWNwICQoQ1VSRElSKS9saWIvamF2YS9idWlsZC9saWJzL2xpYnRocmlmdCouamFyIFwKIAkJJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtamF2YS91c3Ivc2hhcmUvamF2YS8KIAotICAgICAgICAjIFJ1YnkKLQlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL3J1YnktdGhyaWZ0L3Vzci9saWIvcnVieS8xLjggJiYgXAotCWNwICQoQ1VSRElSKS9saWIvcmIvbGliL3RocmlmdC5yYiBcCi0JCSQoQ1VSRElSKS9kZWJpYW4vcnVieS10aHJpZnQvdXNyL2xpYi9ydWJ5LzEuOAotCWNwIC1yICQoQ1VSRElSKS9saWIvcmIvbGliL3RocmlmdCBcCi0JCSQoQ1VSRElSKS9kZWJpYW4vcnVieS10aHJpZnQvdXNyL2xpYi9ydWJ5LzEuOAorCSMgUnVieQogCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vcnVieS10aHJpZnQvdXNyL2xpYi9ydWJ5LzEuOS4xICYmIFwKIAljcCAkKENVUkRJUikvbGliL3JiL2xpYi90aHJpZnQucmIgXAogCQkkKENVUkRJUikvZGViaWFuL3J1YnktdGhyaWZ0L3Vzci9saWIvcnVieS8xLjkuMQpAQCAtMTI0LDcgKzEyNywxMSBAQAogCQkkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1jaWwvdXNyL2xpYi9jbGkvdGhyaWZ0L1RocmlmdC5kbGwKIAogCSMgUGVybAotCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9wZXJsIGluc3RhbGwgREVTVERJUj0kKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3VzcgorCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9wZXJsIGluc3RhbGwgREVTVERJUj0kKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3Ivc2hhcmUKKwltdiAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9sb2NhbC9saWIvcGVybDUgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3Ivc2hhcmUKKwlybWRpciAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9sb2NhbC9saWIKKwlybWRpciAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9sb2NhbAogCiAJZGhfaW5zdGFsbCAtaQogCkBAIC0xNDYsMTYgKzE1MywyNyBAQAogCiAJIyBQeXRob24KIAljZCAkKENVUkRJUikvbGliL3B5ICYmIFwKLQlmb3IgcHkgaW4gJChQWVZFUlMpOyBkbyBcCi0JCSQkcHkgc2V0dXAucHkgaW5zdGFsbCAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdDsgXAotCQkkJHB5LWRiZyBzZXR1cC5weSBpbnN0YWxsIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZzsgXAotCWRvbmUKKwlweXRob24yIHNldHVwLnB5IGluc3RhbGwgLS1pbnN0YWxsLWxheW91dD1kZWIgLS1uby1jb21waWxlIC0tcm9vdD0kKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQgJiYgXAorCXB5dGhvbjItZGJnIHNldHVwLnB5IGluc3RhbGwgLS1pbnN0YWxsLWxheW91dD1kZWIgLS1uby1jb21waWxlIC0tcm9vdD0kKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnICYmIFwKKwlweXRob24zIHNldHVwLnB5IGluc3RhbGwgLS1pbnN0YWxsLWxheW91dD1kZWIgLS1uby1jb21waWxlIC0tcm9vdD0kKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0ICYmIFwKKwlweXRob24zLWRiZyBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcKIAotCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiKi5weWMiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0IC1uYW1lICIqLnB5W2NvXSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQgLW5hbWUgIl9fcHljYWNoZV9fIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWZyCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1uYW1lICJfX3B5Y2FjaGVfXyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mcgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiKi5weVtjb10iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgogCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiKi5weSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCiAJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1uYW1lICIqLmVnZy1pbmZvIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLXJmCiAJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1kZXB0aCAtdHlwZSBkIC1lbXB0eSAtZXhlYyBybWRpciB7fSBcOwogCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0IC1uYW1lICIqLnB5W2NvXSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0IC1uYW1lICJfX3B5Y2FjaGVfXyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mcgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcgLW5hbWUgIl9fcHljYWNoZV9fIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWZyCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZyAtbmFtZSAiKi5weVtjb10iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcgLW5hbWUgIioucHkiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcgLW5hbWUgIiouZWdnLWluZm8iIC1wcmludDAgfCB4YXJncyAtMCBybSAtcmYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1kZXB0aCAtdHlwZSBkIC1lbXB0eSAtZXhlYyBybWRpciB7fSBcOworCiAJIyBQSFAKIAlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL3BocDUtdGhyaWZ0CiAJY2QgJChDVVJESVIpL2xpYi9waHAgJiYgXApAQCAtMTY0LDkgKzE4Miw5IEBACiAJIyBDKysgYW5kIEMgKGdsaWIpCiAJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi90bXA7IFwKIAljZCAkKENVUkRJUikvbGliL2NwcCAmJiBcCi0JCW1ha2UgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3RtcCBpbnN0YWxsCisJCSQoTUFLRSkgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3RtcCBpbnN0YWxsCiAJY2QgJChDVVJESVIpL2xpYi9jX2dsaWIgJiYgXAotCQltYWtlIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90bXAgaW5zdGFsbAorCQkkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90bXAgaW5zdGFsbAogCiAJZGhfaW5zdGFsbCAtLXNvdXJjZWRpcj1kZWJpYW4vdG1wIC1zCiAKQEAgLTE4Miw4ICsyMDAsMTAgQEAKIAlkaF9pbnN0YWxsZXhhbXBsZXMKIAlkaF9pbnN0YWxsbWFuCiAJZGhfbGluawotCWRoX3N0cmlwIC1OcHl0aG9uLXRocmlmdC1kYmcgLU50aHJpZnQtY29tcGlsZXIgLU5saWJ0aHJpZnQwIC0tZGJnPXB5dGhvbi10aHJpZnQtZGJnCi0JZGhfc3RyaXAgLU5weXRob24tdGhyaWZ0LWRiZworCWRoX3N0cmlwIC1wbGlidGhyaWZ0MCAtLWRiZy1wYWNrYWdlPWxpYnRocmlmdDAtZGJnCisJZGhfc3RyaXAgLXBweXRob24tdGhyaWZ0IC0tZGJnLXBhY2thZ2U9cHl0aG9uLXRocmlmdC1kYmcKKwlkaF9zdHJpcCAtcHB5dGhvbjMtdGhyaWZ0IC0tZGJnLXBhY2thZ2U9cHl0aG9uMy10aHJpZnQtZGJnCisJZGhfc3RyaXAgLXB0aHJpZnQtY29tcGlsZXIKIAlkaF9jb21wcmVzcwogCWRoX2ZpeHBlcm1zCiAJZGhfbWFrZXNobGlicwpAQCAtMTk5LDcgKzIxOSw3IEBACiAKICMgQnVpbGQgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCBwYWNrYWdlcyB1c2luZyB0aGUgY29tbW9uIHRhcmdldC4KIGJpbmFyeS1hcmNoOiBidWlsZC1hcmNoIGluc3RhbGwtYXJjaAotCWVjaG8gInBocDpEZXBlbmRzPXBocGFwaS0kKHBocC1jb25maWc1IC0tcGhwYXBpKSIgPiBkZWJpYW4vc3Vic3R2YXJzCisJZWNobyAicGhwOkRlcGVuZHM9cGhwYXBpLSQoc2hlbGwgcGhwLWNvbmZpZzUgLS1waHBhcGkpIiA+ICQoQ1VSRElSKS9kZWJpYW4vc3Vic3R2YXJzCiAJJChNQUtFKSAtZiBkZWJpYW4vcnVsZXMgREhfT1BUSU9OUz0tcyBiaW5hcnktY29tbW9uCiAKIGJpbmFyeTogYmluYXJ5LWFyY2ggYmluYXJ5LWluZGVwCmRpZmYgLS1naXQgYS9kZWJpYW4vc3Vic3R2YXJzIGIvZGViaWFuL3N1YnN0dmFycwppbmRleCBiYWRmNTcyLi45ODQxZjJkIDEwMDY0NAotLS0gYS9kZWJpYW4vc3Vic3R2YXJzCisrKyBiL2RlYmlhbi9zdWJzdHZhcnMKQEAgLTEgKzEgQEAKLXBocDpEZXBlbmRzPXBocGFwaS0KK3BocDpEZXBlbmRzPXBocGFwaS0yMDEyMTIxMgpkaWZmIC0tZ2l0IGEvZG9hcC5yZGYgYi9kb2FwLnJkZgppbmRleCA1ZmY5OTQ1Li41MGIzNDkxIDEwMDc1NQotLS0gYS9kb2FwLnJkZgorKysgYi9kb2FwLnJkZgpAQCAtMjcsNyArMjcsNyBAQAogICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CiAgICAgPGhvbWVwYWdlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiAvPgogICAgIDxhc2ZleHQ6cG1jIHJkZjpyZXNvdXJjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiAvPgotICAgIDxzaG9ydGRlc2M+QXBhY2hlIFRocmlmdCBzb2Z0d2FyZSBwcm92aWRlcyBhIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQsIGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gQysrLCBKYXZhLCBQeXRob24sIFBIUCwgUnVieSwgRXJsYW5nLCBQZXJsLCBIYXNrZWxsLCBDIywgQ29jb2EsIEphdmFTY3JpcHQsIE5vZGUuanMsIFNtYWxsdGFsaywgT0NhbWwgYW5kIERlbHBoaSBhbmQgb3RoZXIgbGFuZ3VhZ2VzLiA8L3Nob3J0ZGVzYz4KKyAgICA8c2hvcnRkZXNjPkFwYWNoZSBUaHJpZnQgc29mdHdhcmUgcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseSBiZXR3ZWVuIEMrKywgSmF2YSwgUHl0aG9uLCBQSFAsIFJ1YnksIEVybGFuZywgUGVybCwgSGFza2VsbCwgQyMsIEphdmFTY3JpcHQsIE5vZGUuanMsIFNtYWxsdGFsaywgT0NhbWwgYW5kIERlbHBoaSBhbmQgb3RoZXIgbGFuZ3VhZ2VzLiA8L3Nob3J0ZGVzYz4KICAgICA8ZGVzY3JpcHRpb24+QXBhY2hlIFRocmlmdCBhbGxvd3MgeW91IHRvIGRlZmluZSBkYXRhIHR5cGVzIGFuZCBzZXJ2aWNlIGludGVyZmFjZXMgaW4gYSBzaW1wbGUgZGVmaW5pdGlvbiBmaWxlLiBUYWtpbmcgdGhhdCBmaWxlIGFzIGlucHV0LCB0aGUgY29tcGlsZXIgZ2VuZXJhdGVzIGNvZGUgdG8gYmUgdXNlZCB0byBlYXNpbHkgYnVpbGQgUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMgdGhhdCBjb21tdW5pY2F0ZSBzZWFtbGVzc2x5IGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIEluc3RlYWQgb2Ygd3JpdGluZyBhIGxvYWQgb2YgYm9pbGVycGxhdGUgY29kZSB0byBzZXJpYWxpemUgYW5kIHRyYW5zcG9ydCB5b3VyIG9iamVjdHMgYW5kIGludm9rZSByZW1vdGUgbWV0aG9kcywgeW91IGNhbiBnZXQgcmlnaHQgZG93biB0byBidXNpbmVzcy4gPC9kZXNjcmlwdGlvbj4KICAgICA8YnVnLWRhdGFiYXNlIHJkZjpyZXNvdXJjZT0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQiIC8+CiAgICAgPG1haWxpbmctbGlzdCByZGY6cmVzb3VyY2U9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9tYWlsaW5nLyIgLz4KQEAgLTM2LDEyICszNiwxMyBAQAogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5DPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+QyM8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5DKys8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgotICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5Db2NvYTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkQ8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5EYXJ0PC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+RGVscGhpPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+RXJsYW5nPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+R288L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5IYXNrZWxsPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SGF4ZTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkphdmE8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5KYXZhU2NyaXB0PC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+bm9kZS5qczwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CkBAIC00OSw2ICs1MCw3IEBACiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPlBlcmw8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5QSFA8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5QeXRob248L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5SdXN0PC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+U21hbGxUYWxrPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9jYXRlZ29yeS9odHRwIiAvPgogICAgIDxjYXRlZ29yeSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL2NhdGVnb3J5L2xpYnJhcnkiIC8+CkBAIC01NywxMSArNTksMzEgQEAKICAgICA8cmVsZWFzZSByZGY6cGFyc2VUeXBlPSJDb2xsZWN0aW9uIj4KICAgICAgIDxWZXJzaW9uPgogICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE4LTEyLTI4PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4xMi4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE3LTExLTMwPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4xMS4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE3LTAzLTAxPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4xMC4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgogICAgICAgICA8Y3JlYXRlZD4yMDE1LTA5LTI1PC9jcmVhdGVkPgogICAgICAgICA8cmV2aXNpb24+MC45LjM8L3JldmlzaW9uPgogICAgICAgPC9WZXJzaW9uPgogICAgICAgPFZlcnNpb24+CiAgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTQtMTEtMDU8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjkuMjwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KICAgICAgICAgPGNyZWF0ZWQ+MjAxMy0wOC0yMjwvY3JlYXRlZD4KICAgICAgICAgPHJldmlzaW9uPjAuOS4xPC9yZXZpc2lvbj4KICAgICAgIDwvVmVyc2lvbj4KQEAgLTExMyw4ICsxMzUsOCBAQAogICAgIDwvcmVsZWFzZT4KICAgICA8cmVwb3NpdG9yeT4KICAgICAgIDxHaXRSZXBvc2l0b3J5PgotICAgICAgICA8bG9jYXRpb24gcmRmOnJlc291cmNlPSJodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdCIvPgotICAgICAgICA8YnJvd3NlIHJkZjpyZXNvdXJjZT0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdCIvPgorICAgICAgICA8bG9jYXRpb24gcmRmOnJlc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLz4KKyAgICAgICAgPGJyb3dzZSByZGY6cmVzb3VyY2U9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0Ii8+CiAgICAgICA8L0dpdFJlcG9zaXRvcnk+CiAgICAgPC9yZXBvc2l0b3J5PgogICAgIDxtYWludGFpbmVyPgpkaWZmIC0tZ2l0IGEvZG9jL1JlbGVhc2VNYW5hZ2VtZW50Lm1kIGIvZG9jL1JlbGVhc2VNYW5hZ2VtZW50Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTQ0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUmVsZWFzZU1hbmFnZW1lbnQubWQKQEAgLTAsMCArMSwzOTUgQEAKKyMgQXBhY2hlIFRocmlmdCBSZWxlYXNlIE1hbmFnZW1lbnQKKworSW5zdHJ1Y3Rpb25zIGZvciBwcmVwYXJpbmcgYW5kIGRpc3RyaWJ1dGluZyBhIHJlbGVhc2Ugb2YgQXBhY2hlIFRocmlmdCBhcmUgZmFpcmx5IGNvbXBsZXguICBUaGVzZSBwcm9jZWR1cmVzIGFyZSBkb2N1bWVudGVkIGhlcmUsIGFuZCB3ZSdyZSB3b3JraW5nIHRvIGF1dG9tYXRlIGFzIG11Y2ggb2YgdGhpcyBhcyBwb3NzaWJsZS4gIFRoZXJlIGFyZSBmZXcgcHJvamVjdHMgbGlrZSBvdXJzIHRoYXQgaW50ZWdyYXRlIHdpdGggMjggcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiAgR2l2ZW4gdGhlIGV4dHJlbWUgbnVtYmVyIG9mIHBhY2thZ2UgbWFuYWdlbWVudCBzeXN0ZW1zIHRoYXQgQXBhY2hlIFRocmlmdCBpbnRlZ3JhdGVzIHdpdGggKGNvbXBhcmVkIHRvIHBlcmhhcHMgYW55KSwgcGFydCBvZiB0aGUgYnVyZGVuIG9mIHJlbGVhc2luZyBBcGFjaGUgVGhyaWZ0IGlzIHRvIG1hbnVhbGx5IHBhY2thZ2UgYW5kIHVwbG9hZCBzb21lIG9mIHRoZXNlIFtsYW5ndWFnZS1zcGVjaWZpYyBwYWNrYWdlc10oaHR0cDovL2FwYWNoZS50aHJpZnQub3JnL2xpYnJhcmllcykuCisKK0l0IGlzIGltcG9ydGFudCB0byBub3RlIGhlcmUgdGhhdCBBcGFjaGUgVGhyaWZ0IGlzIGRlc2lnbmVkIGZvciB2ZXJzaW9uIGludGVyb3BlcmFiaWxpdHksIHNvIG9uZSBjYW4gdXNlIGEgdmVyc2lvbiAwLjcuMCBjbGllbnQgd2l0aCBhIDAuMTIuMCBzZXJ2ZXIuICBBIHBhcnRpY3VsYXIgdmVyc2lvbiBudW1iZXIgZG9lcyBub3QgbWFrZSBhbnkgZ3VhcmFudGVlcyBhcyB0byB0aGUgZmVhdHVyZXMgYXZhaWxhYmxlIGluIGFueSBnaXZlbiBsYW5ndWFnZS4gIFNlZSB0aGUgW0xhbmd1YWdlIEZlYXR1cmUgTWF0cml4XShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci9MQU5HVUFHRVMubWQpIHRvIGxlYXJuIG1vcmUuCisKKyMjIENvbmNlcHRzCisKKyMjIyBWZXJzaW9uaW5nCisKK0FwYWNoZSBUaHJpZnQgYW5kIHRoZSB2YXN0IG1ham9yaXR5IG9mIHBhY2thZ2UgbWFuYWdlbWVudCBzeXN0ZW1zIG91dCB0aGVyZSBjb25mb3JtIHRvIHRoZSBbU2VtVmVyIDIuMF0oaHR0cHM6Ly9zZW12ZXIub3JnL3NwZWMvdjIuMC4wLmh0bWwpIHZlcnNpb24gbnVtYmVyaW5nIHNwZWNpZmljYXRpb24uCisKK0luIHRlcm1zIG9mIHJlbGVhc2VzLCB0aGUgaW1wb3J0YW50IHZlcnNpb24gbnVtYmVycyBmb3IgQXBhY2hlIFRocmlmdCBhcmUgdGhlIG1ham9yIGFuZCBtaW5vci4gIFRoZSBwYXRjaCBudW1iZXIgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgorCisxLiBUaGVyZSB3ZXJlIGxhbmd1YWdlLXNwZWNpZmljIGNyaXRpY2FsIGRlZmVjdHMgb3IgcGFja2FnaW5nIGlzc3Vlcy4KKzEuIFRoZXJlIHdhcyBzb21ldGhpbmcgaG9ycmlibHkgYW5kIGZ1bmRhbWVudGFsbHkgd3Jvbmcgd2l0aCBhIHgueC4wIHJlbGVhc2UuCisKKyMjIyMgRXh0ZXJuYWwgUGFja2FnZSBQYXRjaGVzCisKK0l0IGlzIGNvbW1vbiB0byBoYXZlIGxhbmd1YWdlLXNwZWNpZmljIGNyaXRpY2FsIGRlZmVjdHMgb3IgcGFja2FnaW5nIGVycm9ycyB0aGF0IG5lZWQgdG8gYmUgcmVzb2x2ZWQgYmV0d2VlbiByZWxlYXNlcyBvZiBBcGFjaGUgVGhyaWZ0LiAgVGhlIHByb2plY3QgaGFuZGxlcyB0aGVzZSBvbiBhIGNhc2UtYnktY2FzZSBiYXNpcyBmb3IgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSB0aGVpciBvd24gW3BhY2thZ2UgbWFuYWdlbWVudCBzeXN0ZW1zXShodHRwOi8vYXBhY2hlLnRocmlmdC5vcmcvbGlicmFyaWVzKS4gIFdoZW4gYSBsYW5ndWFnZS1zcGVjaWZpYyBwYXRjaCBpcyBtYWRlLCB0aGUgcGF0Y2ggbGV2ZWwgb2YgdGhlIGRpc3RyaWJ1dGlvbiBwdXNoZWQgdG8gdGhlIGV4dGVybmFsIHBhY2thZ2UgbWFuYWdlciBpcyBidW1wZWQuCisKKyBBcyBzdWNoLCB0aGVyZSBtYXkgYmUgY2FzZXMgYmV0d2VlbiBBcGFjaGUgVGhyaWZ0IHJlbGVhc2VzIHdoZXJlIHRoZXJlIGFyZSAoZm9yIGV4YW1wbGUpIGEgYDAuMTIuMWAgYW5kIGAwLjEyLjJgIHZlcnNpb24gb2YgYSBIYXNrZWxsIEhhY2thZ2UgcGFja2FnZSwgYW5kIHBlcmhhcHMgYWxzbyBhIGAwLjEyLjNgIHZlcnNpb24gb2YgYSBkbGFuZyBkdWIgcGFja2FnZS4gIFlvdSB3aWxsIG5vdCBmaW5kIGEgdGFnIG9yIGFuIG9mZmljaWFsIHByb2plY3QgcmVsZWFzZSBpbiB0aGVzZSBjYXNlcywgaG93ZXZlciB0aGUgY29kZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSByZWxlYXNlIGJyYW5jaCBhbmQgaW4gbWFzdGVyLiAgSW4gdGhlc2UgY2FzZXMgd2Ugd291bGQgbm90IHJlbGVhc2UgYSB2ZXJzaW9uIG9mIEFwYWNoZSBUaHJpZnQgbm9yIHdvdWxkIHdlIHJlZnJlc2ggYWxsIHRoZSBleHRlcm5hbCBsYW5ndWFnZSBwYWNrYWdlcy4KKworIyMjIyBWZXJzaW9uIGluIHRoZSBtYXN0ZXIgYnJhbmNoCisKK1RoZSBtYXN0ZXIgYnJhbmNoIHdpbGwgYWx3YXlzIGNvbnRhaW4gdGhlIG5leHQgYW50aWNpcGF0ZWQgcmVsZWFzZSB2ZXJzaW9uLiAgV2hlbiBhIHJlbGVhc2UgY3ljbGUgYmVnaW5zLCBhIGJyYW5jaCBpcyBjdXQgZnJvbSBtYXN0ZXIuICBUaGUgcmVsZWFzZSBicmFuY2ggd2lsbCBhbHJlYWR5IGhhdmUgYWxsIG9mIHRoZSBjb3JyZWN0IHZlcnNpb25zLCBhbmQgdGhlcmVmb3JlIHJlbGVhc2UgYnJhbmNoZXMgY2FuIGJlIGVhc2lseSBtZXJnZWQgYmFjayBpbnRvIG1hc3Rlci4gIChUaGlzIHdhcyBub3QgdHJ1ZSBvZiByZWxlYXNlcyBiZWZvcmUgMC4xMi4wKS4KKworIyMjIENvZGUgUmVwb3NpdG9yeQorCitUaGUgYXV0aG9yaXRhdGl2ZSByZXBvc2l0b3J5IGZvciBBcGFjaGUgVGhyaWZ0IGlzIHN0b3JlZCBpbiBbR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCkuICBJdCBpcyBtaXJyb3JlZCBieSBbR2l0Qm94XShodHRwczovL2dpdGJveC5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQpLgorCisjIyMgQnJhbmNoZXMKKworQWxsIGNvZGUgKHN1Ym1pdHRlZCB2aWEgcHVsbCByZXF1ZXN0IG9yIGRpcmVjdCBwdXNoKSBpcyBjb21taXR0ZWQgdG8gdGhlIGBtYXN0ZXJgIGJyYW5jaC4gIFVudGlsIHZlcnNpb24gMS4wIG9mIEFwYWNoZSBUaHJpZnQgZWFjaCByZWxlYXNlIGJyYW5jaCB3YXMgbmFtZWQgYDx2ZXJzaW9uPmAsIGZvciBleGFtcGxlIGluIHZlcnNpb24gYDAuMTIuMGAgdGhlcmUgaXMgYSBicmFuY2ggbmFtZWQgdGhlIHNhbWUuICBGb3IgdmVyc2lvbiAxLjAgcmVsZWFzZXMgYW55IGJleW9uZCwgcmVsZWFzZXMgd2lsbCBoYXZlIGEgYnJhbmNoIG5hbWVkIGByZWxlYXNlLzx2ZXJzaW9uPmAuCisKKyMjIyBUYWdzCisKK1VwIHRvIHZlcnNpb24gYDAuMTIuMGAgZWFjaCByZWxlYXNlIG9mIEFwYWNoZSBUaHJpZnQgd2FzIHRhZ2dlZCB3aXRoIGEgYDx2ZXJzaW9uPmAgdGFnLiAgU3RhcnRpbmcgd2l0aCB0aGUgYDAuMTIuMGAgcmVsZWFzZSwgZWFjaCByZWxlYXNlIG9mIEFwYWNoZSBUaHJpZnQgd2lsbCBiZSB0YWdnZWQgd2l0aCBhIGB2PHZlcnNpb24+YCB0YWcgdG8gc2F0aXNmeSBleHRlcm5hbCBwYWNrYWdlIG1hbmFnZW1lbnQgdG9vbHMgKHN1Y2ggYXMgb25lcyBmb3IgZGxhbmcgYW5kIGdvbGFuZykuICBGb3IgZXhhbXBsZSB0aGUgdGFnIG9mIHZlcnNpb24gYDAuMTIuMGAgaXMgYHYwLjEyLjBgLgorCisjIyBSZWxlYXNlIFByb2NlZHVyZXMKKworIyMjIFJlbGVhc2UgU2NoZWR1bGUKKworQXBhY2hlIFRocmlmdCBoYXMgbm8gb2ZmaWNpYWwgcmVsZWFzZSBzY2hlZHVsZSwgaG93ZXZlciB0aGUgcHJvamVjdCBhaW1zIHRvIHJlbGVhc2UgYXQgbGVhc3QgdHdpY2UgcGVyIHllYXIuCisKK0EgY29tcGxldGUgcmVsZWFzZSBjeWNsZSB3aWxsIHRha2UgYWJvdXQgMSB3ZWVrIHRvIGNvbXBsZXRlLCBpZiB0aGluZ3MgZ28gd2VsbCwgd2l0aCBoYWxmIG9mIHRoYXQgdGltZSB3YWl0aW5nIGZvciBhIHZvdGUuCisKKyMjIyBSZWxlYXNlIE1hbmFnZXIKKworQmVmb3JlIGEgcmVsZWFzZSBjeWNsZSBiZWdpbnMsIHNvbWVvbmUgbXVzdCBub21pbmF0ZSB0aGVtc2VsdmVzIG9uIHRoZSBkZXZlbG9wbWVudCBtYWlsaW5nIGxpc3QgYXMgdGhlIHJlbGVhc2UgbWFuYWdlciBmb3IgdGhhdCByZWxlYXNlLiAgSW4gb3JkZXIgdG8gYmUgYSByZWxlYXNlIG1hbmFnZXIgeW91IG11c3QgbWVldCB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOgorCisxLiBZb3UgYXJlIGEgW21lbWJlcl0oaHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3Bob25lYm9vay5odG1sP3BtYz10aHJpZnQpIG9mIHRoZSBBcGFjaGUgUE1DIGdyb3VwLgorMS4gWW91ciBwcm9maWxlIGF0IGh0dHBzOi8vaWQuYXBhY2hlLm9yZy8gaXMgdmFsaWQgYW5kIGNvbnRhaW5zIGEgUEdQIGtleS4gIElmIGl0IGRvZXMgbm90LCBzZWUgdGhlIFtBcGFjaGUgT3BlblBHUCBJbnN0cnVjdGlvbnNdKGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZGV2L29wZW5wZ3AuaHRtbCkuICBJZiB5b3VyIFBHUCBwcml2YXRlIGtleSBjcmVhdGlvbiBzZWVtcyB0byBoYW5nIGluZGVmaW5pdGVseSB3aGlsZSBjcmVhdGluZyBlbnRyb3B5LCB0cnkgdGhlc2UgZml4ZXM6CisgICAgLSBHZW5lcmF0ZSBkaXNrIEkvTyB3aXRoOiBgZGQgaWY9L2Rldi9zZGEgb2Y9L2Rldi96ZXJvYAorICAgIC0gSW5zdGFsbCB0aGUgYHJuZy10b29sc2AgcGFja2FnZS4KKzEuIFlvdXIgUEdQIGtleSBpcyB2aXNpYmxlIGluIHRoZSBbQXBhY2hlIENvbW1pdHRlciBLZXlzXShodHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcva2V5cy9jb21taXR0ZXIvKSBmb3IgY29kZSBzaWduaW5nLiAgVGhpcyBsaXN0IGlzIHVwZGF0ZWQgcGVyaW9kaWNhbGx5IGZyb20geW91ciBBcGFjaGUgSUQgKHNlZSBwcmV2aW91cyBzdGVwKS4KKzEuIFlvdSBoYXZlIHJlYWQgYW5kIGFncmVlIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBbQVNGIFJlbGVhc2UgRGlzdHJpYnV0aW9uIFBvbGljeV0oaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1kaXN0cmlidXRpb24uaHRtbCkuCisxLiBZb3UgaGF2ZSBhY2Nlc3MgYW5kIHRoZSBhYmlsaXR5IHRvIHVzZSBzdWJ2ZXJzaW9uLiAgQWxsIGRpc3RyaWJ1dGlvbiBhcnRpZmFjdHMgYXJlIHJlbGVhc2VkIHRocm91Z2ggYSBzdWJ2ZXJzaW9uIGNvbW1pdC4KKzEuIFlvdSBjYW4gYnVpbGQgaW4gdGhlIExpbnV4IERvY2tlciBDb250YWluZXIsIGFuZCB5b3UgaGF2ZSBWaXN1YWwgU3R1ZGlvIDIwMTcuCisxLiBZb3UgaGF2ZSBzdWZmaWNpZW50IHRpbWUgdG8gY29tcGxldGUgYSByZWxlYXNlIGRpc3RyaWJ1dGlvbi4KKworIyMjIFJlbGVhc2UgQ2FuZGlkYXRlCisKK0FsbCBBcGFjaGUgVGhyaWZ0IHJlbGVhc2VzIGdvIHRocm91Z2ggYSA3Mi1ob3VyIGZpbmFsIHJlbGVhc2UgY2FuZGlkYXRlIHZvdGluZyBwcm9jZWR1cmUuICBWb3RlcyBmcm9tIG1lbWJlcnMgb2YgdGhlIEFwYWNoZSBUaHJpZnQgUE1DIGFyZSBiaW5kaW5nLCBhbmQgYWxsIG90aGVycyBhcmUgbm9uLWJpbmRpbmcuICBGb3IgdGhlc2UgZXhhbXBsZXMsIHRoZSBgbWFzdGVyYCBicmFuY2ggaXMgYXQgdmVyc2lvbiAxLjAuMCBhbmQgdGhhdCBpcyB0aGUgbmV4dCByZWxlYXNlLgorCisxLiBTY3J1YiB0aGUgQXBhY2hlIEppcmEgYmFja2xvZy4gIFRoZXJlIGFyZSBhIGNvdXBsZSB0aGluZ3MgdG8gZG86CisKKyAgICAxLiBbT3BlbiBJc3N1ZXMgd2l0aG91dCBhIENvbXBvbmVudF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/ZmlsdGVyPS0xJmpxbD1wcm9qZWN0JTIwJTNEJTIwVEhSSUZUJTIwYW5kJTIwc3RhdHVzJTIwISUzRCUyMENsb3NlZCUyMGFuZCUyMGNvbXBvbmVudCUyMGlzJTIwZW1wdHkpIC0gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaGFzIGFuIGFzc2lnbmVkIGNvbXBvbmVudCwgYXMgdGhlIHJlbGVhc2Ugbm90ZXMgYXJlIGdyb3VwZWQgdG9nZXRoZXIgYnkgbGFuZ3VhZ2UuCisKKyAgICAxLiBbT3BlbiBJc3N1ZXMgd2l0aCBhIEZpeCBWZXJzaW9uXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9maWx0ZXI9LTEmanFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBhbmQlMjBzdGF0dXMlMjBpbiUyMChPUEVOJTJDJTIwJTI3SU4lMjBQUk9HUkVTUyUyNyUyQyUyMFJFT1BFTkVEKSUyMGFuZCUyMGZpeFZlcnNpb24lMjBpcyUyMG5vdCUyMGVtcHR5KSAtIHRoZXNlIHdpbGwgYmUgaXNzdWVzIHRoYXQgc29tZW9uZSBwbGFjZWQgYSBmaXhWZXJzaW9uIG9uIGluIEppcmEsIGJ1dCBoYXZlIG5vdCBiZWVuIHJlc29sdmVkIG9yIGNsb3NlZCB5ZXQuICBUaGV5IGFyZSBsaWtlbHkgc3RhbGUgc29tZWhvdy4gIFJlc29sdXRpb25zIGZvciB0aGVzZSBpc3N1ZXMgaW5jbHVkZSByZXNvbHZpbmcgb3IgY2xvc2luZyB0aGUgaXNzdWUgaW4gSmlyYSwgb3Igc2ltcGx5IHJlbW92aW5nIHRoZSBmaXhWZXJzaW9uIGlmIHRoZSBpc3N1ZSBoYXNuJ3QgYmVlbiBmaXhlZC4KKworICAgIDEuIFtPcGVuIEJsb2NraW5nIElzc3Vlc10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/ZmlsdGVyPS0xJmpxbD1wcm9qZWN0JTIwJTNEJTIwVEhSSUZUJTIwYW5kJTIwcHJpb3JpdHklMjBpbiUyMChibG9ja2VyKSUyMGFuZCUyMHN0YXR1cyUyMG5vdCUyMGluJTIwKGNsb3NlZCklMjBvcmRlciUyMGJ5JTIwY29tcG9uZW50JTIwQVNDKSAtIGJsb2NraW5nIGlzc3VlcyBzaG91bGQgYmxvY2sgYSByZWxlYXNlLiAgU2NydWIgdGhlIGxpc3QgdG8gc2VlIGlmIHRoZXkgYXJlIHJlYWxseSBibG9ja2luZyB0aGUgcmVsZWFzZSwgYW5kIGlmIG5vdCBjaGFuZ2UgdGhlaXIgcHJpb3JpdHkuCisKKyAgICAxLiBbT3BlbiBDcml0aWNhbCBJc3N1ZXNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9pc3N1ZXMvP2ZpbHRlcj0tMSZqcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMGFuZCUyMHByaW9yaXR5JTIwaW4lMjAoY3JpdGljYWwpJTIwYW5kJTIwc3RhdHVzJTIwbm90JTIwaW4lMjAoY2xvc2VkKSUyMGFuZCUyMHR5cGUlMjBub3QlMjBpbiUyMCglMjJ3aXNoJTIyKSUyMG9yZGVyJTIwYnklMjBjb21wb25lbnQlMjBBU0MpIC0gdGhpcyBsaXN0IHdpbGwgZW5kIHVwIGluIHRoZSBrbm93biBjcml0aWNhbCBpc3N1ZXMgbGlzdCBpbiB0aGUgY2hhbmdlcyBmaWxlLiAgU2NydWIgaXQgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgYWN0dWFsbHkgY3JpdGljYWwuCisKKyAgICBJdCBpcyBoZWFsdGh5IHRvIHNjcnViIHRoZXNlIHBlcmlvZGljYWxseSwgd2hldGhlciBvciBub3QgeW91IGFyZSBtYWtpbmcgYSBuZXcgcmVsZWFzZS4KKworMS4gQ2hlY2sgdGhhdCB0aGUgdmVyc2lvbiBudW1iZXIgaW4gdGhlIGBtYXN0ZXJgIGJyYW5jaCBtYXRjaGVzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgdXBjb21uaW5nIHJlbGVhc2UuICBUbyBjaGVjayB0aGUgYG1hc3RlcmAgYnJhbmNoIHZlcnNpb24sIHJ1bjoKKworICAgIGBgYGJhc2gKKyAgICB0aHJpZnQkIGdyZXAgQUNfSU5JVCBjb25maWd1cmUuYWMgfCBjdXQgLWQnWycgLWYzIHwgY3V0IC1kJ10nIC1mMQorICAgIDEuMC4wCisgICAgYGBgCisKKyAgICBJZiBpdCBkb2VzIG5vdCBtYXRjaCAodGhpcyBzaG91bGQgYmUgZXh0cmVtZWx5IHJhcmUpLCB5b3UgbmVlZCB0byBzdWJtaXQgYSBwdWxsIHJlcXVlc3Qgc2V0dGluZyB0aGUgYG1hc3RlcmAgYnJhbmNoIHRvIHRoZSBkZXNpcmVkIHZlcnNpb24gb2YgdGhlIHVwY29taW5nIHJlbGVhc2UuICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHdlIHByZXBhcmUgdG8gY29tbWl0IGEgYnJhbmNoIHdoZXJlIHRoZSB2ZXJzaW9uIG51bWJlciBpcyBjaGFuZ2VkIGZyb20gYDEuMC4wYCB0byBgMS4xLjBgOgorCisgICAgYGBgYmFzaAorICAgIHRocmlmdCQgZ2l0IGNoZWNrb3V0IC1iIGZpeC12ZXJzaW9uLWZvci1yZWxlYXNlCisgICAgdGhyaWZ0JCBidWlsZC92ZXJhbGlnbi5zaCAxLjAuMCAxLjEuMAorICAgICMgY2hlY2sgdG8gc2VlIGlmIGFueSBvZiB0aGUgbWFudWFsbHkgbW9kaWZpZWQgZmlsZXMgbmVlZHMgY2hhbmdlcworICAgIHRocmlmdCQgZ2l0IHB1c2ggLi4uICMgbWFrZSBhIHB1bGwgcmVxdWVzdAorICAgIGBgYAorCisxLiBDcmVhdGUgYSByZWxlYXNlIGJyYW5jaCBmb3IgdGhlIHJlbGVhc2UsIGluIHRoaXMgZXhhbXBsZSBgMS4wLjBgOgorCisgICAgYGBgYmFzaAorICAgIHRocmlmdCQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorICAgIHRocmlmdCQgZ2l0IHB1bGwKKyAgICB0aHJpZnQkIGdpdCBjaGVja291dCAtYiAicmVsZWFzZS8xLjAuMCIKKyAgICB0aHJpZnQkIGdpdCBwdXNoCisgICAgYGBgCisKKyAgICBOb3cgdGhlcmUgaXMgYSBgcmVsZWFzZS8xLjAuMGAgYnJhbmNoIGluIEdpdEh1YiBmb3IgQXBhY2hlIFRocmlmdC4KKworICAgIEJ5IGNyZWF0aW5nIGEgcmVsZWFzZSBicmFuY2ggd2UgYWxsb3cgd29yayB0byBjb250aW51ZSBvbiB0aGUgYG1hc3RlcmAgYnJhbmNoIGZvciB0aGUgbmV4dCByZWxlYXNlIHdoaWxlIHdlIGZpbmFsaXplIHRoaXMgb25lLiAgTm90ZSB0aGF0IGByZWxlYXNlLzEuMC4wYCBhbmQgYG1hc3RlcmAgaW4gdGhpcyBleGFtcGxlIGFyZSBub3cgaWRlbnRpY2FsLCBhbmQgdGhlcmVmb3JlIGl0IGlzIHBvc3NpYmxlIHRvIG1lcmdlIHRoZSByZWxlYXNlIGJyYW5jaCBiYWNrIGludG8gYG1hc3RlcmAgYXQgdGhlIGVuZCBvZiB0aGUgcmVsZWFzZSEKKworMS4gTW9kaWZ5IHRoZXNlIGZpbGVzIG1hbnVhbGx5LCBpbnNlcnRpbmcgdGhlIHJlbGVhc2UgaW50byB0aGVtIGF0IHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbi4gIEZvbGxvdyBleGlzdGluZyBwYXR0ZXJucyBpbiBlYWNoIGZpbGU6CisgICAgLSBgZG9hcC5yZGZgCisgICAgLSBgZGViaWFuL2NoYW5nZWxvZ2AKKworMS4gR2VuZXJhdGUgdGhlIGNvbnRlbnQgZm9yIGBDSEFOR0VTLm1kYCAtIHRoaXMgaXMgb25lIG9mIHRoZSBtb3N0IHRpbWUtY29uc3VtaW5nIHBhcnRzIG9mIHRoZSByZWxlYXNlIGN5Y2xlLiAgSXQgaXMgYSBsb3Qgb2Ygd29yaywgYnV0IHRoZSByZXN1bHQgaXMgd2VsbCB3b3J0aCBpdCB0byB0aGUgY29uc3VtZXJzIG9mIEFwYWNoZSBUaHJpZnQ6CisKKyAgICAxLiBGaW5kIGFsbCBbSXNzdWVzIEZpeGVkIGJ1dCBub3QgQ2xvc2VkIGluIDEuMC4wXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9maWx0ZXI9LTEmanFsPXByb2plY3QlMjAlM0QlMjB0aHJpZnQlMjBhbmQlMjBmaXhWZXJzaW9uJTIwJTNEJTIwMS4wLjAlMjBhbmQlMjBzdGF0dXMlMjAhJTNEJTIwY2xvc2VkKSAoYWRqdXN0IHRoZSB2ZXJzaW9uIGluIHRoZSBsaW5rIHRvIHN1aXQgeW91ciBuZWVkcykuCisKKyAgICAxLiBFeHBvcnQgdGhlIGxpc3Qgb2YgaXNzdWVzIHRvIGEgQ1NWIChDdXJyZW50IEZpZWxkcykgYW5kIG9wZW4gaW4gRXhjZWwgKG9yIGEgc2ltaWxhciBzcHJlYWRzaGVldCkuCisKKyAgICAxLiBIaWRlIGFsbCBjb2x1bW5zIGV4Y2VwdCBmb3IgdGhlIGlzc3VlIGlkIChpLmUuIFRIUklGVC1ubm5uKSwgdGhlIGNvbXBvbmVudCAoZmlyc3Qgb25lKSwgYW5kIHRoZSBzdW1tYXJ5LgorCisgICAgMS4gU29ydCBieSBjb21wb25lbnQgYXNjZW5kaW5nIGFuZCB0aGVuIGJ5IGlkIGFzY2VuZGluZy4KKworICAgIDEuIENyZWF0ZSBhIGZvdXJ0aCBjb2x1bW4gdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGNvbnRlbnRzIG9mIGVhY2ggbGluZSB0aGF0IGdvZXMgaW50byB0aGUgcmVsZWFzZSBub3Rlcy4gIE9uY2UgeW91IGhhdmUgdGhlIGZvcm11bGEgd29ya2luZyBpbiBvbmUgY2VsbCBwYXN0ZSBpdCBpbnRvIHRoZSBvdGhlciByb3dzIHRvIHBvcHVsYXRlIHRoZW0uICBVc2UgYSBmb3JtdWxhIHRvIGdldCB0aGUgY29sdW1uIHRvIGxvb2sgbGlrZSB0aGlzOgorCisgICAgICAgIGBgYHZjb2wKKyAgICAgICAgSXNzdWUgICAgICAgQ29tcG9uZW50ICAgICAgU3VtbWFyeSAgICAgUmVsTm90ZQorICAgICAgICBUSFJJRlQtMTIzICBDKysgLSBMaWJyYXJ5ICBEcm9wIEMrKzAzICBbVEhSSUZULTEyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMzk3OCkgLSBEcm9wIEMrKzAzCisgICAgICAgIGBgYAorCisgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgcm93IGFib3ZlIHdhcyByb3cgIkIiIGluIEVYQ0VMIGl0IHdvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2U6CisKKyAgICAgICAgYGBgdGV4dAorICAgICAgICA9Q09OQ0FUKCJbIiwgQjEsICJdIiwKKyAgICAgICAgICAgICAgICAiaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS8iLCAKKyAgICAgICAgICAgICAgICBCMSwgIiAtICIsIEIzKQorICAgICAgICBgYGAKKworICAgIDEuIENyZWF0ZSBhIGxldmVsIDMgc2VjdGlvbiBpbiBgQ0hBTkdFUy5tZGAgdW5kZXIgdGhlIHJlbGVhc2UgZm9yIGVhY2ggY29tcG9uZW50IGFuZCBjb3B5IHRoZSBpdGVtcyBmcm9tIHRoZSBSZWxOb3RlIGNvbHVtbiBpbnRvIHRoZSBjaGFuZ2VzIGZpbGUuCisKKyAgICAxLiBGaW5kIGFsbCBbT3BlbiBDcml0aWNhbCBJc3N1ZXNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9pc3N1ZXMvP2ZpbHRlcj0tMSZqcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMGFuZCUyMHByaW9yaXR5JTIwaW4lMjAoY3JpdGljYWwpJTIwYW5kJTIwc3RhdHVzJTIwbm90JTIwaW4lMjAoY2xvc2VkKSUyMGFuZCUyMHR5cGUlMjBub3QlMjBpbiUyMCglMjJ3aXNoJTIyKSUyMG9yZGVyJTIwYnklMjBjb21wb25lbnQlMjBBU0MpIGFuZCBhZGQgdGhlbSB0byBgQ0hBTkdFUy5tZGAgaW4gdGhlIGxpc3Qgb2Yga25vd24gY3JpdGljYWwgaXNzdWVzIGZvciB0aGUgcmVsZWFzZS4KKworMS4gQ29tbWl0IGFsbCBjaGFuZ2VzIHRvIHRoZSByZWxlYXNlIGJyYW5jaC4KKworMS4gR2VuZXJhdGUgdGhlIHNvdXJjZSB0YXJiYWxsLgorCisgICAgMS4gT24gYSBsaW51eCBzeXN0ZW0gZ2V0IGEgY2xlYW4gY29weSBvZiB0aGUgcmVsZWFzZSBicmFuY2gsIGZvciBleGFtcGxlOgorCisgICAgICAgIGBgYGJhc2gKKyAgICAgICAgfiQgZ2l0IGNsb25lIC1iICJyZWxlYXNlLzEuMC4wIiBnaXRAZ2l0aHViLmNvbTphcGFjaGUvdGhyaWZ0LmdpdCB0aHJpZnQtMS4wLjAtc3JjCisgICAgICAgIGBgYAorCisgICAgMS4gSW4gdGhlIGNsZWFuIGNvcHkgb2YgdGhlIHJlbGVhc2UgYnJhbmNoLCBzdGFydCBhIGRvY2tlciBidWlsZCBjb250YWluZXIgYW5kIHJ1biBgbWFrZSBkaXN0YDoKKworICAgICAgICBgYGBjb2RlCisgICAgICAgIH4kIGNkIHRocmlmdC0xLjAuMC1zcmMKKyAgICAgICAgfi90aHJpZnQtMS4wLjAtc3JjJCBkb2NrZXIgcnVuIC12ICQocHdkKTovdGhyaWZ0L3NyYzpydyBcCisgICAgICAgICAgICAtaXQgdGhyaWZ0L3RocmlmdC1idWlsZDp1YnVudHUtYmlvbmljIC9iaW4vYmFzaAorICAgICAgICByb290QDhiNDEwMTE4OGFhMjovdGhyaWZ0L3NyYyMgLi9ib290c3RyYXAuc2ggJiYgLi9jb25maWd1cmUgJiYgbWFrZSBkaXN0CisgICAgICAgIGBgYAorCisgICAgICAgIFRoZSByZXN1bHQgd2lsbCBiZSBhIGZpbGUgbmFtZWQgYHRocmlmdC0xLjAuMC50YXIuZ3pgLiAgQ2hlY2sgdGhlIHNpemUgYW5kIG1ha2Ugc3VyZSBpdCBpcyByb3VnaGx5IDRNQi4gIEl0IGNvdWxkIGdldCBsYXJnZXIgb3ZlciB0aW1lLCBidXQgaXQgc2hvdWxkbid0IGp1bXAgYnkgb3JkZXJzIG9mIG1hZ25pdHVkZS4gIE9uY2Ugc2F0aXNmaWVkIHlvdSBjYW4gZXhpdCB0aGUgZG9ja2VyIGNvbnRhaW5lciB3aXRoIGBleGl0YC4KKworICAgIDEuIEdlbmVyYXRlIHNpZ25hdHVyZXMgYW5kIGNoZWNrc3VtcyBmb3IgdGhlIHRhcmJhbGw6CisKKyAgICAgICAgYGBgYmFzaAorICAgICAgICBncGcgLS1hcm1vciAtLW91dHB1dCB0aHJpZnQtMS4wLjAudGFyLmd6LmFzYyAtLWRldGFjaC1zaWcgdGhyaWZ0LTEuMC4wLnRhci5negorICAgICAgICBtZDVzdW0gdGhyaWZ0LTEuMC4wLnRhci5neiA+IHRocmlmdC0xLjAuMC50YXIuZ3oubWQ1CisgICAgICAgIHNoYTFzdW0gdGhyaWZ0LTEuMC4wLnRhci5neiA+IHRocmlmdC0xLjAuMC50YXIuZ3ouc2hhMQorICAgICAgICBzaGEyNTZzdW0gdGhyaWZ0LTEuMC4wLnRhci5neiA+IHRocmlmdC0xLjAuMC50YXIuZ3ouc2hhMjU2CisKKzEuIEdlbmVyYXRlIHRoZSBXaW5kb3dzIFRocmlmdCBDb21waWxlci4gIFRoaXMgaXMgYSBzdGF0aWNhbGx5IGxpbmtlZCBjb21waWxlciB0aGF0IGlzIHBvcnRhYmxlIGFuZCBmb2xrcyBmaW5kIGl0IHVzZWZ1bCB0byBiZSBhYmxlIHRvIGRvd25sb2FkIG9uZSwgZXNwZWNpYWxseSBpZiB0aGV5IGFyZSB1c2luZyB0aGlyZC1wYXJ0eSBkaXN0cmlidXRlZCBydW50aW1lIGxpYnJhcmllcyBmb3IgaW50ZXJwcmV0ZWQgbGFuZ3VhZ2VzIG9uIFdpbmRvd3MuICBUaGVyZSBhcmUgdHdvIHdheXMgdG8gZ2VuZXJhdGUgdGhpczoKKworICAgIC0gVXNpbmcgYSBEZXZlbG9wbWVudCBWTQorCisgICAgICAgIDEuIE9uIGEgV2luZG93cyBtYWNoaW5lIHdpdGggVmlzdWFsIFN0dWRpbywgcHVsbCBkb3duIHRoZSBzb3VyY2UgY29kZSBhbmQgY2hlY2tvdXQgdGhlIHJlbGVhc2UgYnJhbmNoLgorICAgICAgICAxLiBPcGVuIGFuIHg2NCBOYXRpdmUgVG9vbHMgQ29tbWFuZCBQcm9tcHQgZm9yIFZTIDIwMTcgYW5kIGNyZWF0ZSBhbiBvdXQtb2YtdHJlZSBidWlsZCBkaXJlY3RvcnkuCisgICAgICAgIDEuIEluc3RhbGwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGNtYWtlLgorICAgICAgICAxLiBJbnN0YWxsIGNob2NvbGF0ZXkgYW5kIGluc3RhbGwgd2luZmxleGJpc29uIHdpdGggY2hvY29sYXRleS4KKyAgICAgICAgMS4gUnVuIGNtYWtlIHRvIGdlbmVyYXRlIGFuIG91dC1vZi10cmVlIGJ1aWxkIGVudmlyb25tZW50OgorICAgICAgICAgICAgYGBgY21kCisgICAgICAgICAgICBDOlxidWlsZD4gY21ha2UgLi5cdGhyaWZ0IC1EQklTT05fRVhFQ1VUQUJMRT1jOlxQcm9ncmFtRGF0YVxjaG9jb2xhdGV5XGxpYlx3aW5mbGV4Ymlzb25cdG9vbHNcd2luX2Jpc29uLmV4ZSAtREZMRVhfRVhFQ1VUQUJMRT1jOlxQcm9ncmFtRGF0YVxjaG9jb2xhdGV5XGxpYlx3aW5mbGV4Ymlzb25cdG9vbHNcd2luX2ZsZXguZXhlIC1EV0lUSF9NVD1PTiAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgLURXSVRIX0NQUD1PRkYgLURXSVRIX0pBVkE9T0ZGIC1EV0lUSF9IQVNLRUxMPU9GRiAtRFdJVEhfUFlUSE9OPU9GRiAtRFdJVEhfQ19HTElCPU9GRiAtREJVSUxEX1RFU1RJTkc9T0ZGIC1EQlVJTERfVFVUT1JJQUxTPU9GRiAtREJVSUxEX0NPTVBJTEVSPU9OCisgICAgICAgICAgICBDOlxidWlsZD4gY21ha2UgLS1idWlsZCAuIC0tY29uZmlnIFJlbGVhc2UKKyAgICAgICAgICAgIGBgYAorCisgICAgLSBVc2luZyBbRG9ja2VyIGZvciBXaW5kb3dzXSguLi9idWlsZC9kb2NrZXIvbXN2YzIwMTcvUkVBRE1FLm1kKSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIHRoZSBjb21waWxlci4KKyAgICAtIEluIGJvdGggY2FzZXM6CisgICAgICAgIDEuIFZlcmlmeSB0aGUgZXhlY3V0YWJsZSBvbmx5IGRlcGVuZHMgb24ga2VybmVsMzIuZGxsIHVzaW5nIFtkZXBlbmRzLmV4ZV0oaHR0cDovL3d3dy5kZXBlbmRlbmN5d2Fsa2VyLmNvbS8pLgorICAgICAgICAxLiBDb3B5IHRoZSBleGVjdXRhYmxlIGB0aHJpZnQuZXhlYCB0byB5b3VyIGxpbnV4IHN5c3RlbSB3aGVyZSB0aGUgc2lnbmVkIHRhcmJhbGwgbGl2ZXMgYW5kIHJlbmFtZSBpdCB0byBgdGhyaWZ0LTEuMC4wLmV4ZWAgKHN1YnN0aXR1dGUgdGhlIGNvcnJlY3QgdmVyc2lvbiwgb2YgY291cnNlKS4KKyAgICAgICAgMS4gU2lnbiB0aGUgZXhlY3V0YWJsZSB0aGUgc2FtZSB3YXkgeW91IHNpZ25lZCB0aGUgdGFyYmFsbC4KKworMS4gVXBsb2FkIHRoZSByZWxlYXNlIGFydGlmYWN0cyB0byB0aGUgQXBhY2hlIERpc3QvRGV2IHNpdGUuICBUaGlzIHJlcXVpcmVzIHN1YnZlcnNpb246CisKKyAgICBgYGBiYXNoCisgICAgfiQgbWtkaXIgLXAgZGlzdC9kZXYKKyAgICB+JCBjZCBkaXN0L2RldgorICAgIH4vZGlzdC9kZXYkIHN2biBjbyAiaHR0cHM6Ly9kaXN0LmFwYWNoZS5vcmcvcmVwb3MvZGlzdC9kZXYvdGhyaWZ0IiB0aHJpZnQKKyAgICB+L2Rpc3QvZGV2JCBjZCB0aHJpZnQKKyAgICBgYGAKKworICAgIENvcHkgdGhlIHRhcmJhbGwsIHdpbmRvd3MgY29tcGlsZXIgZXhlY3V0YWJsZSwgYW5kIDggYWRkaXRpb25hbCBzaWduaW5nIGZpbGVzIGludG8gYSBuZXcgZGlyZWN0b3J5IGZvciB0aGUgcmVsZWFzZToKKworICAgIGBgYCBiYXNoCisgICAgfi9kaXN0L2Rldi90aHJpZnQkIG1rZGlyIDEuMC4wLXJjMAorICAgICMgY29weSB0aGUgZmlsZXMgaW50byB0aGUgZGlyZWN0b3J5CisgICAgfi9kaXN0L2Rldi90aHJpZnQkIHN2biBhZGQgMS4wLjAtcmMwCisgICAgYGBgCisKKyAgICBUaGUgbGF5b3V0IG9mIHRoZSBmaWxlcyBzaG91bGQgbWF0Y2ggdGhlIFtjdXJyZW50IHJlbGVhc2VdKGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC90aHJpZnQvKS4gIE9uY2UgZG9uZSwgYWRkIHRoZSByZWxlYXNlIGNhbmRpZGF0ZSBhbmQgY2hlY2sgaXQgaW46CisKKyAgICBgYGBiYXNoCisgICAgfi9kaXN0L2Rldi90aHJpZnQkIHN2biBzdGF0dXMKKyAgICAjIHZlcmlmeSBldmVyeXRoaW5nIGlzIGNvcnJlY3QKKyAgICB+L2Rpc3QvZGV2L3RocmlmdCQgc3ZuIGNvbW1pdCAtbSAiQXBhY2hlIFRocmlmdCAxLjAuMC1yYzAgaW4gZGlzdCBkZXYiIFwKKyAgICAgICAgLS11c2VybmFtZSA8YXBhY2hlLXVzZXJuYW1lPiAtLXBhc3N3b3JkIDxhcGFjaGUtcGFzc3dvcmQ+CisgICAgYGBgCisKKzEuIFZlcmlmeSB0aGUgcmVsZWFzZSBjYW5kaWRhdGUgYXJ0aWZhY3RzIGFyZSBhdmFpbGFibGUgYXQ6CisKKyAgICBbaHR0cHM6Ly9kaXN0LmFwYWNoZS5vcmcvcmVwb3MvZGlzdC9kZXYvdGhyaWZ0L10oaHR0cHM6Ly9kaXN0LmFwYWNoZS5vcmcvcmVwb3MvZGlzdC9kZXYvdGhyaWZ0LykKKworMS4gU2VuZCBhIHZvdGluZyBhbm5vdW5jZW1lbnQgbWVzc2FnZSB0byBgZGV2QHRocmlmdC5hcGFjaGUub3JnYCBmb2xsb3dpbmcgdGhpcyB0ZW1wbGF0ZSBhcyBhIGd1aWRlOgorCisgICAgYGBgY29kZQorICAgIFRvOiBkZXZAdGhyaWZ0LmFwYWNoZS5vcmcKKyAgICBTdWJqZWN0OiBbVk9URV0gQXBhY2hlIFRocmlmdCAxLjAuMC1yYzAgcmVsZWFzZSBjYW5kaWRhdGUKKyAgICAtLS0KKyAgICBBbGwsCisKKyAgICBJIHByb3Bvc2UgdGhhdCB3ZSBhY2NlcHQgdGhlIGZvbGxvd2luZyByZWxlYXNlIGNhbmRpZGF0ZSBhcyB0aGUgb2ZmaWNpYWwgQXBhY2hlIFRocmlmdCAxLjAuMCByZWxlYXNlOgorCisgICAgaHR0cHM6Ly9kaXN0LmFwYWNoZS5vcmcvcmVwb3MvZGlzdC9kZXYvdGhyaWZ0LzEuMC4wLXJjMC90aHJpZnQtMS4wLjAtcmMwLnRhci5negorCisgICAgVGhlIHJlbGVhc2UgY2FuZGlkYXRlIHdhcyBjcmVhdGVkIGZyb20gdGhlIHJlbGVhc2UvMS4wLjAgYnJhbmNoIGFuZCBjYW4gYmUgY2xvbmVkIHVzaW5nOgorCisgICAgZ2l0IGNsb25lIC1iIHJlbGVhc2UvMS4wLjAgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0CisKKyAgICBUaGUgcmVsZWFzZSBjYW5kaWRhdGVzIEdQRyBzaWduYXR1cmUgY2FuIGJlIGZvdW5kIGF0OgorICAgIGh0dHBzOi8vZGlzdC5hcGFjaGUub3JnL3JlcG9zL2Rpc3QvZGV2L3RocmlmdC8xLjAuMC1yYzAvdGhyaWZ0LTEuMC4wLXJjMC50YXIuZ3ouYXNjCisKKyAgICBUaGUgcmVsZWFzZSBjYW5kaWRhdGVzIGNoZWNrc3VtcyBhcmU6CisgICAgbWQ1OiAKKyAgICBzaGExOiAKKyAgICBzaGEyNTY6IAorCisKKyAgICBBIHByZWJ1aWx0IHN0YXRpY2FsbHktbGlua2VkIFdpbmRvd3MgY29tcGlsZXIgaXMgYXZhaWxhYmxlIGF0OgorICAgIGh0dHBzOi8vZGlzdC5hcGFjaGUub3JnL3JlcG9zL2Rpc3QvZGV2L3RocmlmdC8xLjAuMC1yYzAvdGhyaWZ0LTEuMC4wLXJjMC5leGUKKworICAgIFByZWJ1aWx0IHN0YXRpY2FsbHktbGlua2VkIFdpbmRvd3MgY29tcGlsZXIgR1BHIHNpZ25hdHVyZToKKyAgICBodHRwczovL2Rpc3QuYXBhY2hlLm9yZy9yZXBvcy9kaXN0L2Rldi90aHJpZnQvMS4wLjAtcmMwL3RocmlmdC0xLjAuMC1yYzAuZXhlLmFzYworCisgICAgUHJlYnVpbHQgc3RhdGljYWxseS1saW5rZWQgV2luZG93cyBjb21waWxlciBjaGVja3N1bXMgYXJlOgorICAgIG1kNTogCisgICAgc2hhMTogCisgICAgc2hhMjU2OiAKKworICAgIFRoZSBDSEFOR0VTIGxpc3QgZm9yIHRoaXMgcmVsZWFzZSBpcyBhdmFpbGFibGUgYXQ6CisgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9yZWxlYXNlLzEuMC4wL0NIQU5HRVMubWQKKworCisgICAgUGxlYXNlIGRvd25sb2FkLCB2ZXJpZnkgc2lnL3N1bSwgaW5zdGFsbCBhbmQgdGVzdCB0aGUgbGlicmFyaWVzIGFuZCBsYW5ndWFnZXMgb2YgeW91ciBjaG9pY2UuCisKKyAgICBUaGlzIHZvdGUgd2lsbCBjbG9zZSBpbiA3MiBob3VycyBvbiAyMDE5LTA3LTA2IDIxOjAwIFVUQworCisgICAgWyBdICsxIFJlbGVhc2UgdGhpcyBhcyBBcGFjaGUgVGhyaWZ0IDEuMC4wCisgICAgWyBdICswCisgICAgWyBdIC0xIERvIG5vdCByZWxlYXNlIHRoaXMgYXMgQXBhY2hlIFRocmlmdCAxLjAuMCBiZWNhdXNlLi4uCisgICAgYGBgCisKKzEuIElmIGFueSBpc3N1ZXMgYXJlIGJyb3VnaHQgdXAgd2l0aCB0aGUgcmVsZWFzZSBjYW5kaWRhdGUsIHlvdSB3aWxsIG5lZWQgdG8gcGFja2FnZSBhbm90aGVyIGFuZCByZXNldCB0aGUgdm90aW5nIGNsb2NrLgorCisjIyMgT2ZmaWNpYWwgUmVsZWFzZQorCisxLiBTZW5kIGEgbWVzc2FnZSB0byBgZGV2QHRocmlmdC5hcGFjaGUub3JnYCB3aXRoIHRoZSB2b3RpbmcgcmVzdWx0cy4gIFVzZSB0aGlzIHRlbXBsYXRlIGFzIGEgZ3VpZGU6CisKKyAgICBgYGBjb2RlCisgICAgVG86IGRldn50aHJpZnQuYXBhY2hlLm9yZworICAgIFN1YmplY3Q6IFtWT1RFXVtSRVNVTFRdIFJlbGVhc2UgQXBhY2hlIFRocmlmdCAxLjAuMAorICAgIC0tLQorICAgIEFsbCwKKworICAgIEluY2x1ZGluZyBteSBvd24gdm90ZSBvZiArMSB3ZSBoYXZlIE4gYmluZGluZyArMSBhbmQgbm8gLTEuCisgICAgVGhlIHZvdGUgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IDEuMC4wIHJlbGVhc2UgaXMgKioqc3VjY2Vzc2Z1bCoqKi4KKyAgICBUaGFuayB5b3UgdG8gYWxsIHdobyBoZWxwZWQgdGVzdCBhbmQgdmVyaWZ5LgorICAgIGBgYAorCisxLiBVc2Ugc3ZuIHRvIGNoZWNrb3V0IHRoZSByZWxlYXNlIHBhcnQgb2YgdGhyaWZ0IChzaW1pbGFyIHRvIGRldikgYW5kIGNvcHkgdGhlIGZpbGVzIG92ZXIgZnJvbSBkZXYsIG1hdGNoaW5nIHRoZSBwcmV2aW91cyByZWxlYXNlIHN0cnVjdHVyZToKKworICAgIGBgYGJhc2gKKyAgICB+JCBta2RpciAtcCBkaXN0L3JlbGVhc2UKKyAgICB+JCBjZCBkaXN0L3JlbGVhc2UKKyAgICB+L2Rpc3QvcmVsZWFzZSQgc3ZuIGNvICJodHRwczovL2Rpc3QuYXBhY2hlLm9yZy9yZXBvcy9kaXN0L3JlbGVhc2UvdGhyaWZ0IiB0aHJpZnQKKyAgICB+L2Rpc3QvcmVsZWFzZSQgY2QgdGhyaWZ0CisgICAgfi9kaXN0L3JlbGVhc2UvdGhyaWZ0JCBta2RpciAxLjAuMAorICAgIH4vZGlzdC9yZWxlYXNlL3RocmlmdCQgY3AgLXAgLi4vLi4vZGV2L3RocmlmdC8xLjAuMC1yYzAvKiAxLjAuMC8KKyAgICB+L2Rpc3QvcmVsZWFzZS90aHJpZnQkIHN2biBzdGF0dXMKKyAgICAjIHZlcmlmeSBldmVyeXRoaW5nIGlzIGNvcnJlY3QKKyAgICB+L2Rpc3QvcmVsZWFzZS90aHJpZnQkIHN2biBjb21taXQgLW0gIkFwYWNoZSBUaHJpZnQgMS4wLjAgb2ZmaWNpYWwgcmVsZWFzZSIgXAorICAgICAgICAtLXVzZXJuYW1lIDxhcGFjaGUtdXNlcm5hbWU+IC0tcGFzc3dvcmQgPGFwYWNoZS1wYXNzd29yZD4KKyAgICBgYGAKKworICAgICoqTk9URSoqIE9uZSB5b3UgY2hlY2sgaW4sIHlvdSBuZWVkIHRvIHdhaXQgYWJvdXQgYSBkYXkgZm9yIGFsbCB0aGUgbWlycm9ycyB0byB1cGRhdGUuICBZb3UgY2Fubm90IHNlbmQgdGhlIGFubm91bmNlbWVudCBlbWFpbCBvciB1cGRhdGUgdGhlIHdlYiBzaXRlIHVudGlsIHRoZSBtaXJyb3JzIGFyZSB1cGRhdGVkLgorCisxLiBDcmVhdGUgYW5kIHB1c2ggYSB0YWcgZm9yIHRoZSByZWxlYXNlLCBmb3IgZXhhbXBsZSAidjEuMC4wIi4KKworICAgICoqTk9URToqKiBBbGwgbmV3IHJlbGVhc2VzIG11c3QgaGF2ZSB0aGUgInYiIHByZWZpeCB0byBzYXRpc2Z5IHRoaXJkICBwYXJ0eSBwYWNrYWdlIG1hbmFnZXJzIChkbGFuZyBkdWIsIGdvbGFuZywgZXRjLi4pCisKKyAgICBgYGBiYXNoCisgICAgfi90aHJpZnQkICMgbWFrZSBzdXJlIHlvdSBhcmUgb24gdGhlIHJlbGVhc2UgYnJhbmNoCisgICAgfi90aHJpZnQkIGdpdCBjaGVja291dCByZWxlYXNlLzEuMC4wCisgICAgfi90aHJpZnQkIGdpdCBwdWxsCisgICAgfi90aHJpZnQkIGdpdCB0YWcgdjEuMC4wCisgICAgfi90aHJpZnQkIGdpdCBwdXNoIC0tdGFncworICAgIGBgYAorCisxLiBDcmVhdGUgYSBuZXcgcmVsZWFzZSBmcm9tIHRoZSBbR2l0SHViIFRhZ3MgUGFnZV0oaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvdGFncykuICBBdHRhY2ggdGhlIHN0YXRpY2FsbHkgYnVpbHQgV2luZG93cyB0aHJpZnQgY29tcGlsZXIgYXMgYSBiaW5hcnkgaGVyZS4KKworMS4gTWVyZ2UgdGhlIHJlbGVhc2UgYnJhbmNoIGludG8gbWFzdGVyLiAgVGhpcyBlbnN1cmVzIGFsbCBjaGFuZ2VzIG1hZGUgdG8gZml4IHVwIHRoZSByZWxlYXNlIGFyZSBpbiBtYXN0ZXIuCisKKyAgICBgYGBiYXNoCisgICAgfi90aHJpZnQkIGdpdCBjaGVja291dCBtYXN0ZXIKKyAgICB+L3RocmlmdCQgZ2l0IHB1bGwKKyAgICB+L3RocmlmdCQgZ2l0IG1lcmdlIHJlbGVhc2UvMS4wLjAKKyAgICBgYGAKKworICAgIFRoZSBtZXJnZSBvZiAxLjAuMCBpbnRvIG1hc3RlciBzaG91bGQgcHJvY2VlZCBhcyBhIGZhc3QtZm9yd2FyZCBzaW5jZSB0aGUgMS4wLjAgcmVsZWFzZSBicmFuY2guICBJZiB0aGVyZSBhcmUgZGlzY3JlcGFuY2llcyB0aGUgYmVzdCB0aGluZyB0byBkbyBpcyByZXNvbHZlIHRoZW0gYW5kIHRoZW4gc3VibWl0IGEgcHVsbCByZXF1ZXN0LiAgVGhpcyBwdWxsIHJlcXVlc3QgbXVzdCBiZSAqTUVSR0VEKiBhbmQgbm90ICpSRUJBU0VEKiBhZnRlciB0aGUgQ0kgYnVpbGQgaXMgc3VjY2Vzc2Z1bC4gIFlvdSBtYXkgd2FudCB0byBkbyB0aGlzIHlvdXJzZWxmIGFuZCBtYXJrIHRoZSBwdWxsIHJlcXVlc3QgYXMgYFtETyBOT1QgTUVSR0VdYC4KKworMS4gVXBkYXRlIHRoZSBBU0YgQ01TIGNvbnRlbnQgZm9yIHRocmlmdCB0byBpbmNsdWRlIHRoZSBuZXcgcmVsZWFzZS4gIE5vdGUgb3ZlciB0aW1lIHdlIHdpbGwgcmV0aXJlIHRoaXMgaW4gZmF2b3Igb2YgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uIGluIHRoZSBHaXRIdWIgcmVwb3NpdG9yeS4gIFRoZSBwYWdlIHdpdGggdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBpbXBvcnRhbnQgbGlrZSB0aGUgY3VycmVudCByZWxlYXNlIG9yIGRpc3RyaWJ1dGlvbiBsaW5rcyBpcyBpbiB0cnVuay9saWIvcGF0aC5wbSBpbiB0aGUgQVNGIENNUyBmb3IgdGhyaWZ0LgorCisgICAgMS4gR28gdG8gdGhlIFtBU0YgQ01TIGZvciBUaHJpZnRdKGh0dHBzOi8vY21zLmFwYWNoZS5vcmcvdGhyaWZ0LykuCisgICAgMS4gR2V0IGEgd29ya2luZyBjb3B5LgorICAgIDEuIE9uIHRoZSB0b3AgcmlnaHQsIGNsaWNrIG9uIGB0cnVua2AuCisgICAgMS4gTmF2aWdhdGUgaW50byBgbGliYC4KKyAgICAxLiBPcGVuIGBwYXRoLnBtYC4KKyAgICAxLiBFZGl0CisgICAgMS4gQ2hhbmdlIGBjdXJyZW50X3JlbGVhc2VgIGFuZCBgY3VycmVudF9yZWxlYXNlX2RhdGVgIHRvIHJlZmxlY3QgdGhlIGNvcnJlY3QgaW5mb3JtYXRpb24uCisgICAgMS4gU3VibWl0CisgICAgMS4gQ29tbWl0CisgICAgMS4gU3VibWl0CisgICAgMS4gRm9sbG93IFN0YWdpbmcgQnVpbGQgdW50aWwgaXQgY29tcGxldGVzLgorICAgIDEuIE9wZW4gdGhlIFN0YWdlZCBzaXRlLgorICAgIDEuIEVuc3VyZSB0aGUgZG93bmxvYWQgbGlua3Mgd29yay4KKyAgICAxLiBQdWJsaXNoIFNpdGUuCisKKzEuIE1ha2UgYW4gYW5ub3VuY2VtZW50IG9uIHRoZSBkZXZAIGFuZCB1c2VyQCBtYWlsaW5nIGxpc3RzIG9mIHRoZSByZWxlYXNlLiAgVGhlcmUncyBubyB0ZW1wbGF0ZSB0byBmb2xsb3csIGJ1dCB5b3UgY2FuIHBvaW50IGZvbGtzIHRvIHRoZSBvZmZpY2lhbCB3ZWIgc2l0ZSBhdCBodHRwczovL3RocmlmdC5hcGFjaGUub3JnLCBhbmQgdG8gdGhlIEdpdEh1YiBzaXRlIGF0IGh0dHBzOi8vZ2l0aHViLm9yZy9hcGFjaGUudGhyaWZ0LgorCisjIyMgUG9zdC1SZWxlYXNlCisKKzEuIFZpc2l0IGh0dHBzOi8vcmVwb3J0ZXIuYXBhY2hlLm9yZy9hZGRyZWxlYXNlLmh0bWw/dGhyaWZ0IGFuZCByZWdpc3RlciBpdC4gIFlvdSB3aWxsIGdldCBhbiBhdXRvbWF0ZWQgcmVtaW5kZXIgYXMgdGhlIG9uZSB3aG8gY29tbWl0dGVkIGludG8gZGlzdC4gIFRoaXMgaW5mb3JtcyB0aGUgQXBhY2hlIEJvYXJkIG9mIERpcmVjdG9ycyBvZiByZWxlYXNlcyB0aHJvdWdoIHByb2plY3QgcmVwb3J0cy4KKworMS4gQ3JlYXRlIGEgbG9jYWwgYnJhbmNoIHRvIGJ1bXAgdGhlIHJlbGVhc2UgbnVtYmVyIHRvIHRoZSBuZXh0IGFudGljaXBhdGVkIHJlbGVhc2U6CisKKyAgICBgYGBiYXNoCisgICAgfi90aHJpZnQkIGdpdCBjaGVja291dCAtYiBidW1wLW1hc3RlcgorICAgIH4vdGhyaWZ0JCBidWlsZC92ZXJhbGlnbi5zaCAxLjAuMCAxLjEuMAorICAgIGBgYAorCisgICAgVGhlIHZlcmFsaWduIHNjcmlwdCB3aWxsIHNldCB0aGUgdmVyc2lvbiBudW1iZXIgaW4gYWxsIG9mIHRoZSBsYW5ndWFnZSBwYWNrYWdpbmcgZmlsZXMgYW5kIGhlYWRlcnMuICBZb3UgZG8gbm90IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlIG1hbnVhbGx5IG1vZGlmaWVkIGZpbGVzIGF0IHRoaXMgdGltZS4gIFlvdSBzaG91bGQgaG93ZXZlciBlbnN1cmUgZXZlcnl0aGluZyBpcyBjb3JyZWN0IGJ5IGxvb2tpbmcgYXQgdGhlIGRpZmYuCisKKzEuIENyZWF0ZSBhIHB1bGwgcmVxdWVzdCB0byBhZHZhbmNlIG1hc3RlciB0byB0aGUgbmV4dCBhbnRpY2lwYXRlZCByZWxlYXNlLgorCisxLiBJbiBBcGFjaGUgSmlyYSwgc2VsZWN0IGFsbCB0aWNrZXRzIHdoZXJlIHRoZSBmaXggdmVyc2lvbiBpcyB0aGUgcmVsZWFzZSBhbmQgdGhlIHN0YXR1cyBpcyBub3QgY2xvc2VkIChbZXhhbXBsZV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/anFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBBTkQlMjBmaXhWZXJzaW9uJTIwJTNEJTIwMS4wJTIwJTIwYW5kJTIwc3RhdHVzJTIwISUzRCUyMENsb3NlZCkpIGFuZCB1c2UgdGhlIGJ1bGsgZWRpdGluZyB0b29sIHRvIGNsb3NlIHRoZW0uCisxLiAqKkZJWE1FKiogQXNrIHNvbWVvbmUgd2l0aCBhZG1pbiBhY2Nlc3MgdG8gQXBhY2hlIEppcmEgdG8gY2hhbmdlIHRoZSBmaXhWZXJzaW9uIGluIHF1ZXN0aW9uIGZyb20gdW5yZWxlYXNlZCB0byByZWxlYXNlZCwgZm9yIGV4YW1wbGU6CisgICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY4NgorCisxLiBFbnN1cmUgdGhhdCB0aGUgW0ppcmEgcmVsZWFzZSBwYWdlXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvcHJvamVjdHMvVEhSSUZUP3NlbGVjdGVkSXRlbT1jb20uYXRsYXNzaWFuLmppcmEuamlyYS1wcm9qZWN0cy1wbHVnaW4lM0FyZWxlYXNlLXBhZ2Umc3RhdHVzPXVucmVsZWFzZWQpIGZvciB0aGUgdmVyc2lvbiBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIGlzc3VlcyBpbiB0aGUgdmVyc2lvbiBhcyBpc3N1ZXMgZG9uZSwgYW5kIHRoYXQgdGhlcmUgYXJlIG5vIGlzc3VlcyBpbiBwcm9ncmVzcyBhbmQgbm8gaXNzdWVzIHRvIGRvLCBhbmQgbm8gd2FybmluZ3MuCisgIAorKiBbUmVwb3J0IGFueSBDVkVzXShodHRwczovL2FwYWNoZS5vcmcvc2VjdXJpdHkvY29tbWl0dGVycy5odG1sKSB0aGF0IHdlcmUgZml4ZWQuICBZb3UgY2FuIGVtYWlsIGBzZWN1cml0eUBhcGFjaGUub3JnYCBpZiB5b3UgYXJlIG5vdCBzdXJlIGlmIHRoZXJlIGFyZSBhbnkgQ1ZFcyB0byByZXBvcnQuCisKKyMjIyMgVGhpcmQgUGFydHkgUGFja2FnZSBNYW5hZ2VycworCitTZWUgaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy9saWIvIGZvciB0aGUgY3VycmVudCBzdGF0dXMgb2YgZWFjaCBleHRlcm5hbCBwYWNrYWdlIG1hbmFnZXIncyBkaXN0cmlidXRpb24uICBJbmZvcm1hdGlvbiBiZWxvdyBpcyBmcm9tIHRoZSAwLjEyLjAgcmVsZWFzZToKKworKiBbZGFydF0gUmVsZWFzaW5nIHRoaXMgcmVxdWlyZXMgYSBnb29nbGUgYWNjb3VudC4KKyAgKiBZb3Ugd2lsbCBuZWVkIHRvIGluc3RhbGwgdGhlIHNhbWUgdmVyc2lvbiBvZiBkYXJ0IHRoYXQgaXMgdXNlZCBpbiB0aGUgZG9ja2VyIGltYWdlLgorICAqIEdvIGludG8gbGliL2RhcnQgYW5kIHJ1biAicHViIHB1Ymxpc2ggLS1kcnktcnVuIiBhbmQgcmVzb2x2ZSBhbnkgd2FybmluZ3MuCisgICogUnVuICJwdWIgcHVibGlzaCIgYW5kIGdvIHRocm91Z2ggdGhlIGdvb2dsZSBhY2NvdW50IGF1dGhvcml6YXRpb24gdG8gYWxsb3cgaXQuCisqIFtkbGFuZ10gV2l0aGluIGEgZGF5LCB0aGUgZGxhbmcgZHViIHNpdGUgaHR0cHM6Ly9jb2RlLmRsYW5nLm9yZy9wYWNrYWdlcy9hcGFjaGUtdGhyaWZ0P3RhYj1pbmZvCisgIHNob3VsZCBwaWNrIHVwIHRoZSByZWxlYXNlIGJhc2VkIG9uIHRoZSB0YWcuICBObyBhY3Rpb24gbmVlZGVkLgorKiBbaGFza2VsbF0gaHR0cHM6Ly9oYWNrYWdlLmhhc2tlbGwub3JnL3BhY2thZ2UvdGhyaWZ0CisgICAgaHR0cHM6Ly9qaXJhLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ2OTgKKyogW25wbWpzXSBAamZhcnJlbGwgaXMgdGhlIG9ubHkgb25lIHdobyBjYW4gZG8gdGhpcyByaWdodCBub3cuCisgICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY4OAorKiBbcGVybF0gQSBzdWJtaXNzaW9uIHRvIENQQU4gaXMgbmVjZXNzYXJ5IChub3JtYWxseSBqZWtpbmczIGRvZXMgdGhpcyk6CisgICogQ2hlY2tvdXQgdGhlIHJlbGVhc2UgYnJhbmNoIG9yIHRhZyBvbiBhIGxpbnV4IHN5c3RlbS4KKyAgKiBGaXJlIHVwIHRoZSBkb2NrZXIgYnVpbGQgY29udGFpbmVyLgorICAqIFJ1biAibWFrZSBjbGVhbiIgYW5kIHJlbW92ZSBhbnkgZ2VuLXBlcmwgZGlyZWN0b3JpZXMuCisgICogSW5zaWRlIGBsaWIvcGVybGAgcnVuIHRoZSBzY3JpcHQgYGJ1aWxkLWNwYW4tZGlzdC5zaGAuCisgICogVXBsb2FkIHRoZSByZXN1bHRpbmcgcGFja2FnZS4gIElmIHRoZXJlJ3MgYSBtaXN0YWtlIHRoYXQgbmVlZHMgdG8gYmUgY29ycmVjdGVkLAorICAgIGluY3JlYXNlIHRoZSBzdWZmaXguIChfMSwgXzIsIC4uLikgYW5kIHVwbG9hZCBhbm90aGVyLiAgWW91IGNhbm5vdCByZXBsYWNlIGEgcmVsZWFzZSBvbiBDUEFOLgorKiBbcGhwXSBAamZhcnJlbGwsIEBidWZmZXJvdmVyZmxvdywgQGpla2luZzMgYXJlIHRoZSBvbmx5IG9uZXMgd2hvIGNhbiBkbyB0aGlzIHJpZ2h0IG5vdy4KKyAgKiBPbmNlIHRoZSByZWxlYXNlIGlzIHRhZ2dlZCwgb25lIGp1c3QgaGFzIHRvIGhpdCB0aGUgIlVwZGF0ZSIgYnV0dG9uIHRvIHBpY2sgaXQgdXAuCisqIFtweXBpXSBAamZhcnJlbGwgaXMgdGhlIG9ubHkgb25lIHdobyBjYW4gZG8gdGhpcyByaWdodCBub3cuCisgICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDY4NworKiBbcnVzdF0gQW55IHRocmlmdCBwcm9qZWN0IGNvbW1pdHRlciBpcyBhbGxvd2VkIHRvIHVwbG9hZCBhIG5ldyBjcmF0ZS4KKworSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBlbWFpbCBgZGV2QHRocmlmdC5hcGFjaGUub3JnYC4KZGlmZiAtLWdpdCBhL2RvYy9jb21taXR0ZXJzLm1kIGIvZG9jL2NvbW1pdHRlcnMubWQKaW5kZXggYjAyZWRiZS4uZGNkZDdiNyAxMDA2NDQKLS0tIGEvZG9jL2NvbW1pdHRlcnMubWQKKysrIGIvZG9jL2NvbW1pdHRlcnMubWQKQEAgLTQsNyArNCw3IEBACiAKIDEuIENoZWNrIG91dCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNvdXJjZSBjb2RlCiAKLSAgKiBnaXQgY2xvbmUgaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQgdGhyaWZ0CisgICogZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCB0aHJpZnQKIAogMS4gQXBwbHkgdGhlIHBhdGNoCiAKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY2dybi5wbmcgYi9kb2MvaW1hZ2VzL2Nncm4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDk2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2Nncm4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY3JlZC5wbmcgYi9kb2MvaW1hZ2VzL2NyZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NmE1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2NyZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY3JlZGZ1bGwucG5nIGIvZG9jL2ltYWdlcy9jcmVkZnVsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2NjQwNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvY3JlZGZ1bGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY3llbC5wbmcgYi9kb2MvaW1hZ2VzL2N5ZWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMWRmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2N5ZWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvdGhyaWZ0LWxheWVycy5wbmcgYi9kb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWNjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL1JFQURNRS5tZCBiL2RvYy9pbnN0YWxsL1JFQURNRS5tZAppbmRleCBlMzdmNGZmLi4yMjIzMWNkIDEwMDY0NAotLS0gYS9kb2MvaW5zdGFsbC9SRUFETUUubWQKKysrIGIvZG9jL2luc3RhbGwvUkVBRE1FLm1kCkBAIC0yNyw3ICsyNyw3IEBACiAgICAgKiBsaWJldmVudCAob3B0aW9uYWwsIHRvIGJ1aWxkIHRoZSBub25ibG9ja2luZyBzZXJ2ZXIpCiAgICAgKiB6bGliIChvcHRpb25hbCkKICogSmF2YQotICAgICogSmF2YSAxLjcKKyAgICAqIEphdmEgMS44CiAgICAgKiBBcGFjaGUgQW50CiAqIEMjOiBNb25vIDEuMi40IChhbmQgcGtnLWNvbmZpZyB0byBkZXRlY3QgaXQpIG9yIFZpc3VhbCBTdHVkaW8gMjAwNSsKICogUHl0aG9uIDIuNiAoaW5jbHVkaW5nIGhlYWRlciBmaWxlcyBmb3IgZXh0ZW5zaW9uIG1vZHVsZXMpCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC9jZW50b3MubWQgYi9kb2MvaW5zdGFsbC9jZW50b3MubWQKaW5kZXggNjA5ZTExOC4uMDQ5MzJjMiAxMDA2NDQKLS0tIGEvZG9jL2luc3RhbGwvY2VudG9zLm1kCisrKyBiL2RvYy9pbnN0YWxsL2NlbnRvcy5tZApAQCAtNjQsNyArNjQsNyBAQAogCiAjIyBCdWlsZCBhbmQgSW5zdGFsbCB0aGUgQXBhY2hlIFRocmlmdCBJREwgQ29tcGlsZXIKIAotCWdpdCBjbG9uZSBodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdAorCWdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQKIAljZCB0aHJpZnQKIAkuL2Jvb3RzdHJhcC5zaAogCS4vY29uZmlndXJlIC0td2l0aC1sdWE9bm8KZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL2RlYmlhbi5tZCBiL2RvYy9pbnN0YWxsL2RlYmlhbi5tZAppbmRleCBhNDM0NGM3Li44NGY2OTZlIDEwMDY0NAotLS0gYS9kb2MvaW5zdGFsbC9kZWJpYW4ubWQKKysrIGIvZG9jL2luc3RhbGwvZGViaWFuLm1kCkBAIC0xLDIxICsxLDI3IEBACi0jIyBEZWJpYW4gb3IgVWJ1bnR1IHNldHVwCi1UaGUgZm9sbG93aW5nIGNvbW1hbmQgaW5zdGFsbCBhbGwgdGhlIHJlcXVpcmVkIHRvb2xzIGFuZCBsaWJyYXJpZXMgdG8gYnVpbGQgYW5kIGluc3RhbGwgdGhlIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgb24gYSBEZWJpYW4vVWJ1bnR1IExpbnV4IGJhc2VkIHN5c3RlbS4KKyMjIERlYmlhbi9VYnVudHUgaW5zdGFsbAorVGhlIGZvbGxvd2luZyBjb21tYW5kIHdpbGwgaW5zdGFsbCB0b29scyBhbmQgbGlicmFyaWVzIHJlcXVpcmVkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIGFuZCBDKysgbGlicmFyaWVzIG9uIGEgRGViaWFuL1VidW50dSBMaW51eCBiYXNlZCBzeXN0ZW0uCiAKLQlzdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJib29zdC1kZXYgbGliYm9vc3QtdGVzdC1kZXYgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBsaWJib29zdC1zeXN0ZW0tZGV2IGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IGxpYmV2ZW50LWRldiBhdXRvbWFrZSBsaWJ0b29sIGZsZXggYmlzb24gcGtnLWNvbmZpZyBnKysgbGlic3NsLWRldiBhbnQKKwlzdWRvIGFwdC1nZXQgaW5zdGFsbCBhdXRvbWFrZSBiaXNvbiBmbGV4IGcrKyBnaXQgbGliYm9vc3QtYWxsLWRldiBsaWJldmVudC1kZXYgbGlic3NsLWRldiBsaWJ0b29sIG1ha2UgcGtnLWNvbmZpZwogCi1UaGVuIGluc3RhbGwgdGhlIEphdmEgSkRLIG9mIHlvdXIgY2hvaWNlLiBUeXBlICoqamF2YWMqKiB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYWNrYWdlcywgcGljayB0aGUgb25lIHlvdSBwcmVmZXIgYW5kICoqYXB0LWdldCBpbnN0YWxsKiogaXQuCitEZWJpYW4gNy9VYnVudHUgMTIgdXNlcnMgbmVlZCB0byBtYW51YWxseSBpbnN0YWxsIGEgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiBhdXRvbWFrZSBhbmQgKGZvciBDKysgbGlicmFyeSBhbmQgdGVzdCBzdXBwb3J0KSBib29zdDoKIAotRGViaWFuIHN0YWJsZSB1c2VycyBuZWVkIHRvIG1hbnVhbGx5IGluc3RhbGwgYSBtb3JlIHJlY2VudCBhdXRvbWFrZSB2ZXJzaW9uOgorICAgIHdnZXQgaHR0cDovL2Z0cC5kZWJpYW4ub3JnL2RlYmlhbi9wb29sL21haW4vYS9hdXRvbWFrZS0xLjE1L2F1dG9tYWtlXzEuMTUtM19hbGwuZGViCisgICAgc3VkbyBkcGtnIC1pIGF1dG9tYWtlXzEuMTUtM19hbGwuZGViCiAKLSAgICB3Z2V0IGh0dHA6Ly9mdHAuZGViaWFuLm9yZy9kZWJpYW4vcG9vbC9tYWluL2EvYXV0b21ha2UtMS4xNC9hdXRvbWFrZV8xLjE0LjEtM19hbGwuZGViCi0gICAgc3VkbyBkcGtnIC1pIGF1dG9tYWtlXzEuMTQuMS0zX2FsbC5kZWIKKyAgICB3Z2V0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYm9vc3QvZmlsZXMvYm9vc3QvMS42MC4wL2Jvb3N0XzFfNjBfMC50YXIuZ3ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyIHh2ZiBib29zdF8xXzYwXzAudGFyLmd6CisgICAgY2QgYm9vc3RfMV82MF8wCisgICAgLi9ib290c3RyYXAuc2gKKyAgICBzdWRvIC4vYjIgaW5zdGFsbAogCiAjIyBPcHRpb25hbCBwYWNrYWdlcwogCi1Tb21lIG90aGVyIHBhY2thZ2VzIGRlcGVuZCBvbiB3aGF0IGxhbmd1YWdlcyB5b3Ugd2FudCBUaHJpZnQgdG8gc3VwcG9ydC4KK0lmIHlvdSB3b3VsZCBsaWtlIHRvIGJ1aWxkIEFwYWNoZSBUaHJpZnQgbGlicmFyaWVzIGZvciBvdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZXMgeW91IG1heSBuZWVkIHRvIGluc3RhbGwgYWRkaXRpb25hbCBwYWNrYWdlcy4gVGhlIGZvbGxvd2luZyBsYW5ndWFnZXMgcmVxdWlyZSB0aGUgc3BlY2lmaWVkIGFkZGl0aW9uYWwgcGFja2FnZXM6CiAKLSAqIFJ1YnkgCi0JKiBydWJ5LWZ1bGwgcnVieS1kZXYgcnVieS1yc3BlYyByYWtlIHJ1YnlnZW1zIGxpYmRhZW1vbnMtcnVieSBsaWJnZW1wbHVnaW4tcnVieSBtb25ncmVsCisgKiBKYXZhCisJKiBwYWNrYWdlczogYW50ICAKKwkqIFlvdSB3aWxsIGFsc28gbmVlZCBKYXZhIEpESyB2MS44IG9yIGhpZ2hlci4gVHlwZSAqKmphdmFjKiogdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFja2FnZXMsIHBpY2sgdGhlIG9uZSB5b3UgcHJlZmVyIGFuZCAqKmFwdC1nZXQgaW5zdGFsbCoqIGl0IChlLmcuIGRlZmF1bHQtamRrKS4KKyAqIFJ1YnkKKwkqIHJ1YnktZnVsbCBydWJ5LWRldiBydWJ5LXJzcGVjIHJha2UgcnVieWdlbXMgYnVuZGxlcgogICogUHl0aG9uCiAJKiBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnCiAgKiBQZXJsCkBAIC0yNSwxNCArMzEsMjkgQEAKICAqIENfZ2xpYgogCSogbGliZ2xpYjIuMC1kZXYKICAqIEVybGFuZwotCSogZXJsYW5nLWJhc2UgZXJsYW5nLWV1bml0IGVybGFuZy1kZXYKKwkqIGVybGFuZy1iYXNlIGVybGFuZy1ldW5pdCBlcmxhbmctZGV2IHJlYmFyCiAgKiBDc2hhcnAKIAkqIG1vbm8tZ21jcyBtb25vLWRldmVsIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwgbnVuaXQgbnVuaXQtY29uc29sZQogICogSGFza2VsbAotCSogZ2hjNiBjYWJhbC1pbnN0YWxsIGxpYmdoYzYtYmluYXJ5LWRldiBsaWJnaGM2LW5ldHdvcmstZGV2IGxpYmdoYzYtaHR0cC1kZXYKKwkqIGdoYyBjYWJhbC1pbnN0YWxsIGxpYmdoYy1iaW5hcnktZGV2IGxpYmdoYy1uZXR3b3JrLWRldiBsaWJnaGMtaHR0cC1kZXYKICAqIFRocmlmdCBDb21waWxlciBmb3IgV2luZG93cwotCSogbWluZ3czMiBtaW5ndzMyLWJpbnV0aWxzIG1pbmd3MzItcnVudGltZSBuc2lzCi0KKwkqIG1pbmd3LXc2NCBtaW5ndy13NjQteDg2LTY0LWRldiBuc2lzCisgKiBSdXN0CisJKiBydXN0YyBjYXJnbworICogSGF4ZQorCSogaGF4ZQorICogTHVhCisgICAgKiBsdWE1LjMgbGlibHVhNS4zLWRldgorICogTm9kZUpzCisgICAgKiBub2RlanMgbnBtCisgKiBkb3RuZXRjb3JlCisgICAgKiBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL25ldC9sZWFybi9nZXQtc3RhcnRlZC9saW51eHVidW50dQorICogZC1sYW5nCisgICAgKiBjdXJsIC1mc1MgaHR0cHM6Ly9kbGFuZy5vcmcvaW5zdGFsbC5zaCB8IGJhc2ggLXMgZG1kCisgKiBkYXJ0ICYgcHViCisgICAgKiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvaW5zdGFsbC9saW51eAorICAgICogaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL3Rvb2xzL3B1Yi9pbnN0YWxsaW5nCisJCiAKICMjIEFkZGl0aW9uYWwgcmVhZGluZwogCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC93aW5kb3dzLm1kIGIvZG9jL2luc3RhbGwvd2luZG93cy5tZAppbmRleCA3YjA5ODQwLi44NjE4OTM0IDEwMDY0NAotLS0gYS9kb2MvaW5zdGFsbC93aW5kb3dzLm1kCisrKyBiL2RvYy9pbnN0YWxsL3dpbmRvd3MubWQKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiBNYWtlIHN1cmUgeW91IGhhdmUgamF2YSBpbiB5b3VyICRQQVRIIHZhcmlhYmxlLCBpZiBub3QgZG8oYWRqdXN0IHBhdGggaWYgbmVjZXNzYXJ5KToKIAotCWV4cG9ydCBQQVRIPSRQQVRIOiIvY3lnZHJpdmUvYy9wcm9ncmFtIGZpbGVzL2phdmEvanJlMS42LjBfMDUvYmluIgorCWV4cG9ydCBQQVRIPSRQQVRIOiIvY3lnZHJpdmUvYy9wcm9ncmFtIGZpbGVzL2phdmEvanJlMS44LjBfMTkxL2JpbiIKIAogUnVuIGNvbmZpZ3VyZSAtIHVzaW5nIENYWEZMQUdTIHRvIHdvcmsgYXJvdW5kIGFuIGlzc3VlIHdpdGggYW4gb2xkIHB0aHJlYWRzIGRlZmluZSAodW50ZXN0ZWQgb24gTWluR1cgLSB3b3JrcyBvbiBDeWd3aW4pOgogCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvSGVhZGVyRm9ybWF0Lm1kIGIvZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmVjN2FlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZApAQCAtMCwwICsxLDgyIEBACis8bGluayBocmVmPSJodHRwOi8va2V2aW5idXJrZS5iaXRidWNrZXQub3JnL21hcmtkb3duY3NzL21hcmtkb3duLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij48L2xpbms+CisKK0hlYWRlciBmb3JtYXQgZm9yIHRoZSBUSGVhZGVyLmgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAwfCAgICAgICAgICAgICAgICAgICAgICAgICAgTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAwfCAgICAgICBIRUFERVIgTUFHSUMgICAgICAgICAgfCAgICAgICAgICAgIEZMQUdTICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBTRVFVRU5DRSBOVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAwfCAgICAgSGVhZGVyIFNpemUoLzMyKSAgICAgICAgfCAuLi4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaXMgb2YgdmFyaWFibGUgc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzdGFydHMgYXQgb2Zmc2V0IDE0KQorCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgIFBST1RPQ09MIElEICAodmFyaW50KSAgfCAgIE5VTSBUUkFOU0ZPUk1TICh2YXJpbnQpICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgIFRSQU5TRk9STSAwIElEICh2YXJpbnQpICAgfCAgICAgICAgVFJBTlNGT1JNIDAgREFUQSAuLi4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICBJTkZPIDAgSUQgKHZhcmludCkgICAgICB8ICAgICAgIElORk8gMCAgREFUQSAuLi4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFZTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworVGhlIGBMRU5HVEhgIGZpZWxkIGlzIDMyIGJpdHMsIGFuZCBjb3VudHMgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUKK3BhY2tldCwgTk9UIGluY2x1ZGluZyB0aGUgbGVuZ3RoIGZpZWxkLiAgVGhlIGhlYWRlciBzaXplIGZpZWxkIGlzIDE2CitiaXRzLCBhbmQgZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyIHJlbWFpbmluZyBOT1QgaW5jbHVkaW5nIHRoZQorYEhFQURFUiBNQUdJQ2AsIGBGTEFHU2AsIGBTRVFVRU5DRSBOVU1CRVJgIGFuZCBoZWFkZXIgc2l6ZSBmaWVsZHMuICBUaGUKK0hlYWRlciBzaXplIGZpZWxkIGlzIGluIGJ5dGVzLzQuCisKK1RoZSB0cmFuc2Zvcm0gSUQncyBhcmUgdmFyaW50cy4gIFRoZSBkYXRhIGZvciBlYWNoIHRyYW5zZm9ybSBpcworZGVmaW5lZCBieSB0aGUgdHJhbnNmb3JtIElEIGluIHRoZSBjb2RlIC0gbm8gc2l6ZSBpcyBnaXZlbiBpbiB0aGUKK2hlYWRlci4gIElmIGEgdHJhbnNmb3JtIElEIGlzIHNwZWNpZmllZCBmcm9tIGEgY2xpZW50IGFuZCB0aGUgc2VydmVyCitkb2Vzbid0IGtub3cgYWJvdXQgdGhlIHRyYW5zZm9ybSBJRCwgYW4gZXJyb3IgTVVTVCBiZSByZXR1cm5lZCBhcyB3ZQorZG9uJ3Qga25vdyBob3cgdG8gdHJhbnNmb3JtIHRoZSBkYXRhLgorCitDb252ZXJzZWx5LCBkYXRhIGluIHRoZSBpbmZvIGhlYWRlcnMgaXMgaWdub3JhYmxlLiAgVGhpcyBzaG91bGQgb25seQorYmUgdGhpbmdzIGxpa2UgdGltZXN0YW1wcywgZGVidWdpbmcgdHJhY2luZywgZXRjLiAgVXNpbmcgdGhlIGhlYWRlcgorc2l6ZSB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gc2tpcCB0aGlzIGRhdGEgYW5kIHJlYWQgdGhlIHBheWxvYWQgc2FmZWx5CitpZiB5b3UgZG9uJ3Qga25vdyB0aGUgaW5mbyBJRC4KKworSW5mbydzIHNob3VsZCBiZSBvbGRlc3Qgc3VwcG9ydGVkIHRvIG5ld2VzdCBzdXBwb3J0ZWQgb3JkZXIsIHNvIHRoYXQKK2lmIHdlIHJlYWQgYW4gaW5mbyBJRCB3ZSBkb24ndCBzdXBwb3J0LCBub25lIG9mIHRoZSByZW1haW5pbmcgaW5mbworSUQncyB3aWxsIGJlIHN1cHBvcnRlZCBlaXRoZXIsIGFuZCB3ZSBjYW4gc2FmZWx5IHNraXAgdG8gdGhlIHBheWxvYWQuCisKK0luZm8gSUQncyBhbmQgdHJhbnNmb3JtIElEJ3Mgc2hvdWxkIHNoYXJlIHRoZSBzYW1lIElEIHNwYWNlLgorCisjIyMgUEFERElORzoKKworSGVhZGVyIHdpbGwgYmUgcGFkZGVkIG91dCB0byBuZXh0IDQtYnl0ZSBib3VuZGFyeSB3aXRoIGAweDAwYC4KKworTWF4IGZyYW1lIHNpemUgaXMgYDB4M0ZGRkZGRkZgLCB3aGljaCBpcyBzbGlnaHRseSBsZXNzIHRoYW4gYEhUVFBfTUFHSUNgLgorVGhpcyBhbGxvd3MgdXMgdG8gZGlzdGluZ3VzaCBiZXR3ZWVuIGRpZmZlcmVudCAob2xkZXIpIHRyYW5zcG9ydHMuCisKKyMjIyBUcmFuc2Zvcm0gSURzOgorCisgICAgWkxJQl9UUkFOU0ZPUk0gMHgwMSAtIE5vIGRhdGEgZm9yIHRoaXMuICBVc2UgemxpYiB0byAoZGUpY29tcHJlc3MgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuCisKKyAgICBITUFDX1RSQU5TRk9STSAweDAyIC0gVmFyaWFibGUgYW1vdW50IG9mIG1hYyBkYXRhLiAgT25lIGJ5dGUgdG8gc3BlY2lmeQorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLiBNYWMgZGF0YSBpcyBhcHBlbmRlZCBhdCB0aGUgZW5kIG9mIHRoZSBwYWNrZXQuCisgICAgU05BUFBZX1RSQU5TRk9STSAgMHgwMyAgLSBObyBkYXRhIGZvciB0aGlzLiAgVXNlIHNuYXBweSB0byAoZGUpY29tcHJlc3MgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuCisKKworIyMjSW5mbyBJRHM6CisKKyAgICBJTkZPX0tFWVZBTFVFIDB4MDEgLSB2YXJpbnQzMiBudW1iZXIgb2YgaGVhZGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgLSBrZXkvdmFsdWUgcGFpcnMgb2YgdmFyc3RyaW5ncyAodmFyaW50MTYgbGVuZ3RoIHBsdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBuby10cmFpbGluZy1udWxsIHN0cmluZykuCisKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy9TZXF1ZW5jZU51bWJlcnMubWQgYi9kb2Mvc3BlY3MvU2VxdWVuY2VOdW1iZXJzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZjNmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvU2VxdWVuY2VOdW1iZXJzLm1kCkBAIC0wLDAgKzEsMjMgQEAKKyMgU2VxdWVuY2UgTnVtYmVyICMKKworQXBhY2hlIFRocmlmdCBidWlsdCBzZXF1ZW5jZSBudW1iZXJzIGludG8gZXZlcnkgcHJvdG9jb2wgZXhjaGFuZ2UgdG8gYWxsb3cKK2ZvciBjbGllbnRzIHRoYXQgbWF5IHN1Ym1pdCBtdWx0aXBsZSBvdXRzdGFuZGluZyByZXF1ZXN0cyBvbiBhIHNpbmdsZSB0cmFuc3BvcnQKK2Nvbm5lY3Rpb24uICBUaGlzIGlzIHR5cGljYWxseSBkb25lIGJ5IGFzeW5jaHJvbm91cyBjbGllbnRzLgorCitUaGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5IHRvIHNlcXVlbmNlIG51bWJlcnM6CisKKzEuIEEgc2VxdWVuY2UgbnVtYmVyIGlzIGEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLiAgTmVnYXRpdmUgdmFsdWVzIGFyZSBhbGxvd2VkLgorMS4gU2VxdWVuY2UgbnVtYmVycyBgTVVTVGAgYmUgdW5pcXVlIGFjcm9zcyBhbGwgb3V0c3RhbmRpbmcgcmVxdWVzdHMgb24gYQorICAgZ2l2ZW4gdHJhbnNwb3J0IGNvbm5lY3Rpb24uICBUaGVyZSBpcyBubyByZXF1aXJlbWVudCBmb3IgdW5pcXVlIG51bWJlcnMKKyAgIGJldHdlZW4gZGlmZmVyZW50IHRyYW5zcG9ydCBjb25uZWN0aW9ucyBldmVuIGlmIHRoZXkgYXJlIGZyb20gdGhlIHNhbWUgY2xpZW50LgorMS4gQSBzZXJ2ZXIgYE1VU1RgIHJlcGx5IHRvIGEgY2xpZW50IHdpdGggdGhlIHNhbWUgc2VxdWVuY2UgbnVtYmVyIHRoYXQgd2FzCisgICB1c2VkIGluIHRoZSByZXF1ZXN0LiAgVGhpcyBpbmNsdWRlcyBhbnkgZXhjZXB0aW9uLWJhc2VkIHJlcGx5LgorMS4gQSBjbGllbnQgYE1BWWAgdXNlIHNlcXVlbmNlIG51bWJlcnMgaWYgaXQgbmVlZHMgdGhlbSBmb3IgcHJvcGVyIG9wZXJhdGlvbi4KKzEuIEEgY2xpZW50IGBTSE9VTERgIHNldCB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIHplcm8gaWYgaXQgZG9lcyBub3QgcmVseQorICAgb24gdGhlbS4KKzEuIFdyYXBwZWQgcHJvdG9jb2xzIChzdWNoIGFzIFRIZWFkZXJQcm90b2NvbCkgYFNIT1VMRGAgdXNlIHRoZSBzYW1lIHNlcXVlbmNlCisgICBudW1iZXIgb24gdGhlIHdyYXBwaW5nIGFzIGlzIHVzZWQgb24gdGhlIHBheWxvYWQgcHJvdG9jb2wuCisKK1NlcnZlcnMgd2lsbCBub3QgaW5zcGVjdCBvciBtYWtlIGFueSBsb2dpYyBjaG9pY2VzIGJhc2VkIG9uIHRoZSBzZXF1ZW5jZSBudW1iZXIKK3NlbnQgYnkgdGhlIGNsaWVudC4gIFRoZSBzZXJ2ZXIncyBvbmx5IGpvYiBpcyB0byBwcm9jZXNzIHRoZSByZXF1ZXN0IGFuZCByZXBseQord2l0aCB0aGUgc2FtZSBzZXF1ZW5jZSBudW1iZXIuCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvaWRsLm1kIGIvZG9jL3NwZWNzL2lkbC5tZAppbmRleCA2ZGE0Njk2Li41MjRmNGU3IDEwMDY0NAotLS0gYS9kb2Mvc3BlY3MvaWRsLm1kCisrKyBiL2RvYy9zcGVjcy9pZGwubWQKQEAgLTEsMTAgKzEsMTEgQEAKICMjIFRocmlmdCBpbnRlcmZhY2UgZGVzY3JpcHRpb24gbGFuZ3VhZ2UKKworRm9yIFRocmlmdCB2ZXJzaW9uIDAuMTMuMC4KKwogVGhlIFRocmlmdCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZSAoSURMKSBhbGxvd3MgZm9yIHRoZSBkZWZpbml0aW9uIG9mIFtUaHJpZnQgVHlwZXNdKC9kb2NzL3R5cGVzKS4gQSBUaHJpZnQgSURMIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBUaHJpZnQgY29kZSBnZW5lcmF0b3IgdG8gcHJvZHVjZSBjb2RlIGZvciB0aGUgdmFyaW91cyB0YXJnZXQgbGFuZ3VhZ2VzIHRvIHN1cHBvcnQgdGhlIGRlZmluZWQgc3RydWN0cyBhbmQgc2VydmljZXMgaW4gdGhlIElETCBmaWxlLgogCiAjIyBEZXNjcmlwdGlvbgogCi0qVW5kZXIgY29uc3RydWN0aW9uKgotCiBIZXJlIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIFRocmlmdCBJREwuCiAKICMjIERvY3VtZW50CkBAIC0zNSwzMiArMzYsOSBAQAogCiBBIG5hbWVzcGFjZSBkZWNsYXJlcyB3aGljaCBuYW1lc3BhY2VzL3BhY2thZ2UvbW9kdWxlL2V0Yy4gdGhlIHR5cGUgZGVmaW5pdGlvbnMgaW4gdGhpcyBmaWxlIHdpbGwgYmUgZGVjbGFyZWQgaW4gZm9yIHRoZSB0YXJnZXQgbGFuZ3VhZ2VzLiBUaGUgbmFtZXNwYWNlIHNjb3BlIGluZGljYXRlcyB3aGljaCBsYW5ndWFnZSB0aGUgbmFtZXNwYWNlIGFwcGxpZXMgdG87IGEgc2NvcGUgb2YgJyonIGluZGljYXRlcyB0aGF0IHRoZSBuYW1lc3BhY2UgYXBwbGllcyB0byBhbGwgdGFyZ2V0IGxhbmd1YWdlcy4KIAotICAgIFs1XSAgTmFtZXNwYWNlICAgICAgIDo6PSAgKCAnbmFtZXNwYWNlJyAoIE5hbWVzcGFjZVNjb3BlIElkZW50aWZpZXIgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJ3NtYWxsdGFsay5jYXRlZ29yeScgU1RJZGVudGlmaWVyICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICdzbWFsbHRhbGsucHJlZml4JyBJZGVudGlmaWVyICkgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICdwaHBfbmFtZXNwYWNlJyBMaXRlcmFsICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAneHNkX25hbWVzcGFjZScgTGl0ZXJhbCApCisgICAgWzVdICBOYW1lc3BhY2UgICAgICAgOjo9ICAoICduYW1lc3BhY2UnICggTmFtZXNwYWNlU2NvcGUgSWRlbnRpZmllciApICkKIAotICAgIFs2XSAgTmFtZXNwYWNlU2NvcGUgIDo6PSAgJyonIHwgJ2NwcCcgfCAnamF2YScgfCAncHknIHwgJ3BlcmwnIHwgJ3JiJyB8ICdjb2NvYScgfCAnY3NoYXJwJwotCi1OLkIuOiBTbWFsbHRhbGsgaGFzIHR3byBkaXN0aW5jdCB0eXBlcyBvZiBuYW1lc3BhY2UgY29tbWFuZHM6Ci0KLS0gc21hbGx0YWxrLnByZWZpeDogUHJlcGVuZGVkIHRvIGdlbmVyYXRlZCBjbGFzc25hbWVzLgotICAtIFNtYWxsdGFsayBkb2VzIG5vdCBoYXZlIG5hbWVzcGFjZXMgZm9yIGNsYXNzZXMsIHNvIHByZWZpeGVzCi0gICAgYXJlIHVzZWQgdG8gYXZvaWQgY2xhc3MtbmFtZSBjb2xsaXNpb25zLgotICAgIE9mdGVuLCB0aGUgcHJlZml4IGlzIHRoZSBhdXRob3IncyBpbml0aWFscywgbGlrZSAiS0IiIG9yICJKV1MiLAotICAgIG9yIGFuIGFiYnJldmlhdGlvbiBvZiB0aGUgcGFja2FnZSBuYW1lLCBsaWtlICJNQyIgZm9yICJNb250aWNlbGxvIi4KLS0gc21hbGx0YWxrLmNhdGVnb3J5OiBEZXRlcm1pbmVzIHRoZSBjYXRlZ29yeSBmb3IgZ2VuZXJhdGVkIGNsYXNzZXMuCi0gIEFueSBkb3RzIGluIHRoZSBpZGVudGlmaWVyIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBoeXBoZW5zIHdoZW4gZ2VuZXJhdGluZwotICB0aGUgY2F0ZWdvcnkgbmFtZS4KLSAgSWYgbm90IHByb3ZpZGVkLCBkZWZhdWx0cyB0byAiR2VuZXJhdGVkLSIgKyB0aGUgcHJvZ3JhbSBuYW1lLgotICBNZXRob2RzIHdpbGwgbm90IGJlIGNhdGVnb3JpemVkIGJleW9uZCAiYXMgeWV0IHVuY2F0ZWdvcml6ZWQiLgotICAtIFNtYWxsdGFsayBhbGxvd3MgZmlsaW5nIGJvdGggY2xhc3NlcyBhbmQgbWV0aG9kcyB3aXRoaW4gY2xhc3NlcyBpbnRvIG5hbWVkCi0gICAgZ3JvdXBzLiBUaGVzZSBuYW1lZCBncm91cHMgb2YgbWV0aG9kcyBhcmUgY2FsbGVkIGNhdGVnb3JpZXMuCi0KLU4uQi46IFRoZSBgcGhwX25hbWVzcGFjZWAgZGlyZWN0aXZlIHdpbGwgYmUgZGVwcmVjYXRlZCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgaW4gZmF2b3Igb2YgdGhlIHNjb3BlZCBzeW50YXgsIGJ1dCB0aGUgc2NvcGVkIHN5bnRheCBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgUEhQLgotCi1OLkIuOiBUaGUgYHhzZF9uYW1lc3BhY2VgIGRpcmVjdGl2ZSBoYXMgc29tZSBwdXJwb3NlIGludGVybmFsIHRvIEZhY2Vib29rIGJ1dCBzZXJ2ZXMgbm8gcHVycG9zZSBpbiBUaHJpZnQgaXRzZWxmLiBVc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkCisgICAgWzZdICBOYW1lc3BhY2VTY29wZSAgOjo9ICAnKicgfCAnY19nbGliJyB8ICdjcHAnIHwgJ2NzaGFycCcgfCAnZGVscGhpJyB8ICdnbycgfCAnamF2YScgfCAnanMnIHwgJ2x1YScgfCAnbmV0Y29yZScgfCAncGVybCcgfCAncGhwJyB8ICdweScgfCAncHkudHdpc3RlZCcgfCAncmInIHwgJ3N0JyB8ICd4c2QnCiAKICMjIERlZmluaXRpb24KIApAQCAtOTgsNyArNzYsNyBAQAogCiAjIyMgVW5pb24KIAotVW5pb25zIGFyZSBzaW1pbGFyIHRvIHN0cnVjdHMsIGV4Y2VwdCB0aGF0IHRoZXkgcHJvdmlkZSBhIG1lYW5zIHRvIHRyYW5zcG9ydCBleGFjdGx5IG9uZSBmaWVsZCBvZiBhIHBvc3NpYmxlIHNldCBvZiBmaWVsZHMsIGp1c3QgbGlrZSB1bmlvbiB7fSBpbiBDKysuIENvbnNlcXVlbnRseSwgdW5pb24gbWVtYmVycyBjYW5ub3QgYmUgcmVxdWlyZWQgZmllbGRzLgorVW5pb25zIGFyZSBzaW1pbGFyIHRvIHN0cnVjdHMsIGV4Y2VwdCB0aGF0IHRoZXkgcHJvdmlkZSBhIG1lYW5zIHRvIHRyYW5zcG9ydCBleGFjdGx5IG9uZSBmaWVsZCBvZiBhIHBvc3NpYmxlIHNldCBvZiBmaWVsZHMsIGp1c3QgbGlrZSB1bmlvbiB7fSBpbiBDKysuIENvbnNlcXVlbnRseSwgdW5pb24gbWVtYmVycyBhcmUgaW1wbGljaXRseSBjb25zaWRlcmVkIG9wdGlvbmFsIChzZWUgcmVxdWlyZWRuZXNzKS4KIAogICAgIFsxM10gVW5pb24gICAgICAgICAgOjo9ICAndW5pb24nIElkZW50aWZpZXIgJ3hzZF9hbGwnPyAneycgRmllbGQqICd9JwogCkBAIC0xMjYsNyArMTA0LDQzIEBACiAKICMjIyBGaWVsZCBSZXF1aXJlZG5lc3MKIAotICAgIFsxOF0gRmllbGRSZXEgICAgICAgIDo6PSAgJ3JlcXVpcmVkJyB8ICdvcHRpb25hbCcKK1RoZXJlIGFyZSB0d28gZXhwbGljaXQgcmVxdWlyZWRuZXNzIHZhbHVlcywgYW5kIGEgdGhpcmQgb25lIHRoYXQgaXMgYXBwbGllZCBpbXBsaWNpdHkgaWYgbmVpdGhlciAgKnJlcXVpcmVkKiBub3IgKm9wdGlvbmFsKiBhcmUgZ2l2ZW46ICpkZWZhdWx0KiByZXF1aXJlZG5lc3MuCisKKyAgICBbMThdIEZpZWxkUmVxICAgICAgICA6Oj0gICdyZXF1aXJlZCcgfCAnb3B0aW9uYWwnIAorCitUaGUgZ2VuZXJhbCBydWxlcyBmb3IgcmVxdWlyZWRuZXNzIGFyZSBhcyBmb2xsb3dzOgorCisjIyMjIHJlcXVpcmVkCisKKy0gV3JpdGU6IFJlcXVpcmVkIGZpZWxkcyBhcmUgYWx3YXlzIHdyaXR0ZW4gYW5kIGFyZSBleHBlY3RlZCB0byBiZSBzZXQuCistIFJlYWQ6IFJlcXVpcmVkIGZpZWxkcyBhcmUgYWx3YXlzIHJlYWQgYW5kIGFyZSBleHBlY3RlZCB0byBiZSBjb250YWluZWQgaW4gdGhlIGlucHV0IHN0cmVhbS4KKy0gRGVmYXVsdHMgdmFsdWVzOiBhcmUgYWx3YXlzIHdyaXR0ZW4KKworSWYgYSByZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nIGR1cmluZyByZWFkLCB0aGUgZXhwZWN0ZWQgYmVoYXZpb3VyIGlzIHRvIGluZGljYXRlIGFuIHVuc3VjY2Vzc2Z1bCByZWFkIG9wZXJhdGlvbiB0byB0aGUgY2FsbGVyLCBlLmcuIGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbiBvciByZXR1cm5pbmcgYW4gZXJyb3IuIAorCitCZWNhdXNlIG9mIHRoaXMgYmVoYXZpb3VyLCByZXF1aXJlZCBmaWVsZHMgZHJhc3RpY2FsbHkgbGltaXQgdGhlIG9wdGlvbnMgd2l0aCByZWdhcmQgdG8gc29mdCB2ZXJzaW9uaW5nLiBCZWNhdXNlIHRoZXkgbXVzdCBiZSBwcmVzZW50IG9uIHJlYWQsIHRoZSBmaWVsZHMgY2Fubm90IGJlIGRlcHJlY2F0ZWQuIElmIGEgcmVxdWlyZWQgZmllbGQgd291bGQgYmUgcmVtb3ZlZCAob3IgY2hhbmdlZCB0byBvcHRpb25hbCksIHRoZSBkYXRhIGFyZSBubyBsb25nZXIgY29tcGF0aWJsZSBiZXR3ZWVuIHZlcnNpb25zLgorCQorIyMjIyBvcHRpb25hbAorCistIFdyaXRlOiBPcHRpb25hbCBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiB3aGVuIHRoZXkgYXJlIHNldAorLSBSZWFkOiBPcHRpb25hbCBmaWVsZHMgbWF5LCBvciBtYXkgbm90IGJlIHBhcnQgb2YgdGhlIGlucHV0IHN0cmVhbS4gCistIERlZmF1bHQgdmFsdWVzOiBhcmUgd3JpdHRlbiB3aGVuIHRoZSBpc3NldCBmbGFnIGlzIHNldAorCitNb3N0IGxhbmd1YWdlIGltcGxlbWVudGF0aW9ucyB1c2UgdGhlIHJlY29tbWVuZGVkIHByYXRpY2Ugb2Ygc28tY2FsbGVkICJpc3NldCIgZmxhZ3MgdG8gaW5kaWNhdGUgd2hldGhlciBhIHBhcnRpY3VsYXIgb3B0aW9uYWwgZmllbGQgaXMgc2V0IG9yIG5vdC4gT25seSBmaWVsZHMgd2l0aCB0aGlzIGZsYWcgc2V0IGFyZSB3cml0dGVuLCBhbmQgY29udmVyc2VseSB0aGUgZmxhZyBpcyBvbmx5IHNldCB3aGVuIGEgZmllbGQgdmFsdWUgaGFzIGJlZW4gcmVhZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uIAorCQorIyMjIyBkZWZhdWx0IHJlcXVpcmVkbmVzcyAoaW1wbGljaXQpCisKKy0gV3JpdGU6IEluIHRoZW9yeSwgdGhlIGZpZWxkcyBhcmUgYWx3YXlzIHdyaXR0ZW4uIFRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMgdG8gdGhhdCBydWxlLCBzZWUgYmVsb3cuCistIFJlYWQ6IExpa2Ugb3B0aW9uYWwsIHRoZSBmaWVsZCBtYXksIG9yIG1heSBub3QgYmUgcGFydCBvZiB0aGUgaW5wdXQgc3RyZWFtLiAKKy0gRGVmYXVsdCB2YWx1ZXM6IG1heSBub3QgYmUgd3JpdHRlbiAoc2VlIG5leHQgc2VjdGlvbikKKworRGVmYXVsdCByZXF1aXJlZG5lc3MgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBUaGUgZGVzaXJlZCBiZWhhdmlvdXIgaXMgYSBtaXggb2Ygb3B0aW9uYWwgYW5kIHJlcXVpcmVkLCBoZW5jZSB0aGUgaW50ZXJuYWwgbmFtZSAib3B0LWluLCByZXEtb3V0Ii4gQWx0aG91Z2ggaW4gdGhlb3J5IHRoZXNlIGZpZWxkcyBhcmUgc3VwcG9zZWQgdG8gYmUgd3JpdHRlbiAoInJlcS1vdXQiKSwgaW4gcmVhbGl0eSB1bnNldCBmaWVsZHMgYXJlIG5vdCBhbHdheXMgd3JpdHRlbi4gVGhpcyBpcyBlc3BlY2lhbGx5IHRoZSBjYXNlLCB3aGVuIHRoZSBmaWVsZCBjb250YWlucyBhIDxudWxsPiB2YWx1ZSwgd2hpY2ggYnkgZGVmaW5pdGlvbiBjYW5ub3QgYmUgdHJhbnNwb3J0ZWQgdGhyb3VnaCB0aHJpZnQuIFRoZSBvbmx5IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgYnkgbm90IHdyaXRpbmcgdGhhdCBmaWVsZCBhdCBhbGwsIGFuZCB0aGF0J3Mgd2hhdCBtb3N0IGxhbmd1YWdlcyBkby4KKwkKKyMjIyMgU2VtYW50aWNzIG9mIERlZmF1bHQgVmFsdWVzCisKK1RoZXJlIGFyZSBvbmdvaW5nIGRpc2N1c3Npb25zIGFib3V0IHRoYXQgdG9waWMsIHNlZSBKSVJBIGZvciBkZXRhaWxzLiBOb3QgYWxsIGltcGxlbWVudGF0aW9ucyB0cmVhdCBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgdmVyeSBzYW1lIHdheSwgYnV0IHRoZSBjdXJyZW50IHN0YXR1cyBxdW8gaXMgbW9yZSBvciBsZXNzIHRoYXQgZGVmYXVsdCBmaWVsZHMgYXJlIHR5cGljYWxseSBzZXQgYXQgaW5pdGlhbGl6YXRpb24gdGltZS4gVGhlcmVmb3JlLCBhIHZhbHVlIHRoYXQgZXF1YWxzIHRoZSBkZWZhdWx0IG1heSBub3QgYmUgd3JpdHRlbiwgYmVjYXVzZSB0aGUgcmVhZCBlbmQgd2lsbCBzZXQgdGhlIHZhbHVlIGltcGxpY2l0bHkuIE9uIHRoZSBvdGhlciBoYW5kLCBhbiBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIHdyaXRlIHRoZSBkZWZhdWx0IHZhbHVlIGFueXdheXMsIGFzIHRoZXJlIGlzIG5vIGhhcmQgcmVzdHJpY3Rpb24gdGhhdCBwcmV2ZW50cyB0aGlzLiAKKworVGhlIG1ham9yIHBvaW50IHRvIGtlZXAgaW4gbWluZCBoZXJlIGlzIHRoZSBmYWN0LCB0aGF0IGFueSB1bndyaXR0ZW4gZGVmYXVsdCB2YWx1ZSBpbXBsaWNpdGx5IGJlY29tZXMgcGFydCBvZiB0aGUgaW50ZXJmYWNlIHZlcnNpb24uIElmIHRoYXQgZGVmYXVsdCBpcyBjaGFuZ2VkLCB0aGUgaW50ZXJmYWNlIGNoYW5nZXMuIElmLCBpbiBjb250cmFzdCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgd3JpdHRlbiBpbnRvIHRoZSBvdXRwdXQgZGF0YSwgdGhlIGRlZmF1bHQgaW4gdGhlIElETCBjYW4gY2hhbmdlIGF0IGFueSB0aW1lIHdpdGhvdXQgYWZmZWN0aW5nIHNlcmlhbGl6ZWQgZGF0YS4KIAogIyMjIFhTRCBPcHRpb25zCiAKQEAgLTE1MCw3ICsxNjQsNyBAQAogCiAgICAgWzI1XSBEZWZpbml0aW9uVHlwZSAgOjo9ICBCYXNlVHlwZSB8IENvbnRhaW5lclR5cGUKIAotICAgIFsyNl0gQmFzZVR5cGUgICAgICAgIDo6PSAgJ2Jvb2wnIHwgJ2J5dGUnIHwgJ2kxNicgfCAnaTMyJyB8ICdpNjQnIHwgJ2RvdWJsZScgfCAnc3RyaW5nJyB8ICdiaW5hcnknIHwgJ3NsaXN0JworICAgIFsyNl0gQmFzZVR5cGUgICAgICAgIDo6PSAgJ2Jvb2wnIHwgJ2J5dGUnIHwgJ2k4JyB8ICdpMTYnIHwgJ2kzMicgfCAnaTY0JyB8ICdkb3VibGUnIHwgJ3N0cmluZycgfCAnYmluYXJ5JyB8ICdzbGlzdCcKIAogICAgIFsyN10gQ29udGFpbmVyVHlwZSAgIDo6PSAgTWFwVHlwZSB8IFNldFR5cGUgfCBMaXN0VHlwZQogCkBAIC0yMDYsOSArMjIwLDkgQEAKICAqIFtBcGFjaGUgQ2Fzc2FuZHJhJ3NdW10gVGhyaWZ0IElETDogW2Nhc3NhbmRyYS50aHJpZnRdW10KICAqIFtFdmVybm90ZSBBUEldW10KIAotIFtUaHJpZnRUZXN0LnRocmlmdF06ICBodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD10aHJpZnQuZ2l0O2E9YmxvYl9wbGFpbjtmPXRlc3QvVGhyaWZ0VGVzdC50aHJpZnQ7aGI9SEVBRAorIFtUaHJpZnRUZXN0LnRocmlmdF06ICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBhY2hlL3RocmlmdC9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogIFt0dXRvcmlhbF06ICAgICAgICAgICAvdHV0b3JpYWwvCi0gW2ZiMzAzLnRocmlmdF06ICAgICAgIGh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQ7YT1ibG9iX3BsYWluO2Y9Y29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQ7aGI9SEVBRAorIFtmYjMwMy50aHJpZnRdOiAgICAgICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBhY2hlL3RocmlmdC9tYXN0ZXIvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKICBbQXBhY2hlIENhc3NhbmRyYSdzXTogaHR0cDovL2Nhc3NhbmRyYS5hcGFjaGUub3JnLwogIFtjYXNzYW5kcmEudGhyaWZ0XTogICBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2Nhc3NhbmRyYS90cnVuay9pbnRlcmZhY2UvY2Fzc2FuZHJhLnRocmlmdD92aWV3PWNvCiAgW0V2ZXJub3RlIEFQSV06ICAgICAgIGh0dHA6Ly93d3cuZXZlcm5vdGUuY29tL2Fib3V0L2RldmVsb3Blci9hcGkvCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZCBiL2RvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NTI2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZApAQCAtMCwwICsxLDI1NCBAQAorVGhyaWZ0IEJpbmFyeSBwcm90b2NvbCBlbmNvZGluZyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPCEtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLT4KKworVGhpcyBkb2N1bWVudHMgZGVzY3JpYmVzIHRoZSB3aXJlIGVuY29kaW5nIGZvciBSUEMgdXNpbmcgdGhlIG9sZGVyIFRocmlmdCAqYmluYXJ5IHByb3RvY29sKi4KKworVGhlIGluZm9ybWF0aW9uIGhlcmUgaXMgX21vc3RseV8gYmFzZWQgb24gdGhlIEphdmEgaW1wbGVtZW50YXRpb24gaW4gdGhlIEFwYWNoZSB0aHJpZnQgbGlicmFyeSAodmVyc2lvbiAwLjkuMSBhbmQKKzAuOS4zKS4gT3RoZXIgaW1wbGVtZW50YXRpb24gaG93ZXZlciwgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZS4KKworRm9yIGJhY2tncm91bmQgb24gVGhyaWZ0IHNlZSB0aGUgW1RocmlmdCB3aGl0ZXBhcGVyIChwZGYpXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnL3N0YXRpYy9maWxlcy90aHJpZnQtMjAwNzA0MDEucGRmKS4KKworIyBDb250ZW50cworCisqIEJpbmFyeSBwcm90b2NvbAorICAqIEJhc2UgdHlwZXMKKyAgKiBNZXNzYWdlCisgICogU3RydWN0CisgICogTGlzdCBhbmQgU2V0CisgICogTWFwCisqIEJORiBub3RhdGlvbiB1c2VkIGluIHRoaXMgZG9jdW1lbnQKKworIyBCaW5hcnkgcHJvdG9jb2wKKworIyMgQmFzZSB0eXBlcworCisjIyMgSW50ZWdlciBlbmNvZGluZworCitJbiB0aGUgX2JpbmFyeSBwcm90b2NvbF8gaW50ZWdlcnMgYXJlIGVuY29kZWQgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0IChiaWcgZW5kaWFuIGJ5dGUgb3JkZXIsIGFrYSBuZXR3b3JrCitvcmRlcikuIEFuIGBpbnQ4YCBuZWVkcyAxIGJ5dGUsIGFuIGBpbnQxNmAgMiwgYW4gYGludDMyYCA0IGFuZCBhbiBgaW50NjRgIG5lZWRzIDggYnl0ZXMuCisKK1RoZSBDUFAgdmVyc2lvbiBoYXMgdGhlIG9wdGlvbiB0byB1c2UgdGhlIGJpbmFyeSBwcm90b2NvbCB3aXRoIGxpdHRsZSBlbmRpYW4gb3JkZXIuIExpdHRsZSBlbmRpYW4gZ2l2ZXMgYSBzbWFsbCBidXQKK25vdGljZWFibGUgcGVyZm9ybWFuY2UgYm9vc3QgYmVjYXVzZSBjb250ZW1wb3JhcnkgQ1BVcyB1c2UgbGl0dGxlIGVuZGlhbiB3aGVuIHN0b3JpbmcgaW50ZWdlcnMgdG8gUkFNLgorCisjIyMgRW51bSBlbmNvZGluZworCitUaGUgZ2VuZXJhdGVkIGNvZGUgZW5jb2RlcyBgRW51bWBzIGJ5IHRha2luZyB0aGUgb3JkaW5hbCB2YWx1ZSBhbmQgdGhlbiBlbmNvZGluZyB0aGF0IGFzIGFuIGludDMyLgorCisjIyMgQmluYXJ5IGVuY29kaW5nCisKK0JpbmFyeSBpcyBzZW50IGFzIGZvbGxvd3M6CisKK2BgYAorQmluYXJ5IHByb3RvY29sLCBiaW5hcnkgZGF0YSwgNCsgYnl0ZXM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfCBieXRlIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgfCBieXRlcyAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBieXRlIGxlbmd0aGAgaXMgdGhlIGxlbmd0aCBvZiB0aGUgYnl0ZSBhcnJheSwgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZW5jb2RlZCBpbiBuZXR3b3JrIChiaWcgZW5kaWFuKSBvcmRlciAobXVzdCBiZSA+PSAwKS4KKyogYGJ5dGVzYCBhcmUgdGhlIGJ5dGVzIG9mIHRoZSBieXRlIGFycmF5LgorCisjIyMgU3RyaW5nIGVuY29kaW5nCisKKypTdHJpbmcqcyBhcmUgZmlyc3QgZW5jb2RlZCB0byBVVEYtOCwgYW5kIHRoZW4gc2VuZCBhcyBiaW5hcnkuCisKKyMjIyBEb3VibGUgZW5jb2RpbmcKKworVmFsdWVzIG9mIHR5cGUgYGRvdWJsZWAgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhbiBpbnQ2NCBhY2NvcmRpbmcgdG8gdGhlIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50ICJkb3VibGUgZm9ybWF0IiBiaXQKK2xheW91dC4gTW9zdCBydW4tdGltZXMgcHJvdmlkZSBhIGxpYnJhcnkgdG8gbWFrZSB0aGlzIGNvbnZlcnNpb24uIEJvdGggdGhlIGJpbmFyeSBwcm90b2NvbCBhcyB0aGUgY29tcGFjdCBwcm90b2NvbCB0aGVuCitlbmNvZGUgdGhlIGludDY0IGluIDggYnl0ZXMgaW4gYmlnIGVuZGlhbiBvcmRlci4KKworIyMjIEJvb2xlYW4gZW5jb2RpbmcKKworVmFsdWVzIG9mIGBib29sYCB0eXBlIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gYW4gaW50OC4gVHJ1ZSBpcyBjb252ZXJ0ZWQgdG8gYDFgLCBmYWxzZSB0byBgMGAuCisKKyMjIE1lc3NhZ2UKKworQSBgTWVzc2FnZWAgY2FuIGJlIGVuY29kZWQgaW4gdHdvIGRpZmZlcmVudCB3YXlzOgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCBNZXNzYWdlLCBzdHJpY3QgZW5jb2RpbmcsIDEyKyBieXRlczoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8MXZ2dnZ2dnZ8dnZ2dnZ2dnZ8dW51c2VkICB8MDAwMDBtbW18IG5hbWUgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWUgICAgICAgICAgICAgICAgfCBzZXEgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgdnZ2dnZ2dnZ2dnZ2dnZ2YCBpcyB0aGUgdmVyc2lvbiwgYW4gdW5zaWduZWQgMTUgYml0IG51bWJlciBmaXhlZCB0byBgMWAgKGluIGJpbmFyeTogYDAwMCAwMDAwIDAwMDAgMDAwMWApLgorICBUaGUgbGVhZGluZyBiaXQgaXMgYDFgLgorKiBgdW51c2VkYCBpcyBhbiBpZ25vcmVkIGJ5dGUuCisqIGBtbW1gIGlzIHRoZSBtZXNzYWdlIHR5cGUsIGFuIHVuc2lnbmVkIDMgYml0IGludGVnZXIuIFRoZSA1IGxlYWRpbmcgYml0cyBtdXN0IGJlIGAwYCBhcyBzb21lIGNsaWVudHMgKGNoZWNrZWQgZm9yCisgIGphdmEgaW4gMC45LjEpIHRha2UgdGhlIHdob2xlIGJ5dGUuCisqIGBuYW1lIGxlbmd0aGAgaXMgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGZpZWxkLCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGluIG5ldHdvcmsgKGJpZyBlbmRpYW4pIG9yZGVyIChtdXN0IGJlID49IDApLgorKiBgbmFtZWAgaXMgdGhlIG1ldGhvZCBuYW1lLCBhIFVURi04IGVuY29kZWQgc3RyaW5nLgorKiBgc2VxIGlkYCBpcyB0aGUgc2VxdWVuY2UgaWQsIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGVuY29kZWQgaW4gbmV0d29yayAoYmlnIGVuZGlhbikgb3JkZXIuCisKK1RoZSBzZWNvbmQsIG9sZGVyIGVuY29kaW5nIChha2Egbm9uLXN0cmljdCkgaXM6CisKK2BgYAorQmluYXJ5IHByb3RvY29sIE1lc3NhZ2UsIG9sZCBlbmNvZGluZywgOSsgYnl0ZXM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworfCBuYW1lIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lICAgICAgICAgICAgICAgIHwwMDAwMG1tbXwgc2VxIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCitgYGAKKworV2hlcmUgYG5hbWUgbGVuZ3RoYCwgYG5hbWVgLCBgbW1tYCwgYHNlcSBpZGAgYXJlIGFzIGFib3ZlLgorCitCZWNhdXNlIGBuYW1lIGxlbmd0aGAgbXVzdCBiZSBwb3NpdGl2ZSAodGhlcmVmb3JlIHRoZSBmaXJzdCBiaXQgaXMgYWx3YXlzIGAwYCksIHRoZSBmaXJzdCBiaXQgYWxsb3dzIHRoZSByZWNlaXZlciB0byBzZWUKK3doZXRoZXIgdGhlIHN0cmljdCBmb3JtYXQgb3IgdGhlIG9sZCBmb3JtYXQgaXMgdXNlZC4gVGhlcmVmb3JlIGEgc2VydmVyIGFuZCBjbGllbnQgdXNpbmcgdGhlIGRpZmZlcmVudCB2YXJpYW50cyBvZiB0aGUKK2JpbmFyeSBwcm90b2NvbCBjYW4gdHJhbnNwYXJlbnRseSB0YWxrIHdpdGggZWFjaCBvdGhlci4gSG93ZXZlciwgd2hlbiBzdHJpY3QgbW9kZSBpcyBlbmZvcmNlZCwgdGhlIG9sZCBmb3JtYXQgaXMKK3JlamVjdGVkLgorCitNZXNzYWdlIHR5cGVzIGFyZSBlbmNvZGVkIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyogX0NhbGxfOiAxCisqIF9SZXBseV86IDIKKyogX0V4Y2VwdGlvbl86IDMKKyogX09uZXdheV86IDQKKworIyMgU3RydWN0CisKK0EgKlN0cnVjdCogaXMgYSBzZXF1ZW5jZSBvZiB6ZXJvIG9yIG1vcmUgZmllbGRzLCBmb2xsb3dlZCBieSBhIHN0b3AgZmllbGQuIEVhY2ggZmllbGQgc3RhcnRzIHdpdGggYSBmaWVsZCBoZWFkZXIgYW5kCitpcyBmb2xsb3dlZCBieSB0aGUgZW5jb2RlZCBmaWVsZCB2YWx1ZS4gVGhlIGVuY29kaW5nIGNhbiBiZSBzdW1tYXJpemVkIGJ5IHRoZSBmb2xsb3dpbmcgQk5GOgorCitgYGAKK3N0cnVjdCAgICAgICAgOjo9ICggZmllbGQtaGVhZGVyIGZpZWxkLXZhbHVlICkqIHN0b3AtZmllbGQKK2ZpZWxkLWhlYWRlciAgOjo9IGZpZWxkLXR5cGUgZmllbGQtaWQKK2BgYAorCitCZWNhdXNlIGVhY2ggZmllbGQgaGVhZGVyIGNvbnRhaW5zIHRoZSBmaWVsZC1pZCAoYXMgZGVmaW5lZCBieSB0aGUgVGhyaWZ0IElETCBmaWxlKSwgdGhlIGZpZWxkcyBjYW4gYmUgZW5jb2RlZCBpbiBhbnkKK29yZGVyLiBUaHJpZnQncyB0eXBlIHN5c3RlbSBpcyBub3QgZXh0ZW5zaWJsZTsgeW91IGNhbiBvbmx5IGVuY29kZSB0aGUgcHJpbWl0aXZlIHR5cGVzIGFuZCBzdHJ1Y3RzLiBUaGVyZWZvcmUgaXMgYWxzbworcG9zc2libGUgdG8gaGFuZGxlIHVua25vd24gZmllbGRzIHdoaWxlIGRlY29kaW5nOyB0aGVzZSBhcmUgc2ltcGx5IGlnbm9yZWQuIFdoaWxlIGRlY29kaW5nIHRoZSBmaWVsZCB0eXBlIGNhbiBiZSB1c2VkIHRvCitkZXRlcm1pbmUgaG93IHRvIGRlY29kZSB0aGUgZmllbGQgdmFsdWUuCisKK05vdGUgdGhhdCB0aGUgZmllbGQgbmFtZSBpcyBub3QgZW5jb2RlZCBzbyBmaWVsZCByZW5hbWVzIGluIHRoZSBJREwgZG8gbm90IGFmZmVjdCBmb3J3YXJkIGFuZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCitUaGUgZGVmYXVsdCBKYXZhIGltcGxlbWVudGF0aW9uIChBcGFjaGUgVGhyaWZ0IDAuOS4xKSBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yIHdoZW4gaXQgdHJpZXMgdG8gZGVjb2RlIGEgZmllbGQgdGhhdCBoYXMKK2Fub3RoZXIgZmllbGQtdHlwZSB0aGVuIHdoYXQgaXMgZXhwZWN0ZWQuIFRoZW9yZXRpY2FsbHkgdGhpcyBjb3VsZCBiZSBkZXRlY3RlZCBhdCB0aGUgY29zdCBvZiBzb21lIGFkZGl0aW9uYWwgY2hlY2tpbmcuCitPdGhlciBpbXBsZW1lbnRhdGlvbiBtYXkgcGVyZm9ybSB0aGlzIGNoZWNrIGFuZCB0aGVuIGVpdGhlciBpZ25vcmUgdGhlIGZpZWxkLCBvciByZXR1cm4gYSBwcm90b2NvbCBleGNlcHRpb24uCisKK0EgKlVuaW9uKiBpcyBlbmNvZGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgYSBzdHJ1Y3Qgd2l0aCB0aGUgYWRkaXRpb25hbCByZXN0cmljdGlvbiB0aGF0IGF0IG1vc3QgMSBmaWVsZCBtYXkgYmUgZW5jb2RlZC4KKworQW4gKkV4Y2VwdGlvbiogaXMgZW5jb2RlZCBleGFjdGx5IHRoZSBzYW1lIGFzIGEgc3RydWN0LgorCisjIyMgU3RydWN0IGVuY29kaW5nCisKK0luIHRoZSBiaW5hcnkgcHJvdG9jb2wgZmllbGQgaGVhZGVycyBhbmQgdGhlIHN0b3AgZmllbGQgYXJlIGVuY29kZWQgYXMgZm9sbG93czoKKworYGBgCitCaW5hcnkgcHJvdG9jb2wgZmllbGQgaGVhZGVyIGFuZCBmaWVsZCB2YWx1ZToKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8dHR0dHR0dHR8IGZpZWxkIGlkICAgICAgICB8IGZpZWxkIHZhbHVlICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKKworQmluYXJ5IHByb3RvY29sIHN0b3AgZmllbGQ6CisrLS0tLS0tLS0rCit8MDAwMDAwMDB8CisrLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHR0dHR0dHR0YCB0aGUgZmllbGQtdHlwZSwgYSBzaWduZWQgOCBiaXQgaW50ZWdlci4KKyogYGZpZWxkIGlkYCB0aGUgZmllbGQtaWQsIGEgc2lnbmVkIDE2IGJpdCBpbnRlZ2VyIGluIGJpZyBlbmRpYW4gb3JkZXIuCisqIGBmaWVsZC12YWx1ZWAgdGhlIGVuY29kZWQgZmllbGQgdmFsdWUuCisKK1RoZSBmb2xsb3dpbmcgZmllbGQtdHlwZXMgYXJlIHVzZWQ6CisKKyogYEJPT0xgLCBlbmNvZGVkIGFzIGAyYAorKiBgQllURWAsIGVuY29kZWQgYXMgYDNgCisqIGBET1VCTEVgLCBlbmNvZGVkIGFzIGA0YAorKiBgSTE2YCwgZW5jb2RlZCBhcyBgNmAKKyogYEkzMmAsIGVuY29kZWQgYXMgYDhgCisqIGBJNjRgLCBlbmNvZGVkIGFzIGAxMGAKKyogYFNUUklOR2AsIHVzZWQgZm9yIGJpbmFyeSBhbmQgc3RyaW5nIGZpZWxkcywgZW5jb2RlZCBhcyBgMTFgCisqIGBTVFJVQ1RgLCB1c2VkIGZvciBzdHJ1Y3RzIGFuZCB1bmlvbiBmaWVsZHMsIGVuY29kZWQgYXMgYDEyYAorKiBgTUFQYCwgZW5jb2RlZCBhcyBgMTNgCisqIGBTRVRgLCBlbmNvZGVkIGFzIGAxNGAKKyogYExJU1RgLCBlbmNvZGVkIGFzIGAxNWAKKworIyMgTGlzdCBhbmQgU2V0CisKK0xpc3QgYW5kIHNldHMgYXJlIGVuY29kZWQgdGhlIHNhbWU6IGEgaGVhZGVyIGluZGljYXRpbmcgdGhlIHNpemUgYW5kIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGVsZW1lbnRzLCBmb2xsb3dlZCBieSB0aGUKK2VuY29kZWQgZWxlbWVudHMuCisKK2BgYAorQmluYXJ5IHByb3RvY29sIGxpc3QgKDUrIGJ5dGVzKSBhbmQgZWxlbWVudHM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfHR0dHR0dHR0fCBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlbGVtZW50cyAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHR0dHR0dHR0YCBpcyB0aGUgZWxlbWVudC10eXBlLCBlbmNvZGVkIGFzIGFuIGludDgKKyogYHNpemVgIGlzIHRoZSBzaXplLCBlbmNvZGVkIGFzIGFuIGludDMyLCBwb3NpdGl2ZSB2YWx1ZXMgb25seQorKiBgZWxlbWVudHNgIHRoZSBlbGVtZW50IHZhbHVlcworCitUaGUgZWxlbWVudC10eXBlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgZmllbGQtdHlwZXMuIFRoZSBmdWxsIGxpc3QgaXMgaW5jbHVkZWQgaW4gdGhlIHN0cnVjdCBzZWN0aW9uIGFib3ZlLgorCitUaGUgbWF4aW11bSBsaXN0L3NldCBzaXplIGlzIGNvbmZpZ3VyYWJsZS4gQnkgZGVmYXVsdCB0aGVyZSBpcyBubyBsaW1pdCAobWVhbmluZyB0aGUgbGltaXQgaXMgdGhlIG1heGltdW0gaW50MzIgdmFsdWU6CisyMTQ3NDgzNjQ3KS4KKworIyMgTWFwCisKK01hcHMgYXJlIGVuY29kZWQgd2l0aCBhIGhlYWRlciBpbmRpY2F0aW5nIHRoZSBzaXplLCB0aGUgZWxlbWVudC10eXBlIG9mIHRoZSBrZXlzIGFuZCB0aGUgZWxlbWVudC10eXBlIG9mIHRoZSBlbGVtZW50cywKK2ZvbGxvd2VkIGJ5IHRoZSBlbmNvZGVkIGVsZW1lbnRzLiBUaGUgZW5jb2RpbmcgZm9sbG93cyB0aGlzIEJORjoKKworYGBgCittYXAgIDo6PSAga2V5LWVsZW1lbnQtdHlwZSB2YWx1ZS1lbGVtZW50LXR5cGUgc2l6ZSAoIGtleSB2YWx1ZSApKgorYGBgCisKK2BgYAorQmluYXJ5IHByb3RvY29sIG1hcCAoNisgYnl0ZXMpIGFuZCBrZXkgdmFsdWUgcGFpcnM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfGtra2tra2trfHZ2dnZ2dnZ2fCBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrZXkgdmFsdWUgcGFpcnMgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYGtra2tra2trYCBpcyB0aGUga2V5IGVsZW1lbnQtdHlwZSwgZW5jb2RlZCBhcyBhbiBpbnQ4CisqIGB2dnZ2dnZ2dmAgaXMgdGhlIHZhbHVlIGVsZW1lbnQtdHlwZSwgZW5jb2RlZCBhcyBhbiBpbnQ4CisqIGBzaXplYCBpcyB0aGUgc2l6ZSBvZiB0aGUgbWFwLCBlbmNvZGVkIGFzIGFuIGludDMyLCBwb3NpdGl2ZSB2YWx1ZXMgb25seQorKiBga2V5IHZhbHVlIHBhaXJzYCBhcmUgdGhlIGVuY29kZWQga2V5cyBhbmQgdmFsdWVzCisKK1RoZSBlbGVtZW50LXR5cGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBmaWVsZC10eXBlcy4gVGhlIGZ1bGwgbGlzdCBpcyBpbmNsdWRlZCBpbiB0aGUgc3RydWN0IHNlY3Rpb24gYWJvdmUuCisKK1RoZSBtYXhpbXVtIG1hcCBzaXplIGlzIGNvbmZpZ3VyYWJsZS4gQnkgZGVmYXVsdCB0aGVyZSBpcyBubyBsaW1pdCAobWVhbmluZyB0aGUgbGltaXQgaXMgdGhlIG1heGltdW0gaW50MzIgdmFsdWU6CisyMTQ3NDgzNjQ3KS4KKworIyBCTkYgbm90YXRpb24gdXNlZCBpbiB0aGlzIGRvY3VtZW50CisKK1RoZSBmb2xsb3dpbmcgQk5GIG5vdGF0aW9uIGlzIHVzZWQ6CisKKyogYSBwbHVzIGArYCBhcHBlbmRlZCB0byBhbiBpdGVtIHJlcHJlc2VudHMgcmVwZXRpdGlvbjsgdGhlIGl0ZW0gaXMgcmVwZWF0ZWQgMSBvciBtb3JlIHRpbWVzCisqIGEgc3RhciBgKmAgYXBwZW5kZWQgdG8gYW4gaXRlbSByZXByZXNlbnRzIG9wdGlvbmFsIHJlcGV0aXRpb247IHRoZSBpdGVtIGlzIHJlcGVhdGVkIDAgb3IgbW9yZSB0aW1lcworKiBhIHBpcGUgYHxgIGJldHdlZW4gaXRlbXMgcmVwcmVzZW50cyBjaG9pY2UsIHRoZSBmaXJzdCBtYXRjaGluZyBpdGVtIGlzIHNlbGVjdGVkCisqIHBhcmVudGhlc2lzIGAoYCBhbmQgYClgIGFyZSB1c2VkIGZvciBncm91cGluZyBtdWx0aXBsZSBpdGVtcwpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kIGIvZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNDY3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQKQEAgLTAsMCArMSwyOTQgQEAKK1RocmlmdCBDb21wYWN0IHByb3RvY29sIGVuY29kaW5nIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPCEtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLT4KKworVGhpcyBkb2N1bWVudHMgZGVzY3JpYmVzIHRoZSB3aXJlIGVuY29kaW5nIGZvciBSUEMgdXNpbmcgdGhlIFRocmlmdCAqY29tcGFjdCBwcm90b2NvbCouCisKK1RoZSBpbmZvcm1hdGlvbiBoZXJlIGlzIF9tb3N0bHlfIGJhc2VkIG9uIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uIGluIHRoZSBBcGFjaGUgdGhyaWZ0IGxpYnJhcnkgKHZlcnNpb24gMC45LjEpIGFuZAorW1RIUklGVC0xMTAgQSBtb3JlIGNvbXBhY3QgZm9ybWF0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTApLiBPdGhlciBpbXBsZW1lbnRhdGlvbiBob3dldmVyLAorc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZS4KKworRm9yIGJhY2tncm91bmQgb24gVGhyaWZ0IHNlZSB0aGUgW1RocmlmdCB3aGl0ZXBhcGVyIChwZGYpXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnL3N0YXRpYy9maWxlcy90aHJpZnQtMjAwNzA0MDEucGRmKS4KKworIyBDb250ZW50cworCisqIENvbXBhY3QgcHJvdG9jb2wKKyAgKiBCYXNlIHR5cGVzCisgICogTWVzc2FnZQorICAqIFN0cnVjdAorICAqIExpc3QgYW5kIFNldAorICAqIE1hcAorKiBCTkYgbm90YXRpb24gdXNlZCBpbiB0aGlzIGRvY3VtZW50CisKKyMgQ29tcGFjdCBwcm90b2NvbAorCisjIyBCYXNlIHR5cGVzCisKKyMjIyBJbnRlZ2VyIGVuY29kaW5nCisKK1RoZSBfY29tcGFjdCBwcm90b2NvbF8gdXNlcyBtdWx0aXBsZSBlbmNvZGluZ3MgZm9yIGludHM6IHRoZSBfemlnemFnIGludF8sIGFuZCB0aGUgX3ZhciBpbnRfLgorCitWYWx1ZXMgb2YgdHlwZSBgaW50MzJgIGFuZCBgaW50NjRgIGFyZSBmaXJzdCB0cmFuc2Zvcm1lZCB0byBhICp6aWd6YWcgaW50Ki4gQSB6aWd6YWcgaW50IGZvbGRzIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZQorbnVtYmVycyBpbnRvIHRoZSBwb3NpdGl2ZSBudW1iZXIgc3BhY2UuIFdoZW4gd2UgcmVhZCAwLCAxLCAyLCAzLCA0IG9yIDUgZnJvbSB0aGUgd2lyZSwgdGhpcyBpcyB0cmFuc2xhdGVkIHRvIDAsIC0xLCAxLAorLTIgb3IgMiByZXNwZWN0aXZlbHkuIEhlcmUgYXJlIHRoZSAoU2NhbGEpIGZvcm11bGFzIHRvIGNvbnZlcnQgZnJvbSBpbnQzMi9pbnQ2NCB0byBhIHppZ3phZyBpbnQgYW5kIGJhY2s6CisKK2BgYHNjYWxhCitkZWYgaW50VG9aaWdaYWcobjogSW50KTogSW50ID0gKG4gPDwgMSkgXiAobiA+PiAzMSkKK2RlZiB6aWd6YWdUb0ludChuOiBJbnQpOiBJbnQgPSAobiA+Pj4gMSkgXiAtIChuICYgMSkKK2RlZiBsb25nVG9aaWdaYWcobjogTG9uZyk6IExvbmcgPSAobiA8PCAxKSBeIChuID4+IDYzKQorZGVmIHppZ3phZ1RvTG9uZyhuOiBMb25nKTogTG9uZyA9IChuID4+PiAxKSBeIC0gKG4gJiAxKQorYGBgCisKK1RoZSB6aWd6YWcgaW50IGlzIHRoZW4gZW5jb2RlZCBhcyBhICp2YXIgaW50Ki4gVmFyIGludHMgdGFrZSAxIHRvIDUgYnl0ZXMgKGludDMyKSBvciAxIHRvIDEwIGJ5dGVzIChpbnQ2NCkuIFRoZSBtb3N0CitzaWduaWZpY2FudCBiaXQgb2YgZWFjaCBieXRlIGluZGljYXRlcyBpZiBtb3JlIGJ5dGVzIGZvbGxvdy4gVGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IDcgYml0cyBmcm9tIGVhY2gKK2J5dGUgZm9ybSB0aGUgbnVtYmVyLCB3aGVyZSB0aGUgZmlyc3QgYnl0ZSBoYXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyAoc28gdGhleSBhcmUgaW4gYmlnIGVuZGlhbiBvciBuZXR3b3JrIG9yZGVyKS4KKworVmFyIGludHMgYXJlIHNvbWV0aW1lcyB1c2VkIGRpcmVjdGx5IGluc2lkZSB0aGUgY29tcGFjdCBwcm90b2NvbCB0byByZXByZXNlbnQgcG9zaXRpdmUgbnVtYmVycy4KKworVG8gZW5jb2RlIGFuIGBpbnQxNmAgYXMgemlnemFnIGludCwgaXQgaXMgZmlyc3QgY29udmVydGVkIHRvIGFuIGBpbnQzMmAgYW5kIHRoZW4gZW5jb2RlZCBhcyBzdWNoLiBUaGUgdHlwZSBgaW50OGAgc2ltcGx5Cit1c2VzIGEgc2luZ2xlIGJ5dGUgYXMgaW4gdGhlIGJpbmFyeSBwcm90b2NvbC4KKworIyMjIEVudW0gZW5jb2RpbmcKKworVGhlIGdlbmVyYXRlZCBjb2RlIGVuY29kZXMgYEVudW1gcyBieSB0YWtpbmcgdGhlIG9yZGluYWwgdmFsdWUgYW5kIHRoZW4gZW5jb2RpbmcgdGhhdCBhcyBhbiBpbnQzMi4KKworIyMjIEJpbmFyeSBlbmNvZGluZworCitCaW5hcnkgaXMgc2VudCBhcyBmb2xsb3dzOgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCwgYmluYXJ5IGRhdGEsIDErIGJ5dGVzOgorKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8IGJ5dGUgbGVuZ3RoICAgICAgICAgfCBieXRlcyAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBieXRlIGxlbmd0aGAgaXMgdGhlIGxlbmd0aCBvZiB0aGUgYnl0ZSBhcnJheSwgdXNpbmcgdmFyIGludCBlbmNvZGluZyAobXVzdCBiZSA+PSAwKS4KKyogYGJ5dGVzYCBhcmUgdGhlIGJ5dGVzIG9mIHRoZSBieXRlIGFycmF5LgorCisjIyMgU3RyaW5nIGVuY29kaW5nCisKKypTdHJpbmcqcyBhcmUgZmlyc3QgZW5jb2RlZCB0byBVVEYtOCwgYW5kIHRoZW4gc2VuZCBhcyBiaW5hcnkuCisKKyMjIyBEb3VibGUgZW5jb2RpbmcKKworVmFsdWVzIG9mIHR5cGUgYGRvdWJsZWAgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhbiBpbnQ2NCBhY2NvcmRpbmcgdG8gdGhlIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50ICJkb3VibGUgZm9ybWF0IiBiaXQKK2xheW91dC4gTW9zdCBydW4tdGltZXMgcHJvdmlkZSBhIGxpYnJhcnkgdG8gbWFrZSB0aGlzIGNvbnZlcnNpb24uIEJvdGggdGhlIGJpbmFyeSBwcm90b2NvbCBhcyB0aGUgY29tcGFjdCBwcm90b2NvbCB0aGVuCitlbmNvZGUgdGhlIGludDY0IGluIDggYnl0ZXMgaW4gYmlnIGVuZGlhbiBvcmRlci4KKworIyMjIEJvb2xlYW4gZW5jb2RpbmcKKworQm9vbGVhbnMgYXJlIGVuY29kZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQgaXMgYSBmaWVsZCB2YWx1ZSAoaW4gYSBzdHJ1Y3QpIG9yIGFuIGVsZW1lbnQgdmFsdWUgKGluIGEgc2V0LAorbGlzdCBvciBtYXApLiBGaWVsZCB2YWx1ZXMgYXJlIGVuY29kZWQgZGlyZWN0bHkgaW4gdGhlIGZpZWxkIGhlYWRlci4gRWxlbWVudCB2YWx1ZXMgb2YgdHlwZSBgYm9vbGAgYXJlIHNlbnQgYXMgYW4gaW50ODsKK3RydWUgYXMgYDFgIGFuZCBmYWxzZSBhcyBgMGAuCisKKyMjIE1lc3NhZ2UKKworQSBgTWVzc2FnZWAgb24gdGhlIHdpcmUgbG9va3MgYXMgZm9sbG93czoKKworYGBgCitDb21wYWN0IHByb3RvY29sIE1lc3NhZ2UgKDQrIGJ5dGVzKToKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3xwcHBwcHBwcHxtbW12dnZ2dnwgc2VxIGlkICAgICAgICAgICAgICB8IG5hbWUgbGVuZ3RoICAgICAgICAgfCBuYW1lICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgcHBwcHBwcHBgIGlzIHRoZSBwcm90b2NvbCBpZCwgZml4ZWQgdG8gYDEwMDAgMDAxMGAsIDB4ODIuCisqIGBtbW1gIGlzIHRoZSBtZXNzYWdlIHR5cGUsIGFuIHVuc2lnbmVkIDMgYml0IGludGVnZXIuCisqIGB2dnZ2dmAgaXMgdGhlIHZlcnNpb24sIGFuIHVuc2lnbmVkIDUgYml0IGludGVnZXIsIGZpeGVkIHRvIGAwMDAwMWAuCisqIGBzZXEgaWRgIGlzIHRoZSBzZXF1ZW5jZSBpZCwgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZW5jb2RlZCBhcyBhIHZhciBpbnQuCisqIGBuYW1lIGxlbmd0aGAgaXMgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGZpZWxkLCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGFzIGEgdmFyIGludCAobXVzdCBiZSA+PSAwKS4KKyogYG5hbWVgIGlzIHRoZSBtZXRob2QgbmFtZSB0byBpbnZva2UsIGEgVVRGLTggZW5jb2RlZCBzdHJpbmcuCisKK01lc3NhZ2UgdHlwZXMgYXJlIGVuY29kZWQgd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworKiBfQ2FsbF86IDEKKyogX1JlcGx5XzogMgorKiBfRXhjZXB0aW9uXzogMworKiBfT25ld2F5XzogNAorCisjIyMgU3RydWN0CisKK0EgKlN0cnVjdCogaXMgYSBzZXF1ZW5jZSBvZiB6ZXJvIG9yIG1vcmUgZmllbGRzLCBmb2xsb3dlZCBieSBhIHN0b3AgZmllbGQuIEVhY2ggZmllbGQgc3RhcnRzIHdpdGggYSBmaWVsZCBoZWFkZXIgYW5kCitpcyBmb2xsb3dlZCBieSB0aGUgZW5jb2RlZCBmaWVsZCB2YWx1ZS4gVGhlIGVuY29kaW5nIGNhbiBiZSBzdW1tYXJpemVkIGJ5IHRoZSBmb2xsb3dpbmcgQk5GOgorCitgYGAKK3N0cnVjdCAgICAgICAgOjo9ICggZmllbGQtaGVhZGVyIGZpZWxkLXZhbHVlICkqIHN0b3AtZmllbGQKK2ZpZWxkLWhlYWRlciAgOjo9IGZpZWxkLXR5cGUgZmllbGQtaWQKK2BgYAorCitCZWNhdXNlIGVhY2ggZmllbGQgaGVhZGVyIGNvbnRhaW5zIHRoZSBmaWVsZC1pZCAoYXMgZGVmaW5lZCBieSB0aGUgVGhyaWZ0IElETCBmaWxlKSwgdGhlIGZpZWxkcyBjYW4gYmUgZW5jb2RlZCBpbiBhbnkKK29yZGVyLiBUaHJpZnQncyB0eXBlIHN5c3RlbSBpcyBub3QgZXh0ZW5zaWJsZTsgeW91IGNhbiBvbmx5IGVuY29kZSB0aGUgcHJpbWl0aXZlIHR5cGVzIGFuZCBzdHJ1Y3RzLiBUaGVyZWZvcmUgaXMgYWxzbworcG9zc2libGUgdG8gaGFuZGxlIHVua25vd24gZmllbGRzIHdoaWxlIGRlY29kaW5nOyB0aGVzZSBhcmUgc2ltcGx5IGlnbm9yZWQuIFdoaWxlIGRlY29kaW5nIHRoZSBmaWVsZCB0eXBlIGNhbiBiZSB1c2VkIHRvCitkZXRlcm1pbmUgaG93IHRvIGRlY29kZSB0aGUgZmllbGQgdmFsdWUuCisKK05vdGUgdGhhdCB0aGUgZmllbGQgbmFtZSBpcyBub3QgZW5jb2RlZCBzbyBmaWVsZCByZW5hbWVzIGluIHRoZSBJREwgZG8gbm90IGFmZmVjdCBmb3J3YXJkIGFuZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCitUaGUgZGVmYXVsdCBKYXZhIGltcGxlbWVudGF0aW9uIChBcGFjaGUgVGhyaWZ0IDAuOS4xKSBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yIHdoZW4gaXQgdHJpZXMgdG8gZGVjb2RlIGEgZmllbGQgdGhhdCBoYXMKK2Fub3RoZXIgZmllbGQtdHlwZSB0aGFuIHdoYXQgaXMgZXhwZWN0ZWQuIFRoZW9yZXRpY2FsbHkgdGhpcyBjb3VsZCBiZSBkZXRlY3RlZCBhdCB0aGUgY29zdCBvZiBzb21lIGFkZGl0aW9uYWwgY2hlY2tpbmcuCitPdGhlciBpbXBsZW1lbnRhdGlvbiBtYXkgcGVyZm9ybSB0aGlzIGNoZWNrIGFuZCB0aGVuIGVpdGhlciBpZ25vcmUgdGhlIGZpZWxkLCBvciByZXR1cm4gYSBwcm90b2NvbCBleGNlcHRpb24uCisKK0EgKlVuaW9uKiBpcyBlbmNvZGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgYSBzdHJ1Y3Qgd2l0aCB0aGUgYWRkaXRpb25hbCByZXN0cmljdGlvbiB0aGF0IGF0IG1vc3QgMSBmaWVsZCBtYXkgYmUgZW5jb2RlZC4KKworQW4gKkV4Y2VwdGlvbiogaXMgZW5jb2RlZCBleGFjdGx5IHRoZSBzYW1lIGFzIGEgc3RydWN0LgorCisjIyMgU3RydWN0IGVuY29kaW5nCisKK2BgYAorQ29tcGFjdCBwcm90b2NvbCBmaWVsZCBoZWFkZXIgKHNob3J0IGZvcm0pIGFuZCBmaWVsZCB2YWx1ZToKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8ZGRkZHR0dHR8IGZpZWxkIHZhbHVlICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKKworQ29tcGFjdCBwcm90b2NvbCBmaWVsZCBoZWFkZXIgKDEgdG8gMyBieXRlcywgbG9uZyBmb3JtKSBhbmQgZmllbGQgdmFsdWU6CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3wwMDAwdHR0dHwgZmllbGQgaWQgICAgICAgICAgICB8IGZpZWxkIHZhbHVlICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCisKK0NvbXBhY3QgcHJvdG9jb2wgc3RvcCBmaWVsZDoKKystLS0tLS0tLSsKK3wwMDAwMDAwMHwKKystLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgZGRkZGAgaXMgdGhlIGZpZWxkIGlkIGRlbHRhLCBhbiB1bnNpZ25lZCA0IGJpdHMgaW50ZWdlciwgc3RyaWN0bHkgcG9zaXRpdmUuCisqIGB0dHR0YCBpcyBmaWVsZC10eXBlIGlkLCBhbiB1bnNpZ25lZCA0IGJpdCBpbnRlZ2VyLgorKiBgZmllbGQgaWRgIHRoZSBmaWVsZCBpZCwgYSBzaWduZWQgMTYgYml0IGludGVnZXIgZW5jb2RlZCBhcyB6aWd6YWcgaW50LgorKiBgZmllbGQtdmFsdWVgIHRoZSBlbmNvZGVkIGZpZWxkIHZhbHVlLgorCitUaGUgZmllbGQgaWQgZGVsdGEgY2FuIGJlIGNvbXB1dGVkIGJ5IGBjdXJyZW50LWZpZWxkLWlkIC0gcHJldmlvdXMtZmllbGQtaWRgLCBvciBqdXN0IGBjdXJyZW50LWZpZWxkLWlkYCBpZiB0aGlzIGlzIHRoZQorZmlyc3Qgb2YgdGhlIHN0cnVjdC4gVGhlIHNob3J0IGZvcm0gc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgZmllbGQgaWQgZGVsdGEgaXMgaW4gdGhlIHJhbmdlIDEgLSAxNSAoaW5jbHVzaXZlKS4KKworVGhlIGZvbGxvd2luZyBmaWVsZC10eXBlcyBjYW4gYmUgZW5jb2RlZDoKKworKiBgQk9PTEVBTl9UUlVFYCwgZW5jb2RlZCBhcyBgMWAKKyogYEJPT0xFQU5fRkFMU0VgLCBlbmNvZGVkIGFzIGAyYAorKiBgQllURWAsIGVuY29kZWQgYXMgYDNgCisqIGBJMTZgLCBlbmNvZGVkIGFzIGA0YAorKiBgSTMyYCwgZW5jb2RlZCBhcyBgNWAKKyogYEk2NGAsIGVuY29kZWQgYXMgYDZgCisqIGBET1VCTEVgLCBlbmNvZGVkIGFzIGA3YAorKiBgQklOQVJZYCwgdXNlZCBmb3IgYmluYXJ5IGFuZCBzdHJpbmcgZmllbGRzLCBlbmNvZGVkIGFzIGA4YAorKiBgTElTVGAsIGVuY29kZWQgYXMgYDlgCisqIGBTRVRgLCBlbmNvZGVkIGFzIGAxMGAKKyogYE1BUGAsIGVuY29kZWQgYXMgYDExYAorKiBgU1RSVUNUYCwgdXNlZCBmb3IgYm90aCBzdHJ1Y3RzIGFuZCB1bmlvbiBmaWVsZHMsIGVuY29kZWQgYXMgYDEyYAorCitOb3RlIHRoYXQgYmVjYXVzZSB0aGVyZSBhcmUgMiBzcGVjaWZpYyBmaWVsZCB0eXBlcyBmb3IgdGhlIGJvb2xlYW4gdmFsdWVzLCB0aGUgZW5jb2Rpbmcgb2YgYSBib29sZWFuIGZpZWxkIHZhbHVlIGhhcyBubworbGVuZ3RoICgwIGJ5dGVzKS4KKworIyMgTGlzdCBhbmQgU2V0CisKK0xpc3QgYW5kIHNldHMgYXJlIGVuY29kZWQgdGhlIHNhbWU6IGEgaGVhZGVyIGluZGljYXRpbmcgdGhlIHNpemUgYW5kIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGVsZW1lbnRzLCBmb2xsb3dlZCBieSB0aGUKK2VuY29kZWQgZWxlbWVudHMuCisKK2BgYAorQ29tcGFjdCBwcm90b2NvbCBsaXN0IGhlYWRlciAoMSBieXRlLCBzaG9ydCBmb3JtKSBhbmQgZWxlbWVudHM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfHNzc3N0dHR0fCBlbGVtZW50cyAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCisKK0NvbXBhY3QgcHJvdG9jb2wgbGlzdCBoZWFkZXIgKDIrIGJ5dGVzLCBsb25nIGZvcm0pIGFuZCBlbGVtZW50czoKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfDExMTF0dHR0fCBzaXplICAgICAgICAgICAgICAgIHwgZWxlbWVudHMgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgc3Nzc2AgaXMgdGhlIHNpemUsIDQgYml0IHVuc2lnbmVkIGludCwgdmFsdWVzIGAwYCAtIGAxNGAKKyogYHR0dHRgIGlzIHRoZSBlbGVtZW50LXR5cGUsIGEgNCBiaXQgdW5zaWduZWQgaW50CisqIGBzaXplYCBpcyB0aGUgc2l6ZSwgYSB2YXIgaW50IChpbnQzMiksIHBvc2l0aXZlIHZhbHVlcyBgMTVgIG9yIGhpZ2hlcgorKiBgZWxlbWVudHNgIGFyZSB0aGUgZW5jb2RlZCBlbGVtZW50cworCitUaGUgc2hvcnQgZm9ybSBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBsZW5ndGggaXMgaW4gdGhlIHJhbmdlIDAgLSAxNCAoaW5jbHVzaXZlKS4KKworVGhlIGZvbGxvd2luZyBlbGVtZW50LXR5cGVzIGFyZSB1c2VkIChub3RlIHRoYXQgdGhlc2UgYXJlIF9kaWZmZXJlbnRfIGZyb20gdGhlIGZpZWxkLXR5cGVzKToKKworKiBgQk9PTGAsIGVuY29kZWQgYXMgYDJgCisqIGBCWVRFYCwgZW5jb2RlZCBhcyBgM2AKKyogYERPVUJMRWAsIGVuY29kZWQgYXMgYDRgCisqIGBJMTZgLCBlbmNvZGVkIGFzIGA2YAorKiBgSTMyYCwgZW5jb2RlZCBhcyBgOGAKKyogYEk2NGAsIGVuY29kZWQgYXMgYDEwYAorKiBgU1RSSU5HYCwgdXNlZCBmb3IgYmluYXJ5IGFuZCBzdHJpbmcgZmllbGRzLCBlbmNvZGVkIGFzIGAxMWAKKyogYFNUUlVDVGAsIHVzZWQgZm9yIHN0cnVjdHMgYW5kIHVuaW9uIGZpZWxkcywgZW5jb2RlZCBhcyBgMTJgCisqIGBNQVBgLCBlbmNvZGVkIGFzIGAxM2AKKyogYFNFVGAsIGVuY29kZWQgYXMgYDE0YAorKiBgTElTVGAsIGVuY29kZWQgYXMgYDE1YAorCisKK1RoZSBtYXhpbXVtIGxpc3Qvc2V0IHNpemUgaXMgY29uZmlndXJhYmxlLiBCeSBkZWZhdWx0IHRoZXJlIGlzIG5vIGxpbWl0IChtZWFuaW5nIHRoZSBsaW1pdCBpcyB0aGUgbWF4aW11bSBpbnQzMiB2YWx1ZToKKzIxNDc0ODM2NDcpLgorCisjIyBNYXAKKworTWFwcyBhcmUgZW5jb2RlZCB3aXRoIGEgaGVhZGVyIGluZGljYXRpbmcgdGhlIHNpemUsIHRoZSB0eXBlIG9mIHRoZSBrZXlzIGFuZCB0aGUgZWxlbWVudC10eXBlIG9mIHRoZSBlbGVtZW50cywgZm9sbG93ZWQKK2J5IHRoZSBlbmNvZGVkIGVsZW1lbnRzLiBUaGUgZW5jb2RpbmcgZm9sbG93cyB0aGlzIEJORjoKKworYGBgCittYXAgICAgICAgICAgIDo6PSBlbXB0eS1tYXAgfCBub24tZW1wdHktbWFwCitlbXB0eS1tYXAgICAgIDo6PSBgMGAKK25vbi1lbXB0eS1tYXAgOjo9IHNpemUga2V5LWVsZW1lbnQtdHlwZSB2YWx1ZS1lbGVtZW50LXR5cGUgKGtleSB2YWx1ZSkrCitgYGAKKworYGBgCitDb21wYWN0IHByb3RvY29sIG1hcCBoZWFkZXIgKDEgYnl0ZSwgZW1wdHkgbWFwKToKKystLS0tLS0tLSsKK3wwMDAwMDAwMHwKKystLS0tLS0tLSsKKworQ29tcGFjdCBwcm90b2NvbCBtYXAgaGVhZGVyICgyKyBieXRlcywgbm9uIGVtcHR5IG1hcCkgYW5kIGtleSB2YWx1ZSBwYWlyczoKKystLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfCBzaXplICAgICAgICAgICAgICAgIHxra2trdnZ2dnwga2V5IHZhbHVlIHBhaXJzICAgICB8CisrLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgc2l6ZWAgaXMgdGhlIHNpemUsIGEgdmFyIGludCAoaW50MzIpLCBzdHJpY3RseSBwb3NpdGl2ZSB2YWx1ZXMKKyogYGtra2tgIGlzIHRoZSBrZXkgZWxlbWVudC10eXBlLCBhIDQgYml0IHVuc2lnbmVkIGludAorKiBgdnZ2dmAgaXMgdGhlIHZhbHVlIGVsZW1lbnQtdHlwZSwgYSA0IGJpdCB1bnNpZ25lZCBpbnQKKyogYGtleSB2YWx1ZSBwYWlyc2AgYXJlIHRoZSBlbmNvZGVkIGtleXMgYW5kIHZhbHVlcworCitUaGUgZWxlbWVudC10eXBlcyBhcmUgdGhlIHNhbWUgYXMgZm9yIGxpc3RzLiBUaGUgZnVsbCBsaXN0IGlzIGluY2x1ZGVkIGluIHRoZSAnTGlzdCBhbmQgc2V0JyBzZWN0aW9uLgorCitUaGUgbWF4aW11bSBtYXAgc2l6ZSBpcyBjb25maWd1cmFibGUuIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gbGltaXQgKG1lYW5pbmcgdGhlIGxpbWl0IGlzIHRoZSBtYXhpbXVtIGludDMyIHZhbHVlOgorMjE0NzQ4MzY0NykuCisKKyMgQk5GIG5vdGF0aW9uIHVzZWQgaW4gdGhpcyBkb2N1bWVudAorCitUaGUgZm9sbG93aW5nIEJORiBub3RhdGlvbiBpcyB1c2VkOgorCisqIGEgcGx1cyBgK2AgYXBwZW5kZWQgdG8gYW4gaXRlbSByZXByZXNlbnRzIHJlcGV0aXRpb247IHRoZSBpdGVtIGlzIHJlcGVhdGVkIDEgb3IgbW9yZSB0aW1lcworKiBhIHN0YXIgYCpgIGFwcGVuZGVkIHRvIGFuIGl0ZW0gcmVwcmVzZW50cyBvcHRpb25hbCByZXBldGl0aW9uOyB0aGUgaXRlbSBpcyByZXBlYXRlZCAwIG9yIG1vcmUgdGltZXMKKyogYSBwaXBlIGB8YCBiZXR3ZWVuIGl0ZW1zIHJlcHJlc2VudHMgY2hvaWNlLCB0aGUgZmlyc3QgbWF0Y2hpbmcgaXRlbSBpcyBzZWxlY3RlZAorKiBwYXJlbnRoZXNpcyBgKGAgYW5kIGApYCBhcmUgdXNlZCBmb3IgZ3JvdXBpbmcgbXVsdGlwbGUgaXRlbXMKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy90aHJpZnQtcHJvdG9jb2wtc3BlYy5tZCBiL2RvYy9zcGVjcy90aHJpZnQtcHJvdG9jb2wtc3BlYy5tZAppbmRleCA5NTBlMTYzLi4wYzFhNjFjIDEwMDY0NAotLS0gYS9kb2Mvc3BlY3MvdGhyaWZ0LXByb3RvY29sLXNwZWMubWQKKysrIGIvZG9jL3NwZWNzL3RocmlmdC1wcm90b2NvbC1zcGVjLm1kCkBAIC0zLDYgKzMsNyBAQAogCiBMYXN0IE1vZGlmaWVkOiAyMDA3LUp1bi0yOQogCis8IS0tCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCkBAIC0yMyw2ICsyNCw3IEBACiB1bmRlciB0aGUgTGljZW5zZS4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tPgogCiBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wKIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgZW5jb2RpbmcuIFRodXMsIHRoZSBvcmRlciBvZiBlbGVtZW50cwpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL3RocmlmdC1ycGMubWQgYi9kb2Mvc3BlY3MvdGhyaWZ0LXJwYy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDVjMDZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL3RocmlmdC1ycGMubWQKQEAgLTAsMCArMSwxNzggQEAKK1RocmlmdCBSZW1vdGUgUHJvY2VkdXJlIENhbGwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPCEtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLT4KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGhpZ2ggbGV2ZWwgbWVzc2FnZSBleGNoYW5nZSBiZXR3ZWVuIHRoZSBUaHJpZnQgUlBDIGNsaWVudCBhbmQgc2VydmVyLgorU2VlIFt0aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kXSBhbmQgW3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kXSBmb3IgYSBkZXNjcmlwdGlvbiBvZiBob3cgdGhlIGV4Y2hhbmdlcyBhcmUgZW5jb2RlZCBvbgordGhlIHdpcmUuCisKK0luIGFkZGl0aW9uLCB0aGlzIGRvY3VtZW50IGNvbXBhcmVzIHRoZSBiaW5hcnkgcHJvdG9jb2wgd2l0aCB0aGUgY29tcGFjdCBwcm90b2NvbC4gRmluYWxseSBpdCBkZXNjcmliZXMgdGhlIGZyYW1lZCB2cy4KK3VuZnJhbWVkIHRyYW5zcG9ydC4KKworVGhlIGluZm9ybWF0aW9uIGhlcmUgaXMgX21vc3RseV8gYmFzZWQgb24gdGhlIEphdmEgaW1wbGVtZW50YXRpb24gaW4gdGhlIEFwYWNoZSB0aHJpZnQgbGlicmFyeSAodmVyc2lvbiAwLjkuMSBhbmQKKzAuOS4zKS4gT3RoZXIgaW1wbGVtZW50YXRpb24gaG93ZXZlciwgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZS4KKworRm9yIGJhY2tncm91bmQgb24gVGhyaWZ0IHNlZSB0aGUgW1RocmlmdCB3aGl0ZXBhcGVyIChwZGYpXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnL3N0YXRpYy9maWxlcy90aHJpZnQtMjAwNzA0MDEucGRmKS4KKworIyBDb250ZW50cworCisqIFRocmlmdCBNZXNzYWdlIGV4Y2hhbmdlIGZvciBSZW1vdGUgUHJvY2VkdXJlIENhbGwKKyAgKiBNZXNzYWdlCisgICogUmVxdWVzdCBzdHJ1Y3QKKyAgKiBSZXNwb25zZSBzdHJ1Y3QKKyogUHJvdG9jb2wgY29uc2lkZXJhdGlvbnMKKyAgKiBDb21wYXJpbmcgYmluYXJ5IGFuZCBjb21wYWN0IHByb3RvY29sCisgICogQ29tcGF0aWJpbGl0eQorICAqIEZyYW1lZCB2cyB1bmZyYW1lZCB0cmFuc3BvcnQKKworIyBUaHJpZnQgUmVtb3RlIFByb2NlZHVyZSBDYWxsIE1lc3NhZ2UgZXhjaGFuZ2UKKworQm90aCB0aGUgYmluYXJ5IHByb3RvY29sIGFuZCB0aGUgY29tcGFjdCBwcm90b2NvbCBhc3N1bWUgYSB0cmFuc3BvcnQgbGF5ZXIgdGhhdCBleHBvc2VzIGEgYmktZGlyZWN0aW9uYWwgYnl0ZSBzdHJlYW0sCitmb3IgZXhhbXBsZSBhIFRDUCBzb2NrZXQuIEJvdGggdXNlIHRoZSBmb2xsb3dpbmcgZXhjaGFuZ2U6CisKKzEuIENsaWVudCBzZW5kcyBhIGBNZXNzYWdlYCAodHlwZSBgQ2FsbGAgb3IgYE9uZXdheWApLiBUaGUgVE1lc3NhZ2UgY29udGFpbnMgc29tZSBtZXRhZGF0YSBhbmQgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZAorICAgdG8gaW52b2tlLgorMi4gQ2xpZW50IHNlbmRzIG1ldGhvZCBhcmd1bWVudHMgKGEgc3RydWN0IGRlZmluZWQgYnkgdGhlIGdlbmVyYXRlIGNvZGUpLgorMy4gU2VydmVyIHNlbmRzIGEgYE1lc3NhZ2VgICh0eXBlIGBSZXBseWAgb3IgYEV4Y2VwdGlvbmApIHRvIHN0YXJ0IHRoZSByZXNwb25zZS4KKzQuIFNlcnZlciBzZW5kcyBhIHN0cnVjdCBjb250YWluaW5nIHRoZSBtZXRob2QgcmVzdWx0IG9yIGV4Y2VwdGlvbi4KKworVGhlIHBhdHRlcm4gaXMgYSBzaW1wbGUgaGFsZiBkdXBsZXggcHJvdG9jb2wgd2hlcmUgdGhlIHBhcnRpZXMgYWx0ZXJuYXRlIGluIHNlbmRpbmcgYSBgTWVzc2FnZWAgZm9sbG93ZWQgYnkgYSBzdHJ1Y3QuCitXaGF0IHRoZXNlIGFyZSBpcyBkZXNjcmliZWQgYmVsb3cuCisKK0FsdGhvdWdoIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0IEphdmEgY2xpZW50cyBkbyBub3Qgc3VwcG9ydCBwaXBlbGluaW5nIChzZW5kaW5nIG11bHRpcGxlIHJlcXVlc3RzIHdpdGhvdXQgd2FpdGluZworZm9yIGFuIHJlc3BvbnNlKSwgdGhlIHN0YW5kYXJkIEFwYWNoZSBUaHJpZnQgSmF2YSBzZXJ2ZXJzIGRvIHN1cHBvcnQgaXQuCisKKyMjIE1lc3NhZ2UKKworQSAqTWVzc2FnZSogY29udGFpbnM6CisKKyogX05hbWVfLCBhIHN0cmluZyAoY2FuIGJlIGVtcHR5KS4KKyogX01lc3NhZ2UgdHlwZV8sIGEgbWVzc2FnZSB0eXBlcywgb25lIG9mIGBDYWxsYCwgYFJlcGx5YCwgYEV4Y2VwdGlvbmAgYW5kIGBPbmV3YXlgLgorKiBfU2VxdWVuY2UgaWRfLCBhIHNpZ25lZCBpbnQzMiBpbnRlZ2VyLgorCitUaGUgKnNlcXVlbmNlIGlkKiBpcyBhIHNpbXBsZSBtZXNzYWdlIGlkIGFzc2lnbmVkIGJ5IHRoZSBjbGllbnQuIFRoZSBzZXJ2ZXIgd2lsbCB1c2UgdGhlIHNhbWUgc2VxdWVuY2UgaWQgaW4gdGhlCittZXNzYWdlIG9mIHRoZSByZXNwb25zZS4gVGhlIGNsaWVudCB1c2VzIHRoaXMgbnVtYmVyIHRvIGRldGVjdCBvdXQgb2Ygb3JkZXIgcmVzcG9uc2VzLiBFYWNoIGNsaWVudCBoYXMgYW4gaW50MzIgZmllbGQKK3doaWNoIGlzIGluY3JlYXNlZCBmb3IgZWFjaCBtZXNzYWdlLiBUaGUgc2VxdWVuY2UgaWQgc2ltcGx5IHdyYXBzIGFyb3VuZCB3aGVuIGl0IG92ZXJmbG93cy4KKworVGhlICpuYW1lKiBpbmRpY2F0ZXMgdGhlIHNlcnZpY2UgbWV0aG9kIG5hbWUgdG8gaW52b2tlLiBUaGUgc2VydmVyIGNvcGllcyB0aGUgbmFtZSBpbiB0aGUgcmVzcG9uc2UgbWVzc2FnZS4KKworV2hlbiB0aGUgKm11bHRpcGxleGVkIHByb3RvY29sKiBpcyB1c2VkLCB0aGUgbmFtZSBjb250YWlucyB0aGUgc2VydmljZSBuYW1lLCBhIGNvbG9uIGA6YCBhbmQgdGhlIG1ldGhvZCBuYW1lLiBUaGUKK211bHRpcGxleGVkIHByb3RvY29sIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggb3RoZXIgcHJvdG9jb2xzLgorCitUaGUgKm1lc3NhZ2UgdHlwZSogaW5kaWNhdGVzIHdoYXQga2luZCBvZiBtZXNzYWdlIGlzIHNlbnQuIENsaWVudHMgc2VuZCByZXF1ZXN0cyB3aXRoIFRNZXNzYWdlcyBvZiB0eXBlIGBDYWxsYCBvcgorYE9uZXdheWAgKHN0ZXAgMSBpbiB0aGUgcHJvdG9jb2wgZXhjaGFuZ2UpLiBTZXJ2ZXJzIHNlbmQgcmVzcG9uc2VzIHdpdGggbWVzc2FnZXMgb2YgdHlwZSBgRXhjZXB0aW9uYCBvciBgUmVwbHlgIChzdGVwCiszKS4KKworVHlwZSBgUmVwbHlgIGlzIHVzZWQgd2hlbiB0aGUgc2VydmljZSBtZXRob2QgY29tcGxldGVzIG5vcm1hbGx5LiBUaGF0IGlzLCBpdCByZXR1cm5zIGEgdmFsdWUgb3IgaXQgdGhyb3dzIG9uZSBvZiB0aGUKK2V4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETCBmaWxlLgorCitUeXBlIGBFeGNlcHRpb25gIGlzIHVzZWQgZm9yIG90aGVyIGV4Y2VwdGlvbnMuIFRoYXQgaXM6IHdoZW4gdGhlIHNlcnZpY2UgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gdGhhdCBpcyBub3QgZGVjbGFyZWQKK2luIHRoZSBUaHJpZnQgSURMIGZpbGUsIG9yIHNvbWUgb3RoZXIgcGFydCBvZiB0aGUgVGhyaWZ0IHN0YWNrIHRocm93cyBhbiBleGNlcHRpb24uIEZvciBleGFtcGxlIHdoZW4gdGhlIHNlcnZlciBjb3VsZAorbm90IGVuY29kZSBvciBkZWNvZGUgYSBtZXNzYWdlIG9yIHN0cnVjdC4KKworSW4gdGhlIEphdmEgaW1wbGVtZW50YXRpb24gKDAuOS4zKSB0aGVyZSBpcyBkaWZmZXJlbnQgYmVoYXZpb3IgZm9yIHRoZSBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHNlcnZlci4gSW4gdGhlIGFzeW5jCitzZXJ2ZXIgYWxsIGV4Y2VwdGlvbnMgYXJlIHNlbmQgYXMgYSBgVEFwcGxpY2F0aW9uRXhjZXB0aW9uYCAoc2VlICdSZXNwb25zZSBzdHJ1Y3QnIGJlbG93KS4gSW4gdGhlIHN5bmNocm9ub3VzIEphdmEKK2ltcGxlbWVudGF0aW9uIG9ubHkgKHVuZGVjbGFyZWQpIGV4Y2VwdGlvbnMgdGhhdCBleHRlbmQgYFRFeGNlcHRpb25gIGFyZSBzZW5kIGFzIGEgYFRBcHBsaWNhdGlvbkV4Y2VwdGlvbmAuIFVuY2hlY2tlZAorZXhjZXB0aW9ucyBsZWFkIHRvIGFuIGltbWVkaWF0ZSBjbG9zZSBvZiB0aGUgY29ubmVjdGlvbi4KKworVHlwZSBgT25ld2F5YCBpcyBvbmx5IHVzZWQgc3RhcnRpbmcgZnJvbSBBcGFjaGUgVGhyaWZ0IDAuOS4zLiBFYXJsaWVyIHZlcnNpb25zIGRvIF9ub3RfIHNlbmQgVE1lc3NhZ2VzIG9mIHR5cGUgYE9uZXdheWAsCitldmVuIGZvciBzZXJ2aWNlIG1ldGhvZHMgZGVmaW5lZCB3aXRoIHRoZSBgb25ld2F5YCBtb2RpZmllci4KKworV2hlbiBjbGllbnQgc2VuZHMgYSByZXF1ZXN0IHdpdGggdHlwZSBgT25ld2F5YCwgdGhlIHNlcnZlciBtdXN0IF9ub3RfIHNlbmQgYSByZXNwb25zZSAoc3RlcHMgMyBhbmQgNCBhcmUgc2tpcHBlZCkuIE5vdGUKK3RoYXQgdGhlIFRocmlmdCBJREwgZW5mb3JjZXMgYSByZXR1cm4gdHlwZSBvZiBgdm9pZGAgYW5kIGRvZXMgbm90IGFsbG93IGV4Y2VwdGlvbnMgZm9yIG9uZXdheSBzZXJ2aWNlcy4KKworIyMgUmVxdWVzdCBzdHJ1Y3QKKworVGhlIHN0cnVjdCB0aGF0IGZvbGxvd3MgdGhlIG1lc3NhZ2Ugb2YgdHlwZSBgQ2FsbGAgb3IgYE9uZXdheWAgY29udGFpbnMgdGhlIGFyZ3VtZW50cyBvZiB0aGUgc2VydmljZSBtZXRob2QuIFRoZQorYXJndW1lbnQgaWRzIGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkIGlkcy4gVGhlIG5hbWUgb2YgdGhlIHN0cnVjdCBpcyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdpdGggYF9hcmdzYCBhcHBlbmRlZC4KK0ZvciBtZXRob2RzIHdpdGhvdXQgYXJndW1lbnRzIGFuIHN0cnVjdCBpcyBzZW50IHdpdGhvdXQgZmllbGRzLgorCisjIyBSZXNwb25zZSBzdHJ1Y3QKKworVGhlIHN0cnVjdCB0aGF0IGZvbGxvd3MgdGhlIG1lc3NhZ2Ugb2YgdHlwZSBgUmVwbHlgIGFyZSBzdHJ1Y3RzIGluIHdoaWNoIGV4YWN0bHkgMSBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcyBpcyBlbmNvZGVkOgorCisqIEEgZmllbGQgd2l0aCBuYW1lIGBzdWNjZXNzYCBhbmQgaWQgYDBgLCB1c2VkIGluIGNhc2UgdGhlIG1ldGhvZCBjb21wbGV0ZWQgbm9ybWFsbHkuCisqIEFuIGV4Y2VwdGlvbiBmaWVsZCwgbmFtZSBhbmQgaWQgYXJlIGFzIGRlZmluZWQgaW4gdGhlIGB0aHJvd3NgIGNsYXVzZSBpbiB0aGUgVGhyaWZ0IElETCdzIHNlcnZpY2UgbWV0aG9kIGRlZmluaXRpb24uCisKK1doZW4gdGhlIG1lc3NhZ2UgaXMgb2YgdHlwZSBgRXhjZXB0aW9uYCB0aGUgc3RydWN0IGlzIGVuY29kZWQgYXMgaWYgaXQgd2FzIGRlY2xhcmVkIGJ5IHRoZSBmb2xsb3dpbmcgSURMOgorCitgYGAKK2V4Y2VwdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24geworICAxOiBzdHJpbmcgbWVzc2FnZSwKKyAgMjogaTMyIHR5cGUKK30KK2BgYAorCitUaGUgZm9sbG93aW5nIGV4Y2VwdGlvbiB0eXBlcyBhcmUgZGVmaW5lZCBpbiB0aGUgamF2YSBpbXBsZW1lbnRhdGlvbiAoMC45LjMpOgorCisqIF91bmtub3duXzogMCwgdXNlZCBpbiBjYXNlIHRoZSB0eXBlIGZyb20gdGhlIHBlZXIgaXMgdW5rbm93bi4KKyogX3Vua25vd24gbWV0aG9kXzogMSwgdXNlZCBpbiBjYXNlIHRoZSBtZXRob2QgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQgaXMgdW5rbm93biBieSB0aGUgc2VydmVyLgorKiBfaW52YWxpZCBtZXNzYWdlIHR5cGVfOiAyLCBubyB1c2FnZSB3YXMgZm91bmQuCisqIF93cm9uZyBtZXRob2QgbmFtZV86IDMsIG5vIHVzYWdlIHdhcyBmb3VuZC4KKyogX2JhZCBzZXF1ZW5jZSBpZF86IDQsIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY2xpZW50IHRvIGluZGljYXRlIGEgd3Jvbmcgc2VxdWVuY2UgaWQgaW4gdGhlIHJlc3BvbnNlLgorKiBfbWlzc2luZyByZXN1bHRfOiA1LCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNsaWVudCB0byBpbmRpY2F0ZSBhIHJlc3BvbnNlIHdpdGhvdXQgYW55IGZpZWxkIChyZXN1bHQgbm9yIGV4Y2VwdGlvbikuCisqIF9pbnRlcm5hbCBlcnJvcl86IDYsIHVzZWQgd2hlbiB0aGUgc2VydmVyIHRocm93cyBhbiBleGNlcHRpb24gdGhhdCBpcyBub3QgZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwgZmlsZS4gCisqIF9wcm90b2NvbCBlcnJvcl86IDcsIHVzZWQgd2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgZGVjb2RpbmcuIEZvciBleGFtcGxlIHdoZW4gYSBsaXN0IGlzIHRvbyBsb25nIG9yIGEgcmVxdWlyZWQKKyBmaWVsZCBpcyBtaXNzaW5nLiAKKyogX2ludmFsaWQgdHJhbnNmb3JtXzogOCwgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorKiBfaW52YWxpZCBwcm90b2NvbF86IDksIG5vIHVzYWdlIHdhcyBmb3VuZC4KKyogX3Vuc3VwcG9ydGVkIGNsaWVudCB0eXBlXzogMTAsIG5vIHVzYWdlIHdhcyBmb3VuZC4KKworIyBQcm90b2NvbCBjb25zaWRlcmF0aW9ucworCisjIyBDb21wYXJpbmcgYmluYXJ5IGFuZCBjb21wYWN0IHByb3RvY29sCisKK1RoZSBiaW5hcnkgcHJvdG9jb2wgaXMgZmFpcmx5IHNpbXBsZSBhbmQgdGhlcmVmb3JlIGVhc3kgdG8gcHJvY2Vzcy4gVGhlIGNvbXBhY3QgcHJvdG9jb2wgbmVlZHMgbGVzcyBieXRlcyB0byBzZW5kIHRoZQorc2FtZSBkYXRhIGF0IHRoZSBjb3N0IG9mIGFkZGl0aW9uYWwgcHJvY2Vzc2luZy4gQXMgYmFuZHdpZHRoIGlzIHVzdWFsbHkgdGhlIGJvdHRsZW5lY2ssIHRoZSBjb21wYWN0IHByb3RvY29sIGlzIGFsbW9zdAorYWx3YXlzIHNsaWdodGx5IGZhc3Rlci4KKworIyMgQ29tcGF0aWJpbGl0eQorCitBIHNlcnZlciBjb3VsZCBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB3aGV0aGVyIGEgY2xpZW50IHRhbGtzIHRoZSBiaW5hcnkgcHJvdG9jb2wgb3IgdGhlIGNvbXBhY3QgcHJvdG9jb2wgYnkKK2ludmVzdGlnYXRpbmcgdGhlIGZpcnN0IGJ5dGUuIElmIHRoZSB2YWx1ZSBpcyBgMTAwMCAwMDAxYCBvciBgMDAwMCAwMDAwYCAoYXNzdW1pbmcgYSBuYW1lIHNob3J0ZXIgdGhlbiDCsTE2IE1CKSBpdCBpcyB0aGUKK2JpbmFyeSBwcm90b2NvbC4gV2hlbiB0aGUgdmFsdWUgaXMgYDEwMDAgMDAxMGAgaXQgaXMgdGFsa2luZyB0aGUgY29tcGFjdCBwcm90b2NvbC4KKworIyMgRnJhbWVkIHZzLiB1bmZyYW1lZCB0cmFuc3BvcnQKKworVGhlIGZpcnN0IHRocmlmdCBiaW5hcnkgd2lyZSBmb3JtYXQgd2FzIHVuZnJhbWVkLiBUaGlzIG1lYW5zIHRoYXQgaW5mb3JtYXRpb24gaXMgc2VudCBvdXQgaW4gYSBzaW5nbGUgc3RyZWFtIG9mIGJ5dGVzLgorV2l0aCB1bmZyYW1lZCB0cmFuc3BvcnQgdGhlIChnZW5lcmF0ZWQpIHByb2Nlc3NvcnMgd2lsbCByZWFkIGRpcmVjdGx5IGZyb20gdGhlIHNvY2tldCAodGhvdWdoIEFwYWNoZSBUaHJpZnQgZG9lcyB0cnkgdG8KK2dyYWIgYWxsIGF2YWlsYWJsZSBieXRlcyBmcm9tIHRoZSBzb2NrZXQgaW4gYSBidWZmZXIgd2hlbiBpdCBjYW4pLgorCitMYXRlciwgVGhyaWZ0IGludHJvZHVjZWQgdGhlIGZyYW1lZCB0cmFuc3BvcnQuCisKK1dpdGggZnJhbWVkIHRyYW5zcG9ydCB0aGUgZnVsbCByZXF1ZXN0IGFuZCByZXNwb25zZSAodGhlIFRNZXNzYWdlIGFuZCB0aGUgZm9sbG93aW5nIHN0cnVjdCkgYXJlIGZpcnN0IHdyaXR0ZW4gdG8gYQorYnVmZmVyLiBUaGVuIHdoZW4gdGhlIHN0cnVjdCBpcyBjb21wbGV0ZSAodHJhbnNwb3J0IG1ldGhvZCBgZmx1c2hgIGlzIGhpamFja2VkIGZvciB0aGlzKSwgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzCit3cml0dGVuIHRvIHRoZSBzb2NrZXQgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBidWZmZXJlZCBieXRlcy4gVGhlIGNvbWJpbmF0aW9uIGlzIGNhbGxlZCBhIF9mcmFtZV8uIE9uIHRoZSByZWNlaXZlciBzaWRlCit0aGUgY29tcGxldGUgZnJhbWUgaXMgZmlyc3QgcmVhZCBpbiBhIGJ1ZmZlciBiZWZvcmUgdGhlIG1lc3NhZ2UgaXMgcGFzc2VkIHRvIGEgcHJvY2Vzc29yLgorCitUaGUgbGVuZ3RoIHByZWZpeCBpcyBhIDQgYnl0ZSBzaWduZWQgaW50LCBzZW5kIGluIG5ldHdvcmsgKGJpZyBlbmRpYW4pIG9yZGVyLgorVGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6IGAwYCA8PSBsZW5ndGggPD0gYDE2Mzg0MDAwYCAoMTZNKS4KKworRnJhbWVkIHRyYW5zcG9ydCB3YXMgaW50cm9kdWNlZCB0byBlYXNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhc3luYyBwcm9jZXNzb3JzLiBBbiBhc3luYyBwcm9jZXNzb3IgaXMgb25seSBpbnZva2VkIHdoZW4KK2FsbCBkYXRhIGlzIHJlY2VpdmVkLiBVbmZvcnR1bmF0ZWx5LCBmcmFtZWQgdHJhbnNwb3J0IGlzIG5vdCBpZGVhbCBmb3IgbGFyZ2UgbWVzc2FnZXMgYXMgdGhlIGVudGlyZSBmcmFtZSBzdGF5cyBpbgorbWVtb3J5IHVudGlsIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHByb2Nlc3NlZC4gSW4gYWRkaXRpb24sIHRoZSBqYXZhIGltcGxlbWVudGF0aW9uIG1lcmdlcyB0aGUgaW5jb21pbmcgZGF0YSB0byBhIHNpbmdsZSwKK2dyb3dpbmcgYnl0ZSBhcnJheS4gRXZlcnkgdGltZSB0aGUgYnl0ZSBhcnJheSBpcyBmdWxsIGl0IG5lZWRzIHRvIGJlIGNvcGllZCB0byBhIG5ldyBsYXJnZXIgYnl0ZSBhcnJheS4KKworRnJhbWVkIGFuZCB1bmZyYW1lZCB0cmFuc3BvcnRzIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIuCmRpZmYgLS1naXQgYS9kdWIuanNvbiBiL2R1Yi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzZhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kdWIuanNvbgpAQCAtMCwwICsxLDI4IEBACit7CisgICJuYW1lIjogImFwYWNoZS10aHJpZnQiLAorICAiZGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCBEIGxpYnJhcnkiLAorICAiYXV0aG9ycyI6IFsKKyAgICAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IgorICBdLAorICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiwKKyAgImxpY2Vuc2UiOiAiQXBhY2hlLTIuMCIsCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImxpYmV2ZW50IjogeworICAgICAgInZlcnNpb24iOiAifj4yLjAuMiIKKyAgICB9LAorICAgICJvcGVuc3NsIjogeworICAgICAgInZlcnNpb24iOiAiPj0xLjEuNiIKKyAgICB9CisgIH0sCisgICJzeXN0ZW1EZXBlbmRlbmNpZXMiOiAiT24gc3lzdGVtcyB3aXRoIG5hdGl2ZSBvcGVuc3NsIDEuMC54IHVzZSBkdWIgcGFja2FnZSBvcGVuc3Nsfj4xLjEsIG9uIHN5c3RlbXMgd2l0aCBuYXRpdmUgb3BlbnNzbCAxLjEueCB1c2UgZHViIHBhY2thZ2Ugb3BlbnNzbH4+Mi4wIiwKKyAgInRhcmdldFR5cGUiOiAibGlicmFyeSIsCisgICJzb3VyY2VQYXRocyI6IFsKKyAgICAibGliL2Qvc3JjIiAKKyAgXSwKKyAgImltcG9ydFBhdGhzIjogWworICAgICJsaWIvZC9zcmMiCisgIF0sCisgICJleGNsdWRlZFNvdXJjZUZpbGVzIjogWworICAgICJsaWIvZC9zcmMvdGhyaWZ0L2luZGV4LmQiCisgIF0KK30KZGlmZiAtLWdpdCBhL2ppdHBhY2sueW1sIGIvaml0cGFjay55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0MGQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ppdHBhY2sueW1sCkBAIC0wLDAgKzEsMiBAQAoraW5zdGFsbDoKKyAgLSBncmFkbGUgLVByZWxlYXNlPXRydWUgLXAgbGliL2phdmEvIGNsZWFuIGluc3RhbGwKZGlmZiAtLWdpdCBhL2pzb24tc2NoZW1hLmpzb24gYi9qc29uLXNjaGVtYS5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjEyMTZhLi4wMDAwMDAwCi0tLSBhL2pzb24tc2NoZW1hLmpzb24KKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotewotICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAotCi0gICJpZCI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvcHJvZ3JhbS1zY2hlbWEjIiwKLSAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgQXBhY2hlIFRocmlmdCBwcm90b2NvbCBkZXNjcmlwdG9ycyIsCi0KLSAgImRlZmluaXRpb25zIjogewotICAgICJ0eXBlLWlkIjogewotICAgICAgImVudW0iOiBbCi0gICAgICAgICJ2b2lkIiwKLSAgICAgICAgInN0cmluZyIsCi0gICAgICAgICJib29sIiwKLSAgICAgICAgImJ5dGUiLAotICAgICAgICAiaTE2IiwKLSAgICAgICAgImkzMiIsCi0gICAgICAgICJpNjQiLAotICAgICAgICAiZG91YmxlIiwKLSAgICAgICAgImxpc3QiLAotICAgICAgICAic2V0IiwKLSAgICAgICAgIm1hcCIsCi0gICAgICAgICJ1bmlvbiIsCi0gICAgICAgICJzdHJ1Y3QiLAotICAgICAgICAiZXhjZXB0aW9uIiwKLSAgICAgICAgImJpbmFyeSIKLSAgICAgIF0KLSAgICB9LAotICAgICJiYXNlLXR5cGUiOiB7Ci0gICAgICAidGl0bGUiOiAiQmFzZSB0eXBlcyIsCi0gICAgICAidHlwZSI6ICJvYmplY3QiLAotICAgICAgInByb3BlcnRpZXMiOiB7Ci0gICAgICAgICJ0eXBlSWQiOiB7Ci0gICAgICAgICAgImVudW0iOiBbICJ2b2lkIiwgInN0cmluZyIsICJib29sIiwgImJ5dGUiLCAiaTE2IiwgImkzMiIsICJpNjQiLCAiZG91YmxlIiwgImJpbmFyeSIgXQotICAgICAgICB9Ci0gICAgICB9LAotICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiBdCi0gICAgfSwKLSAgICAibGlzdC10eXBlIjogewotICAgICAgInRpdGxlIjogIkxpc3QgYW5kIHNldCB0eXBlcyIsCi0gICAgICAidHlwZSI6ICJvYmplY3QiLAotICAgICAgInByb3BlcnRpZXMiOiB7Ci0gICAgICAgICJ0eXBlSWQiOiB7ICJlbnVtIjogWyAibGlzdCIsICJzZXQiIF0gfSwKLSAgICAgICAgImVsZW1UeXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKLSAgICAgICAgImVsZW1UeXBlIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtc3BlYyIgfQotICAgICAgfSwKLSAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJlbGVtVHlwZUlkIiwgImVsZW1UeXBlIiBdCi0gICAgfSwKLSAgICAibWFwLXR5cGUiOiB7Ci0gICAgICAidGl0bGUiOiAiTWFwIHR5cGUiLAotICAgICAgInR5cGUiOiAib2JqZWN0IiwKLSAgICAgICJwcm9wZXJ0aWVzIjogewotICAgICAgICAidHlwZUlkIjogICAgICB7ICJlbnVtIjogWyAibWFwIiBdIH0sCi0gICAgICAgICJrZXlUeXBlSWQiOiAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAotICAgICAgICAia2V5VHlwZSI6ICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1zcGVjIiB9LAotICAgICAgICAidmFsdWVUeXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKLSAgICAgICAgInZhbHVlVHlwZSI6ICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtc3BlYyIgfQotICAgICAgfSwKLSAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJrZXlUeXBlSWQiLCAidmFsdWVUeXBlSWQiIF0KLSAgICB9LAotICAgICJzdHJ1Y3Qtc3BlYyI6IHsKLSAgICAgICJ0aXRsZSI6ICJTdHJ1Y3QgYW5kIHVuaW9uIHR5cGVzIiwKLSAgICAgICJ0eXBlIjogIm9iamVjdCIsCi0gICAgICAicHJvcGVydGllcyI6IHsKLSAgICAgICAgInR5cGVJZCI6IHsgImVudW0iOiBbICJ1bmlvbiIsICJzdHJ1Y3QiIF0gfSwKLSAgICAgICAgImNsYXNzIjogeyAidHlwZSI6ICJzdHJpbmciIH0KLSAgICAgIH0sCi0gICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiLCAiY2xhc3MiIF0KLSAgICB9LAotICAgICJ0eXBlLXNwZWMiOiB7Ci0gICAgICAiYWxsT2YiOiBbCi0gICAgICAgIHsgInR5cGUiOiAib2JqZWN0IiB9LAotICAgICAgICB7Ci0gICAgICAgICAgIm9uZU9mIjoKLSAgICAgICAgICBbCi0gICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYmFzZS10eXBlIiB9LAotICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2xpc3QtdHlwZSIgfSwKLSAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9tYXAtdHlwZSIgfSwKLSAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJ1Y3Qtc3BlYyIgfQotICAgICAgICAgIF0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgIm5hbWUtYW5kLWRvYyI6IHsKLSAgICAgICJ0eXBlIjogIm9iamVjdCIsCi0gICAgICAicHJvcGVydGllcyI6IHsKLSAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKLSAgICAgICAgImRvYyI6IHsgInR5cGUiOiAic3RyaW5nIiB9Ci0gICAgICB9LAotICAgICAgInJlcXVpcmVkIjogWyAibmFtZSIgXQotICAgIH0sCi0gICAgImVudW0iOiB7Ci0gICAgICAidHlwZSI6ICJvYmplY3QiLAotICAgICAgImFsbE9mIjogWwotICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAotICAgICAgICB7Ci0gICAgICAgICAgInJlcXVpcmVkIjogWyAibWVtYmVycyIgXSwKLSAgICAgICAgICAicHJvcGVydGllcyI6IHsKLSAgICAgICAgICAgICJtZW1iZXJzIjogewotICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCi0gICAgICAgICAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAotICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewotICAgICAgICAgICAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKLSAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsgInR5cGUiOiAiaW50ZWdlciIgfQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyAibmFtZSIsICJ2YWx1ZSIgXQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICAidHlwZWRlZiI6IHsKLSAgICAgICJ0eXBlIjogIm9iamVjdCIsCi0gICAgICAiYWxsT2YiOiBbCi0gICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAicHJvcGVydGllcyI6IHsKLSAgICAgICAgICAgICJ0eXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKLSAgICAgICAgICAgICJ0eXBlIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtc3BlYyIgfQotICAgICAgICAgIH0sCi0gICAgICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiBdCi0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgICJjb25zdGFudCI6IHsKLSAgICAgICJ0eXBlIjogIm9iamVjdCIsCi0gICAgICAiYWxsT2YiOiBbCi0gICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCi0gICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLXNwZWMiIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAicHJvcGVydGllcyI6IHsKLSAgICAgICAgICAgICJ2YWx1ZSI6IHsKLSAgICAgICAgICAgICAgIm9uZU9mIjogWwotICAgICAgICAgICAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9LAotICAgICAgICAgICAgICAgIHsgInR5cGUiOiAibnVtYmVyIiB9LAotICAgICAgICAgICAgICAgIHsgInR5cGUiOiAiYXJyYXkiIH0sCi0gICAgICAgICAgICAgICAgeyAidHlwZSI6ICJvYmplY3QiIH0KLSAgICAgICAgICAgICAgXQotICAgICAgICAgICAgfQotICAgICAgICAgIH0sCi0gICAgICAgICAgInJlcXVpcmVkIjogWyAidmFsdWUiIF0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgImZpZWxkIjogewotICAgICAgInR5cGUiOiAib2JqZWN0IiwKLSAgICAgICJhbGxPZiI6IFsKLSAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKLSAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtc3BlYyIgfSwKLSAgICAgICAgewotICAgICAgICAgICJwcm9wZXJ0aWVzIjogewotICAgICAgICAgICAgImtleSI6IHsKLSAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCi0gICAgICAgICAgICAgICJtaW5pbXVtIjogMSwKLSAgICAgICAgICAgICAgIm1heGltdW0iOiA2NTUzNQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICJyZXF1aXJlZCI6IHsKLSAgICAgICAgICAgICAgImVudW0iOiBbICJyZXF1aXJlZCIsICJvcHRpb25hbCIsICJyZXFfb3V0IiBdCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgImRlZmF1bHQiOiB7Ci0gICAgICAgICAgICAgICJvbmVPZiI6IFsKLSAgICAgICAgICAgICAgICB7ICJ0eXBlIjogInN0cmluZyIgfSwKLSAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm51bWJlciIgfSwKLSAgICAgICAgICAgICAgICB7ICJ0eXBlIjogImFycmF5IiB9LAotICAgICAgICAgICAgICAgIHsgInR5cGUiOiAib2JqZWN0IiB9Ci0gICAgICAgICAgICAgIF0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9LAotICAgICAgICAgICJyZXF1aXJlZCI6IFsgImtleSIsICJyZXF1aXJlZCIgXQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICAic3RydWN0IjogewotICAgICAgInR5cGUiOiAib2JqZWN0IiwKLSAgICAgICJhbGxPZiI6IFsKLSAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKLSAgICAgICAgewotICAgICAgICAgICJwcm9wZXJ0aWVzIjogewotICAgICAgICAgICAgImlzRXhjZXB0aW9uIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAotICAgICAgICAgICAgImlzVW5pb24iOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCi0gICAgICAgICAgICAiZmllbGRzIjogewotICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCi0gICAgICAgICAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2ZpZWxkIgotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSwKLSAgICAgICAgICAicmVxdWlyZWQiOiBbICJpc0V4Y2VwdGlvbiIsICJpc1VuaW9uIiwgImZpZWxkcyIgXQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICAidW5pb24iOiB7Ci0gICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdCIKLSAgICB9LAotICAgICJleGNlcHRpb24iOiB7Ci0gICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdCIKLSAgICB9LAotICAgICJmdW5jdGlvbiI6IHsKLSAgICAgICJ0eXBlIjogIm9iamVjdCIsCi0gICAgICAiYWxsT2YiOiBbCi0gICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAib25lT2YiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeyAib25ld2F5IjogeyAidHlwZSI6ICJib29sZWFuIiB9IH0sCi0gICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsgIm9uZXdheSIgXQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7ICJyZXR1cm5UeXBlIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtc3BlYyIgfSB9LAotICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbICJyZXR1cm5UeXBlIiBdCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgInByb3BlcnRpZXMiOiB7Ci0gICAgICAgICAgICAiYXJndW1lbnRzIjogewotICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCi0gICAgICAgICAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgICAgICAgICAiYWxsT2YiOiBbCi0gICAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZmllbGQiIH0sCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeyB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgImV4Y2VwdGlvbnMiOiB7Ci0gICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKLSAgICAgICAgICAgICAgIml0ZW1zIjogewotICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhjZXB0aW9uIgotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSwKLSAgICAgICAgICAicmVxdWlyZWQiOiBbICJvbmV3YXkiLCAiYXJndW1lbnRzIiwgImV4Y2VwdGlvbnMiIF0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgInNlcnZpY2UiOiB7Ci0gICAgICAidHlwZSI6ICJvYmplY3QiLAotICAgICAgImFsbE9mIjogWwotICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAotICAgICAgICB7Ci0gICAgICAgICAgInByb3BlcnRpZXMiOiB7Ci0gICAgICAgICAgICAiZnVuY3Rpb25zIjogewotICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCi0gICAgICAgICAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Z1bmN0aW9uIgotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSwKLSAgICAgICAgICAicmVxdWlyZWQiOiBbICJmdW5jdGlvbnMiIF0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0KLSAgfSwKLQotICAidHlwZSI6ICJvYmplY3QiLAotICAicmVxdWlyZWQiOiBbCi0gICAgIm5hbWUiLAotICAgICJuYW1lc3BhY2VzIiwKLSAgICAiaW5jbHVkZXMiLAotICAgICJlbnVtcyIsCi0gICAgInR5cGVkZWZzIiwKLSAgICAic3RydWN0cyIsCi0gICAgImNvbnN0YW50cyIsCi0gICAgInNlcnZpY2VzIgotICBdLAotICAicHJvcGVydGllcyI6IHsKLSAgICAibmFtZSI6IHsKLSAgICAgICJ0eXBlIjogInN0cmluZyIKLSAgICB9LAotICAgICJpbmNsdWRlcyI6IHsKLSAgICAgICJ0eXBlIjogImFycmF5IiwKLSAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgInR5cGUiOiAic3RyaW5nIgotICAgICAgfSwKLSAgICAgICJ1bmlxdWVJdGVtcyI6IHRydWUKLSAgICB9LAotICAgICJlbnVtcyI6IHsKLSAgICAgICJ0eXBlIjogImFycmF5IiwKLSAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9lbnVtIgotICAgICAgfQotICAgIH0sCi0gICAgInR5cGVkZWZzIjogewotICAgICAgInR5cGUiOiAiYXJyYXkiLAotICAgICAgIml0ZW1zIjogewotICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGVkZWYiCi0gICAgICB9Ci0gICAgfSwKLSAgICAic3RydWN0cyI6IHsKLSAgICAgICJ0eXBlIjogImFycmF5IiwKLSAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJ1Y3QiCi0gICAgICB9Ci0gICAgfSwKLSAgICAiY29uc3RhbnRzIjogewotICAgICAgInR5cGUiOiAiYXJyYXkiLAotICAgICAgIml0ZW1zIjogewotICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbnN0YW50IgotICAgICAgfQotICAgIH0sCi0gICAgInNlcnZpY2VzIjogewotICAgICAgInR5cGUiOiAiYXJyYXkiLAotICAgICAgIml0ZW1zIjogewotICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NlcnZpY2UiCi0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUuYW0gYi9saWIvTWFrZWZpbGUuYW0KaW5kZXggNTA2NmEwMC4uNzMzMjZhNSAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlLmFtCisrKyBiL2xpYi9NYWtlZmlsZS5hbQpAQCAtMTcsOSArMTcsMTMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVNVQkRJUlMgPQorU1VCRElSUyA9IGpzb24geG1sCiBQUkVDUk9TU19UQVJHRVQgPQogCitpZiBXSVRIX0FTMworU1VCRElSUyArPSBhczMKK2VuZGlmCisKIGlmIFdJVEhfQ1BQCiBTVUJESVJTICs9IGNwcAogZW5kaWYKQEAgLTMwLDcgKzM0LDYgQEAKIAogaWYgV0lUSF9NT05PCiBTVUJESVJTICs9IGNzaGFycAotUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWNzaGFycAogZW5kaWYKIAogaWYgV0lUSF9KQVZBCkBAIC0zOCw3ICs0MSw3IEBACiBQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtamF2YQogIyBKYXZhU2NyaXB0IHVuaXQgdGVzdCBkZXBlbmRzIG9uIGphdmEKICMgc28gdGVzdCBvbmx5IGlmIGphdmEsIGFudCAmIGNvIGlzIGF2YWlsYWJsZQotU1VCRElSUyArPSBqcy90ZXN0CitTVUJESVJTICs9IGpzCiBlbmRpZgogCiBpZiBXSVRIX1BZVEhPTgpAQCAtNjUsMjkgKzY4LDUyIEBACiBTVUJESVJTICs9IHBocAogZW5kaWYKIAoraWYgV0lUSF9EQVJUCitTVUJESVJTICs9IGRhcnQKK2VuZGlmCisKK2lmIFdJVEhfRE9UTkVUCitTVUJESVJTICs9IG5ldGNvcmUKK1NVQkRJUlMgKz0gbmV0c3RkCitlbmRpZgorCiBpZiBXSVRIX0dPCiBTVUJESVJTICs9IGdvCiBlbmRpZgogCiBpZiBXSVRIX0QKIFNVQkRJUlMgKz0gZAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWQKIGVuZGlmCiAKIGlmIFdJVEhfTk9ERUpTCiBTVUJESVJTICs9IG5vZGVqcwogUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLW5vZGVqcworU1VCRElSUyArPSBub2RldHMKIGVuZGlmCiAKIGlmIFdJVEhfTFVBCiBTVUJESVJTICs9IGx1YQogZW5kaWYKIAoraWYgV0lUSF9SUworU1VCRElSUyArPSBycworZW5kaWYKKworaWYgV0lUSF9DTAorU1VCRElSUyArPSBjbAorZW5kaWYKKworaWYgV0lUSF9TV0lGVAorU1VCRElSUyArPSBzd2lmdAorZW5kaWYKKwogIyBBbGwgb2YgdGhlIGxpYnMgdGhhdCBkb24ndCB1c2UgQXV0b21ha2UgbmVlZCB0byBnbyBpbiBoZXJlCiAjIHNvIHRoZXkgd2lsbCBlbmQgdXAgaW4gb3VyIHJlbGVhc2UgdGFyYmFsbHMuCiBFWFRSQV9ESVNUID0gXAogCWFzMyBcCi0JY29jb2EgXAogCWQgXAorCWRhcnQgXAogCWRlbHBoaSBcCiAJaGF4ZSBcCiAJamF2YW1lIFwKZGlmZiAtLWdpdCBhL2xpYi9hczMvQ01ha2VMaXN0cy50eHQgYi9saWIvYXMzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OTkwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYXMzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNjggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZiAoSVNfQUJTT0xVVEUgIiR7TElCX0lOU1RBTExfRElSfSIpCisgICAgc2V0KEFTM19JTlNUQUxMX0RJUiAiJHtMSUJfSU5TVEFMTF9ESVJ9L2FzMyIpCitlbHNlICgpCisgICAgc2V0KEFTM19JTlNUQUxMX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtMSUJfSU5TVEFMTF9ESVJ9L2FzMyIpCitlbmRpZiAoKQorCitzZXQoUFJFTEVBU0UgInRydWUiKQoraWYgKENNQUtFX0JVSUxEX1RZUEUgTUFUQ0hFUyBERUJVRykKKyAgICBzZXQoUFJFTEVBU0UgImZhbHNlIikKK2VuZGlmICgpCisKK2FkZF9jdXN0b21fdGFyZ2V0KFRocmlmdEFzMyBBTEwKKyAgICBDT01NRU5UICJCdWlsZGluZyBhczMgbGlicmFyeSB1c2luZyBHcmFkbGUgV3JhcHBlciIKKyAgICBDT01NQU5EICR7R1JBRExFV19FWEVDVVRBQkxFfSAke0dSQURMRV9PUFRTfSBjb21waWxlRmxleAorICAgICAgICAtLWNvbnNvbGU9cGxhaW4gLS1uby1kYWVtb24KKyAgICAgICAgLVByZWxlYXNlPSR7UFJFTEVBU0V9CisgICAgICAgICItUGJ1aWxkLmRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQiCisgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICkKKworIyBFbmFibGUgcHVibGlzaGluZyBmcm9tIENNYWtlIGlmIHRoZSBwdWJsaXNoaW5nIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkCitpZiAoTk9UIENNQUtFX0JVSUxEX1RZUEUgTUFUQ0hFUyBERUJVRykKKyAgICBhZGRfY3VzdG9tX3RhcmdldChNYXZlblB1Ymxpc2hBczMKKyAgICAgICAgQ09NTUVOVCAiUHVibGlzaGluZyBhczMgbGlicmFyeSB0byBBcGFjaGUgTWF2ZW4gc3RhZ2luZyIKKyAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gY2xlYW4gcHVibGlzaE1hdmVuUHVibGljYXRpb25Ub01hdmVuUmVwb3NpdG9yeQorICAgICAgICAgICAgLS1jb25zb2xlPXBsYWluIC0tbm8tZGFlbW9uCisgICAgICAgICAgICAtUHJlbGVhc2U9JHtQUkVMRUFTRX0KKyAgICAgICAgICAgIC1Qc2lnbj0ke1BSRUxFQVNFfQorICAgICAgICAgICAgIi1QYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZCIKKyAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgKQorZW5kaWYgKCkKKworIyBIb29rIHRoZSBDTWFrZSBpbnN0YWxsIHByb2Nlc3MgdG8gdGhlIHJlc3VsdHMgZnJvbSBtYWtlIEFMTC4KKyMgVGhpcyB3b3JrcyBiZXN0IHdoZW4gJ21ha2UgYWxsICYmIHN1ZG8gbWFrZSBpbnN0YWxsL2Zhc3QnIGlzIHVzZWQuCisjIFVzaW5nIHNsYXNoIHRvIGVuZCB0aGUgc291cmNlIGxvY2F0aW9uIHRvIGF2b2lkIGNvcHlpbmcgdGhlIGRpcmVjdG9yeSBwYXRoLgoraW5zdGFsbChESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkL2xpYnMvCisgICAgICAgIERFU1RJTkFUSU9OICR7QVMzX0lOU1RBTExfRElSfQorICAgICAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICJsaWJ0aHJpZnQtYXMzLnN3YyIpCisKK2lmIChCVUlMRF9URVNUSU5HKQorICAgIGFkZF90ZXN0KE5BTUUgQXMzVGVzdAorICAgICAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gdGVzdAorICAgICAgICAgICAgICAgIC0tY29uc29sZT1wbGFpbiAtLW5vLWRhZW1vbgorICAgICAgICAgICAgICAgIC1QcmVsZWFzZT0ke1BSRUxFQVNFfQorICAgICAgICAgICAgICAgICItUGJ1aWxkLmRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQiCisgICAgICAgICAgICAgICAgIi1QdGhyaWZ0LmNvbXBpbGVyPSR7VEhSSUZUX0NPTVBJTEVSfSIKKyAgICAgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKK2VuZGlmICgpCmRpZmYgLS1naXQgYS9saWIvYXMzL01ha2VmaWxlLmFtIGIvbGliL2FzMy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjNjM2JlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2FzMy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDYwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworYWxsLWxvY2FsOgorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSBjb21waWxlIFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktLWNvbnNvbGU9cGxhaW4KKworaW5zdGFsbC1leGVjLWhvb2s6CisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIHB1Ymxpc2hUb01hdmVuTG9jYWwgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS0tY29uc29sZT1wbGFpbgorCitjbGVhbi1sb2NhbDoKKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgY2xlYW4gXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisgICAgICAgICAgICAgICAgLS1jb25zb2xlPXBsYWluCisJJChSTSkgLXIgLmdyYWRsZQorCitjaGVjay1sb2NhbDogJChUSFJJRlQpCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIHRlc3QgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS0tY29uc29sZT1wbGFpbgorCittYXZlbi1wdWJsaXNoOgorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSBwdWJsaXNoTWF2ZW5QdWJsaWNhdGlvblRvTWF2ZW5SZXBvc2l0b3J5IFwKKwkJLVByZWxlYXNlPXRydWUgXAorICAgICAgICAgICAgICAgIC1Qc2lnbj10cnVlIFwKKwkJLS1jb25zb2xlPXBsYWluCisKK2Rpc3QtaG9vazoKKwkkKFJNKSAtciAkKGRpc3RkaXIpLy5ncmFkbGUvCisKK0VYVFJBX0RJU1QgPSBcCisJQ01ha2VMaXN0cy50eHQgXAorCVJFQURNRS5tZCBcCisJYnVpbGQuZ3JhZGxlIFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlncmFkbGUgXAorCWdyYWRsZS5wcm9wZXJ0aWVzIFwKKwlncmFkbGV3IFwKKwlncmFkbGV3LmJhdCBcCisJc2V0dGluZ3MuZ3JhZGxlIFwKKwlzcmMKZGlmZiAtLWdpdCBhL2xpYi9hczMvUkVBRE1FLm1kIGIvbGliL2FzMy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0ZjhjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hczMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzcgQEAKKyMgQXBhY2hlIFRocmlmdCBBY3Rpb25TY3JpcHQgTGlicmFyeQorCisjIyBCdWlsZGluZworCitXZSB1c2UgZ3JhZGxlIGFuZCBncmFkbGVmeCB0byBidWlsZCB0aGUgYXMzIGxpYnJhcnkuICBVbmZvcnR1bmF0ZWx5IGdyYWRsZWZ4IHJlcXVpcmVzCithbiBvbGRlciB2ZXJzaW9uIG9mIGdyYWRsZSAoMi41KSBidXQgaXQgc3RpbGwgd29ya3MgLSBmb3Igbm93LiAgSWYgeW91IHVzZSB0aGUgZG9ja2VyCitjb250YWluZXIgdG8gZG8gdGhlIGJ1aWxkLCB0aGUgQWRvYmUgRmxleCBTREsgNC42IGlzIGluc3RhbGxlZCBhbmQgdGhlIEZMRVhfSE9NRQorZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgY29uZmlndXJlZDoKKworICAgIGRldkB1YnVudHU6fi90aHJpZnQkIGRvY2tlciBydW4gLXYgJChwd2QpOi90aHJpZnQvc3JjOnJ3IC1pdCB0aHJpZnQvdGhyaWZ0LWJ1aWxkOnVidW50dS1iaW9uaWMgL2Jpbi9iYXNoCisgICAgcm9vdEA3NjI0YjYxYmJmODQ6L3RocmlmdC9zcmMjIGNkIGxpYi9hczMKKyAgICByb290QDc2MjRiNjFiYmY4NDovdGhyaWZ0L3NyYy9saWIvYXMzIyAuL2dyYWRsZXcgLVByZWxlYXNlPXRydWUgY29tcGlsZUZsZXgKKworICAgIC4uLgorCisgICAgOmNvbXBpbGVGbGV4IFVQLVRPLURBVEUKKworICAgIEJVSUxEIFNVQ0NFU1NGVUwKKworICAgIFRvdGFsIHRpbWU6IDEwLjc4NCBzZWNzCisKKyAgICByb290QDc2MjRiNjFiYmY4NDovdGhyaWZ0L3NyYy9saWIvYXMzIyBscyAtbHMgYnVpbGQvCisgICAgdG90YWwgNAorICAgIDQgLXJ3LXItLXItLSAxIHJvb3Qgcm9vdCAxMzc5IEphbiAyMiAxOToyMyBsaWJ0aHJpZnQtYXMzLnN3YworCisjIyBQdWJsaXNoaW5nCisKK1dlIHVzZSBhIHNpbWlsYXIgZ3JhZGxlLWJhc2VkIHNpZ25pbmcgYW5kIHB1Ymxpc2hpbmcgbWVjaGFuaXNtIGFzIGluIHRoZSBqYXZhCitsaWJyYXJ5LiAgU2VlIHRoZSBqYXZhIGxpYnJhcnkgW1JFQURNRS5tZF0oLi4vamF2YS9SRUFETUUubWQpIGZvciBtb3JlIGRldGFpbHMuCisKK1RvIHB1Ymxpc2ggaW50byBhIGxvY2FsIC5tMiByZXBvc2l0b3J5IHlvdSBjYW4gbW91bnQgYSBkaXJlY3RvcnkgaW50byB0aGUgZG9ja2VyIGNvbnRhaW5lciwKK2ZvciBleGFtcGxlOgorCisgICAgZGV2QHVidW50dTp+L3RocmlmdCQgZG9ja2VyIHJ1biAtdn4vLm0yOi9yb290Ly5tMiAtdiAkKHB3ZCk6L3RocmlmdC9zcmM6cncgLWl0IHRocmlmdC90aHJpZnQtYnVpbGQ6dWJ1bnR1LWJpb25pYyAvYmluL2Jhc2gKKyAgICByb290QDc2MjRiNjFiYmY4NDovdGhyaWZ0L3NyYy9saWIvYXMzIyAuL2dyYWRsZXcgLVByZWxlYXNlPXRydWUgcHVibGlzaFRvTWF2ZW5Mb2NhbAorCitZb3Ugd2lsbCBmaW5kIHlvdXIgYH4vLm0yYCBkaXJlY3RvcnkgaXMgbm93IHBvcHVsYXRlZCB3aXRoIGEgcmVsZWFzZSBidWlsZCBgc3djYC4KZGlmZiAtLWdpdCBhL2xpYi9hczMvYnVpbGQuZ3JhZGxlIGIvbGliL2FzMy9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1MzQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hczMvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworYnVpbGRzY3JpcHQgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIG1hdmVuTG9jYWwoKQorICAgICAgICBtYXZlbkNlbnRyYWwoKQorICAgIH0KKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbGFzc3BhdGggZ3JvdXA6ICdvcmcuZ3JhZGxlZngnLCBuYW1lOiAnZ3JhZGxlZngnLCB2ZXJzaW9uOiAnMS41LjAnCisgICAgfQorfQorCitwbHVnaW5zIHsKKyAgICBpZCAnbWF2ZW4tcHVibGlzaCcKKyAgICBpZCAnc2lnbmluZycKK30KKworYXBwbHkgcGx1Z2luOiAnZ3JhZGxlZngnCisKK2Rlc2NyaXB0aW9uID0gJ0FwYWNoZSBUaHJpZnQgQWN0aW9uU2NyaXB0IExpYnJhcnknCitmcmFtZXdvcmtMaW5rYWdlID0gJ25vbmUnCitncm91cCA9IHByb3BlcnR5KCd0aHJpZnQuZ3JvdXBpZCcpCitzcmNEaXJzID0gWydzcmMnXQordHlwZSA9ICdzd2MnCisKKy8vIFdlIHVzZSB0aGUgU05BUFNIT1Qgc3VmZml4IGZvciBub24tcmVsZWFzZSB2ZXJzaW9ucworaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb2plY3QucmVsZWFzZSkpIHsKKyAgICBhZGRpdGlvbmFsQ29tcGlsZXJPcHRpb25zID0gWyctY29tcGlsZXIuZGVidWc9ZmFsc2UnLCAnLWNvbXBpbGVyLnN0cmljdD10cnVlJ10KKyAgICB2ZXJzaW9uID0gcHJvcGVydHkoJ3RocmlmdC52ZXJzaW9uJykKK30gZWxzZSB7CisgICAgYWRkaXRpb25hbENvbXBpbGVyT3B0aW9ucyA9IFsnLWNvbXBpbGVyLmRlYnVnPXRydWUnLCAnLWNvbXBpbGVyLnN0cmljdD10cnVlJ10KKyAgICB2ZXJzaW9uID0gcHJvcGVydHkoJ3RocmlmdC52ZXJzaW9uJykgKyAnLVNOQVBTSE9UJworfQorCitkZWZhdWx0VGFza3MgJ2NvbXBpbGUnCisKKy8vIEtlZXBpbmcgdGhlIHJlc3Qgb2YgdGhlIGJ1aWxkIGxvZ2ljIGluIGZ1bmN0aW9uYWwgbmFtZWQgc2NyaXB0cyBmb3IgY2xhcml0eQorYXBwbHkgZnJvbTogJ2dyYWRsZS9wdWJsaXNoaW5nLmdyYWRsZScKKwpkaWZmIC0tZ2l0IGEvbGliL2FzMy9idWlsZC54bWwgYi9saWIvYXMzL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA0ZGE0Mi4uMDAwMDAwMAotLS0gYS9saWIvYXMzL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci08cHJvamVjdCBuYW1lPSJsaWJ0aHJpZnQtYXMzIiBkZWZhdWx0PSJjb21waWxlIiBiYXNlZGlyPSIuIgotICB4bWxuczphcnRpZmFjdD0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50Ij4KLQkKLSAgPHByb3BlcnR5IG5hbWU9ImFzMy5hcnRpZmFjdGlkIiB2YWx1ZT0iJHthbnQucHJvamVjdC5uYW1lfSIvPgotCQotICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnJvb3QiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uLy4uLyIvPgotICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQucm9vdH0vbGliL2phdmEiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9jb21waWxlciIgdmFsdWU9IiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQiLz4gCi0KLSAgPCEtLSBpbmhlcml0IGZyb20gdGhlIGphdmEgYnVpbGQgZmlsZSBmb3IgdmVyc2lvbiBhbmQgb3RoZXIgcHJvcGVydGllcyAtLT4KLSAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgotCi0gIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0KLSAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259Ij4KLSAgICA8aXNzZXQgcHJvcGVydHk9InJlbGVhc2UiLz4KLSAgPC9jb25kaXRpb24+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0tc25hcHNob3QiLz4KLQotICA8cHJvcGVydHkgbmFtZT0iYXMzLmZpbmFsLm5hbWUiIHZhbHVlPSIke2FzMy5hcnRpZmFjdGlkfS0ke3ZlcnNpb259Ii8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9InNyYyIgdmFsdWU9IiR7YmFzZWRpcn0vc3JjIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSIke2Jhc2VkaXJ9L2J1aWxkIi8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImFzMy5zd2MuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2FzMy5maW5hbC5uYW1lfS5zd2MiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImFzMy5wb20ueG1sIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9LyR7YXMzLmZpbmFsLm5hbWV9LnBvbSIvPgotCi0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0ic2V0dXAuaW5pdCxmbGV4LmluaXQiIHVubGVzcz0iaW5pdC5maW5pc2hlZCI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImluaXQuZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ic2V0dXAuaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZmxleC5jaGVjayIgdW5sZXNzPSJGTEVYX0hPTUUiPgotICAgIDxmYWlsIG1lc3NhZ2U9J1lvdSBtdXN0IHNldCB0aGUgRkxFWF9IT01FIHByb3BlcnR5IHBvaW50aW5nIHRvIHlvdXIgZmxleCBTREssIGVnLiBhbnQgLURGTEVYX0hPTUU9Ii9BcHBsaWNhdGlvbnMvQWRvYmUgRmxleCBCdWlsZGVyIDMvc2Rrcy8zLjIuMCInLz4KLSAgPC90YXJnZXQ+Ci0JCi0gIDx0YXJnZXQgbmFtZT0iZmxleC5pbml0IiBkZXBlbmRzPSJmbGV4LmNoZWNrIiB1bmxlc3M9ImZsZXguZmluaXNoZWQiPgotICAgIDx0YXNrZGVmIHJlc291cmNlPSJmbGV4VGFza3MudGFza3MiIGNsYXNzcGF0aD0iJHtGTEVYX0hPTUV9L2FudC9saWIvZmxleFRhc2tzLmphciIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iZmxleC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8cGF0aCBpZD0iYXMuc3JjLmZpbGVzIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9LyI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouYXMiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L3BhdGg+Ci0gICAgPHBhdGhjb252ZXJ0IAotICAgICAgcHJvcGVydHk9ImFzLnNyYy5jbGFzc2VzIiAKLSAgICAgIHBhdGhzZXA9IiAiIAotICAgICAgZGlyc2VwPSIuIiAKLSAgICAgIHJlZmlkPSJhcy5zcmMuZmlsZXMiCi0gICAgPgotICAgICAgPG1hcCBmcm9tPSIke3NyY30vIiB0bz0iIi8+Ci0gICAgICA8bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209IiouYXMiIHRvPSIqIi8+Ci0gICAgPC9wYXRoY29udmVydD4KLQotICAgIDxjb21wYyBvdXRwdXQ9IiR7YXMzLnN3Yy5maWxlfSIgaW5jbHVkZS1jbGFzc2VzPSIke2FzLnNyYy5jbGFzc2VzfSI+Ci0gICAgICA8c291cmNlLXBhdGggcGF0aC1lbGVtZW50PSIke3NyY30iLz4KLSAgICA8L2NvbXBjPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9IiAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9InNldHVwLmluaXQsbXZuLmFudC50YXNrcy5jaGVjayIgdW5sZXNzPSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KLSAgICA8Z2V0IHNyYz0iJHttdm4uYW50LnRhc2sudXJsfS8ke212bi5hbnQudGFzay5qYXJ9IiBkZXN0PSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5jaGVjayI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXZuLmFudC50YXNrcy5mb3VuZCI+Ci0gICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im12bi5pbml0IiBkZXBlbmRzPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+Ci0gICAgPGVjaG8gbWVzc2FnZT0iJHttdm4uYW50LnRhc2suamFyfSIvPgotICAgIDwhLS0gRG93bmxvYWQgbXZuIGFudCB0YXNrcywgZG93bmxvYWQgZGVwZW5kZW5jaWVzLCBhbmQgc2V0dXAgcG9tIGZpbGUgLS0+Ci0gICAgPHR5cGVkZWYgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIGNsYXNzcGF0aD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iLz4KLQotICAgIDwhLS0gcmVtb3RlIHJlcG9zaXRvcmllcyB1c2VkIHRvIGRvd25sb2FkIGRlcGVuZGVuY2llcyBmcm9tIC0tPgotICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJjZW50cmFsIiB1cmw9IiR7bXZuLnJlcG99Ii8+Ci0gICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9ImFwYWNoZSIgdXJsPSIke2FwYWNoZS5yZXBvfSIvPgotCi0gICAgPCEtLSBQb20gZmlsZSBpbmZvcm1hdGlvbiAtLT4KLSAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iIAotICAgICAgZ3JvdXBJZD0iJHt0aHJpZnQuZ3JvdXBpZH0iIAotICAgICAgYXJ0aWZhY3RJZD0iJHthczMuYXJ0aWZhY3RpZH0iCi0gICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IiAKLSAgICAgIHVybD0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgotICAgICAgbmFtZT0iQXBhY2hlIFRocmlmdCIKLSAgICAgIGRlc2NyaXB0aW9uPSJUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LiIKLSAgICAgIHBhY2thZ2luZz0icG9tIgotICAgID4KLSAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJjZW50cmFsIi8+Ci0gICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iYXBhY2hlIi8+Ci0gICAgICA8bGljZW5zZSBuYW1lPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wIiB1cmw9IiR7bGljZW5zZX0iLz4KLSAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdCIgCi0gICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IgotICAgICAgdXJsPSJodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD10aHJpZnQuZ2l0IgotICAgICAgLz4KLSAgICAgIDwhLS0gVGhyaWZ0IERldmVsb3BlcnMgLS0+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJtY3NsZWUiIG5hbWU9Ik1hcmsgU2xlZSIvPgotICAgICAgPGRldmVsb3BlciBpZD0iZHJlaXNzIiBuYW1lPSJEYXZpZCBSZWlzcyIvPgotICAgICAgPGRldmVsb3BlciBpZD0iYWRpdHlhIiBuYW1lPSJBZGl0eWEgQWdhcndhbCIvPgotICAgICAgPGRldmVsb3BlciBpZD0ibWFyY2siIG5hbWU9Ik1hcmMgS3dpYXRrb3dza2kiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Imp3YW5nIiBuYW1lPSJKYW1lcyBXYW5nIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJjcGlybyIgbmFtZT0iQ2hyaXMgUGlybyIvPgotICAgICAgPGRldmVsb3BlciBpZD0iYm1hdXJlciIgbmFtZT0iQmVuIE1hdXJlciIvPgotICAgICAgPGRldmVsb3BlciBpZD0ia2NsYXJrIiBuYW1lPSJLZXZpbiBDbGFyayIvPgotICAgICAgPGRldmVsb3BlciBpZD0iamFrZSIgbmFtZT0iSmFrZSBMdWNpYW5pIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJicnlhbmR1eGJ1cnkiIG5hbWU9IkJyeWFuIER1eGJ1cnkiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImVzdGV2ZSIgbmFtZT0iRXN0ZXZlIEZlcm5hbmRleiIvPgotICAgICAgPGRldmVsb3BlciBpZD0idG9kZCIgbmFtZT0iVG9kZCBMaXBjb24iLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImdlZWNob3JhbWEiIG5hbWU9IkFuZHJldyBNY0dlYWNoaWUiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Im1vbGluYXJvIiBuYW1lPSJBbnRob255IE1vbGluYXJvIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJyb2dlciIgbmFtZT0iUm9nZXIgTWVpZXIiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImpmYXJyZWxsIiBuYW1lPSJKYWtlIEZhcnJlbGwiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImplbnNnIiBuYW1lPSJKZW5zIEdleWVyIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJjYXJsIiBuYW1lPSJDYXJsIFlla3NpZ2lhbiIvPgotICAgIDwvYXJ0aWZhY3Q6cG9tPgotCi0gICAgPCEtLSBHZW5lcmF0ZSB0aGUgcG9tIGZpbGUgLS0+Ci0gICAgPGFydGlmYWN0OndyaXRlcG9tIHBvbVJlZklkPSJwb20iIGZpbGU9IiR7YXMzLnBvbS54bWx9Ii8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0ibXZuLmZpbmlzaGVkIiB2YWx1ZT0idHJ1ZSIvPgotICA8L3RhcmdldD4KLQotICA8bWFjcm9kZWYgbmFtZT0ic2lnbkFuZERlcGxveSI+Ci0gICAgPCEtLSBTaWduIGFuZCBkZXBsb3kgamFycyB0byBhcGFjaGUgcmVwbyAtLT4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzaWZpZXIiIGRlZmF1bHQ9IiIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFja2FnaW5nIiBkZWZhdWx0PSJqYXIiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9InBvbSIgZGVmYXVsdD0iIi8+Ci0gICAgPHNlcXVlbnRpYWw+Ci0gICAgICA8YXJ0aWZhY3Q6bXZuIGZvcms9InRydWUiPgotICAgICAgICA8YXJnIHZhbHVlPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tZ3BnLXBsdWdpbjoxLjE6c2lnbi1hbmQtZGVwbG95LWZpbGUiLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURyZXBvc2l0b3J5SWQ9JHttYXZlbi1yZXBvc2l0b3J5LWlkfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRHVybD0ke21hdmVuLXJlcG9zaXRvcnktdXJsfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRHBvbUZpbGU9QHtwb219Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EZmlsZT1Ae2ZpbGV9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EY2xhc3NpZmllcj1Ae2NsYXNzaWZpZXJ9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EcGFja2FnaW5nPUB7cGFja2FnaW5nfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItUGdwZyIvPgotICAgICAgPC9hcnRpZmFjdDptdm4+Ci0gICAgPC9zZXF1ZW50aWFsPgotICA8L21hY3JvZGVmPgotCi0gIDx0YXJnZXQgbmFtZT0icHVibGlzaCIgZGVwZW5kcz0iY2xlYW4sY29tcGlsZSxtdm4uaW5pdCI+Ci0gICAgPCEtLSBDb21waWxlLCBwYWNrYWdlcyBhbmQgdGhlbiBzZW5kIHJlbGVhc2UgdG8gYXBhY2hlIG1hdmVuIHJlcG8gLS0+Ci0gICAgPCEtLSBydW4gd2l0aDogYW50IC1EcmVsZWFzZT10cnVlIHB1Ymxpc2ggLS0+Ci0gICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHthczMucG9tLnhtbH0iIHBhY2thZ2luZz0icG9tIiBjbGFzc2lmaWVyPSIiIHBvbT0iJHthczMucG9tLnhtbH0iLz4KLSAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2FzMy5zd2MuZmlsZX0iIHBhY2thZ2luZz0ic3djIiBjbGFzc2lmaWVyPSIiIHBvbT0iJHthczMucG9tLnhtbH0iLz4KLSAgPC90YXJnZXQ+CQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2FzMy9ncmFkbGUucHJvcGVydGllcyBiL2xpYi9hczMvZ3JhZGxlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJkNWVlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hczMvZ3JhZGxlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMyBAQAorIyBUaGlzIGZpbGUgaXMgc2hhcmVkIGN1cnJlbnRseSBiZXR3ZWVuIHRoaXMgR3JhZGxlIGJ1aWxkIGFuZCB0aGUKKyMgQW50IGJ1aWxkcyBmb3IgZmQzMDMgYW5kIEphdmFTY3JpcHQuIEtlZXAgdGhlIGRvdHRlZCBub3RhdGlvbiBmb3IKKyMgdGhlIHByb3BlcnRpZXMgdG8gbWluaW1pemUgdGhlIGNoYW5nZXMgaW4gdGhlIGRlcGVuZGVuY2llcy4KK3RocmlmdC52ZXJzaW9uPTAuMTMuMAordGhyaWZ0Lmdyb3VwaWQ9b3JnLmFwYWNoZS50aHJpZnQKK3JlbGVhc2U9ZmFsc2UKK3NpZ249ZmFsc2UKKworIyBMb2NhbCBJbnN0YWxsIHBhdGhzCitpbnN0YWxsLnBhdGg9L3Vzci9sb2NhbC9saWIKK2luc3RhbGwuamF2YWRvYy5wYXRoPS91c3IvbG9jYWwvbGliCisKKyMgVGVzdCBleGVjdXRpb24gcHJvcGVydGllcwordGVzdFBvcnQ9OTA5MAorCisjIE1hdmVuIGRlcGVuZGVuY3kgZG93bmxvYWQgbG9jYXRpb25zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorYXBhY2hlLnJlcG89aHR0cHM6Ly9yZXBvc2l0b3J5LmFwYWNoZS5vcmcvY29udGVudC9yZXBvc2l0b3JpZXMvcmVsZWFzZXMKKworIyBBcGFjaGUgTWF2ZW4gcHVibGlzaAorbGljZW5zZT1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0CittYXZlbi1yZXBvc2l0b3J5LXVybD1odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMgorbWF2ZW4tcmVwb3NpdG9yeS1pZD1hcGFjaGUucmVsZWFzZXMuaHR0cHMKZGlmZiAtLWdpdCBhL2xpYi9hczMvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlIGIvbGliL2FzMy9ncmFkbGUvcHVibGlzaGluZy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwZWNmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hczMvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCittb2RlbCB7CisgICAgdGFza3Muc2lnbk1hdmVuUHVibGljYXRpb24geworICAgICAgICBkZXBlbmRzT24gY29tcGlsZUZsZXgKKyAgICB9Cit9CisKK3B1Ymxpc2hpbmcgeworICAgIHB1YmxpY2F0aW9ucyB7CisgICAgICAgIG1hdmVuKE1hdmVuUHVibGljYXRpb24pIHsKKworICAgICAgICAgICAgZ3JvdXBJZCA9ICIkZ3JvdXAiCisgICAgICAgICAgICBhcnRpZmFjdElkID0gIiR7cHJvamVjdC5uYW1lfSIKKyAgICAgICAgICAgIHZlcnNpb24gPSAiJHZlcnNpb24iCisKKyAgICAgICAgICAgIGRlZiBzd2NGaWxlID0gZmlsZSgiJGJ1aWxkRGlyL2xpYnRocmlmdC1hczMuc3djIikKKyAgICAgICAgICAgIGFydGlmYWN0KHN3Y0ZpbGUpCisKKyAgICAgICAgICAgIHBvbSB7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAnVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4nCisgICAgICAgICAgICAgICAgcGFja2FnaW5nID0gJ3N3YycKKworICAgICAgICAgICAgICAgIC8vIG9sZGVyIGdyYWRsZSBkb2Vzbid0IHJlY29nbml6ZSBhbGwgdGhlIHByb3BlcnRpZXMsIHNvIHdlIGluamVjdCB0aGVtLi4KKyAgICAgICAgICAgICAgICB3aXRoWG1sIHsKKyAgICAgICAgICAgICAgICAgICAgYXNOb2RlKCkud2l0aCB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlKCduYW1lJywgJ0FwYWNoZSBUaHJpZnQnKQorICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSgndXJsJywgJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8nKQorICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSgnc2NtJykud2l0aCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSgndXJsJywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSgnY29ubmVjdGlvbicsICdzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSgnZGV2ZWxvcGVyQ29ubmVjdGlvbicsICdzY206Z2l0OmdpdEBnaXRodWIuY29tOmFwYWNoZS90aHJpZnQuZ2l0JykKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUoJ2lzc3VlTWFuYWdlbWVudCcpLndpdGggeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUoJ3VybCcsICdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvcHJvamVjdHMvVEhSSUZULycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSgnc3lzdGVtJywgJ0ppcmEnKQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSgnbGljZW5zZXMnKS53aXRoIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlKCdsaWNlbnNlJykud2l0aCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUoJ25hbWUnLCAnVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUoJ3VybCcsICIke3Byb2plY3QubGljZW5zZX0iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUoJ29yZ2FuaXphdGlvbicpLndpdGggeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUoJ25hbWUnLCAnVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlKCd1cmwnLCAnaHR0cDovL3d3dy5hcGFjaGUub3JnLycpCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlKCdkZXZlbG9wZXJzJykud2l0aCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSgnZGV2ZWxvcGVyJykud2l0aCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUoJ2lkJywgJ2RldicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUoJ25hbWUnLCAnQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSgnZW1haWwnLCAnZGV2QHRocmlmdC5hcGFjaGUub3JnJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgbWF2ZW4geworICAgICAgICAgICAgdXJsID0gcHJvcGVydHkoJ21hdmVuLXJlcG9zaXRvcnktdXJsJykKKworICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ21hdmVuVXNlcicpICYmIHByb2plY3QuaGFzUHJvcGVydHkoJ21hdmVuUGFzc3dvcmQnKSkgeworICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUgPSBwcm9wZXJ0eSgnbWF2ZW5Vc2VyJykKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBwcm9wZXJ0eSgnbWF2ZW5QYXNzd29yZCcpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzaWduaW5nIHsKKyAgICByZXF1aXJlZCB7IHByb3BlcnR5KCdzaWduJykgfQorICAgIHNpZ24gcHVibGlzaGluZy5wdWJsaWNhdGlvbnMubWF2ZW4KK30KZGlmZiAtLWdpdCBhL2xpYi9hczMvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIGIvbGliL2FzMy9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiNzM4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hczMvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9hczMvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyBiL2xpYi9hczMvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTg4NzBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2FzMy9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorZGlzdHJpYnV0aW9uQmFzZT1HUkFETEVfVVNFUl9IT01FCitkaXN0cmlidXRpb25QYXRoPXdyYXBwZXIvZGlzdHMKK2Rpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTUuMS4xLWJpbi56aXAKK3ppcFN0b3JlQmFzZT1HUkFETEVfVVNFUl9IT01FCit6aXBTdG9yZVBhdGg9d3JhcHBlci9kaXN0cwpkaWZmIC0tZ2l0IGEvbGliL2FzMy9ncmFkbGV3IGIvbGliL2FzMy9ncmFkbGV3Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmNjcwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYXMzL2dyYWRsZXcKQEAgLTAsMCArMSwxNzIgQEAKKyMhL3Vzci9iaW4vZW52IHNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjICBHcmFkbGUgc3RhcnQgdXAgc2NyaXB0IGZvciBVTipYCisjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQXR0ZW1wdCB0byBzZXQgQVBQX0hPTUUKKyMgUmVzb2x2ZSBsaW5rczogJDAgbWF5IGJlIGEgbGluaworUFJHPSIkMCIKKyMgTmVlZCB0aGlzIGZvciByZWxhdGl2ZSBzeW1saW5rcy4KK3doaWxlIFsgLWggIiRQUkciIF0gOyBkbworICAgIGxzPWBscyAtbGQgIiRQUkciYAorICAgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBQUkc9IiRsaW5rIgorICAgIGVsc2UKKyAgICAgICAgUFJHPWBkaXJuYW1lICIkUFJHImAiLyRsaW5rIgorICAgIGZpCitkb25lCitTQVZFRD0iYHB3ZGAiCitjZCAiYGRpcm5hbWUgXCIkUFJHXCJgLyIgPi9kZXYvbnVsbAorQVBQX0hPTUU9ImBwd2QgLVBgIgorY2QgIiRTQVZFRCIgPi9kZXYvbnVsbAorCitBUFBfTkFNRT0iR3JhZGxlIgorQVBQX0JBU0VfTkFNRT1gYmFzZW5hbWUgIiQwImAKKworIyBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4KK0RFRkFVTFRfSlZNX09QVFM9JyItWG14NjRtIicKKworIyBVc2UgdGhlIG1heGltdW0gYXZhaWxhYmxlLCBvciBzZXQgTUFYX0ZEICE9IC0xIHRvIHVzZSB0aGF0IHZhbHVlLgorTUFYX0ZEPSJtYXhpbXVtIgorCit3YXJuICgpIHsKKyAgICBlY2hvICIkKiIKK30KKworZGllICgpIHsKKyAgICBlY2hvCisgICAgZWNobyAiJCoiCisgICAgZWNobworICAgIGV4aXQgMQorfQorCisjIE9TIHNwZWNpZmljIHN1cHBvcnQgKG11c3QgYmUgJ3RydWUnIG9yICdmYWxzZScpLgorY3lnd2luPWZhbHNlCittc3lzPWZhbHNlCitkYXJ3aW49ZmFsc2UKK25vbnN0b3A9ZmFsc2UKK2Nhc2UgImB1bmFtZWAiIGluCisgIENZR1dJTiogKQorICAgIGN5Z3dpbj10cnVlCisgICAgOzsKKyAgRGFyd2luKiApCisgICAgZGFyd2luPXRydWUKKyAgICA7OworICBNSU5HVyogKQorICAgIG1zeXM9dHJ1ZQorICAgIDs7CisgIE5PTlNUT1AqICkKKyAgICBub25zdG9wPXRydWUKKyAgICA7OworZXNhYworCitDTEFTU1BBVEg9JEFQUF9IT01FL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgorCisjIERldGVybWluZSB0aGUgSmF2YSBjb21tYW5kIHRvIHVzZSB0byBzdGFydCB0aGUgSlZNLgoraWYgWyAtbiAiJEpBVkFfSE9NRSIgXSA7IHRoZW4KKyAgICBpZiBbIC14ICIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIiBdIDsgdGhlbgorICAgICAgICAjIElCTSdzIEpESyBvbiBBSVggdXNlcyBzdHJhbmdlIGxvY2F0aW9ucyBmb3IgdGhlIGV4ZWN1dGFibGVzCisgICAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvanJlL3NoL2phdmEiCisgICAgZWxzZQorICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2Jpbi9qYXZhIgorICAgIGZpCisgICAgaWYgWyAhIC14ICIkSkFWQUNNRCIgXSA7IHRoZW4KKyAgICAgICAgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJEpBVkFfSE9NRQorCitQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2xvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgorICAgIGZpCitlbHNlCisgICAgSkFWQUNNRD0iamF2YSIKKyAgICB3aGljaCBqYXZhID4vZGV2L251bGwgMj4mMSB8fCBkaWUgIkVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorCitQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2xvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgorZmkKKworIyBJbmNyZWFzZSB0aGUgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3JzIGlmIHdlIGNhbi4KK2lmIFsgIiRjeWd3aW4iID0gImZhbHNlIiAtYSAiJGRhcndpbiIgPSAiZmFsc2UiIC1hICIkbm9uc3RvcCIgPSAiZmFsc2UiIF0gOyB0aGVuCisgICAgTUFYX0ZEX0xJTUlUPWB1bGltaXQgLUggLW5gCisgICAgaWYgWyAkPyAtZXEgMCBdIDsgdGhlbgorICAgICAgICBpZiBbICIkTUFYX0ZEIiA9ICJtYXhpbXVtIiAtbyAiJE1BWF9GRCIgPSAibWF4IiBdIDsgdGhlbgorICAgICAgICAgICAgTUFYX0ZEPSIkTUFYX0ZEX0xJTUlUIgorICAgICAgICBmaQorICAgICAgICB1bGltaXQgLW4gJE1BWF9GRAorICAgICAgICBpZiBbICQ/IC1uZSAwIF0gOyB0aGVuCisgICAgICAgICAgICB3YXJuICJDb3VsZCBub3Qgc2V0IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEIgorICAgICAgICBmaQorICAgIGVsc2UKKyAgICAgICAgd2FybiAiQ291bGQgbm90IHF1ZXJ5IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEX0xJTUlUIgorICAgIGZpCitmaQorCisjIEZvciBEYXJ3aW4sIGFkZCBvcHRpb25zIHRvIHNwZWNpZnkgaG93IHRoZSBhcHBsaWNhdGlvbiBhcHBlYXJzIGluIHRoZSBkb2NrCitpZiAkZGFyd2luOyB0aGVuCisgICAgR1JBRExFX09QVFM9IiRHUkFETEVfT1BUUyBcIi1YZG9jazpuYW1lPSRBUFBfTkFNRVwiIFwiLVhkb2NrOmljb249JEFQUF9IT01FL21lZGlhL2dyYWRsZS5pY25zXCIiCitmaQorCisjIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBXaW5kb3dzIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCitpZiAkY3lnd2luIDsgdGhlbgorICAgIEFQUF9IT01FPWBjeWdwYXRoIC0tcGF0aCAtLW1peGVkICIkQVBQX0hPTUUiYAorICAgIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJENMQVNTUEFUSCJgCisgICAgSkFWQUNNRD1gY3lncGF0aCAtLXVuaXggIiRKQVZBQ01EImAKKworICAgICMgV2UgYnVpbGQgdGhlIHBhdHRlcm4gZm9yIGFyZ3VtZW50cyB0byBiZSBjb252ZXJ0ZWQgdmlhIGN5Z3BhdGgKKyAgICBST09URElSU1JBVz1gZmluZCAtTCAvIC1tYXhkZXB0aCAxIC1taW5kZXB0aCAxIC10eXBlIGQgMj4vZGV2L251bGxgCisgICAgU0VQPSIiCisgICAgZm9yIGRpciBpbiAkUk9PVERJUlNSQVcgOyBkbworICAgICAgICBST09URElSUz0iJFJPT1RESVJTJFNFUCRkaXIiCisgICAgICAgIFNFUD0ifCIKKyAgICBkb25lCisgICAgT1VSQ1lHUEFUVEVSTj0iKF4oJFJPT1RESVJTKSkiCisgICAgIyBBZGQgYSB1c2VyLWRlZmluZWQgcGF0dGVybiB0byB0aGUgY3lncGF0aCBhcmd1bWVudHMKKyAgICBpZiBbICIkR1JBRExFX0NZR1BBVFRFUk4iICE9ICIiIF0gOyB0aGVuCisgICAgICAgIE9VUkNZR1BBVFRFUk49IiRPVVJDWUdQQVRURVJOfCgkR1JBRExFX0NZR1BBVFRFUk4pIgorICAgIGZpCisgICAgIyBOb3cgY29udmVydCB0aGUgYXJndW1lbnRzIC0ga2x1ZGdlIHRvIGxpbWl0IG91cnNlbHZlcyB0byAvYmluL3NoCisgICAgaT0wCisgICAgZm9yIGFyZyBpbiAiJEAiIDsgZG8KKyAgICAgICAgQ0hFQ0s9YGVjaG8gIiRhcmcifGVncmVwIC1jICIkT1VSQ1lHUEFUVEVSTiIgLWAKKyAgICAgICAgQ0hFQ0syPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiXi0iYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBEZXRlcm1pbmUgaWYgYW4gb3B0aW9uCisKKyAgICAgICAgaWYgWyAkQ0hFQ0sgLW5lIDAgXSAmJiBbICRDSEVDSzIgLWVxIDAgXSA7IHRoZW4gICAgICAgICAgICAgICAgICAgICMjIyBBZGRlZCBhIGNvbmRpdGlvbgorICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPWBjeWdwYXRoIC0tcGF0aCAtLWlnbm9yZSAtLW1peGVkICIkYXJnImAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPSJcIiRhcmdcIiIKKyAgICAgICAgZmkKKyAgICAgICAgaT0kKChpKzEpKQorICAgIGRvbmUKKyAgICBjYXNlICRpIGluCisgICAgICAgICgwKSBzZXQgLS0gOzsKKyAgICAgICAgKDEpIHNldCAtLSAiJGFyZ3MwIiA7OworICAgICAgICAoMikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiIDs7CisgICAgICAgICgzKSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgOzsKKyAgICAgICAgKDQpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiA7OworICAgICAgICAoNSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiIDs7CisgICAgICAgICg2KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgOzsKKyAgICAgICAgKDcpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiA7OworICAgICAgICAoOCkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciIDs7CisgICAgICAgICg5KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgIiRhcmdzNyIgIiRhcmdzOCIgOzsKKyAgICBlc2FjCitmaQorCisjIEVzY2FwZSBhcHBsaWNhdGlvbiBhcmdzCitzYXZlICgpIHsKKyAgICBmb3IgaSBkbyBwcmludGYgJXNcXG4gIiRpIiB8IHNlZCAicy8nLydcXFxcJycvZzsxcy9eLycvO1wkcy9cJC8nIFxcXFwvIiA7IGRvbmUKKyAgICBlY2hvICIgIgorfQorQVBQX0FSR1M9JChzYXZlICIkQCIpCisKKyMgQ29sbGVjdCBhbGwgYXJndW1lbnRzIGZvciB0aGUgamF2YSBjb21tYW5kLCBmb2xsb3dpbmcgdGhlIHNoZWxsIHF1b3RpbmcgYW5kIHN1YnN0aXR1dGlvbiBydWxlcworZXZhbCBzZXQgLS0gJERFRkFVTFRfSlZNX09QVFMgJEpBVkFfT1BUUyAkR1JBRExFX09QVFMgIlwiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JEFQUF9CQVNFX05BTUVcIiIgLWNsYXNzcGF0aCAiXCIkQ0xBU1NQQVRIXCIiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAiJEFQUF9BUkdTIgorCisjIGJ5IGRlZmF1bHQgd2Ugc2hvdWxkIGJlIGluIHRoZSBjb3JyZWN0IHByb2plY3QgZGlyLCBidXQgd2hlbiBydW4gZnJvbSBGaW5kZXIgb24gTWFjLCB0aGUgY3dkIGlzIHdyb25nCitpZiBbICIkKHVuYW1lKSIgPSAiRGFyd2luIiBdICYmIFsgIiRIT01FIiA9ICIkUFdEIiBdOyB0aGVuCisgIGNkICIkKGRpcm5hbWUgIiQwIikiCitmaQorCitleGVjICIkSkFWQUNNRCIgIiRAIgpkaWZmIC0tZ2l0IGEvbGliL2FzMy9ncmFkbGV3LmJhdCBiL2xpYi9hczMvZ3JhZGxldy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1N2VkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hczMvZ3JhZGxldy5iYXQKQEAgLTAsMCArMSw4NCBAQAorQGlmICIlREVCVUclIiA9PSAiIiBAZWNobyBvZmYKK0ByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0ByZW0KK0ByZW0gIEdyYWRsZSBzdGFydHVwIHNjcmlwdCBmb3IgV2luZG93cworQHJlbQorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitAcmVtIFNldCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwKK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIHNldGxvY2FsCisKK3NldCBESVJOQU1FPSV+ZHAwCitpZiAiJURJUk5BTUUlIiA9PSAiIiBzZXQgRElSTkFNRT0uCitzZXQgQVBQX0JBU0VfTkFNRT0lfm4wCitzZXQgQVBQX0hPTUU9JURJUk5BTUUlCisKK0ByZW0gQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitzZXQgREVGQVVMVF9KVk1fT1BUUz0iLVhteDY0bSIKKworQHJlbSBGaW5kIGphdmEuZXhlCitpZiBkZWZpbmVkIEpBVkFfSE9NRSBnb3RvIGZpbmRKYXZhRnJvbUphdmFIb21lCisKK3NldCBKQVZBX0VYRT1qYXZhLmV4ZQorJUpBVkFfRVhFJSAtdmVyc2lvbiA+TlVMIDI+JjEKK2lmICIlRVJST1JMRVZFTCUiID09ICIwIiBnb3RvIGluaXQKKworZWNoby4KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBub3Qgc2V0IGFuZCBubyAnamF2YScgY29tbWFuZCBjb3VsZCBiZSBmb3VuZCBpbiB5b3VyIFBBVEguCitlY2hvLgorZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4KKworZ290byBmYWlsCisKKzpmaW5kSmF2YUZyb21KYXZhSG9tZQorc2V0IEpBVkFfSE9NRT0lSkFWQV9IT01FOiI9JQorc2V0IEpBVkFfRVhFPSVKQVZBX0hPTUUlL2Jpbi9qYXZhLmV4ZQorCitpZiBleGlzdCAiJUpBVkFfRVhFJSIgZ290byBpbml0CisKK2VjaG8uCitlY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgc2V0IHRvIGFuIGludmFsaWQgZGlyZWN0b3J5OiAlSkFWQV9IT01FJQorZWNoby4KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uCisKK2dvdG8gZmFpbAorCis6aW5pdAorQHJlbSBHZXQgY29tbWFuZC1saW5lIGFyZ3VtZW50cywgaGFuZGxpbmcgV2luZG93cyB2YXJpYW50cworCitpZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBnb3RvIHdpbjl4TUVfYXJncworCis6d2luOXhNRV9hcmdzCitAcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorc2V0IENNRF9MSU5FX0FSR1M9CitzZXQgX1NLSVA9MgorCis6d2luOXhNRV9hcmdzX3NsdXJwCitpZiAieCV+MSIgPT0gIngiIGdvdG8gZXhlY3V0ZQorCitzZXQgQ01EX0xJTkVfQVJHUz0lKgorCis6ZXhlY3V0ZQorQHJlbSBTZXR1cCB0aGUgY29tbWFuZCBsaW5lCisKK3NldCBDTEFTU1BBVEg9JUFQUF9IT01FJVxncmFkbGVcd3JhcHBlclxncmFkbGUtd3JhcHBlci5qYXIKKworQHJlbSBFeGVjdXRlIEdyYWRsZQorIiVKQVZBX0VYRSUiICVERUZBVUxUX0pWTV9PUFRTJSAlSkFWQV9PUFRTJSAlR1JBRExFX09QVFMlICItRG9yZy5ncmFkbGUuYXBwbmFtZT0lQVBQX0JBU0VfTkFNRSUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gJUNNRF9MSU5FX0FSR1MlCisKKzplbmQKK0ByZW0gRW5kIGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbAoraWYgIiVFUlJPUkxFVkVMJSI9PSIwIiBnb3RvIG1haW5FbmQKKworOmZhaWwKK3JlbSBTZXQgdmFyaWFibGUgR1JBRExFX0VYSVRfQ09OU09MRSBpZiB5b3UgbmVlZCB0aGUgX3NjcmlwdF8gcmV0dXJuIGNvZGUgaW5zdGVhZCBvZgorcmVtIHRoZSBfY21kLmV4ZSAvY18gcmV0dXJuIGNvZGUhCitpZiAgbm90ICIiID09ICIlR1JBRExFX0VYSVRfQ09OU09MRSUiIGV4aXQgMQorZXhpdCAvYiAxCisKKzptYWluRW5kCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBlbmRsb2NhbAorCis6b21lZ2EKZGlmZiAtLWdpdCBhL2xpYi9hczMvc2V0dGluZ3MuZ3JhZGxlIGIvbGliL2FzMy9zZXR0aW5ncy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzMjM0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hczMvc2V0dGluZ3MuZ3JhZGxlCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcm9vdFByb2plY3QubmFtZSA9ICdsaWJ0aHJpZnQtYXMzJwpkaWZmIC0tZ2l0IGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5hcyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuYXMKaW5kZXggNTEzZGY5NS4uMjI4NzdiNyAxMDA2NDQKLS0tIGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5hcworKysgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmFzCkBAIC0xNDEsNyArMTQxLDcgQEAKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5JTlZBTElEX0RBVEEsICJpbnZhbGlkIGRhdGEiKTsKICAgICAgIH0KICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmFzIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuYXMKaW5kZXggNjg5MTM4OC4uYzYwZDcxMSAxMDA2NDQKLS0tIGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuYXMKKysrIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuYXMKQEAgLTEyNyw2ICsxMjcsMTEgQEAKICAgICB7CiAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlLCBwcmlvcml0eSwgdXNlV2Vha1JlZmVyZW5jZSk7CiAgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6U3RyaW5nLCBsaXN0ZW5lcjpGdW5jdGlvbiwgdXNlQ2FwdHVyZTpCb29sZWFuID0gZmFsc2UpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlKTsKKyAgICB9CiAKICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpOnZvaWQKICAgICB7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL0NNYWtlTGlzdHMudHh0IGIvbGliL2NfZ2xpYi9DTWFrZUxpc3RzLnR4dAppbmRleCAyYzBjZTc2Li4zZTRhMTU0IDEwMDY0NAotLS0gYS9saWIvY19nbGliL0NNYWtlTGlzdHMudHh0CisrKyBiL2xpYi9jX2dsaWIvQ01ha2VMaXN0cy50eHQKQEAgLTMzLDEwICszMywxNiBAQAogICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYwogICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYwogICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jCiAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYwogICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jCiAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jCiAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5jCkBAIC00NSwxMiArNTEsMjQgQEAKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYwogICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCiAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmMKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYwogICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jCiAgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYwogICAgIHNyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jCiApCiAKKyMgSWYgT3BlblNTTCBpcyBub3QgZm91bmQganVzdCBpZ25vcmUgdGhlIE9wZW5TU0wgc3R1ZmYKK2ZpbmRfcGFja2FnZShPcGVuU1NMKQoraWYoT1BFTlNTTF9GT1VORCBBTkQgV0lUSF9PUEVOU1NMKQorICAgIGxpc3QoIEFQUEVORCB0aHJpZnRfY19nbGliX1NPVVJDRVMKKwkgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMKKyAgICApCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7T1BFTlNTTF9JTkNMVURFX0RJUn0iKQorICAgIGxpc3QoQVBQRU5EIFNZU0xJQlMgIiR7T1BFTlNTTF9MSUJSQVJJRVN9IikKK2VuZGlmKCkKKworCiAjIENvbnRhaW5zIHRoZSB0aHJpZnQgc3BlY2lmaWMgQUREX0xJQlJBUllfVEhSSUZUIGFuZCBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUCiBpbmNsdWRlKFRocmlmdE1hY3JvcykKIApAQCAtNjAsNiArNzgsOSBAQAogIyBJbnN0YWxsIHRoZSBoZWFkZXJzCiBpbnN0YWxsKERJUkVDVE9SWSAic3JjL3RocmlmdCIgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0iCiAgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5oIikKKyMgQ29weSBjb25maWcuaCBmaWxlCitpbnN0YWxsKERJUkVDVE9SWSAiJHtDTUFLRV9CSU5BUllfRElSfS90aHJpZnQiIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IgorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIpCiAKIGlmKEJVSUxEX1RFU1RJTkcpCiAgICAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0KQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9NYWtlZmlsZS5hbSBiL2xpYi9jX2dsaWIvTWFrZWZpbGUuYW0KaW5kZXggMTUzZDE0Yi4uNDliNWIyMyAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi9NYWtlZmlsZS5hbQorKysgYi9saWIvY19nbGliL01ha2VmaWxlLmFtCkBAIC0zNCwyNCArMzQsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYwogCi1saWJ0aHJpZnRfY19nbGliX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKEdMSUJfQ0ZMQUdTKQorbGlidGhyaWZ0X2NfZ2xpYl9sYV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChHTElCX0NGTEFHUykgJChHT0JKRUNUX0NGTEFHUykgJChPUEVOU1NMX0lOQ0xVREVTKQorbGlidGhyaWZ0X2NfZ2xpYl9sYV9MREZMQUdTID0gJChBTV9MREZMQUdTKSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpICAkKE9QRU5TU0xfTERGTEFHUykgJChPUEVOU1NMX0xJQlMpIAogCiBpbmNsdWRlX3RocmlmdGRpciA9ICQoaW5jbHVkZWRpcikvdGhyaWZ0L2NfZ2xpYgogaW5jbHVkZV90aHJpZnRfSEVBREVSUyA9IFwKQEAgLTYyLDE3ICs3MSwyNiBAQAogCiBpbmNsdWRlX3Byb3RvY29sZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcHJvdG9jb2wKIGluY2x1ZGVfcHJvdG9jb2xfSEVBREVSUyA9IHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiBpbmNsdWRlX3RyYW5zcG9ydGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3RyYW5zcG9ydAogaW5jbHVkZV90cmFuc3BvcnRfSEVBREVSUyA9IHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmggXApAQCAtODQsNyArMTAyLDggQEAKIAogaW5jbHVkZV9wcm9jZXNzb3JkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wcm9jZXNzb3IKIGluY2x1ZGVfcHJvY2Vzc29yX0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaAogCiAKIEVYVFJBX0RJU1QgPSBcCmRpZmYgLS1naXQgYS9saWIvY19nbGliL1JFQURNRS5tZCBiL2xpYi9jX2dsaWIvUkVBRE1FLm1kCmluZGV4IGZkNzBkMDguLmRkODRmM2QgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvUkVBRE1FLm1kCisrKyBiL2xpYi9jX2dsaWIvUkVBRE1FLm1kCkBAIC0zMiwzICszMiwxOCBAQAogR0xpYgogaHR0cDovL3d3dy5ndGsub3JnLwogCitCcmVha2luZyBDaGFuZ2VzCis9PT09PT09PT09PT09PT09CisKKzAuMTIuMAorLS0tLS0tCisKK1RoZSBjb21waWxlcidzIGhhbmRsaW5nIG9mIG5hbWVzcGFjZXMgd2hlbiBnZW5lcmF0aW5nIHRoZSBuYW1lIG9mIHR5cGVzLAorZnVuY3Rpb25zIGFuZCBoZWFkZXIgZmlsZXMgaGFzIGJlZW4gaW1wcm92ZWQuIFRoaXMgbWVhbnMgY29kZSB3cml0dGVuIHRvIHVzZQorY2xhc3NlcyBnZW5lcmF0ZWQgYnkgcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIGNvbXBpbGVyIG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8KK3JlZmxlY3QgdGhlIHByb3BlciBjb252ZW50aW9uIGZvciBjbGFzcyBuYW1lcywgd2hpY2ggaXMKKworLSBBIGxvd2VyY2FzZSwgW3NuYWtlLWNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NuYWtlX2Nhc2UpCisgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGFzcycgbmFtZXNwYWNlLCBmb2xsb3dlZCBieQorLSBBbiB1bmRlcnNjb3JlIGFuZAorLSBBIGxvd2VyY2FzZSwgc25ha2UtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xhc3MnIG5hbWUuCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMKaW5kZXggNTdmMGJlZC4uNTdkNjIxNyAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuYwpAQCAtOTgsNiArOTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSA8IDApCiAgICAgcmV0dXJuIEZBTFNFOwogICBtZXNzYWdlID0gZ19zdHJjb25jYXQgKCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnIiwgZm5hbWUsICInIiwgTlVMTCk7CisgIGdfZnJlZSAoZm5hbWUpOwogICB4Y2VwdGlvbiA9CiAgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sCiAgICAgICAgICAgICAgICAgICAidHlwZSIsICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTl9NRVRIT0QsCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhMGY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYwpAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPgorCitHX0RFRklORV9UWVBFKFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yLCB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IpCisKKworZW51bQoreworICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUUgPSAxLAorICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRU5ECit9OworCitzdGF0aWMgR1BhcmFtU3BlYyAqdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRU5EXSA9IHsgTlVMTCwgfTsKKworCitzdGF0aWMgZ2Jvb2xlYW4KK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yX2ltcGwoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIGNvbnN0IGdjaGFyICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUsIFRocmlmdFByb2Nlc3NvciAqIG11bHRpcGxleGVkX3Byb2Nlc3NvciAsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1IocHJvY2Vzc29yKTsKKyAgZ19oYXNoX3RhYmxlX3JlcGxhY2Uoc2VsZi0+bXVsdGlwbGV4ZWRfc2VydmljZXMsCisJCSAgICAgICBnX3N0cmR1cChtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSksCisJCSAgICAgICBnX29iamVjdF9yZWYgKG11bHRpcGxleGVkX3Byb2Nlc3NvcikpOworCisgIC8qIE1ha2UgZmlyc3QgcmVnaXN0ZXJlZCBiZWNvbWUgZGVmYXVsdCAqLworICBpZighc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSl7CisgICAgICBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lID0gZ19zdHJkdXAobXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUpOworICB9CisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9wcm9jZXNzX2ltcGwgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBUaHJpZnRQcm90b2NvbCAqaW4sCisJCQkJCSAgIFRocmlmdFByb3RvY29sICpvdXQsIEdFcnJvciAqKmVycm9yKQoreworICBnYm9vbGVhbiByZXR2YWwgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gdG9rZW5fZXJyb3IgPSBGQUxTRTsKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uOworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnN0b3JlZF9tZXNzYWdlX3Byb3RvY29sID0gTlVMTDsKKyAgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlOworICBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1IocHJvY2Vzc29yKTsKKyAgVGhyaWZ0UHJvY2Vzc29yICptdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgY2hhciAqdG9rZW49TlVMTDsKKyAgaW50IHRva2VuX2luZGV4PTA7CisgIGNoYXIgKnN0YXRlPU5VTEw7CisgIGdjaGFyICpmbmFtZT1OVUxMOworICBnaW50MzIgc2VxaWQsIHJlc3VsdDsKKworICAvKiBGSVhNRSBJdCBzZWVtcyB0aGF0IHByZXZpb3VzIHByb2Nlc3NvciBpcyBub3QgbWFuYWdpbmcgZXJyb3IgY29ycmVjdGx5ICovCisgIGlmKCplcnJvciE9TlVMTCkgeworICAgICAgZ19kZWJ1ZyAoInRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3I6IGxhc3QgZXJyb3Igbm90IHJlbW92ZWQ6ICVzIiwKKyAgICAgIAkJICAgKmVycm9yICE9IE5VTEwgPyAoKmVycm9yKS0+bWVzc2FnZSA6ICIobnVsbCkiKTsKKyAgICAgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgfQorCisKKyAgVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyhpbiktPnJlYWRfbWVzc2FnZV9iZWdpbihpbiwgJmZuYW1lLCAmbWVzc2FnZV90eXBlLCAmc2VxaWQsIGVycm9yKTsKKworICBpZighKG1lc3NhZ2VfdHlwZSA9PSBUX0NBTEwgfHwgbWVzc2FnZV90eXBlID09IFRfT05FV0FZKSkgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SLAorCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX01FU1NBR0VfVFlQRSwKKwkJICAgIm1lc3NhZ2UgdHlwZSBpbnZhbGlkIGZvciB0aGlzIHByb2Nlc3NvciIpOworICB9ZWxzZXsKKyAgICAgIC8qIFNwbGl0IGJ5IHRoZSB0b2tlbiAqLworICAgICAgZm9yICh0b2tlbiA9IHN0cnRva19yKGZuYW1lLCBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IsICZzdGF0ZSksCisJICB0b2tlbl9pbmRleD0wOworCSAgdG9rZW4gIT0gTlVMTCAmJiAhdG9rZW5fZXJyb3I7CisJICB0b2tlbiA9IHN0cnRva19yKE5VTEwsIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9ERUZBVUxUX1NFUEFSQVRPUiwgJnN0YXRlKSwKKwkgICAgICB0b2tlbl9pbmRleCsrKQorCXsKKwkgIHN3aXRjaCh0b2tlbl9pbmRleCl7CisJICAgIGNhc2UgMDoKKwkgICAgICAvKiBJdCBzaG91bGQgYmUgdGhlIHNlcnZpY2UgbmFtZSAqLworCSAgICAgIG11bHRpcGxleGVkX3Byb2Nlc3NvciA9IGdfaGFzaF90YWJsZV9sb29rdXAoc2VsZi0+bXVsdGlwbGV4ZWRfc2VydmljZXMsIHRva2VuKTsKKwkgICAgICBpZihtdWx0aXBsZXhlZF9wcm9jZXNzb3I9PU5VTEwpeworCQkgIHRva2VuX2Vycm9yPVRSVUU7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDE6CisJICAgICAgLyogSXQgc2hvdWxkIGJlIHRoZSBmdW5jdGlvbiBuYW1lICovCisJICAgICAgc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MLAorCQkJCQkJICAgICAgInByb3RvY29sIiwgaW4sCisJCQkJCQkgICAgICAibmFtZSIsIHRva2VuLAorCQkJCQkJICAgICAgInR5cGUiLCBtZXNzYWdlX3R5cGUsCisJCQkJCQkgICAgICAic2VxaWQiLCBzZXFpZCwKKwkJCQkJCSAgICAgIE5VTEwpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1IsCisJCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX01FU1NBR0VfV1JPTkdMWV9NVUxUSVBMRVhFRCwKKwkJCSAgICJ0aGUgbWVzc2FnZSBoYXMgbW9yZSB0b2tlbnMgdGhhbiBleHBlY3RlZCEiKTsKKwkgICAgICB0b2tlbl9lcnJvcj1UUlVFOworCSAgICAgIGJyZWFrOworCSAgfQorCX0KKyAgICAgIC8qIFNldCBkZWZhdWx0ICovCisgICAgICBpZighc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wgJiYKKwkgICFtdWx0aXBsZXhlZF9wcm9jZXNzb3IgJiYKKwkgIHRva2VuX2luZGV4PT0xICYmIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpeworCSAgLyogSXQgc2hvdWxkIGJlIHRoZSBzZXJ2aWNlIG5hbWUgKi8KKwkgIG11bHRpcGxleGVkX3Byb2Nlc3NvciA9IGdfaGFzaF90YWJsZV9sb29rdXAoc2VsZi0+bXVsdGlwbGV4ZWRfc2VydmljZXMsIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpOworCSAgaWYobXVsdGlwbGV4ZWRfcHJvY2Vzc29yPT1OVUxMKXsKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9TRVJWSUNFX1VOQVZBSUxBQkxFLAorCQkJICAgInNlcnZpY2UgJXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHByb2Nlc3NvciIsCisJCQkgICBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKwkgIH1lbHNleworCSAgICAgIC8qIFNldCB0aGUgbWVzc2FnZSBuYW1lIHRvIHRoZSBvcmlnaW5hbCBuYW1lICovCisJICAgICAgc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MLAorCQkJCQkJICAgICAgInByb3RvY29sIiwgaW4sCisJCQkJCQkgICAgICAibmFtZSIsIGZuYW1lLAorCQkJCQkJICAgICAgInR5cGUiLCBtZXNzYWdlX3R5cGUsCisJCQkJCQkgICAgICAic2VxaWQiLCBzZXFpZCwKKwkJCQkJCSAgICAgIE5VTEwpOworCSAgfQorCisgICAgICB9CisKKyAgICAgIGlmKHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sIT1OVUxMICYmIG11bHRpcGxleGVkX3Byb2Nlc3NvciE9TlVMTCl7CisJICByZXR2YWwgPSBUSFJJRlRfUFJPQ0VTU09SX0dFVF9DTEFTUyAobXVsdGlwbGV4ZWRfcHJvY2Vzc29yKS0+cHJvY2VzcyAobXVsdGlwbGV4ZWRfcHJvY2Vzc29yLCAoVGhyaWZ0UHJvdG9jb2wgKikgc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wsIG91dCwgZXJyb3IpIDsKKyAgICAgIH1lbHNleworCSAgaWYoIWVycm9yKQorCSAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkgICAgICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJICAgICAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VSVklDRV9VTkFWQUlMQUJMRSwKKwkJICAgICAgICJzZXJ2aWNlICVzIGlzIG5vdCBtdWx0aXBsZXhlZCBpbiB0aGlzIHByb2Nlc3NvciIsCisJCSAgICAgICBmbmFtZSk7CisgICAgICB9CisKKworICB9CisKKyAgaWYoIXJldHZhbCl7CisgICAgICAvKiBCeSBkZWZhdWx0LCByZXR1cm4gYW4gYXBwbGljYXRpb24gZXhjZXB0aW9uIHRvIHRoZSBjbGllbnQgaW5kaWNhdGluZyB0aGUKKyAgICAgICAgICBtZXRob2QgbmFtZSBpcyBub3QgcmVjb2duaXplZC4gKi8KKyAgICAgIC8qIENvcGllZCBmcm9tIGRpc3BhY2ggcHJvY2Vzc29yICovCisKKyAgICAgIGlmICgodGhyaWZ0X3Byb3RvY29sX3NraXAgKGluLCBUX1NUUlVDVCwgZXJyb3IpIDwgMCkgfHwKKwkgICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoaW4sIGVycm9yKSA8IDApKQorCXJldHVybiByZXR2YWw7CisKKyAgICAgIGdfb2JqZWN0X2dldCAoaW4sICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHJlc3VsdCA9IHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKHRyYW5zcG9ydCwgZXJyb3IpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisgICAgICBpZiAocmVzdWx0IDwgMCkgeworCSAgLyogV2UgbXVzdCBmcmVlIGZuYW1lICovCisJICBnX2ZyZWUoZm5hbWUpOworCSAgcmV0dXJuIHJldHZhbDsKKyAgICAgIH0KKworICAgICAgaWYgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChvdXQsCisJCQkJCSAgICAgICBmbmFtZSwKKwkJCQkJICAgICAgIFRfRVhDRVBUSU9OLAorCQkJCQkgICAgICAgc2VxaWQsCisJCQkJCSAgICAgICBlcnJvcikgPCAwKXsKKwkgIC8qIFdlIG11c3QgZnJlZSBmbmFtZSAqLworCSAgZ19mcmVlKGZuYW1lKTsKKworCSAgcmV0dXJuIHJldHZhbDsKKyAgICAgIH0KKworCisgICAgICB4Y2VwdGlvbiA9CisJICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwKKwkJCSJ0eXBlIiwgICAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOX01FVEhPRCwKKwkJCSJtZXNzYWdlIiwgKCplcnJvciktPm1lc3NhZ2UsCisJCQlOVUxMKTsKKyAgICAgIHJlc3VsdCA9IHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHhjZXB0aW9uKSwKKwkJCQkgICAgb3V0LAorCQkJCSAgICBlcnJvcik7CisgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworICAgICAgaWYgKChyZXN1bHQgPCAwKSB8fAorCSAgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAob3V0LCBlcnJvcikgPCAwKSkKKwlyZXR1cm4gcmV0dmFsOworCisgICAgICBnX29iamVjdF9nZXQgKG91dCwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsIE5VTEwpOworICAgICAgcmV0dmFsID0KKwkgICgodGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgZXJyb3IpID49IDApICYmCisJICAgICAgKHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgZXJyb3IpID49IDApKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworICB9ZWxzZXsKKyAgICAgIC8qIFRoZSBwcm90b2NvbCBub3cgaGFzIGEgY29weSB3ZSBjYW4gZnJlZSBpdCAqLworICAgICAgZ19mcmVlKGZuYW1lKTsKKworICB9CisKKyAgLyoKKyAgRklYTUUgVGhpcyBtYWtlcyBldmVyeXRoaW5nIGZhaWwsIEkgZG9uJ3Qga25vdyB3aHkuCisgIGlmKHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sIT1OVUxMKXsKKwkgIC8vIEFmdGVyIGl0cyB1c2Ugd2UgbXVzdCBmcmVlIGl0CisJICBnX29iamVjdF91bnJlZihzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCk7CisgIH0KKyAgKi8KKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBUaHJpZnQgdHJhbnNwb3J0cyAqLworR1F1YXJrCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2Vycm9yX3F1YXJrICh2b2lkKQoreworICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfRE9NQUlOKTsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgICAgICAqb2JqZWN0LAorICAgIGd1aW50ICAgICAgICAgcHJvcGVydHlfaWQsCisgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICAgKnBzcGVjKQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1IgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9ERUZBVUxUX1NFUlZJQ0VfTkFNRToKKyAgICBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2dldF9wcm9wZXJ0eSAoR09iamVjdCAgICAqb2JqZWN0LAorICAgIGd1aW50ICAgICAgIHByb3BlcnR5X2lkLAorICAgIEdWYWx1ZSAgICAgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1IgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9ERUZBVUxUX1NFUlZJQ0VfTkFNRToKKyAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKG9iamVjdCk7CisKKyAgLyogRnJlZSBvdXIgbXVsdGlwbGV4ZWQgaGFzaCB0YWJsZSAqLworICBnX2hhc2hfdGFibGVfdW5yZWYgKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzKTsKKyAgc2VsZi0+bXVsdGlwbGV4ZWRfc2VydmljZXMgPSBOVUxMOworCisgIGlmKHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpeworICAgICAgZ19mcmVlKHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpOworICAgICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZT1OVUxMOworICB9CisKKyAgLyogQ2hhaW4gdXAgdG8gcGFyZW50ICovCisgIGlmIChHX09CSkVDVF9DTEFTUyAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSkKKyAgICAoKkdfT0JKRUNUX0NMQVNTICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3BhcmVudF9jbGFzcyktPmZpbmFsaXplKSAob2JqZWN0KTsKK30KKworLyogY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9jbGFzc19pbml0IChUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzICpjbHMpCit7CisgIC8qIE92ZXJyaWRlICovCisgIFRIUklGVF9QUk9DRVNTT1JfQ0xBU1MoY2xzKS0+cHJvY2VzcyA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcHJvY2Vzc19pbXBsOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKworICAvKiBPYmplY3QgbWV0aG9kcyAqLworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9maW5hbGl6ZTsKKworICAvKiBDbGFzcyBtZXRob2RzICovCisgIGNscy0+cmVnaXN0ZXJfcHJvY2Vzc29yID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3JfaW1wbDsKKworCisgIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0RFRkFVTFRfU0VSVklDRV9OQU1FXSA9CisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGVmYXVsdCIsCisgICAgICAgICAgIkRlZmF1bHQgc2VydmljZSBuYW1lIHRoZSBwcm90b2NvbCBwb2ludHMgdG8gd2hlcmUgbm8gbXVsdGlwbGV4ZWQgY2xpZW50IHVzZWQiLAorICAgICAgICAgICJTZXQgdGhlIGRlZmF1bHQgc2VydmljZSBuYW1lIiwKKyAgICAgICAgICBOVUxMLAorICAgICAgICAgIChHX1BBUkFNX1JFQURXUklURSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydGllcyAoZ29iamVjdF9jbGFzcywKKwkJCQkgICAgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FTkQsCisgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX29ial9wcm9wZXJ0aWVzKTsKKworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9pbml0IChUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqc2VsZikKK3sKKworICAvKiBDcmVhdGUgb3VyIG11bHRpcGxleGVkIHNlcnZpY2VzIGhhc2ggdGFibGUgKi8KKyAgc2VsZi0+bXVsdGlwbGV4ZWRfc2VydmljZXMgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKAorICAgICAgZ19zdHJfaGFzaCwKKyAgICAgIGdfc3RyX2VxdWFsLAorICAgICAgZ19mcmVlLAorICAgICAgZ19vYmplY3RfdW5yZWYpOworICBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lID0gTlVMTDsKK30KKworCitnYm9vbGVhbgordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3IoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIGNvbnN0IGdjaGFyICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUsIFRocmlmdFByb2Nlc3NvciAqIG11bHRpcGxleGVkX3Byb2Nlc3NvciAsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9HRVRfQ0xBU1MocHJvY2Vzc29yKS0+cmVnaXN0ZXJfcHJvY2Vzc29yKHByb2Nlc3NvciwgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUsIG11bHRpcGxleGVkX3Byb2Nlc3NvciwgZXJyb3IpOworfQorCisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDA2NjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oCisgKgorICogIENyZWF0ZWQgb246IDE0IHNlcHQuIDIwMTcKKyAqICAgICAgQXV0aG9yOiBnYWd1aWxhcgorICovCisKKyNpZm5kZWYgX1RIUklGVF9NVUxUSVBMRVhFRF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfSF8KKyNkZWZpbmUgX1RIUklGVF9NVUxUSVBMRVhFRF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfSF8KKworCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaD4KKworCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKKyAqICBcYnJpZWYgVGhlIG11bHRpcGxleGVkIHByb2Nlc3NvciBmb3IgY19nbGliLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IpKQorI2RlZmluZSBUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPQ0VTU09SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SLCBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01VTFRJUExFWEVEX1BST0NFU1NPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcykpCisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBzdHJpbmcgKi8KKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9ET01BSU4gInRocmlmdC1tdWx0aXBsZXhlZC1wcm9jZXNzb3ItZXJyb3ItcXVhcmsiCisKKworLyohCisgKiBUaHJpZnQgTXVsdGlwbGV4ZWRQcm9jZXNzb3Igb2JqZWN0CisgKi8KK3N0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IKK3sKKyAgVGhyaWZ0UHJvY2Vzc29yIHBhcmVudDsKKworICAvKiBwcml2YXRlICovCisgIGdjaGFyICogZGVmYXVsdF9wcm9jZXNzb3JfbmFtZTsKKyAgR0hhc2hUYWJsZSAqbXVsdGlwbGV4ZWRfc2VydmljZXM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yOworCisvKiEKKyAqIFRocmlmdCBNdWx0aXBsZXhlZFByb2Nlc3NvciBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MgcGFyZW50OworCisgIGdib29sZWFuICgqIHJlZ2lzdGVyX3Byb2Nlc3NvcikgKFRocmlmdFByb2Nlc3NvciAqc2VsZiwgY29uc3QgZ2NoYXIgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSwgVGhyaWZ0UHJvY2Vzc29yICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICwgR0Vycm9yICoqZXJyb3IpOworCit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzczsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IgKi8KK0dUeXBlIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3R5cGUgKHZvaWQpOworCisvKiEKKyAqIFByb2Nlc3NlcyB0aGUgcmVxdWVzdC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqaW4sIFRocmlmdFByb3RvY29sICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworCisvKiBQdWJsaWMgQVBJICovCisKKy8qKgorICogQGJyaWVmIFJlZ2lzdGVycyBhIHByb2Nlc3NvciBpbiB0aGUgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yIHVuZGVyIGl0cyBuYW1lLiBJdAorICogd2lsbCB0YWtlIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzb3Igc28gcmVmY291bnQgd2lsbCBiZSBpbmNyZW1lbnRlZC4KKyAqIEl0IHdpbGwgYWxzbyBiZSBkZWNyZW1lbnRlZCBvbiBvYmplY3QgZGVzdHJ1Y3Rpb24uCisgKgorICogVGhlIGZpcnN0IHJlZ2lzdGVyZWQgcHJvY2Vzc29yIGJlY29tZXMgZGVmYXVsdC4gQnV0IHlvdSBjYW4gb3ZlcnJpZGUgaXQgd2l0aAorICogImRlZmF1bHQiIHByb3BlcnR5LgorICoKKyAqIEl0IHJldHVybnMgYSBjb21wbGlhbnQgZXJyb3IgaWYgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQuCisgKgorICogQHBhcmFtIHByb2Nlc3NvciBQb2ludGVyIHRvIHRoZSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IuCisgKiBAcGFyYW0gbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUgTmFtZSBvZiB0aGUgcHJvY2Vzc29yIHlvdSB3YW50IHRvIHJlZ2lzdGVyCisgKiBAcGFyYW0gbXVsdGlwbGV4ZWRfcHJvY2Vzc29yIFBvaW50ZXIgdG8gaW1wbGVtZW50ZWQgcHJvY2Vzc29yIHlvdSB3YW50IG11bHRpcGxleC4KKyAqIEBwYXJhbSBlcnJvciBFcnJvciBvYmplY3Qgd2hlcmUgd2Ugc2hvdWxkIHN0b3JlIGVycm9ycy4KKyAqCisgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdub21lLm9yZy9nbGliL3N0YWJsZS9nbGliLUVycm9yLVJlcG9ydGluZy5odG1sI2ctc2V0LWVycm9yCisgKi8KK2dib29sZWFuIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcik7CisKKworLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfVU5LTk9XTiwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9TRVJWSUNFX1VOQVZBSUxBQkxFLAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX01FU1NBR0VfVFlQRSwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1dST05HTFlfTVVMVElQTEVYRUQsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VORCwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9SRUNFSVZFLAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX0NMT1NFCit9IFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yRXJyb3I7CisKKworR1F1YXJrIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZXJyb3JfcXVhcmsgKHZvaWQpOworI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2Vycm9yX3F1YXJrICgpKQorCisKK0dfRU5EX0RFQ0xTCisKKworI2VuZGlmIC8qIF9USFJJRlRfTVVMVElQTEVYRURfTVVMVElQTEVYRURfUFJPQ0VTU09SX0hfICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jCmluZGV4IDM1ODM5NmMuLjdjMmQwMTcgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jCkBAIC02NDUsOCArNjQ1LDggQEAKICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwogCiAgIGlmICgocmV0ID0gCi0gICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApCisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCAxLCBlcnJvcikpIDwgMCkKICAgewogICAgIHJldHVybiAtMTsKICAgfQpAQCAtNjY0LDggKzY2NCw4IEBACiAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKIAogICBpZiAoKHJldCA9Ci0gICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApCisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCAxLCBlcnJvcikpIDwgMCkKICAgewogICAgIHJldHVybiAtMTsKICAgfQpAQCAtNjg3LDggKzY4Nyw4IEBACiAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKIAogICBpZiAoKHJldCA9Ci0gICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5ieXRlX2FycmF5LCAyLCBlcnJvcikpIDwgMCkKKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgMiwgZXJyb3IpKSA8IDApCiAgIHsKICAgICByZXR1cm4gLTE7CiAgIH0KQEAgLTcxMCw4ICs3MTAsOCBAQAogICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CiAKICAgaWYgKChyZXQgPQotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgNCwgZXJyb3IpKSA8IDApCisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmJ5dGVfYXJyYXksIDQsIGVycm9yKSkgPCAwKQogICB7CiAgICAgcmV0dXJuIC0xOwogICB9CkBAIC03MzMsOCArNzMzLDggQEAKICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwogCiAgIGlmICgocmV0ID0KLSAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmJ5dGVfYXJyYXksIDgsIGVycm9yKSkgPCAwKQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5ieXRlX2FycmF5LCA4LCBlcnJvcikpIDwgMCkKICAgewogICAgIHJldHVybiAtMTsKICAgfQpAQCAtNzU2LDggKzc1Niw4IEBACiAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKIAogICBpZiAoKHJldCA9Ci0gICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5ieXRlX2FycmF5LCA4LCBlcnJvcikpIDwgMCkKKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgOCwgZXJyb3IpKSA8IDApCiAgIHsKICAgICByZXR1cm4gLTE7CiAgIH0KQEAgLTc4NCwxNCArNzg0LDIxIEBACiAgIH0KICAgeGZlciArPSByZXQ7CiAKLSAgaWYgKHJlYWRfbGVuID4gMCkKLSAgewotICAgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHRoZSBzdHJpbmcgKi8KLSAgICBsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW4gKyAxOyAvKiBzcGFjZSBmb3IgbnVsbCB0ZXJtaW5hdG9yICovCi0gICAgKnN0ciA9IGdfbmV3MCAoZ2NoYXIsIGxlbik7CisgIGlmIChyZWFkX2xlbiA8IDApIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIHJlYWRfbGVuKTsKKyAgICAqc3RyID0gTlVMTDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgc3RyaW5nICovCisgIGxlbiA9IChndWludDMyKSByZWFkX2xlbiArIDE7IC8qIHNwYWNlIGZvciBudWxsIHRlcm1pbmF0b3IgKi8KKyAgKnN0ciA9IGdfbmV3MCAoZ2NoYXIsIGxlbik7CisgIGlmIChyZWFkX2xlbiA+IDApIHsKICAgICBpZiAoKHJldCA9Ci0gICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHIsIHJlYWRfbGVuLCBlcnJvcikpIDwgMCkKKyAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyLCByZWFkX2xlbiwgZXJyb3IpKSA8IDApCiAgICAgewogICAgICAgZ19mcmVlICgqc3RyKTsKICAgICAgICpzdHIgPSBOVUxMOwpAQCAtODAwLDcgKzgwNyw3IEBACiAgICAgfQogICAgIHhmZXIgKz0gcmV0OwogICB9IGVsc2UgewotICAgICpzdHIgPSBOVUxMOworICAgICoqc3RyID0gMDsKICAgfQogCiAgIHJldHVybiB4ZmVyOwpAQCAtODMxLDggKzgzOCw4IEBACiAgICAgKmxlbiA9IChndWludDMyKSByZWFkX2xlbjsKICAgICAqYnVmID0gZ19uZXcgKGd1Y2hhciwgKmxlbik7CiAgICAgaWYgKChyZXQgPQotICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmLCAqbGVuLCBlcnJvcikpIDwgMCkKKyAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmLCAqbGVuLCBlcnJvcikpIDwgMCkKICAgICB7CiAgICAgICBnX2ZyZWUgKCpidWYpOwogICAgICAgKmJ1ZiA9IE5VTEw7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlNDc0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDE2MDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgorCisvKgorICogKl90b196aWd6YWcgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgdGhlIHJpZ2h0IHNoaWZ0CisgKiBvcGVyYXRvciBvbiBhIHNpZ25lZCBpbnRlZ2VyIGlzIGFuIGFyaXRobWV0aWMgKHNpZ24tZXh0ZW5kaW5nKSBzaGlmdC4KKyAqIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIG5vdCB3b3JrLgorICovCisjaWYgIWRlZmluZWQoU0lHTkVEX1JJR0hUX1NISUZUX0lTKSB8fCAhZGVmaW5lZChBUklUSE1FVElDX1JJR0hUX1NISUZUKQorIyBlcnJvciAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgYSBzaWduZWQgcmlnaHQgc2hpZnQiCisjZW5kaWYKKyNpZiBTSUdORURfUklHSFRfU0hJRlRfSVMgIT0gQVJJVEhNRVRJQ19SSUdIVF9TSElGVAorIyBlcnJvciAidGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wgb25seSB3b3JrcyBpZiBzaWduZWQgcmlnaHQgc2hpZnQgaXMgYXJpdGhtZXRpYyIKKyNlbmRpZgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0Q29tcGFjdFByb3RvY29sUHJvcGVydGllcworeworICAgIFBST1BfMCwKKyAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX1NUUklOR19MSU1JVCwKKyAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVAorfTsKKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0Q29tcGFjdFByb3RvY29sLCB0aHJpZnRfY29tcGFjdF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MKQorCitzdGF0aWMgY29uc3QgZ2ludDggUFJPVE9DT0xfSUQgPSAoZ2ludDgpMHg4MnU7CitzdGF0aWMgY29uc3QgZ2ludDggVkVSU0lPTl9OID0gMTsKK3N0YXRpYyBjb25zdCBnaW50OCBWRVJTSU9OX01BU0sgPSAweDFmOyAgICAgICAvKiAwMDAxIDExMTEgKi8KK3N0YXRpYyBjb25zdCBnaW50OCBUWVBFX01BU0sgPSAoZ2ludDgpMHhlMHU7ICAvKiAxMTEwIDAwMDAgKi8KK3N0YXRpYyBjb25zdCBnaW50OCBUWVBFX0JJVFMgPSAweDA3OyAgICAgICAgICAvKiAwMDAwIDAxMTEgKi8KK3N0YXRpYyBjb25zdCBnaW50MzIgVFlQRV9TSElGVF9BTU9VTlQgPSA1OworCitlbnVtIFR5cGVzIHsKKyAgQ1RfU1RPUCAgICAgICAgICAgPSAweDAwLAorICBDVF9CT09MRUFOX1RSVUUgICA9IDB4MDEsCisgIENUX0JPT0xFQU5fRkFMU0UgID0gMHgwMiwKKyAgQ1RfQllURSAgICAgICAgICAgPSAweDAzLAorICBDVF9JMTYgICAgICAgICAgICA9IDB4MDQsCisgIENUX0kzMiAgICAgICAgICAgID0gMHgwNSwKKyAgQ1RfSTY0ICAgICAgICAgICAgPSAweDA2LAorICBDVF9ET1VCTEUgICAgICAgICA9IDB4MDcsCisgIENUX0JJTkFSWSAgICAgICAgID0gMHgwOCwKKyAgQ1RfTElTVCAgICAgICAgICAgPSAweDA5LAorICBDVF9TRVQgICAgICAgICAgICA9IDB4MEEsCisgIENUX01BUCAgICAgICAgICAgID0gMHgwQiwKKyAgQ1RfU1RSVUNUICAgICAgICAgPSAweDBDCit9OworCitzdGF0aWMgY29uc3QgZ2ludDggVFR5cGVUb0NUeXBlWzE2XSA9IHsKKyAgQ1RfU1RPUCwgLyogVF9TVE9QICovCisgIDAsIC8qIHVudXNlZCAqLworICBDVF9CT09MRUFOX1RSVUUsIC8qIFRfQk9PTCAqLworICBDVF9CWVRFLCAvKiBUX0JZVEUgKi8KKyAgQ1RfRE9VQkxFLCAvKiBUX0RPVUJMRSAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfSTE2LCAvKiBUX0kxNiAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfSTMyLCAvKiBUX0kzMiAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfSTY0LCAvKiBUX0k2NCAqLworICBDVF9CSU5BUlksIC8qIFRfU1RSSU5HICovCisgIENUX1NUUlVDVCwgLyogVF9TVFJVQ1QgKi8KKyAgQ1RfTUFQLCAvKiBUX01BUCAqLworICBDVF9TRVQsIC8qIFRfU0VUICovCisgIENUX0xJU1QsIC8qIFRfTElTVCAqLworfTsKKworc3RhdGljIGd1aW50NjQKK3RocmlmdF9iaXR3aXNlX2Nhc3RfZ3VpbnQ2NCAoY29uc3QgZ2RvdWJsZSB2KQoreworICB1bmlvbiB7CisgICAgZ2RvdWJsZSBmcm9tOworICAgIGd1aW50NjQgdG87CisgIH0gdTsKKyAgdS5mcm9tID0gdjsKKyAgcmV0dXJuIHUudG87Cit9CisKK3N0YXRpYyBnZG91YmxlCit0aHJpZnRfYml0d2lzZV9jYXN0X2dkb3VibGUgKGNvbnN0IGd1aW50NjQgdikKK3sKKyAgdW5pb24geworICAgIGd1aW50NjQgZnJvbTsKKyAgICBnZG91YmxlIHRvOworICB9IHU7CisgIHUuZnJvbSA9IHY7CisgIHJldHVybiB1LnRvOworfQorCisvKioKKyAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworc3RhdGljIGd1aW50NjQKK2k2NF90b196aWd6YWcgKGNvbnN0IGdpbnQ2NCBsKQoreworICByZXR1cm4gKCgoZ3VpbnQ2NClsKSA8PCAxKSBeIChsID4+IDYzKTsKK30KKworLyoqCisgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworc3RhdGljIGd1aW50MzIKK2kzMl90b196aWd6YWcgKGNvbnN0IGdpbnQzMiBuKQoreworICByZXR1cm4gKCgoZ3VpbnQzMiluKSA8PCAxKSBeIChuID4+IDMxKTsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgKi8KK3N0YXRpYyBnaW50MzIKK3ppZ3phZ190b19pMzIgKGd1aW50MzIgbikKK3sKKyAgcmV0dXJuIChuID4+IDEpIF4gKGd1aW50MzIpICgtKGdpbnQzMikgKG4gJiAxKSk7Cit9CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgKi8KK3N0YXRpYyBnaW50NjQKK3ppZ3phZ190b19pNjQgKGd1aW50NjQgbikKK3sKKyAgcmV0dXJuIChuID4+IDEpIF4gKGd1aW50NjQpICgtKGdpbnQ2NCkgKG4gJiAxKSk7Cit9CisKK1RocmlmdFR5cGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4IHR5cGUsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVF9TVE9QOgorICAgICAgcmV0dXJuIFRfU1RPUDsKKyAgICBjYXNlIENUX0JPT0xFQU5fRkFMU0U6CisgICAgY2FzZSBDVF9CT09MRUFOX1RSVUU6CisgICAgICByZXR1cm4gVF9CT09MOworICAgIGNhc2UgQ1RfQllURToKKyAgICAgIHJldHVybiBUX0JZVEU7CisgICAgY2FzZSBDVF9JMTY6CisgICAgICByZXR1cm4gVF9JMTY7CisgICAgY2FzZSBDVF9JMzI6CisgICAgICByZXR1cm4gVF9JMzI7CisgICAgY2FzZSBDVF9JNjQ6CisgICAgICByZXR1cm4gVF9JNjQ7CisgICAgY2FzZSBDVF9ET1VCTEU6CisgICAgICByZXR1cm4gVF9ET1VCTEU7CisgICAgY2FzZSBDVF9CSU5BUlk6CisgICAgICByZXR1cm4gVF9TVFJJTkc7CisgICAgY2FzZSBDVF9MSVNUOgorICAgICAgcmV0dXJuIFRfTElTVDsKKyAgICBjYXNlIENUX1NFVDoKKyAgICAgIHJldHVybiBUX1NFVDsKKyAgICBjYXNlIENUX01BUDoKKyAgICAgIHJldHVybiBUX01BUDsKKyAgICBjYXNlIENUX1NUUlVDVDoKKyAgICAgIHJldHVybiBUX1NUUlVDVDsKKyAgICBkZWZhdWx0OgorICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0lOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgfQorfQorCisvKioKKyAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBndWludDggYnVmWzVdOworICBnaW50MzIgeGZlcjsKKyAgZ3VpbnQzMiBtOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgeGZlciA9IDA7CisgIG0gPSBuOworCisgIHdoaWxlIChUUlVFKSB7CisgICAgaWYgKChtICYgfjB4N0YpID09IDApIHsKKyAgICAgIGJ1Zlt4ZmVyKytdID0gKGdpbnQ4KW07CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3hmZXIrK10gPSAoZ2ludDgpKChtICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG0gPj49IDc7CisgICAgfQorICB9CisKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgeGZlciwgZXJyb3IpKSB7CisgICAgcmV0dXJuIHhmZXI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKKy8qKgorICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50NjQgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQ2NCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBndWludDggYnVmWzEwXTsKKyAgZ2ludDMyIHhmZXI7CisgIGd1aW50NjQgbTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHhmZXIgPSAwOworICBtID0gbjsKKworICB3aGlsZSAoVFJVRSkgeworICAgIGlmICgobSAmIH4weDdGTCkgPT0gMCkgeworICAgICAgYnVmW3hmZXIrK10gPSAoZ2ludDgpbTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbeGZlcisrXSA9IChnaW50OCkoKG0gJiAweDdGKSB8IDB4ODApOworICAgICAgbSA+Pj0gNzsKKyAgICB9CisgIH0KKworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCktPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgYnVmLCB4ZmVyLCBlcnJvcikpIHsKKyAgICByZXR1cm4geGZlcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyoqCisgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50NjQgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQgKmk2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbCAqdHA7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworICBndWludDY0IHZhbDsKKyAgZ2ludCBzaGlmdDsKKyAgZ3VpbnQ4IGJ5dGU7CisKKyAgdHAgPSBUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgeGZlciA9IDA7CisgIHZhbCA9IDA7CisgIHNoaWZ0ID0gMDsKKyAgYnl0ZSA9IDA7CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHRwLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpICZieXRlLCAxLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICArK3hmZXI7CisgICAgdmFsIHw9IChndWludDY0KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgc2hpZnQgKz0gNzsKKyAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICAgICppNjQgPSAoZ2ludDY0KSB2YWw7CisgICAgICByZXR1cm4geGZlcjsKKyAgICB9CisgICAgaWYgKEdfVU5MSUtFTFkgKHhmZXIgPT0gMTApKSB7IC8qIDcgKiA5IDwgNjQgPCA3ICogMTAgKi8KKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgInZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcyIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50NjQgdmFsOworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50NjQgKHByb3RvY29sLCAmdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgICppMzIgPSAoZ2ludDMyKXZhbDsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbl9pbnRlcm5hbCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCB0eXBlX292ZXJyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKyAgZ2ludDggdHlwZV90b193cml0ZTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisKKyAgeGZlciA9IDA7CisKKyAgLyogaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LiAqLworICB0eXBlX3RvX3dyaXRlCisgICAgPSAodHlwZV9vdmVycmlkZSA9PSAtMSA/IFRUeXBlVG9DVHlwZVtmaWVsZF90eXBlXSA6IHR5cGVfb3ZlcnJpZGUpOworCisgIC8qIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZCAqLworICBpZiAoZmllbGRfaWQgPiBwcm90b2NvbC0+X2xhc3RfZmllbGRfaWQKKyAgICAgICYmIGZpZWxkX2lkIC0gcHJvdG9jb2wtPl9sYXN0X2ZpZWxkX2lkIDw9IDE1KSB7CisgICAgLyogd3JpdGUgdGhlbSB0b2dldGhlciAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKChmaWVsZF9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByb3RvY29sLT5fbGFzdF9maWVsZF9pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA0IHwgdHlwZV90b193cml0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0gZWxzZSB7CisgICAgLyogd3JpdGUgdGhlbSBzZXBhcmF0ZSAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fd3JpdGUsIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2IChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIHByb3RvY29sLT5fbGFzdF9maWVsZF9pZCA9IGZpZWxkX2lkOworICByZXR1cm4geGZlcjsKK30KKworLyoqCisgKiBNZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisgKiB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfY29sbGVjdGlvbl9iZWdpbiAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKHNpemUgPD0gMTQpIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpIChzaXplIDw8IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRUeXBlVG9DVHlwZVtlbGVtX3R5cGVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpICgweGYwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVHlwZVRvQ1R5cGVbZWxlbV90eXBlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VpbnQzMikgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCisvKgorICogcHVibGljIG1ldGhvZHMKKyAqLworCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDggdmVyc2lvbjsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB2ZXJzaW9uID0gKFZFUlNJT05fTiAmIFZFUlNJT05fTUFTSykKKyAgICAgICAgICAgIHwgKCgoZ2ludDMyKSBtZXNzYWdlX3R5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKTsKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFBST1RPQ09MX0lELCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgdmVyc2lvbiwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChndWludDMyKSBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgbmFtZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworICBHUXVldWUgKnE7CisKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHEgPSAmKGNwLT5fbGFzdF9maWVsZCk7CisKKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKHEsIEdJTlRfVE9fUE9JTlRFUiAoKGdpbnQpIGNwLT5fbGFzdF9maWVsZF9pZCkpOworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAwOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKyAgR1F1ZXVlICpxOworCisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHEgPSAmKGNwLT5fbGFzdF9maWVsZCk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAoZ2ludDE2KSBHUE9JTlRFUl9UT19JTlQgKGdfcXVldWVfcG9wX3RhaWwgKHEpKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIGlmIChmaWVsZF90eXBlID09IFRfQk9PTCkgeworICAgIGNwLT5fYm9vbF9maWVsZF9uYW1lID0gbmFtZTsKKyAgICBjcC0+X2Jvb2xfZmllbGRfdHlwZSA9IGZpZWxkX3R5cGU7CisgICAgY3AtPl9ib29sX2ZpZWxkX2lkID0gZmllbGRfaWQ7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luX2ludGVybmFsIChjcCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgVF9TVE9QLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwgKGd1aW50MzIpIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChzaXplID4gMCkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKFRUeXBlVG9DVHlwZVtrZXlfdHlwZV0gPDwgNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFR5cGVUb0NUeXBlW3ZhbHVlX3R5cGVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9jb2xsZWN0aW9uX2JlZ2luIChjcCwgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfY29sbGVjdGlvbl9iZWdpbiAoY3AsIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKGNwLT5fYm9vbF9maWVsZF9uYW1lICE9IE5VTEwpIHsKKyAgICAvKiB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQgKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luX2ludGVybmFsIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5fYm9vbF9maWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPl9ib29sX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+X2Jvb2xfZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpICh2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDVF9CT09MRUFOX1RSVUUgOiBDVF9CT09MRUFOX0ZBTFNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgY3AtPl9ib29sX2ZpZWxkX25hbWUgPSBOVUxMOworICB9IGVsc2UgeworICAgIC8qIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlICovCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAodmFsdWUgPyBDVF9CT09MRUFOX1RSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENUX0JPT0xFQU5fRkFMU0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJnZhbHVlLCAxLCBlcnJvcikpIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90b196aWd6YWcgKChnaW50MzIpIHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdG9femlnemFnICh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQ2NCAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RvX3ppZ3phZyAodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGd1aW50NjQgYml0czsKKworICBnX2Fzc2VydCAoc2l6ZW9mIChnZG91YmxlKSA9PSBzaXplb2YgKGd1aW50NjQpKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGJpdHMgPSBHVUlOVDY0X1RPX0xFICh0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKHZhbHVlKSk7CisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmYml0cywgOCwgZXJyb3IpKSB7CisgICAgcmV0dXJuIDg7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBzaXplX3QgbGVuOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgbGVuID0gc3RyICE9IE5VTEwgPyBzdHJsZW4gKHN0cikgOiAwOworICBpZiAobGVuID4gR19NQVhJTlQzMikgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgInN0cmluZyBzaXplIChndWVzczogJWx1KSBpcyB0b28gbGFyZ2UiLCAodW5zaWduZWQgbG9uZykgbGVuKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiB3cml0ZSB0aGUgc3RyaW5nIGxlbmd0aCArIDEgd2hpY2ggaW5jbHVkZXMgdGhlIG51bGwgdGVybWluYXRvciAqLworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIChjb25zdCBncG9pbnRlcikgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGd1aW50MzIpIGxlbiwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwgbGVuLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAobGVuID4gMCkgeworICAgIC8qIGNoZWNraW5nIGxlbiArIHhmZXIgPiB1aW50X21heCwgYnV0IHdlIGRvbid0IHdhbnQgdG8gb3ZlcmZsb3cgd2hpbGUKKyAgICAgKiBjaGVja2luZyBmb3Igb3ZlcmZsb3dzLiB0cmFuc2Zvcm1pbmcgdG8gbGVuID4gdWludF9tYXggLSB4ZmVyLgorICAgICAqLworICAgIGlmIChsZW4gPiAoZ3VpbnQzMikgKEdfTUFYSU5UMzIgLSB4ZmVyKSkgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICAgInNpemUgJWQgKyAlZCBpcyB0b28gbGFyZ2UiLCBsZW4sIHhmZXIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgbGVuLCBlcnJvcikgPT0gRkFMU0UpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSBsZW47CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50OCBwcm90b2NvbF9pZCwgdmVyc2lvbl9hbmRfdHlwZSwgdmVyc2lvbjsKKworICB4ZmVyID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmcHJvdG9jb2xfaWQsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChwcm90b2NvbF9pZCAhPSBQUk9UT0NPTF9JRCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICJiYWQgcHJvdG9jb2wgaWQiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmVyc2lvbl9hbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICB2ZXJzaW9uID0gKGdpbnQ4KSh2ZXJzaW9uX2FuZF90eXBlICYgVkVSU0lPTl9NQVNLKTsKKyAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl9OKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgImJhZCB2ZXJzaW9uIGFuZC9vciB0eXBlIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgKm1lc3NhZ2VfdHlwZQorICAgID0gKFRocmlmdE1lc3NhZ2VUeXBlKSgodmVyc2lvbl9hbmRfdHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsIHNlcWlkLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKyAgR1F1ZXVlICpxOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHEgPSAmKGNwLT5fbGFzdF9maWVsZCk7CisKKyAgKm5hbWUgPSBOVUxMOworCisgIGdfcXVldWVfcHVzaF90YWlsIChxLCBHSU5UX1RPX1BPSU5URVIgKChnaW50KSBjcC0+X2xhc3RfZmllbGRfaWQpKTsKKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gMDsKKworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisgIEdRdWV1ZSAqcTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBxID0gJihjcC0+X2xhc3RfZmllbGQpOworCisgIGNwLT5fbGFzdF9maWVsZF9pZCA9IChnaW50MTYpIEdQT0lOVEVSX1RPX0lOVCAoZ19xdWV1ZV9wb3BfdGFpbCAocSkpOworCisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ2ludDE2IG1vZGlmaWVyOworICBnaW50OCBieXRlOworICBnaW50OCB0eXBlOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChuYW1lKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmYnl0ZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgdHlwZSA9IChieXRlICYgMHgwZik7CisKKyAgLyogaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLiAqLworICBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICAqZmllbGRfdHlwZSA9IFRfU1RPUDsKKyAgICAqZmllbGRfaWQgPSAwOworICAgIHJldHVybiB4ZmVyOworICB9CisKKyAgLyogbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4KKyAgICogaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorICAgKi8KKyAgbW9kaWZpZXIgPSAoZ2ludDE2KSgoKGd1aW50OClieXRlICYgMHhmMCkgPj4gNCk7CisgIGlmIChtb2RpZmllciA9PSAwKSB7CisgICAgLyogbm90IGEgZGVsdGEsIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLiAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgZmllbGRfaWQsIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgICpmaWVsZF9pZCA9IChnaW50MTYpKGNwLT5fbGFzdF9maWVsZF9pZCArIG1vZGlmaWVyKTsKKyAgfQorICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90dHlwZSAoY3AsIHR5cGUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgICpmaWVsZF90eXBlID0gcmV0OworCisgIC8qIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlICovCisgIGlmICh0eXBlID09IENUX0JPT0xFQU5fVFJVRSB8fCB0eXBlID09IENUX0JPT0xFQU5fRkFMU0UpIHsKKyAgICAvKiBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4gKi8KKyAgICBjcC0+X2hhc19ib29sX3ZhbHVlID0gVFJVRTsKKyAgICBjcC0+X2Jvb2xfdmFsdWUgPQorICAgICAgKHR5cGUgPT0gQ1RfQk9PTEVBTl9UUlVFID8gVFJVRSA6IEZBTFNFKTsKKyAgfQorCisgIC8qIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLiAqLworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAqZmllbGRfaWQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQ4IGt2X3R5cGU7CisgIGdpbnQzMiBtc2l6ZTsKKworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAga3ZfdHlwZSA9IDA7CisgIG1zaXplID0gMDsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJm1zaXplLCBlcnJvcikpIDwwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIC8qIHN0aWxsIHJlYWQgdGhlIGt2IGJ5dGUgaWYgbmVnYXRpdmUgc2l6ZSAqLworICBpZiAobXNpemUgIT0gMCkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZrdl90eXBlLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIGlmIChjcC0+Y29udGFpbmVyX2xpbWl0ID4gMCAmJiBtc2l6ZSA+IGNwLT5jb250YWluZXJfbGltaXQpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICJnb3Qgc2l6ZSBvdmVyIGxpbWl0ICglZCA+ICVkKSIsIG1zaXplLCBjcC0+Y29udGFpbmVyX2xpbWl0KTsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZiAobXNpemUgPiAwKSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpKChndWludDgpa3ZfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqa2V5X3R5cGUgPSByZXQ7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpKChndWludDgpa3ZfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnZhbHVlX3R5cGUgPSByZXQ7CisgICAgKnNpemUgPSAoZ3VpbnQzMikgbXNpemU7CisgIH0gZWxzZSBpZiAobXNpemUgPT0gMCkgeworICAgICprZXlfdHlwZSA9IDA7CisgICAgKnZhbHVlX3R5cGUgPSAwOworICAgICpzaXplID0gMDsKKyAgfSBlbHNlIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIG1zaXplKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQ4IHNpemVfYW5kX3R5cGU7CisgIGdpbnQzMiBsc2l6ZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBzaXplX2FuZF90eXBlID0gMDsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmc2l6ZV9hbmRfdHlwZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgbHNpemUgPSAoKGd1aW50OClzaXplX2FuZF90eXBlID4+IDQpICYgMHgwZjsKKyAgaWYgKGxzaXplID09IDE1KSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJmxzaXplLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIGlmIChsc2l6ZSA8IDApIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIGxzaXplKTsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZiAoY3AtPmNvbnRhaW5lcl9saW1pdCA+IDAgJiYgbHNpemUgPiBjcC0+Y29udGFpbmVyX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCBsc2l6ZSwgY3AtPmNvbnRhaW5lcl9saW1pdCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KShzaXplX2FuZF90eXBlICYgMHgwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqZWxlbWVudF90eXBlID0gcmV0OworICAqc2l6ZSA9IChndWludDMyKSBsc2l6ZTsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCBlbGVtZW50X3R5cGUsIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQ4IHZhbDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoY3AtPl9oYXNfYm9vbF92YWx1ZSA9PSBUUlVFKSB7CisgICAgKnZhbHVlID0gY3AtPl9ib29sX3ZhbHVlOworICAgIGNwLT5faGFzX2Jvb2xfdmFsdWUgPSBGQUxTRTsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICAgICp2YWx1ZSA9ICh2YWwgPT0gQ1RfQk9PTEVBTl9UUlVFKTsKKyAgICByZXR1cm4geGZlcjsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBncG9pbnRlciBiWzFdOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gKihnaW50OCAqKSBiOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHZhbDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnZhbCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgKnZhbHVlID0gKGdpbnQxNikgemlnemFnX3RvX2kzMiAoKGd1aW50MzIpIHZhbCk7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgdmFsOworICBnaW50MzIgeGZlcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKGNwLCAmdmFsLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAqdmFsdWUgPSB6aWd6YWdfdG9faTMyICgoZ3VpbnQzMikgdmFsKTsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQ2NCB2YWw7CisgIGdpbnQzMiB4ZmVyOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQ2NCAoY3AsICZ2YWwsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgICp2YWx1ZSA9IHppZ3phZ190b19pNjQgKChndWludDY0KSB2YWwpOworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICB1bmlvbiB7CisgICAgZ3VpbnQ2NCBiaXRzOworICAgIGd1aW50OCBiWzhdOworICB9IHU7CisKKyAgZ19hc3NlcnQgKHNpemVvZiAoZ2RvdWJsZSkgPT0gc2l6ZW9mIChndWludDY0KSk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LmIsIDgsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHUuYml0cyA9IEdVSU5UNjRfRlJPTV9MRSAodS5iaXRzKTsKKyAgKnZhbHVlID0gdGhyaWZ0X2JpdHdpc2VfY2FzdF9nZG91YmxlICh1LmJpdHMpOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQzMiByZWFkX2xlbjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKyAgcmVhZF9sZW4gPSAwOworCisgIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoY3AtPnN0cmluZ19saW1pdCA+IDAgJiYgcmVhZF9sZW4gPiBjcC0+c3RyaW5nX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCByZWFkX2xlbiwgY3AtPnN0cmluZ19saW1pdCk7CisgICAgKnN0ciA9IE5VTEw7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHJlYWRfbGVuIDwgMCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgcmVhZF9sZW4pOworICAgICpzdHIgPSBOVUxMOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgYXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgY2hhciBmb3IgYmluYXJ5IGRhdGEgKi8KKyAgKnN0ciA9IGdfbmV3MCAoZ2NoYXIsIHJlYWRfbGVuICsgMSk7CisgIGlmIChyZWFkX2xlbiA+IDApIHsKKyAgICBpZiAoKHJldCA9CisgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0ciwgcmVhZF9sZW4sIGVycm9yKSkgPCAwKSB7CisgICAgICBnX2ZyZWUgKCpzdHIpOworICAgICAgKnN0ciA9IE5VTEw7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgICoqc3RyID0gMDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgKmJ1ZiwgZ3VpbnQzMiAqbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQzMiByZWFkX2xlbjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKyAgcmVhZF9sZW4gPSAwOworCisgIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoY3AtPnN0cmluZ19saW1pdCA+IDAgJiYgcmVhZF9sZW4gPiBjcC0+c3RyaW5nX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCByZWFkX2xlbiwgY3AtPnN0cmluZ19saW1pdCk7CisgICAgKmJ1ZiA9IE5VTEw7CisgICAgKmxlbiA9IDA7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHJlYWRfbGVuID4gMCkgeworICAgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgYXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgY2hhciBmb3IgYmluYXJ5IGRhdGEgKi8KKyAgICAqbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuOworICAgICpidWYgPSBnX25ldyAoZ3VjaGFyLCAqbGVuKTsKKyAgICBpZiAoKHJldCA9CisgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZiwgKmxlbiwgZXJyb3IpKSA8IDApIHsKKyAgICAgIGdfZnJlZSAoKmJ1Zik7CisgICAgICAqYnVmID0gTlVMTDsKKyAgICAgICpsZW4gPSAwOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICB9IGVsc2UgaWYgKHJlYWRfbGVuID09IDApIHsKKyAgICAqbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuOworICAgICpidWYgPSBOVUxMOworCisgIH0gZWxzZSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCByZWFkX2xlbik7CisgICAgKmJ1ZiA9IE5VTEw7CisgICAgKmxlbiA9IDA7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdGMgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX1NUUklOR19MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjLT5zdHJpbmdfbGltaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjLT5jb250YWluZXJfbGltaXQpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YzsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHRjID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQ6CisgICAgICB0Yy0+c3RyaW5nX2xpbWl0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfQ09OVEFJTkVSX0xJTUlUOgorICAgICAgdGMtPmNvbnRhaW5lcl9saW1pdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNsczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIGNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoInN0cmluZ19saW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4IGFsbG93ZWQgc3RyaW5nIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgbWF4IHN0cmluZyBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfaW50ICgiY29udGFpbmVyX2xpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXggYWxsb3dlZCBjb250YWluZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBtYXggY29udGFpbmVyIGxpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhJTlQzMiwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kOworICBjbHMtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luOworICBjbHMtPndyaXRlX2ZpZWxkX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9zdG9wID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcDsKKyAgY2xzLT53cml0ZV9tYXBfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW47CisgIGNscy0+d3JpdGVfbWFwX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQ7CisgIGNscy0+d3JpdGVfbGlzdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW47CisgIGNscy0+d3JpdGVfbGlzdF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZDsKKyAgY2xzLT53cml0ZV9zZXRfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW47CisgIGNscy0+d3JpdGVfc2V0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQ7CisgIGNscy0+d3JpdGVfYm9vbCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2w7CisgIGNscy0+d3JpdGVfYnl0ZSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGU7CisgIGNscy0+d3JpdGVfaTE2ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2OworICBjbHMtPndyaXRlX2kzMiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMjsKKyAgY2xzLT53cml0ZV9pNjQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQ7CisgIGNscy0+d3JpdGVfZG91YmxlID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlOworICBjbHMtPndyaXRlX3N0cmluZyA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZzsKKyAgY2xzLT53cml0ZV9iaW5hcnkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnk7CisgIGNscy0+cmVhZF9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luOworICBjbHMtPnJlYWRfbWVzc2FnZV9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kOworICBjbHMtPnJlYWRfc3RydWN0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW47CisgIGNscy0+cmVhZF9zdHJ1Y3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kOworICBjbHMtPnJlYWRfZmllbGRfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luOworICBjbHMtPnJlYWRfZmllbGRfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQ7CisgIGNscy0+cmVhZF9tYXBfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbjsKKyAgY2xzLT5yZWFkX21hcF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9lbmQ7CisgIGNscy0+cmVhZF9saXN0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luOworICBjbHMtPnJlYWRfbGlzdF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kOworICBjbHMtPnJlYWRfc2V0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW47CisgIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfZW5kOworICBjbHMtPnJlYWRfYm9vbCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbDsKKyAgY2xzLT5yZWFkX2J5dGUgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGU7CisgIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNjsKKyAgY2xzLT5yZWFkX2kzMiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyOworICBjbHMtPnJlYWRfaTY0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQ7CisgIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZTsKKyAgY2xzLT5yZWFkX3N0cmluZyA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nOworICBjbHMtPnJlYWRfYmluYXJ5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9pbml0IChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnNlbGYpCit7CisgIGdfcXVldWVfaW5pdCAoJihzZWxmLT5fbGFzdF9maWVsZCkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZmNhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaAorICogIFxicmllZiBDb21wYWN0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHByb3RvY29sLiAgSW1wbGVtZW50cyB0aGUKKyAqICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MpKQorCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2wgVGhyaWZ0Q29tcGFjdFByb3RvY29sOworCisvKiEKKyAqIFRocmlmdCBDb21wYWN0IFByb3RvY29sIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbAoreworICBUaHJpZnRQcm90b2NvbCBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIGdpbnQzMiBzdHJpbmdfbGltaXQ7CisgIGdpbnQzMiBjb250YWluZXJfbGltaXQ7CisKKyAgLyogcHJpdmF0ZSAqLworCisgIC8qKgorICAgKiAoV3JpdGluZykgSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUKKyAgICogc28gaXQgY2FuIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICovCisgIGNvbnN0IGdjaGFyKiBfYm9vbF9maWVsZF9uYW1lOworICBUaHJpZnRUeXBlIF9ib29sX2ZpZWxkX3R5cGU7CisgIGdpbnQxNiBfYm9vbF9maWVsZF9pZDsKKworICAvKioKKyAgICogKFJlYWRpbmcpIElmIHdlIHJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZQorICAgKiB0aGUgYm9vbGVhbiB2YWx1ZSBoZXJlIHNvIHRoYXQgcmVhZF9ib29sIGNhbiB1c2UgaXQuCisgICAqLworICBnYm9vbGVhbiBfaGFzX2Jvb2xfdmFsdWU7CisgIGdib29sZWFuIF9ib29sX3ZhbHVlOworCisgIC8qKgorICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgKiBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgKi8KKworICBHUXVldWUgX2xhc3RfZmllbGQ7CisgIGdpbnQxNiBfbGFzdF9maWVsZF9pZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcyBUaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzczsKKworLyohCisgKiBUaHJpZnQgQ29tcGFjdCBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcworeworICBUaHJpZnRQcm90b2NvbENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCAqLworR1R5cGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyNWUxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlQcm9wZXJ0aWVzCit7CisgICAgUFJPUF8wLAorICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9TVFJJTkdfTElNSVQsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVAorfTsKKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSwgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkpCisKK1RocmlmdFByb3RvY29sICoKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sIChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKnRjZjsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YzsKKworICB0Y2YgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZIChmYWN0b3J5KTsKKworICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX2xpbWl0IiwgdGNmLT5zdHJpbmdfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAiY29udGFpbmVyX2xpbWl0IiwgdGNmLT5jb250YWluZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MICh0Yyk7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSAqdGNmOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdGNmID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfU1RSSU5HX0xJTUlUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdGNmLT5zdHJpbmdfbGltaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ09OVEFJTkVSX0xJTUlUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdGNmLT5jb250YWluZXJfbGltaXQpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBzcGVjKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICp0Y2Y7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICB0Y2YgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9TVFJJTkdfTElNSVQ6CisgICAgICB0Y2YtPnN0cmluZ19saW1pdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ09OVEFJTkVSX0xJTUlUOgorICAgICAgdGNmLT5jb250YWluZXJfbGltaXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2NsYXNzX2luaXQgKFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgKmNsczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIGNscyA9IFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTIChrbGFzcyk7CisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoInN0cmluZ19saW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4IGFsbG93ZWQgc3RyaW5nIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgbWF4IHN0cmluZyBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX1NUUklOR19MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJjb250YWluZXJfbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heCBhbGxvd2VkIGNvbnRhaW5lciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIG1heCBjb250YWluZXIgbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWElOVDMyLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVCwgcGFyYW1fc3BlYyk7CisKKyAgY2xzLT5nZXRfcHJvdG9jb2wgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfaW5pdCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY5NTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0gKKyNkZWZpbmUgX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19CRUdJTl9ERUNMUworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkgXAorICAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlksIFwKKyAgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5OworCitzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5IHBhcmVudDsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgZ2ludDMyIHN0cmluZ19saW1pdDsKKyAgZ2ludDMyIGNvbnRhaW5lcl9saW1pdDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeUNsYXNzOworCitzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcworeworICBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAqLworR1R5cGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTJlMzAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oPgorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FID0gMSwKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfRU5ECit9OworCitHX0RFRklORV9UWVBFKFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wsIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbCwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SKQorCisKK3N0YXRpYyBHUGFyYW1TcGVjICp0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfRU5EXSA9IHsgTlVMTCwgfTsKKworZ2ludDMyCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgY29uc3QgZ2NoYXIgKm5hbWUsIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnY2hhciAqc2VydmljZV9uYW1lID0gTlVMTDsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIGlmKCAobWVzc2FnZV90eXBlID09IFRfQ0FMTCB8fCBtZXNzYWdlX3R5cGUgPT0gVF9PTkVXQVkpICYmIHNlbGYtPnNlcnZpY2VfbmFtZSAhPSBOVUxMKSB7CisgICAgc2VydmljZV9uYW1lID0gZ19zdHJkdXBfcHJpbnRmKCIlcyVzJXMiLCBzZWxmLT5zZXJ2aWNlX25hbWUsIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9ERUZBVUxUX1NFUEFSQVRPUiwgbmFtZSk7CisgIH1lbHNleworICAgIHNlcnZpY2VfbmFtZSA9IGdfc3RyZHVwKG5hbWUpOworICB9CisKKyAgLyogcmVsYXkgdG8gdGhlIHByb3RvY29sX2RlY29yYXRvciAqLworICByZXQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfYmVnaW4ocHJvdG9jb2wsIHNlcnZpY2VfbmFtZSwgbWVzc2FnZV90eXBlLCBzZXFpZCwgZXJyb3IpOworCisgIGdfZnJlZShzZXJ2aWNlX25hbWUpOworCisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgICAgICAqb2JqZWN0LAorICAgIGd1aW50ICAgICAgICAgcHJvcGVydHlfaWQsCisgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICAgKnBzcGVjKQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9TRVJWSUNFX05BTUU6CisgICAgc2VsZi0+c2VydmljZV9uYW1lID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgcHJvcGVydHlfaWQsCisgICAgR1ZhbHVlICAgICAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX1NFUlZJQ0VfTkFNRToKKyAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzZWxmLT5zZXJ2aWNlX25hbWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqcHJvdG9jb2wpCit7CisgIHByb3RvY29sLT5zZXJ2aWNlX25hbWUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2ZpbmFsaXplIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MIChnb2JqZWN0KTsKKworICBpZiAoc2VsZi0+c2VydmljZV9uYW1lKSB7CisgICAgZ19mcmVlKHNlbGYtPnNlcnZpY2VfbmFtZSk7CisgICAgc2VsZi0+c2VydmljZV9uYW1lID0gTlVMTDsKKyAgfQorCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyBhcyB3aXRoIGRpc3Bvc2UoKSwgZmluYWxpemUoKQorICAgKiBpcyBndWFyYW50ZWVkIHRvIGV4aXN0IG9uIHRoZSBwYXJlbnQncyBjbGFzcyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3BhcmVudF9jbGFzcyktPmZpbmFsaXplKGdvYmplY3QpOworfQorCisKKy8qIGluaXRpYWxpemUgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW47CisKKyAgb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfc2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9nZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZmluYWxpemU7CisKKyAgdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX1NFUlZJQ0VfTkFNRV0gPQorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInNlcnZpY2UtbmFtZSIsCisgICAgICAgICAgIlNlcnZpY2UgbmFtZSB0aGUgcHJvdG9jb2wgcG9pbnRzIHRvIiwKKyAgICAgICAgICAiU2V0IHRoZSBzZXJ2aWNlIG5hbWUiLAorICAgICAgICAgIE5VTEwsCisgICAgICAgICAgKEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydGllcyAob2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfRU5ELAorICAgICAgdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZTA4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0gKKyNkZWZpbmUgX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oCisgKiAgXGJyaWVmIE11bHRpcGxleGVkIHByb3RvY29sIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHByb3RvY29sLiAgSW1wbGVtZW50cyB0aGUKKyAqICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MLCBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01VTFRJUExFWEVEX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MLCBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wsIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcykpCisKKy8qIGNvbnN0YW50ICovCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9ERUZBVUxUX1NFUEFSQVRPUiAiOiIKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbDsKKworCisKKy8qIQorICogVGhyaWZ0IE11bHRpcGxleGVkIFByb3RvY29sIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvdG9jb2wKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgcGFyZW50OworCisgIGdjaGFyICpzZXJ2aWNlX25hbWU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzczsKKworLyohCisgKiBUaHJpZnQgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCAqLworR1R5cGUgdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMKaW5kZXggZDYzMTVkOC4uNmU2YWU0ZCAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYworKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jCkBAIC02MSwxNSArNjEsMTUgQEAKICAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKICAgewogICAgIGNhc2UgUFJPUF9USFJJRlRfUFJPVE9DT0xfVFJBTlNQT1JUOgotICAgICAgcHJvdG9jb2wtPnRyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgcHJvdG9jb2wtPnRyYW5zcG9ydCA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOwogICAgICAgYnJlYWs7CiAgIH0KIH0KIAogCiBnaW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLCAKK3RocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCiB7CkBAIC0yNDMsNyArMjQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKIH0KIAotZ2ludDMyIAorZ2ludDMyCiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLApAQCAtMjU0LDcgKzI1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCwgZXJyb3IpOwogfQogCi1naW50MzIgCitnaW50MzIKIHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCiB7CkBAIC0yNjIsNyArMjYyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwogfQogCi1naW50MzIgCitnaW50MzIKIHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQpAQCAtMjc5LDcgKzI3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwogfQogCi1naW50MzIgCitnaW50MzIKIHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCkBAIC0yOTMsNyArMjkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwogfQogCi1naW50MzIgCitnaW50MzIKIHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKIHsKQEAgLTMwMSw3ICszMDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwogfQogCi1naW50MzIgCitnaW50MzIKIHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwgZ3VpbnQzMiAqc2l6ZSwKQEAgLTMxMSwxNyArMzExLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKIH0KIAotZ2ludDMyIAorZ2ludDMyCiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQogewogICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX21hcF9lbmQgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKIH0KIAotZ2ludDMyIAorZ2ludDMyCiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKQEAgLTQxMiwxMyArNDEyLDIwIEBACiB9CiAKIGdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdwb2ludGVyICpidWYsIAordGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdwb2ludGVyICpidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKmxlbiwgR0Vycm9yICoqZXJyb3IpCiB7CiAgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfYmluYXJ5IChwcm90b2NvbCwgYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7CiB9CiAKKyNkZWZpbmUgVEhSSUZUX1NLSVBfUkVTVUxUX09SX1JFVFVSTihfUkVTLCBfQ0FMTCkgXAorICB7IFwKKyAgICBnaW50MzIgX3ggPSAoX0NBTEwpOyBcCisgICAgaWYgKF94IDwgMCkgeyByZXR1cm4gX3g7IH0gXAorICAgIChfUkVTKSArPSBfeDsgXAorICB9CisKIGdpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3NraXAgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSB0eXBlLCBHRXJyb3IgKiplcnJvcikKIHsKQEAgLTQ2NSw1NyArNDcyLDkyIEBACiAgICAgICB9CiAgICAgY2FzZSBUX1NUUlVDVDoKICAgICAgIHsKLSAgICAgICAgZ3VpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBnaW50MzIgcmVzdWx0ID0gMDsKICAgICAgICAgZ2NoYXIgKm5hbWU7CiAgICAgICAgIGdpbnQxNiBmaWQ7CiAgICAgICAgIFRocmlmdFR5cGUgZnR5cGU7Ci0gICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgZXJyb3IpOwotCisgICAgICAgIFRIUklGVF9TS0lQX1JFU1VMVF9PUl9SRVRVUk4ocmVzdWx0LAorICAgICAgICAgIHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCBlcnJvcikpCiAgICAgICAgIHdoaWxlICgxKQogICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJm5hbWUsICZmdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWQsIGVycm9yKTsKKyAgICAgICAgICBUSFJJRlRfU0tJUF9SRVNVTFRfT1JfUkVUVVJOKHJlc3VsdCwKKyAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJm5hbWUsICZmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlkLCBlcnJvcikpCiAgICAgICAgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkKICAgICAgICAgICB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9Ci0gICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKTsKLSAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpOworICAgICAgICAgIFRIUklGVF9TS0lQX1JFU1VMVF9PUl9SRVRVUk4ocmVzdWx0LAorICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKQorICAgICAgICAgIFRIUklGVF9TS0lQX1JFU1VMVF9PUl9SRVRVUk4ocmVzdWx0LAorICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKQogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpOworICAgICAgICBUSFJJRlRfU0tJUF9SRVNVTFRfT1JfUkVUVVJOKHJlc3VsdCwKKyAgICAgICAgICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIGNhc2UgVF9TRVQ6CisgICAgICB7CisgICAgICAgIGdpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBUaHJpZnRUeXBlIGVsZW1fdHlwZTsKKyAgICAgICAgZ3VpbnQzMiBpLCBzaXplOworICAgICAgICBUSFJJRlRfU0tJUF9SRVNVTFRfT1JfUkVUVVJOKHJlc3VsdCwKKyAgICAgICAgICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLCAmZWxlbV90eXBlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIFRIUklGVF9TS0lQX1JFU1VMVF9PUl9SRVRVUk4ocmVzdWx0LAorICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBlbGVtX3R5cGUsIGVycm9yKSkKKyAgICAgICAgfQorICAgICAgICBUSFJJRlRfU0tJUF9SRVNVTFRfT1JfUkVUVVJOKHJlc3VsdCwKKyAgICAgICAgICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChwcm90b2NvbCwgZXJyb3IpKQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgfQogICAgIGNhc2UgVF9NQVA6CiAgICAgICB7Ci0gICAgICAgIGd1aW50MzIgcmVzdWx0ID0gMDsKKyAgICAgICAgZ2ludDMyIHJlc3VsdCA9IDA7CiAgICAgICAgIFRocmlmdFR5cGUgZWxlbV90eXBlOworICAgICAgICBUaHJpZnRUeXBlIGtleV90eXBlOwogICAgICAgICBndWludDMyIGksIHNpemU7Ci0gICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLCAmZWxlbV90eXBlLCAmc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgICAgICBUSFJJRlRfU0tJUF9SRVNVTFRfT1JfUkVUVVJOKHJlc3VsdCwKKyAgICAgICAgICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLCAma2V5X3R5cGUsICZlbGVtX3R5cGUsICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZWxlbV90eXBlLCBlcnJvcik7CisgICAgICAgICAgVEhSSUZUX1NLSVBfUkVTVUxUX09SX1JFVFVSTihyZXN1bHQsCisgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGtleV90eXBlLCBlcnJvcikpCisgICAgICAgICAgVEhSSUZUX1NLSVBfUkVTVUxUX09SX1JFVFVSTihyZXN1bHQsCisgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGVsZW1fdHlwZSwgZXJyb3IpKQogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChwcm90b2NvbCwgZXJyb3IpOworICAgICAgICBUSFJJRlRfU0tJUF9SRVNVTFRfT1JfUkVUVVJOKHJlc3VsdCwKKyAgICAgICAgICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChwcm90b2NvbCwgZXJyb3IpKQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgfQogICAgIGNhc2UgVF9MSVNUOgogICAgICAgewotICAgICAgICBndWludDMyIHJlc3VsdCA9IDA7CisgICAgICAgIGdpbnQzMiByZXN1bHQgPSAwOwogICAgICAgICBUaHJpZnRUeXBlIGVsZW1fdHlwZTsKICAgICAgICAgZ3VpbnQzMiBpLCBzaXplOwotICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtX3R5cGUsICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgICAgICBUSFJJRlRfU0tJUF9SRVNVTFRfT1JfUkVUVVJOKHJlc3VsdCwKKyAgICAgICAgICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1fdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZWxlbV90eXBlLCBlcnJvcik7CisgICAgICAgICAgVEhSSUZUX1NLSVBfUkVTVUxUX09SX1JFVFVSTihyZXN1bHQsCisgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBlbGVtX3R5cGUsIGVycm9yKSkKICAgICAgICAgfQotICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKHByb3RvY29sLCBlcnJvcik7CisgICAgICAgIFRIUklGVF9TS0lQX1JFU1VMVF9PUl9SRVRVUk4ocmVzdWx0LAorICAgICAgICAgIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgfQogICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKKyAgICAgIGJyZWFrOwogICB9CisKKyAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgInVucmVjb2duaXplZCB0eXBlIik7CisgIHJldHVybiAtMTsKIH0KIAogLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBUaHJpZnQgcHJvdG9jb2xzICovCkBAIC01MzMsMTIgKzU3NSwyNyBAQAogfQogCiBzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2Rpc3Bvc2UgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdFByb3RvY29sICpzZWxmID0gVEhSSUZUX1BST1RPQ09MIChnb2JqZWN0KTsKKworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+dHJhbnNwb3J0KTsKKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZgorICAgKiB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudHMgdGhlIGRpc3Bvc2UoKSB2aXJ0dWFsIGZ1bmN0aW9uOiBpdCBpcworICAgKiBhbHdheXMgZ3VhcmFudGVlZCB0byBkbyBzbworICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9wcm90b2NvbF9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKGdvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAogdGhyaWZ0X3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdFByb3RvY29sQ2xhc3MgKmNscykKIHsKICAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CiAKICAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX2dldF9wcm9wZXJ0eTsKICAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IHRocmlmdF9wcm90b2NvbF9kaXNwb3NlOwogCiAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCiAgICAgICBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQsCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZjk0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYwpAQCAtMCwwICsxLDYyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+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+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaAorICogIFxicmllZiBNdWx0aXBsZXhlZCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IgKHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IsIFRocmlmdFByb3RvY29sRGVjb3JhdG9yKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0RFQ09SQVRPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiwgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTF9ERUNPUkFUT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IsIFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3I7CisKKworLyohCisgKiBUaHJpZnQgUHJvdG9jb2wgRGVjb3JhdG9yIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sRGVjb3JhdG9yCit7CisgIFRocmlmdFByb3RvY29sIHBhcmVudDsKKworICBUaHJpZnRQcm90b2NvbCAqY29uY3JldGVfcHJvdG9jb2w7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzOworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBEZWNvcmF0b3IgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcworeworICBUaHJpZnRQcm90b2NvbENsYXNzIHBhcmVudDsKKworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IgKi8KK0dUeXBlIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhY2E4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaD4KKworCitlbnVtCit7CisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfTkFNRSA9IDEsCisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfVFlQRSwKKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfU0VRVUVOQ0VfSUQsCisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1RSQU5TUE9SVCwgLyogVE9ETyB1Z2x5IGhhY2sgKi8KKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfRU5ECit9OworCitHX0RFRklORV9UWVBFKFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCwgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IpCisKKworc3RhdGljIEdQYXJhbVNwZWMgKnRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9FTkRdID0geyBOVUxMLCB9OworCitnaW50MzIKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKwkJCQkJICAgZ2NoYXIgKipuYW1lLAorCQkJCQkgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorCQkJCQkgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldCA9IDA7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIC8qIFdlIHJldHVybiB0aGUgc3RvcmVkIHZhbHVlcyBvbiBjb25zdHJ1Y3Rpb24gKi8KKyAgKm5hbWUgPSBzZWxmLT5uYW1lOworICAqbWVzc2FnZV90eXBlID0gc2VsZi0+bXR5cGU7CisgICpzZXFpZCA9IHNlbGYtPnNlcWlkOworCisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgICAgICAqb2JqZWN0LAorCQkJCQkgICAgIGd1aW50ICAgICAgICAgcHJvcGVydHlfaWQsCisJCQkJCSAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwKKwkJCQkJICAgICBHUGFyYW1TcGVjICAgKnBzcGVjKQoreworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9OQU1FOgorICAgICAgc2VsZi0+bmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX1RZUEU6CisgICAgICBzZWxmLT5tdHlwZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9TRVFVRU5DRV9JRDoKKyAgICAgIHNlbGYtPnNlcWlkID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2dldF9wcm9wZXJ0eSAoR09iamVjdCAgICAqb2JqZWN0LAorCQkJCQkgICAgIGd1aW50ICAgICAgIHByb3BlcnR5X2lkLAorCQkJCQkgICAgIEdWYWx1ZSAgICAgKnZhbHVlLAorCQkJCQkgICAgIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKG9iamVjdCk7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpkZWNvcmF0b3IgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChvYmplY3QpOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydD1OVUxMOworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX05BTUU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzZWxmLT5uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfVFJBTlNQT1JUOgorICAgICAgLyogRklYTUUgU2luY2Ugd2UgZG9uJ3Qgb3ZlcnJpZGUgcHJvcGVydGllcyBpbiB0aGUgZGVjb3JhdG9yIGFzIGl0IHNob3VsZAorICAgICAgICAgd2UganVzdCBvdmVycmlkZSB0aGUgcHJvcGVydGllcyB0aGF0IHdlIGtub3cgYXJlIHVzZWQgKi8KKyAgICAgIGdfb2JqZWN0X2dldChkZWNvcmF0b3ItPmNvbmNyZXRlX3Byb3RvY29sLHBzcGVjLT5uYW1lLCAmdHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIGdfdmFsdWVfc2V0X3BvaW50ZXIgKHZhbHVlLCB0cmFuc3BvcnQpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2luaXQgKFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqcHJvdG9jb2wpCit7CisgIHByb3RvY29sLT5uYW1lID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9maW5hbGl6ZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzZWxmID0gVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChnb2JqZWN0KTsKKworICBpZiAoc2VsZi0+bmFtZSkgeworICAgICAgZ19mcmVlKHNlbGYtPm5hbWUpOworICAgICAgc2VsZi0+bmFtZSA9IE5VTEw7CisgIH0KKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgYXMgd2l0aCBkaXNwb3NlKCksIGZpbmFsaXplKCkKKyAgICogaXMgZ3VhcmFudGVlZCB0byBleGlzdCBvbiB0aGUgcGFyZW50J3MgY2xhc3MgdmlydHVhbCBmdW5jdGlvbiB0YWJsZQorICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZShnb2JqZWN0KTsKK30KKworCisvKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luOworCisgIG9iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2ZpbmFsaXplOworCisgIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX05BTUVdID0KKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJuYW1lIiwKKwkJCSAgICJTZXJ2aWNlIG5hbWUgdGhlIHByb3RvY29sIHBvaW50cyB0byIsCisJCQkgICAiU2V0IHRoZSBzZXJ2aWNlIG5hbWUiLAorCQkJICAgTlVMTCwKKwkJCSAgIChHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKyAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfVFlQRV0gPQorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInR5cGUiLAorCQkJIk1lc3NhZ2UgdHlwZSBpbiB0aGUgd2lyZSIsCisJCQkiU2V0IHRoZSBtZXNzYWdlIHR5cGUgaW4gdGhlIHdpcmUiLAorCQkJVF9DQUxMLCBUX09ORVdBWSwKKwkJCVRfQ0FMTCwKKwkJCShHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKyAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1NFUVVFTkNFX0lEXSA9CisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgic2VxaWQiLAorCQkJIlNlcXVlbmNlIGlkIHR5cGUgaW4gdGhlIHdpcmUiLAorCQkJIlNldCB0aGUgU2VxdWVuY2UgaWQgaW4gdGhlIHdpcmUiLAorCQkJR19NSU5JTlQsIEdfTUFYSU5ULAorCQkJMCwKKwkJCShHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICAvKiBUT0RPIFVnbHkgaGFjaywgaW4gdGhlb3J5IHdlIG11c3Qgb3ZlcnJpZGUgYWxsIHByb3BlcnRpZXMgZnJvbSB1bmRlcmxheWluZworICAgICBwcm90b2NvbCAqLworICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfVFJBTlNQT1JUXSA9CisgICAgICBnX3BhcmFtX3NwZWNfcG9pbnRlciAoInRyYW5zcG9ydCIsCisJCQkiVHJhbnNwb3J0IG9uIHRoZSB1bmRlcmxheWluZyBpbXBsZW1lbnRhdGlvbiIsCisJCQkiVHJhbnNwb3J0IG9mIGRlY29yYXRlZCBwcm90b2NvbCIsCisJCQlHX1BBUkFNX1JFQURBQkxFKTsKKworCisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0aWVzIChvYmplY3RfY2xhc3MsCisJCQkJICAgICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9FTkQsCisJCQkJICAgICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXMpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3ODJhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKKyAqICBcYnJpZWYgU3RvcmVkTWVzc2FnZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIHByZS1zdG9yZWQgbWVzc2FnZSBoZWFkZXIKKyAqICBvbiBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZSBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCkpCisjZGVmaW5lIFRIUklGVF9JU19TVE9SRURfTUVTU0FHRV9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzKSkKKworLyogY29uc3RhbnQgKi8KKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SICI6IgorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbDsKKworCisKKy8qIQorICogVGhyaWZ0IFN0b3JlZE1lc3NhZ2UgUHJvdG9jb2wgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yIHBhcmVudDsKKworICBnY2hhciAqbmFtZTsKKyAgVGhyaWZ0TWVzc2FnZVR5cGUgbXR5cGU7CisgIGdpbnQzMiBzZXFpZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcyBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzczsKKworLyohCisgKiBUaHJpZnQgU3RvcmVkTWVzc2FnZSBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcworeworICBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKi8KK0dUeXBlIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYwppbmRleCBlOGFmZjQ1Li5jY2Y5MTUzIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jCkBAIC03NiwyMiArNzYsMjIgQEAKICAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKICAgewogICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1BST0NFU1NPUjoKLSAgICAgIHNlcnZlci0+cHJvY2Vzc29yID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBzZXJ2ZXItPnByb2Nlc3NvciA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVDoKLSAgICAgIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWToKLSAgICAgIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9UUkFOU1BPUlRfRkFDVE9SWToKLSAgICAgIHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWToKLSAgICAgIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWToKLSAgICAgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKICAgICAgIGJyZWFrOwogICB9CiB9CkBAIC0xMjAsNyArMTIwLDI3IEBACiAgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBOVUxMOwogfQogCi0vKiBjbGFzcyBpbml0aWFsaXplciBmb3IgVGhyaWZ0U2VydmVyCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9kaXNwb3NlIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRTZXJ2ZXIgKnNlbGYgPSBUSFJJRlRfU0VSVkVSIChnb2JqZWN0KTsKKworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+c2VydmVyX3RyYW5zcG9ydCk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5wcm9jZXNzb3IpOworCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGlmCisgICAqIHRoZSBwYXJlbnQgY2xhc3MgaW1wbGVtZW50cyB0aGUgZGlzcG9zZSgpIHZpcnR1YWwgZnVuY3Rpb246IGl0IGlzCisgICAqIGFsd2F5cyBndWFyYW50ZWVkIHRvIGRvIHNvCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3NlcnZlcl9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKGdvYmplY3QpOworfQorCisvKgorICogY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdFNlcnZlcgogICogVE9ETzogaW1wbGVtZW50IFNlcnZlckV2ZW50SGFuZGxlciBhcyBhIEdDbG9zdXJlCiAgKi8KIHN0YXRpYyB2b2lkCkBAIC0xMzAsNiArMTUwLDcgQEAKIAogICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX2dldF9wcm9wZXJ0eTsKICAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSB0aHJpZnRfc2VydmVyX2Rpc3Bvc2U7CiAKICAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKICAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1IsCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuYwppbmRleCAxNWY0MDlmLi44ZGU4NjlmIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmMKQEAgLTMxLDYgKzMxLDY3IEBACiAKICAgKmxpc3QgPSBnX2xpc3RfYXBwZW5kICgqbGlzdCwga2V5KTsKIH0KK3ZvaWQgdGhyaWZ0X3NhZmVfaGFzaF90YWJsZV9kZXN0cm95KEdIYXNoVGFibGUqIGhhc2hfdGFibGUpCit7CisgIGlmIChoYXNoX3RhYmxlKQorICB7CisgICAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3koaGFzaF90YWJsZSk7CisgIH0KK30KKworZ3VpbnQgdGhyaWZ0X2Jvb2xlYW5faGFzaChnY29uc3Rwb2ludGVyIHYpCit7CisgIGNvbnN0IGdib29sZWFuKiBwID0gdjsKKyAgcmV0dXJuIHAgJiYgKnAgPyAxIDogMDsKK30KK2dib29sZWFuIHRocmlmdF9ib29sZWFuX2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBpZiAoYSA9PSBiKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFhIHx8ICFiKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNvbnN0IGdib29sZWFuKiBwYSA9IGE7CisgIGNvbnN0IGdib29sZWFuKiBwYiA9IGI7CisgIHJldHVybiAqcGEgPT0gKnBiOworfQorCitndWludCB0aHJpZnRfaW50OF9oYXNoKGdjb25zdHBvaW50ZXIgdikKK3sKKyAgY29uc3QgZ2ludDgqIHAgPSB2OworICByZXR1cm4gcCA/ICpwIDogMDsKK30KK2dib29sZWFuIHRocmlmdF9pbnQ4X2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBpZiAoYSA9PSBiKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFhIHx8ICFiKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNvbnN0IGdpbnQ4KiBwYSA9IGE7CisgIGNvbnN0IGdpbnQ4KiBwYiA9IGI7CisgIHJldHVybiAqcGEgPT0gKnBiOworfQorCitndWludCB0aHJpZnRfaW50MTZfaGFzaChnY29uc3Rwb2ludGVyIHYpCit7CisgIGNvbnN0IGdpbnQxNiogcCA9IHY7CisgIHJldHVybiBwID8gKnAgOiAwOworfQorZ2Jvb2xlYW4gdGhyaWZ0X2ludDE2X2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBpZiAoYSA9PSBiKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFhIHx8ICFiKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNvbnN0IGdpbnQxNiogcGEgPSBhOworICBjb25zdCBnaW50MTYqIHBiID0gYjsKKyAgcmV0dXJuICpwYSA9PSAqcGI7Cit9CiAKIHZvaWQKIHRocmlmdF9zdHJpbmdfZnJlZSAoZ3BvaW50ZXIgc3RyKQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmgKaW5kZXggODU4YWQ4Ni4uOTRhNjQ3OCAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5oCkBAIC0zMyw2ICszMywxNyBAQAogCiB2b2lkIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzIChncG9pbnRlciBrZXksIGdwb2ludGVyIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3ZvaWQgdGhyaWZ0X3NhZmVfaGFzaF90YWJsZV9kZXN0cm95KEdIYXNoVGFibGUqIGhhc2hfdGFibGUpOworCitndWludCB0aHJpZnRfYm9vbGVhbl9oYXNoKGdjb25zdHBvaW50ZXIgdik7CitnYm9vbGVhbiB0aHJpZnRfYm9vbGVhbl9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYik7CisKK2d1aW50IHRocmlmdF9pbnQ4X2hhc2goZ2NvbnN0cG9pbnRlciB2KTsKK2dib29sZWFuIHRocmlmdF9pbnQ4X2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKTsKKworZ3VpbnQgdGhyaWZ0X2ludDE2X2hhc2goZ2NvbnN0cG9pbnRlciB2KTsKK2dib29sZWFuIHRocmlmdF9pbnQxNl9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYik7CisKIHZvaWQgdGhyaWZ0X3N0cmluZ19mcmVlIChncG9pbnRlciBzdHIpOwogCiAjZW5kaWYgLyogI2lmbmRlZiBfVEhSSUZUX1RIUklGVF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKaW5kZXggZWRlMjhjZi4uMGFiM2U5MyAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYwpAQCAtMTcsNyArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTg0LDcgKzgzLDcgQEAKICAgZ3VpbnQzMiBoYXZlID0gdC0+cl9idWYtPmxlbjsKIAogICAvKiB3ZSBzaG91bGRuJ3QgaGl0IHRoaXMgdW5sZXNzIHRoZSBidWZmZXIgZG9lc24ndCBoYXZlIGVub3VnaCB0byByZWFkICovCi0gIGFzc2VydCAodC0+cl9idWYtPmxlbiA8IHdhbnQpOworICBnX2Fzc2VydCAodC0+cl9idWYtPmxlbiA8IHdhbnQpOwogCiAgIC8qIGZpcnN0IGNvcHkgd2hhdCB3ZSBoYXZlIGluIG91ciBidWZmZXIuICovCiAgIGlmIChoYXZlID4gMCkKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGFiZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdEZEVHJhbnNwb3J0UHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRAorfTsKKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0RkRUcmFuc3BvcnQsIHRocmlmdF9mZF90cmFuc3BvcnQsIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkKKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiB0LT5mZCA+PSAwICYmICEgKGZjbnRsICh0LT5mZCwgRl9HRVRGTCkgPT0gLTEgJiYgZXJybm8gPT0gRUJBREYpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworI2lmIEdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApCisgIHJldHVybiBnX2Nsb3NlICh0LT5mZCwgZXJyb3IpOworI2Vsc2UKKyAgaWYgKGNsb3NlICh0LT5mZCkgPT0gMCkgeworICAgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ0xPU0UsCisgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorI2VuZGlmCit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCitnaW50MzIKK3RocmlmdF9mZF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgc3NpemVfdCBuOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBuID0gcmVhZCAodC0+ZmQsIChndWludDggKikgYnVmLCBsZW4pOworICBpZiAobiA9PSAtMSkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9SRUNFSVZFLAorICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgZnJvbSBmZDogJXMiLAorICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIG47Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICBndWludDggKl9idWY7CisgIGd1aW50MzIgX2xlbjsKKyAgc3NpemVfdCBuOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBfYnVmID0gKGd1aW50OCAqKSBidWY7CisgIF9sZW4gPSBsZW47CisgIHdoaWxlIChfbGVuID4gMCkgeworICAgIG4gPSB3cml0ZSAodC0+ZmQsIF9idWYsIF9sZW4pOworICAgIGlmIChuID09IC0xKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB3cml0ZSBmcm9tIGZkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIF9idWYgKz0gbjsKKyAgICAgIF9sZW4gLT0gbjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIGlmIChmc3luYyAodC0+ZmQpID09IC0xKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1VOS05PV04sCisgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZmx1c2ggZmQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgeworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0RkRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgdHJhbnNwb3J0LT5mZCA9IC0xOworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAob2JqZWN0KTsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHQtPmZkKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRDoKKyAgICAgIHQtPmZkID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfZmRfdHJhbnNwb3J0X2NsYXNzX2luaXQgKFRocmlmdEZEVHJhbnNwb3J0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YzsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIHR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJmZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBkZXNjcmlwdG9yIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIGZpbGUgZGVzY3JpcHRvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfTUlOLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9NQVgsIC8qIG1heCwgMTAyNCoxMDI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2ZpbmFsaXplOworICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2lzX29wZW47CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9mZF90cmFuc3BvcnRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9mZF90cmFuc3BvcnRfY2xvc2U7CisgIHR0Yy0+cmVhZCA9IHRocmlmdF9mZF90cmFuc3BvcnRfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9mZF90cmFuc3BvcnRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X3dyaXRlOworICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9mZF90cmFuc3BvcnRfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9mbHVzaDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZkNWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0ZEX1RSQU5TUE9SVF9ICisjZGVmaW5lIF9USFJJRlRfRkRfVFJBTlNQT1JUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnRfdHJhbnNwb3J0LmgiCisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9mZF90cmFuc3BvcnQuaAorICogIFxicmllZiBDbGFzcyBmb3IgVGhyaWZ0IGZpbGUgZGVzY3JpcHRvciB0cmFuc3BvcnRzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCAodGhyaWZ0X2ZkX3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0ZEX1RSQU5TUE9SVChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RkRUcmFuc3BvcnQpKQorI2RlZmluZSBUSFJJRlRfSVNfRkRfVFJBTlNQT1JUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfRkRfVFJBTlNQT1JUX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEZEVHJhbnNwb3J0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfRkRfVFJBTlNQT1JUX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9GRF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRGRFRyYW5zcG9ydCBUaHJpZnRGRFRyYW5zcG9ydDsKKworc3RydWN0IF9UaHJpZnRGRFRyYW5zcG9ydAoreworICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBnaW50IGZkOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZEVHJhbnNwb3J0Q2xhc3MgVGhyaWZ0RkRUcmFuc3BvcnRDbGFzczsKKworLyohCisgKiBUaHJpZnQgVHJhbnNwb3J0IGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCAqLworR1R5cGUgdGhyaWZ0X2ZkX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0ZEX1RSQU5TUE9SVF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYwppbmRleCA0YzhiNzFmLi5jNTQ4MjQ2IDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0xMjAsNyArMTE5LDcgQEAKICAgZ2ludDMyIHJlc3VsdCA9IC0xOwogCiAgIC8qIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQgKi8KLSAgYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7CisgIGdfYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7CiAKICAgLyogZmlyc3QgY29weSB3aGF0IHdlIGhhdmUgaW4gb3VyIGJ1ZmZlciwgaWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdCAqLwogICBpZiAoaGF2ZSA+IDApCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYwppbmRleCA4ZDY2YzNkLi45MTgxOGU5IDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0zMiw3ICszMSw5IEBACiBlbnVtIF9UaHJpZnRNZW1vcnlCdWZmZXJQcm9wZXJ0aWVzCiB7CiAgIFBST1BfMCwKLSAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRQorICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFLAorICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUiwKKyAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUgogfTsKIAogR19ERUZJTkVfVFlQRShUaHJpZnRNZW1vcnlCdWZmZXIsIHRocmlmdF9tZW1vcnlfYnVmZmVyLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCkBAIC0xNDEsMjQgKzE0MiwyNCBAQAogICByZXR1cm4gVFJVRTsKIH0KIAotLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCisvKiBpbml0aWFsaXplcyBjbGFzcyBiZWZvcmUgY29uc3RydWN0b3IgcHJvcGVydGllcyBhcmUgc2V0ICovCiBzdGF0aWMgdm9pZAotdGhyaWZ0X21lbW9yeV9idWZmZXJfaW5pdCAoVGhyaWZ0TWVtb3J5QnVmZmVyICp0cmFuc3BvcnQpCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9pbml0IChUaHJpZnRNZW1vcnlCdWZmZXIgKnQpCiB7Ci0gIHRyYW5zcG9ydC0+YnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHQpOwogfQogCiAvKiBkZXN0cnVjdG9yICovCiBzdGF0aWMgdm9pZAogdGhyaWZ0X21lbW9yeV9idWZmZXJfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKIHsKLSAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0cmFuc3BvcnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CiAKLSAgaWYgKHRyYW5zcG9ydC0+YnVmICE9IE5VTEwpCisgIGlmICh0LT5vd25lciAmJiB0LT5idWYgIT0gTlVMTCkKICAgewotICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPmJ1ZiwgVFJVRSk7CisgICAgZ19ieXRlX2FycmF5X3VucmVmICh0LT5idWYpOwogICB9Ci0gIHRyYW5zcG9ydC0+YnVmID0gTlVMTDsKKyAgdC0+YnVmID0gTlVMTDsKIH0KIAogLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KQEAgLTE2NiwxNCArMTY3LDIzIEBACiB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQogewotICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRyYW5zcG9ydCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKIAogICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwogCiAgIHN3aXRjaCAocHJvcGVydHlfaWQpCiAgIHsKICAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkU6Ci0gICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT5idWZfc2l6ZSk7CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdC0+YnVmX3NpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUjoKKyAgICAgIGdfdmFsdWVfc2V0X3BvaW50ZXIgKHZhbHVlLCAoZ3BvaW50ZXIpICh0LT5idWYpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUjoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB0LT5vd25lcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CiAgICAgICBicmVhazsKICAgfQogfQpAQCAtMTgzLDE4ICsxOTMsNDAgQEAKIHRocmlmdF9tZW1vcnlfYnVmZmVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCiB7Ci0gIFRocmlmdE1lbW9yeUJ1ZmZlciAqdHJhbnNwb3J0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOwogCiAgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CiAKICAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKICAgewogICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRToKLSAgICAgIHRyYW5zcG9ydC0+YnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICB0LT5idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVI6CisgICAgICB0LT5idWYgPSAoR0J5dGVBcnJheSopIGdfdmFsdWVfZ2V0X3BvaW50ZXIgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUjoKKyAgICAgIHQtPm93bmVyID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOwogICAgICAgYnJlYWs7CiAgIH0KIH0KIAorLyogaW5pdGlhbGl6ZXMgY2xhc3MgYWZ0ZXIgY29uc3RydWN0b3IgcHJvcGVydGllcyBhcmUgc2V0ICovCitzdGF0aWMgdm9pZAordGhyaWZ0X21lbW9yeV9idWZmZXJfY29uc3RydWN0ZWQgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CisKKyAgaWYgKHQtPmJ1ZiA9PSBOVUxMKSB7CisgICAgdC0+YnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9wYXJlbnRfY2xhc3MpLT5jb25zdHJ1Y3RlZCAob2JqZWN0KTsKK30KKwogLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCiBzdGF0aWMgdm9pZAogdGhyaWZ0X21lbW9yeV9idWZmZXJfY2xhc3NfaW5pdCAoVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MgKmNscykKQEAgLTIwOSwxNiArMjQxLDM4IEBACiAKICAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgiYnVmX3NpemUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcmVhZCBidWZmZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcmVhZC93cml0ZSBidWZmZXIgc2l6ZSBsaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODU3NiwgLyogbWF4LCAxMDI0KjEwMjQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWFVJTlQzMiwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhVSU5UMzIsIC8qIGRlZmF1bHQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CiAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwogCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfcG9pbnRlciAoImJ1ZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVybmFsIGJ1ZmZlciAoR0J5dGVBcnJheSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIGludGVybmFsIGJ1ZmZlciAoR0J5dGVBcnJheSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoIm93bmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgYnVmZmVyIG1lbW9yeSBtYW5hZ2VtZW50IHBvbGljeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB3aGV0aGVyIGludGVybmFsIGJ1ZmZlciBzaG91bGQgYmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHVucmVmZXJlbmNlZCB3aGVuIHRocmlmdF9tZW1vcnlfYnVmZmVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBmaW5hbGl6ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX09XTkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBnb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3RlZCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2NvbnN0cnVjdGVkOwogICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2ZpbmFsaXplOwogICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9pc19vcGVuOwogICB0dGMtPm9wZW4gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9vcGVuOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmgKaW5kZXggNGViZTk4Zi4uZDVkNDdiMyAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oCkBAIC01MSw2ICs1MSw3IEBACiAgIC8qIHByaXZhdGUgKi8KICAgR0J5dGVBcnJheSAqYnVmOwogICBndWludDMyIGJ1Zl9zaXplOworICBnYm9vbGVhbiBvd25lcjsKIH07CiAKIHR5cGVkZWYgc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXJDbGFzcyBUaHJpZnRNZW1vcnlCdWZmZXJDbGFzczsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGU2MGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIGNsYW5nLWZvcm1hdCBvZmYgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8KKyMgIGRlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8KKworI2lmZGVmIF9XSU4zMgorIyAgZGVmaW5lIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIDo6V1NBR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBUSFJJRlRfRVJSTk8gKCpfZXJybm8oKSkKKyMgIGRlZmluZSBUSFJJRlRfRUlOUFJPR1JFU1MgV1NBRUlOUFJPR1JFU1MKKyMgIGRlZmluZSBUSFJJRlRfRUFHQUlOIFdTQUVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VJTlRSIFdTQUVJTlRSCisjICBkZWZpbmUgVEhSSUZUX0VDT05OUkVTRVQgV1NBRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9FTk9UQ09OTiBXU0FFTk9UQ09OTgorIyAgZGVmaW5lIFRIUklGVF9FVElNRURPVVQgV1NBRVRJTUVET1VUCisjICBkZWZpbmUgVEhSSUZUX0VXT1VMREJMT0NLIFdTQUVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VQSVBFIFdTQUVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgU09fRVhDTFVTSVZFQUREUlVTRQorIyAgZGVmaW5lIFRIUklGVF9JTlZBTElEX1NPQ0tFVCBJTlZBTElEX1NPQ0tFVAorIyAgZGVmaW5lIFRIUklGVF9TT0NLRVRQQUlSIHRocmlmdF9zb2NrZXRwYWlyCisjICBkZWZpbmUgVEhSSUZUX0ZDTlRMIHRocmlmdF9mY250bAorIyAgZGVmaW5lIFRIUklGVF9PX05PTkJMT0NLIDEKKyMgIGRlZmluZSBUSFJJRlRfRl9HRVRGTCAwCisjICBkZWZpbmUgVEhSSUZUX0ZfU0VURkwgMQorIyAgZGVmaW5lIFRIUklGVF9HRVRUSU1FT0ZEQVkgdGhyaWZ0X2dldHRpbWVvZmRheQorIyAgZGVmaW5lIFRIUklGVF9DTE9TRVNPQ0tFVCBjbG9zZXNvY2tldAorIyAgZGVmaW5lIFRIUklGVF9DTE9TRSBfY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfT1BFTiBfb3BlbgorIyAgZGVmaW5lIFRIUklGVF9GVFJVTkNBVEUgX2Noc2l6ZV9zCisjICBkZWZpbmUgVEhSSUZUX0ZTWU5DIF9jb21taXQKKyMgIGRlZmluZSBUSFJJRlRfTFNFRUsgX2xzZWVrCisjICBkZWZpbmUgVEhSSUZUX1dSSVRFIF93cml0ZQorIyAgZGVmaW5lIFRIUklGVF9SRUFEIF9yZWFkCisjICBkZWZpbmUgVEhSSUZUX0ZTVEFUIF9mc3RhdAorIyAgZGVmaW5lIFRIUklGVF9TVEFUIF9zdGF0CisjICBpZmRlZiBfV0lOMzJfV0NFCisjICAgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SKC4uLikgdGhyaWZ0X3dzdHIyc3RyKGdhaV9zdHJlcnJvclcoX19WQV9BUkdTX18pKQorIyAgZWxzZQorIyAgICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiBnYWlfc3RyZXJyb3JBCisjICBlbmRpZgorIyAgZGVmaW5lIFRIUklGVF9TU0laRVQgcHRyZGlmZl90CisjICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIF9zbnByaW50ZgorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9TRUMgdGhyaWZ0X3NsZWVwCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1VTRUMgdGhyaWZ0X3VzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9USU1FU1BFQyB0aHJpZnRfdGltZXNwZWMKKyMgIGRlZmluZSBUSFJJRlRfQ1RJTUVfUiB0aHJpZnRfY3RpbWVfcgorIyAgZGVmaW5lIFRIUklGVF9QT0xMIHRocmlmdF9wb2xsCisjICBpZiBXSU5WRVIgPD0gMHgwNTAyIC8qIFhQLCBTZXJ2ZXIyMDAzICovCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTEZEICB0aHJpZnRfcG9sbGZkCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTElOICAweDAzMDAKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIDB4MDAxMAorIyAgZWxzZSAvKiBWaXN0YSwgV2luNy4uLiAqLworIyAgICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgcG9sbGZkCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTElOICBQT0xMSU4KKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIFBPTExPVVQKKyMgIGVuZGlmIC8qIFdJTlZFUiAqLworIyAgZGVmaW5lIFRIUklGVF9TSFVUX1JEV1IgU0RfQk9USAorI2Vsc2UgLyogbm90IF9XSU4zMiAqLworIyAgaW5jbHVkZSA8ZXJybm8uaD4KKyMgIGRlZmluZSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiBlcnJubworIyAgZGVmaW5lIFRIUklGVF9FUlJOTyBlcnJubworIyAgZGVmaW5lIFRIUklGVF9FSU5UUiAgICAgICBFSU5UUgorIyAgZGVmaW5lIFRIUklGVF9FSU5QUk9HUkVTUyBFSU5QUk9HUkVTUworIyAgZGVmaW5lIFRIUklGVF9FQ09OTlJFU0VUICBFQ09OTlJFU0VUCisjICBkZWZpbmUgVEhSSUZUX0VOT1RDT05OICAgIEVOT1RDT05OCisjICBkZWZpbmUgVEhSSUZUX0VUSU1FRE9VVCAgIEVUSU1FRE9VVAorIyAgZGVmaW5lIFRIUklGVF9FV09VTERCTE9DSyBFV09VTERCTE9DSworIyAgZGVmaW5lIFRIUklGVF9FQUdBSU4gICAgICBFQUdBSU4KKyMgIGRlZmluZSBUSFJJRlRfRVBJUEUgICAgICAgRVBJUEUKKyMgIGRlZmluZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgU09fUkVVU0VBRERSCisjICBkZWZpbmUgVEhSSUZUX0lOVkFMSURfU09DS0VUICgtMSkKKyMgIGRlZmluZSBUSFJJRlRfU09DS0VUUEFJUiBzb2NrZXRwYWlyCisjICBkZWZpbmUgVEhSSUZUX0ZDTlRMIGZjbnRsCisjICBkZWZpbmUgVEhSSUZUX09fTk9OQkxPQ0sgT19OT05CTE9DSworIyAgZGVmaW5lIFRIUklGVF9GX0dFVEZMIEZfR0VURkwKKyMgIGRlZmluZSBUSFJJRlRfRl9TRVRGTCBGX1NFVEZMCisjICBkZWZpbmUgVEhSSUZUX0dFVFRJTUVPRkRBWSBnZXR0aW1lb2ZkYXkKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0VTT0NLRVQgY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0UgY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfT1BFTiBvcGVuCisjICBkZWZpbmUgVEhSSUZUX0ZUUlVOQ0FURSBmdHJ1bmNhdGUKKyMgIGRlZmluZSBUSFJJRlRfRlNZTkMgZnN5bmMKKyMgIGRlZmluZSBUSFJJRlRfTFNFRUsgbHNlZWsKKyMgIGRlZmluZSBUSFJJRlRfV1JJVEUgd3JpdGUKKyMgIGRlZmluZSBUSFJJRlRfUkVBRCByZWFkCisjICBkZWZpbmUgVEhSSUZUX1NUQVQgc3RhdAorIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBmc3RhdAorIyAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IgZ2FpX3N0cmVycm9yCisjICBkZWZpbmUgVEhSSUZUX1NTSVpFVCBzc2l6ZV90CisjICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIHNucHJpbnRmCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1NFQyBzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9VU0VDIHVzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9USU1FU1BFQyB0aW1lc3BlYworIyAgZGVmaW5lIFRIUklGVF9DVElNRV9SIGN0aW1lX3IKKyMgIGRlZmluZSBUSFJJRlRfUE9MTCBwb2xsCisjICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgcG9sbGZkCisjICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgUE9MTElOCisjICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgUE9MTE9VVAorIyAgZGVmaW5lIFRIUklGVF9TSFVUX1JEV1IgU0hVVF9SRFdSCisjZW5kaWYKKworI2VuZGlmIC8qIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXyAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMKaW5kZXggOTdhMGVjMi4uNmVhODk3YyAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYworKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCkBAIC00Miw5ICs0Miw2IEBACiAvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCiAjZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0RPTUFJTiAidGhyaWZ0LXNlcnZlci1zb2NrZXQtZXJyb3ItcXVhcmsiCiAKLS8qIGZvciBlcnJvcnMgY29taW5nIGZyb20gc29ja2V0KCkgYW5kIGNvbm5lY3QoKSAqLwotZXh0ZXJuIGludCBlcnJubzsKLQogR19ERUZJTkVfVFlQRShUaHJpZnRTZXJ2ZXJTb2NrZXQsIHRocmlmdF9zZXJ2ZXJfc29ja2V0LCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUKQogCiBnYm9vbGVhbgpAQCAtMjI3LDEyICsyMjQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCAoY29uc3RydWN0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcG9ydCB0byBsaXN0ZW4gdG8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM0LCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNSwgLyogbWF4ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTA5MCwgLyogZGVmYXVsdCBieSBjb252ZW50aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwogICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwogCiAgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoImJhY2tsb2ciLApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgKaW5kZXggZjA3MmNiMC4uZmQwNDk1NCAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oCkBAIC00OSw3ICs0OSw3IEBACiAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCBwYXJlbnQ7CiAKICAgLyogcHJpdmF0ZSAqLwotICBnc2hvcnQgcG9ydDsKKyAgZ3VpbnQgcG9ydDsKICAgZ3Nob3J0IGJhY2tsb2c7CiAgIGludCBzZDsKICAgZ3VpbnQ4ICpidWY7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMKaW5kZXggMWMxNDdlYy4uNTYwYzI0ZSAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYwpAQCAtMzcsOSArMzcsNiBAQAogICBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVAogfTsKIAotLyogZm9yIGVycm9ycyBjb21pbmcgZnJvbSBzb2NrZXQoKSBhbmQgY29ubmVjdCgpICovCi1leHRlcm4gaW50IGVycm5vOwotCiBHX0RFRklORV9UWVBFKFRocmlmdFNvY2tldCwgdGhyaWZ0X3NvY2tldCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQogCiAvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLwpAQCAtOTgsNiArOTUsMjUgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBpZiAoY2xvc2UgKHNvY2tldC0+c2QpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0NMT1NFLAorICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGNsb3NlIHNvY2tldCAtICVzIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzb2NrZXQtPnNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICByZXR1cm4gVFJVRTsKK30KKwogLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KIGdib29sZWFuCiB0aHJpZnRfc29ja2V0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKQEAgLTEzMSw4ICsxNDcsOCBAQAogICAvKiBjcmVhdGUgYSBzb2NrZXQgc3RydWN0dXJlICovCiAgIG1lbXNldCAoJnBpbiwgMCwgc2l6ZW9mKHBpbikpOwogICBwaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gIHBpbi5zaW5fYWRkci5zX2FkZHIgPSAoKHN0cnVjdCBpbl9hZGRyICopIChocC0+aF9hZGRyKSktPnNfYWRkcjsKLSAgcGluLnNpbl9wb3J0ID0gaHRvbnMgKHRzb2NrZXQtPnBvcnQpOyAKKyAgcGluLnNpbl9hZGRyLnNfYWRkciA9ICgoc3RydWN0IGluX2FkZHIgKikgKGhwLT5oX2FkZHJfbGlzdFswXSkpLT5zX2FkZHI7CisgIHBpbi5zaW5fcG9ydCA9IGh0b25zICh0c29ja2V0LT5wb3J0KTsKIAogICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLwogICBpZiAoKHRzb2NrZXQtPnNkID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKQpAQCAtMTQ3LDcgKzE2Myw4IEBACiAgIC8qIG9wZW4gYSBjb25uZWN0aW9uICovCiAgIGlmIChjb25uZWN0ICh0c29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmcGluLCBzaXplb2YocGluKSkgPT0gLTEpCiAgIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ09OTkVDVCwKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DT05ORUNULAogICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNvbm5lY3QgdG8gaG9zdCAlczolZCAtICVzIiwKICAgICAgICAgICAgICAgICAgdHNvY2tldC0+aG9zdG5hbWUsIHRzb2NrZXQtPnBvcnQsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMTU2LDIzICsxNzMsNiBAQAogICByZXR1cm4gVFJVRTsKIH0KIAotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCi1nYm9vbGVhbgotdGhyaWZ0X3NvY2tldF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7Ci0KLSAgaWYgKGNsb3NlIChzb2NrZXQtPnNkKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DTE9TRSwKLSAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBjbG9zZSBzb2NrZXQgLSAlcyIsCi0gICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgc29ja2V0LT5zZCA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKLSAgcmV0dXJuIFRSVUU7Ci19CiAKIC8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCiBnaW50MzIKQEAgLTIxMyw3ICsyMTMsNyBAQAogCiAvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KIGdib29sZWFuCi10aHJpZnRfc29ja2V0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLCAgICAgCit0aHJpZnRfc29ja2V0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQogewogICBnaW50IHJldCA9IDA7CkBAIC0zMTgsNiArMzE4LDkgQEAKICAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKICAgewogICAgIGNhc2UgUFJPUF9USFJJRlRfU09DS0VUX0hPU1ROQU1FOgorICAgICAgaWYgKHNvY2tldC0+aG9zdG5hbWUpIHsKKyAgICAgICAgZ19mcmVlKHNvY2tldC0+aG9zdG5hbWUpOworICAgICAgfQogICAgICAgc29ja2V0LT5ob3N0bmFtZSA9IGdfc3RyZHVwIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFBST1BfVEhSSUZUX1NPQ0tFVF9QT1JUOgpAQCAtMzUwLDggKzM1Myw4IEBACiAgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoInBvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IChjb25zdHJ1Y3QpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBwb3J0IG9mIHRoZSByZW1vdGUgaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU1MzQsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNXUsIC8qIG1heCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwOTAsIC8qIGRlZmF1bHQgYnkgY29udmVudGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaAppbmRleCA5ODE1NzdkLi4yZjZmNjdkIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmgKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oCkBAIC01MCwxMSArNTAsOCBAQAogCiAgIC8qIHByaXZhdGUgKi8KICAgZ2NoYXIgKmhvc3RuYW1lOwotICBnc2hvcnQgcG9ydDsKKyAgZ3VpbnQgcG9ydDsKICAgaW50IHNkOwotICBndWludDggKmJ1ZjsKLSAgZ3VpbnQzMiBidWZfc2l6ZTsKLSAgZ3VpbnQzMiBidWZfbGVuOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNvY2tldENsYXNzIFRocmlmdFNvY2tldENsYXNzOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxN2ZhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMKQEAgLTAsMCArMSw4MDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaD4KKworCisjaWYgZGVmaW5lZChXSU4zMikKKyNkZWZpbmUgTVVURVhfVFlQRSAgICAgICAgICAgIEhBTkRMRQorI2RlZmluZSBNVVRFWF9TRVRVUCh4KSAgICAgICAgKHgpID0gQ3JlYXRlTXV0ZXgoTlVMTCwgRkFMU0UsIE5VTEwpCisjZGVmaW5lIE1VVEVYX0NMRUFOVVAoeCkgICAgICBDbG9zZUhhbmRsZSh4KQorI2RlZmluZSBNVVRFWF9MT0NLKHgpICAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdCgoeCksIElORklOSVRFKQorI2RlZmluZSBNVVRFWF9VTkxPQ0soeCkgICAgICAgUmVsZWFzZU11dGV4KHgpCisjZWxzZQorI2RlZmluZSBNVVRFWF9UWVBFICAgICAgICAgICAgcHRocmVhZF9tdXRleF90CisjZGVmaW5lIE1VVEVYX1NFVFVQKHgpICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJih4KSwgTlVMTCkKKyNkZWZpbmUgTVVURVhfQ0xFQU5VUCh4KSAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmKHgpKQorI2RlZmluZSBNVVRFWF9MT0NLKHgpICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCYoeCkpCisjZGVmaW5lIE1VVEVYX1VOTE9DSyh4KSAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmKHgpKQorI2VuZGlmCisKKyNkZWZpbmUgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRCAweDEwMDAwMDAwTAorCisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRTU0xTb2NrZXRQcm9wZXJ0aWVzCit7CisgIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVCA9IDMsCisgIFBST1BfVEhSSUZUX1NTTF9TRUxGX1NJR05FRAorfTsKKworLyogVG8gaG9sZCBhIGdsb2JhbCBzdGF0ZSBtYW5hZ2VtZW50IG9mIG9wZW5zc2wgZm9yIGFsbCBpbnN0YW5jZXMgKi8KK3N0YXRpYyBnYm9vbGVhbiB0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkPUZBTFNFOworLyogVGhpcyBhcnJheSB3aWxsIHN0b3JlIGFsbCBvZiB0aGUgbXV0ZXhlcyBhdmFpbGFibGUgdG8gT3BlblNTTC4gKi8KK3N0YXRpYyBNVVRFWF9UWVBFICp0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmPU5VTEw7CisKKworLyoqCisgKiBPcGVuU1NMIHVuaXEgaWQgZnVuY3Rpb24uCisgKgorICogQHJldHVybiAgICB0aHJlYWQgaWQKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX2lkX2Z1bmN0aW9uKHZvaWQpCit7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgcmV0dXJuIEdldEN1cnJlbnRUaHJlYWRJZCgpOworI2Vsc2UKKyAgcmV0dXJuICgodW5zaWduZWQgbG9uZykgcHRocmVhZF9zZWxmKCkpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19sb2NraW5nX2NhbGxiYWNrKGludCBtb2RlLCBpbnQgbiwgY29uc3QgY2hhciogdW5rLCBpbnQgaWQpIHsKKyAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykKKyAgICBNVVRFWF9MT0NLKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbbl0pOworICBlbHNlCisgICAgTVVURVhfVU5MT0NLKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbbl0pOworfQorCitzdGF0aWMgaW50IHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY190aHJlYWRfc2V0dXAodm9pZCkKK3sKKyAgaW50IGk7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZiA9IG1hbGxvYyhDUllQVE9fbnVtX2xvY2tzKCkgKiBzaXplb2YoTVVURVhfVFlQRSkpOworICBpZiAoIXRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYpCisgICAgcmV0dXJuIDA7CisgIGZvciAoaSA9IDA7ICBpIDwgQ1JZUFRPX251bV9sb2NrcyggICk7ICBpKyspCisgICAgTVVURVhfU0VUVVAodGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZltpXSk7CisgIENSWVBUT19zZXRfaWRfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX2lkX2Z1bmN0aW9uKTsKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19sb2NraW5nX2NhbGxiYWNrKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX3RocmVhZF9jbGVhbnVwKHZvaWQpCit7CisgIGludCBpOworICBpZiAoIXRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYpCisgICAgcmV0dXJuIDA7CisgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soTlVMTCk7CisgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhOVUxMKTsKKyAgZm9yIChpID0gMDsgIGkgPCBDUllQVE9fbnVtX2xvY2tzKCAgKTsgIGkrKykKKyAgICBNVVRFWF9DTEVBTlVQKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbaV0pOworICBmcmVlKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYpOworICB0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmID0gTlVMTDsKKyAgcmV0dXJuIDE7Cit9CisKKy8qCitzdGF0aWMgdm9pZCogdGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY3JlYXRlX2NhbGxiYWNrKGNvbnN0IGNoYXIqIHVuaywgaW50IGlkKSB7CisgIGdfcHJpbnQoIldlIHNob3VsZCBjcmVhdGUgYSBsb2NrXG4iKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2NhbGxiYWNrKGludCBtb2RlLCB2b2lkKiBsb2NrLCBjb25zdCBjaGFyKiB1bmssIGludCBpZCkgeworICBpZiAobG9jayAhPSBOVUxMKSB7CisgICAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgeworICAgICAgZ19wcmludGYoIldlIHNob3VsZCBsb2NrIHRocmVhZCAlZFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdfcHJpbnRmKCJXZSBzaG91bGQgdW5sb2NrIHRocmVhZCAlZFxuIik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sodm9pZCogbG9jaywgY29uc3QgY2hhciogdW5rLCBpbnQgaWQpIHsKKyAgZ19wcmludGYoIldlIG11c3QgZGVzdHJveSB0aGUgbG9ja1xuIik7Cit9CisgKi8KKworCitHX0RFRklORV9UWVBFKFRocmlmdFNTTFNvY2tldCwgdGhyaWZ0X3NzbF9zb2NrZXQsIFRIUklGVF9UWVBFX1NPQ0tFVCkKKworCisKKy8qKgorICogV2hlbiB0aGVyZSdzIGEgdGhyZWFkIGNvbnRleHQgYXR0YWNoZWQsIHdlIHBhc3MgdGhlIFNTTCBzb2NrZXQgY29udGV4dCBzbyBpdAorICogY2FuIGNoZWNrIGlmIHRoZSBlcnJvciBpcyBvdXRzaWRlIFNTTCwgb24gSS9PIGZvciBleGFtcGxlCisgKiBAcGFyYW0gc29ja2V0CisgKiBAcGFyYW0gZXJyb3JfbXNnCisgKiBAcGFyYW0gdGhyaWZ0X2Vycm9yX25vCisgKiBAcGFyYW0gc3NsX2Vycm9yCisgKiBAcGFyYW0gZXJyb3IKKyAqLworc3RhdGljCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3IoVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQsIGNvbnN0IGd1Y2hhciAqZXJyb3JfbXNnLCBndWludCB0aHJpZnRfZXJyb3Jfbm8sIGludCBzc2xfZXJyb3IsIEdFcnJvciAqKmVycm9yKQoreworICB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGU7CisgIGNoYXIgYnVmZmVyWzEwMjRdOworICBpbnQgYnVmZmVyX3NpemU9MTAyNDsKKyAgZ2Jvb2xlYW4gZmlyc3RfZXJyb3IgPSBUUlVFOworICBpbnQgc3NsX2Vycm9yX3R5cGUgPSBTU0xfZ2V0X2Vycm9yKHNvY2tldC0+c3NsLCBzc2xfZXJyb3IpOworICBpZihzc2xfZXJyb3JfdHlwZT4wKXsKKyAgICAgIHN3aXRjaChzc2xfZXJyb3JfdHlwZSl7CisJY2FzZSBTU0xfRVJST1JfU1NMOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICJTU0wgJXM6ICIsIGVycm9yX21zZyk7CisJICB3aGlsZSAoKGVycm9yX2NvZGUgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDAgJiYgYnVmZmVyX3NpemU+MSkgeworCSAgICAgIGNvbnN0IGNoYXIqIHJlYXNvbiA9IEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKGVycm9yX2NvZGUpOworCSAgICAgIGlmKHJlYXNvbiE9TlVMTCl7CisJCSAgaWYoIWZpcnN0X2Vycm9yKSB7CisJCSAgICAgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIlxuXHQiKTsKKwkJICAgICAgZmlyc3RfZXJyb3I9RkFMU0U7CisJCSAgfQorCQkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCglcykgLT4gJXMiLCBlcnJvcl9jb2RlLCByZWFzb24sIFNTTF9zdGF0ZV9zdHJpbmcoc29ja2V0LT5zc2wpKTsKKwkgICAgICB9CisJICB9CisJICBicmVhazsKKwljYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlczogIiwgZXJyb3JfbXNnKTsKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCAtPiAlcyIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCSAgYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlczogIiwgZXJyb3JfbXNnKTsKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCAtPiAlcyIsIHNzbF9lcnJvcl90eXBlLCAiRXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIHVuZGVybGF5aW5nIGxheWVyIik7CisJICBicmVhazsKKwljYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlczogIiwgZXJyb3JfbXNnKTsKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCAtPiAlcyIsIHNzbF9lcnJvcl90eXBlLCAiRXJyb3Igd2hpbGUgd3JpdHRpbmcgdG8gdW5kZXJsYXlpbmcgbGF5ZXIiKTsKKwkgIGJyZWFrOworCisgICAgICB9CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgIHRocmlmdF9lcnJvcl9ubywgIiVzIiwgYnVmZmVyKTsKKyAgfQorfQorCisvKioKKyAqIEZvciBnbG9iYWwgU1NMIGVycm9ycworICogQHBhcmFtIGVycm9yX21zZworICogQHBhcmFtIHRocmlmdF9lcnJvcl9ubworICogQHBhcmFtIGVycm9yCisgKi8KK3N0YXRpYwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9nZXRfZXJyb3IoY29uc3QgZ3VjaGFyICplcnJvcl9tc2csIGd1aW50IHRocmlmdF9lcnJvcl9ubywgR0Vycm9yICoqZXJyb3IpCit7CisgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKKyAgd2hpbGUgKChlcnJvcl9jb2RlID0gRVJSX2dldF9lcnJvcigpKSAhPSAwKSB7CisgICAgICBjb25zdCBjaGFyKiByZWFzb24gPSBFUlJfcmVhc29uX2Vycm9yX3N0cmluZyhlcnJvcl9jb2RlKTsKKyAgICAgIGlmIChyZWFzb24gPT0gTlVMTCkgeworCSAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICAgICAgdGhyaWZ0X2Vycm9yX25vLAorCQkgICAgICAgIlNTTCBlcnJvciAlbFg6ICVzIiwgZXJyb3JfY29kZSwgZXJyb3JfbXNnKTsKKyAgICAgIH1lbHNleworCSAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICAgICAgdGhyaWZ0X2Vycm9yX25vLAorCQkgICAgICAgIlNTTCBlcnJvciAlbFggJXM6ICVzIiwgZXJyb3JfY29kZSxyZWFzb24sIGVycm9yX21zZyk7CisgICAgICB9CisgIH0KK30KKworCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIHJldHVybiB0aHJpZnRfc29ja2V0X2lzX29wZW4odHJhbnNwb3J0KTsKK30KKworLyogb3ZlcnJpZGVzIHRocmlmdF90cmFuc3BvcnRfcGVlayAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBpZiAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSkKKyAgICB7CisgICAgICBpbnQgcmM7CisgICAgICBnY2hhciBieXRlOworICAgICAgcmMgPSBTU0xfcGVlayhzc2xfc29ja2V0LT5zc2wsICZieXRlLCAxKTsKKyAgICAgIGlmIChyYyA8IDApIHsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIkNoZWNrIHNvY2tldCBkYXRhIiwKKwkJCQkJICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsIHJjLCBlcnJvcik7CisgICAgICB9CisgICAgICBpZiAocmMgPT0gMCkgeworCSAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgICB9CisgICAgICByZXR2YWwgPSAocmMgPiAwKTsKKyAgICB9CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBFUlJfY2xlYXJfZXJyb3IoKTsKKworICBpZiAoIXRocmlmdF9zb2NrZXRfb3Blbih0cmFuc3BvcnQsIGVycm9yKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCFUSFJJRlRfU1NMX1NPQ0tFVF9HRVRfQ0xBU1ModHJhbnNwb3J0KS0+aGFuZGxlX2hhbmRzaGFrZSh0cmFuc3BvcnQsIGVycm9yKSkgeworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBnYm9vbGVhbiByZXR2YWwgPSBGQUxTRTsKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQodHJhbnNwb3J0KTsKKyAgaWYoc3NsX3NvY2tldCE9TlVMTCAmJiBzc2xfc29ja2V0LT5zc2wpIHsKKyAgICAgIGludCByYyA9IFNTTF9zaHV0ZG93bihzc2xfc29ja2V0LT5zc2wpOworLyogICAgICBpZiAocmMgPCAwKSB7CisJICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTDsKKyAgICAgIH0qLworICAgICAgU1NMX2ZyZWUoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIHNzbF9zb2NrZXQtPnNzbCA9IE5VTEw7CisgICAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICB9CisgIHJldHVybiB0aHJpZnRfc29ja2V0X2Nsb3NlKHRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLworZ2ludDMyCit0aHJpZnRfc3NsX3NvY2tldF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorCQkJZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBndWludCBtYXhSZWN2UmV0cmllc18gPSAxMDsKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGd1aW50IGJ5dGVzID0gMDsKKyAgZ3VpbnQgcmV0cmllcyA9IDA7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUICYmIHNzbF9zb2NrZXQtPnNzbCE9TlVMTCwgRkFMU0UpOworCisgIGZvciAocmV0cmllcz0wOyByZXRyaWVzIDwgbWF4UmVjdlJldHJpZXNfOyByZXRyaWVzKyspIHsKKyAgICAgIGJ5dGVzID0gU1NMX3JlYWQoc3NsX3NvY2tldC0+c3NsLCBidWYsIGxlbik7CisgICAgICBpZiAoYnl0ZXMgPj0gMCkKKwlicmVhazsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpZiAoU1NMX2dldF9lcnJvcihzc2xfc29ja2V0LT5zc2wsIGJ5dGVzKSA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgeworCSAgaWYgKEVSUl9nZXRfZXJyb3IoKSA9PSAwICYmIGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSKSB7CisJICAgICAgY29udGludWU7CisJICB9CisgICAgICB9ZWxzZXsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIlJlY2VpdmUgZXJyb3IiLAorCQkJCQkgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTCwgYnl0ZXMsIGVycm9yKTsKKworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBieXRlczsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCisJCQkgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ2ludCByZXQgPSAwOworICBndWludCBzZW50ID0gMDsKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgJiYgc3NsX3NvY2tldC0+c3NsIT1OVUxMLCBGQUxTRSk7CisKKyAgd2hpbGUgKHNlbnQgPCBsZW4pCisgICAgeworICAgICAgcmV0ID0gU1NMX3dyaXRlIChzc2xfc29ja2V0LT5zc2wsIChndWludDggKilidWYgKyBzZW50LCBsZW4gLSBzZW50KTsKKyAgICAgIGlmIChyZXQgPCAwKQorCXsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIlNlbmQgZXJyb3IiLAorCQkJCQkgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTCwgcmV0LCBlcnJvcik7CisJICByZXR1cm4gRkFMU0U7CisJfQorICAgICAgc2VudCArPSByZXQ7CisgICAgfQorCisgIHJldHVybiBzZW50PT1sZW47Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoCisgKiBmbHVzaCBwZW5kaW5nIGRhdGEuICBzaW5jZSB3ZSBhcmUgbm90IGJ1ZmZlcmVkLCB0aGlzIGlzIGEgbm8tb3AgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCAmJiBzc2xfc29ja2V0LT5zc2whPU5VTEwsIEZBTFNFKTsKKworICBCSU8qIGJpbyA9IFNTTF9nZXRfd2Jpbyhzc2xfc29ja2V0LT5zc2wpOworICBpZiAoYmlvID09IE5VTEwpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAorCQkgICAiZmFpbGVkIHRvIGZsdXNoLCB3YmlvIHJldHVybmVkIG51bGwiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoQklPX2ZsdXNoKGJpbykgIT0gMSkgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisJCSAgICJmYWlsZWQgdG8gZmx1c2ggaXQgcmV0dXJuZWQgZXJyb3IiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfaGFuZGxlX2hhbmRzaGFrZShUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpLCBGQUxTRSk7CisKKyAgaWYoVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKHNzbF9zb2NrZXQpLT5jcmVhdGVfc3NsX2NvbnRleHQodHJhbnNwb3J0LCBlcnJvcikpeworICAgICAgLypDb250ZXh0IGNyZWF0ZWQqLworICAgICAgU1NMX3NldF9mZChzc2xfc29ja2V0LT5zc2wsIHNvY2tldC0+c2QpOworICAgICAgaW50IHJjOworICAgICAgaWYoc3NsX3NvY2tldC0+c2VydmVyKXsKKwkgIHJjID0gU1NMX2FjY2VwdChzc2xfc29ja2V0LT5zc2wpOworICAgICAgfWVsc2V7CisJICByYyA9IFNTTF9jb25uZWN0KHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICB9CisgICAgICBpZiAocmMgPD0gMCkgeworCSAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3NzbF9lcnJvcihzc2xfc29ja2V0LCAiRXJyb3Igd2hpbGUgY29ubmVjdC9iaW5kIiwgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ09OTkVDVF9CSU5ELCByYywgZXJyb3IpOworCSAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9ZWxzZQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gdGhyaWZ0X3NzbF9zb2NrZXRfYXV0aG9yaXplKHRyYW5zcG9ydCwgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfY3JlYXRlX3NzbF9jb250ZXh0KFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgaWYoc29ja2V0LT5jdHghPU5VTEwpeworICAgICAgaWYoc29ja2V0LT5zc2whPU5VTEwpIHsKKwkgIHJldHVybiBUUlVFOworICAgICAgfQorCisgICAgICBzb2NrZXQtPnNzbCA9IFNTTF9uZXcoc29ja2V0LT5jdHgpOworICAgICAgaWYgKHNvY2tldC0+c3NsID09IE5VTEwpIHsKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgICAgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1RSQU5TUE9SVCwKKwkJICAgICAgICJVbmFibGUgdG8gY3JlYXRlIGRlZmF1bHQgU1NMIGNvbnRleHQiKTsKKwkgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKK2dib29sZWFuIHRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fZmlsZShUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKK3sKKyAgY2hhciBlcnJvcl9idWZmZXJbMjU1XTsKKyAgaWYgKCF0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkKSB7CisgICAgICBnX2Vycm9yKCJPcGVuU1NMIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgcmMgPSBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzc2xfc29ja2V0LT5jdHgsIGZpbGVfbmFtZSwgTlVMTCk7CisgIGlmIChyYyAhPSAxKSB7IC8qdmVyaWZ5IGF1dGhlbnRpY2F0aW9uIHJlc3VsdCovCisgICAgICBFUlJfZXJyb3Jfc3RyaW5nX24oRVJSX2dldF9lcnJvcigpLCBlcnJvcl9idWZmZXIsIDI1NCk7CisgICAgICBnX3dhcm5pbmcoIkxvYWQgb2YgY2VydGlmaWNhdGVzIGZhaWxlZDogJXMhIiwgZXJyb3JfYnVmZmVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitnYm9vbGVhbiB0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2J1ZmZlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgY2hhaW5fY2VydHNbXSkKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIC8qIExvYWQgY2hhaW4gb2YgY2VydHMqLworICBYNTA5ICpjYWNlcnQ9TlVMTDsKKyAgQklPICptZW0gPSBCSU9fbmV3X21lbV9idWYoY2hhaW5fY2VydHMsc3RybGVuKGNoYWluX2NlcnRzKSk7CisgIFg1MDlfU1RPUkUgKmNlcnRfc3RvcmUgPSBTU0xfQ1RYX2dldF9jZXJ0X3N0b3JlKHNzbF9zb2NrZXQtPmN0eCk7CisKKyAgaWYoY2VydF9zdG9yZSE9TlVMTCl7CisgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgd2hpbGUgKChjYWNlcnQgPSBQRU1fcmVhZF9iaW9fWDUwOShtZW0sIE5VTEwsIDAsIE5VTEwpKSE9TlVMTCkgeworCSAgaWYoY2FjZXJ0KSB7CisJICAgICAgWDUwOV9TVE9SRV9hZGRfY2VydChjZXJ0X3N0b3JlLCBjYWNlcnQpOworCSAgICAgIFg1MDlfZnJlZShjYWNlcnQpOworCSAgICAgIGNhY2VydD1OVUxMOworCSAgfSAvKiBGcmVlIGltbWVkaWF0ZWx5ICovCisJICBpbmRleCsrOworICAgICAgfQorICAgICAgcmV0dmFsPVRSVUU7CisgIH0KKyAgQklPX2ZyZWUobWVtKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2F1dGhvcml6ZShUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBUaHJpZnRTU0xTb2NrZXRDbGFzcyAqY2xzID0gVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKHNzbF9zb2NrZXQpOworICBnYm9vbGVhbiBhdXRob3JpemF0aW9uX3Jlc3VsdCA9IEZBTFNFOworCisgIGlmKGNscyE9TlVMTCAmJiBzc2xfc29ja2V0LT5zc2whPU5VTEwpeworICAgICAgaW50IHJjID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICBpZiAocmMgIT0gWDUwOV9WX09LKSB7IC8qIHZlcmlmeSBhdXRoZW50aWNhdGlvbiByZXN1bHQgKi8KKwkgIGlmIChyYyA9PSBYNTA5X1ZfRVJSX0RFUFRIX1pFUk9fU0VMRl9TSUdORURfQ0VSVCAmJiBzc2xfc29ja2V0LT5hbGxvd19zZWxmc2lnbmVkKSB7CisJICAgICAgZ19kZWJ1ZygiVGhlIGNlcnRpZmljYXRlIGlzIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgYW5kIGNvbmZpZ3VyYXRpb24gYWxsb3dzIGl0Iik7CisJICB9IGVsc2UgeworCSAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJCSAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCQkgICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0xfQ0VSVF9WQUxJREFUSU9OX0ZBSUxFRCwKKwkJCSAgICJUaGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGZhaWxlZDogJXMgKCVkKSIsIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKHJjKSwgcmMpOworCSAgICAgIHJldHVybiBGQUxTRTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgWDUwOSogY2VydCA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzc2xfc29ja2V0LT5zc2wpOworICAgICAgaWYgKGNlcnQgPT0gTlVMTCkgeworCSAgaWYgKFNTTF9nZXRfdmVyaWZ5X21vZGUoc3NsX3NvY2tldC0+c3NsKSAmIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpIHsKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkJICAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMX0NFUlRfVkFMSURBVElPTl9GQUlMRUQsCisJCQkgICAiTm8gY2VydGlmaWNhdGUgcHJlc2VudC4gQXJlIHlvdSBjb25uZWN0aW5nIFNTTCBzZXJ2ZXI/Iik7CisJICAgICAgcmV0dXJuIEZBTFNFOworCSAgfQorCSAgZ19kZWJ1ZygiTm8gY2VydGlmaWNhdGUgcmVxdWlyZWQiKTsKKwkgIHJldHVybiBUUlVFOworICAgICAgfQorCisgICAgICAvKiBjZXJ0aWZpY2F0ZSBpcyBwcmVzZW50LCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGFjY2VzcyBtYW5hZ2VyIHdlIGFyZSBkb25lICovCisgICAgICBpZiAoY2xzLT5hdXRob3JpemVfcGVlciA9PSBOVUxMKSB7CisJICBYNTA5X2ZyZWUoY2VydCk7CisJICBnX2RlYnVnKCJDZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnV0IHdlJ3JlIG5vdCBjaGVja2luZyBpdCIpOworCSAgcmV0dXJuIFRSVUU7CisgICAgICB9IGVsc2UgeworCSAgLyogYm90aCBjZXJ0aWZpY2F0ZSBhbmQgYWNjZXNzIG1hbmFnZXIgYXJlIHByZXNlbnQgKi8KKwkgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhOworCSAgc29ja2xlbl90IHNhTGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKTsKKwkgIGlmIChnZXRwZWVybmFtZShzb2NrZXQtPnNkLCAoc3RydWN0IHNvY2thZGRyKikmc2EsICZzYUxlbmd0aCkgIT0gMCkgeworCSAgICAgIHNhLnNzX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwkgIH0KKwkgIGF1dGhvcml6YXRpb25fcmVzdWx0ID0gY2xzLT5hdXRob3JpemVfcGVlcih0cmFuc3BvcnQsIGNlcnQsICZzYSwgZXJyb3IpOworICAgICAgfQorICAgICAgaWYoY2VydCAhPSBOVUxMKSB7CisJICBYNTA5X2ZyZWUoY2VydCk7CisgICAgICB9CisgIH0KKworICByZXR1cm4gYXV0aG9yaXphdGlvbl9yZXN1bHQ7Cit9CisKKworLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfaW5pdCAoVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQpCit7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBzb2NrZXQtPnNzbCA9IE5VTEw7CisgIHNvY2tldC0+Y3R4ID0gdGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKFNTTFRMUywgJmVycm9yKTsKKyAgaWYoc29ja2V0LT5jdHggPT0gTlVMTCkgeworICAgICAgZ19pbmZvKCJUaGUgU1NMIGNvbnRleHQgd2FzIG5vdCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkIHdpdGggcHJvdG9jb2wgJWQiLCBTU0xUTFMpOworICAgICAgaWYoZXJyb3IhPU5VTEwpeworCSAgZ19pbmZvKCJSZXBvcnRlZCByZWFzb24gJXMiLCBlcnJvci0+bWVzc2FnZSk7CisJICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgIH0KKyAgfQorICBzb2NrZXQtPnNlcnZlciA9IEZBTFNFOworICBzb2NrZXQtPmFsbG93X3NlbGZzaWduZWQgPSBGQUxTRTsKKworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAob2JqZWN0KTsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworICBpZihzb2NrZXQhPU5VTEwpeworICAgICAgZ19kZWJ1ZygiSW5zdGFuY2UgJXAgZGVzdHJveWVkIiwgKHZvaWQgKilzb2NrZXQpOworICAgICAgaWYoc29ja2V0LT5zc2wgIT0gTlVMTCkKKwl7CisJICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZShUSFJJRlRfVFJBTlNQT1JUKG9iamVjdCksICZlcnJvcik7CisJICBzb2NrZXQtPnNzbD1OVUxMOworCX0KKworICAgICAgaWYoc29ja2V0LT5jdHghPU5VTEwpeworCSAgZ19kZWJ1ZygiRnJlZWluZyB0aGUgY29udGV4dCBmb3IgdGhlIGluc3RhbmNlIik7CisJICBTU0xfQ1RYX2ZyZWUoc29ja2V0LT5jdHgpOworCSAgc29ja2V0LT5jdHg9TlVMTDsKKyAgICAgIH0KKyAgfQorCisgIGlmIChHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3NzbF9zb2NrZXRfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpCisgICAgKCpHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3NzbF9zb2NrZXRfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpIChvYmplY3QpOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorCQkJCUdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUIChvYmplY3QpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVDoKKyAgICAgIGdfdmFsdWVfc2V0X3BvaW50ZXIgKHZhbHVlLCBzb2NrZXQtPmN0eCk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisJCQkJY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU1NMX1NPQ0tFVF9DT05URVhUOgorICAgICAgaWYoc29ja2V0LT5jdHghPU5VTEwpeworCSAgZ19kZWJ1ZygiRnJlZWluZyB0aGUgY29udGV4dCBzaW5jZSB3ZSBhcmUgc2V0dGluZyBhIG5ldyBvbmUiKTsKKwkgIFNTTF9DVFhfZnJlZShzb2NrZXQtPmN0eCk7CisgICAgICB9CisgICAgICBzb2NrZXQtPmN0eCA9IGdfdmFsdWVfZ2V0X3BvaW50ZXIodmFsdWUpOyAvKiBXZSBjb3B5IHRoZSBjb250ZXh0ICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgUFJPUF9USFJJRlRfU1NMX1NFTEZfU0lHTkVEOgorICAgICAgc29ja2V0LT5hbGxvd19zZWxmc2lnbmVkID0gZ192YWx1ZV9nZXRfYm9vbGVhbih2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ193YXJuaW5nKCJUcnlpbmcgdG8gc2V0IHByb3BlcnR5ICVpIHRoYXQgZG9lc24ndCBleGlzdHMhIiwgcHJvcGVydHlfaWQpOworICAgICAgLyogICAgdGhyaWZ0X3NvY2tldF9zZXRfcHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eV9pZCwgdmFsdWUsIHBzcGVjKTsgKi8KKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2luaXRpYWxpemVfb3BlbnNzbCh2b2lkKQoreworICBpZih0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkKXsKKyAgICAgIHJldHVybjsKKyAgfQorICB0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkPVRSVUU7CisgIFNTTF9saWJyYXJ5X2luaXQoKTsKKyAgRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKyAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworICBFUlJfbG9hZF9CSU9fc3RyaW5ncygpOworCisgIC8qIFNldHVwIGxvY2tpbmcgKi8KKyAgZ19kZWJ1ZygiV2Ugc2V0dXAgJWQgdGhyZWFkcyBsb2NrcyIsIHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY190aHJlYWRfc2V0dXAoKSk7CisKKyAgLyogZHluYW1pYyBsb2NraW5nCisgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY3JlYXRlX2NhbGxiYWNrKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY2FsbGJhY2spOworICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayh0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19kZXN0cm95X2NhbGxiYWNrKTsKKyAgICovCit9CisKKwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZV9vcGVuc3NsKHZvaWQpCit7CisgIGlmICghdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZCkgeworICAgICAgcmV0dXJuOworICB9CisgIHRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQgPSBGQUxTRTsKKworICBnX2RlYnVnKCJXZSBjbGVhcmVkICVkIHRocmVhZHMgbG9ja3MiLCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfdGhyZWFkX2NsZWFudXAoKSk7CisgIC8qIE5vdCBzdXBwb3J0ZWQKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soTlVMTCk7CisgICAqLworICBFUlJfZnJlZV9zdHJpbmdzKCk7CisgIEVWUF9jbGVhbnVwKCk7CisgIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CisgIEVSUl9yZW1vdmVfc3RhdGUoMCk7Cit9CisKKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfY2xhc3NfaW5pdCAoVGhyaWZ0U1NMU29ja2V0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKKworICBnX2RlYnVnKCJJbml0aWFsaXphdGlvbiBvZiBUaHJpZnRTU0xTb2NrZXRDbGFzcyIpOworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zc2xfc29ja2V0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NzbF9zb2NrZXRfc2V0X3Byb3BlcnR5OworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3BvaW50ZXIgKCJzc2xfY29udGV4dCIsCisJCQkJICAgICAiU1NMQ29udGV4dCIsCisJCQkJICAgICAiU2V0IHRoZSBTU0wgY29udGV4dCBmb3IgaGFuZHNoYWtlIHdpdGggdGhlIHJlbW90ZSBob3N0IiwKKwkJCQkgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU1NMX1NPQ0tFVF9DT05URVhULAorCQkJCSAgIHBhcmFtX3NwZWMpOworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzc2xfYWNjZXB0X3NlbGZzaWduZWQiLAorCQkJCSAgICAgIkFjY2VwdCBTZWxmIFNpZ25lZCIsCisJCQkJICAgICAiV2hldGhlciBvciBub3QgYWNjZXB0IHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlIiwKKwkJCQkgICAgIEZBTFNFLAorCQkJCSAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RIUklGVF9TU0xfU0VMRl9TSUdORUQsCisJCQkJICAgcGFyYW1fc3BlYyk7CisgIC8qIENsYXNzIG1ldGhvZHMgKi8KKyAgY2xzLT5oYW5kbGVfaGFuZHNoYWtlID0gdGhyaWZ0X3NzbF9zb2NrZXRfaGFuZGxlX2hhbmRzaGFrZTsKKyAgY2xzLT5jcmVhdGVfc3NsX2NvbnRleHQgPSB0aHJpZnRfc3NsX3NvY2tldF9jcmVhdGVfc3NsX2NvbnRleHQ7CisKKyAgLyogT3ZlcnJpZGUgKi8KKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZTsKKyAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbjsKKyAgdHRjLT5wZWVrID0gdGhyaWZ0X3NzbF9zb2NrZXRfcGVlazsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlOworICB0dGMtPnJlYWQgPSB0aHJpZnRfc3NsX3NvY2tldF9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfc3NsX3NvY2tldF93cml0ZTsKKyAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfc3NsX3NvY2tldF93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfc3NsX3NvY2tldF9mbHVzaDsKK30KKworCisvKgorICogUHVibGljIEFQSQorICovCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXcoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICp0aHJpZnRTU0xTb2NrZXQgPSBOVUxMOworICBTU0xfQ1RYICpzc2xfY29udGV4dCA9IE5VTEw7CisgIC8qIENyZWF0ZSB0aGUgY29udGV4dCAqLworICBpZigoc3NsX2NvbnRleHQ9dGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKHNzbF9wcm90b2NvbCwgZXJyb3IpKT09TlVMTCl7CisgICAgICBnX3dhcm5pbmcoIldlIGNhbm5vdCBpbml0aWFsaXplIGNvbnRleHQgZm9yIHByb3RvY29sICVkIiwgc3NsX3Byb3RvY29sKTsKKyAgICAgIHJldHVybiB0aHJpZnRTU0xTb2NrZXQ7CisgIH0KKworICAvKiBGSVhNRSBpZiB0aGUgcHJvdG9jb2wgaXMgZGlmZmVyZW50PyAqLworICB0aHJpZnRTU0xTb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsICJzc2xfY29udGV4dCIsIHNzbF9jb250ZXh0LCBOVUxMKTsKKyAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKK30KKworVGhyaWZ0U1NMU29ja2V0KgordGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIGdjaGFyICpob3N0bmFtZSwgZ3VpbnQgcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqdGhyaWZ0U1NMU29ja2V0ID0gTlVMTDsKKyAgU1NMX0NUWCAqc3NsX2NvbnRleHQgPSBOVUxMOworICAvKiBDcmVhdGUgdGhlIGNvbnRleHQgKi8KKyAgaWYoKHNzbF9jb250ZXh0PXRocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShzc2xfcHJvdG9jb2wsIGVycm9yKSk9PU5VTEwpeworICAgICAgLyogRklYTUUgRG8gZXJyb3IgY29udHJvbCAqLworICAgICAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKKyAgfQorICAvKiBGSVhNRSBpZiB0aGUgcHJvdG9jb2wgaXMgZGlmZmVyZW50PyAqLworICB0aHJpZnRTU0xTb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsICJzc2xfY29udGV4dCIsIHNzbF9jb250ZXh0LCAiaG9zdG5hbWUiLCBob3N0bmFtZSwgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKK30KKwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9zZXRfbWFuYWdlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIEFVVEhPUklaQVRJT05fTUFOQUdFUl9DQUxMQkFDSyBjYWxsYmFjaykKK3sKKyAgVGhyaWZ0U1NMU29ja2V0Q2xhc3MgKnNzbFNvY2tldENsYXNzID0gVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTIChzc2xfc29ja2V0KTsKKyAgaWYoc3NsU29ja2V0Q2xhc3MpeworICAgICAgc3NsU29ja2V0Q2xhc3MtPmF1dGhvcml6ZV9wZWVyID0gY2FsbGJhY2s7CisgIH0KK30KKworCitTU0xfQ1RYKgordGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFNTTF9DVFgqIGNvbnRleHQgPSBOVUxMOworICBzd2l0Y2goc3NsX3Byb3RvY29sKXsKKyAgICBjYXNlIFNTTFRMUzoKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMworICAgIGNhc2UgU1NMdjM6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoU1NMdjNfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFRMU3YxXzA6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoVExTdjFfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUTFN2MV8xOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFRMU3YxXzFfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUTFN2MV8yOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFRMU3YxXzJfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ0lQSEVSX05PVF9BVkFJTEFCTEUsCisJCSAgICJUaGUgU1NMIHByb3RvY29sIGlzIHVua25vd24gZm9yICVkIiwgc3NsX3Byb3RvY29sKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoY29udGV4dCA9PSBOVUxMKSB7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfZXJyb3IoIk5vIGNpcGhlciBvdmVybGF5IiwgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ0lQSEVSX05PVF9BVkFJTEFCTEUsIGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIFNTTF9DVFhfc2V0X21vZGUoY29udGV4dCwgU1NMX01PREVfQVVUT19SRVRSWSk7CisKKyAgLyogRGlzYWJsZSBob3JyaWJseSBpbnNlY3VyZSBTU0x2MiBhbmQgU1NMdjMgcHJvdG9jb2xzIGJ1dCBhbGxvdyBhIGhhbmRzaGFrZQorICAgICB3aXRoIG9sZGVyIGNsaWVudHMgc28gdGhleSBnZXQgYSBncmFjZWZ1bCBkZW5pYWwuICovCisgIGlmIChzc2xfcHJvdG9jb2wgPT0gU1NMVExTKSB7CisgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGNvbnRleHQsIFNTTF9PUF9OT19TU0x2Mik7CisgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGNvbnRleHQsIFNTTF9PUF9OT19TU0x2Myk7ICAgLyogVEhSSUZULTMxNjQgKi8KKyAgfQorCisgIHJldHVybiBjb250ZXh0OworfQorCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E0NjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU1NMX1NPQ0tFVF9ICisjZGVmaW5lIF9USFJJRlRfU1NMX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3NzbF9zb2NrZXQuaAorICogIFxicmllZiBTU0wgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHRyYW5zcG9ydC4gIFN1YmNsYXNzZXMgdGhlCisgKiAgICAgICAgIFRocmlmdFNvY2tldCBjbGFzcy4gQmFzZWQgb24gcGxhaW4gb3BlbnNzbC4KKyAqICAgICAgICAgSW4gdGhlIGZ1dHVyZSB3ZSBzaG91bGQgdGFrZSBhIGxvb2sgdG8gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTAxNgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQgKHRocmlmdF9zc2xfc29ja2V0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU1NMX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsIFRocmlmdFNTTFNvY2tldCkpCisjZGVmaW5lIFRIUklGVF9JU19TU0xfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TU0xfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBUaHJpZnRTU0xTb2NrZXRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TU0xfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VUKSkKKyNkZWZpbmUgVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBUaHJpZnRTU0xTb2NrZXRDbGFzcykpCisKKworLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1RSQU5TUE9SVD03LAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9DT05ORUNUX0JJTkQsCisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NJUEhFUl9OT1RfQVZBSUxBQkxFLAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsCisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTF9DRVJUX1ZBTElEQVRJT05fRkFJTEVECit9IFRocmlmdFNTTFNvY2tldEVycm9yOworCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTU0xTb2NrZXQgVGhyaWZ0U1NMU29ja2V0OworCisvKiEKKyAqIFRocmlmdCBTU0wgU29ja2V0IGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFNTTFNvY2tldAoreworICBUaHJpZnRTb2NrZXQgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgU1NMICpzc2w7CisgIFNTTF9DVFgqIGN0eDsKKyAgZ2Jvb2xlYW4gc2VydmVyOworICBnYm9vbGVhbiBhbGxvd19zZWxmc2lnbmVkOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNTTFNvY2tldENsYXNzIFRocmlmdFNTTFNvY2tldENsYXNzOwordHlwZWRlZiBnYm9vbGVhbiAoKiBBVVRIT1JJWkFUSU9OX01BTkFHRVJfQ0FMTEJBQ0spIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIFg1MDkgKmNlcnQsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogVGhyaWZ0IFNvY2tldCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRTU0xTb2NrZXRDbGFzcworeworICBUaHJpZnRTb2NrZXRDbGFzcyBwYXJlbnQ7CisKKyAgZ2Jvb2xlYW4gKCogaGFuZGxlX2hhbmRzaGFrZSkgKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKiBjcmVhdGVfc3NsX2NvbnRleHQpIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCogYXV0aG9yaXplX3BlZXIpIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIFg1MDkgKmNlcnQsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLCBHRXJyb3IgKiplcnJvcik7CisKKyAgLyogUGFkZGluZyB0byBhbGxvdyBhZGRpbmcgdXAgdG8gMTIgbmV3IHZpcnR1YWwgZnVuY3Rpb25zIHdpdGhvdXQKKyAgICogYnJlYWtpbmcgQUJJLiAqLworICBncG9pbnRlciBwYWRkaW5nWzEyXTsKK307CisKK2VudW0gX1RocmlmdFNTTFNvY2tldFByb3RvY29sIHsKKyAgU1NMVExTICA9IDAsICAvKiBTdXBwb3J0cyBTU0x2MiBhbmQgU1NMdjMgaGFuZHNoYWtlIGJ1dCBvbmx5IG5lZ290aWF0ZXMgYXQgVExTdjFfMCBvciBsYXRlci4gKi8KKy8qU1NMdjIgICA9IDEsICAgSE9SUklCTFkgSU5TRUNVUkUhICovCisgIFNTTHYzICAgPSAyLCAgLyogU3VwcG9ydHMgU1NMdjMgb25seSAtIGFsc28gaG9ycmlibHkgaW5zZWN1cmUhICovCisgIFRMU3YxXzAgPSAzLCAgLyogU3VwcG9ydHMgVExTdjFfMCBvciBsYXRlci4gKi8KKyAgVExTdjFfMSA9IDQsICAvKiBTdXBwb3J0cyBUTFN2MV8xIG9yIGxhdGVyLiAqLworICBUTFN2MV8yID0gNSwgIC8qIFN1cHBvcnRzIFRMU3YxXzIgb3IgbGF0ZXIuICovCisgIExBVEVTVCAgPSBUTFN2MV8yCit9OwordHlwZWRlZiBlbnVtIF9UaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBUaHJpZnRTU0xTb2NrZXRQcm90b2NvbDsKKworCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMgKi8KK1NTTF9DVFgqCit0aHJpZnRfc3NsX3NvY2tldF9jb250ZXh0X2luaXRpYWxpemUoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TU0xfU09DS0VUICovCitHVHlwZSB0aHJpZnRfc3NsX3NvY2tldF9nZXRfdHlwZSAodm9pZCk7CisKKy8qIFB1YmxpYyBBUEkgKi8KKworLyoqCisgKiBAYnJpZWYgU2V0IGEgcGlubmluZyBtYW5hZ2VyIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lLgorICoKKyAqIFRoZSBwaW5uaW5nIG1hbmFnZXIgd2lsbCBiZSB1c2VkIGR1cmluZyB0aGUgU1NMIGhhbmRzaGFrZSB0byBjaGVjayBjZXJ0aWZpY2F0ZQorICogYW5kIHBpbm5pbmcgcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gc3NsX3NvY2tldCBTU0wgU29ja2V0IHRvIG9wZXJhdGUgb24uCisgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIHRha2UgdGhlIGNvbnRyb2wgd2hpbGUgdmFsaWRhdGluZyBwaW5uaW5nCisgKgorICovCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X3NldF9tYW5hZ2VyKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgQVVUSE9SSVpBVElPTl9NQU5BR0VSX0NBTExCQUNLIGNhbGxiYWNrKTsKKworLyogVGhpcyBpcyB0aGUgU1NMIEFQSSAqLworLyoqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgU1NMIGNvbnRleHQgd2l0aCB0aGUgcHJvdG9jb2wgc3BlY2lmaWVkCisgKiBhbmQgYXNzaWduIHRoaXMgbmV3IGNvbnRleHQgdG8gdGhlIGNyZWF0ZWQgVGhyaWZ0U1NMU29ja2V0IHdpdGggc3BlY2lmaWVkIGhvc3Q6cG9ydC4KKyAqIEBwYXJhbSBzc2xfcHJvdG9jb2wKKyAqIEBwYXJhbSBob3N0bmFtZQorICogQHBhcmFtIHBvcnQKKyAqIEBwYXJhbSBlcnJvcgorICogQHJldHVybgorICovCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgZ2NoYXIgKmhvc3RuYW1lLCBndWludCBwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IFNTTCBjb250ZXh0IHdpdGggdGhlIHByb3RvY29sIHNwZWNpZmllZAorICogYW5kIGFzc2lnbiB0aGlzIG5ldyBjb250ZXh0IHRvIHRoZSBjcmVhdGVkIFRocmlmdFNTTFNvY2tldC4KKyAqIEBwYXJhbSBzc2xfcHJvdG9jb2wKKyAqIEBwYXJhbSBlcnJvcgorICogQHJldHVybgorICovCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXcoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKKy8qKgorICogTG9hZCBhIGNlcnRpZmljYXRlIGNoYWluIGZyb20gYSBQRU0gZmlsZS4KKyAqIEBwYXJhbSBzc2xfc29ja2V0IFRoZSBzc2wgc29ja2V0CisgKiBAcGFyYW0gZmlsZV9uYW1lIFRoZSBmaWxlIG5hbWUgb2YgdGhlIFBFTSBjZXJ0aWZpY2F0ZSBjaGFpbgorICogQHJldHVybgorICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgY29uc3QgY2hhciAqZmlsZV9uYW1lKTsKKworLyoqCisgKiBMb2FkIGEgY2VydGlmaWNhdGUgY2hhaW4gZnJvbSBtZW1vcnkKKyAqIEBwYXJhbSBzc2xfc29ja2V0IHRoZSBzc2wgc29ja2V0CisgKiBAcGFyYW0gY2hhaW5fY2VydHMgdGhlIGJ1ZmZlciB0byBsb2FkIFBFTSBmcm9tCisgKiBAcmV0dXJuCisgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2J1ZmZlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgY2hhaW5fY2VydHNbXSk7CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHNzbCBzb2NrZXQgaXMgb3BlbiBhbmQgcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZQorICogQHBhcmFtIHRyYW5zcG9ydAorICogQHJldHVybiB0cnVlIGlmIG9wZW4KKyAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworCisvKioKKyAqIE9wZW4gY29ubmVjdGlvbiBpZiByZXF1aXJlZCBhbmQgc2V0IHRoZSBzb2NrZXQgdG8gYmUgcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZQorICogQHBhcmFtIHRyYW5zcG9ydAorICogQHBhcmFtIGVycm9yCisgKiBAcmV0dXJuIHRydWUgaWYgb3BlcmF0aW9uIHdhcyBjb3JyZWN0CisgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCisgKgorICogSXQgd2lsbCBpbml0aWFsaXplIE9wZW5TU0wgZnVuY3Rpb24uIFRoaXMgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBkb25lIGFwcAorICogd2lkZS4gU28gaWYgeW91IHdhbnQgdG8gaW5pdGlhbGl6ZSBpdCBieSB5b3Vyc2VsZiB5b3Ugc2hvdWxkIG5vdCBjYWxsIGl0LgorICogQnV0IGl0IG1lYW5zIHlvdSBtdXN0IGhhbmRsZSBPcGVuU1NMIGluaXRpYWxpemF0aW9uIGFuZCBoYW5kbGUgbG9ja2luZy4KKyAqCisgKiBJdCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlLgorICoKKyAqCisgKi8KK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2luaXRpYWxpemVfb3BlbnNzbCh2b2lkKTsKKy8qKgorICogQGJyaWVmIEZpbmFsaXphdGlvbiBmdW5jdGlvbgorICoKKyAqIEl0IGNsZWFycyBhbGwgcmVzb3VyY2VzIGluaXRpYWxpemVkIGluIGluaXRpYWxpemUgZnVuY3Rpb24uCisgKgorICogSXQgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhbnl0aGluZyBlbHNlLgorICoKKyAqCisgKi8KK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplX29wZW5zc2wodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYwppbmRleCA1NTMzNDM3Li45ZGQyNjcxIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jCkBAIC04NSw2ICs4NSwxNCBAQAogICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmZsdXNoICh0cmFuc3BvcnQsIGVycm9yKTsKIH0KIAorZ2ludDMyCit0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPnJlYWRfYWxsICh0cmFuc3BvcnQsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKIC8qIGJ5IGRlZmF1bHQsIHBlZWsgcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbiAqLwogc3RhdGljIGdib29sZWFuCiB0aHJpZnRfdHJhbnNwb3J0X3JlYWxfcGVlayAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQpAQCAtOTQsNiArMTAyLDMzIEBACiAgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+aXNfb3BlbiAodHJhbnNwb3J0KTsKIH0KIAorc3RhdGljIGdpbnQzMgordGhyaWZ0X3RyYW5zcG9ydF9yZWFsX3JlYWRfYWxsIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGM7CisgIGd1aW50MzIgaGF2ZTsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDggKmJ5dGVzOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisgIGhhdmUgPSAwOworICByZXQgPSAwOworICBieXRlcyA9IChnaW50OCopIGJ1ZjsKKworICB3aGlsZSAoaGF2ZSA8IGxlbikgeworICAgIGlmICgocmV0ID0gdHRjLT5yZWFkICh0cmFuc3BvcnQsIChncG9pbnRlcikgKGJ5dGVzICsgaGF2ZSksIGxlbiAtIGhhdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBoYXZlICs9IHJldDsKKyAgfQorCisgIHJldHVybiBoYXZlOworfQorCiAvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIFRocmlmdCB0cmFuc3BvcnRzICovCiBHUXVhcmsKIHRocmlmdF90cmFuc3BvcnRfZXJyb3JfcXVhcmsgKHZvaWQpCkBAIC0xMTUsOCArMTUwLDkgQEAKICAgY2xzLT53cml0ZV9lbmQgPSB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZDsKICAgY2xzLT5mbHVzaCA9IHRocmlmdF90cmFuc3BvcnRfZmx1c2g7CiAKLSAgLyogcHJvdmlkZSBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBwZWVrIG1ldGhvZCAqLworICAvKiBwcm92aWRlIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHBlZWsgYW5kIHJlYWRfYWxsIG1ldGhvZHMgKi8KICAgY2xzLT5wZWVrID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFsX3BlZWs7CisgIGNscy0+cmVhZF9hbGwgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWxfcmVhZF9hbGw7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgKaW5kZXggNTU1NWE1ZS4uOTRiYjZmNSAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaApAQCAtNzMsNiArNzMsOCBAQAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CiAgIGdib29sZWFuICgqd3JpdGVfZW5kKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKICAgZ2Jvb2xlYW4gKCpmbHVzaCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfYWxsKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOwogfTsKIAogLyogdXNlZCBieSBUSFJJRlRfVFlQRV9UUkFOU1BPUlQgKi8KQEAgLTE0Myw2ICsxNDUsMTMgQEAKICAqLwogZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKIAorLyohCisgKiBSZWFkIGxlbiBieXRlcyBvZiBkYXRhIGludG8gdGhlIGJ1ZmZlciBidWYuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2ludDMyIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKKwogLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwogdHlwZWRlZiBlbnVtCiB7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi9saWIvY19nbGliL3Rlc3QvQ01ha2VMaXN0cy50eHQKaW5kZXggMzFlNmM2Yi4uMzE4YjU3NiAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L0NNYWtlTGlzdHMudHh0CisrKyBiL2xpYi9jX2dsaWIvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMTgsMTYgKzE4LDE4IEBACiAjCiAKIAotI01ha2Ugc3VyZSBnZW4tY3BwIGFuZCBnZW4tY19nbGliIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAotaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKLQogc2V0KFRFU1RfUFJFRklYICJjX2dsaWIiKQogCi1pbmNsdWRlX2RpcmVjdG9yaWVzKCR7Qm9vc3RfSU5DTFVERV9ESVJTfSkKKyMgaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtCb29zdF9JTkNMVURFX0RJUlN9KQorCisjTWFrZSBzdXJlIGdlbi1jcHAgYW5kIGdlbi1jX2dsaWIgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQogCiAjIENyZWF0ZSB0aGUgdGhyaWZ0IEMgdGVzdCBsaWJyYXJ5CiBzZXQodGVzdGdlbmNfU09VUkNFUwogICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuYwogICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYwogICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jCiAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5jCkBAIC0zOCw2ICs0MCw4IEBACiAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYwogICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMKICAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmgKICAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmgKICAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaAogICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaApAQCAtNTAsMzUgKzU0LDQ4IEBACiApCiAKIGFkZF9saWJyYXJ5KHRlc3RnZW5jIFNUQVRJQyAke3Rlc3RnZW5jX1NPVVJDRVN9KQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RnZW5jIHRocmlmdF9jX2dsaWIpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGdlbmMgdGhyaWZ0X2NfZ2xpYikKIAogCithZGRfZXhlY3V0YWJsZSh0ZXN0c2VyaWFsaXphdGlvbiB0ZXN0c2VyaWFsaXphdGlvbi5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RzZXJpYWxpemF0aW9uIHRlc3RnZW5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RzZXJpYWxpemF0aW9uIHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RzZXJpYWxpemF0aW9uIENPTU1BTkQgdGVzdHNlcmlhbGl6YXRpb24pCisKIGFkZF9leGVjdXRhYmxlKHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbiB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24uYykKLXRhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0YXBwbGljYXRpb25leGNlcHRpb24gdGhyaWZ0X2NfZ2xpYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0YXBwbGljYXRpb25leGNlcHRpb24gdGhyaWZ0X2NfZ2xpYikKIGFkZF90ZXN0KE5BTUUgdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uIENPTU1BTkQgdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uKQogCiBhZGRfZXhlY3V0YWJsZSh0ZXN0dHJhbnNwb3J0c29ja2V0IHRlc3R0cmFuc3BvcnRzb2NrZXQuYykKLXRhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0dHJhbnNwb3J0c29ja2V0IHRocmlmdF9jX2dsaWIpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdHRyYW5zcG9ydHNvY2tldCB0aHJpZnRfY19nbGliKQogYWRkX3Rlc3QoTkFNRSB0ZXN0dHJhbnNwb3J0c29ja2V0IENPTU1BTkQgdGVzdHRyYW5zcG9ydHNvY2tldCkKIAogYWRkX2V4ZWN1dGFibGUodGVzdGJpbmFyeXByb3RvY29sIHRlc3RiaW5hcnlwcm90b2NvbC5jKQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RiaW5hcnlwcm90b2NvbCB0aHJpZnRfY19nbGliKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RiaW5hcnlwcm90b2NvbCB0aHJpZnRfY19nbGliKQogYWRkX3Rlc3QoTkFNRSB0ZXN0YmluYXJ5cHJvdG9jb2wgQ09NTUFORCB0ZXN0YmluYXJ5cHJvdG9jb2wpCiAKK2FkZF9leGVjdXRhYmxlKHRlc3Rjb21wYWN0cHJvdG9jb2wgdGVzdGNvbXBhY3Rwcm90b2NvbC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3Rjb21wYWN0cHJvdG9jb2wgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdGNvbXBhY3Rwcm90b2NvbCBDT01NQU5EIHRlc3Rjb21wYWN0cHJvdG9jb2wpCisKIGFkZF9leGVjdXRhYmxlKHRlc3RidWZmZXJlZHRyYW5zcG9ydCB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYykKLXRhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0YnVmZmVyZWR0cmFuc3BvcnQgdGhyaWZ0X2NfZ2xpYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0YnVmZmVyZWR0cmFuc3BvcnQgdGhyaWZ0X2NfZ2xpYikKIGFkZF90ZXN0KE5BTUUgdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0IENPTU1BTkQgdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0KQogCiBhZGRfZXhlY3V0YWJsZSh0ZXN0ZnJhbWVkdHJhbnNwb3J0IHRlc3RmcmFtZWR0cmFuc3BvcnQuYykKLXRhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0ZnJhbWVkdHJhbnNwb3J0IHRocmlmdF9jX2dsaWIpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGZyYW1lZHRyYW5zcG9ydCB0aHJpZnRfY19nbGliKQogYWRkX3Rlc3QoTkFNRSB0ZXN0ZnJhbWVkdHJhbnNwb3J0IENPTU1BTkQgdGVzdGZyYW1lZHRyYW5zcG9ydCkKIAorYWRkX2V4ZWN1dGFibGUodGVzdGZkdHJhbnNwb3J0IHRlc3RmZHRyYW5zcG9ydC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RmZHRyYW5zcG9ydCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0ZmR0cmFuc3BvcnQgQ09NTUFORCB0ZXN0ZmR0cmFuc3BvcnQpCisKIGFkZF9leGVjdXRhYmxlKHRlc3RtZW1vcnlidWZmZXIgdGVzdG1lbW9yeWJ1ZmZlci5jKQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RtZW1vcnlidWZmZXIgdGhyaWZ0X2NfZ2xpYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0bWVtb3J5YnVmZmVyIHRocmlmdF9jX2dsaWIpCiBhZGRfdGVzdChOQU1FIHRlc3RtZW1vcnlidWZmZXIgQ09NTUFORCB0ZXN0bWVtb3J5YnVmZmVyKQogCiBhZGRfZXhlY3V0YWJsZSh0ZXN0c2ltcGxlc2VydmVyIHRlc3RzaW1wbGVzZXJ2ZXIuYykKLXRhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0c2ltcGxlc2VydmVyIHRocmlmdF9jX2dsaWIpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdHNpbXBsZXNlcnZlciB0aHJpZnRfY19nbGliKQogYWRkX3Rlc3QoTkFNRSB0ZXN0c2ltcGxlc2VydmVyIENPTU1BTkQgdGVzdHNpbXBsZXNlcnZlcikKIAogYWRkX2V4ZWN1dGFibGUodGVzdGRlYnVncHJvdG8gdGVzdGRlYnVncHJvdG8uYykKQEAgLTg5LDcgKzEwNiwxNCBAQAogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RvcHRpb25hbHJlcXVpcmVkIHRlc3RnZW5jKQogYWRkX3Rlc3QoTkFNRSB0ZXN0b3B0aW9uYWxyZXF1aXJlZCBDT01NQU5EIHRlc3RvcHRpb25hbHJlcXVpcmVkKQogCi1hZGRfZXhlY3V0YWJsZSh0ZXN0dGhyaWZ0dGVzdCB0ZXN0dGhyaWZ0dGVzdC5jKQoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYyIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tY19nbGliIikKKworYWRkX2V4ZWN1dGFibGUodGVzdHRocmlmdHRlc3QgdGVzdHRocmlmdHRlc3QuYworICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmgKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmMKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oKQogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3R0aHJpZnR0ZXN0IHRlc3RnZW5jKQogYWRkX3Rlc3QoTkFNRSB0ZXN0dGhyaWZ0dGVzdCBDT01NQU5EIHRlc3R0aHJpZnR0ZXN0KQogCkBAIC0xMDksMTQgKzEzMywxNCBAQAogICAgICkKIAogICAgIGFkZF9saWJyYXJ5KHRlc3RnZW5jX2NwcCBTVEFUSUMgJHt0ZXN0Z2VuY19jcHBfU09VUkNFU30pCi0gICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RnZW5jX2NwcCB0aHJpZnQpCisgICAgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RnZW5jX2NwcCB0aHJpZnQpCiAKICAgICAjSEFDSzogdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwIGluY2x1ZGVzIFRocmlmdFRlc3QuaCB3aXRob3V0IGdlbi0qLyBwcmVmaXhlcwogICAgICMgc28gd2UgaW5jbHVkZSBpdCBoZXJlCiAgICAgaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jcHAiICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNfZ2xpYiIpCiAKICAgICBhZGRfZXhlY3V0YWJsZSh0ZXN0dGhyaWZ0dGVzdGNsaWVudCB0ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHApCi0gICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3R0aHJpZnR0ZXN0Y2xpZW50IHRlc3RnZW5jIHRlc3RnZW5jX2NwcCkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXModGVzdHRocmlmdHRlc3RjbGllbnQgdGVzdGdlbmMgdGVzdGdlbmNfY3BwICR7WkxJQl9MSUJSQVJJRVN9KQogICAgIGFkZF90ZXN0KE5BTUUgdGVzdHRocmlmdHRlc3RjbGllbnQgQ09NTUFORCB0ZXN0dGhyaWZ0dGVzdGNsaWVudCkKIAogZW5kaWYoQlVJTERfQ1BQKQpAQCAtMTM4LDEzICsxNjIsMjEgQEAKICAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oCiAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmMKICAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuaAotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRW51bVRlc3QudGhyaWZ0CiApCiAKIGFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQKICAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMKICAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmgKLSAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY19nbGliICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAogKQogCiBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUCkBAIC0xNTQsNyArMTg2LDcgQEAKICAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oCiAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaAogICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgKLSAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKICkKIAogYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVApAQCAtMTY0LDcgKzE5Niw3IEBACiAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmgKICAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmgKICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogKQogCiAjIFRPRE86IEFkZCBtZW1vcnkgY2hlY2tzIHVzaW5nIGN0ZXN0X21lbWNoZWNrIG9yIHNpbWlsYXIKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZS5hbQppbmRleCA3MzE5NzQzLi41ZTlkMmVhIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlLmFtCkBAIC0zNiwxOSArMzYsMjMgQEAKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgKIAotQU1fQ1BQRkxBR1MgPSAtSS4uL3NyYwotQU1fQ0ZMQUdTID0gLWcgLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgJChHTElCX0NGTEFHUykgJChHT0JKRUNUX0NGTEFHUykgXAorQU1fQ1BQRkxBR1MgPSAtSS4uL3NyYyAtSS4vZ2VuLWNfZ2xpYgorQU1fQ0ZMQUdTID0gLWcgLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgJChHTElCX0NGTEFHUykgJChHT0JKRUNUX0NGTEFHUykgJChPUEVOU1NMX0lOQ0xVREVTKSBcCiAJQEdDT1ZfQ0ZMQUdTQAogQU1fQ1hYRkxBR1MgPSAkKEFNX0NGTEFHUykKLUFNX0xERkxBR1MgPSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpIEBHQ09WX0xERkxBR1NACitBTV9MREZMQUdTID0gJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSAkKE9QRU5TU0xfTElCUykgQEdDT1ZfTERGTEFHU0AKIAogY2hlY2tfUFJPR1JBTVMgPSBcCisgIHRlc3RzZXJpYWxpemF0aW9uIFwKICAgdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uIFwKICAgdGVzdGNvbnRhaW5lcnRlc3QgXAogICB0ZXN0dHJhbnNwb3J0c29ja2V0IFwKKyAgdGVzdHRyYW5zcG9ydHNzbHNvY2tldCBcCiAgIHRlc3RiaW5hcnlwcm90b2NvbCBcCisgIHRlc3Rjb21wYWN0cHJvdG9jb2wgXAogICB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQgXAogICB0ZXN0ZnJhbWVkdHJhbnNwb3J0IFwKKyAgdGVzdGZkdHJhbnNwb3J0IFwKICAgdGVzdG1lbW9yeWJ1ZmZlciBcCiAgIHRlc3RzdHJ1Y3QgXAogICB0ZXN0c2ltcGxlc2VydmVyIFwKQEAgLTYxLDYgKzY1LDEyIEBACiAgIGNoZWNrX1BST0dSQU1TICs9IHRlc3R0aHJpZnR0ZXN0Y2xpZW50CiBlbmRpZgogCit0ZXN0c2VyaWFsaXphdGlvbl9TT1VSQ0VTID0gdGVzdHNlcmlhbGl6YXRpb24uYwordGVzdHNlcmlhbGl6YXRpb25fTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICBsaWJ0ZXN0Z2VuYy5sYQorCiB0ZXN0YXBwbGljYXRpb25leGNlcHRpb25fU09VUkNFUyA9IHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi5jCiB0ZXN0YXBwbGljYXRpb25leGNlcHRpb25fTERBREQgPSBcCiAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLm8gXApAQCAtOTEsMTAgKzEwMSwzMCBAQAogICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAogICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KIAorCit0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0X1NPVVJDRVMgPSB0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMKK3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXRfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworCisKIHRlc3RiaW5hcnlwcm90b2NvbF9TT1VSQ0VTID0gdGVzdGJpbmFyeXByb3RvY29sLmMKIHRlc3RiaW5hcnlwcm90b2NvbF9MREFERCA9IFwKICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworCit0ZXN0Y29tcGFjdHByb3RvY29sX1NPVVJDRVMgPSB0ZXN0Y29tcGFjdHByb3RvY29sLmMKK3Rlc3Rjb21wYWN0cHJvdG9jb2xfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5vIFwKICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAogICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAogICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KQEAgLTExMyw2ICsxNDMsMTEgQEAKICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCiAKK3Rlc3RmZHRyYW5zcG9ydF9TT1VSQ0VTID0gdGVzdGZkdHJhbnNwb3J0LmMKK3Rlc3RmZHRyYW5zcG9ydF9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9mZF90cmFuc3BvcnQubworCiB0ZXN0bWVtb3J5YnVmZmVyX1NPVVJDRVMgPSB0ZXN0bWVtb3J5YnVmZmVyLmMKIHRlc3RtZW1vcnlidWZmZXJfTERBREQgPSBcCiAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vCkBAIC0xNDYsNyArMTgxLDkgQEAKICAgICBsaWJ0ZXN0Z2VuYy5sYQogCiB0ZXN0dGhyaWZ0dGVzdF9TT1VSQ0VTID0gdGVzdHRocmlmdHRlc3QuYwotdGVzdHRocmlmdHRlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuYy5sYQordGVzdHRocmlmdHRlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuYy5sYSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLm8KK3Rlc3R0aHJpZnR0ZXN0X0NGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKS90ZXN0L2NfZ2xpYi9zcmMgLUkuL2dlbi1jX2dsaWIgJChHTElCX0NGTEFHUykKIAogdGVzdHRocmlmdHRlc3RjbGllbnRfU09VUkNFUyA9IHRlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcAogdGVzdHRocmlmdHRlc3RjbGllbnRfQ1BQRkxBR1MgPSAtSS4uLy4uL2NwcC9zcmMgJChCT09TVF9DUFBGTEFHUykgLUkuL2dlbi1jcHAgLUkuLi9zcmMgLUkuL2dlbi1jX2dsaWIgJChHTElCX0NGTEFHUykKQEAgLTE2Miw2ICsxOTksOCBAQAogbm9kaXN0X2xpYnRlc3RnZW5jX2xhX1NPVVJDRVMgPSBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmMgXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmMgXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmMgXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuYyBcCkBAIC0xNzQsNiArMjEzLDggQEAKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaCBcCkBAIC0xOTYsMjEgKzIzNywyMiBAQAogICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAogbGlidGVzdGdlbmNwcF9sYV9DUFBGTEFHUyA9IC1JLi4vLi4vY3BwL3NyYyAkKEJPT1NUX0NQUEZMQUdTKSAtSS4vZ2VuLWNwcAogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCi1nZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmggZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5oOiBDb250YWluZXJUZXN0LnRocmlmdAorZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5oIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuaDogQ29udGFpbmVyVGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAogCi1nZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmggZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuYyBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5jIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oOiAuLi8uLi8uLi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuaCBnZW4tY19nbGliL3RfdGVzdF9zcnYuYyBnZW4tY19nbGliL3RfdGVzdF9zcnYuaDogLi4vLi4vLi4vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAogCi1nZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oOiAuLi8uLi8uLi90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAorZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmggZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5oIDogLi4vLi4vLi4vdGVzdC9FbnVtVGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAogCi1nZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmggZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaDogLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaDogLi4vLi4vLi4vdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAogCi1nZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHA6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK2dlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYyBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oOiAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgJDwKKworZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwOiAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQogCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKIAogVEVTVFMgPSBcCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGJpbmFyeXByb3RvY29sLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGJpbmFyeXByb3RvY29sLmMKaW5kZXggY2Q2NTUwMS4uMTRmNGZiMCAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wuYwpAQCAtMTksMjAgKzE5LDE1IEBACiAKIC8qIERpc2FibGUgc3RyaW5nLWZ1bmN0aW9uIG9wdGltaXphdGlvbnMgd2hlbiBnbGliYyBpcyB1c2VkLCBhcyB0aGVzZSBwcm9kdWNlCiAgICBjb21waWxlciB3YXJuaW5ncyBhYm91dCBzdHJpbmcgbGVuZ3RoIHdoZW4gYSBzdHJpbmcgZnVuY3Rpb24gaXMgdXNlZCBpbnNpZGUKLSAgIGEgY2FsbCB0byBhc3NlcnQgKCkgKi8KLSNpZiAhZGVmaW5lZChfX0FQUExFX18pICYmICFkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJiBcCi0gICAgIWRlZmluZWQoX19PcGVuQlNEX18pICYmICFkZWZpbmVkKF9fTmV0QlNEX18pCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLSNlbmRpZgotCisgICBhIGNhbGwgdG8gZ19hc3NlcnQgKCkgKi8KICNpZmRlZiBfX0dMSUJDX18KKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgogI2RlZmluZSBfX05PX1NUUklOR19JTkxJTkVTIDEKICNlbmRpZgogCiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CkBAIC00MCwxMiArMzUsMTMgQEAKICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CiAKICNkZWZpbmUgVEVTVF9CT09MIFRSVUUKICNkZWZpbmUgVEVTVF9CWVRFIDEyMwogI2RlZmluZSBURVNUX0kxNiAxMjM0NQogI2RlZmluZSBURVNUX0kzMiAxMjM0NTY3ODkwCi0jZGVmaW5lIFRFU1RfSTY0IDEyMzQ1Njc4OTAxMjM0NQorI2RlZmluZSBURVNUX0k2NCBHX0dJTlQ2NF9DT05TVEFOVCAoMTIzNDU2Nzg5MDEyMzQ1KQogI2RlZmluZSBURVNUX0RPVUJMRSAxMjM0NTY3ODkwLjEyMwogI2RlZmluZSBURVNUX1NUUklORyAidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIDEyMzQ1Njc4OTAhQCMkJV4mKigpIgogI2RlZmluZSBURVNUX1BPUlQgNTExOTkKQEAgLTU0LDE0ICs1MCwxNCBAQAogc3RhdGljIGludCB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CiBzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CiBnaW50MzIKLW15X3RocmlmdF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQorbXlfdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKIHsKICAgaWYgKHRyYW5zcG9ydF9yZWFkX2NvdW50ICE9IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0CiAgICAgICAmJiB0cmFuc3BvcnRfcmVhZF9lcnJvciA9PSAwKQogICB7CiAgICAgdHJhbnNwb3J0X3JlYWRfY291bnQrKzsKLSAgICByZXR1cm4gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7CisgICAgcmV0dXJuIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKICAgfQogICByZXR1cm4gLTE7CiB9CkBAIC04MiwxNCArNzgsMTUgQEAKICAgcmV0dXJuIEZBTFNFOwogfQogCi0jZGVmaW5lIHRocmlmdF90cmFuc3BvcnRfcmVhZCBteV90aHJpZnRfdHJhbnNwb3J0X3JlYWQKKyNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCBteV90aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsCiAjZGVmaW5lIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgbXlfdGhyaWZ0X3RyYW5zcG9ydF93cml0ZQogI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYyIKLSN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3JlYWQKKyN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsCiAjdW5kZWYgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZQogCiBzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX3ByaW1pdGl2ZXMgKGNvbnN0IGludCBwb3J0KTsKIHN0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfY29tcGxleF90eXBlcyAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAoY29uc3QgaW50IHBvcnQpOwogCiBzdGF0aWMgdm9pZAogdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kodm9pZCkKQEAgLTk4LDcgKzk1LDcgQEAKIAogICAvKiBjcmVhdGUgYW4gb2JqZWN0IGFuZCB0aGVuIGRlc3Ryb3kgaXQgKi8KICAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIE5VTEwpOwotICBhc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7CiB9CiAKQEAgLTExMiwxMSArMTA5LDExIEBACiAgIC8qIGNyZWF0ZSBhIFRocmlmdFRyYW5zcG9ydCAqLwogICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIDUxMTg4LCBOVUxMKTsKLSAgYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOworICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKICAgLyogY3JlYXRlIGEgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgdXNpbmcgdGhlIFRyYW5zcG9ydCAqLwogICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOwotICBhc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CiAgIC8qIGZldGNoIHRoZSBwcm9wZXJ0aWVzICovCiAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QocHJvdG9jb2wpLCAidHJhbnNwb3J0IiwgJnRlbXAsIE5VTEwpOwogICBnX29iamVjdF91bnJlZiAodGVtcCk7CkBAIC0xNDEsNyArMTM4LDcgQEAKIAogICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLwogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKHBpZCA+PSAwKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKIAogICBpZiAocGlkID09IDApCiAgIHsKQEAgLTE1Nyw0NyArMTU0LDQ4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKICAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwogCiAgICAgLyogY3JlYXRlIGEgVGhyaWZ0QmluYXJ5VHJhbnNwb3J0ICovCiAgICAgdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOwogICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yik7Ci0gICAgYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CiAKICAgICAvKiB3cml0ZSBhIGJ1bmNoIG9mIHByaW1pdGl2ZXMgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfRE9VQkxFLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgIiIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIE5VTEwsIDAsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBOVUxMLCAwLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CiAKICAgICAvKiB0ZXN0IHdyaXRlIGVycm9ycyAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIFRFU1RfRE9VQkxFLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIFRFU1RfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCBsZW4sCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IGJpbmFyeSBwYXJ0aWFsIGZhaWx1cmUgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKQEAgLTIwNSw4ICsyMDMsOCBAQAogICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7Ci0gICAgYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOwotICAgIGFzc2VydCAoc3RhdHVzID09IDApOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CiAgIH0KIH0KIApAQCAtMjIzLDcgKzIyMSw3IEBACiAKICAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0IChwaWQgPj0gMCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CiAKICAgaWYgKHBpZCA9PSAwKQogICB7CkBAIC0yMzksMzMgKzIzNywzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CiAgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAogICAgIC8qIGNyZWF0ZSBhIFRocmlmdEJpbmFyeVRyYW5zcG9ydCAqLwogICAgIHRiID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKICAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGIpOwotICAgIGFzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOwogCiAgICAgLyogdGVzdCBzdHJ1Y3R1cmVzICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsIAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpID09IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogdGVzdCB3cml0ZSBlcnJvciAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsIAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IDJuZCB3cml0ZSBlcnJvciAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOwogCkBAIC0yNzMsMTIgKzI3MSwxMiBAQAogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfVk9JRCwgTlVMTCk7CiAKICAgICAvKiB0ZXN0IHdyaXRlX2ZpZWxkX3N0b3AgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIE5VTEwpID4gMCk7CiAKICAgICAvKiB3cml0ZSBhIG1hcCAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9WT0lELCBOVUxMKTsKQEAgLTI4OSwyMSArMjg3LDIxIEBACiAKICAgICAvKiB0ZXN0IDFzdCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKICAgICAvKiB0ZXN0IDNyZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAyOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKQEAgLTMxMyw5ICszMTEsOSBAQAogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTEwLCBOVUxMKTsKIAogICAgIC8qIHRlc3QgbGlzdCBvcGVyYXRpb25zICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbGlzdCAqLwogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfVk9JRCwgTlVMTCk7CkBAIC0zMjYsMjcgKzMyNCwyNyBAQAogCiAgICAgLyogdGVzdCBmaXJzdCB3cml0ZSBlcnJvciBvbiBhIGxpc3QgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOwogCiAgICAgLyogdGVzdCAybmQgd3JpdGUgZXJyb3Igb24gYSBsaXN0ICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIAogICAgIC8qIHRlc3Qgc2V0IG9wZXJhdGlvbiBzKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogaW52YWxpZCB2ZXJzaW9uICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIC0xLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIC0xLCBOVUxMKSA+IDApOwogCiAgICAgLyogc3ogPiAwIGZvciBhIG1lc3NhZ2UgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAxLCBOVUxMKSA+IDApOwogCiAgICAgLyogc2VuZCBhIHZhbGlkIG1lc3NhZ2UgKi8KICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDB4ODAwMTAwMDAsIE5VTEwpOwpAQCAtMzYxLDI2ICszNTksMjYgQEAKICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICJ0ZXN0IiwgTlVMTCk7CiAKICAgICAvKiBzZW5kIGEgdmFsaWQgbWVzc2FnZSAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPiAwKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiBzZW5kIGJyb2tlbiB3cml0ZXMgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDI7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDM7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKQEAgLTM4OCw4ICszODYsOTUgQEAKICAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwogICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKICAgICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOwotICAgIGFzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKLSAgICBhc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX21hbnlfZnJhbWVzICh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICpmdCA9IE5VTEw7CisgIFRocmlmdEJpbmFyeVByb3RvY29sICp0YiA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IChncG9pbnRlciAqKSBURVNUX1NUUklORzsKKyAgY29uc3QgZ3VpbnQzMiBsZW4gPSBzdHJsZW4gKFRFU1RfU1RSSU5HKTsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAocG9ydCk7CisgICAgZXhpdCAoMCk7CisgIH0gZWxzZSB7CisgICAgLyogcGFyZW50LiAgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkLiAqLworICAgIHNsZWVwICgxKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKworICAgIC8qIHdyYXAgaW4gYSBmcmFtZWQgdHJhbnNwb3J0ICovCisgICAgZnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgMSwgTlVMTCk7CisgICAgZ19hc3NlcnQgKGZ0ICE9IE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGZ0KTsKKworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIGJpbmFyeSBwcm90b2NvbCAqLworICAgIHRiID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQsIE5VTEwpOworICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yik7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworCisgICAgLyogd3JpdGUgYSBidW5jaCBvZiBwcmltaXRpdmVzICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfRE9VQkxFLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1NUUklORywgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICIiLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIE5VTEwsIDAsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKGZ0KTsKKyAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRiKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOwogICB9CiB9CiAKQEAgLTQwOCw2ICs0OTMsNyBAQAogICBnaW50NjQgdmFsdWVfNjQgPSAwOwogICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CiAgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKICAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKICAgZ3VpbnQzMiBsZW4gPSAwOwogICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CkBAIC00MTcsNjEgKzUwMyw2OCBAQAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICB0YnAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRicCk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CiAKLSAgYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7Ci0gIGFzc2VydCAodmFsdWVfYnl0ZSA9IFRFU1RfQllURSk7Ci0gIGFzc2VydCAodmFsdWVfMTYgPSBURVNUX0kxNik7Ci0gIGFzc2VydCAodmFsdWVfMzIgPSBURVNUX0kzMik7Ci0gIGFzc2VydCAodmFsdWVfNjQgPSBURVNUX0k2NCk7Ci0gIGFzc2VydCAodmFsdWVfZG91YmxlID0gVEVTVF9ET1VCTEUpOwotICBhc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7Ci0gIGFzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ieXRlID09IFRFU1RfQllURSk7CisgIGdfYXNzZXJ0ICh2YWx1ZV8xNiA9PSBURVNUX0kxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV8zMiA9PSBURVNUX0kzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV82NCA9PSBURVNUX0k2NCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9kb3VibGUgPT0gVEVTVF9ET1VCTEUpOworICBnX2Fzc2VydCAoc3RyY21wIChURVNUX1NUUklORywgc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoIiIsIGVtcHR5X3N0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChtZW1jbXAgKGNvbXBhcmF0b3IsIGJpbmFyeSwgbGVuKSA9PSAwKTsKIAogICBnX2ZyZWUgKHN0cmluZyk7CisgIGdfZnJlZSAoZW1wdHlfc3RyaW5nKTsKICAgZ19mcmVlIChiaW5hcnkpOwogCi0gIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LCAmbGVuLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0IChiaW5hcnkgPT0gTlVMTCk7CisgIGdfYXNzZXJ0IChsZW4gPT0gMCk7CiAgIGdfZnJlZSAoYmluYXJ5KTsKIAogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMDsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKIAogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKIAogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gLTEpOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2J5dGUsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV8xNiwgTlVMTCkgPT0gLTEpOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA9PSAtMSk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKIApAQCAtNTA5LDcgKzYwMiw3IEBACiAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOwogICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCiAgIHRicCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOwpAQCAtNTI0LDcgKzYxNyw3IEBACiAKICAgLyogdGVzdCBmaXJzdCByZWFkIGVycm9yIG9uIGEgZmllbGQgKi8KICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKQEAgLTUzNSw3ICs2MjgsNyBAQAogICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBmaWVsZCAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9uYW1lLCAmZmllbGRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtNTUxLDcgKzY0NCw3IEBACiAgIC8qIHRlc3QgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAwOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtNTU5LDcgKzY1Miw3IEBACiAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKQEAgLTU2Nyw3ICs2NjAsNyBAQAogICAvKiB0ZXN0IDNyZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDI7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CkBAIC01ODAsNyArNjczLDcgQEAKICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOwogCiAgIC8qIHRlc3QgbmVnYXRpdmUgbWFwIHNpemUgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKIApAQCAtNTkwLDcgKzY4Myw3IEBACiAKICAgLyogdGVzdCByZWFkIGZhaWx1cmUgKi8KICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOwogCkBAIC02MTIsMjMgKzcwNSwyMyBAQAogCiAgIC8qIGJyb2tlbiByZWFkICovCiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CiAKICAgLyogaW52YWxpZCBwcm90b2NvbCB2ZXJzaW9uICovCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKIAogICAvKiBzeiA+IDAgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKIAogICAvKiByZWFkIGEgdmFsaWQgbWVzc2FnZSAqLwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOwogICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CkBAIC02MzYsNyArNzI5LDcgQEAKICAgLyogYnJva2VuIDJuZCByZWFkIG9uIGEgbWVzc2FnZSAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtNjQ0LDE5ICs3MzcsMTkgQEAKICAgLyogYnJva2VuIDNyZCByZWFkIG9uIGEgbWVzc2FnZSAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMzsgLyogcmVhZF9zdHJpbmcgZG9lcyB0d28gcmVhZHMgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CiAKICAgLyogcmVhZCBhIHZhbGlkIG1lc3NhZ2UgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CiAgIGdfZnJlZSAobWVzc2FnZV9uYW1lKTsKIAotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgLyogaGFuZGxlIDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWVzc2FnZSAqLwogICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZlcnNpb24sIE5VTEwpOwpAQCAtNjcwLDYgKzc2Myw4MiBAQAogICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiB9CiAKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIFRocmlmdEJpbmFyeVByb3RvY29sICp0YnAgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gRkFMU0U7CisgIGdpbnQ4IHZhbHVlX2J5dGUgPSAwOworICBnaW50MTYgdmFsdWVfMTYgPSAwOworICBnaW50MzIgdmFsdWVfMzIgPSAwOworICBnaW50NjQgdmFsdWVfNjQgPSAwOworICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CisgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKKyAgZ3VpbnQzMiBsZW4gPSAwOworICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CisKKyAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgZnJhbWVkIHRyYW5zcG9ydCAqLworICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsIDEsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIHRicCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOworICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGJwKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJmVtcHR5X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CisKKyAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKGJpbmFyeSA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGxlbiA9PSAwKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKGNsaWVudCwgTlVMTCk7CisgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHRicCk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewpAQCAtNjgzLDYgKzg1Miw4IEBACiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvSW5pdGlhbGl6ZSIsIHRlc3RfaW5pdGlhbGl6ZSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvUmVhZEFuZFdyaXRlUHJpbWl0aXZlcyIsIHRlc3RfcmVhZF9hbmRfd3JpdGVfcHJpbWl0aXZlcyk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvUmVhZEFuZFdyaXRlQ29tcGxleFR5cGVzIiwgdGVzdF9yZWFkX2FuZF93cml0ZV9jb21wbGV4X3R5cGVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RiaW5hcnlwcm90b2NvbC9SZWFkQW5kV3JpdGVNYW55RnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfYW5kX3dyaXRlX21hbnlfZnJhbWVzKTsKIAogICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYwppbmRleCAzMjAzYTY2Li5kMDE4MDZkIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RidWZmZXJlZHRyYW5zcG9ydC5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgpAQCAtMzIsNiArMzEsNyBAQAogI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMiCiAKIHN0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpOwogCiAvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KIHN0YXRpYyB2b2lkCkBAIC00MywxMCArNDMsMTAgQEAKIAogICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOwogICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChvYmplY3QpLCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsICZyX2J1Zl9zaXplLAotICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgJndfYnVmX3NpemUsIE5VTEwpOworCQkicl9idWZfc2l6ZSIsICZyX2J1Zl9zaXplLAorCQkid19idWZfc2l6ZSIsICZ3X2J1Zl9zaXplLCBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7CiB9CiAKQEAgLTU2LDM1ICs1Niw1MiBAQAogICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOwogICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CiAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgcGlkX3QgcGlkOworICBpbnQgcG9ydCA9IDUxMTk5OworICBpbnQgc3RhdHVzOwogCi0gIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIDUxMTg4LCBOVUxMKTsgCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKIAotICAvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KLSAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAocG9ydCwxKTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisJLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOwogCi0gIC8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOwotICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCS8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKIAotICAvKiB0cnkgYW5kIHVuZGVybHlpbmcgc29ja2V0IGZhaWx1cmUgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCS8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gIC8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLwotICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworCS8qIHRyeSBhbmQgdW5kZXJseWluZyBzb2NrZXQgZmFpbHVyZSAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAorCQkJCU5VTEwpOwogCi0gIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKLSAgZ19lcnJvcl9mcmVlIChlcnIpOwotICBlcnIgPSBOVUxMOworCS8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZXJyID0gTlVMTDsKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC05OCw2MCArMTE1LDgxIEBACiAgIGd1Y2hhciBidWZbMTBdID0gVEVTVF9EQVRBOyAvKiBhIGJ1ZmZlciAqLwogCiAgIHBpZCA9IGZvcmsgKCk7Ci0gIGFzc2VydCAoIHBpZCA+PSAwICk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKIAogICBpZiAoIHBpZCA9PSAwICkKLSAgewotICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KLSAgICB0aHJpZnRfc2VydmVyIChwb3J0KTsKLSAgICBleGl0ICgwKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLwotICAgIHNsZWVwICgxKTsKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc2VydmVyIChwb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CiAKLSAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7Ci0gICAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid19idWZfc2l6ZSIsIDQsIE5VTEwpOworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CiAKLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAotICAgIC8qIHdyaXRlIDEwIGJ5dGVzICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKwkvKiB3cml0ZSAxMCBieXRlcyAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CiAKLSAgICAvKiB3cml0ZSAxIGJ5dGUgYXQgYSB0aW1lICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJLyogd3JpdGUgMSBieXRlIGF0IGEgdGltZSAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwogCi0gICAgLyogb3ZlcmZsb3cgdGhlIGJ1ZmZlciAqLwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAyLCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwkvKiBvdmVyZmxvdyB0aGUgYnVmZmVyICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDIsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgLyogd3JpdGUgMSBieXRlIGFuZCBmbHVzaCAqLwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCS8qIHdyaXRlIDEgYnl0ZSBhbmQgZmx1c2ggKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIC8qIHdyaXRlIGFuZCBvdmVyZmxvdyBidWZmZXIgd2l0aCAyIHN5c3RlbSBjYWxscyAqLwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMywgTlVMTCk7CisJLyogd3JpdGUgYW5kIG92ZXJmbG93IGJ1ZmZlciB3aXRoIDIgc3lzdGVtIGNhbGxzICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAzLCBOVUxMKTsKIAotICAgIC8qIHdyaXRlIDEwIGJ5dGVzICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKwkvKiB3cml0ZSAxMCBieXRlcyAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CiAKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIAotICAgIGFzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOwotICAgIGFzc2VydCAoIHN0YXR1cyA9PSAwICk7CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgaW50IGk7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZm9yKGk9MDtpPHRpbWVzO2krKyl7CisgICAgICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICAgICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOwogICB9CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE2NCwyMSArMjAyLDIxIEBACiAgIGd1Y2hhciBtYXRjaFsxMF0gPSBURVNUX0RBVEE7CiAKICAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CiAKICAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgQnVmZmVyZWRUcmFuc3BvcnQgKi8KICAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKwkJCSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCisJCQkgInJfYnVmX3NpemUiLCA1LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICAvKiByZWFkIDEwIGJ5dGVzICovCiAgIGJ5dGVzID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOwotICBhc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KLSAgYXNzZXJ0ICggbWVtY21wIChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLworICBnX2Fzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLworICBnX2Fzc2VydCAoIG1lbWNtcCAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KIAogICAvKiByZWFkIDEgYnl0ZSAqLwogICBieXRlcyA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDEsIE5VTEwpOwpAQCAtMjA3LDY1ICsyNDUsNjUgQEAKICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCiAgIHBpZCA9IGZvcmsgKCk7Ci0gIGFzc2VydCAoIHBpZCA+PSAwICk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKIAogICBpZiAoIHBpZCA9PSAwICkKLSAgewotICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KLSAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7Ci0gICAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgICAgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKIAotICAgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKLSAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgICAgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJCSAgInBvcnQiLCBwb3J0LCBOVUxMKTsKIAotICAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKLSAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCAqLwotICAgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKLSAgICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAotICAgICAgICAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOwotICAgIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICAgICAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgQnVmZmVyZWRUcmFuc3BvcnQgKi8KKyAgICAgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKKwkJCSAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAorCQkJICAgICAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAotICAgIC8qIGp1c3QgY2xvc2Ugc29ja2V0ICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKLSAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKLSAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Ci0gICAgZXhpdCAoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KLSAgICBzbGVlcCAoMSk7CisgICAgICAvKiBqdXN0IGNsb3NlIHNvY2tldCAqLworICAgICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKIAotICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKLSAgICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAorCQkJCSAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKIAogCi0gICAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CiAKLSAgICAvKiByZWNvZ25pemUgZGlzY29ubmVjdGlvbiAqLwotICAgIHNsZWVwKDEpOwotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBUUlVFKTsKLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCkgPT0gRkFMU0UpOworCS8qIHJlY29nbml6ZSBkaXNjb25uZWN0aW9uICovCisJc2xlZXAoMSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCkgPT0gRkFMU0UpOwogCi0gICAgLyogd3JpdGUgYW5kIG92ZXJmbG93IGJ1ZmZlciAqLwotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBGQUxTRSk7CisJLyogd3JpdGUgYW5kIG92ZXJmbG93IGJ1ZmZlciAqLworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpID09IEZBTFNFKTsKIAotICAgIC8qIHdyaXRlIDEgYW5kIGZsdXNoICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpID09IEZBTFNFKTsKKwkvKiB3cml0ZSAxIGFuZCBmbHVzaCAqLworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOwogCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIAotICAgIGFzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOwotICAgIGFzc2VydCAoIHN0YXR1cyA9PSAwICk7Ci0gIH0KKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9CiB9CiAKIGludApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb21wYWN0cHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29tcGFjdHByb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTVhZDQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29tcGFjdHByb3RvY29sLmMKQEAgLTAsMCArMSwxMjkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIERpc2FibGUgc3RyaW5nLWZ1bmN0aW9uIG9wdGltaXphdGlvbnMgd2hlbiBnbGliYyBpcyB1c2VkLCBhcyB0aGVzZSBwcm9kdWNlCisgICBjb21waWxlciB3YXJuaW5ncyBhYm91dCBzdHJpbmcgbGVuZ3RoIHdoZW4gYSBzdHJpbmcgZnVuY3Rpb24gaXMgdXNlZCBpbnNpZGUKKyAgIGEgY2FsbCB0byBnX2Fzc2VydCAoKSAqLworI2lmICFkZWZpbmVkKF9fQVBQTEVfXykgJiYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmIFwKKyAgICAhZGVmaW5lZChfX09wZW5CU0RfXykgJiYgIWRlZmluZWQoX19OZXRCU0RfXykKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0dMSUJDX18KKyNkZWZpbmUgX19OT19TVFJJTkdfSU5MSU5FUyAxCisjZW5kaWYKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oPgorCisjZGVmaW5lIFRFU1RfQk9PTCBUUlVFCisjZGVmaW5lIFRFU1RfQllURSAxMjMKKyNkZWZpbmUgVEVTVF9JMTYgMTIzNDUKKyNkZWZpbmUgVEVTVF9JMzIgMTIzNDU2Nzg5MAorI2RlZmluZSBURVNUX0k2NCAxMjM0NTY3ODkwMTIzNDUKKyNkZWZpbmUgVEVTVF9OSTE2ICgtMTIzNDUpCisjZGVmaW5lIFRFU1RfTkkzMiAoLTEyMzQ1Njc4OTApCisjZGVmaW5lIFRFU1RfTkk2NCAoLTEyMzQ1Njc4OTAxMjM0NSkKKyNkZWZpbmUgVEVTVF9ET1VCTEUgMTIzNDU2Nzg5MC4xMjMKKyNkZWZpbmUgVEVTVF9TVFJJTkcgInRoaXMgaXMgYSB0ZXN0IHN0cmluZyAxMjM0NTY3ODkwIUAjJCVeJiooKSIKKyNkZWZpbmUgVEVTVF9QT1JUIDUxMTk5CisKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworc3RhdGljIGludCB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CitzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CitnaW50MzIKK215X3RocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIGlmICh0cmFuc3BvcnRfcmVhZF9jb3VudCAhPSB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdAorICAgICAgJiYgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPT0gMCkKKyAgeworICAgIHRyYW5zcG9ydF9yZWFkX2NvdW50Kys7CisgICAgcmV0dXJuIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CitnYm9vbGVhbgorbXlfdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgaWYgKHRyYW5zcG9ydF93cml0ZV9jb3VudCAhPSB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQKKyAgICAgICYmIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9PSAwKQorICB7CisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50Kys7CisgICAgcmV0dXJuIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKKyNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCBteV90aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsCisjZGVmaW5lIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgbXlfdGhyaWZ0X3RyYW5zcG9ydF93cml0ZQorI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMiCisjdW5kZWYgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbAorI3VuZGVmIHRocmlmdF90cmFuc3BvcnRfd3JpdGUKKworc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9wcmltaXRpdmVzIChjb25zdCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX2NvbXBsZXhfdHlwZXMgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfbWFueV9mcmFtZXMgKGNvbnN0IGludCBwb3J0KTsKKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIGNyZWF0ZSBhbiBvYmplY3QgYW5kIHRoZW4gZGVzdHJveSBpdCAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfaW5pdGlhbGl6ZSAodm9pZCkKK3sKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFNvY2tldCAqdGVtcCA9IE5VTEw7CisKKyAgLyogY3JlYXRlIGEgVGhyaWZ0VHJhbnNwb3J0ICovCisgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOworICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKKyAgLyogY3JlYXRlIGEgVGhyaWZ0Q29tcGFjdFByb3RvY29sIHVzaW5nIHRoZSBUcmFuc3BvcnQgKi8KKyAgcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNvY2tldCwgTlVMTCk7CisgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKyAgLyogZmV0Y2ggdGhlIHByb3BlcnRpZXMgKi8KKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAocHJvdG9jb2wpLCAidHJhbnNwb3J0IiwgJnRlbXAsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodGVtcCk7CisKKyAgLyogY2xlYW4gdXAgbWVtb3J5ICovCisgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfcHJpbWl0aXZlcyAodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGMgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBncG9pbnRlciBiaW5hcnkgPSAoZ3BvaW50ZXIgKikgVEVTVF9TVFJJTkc7CisgIGd1aW50MzIgbGVuID0gc3RybGVuIChURVNUX1NUUklORyk7CisgIGludCBwb3J0ID0gVEVTVF9QT1JUOworCisgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKQorICB7CisgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgIHRocmlmdF9zZXJ2ZXJfcHJpbWl0aXZlcyAocG9ydCk7CisgICAgZXhpdCAoMCk7CisgIH0gZWxzZSB7CisgICAgLyogcGFyZW50LiAgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkLiAqLworICAgIHNsZWVwICgxKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKyAgICAvKiBjcmVhdGUgYSBUaHJpZnRDb21wYWN0VHJhbnNwb3J0ICovCisgICAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKKyAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKworICAgIC8qIHdyaXRlIGEgYnVuY2ggb2YgcHJpbWl0aXZlcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX05JMTYsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfTkkzMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9OSTY0LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfRE9VQkxFLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfU1RSSU5HLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAiIiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKworICAgIC8qIHRlc3Qgd3JpdGUgZXJyb3JzICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX05JMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9OSTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfTkk2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLCBURVNUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCBiaW5hcnkgcGFydGlhbCBmYWlsdXJlICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9jb21wbGV4X3R5cGVzICh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YyA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGludCBwb3J0ID0gVEVTVF9QT1JUOworCisgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKQorICB7CisgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgIHRocmlmdF9zZXJ2ZXJfY29tcGxleF90eXBlcyAocG9ydCk7CisgICAgZXhpdCAoMCk7CisgIH0gZWxzZSB7CisgICAgLyogcGFyZW50LiAgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkLiAqLworICAgIHNsZWVwICgxKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKyAgICAvKiBjcmVhdGUgYSBUaHJpZnRDb21wYWN0VHJhbnNwb3J0ICovCisgICAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKKyAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKworICAgIC8qIHRlc3Qgc3RydWN0dXJlcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBkZWx0YXMgKi8KKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwgMSwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDcsIE5VTEwpID09IDEpOworCisgICAgLyogdGVzdCBmaWVsZHMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBzdHJ1Y3RzICovCisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTksIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gYm9vbHMgKi8KKworICAgIC8qIGRlbHRhcyAqLworICAgIC8qIG5vbi1ib29sIGZpZWxkIC0+IGJvb2wgZmllbGQgLT4gbm9uLWJvb2wgZmllbGQgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwLCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgLyogYm9vbCAtPiBib29sIGZpZWxkIC0+IGJvb2wgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisKKyAgICAvKiBubyBkZWx0YXMgKi8KKyAgICAvKiBub24tYm9vbCBmaWVsZCAtPiBib29sIGZpZWxkIC0+IG5vbi1ib29sIGZpZWxkICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICAvKiBib29sIC0+IGJvb2wgZmllbGQgLT4gYm9vbCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworCisgICAgLyogdGVzdCB3cml0ZSBlcnJvciAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCAybmQgd3JpdGUgZXJyb3IgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGZpZWxkICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfRE9VQkxFLCBOVUxMKTsKKworICAgIC8qIHRlc3Qgd3JpdGVfZmllbGRfc3RvcCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgTlVMTCkgPiAwKTsKKworICAgIC8qIHdyaXRlIGEgbWFwICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogdGVzdCAxc3QgcmVhZCBmYWlsdXJlIG9uIG1hcC0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIHNpZGUgKi8KKworICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX0RPVUJMRSwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IDFzdCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIC8qIHRlc3QgMm5kIHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogdGVzdCBuZWdhdGl2ZSBtYXAgc2l6ZSAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyICh0YywgLTEwLCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9ET1VCTEUsIE5VTEwpOworCisgICAgLyogdGVzdCBsaXN0IG9wZXJhdGlvbnMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHRlc3QgMXN0IHJlYWQgZmFpbHVyZSBvbiBhIHNtYWxsIGxpc3QtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQgKi8KKworICAgIC8qIHRlc3QgMXN0IHJlYWQgZmFpbHVyZSBvbiBhIGJpZyBsaXN0LS0tbm90aGluZyB0byBkbyBvbiBvdXIgZW5kICovCisKKyAgICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBiaWcgbGlzdCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ZjAsIE5VTEwpOworCisgICAgLyogdGVzdCBuZWdhdGl2ZSBsaXN0IHNpemUgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweGYwLCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAodGMsIC0xMCwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IGZpcnN0IHdyaXRlIGVycm9yIG9uIGEgc21hbGwgbGlzdCAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCBmaXJzdCB3cml0ZSBlcnJvciBvbiBhIGJpZyBsaXN0ICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IDJuZCB3cml0ZSBlcnJvciBvbiBhIGJpZyBsaXN0ICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiB0ZXN0IHNldCBvcGVyYXRpb24gcyovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIGludmFsaWQgcHJvdG9jb2wgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDAsIE5VTEwpID4gMCk7CisKKyAgICAvKiBpbnZhbGlkIHZlcnNpb24gKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHg4MnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMCwgTlVMTCkgPiAwKTsKKworICAgIC8qIHNlbmQgYSB2YWxpZCBtZXNzYWdlICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDB4MDF1LCBOVUxMKSA+IDApOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyICh0YywgMSwgTlVMTCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgInRlc3QiLCBOVUxMKTsKKworICAgIC8qIGJyb2tlbiAybmQgcmVhZCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LCBOVUxMKTsKKworICAgIC8qIHNlbmQgYSBicm9rZW4gM3JkIHJlYWQgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweDgydSwgTlVMTCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDB4MDF1LCBOVUxMKTsKKworICAgIC8qIHNlbmQgYSBicm9rZW4gNHRoIHJlYWQgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweDgydSwgTlVMTCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDB4MDF1LCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAodGMsIDEsIE5VTEwpOworCisgICAgLyogc2VuZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA+IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiBzZW5kIGJyb2tlbiB3cml0ZXMgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMjsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDM7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfbWFueV9mcmFtZXMgKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKmZ0ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YyA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IChncG9pbnRlciAqKSBURVNUX1NUUklORzsKKyAgY29uc3QgZ3VpbnQzMiBsZW4gPSBzdHJsZW4gKFRFU1RfU1RSSU5HKTsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAocG9ydCk7CisgICAgZXhpdCAoMCk7CisgIH0gZWxzZSB7CisgICAgLyogcGFyZW50LiAgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkLiAqLworICAgIHNsZWVwICgxKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKworICAgIC8qIHdyYXAgaW4gYSBmcmFtZWQgdHJhbnNwb3J0ICovCisgICAgZnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgMSwgTlVMTCk7CisgICAgZ19hc3NlcnQgKGZ0ICE9IE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGZ0KTsKKworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIGNvbXBhY3QgcHJvdG9jb2wgKi8KKyAgICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwgTlVMTCk7CisgICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisKKyAgICAvKiB3cml0ZSBhIGJ1bmNoIG9mIHByaW1pdGl2ZXMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9OSTE2LCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfTkkzMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX05JNjQsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0RPVUJMRSwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfU1RSSU5HLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICIiLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKGZ0KTsKKyAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRjKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfcHJpbWl0aXZlcyAoY29uc3QgaW50IHBvcnQpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgZ2Jvb2xlYW4gdmFsdWVfYm9vbGVhbiA9IEZBTFNFOworICBnaW50OCB2YWx1ZV9ieXRlID0gMCwKKyAgICB6aWd6YWdfcDE2ID0gMCwgemlnemFnX3AzMiA9IDAsIHppZ3phZ19wNjQgPSAwLAorICAgIHppZ3phZ19uMTYgPSAwLCB6aWd6YWdfbjMyID0gMCwgemlnemFnX242NCA9IDA7CisgIGdpbnQxNiB2YWx1ZV8xNiA9IDA7CisgIGdpbnQzMiB2YWx1ZV8zMiA9IDA7CisgIGdpbnQ2NCB2YWx1ZV82NCA9IDA7CisgIGdpbnQxNiB2YWx1ZV9uMTYgPSAwOworICBnaW50MzIgdmFsdWVfbjMyID0gMDsKKyAgZ2ludDY0IHZhbHVlX242NCA9IDA7CisgIGdkb3VibGUgdmFsdWVfZG91YmxlID0gMDsKKyAgZ2NoYXIgKnN0cmluZyA9IE5VTEw7CisgIGdjaGFyICplbXB0eV9zdHJpbmcgPSBOVUxMOworICBncG9pbnRlciBiaW5hcnkgPSBOVUxMOworICBndWludDMyIGxlbiA9IDA7CisgIHZvaWQgKmNvbXBhcmF0b3IgPSAodm9pZCAqKSBURVNUX1NUUklORzsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKKyAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlX24xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlX24zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlX242NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3A2NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX242NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmZW1wdHlfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2J5dGUgPT0gVEVTVF9CWVRFKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzE2ID09IFRFU1RfSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlXzMyID09IFRFU1RfSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzY0ID09IFRFU1RfSTY0KTsKKyAgZ19hc3NlcnQgKHZhbHVlX24xNiA9PSBURVNUX05JMTYpOworICBnX2Fzc2VydCAodmFsdWVfbjMyID09IFRFU1RfTkkzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uNjQgPT0gVEVTVF9OSTY0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wMTYgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDMyID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX3A2NCA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uMTYgPT0gMyk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjMyID09IDMpOworICBnX2Fzc2VydCAoemlnemFnX242NCA9PSAzKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2RvdWJsZSA9PSBURVNUX0RPVUJMRSk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOworICBnX2Fzc2VydCAoc3RyY21wICgiIiwgZW1wdHlfc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOworCisgIGdfZnJlZSAoc3RyaW5nKTsKKyAgZ19mcmVlIChlbXB0eV9zdHJpbmcpOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKGJpbmFyeSA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGxlbiA9PSAwKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ieXRlLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlXzE2LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfbjE2LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV9uMzIsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlX242NCwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIHRlc3QgcGFydGlhbCB3cml0ZSBmYWlsdXJlICovCisgIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAodGMpOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9jb21wbGV4X3R5cGVzIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGMgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBnY2hhciAqc3RydWN0X25hbWUgPSBOVUxMOworICBnY2hhciAqZmllbGRfbmFtZSA9IE5VTEw7CisgIGdjaGFyICptZXNzYWdlX25hbWUgPSBOVUxMOworICBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwga2V5X3R5cGUsIHZhbHVlX3R5cGUsIGZpZWxkX3R5cGU7CisgIFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZTsKKyAgZ2Jvb2xlYW4gdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICBnaW50OCB2YWx1ZSA9IDA7CisgIGdpbnQxNiBmaWVsZF9pZCA9IDA7CisgIGd1aW50MzIgc2l6ZSA9IDA7CisgIGdpbnQzMiBzZXFpZCA9IDA7CisgIGdpbnQ4IHZlcnNpb25fYW5kX3R5cGUgPSAwOworICBnaW50OCBwcm90b2NvbF9pZCA9IDA7CisKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisKKyAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CisgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yyk7CisKKyAgLyogdGVzdCBzdHJ1Y3Qgb3BlcmF0aW9ucyAqLworCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJnN0cnVjdF9uYW1lLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gZGVsdGFzICovCisKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxKTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNik7CisgIGZpZWxkX2lkID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTcpOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTUpOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDMwKTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDQ2KTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSA0Nyk7CisgIGZpZWxkX2lkID0gMDsKKworICAvKiB0ZXN0IGZpZWxkIG9wZXJhdGlvbnMgKi8KKworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gc3RydWN0cyAqLworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMSk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTYpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cnVjdF9uYW1lLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNyk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RydWN0X25hbWUsIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE4KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxOSk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE4KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAyNSk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE3KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3QgZmllbGQgc3RhdGUgdy5yLnQuIGJvb2xzICovCisKKyAgLyogZGVsdGFzICovCisgIC8qIG5vbi1ib29sIGZpZWxkIC0+IGJvb2wgZmllbGQgLT4gbm9uLWJvb2wgZmllbGQgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF90eXBlID09IFRfQk9PTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICAvKiBib29sIC0+IGJvb2wgZmllbGQgLT4gYm9vbCAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfdHlwZSA9PSBUX0JPT0wpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworCisgIC8qIG5vIGRlbHRhcyAqLworICAvKiBub24tYm9vbCBmaWVsZCAtPiBib29sIGZpZWxkIC0+IG5vbi1ib29sIGZpZWxkICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX3R5cGUgPT0gVF9CT09MKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgLyogYm9vbCAtPiBib29sIGZpZWxkIC0+IGJvb2wgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfdHlwZSA9PSBUX0JPT0wpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworCisgIC8qIHRlc3QgZmlyc3QgcmVhZCBlcnJvciBvbiBhIGZpZWxkICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiB0ZXN0IDJuZCB3cml0ZSBmYWlsdXJlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZSwgTlVMTCk7CisKKyAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgZmllbGQgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9uYW1lLCAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgZmllbGQgc3RvcCAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCk7CisKKyAgLyogdGVzdCBtYXAgb3BlcmF0aW9ucyAqLworCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IDFzdCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCAxc3Qgd3JpdGUgZmFpbHVyZSBvbiBtYXAtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBzaWRlICovCisKKyAgLyogdGVzdCAybmQgd3JpdGUgZmFpbHVyZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOworCisgIC8qIHRlc3QgbmVnYXRpdmUgbWFwIHNpemUgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisKKyAgLyogdGVzdCBsaXN0IG9wZXJhdGlvbnMgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IHNtYWxsIGxpc3QgMXN0IHJlYWQgZmFpbHVyZSAqLworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CisKKyAgLyogdGVzdCBiaWcgbGlzdCAxc3QgcmVhZCBmYWlsdXJlICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiB0ZXN0IGJpZyBsaXN0IDJuZCByZWFkIGZhaWx1cmUgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgbmVnYXRpdmUgbGlzdCBzaXplIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogdGVzdCBzbWFsbCBsaXN0IDFzdCB3cml0ZSBmYWlsdXJlLS0tbm90aGluZyB0byBkbyBvbiBvdXIgZW5kICovCisKKyAgLyogdGVzdCBiaWcgbGlzdCAxc3Qgd3JpdGUgZmFpbHVyZS0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZCAqLworCisgIC8qIHRlc3QgYmlnIGxpc3QgMm5kIHdyaXRlIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlLCBOVUxMKTsKKworICAvKiB0ZXN0IHNldCBvcGVyYXRpb25zICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiBicm9rZW4gcmVhZCAqLworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIGludmFsaWQgcHJvdG9jb2wgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworCisgIC8qIGludmFsaWQgdmVyc2lvbiAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisKKyAgLyogcmVhZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19mcmVlIChtZXNzYWdlX25hbWUpOworCisgIC8qIGJyb2tlbiAybmQgcmVhZCBvbiBhIG1lc3NhZ2UgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiBicm9rZW4gM3JkIHJlYWQgb24gYSBtZXNzYWdlICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAyOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogYnJva2VuIDR0aCByZWFkIG9uIGEgbWVzc2FnZSAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMzsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHJlYWQgYSB2YWxpZCBtZXNzYWdlICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfZnJlZSAobWVzc2FnZV9uYW1lKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgIC8qIGhhbmRsZSAybmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1lc3NhZ2UgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnByb3RvY29sX2lkLCBOVUxMKTsKKworICAvKiBoYW5kbGUgM3JkIHdyaXRlIGZhaWx1cmUgb24gYSBtZXNzYWdlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZwcm90b2NvbF9pZCwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2ZXJzaW9uX2FuZF90eXBlLCBOVUxMKTsKKworICAvKiBoYW5kbGUgNHRoIHdyaXRlIGZhaWx1cmUgb24gYSBtZXNzYWdlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZwcm90b2NvbF9pZCwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2ZXJzaW9uX2FuZF90eXBlLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAodGMsICZzZXFpZCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfbWFueV9mcmFtZXMgKGNvbnN0IGludCBwb3J0KQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0Y3AgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gRkFMU0U7CisgIGdpbnQ4IHZhbHVlX2J5dGUgPSAwLAorICAgIHppZ3phZ19wMTYgPSAwLCB6aWd6YWdfcDMyID0gMCwgemlnemFnX3A2NCA9IDAsCisgICAgemlnemFnX24xNiA9IDAsIHppZ3phZ19uMzIgPSAwLCB6aWd6YWdfbjY0ID0gMDsKKyAgZ2ludDE2IHZhbHVlXzE2ID0gMDsKKyAgZ2ludDMyIHZhbHVlXzMyID0gMDsKKyAgZ2ludDY0IHZhbHVlXzY0ID0gMDsKKyAgZ2ludDE2IHZhbHVlX24xNiA9IDA7CisgIGdpbnQzMiB2YWx1ZV9uMzIgPSAwOworICBnaW50NjQgdmFsdWVfbjY0ID0gMDsKKyAgZ2RvdWJsZSB2YWx1ZV9kb3VibGUgPSAwOworICBnY2hhciAqc3RyaW5nID0gTlVMTDsKKyAgZ2NoYXIgKmVtcHR5X3N0cmluZyA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IE5VTEw7CisgIGd1aW50MzIgbGVuID0gMDsKKyAgdm9pZCAqY29tcGFyYXRvciA9ICh2b2lkICopIFRFU1RfU1RSSU5HOworCisgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworCisgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIGZyYW1lZCB0cmFuc3BvcnQgKi8KKyAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCAxLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICB0Y3AgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CisgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Y3ApOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfbjE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfbjMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfbjY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AzMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfbjE2ID09IFRFU1RfTkkxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uMzIgPT0gVEVTVF9OSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlX242NCA9PSBURVNUX05JNjQpOworICBnX2Fzc2VydCAoemlnemFnX3AxNiA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wMzIgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDY0ID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX24xNiA9PSAzKTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uMzIgPT0gMyk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjY0ID09IDMpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CisKKyAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAoYmluYXJ5ID09IE5VTEwpOworICBnX2Fzc2VydCAobGVuID09IDApOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAodGNwKTsKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3Rjb21wYWN0cHJvdG9jb2wvQ3JlYXRlQW5kRGVzdHJveSIsCisgICAgICAgICAgICAgICAgICAgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9Jbml0aWFsaXplIiwgdGVzdF9pbml0aWFsaXplKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3Rjb21wYWN0cHJvdG9jb2wvUmVhZEFuZFdyaXRlUHJpbWl0aXZlcyIsCisgICAgICAgICAgICAgICAgICAgdGVzdF9yZWFkX2FuZF93cml0ZV9wcmltaXRpdmVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3Rjb21wYWN0cHJvdG9jb2wvUmVhZEFuZFdyaXRlQ29tcGxleFR5cGVzIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfYW5kX3dyaXRlX2NvbXBsZXhfdHlwZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9SZWFkQW5kV3JpdGVNYW55RnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfYW5kX3dyaXRlX21hbnlfZnJhbWVzKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29udGFpbmVydGVzdC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0LmMKaW5kZXggODUyMjU0Yi4uNWZjNTFkNSAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0LmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0LmMKQEAgLTUwNywxOCArNTA3LDE3IEBACiAKICAgICAvKiBNYWtlIHN1cmUgdGhlIHNlcnZlciBzdG9wcGVkIG9ubHkgYmVjYXVzZSBpdCB3YXMgaW50ZXJydXB0ZWQgKGJ5IHRoZQogICAgICAgIGNoaWxkIHByb2Nlc3MgdGVybWluYXRpbmcpICovCi0gICAgZ19hc3NlcnQgKGdfZXJyb3JfbWF0Y2hlcyAoZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQUNDRVBUKSk7CisgICAgZ19hc3NlcnQoIWVycm9yIHx8IGdfZXJyb3JfbWF0Y2hlcyhlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQUNDRVBUKSk7CiAKICAgICAvKiBGcmVlIG91ciByZXNvdXJjZXMgKi8KLSAgICBnX29iamVjdF91bnJlZiAoc2VydmVyKTsKLSAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0X2ZhY3RvcnkpOwotICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbF9mYWN0b3J5KTsKLSAgICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7Ci0KLSAgICBnX29iamVjdF91bnJlZiAocHJvY2Vzc29yKTsKLSAgICBnX29iamVjdF91bnJlZiAoaGFuZGxlcik7CisgICAgZ19jbGVhcl9vYmplY3QgKCZzZXJ2ZXIpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmcHJvdG9jb2xfZmFjdG9yeSk7CisgICAgZ19jbGVhcl9vYmplY3QgKCZ0cmFuc3BvcnRfZmFjdG9yeSk7CisgICAgZ19jbGVhcl9vYmplY3QgKCZzZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnByb2Nlc3Nvcik7CisgICAgZ19jbGVhcl9vYmplY3QgKCZoYW5kbGVyKTsKIAogICAgIC8qIFdhaXQgZm9yIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGNvbXBsZXRlIGFuZCByZXR1cm4gaXRzIGV4aXQgc3RhdHVzICovCiAgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CkBAIC01MjcsNCArNTI2LDQgQEAKIAogICAgIHJldHVybiBleGl0X3N0YXR1czsKICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZGVidWdwcm90by5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RkZWJ1Z3Byb3RvLmMKaW5kZXggNzAzZGZmMC4uMTA5YTQ4YiAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RkZWJ1Z3Byb3RvLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RkZWJ1Z3Byb3RvLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KQEAgLTE0Niw3ICsxNDUsNyBAQAogCiAgIGdfYXNzZXJ0X2NtcGludCAoYV9iaXRlLCAgICA9PSwgMHg3Zik7CiAgIGdfYXNzZXJ0X2NtcGludCAoaW50ZWdlcjE2LCA9PSwgMHg3ZmZmKTsKLSAgZ19hc3NlcnRfY21waW50IChpbnRlZ2VyNjQsID09LCAxMDAwMDAwMDAwMCk7CisgIGdfYXNzZXJ0X2NtcGludCAoaW50ZWdlcjY0LCA9PSwgR19HSU5UNjRfQ09OU1RBTlQgKDEwMDAwMDAwMDAwKSk7CiAKICAgZ19hc3NlcnQgKGJ5dGVfbGlzdCAhPSBOVUxMKTsKICAgZ19hc3NlcnRfY21waW50IChieXRlX2xpc3QtPmxlbiwgPT0sIDMpOwpAQCAtMTc5LDggKzE3OCwxMSBAQAogICBzdGF0aWMgY29uc3QgZ2ludDE2IGluaXRpYWxfaTE2X2xpc3RbNV0gPSB7IDQxODEsIDY3NjUsIDEwOTQ2LCAxNzcxMSwgMjg2NTcgfTsKICAgc3RhdGljIGNvbnN0IGdpbnQ2NCBpbml0aWFsX2k2NF9saXN0WzVdID0KICAgICB7Ci0gICAgICAxMTAwMDg3Nzc4MzY2MTAxOTMxLCAxNzc5OTc5NDE2MDA0NzE0MTg5LCAyODgwMDY3MTk0MzcwODE2MTIwLAotICAgICAgNDY2MDA0NjYxMDM3NTUzMDMwOSwgNzU0MDExMzgwNDc0NjM0NjQyOQorICAgICAgR19HSU5UNjRfQ09OU1RBTlQgKDExMDAwODc3NzgzNjYxMDE5MzEpLAorICAgICAgR19HSU5UNjRfQ09OU1RBTlQgKDE3Nzk5Nzk0MTYwMDQ3MTQxODkpLAorICAgICAgR19HSU5UNjRfQ09OU1RBTlQgKDI4ODAwNjcxOTQzNzA4MTYxMjApLAorICAgICAgR19HSU5UNjRfQ09OU1RBTlQgKDQ2NjAwNDY2MTAzNzU1MzAzMDkpLAorICAgICAgR19HSU5UNjRfQ09OU1RBTlQgKDc1NDAxMTM4MDQ3NDYzNDY0MjkpCiAgICAgfTsKICAgc3RhdGljIGNvbnN0IGd1aW50OCBpbml0aWFsX2Jhc2U2NFs4XSA9CiAgICAgewpAQCAtMjE2LDIyICsyMTgsMjMgQEAKICAgZ19hcnJheV9hcHBlbmRfdmFscyAoaTY0X2xpc3QsIGluaXRpYWxfaTY0X2xpc3QsIDUpOwogCiAgIC8qIEFsbCBvZiBPbmVPZkVhY2gncyBwcm9wZXJ0aWVzIGNhbiBiZSBzZXQgYXQgY29uc3RydWN0aW9uLi4uICovCi0gIG9uZV9vZl9lYWNoID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbV90cnVlIiwgICAgICAgICAgVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbV9mYWxzZSIsICAgICAgICAgRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgICAgICAgIDB4NTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgICAgICAgIDB4N2U1NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMzIiLCAgICAgICAgMHhkZWFkYmVlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyNjQiLCAgICAgICAgMHhmYTE1ZWZhY2FkZTE1YmFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvdWJsZV9wcmVjaXNpb24iLCBNX1BJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvbWVfY2hhcmFjdGVycyIsICAiRGVidWcgVEhJUyEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpvbWdfdW5pY29kZSIsICAgICAiXHhkN1xuXGFcdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hhdF93aG8iLCAgICAgICAgIFRSVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzZTY0IiwgICAgICAgICAgIGJhc2U2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX2xpc3QiLCAgICAgICAgYnl0ZV9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkxNl9saXN0IiwgICAgICAgICBpMTZfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfbGlzdCIsICAgICAgICAgaTY0X2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgb25lX29mX2VhY2ggPQorICAgIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfT05FX09GX0VBQ0gsCisgICAgICAgICAgICAgICAgICAiaW1fdHJ1ZSIsICAgICAgICAgIFRSVUUsCisgICAgICAgICAgICAgICAgICAiaW1fZmFsc2UiLCAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgICAgICAgICAweDUwLAorICAgICAgICAgICAgICAgICAgImludGVnZXIxNiIsICAgICAgICAweDdlNTcsCisgICAgICAgICAgICAgICAgICAiaW50ZWdlcjMyIiwgICAgICAgIDB4ZGVhZGJlZWYsCisgICAgICAgICAgICAgICAgICAiaW50ZWdlcjY0IiwgICAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICgweGZhMTVlZmFjYWRlMTViYWQpLAorICAgICAgICAgICAgICAgICAgImRvdWJsZV9wcmVjaXNpb24iLCBNX1BJLAorICAgICAgICAgICAgICAgICAgInNvbWVfY2hhcmFjdGVycyIsICAiRGVidWcgVEhJUyEiLAorICAgICAgICAgICAgICAgICAgInpvbWdfdW5pY29kZSIsICAgICAiXHhkN1xuXGFcdCIsCisgICAgICAgICAgICAgICAgICAid2hhdF93aG8iLCAgICAgICAgIFRSVUUsCisgICAgICAgICAgICAgICAgICAiYmFzZTY0IiwgICAgICAgICAgIGJhc2U2NCwKKyAgICAgICAgICAgICAgICAgICJieXRlX2xpc3QiLCAgICAgICAgYnl0ZV9saXN0LAorICAgICAgICAgICAgICAgICAgImkxNl9saXN0IiwgICAgICAgICBpMTZfbGlzdCwKKyAgICAgICAgICAgICAgICAgICJpNjRfbGlzdCIsICAgICAgICAgaTY0X2xpc3QsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgZ19hc3NlcnQgKG9uZV9vZl9lYWNoICE9IE5VTEwpOwogCiAgIGdfYXJyYXlfdW5yZWYgKGk2NF9saXN0KTsKQEAgLTI2Nyw3ICsyNzAsNyBAQAogICBnX2Fzc2VydF9jbXBoZXggKGFfYml0ZSwgICAgPT0sIDB4NTApOwogICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXIxNiwgPT0sIDB4N2U1Nyk7CiAgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjMyLCA9PSwgKGdpbnQzMikweGRlYWRiZWVmKTsKLSAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyNjQsID09LCAweGZhMTVlZmFjYWRlMTViYWQpOworICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXI2NCwgPT0sIEdfR0lOVDY0X0NPTlNUQU5UICgweGZhMTVlZmFjYWRlMTViYWQpKTsKIAogICBnX2Fzc2VydF9jbXBmbG9hdCAoZG91YmxlX3ByZWNpc2lvbiwgPT0sIE1fUEkpOwogCkBAIC04MzQsMTEgKzgzNywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKIAogICAvKiBUVGVzdEluaGVyaXRlZENsaWVudCBpbmhlcml0cyBmcm9tIFRUZXN0U3J2Q2xpZW50ICovCi0gIGFzc2VydCAoZ190eXBlX2lzX2EgKFRfVEVTVF9UWVBFX0lOSEVSSVRFRF9DTElFTlQsCisgIGdfYXNzZXJ0IChnX3R5cGVfaXNfYSAoVF9URVNUX1RZUEVfSU5IRVJJVEVEX0NMSUVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX1RZUEVfU1JWX0NMSUVOVCkpOwogCiAgIC8qIFRUZXN0SW5oZXJpdGVkQ2xpZW50IGltcGxlbWVudHMgVFRlc3RTcnZDbGllbnQncyBpbnRlcmZhY2UgKi8KLSAgYXNzZXJ0IChnX3R5cGVfaXNfYSAoVF9URVNUX1RZUEVfSU5IRVJJVEVEX0NMSUVOVCwKKyAgZ19hc3NlcnQgKGdfdHlwZV9pc19hIChUX1RFU1RfVFlQRV9JTkhFUklURURfQ0xJRU5ULAogICAgICAgICAgICAgICAgICAgICAgICBUX1RFU1RfVFlQRV9TUlZfSUYpKTsKIAogICAvKiBUVGVzdEluaGVyaXRlZENsaWVudCdzIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGNhbiBiZSBzZXQgYW5kIHJldHJpZXZlZCAqLwpAQCAtODUyLDggKzg1NSw4IEBACiAgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbCIsICZvdXRwdXRfcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgTlVMTCk7CiAKLSAgYXNzZXJ0IChpbnB1dF9wcm90b2NvbCA9PSBHX09CSkVDVChwcm90b2NvbCkpOwotICBhc3NlcnQgKG91dHB1dF9wcm90b2NvbCA9PSBHX09CSkVDVChwcm90b2NvbCkpOworICBnX2Fzc2VydCAoaW5wdXRfcHJvdG9jb2wgPT0gR19PQkpFQ1QocHJvdG9jb2wpKTsKKyAgZ19hc3NlcnQgKG91dHB1dF9wcm90b2NvbCA9PSBHX09CSkVDVChwcm90b2NvbCkpOwogCiAgIGdfb2JqZWN0X3VucmVmIChvdXRwdXRfcHJvdG9jb2wpOwogICBnX29iamVjdF91bnJlZiAoaW5wdXRfcHJvdG9jb2wpOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmZHRyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmZHRyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFlYTg5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oPgorCitzdGF0aWMgY29uc3QgZ2NoYXIgVEVTVF9EQVRBWzEyXSA9ICJhYmNkZTAxMjM0ISI7CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0OworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwgImZkIiwgLTEsIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfb3Blbl9hbmRfY2xvc2UgKHZvaWQpCit7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqa2xhc3M7CisgIEdFcnJvciAqZXJyb3I7CisgIGdpbnQgZmQ7CisgIGdjaGFyICpmaWxlbmFtZTsKKworICBlcnJvciA9IE5VTEw7CisgIGZpbGVuYW1lID0gTlVMTDsKKworICBmZCA9IGdfZmlsZV9vcGVuX3RtcCAoTlVMTCwgJmZpbGVuYW1lLCAmZXJyb3IpOworICBnX2Fzc2VydCAoZmQgPj0gMCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZkIiwgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworICBrbGFzcyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOworCisgIC8qIG9wZW4gaXMgbm8tb3AgKi8KKyAgZ19hc3NlcnQgKGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoa2xhc3MtPm9wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKworICBnX2Fzc2VydCAoa2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoISBrbGFzcy0+b3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBnX2Fzc2VydCAoISBrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKworICAvKiBhbHJlYWR5IGNsb3NlZCAqLworICBnX2Fzc2VydCAoY2xvc2UgKGZkKSAhPSAwKTsKKyAgZ19hc3NlcnQgKGVycm5vID09IEVCQURGKTsKKworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKworICBnX3JlbW92ZSAoZmlsZW5hbWUpOworICBnX2ZyZWUgKGZpbGVuYW1lKTsKKworICAvKiB0ZXN0IGJhZCBmZCAqLworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisKKyAgZ19hc3NlcnQgKCEga2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBlcnJvciA9IE5VTEw7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOworICBlcnJvciA9IE5VTEw7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5vcGVuICh0cmFuc3BvcnQsICZlcnJvcikpOworICBlcnJvciA9IE5VTEw7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGUgKHZvaWQpCit7CisgIGdjaGFyIG91dF9idWZbOF07CisgIGdjaGFyICpiOworICBnaW50IHdhbnQsIGdvdDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICprbGFzczsKKyAgR0Vycm9yICplcnJvcjsKKyAgZ2ludCBmZDsKKyAgZ2NoYXIgKmZpbGVuYW1lOworCisgIGVycm9yID0gTlVMTDsKKyAgZmlsZW5hbWUgPSBOVUxMOworCisgIGZkID0gZ19maWxlX29wZW5fdG1wIChOVUxMLCAmZmlsZW5hbWUsICZlcnJvcik7CisgIGdfYXNzZXJ0IChmZCA+PSAwKTsKKworICAvKiB3cml0ZSAqLworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisgIGdfYXNzZXJ0IChrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+d3JpdGUgKHRyYW5zcG9ydCwgKGdwb2ludGVyKSBURVNUX0RBVEEsIDExLCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5mbHVzaCAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgLyogcmVhZCAqLworICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZLCBTX0lSVVNSIHwgU19JV1VTUik7CisgIGdfYXNzZXJ0IChmZCA+PSAwKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisKKyAgbWVtc2V0KG91dF9idWYsIDAsIDgpOworICBiID0gb3V0X2J1ZjsKKyAgd2FudCA9IDc7CisgIHdoaWxlICh3YW50ID4gMCkgeworICAgIGdvdCA9IGtsYXNzLT5yZWFkICh0cmFuc3BvcnQsIChncG9pbnRlcikgYiwgd2FudCwgJmVycm9yKTsKKyAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CisgICAgYiArPSBnb3Q7CisgICAgd2FudCAtPSBnb3Q7CisgIH0KKyAgZ19hc3NlcnQgKG1lbWNtcCAob3V0X2J1ZiwgVEVTVF9EQVRBLCA3KSA9PSAwKTsKKworICBtZW1zZXQob3V0X2J1ZiwgMCwgOCk7CisgIGIgPSBvdXRfYnVmOworICB3YW50ID0gNDsKKyAgd2hpbGUgKHdhbnQgPiAwKSB7CisgICAgZ290ID0ga2xhc3MtPnJlYWQgKHRyYW5zcG9ydCwgKGdwb2ludGVyKSBiLCB3YW50LCAmZXJyb3IpOworICAgIGdfYXNzZXJ0IChnb3QgPiAwICYmIGdvdCA8PSB3YW50KTsKKyAgICBiICs9IGdvdDsKKyAgICB3YW50IC09IGdvdDsKKyAgfQorICBnX2Fzc2VydCAobWVtY21wIChvdXRfYnVmLCBURVNUX0RBVEEgKyA3LCA0KSA9PSAwKTsKKworICBnX2Fzc2VydCAoa2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKworICAvKiBjbGVhbiB1cCAqLworCisgIGdfcmVtb3ZlIChmaWxlbmFtZSk7CisgIGdfZnJlZSAoZmlsZW5hbWUpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZkdHJhbnNwb3J0L0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZmR0cmFuc3BvcnQvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZmR0cmFuc3BvcnQvUmVhZEFuZFdyaXRlIiwgdGVzdF9yZWFkX2FuZF93cml0ZSk7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGZyYW1lZHRyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQuYwppbmRleCBkNTBmZjIzLi4wMDhlNjFlIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdGZyYW1lZHRyYW5zcG9ydC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZnJhbWVkdHJhbnNwb3J0LmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKQEAgLTMxLDYgKzMwLDcgQEAKICNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYyIKIAogc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcyk7CiAKIC8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLwogc3RhdGljIHZvaWQKQEAgLTQyLDEwICs0MiwxMCBAQAogCiAgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CiAgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChvYmplY3QpLCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsICZyX2J1Zl9zaXplLAotICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgJndfYnVmX3NpemUsIE5VTEwpOworCQkicl9idWZfc2l6ZSIsICZyX2J1Zl9zaXplLAorCQkid19idWZfc2l6ZSIsICZ3X2J1Zl9zaXplLCBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7CiB9CiAKQEAgLTU1LDM1ICs1NSw1MyBAQAogICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOwogICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CiAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgcGlkX3QgcGlkOworICBpbnQgcG9ydCA9IDUxMTk5OworICBpbnQgc3RhdHVzOwogCi0gIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIDUxMTg4LCBOVUxMKTsgCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKIAotICAvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KLSAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CisgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKHBvcnQsMSk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCS8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKIAotICAvKiB0aGlzIHNob3VsZG4ndCB3b3JrICovCi0gIGFzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBGQUxTRSk7Ci0gIGFzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKLSAgYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwkvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOwogCi0gIC8qIHRyeSBhbmQgdW5kZXJseWluZyBzb2NrZXQgZmFpbHVyZSAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJLyogdGhpcyBzaG91bGRuJ3Qgd29yayAqLworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCi0gIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworCS8qIHRyeSBhbmQgdW5kZXJseWluZyBzb2NrZXQgZmFpbHVyZSAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAorCQkJCU5VTEwpOwogCi0gIGFzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7Ci0gIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Ci0gIGdfZXJyb3JfZnJlZSAoZXJyKTsKLSAgZXJyID0gTlVMTDsKKwkvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworCisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZXJyID0gTlVMTDsKKworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKQEAgLTk3LDQ5ICsxMTUsNDkgQEAKICAgZ3VjaGFyIGJ1ZlsxMF0gPSBURVNUX0RBVEE7IC8qIGEgYnVmZmVyICovCiAKICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0ICggcGlkID49IDAgKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCiAgIGlmICggcGlkID09IDAgKQotICB7Ci0gICAgLyogY2hpbGQgbGlzdGVucyAqLwotICAgIHRocmlmdF9zZXJ2ZXIgKHBvcnQpOwotICAgIGV4aXQgKDApOwotICB9IGVsc2UgewotICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCi0gICAgc2xlZXAgKDEpOworICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zZXJ2ZXIgKHBvcnQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKIAotICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKLSAgICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid19idWZfc2l6ZSIsIDQsIE5VTEwpOworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCisJCQkJICAid19idWZfc2l6ZSIsIDQsIE5VTEwpOwogCi0gICAgYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOwotICAgIGFzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwogCi0gICAgLyogd3JpdGUgMTAgYnl0ZXMgKi8KLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwkvKiB3cml0ZSAxMCBieXRlcyAqLworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gICAgYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7Ci0gICAgYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKLSAgfQorCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KIH0KIAogLyogdGVzdCByZWFkaW5nIGZyb20gdGhlIHRyYW5zcG9ydCBhZnRlciB0aGUgcGVlciBoYXMgdW5leHBlY3RlZGx5CkBAIC0xNTYsNzYgKzE3NCw5NyBAQAogICBnX2Fzc2VydCAocGlkID49IDApOwogCiAgIGlmIChwaWQgPT0gMCkKLSAgewotICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7Ci0gICAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnRfdHJhbnNwb3J0ID0gTlVMTDsKKyAgICB7CisgICAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQgPSBOVUxMOworICAgICAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnRfdHJhbnNwb3J0ID0gTlVMTDsKIAotICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KLSAgICBzZXJ2ZXJfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICBnX2Fzc2VydCAoc2VydmVyX3RyYW5zcG9ydCAhPSBOVUxMKTsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHNlcnZlcl90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJICAgICAgICJwb3J0IiwgcG9ydCwKKwkJCQkgICAgICAgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoc2VydmVyX3RyYW5zcG9ydCAhPSBOVUxMKTsKIAotICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAoc2VydmVyX3RyYW5zcG9ydCwgJmVycik7Ci0gICAgZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKKyAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAoc2VydmVyX3RyYW5zcG9ydCwgJmVycik7CisgICAgICBnX2Fzc2VydCAoZXJyID09IE5VTEwpOwogCi0gICAgLyogd3JhcCB0aGUgY2xpZW50IHRyYW5zcG9ydCBpbiBhIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqLwotICAgIGNsaWVudF90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcKLSAgICAgIChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAotICAgICAgICJ0cmFuc3BvcnQiLCAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyKSwKLSAgICAgICAicl9idWZfc2l6ZSIsIDAsCi0gICAgICAgTlVMTCk7Ci0gICAgZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKLSAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKKyAgICAgIC8qIHdyYXAgdGhlIGNsaWVudCB0cmFuc3BvcnQgaW4gYSBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKi8KKyAgICAgIGNsaWVudF90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcKKwkgIChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCSAgICJ0cmFuc3BvcnQiLCAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyKSwKKwkgICAicl9idWZfc2l6ZSIsIDAsCisJICAgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoZXJyID09IE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudF90cmFuc3BvcnQgIT0gTlVMTCk7CiAKLSAgICAvKiBjbG9zZSB0aGUgY29ubmVjdGlvbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2xpZW50IGNvbm5lY3RzICovCi0gICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgTlVMTCk7CisgICAgICAvKiBjbG9zZSB0aGUgY29ubmVjdGlvbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2xpZW50IGNvbm5lY3RzICovCisgICAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKLSAgICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CiAKLSAgICBleGl0ICgwKTsKLSAgfSBlbHNlIHsKLSAgICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOwotICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKLSAgICBndWNoYXIgYnVmWzEwXTsgLyogYSBidWZmZXIgKi8KKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKwlUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisJZ3VjaGFyIGJ1ZlsxMF07IC8qIGEgYnVmZmVyICovCiAKLSAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLwotICAgIHNsZWVwICgxKTsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKIAotICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsICAgICBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCAgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid19idWZfc2l6ZSIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsCisJCQkJImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCAgICAgcG9ydCwKKwkJCQlOVUxMKTsKKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAorCQkJCSAgIndfYnVmX3NpemUiLCAwLAorCQkJCSAgTlVMTCk7CiAKLSAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOwotICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCWdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CiAKLSAgICAvKiBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0IGFmdGVyIHRoZSBwZWVyIGhhcyBjbG9zZWQKKwkvKiBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0IGFmdGVyIHRoZSBwZWVyIGhhcyBjbG9zZWQKICAgICAgICB0aGUgY29ubmVjdGlvbiBmYWlscyBncmFjZWZ1bGx5IHdpdGhvdXQgZ2VuZXJhdGluZyBhIGNyaXRpY2FsCiAgICAgICAgd2FybmluZyBvciBzZWdtZW50YXRpb24gZmF1bHQgKi8KLSAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHRyYW5zcG9ydCwgYnVmLCAxMCwgJmVycik7Ci0gICAgZ19hc3NlcnQgKGVyciAhPSBOVUxMKTsKKwl0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHRyYW5zcG9ydCwgYnVmLCAxMCwgJmVycik7CisJZ19hc3NlcnQgKGVyciAhPSBOVUxMKTsKIAotICAgIGdfZXJyb3JfZnJlZSAoZXJyKTsKLSAgICBlcnIgPSBOVUxMOworCWdfZXJyb3JfZnJlZSAoZXJyKTsKKwllcnIgPSBOVUxMOwogCi0gICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAodHJhbnNwb3J0LCAmZXJyKTsKLSAgICBnX2Fzc2VydCAoZXJyID09IE5VTEwpOworCXRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKHRyYW5zcG9ydCwgJmVycik7CisJZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKIAotICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgJmVycik7Ci0gICAgZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKKwl0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsICZlcnIpOworCWdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CiAKLSAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7Ci0gICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKwlnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKwlnX2Fzc2VydCAoc3RhdHVzID09IDApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBpbnQgaTsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGZvcihpPTA7aTx0aW1lcztpKyspeworICAgICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKICAgfQorICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0yMzgsMjEgKzI3NywyMSBAQAogICBndWNoYXIgbWF0Y2hbMTBdID0gVEVTVF9EQVRBOwogCiAgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwogCiAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOwogCiAgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIEJ1ZmZlcmVkVHJhbnNwb3J0ICovCiAgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7Ci0gIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCQkJIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKwkJCSAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCiAgIC8qIHJlYWQgMTAgYnl0ZXMgKi8KICAgYnl0ZXMgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOwotICBhc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KLSAgYXNzZXJ0ICggbWVtY21wIChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLworICBnX2Fzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLworICBnX2Fzc2VydCAoIG1lbWNtcCAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KIAogICBieXRlcyA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCA2LCBOVUxMKTsKICAgYnl0ZXMgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgNSwgTlVMTCk7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlci5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYwppbmRleCA1Yzc1MjczLi45ZmI2OGI5IDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlci5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0bWVtb3J5YnVmZmVyLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogCiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgpAQCAtMjUsNzQgKzI0LDIwMCBAQAogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KIAotI2RlZmluZSBURVNUX0RBVEEgeyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicgfQorc3RhdGljIGNvbnN0IGdjaGFyIFRFU1RfREFUQVsxMV0gPSAiYWJjZGVmZ2hpaiI7CiAKICNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYyIKIAogLyogdGVzdCBvYmplY3QgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICovCiBzdGF0aWMgdm9pZAotdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kodm9pZCkKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQogewogICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOwotICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIE5VTEwpOwotICBhc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJidWZfc2l6ZSIsIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKIH0KIAogc3RhdGljIHZvaWQKLXRlc3Rfb3Blbl9hbmRfY2xvc2Uodm9pZCkKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2xhcmdlICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ1Zl9zaXplIiwgMTAgKiAxMDI0ICogMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9kZWZhdWx0ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2V4dGVybmFsICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBHQnl0ZUFycmF5ICpidWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICBnX2Fzc2VydCAoYnVmICE9IE5VTEwpOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZiIsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV91bm93bmVkICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBHVmFsdWUgdmFsID0gR19WQUxVRV9JTklUOworICBHQnl0ZUFycmF5ICpidWY7CisKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJvd25lciIsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworCisgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR19UWVBFX1BPSU5URVIpOworICBnX29iamVjdF9nZXRfcHJvcGVydHkgKG9iamVjdCwgImJ1ZiIsICZ2YWwpOworICBidWYgPSAoR0J5dGVBcnJheSopIGdfdmFsdWVfZ2V0X3BvaW50ZXIgKCZ2YWwpOworICBnX2Fzc2VydCAoYnVmICE9IE5VTEwpOworCisgIGdfYnl0ZV9hcnJheV91bnJlZiAoYnVmKTsKKyAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9vcGVuX2FuZF9jbG9zZSAodm9pZCkKIHsKICAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0YnVmZmVyID0gTlVMTDsKIAogICAvKiBjcmVhdGUgYSBUaHJpZnRNZW1vcnlCdWZmZXIgKi8KICAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgTlVMTCk7CiAKLSAgLyogdGhpcyBzaG91bGRuJ3Qgd29yayAqLwotICBhc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX29wZW4gKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLCBOVUxMKSA9PSBUUlVFKTsKLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9pc19vcGVuIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSkgPT0gVFJVRSk7Ci0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfY2xvc2UgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLCBOVUxMKSA9PSBUUlVFKTsKKyAgLyogbm8tb3BzICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9vcGVuIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwgTlVMTCkgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9pc19vcGVuIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSkgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbG9zZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksIE5VTEwpID09IFRSVUUpOworCiAgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKIH0KIAogc3RhdGljIHZvaWQKLXRlc3RfcmVhZF9hbmRfd3JpdGUodm9pZCkKK3Rlc3RfcmVhZF9hbmRfd3JpdGUgKHZvaWQpCiB7CiAgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdGJ1ZmZlciA9IE5VTEw7Ci0gIGd1Y2hhciBidWZbMTBdID0gVEVTVF9EQVRBOwotICBndWNoYXIgcmVhZFsxMF07CisgIGdpbnQgZ290LCB3YW50OworICBnY2hhciByZWFkWzEwXTsKKyAgZ2NoYXIgKmI7CiAgIEdFcnJvciAqZXJyb3IgPSBOVUxMOwogCiAgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDUsIE5VTEwpOwotICBhc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBidWYsCisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgJmVycm9yKSA9PSBGQUxTRSk7Ci0gIGFzc2VydCAoZXJyb3IgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChlcnJvciAhPSBOVUxMKTsKICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgIGVycm9yID0gTlVMTDsKICAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOwogCiAgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDE1LCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgYnVmLCAxMCwgJmVycm9yKSA9PSBUUlVFKTsKLSAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBURVNUX0RBVEEsIDEwLCAmZXJyb3IpID09IFRSVUUpOworICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZCwgMTAsICZlcnJvcikgPiAwKTsKLSAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgbWVtc2V0KHJlYWQsIDAsIDEwKTsKKyAgYiA9IHJlYWQ7CisgIHdhbnQgPSAxMDsKKyAgd2hpbGUgKHdhbnQgPiAwKSB7CisgICAgZ290ID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZCAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBiLCB3YW50LCAmZXJyb3IpOworICAgIGdfYXNzZXJ0IChnb3QgPiAwICYmIGdvdCA8PSB3YW50KTsKKyAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgYiArPSBnb3Q7CisgICAgd2FudCAtPSBnb3Q7CisgIH0KKyAgZ19hc3NlcnQgKG1lbWNtcCAocmVhZCwgVEVTVF9EQVRBLCAxMCkgPT0gMCk7CisgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfZGVmYXVsdCAodm9pZCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0YnVmZmVyID0gTlVMTDsKKyAgZ2ludCBnb3QsIHdhbnQsIGk7CisgIGdjaGFyIHJlYWRbMTBdOworICBnY2hhciAqYjsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgTlVMTCk7CisgIGZvciAoaSA9IDA7IGkgPCAxMDA7ICsraSkgeworICAgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBURVNUX0RBVEEsIDEwLCAmZXJyb3IpID09IFRSVUUpOworICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCAxMDA7ICsraSkgeworICAgIG1lbXNldChyZWFkLCAwLCAxMCk7CisgICAgYiA9IHJlYWQ7CisgICAgd2FudCA9IDEwOworICAgIHdoaWxlICh3YW50ID4gMCkgeworICAgICAgZ290ID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZCAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIGIsIHdhbnQsICZlcnJvcik7CisgICAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBiICs9IGdvdDsKKyAgICAgIHdhbnQgLT0gZ290OworICAgIH0KKyAgICBnX2Fzc2VydCAobWVtY21wIChyZWFkLCBURVNUX0RBVEEsIDEwKSA9PSAwKTsKKyAgfQorICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX2V4dGVybmFsICh2b2lkKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRidWZmZXIgPSBOVUxMOworICBnY2hhciAqYjsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIEdCeXRlQXJyYXkgKmJ1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7CisgIGdfYXNzZXJ0IChidWYgIT0gTlVMTCk7CisKKyAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1ZiIsIGJ1ZiwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLCAxMCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgIGdfYXNzZXJ0IChtZW1jbXAgKGJ1Zi0+ZGF0YSwgVEVTVF9EQVRBLCAxMCkgPT0gMCk7CisgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKIH0KIAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKLSAgZ190eXBlX2luaXQoKTsKKyAgZ190eXBlX2luaXQgKCk7CiAjZW5kaWYKIAogICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKIAogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9DcmVhdGVBbmREZXN0cm95TGFyZ2UiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9sYXJnZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL0NyZWF0ZUFuZERlc3Ryb3lVbmxpbWl0ZWQiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9kZWZhdWx0KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveUV4dGVybmFsIiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfZXh0ZXJuYWwpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9DcmVhdGVBbmREZXN0cm95VW5vd25lZCIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95X3Vub3duZWQpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9PcGVuQW5kQ2xvc2UiLCB0ZXN0X29wZW5fYW5kX2Nsb3NlKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvUmVhZEFuZFdyaXRlIiwgdGVzdF9yZWFkX2FuZF93cml0ZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL1JlYWRBbmRXcml0ZVVubGltaXRlZCIsIHRlc3RfcmVhZF9hbmRfd3JpdGVfZGVmYXVsdCk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL1JlYWRBbmRXcml0ZUV4dGVybmFsIiwgdGVzdF9yZWFkX2FuZF93cml0ZV9leHRlcm5hbCk7CiAKICAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0b3B0aW9uYWxyZXF1aXJlZC5jCmluZGV4IGFlMGMzZDIuLjYzNmMzNmQgMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0b3B0aW9uYWxyZXF1aXJlZC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0b3B0aW9uYWxyZXF1aXJlZC5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8Z2xpYi5oPgogCiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0Lmg+CkBAIC03NiwxOCArNzUsMTggQEAKIAogICAvKiB3cml0ZS10by1yZWFkIHdpdGggb3B0aW9uYWwgZmllbGRzICovCiAgIHMxLT5pbV9vcHRpb25hbCA9IDEwOwotICBhc3NlcnQgKHMxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gRkFMU0UpOwotICBhc3NlcnQgKHMxLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IEZBTFNFKTsgIAorICBnX2Fzc2VydCAoczEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0IChzMS0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBGQUxTRSk7ICAKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAoczEpLCBUSFJJRlRfU1RSVUNUIChzMiksIE5VTEwsIE5VTEwpOwotICBhc3NlcnQgKHMyLT5fX2lzc2V0X2ltX2RlZmF1bHQgPSBUUlVFKTsKLSAgYXNzZXJ0IChzMi0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBGQUxTRSk7Ci0gIGFzc2VydCAoczItPmltX29wdGlvbmFsID09IDApOworICBnX2Fzc2VydCAoczItPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHMyLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKHMyLT5pbV9vcHRpb25hbCA9PSAwKTsKIAogICBzMS0+X19pc3NldF9pbV9vcHRpb25hbCA9IFRSVUU7CiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHMxKSwgVEhSSUZUX1NUUlVDVCAoczMpLCBOVUxMLCBOVUxMKTsKLSAgYXNzZXJ0IChzMy0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOwotICBhc3NlcnQgKHMzLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IFRSVUUpOwotICBhc3NlcnQgKHMzLT5pbV9vcHRpb25hbCA9PSAxMCk7CisgIGdfYXNzZXJ0IChzMy0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOworICBnX2Fzc2VydCAoczMtPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChzMy0+aW1fb3B0aW9uYWwgPT0gMTApOwogCiAgIGdfb2JqZWN0X3VucmVmIChzMSk7CiAgIGdfb2JqZWN0X3VucmVmIChzMik7CkBAIC0xMDksMTAgKzEwOCwxMCBAQAogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MiksIFRIUklGVF9TVFJVQ1QgKHQxKSwgTlVMTCwgTlVMTCk7CiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQxKSwgVEhSSUZUX1NUUlVDVCAodDIpLCBOVUxMLCBOVUxMKTsKIAotICBhc3NlcnQgKHQxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gRkFMU0UpOwotICBhc3NlcnQgKHQyLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IFRSVUUpOwotICBhc3NlcnQgKHQxLT5pbV9kZWZhdWx0ID09IHQyLT5pbV9vcHRpb25hbCk7Ci0gIGFzc2VydCAodDEtPmltX2RlZmF1bHQgPT0gMCk7CisgIGdfYXNzZXJ0ICh0MS0+X19pc3NldF9pbV9kZWZhdWx0ID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKHQyLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IFRSVUUpOworICBnX2Fzc2VydCAodDEtPmltX2RlZmF1bHQgPT0gdDItPmltX29wdGlvbmFsKTsKKyAgZ19hc3NlcnQgKHQxLT5pbV9kZWZhdWx0ID09IDApOwogCiAgIGdfb2JqZWN0X3VucmVmICh0MSk7CiAgIGdfb2JqZWN0X3VucmVmICh0Mik7CkBAIC0xMzMsNyArMTMyLDcgQEAKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDEpLCBUSFJJRlRfU1RSVUNUICh0MyksIE5VTEwsIE5VTEwpOwogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MyksIFRIUklGVF9TVFJVQ1QgKHQxKSwgTlVMTCwgTlVMTCk7CiAKLSAgYXNzZXJ0ICh0MS0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOworICBnX2Fzc2VydCAodDEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBUUlVFKTsKIAogICBnX29iamVjdF91bnJlZiAodDEpOwogICBnX29iamVjdF91bnJlZiAodDMpOwpAQCAtMTc2LDE3ICsxNzUsMzcgQEAKIAogICAvKiB0aHJvd3MgcHJvdG9jb2wgZXhjZXB0aW9uICovCiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQyKSwgVEhSSUZUX1NUUlVDVCAodDMpLCBOVUxMLCAmcmVhZF9lcnJvcik7Ci0gIGFzc2VydCAocmVhZF9lcnJvciAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKHJlYWRfZXJyb3IgIT0gTlVMTCk7CiAgIGdfZXJyb3JfZnJlZSAocmVhZF9lcnJvcik7CiAKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDMpLCBUSFJJRlRfU1RSVUNUICh0MiksIE5VTEwsIE5VTEwpOwogCi0gIGFzc2VydCAodDItPl9faXNzZXRfaW1fb3B0aW9uYWwpOworICBnX2Fzc2VydCAodDItPl9faXNzZXRfaW1fb3B0aW9uYWwpOwogCiAgIGdfb2JqZWN0X3VucmVmICh0Mik7CiAgIGdfb2JqZWN0X3VucmVmICh0Myk7CiB9CiAKK3N0YXRpYyB2b2lkCit0ZXN0X25vbl9zZXRfYmluYXJ5ICh2b2lkKQoreworICBUVGVzdEJpbmFyaWVzICpiMSA9IE5VTEw7CisgIFRUZXN0QmluYXJpZXMgKmIyID0gTlVMTDsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgYjEgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0JJTkFSSUVTLCBOVUxMKTsKKyAgYjIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0JJTkFSSUVTLCBOVUxMKTsKKworICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUIChiMSksIFRIUklGVF9TVFJVQ1QgKGIyKSwgTlVMTCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAoYjIpLCBUSFJJRlRfU1RSVUNUIChiMSksIE5VTEwsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIC8qIE9LLiBObyBzZWdmYXVsdCAqLworCisgIGdfb2JqZWN0X3VucmVmIChiMSk7CisgIGdfb2JqZWN0X3VucmVmIChiMik7Cit9CisKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewpAQCAtMjAyLDYgKzIyMSw3IEBACiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9Ucmlja3kyIiwgdGVzdF90cmlja3kyKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL1RyaWNreTMiLCB0ZXN0X3RyaWNreTMpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG9wdGlvbmFscmVxdWlyZWQvVHJpY2t5NCIsIHRlc3RfdHJpY2t5NCk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9CaW5hcnkiLCB0ZXN0X25vbl9zZXRfYmluYXJ5KTsKIAogICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2VyaWFsaXphdGlvbi5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNDExZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2VyaWFsaXphdGlvbi5jCkBAIC0wLDAgKzEsOTUgQEAKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCIKKyNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaCIKKworc3RhdGljIHZvaWQgZW51bV9jb25zdGFudHNfcmVhZF93cml0ZSgpIHsKKyAgR0Vycm9yKiBlcnJvciA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCogdHJhbnNwb3J0CisgICAgICA9IFRIUklGVF9UUkFOU1BPUlQoZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDEwMjQsIE5VTEwpKTsKKyAgVGhyaWZ0UHJvdG9jb2wqIHByb3RvY29sCisgICAgICA9IFRIUklGVF9QUk9UT0NPTChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LCBOVUxMKSk7CisgIFRUZXN0RW51bVRlc3RTdHJ1Y3QqIHNyYyA9IFRfVEVTVF9FTlVNX1RFU1Q7CisgIFRUZXN0RW51bVRlc3RTdHJ1Y3QqIGRzdCA9IGdfb2JqZWN0X25ldyhUX1RFU1RfVFlQRV9FTlVNX1RFU1RfU1RSVUNULCBOVUxMKTsKKyAgVFRlc3RFbnVtVGVzdFN0cnVjdENsYXNzKiBjbHMgPSBUX1RFU1RfRU5VTV9URVNUX1NUUlVDVF9HRVRfQ0xBU1Moc3JjKTsKKyAgaW50IHdyaXRlX2xlbjsKKyAgaW50IHJlYWRfbGVuOworCisgIHdyaXRlX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+d3JpdGUoVEhSSUZUX1NUUlVDVChzcmMpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnQod3JpdGVfbGVuID4gMCk7CisKKyAgcmVhZF9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPnJlYWQoVEhSSUZUX1NUUlVDVChkc3QpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnRfY21waW50KHdyaXRlX2xlbiwgPT0sIHJlYWRfbGVuKTsKKworICBnX29iamVjdF91bnJlZihkc3QpOworICBnX29iamVjdF91bnJlZihwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmKHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cnVjdF9jb25zdGFudHNfcmVhZF93cml0ZSgpIHsKKyAgR0Vycm9yKiBlcnJvciA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCogdHJhbnNwb3J0CisgICAgICA9IFRIUklGVF9UUkFOU1BPUlQoZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDQwOTYsIE5VTEwpKTsKKyAgVGhyaWZ0UHJvdG9jb2wqIHByb3RvY29sCisgICAgICA9IFRIUklGVF9QUk9UT0NPTChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LCBOVUxMKSk7CisgIFRUZXN0Q29tcGFjdFByb3RvVGVzdFN0cnVjdCogc3JjID0gVF9URVNUX0NPTVBBQ1RfVEVTVDsKKyAgVFRlc3RDb21wYWN0UHJvdG9UZXN0U3RydWN0KiBkc3QgPSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfQ09NUEFDVF9QUk9UT19URVNUX1NUUlVDVCwgTlVMTCk7CisgIFRUZXN0Q29tcGFjdFByb3RvVGVzdFN0cnVjdENsYXNzKiBjbHMgPSBUX1RFU1RfQ09NUEFDVF9QUk9UT19URVNUX1NUUlVDVF9HRVRfQ0xBU1Moc3JjKTsKKyAgaW50IHdyaXRlX2xlbjsKKyAgaW50IHJlYWRfbGVuOworCisgIHdyaXRlX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+d3JpdGUoVEhSSUZUX1NUUlVDVChzcmMpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnQod3JpdGVfbGVuID4gMCk7CisKKyAgcmVhZF9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPnJlYWQoVEhSSUZUX1NUUlVDVChkc3QpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnRfY21waW50KHdyaXRlX2xlbiwgPT0sIHJlYWRfbGVuKTsKKworICBnX29iamVjdF91bnJlZihkc3QpOworICBnX29iamVjdF91bnJlZihwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmKHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cnVjdF9yZWFkX3dyaXRlX2xlbmd0aF9zaG91bGRfZXF1YWwoKSB7CisgIEdFcnJvciogZXJyb3IgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQqIHRyYW5zcG9ydAorICAgICAgPSBUSFJJRlRfVFJBTlNQT1JUKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCAyMDQ4LCBOVUxMKSk7CisgIFRocmlmdFByb3RvY29sKiBwcm90b2NvbAorICAgICAgPSBUSFJJRlRfUFJPVE9DT0woZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwgTlVMTCkpOworICBUVGVzdEJvbmsqIHNyYyA9IGdfb2JqZWN0X25ldyhUX1RFU1RfVFlQRV9CT05LLCBOVUxMKTsKKyAgVFRlc3RCb25rKiBkc3QgPSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfQk9OSywgTlVMTCk7CisgIFRUZXN0Qm9ua0NsYXNzKiBjbHMgPSBUX1RFU1RfQk9OS19HRVRfQ0xBU1Moc3JjKTsKKyAgaW50IHdyaXRlX2xlbjsKKyAgaW50IHJlYWRfbGVuOworCisgIHdyaXRlX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+d3JpdGUoVEhSSUZUX1NUUlVDVChzcmMpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnQod3JpdGVfbGVuID4gMCk7CisKKyAgcmVhZF9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPnJlYWQoVEhSSUZUX1NUUlVDVChkc3QpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnRfY21waW50KHdyaXRlX2xlbiwgPT0sIHJlYWRfbGVuKTsKKworICBnX29iamVjdF91bnJlZihkc3QpOworICBnX29iamVjdF91bnJlZihzcmMpOworICBnX29iamVjdF91bnJlZihwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmKHRyYW5zcG9ydCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTigyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKyAgZ190ZXN0X2luaXQoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMoIi90ZXN0c2VyaWFsaXphdGlvbi9TdHJ1Y3RSZWFkV3JpdGVMZW5ndGhTaG91bGRFcXVhbCIsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3RfcmVhZF93cml0ZV9sZW5ndGhfc2hvdWxkX2VxdWFsKTsKKyAgZ190ZXN0X2FkZF9mdW5jKCIvdGVzdHNlcmlhbGl6YXRpb24vU3RydWN0Q29uc3RhbnRzIiwgc3RydWN0X2NvbnN0YW50c19yZWFkX3dyaXRlKTsKKyAgZ190ZXN0X2FkZF9mdW5jKCIvdGVzdHNlcmlhbGl6YXRpb24vRW51bUNvbnN0YW50cyIsIGVudW1fY29uc3RhbnRzX3JlYWRfd3JpdGUpOworICByZXR1cm4gZ190ZXN0X3J1bigpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2ltcGxlc2VydmVyLmMKaW5kZXggM2FmMmVlYi4uM2M2ZjJlOCAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHNpbXBsZXNlcnZlci5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8Z2xpYi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgpAQCAtODksNyArODgsNyBAQAogCiAgIC8qIHJ1biB0aGUgc2VydmVyIGluIGEgY2hpbGQgcHJvY2VzcyAqLwogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKHBpZCA+PSAwKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKIAogICBpZiAocGlkID09IDApCiAgIHsKQEAgLTEwMyw4ICsxMDIsOCBAQAogICAgIGdfb2JqZWN0X3VucmVmIChzcyk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHRzcyk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHApOwotICAgIGFzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKLSAgICBhc3NlcnQgKHN0YXR1cyA9PSBTSUdJTlQpOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gU0lHSU5UKTsKICAgfQogfQogCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzdHJ1Y3QuYwppbmRleCA1ZDRiYWYzLi5kMTIwY2JjIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c3RydWN0LmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgogCiAjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jIgpAQCAtODksNyArODgsNyBAQAogICBUaHJpZnRUZXN0U3RydWN0ICp0ID0gTlVMTDsKIAogICB0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9URVNUX1NUUlVDVCwgTlVMTCk7Ci0gIGFzc2VydCAoIFRIUklGVF9JU19TVFJVQ1QgKHQpKTsKKyAgZ19hc3NlcnQgKCBUSFJJRlRfSVNfU1RSVUNUICh0KSk7CiAgIHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAodCksIE5VTEwsIE5VTEwpOwogICB0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh0KSwgTlVMTCwgTlVMTCk7CiAgIHRocmlmdF90ZXN0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICh0KSwgTlVMTCwgTlVMTCk7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3QuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdC5jCmluZGV4IDVmMGY2ZTMuLjIzYTkzNGQgMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdC5jCkBAIC0xLDkgKzEsMTIgQEAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CiAKKyNpbmNsdWRlICJ0X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaCIKKyNpbmNsdWRlICJ0aHJpZnRfdGVzdF9oYW5kbGVyLmgiCisKIHN0YXRpYyBjb25zdCBjaGFyIFRFU1RfQUREUkVTU1tdID0gImxvY2FsaG9zdCI7CiBzdGF0aWMgY29uc3QgaW50IFRFU1RfUE9SVCA9IDY0NDQ0OwogCkBAIC0xNiw2ICsxOSw4MyBAQAogICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiB9CiAKK3N0YXRpYyB2b2lkCitzZXRfaW5kaWNhdG9yIChncG9pbnRlciBkYXRhLCBHT2JqZWN0ICp3aGVyZV90aGVfb2JqZWN0X3dhcykgeworICBUSFJJRlRfVU5VU0VEX1ZBUih3aGVyZV90aGVfb2JqZWN0X3dhcyk7CisKKyAgKihnYm9vbGVhbiAqKSBkYXRhID0gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfdGhyaWZ0X2hhbmRsZXIgKHZvaWQpCit7CisgIEdFcnJvciAqZXJyb3I7CisgIEdIYXNoVGFibGUgKl9yZXR1cm47CisgIFRUZXN0SW5zYW5pdHkgKmFyZ3VtZW50OworICBnYm9vbGVhbiBpbmRpY2F0b3I7CisKKyAgVFRlc3RYdHJ1Y3QgICp4dHJ1Y3QsICAqeHRydWN0MjsKKyAgVFRlc3ROdW1iZXJ6IG51bWJlcno7CisgIFRUZXN0TnVtYmVyeiBudW1iZXJ6MjsKKyAgVFRlc3RVc2VySWQgdXNlcl9pZCwgKnVzZXJfaWRfcHRyLCAqdXNlcl9pZF9wdHIyOworICBHSGFzaFRhYmxlICp1c2VyX21hcDsKKyAgR1B0ckFycmF5ICp4dHJ1Y3RzOworCisgIGVycm9yID0gTlVMTDsKKyAgaW5kaWNhdG9yID0gRkFMU0U7CisKKyAgdXNlcl9tYXAgPSBOVUxMOworICB4dHJ1Y3RzID0gTlVMTDsKKworICBhcmd1bWVudCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSU5TQU5JVFksIE5VTEwpOworICBnX29iamVjdF9nZXQgKGFyZ3VtZW50LAorICAgICAgICAgICAgICAgICJ1c2VyTWFwIiwgJnVzZXJfbWFwLAorICAgICAgICAgICAgICAgICJ4dHJ1Y3RzIiwgJnh0cnVjdHMsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgbnVtYmVyeiA9IFRfVEVTVF9OVU1CRVJaX0ZJVkU7CisgIG51bWJlcnoyID0gVF9URVNUX05VTUJFUlpfRUlHSFQ7CisgIHVzZXJfaWRfcHRyID0gZ19tYWxsb2MgKHNpemVvZiAqdXNlcl9pZF9wdHIpOworICAqdXNlcl9pZF9wdHIgPSA1OworICB1c2VyX2lkX3B0cjIgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkX3B0cik7CisgICp1c2VyX2lkX3B0cjIgPSA4OworICBnX2hhc2hfdGFibGVfaW5zZXJ0ICh1c2VyX21hcCwgKGdwb2ludGVyKW51bWJlcnosIHVzZXJfaWRfcHRyKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAodXNlcl9tYXAsIChncG9pbnRlciludW1iZXJ6MiwgdXNlcl9pZF9wdHIyKTsKKyAgZ19oYXNoX3RhYmxlX3VucmVmICh1c2VyX21hcCk7CisKKyAgeHRydWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJIZWxsbzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAyTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHh0cnVjdDIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJHb29kYnllNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIDRMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfcHRyX2FycmF5X2FkZCAoeHRydWN0cywgeHRydWN0Mik7CisgIGdfcHRyX2FycmF5X2FkZCAoeHRydWN0cywgeHRydWN0KTsKKyAgZ19wdHJfYXJyYXlfdW5yZWYgKHh0cnVjdHMpOworCisgIF9yZXR1cm4gPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50NjRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnQ2NF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpZ19oYXNoX3RhYmxlX3VucmVmKTsKKworICBnX29iamVjdF93ZWFrX3JlZiAoR19PQkpFQ1QgKGFyZ3VtZW50KSwgc2V0X2luZGljYXRvciwgKGdwb2ludGVyKSAmaW5kaWNhdG9yKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2luc2FuaXR5IChOVUxMLCAmX3JldHVybiwgYXJndW1lbnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoISBpbmRpY2F0b3IpOworCisgIGdfaGFzaF90YWJsZV91bnJlZiAoX3JldHVybik7CisgIGdfYXNzZXJ0ICghIGluZGljYXRvcik7CisKKyAgZ19vYmplY3RfdW5yZWYgKGFyZ3VtZW50KTsKKyAgZ19hc3NlcnQgKGluZGljYXRvcik7Cit9CisKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewpAQCAtMjYsNiArMTA2LDcgQEAKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0aHJpZnQvU2VydmVyIiwgdGVzdF90aHJpZnRfc2VydmVyKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0aHJpZnQvSGFuZGxlciIsIHRlc3RfdGhyaWZ0X2hhbmRsZXIpOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcCBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBlNjE4ZmU5Li4yMGZiY2RiCi0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcApAQCAtMTcsNyArMTcsNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyogdGVzdCBhIEMgY2xpZW50IHdpdGggYSBDKysgc2VydmVyICovCisvKiB0ZXN0IGEgQyBjbGllbnQgd2l0aCBhIEMrKyBzZXJ2ZXIgICh0aGF0IG1ha2VzIHNlbnNlLi4uKSAqLwogCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0yNSwyMyArMjUsMzQgQEAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgIlRocmlmdFRlc3QuaCIKICNpbmNsdWRlICJUaHJpZnRUZXN0X3R5cGVzLmgiCiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogCiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwogCit1c2luZyBzdGQ6OmNvdXQ7Cit1c2luZyBzdGQ6OmVuZGw7Cit1c2luZyBzdGQ6OmZpeGVkOwordXNpbmcgc3RkOjptYWtlX3BhaXI7Cit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6c2V0OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKwogI2RlZmluZSBURVNUX1BPUlQgOTk4MAogCiAvLyBFeHRyYSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIFRocmlmdFRlc3RfdHlwZXMgdG8gd29yawpAQCAtNTYsMTMxICs2NywxMzMgQEAKIAogY2xhc3MgVGVzdEhhbmRsZXIgOiBwdWJsaWMgVGhyaWZ0VGVzdElmIHsKICAgcHVibGljOgotICBUZXN0SGFuZGxlcigpIHt9CisgIFRlc3RIYW5kbGVyKCkgPSBkZWZhdWx0OwogCi0gIHZvaWQgdGVzdFZvaWQoKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RWb2lkKClcbiIpOworICB2b2lkIHRlc3RWb2lkKCkgb3ZlcnJpZGUgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdFZvaWQoKSIgPDwgZW5kbDsKICAgfQogCi0gIHZvaWQgdGVzdFN0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nICZ0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0U3RyaW5nKFwiJXNcIilcbiIsIHRoaW5nLmNfc3RyKCkpOworICB2b2lkIHRlc3RTdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyAmdGhpbmcpIG92ZXJyaWRlIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RTdHJpbmcoXCIiIDw8IHRoaW5nIDw8ICJcIikiIDw8IGVuZGw7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAotICBib29sIHRlc3RCb29sKGNvbnN0IGJvb2wgdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdEJvb2woJXMpXG4iLCB0aGluZyA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICBib29sIHRlc3RCb29sKGNvbnN0IGJvb2wgdGhpbmcpIG92ZXJyaWRlIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RCb29sKCIgPDwgKHRoaW5nID8gInRydWUiIDogImZhbHNlIikgPDwgIikiIDw8IGVuZGw7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9Ci0gIGludDhfdCB0ZXN0Qnl0ZShjb25zdCBpbnQ4X3QgdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdEJ5dGUoJWQpXG4iLCAoaW50KXRoaW5nKTsKKyAgaW50OF90IHRlc3RCeXRlKGNvbnN0IGludDhfdCB0aGluZykgb3ZlcnJpZGUgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEJ5dGUoIiA8PCAoaW50KXRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsKICAgfQotICBpbnQzMl90IHRlc3RJMzIoY29uc3QgaW50MzJfdCB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0STMyKCVkKVxuIiwgdGhpbmcpOworICBpbnQzMl90IHRlc3RJMzIoY29uc3QgaW50MzJfdCB0aGluZykgb3ZlcnJpZGUgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEkzMigiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCi0gIGludDY0X3QgdGVzdEk2NChjb25zdCBpbnQ2NF90IHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RJNjQoJWxkKVxuIiwgdGhpbmcpOworICBpbnQ2NF90IHRlc3RJNjQoY29uc3QgaW50NjRfdCB0aGluZykgb3ZlcnJpZGUgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEk2NCgiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCi0gIGRvdWJsZSB0ZXN0RG91YmxlKGNvbnN0IGRvdWJsZSB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0RG91YmxlKCVsZilcbiIsIHRoaW5nKTsKKyAgZG91YmxlIHRlc3REb3VibGUoY29uc3QgZG91YmxlIHRoaW5nKSBvdmVycmlkZSB7CisgICAgY291dC5wcmVjaXNpb24oNik7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0RG91YmxlKCIgPDwgZml4ZWQgPDwgdGhpbmcgPDwgIikiIDw8IGVuZGw7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKLSAgdm9pZCB0ZXN0QmluYXJ5KHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcgJnRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RCaW5hcnkoXCIlc1wiKVxuIiwgdGhpbmcuY19zdHIoKSk7CisgIHZvaWQgdGVzdEJpbmFyeShzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nICZ0aGluZykgb3ZlcnJpZGUgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEJpbmFyeShcIiIgPDwgdGhpbmcgPDwgIlwiKSIgPDwgZW5kbDsKICAgICBvdXQgPSB0aGluZzsKICAgfQogCi0gIHZvaWQgdGVzdFN0cnVjdChYdHJ1Y3QmIG91dCwgY29uc3QgWHRydWN0ICZ0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJWxkfSlcbiIsIHRoaW5nLnN0cmluZ190aGluZy5jX3N0cigpLCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKTsKKyAgdm9pZCB0ZXN0U3RydWN0KFh0cnVjdCYgb3V0LCBjb25zdCBYdHJ1Y3QgJnRoaW5nKSBvdmVycmlkZSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0U3RydWN0KHtcIiIgPDwgdGhpbmcuc3RyaW5nX3RoaW5nIDw8ICJcIiwgIiA8PCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcgPDwgIiwgIiA8PCB0aGluZy5pMzJfdGhpbmcgPDwgIiwgIiA8PCB0aGluZy5pNjRfdGhpbmcgPDwgIn0pIiA8PCBlbmRsOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKLSAgdm9pZCB0ZXN0TmVzdChYdHJ1Y3QyJiBvdXQsIGNvbnN0IFh0cnVjdDImIG5lc3QpIHsKKyAgdm9pZCB0ZXN0TmVzdChYdHJ1Y3QyJiBvdXQsIGNvbnN0IFh0cnVjdDImIG5lc3QpIG92ZXJyaWRlIHsKICAgICBjb25zdCBYdHJ1Y3QgJnRoaW5nID0gbmVzdC5zdHJ1Y3RfdGhpbmc7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlbGR9LCAlZH0pXG4iLCAoaW50KW5lc3QuYnl0ZV90aGluZywgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcsIG5lc3QuaTMyX3RoaW5nKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3ROZXN0KHsiIDw8IChpbnQpbmVzdC5ieXRlX3RoaW5nIDw8ICIsIHtcIiIgPDwgdGhpbmcuc3RyaW5nX3RoaW5nIDw8ICJcIiwgIiA8PCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcgPDwgIiwgIiA8PCB0aGluZy5pMzJfdGhpbmcgPDwgIiwgIiA8PCB0aGluZy5pNjRfdGhpbmcgPDwgIn0sICIgPDwgbmVzdC5pMzJfdGhpbmcgPDwgIn0pIiA8PCBlbmRsOwogICAgIG91dCA9IG5lc3Q7CiAgIH0KIAotICB2b2lkIHRlc3RNYXAobWFwPGludDMyX3QsIGludDMyX3Q+ICZvdXQsIGNvbnN0IG1hcDxpbnQzMl90LCBpbnQzMl90PiAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdE1hcCh7Iik7CisgIHZvaWQgdGVzdE1hcChtYXA8aW50MzJfdCwgaW50MzJfdD4gJm91dCwgY29uc3QgbWFwPGludDMyX3QsIGludDMyX3Q+ICZ0aGluZykgb3ZlcnJpZGUgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdE1hcCh7IjsKICAgICBtYXA8aW50MzJfdCwgaW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICBmb3IgKG1faXRlciA9IHRoaW5nLmJlZ2luKCk7IG1faXRlciAhPSB0aGluZy5lbmQoKTsgKyttX2l0ZXIpIHsKICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICBjb3V0IDw8ICIsICI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkID0+ICVkIiwgbV9pdGVyLT5maXJzdCwgbV9pdGVyLT5zZWNvbmQpOworICAgICAgY291dCA8PCBtX2l0ZXItPmZpcnN0IDw8ICIgPT4gIiA8PCBtX2l0ZXItPnNlY29uZDsKICAgICB9Ci0gICAgcHJpbnRmKCJ9KVxuIik7CisgICAgY291dCA8PCAifSkiIDw8IGVuZGw7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RTdHJpbmdNYXAobWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJm91dCwgY29uc3QgbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJnRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RTdHJpbmdNYXAoeyIpOworICB2b2lkIHRlc3RTdHJpbmdNYXAobWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJm91dCwgY29uc3QgbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJnRoaW5nKSBvdmVycmlkZSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0U3RyaW5nTWFwKHsiOwogICAgIG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChtX2l0ZXIgPSB0aGluZy5iZWdpbigpOyBtX2l0ZXIgIT0gdGhpbmcuZW5kKCk7ICsrbV9pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCJcIiVzXCIgPT4gXCIlc1wiIiwgKG1faXRlci0+Zmlyc3QpLmNfc3RyKCksIChtX2l0ZXItPnNlY29uZCkuY19zdHIoKSk7CisgICAgICBjb3V0IDw8ICJcIiIgPDwgbV9pdGVyLT5maXJzdCA8PCAiXCIgPT4gXCIiIDw8IG1faXRlci0+c2Vjb25kIDw8ICJcIiI7CiAgICAgfQotICAgIHByaW50ZigifSlcbiIpOworICAgIGNvdXQgPDwgIn0pIiA8PCBlbmRsOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKIAotICB2b2lkIHRlc3RTZXQoc2V0PGludDMyX3Q+ICZvdXQsIGNvbnN0IHNldDxpbnQzMl90PiAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdFNldCh7Iik7CisgIHZvaWQgdGVzdFNldChzZXQ8aW50MzJfdD4gJm91dCwgY29uc3Qgc2V0PGludDMyX3Q+ICZ0aGluZykgb3ZlcnJpZGUgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdFNldCh7IjsKICAgICBzZXQ8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICBmb3IgKHNfaXRlciA9IHRoaW5nLmJlZ2luKCk7IHNfaXRlciAhPSB0aGluZy5lbmQoKTsgKytzX2l0ZXIpIHsKICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICBjb3V0IDw8ICIsICI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKnNfaXRlcik7CisgICAgICBjb3V0IDw8ICpzX2l0ZXI7CiAgICAgfQotICAgIHByaW50ZigifSlcbiIpOworICAgIGNvdXQgPDwgIn0pIiA8PCBlbmRsOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKLSAgdm9pZCB0ZXN0TGlzdCh2ZWN0b3I8aW50MzJfdD4gJm91dCwgY29uc3QgdmVjdG9yPGludDMyX3Q+ICZ0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0TGlzdCh7Iik7CisgIHZvaWQgdGVzdExpc3QodmVjdG9yPGludDMyX3Q+ICZvdXQsIGNvbnN0IHZlY3RvcjxpbnQzMl90PiAmdGhpbmcpIG92ZXJyaWRlIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RMaXN0KHsiOwogICAgIHZlY3RvcjxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbF9pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgIGZvciAobF9pdGVyID0gdGhpbmcuYmVnaW4oKTsgbF9pdGVyICE9IHRoaW5nLmVuZCgpOyArK2xfaXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgeyAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY291dCA8PCAiLCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpsX2l0ZXIpOworICAgICAgY291dCA8PCAqbF9pdGVyOwogICAgIH0KLSAgICBwcmludGYoIn0pXG4iKTsKKyAgICBjb3V0IDw8ICJ9KSIgPDwgZW5kbDsKICAgICBvdXQgPSB0aGluZzsKICAgfQogCi0gIE51bWJlcno6OnR5cGUgdGVzdEVudW0oY29uc3QgTnVtYmVyejo6dHlwZSB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0RW51bSglZClcbiIsIHRoaW5nKTsKKyAgTnVtYmVyejo6dHlwZSB0ZXN0RW51bShjb25zdCBOdW1iZXJ6Ojp0eXBlIHRoaW5nKSBvdmVycmlkZSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0RW51bSgiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCi0gIFVzZXJJZCB0ZXN0VHlwZWRlZihjb25zdCBVc2VySWQgdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdFR5cGVkZWYoJWxkKVxuIiwgdGhpbmcpOworICBVc2VySWQgdGVzdFR5cGVkZWYoY29uc3QgVXNlcklkIHRoaW5nKSBvdmVycmlkZSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0VHlwZWRlZigiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsgIH0KIAotICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LGludDMyX3Q+ID4gJm1hcG1hcCwgY29uc3QgaW50MzJfdCBoZWxsbykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0TWFwTWFwKCVkKVxuIiwgaGVsbG8pOworICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LGludDMyX3Q+ID4gJm1hcG1hcCwgY29uc3QgaW50MzJfdCBoZWxsbykgb3ZlcnJpZGUgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdE1hcE1hcCgiIDw8IGhlbGxvIDw8ICIpIiA8PCBlbmRsOwogCiAgICAgbWFwPGludDMyX3QsaW50MzJfdD4gcG9zOwogICAgIG1hcDxpbnQzMl90LGludDMyX3Q+IG5lZzsKQEAgLTE5NCwxMCArMjA3LDEwIEBACiAKICAgfQogCi0gIHZvaWQgdGVzdEluc2FuaXR5KG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5PiA+ICZpbnNhbmUsIGNvbnN0IEluc2FuaXR5ICZhcmd1bWVudCkgeworICB2b2lkIHRlc3RJbnNhbml0eShtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT4gPiAmaW5zYW5lLCBjb25zdCBJbnNhbml0eSAmYXJndW1lbnQpIG92ZXJyaWRlIHsKICAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFIChhcmd1bWVudCk7CiAKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdEluc2FuaXR5KClcbiIpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEluc2FuaXR5KCkiIDw8IGVuZGw7CiAKICAgICBYdHJ1Y3QgaGVsbG87CiAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CkBAIC0yMzAsNDcgKzI0Myw0NiBAQAogICAgIGluc2FuZS5pbnNlcnQobWFrZV9wYWlyKDEsIGZpcnN0X21hcCkpOwogICAgIGluc2FuZS5pbnNlcnQobWFrZV9wYWlyKDIsIHNlY29uZF9tYXApKTsKIAotICAgIHByaW50ZigicmV0dXJuIik7Ci0gICAgcHJpbnRmKCIgPSB7Iik7CisgICAgY291dCA8PCAicmV0dXJuID0geyI7CiAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKICAgICBmb3IgKGlfaXRlciA9IGluc2FuZS5iZWdpbigpOyBpX2l0ZXIgIT0gaW5zYW5lLmVuZCgpOyArK2lfaXRlcikgewotICAgICAgcHJpbnRmKCIlbGQgPT4geyIsIGlfaXRlci0+Zmlyc3QpOworICAgICAgY291dCA8PCBpX2l0ZXItPmZpcnN0IDw8ICIgPT4geyI7CiAgICAgICBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGkyX2l0ZXI7CiAgICAgICBmb3IgKGkyX2l0ZXIgPSBpX2l0ZXItPnNlY29uZC5iZWdpbigpOwogICAgICAgICAgICBpMl9pdGVyICE9IGlfaXRlci0+c2Vjb25kLmVuZCgpOwogICAgICAgICAgICArK2kyX2l0ZXIpIHsKLSAgICAgICAgcHJpbnRmKCIlZCA9PiB7IiwgaTJfaXRlci0+Zmlyc3QpOworICAgICAgICBjb3V0IDw8IGkyX2l0ZXItPmZpcnN0IDw8ICIgPT4geyI7CiAgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+IHVzZXJNYXAgPSBpMl9pdGVyLT5zZWNvbmQudXNlck1hcDsKICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD46OmNvbnN0X2l0ZXJhdG9yIHVtOwotICAgICAgICBwcmludGYoInsiKTsKKyAgICAgICAgY291dCA8PCAieyI7CiAgICAgICAgIGZvciAodW0gPSB1c2VyTWFwLmJlZ2luKCk7IHVtICE9IHVzZXJNYXAuZW5kKCk7ICsrdW0pIHsKLSAgICAgICAgICBwcmludGYoIiVkID0+ICVsZCwgIiwgdW0tPmZpcnN0LCB1bS0+c2Vjb25kKTsKKyAgICAgICAgICBjb3V0IDw8IHVtLT5maXJzdCA8PCAiID0+ICIgPDwgdW0tPnNlY29uZCA8PCAiLCAiOwogICAgICAgICB9Ci0gICAgICAgIHByaW50ZigifSwgIik7CisgICAgICAgIGNvdXQgPDwgIn0sICI7CiAKICAgICAgICAgdmVjdG9yPFh0cnVjdD4geHRydWN0cyA9IGkyX2l0ZXItPnNlY29uZC54dHJ1Y3RzOwogICAgICAgICB2ZWN0b3I8WHRydWN0Pjo6Y29uc3RfaXRlcmF0b3IgeDsKLSAgICAgICAgcHJpbnRmKCJ7Iik7CisgICAgICAgIGNvdXQgPDwgInsiOwogICAgICAgICBmb3IgKHggPSB4dHJ1Y3RzLmJlZ2luKCk7IHggIT0geHRydWN0cy5lbmQoKTsgKyt4KSB7Ci0gICAgICAgICAgcHJpbnRmKCJ7XCIlc1wiLCAlZCwgJWQsICVsZH0sICIsIHgtPnN0cmluZ190aGluZy5jX3N0cigpLCAoaW50KXgtPmJ5dGVfdGhpbmcsIHgtPmkzMl90aGluZywgeC0+aTY0X3RoaW5nKTsKKyAgICAgICAgICBjb3V0IDw8ICJ7XCIiIDw8IHgtPnN0cmluZ190aGluZyA8PCAiXCIsICIgPDwgKGludCl4LT5ieXRlX3RoaW5nIDw8ICIsICIgPDwgeC0+aTMyX3RoaW5nIDw8ICIsICIgPDwgeC0+aTY0X3RoaW5nIDw8ICJ9LCAiOwogICAgICAgICB9Ci0gICAgICAgIHByaW50ZigifSIpOworICAgICAgICBjb3V0IDw8ICJ9IjsKIAotICAgICAgICBwcmludGYoIn0sICIpOworICAgICAgICBjb3V0IDw8ICJ9LCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgIGNvdXQgPDwgIn0sICI7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKIAogCiAgIH0KIAotICB2b2lkIHRlc3RNdWx0aShYdHJ1Y3QgJmhlbGxvLCBjb25zdCBpbnQ4X3QgYXJnMCwgY29uc3QgaW50MzJfdCBhcmcxLCBjb25zdCBpbnQ2NF90IGFyZzIsIGNvbnN0IHN0ZDo6bWFwPGludDE2X3QsIHN0ZDo6c3RyaW5nPiAgJmFyZzMsIGNvbnN0IE51bWJlcno6OnR5cGUgYXJnNCwgY29uc3QgVXNlcklkIGFyZzUpIHsKKyAgdm9pZCB0ZXN0TXVsdGkoWHRydWN0ICZoZWxsbywgY29uc3QgaW50OF90IGFyZzAsIGNvbnN0IGludDMyX3QgYXJnMSwgY29uc3QgaW50NjRfdCBhcmcyLCBjb25zdCBzdGQ6Om1hcDxpbnQxNl90LCBzdGQ6OnN0cmluZz4gICZhcmczLCBjb25zdCBOdW1iZXJ6Ojp0eXBlIGFyZzQsIGNvbnN0IFVzZXJJZCBhcmc1KSBvdmVycmlkZSB7CiAgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJnMyk7CiAgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJnNCk7CiAgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJnNSk7CiAKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdE11bHRpKClcbiIpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdE11bHRpKCkiIDw8IGVuZGw7CiAKICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKICAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKQEAgLTI3OSw5ICsyOTEsOSBAQAogICB9CiAKICAgdm9pZCB0ZXN0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcpCi0gICAgdGhyb3coWGNlcHRpb24sIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKQorICAgIHRocm93KFhjZXB0aW9uLCBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbikgb3ZlcnJpZGUKICAgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0RXhjZXB0aW9uKCVzKVxuIiwgYXJnLmNfc3RyKCkpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEV4Y2VwdGlvbigiIDw8IGFyZyA8PCAiKSIgPDwgZW5kbDsKICAgICBpZiAoYXJnLmNvbXBhcmUoIlhjZXB0aW9uIikgPT0gMCkgewogICAgICAgWGNlcHRpb24gZTsKICAgICAgIGUuZXJyb3JDb2RlID0gMTAwMTsKQEAgLTI5Nyw5ICszMDksOSBAQAogICAgIH0KICAgfQogCi0gIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKFh0cnVjdCAmcmVzdWx0LCBjb25zdCBzdGQ6OnN0cmluZyAmYXJnMCwgY29uc3Qgc3RkOjpzdHJpbmcgJmFyZzEpIHRocm93KFhjZXB0aW9uLCBYY2VwdGlvbjIpIHsKKyAgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oWHRydWN0ICZyZXN1bHQsIGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcwLCBjb25zdCBzdGQ6OnN0cmluZyAmYXJnMSkgdGhyb3coWGNlcHRpb24sIFhjZXB0aW9uMikgb3ZlcnJpZGUgewogCi0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpXG4iLCBhcmcwLmNfc3RyKCksIGFyZzEuY19zdHIoKSk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0TXVsdGlFeGNlcHRpb24oIiA8PCBhcmcwIDw8ICIsICIgPDwgYXJnMSA8PCAiKSIgPDwgZW5kbDsKIAogICAgIGlmIChhcmcwLmNvbXBhcmUoIlhjZXB0aW9uIikgPT0gMCkgewogICAgICAgWGNlcHRpb24gZTsKQEAgLTMxNywxMCArMzI5LDEwIEBACiAgICAgfQogICB9CiAKLSAgdm9pZCB0ZXN0T25ld2F5KGludCBzbGVlcEZvcikgewotICAgIHByaW50ZigidGVzdE9uZXdheSglZCk6IFNsZWVwaW5nLi4uXG4iLCBzbGVlcEZvcik7CisgIHZvaWQgdGVzdE9uZXdheShpbnQgc2xlZXBGb3IpIG92ZXJyaWRlIHsKKyAgICBjb3V0IDw8ICJ0ZXN0T25ld2F5KCIgPDwgc2xlZXBGb3IgPDwgIik6IFNsZWVwaW5nLi4uIiA8PCBlbmRsOwogICAgIHNsZWVwKHNsZWVwRm9yKTsKLSAgICBwcmludGYoInRlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIVxuIiwgc2xlZXBGb3IpOworICAgIGNvdXQgPDwgInRlc3RPbmV3YXkoIiA8PCBzbGVlcEZvciA8PCAiKTogZG9uZSBzbGVlcGluZyEiIDw8IGVuZGw7CiAgIH0KIH07CiAKQEAgLTMzOCwzMSArMzUwLDMxIEBACiBzdGF0aWMgdm9pZAogdGVzdF90aHJpZnRfY2xpZW50ICh2b2lkKQogewotICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOwotICBUaHJpZnRCaW5hcnlQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOwotICBUVGVzdFRocmlmdFRlc3RDbGllbnQgKmNsaWVudCA9IE5VTEw7Ci0gIFRUZXN0VGhyaWZ0VGVzdElmICppZmFjZSA9IE5VTEw7Ci0gIEdFcnJvciAqZXJyb3IgPSBOVUxMOwotICBnY2hhciAqc3RyaW5nID0gTlVMTDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gbnVsbHB0cjsKKyAgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnByb3RvY29sID0gbnVsbHB0cjsKKyAgVFRlc3RUaHJpZnRUZXN0Q2xpZW50ICpjbGllbnQgPSBudWxscHRyOworICBUVGVzdFRocmlmdFRlc3RJZiAqaWZhY2UgPSBudWxscHRyOworICBHRXJyb3IgKmVycm9yID0gbnVsbHB0cjsKKyAgZ2NoYXIgKnN0cmluZyA9IG51bGxwdHI7CiAgIGdpbnQ4IGJ5dGUgPSAwOwogICBnaW50MTYgaTE2ID0gMDsKLSAgZ2ludDMyIGkzMiA9IDAsIGFub3RoZXJfaTMyID0gNTY3ODk7IAorICBnaW50MzIgaTMyID0gMCwgYW5vdGhlcl9pMzIgPSA1Njc4OTsKICAgZ2ludDY0IGk2NCA9IDA7CiAgIGRvdWJsZSBkYmwgPSAwLjA7CiAgIFRUZXN0WHRydWN0ICp4dHJ1Y3RfaW4sICp4dHJ1Y3Rfb3V0OwogICBUVGVzdFh0cnVjdDIgKnh0cnVjdDJfaW4sICp4dHJ1Y3QyX291dDsKLSAgR0hhc2hUYWJsZSAqbWFwX2luID0gTlVMTCwgKm1hcF9vdXQgPSBOVUxMOwotICBHSGFzaFRhYmxlICpzZXRfaW4gPSBOVUxMLCAqc2V0X291dCA9IE5VTEw7Ci0gIEdBcnJheSAqbGlzdF9pbiA9IE5VTEwsICpsaXN0X291dCA9IE5VTEw7CisgIEdIYXNoVGFibGUgKm1hcF9pbiA9IG51bGxwdHIsICptYXBfb3V0ID0gbnVsbHB0cjsKKyAgR0hhc2hUYWJsZSAqc2V0X2luID0gbnVsbHB0ciwgKnNldF9vdXQgPSBudWxscHRyOworICBHQXJyYXkgKmxpc3RfaW4gPSBudWxscHRyLCAqbGlzdF9vdXQgPSBudWxscHRyOwogICBUVGVzdE51bWJlcnogZW51bV9pbiwgZW51bV9vdXQ7Ci0gIFRUZXN0VXNlcklkIHVzZXJfaWRfaW4sIHVzZXJfaWRfb3V0OyAKLSAgR0hhc2hUYWJsZSAqaW5zYW5pdHlfaW4gPSBOVUxMOworICBUVGVzdFVzZXJJZCB1c2VyX2lkX2luLCB1c2VyX2lkX291dDsKKyAgR0hhc2hUYWJsZSAqaW5zYW5pdHlfaW4gPSBudWxscHRyOwogICBUVGVzdFh0cnVjdCAqeHRydWN0MSwgKnh0cnVjdDI7Ci0gIFRUZXN0SW5zYW5pdHkgKmluc2FuaXR5X291dCA9IE5VTEw7Ci0gIFRUZXN0WHRydWN0ICptdWx0aV9pbiA9IE5VTEw7Ci0gIEdIYXNoVGFibGUgKm11bHRpX21hcF9vdXQgPSBOVUxMOwotICBUVGVzdFhjZXB0aW9uICp4Y2VwdGlvbiA9IE5VTEw7Ci0gIFRUZXN0WGNlcHRpb24yICp4Y2VwdGlvbjIgPSBOVUxMOworICBUVGVzdEluc2FuaXR5ICppbnNhbml0eV9vdXQgPSBudWxscHRyOworICBUVGVzdFh0cnVjdCAqbXVsdGlfaW4gPSBudWxscHRyOworICBHSGFzaFRhYmxlICptdWx0aV9tYXBfb3V0ID0gbnVsbHB0cjsKKyAgVFRlc3RYY2VwdGlvbiAqeGNlcHRpb24gPSBudWxscHRyOworICBUVGVzdFhjZXB0aW9uMiAqeGNlcHRpb24yID0gbnVsbHB0cjsKIAogI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCiAgIC8vIGluaXRpYWxpemUgZ29iamVjdApAQCAtMzcwLDcgKzM4Miw3IEBACiAjZW5kaWYKIAogICAvLyBjcmVhdGUgYSBDIGNsaWVudAotICB0c29ja2V0ID0gKFRocmlmdFNvY2tldCAqKSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgCisgIHRzb2NrZXQgPSAoVGhyaWZ0U29ja2V0ICopIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBURVNUX1BPUlQsIE5VTEwpOwogICBwcm90b2NvbCA9IChUaHJpZnRCaW5hcnlQcm90b2NvbCAqKSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKQEAgLTM4MCwzMyArMzkyLDMzIEBACiAgIGlmYWNlID0gVF9URVNUX1RIUklGVF9URVNUX0lGIChjbGllbnQpOwogCiAgIC8vIG9wZW4gYW5kIHNlbmQKLSAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuIChUSFJJRlRfVFJBTlNQT1JUKHRzb2NrZXQpLCBOVUxMKTsKKyAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuIChUSFJJRlRfVFJBTlNQT1JUKHRzb2NrZXQpLCBudWxscHRyKTsKIAogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF92b2lkIChpZmFjZSwgJmVycm9yKSA9PSBUUlVFKTsKLSAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBudWxscHRyKTsKIAogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9zdHJpbmcgKGlmYWNlLCAmc3RyaW5nLCAidGVzdDEyMyIsICZlcnJvcikgPT0gVFJVRSk7CiAgIGFzc2VydCAoc3RyY21wIChzdHJpbmcsICJ0ZXN0MTIzIikgPT0gMCk7CiAgIGdfZnJlZSAoc3RyaW5nKTsKLSAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBudWxscHRyKTsKIAogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9ieXRlIChpZmFjZSwgJmJ5dGUsIChnaW50OCkgNSwgJmVycm9yKSA9PSBUUlVFKTsKICAgYXNzZXJ0IChieXRlID09IDUpOwotICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBhc3NlcnQgKGVycm9yID09IG51bGxwdHIpOwogCiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X2kzMiAoaWZhY2UsICZpMzIsIDEyMywgJmVycm9yKSA9PSBUUlVFKTsKICAgYXNzZXJ0IChpMzIgPT0gMTIzKTsKLSAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBudWxscHRyKTsKIAogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9pNjQgKGlmYWNlLCAmaTY0LCAxMjM0NSwgJmVycm9yKSA9PSBUUlVFKTsKICAgYXNzZXJ0IChpNjQgPT0gMTIzNDUpOwotICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBhc3NlcnQgKGVycm9yID09IG51bGxwdHIpOwogCiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X2RvdWJsZSAoaWZhY2UsICZkYmwsIDUuNiwgJmVycm9yKSA9PSBUUlVFKTsKICAgYXNzZXJ0IChkYmwgPT0gNS42KTsKLSAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBudWxscHRyKTsKIAotICB4dHJ1Y3Rfb3V0ID0gKFRUZXN0WHRydWN0ICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKyAgeHRydWN0X291dCA9IChUVGVzdFh0cnVjdCAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgbnVsbHB0cik7CiAgIHh0cnVjdF9vdXQtPmJ5dGVfdGhpbmcgPSAxOwogICB4dHJ1Y3Rfb3V0LT5fX2lzc2V0X2J5dGVfdGhpbmcgPSBUUlVFOwogICB4dHJ1Y3Rfb3V0LT5pMzJfdGhpbmcgPSAxNTsKQEAgLTQxNSw1MCArNDI3LDUwIEBACiAgIHh0cnVjdF9vdXQtPl9faXNzZXRfaTY0X3RoaW5nID0gVFJVRTsKICAgeHRydWN0X291dC0+c3RyaW5nX3RoaW5nID0gZ19zdHJkdXAgKCJhYmMxMjMiKTsKICAgeHRydWN0X291dC0+X19pc3NldF9zdHJpbmdfdGhpbmcgPSBUUlVFOwotICB4dHJ1Y3RfaW4gPSAoVFRlc3RYdHJ1Y3QgKikgZ19vYmplY3RfbmV3KFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CisgIHh0cnVjdF9pbiA9IChUVGVzdFh0cnVjdCAqKSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfWFRSVUNULCBudWxscHRyKTsKICAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3Rfc3RydWN0IChpZmFjZSwgJnh0cnVjdF9pbiwgeHRydWN0X291dCwgJmVycm9yKSA9PSBUUlVFKTsKLSAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBudWxscHRyKTsKIAotICB4dHJ1Y3QyX291dCA9IChUVGVzdFh0cnVjdDIgKikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QyLCBOVUxMKTsKKyAgeHRydWN0Ml9vdXQgPSAoVFRlc3RYdHJ1Y3QyICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNUMiwgbnVsbHB0cik7CiAgIHh0cnVjdDJfb3V0LT5ieXRlX3RoaW5nID0gMTsKICAgeHRydWN0Ml9vdXQtPl9faXNzZXRfYnl0ZV90aGluZyA9IFRSVUU7Ci0gIGlmICh4dHJ1Y3QyX291dC0+c3RydWN0X3RoaW5nICE9IE5VTEwpCisgIGlmICh4dHJ1Y3QyX291dC0+c3RydWN0X3RoaW5nICE9IG51bGxwdHIpCiAgICAgZ19vYmplY3RfdW5yZWYoeHRydWN0Ml9vdXQtPnN0cnVjdF90aGluZyk7CiAgIHh0cnVjdDJfb3V0LT5zdHJ1Y3RfdGhpbmcgPSB4dHJ1Y3Rfb3V0OwogICB4dHJ1Y3QyX291dC0+X19pc3NldF9zdHJ1Y3RfdGhpbmcgPSBUUlVFOwogICB4dHJ1Y3QyX291dC0+aTMyX3RoaW5nID0gMTIzOwogICB4dHJ1Y3QyX291dC0+X19pc3NldF9pMzJfdGhpbmcgPSBUUlVFOwotICB4dHJ1Y3QyX2luID0gKFRUZXN0WHRydWN0MiAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVDIsIE5VTEwpOworICB4dHJ1Y3QyX2luID0gKFRUZXN0WHRydWN0MiAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVDIsIG51bGxwdHIpOwogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9uZXN0IChpZmFjZSwgJnh0cnVjdDJfaW4sIHh0cnVjdDJfb3V0LCAmZXJyb3IpID09IFRSVUUpOwotICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBhc3NlcnQgKGVycm9yID09IG51bGxwdHIpOwogCiAgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3QyX291dCk7CiAgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3QyX2luKTsKICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdF9pbik7CiAKLSAgbWFwX291dCA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOwotICBtYXBfaW4gPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1hcF9vdXQsICZpMzIsICZpMzIpOworICBtYXBfb3V0ID0gZ19oYXNoX3RhYmxlX25ldyAobnVsbHB0ciwgbnVsbHB0cik7CisgIG1hcF9pbiA9IGdfaGFzaF90YWJsZV9uZXcgKG51bGxwdHIsIG51bGxwdHIpOyAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgJmkzMiwgJmkzMik7CiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X21hcCAoaWZhY2UsICZtYXBfaW4sIG1hcF9vdXQsICZlcnJvcikgPT0gVFJVRSk7Ci0gIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIGFzc2VydCAoZXJyb3IgPT0gbnVsbHB0cik7CiAgIGdfaGFzaF90YWJsZV9kZXN0cm95IChtYXBfb3V0KTsKICAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKG1hcF9pbik7CiAKLSAgbWFwX291dCA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOwotICBtYXBfaW4gPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsKKyAgbWFwX291dCA9IGdfaGFzaF90YWJsZV9uZXcgKG51bGxwdHIsIG51bGxwdHIpOworICBtYXBfaW4gPSBnX2hhc2hfdGFibGVfbmV3IChudWxscHRyLCBudWxscHRyKTsKICAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgZ19zdHJkdXAgKCJhIiksIGdfc3RyZHVwICgiMTIzIikpOwogICBnX2hhc2hfdGFibGVfaW5zZXJ0IChtYXBfb3V0LCBnX3N0cmR1cCAoImEgYiIpLCBnX3N0cmR1cCAoIndpdGggc3BhY2VzICIpKTsKICAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgZ19zdHJkdXAgKCJzYW1lIiksIGdfc3RyZHVwICgic2FtZSIpKTsKICAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgZ19zdHJkdXAgKCIwIiksIGdfc3RyZHVwICgibnVtZXJpYyBrZXkiKSk7CiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X3N0cmluZ19tYXAgKGlmYWNlLCAmbWFwX2luLCBtYXBfb3V0LCAmZXJyb3IpID09IFRSVUUpOwotICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBhc3NlcnQgKGVycm9yID09IG51bGxwdHIpOwogICBnX2hhc2hfdGFibGVfZGVzdHJveSAobWFwX291dCk7CiAgIGdfaGFzaF90YWJsZV9kZXN0cm95IChtYXBfaW4pOwogCi0gIHNldF9vdXQgPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsKLSAgc2V0X2luID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CisgIHNldF9vdXQgPSBnX2hhc2hfdGFibGVfbmV3IChudWxscHRyLCBudWxscHRyKTsKKyAgc2V0X2luID0gZ19oYXNoX3RhYmxlX25ldyAobnVsbHB0ciwgbnVsbHB0cik7CiAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHNldF9vdXQsICZpMzIsICZpMzIpOwogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9zZXQgKGlmYWNlLCAmc2V0X2luLCBzZXRfb3V0LCAmZXJyb3IpID09IFRSVUUpOwotICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBhc3NlcnQgKGVycm9yID09IG51bGxwdHIpOwogICBnX2hhc2hfdGFibGVfZGVzdHJveSAoc2V0X291dCk7CiAgIGdfaGFzaF90YWJsZV9kZXN0cm95IChzZXRfaW4pOwogCkBAIC00NjgsMzEgKzQ4MCwzMSBAQAogICBnX2FycmF5X2FwcGVuZF92YWwgKGxpc3Rfb3V0LCBpMzIpOwogICBnX2FycmF5X2FwcGVuZF92YWwgKGxpc3Rfb3V0LCBhbm90aGVyX2kzMik7CiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X2xpc3QgKGlmYWNlLCAmbGlzdF9pbiwgbGlzdF9vdXQsICZlcnJvcikgPT0gVFJVRSk7Ci0gIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIGFzc2VydCAoZXJyb3IgPT0gbnVsbHB0cik7CiAgIGdfYXJyYXlfZnJlZSAobGlzdF9vdXQsIFRSVUUpOwogICBnX2FycmF5X2ZyZWUgKGxpc3RfaW4sIFRSVUUpOwogCiAgIGVudW1fb3V0ID0gVF9URVNUX05VTUJFUlpfT05FOwogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9lbnVtIChpZmFjZSwgJmVudW1faW4sIGVudW1fb3V0LCAmZXJyb3IpID09IFRSVUUpOwogICBhc3NlcnQgKGVudW1faW4gPT0gZW51bV9vdXQpOwotICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBhc3NlcnQgKGVycm9yID09IG51bGxwdHIpOwogCiAgIHVzZXJfaWRfb3V0ID0gMTIzNDU7CiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X3R5cGVkZWYgKGlmYWNlLCAmdXNlcl9pZF9pbiwgdXNlcl9pZF9vdXQsICZlcnJvcikgPT0gVFJVRSk7CiAgIGFzc2VydCAodXNlcl9pZF9pbiA9PSB1c2VyX2lkX291dCk7Ci0gIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIGFzc2VydCAoZXJyb3IgPT0gbnVsbHB0cik7CiAKLSAgbWFwX2luID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CisgIG1hcF9pbiA9IGdfaGFzaF90YWJsZV9uZXcgKG51bGxwdHIsIG51bGxwdHIpOwogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9tYXBfbWFwIChpZmFjZSwgJm1hcF9pbiwgaTMyLCAmZXJyb3IpID09IFRSVUUpOwotICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBhc3NlcnQgKGVycm9yID09IG51bGxwdHIpOwogICBnX2hhc2hfdGFibGVfZGVzdHJveSAobWFwX2luKTsKIAogICAvLyBpbnNhbml0eQotICBpbnNhbml0eV9vdXQgPSAoVFRlc3RJbnNhbml0eSAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0lOU0FOSVRZLCBOVUxMKTsKLSAgaW5zYW5pdHlfb3V0LT51c2VyTWFwID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CisgIGluc2FuaXR5X291dCA9IChUVGVzdEluc2FuaXR5ICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSU5TQU5JVFksIG51bGxwdHIpOworICBpbnNhbml0eV9vdXQtPnVzZXJNYXAgPSBnX2hhc2hfdGFibGVfbmV3IChudWxscHRyLCBudWxscHRyKTsKICAgZ19oYXNoX3RhYmxlX2luc2VydCAoaW5zYW5pdHlfb3V0LT51c2VyTWFwLCBHSU5UX1RPX1BPSU5URVIgKGVudW1fb3V0KSwgJnVzZXJfaWRfb3V0KTsKIAotICB4dHJ1Y3QxID0gKFRUZXN0WHRydWN0ICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKyAgeHRydWN0MSA9IChUVGVzdFh0cnVjdCAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgbnVsbHB0cik7CiAgIHh0cnVjdDEtPmJ5dGVfdGhpbmcgPSAxOwogICB4dHJ1Y3QxLT5fX2lzc2V0X2J5dGVfdGhpbmcgPSBUUlVFOwogICB4dHJ1Y3QxLT5pMzJfdGhpbmcgPSAxNTsKQEAgLTUwMSw3ICs1MTMsNyBAQAogICB4dHJ1Y3QxLT5fX2lzc2V0X2k2NF90aGluZyA9IFRSVUU7CiAgIHh0cnVjdDEtPnN0cmluZ190aGluZyA9IGdfc3RyZHVwICgiYWJjMTIzIik7CiAgIHh0cnVjdDEtPl9faXNzZXRfc3RyaW5nX3RoaW5nID0gVFJVRTsKLSAgeHRydWN0MiA9IChUVGVzdFh0cnVjdCAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CisgIHh0cnVjdDIgPSAoVFRlc3RYdHJ1Y3QgKikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIG51bGxwdHIpOwogICB4dHJ1Y3QyLT5ieXRlX3RoaW5nID0gMTsKICAgeHRydWN0Mi0+X19pc3NldF9ieXRlX3RoaW5nID0gVFJVRTsKICAgeHRydWN0Mi0+aTMyX3RoaW5nID0gMTU7CkBAIC01MTEsNyArNTIzLDcgQEAKICAgeHRydWN0Mi0+c3RyaW5nX3RoaW5nID0gZ19zdHJkdXAgKCJhYmMxMjMiKTsKICAgeHRydWN0Mi0+X19pc3NldF9zdHJpbmdfdGhpbmcgPSBUUlVFOwogCi0gIGluc2FuaXR5X2luID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CisgIGluc2FuaXR5X2luID0gZ19oYXNoX3RhYmxlX25ldyAobnVsbHB0ciwgbnVsbHB0cik7CiAgIGdfcHRyX2FycmF5X2FkZCAoaW5zYW5pdHlfb3V0LT54dHJ1Y3RzLCB4dHJ1Y3QxKTsKICAgZ19wdHJfYXJyYXlfYWRkIChpbnNhbml0eV9vdXQtPnh0cnVjdHMsIHh0cnVjdDIpOwogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9pbnNhbml0eSAoaWZhY2UsICZpbnNhbml0eV9pbiwgaW5zYW5pdHlfb3V0LCAmZXJyb3IpID09IFRSVUUpOwpAQCAtNTE5LDEwICs1MzEsMTAgQEAKICAgZ19oYXNoX3RhYmxlX3VucmVmIChpbnNhbml0eV9pbik7CiAgIGdfcHRyX2FycmF5X2ZyZWUgKGluc2FuaXR5X291dC0+eHRydWN0cywgVFJVRSk7CiAKLSAgbXVsdGlfbWFwX291dCA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOworICBtdWx0aV9tYXBfb3V0ID0gZ19oYXNoX3RhYmxlX25ldyAobnVsbHB0ciwgbnVsbHB0cik7CiAgIHN0cmluZyA9IGdfc3RyZHVwICgiYWJjMTIzIik7CiAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG11bHRpX21hcF9vdXQsICZpMTYsIHN0cmluZyk7Ci0gIG11bHRpX2luID0gKFRUZXN0WHRydWN0ICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKyAgbXVsdGlfaW4gPSAoVFRlc3RYdHJ1Y3QgKikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIG51bGxwdHIpOwogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9tdWx0aSAoaWZhY2UsICZtdWx0aV9pbiwgYnl0ZSwgaTMyLCBpNjQsIG11bHRpX21hcF9vdXQsIGVudW1fb3V0LCB1c2VyX2lkX291dCwgJmVycm9yKSA9PSBUUlVFKTsKICAgYXNzZXJ0IChtdWx0aV9pbi0+aTMyX3RoaW5nID09IGkzMik7CiAgIGFzc2VydCAobXVsdGlfaW4tPmk2NF90aGluZyA9PSBpNjQpOwpAQCAtNTMzLDUzICs1NDUsNTMgQEAKICAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfZXhjZXB0aW9uIChpZmFjZSwgIlhjZXB0aW9uIiwgJnhjZXB0aW9uLCAmZXJyb3IpID09IEZBTFNFKTsKICAgYXNzZXJ0ICh4Y2VwdGlvbi0+ZXJyb3JDb2RlID09IDEwMDEpOwogICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKLSAgZXJyb3IgPSBOVUxMOworICBlcnJvciA9IG51bGxwdHI7CiAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Ci0gIHhjZXB0aW9uID0gTlVMTDsKKyAgeGNlcHRpb24gPSBudWxscHRyOwogCiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X2V4Y2VwdGlvbiAoaWZhY2UsICJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsICZ4Y2VwdGlvbiwgJmVycm9yKSA9PSBGQUxTRSk7CiAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwotICBlcnJvciA9IE5VTEw7Ci0gIGFzc2VydCAoeGNlcHRpb24gPT0gTlVMTCk7CisgIGVycm9yID0gbnVsbHB0cjsKKyAgYXNzZXJ0ICh4Y2VwdGlvbiA9PSBudWxscHRyKTsKIAogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9leGNlcHRpb24gKGlmYWNlLCAiVGVzdCIsICZ4Y2VwdGlvbiwgJmVycm9yKSA9PSBUUlVFKTsKLSAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBudWxscHRyKTsKIAotICBtdWx0aV9pbiA9IChUVGVzdFh0cnVjdCopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKLSAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfbXVsdGlfZXhjZXB0aW9uIChpZmFjZSwgJm11bHRpX2luLCAiWGNlcHRpb24iLCBOVUxMLCAmeGNlcHRpb24sICZ4Y2VwdGlvbjIsICZlcnJvcikgPT0gRkFMU0UpOworICBtdWx0aV9pbiA9IChUVGVzdFh0cnVjdCopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBudWxscHRyKTsKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfbXVsdGlfZXhjZXB0aW9uIChpZmFjZSwgJm11bHRpX2luLCAiWGNlcHRpb24iLCBudWxscHRyLCAmeGNlcHRpb24sICZ4Y2VwdGlvbjIsICZlcnJvcikgPT0gRkFMU0UpOwogICBhc3NlcnQgKHhjZXB0aW9uLT5lcnJvckNvZGUgPT0gMTAwMSk7Ci0gIGFzc2VydCAoeGNlcHRpb24yID09IE5VTEwpOworICBhc3NlcnQgKHhjZXB0aW9uMiA9PSBudWxscHRyKTsKICAgZ19lcnJvcl9mcmVlIChlcnJvcik7Ci0gIGVycm9yID0gTlVMTDsKKyAgZXJyb3IgPSBudWxscHRyOwogICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOwogICBnX29iamVjdF91bnJlZiAobXVsdGlfaW4pOwotICB4Y2VwdGlvbiA9IE5VTEw7Ci0gIG11bHRpX2luID0gTlVMTDsKKyAgeGNlcHRpb24gPSBudWxscHRyOworICBtdWx0aV9pbiA9IG51bGxwdHI7CiAKLSAgbXVsdGlfaW4gPSAoVFRlc3RYdHJ1Y3QqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7Ci0gIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X211bHRpX2V4Y2VwdGlvbiAoaWZhY2UsICZtdWx0aV9pbiwgIlhjZXB0aW9uMiIsIE5VTEwsICZ4Y2VwdGlvbiwgJnhjZXB0aW9uMiwgJmVycm9yKSA9PSBGQUxTRSk7CisgIG11bHRpX2luID0gKFRUZXN0WHRydWN0KikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIG51bGxwdHIpOworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9tdWx0aV9leGNlcHRpb24gKGlmYWNlLCAmbXVsdGlfaW4sICJYY2VwdGlvbjIiLCBudWxscHRyLCAmeGNlcHRpb24sICZ4Y2VwdGlvbjIsICZlcnJvcikgPT0gRkFMU0UpOwogICBhc3NlcnQgKHhjZXB0aW9uMi0+ZXJyb3JDb2RlID09IDIwMDIpOwotICBhc3NlcnQgKHhjZXB0aW9uID09IE5VTEwpOworICBhc3NlcnQgKHhjZXB0aW9uID09IG51bGxwdHIpOwogICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKLSAgZXJyb3IgPSBOVUxMOworICBlcnJvciA9IG51bGxwdHI7CiAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbjIpOwogICBnX29iamVjdF91bnJlZiAobXVsdGlfaW4pOwotICB4Y2VwdGlvbjIgPSBOVUxMOwotICBtdWx0aV9pbiA9IE5VTEw7CisgIHhjZXB0aW9uMiA9IG51bGxwdHI7CisgIG11bHRpX2luID0gbnVsbHB0cjsKIAotICBtdWx0aV9pbiA9IChUVGVzdFh0cnVjdCopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKLSAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfbXVsdGlfZXhjZXB0aW9uIChpZmFjZSwgJm11bHRpX2luLCBOVUxMICwgTlVMTCwgJnhjZXB0aW9uLCAmeGNlcHRpb24yLCAmZXJyb3IpID09IFRSVUUpOwotICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBtdWx0aV9pbiA9IChUVGVzdFh0cnVjdCopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBudWxscHRyKTsKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfbXVsdGlfZXhjZXB0aW9uIChpZmFjZSwgJm11bHRpX2luLCBudWxscHRyICwgbnVsbHB0ciwgJnhjZXB0aW9uLCAmeGNlcHRpb24yLCAmZXJyb3IpID09IFRSVUUpOworICBhc3NlcnQgKGVycm9yID09IG51bGxwdHIpOwogICBnX29iamVjdF91bnJlZihtdWx0aV9pbik7Ci0gIG11bHRpX2luID0gTlVMTDsKKyAgbXVsdGlfaW4gPSBudWxscHRyOwogCiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X29uZXdheSAoaWZhY2UsIDEsICZlcnJvcikgPT0gVFJVRSk7Ci0gIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIGFzc2VydCAoZXJyb3IgPT0gbnVsbHB0cik7CiAKICAgLyogc2xlZXAgdG8gbGV0IHRoZSBvbmV3YXkgY2FsbCBnbyB0aHJvdWdoICovCiAgIHNsZWVwICg1KTsKIAotICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChUSFJJRlRfVFJBTlNQT1JUKHRzb2NrZXQpLCBOVUxMKTsKKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoVEhSSUZUX1RSQU5TUE9SVCh0c29ja2V0KSwgbnVsbHB0cik7CiAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOwogICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOwogICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CkBAIC02MDYsMTEgKzYxOCwxMSBAQAogCiAgIGlmIChwaWQgPT0gMCkgLyogY2hpbGQgKi8KICAgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4gdGVzdEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCkpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmlmdFRlc3RQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQoVEVTVF9QT1JUKSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IHRlc3RIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyaWZ0VGVzdFByb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvcihuZXcgVGhyaWZ0VGVzdFByb2Nlc3Nvcih0ZXN0SGFuZGxlcikpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQoVEVTVF9QT1JUKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOwogICAgIFRTaW1wbGVTZXJ2ZXIgc2ltcGxlU2VydmVyKHRlc3RQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKICAgICBzaWduYWwgKFNJR0FMUk0sIGJhaWxvdXQpOwogICAgIGFsYXJtICg2MCk7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzb2NrZXQuYwppbmRleCBkOTE1MDdmLi44OWM2MWI5IDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0LmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKQEAgLTM0LDkgKzMzLDkgQEAKIG15X3NvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQogewogICBpZiAoc29ja2V0X2Vycm9yID09IDApCi0gIHsKLSAgICByZXR1cm4gc29ja2V0IChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKLSAgfQorICAgIHsKKyAgICAgIHJldHVybiBzb2NrZXQgKGRvbWFpbiwgdHlwZSwgcHJvdG9jb2wpOworICAgIH0KICAgcmV0dXJuIC0xOwogfQogCkBAIC00NSw5ICs0NCw5IEBACiBteV9yZWN2KGludCBzb2NrZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQogewogICBpZiAocmVjdl9lcnJvciA9PSAwKQotICB7Ci0gICAgcmV0dXJuIHJlY3YgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKLSAgfQorICAgIHsKKyAgICAgIHJldHVybiByZWN2IChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQogICByZXR1cm4gLTE7CiB9CiAKQEAgLTU2LDkgKzU1LDkgQEAKIG15X3NlbmQoaW50IHNvY2tldCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCiB7CiAgIGlmIChzZW5kX2Vycm9yID09IDApCi0gIHsKLSAgICByZXR1cm4gc2VuZCAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOwotICB9CisgICAgeworICAgICAgcmV0dXJuIHNlbmQgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKKyAgICB9CiAgIHJldHVybiAtMTsKIH0KIApAQCAtNzEsNyArNzAsNyBAQAogI3VuZGVmIHNlbmQKIAogc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKLQorc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcyk7CiAvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KIHN0YXRpYyB2b2lkCiB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQpAQCAtODEsNyArODAsNyBAQAogCiAgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CiAgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1Qob2JqZWN0KSwgImhvc3RuYW1lIiwgJmhvc3RuYW1lLCAicG9ydCIsICZwb3J0LCBOVUxMKTsKICAgZ19mcmVlIChob3N0bmFtZSk7CiAKQEAgLTk0LDgyICs5MywxMDAgQEAKICAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOwogICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIGludCBwb3J0ID0gNTExOTk7CisgIHBpZF90IHBpZDsKKyAgaW50IHN0YXR1czsKIAotICAvKiBvcGVuIGEgY29ubmVjdGlvbiBhbmQgY2xvc2UgaXQgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCA1MTE4OCwgTlVMTCk7IAotICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKLSAgdGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKLSAgdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKLSAgLyogdGVzdCBjbG9zZSBmYWlsdXJlICovCi0gIHRzb2NrZXQtPnNkID0gLTE7Ci0gIHRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAocG9ydCwgMSk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gIC8qIHRyeSBhIGhvc3RuYW1lIGxvb2t1cCBmYWlsdXJlICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7Ci0gIGFzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwotICBnX2Vycm9yX2ZyZWUgKGVycik7Ci0gIGVyciA9IE5VTEw7CisJLyogb3BlbiBhIGNvbm5lY3Rpb24gYW5kIGNsb3NlIGl0ICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCXRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOworCXRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CiAKLSAgLyogdHJ5IGFuIGVycm9yIGNhbGwgdG8gc29ja2V0KCkgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwgTlVMTCk7Ci0gIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwotICBzb2NrZXRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7Ci0gIHNvY2tldF9lcnJvciA9IDA7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKLSAgZ19lcnJvcl9mcmVlIChlcnIpOworCS8qIHRlc3QgY2xvc2UgZmFpbHVyZSAqLworCXRzb2NrZXQtPnNkID0gLTE7CisJdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisKKwkvKiB0cnkgYSBob3N0bmFtZSBsb29rdXAgZmFpbHVyZSAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAorCQkJCU5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZXJyID0gTlVMTDsKKworCS8qIHRyeSBhbiBlcnJvciBjYWxsIHRvIHNvY2tldCgpICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwgTlVMTCk7CisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisJc29ja2V0X2Vycm9yID0gMTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKKwlzb2NrZXRfZXJyb3IgPSAwOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogdGVzdF9yZWFkX2FuZF93cml0ZSh2b2lkKQogewotICBpbnQgc3RhdHVzOwotICBwaWRfdCBwaWQ7CiAgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CiAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgcGlkX3QgcGlkOwogICBpbnQgcG9ydCA9IDUxMTk5OworICBpbnQgc3RhdHVzOwogICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KIAogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKCBwaWQgPj0gMCApOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKICAgaWYgKCBwaWQgPT0gMCApCi0gIHsKLSAgICAvKiBjaGlsZCBsaXN0ZW5zICovCi0gICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKHBvcnQpOwotICAgIGV4aXQgKDApOwotICB9IGVsc2UgewotICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCi0gICAgc2xlZXAgKDEpOworICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyIChwb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CiAKLSAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7Ci0gICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwotICAgIHRocmlmdF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisJdGhyaWZ0X3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKIAotICAgIC8qIHdyaXRlIGZhaWwgKi8KLSAgICBzZW5kX2Vycm9yID0gMTsKLSAgICB0aHJpZnRfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgc2VuZF9lcnJvciA9IDA7CisJLyogd3JpdGUgZmFpbCAqLworCXNlbmRfZXJyb3IgPSAxOworCXRocmlmdF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwlzZW5kX2Vycm9yID0gMDsKIAotICAgIHRocmlmdF9zb2NrZXRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9zb2NrZXRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJdGhyaWZ0X3NvY2tldF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X3NvY2tldF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIAotICAgIGFzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOwotICAgIGFzc2VydCAoIHN0YXR1cyA9PSAwICk7Ci0gIH0KKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9CiB9CiAKIC8qIHRlc3QgVGhyaWZ0U29ja2V0J3MgcGVlaygpIGltcGxlbWVudGF0aW9uICovCkBAIC0xODQsOSArMjAxLDkgQEAKICAgR0Vycm9yICplcnJvciA9IE5VTEw7CiAKICAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJCQkJICAgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJICAgInBvcnQiLCAgICAgcG9ydCwKKwkJCQkgICBOVUxMKTsKIAogICAvKiB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgcmV0dXJucyBGQUxTRSB3aGVuIHRoZSBzb2NrZXQgaXMgY2xvc2VkICovCiAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKGNsaWVudF90cmFuc3BvcnQpID09IEZBTFNFKTsKQEAgLTE5Nyw4MSArMjE0LDEwMiBAQAogICBnX2Fzc2VydCAocGlkID49IDApOwogCiAgIGlmIChwaWQgPT0gMCkKLSAgewotICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7CisgICAgeworICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0ID0gTlVMTDsKIAotICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKIAotICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KLSAgICBzZXJ2ZXJfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICBnX2Fzc2VydCAoc2VydmVyX3RyYW5zcG9ydCAhPSBOVUxMKTsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHNlcnZlcl90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJICAgICAgICJwb3J0IiwgcG9ydCwKKwkJCQkgICAgICAgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoc2VydmVyX3RyYW5zcG9ydCAhPSBOVUxMKTsKIAotICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAoc2VydmVyX3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHNlcnZlcl90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CiAKLSAgICBjbGllbnRfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3Ci0gICAgICAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAotICAgICAgICJ0cmFuc3BvcnQiLCAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyb3IpLAotICAgICAgICJyX2J1Zl9zaXplIiwgMCwKLSAgICAgICAid19idWZfc2l6ZSIsIHNpemVvZiBkYXRhLAotICAgICAgIE5VTEwpOwotICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKLSAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKKyAgICAgIGNsaWVudF90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcKKwkgIChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJICAgInRyYW5zcG9ydCIsICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlcl90cmFuc3BvcnQsICZlcnJvciksCisJICAgInJfYnVmX3NpemUiLCAwLAorCSAgICJ3X2J1Zl9zaXplIiwgc2l6ZW9mIGRhdGEsCisJICAgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKIAotICAgIC8qIHdyaXRlIGV4YWN0bHkgb25lIGNoYXJhY3RlciB0byB0aGUgY2xpZW50ICovCi0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKGNsaWVudF90cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSA9PSBUUlVFKTsKKyAgICAgIC8qIHdyaXRlIGV4YWN0bHkgb25lIGNoYXJhY3RlciB0byB0aGUgY2xpZW50ICovCisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoY2xpZW50X3RyYW5zcG9ydCwKKwkJCQkJJmRhdGEsCisJCQkJCXNpemVvZiBkYXRhLAorCQkJCQkmZXJyb3IpID09IFRSVUUpOwogCi0gICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKIAotICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKLSAgICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CiAKLSAgICBleGl0ICgwKTsKLSAgfQorICAgICAgZXhpdCAoMCk7CisgICAgfQogICBlbHNlIHsKLSAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLwotICAgIHNsZWVwICgxKTsKKyAgICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisgICAgICBzbGVlcCAoMSk7CiAKLSAgICAvKiBjb25uZWN0IHRvIHRoZSBjaGlsZCAqLwotICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7Ci0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCkgPT0gVFJVRSk7CisgICAgICAvKiBjb25uZWN0IHRvIHRoZSBjaGlsZCAqLworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCkgPT0gVFJVRSk7CiAKLSAgICAvKiB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgcmV0dXJucyBUUlVFIHdoZW4gdGhlIHNvY2tldCBpcyBvcGVuIGFuZCB0aGVyZSBpcworICAgICAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgVFJVRSB3aGVuIHRoZSBzb2NrZXQgaXMgb3BlbiBhbmQgdGhlcmUgaXMKICAgICAgICBkYXRhIGF2YWlsYWJsZSB0byBiZSByZWFkICovCi0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfcGVlayAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKSA9PSBUUlVFKTsKLSAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpID09IFRSVUUpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwogCi0gICAgLyogcmVhZCBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc2VydmVyICovCi0gICAgZ19hc3NlcnRfY21waW50ICh0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudF90cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSwgPT0sIHNpemVvZiBkYXRhKTsKKyAgICAgIC8qIHJlYWQgZXhhY3RseSBvbmUgY2hhcmFjdGVyIGZyb20gdGhlIHNlcnZlciAqLworICAgICAgZ19hc3NlcnRfY21waW50ICh0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudF90cmFuc3BvcnQsCisJCQkJCSAgICAgICZkYXRhLAorCQkJCQkgICAgICBzaXplb2YgZGF0YSwKKwkJCQkJICAgICAgJmVycm9yKSwgPT0sIHNpemVvZiBkYXRhKTsKIAotICAgIC8qIHRocmlmdF90cmFuc3BvcnRfcGVlayByZXR1cm5zIEZBTFNFIHdoZW4gdGhlIHNvY2tldCBpcyBvcGVuIGJ1dCB0aGVyZSBpcworICAgICAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgRkFMU0Ugd2hlbiB0aGUgc29ja2V0IGlzIG9wZW4gYnV0IHRoZXJlIGlzCiAgICAgICAgbm8gKG1vcmUpIGRhdGEgYXZhaWxhYmxlIHRvIGJlIHJlYWQgKi8KLSAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChjbGllbnRfdHJhbnNwb3J0KSA9PSBUUlVFKTsKLSAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKLSAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChjbGllbnRfdHJhbnNwb3J0KSA9PSBUUlVFKTsKKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwogCi0gICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CiAKLSAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CiAKLSAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKLSAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICAgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOwogICB9CiB9CiAKIHN0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgaW50IGk7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZm9yKGk9MDtpPHRpbWVzO2krKyl7CisgICAgICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICAgICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICB9CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworCitzdGF0aWMgdm9pZAogdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KQogewogICBpbnQgYnl0ZXMgPSAwOwpAQCAtMjgxLDE3ICszMTksMTcgQEAKICAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKIAogICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKIAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICAvKiByZWFkIDEwIGJ5dGVzICovCiAgIGJ5dGVzID0gdGhyaWZ0X3NvY2tldF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOwotICBhc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KLSAgYXNzZXJ0ICggbWVtY21wKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCiAKICAgLyogZmFpbGVkIHJlYWQgKi8KICAgcmVjdl9lcnJvciA9IDE7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI2NDRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQuYwpAQCAtMCwwICsxLDU0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBfUE9TSVhfQ19TT1VSQ0UgMjAwMTEyTCAvKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzU0MTk4NS9zdG9yYWdlLXNpemUtb2YtYWRkcmluZm8taXNudC1rbm93biAqLworCisKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaD4KKworLyogI2RlZmluZSBURVNUX0RBVEEgeyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicgfSAqLworI2RlZmluZSBURVNUX0RBVEEgeyAiR0VUIC8gSFRUUC8xLjFcblxuIiB9CisKKworLyogc3Vic3RpdHV0ZWQgZnVuY3Rpb25zIHRvIHRlc3QgZmFpbHVyZXMgb2Ygc3lzdGVtIGFuZCBsaWJyYXJ5IGNhbGxzICovCitzdGF0aWMgaW50IHNvY2tldF9lcnJvciA9IDA7CitpbnQKK215X3NvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQoreworICBpZiAoc29ja2V0X2Vycm9yID09IDApCisgICAgeworICAgICAgcmV0dXJuIHNvY2tldCAoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcmVjdl9lcnJvciA9IDA7Citzc2l6ZV90CitteV9yZWN2KGludCBzb2NrZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQoreworICBpZiAocmVjdl9lcnJvciA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiByZWN2IChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9lcnJvciA9IDA7Citzc2l6ZV90CitteV9zZW5kKGludCBzb2NrZXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQoreworICBpZiAoc2VuZF9lcnJvciA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBzZW5kIChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgc29ja2V0IG15X3NvY2tldAorI2RlZmluZSByZWN2IG15X3JlY3YKKyNkZWZpbmUgc2VuZCBteV9zZW5kCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMiCisjdW5kZWYgc29ja2V0CisjdW5kZWYgcmVjdgorI3VuZGVmIHNlbmQKKworc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKKworLyogdGVzdCBvYmplY3QgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICovCitzdGF0aWMgdm9pZAordGVzdF9zc2xfY3JlYXRlX2FuZF9kZXN0cm95KHZvaWQpCit7CisgIGdjaGFyICpob3N0bmFtZSA9IE5VTEw7CisgIGd1aW50IHBvcnQgPSAwOworCisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1Qob2JqZWN0KSwgImhvc3RuYW1lIiwgJmhvc3RuYW1lLCAicG9ydCIsICZwb3J0LCBOVUxMKTsKKyAgZ19mcmVlIChob3N0bmFtZSk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zc2xfY3JlYXRlX2FuZF9zZXRfcHJvcGVydGllcyh2b2lkKQoreworICBnY2hhciAqaG9zdG5hbWUgPSBOVUxMOworICBndWludCBwb3J0ID0gMDsKKyAgU1NMX0NUWCogc3NsX2N0eD0gTlVMTDsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworCisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IHRocmlmdF9zc2xfc29ja2V0X25ldyhTU0xUTFMsICZlcnJvcik7CisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1Qob2JqZWN0KSwgImhvc3RuYW1lIiwgJmhvc3RuYW1lLCAicG9ydCIsICZwb3J0LCAic3NsX2NvbnRleHQiLCAmc3NsX2N0eCwgTlVMTCk7CisgIGdfYXNzZXJ0IChzc2xfY3R4IT1OVUxMKTsKKworICBnX2ZyZWUgKGhvc3RuYW1lKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF9vcGVuX2FuZF9jbG9zZV9ub25fc3NsX3NlcnZlcih2b2lkKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnRTU0xTb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKyAgcGlkX3QgcGlkOworICBpbnQgbm9uX3NzbF9wb3J0ID0gNTExOTg7CisgIGNoYXIgZXJyb3Jtc2dbMjU1XTsKKworCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKKworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICAvKiBUaGlzIGlzIGEgbm9uIFNTTCBzZXJ2ZXIgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyIChub25fc3NsX3BvcnQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKworCS8qIG9wZW4gYSBjb25uZWN0aW9uIGFuZCBjbG9zZSBpdCAqLworCXRTU0xTb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdCIsIG5vbl9zc2xfcG9ydCwgJmVycm9yKTsKKworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xTb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworCWdfYXNzZXJ0X2NtcHN0cihlcnJvci0+bWVzc2FnZSwgPT0gLCJFcnJvciB3aGlsZSBjb25uZWN0L2JpbmQ6IDY4IC0+IENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpOworCWdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisJZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworCXRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKworCS8qIHRlc3QgY2xvc2UgZmFpbHVyZSAqLworCVRIUklGVF9TT0NLRVQodFNTTFNvY2tldCktPnNkID0gLTE7CisJdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19vYmplY3RfdW5yZWYgKHRTU0xTb2NrZXQpOworCisJLyogdHJ5IGEgaG9zdG5hbWUgbG9va3VwIGZhaWx1cmUgKi8KKwl0U1NMU29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QuYnJva2VuIiwgbm9uX3NzbF9wb3J0LCAmZXJyb3IpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xTb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworCXNucHJpbnRmKGVycm9ybXNnLCAyNTUsICJob3N0IGxvb2t1cCBmYWlsZWQgZm9yIGxvY2FsaG9zdC5icm9rZW46JWQgLSBVbmtub3duIGhvc3QiLCBub25fc3NsX3BvcnQpOworCWdfYXNzZXJ0X2NtcHN0cihlcnJvci0+bWVzc2FnZSwgPT0sIGVycm9ybXNnKTsKKwlnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworCWdfb2JqZWN0X3VucmVmICh0U1NMU29ja2V0KTsKKwllcnJvciA9IE5VTEw7CisKKwkJLyogdHJ5IGFuIGVycm9yIGNhbGwgdG8gc29ja2V0KCkgKi8KKwkvKgorCQl0U1NMU29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QiLCBwb3J0LCAmZXJyb3IpOworCQl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMU29ja2V0KTsKKwkJc29ja2V0X2Vycm9yID0gMTsKKwkJYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworCQlzb2NrZXRfZXJyb3IgPSAwOworCQlnX29iamVjdF91bnJlZiAodFNTTFNvY2tldCk7CisJCWdfZXJyb3JfZnJlZSAoZXJyb3IpOworCSAqLworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX3dyaXRlX2ludmFsaWRfc29ja2V0KHZvaWQpCit7CisgIFRocmlmdFNTTFNvY2tldCAqdFNTTFNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworICBjaGFyIGJ1ZmZlcltdID0gInRoaXMgbXVzdCBub3QgYnJlYWsiOworCisgIC8qIG9wZW4gYSBjb25uZWN0aW9uIGFuZCBjbG9zZSBpdCAqLworICB0U1NMU29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QiLCA1MTE4OCsxLCAmZXJyb3IpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xTb2NrZXQpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKworICAvKiBGSVhNRSBUaGlzIG11c3QgYmUgdGVzdGVkIGJ1dCBzaW5jZSB0aGUgYXNzZXJ0aW9uIGluc2lkZSB0aHJpZnRfc3NsX3NvY2tldF93cml0ZSBicmVha3MgdGhlIHRlc3QgdW5pdAorICAgaXQncyBkaXNhYmxlZC4gVGhleSBpZGVhIGlzIHRvIGRpc2FibGUgdHJhcC9jb3JlZHVtcCBkdXJpbmcgdGhpcyB0ZXN0CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF93cml0ZSh0cmFuc3BvcnQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZlcnJvcikgPT0gRkFMU0UpOworICBnX21lc3NhZ2UgKCJ3cml0ZV9mYWlsZWRfd2l0aF9lcnJvcjogJXMiLAorCSAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIk5vIik7CisgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgICovCisgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisKKyAgLyogdGVzdCBjbG9zZSBmYWlsdXJlICovCisgIFRIUklGVF9TT0NLRVQodFNTTFNvY2tldCktPnNkID0gLTE7CisgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodFNTTFNvY2tldCk7Cit9CisKKworCisvKioKKyAqIFByaW50IHRoZSBjb21tb24gbmFtZSBvZiBjZXJ0aWZpY2F0ZQorICovCit1bnNpZ25lZCBjaGFyICogZ2V0X2NuX25hbWUoWDUwOV9OQU1FKiBjb25zdCBuYW1lKQoreworICBpbnQgaWR4ID0gLTE7CisgIHVuc2lnbmVkIGNoYXIgKnV0ZjggPSBOVUxMOworCisgIGRvCisgICAgeworICAgICAgaWYoIW5hbWUpIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgICAgaWR4ID0gWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQobmFtZSwgTklEX2NvbW1vbk5hbWUsIC0xKTsKKyAgICAgIGlmKCEoaWR4ID4gLTEpKSAgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgICBYNTA5X05BTUVfRU5UUlkqIGVudHJ5ID0gWDUwOV9OQU1FX2dldF9lbnRyeShuYW1lLCBpZHgpOworICAgICAgaWYoIWVudHJ5KSBicmVhazsgLyogZmFpbGVkICovCisKKyAgICAgIEFTTjFfU1RSSU5HKiBkYXRhID0gWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKGVudHJ5KTsKKyAgICAgIGlmKCFkYXRhKSBicmVhazsgLyogZmFpbGVkICovCisKKyAgICAgIGludCBsZW5ndGggPSBBU04xX1NUUklOR190b19VVEY4KCZ1dGY4LCBkYXRhKTsKKyAgICAgIGlmKCF1dGY4IHx8ICEobGVuZ3RoID4gMCkpICBicmVhazsgLyogZmFpbGVkICovCisKKyAgICB9IHdoaWxlICgwKTsKKyAgcmV0dXJuIHV0Zjg7Cit9CisKKy8qCisgKiBIYW5kbGUgSVBWNCBhbmQgSVBWNiBhZGRyCisgKi8KK3ZvaWQgKmdldF9pbl9hZGRyKHN0cnVjdCBzb2NrYWRkciAqc2EpCit7CisgIGlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQpCisgICAgcmV0dXJuICYoKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKXNhKS0+c2luX2FkZHIpOworICByZXR1cm4gJigoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKXNhKS0+c2luNl9hZGRyKTsKK30KKworaW50IHZlcmlmeV9pcChjaGFyICogaG9zdG5hbWUsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyKQoreworICBzdHJ1Y3QgYWRkcmluZm8gKmFkZHJfaW5mbywqcDsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBpbnQgcmVzOworICBpbnQgcmV0dmFsID0gMDsKKworCisgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZiAoc3RydWN0IGFkZHJpbmZvKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsgLyogdXNlIEFGX0lORVQ2IHRvIGZvcmNlIElQdjYgKi8KKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKworCisgIGlmICggKHJlcyA9IGdldGFkZHJpbmZvKGhvc3RuYW1lLCBOVUxMLCAmaGludHMsICZhZGRyX2luZm8pICkgIT0gMCkKKyAgICB7CisgICAgICAvKiBnZXQgdGhlIGhvc3QgaW5mbyAqLworICAgICAgZ19lcnJvcigiQ2Fubm90IGdldCB0aGUgaG9zdCBhZGRyZXNzIik7CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgLyogbG9vcCB0aHJvdWdoIGFsbCB0aGUgcmVzdWx0cyBhbmQgY29ubmVjdCB0byB0aGUgZmlyc3Qgd2UgY2FuICovCisgIGNoYXIgZG5zaG9zdFtJTkVUNl9BRERSU1RSTEVOXTsgLyogYmlnZ2VyIGFkZHIgc3VwcG9ydGVkIElQVjYgKi8KKyAgY2hhciBzb2NrZXRfaXBbSU5FVDZfQUREUlNUUkxFTl07CisgIGlmKGluZXRfbnRvcChhZGRyLT5zc19mYW1pbHksIGdldF9pbl9hZGRyKGFkZHIpLCBzb2NrZXRfaXAsIElORVQ2X0FERFJTVFJMRU4pPT1zb2NrZXRfaXApeworICAgICAgZ19kZWJ1ZygiV2UgYXJlIGNvbm5lY3RlZCB0byBob3N0ICVzIGNoZWNraW5nIGFnYWluc3QgY2VydGlmaWNhdGUuLi4iLCBzb2NrZXRfaXApOworICAgICAgaW50IHNpemVpcCA9IHNvY2tldF9pcCE9TlVMTCA/IHN0cmxlbihzb2NrZXRfaXApIDogMDsKKyAgICAgIGZvcihwID0gYWRkcl9pbmZvOyBwICE9IE5VTEw7IHAgPSBwLT5haV9uZXh0KSB7CisJICBpZihpbmV0X250b3AocC0+YWlfZmFtaWx5LCBnZXRfaW5fYWRkcigoc3RydWN0IHNvY2thZGRyICopcC0+YWlfYWRkciksIGRuc2hvc3QsIElORVQ2X0FERFJTVFJMRU4pPT1kbnNob3N0KXsKKwkgICAgICBpZihkbnNob3N0IT1OVUxMKXsKKwkJICBnX2luZm8oIkROUyBhZGRyZXNzIFslaSAtPiAlc10iLCBwLT5haV9hZGRyLCBkbnNob3N0KTsKKwkJICBpZighc3RybmNtcChkbnNob3N0LCBzb2NrZXRfaXAsIHNpemVpcCkpeworCQkgICAgICByZXR2YWw9MTsKKwkJICAgICAgYnJlYWs7IC8qIGlmIHdlIGdldCBoZXJlLCB3ZSBtdXN0IGhhdmUgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseSAqLworCQkgIH0KKwkgICAgICB9CisJICB9CisgICAgICB9CisgIH0KKworICBpZihhZGRyX2luZm8pCisgICAgZnJlZWFkZHJpbmZvKGFkZHJfaW5mbyk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQKK3JlYWRfZnJvbV9maWxlKGNoYXIgKmJ1ZmZlciwgbG9uZyBzaXplLCBjb25zdCBjaGFyICpmaWxlX25hbWUpCit7CisgIGNoYXIgY2g7CisgIGxvbmcgaW5kZXg9MDsKKyAgRklMRSAqZnA7CisKKyAgZnAgPSBmb3BlbihmaWxlX25hbWUsInIiKTsgLyogcmVhZCBtb2RlICovCisKKyAgaWYoIGZwID09IE5VTEwgKQorICAgIHsKKyAgICAgIHBlcnJvcigiRXJyb3Igd2hpbGUgb3BlbmluZyB0aGUgZmlsZS5cbiIpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKworICBwcmludGYoIlRoZSBjb250ZW50cyBvZiAlcyBmaWxlIGFyZSA6XG4iLCBmaWxlX25hbWUpOworCisgIHdoaWxlKGluZGV4PHNpemUgJiYgKCBjaCA9IGZnZXRjKGZwKSApICE9IEVPRiApeworICAgICAgYnVmZmVyW2luZGV4KytdID0gY2g7CisgIH0KKworICBmY2xvc2UoZnApOworfQorCisjZGVmaW5lIElTU1VFUl9DTl9QSU5OSU5HICJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iCisjZGVmaW5lIFNVQkpFQ1RfQ05fUElOTklORyAibG9jYWxob3N0IgorI2RlZmluZSBDRVJUX1NFUklBTF9OVU1CRVIgIjEiCisKK2dib29sZWFuIHZlcmlmeV9jZXJ0aWZpY2F0ZV9zbihYNTA5ICpjZXJ0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzZXJpYWxfbnVtYmVyKQoreworICBnYm9vbGVhbiByZXR2YWwgPSBGQUxTRTsKKworICBBU04xX0lOVEVHRVIgKnNlcmlhbCA9IFg1MDlfZ2V0X3NlcmlhbE51bWJlcihjZXJ0KTsKKworICBCSUdOVU0gKmJuID0gQVNOMV9JTlRFR0VSX3RvX0JOKHNlcmlhbCwgTlVMTCk7CisgIGlmICghYm4pIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGNvbnZlcnQgQVNOMUlOVEVHRVIgdG8gQk5cbiIpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICBjaGFyICp0bXAgPSBCTl9ibjJkZWMoYm4pOworICBpZiAoIXRtcCkgeworICAgICAgZ193YXJuaW5nKHN0ZGVyciwgInVuYWJsZSB0byBjb252ZXJ0IEJOIHRvIGRlY2ltYWwgc3RyaW5nLlxuIik7CisgICAgICBCTl9mcmVlKGJuKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgLyoKKyAgICBpZiAoc3RybGVuKHRtcCkgPj0gbGVuKSB7CisgICAgICBnX3dhcm4oc3RkZXJyLCAiYnVmZmVyIGxlbmd0aCBzaG9ydGVyIHRoYW4gc2VyaWFsIG51bWJlclxuIik7CisgICAgICBCTl9mcmVlKGJuKTsKKyAgICAgIE9QRU5TU0xfZnJlZSh0bXApOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICovCisgIGlmKCFzdHJuY21wKHNlcmlhbF9udW1iZXIsIHRtcCwgc3RybGVuKHNlcmlhbF9udW1iZXIpKSl7CisgICAgICByZXR2YWw9VFJVRTsKKyAgfWVsc2V7CisgICAgICBnX3dhcm5pbmcoIlNlcmlhbCBudW1iZXIgaXMgbm90IHZhbGlkIik7CisgIH0KKworICBCTl9mcmVlKGJuKTsKKyAgT1BFTlNTTF9mcmVlKHRtcCk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK2dib29sZWFuIG15X2FjY2Vzc19tYW5hZ2VyKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgWDUwOSAqY2VydCwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbFNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGdfaW5mbygiUHJvY2Vzc2luZyBhY2Nlc3MgdG8gdGhlIHNlcnZlciIpOworICBYNTA5X05BTUUqIGluYW1lID0gY2VydCA/IFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKGNlcnQpIDogTlVMTDsKKyAgWDUwOV9OQU1FKiBzbmFtZSA9IGNlcnQgPyBYNTA5X2dldF9zdWJqZWN0X25hbWUoY2VydCkgOiBOVUxMOworCisgIC8qIElzc3VlciBpcyB0aGUgYXV0aG9yaXR5IHdlIHRydXN0IHRoYXQgd2FycmFudHMgbm90aGluZyB1c2VmdWwgKi8KKyAgY29uc3QgdW5zaWduZWQgY2hhciAqIGlzc3VlciA9IGdldF9jbl9uYW1lKGluYW1lKTsKKyAgaWYoaXNzdWVyKXsKKyAgICAgIGdib29sZWFuIHZhbGlkID0gVFJVRTsKKyAgICAgIGdfaW5mbygiSXNzdWVyIChjbikgJXMiLCBpc3N1ZXIpOworCisgICAgICAvKiBJc3N1ZXIgcGlubmluZyAqLworICAgICAgaWYoc3RybmNtcChJU1NVRVJfQ05fUElOTklORywgaXNzdWVyLCBzdHJsZW4oSVNTVUVSX0NOX1BJTk5JTkcpKSl7CisJICBnX3dhcm5pbmcoIlRoZSBJc3N1ZXIgb2YgdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB2YWxpZCIpOworCSAgdmFsaWQ9RkFMU0U7CisgICAgICB9CisgICAgICBPUEVOU1NMX2ZyZWUoaXNzdWVyKTsKKyAgICAgIGlmKCF2YWxpZCkKKwlyZXR1cm4gdmFsaWQ7CisgIH0KKworCisgIC8qIFN1YmplY3QgaXMgd2hvIHRoZSBjZXJ0aWZpY2F0ZSBpcyBpc3N1ZWQgdG8gYnkgdGhlIGF1dGhvcml0eSAgKi8KKyAgY29uc3QgdW5zaWduZWQgY2hhciAqIHN1YmplY3QgPSBnZXRfY25fbmFtZShzbmFtZSk7CisgIGlmKHN1YmplY3QpeworICAgICAgZ19pbmZvKCJTdWJqZWN0IChjbikgJXMiLCBzdWJqZWN0KTsKKyAgICAgIGdib29sZWFuIHZhbGlkID0gVFJVRTsKKworICAgICAgLyogU3ViamVjdCBwaW5uaW5nICovCisgICAgICBpZihzdHJuY21wKFNVQkpFQ1RfQ05fUElOTklORywgc3ViamVjdCwgc3RybGVuKFNVQkpFQ1RfQ05fUElOTklORykpKXsKKwkgIGdfd2FybmluZygiVGhlIHN1YmplY3Qgb2YgdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB2YWxpZCIpOworCSAgdmFsaWQ9RkFMU0U7CisgICAgICB9CisKKyAgICAgIGlmKCF2YWxpZCkKKwlyZXR1cm4gdmFsaWQ7CisKKyAgICAgIC8qIEhvc3QgcGlubmluZyAgICAgICAqLworICAgICAgaWYodmVyaWZ5X2lwKHN1YmplY3QsIGFkZHIpKXsKKwkgIGdfaW5mbygiVmVyaWZpZWQgc3ViamVjdCIpOworICAgICAgfWVsc2V7CisJICBnX2luZm8oIkNhbm5vdCB2ZXJpZnkgc3ViamVjdCIpOworCSAgdmFsaWQ9RkFMU0U7CisgICAgICB9CisgICAgICBPUEVOU1NMX2ZyZWUoc3ViamVjdCk7CisKKyAgICAgIGlmKCF2YWxpZCkKKwlyZXR1cm4gdmFsaWQ7CisgIH0KKworICBpZighdmVyaWZ5X2NlcnRpZmljYXRlX3NuKGNlcnQsIENFUlRfU0VSSUFMX05VTUJFUikpeworICAgICAgcmV0dXJuIEZBTFNFOworICB9ZWxzZXsKKyAgICAgIGdfaW5mbygiVmVyaWZpZWQgc2VyaWFsIG51bWJlciIpOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK30KKworCisKKworI2lmZGVmIEJVSUxEX1NFUlZFUgorc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX2F1dGhvcml6YXRpb25fbWFuYWdlcih2b2lkKQoreworICBpbnQgc3RhdHVzPTA7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U1NMU29ja2V0ICp0U1NMc29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICAvKiAgaW50IHBvcnQgPSA1MTE5OTsgKi8KKyAgaW50IHBvcnQgPSA0NDM7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKworICBndWNoYXIgYnVmWzE3XSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KKworLyoKKyAgcGlkID0gZm9yayAoKTsKKyAgICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF9zZXJ2ZXIgKHBvcnQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkqLworICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworICBzbGVlcCAoMSk7CisKKyAgLyogVGVzdCBhZ2FpbnN0IGxldmVsMiBvd25jbG91ZCBjZXJ0aWZpY2F0ZSAqLworICB0U1NMc29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QiLCBwb3J0LCAmZXJyb3IpOworICB0aHJpZnRfc3NsX3NvY2tldF9zZXRfbWFuYWdlcih0U1NMc29ja2V0LCBteV9hY2Nlc3NfbWFuYWdlcik7ICAgICAgICAgICAvKiBJbnN0YWxsIHBpbm5pbmcgbWFuYWdlciAqLworICAvKiB0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2ZpbGUodFNTTHNvY2tldCwgIi4vb3duY2xvdWQubGV2ZWwyY3JtLnBlbSIpOyAqLworICB1bnNpZ25lZCBjaGFyIGNlcnRfYnVmZmVyWzY1NTM0XTsKKyAgcmVhZF9mcm9tX2ZpbGUoY2VydF9idWZmZXIsIDY1NTM0LCAiLi4vLi4va2V5cy9jbGllbnQucGVtIik7CisgIGlmKCF0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2J1ZmZlcih0U1NMc29ja2V0LCBjZXJ0X2J1ZmZlcikpeworICAgICAgZ193YXJuaW5nKCJDZXJ0aWZpY2F0ZXMgY2Fubm90IGJlIGxvYWRlZCEiKTsKKyAgfQorCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xzb2NrZXQpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisgIHRocmlmdF9zc2xfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTcsIE5VTEwpOworCisgIC8qIHdyaXRlIGZhaWwgKi8KKyAgc2VuZF9lcnJvciA9IDE7CisgIC8qCisgICAgICB0aHJpZnRfc3NsX3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworICAgICBzZW5kX2Vycm9yID0gMDsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgKi8KKyAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmICh0U1NMc29ja2V0KTsKKworICAvKiAgICBnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOyAqLworICBnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgIC8qICB9ICovCit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KQoreworICBpbnQgYnl0ZXMgPSAwOworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgZ3VjaGFyIGJ1ZlsxMF07IC8qIGEgYnVmZmVyICovCisgIGd1Y2hhciBtYXRjaFsxMF0gPSBURVNUX0RBVEE7CisKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisKKyAgLyogcmVhZCAxMCBieXRlcyAqLworICBieXRlcyA9IHRocmlmdF9zc2xfc29ja2V0X3JlYWQgKGNsaWVudCwgYnVmLCAxMCwgTlVMTCk7CisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisKKyAgLyogZmFpbGVkIHJlYWQgKi8KKyAgcmVjdl9lcnJvciA9IDE7CisgIHRocmlmdF9zc2xfc29ja2V0X3JlYWQgKGNsaWVudCwgYnVmLCAxLCBOVUxMKTsKKyAgcmVjdl9lcnJvciA9IDA7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZF9lbmQgKGNsaWVudCwgTlVMTCk7CisgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHJldHZhbDsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfaW5pdGlhbGl6ZV9vcGVuc3NsKCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3Rfc3NsX2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0L0NyZWF0ZUFuZFNldFByb3BlcnRpZXMiLCB0ZXN0X3NzbF9jcmVhdGVfYW5kX3NldF9wcm9wZXJ0aWVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQvT3BlbkFuZENsb3NlTm9uU1NMU2VydmVyIiwgdGVzdF9zc2xfb3Blbl9hbmRfY2xvc2Vfbm9uX3NzbF9zZXJ2ZXIpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC9PcGVuQW5kV3JpdGVJbnZhbGlkU29ja2V0IiwgdGVzdF9zc2xfd3JpdGVfaW52YWxpZF9zb2NrZXQpOworCisKKworCisgIHJldHZhbCA9IGdfdGVzdF9ydW4gKCk7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemVfb3BlbnNzbCgpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9jbC9NYWtlZmlsZS5hbSBiL2xpYi9jbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGIzODg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCithbGwtbG9jYWw6CisJYmFzaCBlbnN1cmUtZXh0ZXJuYWxzLnNoCisKK3J1bi10ZXN0czogdGVzdC9tYWtlLXRlc3QtYmluYXJ5Lmxpc3AKKwkkKFNCQ0wpIC0tc2NyaXB0IHRlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCisKK2NoZWNrLWxvY2FsOiBydW4tdGVzdHMKKwkuL3J1bi10ZXN0cworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBydW4tdGVzdHMgcXVpY2tsaXNwLmxpc3AgYmFja3BvcnQtdXBkYXRlLnppcAorCSQoUk0pIC1yZiBsaWIgZXh0ZXJuYWxzIHF1aWNrbGlzcAorCitFWFRSQV9ESVNUID0gXAorCVJFQURNRS5tZCBcCisJUkVBRE1FUyBcCisJbG9hZC1sb2NhbGx5Lmxpc3AgXAorCXRlc3QgXAorCWVuc3VyZS1leHRlcm5hbHMuc2gKZGlmZiAtLWdpdCBhL2xpYi9jbC9SRUFETUUubWQgYi9saWIvY2wvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNmVhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjUzIEBACitUaHJpZnQgQ29tbW9uIExpc3AgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisKKworVXNpbmcgVGhyaWZ0IHdpdGggQ29tbW9uIExpc3AKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIFRocmlmdCBpcyBhIHByb3RvY29sIGFuZCBsaWJyYXJ5IGZvciBsYW5ndWFnZS1pbmRlcGVuZGVudCBjb21tdW5pY2F0aW9uIGJldHdlZW4gY29vcGVyYXRpbmcKKyBwcm9jZXNzZXMuIFRoZSBjb21tdW5pY2F0aW9uIHRha2VzIHRoZSBmb3JtIG9mIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG1lc3NhZ2VzLCBvZiB3aGljaCB0aGUgZm9ybXMKKyBhcmUgc3BlY2lmaWVkIGluIGFkdmFuY2UgdGhyb3VmaCBhIHNoYXJlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4gQSBUaHJpZnQgZGVmaW5pdGlvbiBmaWxlIGlzIHRyYW5zbGF0ZWQKKyBpbnRvIExpc3Agc291cmNlIGZpbGVzLCB3aGljaCBjb21wcmlzZSBzZXZlcmFsIGRlZmluaXRpb25zOgorCisgICogVGhyZWUgcGFja2FnZXMsIG9uZSBmb3IgdGhlIG5hbWVzcGFjZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb3BlcmF0b3JzLCBhbmQgb25lIGVhY2ggZm9yIHJlcXVlc3QgYW5kCisgIHJlc3BvbnNlIG9wZXJhdG9ycy4KKyAgKiBWYXJpb3VzIHR5cGUgZGVmaW5pdGlvbnMgYXMgaW1wbGVtZW50YXRpb25zIGZvciBUaHJpZnQgdHlwZWRlZiBhbmQgZW51bSBkZWZpbml0aW9ucy4KKyAgKiBERUYtU1RSVUNUIGFuZCBERUYtRVhDRVBUSU9OIGZvcm1zIGZvciBUaHJpZnQgc3RydWN0IGFuZCBleGNlcHRpb24gZGVmaW5pdGlvbnMuCisgICogREVGLVNFUlZJQ0UgZm9ybXMgZm9yIHRocmlmdCBzZXJ2aWNlIGRlZmluaXRpb25zLgorCisgRWFjaCBzZXJ2aWNlIGRlZmluaXRpb24gZXhwYW5kcyBpbiBhIGNvbGxlY3Rpb24gb2YgZ2VuZXJpYyBmdW5jdGlvbiBkZWZpbml0aW9ucy4gRm9yIGVhY2ggYG9wYAorIGluIHRoZSBzZXJ2aWNlIGRlZmluaXRpb24sIHR3byBmdW5jdGlvbnMgYXJlIGRlZmluZWQKKworICAqIGBvcGAtcmVxdWVzdCBpcyBkZWZpbmVkIGZvciB1c2UgYnkgYSBjbGllbnQuIEl0IGFjY2VwdHMgYW4gYWRkaXRpb25hbCBpbml0aWFsIGBwcm90b2NvbGAgYXJndW1lbnQsCisgICAgdG8gYWN0IGFzIHRoZSBjbGllbnQgcHJveHkgZm9yIHRoZSBvcGVyYXRpb24gYW5kIG1lZGlhdGUgdGhlIGludGVyYWN0aW9uIHdpdGggYSByZW1vdGUgcHJvY2VzcworICAgIHRocm91Z2ggYSBUaHJpZnQtZW5jb2RlZCB0cmFuc3BvcnQgc3RyZWFtLgorICAqIGBvcGAtcmVzcG9uc2UgaXMgZGVmaW5lZCBmb3IgdXNlIGJ5IGEgc2VydmVyLiBJdCBhY2NlcHRzIGEgc2luZ2xlIGBwcm90b2NvbGAgYXJndW1lbnQuIEEgc2VydmVyCisgICAgdXNlcyBpdCB0byBkZWNvZGUgdGhlIHJlcXVlc3QgbWVzc2FnZSwgaW52b2tlIHRoZSBiYXNlIGBvcGAgZnVuY3Rpb24gd2l0aCB0aGUgbWVzc2FnZSBhcmd1bWVudHMsCisgICAgZW5jb2RlIGFuZCBzZW5kIHRoZSB0aGUgcmVzdWx0IGFzIGEgcmVzcG9uc2UsIGFuZCBoYW5kbGVzIGV4Y2VwdGlvbnMuCisKKyBUaGUgY2xpZW50IGludGVyZmFjZSBpcyBvbmUgb3BlcmF0b3IKKworICAqIGB3aXRoLWNsaWVudCAodmFyaWFibGUgbG9jYXRpb24pIC4gYm9keWAgOiBjcmVhdGVzIGEgY29ubmVjdGlvbiBpbiBhIGR5bmFtaWMgY29udGV4dCBhbmQgY2xvc2VzIGl0CisgICAgdXBvbiBleGl0LiBUaGUgdmFyaWFibGUgaXMgYm91bmQgdG8gYSBjbGllbnQgcHJveHkgc3RyZWFtL3Byb3RvY29sIGluc3RhbmNlLCB3aGljaCB3cmFwcyB0aGUKKyAgICBiYXNlIGkvbyBzdHJlYW0gLSBzb2NrZXQsIGZpbGUsIGV0Yywgd2l0aCBhbiBvcGVyYXRvcnMgd2hpY2ggaW1wbGVtZW50IHRoZSBUaHJpZnQgcHJvdG9jb2wKKyAgICBhbmQgdHJhbnNwb3J0IG1lY2hhbmlzbXMuCisKKyBUaGUgc2VydmVyIGludGVyZmFjZSBjb21iaW5lcyBzZXJ2ZXIgYW5kIHNlcnZpY2Ugb2JqZWN0cworCisgICogYHNlcnZlIChsb2NhdGlvbiBzZXJ2aWNlKWAgOiBhY2NlcHRzIGNvbm5lY3Rpb25zIG9uIHRoZSBkZXNpZ25hdGVkIHBvcnQgYW5kIHJlc3BvbmRzIHRvCisgICAgcmVxdWVzdHMgb2YgdGhlIHNlcnZpY2UncyBvcGVyYXRpb25zLgorCisKK0J1aWxkaW5nIAorLS0tLS0tLS0KKworVGhlIFRocmlmdCBDb21tb24gTGlzcCBsaWJyYXJ5IGlzIHBhY2thZ2VkIGFzIHRoZSBBU0RGW1sxXV0gc3lzdGVtIGB0aHJpZnRgLgorSXQgZGVwZW5kcyBvbiB0aGUgc3lzdGVtcworCisqIHB1cmlbWzJdXSA6IGZvciB0aGUgdGhyaWZ0IHVyaSBjbGFzcworKiBjbG9zZXItbW9wW1szXV0gOiBmb3IgY2xhc3MgbWV0YWRhdGEKKyogdHJpdmlhbC11dGYtOFtbNF1dIDogZm9yIHN0cmluZyBjb2RlY3MKKyogdXNvY2tldFtbNV1dIDogZm9yIHRoZSBzb2NrZXQgdHJhbnNwb3J0CisqIGllZWUtZmxvYXRzW1s2XV0gOiBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIGludHMgYW5kIGZsb2F0cworKiB0cml2aWFsLWdyYXktc3RyZWFtc1tbN11dIDogYW4gYWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGdyYXkgc3RyZWFtcworKiBhbGV4YW5kcmlhW1s4XV0gOiBoYW5keSB1dGlsaXRpZXMKKworVGhlIGRlcGVuZGVuY2llcyBhcmUgYnVuZGxlZCBmb3IgbG9jYWwgYnVpbGRzIG9mIHRlc3RzIGFuZCB0dXRvcmlhbCBiaW5hcmllcyAtIAoraXQgaXMgcG9zc2libGUgdG8gdXNlIHRob3NlIGJ1bmRsZXMgdG8gbG9hZCB0aGUgbGlicmFyeSwgdG9vLgorCitJbiBvcmRlciB0byBidWlsZCBpdCwgcmVnaXN0ZXIgdGhvc2Ugc3lzdGVtcyB3aXRoIEFTREYgYW5kIGV2YWx1YXRlOgorCisgICAgKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdCkKKworVGhpcyB3aWxsIGNvbXBpbGUgYW5kIGxvYWQgdGhlIExpc3AgY29tcGlsZXIgZm9yIFRocmlmdCBkZWZpbml0aW9uIGZpbGVzLCB0aGUKK3RyYW5zcG9ydCBhbmQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zLCBhbmQgdGhlIGNsaWVudCBhbmQgc2VydmVyIGludGVyZmFjZQorZnVuY3Rpb25zLiBJbiBvcmRlciB0byB1c2UgVGhyaWZ0IGluIGFuIGFwcGxpY2F0aW9uLCBvbmUgbXVzdCBhbHNvIGF1dGhvciBhbmQvb3IKK2xvYWQgdGhlIGludGVyZmFjZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlbW90ZSBzZXJ2aWNlLltbOV1dIElmIG9uZSBpcyBpbXBsZW1lbnRpbmcgYSBzZXJ2aWNlLAorb25lIG11c3QgYWxzbyBkZWZpbmUgdGhlIGFjdHVhbCBmdW5jdGlvbnMgdG8gd2hpY2ggVGhyaWZ0IGlzIHRvIGFjdCBhcyB0aGUgcHJveHkKK2ludGVyZmFjZS4gVGhlIHJlbWFpbmRlciBvZiB0aGlzIGRvY3VtZW50IGZvbGxvd3MgdGhlIFRocmlmdCB0dXRvcmlhbCB0byBpbGx1c3RyYXRlIGhvdwordG8gcGVyZm9ybSB0aGUgc3RlcHMKKworICAqIGltcGxlbWVudCB0aGUgc2VydmljZQorICAqIHRyYW5zbGF0ZSB0aGUgVGhyaWZ0IElETAorICAqIGxvYWQgdGhlIExpc3Agc2VydmljZSBpbnRlcmZhY2VzCisgICogcnVuIGEgc2VydmVyIGZvciB0aGUgc2VydmljZQorICAqIHVzZSBhIGNsaWVudCB0byBhY2Nlc3MgdGhlIHNlcnZpY2UgcmVtb3RlbHkKKworTm90ZSB0aGF0LCBpZiBvbmUgaXMgdG8gaW1wbGVtZW50IGEgbmV3IHNlcnZpY2UsIG9uZSB3aWxsIGFsc28gbmVlZCB0byBhdXRob3IgdGhlCitJREwgZmlsZXMsIGFzIHRoZXJlIGlzIG5vIGZhY2lsaXR5IHRvIGdlbmVyYXRlIHRoZW0gZnJvbSBhIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uCisKKworSW1wbGVtZW50IHRoZSBTZXJ2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHR1dG9yaWFsIGNvbXByaXNlcyBzZXJ2ZXJhbCBmdW5jdGlvbnM6IGBhZGRgLCBgcGluZ2AsIGB6aXBgLCBhbmQgYGNhbGN1bGF0ZWAuCitFYWNoIHRyYW5zbGF0ZWQgSURMIGZpbGUgZ2VuZXJhdGVzIHRocmVlIHBhY2thZ2VzIGZvciBldmVyeSBzZXJ2aWNlLiBJbiB0aGUgY2FzZSBvZgordGhlIHR1dG9yaWFsIGZpbGUsIHRoZSByZWxldmFudCBwYWNrYWdlcyBhcmU6CisKKyAgKiB0dXRvcmlhbC5jYWxjdWxhdG9yCisgICogdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbgorICAqIHR1dG9yaWFsLmNhbGN1bGF0b3ItcmVzcG9uc2UKKyAgCitUaGlzIGlzIHRvIHNlcGFyYXRlIHRoZSByZXF1ZXN0IChnZW5lcmF0ZWQpLCByZXNwb25zZSAoZ2VuZXJhdGVkKSBhbmQgaW1wbGVtZW50YXRpb24KKyhtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgcHJvZ3JhbW1lcikgZnVuY3Rpb25zIGZvciBkZWZpbmVkIFRocmlmdCBtZXRob2RzLgorCitJdCBpcyBzdWdnZXN0ZWQgdG8gd29yayBpbiB0aGUgYHR1dG9yaWFsLWltcGxlbWVudGF0aW9uYCBwYWNrYWdlIHdoaWxlIGltcGxlbWVudGluZwordGhlIHNlcnZpY2VzIC0gaXQgaW1wb3J0cyB0aGUgYGNvbW1vbi1saXNwYCBwYWNrYWdlLCB3aGlsZSB0aGUgc2VydmljZS1zcGVjaWZpYyBvbmVzCitkb24ndCAodG8gYXZvaWQgY29uZmxpY3RzIGJldHdlZW4gVGhyaWZ0IG1ldGhvZCBuYW1lcyBhbmQgZnVuY3Rpb24gbmFtZXMgaW4gYGNvbW1vbi1saXNwYCkuCisKKyAgICA7OyBkZWZpbmUgdGhlIGJhc2Ugb3BlcmF0aW9ucworICAgIAorICAgIChpbi1wYWNrYWdlIDp0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbikKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjphZGQgKG51bTEgbnVtMikKKyAgICAgIChmb3JtYXQgdCAifiZBc2tlZCB0byBhZGQgfkEgYW5kIH5BLiIgbnVtMSBudW0yKQorICAgICAgKCsgbnVtMSBudW0yKSkKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjpwaW5nICgpCisgICAgICAocHJpbnQgOnBpbmcpKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOnppcCAoKQorICAgICAgKHByaW50IDp6aXApKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOmNhbGN1bGF0ZSAobG9naWQgdGFzaykKKyAgICAgIChjYWxjdWxhdGUtb3AgKHdvcmstb3AgdGFzaykgKHdvcmstbnVtMSB0YXNrKSAod29yay1udW0yIHRhc2spKSkKKyAgICAKKyAgICAoZGVmZ2VuZXJpYyBjYWxjdWxhdGUtb3AgKG9wIGFyZzEgYXJnMikKKyAgICAgICg6bWV0aG9kIDphcm91bmQgKG9wIGFyZzEgYXJnMikKKyAgICAgICAgKGxldCAoKHJlc3VsdCAoY2FsbC1uZXh0LW1ldGhvZCkpKQorICAgICAgICAgIChmb3JtYXQgdCAifiZBc2tlZCB0byBjYWxjdWxhdGU6IH5kIG9uICB+QSBhbmQgfkEgPSB+ZC4iIG9wIGFyZzEgYXJnMiByZXN1bHQpCisgICAgICAgICAgcmVzdWx0KSkKKyAgICAKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24uYWRkKSkgYXJnMSBhcmcyKQorICAgICAgICAoKyBhcmcxIGFyZzIpKQorICAgICAgKDptZXRob2QgKChvcCAoZXFsIG9wZXJhdGlvbi5zdWJ0cmFjdCkpIGFyZzEgYXJnMikKKyAgICAgICAgKC0gYXJnMSBhcmcyKSkKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24ubXVsdGlwbHkpKSBhcmcxIGFyZzIpCisgICAgICAgICgqIGFyZzEgYXJnMikpCisgICAgICAoOm1ldGhvZCAoKG9wIChlcWwgb3BlcmF0aW9uLmRpdmlkZSkpIGFyZzEgYXJnMikKKyAgICAgICAgKC8gYXJnMSBhcmcyKSkpCisgICAgCisgICAgKGRlZnVuIHppcCAoKSAocHJpbnQgJ3ppcCkpCisKKworVHJhbnNsYXRlIHRoZSBUaHJpZnQgSURMCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSURMIGZpbGVzIGVtcGxveSB0aGUgZmlsZSBleHRlbnNpb24gYHRocmlmdGAuIEluIHRoaXMgY2FzZSwgdGhlcmUgYXJlIHR3byBmaWxlcyB0byB0cmFuc2xhdGUKKyAgKiBgdHV0b3JpYWwudGhyaWZ0YAorICAqIGBzaGFyZWQudGhyaWZ0YAorQXMgdGhlIGZvcm1lciBpbmNsdWRlcyB0aGUgbGF0dGVyLCBvbmUgdXNlcyBpdCB0byBnZW5lcmF0ZSB0aGUgaW50ZXJmYWNlczoKKworICAgICRUSFJJRlQvYmluL3RocmlmdCAtciAtLWdlbiBjbCAkVEhSSUZUL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorICAgIAorYC1yYCBzdGFuZHMgZm9yIHJlY3Vyc2lvbiwgd2hpbGUgYC0tZ2VuYCBsZXRzIG9uZSBjaG9vc2UgdGhlIGxhbmd1YWdlIHRvIHRyYW5zbGF0ZSB0by4KKworCitMb2FkIHRoZSBMaXNwIHRyYW5zbGF0ZWQgc2VydmljZSBpbnRlcmZhY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB0cmFuc2xhdG9yIGdlbmVyYXRlcyB0aHJlZSBmaWxlcyBmb3IgZWFjaCBJREwgZmlsZS4gRm9yIGV4YW1wbGUgYHR1dG9yaWFsLXR5cGVzLmxpc3BgLAorYHR1dG9yaWFsLXZhcnMubGlzcGAgYW5kIGFuIGAuYXNkYCBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gbG9hZCB0aGVtIGJvdGggYW5kIHB1bGwgaW4KK290aGVyIGluY2x1ZGVzIChsaWtlIGBzaGFyZWRgIHdpdGhpbiB0aGUgdHV0b3JpYWwpIGFzIGRlcGVuZGVuY2llcy4KKworCitSdW4gYSBTZXJ2ZXIgZm9yIHRoZSBTZXJ2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBhY3R1YWwgc2VydmljZSBuYW1lLCBhcyBzcGVjaWZpZWQgaW4gdGhlIGBkZWYtc2VydmljZWAgZm9ybSBpbiBgdHV0b3JpYWwubGlzcGAsIGlzIGBjYWxjdWxhdG9yYC4gCitFYWNoIHNlcnZpY2UgZGVmaW5pdGlvbiBkZWZpbmVzIGEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhlIHNlcnZpY2UgbmFtZSBhbmQgYmluZHMgaXQgdG8gYQorc2VydmljZSBpbnN0YW5jZSB3aGNoIGRlc2NyaWJlcyB0aGUgb3BlcmF0aW9ucy4KKworSW4gb3JkZXIgdG8gc3RhcnQgYSBzZXJ2aWNlLCBzcGVjaWZ5IGEgbG9jYXRpb24gYW5kIHRoZSBzZXJ2aWNlIGluc3RhbmNlLiAKKworICAgIChpbi1wYWNrYWdlIDp0dXRvcmlhbCkKKyAgICAoc2VydmUgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTEiIGNhbGN1bGF0b3IpCisKKworVXNlIGEgQ2xpZW50IHRvIEFjY2VzcyB0aGUgU2VydmljZSBSZW1vdGVseQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1tpbiBzb21lIG90aGVyIHByb2Nlc3NdIHJ1biB0aGUgY2xpZW50CisKKyAgICAoaW4tcGFja2FnZSA6Y2wtdXNlcikKKworICAgIChtYWNyb2xldCAoKHNob3cgKGZvcm0pCisgICAgICAgICAgICAgICAgIGAoZm9ybWF0ICp0cmFjZS1vdXRwdXQqICJ+JX5zID0+fnsgfnN+fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyxmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtdWx0aXBsZS12YWx1ZS1saXN0IChpZ25vcmUtZXJyb3JzICxmb3JtKSkpKSkKKyAgICAgICh3aXRoLWNsaWVudCAocHJvdG9jb2wgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTEiKQorICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpwaW5nIHByb3RvY29sKSkKKyAgICAgICAgKHNob3cgKHR1dG9yaWFsLmNhbGN1bGF0b3I6YWRkIHByb3RvY29sIDEgMikpCisgICAgICAgIChzaG93ICh0dXRvcmlhbC5jYWxjdWxhdG9yOmFkZCBwcm90b2NvbCAxIDQpKQorICAgIAorICAgICAgICAobGV0ICgodGFzayAobWFrZS1pbnN0YW5jZSAndHV0b3JpYWw6d29yaworICAgICAgICAgICAgICAgICAgICAgIDpvcCBvcGVyYXRpb24uc3VidHJhY3QgOm51bTEgMTUgOm51bTIgMTApKSkKKyAgICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdG9jb2wgMSB0YXNrKSkKKyAgICAgICAgCisgICAgICAgICAgKHNldGYgKHR1dG9yaWFsOndvcmstb3AgdGFzaykgb3BlcmF0aW9uLmRpdmlkZQorICAgICAgICAgICAgICAgICh0dXRvcmlhbDp3b3JrLW51bTEgdGFzaykgMQorICAgICAgICAgICAgICAgICh0dXRvcmlhbDp3b3JrLW51bTIgdGFzaykgMCkKKyAgICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdG9jb2wgMSB0YXNrKSkpCisgICAgICAgIAorICAgICAgICAoc2hvdyAoc2hhcmVkLnNoYXJlZC1zZXJ2aWNlOmdldC1zdHJ1Y3QgcHJvdG9jb2wgMSkpCisgICAgCisgICAgICAgIChzaG93ICh6aXAgcHJvdG9jb2wpKSkpCisKK0lzc3VlcworLS0tLS0tCisKKyMjIyBvcHRpb25hbCBmaWVsZHMgCisgV2hlcmUgdGhlIElETCBkZWNsYXJlcyBhIGZpZWxkIG9wdGlvbnMsIHRoZSBkZWYtc3RydWN0IGZvcm0gaW5jbHVkZXMgbm8KKyBpbml0Zm9ybSBmb3IgdGhlIHNsb3QgYW5kIHRoZSBlbmNvZGluZyBvcGVyYXRvciBza2lwcyBhbiB1bmJvdW5kIHNsb3QuIFRoaXMgbGVhdmUgc29tZSBhbWJpZ3VpdHkKKyB3aXRoIGJvb2wgZmllbGRzLgorCisjIyMgaW5zdGFudGlhdGlvbiBwcm90b2NvbCA6Cisgc3RydWN0IGNsYXNzZXMgYXJlIHN0YW5kYXJkIGNsYXNzZXMgYW5kIGV4Y2VwdGlvbiBjbGFzc2VzIGFyZQorIHdoYXRldmVyIHRoZSBpbXBsZW1lbnRhdGlvbiBwcmVzY3JpYmVzLiBkZWNvZGVycyBhcHBseSBtYWtlLXN0cnVjdCB0byBhbiBpbml0YXJncyBsaXN0LgorIHBhcnRpY3VsYXJseSBhdCB0aGUgc2VydmljZSBlbmQsIHRoZXJlIGFyZSBhZHZhbnRhZ2VzIHRvIHJlc291cmNpbmcgc3RydWN0cyBhbmQgZGVjb2RpbmcKKyB3aXRoIGRpcmVjdCBzaWRlLWVmZmVjdHMgb24gc2xvdC12YWx1ZXMKKworIyMjIG1hcHM6CisgTWFwcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIGhhc2ggdGFibGVzLiBBcyBkYXRhIHRocm91Z2ggdGhlIGNhbGwvcmVwbHkgaW50ZXJmYWNlIGlzIGFsbCBzdGF0aWNhbGx5CisgdHlwZWQsIGl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIHRoZSBvYmplY3RzIHRvIHRoZW1zZWx2ZXMgaW5kaWNhdGUgdGhlIGNvZGluZyBmb3JtLiBBc3NvY2lhdGlvbiBsaXN0cworIHdvdWxkIGJlIHN1ZmZpY2llbnQuIEFzIHRoZSBrZXkgdHlwZSBpcyBhcmJpdHJhcnksIHByb3BlcnR5IGxpc3RzIG9mZmVyIG5vIGFkZGl0aW9uYWwgY29udmVuaWVuY2U6CisgYXMgYGdldGZgIG9wZXJhdGVzIHdpdGggYGVxYCBhIG5ldyBhY2Nlc3MgaW50ZXJmYWNlIHdvdWxkIGJlIG5lY2Vzc2FyeSBhbmQgdGhleSB3b3VsZCBub3QgYmUKKyBhdmFpbGFibGUgZm9yIGZ1bmN0aW9uIGFwcGxpY2F0aW9uLgorCisKKyBbMV06IHd3dy5jb21tb24tbGlzcC5uZXQvYXNkZgorIFsyXTogaHR0cDovL2dpdGh1Yi5jb20vbGlzcC9jb20uYjkucHVyaS5wcGNyZQorIFszXTogd3d3LmNvbW1vbi1saXNwLm5ldC9jbG9zZXItbW9wCisgWzRdOiB0cml2aWFsLXV0Zi04CisgWzVdOiBodHRwczovL2dpdGh1Yi5jb20vdXNvY2tldC91c29ja2V0CisgWzZdOiBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9pZWVlLWZsb2F0cworIFs3XTogaHR0cHM6Ly9naXRodWIuY29tL3RyaXZpYWwtZ3JheS1zdHJlYW1zL3RyaXZpYWwtZ3JheS1zdHJlYW1zCisgWzhdOiBodHRwczovL2dpdGxhYi5jb21tb24tbGlzcC5uZXQvYWxleGFuZHJpYS9hbGV4YW5kcmlhCisgWzldOiBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRHZW5lcmF0aW9uCisKKyogdXNvY2tldFtbNV1dIDogZm9yIHRoZSBzb2NrZXQgdHJhbnNwb3J0CisqIGllZWUtZmxvYXRzW1s2XV0gOiBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIGludHMgYW5kIGZsb2F0cworKiB0cml2aWFsLWdyYXktc3RyZWFtc1tbN11dIDogYW4gYWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGdyYXkgc3RyZWFtcworKiBhbGV4YW5kcmlhW1s4XV0gOiBoYW5keSB1dGlsaXRpZXMKZGlmZiAtLWdpdCBhL2xpYi9jbC9SRUFETUVTL3JlYWRtZS1jYXNzYW5kcmEubGlzcCBiL2xpYi9jbC9SRUFETUVTL3JlYWRtZS1jYXNzYW5kcmEubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc0NGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL1JFQURNRVMvcmVhZG1lLWNhc3NhbmRyYS5saXNwCkBAIC0wLDAgKzEsNjQgQEAKKyhpbi1wYWNrYWdlIDpjbC11c2VyKQorCisjKyhvciBjY2wgc2JjbCkgL2RldmVsb3BtZW50L3NvdXJjZS9saWJyYXJ5LworKGxvYWQgImJ1aWxkLWluaXQubGlzcCIpCisKKzs7OyAhIGZpcnN0LCBzZWxlY3QgdGhlIGFwaSB2ZXJzaW9uIGluIHRoZSBjYXNzYW5kcmEgc3lzdGVtIGRlZmluaXRpb24KKzs7OyBhcyBvbmx5IG9uZSBzaG91bGQgYmUgbG9hZGVkIGF0IGEgdGltZS4KKyhhc2RmOmxvYWQtc3lzdGVtIDpkZS5zZXRmLmNhc3NhbmRyYSkKKworKGluLXBhY2thZ2UgOmRlLnNldGYuY2Fzc2FuZHJhKQorCisoZGVmcGFyYW1ldGVyICpjLWxvY2F0aW9uKgorICA7OyByZW1vdGUKKyAgOzsgI3UidGhyaWZ0Oi8vZWMyLTE3NC0xMjktNjYtMTQ4LmNvbXB1dGUtMS5hbWF6b25hd3MuY29tOjkxNjAiCisgIDs7IGxvY2FsCisgICN1InRocmlmdDovLzEyNy4wLjAuMTo5MTYwIgorICAiQSBjYXNzYW5kcmEgc2VydmljZSBsb2NhdGlvbiAtIGVpdGhlciB0aGUgbG9jYWwgb25lIG9yIGEgcmVtb3RlIHNlcnZpY2UgCisgLSBhbHdheXMgYSAndGhyaWZ0JyB1cmkuIikKKworKGRlZnBhcmFtZXRlciAqYyogKHRocmlmdDpjbGllbnQgKmMtbG9jYXRpb24qKSkKKworCisoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlcyAqYyopCis7OyA9PiAoIktleXNwYWNlMSIgInN5c3RlbSIpCisKKyhjYXNzYW5kcmE6ZGVzY3JpYmUtY2x1c3Rlci1uYW1lICpjKikKKzs7ID0+IlRlc3QgQ2x1c3RlciIKKworKGNhc3NhbmRyYTpkZXNjcmliZS12ZXJzaW9uICpjKikKKzs7ID0+ICIyLjEuMCIKKworKGxvb3AgZm9yIHNwYWNlIGluIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2VzICpjKikKKyAgICAgIGNvbGxlY3QgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5IG9mIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2UgKmMqIHNwYWNlKQorICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCBmb3Iga2V5IGJlaW5nIGVhY2ggaGFzaC1rZXkgb2YgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleSB2YWx1ZSkpKSkpCisKKworKGNsb3NlICpjKikKKworKGRlZnVuIGRlc2NyaWJlLWNhc3NhbmRyYSAobG9jYXRpb24gJm9wdGlvbmFsIChzdHJlYW0gKnN0YW5kYXJkLW91dHB1dCopKQorICAiUHJpbnQgdGhlIGZpcnN0LW9yZGVyIHN0b3JlIG1ldGFkYXRhIGZvciBhIGNhc3NhbmRyYSBMT0NBVElPTi4iCisKKyAgKHRocmlmdDp3aXRoLWNsaWVudCAoY2Fzc2FuZHJhIGxvY2F0aW9uKQorICAgIChsZXQqICgoa2V5c3BhY2UtbmFtZXMgKGNhc3NhbmRyYTpkZXNjcmliZS1rZXlzcGFjZXMgY2Fzc2FuZHJhKSkKKyAgICAgICAgICAgKGNsdXN0ZXIgKGNhc3NhbmRyYTpkZXNjcmliZS1jbHVzdGVyLW5hbWUgY2Fzc2FuZHJhKSkKKyAgICAgICAgICAgKHZlcnNpb24gKGNhc3NhbmRyYTpkZXNjcmliZS12ZXJzaW9uIGNhc3NhbmRyYSkpCisgICAgICAgICAgIChrZXlzcGFjZS1kZXNjcmlwdGlvbnMgKGxvb3AgZm9yIHNwYWNlIGluIGtleXNwYWNlLW5hbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiAoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlIGNhc3NhbmRyYSBzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5IG9mIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleSB2YWx1ZSkpKSkpKSkpCisgICAgICAoZm9ybWF0IHN0cmVhbSAifiZjb25uZWN0aW9uIHRvIDogfmEiIGNhc3NhbmRyYSkKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JnZlcnNpb24gOiB+YSIgdmVyc2lvbikKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JmNsdXN0ZXIgOiB+YSIgY2x1c3RlcikKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JmtleXNwYWNlc357fnt+JX4lc3BhY2U6IH5hfkB7fiUgIH57fmEgOn5Ae34yMHR+Ond+Xn4lfn1+fX59fn1+fSIga2V5c3BhY2UtZGVzY3JpcHRpb25zKSkpKQorCis7OzsgKGRlc2NyaWJlLWNhc3NhbmRyYSAqYy1sb2NhdGlvbiopCmRpZmYgLS1naXQgYS9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaCBiL2xpYi9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0OTVmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vYmFzaAorCitzZXQgLWUKKworaWYgW1sgISAtZSBxdWlja2xpc3AubGlzcCBdXTsgdGhlbiBjdXJsIC1PIGh0dHBzOi8vYmV0YS5xdWlja2xpc3Aub3JnL3F1aWNrbGlzcC5saXNwOyBmaQorc2JjbCAtLWxvYWQgcXVpY2tsaXNwLmxpc3AgXAorICAgICAtLWV2YWwgIihpZ25vcmUtZXJyb3JzIChxdWlja2xpc3AtcXVpY2tzdGFydDppbnN0YWxsIDpwYXRoIFwicXVpY2tsaXNwL1wiKSkiIFwKKyAgICAgLS1ldmFsICIobG9hZCBcInF1aWNrbGlzcC9zZXR1cC5saXNwXCIpIiBcCisgICAgIC0tZXZhbCAiKHF1aWNrbGlzcDpidW5kbGUtc3lzdGVtcyAnKCM6cHVyaSAjOnVzb2NrZXQgIzpjbG9zZXItbW9wICM6dHJpdmlhbC11dGYtOCAjOmllZWUtZmxvYXRzICM6dHJpdmlhbC1ncmF5LXN0cmVhbXMgIzphbGV4YW5kcmlhICM6Ym9yZGVhdXgtdGhyZWFkcyAjOmNsLXBwY3JlICM6Zmlhc2NvICM6bmV0LmRpZGllcnZlcm5hLmNsb24pIDp0byBcImV4dGVybmFscy9cIikiIFwKKyAgICAgLS1ldmFsICIocXVpdCkiIFwKKyAgICAgLS1uby11c2VyaW5pdAoraWYgW1sgISAtZSBiYWNrcG9ydC11cGRhdGUuemlwIF1dOyB0aGVuCisgICAgY3VybCAtTyAtTCBodHRwczovL2dpdGh1Yi5jb20vVHVydGxlV2FyZVBML2RlLnNldGYudGhyaWZ0L2FyY2hpdmUvYmFja3BvcnQtdXBkYXRlLnppcDsKK2ZpCitta2RpciAtcCBsaWIKK3VuemlwIC11IGJhY2twb3J0LXVwZGF0ZS56aXAgLWQgbGliCmRpZmYgLS1naXQgYS9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AgYi9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyYzcwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcApAQCAtMCwwICsxLDIzIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBKdXN0IGEgc2NyaXB0IGZvciBsb2FkaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZiwgdXNpbmcgYnVuZGxlZCBkZXBlbmRlbmNpZXMuCis7Ozs7IFRoaXMgaXMgaGVyZSBmb3Igd2hlbiB3ZSB3YW50IHRvIGJ1aWxkIHRoZSBzZWxmLXRlc3QgYW5kIGNyb3NzLXRlc3QKKzs7OzsgYmluYXJpZXMuCisKKyhyZXF1aXJlICJhc2RmIikKKworKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiZXh0ZXJuYWxzL2J1bmRsZS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAibGliL2RlLnNldGYudGhyaWZ0LWJhY2twb3J0LXVwZGF0ZS90aHJpZnQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdCkKZGlmZiAtLWdpdCBhL2xpYi9jbC90ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcCBiL2xpYi9jbC90ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTdhNThjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL3Rlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCkBAIC0wLDAgKzEsMzEgQEAKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBUaGlzIGZpbGUgaXMgdXNlZCB0byBidWlsZCB0aGUgYmluYXJ5IHRoYXQgcnVucyBhbGwgc2VsZi10ZXN0cy4gVGhlCis7Ozs7IGJpbmFyeSBpcyB0aGVuIG1lYW50IHRvIGJlIGhvb2tlZCB1cCB0byBUaHJpZnQncyBgbWFrZSBjaGVja2AgZmFjaWxpdHksCis7Ozs7IGJ1dCBjYW4gZWFzaWx5IGJlIHJ1biBvbiBpdHMgb3duIGFzIHdlbGwuCisKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiLi4vbG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICIuLi9saWIvZGUuc2V0Zi50aHJpZnQtYmFja3BvcnQtdXBkYXRlL3Rlc3QvdGhyaWZ0LXRlc3QuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC10ZXN0KQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGRlZnVuIG1haW4gKCkKKyAgKGxldCAoKHJlc3VsdCAoaWYgKGZpYXNjbzpydW4tdGVzdHMgJ3RocmlmdC10ZXN0KSAwIC0xKSkpCisgICAgKGNsb246ZXhpdCByZXN1bHQpKSkKKworKGNsb246ZHVtcCAicnVuLXRlc3RzIiBtYWluKQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL1JFQURNRS5tZCBiL2xpYi9jb2NvYS9SRUFETUUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTNjOTMuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL1JFQURNRS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLVRocmlmdCBDb2NvYSBTb2Z0d2FyZSBMaWJyYXJ5Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwMjdkNi4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJURXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUUHJvdG9jb2wuaCIKLQotZW51bSB7Ci0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOID0gMCwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOS05PV05fTUVUSE9EID0gMSwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfTUVTU0FHRV9UWVBFID0gMiwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1dST05HX01FVEhPRF9OQU1FID0gMywKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0JBRF9TRVFVRU5DRV9JRCA9IDQsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9NSVNTSU5HX1JFU1VMVCA9IDUsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlRFUk5BTF9FUlJPUiA9IDYsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9QUk9UT0NPTF9FUlJPUiA9IDcsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX1RSQU5TRk9STSA9IDgsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX1BST1RPQ09MID0gOSwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAKLX07Ci0KLS8vIEZJWE1FCi1AaW50ZXJmYWNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA6IFRFeGNlcHRpb24gewotICBpbnQgbVR5cGU7Ci19Ci0KLSsgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqKSByZWFkOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sOwotCi0tICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsKLQotKyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopIGV4Y2VwdGlvbldpdGhUeXBlOiAoaW50KSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSBtZXNzYWdlOwotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24ubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0ZGZjNS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5tCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUUHJvdG9jb2xVdGlsLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKLQotQGltcGxlbWVudGF0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgotCi0tIChpZCkgaW5pdFdpdGhUeXBlOiAoaW50KSB0eXBlCi0gICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi17Ci0gIG1UeXBlID0gdHlwZTsKLQotICBOU1N0cmluZyAqIG5hbWU7Ci0gIHN3aXRjaCAodHlwZSkgewotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOX01FVEhPRDoKLSAgICBuYW1lID0gQCJVbmtub3duIG1ldGhvZCI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfTUVTU0FHRV9UWVBFOgotICAgIG5hbWUgPSBAIkludmFsaWQgbWVzc2FnZSB0eXBlIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fV1JPTkdfTUVUSE9EX05BTUU6Ci0gICAgbmFtZSA9IEAiV3JvbmcgbWV0aG9kIG5hbWUiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9CQURfU0VRVUVOQ0VfSUQ6Ci0gICAgbmFtZSA9IEAiQmFkIHNlcXVlbmNlIElEIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fTUlTU0lOR19SRVNVTFQ6Ci0gICAgbmFtZSA9IEAiTWlzc2luZyByZXN1bHQiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlRFUk5BTF9FUlJPUjoKLSAgICBuYW1lID0gQCJJbnRlcm5hbCBlcnJvciI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1BST1RPQ09MX0VSUk9SOgotICAgIG5hbWUgPSBAIlByb3RvY29sIGVycm9yIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fSU5WQUxJRF9UUkFOU0ZPUk06Ci0gICAgbmFtZSA9IEAiSW52YWxpZCB0cmFuc2Zvcm0iOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX1BST1RPQ09MOgotICAgIG5hbWUgPSBAIkludmFsaWQgcHJvdG9jb2wiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTlNVUFBPUlRFRF9DTElFTlRfVFlQRToKLSAgICBuYW1lID0gQCJVbnN1cHBvcnRlZCBjbGllbnQgdHlwZSI7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgbmFtZSA9IEAiVW5rbm93biI7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBzZWxmID0gW3N1cGVyIGluaXRXaXRoTmFtZTogbmFtZSByZWFzb246IHJlYXNvbiB1c2VySW5mbzogbmlsXTsKLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLQotKyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopIHJlYWQ6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wKLXsKLSAgTlNTdHJpbmcgKiByZWFzb24gPSBuaWw7Ci0gIGludCB0eXBlID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOS05PV047Ci0gIGludCBmaWVsZFR5cGU7Ci0gIGludCBmaWVsZElEOwotCi0gIFtwcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiBOVUxMXTsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIFtwcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IE5VTEwKLSAgICAgICAgICAgICAgdHlwZTogJmZpZWxkVHlwZQotICAgICAgICAgICAgICBmaWVsZElEOiAmZmllbGRJRF07Ci0gICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZV9TVE9QKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgc3dpdGNoIChmaWVsZElEKSB7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZV9TVFJJTkcpIHsKLSAgICAgICAgcmVhc29uID0gW3Byb3RvY29sIHJlYWRTdHJpbmddOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlX0kzMikgewotICAgICAgICB0eXBlID0gW3Byb3RvY29sIHJlYWRJMzJdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgW3Byb3RvY29sIHJlYWRGaWVsZEVuZF07Ci0gIH0KLSAgW3Byb3RvY29sIHJlYWRTdHJ1Y3RFbmRdOwotCi0gIHJldHVybiBbVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhUeXBlOiB0eXBlIHJlYXNvbjogcmVhc29uXTsKLX0KLQotCi0tICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbAotewotICBbcHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiJdOwotCi0gIGlmIChbc2VsZiByZWFzb25dICE9IG5pbCkgewotICAgIFtwcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQCJtZXNzYWdlIgotICAgICAgICAgICAgICAgICB0eXBlOiBUVHlwZV9TVFJJTkcKLSAgICAgICAgICAgICAgICAgZmllbGRJRDogMV07Ci0gICAgW3Byb3RvY29sIHdyaXRlU3RyaW5nOiBbc2VsZiByZWFzb25dXTsKLSAgICBbcHJvdG9jb2wgd3JpdGVGaWVsZEVuZF07Ci0gIH0KLQotICBbcHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEAidHlwZSIKLSAgICAgICAgICAgICAgIHR5cGU6IFRUeXBlX0kzMgotICAgICAgICAgICAgICAgZmllbGRJRDogMl07Ci0gIFtwcm90b2NvbCB3cml0ZUkzMjogbVR5cGVdOwotICBbcHJvdG9jb2wgd3JpdGVGaWVsZEVuZF07Ci0KLSAgW3Byb3RvY29sIHdyaXRlRmllbGRTdG9wXTsKLSAgW3Byb3RvY29sIHdyaXRlU3RydWN0RW5kXTsKLX0KLQotCi0rIChUQXBwbGljYXRpb25FeGNlcHRpb24gKikgZXhjZXB0aW9uV2l0aFR5cGU6IChpbnQpIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi17Ci0gIHJldHVybiBbW1tUQXBwbGljYXRpb25FeGNlcHRpb24gYWxsb2NdIGluaXRXaXRoVHlwZTogdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IHJlYXNvbl0gYXV0b3JlbGVhc2Vfc3R1Yl07Ci19Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQuaCBiL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5NDRiMS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RCYXNlQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRQcm90b2NvbC5oIgotI2ltcG9ydCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgiCi0KLUBpbnRlcmZhY2UgVEJhc2VDbGllbnQgOiBOU09iamVjdCB7Ci0gICAgaWQgPFRQcm90b2NvbD4gaW5Qcm90b2NvbDsKLSAgICBpZCA8VFByb3RvY29sPiBvdXRQcm90b2NvbDsKLX0KLQotLSAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb247Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubSBiL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1ZjlkMy4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RCYXNlQ2xpZW50Lm0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRCYXNlQ2xpZW50LmgiCi0jaW1wb3J0ICJUQXBwbGljYXRpb25FeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotCi1AaW1wbGVtZW50YXRpb24gVEJhc2VDbGllbnQKLQotLSAodm9pZCkgZGVhbGxvYwotewotICAgIFtpblByb3RvY29sIHJlbGVhc2Vfc3R1Yl07Ci0gICAgW291dFByb3RvY29sIHJlbGVhc2Vfc3R1Yl07Ci0gICAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07Ci19Ci0KLS0gKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqKWNoZWNrSW5jb21pbmdNZXNzYWdlRXhjZXB0aW9uCi17Ci0gICAgaW50IG1zZ1R5cGUgPSAwOwotICAgIFtpblByb3RvY29sIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOiBuaWwgdHlwZTogJm1zZ1R5cGUgc2VxdWVuY2VJRDogTlVMTF07Ci0gICAgaWYgKG1zZ1R5cGUgPT0gVE1lc3NhZ2VUeXBlX0VYQ0VQVElPTikgewotICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24gKiB4ID0gW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZWFkOiBpblByb3RvY29sXTsKLSAgICAgICAgW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOwotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5pbDsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2ZjRmYS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0KLUBpbnRlcmZhY2UgVEV4Y2VwdGlvbiA6IE5TRXhjZXB0aW9uIHsKLX0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZTsKLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uOwotCi0rIChpZCkgZXhjZXB0aW9uV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICBlcnJvcjogKE5TRXJyb3IgKikgZXJyb3I7Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjBlM2IuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotCi1AaW1wbGVtZW50YXRpb24gVEV4Y2VwdGlvbgotCi0rIChpZCkgZXhjZXB0aW9uV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi17Ci0gIHJldHVybiBbc2VsZiBleGNlcHRpb25XaXRoTmFtZTogbmFtZSByZWFzb246IEAidW5rbm93biIgZXJyb3I6IG5pbF07Ci19Ci0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi17Ci0gIHJldHVybiBbc2VsZiBleGNlcHRpb25XaXRoTmFtZTogbmFtZSByZWFzb246IHJlYXNvbiBlcnJvcjogbmlsXTsKLX0KLQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICBlcnJvcjogKE5TRXJyb3IgKikgZXJyb3IKLXsKLSAgTlNEaWN0aW9uYXJ5ICogdXNlckluZm8gPSBuaWw7Ci0gIGlmIChlcnJvciAhPSBuaWwpIHsKLSAgICB1c2VySW5mbyA9IFtOU0RpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhPYmplY3Q6IGVycm9yIGZvcktleTogQCJlcnJvciJdOwotICB9Ci0KLSAgcmV0dXJuIFtzdXBlciBleGNlcHRpb25XaXRoTmFtZTogbmFtZQotICAgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uCi0gICAgICAgICAgICAgICAgdXNlckluZm86IHVzZXJJbmZvXTsKLX0KLQotCi0tIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbgotewotICBOU011dGFibGVTdHJpbmcgKiByZXN1bHQgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IFtzZWxmIG5hbWVdXTsKLSAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6IEAiOiAlQCIsIFtzZWxmIHJlYXNvbl1dOwotICBpZiAoW3NlbGYgdXNlckluZm9dICE9IG5pbCkgewotICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OiBAIlxuICB1c2VySW5mbyA9ICVAIiwgW3NlbGYgdXNlckluZm9dXTsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UT2JqZWN0aXZlLUMuaCBiL2xpYi9jb2NvYS9zcmMvVE9iamVjdGl2ZS1DLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDgzMWQuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9UT2JqZWN0aXZlLUMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIFRPYmplY3RpdmUtQy5oIGlzIGZvciBzdXBwb3J0aW5nIGNvZXhpc3RlbmNlIG9mIGJvdGggdGhlIEFSQyAoQXV0b21hdGljIAotICogUmVmZXJlbmNlIENvdW50aW5nKSBtb2RlIGFuZCB0aGUgTm9uLUFSQyBtb2RlIG9mIE9iamVjdGl2ZS1DIAotICogaW4gdGhlIHNhbWUgc291cmNlIGNvZGUuCi0gKgotICogICAgICAgICAgICAgICAgICAyMDExLzExLzE0ICBISVJBTk8gU2F0b3NoaSAoQUlTVCwgSmFwYW4pCi0gKgotICogQmVmb3JlOgotICoKLSAqICAgIHZhciA9IFthT2JqZWN0IHJldGFpbl07Ci0gKiAgICBbYU9iamVjdCByZWxlYXNlXTsKLSAqICAgIFthT2JqZWN0IGF1dG9yZWxlYXNlXTsKLSAqICAgIFtzdXBlciBkZWFsbG9jXTsKLSAqICAgIENGRnVuY3Rpb24ob2JqKTsKLSAqCi0gKiBBUkMgYW5kIE5vbi1BUkMgY29tcGF0aWJsZToKLSAqCi0gKiAgICAjaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKLSAqICAgIHZhciA9IFthT2JqZWN0IHJldGFpbl9zdHViXTsKLSAqICAgIFthT2JqZWN0IHJlbGVhc2Vfc3R1Yl07Ci0gKiAgICBbYU9iamVjdCBhdXRvcmVsZWFzZV9zdHViXTsKLSAqICAgIFtzdXBlciBkZWFsbG9jX3N0dWJdOwotICogICAgQ0ZGdW5jdGlvbihicmlkZ2Vfc3R1YiBvYmopOwotICoKLSAqICAgIERvbid0IHVzZSByZXRhaW5fc3R1YiBmb3IgQHByb3BlcnR5KHJldGFpbikuCi0gKiAgICBVc2UgTlNBdXRvcmVsZWFzZVBvb2wgbGlrZSB0aGlzOgotICogICAgICAgICNpZiBfX2hhc19mZWF0dXJlKG9iamNfYXJjKQotICogICAgICAgICAgQGF1dG9yZWxlYXNlcG9vbCB7Ci0gKiAgICAgICAgICAgICAgLy8gY29kZSAKLSAqICAgICAgICAgIH0KLSAqICAgICAgICAjZWxzZQotICogICAgICAgICAgTlNBdXRvUmVsZWFzZVBvb2wgKnBvb2wgPSBbW05TQXV0b1JlbGVhc2VQb29sIGFsbG9jXSBpbml0Li4uCi0gKiAgICAgICAgICAvLyBjb2RlCi0gKiAgICAgICAgICBbcG9vbCByZWxlYXNlXTsKLSAqICAgICAgICAjZW5kaWYKLSAqLwotCi0KLSNpZiAhZGVmaW5lZChyZXRhaW5fc3R1YikKLSNpZiBfX2hhc19mZWF0dXJlKG9iamNfYXJjKQotI2RlZmluZSByZXRhaW5fc3R1YiBzZWxmCi0jZGVmaW5lIGF1dG9yZWxlYXNlX3N0dWIgc2VsZgotI2RlZmluZSByZWxlYXNlX3N0dWIgc2VsZgotI2RlZmluZSBkZWFsbG9jX3N0dWIgc2VsZgotI2RlZmluZSBicmlkZ2Vfc3R1YiBfX2JyaWRnZQotI2Vsc2UKLSNkZWZpbmUgcmV0YWluX3N0dWIgcmV0YWluCi0jZGVmaW5lIGF1dG9yZWxlYXNlX3N0dWIgYXV0b3JlbGVhc2UKLSNkZWZpbmUgcmVsZWFzZV9zdHViIHJlbGVhc2UKLSNkZWZpbmUgZGVhbGxvY19zdHViIGRlYWxsb2MKLSNkZWZpbmUgYnJpZGdlX3N0dWIKLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3IuaCBiL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODBiZTk0Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlRQcm90b2NvbC5oIgotCi0KLUBwcm90b2NvbCBUUHJvY2Vzc29yIDxOU09iamVjdD4KLQotLSAoQk9PTCkgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sCi0gICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sOwotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmggYi9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZDEyYjMuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlRQcm9jZXNzb3IuaCIKLQotQHByb3RvY29sIFRQcm9jZXNzb3JGYWN0b3J5IDxOU09iamVjdD4KLQotLSAoaWQ8VFByb2Nlc3Nvcj4pIHByb2Nlc3NvckZvclRyYW5zcG9ydDogKGlkPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaCBiL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0YTQ2Mi4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCAiVFByb2Nlc3NvckZhY3RvcnkuaCIKLQotQGludGVyZmFjZSBUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeSA6IE5TT2JqZWN0IDxUUHJvY2Vzc29yRmFjdG9yeT4gewotICBpZDxUUHJvY2Vzc29yPiBtU2hhcmVkUHJvY2Vzc29yOwotfQotLSAoaWQpIGluaXRXaXRoU2hhcmVkUHJvY2Vzc29yOiAoaWQ8VFByb2Nlc3Nvcj4pIHNoYXJlZFByb2Nlc3NvcjsKLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkubSBiL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAwMDdjMC4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5Lm0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2ltcG9ydCAiVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotCi0KLUBpbXBsZW1lbnRhdGlvbiBUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeQotCi0KLS0gKGlkKSBpbml0V2l0aFNoYXJlZFByb2Nlc3NvcjogKGlkPFRQcm9jZXNzb3I+KSBzaGFyZWRQcm9jZXNzb3IKLXsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKCFzZWxmKSB7Ci0gICAgcmV0dXJuIG5pbDsKLSAgfQotICAKLSAgbVNoYXJlZFByb2Nlc3NvciA9IFtzaGFyZWRQcm9jZXNzb3IgcmV0YWluX3N0dWJdOwotICByZXR1cm4gc2VsZjsKLX0KLQotCi0tICh2b2lkKSBkZWFsbG9jCi17Ci0gIFttU2hhcmVkUHJvY2Vzc29yIHJlbGVhc2Vfc3R1Yl07Ci0gIFtzdXBlciBkZWFsbG9jX3N0dWJdOwotfQotCi0KLS0gKGlkPFRQcm9jZXNzb3I+KSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6IChpZDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Ci17Ci0gIHJldHVybiBbW21TaGFyZWRQcm9jZXNzb3IgcmV0YWluX3N0dWJdIGF1dG9yZWxlYXNlX3N0dWJdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RocmlmdC5oIGIvbGliL2NvY29hL3NyYy9UaHJpZnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlZGI2Ni4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RocmlmdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIFRocmlmdFZlcnNpb24gQCIwLjkuMyIKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJhc2UuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwMzdlZi4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi0jaW1wb3J0ICJUUHJvdG9jb2wuaCIKLQotQHByb3RvY29sIFRCYXNlIDxOU09iamVjdD4KLQotLyoqCi0gKiBEZS1zZXJpYWxpemUgb2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sCi0gKgotICogQHBhcmFtIGlucHV0IHByb3RvY29sIHVzZWQgZm9yIHJlYWRpbmcgCi0gKi8KLS0gKHZvaWQpIHJlYWQ6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbDsKLQotLyoqCi0gKiBTZXJpYWxpemUgb2JqZWN0IHRvIHRoZSBnaXZlbiBwcm90b2NvbAotICoKLSAqIEBwYXJhbSBidWYgb3V0cHV0IHByb3RvY29sIHVzZWQgZm9yIHdyaXRpbmcKLSAqLwotLSAodm9pZCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2w7Ci0KLUBlbmQKLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNzM3MzAuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVFByb3RvY29sLmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0LmgiCi0jaW1wb3J0ICJUUHJvdG9jb2xGYWN0b3J5LmgiCi0KLQotQGludGVyZmFjZSBUQmluYXJ5UHJvdG9jb2wgOiBOU09iamVjdCA8VFByb3RvY29sPiB7Ci0gIGlkIDxUVHJhbnNwb3J0PiBtVHJhbnNwb3J0OwotICBCT09MIG1TdHJpY3RSZWFkOwotICBCT09MIG1TdHJpY3RXcml0ZTsKLSAgaW50MzJfdCBtTWVzc2FnZVNpemVMaW1pdDsKLX0KLQotLSAoaWQpIGluaXRXaXRoVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7Ci0KLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgIHN0cmljdFJlYWQ6IChCT09MKSBzdHJpY3RSZWFkCi0gICAgICAgICAgICAgc3RyaWN0V3JpdGU6IChCT09MKSBzdHJpY3RXcml0ZTsKLQotLSAoaW50MzJfdCkgbWVzc2FnZVNpemVMaW1pdDsKLS0gKHZvaWQpIHNldE1lc3NhZ2VTaXplTGltaXQ6IChpbnQzMl90KSBzaXplTGltaXQ7Ci0KLUBlbmQKLQotCi1AaW50ZXJmYWNlIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgOiBOU09iamVjdCA8VFByb3RvY29sRmFjdG9yeT4gewotfQotCi0rIChUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3Rvcnk7Ci0KLS0gKFRCaW5hcnlQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDdjNzIzLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLm0KKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUQmluYXJ5UHJvdG9jb2wuaCIKLSNpbXBvcnQgIlRQcm90b2NvbEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCi0KLS8qIEluIHRoZSBtb2Rlcm4gcHJvdG9jb2wsIHZlcnNpb24gaXMgc3RvcmVkIGluIHRoZSBoaWdoIGhhbGYgb2YgYW4gaW50MzIuCi0gKiBUaGUgbG93IGhhbGYgY29udGFpbnMgdHlwZSBpbmZvLiAqLwotc3RhdGljIGNvbnN0IHVpbnQxNl90IFZFUlNJT05fMSA9IDB4ODAwMTsKLQotTlNfSU5MSU5FIHNpemVfdAotQ2hlY2tlZENhc3RJbnQzMlRvU2l6ZVQoaW50MzJfdCBzaXplKQotewotICBpZiAoc2l6ZSA8IDApIHsKLSAgICBOU1N0cmluZyAqcmVhc29uID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBAIiVzOiByZWZ1c2luZyB0byByZWFkIGRhdGEgd2l0aCBuZWdhdGl2ZSBzaXplOiAlIlBSSWQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzaXplXTsKLSAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbgotICAgICAgICAgICAgZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgcmVhc29uOiByZWFzb25dOwotICB9Ci0gIHNpemVfdCBjaGVja2VkU2l6ZSA9IChzaXplX3Qpc2l6ZTsKLSAgcmV0dXJuIGNoZWNrZWRTaXplOwotfQotCi1OU19JTkxJTkUgaW50MzJfdAotQ2hlY2tlZENhc3RTaXplVFRvSW50MzIoc2l6ZV90IHNpemUpCi17Ci0gIGlmIChzaXplID4gSU5UMzJfTUFYKSB7Ci0gICAgTlNTdHJpbmcgKnJlYXNvbiA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OgotICAgICAgICAgICAgICAgICAgICAgICAgQCIlczogZGF0YSBzaXplIGV4Y2VlZHMgdmFsdWVzIHJlcHJlc2VudGFibGUgYnkgYSAzMi1iaXQgc2lnbmVkIGludGVnZXI6ICV6dSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc2l6ZV07Ci0gICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgICAgICAgIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRQcm90b2NvbEV4Y2VwdGlvbiIKLSAgICAgICAgICAgIHJlYXNvbjogcmVhc29uXTsKLSAgfQotICBpbnQzMl90IGNoZWNrZWRTaXplID0gKGludDMyX3Qpc2l6ZTsKLSAgcmV0dXJuIGNoZWNrZWRTaXplOwotfQotCi1OU19JTkxJTkUgdWludDhfdAotQ2hlY2tlZENhc3RJbnRUb1VJbnQ4KGludCBzaXplKQotewotICBpZiAoc2l6ZSA+IFVJTlQ4X01BWCkgewotICAgIE5TU3RyaW5nICpyZWFzb24gPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIEAiJXM6IGRhdGEgc2l6ZSBleGNlZWRzIHZhbHVlcyByZXByZXNlbnRhYmxlIGJ5IGEgOC1iaXQgdW5zaWduZWQgaW50ZWdlcjogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHNpemVdOwotICAgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uCi0gICAgICAgICAgICBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICByZWFzb246IHJlYXNvbl07Ci0gIH0KLSAgdWludDhfdCBjaGVja2VkU2l6ZSA9ICh1aW50OF90KXNpemU7Ci0gIHJldHVybiBjaGVja2VkU2l6ZTsKLX0KLQotc3RhdGljIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKiBnU2hhcmVkRmFjdG9yeSA9IG5pbDsKLQotQGltcGxlbWVudGF0aW9uIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkKLQotKyAoVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5IHsKLSAgaWYgKGdTaGFyZWRGYWN0b3J5ID09IG5pbCkgewotICAgIGdTaGFyZWRGYWN0b3J5ID0gW1tUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGFsbG9jXSBpbml0XTsKLSAgfQotCi0gIHJldHVybiBnU2hhcmVkRmFjdG9yeTsKLX0KLQotLSAoVEJpbmFyeVByb3RvY29sICopIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydCB7Ci0gIHJldHVybiBbW1RCaW5hcnlQcm90b2NvbCBhbGxvY10gaW5pdFdpdGhUcmFuc3BvcnQ6IHRyYW5zcG9ydF07Ci19Ci0KLUBlbmQKLQotCi0KLUBpbXBsZW1lbnRhdGlvbiBUQmluYXJ5UHJvdG9jb2wKLQotLSAoaWQpIGluaXRXaXRoVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKLXsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVHJhbnNwb3J0OiB0cmFuc3BvcnQgc3RyaWN0UmVhZDogTk8gc3RyaWN0V3JpdGU6IFlFU107Ci19Ci0KLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgIHN0cmljdFJlYWQ6IChCT09MKSBzdHJpY3RSZWFkCi0gICAgICAgICAgICAgc3RyaWN0V3JpdGU6IChCT09MKSBzdHJpY3RXcml0ZQotewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBtVHJhbnNwb3J0ID0gW3RyYW5zcG9ydCByZXRhaW5fc3R1Yl07Ci0gIG1TdHJpY3RSZWFkID0gc3RyaWN0UmVhZDsKLSAgbVN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7Ci0gIHJldHVybiBzZWxmOwotfQotCi0KLS0gKGludDMyX3QpIG1lc3NhZ2VTaXplTGltaXQKLXsKLSAgcmV0dXJuIG1NZXNzYWdlU2l6ZUxpbWl0OwotfQotCi0KLS0gKHZvaWQpIHNldE1lc3NhZ2VTaXplTGltaXQ6IChpbnQzMl90KSBzaXplTGltaXQKLXsKLSAgbU1lc3NhZ2VTaXplTGltaXQgPSBzaXplTGltaXQ7Ci19Ci0KLQotLSAodm9pZCkgZGVhbGxvYwotewotICBbbVRyYW5zcG9ydCByZWxlYXNlX3N0dWJdOwotICBbc3VwZXIgZGVhbGxvY19zdHViXTsKLX0KLQotCi0tIChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotewotICByZXR1cm4gbVRyYW5zcG9ydDsKLX0KLQotCi0tIChOU1N0cmluZyAqKSByZWFkU3RyaW5nQm9keTogKGludCkgcmF3U2l6ZQotewotICBzaXplX3Qgc2l6ZSA9IENoZWNrZWRDYXN0SW50MzJUb1NpemVUKHJhd1NpemUpOwotICBjaGFyICogYnVmZmVyID0gbWFsbG9jKHNpemUrMSk7Ci0gIGlmICghYnVmZmVyKSB7Ci0gICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGluICVzLCBzaXplOiAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVdXTs7Ci0gIH0KLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmZmVyIG9mZnNldDogMCBsZW5ndGg6IHNpemVdOwotICBidWZmZXJbc2l6ZV0gPSAwOwotICBOU1N0cmluZyAqIHJlc3VsdCA9IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzogYnVmZmVyXTsKLSAgZnJlZShidWZmZXIpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS0gKHZvaWQpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50ICopIHNlcXVlbmNlSUQKLXsKLSAgaW50MzJfdCBzaXplID0gW3NlbGYgcmVhZEkzMl07Ci0gIGlmIChzaXplIDwgMCkgewotICAgIC8qIFZlcnNpb24gKHVuc2lnbmVkKSBpcyBzdG9yZWQgaW4gdGhlIGhpZ2ggaGFsZndvcmQuICovCi0gICAgdWludDE2X3QgdmVyc2lvbiA9IChzaXplID4+IDE2KSAmIDB4RkZGRjsKLSAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpIHsKLSAgICAgIE5TU3RyaW5nICpyZWFzb24gPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQCIlczogRXhwZWN0ZWQgdmVyc2lvbiAlIlBSSXUxNiIsIGluc3RlYWQgZm91bmQ6ICUiUFJJdTE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgVkVSU0lPTl8xLCB2ZXJzaW9uXTsKLSAgICAgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRQcm90b2NvbEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uXTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgIT0gTlVMTCkgewotICAgICAgKnR5cGUgPSBzaXplICYgMHgwMEZGOwotICAgIH0KLSAgICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lID0gW3NlbGYgcmVhZFN0cmluZ107Ci0gICAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgICAgKm5hbWUgPSBtZXNzYWdlTmFtZTsKLSAgICB9Ci0gICAgaW50IHNlcUlEID0gW3NlbGYgcmVhZEkzMl07Ci0gICAgaWYgKHNlcXVlbmNlSUQgIT0gTlVMTCkgewotICAgICAgKnNlcXVlbmNlSUQgPSBzZXFJRDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKG1TdHJpY3RSZWFkKSB7Ci0gICAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEAiTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/Il07Ci0gICAgfQotICAgIGlmIChbc2VsZiBtZXNzYWdlU2l6ZUxpbWl0XSA+IDAgJiYgc2l6ZSA+IFtzZWxmIG1lc3NhZ2VTaXplTGltaXRdKSB7Ci0gICAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEAiTWVzc2FnZSB0b28gYmlnLiAgU2l6ZSBsaW1pdCBpczogJWQgTWVzc2FnZSBzaXplIGlzOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlU2l6ZUxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXV07Ci0gICAgfQotICAgIE5TU3RyaW5nICogbWVzc2FnZU5hbWUgPSBbc2VsZiByZWFkU3RyaW5nQm9keTogc2l6ZV07Ci0gICAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgICAgKm5hbWUgPSBtZXNzYWdlTmFtZTsKLSAgICB9Ci0gICAgaW50IG1lc3NhZ2VUeXBlID0gW3NlbGYgcmVhZEJ5dGVdOwotICAgIGlmICh0eXBlICE9IE5VTEwpIHsKLSAgICAgICp0eXBlID0gbWVzc2FnZVR5cGU7Ci0gICAgfQotICAgIGludCBzZXFJRCA9IFtzZWxmIHJlYWRJMzJdOwotICAgIGlmIChzZXF1ZW5jZUlEICE9IE5VTEwpIHsKLSAgICAgICpzZXF1ZW5jZUlEID0gc2VxSUQ7Ci0gICAgfQotICB9Ci19Ci0KLQotLSAodm9pZCkgcmVhZE1lc3NhZ2VFbmQge30KLQotCi0tICh2b2lkKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLXsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgICpuYW1lID0gbmlsOwotICB9Ci19Ci0KLQotLSAodm9pZCkgcmVhZFN0cnVjdEVuZCB7fQotCi0KLS0gKHZvaWQpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQgKikgZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQgKikgZmllbGRJRAotewotICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgKm5hbWUgPSBuaWw7Ci0gIH0KLSAgaW50IGZ0ID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpZiAoZmllbGRUeXBlICE9IE5VTEwpIHsKLSAgICAqZmllbGRUeXBlID0gZnQ7Ci0gIH0KLSAgaWYgKGZ0ICE9IFRUeXBlX1NUT1ApIHsKLSAgICBpbnQgZmlkID0gW3NlbGYgcmVhZEkxNl07Ci0gICAgaWYgKGZpZWxkSUQgIT0gTlVMTCkgewotICAgICAgKmZpZWxkSUQgPSBmaWQ7Ci0gICAgfQotICB9Ci19Ci0KLQotLSAodm9pZCkgcmVhZEZpZWxkRW5kIHt9Ci0KLQotLSAoaW50MzJfdCkgcmVhZEkzMgotewotICB1aW50OF90IGkzMnJkWzRdOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBpMzJyZCBvZmZzZXQ6IDAgbGVuZ3RoOiA0XTsKLSAgcmV0dXJuCi0gICAgKChpMzJyZFswXSAmIDB4ZmYpIDw8IDI0KSB8Ci0gICAgKChpMzJyZFsxXSAmIDB4ZmYpIDw8IDE2KSB8Ci0gICAgKChpMzJyZFsyXSAmIDB4ZmYpIDw8ICA4KSB8Ci0gICAgKChpMzJyZFszXSAmIDB4ZmYpKTsKLX0KLQotCi0tIChOU1N0cmluZyAqKSByZWFkU3RyaW5nCi17Ci0gIGludDMyX3Qgc2l6ZSA9IFtzZWxmIHJlYWRJMzJdOwotICByZXR1cm4gW3NlbGYgcmVhZFN0cmluZ0JvZHk6IHNpemVdOwotfQotCi0KLS0gKEJPT0wpIHJlYWRCb29sCi17Ci0gIHJldHVybiBbc2VsZiByZWFkQnl0ZV0gPT0gMTsKLX0KLQotLSAodWludDhfdCkgcmVhZEJ5dGUKLXsKLSAgdWludDhfdCBteUJ5dGU7Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6ICZteUJ5dGUgb2Zmc2V0OiAwIGxlbmd0aDogMV07Ci0gIHJldHVybiBteUJ5dGU7Ci19Ci0KLS0gKHNob3J0KSByZWFkSTE2Ci17Ci0gIHVpbnQ4X3QgYnVmZlsyXTsKLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiAyXTsKLSAgcmV0dXJuIChzaG9ydCkKLSAgICAoKChidWZmWzBdICYgMHhmZikgPDwgOCkgfAotICAgICAoKGJ1ZmZbMV0gJiAweGZmKSkpOwotfQotCi0tIChpbnQ2NF90KSByZWFkSTY0Ci17Ci0gIHVpbnQ4X3QgaTY0cmRbOF07Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6IGk2NHJkIG9mZnNldDogMCBsZW5ndGg6IDhdOwotICByZXR1cm4KLSAgICAoKGludDY0X3QpKGk2NHJkWzBdICYgMHhmZikgPDwgNTYpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzFdICYgMHhmZikgPDwgNDgpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzJdICYgMHhmZikgPDwgNDApIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzNdICYgMHhmZikgPDwgMzIpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzRdICYgMHhmZikgPDwgMjQpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzVdICYgMHhmZikgPDwgMTYpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzZdICYgMHhmZikgPDwgIDgpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzddICYgMHhmZikpOwotfQotCi0tIChkb3VibGUpIHJlYWREb3VibGUKLXsKLSAgLy8gRklYTUUgLSB3aWxsIHRoaXMgZ2V0IHVzIGludG8gdHJvdWJsZSBvbiBQb3dlclBDPwotICBpbnQ2NF90IGllZWU3NTQgPSBbc2VsZiByZWFkSTY0XTsKLSAgcmV0dXJuICooKGRvdWJsZSAqKSAmaWVlZTc1NCk7Ci19Ci0KLQotLSAoTlNEYXRhICopIHJlYWRCaW5hcnkKLXsKLSAgaW50MzJfdCBzaXplID0gW3NlbGYgcmVhZEkzMl07Ci0gIHNpemVfdCBiaW5hcnlTaXplID0gQ2hlY2tlZENhc3RJbnQzMlRvU2l6ZVQoc2l6ZSk7Ci0gIHVpbnQ4X3QgKiBidWZmID0gbWFsbG9jKGJpbmFyeVNpemUpOwotICBpZiAoYnVmZiA9PSBOVUxMKSB7Ci0gICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgICAgICAgICBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJPdXQgb2YgbWVtb3J5LiAgVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIHRyeWluZyB0byByZWFkIGJpbmFyeSBkYXRhLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV1dOwotICB9Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6IGJ1ZmYgb2Zmc2V0OiAwIGxlbmd0aDogYmluYXJ5U2l6ZV07Ci0gIHJldHVybiBbTlNEYXRhIGRhdGFXaXRoQnl0ZXNOb0NvcHk6IGJ1ZmYgbGVuZ3RoOiBiaW5hcnlTaXplXTsKLX0KLQotCi0tICh2b2lkKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiAoaW50ICopIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IChpbnQgKikgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKLXsKLSAgaW50IGt0ID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpbnQgdnQgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIGludCBzID0gW3NlbGYgcmVhZEkzMl07Ci0gIGlmIChrZXlUeXBlICE9IE5VTEwpIHsKLSAgICAqa2V5VHlwZSA9IGt0OwotICB9Ci0gIGlmICh2YWx1ZVR5cGUgIT0gTlVMTCkgewotICAgICp2YWx1ZVR5cGUgPSB2dDsKLSAgfQotICBpZiAoc2l6ZSAhPSBOVUxMKSB7Ci0gICAgKnNpemUgPSBzOwotICB9Ci19Ci0KLS0gKHZvaWQpIHJlYWRNYXBFbmQge30KLQotCi0tICh2b2lkKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZQotewotICBpbnQgZXQgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIGludCBzID0gW3NlbGYgcmVhZEkzMl07Ci0gIGlmIChlbGVtZW50VHlwZSAhPSBOVUxMKSB7Ci0gICAgKmVsZW1lbnRUeXBlID0gZXQ7Ci0gIH0KLSAgaWYgKHNpemUgIT0gTlVMTCkgewotICAgICpzaXplID0gczsKLSAgfQotfQotCi0KLS0gKHZvaWQpIHJlYWRTZXRFbmQge30KLQotCi0tICh2b2lkKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IChpbnQgKikgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplCi17Ci0gIGludCBldCA9IFtzZWxmIHJlYWRCeXRlXTsKLSAgaW50IHMgPSBbc2VsZiByZWFkSTMyXTsKLSAgaWYgKGVsZW1lbnRUeXBlICE9IE5VTEwpIHsKLSAgICAqZWxlbWVudFR5cGUgPSBldDsKLSAgfQotICBpZiAoc2l6ZSAhPSBOVUxMKSB7Ci0gICAgKnNpemUgPSBzOwotICB9Ci19Ci0KLQotLSAodm9pZCkgcmVhZExpc3RFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZUJ5dGU6ICh1aW50OF90KSB2YWx1ZQotewotICBbbVRyYW5zcG9ydCB3cml0ZTogJnZhbHVlIG9mZnNldDogMCBsZW5ndGg6IDFdOwotfQotCi0KLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBtZXNzYWdlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCkgc2VxdWVuY2VJRAotewotICBpZiAobVN0cmljdFdyaXRlKSB7Ci0gICAgaW50IHZlcnNpb24gPSAoVkVSU0lPTl8xIDw8IDE2KSB8IG1lc3NhZ2VUeXBlOwotICAgIFtzZWxmIHdyaXRlSTMyOiB2ZXJzaW9uXTsKLSAgICBbc2VsZiB3cml0ZVN0cmluZzogbmFtZV07Ci0gICAgW3NlbGYgd3JpdGVJMzI6IHNlcXVlbmNlSURdOwotICB9IGVsc2UgewotICAgIFtzZWxmIHdyaXRlU3RyaW5nOiBuYW1lXTsKLSAgICBbc2VsZiB3cml0ZUJ5dGU6IENoZWNrZWRDYXN0SW50VG9VSW50OChtZXNzYWdlVHlwZSldOwotICAgIFtzZWxmIHdyaXRlSTMyOiBzZXF1ZW5jZUlEXTsKLSAgfQotfQotCi0KLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUVuZCB7fQotCi0KLS0gKHZvaWQpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUge30KLQotCi0tICh2b2lkKSB3cml0ZVN0cnVjdEVuZCB7fQotCi0KLS0gKHZvaWQpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQpIGZpZWxkSUQKLXsKLSAgW3NlbGYgd3JpdGVCeXRlOiBDaGVja2VkQ2FzdEludFRvVUludDgoZmllbGRUeXBlKV07Ci0gIFtzZWxmIHdyaXRlSTE2OiBDaGVja2VkQ2FzdEludFRvVUludDgoZmllbGRJRCldOwotfQotCi0KLS0gKHZvaWQpIHdyaXRlSTMyOiAoaW50MzJfdCkgdmFsdWUKLXsKLSAgdWludDhfdCBidWZmWzRdOwotICBidWZmWzBdID0gMHhGRiAmICh2YWx1ZSA+PiAyNCk7Ci0gIGJ1ZmZbMV0gPSAweEZGICYgKHZhbHVlID4+IDE2KTsKLSAgYnVmZlsyXSA9IDB4RkYgJiAodmFsdWUgPj4gOCk7Ci0gIGJ1ZmZbM10gPSAweEZGICYgdmFsdWU7Ci0gIFttVHJhbnNwb3J0IHdyaXRlOiBidWZmIG9mZnNldDogMCBsZW5ndGg6IDRdOwotfQotCi0tICh2b2lkKSB3cml0ZUkxNjogKHNob3J0KSB2YWx1ZQotewotICB1aW50OF90IGJ1ZmZbMl07Ci0gIGJ1ZmZbMF0gPSAweGZmICYgKHZhbHVlID4+IDgpOwotICBidWZmWzFdID0gMHhmZiAmIHZhbHVlOwotICBbbVRyYW5zcG9ydCB3cml0ZTogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiAyXTsKLX0KLQotCi0tICh2b2lkKSB3cml0ZUk2NDogKGludDY0X3QpIHZhbHVlCi17Ci0gIHVpbnQ4X3QgYnVmZls4XTsKLSAgYnVmZlswXSA9IDB4RkYgJiAodmFsdWUgPj4gNTYpOwotICBidWZmWzFdID0gMHhGRiAmICh2YWx1ZSA+PiA0OCk7Ci0gIGJ1ZmZbMl0gPSAweEZGICYgKHZhbHVlID4+IDQwKTsKLSAgYnVmZlszXSA9IDB4RkYgJiAodmFsdWUgPj4gMzIpOwotICBidWZmWzRdID0gMHhGRiAmICh2YWx1ZSA+PiAyNCk7Ci0gIGJ1ZmZbNV0gPSAweEZGICYgKHZhbHVlID4+IDE2KTsKLSAgYnVmZls2XSA9IDB4RkYgJiAodmFsdWUgPj4gOCk7Ci0gIGJ1ZmZbN10gPSAweEZGICYgdmFsdWU7Ci0gIFttVHJhbnNwb3J0IHdyaXRlOiBidWZmIG9mZnNldDogMCBsZW5ndGg6IDhdOwotfQotCi0tICh2b2lkKSB3cml0ZURvdWJsZTogKGRvdWJsZSkgdmFsdWUKLXsKLSAgLy8gc3BpdCBvdXQgSUVFRSA3NTQgYml0cyAtIEZJWE1FIC0gd2lsbCB0aGlzIGdldCB1cyBpbiB0cm91YmxlIG9uCi0gIC8vIFBvd2VyUEM/Ci0gIFtzZWxmIHdyaXRlSTY0OiAqKChpbnQ2NF90ICopICZ2YWx1ZSldOwotfQotCi0KLS0gKHZvaWQpIHdyaXRlU3RyaW5nOiAoTlNTdHJpbmcgKikgdmFsdWUKLXsKLSAgaWYgKHZhbHVlICE9IG5pbCkgewotICAgIGNvbnN0IGNoYXIgKiB1dGY4Qnl0ZXMgPSBbdmFsdWUgVVRGOFN0cmluZ107Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbih1dGY4Qnl0ZXMpOwotICAgIGludDMyX3Qgc2l6ZSA9IENoZWNrZWRDYXN0U2l6ZVRUb0ludDMyKGxlbmd0aCk7Ci0gICAgW3NlbGYgd3JpdGVJMzI6IHNpemVdOwotICAgIFttVHJhbnNwb3J0IHdyaXRlOiAodWludDhfdCAqKSB1dGY4Qnl0ZXMgb2Zmc2V0OiAwIGxlbmd0aDogbGVuZ3RoXTsKLSAgfSBlbHNlIHsKLSAgICAvLyBpbnN0ZWFkIG9mIGNyYXNoaW5nIHdoZW4gd2UgZ2V0IG51bGwsIGxldCdzIHdyaXRlIG91dCBhIHplcm8KLSAgICAvLyBsZW5ndGggc3RyaW5nCi0gICAgW3NlbGYgd3JpdGVJMzI6IDBdOwotICB9Ci19Ci0KLQotLSAodm9pZCkgd3JpdGVCaW5hcnk6IChOU0RhdGEgKikgZGF0YQotewotICBpbnQzMl90IHNpemUgPSBDaGVja2VkQ2FzdFNpemVUVG9JbnQzMihbZGF0YSBsZW5ndGhdKTsKLSAgW3NlbGYgd3JpdGVJMzI6IHNpemVdOwotICBbbVRyYW5zcG9ydCB3cml0ZTogW2RhdGEgYnl0ZXNdIG9mZnNldDogMCBsZW5ndGg6IFtkYXRhIGxlbmd0aF1dOwotfQotCi0tICh2b2lkKSB3cml0ZUZpZWxkU3RvcAotewotICBbc2VsZiB3cml0ZUJ5dGU6IFRUeXBlX1NUT1BdOwotfQotCi0KLS0gKHZvaWQpIHdyaXRlRmllbGRFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6IChpbnQpIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCkgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKLXsKLSAgW3NlbGYgd3JpdGVCeXRlOiBDaGVja2VkQ2FzdEludFRvVUludDgoa2V5VHlwZSldOwotICBbc2VsZiB3cml0ZUJ5dGU6IENoZWNrZWRDYXN0SW50VG9VSW50OCh2YWx1ZVR5cGUpXTsKLSAgW3NlbGYgd3JpdGVJMzI6IHNpemVdOwotfQotCi0tICh2b2lkKSB3cml0ZU1hcEVuZCB7fQotCi0KLS0gKHZvaWQpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplCi17Ci0gIFtzZWxmIHdyaXRlQnl0ZTogQ2hlY2tlZENhc3RJbnRUb1VJbnQ4KGVsZW1lbnRUeXBlKV07Ci0gIFtzZWxmIHdyaXRlSTMyOiBzaXplXTsKLX0KLQotLSAodm9pZCkgd3JpdGVTZXRFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTogKGludCkgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplCi17Ci0gIFtzZWxmIHdyaXRlQnl0ZTogQ2hlY2tlZENhc3RJbnRUb1VJbnQ4KGVsZW1lbnRUeXBlKV07Ci0gIFtzZWxmIHdyaXRlSTMyOiBzaXplXTsKLX0KLQotLSAodm9pZCkgd3JpdGVMaXN0RW5kIHt9Ci0KLQotLSAodm9pZCkgd3JpdGVCb29sOiAoQk9PTCkgdmFsdWUKLXsKLSAgW3NlbGYgd3JpdGVCeXRlOiAodmFsdWUgPyAxIDogMCldOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzkxOTVjLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUUHJvdG9jb2wuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKLSNpbXBvcnQgIlRQcm90b2NvbEZhY3RvcnkuaCIKLQotQGludGVyZmFjZSBUQ29tcGFjdFByb3RvY29sIDogTlNPYmplY3QgPFRQcm90b2NvbD4KLQotLSAoaWQpIGluaXRXaXRoVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7Ci0KLUBlbmQKLQotQGludGVyZmFjZSBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSA6IE5TT2JqZWN0IDxUUHJvdG9jb2xGYWN0b3J5PgotCi0rIChUQ29tcGFjdFByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5OwotCi0tIChUQ29tcGFjdFByb3RvY29sICopIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDViMGVmMy4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wubQorKysgL2Rldi9udWxsCkBAIC0xLDY4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRDb21wYWN0UHJvdG9jb2wuaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotI2ltcG9ydCAiVFByb3RvY29sRXhjZXB0aW9uLmgiCi0KLXN0YXRpYyBjb25zdCB1aW50OF90IENPTVBBQ1RfUFJPVE9DT0xfSUQgPSAweDgyOwotc3RhdGljIGNvbnN0IHVpbnQ4X3QgQ09NUEFDVF9WRVJTSU9OID0gMTsKLXN0YXRpYyBjb25zdCB1aW50OF90IENPTVBBQ1RfVkVSU0lPTl9NQVNLID0gMHgxRjsgLy8gMDAwMSAxMTExCi1zdGF0aWMgY29uc3QgdWludDhfdCBDT01QQUNUX1RZUEVfTUFTSyA9IDB4RTA7IC8vIDExMTAgMDAwMAotc3RhdGljIGNvbnN0IHVpbnQ4X3QgQ09NUEFDVF9UWVBFX0JJVFMgPSAweDA3OyAvLyAwMDAwIDAxMTEKLXN0YXRpYyBjb25zdCBpbnQgQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCA9IDU7Ci0KLWVudW0gewotICBUQ1R5cGVfU1RPUCA9IDB4MDAsCi0gIFRDVHlwZV9CT09MRUFOX1RSVUUgPSAweDAxLAotICBUQ1R5cGVfQk9PTEVBTl9GQUxTRSA9IDB4MDIsCi0gIFRDVHlwZV9CWVRFID0gMHgwMywKLSAgVENUeXBlX0kxNiA9IDB4MDQsCi0gIFRDVHlwZV9JMzIgPSAweDA1LAotICBUQ1R5cGVfSTY0ID0gMHgwNiwKLSAgVENUeXBlX0RPVUJMRSA9IDB4MDcsCi0gIFRDVHlwZV9CSU5BUlkgPSAweDA4LAotICBUQ1R5cGVfTElTVCA9IDB4MDksCi0gIFRDVHlwZV9TRVQgPSAweDBBLAotICBUQ1R5cGVfTUFQID0gMHgwQiwKLSAgVENUeXBlX1NUUlVDVCA9IDB4MEMsCi19OwotCi1AaW1wbGVtZW50YXRpb24gVENvbXBhY3RQcm90b2NvbEZhY3RvcnkKLQotKyAoVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeQotewotICBzdGF0aWMgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKiBnU2hhcmVkRmFjdG9yeSA9IG5pbDsKLSAgaWYgKGdTaGFyZWRGYWN0b3J5ID09IG5pbCkgewotICAgIGdTaGFyZWRGYWN0b3J5ID0gW1tUQ29tcGFjdFByb3RvY29sRmFjdG9yeSBhbGxvY10gaW5pdF07Ci0gIH0KLSAgCi0gIHJldHVybiBnU2hhcmVkRmFjdG9yeTsKLX0KLQotLSAoVENvbXBhY3RQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKLXsKLSAgcmV0dXJuIFtbVENvbXBhY3RQcm90b2NvbCBhbGxvY10gaW5pdFdpdGhUcmFuc3BvcnQ6IHRyYW5zcG9ydF07Ci19Ci0KLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIFRDb21wYWN0UHJvdG9jb2wgewotICBOU011dGFibGVBcnJheSAqIGxhc3RGaWVsZDsKLSAgc2hvcnQgbGFzdEZpZWxkSWQ7Ci0gIGlkIDxUVHJhbnNwb3J0PiBtVHJhbnNwb3J0OwotICAKLSAgTlNTdHJpbmcgKiBib29sRmllbGROYW1lOwotICBOU051bWJlciAqIGJvb2xGaWVsZFR5cGU7Ci0gIE5TTnVtYmVyICogYm9vbEZpZWxkSWQ7Ci0gIE5TTnVtYmVyICogYm9vbGVhblZhbHVlOwotfQotCi0tIChpZCkgaW5pdAotewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICAKLSAgaWYgKHNlbGYgIT0gbmlsKSB7Ci0gICAgbGFzdEZpZWxkID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF07Ci0gIH0KLSAgCi0gIHJldHVybiBzZWxmOwotfQotCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotewotICBzZWxmID0gW3NlbGYgaW5pdF07Ci0gIAotICBpZiAoc2VsZiAhPSBuaWwpIHsKLSAgICBtVHJhbnNwb3J0ID0gW3RyYW5zcG9ydCByZXRhaW5fc3R1Yl07Ci0gIH0KLSAgCi0gIHJldHVybiBzZWxmOwotfQotCi0tICh2b2lkKSBkZWFsbG9jCi17Ci0gIFtsYXN0RmllbGQgcmVsZWFzZV9zdHViXTsKLSAgW21UcmFuc3BvcnQgcmVsZWFzZV9zdHViXTsKLSAgW2Jvb2xGaWVsZE5hbWUgcmVsZWFzZV9zdHViXTsKLSAgW2Jvb2xGaWVsZFR5cGUgcmVsZWFzZV9zdHViXTsKLSAgW2Jvb2xGaWVsZElkIHJlbGVhc2Vfc3R1Yl07Ci0gIFtib29sZWFuVmFsdWUgcmVsZWFzZV9zdHViXTsKLSAgCi0gIFtzdXBlciBkZWFsbG9jX3N0dWJdOwotfQotCi0tIChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotewotICByZXR1cm4gbVRyYW5zcG9ydDsKLX0KLQotLSAodm9pZCkgd3JpdGVCeXRlRGlyZWN0OiAoaW50OF90KSBuCi17Ci0gIFttVHJhbnNwb3J0IHdyaXRlOiAodWludDhfdCAqKSZuIG9mZnNldDogMCBsZW5ndGg6IDFdOwotfQotCi0tICh2b2lkKXdyaXRlVmFyaW50MzI6ICh1aW50MzJfdCkgbgotewotICB1aW50OF90IGkzMmJ1Zls1XSA9IHswfTsKLSAgdWludDMyX3QgaWR4ID0gMDsKLSAgCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKLSAgICAgIGkzMmJ1ZltpZHgrK10gPSAodWludDhfdCluOwotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGkzMmJ1ZltpZHgrK10gPSAodWludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOwotICAgICAgbiA+Pj0gNzsKLSAgICB9Ci0gIH0KLSAgCi0gIFttVHJhbnNwb3J0IHdyaXRlOiBpMzJidWYgb2Zmc2V0OiAwIGxlbmd0aDogaWR4XTsKLX0KLQotLSAodm9pZCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIG1lc3NhZ2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50KSBzZXF1ZW5jZUlECi17Ci0gIFtzZWxmIHdyaXRlQnl0ZURpcmVjdDogQ09NUEFDVF9QUk9UT0NPTF9JRF07Ci0gIFtzZWxmIHdyaXRlQnl0ZURpcmVjdDogKHVpbnQ4X3QpKChDT01QQUNUX1ZFUlNJT04gJiBDT01QQUNUX1ZFUlNJT05fTUFTSykgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodWludDMyX3QpbWVzc2FnZVR5cGUpIDw8IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgQ09NUEFDVF9UWVBFX01BU0spKV07Ci0gIFtzZWxmIHdyaXRlVmFyaW50MzI6ICh1aW50MzJfdClzZXF1ZW5jZUlEXTsKLSAgW3NlbGYgd3JpdGVTdHJpbmc6IG5hbWVdOwotfQotCi0tICh2b2lkKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi17Ci0gIFtsYXN0RmllbGQgYWRkT2JqZWN0OiBbTlNOdW1iZXIgbnVtYmVyV2l0aFNob3J0OiBsYXN0RmllbGRJZF1dOwotICBsYXN0RmllbGRJZCA9IDA7Ci19Ci0KLS0gKHZvaWQpIHdyaXRlU3RydWN0RW5kCi17Ci0gIGxhc3RGaWVsZElkID0gW1tsYXN0RmllbGQgbGFzdE9iamVjdF0gc2hvcnRWYWx1ZV07Ci0gIFtsYXN0RmllbGQgcmVtb3ZlTGFzdE9iamVjdF07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQpIGZpZWxkSUQKLXsKLSAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZV9CT09MKSB7Ci0gICAgYm9vbEZpZWxkTmFtZSA9IFtuYW1lIGNvcHldOwotICAgIGJvb2xGaWVsZFR5cGUgPSBbW05TTnVtYmVyIG51bWJlcldpdGhJbnQ6IGZpZWxkVHlwZV0gcmV0YWluX3N0dWJdOwotICAgIGJvb2xGaWVsZElkID0gW1tOU051bWJlciBudW1iZXJXaXRoSW50OiBmaWVsZElEXSByZXRhaW5fc3R1Yl07Ci0gIH0gZWxzZSB7Ci0gICAgW3NlbGYgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxXaXRoTmFtZTogbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IGZpZWxkSUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOiAweEZGXTsKLSAgfQotfQotCi0tICh2b2lkKSB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbFdpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50KSBmaWVsZElECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOiAodWludDhfdCkgdHlwZU92ZXJyaWRlCi17Ci0gIHVpbnQ4X3QgdHlwZVRvV3JpdGUgPSB0eXBlT3ZlcnJpZGUgPT0gMHhGRiA/IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6IGZpZWxkVHlwZV0gOiB0eXBlT3ZlcnJpZGU7Ci0gIAotICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKLSAgaWYgKGZpZWxkSUQgPiBsYXN0RmllbGRJZCAmJiBmaWVsZElEIC0gbGFzdEZpZWxkSWQgPD0gMTUpIHsKLSAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCi0gICAgW3NlbGYgd3JpdGVCeXRlRGlyZWN0OiAoZmllbGRJRCAtIGxhc3RGaWVsZElkKSA8PCA0IHwgdHlwZVRvV3JpdGVdOwotICB9IGVsc2UgewotICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKLSAgICBbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6IHR5cGVUb1dyaXRlXTsKLSAgICBbc2VsZiB3cml0ZUkxNjogZmllbGRJRF07Ci0gIH0KLSAgCi0gIGxhc3RGaWVsZElkID0gZmllbGRJRDsKLX0KLQotLSAodm9pZCkgd3JpdGVGaWVsZFN0b3AKLXsKLSAgW3NlbGYgd3JpdGVCeXRlRGlyZWN0OiBUQ1R5cGVfU1RPUF07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogKGludCkga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAoaW50KSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQotewotICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgW3NlbGYgd3JpdGVCeXRlRGlyZWN0OiAwXTsKLSAgfSBlbHNlIHsKLSAgICBbc2VsZiB3cml0ZVZhcmludDMyOiAodWludDMyX3Qpc2l6ZV07Ci0gICAgW3NlbGYgd3JpdGVCeXRlRGlyZWN0OiBbc2VsZiBjb21wYWN0VHlwZUZvclRUeXBlOiBrZXlUeXBlXSA8PCA0IHwgW3NlbGYgY29tcGFjdFR5cGVGb3JUVHlwZTogdmFsdWVUeXBlXV07Ci0gIH0KLX0KLQotLSAodm9pZCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQotewotICBbc2VsZiB3cml0ZUNvbGxlY3Rpb25CZWdpbldpdGhFbGVtZW50VHlwZTogZWxlbWVudFR5cGUgc2l6ZTogc2l6ZV07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplCi17Ci0gIFtzZWxmIHdyaXRlQ29sbGVjdGlvbkJlZ2luV2l0aEVsZW1lbnRUeXBlOiBlbGVtZW50VHlwZSBzaXplOiBzaXplXTsKLX0KLQotLSAodm9pZCkgd3JpdGVCb29sOiAoQk9PTCkgYgotewotICBpZiAoYm9vbEZpZWxkSWQgIT0gbmlsICYmIGJvb2xGaWVsZE5hbWUgIT0gbmlsICYmIGJvb2xGaWVsZFR5cGUgIT0gbmlsKSB7Ci0gICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0Ci0gICAgW3NlbGYgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxXaXRoTmFtZTogYm9vbEZpZWxkTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFtib29sRmllbGRUeXBlIGludFZhbHVlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IFtib29sRmllbGRJZCBpbnRWYWx1ZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOiBiID8gVENUeXBlX0JPT0xFQU5fVFJVRSA6IFRDVHlwZV9CT09MRUFOX0ZBTFNFXTsKLSAgICAKLSAgICBbYm9vbEZpZWxkSWQgcmVsZWFzZV9zdHViXTsKLSAgICBbYm9vbEZpZWxkTmFtZSByZWxlYXNlX3N0dWJdOwotICAgIFtib29sRmllbGRUeXBlIHJlbGVhc2Vfc3R1Yl07Ci0gICAgCi0gICAgYm9vbEZpZWxkSWQgPSBuaWw7Ci0gICAgYm9vbEZpZWxkTmFtZSA9IG5pbDsKLSAgICBib29sRmllbGRUeXBlID0gbmlsOwotICB9IGVsc2UgewotICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3QgV3JpdGUgdGhlIHZhbHVlLgotICAgIFtzZWxmIHdyaXRlQnl0ZURpcmVjdDogYiA/IFRDVHlwZV9CT09MRUFOX1RSVUUgOiBUQ1R5cGVfQk9PTEVBTl9GQUxTRV07Ci0gIH0KLX0KLQotLSAodm9pZCkgd3JpdGVCeXRlOiAodWludDhfdCkgdmFsdWUKLXsKLSAgW3NlbGYgd3JpdGVCeXRlRGlyZWN0OiB2YWx1ZV07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlSTE2OiAoaW50MTZfdCkgdmFsdWUKLXsKLSAgW3NlbGYgd3JpdGVWYXJpbnQzMjogW3NlbGYgaTMyVG9aaWdaYWc6IHZhbHVlXV07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlSTMyOiAoaW50MzJfdCkgdmFsdWUKLXsKLSAgW3NlbGYgd3JpdGVWYXJpbnQzMjogW3NlbGYgaTMyVG9aaWdaYWc6IHZhbHVlXV07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlSTY0OiAoaW50NjRfdCkgdmFsdWUKLXsKLSAgW3NlbGYgd3JpdGVWYXJpbnQ2NDogW3NlbGYgaTY0VG9aaWdaYWc6IHZhbHVlXV07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlRG91YmxlOiAoZG91YmxlKSB2YWx1ZQotewotICAvL1NhZmUgYml0LWNhc3RpbmcgZG91YmxlLT51aW50NjQKLSAgCi0gIHVpbnQ2NF90IGJpdHMgPSAwOwotICBtZW1jcHkoJmJpdHMsICZ2YWx1ZSwgOCk7Ci0gIAotICBiaXRzID0gT1NTd2FwSG9zdFRvTGl0dGxlSW50NjQoYml0cyk7Ci0gIAotICBbbVRyYW5zcG9ydCB3cml0ZTogKHVpbnQ4X3QgKikmYml0cyBvZmZzZXQ6IDAgbGVuZ3RoOiA4XTsKLX0KLQotLSAodm9pZCkgd3JpdGVTdHJpbmc6IChOU1N0cmluZyAqKSB2YWx1ZQotewotICBbc2VsZiB3cml0ZUJpbmFyeTogW3ZhbHVlIGRhdGFVc2luZ0VuY29kaW5nOiBOU1VURjhTdHJpbmdFbmNvZGluZ11dOwotfQotCi0tICh2b2lkKSB3cml0ZUJpbmFyeTogKE5TRGF0YSAqKSBkYXRhCi17Ci0gIFtzZWxmIHdyaXRlVmFyaW50MzI6ICh1aW50MzJfdClkYXRhLmxlbmd0aF07Ci0gIFttVHJhbnNwb3J0IHdyaXRlOiBkYXRhLmJ5dGVzIG9mZnNldDogMCBsZW5ndGg6IGRhdGEubGVuZ3RoXTsKLX0KLQotLSAodm9pZCkgd3JpdGVNZXNzYWdlRW5kIHt9Ci0tICh2b2lkKSB3cml0ZU1hcEVuZCB7fQotLSAodm9pZCkgd3JpdGVMaXN0RW5kIHt9Ci0tICh2b2lkKSB3cml0ZVNldEVuZCB7fQotLSAodm9pZCkgd3JpdGVGaWVsZEVuZCB7fQotCi0tICh2b2lkKSB3cml0ZUNvbGxlY3Rpb25CZWdpbldpdGhFbGVtZW50VHlwZTogKGludCkgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplCi17Ci0gIGlmIChzaXplIDw9IDE0KSB7Ci0gICAgW3NlbGYgd3JpdGVCeXRlRGlyZWN0OiBzaXplIDw8IDQgfCBbc2VsZiBjb21wYWN0VHlwZUZvclRUeXBlOiBlbGVtZW50VHlwZV1dOwotICB9IGVsc2UgewotICAgIFtzZWxmIHdyaXRlQnl0ZURpcmVjdDogMHhmMCB8IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6IGVsZW1lbnRUeXBlXV07Ci0gICAgW3NlbGYgd3JpdGVWYXJpbnQzMjogKHVpbnQzMl90KXNpemVdOwotICB9Ci19Ci0KLS0gKHZvaWQpIHdyaXRlVmFyaW50NjQ6ICh1aW50NjRfdCkgbgotewotICB1aW50OF90IHZhcmludDY0b3V0WzEwXSA9IHswfTsKLSAgaW50IGlkeCA9IDA7Ci0gIAotICB3aGlsZSAodHJ1ZSkgewotICAgIGlmICgobiAmIH4weDdGTCkgPT0gMCkgewotICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKHVpbnQ4X3QpbjsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSB7Ci0gICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAodWludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOwotICAgICAgbiA+Pj0gNzsKLSAgICB9Ci0gIH0KLSAgCi0gIFttVHJhbnNwb3J0IHdyaXRlOiB2YXJpbnQ2NG91dCBvZmZzZXQ6IDAgbGVuZ3RoOiBpZHhdOwotfQotCi0tICh1aW50MzJfdCkgaTMyVG9aaWdaYWc6IChpbnQzMl90KSBuCi17Ci0gIC8qCi0gICBaaWdaYWcgZW5jb2RpbmcgbWFwcyBzaWduZWQgaW50ZWdlcnMgdG8gdW5zaWduZWQgaW50ZWdlcnMgc28gdGhhdAotICAgbnVtYmVycyB3aXRoIGEgc21hbGwgYWJzb2x1dGUgdmFsdWUgKGZvciBpbnN0YW5jZSwgLTEpIGhhdmUKLSAgIGEgc21hbGwgdmFyaW50IGVuY29kZWQgdmFsdWUgdG9vLiBJdCBkb2VzIHRoaXMgaW4gYSB3YXkgdGhhdAotICAgInppZy16YWdzIiBiYWNrIGFuZCBmb3J0aCB0aHJvdWdoIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgaW50ZWdlcnMsCi0gICBzbyB0aGF0IC0xIGlzIGVuY29kZWQgYXMgMSwgMSBpcyBlbmNvZGVkIGFzIDIsIC0yIGlzIGVuY29kZWQgYXMgMywgYW5kIHNvIG9uCi0gICAqLwotICByZXR1cm4gKHVpbnQzMl90KShuIDw8IDEpIF4gKHVpbnQzMl90KShuID4+IDMxKTsKLX0KLQotLSAodWludDY0X3QpIGk2NFRvWmlnWmFnOiAoaW50NjRfdCkgbgotewotICByZXR1cm4gKHVpbnQ2NF90KShuIDw8IDEpIF4gKHVpbnQ2NF90KShuID4+IDYzKTsKLX0KLQotLSAodm9pZCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgcG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIHB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCAqKSBwc2VxdWVuY2VJRAotewotICB1aW50OF90IHByb3RvY29sSWQgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIGlmIChwcm90b2NvbElkICE9IENPTVBBQ1RfUFJPVE9DT0xfSUQpIHsKLSAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIkV4cGVjdGVkIHByb3RvY29sIGlkICVYIGJ1dCBnb3QgJVgiLCBDT01QQUNUX1BST1RPQ09MX0lELCBwcm90b2NvbElkXV07Ci0gIH0KLSAgCi0gIHVpbnQ4X3QgdmVyc2lvbkFuZFR5cGUgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIHVpbnQ4X3QgdmVyc2lvbiA9IHZlcnNpb25BbmRUeXBlICYgQ09NUEFDVF9WRVJTSU9OX01BU0s7Ci0gIGlmICh2ZXJzaW9uICE9IENPTVBBQ1RfVkVSU0lPTikgewotICAgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRQcm90b2NvbEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEAiRXhwZWN0ZWQgdmVyc2lvbiAlZCBidXQgZ290ICVkIiwgQ09NUEFDVF9WRVJTSU9OLCB2ZXJzaW9uXV07Ci0gIH0KLSAgCi0gIGludCB0eXBlID0gKHZlcnNpb25BbmRUeXBlID4+IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgQ09NUEFDVF9UWVBFX0JJVFM7Ci0gIGludCBzZXF1ZW5jZUlEID0gKGludClbc2VsZiByZWFkVmFyaW50MzJdOwotICBOU1N0cmluZyogbmFtZSA9IFtzZWxmIHJlYWRTdHJpbmddOwotICAKLSAgaWYgKHB0eXBlICE9IE5VTEwpIHsKLSAgICAqcHR5cGUgPSB0eXBlOwotICB9Ci0gIGlmIChwc2VxdWVuY2VJRCAhPSBOVUxMKSB7Ci0gICAgKnBzZXF1ZW5jZUlEID0gc2VxdWVuY2VJRDsKLSAgfQotICBpZiAocG5hbWUgIT0gTlVMTCkgewotICAgICpwbmFtZSA9IG5hbWU7Ci0gIH0KLX0KLQotLSAodm9pZCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBwbmFtZQotewotICBbbGFzdEZpZWxkIGFkZE9iamVjdDogW05TTnVtYmVyIG51bWJlcldpdGhTaG9ydDogbGFzdEZpZWxkSWRdXTsKLSAgbGFzdEZpZWxkSWQgPSAwOwotICAKLSAgaWYgKHBuYW1lICE9IE5VTEwpIHsKLSAgICAqcG5hbWUgPSBAIiI7Ci0gIH0KLX0KLQotLSAodm9pZCkgcmVhZFN0cnVjdEVuZAotewotICBsYXN0RmllbGRJZCA9IFtbbGFzdEZpZWxkIGxhc3RPYmplY3RdIHNob3J0VmFsdWVdOwotICBbbGFzdEZpZWxkIHJlbW92ZUxhc3RPYmplY3RdOwotfQotCi0tICh2b2lkKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgcG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSBwZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQgKikgcGZpZWxkSUQKLXsKLSAgdWludDhfdCBieXRlID0gW3NlbGYgcmVhZEJ5dGVdOwotICB1aW50OF90IHR5cGUgPSBieXRlICYgMHgwZjsKLSAgCi0gIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KLSAgaWYgKHR5cGUgPT0gVENUeXBlX1NUT1ApIHsKLSAgICBpZiAocG5hbWUgIT0gTlVMTCkgewotICAgICAgKnBuYW1lID0gQCIiOwotICAgIH0KLSAgICBpZiAocGZpZWxkVHlwZSAhPSBOVUxMKSB7Ci0gICAgICAqcGZpZWxkVHlwZSA9IFRUeXBlX1NUT1A7Ci0gICAgfQotICAgIGlmIChwZmllbGRJRCAhPSBOVUxMKSB7Ci0gICAgICAqcGZpZWxkSUQgPSAwOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgCi0gIHNob3J0IGZpZWxkSWQgPSAwOwotICAKLSAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgotICBzaG9ydCBtb2RpZmllciA9IChieXRlICYgMHhmMCkgPj4gNDsKLSAgaWYgKG1vZGlmaWVyID09IDApIHsKLSAgICAvLyBub3QgYSBkZWx0YS4gbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCi0gICAgZmllbGRJZCA9IFtzZWxmIHJlYWRJMTZdOwotICB9IGVsc2UgewotICAgIC8vIGhhcyBhIGRlbHRhLiBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IFJlYWQgZmllbGQgaWQuCi0gICAgZmllbGRJZCA9IGxhc3RGaWVsZElkICsgbW9kaWZpZXI7Ci0gIH0KLSAgCi0gIGludCBmaWVsZFR5cGUgPSBbc2VsZiB0dHlwZUZvckNvbXBhY3RUeXBlOiB0eXBlXTsKLSAgCi0gIGlmIChwbmFtZSAhPSBOVUxMKSB7Ci0gICAgKnBuYW1lID0gQCIiOwotICB9Ci0gIGlmIChwZmllbGRUeXBlICE9IE5VTEwpIHsKLSAgICAqcGZpZWxkVHlwZSA9IGZpZWxkVHlwZTsKLSAgfQotICBpZiAocGZpZWxkSUQgIT0gTlVMTCkgewotICAgICpwZmllbGRJRCA9IGZpZWxkSWQ7Ci0gIH0KLSAgCi0gIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCi0gIGlmICh0eXBlID09IFRDVHlwZV9CT09MRUFOX1RSVUUgfHwKLSAgICAgIHR5cGUgPT0gVENUeXBlX0JPT0xFQU5fRkFMU0UpIHsKLSAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KLSAgICBib29sZWFuVmFsdWUgPSBbW05TTnVtYmVyIG51bWJlcldpdGhCb29sOiB0eXBlID09IFRDVHlwZV9CT09MRUFOX1RSVUVdIHJldGFpbl9zdHViXTsKLSAgfQotICAKLSAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCi0gIGxhc3RGaWVsZElkID0gZmllbGRJZDsKLX0KLQotLSAodm9pZCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTogKGludCAqKSBwa2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCAqKSBwdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHBzaXplCi17Ci0gIHVpbnQ4X3Qga2V5QW5kVmFsdWVUeXBlID0gMDsKLSAgaW50IHNpemUgPSAoaW50KVtzZWxmIHJlYWRWYXJpbnQzMl07Ci0gIGlmIChzaXplICE9IDApIHsKLSAgICBrZXlBbmRWYWx1ZVR5cGUgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIH0KLSAgCi0gIGludCBrZXlUeXBlID0gW3NlbGYgdHR5cGVGb3JDb21wYWN0VHlwZToga2V5QW5kVmFsdWVUeXBlID4+IDRdOwotICBpbnQgdmFsdWVUeXBlID0gW3NlbGYgdHR5cGVGb3JDb21wYWN0VHlwZToga2V5QW5kVmFsdWVUeXBlICYgMHhmXTsKLSAgCi0gIGlmIChwa2V5VHlwZSAhPSBOVUxMKSB7Ci0gICAgKnBrZXlUeXBlID0ga2V5VHlwZTsKLSAgfQotICBpZiAocHZhbHVlVHlwZSAhPSBOVUxMKSB7Ci0gICAgKnB2YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7Ci0gIH0KLSAgaWYgKHBzaXplICE9IE5VTEwpIHsKLSAgICAqcHNpemUgPSBzaXplOwotICB9Ci19Ci0KLS0gKHZvaWQpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBwZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBwc2l6ZQotewotICB1aW50OF90IHNpemVfYW5kX3R5cGUgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIGludCBzaXplID0gKHNpemVfYW5kX3R5cGUgPj4gNCkgJiAweDBmOwotICBpZiAoc2l6ZSA9PSAxNSkgewotICAgIHNpemUgPSAoaW50KVtzZWxmIHJlYWRWYXJpbnQzMl07Ci0gIH0KLSAgCi0gIGludCBlbGVtZW50VHlwZSA9IFtzZWxmIHR0eXBlRm9yQ29tcGFjdFR5cGU6IHNpemVfYW5kX3R5cGUgJiAweDBmXTsKLSAgCi0gIGlmIChwZWxlbWVudFR5cGUgIT0gTlVMTCkgewotICAgICpwZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKLSAgfQotICBpZiAocHNpemUgIT0gTlVMTCkgewotICAgICpwc2l6ZSA9IHNpemU7Ci0gIH0KLX0KLQotLSAodm9pZCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IChpbnQgKikgcGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBwc2l6ZQotewotICBbc2VsZiByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IHBlbGVtZW50VHlwZSBzaXplOiBwc2l6ZV07Ci19Ci0KLS0gKEJPT0wpIHJlYWRCb29sCi17Ci0gIGlmIChib29sZWFuVmFsdWUgIT0gbmlsKSB7Ci0gICAgQk9PTCByZXN1bHQgPSBbYm9vbGVhblZhbHVlIGJvb2xWYWx1ZV07Ci0gICAgW2Jvb2xlYW5WYWx1ZSByZWxlYXNlX3N0dWJdOwotICAgIGJvb2xlYW5WYWx1ZSA9IG5pbDsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9IGVsc2UgewotICAgIHJldHVybiBbc2VsZiByZWFkQnl0ZV0gPT0gVENUeXBlX0JPT0xFQU5fVFJVRTsKLSAgfQotfQotCi0tICh1aW50OF90KSByZWFkQnl0ZQotewotICB1aW50OF90IGJ1ZiA9IDA7Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6ICZidWYgb2Zmc2V0OiAwIGxlbmd0aDogMV07Ci0gIHJldHVybiBidWY7Ci19Ci0KLS0gKGludDE2X3QpIHJlYWRJMTYKLXsKLSAgcmV0dXJuIChpbnQxNl90KVtzZWxmIHppZ1phZ1RvaTMyOiBbc2VsZiByZWFkVmFyaW50MzJdXTsKLX0KLQotLSAoaW50MzJfdCkgcmVhZEkzMgotewotICByZXR1cm4gW3NlbGYgemlnWmFnVG9pMzI6IFtzZWxmIHJlYWRWYXJpbnQzMl1dOwotfQotCi0tIChpbnQ2NF90KSByZWFkSTY0Ci17Ci0gIHJldHVybiBbc2VsZiB6aWdaYWdUb2k2NDogW3NlbGYgcmVhZFZhcmludDY0XV07Ci19Ci0KLS0gKGRvdWJsZSkgcmVhZERvdWJsZQotewotICB1aW50NjRfdCBiaXRzID0gMDsKLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogKHVpbnQ4X3QgKikmYml0cyBvZmZzZXQ6IDAgbGVuZ3RoOiA4XTsKLSAgYml0cyA9IE9TU3dhcExpdHRsZVRvSG9zdEludDY0KGJpdHMpOwotICAKLSAgZG91YmxlIHJlc3VsdCA9IDA7Ci0gIG1lbWNweSgmcmVzdWx0LCAmYml0cywgOCk7Ci0gIAotICByZXR1cm4gcmVzdWx0OwotfQotCi0tIChOU1N0cmluZyAqKSByZWFkU3RyaW5nCi17Ci0gIGludCBsZW5ndGggPSAoaW50KVtzZWxmIHJlYWRWYXJpbnQzMl07Ci0gIGlmIChsZW5ndGggPT0gMCkgewotICAgIHJldHVybiBAIiI7Ci0gIH0KLSAgCi0gIHJldHVybiBbW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhEYXRhOiBbc2VsZiByZWFkQmluYXJ5OiBsZW5ndGhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBOU1VURjhTdHJpbmdFbmNvZGluZ10gYXV0b3JlbGVhc2Vfc3R1Yl07Ci19Ci0KLS0gKE5TRGF0YSAqKSByZWFkQmluYXJ5Ci17Ci0gIHJldHVybiBbc2VsZiByZWFkQmluYXJ5OiAoaW50KVtzZWxmIHJlYWRWYXJpbnQzMl1dOwotfQotCi0tIChOU0RhdGEgKikgcmVhZEJpbmFyeTogKGludCkgbGVuZ3RoCi17Ci0gIGlmIChsZW5ndGggPT0gMCkgewotICAgIHJldHVybiBbTlNEYXRhIGRhdGFdOwotICB9Ci0gIAotICBOU011dGFibGVEYXRhKiBidWYgPSBbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDogbGVuZ3RoXTsKLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogYnVmLm11dGFibGVCeXRlcyBvZmZzZXQ6IDAgbGVuZ3RoOiBsZW5ndGhdOwotICByZXR1cm4gYnVmOwotfQotCi0tICh2b2lkKSByZWFkTWVzc2FnZUVuZCB7fQotLSAodm9pZCkgcmVhZEZpZWxkRW5kIHt9Ci0tICh2b2lkKSByZWFkTWFwRW5kIHt9Ci0tICh2b2lkKSByZWFkTGlzdEVuZCB7fQotLSAodm9pZCkgcmVhZFNldEVuZCB7fQotCi0tICh1aW50MzJfdCkgcmVhZFZhcmludDMyCi17Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIGludCBzaGlmdCA9IDA7Ci0gIAotICB3aGlsZSAodHJ1ZSkgewotICAgIHVpbnQ4X3QgYnl0ZSA9IFtzZWxmIHJlYWRCeXRlXTsKLSAgICByZXN1bHQgfD0gKHVpbnQzMl90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7Ci0gICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgCi0gICAgc2hpZnQgKz0gNzsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh1aW50NjRfdCkgcmVhZFZhcmludDY0Ci17Ci0gIGludCBzaGlmdCA9IDA7Ci0gIHVpbnQ2NF90IHJlc3VsdCA9IDA7Ci0gIAotICB3aGlsZSAodHJ1ZSkgewotICAgIHVpbnQ4X3QgYnl0ZSA9IFtzZWxmIHJlYWRCeXRlXTsKLSAgICByZXN1bHQgfD0gKHVpbnQ2NF90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7Ci0gICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgCi0gICAgc2hpZnQgKz0gNzsKLSAgfQotICAKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAoaW50MzJfdCkgemlnWmFnVG9pMzI6ICh1aW50MzJfdCkgbgotewotICByZXR1cm4gKGludDMyX3QpKG4gPj4gMSkgXiAoLShpbnQzMl90KShuICYgMSkpOwotfQotCi0tIChpbnQ2NF90KSB6aWdaYWdUb2k2NDogKHVpbnQ2NF90KSBuCi17Ci0gIHJldHVybiAoaW50NjRfdCkobiA+PiAxKSBeICgtKGludDY0X3QpKG4gJiAxKSk7Ci19Ci0KLS0gKHVpbnQ4X3QpIHR0eXBlRm9yQ29tcGFjdFR5cGU6ICh1aW50OF90KSB0eXBlCi17Ci0gIHN3aXRjaCAodHlwZSAmIDB4MGYpIHsKLSAgICBjYXNlIFRDVHlwZV9TVE9QOgotICAgICAgcmV0dXJuIFRUeXBlX1NUT1A7Ci0gICAgICAKLSAgICBjYXNlIFRDVHlwZV9CT09MRUFOX0ZBTFNFOgotICAgIGNhc2UgVENUeXBlX0JPT0xFQU5fVFJVRToKLSAgICAgIHJldHVybiBUVHlwZV9CT09MOwotICAgICAgCi0gICAgY2FzZSBUQ1R5cGVfQllURToKLSAgICAgIHJldHVybiBUVHlwZV9CWVRFOwotICAgICAgCi0gICAgY2FzZSBUQ1R5cGVfSTE2OgotICAgICAgcmV0dXJuIFRUeXBlX0kxNjsKLSAgICAgIAotICAgIGNhc2UgVENUeXBlX0kzMjoKLSAgICAgIHJldHVybiBUVHlwZV9JMzI7Ci0gICAgICAKLSAgICBjYXNlIFRDVHlwZV9JNjQ6Ci0gICAgICByZXR1cm4gVFR5cGVfSTY0OwotICAgICAgCi0gICAgY2FzZSBUQ1R5cGVfRE9VQkxFOgotICAgICAgcmV0dXJuIFRUeXBlX0RPVUJMRTsKLSAgICAgIAotICAgIGNhc2UgVENUeXBlX0JJTkFSWToKLSAgICAgIHJldHVybiBUVHlwZV9TVFJJTkc7Ci0gICAgICAKLSAgICBjYXNlIFRDVHlwZV9MSVNUOgotICAgICAgcmV0dXJuIFRUeXBlX0xJU1Q7Ci0gICAgICAKLSAgICBjYXNlIFRDVHlwZV9TRVQ6Ci0gICAgICByZXR1cm4gVFR5cGVfU0VUOwotICAgICAgCi0gICAgY2FzZSBUQ1R5cGVfTUFQOgotICAgICAgcmV0dXJuIFRUeXBlX01BUDsKLSAgICAgIAotICAgIGNhc2UgVENUeXBlX1NUUlVDVDoKLSAgICAgIHJldHVybiBUVHlwZV9TVFJVQ1Q7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIkRvbid0IGtub3cgd2hhdCB0eXBlOiAlZCIsICh1aW50OF90KSh0eXBlICYgMHgwRildXTsKLSAgfQotfQotCi0tICh1aW50OF90KSBjb21wYWN0VHlwZUZvclRUeXBlOiAodWludDhfdCkgdHR5cGUKLXsKLSAgc3RhdGljIHVpbnQ4X3QgdHR5cGVUb0NvbXBhY3RUeXBlW10gPSB7Ci0gICAgW1RUeXBlX1NUT1BdID0gVENUeXBlX1NUT1AsCi0gICAgW1RUeXBlX0JPT0xdID0gVENUeXBlX0JPT0xFQU5fRkFMU0UsCi0gICAgW1RUeXBlX0JZVEVdID0gVENUeXBlX0JZVEUsCi0gICAgW1RUeXBlX0RPVUJMRV0gPSBUQ1R5cGVfRE9VQkxFLAotICAgIFtUVHlwZV9JMTZdID0gVENUeXBlX0kxNiwKLSAgICBbVFR5cGVfSTMyXSA9IFRDVHlwZV9JMzIsCi0gICAgW1RUeXBlX0k2NF0gPSBUQ1R5cGVfSTY0LAotICAgIFtUVHlwZV9TVFJJTkddID0gVENUeXBlX0JJTkFSWSwKLSAgICBbVFR5cGVfU1RSVUNUXSA9IFRDVHlwZV9TVFJVQ1QsCi0gICAgW1RUeXBlX01BUF0gPSBUQ1R5cGVfTUFQLAotICAgIFtUVHlwZV9TRVRdID0gVENUeXBlX1NFVCwKLSAgICBbVFR5cGVfTElTVF0gPSBUQ1R5cGVfTElTVAotICB9OwotICAKLSAgcmV0dXJuIHR0eXBlVG9Db21wYWN0VHlwZVt0dHlwZV07Ci19Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5ODQ1OS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi0jaW1wb3J0ICJUUHJvdG9jb2xEZWNvcmF0b3IuaCIKLQotRk9VTkRBVElPTl9FWFBPUlQgTlNTdHJpbmcgKmNvbnN0IE1VTFRJUExFWEVEX1NFUlZJQ0VfU0VQRVJBVE9SOwotCi1AaW50ZXJmYWNlIFRNdWx0aXBsZXhlZFByb3RvY29sIDogVFByb3RvY29sRGVjb3JhdG9yIHsKLSAgICBOU1N0cmluZyAqIG1TZXJ2aWNlTmFtZTsKLX0KLQotLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wKLSAgICAgICAgICAgIHNlcnZpY2VOYW1lOiAoTlNTdHJpbmcgKikgbmFtZTsKLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTA5NWUzLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wubQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVE11bHRpcGxleGVkUHJvdG9jb2wuaCIKLQotI2ltcG9ydCAiVFByb3RvY29sLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKLQotTlNTdHJpbmcgKmNvbnN0IE1VTFRJUExFWEVEX1NFUlZJQ0VfU0VQRVJBVE9SID0gQCI6IjsKLQotQGltcGxlbWVudGF0aW9uIFRNdWx0aXBsZXhlZFByb3RvY29sCi0KLS0gKGlkKSBpbml0V2l0aFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLXsKLSAgICBzZWxmID0gW3N1cGVyIGluaXRXaXRoUHJvdG9jb2w6cHJvdG9jb2xdOwotCi0gICAgaWYgKHNlbGYpIHsKLSAgICAgICAgbVNlcnZpY2VOYW1lID0gW25hbWUgcmV0YWluX3N0dWJdOwotICAgIH0KLSAgICByZXR1cm4gc2VsZjsKLX0KLQotLSAodm9pZCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIG1lc3NhZ2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50KSBzZXF1ZW5jZUlECi17Ci0gICAgc3dpdGNoIChtZXNzYWdlVHlwZSkgewotICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZV9DQUxMOgotICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZV9PTkVXQVk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTlNNdXRhYmxlU3RyaW5nICogc2VydmljZUZ1bmN0aW9uID0gW1tOU011dGFibGVTdHJpbmcgYWxsb2NdIGluaXRXaXRoU3RyaW5nOm1TZXJ2aWNlTmFtZV07Ci0gICAgICAgICAgICAgICAgW3NlcnZpY2VGdW5jdGlvbiBhcHBlbmRTdHJpbmc6TVVMVElQTEVYRURfU0VSVklDRV9TRVBFUkFUT1JdOwotICAgICAgICAgICAgICAgIFtzZXJ2aWNlRnVuY3Rpb24gYXBwZW5kU3RyaW5nOm5hbWVdOwotICAgICAgICAgICAgICAgIFtzdXBlciB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOnNlcnZpY2VGdW5jdGlvbiB0eXBlOm1lc3NhZ2VUeXBlIHNlcXVlbmNlSUQ6c2VxdWVuY2VJRF07Ci0gICAgICAgICAgICAgICAgW3NlcnZpY2VGdW5jdGlvbiByZWxlYXNlX3N0dWJdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBbc3VwZXIgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTpuYW1lIHR5cGU6bWVzc2FnZVR5cGUgc2VxdWVuY2VJRDpzZXF1ZW5jZUlEXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLSAodm9pZCkgZGVhbGxvYwotewotICAgIFttU2VydmljZU5hbWUgcmVsZWFzZV9zdHViXTsKLSAgICBbc3VwZXIgZGVhbGxvY19zdHViXTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2wuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MTIzOWQuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi0jaW1wb3J0ICJUVHJhbnNwb3J0LmgiCi0KLQotZW51bSB7Ci0gIFRNZXNzYWdlVHlwZV9DQUxMID0gMSwKLSAgVE1lc3NhZ2VUeXBlX1JFUExZID0gMiwKLSAgVE1lc3NhZ2VUeXBlX0VYQ0VQVElPTiA9IDMsCi0gIFRNZXNzYWdlVHlwZV9PTkVXQVkgPSA0Ci19OwotCi1lbnVtIHsKLSAgVFR5cGVfU1RPUCAgID0gMCwKLSAgVFR5cGVfVk9JRCAgID0gMSwKLSAgVFR5cGVfQk9PTCAgID0gMiwKLSAgVFR5cGVfQllURSAgID0gMywKLSAgVFR5cGVfRE9VQkxFID0gNCwKLSAgVFR5cGVfSTE2ICAgID0gNiwKLSAgVFR5cGVfSTMyICAgID0gOCwKLSAgVFR5cGVfSTY0ICAgID0gMTAsCi0gIFRUeXBlX1NUUklORyA9IDExLAotICBUVHlwZV9TVFJVQ1QgPSAxMiwKLSAgVFR5cGVfTUFQICAgID0gMTMsCi0gIFRUeXBlX1NFVCAgICA9IDE0LAotICBUVHlwZV9MSVNUICAgPSAxNQotfTsKLQotCi1AcHJvdG9jb2wgVFByb3RvY29sIDxOU09iamVjdD4KLQotLSAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7Ci0KLS0gKHZvaWQpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50ICopIHNlcXVlbmNlSUQ7Ci0tICh2b2lkKSByZWFkTWVzc2FnZUVuZDsKLQotLSAodm9pZCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lOwotLSAodm9pZCkgcmVhZFN0cnVjdEVuZDsKLQotLSAodm9pZCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogKGludCAqKSBmaWVsZElEOwotLSAodm9pZCkgcmVhZEZpZWxkRW5kOwotCi0tIChOU1N0cmluZyAqKSByZWFkU3RyaW5nOwotCi0tIChCT09MKSByZWFkQm9vbDsKLQotLSAodW5zaWduZWQgY2hhcikgcmVhZEJ5dGU7Ci0KLS0gKHNob3J0KSByZWFkSTE2OwotCi0tIChpbnQzMl90KSByZWFkSTMyOwotCi0tIChpbnQ2NF90KSByZWFkSTY0OwotCi0tIChkb3VibGUpIHJlYWREb3VibGU7Ci0KLS0gKE5TRGF0YSAqKSByZWFkQmluYXJ5OwotCi0tICh2b2lkKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiAoaW50ICopIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IChpbnQgKikgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemU7Ci0tICh2b2lkKSByZWFkTWFwRW5kOwotCi0KLS0gKHZvaWQpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplOwotLSAodm9pZCkgcmVhZFNldEVuZDsKLQotCi0tICh2b2lkKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IChpbnQgKikgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplOwotLSAodm9pZCkgcmVhZExpc3RFbmQ7Ci0KLQotLSAodm9pZCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIG1lc3NhZ2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50KSBzZXF1ZW5jZUlEOwotLSAodm9pZCkgd3JpdGVNZXNzYWdlRW5kOwotCi0tICh2b2lkKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lOwotLSAodm9pZCkgd3JpdGVTdHJ1Y3RFbmQ7Ci0KLS0gKHZvaWQpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQpIGZpZWxkSUQ7Ci0KLS0gKHZvaWQpIHdyaXRlSTMyOiAoaW50MzJfdCkgdmFsdWU7Ci0KLS0gKHZvaWQpIHdyaXRlSTY0OiAoaW50NjRfdCkgdmFsdWU7Ci0KLS0gKHZvaWQpIHdyaXRlSTE2OiAoc2hvcnQpIHZhbHVlOwotCi0tICh2b2lkKSB3cml0ZUJ5dGU6ICh1aW50OF90KSB2YWx1ZTsKLQotLSAodm9pZCkgd3JpdGVTdHJpbmc6IChOU1N0cmluZyAqKSB2YWx1ZTsKLQotLSAodm9pZCkgd3JpdGVEb3VibGU6IChkb3VibGUpIHZhbHVlOwotCi0tICh2b2lkKSB3cml0ZUJvb2w6IChCT09MKSB2YWx1ZTsKLQotLSAodm9pZCkgd3JpdGVCaW5hcnk6IChOU0RhdGEgKikgZGF0YTsKLQotLSAodm9pZCkgd3JpdGVGaWVsZFN0b3A7Ci0KLS0gKHZvaWQpIHdyaXRlRmllbGRFbmQ7Ci0KLS0gKHZvaWQpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogKGludCkga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAoaW50KSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZTsKLS0gKHZvaWQpIHdyaXRlTWFwRW5kOwotCi0KLS0gKHZvaWQpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplOwotLSAodm9pZCkgd3JpdGVTZXRFbmQ7Ci0KLQotLSAodm9pZCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZTsKLQotLSAodm9pZCkgd3JpdGVMaXN0RW5kOwotCi0KLUBlbmQKLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOWJlZDYuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0KLSNpbXBvcnQgIlRQcm90b2NvbC5oIgotCi1AaW50ZXJmYWNlIFRQcm90b2NvbERlY29yYXRvciA6IE5TT2JqZWN0IDxUUHJvdG9jb2w+IHsKLSAgICBpZDxUUHJvdG9jb2w+IG1Db25jcmV0ZVByb3RvY29sOwotfQotCi0tIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsKLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YWNiNmMuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IubQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRQcm90b2NvbERlY29yYXRvci5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCi0KLUBpbXBsZW1lbnRhdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IKLQotLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wKLXsKLSAgICBzZWxmID0gW3N1cGVyIGluaXRdOwotICAgIGlmIChzZWxmKSB7Ci0gICAgICAgIG1Db25jcmV0ZVByb3RvY29sID0gW3Byb3RvY29sIHJldGFpbl9zdHViXTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Ci17Ci0gICAgcmV0dXJuIFttQ29uY3JldGVQcm90b2NvbCB0cmFuc3BvcnRdOwotfQotCi0tICh2b2lkKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCAqKSBzZXF1ZW5jZUlECi17Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOm5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6dHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDpzZXF1ZW5jZUlEXTsKLX0KLQotLSAodm9pZCkgcmVhZE1lc3NhZ2VFbmQKLXsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOwotfQotCi0tICh2b2lkKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLXsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTpuYW1lXTsKLX0KLQotLSAodm9pZCkgcmVhZFN0cnVjdEVuZAotewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkU3RydWN0RW5kXTsKLX0KLQotLSAodm9pZCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogKGludCAqKSBmaWVsZElECi17Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTpuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOmZpZWxkSURdOwotfQotLSAodm9pZCkgcmVhZEZpZWxkRW5kCi17Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHJlYWRGaWVsZEVuZF07Ci19Ci0KLS0gKE5TU3RyaW5nICopIHJlYWRTdHJpbmcKLXsKLSAgICByZXR1cm4gW21Db25jcmV0ZVByb3RvY29sIHJlYWRTdHJpbmddOwotfQotCi0tIChCT09MKSByZWFkQm9vbAotewotICAgIHJldHVybiBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZEJvb2xdOwotfQotCi0tICh1bnNpZ25lZCBjaGFyKSByZWFkQnl0ZQotewotICAgIHJldHVybiBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZEJ5dGVdOwotfQotCi0tIChzaG9ydCkgcmVhZEkxNgotewotICAgIHJldHVybiBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZEkxNl07Ci19Ci0KLS0gKGludDMyX3QpIHJlYWRJMzIKLXsKLSAgICByZXR1cm4gW21Db25jcmV0ZVByb3RvY29sIHJlYWRJMzJdOwotfQotCi0tIChpbnQ2NF90KSByZWFkSTY0Ci17Ci0gICAgcmV0dXJuIFttQ29uY3JldGVQcm90b2NvbCByZWFkSTY0XTsKLX0KLQotLSAoZG91YmxlKSByZWFkRG91YmxlCi17Ci0gICAgcmV0dXJuIFttQ29uY3JldGVQcm90b2NvbCByZWFkRG91YmxlXTsKLX0KLQotLSAoTlNEYXRhICopIHJlYWRCaW5hcnkKLXsKLSAgICByZXR1cm4gW21Db25jcmV0ZVByb3RvY29sIHJlYWRCaW5hcnldOwotfQotCi0tICh2b2lkKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiAoaW50ICopIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IChpbnQgKikgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKLXsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTprZXlUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6dmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6c2l6ZV07Ci19Ci0tICh2b2lkKSByZWFkTWFwRW5kCi17Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHJlYWRNYXBFbmRdOwotfQotCi0KLS0gKHZvaWQpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplCi17Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOmVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemVdOwotfQotLSAodm9pZCkgcmVhZFNldEVuZAotewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkU2V0RW5kXTsKLX0KLQotLSAodm9pZCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZQotewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemVdOwotfQotLSAodm9pZCkgcmVhZExpc3RFbmQKLXsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZExpc3RFbmRdOwotfQotCi0tICh2b2lkKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgbWVzc2FnZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQpIHNlcXVlbmNlSUQKLXsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTpuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6bWVzc2FnZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDpzZXF1ZW5jZUlEXTsKLX0KLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUVuZAotewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmRdOwotfQotCi0tICh2b2lkKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi17Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTpuYW1lXTsKLX0KLS0gKHZvaWQpIHdyaXRlU3RydWN0RW5kCi17Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlU3RydWN0RW5kXTsKLX0KLQotLSAodm9pZCkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogKGludCkgZmllbGRJRAotewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTpuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOmZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDpmaWVsZElEXTsKLX0KLQotLSAodm9pZCkgd3JpdGVJMzI6IChpbnQzMl90KSB2YWx1ZQotewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZUkzMjp2YWx1ZV07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlSTY0OiAoaW50NjRfdCkgdmFsdWUKLXsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVJNjQ6dmFsdWVdOwotfQotCi0tICh2b2lkKSB3cml0ZUkxNjogKHNob3J0KSB2YWx1ZQotewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZUkxNjp2YWx1ZV07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlQnl0ZTogKHVpbnQ4X3QpIHZhbHVlCi17Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlQnl0ZTp2YWx1ZV07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlU3RyaW5nOiAoTlNTdHJpbmcgKikgdmFsdWUKLXsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVTdHJpbmc6dmFsdWVdOwotfQotCi0tICh2b2lkKSB3cml0ZURvdWJsZTogKGRvdWJsZSkgdmFsdWUKLXsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVEb3VibGU6dmFsdWVdOwotfQotCi0tICh2b2lkKSB3cml0ZUJvb2w6IChCT09MKSB2YWx1ZQotewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZUJvb2w6dmFsdWVdOwotfQotCi0tICh2b2lkKSB3cml0ZUJpbmFyeTogKE5TRGF0YSAqKSBkYXRhCi17Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlQmluYXJ5OmRhdGFdOwotfQotCi0tICh2b2lkKSB3cml0ZUZpZWxkU3RvcAotewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZUZpZWxkU3RvcF07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlRmllbGRFbmQKLXsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVGaWVsZEVuZF07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogKGludCkga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAoaW50KSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQotewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6a2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6dmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTpzaXplXTsKLX0KLS0gKHZvaWQpIHdyaXRlTWFwRW5kCi17Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlTWFwRW5kXTsKLX0KLQotLSAodm9pZCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTogKGludCkgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKLXsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTplbGVtZW50VHlwZSBzaXplOnNpemVdOwotfQotCi0tICh2b2lkKSB3cml0ZVNldEVuZAotewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZVNldEVuZF07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKLXsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUgc2l6ZTpzaXplXTsKLX0KLQotLSAodm9pZCkgd3JpdGVMaXN0RW5kCi17Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlTGlzdEVuZF07Ci19Ci0KLS0gKHZvaWQpIGRlYWxsb2MKLXsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgcmVsZWFzZV9zdHViXTsKLSAgICBbc3VwZXIgZGVhbGxvY19zdHViXTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzU0ZmMuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEV4Y2VwdGlvbi5oIgotCi1AaW50ZXJmYWNlIFRQcm90b2NvbEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24gewotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24ubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxNDg3YS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5tCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUUHJvdG9jb2xFeGNlcHRpb24uaCIKLQotQGltcGxlbWVudGF0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbgotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIwMGE2ZC4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0jaW1wb3J0ICJUUHJvdG9jb2wuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKLQotCi1AcHJvdG9jb2wgVFByb3RvY29sRmFjdG9yeSA8TlNPYmplY3Q+Ci0KLS0gKGlkIDxUUHJvdG9jb2w+KSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Nzc0OGEuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRQcm90b2NvbC5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgotCi1AaW50ZXJmYWNlIFRQcm90b2NvbFV0aWwgOiBOU09iamVjdCB7Ci0KLX0KLQotKyAodm9pZCkgc2tpcFR5cGU6IChpbnQpIHR5cGUgb25Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsKLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkNzA5NS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwubQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRQcm90b2NvbFV0aWwuaCIKLQotQGltcGxlbWVudGF0aW9uIFRQcm90b2NvbFV0aWwKLQotKyAodm9pZCkgc2tpcFR5cGU6IChpbnQpIHR5cGUgb25Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbAotewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgY2FzZSBUVHlwZV9CT09MOgotICAgIFtwcm90b2NvbCByZWFkQm9vbF07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfQllURToKLSAgICBbcHJvdG9jb2wgcmVhZEJ5dGVdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0kxNjoKLSAgICBbcHJvdG9jb2wgcmVhZEkxNl07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfSTMyOgotICAgIFtwcm90b2NvbCByZWFkSTMyXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9JNjQ6Ci0gICAgW3Byb3RvY29sIHJlYWRJNjRdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0RPVUJMRToKLSAgICBbcHJvdG9jb2wgcmVhZERvdWJsZV07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfU1RSSU5HOgotICAgIFtwcm90b2NvbCByZWFkU3RyaW5nXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9TVFJVQ1Q6Ci0gICAgW3Byb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IE5VTExdOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpbnQgZmllbGRUeXBlOwotICAgICAgW3Byb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogbmlsIHR5cGU6ICZmaWVsZFR5cGUgZmllbGRJRDogbmlsXTsKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVfU1RPUCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgW3Byb3RvY29sIHJlYWRGaWVsZEVuZF07Ci0gICAgfQotICAgIFtwcm90b2NvbCByZWFkU3RydWN0RW5kXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9NQVA6Ci0gIHsKLSAgICBpbnQga2V5VHlwZTsKLSAgICBpbnQgdmFsdWVUeXBlOwotICAgIGludCBzaXplOwotICAgIFtwcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiAma2V5VHlwZSB2YWx1ZVR5cGU6ICZ2YWx1ZVR5cGUgc2l6ZTogJnNpemVdOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBrZXlUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiB2YWx1ZVR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgIH0KLSAgICBbcHJvdG9jb2wgcmVhZE1hcEVuZF07Ci0gIH0KLSAgICBicmVhazsKLSAgICBjYXNlIFRUeXBlX1NFVDoKLSAgICB7Ci0gICAgICBpbnQgZWxlbVR5cGU7Ci0gICAgICBpbnQgc2l6ZTsKLSAgICAgIFtwcm90b2NvbCByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogJmVsZW1UeXBlIHNpemU6ICZzaXplXTsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZWxlbVR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgfQotICAgICAgW3Byb3RvY29sIHJlYWRTZXRFbmRdOwotICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVFR5cGVfTElTVDoKLSAgICB7Ci0gICAgICBpbnQgZWxlbVR5cGU7Ci0gICAgICBpbnQgc2l6ZTsKLSAgICAgIFtwcm90b2NvbCByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6ICZlbGVtVHlwZSBzaXplOiAmc2l6ZV07Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGVsZW1UeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIH0KLSAgICAgIFtwcm90b2NvbCByZWFkTGlzdEVuZF07Ci0gICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgfQotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLmggYi9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZmY5ZjAuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlRQcm90b2NvbEZhY3RvcnkuaCIKLSNpbXBvcnQgIlRQcm9jZXNzb3JGYWN0b3J5LmgiCi0KLSNpZiAhVEFSR0VUX09TX0lQSE9ORQotI2ltcG9ydCA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotI2Vsc2UKLSNpbXBvcnQgPENGTmV0d29yay9DRk5ldHdvcmsuaD4KLSNlbmRpZgotCi1leHRlcm4gTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tldFNlcnZlcl9DbGllbnRDb25uZWN0aW9uRmluaXNoZWRGb3JQcm9jZXNzb3JOb3RpZmljYXRpb247Ci1leHRlcm4gTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tldFNlcnZlcl9Qcm9jZXNzb3JLZXk7Ci1leHRlcm4gTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tlclNlcnZlcl9UcmFuc3BvcnRLZXk7Ci0KLQotQGludGVyZmFjZSBUU29ja2V0U2VydmVyIDogTlNPYmplY3QgewotICBOU0ZpbGVIYW5kbGUgKiBtU29ja2V0RmlsZUhhbmRsZTsKLSAgaWQgPFRQcm90b2NvbEZhY3Rvcnk+IG1JbnB1dFByb3RvY29sRmFjdG9yeTsKLSAgaWQgPFRQcm90b2NvbEZhY3Rvcnk+IG1PdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0gIGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4gbVByb2Nlc3NvckZhY3Rvcnk7Ci19Ci0KLS0gKGlkKSBpbml0V2l0aFBvcnQ6IChpbnQpIHBvcnQKLSAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQotICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3Rvcnk7Ci0KLUBlbmQKLQotCi0KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubSBiL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiYzgyOS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLm0KKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlRTb2NrZXRTZXJ2ZXIuaCIKLSNpbXBvcnQgIlROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaCIKLSNpbXBvcnQgIlRQcm90b2NvbC5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCi0jaW1wb3J0IDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi0KLQotTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tldFNlcnZlcl9DbGllbnRDb25uZWN0aW9uRmluaXNoZWRGb3JQcm9jZXNzb3JOb3RpZmljYXRpb24gPSBAIlRTb2NrZXRTZXJ2ZXJfQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkRm9yUHJvY2Vzc29yTm90aWZpY2F0aW9uIjsKLU5TU3RyaW5nICogY29uc3Qga1RTb2NrZXRTZXJ2ZXJfUHJvY2Vzc29yS2V5ID0gQCJUU29ja2V0U2VydmVyX1Byb2Nlc3NvciI7Ci1OU1N0cmluZyAqIGNvbnN0IGtUU29ja2VyU2VydmVyX1RyYW5zcG9ydEtleSA9IEAiVFNvY2tlclNlcnZlcl9UcmFuc3BvcnQiOwotCi0KLUBpbXBsZW1lbnRhdGlvbiBUU29ja2V0U2VydmVyCi0KLS0gKGlkKSBpbml0V2l0aFBvcnQ6IChpbnQpIHBvcnQKLSAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQotICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3RvcnkKLXsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLQotICBtSW5wdXRQcm90b2NvbEZhY3RvcnkgPSBbcHJvdG9jb2xGYWN0b3J5IHJldGFpbl9zdHViXTsKLSAgbU91dHB1dFByb3RvY29sRmFjdG9yeSA9IFtwcm90b2NvbEZhY3RvcnkgcmV0YWluX3N0dWJdOwotICBtUHJvY2Vzc29yRmFjdG9yeSA9IFtwcm9jZXNzb3JGYWN0b3J5IHJldGFpbl9zdHViXTsKLQotICAvLyBjcmVhdGUgYSBzb2NrZXQuCi0gIGludCBmZCA9IC0xOwotICBDRlNvY2tldFJlZiBzb2NrZXQgPSBDRlNvY2tldENyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsIDAsIE5VTEwsIE5VTEwpOwotICBpZiAoc29ja2V0KSB7Ci0gICAgQ0ZPcHRpb25GbGFncyBmbGFnc1RvQ2xlYXIgPSBrQ0ZTb2NrZXRDbG9zZU9uSW52YWxpZGF0ZTsKLSAgICBDRlNvY2tldFNldFNvY2tldEZsYWdzKHNvY2tldCwgIENGU29ja2V0R2V0U29ja2V0RmxhZ3Moc29ja2V0KSAmIH5mbGFnc1RvQ2xlYXIpOwotCi0gICAgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrZXQpOwotICAgIGludCB5ZXMgPSAxOwotICAgIHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKHZvaWQgKikmeWVzLCBzaXplb2YoeWVzKSk7Ci0KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKLSAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gICAgYWRkci5zaW5fbGVuID0gc2l6ZW9mKGFkZHIpOwotICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7Ci0gICAgTlNEYXRhICphZGRyZXNzID0gW05TRGF0YSBkYXRhV2l0aEJ5dGVzOiZhZGRyIGxlbmd0aDpzaXplb2YoYWRkcildOwotICAgIGlmIChDRlNvY2tldFNldEFkZHJlc3Moc29ja2V0LCAoYnJpZGdlX3N0dWIgQ0ZEYXRhUmVmKWFkZHJlc3MpICE9IGtDRlNvY2tldFN1Y2Nlc3MpIHsKLSAgICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrZXQpOwotICAgICAgQ0ZSZWxlYXNlKHNvY2tldCk7Ci0gICAgICBOU0xvZyhAIioqKiBDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzIik7Ci0gICAgICByZXR1cm4gbmlsOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBOU0xvZyhAIioqKiBObyBzZXJ2ZXIgc29ja2V0Iik7Ci0gICAgcmV0dXJuIG5pbDsKLSAgfQotICAKLSAgLy8gd3JhcCBpdCBpbiBhIGZpbGUgaGFuZGxlIHNvIHdlIGNhbiBnZXQgbWVzc2FnZXMgZnJvbSBpdAotICBtU29ja2V0RmlsZUhhbmRsZSA9IFtbTlNGaWxlSGFuZGxlIGFsbG9jXSBpbml0V2l0aEZpbGVEZXNjcmlwdG9yOiBmZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlT25EZWFsbG9jOiBZRVNdOwotICAKLSAgLy8gdGhyb3cgYXdheSBvdXIgc29ja2V0Ci0gIENGU29ja2V0SW52YWxpZGF0ZShzb2NrZXQpOwotICBDRlJlbGVhc2Uoc29ja2V0KTsKLSAgCi0gICAgLy8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgb2YgYWNjZXB0ZWQgaW5jb21pbmcgY29ubmVjdGlvbnMKLSAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBhZGRPYnNlcnZlcjogc2VsZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBAc2VsZWN0b3IoY29ubmVjdGlvbkFjY2VwdGVkOikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogTlNGaWxlSGFuZGxlQ29ubmVjdGlvbkFjY2VwdGVkTm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IG1Tb2NrZXRGaWxlSGFuZGxlXTsKLSAgCi0gIC8vIHRlbGwgc29ja2V0IHRvIGxpc3RlbgotICBbbVNvY2tldEZpbGVIYW5kbGUgYWNjZXB0Q29ubmVjdGlvbkluQmFja2dyb3VuZEFuZE5vdGlmeV07Ci0gIAotICBOU0xvZyhAIkxpc3RlbmluZyBvbiBUQ1AgcG9ydCAlZCIsIHBvcnQpOwotICAKLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLQotLSAodm9pZCkgZGVhbGxvYyB7Ci0gIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gcmVtb3ZlT2JzZXJ2ZXI6c2VsZl07Ci0gIFttSW5wdXRQcm90b2NvbEZhY3RvcnkgcmVsZWFzZV9zdHViXTsKLSAgW21PdXRwdXRQcm90b2NvbEZhY3RvcnkgcmVsZWFzZV9zdHViXTsKLSAgW21Qcm9jZXNzb3JGYWN0b3J5IHJlbGVhc2Vfc3R1Yl07Ci0gIFttU29ja2V0RmlsZUhhbmRsZSByZWxlYXNlX3N0dWJdOwotICBbc3VwZXIgZGVhbGxvY19zdHViXTsKLX0KLQotCi0tICh2b2lkKSBjb25uZWN0aW9uQWNjZXB0ZWQ6IChOU05vdGlmaWNhdGlvbiAqKSBhTm90aWZpY2F0aW9uCi17Ci0gIE5TRmlsZUhhbmRsZSAqIHNvY2tldCA9IFtbYU5vdGlmaWNhdGlvbiB1c2VySW5mb10gb2JqZWN0Rm9yS2V5OiBOU0ZpbGVIYW5kbGVOb3RpZmljYXRpb25GaWxlSGFuZGxlSXRlbV07Ci0KLSAgLy8gbm93IHRoYXQgd2UgaGF2ZSBhIGNsaWVudCBjb25uZWN0ZWQsIHNwaW4gb2ZmIGEgdGhyZWFkIHRvIGhhbmRsZSBhY3Rpdml0eQotICBbTlNUaHJlYWQgZGV0YWNoTmV3VGhyZWFkU2VsZWN0b3I6IEBzZWxlY3RvcihoYW5kbGVDbGllbnRDb25uZWN0aW9uOikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvVGFyZ2V0OiBzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2l0aE9iamVjdDogc29ja2V0XTsKLQotICBbW2FOb3RpZmljYXRpb24gb2JqZWN0XSBhY2NlcHRDb25uZWN0aW9uSW5CYWNrZ3JvdW5kQW5kTm90aWZ5XTsKLX0KLQotCi0tICh2b2lkKSBoYW5kbGVDbGllbnRDb25uZWN0aW9uOiAoTlNGaWxlSGFuZGxlICopIGNsaWVudFNvY2tldAotewotI2lmIF9faGFzX2ZlYXR1cmUob2JqY19hcmMpCi0gICAgQGF1dG9yZWxlYXNlcG9vbCB7Ci0gICAgICAgIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgKiB0cmFuc3BvcnQgPSBbW1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgYWxsb2NdIGluaXRXaXRoRmlsZUhhbmRsZTogY2xpZW50U29ja2V0XTsKLSAgICAgICAgaWQ8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gW21Qcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZvclRyYW5zcG9ydDogdHJhbnNwb3J0XTsKLSAgICAgICAgCi0gICAgICAgIGlkIDxUUHJvdG9jb2w+IGluUHJvdG9jb2wgPSBbbUlucHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IHRyYW5zcG9ydF07Ci0gICAgICAgIGlkIDxUUHJvdG9jb2w+IG91dFByb3RvY29sID0gW21PdXRwdXRQcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogdHJhbnNwb3J0XTsKLSAgICAgICAgCi0gICAgICAgIEB0cnkgewotICAgICAgICAgICAgQk9PTCByZXN1bHQgPSBOTzsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBAYXV0b3JlbGVhc2Vwb29sIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW3Byb2Nlc3NvciBwcm9jZXNzT25JbnB1dFByb3RvY29sOiBpblByb3RvY29sIG91dHB1dFByb3RvY29sOiBvdXRQcm90b2NvbF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAocmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICBAY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gKiB0ZSkgewotICAgICAgICAgICAgKHZvaWQpdGU7Ci0gICAgICAgICAgICAvL05TTG9nKEAiQ2F1Z2h0IHRyYW5zcG9ydCBleGNlcHRpb24sIGFiYW5kb25pbmcgY2xpZW50IGNvbm5lY3Rpb246ICVAIiwgdGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBOU05vdGlmaWNhdGlvbiAqIG4gPSBbTlNOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uV2l0aE5hbWU6IGtUU29ja2V0U2VydmVyX0NsaWVudENvbm5lY3Rpb25GaW5pc2hlZEZvclByb2Nlc3Nvck5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IHNlbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0c0FuZEtleXM6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUU29ja2V0U2VydmVyX1Byb2Nlc3NvcktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVFNvY2tlclNlcnZlcl9UcmFuc3BvcnRLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbF1dOwotICAgICAgICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIHBlcmZvcm1TZWxlY3Rvck9uTWFpblRocmVhZDogQHNlbGVjdG9yKHBvc3ROb3RpZmljYXRpb246KSB3aXRoT2JqZWN0OiBuIHdhaXRVbnRpbERvbmU6IFlFU107Ci0gICAgICAgIAotICAgIH0KLSNlbHNlCi0gIE5TQXV0b3JlbGVhc2VQb29sICogcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOwotICAKLSAgVE5TRmlsZUhhbmRsZVRyYW5zcG9ydCAqIHRyYW5zcG9ydCA9IFtbVE5TRmlsZUhhbmRsZVRyYW5zcG9ydCBhbGxvY10gaW5pdFdpdGhGaWxlSGFuZGxlOiBjbGllbnRTb2NrZXRdOwotICBpZDxUUHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBbbVByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRm9yVHJhbnNwb3J0OiB0cmFuc3BvcnRdOwotICAKLSAgaWQgPFRQcm90b2NvbD4gaW5Qcm90b2NvbCA9IFtbbUlucHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IHRyYW5zcG9ydF0gYXV0b3JlbGVhc2VdOwotICBpZCA8VFByb3RvY29sPiBvdXRQcm90b2NvbCA9IFtbbU91dHB1dFByb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiB0cmFuc3BvcnRdIGF1dG9yZWxlYXNlXTsKLQotICBAdHJ5IHsKLSAgICBCT09MIHJlc3VsdCA9IE5POwotICAgIGRvIHsKLSAgICAgIE5TQXV0b3JlbGVhc2VQb29sICogbXlQb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07Ci0gICAgICByZXN1bHQgPSBbcHJvY2Vzc29yIHByb2Nlc3NPbklucHV0UHJvdG9jb2w6IGluUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2w6IG91dFByb3RvY29sXTsKLSAgICAgIFtteVBvb2wgcmVsZWFzZV07Ci0gICAgfSB3aGlsZSAocmVzdWx0KTsKLSAgfQotICBAY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gKiB0ZSkgewotICAgIC8vTlNMb2coQCJDYXVnaHQgdHJhbnNwb3J0IGV4Y2VwdGlvbiwgYWJhbmRvbmluZyBjbGllbnQgY29ubmVjdGlvbjogJUAiLCB0ZSk7Ci0gIH0KLQotICBOU05vdGlmaWNhdGlvbiAqIG4gPSBbTlNOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uV2l0aE5hbWU6IGtUU29ja2V0U2VydmVyX0NsaWVudENvbm5lY3Rpb25GaW5pc2hlZEZvclByb2Nlc3Nvck5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IHNlbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0c0FuZEtleXM6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUU29ja2V0U2VydmVyX1Byb2Nlc3NvcktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVFNvY2tlclNlcnZlcl9UcmFuc3BvcnRLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbF1dOwotICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIHBlcmZvcm1TZWxlY3Rvck9uTWFpblRocmVhZDogQHNlbGVjdG9yKHBvc3ROb3RpZmljYXRpb246KSB3aXRoT2JqZWN0OiBuIHdhaXRVbnRpbERvbmU6IFlFU107Ci0gIAotICBbcG9vbCByZWxlYXNlXTsKLSNlbmRpZgotfQotCi0KLQotQGVuZAotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEFzeW5jVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UQXN5bmNUcmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1YjcwMS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UQXN5bmNUcmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgotI2ltcG9ydCAiVEV4Y2VwdGlvbi5oIgotCi10eXBlZGVmIHZvaWQoXlRBc3luY0ZhaWx1cmVCbG9jaykoVEV4Y2VwdGlvbiAqKTsKLQotQHByb3RvY29sIFRBc3luY1RyYW5zcG9ydCA8VFRyYW5zcG9ydD4KLQotLSAodm9pZCkgZmx1c2g6KGRpc3BhdGNoX2Jsb2NrX3QpZmx1c2hlZCBmYWlsdXJlOihUQXN5bmNGYWlsdXJlQmxvY2spZmFpbHVyZTsKLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM4ODc3Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0jaW1wb3J0ICJUVHJhbnNwb3J0LmgiCi0KLUBpbnRlcmZhY2UgVEZyYW1lZFRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PiB7Ci0gICAgaWQgPFRUcmFuc3BvcnQ+IG1UcmFuc3BvcnQ7Ci19Ci0KLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OwotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDg4MDYuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5tCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEZyYW1lZFRyYW5zcG9ydC5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCi0KLSNkZWZpbmUgSEVBREVSX1NJWkUgNAotI2RlZmluZSBJTklUX0ZSQU1FX1NJWkUgMTAyNAotCi1AaW1wbGVtZW50YXRpb24gVEZyYW1lZFRyYW5zcG9ydCB7Ci0gICAgTlNNdXRhYmxlRGF0YSogd3JpdGVCdWZmZXI7Ci0gICAgTlNNdXRhYmxlRGF0YSogcmVhZEJ1ZmZlcjsKLSAgICBOU1VJbnRlZ2VyIHJlYWRPZmZzZXQ7Ci0gICAgdWludDhfdCBkdW1teV9oZWFkZXJbSEVBREVSX1NJWkVdOwotfQotCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKLXsKLSAgICBtVHJhbnNwb3J0ID0gW3RyYW5zcG9ydCByZXRhaW5fc3R1Yl07Ci0gICAgcmVhZEJ1ZmZlciA9IG5pbDsKLSAgICByZWFkT2Zmc2V0ID0gMDsKLSAgICB3cml0ZUJ1ZmZlciA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpJTklUX0ZSQU1FX1NJWkVdOwotICAgIFt3cml0ZUJ1ZmZlciBhcHBlbmRCeXRlczpkdW1teV9oZWFkZXIgbGVuZ3RoOkhFQURFUl9TSVpFXTsKLSAgICByZXR1cm4gc2VsZjsKLX0KLQotLSAodm9pZCkgZGVhbGxvYwotewotICAgIFttVHJhbnNwb3J0IHJlbGVhc2Vfc3R1Yl07Ci0gICAgW3dyaXRlQnVmZmVyIHJlbGVhc2Vfc3R1Yl07Ci0gICAgaWYgKHJlYWRCdWZmZXIgIT0gbmlsKQotICAgICAgICBbcmVhZEJ1ZmZlciByZWxlYXNlX3N0dWJdOwotICAgIFtzdXBlciBkZWFsbG9jX3N0dWJdOwotfQotCi0tICh2b2lkKWZsdXNoCi17Ci0gICAgc2l6ZV90IGhlYWRlckFuZERhdGFMZW5ndGggPSBbd3JpdGVCdWZmZXIgbGVuZ3RoXTsKLSAgICBpZiAoaGVhZGVyQW5kRGF0YUxlbmd0aCA8IEhFQURFUl9TSVpFKSB7Ci0gICAgICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOkAiRnJhbWVkIHRyYW5zcG9ydCBidWZmZXIgaGFzIG5vIGhlYWRlciJdOwotICAgIH0KLQotICAgIHNpemVfdCBkYXRhTGVuZ3RoID0gaGVhZGVyQW5kRGF0YUxlbmd0aCAtIEhFQURFUl9TSVpFOwotICAgIHVpbnQ4X3QgaTMycmRbSEVBREVSX1NJWkVdOwotICAgIGkzMnJkWzBdID0gKHVpbnQ4X3QpKDB4ZmYgJiAoZGF0YUxlbmd0aCA+PiAyNCkpOwotICAgIGkzMnJkWzFdID0gKHVpbnQ4X3QpKDB4ZmYgJiAoZGF0YUxlbmd0aCA+PiAxNikpOwotICAgIGkzMnJkWzJdID0gKHVpbnQ4X3QpKDB4ZmYgJiAoZGF0YUxlbmd0aCA+PiA4KSk7Ci0gICAgaTMycmRbM10gPSAodWludDhfdCkoMHhmZiAmIChkYXRhTGVuZ3RoKSk7Ci0KLSAgICAvLyBzaG91bGQgd2UgbWFrZSBhIGNvcHkgb2YgdGhlIHdyaXRlQnVmZmVyIGluc3RlYWQ/IEJldHRlciBmb3IgdGhyZWFkZWQgb3BlcmF0aW9ucyEKLSAgICBbd3JpdGVCdWZmZXIgcmVwbGFjZUJ5dGVzSW5SYW5nZTpOU01ha2VSYW5nZSgwLCBIRUFERVJfU0laRSkgd2l0aEJ5dGVzOmkzMnJkIGxlbmd0aDpIRUFERVJfU0laRV07Ci0gICAgW21UcmFuc3BvcnQgd3JpdGU6W3dyaXRlQnVmZmVyIG11dGFibGVCeXRlc10gb2Zmc2V0OjAgbGVuZ3RoOmhlYWRlckFuZERhdGFMZW5ndGhdOwotICAgIFttVHJhbnNwb3J0IGZsdXNoXTsKLQotICAgIC8vIHJldXNlIG9sZCBtZW1vcnkgYnVmZmVyCi0gICAgW3dyaXRlQnVmZmVyIHNldExlbmd0aDowXTsKLSAgICBbd3JpdGVCdWZmZXIgYXBwZW5kQnl0ZXM6ZHVtbXlfaGVhZGVyIGxlbmd0aDpIRUFERVJfU0laRV07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlOiAoY29uc3QgdWludDhfdCAqKSBkYXRhIG9mZnNldDogKHNpemVfdCkgb2Zmc2V0IGxlbmd0aDogKHNpemVfdCkgbGVuZ3RoCi17Ci0gICAgW3dyaXRlQnVmZmVyIGFwcGVuZEJ5dGVzOmRhdGErb2Zmc2V0IGxlbmd0aDpsZW5ndGhdOwotfQotCi0tIChzaXplX3QpIHJlYWRBbGw6ICh1aW50OF90ICopIGJ1ZiBvZmZzZXQ6IChzaXplX3QpIG9mZnNldCBsZW5ndGg6IChzaXplX3QpIGxlbmd0aAotewotICAgIGlmIChyZWFkQnVmZmVyID09IG5pbCkgewotICAgICAgICBbc2VsZiByZWFkRnJhbWVdOwotICAgIH0KLSAgICAKLSAgICBpZiAocmVhZEJ1ZmZlciAhPSBuaWwpIHsKLSAgICAgICAgc2l6ZV90IGJ1ZmZlckxlbmd0aCA9IFtyZWFkQnVmZmVyIGxlbmd0aF07Ci0gICAgICAgIGlmIChidWZmZXJMZW5ndGggLSByZWFkT2Zmc2V0ID49IGxlbmd0aCkgewotICAgICAgICAgICAgW3JlYWRCdWZmZXIgZ2V0Qnl0ZXM6YnVmIHJhbmdlOk5TTWFrZVJhbmdlKHJlYWRPZmZzZXQsbGVuZ3RoKV07IC8vIGNvcHkgZGF0YQotICAgICAgICAgICAgcmVhZE9mZnNldCArPSBsZW5ndGg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB2b2lkIHRoZSBwcmV2aW91cyByZWFkQnVmZmVyIGRhdGEgYW5kIHJlcXVlc3QgYSBuZXcgZnJhbWUKLSAgICAgICAgICAgIFtzZWxmIHJlYWRGcmFtZV07Ci0gICAgICAgICAgICBbcmVhZEJ1ZmZlciBnZXRCeXRlczpidWYgcmFuZ2U6TlNNYWtlUmFuZ2UoMCxsZW5ndGgpXTsgLy8gY29weSBkYXRhCi0gICAgICAgICAgICByZWFkT2Zmc2V0ID0gbGVuZ3RoOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsZW5ndGg7Ci19Ci0KLS0gKHZvaWQpcmVhZEZyYW1lCi17Ci0gICAgdWludDhfdCBpMzJyZFtIRUFERVJfU0laRV07Ci0gICAgW21UcmFuc3BvcnQgcmVhZEFsbDogaTMycmQgb2Zmc2V0OiAwIGxlbmd0aDogSEVBREVSX1NJWkVdOwotICAgIGludDMyX3QgaGVhZGVyVmFsdWUgPQotICAgICAgICAoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKLSAgICAgICAgKChpMzJyZFsxXSAmIDB4ZmYpIDw8IDE2KSB8Ci0gICAgICAgICgoaTMycmRbMl0gJiAweGZmKSA8PCAgOCkgfAotICAgICAgICAoKGkzMnJkWzNdICYgMHhmZikpOwotICAgIGlmIChoZWFkZXJWYWx1ZSA8IDApIHsKLSAgICAgICAgTlNTdHJpbmcgKnJlYXNvbiA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiRnJhbWUgaGVhZGVyIHJlcG9ydHMgbmVnYXRpdmUgZnJhbWUgc2l6ZTogJSJQUklkMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyVmFsdWVdOwotICAgICAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFJlYXNvbjpyZWFzb25dOwotICAgIH0KLQotICAgIC8qIENhc3Qgc2hvdWxkIGJlIHNhZmU6Ci0gICAgICogSGF2ZSB2ZXJpZmllZCBoZWFkZXJWYWx1ZSBub24tbmVnYXRpdmUgYW5kIG9mIGxlc3NlciBvciBlcXVhbCBiaXR3aWR0aCB0byBzaXplX3QuICovCi0gICAgc2l6ZV90IGZyYW1lU2l6ZSA9IChzaXplX3QpaGVhZGVyVmFsdWU7Ci0gICAgW3NlbGYgZW5zdXJlUmVhZEJ1ZmZlckhhc0xlbmd0aDpmcmFtZVNpemVdOwotCi0gICAgW21UcmFuc3BvcnQgcmVhZEFsbDpbcmVhZEJ1ZmZlciBtdXRhYmxlQnl0ZXNdIG9mZnNldDowIGxlbmd0aDpmcmFtZVNpemVdOwotfQotCi0tICh2b2lkKWVuc3VyZVJlYWRCdWZmZXJIYXNMZW5ndGg6KHNpemVfdClsZW5ndGgKLXsKLSAgICBpZiAocmVhZEJ1ZmZlciA9PSBuaWwpIHsKLSAgICAgICAgcmVhZEJ1ZmZlciA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdFdpdGhMZW5ndGg6bGVuZ3RoXTsKLSAgICB9IGVsc2UgewotICAgICAgICBzaXplX3QgY3VycmVudExlbmd0aCA9IFtyZWFkQnVmZmVyIGxlbmd0aF07Ci0gICAgICAgIEJPT0wgaXNUb29Mb25nID0gKGN1cnJlbnRMZW5ndGggPj0gbGVuZ3RoKTsKLSAgICAgICAgaWYgKGlzVG9vTG9uZykgewotICAgICAgICAgICAgW3JlYWRCdWZmZXIgc2V0TGVuZ3RoOmxlbmd0aF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaXplX3QgbGVuZ3RoVG9BZGQgPSBsZW5ndGggLSBjdXJyZW50TGVuZ3RoOwotICAgICAgICAgICAgW3JlYWRCdWZmZXIgaW5jcmVhc2VMZW5ndGhCeTpsZW5ndGhUb0FkZF07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUENsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODkzNWZiLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgotCi1AaW50ZXJmYWNlIFRIVFRQQ2xpZW50IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLSAgTlNVUkwgKiBtVVJMOwotICBOU011dGFibGVVUkxSZXF1ZXN0ICogbVJlcXVlc3Q7Ci0gIE5TTXV0YWJsZURhdGEgKiBtUmVxdWVzdERhdGE7Ci0gIE5TRGF0YSAqIG1SZXNwb25zZURhdGE7Ci0gIHNpemVfdCBtUmVzcG9uc2VEYXRhT2Zmc2V0OwotICBOU1N0cmluZyAqIG1Vc2VyQWdlbnQ7Ci0gIGludCBtVGltZW91dDsKLX0KLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTDsKLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTAotICAgICAgICAgdXNlckFnZW50OiAoTlNTdHJpbmcgKikgdXNlckFnZW50Ci0gICAgICAgICAgIHRpbWVvdXQ6IChpbnQpIHRpbWVvdXQ7Ci0KLS0gKHZvaWQpIHNldFVSTDogKE5TVVJMICopIGFVUkw7Ci0KLUBlbmQKLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OTkyN2MuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQubQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRIVFRQQ2xpZW50LmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKLQotQGltcGxlbWVudGF0aW9uIFRIVFRQQ2xpZW50Ci0KLQotLSAodm9pZCkgc2V0dXBSZXF1ZXN0Ci17Ci0gIGlmIChtUmVxdWVzdCAhPSBuaWwpIHsKLSAgICBbbVJlcXVlc3QgcmVsZWFzZV9zdHViXTsKLSAgfQotCi0gIC8vIHNldCB1cCBvdXIgcmVxdWVzdCBvYmplY3QgdGhhdCB3ZSdsbCB1c2UgZm9yIGVhY2ggcmVxdWVzdAotICBtUmVxdWVzdCA9IFtbTlNNdXRhYmxlVVJMUmVxdWVzdCBhbGxvY10gaW5pdFdpdGhVUkw6IG1VUkxdOwotICBbbVJlcXVlc3Qgc2V0SFRUUE1ldGhvZDogQCJQT1NUIl07Ci0gIFttUmVxdWVzdCBzZXRWYWx1ZTogQCJhcHBsaWNhdGlvbi94LXRocmlmdCIgZm9ySFRUUEhlYWRlckZpZWxkOiBAIkNvbnRlbnQtVHlwZSJdOwotICBbbVJlcXVlc3Qgc2V0VmFsdWU6IEAiYXBwbGljYXRpb24veC10aHJpZnQiIGZvckhUVFBIZWFkZXJGaWVsZDogQCJBY2NlcHQiXTsKLQotICBOU1N0cmluZyAqIHVzZXJBZ2VudCA9IG1Vc2VyQWdlbnQ7Ci0gIGlmICghdXNlckFnZW50KSB7Ci0gICAgdXNlckFnZW50ID0gQCJDb2NvYS9USFRUUENsaWVudCI7Ci0gIH0KLSAgW21SZXF1ZXN0IHNldFZhbHVlOiB1c2VyQWdlbnQgZm9ySFRUUEhlYWRlckZpZWxkOiBAIlVzZXItQWdlbnQiXTsKLQotICBbbVJlcXVlc3Qgc2V0Q2FjaGVQb2xpY3k6IE5TVVJMUmVxdWVzdFJlbG9hZElnbm9yaW5nQ2FjaGVEYXRhXTsKLSAgaWYgKG1UaW1lb3V0KSB7Ci0gICAgW21SZXF1ZXN0IHNldFRpbWVvdXRJbnRlcnZhbDogbVRpbWVvdXRdOwotICB9Ci19Ci0KLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTAotewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhVUkw6IGFVUkwKLSAgICAgICAgICAgICAgICAgdXNlckFnZW50OiBuaWwKLSAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAwXTsKLX0KLQotCi0tIChpZCkgaW5pdFdpdGhVUkw6IChOU1VSTCAqKSBhVVJMCi0gICAgICAgICB1c2VyQWdlbnQ6IChOU1N0cmluZyAqKSB1c2VyQWdlbnQKLSAgICAgICAgICAgdGltZW91dDogKGludCkgdGltZW91dAotewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoIXNlbGYpIHsKLSAgICByZXR1cm4gbmlsOwotICB9Ci0KLSAgbVRpbWVvdXQgPSB0aW1lb3V0OwotICBpZiAodXNlckFnZW50KSB7Ci0gICAgbVVzZXJBZ2VudCA9IFt1c2VyQWdlbnQgcmV0YWluX3N0dWJdOwotICB9Ci0gIG1VUkwgPSBbYVVSTCByZXRhaW5fc3R1Yl07Ci0KLSAgW3NlbGYgc2V0dXBSZXF1ZXN0XTsKLQotICAvLyBjcmVhdGUgb3VyIHJlcXVlc3QgZGF0YSBidWZmZXIKLSAgbVJlcXVlc3REYXRhID0gW1tOU011dGFibGVEYXRhIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAxMDI0XTsKLQotICByZXR1cm4gc2VsZjsKLX0KLQotCi0tICh2b2lkKSBzZXRVUkw6IChOU1VSTCAqKSBhVVJMCi17Ci0gIFthVVJMIHJldGFpbl9zdHViXTsKLSAgW21VUkwgcmVsZWFzZV9zdHViXTsKLSAgbVVSTCA9IGFVUkw7Ci0KLSAgW3NlbGYgc2V0dXBSZXF1ZXN0XTsKLX0KLQotCi0tICh2b2lkKSBkZWFsbG9jCi17Ci0gIFttVVJMIHJlbGVhc2Vfc3R1Yl07Ci0gIFttVXNlckFnZW50IHJlbGVhc2Vfc3R1Yl07Ci0gIFttUmVxdWVzdCByZWxlYXNlX3N0dWJdOwotICBbbVJlcXVlc3REYXRhIHJlbGVhc2Vfc3R1Yl07Ci0gIFttUmVzcG9uc2VEYXRhIHJlbGVhc2Vfc3R1Yl07Ci0gIFtzdXBlciBkZWFsbG9jX3N0dWJdOwotfQotCi0KLS0gKHNpemVfdCkgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmIG9mZnNldDogKHNpemVfdCkgb2Zmc2V0IGxlbmd0aDogKHNpemVfdCkgbGVuZ3RoCi17Ci0gIE5TUmFuZ2UgcjsKLSAgci5sb2NhdGlvbiA9IG1SZXNwb25zZURhdGFPZmZzZXQ7Ci0gIHIubGVuZ3RoID0gbGVuZ3RoOwotCi0gIFttUmVzcG9uc2VEYXRhIGdldEJ5dGVzOiBidWYrb2Zmc2V0IHJhbmdlOiByXTsKLSAgbVJlc3BvbnNlRGF0YU9mZnNldCArPSBsZW5ndGg7Ci0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotCi0tICh2b2lkKSB3cml0ZTogKGNvbnN0IHVpbnQ4X3QgKikgZGF0YSBvZmZzZXQ6IChzaXplX3QpIG9mZnNldCBsZW5ndGg6IChzaXplX3QpIGxlbmd0aAotewotICBbbVJlcXVlc3REYXRhIGFwcGVuZEJ5dGVzOiBkYXRhK29mZnNldCBsZW5ndGg6IGxlbmd0aF07Ci19Ci0KLQotLSAodm9pZCkgZmx1c2gKLXsKLSAgW21SZXF1ZXN0IHNldEhUVFBCb2R5OiBtUmVxdWVzdERhdGFdOyAvLyBub3Qgc3VyZSBpZiBpdCBjb3BpZXMgdGhlIGRhdGEKLQotICAvLyBtYWtlIHRoZSBIVFRQIHJlcXVlc3QKLSAgTlNVUkxSZXNwb25zZSAqIHJlc3BvbnNlOwotICBOU0Vycm9yICogZXJyb3I7Ci0gIE5TRGF0YSAqIHJlc3BvbnNlRGF0YSA9Ci0gICAgW05TVVJMQ29ubmVjdGlvbiBzZW5kU3luY2hyb25vdXNSZXF1ZXN0OiBtUmVxdWVzdCByZXR1cm5pbmdSZXNwb25zZTogJnJlc3BvbnNlIGVycm9yOiAmZXJyb3JdOwotCi0gIFttUmVxdWVzdERhdGEgc2V0TGVuZ3RoOiAwXTsKLQotICBpZiAocmVzcG9uc2VEYXRhID09IG5pbCkgewotICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUVHJhbnNwb3J0RXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEAiQ291bGQgbm90IG1ha2UgSFRUUCByZXF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JdOwotICB9Ci0gIGlmICghW3Jlc3BvbnNlIGlzS2luZE9mQ2xhc3M6IFtOU0hUVFBVUkxSZXNwb25zZSBjbGFzc11dKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJVbmV4cGVjdGVkIE5TVVJMUmVzcG9uc2UgdHlwZTogJUAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TU3RyaW5nRnJvbUNsYXNzKFtyZXNwb25zZSBjbGFzc10pXV07Ci0gIH0KLQotICBOU0hUVFBVUkxSZXNwb25zZSAqIGh0dHBSZXNwb25zZSA9IChOU0hUVFBVUkxSZXNwb25zZSAqKSByZXNwb25zZTsKLSAgaWYgKFtodHRwUmVzcG9uc2Ugc3RhdHVzQ29kZV0gIT0gMjAwKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJCYWQgcmVzcG9uc2UgZnJvbSBIVFRQIHNlcnZlcjogJWxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZylbaHR0cFJlc3BvbnNlIHN0YXR1c0NvZGVdXV07Ci0gIH0KLQotICAvLyBwaGV3IQotICBbbVJlc3BvbnNlRGF0YSByZWxlYXNlX3N0dWJdOwotICBtUmVzcG9uc2VEYXRhID0gW3Jlc3BvbnNlRGF0YSByZXRhaW5fc3R1Yl07Ci0gIG1SZXNwb25zZURhdGFPZmZzZXQgPSAwOwotfQotCi0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0ZDM3MS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgotCi1AaW50ZXJmYWNlIFRNZW1vcnlCdWZmZXIgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4gewotCU5TTXV0YWJsZURhdGEgKm1CdWZmZXI7Ci0JTlNVSW50ZWdlciBtT2Zmc2V0OwotfQotLSAoaWQpaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhOwotLSAoTlNEYXRhICopZ2V0QnVmZmVyOwotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTEzYWI4Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIubQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVE1lbW9yeUJ1ZmZlci5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCi0KLSNkZWZpbmUgR0FSQkFHRV9CVUZGRVJfU0laRSA0MDk2IC8vIDRLaUIKLQotQGltcGxlbWVudGF0aW9uIFRNZW1vcnlCdWZmZXIKLS0gKGlkKWluaXQgewotCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkpIHsKLQkJbUJ1ZmZlciA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdF07Ci0JCW1PZmZzZXQgPSAwOwotCX0KLQlyZXR1cm4gc2VsZjsKLX0KLQotLSAoaWQpaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhIHsKLQlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pKSB7Ci0JCW1CdWZmZXIgPSBbZGF0YSBtdXRhYmxlQ29weV07Ci0JCW1PZmZzZXQgPSAwOwotCX0KLQlyZXR1cm4gc2VsZjsKLX0KLQotLSAoc2l6ZV90KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoc2l6ZV90KSBvZmZzZXQgbGVuZ3RoOiAoc2l6ZV90KSBsZW5ndGgKLXsKLQlpZiAoW21CdWZmZXIgbGVuZ3RoXSAtIG1PZmZzZXQgPCBsZW5ndGgpIHsKLQkJQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246QCJOb3QgZW5vdWdoIGJ5dGVzIHJlbWFpbiBpbiBidWZmZXIiXTsKLQl9Ci0JW21CdWZmZXIgZ2V0Qnl0ZXM6YnVmIHJhbmdlOk5TTWFrZVJhbmdlKG1PZmZzZXQsIGxlbmd0aCldOwotCW1PZmZzZXQgKz0gbGVuZ3RoOwotCWlmIChtT2Zmc2V0ID49IEdBUkJBR0VfQlVGRkVSX1NJWkUpIHsKLQkJW21CdWZmZXIgcmVwbGFjZUJ5dGVzSW5SYW5nZTpOU01ha2VSYW5nZSgwLCBtT2Zmc2V0KSB3aXRoQnl0ZXM6TlVMTCBsZW5ndGg6MF07Ci0JCW1PZmZzZXQgPSAwOwotCX0KLQlyZXR1cm4gbGVuZ3RoOwotfQotCi0tICh2b2lkKSB3cml0ZTogKGNvbnN0IHVpbnQ4X3QgKikgZGF0YSBvZmZzZXQ6IChzaXplX3QpIG9mZnNldCBsZW5ndGg6IChzaXplX3QpIGxlbmd0aAotewotCVttQnVmZmVyIGFwcGVuZEJ5dGVzOmRhdGErb2Zmc2V0IGxlbmd0aDpsZW5ndGhdOwotfQotCi0tICh2b2lkKWZsdXNoIHsKLQkvLyBub29wCi19Ci0KLS0gKE5TRGF0YSAqKWdldEJ1ZmZlciB7Ci0JcmV0dXJuIFtbbUJ1ZmZlciBjb3B5XSBhdXRvcmVsZWFzZV9zdHViXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLQlbbUJ1ZmZlciByZWxlYXNlX3N0dWJdOwotCVtzdXBlciBkZWFsbG9jX3N0dWJdOwotfQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTJhMjA5Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKLQotQGludGVyZmFjZSBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLSAgTlNGaWxlSGFuZGxlICogbUlucHV0RmlsZUhhbmRsZTsKLSAgTlNGaWxlSGFuZGxlICogbU91dHB1dEZpbGVIYW5kbGU7Ci19Ci0KLS0gKGlkKSBpbml0V2l0aEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgZmlsZUhhbmRsZTsKLQotLSAoaWQpIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIGlucHV0RmlsZUhhbmRsZQotICAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIG91dHB1dEZpbGVIYW5kbGU7Ci0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmIxOGNhLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQubQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaW1wb3J0ICJUTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKLQotCi1AaW1wbGVtZW50YXRpb24gVE5TRmlsZUhhbmRsZVRyYW5zcG9ydAotCi0tIChpZCkgaW5pdFdpdGhGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIGZpbGVIYW5kbGUKLXsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOiBmaWxlSGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTogZmlsZUhhbmRsZV07Ci19Ci0KLQotLSAoaWQpIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIGlucHV0RmlsZUhhbmRsZQotICAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIG91dHB1dEZpbGVIYW5kbGUKLXsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLQotICBtSW5wdXRGaWxlSGFuZGxlID0gW2lucHV0RmlsZUhhbmRsZSByZXRhaW5fc3R1Yl07Ci0gIG1PdXRwdXRGaWxlSGFuZGxlID0gW291dHB1dEZpbGVIYW5kbGUgcmV0YWluX3N0dWJdOwotCi0gIHJldHVybiBzZWxmOwotfQotCi0KLS0gKHZvaWQpIGRlYWxsb2MgewotICBbbUlucHV0RmlsZUhhbmRsZSByZWxlYXNlX3N0dWJdOwotICBbbU91dHB1dEZpbGVIYW5kbGUgcmVsZWFzZV9zdHViXTsKLSAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07Ci19Ci0KLQotLSAoc2l6ZV90KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoc2l6ZV90KSBvZmZzZXQgbGVuZ3RoOiAoc2l6ZV90KSBsZW5ndGgKLXsKLSAgc2l6ZV90IHRvdGFsQnl0ZXNSZWFkID0gMDsKLSAgd2hpbGUgKHRvdGFsQnl0ZXNSZWFkIDwgbGVuZ3RoKSB7Ci0gICAgTlNEYXRhICogZGF0YSA9IFttSW5wdXRGaWxlSGFuZGxlIHJlYWREYXRhT2ZMZW5ndGg6IGxlbmd0aC10b3RhbEJ5dGVzUmVhZF07Ci0gICAgaWYgKFtkYXRhIGxlbmd0aF0gPT0gMCkgewotICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAIkNhbm5vdCByZWFkLiBObyBtb3JlIGRhdGEuIl07Ci0gICAgfQotICAgIFtkYXRhIGdldEJ5dGVzOiBidWYrdG90YWxCeXRlc1JlYWRdOwotICAgIHRvdGFsQnl0ZXNSZWFkICs9IFtkYXRhIGxlbmd0aF07Ci0gIH0KLSAgcmV0dXJuIHRvdGFsQnl0ZXNSZWFkOwotfQotCi0KLS0gKHZvaWQpIHdyaXRlOiAoY29uc3QgdWludDhfdCAqKSBkYXRhIG9mZnNldDogKHNpemVfdCkgb2Zmc2V0IGxlbmd0aDogKHNpemVfdCkgbGVuZ3RoCi17Ci0gIGNvbnN0IHZvaWQgKnBvcyA9IGRhdGEgKyBvZmZzZXQ7Ci0gIE5TRGF0YSAqIGRhdGFPYmplY3QgPSBbW05TRGF0YSBhbGxvY10gaW5pdFdpdGhCeXRlc05vQ29weTogKHZvaWQgKilwb3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZVdoZW5Eb25lOiBOT107Ci0KLSAgQHRyeSB7Ci0gICAgW21PdXRwdXRGaWxlSGFuZGxlIHdyaXRlRGF0YTogZGF0YU9iamVjdF07Ci0gIH0gQGNhdGNoIChOU0V4Y2VwdGlvbiAqIGUpIHsKLSAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIiVzOiBVbmFibGUgdG8gd3JpdGUgZGF0YTogJUAiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBlXV07Ci0gIH0KLQotICBbZGF0YU9iamVjdCByZWxlYXNlX3N0dWJdOwotfQotCi0KLS0gKHZvaWQpIGZsdXNoCi17Ci0KLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxMWZiOS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0jaW1wb3J0ICJUVHJhbnNwb3J0LmgiCi0KLUBpbnRlcmZhY2UgVE5TU3RyZWFtVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLQotfQotCi1AcHJvcGVydHkgKG5vbmF0b21pYywgc3Ryb25nKSBOU0lucHV0U3RyZWFtICogbUlucHV0OwotQHByb3BlcnR5IChub25hdG9taWMsIHN0cm9uZykgTlNPdXRwdXRTdHJlYW0gKiBtT3V0cHV0OwotCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQKLSAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0OwotCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQ7Ci0KLS0gKGlkKSBpbml0V2l0aE91dHB1dFN0cmVhbTogKE5TT3V0cHV0U3RyZWFtICopIG91dHB1dDsKLQotQGVuZAotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FjMWNkYy4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQubQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKLQotCi1AaW1wbGVtZW50YXRpb24gVE5TU3RyZWFtVHJhbnNwb3J0Ci0KLS0gKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOiAoTlNJbnB1dFN0cmVhbSAqKSBpbnB1dAotICAgICAgICAgICAgICBvdXRwdXRTdHJlYW06IChOU091dHB1dFN0cmVhbSAqKSBvdXRwdXQKLXsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgc2VsZi5tSW5wdXQgPSBbaW5wdXQgcmV0YWluX3N0dWJdOwotICBzZWxmLm1PdXRwdXQgPSBbb3V0cHV0IHJldGFpbl9zdHViXTsKLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOiAoTlNJbnB1dFN0cmVhbSAqKSBpbnB1dAotewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dFN0cmVhbTogaW5wdXQgb3V0cHV0U3RyZWFtOiBuaWxdOwotfQotCi0tIChpZCkgaW5pdFdpdGhPdXRwdXRTdHJlYW06IChOU091dHB1dFN0cmVhbSAqKSBvdXRwdXQKLXsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRTdHJlYW06IG5pbCBvdXRwdXRTdHJlYW06IG91dHB1dF07Ci19Ci0KLS0gKHZvaWQpIGRlYWxsb2MKLXsKLSAgW3NlbGYubUlucHV0IHJlbGVhc2Vfc3R1Yl07Ci0gIFtzZWxmLm1PdXRwdXQgcmVsZWFzZV9zdHViXTsKLSAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07Ci19Ci0KLQotLSAoc2l6ZV90KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoc2l6ZV90KSBvZmZzZXQgbGVuZ3RoOiAoc2l6ZV90KSBsZW5ndGgKLXsKLSAgc2l6ZV90IHRvdGFsQnl0ZXNSZWFkID0gMDsKLSAgc3NpemVfdCBieXRlc1JlYWQgPSAwOwotICB3aGlsZSAodG90YWxCeXRlc1JlYWQgPCBsZW5ndGgpIHsKLSAgICBieXRlc1JlYWQgPSBbc2VsZi5tSW5wdXQgcmVhZDogYnVmK29mZnNldCt0b3RhbEJ5dGVzUmVhZCBtYXhMZW5ndGg6IGxlbmd0aC10b3RhbEJ5dGVzUmVhZF07Ci0KLSAgICBCT09MIGVuY291bnRlcmVkRXJyb3JPckVPRiA9IChieXRlc1JlYWQgPD0gMCk7Ci0gICAgaWYgKGVuY291bnRlcmVkRXJyb3JPckVPRikgewotICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIl07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogYnl0ZXNSZWFkIGlzIGd1YXJhbnRlZWQgdG8gYmUgcG9zaXRpdmUgYW5kIHdpdGhpbiB0aGUgcmFuZ2UgcmVwcmVzZW50YWJsZSBieSBzaXplX3QuICovCi0gICAgICAgIHRvdGFsQnl0ZXNSZWFkICs9IChzaXplX3QpYnl0ZXNSZWFkOwotICAgIH0KLSAgfQotICByZXR1cm4gdG90YWxCeXRlc1JlYWQ7Ci19Ci0KLQotLSAodm9pZCkgd3JpdGU6IChjb25zdCB1aW50OF90ICopIGRhdGEgb2Zmc2V0OiAoc2l6ZV90KSBvZmZzZXQgbGVuZ3RoOiAoc2l6ZV90KSBsZW5ndGgKLXsKLSAgc2l6ZV90IHRvdGFsQnl0ZXNXcml0dGVuID0gMDsKLSAgc3NpemVfdCBieXRlc1dyaXR0ZW4gPSAwOwotICB3aGlsZSAodG90YWxCeXRlc1dyaXR0ZW4gPCBsZW5ndGgpIHsKLSAgICBieXRlc1dyaXR0ZW4gPSBbc2VsZi5tT3V0cHV0IHdyaXRlOiBkYXRhK29mZnNldCt0b3RhbEJ5dGVzV3JpdHRlbiBtYXhMZW5ndGg6IGxlbmd0aC10b3RhbEJ5dGVzV3JpdHRlbl07Ci0gICAgaWYgKGJ5dGVzV3JpdHRlbiA8IDApIHsKLSAgICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOiBAIkVycm9yIHdyaXRpbmcgdG8gdHJhbnNwb3J0IG91dHB1dCBzdHJlYW0uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IFtzZWxmLm1PdXRwdXQgc3RyZWFtRXJyb3JdXTsKLSAgICB9IGVsc2UgaWYgKGJ5dGVzV3JpdHRlbiA9PSAwKSB7Ci0gICAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFJlYXNvbjogQCJFbmQgb2Ygb3V0cHV0IHN0cmVhbS4iXTsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiBieXRlc1dyaXR0ZW4gaXMgZ3VhcmFudGVlZCB0byBiZSBwb3NpdGl2ZSBhbmQgd2l0aGluIHRoZSByYW5nZSByZXByZXNlbnRhYmxlIGJ5IHNpemVfdC4gKi8KLSAgICAgICAgdG90YWxCeXRlc1dyaXR0ZW4gKz0gKHNpemVfdClieXRlc1dyaXR0ZW47Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpIGZsdXNoCi17Ci0gIC8vIG5vIGZsdXNoIGZvciB5b3UhCi19Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRDbGllbnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkZTEyNC4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0Q2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCi0KLUBpbnRlcmZhY2UgVFNTTFNvY2tldENsaWVudCA6IFROU1N0cmVhbVRyYW5zcG9ydAotI2lmIFRBUkdFVF9PU19JUEhPTkUgfHwgKE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPj0gTUFDX09TX1hfVkVSU0lPTl8xMF82KQotPE5TU3RyZWFtRGVsZWdhdGU+Ci0jZW5kaWYKLXsKLSAgICBOU0lucHV0U3RyZWFtICppbnB1dFN0cmVhbTsKLSAgICBOU091dHB1dFN0cmVhbSAqb3V0cHV0U3RyZWFtOwotQHByaXZhdGUKLSAgICBOU1N0cmluZyAqc3NsSG9zdG5hbWU7Ci0gICAgaW50IHNkOwotfQotCi0tIChpZCkgaW5pdFdpdGhIb3N0bmFtZTogKE5TU3RyaW5nICopIGhvc3RuYW1lCi0gICAgICAgICAgICAgICAgICAgcG9ydDogKGludCkgcG9ydDsKLQotLSAoQk9PTCkgaXNPcGVuOwotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0Q2xpZW50Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0Q2xpZW50Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YzU1ZDYuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldENsaWVudC5tCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCA8Q29yZUZvdW5kYXRpb24vQ29yZUZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlRTU0xTb2NrZXRDbGllbnQuaCIKLSNpbXBvcnQgIlRTU0xTb2NrZXRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLQotI2lmICFUQVJHRVRfT1NfSVBIT05FCi0jaW1wb3J0IDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0jZWxzZQotI2ltcG9ydCA8Q0ZOZXR3b3JrL0NGTmV0d29yay5oPgotI2VuZGlmCi0KLUBpbXBsZW1lbnRhdGlvbiBUU1NMU29ja2V0Q2xpZW50Ci0KLS0gKGlkKSBpbml0V2l0aEhvc3RuYW1lOiAoTlNTdHJpbmcgKikgaG9zdG5hbWUKLSAgICAgICAgICAgICAgICAgICBwb3J0OiAoaW50KSBwb3J0Ci17Ci0gICAgc3NsSG9zdG5hbWUgPSBob3N0bmFtZTsKLQlDRlJlYWRTdHJlYW1SZWYgcmVhZFN0cmVhbSA9IE5VTEw7Ci0JQ0ZXcml0ZVN0cmVhbVJlZiB3cml0ZVN0cmVhbSA9IE5VTEw7Ci0gICAgCi0gICAgCi0gICAgLyogY3JlYXRlIGEgc29ja2V0IHN0cnVjdHVyZSAqLwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBwaW47Ci0gICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgaWYgKChocCA9IGdldGhvc3RieW5hbWUoW2hvc3RuYW1lIFVURjhTdHJpbmddKSkgPT0gTlVMTCkgeyAKLSAgICAgICAgICAgIE5TTG9nKEAiZmFpbGVkIHRvIHJlc29sdmUgaG9zdG5hbWUgJUAiLCBob3N0bmFtZSk7Ci0gICAgICAgICAgICBoZXJyb3IoInJlc29sdiIpOwotICAgICAgICAgICAgaWYoaSA9PSA5KSB7Ci0gICAgICAgICAgICAgICAgQHRocm93IFtUU1NMU29ja2V0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiZmFpbGVkIHRvIHJlc29sdmUgaG9zdG5hbWUiXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFtOU1RocmVhZCBzbGVlcEZvclRpbWVJbnRlcnZhbDowLjJdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtZW1zZXQgKCZwaW4sIDAsIHNpemVvZihwaW4pKTsKLSAgICBwaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgbWVtY3B5KCZwaW4uc2luX2FkZHIsIGhwLT5oX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotICAgIHBpbi5zaW5fcG9ydCA9IGh0b25zIChwb3J0KTsKLSAgICAKLSAgICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLwotICAgIGlmICgoc2QgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCkpID09IC0xKQotICAgIHsKLSAgICAgICAgTlNMb2coQCJmYWlsZWQgdG8gY3JlYXRlIHNvY2tldCBmb3IgaG9zdCAlQDolZCIsIGhvc3RuYW1lLCBwb3J0KTsKLSAgICAgICAgQHRocm93IFtUU1NMU29ja2V0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQiXTsKLSAgICB9Ci0gICAgCi0gICAgLyogb3BlbiBhIGNvbm5lY3Rpb24gKi8KLSAgICBpZiAoY29ubmVjdCAoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnBpbiwgc2l6ZW9mKHBpbikpID09IC0xKQotICAgIHsKLSAgICAgICAgTlNMb2coQCJmYWlsZWQgdG8gY3JlYXRlIGNvbmVuY3QgdG8gaG9zdCAlQDolZCIsIGhvc3RuYW1lLCBwb3J0KTsKLSAgICAgICAgQHRocm93IFtUU1NMU29ja2V0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiZmFpbGVkIHRvIGNvbm5lY3QiXTsKLSAgICB9Ci0gICAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBzZCwgJnJlYWRTdHJlYW0sICZ3cml0ZVN0cmVhbSk7Ci0gICAgCi0gICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOwotICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOwotICAgIAotCWlmIChyZWFkU3RyZWFtICYmIHdyaXRlU3RyZWFtKSB7Ci0gICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVByb3BlcnR5U29ja2V0U2VjdXJpdHlMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtU29ja2V0U2VjdXJpdHlMZXZlbFRMU3YxKTsKLSAgICAgICAgCi0gICAgICAgIE5TRGljdGlvbmFyeSAqc2V0dGluZ3MgPQotICAgICAgICBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0c0FuZEtleXM6Ci0gICAgICAgICAoaWQpa0NGQm9vbGVhblRydWUsIChpZClrQ0ZTdHJlYW1TU0xWYWxpZGF0ZXNDZXJ0aWZpY2F0ZUNoYWluLAotICAgICAgICAgbmlsXTsKLSAgICAgICAgCi0gICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KChDRlJlYWRTdHJlYW1SZWYpcmVhZFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGVHlwZVJlZilzZXR0aW5ncyk7Ci0gICAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSgoQ0ZXcml0ZVN0cmVhbVJlZil3cml0ZVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVByb3BlcnR5U1NMU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZUeXBlUmVmKXNldHRpbmdzKTsKLSAgICAgICAgCi0JCWlucHV0U3RyZWFtID0gKGJyaWRnZV9zdHViIE5TSW5wdXRTdHJlYW0gKilyZWFkU3RyZWFtOwotCQlbaW5wdXRTdHJlYW0gcmV0YWluX3N0dWJdOwotCQlbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07Ci0gICAJCVtpbnB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIG1haW5SdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLQkJW2lucHV0U3RyZWFtIG9wZW5dOwotCQkKLQkJb3V0cHV0U3RyZWFtID0gKGJyaWRnZV9zdHViIE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07Ci0JCVtvdXRwdXRTdHJlYW0gcmV0YWluX3N0dWJdOwotCQlbb3V0cHV0U3RyZWFtIHNldERlbGVnYXRlOnNlbGZdOwotICAgICAgICBbb3V0cHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgbWFpblJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOwotCQlbb3V0cHV0U3RyZWFtIG9wZW5dOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIENGUmVsZWFzZShyZWFkU3RyZWFtKTsKLSAgICAgICAgQ0ZSZWxlYXNlKHdyaXRlU3RyZWFtKTsKLQl9Ci0gICAgCi0gICAgCi0JCi0Jc2VsZiA9IFtzdXBlciBpbml0V2l0aElucHV0U3RyZWFtOiBpbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbV07Ci0gICAgCi0JcmV0dXJuIHNlbGY7Ci19Ci0KLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgTlNTdHJlYW1EZWxlZ2F0ZQotLSAodm9pZClzdHJlYW06KE5TU3RyZWFtICopYVN0cmVhbQotICAgIGhhbmRsZUV2ZW50OihOU1N0cmVhbUV2ZW50KWV2ZW50Q29kZSB7Ci0gICAgc3dpdGNoIChldmVudENvZGUpIHsKLSAgICAgICAgY2FzZSBOU1N0cmVhbUV2ZW50Tm9uZToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5TU3RyZWFtRXZlbnRIYXNCeXRlc0F2YWlsYWJsZToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5TU3RyZWFtRXZlbnRPcGVuQ29tcGxldGVkOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTlNTdHJlYW1FdmVudEhhc1NwYWNlQXZhaWxhYmxlOgotICAgICAgICB7Ci0gICAgICAgICAgICBTZWNQb2xpY3lSZWYgcG9saWN5ID0gU2VjUG9saWN5Q3JlYXRlU1NMKE5PLCAoX19icmlkZ2UgQ0ZTdHJpbmdSZWYpKHNzbEhvc3RuYW1lKSk7Ci0gICAgICAgICAgICBTZWNUcnVzdFJlZiB0cnVzdCA9IE5VTEw7Ci0gICAgICAgICAgICBDRkFycmF5UmVmIHN0cmVhbUNlcnRpZmljYXRlc1JlZiA9Ci0gICAgICAgICAgICBDRkJyaWRnaW5nUmV0YWluKChfX2JyaWRnZSBpZCkoKF9fYnJpZGdlIENGQXJyYXlSZWYpKFthU3RyZWFtIHByb3BlcnR5Rm9yS2V5OihOU1N0cmluZyAqKSBrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFBlZXJDZXJ0aWZpY2F0ZXNdKSkpOwotICAgICAgICAgICAgU2VjVHJ1c3RDcmVhdGVXaXRoQ2VydGlmaWNhdGVzKENGQnJpZGdpbmdSZXRhaW4oKF9fYnJpZGdlIGlkKShzdHJlYW1DZXJ0aWZpY2F0ZXNSZWYpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRydXN0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2VjVHJ1c3RSZXN1bHRUeXBlIHRydXN0UmVzdWx0VHlwZSA9IGtTZWNUcnVzdFJlc3VsdEludmFsaWQ7Ci0gICAgICAgICAgICBTZWNUcnVzdEV2YWx1YXRlKHRydXN0LCAmdHJ1c3RSZXN1bHRUeXBlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQk9PTCBwcm9jZWVkID0gTk87Ci0gICAgICAgICAgICBzd2l0Y2ggKHRydXN0UmVzdWx0VHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0UHJvY2VlZDoKLSAgICAgICAgICAgICAgICAgICAgcHJvY2VlZCA9IFlFUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRVbnNwZWNpZmllZDoKLSAgICAgICAgICAgICAgICAgICAgTlNMb2coQCJUcnVzdGVkIGJ5IE9TIik7Ci0gICAgICAgICAgICAgICAgICAgIHByb2NlZWQgPSBZRVM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0UmVjb3ZlcmFibGVUcnVzdEZhaWx1cmU6Ci0gICAgICAgICAgICAgICAgICAgIHByb2NlZWQgPSByZWNvdmVyRnJvbVRydXN0RmFpbHVyZSh0cnVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0RGVueToKLSAgICAgICAgICAgICAgICAgICAgTlNMb2coQCJEZW55Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0RmF0YWxUcnVzdEZhaWx1cmU6Ci0gICAgICAgICAgICAgICAgICAgIE5TTG9nKEAiRmF0YWxUcnVzdEZhaWx1cmUiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRPdGhlckVycm9yOgotICAgICAgICAgICAgICAgICAgICBOU0xvZyhAIk90aGVyRXJyb3IiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRJbnZhbGlkOgotICAgICAgICAgICAgICAgICAgICBOU0xvZyhAIkludmFsaWQiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTlNMb2coQCJEZWZhdWx0Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodHJ1c3QpIHsKLSAgICAgICAgICAgICAgICBDRlJlbGVhc2UodHJ1c3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBvbGljeSkgewotICAgICAgICAgICAgICAgIENGUmVsZWFzZShwb2xpY3kpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFwcm9jZWVkKSB7Ci0gICAgICAgICAgICAgICAgTlNMb2coQCJDYW5ub3QgdHJ1c3QgY2VydGlmaWNhdGUuIFRydXN0UmVzdWx0VHlwZTogJXUiLCB0cnVzdFJlc3VsdFR5cGUpOwotICAgICAgICAgICAgICAgIFthU3RyZWFtIGNsb3NlXTsKLSAgICAgICAgICAgICAgICBAdGhyb3cgW1RTU0xTb2NrZXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFJlYXNvbjogQCJDYW5ub3QgdHJ1c3QgY2VydGlmaWNhdGUiXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTlNTdHJlYW1FdmVudEVycm9yT2NjdXJyZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE5TRXJyb3IgKnRoZUVycm9yID0gW2FTdHJlYW0gc3RyZWFtRXJyb3JdOwotICAgICAgICAgICAgTlNMb2coQCJFcnJvciBvY2N1cnJlZCBvcGVuaW5nIHN0cmVhbTogJUAiLCB0aGVFcnJvcik7Ci0vLyAgICAgICAgICAgIEB0aHJvdyBbVFNTTFNvY2tldEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOiBAIkVycm9yIG9jY3VycmVkIG9wZW5pbmcgc3RyZWFtIiBlcnJvcjogdGhlRXJyb3JdOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBOU1N0cmVhbUV2ZW50RW5kRW5jb3VudGVyZWQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLWJvb2wgcmVjb3ZlckZyb21UcnVzdEZhaWx1cmUoU2VjVHJ1c3RSZWYgbXlUcnVzdCkKLXsKLSAgICAKLSAgICBTZWNUcnVzdFJlc3VsdFR5cGUgdHJ1c3RSZXN1bHQ7Ci0gICAgT1NTdGF0dXMgc3RhdHVzID0gU2VjVHJ1c3RFdmFsdWF0ZShteVRydXN0LCAmdHJ1c3RSZXN1bHQpOwotICAgIAotICAgIENGQWJzb2x1dGVUaW1lIHRydXN0VGltZSxjdXJyZW50VGltZSx0aW1lSW5jcmVtZW50LG5ld1RpbWU7Ci0gICAgQ0ZEYXRlUmVmIG5ld0RhdGU7Ci0gICAgaWYgKHRydXN0UmVzdWx0ID09IGtTZWNUcnVzdFJlc3VsdFJlY292ZXJhYmxlVHJ1c3RGYWlsdXJlKSB7Ci0gICAgICAgIHRydXN0VGltZSA9IFNlY1RydXN0R2V0VmVyaWZ5VGltZShteVRydXN0KTsKLSAgICAgICAgdGltZUluY3JlbWVudCA9IDMxNTM2MDAwOwotICAgICAgICBjdXJyZW50VGltZSA9IENGQWJzb2x1dGVUaW1lR2V0Q3VycmVudCgpOwotICAgICAgICBuZXdUaW1lID0gY3VycmVudFRpbWUgLSB0aW1lSW5jcmVtZW50OwotICAgICAgICBpZiAodHJ1c3RUaW1lIC0gbmV3VGltZSl7Ci0gICAgICAgICAgICBuZXdEYXRlID0gQ0ZEYXRlQ3JlYXRlKE5VTEwsIG5ld1RpbWUpOwotICAgICAgICAgICAgU2VjVHJ1c3RTZXRWZXJpZnlEYXRlKG15VHJ1c3QsIG5ld0RhdGUpOwotICAgICAgICAgICAgc3RhdHVzID0gU2VjVHJ1c3RFdmFsdWF0ZShteVRydXN0LCAmdHJ1c3RSZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh0cnVzdFJlc3VsdCAhPSBrU2VjVHJ1c3RSZXN1bHRQcm9jZWVkKSB7Ci0gICAgICAgIE5TTG9nKEAiQ2VydGlmaWNhdGUgdHJ1c3QgZmFpbHVyZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi0tICh2b2lkKWNsb3NlCi17Ci0gICAgaWYoc2VsZi5tSW5wdXQpIHsKLSAgICAgICAgLy9DbG9zZSBhbmQgcmVzZXQgaW5wdXRzdHJlYW0KLSAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoKF9fYnJpZGdlIENGUmVhZFN0cmVhbVJlZikoc2VsZi5tSW5wdXQpLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7Ci0gICAgICAgIFtzZWxmLm1JbnB1dCBzZXREZWxlZ2F0ZTpuaWxdOwotICAgICAgICBbc2VsZi5tSW5wdXQgY2xvc2VdOwotICAgICAgICBbc2VsZi5tSW5wdXQgcmVtb3ZlRnJvbVJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07Ci0gICAgICAgIHNlbGYubUlucHV0ID0gbmlsOwotICAgIH0KLSAgICAKLSAgICBpZihzZWxmLm1PdXRwdXQpIHsKLSAgICAgICAgLy9DbG9zZSBhbmQgcmVzZXQgb3V0cHV0c3RyZWFtCi0gICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KChfX2JyaWRnZSBDRlJlYWRTdHJlYW1SZWYpKHNlbGYubU91dHB1dCksIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKLSAgICAgICAgW3NlbGYubU91dHB1dCBzZXREZWxlZ2F0ZTpuaWxdOwotICAgICAgICBbc2VsZi5tT3V0cHV0IGNsb3NlXTsKLSAgICAgICAgW3NlbGYubU91dHB1dCByZW1vdmVGcm9tUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLSAgICAgICAgc2VsZi5tT3V0cHV0ID0gbmlsOwotICAgIH0KLX0KLQotLSAoQk9PTCkgaXNPcGVuCi17Ci0gICAgaWYoc2QgPiAwKQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLX0KLQotQGVuZAotCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0RXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0RXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTBiMDUuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldEV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0KLUBpbnRlcmZhY2UgVFNTTFNvY2tldEV4Y2VwdGlvbiA6IFRUcmFuc3BvcnRFeGNlcHRpb24KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqKSBlcnJvcjsKLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb247Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRFeGNlcHRpb24ubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRFeGNlcHRpb24ubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllYWRmNS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0RXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRTU0xTb2NrZXRFeGNlcHRpb24uaCIKLQotQGltcGxlbWVudGF0aW9uIFRTU0xTb2NrZXRFeGNlcHRpb24KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqKSBlcnJvcgotewotICAgIE5TRGljdGlvbmFyeSAqIHVzZXJJbmZvID0gbmlsOwotICAgIGlmIChlcnJvciAhPSBuaWwpIHsKLSAgICAgICAgdXNlckluZm8gPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OiBlcnJvciBmb3JLZXk6IEAiZXJyb3IiXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIFtzdXBlciBleGNlcHRpb25XaXRoTmFtZTogQCJUU1NMU29ja2V0RXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IHJlYXNvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IHVzZXJJbmZvXTsKLX0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLXsKLSAgICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aFJlYXNvbjogcmVhc29uIGVycm9yOiBuaWxdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTAyNDcuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlROU1N0cmVhbVRyYW5zcG9ydC5oIgotCi1AaW50ZXJmYWNlIFRTb2NrZXRDbGllbnQgOiBUTlNTdHJlYW1UcmFuc3BvcnQgCi0jaWYgVEFSR0VUX09TX0lQSE9ORSB8fCAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzYpCi08TlNTdHJlYW1EZWxlZ2F0ZT4KLSNlbmRpZgotewotfQotCi0tIChpZCkgaW5pdFdpdGhIb3N0bmFtZTogKE5TU3RyaW5nICopIGhvc3RuYW1lCi0gICAgICAgICAgICAgICAgICAgcG9ydDogKFVJbnQzMikgcG9ydDsKLQotQGVuZAotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGJhYzc0Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRDbGllbnQubQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbXBvcnQgIlRTb2NrZXRDbGllbnQuaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotCi0jaWYgIVRBUkdFVF9PU19JUEhPTkUKLSNpbXBvcnQgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KLSNlbHNlCi0jaW1wb3J0IDxDRk5ldHdvcmsvQ0ZOZXR3b3JrLmg+Ci0jZW5kaWYKLQotQGludGVyZmFjZSBUU29ja2V0Q2xpZW50ICgpCi17Ci0gICAgTlNJbnB1dFN0cmVhbSAqIGlucHV0U3RyZWFtOwotCU5TT3V0cHV0U3RyZWFtICogb3V0cHV0U3RyZWFtOwotfQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gVFNvY2tldENsaWVudAotCi0tIChpZCkgaW5pdFdpdGhIb3N0bmFtZTogKE5TU3RyaW5nICopIGhvc3RuYW1lCi0gICAgICAgICAgICAgICAgICAgcG9ydDogKFVJbnQzMikgcG9ydAotewotCWlucHV0U3RyZWFtID0gTlVMTDsKLQlvdXRwdXRTdHJlYW0gPSBOVUxMOwotCUNGUmVhZFN0cmVhbVJlZiByZWFkU3RyZWFtID0gTlVMTDsKLQlDRldyaXRlU3RyZWFtUmVmIHdyaXRlU3RyZWFtID0gTlVMTDsKLQlDRlN0cmVhbUNyZWF0ZVBhaXJXaXRoU29ja2V0VG9Ib3N0KGtDRkFsbG9jYXRvckRlZmF1bHQsIChicmlkZ2Vfc3R1YiBDRlN0cmluZ1JlZilob3N0bmFtZSwgcG9ydCwgJnJlYWRTdHJlYW0sICZ3cml0ZVN0cmVhbSk7Ci0JaWYgKHJlYWRTdHJlYW0gJiYgd3JpdGVTdHJlYW0pIHsKLQkJQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOwotCQlDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKLQkJCi0JCWlucHV0U3RyZWFtID0gKGJyaWRnZV9zdHViIE5TSW5wdXRTdHJlYW0gKilyZWFkU3RyZWFtOwotCQlbaW5wdXRTdHJlYW0gcmV0YWluX3N0dWJdOwotCQlbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07Ci0JCVtpbnB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLQkJW2lucHV0U3RyZWFtIG9wZW5dOwotCQkKLQkJb3V0cHV0U3RyZWFtID0gKGJyaWRnZV9zdHViIE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07Ci0JCVtvdXRwdXRTdHJlYW0gcmV0YWluX3N0dWJdOwotCQlbb3V0cHV0U3RyZWFtIHNldERlbGVnYXRlOnNlbGZdOwotCQlbb3V0cHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOwotCQlbb3V0cHV0U3RyZWFtIG9wZW5dOwotICAgICAgICBDRlJlbGVhc2UocmVhZFN0cmVhbSk7Ci0gICAgICAgIENGUmVsZWFzZSh3cml0ZVN0cmVhbSk7Ci0JfQotCQotCXNlbGYgPSBbc3VwZXIgaW5pdFdpdGhJbnB1dFN0cmVhbTogaW5wdXRTdHJlYW0gb3V0cHV0U3RyZWFtOiBvdXRwdXRTdHJlYW1dOwotCQotCXJldHVybiBzZWxmOwotfQotCi0tKHZvaWQpZGVhbGxvYwotewotICAgIFtpbnB1dFN0cmVhbSBjbG9zZV07Ci0gICAgW2lucHV0U3RyZWFtIHJlbW92ZUZyb21SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOwotICAgIFtpbnB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpuaWxdOwotICAgIFtpbnB1dFN0cmVhbSByZWxlYXNlX3N0dWJdOwotICAgIAotICAgIFtvdXRwdXRTdHJlYW0gY2xvc2VdOwotICAgIFtvdXRwdXRTdHJlYW0gcmVtb3ZlRnJvbVJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07Ci0gICAgW291dHB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpuaWxdOwotICAgIFtvdXRwdXRTdHJlYW0gcmVsZWFzZV9zdHViXTsKLSAgICBbc3VwZXIgZGVhbGxvY19zdHViXTsKLX0KLQotCi1AZW5kCi0KLQotCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYWFkOWUuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1AcHJvdG9jb2wgVFRyYW5zcG9ydCA8TlNPYmplY3Q+Ci0KLSAgLyoqCi0gICAqIEd1YXJhbnRlZXMgdGhhdCBhbGwgb2YgbGVuIGJ5dGVzIGFyZSByZWFkCi0gICAqCi0gICAqIEBwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgaW50bwotICAgKiBAcGFyYW0gb2Zmc2V0IEluZGV4IGluIGJ1ZmZlciB0byBzdGFydCBzdG9yaW5nIGJ5dGVzIGF0Ci0gICAqIEBwYXJhbSBsZW5ndGggTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCwgd2hpY2ggbXVzdCBiZSBlcXVhbCB0byBsZW4KLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKLSAgICovCi0tIChzaXplX3QpIHJlYWRBbGw6ICh1aW50OF90ICopIGJ1ZiBvZmZzZXQ6IChzaXplX3QpIG9mZnNldCBsZW5ndGg6IChzaXplX3QpIGxlbmd0aDsKLQotLSAodm9pZCkgd3JpdGU6IChjb25zdCB1aW50OF90ICopIGRhdGEgb2Zmc2V0OiAoc2l6ZV90KSBvZmZzZXQgbGVuZ3RoOiAoc2l6ZV90KSBsZW5ndGg7Ci0KLS0gKHZvaWQpIGZsdXNoOwotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQ5ZmUyLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEV4Y2VwdGlvbi5oIgotCi1AaW50ZXJmYWNlIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKLX0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqKSBlcnJvcjsKLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb247Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24ubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24ubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZGZiZC4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotCi1AaW1wbGVtZW50YXRpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbgotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yCi17Ci0gIE5TRGljdGlvbmFyeSAqIHVzZXJJbmZvID0gbmlsOwotICBpZiAoZXJyb3IgIT0gbmlsKSB7Ci0gICAgdXNlckluZm8gPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OiBlcnJvciBmb3JLZXk6IEAiZXJyb3IiXTsKLSAgfQotCi0gIHJldHVybiBbc3VwZXIgZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IHVzZXJJbmZvXTsKLX0KLQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aFJlYXNvbjogcmVhc29uIGVycm9yOiBuaWxdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY3BwL0NNYWtlTGlzdHMudHh0IGIvbGliL2NwcC9DTWFrZUxpc3RzLnR4dAppbmRleCA0YzdjYWViLi5lOTJkYTYwIDEwMDc1NQotLS0gYS9saWIvY3BwL0NNYWtlTGlzdHMudHh0CisrKyBiL2xpYi9jcHAvQ01ha2VMaXN0cy50eHQKQEAgLTE3LDE2ICsxNywxNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBGaW5kIHJlcXVpcmVkIHBhY2thZ2VzCi1pZihXSVRIX0JPT1NUVEhSRUFEUykKLSAgZmluZF9wYWNrYWdlKEJvb3N0IDEuNTMuMCBSRVFVSVJFRCBDT01QT05FTlRTIHN5c3RlbSB0aHJlYWQpCi1lbHNlKCkKLSAgZmluZF9wYWNrYWdlKEJvb3N0IDEuNTMuMCBSRVFVSVJFRCkKLWVuZGlmKCkKKyMgUmVtb3ZlIHRoZSBmb2xsb3dpbmcgb25jZSBsaWIvY3BwIG5vIGxvbmdlciBkZXBlbmRzIG9uIGJvb3N0IGhlYWRlcnM6CitpbmNsdWRlKEJvb3N0TWFjcm9zKQorUkVRVUlSRV9CT09TVF9IRUFERVJTKCkKIAotaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCiBpbmNsdWRlX2RpcmVjdG9yaWVzKHNyYykKIAoraWYoTk9UIEJVSUxEX1NIQVJFRF9MSUJTKQorICBhZGRfZGVmaW5pdGlvbnMoIi1EVEhSSUZUX1NUQVRJQ19ERUZJTkUiKQorZW5kaWYoKQorCiAjIFNZU0xJQlMgY29udGFpbnMgbGlicmFyaWVzIHRoYXQgbmVlZCB0byBiZSBsaW5rZWQgdG8gYWxsIGxpYiB0YXJnZXRzCiBzZXQoU1lTTElCUyAiIikKIApAQCAtMzUsMTEgKzM1LDExIEBACiAgICBzcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAKICAgIHNyYy90aHJpZnQvVE91dHB1dC5jcHAKICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAKKyAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwCiAgICBzcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaAogICAgc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmNwcAogICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcAogICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwCi0gICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuY3BwCiAgICBzcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcAogICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCiAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcApAQCAtNjQsNyArNjQsNyBAQAogICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcAogKQogCi0jIFRoaXMgZmlsZXMgZG9uJ3Qgd29yayBvbiBXaW5kb3dzIENFIGFzIHRoZXJlIGlzIG5vIHBpcGUgc3VwcG9ydAorIyBUaGVzZSBmaWxlcyBkb24ndCB3b3JrIG9uIFdpbmRvd3MgQ0UgYXMgdGhlcmUgaXMgbm8gcGlwZSBzdXBwb3J0CiAjIFRPRE86IFRoZXNlIGZpbGVzIHdvbid0IHdvcmsgd2l0aCBVTklDT0RFIHN1cHBvcnQgb24gd2luZG93cy4gSWYgZml4ZWQgdGhpcyBjYW4gYmUgcmUtYWRkZWQuCiBpZiAoTk9UIFdJTkNFKQogICAgIGxpc3QoQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCkBAIC05Nyw4ICs5Nyw3IEBACiAgICAgKQogZW5kaWYoKQogCi0jIElmIE9wZW5TU0wgaXMgbm90IGZvdW5kIGp1c3QgaWdub3JlIHRoZSBPcGVuU1NMIHN0dWZmCi1maW5kX3BhY2thZ2UoT3BlblNTTCkKKyMgSWYgT3BlblNTTCBpcyBub3QgZm91bmQgb3IgZGlzYWJsZWQganVzdCBpZ25vcmUgdGhlIE9wZW5TU0wgc3R1ZmYKIGlmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKICAgICBsaXN0KCBBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcApAQCAtMTA4LDY1ICsxMDcsNTcgQEAKICAgICBsaXN0KEFQUEVORCBTWVNMSUJTICIke09QRU5TU0xfTElCUkFSSUVTfSIpCiBlbmRpZigpCiAKLSMgV0lUSF8qVEhSRUFEUyBzZWxlY3RzIHdoaWNoIHRocmVhZGluZyBsaWJyYXJ5IHRvIHVzZQotaWYoV0lUSF9CT09TVFRIUkVBRFMpCi0gICAgc2V0KCB0aHJpZnRjcHBfdGhyZWFkc19TT1VSQ0VTCi0gICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RUaHJlYWRGYWN0b3J5LmNwcAotICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0TW9uaXRvci5jcHAKLSAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE11dGV4LmNwcAotICAgICkKLSAgICBsaXN0KEFQUEVORCBTWVNMSUJTICIke0Jvb3N0X0xJQlJBUklFU30iKQotZWxzZWlmKFVOSVggQU5EIE5PVCBXSVRIX1NURFRIUkVBRFMpCi0gICAgbGlzdChBUFBFTkQgU1lTTElCUyBwdGhyZWFkKQotICAgIHNldCggdGhyaWZ0Y3BwX3RocmVhZHNfU09VUkNFUwotICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAKLSAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAKLSAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcAotICAgICkKLWVsc2UoKQotICAgIGlmKFVOSVgpCi0gICAgICAgICMgbmVlZCBwdGhyZWFkIGZvciBtdWx0aS10aHJlYWQgc3VwcG9ydAoraWYoVU5JWCkKKyAgICBpZihBTkRST0lEKQorICAgICAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXB0aHJlYWQiKQorICAgIGVsc2UoKQogICAgICAgICBsaXN0KEFQUEVORCBTWVNMSUJTIHB0aHJlYWQpCiAgICAgZW5kaWYoKQotICAgIHNldCggdGhyaWZ0Y3BwX3RocmVhZHNfU09VUkNFUwotICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwCi0gICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTXV0ZXguY3BwCi0gICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTW9uaXRvci5jcHAKLSAgICApCiBlbmRpZigpCitzZXQoIHRocmlmdGNwcF90aHJlYWRzX1NPVVJDRVMKKyAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnkuY3BwCisgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuY3BwCisgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcAorICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCispCiAKICMgVGhyaWZ0IG5vbiBibG9ja2luZyBzZXJ2ZXIKIHNldCggdGhyaWZ0Y3BwbmJfU09VUkNFUwogICAgIHNyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKLSAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcAorICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAKKyAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwCiAgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcAogICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCiApCiAKLSMgVGhyaWZ0IHpsaWIgc2VydmVyCisjIFRocmlmdCB6bGliIHRyYW5zcG9ydAogc2V0KCB0aHJpZnRjcHB6X1NPVVJDRVMKICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKLSkKLQotIyBUaHJpZnQgUXQ0IHNlcnZlcgotc2V0KCB0aHJpZnRjcHBxdF9TT1VSQ0VTCi0gICAgc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcAotICAgIHNyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCisgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuY3BwCisgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAKKyAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKKyAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcAogKQogCiAjIENvbnRhaW5zIHRoZSB0aHJpZnQgc3BlY2lmaWMgQUREX0xJQlJBUllfVEhSSUZUIGFuZCBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUCiBpbmNsdWRlKFRocmlmdE1hY3JvcykKIAogQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdCAke3RocmlmdGNwcF9TT1VSQ0VTfSAke3RocmlmdGNwcF90aHJlYWRzX1NPVVJDRVN9KQotVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnQgJHtTWVNMSUJTfSkKK2lmKFdJTjMyKQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0ICR7U1lTTElCU30gd3MyXzMyKQorZWxzZSgpCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnQgJHtTWVNMSUJTfSkKK2VuZGlmKCkKK0FERF9QS0dDT05GSUdfVEhSSUZUKHRocmlmdCkKIAogaWYoV0lUSF9MSUJFVkVOVCkKICAgICBmaW5kX3BhY2thZ2UoTGliZXZlbnQgUkVRVUlSRUQpICAjIExpYmV2ZW50IGNvbWVzIHdpdGggQ01ha2Ugc3VwcG9ydCBmb3JtIHVwc3RyZWFtCiAgICAgaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtMSUJFVkVOVF9JTkNMVURFX0RJUlN9KQogCiAgICAgQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdG5iICR7dGhyaWZ0Y3BwbmJfU09VUkNFU30pCisgICAgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdG5iIHRocmlmdCkKICAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdG5iICR7U1lTTElCU30gJHtMSUJFVkVOVF9MSUJSQVJJRVN9KQotICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnRuYiB0aHJpZnQpCisgICAgQUREX1BLR0NPTkZJR19USFJJRlQodGhyaWZ0LW5iKQogZW5kaWYoKQogCiBpZihXSVRIX1pMSUIpCkBAIC0xNzYsMjcgKzE2NywxOCBAQAogICAgIEFERF9MSUJSQVJZX1RIUklGVCh0aHJpZnR6ICR7dGhyaWZ0Y3Bwel9TT1VSQ0VTfSkKICAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdHogJHtTWVNMSUJTfSAke1pMSUJfTElCUkFSSUVTfSkKICAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0eiB0aHJpZnQpCi1lbmRpZigpCi0KLWlmKFdJVEhfUVQ0KQotICAgIHNldChDTUFLRV9BVVRPTU9DIE9OKQotICAgIGZpbmRfcGFja2FnZShRdDQgUkVRVUlSRUQgQ09NUE9ORU5UUyBRdENvcmUgUXROZXR3b3JrKQotICAgIEFERF9MSUJSQVJZX1RIUklGVCh0aHJpZnRxdCAke3RocmlmdGNwcHF0X1NPVVJDRVN9KQotICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0cXQgJHtTWVNMSUJTfSBRdDQ6OlF0Q29yZSBRdDQ6OlF0TmV0d29yaykKLSAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0cXQgdGhyaWZ0KQorICAgIEFERF9QS0dDT05GSUdfVEhSSUZUKHRocmlmdC16KQogZW5kaWYoKQogCiBpZihXSVRIX1FUNSkKLSAgICAjIFF0NSBoYXMgaXRzIG93biBkaXJlY3RvcnkgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBRdDQgY2F1c2VkIGJ5IENNQUtFX0FVVE9NT0MKICAgICBhZGRfc3ViZGlyZWN0b3J5KHNyYy90aHJpZnQvcXQpCisgICAgQUREX1BLR0NPTkZJR19USFJJRlQodGhyaWZ0LXF0NSkKIGVuZGlmKCkKIAogaWYoTVNWQykKICAgICBhZGRfZGVmaW5pdGlvbnMoIi1EVU5JQ09ERSAtRF9VTklDT0RFIikKIGVuZGlmKCkKIAotYWRkX2RlZmluaXRpb25zKCItRF9fU1REQ19MSU1JVF9NQUNST1MiKQotCiAjIEluc3RhbGwgdGhlIGhlYWRlcnMKIGluc3RhbGwoRElSRUNUT1JZICJzcmMvdGhyaWZ0IiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIKICAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiIFBBVFRFUk4gIioudGNjIikKZGlmZiAtLWdpdCBhL2xpYi9jcHAvTWFrZWZpbGUuYW0gYi9saWIvY3BwL01ha2VmaWxlLmFtCmluZGV4IDQ3NDJlZTAuLjExNGZmMTcgMTAwNzU1Ci0tLSBhL2xpYi9jcHAvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NwcC9NYWtlZmlsZS5hbQpAQCAtMTksOSArMTksNiBAQAogCiBBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMKIAotbW9jXyUuY3BwOiAlLmgKLQkkKFFUX01PQykgJChRVF9DRkxBR1MpICQ8IC1vICRACi0KIG1vY19fJS5jcHA6ICUuaAogCSQoUVQ1X01PQykgJChRVDVfQ0ZMQUdTKSAkPCAtbyAkQAogCkBAIC0zNSw3ICszMiw4IEBACiAKIGxpYl9MVExJQlJBUklFUyA9IGxpYnRocmlmdC5sYQogcGtnY29uZmlnX0RBVEEgPSB0aHJpZnQucGMKLWxpYnRocmlmdF9sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpICQoT1BFTlNTTF9MREZMQUdTKQorbGlidGhyaWZ0X2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pCitsaWJ0aHJpZnRfbGFfTElCQUREID0gJChCT09TVF9MREZMQUdTKSAkKE9QRU5TU0xfTERGTEFHUykgJChPUEVOU1NMX0xJQlMpCiAKICMjIFdlIG9ubHkgYnVpbGQgdGhlIGV4dHJhIGxpYnJhcmllcyBpZiB3ZSBoYXZlIHRoZSBkZXBlbmRlbmNpZXMsCiAjIyBidXQgd2UgaW5zdGFsbCBhbGwgb2YgdGhlIGhlYWRlcnMgdW5jb25kaXRpb25hbGx5LgpAQCAtNDcsMTggKzQ1LDEzIEBACiBsaWJfTFRMSUJSQVJJRVMgKz0gbGlidGhyaWZ0ei5sYQogcGtnY29uZmlnX0RBVEEgKz0gdGhyaWZ0LXoucGMKIGVuZGlmCi1pZiBBTVhfSEFWRV9RVAotbGliX0xUTElCUkFSSUVTICs9IGxpYnRocmlmdHF0LmxhCi1wa2djb25maWdfREFUQSArPSB0aHJpZnQtcXQucGMKLWVuZGlmCiBpZiBBTVhfSEFWRV9RVDUKIGxpYl9MVExJQlJBUklFUyArPSBsaWJ0aHJpZnRxdDUubGEKIHBrZ2NvbmZpZ19EQVRBICs9IHRocmlmdC1xdDUucGMKIGVuZGlmCiAKIEFNX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKLUFNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgJChPUEVOU1NMX0lOQ0xVREVTKSAtSSQoc3JjZGlyKS9zcmMgLURfX1NURENfTElNSVRfTUFDUk9TCi1BTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKSAkKE9QRU5TU0xfTERGTEFHUykKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgJChPUEVOU1NMX0lOQ0xVREVTKSAtSSQoc3JjZGlyKS9zcmMgLURfX1NURENfRk9STUFUX01BQ1JPUyAtRF9fU1REQ19MSU1JVF9NQUNST1MKIAogIyBEZWZpbmUgdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhlIG1vZHVsZQogCkBAIC02NiwxMCArNTksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UT3V0cHV0LmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVmlydHVhbFByb2ZpbGluZy5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcCBcCkBAIC05MCw2ICs4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcCBcCkBAIC05OSw4MiArOTQsNjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcAogCi1pZiBXSVRIX0JPT1NUVEhSRUFEUwotbGlidGhyaWZ0X2xhX1NPVVJDRVMgKz0gc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNb25pdG9yLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0TXV0ZXguY3BwCi1lbHNlCiBsaWJ0aHJpZnRfbGFfU09VUkNFUyArPSBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcAotZW5kaWYKKwkJCQkJCXNyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeS5jcHAgXAorCQkJCQkJc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKIAogbGlidGhyaWZ0bmJfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcAogCi1saWJ0aHJpZnR6X2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKK2xpYnRocmlmdHpfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKIAotbGlidGhyaWZ0cXRfbGFfTU9DID0gc3JjL3RocmlmdC9xdC9tb2NfVFFUY3BTZXJ2ZXIuY3BwCi1ub2Rpc3RfbGlidGhyaWZ0cXRfbGFfU09VUkNFUyA9ICQobGlidGhyaWZ0cXRfbGFfTU9DKQotbGlidGhyaWZ0cXRfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCi1DTEVBTkZJTEVTID0gJChsaWJ0aHJpZnRxdF9sYV9NT0MpCiAKIGxpYnRocmlmdHF0NV9sYV9NT0MgPSBzcmMvdGhyaWZ0L3F0L21vY19fVFFUY3BTZXJ2ZXIuY3BwCiBub2Rpc3RfbGlidGhyaWZ0cXQ1X2xhX1NPVVJDRVMgPSAkKGxpYnRocmlmdHF0NV9sYV9NT0MpCiBsaWJ0aHJpZnRxdDVfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcAotQ0xFQU5GSUxFUyArPSAkKGxpYnRocmlmdHF0NV9sYV9NT0MpCitDTEVBTkZJTEVTID0gJChsaWJ0aHJpZnRxdDVfbGFfTU9DKQogCiAjIEZsYWdzIGZvciB0aGUgdmFyaW91cyBsaWJyYXJpZXMKIGxpYnRocmlmdG5iX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMSUJFVkVOVF9DUFBGTEFHUykKIGxpYnRocmlmdHpfbGFfQ1BQRkxBR1MgID0gJChBTV9DUFBGTEFHUykgJChaTElCX0NQUEZMQUdTKQotbGlidGhyaWZ0cXRfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKFFUX0NGTEFHUykKIGxpYnRocmlmdHF0NV9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoUVQ1X0NGTEFHUykKIGlmIFFUNV9SRURVQ0VfUkVMT0NBVElPTlMKIGxpYnRocmlmdHF0NV9sYV9DUFBGTEFHUyArPSAtZlBJQwogZW5kaWYKIGxpYnRocmlmdG5iX2xhX0NYWEZMQUdTID0gJChBTV9DWFhGTEFHUykKIGxpYnRocmlmdHpfbGFfQ1hYRkxBR1MgID0gJChBTV9DWFhGTEFHUykKLWxpYnRocmlmdHF0X2xhX0NYWEZMQUdTICA9ICQoQU1fQ1hYRkxBR1MpCiBsaWJ0aHJpZnRxdDVfbGFfQ1hYRkxBR1MgID0gJChBTV9DWFhGTEFHUykKIGxpYnRocmlmdG5iX2xhX0xERkxBR1MgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpCi1saWJ0aHJpZnR6X2xhX0xERkxBR1MgICA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKQotbGlidGhyaWZ0cXRfbGFfTERGTEFHUyAgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpICQoUVRfTElCUykKK2xpYnRocmlmdHpfbGFfTERGTEFHUyAgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpICQoWkxJQl9MSUJTKQogbGlidGhyaWZ0cXQ1X2xhX0xERkxBR1MgICA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKSAkKFFUNV9MSUJTKQogCiBpbmNsdWRlX3RocmlmdGRpciA9ICQoaW5jbHVkZWRpcikvdGhyaWZ0CiBpbmNsdWRlX3RocmlmdF9IRUFERVJTID0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9jb25maWcuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90aHJpZnQtY29uZmlnLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdGhyaWZ0X2V4cG9ydC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RocmlmdC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RPdXRwdXQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UUHJvY2Vzc29yLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVExvZ2dpbmcuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jeHhmdW5jdGlvbmFsLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVFRvU3RyaW5nLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RUb1N0cmluZy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RCYXNlLmgKIAogaW5jbHVkZV9jb25jdXJyZW5jeWRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL2NvbmN1cnJlbmN5CiBpbmNsdWRlX2NvbmN1cnJlbmN5X0hFQURFUlMgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnkuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmgKIAogaW5jbHVkZV9wcm90b2NvbGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3Byb3RvY29sCiBpbmNsdWRlX3Byb3RvY29sX0hFQURFUlMgPSBcCkBAIC0xODMsMTEgKzE2MCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmgKQEAgLTE5NywxMCArMTc2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaCBcCkBAIC0yNDksOCArMjMyLDYgQEAKICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oIFwKICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaAogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBXSU5ET1dTX0RJU1QgPSBcCiAgICAgICAgICAgICAgc3JjL3RocmlmdC93aW5kb3dzIFwKICAgICAgICAgICAgICB0aHJpZnQuc2xuIFwKQEAgLTI2Nyw3ICsyNDgsNiBAQAogICAgICAgICAgICAgIHRocmlmdC1uYi5wYy5pbiBcCiAgICAgICAgICAgICAgdGhyaWZ0LnBjLmluIFwKICAgICAgICAgICAgICB0aHJpZnQtei5wYy5pbiBcCi0gICAgICAgICAgICAgdGhyaWZ0LXF0LnBjLmluIFwKICAgICAgICAgICAgICB0aHJpZnQtcXQ1LnBjLmluIFwKICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3F0L0NNYWtlTGlzdHMudHh0IFwKICAgICAgICAgICAgICAkKFdJTkRPV1NfRElTVCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvUkVBRE1FLm1kIGIvbGliL2NwcC9SRUFETUUubWQKaW5kZXggMmJlZTJlYy4uOGE4OTdkMSAxMDA3NTUKLS0tIGEvbGliL2NwcC9SRUFETUUubWQKKysrIGIvbGliL2NwcC9SRUFETUUubWQKQEAgLTE5LDcgKzE5LDYgQEAKIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0KICMgVXNpbmcgVGhyaWZ0IHdpdGggQysrCiAKIFRoZSBUaHJpZnQgQysrIGxpYnJhcmllcyBhcmUgYnVpbHQgdXNpbmcgdGhlIEdOVSB0b29scy4gRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKQEAgLTM0LDggKzMzLDggQEAKIAogVGhyaWZ0IGlzIGRpdmlkZWQgaW50byB0d28gbGlicmFyaWVzLgogCi0qIGxpYnRocmlmdCAtIFRoZSBjb3JlIFRocmlmdCBsaWJyYXJ5IGNvbnRhaW5zIGFsbCB0aGUgY29yZSBUaHJpZnQgY29kZS4gSXQgcmVxdWlyZXMKLSAgYm9vc3Qgc2hhcmVkIHBvaW50ZXJzLCBwdGhyZWFkcywgYW5kIGxpYnJ0LgorKiBsaWJ0aHJpZnQgLSBUaGUgY29yZSBUaHJpZnQgbGlicmFyeSBjb250YWlucyBhbGwgdGhlIGNvcmUgVGhyaWZ0IGNvZGUuICBUaGlzIHJlcXVpcmVzCisgIG9wZW5zc2wsIHB0aHJlYWRzLCBhbmQgbGlicnQuCiAKICogbGlidGhyaWZ0bmIgLSBUaGlzIGxpYnJhcnkgY29udGFpbnMgdGhlIFRocmlmdCBub25ibG9ja2luZyBzZXJ2ZXIsIHdoaWNoIHVzZXMgbGliZXZlbnQuCiAgIFRvIGxpbmsgdGhpcyBsaWJyYXJ5IHlvdSB3aWxsIGFsc28gbmVlZCB0byBsaW5rIGxpYmV2ZW50LgpAQCAtNTUsMTUgKzU0LDIwIEBACiAKICMjIERlcGVuZGVuY2llcwogCi1ib29zdCBzaGFyZWQgcG9pbnRlcnMKLWh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvc21hcnRfcHRyL3NtYXJ0X3B0ci5odG0KK0MrKzExIGlzIHJlcXVpcmVkIGF0IGEgbWluaW11bS4gIEMrKzAzL0MrKzk4IGFyZSBub3Qgc3VwcG9ydGVkIGFmdGVyIHZlcnNpb24gMC4xMi4wLgogCi1saWJldmVudCAoZm9yIGxpYnRocmlmdG5iIG9ubHkpCitCb29zdCBpcyByZXF1aXJlZCB0byBydW4gdGhlIEMrKyB1bml0IHRlc3RzLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBsaW5rIGFnYWluc3QKK3RoZSBydW50aW1lIGxpYnJhcnkuCisKK2xpYmV2ZW50IChmb3IgbGlidGhyaWZ0bmIgb25seSkgLSBtb3N0IGxpbnV4IGRpc3RyaWJ1dGlvbnMgaGF2ZSBkZXYgcGFja2FnZXMgZm9yIHRoaXM6CiBodHRwOi8vbW9ua2V5Lm9yZy9+cHJvdm9zL2xpYmV2ZW50LwogCiAjIFVzaW5nIFRocmlmdCB3aXRoIEMrKyBvbiBXaW5kb3dzCiAKLVlvdSBuZWVkIHRvIGRlZmluZSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIDNyZCBwYXJ0eSBjb21wb25lbnRzIHNlcGFyYXRlbHk6CitCb3RoIHRoZSBhdXRvY29uZiBhbmQgY21ha2UgYnVpbGQgc3lzdGVtcyBhcmUgYWJsZSB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBtYW55CitzeXN0ZW0gY29uZmlndXJhdGlvbnMgd2l0aG91dCB0aGUgbmVlZCB0byBzcGVjaWZ5IGxpYnJhcnkgbG9jYXRpb25zLCBob3dldmVyIGlmCit5b3UgcnVuIGludG8gcHJvYmxlbXMgb3Igd2FudCB0byByZWRpcmVjdCB0aHJpZnQgdG8gYnVpbGQgYW5kIGxpbmsgYWdhaW5zdCB5b3VyCitvd24gcHJvdmlkZWQgdGhpcmQgcGFydHkgbGlicmFyaWVzOgogCiBCT09TVF9ST09UIDogRm9yIGJvb3N0LCBlLmcuIEQ6XGJvb3N0XzFfNTVfMAogT1BFTlNTTF9ST09UX0RJUiA6IEZvciBPcGVuU1NMLCBlLmcuIEQ6XE9wZW5TU0wtV2luMzIKQEAgLTc0LDU0ICs3OCwyNSBAQAogCiBTZWUgLzNyZHBhcnR5LnVzZXIgZm9yIG1vcmUgZGV0YWlscy4KIAotVGhyaWZ0IGlzIGRpdmlkZWQgaW50byB0d28gbGlicmFyaWVzLgotCi0qIGxpYnRocmlmdCAtIFRoZSBjb3JlIFRocmlmdCBsaWJyYXJ5IGNvbnRhaW5zIGFsbCB0aGUgY29yZSBUaHJpZnQgY29kZS4gSXQgcmVxdWlyZXMKLSAgYm9vc3Qgc2hhcmVkIHBvaW50ZXJzLCBwdGhyZWFkcywgYW5kIGxpYnJ0LgotCi0qIGxpYnRocmlmdG5iIC0gVGhpcyBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBUaHJpZnQgbm9uYmxvY2tpbmcgc2VydmVyLCB3aGljaCB1c2VzIGxpYmV2ZW50LgotICBUbyBsaW5rIHRoaXMgbGlicmFyeSB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gbGluayBsaWJldmVudC4KK1RoZSBzYW1lIGxpbmtpbmcgZ3VpZGVsaW5lcyBkZXNjcmliZWQgYWJvdmUgZm9yIGxpYnRocmlmdG5iIGFwcGx5IHRvIHdpbmRvd3MgYXMgd2VsbC4KIAogIyMgTGlua2luZyBBZ2FpbnN0IFRocmlmdAogCiBZb3UgbmVlZCB0byBsaW5rIHlvdXIgcHJvamVjdCB0aGF0IHVzZXMgdGhyaWZ0IGFnYWluc3QgYWxsIHRoZSB0aHJpZnQKLWRlcGVuZGVuY2llczsgaW4gdGhlIGNhc2Ugb2YgbGlidGhyaWZ0LCBib29zdCBhbmQgZm9yCitkZXBlbmRlbmNpZXM7IGluIHRoZSBjYXNlIG9mIGxpYnRocmlmdCwgb3BlbnNzbCwgcHRocmVhZHMsIGFuZCBsaWJydCBhbmQgZm9yCiBsaWJ0aHJpZnRuYiwgbGliZXZlbnQuCiAKIEluIHRoZSBwcm9qZWN0IHByb3BlcnRpZXMgeW91IG11c3QgYWxzbyBzZXQgSEFWRV9DT05GSUdfSCBhcyBmb3JjZSBpbmNsdWRlCi10aGUgY29uZmlnIGhlYWRlcjogIndpbmRvd3MvY29uZmcuaCIKK3RoZSBjb25maWcgaGVhZGVyOiAid2luZG93cy9jb25maWcuaCIKIAogIyMgRGVwZW5kZW5jaWVzCiAKLWJvb3N0IHNoYXJlZCBwb2ludGVycwotaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9zbWFydF9wdHIvc21hcnRfcHRyLmh0bQotCi1ib29zdCB0aHJlYWQKLWh0dHA6Ly93d3cuYm9vc3Qub3JnL2RvYy9saWJzL3JlbGVhc2UvZG9jL2h0bWwvdGhyZWFkLmh0bWwKLQogbGliZXZlbnQgKGZvciBsaWJ0aHJpZnRuYiBvbmx5KQogaHR0cDovL21vbmtleS5vcmcvfnByb3Zvcy9saWJldmVudC8KIAotIyMgTm90ZXMgb24gYm9vc3QgdGhyZWFkIChzdGF0aWMgdnMgc2hhcmVkKToKLQotQnkgZGVmYXVsdCBsaWIvY3BwL3dpbmRvd3MvZm9yY2VfaW5jLmggZGVmaW5lczoKLQotICAgICNkZWZpbmUgQk9PU1RfQUxMX05PX0xJQiAxCi0gICAgI2RlZmluZSBCT09TVF9USFJFQURfTk9fTElCIDEKLQotVGhpcyBoYXMgZm9yIGVmZmVjdCB0byBoYXZlIHRoZSBob3N0IGFwcGxpY2F0aW9uIGxpbmtpbmcgYWdhaW5zdCBUaHJpZnQKLXRvIGhhdmUgdG8gbGluayB3aXRoIGJvb3N0IHRocmVhZCBhcyBhIHN0YXRpYyBsaWJyYXJ5LgotCi1JZiB5b3Ugd2FudGVkIGluc3RlYWQgdG8gbGluayB3aXRoIGJvb3N0IHRocmVhZCBhcyBhIHNoYXJlZCBsaWJyYXJ5LAoteW91J2xsIG5lZWQgdG8gdW5jb21tZW50IHRob3NlIHR3byBsaW5lcywgYW5kIHJlY29tcGlsZS4KLQogIyMgV2luZG93cyB2ZXJzaW9uIGNvbXBhdGliaWxpdHkKIAotVGhlIFRocmlmdCBsaWJyYXJ5IHRhcmdldHMgV2luZG93cyBYUCBmb3IgYnJvYWRlc3QgY29tcGF0YmlsaXR5LiBBIG5vdGFibGUKLWRpZmZlcmVuY2UgaXMgaW4gdGhlIFdpbmRvd3Mtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNvY2tldCBwb2xsCi1mdW5jdGlvbi4gVG8gdGFyZ2V0IFZpc3RhLCBXaW43IG9yIG90aGVyIHZlcnNpb25zLCBjb21tZW50IG91dCB0aGUgbGluZQotCi0gICAgI2RlZmluZSBUQVJHRVRfV0lOX1hQLgorVGhlIFRocmlmdCBsaWJyYXJ5IHRhcmdldHMgV2luZG93cyA3IG9yIGxhdHRlciB2ZXJzaW9ucy4gVGhlIHN1cHBvcnRzIGZvciB3aW5kb3dzIFhQIGFuZCBWaXN0YSBhcmUgYXZhaWFibGUgdW50aWwgMC4xMi4wLgogCiAjIyBOYW1lZCBQaXBlcwogCkBAIC0xMzksNTAgKzExNCwxNiBAQAogCiAjIyBJbXBsZW1lbnRhdGlvbgogCi1UaGVyZSdyZSB0d28gbWFpbiBjbGFzc2VzIFRTU0xTb2NrZXRGYWN0b3J5IGFuZCBUU1NMU29ja2V0LiBJbnN0YW5jZXMgb2YKK1RoZXJlIGFyZSB0d28gbWFpbiBjbGFzc2VzIFRTU0xTb2NrZXRGYWN0b3J5IGFuZCBUU1NMU29ja2V0LiBJbnN0YW5jZXMgb2YKIFRTU0xTb2NrZXQgYXJlIGFsd2F5cyBjcmVhdGVkIGZyb20gVFNTTFNvY2tldEZhY3RvcnkuCiAKLVBvc2l4U1NMVGhyZWFkRmFjdG9yeSBjcmVhdGVzIFBvc2l4U1NMVGhyZWFkLiBUaGUgb25seSBkaWZmZXJlbmNlIGZyb20gdGhlCi1QdGhyZWFkVGhyZWFkIHR5cGUgaXMgdGhhdCBpdCBjbGVhbnVwcyBPcGVuU1NMIGVycm9yIHF1ZXVlIHVwb24gZXhpdGluZwotdGhlIHRocmVhZC4gSWRlYWxseSwgT3BlblNTTCBBUElzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIFBvc2l4U1NMVGhyZWFkLgotCiAjIyBIb3cgdG8gdXNlIFNTTCBBUElzCiAKLVRoaXMgaXMgZm9yIGRlbW8uIEluIHJlYWwgY29kZSwgdHlwaWNhbGx5IG9ubHkgb25lIFRTU0xTb2NrZXRGYWN0b3J5Ci1pbnN0YW5jZSBpcyBuZWVkZWQuCitTZWUgdGhlIFRlc3RDbGllbnQuY3BwIGFuZCBUZXN0U2VydmVyLmNwcCBmaWxlcyBmb3IgZXhhbXBsZXMuCiAKLSAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBnZXRTU0xTb2NrZXRGYWN0b3J5KCkgewotICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeShuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7Ci0gICAgICAvLyBjbGllbnQ6IGxvYWQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMKLSAgICAgIGZhY3RvcnktPmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCJteS10cnVzdGVkLWNhLWNlcnRpZmljYXRlcy5wZW0iKTsKLSAgICAgIC8vIGNsaWVudDogb3B0aW9uYWxseSBzZXQgeW91ciBvd24gYWNjZXNzIG1hbmFnZXIsIG90aGVyd2lzZSwKLSAgICAgIC8vICAgICAgICAgdGhlIGRlZmF1bHQgY2xpZW50IGFjY2VzcyBtYW5hZ2VyIHdpbGwgYmUgbG9hZGVkLgorIyMjIEFjY2Vzc01hbmFnZXIgKGNlcnRpZmljYXRlIHZhbGlkYXRpb24pCiAKLSAgICAgIGZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZSgibXktY2VydGlmaWNhdGUtc2lnbmVkLWJ5LWNhLnBlbSIpOwotICAgICAgZmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoIm15LXByaXZhdGUta2V5LnBlbSIpOwotICAgICAgLy8gc2VydmVyOiBvcHRpb25hbGx5IHNldHVwIGFjY2VzcyBtYW5hZ2VyCi0gICAgICAvLyBzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IGFjY2Vzc01hbmFnZXIobmV3IE15QWNjZXNzTWFuYWdlcik7Ci0gICAgICAvLyBmYWN0b3J5LT5hY2Nlc3MoYWNjZXNzTWFuYWdlcik7Ci0gICAgICAuLi4KLSAgICB9Ci0KLQotY2xpZW50IGNvZGUgc2FtcGxlCi0KLSAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5ID0gZ2V0U1NMU29ja2V0RmFjdG9yeSgpOwotICAgIHNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0ID0gZmFjdG9yeS5jcmVhdGVTb2NrZXQoaG9zdCwgcG9ydCk7Ci0gICAgc2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOwotICAgIC4uLgotCi0KLXNlcnZlciBjb2RlIHNhbXBsZQotCi0gICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSA9IGdldFNTTFNvY2tldEZhY3RvcnkoKTsKLSAgICBzaGFyZWRfcHRyPFRTU0xTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBmYWN0b3J5KSk7Ci0gICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSkpOwotICAgIC4uLgotCi0jIyBBY2Nlc3NNYW5hZ2VyCitBbiBleGFtcGxlIG9mIGNlcnRpZmljYXRlIHZhbGlkYXRpb24gY2FuIGJlIGZvdW5kIGluIFRlc3RTZXJ2ZXIuY3BwLgogCiBBY2Nlc3NNYW5hZ2VyIGRlZmluZXMgYSBjYWxsYmFjayBpbnRlcmZhY2UuIEl0IGhhcyB0aHJlZSBjYWxsYmFjayBtZXRob2RzOgogCkBAIC0yNzIsMyArMjEzLDY2IEBACiAKIFRoZSBQUk5HIHNlZWQgaXMga2V5IHRvIHRoZSBhcHBsaWNhdGlvbiBzZWN1cml0eS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlCiBvdmVycmlkZGVuIGlmIGl0J3Mgbm90IHN0cm9uZyBlbm91Z2ggZm9yIHlvdS4KKworIyBEZXByZWNhdGlvbnMKKworIyMgMC4xMi4wCisKK1N1cHBvcnQgZm9yIEMrKzAzL0MrKzk4IHdhcyBkZXByZWNhdGVkLgorU3VwcG9ydCBmb3IgQm9vc3QgYXQgcnVudGltZSB3YXMgZGVwcmVjYXRlZC4KKworIyBCcmVha2luZyBDaGFuZ2VzCisKKyMjIDEuMC4wCisKK1RIUklGVC00NzIwOgorVGhlIGNsYXNzZXMgTW9uaXRvciBhbmQgVGltZXJNYW5hZ2VyIG5vdyB1c2Ugc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBmb3IgdGltZW91dCwgdGhlIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyBpbnZvbHZpbmcgVEhSSUZUX1RJTUVTUEVDIGFuZCB0aW1ldmFsIGhhdmUgYmVlbiByZW1vdmVkLCB0aGUgcmVsYXRlZCB0ZXN0cyBoYXZlIGJlZW4gbW9kaWZpZWQuCisKK1N1cHBvcnQgZm9yIFdpbmRvd3MgWFAvVmlzdGEgaGFzIGJlZW4gZHJvcHBlZC4KKworU3VwcG9ydCBmb3IgQysrMDMvQysrOTggaGFzIGJlZW4gZHJvcHBlZC4gIFVzZSB2ZXJzaW9uIDAuMTIuMCB0byBzdXBwb3J0IHRoYXQKK2xhbmd1YWdlIGxldmVsLiAgQXMgYSBjb25zZXF1ZW5jZSwgYm9vc3QgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFzIGEgcnVudGltZQorbGlicmFyeSBkZXBlbmVkZW5jeSwgYnV0IGlzIGlzIHN0aWxsIHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBydW50aW1lIGxpYnJhcnkKK2FuZCB0byBydW4gdGhlIHVuaXQgdGVzdHMuICBXZSB3aWxsIHdvcmsgdG93YXJkcyByZW1vdmluZyBib29zdCBhcyBhCitidWlsZCBkZXBlbmRlbmN5IGZvciBmb2xrcyB3aG8ganVzdCB3YW50IHRvIGJ1aWxkIHRoZSBydW50aW1lIGFuZCBub3QKK3J1biB0aGUgdGVzdHMuICBUaGlzIG1lYW5zIHRoZSBoZWFkZXIgdGhyaWZ0L3N0ZGN4eC5oIGhhcyBiZWVuIHJlbW92ZWQgYW5kCithbnl0aGluZyB0aGF0IHJlbGllZCBvbiBpdCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGRpcmVjdGx5IHVzZSBDKysxMSBjb25jZXB0cy4KKworVEhSSUZULTQ3MzA6CitUaGUgY2xhc3NlcyBCb29zdFRocmVhZEZhY3RvcnksIFBvc2l4VGhyZWFkRmFjdG9yeSwgU3RkVGhyZWFkRmFjdG9yeSwgYW5kCitQbGF0Zm9ybVRocmVhZEZhY3RvcnkgaGF2ZSBiZWVuIHJlbW92ZWQsIGFuZCB3ZSB3aWxsIHVzZSBhIFRocmVhZEZhY3RvcnkKK2Jhc2VkIG9uIEMrKzExIChlc3NlbnRpYWxseSBTdGRUaHJlYWRGYWN0b3J5IHdhcyByZW5hbWVkIFRocmVhZEZhY3RvcnkpLgorCitUSFJJRlQtNDczMjoKK1RoZSBDTWFrZSBidWlsZCBvcHRpb25zIFdJVEhfU0hBUkVEX0xJQlMgYW5kIFdJVEhfU1RBVElDX0xJQlMgYXJlIGRlcHJlY2F0ZWQuCitUaGUgcHJvamVjdCBubyBsb25nZXIgcGVyZm9ybXMgYSBzaWRlLWJ5LXNpZGUgc3RhdGljIGFuZCBzaGFyZWQgYnVpbGQ7IHlvdQordGVsbCBDTWFrZSB0aHJvdWdoIEJVSUxEX1NIQVJFRF9MSUJTIHdoZXRoZXIgdG8gbWFrZSBzaGFyZWQgb3Igc3RhdGljCitsaWJyYXJpZXMgbm93LiAgVGhpcyBpcyBDTWFrZSBzdGFuZGFyZCBiZWhhdmlvci4KKworVEhSSUZULTQ3MzU6CitRdDQgc3VwcG9ydCB3YXMgcmVtb3ZlZC4KKworVEhSSUZULTQ3NjI6CitBZGRlZCBgY29uc3RgIHNwZWNpZmllciB0byBgVFRyYW5zcG9ydDo6Z2V0T3JpZ2luKClgLiBUaGlzIGNoYW5nZXMgaXRzIGZ1bmN0aW9uIHNpZ25hdHVyZS4KK0l0J3MgcmVjb21tZW5kZWQgdG8gYWRkIHRoZSBgb3ZlcnJpZGVgIHNwZWNpZmllciBpbiBpbXBsZW1lbnRhdGlvbnMgZGVyaXZlZCBmcm9tIGBUVHJhbnNwb3J0YC4KKworIyMgMC4xMS4wCisKK09sZGVyIHZlcnNpb25zIG9mIHRocmlmdCBkZXBlbmRlZCBvbiB0aGUgPGJvb3N0L3NtYXJ0X3B0ci5ocHA+IGNsYXNzZXMgd2hpY2gKK3dlcmUgdXNlZCBpbiB0aHJpZnQgaGVhZGVycyB0byBkZWZpbmUgaW50ZXJmYWNlcy4gIFRocmlmdCBub3cgZGV0ZWN0cyBDKysxMQorYXQgYnVpbGQgdGltZSBhbmQgd2lsbCBwcmVmZXIgdG8gdXNlIDxtZW1vcnk+IGNsYXNzZXMgZnJvbSBDKysxMSBpbnN0ZWFkLgorWW91IGNhbiBmb3JjZSB0aGUgbGlicmFyeSB0byBidWlsZCB3aXRoIGJvb3N0IG1lbW9yeSBjbGFzc2VzIGJ5IGRlZmluaW5nIHRoZQorcHJlcHJvY2Vzc29yIG1hY3JvIGBGT1JDRV9CT09TVF9TTUFSVF9QVFJgLiAgKFRIUklGVC0yMjIxKQorCitJbiB0aGUgcHRocmVhZCBtdXRleCBpbXBsZW1lbnRhdGlvbiwgdGhlIGNvbnRlbnRpb24gcHJvZmlsaW5nIGNvZGUgd2FzIGVuYWJsZWQKK2J5IGRlZmF1bHQgaW4gYWxsIGJ1aWxkcy4gIFRoaXMgY2hhbmdlZCB0byBiZSBkaXNhYmxlZCBieSBkZWZhdWx0LiAgKFRIUklGVC00MTUxKQorCitJbiBvbGRlciByZWxlYXNlcywgaWYgYSBUU1NMU29ja2V0RmFjdG9yeSdzIGxpZmV0aW1lIHdhcyBub3QgYXQgbGVhc3QgYXMgbG9uZworYXMgdGhlIFRTU0xTb2NrZXRzIGl0IGNyZWF0ZWQsIHdlIHNpbGVudGx5IHJldmVydGVkIG9wZW5zc2wgdG8gdW5zYWZlIG11bHRpdGhyZWFkIGJlaGF2aW9yCithbmQgc28gdGhlIHJlc3VsdHMgd2VyZSB1bmRlZmluZWQuICBDaGFuZ2VzIHdlcmUgbWFkZSBpbiAwLjExLjAgdGhhdCBjYXVzZSBlaXRoZXIgYW4KK2Fzc2VydGlvbiBvciBhIGNvcmUgaW5zdGVhZCBvZiB1bmRlZmluZWQgYmVoYXZpb3IuICBUaGUgbGlmZXRpbWUgb2YgYSBUU1NMU29ja2V0RmFjdG9yeQorKm11c3QqIGJlIGxvbmdlciB0aGFuIGFueSBUU1NMU29ja2V0IHRoYXQgaXQgY3JlYXRlcywgb3RoZXJ3aXNlIG9wZW5zc2wgd2lsbCBiZSBjbGVhbmVkCit1cCB0b28gZWFybHkuICBJZiB0aGUgc3RhdGljIGJvb2xlYW4gaXMgc2V0IHRvIGRpc2FibGUgb3BlbnNzbCBpbml0aWFsaXphdGlvbiBhbmQKK2NsZWFudXAgYW5kIGxlYXZlIGl0IHVwIHRvIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24sIHRoaXMgcmVxdWlyZW1lbnQgaXMgbm90IG5lZWRlZC4KKyhUSFJJRlQtNDE2NCkKKwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvaiBiL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2oKaW5kZXggYjRmMWM1MC4uZDEwOTdlYyAxMDA2NDQKLS0tIGEvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvagorKysgYi9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qCkBAIC0xLDQgKzEsNCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KICAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KICAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWctbXR8V2luMzIiPgpAQCAtMzYsNiArMzYsNyBAQAogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jQ2hhbm5lbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RNb25pdG9yLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RNdXRleC5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0VGhyZWFkRmFjdG9yeS5jcHAiIC8+CkBAIC00NywxMiArNDgsMTYgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRKU09OUHJvdG9jb2wuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRQcm90b2NvbC5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2ltcGxlU2VydmVyLmNwcCIvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUQ29ubmVjdGVkQ2xpZW50LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNlcnZlckZyYW1ld29yay5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCIvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUaHJpZnQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRPdXRwdXQuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUQnVmZmVyVHJhbnNwb3J0cy5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGRFRyYW5zcG9ydC5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cENsaWVudC5jcHAiIC8+CkBAIC03NSw2ICs4MCw3IEBACiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNDaGFubmVsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RUaHJlYWRGYWN0b3J5LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFN0ZFRocmVhZEZhY3RvcnkuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcRXhjZXB0aW9uLmgiIC8+CkBAIC05Myw2ICs5OSw3IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRocmlmdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUT3V0cHV0LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRQcm9jZXNzb3IuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRCdWZmZXJUcmFuc3BvcnRzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURkRUcmFuc3BvcnQuaCIgLz4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2ouZmlsdGVycyBiL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2ouZmlsdGVycwppbmRleCBlYzIxODg2Li41ZjY0Zjc4IDEwMDY0NAotLS0gYS9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qLmZpbHRlcnMKKysrIGIvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvai5maWx0ZXJzCkBAIC00LDcgKzQsNyBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIj4KICAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRocmlmdC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRPdXRwdXQuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFN0ZEFmeC5jcHAiPgogICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CkBAIC03Miw2ICs3Miw5IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY0NoYW5uZWwuY3BwIj4KICAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcUGVla1Byb2Nlc3Nvci5jcHAiPgogICAgICAgPEZpbHRlcj5wcm9jZXNzb3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KQEAgLTE3MCw2ICsxNzMsOSBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNDaGFubmVsLmgiPgogICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcUGVla1Byb2Nlc3Nvci5oIj4KICAgICAgIDxGaWx0ZXI+cHJvY2Vzc29yPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CmRpZmYgLS1naXQgYS9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ogYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2oKaW5kZXggMjU5YmIyMC4uOWE2ZmZlNiAxMDA3NTUKLS0tIGEvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qCisrKyBiL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvagpAQCAtMzUsMTYgKzM1LDIxIEBACiAgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCIvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAiLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5jcHAiLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBTZXJ2ZXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cENsaWVudENoYW5uZWwuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcY29uZmlnLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcZm9yY2VfaW5jLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcVGFyZ2V0VmVyc2lvbi5oIiAvPgpAQCAtMjkwLDQgKzI5NSw0IEBACiAgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CiAgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CiAgIDwvSW1wb3J0R3JvdXA+Ci08L1Byb2plY3Q+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qLmZpbHRlcnMgYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycwppbmRleCA1MjQ1NTQ0Li44NTcwM2RkIDEwMDY0NAotLS0gYS9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycworKysgYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycwpAQCAtMTAsNiArMTAsOSBAQAogICAgIDxGaWx0ZXIgSW5jbHVkZT0id2luZG93cyI+CiAgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NjBmYzllNWUtMDg2Ni00YWJhLTg2NjItNDM5YmI0YTQ2MWQzfTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InRyYW5zcG9ydCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MjNmZTJmZGUtYTdjOS00M2VjLWE0MDktN2Y1M2RmNWVlZTY0fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIj4KQEAgLTI3LDYgKzMwLDEyIEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU3RkQWZ4LmNwcCI+CiAgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuaCI+CkBAIC01Myw1ICs2MiwxNCBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGZvcmNlX2luYy5oIj4KICAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgogICA8L0l0ZW1Hcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKaW5kZXggMGRlNTM5MS4uY2QxYjNlNyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaApAQCAtNTcsNyArNTcsNyBAQAogICBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKICAgICA6IFRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKHR5cGUpIHt9CiAKLSAgdmlydHVhbCB+VEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorICB+VEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgbm9leGNlcHQgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgIC8qKgogICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgpAQCAtNjUsOSArNjUsOSBAQAogICAgKgogICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKICAgICovCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIHsgcmV0dXJuIHR5cGVfOyB9CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CiAKLSAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7CisgIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdCBvdmVycmlkZSB7CiAgICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKICAgICAgIHN3aXRjaCAodHlwZV8pIHsKICAgICAgIGNhc2UgVU5LTk9XTjoKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UQmFzZS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJlNzhlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQmFzZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RCQVNFX0hfCisjZGVmaW5lIF9USFJJRlRfVEJBU0VfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworY2xhc3MgVEJhc2UgeworcHVibGljOgorICB2aXJ0dWFsIH5UQmFzZSgpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KSA9IDA7CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGUocHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0ID0gMDsKK307Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEJBU0VfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaAppbmRleCBmZDFkY2U3Li5hZTUyMmIyIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oCkBAIC0zMywxNSArMzMsMTUgQEAKIHRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+CiBjbGFzcyBURGlzcGF0Y2hQcm9jZXNzb3JUIDogcHVibGljIFRQcm9jZXNzb3IgewogcHVibGljOgotICB2aXJ0dWFsIGJvb2wgcHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAotICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworICBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgb3ZlcnJpZGUgewogICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIGluUmF3ID0gaW4uZ2V0KCk7CiAgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogb3V0UmF3ID0gb3V0LmdldCgpOwogCiAgICAgLy8gVHJ5IHRvIGR5bmFtaWMgY2FzdCB0byB0aGUgdGVtcGxhdGUgcHJvdG9jb2wgdHlwZQotICAgIFByb3RvY29sXyogc3BlY2lmaWNJbiA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihpblJhdyk7Ci0gICAgUHJvdG9jb2xfKiBzcGVjaWZpY091dCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvdXRSYXcpOworICAgIGF1dG8qIHNwZWNpZmljSW4gPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4oaW5SYXcpOworICAgIGF1dG8qIHNwZWNpZmljT3V0ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG91dFJhdyk7CiAgICAgaWYgKHNwZWNpZmljSW4gJiYgc3BlY2lmaWNPdXQpIHsKICAgICAgIHJldHVybiBwcm9jZXNzRmFzdChzcGVjaWZpY0luLCBzcGVjaWZpY091dCwgY29ubmVjdGlvbkNvbnRleHQpOwogICAgIH0KQEAgLTEwNSw5ICsxMDUsOSBAQAogICovCiBjbGFzcyBURGlzcGF0Y2hQcm9jZXNzb3IgOiBwdWJsaWMgVFByb2Nlc3NvciB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CisgIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSBvdmVycmlkZSB7CiAgICAgc3RkOjpzdHJpbmcgZm5hbWU7CiAgICAgcHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsKICAgICBpbnQzMl90IHNlcWlkOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuY3BwCmluZGV4IDU3MzlkMGYuLjhkMTYzYTkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5jcHAKQEAgLTE4LDE2ICsxOCwxOCBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgogI2luY2x1ZGUgPGNzdHJpbmc+CiAjaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiAKLVRPdXRwdXQgR2xvYmFsT3V0cHV0OworVEhSSUZUX0VYUE9SVCBUT3V0cHV0IEdsb2JhbE91dHB1dDsKKworVE91dHB1dDo6VE91dHB1dCgpIDogZl8oJmVycm9yVGltZVdyYXBwZXIpIHt9CiAKIHZvaWQgVE91dHB1dDo6cHJpbnRmKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIC4uLikgewogI2lmbmRlZiBUSFJJRlRfU1FVRUxDSF9DT05TT0xFX09VVFBVVApAQCAtNjAsNyArNjIsNyBAQAogI2VuZGlmCiAKICAgY2hhciogaGVhcF9idWYgPSAoY2hhciopbWFsbG9jKChuZWVkICsgMSkgKiBzaXplb2YoY2hhcikpOwotICBpZiAoaGVhcF9idWYgPT0gTlVMTCkgeworICBpZiAoaGVhcF9idWYgPT0gbnVsbHB0cikgewogI2lmZGVmIF9NU0NfVkVSCiAgICAgdmFfc3RhcnQoYXAsIG1lc3NhZ2UpOwogICAgIHZzbnByaW50Zl9zKHN0YWNrX2J1ZiwgU1RBQ0tfQlVGX1NJWkUsIF9UUlVOQ0FURSwgbWVzc2FnZSwgYXApOwpAQCAtOTQsMTMgKzk2LDEzIEBACiB9CiAKIHZvaWQgVE91dHB1dDo6cGVycm9yKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGludCBlcnJub19jb3B5KSB7Ci0gIHN0ZDo6c3RyaW5nIG91dCA9IG1lc3NhZ2UgKyBzdHJlcnJvcl9zKGVycm5vX2NvcHkpOworICBzdGQ6OnN0cmluZyBvdXQgPSBtZXNzYWdlICsgc3RkOjpzdHJpbmcoIjogIikgKyBzdHJlcnJvcl9zKGVycm5vX2NvcHkpOwogICBmXyhvdXQuY19zdHIoKSk7CiB9CiAKIHN0ZDo6c3RyaW5nIFRPdXRwdXQ6OnN0cmVycm9yX3MoaW50IGVycm5vX2NvcHkpIHsKICNpZm5kZWYgSEFWRV9TVFJFUlJPUl9SCi0gIHJldHVybiAiZXJybm8gPSAiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4oZXJybm9fY29weSk7CisgIHJldHVybiAiZXJybm8gPSAiICsgdG9fc3RyaW5nKGVycm5vX2NvcHkpOwogI2Vsc2UgLy8gSEFWRV9TVFJFUlJPUl9SCiAKICAgY2hhciBiX2VycmJ1ZlsxMDI0XSA9IHsnXDAnfTsKQEAgLTExMiw3ICsxMTQsNyBAQAogICBpZiAocnYgPT0gLTEpIHsKICAgICAvLyBzdHJlcnJvcl9yIGZhaWxlZC4gIG9tZ3d0ZmJicS4KICAgICByZXR1cm4gIlhTSS1jb21wbGlhbnQgc3RyZXJyb3JfcigpIGZhaWxlZCB3aXRoIGVycm5vID0gIgotICAgICAgICAgICArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KGVycm5vX2NvcHkpOworICAgICAgICAgICArIHRvX3N0cmluZyhlcnJub19jb3B5KTsKICAgfQogI2VuZGlmCiAgIC8vIENhbiBhbnlvbmUgcHJvdmUgdGhhdCBleHBsaWNpdCBjYXN0IGlzIHByb2JhYmx5IG5vdCBuZWNlc3NhcnkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5oCmluZGV4IDEzNzVmNzMuLjI2YzlhNTYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuaApAQCAtMjAsMTIgKzIwLDE0IEBACiAjaWZuZGVmIF9USFJJRlRfT1VUUFVUX0hfCiAjZGVmaW5lIF9USFJJRlRfT1VUUFVUX0hfIDEKIAorI2luY2x1ZGUgPHRocmlmdC90aHJpZnRfZXhwb3J0Lmg+CisKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiAKIGNsYXNzIFRPdXRwdXQgewogcHVibGljOgotICBUT3V0cHV0KCkgOiBmXygmZXJyb3JUaW1lV3JhcHBlcikge30KKyAgVE91dHB1dCgpOwogCiAgIGlubGluZSB2b2lkIHNldE91dHB1dEZ1bmN0aW9uKHZvaWQgKCpmdW5jdGlvbikoY29uc3QgY2hhciopKSB7IGZfID0gZnVuY3Rpb247IH0KIApAQCAtNTEsNyArNTMsNyBAQAogICB2b2lkICgqZl8pKGNvbnN0IGNoYXIqKTsKIH07CiAKLWV4dGVybiBUT3V0cHV0IEdsb2JhbE91dHB1dDsKK1RIUklGVF9FWFBPUlQgZXh0ZXJuIFRPdXRwdXQgR2xvYmFsT3V0cHV0OwogfQogfSAvLyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQKIApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UUHJvY2Vzc29yLmgKaW5kZXggZDhmODZjNC4uNjViZjNkNCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RQcm9jZXNzb3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVFByb2Nlc3Nvci5oCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtMzYsNyArMzUsNyBAQAogICovCiBjbGFzcyBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKIHB1YmxpYzoKLSAgdmlydHVhbCB+VFByb2Nlc3NvckV2ZW50SGFuZGxlcigpIHt9CisgIHZpcnR1YWwgflRQcm9jZXNzb3JFdmVudEhhbmRsZXIoKSA9IGRlZmF1bHQ7CiAKICAgLyoqCiAgICAqIENhbGxlZCBiZWZvcmUgY2FsbGluZyBvdGhlciBjYWxsYmFjayBtZXRob2RzLgpAQCAtNDcsNyArNDYsNyBAQAogICB2aXJ0dWFsIHZvaWQqIGdldENvbnRleHQoY29uc3QgY2hhciogZm5fbmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgewogICAgICh2b2lkKWZuX25hbWU7CiAgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbnVsbHB0cjsKICAgfQogCiAgIC8qKgpAQCAtMTA5LDcgKzEwOCw3IEBACiAgIH0KIAogcHJvdGVjdGVkOgotICBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkge30KKyAgVFByb2Nlc3NvckV2ZW50SGFuZGxlcigpID0gZGVmYXVsdDsKIH07CiAKIC8qKgpAQCAtMTIwLDEwICsxMTksMTAgQEAKICAgVFByb2Nlc3NvckNvbnRleHRGcmVlcihUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKiBoYW5kbGVyLCB2b2lkKiBjb250ZXh0LCBjb25zdCBjaGFyKiBtZXRob2QpCiAgICAgOiBoYW5kbGVyXyhoYW5kbGVyKSwgY29udGV4dF8oY29udGV4dCksIG1ldGhvZF8obWV0aG9kKSB7fQogICB+VFByb2Nlc3NvckNvbnRleHRGcmVlcigpIHsKLSAgICBpZiAoaGFuZGxlcl8gIT0gTlVMTCkKKyAgICBpZiAoaGFuZGxlcl8gIT0gbnVsbHB0cikKICAgICAgIGhhbmRsZXJfLT5mcmVlQ29udGV4dChjb250ZXh0XywgbWV0aG9kXyk7CiAgIH0KLSAgdm9pZCB1bnJlZ2lzdGVyKCkgeyBoYW5kbGVyXyA9IE5VTEw7IH0KKyAgdm9pZCB1bnJlZ2lzdGVyKCkgeyBoYW5kbGVyXyA9IG51bGxwdHI7IH0KIAogcHJpdmF0ZToKICAgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JFdmVudEhhbmRsZXIqIGhhbmRsZXJfOwpAQCAtMTQwLDMwICsxMzksMzAgQEAKICAqLwogY2xhc3MgVFByb2Nlc3NvciB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgflRQcm9jZXNzb3IoKSB7fQorICB2aXJ0dWFsIH5UUHJvY2Vzc29yKCkgPSBkZWZhdWx0OwogCi0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpID0gMDsKIAotICBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGlvLCB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworICBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbywgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKICAgICByZXR1cm4gcHJvY2VzcyhpbywgaW8sIGNvbm5lY3Rpb25Db250ZXh0KTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIGV2ZW50SGFuZGxlcl87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIGV2ZW50SGFuZGxlcl87IH0KIAotICB2b2lkIHNldEV2ZW50SGFuZGxlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKKyAgdm9pZCBzZXRFdmVudEhhbmRsZXIoc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgewogICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CiAgIH0KIAogcHJvdGVjdGVkOgotICBUUHJvY2Vzc29yKCkge30KKyAgVFByb2Nlc3NvcigpID0gZGVmYXVsdDsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKIH07CiAKIC8qKgotICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBhbGxvdyBib29zdDo6c2hhcmVkX3B0ciB0byBiZSB1c2VkIHdpdGggaGFuZGxlcgorICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBhbGxvdyBzdGQ6OnNoYXJlZF9wdHIgdG8gYmUgdXNlZCB3aXRoIGhhbmRsZXIKICAqIHBvaW50ZXJzIHJldHVybmVkIGJ5IHRoZSBnZW5lcmF0ZWQgaGFuZGxlciBmYWN0b3JpZXMuCiAgKgogICogVGhlIGhhbmRsZXIgZmFjdG9yeSBjbGFzc2VzIGdlbmVyYXRlZCBieSB0aGUgdGhyaWZ0IGNvbXBpbGVyIHJldHVybiByYXcKQEAgLTE3Nyw3ICsxNzYsNyBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJGYWN0b3J5Xz4KIGNsYXNzIFJlbGVhc2VIYW5kbGVyIHsKIHB1YmxpYzoKLSAgUmVsZWFzZUhhbmRsZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8SGFuZGxlckZhY3RvcnlfPiYgaGFuZGxlckZhY3RvcnkpCisgIFJlbGVhc2VIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyRmFjdG9yeV8+JiBoYW5kbGVyRmFjdG9yeSkKICAgICA6IGhhbmRsZXJGYWN0b3J5XyhoYW5kbGVyRmFjdG9yeSkge30KIAogICB2b2lkIG9wZXJhdG9yKCkodHlwZW5hbWUgSGFuZGxlckZhY3RvcnlfOjpIYW5kbGVyKiBoYW5kbGVyKSB7CkBAIC0xODcsMjMgKzE4NiwyMyBAQAogICB9CiAKIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEhhbmRsZXJGYWN0b3J5Xz4gaGFuZGxlckZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlckZhY3RvcnlfPiBoYW5kbGVyRmFjdG9yeV87CiB9OwogCiBzdHJ1Y3QgVENvbm5lY3Rpb25JbmZvIHsKICAgLy8gVGhlIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2xzCi0gIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0OwotICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dDsKKyAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dDsKICAgLy8gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZWQgZm9yIHRoZSBjb25uZWN0aW9uCiAgIC8vIFRoaXMgaXMgdGhlIHRyYW5zcG9ydCB0aGF0IHdhcyByZXR1cm5lZCBieSBUU2VydmVyVHJhbnNwb3J0OjphY2NlcHQoKSwKICAgLy8gYW5kIGl0IG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgdHJhbnNwb3J0IHBvaW50ZWQgdG8gYnkgdGhlIGlucHV0IGFuZAogICAvLyBvdXRwdXQgcHJvdG9jb2xzLgotICBib29zdDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKyAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdHJhbnNwb3J0OwogfTsKIAogY2xhc3MgVFByb2Nlc3NvckZhY3RvcnkgewogcHVibGljOgotICB2aXJ0dWFsIH5UUHJvY2Vzc29yRmFjdG9yeSgpIHt9CisgIHZpcnR1YWwgflRQcm9jZXNzb3JGYWN0b3J5KCkgPSBkZWZhdWx0OwogCiAgIC8qKgogICAgKiBHZXQgdGhlIFRQcm9jZXNzb3IgdG8gdXNlIGZvciBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbi4KQEAgLTIxMiwxNyArMjExLDE3IEBACiAgICAqIGFjY2VwdGVkIG9uLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCB0aGlzIGNhbGwgZG9lcyBub3QgbmVlZCB0byBiZQogICAgKiB0aHJlYWQgc2FmZSwgYXMgaXQgd2lsbCBhbHdheXMgYmUgaW52b2tlZCBmcm9tIGEgc2luZ2xlIHRocmVhZC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGNvbnN0IFRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGNvbnN0IFRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsKIH07CiAKIGNsYXNzIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5IDogcHVibGljIFRQcm9jZXNzb3JGYWN0b3J5IHsKIHB1YmxpYzoKLSAgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKSA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSB7fQorICBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKSA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3Nvcihjb25zdCBUQ29ubmVjdGlvbkluZm8mKSB7IHJldHVybiBwcm9jZXNzb3JfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJikgb3ZlcnJpZGUgeyByZXR1cm4gcHJvY2Vzc29yXzsgfQogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKIH07CiB9CiB9IC8vIGFwYWNoZTo6dGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVFRvU3RyaW5nLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVFRvU3RyaW5nLmgKaW5kZXggNTAyMzg2OS4uMjU3ODBmOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RUb1N0cmluZy5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UVG9TdHJpbmcuaApAQCAtMjAsMjAgKzIwLDQ1IEBACiAjaWZuZGVmIF9USFJJRlRfVE9TVFJJTkdfSF8KICNkZWZpbmUgX1RIUklGVF9UT1NUUklOR19IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgotCi0jaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IFQmIHQpIHsKLSAgcmV0dXJuIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KHQpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgbyA8PCB0OworICByZXR1cm4gby5zdHIoKTsKK30KKworLy8gVE9ETzogcmVwbGFjZSB0aGUgY29tcHV0YXRpb25zIGJlbG93IHdpdGggc3RkOjpudW1lcmljX2xpbWl0czo6bWF4X2RpZ2l0czEwIG9uY2UgQysrMTEKKy8vIGlzIGVuYWJsZWQuCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IGZsb2F0JiB0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvLnByZWNpc2lvbihzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KHN0ZDo6Y2VpbChzdGF0aWNfY2FzdDxkb3VibGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpkaWdpdHMgKiBzdGQ6OmxvZzEwKDIuMGYpICsgMSkpKSk7CisgIG8gPDwgdDsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3QgZG91YmxlJiB0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvLnByZWNpc2lvbihzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KHN0ZDo6Y2VpbChzdGF0aWNfY2FzdDxkb3VibGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzICogc3RkOjpsb2cxMCgyLjBmKSArIDEpKSkpOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IGxvbmcgZG91YmxlJiB0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvLnByZWNpc2lvbihzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KHN0ZDo6Y2VpbChzdGF0aWNfY2FzdDxkb3VibGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+OjpkaWdpdHMgKiBzdGQ6OmxvZzEwKDIuMGYpICsgMSkpKSk7CisgIG8gPDwgdDsKKyAgcmV0dXJuIG8uc3RyKCk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RocmlmdC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RocmlmdC5oCmluZGV4IGU4ZTcwZWIuLjZjYjI0ZTYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVGhyaWZ0LmgKQEAgLTQyLDkgKzQyLDYgQEAKICNpbmNsdWRlIDxleGNlcHRpb24+CiAjaW5jbHVkZSA8dHlwZWluZm8+CiAKLSNpbmNsdWRlIDxib29zdC91dGlsaXR5L2VuYWJsZV9pZi5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfY29udmVydGlibGUuaHBwPgotCiAjaW5jbHVkZSA8dGhyaWZ0L1RMb2dnaW5nLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L1RPdXRwdXQuaD4KIApAQCAtODIsOSArNzksOSBAQAogCiAgIFRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogbWVzc2FnZV8obWVzc2FnZSkge30KIAotICB2aXJ0dWFsIH5URXhjZXB0aW9uKCkgdGhyb3coKSB7fQorICB+VEV4Y2VwdGlvbigpIG5vZXhjZXB0IG92ZXJyaWRlID0gZGVmYXVsdDsKIAotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKKyAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IG92ZXJyaWRlIHsKICAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgewogICAgICAgcmV0dXJuICJEZWZhdWx0IFRFeGNlcHRpb24uIjsKICAgICB9IGVsc2UgewpAQCAtMTAxLDE0ICs5OCwxNCBAQAogICB0ZW1wbGF0ZSA8Y2xhc3MgRT4KICAgc3RhdGljIFREZWxheWVkRXhjZXB0aW9uKiBkZWxheUV4Y2VwdGlvbihjb25zdCBFJiBlKTsKICAgdmlydHVhbCB2b2lkIHRocm93X2l0KCkgPSAwOwotICB2aXJ0dWFsIH5URGVsYXllZEV4Y2VwdGlvbigpe307CisgIHZpcnR1YWwgflREZWxheWVkRXhjZXB0aW9uKCkgPSBkZWZhdWx0OwogfTsKIAogdGVtcGxhdGUgPGNsYXNzIEU+CiBjbGFzcyBURXhjZXB0aW9uV3JhcHBlciA6IHB1YmxpYyBURGVsYXllZEV4Y2VwdGlvbiB7CiBwdWJsaWM6CiAgIFRFeGNlcHRpb25XcmFwcGVyKGNvbnN0IEUmIGUpIDogZV8oZSkge30KLSAgdmlydHVhbCB2b2lkIHRocm93X2l0KCkgeworICB2b2lkIHRocm93X2l0KCkgb3ZlcnJpZGUgewogICAgIEUgdGVtcChlXyk7CiAgICAgZGVsZXRlIHRoaXM7CiAgICAgdGhyb3cgdGVtcDsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaAppbmRleCAzYzk1N2E2Li5lM2MzNTk3IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oCkBAIC0yMCw5ICsyMCw3IEBACiAjaWZuZGVmIF9USFJJRlRfVEFTWU5DX0JVRkZFUl9QUk9DRVNTT1JfSF8KICNkZWZpbmUgX1RIUklGVF9UQVNZTkNfQlVGRkVSX1BST0NFU1NPUl9IXyAxCiAKLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CkBAIC0zNiwxMCArMzQsMTAgQEAKICAgLy8gZm9yY2VmdWxseSBjbG9zZSB0aGUgY29ubmVjdGlvbiAoaWYgYXBwbGljYWJsZSkuCiAgIC8vICJpbiIgYW5kICJvdXQiIHNob3VsZCBiZSBUTWVtb3J5QnVmZmVyIG9yIHNpbWlsYXIsCiAgIC8vIG5vdCBhIHdyYXBwZXIgYXJvdW5kIGEgc29ja2V0LgotICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gb2J1ZikgPSAwOwotICB2aXJ0dWFsIH5UQXN5bmNCdWZmZXJQcm9jZXNzb3IoKSB7fQorICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IGlidWYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBvYnVmKSA9IDA7CisgIHZpcnR1YWwgflRBc3luY0J1ZmZlclByb2Nlc3NvcigpID0gZGVmYXVsdDsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAKaW5kZXggNDcxNmFmMi4uMDFiOTExMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcApAQCAtMTgsNyArMTgsNiBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CkBAIC0yNyw4ICsyNiw4IEBACiB2b2lkIFRBc3luY0NoYW5uZWw6OnNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyKiByZWN2QnVmKSB7Ci0gIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoKT4gc2VuZF9kb25lCi0gICAgICA9IGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQoJlRBc3luY0NoYW5uZWw6OnJlY3ZNZXNzYWdlLCB0aGlzLCBjb2IsIHJlY3ZCdWYpOworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gc2VuZF9kb25lCisgICAgICA9IHN0ZDo6YmluZCgmVEFzeW5jQ2hhbm5lbDo6cmVjdk1lc3NhZ2UsIHRoaXMsIGNvYiwgcmVjdkJ1Zik7CiAKICAgc2VuZE1lc3NhZ2Uoc2VuZF9kb25lLCBzZW5kQnVmKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oCmluZGV4IGViM2NlMmEuLjIyY2YzODMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaApAQCAtMjAsNyArMjAsOCBAQAogI2lmbmRlZiBfVEhSSUZUX0FTWU5DX1RBU1lOQ0NIQU5ORUxfSF8KICNkZWZpbmUgX1RIUklGVF9BU1lOQ19UQVNZTkNDSEFOTkVMX0hfIDEKIAotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKQEAgLTM4LDkgKzM5LDkgQEAKIAogY2xhc3MgVEFzeW5jQ2hhbm5lbCB7CiBwdWJsaWM6Ci0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBWb2lkQ2FsbGJhY2s7CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IFZvaWRDYWxsYmFjazsKIAotICB2aXJ0dWFsIH5UQXN5bmNDaGFubmVsKCkge30KKyAgdmlydHVhbCB+VEFzeW5jQ2hhbm5lbCgpID0gZGVmYXVsdDsKIAogICAvLyBpcyB0aGUgY2hhbm5lbCBpbiBhIGdvb2Qgc3RhdGU/CiAgIHZpcnR1YWwgYm9vbCBnb29kKCkgY29uc3QgPSAwOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaAppbmRleCBlNzljNTdkLi4yYTY5NGFjIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaApAQCAtMzQsMTUgKzM0LDE1IEBACiB0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPgogY2xhc3MgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3JUIDogcHVibGljIFRBc3luY1Byb2Nlc3NvciB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBwcm9jZXNzKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgeworICB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgb3ZlcnJpZGUgewogICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIGluUmF3ID0gaW4uZ2V0KCk7CiAgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogb3V0UmF3ID0gb3V0LmdldCgpOwogCiAgICAgLy8gVHJ5IHRvIGR5bmFtaWMgY2FzdCB0byB0aGUgdGVtcGxhdGUgcHJvdG9jb2wgdHlwZQotICAgIFByb3RvY29sXyogc3BlY2lmaWNJbiA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihpblJhdyk7Ci0gICAgUHJvdG9jb2xfKiBzcGVjaWZpY091dCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvdXRSYXcpOworICAgIGF1dG8qIHNwZWNpZmljSW4gPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4oaW5SYXcpOworICAgIGF1dG8qIHNwZWNpZmljT3V0ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG91dFJhdyk7CiAgICAgaWYgKHNwZWNpZmljSW4gJiYgc3BlY2lmaWNPdXQpIHsKICAgICAgIHJldHVybiBwcm9jZXNzRmFzdChfcmV0dXJuLCBzcGVjaWZpY0luLCBzcGVjaWZpY091dCk7CiAgICAgfQpAQCAtNzAsNyArNzAsNyBAQAogICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGwoX3JldHVybiwgaW5SYXcsIG91dFJhdywgZm5hbWUsIHNlcWlkKTsKICAgfQogCi0gIHZvaWQgcHJvY2Vzc0Zhc3QoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICB2b2lkIHByb2Nlc3NGYXN0KHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAogICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogaW4sCiAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBvdXQpIHsKICAgICBzdGQ6OnN0cmluZyBmbmFtZTsKQEAgLTg3LDEzICs4NywxMyBAQAogICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGxUZW1wbGF0ZWQoX3JldHVybiwgaW4sIG91dCwgZm5hbWUsIHNlcWlkKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGwoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKKyAgdmlydHVhbCB2b2lkIGRpc3BhdGNoQ2FsbChzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IF9yZXR1cm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQpID0gMDsKIAotICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IF9yZXR1cm4sCisgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGxUZW1wbGF0ZWQoc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLApAQCAtMTA2LDkgKzEwNiw5IEBACiAgKi8KIGNsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIDogcHVibGljIFRBc3luY1Byb2Nlc3NvciB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBwcm9jZXNzKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgeworICB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgb3ZlcnJpZGUgewogICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIGluUmF3ID0gaW4uZ2V0KCk7CiAgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogb3V0UmF3ID0gb3V0LmdldCgpOwogCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICByZXR1cm4gZGlzcGF0Y2hDYWxsKF9yZXR1cm4sIGluUmF3LCBvdXRSYXcsIGZuYW1lLCBzZXFpZCk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IF9yZXR1cm4sCisgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGwoc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaAppbmRleCAwMzNmN2Q5Li4wMTkyMzM5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oCkBAIC0yMCw5ICsyMCw4IEBACiAjaWZuZGVmIF9USFJJRlRfVEFTWU5DUFJPQ0VTU09SX0hfCiAjZGVmaW5lIF9USFJJRlRfVEFTWU5DUFJPQ0VTU09SX0hfIDEKIAotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKQEAgLTM0LDQzICszMywzNCBAQAogICogdGhlIGNhbGwgdG8gcHJvY2VzcyByZXR1cm5zLiAgSW5zdGVhZCwgaXQgY2FsbHMgYSBjb2IgdG8gc2lnbmFsIGNvbXBsZXRpb24uCiAgKi8KIAotY2xhc3MgVEV2ZW50U2VydmVyOyAvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCi0KIGNsYXNzIFRBc3luY1Byb2Nlc3NvciB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgflRBc3luY1Byb2Nlc3NvcigpIHt9CisgIHZpcnR1YWwgflRBc3luY1Byb2Nlc3NvcigpID0gZGVmYXVsdDsKIAotICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpID0gMDsKKyAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgPSAwOwogCi0gIHZvaWQgcHJvY2VzcyhhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCi0gICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW8pIHsKKyAgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlvKSB7CiAgICAgcmV0dXJuIHByb2Nlc3MoX3JldHVybiwgaW8sIGlvKTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIGV2ZW50SGFuZGxlcl87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIGV2ZW50SGFuZGxlcl87IH0KIAotICB2b2lkIHNldEV2ZW50SGFuZGxlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKKyAgdm9pZCBzZXRFdmVudEhhbmRsZXIoc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgewogICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CiAgIH0KIAotICBjb25zdCBURXZlbnRTZXJ2ZXIqIGdldEFzeW5jU2VydmVyKCkgeyByZXR1cm4gYXN5bmNTZXJ2ZXJfOyB9Ci0KIHByb3RlY3RlZDoKLSAgVEFzeW5jUHJvY2Vzc29yKCkge30KKyAgVEFzeW5jUHJvY2Vzc29yKCkgPSBkZWZhdWx0OwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87Ci0gIGNvbnN0IFRFdmVudFNlcnZlciogYXN5bmNTZXJ2ZXJfOwotCi1wcml2YXRlOgotICBmcmllbmQgY2xhc3MgVEV2ZW50U2VydmVyOwotICB2b2lkIHNldEFzeW5jU2VydmVyKGNvbnN0IFRFdmVudFNlcnZlciogc2VydmVyKSB7IGFzeW5jU2VydmVyXyA9IHNlcnZlcjsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKIH07CiAKIGNsYXNzIFRBc3luY1Byb2Nlc3NvckZhY3RvcnkgewogcHVibGljOgotICB2aXJ0dWFsIH5UQXN5bmNQcm9jZXNzb3JGYWN0b3J5KCkge30KKyAgdmlydHVhbCB+VEFzeW5jUHJvY2Vzc29yRmFjdG9yeSgpID0gZGVmYXVsdDsKIAogICAvKioKICAgICogR2V0IHRoZSBUQXN5bmNQcm9jZXNzb3IgdG8gdXNlIGZvciBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbi4KQEAgLTc5LDE2ICs2OSwxNSBAQAogICAgKiBhY2NlcHRlZCBvbi4gIFRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgdGhpcyBjYWxsIGRvZXMgbm90IG5lZWQgdG8gYmUKICAgICogdGhyZWFkIHNhZmUsIGFzIGl0IHdpbGwgYWx3YXlzIGJlIGludm9rZWQgZnJvbSBhIHNpbmdsZSB0aHJlYWQuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGNvbnN0IFRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgPSAwOwogfTsKIH0KIH0KIH0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCiAKLS8vIFhYWCBJJ20gbGF6eSBmb3Igbm93CiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNQcm9jZXNzb3I7CisgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jUHJvY2Vzc29yOwogfQogfQogCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcAppbmRleCA1YTRmMzQ3Li5jYjUyMDFiIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKQEAgLTI2LDIzICsyNiwyMyBAQAogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgYXN5bmMgewogCi12b2lkIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpwcm9jZXNzKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IGlidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRCdWZmZXJCYXNlPiBvYnVmKSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaXByb3QocGZhY3RfLT5nZXRQcm90b2NvbChpYnVmKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3Byb3QocGZhY3RfLT5nZXRQcm90b2NvbChvYnVmKSk7Cit2b2lkIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IGlidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyQmFzZT4gb2J1ZikgeworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdChwZmFjdF8tPmdldFByb3RvY29sKGlidWYpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3Byb3QocGZhY3RfLT5nZXRQcm90b2NvbChvYnVmKSk7CiAgIHJldHVybiB1bmRlcmx5aW5nXwotICAgICAgLT5wcm9jZXNzKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQoJlRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpmaW5pc2gsCisgICAgICAtPnByb2Nlc3Moc3RkOjpiaW5kKCZUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcjo6ZmluaXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcm90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6cGxhY2Vob2xkZXJzOjpfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAogICAgICAgICAgICAgICAgIGlwcm90LAogICAgICAgICAgICAgICAgIG9wcm90KTsKIH0KIAogLyogc3RhdGljICovIHZvaWQgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OmZpbmlzaCgKLSAgICBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdCwKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdCwKICAgICBib29sIGhlYWx0aHkpIHsKICAgKHZvaWQpb3Byb3Q7CiAgIC8vIFRoaXMgaXMgYSBzdHViIGZ1bmN0aW9uIHRvIGhvbGQgYSByZWZlcmVuY2UgdG8gb3Byb3QuCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oCmluZGV4IDNmMmIzOTQuLmFjZTcyYjYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oCkBAIC0zMCwyMyArMzAsMjMgQEAKIAogY2xhc3MgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IgOiBwdWJsaWMgVEFzeW5jQnVmZmVyUHJvY2Vzc29yIHsKIHB1YmxpYzoKLSAgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IoYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB1bmRlcmx5aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0KQorICBUQXN5bmNQcm90b2NvbFByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB1bmRlcmx5aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdCkKICAgICA6IHVuZGVybHlpbmdfKHVuZGVybHlpbmcpLCBwZmFjdF8ocGZhY3QpIHt9CiAKLSAgdmlydHVhbCB2b2lkIHByb2Nlc3MoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gaWJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IG9idWYpOworICB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gaWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBvYnVmKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIH5UQXN5bmNQcm90b2NvbFByb2Nlc3NvcigpIHt9CisgIH5UQXN5bmNQcm90b2NvbFByb2Nlc3NvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAogcHJpdmF0ZToKLSAgc3RhdGljIHZvaWQgZmluaXNoKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvcHJvdCwKKyAgc3RhdGljIHZvaWQgZmluaXNoKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvcHJvdCwKICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVhbHRoeSk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB1bmRlcmx5aW5nXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHVuZGVybHlpbmdfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdF87CiB9OwogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwCmluZGV4IGM3ZTI3YzAuLjBkYWM1MjQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAKQEAgLTE3LDEwICsxNywxMSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgogI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKIApAQCAtNzUsNyArNzYsNyBAQAogICBNb25pdG9yUHRyIG1vbml0b3I7CiAgIHsKICAgICBHdWFyZCBzZXFpZEd1YXJkKHNlcWlkTXV0ZXhfKTsKLSAgICBNb25pdG9yTWFwOjppdGVyYXRvciBpID0gc2VxaWRUb01vbml0b3JNYXBfLmZpbmQocnNlcWlkKTsKKyAgICBhdXRvIGkgPSBzZXFpZFRvTW9uaXRvck1hcF8uZmluZChyc2VxaWQpOwogICAgIGlmKGkgPT0gc2VxaWRUb01vbml0b3JNYXBfLmVuZCgpKQogICAgICAgdGhyb3dCYWRTZXFJZF8oKTsKICAgICBtb25pdG9yID0gaS0+c2Vjb25kOwpAQCAtMTQwLDE1ICsxNDEsMTUgQEAKIHsKICAgd2FrZXVwU29tZW9uZV8gPSB0cnVlOwogICBzdG9wXyA9IHRydWU7Ci0gIGZvcihNb25pdG9yTWFwOjppdGVyYXRvciBpID0gc2VxaWRUb01vbml0b3JNYXBfLmJlZ2luKCk7IGkgIT0gc2VxaWRUb01vbml0b3JNYXBfLmVuZCgpOyArK2kpCi0gICAgaS0+c2Vjb25kLT5ub3RpZnkoKTsKKyAgZm9yKGF1dG8gJiBpIDogc2VxaWRUb01vbml0b3JNYXBfKQorICAgIGkuc2Vjb25kLT5ub3RpZnkoKTsKIH0KIAogVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6TW9uaXRvclB0cgogVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6bmV3TW9uaXRvcl8oY29uc3QgR3VhcmQgJikKIHsKICAgaWYoZnJlZU1vbml0b3JzXy5lbXB0eSgpKQotICAgIHJldHVybiBNb25pdG9yUHRyKG5ldyBNb25pdG9yKCZyZWFkTXV0ZXhfKSk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8TW9uaXRvcj4oJnJlYWRNdXRleF8pOwogICBNb25pdG9yUHRyIHJldHZhbDsKICAgLy9zd2FwcGluZyB0byBhdm9pZCBhbiBhdG9taWMgb3BlcmF0aW9uCiAgIHJldHZhbC5zd2FwKGZyZWVNb25pdG9yc18uYmFjaygpKTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oCmluZGV4IDg5OTdhMjMuLjBiYzVlYjUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaApAQCAtMjIsODEgKzIyLDgwIEBACiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8bWFwPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKIAogY2xhc3MgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzsKIAotY2xhc3MgVENvbmN1cnJlbnRTZW5kU2VudHJ5Ci17CitjbGFzcyBUQ29uY3VycmVudFNlbmRTZW50cnkgewogcHVibGljOgotICBleHBsaWNpdCBUQ29uY3VycmVudFNlbmRTZW50cnkoVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyAqc3luYyk7CisgIGV4cGxpY2l0IFRDb25jdXJyZW50U2VuZFNlbnRyeShUQ29uY3VycmVudENsaWVudFN5bmNJbmZvKiBzeW5jKTsKICAgflRDb25jdXJyZW50U2VuZFNlbnRyeSgpOwogCiAgIHZvaWQgY29tbWl0KCk7CisKIHByaXZhdGU6Ci0gIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gJnN5bmNfOworICBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvJiBzeW5jXzsKICAgYm9vbCBjb21taXR0ZWRfOwogfTsKIAotY2xhc3MgVENvbmN1cnJlbnRSZWN2U2VudHJ5Ci17CitjbGFzcyBUQ29uY3VycmVudFJlY3ZTZW50cnkgewogcHVibGljOgotICBUQ29uY3VycmVudFJlY3ZTZW50cnkoVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyAqc3luYywgaW50MzJfdCBzZXFpZCk7CisgIFRDb25jdXJyZW50UmVjdlNlbnRyeShUQ29uY3VycmVudENsaWVudFN5bmNJbmZvKiBzeW5jLCBpbnQzMl90IHNlcWlkKTsKICAgflRDb25jdXJyZW50UmVjdlNlbnRyeSgpOwogCiAgIHZvaWQgY29tbWl0KCk7CisKIHByaXZhdGU6Ci0gIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gJnN5bmNfOworICBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvJiBzeW5jXzsKICAgaW50MzJfdCBzZXFpZF87CiAgIGJvb2wgY29tbWl0dGVkXzsKIH07CiAKLWNsYXNzIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8KLXsKLXByaXZhdGU6IC8vdHlwZWRlZnMKLSAgdHlwZWRlZiBib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I+IE1vbml0b3JQdHI7CitjbGFzcyBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvIHsKK3ByaXZhdGU6IC8vIHR5cGVkZWZzCisgIHR5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcj4gTW9uaXRvclB0cjsKICAgdHlwZWRlZiBzdGQ6Om1hcDxpbnQzMl90LCBNb25pdG9yUHRyPiBNb25pdG9yTWFwOworCiBwdWJsaWM6CiAgIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8oKTsKIAogICBpbnQzMl90IGdlbmVyYXRlU2VxSWQoKTsKIAotICBib29sIGdldFBlbmRpbmcoCi0gICAgc3RkOjpzdHJpbmcgJmZuYW1lLAotICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgJm10eXBlLAotICAgIGludDMyX3QgJnJzZXFpZCk7IC8qIHJlcXVpcmVzIHJlYWRNdXRleF8gKi8KKyAgYm9vbCBnZXRQZW5kaW5nKHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUmIG10eXBlLAorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgcnNlcWlkKTsgLyogcmVxdWlyZXMgcmVhZE11dGV4XyAqLwogCi0gIHZvaWQgdXBkYXRlUGVuZGluZygKLSAgICBjb25zdCBzdGQ6OnN0cmluZyAmZm5hbWUsCi0gICAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZSwKLSAgICBpbnQzMl90IHJzZXFpZCk7IC8qIHJlcXVpcmVzIHJlYWRNdXRleF8gKi8KKyAgdm9pZCB1cGRhdGVQZW5kaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJzZXFpZCk7IC8qIHJlcXVpcmVzIHJlYWRNdXRleF8gKi8KIAogICB2b2lkIHdhaXRGb3JXb3JrKGludDMyX3Qgc2VxaWQpOyAvKiByZXF1aXJlcyByZWFkTXV0ZXhfICovCiAKLSAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4ICZnZXRSZWFkTXV0ZXgoKSB7cmV0dXJuIHJlYWRNdXRleF87fQotICA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXggJmdldFdyaXRlTXV0ZXgoKSB7cmV0dXJuIHdyaXRlTXV0ZXhfO30KKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4JiBnZXRSZWFkTXV0ZXgoKSB7IHJldHVybiByZWFkTXV0ZXhfOyB9CisgIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleCYgZ2V0V3JpdGVNdXRleCgpIHsgcmV0dXJuIHdyaXRlTXV0ZXhfOyB9CiAKLXByaXZhdGU6IC8vY29uc3RhbnRzCi0gIGVudW0ge01PTklUT1JfQ0FDSEVfU0laRSA9IDEwfTsKLXByaXZhdGU6IC8vZnVuY3Rpb25zCitwcml2YXRlOiAvLyBjb25zdGFudHMKKyAgZW51bSB7IE1PTklUT1JfQ0FDSEVfU0laRSA9IDEwIH07CisKK3ByaXZhdGU6IC8vIGZ1bmN0aW9ucwogICBNb25pdG9yUHRyIG5ld01vbml0b3JfKAotICAgIGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCAmc2VxaWRHdWFyZCk7IC8qIHJlcXVpcmVzIHNlcWlkTXV0ZXhfICovCi0gIHZvaWQgZGVsZXRlTW9uaXRvcl8oCi0gICAgY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkICZzZXFpZEd1YXJkLAotICAgIE1vbml0b3JQdHIgJm0pOyAvKm5vZXhjZXB0Ki8gLyogcmVxdWlyZXMgc2VxaWRNdXRleF8gKi8KKyAgICAgIGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCYgc2VxaWRHdWFyZCk7IC8qIHJlcXVpcmVzIHNlcWlkTXV0ZXhfICovCisgIHZvaWQgZGVsZXRlTW9uaXRvcl8oY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkJiBzZXFpZEd1YXJkLCBNb25pdG9yUHRyJiBtKTsKKyAgICAgIC8qbm9leGNlcHQqLyAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLwogICB2b2lkIHdha2V1cEFueW9uZV8oCi0gICAgY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkICZzZXFpZEd1YXJkKTsgLyogcmVxdWlyZXMgc2VxaWRNdXRleF8gKi8KLSAgdm9pZCBtYXJrQmFkXygKLSAgICBjb25zdCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQgJnNlcWlkR3VhcmQpOyAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLworICAgICAgY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkJiBzZXFpZEd1YXJkKTsgICAgICAgICAgIC8qIHJlcXVpcmVzIHNlcWlkTXV0ZXhfICovCisgIHZvaWQgbWFya0JhZF8oY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkJiBzZXFpZEd1YXJkKTsgLyogcmVxdWlyZXMgc2VxaWRNdXRleF8gKi8KICAgdm9pZCB0aHJvd0JhZFNlcUlkXygpOwogICB2b2lkIHRocm93RGVhZENvbm5lY3Rpb25fKCk7Ci1wcml2YXRlOiAvL2RhdGEgbWVtYmVycwogCitwcml2YXRlOiAvLyBkYXRhIG1lbWJlcnMKICAgdm9sYXRpbGUgYm9vbCBzdG9wXzsKIAogICA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXggc2VxaWRNdXRleF87CkBAIC0xMTcsMTEgKzExNiwxMSBAQAogICA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlUGVuZGluZ187CiAgIC8vIGVuZCByZWFkTXV0ZXhfIHByb3RlY3RlZCBtZW1iZXJzCiAKLQogICBmcmllbmQgY2xhc3MgVENvbmN1cnJlbnRTZW5kU2VudHJ5OwogICBmcmllbmQgY2xhc3MgVENvbmN1cnJlbnRSZWN2U2VudHJ5OwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKIAogI2VuZGlmIC8vIF9USFJJRlRfVENPTkNVUlJFTlRDTElFTlRTWU5DSU5GT19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKaW5kZXggMTI3OWJjNi4uNzY1NjU5NiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCkBAIC0zOCwxNyArMzgsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYikKLSAgOiBob3N0Xyhob3N0KSwgcGF0aF8ocGF0aCksIHJlY3ZCdWZfKE5VTEwpLCBjb25uXyhOVUxMKSB7Ci0gIGNvbm5fID0gZXZodHRwX2Nvbm5lY3Rpb25fbmV3KGFkZHJlc3MsIHBvcnQpOwotICBpZiAoY29ubl8gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZkbnNfYmFzZSogZG5zYmFzZSkKKworICA6IGhvc3RfKGhvc3QpLCBwYXRoXyhwYXRoKSwgY29ubl8obnVsbHB0cikgeworICBjb25uXyA9IGV2aHR0cF9jb25uZWN0aW9uX2Jhc2VfbmV3KGViLCBkbnNiYXNlLCBhZGRyZXNzLCBwb3J0KTsKKyAgaWYgKGNvbm5fID09IG51bGxwdHIpIHsKICAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfY29ubmVjdGlvbl9uZXcgZmFpbGVkIik7CiAgIH0KLSAgZXZodHRwX2Nvbm5lY3Rpb25fc2V0X2Jhc2UoY29ubl8sIGViKTsKIH0KIAogVEV2aHR0cENsaWVudENoYW5uZWw6On5URXZodHRwQ2xpZW50Q2hhbm5lbCgpIHsKLSAgaWYgKGNvbm5fICE9IE5VTEwpIHsKKyAgaWYgKGNvbm5fICE9IG51bGxwdHIpIHsKICAgICBldmh0dHBfY29ubmVjdGlvbl9mcmVlKGNvbm5fKTsKICAgfQogfQpAQCAtNTYsMTEgKzU3LDggQEAKIHZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWYpIHsKLSAgY29iXyA9IGNvYjsKLSAgcmVjdkJ1Zl8gPSByZWN2QnVmOwotCiAgIHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxID0gZXZodHRwX3JlcXVlc3RfbmV3KHJlc3BvbnNlLCB0aGlzKTsKLSAgaWYgKHJlcSA9PSBOVUxMKSB7CisgIGlmIChyZXEgPT0gbnVsbHB0cikgewogICAgIHRocm93IFRFeGNlcHRpb24oImV2aHR0cF9yZXF1ZXN0X25ldyBmYWlsZWQiKTsKICAgfQogCkBAIC04OCw2ICs4Niw4IEBACiAgIGlmIChydiAhPSAwKSB7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX21ha2VfcmVxdWVzdCBmYWlsZWQiKTsKICAgfQorCisgIGNvbXBsZXRpb25RdWV1ZV8ucHVzaChDb21wbGV0aW9uKGNvYiwgcmVjdkJ1ZikpOwogfQogCiB2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kTWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKQEAgLTEwNyw5ICsxMDcsMTIgQEAKIH0KIAogdm9pZCBURXZodHRwQ2xpZW50Q2hhbm5lbDo6ZmluaXNoKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKSB7Ci0gIGlmIChyZXEgPT0gTlVMTCkgeworICBhc3NlcnQoIWNvbXBsZXRpb25RdWV1ZV8uZW1wdHkoKSk7CisgIENvbXBsZXRpb24gY29tcGxldGlvbiA9IGNvbXBsZXRpb25RdWV1ZV8uZnJvbnQoKTsKKyAgY29tcGxldGlvblF1ZXVlXy5wb3AoKTsKKyAgaWYgKHJlcSA9PSBudWxscHRyKSB7CiAgICAgdHJ5IHsKLSAgICAgIGNvYl8oKTsKKyAgICAgIGNvbXBsZXRpb24uZmlyc3QoKTsKICAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiBlKSB7CiAgICAgICBpZiAoZS5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpCiAgICAgICAgIHRocm93IFRFeGNlcHRpb24oImNvbm5lY3QgZmFpbGVkIik7CkBAIC0xMTksNyArMTIyLDcgQEAKICAgICByZXR1cm47CiAgIH0gZWxzZSBpZiAocmVxLT5yZXNwb25zZV9jb2RlICE9IDIwMCkgewogICAgIHRyeSB7Ci0gICAgICBjb2JfKCk7CisgICAgICBjb21wbGV0aW9uLmZpcnN0KCk7CiAgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgewogICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAgICAgICBzcyA8PCAic2VydmVyIHJldHVybmVkIGNvZGUgIiA8PCByZXEtPnJlc3BvbnNlX2NvZGU7CkBAIC0xMzIsMTQgKzEzNSwxNCBAQAogICAgIH0KICAgICByZXR1cm47CiAgIH0KLSAgcmVjdkJ1Zl8tPnJlc2V0QnVmZmVyKEVWQlVGRkVSX0RBVEEocmVxLT5pbnB1dF9idWZmZXIpLAorICBjb21wbGV0aW9uLnNlY29uZC0+cmVzZXRCdWZmZXIoRVZCVUZGRVJfREFUQShyZXEtPmlucHV0X2J1ZmZlciksCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oRVZCVUZGRVJfTEVOR1RIKHJlcS0+aW5wdXRfYnVmZmVyKSkpOwotICBjb2JfKCk7CisgIGNvbXBsZXRpb24uZmlyc3QoKTsKICAgcmV0dXJuOwogfQogCiAvKiBzdGF0aWMgKi8gdm9pZCBURXZodHRwQ2xpZW50Q2hhbm5lbDo6cmVzcG9uc2Uoc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEsIHZvaWQqIGFyZykgewotICBURXZodHRwQ2xpZW50Q2hhbm5lbCogc2VsZiA9IChURXZodHRwQ2xpZW50Q2hhbm5lbCopYXJnOworICBhdXRvKiBzZWxmID0gKFRFdmh0dHBDbGllbnRDaGFubmVsKilhcmc7CiAgIHRyeSB7CiAgICAgc2VsZi0+ZmluaXNoKHJlcSk7CiAgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oCmluZGV4IDcyZWQ0MGYuLmY3NDI3MjYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oCkBAIC0yMCwxMSArMjAsMTQgQEAKICNpZm5kZWYgX1RIUklGVF9URVZIVFRQX0NMSUVOVF9DSEFOTkVMX0hfCiAjZGVmaW5lIF9USFJJRlRfVEVWSFRUUF9DTElFTlRfQ0hBTk5FTF9IXyAxCiAKKyNpbmNsdWRlIDxxdWV1ZT4KICNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaD4KIAogc3RydWN0IGV2ZW50X2Jhc2U7CitzdHJ1Y3QgZXZkbnNfYmFzZTsKIHN0cnVjdCBldmh0dHBfY29ubmVjdGlvbjsKIHN0cnVjdCBldmh0dHBfcmVxdWVzdDsKIApAQCAtNDgsMzIgKzUxLDM0IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV2ZW50X2Jhc2UqIGViKTsKLSAgflRFdmh0dHBDbGllbnRDaGFubmVsKCk7CisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV2ZG5zX2Jhc2UgKmRuc2Jhc2UgPSBudWxscHRyKTsKKyAgflRFdmh0dHBDbGllbnRDaGFubmVsKCkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIHNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgdm9pZCBzZW5kQW5kUmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogc2VuZEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgc2VuZE1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKTsKLSAgdmlydHVhbCB2b2lkIHJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSk7CisgIHZvaWQgc2VuZE1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKSBvdmVycmlkZTsKKyAgdm9pZCByZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpIG92ZXJyaWRlOwogCiAgIHZvaWQgZmluaXNoKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKTsKIAogICAvLyBYWFgKLSAgdmlydHVhbCBib29sIGdvb2QoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gIHZpcnR1YWwgYm9vbCBlcnJvcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCB0aW1lZE91dCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIGJvb2wgZ29vZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBlcnJvcigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisgIGJvb2wgdGltZWRPdXQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogCiBwcml2YXRlOgogICBzdGF0aWMgdm9pZCByZXNwb25zZShzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSwgdm9pZCogYXJnKTsKIAogICBzdGQ6OnN0cmluZyBob3N0XzsKICAgc3RkOjpzdHJpbmcgcGF0aF87Ci0gIFZvaWRDYWxsYmFjayBjb2JfOwotICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmXzsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8Vm9pZENhbGxiYWNrLCBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKj4gQ29tcGxldGlvbjsKKyAgdHlwZWRlZiBzdGQ6OnF1ZXVlPENvbXBsZXRpb24+IENvbXBsZXRpb25RdWV1ZTsKKyAgQ29tcGxldGlvblF1ZXVlIGNvbXBsZXRpb25RdWV1ZV87CiAgIHN0cnVjdCBldmh0dHBfY29ubmVjdGlvbiogY29ubl87CiB9OwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwCmluZGV4IDU3ZDBkNjEuLjdkMmNmMjEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAKQEAgLTIwLDEwICsyMCwxMCBAQAogI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8ZXZodHRwLmg+CiAjaW5jbHVkZSA8ZXZlbnQyL2J1ZmZlci5oPgogI2luY2x1ZGUgPGV2ZW50Mi9idWZmZXJfY29tcGF0Lmg+Ci0KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAogI2lmbmRlZiBIVFRQX0lOVEVSTkFMIC8vIGxpYmV2ZW50IDwgMgpAQCAtMzEsNiArMzEsNyBAQAogI2VuZGlmCiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CkBAIC0zOCwzMSArMzksMzEgQEAKIAogc3RydWN0IFRFdmh0dHBTZXJ2ZXI6OlJlcXVlc3RDb250ZXh0IHsKICAgc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXE7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IGlidWY7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG9idWY7CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBpYnVmOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gb2J1ZjsKIAogICBSZXF1ZXN0Q29udGV4dChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSk7CiB9OwogCi1URXZodHRwU2VydmVyOjpURXZodHRwU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yKQotICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwgZWJfKE5VTEwpLCBlaF8oTlVMTCkgeworVEV2aHR0cFNlcnZlcjo6VEV2aHR0cFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IpCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLCBlYl8obnVsbHB0ciksIGVoXyhudWxscHRyKSB7CiB9CiAKLVRFdmh0dHBTZXJ2ZXI6OlRFdmh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IsIGludCBwb3J0KQotICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwgZWJfKE5VTEwpLCBlaF8oTlVMTCkgeworVEV2aHR0cFNlcnZlcjo6VEV2aHR0cFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IsIGludCBwb3J0KQorICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwgZWJfKG51bGxwdHIpLCBlaF8obnVsbHB0cikgewogICAvLyBDcmVhdGUgZXZlbnRfYmFzZSBhbmQgZXZodHRwLgogICBlYl8gPSBldmVudF9iYXNlX25ldygpOwotICBpZiAoZWJfID09IE5VTEwpIHsKKyAgaWYgKGViXyA9PSBudWxscHRyKSB7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZlbnRfYmFzZV9uZXcgZmFpbGVkIik7CiAgIH0KICAgZWhfID0gZXZodHRwX25ldyhlYl8pOwotICBpZiAoZWhfID09IE5VTEwpIHsKKyAgaWYgKGVoXyA9PSBudWxscHRyKSB7CiAgICAgZXZlbnRfYmFzZV9mcmVlKGViXyk7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX25ldyBmYWlsZWQiKTsKICAgfQogCiAgIC8vIEJpbmQgdG8gcG9ydC4KLSAgaW50IHJldCA9IGV2aHR0cF9iaW5kX3NvY2tldChlaF8sIE5VTEwsIHBvcnQpOworICBpbnQgcmV0ID0gZXZodHRwX2JpbmRfc29ja2V0KGVoXywgbnVsbHB0ciwgcG9ydCk7CiAgIGlmIChyZXQgPCAwKSB7CiAgICAgZXZodHRwX2ZyZWUoZWhfKTsKICAgICBldmVudF9iYXNlX2ZyZWUoZWJfKTsKQEAgLTc2LDE2ICs3NywxNiBAQAogfQogCiBURXZodHRwU2VydmVyOjp+VEV2aHR0cFNlcnZlcigpIHsKLSAgaWYgKGVoXyAhPSBOVUxMKSB7CisgIGlmIChlaF8gIT0gbnVsbHB0cikgewogICAgIGV2aHR0cF9mcmVlKGVoXyk7CiAgIH0KLSAgaWYgKGViXyAhPSBOVUxMKSB7CisgIGlmIChlYl8gIT0gbnVsbHB0cikgewogICAgIGV2ZW50X2Jhc2VfZnJlZShlYl8pOwogICB9CiB9CiAKIGludCBURXZodHRwU2VydmVyOjpzZXJ2ZSgpIHsKLSAgaWYgKGViXyA9PSBOVUxMKSB7CisgIGlmIChlYl8gPT0gbnVsbHB0cikgewogICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2FsbCB0byBURXZodHRwU2VydmVyOjpzZXJ2ZSIpOwogICB9CiAgIHJldHVybiBldmVudF9iYXNlX2Rpc3BhdGNoKGViXyk7CkBAIC0xMDIsMjMgKzEwMywyMyBAQAogICB0cnkgewogICAgIHN0YXRpY19jYXN0PFRFdmh0dHBTZXJ2ZXIqPihzZWxmKS0+cHJvY2VzcyhyZXEpOwogICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgewotICAgIGV2aHR0cF9zZW5kX3JlcGx5KHJlcSwgSFRUUF9JTlRFUk5BTCwgZS53aGF0KCksIDApOworICAgIGV2aHR0cF9zZW5kX3JlcGx5KHJlcSwgSFRUUF9JTlRFUk5BTCwgZS53aGF0KCksIG51bGxwdHIpOwogICB9CiB9CiAKIHZvaWQgVEV2aHR0cFNlcnZlcjo6cHJvY2VzcyhzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSkgewotICBSZXF1ZXN0Q29udGV4dCogY3R4ID0gbmV3IFJlcXVlc3RDb250ZXh0KHJlcSk7Ci0gIHJldHVybiBwcm9jZXNzb3JfLT5wcm9jZXNzKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQoJlRFdmh0dHBTZXJ2ZXI6OmNvbXBsZXRlLAorICBhdXRvKiBjdHggPSBuZXcgUmVxdWVzdENvbnRleHQocmVxKTsKKyAgcmV0dXJuIHByb2Nlc3Nvcl8tPnByb2Nlc3Moc3RkOjpiaW5kKCZURXZodHRwU2VydmVyOjpjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmlidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+b2J1Zik7CiB9CiAKIHZvaWQgVEV2aHR0cFNlcnZlcjo6Y29tcGxldGUoUmVxdWVzdENvbnRleHQqIGN0eCwgYm9vbCBzdWNjZXNzKSB7CiAgICh2b2lkKXN1Y2Nlc3M7Ci0gIHN0ZDo6YXV0b19wdHI8UmVxdWVzdENvbnRleHQ+IHB0cihjdHgpOworICBzdGQ6OnVuaXF1ZV9wdHI8UmVxdWVzdENvbnRleHQ+IHB0cihjdHgpOwogCiAgIGludCBjb2RlID0gc3VjY2VzcyA/IDIwMCA6IDQwMDsKICAgY29uc3QgY2hhciogcmVhc29uID0gc3VjY2VzcyA/ICJPSyIgOiAiQmFkIFJlcXVlc3QiOwpAQCAtMTMwLDcgKzEzMSw3IEBACiAgIH0KIAogICBzdHJ1Y3QgZXZidWZmZXIqIGJ1ZiA9IGV2YnVmZmVyX25ldygpOwotICBpZiAoYnVmID09IE5VTEwpIHsKKyAgaWYgKGJ1ZiA9PSBudWxscHRyKSB7CiAgICAgLy8gVE9ETzogTG9nIGFuIGVycm9yLgogICAgIHN0ZDo6Y2VyciA8PCAiZXZidWZmZXJfbmV3IGZhaWxlZCAiIDw8IF9fRklMRV9fIDw8ICI6IiA8PCBfX0xJTkVfXyA8PCBzdGQ6OmVuZGw7CiAgIH0gZWxzZSB7CkBAIC0xNDYsNyArMTQ3LDcgQEAKICAgfQogCiAgIGV2aHR0cF9zZW5kX3JlcGx5KGN0eC0+cmVxLCBjb2RlLCByZWFzb24sIGJ1Zik7Ci0gIGlmIChidWYgIT0gTlVMTCkgeworICBpZiAoYnVmICE9IG51bGxwdHIpIHsKICAgICBldmJ1ZmZlcl9mcmVlKGJ1Zik7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oCmluZGV4IDg5YmYzMzcuLmM1YmYzYjYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaApAQCAtMjAsNyArMjAsNyBAQAogI2lmbmRlZiBfVEhSSUZUX1RFVkhUVFBfU0VSVkVSX0hfCiAjZGVmaW5lIF9USFJJRlRfVEVWSFRUUF9TRVJWRVJfSF8gMQogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBzdHJ1Y3QgZXZlbnRfYmFzZTsKIHN0cnVjdCBldmh0dHA7CkBAIC00MSwxNCArNDEsMTQgQEAKICAgICogYWRkcmVzcyBvZiB0aGUgc2VydmVyIGFzIHRoZSBleHRyYSBhcmcuCiAgICAqIERvIG5vdCBjYWxsICJzZXJ2ZSIgb24gdGhpcyBzZXJ2ZXIuCiAgICAqLwotICBURXZodHRwU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yKTsKKyAgVEV2aHR0cFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IpOwogCiAgIC8qKgogICAgKiBDcmVhdGUgYSBURXZodHRwU2VydmVyIHdpdGggYW4gZW1iZWRkZWQgZXZlbnRfYmFzZSBhbmQgZXZodHRwLAogICAgKiBsaXN0ZW5pbmcgb24gcG9ydCBhbmQgcmVzcG9uZGluZyBvbiB0aGUgZW5kcG9pbnQgIi8iLgogICAgKiBDYWxsICJzZXJ2ZSIgb24gdGhpcyBzZXJ2ZXIgdG8gc2VydmUgZm9yZXZlci4KICAgICovCi0gIFRFdmh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IsIGludCBwb3J0KTsKKyAgVEV2aHR0cFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IsIGludCBwb3J0KTsKIAogICB+VEV2aHR0cFNlcnZlcigpOwogCkBAIC02Myw3ICs2Myw3IEBACiAgIHZvaWQgcHJvY2VzcyhzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSk7CiAgIHZvaWQgY29tcGxldGUoUmVxdWVzdENvbnRleHQqIGN0eCwgYm9vbCBzdWNjZXNzKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CiAgIHN0cnVjdCBldmVudF9iYXNlKiBlYl87CiAgIHN0cnVjdCBldmh0dHAqIGVoXzsKIH07CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNb25pdG9yLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE1vbml0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzI0ZDgyLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE1vbml0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcG9zaXhfdGltZS5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgewotbmFtZXNwYWNlIHRocmlmdCB7Ci1uYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIE1vbml0b3IgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIGJvb3N0IHRocmVhZCBsaWJyYXJ5Ci0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgTW9uaXRvcjo6SW1wbCA6IHB1YmxpYyBib29zdDo6Y29uZGl0aW9uX3ZhcmlhYmxlX2FueSB7Ci0KLXB1YmxpYzoKLSAgSW1wbCgpIDogb3duZWRNdXRleF8obmV3IE11dGV4KCkpLCBtdXRleF8oTlVMTCkgeyBpbml0KG93bmVkTXV0ZXhfLmdldCgpKTsgfQotCi0gIEltcGwoTXV0ZXgqIG11dGV4KSA6IG11dGV4XyhOVUxMKSB7IGluaXQobXV0ZXgpOyB9Ci0KLSAgSW1wbChNb25pdG9yKiBtb25pdG9yKSA6IG11dGV4XyhOVUxMKSB7IGluaXQoJihtb25pdG9yLT5tdXRleCgpKSk7IH0KLQotICBNdXRleCYgbXV0ZXgoKSB7IHJldHVybiAqbXV0ZXhfOyB9Ci0gIHZvaWQgbG9jaygpIHsgbXV0ZXgoKS5sb2NrKCk7IH0KLSAgdm9pZCB1bmxvY2soKSB7IG11dGV4KCkudW5sb2NrKCk7IH0KLQotICAvKioKLSAgICogRXhjZXB0aW9uLXRocm93aW5nIHZlcnNpb24gb2Ygd2FpdEZvclRpbWVSZWxhdGl2ZSgpLCBjYWxsZWQgc2ltcGx5Ci0gICAqIHdhaXQoaW50NjQpIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICBUaW1lb3V0IGlzIGluIG1pbGxpc2Vjb25kcy4KLSAgICoKLSAgICogSWYgdGhlIGNvbmRpdGlvbiBvY2N1cnMsICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgY2xlYW5seTsgb24gdGltZW91dCBvcgotICAgKiBlcnJvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgotICAgKi8KLSAgdm9pZCB3YWl0KGludDY0X3QgdGltZW91dF9tcykgewotICAgIGludCByZXN1bHQgPSB3YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXRfbXMpOwotICAgIGlmIChyZXN1bHQgPT0gVEhSSUZUX0VUSU1FRE9VVCkgewotICAgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKLSAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJNb25pdG9yOjp3YWl0KCkgZmFpbGVkIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBjb25kaXRpb24gdG8KLSAgICogb2NjdXIsIG9yIHdhaXRzIGZvcmV2ZXIgaWYgdGltZW91dF9tcyA9PSAwLgotICAgKgotICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgotICAgKi8KLSAgaW50IHdhaXRGb3JUaW1lUmVsYXRpdmUoaW50NjRfdCB0aW1lb3V0X21zKSB7Ci0gICAgaWYgKHRpbWVvdXRfbXMgPT0gMExMKSB7Ci0gICAgICByZXR1cm4gd2FpdEZvcmV2ZXIoKTsKLSAgICB9Ci0KLSAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBib29zdDo6dGltZWRfbXV0ZXgqIG11dGV4SW1wbAotICAgICAgICA9IHJlaW50ZXJwcmV0X2Nhc3Q8Ym9vc3Q6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKLSAgICBhc3NlcnQobXV0ZXhJbXBsKTsKLQotICAgIGJvb3N0Ojp0aW1lZF9tdXRleDo6c2NvcGVkX2xvY2sgbG9jaygqbXV0ZXhJbXBsLCBib29zdDo6YWRvcHRfbG9jayk7Ci0gICAgaW50IHJlcwotICAgICAgICA9IHRpbWVkX3dhaXQobG9jaywgYm9vc3Q6OmdldF9zeXN0ZW1fdGltZSgpICsgYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyh0aW1lb3V0X21zKSkKLSAgICAgICAgICAgICAgPyAwCi0gICAgICAgICAgICAgIDogVEhSSUZUX0VUSU1FRE9VVDsKLSAgICBsb2NrLnJlbGVhc2UoKTsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDLgotICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgotICAgKi8KLSAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgewotICAgIHN0cnVjdCB0aW1ldmFsIHRlbXA7Ci0gICAgdGVtcC50dl9zZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl9zZWMpOwotICAgIHRlbXAudHZfdXNlYyA9IHN0YXRpY19jYXN0PGxvbmc+KGFic3RpbWUtPnR2X25zZWMpIC8gMTAwMDsKLSAgICByZXR1cm4gd2FpdEZvclRpbWUoJnRlbXApOwotICB9Ci0KLSAgLyoqCi0gICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgdGltZXZhbC4KLSAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KLSAgICovCi0gIGludCB3YWl0Rm9yVGltZShjb25zdCBzdHJ1Y3QgdGltZXZhbCogYWJzdGltZSkgewotICAgIGFzc2VydChtdXRleF8pOwotICAgIGJvb3N0Ojp0aW1lZF9tdXRleCogbXV0ZXhJbXBsID0gc3RhdGljX2Nhc3Q8Ym9vc3Q6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKLSAgICBhc3NlcnQobXV0ZXhJbXBsKTsKLQotICAgIHN0cnVjdCB0aW1ldmFsIGN1cnJlbnR0aW1lOwotICAgIFV0aWw6OnRvVGltZXZhbChjdXJyZW50dGltZSwgVXRpbDo6Y3VycmVudFRpbWUoKSk7Ci0KLSAgICBsb25nIHR2X3NlYyA9IHN0YXRpY19jYXN0PGxvbmc+KGFic3RpbWUtPnR2X3NlYyAtIGN1cnJlbnR0aW1lLnR2X3NlYyk7Ci0gICAgbG9uZyB0dl91c2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfdXNlYyAtIGN1cnJlbnR0aW1lLnR2X3VzZWMpOwotICAgIGlmICh0dl9zZWMgPCAwKQotICAgICAgdHZfc2VjID0gMDsKLSAgICBpZiAodHZfdXNlYyA8IDApCi0gICAgICB0dl91c2VjID0gMDsKLQotICAgIGJvb3N0Ojp0aW1lZF9tdXRleDo6c2NvcGVkX2xvY2sgbG9jaygqbXV0ZXhJbXBsLCBib29zdDo6YWRvcHRfbG9jayk7Ci0gICAgaW50IHJlcyA9IHRpbWVkX3dhaXQobG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6Z2V0X3N5c3RlbV90aW1lKCkgKyBib29zdDo6cG9zaXhfdGltZTo6c2Vjb25kcyh0dl9zZWMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBib29zdDo6cG9zaXhfdGltZTo6bWljcm9zZWNvbmRzKHR2X3VzZWMpKQotICAgICAgICAgICAgICAgICAgPyAwCi0gICAgICAgICAgICAgICAgICA6IFRIUklGVF9FVElNRURPVVQ7Ci0gICAgbG9jay5yZWxlYXNlKCk7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIC8qKgotICAgKiBXYWl0cyBmb3JldmVyIHVudGlsIHRoZSBjb25kaXRpb24gb2NjdXJzLgotICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3Vycywgb3IgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAqLwotICBpbnQgd2FpdEZvcmV2ZXIoKSB7Ci0gICAgYXNzZXJ0KG11dGV4Xyk7Ci0gICAgYm9vc3Q6OnRpbWVkX211dGV4KiBtdXRleEltcGwKLSAgICAgICAgPSByZWludGVycHJldF9jYXN0PGJvb3N0Ojp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7Ci0gICAgYXNzZXJ0KG11dGV4SW1wbCk7Ci0KLSAgICBib29zdDo6dGltZWRfbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soKm11dGV4SW1wbCwgYm9vc3Q6OmFkb3B0X2xvY2spOwotICAgICgoYm9vc3Q6OmNvbmRpdGlvbl92YXJpYWJsZV9hbnkqKXRoaXMpLT53YWl0KGxvY2spOwotICAgIGxvY2sucmVsZWFzZSgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdm9pZCBub3RpZnkoKSB7IG5vdGlmeV9vbmUoKTsgfQotCi0gIHZvaWQgbm90aWZ5QWxsKCkgeyBub3RpZnlfYWxsKCk7IH0KLQotcHJpdmF0ZToKLSAgdm9pZCBpbml0KE11dGV4KiBtdXRleCkgeyBtdXRleF8gPSBtdXRleDsgfQotCi0gIGJvb3N0OjpzY29wZWRfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKLSAgTXV0ZXgqIG11dGV4XzsKLX07Ci0KLU1vbml0b3I6Ok1vbml0b3IoKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKCkpIHsKLX0KLU1vbml0b3I6Ok1vbml0b3IoTXV0ZXgqIG11dGV4KSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG11dGV4KSkgewotfQotTW9uaXRvcjo6TW9uaXRvcihNb25pdG9yKiBtb25pdG9yKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG1vbml0b3IpKSB7Ci19Ci0KLU1vbml0b3I6On5Nb25pdG9yKCkgewotICBkZWxldGUgaW1wbF87Ci19Ci0KLU11dGV4JiBNb25pdG9yOjptdXRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bXV0ZXgoKTsKLX0KLQotdm9pZCBNb25pdG9yOjpsb2NrKCkgY29uc3QgewotICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPmxvY2soKTsKLX0KLQotdm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7Ci0gIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+dW5sb2NrKCk7Ci19Ci0KLXZvaWQgTW9uaXRvcjo6d2FpdChpbnQ2NF90IHRpbWVvdXQpIGNvbnN0IHsKLSAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0KHRpbWVvdXQpOwotfQotCi1pbnQgTW9uaXRvcjo6d2FpdEZvclRpbWUoY29uc3QgVEhSSUZUX1RJTUVTUEVDKiBhYnN0aW1lKSBjb25zdCB7Ci0gIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JUaW1lKGFic3RpbWUpOwotfQotCi1pbnQgTW9uaXRvcjo6d2FpdEZvclRpbWUoY29uc3QgdGltZXZhbCogYWJzdGltZSkgY29uc3QgewotICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yVGltZShhYnN0aW1lKTsKLX0KLQotaW50IE1vbml0b3I6OndhaXRGb3JUaW1lUmVsYXRpdmUoaW50NjRfdCB0aW1lb3V0X21zKSBjb25zdCB7Ci0gIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JUaW1lUmVsYXRpdmUodGltZW91dF9tcyk7Ci19Ci0KLWludCBNb25pdG9yOjp3YWl0Rm9yZXZlcigpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvcmV2ZXIoKTsKLX0KLQotdm9pZCBNb25pdG9yOjpub3RpZnkoKSBjb25zdCB7Ci0gIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bm90aWZ5KCk7Ci19Ci0KLXZvaWQgTW9uaXRvcjo6bm90aWZ5QWxsKCkgY29uc3QgewotICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPm5vdGlmeUFsbCgpOwotfQotfQotfQotfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE11dGV4LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE11dGV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjYWRhYi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNdXRleC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgotCi0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KLSNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+Ci0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdGhyZWFkL211dGV4LmhwcD4KLSNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7Ci1uYW1lc3BhY2UgdGhyaWZ0IHsKLW5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgTXV0ZXggY2xhc3MgdXNpbmcgYm9vc3QgaW50ZXJwcm9jZXNzIG11dGV4Ci0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgTXV0ZXg6OmltcGwgOiBwdWJsaWMgYm9vc3Q6OnRpbWVkX211dGV4IHt9OwotCi1NdXRleDo6TXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbXBsXyhuZXcgTXV0ZXg6OmltcGwoKSkgewotICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGluaXQpOwotfQotCi12b2lkKiBNdXRleDo6Z2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy5nZXQoKTsKLX0KLQotdm9pZCBNdXRleDo6bG9jaygpIGNvbnN0IHsKLSAgaW1wbF8tPmxvY2soKTsKLX0KLQotYm9vbCBNdXRleDo6dHJ5bG9jaygpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT50cnlfbG9jaygpOwotfQotCi1ib29sIE11dGV4Ojp0aW1lZGxvY2soaW50NjRfdCBtcykgY29uc3QgewotICByZXR1cm4gaW1wbF8tPnRpbWVkX2xvY2soYm9vc3Q6OmdldF9zeXN0ZW1fdGltZSgpICsgYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyhtcykpOwotfQotCi12b2lkIE11dGV4Ojp1bmxvY2soKSBjb25zdCB7Ci0gIGltcGxfLT51bmxvY2soKTsKLX0KLQotdm9pZCBNdXRleDo6REVGQVVMVF9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKLSAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmcpOwotfQotfQotfQotfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Y2I2ZDYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KLQotI2lmIFVTRV9CT09TVF9USFJFQUQKLQotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+Ci0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotCi0jaW5jbHVkZSA8Ym9vc3Qvd2Vha19wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgewotbmFtZXNwYWNlIHRocmlmdCB7Ci1uYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIGJvb3N0Ojp3ZWFrX3B0cjsKLQotLyoqCi0gKiBUaGUgYm9vc3QgdGhyZWFkIGNsYXNzLgotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIEJvb3N0VGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci1wdWJsaWM6Ci0gIGVudW0gU1RBVEUgeyB1bmluaXRpYWxpemVkLCBzdGFydGluZywgc3RhcnRlZCwgc3RvcHBpbmcsIHN0b3BwZWQgfTsKLQotICBzdGF0aWMgdm9pZCogdGhyZWFkTWFpbih2b2lkKiBhcmcpOwotCi1wcml2YXRlOgotICBzdGQ6OmF1dG9fcHRyPGJvb3N0Ojp0aHJlYWQ+IHRocmVhZF87Ci0gIFNUQVRFIHN0YXRlXzsKLSAgd2Vha19wdHI8Qm9vc3RUaHJlYWQ+IHNlbGZfOwotICBib29sIGRldGFjaGVkXzsKLQotcHVibGljOgotICBCb29zdFRocmVhZChib29sIGRldGFjaGVkLCBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkKLSAgICA6IHN0YXRlXyh1bmluaXRpYWxpemVkKSwgZGV0YWNoZWRfKGRldGFjaGVkKSB7Ci0gICAgdGhpcy0+VGhyZWFkOjpydW5uYWJsZShydW5uYWJsZSk7Ci0gIH0KLQotICB+Qm9vc3RUaHJlYWQoKSB7Ci0gICAgaWYgKCFkZXRhY2hlZF8pIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGpvaW4oKTsKLSAgICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgICAvLyBXZSdyZSByZWFsbHkgaG9zZWQuCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzdGFydCgpIHsKLSAgICBpZiAoc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgcmVmZXJlbmNlCi0gICAgc2hhcmVkX3B0cjxCb29zdFRocmVhZD4qIHNlbGZSZWYgPSBuZXcgc2hhcmVkX3B0cjxCb29zdFRocmVhZD4oKTsKLSAgICAqc2VsZlJlZiA9IHNlbGZfLmxvY2soKTsKLQotICAgIHN0YXRlXyA9IHN0YXJ0aW5nOwotCi0gICAgdGhyZWFkXwotICAgICAgICA9IHN0ZDo6YXV0b19wdHI8Ym9vc3Q6OnRocmVhZD4obmV3IGJvb3N0Ojp0aHJlYWQoYm9vc3Q6OmJpbmQodGhyZWFkTWFpbiwgKHZvaWQqKXNlbGZSZWYpKSk7Ci0KLSAgICBpZiAoZGV0YWNoZWRfKQotICAgICAgdGhyZWFkXy0+ZGV0YWNoKCk7Ci0gIH0KLQotICB2b2lkIGpvaW4oKSB7Ci0gICAgaWYgKCFkZXRhY2hlZF8gJiYgc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHRocmVhZF8tPmpvaW4oKTsKLSAgICB9Ci0gIH0KLQotICBUaHJlYWQ6OmlkX3QgZ2V0SWQoKSB7IHJldHVybiB0aHJlYWRfLmdldCgpID8gdGhyZWFkXy0+Z2V0X2lkKCkgOiBib29zdDo6dGhyZWFkOjppZCgpOyB9Ci0KLSAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBUaHJlYWQ6OnJ1bm5hYmxlKCk7IH0KLQotICB2b2lkIHJ1bm5hYmxlKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IFRocmVhZDo6cnVubmFibGUodmFsdWUpOyB9Ci0KLSAgdm9pZCB3ZWFrUmVmKHNoYXJlZF9wdHI8Qm9vc3RUaHJlYWQ+IHNlbGYpIHsKLSAgICBhc3NlcnQoc2VsZi5nZXQoKSA9PSB0aGlzKTsKLSAgICBzZWxmXyA9IHdlYWtfcHRyPEJvb3N0VGhyZWFkPihzZWxmKTsKLSAgfQotfTsKLQotdm9pZCogQm9vc3RUaHJlYWQ6OnRocmVhZE1haW4odm9pZCogYXJnKSB7Ci0gIHNoYXJlZF9wdHI8Qm9vc3RUaHJlYWQ+IHRocmVhZCA9ICooc2hhcmVkX3B0cjxCb29zdFRocmVhZD4qKWFyZzsKLSAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8c2hhcmVkX3B0cjxCb29zdFRocmVhZD4qPihhcmcpOwotCi0gIGlmICghdGhyZWFkKSB7Ci0gICAgcmV0dXJuICh2b2lkKikwOwotICB9Ci0KLSAgaWYgKHRocmVhZC0+c3RhdGVfICE9IHN0YXJ0aW5nKSB7Ci0gICAgcmV0dXJuICh2b2lkKikwOwotICB9Ci0KLSAgdGhyZWFkLT5zdGF0ZV8gPSBzdGFydGVkOwotICB0aHJlYWQtPnJ1bm5hYmxlKCktPnJ1bigpOwotCi0gIGlmICh0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGluZyAmJiB0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGVkKSB7Ci0gICAgdGhyZWFkLT5zdGF0ZV8gPSBzdG9wcGluZzsKLSAgfQotICByZXR1cm4gKHZvaWQqKTA7Ci19Ci0KLS8qKgotICogUE9TSVggVGhyZWFkIGZhY3RvcnkgaW1wbGVtZW50YXRpb24KLSAqLwotY2xhc3MgQm9vc3RUaHJlYWRGYWN0b3J5OjpJbXBsIHsKLQotcHJpdmF0ZToKLSAgYm9vbCBkZXRhY2hlZF87Ci0KLXB1YmxpYzoKLSAgSW1wbChib29sIGRldGFjaGVkKSA6IGRldGFjaGVkXyhkZXRhY2hlZCkge30KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBQT1NJWCB0aHJlYWQgdG8gcnVuIHRoZSBydW5uYWJsZSBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIHJ1bm5hYmxlIEEgcnVubmFibGUgb2JqZWN0Ci0gICAqLwotICBzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7Ci0gICAgc2hhcmVkX3B0cjxCb29zdFRocmVhZD4gcmVzdWx0ID0gc2hhcmVkX3B0cjxCb29zdFRocmVhZD4obmV3IEJvb3N0VGhyZWFkKGRldGFjaGVkXywgcnVubmFibGUpKTsKLSAgICByZXN1bHQtPndlYWtSZWYocmVzdWx0KTsKLSAgICBydW5uYWJsZS0+dGhyZWFkKHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIGJvb2wgaXNEZXRhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIGRldGFjaGVkXzsgfQotCi0gIHZvaWQgc2V0RGV0YWNoZWQoYm9vbCB2YWx1ZSkgeyBkZXRhY2hlZF8gPSB2YWx1ZTsgfQotCi0gIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7IHJldHVybiBib29zdDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOyB9Ci19OwotCi1Cb29zdFRocmVhZEZhY3Rvcnk6OkJvb3N0VGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkKQotICA6IGltcGxfKG5ldyBCb29zdFRocmVhZEZhY3Rvcnk6OkltcGwoZGV0YWNoZWQpKSB7Ci19Ci0KLXNoYXJlZF9wdHI8VGhyZWFkPiBCb29zdFRocmVhZEZhY3Rvcnk6Om5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPm5ld1RocmVhZChydW5uYWJsZSk7Ci19Ci0KLWJvb2wgQm9vc3RUaHJlYWRGYWN0b3J5Ojppc0RldGFjaGVkKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPmlzRGV0YWNoZWQoKTsKLX0KLQotdm9pZCBCb29zdFRocmVhZEZhY3Rvcnk6OnNldERldGFjaGVkKGJvb2wgdmFsdWUpIHsKLSAgaW1wbF8tPnNldERldGFjaGVkKHZhbHVlKTsKLX0KLQotVGhyZWFkOjppZF90IEJvb3N0VGhyZWFkRmFjdG9yeTo6Z2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPmdldEN1cnJlbnRUaHJlYWRJZCgpOwotfQotfQotfQotfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vIFVTRV9CT09TVF9USFJFQUQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkMWE1Ni4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RUaHJlYWRGYWN0b3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9CT09TVFRIUkVBREZBQ1RPUllfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9CT09TVFRIUkVBREZBQ1RPUllfSF8gMQotCi0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgewotbmFtZXNwYWNlIHRocmlmdCB7Ci1uYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIEEgdGhyZWFkIGZhY3RvcnkgdG8gY3JlYXRlIHBvc2l4IHRocmVhZHMKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBCb29zdFRocmVhZEZhY3RvcnkgOiBwdWJsaWMgVGhyZWFkRmFjdG9yeSB7Ci0KLXB1YmxpYzoKLSAgLyoqCi0gICAqIEJvb3N0IHRocmVhZCBmYWN0b3J5LiAgQWxsIHRocmVhZHMgY3JlYXRlZCBieSBhIGZhY3RvcnkgYXJlIHJlZmVyZW5jZS1jb3VudGVkCi0gICAqIHZpYSBib29zdDo6c2hhcmVkX3B0ciBhbmQgYm9vc3Q6OndlYWtfcHRyLiAgVGhlIGZhY3RvcnkgZ3VhcmFudGVlcyB0aGF0IHRocmVhZHMgYW5kCi0gICAqIHRoZSBSdW5uYWJsZSB0YXNrcyB0aGV5IGhvc3Qgd2lsbCBiZSBwcm9wZXJseSBjbGVhbmVkIHVwIG9uY2UgdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZQotICAgKiB0byBib3RoIGlzIGdpdmVuIHVwLgotICAgKgotICAgKiBUaHJlYWRzIGFyZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBib29zdCBwb2xpY3ksIHByaW9yaXR5LCBzdGFjay1zaXplLiBBIGRldGFjaGFibGUgdGhyZWFkCi0gICAqIGlzIG5vdCBqb2luYWJsZS4KLSAgICoKLSAgICogQnkgZGVmYXVsdCB0aHJlYWRzIGFyZSBub3Qgam9pbmFibGUuCi0gICAqLwotCi0gIEJvb3N0VGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkID0gdHJ1ZSk7Ci0KLSAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0OwotCi0gIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKLSAgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBTZXRzIGRldGFjaGVkIG1vZGUgb2YgdGhyZWFkcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIHNldERldGFjaGVkKGJvb2wgZGV0YWNoZWQpOwotCi0gIC8qKgotICAgKiBHZXRzIGN1cnJlbnQgZGV0YWNoZWQgbW9kZQotICAgKi8KLSAgdmlydHVhbCBib29sIGlzRGV0YWNoZWQoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgY2xhc3MgSW1wbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbF87Ci19OwotfQotfQotfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9CT09TVFRIUkVBREZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaAppbmRleCA2NDM4ZmRhLi45NDdmYzlmIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oCkBAIC0zNSw3ICszNSw3IEBACiAKIGNsYXNzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7CiBwdWJsaWM6Ci0gIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHt9CisgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpID0gZGVmYXVsdDsKICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IFRFeGNlcHRpb24obWVzc2FnZSkge30KIH07CiAKQEAgLTUzLDcgKzUzLDcgQEAKIAogY2xhc3MgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24gewogcHVibGljOgotICBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigpIHt9CisgIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCkgPSBkZWZhdWx0OwogCiAgIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IFRFeGNlcHRpb24obWVzc2FnZSkge30KIH07CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oCmluZGV4IGI3NzY3OTQuLjQ2ODgzNDQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oCkBAIC0yMCw4ICsyMCw4IEBACiAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0gKICNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9GVU5DVElPTl9SVU5ORVJfSCAxCiAKLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CkBAIC00NCw3ICs0NCw3IEBACiAgKiAgQSogYSA9IG5ldyBBKCk7CiAgKiAgLy8gVG8gY3JlYXRlIGEgdGhyZWFkIHRoYXQgZXhlY3V0ZXMgYS5mb28oKSBldmVyeSAxMDAgbWlsbGlzZWNvbmRzOgogICogIGZhY3RvcnktPm5ld1RocmVhZChGdW5jdGlvblJ1bm5lcjo6Y3JlYXRlKAotICogICAgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZCgmQTo6Zm9vLCBhKSwgMTAwKSktPnN0YXJ0KCk7CisgKiAgICBzdGQ6OmJpbmQoJkE6OmZvbywgYSksIDEwMCkpLT5zdGFydCgpOwogICoKICAqLwogCkBAIC01MywyMCArNTMsMjAgQEAKICAgLy8gVGhpcyBpcyB0aGUgdHlwZSBvZiBjYWxsYmFjayAncHRocmVhZF9jcmVhdGUoKScgZXhwZWN0cy4KICAgdHlwZWRlZiB2b2lkKiAoKlB0aHJlYWRGdW5jUHRyKSh2b2lkKiBhcmcpOwogICAvLyBUaGlzIGEgZnVsbHktZ2VuZXJpYyB2b2lkKHZvaWQpIGNhbGxiYWNrIGZvciBjdXN0b20gYmluZGluZ3MuCi0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBWb2lkRnVuYzsKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gVm9pZEZ1bmM7CiAKLSAgdHlwZWRlZiBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjxib29sKCk+IEJvb2xGdW5jOworICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBCb29sRnVuYzsKIAogICAvKioKICAgICogU3ludGFjdGljIHN1Z2FyIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNyZWF0ZSBuZXcgRnVuY3Rpb25SdW5uZXIKICAgICogb2JqZWN0cyB3cmFwcGVkIGluIHNoYXJlZF9wdHIuCiAgICAqLwotICBzdGF0aWMgYm9vc3Q6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+IGNyZWF0ZShjb25zdCBWb2lkRnVuYyYgY29iKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPihuZXcgRnVuY3Rpb25SdW5uZXIoY29iKSk7CisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+IGNyZWF0ZShjb25zdCBWb2lkRnVuYyYgY29iKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGNvYikpOwogICB9CiAKLSAgc3RhdGljIGJvb3N0OjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPiBjcmVhdGUoUHRocmVhZEZ1bmNQdHIgZnVuYywgdm9pZCogYXJnKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPihuZXcgRnVuY3Rpb25SdW5uZXIoZnVuYywgYXJnKSk7CisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+IGNyZWF0ZShQdGhyZWFkRnVuY1B0ciBmdW5jLCB2b2lkKiBhcmcpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPihuZXcgRnVuY3Rpb25SdW5uZXIoZnVuYywgYXJnKSk7CiAgIH0KIAogcHJpdmF0ZToKQEAgLTgxLDEyICs4MSwxMiBAQAogICAgKiBleGVjdXRlIHRoZSBnaXZlbiBjYWxsYmFjay4gIE5vdGUgdGhhdCB0aGUgJ3ZvaWQqJyByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KICAgICovCiAgIEZ1bmN0aW9uUnVubmVyKFB0aHJlYWRGdW5jUHRyIGZ1bmMsIHZvaWQqIGFyZykKLSAgICA6IGZ1bmNfKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQocHRocmVhZF9mdW5jX3dyYXBwZXIsIGZ1bmMsIGFyZykpIHt9CisgICAgOiBmdW5jXyhzdGQ6OmJpbmQocHRocmVhZF9mdW5jX3dyYXBwZXIsIGZ1bmMsIGFyZykpLCBpbnRlcnZhbE1zXygtMSkge30KIAogICAvKioKICAgICogR2l2ZW4gYSBnZW5lcmljIGNhbGxiYWNrLCB0aGlzIEZ1bmN0aW9uUnVubmVyIHdpbGwgZXhlY3V0ZSBpdC4KICAgICovCi0gIEZ1bmN0aW9uUnVubmVyKGNvbnN0IFZvaWRGdW5jJiBjb2IpIDogZnVuY18oY29iKSB7fQorICBGdW5jdGlvblJ1bm5lcihjb25zdCBWb2lkRnVuYyYgY29iKSA6IGZ1bmNfKGNvYiksIGludGVydmFsTXNfKC0xKSB7fQogCiAgIC8qKgogICAgKiBHaXZlbiBhIGJvb2wgZm9vKC4uLikgdHlwZSBjYWxsYmFjaywgRnVuY3Rpb25SdW5uZXIgd2lsbCBleGVjdXRlCkBAIC05Niw3ICs5Niw3IEBACiAgICAqLwogICBGdW5jdGlvblJ1bm5lcihjb25zdCBCb29sRnVuYyYgY29iLCBpbnQgaW50ZXJ2YWxNcykgOiByZXBGdW5jXyhjb2IpLCBpbnRlcnZhbE1zXyhpbnRlcnZhbE1zKSB7fQogCi0gIHZvaWQgcnVuKCkgeworICB2b2lkIHJ1bigpIG92ZXJyaWRlIHsKICAgICBpZiAocmVwRnVuY18pIHsKICAgICAgIHdoaWxlIChyZXBGdW5jXygpKSB7CiAgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKGludGVydmFsTXNfICogMTAwMCk7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKaW5kZXggNWU3MTNjMC4uZGM5MmVmZCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcApAQCAtMTcsNDYgKzE3LDQxIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKwogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX3B0ci5ocHA+Ci0KICNpbmNsdWRlIDxhc3NlcnQuaD4KIAotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPG11dGV4PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAotdXNpbmcgYm9vc3Q6OnNjb3BlZF9wdHI7Ci0KIC8qKgotICogTW9uaXRvciBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgUE9TSVggcHRocmVhZCBsaWJyYXJ5CisgKiBNb25pdG9yIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBzdGQgdGhyZWFkIGxpYnJhcnkKICAqCiAgKiBAdmVyc2lvbiAkSWQ6JAogICovCiBjbGFzcyBNb25pdG9yOjpJbXBsIHsKIAogcHVibGljOgotICBJbXBsKCkgOiBvd25lZE11dGV4XyhuZXcgTXV0ZXgoKSksIG11dGV4XyhOVUxMKSwgY29uZEluaXRpYWxpemVkXyhmYWxzZSkgewotICAgIGluaXQob3duZWRNdXRleF8uZ2V0KCkpOworICBJbXBsKCkgOiBvd25lZE11dGV4XyhuZXcgTXV0ZXgoKSksIGNvbmRpdGlvblZhcmlhYmxlXygpLCBtdXRleF8obnVsbHB0cikgeyBpbml0KG93bmVkTXV0ZXhfLmdldCgpKTsgfQorCisgIEltcGwoTXV0ZXgqIG11dGV4KSA6IG93bmVkTXV0ZXhfKCksIGNvbmRpdGlvblZhcmlhYmxlXygpLCBtdXRleF8obnVsbHB0cikgeyBpbml0KG11dGV4KTsgfQorCisgIEltcGwoTW9uaXRvciogbW9uaXRvcikgOiBvd25lZE11dGV4XygpLCBjb25kaXRpb25WYXJpYWJsZV8oKSwgbXV0ZXhfKG51bGxwdHIpIHsKKyAgICBpbml0KCYobW9uaXRvci0+bXV0ZXgoKSkpOwogICB9CiAKLSAgSW1wbChNdXRleCogbXV0ZXgpIDogbXV0ZXhfKE5VTEwpLCBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7IGluaXQobXV0ZXgpOyB9Ci0KLSAgSW1wbChNb25pdG9yKiBtb25pdG9yKSA6IG11dGV4XyhOVUxMKSwgY29uZEluaXRpYWxpemVkXyhmYWxzZSkgeyBpbml0KCYobW9uaXRvci0+bXV0ZXgoKSkpOyB9Ci0KLSAgfkltcGwoKSB7IGNsZWFudXAoKTsgfQotCiAgIE11dGV4JiBtdXRleCgpIHsgcmV0dXJuICptdXRleF87IH0KLSAgdm9pZCBsb2NrKCkgeyBtdXRleCgpLmxvY2soKTsgfQotICB2b2lkIHVubG9jaygpIHsgbXV0ZXgoKS51bmxvY2soKTsgfQorICB2b2lkIGxvY2soKSB7IG11dGV4Xy0+bG9jaygpOyB9CisgIHZvaWQgdW5sb2NrKCkgeyBtdXRleF8tPnVubG9jaygpOyB9CiAKICAgLyoqCiAgICAqIEV4Y2VwdGlvbi10aHJvd2luZyB2ZXJzaW9uIG9mIHdhaXRGb3JUaW1lUmVsYXRpdmUoKSwgY2FsbGVkIHNpbXBseQpAQCAtNjUsMTA2ICs2MCw3OCBAQAogICAgKiBJZiB0aGUgY29uZGl0aW9uIG9jY3VycywgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBjbGVhbmx5OyBvbiB0aW1lb3V0IG9yCiAgICAqIGVycm9yIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAqLwotICB2b2lkIHdhaXQoaW50NjRfdCB0aW1lb3V0X21zKSBjb25zdCB7Ci0gICAgaW50IHJlc3VsdCA9IHdhaXRGb3JUaW1lUmVsYXRpdmUodGltZW91dF9tcyk7CisgIHZvaWQgd2FpdChjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzICZ0aW1lb3V0KSB7CisgICAgaW50IHJlc3VsdCA9IHdhaXRGb3JUaW1lUmVsYXRpdmUodGltZW91dCk7CiAgICAgaWYgKHJlc3VsdCA9PSBUSFJJRlRfRVRJTUVET1VUKSB7Ci0gICAgICAvLyBwdGhyZWFkX2NvbmRfdGltZWR3YWl0IGhhcyBiZWVuIG9ic2VydmVkIHRvIHJldHVybiBlYXJseSBvbgotICAgICAgLy8gdmFyaW91cyBwbGF0Zm9ybXMsIHNvIGNvbW1lbnQgb3V0IHRoaXMgYXNzZXJ0LgotICAgICAgLy8gYXNzZXJ0KFV0aWw6OmN1cnJlbnRUaW1lKCkgPj0gKG5vdyArIHRpbWVvdXQpKTsKICAgICAgIHRocm93IFRpbWVkT3V0RXhjZXB0aW9uKCk7CiAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gMCkgewotICAgICAgdGhyb3cgVEV4Y2VwdGlvbigicHRocmVhZF9jb25kX3dhaXQoKSBvciBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCkgZmFpbGVkIik7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKCJNb25pdG9yOjp3YWl0KCkgZmFpbGVkIik7CiAgICAgfQogICB9CiAKICAgLyoqCiAgICAqIFdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBjb25kaXRpb24gdG8KLSAgICogb2NjdXIsIG9yIHdhaXRzIGZvcmV2ZXIgaWYgdGltZW91dF9tcyA9PSAwLgorICAgKiBvY2N1ciwgb3Igd2FpdHMgZm9yZXZlciBpZiB0aW1lb3V0IGlzIHplcm8uCiAgICAqCiAgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCiAgICAqLwotICBpbnQgd2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0IHsKLSAgICBpZiAodGltZW91dF9tcyA9PSAwTEwpIHsKKyAgaW50IHdhaXRGb3JUaW1lUmVsYXRpdmUoY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyAmdGltZW91dCkgeworICAgIGlmICh0aW1lb3V0LmNvdW50KCkgPT0gMCkgewogICAgICAgcmV0dXJuIHdhaXRGb3JldmVyKCk7CiAgICAgfQogCi0gICAgc3RydWN0IFRIUklGVF9USU1FU1BFQyBhYnN0aW1lOwotICAgIFV0aWw6OnRvVGltZXNwZWMoYWJzdGltZSwgVXRpbDo6Y3VycmVudFRpbWUoKSArIHRpbWVvdXRfbXMpOwotICAgIHJldHVybiB3YWl0Rm9yVGltZSgmYWJzdGltZSk7CisgICAgYXNzZXJ0KG11dGV4Xyk7CisgICAgYXV0byogbXV0ZXhJbXBsID0gc3RhdGljX2Nhc3Q8c3RkOjp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7CisgICAgYXNzZXJ0KG11dGV4SW1wbCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6dGltZWRfbXV0ZXg+IGxvY2soKm11dGV4SW1wbCwgc3RkOjphZG9wdF9sb2NrKTsKKyAgICBib29sIHRpbWVkb3V0ID0gKGNvbmRpdGlvblZhcmlhYmxlXy53YWl0X2Zvcihsb2NrLCB0aW1lb3V0KQorICAgICAgICAgICAgICAgICAgICAgPT0gc3RkOjpjdl9zdGF0dXM6OnRpbWVvdXQpOworICAgIGxvY2sucmVsZWFzZSgpOworICAgIHJldHVybiAodGltZWRvdXQgPyBUSFJJRlRfRVRJTUVET1VUIDogMCk7CiAgIH0KIAogICAvKioKLSAgICogV2FpdHMgdW50aWwgdGhlIGFic29sdXRlIHRpbWUgc3BlY2lmaWVkIHVzaW5nIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMuCisgICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCBieSBhYnN0aW1lLgogICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgogICAgKi8KLSAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgY29uc3QgeworICBpbnQgd2FpdEZvclRpbWUoY29uc3Qgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jaz4mIGFic3RpbWUpIHsKICAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBwdGhyZWFkX211dGV4X3QqIG11dGV4SW1wbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8cHRocmVhZF9tdXRleF90Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKKyAgICBhdXRvKiBtdXRleEltcGwgPSBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKICAgICBhc3NlcnQobXV0ZXhJbXBsKTsKIAotICAgIC8vIFhYWCBOZWVkIHRvIGFzc2VydCB0aGF0IGNhbGxlciBvd25zIG11dGV4Ci0gICAgcmV0dXJuIHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJnB0aHJlYWRfY29uZF8sIG11dGV4SW1wbCwgYWJzdGltZSk7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnRpbWVkX211dGV4PiBsb2NrKCptdXRleEltcGwsIHN0ZDo6YWRvcHRfbG9jayk7CisgICAgYm9vbCB0aW1lZG91dCA9IChjb25kaXRpb25WYXJpYWJsZV8ud2FpdF91bnRpbChsb2NrLCBhYnN0aW1lKQorICAgICAgICAgICAgICAgICAgICAgPT0gc3RkOjpjdl9zdGF0dXM6OnRpbWVvdXQpOworICAgIGxvY2sucmVsZWFzZSgpOworICAgIHJldHVybiAodGltZWRvdXQgPyBUSFJJRlRfRVRJTUVET1VUIDogMCk7CiAgIH0KIAotICBpbnQgd2FpdEZvclRpbWUoY29uc3Qgc3RydWN0IHRpbWV2YWwqIGFic3RpbWUpIGNvbnN0IHsKLSAgICBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHRlbXA7Ci0gICAgdGVtcC50dl9zZWMgPSBhYnN0aW1lLT50dl9zZWM7Ci0gICAgdGVtcC50dl9uc2VjID0gYWJzdGltZS0+dHZfdXNlYyAqIDEwMDA7Ci0gICAgcmV0dXJuIHdhaXRGb3JUaW1lKCZ0ZW1wKTsKLSAgfQogICAvKioKICAgICogV2FpdHMgZm9yZXZlciB1bnRpbCB0aGUgY29uZGl0aW9uIG9jY3Vycy4KICAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgogICAgKi8KLSAgaW50IHdhaXRGb3JldmVyKCkgY29uc3QgeworICBpbnQgd2FpdEZvcmV2ZXIoKSB7CiAgICAgYXNzZXJ0KG11dGV4Xyk7Ci0gICAgcHRocmVhZF9tdXRleF90KiBtdXRleEltcGwgPSByZWludGVycHJldF9jYXN0PHB0aHJlYWRfbXV0ZXhfdCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7CisgICAgYXV0byogbXV0ZXhJbXBsID0gc3RhdGljX2Nhc3Q8c3RkOjp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7CiAgICAgYXNzZXJ0KG11dGV4SW1wbCk7Ci0gICAgcmV0dXJuIHB0aHJlYWRfY29uZF93YWl0KCZwdGhyZWFkX2NvbmRfLCBtdXRleEltcGwpOworCisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnRpbWVkX211dGV4PiBsb2NrKCptdXRleEltcGwsIHN0ZDo6YWRvcHRfbG9jayk7CisgICAgY29uZGl0aW9uVmFyaWFibGVfLndhaXQobG9jayk7CisgICAgbG9jay5yZWxlYXNlKCk7CisgICAgcmV0dXJuIDA7CiAgIH0KIAotICB2b2lkIG5vdGlmeSgpIHsKLSAgICAvLyBYWFggTmVlZCB0byBhc3NlcnQgdGhhdCBjYWxsZXIgb3ducyBtdXRleAotICAgIGludCBpcmV0ID0gcHRocmVhZF9jb25kX3NpZ25hbCgmcHRocmVhZF9jb25kXyk7Ci0gICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShpcmV0KTsKLSAgICBhc3NlcnQoaXJldCA9PSAwKTsKLSAgfQorICB2b2lkIG5vdGlmeSgpIHsgY29uZGl0aW9uVmFyaWFibGVfLm5vdGlmeV9vbmUoKTsgfQogCi0gIHZvaWQgbm90aWZ5QWxsKCkgewotICAgIC8vIFhYWCBOZWVkIHRvIGFzc2VydCB0aGF0IGNhbGxlciBvd25zIG11dGV4Ci0gICAgaW50IGlyZXQgPSBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZwdGhyZWFkX2NvbmRfKTsKLSAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGlyZXQpOwotICAgIGFzc2VydChpcmV0ID09IDApOwotICB9CisgIHZvaWQgbm90aWZ5QWxsKCkgeyBjb25kaXRpb25WYXJpYWJsZV8ubm90aWZ5X2FsbCgpOyB9CiAKIHByaXZhdGU6Ci0gIHZvaWQgaW5pdChNdXRleCogbXV0ZXgpIHsKLSAgICBtdXRleF8gPSBtdXRleDsKKyAgdm9pZCBpbml0KE11dGV4KiBtdXRleCkgeyBtdXRleF8gPSBtdXRleDsgfQogCi0gICAgaWYgKHB0aHJlYWRfY29uZF9pbml0KCZwdGhyZWFkX2NvbmRfLCBOVUxMKSA9PSAwKSB7Ci0gICAgICBjb25kSW5pdGlhbGl6ZWRfID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIWNvbmRJbml0aWFsaXplZF8pIHsKLSAgICAgIGNsZWFudXAoKTsKLSAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBjbGVhbnVwKCkgewotICAgIGlmIChjb25kSW5pdGlhbGl6ZWRfKSB7Ci0gICAgICBjb25kSW5pdGlhbGl6ZWRfID0gZmFsc2U7Ci0gICAgICBpbnQgaXJldCA9IHB0aHJlYWRfY29uZF9kZXN0cm95KCZwdGhyZWFkX2NvbmRfKTsKLSAgICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoaXJldCk7Ci0gICAgICBhc3NlcnQoaXJldCA9PSAwKTsKLSAgICB9Ci0gIH0KLQotICBzY29wZWRfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKKyAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKKyAgc3RkOjpjb25kaXRpb25fdmFyaWFibGVfYW55IGNvbmRpdGlvblZhcmlhYmxlXzsKICAgTXV0ZXgqIG11dGV4XzsKLQotICBtdXRhYmxlIHB0aHJlYWRfY29uZF90IHB0aHJlYWRfY29uZF87Ci0gIG11dGFibGUgYm9vbCBjb25kSW5pdGlhbGl6ZWRfOwogfTsKIAogTW9uaXRvcjo6TW9uaXRvcigpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwoKSkgewpAQCAtMTc5LDQzICsxNDYsMzkgQEAKIH0KIAogTXV0ZXgmIE1vbml0b3I6Om11dGV4KCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPm11dGV4KCk7CisgIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPm11dGV4KCk7CiB9CiAKIHZvaWQgTW9uaXRvcjo6bG9jaygpIGNvbnN0IHsKLSAgaW1wbF8tPmxvY2soKTsKKyAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5sb2NrKCk7CiB9CiAKIHZvaWQgTW9uaXRvcjo6dW5sb2NrKCkgY29uc3QgewotICBpbXBsXy0+dW5sb2NrKCk7CisgIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+dW5sb2NrKCk7CiB9CiAKLXZvaWQgTW9uaXRvcjo6d2FpdChpbnQ2NF90IHRpbWVvdXQpIGNvbnN0IHsKLSAgaW1wbF8tPndhaXQodGltZW91dCk7Cit2b2lkIE1vbml0b3I6OndhaXQoY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyAmdGltZW91dCkgY29uc3QgeworICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXQodGltZW91dCk7CiB9CiAKLWludCBNb25pdG9yOjp3YWl0Rm9yVGltZShjb25zdCBUSFJJRlRfVElNRVNQRUMqIGFic3RpbWUpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT53YWl0Rm9yVGltZShhYnN0aW1lKTsKK2ludCBNb25pdG9yOjp3YWl0Rm9yVGltZShjb25zdCBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrPiYgYWJzdGltZSkgY29uc3QgeworICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yVGltZShhYnN0aW1lKTsKIH0KIAotaW50IE1vbml0b3I6OndhaXRGb3JUaW1lKGNvbnN0IHRpbWV2YWwqIGFic3RpbWUpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT53YWl0Rm9yVGltZShhYnN0aW1lKTsKLX0KLQotaW50IE1vbml0b3I6OndhaXRGb3JUaW1lUmVsYXRpdmUoaW50NjRfdCB0aW1lb3V0X21zKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+d2FpdEZvclRpbWVSZWxhdGl2ZSh0aW1lb3V0X21zKTsKK2ludCBNb25pdG9yOjp3YWl0Rm9yVGltZVJlbGF0aXZlKGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgJnRpbWVvdXQpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvclRpbWVSZWxhdGl2ZSh0aW1lb3V0KTsKIH0KIAogaW50IE1vbml0b3I6OndhaXRGb3JldmVyKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPndhaXRGb3JldmVyKCk7CisgIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JldmVyKCk7CiB9CiAKIHZvaWQgTW9uaXRvcjo6bm90aWZ5KCkgY29uc3QgewotICBpbXBsXy0+bm90aWZ5KCk7CisgIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bm90aWZ5KCk7CiB9CiAKIHZvaWQgTW9uaXRvcjo6bm90aWZ5QWxsKCkgY29uc3QgewotICBpbXBsXy0+bm90aWZ5QWxsKCk7CisgIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bm90aWZ5QWxsKCk7CiB9CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaAppbmRleCA1NDcyZjg1Li5iMzkzOWNiIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmgKQEAgLTIwLDExICsyMCwxMCBAQAogI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01PTklUT1JfSF8KICNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9NT05JVE9SX0hfIDEKIAorI2luY2x1ZGUgPGNocm9ubz4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAKLSNpbmNsdWRlIDxib29zdC91dGlsaXR5LmhwcD4KLQogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CkBAIC02OSwyMyArNjgsMTkgQEAKIAogICAvKioKICAgICogV2FpdHMgYSBtYXhpbXVtIG9mIHRoZSBzcGVjaWZpZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBjb25kaXRpb24KLSAgICogdG8gb2NjdXIsIG9yIHdhaXRzIGZvcmV2ZXIgaWYgdGltZW91dF9tcyA9PSAwLgorICAgKiB0byBvY2N1ciwgb3Igd2FpdHMgZm9yZXZlciBpZiB0aW1lb3V0IGlzIHplcm8uCiAgICAqCiAgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCiAgICAqLwotICBpbnQgd2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0OworICBpbnQgd2FpdEZvclRpbWVSZWxhdGl2ZShjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzICZ0aW1lb3V0KSBjb25zdDsKKworICBpbnQgd2FpdEZvclRpbWVSZWxhdGl2ZSh1aW50NjRfdCB0aW1lb3V0X21zKSBjb25zdCB7IHJldHVybiB3YWl0Rm9yVGltZVJlbGF0aXZlKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHModGltZW91dF9tcykpOyB9CiAKICAgLyoqCi0gICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDLgorICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgYnkgYWJzdGltZS4KICAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KICAgICovCi0gIGludCB3YWl0Rm9yVGltZShjb25zdCBUSFJJRlRfVElNRVNQRUMqIGFic3RpbWUpIGNvbnN0OwotCi0gIC8qKgotICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IHRpbWV2YWwuCi0gICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCi0gICAqLwotICBpbnQgd2FpdEZvclRpbWUoY29uc3Qgc3RydWN0IHRpbWV2YWwqIGFic3RpbWUpIGNvbnN0OworICBpbnQgd2FpdEZvclRpbWUoY29uc3Qgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jaz4mIGFic3RpbWUpIGNvbnN0OwogCiAgIC8qKgogICAgKiBXYWl0cyBmb3JldmVyIHVudGlsIHRoZSBjb25kaXRpb24gb2NjdXJzLgpAQCAtOTUsMTIgKzkwLDE0IEBACiAKICAgLyoqCiAgICAqIEV4Y2VwdGlvbi10aHJvd2luZyB2ZXJzaW9uIG9mIHdhaXRGb3JUaW1lUmVsYXRpdmUoKSwgY2FsbGVkIHNpbXBseQotICAgKiB3YWl0KGludDY0KSBmb3IgaGlzdG9yaWNhbCByZWFzb25zLiAgVGltZW91dCBpcyBpbiBtaWxsaXNlY29uZHMuCisgICAqIHdhaXQoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcykgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4gIFRpbWVvdXQgaXMgaW4gbWlsbGlzZWNvbmRzLgogICAgKgotICAgKiBJZiB0aGUgY29uZGl0aW9uIG9jY3VycywgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBjbGVhbmx5OyBvbiB0aW1lb3V0IG9yCisgICAqIElmIHRoZSBjb25kaXRpb24gb2NjdXJzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgY2xlYW5seTsgb24gdGltZW91dCBvcgogICAgKiBlcnJvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAgKi8KLSAgdm9pZCB3YWl0KGludDY0X3QgdGltZW91dF9tcyA9IDBMTCkgY29uc3Q7CisgIHZvaWQgd2FpdChjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzICZ0aW1lb3V0KSBjb25zdDsKKworICB2b2lkIHdhaXQodWludDY0X3QgdGltZW91dF9tcyA9IDBVTEwpIGNvbnN0IHsgdGhpcy0+d2FpdChzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHRpbWVvdXRfbXMpKTsgfQogCiAgIC8qKiBXYWtlcyB1cCBvbmUgdGhyZWFkIHdhaXRpbmcgb24gdGhpcyBtb25pdG9yLiAqLwogICB2aXJ0dWFsIHZvaWQgbm90aWZ5KCkgY29uc3Q7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcAppbmRleCBkOTkyMWFhLi43NTgwMjgzIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAKQEAgLTE3LDE4NiArMTcsMjkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgotCi0jaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpZmRlZiBIQVZFX1BUSFJFQURfSAotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bXV0ZXg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgY29uY3VycmVuY3kgewogCi0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORwotCi1zdGF0aWMgc2lnX2F0b21pY190IG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZSA9IDA7Ci1zdGF0aWMgTXV0ZXhXYWl0Q2FsbGJhY2sgbXV0ZXhQcm9maWxpbmdDYWxsYmFjayA9IDA7Ci0KLXZvbGF0aWxlIHN0YXRpYyBzaWdfYXRvbWljX3QgbXV0ZXhQcm9maWxpbmdDb3VudGVyID0gMDsKLQotdm9pZCBlbmFibGVNdXRleFByb2ZpbGluZyhpbnQzMl90IHByb2ZpbGluZ1NhbXBsZVJhdGUsIE11dGV4V2FpdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gIG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZSA9IHByb2ZpbGluZ1NhbXBsZVJhdGU7Ci0gIG11dGV4UHJvZmlsaW5nQ2FsbGJhY2sgPSBjYWxsYmFjazsKLX0KLQotI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKSBpbnQ2NF90IF9sb2NrX3N0YXJ0VGltZSA9IG1heWJlR2V0UHJvZmlsaW5nU3RhcnRUaW1lKCk7Ci0KLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoX2xvY2tfc3RhcnRUaW1lID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGludDY0X3QgZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lVXNlYygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICgqbXV0ZXhQcm9maWxpbmdDYWxsYmFjaykodGhpcywgZW5kVGltZSAtIF9sb2NrX3N0YXJ0VGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByb2ZpbGVUaW1lXyA9IF9sb2NrX3N0YXJ0VGltZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChwcm9maWxlVGltZV8gPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcHJvZmlsZVRpbWVfID0gVXRpbDo6Y3VycmVudFRpbWVVc2VjKCkgLSBwcm9maWxlVGltZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGludDY0X3QgX3RlbXBfcHJvZmlsZVRpbWUgPSBwcm9maWxlVGltZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHByb2ZpbGVUaW1lXyA9IDA7Ci0KLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoX3RlbXBfcHJvZmlsZVRpbWUgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICgqbXV0ZXhQcm9maWxpbmdDYWxsYmFjaykodGhpcywgX3RlbXBfcHJvZmlsZVRpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotc3RhdGljIGlubGluZSBpbnQ2NF90IG1heWJlR2V0UHJvZmlsaW5nU3RhcnRUaW1lKCkgewotICBpZiAobXV0ZXhQcm9maWxpbmdTYW1wbGVSYXRlICYmIG11dGV4UHJvZmlsaW5nQ2FsbGJhY2spIHsKLSAgICAvLyBUaGlzIGJsb2NrIGlzIHVuc3luY2hyb25pemVkLCBidXQgc2hvdWxkIHByb2R1Y2UgYSByZWFzb25hYmxlIHNhbXBsaW5nCi0gICAgLy8gcmF0ZSBvbiBtb3N0IGFyY2hpdGVjdHVyZXMuICBUaGUgbWFpbiByYWNlIGNvbmRpdGlvbnMgYXJlIHRoZSBnYXAKLSAgICAvLyBiZXR3ZWVuIHRoZSBkZWNyZW1lbnQgYW5kIHRoZSB0ZXN0LCB0aGUgbm9uLWF0b21pY2l0eSBvZiBkZWNyZW1lbnQsIGFuZAotICAgIC8vIHBvdGVudGlhbCBjYWNoaW5nIG9mIGRpZmZlcmVudCB2YWx1ZXMgYXQgZGlmZmVyZW50IENQVXMuCi0gICAgLy8KLSAgICAvLyAtIGlmIHR3byBkZWNyZW1lbnRzIHJhY2UsIHRoZSBsaWtlbGllc3QgcmVzdWx0IGlzIHRoYXQgdGhlIGNvdW50ZXIKLSAgICAvLyAgICAgIGRlY3JlbWVudHMgc2xvd2x5IChwZXJoYXBzIG11Y2ggbW9yZSBzbG93bHkpIHRoYW4gaW50ZW5kZWQuCi0gICAgLy8KLSAgICAvLyAtIG1hbnkgdGhyZWFkcyBjb3VsZCBwb3RlbnRpYWxseSBkZWNyZW1lbnQgYmVmb3JlIHJlc2V0dGluZyB0aGUgY291bnRlcgotICAgIC8vICAgICAgdG8gaXRzIGxhcmdlIHZhbHVlLCBjYXVzaW5nIGVhY2ggYWRkaXRpb25hbCBpbmNvbWluZyB0aHJlYWQgdG8KLSAgICAvLyAgICAgIHByb2ZpbGUgZXZlcnkgY2FsbC4gIFRoaXMgc2l0dWF0aW9uIGlzIHVubGlrZWx5IHRvIHBlcnNpc3QgZm9yIGxvbmcKLSAgICAvLyAgICAgIGFzIHRoZSBjcml0aWNhbCBnYXAgaXMgcXVpdGUgc2hvcnQsIGJ1dCBwcm9maWxpbmcgY291bGQgYmUgYnVyc3R5LgotICAgIHNpZ19hdG9taWNfdCBsb2NhbFZhbHVlID0gLS1tdXRleFByb2ZpbGluZ0NvdW50ZXI7Ci0gICAgaWYgKGxvY2FsVmFsdWUgPD0gMCkgewotICAgICAgbXV0ZXhQcm9maWxpbmdDb3VudGVyID0gbXV0ZXhQcm9maWxpbmdTYW1wbGVSYXRlOwotICAgICAgcmV0dXJuIFV0aWw6OmN1cnJlbnRUaW1lVXNlYygpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0jZWxzZQotI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKQotI2RlZmluZSBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKQotI2RlZmluZSBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpCi0jZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCkKLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpCi0jZW5kaWYgLy8gVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCi0KIC8qKgotICogSW1wbGVtZW50YXRpb24gb2YgTXV0ZXggY2xhc3MgdXNpbmcgUE9TSVggbXV0ZXgKKyAqIEltcGxlbWVudGF0aW9uIG9mIE11dGV4IGNsYXNzIHVzaW5nIEMrKzExIHN0ZDo6dGltZWRfbXV0ZXgKKyAqCisgKiBNZXRob2RzIHRocm93IHN0ZDo6c3lzdGVtX2Vycm9yIG9uIGVycm9yLgogICoKICAqIEB2ZXJzaW9uICRJZDokCiAgKi8KLWNsYXNzIE11dGV4OjppbXBsIHsKLXB1YmxpYzoKLSAgaW1wbChJbml0aWFsaXplciBpbml0KSA6IGluaXRpYWxpemVkXyhmYWxzZSkgewotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKLSAgICBwcm9maWxlVGltZV8gPSAwOwotI2VuZGlmCi0gICAgaW5pdCgmcHRocmVhZF9tdXRleF8pOwotICAgIGluaXRpYWxpemVkXyA9IHRydWU7Ci0gIH0KK2NsYXNzIE11dGV4OjppbXBsIDogcHVibGljIHN0ZDo6dGltZWRfbXV0ZXgge307CiAKLSAgfmltcGwoKSB7Ci0gICAgaWYgKGluaXRpYWxpemVkXykgewotICAgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7Ci0gICAgICBpbnQgcmV0ID0gcHRocmVhZF9tdXRleF9kZXN0cm95KCZwdGhyZWFkX211dGV4Xyk7Ci0gICAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7Ci0gICAgICBhc3NlcnQocmV0ID09IDApOwotICAgIH0KLSAgfQotCi0gIHZvaWQgbG9jaygpIGNvbnN0IHsKLSAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJnB0aHJlYWRfbXV0ZXhfKTsKLSAgICBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpOwotICB9Ci0KLSAgYm9vbCB0cnlsb2NrKCkgY29uc3QgeyByZXR1cm4gKDAgPT0gcHRocmVhZF9tdXRleF90cnlsb2NrKCZwdGhyZWFkX211dGV4XykpOyB9Ci0KLSAgYm9vbCB0aW1lZGxvY2soaW50NjRfdCBtaWxsaXNlY29uZHMpIGNvbnN0IHsKLSNpZiBkZWZpbmVkKF9QT1NJWF9USU1FT1VUUykgJiYgX1BPU0lYX1RJTUVPVVRTID49IDIwMDExMkwKLSAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKLQotICAgIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgdHM7Ci0gICAgVXRpbDo6dG9UaW1lc3BlYyh0cywgbWlsbGlzZWNvbmRzICsgVXRpbDo6Y3VycmVudFRpbWUoKSk7Ci0gICAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKCZwdGhyZWFkX211dGV4XywgJnRzKTsKLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgIFBST0ZJTEVfTVVURVhfTE9DS0VEKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0jZWxzZQotICAgIC8qIE90aGVyd2lzZSBmb2xsb3cgc29sdXRpb24gdXNlZCBieSBNb25vIGZvciBBbmRyb2lkICovCi0gICAgc3RydWN0IFRIUklGVF9USU1FU1BFQyBzbGVlcHl0aW1lLCBub3csIHRvOwotCi0gICAgLyogVGhpcyBpcyBqdXN0IHRvIGF2b2lkIGEgY29tcGxldGVseSBidXN5IHdhaXQgKi8KLSAgICBzbGVlcHl0aW1lLnR2X3NlYyA9IDA7Ci0gICAgc2xlZXB5dGltZS50dl9uc2VjID0gMTAwMDAwMDBMOyAvKiAxMG1zICovCi0KLSAgICBVdGlsOjp0b1RpbWVzcGVjKHRvLCBtaWxsaXNlY29uZHMgKyBVdGlsOjpjdXJyZW50VGltZSgpKTsKLQotICAgIHdoaWxlICgodHJ5bG9jaygpKSA9PSBmYWxzZSkgewotICAgICAgVXRpbDo6dG9UaW1lc3BlYyhub3csIFV0aWw6OmN1cnJlbnRUaW1lKCkpOwotICAgICAgaWYgKG5vdy50dl9zZWMgPj0gdG8udHZfc2VjICYmIG5vdy50dl9uc2VjID49IHRvLnR2X25zZWMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgbmFub3NsZWVwKCZzbGVlcHl0aW1lLCBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotICB9Ci0KLSAgdm9pZCB1bmxvY2soKSBjb25zdCB7Ci0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcHRocmVhZF9tdXRleF8pOwotICAgIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKTsKLSAgfQotCi0gIHZvaWQqIGdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeyByZXR1cm4gKHZvaWQqKSZwdGhyZWFkX211dGV4XzsgfQotCi1wcml2YXRlOgotICBtdXRhYmxlIHB0aHJlYWRfbXV0ZXhfdCBwdGhyZWFkX211dGV4XzsKLSAgbXV0YWJsZSBib29sIGluaXRpYWxpemVkXzsKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCi0gIG11dGFibGUgaW50NjRfdCBwcm9maWxlVGltZV87Ci0jZW5kaWYKLX07Ci0KLU11dGV4OjpNdXRleChJbml0aWFsaXplciBpbml0KSA6IGltcGxfKG5ldyBNdXRleDo6aW1wbChpbml0KSkgeworTXV0ZXg6Ok11dGV4KCkgOiBpbXBsXyhuZXcgTXV0ZXg6OmltcGwoKSkgewogfQogCiB2b2lkKiBNdXRleDo6Z2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+Z2V0VW5kZXJseWluZ0ltcGwoKTsKKyAgcmV0dXJuIGltcGxfLmdldCgpOwogfQogCiB2b2lkIE11dGV4Ojpsb2NrKCkgY29uc3QgewpAQCAtMjA0LDE3MSArNDcsMTcgQEAKIH0KIAogYm9vbCBNdXRleDo6dHJ5bG9jaygpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT50cnlsb2NrKCk7CisgIHJldHVybiBpbXBsXy0+dHJ5X2xvY2soKTsKIH0KIAogYm9vbCBNdXRleDo6dGltZWRsb2NrKGludDY0X3QgbXMpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT50aW1lZGxvY2sobXMpOworICByZXR1cm4gaW1wbF8tPnRyeV9sb2NrX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKG1zKSk7CiB9CiAKIHZvaWQgTXV0ZXg6OnVubG9jaygpIGNvbnN0IHsKICAgaW1wbF8tPnVubG9jaygpOwogfQogCi12b2lkIE11dGV4OjpERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgewotICBwdGhyZWFkX211dGV4X3QqIHB0aHJlYWRfbXV0ZXggPSAocHRocmVhZF9tdXRleF90Kilhcmc7Ci0gIGludCByZXQgPSBwdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleCwgTlVMTCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSSUFCTEUocmV0KTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLX0KLQotI2lmIGRlZmluZWQoUFRIUkVBRF9BREFQVElWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHx8IGRlZmluZWQoUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlApCi1zdGF0aWMgdm9pZCBpbml0X3dpdGhfa2luZChwdGhyZWFkX211dGV4X3QqIG11dGV4LCBpbnQga2luZCkgewotICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4YXR0cjsKLSAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4YXR0cik7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0KLSAgLy8gQXBwYXJlbnRseSwgdGhpcyBjYW4gZmFpbC4gIFNob3VsZCB3ZSByZWFsbHkgYmUgYWJvcnRpbmc/Ci0gIHJldCA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4YXR0ciwga2luZCk7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0KLSAgcmV0ID0gcHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmbXV0ZXhhdHRyKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLQotICByZXQgPSBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleGF0dHIpOwotICBhc3NlcnQocmV0ID09IDApOwotICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKLXZvaWQgTXV0ZXg6OkFEQVBUSVZFX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgewotICAvLyBGcm9tIG15c3FsIHNvdXJjZTogbXlzeXMvbXlfdGhyX2luaXQuYwotICAvLyBTZXQgbXV0ZXggdHlwZSB0byAiZmFzdCIgYS5rLmEgImFkYXB0aXZlIgotICAvLwotICAvLyBJbiB0aGlzIGNhc2UgdGhlIHRocmVhZCBtYXkgc3RlYWwgdGhlIG11dGV4IGZyb20gc29tZSBvdGhlciB0aHJlYWQKLSAgLy8gdGhhdCBpcyB3YWl0aW5nIGZvciB0aGUgc2FtZSBtdXRleC4gVGhpcyB3aWxsIHNhdmUgdXMgc29tZQotICAvLyBjb250ZXh0IHN3aXRjaGVzIGJ1dCBtYXkgY2F1c2UgYSB0aHJlYWQgdG8gJ3N0YXJ2ZSBmb3JldmVyJyB3aGlsZQotICAvLyB3YWl0aW5nIGZvciB0aGUgbXV0ZXggKG5vdCBsaWtlbHkgaWYgdGhlIGNvZGUgd2l0aGluIHRoZSBtdXRleCBpcwotICAvLyBzaG9ydCkuCi0gIGluaXRfd2l0aF9raW5kKChwdGhyZWFkX211dGV4X3QqKWFyZywgUFRIUkVBRF9NVVRFWF9BREFQVElWRV9OUCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QCi12b2lkIE11dGV4OjpSRUNVUlNJVkVfSU5JVElBTElaRVIodm9pZCogYXJnKSB7Ci0gIGluaXRfd2l0aF9raW5kKChwdGhyZWFkX211dGV4X3QqKWFyZywgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlApOwotfQotI2VuZGlmCi0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgUmVhZFdyaXRlTXV0ZXggY2xhc3MgdXNpbmcgUE9TSVggcncgbG9jawotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFJlYWRXcml0ZU11dGV4OjppbXBsIHsKLXB1YmxpYzoKLSAgaW1wbCgpIDogaW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORwotICAgIHByb2ZpbGVUaW1lXyA9IDA7Ci0jZW5kaWYKLSAgICBpbnQgcmV0ID0gcHRocmVhZF9yd2xvY2tfaW5pdCgmcndfbG9ja18sIE5VTEwpOwotICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUocmV0KTsKLSAgICBhc3NlcnQocmV0ID09IDApOwotICAgIGluaXRpYWxpemVkXyA9IHRydWU7Ci0gIH0KLQotICB+aW1wbCgpIHsKLSAgICBpZiAoaW5pdGlhbGl6ZWRfKSB7Ci0gICAgICBpbml0aWFsaXplZF8gPSBmYWxzZTsKLSAgICAgIGludCByZXQgPSBwdGhyZWFkX3J3bG9ja19kZXN0cm95KCZyd19sb2NrXyk7Ci0gICAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7Ci0gICAgICBhc3NlcnQocmV0ID09IDApOwotICAgIH0KLSAgfQotCi0gIHZvaWQgYWNxdWlyZVJlYWQoKSBjb25zdCB7Ci0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7Ci0gICAgcHRocmVhZF9yd2xvY2tfcmRsb2NrKCZyd19sb2NrXyk7Ci0gICAgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCk7IC8vIG5vdCBleGNsdXNpdmUsIHNvIHVzZSBub3QtbG9ja2VkIHBhdGgKLSAgfQotCi0gIHZvaWQgYWNxdWlyZVdyaXRlKCkgY29uc3QgewotICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOwotICAgIHB0aHJlYWRfcndsb2NrX3dybG9jaygmcndfbG9ja18pOwotICAgIFBST0ZJTEVfTVVURVhfTE9DS0VEKCk7Ci0gIH0KLQotICBib29sIGF0dGVtcHRSZWFkKCkgY29uc3QgeyByZXR1cm4gIXB0aHJlYWRfcndsb2NrX3RyeXJkbG9jaygmcndfbG9ja18pOyB9Ci0KLSAgYm9vbCBhdHRlbXB0V3JpdGUoKSBjb25zdCB7IHJldHVybiAhcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKCZyd19sb2NrXyk7IH0KLQotICB2b2lkIHJlbGVhc2UoKSBjb25zdCB7Ci0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKTsKLSAgICBwdGhyZWFkX3J3bG9ja191bmxvY2soJnJ3X2xvY2tfKTsKLSAgICBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgbXV0YWJsZSBwdGhyZWFkX3J3bG9ja190IHJ3X2xvY2tfOwotICBtdXRhYmxlIGJvb2wgaW5pdGlhbGl6ZWRfOwotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKLSAgbXV0YWJsZSBpbnQ2NF90IHByb2ZpbGVUaW1lXzsKLSNlbmRpZgotfTsKLQotUmVhZFdyaXRlTXV0ZXg6OlJlYWRXcml0ZU11dGV4KCkgOiBpbXBsXyhuZXcgUmVhZFdyaXRlTXV0ZXg6OmltcGwoKSkgewotfQotCi12b2lkIFJlYWRXcml0ZU11dGV4OjphY3F1aXJlUmVhZCgpIGNvbnN0IHsKLSAgaW1wbF8tPmFjcXVpcmVSZWFkKCk7Ci19Ci0KLXZvaWQgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVXcml0ZSgpIGNvbnN0IHsKLSAgaW1wbF8tPmFjcXVpcmVXcml0ZSgpOwotfQotCi1ib29sIFJlYWRXcml0ZU11dGV4OjphdHRlbXB0UmVhZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5hdHRlbXB0UmVhZCgpOwotfQotCi1ib29sIFJlYWRXcml0ZU11dGV4OjphdHRlbXB0V3JpdGUoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+YXR0ZW1wdFdyaXRlKCk7Ci19Ci0KLXZvaWQgUmVhZFdyaXRlTXV0ZXg6OnJlbGVhc2UoKSBjb25zdCB7Ci0gIGltcGxfLT5yZWxlYXNlKCk7Ci19Ci0KLU5vU3RhcnZlUmVhZFdyaXRlTXV0ZXg6Ok5vU3RhcnZlUmVhZFdyaXRlTXV0ZXgoKSA6IHdyaXRlcldhaXRpbmdfKGZhbHNlKSB7Ci19Ci0KLXZvaWQgTm9TdGFydmVSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVJlYWQoKSBjb25zdCB7Ci0gIGlmICh3cml0ZXJXYWl0aW5nXykgewotICAgIC8vIHdyaXRlciBpcyB3YWl0aW5nLCBibG9jayBvbiB0aGUgd3JpdGVyJ3MgbXV0ZXggdW50aWwgaGUncyBkb25lIHdpdGggaXQKLSAgICBtdXRleF8ubG9jaygpOwotICAgIG11dGV4Xy51bmxvY2soKTsKLSAgfQotCi0gIFJlYWRXcml0ZU11dGV4OjphY3F1aXJlUmVhZCgpOwotfQotCi12b2lkIE5vU3RhcnZlUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVXcml0ZSgpIGNvbnN0IHsKLSAgLy8gaWYgd2UgY2FuIGFjcXVpcmUgdGhlIHJ3bG9jayB0aGUgZWFzeSB3YXksIHdlJ3JlIGRvbmUKLSAgaWYgKGF0dGVtcHRXcml0ZSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gZmFpbGVkIHRvIGdldCB0aGUgcndsb2NrLCBkbyBpdCB0aGUgaGFyZCB3YXk6Ci0gIC8vIGxvY2tpbmcgdGhlIG11dGV4IGFuZCBzZXR0aW5nIHdyaXRlcldhaXRpbmcgd2lsbCBjYXVzZSBhbGwgbmV3IHJlYWRlcnMgdG8KLSAgLy8gYmxvY2sgb24gdGhlIG11dGV4IHJhdGhlciB0aGFuIG9uIHRoZSByd2xvY2suCi0gIG11dGV4Xy5sb2NrKCk7Ci0gIHdyaXRlcldhaXRpbmdfID0gdHJ1ZTsKLSAgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVXcml0ZSgpOwotICB3cml0ZXJXYWl0aW5nXyA9IGZhbHNlOwotICBtdXRleF8udW5sb2NrKCk7Ci19CiB9CiB9CiB9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaAppbmRleCA2Zjg5MmRjLi4yN2UzODZlIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaApAQCAtMjAsMzggKzIwLDE3IEBACiAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTVVURVhfSF8KICNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9NVVRFWF9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgotI2luY2x1ZGUgPHN0ZGludC5oPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKLQogLyoqCi0gKiBEZXRlcm1pbmVzIGlmIHRoZSBUaHJpZnQgTXV0ZXggYW5kIFJlYWRXcml0ZU11dGV4IGNsYXNzZXMgd2lsbCBhdHRlbXB0IHRvCi0gKiBwcm9maWxlIHRoZWlyIGJsb2NraW5nIGFjcXVpcmUgbWV0aG9kcy4gSWYgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gbm9uLXplcm8sCi0gKiBUaHJpZnQgd2lsbCBhdHRlbXB0IHRvIGludm9rZSB0aGUgY2FsbGJhY2sgb25jZSBldmVyeSBwcm9maWxpbmdTYW1wbGVSYXRlCi0gKiB0aW1lcy4gIEhvd2V2ZXIsIGFzIHRoZSBzYW1wbGluZyBpcyBub3Qgc3luY2hyb25pemVkIHRoZSByYXRlIGlzIG5vdAotICogZ3VyYW5hdGVlZCwgYW5kIGNvdWxkIGJlIHN1YmplY3QgdG8gYmlnIGJ1cnN0cyBhbmQgc3dpbmdzLiAgUGxlYXNlIGVuc3VyZQotICogeW91ciBzYW1wbGluZyBjYWxsYmFjayBpcyBhcyBwZXJmb3JtYW50IGFzIHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZXMuCi0gKgotICogVGhlIGNhbGxiYWNrIHdpbGwgZ2V0IGNhbGxlZCB3aXRoIHRoZSB3YWl0IHRpbWUgdGFrZW4gdG8gbG9jayB0aGUgbXV0ZXggaW4KLSAqIHVzZWMgYW5kIGEgKHZvaWQqKSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIE11dGV4IChvciBSZWFkV3JpdGVNdXRleCkKLSAqIGJlaW5nIGxvY2tlZC4KLSAqCi0gKiBUaGUgZW5hYmxlTXV0ZXhQcm9maWxpbmcoKSBmdW5jdGlvbiBpcyB1bnN5bmNocm9uaXplZDsgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCi0gKiB3aGlsZSBwcm9maWxpbmcgaXMgYWxyZWFkeSBlbmFibGVkIG1heSByZXN1bHQgaW4gcmFjZSBjb25kaXRpb25zLiAgT24KLSAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgYSBwb2ludGVyIGFzc2lnbm1lbnQgaXMgYXRvbWljLCB0aGlzIGlzIHNhZmUgYnV0IHRoZXJlCi0gKiBpcyBubyBndWFyYW50ZWUgdGhyZWFkcyB3aWxsIGFncmVlIG9uIGEgc2luZ2xlIGNhbGxiYWNrIHdpdGhpbiBhbnkKLSAqIHBhcnRpY3VsYXIgdGltZSBwZXJpb2QuCisgKiBOT1RFOiBBbGwgbXV0ZXggaW1wbGVtZW50YXRpb25zIHRocm93IGFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLiAgU2VlIGVhY2gKKyAqICAgICAgIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGV4Y2VwdGlvbiB0eXBlKHMpIHVzZWQuCiAgKi8KLXR5cGVkZWYgdm9pZCAoKk11dGV4V2FpdENhbGxiYWNrKShjb25zdCB2b2lkKiBpZCwgaW50NjRfdCB3YWl0VGltZU1pY3Jvcyk7Ci12b2lkIGVuYWJsZU11dGV4UHJvZmlsaW5nKGludDMyX3QgcHJvZmlsaW5nU2FtcGxlUmF0ZSwgTXV0ZXhXYWl0Q2FsbGJhY2sgY2FsbGJhY2spOwotCi0jZW5kaWYKIAogLyoqCiAgKiBBIHNpbXBsZSBtdXRleCBjbGFzcwpAQCAtNjAsMTAgKzM5LDkgQEAKICAqLwogY2xhc3MgTXV0ZXggewogcHVibGljOgotICB0eXBlZGVmIHZvaWQgKCpJbml0aWFsaXplcikodm9pZCopOworICBNdXRleCgpOworICB2aXJ0dWFsIH5NdXRleCgpID0gZGVmYXVsdDsKIAotICBNdXRleChJbml0aWFsaXplciBpbml0ID0gREVGQVVMVF9JTklUSUFMSVpFUik7Ci0gIHZpcnR1YWwgfk11dGV4KCkge30KICAgdmlydHVhbCB2b2lkIGxvY2soKSBjb25zdDsKICAgdmlydHVhbCBib29sIHRyeWxvY2soKSBjb25zdDsKICAgdmlydHVhbCBib29sIHRpbWVkbG9jayhpbnQ2NF90IG1pbGxpc2Vjb25kcykgY29uc3Q7CkBAIC03MSw1NCArNDksMTEgQEAKIAogICB2b2lkKiBnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0OwogCi0gIHN0YXRpYyB2b2lkIERFRkFVTFRfSU5JVElBTElaRVIodm9pZCopOwotICBzdGF0aWMgdm9pZCBBREFQVElWRV9JTklUSUFMSVpFUih2b2lkKik7Ci0gIHN0YXRpYyB2b2lkIFJFQ1VSU0lWRV9JTklUSUFMSVpFUih2b2lkKik7Ci0KIHByaXZhdGU6CiAgIGNsYXNzIGltcGw7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGltcGw+IGltcGxfOworICBzdGQ6OnNoYXJlZF9wdHI8aW1wbD4gaW1wbF87CiB9OwogCi1jbGFzcyBSZWFkV3JpdGVNdXRleCB7Ci1wdWJsaWM6Ci0gIFJlYWRXcml0ZU11dGV4KCk7Ci0gIHZpcnR1YWwgflJlYWRXcml0ZU11dGV4KCkge30KLQotICAvLyB0aGVzZSBnZXQgdGhlIGxvY2sgYW5kIGJsb2NrIHVudGlsIGl0IGlzIGRvbmUgc3VjY2Vzc2Z1bGx5Ci0gIHZpcnR1YWwgdm9pZCBhY3F1aXJlUmVhZCgpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgYWNxdWlyZVdyaXRlKCkgY29uc3Q7Ci0KLSAgLy8gdGhlc2UgYXR0ZW1wdCB0byBnZXQgdGhlIGxvY2ssIHJldHVybmluZyBmYWxzZSBpbW1lZGlhdGVseSBpZiB0aGV5IGZhaWwKLSAgdmlydHVhbCBib29sIGF0dGVtcHRSZWFkKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBhdHRlbXB0V3JpdGUoKSBjb25zdDsKLQotICAvLyB0aGlzIHJlbGVhc2VzIGJvdGggcmVhZCBhbmQgd3JpdGUgbG9ja3MKLSAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgY2xhc3MgaW1wbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8aW1wbD4gaW1wbF87Ci19OwotCi0vKioKLSAqIEEgUmVhZFdyaXRlTXV0ZXggdGhhdCBndWFyYW50ZWVzIHdyaXRlcnMgd2lsbCBub3QgYmUgc3RhcnZlZCBieSByZWFkZXJzOgotICogV2hlbiBhIHdyaXRlciBhdHRlbXB0cyB0byBhY3F1aXJlIHRoZSBtdXRleCwgYWxsIG5ldyByZWFkZXJzIHdpbGwgYmUKLSAqIGJsb2NrZWQgZnJvbSBhY3F1aXJpbmcgdGhlIG11dGV4IHVudGlsIHRoZSB3cml0ZXIgaGFzIGFjcXVpcmVkIGFuZAotICogcmVsZWFzZWQgaXQuIEluIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIHRoaXMgbWF5IGFscmVhZHkgYmUgZ3VhcmFudGVlZAotICogYnkgYSByZWd1bGFyIFJlYWRXcml0ZU11dGV4LgotICovCi1jbGFzcyBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4IDogcHVibGljIFJlYWRXcml0ZU11dGV4IHsKLXB1YmxpYzoKLSAgTm9TdGFydmVSZWFkV3JpdGVNdXRleCgpOwotCi0gIHZpcnR1YWwgdm9pZCBhY3F1aXJlUmVhZCgpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgYWNxdWlyZVdyaXRlKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gIE11dGV4IG11dGV4XzsKLSAgbXV0YWJsZSB2b2xhdGlsZSBib29sIHdyaXRlcldhaXRpbmdfOwotfTsKIAogY2xhc3MgR3VhcmQgOiBib29zdDo6bm9uY29weWFibGUgewogcHVibGljOgpAQCAtMTI3LDExICs2MiwxMSBAQAogICAgICAgdmFsdWUubG9jaygpOwogICAgIH0gZWxzZSBpZiAodGltZW91dCA8IDApIHsKICAgICAgIGlmICghdmFsdWUudHJ5bG9jaygpKSB7Ci0gICAgICAgIG11dGV4XyA9IE5VTEw7CisgICAgICAgIG11dGV4XyA9IG51bGxwdHI7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIGlmICghdmFsdWUudGltZWRsb2NrKHRpbWVvdXQpKSB7Ci0gICAgICAgIG11dGV4XyA9IE5VTEw7CisgICAgICAgIG11dGV4XyA9IG51bGxwdHI7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0xNDEsMzggKzc2LDEyIEBACiAgICAgfQogICB9CiAKLSAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIChtdXRleF8gIT0gTlVMTCk7IH0KKyAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIChtdXRleF8gIT0gbnVsbHB0cik7IH0KIAogcHJpdmF0ZToKICAgY29uc3QgTXV0ZXgqIG11dGV4XzsKIH07CiAKLS8vIENhbiBiZSB1c2VkIGFzIHNlY29uZCBhcmd1bWVudCB0byBSV0d1YXJkIHRvIG1ha2UgY29kZSBtb3JlIHJlYWRhYmxlCi0vLyBhcyB0byB3aGV0aGVyIHdlJ3JlIGRvaW5nIGFjcXVpcmVSZWFkKCkgb3IgYWNxdWlyZVdyaXRlKCkuCi1lbnVtIFJXR3VhcmRUeXBlIHsgUldfUkVBRCA9IDAsIFJXX1dSSVRFID0gMSB9OwotCi1jbGFzcyBSV0d1YXJkIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKLXB1YmxpYzoKLSAgUldHdWFyZChjb25zdCBSZWFkV3JpdGVNdXRleCYgdmFsdWUsIGJvb2wgd3JpdGUgPSBmYWxzZSkgOiByd19tdXRleF8odmFsdWUpIHsKLSAgICBpZiAod3JpdGUpIHsKLSAgICAgIHJ3X211dGV4Xy5hY3F1aXJlV3JpdGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgcndfbXV0ZXhfLmFjcXVpcmVSZWFkKCk7Ci0gICAgfQotICB9Ci0KLSAgUldHdWFyZChjb25zdCBSZWFkV3JpdGVNdXRleCYgdmFsdWUsIFJXR3VhcmRUeXBlIHR5cGUpIDogcndfbXV0ZXhfKHZhbHVlKSB7Ci0gICAgaWYgKHR5cGUgPT0gUldfV1JJVEUpIHsKLSAgICAgIHJ3X211dGV4Xy5hY3F1aXJlV3JpdGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgcndfbXV0ZXhfLmFjcXVpcmVSZWFkKCk7Ci0gICAgfQotICB9Ci0gIH5SV0d1YXJkKCkgeyByd19tdXRleF8ucmVsZWFzZSgpOyB9Ci0KLXByaXZhdGU6Ci0gIGNvbnN0IFJlYWRXcml0ZU11dGV4JiByd19tdXRleF87Ci19OwogfQogfQogfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1YjU3Mi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9QTEFURk9STVRIUkVBREZBQ1RPUllfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9QTEFURk9STVRIUkVBREZBQ1RPUllfSF8gMQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0jaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KLSNpZiBVU0VfQk9PU1RfVEhSRUFECi0jICBpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvQm9vc3RUaHJlYWRGYWN0b3J5Lmg+Ci0jZWxpZiBVU0VfU1REX1RIUkVBRAotIyAgaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaD4KLSNlbHNlCi0jICBpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+Ci0jZW5kaWYKLS8vIGNsYW5nLWZvcm1hdCBvbgotCi1uYW1lc3BhY2UgYXBhY2hlIHsKLW5hbWVzcGFjZSB0aHJpZnQgewotbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotI2lmIFVTRV9CT09TVF9USFJFQUQKLSAgdHlwZWRlZiBCb29zdFRocmVhZEZhY3RvcnkgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OwotI2VsaWYgVVNFX1NURF9USFJFQUQKLSAgdHlwZWRlZiBTdGRUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKLSNlbHNlCi0gIHR5cGVkZWYgUG9zaXhUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKLSNlbmRpZgotLy8gY2xhbmctZm9ybWF0IG9uCi0KLX0KLX0KLX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUExBVEZPUk1USFJFQURGQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2M1MDM0Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgotCi0jaWYgR09PR0xFX1BFUkZUT09MU19SRUdJU1RFUl9USFJFQUQKLSNpbmNsdWRlIDxnb29nbGUvcHJvZmlsZXIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgewotbmFtZXNwYWNlIHRocmlmdCB7Ci1uYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIGJvb3N0Ojp3ZWFrX3B0cjsKLQotLyoqCi0gKiBUaGUgUE9TSVggdGhyZWFkIGNsYXNzLgotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFB0aHJlYWRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLXB1YmxpYzoKLSAgZW51bSBTVEFURSB7IHVuaW5pdGlhbGl6ZWQsIHN0YXJ0aW5nLCBzdGFydGVkLCBzdG9wcGluZywgc3RvcHBlZCB9OwotCi0gIHN0YXRpYyBjb25zdCBpbnQgTUIgPSAxMDI0ICogMTAyNDsKLQotICBzdGF0aWMgdm9pZCogdGhyZWFkTWFpbih2b2lkKiBhcmcpOwotCi1wcml2YXRlOgotICBwdGhyZWFkX3QgcHRocmVhZF87Ci0gIFNUQVRFIHN0YXRlXzsKLSAgaW50IHBvbGljeV87Ci0gIGludCBwcmlvcml0eV87Ci0gIGludCBzdGFja1NpemVfOwotICB3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmXzsKLSAgYm9vbCBkZXRhY2hlZF87Ci0KLXB1YmxpYzoKLSAgUHRocmVhZFRocmVhZChpbnQgcG9saWN5LAotICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICBpbnQgc3RhY2tTaXplLAotICAgICAgICAgICAgICAgIGJvb2wgZGV0YWNoZWQsCi0gICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCi0gICAgOgotCi0jaWZuZGVmIF9XSU4zMgotICAgICAgcHRocmVhZF8oMCksCi0jZW5kaWYgLy8gX1dJTjMyCi0KLSAgICAgIHN0YXRlXyh1bmluaXRpYWxpemVkKSwKLSAgICAgIHBvbGljeV8ocG9saWN5KSwKLSAgICAgIHByaW9yaXR5Xyhwcmlvcml0eSksCi0gICAgICBzdGFja1NpemVfKHN0YWNrU2l6ZSksCi0gICAgICBkZXRhY2hlZF8oZGV0YWNoZWQpIHsKLQotICAgIHRoaXMtPlRocmVhZDo6cnVubmFibGUocnVubmFibGUpOwotICB9Ci0KLSAgflB0aHJlYWRUaHJlYWQoKSB7Ci0gICAgLyogTm90aGluZyByZWZlcmVuY2VzIHRoaXMgdGhyZWFkLCBpZiBpcyBpcyBub3QgZGV0YWNoZWQsIGRvIGEgam9pbgotICAgICAgIG5vdywgb3RoZXJ3aXNlIHRoZSB0aHJlYWQtaWQgYW5kLCBwb3NzaWJseSwgb3RoZXIgcmVzb3VyY2VzIHdpbGwKLSAgICAgICBiZSBsZWFrZWQuICovCi0gICAgaWYgKCFkZXRhY2hlZF8pIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGpvaW4oKTsKLSAgICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgICAvLyBXZSdyZSByZWFsbHkgaG9zZWQuCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzdGFydCgpIHsKLSAgICBpZiAoc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwdGhyZWFkX2F0dHJfdCB0aHJlYWRfYXR0cjsKLSAgICBpZiAocHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKSAhPSAwKSB7Ci0gICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX2luaXQgZmFpbGVkIik7Ci0gICAgfQotCi0gICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmdGhyZWFkX2F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZF8gPyBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCA6IFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKQotICAgICAgICAhPSAwKSB7Ci0gICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlIGZhaWxlZCIpOwotICAgIH0KLQotICAgIC8vIFNldCB0aHJlYWQgc3RhY2sgc2l6ZQotICAgIGlmIChwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZ0aHJlYWRfYXR0ciwgTUIgKiBzdGFja1NpemVfKSAhPSAwKSB7Ci0gICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSBmYWlsZWQiKTsKLSAgICB9Ci0KLS8vIFNldCB0aHJlYWQgcG9saWN5Ci0jaWZkZWYgX1dJTjMyCi0gICAgLy8gV0lOMzIgUHRocmVhZCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCBzaGVkdWxpbmcgcG9saWNpZXMgb3RoZXIgdGhlbgotICAgIC8vIFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVIgLSBydW50aW1lIGVycm9yCi0gICAgcG9saWN5XyA9IFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVI7Ci0jZW5kaWYKLQotICAgIGlmIChwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3koJnRocmVhZF9hdHRyLCBwb2xpY3lfKSAhPSAwKSB7Ci0gICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5IGZhaWxlZCIpOwotICAgIH0KLQotICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBzY2hlZF9wYXJhbTsKLSAgICBzY2hlZF9wYXJhbS5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5XzsKLQotICAgIC8vIFNldCB0aHJlYWQgcHJpb3JpdHkKLSAgICBpZiAocHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0oJnRocmVhZF9hdHRyLCAmc2NoZWRfcGFyYW0pICE9IDApIHsKLSAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSBmYWlsZWQiKTsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgcmVmZXJlbmNlCi0gICAgc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiogc2VsZlJlZiA9IG5ldyBzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KCk7Ci0gICAgKnNlbGZSZWYgPSBzZWxmXy5sb2NrKCk7Ci0KLSAgICBzdGF0ZV8gPSBzdGFydGluZzsKLQotICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmcHRocmVhZF8sICZ0aHJlYWRfYXR0ciwgdGhyZWFkTWFpbiwgKHZvaWQqKXNlbGZSZWYpICE9IDApIHsKLSAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2NyZWF0ZSBmYWlsZWQiKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGpvaW4oKSB7Ci0gICAgaWYgKCFkZXRhY2hlZF8gJiYgc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHZvaWQqIGlnbm9yZTsKLSAgICAgIC8qIFhYWAotICAgICAgICAgSWYgam9pbiBmYWlscyBpdCBpcyBtb3N0IGxpa2VseSBkdWUgdG8gdGhlIGZhY3QKLSAgICAgICAgIHRoYXQgdGhlIGxhc3QgcmVmZXJlbmNlIHdhcyB0aGUgdGhyZWFkIGl0c2VsZiBhbmQgY2Fubm90Ci0gICAgICAgICBqb2luLiAgVGhpcyByZXN1bHRzIGluIGxlYWtlZCB0aHJlYWRzIGFuZCB3aWxsIGV2ZW50dWFsbHkKLSAgICAgICAgIGNhdXNlIHRoZSBwcm9jZXNzIHRvIHJ1biBvdXQgb2YgdGhyZWFkIHJlc291cmNlcy4KLSAgICAgICAgIFdlJ3JlIGJleW9uZCB0aGUgcG9pbnQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLiAgTm90IGNsZWFyIGhvdwotICAgICAgICAgYmVzdCB0byBoYW5kbGUgdGhpcy4gKi8KLSAgICAgIGludCByZXMgPSBwdGhyZWFkX2pvaW4ocHRocmVhZF8sICZpZ25vcmUpOwotICAgICAgZGV0YWNoZWRfID0gKHJlcyA9PSAwKTsKLSAgICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJQdGhyZWFkVGhyZWFkOjpqb2luKCk6IGZhaWwgd2l0aCBjb2RlICVkIiwgcmVzKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiUHRocmVhZFRocmVhZDo6am9pbigpOiBkZXRhY2hlZCB0aHJlYWQiKTsKLSAgICB9Ci0gIH0KLQotICBUaHJlYWQ6OmlkX3QgZ2V0SWQoKSB7Ci0KLSNpZm5kZWYgX1dJTjMyCi0gICAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF87Ci0jZWxzZQotICAgIHJldHVybiAoVGhyZWFkOjppZF90KXB0aHJlYWRfLnA7Ci0jZW5kaWYgLy8gX1dJTjMyCi0gIH0KLQotICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQotCi0gIHZvaWQgcnVubmFibGUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgVGhyZWFkOjpydW5uYWJsZSh2YWx1ZSk7IH0KLQotICB2b2lkIHdlYWtSZWYoc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmKSB7Ci0gICAgYXNzZXJ0KHNlbGYuZ2V0KCkgPT0gdGhpcyk7Ci0gICAgc2VsZl8gPSB3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPihzZWxmKTsKLSAgfQotfTsKLQotdm9pZCogUHRocmVhZFRocmVhZDo6dGhyZWFkTWFpbih2b2lkKiBhcmcpIHsKLSAgc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiB0aHJlYWQgPSAqKHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qKWFyZzsKLSAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPio+KGFyZyk7Ci0KLSAgaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuICh2b2lkKikwOwotICB9Ci0KLSAgaWYgKHRocmVhZC0+c3RhdGVfICE9IHN0YXJ0aW5nKSB7Ci0gICAgcmV0dXJuICh2b2lkKikwOwotICB9Ci0KLSNpZiBHT09HTEVfUEVSRlRPT0xTX1JFR0lTVEVSX1RIUkVBRAotICBQcm9maWxlclJlZ2lzdGVyVGhyZWFkKCk7Ci0jZW5kaWYKLQotICB0aHJlYWQtPnN0YXRlXyA9IHN0YXJ0ZWQ7Ci0gIHRocmVhZC0+cnVubmFibGUoKS0+cnVuKCk7Ci0gIGlmICh0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGluZyAmJiB0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGVkKSB7Ci0gICAgdGhyZWFkLT5zdGF0ZV8gPSBzdG9wcGluZzsKLSAgfQotCi0gIHJldHVybiAodm9pZCopMDsKLX0KLQotLyoqCi0gKiBQT1NJWCBUaHJlYWQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotICovCi1jbGFzcyBQb3NpeFRocmVhZEZhY3Rvcnk6OkltcGwgewotCi1wcml2YXRlOgotICBQT0xJQ1kgcG9saWN5XzsKLSAgUFJJT1JJVFkgcHJpb3JpdHlfOwotICBpbnQgc3RhY2tTaXplXzsKLSAgYm9vbCBkZXRhY2hlZF87Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIGdlbmVyaWMgcG9zaXggdGhyZWFkIHNjaGVkdWxlIHBvbGljeSBlbnVtcyBpbnRvIHB0aHJlYWQKLSAgICogQVBJIHZhbHVlcy4KLSAgICovCi0gIHN0YXRpYyBpbnQgdG9QdGhyZWFkUG9saWN5KFBPTElDWSBwb2xpY3kpIHsKLSAgICBzd2l0Y2ggKHBvbGljeSkgewotICAgIGNhc2UgT1RIRVI6Ci0gICAgICByZXR1cm4gU0NIRURfT1RIRVI7Ci0gICAgY2FzZSBGSUZPOgotICAgICAgcmV0dXJuIFNDSEVEX0ZJRk87Ci0gICAgY2FzZSBST1VORF9ST0JJTjoKLSAgICAgIHJldHVybiBTQ0hFRF9SUjsKLSAgICB9Ci0gICAgcmV0dXJuIFNDSEVEX09USEVSOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIHJlbGF0aXZlIHRocmVhZCBwcmlvcml0aWVzIHRvIGFic29sdXRlIHZhbHVlIGJhc2VkIG9uIHBvc2l4Ci0gICAqIHRocmVhZCBzY2hlZHVsZXIgcG9saWN5Ci0gICAqCi0gICAqICBUaGUgaWRlYSBpcyBzaW1wbHkgdG8gZGl2aWRlIHVwIHRoZSBwcmlvcml0eSByYW5nZSBmb3IgdGhlIGdpdmVuIHBvbGljeQotICAgKiBpbnRvIHRoZSBjb3JyZXBzb25kaW5nIHJlbGF0aXZlIHByaW9yaXR5IGxldmVsIChsb3dlc3QuLmhpZ2hlc3QpIGFuZAotICAgKiB0aGVuIHByby1yYXRlIGFjY29yZGluZ2x5LgotICAgKi8KLSAgc3RhdGljIGludCB0b1B0aHJlYWRQcmlvcml0eShQT0xJQ1kgcG9saWN5LCBQUklPUklUWSBwcmlvcml0eSkgewotICAgIGludCBwdGhyZWFkX3BvbGljeSA9IHRvUHRocmVhZFBvbGljeShwb2xpY3kpOwotICAgIGludCBtaW5fcHJpb3JpdHkgPSAwOwotICAgIGludCBtYXhfcHJpb3JpdHkgPSAwOwotI2lmZGVmIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01JTgotICAgIG1pbl9wcmlvcml0eSA9IHNjaGVkX2dldF9wcmlvcml0eV9taW4ocHRocmVhZF9wb2xpY3kpOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUFYCi0gICAgbWF4X3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heChwdGhyZWFkX3BvbGljeSk7Ci0jZW5kaWYKLSAgICBpbnQgcXVhbnRhID0gKEhJR0hFU1QgLSBMT1dFU1QpICsgMTsKLSAgICBmbG9hdCBzdGVwc3BlcnF1YW50YSA9IChmbG9hdCkobWF4X3ByaW9yaXR5IC0gbWluX3ByaW9yaXR5KSAvIHF1YW50YTsKLQotICAgIGlmIChwcmlvcml0eSA8PSBISUdIRVNUKSB7Ci0gICAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBwcmlvcml0eSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZSBmb3IgcHJpb3JpdHkgaW5jcmVtZW50cy4KLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBOT1JNQUwpOwotICAgIH0KLSAgfQotCi1wdWJsaWM6Ci0gIEltcGwoUE9MSUNZIHBvbGljeSwgUFJJT1JJVFkgcHJpb3JpdHksIGludCBzdGFja1NpemUsIGJvb2wgZGV0YWNoZWQpCi0gICAgOiBwb2xpY3lfKHBvbGljeSksIHByaW9yaXR5Xyhwcmlvcml0eSksIHN0YWNrU2l6ZV8oc3RhY2tTaXplKSwgZGV0YWNoZWRfKGRldGFjaGVkKSB7fQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFBPU0lYIHRocmVhZCB0byBydW4gdGhlIHJ1bm5hYmxlIG9iamVjdAotICAgKgotICAgKiBAcGFyYW0gcnVubmFibGUgQSBydW5uYWJsZSBvYmplY3QKLSAgICovCi0gIHNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKLSAgICBzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHJlc3VsdAotICAgICAgICA9IHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4obmV3IFB0aHJlYWRUaHJlYWQodG9QdGhyZWFkUG9saWN5KHBvbGljeV8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9QdGhyZWFkUHJpb3JpdHkocG9saWN5XywgcHJpb3JpdHlfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrU2l6ZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5uYWJsZSkpOwotICAgIHJlc3VsdC0+d2Vha1JlZihyZXN1bHQpOwotICAgIHJ1bm5hYmxlLT50aHJlYWQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgaW50IGdldFN0YWNrU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YWNrU2l6ZV87IH0KLQotICB2b2lkIHNldFN0YWNrU2l6ZShpbnQgdmFsdWUpIHsgc3RhY2tTaXplXyA9IHZhbHVlOyB9Ci0KLSAgUFJJT1JJVFkgZ2V0UHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiBwcmlvcml0eV87IH0KLQotICAvKioKLSAgICogU2V0cyBwcmlvcml0eS4KLSAgICoKLSAgICogIFhYWAotICAgKiAgTmVlZCB0byBoYW5kbGUgaW5jcmVtZW50YWwgcHJpb3JpdGllcyBwcm9wZXJseS4KLSAgICovCi0gIHZvaWQgc2V0UHJpb3JpdHkoUFJJT1JJVFkgdmFsdWUpIHsgcHJpb3JpdHlfID0gdmFsdWU7IH0KLQotICBib29sIGlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBkZXRhY2hlZF87IH0KLQotICB2b2lkIHNldERldGFjaGVkKGJvb2wgdmFsdWUpIHsgZGV0YWNoZWRfID0gdmFsdWU7IH0KLQotICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgewotCi0jaWZuZGVmIF9XSU4zMgotICAgIHJldHVybiAoVGhyZWFkOjppZF90KXB0aHJlYWRfc2VsZigpOwotI2Vsc2UKLSAgICByZXR1cm4gKFRocmVhZDo6aWRfdClwdGhyZWFkX3NlbGYoKS5wOwotI2VuZGlmIC8vIF9XSU4zMgotICB9Ci19OwotCi1Qb3NpeFRocmVhZEZhY3Rvcnk6OlBvc2l4VGhyZWFkRmFjdG9yeShQT0xJQ1kgcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFkgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXRhY2hlZCkKLSAgOiBpbXBsXyhuZXcgUG9zaXhUaHJlYWRGYWN0b3J5OjpJbXBsKHBvbGljeSwgcHJpb3JpdHksIHN0YWNrU2l6ZSwgZGV0YWNoZWQpKSB7Ci19Ci0KLXNoYXJlZF9wdHI8VGhyZWFkPiBQb3NpeFRocmVhZEZhY3Rvcnk6Om5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPm5ld1RocmVhZChydW5uYWJsZSk7Ci19Ci0KLWludCBQb3NpeFRocmVhZEZhY3Rvcnk6OmdldFN0YWNrU2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5nZXRTdGFja1NpemUoKTsKLX0KLQotdm9pZCBQb3NpeFRocmVhZEZhY3Rvcnk6OnNldFN0YWNrU2l6ZShpbnQgdmFsdWUpIHsKLSAgaW1wbF8tPnNldFN0YWNrU2l6ZSh2YWx1ZSk7Ci19Ci0KLVBvc2l4VGhyZWFkRmFjdG9yeTo6UFJJT1JJVFkgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRQcmlvcml0eSgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5nZXRQcmlvcml0eSgpOwotfQotCi12b2lkIFBvc2l4VGhyZWFkRmFjdG9yeTo6c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpQUklPUklUWSB2YWx1ZSkgewotICBpbXBsXy0+c2V0UHJpb3JpdHkodmFsdWUpOwotfQotCi1ib29sIFBvc2l4VGhyZWFkRmFjdG9yeTo6aXNEZXRhY2hlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5pc0RldGFjaGVkKCk7Ci19Ci0KLXZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXREZXRhY2hlZChib29sIHZhbHVlKSB7Ci0gIGltcGxfLT5zZXREZXRhY2hlZCh2YWx1ZSk7Ci19Ci0KLVRocmVhZDo6aWRfdCBQb3NpeFRocmVhZEZhY3Rvcnk6OmdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5nZXRDdXJyZW50VGhyZWFkSWQoKTsKLX0KLX0KLX0KLX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNmQyOTYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1BPU0lYVEhSRUFERkFDVE9SWV9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1BPU0lYVEhSRUFERkFDVE9SWV9IXyAxCi0KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7Ci1uYW1lc3BhY2UgdGhyaWZ0IHsKLW5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogQSB0aHJlYWQgZmFjdG9yeSB0byBjcmVhdGUgcG9zaXggdGhyZWFkcwotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFBvc2l4VGhyZWFkRmFjdG9yeSA6IHB1YmxpYyBUaHJlYWRGYWN0b3J5IHsKLQotcHVibGljOgotICAvKioKLSAgICogUE9TSVggVGhyZWFkIHNjaGVkdWxlciBwb2xpY2llcwotICAgKi8KLSAgZW51bSBQT0xJQ1kgeyBPVEhFUiwgRklGTywgUk9VTkRfUk9CSU4gfTsKLQotICAvKioKLSAgICogUE9TSVggVGhyZWFkIHNjaGVkdWxlciByZWxhdGl2ZSBwcmlvcml0aWVzLAotICAgKgotICAgKiBBYnNvbHV0ZSBwcmlvcml0eSBpcyBkZXRlcm1pbmVkIGJ5IHNjaGVkdWxlciBwb2xpY3kgYW5kIE9TLiBUaGlzCi0gICAqIGVudW1lcmF0aW9uIHNwZWNpZmllcyByZWxhdGl2ZSBwcmlvcml0aWVzIHN1Y2ggdGhhdCBvbmUgY2FuIHNwZWNpZnkgYQotICAgKiBwcmlvcml0eSB3aXRoaW4gYSBnaXZpbmcgc2NoZWR1bGVyIHBvbGljeSB3aXRob3V0IGtub3dpbmcgdGhlIGFic29sdXRlCi0gICAqIHZhbHVlIG9mIHRoZSBwcmlvcml0eS4KLSAgICovCi0gIGVudW0gUFJJT1JJVFkgewotICAgIExPV0VTVCA9IDAsCi0gICAgTE9XRVIgPSAxLAotICAgIExPVyA9IDIsCi0gICAgTk9STUFMID0gMywKLSAgICBISUdIID0gNCwKLSAgICBISUdIRVIgPSA1LAotICAgIEhJR0hFU1QgPSA2LAotICAgIElOQ1JFTUVOVCA9IDcsCi0gICAgREVDUkVNRU5UID0gOAotICB9OwotCi0gIC8qKgotICAgKiBQb3NpeCB0aHJlYWQgKHB0aHJlYWQpIGZhY3RvcnkuICBBbGwgdGhyZWFkcyBjcmVhdGVkIGJ5IGEgZmFjdG9yeSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQKLSAgICogdmlhIGJvb3N0OjpzaGFyZWRfcHRyIGFuZCBib29zdDo6d2Vha19wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQKLSAgICogdGhlIFJ1bm5hYmxlIHRhc2tzIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCi0gICAqIHRvIGJvdGggaXMgZ2l2ZW4gdXAuCi0gICAqCi0gICAqIFRocmVhZHMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBvbGljeSwgcHJpb3JpdHksIHN0YWNrLXNpemUgYW5kIGRldGFjaGFibGUtbW9kZQotICAgKiBkZXRhY2hlZCBtZWFucyB0aGUgdGhyZWFkIGlzIGZyZWUtcnVubmluZyBhbmQgd2lsbCByZWxlYXNlIGFsbCBzeXN0ZW0gcmVzb3VyY2VzIHRoZQotICAgKiB3aGVuIGl0IGNvbXBsZXRlcy4gIEEgZGV0YWNoYWJsZSB0aHJlYWQgaXMgbm90IGpvaW5hYmxlLiAgVGhlIGpvaW4gbWV0aG9kCi0gICAqIG9mIGEgZGV0YWNoYWJsZSB0aHJlYWQgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aCBubyBlcnJvci4KLSAgICoKLSAgICogQnkgZGVmYXVsdCB0aHJlYWRzIGFyZSBub3Qgam9pbmFibGUuCi0gICAqLwotCi0gIFBvc2l4VGhyZWFkRmFjdG9yeShQT0xJQ1kgcG9saWN5ID0gUk9VTkRfUk9CSU4sCi0gICAgICAgICAgICAgICAgICAgICBQUklPUklUWSBwcmlvcml0eSA9IE5PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBzdGFja1NpemUgPSAxLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXRhY2hlZCA9IHRydWUpOwotCi0gIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdDsKLQotICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7Ci0gIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdDsKLQotICAvKioKLSAgICogR2V0cyBzdGFjayBzaXplIGZvciBjcmVhdGVkIHRocmVhZHMKLSAgICoKLSAgICogQHJldHVybiBpbnQgc2l6ZSBpbiBtZWdhYnl0ZXMKLSAgICovCi0gIHZpcnR1YWwgaW50IGdldFN0YWNrU2l6ZSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBTZXRzIHN0YWNrIHNpemUgZm9yIGNyZWF0ZWQgdGhyZWFkcwotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgc2l6ZSBpbiBtZWdhYnl0ZXMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzZXRTdGFja1NpemUoaW50IHZhbHVlKTsKLQotICAvKioKLSAgICogR2V0cyBwcmlvcml0eSByZWxhdGl2ZSB0byBjdXJyZW50IHBvbGljeQotICAgKi8KLSAgdmlydHVhbCBQUklPUklUWSBnZXRQcmlvcml0eSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBTZXRzIHByaW9yaXR5IHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9saWN5Ci0gICAqLwotICB2aXJ0dWFsIHZvaWQgc2V0UHJpb3JpdHkoUFJJT1JJVFkgcHJpb3JpdHkpOwotCi0gIC8qKgotICAgKiBTZXRzIGRldGFjaGVkIG1vZGUgb2YgdGhyZWFkcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIHNldERldGFjaGVkKGJvb2wgZGV0YWNoZWQpOwotCi0gIC8qKgotICAgKiBHZXRzIGN1cnJlbnQgZGV0YWNoZWQgbW9kZQotICAgKi8KLSAgdmlydHVhbCBib29sIGlzRGV0YWNoZWQoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgY2xhc3MgSW1wbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbF87Ci19OwotfQotfQotfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9QT1NJWFRIUkVBREZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzYjIwOS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTW9uaXRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KLQotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgewotbmFtZXNwYWNlIHRocmlmdCB7Ci1uYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIE1vbml0b3IgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIHN0ZCB0aHJlYWQgbGlicmFyeQotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIE1vbml0b3I6OkltcGwgewotCi1wdWJsaWM6Ci0gIEltcGwoKSA6IG93bmVkTXV0ZXhfKG5ldyBNdXRleCgpKSwgY29uZGl0aW9uVmFyaWFibGVfKCksIG11dGV4XyhOVUxMKSB7IGluaXQob3duZWRNdXRleF8uZ2V0KCkpOyB9Ci0KLSAgSW1wbChNdXRleCogbXV0ZXgpIDogb3duZWRNdXRleF8oKSwgY29uZGl0aW9uVmFyaWFibGVfKCksIG11dGV4XyhOVUxMKSB7IGluaXQobXV0ZXgpOyB9Ci0KLSAgSW1wbChNb25pdG9yKiBtb25pdG9yKSA6IG93bmVkTXV0ZXhfKCksIGNvbmRpdGlvblZhcmlhYmxlXygpLCBtdXRleF8oTlVMTCkgewotICAgIGluaXQoJihtb25pdG9yLT5tdXRleCgpKSk7Ci0gIH0KLQotICBNdXRleCYgbXV0ZXgoKSB7IHJldHVybiAqbXV0ZXhfOyB9Ci0gIHZvaWQgbG9jaygpIHsgbXV0ZXhfLT5sb2NrKCk7IH0KLSAgdm9pZCB1bmxvY2soKSB7IG11dGV4Xy0+dW5sb2NrKCk7IH0KLQotICAvKioKLSAgICogRXhjZXB0aW9uLXRocm93aW5nIHZlcnNpb24gb2Ygd2FpdEZvclRpbWVSZWxhdGl2ZSgpLCBjYWxsZWQgc2ltcGx5Ci0gICAqIHdhaXQoaW50NjQpIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICBUaW1lb3V0IGlzIGluIG1pbGxpc2Vjb25kcy4KLSAgICoKLSAgICogSWYgdGhlIGNvbmRpdGlvbiBvY2N1cnMsICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgY2xlYW5seTsgb24gdGltZW91dCBvcgotICAgKiBlcnJvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgotICAgKi8KLSAgdm9pZCB3YWl0KGludDY0X3QgdGltZW91dF9tcykgewotICAgIGludCByZXN1bHQgPSB3YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXRfbXMpOwotICAgIGlmIChyZXN1bHQgPT0gVEhSSUZUX0VUSU1FRE9VVCkgewotICAgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKLSAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJNb25pdG9yOjp3YWl0KCkgZmFpbGVkIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBjb25kaXRpb24gdG8KLSAgICogb2NjdXIsIG9yIHdhaXRzIGZvcmV2ZXIgaWYgdGltZW91dF9tcyA9PSAwLgotICAgKgotICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgotICAgKi8KLSAgaW50IHdhaXRGb3JUaW1lUmVsYXRpdmUoaW50NjRfdCB0aW1lb3V0X21zKSB7Ci0gICAgaWYgKHRpbWVvdXRfbXMgPT0gMExMKSB7Ci0gICAgICByZXR1cm4gd2FpdEZvcmV2ZXIoKTsKLSAgICB9Ci0KLSAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBzdGQ6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPSBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKLSAgICBhc3NlcnQobXV0ZXhJbXBsKTsKLQotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjp0aW1lZF9tdXRleD4gbG9jaygqbXV0ZXhJbXBsLCBzdGQ6OmFkb3B0X2xvY2spOwotICAgIGJvb2wgdGltZWRvdXQgPSAoY29uZGl0aW9uVmFyaWFibGVfLndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHModGltZW91dF9tcykpCi0gICAgICAgICAgICAgICAgICAgICA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCk7Ci0gICAgbG9jay5yZWxlYXNlKCk7Ci0gICAgcmV0dXJuICh0aW1lZG91dCA/IFRIUklGVF9FVElNRURPVVQgOiAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IFRIUklGVF9USU1FU1BFQy4KLSAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KLSAgICovCi0gIGludCB3YWl0Rm9yVGltZShjb25zdCBUSFJJRlRfVElNRVNQRUMqIGFic3RpbWUpIHsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0ZW1wOwotICAgIHRlbXAudHZfc2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfc2VjKTsKLSAgICB0ZW1wLnR2X3VzZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl9uc2VjKSAvIDEwMDA7Ci0gICAgcmV0dXJuIHdhaXRGb3JUaW1lKCZ0ZW1wKTsKLSAgfQotCi0gIC8qKgotICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IHRpbWV2YWwuCi0gICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCi0gICAqLwotICBpbnQgd2FpdEZvclRpbWUoY29uc3Qgc3RydWN0IHRpbWV2YWwqIGFic3RpbWUpIHsKLSAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBzdGQ6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPSBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKLSAgICBhc3NlcnQobXV0ZXhJbXBsKTsKLQotICAgIHN0cnVjdCB0aW1ldmFsIGN1cnJlbnR0aW1lOwotICAgIFV0aWw6OnRvVGltZXZhbChjdXJyZW50dGltZSwgVXRpbDo6Y3VycmVudFRpbWUoKSk7Ci0KLSAgICBsb25nIHR2X3NlYyA9IHN0YXRpY19jYXN0PGxvbmc+KGFic3RpbWUtPnR2X3NlYyAtIGN1cnJlbnR0aW1lLnR2X3NlYyk7Ci0gICAgbG9uZyB0dl91c2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfdXNlYyAtIGN1cnJlbnR0aW1lLnR2X3VzZWMpOwotICAgIGlmICh0dl9zZWMgPCAwKQotICAgICAgdHZfc2VjID0gMDsKLSAgICBpZiAodHZfdXNlYyA8IDApCi0gICAgICB0dl91c2VjID0gMDsKLQotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjp0aW1lZF9tdXRleD4gbG9jaygqbXV0ZXhJbXBsLCBzdGQ6OmFkb3B0X2xvY2spOwotICAgIGJvb2wgdGltZWRvdXQgPSAoY29uZGl0aW9uVmFyaWFibGVfLndhaXRfZm9yKGxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnNlY29uZHModHZfc2VjKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyh0dl91c2VjKSkKLSAgICAgICAgICAgICAgICAgICAgID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KTsKLSAgICBsb2NrLnJlbGVhc2UoKTsKLSAgICByZXR1cm4gKHRpbWVkb3V0ID8gVEhSSUZUX0VUSU1FRE9VVCA6IDApOwotICB9Ci0KLSAgLyoqCi0gICAqIFdhaXRzIGZvcmV2ZXIgdW50aWwgdGhlIGNvbmRpdGlvbiBvY2N1cnMuCi0gICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBvciBhbiBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAgICovCi0gIGludCB3YWl0Rm9yZXZlcigpIHsKLSAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBzdGQ6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPSBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKLSAgICBhc3NlcnQobXV0ZXhJbXBsKTsKLQotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjp0aW1lZF9tdXRleD4gbG9jaygqbXV0ZXhJbXBsLCBzdGQ6OmFkb3B0X2xvY2spOwotICAgIGNvbmRpdGlvblZhcmlhYmxlXy53YWl0KGxvY2spOwotICAgIGxvY2sucmVsZWFzZSgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdm9pZCBub3RpZnkoKSB7IGNvbmRpdGlvblZhcmlhYmxlXy5ub3RpZnlfb25lKCk7IH0KLQotICB2b2lkIG5vdGlmeUFsbCgpIHsgY29uZGl0aW9uVmFyaWFibGVfLm5vdGlmeV9hbGwoKTsgfQotCi1wcml2YXRlOgotICB2b2lkIGluaXQoTXV0ZXgqIG11dGV4KSB7IG11dGV4XyA9IG11dGV4OyB9Ci0KLSAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKLSAgc3RkOjpjb25kaXRpb25fdmFyaWFibGVfYW55IGNvbmRpdGlvblZhcmlhYmxlXzsKLSAgTXV0ZXgqIG11dGV4XzsKLX07Ci0KLU1vbml0b3I6Ok1vbml0b3IoKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKCkpIHsKLX0KLU1vbml0b3I6Ok1vbml0b3IoTXV0ZXgqIG11dGV4KSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG11dGV4KSkgewotfQotTW9uaXRvcjo6TW9uaXRvcihNb25pdG9yKiBtb25pdG9yKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG1vbml0b3IpKSB7Ci19Ci0KLU1vbml0b3I6On5Nb25pdG9yKCkgewotICBkZWxldGUgaW1wbF87Ci19Ci0KLU11dGV4JiBNb25pdG9yOjptdXRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bXV0ZXgoKTsKLX0KLQotdm9pZCBNb25pdG9yOjpsb2NrKCkgY29uc3QgewotICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPmxvY2soKTsKLX0KLQotdm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7Ci0gIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+dW5sb2NrKCk7Ci19Ci0KLXZvaWQgTW9uaXRvcjo6d2FpdChpbnQ2NF90IHRpbWVvdXQpIGNvbnN0IHsKLSAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0KHRpbWVvdXQpOwotfQotCi1pbnQgTW9uaXRvcjo6d2FpdEZvclRpbWUoY29uc3QgVEhSSUZUX1RJTUVTUEVDKiBhYnN0aW1lKSBjb25zdCB7Ci0gIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JUaW1lKGFic3RpbWUpOwotfQotCi1pbnQgTW9uaXRvcjo6d2FpdEZvclRpbWUoY29uc3QgdGltZXZhbCogYWJzdGltZSkgY29uc3QgewotICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yVGltZShhYnN0aW1lKTsKLX0KLQotaW50IE1vbml0b3I6OndhaXRGb3JUaW1lUmVsYXRpdmUoaW50NjRfdCB0aW1lb3V0X21zKSBjb25zdCB7Ci0gIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JUaW1lUmVsYXRpdmUodGltZW91dF9tcyk7Ci19Ci0KLWludCBNb25pdG9yOjp3YWl0Rm9yZXZlcigpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvcmV2ZXIoKTsKLX0KLQotdm9pZCBNb25pdG9yOjpub3RpZnkoKSBjb25zdCB7Ci0gIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bm90aWZ5KCk7Ci19Ci0KLXZvaWQgTW9uaXRvcjo6bm90aWZ5QWxsKCkgY29uc3QgewotICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPm5vdGlmeUFsbCgpOwotfQotfQotfQotfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTXV0ZXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTY3OGEyLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgotCi0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPG11dGV4PgotCi1uYW1lc3BhY2UgYXBhY2hlIHsKLW5hbWVzcGFjZSB0aHJpZnQgewotbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBNdXRleCBjbGFzcyB1c2luZyBDKysxMSBzdGQ6OnRpbWVkX211dGV4Ci0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgTXV0ZXg6OmltcGwgOiBwdWJsaWMgc3RkOjp0aW1lZF9tdXRleCB7fTsKLQotTXV0ZXg6Ok11dGV4KEluaXRpYWxpemVyIGluaXQpIDogaW1wbF8obmV3IE11dGV4OjppbXBsKCkpIHsKLX0KLQotdm9pZCogTXV0ZXg6OmdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8uZ2V0KCk7Ci19Ci0KLXZvaWQgTXV0ZXg6OmxvY2soKSBjb25zdCB7Ci0gIGltcGxfLT5sb2NrKCk7Ci19Ci0KLWJvb2wgTXV0ZXg6OnRyeWxvY2soKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+dHJ5X2xvY2soKTsKLX0KLQotYm9vbCBNdXRleDo6dGltZWRsb2NrKGludDY0X3QgbXMpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT50cnlfbG9ja19mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhtcykpOwotfQotCi12b2lkIE11dGV4Ojp1bmxvY2soKSBjb25zdCB7Ci0gIGltcGxfLT51bmxvY2soKTsKLX0KLQotdm9pZCBNdXRleDo6REVGQVVMVF9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKLX0KLX0KLX0KLX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1N2U3ZWMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+Ci0KLSNpZiBVU0VfU1REX1RIUkVBRAotCi0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+Ci0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotCi0jaW5jbHVkZSA8Ym9vc3QvZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3dlYWtfcHRyLmhwcD4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgewotbmFtZXNwYWNlIHRocmlmdCB7Ci1uYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIFRoZSBDKysxMSB0aHJlYWQgY2xhc3MuCi0gKgotICogTm90ZSB0aGF0IHdlIHVzZSBib29zdCBzaGFyZWRfcHRyIHJhdGhlciB0aGFuIHN0ZCBzaGFyZWRfcHRycyBoZXJlCi0gKiBiZWNhdXNlIHRoZSBUaHJlYWQvUnVubmFibGUgY2xhc3NlcyB1c2UgdGhvc2UgYW5kIHdlIGRvbid0IHdhbnQgdG8KLSAqIG1peCB0aGVtLgotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFN0ZFRocmVhZCA6IHB1YmxpYyBUaHJlYWQsIHB1YmxpYyBib29zdDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8U3RkVGhyZWFkPiB7Ci1wdWJsaWM6Ci0gIGVudW0gU1RBVEUgeyB1bmluaXRpYWxpemVkLCBzdGFydGluZywgc3RhcnRlZCwgc3RvcHBpbmcsIHN0b3BwZWQgfTsKLQotICBzdGF0aWMgdm9pZCB0aHJlYWRNYWluKGJvb3N0OjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gdGhyZWFkKTsKLQotcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dGhyZWFkPiB0aHJlYWRfOwotICBTVEFURSBzdGF0ZV87Ci0gIGJvb2wgZGV0YWNoZWRfOwotCi1wdWJsaWM6Ci0gIFN0ZFRocmVhZChib29sIGRldGFjaGVkLCBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCi0gICAgOiBzdGF0ZV8odW5pbml0aWFsaXplZCksIGRldGFjaGVkXyhkZXRhY2hlZCkgewotICAgIHRoaXMtPlRocmVhZDo6cnVubmFibGUocnVubmFibGUpOwotICB9Ci0KLSAgflN0ZFRocmVhZCgpIHsKLSAgICBpZiAoIWRldGFjaGVkXykgewotICAgICAgdHJ5IHsKLSAgICAgICAgam9pbigpOwotICAgICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICAgIC8vIFdlJ3JlIHJlYWxseSBob3NlZC4KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIHN0YXJ0KCkgewotICAgIGlmIChzdGF0ZV8gIT0gdW5pbml0aWFsaXplZCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gc2VsZlJlZiA9IHNoYXJlZF9mcm9tX3RoaXMoKTsKLSAgICBzdGF0ZV8gPSBzdGFydGluZzsKLQotICAgIHRocmVhZF8gPSBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp0aHJlYWQ+KG5ldyBzdGQ6OnRocmVhZCh0aHJlYWRNYWluLCBzZWxmUmVmKSk7Ci0KLSAgICBpZiAoZGV0YWNoZWRfKQotICAgICAgdGhyZWFkXy0+ZGV0YWNoKCk7Ci0gIH0KLQotICB2b2lkIGpvaW4oKSB7Ci0gICAgaWYgKCFkZXRhY2hlZF8gJiYgc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHRocmVhZF8tPmpvaW4oKTsKLSAgICB9Ci0gIH0KLQotICBUaHJlYWQ6OmlkX3QgZ2V0SWQoKSB7IHJldHVybiB0aHJlYWRfLmdldCgpID8gdGhyZWFkXy0+Z2V0X2lkKCkgOiBzdGQ6OnRocmVhZDo6aWQoKTsgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQotCi0gIHZvaWQgcnVubmFibGUoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IFRocmVhZDo6cnVubmFibGUodmFsdWUpOyB9Ci19OwotCi12b2lkIFN0ZFRocmVhZDo6dGhyZWFkTWFpbihib29zdDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHRocmVhZCkgewotICBpZiAodGhyZWFkID09IE5VTEwpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAodGhyZWFkLT5zdGF0ZV8gIT0gc3RhcnRpbmcpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0aHJlYWQtPnN0YXRlXyA9IHN0YXJ0ZWQ7Ci0gIHRocmVhZC0+cnVubmFibGUoKS0+cnVuKCk7Ci0KLSAgaWYgKHRocmVhZC0+c3RhdGVfICE9IHN0b3BwaW5nICYmIHRocmVhZC0+c3RhdGVfICE9IHN0b3BwZWQpIHsKLSAgICB0aHJlYWQtPnN0YXRlXyA9IHN0b3BwaW5nOwotICB9Ci0KLSAgcmV0dXJuOwotfQotCi0vKioKLSAqIHN0ZDo6dGhyZWFkIGZhY3RvcnkgaW1wbGVtZW50YXRpb24KLSAqLwotY2xhc3MgU3RkVGhyZWFkRmFjdG9yeTo6SW1wbCB7Ci0KLXByaXZhdGU6Ci0gIGJvb2wgZGV0YWNoZWRfOwotCi1wdWJsaWM6Ci0gIEltcGwoYm9vbCBkZXRhY2hlZCkgOiBkZXRhY2hlZF8oZGV0YWNoZWQpIHt9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc3RkOjp0aHJlYWQgdG8gcnVuIHRoZSBydW5uYWJsZSBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIHJ1bm5hYmxlIEEgcnVubmFibGUgb2JqZWN0Ci0gICAqLwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHJlc3VsdAotICAgICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4obmV3IFN0ZFRocmVhZChkZXRhY2hlZF8sIHJ1bm5hYmxlKSk7Ci0gICAgcnVubmFibGUtPnRocmVhZChyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBib29sIGlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBkZXRhY2hlZF87IH0KLQotICB2b2lkIHNldERldGFjaGVkKGJvb2wgdmFsdWUpIHsgZGV0YWNoZWRfID0gdmFsdWU7IH0KLQotICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgeyByZXR1cm4gc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7IH0KLX07Ci0KLVN0ZFRocmVhZEZhY3Rvcnk6OlN0ZFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCkgOiBpbXBsXyhuZXcgU3RkVGhyZWFkRmFjdG9yeTo6SW1wbChkZXRhY2hlZCkpIHsKLX0KLQotYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBTdGRUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+bmV3VGhyZWFkKHJ1bm5hYmxlKTsKLX0KLQotYm9vbCBTdGRUaHJlYWRGYWN0b3J5Ojppc0RldGFjaGVkKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPmlzRGV0YWNoZWQoKTsKLX0KLQotdm9pZCBTdGRUaHJlYWRGYWN0b3J5OjpzZXREZXRhY2hlZChib29sIHZhbHVlKSB7Ci0gIGltcGxfLT5zZXREZXRhY2hlZCh2YWx1ZSk7Ci19Ci0KLVRocmVhZDo6aWRfdCBTdGRUaHJlYWRGYWN0b3J5OjpnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+Z2V0Q3VycmVudFRocmVhZElkKCk7Ci19Ci19Ci19Ci19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gVVNFX1NURF9USFJFQUQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjg2YmJmLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9TVERUSFJFQURGQUNUT1JZX0hfCi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfU1REVEhSRUFERkFDVE9SWV9IXyAxCi0KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7Ci1uYW1lc3BhY2UgdGhyaWZ0IHsKLW5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogQSB0aHJlYWQgZmFjdG9yeSB0byBjcmVhdGUgc3RkOjp0aHJlYWRzLgotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFN0ZFRocmVhZEZhY3RvcnkgOiBwdWJsaWMgVGhyZWFkRmFjdG9yeSB7Ci0KLXB1YmxpYzoKLSAgLyoqCi0gICAqIFN0ZCB0aHJlYWQgZmFjdG9yeS4gIEFsbCB0aHJlYWRzIGNyZWF0ZWQgYnkgYSBmYWN0b3J5IGFyZSByZWZlcmVuY2UtY291bnRlZAotICAgKiB2aWEgYm9vc3Q6OnNoYXJlZF9wdHIgYW5kIGJvb3N0Ojp3ZWFrX3B0ci4gIFRoZSBmYWN0b3J5IGd1YXJhbnRlZXMgdGhhdCB0aHJlYWRzIGFuZAotICAgKiB0aGUgUnVubmFibGUgdGFza3MgdGhleSBob3N0IHdpbGwgYmUgcHJvcGVybHkgY2xlYW5lZCB1cCBvbmNlIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2UKLSAgICogdG8gYm90aCBpcyBnaXZlbiB1cC4KLSAgICoKLSAgICogQnkgZGVmYXVsdCB0aHJlYWRzIGFyZSBub3Qgam9pbmFibGUuCi0gICAqLwotCi0gIFN0ZFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCA9IHRydWUpOwotCi0gIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdDsKLQotICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7Ci0gIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdDsKLQotICAvKioKLSAgICogU2V0cyBkZXRhY2hlZCBtb2RlIG9mIHRocmVhZHMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzZXREZXRhY2hlZChib29sIGRldGFjaGVkKTsKLQotICAvKioKLSAgICogR2V0cyBjdXJyZW50IGRldGFjaGVkIG1vZGUKLSAgICovCi0gIHZpcnR1YWwgYm9vbCBpc0RldGFjaGVkKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gIGNsYXNzIEltcGw7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEltcGw+IGltcGxfOwotfTsKLX0KLX0KLX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfU1REVEhSRUFERkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmJiMTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5jcHAKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKwordm9pZCBUaHJlYWQ6OnRocmVhZE1haW4oc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkKSB7CisgIHRocmVhZC0+c2V0U3RhdGUoc3RhcnRlZCk7CisgIHRocmVhZC0+cnVubmFibGUoKS0+cnVuKCk7CisKKyAgaWYgKHRocmVhZC0+Z2V0U3RhdGUoKSAhPSBzdG9wcGluZyAmJiB0aHJlYWQtPmdldFN0YXRlKCkgIT0gc3RvcHBlZCkgeworICAgIHRocmVhZC0+c2V0U3RhdGUoc3RvcHBpbmcpOworICB9Cit9CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmgKaW5kZXggZjVlYjNhOC4uZTgwM2E4MiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaApAQCAtMjAsMjEgKzIwLDEwIEBACiAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFEX0hfCiAjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFEX0hfIDEKIAotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3dlYWtfcHRyLmhwcD4KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+Ci0KLSNpZiBVU0VfQk9PU1RfVEhSRUFECi0jaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KLSNlbGlmIFVTRV9TVERfVEhSRUFECisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmVhZD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9QVEhSRUFEX0gKLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jZW5kaWYKLSNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTUwLDIzICszOSwyMyBAQAogY2xhc3MgUnVubmFibGUgewogCiBwdWJsaWM6Ci0gIHZpcnR1YWwgflJ1bm5hYmxlKCl7fTsKKyAgdmlydHVhbCB+UnVubmFibGUoKSA9IGRlZmF1bHQ7CiAgIHZpcnR1YWwgdm9pZCBydW4oKSA9IDA7CiAKICAgLyoqCiAgICAqIEdldHMgdGhlIHRocmVhZCBvYmplY3QgdGhhdCBpcyBob3N0aW5nIHRoaXMgcnVubmFibGUgb2JqZWN0ICAtIGNhbiByZXR1cm4KICAgICogYW4gZW1wdHkgYm9vc3Q6OnNoYXJlZCBwb2ludGVyIGlmIG5vIHJlZmVyZW5jZXMgcmVtYWluIG9uIHRoYXQgdGhyZWFkIG9iamVjdAogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCgpIHsgcmV0dXJuIHRocmVhZF8ubG9jaygpOyB9CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkKCkgeyByZXR1cm4gdGhyZWFkXy5sb2NrKCk7IH0KIAogICAvKioKICAgICogU2V0cyB0aGUgdGhyZWFkIHRoYXQgaXMgZXhlY3V0aW5nIHRoaXMgb2JqZWN0LiAgVGhpcyBpcyBvbmx5IG1lYW50IGZvcgogICAgKiB1c2UgYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIFRocmVhZC4KICAgICovCi0gIHZpcnR1YWwgdm9pZCB0aHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB2YWx1ZSkgeyB0aHJlYWRfID0gdmFsdWU7IH0KKyAgdmlydHVhbCB2b2lkIHRocmVhZChzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiB2YWx1ZSkgeyB0aHJlYWRfID0gdmFsdWU7IH0KIAogcHJpdmF0ZToKLSAgYm9vc3Q6OndlYWtfcHRyPFRocmVhZD4gdGhyZWFkXzsKKyAgc3RkOjp3ZWFrX3B0cjxUaHJlYWQ+IHRocmVhZF87CiB9OwogCiAvKioKQEAgLTc4LDc1ICs2NywxMDYgQEAKICAqCiAgKiBAc2VlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeSkKICAqLwotY2xhc3MgVGhyZWFkIHsKK2NsYXNzIFRocmVhZCBmaW5hbCA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFRocmVhZD4gewogCiBwdWJsaWM6Ci0jaWYgVVNFX0JPT1NUX1RIUkVBRAotICB0eXBlZGVmIGJvb3N0Ojp0aHJlYWQ6OmlkIGlkX3Q7Ci0KLSAgc3RhdGljIGlubGluZSBib29sIGlzX2N1cnJlbnQoaWRfdCB0KSB7IHJldHVybiB0ID09IGJvb3N0Ojp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7IH0KLSAgc3RhdGljIGlubGluZSBpZF90IGdldF9jdXJyZW50KCkgeyByZXR1cm4gYm9vc3Q6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKTsgfQotI2VsaWYgVVNFX1NURF9USFJFQUQKICAgdHlwZWRlZiBzdGQ6OnRocmVhZDo6aWQgaWRfdDsKIAorICBlbnVtIFNUQVRFIHsgdW5pbml0aWFsaXplZCwgc3RhcnRpbmcsIHN0YXJ0ZWQsIHN0b3BwaW5nLCBzdG9wcGVkIH07CisKKyAgc3RhdGljIHZvaWQgdGhyZWFkTWFpbihzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQpOworCiAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19jdXJyZW50KGlkX3QgdCkgeyByZXR1cm4gdCA9PSBzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKTsgfQogICBzdGF0aWMgaW5saW5lIGlkX3QgZ2V0X2N1cnJlbnQoKSB7IHJldHVybiBzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKTsgfQotI2Vsc2UKLSAgdHlwZWRlZiBwdGhyZWFkX3QgaWRfdDsKIAotICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfY3VycmVudChpZF90IHQpIHsgcmV0dXJuIHB0aHJlYWRfZXF1YWwocHRocmVhZF9zZWxmKCksIHQpOyB9Ci0gIHN0YXRpYyBpbmxpbmUgaWRfdCBnZXRfY3VycmVudCgpIHsgcmV0dXJuIHB0aHJlYWRfc2VsZigpOyB9Ci0jZW5kaWYKKyAgVGhyZWFkKGJvb2wgZGV0YWNoZWQsIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCisgICAgOiBzdGF0ZV8odW5pbml0aWFsaXplZCksIGRldGFjaGVkXyhkZXRhY2hlZCkgeworICAgIHRoaXMtPl9ydW5uYWJsZSA9IHJ1bm5hYmxlOworICB9CiAKLSAgdmlydHVhbCB+VGhyZWFkKCl7fTsKKyAgflRocmVhZCgpIHsKKyAgICBpZiAoIWRldGFjaGVkXyAmJiB0aHJlYWRfLT5qb2luYWJsZSgpKSB7CisgICAgICB0cnkgeworICAgICAgICBqb2luKCk7CisgICAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgLy8gV2UncmUgcmVhbGx5IGhvc2VkLgorICAgICAgfQorICAgIH0KKyAgfQorCisgIFNUQVRFIGdldFN0YXRlKCkgY29uc3QKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKyAgICByZXR1cm4gc3RhdGVfOworICB9CisKKyAgdm9pZCBzZXRTdGF0ZShTVEFURSBuZXdTdGF0ZSkKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKyAgICBzdGF0ZV8gPSBuZXdTdGF0ZTsKKworICAgIC8vIHVuYmxvY2sgc3RhcnQoKSB3aXRoIHRoZSBrbm93bGVkZ2UgdGhhdCB0aGUgdGhyZWFkIGhhcyBhY3R1YWxseQorICAgIC8vIHN0YXJ0ZWQgcnVubmluZywgd2hpY2ggYXZvaWRzIGEgcmFjZSBpbiBkZXRhY2hlZCB0aHJlYWRzLgorICAgIGlmIChuZXdTdGF0ZSA9PSBzdGFydGVkKSB7CisJICBtb25pdG9yXy5ub3RpZnkoKTsKKyAgICB9CisgIH0KIAogICAvKioKICAgICogU3RhcnRzIHRoZSB0aHJlYWQuIERvZXMgcGxhdGZvcm0gc3BlY2lmaWMgdGhyZWFkIGNyZWF0aW9uIGFuZAogICAgKiBjb25maWd1cmF0aW9uIHRoZW4gaW52b2tlcyB0aGUgcnVuIG1ldGhvZCBvZiB0aGUgUnVubmFibGUgb2JqZWN0IGJvdW5kCiAgICAqIHRvIHRoaXMgdGhyZWFkLgogICAgKi8KLSAgdmlydHVhbCB2b2lkIHN0YXJ0KCkgPSAwOworICB2b2lkIHN0YXJ0KCkgeworICAgIGlmIChnZXRTdGF0ZSgpICE9IHVuaW5pdGlhbGl6ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZWxmUmVmID0gc2hhcmVkX2Zyb21fdGhpcygpOworICAgIHNldFN0YXRlKHN0YXJ0aW5nKTsKKworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKyAgICB0aHJlYWRfID0gc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dGhyZWFkPihuZXcgc3RkOjp0aHJlYWQodGhyZWFkTWFpbiwgc2VsZlJlZikpOworCisgICAgaWYgKGRldGFjaGVkXykKKyAgICAgIHRocmVhZF8tPmRldGFjaCgpOworICAgIAorICAgIC8vIFdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gc3RhcnQgYW5kIGdldCBmYXIgZW5vdWdoIHRvIGdyYWIgZXZlcnl0aGluZworICAgIC8vIHRoYXQgaXQgbmVlZHMgZnJvbSB0aGUgY2FsbGluZyBjb250ZXh0LCB0aHVzIGFic29sdmluZyB0aGUgY2FsbGVyCisgICAgLy8gZnJvbSBiZWluZyByZXF1aXJlZCB0byBob2xkIG9uIHRvIHJ1bm5hYmxlIGluZGVmaW5pdGVseS4KKyAgICBtb25pdG9yXy53YWl0KCk7CisgIH0KIAogICAvKioKLSAgICogSm9pbiB0aGlzIHRocmVhZC4gQ3VycmVudCB0aHJlYWQgYmxvY2tzIHVudGlsIHRoaXMgdGFyZ2V0IHRocmVhZAotICAgKiBjb21wbGV0ZXMuCisgICAqIEpvaW4gdGhpcyB0aHJlYWQuIElmIHRoaXMgdGhyZWFkIGlzIGpvaW5hYmxlLCB0aGUgY2FsbGluZyB0aHJlYWQgYmxvY2tzCisgICAqIHVudGlsIHRoaXMgdGhyZWFkIGNvbXBsZXRlcy4gIElmIHRoZSB0YXJnZXQgdGhyZWFkIGlzIG5vdCBqb2luYWJsZSwgdGhlbgorICAgKiBub3RoaW5nIGhhcHBlbnMuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgam9pbigpID0gMDsKKyAgdm9pZCBqb2luKCkgeworICAgIGlmICghZGV0YWNoZWRfICYmIHN0YXRlXyAhPSB1bmluaXRpYWxpemVkKSB7CisgICAgICB0aHJlYWRfLT5qb2luKCk7CisgICAgfQorICB9CiAKICAgLyoqCiAgICAqIEdldHMgdGhlIHRocmVhZCdzIHBsYXRmb3JtLXNwZWNpZmljIElECiAgICAqLwotICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSA9IDA7CisgIFRocmVhZDo6aWRfdCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIHRocmVhZF8uZ2V0KCkgPyB0aHJlYWRfLT5nZXRfaWQoKSA6IHN0ZDo6dGhyZWFkOjppZCgpOyB9CiAKICAgLyoqCiAgICAqIEdldHMgdGhlIHJ1bm5hYmxlIG9iamVjdCB0aGlzIHRocmVhZCBpcyBob3N0aW5nCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIF9ydW5uYWJsZTsgfQotCi1wcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBydW5uYWJsZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgX3J1bm5hYmxlID0gdmFsdWU7IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIF9ydW5uYWJsZTsgfQogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gX3J1bm5hYmxlOworICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IF9ydW5uYWJsZTsKKyAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dGhyZWFkPiB0aHJlYWRfOworICBNb25pdG9yIG1vbml0b3JfOworICBTVEFURSBzdGF0ZV87CisgIGJvb2wgZGV0YWNoZWRfOwogfTsKIAotLyoqCi0gKiBGYWN0b3J5IHRvIGNyZWF0ZSBwbGF0Zm9ybS1zcGVjaWZpYyB0aHJlYWQgb2JqZWN0IGFuZCBiaW5kIHRoZW0gdG8gUnVubmFibGUKLSAqIG9iamVjdCBmb3IgZXhlY3V0aW9uCi0gKi8KLWNsYXNzIFRocmVhZEZhY3RvcnkgewogCi1wdWJsaWM6Ci0gIHZpcnR1YWwgflRocmVhZEZhY3RvcnkoKSB7fQotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgPSAwOwotCi0gIC8qKiBHZXRzIHRoZSBjdXJyZW50IHRocmVhZCBpZCBvciB1bmtub3duX3RocmVhZF9pZCBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdGhyaWZ0IHRocmVhZAotICAgKi8KLQotICBzdGF0aWMgY29uc3QgVGhyZWFkOjppZF90IHVua25vd25fdGhyZWFkX2lkOwotCi0gIHZpcnR1YWwgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0ID0gMDsKLX07CiB9CiB9CiB9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnkuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlY2IzYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeS5jcHAKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gVGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gcmVzdWx0ID0gc3RkOjptYWtlX3NoYXJlZDxUaHJlYWQ+KGlzRGV0YWNoZWQoKSwgcnVubmFibGUpOworICBydW5uYWJsZS0+dGhyZWFkKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK1RocmVhZDo6aWRfdCBUaHJlYWRGYWN0b3J5OjpnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7CisgIHJldHVybiBzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTU0N2E2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnkuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURGQUNUT1JZX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFERkFDVE9SWV9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBGYWN0b3J5IHRvIGNyZWF0ZSB0aHJlYWQgb2JqZWN0IGFuZCBiaW5kIHRoZW0gdG8gUnVubmFibGUKKyAqIG9iamVjdCBmb3IgZXhlY3V0aW9uCisgKi8KK2NsYXNzIFRocmVhZEZhY3RvcnkgZmluYWwgeworcHVibGljOgorICAvKioKKyAgICogQWxsIHRocmVhZHMgY3JlYXRlZCBieSBhIGZhY3RvcnkgYXJlIHJlZmVyZW5jZS1jb3VudGVkCisgICAqIHZpYSBzdGQ6OnNoYXJlZF9wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQgdGhlIFJ1bm5hYmxlIHRhc2tzCisgICAqIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCisgICAqIHRvIGJvdGggaXMgZ2l2ZW4gdXAuCisgICAqCisgICAqIEJ5IGRlZmF1bHQgdGhyZWFkcyBhcmUgbm90IGpvaW5hYmxlLgorICAgKi8KKyAgVGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkID0gdHJ1ZSkgOiBkZXRhY2hlZF8oZGV0YWNoZWQpIHsgfQorCisgIH5UaHJlYWRGYWN0b3J5KCkgPSBkZWZhdWx0OworCisgIC8qKgorICAgKiBHZXRzIGN1cnJlbnQgZGV0YWNoZWQgbW9kZQorICAgKi8KKyAgYm9vbCBpc0RldGFjaGVkKCkgY29uc3QgeyByZXR1cm4gZGV0YWNoZWRfOyB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIGRldGFjaGVkIGRpc3Bvc2l0aW9uIG9mIG5ld2x5IGNyZWF0ZWQgdGhyZWFkcy4KKyAgICovCisgIHZvaWQgc2V0RGV0YWNoZWQoYm9vbCBkZXRhY2hlZCkgeyBkZXRhY2hlZF8gPSBkZXRhY2hlZDsgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgdGhyZWFkLgorICAgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0OworCisgIC8qKgorICAgKiBHZXRzIHRoZSBjdXJyZW50IHRocmVhZCBpZCBvciB1bmtub3duX3RocmVhZF9pZCBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdGhyaWZ0IHRocmVhZAorICAgKi8KKyAgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0OworCitwcml2YXRlOgorICBib29sIGRldGFjaGVkXzsKK307CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFERkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwCmluZGV4IGEyYjQ0ZDQuLjI1YjgzOGEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAKQEAgLTIyLDI0ICsyMiwyMCBAQAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxzZXQ+CiAKLSNpZiBkZWZpbmVkKERFQlVHKQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2VuZGlmIC8vIGRlZmluZWQoREVCVUcpCi0KIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgY29uY3VycmVuY3kgewogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6dW5pcXVlX3B0cjsKK3VzaW5nIHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q7CiAKIC8qKgogICogVGhyZWFkTWFuYWdlciBjbGFzcwpAQCAtNDksNiArNDUsOSBAQAogICogaXQgbWFpbnRhaW5zIHN0YXRpc3RpY3Mgb24gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcywgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLAogICogdGFzayBiYWNrbG9nLCBhbmQgYXZlcmFnZSB3YWl0IGFuZCBzZXJ2aWNlIHRpbWVzLgogICoKKyAqIFRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgbW9uaXRvcnMgdXNlZCBmb3Igc2lnbmFsaW5nIGRpZmZlcmVudCBjb25kaXRpb25zCisgKiBob3dldmVyIHRoZXkgYWxsIHNoYXJlIHRoZSBzYW1lIG11dGV4Xy4KKyAqCiAgKiBAdmVyc2lvbiAkSWQ6JAogICovCiBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpJbXBsIDogcHVibGljIFRocmVhZE1hbmFnZXIgewpAQCAtNjIsODAgKzYxLDk1IEBACiAgICAgICBleHBpcmVkQ291bnRfKDApLAogICAgICAgc3RhdGVfKFRocmVhZE1hbmFnZXI6OlVOSU5JVElBTElaRUQpLAogICAgICAgbW9uaXRvcl8oJm11dGV4XyksCi0gICAgICBtYXhNb25pdG9yXygmbXV0ZXhfKSB7fQorICAgICAgbWF4TW9uaXRvcl8oJm11dGV4XyksCisgICAgICB3b3JrZXJNb25pdG9yXygmbXV0ZXhfKSB7fQogCi0gIH5JbXBsKCkgeyBzdG9wKCk7IH0KKyAgfkltcGwoKSBvdmVycmlkZSB7IHN0b3AoKTsgfQogCi0gIHZvaWQgc3RhcnQoKTsKKyAgdm9pZCBzdGFydCgpIG92ZXJyaWRlOworICB2b2lkIHN0b3AoKSBvdmVycmlkZTsKIAotICB2b2lkIHN0b3AoKSB7IHN0b3BJbXBsKGZhbHNlKTsgfQorICBUaHJlYWRNYW5hZ2VyOjpTVEFURSBzdGF0ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHN0YXRlXzsgfQogCi0gIHZvaWQgam9pbigpIHsgc3RvcEltcGwodHJ1ZSk7IH0KLQotICBUaHJlYWRNYW5hZ2VyOjpTVEFURSBzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXzsgfQotCi0gIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0IHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CiAgICAgcmV0dXJuIHRocmVhZEZhY3RvcnlfOwogICB9CiAKLSAgdm9pZCB0aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdmFsdWUpIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIHZvaWQgdGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHZhbHVlKSBvdmVycmlkZSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIGlmICh0aHJlYWRGYWN0b3J5XyAmJiB0aHJlYWRGYWN0b3J5Xy0+aXNEZXRhY2hlZCgpICE9IHZhbHVlLT5pc0RldGFjaGVkKCkpIHsKKyAgICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KICAgICB0aHJlYWRGYWN0b3J5XyA9IHZhbHVlOwogICB9CiAKLSAgdm9pZCBhZGRXb3JrZXIoc2l6ZV90IHZhbHVlKTsKKyAgdm9pZCBhZGRXb3JrZXIoc2l6ZV90IHZhbHVlKSBvdmVycmlkZTsKIAotICB2b2lkIHJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUpOworICB2b2lkIHJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUpIG92ZXJyaWRlOwogCi0gIHNpemVfdCBpZGxlV29ya2VyQ291bnQoKSBjb25zdCB7IHJldHVybiBpZGxlQ291bnRfOyB9CisgIHNpemVfdCBpZGxlV29ya2VyQ291bnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBpZGxlQ291bnRfOyB9CiAKLSAgc2l6ZV90IHdvcmtlckNvdW50KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgc2l6ZV90IHdvcmtlckNvdW50KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKICAgICByZXR1cm4gd29ya2VyQ291bnRfOwogICB9CiAKLSAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnQoKSBjb25zdCB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CiAgICAgcmV0dXJuIHRhc2tzXy5zaXplKCk7CiAgIH0KIAotICBzaXplX3QgdG90YWxUYXNrQ291bnQoKSBjb25zdCB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICBzaXplX3QgdG90YWxUYXNrQ291bnQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgR3VhcmQgZyhtdXRleF8pOwogICAgIHJldHVybiB0YXNrc18uc2l6ZSgpICsgd29ya2VyQ291bnRfIC0gaWRsZUNvdW50XzsKICAgfQogCi0gIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgoKSBjb25zdCBvdmVycmlkZSB7CisgICAgR3VhcmQgZyhtdXRleF8pOwogICAgIHJldHVybiBwZW5kaW5nVGFza0NvdW50TWF4XzsKICAgfQogCi0gIHNpemVfdCBleHBpcmVkVGFza0NvdW50KCkgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBzaXplX3QgcmVzdWx0ID0gZXhwaXJlZENvdW50XzsKLSAgICBleHBpcmVkQ291bnRfID0gMDsKLSAgICByZXR1cm4gcmVzdWx0OworICBzaXplX3QgZXhwaXJlZFRhc2tDb3VudCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcmV0dXJuIGV4cGlyZWRDb3VudF87CiAgIH0KIAogICB2b2lkIHBlbmRpbmdUYXNrQ291bnRNYXgoY29uc3Qgc2l6ZV90IHZhbHVlKSB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIEd1YXJkIGcobXV0ZXhfKTsKICAgICBwZW5kaW5nVGFza0NvdW50TWF4XyA9IHZhbHVlOwogICB9CiAKLSAgYm9vbCBjYW5TbGVlcCgpOworICB2b2lkIGFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSwgaW50NjRfdCB0aW1lb3V0LCBpbnQ2NF90IGV4cGlyYXRpb24pIG92ZXJyaWRlOwogCi0gIHZvaWQgYWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlLCBpbnQ2NF90IHRpbWVvdXQsIGludDY0X3QgZXhwaXJhdGlvbik7CisgIHZvaWQgcmVtb3ZlKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIG92ZXJyaWRlOwogCi0gIHZvaWQgcmVtb3ZlKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spOworICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiByZW1vdmVOZXh0UGVuZGluZygpIG92ZXJyaWRlOwogCi0gIHNoYXJlZF9wdHI8UnVubmFibGU+IHJlbW92ZU5leHRQZW5kaW5nKCk7CisgIHZvaWQgcmVtb3ZlRXhwaXJlZFRhc2tzKCkgb3ZlcnJpZGUgeworICAgIHJlbW92ZUV4cGlyZWQoZmFsc2UpOworICB9CiAKLSAgdm9pZCByZW1vdmVFeHBpcmVkVGFza3MoKTsKLQotICB2b2lkIHNldEV4cGlyZUNhbGxiYWNrKEV4cGlyZUNhbGxiYWNrIGV4cGlyZUNhbGxiYWNrKTsKKyAgdm9pZCBzZXRFeHBpcmVDYWxsYmFjayhFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFjaykgb3ZlcnJpZGU7CiAKIHByaXZhdGU6Ci0gIHZvaWQgc3RvcEltcGwoYm9vbCBqb2luKTsKKyAgLyoqCisgICAqIFJlbW92ZSBvbmUgb3IgbW9yZSBleHBpcmVkIHRhc2tzLgorICAgKiBccGFyYW1baW5dICBqdXN0T25lICBpZiB0cnVlLCB0cnkgdG8gcmVtb3ZlIGp1c3Qgb25lIHRhc2sgYW5kIHJldHVybgorICAgKi8KKyAgdm9pZCByZW1vdmVFeHBpcmVkKGJvb2wganVzdE9uZSk7CisKKyAgLyoqCisgICAqIFxyZXR1cm5zIHdoZXRoZXIgaXQgaXMgYWNjZXB0YWJsZSB0byBibG9jaywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHRocmVhZCBpZAorICAgKi8KKyAgYm9vbCBjYW5TbGVlcCgpIGNvbnN0OworCisgIC8qKgorICAgKiBMb3dlcnMgdGhlIG1heGltdW0gd29ya2VyIGNvdW50IGFuZCBibG9ja3MgdW50aWwgZW5vdWdoIHdvcmtlciB0aHJlYWRzIGNvbXBsZXRlCisgICAqIHRvIGdldCB0byB0aGUgbmV3IG1heGltdW0gd29ya2VyIGxpbWl0LiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWNxdWlyaW5nCisgICAqIGEgbG9jayBvbiB0aGUgY2xhc3MgbXV0ZXhfLgorICAgKi8KKyAgdm9pZCByZW1vdmVXb3JrZXJzVW5kZXJMb2NrKHNpemVfdCB2YWx1ZSk7CiAKICAgc2l6ZV90IHdvcmtlckNvdW50XzsKICAgc2l6ZV90IHdvcmtlck1heENvdW50XzsKQEAgLTE0OCwxMSArMTYyLDEyIEBACiAgIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87CiAKICAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OlRhc2s7Ci0gIHN0ZDo6cXVldWU8c2hhcmVkX3B0cjxUYXNrPiA+IHRhc2tzXzsKKyAgdHlwZWRlZiBzdGQ6OmRlcXVlPHNoYXJlZF9wdHI8VGFzaz4gPiBUYXNrUXVldWU7CisgIFRhc2tRdWV1ZSB0YXNrc187CiAgIE11dGV4IG11dGV4XzsKICAgTW9uaXRvciBtb25pdG9yXzsKICAgTW9uaXRvciBtYXhNb25pdG9yXzsKLSAgTW9uaXRvciB3b3JrZXJNb25pdG9yXzsKKyAgTW9uaXRvciB3b3JrZXJNb25pdG9yXzsgICAgICAgLy8gdXNlZCB0byBzeW5jaHJvbml6ZSBjaGFuZ2VzIGluIHdvcmtlciBjb3VudAogCiAgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI7CiAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IHdvcmtlcnNfOwpAQCAtMTYzLDE2ICsxNzgsMTkgQEAKIGNsYXNzIFRocmVhZE1hbmFnZXI6OlRhc2sgOiBwdWJsaWMgUnVubmFibGUgewogCiBwdWJsaWM6Ci0gIGVudW0gU1RBVEUgeyBXQUlUSU5HLCBFWEVDVVRJTkcsIENBTkNFTExFRCwgQ09NUExFVEUgfTsKKyAgZW51bSBTVEFURSB7IFdBSVRJTkcsIEVYRUNVVElORywgVElNRURPVVQsIENPTVBMRVRFIH07CiAKLSAgVGFzayhzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSwgaW50NjRfdCBleHBpcmF0aW9uID0gMExMKQorICBUYXNrKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlLCB1aW50NjRfdCBleHBpcmF0aW9uID0gMFVMTCkKICAgICA6IHJ1bm5hYmxlXyhydW5uYWJsZSksCi0gICAgICBzdGF0ZV8oV0FJVElORyksCi0gICAgICBleHBpcmVUaW1lXyhleHBpcmF0aW9uICE9IDBMTCA/IFV0aWw6OmN1cnJlbnRUaW1lKCkgKyBleHBpcmF0aW9uIDogMExMKSB7fQorICAgICAgc3RhdGVfKFdBSVRJTkcpIHsKKyAgICAgICAgaWYgKGV4cGlyYXRpb24gIT0gMFVMTCkgeworICAgICAgICAgIGV4cGlyZVRpbWVfLnJlc2V0KG5ldyBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhleHBpcmF0aW9uKSkpOworICAgICAgICB9CisgICAgfQogCi0gIH5UYXNrKCkge30KKyAgflRhc2soKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKLSAgdm9pZCBydW4oKSB7CisgIHZvaWQgcnVuKCkgb3ZlcnJpZGUgewogICAgIGlmIChzdGF0ZV8gPT0gRVhFQ1VUSU5HKSB7CiAgICAgICBydW5uYWJsZV8tPnJ1bigpOwogICAgICAgc3RhdGVfID0gQ09NUExFVEU7CkBAIC0xODEsMjIgKzE5OSwyMiBAQAogCiAgIHNoYXJlZF9wdHI8UnVubmFibGU+IGdldFJ1bm5hYmxlKCkgeyByZXR1cm4gcnVubmFibGVfOyB9CiAKLSAgaW50NjRfdCBnZXRFeHBpcmVUaW1lKCkgY29uc3QgeyByZXR1cm4gZXhwaXJlVGltZV87IH0KKyAgY29uc3QgdW5pcXVlX3B0cjxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50PiAmIGdldEV4cGlyZVRpbWUoKSBjb25zdCB7IHJldHVybiBleHBpcmVUaW1lXzsgfQogCiBwcml2YXRlOgogICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZV87CiAgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI7CiAgIFNUQVRFIHN0YXRlXzsKLSAgaW50NjRfdCBleHBpcmVUaW1lXzsKKyAgdW5pcXVlX3B0cjxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50PiBleHBpcmVUaW1lXzsKIH07CiAKIGNsYXNzIFRocmVhZE1hbmFnZXI6OldvcmtlciA6IHB1YmxpYyBSdW5uYWJsZSB7CiAgIGVudW0gU1RBVEUgeyBVTklOSVRJQUxJWkVELCBTVEFSVElORywgU1RBUlRFRCwgU1RPUFBJTkcsIFNUT1BQRUQgfTsKIAogcHVibGljOgotICBXb3JrZXIoVGhyZWFkTWFuYWdlcjo6SW1wbCogbWFuYWdlcikgOiBtYW5hZ2VyXyhtYW5hZ2VyKSwgc3RhdGVfKFVOSU5JVElBTElaRUQpLCBpZGxlXyhmYWxzZSkge30KKyAgV29ya2VyKFRocmVhZE1hbmFnZXI6OkltcGwqIG1hbmFnZXIpIDogbWFuYWdlcl8obWFuYWdlciksIHN0YXRlXyhVTklOSVRJQUxJWkVEKSB7fQogCi0gIH5Xb3JrZXIoKSB7fQorICB+V29ya2VyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiBwcml2YXRlOgogICBib29sIGlzQWN0aXZlKCkgY29uc3QgewpAQCAtMjExLDgzICsyMjksODMgQEAKICAgICogQXMgbG9uZyBhcyB3b3JrZXIgdGhyZWFkIGlzIHJ1bm5pbmcsIHB1bGwgdGFza3Mgb2ZmIHRoZSB0YXNrIHF1ZXVlIGFuZAogICAgKiBleGVjdXRlLgogICAgKi8KLSAgdm9pZCBydW4oKSB7Ci0gICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKLSAgICBib29sIG5vdGlmeU1hbmFnZXIgPSBmYWxzZTsKKyAgdm9pZCBydW4oKSBvdmVycmlkZSB7CisgICAgR3VhcmQgZyhtYW5hZ2VyXy0+bXV0ZXhfKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyB0aHJlZSBwYXJ0czsgb25lIGlzIHRvIGNoZWNrIGZvciBhbmQgYWNjb3VudCBmb3IKKyAgICAgKiBhZG1pdHRpbmcgYSB0YXNrIHdoaWNoIGhhcHBlbnMgdW5kZXIgYSBsb2NrLiAgVGhlbiB0aGUgbG9jayBpcyByZWxlYXNlZAorICAgICAqIGFuZCB0aGUgdGFzayBpdHNlbGYgaXMgZXhlY3V0ZWQuICBGaW5hbGx5IHdlIGRvIHNvbWUgYWNjb3VudGluZworICAgICAqIHVuZGVyIGxvY2sgYWdhaW4gd2hlbiB0aGUgdGFzayBjb21wbGV0ZXMuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBBZG1pdHRpbmcKKyAgICAgKi8KIAogICAgIC8qKgogICAgICAqIEluY3JlbWVudCB3b3JrZXIgc2VtYXBob3JlIGFuZCBub3RpZnkgbWFuYWdlciBpZiB3b3JrZXIgY291bnQgcmVhY2hlZAogICAgICAqIGRlc2lyZWQgbWF4Ci0gICAgICoKLSAgICAgKiBOb3RlOiBXZSBoYXZlIHRvIHJlbGVhc2UgdGhlIG1vbml0b3IgYW5kIGFjcXVpcmUgdGhlIHdvcmtlck1vbml0b3IKLSAgICAgKiBzaW5jZSB0aGF0IGlzIHdoYXQgdGhlIG1hbmFnZXIgYmxvY2tzIG9uIGZvciB3b3JrZXIgYWRkL3JlbW92ZQogICAgICAqLwotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT5tb25pdG9yXyk7Ci0gICAgICBhY3RpdmUgPSBtYW5hZ2VyXy0+d29ya2VyQ291bnRfIDwgbWFuYWdlcl8tPndvcmtlck1heENvdW50XzsKLSAgICAgIGlmIChhY3RpdmUpIHsKLSAgICAgICAgbWFuYWdlcl8tPndvcmtlckNvdW50XysrOwotICAgICAgICBub3RpZnlNYW5hZ2VyID0gbWFuYWdlcl8tPndvcmtlckNvdW50XyA9PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfOworICAgIGJvb2wgYWN0aXZlID0gbWFuYWdlcl8tPndvcmtlckNvdW50XyA8IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF87CisgICAgaWYgKGFjdGl2ZSkgeworICAgICAgaWYgKCsrbWFuYWdlcl8tPndvcmtlckNvdW50XyA9PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfKSB7CisgICAgICAgIG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXy5ub3RpZnkoKTsKICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobm90aWZ5TWFuYWdlcikgewotICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPndvcmtlck1vbml0b3JfKTsKLSAgICAgIG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgIG5vdGlmeU1hbmFnZXIgPSBmYWxzZTsKLSAgICB9Ci0KICAgICB3aGlsZSAoYWN0aXZlKSB7CisgICAgICAvKioKKyAgICAgICAgKiBXaGlsZSBob2xkaW5nIG1hbmFnZXIgbW9uaXRvciBibG9jayBmb3Igbm9uLWVtcHR5IHRhc2sgcXVldWUgKEFsc28KKyAgICAgICAgKiBjaGVjayB0aGF0IHRoZSB0aHJlYWQgaGFzbid0IGJlZW4gcmVxdWVzdGVkIHRvIHN0b3ApLiBPbmNlIHRoZSBxdWV1ZQorICAgICAgICAqIGlzIG5vbi1lbXB0eSwgZGVxdWV1ZSBhIHRhc2ssIHJlbGVhc2UgbW9uaXRvciwgYW5kIGV4ZWN1dGUuIElmIHRoZQorICAgICAgICAqIHdvcmtlciBtYXggY291bnQgaGFzIGJlZW4gZGVjcmVtZW50ZWQgc3VjaCB0aGF0IHdlIGV4Y2VlZCBpdCwgbWFyaworICAgICAgICAqIG91cnNlbGYgaW5hY3RpdmUsIGRlY3JlbWVudCB0aGUgd29ya2VyIGNvdW50IGFuZCBub3RpZnkgdGhlIG1hbmFnZXIKKyAgICAgICAgKiAodGVjaG5pY2FsbHkgd2UncmUgbm90aWZ5aW5nIHRoZSBuZXh0IGJsb2NrZWQgdGhyZWFkIGJ1dCBldmVudHVhbGx5CisgICAgICAgICogdGhlIG1hbmFnZXIgd2lsbCBzZWUgaXQuCisgICAgICAgICovCisgICAgICBhY3RpdmUgPSBpc0FjdGl2ZSgpOworCisgICAgICB3aGlsZSAoYWN0aXZlICYmIG1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSkgeworICAgICAgICBtYW5hZ2VyXy0+aWRsZUNvdW50XysrOworICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ud2FpdCgpOworICAgICAgICBhY3RpdmUgPSBpc0FjdGl2ZSgpOworICAgICAgICBtYW5hZ2VyXy0+aWRsZUNvdW50Xy0tOworICAgICAgfQorCiAgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+IHRhc2s7CiAKLSAgICAgIC8qKgotICAgICAgICogV2hpbGUgaG9sZGluZyBtYW5hZ2VyIG1vbml0b3IgYmxvY2sgZm9yIG5vbi1lbXB0eSB0YXNrIHF1ZXVlIChBbHNvCi0gICAgICAgKiBjaGVjayB0aGF0IHRoZSB0aHJlYWQgaGFzbid0IGJlZW4gcmVxdWVzdGVkIHRvIHN0b3ApLiBPbmNlIHRoZSBxdWV1ZQotICAgICAgICogaXMgbm9uLWVtcHR5LCBkZXF1ZXVlIGEgdGFzaywgcmVsZWFzZSBtb25pdG9yLCBhbmQgZXhlY3V0ZS4gSWYgdGhlCi0gICAgICAgKiB3b3JrZXIgbWF4IGNvdW50IGhhcyBiZWVuIGRlY3JlbWVudGVkIHN1Y2ggdGhhdCB3ZSBleGNlZWQgaXQsIG1hcmsKLSAgICAgICAqIG91cnNlbGYgaW5hY3RpdmUsIGRlY3JlbWVudCB0aGUgd29ya2VyIGNvdW50IGFuZCBub3RpZnkgdGhlIG1hbmFnZXIKLSAgICAgICAqICh0ZWNobmljYWxseSB3ZSdyZSBub3RpZnlpbmcgdGhlIG5leHQgYmxvY2tlZCB0aHJlYWQgYnV0IGV2ZW50dWFsbHkKLSAgICAgICAqIHRoZSBtYW5hZ2VyIHdpbGwgc2VlIGl0LgotICAgICAgICovCi0gICAgICB7Ci0gICAgICAgIEd1YXJkIGcobWFuYWdlcl8tPm11dGV4Xyk7Ci0gICAgICAgIGFjdGl2ZSA9IGlzQWN0aXZlKCk7Ci0KLSAgICAgICAgd2hpbGUgKGFjdGl2ZSAmJiBtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpIHsKLSAgICAgICAgICBtYW5hZ2VyXy0+aWRsZUNvdW50XysrOwotICAgICAgICAgIGlkbGVfID0gdHJ1ZTsKLSAgICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ud2FpdCgpOwotICAgICAgICAgIGFjdGl2ZSA9IGlzQWN0aXZlKCk7Ci0gICAgICAgICAgaWRsZV8gPSBmYWxzZTsKLSAgICAgICAgICBtYW5hZ2VyXy0+aWRsZUNvdW50Xy0tOworICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBpZiAoIW1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSkgeworICAgICAgICAgIHRhc2sgPSBtYW5hZ2VyXy0+dGFza3NfLmZyb250KCk7CisgICAgICAgICAgbWFuYWdlcl8tPnRhc2tzXy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlRhc2s6OldBSVRJTkcpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBjaGFuZ2VkIHRvIGFueXRoaW5nIG90aGVyIHRoYW4gRVhFQ1VUSU5HIG9yIFRJTUVET1VUIGhlcmUKKyAgICAgICAgICAgIC8vIHRoZW4gdGhlIGV4ZWN1dGlvbiBsb29wIG5lZWRzIHRvIGJlIGNoYW5nZWQgYmVsb3cuCisgICAgICAgICAgICB0YXNrLT5zdGF0ZV8gPQorICAgICAgICAgICAgICAgICh0YXNrLT5nZXRFeHBpcmVUaW1lKCkgJiYgKih0YXNrLT5nZXRFeHBpcmVUaW1lKCkpIDwgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkpID8KKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkTWFuYWdlcjo6VGFzazo6VElNRURPVVQgOgorICAgICAgICAgICAgICAgICAgICBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkc7CisgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGFjdGl2ZSkgewotICAgICAgICAgIG1hbmFnZXJfLT5yZW1vdmVFeHBpcmVkVGFza3MoKTsKLQotICAgICAgICAgIGlmICghbWFuYWdlcl8tPnRhc2tzXy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICB0YXNrID0gbWFuYWdlcl8tPnRhc2tzXy5mcm9udCgpOwotICAgICAgICAgICAgbWFuYWdlcl8tPnRhc2tzXy5wb3AoKTsKLSAgICAgICAgICAgIGlmICh0YXNrLT5zdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VGFzazo6V0FJVElORykgewotICAgICAgICAgICAgICB0YXNrLT5zdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogSWYgd2UgaGF2ZSBhIHBlbmRpbmcgdGFzayBtYXggYW5kIHdlIGp1c3QgZHJvcHBlZCBiZWxvdyBpdCwgd2FrZXVwIGFueQotICAgICAgICAgICAgIHRocmVhZCB0aGF0IG1pZ2h0IGJlIGJsb2NrZWQgb24gYWRkLiAqLwotICAgICAgICAgIGlmIChtYW5hZ2VyXy0+cGVuZGluZ1Rhc2tDb3VudE1heF8gIT0gMAotICAgICAgICAgICAgICAgICAgJiYgbWFuYWdlcl8tPnRhc2tzXy5zaXplKCkgPD0gbWFuYWdlcl8tPnBlbmRpbmdUYXNrQ291bnRNYXhfIC0gMSkgewotICAgICAgICAgICAgICBtYW5hZ2VyXy0+bWF4TW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlkbGVfID0gdHJ1ZTsKLSAgICAgICAgICBtYW5hZ2VyXy0+d29ya2VyQ291bnRfLS07Ci0gICAgICAgICAgbm90aWZ5TWFuYWdlciA9IChtYW5hZ2VyXy0+d29ya2VyQ291bnRfID09IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF8pOworICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgcGVuZGluZyB0YXNrIG1heCBhbmQgd2UganVzdCBkcm9wcGVkIGJlbG93IGl0LCB3YWtldXAgYW55CisgICAgICAgICAgICB0aHJlYWQgdGhhdCBtaWdodCBiZSBibG9ja2VkIG9uIGFkZC4gKi8KKyAgICAgICAgaWYgKG1hbmFnZXJfLT5wZW5kaW5nVGFza0NvdW50TWF4XyAhPSAwCisgICAgICAgICAgICAmJiBtYW5hZ2VyXy0+dGFza3NfLnNpemUoKSA8PSBtYW5hZ2VyXy0+cGVuZGluZ1Rhc2tDb3VudE1heF8gLSAxKSB7CisgICAgICAgICAgbWFuYWdlcl8tPm1heE1vbml0b3JfLm5vdGlmeSgpOwogICAgICAgICB9CiAgICAgICB9CiAKKyAgICAgIC8qKgorICAgICAgICogRXhlY3V0aW9uIC0gbm90IGhvbGRpbmcgYSBsb2NrCisgICAgICAgKi8KICAgICAgIGlmICh0YXNrKSB7CiAgICAgICAgIGlmICh0YXNrLT5zdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VGFzazo6RVhFQ1VUSU5HKSB7CisKKyAgICAgICAgICAvLyBSZWxlYXNlIHRoZSBsb2NrIHNvIHdlIGNhbiBydW4gdGhlIHRhc2sgd2l0aG91dCBibG9ja2luZyB0aGUgdGhyZWFkIG1hbmFnZXIKKyAgICAgICAgICBtYW5hZ2VyXy0+bXV0ZXhfLnVubG9jaygpOworCiAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHRhc2stPnJ1bigpOwogICAgICAgICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CkBAIC0yOTUsMTQ4ICszMTMsMTM3IEBACiAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJbRVJST1JdIHRhc2stPnJ1bigpIHJhaXNlZCBhbiB1bmtub3duIGV4Y2VwdGlvbiIpOwogICAgICAgICAgIH0KKworICAgICAgICAgIC8vIFJlLWFjcXVpcmUgdGhlIGxvY2sgdG8gcHJvY2VlZCBpbiB0aGUgdGhyZWFkIG1hbmFnZXIKKyAgICAgICAgICBtYW5hZ2VyXy0+bXV0ZXhfLmxvY2soKTsKKworICAgICAgICB9IGVsc2UgaWYgKG1hbmFnZXJfLT5leHBpcmVDYWxsYmFja18pIHsKKyAgICAgICAgICAvLyBUaGUgb25seSBvdGhlciBzdGF0ZSB0aGUgdGFzayBjb3VsZCBoYXZlIGJlZW4gaW4gaXMgVElNRURPVVQgKHNlZSBhYm92ZSkKKyAgICAgICAgICBtYW5hZ2VyXy0+ZXhwaXJlQ2FsbGJhY2tfKHRhc2stPmdldFJ1bm5hYmxlKCkpOworICAgICAgICAgIG1hbmFnZXJfLT5leHBpcmVkQ291bnRfKys7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKLSAgICB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8pOwotICAgICAgbWFuYWdlcl8tPmRlYWRXb3JrZXJzXy5pbnNlcnQodGhpcy0+dGhyZWFkKCkpOwotICAgICAgaWYgKG5vdGlmeU1hbmFnZXIpIHsKLSAgICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOwotICAgICAgfQorICAgIC8qKgorICAgICAqIEZpbmFsIGFjY291bnRpbmcgZm9yIHRoZSB3b3JrZXIgdGhyZWFkIHRoYXQgaXMgZG9uZSB3b3JraW5nCisgICAgICovCisgICAgbWFuYWdlcl8tPmRlYWRXb3JrZXJzXy5pbnNlcnQodGhpcy0+dGhyZWFkKCkpOworICAgIGlmICgtLW1hbmFnZXJfLT53b3JrZXJDb3VudF8gPT0gbWFuYWdlcl8tPndvcmtlck1heENvdW50XykgeworICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOwogICAgIH0KLQotICAgIHJldHVybjsKICAgfQogCiBwcml2YXRlOgogICBUaHJlYWRNYW5hZ2VyOjpJbXBsKiBtYW5hZ2VyXzsKICAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OkltcGw7CiAgIFNUQVRFIHN0YXRlXzsKLSAgYm9vbCBpZGxlXzsKIH07CiAKIHZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkV29ya2VyKHNpemVfdCB2YWx1ZSkgewogICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiBuZXdUaHJlYWRzOwogICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgdmFsdWU7IGl4KyspIHsKICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4gd29ya2VyCi0gICAgICAgID0gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpXb3JrZXI+KG5ldyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXIodGhpcykpOworICAgICAgICA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGhyZWFkTWFuYWdlcjo6V29ya2VyPih0aGlzKTsKICAgICBuZXdUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5Xy0+bmV3VGhyZWFkKHdvcmtlcikpOwogICB9CiAKLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICB3b3JrZXJNYXhDb3VudF8gKz0gdmFsdWU7Ci0gICAgd29ya2Vyc18uaW5zZXJ0KG5ld1RocmVhZHMuYmVnaW4oKSwgbmV3VGhyZWFkcy5lbmQoKSk7Ci0gIH0KKyAgR3VhcmQgZyhtdXRleF8pOworICB3b3JrZXJNYXhDb3VudF8gKz0gdmFsdWU7CisgIHdvcmtlcnNfLmluc2VydChuZXdUaHJlYWRzLmJlZ2luKCksIG5ld1RocmVhZHMuZW5kKCkpOwogCi0gIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gbmV3VGhyZWFkcy5iZWdpbigpOyBpeCAhPSBuZXdUaHJlYWRzLmVuZCgpOwotICAgICAgICsraXgpIHsKKyAgZm9yIChjb25zdCBhdXRvICYgbmV3VGhyZWFkIDogbmV3VGhyZWFkcykgewogICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6V29ya2VyPiB3b3JrZXIKLSAgICAgICAgPSBkeW5hbWljX3BvaW50ZXJfY2FzdDxUaHJlYWRNYW5hZ2VyOjpXb3JrZXIsIFJ1bm5hYmxlPigoKml4KS0+cnVubmFibGUoKSk7CisgICAgICAgID0gZHluYW1pY19wb2ludGVyX2Nhc3Q8VGhyZWFkTWFuYWdlcjo6V29ya2VyLCBSdW5uYWJsZT4obmV3VGhyZWFkLT5ydW5uYWJsZSgpKTsKICAgICB3b3JrZXItPnN0YXRlXyA9IFRocmVhZE1hbmFnZXI6Oldvcmtlcjo6U1RBUlRJTkc7Ci0gICAgKCppeCktPnN0YXJ0KCk7Ci0gICAgaWRNYXBfLmluc2VydChzdGQ6OnBhaXI8Y29uc3QgVGhyZWFkOjppZF90LCBzaGFyZWRfcHRyPFRocmVhZD4gPigoKml4KS0+Z2V0SWQoKSwgKml4KSk7CisgICAgbmV3VGhyZWFkLT5zdGFydCgpOworICAgIGlkTWFwXy5pbnNlcnQoc3RkOjpwYWlyPGNvbnN0IFRocmVhZDo6aWRfdCwgc2hhcmVkX3B0cjxUaHJlYWQ+ID4obmV3VGhyZWFkLT5nZXRJZCgpLCBuZXdUaHJlYWQpKTsKICAgfQogCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyh3b3JrZXJNb25pdG9yXyk7Ci0gICAgd2hpbGUgKHdvcmtlckNvdW50XyAhPSB3b3JrZXJNYXhDb3VudF8pIHsKLSAgICAgIHdvcmtlck1vbml0b3JfLndhaXQoKTsKLSAgICB9CisgIHdoaWxlICh3b3JrZXJDb3VudF8gIT0gd29ya2VyTWF4Q291bnRfKSB7CisgICAgd29ya2VyTW9uaXRvcl8ud2FpdCgpOwogICB9CiB9CiAKIHZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RhcnQoKSB7Ci0KKyAgR3VhcmQgZyhtdXRleF8pOwogICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKICAgICByZXR1cm47CiAgIH0KIAotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmIChzdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VU5JTklUSUFMSVpFRCkgewotICAgICAgaWYgKCF0aHJlYWRGYWN0b3J5XykgewotICAgICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQ7Ci0gICAgICBtb25pdG9yXy5ub3RpZnlBbGwoKTsKKyAgaWYgKHN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSB7CisgICAgaWYgKCF0aHJlYWRGYWN0b3J5XykgeworICAgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgfQorICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQ7CisgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7CisgIH0KIAotICAgIHdoaWxlIChzdGF0ZV8gPT0gU1RBUlRJTkcpIHsKLSAgICAgIG1vbml0b3JfLndhaXQoKTsKLSAgICB9CisgIHdoaWxlIChzdGF0ZV8gPT0gU1RBUlRJTkcpIHsKKyAgICBtb25pdG9yXy53YWl0KCk7CiAgIH0KIH0KIAotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdG9wSW1wbChib29sIGpvaW4pIHsKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RvcCgpIHsKKyAgR3VhcmQgZyhtdXRleF8pOwogICBib29sIGRvU3RvcCA9IGZhbHNlOwotICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKLSAgICByZXR1cm47Ci0gIH0KIAotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RPUFBJTkcgJiYgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OkpPSU5JTkcKLSAgICAgICAgJiYgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKLSAgICAgIGRvU3RvcCA9IHRydWU7Ci0gICAgICBzdGF0ZV8gPSBqb2luID8gVGhyZWFkTWFuYWdlcjo6Sk9JTklORyA6IFRocmVhZE1hbmFnZXI6OlNUT1BQSU5HOwotICAgIH0KKyAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUElORyAmJiBzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6Sk9JTklORworICAgICAgJiYgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKKyAgICBkb1N0b3AgPSB0cnVlOworICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OkpPSU5JTkc7CiAgIH0KIAogICBpZiAoZG9TdG9wKSB7Ci0gICAgcmVtb3ZlV29ya2VyKHdvcmtlckNvdW50Xyk7CisgICAgcmVtb3ZlV29ya2Vyc1VuZGVyTG9jayh3b3JrZXJDb3VudF8pOwogICB9CiAKLSAgLy8gWFhYCi0gIC8vIHNob3VsZCBiZSBhYmxlIHRvIGJsb2NrIGhlcmUgZm9yIHRyYW5zaXRpb24gdG8gU1RPUFBFRCBzaW5jZSB3ZSdyZSBubwotICAvLyB1c2luZyBzaGFyZWRfcHRycwotCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6U1RPUFBFRDsKLSAgfQorICBzdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEOwogfQogCiB2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUpIHsKLSAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gcmVtb3ZlZFRocmVhZHM7Ci0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgaWYgKHZhbHVlID4gd29ya2VyTWF4Q291bnRfKSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICB3b3JrZXJNYXhDb3VudF8gLT0gdmFsdWU7Ci0KLSAgICBpZiAoaWRsZUNvdW50XyA8IHZhbHVlKSB7Ci0gICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgaWRsZUNvdW50XzsgaXgrKykgewotICAgICAgICBtb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7Ci0gICAgfQotICB9Ci0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKHdvcmtlck1vbml0b3JfKTsKLQotICAgIHdoaWxlICh3b3JrZXJDb3VudF8gIT0gd29ya2VyTWF4Q291bnRfKSB7Ci0gICAgICB3b3JrZXJNb25pdG9yXy53YWl0KCk7Ci0gICAgfQotCi0gICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBkZWFkV29ya2Vyc18uYmVnaW4oKTsKLSAgICAgICAgIGl4ICE9IGRlYWRXb3JrZXJzXy5lbmQoKTsKLSAgICAgICAgICsraXgpIHsKLSAgICAgIGlkTWFwXy5lcmFzZSgoKml4KS0+Z2V0SWQoKSk7Ci0gICAgICB3b3JrZXJzXy5lcmFzZSgqaXgpOwotICAgIH0KLQotICAgIGRlYWRXb3JrZXJzXy5jbGVhcigpOwotICB9CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgcmVtb3ZlV29ya2Vyc1VuZGVyTG9jayh2YWx1ZSk7CiB9CiAKLWJvb2wgVGhyZWFkTWFuYWdlcjo6SW1wbDo6Y2FuU2xlZXAoKSB7Cit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZVdvcmtlcnNVbmRlckxvY2soc2l6ZV90IHZhbHVlKSB7CisgIGlmICh2YWx1ZSA+IHdvcmtlck1heENvdW50XykgeworICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOworICB9CisKKyAgd29ya2VyTWF4Q291bnRfIC09IHZhbHVlOworCisgIGlmIChpZGxlQ291bnRfID4gdmFsdWUpIHsKKyAgICAvLyBUaGVyZSBhcmUgbW9yZSBpZGxlIHdvcmtlcnMgdGhhbiB3ZSBuZWVkIHRvIHJlbW92ZSwKKyAgICAvLyBzbyBub3RpZnkgZW5vdWdoIG9mIHRoZW0gc28gdGhleSBjYW4gdGVybWluYXRlLgorICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCB2YWx1ZTsgaXgrKykgeworICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIFRoZXJlIGFyZSBhcyBtYW55IG9yIGxlc3MgaWRsZSB3b3JrZXJzIHRoYW4gd2UgbmVlZCB0byByZW1vdmUsCisgICAgLy8gc28ganVzdCBub3RpZnkgdGhlbSBhbGwgc28gdGhleSBjYW4gdGVybWluYXRlLgorICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOworICB9CisKKyAgd2hpbGUgKHdvcmtlckNvdW50XyAhPSB3b3JrZXJNYXhDb3VudF8pIHsKKyAgICB3b3JrZXJNb25pdG9yXy53YWl0KCk7CisgIH0KKworICBmb3IgKGNvbnN0IGF1dG8gJiBkZWFkV29ya2VyIDogZGVhZFdvcmtlcnNfKSB7CisKKyAgICAvLyB3aGVuIHVzZWQgd2l0aCBhIGpvaW5hYmxlIHRocmVhZCBmYWN0b3J5LCB3ZSBqb2luIHRoZSB0aHJlYWRzIGFzIHdlIHJlbW92ZSB0aGVtCisgICAgaWYgKCF0aHJlYWRGYWN0b3J5Xy0+aXNEZXRhY2hlZCgpKSB7CisgICAgICBkZWFkV29ya2VyLT5qb2luKCk7CisgICAgfQorCisgICAgaWRNYXBfLmVyYXNlKGRlYWRXb3JrZXItPmdldElkKCkpOworICAgIHdvcmtlcnNfLmVyYXNlKGRlYWRXb3JrZXIpOworICB9CisKKyAgZGVhZFdvcmtlcnNfLmNsZWFyKCk7Cit9CisKK2Jvb2wgVGhyZWFkTWFuYWdlcjo6SW1wbDo6Y2FuU2xlZXAoKSBjb25zdCB7CiAgIGNvbnN0IFRocmVhZDo6aWRfdCBpZCA9IHRocmVhZEZhY3RvcnlfLT5nZXRDdXJyZW50VGhyZWFkSWQoKTsKICAgcmV0dXJuIGlkTWFwXy5maW5kKGlkKSA9PSBpZE1hcF8uZW5kKCk7CiB9CkBAIC00NTQsNyArNDYxLDExIEBACiAgICAgICAgICJub3Qgc3RhcnRlZCIpOwogICB9CiAKLSAgcmVtb3ZlRXhwaXJlZFRhc2tzKCk7CisgIC8vIGlmIHdlJ3JlIGF0IGEgbGltaXQsIHJlbW92ZSBhbiBleHBpcmVkIHRhc2sgdG8gc2VlIGlmIHRoZSBsaW1pdCBjbGVhcnMKKyAgaWYgKHBlbmRpbmdUYXNrQ291bnRNYXhfID4gMCAmJiAodGFza3NfLnNpemUoKSA+PSBwZW5kaW5nVGFza0NvdW50TWF4XykpIHsKKyAgICByZW1vdmVFeHBpcmVkKHRydWUpOworICB9CisKICAgaWYgKHBlbmRpbmdUYXNrQ291bnRNYXhfID4gMCAmJiAodGFza3NfLnNpemUoKSA+PSBwZW5kaW5nVGFza0NvdW50TWF4XykpIHsKICAgICBpZiAoY2FuU2xlZXAoKSAmJiB0aW1lb3V0ID49IDApIHsKICAgICAgIHdoaWxlIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgdGFza3NfLnNpemUoKSA+PSBwZW5kaW5nVGFza0NvdW50TWF4XykgewpAQCAtNDY2LDcgKzQ3Nyw3IEBACiAgICAgfQogICB9CiAKLSAgdGFza3NfLnB1c2goc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPihuZXcgVGhyZWFkTWFuYWdlcjo6VGFzayh2YWx1ZSwgZXhwaXJhdGlvbikpKTsKKyAgdGFza3NfLnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPFRocmVhZE1hbmFnZXI6OlRhc2s+KHZhbHVlLCBleHBpcmF0aW9uKSk7CiAKICAgLy8gSWYgaWRsZSB0aHJlYWQgaXMgYXZhaWxhYmxlIG5vdGlmeSBpdCwgb3RoZXJ3aXNlIGFsbCB3b3JrZXIgdGhyZWFkcyBhcmUKICAgLy8gcnVubmluZyBhbmQgd2lsbCBnZXQgYXJvdW5kIHRvIHRoaXMgdGFzayBpbiB0aW1lLgpAQCAtNDc2LDE2ICs0ODcsMjQgQEAKIH0KIAogdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgewotICAodm9pZCl0YXNrOwotICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIEd1YXJkIGcobXV0ZXhfKTsKICAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEKSB7CiAgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAogICAgICAgICAiVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlIFRocmVhZE1hbmFnZXIgbm90ICIKICAgICAgICAgInN0YXJ0ZWQiKTsKICAgfQorCisgIGZvciAoYXV0byBpdCA9IHRhc2tzXy5iZWdpbigpOyBpdCAhPSB0YXNrc18uZW5kKCk7ICsraXQpCisgIHsKKyAgICBpZiAoKCppdCktPmdldFJ1bm5hYmxlKCkgPT0gdGFzaykKKyAgICB7CisgICAgICB0YXNrc18uZXJhc2UoaXQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlTmV4dFBlbmRpbmcoKSB7CitzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZU5leHRQZW5kaW5nKCkgewogICBHdWFyZCBnKG11dGV4Xyk7CiAgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRCkgewogICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKQEAgLTQ5NCwzOSArNTEzLDQzIEBACiAgIH0KIAogICBpZiAodGFza3NfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+KCk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4oKTsKICAgfQogCiAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4gdGFzayA9IHRhc2tzXy5mcm9udCgpOwotICB0YXNrc18ucG9wKCk7CisgIHRhc2tzXy5wb3BfZnJvbnQoKTsKIAogICByZXR1cm4gdGFzay0+Z2V0UnVubmFibGUoKTsKIH0KIAotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVFeHBpcmVkVGFza3MoKSB7Ci0gIGludDY0X3Qgbm93ID0gMExMOyAvLyB3ZSB3b24ndCBhc2sgZm9yIHRoZSB0aW1lIHVudGlsZSB3ZSBuZWVkIGl0Cit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZUV4cGlyZWQoYm9vbCBqdXN0T25lKSB7CisgIC8vIHRoaXMgaXMgYWx3YXlzIGNhbGxlZCB1bmRlciBhIGxvY2sKKyAgaWYgKHRhc2tzXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIGF1dG8gbm93ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CiAKLSAgLy8gbm90ZSB0aGF0IHRoaXMgbG9vcCBicmVha3MgYXQgdGhlIGZpcnN0IG5vbi1leHBpcmluZyB0YXNrCi0gIHdoaWxlICghdGFza3NfLmVtcHR5KCkpIHsKLSAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+IHRhc2sgPSB0YXNrc18uZnJvbnQoKTsKLSAgICBpZiAodGFzay0+Z2V0RXhwaXJlVGltZSgpID09IDBMTCkgewotICAgICAgYnJlYWs7CisgIGZvciAoYXV0byBpdCA9IHRhc2tzXy5iZWdpbigpOyBpdCAhPSB0YXNrc18uZW5kKCk7ICkKKyAgeworICAgIGlmICgoKml0KS0+Z2V0RXhwaXJlVGltZSgpICYmICooKCppdCktPmdldEV4cGlyZVRpbWUoKSkgPCBub3cpIHsKKyAgICAgIGlmIChleHBpcmVDYWxsYmFja18pIHsKKyAgICAgICAgZXhwaXJlQ2FsbGJhY2tfKCgqaXQpLT5nZXRSdW5uYWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGl0ID0gdGFza3NfLmVyYXNlKGl0KTsKKyAgICAgICsrZXhwaXJlZENvdW50XzsKKyAgICAgIGlmIChqdXN0T25lKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKG5vdyA9PSAwTEwpIHsKLSAgICAgIG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICsraXQ7CiAgICAgfQotICAgIGlmICh0YXNrLT5nZXRFeHBpcmVUaW1lKCkgPiBub3cpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoZXhwaXJlQ2FsbGJhY2tfKSB7Ci0gICAgICBleHBpcmVDYWxsYmFja18odGFzay0+Z2V0UnVubmFibGUoKSk7Ci0gICAgfQotICAgIHRhc2tzXy5wb3AoKTsKLSAgICBleHBpcmVkQ291bnRfKys7CiAgIH0KIH0KIAogdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzZXRFeHBpcmVDYWxsYmFjayhFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFjaykgeworICBHdWFyZCBnKG11dGV4Xyk7CiAgIGV4cGlyZUNhbGxiYWNrXyA9IGV4cGlyZUNhbGxiYWNrOwogfQogCkBAIC01MzYsNyArNTU5LDcgQEAKICAgU2ltcGxlVGhyZWFkTWFuYWdlcihzaXplX3Qgd29ya2VyQ291bnQgPSA0LCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCA9IDApCiAgICAgOiB3b3JrZXJDb3VudF8od29ya2VyQ291bnQpLCBwZW5kaW5nVGFza0NvdW50TWF4XyhwZW5kaW5nVGFza0NvdW50TWF4KSB7fQogCi0gIHZvaWQgc3RhcnQoKSB7CisgIHZvaWQgc3RhcnQoKSBvdmVycmlkZSB7CiAgICAgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cGVuZGluZ1Rhc2tDb3VudE1heChwZW5kaW5nVGFza0NvdW50TWF4Xyk7CiAgICAgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RhcnQoKTsKICAgICBhZGRXb3JrZXIod29ya2VyQ291bnRfKTsKQEAgLTU0NSw3ICs1NjgsNiBAQAogcHJpdmF0ZToKICAgY29uc3Qgc2l6ZV90IHdvcmtlckNvdW50XzsKICAgY29uc3Qgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXhfOwotICBNb25pdG9yIG1vbml0b3JfOwogfTsKIAogc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBUaHJlYWRNYW5hZ2VyOjpuZXdUaHJlYWRNYW5hZ2VyKCkgewpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgKaW5kZXggMjExMjg0NS4uN2IyMDJjYSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oCkBAIC0yMCwxMCArMjAsOSBAQAogI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRE1BTkFHRVJfSF8KICNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5Lmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CkBAIC01NiwxMiArNTUsMTIgQEAKIGNsYXNzIFRocmVhZE1hbmFnZXIgewogCiBwcm90ZWN0ZWQ6Ci0gIFRocmVhZE1hbmFnZXIoKSB7fQorICBUaHJlYWRNYW5hZ2VyKCkgPSBkZWZhdWx0OwogCiBwdWJsaWM6Ci0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4pPiBFeHBpcmVDYWxsYmFjazsKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPik+IEV4cGlyZUNhbGxiYWNrOwogCi0gIHZpcnR1YWwgflRocmVhZE1hbmFnZXIoKSB7fQorICB2aXJ0dWFsIH5UaHJlYWRNYW5hZ2VyKCkgPSBkZWZhdWx0OwogCiAgIC8qKgogICAgKiBTdGFydHMgdGhlIHRocmVhZCBtYW5hZ2VyLiBWZXJpZmllcyBhbGwgYXR0cmlidXRlcyBoYXZlIGJlZW4gcHJvcGVybHkKQEAgLTcxLDMwICs3MCw0NSBAQAogCiAgIC8qKgogICAgKiBTdG9wcyB0aGUgdGhyZWFkIG1hbmFnZXIuIEFib3J0cyBhbGwgcmVtYWluaW5nIHVucHJvY2Vzc2VkIHRhc2ssIHNodXRzCi0gICAqIGRvd24gYWxsIGNyZWF0ZWQgd29ya2VyIHRocmVhZHMsIGFuZCByZWFsZWFzZXMgYWxsIGFsbG9jYXRlZCByZXNvdXJjZXMuCisgICAqIGRvd24gYWxsIGNyZWF0ZWQgd29ya2VyIHRocmVhZHMsIGFuZCByZWxlYXNlcyBhbGwgYWxsb2NhdGVkIHJlc291cmNlcy4KICAgICogVGhpcyBtZXRob2QgYmxvY2tzIGZvciBhbGwgd29ya2VyIHRocmVhZHMgdG8gY29tcGxldGUsIHRodXMgaXQgY2FuCiAgICAqIHBvdGVudGlhbGx5IGJsb2NrIGZvcmV2ZXIgaWYgYSB3b3JrZXIgdGhyZWFkIGlzIHJ1bm5pbmcgYSB0YXNrIHRoYXQKICAgICogd29uJ3QgdGVybWluYXRlLgorICAgKgorICAgKiBXb3JrZXIgdGhyZWFkcyB3aWxsIGJlIGpvaW5lZCBkZXBlbmRpbmcgb24gdGhlIHRocmVhZEZhY3RvcnkncyBkZXRhY2hlZAorICAgKiBkaXNwb3NpdGlvbi4KICAgICovCiAgIHZpcnR1YWwgdm9pZCBzdG9wKCkgPSAwOwogCi0gIC8qKgotICAgKiBKb2lucyB0aGUgdGhyZWFkIG1hbmFnZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgc3RvcCwgZXhjZXB0IHRoYXQgaXQgd2lsbAotICAgKiBibG9jayB1bnRpbCBhbGwgdGhlIHdvcmtlcnMgaGF2ZSBmaW5pc2hlZCB0aGVpciB3b3JrLiBBdCB0aGF0IHBvaW50Ci0gICAqIHRoZSBUaHJlYWRNYW5hZ2VyIHdpbGwgdHJhbnNpdGlvbiBpbnRvIHRoZSBTVE9QUEVEIHN0YXRlLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGpvaW4oKSA9IDA7Ci0KICAgZW51bSBTVEFURSB7IFVOSU5JVElBTElaRUQsIFNUQVJUSU5HLCBTVEFSVEVELCBKT0lOSU5HLCBTVE9QUElORywgU1RPUFBFRCB9OwogCiAgIHZpcnR1YWwgU1RBVEUgc3RhdGUoKSBjb25zdCA9IDA7CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgPSAwOworICAvKioKKyAgICogXHJldHVybnMgdGhlIGN1cnJlbnQgdGhyZWFkIGZhY3RvcnkKKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdCA9IDA7CiAKLSAgdmlydHVhbCB2b2lkIHRocmVhZEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdmFsdWUpID0gMDsKKyAgLyoqCisgICAqIFNldCB0aGUgdGhyZWFkIGZhY3RvcnkuCisgICAqIFx0aHJvd3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBuZXcgdGhyZWFkIGZhY3RvcnkgaGFzIGEgZGlmZmVyZW50CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaGVkIGRpc3Bvc2l0aW9uIHRoYW4gdGhlIG9uZSByZXBsYWNpbmcgaXQKKyAgICovCisgIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB2YWx1ZSkgPSAwOwogCisgIC8qKgorICAgKiBBZGRzIHdvcmtlciB0aHJlYWQocykuCisgICAqLwogICB2aXJ0dWFsIHZvaWQgYWRkV29ya2VyKHNpemVfdCB2YWx1ZSA9IDEpID0gMDsKIAorICAvKioKKyAgICogUmVtb3ZlcyB3b3JrZXIgdGhyZWFkKHMpLgorICAgKiBUaHJlYWRzIGFyZSBqb2luZWQgaWYgdGhlIHRocmVhZCBmYWN0b3J5IGRldGFjaGVkIGRpc3Bvc2l0aW9uIGFsbG93cyBpdC4KKyAgICogQmxvY2tzIHVudGlsIHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgcmVhY2hlcyB0aGUgbmV3IGxpbWl0LgorICAgKiBccGFyYW1baW5dICB2YWx1ZSAgdGhlIG51bWJlciB0byByZW1vdmUKKyAgICogXHRocm93cyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHdvcmtlcnMKKyAgICovCiAgIHZpcnR1YWwgdm9pZCByZW1vdmVXb3JrZXIoc2l6ZV90IHZhbHVlID0gMSkgPSAwOwogCiAgIC8qKgpAQCAtMTIzLDkgKzEzNywxMCBAQAogICB2aXJ0dWFsIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4KCkgY29uc3QgPSAwOwogCiAgIC8qKgotICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgdGFza3Mgd2hpY2ggaGF2ZSBiZWVuIGV4cGlyZWQgd2l0aG91dCBiZWluZyBydW4uCisgICAqIEdldHMgdGhlIG51bWJlciBvZiB0YXNrcyB3aGljaCBoYXZlIGJlZW4gZXhwaXJlZCB3aXRob3V0IGJlaW5nIHJ1bgorICAgKiBzaW5jZSBzdGFydCgpIHdhcyBjYWxsZWQuCiAgICAqLwotICB2aXJ0dWFsIHNpemVfdCBleHBpcmVkVGFza0NvdW50KCkgPSAwOworICB2aXJ0dWFsIHNpemVfdCBleHBpcmVkVGFza0NvdW50KCkgY29uc3QgPSAwOwogCiAgIC8qKgogICAgKiBBZGRzIGEgdGFzayB0byBiZSBleGVjdXRlZCBhdCBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZSBieSBhIHdvcmtlciB0aHJlYWQuCkBAIC0xNDYsMjEgKzE2MSwyMSBAQAogICAgKgogICAgKiBAdGhyb3dzIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24gUGVuZGluZyB0YXNrIGNvdW50IGV4Y2VlZHMgbWF4IHBlbmRpbmcgdGFzayBjb3VudAogICAgKi8KLSAgdmlydHVhbCB2b2lkIGFkZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywKKyAgdmlydHVhbCB2b2lkIGFkZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0ID0gMExMLAogICAgICAgICAgICAgICAgICAgIGludDY0X3QgZXhwaXJhdGlvbiA9IDBMTCkgPSAwOwogCiAgIC8qKgogICAgKiBSZW1vdmVzIGEgcGVuZGluZyB0YXNrCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSA9IDA7CisgIHZpcnR1YWwgdm9pZCByZW1vdmUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSA9IDA7CiAKICAgLyoqCiAgICAqIFJlbW92ZSB0aGUgbmV4dCBwZW5kaW5nIHRhc2sgd2hpY2ggd291bGQgYmUgcnVuLgogICAgKgogICAgKiBAcmV0dXJuIHRoZSB0YXNrIHJlbW92ZWQuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiByZW1vdmVOZXh0UGVuZGluZygpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJlbW92ZU5leHRQZW5kaW5nKCkgPSAwOwogCiAgIC8qKgogICAgKiBSZW1vdmUgdGFza3MgZnJvbSBmcm9udCBvZiB0YXNrIHF1ZXVlIHRoYXQgaGF2ZSBleHBpcmVkLgpAQCAtMTc1LDE0ICsxOTAsMTQgQEAKICAgICovCiAgIHZpcnR1YWwgdm9pZCBzZXRFeHBpcmVDYWxsYmFjayhFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFjaykgPSAwOwogCi0gIHN0YXRpYyBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBuZXdUaHJlYWRNYW5hZ2VyKCk7CisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gbmV3VGhyZWFkTWFuYWdlcigpOwogCiAgIC8qKgogICAgKiBDcmVhdGVzIGEgc2ltcGxlIHRocmVhZCBtYW5hZ2VyIHRoZSB1c2VzIGNvdW50IG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBhbmQgaGFzCiAgICAqIGEgcGVuZGluZ1Rhc2tDb3VudE1heCBtYXhpbXVtIHBlbmRpbmcgdGFza3MuIFRoZSBkZWZhdWx0LCAwLCBzcGVjaWZpZWQgbm8gbGltaXQKICAgICogb24gcGVuZGluZyB0YXNrcwogICAgKi8KLSAgc3RhdGljIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IG5ld1NpbXBsZVRocmVhZE1hbmFnZXIoc2l6ZV90IGNvdW50ID0gNCwKKyAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudCA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4ID0gMCk7CiAKICAgY2xhc3MgVGFzazsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAKaW5kZXggMTIyZDI2ZS4uMDAzZjU2NCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAKQEAgLTE5LDE3ICsxOSwxOCBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHNldD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjp3ZWFrX3B0cjsKIAogLyoqCiAgKiBUaW1lck1hbmFnZXIgY2xhc3MKQEAgLTQzLDE1ICs0NCwxOSBAQAogCiAgIFRhc2soc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIDogcnVubmFibGVfKHJ1bm5hYmxlKSwgc3RhdGVfKFdBSVRJTkcpIHt9CiAKLSAgflRhc2soKSB7fQorICB+VGFzaygpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAotICB2b2lkIHJ1bigpIHsKKyAgdm9pZCBydW4oKSBvdmVycmlkZSB7CiAgICAgaWYgKHN0YXRlXyA9PSBFWEVDVVRJTkcpIHsKICAgICAgIHJ1bm5hYmxlXy0+cnVuKCk7CiAgICAgICBzdGF0ZV8gPSBDT01QTEVURTsKICAgICB9CiAgIH0KIAorICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc2hhcmVkX3B0cjxSdW5uYWJsZT4gJiBydW5uYWJsZSkgY29uc3QgeyByZXR1cm4gcnVubmFibGVfID09IHJ1bm5hYmxlOyB9CisKKyAgdGFza19pdGVyYXRvciBpdF87CisKIHByaXZhdGU6CiAgIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlXzsKICAgZnJpZW5kIGNsYXNzIFRpbWVyTWFuYWdlcjo6RGlzcGF0Y2hlcjsKQEAgLTYzLDcgKzY4LDcgQEAKIHB1YmxpYzoKICAgRGlzcGF0Y2hlcihUaW1lck1hbmFnZXIqIG1hbmFnZXIpIDogbWFuYWdlcl8obWFuYWdlcikge30KIAotICB+RGlzcGF0Y2hlcigpIHt9CisgIH5EaXNwYXRjaGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgIC8qKgogICAgKiBEaXNwYXRjaGVyIGVudHJ5IHBvaW50CkBAIC03MSw3ICs3Niw3IEBACiAgICAqIEFzIGxvbmcgYXMgZGlzcGF0Y2hlciB0aHJlYWQgaXMgcnVubmluZywgcHVsbCB0YXNrcyBvZmYgdGhlIHRhc2sgdGFza01hcF8KICAgICogYW5kIGV4ZWN1dGUuCiAgICAqLwotICB2b2lkIHJ1bigpIHsKKyAgdm9pZCBydW4oKSBvdmVycmlkZSB7CiAgICAgewogICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPm1vbml0b3JfKTsKICAgICAgIGlmIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRJTkcpIHsKQEAgLTg1LDI3ICs5MCwyOSBAQAogICAgICAgewogICAgICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+bW9uaXRvcl8pOwogICAgICAgICB0YXNrX2l0ZXJhdG9yIGV4cGlyZWRUYXNrRW5kOwotICAgICAgICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICAgIGF1dG8gbm93ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CiAgICAgICAgIHdoaWxlIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRAogICAgICAgICAgICAgICAgJiYgKGV4cGlyZWRUYXNrRW5kID0gbWFuYWdlcl8tPnRhc2tNYXBfLnVwcGVyX2JvdW5kKG5vdykpCiAgICAgICAgICAgICAgICAgICA9PSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKSkgewotICAgICAgICAgIGludDY0X3QgdGltZW91dCA9IDBMTDsKKyAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQoMCk7CiAgICAgICAgICAgaWYgKCFtYW5hZ2VyXy0+dGFza01hcF8uZW1wdHkoKSkgewotICAgICAgICAgICAgdGltZW91dCA9IG1hbmFnZXJfLT50YXNrTWFwXy5iZWdpbigpLT5maXJzdCAtIG5vdzsKKyAgICAgICAgICAgIHRpbWVvdXQgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKS0+Zmlyc3QgLSBub3cpOworICAgICAgICAgICAgLy9iZWNhdXNlIHRoZSB1bml0IG9mIHN0ZWFkeV9jbG9jayBpcyBzbWFsbGVyIHRoYW4gbWlsbGlzZWNvbmQsdGltZW91dCBtYXkgYmUgMC4KKyAgICAgICAgICAgIGlmICh0aW1lb3V0LmNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgICB0aW1lb3V0ID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy53YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ud2FpdEZvclRpbWVSZWxhdGl2ZSgwKTsKICAgICAgICAgICB9Ci0gICAgICAgICAgYXNzZXJ0KCh0aW1lb3V0ICE9IDAgJiYgbWFuYWdlcl8tPnRhc2tDb3VudF8gPiAwKQotICAgICAgICAgICAgICAgICB8fCAodGltZW91dCA9PSAwICYmIG1hbmFnZXJfLT50YXNrQ291bnRfID09IDApKTsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFuYWdlcl8tPm1vbml0b3JfLndhaXQodGltZW91dCk7Ci0gICAgICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7Ci0gICAgICAgICAgfQotICAgICAgICAgIG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICAgICAgbm93ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobWFuYWdlcl8tPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKLSAgICAgICAgICBmb3IgKHRhc2tfaXRlcmF0b3IgaXggPSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKTsgaXggIT0gZXhwaXJlZFRhc2tFbmQ7IGl4KyspIHsKKyAgICAgICAgICBmb3IgKGF1dG8gaXggPSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKTsgaXggIT0gZXhwaXJlZFRhc2tFbmQ7IGl4KyspIHsKICAgICAgICAgICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiB0YXNrID0gaXgtPnNlY29uZDsKICAgICAgICAgICAgIGV4cGlyZWRUYXNrcy5pbnNlcnQodGFzayk7CisgICAgICAgICAgICB0YXNrLT5pdF8gPSBtYW5hZ2VyXy0+dGFza01hcF8uZW5kKCk7CiAgICAgICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6VGFzazo6V0FJVElORykgewogICAgICAgICAgICAgICB0YXNrLT5zdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlRhc2s6OkVYRUNVVElORzsKICAgICAgICAgICAgIH0KQEAgLTExNSwxMCArMTIyLDggQEAKICAgICAgICAgfQogICAgICAgfQogCi0gICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGFzaz4gPjo6aXRlcmF0b3IgaXggPSBleHBpcmVkVGFza3MuYmVnaW4oKTsKLSAgICAgICAgICAgaXggIT0gZXhwaXJlZFRhc2tzLmVuZCgpOwotICAgICAgICAgICArK2l4KSB7Ci0gICAgICAgICgqaXgpLT5ydW4oKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byAmIGV4cGlyZWRUYXNrIDogZXhwaXJlZFRhc2tzKSB7CisgICAgICAgIGV4cGlyZWRUYXNrLT5ydW4oKTsKICAgICAgIH0KIAogICAgIH0gd2hpbGUgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKQEAgLTE0Niw3ICsxNTEsNyBAQAogVGltZXJNYW5hZ2VyOjpUaW1lck1hbmFnZXIoKQogICA6IHRhc2tDb3VudF8oMCksCiAgICAgc3RhdGVfKFRpbWVyTWFuYWdlcjo6VU5JTklUSUFMSVpFRCksCi0gICAgZGlzcGF0Y2hlcl8oc2hhcmVkX3B0cjxEaXNwYXRjaGVyPihuZXcgRGlzcGF0Y2hlcih0aGlzKSkpIHsKKyAgICBkaXNwYXRjaGVyXyhzdGQ6Om1ha2Vfc2hhcmVkPERpc3BhdGNoZXI+KHRoaXMpKSB7CiB9CiAKICNpZiBkZWZpbmVkKF9NU0NfVkVSKQpAQCAtMTYyLDggKzE2Nyw3IEBACiAgICAgdHJ5IHsKICAgICAgIHN0b3AoKTsKICAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIHRocm93OwotICAgICAgLy8gdWhvaAorICAgICAgLy8gV2UncmUgcmVhbGx5IGhvc2VkLgogICAgIH0KICAgfQogfQpAQCAtMjE2LDcgKzIyMCw3IEBACiAgICAgdGFza01hcF8uY2xlYXIoKTsKIAogICAgIC8vIFJlbW92ZSBkaXNwYXRjaGVyJ3MgcmVmZXJlbmNlIHRvIHVzLgotICAgIGRpc3BhdGNoZXJfLT5tYW5hZ2VyXyA9IE5VTEw7CisgICAgZGlzcGF0Y2hlcl8tPm1hbmFnZXJfID0gbnVsbHB0cjsKICAgfQogfQogCkBAIC0yMzQsNjggKzIzOCw3OSBAQAogICByZXR1cm4gdGFza0NvdW50XzsKIH0KIAotdm9pZCBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBpbnQ2NF90IHRpbWVvdXQpIHsKLSAgaW50NjRfdCBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotICB0aW1lb3V0ICs9IG5vdzsKLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmIChzdGF0ZV8gIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7Ci0gICAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgdGFzayBtYXAgaXMgZW1wdHksIHdlIHdpbGwga2ljayB0aGUgZGlzcGF0Y2hlciBmb3Igc3VyZS4gT3RoZXJ3aXNlLCB3ZSBraWNrIGhpbQotICAgIC8vIGlmIHRoZSBleHBpcmF0aW9uIHRpbWUgaXMgc2hvcnRlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlLiBOZWVkIHRvIHRlc3QgYmVmb3JlIHdlIGluc2VydCwKLSAgICAvLyBiZWNhdXNlIHRoZSBuZXcgdGFzayBtaWdodCBpbnNlcnQgYXQgdGhlIGZyb250LgotICAgIGJvb2wgbm90aWZ5UmVxdWlyZWQgPSAodGFza0NvdW50XyA9PSAwKSA/IHRydWUgOiB0aW1lb3V0IDwgdGFza01hcF8uYmVnaW4oKS0+Zmlyc3Q7Ci0KLSAgICB0YXNrQ291bnRfKys7Ci0gICAgdGFza01hcF8uaW5zZXJ0KAotICAgICAgICBzdGQ6OnBhaXI8aW50NjRfdCwgc2hhcmVkX3B0cjxUYXNrPiA+KHRpbWVvdXQsIHNoYXJlZF9wdHI8VGFzaz4obmV3IFRhc2sodGFzaykpKSk7Ci0KLSAgICAvLyBJZiB0aGUgdGFzayBtYXAgd2FzIGVtcHR5LCBvciBpZiB3ZSBoYXZlIGFuIGV4cGlyYXRpb24gdGhhdCBpcyBlYXJsaWVyCi0gICAgLy8gdGhhbiBhbnkgcHJldmlvdXNseSBzZWVuLCBraWNrIHRoZSBkaXNwYXRjaGVyIHNvIGl0IGNhbiB1cGRhdGUgaXRzCi0gICAgLy8gdGltZW91dAotICAgIGlmIChub3RpZnlSZXF1aXJlZCkgewotICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgfQotICB9CitUaW1lck1hbmFnZXI6OlRpbWVyIFRpbWVyTWFuYWdlcjo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgJnRpbWVvdXQpIHsKKyAgcmV0dXJuIGFkZCh0YXNrLCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSArIHRpbWVvdXQpOwogfQogCi12b2lkIFRpbWVyTWFuYWdlcjo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHZhbHVlKSB7CitUaW1lck1hbmFnZXI6OlRpbWVyIFRpbWVyTWFuYWdlcjo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssCisgICAgY29uc3Qgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jaz4mIGFic3RpbWUpIHsKKyAgYXV0byBub3cgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKIAotICBpbnQ2NF90IGV4cGlyYXRpb247Ci0gIFV0aWw6OnRvTWlsbGlzZWNvbmRzKGV4cGlyYXRpb24sIHZhbHVlKTsKLQotICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgaWYgKGV4cGlyYXRpb24gPCBub3cpIHsKKyAgaWYgKGFic3RpbWUgPCBub3cpIHsKICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKICAgfQotCi0gIGFkZCh0YXNrLCBleHBpcmF0aW9uIC0gbm93KTsKLX0KLQotdm9pZCBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdmFsdWUpIHsKLQotICBpbnQ2NF90IGV4cGlyYXRpb247Ci0gIFV0aWw6OnRvTWlsbGlzZWNvbmRzKGV4cGlyYXRpb24sIHZhbHVlKTsKLQotICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgaWYgKGV4cGlyYXRpb24gPCBub3cpIHsKLSAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgfQotCi0gIGFkZCh0YXNrLCBleHBpcmF0aW9uIC0gbm93KTsKLX0KLQotdm9pZCBUaW1lck1hbmFnZXI6OnJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7Ci0gICh2b2lkKXRhc2s7CiAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKICAgaWYgKHN0YXRlXyAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKICAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgfQorCisgIC8vIElmIHRoZSB0YXNrIG1hcCBpcyBlbXB0eSwgd2Ugd2lsbCBraWNrIHRoZSBkaXNwYXRjaGVyIGZvciBzdXJlLiBPdGhlcndpc2UsIHdlIGtpY2sgaGltCisgIC8vIGlmIHRoZSBleHBpcmF0aW9uIHRpbWUgaXMgc2hvcnRlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlLiBOZWVkIHRvIHRlc3QgYmVmb3JlIHdlIGluc2VydCwKKyAgLy8gYmVjYXVzZSB0aGUgbmV3IHRhc2sgbWlnaHQgaW5zZXJ0IGF0IHRoZSBmcm9udC4KKyAgYm9vbCBub3RpZnlSZXF1aXJlZCA9ICh0YXNrQ291bnRfID09IDApID8gdHJ1ZSA6IGFic3RpbWUgPCB0YXNrTWFwXy5iZWdpbigpLT5maXJzdDsKKworICBzaGFyZWRfcHRyPFRhc2s+IHRpbWVyKG5ldyBUYXNrKHRhc2spKTsKKyAgdGFza0NvdW50XysrOworICB0aW1lci0+aXRfID0gdGFza01hcF8uZW1wbGFjZShhYnN0aW1lLCB0aW1lcik7CisKKyAgLy8gSWYgdGhlIHRhc2sgbWFwIHdhcyBlbXB0eSwgb3IgaWYgd2UgaGF2ZSBhbiBleHBpcmF0aW9uIHRoYXQgaXMgZWFybGllcgorICAvLyB0aGFuIGFueSBwcmV2aW91c2x5IHNlZW4sIGtpY2sgdGhlIGRpc3BhdGNoZXIgc28gaXQgY2FuIHVwZGF0ZSBpdHMKKyAgLy8gdGltZW91dAorICBpZiAobm90aWZ5UmVxdWlyZWQpIHsKKyAgICBtb25pdG9yXy5ub3RpZnkoKTsKKyAgfQorCisgIHJldHVybiB0aW1lcjsKK30KKwordm9pZCBUaW1lck1hbmFnZXI6OnJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CisgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgaWYgKHN0YXRlXyAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKKyAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorICBib29sIGZvdW5kID0gZmFsc2U7CisgIGZvciAoYXV0byBpeCA9IHRhc2tNYXBfLmJlZ2luKCk7IGl4ICE9IHRhc2tNYXBfLmVuZCgpOykgeworICAgIGlmICgqaXgtPnNlY29uZCA9PSB0YXNrKSB7CisgICAgICBmb3VuZCA9IHRydWU7CisgICAgICB0YXNrQ291bnRfLS07CisgICAgICB0YXNrTWFwXy5lcmFzZShpeCsrKTsKKyAgICB9IGVsc2UgeworICAgICAgKytpeDsKKyAgICB9CisgIH0KKyAgaWYgKCFmb3VuZCkgeworICAgIHRocm93IE5vU3VjaFRhc2tFeGNlcHRpb24oKTsKKyAgfQorfQorCit2b2lkIFRpbWVyTWFuYWdlcjo6cmVtb3ZlKFRpbWVyIGhhbmRsZSkgeworICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIGlmIChzdGF0ZV8gIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICBzaGFyZWRfcHRyPFRhc2s+IHRhc2sgPSBoYW5kbGUubG9jaygpOworICBpZiAoIXRhc2spIHsKKyAgICB0aHJvdyBOb1N1Y2hUYXNrRXhjZXB0aW9uKCk7CisgIH0KKworICBpZiAodGFzay0+aXRfID09IHRhc2tNYXBfLmVuZCgpKSB7CisgICAgLy8gVGFzayBpcyBiZWluZyBleGVjdXRlZAorICAgIHRocm93IFVuY2FuY2VsbGFibGVUYXNrRXhjZXB0aW9uKCk7CisgIH0KKworICB0YXNrTWFwXy5lcmFzZSh0YXNrLT5pdF8pOworICB0YXNrQ291bnRfLS07CiB9CiAKIFRpbWVyTWFuYWdlcjo6U1RBVEUgVGltZXJNYW5hZ2VyOjpzdGF0ZSgpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaAppbmRleCAzOTQ2ODI3Li40NGQ0NzM4IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oCkBAIC0yMCwxMyArMjAsMTEgQEAKICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USU1FUk1BTkFHRVJfSF8KICNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9USU1FUk1BTkFHRVJfSF8gMQogCi0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5Lmg+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHRpbWUuaD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTQyLDEzICs0MCwxNiBAQAogY2xhc3MgVGltZXJNYW5hZ2VyIHsKIAogcHVibGljOgorICBjbGFzcyBUYXNrOworICB0eXBlZGVmIHN0ZDo6d2Vha19wdHI8VGFzaz4gVGltZXI7CisKICAgVGltZXJNYW5hZ2VyKCk7CiAKICAgdmlydHVhbCB+VGltZXJNYW5hZ2VyKCk7CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3Q7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdDsKIAotICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB2YWx1ZSk7CisgIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB2YWx1ZSk7CiAKICAgLyoqCiAgICAqIFN0YXJ0cyB0aGUgdGltZXIgbWFuYWdlciBzZXJ2aWNlCkBAIC02OSwyOCArNzAsMjUgQEAKICAgICoKICAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gZXhlY3V0ZQogICAgKiBAcGFyYW0gdGltZW91dCBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byBkZWxheSBiZWZvcmUgZXhlY3V0aW5nIHRhc2sKKyAgICogQHJldHVybiBIYW5kbGUgb2YgdGhlIHRpbWVyLCB3aGljaCBjYW4gYmUgdXNlZCB0byByZW1vdmUgdGhlIHRpbWVyLgogICAgKi8KLSAgdmlydHVhbCB2b2lkIGFkZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgaW50NjRfdCB0aW1lb3V0KTsKKyAgdmlydHVhbCBUaW1lciBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzICZ0aW1lb3V0KTsKKyAgVGltZXIgYWRkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgdWludDY0X3QgdGltZW91dCkgeyByZXR1cm4gYWRkKHRhc2ssc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyh0aW1lb3V0KSk7IH0KIAogICAvKioKICAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgogICAgKgogICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCi0gICAqIEBwYXJhbSB0aW1lb3V0IEFic29sdXRlIHRpbWUgaW4gdGhlIGZ1dHVyZSB0byBleGVjdXRlIHRhc2suCisgICAqIEBwYXJhbSBhYnN0aW1lIEFic29sdXRlIHRpbWUgaW4gdGhlIGZ1dHVyZSB0byBleGVjdXRlIHRhc2suCisgICAqIEByZXR1cm4gSGFuZGxlIG9mIHRoZSB0aW1lciwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSB0aW1lci4KICAgICovCi0gIHZpcnR1YWwgdm9pZCBhZGQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHRpbWVvdXQpOwotCi0gIC8qKgotICAgKiBBZGRzIGEgdGFzayB0byBiZSBleGVjdXRlZCBhdCBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZSBieSBhIHdvcmtlciB0aHJlYWQuCi0gICAqCi0gICAqIEBwYXJhbSB0YXNrIFRoZSB0YXNrIHRvIGV4ZWN1dGUKLSAgICogQHBhcmFtIHRpbWVvdXQgQWJzb2x1dGUgdGltZSBpbiB0aGUgZnV0dXJlIHRvIGV4ZWN1dGUgdGFzay4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBhZGQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB0aW1lb3V0KTsKKyAgdmlydHVhbCBUaW1lciBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrPiYgYWJzdGltZSk7CiAKICAgLyoqCiAgICAqIFJlbW92ZXMgYSBwZW5kaW5nIHRhc2sKICAgICoKKyAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gcmVtb3ZlLiBBbGwgdGltZXJzIHdoaWNoIGV4ZWN1dGUgdGhpcyB0YXNrIHdpbGwKKyAgICogYmUgcmVtb3ZlZC4KICAgICogQHRocm93cyBOb1N1Y2hUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGRvZXNuJ3QgZXhpc3QuIEl0IHdhcyBlaXRoZXIKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBhbHJlYWR5IG9yIHRoaXMgY2FsbCB3YXMgbWFkZSBmb3IgYQogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB0aGF0IHdhcyBuZXZlciBhZGRlZCB0byB0aGlzIHRpbWVyCkBAIC05OCwyNSArOTYsMzggQEAKICAgICogQHRocm93cyBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbiBTcGVjaWZpZWQgdGFzayBpcyBhbHJlYWR5IGJlaW5nCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQgb3IgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24uCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKKyAgdmlydHVhbCB2b2lkIHJlbW92ZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spOworCisgIC8qKgorICAgKiBSZW1vdmVzIGEgc2luZ2xlIHBlbmRpbmcgdGFzaworICAgKgorICAgKiBAcGFyYW0gdGltZXIgVGhlIHRpbWVyIHRvIHJlbW92ZS4gVGhlIHRpbWVyIGlzIHJldHVybmVkIHdoZW4gY2FsbGluZyB0aGUKKyAgICogYWRkKCkgbWV0aG9kLgorICAgKiBAdGhyb3dzIE5vU3VjaFRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgZG9lc24ndCBleGlzdC4gSXQgd2FzIGVpdGhlcgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIGFscmVhZHkgb3IgdGhpcyBjYWxsIHdhcyBtYWRlIGZvciBhCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrIHRoYXQgd2FzIG5ldmVyIGFkZGVkIHRvIHRoaXMgdGltZXIKKyAgICoKKyAgICogQHRocm93cyBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbiBTcGVjaWZpZWQgdGFzayBpcyBhbHJlYWR5IGJlaW5nCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQgb3IgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24uCisgICAqLworICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKFRpbWVyIHRpbWVyKTsKIAogICBlbnVtIFNUQVRFIHsgVU5JTklUSUFMSVpFRCwgU1RBUlRJTkcsIFNUQVJURUQsIFNUT1BQSU5HLCBTVE9QUEVEIH07CiAKICAgdmlydHVhbCBTVEFURSBzdGF0ZSgpIGNvbnN0OwogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKLSAgY2xhc3MgVGFzazsKKyAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOwogICBmcmllbmQgY2xhc3MgVGFzazsKLSAgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBib29zdDo6c2hhcmVkX3B0cjxUYXNrPiA+IHRhc2tNYXBfOworICBzdGQ6Om11bHRpbWFwPHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s+LCBzdGQ6OnNoYXJlZF9wdHI8VGFzaz4gPiB0YXNrTWFwXzsKICAgc2l6ZV90IHRhc2tDb3VudF87CiAgIE1vbml0b3IgbW9uaXRvcl87CiAgIFNUQVRFIHN0YXRlXzsKICAgY2xhc3MgRGlzcGF0Y2hlcjsKICAgZnJpZW5kIGNsYXNzIERpc3BhdGNoZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPERpc3BhdGNoZXI+IGRpc3BhdGNoZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IGRpc3BhdGNoZXJUaHJlYWRfOwotICB0eXBlZGVmIHN0ZDo6bXVsdGltYXA8aW50NjRfdCwgYm9vc3Q6OnNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiA+OjppdGVyYXRvciB0YXNrX2l0ZXJhdG9yOworICBzdGQ6OnNoYXJlZF9wdHI8RGlzcGF0Y2hlcj4gZGlzcGF0Y2hlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IGRpc3BhdGNoZXJUaHJlYWRfOworICB1c2luZyB0YXNrX2l0ZXJhdG9yID0gZGVjbHR5cGUodGFza01hcF8pOjppdGVyYXRvcjsKICAgdHlwZWRlZiBzdGQ6OnBhaXI8dGFza19pdGVyYXRvciwgdGFza19pdGVyYXRvcj4gdGFza19yYW5nZTsKIH07CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNmQxOWYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KLQotI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgotCi0jaWYgZGVmaW5lZChIQVZFX1NZU19USU1FX0gpCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotCi1uYW1lc3BhY2UgYXBhY2hlIHsKLW5hbWVzcGFjZSB0aHJpZnQgewotbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotaW50NjRfdCBVdGlsOjpjdXJyZW50VGltZVRpY2tzKGludDY0X3QgdGlja3NQZXJTZWMpIHsKLSAgaW50NjRfdCByZXN1bHQ7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKLSAgaW50IHJldCA9IFRIUklGVF9HRVRUSU1FT0ZEQVkoJm5vdywgTlVMTCk7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSSUFCTEUocmV0KTsgLy8gc3F1ZWxjaGluZyAidW51c2VkIHZhcmlhYmxlIiB3YXJuaW5nCi0gIHRvVGlja3MocmVzdWx0LCBub3csIHRpY2tzUGVyU2VjKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLX0KLX0KLX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzBiNi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1VUSUxfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9VVElMX0hfIDEKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7Ci1uYW1lc3BhY2UgdGhyaWZ0IHsKLW5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzCi0gKgotICogVGhpcyBjbGFzcyBjb250YWlucyBiYXNpYyB1dGlsaXR5IG1ldGhvZHMgZm9yIGNvbnZlcnRpbmcgdGltZSBmb3JtYXRzLAotICogYW5kIG90aGVyIGNvbW1vbiBwbGF0Zm9ybS1kZXBlbmRlbnQgY29uY3VycmVuY3kgb3BlcmF0aW9ucy4KLSAqIEl0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gQVBJIGhlYWRlcnMgZm9yIG90aGVyIGNvbmN1cnJlbmN5IGxpYnJhcnkKLSAqIGhlYWRlcnMsIHNpbmNlIGl0IHdpbGwsIGJ5IGRlZmluaXRpb24sIHB1bGwgaW4gYWxsIHNvcnRzIG9mIGhvcnJpZAotICogcGxhdGZvcm0gZGVwZW5kZW50IHN0dWZmLiAgUmF0aGVyIGl0IHNob3VsZCBiZSBpbmx1ZGVkIGRpcmVjdGx5IGluCi0gKiBjb25jdXJyZW5jeSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIHNvdXJjZS4KLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBVdGlsIHsKLQotICBzdGF0aWMgY29uc3QgaW50NjRfdCBOU19QRVJfUyA9IDEwMDAwMDAwMDBMTDsKLSAgc3RhdGljIGNvbnN0IGludDY0X3QgVVNfUEVSX1MgPSAxMDAwMDAwTEw7Ci0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IE1TX1BFUl9TID0gMTAwMExMOwotCi0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5TX1BFUl9NUyA9IE5TX1BFUl9TIC8gTVNfUEVSX1M7Ci0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5TX1BFUl9VUyA9IE5TX1BFUl9TIC8gVVNfUEVSX1M7Ci0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IFVTX1BFUl9NUyA9IFVTX1BFUl9TIC8gTVNfUEVSX1M7Ci0KLXB1YmxpYzoKLSAgLyoqCi0gICAqIENvbnZlcnRzIG1pbGxpc2Vjb25kIHRpbWVzdGFtcCBpbnRvIGEgVEhSSUZUX1RJTUVTUEVDIHN0cnVjdAotICAgKgotICAgKiBAcGFyYW0gc3RydWN0IFRIUklGVF9USU1FU1BFQyYgcmVzdWx0Ci0gICAqIEBwYXJhbSB0aW1lIG9yIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcwotICAgKi8KLSAgc3RhdGljIHZvaWQgdG9UaW1lc3BlYyhzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiByZXN1bHQsIGludDY0X3QgdmFsdWUpIHsKLSAgICByZXN1bHQudHZfc2VjID0gdmFsdWUgLyBNU19QRVJfUzsgICAgICAgICAgICAgICAgLy8gbXMgdG8gcwotICAgIHJlc3VsdC50dl9uc2VjID0gKHZhbHVlICUgTVNfUEVSX1MpICogTlNfUEVSX01TOyAvLyBtcyB0byBucwotICB9Ci0KLSAgc3RhdGljIHZvaWQgdG9UaW1ldmFsKHN0cnVjdCB0aW1ldmFsJiByZXN1bHQsIGludDY0X3QgdmFsdWUpIHsKLSAgICByZXN1bHQudHZfc2VjID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlIC8gTVNfUEVSX1MpOyAgICAgICAgICAgICAgICAvLyBtcyB0byBzCi0gICAgcmVzdWx0LnR2X3VzZWMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKHZhbHVlICUgTVNfUEVSX1MpICogVVNfUEVSX01TKTsgLy8gbXMgdG8gdXMKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2VjcywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9sZFRpY2tzLAotICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2xkVGlja3NQZXJTZWMsCi0gICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBuZXdUaWNrc1BlclNlYykgewotICAgIHJlc3VsdCA9IHNlY3MgKiBuZXdUaWNrc1BlclNlYzsKLSAgICByZXN1bHQgKz0gb2xkVGlja3MgKiBuZXdUaWNrc1BlclNlYyAvIG9sZFRpY2tzUGVyU2VjOwotCi0gICAgaW50NjRfdCBvbGRQZXJOZXcgPSBvbGRUaWNrc1BlclNlYyAvIG5ld1RpY2tzUGVyU2VjOwotICAgIGlmIChvbGRQZXJOZXcgJiYgKChvbGRUaWNrcyAlIG9sZFBlck5ldykgPj0gKG9sZFBlck5ldyAvIDIpKSkgewotICAgICAgKytyZXN1bHQ7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBDb252ZXJ0cyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHRvIGFyYml0cmFyeS1zaXplZCB0aWNrcyBzaW5jZSBlcG9jaAotICAgKi8KLSAgc3RhdGljIHZvaWQgdG9UaWNrcyhpbnQ2NF90JiByZXN1bHQsIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHZhbHVlLCBpbnQ2NF90IHRpY2tzUGVyU2VjKSB7Ci0gICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZS50dl9zZWMsIHZhbHVlLnR2X25zZWMsIE5TX1BFUl9TLCB0aWNrc1BlclNlYyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydHMgc3RydWN0IHRpbWV2YWwgdG8gYXJiaXRyYXJ5LXNpemVkIHRpY2tzIHNpbmNlIGVwb2NoCi0gICAqLwotICBzdGF0aWMgdm9pZCB0b1RpY2tzKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlLCBpbnQ2NF90IHRpY2tzUGVyU2VjKSB7Ci0gICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZS50dl9zZWMsIHZhbHVlLnR2X3VzZWMsIFVTX1BFUl9TLCB0aWNrc1BlclNlYyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydHMgc3RydWN0IFRIUklGVF9USU1FU1BFQyB0byBtaWxsaXNlY29uZHMKLSAgICovCi0gIHN0YXRpYyB2b2lkIHRvTWlsbGlzZWNvbmRzKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IFRIUklGVF9USU1FU1BFQyYgdmFsdWUpIHsKLSAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLCBNU19QRVJfUyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydHMgc3RydWN0IHRpbWV2YWwgdG8gbWlsbGlzZWNvbmRzCi0gICAqLwotICBzdGF0aWMgdm9pZCB0b01pbGxpc2Vjb25kcyhpbnQ2NF90JiByZXN1bHQsIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgewotICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIE1TX1BFUl9TKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHRvIG1pY3Jvc2Vjb25kcwotICAgKi8KLSAgc3RhdGljIHZvaWQgdG9Vc2VjKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IFRIUklGVF9USU1FU1BFQyYgdmFsdWUpIHsKLSAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLCBVU19QRVJfUyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydHMgc3RydWN0IHRpbWV2YWwgdG8gbWljcm9zZWNvbmRzCi0gICAqLwotICBzdGF0aWMgdm9pZCB0b1VzZWMoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdmFsdWUpIHsKLSAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLCBVU19QRVJfUyk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGN1cnJlbnQgdGltZSBhcyBhIG51bWJlciBvZiBhcmJpdHJhcnktc2l6ZSB0aWNrcyBmcm9tIGVwb2NoCi0gICAqLwotICBzdGF0aWMgaW50NjRfdCBjdXJyZW50VGltZVRpY2tzKGludDY0X3QgdGlja3NQZXJTZWMpOwotCi0gIC8qKgotICAgKiBHZXQgY3VycmVudCB0aW1lIGFzIG1pbGxpc2Vjb25kcyBmcm9tIGVwb2NoCi0gICAqLwotICBzdGF0aWMgaW50NjRfdCBjdXJyZW50VGltZSgpIHsgcmV0dXJuIGN1cnJlbnRUaW1lVGlja3MoTVNfUEVSX1MpOyB9Ci0KLSAgLyoqCi0gICAqIEdldCBjdXJyZW50IHRpbWUgYXMgbWljcm9zIGZyb20gZXBvY2gKLSAgICovCi0gIHN0YXRpYyBpbnQ2NF90IGN1cnJlbnRUaW1lVXNlYygpIHsgcmV0dXJuIGN1cnJlbnRUaW1lVGlja3MoVVNfUEVSX1MpOyB9Ci19OwotfQotfQotfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9VVElMX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY3h4ZnVuY3Rpb25hbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkYWFjMy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY3h4ZnVuY3Rpb25hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NYWEZVTkNUSU9OQUxfSF8KLSNkZWZpbmUgX1RIUklGVF9DWFhGVU5DVElPTkFMX0hfIDEKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0vKioKLSAqIExvYWRzIDxmdW5jdGlvbmFsPiBmcm9tIHRoZSAncmlnaHQnIGxvY2F0aW9uLCBkZXBlbmRpbmcKLSAqIG9uIGNvbXBpbGVyIGFuZCB3aGV0aGVyIG9yIG5vdCBpdCdzIHVzaW5nIEMrKzAzIHdpdGggVFIxCi0gKiBvciBDKysxMS4KLSAqLwotCi0vKgotICogTVNWQyAxMCBhbmQgMTEgaGF2ZSB0aGUgPGZ1bmN0aW9uYWw+IHN0dWZmIGF0IDxmdW5jdGlvbmFsPi4KLSAqIEluIE1TVkMgMTAgYWxsIG9mIHRoZSBpbXBsZW1lbnRhdGlvbnMgbGl2ZSBpbiBzdGQ6OnRyMS4KLSAqIEluIE1TVkMgMTEgYWxsIG9mIHRoZSBpbXBsZW1lbnRhdGlvbnMgbGl2ZSBpbiBzdGQsIHdpdGggYWxpYXNlcwotICogIGluIHN0ZDo6dHIxIHRvIHBvaW50IHRvIHRoZSBvbmVzIGluIHN0ZC4KLSAqLwotI2lmZGVmIF9XSU4zMgotICAjZGVmaW5lIF9USFJJRlRfVVNJTkdfTUlDUk9TT0ZUX1NURExJQiAxCi0jZW5kaWYKLQotI2lmZGVmIF9fY2xhbmdfXwotICAvKiBDbGFuZyBoYXMgdHdvIG9wdGlvbnMsIGRlcGVuZGluZyBvbiBzdGFuZGFyZCBsaWJyYXJ5OgotICAgKiAtIG5vIC1zdGRsaWIgb3IgLXN0ZGxpYj1saWJzdGRjKysgc2V0OyB1c2VzIEdOVSBsaWJzdGRjKysuCi0gICAqICAgIDx0cjEvZnVuY3Rpb25hbD4KLSAgICogLSAtc3RkbGliPWxpYmMrKzsgdXNlcyBMTFZNIGxpYmMrKy4KLSAgICogICAgPGZ1bmN0aW9uYWw+LCBubyAnc3RkOjp0cjEnLgotICAgKgotICAgKiBUaGUgY29tcGlsZXIgaXRzZWxmIGRvZXNuJ3QgZGVmaW5lIGFueXRoaW5nIGRpZmZlcmVudGx5Ci0gICAqIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgLXN0ZGxpYiwgYnV0IHRoZSBsaWJyYXJ5IGhlYWRlcnMKLSAgICogd2lsbCBzZXQgZGlmZmVyZW50IHByZXByb2Nlc3NvciBvcHRpb25zLiBJbiBvcmRlciB0byBjaGVjaywKLSAgICogdGhvdWdoLCB3ZSBoYXZlIHRvIHB1bGwgaW4gc29tZSBsaWJyYXJ5IGhlYWRlci4KLSAgICovCi0gICNpbmNsdWRlIDx1dGlsaXR5PgotCi0gIC8qIFdpdGggTExWTSBsaWJjKyssIHV0aWxpdHkgcHVsbHMgaW4gX19jb25maWcsIHdoaWNoIHNldHMKLSAgICAgX0xJQkNQUF9WRVJTSU9OLiAqLwotICAjaWYgZGVmaW5lZChfTElCQ1BQX1ZFUlNJT04pCi0gICAgI2RlZmluZSBfVEhSSUZUX1VTSU5HX0NMQU5HX0xJQkNYWCAxCi0KLSAgLyogV2l0aCBHTlUgbGlic3RkYysrLCB1dGlsaXR5IHB1bGxzIGluIGJpdHMvYysrY29uZmlnLmgsCi0gICAgIHdoaWNoIHNldHMgX19HTElCQ1hYX18uICovCi0gICNlbGlmIGRlZmluZWQoX19HTElCQ1hYX18pCi0gICAgI2RlZmluZSBfVEhSSUZUX1VTSU5HX0dOVV9MSUJTVERDWFggMQotCi0gIC8qIE5vIGlkZWEuICovCi0gICNlbHNlCi0gICAgI2Vycm9yIFVuYWJsZSB0byBkZXRlY3Qgd2hpY2ggQysrIHN0YW5kYXJkIGxpYnJhcnkgaXMgaW4gdXNlLgotICAjZW5kaWYKLSNlbGlmIF9fR05VQ19fCi0gICNkZWZpbmUgX1RIUklGVF9VU0lOR19HTlVfTElCU1REQ1hYIDEKLSNlbmRpZgotCi0jaWYgX1RIUklGVF9VU0lOR19NSUNST1NPRlRfU1RETElCCi0gICNpbmNsdWRlIDxmdW5jdGlvbmFsPgotCi0gIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHN0ZGN4eCB7Ci0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6ZnVuY3Rpb247Ci0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6YmluZDsKLQotICAgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgewotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMTsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzI7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol8zOwotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfNDsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzU7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol82OwotICAgIH0gLy8gYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6cGxhY2Vob2xkZXJzCi0gIH19fSAvLyBhcGFjaGU6OnRocmlmdDo6c3RkY3h4Ci0KLSNlbGlmIF9USFJJRlRfVVNJTkdfQ0xBTkdfTElCQ1hYCi0gICNpbmNsdWRlIDxmdW5jdGlvbmFsPgotCi0gIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHN0ZGN4eCB7Ci0gICAgdXNpbmcgOjpzdGQ6OmZ1bmN0aW9uOwotICAgIHVzaW5nIDo6c3RkOjpiaW5kOwotCi0gICAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycyB7Ci0gICAgICB1c2luZyA6OnN0ZDo6cGxhY2Vob2xkZXJzOjpfMTsKLSAgICAgIHVzaW5nIDo6c3RkOjpwbGFjZWhvbGRlcnM6Ol8yOwotICAgICAgdXNpbmcgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzM7Ci0gICAgICB1c2luZyA6OnN0ZDo6cGxhY2Vob2xkZXJzOjpfNDsKLSAgICAgIHVzaW5nIDo6c3RkOjpwbGFjZWhvbGRlcnM6Ol81OwotICAgICAgdXNpbmcgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzY7Ci0gICAgfSAvLyBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpwbGFjZWhvbGRlcnMKLSAgfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHgKLQotI2VsaWYgX1RIUklGVF9VU0lOR19HTlVfTElCU1REQ1hYCi0gICNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KLQotICBuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzdGRjeHggewotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmZ1bmN0aW9uOwotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmJpbmQ7Ci0KLSAgICBuYW1lc3BhY2UgcGxhY2Vob2xkZXJzIHsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzE7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol8yOwotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMzsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzQ7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol81OwotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfNjsKLSAgICB9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OnBsYWNlaG9sZGVycwotICB9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eAotI2VuZGlmCi0KLSAgLy8gQWxpYXMgZm9yIHRocmlmdCBjKysgY29tcGF0aWJpbGl0eSBuYW1lc3BhY2UKLSAgbmFtZXNwYWNlIHRjeHggPSBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OwotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NYWEZVTkNUSU9OQUxfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCmluZGV4IDhjOWE0NjMuLjRjZDU4YjggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcApAQCAtMzEsMjkgKzMxLDI4IEBACiAgIG1lbW9yeUJ1ZmZlcl8ucmVzZXQobmV3IFRNZW1vcnlCdWZmZXIoKSk7CiAgIHRhcmdldFRyYW5zcG9ydF8gPSBtZW1vcnlCdWZmZXJfOwogfQotUGVla1Byb2Nlc3Nvcjo6flBlZWtQcm9jZXNzb3IoKSB7Ci19CitQZWVrUHJvY2Vzc29yOjp+UGVla1Byb2Nlc3NvcigpID0gZGVmYXVsdDsKIAotdm9pZCBQZWVrUHJvY2Vzc29yOjppbml0aWFsaXplKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSkgewordm9pZCBQZWVrUHJvY2Vzc29yOjppbml0aWFsaXplKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSkgewogICBhY3R1YWxQcm9jZXNzb3JfID0gYWN0dWFsUHJvY2Vzc29yOwogICBwaXBlZFByb3RvY29sXyA9IHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wodGFyZ2V0VHJhbnNwb3J0Xyk7CiAgIHRyYW5zcG9ydEZhY3RvcnlfID0gdHJhbnNwb3J0RmFjdG9yeTsKICAgdHJhbnNwb3J0RmFjdG9yeV8tPmluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQodGFyZ2V0VHJhbnNwb3J0Xyk7CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFBlZWtQcm9jZXNzb3I6OmdldFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluKSB7CitzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gUGVla1Byb2Nlc3Nvcjo6Z2V0UGlwZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluKSB7CiAgIHJldHVybiB0cmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGluKTsKIH0KIAotdm9pZCBQZWVrUHJvY2Vzc29yOjpzZXRUYXJnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KSB7Cit2b2lkIFBlZWtQcm9jZXNzb3I6OnNldFRhcmdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KSB7CiAgIHRhcmdldFRyYW5zcG9ydF8gPSB0YXJnZXRUcmFuc3BvcnQ7Ci0gIGlmIChib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4odGFyZ2V0VHJhbnNwb3J0XykpIHsKLSAgICBtZW1vcnlCdWZmZXJfID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydCk7Ci0gIH0gZWxzZSBpZiAoYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRQaXBlZFRyYW5zcG9ydD4odGFyZ2V0VHJhbnNwb3J0XykpIHsKLSAgICBtZW1vcnlCdWZmZXJfID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KAotICAgICAgICBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFBpcGVkVHJhbnNwb3J0Pih0YXJnZXRUcmFuc3BvcnRfKS0+Z2V0VGFyZ2V0VHJhbnNwb3J0KCkpOworICBpZiAoc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPih0YXJnZXRUcmFuc3BvcnRfKSkgeworICAgIG1lbW9yeUJ1ZmZlcl8gPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAoc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUGlwZWRUcmFuc3BvcnQ+KHRhcmdldFRyYW5zcG9ydF8pKSB7CisgICAgbWVtb3J5QnVmZmVyXyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4oCisgICAgICAgIHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFBpcGVkVHJhbnNwb3J0Pih0YXJnZXRUcmFuc3BvcnRfKS0+Z2V0VGFyZ2V0VHJhbnNwb3J0KCkpOwogICB9CiAKICAgaWYgKCFtZW1vcnlCdWZmZXJfKSB7CkBAIC02Miw4ICs2MSw4IEBACiAgIH0KIH0KIAotYm9vbCBQZWVrUHJvY2Vzc29yOjpwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXQsCitib29sIFBlZWtQcm9jZXNzb3I6OnByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CiAKICAgc3RkOjpzdHJpbmcgZm5hbWU7CkBAIC0xMjAsNyArMTE5LDcgQEAKICAgKHZvaWQpc2l6ZTsKIH0KIAotdm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sIFRUeXBlIGZ0eXBlLCBpbnQxNl90IGZpZCkgewordm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrKHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGluLCBUVHlwZSBmdHlwZSwgaW50MTZfdCBmaWQpIHsKICAgKHZvaWQpZmlkOwogICBpbi0+c2tpcChmdHlwZSk7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oCmluZGV4IDIxYzU5OTkuLmFlNTY1ZmMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtNDAsNDEgKzQwLDQxIEBACiAKIHB1YmxpYzoKICAgUGVla1Byb2Nlc3NvcigpOwotICB2aXJ0dWFsIH5QZWVrUHJvY2Vzc29yKCk7CisgIH5QZWVrUHJvY2Vzc29yKCkgb3ZlcnJpZGU7CiAKICAgLy8gSW5wdXQgaGVyZTogYWN0dWFsUHJvY2Vzc29yICAtIHRoZSB1bmRlcmx5aW5nIHByb2Nlc3NvcgogICAvLyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkgIC0gdGhlIHByb3RvY29sIGZhY3RvcnkgdXNlZCB0byB3cmFwIHRoZSBtZW1vcnkgYnVmZmVyCiAgIC8vICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnkgLSB0aGlzIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkgaXMgdXNlZCB0byB3cmFwIHRoZSBzb3VyY2UgdHJhbnNwb3J0CiAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgYSBjYWxsIHRvIGdldFBpcGVkVHJhbnNwb3J0CiAgIHZvaWQgaW5pdGlhbGl6ZSgKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gZ2V0UGlwZWRUcmFuc3BvcnQoCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBpbik7CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBnZXRQaXBlZFRyYW5zcG9ydCgKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBpbik7CiAKLSAgdm9pZCBzZXRUYXJnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KTsKKyAgdm9pZCBzZXRUYXJnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydCk7CiAKLSAgdmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAotICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCk7CisgIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIG92ZXJyaWRlOwogCiAgIC8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGNhbiBiZSBvdmVybG9hZGVkIGJ5IGNoaWxkIGNsYXNzZXMgdG8KICAgLy8gYWNoaWV2ZSBkZXNpcmVkIHBlZWtpbmcgYmVoYXZpb3IKICAgdmlydHVhbCB2b2lkIHBlZWtOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSk7CiAgIHZpcnR1YWwgdm9pZCBwZWVrQnVmZmVyKHVpbnQ4X3QqIGJ1ZmZlciwgdWludDMyX3Qgc2l6ZSk7Ci0gIHZpcnR1YWwgdm9pZCBwZWVrKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgdmlydHVhbCB2b2lkIHBlZWsoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZSwKICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBmaWQpOwogICB2aXJ0dWFsIHZvaWQgcGVla0VuZCgpOwogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gYWN0dWFsUHJvY2Vzc29yXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcGVkUHJvdG9jb2xfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gbWVtb3J5QnVmZmVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcGVkUHJvdG9jb2xfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBtZW1vcnlCdWZmZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0XzsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKaW5kZXggZThjYTA2Ny4uZTk4ZWZiOCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9TdGF0c1Byb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaApAQCAtMjAsNyArMjAsNyBAQAogI2lmbmRlZiBTVEFUU1BST0NFU1NPUl9ICiAjZGVmaW5lIFNUQVRTUFJPQ0VTU09SX0gKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CiAjaW5jbHVkZSA8VFByb2Nlc3Nvci5oPgpAQCAtMzgsOCArMzgsOCBAQAogICBTdGF0c1Byb2Nlc3Nvcihib29sIHByaW50LCBib29sIGZyZXF1ZW5jeSkgOiBwcmludF8ocHJpbnQpLCBmcmVxdWVuY3lfKGZyZXF1ZW5jeSkge30KICAgdmlydHVhbCB+U3RhdHNQcm9jZXNzb3IoKXt9OwogCi0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwb3Byb3QsCisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90LAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBvcHJvdCwKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogc2VydmVyQ29udGV4dCkgewogCiAgICAgcGlwcm90XyA9IHBpcHJvdDsKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgIH0KICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3RfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcHJvdF87CiAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ2NF90PiBmcmVxdWVuY3lfbWFwXzsKIAogICBib29sIHByaW50XzsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oCmluZGV4IDBlZjcyNjEuLjg1YzBhZmYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaApAQCAtMjcsOCArMjcsNiBAQAogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci0KIG5hbWVzcGFjZSBwcm90b2NvbCB7CiAKIC8qKgpAQCAtMzgsMTMgKzM2LDEzIEBACiAgKi8KIGNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA6IHB1YmxpYyBUUHJvdG9jb2xEZWNvcmF0b3IgewogcHVibGljOgotICBTdG9yZWRNZXNzYWdlUHJvdG9jb2woc2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBfcHJvdG9jb2wsCisgIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gX3Byb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBfc2VxaWQpCiAgICAgOiBUUHJvdG9jb2xEZWNvcmF0b3IoX3Byb3RvY29sKSwgbmFtZShfbmFtZSksIHR5cGUoX3R5cGUpLCBzZXFpZChfc2VxaWQpIHt9CiAKLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBfbmFtZSwgVE1lc3NhZ2VUeXBlJiBfdHlwZSwgaW50MzJfdCYgX3NlcWlkKSB7CisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgX25hbWUsIFRNZXNzYWdlVHlwZSYgX3R5cGUsIGludDMyX3QmIF9zZXFpZCkgb3ZlcnJpZGUgewogCiAgICAgX25hbWUgPSBuYW1lOwogICAgIF90eXBlID0gdHlwZTsKQEAgLTY3LDE5ICs2NSwxOSBAQAogICogcHJvY2Vzc29ycyB3aXRoIGl0LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PC9wPgogICoKICAqIDxibG9ja3F1b3RlPjxjb2RlPgotICogICAgIHNoYXJlZF9wdHI8VE11bHRpcGxleGVkUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpKTsKKyAqICAgICBzdGQ6OnNoYXJlZF9wdHI8VE11bHRpcGxleGVkUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpKTsKICAqCiAgKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKICAqICAgICAgICAgIkNhbGN1bGF0b3IiLAotICogICAgICAgICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+KCBuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcigKLSAqICAgICAgICAgICAgIHNoYXJlZF9wdHI8Q2FsY3VsYXRvckhhbmRsZXI+KCBuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpKSk7CisgKiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiggbmV3IENhbGN1bGF0b3JQcm9jZXNzb3IoCisgKiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FsY3VsYXRvckhhbmRsZXI+KCBuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpKSk7CiAgKgogICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCiAgKiAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKLSAqICAgICAgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiggbmV3IFdlYXRoZXJSZXBvcnRQcm9jZXNzb3IoCi0gKiAgICAgICAgICAgICBzaGFyZWRfcHRyPFdlYXRoZXJSZXBvcnRIYW5kbGVyPiggbmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKSkpOworICogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4oIG5ldyBXZWF0aGVyUmVwb3J0UHJvY2Vzc29yKAorICogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFdlYXRoZXJSZXBvcnRIYW5kbGVyPiggbmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKSkpOwogICoKLSAqICAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVFNlcnZlclNvY2tldCg5MDkwKSk7CisgKiAgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVFNlcnZlclNvY2tldCg5MDkwKSk7CiAgKiAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQpOwogICoKICAqICAgICBzZXJ2ZXIuc2VydmUoKTsKQEAgLTg3LDcgKzg1LDcgQEAKICAqLwogY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yIDogcHVibGljIFRQcm9jZXNzb3IgewogcHVibGljOgotICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+ID4gc2VydmljZXNfdDsKKyAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+ID4gc2VydmljZXNfdDsKIAogICAvKioKICAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+LiAgVGhpcwpAQCAtMTAwLDExICs5OCw0MSBAQAogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYXMgImhhbmRsZXJzIiwgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciwKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGluZyBXZWF0aGVyUmVwb3J0SWYgaW50ZXJmYWNlLgogICAgICovCi0gIHZvaWQgcmVnaXN0ZXJQcm9jZXNzb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VOYW1lLCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcikgeworICB2b2lkIHJlZ2lzdGVyUHJvY2Vzc29yKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlTmFtZSwgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcikgewogICAgIHNlcnZpY2VzW3NlcnZpY2VOYW1lXSA9IHByb2Nlc3NvcjsKICAgfQogCiAgIC8qKgorICAgKiBSZWdpc3RlciBhIHNlcnZpY2UgdG8gYmUgY2FsbGVkIHRvIHByb2Nlc3MgcXVlcmllcyB3aXRob3V0IHNlcnZpY2UgbmFtZQorICAgKiBccGFyYW0gW2luXSBwcm9jZXNzb3IgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UuCisgICAqLworICB2b2lkIHJlZ2lzdGVyRGVmYXVsdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvcikgeworICAgIGRlZmF1bHRQcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgIH0KKworICAvKioKKyAgICogQ2hldyB1cCBpbnZhbGlkIGlucHV0IGFuZCByZXR1cm4gYW4gZXhjZXB0aW9uIHRvIHRocm93LgorICAgKi8KKyAgVEV4Y2VwdGlvbiBwcm90b2NvbF9lcnJvcihzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgY29uc3QgeworICAgIGluLT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7CisgICAgaW4tPnJlYWRNZXNzYWdlRW5kKCk7CisgICAgaW4tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7CisgICAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICAgICB4KDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6UFJPVE9DT0xfRVJST1IsCisgICAgICAgICJUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6ICIgKyBtc2cpOworICAgIG91dC0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7CisgICAgeC53cml0ZShvdXQuZ2V0KCkpOworICAgIG91dC0+d3JpdGVNZXNzYWdlRW5kKCk7CisgICAgb3V0LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsKKyAgICBvdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOworICAgIHJldHVybiBURXhjZXB0aW9uKG1zZyk7Cit9CisgICAKKyAgLyoqCiAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+cHJvY2VzczwvY29kZT4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKICAgICoKICAgICogPG9sPgpAQCAtMTE5LDkgKzE0Nyw5IEBACiAgICAqIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IgaWYgdGhlIHNlcnZpY2UKICAgICogbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBzZXJ2aWNlIG1hcC4KICAgICovCi0gIGJvb2wgcHJvY2VzcyhzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCi0gICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworICBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSBvdmVycmlkZSB7CiAgICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIHR5cGU7CiAgICAgaW50MzJfdCBzZXFpZDsKQEAgLTEzMywyMiArMTYxLDEwIEBACiAKICAgICBpZiAodHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIHR5cGUgIT0gcHJvdG9jb2w6OlRfT05FV0FZKSB7CiAgICAgICAvLyBVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZS4KLSAgICAgIGluLT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7Ci0gICAgICBpbi0+cmVhZE1lc3NhZ2VFbmQoKTsKLSAgICAgIGluLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOwotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbXNnKCJUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6IFVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIik7Ci0gICAgICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24KLSAgICAgICAgICB4KDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6UFJPVE9DT0xfRVJST1IsIG1zZyk7Ci0gICAgICBvdXQtPndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOwotICAgICAgeC53cml0ZShvdXQuZ2V0KCkpOwotICAgICAgb3V0LT53cml0ZU1lc3NhZ2VFbmQoKTsKLSAgICAgIG91dC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7Ci0gICAgICBvdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOwotICAgICAgdGhyb3cgVEV4Y2VwdGlvbihtc2cpOworICAgICAgdGhyb3cgcHJvdG9jb2xfZXJyb3IoaW4sIG91dCwgbmFtZSwgc2VxaWQsICJVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSIpOwogICAgIH0KIAogICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQotCiAgICAgYm9vc3Q6OnRva2VuaXplcjxib29zdDo6Y2hhcl9zZXBhcmF0b3I8Y2hhcj4gPiB0b2sobmFtZSwgYm9vc3Q6OmNoYXJfc2VwYXJhdG9yPGNoYXI+KCI6IikpOwogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRva2VuczsKQEAgLTE1OCw0MiArMTc0LDQ5IEBACiAgICAgLy8gbmFtZSBhbmQgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsLgogICAgIGlmICh0b2tlbnMuc2l6ZSgpID09IDIpIHsKICAgICAgIC8vIFNlYXJjaCBmb3IgYSBwcm9jZXNzb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmljZSBuYW1lLgotICAgICAgc2VydmljZXNfdDo6aXRlcmF0b3IgaXQgPSBzZXJ2aWNlcy5maW5kKHRva2Vuc1swXSk7CisgICAgICBhdXRvIGl0ID0gc2VydmljZXMuZmluZCh0b2tlbnNbMF0pOwogCiAgICAgICBpZiAoaXQgIT0gc2VydmljZXMuZW5kKCkpIHsKLSAgICAgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBpdC0+c2Vjb25kOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gaXQtPnNlY29uZDsKICAgICAgICAgLy8gTGV0IHRoZSBwcm9jZXNzb3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBzZXJ2aWNlIG5hbWUKICAgICAgICAgLy8gcHJvY2VzcyB0aGUgbWVzc2FnZS4KICAgICAgICAgcmV0dXJuIHByb2Nlc3NvcgotICAgICAgICAgICAgLT5wcm9jZXNzKHNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4oCisgICAgICAgICAgICAtPnByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+KAogICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgcHJvdG9jb2w6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgdG9rZW5zWzFdLCB0eXBlLCBzZXFpZCkpLAogICAgICAgICAgICAgICAgICAgICAgIG91dCwKICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICAvLyBVbmtub3duIHNlcnZpY2UuCi0gICAgICAgIGluLT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7Ci0gICAgICAgIGluLT5yZWFkTWVzc2FnZUVuZCgpOwotICAgICAgICBpbi0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsKLQotICAgICAgICBzdGQ6OnN0cmluZyBtc2coIlRNdWx0aXBsZXhlZFByb2Nlc3NvcjogVW5rbm93biBzZXJ2aWNlOiAiKTsKLSAgICAgICAgbXNnICs9IHRva2Vuc1swXTsKLSAgICAgICAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uCi0gICAgICAgICAgICB4KDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6UFJPVE9DT0xfRVJST1IsIG1zZyk7Ci0gICAgICAgIG91dC0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7Ci0gICAgICAgIHgud3JpdGUob3V0LmdldCgpKTsKLSAgICAgICAgb3V0LT53cml0ZU1lc3NhZ2VFbmQoKTsKLSAgICAgICAgb3V0LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsKLSAgICAgICAgb3V0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsKLSAgICAgICAgbXNnICs9ICIuIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iOwotICAgICAgICB0aHJvdyBURXhjZXB0aW9uKG1zZyk7CisgICAgICAgIHRocm93IHByb3RvY29sX2Vycm9yKGluLCBvdXQsIG5hbWUsIHNlcWlkLCAKKyAgICAgICAgICAgICJVbmtub3duIHNlcnZpY2U6ICIgKyB0b2tlbnNbMF0gKworCQkJCSIuIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKTsKICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRva2Vucy5zaXplKCkgPT0gMSkgeworCSAgaWYgKGRlZmF1bHRQcm9jZXNzb3IpIHsKKyAgICAgICAgLy8gbm9uLW11bHRpcGxleGVkIGNsaWVudCBmb3J3YXJkcyB0byBkZWZhdWx0IHByb2Nlc3NvcgorICAgICAgICByZXR1cm4gZGVmYXVsdFByb2Nlc3NvciAgICAgICAgICAgIAorICAgICAgICAgICAgLT5wcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHByb3RvY29sOjpTdG9yZWRNZXNzYWdlUHJvdG9jb2woaW4sIHRva2Vuc1swXSwgdHlwZSwgc2VxaWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQpOworCSAgfSBlbHNlIHsKKwkJdGhyb3cgcHJvdG9jb2xfZXJyb3IoaW4sIG91dCwgbmFtZSwgc2VxaWQsCisJCQkiTm9uLW11bHRpcGxleGVkIGNsaWVudCByZXF1ZXN0IGRyb3BwZWQuICIKKwkJCSJEaWQgeW91IGZvcmdldCB0byBjYWxsIGRlZmF1bHRQcm9jZXNzb3IoKT8iKTsKKwkgIH0KKyAgICB9IGVsc2UgeworCQl0aHJvdyBwcm90b2NvbF9lcnJvcihpbiwgb3V0LCBuYW1lLCBzZXFpZCwKKwkJICAgICJXcm9uZyBudW1iZXIgb2YgdG9rZW5zLiIpOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAogcHJpdmF0ZToKICAgLyoqIE1hcCBvZiBzZXJ2aWNlIHByb2Nlc3NvciBvYmplY3RzLCBpbmRleGVkIGJ5IHNlcnZpY2UgbmFtZXMuICovCiAgIHNlcnZpY2VzX3Qgc2VydmljZXM7CisgIAorICAvLyEgSWYgYSBub24tbXVsdGkgY2xpZW50IHJlcXVlc3RzIHNvbWV0aGluZywgaXQgZ29lcyB0byB0aGUKKyAgLy8hIGRlZmF1bHQgcHJvY2Vzc29yIChpZiBvbmUgaXMgZGVmaW5lZCkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZGVmYXVsdFByb2Nlc3NvcjsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCmluZGV4IGJlYjc2ZWIuLjc0NzRmNWEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCkBAIC0xOSw4ICsxOSw2IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmg+CiAKLSNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KLQogdXNpbmcgc3RkOjpzdHJpbmc7CiAKIG5hbWVzcGFjZSBhcGFjaGUgewpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCmluZGV4IGUwNjUwY2YuLjZiZDVmYjggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTM2LDEzICszNiwxMiBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXyA9IFROZXR3b3JrQmlnRW5kaWFuPgogY2xhc3MgVEJpbmFyeVByb3RvY29sVCA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4gPiB7Ci1wcm90ZWN0ZWQ6CitwdWJsaWM6CiAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFZFUlNJT05fTUFTSyA9ICgoaW50MzJfdCkweGZmZmYwMDAwKTsKICAgc3RhdGljIGNvbnN0IGludDMyX3QgVkVSU0lPTl8xID0gKChpbnQzMl90KTB4ODAwMTAwMDApOwogICAvLyBWRVJTSU9OXzIgKDB4ODAwMjAwMDApIHdhcyB0YWtlbiBieSBURGVuc2VQcm90b2NvbCAod2hpY2ggaGFzIHNpbmNlIGJlZW4gcmVtb3ZlZCkKIAotcHVibGljOgotICBUQmluYXJ5UHJvdG9jb2xUKGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zKQorICBUQmluYXJ5UHJvdG9jb2xUKHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucykKICAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPiA+KHRyYW5zKSwKICAgICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCiAgICAgICBzdHJpbmdfbGltaXRfKDApLApAQCAtNTAsNyArNDksNyBAQAogICAgICAgc3RyaWN0X3JlYWRfKGZhbHNlKSwKICAgICAgIHN0cmljdF93cml0ZV8odHJ1ZSkge30KIAotICBUQmluYXJ5UHJvdG9jb2xUKGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAorICBUQmluYXJ5UHJvdG9jb2xUKHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucywKICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmluZ19saW1pdCwKICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCwKICAgICAgICAgICAgICAgICAgICBib29sIHN0cmljdF9yZWFkLApAQCAtMjAyLDcgKzIwMSw3IEBACiAgICAgICBzdHJpY3RfcmVhZF8oc3RyaWN0X3JlYWQpLAogICAgICAgc3RyaWN0X3dyaXRlXyhzdHJpY3Rfd3JpdGUpIHt9CiAKLSAgdmlydHVhbCB+VEJpbmFyeVByb3RvY29sRmFjdG9yeVQoKSB7fQorICB+VEJpbmFyeVByb3RvY29sRmFjdG9yeVQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKICAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsgc3RyaW5nX2xpbWl0XyA9IHN0cmluZ19saW1pdDsgfQogCkBAIC0yMTMsMjYgKzIxMiwyNCBAQAogICAgIHN0cmljdF93cml0ZV8gPSBzdHJpY3Rfd3JpdGU7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gc3BlY2lmaWNfdHJhbnMgPSBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VHJhbnNwb3J0Xz4odHJhbnMpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIG92ZXJyaWRlIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gc3BlY2lmaWNfdHJhbnMgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRyYW5zcG9ydF8+KHRyYW5zKTsKICAgICBUUHJvdG9jb2wqIHByb3Q7CiAgICAgaWYgKHNwZWNpZmljX3RyYW5zKSB7Ci0gICAgICBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4oCi0gICAgICAgIHNwZWNpZmljX3RyYW5zLAotICAgICAgICBzdHJpbmdfbGltaXRfLAotICAgICAgICBjb250YWluZXJfbGltaXRfLAotICAgICAgICBzdHJpY3RfcmVhZF8sCi0gICAgICAgIHN0cmljdF93cml0ZV8pOworICAgICAgcHJvdCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+KHNwZWNpZmljX3RyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19saW1pdF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xpbWl0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RfcmVhZF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0X3dyaXRlXyk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sVDxUVHJhbnNwb3J0LCBCeXRlT3JkZXJfPigKLSAgICAgICAgdHJhbnMsCi0gICAgICAgIHN0cmluZ19saW1pdF8sCi0gICAgICAgIGNvbnRhaW5lcl9saW1pdF8sCi0gICAgICAgIHN0cmljdF9yZWFkXywKLSAgICAgICAgc3RyaWN0X3dyaXRlXyk7CisgICAgICBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydCwgQnl0ZU9yZGVyXz4odHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2xpbWl0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfbGltaXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF9yZWFkXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Rfd3JpdGVfKTsKICAgICB9CiAKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPihwcm90KTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ocHJvdCk7CiAgIH0KIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKaW5kZXggYWUzNTBkZi4uMjk2NGYyNSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKQEAgLTMwLDggKzMwLDggQEAKIAogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+CiB1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKICAgaWYgKHRoaXMtPnN0cmljdF93cml0ZV8pIHsKICAgICBpbnQzMl90IHZlcnNpb24gPSAoVkVSU0lPTl8xKSB8ICgoaW50MzJfdCltZXNzYWdlVHlwZSk7CiAgICAgdWludDMyX3Qgd3NpemUgPSAwOwpAQCAtNjYsOCArNjYsOCBAQAogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KIHVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CiAgICh2b2lkKW5hbWU7CiAgIHVpbnQzMl90IHdzaXplID0gMDsKICAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpZmllbGRUeXBlKTsKQEAgLTg3LDggKzg3LDggQEAKIAogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+CiB1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewogICB1aW50MzJfdCB3c2l6ZSA9IDA7CiAgIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWtleVR5cGUpOwogICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCl2YWxUeXBlKTsKQEAgLTEwMiw3ICsxMDIsOCBAQAogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKICAgdWludDMyX3Qgd3NpemUgPSAwOwogICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCllbGVtVHlwZSk7CiAgIHdzaXplICs9IHdyaXRlSTMyKChpbnQzMl90KXNpemUpOwpAQCAtMTE1LDcgKzExNiw4IEBACiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgewordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewogICB1aW50MzJfdCB3c2l6ZSA9IDA7CiAgIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWVsZW1UeXBlKTsKICAgd3NpemUgKz0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7CkBAIC0xNDIsMzEgKzE0NCwzMSBAQAogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KIHVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7Ci0gIGludDE2X3QgbmV0ID0gKGludDE2X3QpQnl0ZU9yZGVyXzo6dG9XaXJlMTYoaTE2KTsKKyAgYXV0byBuZXQgPSAoaW50MTZfdClCeXRlT3JkZXJfOjp0b1dpcmUxNihpMTYpOwogICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmbmV0LCAyKTsKICAgcmV0dXJuIDI7CiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgogdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgaW50MzJfdCBuZXQgPSAoaW50MzJfdClCeXRlT3JkZXJfOjp0b1dpcmUzMihpMzIpOworICBhdXRvIG5ldCA9IChpbnQzMl90KUJ5dGVPcmRlcl86OnRvV2lyZTMyKGkzMik7CiAgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZuZXQsIDQpOwogICByZXR1cm4gNDsKIH0KIAogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+CiB1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICBpbnQ2NF90IG5ldCA9IChpbnQ2NF90KUJ5dGVPcmRlcl86OnRvV2lyZTY0KGk2NCk7CisgIGF1dG8gbmV0ID0gKGludDY0X3QpQnl0ZU9yZGVyXzo6dG9XaXJlNjQoaTY0KTsKICAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopJm5ldCwgOCk7CiAgIHJldHVybiA4OwogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KIHVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpKTsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSk7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgInNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSwgInN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5Iik7CiAKLSAgdWludDY0X3QgYml0cyA9IGJpdHdpc2VfY2FzdDx1aW50NjRfdD4oZHViKTsKKyAgYXV0byBiaXRzID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihkdWIpOwogICBiaXRzID0gQnl0ZU9yZGVyXzo6dG9XaXJlNjQoYml0cyk7CiAgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZiaXRzLCA4KTsKICAgcmV0dXJuIDg7CkBAIC0xNzcsNyArMTc5LDcgQEAKIHVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU3RyaW5nKGNvbnN0IFN0clR5cGUmIHN0cikgewogICBpZiAoc3RyLnNpemUoKSA+IHN0YXRpY19jYXN0PHNpemVfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkpCiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIHVpbnQzMl90IHNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLnNpemUoKSk7CisgIGF1dG8gc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHIuc2l6ZSgpKTsKICAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7CiAgIGlmIChzaXplID4gMCkgewogICAgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKXN0ci5kYXRhKCksIHNpemUpOwpAQCAtMTk2LDggKzE5OCw4IEBACiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgogdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKICAgdWludDMyX3QgcmVzdWx0ID0gMDsKICAgaW50MzJfdCBzejsKICAgcmVzdWx0ICs9IHJlYWRJMzIoc3opOwpAQCAtMjQ1LDggKzI0Nyw4IEBACiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgogdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKICAgKHZvaWQpbmFtZTsKICAgdWludDMyX3QgcmVzdWx0ID0gMDsKICAgaW50OF90IHR5cGU7CkBAIC0yNjcsOCArMjY5LDggQEAKIAogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+CiB1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewogICBpbnQ4X3QgaywgdjsKICAgdWludDMyX3QgcmVzdWx0ID0gMDsKICAgaW50MzJfdCBzaXplaTsKQEAgLTM4Niw4ICszODgsOCBAQAogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KIHVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpKTsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSk7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgInNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSwgInN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5Iik7CiAKICAgdW5pb24gYnl0ZXMgewogICAgIHVpbnQ4X3QgYls4XTsKQEAgLTQzNSw3ICs0MzcsNyBAQAogICAvLyBUcnkgdG8gYm9ycm93IGZpcnN0CiAgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd19idWY7CiAgIHVpbnQzMl90IGdvdCA9IHNpemU7Ci0gIGlmICgoYm9ycm93X2J1ZiA9IHRoaXMtPnRyYW5zXy0+Ym9ycm93KE5VTEwsICZnb3QpKSkgeworICBpZiAoKGJvcnJvd19idWYgPSB0aGlzLT50cmFuc18tPmJvcnJvdyhudWxscHRyLCAmZ290KSkpIHsKICAgICBzdHIuYXNzaWduKChjb25zdCBjaGFyKilib3Jyb3dfYnVmLCBzaXplKTsKICAgICB0aGlzLT50cmFuc18tPmNvbnN1bWUoc2l6ZSk7CiAgICAgcmV0dXJuIHNpemU7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaAppbmRleCA1YjdhZGUyLi4yOTMwYWJhIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgogCiAjaW5jbHVkZSA8c3RhY2s+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtMzQsMTEgKzM0LDEyIEBACiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgogY2xhc3MgVENvbXBhY3RQcm90b2NvbFQgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+IHsKLQotcHJvdGVjdGVkOgorcHVibGljOgogICBzdGF0aWMgY29uc3QgaW50OF90IFBST1RPQ09MX0lEID0gKGludDhfdCkweDgydTsKICAgc3RhdGljIGNvbnN0IGludDhfdCBWRVJTSU9OX04gPSAxOwogICBzdGF0aWMgY29uc3QgaW50OF90IFZFUlNJT05fTUFTSyA9IDB4MWY7ICAgICAgIC8vIDAwMDEgMTExMQorCitwcm90ZWN0ZWQ6CiAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgVFlQRV9NQVNLID0gKGludDhfdCkweEUwdTsgLy8gMTExMCAwMDAwCiAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgVFlQRV9CSVRTID0gMHgwNzsgICAgICAgICAgLy8gMDAwMCAwMTExCiAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKQEAgLTczLDMzICs3NCwzMyBAQAogICBpbnQxNl90IGxhc3RGaWVsZElkXzsKIAogcHVibGljOgotICBUQ29tcGFjdFByb3RvY29sVChib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucykKKyAgVENvbXBhY3RQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zKQogICAgIDogVFZpcnR1YWxQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+KHRyYW5zKSwKICAgICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCiAgICAgICBsYXN0RmllbGRJZF8oMCksCiAgICAgICBzdHJpbmdfbGltaXRfKDApLAotICAgICAgc3RyaW5nX2J1Zl8oTlVMTCksCisgICAgICBzdHJpbmdfYnVmXyhudWxscHRyKSwKICAgICAgIHN0cmluZ19idWZfc2l6ZV8oMCksCiAgICAgICBjb250YWluZXJfbGltaXRfKDApIHsKLSAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOworICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IG51bGxwdHI7CiAgICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKICAgfQogCi0gIFRDb21wYWN0UHJvdG9jb2xUKGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAorICBUQ29tcGFjdFByb3RvY29sVChzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMsCiAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaW5nX2xpbWl0LAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkKICAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCiAgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAogICAgICAgbGFzdEZpZWxkSWRfKDApLAogICAgICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAotICAgICAgc3RyaW5nX2J1Zl8oTlVMTCksCisgICAgICBzdHJpbmdfYnVmXyhudWxscHRyKSwKICAgICAgIHN0cmluZ19idWZfc2l6ZV8oMCksCiAgICAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkgewotICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IE5VTEw7CisgICAgYm9vbGVhbkZpZWxkXy5uYW1lID0gbnVsbHB0cjsKICAgICBib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IGZhbHNlOwogICB9CiAKLSAgflRDb21wYWN0UHJvdG9jb2xUKCkgeyBmcmVlKHN0cmluZ19idWZfKTsgfQorICB+VENvbXBhY3RQcm90b2NvbFQoKSBvdmVycmlkZSB7IGZyZWUoc3RyaW5nX2J1Zl8pOyB9CiAKICAgLyoqCiAgICAqIFdyaXRpbmcgZnVuY3Rpb25zCkBAIC0yMzIsMTQgKzIzMywxNCBAQAogICBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQoaW50MzJfdCBzdHJpbmdfbGltaXQsIGludDMyX3QgY29udGFpbmVyX2xpbWl0KQogICAgIDogc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLCBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkge30KIAotICB2aXJ0dWFsIH5UQ29tcGFjdFByb3RvY29sRmFjdG9yeVQoKSB7fQorICB+VENvbXBhY3RQcm90b2NvbEZhY3RvcnlUKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7IHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7IH0KIAogICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgeyBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRyYW5zcG9ydF8+KHRyYW5zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSBvdmVycmlkZSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7CiAgICAgVFByb3RvY29sKiBwcm90OwogICAgIGlmIChzcGVjaWZpY190cmFucykgewogICAgICAgcHJvdCA9IG5ldyBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPihzcGVjaWZpY190cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xyk7CkBAIC0yNDcsNyArMjQ4LDcgQEAKICAgICAgIHByb3QgPSBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xyk7CiAgICAgfQogCi0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ocHJvdCk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KHByb3QpOwogICB9CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MKaW5kZXggNGQ2NjBlOC4uZDFlMzQyZSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYwpAQCAtMjEsNiArMjEsOCBAQAogCiAjaW5jbHVkZSA8bGltaXRzPgogCisjaW5jbHVkZSAidGhyaWZ0L2NvbmZpZy5oIgorCiAvKgogICogVENvbXBhY3RQcm90b2NvbDo6aSpUb1ppZ3phZyBkZXBlbmQgb24gdGhlIGZhY3QgdGhhdCB0aGUgcmlnaHQgc2hpZnQKICAqIG9wZXJhdG9yIG9uIGEgc2lnbmVkIGludGVnZXIgaXMgYW4gYXJpdGhtZXRpYyAoc2lnbi1leHRlbmRpbmcpIHNoaWZ0LgpAQCAtMTk2LDcgKzE5OCw3IEBACiB1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKICAgdWludDMyX3Qgd3NpemUgPSAwOwogCi0gIGlmIChib29sZWFuRmllbGRfLm5hbWUgIT0gTlVMTCkgeworICBpZiAoYm9vbGVhbkZpZWxkXy5uYW1lICE9IG51bGxwdHIpIHsKICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKICAgICB3c2l6ZQogICAgICAgKz0gd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoYm9vbGVhbkZpZWxkXy5uYW1lLApAQCAtMjA1LDcgKzIwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX1RSVUUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0UpKTsKLSAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOworICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IG51bGxwdHI7CiAgIH0gZWxzZSB7CiAgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUKICAgICB3c2l6ZQpAQCAtMjUxLDEwICsyNTMsMTAgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CiB1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOwotICBCT09TVF9TVEFUSUNfQVNTRVJUKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5KTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpLCAic2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSIpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5LCAic3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkiKTsKIAotICB1aW50NjRfdCBiaXRzID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihkdWIpOworICBhdXRvIGJpdHMgPSBiaXR3aXNlX2Nhc3Q8dWludDY0X3Q+KGR1Yik7CiAgIGJpdHMgPSBUSFJJRlRfaHRvbGVsbChiaXRzKTsKICAgdHJhbnNfLT53cml0ZSgodWludDhfdCopJmJpdHMsIDgpOwogICByZXR1cm4gODsKQEAgLTI3Miw3ICsyNzQsNyBAQAogdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKICAgaWYoc3RyLnNpemUoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB1aW50MzJfdCBzc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHIuc2l6ZSgpKTsKKyAgYXV0byBzc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHIuc2l6ZSgpKTsKICAgdWludDMyX3Qgd3NpemUgPSB3cml0ZVZhcmludDMyKHNzaXplKSA7CiAgIC8vIGNoZWNraW5nIHNzaXplICsgd3NpemUgPiB1aW50X21heCwgYnV0IHdlIGRvbid0IHdhbnQgdG8gb3ZlcmZsb3cgd2hpbGUgY2hlY2tpbmcgZm9yIG92ZXJmbG93cy4KICAgLy8gdHJhbnNmb3JtaW5nIHRoZSBjaGVjayB0byBzc2l6ZSA+IHVpbnRfbWF4IC0gd3NpemUKQEAgLTM4NSw3ICszODcsNyBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIHVpbnQ2NF90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjppNjRUb1ppZ3phZyhjb25zdCBpbnQ2NF90IGwpIHsKLSAgcmV0dXJuIChsIDw8IDEpIF4gKGwgPj4gNjMpOworICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQ2NF90PihsKSA8PCAxKSBeIChsID4+IDYzKTsKIH0KIAogLyoqCkBAIC0zOTQsNyArMzk2LDcgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CiB1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6aTMyVG9aaWd6YWcoY29uc3QgaW50MzJfdCBuKSB7Ci0gIHJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKTsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50MzJfdD4obikgPDwgMSkgXiAobiA+PiAzMSk7CiB9CiAKIC8qKgpAQCAtNDg2LDcgKzQ4OCw3IEBACiAgIH0KIAogICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCi0gIGludDE2X3QgbW9kaWZpZXIgPSAoaW50MTZfdCkoKCh1aW50OF90KWJ5dGUgJiAweGYwKSA+PiA0KTsKKyAgYXV0byBtb2RpZmllciA9IChpbnQxNl90KSgoKHVpbnQ4X3QpYnl0ZSAmIDB4ZjApID4+IDQpOwogICBpZiAobW9kaWZpZXIgPT0gMCkgewogICAgIC8vIG5vdCBhIGRlbHRhLCBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KICAgICByc2l6ZSArPSByZWFkSTE2KGZpZWxkSWQpOwpAQCAtNjUxLDggKzY1Myw4IEBACiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgogdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpKTsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSk7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgInNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSwgInN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5Iik7CiAKICAgdW5pb24gewogICAgIHVpbnQ2NF90IGJpdHM7CkBAIC02OTMsOSArNjk1LDkgQEAKICAgfQogCiAgIC8vIFVzZSB0aGUgaGVhcCBoZXJlIHRvIHByZXZlbnQgc3RhY2sgb3ZlcmZsb3cgZm9yIHYuIGxhcmdlIHN0cmluZ3MKLSAgaWYgKHNpemUgPiBzdHJpbmdfYnVmX3NpemVfIHx8IHN0cmluZ19idWZfID09IE5VTEwpIHsKKyAgaWYgKHNpemUgPiBzdHJpbmdfYnVmX3NpemVfIHx8IHN0cmluZ19idWZfID09IG51bGxwdHIpIHsKICAgICB2b2lkKiBuZXdfc3RyaW5nX2J1ZiA9IHN0ZDo6cmVhbGxvYyhzdHJpbmdfYnVmXywgKHVpbnQzMl90KXNpemUpOwotICAgIGlmIChuZXdfc3RyaW5nX2J1ZiA9PSBOVUxMKSB7CisgICAgaWYgKG5ld19zdHJpbmdfYnVmID09IG51bGxwdHIpIHsKICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CiAgICAgfQogICAgIHN0cmluZ19idWZfID0gKHVpbnQ4X3QqKW5ld19zdHJpbmdfYnVmOwpAQCAtNzMzLDcgKzczNSw3IEBACiAgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd2VkID0gdHJhbnNfLT5ib3Jyb3coYnVmLCAmYnVmX3NpemUpOwogCiAgIC8vIEZhc3QgcGF0aC4KLSAgaWYgKGJvcnJvd2VkICE9IE5VTEwpIHsKKyAgaWYgKGJvcnJvd2VkICE9IG51bGxwdHIpIHsKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgdWludDhfdCBieXRlID0gYm9ycm93ZWRbcnNpemVdOwogICAgICAgcnNpemUrKzsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCmluZGV4IDQ2ODdlODIuLjBlNmQ0YTIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcApAQCAtMTksMTIgKzE5LDExIEBACiAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KIAorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KICNpbmNsdWRlIDxjYXNzZXJ0PgogI2luY2x1ZGUgPGNjdHlwZT4KICNpbmNsdWRlIDxjc3RkaW8+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCkBAIC0xMjksNyArMTI4LDcgQEAKICAgY2FzZSBNQVBfVkFMVUU6CiAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIiAtPiAiKTsKICAgY2FzZSBMSVNUOgotICAgIHNpemUgPSB3cml0ZUluZGVudGVkKCJbIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihsaXN0X2lkeF8uYmFjaygpKSArICJdID0gIik7CisgICAgc2l6ZSA9IHdyaXRlSW5kZW50ZWQoIlsiICsgdG9fc3RyaW5nKGxpc3RfaWR4Xy5iYWNrKCkpICsgIl0gPSAiKTsKICAgICBsaXN0X2lkeF8uYmFjaygpKys7CiAgICAgcmV0dXJuIHNpemU7CiAgIGRlZmF1bHQ6CkBAIC0yMjMsNyArMjIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKICAgLy8gc3ByaW50ZihpZF9zdHIsICIlMDJkIiwgZmllbGRJZCk7Ci0gIHN0cmluZyBpZF9zdHIgPSBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oZmllbGRJZCk7CisgIHN0cmluZyBpZF9zdHIgPSB0b19zdHJpbmcoZmllbGRJZCk7CiAgIGlmIChpZF9zdHIubGVuZ3RoKCkgPT0gMSkKICAgICBpZF9zdHIgPSAnMCcgKyBpZF9zdHI7CiAKQEAgLTI0OCw3ICsyNDcsNyBAQAogICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKICAgYnNpemUgKz0gd3JpdGVQbGFpbigKICAgICAgICJtYXA8IiArIGZpZWxkVHlwZU5hbWUoa2V5VHlwZSkgKyAiLCIgKyBmaWVsZFR5cGVOYW1lKHZhbFR5cGUpICsgIj4iCi0gICAgICAiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc2l6ZSkgKyAiXSB7XG4iKTsKKyAgICAgICJbIiArIHRvX3N0cmluZyhzaXplKSArICJdIHtcbiIpOwogICBpbmRlbnRVcCgpOwogICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKE1BUF9LRVkpOwogICByZXR1cm4gYnNpemU7CkBAIC0yNjksNyArMjY4LDcgQEAKICAgYnNpemUgKz0gc3RhcnRJdGVtKCk7CiAgIGJzaXplICs9IHdyaXRlUGxhaW4oCiAgICAgICAibGlzdDwiICsgZmllbGRUeXBlTmFtZShlbGVtVHlwZSkgKyAiPiIKLSAgICAgICJbIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihzaXplKSArICJdIHtcbiIpOworICAgICAgIlsiICsgdG9fc3RyaW5nKHNpemUpICsgIl0ge1xuIik7CiAgIGluZGVudFVwKCk7CiAgIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soTElTVCk7CiAgIGxpc3RfaWR4Xy5wdXNoX2JhY2soMCk7CkBAIC0yOTIsNyArMjkxLDcgQEAKICAgYnNpemUgKz0gc3RhcnRJdGVtKCk7CiAgIGJzaXplICs9IHdyaXRlUGxhaW4oCiAgICAgICAic2V0PCIgKyBmaWVsZFR5cGVOYW1lKGVsZW1UeXBlKSArICI+IgotICAgICAgIlsiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KHNpemUpICsgIl0ge1xuIik7CisgICAgICAiWyIgKyB0b19zdHJpbmcoc2l6ZSkgKyAiXSB7XG4iKTsKICAgaW5kZW50VXAoKTsKICAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhTRVQpOwogICByZXR1cm4gYnNpemU7CkBAIC0zMTYsMTkgKzMxNSwxOSBAQAogfQogCiB1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbShib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oaTE2KSk7CisgIHJldHVybiB3cml0ZUl0ZW0odG9fc3RyaW5nKGkxNikpOwogfQogCiB1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbShib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oaTMyKSk7CisgIHJldHVybiB3cml0ZUl0ZW0odG9fc3RyaW5nKGkzMikpOwogfQogCiB1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbShib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oaTY0KSk7CisgIHJldHVybiB3cml0ZUl0ZW0odG9fc3RyaW5nKGk2NCkpOwogfQogCiB1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihkdWIpKTsKKyAgcmV0dXJuIHdyaXRlSXRlbSh0b19zdHJpbmcoZHViKSk7CiB9CiAKIHVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cmluZyhjb25zdCBzdHJpbmcmIHN0cikgewpAQCAtMzM3LDcgKzMzNiw3IEBACiAgIHN0cmluZyB0b19zaG93ID0gc3RyOwogICBpZiAodG9fc2hvdy5sZW5ndGgoKSA+IChzdHJpbmc6OnNpemVfdHlwZSlzdHJpbmdfbGltaXRfKSB7CiAgICAgdG9fc2hvdyA9IHN0ci5zdWJzdHIoMCwgc3RyaW5nX3ByZWZpeF9zaXplXyk7Ci0gICAgdG9fc2hvdyArPSAiWy4uLl0oIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihzdHIubGVuZ3RoKCkpICsgIikiOworICAgIHRvX3Nob3cgKz0gIlsuLi5dKCIgKyB0b19zdHJpbmcoc3RyLmxlbmd0aCgpKSArICIpIjsKICAgfQogCiAgIHN0cmluZyBvdXRwdXQgPSAiXCIiOwpAQCAtMzQ3LDcgKzM0Niw5IEBACiAgICAgICBvdXRwdXQgKz0gIlxcXFwiOwogICAgIH0gZWxzZSBpZiAoKml0ID09ICciJykgewogICAgICAgb3V0cHV0ICs9ICJcXFwiIjsKLSAgICB9IGVsc2UgaWYgKHN0ZDo6aXNwcmludCgqaXQpKSB7CisgICAgICAvLyBwYXNzaW5nIGNoYXJhY3RlcnMgPDAgdG8gc3RkOjppc3ByaW50IGNhdXNlcyBhc3NlcnRzLiBpc3ByaW50IHRha2VzIGFuCisgICAgICAvLyBpbnQsIHNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBzaWduIGV4dGVuc2lvbgorICAgIH0gZWxzZSBpZiAoc3RkOjppc3ByaW50KCh1bnNpZ25lZCBjaGFyKSppdCkpIHsKICAgICAgIG91dHB1dCArPSAqaXQ7CiAgICAgfSBlbHNlIHsKICAgICAgIHN3aXRjaCAoKml0KSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oCmluZGV4IGNjOTMyMzAuLjQxYmIwZDQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtNTEsNyArNTEsNyBAQAogICBlbnVtIHdyaXRlX3N0YXRlX3QgeyBVTklOSVQsIFNUUlVDVCwgTElTVCwgU0VULCBNQVBfS0VZLCBNQVBfVkFMVUUgfTsKIAogcHVibGljOgotICBURGVidWdQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykKKyAgVERlYnVnUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKQogICAgIDogVFZpcnR1YWxQcm90b2NvbDxURGVidWdQcm90b2NvbD4odHJhbnMpLAogICAgICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKICAgICAgIHN0cmluZ19saW1pdF8oREVGQVVMVF9TVFJJTkdfTElNSVQpLApAQCAtMTM4LDExICsxMzgsMTEgQEAKICAqLwogY2xhc3MgVERlYnVnUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgewogcHVibGljOgotICBURGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQotICB2aXJ0dWFsIH5URGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQorICBURGVidWdQcm90b2NvbEZhY3RvcnkoKSA9IGRlZmF1bHQ7CisgIH5URGVidWdQcm90b2NvbEZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KG5ldyBURGVidWdQcm90b2NvbCh0cmFucykpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFREZWJ1Z1Byb3RvY29sKHRyYW5zKSk7CiAgIH0KIH07CiB9CkBAIC0xNTksOCArMTU5LDggQEAKIHN0ZDo6c3RyaW5nIFRocmlmdERlYnVnU3RyaW5nKGNvbnN0IFRocmlmdFN0cnVjdCYgdHMpIHsKICAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0gIFRNZW1vcnlCdWZmZXIqIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOworICBhdXRvKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CiAgIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKIAogICB0cy53cml0ZSgmcHJvdG9jb2wpOwpAQCAtMTc4LDcgKzE3OCw3IEBACiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CiAgIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKIAogICAvLyBJIGFtIGdyb3NzIQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQyZTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9DUFBfCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9USEVBREVSUFJPVE9DT0xfQ1BQXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorCisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKwordm9pZCBUSGVhZGVyUHJvdG9jb2w6OnJlc2V0UHJvdG9jb2woKSB7CisgIGlmIChwcm90b18gJiYgcHJvdG9JZF8gPT0gdHJhbnNfLT5nZXRQcm90b2NvbElkKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBwcm90b0lkXyA9IHRyYW5zXy0+Z2V0UHJvdG9jb2xJZCgpOworCisgIHN3aXRjaCAocHJvdG9JZF8pIHsKKyAgY2FzZSBUX0JJTkFSWV9QUk9UT0NPTDoKKyAgICBwcm90b18gPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbFQ8VEhlYWRlclRyYW5zcG9ydD4gPih0cmFuc18pOworICAgIGJyZWFrOworCisgIGNhc2UgVF9DT01QQUNUX1BST1RPQ09MOgorICAgIHByb3RvXyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VENvbXBhY3RQcm90b2NvbFQ8VEhlYWRlclRyYW5zcG9ydD4gPih0cmFuc18pOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gcHJvdG9jb2wgcmVxdWVzdGVkIik7CisgIH0KK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcUlkKSB7CisgIHJlc2V0UHJvdG9jb2woKTsgLy8gUmVzZXQgaW4gY2FzZSB3ZSBjaGFuZ2VkIHByb3RvY29scworICB0cmFuc18tPnNldFNlcXVlbmNlTnVtYmVyKHNlcUlkKTsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcUlkKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZU1lc3NhZ2VFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTWVzc2FnZUVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVN0cnVjdEJlZ2luKG5hbWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU3RydWN0RW5kKCkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVN0cnVjdEVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlRmllbGRFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUZpZWxkU3RvcCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVGaWVsZFN0b3AoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVNYXBFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTWFwRW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlTGlzdEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVMaXN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZVNldEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVTZXRFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUJvb2wodmFsdWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUJ5dGUoYnl0ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVJMTYoaTE2KTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUkzMihpMzIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgIHJldHVybiBwcm90b18tPndyaXRlSTY0KGk2NCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgeworICByZXR1cm4gcHJvdG9fLT53cml0ZURvdWJsZShkdWIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVTdHJpbmcoc3RyKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlQmluYXJ5KHN0cik7Cit9CisKKy8qKgorICogUmVhZGluZyBmdW5jdGlvbnMKKyAqLworCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFJZCkgeworICAvLyBSZWFkIHRoZSBuZXh0IGZyYW1lLCBhbmQgY2hhbmdlIHByb3RvY29scyBpZiBuZWVkZWQKKyAgdHJ5IHsKKyAgICB0cmFuc18tPnJlc2V0UHJvdG9jb2woKTsKKyAgICByZXNldFByb3RvY29sKCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiYgZXgpIHsKKyAgICB3cml0ZU1lc3NhZ2VCZWdpbigiIiwgVF9FWENFUFRJT04sIDApOworICAgIGV4LndyaXRlKChUUHJvdG9jb2wqKXRoaXMpOworICAgIHdyaXRlTWVzc2FnZUVuZCgpOworICAgIHRyYW5zXy0+Zmx1c2goKTsKKworICAgIC8vIFRoZSBmcmFtaW5nIGlzIHN0aWxsIGdvb2QsIGJ1dCB3ZSBkb24ndCBrbm93IGFib3V0IHRoaXMgcHJvdG9jb2wuCisgICAgLy8gSW4gdGhlIGZ1dHVyZSwgdGhpcyBjb3VsZCBiZSBtYWRlIGEgY2xpZW50LXNpZGUgb25seSBlcnJvciBpZgorICAgIC8vIGNvbm5lY3Rpb24gcG9vbGluZyBpcyB1c2VkLgorICAgIHRocm93IGV4OworICB9CisgIHJldHVybiBwcm90b18tPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcUlkKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkTWVzc2FnZUVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZE1lc3NhZ2VFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRTdHJ1Y3RFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRTdHJ1Y3RFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRGaWVsZEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEZpZWxkRW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRNYXBFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRNYXBFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZExpc3RFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRMaXN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU2V0RW5kKCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkU2V0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEJvb2wodmFsdWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkQnl0ZShieXRlKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkSTE2KGludDE2X3QmIGkxNikgeworICByZXR1cm4gcHJvdG9fLT5yZWFkSTE2KGkxNik7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEkzMihpMzIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgIHJldHVybiBwcm90b18tPnJlYWRJNjQoaTY0KTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7CisgIHJldHVybiBwcm90b18tPnJlYWREb3VibGUoZHViKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFN0cmluZyhzdHIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIGJpbmFyeSkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkQmluYXJ5KGJpbmFyeSk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2lmbmRlZiBUSFJJRlRfUFJPVE9DT0xfVEhFQURFUlBST1RPQ09MX0NQUF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDUwMTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9IXworI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfVEhFQURFUlBST1RPQ09MX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUSGVhZGVyVHJhbnNwb3J0OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworLyoqCisgKiBUaGUgaGVhZGVyIHByb3RvY29sIGZvciB0aHJpZnQuIFJlYWRzIHVuZnJhbWVkLCBmcmFtZWQsIGhlYWRlciBmb3JtYXQsCisgKiBhbmQgaHR0cAorICoKKyAqLworY2xhc3MgVEhlYWRlclByb3RvY29sIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VEhlYWRlclByb3RvY29sPiB7Citwcm90ZWN0ZWQ6CitwdWJsaWM6CisgIHZvaWQgcmVzZXRQcm90b2NvbCgpOworCisgIGV4cGxpY2l0IFRIZWFkZXJQcm90b2NvbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvdG9JZCA9IFRfQ09NUEFDVF9QUk9UT0NPTCkKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VEhlYWRlclByb3RvY29sPihzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIZWFkZXJUcmFuc3BvcnQodHJhbnMpKSksCisgICAgICB0cmFuc18oc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUSGVhZGVyVHJhbnNwb3J0PihnZXRUcmFuc3BvcnQoKSkpLAorICAgICAgcHJvdG9JZF8ocHJvdG9JZCkgeworICAgIHRyYW5zXy0+c2V0UHJvdG9jb2xJZChwcm90b0lkKTsKKyAgICByZXNldFByb3RvY29sKCk7CisgIH0KKworICBUSGVhZGVyUHJvdG9jb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBpblRyYW5zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBvdXRUcmFucywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb3RvSWQgPSBUX0NPTVBBQ1RfUFJPVE9DT0wpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRIZWFkZXJQcm90b2NvbD4oCisgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSGVhZGVyVHJhbnNwb3J0KGluVHJhbnMsIG91dFRyYW5zKSkpLAorICAgICAgdHJhbnNfKHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VEhlYWRlclRyYW5zcG9ydD4oZ2V0VHJhbnNwb3J0KCkpKSwKKyAgICAgIHByb3RvSWRfKHByb3RvSWQpIHsKKyAgICB0cmFuc18tPnNldFByb3RvY29sSWQocHJvdG9JZCk7CisgICAgcmVzZXRQcm90b2NvbCgpOworICB9CisKKyAgflRIZWFkZXJQcm90b2NvbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAvKioKKyAgICogRnVuY3Rpb25zIHRvIHdvcmsgd2l0aCBoZWFkZXJzIGJ5IGNhbGxpbmcgaW50byBUSGVhZGVyVHJhbnNwb3J0CisgICAqLworICB2b2lkIHNldFByb3RvY29sSWQodWludDE2X3QgcHJvdG9JZCkgeworICAgIHRyYW5zXy0+c2V0UHJvdG9jb2xJZChwcm90b0lkKTsKKyAgICByZXNldFByb3RvY29sKCk7CisgIH0KKworICB0eXBlZGVmIFRIZWFkZXJUcmFuc3BvcnQ6OlN0cmluZ1RvU3RyaW5nTWFwIFN0cmluZ1RvU3RyaW5nTWFwOworCisgIC8vIHRoZXNlIHdvcmsgd2l0aCB3cml0ZSBoZWFkZXJzCisgIHZvaWQgc2V0SGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIHRyYW5zXy0+c2V0SGVhZGVyKGtleSwgdmFsdWUpOworICB9CisKKyAgdm9pZCBjbGVhckhlYWRlcnMoKSB7IHRyYW5zXy0+Y2xlYXJIZWFkZXJzKCk7IH0KKworICBTdHJpbmdUb1N0cmluZ01hcCYgZ2V0V3JpdGVIZWFkZXJzKCkgeyByZXR1cm4gdHJhbnNfLT5nZXRXcml0ZUhlYWRlcnMoKTsgfQorCisgIC8vIHRoZXNlIHdvcmsgd2l0aCByZWFkIGhlYWRlcnMKKyAgY29uc3QgU3RyaW5nVG9TdHJpbmdNYXAmIGdldEhlYWRlcnMoKSBjb25zdCB7IHJldHVybiB0cmFuc18tPmdldEhlYWRlcnMoKTsgfQorCisgIC8qKgorICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KKyAgICovCisKKyAgLypvbCovIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFJZCk7CisKKyAgLypvbCovIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOworCisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKTsKKworICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7CisKKyAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOworCisgIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KTsKKworICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKKworICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICAvKioKKyAgICogUmVhZGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcUlkKTsKKworICAvKm9sKi8gdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKTsKKworICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpOworCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKKworICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCk7CisKKyAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCk7CisKKyAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIHVpbnQzMl90IHJlYWRNYXBFbmQoKTsKKworICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIHVpbnQzMl90IHJlYWRMaXN0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIHVpbnQzMl90IHJlYWRTZXRFbmQoKTsKKworICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7CisgIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KKyAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDxUSGVhZGVyUHJvdG9jb2w+OjpyZWFkQm9vbDsKKworICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOworCisgIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKKworICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7CisKKyAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOworCisgIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOworCisgIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgYmluYXJ5KTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VEhlYWRlclRyYW5zcG9ydD4gdHJhbnNfOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvXzsKKyAgdWludDMyX3QgcHJvdG9JZF87Cit9OworCitjbGFzcyBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgeworcHVibGljOgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFucykgb3ZlcnJpZGUgeworICAgIGF1dG8qIGhlYWRlclByb3RvY29sCisgICAgICAgID0gbmV3IFRIZWFkZXJQcm90b2NvbCh0cmFucywgdHJhbnMsIFRfQklOQVJZX1BST1RPQ09MKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4oaGVhZGVyUHJvdG9jb2wpOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBpblRyYW5zLAorICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gb3V0VHJhbnMpIG92ZXJyaWRlIHsKKyAgICBhdXRvKiBoZWFkZXJQcm90b2NvbCA9IG5ldyBUSGVhZGVyUHJvdG9jb2woaW5UcmFucywgb3V0VHJhbnMsIFRfQklOQVJZX1BST1RPQ09MKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4oaGVhZGVyUHJvdG9jb2wpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCmluZGV4IGU0MDc3YmMuLjI4ZDBkYTIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAKQEAgLTE5LDE2ICsxOSwxNyBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KIAorI2luY2x1ZGUgPGJvb3N0L2xvY2FsZS5ocHA+CisKKyNpbmNsdWRlIDxjbWF0aD4KICNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8bG9jYWxlPgogI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlIDxib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zL2ZwY2xhc3NpZnkuaHBwPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgogCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAKQEAgLTQyLDEyICs0MywxMCBAQAogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05PYmplY3RFbmQgPSAnfSc7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkFycmF5U3RhcnQgPSAnWyc7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkFycmF5RW5kID0gJ10nOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05OZXdsaW5lID0gJ1xuJzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OUGFpclNlcGFyYXRvciA9ICc6JzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09ORWxlbVNlcGFyYXRvciA9ICcsJzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQmFja3NsYXNoID0gJ1xcJzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OU3RyaW5nRGVsaW1pdGVyID0gJyInOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05aZXJvQ2hhciA9ICcwJzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09ORXNjYXBlQ2hhciA9ICd1JzsKIAogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtKU09ORXNjYXBlUHJlZml4KCJcXHUwMCIpOwpAQCAtMjg1LDYgKzI4NCwxNiBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKKy8vIFJldHVybiB0cnVlIGlmIHRoZSBjb2RlIHVuaXQgaXMgaGlnaCBzdXJyb2dhdGUKK3N0YXRpYyBib29sIGlzSGlnaFN1cnJvZ2F0ZSh1aW50MTZfdCB2YWwpIHsKKyAgcmV0dXJuIHZhbCA+PSAweEQ4MDAgJiYgdmFsIDw9IDB4REJGRjsKK30KKworLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNvZGUgdW5pdCBpcyBsb3cgc3Vycm9nYXRlCitzdGF0aWMgYm9vbCBpc0xvd1N1cnJvZ2F0ZSh1aW50MTZfdCB2YWwpIHsKKyAgcmV0dXJuIHZhbCA+PSAweERDMDAgJiYgdmFsIDw9IDB4REZGRjsKK30KKwogLyoqCiAgKiBDbGFzcyB0byBzZXJ2ZSBhcyBiYXNlIEpTT04gY29udGV4dCBhbmQgYXMgYmFzZSBjbGFzcyBmb3Igb3RoZXIgY29udGV4dAogICogaW1wbGVtZW50YXRpb25zCkBAIC0yOTIsOSArMzAxLDkgQEAKIGNsYXNzIFRKU09OQ29udGV4dCB7CiAKIHB1YmxpYzoKLSAgVEpTT05Db250ZXh0KCl7fTsKKyAgVEpTT05Db250ZXh0KCkgPSBkZWZhdWx0OwogCi0gIHZpcnR1YWwgflRKU09OQ29udGV4dCgpe307CisgIHZpcnR1YWwgflRKU09OQ29udGV4dCgpID0gZGVmYXVsdDsKIAogICAvKioKICAgICogV3JpdGUgY29udGV4dCBkYXRhIHRvIHRoZSB0cmFuc3BvcnQuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KQEAgLTMyNSw3ICszMzQsNyBAQAogcHVibGljOgogICBKU09OUGFpckNvbnRleHQoKSA6IGZpcnN0Xyh0cnVlKSwgY29sb25fKHRydWUpIHt9CiAKLSAgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCYgdHJhbnMpIHsKKyAgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCYgdHJhbnMpIG92ZXJyaWRlIHsKICAgICBpZiAoZmlyc3RfKSB7CiAgICAgICBmaXJzdF8gPSBmYWxzZTsKICAgICAgIGNvbG9uXyA9IHRydWU7CkBAIC0zMzcsNyArMzQ2LDcgQEAKICAgICB9CiAgIH0KIAotICB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciYgcmVhZGVyKSB7CisgIHVpbnQzMl90IHJlYWQoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyJiByZWFkZXIpIG92ZXJyaWRlIHsKICAgICBpZiAoZmlyc3RfKSB7CiAgICAgICBmaXJzdF8gPSBmYWxzZTsKICAgICAgIGNvbG9uXyA9IHRydWU7CkBAIC0zNTAsNyArMzU5LDcgQEAKICAgfQogCiAgIC8vIE51bWJlcnMgbXVzdCBiZSB0dXJuZWQgaW50byBzdHJpbmdzIGlmIHRoZXkgYXJlIHRoZSBrZXkgcGFydCBvZiBhIHBhaXIKLSAgdmlydHVhbCBib29sIGVzY2FwZU51bSgpIHsgcmV0dXJuIGNvbG9uXzsgfQorICBib29sIGVzY2FwZU51bSgpIG92ZXJyaWRlIHsgcmV0dXJuIGNvbG9uXzsgfQogCiBwcml2YXRlOgogICBib29sIGZpcnN0XzsKQEAgLTM2Myw3ICszNzIsNyBAQAogcHVibGljOgogICBKU09OTGlzdENvbnRleHQoKSA6IGZpcnN0Xyh0cnVlKSB7fQogCi0gIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQmIHRyYW5zKSB7CisgIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQmIHRyYW5zKSBvdmVycmlkZSB7CiAgICAgaWYgKGZpcnN0XykgewogICAgICAgZmlyc3RfID0gZmFsc2U7CiAgICAgICByZXR1cm4gMDsKQEAgLTM3Myw3ICszODIsNyBAQAogICAgIH0KICAgfQogCi0gIHVpbnQzMl90IHJlYWQoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyJiByZWFkZXIpIHsKKyAgdWludDMyX3QgcmVhZChUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXImIHJlYWRlcikgb3ZlcnJpZGUgewogICAgIGlmIChmaXJzdF8pIHsKICAgICAgIGZpcnN0XyA9IGZhbHNlOwogICAgICAgcmV0dXJuIDA7CkBAIC0zODYsMTcgKzM5NSwxNiBAQAogICBib29sIGZpcnN0XzsKIH07CiAKLVRKU09OUHJvdG9jb2w6OlRKU09OUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKQorVEpTT05Qcm90b2NvbDo6VEpTT05Qcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKQogICA6IFRWaXJ0dWFsUHJvdG9jb2w8VEpTT05Qcm90b2NvbD4ocHRyYW5zKSwKICAgICB0cmFuc18ocHRyYW5zLmdldCgpKSwKICAgICBjb250ZXh0XyhuZXcgVEpTT05Db250ZXh0KCkpLAogICAgIHJlYWRlcl8oKnB0cmFucykgewogfQogCi1USlNPTlByb3RvY29sOjp+VEpTT05Qcm90b2NvbCgpIHsKLX0KK1RKU09OUHJvdG9jb2w6On5USlNPTlByb3RvY29sKCkgPSBkZWZhdWx0OwogCi12b2lkIFRKU09OUHJvdG9jb2w6OnB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYykgewordm9pZCBUSlNPTlByb3RvY29sOjpwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjKSB7CiAgIGNvbnRleHRzXy5wdXNoKGNvbnRleHRfKTsKICAgY29udGV4dF8gPSBjOwogfQpAQCAtNDY2LDEwICs0NzQsMTAgQEAKICAgcmVzdWx0ICs9IDI7IC8vIEZvciBxdW90ZXMKICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwogICB1aW50OF90IGJbNF07Ci0gIGNvbnN0IHVpbnQ4X3QqIGJ5dGVzID0gKGNvbnN0IHVpbnQ4X3QqKXN0ci5jX3N0cigpOworICBjb25zdCBhdXRvKiBieXRlcyA9IChjb25zdCB1aW50OF90KilzdHIuY19zdHIoKTsKICAgaWYgKHN0ci5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB1aW50MzJfdCBsZW4gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKTsKKyAgYXV0byBsZW4gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKTsKICAgd2hpbGUgKGxlbiA+PSAzKSB7CiAgICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCiAgICAgYmFzZTY0X2VuY29kZShieXRlcywgMywgYik7CkBAIC00OTIsNyArNTAwLDcgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBOdW1iZXJUeXBlPgogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OSW50ZWdlcihOdW1iZXJUeXBlIG51bSkgewogICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7Ci0gIHN0ZDo6c3RyaW5nIHZhbChib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihudW0pKTsKKyAgc3RkOjpzdHJpbmcgdmFsKHRvX3N0cmluZyhudW0pKTsKICAgYm9vbCBlc2NhcGVOdW0gPSBjb250ZXh0Xy0+ZXNjYXBlTnVtKCk7CiAgIGlmIChlc2NhcGVOdW0pIHsKICAgICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7CkBAIC01MTMsNyArNTIxLDggQEAKIHN0ZDo6c3RyaW5nIGRvdWJsZVRvU3RyaW5nKGRvdWJsZSBkKSB7CiAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdHI7CiAgIHN0ci5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKLSAgc3RyLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwICsgMSk7CisgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBtYXhfZGlnaXRzMTAgPSAyICsgc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMDsKKyAgc3RyLnByZWNpc2lvbihtYXhfZGlnaXRzMTApOwogICBzdHIgPDwgZDsKICAgcmV0dXJuIHN0ci5zdHIoKTsKIH0KQEAgLTUyNiw5ICs1MzUsOSBAQAogICBzdGQ6OnN0cmluZyB2YWw7CiAKICAgYm9vbCBzcGVjaWFsID0gZmFsc2U7Ci0gIHN3aXRjaCAoYm9vc3Q6Om1hdGg6OmZwY2xhc3NpZnkobnVtKSkgeworICBzd2l0Y2ggKHN0ZDo6ZnBjbGFzc2lmeShudW0pKSB7CiAgIGNhc2UgRlBfSU5GSU5JVEU6Ci0gICAgaWYgKGJvb3N0OjptYXRoOjpzaWduYml0KG51bSkpIHsKKyAgICBpZiAoc3RkOjpzaWduYml0KG51bSkpIHsKICAgICAgIHZhbCA9IGtUaHJpZnROZWdhdGl2ZUluZmluaXR5OwogICAgIH0gZWxzZSB7CiAgICAgICB2YWwgPSBrVGhyaWZ0SW5maW5pdHk7CkBAIC01NjMsNyArNTcyLDcgQEAKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTk9iamVjdFN0YXJ0KCkgewogICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CiAgIHRyYW5zXy0+d3JpdGUoJmtKU09OT2JqZWN0U3RhcnQsIDEpOwotICBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OUGFpckNvbnRleHQoKSkpOworICBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKICAgcmV0dXJuIHJlc3VsdCArIDE7CiB9CiAKQEAgLTU3Niw3ICs1ODUsNyBAQAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQXJyYXlTdGFydCgpIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwogICB0cmFuc18tPndyaXRlKCZrSlNPTkFycmF5U3RhcnQsIDEpOwotICBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOworICBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTkxpc3RDb250ZXh0KCkpKTsKICAgcmV0dXJuIHJlc3VsdCArIDE7CiB9CiAKQEAgLTY0MCw3ICs2NDksOSBAQAogfQogCiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZU1hcEVuZCgpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTk9iamVjdEVuZCgpICsgd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OT2JqZWN0RW5kKCk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05BcnJheUVuZCgpOworICByZXR1cm4gcmVzdWx0OwogfQogCiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgewpAQCAtNjcwLDcgKzY4MSw3IEBACiB9CiAKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewotICAvLyB3cml0ZUJ5dGUoKSBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5IGJlY2F1c2UgYm9vc3Q6OmxleGljYWwgY2FzdCBzZWVzCisgIC8vIHdyaXRlQnl0ZSgpIG11c3QgYmUgaGFuZGxlZCBzcGVjaWFsbHkgYmVjYXVzZSB0b19zdHJpbmcgc2VlcwogICAvLyBpbnQ4X3QgYXMgYSB0ZXh0IHR5cGUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyIHR5cGUKICAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoKGludDE2X3QpYnl0ZSk7CiB9CkBAIC03MDksMTQgKzcyMCwxNyBAQAogfQogCiAvLyBEZWNvZGVzIHRoZSBmb3VyIGhleCBwYXJ0cyBvZiBhIEpTT04gZXNjYXBlZCBzdHJpbmcgY2hhcmFjdGVyIGFuZCByZXR1cm5zCi0vLyB0aGUgY2hhcmFjdGVyIHZpYSBvdXQuIFRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyBtdXN0IGJlICIwMCIuCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkVzY2FwZUNoYXIodWludDhfdCogb3V0KSB7Ci0gIHVpbnQ4X3QgYlsyXTsKLSAgcmVhZEpTT05TeW50YXhDaGFyKGtKU09OWmVyb0NoYXIpOwotICByZWFkSlNPTlN5bnRheENoYXIoa0pTT05aZXJvQ2hhcik7CisvLyB0aGUgVVRGLTE2IGNvZGUgdW5pdCB2aWEgb3V0LgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05Fc2NhcGVDaGFyKHVpbnQxNl90KiBvdXQpIHsKKyAgdWludDhfdCBiWzRdOwogICBiWzBdID0gcmVhZGVyXy5yZWFkKCk7CiAgIGJbMV0gPSByZWFkZXJfLnJlYWQoKTsKLSAgKm91dCA9IChoZXhWYWwoYlswXSkgPDwgNCkgKyBoZXhWYWwoYlsxXSk7CisgIGJbMl0gPSByZWFkZXJfLnJlYWQoKTsKKyAgYlszXSA9IHJlYWRlcl8ucmVhZCgpOworCisgICpvdXQgPSAoaGV4VmFsKGJbMF0pIDw8IDEyKQorICAgICsgKGhleFZhbChiWzFdKSA8PCA4KSArIChoZXhWYWwoYlsyXSkgPDwgNCkgKyBoZXhWYWwoYlszXSk7CisKICAgcmV0dXJuIDQ7CiB9CiAKQEAgLTcyNCw2ICs3MzgsNyBAQAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgYm9vbCBza2lwQ29udGV4dCkgewogICB1aW50MzJfdCByZXN1bHQgPSAoc2tpcENvbnRleHQgPyAwIDogY29udGV4dF8tPnJlYWQocmVhZGVyXykpOwogICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKKyAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGNvZGV1bml0czsKICAgdWludDhfdCBjaDsKICAgc3RyLmNsZWFyKCk7CiAgIHdoaWxlICh0cnVlKSB7CkBAIC03MzYsMTAgKzc1MSwyNSBAQAogICAgICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKICAgICAgICsrcmVzdWx0OwogICAgICAgaWYgKGNoID09IGtKU09ORXNjYXBlQ2hhcikgewotICAgICAgICByZXN1bHQgKz0gcmVhZEpTT05Fc2NhcGVDaGFyKCZjaCk7CisgICAgICAgIHVpbnQxNl90IGNwOworICAgICAgICByZXN1bHQgKz0gcmVhZEpTT05Fc2NhcGVDaGFyKCZjcCk7CisgICAgICAgIGlmIChpc0hpZ2hTdXJyb2dhdGUoY3ApKSB7CisgICAgICAgICAgY29kZXVuaXRzLnB1c2hfYmFjayhjcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGlzTG93U3Vycm9nYXRlKGNwKQorICAgICAgICAgICAgICAgJiYgY29kZXVuaXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBVVEYtMTYgaGlnaCBzdXJyb2dhdGUgcGFpci4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29kZXVuaXRzLnB1c2hfYmFjayhjcCk7CisgICAgICAgICAgY29kZXVuaXRzLnB1c2hfYmFjaygwKTsKKyAgICAgICAgICBzdHIgKz0gYm9vc3Q6OmxvY2FsZTo6Y29udjo6dXRmX3RvX3V0ZjxjaGFyPihjb2RldW5pdHMuZGF0YSgpKTsKKyAgICAgICAgICBjb2RldW5pdHMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNpemVfdCBwb3MgPSBrRXNjYXBlQ2hhcnMuZmluZChjaCk7Ci0gICAgICAgIGlmIChwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgaWYgKHBvcyA9PSBrRXNjYXBlQ2hhcnMubnBvcykgewogICAgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciwgZ290ICciICsgc3RkOjpzdHJpbmcoKGNvbnN0IGNoYXIqKSZjaCwgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJy4iKTsKQEAgLTc0Nyw4ICs3NzcsMTcgQEAKICAgICAgICAgY2ggPSBrRXNjYXBlQ2hhclZhbHNbcG9zXTsKICAgICAgIH0KICAgICB9CisgICAgaWYgKCFjb2RldW5pdHMuZW1wdHkoKSkgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIFVURi0xNiBsb3cgc3Vycm9nYXRlIHBhaXIuIik7CisgICAgfQogICAgIHN0ciArPSBjaDsKICAgfQorCisgIGlmICghY29kZXVuaXRzLmVtcHR5KCkpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIFVURi0xNiBsb3cgc3Vycm9nYXRlIHBhaXIuIik7CisgIH0KICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtNzU2LDExICs3OTUsMTggQEAKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OQmFzZTY0KHN0ZDo6c3RyaW5nJiBzdHIpIHsKICAgc3RkOjpzdHJpbmcgdG1wOwogICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTlN0cmluZyh0bXApOwotICB1aW50OF90KiBiID0gKHVpbnQ4X3QqKXRtcC5jX3N0cigpOworICBhdXRvKiBiID0gKHVpbnQ4X3QqKXRtcC5jX3N0cigpOwogICBpZiAodG1wLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIHVpbnQzMl90IGxlbiA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXAubGVuZ3RoKCkpOworICBhdXRvIGxlbiA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXAubGVuZ3RoKCkpOwogICBzdHIuY2xlYXIoKTsKKyAgLy8gSWdub3JlIHBhZGRpbmcKKyAgaWYgKGxlbiA+PSAyKSAgeworICAgIHVpbnQzMl90IGJvdW5kID0gbGVuIC0gMjsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSBsZW4gLSAxOyBpID49IGJvdW5kICYmIGJbaV0gPT0gJz0nOyAtLWkpIHsKKyAgICAgIC0tbGVuOworICAgIH0KKyAgfQogICB3aGlsZSAobGVuID49IDQpIHsKICAgICBiYXNlNjRfZGVjb2RlKGIsIDQpOwogICAgIHN0ci5hcHBlbmQoKGNvbnN0IGNoYXIqKWIsIDMpOwpAQCAtNzkzLDYgKzgzOSwxOSBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCituYW1lc3BhY2UgewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIGZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgVCB0OworICBzdGQ6OmlzdHJpbmdzdHJlYW0gc3RyKHMpOworICBzdHIuaW1idWUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSk7CisgIHN0ciA+PiB0OworICBpZiAoc3RyLmJhZCgpIHx8ICFzdHIuZW9mKCkpCisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHMpOworICByZXR1cm4gdDsKK30KK30KKwogLy8gUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGFuZCBhc3NlbWJsZXMgdGhlbSBpbnRvIGEgbnVtYmVyLAogLy8gcmV0dXJuaW5nIHRoZW0gdmlhIG51bQogdGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+CkBAIC04MDQsMTAgKzg2MywxMCBAQAogICBzdGQ6OnN0cmluZyBzdHI7CiAgIHJlc3VsdCArPSByZWFkSlNPTk51bWVyaWNDaGFycyhzdHIpOwogICB0cnkgewotICAgIG51bSA9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8TnVtYmVyVHlwZT4oc3RyKTsKLSAgfSBjYXRjaCAoYm9vc3Q6OmJhZF9sZXhpY2FsX2Nhc3QgZSkgeworICAgIG51bSA9IGZyb21TdHJpbmc8TnVtYmVyVHlwZT4oc3RyKTsKKyAgfSBjYXRjaCAoY29uc3Qgc3RkOjpydW50aW1lX2Vycm9yJikgewogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsgIlwiIik7CiAgIH0KICAgaWYgKGNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewogICAgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05TdHJpbmdEZWxpbWl0ZXIpOwpAQCAtODE1LDE4ICs4NzQsNiBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi1uYW1lc3BhY2UgewotZG91YmxlIHN0cmluZ1RvRG91YmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7Ci0gIGRvdWJsZSBkOwotICBzdGQ6OmlzdHJpbmdzdHJlYW0gc3RyKHMpOwotICBzdHIuaW1idWUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSk7Ci0gIHN0ciA+PiBkOwotICBpZiAoc3RyLmJhZCgpIHx8ICFzdHIuZW9mKCkpCi0gICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHMpOwotICByZXR1cm4gZDsKLX0KLX0KLQogLy8gUmVhZHMgYSBKU09OIG51bWJlciBvciBzdHJpbmcgYW5kIGludGVycHJldHMgaXQgYXMgYSBkb3VibGUuCiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkRvdWJsZShkb3VibGUmIG51bSkgewogICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKQEAgLTg0Nyw4ICs4OTQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOwogICAgICAgfQogICAgICAgdHJ5IHsKLSAgICAgICAgbnVtID0gc3RyaW5nVG9Eb3VibGUoc3RyKTsKLSAgICAgIH0gY2F0Y2ggKHN0ZDo6cnVudGltZV9lcnJvciBlKSB7CisgICAgICAgIG51bSA9IGZyb21TdHJpbmc8ZG91YmxlPihzdHIpOworICAgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpydW50aW1lX2Vycm9yJikgewogICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiIgKyBzdHIgKyAiXCIiKTsKICAgICAgIH0KQEAgLTg2MCw4ICs5MDcsOCBAQAogICAgIH0KICAgICByZXN1bHQgKz0gcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RyKTsKICAgICB0cnkgewotICAgICAgbnVtID0gc3RyaW5nVG9Eb3VibGUoc3RyKTsKLSAgICB9IGNhdGNoIChzdGQ6OnJ1bnRpbWVfZXJyb3IgZSkgeworICAgICAgbnVtID0gZnJvbVN0cmluZzxkb3VibGU+KHN0cik7CisgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpydW50aW1lX2Vycm9yJikgewogICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArICJcIiIpOwogICAgIH0KQEAgLTg3Miw3ICs5MTksNyBAQAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05PYmplY3RTdGFydCgpIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7CiAgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05PYmplY3RTdGFydCk7Ci0gIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7CisgIHB1c2hDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OUGFpckNvbnRleHQoKSkpOwogICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC04ODUsNyArOTMyLDcgQEAKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OQXJyYXlTdGFydCgpIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7CiAgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05BcnJheVN0YXJ0KTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTkxpc3RDb250ZXh0KCkpKTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05MaXN0Q29udGV4dCgpKSk7CiAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTg5OSw3ICs5NDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgewogICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkFycmF5U3RhcnQoKTsKLSAgdWludDY0X3QgdG1wVmFsID0gMDsKKyAgaW50NjRfdCB0bXBWYWwgPSAwOwogICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7CiAgIGlmICh0bXBWYWwgIT0ga1RocmlmdFZlcnNpb24xKSB7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKQEAgLTkwOCw4ICs5NTUsOSBAQAogICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7CiAgIG1lc3NhZ2VUeXBlID0gKFRNZXNzYWdlVHlwZSl0bXBWYWw7CiAgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgaWYgKHRtcFZhbCA+IHN0YXRpY19jYXN0PHVpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSkKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgaWYgKHRtcFZhbCA+IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkgfHwKKyAgICAgIHRtcFZhbCA8IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4pKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAic2VxdWVuY2UgaWQgaXMgbm90IGludDMyX3QiKTsKICAgc2VxaWQgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0bXBWYWwpOwogICByZXR1cm4gcmVzdWx0OwogfQpAQCAtOTY5LDcgKzEwMTcsOSBAQAogfQogCiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWFwRW5kKCkgewotICByZXR1cm4gcmVhZEpTT05PYmplY3RFbmQoKSArIHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05PYmplY3RFbmQoKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgcmV0dXJuIHJlc3VsdDsKIH0KIAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CkBAIC0xMDEzLDcgKzEwNjMsNyBAQAogLy8gcmVhZEJ5dGUoKSBtdXN0IGJlIGhhbmRsZWQgcHJvcGVybHkgYmVjYXVzZSBib29zdDo6bGV4aWNhbCBjYXN0IHNlZXMgaW50OF90CiAvLyBhcyBhIHRleHQgdHlwZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIgdHlwZQogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7Ci0gIGludDE2X3QgdG1wID0gKGludDE2X3QpYnl0ZTsKKyAgYXV0byB0bXAgPSAoaW50MTZfdClieXRlOwogICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkludGVnZXIodG1wKTsKICAgYXNzZXJ0KHRtcCA8IDI1Nik7CiAgIGJ5dGUgPSAoaW50OF90KXRtcDsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oCmluZGV4IDNjN2I5ZDcuLjQyMDk5NWUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaApAQCAtNTMsNiArNTMsMTAgQEAKICAqICAgIFRoZSByZWFkQmluYXJ5KCkgbWV0aG9kIGlzIHdyaXR0ZW4gc3VjaCB0aGF0IGl0IHdpbGwgcHJvcGVybHkgc2tpcCBpZgogICogICAgY2FsbGVkIG9uIGEgVGhyaWZ0IHN0cmluZyAoYWx0aG91Z2ggaXQgd2lsbCBkZWNvZGUgZ2FyYmFnZSBkYXRhKS4KICAqCisgKiAgICBOT1RFOiBCYXNlNjQgcGFkZGluZyBpcyBvcHRpb25hbCBmb3IgVGhyaWZ0IGJpbmFyeSB2YWx1ZSBlbmNvZGluZy4gU28KKyAqICAgIHRoZSByZWFkQmluYXJ5KCkgbWV0aG9kIG5lZWRzIHRvIGRlY29kZSBib3RoIGlucHV0IHN0cmluZ3Mgd2l0aCBwYWRkaW5nCisgKiAgICBhbmQgdGhvc2Ugd2l0aG91dCBvbmUuCisgKgogICogNS4gVGhyaWZ0IHN0cnVjdHMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gb2JqZWN0cywgd2l0aCB0aGUgZmllbGQgSUQgYXMgdGhlCiAgKiAgICBrZXksIGFuZCB0aGUgZmllbGQgdmFsdWUgcmVwcmVzZW50ZWQgYXMgYSBKU09OIG9iamVjdCB3aXRoIGEgc2luZ2xlCiAgKiAgICBrZXktdmFsdWUgcGFpci4gVGhlIGtleSBpcyBhIHNob3J0IHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGF0IHR5cGUsCkBAIC04MywyMCArODcsMjEgQEAKICAqIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHRvIG1hdGNoIGFzIGNsb3NlbHkgYXMgcG9zc2libGUgdGhlIGJlaGF2aW9yCiAgKiBvZiBKYXZhJ3MgRG91YmxlLnRvU3RyaW5nKCksIHdoaWNoIGhhcyBubyBwcmVjaXNpb24gbG9zcy4gIEltcGxlbWVudG9ycyBpbgogICogb3RoZXIgbGFuZ3VhZ2VzIHNob3VsZCBzdHJpdmUgdG8gYWNoaWV2ZSB0aGF0IHdoZXJlIHBvc3NpYmxlLiBJIGhhdmUgbm90Ci0gKiB5ZXQgdmVyaWZpZWQgd2hldGhlciBib29zdDpsZXhpY2FsX2Nhc3QsIHdoaWNoIGlzIGRvaW5nIHRoYXQgd29yayBmb3IgbWUgaW4KLSAqIEMrKywgbG9zZXMgYW55IHByZWNpc2lvbiwgYnV0IEkgYW0gbGVhdmluZyB0aGlzIGFzIGEgZnV0dXJlIGltcHJvdmVtZW50LiBJCi0gKiBtYXkgdHJ5IHRvIHByb3ZpZGUgYSBDIGNvbXBvbmVudCBmb3IgdGhpcywgc28gdGhhdCBvdGhlciBsYW5ndWFnZXMgY291bGQKLSAqIGJpbmQgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBmb3IgbWF4aW11bSBjb25zaXN0ZW5jeS4KKyAqIHlldCB2ZXJpZmllZCB3aGV0aGVyIHN0ZDo6aXN0cmluZ3N0cmVhbTo6b3BlcmF0b3I+Piwgd2hpY2ggaXMgZG9pbmcgdGhhdAorICogd29yayBmb3IgbWUgaW4gQysrLCBsb3NlcyBhbnkgcHJlY2lzaW9uLCBidXQgSSBhbSBsZWF2aW5nIHRoaXMgYXMgYSBmdXR1cmUKKyAqIGltcHJvdmVtZW50LiBJIG1heSB0cnkgdG8gcHJvdmlkZSBhIEMgY29tcG9uZW50IGZvciB0aGlzLCBzbyB0aGF0IG90aGVyCisgKiBsYW5ndWFnZXMgY291bGQgYmluZCB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGZvciBtYXhpbXVtCisgKiBjb25zaXN0ZW5jeS4KICAqCiAgKi8KIGNsYXNzIFRKU09OUHJvdG9jb2wgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUSlNPTlByb3RvY29sPiB7CiBwdWJsaWM6Ci0gIFRKU09OUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKTsKKyAgVEpTT05Qcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKTsKIAotICB+VEpTT05Qcm90b2NvbCgpOworICB+VEpTT05Qcm90b2NvbCgpIG92ZXJyaWRlOwogCiBwcml2YXRlOgotICB2b2lkIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYyk7CisgIHZvaWQgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYyk7CiAKICAgdm9pZCBwb3BDb250ZXh0KCk7CiAKQEAgLTEyMyw3ICsxMjgsNyBAQAogCiAgIHVpbnQzMl90IHJlYWRKU09OU3ludGF4Q2hhcih1aW50OF90IGNoKTsKIAotICB1aW50MzJfdCByZWFkSlNPTkVzY2FwZUNoYXIodWludDhfdCogb3V0KTsKKyAgdWludDMyX3QgcmVhZEpTT05Fc2NhcGVDaGFyKHVpbnQxNl90KiBvdXQpOwogCiAgIHVpbnQzMl90IHJlYWRKU09OU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIsIGJvb2wgc2tpcENvbnRleHQgPSBmYWxzZSk7CiAKQEAgLTI0Myw3ICsyNDgsNyBAQAogICBjbGFzcyBMb29rYWhlYWRSZWFkZXIgewogCiAgIHB1YmxpYzoKLSAgICBMb29rYWhlYWRSZWFkZXIoVFRyYW5zcG9ydCYgdHJhbnMpIDogdHJhbnNfKCZ0cmFucyksIGhhc0RhdGFfKGZhbHNlKSB7fQorICAgIExvb2thaGVhZFJlYWRlcihUVHJhbnNwb3J0JiB0cmFucykgOiB0cmFuc18oJnRyYW5zKSwgaGFzRGF0YV8oZmFsc2UpLCBkYXRhXygwKSB7fQogCiAgICAgdWludDhfdCByZWFkKCkgewogICAgICAgaWYgKGhhc0RhdGFfKSB7CkBAIC0yNzEsOCArMjc2LDggQEAKIHByaXZhdGU6CiAgIFRUcmFuc3BvcnQqIHRyYW5zXzsKIAotICBzdGQ6OnN0YWNrPGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gPiBjb250ZXh0c187Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gY29udGV4dF87CisgIHN0ZDo6c3RhY2s8c3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gPiBjb250ZXh0c187CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGNvbnRleHRfOwogICBMb29rYWhlYWRSZWFkZXIgcmVhZGVyXzsKIH07CiAKQEAgLTI4MSwxMiArMjg2LDEyIEBACiAgKi8KIGNsYXNzIFRKU09OUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgewogcHVibGljOgotICBUSlNPTlByb3RvY29sRmFjdG9yeSgpIHt9CisgIFRKU09OUHJvdG9jb2xGYWN0b3J5KCkgPSBkZWZhdWx0OwogCi0gIHZpcnR1YWwgflRKU09OUHJvdG9jb2xGYWN0b3J5KCkge30KKyAgflRKU09OUHJvdG9jb2xGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPihuZXcgVEpTT05Qcm90b2NvbCh0cmFucykpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFRKU09OUHJvdG9jb2wodHJhbnMpKTsKICAgfQogfTsKIH0KQEAgLTMwMyw4ICszMDgsOCBAQAogc3RkOjpzdHJpbmcgVGhyaWZ0SlNPTlN0cmluZyhjb25zdCBUaHJpZnRTdHJ1Y3QmIHRzKSB7CiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKKyAgYXV0byogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOwogICBUSlNPTlByb3RvY29sIHByb3RvY29sKHRyYW5zKTsKIAogICB0cy53cml0ZSgmcHJvdG9jb2wpOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaAppbmRleCAwMjQ0ZmJlLi4wZGM5NjA1IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaApAQCAtMjUsNyArMjUsNyBAQAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBwcm90b2NvbCB7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAogLyoqCiAgKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm90b2NvbDwvY29kZT4gaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IKQEAgLTY5LDcgKzY5LDcgQEAKICAgICovCiAgIFRNdWx0aXBsZXhlZFByb3RvY29sKHNoYXJlZF9wdHI8VFByb3RvY29sPiBfcHJvdG9jb2wsIGNvbnN0IHN0ZDo6c3RyaW5nJiBfc2VydmljZU5hbWUpCiAgICAgOiBUUHJvdG9jb2xEZWNvcmF0b3IoX3Byb3RvY29sKSwgc2VydmljZU5hbWUoX3NlcnZpY2VOYW1lKSwgc2VwYXJhdG9yKCI6Iikge30KLSAgdmlydHVhbCB+VE11bHRpcGxleGVkUHJvdG9jb2woKSB7fQorICB+VE11bHRpcGxleGVkUHJvdG9jb2woKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKICAgLyoqCiAgICAqIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbDo6U0VQQVJBVE9SLgpAQCAtODIsNyArODIsNyBAQAogICAgKi8KICAgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW5fdmlydChjb25zdCBzdGQ6OnN0cmluZyYgX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgX3NlcWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IF9zZXFpZCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIHNlcnZpY2VOYW1lOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmNwcAppbmRleCBjMzc4YWNhLi5iNDYwNDU1IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmNwcApAQCAtMjMsMTEgKzIzLDExIEBACiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBwcm90b2NvbCB7CiAKLVRQcm90b2NvbDo6flRQcm90b2NvbCgpIHt9CitUUHJvdG9jb2w6On5UUHJvdG9jb2woKSA9IGRlZmF1bHQ7CiB1aW50MzJfdCBUUHJvdG9jb2w6OnNraXBfdmlydChUVHlwZSB0eXBlKSB7CiAgIHJldHVybiA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6c2tpcCgqdGhpcywgdHlwZSk7CiB9CiAKLVRQcm90b2NvbEZhY3Rvcnk6On5UUHJvdG9jb2xGYWN0b3J5KCkge30KK1RQcm90b2NvbEZhY3Rvcnk6On5UUHJvdG9jb2xGYWN0b3J5KCkgPSBkZWZhdWx0OwogCiB9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmgKaW5kZXggMGRiMjIxNi4uNzU2NmEyNSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaApAQCAtMjAsMTEgKzIwLDE1IEBACiAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfCiAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfIDEKIAorI2lmZGVmIF9XSU4zMgorLy8gTmVlZCB0byBjb21lIGJlZm9yZSBhbnkgV2luZG93cy5oIGluY2x1ZGVzCisjaW5jbHVkZSA8V2luc29jazIuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc3RhdGljX2Fzc2VydC5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiAjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CkBAIC00Myw3ICs0Nyw3IEBACiAvLyBodHRwOi8vY2VsbHBlcmZvcm1hbmNlLmJleW9uZDNkLmNvbS9hcnRpY2xlcy8yMDA2LzA2L3VuZGVyc3RhbmRpbmctc3RyaWN0LWFsaWFzaW5nLmh0bWwKIHRlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4KIHN0YXRpYyBpbmxpbmUgVG8gYml0d2lzZV9jYXN0KEZyb20gZnJvbSkgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihGcm9tKSA9PSBzaXplb2YoVG8pKTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoRnJvbSkgPT0gc2l6ZW9mKFRvKSwgInNpemVvZihGcm9tKSA9PSBzaXplb2YoVG8pIik7CiAKICAgLy8gQkFEISEhICBUaGVzZSBhcmUgYWxsIGJyb2tlbiB3aXRoIC1PMi4KICAgLy9yZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VG8qPigmZnJvbSk7ICAvLyBCQUQhISEKQEAgLTU0NSwxMiArNTQ5LDEyIEBACiAgIH0KICAgdmlydHVhbCB1aW50MzJfdCBza2lwX3ZpcnQoVFR5cGUgdHlwZSk7CiAKLSAgaW5saW5lIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoKSB7IHJldHVybiBwdHJhbnNfOyB9CiAKICAgLy8gVE9ETzogcmVtb3ZlIHRoZXNlIHR3byBjYWxscywgdGhleSBhcmUgZm9yIGJhY2t3YXJkcwogICAvLyBjb21wYXRpYmlsaXR5Ci0gIGlubGluZSBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRJbnB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KLSAgaW5saW5lIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldE91dHB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRJbnB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRPdXRwdXRUcmFuc3BvcnQoKSB7IHJldHVybiBwdHJhbnNfOyB9CiAKICAgLy8gaW5wdXQgYW5kIG91dHB1dCByZWN1cnNpb24gZGVwdGggYXJlIGtlcHQgc2VwYXJhdGUgc28gdGhhdCBvbmUgcHJvdG9jb2wKICAgLy8gY2FuIGJlIHVzZWQgY29uY3VycmVudGx5IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQuCkBAIC01NzIsMTQgKzU3NiwxNCBAQAogICB2b2lkIHNldFJlY3VyaXNpb25MaW1pdCh1aW50MzJfdCBkZXB0aCkge3JlY3Vyc2lvbl9saW1pdF8gPSBkZXB0aDt9CiAKIHByb3RlY3RlZDoKLSAgVFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykKKyAgVFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpCiAgICAgOiBwdHJhbnNfKHB0cmFucyksIGlucHV0X3JlY3Vyc2lvbl9kZXB0aF8oMCksIG91dHB1dF9yZWN1cnNpb25fZGVwdGhfKDApLCByZWN1cnNpb25fbGltaXRfKERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUKQogICB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnNfOwogCiBwcml2YXRlOgotICBUUHJvdG9jb2woKSB7fQorICBUUHJvdG9jb2woKSA9IGRlZmF1bHQ7CiAgIHVpbnQzMl90IGlucHV0X3JlY3Vyc2lvbl9kZXB0aF87CiAgIHVpbnQzMl90IG91dHB1dF9yZWN1cnNpb25fZGVwdGhfOwogICB1aW50MzJfdCByZWN1cnNpb25fbGltaXRfOwpAQCAtNTkwLDExICs1OTQsMTYgQEAKICAqLwogY2xhc3MgVFByb3RvY29sRmFjdG9yeSB7CiBwdWJsaWM6Ci0gIFRQcm90b2NvbEZhY3RvcnkoKSB7fQorICBUUHJvdG9jb2xGYWN0b3J5KCkgPSBkZWZhdWx0OwogCiAgIHZpcnR1YWwgflRQcm90b2NvbEZhY3RvcnkoKTsKIAotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5UcmFucywKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRUcmFucykgeworICAgICh2b2lkKW91dFRyYW5zOworICAgIHJldHVybiBnZXRQcm90b2NvbChpblRyYW5zKTsKKyAgfQogfTsKIAogLyoqCkBAIC02NjIsNyArNjcxLDcgQEAKICAgICByZXR1cm4gcHJvdC5yZWFkQm9vbChib29sdik7CiAgIH0KICAgY2FzZSBUX0JZVEU6IHsKLSAgICBpbnQ4X3QgYnl0ZXY7CisgICAgaW50OF90IGJ5dGV2ID0gMDsKICAgICByZXR1cm4gcHJvdC5yZWFkQnl0ZShieXRldik7CiAgIH0KICAgY2FzZSBUX0kxNjogewpAQCAtNzM3LDE0ICs3NDYsMTIgQEAKICAgICByZXN1bHQgKz0gcHJvdC5yZWFkTGlzdEVuZCgpOwogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KLSAgY2FzZSBUX1NUT1A6Ci0gIGNhc2UgVF9WT0lEOgotICBjYXNlIFRfVTY0OgotICBjYXNlIFRfVVRGODoKLSAgY2FzZSBUX1VURjE2OgorICBkZWZhdWx0OgogICAgIGJyZWFrOwogICB9Ci0gIHJldHVybiAwOworCisgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIFRUeXBlIik7CiB9CiAKIH19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaAppbmRleCA0NDZhODFmLi41MjU4MTU5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oCkBAIC0yMSwxMiArMjEsMTIgQEAKICNkZWZpbmUgVEhSSUZUX1RQUk9UT0NPTERFQ09SQVRPUl9IXyAxCiAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHByb3RvY29sIHsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCiAvKioKICAqIDxjb2RlPlRQcm90b2NvbERlY29yYXRvcjwvY29kZT4gZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkCkBAIC0zOSwxMDcgKzM5LDEwNyBAQAogICovCiBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgOiBwdWJsaWMgVFByb3RvY29sIHsKIHB1YmxpYzoKLSAgdmlydHVhbCB+VFByb3RvY29sRGVjb3JhdG9yKCkge30KKyAgflRQcm90b2NvbERlY29yYXRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAogICAvLyBEZXNjOiBJbml0aWFsaXplcyB0aGUgcHJvdG9jb2wgZGVjb3JhdG9yIG9iamVjdC4KICAgVFByb3RvY29sRGVjb3JhdG9yKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bykKICAgICA6IFRQcm90b2NvbChwcm90by0+Z2V0VHJhbnNwb3J0KCkpLCBwcm90b2NvbChwcm90bykge30KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOwogICB9Ci0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVNZXNzYWdlRW5kKCk7IH0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSkgeworICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmRfdmlydCgpIG92ZXJyaWRlIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZU1lc3NhZ2VFbmQoKTsgfQorICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSkgb3ZlcnJpZGUgewogICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVTdHJ1Y3RCZWdpbihuYW1lKTsKICAgfQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVTdHJ1Y3RFbmQoKTsgfQorICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZF92aXJ0KCkgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlU3RydWN0RW5kKCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUsCisgIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUZpZWxkRW5kKCk7IH0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlRmllbGRTdG9wKCk7IH0KKyAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZF92aXJ0KCkgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlRmllbGRFbmQoKTsgfQorICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlRmllbGRTdG9wKCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW5fdmlydChjb25zdCBUVHlwZSBrZXlUeXBlLAorICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUga2V5VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHByb3RvY29sLT53cml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTWFwRW5kKCk7IH0KKyAgdWludDMyX3Qgd3JpdGVNYXBFbmRfdmlydCgpIG92ZXJyaWRlIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZU1hcEVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKICAgfQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTGlzdEVuZCgpOyB9CisgIHVpbnQzMl90IHdyaXRlTGlzdEVuZF92aXJ0KCkgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTGlzdEVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHByb3RvY29sLT53cml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKICAgfQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVTZXRFbmQoKTsgfQorICB1aW50MzJfdCB3cml0ZVNldEVuZF92aXJ0KCkgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlU2V0RW5kKCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQm9vbF92aXJ0KGNvbnN0IGJvb2wgdmFsdWUpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUJvb2wodmFsdWUpOyB9Ci0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCeXRlX3ZpcnQoY29uc3QgaW50OF90IGJ5dGUpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUJ5dGUoYnl0ZSk7IH0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkxNl92aXJ0KGNvbnN0IGludDE2X3QgaTE2KSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVJMTYoaTE2KTsgfQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTMyX3ZpcnQoY29uc3QgaW50MzJfdCBpMzIpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUkzMihpMzIpOyB9Ci0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJNjRfdmlydChjb25zdCBpbnQ2NF90IGk2NCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlSTY0KGk2NCk7IH0KKyAgdWludDMyX3Qgd3JpdGVCb29sX3ZpcnQoY29uc3QgYm9vbCB2YWx1ZSkgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlQm9vbCh2YWx1ZSk7IH0KKyAgdWludDMyX3Qgd3JpdGVCeXRlX3ZpcnQoY29uc3QgaW50OF90IGJ5dGUpIG92ZXJyaWRlIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUJ5dGUoYnl0ZSk7IH0KKyAgdWludDMyX3Qgd3JpdGVJMTZfdmlydChjb25zdCBpbnQxNl90IGkxNikgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlSTE2KGkxNik7IH0KKyAgdWludDMyX3Qgd3JpdGVJMzJfdmlydChjb25zdCBpbnQzMl90IGkzMikgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlSTMyKGkzMik7IH0KKyAgdWludDMyX3Qgd3JpdGVJNjRfdmlydChjb25zdCBpbnQ2NF90IGk2NCkgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlSTY0KGk2NCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRG91YmxlX3ZpcnQoY29uc3QgZG91YmxlIGR1YikgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlRG91YmxlKGR1Yik7IH0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cmluZ192aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZVN0cmluZyhzdHIpOyB9Ci0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCaW5hcnlfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVCaW5hcnkoc3RyKTsgfQorICB1aW50MzJfdCB3cml0ZURvdWJsZV92aXJ0KGNvbnN0IGRvdWJsZSBkdWIpIG92ZXJyaWRlIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZURvdWJsZShkdWIpOyB9CisgIHVpbnQzMl90IHdyaXRlU3RyaW5nX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlU3RyaW5nKHN0cik7IH0KKyAgdWludDMyX3Qgd3JpdGVCaW5hcnlfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSBvdmVycmlkZSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVCaW5hcnkoc3RyKTsgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLAorICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CiAgIH0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRNZXNzYWdlRW5kKCk7IH0KKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmRfdmlydCgpIG92ZXJyaWRlIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0QmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSkgeworICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSkgb3ZlcnJpZGUgewogICAgIHJldHVybiBwcm90b2NvbC0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOwogICB9Ci0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRTdHJ1Y3RFbmQoKTsgfQorICB1aW50MzJfdCByZWFkU3RydWN0RW5kX3ZpcnQoKSBvdmVycmlkZSB7IHJldHVybiBwcm90b2NvbC0+cmVhZFN0cnVjdEVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CiAgIH0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkRmllbGRFbmQoKTsgfQorICB1aW50MzJfdCByZWFkRmllbGRFbmRfdmlydCgpIG92ZXJyaWRlIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkRmllbGRFbmQoKTsgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICB1aW50MzJfdCByZWFkTWFwQmVnaW5fdmlydChUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CiAgIH0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZE1hcEVuZCgpOyB9CisgIHVpbnQzMl90IHJlYWRNYXBFbmRfdmlydCgpIG92ZXJyaWRlIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkTWFwRW5kKCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgIHVpbnQzMl90IHJlYWRMaXN0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKICAgfQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZExpc3RFbmQoKTsgfQorICB1aW50MzJfdCByZWFkTGlzdEVuZF92aXJ0KCkgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRMaXN0RW5kKCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgb3ZlcnJpZGUgewogICAgIHJldHVybiBwcm90b2NvbC0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKICAgfQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkU2V0RW5kKCk7IH0KKyAgdWludDMyX3QgcmVhZFNldEVuZF92aXJ0KCkgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRTZXRFbmQoKTsgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChib29sJiB2YWx1ZSkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCb29sKHZhbHVlKTsgfQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgeworICB1aW50MzJfdCByZWFkQm9vbF92aXJ0KGJvb2wmIHZhbHVlKSBvdmVycmlkZSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEJvb2wodmFsdWUpOyB9CisgIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgb3ZlcnJpZGUgewogICAgIHJldHVybiBwcm90b2NvbC0+cmVhZEJvb2wodmFsdWUpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQnl0ZV92aXJ0KGludDhfdCYgYnl0ZSkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCeXRlKGJ5dGUpOyB9CisgIHVpbnQzMl90IHJlYWRCeXRlX3ZpcnQoaW50OF90JiBieXRlKSBvdmVycmlkZSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEJ5dGUoYnl0ZSk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMTZfdmlydChpbnQxNl90JiBpMTYpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkSTE2KGkxNik7IH0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkSTMyX3ZpcnQoaW50MzJfdCYgaTMyKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEkzMihpMzIpOyB9Ci0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEk2NF92aXJ0KGludDY0X3QmIGk2NCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRJNjQoaTY0KTsgfQorICB1aW50MzJfdCByZWFkSTE2X3ZpcnQoaW50MTZfdCYgaTE2KSBvdmVycmlkZSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEkxNihpMTYpOyB9CisgIHVpbnQzMl90IHJlYWRJMzJfdmlydChpbnQzMl90JiBpMzIpIG92ZXJyaWRlIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkSTMyKGkzMik7IH0KKyAgdWludDMyX3QgcmVhZEk2NF92aXJ0KGludDY0X3QmIGk2NCkgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRJNjQoaTY0KTsgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZERvdWJsZV92aXJ0KGRvdWJsZSYgZHViKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZERvdWJsZShkdWIpOyB9CisgIHVpbnQzMl90IHJlYWREb3VibGVfdmlydChkb3VibGUmIGR1Yikgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWREb3VibGUoZHViKTsgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cmluZ192aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkU3RyaW5nKHN0cik7IH0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQmluYXJ5X3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCaW5hcnkoc3RyKTsgfQorICB1aW50MzJfdCByZWFkU3RyaW5nX3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRTdHJpbmcoc3RyKTsgfQorICB1aW50MzJfdCByZWFkQmluYXJ5X3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgb3ZlcnJpZGUgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCaW5hcnkoc3RyKTsgfQogCiBwcml2YXRlOgogICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2w7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKaW5kZXggMThhOGVkMC4uM2Q0NDM2NSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaApAQCAtNTksNyArNTksNyBAQAogICBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKICAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyh0eXBlKSB7fQogCi0gIHZpcnR1YWwgflRQcm90b2NvbEV4Y2VwdGlvbigpIHRocm93KCkge30KKyAgflRQcm90b2NvbEV4Y2VwdGlvbigpIG5vZXhjZXB0IG92ZXJyaWRlID0gZGVmYXVsdDsKIAogICAvKioKICAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgZXJyb3IKQEAgLTY3LDkgKzY3LDkgQEAKICAgICoKICAgICogQHJldHVybiBFcnJvciBjb2RlCiAgICAqLwotICBUUHJvdG9jb2xFeGNlcHRpb25UeXBlIGdldFR5cGUoKSB7IHJldHVybiB0eXBlXzsgfQorICBUUHJvdG9jb2xFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQogCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgeworICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgb3ZlcnJpZGUgewogICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CiAgICAgICBzd2l0Y2ggKHR5cGVfKSB7CiAgICAgICBjYXNlIFVOS05PV046CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmgKaW5kZXggM2U1NjM5My4uZDAwMGJhNiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaApAQCAtMzYsNyArMzYsNyBAQAogICovCiBjbGFzcyBUUHJvdG9jb2xUYXAgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUUHJvdG9jb2xUYXA+IHsKIHB1YmxpYzoKLSAgVFByb3RvY29sVGFwKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc291cmNlLCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmspCisgIFRQcm90b2NvbFRhcChzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2UsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmspCiAgICAgOiBUVmlydHVhbFByb3RvY29sPFRQcm90b2NvbFRhcD4oc291cmNlLT5nZXRUcmFuc3BvcnQoKSksIHNvdXJjZV8oc291cmNlKSwgc2lua18oc2luaykge30KIAogICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFpZCkgewpAQCAtMTY3LDggKzE2Nyw4IEBACiAgIH0KIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2VfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmtfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2VfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzaW5rXzsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OThiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRZUEVTX0hfCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUWVBFU19IXyAxCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCitlbnVtIFBST1RPQ09MX1RZUEVTIHsKKyAgVF9CSU5BUllfUFJPVE9DT0wgPSAwLAorICBUX0pTT05fUFJPVE9DT0wgPSAxLAorICBUX0NPTVBBQ1RfUFJPVE9DT0wgPSAyLAorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVFlQRVNfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmgKaW5kZXggODMxYzNhMi4uYjdmZTkyOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oCkBAIC0zMDEsNyArMzAxLDcgQEAKICAgdWludDMyX3Qgc2tpcChUVHlwZSB0eXBlKSB7IHJldHVybiA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6c2tpcCgqdGhpcywgdHlwZSk7IH0KIAogcHJvdGVjdGVkOgotICBUUHJvdG9jb2xEZWZhdWx0cyhib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpIDogVFByb3RvY29sKHB0cmFucykge30KKyAgVFByb3RvY29sRGVmYXVsdHMoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykgOiBUUHJvdG9jb2wocHRyYW5zKSB7fQogfTsKIAogLyoqCkBAIC0zMTUsODEgKzMxNSw4MSBAQAogICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KICAgICovCiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kX3ZpcnQoKSB7CisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZF92aXJ0KCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVNZXNzYWdlRW5kKCk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lKSB7CisgIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVN0cnVjdEJlZ2luKG5hbWUpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU3RydWN0RW5kKCk7IH0KKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmRfdmlydCgpIG92ZXJyaWRlIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVN0cnVjdEVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lLAorICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkRW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVGaWVsZEVuZCgpOyB9CisgIHVpbnQzMl90IHdyaXRlRmllbGRFbmRfdmlydCgpIG92ZXJyaWRlIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUZpZWxkRW5kKCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVGaWVsZFN0b3AoKTsgfQorICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgb3ZlcnJpZGUgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRTdG9wKCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW5fdmlydChjb25zdCBUVHlwZSBrZXlUeXBlLAorICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUga2V5VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTWFwRW5kKCk7IH0KKyAgdWludDMyX3Qgd3JpdGVNYXBFbmRfdmlydCgpIG92ZXJyaWRlIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1hcEVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVMaXN0RW5kKCk7IH0KKyAgdWludDMyX3Qgd3JpdGVMaXN0RW5kX3ZpcnQoKSBvdmVycmlkZSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVMaXN0RW5kKCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICB1aW50MzJfdCB3cml0ZVNldEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU2V0RW5kKCk7IH0KKyAgdWludDMyX3Qgd3JpdGVTZXRFbmRfdmlydCgpIG92ZXJyaWRlIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVNldEVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJvb2xfdmlydChjb25zdCBib29sIHZhbHVlKSB7CisgIHVpbnQzMl90IHdyaXRlQm9vbF92aXJ0KGNvbnN0IGJvb2wgdmFsdWUpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlQm9vbCh2YWx1ZSk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQnl0ZV92aXJ0KGNvbnN0IGludDhfdCBieXRlKSB7CisgIHVpbnQzMl90IHdyaXRlQnl0ZV92aXJ0KGNvbnN0IGludDhfdCBieXRlKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUJ5dGUoYnl0ZSk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTE2X3ZpcnQoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgdWludDMyX3Qgd3JpdGVJMTZfdmlydChjb25zdCBpbnQxNl90IGkxNikgb3ZlcnJpZGUgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVJMTYoaTE2KTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMzJfdmlydChjb25zdCBpbnQzMl90IGkzMikgeworICB1aW50MzJfdCB3cml0ZUkzMl92aXJ0KGNvbnN0IGludDMyX3QgaTMyKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUkzMihpMzIpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUk2NF92aXJ0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgIHVpbnQzMl90IHdyaXRlSTY0X3ZpcnQoY29uc3QgaW50NjRfdCBpNjQpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlSTY0KGk2NCk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRG91YmxlX3ZpcnQoY29uc3QgZG91YmxlIGR1YikgeworICB1aW50MzJfdCB3cml0ZURvdWJsZV92aXJ0KGNvbnN0IGRvdWJsZSBkdWIpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRG91YmxlKGR1Yik7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RyaW5nX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICB1aW50MzJfdCB3cml0ZVN0cmluZ192aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU3RyaW5nKHN0cik7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQmluYXJ5X3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICB1aW50MzJfdCB3cml0ZUJpbmFyeV92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlQmluYXJ5KHN0cik7CiAgIH0KIApAQCAtMzk3LDgxICszOTcsODEgQEAKICAgICogUmVhZGluZyBmdW5jdGlvbnMKICAgICovCiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTWVzc2FnZUVuZCgpOyB9CisgIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kX3ZpcnQoKSBvdmVycmlkZSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1lc3NhZ2VFbmQoKTsgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTdHJ1Y3RFbmQoKTsgfQorICB1aW50MzJfdCByZWFkU3RydWN0RW5kX3ZpcnQoKSBvdmVycmlkZSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFN0cnVjdEVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRGaWVsZEVuZCgpOyB9CisgIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgb3ZlcnJpZGUgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRGaWVsZEVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwQmVnaW5fdmlydChUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgIHVpbnQzMl90IHJlYWRNYXBCZWdpbl92aXJ0KFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNYXBFbmQoKTsgfQorICB1aW50MzJfdCByZWFkTWFwRW5kX3ZpcnQoKSBvdmVycmlkZSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1hcEVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICB1aW50MzJfdCByZWFkTGlzdEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgb3ZlcnJpZGUgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZExpc3RFbmQoKTsgfQorICB1aW50MzJfdCByZWFkTGlzdEVuZF92aXJ0KCkgb3ZlcnJpZGUgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRMaXN0RW5kKCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgb3ZlcnJpZGUgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTZXRFbmQoKTsgfQorICB1aW50MzJfdCByZWFkU2V0RW5kX3ZpcnQoKSBvdmVycmlkZSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFNldEVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KGJvb2wmIHZhbHVlKSB7CisgIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoYm9vbCYgdmFsdWUpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCb29sKHZhbHVlKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChzdGQ6OnZlY3Rvcjxib29sPjo6cmVmZXJlbmNlIHZhbHVlKSB7CisgIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgb3ZlcnJpZGUgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEJvb2wodmFsdWUpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQnl0ZV92aXJ0KGludDhfdCYgYnl0ZSkgeworICB1aW50MzJfdCByZWFkQnl0ZV92aXJ0KGludDhfdCYgYnl0ZSkgb3ZlcnJpZGUgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEJ5dGUoYnl0ZSk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMTZfdmlydChpbnQxNl90JiBpMTYpIHsKKyAgdWludDMyX3QgcmVhZEkxNl92aXJ0KGludDE2X3QmIGkxNikgb3ZlcnJpZGUgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEkxNihpMTYpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkSTMyX3ZpcnQoaW50MzJfdCYgaTMyKSB7CisgIHVpbnQzMl90IHJlYWRJMzJfdmlydChpbnQzMl90JiBpMzIpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRJMzIoaTMyKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEk2NF92aXJ0KGludDY0X3QmIGk2NCkgeworICB1aW50MzJfdCByZWFkSTY0X3ZpcnQoaW50NjRfdCYgaTY0KSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkSTY0KGk2NCk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWREb3VibGVfdmlydChkb3VibGUmIGR1YikgeworICB1aW50MzJfdCByZWFkRG91YmxlX3ZpcnQoZG91YmxlJiBkdWIpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWREb3VibGUoZHViKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cmluZ192aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgdWludDMyX3QgcmVhZFN0cmluZ192aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTdHJpbmcoc3RyKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEJpbmFyeV92aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgdWludDMyX3QgcmVhZEJpbmFyeV92aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCaW5hcnkoc3RyKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3Qgc2tpcF92aXJ0KFRUeXBlIHR5cGUpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5za2lwKHR5cGUpOyB9CisgIHVpbnQzMl90IHNraXBfdmlydChUVHlwZSB0eXBlKSBvdmVycmlkZSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+c2tpcCh0eXBlKTsgfQogCiAgIC8qCiAgICAqIFByb3ZpZGUgYSBkZWZhdWx0IHNraXAoKSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgbm9uLXZpcnR1YWwgcmVhZApAQCAtNDg0LDcgKzQ4NCw3IEBACiAgICAqIGNvcnJlY3QgcGFyZW50IGltcGxlbWVudGF0aW9uLCBpZiBkZXNpcmVkLgogICAgKi8KICAgdWludDMyX3Qgc2tpcChUVHlwZSB0eXBlKSB7Ci0gICAgUHJvdG9jb2xfKiBjb25zdCBwcm90ID0gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyk7CisgICAgYXV0byogY29uc3QgcHJvdCA9IHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpOwogICAgIHJldHVybiA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6c2tpcCgqcHJvdCwgdHlwZSk7CiAgIH0KIApAQCAtNTA0LDcgKzUwNCw3IEBACiAgIHVzaW5nIFN1cGVyXzo6cmVhZEJvb2w7IC8vIHNvIHdlIGRvbid0IGhpZGUgcmVhZEJvb2woYm9vbCYpCiAKIHByb3RlY3RlZDoKLSAgVFZpcnR1YWxQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpIDogU3VwZXJfKHB0cmFucykge30KKyAgVFZpcnR1YWxQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKSA6IFN1cGVyXyhwdHJhbnMpIHt9CiB9OwogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L0NNYWtlTGlzdHMudHh0CmluZGV4IGM2NTc5MzguLjA0YTlhMzEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvQ01ha2VMaXN0cy50eHQKQEAgLTI1LDMgKzI1LDQgQEAKIGZpbmRfcGFja2FnZShRdDUgUkVRVUlSRUQgQ09NUE9ORU5UUyBDb3JlIE5ldHdvcmspCiBBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0cXQ1ICR7dGhyaWZ0Y3BwcXQ1X1NPVVJDRVN9KQogVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnRxdDUgUXQ1OjpDb3JlIFF0NTo6TmV0d29yaykKK1RBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnRxdDUgdGhyaWZ0KQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwCmluZGV4IDY4NmYyNDIuLjE1MzdmYzYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAKQEAgLTIzLDExICsyMywxMyBAQAogI2luY2x1ZGUgPFFJT0RldmljZT4KIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKIG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCiBUUUlPRGV2aWNlVHJhbnNwb3J0OjpUUUlPRGV2aWNlVHJhbnNwb3J0KHNoYXJlZF9wdHI8UUlPRGV2aWNlPiBkZXYpIDogZGV2XyhkZXYpIHsKQEAgLTQ0LDcgKzQ2LDcgQEAKICAgfQogfQogCi1ib29sIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmlzT3BlbigpIHsKK2Jvb2wgVFFJT0RldmljZVRyYW5zcG9ydDo6aXNPcGVuKCkgY29uc3QgewogICByZXR1cm4gZGV2Xy0+aXNPcGVuKCk7CiB9CiAKQEAgLTg5LDcgKzkxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkKCk6IHVuZGVybHlpbmcgUUlPRGV2aWNlIGlzIG5vdCBvcGVuIik7CiAgIH0KIAotICBhY3R1YWxTaXplID0gKHVpbnQzMl90KXN0ZDo6bWluKChxaW50NjQpbGVuLCBkZXZfLT5ieXRlc0F2YWlsYWJsZSgpKTsKKyAgYWN0dWFsU2l6ZSA9ICh1aW50MzJfdCkoc3RkOjptaW4pKChxaW50NjQpbGVuLCBkZXZfLT5ieXRlc0F2YWlsYWJsZSgpKTsKICAgcmVhZFNpemUgPSBkZXZfLT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZiksIGFjdHVhbFNpemUpOwogCiAgIGlmIChyZWFkU2l6ZSA8IDApIHsKQEAgLTE1NSw3ICsxNTcsNyBAQAogdWludDhfdCogVFFJT0RldmljZVRyYW5zcG9ydDo6Ym9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewogICAodm9pZClidWY7CiAgICh2b2lkKWxlbjsKLSAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBudWxscHRyOwogfQogCiB2b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmNvbnN1bWUodWludDMyX3QgbGVuKSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaAppbmRleCA4MDkxZDMyLi5hM2I1MTFkIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9BU1lOQ19UUUlPREVWSUNFX1RSQU5TUE9SVF9IXwogI2RlZmluZSBfVEhSSUZUX0FTWU5DX1RRSU9ERVZJQ0VfVFJBTlNQT1JUX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KIApAQCAtMzYsMTMgKzM2LDEzIEBACiBjbGFzcyBUUUlPRGV2aWNlVHJhbnNwb3J0CiAgICAgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFZpcnR1YWxUcmFuc3BvcnQ8VFFJT0RldmljZVRyYW5zcG9ydD4gewogcHVibGljOgotICBleHBsaWNpdCBUUUlPRGV2aWNlVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KTsKLSAgdmlydHVhbCB+VFFJT0RldmljZVRyYW5zcG9ydCgpOworICBleHBsaWNpdCBUUUlPRGV2aWNlVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldik7CisgIH5UUUlPRGV2aWNlVHJhbnNwb3J0KCkgb3ZlcnJpZGU7CiAKLSAgdm9pZCBvcGVuKCk7Ci0gIGJvb2wgaXNPcGVuKCk7Ci0gIGJvb2wgcGVlaygpOwotICB2b2lkIGNsb3NlKCk7CisgIHZvaWQgb3BlbigpIG92ZXJyaWRlOworICBib29sIGlzT3BlbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIHBlZWsoKSBvdmVycmlkZTsKKyAgdm9pZCBjbG9zZSgpIG92ZXJyaWRlOwogCiAgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwogICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKQEAgLTUwLDcgKzUwLDcgQEAKICAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAgIHVpbnQzMl90IHdyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwogCi0gIHZvaWQgZmx1c2goKTsKKyAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlOwogCiAgIHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOwogICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKTsKQEAgLTU5LDcgKzU5LDcgQEAKICAgVFFJT0RldmljZVRyYW5zcG9ydChjb25zdCBUUUlPRGV2aWNlVHJhbnNwb3J0Jik7CiAgIFRRSU9EZXZpY2VUcmFuc3BvcnQmIG9wZXJhdG9yPShjb25zdCBUUUlPRGV2aWNlVHJhbnNwb3J0Jik7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UUlPRGV2aWNlPiBkZXZfOworICBzdGQ6OnNoYXJlZF9wdHI8UUlPRGV2aWNlPiBkZXZfOwogfTsKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCmluZGV4IGEzMjExZGYuLjA0MDQ0ODIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcApAQCAtMTcsMjQgKzE3LDI3IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKICNpbmNsdWRlIDx0aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oPgogCisjaW5jbHVkZSA8UU1ldGFUeXBlPgogI2luY2x1ZGUgPFFUY3BTb2NrZXQ+CiAKLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgotCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaD4KIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZDsKK3VzaW5nIHN0ZDo6YmluZDsKK3VzaW5nIHN0ZDo6ZnVuY3Rpb247Cit1c2luZyBzdGQ6OnBsYWNlaG9sZGVyczo6XzE7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKIFFUX1VTRV9OQU1FU1BBQ0UKIApAQCAtNjAsMTEgKzYzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBRT2JqZWN0KiBwYXJlbnQpCiAgIDogUU9iamVjdChwYXJlbnQpLCBzZXJ2ZXJfKHNlcnZlciksIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwgcGZhY3RfKHBmYWN0KSB7CisgIHFSZWdpc3Rlck1ldGFUeXBlPFFUY3BTb2NrZXQqPigiUVRjcFNvY2tldCoiKTsKICAgY29ubmVjdChzZXJ2ZXIuZ2V0KCksIFNJR05BTChuZXdDb25uZWN0aW9uKCkpLCBTTE9UKHByb2Nlc3NJbmNvbWluZygpKSk7CiB9CiAKLVRRVGNwU2VydmVyOjp+VFFUY3BTZXJ2ZXIoKSB7Ci19CitUUVRjcFNlcnZlcjo6flRRVGNwU2VydmVyKCkgPSBkZWZhdWx0OwogCiB2b2lkIFRRVGNwU2VydmVyOjpwcm9jZXNzSW5jb21pbmcoKSB7CiAgIHdoaWxlIChzZXJ2ZXJfLT5oYXNQZW5kaW5nQ29ubmVjdGlvbnMoKSkgewpAQCAtODcsMTcgKzkwLDE2IEBACiAgICAgfQogCiAgICAgY3R4TWFwX1tjb25uZWN0aW9uLmdldCgpXQotICAgICAgICA9IHNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+KG5ldyBDb25uZWN0aW9uQ29udGV4dChjb25uZWN0aW9uLCB0cmFuc3BvcnQsIGlwcm90LCBvcHJvdCkpOworICAgICAgICA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29ubmVjdGlvbkNvbnRleHQ+KGNvbm5lY3Rpb24sIHRyYW5zcG9ydCwgaXByb3QsIG9wcm90KTsKIAogICAgIGNvbm5lY3QoY29ubmVjdGlvbi5nZXQoKSwgU0lHTkFMKHJlYWR5UmVhZCgpKSwgU0xPVChiZWdpbkRlY29kZSgpKSk7CiAKLSAgICAvLyBuZWVkIHRvIHVzZSBRdWV1ZWRDb25uZWN0aW9uIHNpbmNlIHdlIHdpbGwgYmUgZGVsZXRpbmcgdGhlIHNvY2tldCBpbiB0aGUgc2xvdAotICAgIGNvbm5lY3QoY29ubmVjdGlvbi5nZXQoKSwgU0lHTkFMKGRpc2Nvbm5lY3RlZCgpKSwgU0xPVChzb2NrZXRDbG9zZWQoKSksIFF0OjpRdWV1ZWRDb25uZWN0aW9uKTsKKyAgICBjb25uZWN0KGNvbm5lY3Rpb24uZ2V0KCksIFNJR05BTChkaXNjb25uZWN0ZWQoKSksIFNMT1Qoc29ja2V0Q2xvc2VkKCkpKTsKICAgfQogfQogCiB2b2lkIFRRVGNwU2VydmVyOjpiZWdpbkRlY29kZSgpIHsKLSAgUVRjcFNvY2tldCogY29ubmVjdGlvbihxb2JqZWN0X2Nhc3Q8UVRjcFNvY2tldCo+KHNlbmRlcigpKSk7CisgIGF1dG8qIGNvbm5lY3Rpb24ocW9iamVjdF9jYXN0PFFUY3BTb2NrZXQqPihzZW5kZXIoKSkpOwogICBRX0FTU0VSVChjb25uZWN0aW9uKTsKIAogICBpZiAoY3R4TWFwXy5maW5kKGNvbm5lY3Rpb24pID09IGN0eE1hcF8uZW5kKCkpIHsKQEAgLTEwOSwzNCArMTExLDM5IEBACiAKICAgdHJ5IHsKICAgICBwcm9jZXNzb3JfCi0gICAgICAgIC0+cHJvY2VzcyhiaW5kKCZUUVRjcFNlcnZlcjo6ZmluaXNoLCB0aGlzLCBjdHgsIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OnBsYWNlaG9sZGVyczo6XzEpLAorICAgICAgICAtPnByb2Nlc3MoYmluZCgmVFFUY3BTZXJ2ZXI6OmZpbmlzaCwgdGhpcywgY3R4LCBfMSksCiAgICAgICAgICAgICAgICAgICBjdHgtPmlwcm90XywKICAgICAgICAgICAgICAgICAgIGN0eC0+b3Byb3RfKTsKICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKICAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBUVHJhbnNwb3J0RXhjZXB0aW9uIGR1cmluZyBwcm9jZXNzaW5nOiAnJXMnIiwgZXgud2hhdCgpKTsKLSAgICBjdHhNYXBfLmVyYXNlKGNvbm5lY3Rpb24pOworICAgIHNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoY29ubmVjdGlvbik7CiAgIH0gY2F0Y2ggKC4uLikgewogICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIFVua25vd24gcHJvY2Vzc29yIGV4Y2VwdGlvbiIpOwotICAgIGN0eE1hcF8uZXJhc2UoY29ubmVjdGlvbik7CisgICAgc2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChjb25uZWN0aW9uKTsKICAgfQogfQogCiB2b2lkIFRRVGNwU2VydmVyOjpzb2NrZXRDbG9zZWQoKSB7Ci0gIFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24ocW9iamVjdF9jYXN0PFFUY3BTb2NrZXQqPihzZW5kZXIoKSkpOworICBhdXRvKiBjb25uZWN0aW9uKHFvYmplY3RfY2FzdDxRVGNwU29ja2V0Kj4oc2VuZGVyKCkpKTsKICAgUV9BU1NFUlQoY29ubmVjdGlvbik7CisgIHNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoY29ubmVjdGlvbik7Cit9CiAKLSAgaWYgKGN0eE1hcF8uZmluZChjb25uZWN0aW9uKSA9PSBjdHhNYXBfLmVuZCgpKSB7Ci0gICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gVW5rbm93biBRVGNwU29ja2V0IGNsb3NlZCIpOwotICAgIHJldHVybjsKK3ZvaWQgVFFUY3BTZXJ2ZXI6OmRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24pIHsKKyAgY29uc3QgQ29ubmVjdGlvbkNvbnRleHRNYXA6OnNpemVfdHlwZSBkZWxldGVkID0gY3R4TWFwXy5lcmFzZShjb25uZWN0aW9uKTsKKyAgaWYgKDAgPT0gZGVsZXRlZCkgeworICAgICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gVW5rbm93biBRVGNwU29ja2V0Iik7CiAgIH0KK30KIAotICBjdHhNYXBfLmVyYXNlKGNvbm5lY3Rpb24pOwordm9pZCBUUVRjcFNlcnZlcjo6c2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChRVGNwU29ja2V0KiBjb25uZWN0aW9uKSB7CisgIFFNZXRhT2JqZWN0OjppbnZva2VNZXRob2QodGhpcywgImRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0IiwgUXQ6OlF1ZXVlZENvbm5lY3Rpb24sIFFfQVJHKFFUY3BTb2NrZXQqLCBjb25uZWN0aW9uKSk7CiB9CiAKIHZvaWQgVFFUY3BTZXJ2ZXI6OmZpbmlzaChzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiBjdHgsIGJvb2wgaGVhbHRoeSkgewogICBpZiAoIWhlYWx0aHkpIHsKICAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBQcm9jZXNzb3IgZmFpbGVkIHRvIHByb2Nlc3MgZGF0YSBzdWNjZXNzZnVsbHkiKTsKLSAgICBjdHhNYXBfLmVyYXNlKGN0eC0+Y29ubmVjdGlvbl8uZ2V0KCkpOworICAgIGRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KGN0eC0+Y29ubmVjdGlvbl8uZ2V0KCkpOwogICB9CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCmluZGV4IDM0MDNmMWUuLjI1OTk0YWIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8UU9iamVjdD4KICNpbmNsdWRlIDxRVGNwU2VydmVyPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtNDcsMzAgKzQ3LDMyIEBACiBjbGFzcyBUUVRjcFNlcnZlciA6IHB1YmxpYyBRT2JqZWN0IHsKICAgUV9PQkpFQ1QKIHB1YmxpYzoKLSAgVFFUY3BTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyLAotICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgIFFUX1BSRVBFTkRfTkFNRVNQQUNFKFFPYmplY3QpKiBwYXJlbnQgPSBOVUxMKTsKLSAgdmlydHVhbCB+VFFUY3BTZXJ2ZXIoKTsKKyAgVFFUY3BTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlciwKKyAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgIFFPYmplY3QqIHBhcmVudCA9IG51bGxwdHIpOworICB+VFFUY3BTZXJ2ZXIoKSBvdmVycmlkZTsKIAogcHJpdmF0ZSBRX1NMT1RTOgogICB2b2lkIHByb2Nlc3NJbmNvbWluZygpOwogICB2b2lkIGJlZ2luRGVjb2RlKCk7CiAgIHZvaWQgc29ja2V0Q2xvc2VkKCk7CisgIHZvaWQgZGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoUVRjcFNvY2tldCogY29ubmVjdGlvbik7CiAKIHByaXZhdGU6Ci0gIFRRVGNwU2VydmVyKGNvbnN0IFRRVGNwU2VydmVyJik7Ci0gIFRRVGNwU2VydmVyJiBvcGVyYXRvcj0oY29uc3QgVFFUY3BTZXJ2ZXImKTsKKyAgUV9ESVNBQkxFX0NPUFkoVFFUY3BTZXJ2ZXIpCiAKICAgc3RydWN0IENvbm5lY3Rpb25Db250ZXh0OwogCi0gIHZvaWQgZmluaXNoKGJvb3N0OjpzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiBjdHgsIGJvb2wgaGVhbHRoeSk7CisgIHZvaWQgc2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChRVGNwU29ja2V0KiBjb25uZWN0aW9uKTsKKyAgdm9pZCBmaW5pc2goc3RkOjpzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiBjdHgsIGJvb2wgaGVhbHRoeSk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0XzsKIAotICBzdGQ6Om1hcDxRVF9QUkVQRU5EX05BTUVTUEFDRShRVGNwU29ja2V0KSosIGJvb3N0OjpzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiA+IGN0eE1hcF87CisgIHR5cGVkZWYgc3RkOjptYXA8UVRjcFNvY2tldCosIHN0ZDo6c2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4gPiBDb25uZWN0aW9uQ29udGV4dE1hcDsKKyAgQ29ubmVjdGlvbkNvbnRleHRNYXAgY3R4TWFwXzsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcAppbmRleCBjMjQ4ZTYzLi45YTc4ZTNlIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgc3RkOjpzdHJpbmc7CiAKIFRDb25uZWN0ZWRDbGllbnQ6OlRDb25uZWN0ZWRDbGllbnQoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLApAQCAtNDIsMTEgKzQyLDEwIEBACiAgICAgb3V0cHV0UHJvdG9jb2xfKG91dHB1dFByb3RvY29sKSwKICAgICBldmVudEhhbmRsZXJfKGV2ZW50SGFuZGxlciksCiAgICAgY2xpZW50XyhjbGllbnQpLAotICAgIG9wYXF1ZUNvbnRleHRfKDApIHsKKyAgICBvcGFxdWVDb250ZXh0XyhudWxscHRyKSB7CiB9CiAKLVRDb25uZWN0ZWRDbGllbnQ6On5UQ29ubmVjdGVkQ2xpZW50KCkgewotfQorVENvbm5lY3RlZENsaWVudDo6flRDb25uZWN0ZWRDbGllbnQoKSA9IGRlZmF1bHQ7CiAKIHZvaWQgVENvbm5lY3RlZENsaWVudDo6cnVuKCkgewogICBpZiAoZXZlbnRIYW5kbGVyXykgewpAQCAtNjQsMjkgKzYzLDI4IEBACiAgICAgICB9CiAgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CiAgICAgICBzd2l0Y2ggKHR0eC5nZXRUeXBlKCkpIHsKLSAgICAgIGNhc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUOgotICAgICAgICAvLyBSZWNlaXZlIHRpbWVvdXQgLSBjb250aW51ZSBwcm9jZXNzaW5nLgotICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRToKKyAgICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRDoKKyAgICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQ6CisgICAgICAgICAgLy8gQ2xpZW50IGRpc2Nvbm5lY3RlZCBvciB3YXMgaW50ZXJydXB0ZWQgb3IgZGlkIG5vdCByZXNwb25kIHdpdGhpbiB0aGUgcmVjZWl2ZSB0aW1lb3V0LgorICAgICAgICAgIC8vIE5vIGxvZ2dpbmcgbmVlZGVkLiAgRG9uZS4KKyAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRToKLSAgICAgIGNhc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQ6Ci0gICAgICAgIC8vIENsaWVudCBkaXNjb25uZWN0ZWQgb3Igd2FzIGludGVycnVwdGVkLiAgTm8gbG9nZ2luZyBuZWVkZWQuICBEb25lLgotICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgLy8gQWxsIG90aGVyIHRyYW5zcG9ydCBleGNlcHRpb25zIGFyZSBsb2dnZWQuCi0gICAgICAgIC8vIFN0YXRlIG9mIGNvbm5lY3Rpb24gaXMgdW5rbm93bi4gIERvbmUuCi0gICAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRDb25uZWN0ZWRDbGllbnQgZGllZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAvLyBBbGwgb3RoZXIgdHJhbnNwb3J0IGV4Y2VwdGlvbnMgYXJlIGxvZ2dlZC4KKyAgICAgICAgICAvLyBTdGF0ZSBvZiBjb25uZWN0aW9uIGlzIHVua25vd24uICBEb25lLgorICAgICAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRDb25uZWN0ZWRDbGllbnQgZGllZDogIikgKyB0dHgud2hhdCgpOworICAgICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uJiB0ZXgpIHsKICAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRDb25uZWN0ZWRDbGllbnQgcHJvY2Vzc2luZyBleGNlcHRpb246ICIpICsgdGV4LndoYXQoKTsKICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICAvLyBDb250aW51ZSBwcm9jZXNzaW5nCisgICAgICAvLyBEaXNjb25uZWN0IGZyb20gY2xpZW50LCBiZWNhdXNlIHdlIGNvdWxkIG5vdCBwcm9jZXNzIHRoZSBtZXNzYWdlLgorICAgICAgZG9uZSA9IHRydWU7CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmgKaW5kZXggM2VhMDY1ZS4uMDcxNTcxYSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVENPTk5FQ1RFRENMSUVOVF9IXwogI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UQ09OTkVDVEVEQ0xJRU5UX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KQEAgLTQ5LDE2ICs0OSwxNiBAQAogICAgKiBAcGFyYW1baW5dIGNsaWVudCAgICAgICAgIHRoZSBUVHJhbnNwb3J0IHJlcHJlc2VudGluZyB0aGUgY2xpZW50CiAgICAqLwogICBUQ29ubmVjdGVkQ2xpZW50KAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4mIGlucHV0UHJvdG9jb2wsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4mIG91dHB1dFByb3RvY29sLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4mIGV2ZW50SGFuZGxlciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+JiBjbGllbnQpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiYgaW5wdXRQcm90b2NvbCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4mIG91dHB1dFByb3RvY29sLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+JiBldmVudEhhbmRsZXIsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4mIGNsaWVudCk7CiAKICAgLyoqCiAgICAqIERlc3RydWN0b3IuCiAgICAqLwotICB2aXJ0dWFsIH5UQ29ubmVjdGVkQ2xpZW50KCk7CisgIH5UQ29ubmVjdGVkQ2xpZW50KCkgb3ZlcnJpZGU7CiAKICAgLyoqCiAgICAqIERyaXZlIHRoZSBjbGllbnQgdW50aWwgaXQgaXMgZG9uZS4KQEAgLTc2LDcgKzc2LDcgQEAKICAgICogICAgICAgICAgICAgIGhhbmRsZSB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMgYnkgbG9nZ2luZwogICAgKiAgICAgICAgICAgIGNsZWFudXAoKQogICAgKi8KLSAgdmlydHVhbCB2b2lkIHJ1bigpIC8qIG92ZXJyaWRlICovOworICB2b2lkIHJ1bigpIG92ZXJyaWRlIC8qIG92ZXJyaWRlICovOwogCiBwcm90ZWN0ZWQ6CiAgIC8qKgpAQCAtOTIsMTEgKzkyLDExIEBACiAgIHZpcnR1YWwgdm9pZCBjbGVhbnVwKCk7CiAKIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXRQcm90b2NvbF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGNsaWVudF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dFByb3RvY29sXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gY2xpZW50XzsKIAogICAvKioKICAgICogQ29udGV4dCBhY3F1aXJlZCBmcm9tIHRoZSBldmVudEhhbmRsZXJfIGlmIG9uZSBleGlzdHMuCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKaW5kZXggZDFlOWVkZS4uZWVhMDQyNyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcApAQCAtMTcsMTkgKzE3LDIyIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCi0KICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi0jaWZkZWYgSEFWRV9TWVNfU0VMRUNUX0gKKyNpZmRlZiBIQVZFX1BPTExfSAorI2luY2x1ZGUgPHBvbGwuaD4KKyNlbGlmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZWxpZiBIQVZFX1NZU19TRUxFQ1RfSAogI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KICNlbmRpZgogCkBAIC02NCw5ICs2NywxMiBAQAogI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCiAjZW5kaWYKIAotI2lmICFkZWZpbmVkKFBSSXUzMikKLSNkZWZpbmUgUFJJdTMyICJJMzJ1IgotI2RlZmluZSBQUkl1NjQgIkk2NHUiCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgogI2VuZGlmCiAKIG5hbWVzcGFjZSBhcGFjaGUgewpAQCAtNzYsMTAgKzgyLDkgQEAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAogLy8vIFRocmVlIHN0YXRlcyBmb3Igc29ja2V0czogcmVjdiBmcmFtZSBzaXplLCByZWN2IGRhdGEsIGFuZCBzZW5kIG1vZGUKIGVudW0gVFNvY2tldFN0YXRlIHsgU09DS0VUX1JFQ1ZfRlJBTUlORywgU09DS0VUX1JFQ1YsIFNPQ0tFVF9TRU5EIH07CkBAIC0xMTQsMTAgKzExOSwxMCBAQAogICBUTm9uYmxvY2tpbmdTZXJ2ZXIqIHNlcnZlcl87CiAKICAgLy8vIFRQcm9jZXNzb3IKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CiAKICAgLy8vIE9iamVjdCB3cmFwcGluZyBuZXR3b3JrIHNvY2tldAotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiB0U29ja2V0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHRTb2NrZXRfOwogCiAgIC8vLyBMaWJldmVudCBvYmplY3QKICAgc3RydWN0IGV2ZW50IGV2ZW50XzsKQEAgLTE1OSwyMyArMTY0LDIzIEBACiAgIGludDMyX3QgY2FsbHNGb3JSZXNpemVfOwogCiAgIC8vLyBUcmFuc3BvcnQgdG8gcmVhZCBmcm9tCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGlucHV0VHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGlucHV0VHJhbnNwb3J0XzsKIAogICAvLy8gVHJhbnNwb3J0IHRoYXQgcHJvY2Vzc29yIHdyaXRlcyB0bwotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBvdXRwdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gb3V0cHV0VHJhbnNwb3J0XzsKIAogICAvLy8gZXh0cmEgdHJhbnNwb3J0IGdlbmVyYXRlZCBieSB0cmFuc3BvcnQgZmFjdG9yeSAoZS5nLiBCdWZmZXJlZFJvdXRlclRyYW5zcG9ydCkKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeUlucHV0VHJhbnNwb3J0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeU91dHB1dFRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeU91dHB1dFRyYW5zcG9ydF87CiAKICAgLy8vIFByb3RvY29sIGRlY29kZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbF87CiAKICAgLy8vIFByb3RvY29sIGVuY29kZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sXzsKIAogICAvLy8gU2VydmVyIGV2ZW50IGhhbmRsZXIsIGlmIGFueQotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyXzsKIAogICAvLy8gVGhyaWZ0IGNhbGwgY29udGV4dCwgaWYgYW55CiAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0XzsKQEAgLTIwOCwxMSArMjEzLDkgQEAKICAgY2xhc3MgVGFzazsKIAogICAvLy8gQ29uc3RydWN0b3IKLSAgVENvbm5lY3Rpb24oVEhSSUZUX1NPQ0tFVCBzb2NrZXQsCi0gICAgICAgICAgICAgIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCwKLSAgICAgICAgICAgICAgY29uc3Qgc29ja2FkZHIqIGFkZHIsCi0gICAgICAgICAgICAgIHNvY2tsZW5fdCBhZGRyTGVuKSB7Ci0gICAgcmVhZEJ1ZmZlcl8gPSBOVUxMOworICBUQ29ubmVjdGlvbihzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0LAorICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQpIHsKKyAgICByZWFkQnVmZmVyXyA9IG51bGxwdHI7CiAgICAgcmVhZEJ1ZmZlclNpemVfID0gMDsKIAogICAgIGlvVGhyZWFkXyA9IGlvVGhyZWFkOwpAQCAtMjIzLDggKzIyNiwxMCBAQAogICAgIGlucHV0VHJhbnNwb3J0Xy5yZXNldChuZXcgVE1lbW9yeUJ1ZmZlcihyZWFkQnVmZmVyXywgcmVhZEJ1ZmZlclNpemVfKSk7CiAgICAgb3V0cHV0VHJhbnNwb3J0Xy5yZXNldCgKICAgICAgICAgbmV3IFRNZW1vcnlCdWZmZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcnZlcl8tPmdldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoKSkpKTsKLSAgICB0U29ja2V0Xy5yZXNldChuZXcgVFNvY2tldCgpKTsKLSAgICBpbml0KHNvY2tldCwgaW9UaHJlYWQsIGFkZHIsIGFkZHJMZW4pOworCisgICAgdFNvY2tldF8gPSAgc29ja2V0OworCisgICAgaW5pdChpb1RocmVhZCk7CiAgIH0KIAogICB+VENvbm5lY3Rpb24oKSB7IHN0ZDo6ZnJlZShyZWFkQnVmZmVyXyk7IH0KQEAgLTI0MSwxMCArMjQ2LDEwIEBACiAgIHZvaWQgY2hlY2tJZGxlQnVmZmVyTWVtTGltaXQoc2l6ZV90IHJlYWRMaW1pdCwgc2l6ZV90IHdyaXRlTGltaXQpOwogCiAgIC8vLyBJbml0aWFsaXplCi0gIHZvaWQgaW5pdChUSFJJRlRfU09DS0VUIHNvY2tldCwKLSAgICAgICAgICAgIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCwKLSAgICAgICAgICAgIGNvbnN0IHNvY2thZGRyKiBhZGRyLAotICAgICAgICAgICAgc29ja2xlbl90IGFkZHJMZW4pOworICB2b2lkIGluaXQoVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkKTsKKworICAvLy8gc2V0IHNvY2tldCBmb3IgY29ubmVjdGlvbgorICB2b2lkIHNldFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KTsKIAogICAvKioKICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gdHJhbnNpdGlvbnMgZnJvbSBvbmUgc3RhdGUgaW50bwpAQCAtMjg3LDYgKzI5Miw3IEBACiAgIHZvaWQgZm9yY2VDbG9zZSgpIHsKICAgICBhcHBTdGF0ZV8gPSBBUFBfQ0xPU0VfQ09OTkVDVElPTjsKICAgICBpZiAoIW5vdGlmeUlPVGhyZWFkKCkpIHsKKyAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKICAgICAgIGNsb3NlKCk7CiAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUQ29ubmVjdGlvbjo6Zm9yY2VDbG9zZTogZmFpbGVkIHdyaXRlIG9uIG5vdGlmeSBwaXBlIik7CiAgICAgfQpAQCAtMjk5LDEwICszMDUsMTAgQEAKICAgVEFwcFN0YXRlIGdldFN0YXRlKCkgY29uc3QgeyByZXR1cm4gYXBwU3RhdGVfOyB9CiAKICAgLy8vIHJldHVybiB0aGUgVFNvY2tldCB0cmFuc3BvcnQgd3JhcHBpbmcgdGhpcyBuZXR3b3JrIGNvbm5lY3Rpb24KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gZ2V0VFNvY2tldCgpIGNvbnN0IHsgcmV0dXJuIHRTb2NrZXRfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBnZXRUU29ja2V0KCkgY29uc3QgeyByZXR1cm4gdFNvY2tldF87IH0KIAogICAvLy8gcmV0dXJuIHRoZSBzZXJ2ZXIgZXZlbnQgaGFuZGxlciBpZiBhbnkKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyXzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyXzsgfQogCiAgIC8vLyByZXR1cm4gdGhlIFRocmlmdCBjb25uZWN0aW9uIGNvbnRleHQgaWYgYW55CiAgIHZvaWQqIGdldENvbm5lY3Rpb25Db250ZXh0KCkgeyByZXR1cm4gY29ubmVjdGlvbkNvbnRleHRfOyB9CkBAIC0zMTAsOSArMzE2LDkgQEAKIAogY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CiBwdWJsaWM6Ci0gIFRhc2soYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCi0gICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQsCisgIFRhc2soc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQsCiAgICAgICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pCiAgICAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksCiAgICAgICBpbnB1dF8oaW5wdXQpLApAQCAtMzIxLDcgKzMyNyw3IEBACiAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXJfKGNvbm5lY3Rpb25fLT5nZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSksCiAgICAgICBjb25uZWN0aW9uQ29udGV4dF8oY29ubmVjdGlvbl8tPmdldENvbm5lY3Rpb25Db250ZXh0KCkpIHt9CiAKLSAgdm9pZCBydW4oKSB7CisgIHZvaWQgcnVuKCkgb3ZlcnJpZGUgewogICAgIHRyeSB7CiAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfKSB7CkBAIC0zMzQsNyArMzQwLDcgQEAKICAgICAgIH0KICAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogY2xpZW50IGRpZWQ6ICVzIiwgdHR4LndoYXQoKSk7Ci0gICAgfSBjYXRjaCAoY29uc3QgYmFkX2FsbG9jJikgeworICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6YmFkX2FsbG9jJikgewogICAgICAgR2xvYmFsT3V0cHV0KCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGNhdWdodCBiYWRfYWxsb2MgZXhjZXB0aW9uLiIpOwogICAgICAgZXhpdCgxKTsKICAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgeCkgewpAQCAtMzQ4LDYgKzM1NCw3IEBACiAgICAgLy8gU2lnbmFsIGNvbXBsZXRpb24gYmFjayB0byB0aGUgbGliZXZlbnQgdGhyZWFkIHZpYSBhIHBpcGUKICAgICBpZiAoIWNvbm5lY3Rpb25fLT5ub3RpZnlJT1RocmVhZCgpKSB7CiAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGZhaWxlZCB0byBub3RpZnlJT1RocmVhZCwgY2xvc2luZy4iKTsKKyAgICAgIGNvbm5lY3Rpb25fLT5zZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CiAgICAgICBjb25uZWN0aW9uXy0+Y2xvc2UoKTsKICAgICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6VGFzazo6cnVuOiBmYWlsZWQgd3JpdGUgb24gbm90aWZ5IHBpcGUiKTsKICAgICB9CkBAIC0zNTYsMjEgKzM2MywxNSBAQAogICBUQ29ubmVjdGlvbiogZ2V0VENvbm5lY3Rpb24oKSB7IHJldHVybiBjb25uZWN0aW9uXzsgfQogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRfOwogICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOwogICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dF87CiB9OwogCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OmluaXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvY2thZGRyKiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tsZW5fdCBhZGRyTGVuKSB7Ci0gIHRTb2NrZXRfLT5zZXRTb2NrZXRGRChzb2NrZXQpOwotICB0U29ja2V0Xy0+c2V0Q2FjaGVkQWRkcmVzcyhhZGRyLCBhZGRyTGVuKTsKLQordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjppbml0KFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCkgewogICBpb1RocmVhZF8gPSBpb1RocmVhZDsKICAgc2VydmVyXyA9IGlvVGhyZWFkLT5nZXRTZXJ2ZXIoKTsKICAgYXBwU3RhdGVfID0gQVBQX0lOSVQ7CkBAIC0zNzksNyArMzgwLDcgQEAKICAgcmVhZEJ1ZmZlclBvc18gPSAwOwogICByZWFkV2FudF8gPSAwOwogCi0gIHdyaXRlQnVmZmVyXyA9IE5VTEw7CisgIHdyaXRlQnVmZmVyXyA9IG51bGxwdHI7CiAgIHdyaXRlQnVmZmVyU2l6ZV8gPSAwOwogICB3cml0ZUJ1ZmZlclBvc18gPSAwOwogICBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA9IDA7CkBAIC0zOTIsMjEgKzM5MywzMSBAQAogICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XyA9IHNlcnZlcl8tPmdldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKS0+Z2V0VHJhbnNwb3J0KG91dHB1dFRyYW5zcG9ydF8pOwogCiAgIC8vIENyZWF0ZSBwcm90b2NvbAotICBpbnB1dFByb3RvY29sXyA9IHNlcnZlcl8tPmdldElucHV0UHJvdG9jb2xGYWN0b3J5KCktPmdldFByb3RvY29sKGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8pOwotICBvdXRwdXRQcm90b2NvbF8gPSBzZXJ2ZXJfLT5nZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoKS0+Z2V0UHJvdG9jb2woZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8pOworICBpZiAoc2VydmVyXy0+Z2V0SGVhZGVyVHJhbnNwb3J0KCkpIHsKKyAgICBpbnB1dFByb3RvY29sXyA9IHNlcnZlcl8tPmdldElucHV0UHJvdG9jb2xGYWN0b3J5KCktPmdldFByb3RvY29sKGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xyk7CisgICAgb3V0cHV0UHJvdG9jb2xfID0gaW5wdXRQcm90b2NvbF87CisgIH0gZWxzZSB7CisgICAgaW5wdXRQcm90b2NvbF8gPSBzZXJ2ZXJfLT5nZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbChmYWN0b3J5SW5wdXRUcmFuc3BvcnRfKTsKKyAgICBvdXRwdXRQcm90b2NvbF8gPSBzZXJ2ZXJfLT5nZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoKS0+Z2V0UHJvdG9jb2woZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8pOworICB9CiAKICAgLy8gU2V0IHVwIGZvciBhbnkgc2VydmVyIGV2ZW50IGhhbmRsZXIKICAgc2VydmVyRXZlbnRIYW5kbGVyXyA9IHNlcnZlcl8tPmdldEV2ZW50SGFuZGxlcigpOwogICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXykgewogICAgIGNvbm5lY3Rpb25Db250ZXh0XyA9IHNlcnZlckV2ZW50SGFuZGxlcl8tPmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXyk7CiAgIH0gZWxzZSB7Ci0gICAgY29ubmVjdGlvbkNvbnRleHRfID0gTlVMTDsKKyAgICBjb25uZWN0aW9uQ29udGV4dF8gPSBudWxscHRyOwogICB9CiAKICAgLy8gR2V0IHRoZSBwcm9jZXNzb3IKICAgcHJvY2Vzc29yXyA9IHNlcnZlcl8tPmdldFByb2Nlc3NvcihpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLCB0U29ja2V0Xyk7CiB9CiAKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6c2V0U29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpIHsKKyAgdFNvY2tldF8gPSBzb2NrZXQ7Cit9CisKIHZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpIHsKICAgaW50IGdvdCA9IDAsIGxlZnQgPSAwLCBzZW50ID0gMDsKICAgdWludDMyX3QgZmV0Y2ggPSAwOwpAQCAtNDMyLDEwICs0NDMsMTQgQEAKICAgICAgIH0KICAgICAgIHJlYWRCdWZmZXJQb3NfICs9IGZldGNoOwogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyIsIHRlLndoYXQoKSk7Ci0gICAgICBjbG9zZSgpOworICAgICAgLy9JbiBOb25ibG9ja2luZyBTU0xTb2NrZXQgc29tZSBvcGVyYXRpb25zIG5lZWQgdG8gYmUgcmV0cmllZCBhZ2Fpbi4KKyAgICAgIC8vQ3VycmVudCBhcHByb2FjaCBpcyBwYXJzaW5nIGV4Y2VwdGlvbiBtZXNzYWdlLCBidXQgYSBiZXR0ZXIgc29sdXRpb24gbmVlZHMgdG8gYmUgaW52ZXN0aWdhdGVkLgorICAgICAgaWYoIXN0cnN0cih0ZS53aGF0KCksICJyZXRyeSIpKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6ICVzIiwgdGUud2hhdCgpKTsKKyAgICAgICAgY2xvc2UoKTsKIAotICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm47CisgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHJlYWRCdWZmZXJQb3NfIDwgc2l6ZW9mKGZyYW1pbmcuc2l6ZSkpIHsKQEAgLTQ2MSw2ICs0NzYsMTggQEAKICAgICB9CiAgICAgLy8gc2l6ZSBrbm93bjsgbm93IGdldCB0aGUgcmVzdCBvZiB0aGUgZnJhbWUKICAgICB0cmFuc2l0aW9uKCk7CisKKyAgICAvLyBJZiB0aGUgc29ja2V0IGhhcyBtb3JlIGRhdGEgdGhhbiB0aGUgZnJhbWUgaGVhZGVyLCBjb250aW51ZSB0byB3b3JrIG9uIGl0LiBUaGlzIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgZm9yCisgICAgLy8gcmVndWxhciBzb2NrZXRzLCBiZWNhdXNlIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSwgbGliZXZlbnQgd2lsbCBmaXJlIHRoZSBldmVudCBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIHJlYWQKKyAgICAvLyByZWFkaW5lc3MsIHdoaWNoIHdpbGwgaW4gdHVybiBjYWxsIHdvcmtTb2NrZXQoKS4gSG93ZXZlciwgc29tZSBzb2NrZXQgdHlwZXMgKHN1Y2ggYXMgVFNTTFNvY2tldCkgbWF5IGhhdmUgdGhlCisgICAgLy8gZGF0YSBzaXR0aW5nIGluIHRoZWlyIGludGVybmFsIGJ1ZmZlcnMgYW5kIGZyb20gbGliZXZlbnQncyBwZXJzcGVjdGl2ZSwgdGhlcmUgaXMgbm8gZnVydGhlciBkYXRhIGF2YWlsYWJsZS4gSW4KKyAgICAvLyB0aGF0IGNhc2UsIG5vdCBoYXZpbmcgdGhpcyB3b3JrU29ja2V0KCkgY2FsbCBoZXJlIHdvdWxkIHJlc3VsdCBpbiBhIGhhbmcgYXMgd2Ugd2lsbCBuZXZlciBnZXQgdG8gd29yayB0aGUgc29ja2V0LAorICAgIC8vIGRlc3BpdGUgaGF2aW5nIG1vcmUgZGF0YS4KKyAgICBpZiAodFNvY2tldF8tPmhhc1BlbmRpbmdEYXRhVG9SZWFkKCkpCisgICAgeworICAgICAgICB3b3JrU29ja2V0KCk7CisgICAgfQorCiAgICAgcmV0dXJuOwogCiAgIGNhc2UgU09DS0VUX1JFQ1Y6CkBAIC00NzIsOCArNDk5LDEyIEBACiAgICAgICBmZXRjaCA9IHJlYWRXYW50XyAtIHJlYWRCdWZmZXJQb3NfOwogICAgICAgZ290ID0gdFNvY2tldF8tPnJlYWQocmVhZEJ1ZmZlcl8gKyByZWFkQnVmZmVyUG9zXywgZmV0Y2gpOwogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyIsIHRlLndoYXQoKSk7Ci0gICAgICBjbG9zZSgpOworICAgICAgLy9JbiBOb25ibG9ja2luZyBTU0xTb2NrZXQgc29tZSBvcGVyYXRpb25zIG5lZWQgdG8gYmUgcmV0cmllZCBhZ2Fpbi4KKyAgICAgIC8vQ3VycmVudCBhcHByb2FjaCBpcyBwYXJzaW5nIGV4Y2VwdGlvbiBtZXNzYWdlLCBidXQgYSBiZXR0ZXIgc29sdXRpb24gbmVlZHMgdG8gYmUgaW52ZXN0aWdhdGVkLgorICAgICAgaWYoIXN0cnN0cih0ZS53aGF0KCksICJyZXRyeSIpKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6ICVzIiwgdGUud2hhdCgpKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgIH0KIAogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTUwMyw3ICs1MzQsNyBAQAogCiAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSB0byBzZW5kLCB0aGVuIGxldCB1cyBtb3ZlIG9uCiAgICAgaWYgKHdyaXRlQnVmZmVyUG9zXyA9PSB3cml0ZUJ1ZmZlclNpemVfKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIldBUk5JTkc6IFNlbmQgc3RhdGUgd2l0aCBubyBkYXRhIHRvIHNlbmRcbiIpOworICAgICAgR2xvYmFsT3V0cHV0KCJXQVJOSU5HOiBTZW5kIHN0YXRlIHdpdGggbm8gZGF0YSB0byBzZW5kIik7CiAgICAgICB0cmFuc2l0aW9uKCk7CiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNTM1LDYgKzU2NiwxMyBAQAogICB9CiB9CiAKK2Jvb2wgVE5vbmJsb2NraW5nU2VydmVyOjpnZXRIZWFkZXJUcmFuc3BvcnQoKSB7CisgIC8vIEN1cnJlbnRseSBpZiB0aGVyZSBpcyBubyBvdXRwdXQgcHJvdG9jb2wgZmFjdG9yeSwKKyAgLy8gd2UgYXNzdW1lIGhlYWRlciB0cmFuc3BvcnQgKHdpdGhvdXQgaGF2aW5nIHRvIGNyZWF0ZQorICAvLyBhIG5ldyB0cmFuc3BvcnQgYW5kIGNoZWNrKQorICByZXR1cm4gZ2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgPT0gbnVsbHB0cjsKK30KKwogLyoqCiAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmFuc2l0aW9ucyBmcm9tIG9uZSBzdGF0ZSBpbnRvCiAgKiBhbm90aGVyLiBUaGlzIG1lYW5zIHRoYXQgaXQgaGFzIGZpbmlzaGVkIHdyaXRpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQKQEAgLTU1MSwxMiArNTg5LDIwIEBACiAgIGNhc2UgQVBQX1JFQURfUkVRVUVTVDoKICAgICAvLyBXZSBhcmUgZG9uZSByZWFkaW5nIHRoZSByZXF1ZXN0LCBwYWNrYWdlIHRoZSByZWFkIGJ1ZmZlciBpbnRvIHRyYW5zcG9ydAogICAgIC8vIGFuZCBnZXQgYmFjayBzb21lIGRhdGEgZnJvbSB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24KLSAgICBpbnB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKHJlYWRCdWZmZXJfLCByZWFkQnVmZmVyUG9zXyk7Ci0gICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIoKTsKLSAgICAvLyBQcmVwZW5kIGZvdXIgYnl0ZXMgb2YgYmxhbmsgc3BhY2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4KLSAgICAvLyB3cml0ZSB0aGUgZnJhbWUgc2l6ZSB0aGVyZSBsYXRlci4KLSAgICBvdXRwdXRUcmFuc3BvcnRfLT5nZXRXcml0ZVB0cig0KTsKLSAgICBvdXRwdXRUcmFuc3BvcnRfLT53cm90ZUJ5dGVzKDQpOworICAgIGlmIChzZXJ2ZXJfLT5nZXRIZWFkZXJUcmFuc3BvcnQoKSkgeworICAgICAgaW5wdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcihyZWFkQnVmZmVyXywgcmVhZEJ1ZmZlclBvc18pOworICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2Ugc2F2ZWQgcm9vbSBmb3IgdGhlIGZyYW1pbmcgc2l6ZSBpbiBjYXNlIGhlYWRlciB0cmFuc3BvcnQgbmVlZGVkIGl0LAorICAgICAgLy8gYnV0IGp1c3Qgc2tpcCBpdCBmb3IgdGhlIG5vbi1oZWFkZXIgY2FzZQorICAgICAgaW5wdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcihyZWFkQnVmZmVyXyArIDQsIHJlYWRCdWZmZXJQb3NfIC0gNCk7CisgICAgICBvdXRwdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcigpOworCisgICAgICAvLyBQcmVwZW5kIGZvdXIgYnl0ZXMgb2YgYmxhbmsgc3BhY2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4KKyAgICAgIC8vIHdyaXRlIHRoZSBmcmFtZSBzaXplIHRoZXJlIGxhdGVyLgorICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+Z2V0V3JpdGVQdHIoNCk7CisgICAgICBvdXRwdXRUcmFuc3BvcnRfLT53cm90ZUJ5dGVzKDQpOworICAgIH0KIAogICAgIHNlcnZlcl8tPmluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKIApAQCAtNTY0LDI2ICs2MTAsMjkgQEAKICAgICAgIC8vIFdlIGFyZSBzZXR0aW5nIHVwIGEgVGFzayB0byBkbyB0aGlzIHdvcmsgYW5kIHdlIHdpbGwgd2FpdCBvbiBpdAogCiAgICAgICAvLyBDcmVhdGUgdGFzayBhbmQgZGlzcGF0Y2ggdG8gdGhlIHRocmVhZCBtYW5hZ2VyCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayA9IGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPigKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayA9IHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4oCiAgICAgICAgICAgbmV3IFRhc2socHJvY2Vzc29yXywgaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgdGhpcykpOwogICAgICAgLy8gVGhlIGFwcGxpY2F0aW9uIGlzIG5vdyB3YWl0aW5nIG9uIHRoZSB0YXNrIHRvIGZpbmlzaAogICAgICAgYXBwU3RhdGVfID0gQVBQX1dBSVRfVEFTSzsKIAorICAgICAgLy8gU2V0IHRoaXMgY29ubmVjdGlvbiBpZGxlIHNvIHRoYXQgbGliZXZlbnQgZG9lc24ndCBwcm9jZXNzIG1vcmUKKyAgICAgIC8vIGRhdGEgb24gaXQgd2hpbGUgd2UncmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHRocmVhZG1hbmFnZXIgdG8KKyAgICAgIC8vIGZpbmlzaCB0aGlzIHRhc2sKKyAgICAgIHNldElkbGUoKTsKKwogICAgICAgdHJ5IHsKICAgICAgICAgc2VydmVyXy0+YWRkVGFzayh0YXNrKTsKICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiYgaXNlKSB7CiAgICAgICAgIC8vIFRoZSBUaHJlYWRNYW5hZ2VyIGlzIG5vdCByZWFkeSB0byBoYW5kbGUgYW55IG1vcmUgdGFza3MgKGl0J3MgcHJvYmFibHkgc2h1dHRpbmcgZG93bikuCiAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjogU2VydmVyOjpwcm9jZXNzKCkgJXMiLCBpc2Uud2hhdCgpKTsKKyAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOwogICAgICAgICBjbG9zZSgpOwogICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mIHRvKSB7CiAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIltFUlJPUl0gVGltZWRPdXRFeGNlcHRpb246IFNlcnZlcjo6cHJvY2VzcygpICVzIiwgdG8ud2hhdCgpKTsKKyAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOwogICAgICAgICBjbG9zZSgpOwogICAgICAgfQogCi0gICAgICAvLyBTZXQgdGhpcyBjb25uZWN0aW9uIGlkbGUgc28gdGhhdCBsaWJldmVudCBkb2Vzbid0IHByb2Nlc3MgbW9yZQotICAgICAgLy8gZGF0YSBvbiBpdCB3aGlsZSB3ZSdyZSBzdGlsbCB3YWl0aW5nIGZvciB0aGUgdGhyZWFkbWFuYWdlciB0bwotICAgICAgLy8gZmluaXNoIHRoaXMgdGFzawotICAgICAgc2V0SWRsZSgpOwogICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSB7CiAgICAgICB0cnkgewpAQCAtNjE0LDYgKzY2Myw3IEBACiAgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICB9CisgICAgLy8gZmFsbHRocm91Z2gKIAogICAvLyBJbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCBoZXJlLCB0aGUgY2FsbCB0byBwcm9jZXNzIGhhcyB3cml0dGVuIGludG8KICAgLy8gdGhlIHdyaXRlQnVmZmVyXwpAQCAtNjM3LDE2ICs2ODcsMTMgQEAKICAgICAgIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9TRU5EOwogCiAgICAgICAvLyBQdXQgdGhlIGZyYW1lIHNpemUgaW50byB0aGUgd3JpdGUgYnVmZmVyCi0gICAgICBpbnQzMl90IGZyYW1lU2l6ZSA9IChpbnQzMl90KWh0b25sKHdyaXRlQnVmZmVyU2l6ZV8gLSA0KTsKKyAgICAgIGF1dG8gZnJhbWVTaXplID0gKGludDMyX3QpaHRvbmwod3JpdGVCdWZmZXJTaXplXyAtIDQpOwogICAgICAgbWVtY3B5KHdyaXRlQnVmZmVyXywgJmZyYW1lU2l6ZSwgNCk7CiAKICAgICAgIC8vIFNvY2tldCBpbnRvIHdyaXRlIG1vZGUKICAgICAgIGFwcFN0YXRlXyA9IEFQUF9TRU5EX1JFU1VMVDsKICAgICAgIHNldFdyaXRlKCk7CiAKLSAgICAgIC8vIFRyeSB0byB3b3JrIHRoZSBzb2NrZXQgaW1tZWRpYXRlbHkKLSAgICAgIC8vIHdvcmtTb2NrZXQoKTsKLQogICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNjY1LDYgKzcxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfLT5nZXRJZGxlV3JpdGVCdWZmZXJMaW1pdCgpKTsKICAgICAgIGNhbGxzRm9yUmVzaXplXyA9IDA7CiAgICAgfQorICAgIC8vIGZhbGx0aHJvdWdoCiAKICAgLy8gTi5CLjogV2UgYWxzbyBpbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCBoZXJlIGludG8gdGhlIElOSVQgc3RhdGUhCiAKQEAgLTY3Miw3ICs3MjAsNyBAQAogICBjYXNlIEFQUF9JTklUOgogCiAgICAgLy8gQ2xlYXIgd3JpdGUgYnVmZmVyIHZhcmlhYmxlcwotICAgIHdyaXRlQnVmZmVyXyA9IE5VTEw7CisgICAgd3JpdGVCdWZmZXJfID0gbnVsbHB0cjsKICAgICB3cml0ZUJ1ZmZlclBvc18gPSAwOwogICAgIHdyaXRlQnVmZmVyU2l6ZV8gPSAwOwogCkBAIC02ODUsMTIgKzczMywxMSBAQAogICAgIC8vIFJlZ2lzdGVyIHJlYWQgZXZlbnQKICAgICBzZXRSZWFkKCk7CiAKLSAgICAvLyBUcnkgdG8gd29yayB0aGUgc29ja2V0IHJpZ2h0IGF3YXkKLSAgICAvLyB3b3JrU29ja2V0KCk7Ci0KICAgICByZXR1cm47CiAKICAgY2FzZSBBUFBfUkVBRF9GUkFNRV9TSVpFOgorICAgIHJlYWRXYW50XyArPSA0OworCiAgICAgLy8gV2UganVzdCByZWFkIHRoZSByZXF1ZXN0IGxlbmd0aAogICAgIC8vIERvdWJsZSB0aGUgYnVmZmVyIHNpemUgdW50aWwgaXQgaXMgYmlnIGVub3VnaAogICAgIGlmIChyZWFkV2FudF8gPiByZWFkQnVmZmVyU2l6ZV8pIHsKQEAgLTcwMiw4ICs3NDksOCBAQAogICAgICAgICBuZXdTaXplICo9IDI7CiAgICAgICB9CiAKLSAgICAgIHVpbnQ4X3QqIG5ld0J1ZmZlciA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MocmVhZEJ1ZmZlcl8sIG5ld1NpemUpOwotICAgICAgaWYgKG5ld0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICBhdXRvKiBuZXdCdWZmZXIgPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHJlYWRCdWZmZXJfLCBuZXdTaXplKTsKKyAgICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgewogICAgICAgICAvLyBub3RoaW5nIGVsc2UgdG8gYmUgZG9uZS4uLgogICAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICAgICAgfQpAQCAtNzExLDE1ICs3NTgsMTMgQEAKICAgICAgIHJlYWRCdWZmZXJTaXplXyA9IG5ld1NpemU7CiAgICAgfQogCi0gICAgcmVhZEJ1ZmZlclBvc18gPSAwOworICAgIHJlYWRCdWZmZXJQb3NfID0gNDsKKyAgICAqKCh1aW50MzJfdCopcmVhZEJ1ZmZlcl8pID0gaHRvbmwocmVhZFdhbnRfIC0gNCk7CiAKICAgICAvLyBNb3ZlIGludG8gcmVhZCByZXF1ZXN0IHN0YXRlCiAgICAgc29ja2V0U3RhdGVfID0gU09DS0VUX1JFQ1Y7CiAgICAgYXBwU3RhdGVfID0gQVBQX1JFQURfUkVRVUVTVDsKIAotICAgIC8vIFdvcmsgdGhlIHNvY2tldCByaWdodCBhd2F5Ci0gICAgLy8gd29ya1NvY2tldCgpOwotCiAgICAgcmV0dXJuOwogCiAgIGNhc2UgQVBQX0NMT1NFX0NPTk5FQ1RJT046CkBAIC03NDAsMTEgKzc4NSw5IEBACiAgIH0KIAogICAvLyBEZWxldGUgYSBwcmV2aW91c2x5IGV4aXN0aW5nIGV2ZW50Ci0gIGlmIChldmVudEZsYWdzXyAhPSAwKSB7Ci0gICAgaWYgKGV2ZW50X2RlbCgmZXZlbnRfKSA9PSAtMSkgewotICAgICAgR2xvYmFsT3V0cHV0KCJUQ29ubmVjdGlvbjo6c2V0RmxhZ3MgZXZlbnRfZGVsIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQorICBpZiAoZXZlbnRGbGFnc18gJiYgZXZlbnRfZGVsKCZldmVudF8pID09IC0xKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVENvbm5lY3Rpb246OnNldEZsYWdzKCkgZXZlbnRfZGVsIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIHJldHVybjsKICAgfQogCiAgIC8vIFVwZGF0ZSBpbiBtZW1vcnkgc3RydWN0dXJlCkBAIC03ODYsOCArODI5LDggQEAKICAgZXZlbnRfYmFzZV9zZXQoaW9UaHJlYWRfLT5nZXRFdmVudEJhc2UoKSwgJmV2ZW50Xyk7CiAKICAgLy8gQWRkIHRoZSBldmVudAotICBpZiAoZXZlbnRfYWRkKCZldmVudF8sIDApID09IC0xKSB7Ci0gICAgR2xvYmFsT3V0cHV0KCJUQ29ubmVjdGlvbjo6c2V0RmxhZ3MoKTogY291bGQgbm90IGV2ZW50X2FkZCIpOworICBpZiAoZXZlbnRfYWRkKCZldmVudF8sIG51bGxwdHIpID09IC0xKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVENvbm5lY3Rpb246OnNldEZsYWdzKCk6IGNvdWxkIG5vdCBldmVudF9hZGQiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CiAgIH0KIH0KIApAQCAtNzk1LDE1ICs4MzgsMTIgQEAKICAqIENsb3NlcyBhIGNvbm5lY3Rpb24KICAqLwogdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpjbG9zZSgpIHsKLSAgLy8gRGVsZXRlIHRoZSByZWdpc3RlcmVkIGxpYmV2ZW50Ci0gIGlmIChldmVudF9kZWwoJmV2ZW50XykgPT0gLTEpIHsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUQ29ubmVjdGlvbjo6Y2xvc2UoKSBldmVudF9kZWwiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7Ci0gIH0KKyAgc2V0SWRsZSgpOwogCiAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfKSB7CiAgICAgc2VydmVyRXZlbnRIYW5kbGVyXy0+ZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dF8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOwogICB9Ci0gIGlvVGhyZWFkXyA9IE5VTEw7CisgIGlvVGhyZWFkXyA9IG51bGxwdHI7CiAKICAgLy8gQ2xvc2UgdGhlIHNvY2tldAogICB0U29ja2V0Xy0+Y2xvc2UoKTsKQEAgLTgyMiw3ICs4NjIsNyBAQAogdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpjaGVja0lkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgcmVhZExpbWl0LCBzaXplX3Qgd3JpdGVMaW1pdCkgewogICBpZiAocmVhZExpbWl0ID4gMCAmJiByZWFkQnVmZmVyU2l6ZV8gPiByZWFkTGltaXQpIHsKICAgICBmcmVlKHJlYWRCdWZmZXJfKTsKLSAgICByZWFkQnVmZmVyXyA9IE5VTEw7CisgICAgcmVhZEJ1ZmZlcl8gPSBudWxscHRyOwogICAgIHJlYWRCdWZmZXJTaXplXyA9IDA7CiAgIH0KIApAQCAtODQ4LDkgKzg4OCw5IEBACiAgIC8vIG9iamVjdHMgYW5kIHRoZSBUaHJlYWQgb2JqZWN0cyBoYXZlIHNoYXJlZF9wdHJzIHRvIHRoZSBUTm9uYmxvY2tpbmdJT1RocmVhZAogICAvLyBvYmplY3RzIChhcyBydW5uYWJsZSkgc28gdGhlc2Ugb2JqZWN0cyB3aWxsIG5ldmVyIGRlYWxsb2NhdGUgd2l0aG91dCBoZWxwLgogICB3aGlsZSAoIWlvVGhyZWFkc18uZW1wdHkoKSkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ0lPVGhyZWFkPiBpb3QgPSBpb1RocmVhZHNfLmJhY2soKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nSU9UaHJlYWQ+IGlvdCA9IGlvVGhyZWFkc18uYmFjaygpOwogICAgIGlvVGhyZWFkc18ucG9wX2JhY2soKTsKLSAgICBpb3QtPnNldFRocmVhZChib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+KCkpOworICAgIGlvdC0+c2V0VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+KCkpOwogICB9CiB9CiAKQEAgLTg1OCw5ICs4OTgsNyBAQAogICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGVpdGhlciBieSByZXVzaW5nIGFuIG9iamVjdCBvZmYgdGhlIHN0YWNrIG9yCiAgKiBieSBhbGxvY2F0aW5nIGEgbmV3IG9uZSBlbnRpcmVseQogICovCi1UTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZUNvbm5lY3Rpb24oVEhSSUZUX1NPQ0tFVCBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29ja2FkZHIqIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2xlbl90IGFkZHJMZW4pIHsKK1ROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24qIFROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlQ29ubmVjdGlvbihzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KSB7CiAgIC8vIENoZWNrIHRoZSBzdGFjawogICBHdWFyZCBnKGNvbm5NdXRleF8pOwogCkBAIC04NzIsMTQgKzkxMCwxNSBAQAogICBUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQgPSBpb1RocmVhZHNfW3NlbGVjdGVkVGhyZWFkSWR4XS5nZXQoKTsKIAogICAvLyBDaGVjayB0aGUgY29ubmVjdGlvbiBzdGFjayB0byBzZWUgaWYgd2UgY2FuIHJlLXVzZQotICBUQ29ubmVjdGlvbiogcmVzdWx0ID0gTlVMTDsKKyAgVENvbm5lY3Rpb24qIHJlc3VsdCA9IG51bGxwdHI7CiAgIGlmIChjb25uZWN0aW9uU3RhY2tfLmVtcHR5KCkpIHsKLSAgICByZXN1bHQgPSBuZXcgVENvbm5lY3Rpb24oc29ja2V0LCBpb1RocmVhZCwgYWRkciwgYWRkckxlbik7CisgICAgcmVzdWx0ID0gbmV3IFRDb25uZWN0aW9uKHNvY2tldCwgaW9UaHJlYWQpOwogICAgICsrbnVtVENvbm5lY3Rpb25zXzsKICAgfSBlbHNlIHsKICAgICByZXN1bHQgPSBjb25uZWN0aW9uU3RhY2tfLnRvcCgpOwogICAgIGNvbm5lY3Rpb25TdGFja18ucG9wKCk7Ci0gICAgcmVzdWx0LT5pbml0KHNvY2tldCwgaW9UaHJlYWQsIGFkZHIsIGFkZHJMZW4pOworICAgIHJlc3VsdC0+c2V0U29ja2V0KHNvY2tldCk7CisgICAgcmVzdWx0LT5pbml0KGlvVGhyZWFkKTsKICAgfQogICBhY3RpdmVDb25uZWN0aW9uc18ucHVzaF9iYWNrKHJlc3VsdCk7CiAgIHJldHVybiByZXN1bHQ7CkBAIC05MTQsNTMgKzk1MywzNSBAQAogICAvLyBNYWtlIHN1cmUgdGhhdCBsaWJldmVudCBkaWRuJ3QgbWVzcyB1cCB0aGUgc29ja2V0IGhhbmRsZXMKICAgYXNzZXJ0KGZkID09IHNlcnZlclNvY2tldF8pOwogCi0gIC8vIFNlcnZlciBzb2NrZXQgYWNjZXB0ZWQgYSBuZXcgY29ubmVjdGlvbgotICBzb2NrbGVuX3QgYWRkckxlbjsKLSAgc29ja2FkZHJfc3RvcmFnZSBhZGRyU3RvcmFnZTsKLSAgc29ja2FkZHIqIGFkZHJwID0gKHNvY2thZGRyKikmYWRkclN0b3JhZ2U7Ci0gIGFkZHJMZW4gPSBzaXplb2YoYWRkclN0b3JhZ2UpOwotCiAgIC8vIEdvaW5nIHRvIGFjY2VwdCBhIG5ldyBjbGllbnQgc29ja2V0Ci0gIFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0OworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY2xpZW50U29ja2V0OwogCi0gIC8vIEFjY2VwdCBhcyBtYW55IG5ldyBjbGllbnRzIGFzIHBvc3NpYmxlLCBldmVuIHRob3VnaCBsaWJldmVudCBzaWduYWxlZCBvbmx5Ci0gIC8vIG9uZSwgdGhpcyBoZWxwcyB1cyB0byBhdm9pZCBoYXZpbmcgdG8gZ28gYmFjayBpbnRvIHRoZSBsaWJldmVudCBlbmdpbmUgc28KLSAgLy8gbWFueSB0aW1lcwotICB3aGlsZSAoKGNsaWVudFNvY2tldCA9IDo6YWNjZXB0KGZkLCBhZGRycCwgJmFkZHJMZW4pKSAhPSAtMSkgeworICBjbGllbnRTb2NrZXQgPSBzZXJ2ZXJUcmFuc3BvcnRfLT5hY2NlcHQoKTsKKyAgaWYgKGNsaWVudFNvY2tldCkgewogICAgIC8vIElmIHdlJ3JlIG92ZXJsb2FkZWQsIHRha2UgYWN0aW9uIGhlcmUKICAgICBpZiAob3ZlcmxvYWRBY3Rpb25fICE9IFRfT1ZFUkxPQURfTk9fQUNUSU9OICYmIHNlcnZlck92ZXJsb2FkZWQoKSkgewogICAgICAgR3VhcmQgZyhjb25uTXV0ZXhfKTsKICAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfKys7CiAgICAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKys7CiAgICAgICBpZiAob3ZlcmxvYWRBY3Rpb25fID09IFRfT1ZFUkxPQURfQ0xPU0VfT05fQUNDRVBUKSB7Ci0gICAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgICAgIGNsaWVudFNvY2tldC0+Y2xvc2UoKTsKICAgICAgICAgcmV0dXJuOwogICAgICAgfSBlbHNlIGlmIChvdmVybG9hZEFjdGlvbl8gPT0gVF9PVkVSTE9BRF9EUkFJTl9UQVNLX1FVRVVFKSB7CiAgICAgICAgIGlmICghZHJhaW5QZW5kaW5nVGFzaygpKSB7CiAgICAgICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIGRpc2NhcmQsIHNvIHdlIGRyb3AgY29ubmVjdGlvbiBpbnN0ZWFkLgotICAgICAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgICAgICAgY2xpZW50U29ja2V0LT5jbG9zZSgpOwogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KIAotICAgIC8vIEV4cGxpY2l0bHkgc2V0IHRoaXMgc29ja2V0IHRvIE5PTkJMT0NLIG1vZGUKLSAgICBpbnQgZmxhZ3M7Ci0gICAgaWYgKChmbGFncyA9IFRIUklGVF9GQ05UTChjbGllbnRTb2NrZXQsIFRIUklGVF9GX0dFVEZMLCAwKSkgPCAwCi0gICAgICAgIHx8IFRIUklGVF9GQ05UTChjbGllbnRTb2NrZXQsIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSA8IDApIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoInRocmlmdFNlcnZlckV2ZW50SGFuZGxlcjogc2V0IFRIUklGVF9PX05PTkJMT0NLIChUSFJJRlRfRkNOVEwpICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKLSAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgLy8gQ3JlYXRlIGEgbmV3IFRDb25uZWN0aW9uIGZvciB0aGlzIGNsaWVudCBzb2NrZXQuCi0gICAgVENvbm5lY3Rpb24qIGNsaWVudENvbm5lY3Rpb24gPSBjcmVhdGVDb25uZWN0aW9uKGNsaWVudFNvY2tldCwgYWRkcnAsIGFkZHJMZW4pOworICAgIFRDb25uZWN0aW9uKiBjbGllbnRDb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbihjbGllbnRTb2NrZXQpOwogCiAgICAgLy8gRmFpbCBmYXN0IGlmIHdlIGNvdWxkIG5vdCBjcmVhdGUgYSBUQ29ubmVjdGlvbiBvYmplY3QKLSAgICBpZiAoY2xpZW50Q29ubmVjdGlvbiA9PSBOVUxMKSB7CisgICAgaWYgKGNsaWVudENvbm5lY3Rpb24gPT0gbnVsbHB0cikgewogICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigidGhyaWZ0U2VydmVyRXZlbnRIYW5kbGVyOiBmYWlsZWQgVENvbm5lY3Rpb24gZmFjdG9yeSIpOwotICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoY2xpZW50U29ja2V0KTsKKyAgICAgIGNsaWVudFNvY2tldC0+Y2xvc2UoKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTk4MSwxOCArMTAwMiw5IEBACiAgICAgfSBlbHNlIHsKICAgICAgIGlmICghY2xpZW50Q29ubmVjdGlvbi0+bm90aWZ5SU9UaHJlYWQoKSkgewogICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJbRVJST1JdIG5vdGlmeUlPVGhyZWFkIGZhaWxlZCBvbiBmcmVzaCBjb25uZWN0aW9uLCBjbG9zaW5nIiwgZXJybm8pOwotICAgICAgICByZXR1cm5Db25uZWN0aW9uKGNsaWVudENvbm5lY3Rpb24pOworICAgICAgICBjbGllbnRDb25uZWN0aW9uLT5jbG9zZSgpOwogICAgICAgfQogICAgIH0KLQotICAgIC8vIGFkZHJMZW4gaXMgd3JpdHRlbiBieSB0aGUgYWNjZXB0KCkgY2FsbCwgc28gbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSB0aGUgbmV4dCBjYWxsLgotICAgIGFkZHJMZW4gPSBzaXplb2YoYWRkclN0b3JhZ2UpOwotICB9Ci0KLSAgLy8gRG9uZSBsb29waW5nIGFjY2VwdCwgbm93IHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoZSBlcnJvciBpcyBkdWUgdG8KLSAgLy8gYmxvY2tpbmcuIEFueSBvdGhlciBlcnJvciBpcyBhIHByb2JsZW0KLSAgaWYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SICE9IFRIUklGVF9FQUdBSU4gJiYgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgIT0gVEhSSUZUX0VXT1VMREJMT0NLKSB7Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigidGhyaWZ0U2VydmVyRXZlbnRIYW5kbGVyOiBhY2NlcHQoKSAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CiAgIH0KIH0KIApAQCAtMTAwMCwxMjggKzEwMTIsMTggQEAKICAqIENyZWF0ZXMgYSBzb2NrZXQgdG8gbGlzdGVuIG9uIGFuZCBiaW5kcyBpdCB0byB0aGUgbG9jYWwgcG9ydC4KICAqLwogdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZUFuZExpc3Rlbk9uU29ja2V0KCkgewotICBUSFJJRlRfU09DS0VUIHM7Ci0KLSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzMDsKLSAgaW50IGVycm9yOwotCi0gIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM2IikgKyAxXTsKLSAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0gIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKLSAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLSAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFIHwgQUlfQUREUkNPTkZJRzsKLSAgc3ByaW50Zihwb3J0LCAiJWQiLCBwb3J0Xyk7Ci0KLSAgLy8gV2lsZGNhcmQgYWRkcmVzcwotICBlcnJvciA9IGdldGFkZHJpbmZvKE5VTEwsIHBvcnQsICZoaW50cywgJnJlczApOwotICBpZiAoZXJyb3IpIHsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgZ2V0YWRkcmluZm8gIgotICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmcoVEhSSUZUX0dBSV9TVFJFUlJPUihlcnJvcikpKTsKLSAgfQotCi0gIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCi0gIC8vIGludG8gaXB2NiBzcGFjZS4KLSAgZm9yIChyZXMgPSByZXMwOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgewotICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gTlVMTCkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLy8gQ3JlYXRlIHRoZSBzZXJ2ZXIgc29ja2V0Ci0gIHMgPSBzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOwotICBpZiAocyA9PSAtMSkgewotICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgc29ja2V0KCkgLTEiKTsKLSAgfQotCi0jaWZkZWYgSVBWNl9WNk9OTFkKLSAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0gICAgaW50IHplcm8gPSAwOwotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksIGNvbnN0X2Nhc3Rfc29ja29wdCgmemVybyksIHNpemVvZih6ZXJvKSkpIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgSVBWNl9WNk9OTFkiKTsKLSAgICB9Ci0gIH0KLSNlbmRpZiAvLyAjaWZkZWYgSVBWNl9WNk9OTFkKLQotICBpbnQgb25lID0gMTsKLQotICAvLyBTZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIHRvIGF2b2lkIDJNU0wgZGVsYXkgb24gc2VydmVyIHJlc3RhcnQKLSAgc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcsIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpOwotCi0gIGlmICg6OmJpbmQocywgcmVzLT5haV9hZGRyLCBzdGF0aWNfY2FzdDxpbnQ+KHJlcy0+YWlfYWRkcmxlbikpID09IC0xKSB7Ci0gICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQocyk7Ci0gICAgZnJlZWFkZHJpbmZvKHJlczApOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIGJpbmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwotICB9Ci0KLSAgLy8gRG9uZSB3aXRoIHRoZSBhZGRyIGluZm8KLSAgZnJlZWFkZHJpbmZvKHJlczApOwotCi0gIC8vIFNldCB1cCB0aGlzIGZpbGUgZGVzY3JpcHRvciBmb3IgbGlzdGVuaW5nCi0gIGxpc3RlblNvY2tldChzKTsKKyAgc2VydmVyVHJhbnNwb3J0Xy0+bGlzdGVuKCk7CisgIHNlcnZlclNvY2tldF8gPSBzZXJ2ZXJUcmFuc3BvcnRfLT5nZXRTb2NrZXRGRCgpOwogfQogCi0vKioKLSAqIFRha2VzIGEgc29ja2V0IGNyZWF0ZWQgYnkgbGlzdGVuU29ja2V0KCkgYW5kIHNldHMgdmFyaW91cyBvcHRpb25zIG9uIGl0Ci0gKiB0byBwcmVwYXJlIGZvciB1c2UgaW4gdGhlIHNlcnZlci4KLSAqLwotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6Omxpc3RlblNvY2tldChUSFJJRlRfU09DS0VUIHMpIHsKLSAgLy8gU2V0IHNvY2tldCB0byBub25ibG9ja2luZyBtb2RlCi0gIGludCBmbGFnczsKLSAgaWYgKChmbGFncyA9IFRIUklGVF9GQ05UTChzLCBUSFJJRlRfRl9HRVRGTCwgMCkpIDwgMAotICAgICAgfHwgVEhSSUZUX0ZDTlRMKHMsIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSA8IDApIHsKLSAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgVEhSSUZUX09fTk9OQkxPQ0siKTsKLSAgfQogCi0gIGludCBvbmUgPSAxOwotICBzdHJ1Y3QgbGluZ2VyIGxpbmcgPSB7MCwgMH07Ci0KLSAgLy8gS2VlcGFsaXZlIHRvIGVuc3VyZSBmdWxsIHJlc3VsdCBmbHVzaGluZwotICBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgY29uc3RfY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSk7Ci0KLSAgLy8gVHVybiBsaW5nZXIgb2ZmIHRvIGF2b2lkIGh1bmcgc29ja2V0cwotICBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgY29uc3RfY2FzdF9zb2Nrb3B0KCZsaW5nKSwgc2l6ZW9mKGxpbmcpKTsKLQotLy8gU2V0IFRDUCBub2RlbGF5IGlmIGF2YWlsYWJsZSwgTUFDIE9TIFggSGFjawotLy8gU2VlIGh0dHA6Ly9saXN0cy5kYW5nYS5jb20vcGlwZXJtYWlsL21lbWNhY2hlZC8yMDA1LU1hcmNoLzAwMTI0MC5odG1sCi0jaWZuZGVmIFRDUF9OT1BVU0gKLSAgc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpOwotI2VuZGlmCi0KLSNpZmRlZiBUQ1BfTE9XX01JTl9SVE8KLSAgaWYgKFRTb2NrZXQ6OmdldFVzZUxvd01pblJ0bygpKSB7Ci0gICAgc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX0xPV19NSU5fUlRPLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKTsKLSAgfQotI2VuZGlmCi0KLSAgaWYgKGxpc3RlbihzLCBMSVNURU5fQkFDS0xPRykgPT0gLTEpIHsKLSAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgbGlzdGVuIik7Ci0gIH0KLQotICAvLyBDb29sLCB0aGlzIHNvY2tldCBpcyBnb29kIHRvIGdvLCBzZXQgaXQgYXMgdGhlIHNlcnZlclNvY2tldF8KLSAgc2VydmVyU29ja2V0XyA9IHM7Ci0KLSAgaWYgKCFwb3J0XykgewotICAgIHNvY2thZGRyX2luIGFkZHI7Ci0gICAgc29ja2xlbl90IHNpemUgPSBzaXplb2YoYWRkcik7Ci0gICAgaWYgKCFnZXRzb2NrbmFtZShzZXJ2ZXJTb2NrZXRfLCByZWludGVycHJldF9jYXN0PHNvY2thZGRyKj4oJmFkZHIpLCAmc2l6ZSkpIHsKLSAgICAgIGxpc3RlblBvcnRfID0gbnRvaHMoYWRkci5zaW5fcG9ydCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZzogZmFpbGVkIHRvIGdldCBsaXN0ZW4gcG9ydDogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c2V0VGhyZWFkTWFuYWdlcihib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKSB7Cit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c2V0VGhyZWFkTWFuYWdlcihzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcikgewogICB0aHJlYWRNYW5hZ2VyXyA9IHRocmVhZE1hbmFnZXI7CiAgIGlmICh0aHJlYWRNYW5hZ2VyKSB7CiAgICAgdGhyZWFkTWFuYWdlci0+c2V0RXhwaXJlQ2FsbGJhY2soCi0gICAgICAgIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQoJlROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2UsCisgICAgICAgIHN0ZDo6YmluZCgmVE5vbmJsb2NraW5nU2VydmVyOjpleHBpcmVDbG9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKICAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18gPSB0cnVlOwogICB9IGVsc2UgewogICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyA9IGZhbHNlOwpAQCAtMTE1Myw3ICsxMDU1LDcgQEAKIAogYm9vbCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmRyYWluUGVuZGluZ1Rhc2soKSB7CiAgIGlmICh0aHJlYWRNYW5hZ2VyXykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrID0gdGhyZWFkTWFuYWdlcl8tPnJlbW92ZU5leHRQZW5kaW5nKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrID0gdGhyZWFkTWFuYWdlcl8tPnJlbW92ZU5leHRQZW5kaW5nKCk7CiAgICAgaWYgKHRhc2spIHsKICAgICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKICAgICAgIGFzc2VydChjb25uZWN0aW9uICYmIGNvbm5lY3Rpb24tPmdldFNlcnZlcigpICYmIGNvbm5lY3Rpb24tPmdldFN0YXRlKCkgPT0gQVBQX1dBSVRfVEFTSyk7CkBAIC0xMTY0LDE5ICsxMDY2LDE2IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmV4cGlyZUNsb3NlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7Cit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2Uoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CiAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKICAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKICAgY29ubmVjdGlvbi0+Zm9yY2VDbG9zZSgpOwogfQogCiB2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c3RvcCgpIHsKLSAgaWYgKCFwb3J0XykgewotICAgIGxpc3RlblBvcnRfID0gMDsKLSAgfQogICAvLyBCcmVha3MgdGhlIGV2ZW50IGxvb3AgaW4gYWxsIHRocmVhZHMgc28gdGhhdCB0aGV5IGVuZCBBU0FQLgotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW9UaHJlYWRzXy5zaXplKCk7ICsraSkgewotICAgIGlvVGhyZWFkc19baV0tPnN0b3AoKTsKKyAgZm9yIChhdXRvICYgaW9UaHJlYWQgOiBpb1RocmVhZHNfKSB7CisgICAgaW9UaHJlYWQtPnN0b3AoKTsKICAgfQogfQogCkBAIC0xMjE0LDE4ICsxMTEzLDEyIEBACiAgIGFzc2VydChpb1RocmVhZHNfLnNpemUoKSA9PSBudW1JT1RocmVhZHNfKTsKICAgYXNzZXJ0KGlvVGhyZWFkc18uc2l6ZSgpID4gMCk7CiAKLSAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBTZXJ2aW5nIG9uIHBvcnQgJWQsICVkIGlvIHRocmVhZHMuIiwKLSAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5Qb3J0XywKKyAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBTZXJ2aW5nIHdpdGggJWQgaW8gdGhyZWFkcy4iLAogICAgICAgICAgICAgICAgICAgICAgIGlvVGhyZWFkc18uc2l6ZSgpKTsKIAogICAvLyBMYXVuY2ggYWxsIHRoZSBzZWNvbmRhcnkgSU8gdGhyZWFkcyBpbiBzZXBhcmF0ZSB0aHJlYWRzCiAgIGlmIChpb1RocmVhZHNfLnNpemUoKSA+IDEpIHsKLSAgICBpb1RocmVhZEZhY3RvcnlfLnJlc2V0KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoCi0jaWYgIVVTRV9CT09TVF9USFJFQUQgJiYgIVVTRV9TVERfVEhSRUFECi0gICAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6T1RIRVIsICAvLyBzY2hlZHVsZXIKLSAgICAgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpOT1JNQUwsIC8vIHByaW9yaXR5Ci0gICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBzaXplIChNQikKLSNlbmRpZgorICAgIGlvVGhyZWFkRmFjdG9yeV8ucmVzZXQobmV3IFRocmVhZEZhY3RvcnkoCiAgICAgICAgIGZhbHNlIC8vIGRldGFjaGVkCiAgICAgICAgICkpOwogCkBAIC0xMjUwLDcgKzExNDMsNyBAQAogdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgewogCiAgIGlmIChpb1RocmVhZHNfLmVtcHR5KCkpCi0gICAgcmVnaXN0ZXJFdmVudHMoTlVMTCk7CisgICAgcmVnaXN0ZXJFdmVudHMobnVsbHB0cik7CiAKICAgLy8gUnVuIHRoZSBwcmltYXJ5IChsaXN0ZW5lcikgSU8gdGhyZWFkIGxvb3AgaW4gb3VyIG1haW4gdGhyZWFkOyB0aGlzIHdpbGwKICAgLy8gb25seSByZXR1cm4gd2hlbiB0aGUgc2VydmVyIGlzIHNodXR0aW5nIGRvd24uCkBAIC0xMjY5LDEwICsxMTYyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VIaWdoUHJpb3JpdHkpCiAgIDogc2VydmVyXyhzZXJ2ZXIpLAogICAgIG51bWJlcl8obnVtYmVyKSwKKyAgICB0aHJlYWRJZF97fSwKICAgICBsaXN0ZW5Tb2NrZXRfKGxpc3RlblNvY2tldCksCiAgICAgdXNlSGlnaFByaW9yaXR5Xyh1c2VIaWdoUHJpb3JpdHkpLAotICAgIGV2ZW50QmFzZV8oTlVMTCksCi0gICAgb3duRXZlbnRCYXNlXyhmYWxzZSkgeworICAgIGV2ZW50QmFzZV8obnVsbHB0ciksCisgICAgb3duRXZlbnRCYXNlXyhmYWxzZSksCisgICAgc2VydmVyRXZlbnRfe30sCisgICAgbm90aWZpY2F0aW9uRXZlbnRfe30gewogICBub3RpZmljYXRpb25QaXBlRkRzX1swXSA9IC0xOwogICBub3RpZmljYXRpb25QaXBlRkRzX1sxXSA9IC0xOwogfQpAQCAtMTI4NiwyMCArMTE4MiwyMCBAQAogICAgIG93bkV2ZW50QmFzZV8gPSBmYWxzZTsKICAgfQogCi0gIGlmIChsaXN0ZW5Tb2NrZXRfID49IDApIHsKKyAgaWYgKGxpc3RlblNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CiAgICAgaWYgKDAgIT0gOjpUSFJJRlRfQ0xPU0VTT0NLRVQobGlzdGVuU29ja2V0XykpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ0lPVGhyZWFkIGxpc3RlblNvY2tldF8gY2xvc2UoKTogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwogICAgIH0KICAgICBsaXN0ZW5Tb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOwogICB9CiAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBpZiAobm90aWZpY2F0aW9uUGlwZUZEc19baV0gPj0gMCkgewotICAgICAgaWYgKDAgIT0gOjpUSFJJRlRfQ0xPU0VTT0NLRVQobm90aWZpY2F0aW9uUGlwZUZEc19baV0pKSB7CisgIGZvciAoYXV0byBub3RpZmljYXRpb25QaXBlRkQgOiBub3RpZmljYXRpb25QaXBlRkRzXykgeworICAgIGlmIChub3RpZmljYXRpb25QaXBlRkQgPj0gMCkgeworICAgICAgaWYgKDAgIT0gOjpUSFJJRlRfQ0xPU0VTT0NLRVQobm90aWZpY2F0aW9uUGlwZUZEKSkgewogICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdJT1RocmVhZCBub3RpZmljYXRpb25QaXBlIGNsb3NlKCk6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwogICAgICAgfQotICAgICAgbm90aWZpY2F0aW9uUGlwZUZEc19baV0gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgICAgICBub3RpZmljYXRpb25QaXBlRkQgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CiAgICAgfQogICB9CiB9CkBAIC0xMzE1LDEzICsxMjExLDEzIEBACiAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQobm90aWZpY2F0aW9uUGlwZUZEc19bMV0pOwogICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpIFRIUklGVF9PX05PTkJMT0NLIik7CiAgIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgZm9yIChhdXRvIG5vdGlmaWNhdGlvblBpcGVGRCA6IG5vdGlmaWNhdGlvblBpcGVGRHNfKSB7CiAjaWYgTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPCAweDAyMDAwMDAwCiAgICAgaW50IGZsYWdzOwotICAgIGlmICgoZmxhZ3MgPSBUSFJJRlRfRkNOVEwobm90aWZpY2F0aW9uUGlwZUZEc19baV0sIEZfR0VURkQsIDApKSA8IDAKLSAgICAgICAgfHwgVEhSSUZUX0ZDTlRMKG5vdGlmaWNhdGlvblBpcGVGRHNfW2ldLCBGX1NFVEZELCBmbGFncyB8IEZEX0NMT0VYRUMpIDwgMCkgeworICAgIGlmICgoZmxhZ3MgPSBUSFJJRlRfRkNOVEwobm90aWZpY2F0aW9uUGlwZUZELCBGX0dFVEZELCAwKSkgPCAwCisgICAgICAgIHx8IFRIUklGVF9GQ05UTChub3RpZmljYXRpb25QaXBlRkQsIEZfU0VURkQsIGZsYWdzIHwgRkRfQ0xPRVhFQykgPCAwKSB7CiAjZWxzZQotICAgIGlmIChldnV0aWxfbWFrZV9zb2NrZXRfY2xvc2VvbmV4ZWMobm90aWZpY2F0aW9uUGlwZUZEc19baV0pIDwgMCkgeworICAgIGlmIChldnV0aWxfbWFrZV9zb2NrZXRfY2xvc2VvbmV4ZWMobm90aWZpY2F0aW9uUGlwZUZEKSA8IDApIHsKICNlbmRpZgogICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQobm90aWZpY2F0aW9uUGlwZUZEc19bMF0pOwogICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQobm90aWZpY2F0aW9uUGlwZUZEc19bMV0pOwpAQCAtMTMzOCw5ICsxMjM0LDkgQEAKIHZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OnJlZ2lzdGVyRXZlbnRzKCkgewogICB0aHJlYWRJZF8gPSBUaHJlYWQ6OmdldF9jdXJyZW50KCk7CiAKLSAgYXNzZXJ0KGV2ZW50QmFzZV8gPT0gMCk7CisgIGFzc2VydChldmVudEJhc2VfID09IG51bGxwdHIpOwogICBldmVudEJhc2VfID0gZ2V0U2VydmVyKCktPmdldFVzZXJFdmVudEJhc2UoKTsKLSAgaWYgKGV2ZW50QmFzZV8gPT0gTlVMTCkgeworICBpZiAoZXZlbnRCYXNlXyA9PSBudWxscHRyKSB7CiAgICAgZXZlbnRCYXNlXyA9IGV2ZW50X2Jhc2VfbmV3KCk7CiAgICAgb3duRXZlbnRCYXNlXyA9IHRydWU7CiAgIH0KQEAgLTEzNTIsNyArMTI0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9iYXNlX2dldF9tZXRob2QoZXZlbnRCYXNlXykpOwogICB9CiAKLSAgaWYgKGxpc3RlblNvY2tldF8gPj0gMCkgeworICBpZiAobGlzdGVuU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKICAgICAvLyBSZWdpc3RlciB0aGUgc2VydmVyIGV2ZW50CiAgICAgZXZlbnRfc2V0KCZzZXJ2ZXJFdmVudF8sCiAgICAgICAgICAgICAgIGxpc3RlblNvY2tldF8sCkBAIC0xMzYyLDcgKzEyNTgsNyBAQAogICAgIGV2ZW50X2Jhc2Vfc2V0KGV2ZW50QmFzZV8sICZzZXJ2ZXJFdmVudF8pOwogCiAgICAgLy8gQWRkIHRoZSBldmVudCBhbmQgc3RhcnQgdXAgdGhlIHNlcnZlcgotICAgIGlmICgtMSA9PSBldmVudF9hZGQoJnNlcnZlckV2ZW50XywgMCkpIHsKKyAgICBpZiAoLTEgPT0gZXZlbnRfYWRkKCZzZXJ2ZXJFdmVudF8sIG51bGxwdHIpKSB7CiAgICAgICB0aHJvdyBURXhjZXB0aW9uKAogICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCk6ICIKICAgICAgICAgICAiZXZlbnRfYWRkKCkgZmFpbGVkIG9uIHNlcnZlciBsaXN0ZW4gZXZlbnQiKTsKQEAgLTEzODMsNyArMTI3OSw3IEBACiAgIGV2ZW50X2Jhc2Vfc2V0KGV2ZW50QmFzZV8sICZub3RpZmljYXRpb25FdmVudF8pOwogCiAgIC8vIEFkZCB0aGUgZXZlbnQgYW5kIHN0YXJ0IHVwIHRoZSBzZXJ2ZXIKLSAgaWYgKC0xID09IGV2ZW50X2FkZCgmbm90aWZpY2F0aW9uRXZlbnRfLCAwKSkgeworICBpZiAoLTEgPT0gZXZlbnRfYWRkKCZub3RpZmljYXRpb25FdmVudF8sIG51bGxwdHIpKSB7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbigKICAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKTogIgogICAgICAgICAiZXZlbnRfYWRkKCkgZmFpbGVkIG9uIHRhc2stZG9uZSBub3RpZmljYXRpb24gZXZlbnQiKTsKQEAgLTEzOTIsMjIgKzEyODgsNTYgQEAKIH0KIAogYm9vbCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6bm90aWZ5KFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24qIGNvbm4pIHsKLSAgVEhSSUZUX1NPQ0tFVCBmZCA9IGdldE5vdGlmaWNhdGlvblNlbmRGRCgpOworICBhdXRvIGZkID0gZ2V0Tm90aWZpY2F0aW9uU2VuZEZEKCk7CiAgIGlmIChmZCA8IDApIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBmZF9zZXQgd2ZkcywgZWZkczsKICAgaW50IHJldCA9IC0xOwotICBpbnQga1NpemUgPSBzaXplb2YoY29ubik7Ci0gIGNvbnN0IGNoYXIqIHBvcyA9IChjb25zdCBjaGFyKiljb25zdF9jYXN0X3NvY2tvcHQoJmNvbm4pOworICBsb25nIGtTaXplID0gc2l6ZW9mKGNvbm4pOworICBjb25zdCBjaGFyICogcG9zID0gKGNvbnN0IGNoYXIgKiljb25zdF9jYXN0X3NvY2tvcHQoJmNvbm4pOworCisjaWYgZGVmaW5lZChIQVZFX1BPTExfSCkgfHwgZGVmaW5lZChIQVZFX1NZU19QT0xMX0gpCisgIHN0cnVjdCBwb2xsZmQgcGZkID0ge2ZkLCBQT0xMT1VULCAwfTsKKworICB3aGlsZSAoa1NpemUgPiAwKSB7CisgICAgcGZkLnJldmVudHMgPSAwOworICAgIHJldCA9IHBvbGwoJnBmZCwgMSwgLTEpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKHBmZC5yZXZlbnRzICYgUE9MTEhVUCB8fCBwZmQucmV2ZW50cyAmIFBPTExFUlIpIHsKKyAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGZkKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAocGZkLnJldmVudHMgJiBQT0xMT1VUKSB7CisgICAgICByZXQgPSBzZW5kKGZkLCBwb3MsIGtTaXplLCAwKTsKKyAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGZkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBrU2l6ZSAtPSByZXQ7CisgICAgICBwb3MgKz0gcmV0OworICAgIH0KKyAgfQorI2Vsc2UKKyAgZmRfc2V0IHdmZHMsIGVmZHM7CiAKICAgd2hpbGUgKGtTaXplID4gMCkgewogICAgIEZEX1pFUk8oJndmZHMpOwogICAgIEZEX1pFUk8oJmVmZHMpOwogICAgIEZEX1NFVChmZCwgJndmZHMpOwogICAgIEZEX1NFVChmZCwgJmVmZHMpOwotICAgIHJldCA9IHNlbGVjdChmZCArIDEsIE5VTEwsICZ3ZmRzLCAmZWZkcywgTlVMTCk7CisgICAgcmV0ID0gc2VsZWN0KHN0YXRpY19jYXN0PGludD4oZmQgKyAxKSwgTlVMTCwgJndmZHMsICZlZmRzLCBOVUxMKTsKICAgICBpZiAocmV0IDwgMCkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKQEAgLTE0MzQsMjMgKzEzNjQsMjUgQEAKICAgICAgIHBvcyArPSByZXQ7CiAgICAgfQogICB9CisjZW5kaWYKIAogICByZXR1cm4gdHJ1ZTsKIH0KIAogLyogc3RhdGljICovCiB2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpub3RpZnlIYW5kbGVyKGV2dXRpbF9zb2NrZXRfdCBmZCwgc2hvcnQgd2hpY2gsIHZvaWQqIHYpIHsKLSAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkID0gKFROb25ibG9ja2luZ0lPVGhyZWFkKil2OworICBhdXRvKiBpb1RocmVhZCA9IChUTm9uYmxvY2tpbmdJT1RocmVhZCopdjsKICAgYXNzZXJ0KGlvVGhyZWFkKTsKICAgKHZvaWQpd2hpY2g7CiAKICAgd2hpbGUgKHRydWUpIHsKLSAgICBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gMDsKKyAgICBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gbnVsbHB0cjsKICAgICBjb25zdCBpbnQga1NpemUgPSBzaXplb2YoY29ubmVjdGlvbik7CiAgICAgbG9uZyBuQnl0ZXMgPSByZWN2KGZkLCBjYXN0X3NvY2tvcHQoJmNvbm5lY3Rpb24pLCBrU2l6ZSwgMCk7CiAgICAgaWYgKG5CeXRlcyA9PSBrU2l6ZSkgewotICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkgeworICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gbnVsbHB0cikgewogICAgICAgICAvLyB0aGlzIGlzIHRoZSBjb21tYW5kIHRvIHN0b3Agb3VyIHRocmVhZCwgZXhpdCB0aGUgaGFuZGxlciEKKyAgICAgICAgaW9UaHJlYWQtPmJyZWFrTG9vcChmYWxzZSk7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICAgIGNvbm5lY3Rpb24tPnRyYW5zaXRpb24oKTsKQEAgLTE0NjEsNiArMTM5Myw3IEBACiAgICAgICByZXR1cm47CiAgICAgfSBlbHNlIGlmIChuQnl0ZXMgPT0gMCkgewogICAgICAgR2xvYmFsT3V0cHV0LnByaW50Zigibm90aWZ5SGFuZGxlcjogTm90aWZ5IHNvY2tldCBjbG9zZWQhIik7CisgICAgICBpb1RocmVhZC0+YnJlYWtMb29wKGZhbHNlKTsKICAgICAgIC8vIGV4aXQgdGhlIGxvb3AKICAgICAgIGJyZWFrOwogICAgIH0gZWxzZSB7IC8vIG5CeXRlcyA8IDAKQEAgLTE0ODUsMTkgKzE0MTgsMTUgQEAKICAgICA6OmFib3J0KCk7CiAgIH0KIAotICAvLyBzZXRzIGEgZmxhZyBzbyB0aGF0IHRoZSBsb29wIGV4aXRzIG9uIHRoZSBuZXh0IGV2ZW50Ci0gIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKGV2ZW50QmFzZV8pOwotCi0gIC8vIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKCkgb25seSBjYXVzZXMgdGhlIGxvb3AgdG8gZXhpdCB0aGUgbmV4dCB0aW1lCi0gIC8vIGl0IHdha2VzIHVwLiAgV2UgbmVlZCB0byBmb3JjZSBpdCB0byB3YWtlIHVwLCBpbiBjYXNlIHRoZXJlIGFyZQotICAvLyBubyByZWFsIGV2ZW50cyBpdCBuZWVkcyB0byBwcm9jZXNzLgotICAvLwogICAvLyBJZiB3ZSdyZSBydW5uaW5nIGluIHRoZSBzYW1lIHRocmVhZCwgd2UgY2FuJ3QgdXNlIHRoZSBub3RpZnkoMCkKICAgLy8gbWVjaGFuaXNtIHRvIHN0b3AgdGhlIHRocmVhZCwgYnV0IGhhcHBpbHkgaWYgd2UncmUgcnVubmluZyBpbiB0aGUKICAgLy8gc2FtZSB0aHJlYWQsIHRoaXMgbWVhbnMgdGhlIHRocmVhZCBjYW4ndCBiZSBibG9ja2luZyBpbiB0aGUgZXZlbnQKICAgLy8gbG9vcCBlaXRoZXIuCiAgIGlmICghVGhyZWFkOjppc19jdXJyZW50KHRocmVhZElkXykpIHsKLSAgICBub3RpZnkoTlVMTCk7CisgICAgbm90aWZ5KG51bGxwdHIpOworICB9IGVsc2UgeworICAgIC8vIGNhdXNlIHRoZSBsb29wIHRvIHN0b3AgQVNBUCAtIGV2ZW4gaWYgaXQgaGFzIHRoaW5ncyB0byBkbyBpbiBpdAorICAgIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKGV2ZW50QmFzZV8pOwogICB9CiB9CiAKQEAgLTE1MzEsMzEgKzE0NjAsMzMgQEAKIH0KIAogdm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6cnVuKCkgewotICBpZiAoZXZlbnRCYXNlXyA9PSBOVUxMKQorICBpZiAoZXZlbnRCYXNlXyA9PSBudWxscHRyKSB7CiAgICAgcmVnaXN0ZXJFdmVudHMoKTsKLQotICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IElPIHRocmVhZCAjJWQgZW50ZXJpbmcgbG9vcC4uLiIsIG51bWJlcl8pOwotCisgIH0KICAgaWYgKHVzZUhpZ2hQcmlvcml0eV8pIHsKICAgICBzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KHRydWUpOwogICB9CiAKLSAgLy8gUnVuIGxpYmV2ZW50IGVuZ2luZSwgbmV2ZXIgcmV0dXJucywgaW52b2tlcyBjYWxscyB0byBldmVudEhhbmRsZXIKLSAgZXZlbnRfYmFzZV9sb29wKGV2ZW50QmFzZV8sIDApOworICBpZiAoZXZlbnRCYXNlXyAhPSBudWxscHRyKQorICB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIGVudGVyaW5nIGxvb3AuLi4iLCBudW1iZXJfKTsKKyAgICAvLyBSdW4gbGliZXZlbnQgZW5naW5lLCBuZXZlciByZXR1cm5zLCBpbnZva2VzIGNhbGxzIHRvIGV2ZW50SGFuZGxlcgorICAgIGV2ZW50X2Jhc2VfbG9vcChldmVudEJhc2VfLCAwKTsKIAotICBpZiAodXNlSGlnaFByaW9yaXR5XykgewotICAgIHNldEN1cnJlbnRUaHJlYWRIaWdoUHJpb3JpdHkoZmFsc2UpOworICAgIGlmICh1c2VIaWdoUHJpb3JpdHlfKSB7CisgICAgICBzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KGZhbHNlKTsKKyAgICB9CisKKyAgICAvLyBjbGVhbnMgdXAgb3VyIHJlZ2lzdGVyZWQgZXZlbnRzCisgICAgY2xlYW51cEV2ZW50cygpOwogICB9CiAKLSAgLy8gY2xlYW5zIHVwIG91ciByZWdpc3RlcmVkIGV2ZW50cwotICBjbGVhbnVwRXZlbnRzKCk7Ci0KICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIHJ1bigpIGRvbmUhIiwgbnVtYmVyXyk7CiB9CiAKIHZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OmNsZWFudXBFdmVudHMoKSB7CiAgIC8vIHN0b3AgdGhlIGxpc3RlbiBzb2NrZXQsIGlmIGFueQotICBpZiAobGlzdGVuU29ja2V0XyA+PSAwKSB7CisgIGlmIChsaXN0ZW5Tb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIGlmIChldmVudF9kZWwoJnNlcnZlckV2ZW50XykgPT0gLTEpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ0lPVGhyZWFkOjpzdG9wKCkgZXZlbnRfZGVsOiAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKaW5kZXggNGZiODNmMS4uODJiYzM3NSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCkBAIC0yMSwxNCArMjEsMTYgQEAKICNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVE5PTkJMT0NLSU5HU0VSVkVSX0hfIDEKIAogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAjaW5jbHVkZSA8c3RhY2s+CiAjaW5jbHVkZSA8dmVjdG9yPgpAQCAtNDcsMTAgKzQ5LDExIEBACiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7CkBAIC05NiwxMCArOTksNiBAQAogICogb3BlcmF0ZXMgYSBzZXQgb2YgSU8gdGhyZWFkcyAoYnkgZGVmYXVsdCBvbmx5IG9uZSkuIEl0IGFzc3VtZXMgdGhhdAogICogYWxsIGluY29taW5nIHJlcXVlc3RzIGFyZSBmcmFtZWQgd2l0aCBhIDQgYnl0ZSBsZW5ndGggaW5kaWNhdG9yIGFuZAogICogd3JpdGVzIG91dCByZXNwb25zZXMgdXNpbmcgdGhlIHNhbWUgZnJhbWluZy4KLSAqCi0gKiBJdCBkb2VzIG5vdCB1c2UgdGhlIFRTZXJ2ZXJUcmFuc3BvcnQgZnJhbWV3b3JrLCBidXQgcmF0aGVyIGhhcyBzb2NrZXQKLSAqIG9wZXJhdGlvbnMgaGFyZGNvZGVkIGZvciB1c2Ugd2l0aCBzZWxlY3QuCi0gKgogICovCiAKIC8vLyBPdmVybG9hZCBjb25kaXRpb24gYWN0aW9ucy4KQEAgLTE1NywyNiArMTU2LDIwIEBACiAgIC8vLyBTZXJ2ZXIgc29ja2V0IGZpbGUgZGVzY3JpcHRvcgogICBUSFJJRlRfU09DS0VUIHNlcnZlclNvY2tldF87CiAKLSAgLy8vIFBvcnQgc2VydmVyIHJ1bnMgb24uIFplcm8gd2hlbiBsZXR0aW5nIE9TIGRlY2lkZSBhY3R1YWwgcG9ydAotICBpbnQgcG9ydF87Ci0KLSAgLy8vIFBvcnQgc2VydmVyIGFjdHVhbGx5IHJ1bnMgb24KLSAgaW50IGxpc3RlblBvcnRfOwotCiAgIC8vLyBUaGUgb3B0aW9uYWwgdXNlci1wcm92aWRlZCBldmVudC1iYXNlIChmb3Igc2luZ2xlLXRocmVhZCBzZXJ2ZXJzKQogICBldmVudF9iYXNlKiB1c2VyRXZlbnRCYXNlXzsKIAogICAvLy8gRm9yIHByb2Nlc3NpbmcgdmlhIHRocmVhZCBwb29sLCBtYXkgYmUgTlVMTAotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXJfOwogCiAgIC8vLyBJcyB0aHJlYWQgcG9vbCBwcm9jZXNzaW5nPwogICBib29sIHRocmVhZFBvb2xQcm9jZXNzaW5nXzsKIAogICAvLyBGYWN0b3J5IHRvIGNyZWF0ZSB0aGUgSU8gdGhyZWFkcwotICBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IGlvVGhyZWFkRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiBpb1RocmVhZEZhY3RvcnlfOwogCiAgIC8vIFZlY3RvciBvZiBJT1RocmVhZCBvYmplY3RzIHRoYXQgd2lsbCBoYW5kbGUgb3VyIElPCi0gIHN0ZDo6dmVjdG9yPGJvb3N0OjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ0lPVGhyZWFkPiA+IGlvVGhyZWFkc187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdJT1RocmVhZD4gPiBpb1RocmVhZHNfOwogCiAgIC8vIEluZGV4IG9mIG5leHQgSU8gVGhyZWFkIHRvIGJlIHVzZWQgKGZvciByb3VuZC1yb2JpbikKICAgdWludDMyX3QgbmV4dElPVGhyZWFkXzsKQEAgLTI2OSwyNCArMjYyLDI1IEBACiAgICAqLwogICBzdGQ6OnZlY3RvcjxUQ29ubmVjdGlvbio+IGFjdGl2ZUNvbm5lY3Rpb25zXzsKIAorICAvKgorICAqLworICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnRfOworCiAgIC8qKgogICAgKiBDYWxsZWQgd2hlbiBzZXJ2ZXIgc29ja2V0IGhhZCBzb21ldGhpbmcgaGFwcGVuLiAgV2UgYWNjZXB0IGFsbCB3YWl0aW5nCiAgICAqIGNsaWVudCBjb25uZWN0aW9ucyBvbiBsaXN0ZW4gc29ja2V0IGZkIGFuZCBhc3NpZ24gVENvbm5lY3Rpb24gb2JqZWN0cwogICAgKiB0byBoYW5kbGUgdGhvc2UgcmVxdWVzdHMuCiAgICAqCi0gICAqIEBwYXJhbSBmZCB0aGUgbGlzdGVuIHNvY2tldC4KICAgICogQHBhcmFtIHdoaWNoIHRoZSBldmVudCBmbGFnIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyLgogICAgKi8KICAgdm9pZCBoYW5kbGVFdmVudChUSFJJRlRfU09DS0VUIGZkLCBzaG9ydCB3aGljaCk7CiAKLSAgdm9pZCBpbml0KGludCBwb3J0KSB7CisgIHZvaWQgaW5pdCgpIHsKICAgICBzZXJ2ZXJTb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOwogICAgIG51bUlPVGhyZWFkc18gPSBERUZBVUxUX0lPX1RIUkVBRFM7CiAgICAgbmV4dElPVGhyZWFkXyA9IDA7CiAgICAgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXyA9IGZhbHNlOwotICAgIHBvcnRfID0gcG9ydDsKLSAgICBsaXN0ZW5Qb3J0XyA9IHBvcnQ7Ci0gICAgdXNlckV2ZW50QmFzZV8gPSBOVUxMOworICAgIHVzZXJFdmVudEJhc2VfID0gbnVsbHB0cjsKICAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18gPSBmYWxzZTsKICAgICBudW1UQ29ubmVjdGlvbnNfID0gMDsKICAgICBudW1BY3RpdmVQcm9jZXNzb3JzXyA9IDA7CkBAIC0zMDcsNTUgKzMwMSw1NSBAQAogICB9CiAKIHB1YmxpYzoKLSAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwgaW50IHBvcnQpCi0gICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpIHsKLSAgICBpbml0KHBvcnQpOworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKICAgfQogCi0gIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLCBpbnQgcG9ydCkKLSAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yKSB7Ci0gICAgaW5pdChwb3J0KTsKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CiAgIH0KIAotICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgID0gYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKLSAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSkgewogCi0gICAgaW5pdChwb3J0KTsKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKIAogICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7CiAgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7CiAgICAgc2V0VGhyZWFkTWFuYWdlcih0aHJlYWRNYW5hZ2VyKTsKICAgfQogCi0gIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgID0gYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKLSAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yKSB7Ci0KLSAgICBpbml0KHBvcnQpOworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogCiAgICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKICAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKICAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOwogICB9CiAKLSAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgID0gYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKLSAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSkgewotCi0gICAgaW5pdChwb3J0KTsKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogCiAgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGlucHV0VHJhbnNwb3J0RmFjdG9yeSk7CiAgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KTsKQEAgLTM2NCwxNyArMzU4LDE2IEBACiAgICAgc2V0VGhyZWFkTWFuYWdlcih0aHJlYWRNYW5hZ2VyKTsKICAgfQogCi0gIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgPSBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKQotICAgIDogVFNlcnZlcihwcm9jZXNzb3IpIHsKLQotICAgIGluaXQocG9ydCk7CisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKQorICAgIDogVFNlcnZlcihwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKIAogICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShpbnB1dFRyYW5zcG9ydEZhY3RvcnkpOwogICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSk7CkBAIC0zODMsMTkgKzM3NiwxNyBAQAogICAgIHNldFRocmVhZE1hbmFnZXIodGhyZWFkTWFuYWdlcik7CiAgIH0KIAotICB+VE5vbmJsb2NraW5nU2VydmVyKCk7CisgIH5UTm9uYmxvY2tpbmdTZXJ2ZXIoKSBvdmVycmlkZTsKIAotICB2b2lkIHNldFRocmVhZE1hbmFnZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcik7CisgIHZvaWQgc2V0VGhyZWFkTWFuYWdlcihzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcik7CiAKLSAgaW50IGdldExpc3RlblBvcnQoKSB7IHJldHVybiBsaXN0ZW5Qb3J0XzsgfQorICBpbnQgZ2V0TGlzdGVuUG9ydCgpIHsgcmV0dXJuIHNlcnZlclRyYW5zcG9ydF8tPmdldExpc3RlblBvcnQoKTsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IGdldFRocmVhZE1hbmFnZXIoKSB7IHJldHVybiB0aHJlYWRNYW5hZ2VyXzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gZ2V0VGhyZWFkTWFuYWdlcigpIHsgcmV0dXJuIHRocmVhZE1hbmFnZXJfOyB9CiAKICAgLyoqCiAgICAqIFNldHMgdGhlIG51bWJlciBvZiBJTyB0aHJlYWRzIHVzZWQgYnkgdGhpcyBzZXJ2ZXIuIENhbiBvbmx5IGJlIHVzZWQgYmVmb3JlCi0gICAqIHRoZSBjYWxsIHRvIHNlcnZlKCkgYW5kIGhhcyBubyBlZmZlY3QgYWZ0ZXJ3YXJkcy4gIFdlIGFsd2F5cyB1c2UgYQotICAgKiBQb3NpeFRocmVhZEZhY3RvcnkgZm9yIHRoZSBJTyB3b3JrZXIgdGhyZWFkcywgYmVjYXVzZSB0aGV5IG11c3Qgam9pbmFibGUKLSAgICogZm9yIGNsZWFuIHNodXRkb3duLgorICAgKiB0aGUgY2FsbCB0byBzZXJ2ZSgpIGFuZCBoYXMgbm8gZWZmZWN0IGFmdGVyd2FyZHMuCiAgICAqLwogICB2b2lkIHNldE51bUlPVGhyZWFkcyhzaXplX3QgbnVtVGhyZWFkcykgewogICAgIG51bUlPVGhyZWFkc18gPSBudW1UaHJlYWRzOwpAQCAtNDI4LDcgKzQxOSw3IEBACiAKICAgYm9vbCBpc1RocmVhZFBvb2xQcm9jZXNzaW5nKCkgY29uc3QgeyByZXR1cm4gdGhyZWFkUG9vbFByb2Nlc3NpbmdfOyB9CiAKLSAgdm9pZCBhZGRUYXNrKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CisgIHZvaWQgYWRkVGFzayhzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKICAgICB0aHJlYWRNYW5hZ2VyXy0+YWRkKHRhc2ssIDBMTCwgdGFza0V4cGlyZVRpbWVfKTsKICAgfQogCkBAIC02NzgsMjUgKzY2OSwxNyBAQAogICAgKiBNYWluIHdvcmtob3JzZSBmdW5jdGlvbiwgc3RhcnRzIHVwIHRoZSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGEgcG9ydCBhbmQKICAgICogbG9vcHMgb3ZlciB0aGUgbGliZXZlbnQgaGFuZGxlci4KICAgICovCi0gIHZvaWQgc2VydmUoKTsKKyAgdm9pZCBzZXJ2ZSgpIG92ZXJyaWRlOwogCiAgIC8qKgogICAgKiBDYXVzZXMgdGhlIHNlcnZlciB0byB0ZXJtaW5hdGUgZ3JhY2VmdWxseSAoY2FuIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQpLgogICAgKi8KLSAgdm9pZCBzdG9wKCk7CisgIHZvaWQgc3RvcCgpIG92ZXJyaWRlOwogCiAgIC8vLyBDcmVhdGVzIGEgc29ja2V0IHRvIGxpc3RlbiBvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGxvY2FsIHBvcnQuCiAgIHZvaWQgY3JlYXRlQW5kTGlzdGVuT25Tb2NrZXQoKTsKIAogICAvKioKLSAgICogVGFrZXMgYSBzb2NrZXQgY3JlYXRlZCBieSBjcmVhdGVBbmRMaXN0ZW5PblNvY2tldCgpIGFuZCBzZXRzIHZhcmlvdXMKLSAgICogb3B0aW9ucyBvbiBpdCB0byBwcmVwYXJlIGZvciB1c2UgaW4gdGhlIHNlcnZlci4KLSAgICoKLSAgICogQHBhcmFtIGZkIGRlc2NyaXB0b3Igb2Ygc29ja2V0IHRvIGJlIGluaXRpYWxpemVkLwotICAgKi8KLSAgdm9pZCBsaXN0ZW5Tb2NrZXQoVEhSSUZUX1NPQ0tFVCBmZCk7Ci0KLSAgLyoqCiAgICAqIFJlZ2lzdGVyIHRoZSBvcHRpb25hbCB1c2VyLXByb3ZpZGVkIGV2ZW50LWJhc2UgKGZvciBzaW5nbGUtdGhyZWFkIHNlcnZlcnMpCiAgICAqCiAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIHNlcnZlciBpcyBydW5uaW5nIGluIGEgc2luZ2xlLXRocmVhZApAQCAtNzEyLDYgKzY5NSwxMSBAQAogICAgKi8KICAgZXZlbnRfYmFzZSogZ2V0VXNlckV2ZW50QmFzZSgpIGNvbnN0IHsgcmV0dXJuIHVzZXJFdmVudEJhc2VfOyB9CiAKKyAgLyoqIFNvbWUgdHJhbnNwb3J0cywgbGlrZSBUSGVhZGVyVHJhbnNwb3J0LCByZXF1aXJlIHBhc3NpbmcgdGhyb3VnaAorICAgKiB0aGUgZnJhbWluZyBzaXplIGluc3RlYWQgb2Ygc3RyaXBwaW5nIGl0LgorICAgKi8KKyAgYm9vbCBnZXRIZWFkZXJUcmFuc3BvcnQoKTsKKwogcHJpdmF0ZToKICAgLyoqCiAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdGhlIHRocmVhZG1hbmFnZXIgY2FsbHMgd2hlbiBhIHRhc2sgcmVhY2hlcwpAQCAtNzE5LDcgKzcwNyw3IEBACiAgICAqCiAgICAqIEBwYXJhbSB0YXNrIHRoZSBydW5uYWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4cGlyZWQgdGFzay4KICAgICovCi0gIHZvaWQgZXhwaXJlQ2xvc2UoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spOworICB2b2lkIGV4cGlyZUNsb3NlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CiAKICAgLyoqCiAgICAqIFJldHVybiBhbiBpbml0aWFsaXplZCBjb25uZWN0aW9uIG9iamVjdC4gIENyZWF0ZXMgb3IgcmVjb3ZlcnMgZnJvbQpAQCAtNzMxLDcgKzcxOSw3IEBACiAgICAqIEBwYXJhbSBhZGRyTGVuIHRoZSBsZW5ndGggb2YgYWRkcgogICAgKiBAcmV0dXJuIHBvaW50ZXIgdG8gaW5pdGlhbGl6ZWQgVENvbm5lY3Rpb24gb2JqZWN0LgogICAgKi8KLSAgVENvbm5lY3Rpb24qIGNyZWF0ZUNvbm5lY3Rpb24oVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIGNvbnN0IHNvY2thZGRyKiBhZGRyLCBzb2NrbGVuX3QgYWRkckxlbik7CisgIFRDb25uZWN0aW9uKiBjcmVhdGVDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpOwogCiAgIC8qKgogICAgKiBSZXR1cm5zIGEgY29ubmVjdGlvbiB0byBwb29sIG9yIGRlbGV0aW9uLiAgSWYgdGhlIGNvbm5lY3Rpb24gcG9vbApAQCAtNzUzLDcgKzc0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9TT0NLRVQgbGlzdGVuU29ja2V0LAogICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUhpZ2hQcmlvcml0eSk7CiAKLSAgflROb25ibG9ja2luZ0lPVGhyZWFkKCk7CisgIH5UTm9uYmxvY2tpbmdJT1RocmVhZCgpIG92ZXJyaWRlOwogCiAgIC8vIFJldHVybnMgdGhlIGV2ZW50LWJhc2UgZm9yIHRoaXMgdGhyZWFkLgogICBldmVudF9iYXNlKiBnZXRFdmVudEJhc2UoKSBjb25zdCB7IHJldHVybiBldmVudEJhc2VfOyB9CkBAIC03NzUsMTYgKzc2MywxNiBAQAogICBldnV0aWxfc29ja2V0X3QgZ2V0Tm90aWZpY2F0aW9uUmVjdkZEKCkgY29uc3QgeyByZXR1cm4gbm90aWZpY2F0aW9uUGlwZUZEc19bMF07IH0KIAogICAvLyBSZXR1cm5zIHRoZSBhY3R1YWwgdGhyZWFkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJTyB0aHJlYWQuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gZ2V0VGhyZWFkKCkgY29uc3QgeyByZXR1cm4gdGhyZWFkXzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBnZXRUaHJlYWQoKSBjb25zdCB7IHJldHVybiB0aHJlYWRfOyB9CiAKICAgLy8gU2V0cyB0aGUgYWN0dWFsIHRocmVhZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSU8gdGhyZWFkLgotICB2b2lkIHNldFRocmVhZChjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+JiB0KSB7IHRocmVhZF8gPSB0OyB9CisgIHZvaWQgc2V0VGhyZWFkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+JiB0KSB7IHRocmVhZF8gPSB0OyB9CiAKICAgLy8gVXNlZCBieSBUQ29ubmVjdGlvbiBvYmplY3RzIHRvIGluZGljYXRlIHByb2Nlc3NpbmcgaGFzIGZpbmlzaGVkLgogICBib29sIG5vdGlmeShUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBjb25uKTsKIAogICAvLyBFbnRlcnMgdGhlIGV2ZW50IGxvb3AgYW5kIGRvZXMgbm90IHJldHVybiB1bnRpbCBhIGNhbGwgdG8gc3RvcCgpLgotICB2aXJ0dWFsIHZvaWQgcnVuKCk7CisgIHZvaWQgcnVuKCkgb3ZlcnJpZGU7CiAKICAgLy8gRXhpdHMgdGhlIGV2ZW50IGxvb3AgYXMgc29vbiBhcyBwb3NzaWJsZS4KICAgdm9pZCBzdG9wKCk7CkBAIC04NjMsNyArODUxLDcgQEAKICAgZXZ1dGlsX3NvY2tldF90IG5vdGlmaWNhdGlvblBpcGVGRHNfWzJdOwogCiAgIC8vLyBBY3R1YWwgSU8gVGhyZWFkCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkXzsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oCmluZGV4IDQ3ZTBkNDAuLmQyZWFiZGUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTQ4LDcgKzQ4LDcgQEAKICAqLwogY2xhc3MgVFNlcnZlckV2ZW50SGFuZGxlciB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgflRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7fQorICB2aXJ0dWFsIH5UU2VydmVyRXZlbnRIYW5kbGVyKCkgPSBkZWZhdWx0OwogCiAgIC8qKgogICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zLgpAQCAtNTgsMTEgKzU4LDExIEBACiAgIC8qKgogICAgKiBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZy4KICAgICovCi0gIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CiAgICAgKHZvaWQpaW5wdXQ7CiAgICAgKHZvaWQpb3V0cHV0OwotICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBudWxscHRyOwogICB9CiAKICAgLyoqCkBAIC03MCw4ICs3MCw4IEBACiAgICAqIGNvbnRleHQuCiAgICAqLwogICB2aXJ0dWFsIHZvaWQgZGVsZXRlQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CiAgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKICAgICAodm9pZClpbnB1dDsKICAgICAodm9pZClvdXRwdXQ7CkBAIC04MCw3ICs4MCw3IEBACiAgIC8qKgogICAgKiBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CiAgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKICAgICAodm9pZCl0cmFuc3BvcnQ7CiAgIH0KQEAgLTg5LDcgKzg5LDcgQEAKICAgLyoqCiAgICAqIFByZXZlbnQgZGlyZWN0IGluc3RhbnRpYXRpb24uCiAgICAqLwotICBUU2VydmVyRXZlbnRIYW5kbGVyKCkge30KKyAgVFNlcnZlckV2ZW50SGFuZGxlcigpID0gZGVmYXVsdDsKIH07CiAKIC8qKgpAQCAtOTgsNzEgKzk4LDcxIEBACiAgKi8KIGNsYXNzIFRTZXJ2ZXIgOiBwdWJsaWMgY29uY3VycmVuY3k6OlJ1bm5hYmxlIHsKIHB1YmxpYzoKLSAgdmlydHVhbCB+VFNlcnZlcigpIHt9CisgIH5UU2VydmVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpID0gMDsKIAogICB2aXJ0dWFsIHZvaWQgc3RvcCgpIHt9CiAKICAgLy8gQWxsb3dzIHJ1bm5pbmcgdGhlIHNlcnZlciBhcyBhIFJ1bm5hYmxlIHRocmVhZAotICB2aXJ0dWFsIHZvaWQgcnVuKCkgeyBzZXJ2ZSgpOyB9CisgIHZvaWQgcnVuKCkgb3ZlcnJpZGUgeyBzZXJ2ZSgpOyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+IGdldFByb2Nlc3NvckZhY3RvcnkoKSB7IHJldHVybiBwcm9jZXNzb3JGYWN0b3J5XzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+IGdldFByb2Nlc3NvckZhY3RvcnkoKSB7IHJldHVybiBwcm9jZXNzb3JGYWN0b3J5XzsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IGdldFNlcnZlclRyYW5zcG9ydCgpIHsgcmV0dXJuIHNlcnZlclRyYW5zcG9ydF87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IGdldFNlcnZlclRyYW5zcG9ydCgpIHsgcmV0dXJuIHNlcnZlclRyYW5zcG9ydF87IH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZ2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkgeyByZXR1cm4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGdldElucHV0VHJhbnNwb3J0RmFjdG9yeSgpIHsgcmV0dXJuIGlucHV0VHJhbnNwb3J0RmFjdG9yeV87IH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZ2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBnZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkgewogICAgIHJldHVybiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGdldElucHV0UHJvdG9jb2xGYWN0b3J5KCkgeyByZXR1cm4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBnZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpIHsgcmV0dXJuIGlucHV0UHJvdG9jb2xGYWN0b3J5XzsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpIHsgcmV0dXJuIG91dHB1dFByb3RvY29sRmFjdG9yeV87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpIHsgcmV0dXJuIG91dHB1dFByb3RvY29sRmFjdG9yeV87IH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSB7IHJldHVybiBldmVudEhhbmRsZXJfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSB7IHJldHVybiBldmVudEhhbmRsZXJfOyB9CiAKIHByb3RlY3RlZDoKLSAgVFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnkpCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSkKICAgICA6IHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpIHsKLSAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CiAgIH0KIAotICBUU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IpCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IpCiAgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSkgewotICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKICAgfQogCi0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCkKICAgICA6IHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgewotICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKICAgfQogCi0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQorICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQogICAgIDogcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpLAogICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKLSAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CiAgIH0KIAotICBUU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKICAgICA6IHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpLAogICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAogICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xyh0cmFuc3BvcnRGYWN0b3J5KSwKQEAgLTE3MCwxMCArMTcwLDEwIEBACiAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSB7fQogCi0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCiAgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSksCiAgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCiAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLApAQCAtMTgxLDEyICsxODEsMTIgQEAKICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAogICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpIHt9CiAKLSAgVFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQogICAgIDogcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSksCiAgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCiAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKGlucHV0VHJhbnNwb3J0RmFjdG9yeSksCkBAIC0xOTQsMTIgKzE5NCwxMiBAQAogICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKGlucHV0UHJvdG9jb2xGYWN0b3J5KSwKICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7fQogCi0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQogICAgIDogcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpLAogICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAogICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyhpbnB1dFRyYW5zcG9ydEZhY3RvcnkpLApAQCAtMjE0LDkgKzIxNCw5IEBACiAgICAqIGNhbGwpLiAgVGhpcyBhbGxvd3MgdGhlIFRQcm9jZXNzb3JGYWN0b3J5IHRvIHJldHVybiBhIGRpZmZlcmVudCBwcm9jZXNzb3IKICAgICogZm9yIGVhY2ggY29ubmVjdGlvbiBpZiBpdCBkZXNpcmVzLgogICAgKi8KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CiAgICAgVENvbm5lY3Rpb25JbmZvIGNvbm5JbmZvOwogICAgIGNvbm5JbmZvLmlucHV0ID0gaW5wdXRQcm90b2NvbDsKICAgICBjb25uSW5mby5vdXRwdXQgPSBvdXRwdXRQcm90b2NvbDsKQEAgLTIyNSwzNSArMjI1LDM1IEBACiAgIH0KIAogICAvLyBDbGFzcyB2YXJpYWJsZXMKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+IHByb2Nlc3NvckZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+IHByb2Nlc3NvckZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0XzsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKIAogcHVibGljOgotICB2b2lkIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSB7CisgIHZvaWQgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSB7CiAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKICAgfQogCi0gIHZvaWQgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSkgeworICB2b2lkIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSB7CiAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8gPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OwogICB9CiAKLSAgdm9pZCBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSkgeworICB2b2lkIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSkgewogICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OwogICB9CiAKLSAgdm9pZCBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7CisgIHZvaWQgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwogICB9CiAKLSAgdm9pZCBzZXRTZXJ2ZXJFdmVudEhhbmRsZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CisgIHZvaWQgc2V0U2VydmVyRXZlbnRIYW5kbGVyKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKICAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOwogICB9CiB9OwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKaW5kZXggZTg0MzkyMS4uMzVmM2IyNSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8Ym9vc3QvYmluZC5ocHA+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaD4KQEAgLTI3LDE0ICsyNywxNCBAQAogbmFtZXNwYWNlIHNlcnZlciB7CiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBzdGQ6OmJpbmQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwotdXNpbmcgYm9vc3Q6OmJpbmQ7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCiBUU2VydmVyRnJhbWV3b3JrOjpUU2VydmVyRnJhbWV3b3JrKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LApAQCAtOTEsOCArOTEsNyBAQAogICAgIGxpbWl0XyhJTlQ2NF9NQVgpIHsKIH0KIAotVFNlcnZlckZyYW1ld29yazo6flRTZXJ2ZXJGcmFtZXdvcmsoKSB7Ci19CitUU2VydmVyRnJhbWV3b3JrOjp+VFNlcnZlckZyYW1ld29yaygpID0gZGVmYXVsdDsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzdGF0aWMgdm9pZCByZWxlYXNlT25lRGVzY3JpcHRvcihjb25zdCBzdHJpbmcmIG5hbWUsIFQmIHBUcmFuc3BvcnQpIHsKQEAgLTE0Nyw4ICsxNDYsMTMgQEAKIAogICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgIGlmICghb3V0cHV0UHJvdG9jb2xGYWN0b3J5XykgeworICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCwgb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisgICAgICB9CiAKICAgICAgIG5ld2x5Q29ubmVjdGVkQ2xpZW50KHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4oCiAgICAgICAgICAgbmV3IFRDb25uZWN0ZWRDbGllbnQoZ2V0UHJvY2Vzc29yKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBjbGllbnQpLApAQCAtMTU2LDcgKzE2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQpLAotICAgICAgICAgIGJpbmQoJlRTZXJ2ZXJGcmFtZXdvcms6OmRpc3Bvc2VDb25uZWN0ZWRDbGllbnQsIHRoaXMsIF8xKSkpOworICAgICAgICAgIGJpbmQoJlRTZXJ2ZXJGcmFtZXdvcms6OmRpc3Bvc2VDb25uZWN0ZWRDbGllbnQsIHRoaXMsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpKTsKIAogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewogICAgICAgcmVsZWFzZU9uZURlc2NyaXB0b3IoImlucHV0VHJhbnNwb3J0IiwgaW5wdXRUcmFuc3BvcnQpOwpAQCAtMjA5LDMwICsyMTMsMzIgQEAKIH0KIAogdm9pZCBUU2VydmVyRnJhbWV3b3JrOjpzdG9wKCkgewotICBzZXJ2ZXJUcmFuc3BvcnRfLT5pbnRlcnJ1cHQoKTsKKyAgLy8gT3JkZXIgaXMgaW1wb3J0YW50IGJlY2F1c2Ugc2VydmUoKSByZWxlYXNlcyBzZXJ2ZXJUcmFuc3BvcnRfIHdoZW4gaXQgaXMKKyAgLy8gaW50ZXJydXB0ZWQsIHdoaWNoIGNsb3NlcyB0aGUgc29ja2V0IHRoYXQgaW50ZXJydXB0Q2hpbGRyZW4gdXNlcy4KICAgc2VydmVyVHJhbnNwb3J0Xy0+aW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgc2VydmVyVHJhbnNwb3J0Xy0+aW50ZXJydXB0KCk7CiB9CiAKLXZvaWQgVFNlcnZlckZyYW1ld29yazo6bmV3bHlDb25uZWN0ZWRDbGllbnQoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIHsKLSAgb25DbGllbnRDb25uZWN0ZWQocENsaWVudCk7Cit2b2lkIFRTZXJ2ZXJGcmFtZXdvcms6Om5ld2x5Q29ubmVjdGVkQ2xpZW50KGNvbnN0IHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIHsKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICAgICsrY2xpZW50c187CisgICAgaHdtXyA9IChzdGQ6Om1heCkoaHdtXywgY2xpZW50c18pOworICB9CiAKLSAgLy8gQ291bnQgYSBjb25jdXJyZW50IGNsaWVudCBhZGRlZC4KLSAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7Ci0gICsrY2xpZW50c187Ci0gIGh3bV8gPSBzdGQ6Om1heChod21fLCBjbGllbnRzXyk7CisgIG9uQ2xpZW50Q29ubmVjdGVkKHBDbGllbnQpOwogfQogCiB2b2lkIFRTZXJ2ZXJGcmFtZXdvcms6OmRpc3Bvc2VDb25uZWN0ZWRDbGllbnQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgewotICB7Ci0gICAgLy8gQ291bnQgYSBjb25jdXJyZW50IGNsaWVudCByZW1vdmVkLgotICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOwotICAgIGlmIChsaW1pdF8gLSAtLWNsaWVudHNfID4gMCkgewotICAgICAgbW9uXy5ub3RpZnkoKTsKLSAgICB9Ci0gIH0KICAgb25DbGllbnREaXNjb25uZWN0ZWQocENsaWVudCk7CiAgIGRlbGV0ZSBwQ2xpZW50OworCisgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICBpZiAobGltaXRfIC0gLS1jbGllbnRzXyA+IDApIHsKKyAgICBtb25fLm5vdGlmeSgpOworICB9CiB9CisKIH0KIH0KIH0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaAppbmRleCBhMjI2ODhhLi5kYWM3OWVmIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaApAQCAtMjAsNyArMjAsNyBAQAogI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSRlJBTUVXT1JLX0hfCiAjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJGUkFNRVdPUktfSF8gMQogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KQEAgLTQ4LDM0ICs0OCwzNCBAQAogY2xhc3MgVFNlcnZlckZyYW1ld29yayA6IHB1YmxpYyBUU2VydmVyIHsKIHB1YmxpYzoKICAgVFNlcnZlckZyYW1ld29yaygKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CiAKICAgVFNlcnZlckZyYW1ld29yaygKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KTsKIAogICBUU2VydmVyRnJhbWV3b3JrKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CiAKICAgVFNlcnZlckZyYW1ld29yaygKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CiAKLSAgdmlydHVhbCB+VFNlcnZlckZyYW1ld29yaygpOworICB+VFNlcnZlckZyYW1ld29yaygpIG92ZXJyaWRlOwogCiAgIC8qKgogICAgKiBBY2NlcHQgY2xpZW50cyBmcm9tIHRoZSBUU2VydmVyVHJhbnNwb3J0IGFuZCBhZGQgdGhlbSBmb3IgcHJvY2Vzc2luZy4KQEAgLTg0LDEyICs4NCwxMiBAQAogICAgKiBQb3N0LWNvbmRpdGlvbnMgKHJldHVybiBndWFyYW50ZWVzKToKICAgICogICBUaGUgc2VydmVyVHJhbnNwb3J0IHdpbGwgYmUgY2xvc2VkLgogICAgKi8KLSAgdmlydHVhbCB2b2lkIHNlcnZlKCk7CisgIHZvaWQgc2VydmUoKSBvdmVycmlkZTsKIAogICAvKioKICAgICogSW50ZXJydXB0IHNlcnZlKCkgc28gdGhhdCBpdCBtZWV0cyBwb3N0LWNvbmRpdGlvbnMgYW5kIHJldHVybnMuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgc3RvcCgpOworICB2b2lkIHN0b3AoKSBvdmVycmlkZTsKIAogICAvKioKICAgICogR2V0IHRoZSBjb25jdXJyZW50IGNsaWVudCBsaW1pdC4KQEAgLTEyMywyMCArMTIzLDIxIEBACiAKIHByb3RlY3RlZDoKICAgLyoqCi0gICAqIEEgY2xpZW50IGhhcyBjb25uZWN0ZWQuICBUaGUgaW1wbGVtZW50YXRpb24gaXMgcmVzcG9uc2libGUgZm9yIHN0b3JpbmcKLSAgICogYW5kIHByb2Nlc3NpbmcgdGhlIGNsaWVudC4gIFRoaXMgaXMgY2FsbGVkIGR1cmluZyB0aGUgc2VydmUoKSB0aHJlYWQsCisgICAqIEEgY2xpZW50IGhhcyBjb25uZWN0ZWQuICBUaGUgaW1wbGVtZW50YXRpb24gaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZQorICAgKiBsaWZldGltZSBvZiB0aGUgY2xpZW50IG9iamVjdC4gIFRoaXMgaXMgY2FsbGVkIGR1cmluZyB0aGUgc2VydmUoKSB0aHJlYWQsCiAgICAqIHRoZXJlZm9yZSBhIGZhaWx1cmUgdG8gcmV0dXJuIHF1aWNrbHkgd2lsbCByZXN1bHQgaW4gbmV3IGNsaWVudCBjb25uZWN0aW9uCiAgICAqIGRlbGF5cy4KICAgICoKICAgICogXHBhcmFtW2luXSAgcENsaWVudCAgdGhlIG5ld2x5IGNvbm5lY3RlZCBjbGllbnQKICAgICovCi0gIHZpcnR1YWwgdm9pZCBvbkNsaWVudENvbm5lY3RlZChjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgPSAwOworICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSA9IDA7CiAKICAgLyoqCiAgICAqIEEgY2xpZW50IGhhcyBkaXNjb25uZWN0ZWQuCi0gICAqIFRoZSBzZXJ2ZXIgbm8gbG9uZ2VyIHRyYWNrcyB0aGUgY2xpZW50LgotICAgKiBUaGUgY2xpZW50IFRUcmFuc3BvcnQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuCi0gICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IG5vdCBkZWxldGUgdGhlIHBvaW50ZXIuCisgICAqIFdoZW4gY2FsbGVkOgorICAgKiAgIFRoZSBzZXJ2ZXIgbm8gbG9uZ2VyIHRyYWNrcyB0aGUgY2xpZW50LgorICAgKiAgIFRoZSBjbGllbnQgVFRyYW5zcG9ydCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4KKyAgICogICBUaGUgaW1wbGVtZW50YXRpb24gbXVzdCBub3QgZGVsZXRlIHRoZSBwb2ludGVyLgogICAgKgogICAgKiBccGFyYW1baW5dICBwQ2xpZW50ICB0aGUgZGlzY29ubmVjdGVkIGNsaWVudAogICAgKi8KQEAgLTE0OCw3ICsxNDksNyBAQAogICAgKiBjbGllbnQgcmF0ZSBsaW1pdGluZyBhZnRlciBvbkNsaWVudENvbm5lY3RlZCByZXR1cm5zIGJ5IGJsb2NraW5nIHRoZQogICAgKiBzZXJ2ZSgpIHRocmVhZCBpZiB0aGUgbGltaXQgaGFzIGJlZW4gcmVhY2hlZC4KICAgICovCi0gIHZvaWQgbmV3bHlDb25uZWN0ZWRDbGllbnQoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpOworICB2b2lkIG5ld2x5Q29ubmVjdGVkQ2xpZW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCk7CiAKICAgLyoqCiAgICAqIFNtYXJ0IHBvaW50ZXIgY2xpZW50IGRlbGV0aW9uLgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAKaW5kZXggMmY2OWZmNC4uYmE3YTE4MyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCkBAIC0yOSw3ICsyOSw3IEBACiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBzdGQ6OnN0cmluZzsKIAogVFNpbXBsZVNlcnZlcjo6VFNpbXBsZVNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKQEAgLTc4LDggKzc4LDcgQEAKICAgVFNlcnZlckZyYW1ld29yazo6c2V0Q29uY3VycmVudENsaWVudExpbWl0KDEpOwogfQogCi1UU2ltcGxlU2VydmVyOjp+VFNpbXBsZVNlcnZlcigpIHsKLX0KK1RTaW1wbGVTZXJ2ZXI6On5UU2ltcGxlU2VydmVyKCkgPSBkZWZhdWx0OwogCiAvKioKICAqIFRoZSBtYWluIGJvZHkgb2YgY3VzdG9taXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgVFNpbXBsZVNlcnZlciBpcyBxdWl0ZSBzaW1wbGU6CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oCmluZGV4IDM5MWZiZWMuLjNhZmViNzkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oCkBAIC0zNCw0MSArMzQsNDEgQEAKIGNsYXNzIFRTaW1wbGVTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlckZyYW1ld29yayB7CiBwdWJsaWM6CiAgIFRTaW1wbGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOwogCiAgIFRTaW1wbGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CiAKICAgVFNpbXBsZVNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOwogCiAgIFRTaW1wbGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOwogCi0gIHZpcnR1YWwgflRTaW1wbGVTZXJ2ZXIoKTsKKyAgflRTaW1wbGVTZXJ2ZXIoKSBvdmVycmlkZTsKIAogcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIC8qIG92ZXJyaWRlICovOwotICB2aXJ0dWFsIHZvaWQgb25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisgIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSBvdmVycmlkZSAvKiBvdmVycmlkZSAqLzsKKyAgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSBvdmVycmlkZSAvKiBvdmVycmlkZSAqLzsKIAogcHJpdmF0ZToKLSAgdm9pZCBzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoaW50NjRfdCBuZXdMaW1pdCk7IC8vIGhpZGUKKyAgdm9pZCBzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoaW50NjRfdCBuZXdMaW1pdCkgb3ZlcnJpZGU7IC8vIGhpZGUKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwCmluZGV4IGVmZDdjMjMuLjEyMWRkZTMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwCkBAIC0zMCw3ICszMCw3IEBACiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBzdGQ6OnN0cmluZzsKIAogVFRocmVhZFBvb2xTZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LApAQCAtNjksNyArNjksNiBAQAogICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAogICAgIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAotICAgIHN0b3BfKGZhbHNlKSwKICAgICB0aW1lb3V0XygwKSwKICAgICB0YXNrRXhwaXJhdGlvbl8oMCkgewogfQpAQCAtODgsMTcgKzg3LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSksCiAgICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCi0gICAgc3RvcF8oZmFsc2UpLAogICAgIHRpbWVvdXRfKDApLAogICAgIHRhc2tFeHBpcmF0aW9uXygwKSB7CiB9CiAKLVRUaHJlYWRQb29sU2VydmVyOjp+VFRocmVhZFBvb2xTZXJ2ZXIoKSB7Ci19CitUVGhyZWFkUG9vbFNlcnZlcjo6flRUaHJlYWRQb29sU2VydmVyKCkgPSBkZWZhdWx0OwogCiB2b2lkIFRUaHJlYWRQb29sU2VydmVyOjpzZXJ2ZSgpIHsKICAgVFNlcnZlckZyYW1ld29yazo6c2VydmUoKTsKLSAgdGhyZWFkTWFuYWdlcl8tPmpvaW4oKTsKKyAgdGhyZWFkTWFuYWdlcl8tPnN0b3AoKTsKIH0KIAogaW50NjRfdCBUVGhyZWFkUG9vbFNlcnZlcjo6Z2V0VGltZW91dCgpIGNvbnN0IHsKQEAgLTExNywxNyArMTE0LDE4IEBACiAgIHRhc2tFeHBpcmF0aW9uXyA9IHZhbHVlOwogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+IFRUaHJlYWRQb29sU2VydmVyOjpnZXRUaHJlYWRNYW5hZ2VyKCkKLSAgICBjb25zdCB7CitzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPgorVFRocmVhZFBvb2xTZXJ2ZXI6OmdldFRocmVhZE1hbmFnZXIoKSBjb25zdCB7CiAgIHJldHVybiB0aHJlYWRNYW5hZ2VyXzsKIH0KIAogdm9pZCBUVGhyZWFkUG9vbFNlcnZlcjo6b25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgewotICB0aHJlYWRNYW5hZ2VyXy0+YWRkKHBDbGllbnQsIHRpbWVvdXRfLCB0YXNrRXhwaXJhdGlvbl8pOworICB0aHJlYWRNYW5hZ2VyXy0+YWRkKHBDbGllbnQsIGdldFRpbWVvdXQoKSwgZ2V0VGFza0V4cGlyYXRpb24oKSk7CiB9CiAKIHZvaWQgVFRocmVhZFBvb2xTZXJ2ZXI6Om9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQqKSB7CiB9CisKIH0KIH0KIH0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oCmluZGV4IDE4OWQ3ZTkuLmE5NDExYjggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBRFBPT0xTRVJWRVJfSF8KICNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFRIUkVBRFBPT0xTRVJWRVJfSF8gMQogCisjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmg+CiAKQEAgLTMzLDQ4ICszNCw0OCBAQAogY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlckZyYW1ld29yayB7CiBwdWJsaWM6CiAgIFRUaHJlYWRQb29sU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgogICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CiAKICAgVFRocmVhZFBvb2xTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKICAgICAgID0gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKCkpOwogCiAgIFRUaHJlYWRQb29sU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKICAgICAgID0gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKCkpOwogCiAgIFRUaHJlYWRQb29sU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgogICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CiAKLSAgdmlydHVhbCB+VFRocmVhZFBvb2xTZXJ2ZXIoKTsKKyAgflRUaHJlYWRQb29sU2VydmVyKCkgb3ZlcnJpZGU7CiAKICAgLyoqCiAgICAqIFBvc3QtY29uZGl0aW9ucyAocmV0dXJuIGd1YXJhbnRlZXMpOgogICAgKiAgIFRoZXJlIHdpbGwgYmUgbm8gY2xpZW50cyBjb25uZWN0ZWQuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgc2VydmUoKTsKKyAgdm9pZCBzZXJ2ZSgpIG92ZXJyaWRlOwogCiAgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lb3V0KCkgY29uc3Q7CiAgIHZpcnR1YWwgdm9pZCBzZXRUaW1lb3V0KGludDY0X3QgdmFsdWUpOwpAQCAtODIsMjAgKzgzLDE3IEBACiAgIHZpcnR1YWwgaW50NjRfdCBnZXRUYXNrRXhwaXJhdGlvbigpIGNvbnN0OwogICB2aXJ0dWFsIHZvaWQgc2V0VGFza0V4cGlyYXRpb24oaW50NjRfdCB2YWx1ZSk7CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+IGdldFRocmVhZE1hbmFnZXIoKSBjb25zdDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiBnZXRUaHJlYWRNYW5hZ2VyKCkgY29uc3Q7CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKLSAgdmlydHVhbCB2b2lkIG9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpIC8qIG92ZXJyaWRlICovOworICB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgb3ZlcnJpZGUgLyogb3ZlcnJpZGUgKi87CisgIHZvaWQgb25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgb3ZlcnJpZGUgLyogb3ZlcnJpZGUgKi87CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyXzsKLQotICB2b2xhdGlsZSBib29sIHN0b3BfOwotCi0gIHZvbGF0aWxlIGludDY0X3QgdGltZW91dF87Ci0KLSAgdm9sYXRpbGUgaW50NjRfdCB0YXNrRXhwaXJhdGlvbl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXJfOworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiB0aW1lb3V0XzsKKyAgc3RkOjphdG9taWM8aW50NjRfdD4gdGFza0V4cGlyYXRpb25fOwogfTsKKwogfQogfQogfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKaW5kZXggOTJmNWNmOC4uNzlkY2M3MCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcApAQCAtMTcsMjQgKzE3LDI3IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnkuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHNlcnZlciB7CiAKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIHN0ZDo6c3RyaW5nOwogCiBUVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKQEAgLTg2LDM1ICs4OSw2MyBAQAogICAgIHRocmVhZEZhY3RvcnlfKHRocmVhZEZhY3RvcnkpIHsKIH0KIAotVFRocmVhZGVkU2VydmVyOjp+VFRocmVhZGVkU2VydmVyKCkgewotfQorVFRocmVhZGVkU2VydmVyOjp+VFRocmVhZGVkU2VydmVyKCkgPSBkZWZhdWx0OwogCiB2b2lkIFRUaHJlYWRlZFNlcnZlcjo6c2VydmUoKSB7CiAgIFRTZXJ2ZXJGcmFtZXdvcms6OnNlcnZlKCk7CiAKLSAgLy8gRHJhaW4gYWxsIGNsaWVudHMgLSBubyBtb3JlIHdpbGwgYXJyaXZlCi0gIHRyeSB7Ci0gICAgU3luY2hyb25pemVkIHMoY2xpZW50c01vbml0b3JfKTsKLSAgICB3aGlsZSAoZ2V0Q29uY3VycmVudENsaWVudENvdW50KCkgPiAwKSB7Ci0gICAgICBjbGllbnRzTW9uaXRvcl8ud2FpdCgpOwotICAgIH0KLSAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdHgpIHsKLSAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXI6IEV4Y2VwdGlvbiBqb2luaW5nIHdvcmtlcnM6ICIpICsgdHgud2hhdCgpOwotICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgIC8vIEVuc3VyZSBwb3N0LWNvbmRpdGlvbiBvZiBubyBhY3RpdmUgY2xpZW50cworICBTeW5jaHJvbml6ZWQgcyhjbGllbnRNb25pdG9yXyk7CisgIHdoaWxlICghYWN0aXZlQ2xpZW50TWFwXy5lbXB0eSgpKSB7CisgICAgY2xpZW50TW9uaXRvcl8ud2FpdCgpOworICB9CisKKyAgZHJhaW5EZWFkQ2xpZW50cygpOworfQorCit2b2lkIFRUaHJlYWRlZFNlcnZlcjo6ZHJhaW5EZWFkQ2xpZW50cygpIHsKKyAgLy8gd2UncmUgaW4gYSBtb25pdG9yIGhlcmUKKyAgd2hpbGUgKCFkZWFkQ2xpZW50TWFwXy5lbXB0eSgpKSB7CisgICAgYXV0byBpdCA9IGRlYWRDbGllbnRNYXBfLmJlZ2luKCk7CisgICAgaXQtPnNlY29uZC0+am9pbigpOworICAgIGRlYWRDbGllbnRNYXBfLmVyYXNlKGl0KTsKICAgfQogfQogCiB2b2lkIFRUaHJlYWRlZFNlcnZlcjo6b25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgewotICB0aHJlYWRGYWN0b3J5Xy0+bmV3VGhyZWFkKHBDbGllbnQpLT5zdGFydCgpOworICBTeW5jaHJvbml6ZWQgc3luYyhjbGllbnRNb25pdG9yXyk7CisgIHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudFJ1bm5lcj4gcFJ1bm5hYmxlID0gbWFrZV9zaGFyZWQ8VENvbm5lY3RlZENsaWVudFJ1bm5lcj4ocENsaWVudCk7CisgIHNoYXJlZF9wdHI8VGhyZWFkPiBwVGhyZWFkID0gdGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZChwUnVubmFibGUpOworICBwUnVubmFibGUtPnRocmVhZChwVGhyZWFkKTsKKyAgYWN0aXZlQ2xpZW50TWFwXy5pbnNlcnQoQ2xpZW50TWFwOjp2YWx1ZV90eXBlKHBDbGllbnQuZ2V0KCksIHBUaHJlYWQpKTsKKyAgcFRocmVhZC0+c3RhcnQoKTsKIH0KIAogdm9pZCBUVGhyZWFkZWRTZXJ2ZXI6Om9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpIHsKLSAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShwQ2xpZW50KTsKLSAgU3luY2hyb25pemVkIHMoY2xpZW50c01vbml0b3JfKTsKLSAgaWYgKGdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpID09IDApIHsKLSAgICBjbGllbnRzTW9uaXRvcl8ubm90aWZ5KCk7CisgIFN5bmNocm9uaXplZCBzeW5jKGNsaWVudE1vbml0b3JfKTsKKyAgZHJhaW5EZWFkQ2xpZW50cygpOyAvLyB1c2UgdGhlIG91dGdvaW5nIHRocmVhZCB0byBkbyBzb21lIG1haW50ZW5hbmNlIG9uIG91ciBkZWFkIGNsaWVudCBiYWNrbG9nCisgIGF1dG8gaXQgPSBhY3RpdmVDbGllbnRNYXBfLmZpbmQocENsaWVudCk7CisgIGlmIChpdCAhPSBhY3RpdmVDbGllbnRNYXBfLmVuZCgpKSB7CisgICAgYXV0byBlbmQgPSBpdDsKKyAgICBkZWFkQ2xpZW50TWFwXy5pbnNlcnQoaXQsICsrZW5kKTsKKyAgICBhY3RpdmVDbGllbnRNYXBfLmVyYXNlKGl0KTsKKyAgfQorICBpZiAoYWN0aXZlQ2xpZW50TWFwXy5lbXB0eSgpKSB7CisgICAgY2xpZW50TW9uaXRvcl8ubm90aWZ5KCk7CiAgIH0KIH0KKworVFRocmVhZGVkU2VydmVyOjpUQ29ubmVjdGVkQ2xpZW50UnVubmVyOjpUQ29ubmVjdGVkQ2xpZW50UnVubmVyKGNvbnN0IHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpCisgIDogcENsaWVudF8ocENsaWVudCkgeworfQorCitUVGhyZWFkZWRTZXJ2ZXI6OlRDb25uZWN0ZWRDbGllbnRSdW5uZXI6On5UQ29ubmVjdGVkQ2xpZW50UnVubmVyKCkgPSBkZWZhdWx0OworCit2b2lkIFRUaHJlYWRlZFNlcnZlcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcjo6cnVuKCkgLyogb3ZlcnJpZGUgKi8geworICBwQ2xpZW50Xy0+cnVuKCk7ICAvLyBSdW4gdGhlIGNsaWVudAorICBwQ2xpZW50Xy5yZXNldCgpOyAvLyBUaGUgY2xpZW50IGlzIGRvbmUgLSByZWxlYXNlIGl0IGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIGRlc3RydWN0b3IgZm9yIHNhZmV0eQorfQorCiB9CiB9CiB9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oCmluZGV4IGNkYWNmZDcuLjc1NmU1YTAgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaApAQCAtMjAsOCArMjAsOSBAQAogI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFERURTRVJWRVJfSF8KICNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFRIUkVBREVEU0VSVkVSX0hfIDEKIAorI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaD4KIApAQCAtMzAsNjUgKzMxLDExMSBAQAogbmFtZXNwYWNlIHNlcnZlciB7CiAKIC8qKgotICogTWFuYWdlIGNsaWVudHMgdXNpbmcgYSB0aHJlYWQgcG9vbC4KKyAqIE1hbmFnZSBjbGllbnRzIHVzaW5nIHRocmVhZHMgLSB0aHJlYWRzIGFyZSBjcmVhdGVkIG9uZSBmb3IgZWFjaCBjbGllbnQgYW5kIGFyZQorICogcmVsZWFzZWQgd2hlbiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLiAgVGhpcyBzZXJ2ZXIgaXMgdXNlZCB0byBtYWtlIGEgZHluYW1pY2FsbHkKKyAqIHNjYWxhYmxlIHNlcnZlciB1cCB0byB0aGUgY29uY3VycmVudCBjb25uZWN0aW9uIGxpbWl0LgogICovCiBjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlckZyYW1ld29yayB7CiBwdWJsaWM6CiAgIFRUaHJlYWRlZFNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQotICAgICAgPSBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAotICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeShmYWxzZSkpKTsKIAogICBUVGhyZWFkZWRTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5Ci0gICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCi0gICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeShmYWxzZSkpKTsKIAogICBUVGhyZWFkZWRTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5Ci0gICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCi0gICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5KGZhbHNlKSkpOwogCiAgIFRUaHJlYWRlZFNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5Ci0gICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCi0gICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeShmYWxzZSkpKTsKIAotICB2aXJ0dWFsIH5UVGhyZWFkZWRTZXJ2ZXIoKTsKKyAgflRUaHJlYWRlZFNlcnZlcigpIG92ZXJyaWRlOwogCiAgIC8qKgogICAgKiBQb3N0LWNvbmRpdGlvbnMgKHJldHVybiBndWFyYW50ZWVzKToKICAgICogICBUaGVyZSB3aWxsIGJlIG5vIGNsaWVudHMgY29ubmVjdGVkLgogICAgKi8KLSAgdmlydHVhbCB2b2lkIHNlcnZlKCk7CisgIHZvaWQgc2VydmUoKSBvdmVycmlkZTsKIAogcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIC8qIG92ZXJyaWRlICovOwotICB2aXJ0dWFsIHZvaWQgb25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisgIC8qKgorICAgKiBEcmFpbiByZWNlbnRseSBjb25uZWN0ZWQgY2xpZW50cyBieSBqb2luaW5nIHRoZWlyIHRocmVhZHMgLSB0aGlzIGlzIGRvbmUgbGF6aWx5IGJlY2F1c2UKKyAgICogd2UgY2Fubm90IGRvIGl0IGluc2lkZSB0aGUgdGhyZWFkIGNvbnRleHQgdGhhdCBpcyBkaXNjb25uZWN0aW5nLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGRyYWluRGVhZENsaWVudHMoKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOwotICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3IgY2xpZW50c01vbml0b3JfOworICAvKioKKyAgICogSW1wbGVtZW50YXRpb24gb2YgVFNlcnZlckZyYW1ld29yazo6b25DbGllbnRDb25uZWN0ZWQKKyAgICovCisgIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSBvdmVycmlkZSAvKiBvdmVycmlkZSAqLzsKKworICAvKioKKyAgICogSW1wbGVtZW50YXRpb24gb2YgVFNlcnZlckZyYW1ld29yazo6b25DbGllbnREaXNjb25uZWN0ZWQKKyAgICovCisgIHZvaWQgb25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCAqcENsaWVudCkgb3ZlcnJpZGUgLyogb3ZlcnJpZGUgKi87CisKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87CisKKyAgLyoqCisgICAqIEEgaGVscGVyIHdyYXBwZXIgdXNlZCB0byB3cmFwIHRoZSBjbGllbnQgaW4gc29tZXRoaW5nIHdlIGNhbiB1c2UgdG8gbWFpbnRhaW4KKyAgICogdGhlIGxpZmV0aW1lIG9mIHRoZSBjb25uZWN0ZWQgY2xpZW50IHdpdGhpbiBhIGRldGFjaGVkIHRocmVhZC4gIFdlIGNhbm5vdCBzaW1wbHkKKyAgICogdHJhY2sgdGhlIHRocmVhZHMgYmVjYXVzZSBhIHNoYXJlZF9wdHI8VGhyZWFkPiBoYW5ncyBvbiB0byB0aGUgUnVubmFibGUgaXQgaXMKKyAgICogcGFzc2VkLCBhbmQgVFNlcnZlckZyYW1ld29yayByZXF1aXJlcyB0aGUgcnVubmFibGUgKFRDb25uZWN0ZWRDbGllbnQpIHRvIGJlCisgICAqIGRlc3Ryb3llZCBpbiBvcmRlciB0byB3b3JrIHByb3Blcmx5LgorICAgKi8KKyAgY2xhc3MgVENvbm5lY3RlZENsaWVudFJ1bm5lciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlCisgIHsKKyAgcHVibGljOgorICAgIFRDb25uZWN0ZWRDbGllbnRSdW5uZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KTsKKyAgICB+VENvbm5lY3RlZENsaWVudFJ1bm5lcigpIG92ZXJyaWRlOworICAgIHZvaWQgcnVuKCkgb3ZlcnJpZGUgLyogb3ZlcnJpZGUgKi87CisgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+IHBDbGllbnRfOworICB9OworCisgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvciBjbGllbnRNb25pdG9yXzsKKworICB0eXBlZGVmIHN0ZDo6bWFwPFRDb25uZWN0ZWRDbGllbnQgKiwgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiA+IENsaWVudE1hcDsKKworICAvKioKKyAgICogQSBtYXAgb2YgYWN0aXZlIGNsaWVudHMKKyAgICovCisgIENsaWVudE1hcCBhY3RpdmVDbGllbnRNYXBfOworCisgIC8qKgorICAgKiBBIG1hcCBvZiBjbGllbnRzIHRoYXQgaGF2ZSBkaXNjb25uZWN0ZWQgYnV0IHRoZWlyIHRocmVhZHMgaGF2ZSBub3QgYmVlbiBqb2luZWQKKyAgICovCisgIENsaWVudE1hcCBkZWFkQ2xpZW50TWFwXzsKIH07CisKIH0KIH0KIH0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RocmlmdF9leHBvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90aHJpZnRfZXhwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjMDU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90aHJpZnRfZXhwb3J0LmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBUSFJJRlRfRVhQT1JUX0gKKyNkZWZpbmUgVEhSSUZUX0VYUE9SVF9ICisKKyNpZmRlZiBUSFJJRlRfU1RBVElDX0RFRklORQorIyAgZGVmaW5lIFRIUklGVF9FWFBPUlQKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIgKQorIyAgaWZuZGVmIFRIUklGVF9FWFBPUlQKKyMgICAgaWZkZWYgdGhyaWZ0X0VYUE9SVFMKKyAgICAgICAgICAvKiBXZSBhcmUgYnVpbGRpbmcgdGhpcyBsaWJyYXJ5ICovCisjICAgICAgZGVmaW5lIFRIUklGVF9FWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgIGVsc2UKKyAgICAgICAgICAvKiBXZSBhcmUgdXNpbmcgdGhpcyBsaWJyYXJ5ICovCisjICAgICAgZGVmaW5lIFRIUklGVF9FWFBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBUSFJJRlRfRVhQT1JUCisjZW5kaWYKKworI2VuZGlmIC8qIFRIUklGVF9FWFBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oCmluZGV4IDk2YTNkYTMuLjk1OTEwNTggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmgKQEAgLTIzLDYgKzIzLDcgQEAKICMgIGRlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8KIAogI2lmZGVmIF9XSU4zMgorIyAgaW5jbHVkZSA8d2luc29jazIuaD4KICMgIGRlZmluZSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA6OldTQUdldExhc3RFcnJvcigpCiAjICBkZWZpbmUgVEhSSUZUX0VSUk5PICgqX2Vycm5vKCkpCiAjICBkZWZpbmUgVEhSSUZUX0VJTlBST0dSRVNTIFdTQUVJTlBST0dSRVNTCkBAIC01MCw2ICs1MSw4IEBACiAjICBkZWZpbmUgVEhSSUZUX0xTRUVLIF9sc2VlawogIyAgZGVmaW5lIFRIUklGVF9XUklURSBfd3JpdGUKICMgIGRlZmluZSBUSFJJRlRfUkVBRCBfcmVhZAorIyAgZGVmaW5lIFRIUklGVF9JT0NUTF9TT0NLRVQgaW9jdGxzb2NrZXQKKyMgIGRlZmluZSBUSFJJRlRfSU9DVExfU09DS0VUX05VTV9CWVRFU19UWVBFIHVfbG9uZwogIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBfZnN0YXQKICMgIGRlZmluZSBUSFJJRlRfU1RBVCBfc3RhdAogIyAgaWZkZWYgX1dJTjMyX1dDRQpAQCAtNTgsNyArNjEsMTEgQEAKICMgICAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IgZ2FpX3N0cmVycm9yQQogIyAgZW5kaWYKICMgIGRlZmluZSBUSFJJRlRfU1NJWkVUIHB0cmRpZmZfdAotIyAgZGVmaW5lIFRIUklGVF9TTlBSSU5URiBfc25wcmludGYKKyMgIGlmIChfTVNDX1ZFUiA8IDE5MDApCisjICAgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgX3NucHJpbnRmCisjICBlbHNlCisjICAgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgc25wcmludGYKKyMgIGVuZGlmCiAjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1NFQyB0aHJpZnRfc2xlZXAKICMgIGRlZmluZSBUSFJJRlRfU0xFRVBfVVNFQyB0aHJpZnRfdXNsZWVwCiAjICBkZWZpbmUgVEhSSUZUX1RJTUVTUEVDIHRocmlmdF90aW1lc3BlYwpAQCAtNzQsNiArODEsOSBAQAogIyAgICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgUE9MTE9VVAogIyAgZW5kaWYgLy9XSU5WRVIKICMgIGRlZmluZSBUSFJJRlRfU0hVVF9SRFdSIFNEX0JPVEgKKyMgIGlmICFkZWZpbmVkKEFJX0FERFJDT05GSUcpCisjICAgIGRlZmluZSBBSV9BRERSQ09ORklHIDB4MDAwMDA0MDAKKyMgIGVuZGlmCiAjZWxzZSAvL25vdCBfV0lOMzIKICMgIGluY2x1ZGUgPGVycm5vLmg+CiAjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgZXJybm8KQEAgLTEwMyw2ICsxMTMsOCBAQAogIyAgZGVmaW5lIFRIUklGVF9MU0VFSyBsc2VlawogIyAgZGVmaW5lIFRIUklGVF9XUklURSB3cml0ZQogIyAgZGVmaW5lIFRIUklGVF9SRUFEIHJlYWQKKyMgIGRlZmluZSBUSFJJRlRfSU9DVExfU09DS0VUIGlvY3RsCisjICBkZWZpbmUgVEhSSUZUX0lPQ1RMX1NPQ0tFVF9OVU1fQllURVNfVFlQRSBpbnQKICMgIGRlZmluZSBUSFJJRlRfU1RBVCBzdGF0CiAjICBkZWZpbmUgVEhSSUZUX0ZTVEFUIGZzdGF0CiAjICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiBnYWlfc3RyZXJyb3IKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAKaW5kZXggNzAwYmRkNS4uNGJiODcxMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKIG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCiB1aW50MzJfdCBUQnVmZmVyZWRUcmFuc3BvcnQ6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHVpbnQzMl90IGhhdmUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCYXNlXyk7CisgIGF1dG8gaGF2ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKTsKIAogICAvLyBXZSBzaG91bGQgb25seSB0YWtlIHRoZSBzbG93IHBhdGggaWYgd2UgY2FuJ3Qgc2F0aXNmeSB0aGUgcmVhZAogICAvLyB3aXRoIHRoZSBkYXRhIGFscmVhZHkgaW4gdGhlIGJ1ZmZlci4KQEAgLTYxLDggKzYxLDggQEAKIH0KIAogdm9pZCBUQnVmZmVyZWRUcmFuc3BvcnQ6OndyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB1aW50MzJfdCBoYXZlX2J5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHdCdWZfLmdldCgpKTsKLSAgdWludDMyX3Qgc3BhY2UgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0JvdW5kXyAtIHdCYXNlXyk7CisgIGF1dG8gaGF2ZV9ieXRlcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7CisgIGF1dG8gc3BhY2UgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0JvdW5kXyAtIHdCYXNlXyk7CiAgIC8vIFdlIHNob3VsZCBvbmx5IHRha2UgdGhlIHNsb3cgcGF0aCBpZiB3ZSBjYW4ndCBhY2NvbW1vZGF0ZSB0aGUgd3JpdGUKICAgLy8gd2l0aCB0aGUgZnJlZSBzcGFjZSBhbHJlYWR5IGluIHRoZSBidWZmZXIuCiAgIGFzc2VydCh3Qm91bmRfIC0gd0Jhc2VfIDwgc3RhdGljX2Nhc3Q8cHRyZGlmZl90PihsZW4pKTsKQEAgLTExNCwxMiArMTE0LDEyIEBACiAgICh2b2lkKWxlbjsKICAgLy8gU2ltcGx5IHJldHVybiBOVUxMLiAgV2UgZG9uJ3Qga25vdyBpZiB0aGVyZSBpcyBhY3R1YWxseSBkYXRhIGF2YWlsYWJsZSBvbgogICAvLyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIHNvIGNhbGxpbmcgcmVhZCgpIG1pZ2h0IGJsb2NrLgotICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIHZvaWQgVEJ1ZmZlcmVkVHJhbnNwb3J0OjpmbHVzaCgpIHsKICAgLy8gV3JpdGUgb3V0IGFueSBkYXRhIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlci4KLSAgdWludDMyX3QgaGF2ZV9ieXRlcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7CisgIGF1dG8gaGF2ZV9ieXRlcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7CiAgIGlmIChoYXZlX2J5dGVzID4gMCkgewogICAgIC8vIE5vdGUgdGhhdCB3ZSByZXNldCB3QmFzZV8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKICAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQpAQCAtMTM0LDcgKzEzNCw3IEBACiAKIHVpbnQzMl90IFRGcmFtZWRUcmFuc3BvcnQ6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CiAgIHVpbnQzMl90IHdhbnQgPSBsZW47Ci0gIHVpbnQzMl90IGhhdmUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCYXNlXyk7CisgIGF1dG8gaGF2ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKTsKIAogICAvLyBXZSBzaG91bGQgb25seSB0YWtlIHRoZSBzbG93IHBhdGggaWYgd2UgY2FuJ3Qgc2F0aXNmeSB0aGUgcmVhZAogICAvLyB3aXRoIHRoZSBkYXRhIGFscmVhZHkgaW4gdGhlIGJ1ZmZlci4KQEAgLTIxNyw3ICsyMTcsNyBAQAogCiB2b2lkIFRGcmFtZWRUcmFuc3BvcnQ6OndyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICAvLyBEb3VibGUgYnVmZmVyIHNpemUgdW50aWwgc3VmZmljaWVudC4KLSAgdWludDMyX3QgaGF2ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7CisgIGF1dG8gaGF2ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7CiAgIHVpbnQzMl90IG5ld19zaXplID0gd0J1ZlNpemVfOwogICBpZiAobGVuICsgaGF2ZSA8IGhhdmUgLyogb3ZlcmZsb3cgKi8gfHwgbGVuICsgaGF2ZSA+IDB4N2ZmZmZmZmYpIHsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLApAQCAtMjMxLDcgKzIzMSw3IEBACiAgIC8vIHNvIHdlIGNhbiB1c2UgcmVhbGxvYyBoZXJlLgogCiAgIC8vIEFsbG9jYXRlIG5ldyBidWZmZXIuCi0gIHVpbnQ4X3QqIG5ld19idWYgPSBuZXcgdWludDhfdFtuZXdfc2l6ZV07CisgIGF1dG8qIG5ld19idWYgPSBuZXcgdWludDhfdFtuZXdfc2l6ZV07CiAKICAgLy8gQ29weSB0aGUgb2xkIGJ1ZmZlciB0byB0aGUgbmV3IG9uZS4KICAgbWVtY3B5KG5ld19idWYsIHdCdWZfLmdldCgpLCBoYXZlKTsKQEAgLTI5MiwxMiArMjkyLDEyIEBACiAgIC8vIERvbid0IHRyeSB0byBiZSBjbGV2ZXIgd2l0aCBzaGlmdGluZyBidWZmZXJzLgogICAvLyBJZiB0aGUgZmFzdCBwYXRoIGZhaWxlZCBsZXQgdGhlIHByb3RvY29sIHVzZSBpdHMgc2xvdyBwYXRoLgogICAvLyBCZXNpZGVzLCB3aG8gaXMgZ29pbmcgdG8gdHJ5IHRvIGJvcnJvdyBhY3Jvc3MgbWVzc2FnZXM/Ci0gIHJldHVybiBOVUxMOworICByZXR1cm4gbnVsbHB0cjsKIH0KIAogdWludDMyX3QgVEZyYW1lZFRyYW5zcG9ydDo6cmVhZEVuZCgpIHsKICAgLy8gaW5jbHVkZSBmcmFtaW5nIGJ5dGVzCi0gIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCdWZfLmdldCgpICsgc2l6ZW9mKHVpbnQzMl90KSk7CisgIGF1dG8gYnl0ZXNfcmVhZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJ1Zl8uZ2V0KCkgKyBzaXplb2YodWludDMyX3QpKTsKIAogICBpZiAockJ1ZlNpemVfID4gYnVmUmVjbGFpbVRocmVzaF8pIHsKICAgICByQnVmU2l6ZV8gPSAwOwpAQCAtMzM1LDcgKzMzNSw3IEBACiAKIHVpbnQzMl90IFRNZW1vcnlCdWZmZXI6OnJlYWRBcHBlbmRUb1N0cmluZyhzdGQ6OnN0cmluZyYgc3RyLCB1aW50MzJfdCBsZW4pIHsKICAgLy8gRG9uJ3QgZ2V0IHNvbWUgc3R1cGlkIGFzc2VydGlvbiBmYWlsdXJlLgotICBpZiAoYnVmZmVyXyA9PSBOVUxMKSB7CisgIGlmIChidWZmZXJfID09IG51bGxwdHIpIHsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0zNjEsMTUgKzM2MSwxOSBAQAogICB9CiAKICAgLy8gR3JvdyB0aGUgYnVmZmVyIGFzIG5lY2Vzc2FyeS4KLSAgdWludDMyX3QgbmV3X3NpemUgPSBidWZmZXJTaXplXzsKKyAgdWludDY0X3QgbmV3X3NpemUgPSBidWZmZXJTaXplXzsKICAgd2hpbGUgKGxlbiA+IGF2YWlsKSB7CiAgICAgbmV3X3NpemUgPSBuZXdfc2l6ZSA+IDAgPyBuZXdfc2l6ZSAqIDIgOiAxOwotICAgIGF2YWlsID0gYXZhaWxhYmxlX3dyaXRlKCkgKyAobmV3X3NpemUgLSBidWZmZXJTaXplXyk7CisgICAgaWYgKG5ld19zaXplID4gbWF4QnVmZmVyU2l6ZV8pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcm5hbCBidWZmZXIgc2l6ZSBvdmVyZmxvdyIpOworICAgIH0KKyAgICBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpICsgKHN0YXRpY19jYXN0PHVpbnQzMl90PihuZXdfc2l6ZSkgLSBidWZmZXJTaXplXyk7CiAgIH0KIAogICAvLyBBbGxvY2F0ZSBpbnRvIGEgbmV3IHBvaW50ZXIgc28gd2UgZG9uJ3QgYm9yayBvdXJzIGlmIGl0IGZhaWxzLgotICB1aW50OF90KiBuZXdfYnVmZmVyID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KHN0ZDo6cmVhbGxvYyhidWZmZXJfLCBuZXdfc2l6ZSkpOwotICBpZiAobmV3X2J1ZmZlciA9PSBOVUxMKSB7CisgIGF1dG8qIG5ld19idWZmZXIgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oc3RkOjpyZWFsbG9jKGJ1ZmZlcl8sIG5ld19zaXplKSk7CisgIGlmIChuZXdfYnVmZmVyID09IG51bGxwdHIpIHsKICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICB9CiAKQEAgLTM3OCw3ICszODIsNyBAQAogICB3QmFzZV8gPSBuZXdfYnVmZmVyICsgKHdCYXNlXyAtIGJ1ZmZlcl8pOwogICB3Qm91bmRfID0gbmV3X2J1ZmZlciArIG5ld19zaXplOwogICBidWZmZXJfID0gbmV3X2J1ZmZlcjsKLSAgYnVmZmVyU2l6ZV8gPSBuZXdfc2l6ZTsKKyAgYnVmZmVyU2l6ZV8gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obmV3X3NpemUpOwogfQogCiB2b2lkIFRNZW1vcnlCdWZmZXI6OndyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewpAQCAtNDA0LDcgKzQwOCw3IEBACiAgICAgKmxlbiA9IGF2YWlsYWJsZV9yZWFkKCk7CiAgICAgcmV0dXJuIHJCYXNlXzsKICAgfQotICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIG51bGxwdHI7CiB9CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgKaW5kZXggOThlOGE5ZS4uZGYwNjU4NiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaApAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAqIHBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBvcGVyYXRpb24sIHNvIGl0IGlzIG9rYXkgdG8ganVzdCBsZWF2ZSBpdCB0bwogICAgKiB0aGUgY29uY3JldGUgY2xhc3MgdG8gc2V0IHVwIHBvaW50ZXJzIGNvcnJlY3RseS4KICAgICovCi0gIFRCdWZmZXJCYXNlKCkgOiByQmFzZV8oTlVMTCksIHJCb3VuZF8oTlVMTCksIHdCYXNlXyhOVUxMKSwgd0JvdW5kXyhOVUxMKSB7fQorICBUQnVmZmVyQmFzZSgpIDogckJhc2VfKG51bGxwdHIpLCByQm91bmRfKG51bGxwdHIpLCB3QmFzZV8obnVsbHB0ciksIHdCb3VuZF8obnVsbHB0cikge30KIAogICAvLy8gQ29udmVuaWVuY2UgbXV0YXRvciBmb3Igc2V0dGluZyB0aGUgcmVhZCBidWZmZXIuCiAgIHZvaWQgc2V0UmVhZEJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewpAQCAtMTYyLDcgKzE2Miw3IEBACiAgICAgd0JvdW5kXyA9IGJ1ZiArIGxlbjsKICAgfQogCi0gIHZpcnR1YWwgflRCdWZmZXJCYXNlKCkge30KKyAgflRCdWZmZXJCYXNlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgIC8vLyBSZWFkcyBiZWdpbiBoZXJlLgogICB1aW50OF90KiByQmFzZV87CkBAIC0xODYsNyArMTg2LDcgQEAKICAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEyOwogCiAgIC8vLyBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCi0gIFRCdWZmZXJlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCisgIFRCdWZmZXJlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQogICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAogICAgICAgckJ1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLAogICAgICAgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLApAQCAtMTk2LDcgKzE5Niw3IEBACiAgIH0KIAogICAvLy8gVXNlIHNwZWNpZmllZCBidWZmZXIgc2l6ZXMuCi0gIFRCdWZmZXJlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6KQorICBUQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgdWludDMyX3Qgc3opCiAgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCiAgICAgICByQnVmU2l6ZV8oc3opLAogICAgICAgd0J1ZlNpemVfKHN6KSwKQEAgLTIwNiw3ICsyMDYsNyBAQAogICB9CiAKICAgLy8vIFVzZSBzcGVjaWZpZWQgcmVhZCBhbmQgd3JpdGUgYnVmZmVyIHNpemVzLgotICBUQnVmZmVyZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCB1aW50MzJfdCByc3osIHVpbnQzMl90IHdzeikKKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHJzeiwgdWludDMyX3Qgd3N6KQogICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAogICAgICAgckJ1ZlNpemVfKHJzeiksCiAgICAgICB3QnVmU2l6ZV8od3N6KSwKQEAgLTIxNSwzMiArMjE1LDMyIEBACiAgICAgaW5pdFBvaW50ZXJzKCk7CiAgIH0KIAotICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQorICB2b2lkIG9wZW4oKSBvdmVycmlkZSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQogCi0gIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7IH0KKyAgYm9vbCBpc09wZW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsgfQogCi0gIGJvb2wgcGVlaygpIHsKKyAgYm9vbCBwZWVrKCkgb3ZlcnJpZGUgewogICAgIGlmIChyQmFzZV8gPT0gckJvdW5kXykgewogICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgdHJhbnNwb3J0Xy0+cmVhZChyQnVmXy5nZXQoKSwgckJ1ZlNpemVfKSk7CiAgICAgfQogICAgIHJldHVybiAockJvdW5kXyA+IHJCYXNlXyk7CiAgIH0KIAotICB2b2lkIGNsb3NlKCkgeworICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGUgewogICAgIGZsdXNoKCk7CiAgICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIHdyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZvaWQgd3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSBvdmVycmlkZTsKIAotICB2b2lkIGZsdXNoKCk7CisgIHZvaWQgZmx1c2goKSBvdmVycmlkZTsKIAogICAvKioKICAgICogUmV0dXJucyB0aGUgb3JpZ2luIG9mIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAogICAgKi8KLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5nZXRPcmlnaW4oKTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cmFuc3BvcnRfLT5nZXRPcmlnaW4oKTsgfQogCiAgIC8qKgogICAgKiBUaGUgZm9sbG93aW5nIGJlaGF2aW9yIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBieSBUQnVmZmVyZWRUcmFuc3BvcnQsCkBAIC0yNTMsOSArMjUzLDkgQEAKICAgICogICAgd2lsbCBldmVyIGhhdmUgdG8gYmUgY29waWVkIGFnYWluLiAgRm9yIG9wdGltaWFsIHBlcmZvcm1hbmNlLAogICAgKiAgICBzdGF5IHVuZGVyIHRoaXMgbGltaXQuCiAgICAqLwotICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKKyAgY29uc3QgdWludDhfdCogYm9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIG92ZXJyaWRlOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7IHJldHVybiB0cmFuc3BvcnRfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQogCiAgIC8qCiAgICAqIFRWaXJ0dWFsVHJhbnNwb3J0IHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiByZWFkQWxsKCkuCkBAIC0yNzAsNyArMjcwLDcgQEAKICAgICAvLyBXcml0ZSBzaXplIG5ldmVyIGNoYW5nZXMuCiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKIAogICB1aW50MzJfdCByQnVmU2l6ZV87CiAgIHVpbnQzMl90IHdCdWZTaXplXzsKQEAgLTI4NCwxNSArMjg0LDE1IEBACiAgKi8KIGNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFRyYW5zcG9ydEZhY3RvcnkgewogcHVibGljOgotICBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpID0gZGVmYXVsdDsKIAotICB2aXJ0dWFsIH5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KKyAgflRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKICAgLyoqCiAgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGJ1ZmZlcmVkIG9uZS4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpKTsKICAgfQogfTsKIApAQCAtMzA5LDcgKzMwOSwxNyBAQAogICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfTUFYX0ZSQU1FX1NJWkUgPSAyNTYgKiAxMDI0ICogMTAyNDsKIAogICAvLy8gVXNlIGRlZmF1bHQgYnVmZmVyIHNpemVzLgotICBURnJhbWVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKyAgVEZyYW1lZFRyYW5zcG9ydCgpCisgICAgOiB0cmFuc3BvcnRfKCksCisgICAgICByQnVmU2l6ZV8oMCksCisgICAgICB3QnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSksCisgICAgICByQnVmXygpLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSksCisgICAgICBidWZSZWNsYWltVGhyZXNoXygoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkgeworICAgIGluaXRQb2ludGVycygpOworICB9CisKKyAgVEZyYW1lZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQogICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAogICAgICAgckJ1ZlNpemVfKDApLAogICAgICAgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLApAQCAtMzIwLDcgKzMzMCw3IEBACiAgICAgaW5pdFBvaW50ZXJzKCk7CiAgIH0KIAotICBURnJhbWVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgVEZyYW1lZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN6LAogICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1ZlJlY2xhaW1UaHJlc2ggPSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKICAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKQEAgLTMzMyw0MSArMzQzLDQxIEBACiAgICAgaW5pdFBvaW50ZXJzKCk7CiAgIH0KIAotICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQorICB2b2lkIG9wZW4oKSBvdmVycmlkZSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQogCi0gIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7IH0KKyAgYm9vbCBpc09wZW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsgfQogCi0gIGJvb2wgcGVlaygpIHsgcmV0dXJuIChyQmFzZV8gPCByQm91bmRfKSB8fCB0cmFuc3BvcnRfLT5wZWVrKCk7IH0KKyAgYm9vbCBwZWVrKCkgb3ZlcnJpZGUgeyByZXR1cm4gKHJCYXNlXyA8IHJCb3VuZF8pIHx8IHRyYW5zcG9ydF8tPnBlZWsoKTsgfQogCi0gIHZvaWQgY2xvc2UoKSB7CisgIHZvaWQgY2xvc2UoKSBvdmVycmlkZSB7CiAgICAgZmx1c2goKTsKICAgICB0cmFuc3BvcnRfLT5jbG9zZSgpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IHJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgd3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBmbHVzaCgpOworICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGU7CiAKLSAgdWludDMyX3QgcmVhZEVuZCgpOworICB1aW50MzJfdCByZWFkRW5kKCkgb3ZlcnJpZGU7CiAKLSAgdWludDMyX3Qgd3JpdGVFbmQoKTsKKyAgdWludDMyX3Qgd3JpdGVFbmQoKSBvdmVycmlkZTsKIAotICBjb25zdCB1aW50OF90KiBib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7CisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSBvdmVycmlkZTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KIAogICAvKgogICAgKiBUVmlydHVhbFRyYW5zcG9ydCBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVhZEFsbCgpLgogICAgKiBXZSB3YW50IHRvIHVzZSB0aGUgVEJ1ZmZlckJhc2UgdmVyc2lvbiBpbnN0ZWFkLgogICAgKi8KLSAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gVEJ1ZmZlckJhc2U6OnJlYWRBbGwoYnVmLCBsZW4pOyB9CisgIHVzaW5nIFRCdWZmZXJCYXNlOjpyZWFkQWxsOwogCiAgIC8qKgogICAgKiBSZXR1cm5zIHRoZSBvcmlnaW4gb2YgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CiAgICAqLwotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmdldE9yaWdpbigpOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmdldE9yaWdpbigpOyB9CiAKICAgLyoqCiAgICAqIFNldCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBmcmFtZSBhdCByZWFkCkBAIC0zODYsMTAgKzM5NiwxMCBAQAogICAgKiBSZXR1cm5zIHRydWUgaWYgYSBmcmFtZSB3YXMgcmVhZCBzdWNjZXNzZnVsbHksIG9yIGZhbHNlIG9uIEVPRi4KICAgICogKFJhaXNlcyBhIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgRU9GIG9jY3VycyBhZnRlciBhIHBhcnRpYWwgZnJhbWUuKQogICAgKi8KLSAgYm9vbCByZWFkRnJhbWUoKTsKKyAgdmlydHVhbCBib29sIHJlYWRGcmFtZSgpOwogCiAgIHZvaWQgaW5pdFBvaW50ZXJzKCkgewotICAgIHNldFJlYWRCdWZmZXIoTlVMTCwgMCk7CisgICAgc2V0UmVhZEJ1ZmZlcihudWxscHRyLCAwKTsKICAgICBzZXRXcml0ZUJ1ZmZlcih3QnVmXy5nZXQoKSwgd0J1ZlNpemVfKTsKIAogICAgIC8vIFBhZCB0aGUgYnVmZmVyIHNvIHdlIGNhbiBpbnNlcnQgdGhlIHNpemUgbGF0ZXIuCkBAIC0zOTcsNyArNDA3LDcgQEAKICAgICB0aGlzLT53cml0ZSgodWludDhfdCopJnBhZCwgc2l6ZW9mKHBhZCkpOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CiAKICAgdWludDMyX3QgckJ1ZlNpemVfOwogICB1aW50MzJfdCB3QnVmU2l6ZV87CkBAIC00MTMsMTUgKzQyMywxNSBAQAogICovCiBjbGFzcyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CiBwdWJsaWM6Ci0gIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KKyAgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKSA9IGRlZmF1bHQ7CiAKLSAgdmlydHVhbCB+VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQorICB+VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKICAgLyoqCiAgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGZyYW1lZCBvbmUuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucykpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgb3ZlcnJpZGUgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpKTsKICAgfQogfTsKIApAQCAtNDM4LDExICs0NDgsMTQgQEAKIHByaXZhdGU6CiAgIC8vIENvbW1vbiBpbml0aWFsaXphdGlvbiBkb25lIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCiAgIHZvaWQgaW5pdENvbW1vbih1aW50OF90KiBidWYsIHVpbnQzMl90IHNpemUsIGJvb2wgb3duZXIsIHVpbnQzMl90IHdQb3MpIHsKLSAgICBpZiAoYnVmID09IE5VTEwgJiYgc2l6ZSAhPSAwKSB7CisKKyAgICBtYXhCdWZmZXJTaXplXyA9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpOworCisgICAgaWYgKGJ1ZiA9PSBudWxscHRyICYmIHNpemUgIT0gMCkgewogICAgICAgYXNzZXJ0KG93bmVyKTsKICAgICAgIGJ1ZiA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplKTsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgICAgaWYgKGJ1ZiA9PSBudWxscHRyKSB7CisJdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKICAgICAgIH0KICAgICB9CiAKQEAgLTQ5MCw3ICs1MDMsNyBAQAogICAgKiBDb25zdHJ1Y3QgYSBUTWVtb3J5QnVmZmVyIHdpdGggYSBkZWZhdWx0LXNpemVkIGJ1ZmZlciwKICAgICogb3duZWQgYnkgdGhlIFRNZW1vcnlCdWZmZXIgb2JqZWN0LgogICAgKi8KLSAgVE1lbW9yeUJ1ZmZlcigpIHsgaW5pdENvbW1vbihOVUxMLCBkZWZhdWx0U2l6ZSwgdHJ1ZSwgMCk7IH0KKyAgVE1lbW9yeUJ1ZmZlcigpIHsgaW5pdENvbW1vbihudWxscHRyLCBkZWZhdWx0U2l6ZSwgdHJ1ZSwgMCk7IH0KIAogICAvKioKICAgICogQ29uc3RydWN0IGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGEgYnVmZmVyIG9mIGEgc3BlY2lmaWVkIHNpemUsCkBAIC00OTgsNyArNTExLDcgQEAKICAgICoKICAgICogQHBhcmFtIHN6ICBUaGUgaW5pdGlhbCBzaXplIG9mIHRoZSBidWZmZXIuCiAgICAqLwotICBUTWVtb3J5QnVmZmVyKHVpbnQzMl90IHN6KSB7IGluaXRDb21tb24oTlVMTCwgc3osIHRydWUsIDApOyB9CisgIFRNZW1vcnlCdWZmZXIodWludDMyX3Qgc3opIHsgaW5pdENvbW1vbihudWxscHRyLCBzeiwgdHJ1ZSwgMCk7IH0KIAogICAvKioKICAgICogQ29uc3RydWN0IGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGJ1ZiBhcyBpdHMgaW5pdGlhbCBjb250ZW50cy4KQEAgLTUxMSw3ICs1MjQsNyBAQAogICAgKiBAcGFyYW0gcG9saWN5IFNlZSBAbGluayBNZW1vcnlQb2xpY3kgQGVuZGxpbmsgLgogICAgKi8KICAgVE1lbW9yeUJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IHN6LCBNZW1vcnlQb2xpY3kgcG9saWN5ID0gT0JTRVJWRSkgewotICAgIGlmIChidWYgPT0gTlVMTCAmJiBzeiAhPSAwKSB7CisgICAgaWYgKGJ1ZiA9PSBudWxscHRyICYmIHN6ICE9IDApIHsKICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUTWVtb3J5QnVmZmVyIGdpdmVuIG51bGwgYnVmZmVyIHdpdGggbm9uLXplcm8gc2l6ZS4iKTsKICAgICB9CkBAIC01MjIsNyArNTM1LDcgQEAKICAgICAgIGluaXRDb21tb24oYnVmLCBzeiwgcG9saWN5ID09IFRBS0VfT1dORVJTSElQLCBzeik7CiAgICAgICBicmVhazsKICAgICBjYXNlIENPUFk6Ci0gICAgICBpbml0Q29tbW9uKE5VTEwsIHN6LCB0cnVlLCAwKTsKKyAgICAgIGluaXRDb21tb24obnVsbHB0ciwgc3osIHRydWUsIDApOwogICAgICAgdGhpcy0+d3JpdGUoYnVmLCBzeik7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtNTMxLDE5ICs1NDQsMTkgQEAKICAgICB9CiAgIH0KIAotICB+VE1lbW9yeUJ1ZmZlcigpIHsKKyAgflRNZW1vcnlCdWZmZXIoKSBvdmVycmlkZSB7CiAgICAgaWYgKG93bmVyXykgewogICAgICAgc3RkOjpmcmVlKGJ1ZmZlcl8pOwogICAgIH0KICAgfQogCi0gIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIGlzT3BlbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICBib29sIHBlZWsoKSB7IHJldHVybiAockJhc2VfIDwgd0Jhc2VfKTsgfQorICBib29sIHBlZWsoKSBvdmVycmlkZSB7IHJldHVybiAockJhc2VfIDwgd0Jhc2VfKTsgfQogCi0gIHZvaWQgb3BlbigpIHt9CisgIHZvaWQgb3BlbigpIG92ZXJyaWRlIHt9CiAKLSAgdm9pZCBjbG9zZSgpIHt9CisgIHZvaWQgY2xvc2UoKSBvdmVycmlkZSB7fQogCiAgIC8vIFRPRE8oZHJlaXNzKTogTWFrZSBidWZQdHIgY29uc3QuCiAgIHZvaWQgZ2V0QnVmZmVyKHVpbnQ4X3QqKiBidWZQdHIsIHVpbnQzMl90KiBzeikgewpAQCAtNTUyLDcgKzU2NSw3IEBACiAgIH0KIAogICBzdGQ6OnN0cmluZyBnZXRCdWZmZXJBc1N0cmluZygpIHsKLSAgICBpZiAoYnVmZmVyXyA9PSBOVUxMKSB7CisgICAgaWYgKGJ1ZmZlcl8gPT0gbnVsbHB0cikgewogICAgICAgcmV0dXJuICIiOwogICAgIH0KICAgICB1aW50OF90KiBidWY7CkBAIC01NjIsNyArNTc1LDcgQEAKICAgfQogCiAgIHZvaWQgYXBwZW5kQnVmZmVyVG9TdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgewotICAgIGlmIChidWZmZXJfID09IE5VTEwpIHsKKyAgICBpZiAoYnVmZmVyXyA9PSBudWxscHRyKSB7CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIHVpbnQ4X3QqIGJ1ZjsKQEAgLTYyMSw5ICs2MzQsOSBAQAogICB1aW50MzJfdCByZWFkQXBwZW5kVG9TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgdWludDMyX3QgbGVuKTsKIAogICAvLyByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQKLSAgdWludDMyX3QgcmVhZEVuZCgpIHsKKyAgdWludDMyX3QgcmVhZEVuZCgpIG92ZXJyaWRlIHsKICAgICAvLyBUaGlzIGNhc3Qgc2hvdWxkIGJlIHNhZmUsIGJlY2F1c2UgYnVmZmVyXydzIHNpemUgaXMgYSB1aW50MzJfdAotICAgIHVpbnQzMl90IGJ5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCYXNlXyAtIGJ1ZmZlcl8pOworICAgIGF1dG8gYnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJhc2VfIC0gYnVmZmVyXyk7CiAgICAgaWYgKHJCYXNlXyA9PSB3QmFzZV8pIHsKICAgICAgIHJlc2V0QnVmZmVyKCk7CiAgICAgfQpAQCAtNjMxLDcgKzY0NCw3IEBACiAgIH0KIAogICAvLyBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4KLSAgdWludDMyX3Qgd3JpdGVFbmQoKSB7CisgIHVpbnQzMl90IHdyaXRlRW5kKCkgb3ZlcnJpZGUgewogICAgIC8vIFRoaXMgY2FzdCBzaG91bGQgYmUgc2FmZSwgYmVjYXVzZSBidWZmZXJfJ3Mgc2l6ZSBpcyBhIHVpbnQzMl90CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSBidWZmZXJfKTsKICAgfQpAQCAtNjYzLDYgKzY3NiwyOSBAQAogICAgKi8KICAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gVEJ1ZmZlckJhc2U6OnJlYWRBbGwoYnVmLCBsZW4pOyB9CiAKKyAgLy8hIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgYnVmZmVyIHNpemUKKyAgLy8hIFxyZXR1cm5zIHRoZSBjdXJyZW50IGJ1ZmZlciBzaXplCisgIHVpbnQzMl90IGdldEJ1ZmZlclNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGJ1ZmZlclNpemVfOworICB9CisKKyAgLy8hIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgbWF4aW11bSBidWZmZXIgc2l6ZQorICAvLyEgXHJldHVybnMgdGhlIGN1cnJlbnQgbWF4aW11bSBidWZmZXIgc2l6ZQorICB1aW50MzJfdCBnZXRNYXhCdWZmZXJTaXplKCkgY29uc3QgeworICAgIHJldHVybiBtYXhCdWZmZXJTaXplXzsKKyAgfQorCisgIC8vISBcYnJpZWYgQ2hhbmdlIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplCisgIC8vISBccGFyYW1baW5dICBtYXhTaXplICB0aGUgbmV3IG1heGltdW0gYnVmZmVyIHNpemUgYWxsb3dlZCB0byBncm93IHRvCisgIC8vISBcdGhyb3dzICBUVHJhbnNwb3J0RXhjZXB0aW9uKEJBRF9BUkdTKSBpZiBtYXhTaXplIGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCBidWZmZXIgc2l6ZQorICB2b2lkIHNldE1heEJ1ZmZlclNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIGlmIChtYXhTaXplIDwgYnVmZmVyU2l6ZV8pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXhpbXVtIGJ1ZmZlciBzaXplIHdvdWxkIGJlIGxlc3MgdGhhbiBjdXJyZW50IGJ1ZmZlciBzaXplIik7CisgICAgfQorICAgIG1heEJ1ZmZlclNpemVfID0gbWF4U2l6ZTsKKyAgfQorCiBwcm90ZWN0ZWQ6CiAgIHZvaWQgc3dhcChUTWVtb3J5QnVmZmVyJiB0aGF0KSB7CiAgICAgdXNpbmcgc3RkOjpzd2FwOwpAQCAtNjgzLDExICs3MTksMTEgQEAKICAgLy8gQ29tcHV0ZSB0aGUgcG9zaXRpb24gYW5kIGF2YWlsYWJsZSBkYXRhIGZvciByZWFkaW5nLgogICB2b2lkIGNvbXB1dGVSZWFkKHVpbnQzMl90IGxlbiwgdWludDhfdCoqIG91dF9zdGFydCwgdWludDMyX3QqIG91dF9naXZlKTsKIAotICB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IHJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSBvdmVycmlkZTsKIAotICB2b2lkIHdyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZvaWQgd3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSBvdmVycmlkZTsKIAotICBjb25zdCB1aW50OF90KiBib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7CisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSBvdmVycmlkZTsKIAogICAvLyBEYXRhIGJ1ZmZlcgogICB1aW50OF90KiBidWZmZXJfOwpAQCAtNjk1LDYgKzczMSw5IEBACiAgIC8vIEFsbG9jYXRlZCBidWZmZXIgc2l6ZQogICB1aW50MzJfdCBidWZmZXJTaXplXzsKIAorICAvLyBNYXhpbXVtIGFsbG93ZWQgc2l6ZQorICB1aW50MzJfdCBtYXhCdWZmZXJTaXplXzsKKwogICAvLyBJcyB0aGlzIG9iamVjdCB0aGUgb3duZXIgb2YgdGhlIGJ1ZmZlcj8KICAgYm9vbCBvd25lcl87CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcAppbmRleCA0YmNlM2E4Li45M2RkMTAwIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8aW8uaD4KICNlbmRpZgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgc3RkOjpzdHJpbmc7CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaAppbmRleCA1NTkzZDQzLi5hM2NmNTE5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgKQEAgLTQzLDcgKzQzLDcgQEAKICAgVEZEVHJhbnNwb3J0KGludCBmZCwgQ2xvc2VQb2xpY3kgY2xvc2VfcG9saWN5ID0gTk9fQ0xPU0VfT05fREVTVFJPWSkKICAgICA6IGZkXyhmZCksIGNsb3NlX3BvbGljeV8oY2xvc2VfcG9saWN5KSB7fQogCi0gIH5URkRUcmFuc3BvcnQoKSB7CisgIH5URkRUcmFuc3BvcnQoKSBvdmVycmlkZSB7CiAgICAgaWYgKGNsb3NlX3BvbGljeV8gPT0gQ0xPU0VfT05fREVTVFJPWSkgewogICAgICAgdHJ5IHsKICAgICAgICAgY2xvc2UoKTsKQEAgLTUzLDExICs1MywxMSBAQAogICAgIH0KICAgfQogCi0gIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gZmRfID49IDA7IH0KKyAgYm9vbCBpc09wZW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmZF8gPj0gMDsgfQogCi0gIHZvaWQgb3BlbigpIHt9CisgIHZvaWQgb3BlbigpIG92ZXJyaWRlIHt9CiAKLSAgdm9pZCBjbG9zZSgpOworICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGU7CiAKICAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKaW5kZXggODVlODhiOS4uNTNlNTEzNiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmg+CiAKKyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KKwogI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjZWxzZQpAQCAtNDAsNiArNDIsNyBAQAogI2luY2x1ZGUgPGNzdHJpbmc+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpZmRlZiBIQVZFX1NZU19TVEFUX0gKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2VuZGlmCkBAIC01MiwxNiArNTUsMTggQEAKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIGJvb3N0OjpzY29wZWRfcHRyOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpjZXJyOwordXNpbmcgc3RkOjpjb3V0OwordXNpbmcgc3RkOjplbmRsOwordXNpbmcgc3RkOjpzdHJpbmc7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIAogVEZpbGVUcmFuc3BvcnQ6OlRGaWxlVHJhbnNwb3J0KHN0cmluZyBwYXRoLCBib29sIHJlYWRPbmx5KQogICA6IHJlYWRTdGF0ZV8oKSwKLSAgICByZWFkQnVmZl8oTlVMTCksCi0gICAgY3VycmVudEV2ZW50XyhOVUxMKSwKKyAgICByZWFkQnVmZl8obnVsbHB0ciksCisgICAgY3VycmVudEV2ZW50XyhudWxscHRyKSwKICAgICByZWFkQnVmZlNpemVfKERFRkFVTFRfUkVBRF9CVUZGX1NJWkUpLAogICAgIHJlYWRUaW1lb3V0XyhOT19UQUlMX1JFQURfVElNRU9VVCksCiAgICAgY2h1bmtTaXplXyhERUZBVUxUX0NIVU5LX1NJWkUpLApAQCAtNzMsOCArNzgsOCBAQAogICAgIGVvZlNsZWVwVGltZV8oREVGQVVMVF9FT0ZfU0xFRVBfVElNRV9VUyksCiAgICAgY29ycnVwdGVkRXZlbnRTbGVlcFRpbWVfKERFRkFVTFRfQ09SUlVQVEVEX1NMRUVQX1RJTUVfVVMpLAogICAgIHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKERFRkFVTFRfV1JJVEVSX1RIUkVBRF9TTEVFUF9USU1FX1VTKSwKLSAgICBkZXF1ZXVlQnVmZmVyXyhOVUxMKSwKLSAgICBlbnF1ZXVlQnVmZmVyXyhOVUxMKSwKKyAgICBkZXF1ZXVlQnVmZmVyXyhudWxscHRyKSwKKyAgICBlbnF1ZXVlQnVmZmVyXyhudWxscHRyKSwKICAgICBub3RGdWxsXygmbXV0ZXhfKSwKICAgICBub3RFbXB0eV8oJm11dGV4XyksCiAgICAgY2xvc2luZ18oZmFsc2UpLApAQCAtMTM2LDIyICsxNDEsMjIgQEAKIAogICBpZiAoZGVxdWV1ZUJ1ZmZlcl8pIHsKICAgICBkZWxldGUgZGVxdWV1ZUJ1ZmZlcl87Ci0gICAgZGVxdWV1ZUJ1ZmZlcl8gPSBOVUxMOworICAgIGRlcXVldWVCdWZmZXJfID0gbnVsbHB0cjsKICAgfQogCiAgIGlmIChlbnF1ZXVlQnVmZmVyXykgewogICAgIGRlbGV0ZSBlbnF1ZXVlQnVmZmVyXzsKLSAgICBlbnF1ZXVlQnVmZmVyXyA9IE5VTEw7CisgICAgZW5xdWV1ZUJ1ZmZlcl8gPSBudWxscHRyOwogICB9CiAKICAgaWYgKHJlYWRCdWZmXykgewogICAgIGRlbGV0ZVtdIHJlYWRCdWZmXzsKLSAgICByZWFkQnVmZl8gPSBOVUxMOworICAgIHJlYWRCdWZmXyA9IG51bGxwdHI7CiAgIH0KIAogICBpZiAoY3VycmVudEV2ZW50XykgewogICAgIGRlbGV0ZSBjdXJyZW50RXZlbnRfOwotICAgIGN1cnJlbnRFdmVudF8gPSBOVUxMOworICAgIGN1cnJlbnRFdmVudF8gPSBudWxscHRyOwogICB9CiAKICAgLy8gY2xvc2UgbG9nZmlsZQpAQCAtMTkyLDYgKzE5NywxMiBAQAogICBlbnF1ZXVlRXZlbnQoYnVmLCBsZW4pOwogfQogCit0ZW1wbGF0ZSA8Y2xhc3MgX1Q+CitzdHJ1Y3QgdW5pcXVlRGVsZXRlcgoreworICB2b2lkIG9wZXJhdG9yKCkoX1QgKnB0cikgY29uc3QgeyBkZWxldGUgcHRyOyB9Cit9OworCiB2b2lkIFRGaWxlVHJhbnNwb3J0OjplbnF1ZXVlRXZlbnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBldmVudExlbikgewogICAvLyBjYW4ndCBlbnF1ZXVlIG1vcmUgZXZlbnRzIGlmIGZpbGUgaXMgZ29pbmcgdG8gY2xvc2UKICAgaWYgKGNsb3NpbmdfKSB7CkBAIC0yMDksNyArMjIwLDcgQEAKICAgICByZXR1cm47CiAgIH0KIAotICBzdGQ6OmF1dG9fcHRyPGV2ZW50SW5mbz4gdG9FbnF1ZXVlKG5ldyBldmVudEluZm8oKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxldmVudEluZm8sIHVuaXF1ZURlbGV0ZXI8ZXZlbnRJbmZvPiA+IHRvRW5xdWV1ZShuZXcgZXZlbnRJbmZvKCkpOwogICB0b0VucXVldWUtPmV2ZW50QnVmZl8gPSBuZXcgdWludDhfdFsoc2l6ZW9mKHVpbnQ4X3QpICogZXZlbnRMZW4pICsgNF07CiAKICAgLy8gZmlyc3QgNCBieXRlcyBpcyB0aGUgZXZlbnQgbGVuZ3RoCkBAIC0yNTMsNyArMjY0LDcgQEAKICAgLy8gaXQgaXMgcHJvYmFibHkgYSBub24tZmFjdG9yIGZvciB0aGUgdGltZSBiZWluZwogfQogCi1ib29sIFRGaWxlVHJhbnNwb3J0Ojpzd2FwRXZlbnRCdWZmZXJzKHN0cnVjdCB0aW1ldmFsKiBkZWFkbGluZSkgeworYm9vbCBURmlsZVRyYW5zcG9ydDo6c3dhcEV2ZW50QnVmZmVycyhjb25zdCBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrPiAqZGVhZGxpbmUpIHsKICAgYm9vbCBzd2FwOwogICBHdWFyZCBnKG11dGV4Xyk7CiAKQEAgLTI2NCw5ICsyNzUsOSBAQAogICAgIC8vIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgdHJhbnNwb3J0IGlzIGNsb3NpbmcKICAgICBzd2FwID0gZmFsc2U7CiAgIH0gZWxzZSB7Ci0gICAgaWYgKGRlYWRsaW5lICE9IE5VTEwpIHsKKyAgICBpZiAoZGVhZGxpbmUgIT0gbnVsbHB0cikgewogICAgICAgLy8gaWYgd2Ugd2VyZSBoYW5kZWQgYSBkZWFkbGluZSB0aW1lIHN0cnVjdCwgZG8gYSB0aW1lZCB3YWl0Ci0gICAgICBub3RFbXB0eV8ud2FpdEZvclRpbWUoZGVhZGxpbmUpOworICAgICAgbm90RW1wdHlfLndhaXRGb3JUaW1lKCpkZWFkbGluZSk7CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIGp1c3Qgd2FpdCB1bnRpbCB0aGUgYnVmZmVyIGdldHMgYW4gaXRlbQogICAgICAgbm90RW1wdHlfLndhaXQoKTsKQEAgLTMyNSw4ICszMzYsNyBAQAogICB9CiAKICAgLy8gRmlndXJlIG91dCB0aGUgbmV4dCB0aW1lIGJ5IHdoaWNoIGEgZmx1c2ggbXVzdCB0YWtlIHBsYWNlCi0gIHN0cnVjdCB0aW1ldmFsIHRzX25leHRfZmx1c2g7Ci0gIGdldE5leHRGbHVzaFRpbWUoJnRzX25leHRfZmx1c2gpOworICBhdXRvIHRzX25leHRfZmx1c2ggPSBnZXROZXh0Rmx1c2hUaW1lKCk7CiAgIHVpbnQzMl90IHVuZmx1c2hlZCA9IDA7CiAKICAgd2hpbGUgKDEpIHsKQEAgLTM1Miw3ICszNjIsNyBAQAogCiAgICAgaWYgKHN3YXBFdmVudEJ1ZmZlcnMoJnRzX25leHRfZmx1c2gpKSB7CiAgICAgICBldmVudEluZm8qIG91dEV2ZW50OwotICAgICAgd2hpbGUgKE5VTEwgIT0gKG91dEV2ZW50ID0gZGVxdWV1ZUJ1ZmZlcl8tPmdldE5leHQoKSkpIHsKKyAgICAgIHdoaWxlIChudWxscHRyICE9IChvdXRFdmVudCA9IGRlcXVldWVCdWZmZXJfLT5nZXROZXh0KCkpKSB7CiAgICAgICAgIC8vIFJlbW92ZSBhbiBldmVudCBmcm9tIHRoZSBidWZmZXIgYW5kIHdyaXRlIGl0IG91dCB0byBkaXNrLiBJZiB0aGVyZSBpcyBhbnkgSU8gZXJyb3IsIGZvcgogICAgICAgICAvLyBpbnN0YW5jZSwKICAgICAgICAgLy8gdGhlIG91dHB1dCBmaWxlIGlzIHVubW91bnRlZCBvciBkZWxldGVkLCB0aGVuIHRoaXMgZXZlbnQgaXMgZHJvcHBlZC4gSG93ZXZlciwgdGhlIHdyaXRlcgpAQCAtMzYzLDcgKzM3Myw3IEBACiAKICAgICAgICAgd2hpbGUgKGhhc0lPRXJyb3IpIHsKICAgICAgICAgICBUX0VSUk9SKAotICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlciB0aHJlYWQgZ29pbmcgdG8gc2xlZXAgZm9yICVkIG1pY3Jvc2Vjb25kcyBkdWUgdG8gSU8gZXJyb3JzIiwKKyAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXIgdGhyZWFkIGdvaW5nIHRvIHNsZWVwIGZvciAldSBtaWNyb3NlY29uZHMgZHVlIHRvIElPIGVycm9ycyIsCiAgICAgICAgICAgICAgIHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKTsKICAgICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyh3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyk7CiAgICAgICAgICAgaWYgKGNsb3NpbmdfKSB7CkBAIC00MTIsOSArNDIyLDkgQEAKICAgICAgICAgICBpZiAoY2h1bmsxICE9IGNodW5rMikgewogICAgICAgICAgICAgLy8gcmVmZXRjaCB0aGUgb2Zmc2V0IHRvIGtlZXAgaW4gc3luYwogICAgICAgICAgICAgb2Zmc2V0XyA9IFRIUklGVF9MU0VFSyhmZF8sIDAsIFNFRUtfQ1VSKTsKLSAgICAgICAgICAgIGludDMyX3QgcGFkZGluZyA9IChpbnQzMl90KSgob2Zmc2V0XyAvIGNodW5rU2l6ZV8gKyAxKSAqIGNodW5rU2l6ZV8gLSBvZmZzZXRfKTsKKyAgICAgICAgICAgIGF1dG8gcGFkZGluZyA9IChpbnQzMl90KSgob2Zmc2V0XyAvIGNodW5rU2l6ZV8gKyAxKSAqIGNodW5rU2l6ZV8gLSBvZmZzZXRfKTsKIAotICAgICAgICAgICAgdWludDhfdCogemVyb3MgPSBuZXcgdWludDhfdFtwYWRkaW5nXTsKKyAgICAgICAgICAgIGF1dG8qIHplcm9zID0gbmV3IHVpbnQ4X3RbcGFkZGluZ107CiAgICAgICAgICAgICBtZW1zZXQoemVyb3MsICdcMCcsIHBhZGRpbmcpOwogICAgICAgICAgICAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiBhcnJheSh6ZXJvcyk7CiAgICAgICAgICAgICBpZiAoLTEgPT0gOjp3cml0ZShmZF8sIHplcm9zLCBwYWRkaW5nKSkgewpAQCAtNDc5LDE3ICs0ODksMTMgQEAKICAgICBpZiAoZm9yY2VkX2ZsdXNoIHx8IHVuZmx1c2hlZCA+IGZsdXNoTWF4Qnl0ZXNfKSB7CiAgICAgICBmbHVzaCA9IHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgIHN0cnVjdCB0aW1ldmFsIGN1cnJlbnRfdGltZTsKLSAgICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmN1cnJlbnRfdGltZSwgTlVMTCk7Ci0gICAgICBpZiAoY3VycmVudF90aW1lLnR2X3NlYyA+IHRzX25leHRfZmx1c2gudHZfc2VjCi0gICAgICAgICAgfHwgKGN1cnJlbnRfdGltZS50dl9zZWMgPT0gdHNfbmV4dF9mbHVzaC50dl9zZWMKLSAgICAgICAgICAgICAgJiYgY3VycmVudF90aW1lLnR2X3VzZWMgPiB0c19uZXh0X2ZsdXNoLnR2X3VzZWMpKSB7CisgICAgICBpZiAoc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgPiB0c19uZXh0X2ZsdXNoKSB7CiAgICAgICAgIGlmICh1bmZsdXNoZWQgPiAwKSB7CiAgICAgICAgICAgZmx1c2ggPSB0cnVlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG5ldyBkYXRhIHNpbmNlIHRoZSBsYXN0IGZzeW5jLAogICAgICAgICAgIC8vIGRvbid0IHBlcmZvcm0gdGhlIGZzeW5jLCBidXQgZG8gcmVzZXQgdGhlIHRpbWVyLgotICAgICAgICAgIGdldE5leHRGbHVzaFRpbWUoJnRzX25leHRfZmx1c2gpOworICAgICAgICAgIHRzX25leHRfZmx1c2ggPSBnZXROZXh0Rmx1c2hUaW1lKCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC00OTgsNyArNTA0LDcgQEAKICAgICAgIC8vIHN5bmMgKGZvcmNlIGZsdXNoKSBmaWxlIHRvIGRpc2sKICAgICAgIFRIUklGVF9GU1lOQyhmZF8pOwogICAgICAgdW5mbHVzaGVkID0gMDsKLSAgICAgIGdldE5leHRGbHVzaFRpbWUoJnRzX25leHRfZmx1c2gpOworICAgICAgdHNfbmV4dF9mbHVzaCA9IGdldE5leHRGbHVzaFRpbWUoKTsKIAogICAgICAgLy8gbm90aWZ5IGFueWJvZHkgd2FpdGluZyBmb3IgZmx1c2ggY29tcGxldGlvbgogICAgICAgaWYgKGZvcmNlZF9mbHVzaCkgewpAQCAtNTgxLDcgKzU4Nyw3IEBACiAgICAgICBtZW1jcHkoYnVmLCBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZfICsgY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmUG9zXywgcmVtYWluaW5nKTsKICAgICB9CiAgICAgZGVsZXRlIChjdXJyZW50RXZlbnRfKTsKLSAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKKyAgICBjdXJyZW50RXZlbnRfID0gbnVsbHB0cjsKICAgICByZXR1cm4gcmVtYWluaW5nOwogICB9CiAKQEAgLTYyNCwxMiArNjMwLDEyIEBACiAgICAgICAgIH0gZWxzZSBpZiAocmVhZFRpbWVvdXRfID09IE5PX1RBSUxfUkVBRF9USU1FT1VUKSB7CiAgICAgICAgICAgLy8gcmVzZXQgc3RhdGUKICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUoMCk7Ci0gICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0gZWxzZSBpZiAocmVhZFRpbWVvdXRfID4gMCkgewogICAgICAgICAgIC8vIHRpbWVvdXQgYWxyZWFkeSBleHBpcmVkIG9uY2UKICAgICAgICAgICBpZiAocmVhZFRyaWVzID4gMCkgewogICAgICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKDApOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUMocmVhZFRpbWVvdXRfICogMTAwMCk7CiAgICAgICAgICAgICByZWFkVHJpZXMrKzsKQEAgLTY4NSw4ICs2OTEsOCBAQAogICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfID0gMDsKICAgICAgICAgfQogICAgICAgICAvLyB0YWtlIGVpdGhlciB0aGUgZW50aXJlIGV2ZW50IG9yIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgotICAgICAgICBpbnQgcmVjbGFpbUJ1ZmZlciA9IG1pbigodWludDMyX3QpKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyAtIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfIC0gcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18pOworICAgICAgICBpbnQgcmVjbGFpbUJ1ZmZlciA9IChzdGQ6Om1pbikoKHVpbnQzMl90KShyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gLSByZWFkU3RhdGVfLmJ1ZmZlclB0cl8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gLSByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyk7CiAKICAgICAgICAgLy8gY29weSBkYXRhIGZyb20gcmVhZCBidWZmZXIgaW50byBldmVudCBidWZmZXIKICAgICAgICAgbWVtY3B5KHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZfICsgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18sCkBAIC03MDMsNyArNzA5LDcgQEAKICAgICAgICAgICBldmVudEluZm8qIGNvbXBsZXRlRXZlbnQgPSByZWFkU3RhdGVfLmV2ZW50XzsKICAgICAgICAgICBjb21wbGV0ZUV2ZW50LT5ldmVudEJ1ZmZQb3NfID0gMDsKIAotICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfID0gTlVMTDsKKyAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50XyA9IG51bGxwdHI7CiAgICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyk7CiAKICAgICAgICAgICAvLyBleGl0IGNyaXRlcmlhCkBAIC03NzIsNyArNzc4LDcgQEAKICAgICAgIC8vIHByZXR0eSBob3NlZCBhdCB0aGlzIHN0YWdlLCByZXdpbmQgdGhlIGZpbGUgYmFjayB0byB0aGUgbGFzdCBzdWNjZXNzZnVsCiAgICAgICAvLyBwb2ludCBhbmQgcHVudCBvbiB0aGUgZXJyb3IKICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZShyZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl8pOwotICAgICAgY3VycmVudEV2ZW50XyA9IE5VTEw7CisgICAgICBjdXJyZW50RXZlbnRfID0gbnVsbHB0cjsKICAgICAgIGNoYXIgZXJyb3JNc2dbMTAyNF07CiAgICAgICBzcHJpbnRmKGVycm9yTXNnLAogICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6IGxvZyBmaWxlIGNvcnJ1cHRlZCBhdCBvZmZzZXQ6ICVsdSIsCkBAIC04MjEsNyArODI3LDcgQEAKICAgb2ZmX3QgbmV3T2Zmc2V0ID0gb2ZmX3QoY2h1bmspICogY2h1bmtTaXplXzsKICAgb2Zmc2V0XyA9IDo6VEhSSUZUX0xTRUVLKGZkXywgbmV3T2Zmc2V0LCBTRUVLX1NFVCk7CiAgIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKLSAgY3VycmVudEV2ZW50XyA9IE5VTEw7CisgIGN1cnJlbnRFdmVudF8gPSBudWxscHRyOwogICBpZiAob2Zmc2V0XyA9PSAtMSkgewogICAgIEdsb2JhbE91dHB1dCgiVEZpbGVUcmFuc3BvcnQ6IGxzZWVrIGVycm9yIGluIHNlZWtUb0NodW5rIik7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVEZpbGVUcmFuc3BvcnQ6IGxzZWVrIGVycm9yIGluIHNlZWtUb0NodW5rIik7CkBAIC04MzIsMTAgKzgzOCwxMCBAQAogICAgIHVpbnQzMl90IG9sZFJlYWRUaW1lb3V0ID0gZ2V0UmVhZFRpbWVvdXQoKTsKICAgICBzZXRSZWFkVGltZW91dChOT19UQUlMX1JFQURfVElNRU9VVCk7CiAgICAgLy8ga2VlcCBvbiByZWFkaW5nIHVudGkgdGhlIGxhc3QgZXZlbnQgYXQgcG9pbnQgb2Ygc2Vla0NodW5rIGNhbGwKLSAgICBib29zdDo6c2NvcGVkX3B0cjxldmVudEluZm8+IGV2ZW50OworICAgIHNoYXJlZF9wdHI8ZXZlbnRJbmZvPiBldmVudDsKICAgICB3aGlsZSAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8pIDwgbWluRW5kT2Zmc2V0KSB7CiAgICAgICBldmVudC5yZXNldChyZWFkRXZlbnQoKSk7Ci0gICAgICBpZiAoZXZlbnQuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgaWYgKGV2ZW50LmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQpAQCAtODk3LDE1ICs5MDMsOCBAQAogICB9CiB9CiAKLXZvaWQgVEZpbGVUcmFuc3BvcnQ6OmdldE5leHRGbHVzaFRpbWUoc3RydWN0IHRpbWV2YWwqIHRzX25leHRfZmx1c2gpIHsKLSAgVEhSSUZUX0dFVFRJTUVPRkRBWSh0c19uZXh0X2ZsdXNoLCBOVUxMKTsKLQotICB0c19uZXh0X2ZsdXNoLT50dl91c2VjICs9IGZsdXNoTWF4VXNfOwotICBpZiAodHNfbmV4dF9mbHVzaC0+dHZfdXNlYyA+IDEwMDAwMDApIHsKLSAgICBsb25nIGV4dHJhX3NlY3MgPSB0c19uZXh0X2ZsdXNoLT50dl91c2VjIC8gMTAwMDAwMDsKLSAgICB0c19uZXh0X2ZsdXNoLT50dl91c2VjICU9IDEwMDAwMDA7Ci0gICAgdHNfbmV4dF9mbHVzaC0+dHZfc2VjICs9IGV4dHJhX3NlY3M7Ci0gIH0KK3N0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s+IFRGaWxlVHJhbnNwb3J0OjpnZXROZXh0Rmx1c2hUaW1lKCkgeworICByZXR1cm4gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKyBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKGZsdXNoTWF4VXNfKTsKIH0KIAogVEZpbGVUcmFuc3BvcnRCdWZmZXI6OlRGaWxlVHJhbnNwb3J0QnVmZmVyKHVpbnQzMl90IHNpemUpCkBAIC05MTksNyArOTE4LDcgQEAKICAgICAgIGRlbGV0ZSBidWZmZXJfW2ldOwogICAgIH0KICAgICBkZWxldGVbXSBidWZmZXJfOwotICAgIGJ1ZmZlcl8gPSBOVUxMOworICAgIGJ1ZmZlcl8gPSBudWxscHRyOwogICB9CiB9CiAKQEAgLTk0NCw3ICs5NDMsNyBAQAogICAgIHJldHVybiBidWZmZXJfW3JlYWRQb2ludF8rK107CiAgIH0gZWxzZSB7CiAgICAgLy8gbm8gbW9yZSBlbnRyaWVzCi0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KIH0KIApAQCAtOTc4LDcgKzk3Nyw3IEBACiAgICAgaW5wdXRUcmFuc3BvcnRfKGlucHV0VHJhbnNwb3J0KSB7CiAKICAgLy8gZGVmYXVsdCB0aGUgb3V0cHV0IHRyYW5zcG9ydCB0byBhIG51bGwgdHJhbnNwb3J0IChjb21tb24gY2FzZSkKLSAgb3V0cHV0VHJhbnNwb3J0XyA9IHNoYXJlZF9wdHI8VE51bGxUcmFuc3BvcnQ+KG5ldyBUTnVsbFRyYW5zcG9ydCgpKTsKKyAgb3V0cHV0VHJhbnNwb3J0XyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VE51bGxUcmFuc3BvcnQ+KCk7CiB9CiAKIFRGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKQEAgLTk5MSw3ICs5OTAsNyBAQAogICAgIGlucHV0VHJhbnNwb3J0XyhpbnB1dFRyYW5zcG9ydCkgewogCiAgIC8vIGRlZmF1bHQgdGhlIG91dHB1dCB0cmFuc3BvcnQgdG8gYSBudWxsIHRyYW5zcG9ydCAoY29tbW9uIGNhc2UpCi0gIG91dHB1dFRyYW5zcG9ydF8gPSBzaGFyZWRfcHRyPFROdWxsVHJhbnNwb3J0PihuZXcgVE51bGxUcmFuc3BvcnQoKSk7CisgIG91dHB1dFRyYW5zcG9ydF8gPSBzdGQ6Om1ha2Vfc2hhcmVkPFROdWxsVHJhbnNwb3J0PigpOwogfQogCiBURmlsZVByb2Nlc3Nvcjo6VEZpbGVQcm9jZXNzb3Ioc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCkBAIC0xMDIxLDcgKzEwMjAsNyBAQAogICAgIC8vIGJhZCBmb3JtIHRvIHVzZSBleGNlcHRpb25zIGZvciBmbG93IGNvbnRyb2wgYnV0IHRoZXJlIGlzIHJlYWxseQogICAgIC8vIG5vIG90aGVyIHdheSBhcm91bmQgaXQKICAgICB0cnkgewotICAgICAgcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgTlVMTCk7CisgICAgICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBudWxscHRyKTsKICAgICAgIG51bVByb2Nlc3NlZCsrOwogICAgICAgaWYgKChudW1FdmVudHMgPiAwKSAmJiAobnVtUHJvY2Vzc2VkID09IG51bUV2ZW50cykpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTA1Miw3ICsxMDUxLDcgQEAKICAgICAvLyBiYWQgZm9ybSB0byB1c2UgZXhjZXB0aW9ucyBmb3IgZmxvdyBjb250cm9sIGJ1dCB0aGVyZSBpcyByZWFsbHkKICAgICAvLyBubyBvdGhlciB3YXkgYXJvdW5kIGl0CiAgICAgdHJ5IHsKLSAgICAgIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIE5VTEwpOworICAgICAgcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgbnVsbHB0cik7CiAgICAgICBpZiAoY3VyQ2h1bmsgIT0gaW5wdXRUcmFuc3BvcnRfLT5nZXRDdXJDaHVuaygpKSB7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oCmluZGV4IGFjZDdiZjkuLjBkZjVjZjkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmgKQEAgLTI0LDE1ICsyNCwxMyBAQAogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgogCisjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxzdGRpby5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CkBAIC01MCw3ICs0OCw3IEBACiAgIHVpbnQzMl90IGV2ZW50U2l6ZV87CiAgIHVpbnQzMl90IGV2ZW50QnVmZlBvc187CiAKLSAgZXZlbnRJbmZvKCkgOiBldmVudEJ1ZmZfKE5VTEwpLCBldmVudFNpemVfKDApLCBldmVudEJ1ZmZQb3NfKDApe307CisgIGV2ZW50SW5mbygpIDogZXZlbnRCdWZmXyhudWxscHRyKSwgZXZlbnRTaXplXygwKSwgZXZlbnRCdWZmUG9zXygwKXt9OwogICB+ZXZlbnRJbmZvKCkgewogICAgIGlmIChldmVudEJ1ZmZfKSB7CiAgICAgICBkZWxldGVbXSBldmVudEJ1ZmZfOwpAQCAtODcsNyArODUsNyBAQAogICAgIGlmIChldmVudF8pIHsKICAgICAgIGRlbGV0ZSAoZXZlbnRfKTsKICAgICB9Ci0gICAgZXZlbnRfID0gMDsKKyAgICBldmVudF8gPSBudWxscHRyOwogICB9CiAKICAgaW5saW5lIHVpbnQzMl90IGdldEV2ZW50U2l6ZSgpIHsKQEAgLTk2LDcgKzk0LDcgQEAKICAgfQogCiAgIHJlYWRTdGF0ZSgpIHsKLSAgICBldmVudF8gPSAwOworICAgIGV2ZW50XyA9IG51bGxwdHI7CiAgICAgcmVzZXRBbGxWYWx1ZXMoKTsKICAgfQogCkBAIC0xNzYsMjQgKzE3NCwyNCBAQAogY2xhc3MgVEZpbGVUcmFuc3BvcnQgOiBwdWJsaWMgVEZpbGVSZWFkZXJUcmFuc3BvcnQsIHB1YmxpYyBURmlsZVdyaXRlclRyYW5zcG9ydCB7CiBwdWJsaWM6CiAgIFRGaWxlVHJhbnNwb3J0KHN0ZDo6c3RyaW5nIHBhdGgsIGJvb2wgcmVhZE9ubHkgPSBmYWxzZSk7Ci0gIH5URmlsZVRyYW5zcG9ydCgpOworICB+VEZpbGVUcmFuc3BvcnQoKSBvdmVycmlkZTsKIAogICAvLyBUT0RPOiB3aGF0IGlzIHRoZSBjb3JyZWN0IGJlaGF2aW91ciBmb3IgdGhpcz8KICAgLy8gdGhlIGxvZyBmaWxlIGlzIGdlbmVyYWxseSBhbHdheXMgb3BlbgotICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBpc09wZW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKICAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHZvaWQgZmx1c2goKTsKKyAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlOwogCiAgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwogICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLSAgYm9vbCBwZWVrKCk7CisgIGJvb2wgcGVlaygpIG92ZXJyaWRlOwogCiAgIC8vIGxvZy1maWxlIHNwZWNpZmljIGZ1bmN0aW9ucwotICB2b2lkIHNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspOwotICB2b2lkIHNlZWtUb0VuZCgpOwotICB1aW50MzJfdCBnZXROdW1DaHVua3MoKTsKLSAgdWludDMyX3QgZ2V0Q3VyQ2h1bmsoKTsKKyAgdm9pZCBzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKSBvdmVycmlkZTsKKyAgdm9pZCBzZWVrVG9FbmQoKSBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TnVtQ2h1bmtzKCkgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEN1ckNodW5rKCkgb3ZlcnJpZGU7CiAKICAgLy8gZm9yIGNoYW5naW5nIHRoZSBvdXRwdXQgZmlsZQogICB2b2lkIHJlc2V0T3V0cHV0RmlsZShpbnQgZmQsIHN0ZDo6c3RyaW5nIGZpbGVuYW1lLCBvZmZfdCBvZmZzZXQpOwpAQCAtMjA4LDE1ICsyMDYsMTUgQEAKIAogICBzdGF0aWMgY29uc3QgaW50MzJfdCBUQUlMX1JFQURfVElNRU9VVCA9IC0xOwogICBzdGF0aWMgY29uc3QgaW50MzJfdCBOT19UQUlMX1JFQURfVElNRU9VVCA9IDA7Ci0gIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCkgeyByZWFkVGltZW91dF8gPSByZWFkVGltZW91dDsgfQotICBpbnQzMl90IGdldFJlYWRUaW1lb3V0KCkgeyByZXR1cm4gcmVhZFRpbWVvdXRfOyB9CisgIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCkgb3ZlcnJpZGUgeyByZWFkVGltZW91dF8gPSByZWFkVGltZW91dDsgfQorICBpbnQzMl90IGdldFJlYWRUaW1lb3V0KCkgb3ZlcnJpZGUgeyByZXR1cm4gcmVhZFRpbWVvdXRfOyB9CiAKLSAgdm9pZCBzZXRDaHVua1NpemUodWludDMyX3QgY2h1bmtTaXplKSB7CisgIHZvaWQgc2V0Q2h1bmtTaXplKHVpbnQzMl90IGNodW5rU2l6ZSkgb3ZlcnJpZGUgewogICAgIGlmIChjaHVua1NpemUpIHsKICAgICAgIGNodW5rU2l6ZV8gPSBjaHVua1NpemU7CiAgICAgfQogICB9Ci0gIHVpbnQzMl90IGdldENodW5rU2l6ZSgpIHsgcmV0dXJuIGNodW5rU2l6ZV87IH0KKyAgdWludDMyX3QgZ2V0Q2h1bmtTaXplKCkgb3ZlcnJpZGUgeyByZXR1cm4gY2h1bmtTaXplXzsgfQogCiAgIHZvaWQgc2V0RXZlbnRCdWZmZXJTaXplKHVpbnQzMl90IGJ1ZmZlclNpemUpIHsKICAgICBpZiAoYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKSB7CkBAIC0yNjIsMjAgKzI2MCwyMCBAQAogICAgKiBXZSBjYW5ub3QgdXNlIFRWaXJ0dWFsVHJhbnNwb3J0IHRvIHByb3ZpZGUgdGhlc2UsIHNpbmNlIHdlIG5lZWQgdG8gaW5oZXJpdAogICAgKiB2aXJ0dWFsbHkgZnJvbSBUVHJhbnNwb3J0LgogICAgKi8KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOyB9Ci0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5yZWFkQWxsKGJ1ZiwgbGVuKTsgfQotICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyB0aGlzLT53cml0ZShidWYsIGxlbik7IH0KKyAgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSBvdmVycmlkZSB7IHJldHVybiB0aGlzLT5yZWFkKGJ1ZiwgbGVuKTsgfQorICB1aW50MzJfdCByZWFkQWxsX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIG92ZXJyaWRlIHsgcmV0dXJuIHRoaXMtPnJlYWRBbGwoYnVmLCBsZW4pOyB9CisgIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgb3ZlcnJpZGUgeyB0aGlzLT53cml0ZShidWYsIGxlbik7IH0KIAogcHJpdmF0ZToKICAgLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3Igd3JpdGluZyB0byBhIGZpbGUKICAgdm9pZCBlbnF1ZXVlRXZlbnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBldmVudExlbik7Ci0gIGJvb2wgc3dhcEV2ZW50QnVmZmVycyhzdHJ1Y3QgdGltZXZhbCogZGVhZGxpbmUpOworICBib29sIHN3YXBFdmVudEJ1ZmZlcnMoY29uc3Qgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jaz4gKmRlYWRsaW5lKTsKICAgYm9vbCBpbml0QnVmZmVyQW5kV3JpdGVUaHJlYWQoKTsKIAogICAvLyBjb250cm9sIGZvciB3cml0ZXIgdGhyZWFkCiAgIHN0YXRpYyB2b2lkKiBzdGFydFdyaXRlclRocmVhZCh2b2lkKiBwdHIpIHsKICAgICBzdGF0aWNfY2FzdDxURmlsZVRyYW5zcG9ydCo+KHB0ciktPndyaXRlclRocmVhZCgpOwotICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBudWxscHRyOwogICB9CiAgIHZvaWQgd3JpdGVyVGhyZWFkKCk7CiAKQEAgLTI4OCw3ICsyODYsNyBAQAogCiAgIC8vIFV0aWxpdHkgZnVuY3Rpb25zCiAgIHZvaWQgb3BlbkxvZ0ZpbGUoKTsKLSAgdm9pZCBnZXROZXh0Rmx1c2hUaW1lKHN0cnVjdCB0aW1ldmFsKiB0c19uZXh0X2ZsdXNoKTsKKyAgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jaz4gZ2V0TmV4dEZsdXNoVGltZSgpOwogCiAgIC8vIENsYXNzIHZhcmlhYmxlcwogICByZWFkU3RhdGUgcmVhZFN0YXRlXzsKQEAgLTMzOCw4ICszMzYsOCBAQAogICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9XUklURVJfVEhSRUFEX1NMRUVQX1RJTUVfVVMgPSA2MCAqIDEwMDAgKiAxMDAwOwogCiAgIC8vIHdyaXRlciB0aHJlYWQKLSAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiB3cml0ZXJUaHJlYWRfOworICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gd3JpdGVyVGhyZWFkXzsKIAogICAvLyBidWZmZXJzIHRvIGhvbGQgZGF0YSBiZWZvcmUgaXQgaXMgZmx1c2hlZC4gRWFjaCBlbGVtZW50IG9mIHRoZSBidWZmZXIgc3RvcmVzIGEgbXNnIHRoYXQKICAgLy8gbmVlZHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZS4gIFRoZSBidWZmZXJzIGFyZSBzd2FwcGVkIGJ5IHRoZSB3cml0ZXIgdGhyZWFkLgpAQCAtMzQ4LDExICszNDYsMTEgQEAKIAogICAvLyBjb25kaXRpb25zIHVzZWQgdG8gYmxvY2sgd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwgb3IgZW1wdHkKICAgTW9uaXRvciBub3RGdWxsXywgbm90RW1wdHlfOwotICB2b2xhdGlsZSBib29sIGNsb3NpbmdfOworICBzdGQ6OmF0b21pYzxib29sPiBjbG9zaW5nXzsKIAogICAvLyBUbyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIGJ1ZmZlciBoYXMgYmVlbiBmbHVzaGVkCiAgIE1vbml0b3IgZmx1c2hlZF87Ci0gIHZvbGF0aWxlIGJvb2wgZm9yY2VGbHVzaF87CisgIHN0ZDo6YXRvbWljPGJvb2w+IGZvcmNlRmx1c2hfOwogCiAgIC8vIE11dGV4IHRoYXQgaXMgZ3JhYmJlZCB3aGVuIGVucXVldWVpbmcgYW5kIHN3YXBwaW5nIHRoZSByZWFkL3dyaXRlIGJ1ZmZlcnMKICAgTXV0ZXggbXV0ZXhfOwpAQCAtMzkwLDE0ICszODgsMTQgQEAKICAgICogQHBhcmFtIHByb3RvY29sRmFjdG9yeSBwcm90b2NvbCBmYWN0b3J5CiAgICAqIEBwYXJhbSBpbnB1dFRyYW5zcG9ydCBmaWxlIHRyYW5zcG9ydAogICAgKi8KLSAgVEZpbGVQcm9jZXNzb3IoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk7CisgIFRGaWxlUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOwogCi0gIFRGaWxlUHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KTsKKyAgVEZpbGVQcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KTsKIAogICAvKioKICAgICogQ29uc3RydWN0b3IKQEAgLTQwNywxMCArNDA1LDEwIEBACiAgICAqIEBwYXJhbSBpbnB1dFRyYW5zcG9ydCBpbnB1dCBmaWxlIHRyYW5zcG9ydAogICAgKiBAcGFyYW0gb3V0cHV0IG91dHB1dCB0cmFuc3BvcnQKICAgICovCi0gIFRGaWxlUHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydCk7CisgIFRGaWxlUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQpOwogCiAgIC8qKgogICAgKiBwcm9jZXNzZXMgZXZlbnRzIGZyb20gdGhlIGZpbGUKQEAgLTQyNywxNCArNDI1LDE1IEBACiAgIHZvaWQgcHJvY2Vzc0NodW5rKCk7CiAKIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydF87CiB9OwogfQogfQogfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyBfVEhSSUZUX1RSQU5TUE9SVF9URklMRVRSQU5TUE9SVF9IXworCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTgyZDhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcApAQCAtMCwwICsxLDYxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7CisKK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9CSU5BUlkgfHwgY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQ09NUEFDVCkgeworICAgIHJldHVybiB0cmFuc3BvcnRfLT5yZWFkKGJ1ZiwgbGVuKTsKKyAgfQorCisgIHJldHVybiBURnJhbWVkVHJhbnNwb3J0OjpyZWFkU2xvdyhidWYsIGxlbik7Cit9CisKK3VpbnQxNl90IFRIZWFkZXJUcmFuc3BvcnQ6OmdldFByb3RvY29sSWQoKSBjb25zdCB7CisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpIHsKKyAgICByZXR1cm4gcHJvdG9JZDsKKyAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9DT01QQUNUIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX0ZSQU1FRF9DT01QQUNUKSB7CisgICAgcmV0dXJuIFRfQ09NUEFDVF9QUk9UT0NPTDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVF9CSU5BUllfUFJPVE9DT0w7IC8vIEFzc3VtZSBvdGhlciB0cmFuc3BvcnRzIHVzZSBUQmluYXJ5CisgIH0KK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjplbnN1cmVSZWFkQnVmZmVyKHVpbnQzMl90IHN6KSB7CisgIGlmIChzeiA+IHJCdWZTaXplXykgeworICAgIHJCdWZfLnJlc2V0KG5ldyB1aW50OF90W3N6XSk7CisgICAgckJ1ZlNpemVfID0gc3o7CisgIH0KK30KKworYm9vbCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkRnJhbWUoKSB7CisgIC8vIHN6TiBpcyBuZXR3b3JrIGJ5dGUgb3JkZXIgb2Ygc3oKKyAgdWludDMyX3Qgc3pOOworICB1aW50MzJfdCBzejsKKworICAvLyBSZWFkIHRoZSBzaXplIG9mIHRoZSBuZXh0IGZyYW1lLgorICAvLyBXZSBjYW4ndCB1c2UgcmVhZEFsbCgmc3osIHNpemVvZihzeikpLCBzaW5jZSB0aGF0IGFsd2F5cyB0aHJvd3MgYW4KKyAgLy8gZXhjZXB0aW9uIG9uIEVPRi4gIFdlIHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9ubHkgaWYgRU9GIG9jY3VycyBhZnRlcgorICAvLyBwYXJ0aWFsIHNpemUgZGF0YS4KKyAgdWludDMyX3Qgc2l6ZUJ5dGVzUmVhZCA9IDA7CisgIHdoaWxlIChzaXplQnl0ZXNSZWFkIDwgc2l6ZW9mKHN6TikpIHsKKyAgICB1aW50OF90KiBzenAgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmc3pOKSArIHNpemVCeXRlc1JlYWQ7CisgICAgdWludDMyX3QgYnl0ZXNSZWFkID0gdHJhbnNwb3J0Xy0+cmVhZChzenAsIHNpemVvZihzek4pIC0gc2l6ZUJ5dGVzUmVhZCk7CisgICAgaWYgKGJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICBpZiAoc2l6ZUJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICAgIC8vIEVPRiBiZWZvcmUgYW55IGRhdGEgd2FzIHJlYWQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVPRiBhZnRlciBhIHBhcnRpYWwgZnJhbWUgaGVhZGVyLiAgUmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtb3JlIGRhdGEgdG8gcmVhZCBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRpYWwgZnJhbWUgaGVhZGVyLiIpOworICAgICAgfQorICAgIH0KKyAgICBzaXplQnl0ZXNSZWFkICs9IGJ5dGVzUmVhZDsKKyAgfQorCisgIHN6ID0gbnRvaGwoc3pOKTsKKworICBlbnN1cmVSZWFkQnVmZmVyKDQpOworCisgIGlmICgoc3ogJiBUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fTUFTSykgPT0gKHVpbnQzMl90KVRCaW5hcnlQcm90b2NvbDo6VkVSU0lPTl8xKSB7CisgICAgLy8gdW5mcmFtZWQKKyAgICBjbGllbnRUeXBlID0gVEhSSUZUX1VORlJBTUVEX0JJTkFSWTsKKyAgICBtZW1jcHkockJ1Zl8uZ2V0KCksICZzek4sIHNpemVvZihzek4pKTsKKyAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCA0KTsKKyAgfSBlbHNlIGlmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KHN6ID4+IDI0KSA9PSBUQ29tcGFjdFByb3RvY29sOjpQUk9UT0NPTF9JRAorICAgICAgICAgICAgICYmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KHN6ID4+IDE2KSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSykKKyAgICAgICAgICAgICAgICAgICAgPT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9OKSB7CisgICAgY2xpZW50VHlwZSA9IFRIUklGVF9VTkZSQU1FRF9DT01QQUNUOworICAgIG1lbWNweShyQnVmXy5nZXQoKSwgJnN6Tiwgc2l6ZW9mKHN6TikpOworICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIDQpOworICB9IGVsc2UgeworICAgIC8vIENvdWxkIGJlIGhlYWRlciBmb3JtYXQgb3IgZnJhbWVkLiBDaGVjayBuZXh0IHVpbnQzMgorICAgIHVpbnQzMl90IG1hZ2ljX247CisgICAgdWludDMyX3QgbWFnaWM7CisKKyAgICBpZiAoc3ogPiBNQVhfRlJBTUVfU0laRSkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciB0cmFuc3BvcnQgZnJhbWUgaXMgdG9vIGxhcmdlIik7CisgICAgfQorCisgICAgZW5zdXJlUmVhZEJ1ZmZlcihzeik7CisKKyAgICAvLyBXZSBjYW4gdXNlIHJlYWRBbGwgaGVyZSwgYmVjYXVzZSBpdCB3b3VsZCBiZSBhbiBpbnZhbGlkIGZyYW1lIG90aGVyd2lzZQorICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJm1hZ2ljX24pLCBzaXplb2YobWFnaWNfbikpOworICAgIG1lbWNweShyQnVmXy5nZXQoKSwgJm1hZ2ljX24sIHNpemVvZihtYWdpY19uKSk7CisgICAgbWFnaWMgPSBudG9obChtYWdpY19uKTsKKworICAgIGlmICgobWFnaWMgJiBUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fTUFTSykgPT0gKHVpbnQzMl90KVRCaW5hcnlQcm90b2NvbDo6VkVSU0lPTl8xKSB7CisgICAgICAvLyBmcmFtZWQKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfRlJBTUVEX0JJTkFSWTsKKyAgICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCkgKyA0LCBzeiAtIDQpOworICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOworICAgIH0gZWxzZSBpZiAoc3RhdGljX2Nhc3Q8aW50OF90PihtYWdpYyA+PiAyNCkgPT0gVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQKKyAgICAgICAgICAgICAgICYmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KG1hZ2ljID4+IDE2KSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICA9PSBUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OX04pIHsKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfRlJBTUVEX0NPTVBBQ1Q7CisgICAgICB0cmFuc3BvcnRfLT5yZWFkQWxsKHJCdWZfLmdldCgpICsgNCwgc3ogLSA0KTsKKyAgICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHN6KTsKKyAgICB9IGVsc2UgaWYgKEhFQURFUl9NQUdJQyA9PSAobWFnaWMgJiBIRUFERVJfTUFTSykpIHsKKyAgICAgIGlmIChzeiA8IDEwKSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciB0cmFuc3BvcnQgZnJhbWUgaXMgdG9vIHNtYWxsIik7CisgICAgICB9CisKKyAgICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCkgKyA0LCBzeiAtIDQpOworCisgICAgICAvLyBoZWFkZXIgZm9ybWF0CisgICAgICBjbGllbnRUeXBlID0gVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRTsKKyAgICAgIC8vIGZsYWdzCisgICAgICBmbGFncyA9IG1hZ2ljICYgRkxBR1NfTUFTSzsKKyAgICAgIC8vIHNlcUlkCisgICAgICB1aW50MzJfdCBzZXFJZF9uOworICAgICAgbWVtY3B5KCZzZXFJZF9uLCByQnVmXy5nZXQoKSArIDQsIHNpemVvZihzZXFJZF9uKSk7CisgICAgICBzZXFJZCA9IG50b2hsKHNlcUlkX24pOworICAgICAgLy8gaGVhZGVyIHNpemUKKyAgICAgIHVpbnQxNl90IGhlYWRlclNpemVfbjsKKyAgICAgIG1lbWNweSgmaGVhZGVyU2l6ZV9uLCByQnVmXy5nZXQoKSArIDgsIHNpemVvZihoZWFkZXJTaXplX24pKTsKKyAgICAgIHVpbnQxNl90IGhlYWRlclNpemUgPSBudG9ocyhoZWFkZXJTaXplX24pOworICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOworICAgICAgcmVhZEhlYWRlckZvcm1hdChoZWFkZXJTaXplLCBzeik7CisgICAgfSBlbHNlIHsKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfVU5LTk9XTl9DTElFTlRfVFlQRTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZWN0IGNsaWVudCB0cmFuc3BvcnQgdHlwZSIpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFJlYWRzIGEgc3RyaW5nIGZyb20gcHRyLCB0YWtpbmcgY2FyZSBub3QgdG8gcmVhY2ggaGVhZGVyQm91bmRhcnkKKyAqIEFkdmFuY2VzIHB0ciBvbiBzdWNjZXNzCisgKgorICogQHBhcmFtICAgc3RyICAgICAgICAgICAgIG91dHB1dCBzdHJpbmcKKyAqIEB0aHJvd3MgIENPUlJVUFRFRF9EQVRBICBpZiBzaXplIG9mIHN0cmluZyBleGNlZWRzIGJvdW5kYXJ5CisgKi8KK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVhZFN0cmluZyh1aW50OF90KiYgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLyBzdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvbnN0KiBoZWFkZXJCb3VuZGFyeSkgeworICBpbnQzMl90IHN0ckxlbjsKKworICB1aW50MzJfdCBieXRlcyA9IHJlYWRWYXJpbnQzMihwdHIsICZzdHJMZW4sIGhlYWRlckJvdW5kYXJ5KTsKKyAgaWYgKHN0ckxlbiA+IGhlYWRlckJvdW5kYXJ5IC0gcHRyKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmZvIGhlYWRlciBsZW5ndGggZXhjZWVkcyBoZWFkZXIgc2l6ZSIpOworICB9CisgIHB0ciArPSBieXRlczsKKyAgc3RyLmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwdHIpLCBzdHJMZW4pOworICBwdHIgKz0gc3RyTGVuOworfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRIZWFkZXJGb3JtYXQodWludDE2X3QgaGVhZGVyU2l6ZSwgdWludDMyX3Qgc3opIHsKKyAgcmVhZFRyYW5zXy5jbGVhcigpOyAgIC8vIENsZWFyIG91dCBhbnkgcHJldmlvdXMgdHJhbnNmb3Jtcy4KKyAgcmVhZEhlYWRlcnNfLmNsZWFyKCk7IC8vIENsZWFyIG91dCBhbnkgcHJldmlvdXMgaGVhZGVycy4KKworICAvLyBza2lwIG92ZXIgYWxyZWFkeSBwcm9jZXNzZWQgbWFnaWMoNCksIHNlcUlkKDQpLCBoZWFkZXJTaXplKDIpCisgIGF1dG8qIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHJCdWZfLmdldCgpICsgMTApOworCisgIC8vIENhdGNoIGludGVnZXIgb3ZlcmZsb3csIGNoZWNrIGZvciByZWFzb25hYmxlIGhlYWRlciBzaXplCisgIGlmIChoZWFkZXJTaXplID49IDE2Mzg0KSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFkZXIgc2l6ZSBpcyB1bnJlYXNvbmFibGUiKTsKKyAgfQorICBoZWFkZXJTaXplICo9IDQ7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGhlYWRlckJvdW5kYXJ5ID0gcHRyICsgaGVhZGVyU2l6ZTsKKyAgaWYgKGhlYWRlclNpemUgPiBzeikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHNpemUgaXMgbGFyZ2VyIHRoYW4gZnJhbWUiKTsKKyAgfQorICB1aW50OF90KiBkYXRhID0gcHRyICsgaGVhZGVyU2l6ZTsKKyAgcHRyICs9IHJlYWRWYXJpbnQxNihwdHIsICZwcm90b0lkLCBoZWFkZXJCb3VuZGFyeSk7CisgIGludDE2X3QgbnVtVHJhbnNmb3JtczsKKyAgcHRyICs9IHJlYWRWYXJpbnQxNihwdHIsICZudW1UcmFuc2Zvcm1zLCBoZWFkZXJCb3VuZGFyeSk7CisKKyAgLy8gRm9yIG5vdyBhbGwgdHJhbnNmb3JtcyBjb25zaXN0IG9mIG9ubHkgdGhlIElELCBub3QgZGF0YS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UcmFuc2Zvcm1zOyBpKyspIHsKKyAgICBpbnQzMl90IHRyYW5zSWQ7CisgICAgcHRyICs9IHJlYWRWYXJpbnQzMihwdHIsICZ0cmFuc0lkLCBoZWFkZXJCb3VuZGFyeSk7CisKKyAgICByZWFkVHJhbnNfLnB1c2hfYmFjayh0cmFuc0lkKTsKKyAgfQorCisgIC8vIEluZm8gaGVhZGVycworICB3aGlsZSAocHRyIDwgaGVhZGVyQm91bmRhcnkpIHsKKyAgICBpbnQzMl90IGluZm9JZDsKKyAgICBwdHIgKz0gcmVhZFZhcmludDMyKHB0ciwgJmluZm9JZCwgaGVhZGVyQm91bmRhcnkpOworCisgICAgaWYgKGluZm9JZCA9PSAwKSB7CisgICAgICAvLyBoZWFkZXIgcGFkZGluZworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpbmZvSWQgPj0gaW5mb0lkVHlwZTo6RU5EKSB7CisgICAgICAvLyBjYW5ub3QgaGFuZGxlIGluZm9JZAorICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAoaW5mb0lkKSB7CisgICAgY2FzZSBpbmZvSWRUeXBlOjpLRVlWQUxVRToKKyAgICAgIC8vIFByb2Nlc3Mga2V5LXZhbHVlIGhlYWRlcnMKKyAgICAgIHVpbnQzMl90IG51bUtWSGVhZGVyczsKKyAgICAgIHB0ciArPSByZWFkVmFyaW50MzIocHRyLCAoaW50MzJfdCopJm51bUtWSGVhZGVycywgaGVhZGVyQm91bmRhcnkpOworICAgICAgLy8gY29udGludWUgdW50aWwgd2UgcmVhY2ggKHBhZGRlZCkgZW5kIG9mIHBhY2tldAorICAgICAgd2hpbGUgKG51bUtWSGVhZGVycy0tICYmIHB0ciA8IGhlYWRlckJvdW5kYXJ5KSB7CisgICAgICAgIC8vIGZvcm1hdDoga2V5OyB2YWx1ZQorICAgICAgICAvLyBib3RoOiBsZW5ndGggKHZhcmludDMyKTsgdmFsdWUgKHN0cmluZykKKyAgICAgICAgc3RyaW5nIGtleSwgdmFsdWU7CisgICAgICAgIHJlYWRTdHJpbmcocHRyLCBrZXksIGhlYWRlckJvdW5kYXJ5KTsKKyAgICAgICAgLy8gdmFsdWUKKyAgICAgICAgcmVhZFN0cmluZyhwdHIsIHZhbHVlLCBoZWFkZXJCb3VuZGFyeSk7CisgICAgICAgIC8vIHNhdmUgdG8gaGVhZGVycworICAgICAgICByZWFkSGVhZGVyc19ba2V5XSA9IHZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gVW50cmFuc2Zvcm0gdGhlIGRhdGEgc2VjdGlvbi4gIHJCdWYgd2lsbCBjb250YWluIHJlc3VsdC4KKyAgdW50cmFuc2Zvcm0oZGF0YSwgc2FmZV9udW1lcmljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHB0cmRpZmZfdD4oc3opIC0gKGRhdGEgLSByQnVmXy5nZXQoKSkpKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0Ojp1bnRyYW5zZm9ybSh1aW50OF90KiBwdHIsIHVpbnQzMl90IHN6KSB7CisgIC8vIFVwZGF0ZSB0aGUgdHJhbnNmb3JtIGJ1ZmZlciBzaXplIGlmIG5lZWRlZAorICByZXNpemVUcmFuc2Zvcm1CdWZmZXIoKTsKKworICBmb3IgKHZlY3Rvcjx1aW50MTZfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVhZFRyYW5zXy5iZWdpbigpOyBpdCAhPSByZWFkVHJhbnNfLmVuZCgpOyArK2l0KSB7CisgICAgY29uc3QgdWludDE2X3QgdHJhbnNJZCA9ICppdDsKKworICAgIGlmICh0cmFuc0lkID09IFpMSUJfVFJBTlNGT1JNKSB7CisgICAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgICBpbnQgZXJyOworCisgICAgICBzdHJlYW0ubmV4dF9pbiA9IHB0cjsKKyAgICAgIHN0cmVhbS5hdmFpbF9pbiA9IHN6OworCisgICAgICAvLyBTZXR0aW5nIHRoZXNlIHRvIDAgbWVhbnMgdXNlIHRoZSBkZWZhdWx0IGZyZWUvYWxsb2MgZnVuY3Rpb25zCisgICAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpbnVsbHB0cjsKKyAgICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpbnVsbHB0cjsKKyAgICAgIHN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKW51bGxwdHI7CisgICAgICBlcnIgPSBpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVJbml0Iik7CisgICAgICB9CisgICAgICBzdHJlYW0ubmV4dF9vdXQgPSB0QnVmXy5nZXQoKTsKKyAgICAgIHN0cmVhbS5hdmFpbF9vdXQgPSB0QnVmU2l6ZV87CisgICAgICBlcnIgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EIHx8IHN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGUiKTsKKyAgICAgIH0KKyAgICAgIHN6ID0gc3RyZWFtLnRvdGFsX291dDsKKworICAgICAgZXJyID0gaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVFbmQiKTsKKyAgICAgIH0KKworICAgICAgbWVtY3B5KHB0ciwgdEJ1Zl8uZ2V0KCksIHN6KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsICJVbmtub3duIHRyYW5zZm9ybSIpOworICAgIH0KKyAgfQorCisgIHNldFJlYWRCdWZmZXIocHRyLCBzeik7Cit9CisKKy8qKgorICogV2UgbWF5IGhhdmUgdXBkYXRlZCB0aGUgd0J1ZiBzaXplLCB1cGRhdGUgdGhlIHRCdWYgc2l6ZSB0byBtYXRjaC4KKyAqIFNob3VsZCBiZSBjYWxsZWQgaW4gdHJhbnNmb3JtLgorICoKKyAqIFRoZSBidWZmZXIgc2hvdWxkIGJlIHNsaWdodGx5IGxhcmdlciB0aGFuIHdyaXRlIGJ1ZmZlciBzaXplIGR1ZSB0bworICogY29tcHJlc3Npb24gdHJhbnNmb3JtcyAodGhhdCBtYXkgc2xpZ2h0bHkgZ3JvdyBvbiBzbWFsbCBmcmFtZSBzaXplcykKKyAqLwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpyZXNpemVUcmFuc2Zvcm1CdWZmZXIodWludDMyX3QgYWRkaXRpb25hbFNpemUpIHsKKyAgaWYgKHRCdWZTaXplXyA8IHdCdWZTaXplXyArIERFRkFVTFRfQlVGRkVSX1NJWkUpIHsKKyAgICB1aW50MzJfdCBuZXdfc2l6ZSA9IHdCdWZTaXplXyArIERFRkFVTFRfQlVGRkVSX1NJWkUgKyBhZGRpdGlvbmFsU2l6ZTsKKyAgICBhdXRvKiBuZXdfYnVmID0gbmV3IHVpbnQ4X3RbbmV3X3NpemVdOworICAgIHRCdWZfLnJlc2V0KG5ld19idWYpOworICAgIHRCdWZTaXplXyA9IG5ld19zaXplOworICB9Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6dHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opIHsKKyAgLy8gVXBkYXRlIHRoZSB0cmFuc2Zvcm0gYnVmZmVyIHNpemUgaWYgbmVlZGVkCisgIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcigpOworCisgIGZvciAodmVjdG9yPHVpbnQxNl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB3cml0ZVRyYW5zXy5iZWdpbigpOyBpdCAhPSB3cml0ZVRyYW5zXy5lbmQoKTsgKytpdCkgeworICAgIGNvbnN0IHVpbnQxNl90IHRyYW5zSWQgPSAqaXQ7CisKKyAgICBpZiAodHJhbnNJZCA9PSBaTElCX1RSQU5TRk9STSkgeworICAgICAgel9zdHJlYW0gc3RyZWFtOworICAgICAgaW50IGVycjsKKworICAgICAgc3RyZWFtLm5leHRfaW4gPSBwdHI7CisgICAgICBzdHJlYW0uYXZhaWxfaW4gPSBzejsKKworICAgICAgc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKW51bGxwdHI7CisgICAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKW51bGxwdHI7CisgICAgICBzdHJlYW0ub3BhcXVlID0gKHZvaWRwZiludWxscHRyOworICAgICAgZXJyID0gZGVmbGF0ZUluaXQoJnN0cmVhbSwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVJbml0Iik7CisgICAgICB9CisgICAgICB1aW50MzJfdCB0YnVmX3NpemUgPSAwOworICAgICAgd2hpbGUgKGVyciA9PSBaX09LKSB7CisgICAgICAgIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcih0YnVmX3NpemUpOworCisgICAgICAgIHN0cmVhbS5uZXh0X291dCA9IHRCdWZfLmdldCgpOworICAgICAgICBzdHJlYW0uYXZhaWxfb3V0ID0gdEJ1ZlNpemVfOworICAgICAgICBlcnIgPSBkZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgICAgdGJ1Zl9zaXplICs9IERFRkFVTFRfQlVGRkVSX1NJWkU7CisgICAgICB9CisgICAgICBzeiA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKyAgICAgIGVyciA9IGRlZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgICBpZiAoZXJyICE9IFpfT0spIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgemxpYiBkZWZsYXRlRW5kIik7CisgICAgICB9CisKKyAgICAgIG1lbWNweShwdHIsIHRCdWZfLmdldCgpLCBzeik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsICJVbmtub3duIHRyYW5zZm9ybSIpOworICAgIH0KKyAgfQorCisgIHdCYXNlXyA9IHdCdWZfLmdldCgpICsgc3o7Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVzZXRQcm90b2NvbCgpIHsKKyAgLy8gU2V0IHRvIGFueXRoaW5nIGV4Y2VwdCBIVFRQIHR5cGUgc28gd2UgZG9uJ3QgZmx1c2ggYWdhaW4KKyAgY2xpZW50VHlwZSA9IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEU7CisKKyAgLy8gUmVhZCB0aGUgaGVhZGVyIGFuZCBkZWNpZGUgd2hpY2ggcHJvdG9jb2wgdG8gZ28gd2l0aAorICByZWFkRnJhbWUoKTsKK30KKwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6Z2V0V3JpdGVCeXRlcygpIHsKKyAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7Cit9CisKKy8qKgorICogV3JpdGVzIGEgc3RyaW5nIHRvIGEgYnl0ZSBidWZmZXIsIGFzIHNpemUgKHZhcmludDMyKSArIHN0cmluZyAobm9uLW51bGwKKyAqIHRlcm1pbmF0ZWQpCisgKiBBdXRvbWF0aWNhbGx5IGFkdmFuY2VzIHB0ciB0byBhZnRlciB0aGUgd3JpdHRlbiBwb3J0aW9uCisgKi8KK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6d3JpdGVTdHJpbmcodWludDhfdComIHB0ciwgY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgYXV0byBzdHJMZW4gPSBzYWZlX251bWVyaWNfY2FzdDxpbnQzMl90PihzdHIubGVuZ3RoKCkpOworICBwdHIgKz0gd3JpdGVWYXJpbnQzMihzdHJMZW4sIHB0cik7CisgIG1lbWNweShwdHIsIHN0ci5jX3N0cigpLCBzdHJMZW4pOyAvLyBubyBuZWVkIHRvIHdyaXRlIFwwCisgIHB0ciArPSBzdHJMZW47Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6c2V0SGVhZGVyKGNvbnN0IHN0cmluZyYga2V5LCBjb25zdCBzdHJpbmcmIHZhbHVlKSB7CisgIHdyaXRlSGVhZGVyc19ba2V5XSA9IHZhbHVlOworfQorCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpnZXRNYXhXcml0ZUhlYWRlcnNTaXplKCkgY29uc3QgeworICBzaXplX3QgbWF4V3JpdGVIZWFkZXJzU2l6ZSA9IDA7CisgIFRIZWFkZXJUcmFuc3BvcnQ6OlN0cmluZ1RvU3RyaW5nTWFwOjpjb25zdF9pdGVyYXRvciBpdDsKKyAgZm9yIChpdCA9IHdyaXRlSGVhZGVyc18uYmVnaW4oKTsgaXQgIT0gd3JpdGVIZWFkZXJzXy5lbmQoKTsgKytpdCkgeworICAgIC8vIGFkZCBzaXplcyBvZiBrZXkgYW5kIHZhbHVlIHRvIG1heFdyaXRlSGVhZGVyc1NpemUKKyAgICAvLyAyIHZhcmludHMzMiArIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMKKyAgICBtYXhXcml0ZUhlYWRlcnNTaXplICs9IDUgKyA1ICsgKGl0LT5maXJzdCkubGVuZ3RoKCkgKyAoaXQtPnNlY29uZCkubGVuZ3RoKCk7CisgIH0KKyAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90PihtYXhXcml0ZUhlYWRlcnNTaXplKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpjbGVhckhlYWRlcnMoKSB7CisgIHdyaXRlSGVhZGVyc18uY2xlYXIoKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgLy8gV3JpdGUgb3V0IGFueSBkYXRhIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlci4KKyAgdWludDMyX3QgaGF2ZUJ5dGVzID0gZ2V0V3JpdGVCeXRlcygpOworCisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpIHsKKyAgICB0cmFuc2Zvcm0od0J1Zl8uZ2V0KCksIGhhdmVCeXRlcyk7CisgICAgaGF2ZUJ5dGVzID0gZ2V0V3JpdGVCeXRlcygpOyAvLyB0cmFuc2Zvcm0gbWF5IGhhdmUgY2hhbmdlZCB0aGUgc2l6ZQorICB9CisKKyAgLy8gTm90ZSB0aGF0IHdlIHJlc2V0IHdCYXNlXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgIHdCYXNlXyA9IHdCdWZfLmdldCgpOworCisgIGlmIChoYXZlQnl0ZXMgPiBNQVhfRlJBTUVfU0laRSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byBzZW5kIGZyYW1lIHRoYXQgaXMgdG9vIGxhcmdlIik7CisgIH0KKworICBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFKSB7CisgICAgLy8gaGVhZGVyIHNpemUgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgYXQgdGhlIGVuZCBiZWNhdXNlIG9mIHZhcmludHMuCisgICAgLy8gTWFrZSBpdCBiaWcgZW5vdWdoIGhlcmUgZm9yIG1heCB2YXJpbnQgc2l6ZSwgcGx1cyA0IGZvciBwYWRkaW5nLgorICAgIHVpbnQzMl90IGhlYWRlclNpemUgPSAoMiArIGdldE51bVRyYW5zZm9ybXMoKSkgKiBUSFJJRlRfTUFYX1ZBUklOVDMyX0JZVEVTICsgNDsKKyAgICAvLyBhZGQgYXBwcm94aW1hdGUgc2l6ZSBvZiBpbmZvIGhlYWRlcnMKKyAgICBoZWFkZXJTaXplICs9IGdldE1heFdyaXRlSGVhZGVyc1NpemUoKTsKKworICAgIC8vIFBrdCBzaXplCisgICAgdWludDMyX3QgbWF4U3pIYm8gPSBoZWFkZXJTaXplICsgaGF2ZUJ5dGVzIC8vIHRocmlmdCBoZWFkZXIgKyBwYXlsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICArIDEwOyAgICAgICAgICAgICAgICAgIC8vIGNvbW1vbiBoZWFkZXIgc2VjdGlvbgorICAgIHVpbnQ4X3QqIHBrdCA9IHRCdWZfLmdldCgpOworICAgIHVpbnQ4X3QqIGhlYWRlclN0YXJ0OworICAgIHVpbnQ4X3QqIGhlYWRlclNpemVQdHI7CisgICAgdWludDhfdCogcGt0U3RhcnQgPSBwa3Q7CisKKyAgICBpZiAobWF4U3pIYm8gPiB0QnVmU2l6ZV8pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIGhlYWRlciBmcmFtZSB0aGF0IGlzIHRvbyBsYXJnZSIpOworICAgIH0KKworICAgIHVpbnQzMl90IHN6SGJvOworICAgIHVpbnQzMl90IHN6TmJvOworICAgIHVpbnQxNl90IGhlYWRlclNpemVOOworCisgICAgLy8gRml4dXAgc3pIYm8gbGF0ZXIKKyAgICBwa3QgKz0gc2l6ZW9mKHN6TmJvKTsKKyAgICB1aW50MTZfdCBoZWFkZXJOID0gaHRvbnMoSEVBREVSX01BR0lDID4+IDE2KTsKKyAgICBtZW1jcHkocGt0LCAmaGVhZGVyTiwgc2l6ZW9mKGhlYWRlck4pKTsKKyAgICBwa3QgKz0gc2l6ZW9mKGhlYWRlck4pOworICAgIHVpbnQxNl90IGZsYWdzTiA9IGh0b25zKGZsYWdzKTsKKyAgICBtZW1jcHkocGt0LCAmZmxhZ3NOLCBzaXplb2YoZmxhZ3NOKSk7CisgICAgcGt0ICs9IHNpemVvZihmbGFnc04pOworICAgIHVpbnQzMl90IHNlcUlkTiA9IGh0b25sKHNlcUlkKTsKKyAgICBtZW1jcHkocGt0LCAmc2VxSWROLCBzaXplb2Yoc2VxSWROKSk7CisgICAgcGt0ICs9IHNpemVvZihzZXFJZE4pOworICAgIGhlYWRlclNpemVQdHIgPSBwa3Q7CisgICAgLy8gRml4dXAgaGVhZGVyU2l6ZU4gbGF0ZXIKKyAgICBwa3QgKz0gc2l6ZW9mKGhlYWRlclNpemVOKTsKKyAgICBoZWFkZXJTdGFydCA9IHBrdDsKKworICAgIHBrdCArPSB3cml0ZVZhcmludDMyKHByb3RvSWQsIHBrdCk7CisgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIoZ2V0TnVtVHJhbnNmb3JtcygpLCBwa3QpOworCisgICAgLy8gRm9yIG5vdywgZWFjaCB0cmFuc2Zvcm0gaXMgb25seSB0aGUgSUQsIG5vIGZvbGxvd2luZyBkYXRhLgorICAgIGZvciAodmVjdG9yPHVpbnQxNl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB3cml0ZVRyYW5zXy5iZWdpbigpOyBpdCAhPSB3cml0ZVRyYW5zXy5lbmQoKTsgKytpdCkgeworICAgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIoKml0LCBwa3QpOworICAgIH0KKworICAgIC8vIHdyaXRlIGluZm8gaGVhZGVycworCisgICAgLy8gZm9yIG5vdyBvbmx5IHdyaXRlIGt2LWhlYWRlcnMKKyAgICBhdXRvIGhlYWRlckNvdW50ID0gc2FmZV9udW1lcmljX2Nhc3Q8aW50MzJfdD4od3JpdGVIZWFkZXJzXy5zaXplKCkpOworICAgIGlmIChoZWFkZXJDb3VudCA+IDApIHsKKyAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKGluZm9JZFR5cGU6OktFWVZBTFVFLCBwa3QpOworICAgICAgLy8gV3JpdGUga2V5LXZhbHVlIGhlYWRlcnMgY291bnQKKyAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGhlYWRlckNvdW50KSwgcGt0KTsKKyAgICAgIC8vIFdyaXRlIGluZm8gaGVhZGVycworICAgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgICAgICBmb3IgKGl0ID0gd3JpdGVIZWFkZXJzXy5iZWdpbigpOyBpdCAhPSB3cml0ZUhlYWRlcnNfLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHdyaXRlU3RyaW5nKHBrdCwgaXQtPmZpcnN0KTsgIC8vIGtleQorICAgICAgICB3cml0ZVN0cmluZyhwa3QsIGl0LT5zZWNvbmQpOyAvLyB2YWx1ZQorICAgICAgfQorICAgICAgd3JpdGVIZWFkZXJzXy5jbGVhcigpOworICAgIH0KKworICAgIC8vIEZpeHVwcyBhZnRlciB2YXJpbnQgc2l6ZSBjYWxjdWxhdGlvbnMKKyAgICBoZWFkZXJTaXplID0gc2FmZV9udW1lcmljX2Nhc3Q8dWludDMyX3Q+KHBrdCAtIGhlYWRlclN0YXJ0KTsKKyAgICB1aW50OF90IHBhZGRpbmcgPSA0IC0gKGhlYWRlclNpemUgJSA0KTsKKyAgICBoZWFkZXJTaXplICs9IHBhZGRpbmc7CisKKyAgICAvLyBQYWQgb3V0IHBrdCB3aXRoIDB4MDAKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZGRpbmc7IGkrKykgeworICAgICAgKihwa3QrKykgPSAweDAwOworICAgIH0KKworICAgIC8vIFBrdCBzaXplCisgICAgcHRyZGlmZl90IHN6SGJwID0gKGhlYWRlclN0YXJ0IC0gcGt0U3RhcnQgLSA0KTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN6SGJwKSA+IHN0YXRpY19jYXN0PHVpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD4oKS5tYXgpKCkpIC0gKGhlYWRlclNpemUgKyBoYXZlQnl0ZXMpKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHNlY3Rpb24gc2l6ZSBpcyB1bnJlYXNvbmFibGUiKTsKKyAgICB9CisgICAgc3pIYm8gPSBoZWFkZXJTaXplICsgaGF2ZUJ5dGVzICAgICAgICAgIC8vIHRocmlmdCBoZWFkZXIgKyBwYXlsb2FkCisgICAgICAgICAgICArIHN0YXRpY19jYXN0PHVpbnQzMl90PihzekhicCk7IC8vIGNvbW1vbiBoZWFkZXIgc2VjdGlvbgorICAgIGhlYWRlclNpemVOID0gaHRvbnMoaGVhZGVyU2l6ZSAvIDQpOworICAgIG1lbWNweShoZWFkZXJTaXplUHRyLCAmaGVhZGVyU2l6ZU4sIHNpemVvZihoZWFkZXJTaXplTikpOworCisgICAgLy8gU2V0IGZyYW1pbmcgc2l6ZS4KKyAgICBzek5ibyA9IGh0b25sKHN6SGJvKTsKKyAgICBtZW1jcHkocGt0U3RhcnQsICZzek5ibywgc2l6ZW9mKHN6TmJvKSk7CisKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZShwa3RTdGFydCwgc3pIYm8gLSBoYXZlQnl0ZXMgKyA0KTsKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZUJ5dGVzKTsKKyAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9GUkFNRURfQklOQVJZIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX0ZSQU1FRF9DT01QQUNUKSB7CisgICAgYXV0byBzekhibyA9ICh1aW50MzJfdCloYXZlQnl0ZXM7CisgICAgdWludDMyX3Qgc3pOYm8gPSBodG9ubChzekhibyk7CisKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmc3pOYm8pLCA0KTsKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZUJ5dGVzKTsKKyAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9CSU5BUlkgfHwgY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQ09NUEFDVCkgeworICAgIG91dFRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBoYXZlQnl0ZXMpOworICB9IGVsc2UgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJVbmtub3duIGNsaWVudCB0eXBlIik7CisgIH0KKworICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgIG91dFRyYW5zcG9ydF8tPmZsdXNoKCk7Cit9CisKKy8qKgorICogUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDMgYnl0ZXMuCisgKi8KK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRWYXJpbnQxNih1aW50OF90IGNvbnN0KiBwdHIsIGludDE2X3QqIGkxNiwgdWludDhfdCBjb25zdCogYm91bmRhcnkpIHsKKyAgaW50MzJfdCB2YWw7CisgIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDMyKHB0ciwgJnZhbCwgYm91bmRhcnkpOworICAqaTE2ID0gKGludDE2X3QpdmFsOworICByZXR1cm4gcnNpemU7Cit9CisKKy8qKgorICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCisgKi8KK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRWYXJpbnQzMih1aW50OF90IGNvbnN0KiBwdHIsIGludDMyX3QqIGkzMiwgdWludDhfdCBjb25zdCogYm91bmRhcnkpIHsKKworICB1aW50MzJfdCByc2l6ZSA9IDA7CisgIHVpbnQzMl90IHZhbCA9IDA7CisgIGludCBzaGlmdCA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAocHRyID09IGJvdW5kYXJ5KSB7CisgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJ5aW5nIHRvIHJlYWQgcGFzdCBoZWFkZXIgYm91bmRhcnkiKTsKKyAgICB9CisgICAgdWludDhfdCBieXRlID0gKihwdHIrKyk7CisgICAgcnNpemUrKzsKKyAgICB2YWwgfD0gKHVpbnQ2NF90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgc2hpZnQgKz0gNzsKKyAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICAgICppMzIgPSB2YWw7CisgICAgICByZXR1cm4gcnNpemU7CisgICAgfQorICB9Cit9CisKKy8qKgorICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAqLwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6d3JpdGVWYXJpbnQzMihpbnQzMl90IG4sIHVpbnQ4X3QqIHBrdCkgeworICB1aW50OF90IGJ1Zls1XTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpbjsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorCisgIC8vIENhbGxlciB3aWxsIGFkdmFuY2UgcGt0LgorICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd3NpemU7IGkrKykgeworICAgIHBrdFtpXSA9IGJ1ZltpXTsKKyAgfQorCisgIHJldHVybiB3c2l6ZTsKK30KKwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6d3JpdGVWYXJpbnQxNihpbnQxNl90IG4sIHVpbnQ4X3QqIHBrdCkgeworICByZXR1cm4gd3JpdGVWYXJpbnQzMihuLCBwa3QpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTlkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaApAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9UUkFOU1BPUlRfVEhFQURFUlRSQU5TUE9SVF9IXworI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX1RIRUFERVJUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxib29zdC9zY29wZWRfYXJyYXkuaHBwPgorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKworZW51bSBDTElFTlRfVFlQRSB7CisgIFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUgPSAwLAorICBUSFJJRlRfRlJBTUVEX0JJTkFSWSA9IDEsCisgIFRIUklGVF9VTkZSQU1FRF9CSU5BUlkgPSAyLAorICBUSFJJRlRfRlJBTUVEX0NPTVBBQ1QgPSAzLAorICBUSFJJRlRfVU5GUkFNRURfQ09NUEFDVCA9IDQsCisgIFRIUklGVF9VTktOT1dOX0NMSUVOVF9UWVBFID0gNSwKK307CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0NPTVBBQ1RfUFJPVE9DT0w7CisKKy8qKgorICogSGVhZGVyIHRyYW5zcG9ydC4gQWxsIHdyaXRlcyBnbyBpbnRvIGFuIGluLW1lbW9yeSBidWZmZXIgdW50aWwgZmx1c2ggaXMKKyAqIGNhbGxlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIHRyYW5zcG9ydCB3cml0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgZW50aXJlCisgKiBiaW5hcnkgY2h1bmsgZm9sbG93ZWQgYnkgdGhlIGRhdGEgcGF5bG9hZC4gVGhpcyBhbGxvd3MgdGhlIHJlY2VpdmVyIG9uIHRoZQorICogb3RoZXIgZW5kIHRvIGFsd2F5cyBkbyBmaXhlZC1sZW5ndGggcmVhZHMuCisgKgorICogU3ViY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBiZWNhdXNlIG1vc3Qgb2YgdGhlIHJlYWQvd3JpdGUgbWV0aG9kcyBhcmUgc2ltaWxhcgorICogYW5kIG5lZWQgc2ltaWxhciBidWZmZXJzLiAgTWFqb3IgY2hhbmdlcyBhcmUgcmVhZEZyYW1lICYgZmx1c2guCisgKgorICogSGVhZGVyIFRyYW5zcG9ydCAqbXVzdCogYmUgdGhlIHNhbWUgdHJhbnNwb3J0IGZvciBib3RoIGlucHV0IGFuZAorICogb3V0cHV0IHdoZW4gdXNlZCBvbiB0aGUgc2VydmVyIHNpZGUgLSBjbGllbnQgcmVzcG9uc2VzIHNob3VsZCBiZQorICogdGhlIHNhbWUgcHJvdG9jb2wgYXMgdGhvc2UgaW4gdGhlIHJlcXVlc3QuCisgKi8KK2NsYXNzIFRIZWFkZXJUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEhlYWRlclRyYW5zcG9ydCwgVEZyYW1lZFRyYW5zcG9ydD4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSA1MTJ1OworICBzdGF0aWMgY29uc3QgaW50IFRIUklGVF9NQVhfVkFSSU5UMzJfQllURVMgPSA1OworCisgIC8vLyBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCisgIGV4cGxpY2l0IFRIZWFkZXJUcmFuc3BvcnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQpCisgICAgOiBUVmlydHVhbFRyYW5zcG9ydCh0cmFuc3BvcnQpLAorICAgICAgb3V0VHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgcHJvdG9JZChUX0NPTVBBQ1RfUFJPVE9DT0wpLAorICAgICAgY2xpZW50VHlwZShUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFKSwKKyAgICAgIHNlcUlkKDApLAorICAgICAgZmxhZ3MoMCksCisgICAgICB0QnVmU2l6ZV8oMCksCisgICAgICB0QnVmXyhudWxscHRyKSB7CisgICAgaWYgKCF0cmFuc3BvcnRfKSB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoInRyYW5zcG9ydCBpcyBlbXB0eSIpOworICAgIGluaXRCdWZmZXJzKCk7CisgIH0KKworICBUSGVhZGVyVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpblRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0VHJhbnNwb3J0KQorICAgIDogVFZpcnR1YWxUcmFuc3BvcnQoaW5UcmFuc3BvcnQpLAorICAgICAgb3V0VHJhbnNwb3J0XyhvdXRUcmFuc3BvcnQpLAorICAgICAgcHJvdG9JZChUX0NPTVBBQ1RfUFJPVE9DT0wpLAorICAgICAgY2xpZW50VHlwZShUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFKSwKKyAgICAgIHNlcUlkKDApLAorICAgICAgZmxhZ3MoMCksCisgICAgICB0QnVmU2l6ZV8oMCksCisgICAgICB0QnVmXyhudWxscHRyKSB7CisgICAgaWYgKCF0cmFuc3BvcnRfKSB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoImluVHJhbnNwb3J0IGlzIGVtcHR5Iik7CisgICAgaWYgKCFvdXRUcmFuc3BvcnRfKSB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIm91dFRyYW5zcG9ydCBpcyBlbXB0eSIpOworICAgIGluaXRCdWZmZXJzKCk7CisgIH0KKworICB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgb3ZlcnJpZGU7CisgIHZvaWQgZmx1c2goKSBvdmVycmlkZTsKKworICB2b2lkIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcih1aW50MzJfdCBhZGRpdGlvbmFsU2l6ZSA9IDApOworCisgIHVpbnQxNl90IGdldFByb3RvY29sSWQoKSBjb25zdDsKKyAgdm9pZCBzZXRQcm90b2NvbElkKHVpbnQxNl90IHByb3RvSWQpIHsgdGhpcy0+cHJvdG9JZCA9IHByb3RvSWQ7IH0KKworICB2b2lkIHJlc2V0UHJvdG9jb2woKTsKKworICAvKioKKyAgICogV2Uga25vdyB3ZSBnb3QgYSBwYWNrZXQgaW4gaGVhZGVyIGZvcm1hdCBoZXJlLCB0cnkgdG8gcGFyc2UgdGhlIGhlYWRlcgorICAgKgorICAgKiBAcGFyYW0gaGVhZGVyU2l6ZSBzaXplIG9mIHRoZSBoZWFkZXIgcG9ydGlvbgorICAgKiBAcGFyYW0gc3ogU2l6ZSBvZiB0aGUgd2hvbGUgbWVzc2FnZSwgaW5jbHVkaW5nIGhlYWRlcgorICAgKi8KKyAgdm9pZCByZWFkSGVhZGVyRm9ybWF0KHVpbnQxNl90IGhlYWRlclNpemUsIHVpbnQzMl90IHN6KTsKKworICAvKioKKyAgICogVW50cmFuc2Zvcm0gdGhlIGRhdGEgYmFzZWQgb24gdGhlIHJlY2VpdmVkIGhlYWRlciBmbGFncworICAgKiBPbiBjb25jbHVzaW9uIG9mIGZ1bmN0aW9uLCBzZXRSZWFkQnVmZmVyIGlzIGNhbGxlZCB3aXRoIHRoZQorICAgKiB1bnRyYW5zZm9ybWVkIGRhdGEuCisgICAqCisgICAqIEBwYXJhbSBwdHIgcHRyIHRvIGRhdGEKKyAgICogQHBhcmFtIHNpemUgb2YgZGF0YQorICAgKi8KKyAgdm9pZCB1bnRyYW5zZm9ybSh1aW50OF90KiBwdHIsIHVpbnQzMl90IHN6KTsKKworICAvKioKKyAgICogVHJhbnNmb3JtIHRoZSBkYXRhIGJhc2VkIG9uIG91ciB3cml0ZSB0cmFuc2Zvcm0gZmxhZ3MKKyAgICogQXQgY29uY2x1c2lvbiBvZiBmdW5jdGlvbiB0aGUgd3JpdGUgYnVmZmVyIGlzIHNldCB0byB0aGUKKyAgICogdHJhbnNmb3JtZWQgZGF0YS4KKyAgICoKKyAgICogQHBhcmFtIHB0ciBQdHIgdG8gZGF0YSB0byB0cmFuc2Zvcm0KKyAgICogQHBhcmFtIHN6IFNpemUgb2YgZGF0YSBidWZmZXIKKyAgICovCisgIHZvaWQgdHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opOworCisgIHVpbnQxNl90IGdldE51bVRyYW5zZm9ybXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQxNl90Pih3cml0ZVRyYW5zXy5zaXplKCkpOworICB9CisKKyAgdm9pZCBzZXRUcmFuc2Zvcm0odWludDE2X3QgdHJhbnNJZCkgeyB3cml0ZVRyYW5zXy5wdXNoX2JhY2sodHJhbnNJZCk7IH0KKworICAvLyBJbmZvIGhlYWRlcnMKKworICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gU3RyaW5nVG9TdHJpbmdNYXA7CisKKyAgLy8gdGhlc2Ugd29yayB3aXRoIHdyaXRlIGhlYWRlcnMKKyAgdm9pZCBzZXRIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKworICB2b2lkIGNsZWFySGVhZGVycygpOworCisgIFN0cmluZ1RvU3RyaW5nTWFwJiBnZXRXcml0ZUhlYWRlcnMoKSB7IHJldHVybiB3cml0ZUhlYWRlcnNfOyB9CisKKyAgLy8gdGhlc2Ugd29yayB3aXRoIHJlYWQgaGVhZGVycworICBjb25zdCBTdHJpbmdUb1N0cmluZ01hcCYgZ2V0SGVhZGVycygpIGNvbnN0IHsgcmV0dXJuIHJlYWRIZWFkZXJzXzsgfQorCisgIC8vIGFjY2Vzc29ycyBmb3Igc2VxSWQKKyAgaW50MzJfdCBnZXRTZXF1ZW5jZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIHNlcUlkOyB9CisgIHZvaWQgc2V0U2VxdWVuY2VOdW1iZXIoaW50MzJfdCBzZXFJZCkgeyB0aGlzLT5zZXFJZCA9IHNlcUlkOyB9CisKKyAgZW51bSBUUkFOU0ZPUk1TIHsKKyAgICBaTElCX1RSQU5TRk9STSA9IDB4MDEsCisgIH07CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIFJlYWRzIGEgZnJhbWUgb2YgaW5wdXQgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAqCisgICAqIFJldHVybnMgdHJ1ZSBpZiBhIGZyYW1lIHdhcyByZWFkIHN1Y2Nlc3NmdWxseSwgb3IgZmFsc2Ugb24gRU9GLgorICAgKiAoUmFpc2VzIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBFT0Ygb2NjdXJzIGFmdGVyIGEgcGFydGlhbCBmcmFtZS4pCisgICAqLworICBib29sIHJlYWRGcmFtZSgpIG92ZXJyaWRlOworCisgIHZvaWQgZW5zdXJlUmVhZEJ1ZmZlcih1aW50MzJfdCBzeik7CisgIHVpbnQzMl90IGdldFdyaXRlQnl0ZXMoKTsKKworICB2b2lkIGluaXRCdWZmZXJzKCkgeworICAgIHNldFJlYWRCdWZmZXIobnVsbHB0ciwgMCk7CisgICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0VHJhbnNwb3J0XzsKKworICAvLyAwIGFuZCAxNnRoIGJpdHMgbXVzdCBiZSAwIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBmcmFtZWQgJiB1bmZyYW1lZAorICBzdGF0aWMgY29uc3QgdWludDMyX3QgSEVBREVSX01BR0lDID0gMHgwRkZGMDAwMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEhFQURFUl9NQVNLID0gMHhGRkZGMDAwMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEZMQUdTX01BU0sgPSAweDAwMDBGRkZGOworCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfRlJBTUVfU0laRSA9IDB4M0ZGRkZGRkY7CisKKyAgaW50MTZfdCBwcm90b0lkOworICB1aW50MTZfdCBjbGllbnRUeXBlOworICB1aW50MzJfdCBzZXFJZDsKKyAgdWludDE2X3QgZmxhZ3M7CisKKyAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IHJlYWRUcmFuc187CisgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiB3cml0ZVRyYW5zXzsKKworICAvLyBNYXAgdG8gdXNlIGZvciBoZWFkZXJzCisgIFN0cmluZ1RvU3RyaW5nTWFwIHJlYWRIZWFkZXJzXzsKKyAgU3RyaW5nVG9TdHJpbmdNYXAgd3JpdGVIZWFkZXJzXzsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3cml0ZSBrL3YgaGVhZGVycyBjYW4gdGFrZQorICAgKi8KKyAgdWludDMyX3QgZ2V0TWF4V3JpdGVIZWFkZXJzU2l6ZSgpIGNvbnN0OworCisgIHN0cnVjdCBpbmZvSWRUeXBlIHsKKyAgICBlbnVtIGlkVHlwZSB7CisgICAgICAvLyBzdGFydCBhdCAxIHRvIGF2b2lkIGNvbmZ1c2luZyBoZWFkZXIgcGFkZGluZyBmb3IgYW4gaW5mb0lkCisgICAgICBLRVlWQUxVRSA9IDEsCisgICAgICBFTkQgLy8gc2lnbmFsIHRoZSBlbmQgb2YgaW5mb0lkcyB3ZSBjYW4gaGFuZGxlCisgICAgfTsKKyAgfTsKKworICAvLyBCdWZmZXJzIHRvIHVzZSBmb3IgdHJhbnNmb3JtIHByb2Nlc3NpbmcKKyAgdWludDMyX3QgdEJ1ZlNpemVfOworICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IHRCdWZfOworCisgIHZvaWQgcmVhZFN0cmluZyh1aW50OF90KiYgcHRyLCAvKiBvdXQgKi8gc3RkOjpzdHJpbmcmIHN0ciwgdWludDhfdCBjb25zdCogaGVhZGVyQm91bmRhcnkpOworCisgIHZvaWQgd3JpdGVTdHJpbmcodWludDhfdComIHB0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgLy8gVmFyaW50IHV0aWxzCisgIC8qKgorICAgKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAzIGJ5dGVzLgorICAgKi8KKyAgdWludDMyX3QgcmVhZFZhcmludDE2KHVpbnQ4X3QgY29uc3QqIHB0ciwgaW50MTZfdCogaTE2LCB1aW50OF90IGNvbnN0KiBib3VuZGFyeSk7CisKKyAgLyoqCisgICAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCisgICAqLworICB1aW50MzJfdCByZWFkVmFyaW50MzIodWludDhfdCBjb25zdCogcHRyLCBpbnQzMl90KiBpMzIsIHVpbnQ4X3QgY29uc3QqIGJvdW5kYXJ5KTsKKworICAvKioKKyAgICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICovCisgIHVpbnQzMl90IHdyaXRlVmFyaW50MzIoaW50MzJfdCBuLCB1aW50OF90KiBwa3QpOworCisgIC8qKgorICAgKiBXcml0ZSBhbiBpMTYgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0zIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgKi8KKyAgdWludDMyX3Qgd3JpdGVWYXJpbnQxNihpbnQxNl90IG4sIHVpbnQ4X3QqIHBrdCk7Cit9OworCisvKioKKyAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSBoZWFkZXIgb25lLgorICoKKyAqLworY2xhc3MgVEhlYWRlclRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFRyYW5zcG9ydEZhY3RvcnkgeworcHVibGljOgorICBUSGVhZGVyVHJhbnNwb3J0RmFjdG9yeSgpID0gZGVmYXVsdDsKKworICB+VEhlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgLyoqCisgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGhlYWRlciBvbmUuCisgICAqLworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgb3ZlcnJpZGUgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIZWFkZXJUcmFuc3BvcnQodHJhbnMpKTsKKyAgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBUSFJJRlRfVFJBTlNQT1JUX1RIRUFERVJUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5jcHAKaW5kZXggYzYxMDYzNi4uMDQ1NjZjOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5jcHAKQEAgLTIyLDMzICsyMiwzMyBAQAogI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8Ym9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHA+CiAKKyNpbmNsdWRlIDx0aHJpZnQvY29uZmlnLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgogCit1c2luZyBzdGQ6OnN0cmluZzsKKwogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1USHR0cENsaWVudDo6VEh0dHBDbGllbnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAorVEh0dHBDbGllbnQ6OlRIdHRwQ2xpZW50KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXRoKQogICA6IFRIdHRwVHJhbnNwb3J0KHRyYW5zcG9ydCksIGhvc3RfKGhvc3QpLCBwYXRoXyhwYXRoKSB7CiB9CiAKIFRIdHRwQ2xpZW50OjpUSHR0cENsaWVudChzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0cmluZyBwYXRoKQotICA6IFRIdHRwVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpKSksCisgIDogVEh0dHBUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpKSksCiAgICAgaG9zdF8oaG9zdCksCiAgICAgcGF0aF8ocGF0aCkgewogfQogCi1USHR0cENsaWVudDo6flRIdHRwQ2xpZW50KCkgewotfQorVEh0dHBDbGllbnQ6On5USHR0cENsaWVudCgpID0gZGVmYXVsdDsKIAogdm9pZCBUSHR0cENsaWVudDo6cGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKSB7CiAgIGNoYXIqIGNvbG9uID0gc3RyY2hyKGhlYWRlciwgJzonKTsKLSAgaWYgKGNvbG9uID09IE5VTEwpIHsKKyAgaWYgKGNvbG9uID09IG51bGxwdHIpIHsKICAgICByZXR1cm47CiAgIH0KICAgY2hhciogdmFsdWUgPSBjb2xvbiArIDE7CkBAIC02Nyw3ICs2Nyw3IEBACiAgIGNoYXIqIGh0dHAgPSBzdGF0dXM7CiAKICAgY2hhciogY29kZSA9IHN0cmNocihodHRwLCAnICcpOwotICBpZiAoY29kZSA9PSBOVUxMKSB7CisgIGlmIChjb2RlID09IG51bGxwdHIpIHsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1czogIikgKyBzdGF0dXMpOwogICB9CiAKQEAgLTc2LDcgKzc2LDcgQEAKICAgfTsKIAogICBjaGFyKiBtc2cgPSBzdHJjaHIoY29kZSwgJyAnKTsKLSAgaWYgKG1zZyA9PSBOVUxMKSB7CisgIGlmIChtc2cgPT0gbnVsbHB0cikgewogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzOiAiKSArIHN0YXR1cyk7CiAgIH0KICAgKm1zZyA9ICdcMCc7CkBAIC0xMDIsNyArMTAyLDcgQEAKICAgc3RkOjpvc3RyaW5nc3RyZWFtIGg7CiAgIGggPDwgIlBPU1QgIiA8PCBwYXRoXyA8PCAiIEhUVFAvMS4xIiA8PCBDUkxGIDw8ICJIb3N0OiAiIDw8IGhvc3RfIDw8IENSTEYKICAgICA8PCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PCAiQ29udGVudC1MZW5ndGg6ICIgPDwgbGVuIDw8IENSTEYKLSAgICA8PCAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PCAiVXNlci1BZ2VudDogVGhyaWZ0LyIgPDwgVkVSU0lPTgorICAgIDw8ICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8ICJVc2VyLUFnZW50OiBUaHJpZnQvIiA8PCBQQUNLQUdFX1ZFUlNJT04KICAgICA8PCAiIChDKysvVEh0dHBDbGllbnQpIiA8PCBDUkxGIDw8IENSTEY7CiAgIHN0cmluZyBoZWFkZXIgPSBoLnN0cigpOwogCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmgKaW5kZXggNjRlNzMzMi4uZmRjYTUwNSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaApAQCAtMjgsMjAgKzI4LDIwIEBACiAKIGNsYXNzIFRIdHRwQ2xpZW50IDogcHVibGljIFRIdHRwVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgVEh0dHBDbGllbnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBzdGQ6OnN0cmluZyBob3N0LCBzdGQ6OnN0cmluZyBwYXRoID0gIiIpOworICBUSHR0cENsaWVudChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBzdGQ6OnN0cmluZyBob3N0LCBzdGQ6OnN0cmluZyBwYXRoID0gIiIpOwogCiAgIFRIdHRwQ2xpZW50KHN0ZDo6c3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdGQ6OnN0cmluZyBwYXRoID0gIiIpOwogCi0gIHZpcnR1YWwgflRIdHRwQ2xpZW50KCk7CisgIH5USHR0cENsaWVudCgpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBmbHVzaCgpOworICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGU7CiAKIHByb3RlY3RlZDoKICAgc3RkOjpzdHJpbmcgaG9zdF87CiAgIHN0ZDo6c3RyaW5nIHBhdGhfOwogCi0gIHZpcnR1YWwgdm9pZCBwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpOwotICB2aXJ0dWFsIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cyk7CisgIHZvaWQgcGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKSBvdmVycmlkZTsKKyAgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKSBvdmVycmlkZTsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCmluZGV4IGEyMGQ2MTIuLjk0YWM2ODEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCkBAIC0yMSw0MiArMjEsNDQgQEAKICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KLSNpZmRlZiBfTVNDX1ZFUgotI2luY2x1ZGUgPFNobHdhcGkuaD4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAjaW5jbHVkZSA8U2hsd2FwaS5oPgogI2VuZGlmCiAKK3VzaW5nIHN0ZDo6c3RyaW5nOworCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLVRIdHRwU2VydmVyOjpUSHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIDogVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSB7CitUSHR0cFNlcnZlcjo6VEh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgOiBUSHR0cFRyYW5zcG9ydCh0cmFuc3BvcnQpIHsKIH0KIAotVEh0dHBTZXJ2ZXI6On5USHR0cFNlcnZlcigpIHsKLX0KK1RIdHRwU2VydmVyOjp+VEh0dHBTZXJ2ZXIoKSA9IGRlZmF1bHQ7CiAKLSNpZmRlZiBfTVNDX1ZFUgorI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisgICNkZWZpbmUgVEhSSUZUX0dNVElNRShUTSwgVElNRSkgICAgICAgICAgICAgZ210aW1lX3MoJlRNLCAmVElNRSkKICAgI2RlZmluZSBUSFJJRlRfc3RybmNhc2VjbXAoc3RyMSwgc3RyMiwgbGVuKSBfc3RybmljbXAoc3RyMSwgc3RyMiwgbGVuKQogICAjZGVmaW5lIFRIUklGVF9zdHJjYXNlc3RyKGhheXN0YWNrLCBuZWVkbGUpIFN0clN0cklBKGhheXN0YWNrLCBuZWVkbGUpCiAjZWxzZQorICAjZGVmaW5lIFRIUklGVF9HTVRJTUUoVE0sIFRJTUUpICAgICAgICAgICAgIGdtdGltZV9yKCZUSU1FLCAmVE0pCiAgICNkZWZpbmUgVEhSSUZUX3N0cm5jYXNlY21wKHN0cjEsIHN0cjIsIGxlbikgc3RybmNhc2VjbXAoc3RyMSwgc3RyMiwgbGVuKQogICAjZGVmaW5lIFRIUklGVF9zdHJjYXNlc3RyKGhheXN0YWNrLCBuZWVkbGUpIHN0cmNhc2VzdHIoaGF5c3RhY2ssIG5lZWRsZSkKICNlbmRpZgogCiB2b2lkIFRIdHRwU2VydmVyOjpwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpIHsKICAgY2hhciogY29sb24gPSBzdHJjaHIoaGVhZGVyLCAnOicpOwotICBpZiAoY29sb24gPT0gTlVMTCkgeworICBpZiAoY29sb24gPT0gbnVsbHB0cikgewogICAgIHJldHVybjsKICAgfQogICBzaXplX3Qgc3ogPSBjb2xvbiAtIGhlYWRlcjsKICAgY2hhciogdmFsdWUgPSBjb2xvbiArIDE7CiAKICAgaWYgKFRIUklGVF9zdHJuY2FzZWNtcChoZWFkZXIsICJUcmFuc2Zlci1FbmNvZGluZyIsIHN6KSA9PSAwKSB7Ci0gICAgaWYgKFRIUklGVF9zdHJjYXNlc3RyKHZhbHVlLCAiY2h1bmtlZCIpICE9IE5VTEwpIHsKKyAgICBpZiAoVEhSSUZUX3N0cmNhc2VzdHIodmFsdWUsICJjaHVua2VkIikgIT0gbnVsbHB0cikgewogICAgICAgY2h1bmtlZF8gPSB0cnVlOwogICAgIH0KICAgfSBlbHNlIGlmIChUSFJJRlRfc3RybmNhc2VjbXAoaGVhZGVyLCAiQ29udGVudC1sZW5ndGgiLCBzeikgPT0gMCkgewpAQCAtNzEsNyArNzMsNyBAQAogICBjaGFyKiBtZXRob2QgPSBzdGF0dXM7CiAKICAgY2hhciogcGF0aCA9IHN0cmNocihtZXRob2QsICcgJyk7Ci0gIGlmIChwYXRoID09IE5VTEwpIHsKKyAgaWYgKHBhdGggPT0gbnVsbHB0cikgewogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzOiAiKSArIHN0YXR1cyk7CiAgIH0KIApAQCAtODAsNyArODIsNyBAQAogICB9OwogCiAgIGNoYXIqIGh0dHAgPSBzdHJjaHIocGF0aCwgJyAnKTsKLSAgaWYgKGh0dHAgPT0gTlVMTCkgeworICBpZiAoaHR0cCA9PSBudWxscHRyKSB7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKICAgfQogICAqaHR0cCA9ICdcMCc7CkBAIC0xMjQsNyArMTI2LDcgQEAKICAgLy8gQ29uc3RydWN0IHRoZSBIVFRQIGhlYWRlcgogICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKICAgaCA8PCAiSFRUUC8xLjEgMjAwIE9LIiA8PCBDUkxGIDw8ICJEYXRlOiAiIDw8IGdldFRpbWVSRkMxMTIzKCkgPDwgQ1JMRiA8PCAiU2VydmVyOiBUaHJpZnQvIgotICAgIDw8IFZFUlNJT04gPDwgQ1JMRiA8PCAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqIiA8PCBDUkxGCisgICAgPDwgUEFDS0FHRV9WRVJTSU9OIDw8IENSTEYgPDwgIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKiIgPDwgQ1JMRgogICAgIDw8ICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8ICJDb250ZW50LUxlbmd0aDogIiA8PCBsZW4gPDwgQ1JMRgogICAgIDw8ICJDb25uZWN0aW9uOiBLZWVwLUFsaXZlIiA8PCBDUkxGIDw8IENSTEY7CiAgIHN0cmluZyBoZWFkZXIgPSBoLnN0cigpOwpAQCAtMTQ1LDE4ICsxNDcsMjAgQEAKICAgc3RhdGljIGNvbnN0IGNoYXIqIE1vbnRoc1tdCiAgICAgICA9IHsiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMifTsKICAgY2hhciBidWZmWzEyOF07Ci0gIHRpbWVfdCB0ID0gdGltZShOVUxMKTsKLSAgdG0qIGJyb2tlbl90ID0gZ210aW1lKCZ0KTsKKworICB0aW1lX3QgdCA9IHRpbWUobnVsbHB0cik7CisgIHN0cnVjdCB0bSB0bWI7CisgIFRIUklGVF9HTVRJTUUodG1iLCB0KTsKIAogICBzcHJpbnRmKGJ1ZmYsCiAgICAgICAgICAgIiVzLCAlZCAlcyAlZCAlZDolZDolZCBHTVQiLAotICAgICAgICAgIERheXNbYnJva2VuX3QtPnRtX3dkYXldLAotICAgICAgICAgIGJyb2tlbl90LT50bV9tZGF5LAotICAgICAgICAgIE1vbnRoc1ticm9rZW5fdC0+dG1fbW9uXSwKLSAgICAgICAgICBicm9rZW5fdC0+dG1feWVhciArIDE5MDAsCi0gICAgICAgICAgYnJva2VuX3QtPnRtX2hvdXIsCi0gICAgICAgICAgYnJva2VuX3QtPnRtX21pbiwKLSAgICAgICAgICBicm9rZW5fdC0+dG1fc2VjKTsKKyAgICAgICAgICBEYXlzW3RtYi50bV93ZGF5XSwKKyAgICAgICAgICB0bWIudG1fbWRheSwKKyAgICAgICAgICBNb250aHNbdG1iLnRtX21vbl0sCisgICAgICAgICAgdG1iLnRtX3llYXIgKyAxOTAwLAorICAgICAgICAgIHRtYi50bV9ob3VyLAorICAgICAgICAgIHRtYi50bV9taW4sCisgICAgICAgICAgdG1iLnRtX3NlYyk7CiAgIHJldHVybiBzdGQ6OnN0cmluZyhidWZmKTsKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaAppbmRleCBhN2FiOTQ0Li4wZTgzMzk5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oCkBAIC0yOCwxNiArMjgsMTYgQEAKIAogY2xhc3MgVEh0dHBTZXJ2ZXIgOiBwdWJsaWMgVEh0dHBUcmFuc3BvcnQgewogcHVibGljOgotICBUSHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpOworICBUSHR0cFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKIAotICB2aXJ0dWFsIH5USHR0cFNlcnZlcigpOworICB+VEh0dHBTZXJ2ZXIoKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKKyAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlOwogCiBwcm90ZWN0ZWQ6CiAgIHZvaWQgcmVhZEhlYWRlcnMoKTsKLSAgdmlydHVhbCB2b2lkIHBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcik7Ci0gIHZpcnR1YWwgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKTsKKyAgdm9pZCBwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpIG92ZXJyaWRlOworICBib29sIHBhcnNlU3RhdHVzTGluZShjaGFyKiBzdGF0dXMpIG92ZXJyaWRlOwogICBzdGQ6OnN0cmluZyBnZXRUaW1lUkZDMTEyMygpOwogfTsKIApAQCAtNDYsMTUgKzQ2LDE1IEBACiAgKi8KIGNsYXNzIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CiBwdWJsaWM6Ci0gIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisgIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSgpID0gZGVmYXVsdDsKIAotICB2aXJ0dWFsIH5USHR0cFNlcnZlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQorICB+VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgIC8qKgogICAgKiBXcmFwcyB0aGUgdHJhbnNwb3J0IGludG8gYSBidWZmZXJlZCBvbmUuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEh0dHBTZXJ2ZXIodHJhbnMpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSHR0cFNlcnZlcih0cmFucykpOwogICB9CiB9OwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcAppbmRleCBhNDY2ZmY2Li5hZWEyYjI4IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcApAQCAtMjEsMTcgKzIxLDE3IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0Lmg+CiAKK3VzaW5nIHN0ZDo6c3RyaW5nOworCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KIC8vIFllYWgsIHllYWgsIGhhY2t5IHRvIHB1dCB0aGVzZSBoZXJlLCBJIGtub3cuCiBjb25zdCBjaGFyKiBUSHR0cFRyYW5zcG9ydDo6Q1JMRiA9ICJcclxuIjsKIGNvbnN0IGludCBUSHR0cFRyYW5zcG9ydDo6Q1JMRl9MRU4gPSAyOwogCi1USHR0cFRyYW5zcG9ydDo6VEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQorVEh0dHBUcmFuc3BvcnQ6OlRIdHRwVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCiAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAogICAgIG9yaWdpbl8oIiIpLAogICAgIHJlYWRIZWFkZXJzXyh0cnVlKSwKQEAgLTM5LDcgKzM5LDcgQEAKICAgICBjaHVua2VkRG9uZV8oZmFsc2UpLAogICAgIGNodW5rU2l6ZV8oMCksCiAgICAgY29udGVudExlbmd0aF8oMCksCi0gICAgaHR0cEJ1Zl8oTlVMTCksCisgICAgaHR0cEJ1Zl8obnVsbHB0ciksCiAgICAgaHR0cFBvc18oMCksCiAgICAgaHR0cEJ1Zkxlbl8oMCksCiAgICAgaHR0cEJ1ZlNpemVfKDEwMjQpIHsKQEAgLTQ4LDE0ICs0OCwxNCBAQAogCiB2b2lkIFRIdHRwVHJhbnNwb3J0Ojppbml0KCkgewogICBodHRwQnVmXyA9IChjaGFyKilzdGQ6Om1hbGxvYyhodHRwQnVmU2l6ZV8gKyAxKTsKLSAgaWYgKGh0dHBCdWZfID09IE5VTEwpIHsKKyAgaWYgKGh0dHBCdWZfID09IG51bGxwdHIpIHsKICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICB9CiAgIGh0dHBCdWZfW2h0dHBCdWZMZW5fXSA9ICdcMCc7CiB9CiAKIFRIdHRwVHJhbnNwb3J0Ojp+VEh0dHBUcmFuc3BvcnQoKSB7Ci0gIGlmIChodHRwQnVmXyAhPSBOVUxMKSB7CisgIGlmIChodHRwQnVmXyAhPSBudWxscHRyKSB7CiAgICAgc3RkOjpmcmVlKGh0dHBCdWZfKTsKICAgfQogfQpAQCAtODQsOCArODQsMTAgQEAKIHVpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpyZWFkTW9yZURhdGEoKSB7CiAgIHVpbnQzMl90IHNpemU7CiAKLSAgLy8gR2V0IG1vcmUgZGF0YSEKLSAgcmVmaWxsKCk7CisgIGlmIChodHRwUG9zXyA9PSBodHRwQnVmTGVuXykgeworICAgIC8vIEdldCBtb3JlIGRhdGEhCisgICAgcmVmaWxsKCk7CisgIH0KIAogICBpZiAocmVhZEhlYWRlcnNfKSB7CiAgICAgcmVhZEhlYWRlcnMoKTsKQEAgLTEzMCw3ICsxMzIsNyBAQAogCiB1aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cGFyc2VDaHVua1NpemUoY2hhciogbGluZSkgewogICBjaGFyKiBzZW1pID0gc3RyY2hyKGxpbmUsICc7Jyk7Ci0gIGlmIChzZW1pICE9IE5VTEwpIHsKKyAgaWYgKHNlbWkgIT0gbnVsbHB0cikgewogICAgICpzZW1pID0gJ1wwJzsKICAgfQogICB1aW50MzJfdCBzaXplID0gMDsKQEAgLTE2NCwxMiArMTY2LDEyIEBACiAKIGNoYXIqIFRIdHRwVHJhbnNwb3J0OjpyZWFkTGluZSgpIHsKICAgd2hpbGUgKHRydWUpIHsKLSAgICBjaGFyKiBlb2wgPSBOVUxMOworICAgIGNoYXIqIGVvbCA9IG51bGxwdHI7CiAKICAgICBlb2wgPSBzdHJzdHIoaHR0cEJ1Zl8gKyBodHRwUG9zXywgQ1JMRik7CiAKICAgICAvLyBObyBDUkxGIHlldD8KLSAgICBpZiAoZW9sID09IE5VTEwpIHsKKyAgICBpZiAoZW9sID09IG51bGxwdHIpIHsKICAgICAgIC8vIFNoaWZ0IHdoYXRldmVyIHdlIGhhdmUgbm93IHRvIGZyb250IGFuZCByZWZpbGwKICAgICAgIHNoaWZ0KCk7CiAgICAgICByZWZpbGwoKTsKQEAgLTIwMCwxMCArMjAyLDExIEBACiAgIHVpbnQzMl90IGF2YWlsID0gaHR0cEJ1ZlNpemVfIC0gaHR0cEJ1Zkxlbl87CiAgIGlmIChhdmFpbCA8PSAoaHR0cEJ1ZlNpemVfIC8gNCkpIHsKICAgICBodHRwQnVmU2l6ZV8gKj0gMjsKLSAgICBodHRwQnVmXyA9IChjaGFyKilzdGQ6OnJlYWxsb2MoaHR0cEJ1Zl8sIGh0dHBCdWZTaXplXyArIDEpOwotICAgIGlmIChodHRwQnVmXyA9PSBOVUxMKSB7CisgICAgY2hhciogdG1wQnVmID0gKGNoYXIqKXN0ZDo6cmVhbGxvYyhodHRwQnVmXywgaHR0cEJ1ZlNpemVfICsgMSk7CisgICAgaWYgKHRtcEJ1ZiA9PSBudWxscHRyKSB7CiAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICAgIH0KKyAgICBodHRwQnVmXyA9IHRtcEJ1ZjsKICAgfQogCiAgIC8vIFJlYWQgbW9yZSBkYXRhCkBAIC0yMTIsNyArMjE1LDcgQEAKICAgaHR0cEJ1Zl9baHR0cEJ1Zkxlbl9dID0gJ1wwJzsKIAogICBpZiAoZ290ID09IDApIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgcmVmaWxsIGJ1ZmZlciIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsICJDb3VsZCBub3QgcmVmaWxsIGJ1ZmZlciIpOwogICB9CiB9CiAKQEAgLTI1NCw3ICsyNTcsNyBAQAogICB3cml0ZUJ1ZmZlcl8ud3JpdGUoYnVmLCBsZW4pOwogfQogCi1jb25zdCBzdGQ6OnN0cmluZyBUSHR0cFRyYW5zcG9ydDo6Z2V0T3JpZ2luKCkgeworY29uc3Qgc3RkOjpzdHJpbmcgVEh0dHBUcmFuc3BvcnQ6OmdldE9yaWdpbigpIGNvbnN0IHsKICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKICAgaWYgKCFvcmlnaW5fLmVtcHR5KCkpIHsKICAgICBvc3MgPDwgb3JpZ2luXyA8PCAiLCAiOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oCmluZGV4IGE5ZjU2NGMuLjc1ZjBkOGMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmgKQEAgLTM2LDMwICszNiwzMCBAQAogICovCiBjbGFzcyBUSHR0cFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUSHR0cFRyYW5zcG9ydD4gewogcHVibGljOgotICBUSHR0cFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpOworICBUSHR0cFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKIAotICB2aXJ0dWFsIH5USHR0cFRyYW5zcG9ydCgpOworICB+VEh0dHBUcmFuc3BvcnQoKSBvdmVycmlkZTsKIAotICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQorICB2b2lkIG9wZW4oKSBvdmVycmlkZSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQogCi0gIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7IH0KKyAgYm9vbCBpc09wZW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsgfQogCi0gIGJvb2wgcGVlaygpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPnBlZWsoKTsgfQorICBib29sIHBlZWsoKSBvdmVycmlkZSB7IHJldHVybiB0cmFuc3BvcnRfLT5wZWVrKCk7IH0KIAotICB2b2lkIGNsb3NlKCkgeyB0cmFuc3BvcnRfLT5jbG9zZSgpOyB9CisgIHZvaWQgY2xvc2UoKSBvdmVycmlkZSB7IHRyYW5zcG9ydF8tPmNsb3NlKCk7IH0KIAogICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIAotICB1aW50MzJfdCByZWFkRW5kKCk7CisgIHVpbnQzMl90IHJlYWRFbmQoKSBvdmVycmlkZTsKIAogICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIAotICB2aXJ0dWFsIHZvaWQgZmx1c2goKSA9IDA7CisgIHZvaWQgZmx1c2goKSBvdmVycmlkZSA9IDA7CiAKLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0T3JpZ2luKCkgY29uc3Qgb3ZlcnJpZGU7CiAKIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CiAgIHN0ZDo6c3RyaW5nIG9yaWdpbl87CiAKICAgVE1lbW9yeUJ1ZmZlciB3cml0ZUJ1ZmZlcl87CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlYzVkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogTm9uYmxvY2tpbmcgU1NMIHNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24uCisgKi8KK1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgIDogVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CisgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7Cit9CisKK1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQorICA6IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChhZGRyZXNzLCBwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgeworICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOworfQorCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlbmRUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjdlRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCwgc2VuZFRpbWVvdXQsIHJlY3ZUaW1lb3V0KSwgZmFjdG9yeV8oZmFjdG9yeSkgeworICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHRTU0xTb2NrZXQ7CisgIHRTU0xTb2NrZXQgPSBmYWN0b3J5Xy0+Y3JlYXRlU29ja2V0KGNsaWVudCk7CisgIHRTU0xTb2NrZXQtPnNldExpYmV2ZW50U2FmZSgpOworICByZXR1cm4gdFNTTFNvY2tldDsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOGJmMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTU0xTRVJWRVJTT0NLRVRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU1NMU0VSVkVSU09DS0VUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgVFNTTFNvY2tldEZhY3Rvcnk7CisKKy8qKgorICogTm9uYmxvY2tpbmcgU2VydmVyIHNvY2tldCB0aGF0IGFjY2VwdHMgU1NMIGNvbm5lY3Rpb25zLgorICovCitjbGFzcyBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQgOiBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gYWxsIGludGVyZmFjZXMuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgIExpc3RlbmluZyBwb3J0CisgICAqIEBwYXJhbSBmYWN0b3J5IFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAgICoKKyAgICogQHBhcmFtIGFkZHJlc3MgQWRkcmVzcyB0byBiaW5kIHRvCisgICAqIEBwYXJhbSBwb3J0ICAgIExpc3RlbmluZyBwb3J0CisgICAqIEBwYXJhbSBmYWN0b3J5IFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gYWxsIGludGVyZmFjZXMuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgICAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gc2VuZFRpbWVvdXQgU29ja2V0IHNlbmQgdGltZW91dAorICAgKiBAcGFyYW0gcmVjdlRpbWVvdXQgU29ja2V0IHJlY2VpdmUgdGltZW91dAorICAgKiBAcGFyYW0gZmFjdG9yeSAgICAgU1NMIHNvY2tldCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCisgICAqLworICBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgaW50IHNlbmRUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgIGludCByZWN2VGltZW91dCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpIG92ZXJyaWRlOworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnlfOworfTsKK30KK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkwMmI5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcApAQCAtMCwwICsxLDU0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1VOX0gKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVElORVRfSU5fSAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2lmbmRlZiBBRl9MT0NBTAorI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCisjZW5kaWYKKworI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAorI2Vsc2UKKyNkZWZpbmUgU09DS09QVF9DQVNUX1QgY2hhcgorI2VuZGlmIC8vIF9XSU4zMgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U09DS09QVF9DQVNUX1QqPih2KTsKK30KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCisgIDogcG9ydF8ocG9ydCksCisgICAgbGlzdGVuUG9ydF8ocG9ydCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSB7Cit9CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCkKKyAgOiBwb3J0Xyhwb3J0KSwKKyAgICBsaXN0ZW5Qb3J0Xyhwb3J0KSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oc2VuZFRpbWVvdXQpLAorICAgIHJlY3ZUaW1lb3V0XyhyZWN2VGltZW91dCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIGFkZHJlc3MsIGludCBwb3J0KQorICA6IHBvcnRfKHBvcnQpLAorICAgIGxpc3RlblBvcnRfKHBvcnQpLAorICAgIGFkZHJlc3NfKGFkZHJlc3MpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIHBhdGgpCisgIDogcG9ydF8oMCksCisgICAgbGlzdGVuUG9ydF8oMCksCisgICAgcGF0aF8ocGF0aCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSB7Cit9CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6flROb25ibG9ja2luZ1NlcnZlclNvY2tldCgpIHsKKyAgY2xvc2UoKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFNlbmRUaW1lb3V0KGludCBzZW5kVGltZW91dCkgeworICBzZW5kVGltZW91dF8gPSBzZW5kVGltZW91dDsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCkgeworICByZWN2VGltZW91dF8gPSByZWN2VGltZW91dDsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldEFjY2VwdEJhY2tsb2coaW50IGFjY0JhY2tsb2cpIHsKKyAgYWNjZXB0QmFja2xvZ18gPSBhY2NCYWNrbG9nOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0UmV0cnlMaW1pdChpbnQgcmV0cnlMaW1pdCkgeworICByZXRyeUxpbWl0XyA9IHJldHJ5TGltaXQ7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KSB7CisgIHJldHJ5RGVsYXlfID0gcmV0cnlEZWxheTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpIHsKKyAgdGNwU2VuZEJ1ZmZlcl8gPSB0Y3BTZW5kQnVmZmVyOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0VGNwUmVjdkJ1ZmZlcihpbnQgdGNwUmVjdkJ1ZmZlcikgeworICB0Y3BSZWN2QnVmZmVyXyA9IHRjcFJlY3ZCdWZmZXI7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSB7CisgIGxpc3RlbmluZ18gPSB0cnVlOworI2lmZGVmIF9XSU4zMgorICBUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYgLy8gX1dJTjMyCisgIAorICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgorICBpZiAocG9ydF8gPCAwIHx8IHBvcnRfID4gMHhGRkZGKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgIlNwZWNpZmllZCBwb3J0IGlzIGludmFsaWQiKTsKKyAgfQorCisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcmVzOworICBpbnQgZXJyb3I7CisgIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM1IildOworICBUSFJJRlRfU05QUklOVEYocG9ydCwgc2l6ZW9mKHBvcnQpLCAiJWQiLCBwb3J0Xyk7CisKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdGQ6Om1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRSB8IEFJX0FERFJDT05GSUc7CisKKyAgLy8gSWYgYWRkcmVzcyBpcyBub3Qgc3BlY2lmaWVkIHVzZSB3aWxkY2FyZCBhZGRyZXNzIChOVUxMKQorICBUR2V0QWRkckluZm9XcmFwcGVyIGluZm8oYWRkcmVzc18uZW1wdHkoKSA/IG51bGxwdHIgOiAmYWRkcmVzc19bMF0sIHBvcnQsICZoaW50cyk7CisKKyAgZXJyb3IgPSBpbmZvLmluaXQoKTsKKyAgaWYgKGVycm9yKSB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiZ2V0YWRkcmluZm8gJWQ6ICVzIiwgZXJyb3IsIFRIUklGVF9HQUlfU1RSRVJST1IoZXJyb3IpKTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4iKTsKKyAgfQorCisgIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCisgIC8vIGludG8gaXB2NiBzcGFjZS4KKyAgZm9yIChyZXMgPSBpbmZvLnJlcygpOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgeworICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gbnVsbHB0cikKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgc2VydmVyU29ja2V0XyA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CisgIH0gZWxzZSBpZiAocmVzICE9IG51bGxwdHIpIHsKKyAgICBzZXJ2ZXJTb2NrZXRfID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKKyAgfQorCisgIGlmIChzZXJ2ZXJTb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXQoKSAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBzZXJ2ZXIgc29ja2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFNldCBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgdG8gcHJldmVudCAyTVNMIGRlbGF5IG9uIGFjY2VwdAorICBpbnQgb25lID0gMTsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HLAorICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvbmUpKSkgeworLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdCBvbiBXaW5kb3dzLiAgVGhpcyBpcyBiZWNhdXNlCisvLyBTT19FWENMVVNJVkVBRERSVVNFIHJlcXVpcmVzIGFkbWluIHByaXZpbGVnZXMgb24gV2luWFAsIGJ1dCB3ZSBkb24ndAorLy8gd2FudCB0byBmb3JjZSBzZXJ2ZXJzIHRvIGJlIGFuIGFkbWluLgorI2lmbmRlZiBfV0lOMzIKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworI2VuZGlmCisgIH0KKworICAvLyBTZXQgVENQIGJ1ZmZlciBzaXplcworICBpZiAodGNwU2VuZEJ1ZmZlcl8gPiAwKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1NOREJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFNlbmRCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwU2VuZEJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1NOREJVRiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19TTkRCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworICBpZiAodGNwUmVjdkJ1ZmZlcl8gPiAwKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1JDVkJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFJlY3ZCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwUmVjdkJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1JDVkJVRiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19SQ1ZCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworI2lmZGVmIElQVjZfVjZPTkxZCisgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiAmJiBwYXRoXy5lbXB0eSgpKSB7CisgICAgaW50IHplcm8gPSAwOworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgSVBQUk9UT19JUFY2LAorICAgICAgICAgICAgICAgICAgICAgICAgIElQVjZfVjZPTkxZLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmemVybyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHplcm8pKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBJUFY2X1Y2T05MWSAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgfQorICB9CisjZW5kaWYgLy8gI2lmZGVmIElQVjZfVjZPTkxZCisKKyAgLy8gVHVybiBsaW5nZXIgb2ZmLCBkb24ndCB3YW50IHRvIGJsb2NrIG9uIGNhbGxzIHRvIGNsb3NlCisgIHN0cnVjdCBsaW5nZXIgbGluZyA9IHswLCAwfTsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjYXN0X3NvY2tvcHQoJmxpbmcpLCBzaXplb2YobGluZykpKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19MSU5HRVIgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19MSU5HRVIiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIEtlZXBhbGl2ZSB0byBlbnN1cmUgZnVsbCByZXN1bHQgZmx1c2hpbmcKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fS0VFUEFMSVZFICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwKKyAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gU2V0IFRDUCBub2RlbGF5IGlmIGF2YWlsYWJsZSwgTUFDIE9TIFggSGFjaworICAvLyBTZWUgaHR0cDovL2xpc3RzLmRhbmdhLmNvbS9waXBlcm1haWwvbWVtY2FjaGVkLzIwMDUtTWFyY2gvMDAxMjQwLmh0bWwKKyNpZm5kZWYgVENQX05PUFVTSAorICAvLyBVbml4IFNvY2tldHMgZG8gbm90IG5lZWQgdGhhdAorICBpZiAocGF0aF8uZW1wdHkoKSkgeworICAgIC8vIFRDUCBOb2RlbGF5LCBzcGVlZCBvdmVyIGJhbmR3aWR0aAorICAgIGlmICgtMQorICAgICAgICA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTk9ERUxBWSAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLy8gU2V0IE5PTkJMT0NLIG9uIHRoZSBhY2NlcHQgc29ja2V0CisgIGludCBmbGFncyA9IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCk7CisgIGlmIChmbGFncyA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKC0xID09IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgfCBUSFJJRlRfT19OT05CTE9DSykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX09fTk9OQkxPQ0sgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTCgpIFRIUklGVF9GX1NFVEZMIFRIUklGVF9PX05PTkJMT0NLIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisjaWZkZWYgVENQX0xPV19NSU5fUlRPCisgIGlmIChUU29ja2V0OjpnZXRVc2VMb3dNaW5SdG8oKSkgeworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTE9XX01JTl9SVE8sIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX0xPV19NSU5fUlRPICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwKKyAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisjZW5kaWYKKworICAvLyBwcmVwYXJlIHRoZSBwb3J0IGluZm9ybWF0aW9uCisgIC8vIHdlIG1heSB3YW50IHRvIHRyeSB0byBiaW5kIG1vcmUgdGhhbiBvbmNlLCBzaW5jZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgZG9lc24ndAorICAvLyBhbHdheXMgc2VlbSB0byB3b3JrLiBUaGUgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHJldHJ5IHZhcmlhYmxlcy4KKyAgaW50IHJldHJpZXMgPSAwOworICBpbnQgZXJybm9fY29weSA9IDA7CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisKKyNpZm5kZWYgX1dJTjMyCisKKyAgICAvLyBVbml4IERvbWFpbiBTb2NrZXQKKyAgICBzaXplX3QgbGVuID0gcGF0aF8uc2l6ZSgpICsgMTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKCgoc29ja2FkZHJfdW4qKW51bGxwdHIpLT5zdW5fcGF0aCkpIHsKKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Omxpc3RlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKKyAgICBhZGRyZXNzLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIG1lbWNweShhZGRyZXNzLnN1bl9wYXRoLCBwYXRoXy5jX3N0cigpLCBsZW4pOworCisgICAgYXV0byBzdHJ1Y3RsZW4gPSBzdGF0aWNfY2FzdDxzb2NrbGVuX3Q+KHNpemVvZihhZGRyZXNzKSk7CisKKyAgICBpZiAoIWFkZHJlc3Muc3VuX3BhdGhbMF0pIHsgLy8gYWJzdHJhY3QgbmFtZXNwYWNlIHNvY2tldAorI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gc3VuX3BhdGggaXMgbm90IG51bGwtdGVybWluYXRlZCBpbiB0aGlzIGNhc2UgYW5kIHN0cnVjdGxlbiBkZXRlcm1pbmVzIGl0cyBsZW5ndGgKKyAgICAgIHN0cnVjdGxlbiAtPSBzaXplb2YoYWRkcmVzcy5zdW5fcGF0aCkgLSBsZW47CisjZWxzZQorICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0cyBvbmx5IHN1cHBvcnRlZCBvbiBsaW51eDogIiwgLTk5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKyAgICB9CisKKyAgICBkbyB7CisgICAgICBpZiAoMCA9PSA6OmJpbmQoc2VydmVyU29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciopJmFkZHJlc3MsIHN0cnVjdGxlbikpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCisgICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoVEhSSUZUX1NMRUVQX1NFQyhyZXRyeURlbGF5XykgPT0gMCkpOworI2Vsc2UKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCBvbiB3aW5kb3dzIiwgLTk5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBkbyB7CisgICAgICBpZiAoMCA9PSA6OmJpbmQoc2VydmVyU29ja2V0XywgcmVzLT5haV9hZGRyLCBzdGF0aWNfY2FzdDxpbnQ+KHJlcy0+YWlfYWRkcmxlbikpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgLy8gdXNlIHNob3J0IGNpcmN1aXQgZXZhbHVhdGlvbiBoZXJlIHRvIG9ubHkgc2xlZXAgaWYgd2UgbmVlZCB0bworICAgIH0gd2hpbGUgKChyZXRyaWVzKysgPCByZXRyeUxpbWl0XykgJiYgKFRIUklGVF9TTEVFUF9TRUMocmV0cnlEZWxheV8pID09IDApKTsKKworICAgIC8vIHJldHJpZXZlIGJpbmQgaW5mbworICAgIGlmIChwb3J0XyA9PSAwICYmIHJldHJpZXMgPD0gcmV0cnlMaW1pdF8pIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhOworICAgICAgc29ja2xlbl90IGxlbiA9IHNpemVvZihzYSk7CisgICAgICBzdGQ6Om1lbXNldCgmc2EsIDAsIGxlbik7CisgICAgICBpZiAoOjpnZXRzb2NrbmFtZShzZXJ2ZXJTb2NrZXRfLCByZWludGVycHJldF9jYXN0PHN0cnVjdCBzb2NrYWRkcio+KCZzYSksICZsZW4pIDwgMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6Z2V0UG9ydCgpIGdldHNvY2tuYW1lKCkgIiwgZXJybm9fY29weSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2Euc3NfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgICAgICAgY29uc3QgYXV0byogc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42Kj4oJnNhKTsKKyAgICAgICAgICBsaXN0ZW5Qb3J0XyA9IG50b2hzKHNpbi0+c2luNl9wb3J0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25zdCBhdXRvKiBzaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbio+KCZzYSk7CisgICAgICAgICAgbGlzdGVuUG9ydF8gPSBudG9ocyhzaW4tPnNpbl9wb3J0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIHRocm93IGFuIGVycm9yIGlmIHdlIGZhaWxlZCB0byBiaW5kIHByb3Blcmx5CisgIGlmIChyZXRyaWVzID4gcmV0cnlMaW1pdF8pIHsKKyAgICBjaGFyIGVycmJ1ZlsxMDI0XTsKKyAgICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKyAgICAgIFRIUklGVF9TTlBSSU5URihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBQQVRIICVzIiwgcGF0aF8uY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFRIUklGVF9TTlBSSU5URihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBCSU5EICVkIiwgcG9ydF8pOworICAgIH0KKyAgICBHbG9iYWxPdXRwdXQoZXJyYnVmKTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGJpbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBpZiAobGlzdGVuQ2FsbGJhY2tfKQorICAgIGxpc3RlbkNhbGxiYWNrXyhzZXJ2ZXJTb2NrZXRfKTsKKworICAvLyBDYWxsIGxpc3RlbgorICBpZiAoLTEgPT0gOjpsaXN0ZW4oc2VydmVyU29ja2V0XywgYWNjZXB0QmFja2xvZ18pKSB7CisgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgbGlzdGVuKCkgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGxpc3RlbiIsIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gVGhlIHNvY2tldCBpcyBub3cgbGlzdGVuaW5nIQorfQorCitpbnQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpnZXRQb3J0KCkgeworICByZXR1cm4gcG9ydF87Cit9CisKK2ludCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmdldExpc3RlblBvcnQoKSB7CisgIHJldHVybiBsaXN0ZW5Qb3J0XzsKK30KKworc2hhcmVkX3B0cjxUU29ja2V0PiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSB7CisgIGlmIChzZXJ2ZXJTb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgbm90IGxpc3RlbmluZyIpOworICB9CisgIAorICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBjbGllbnRBZGRyZXNzOworICBpbnQgc2l6ZSA9IHNpemVvZihjbGllbnRBZGRyZXNzKTsKKyAgVEhSSUZUX1NPQ0tFVCBjbGllbnRTb2NrZXQKKyAgICAgID0gOjphY2NlcHQoc2VydmVyU29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciopJmNsaWVudEFkZHJlc3MsIChzb2NrbGVuX3QqKSZzaXplKTsKKworICBpZiAoY2xpZW50U29ja2V0ID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgOjphY2NlcHQoKSAiLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJhY2NlcHQoKSIsIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gRXhwbGljaXRseSBzZXQgdGhpcyBzb2NrZXQgdG8gTk9OQkxPQ0sgbW9kZQorICBpbnQgZmxhZ3MgPSBUSFJJRlRfRkNOVEwoY2xpZW50U29ja2V0LCBUSFJJRlRfRl9HRVRGTCwgMCk7CisgIGlmIChmbGFncyA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoY2xpZW50U29ja2V0KTsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKFRIUklGVF9GX0dFVEZMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoY2xpZW50U29ja2V0LCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgfCBUSFJJRlRfT19OT05CTE9DSykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgR2xvYmFsT3V0cHV0CisgICAgICAgIC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9GX1NFVEZMIH5USFJJRlRfT19OT05CTE9DSyAiLAorICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRkNOVEwoVEhSSUZUX0ZfU0VURkwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBjbGllbnQgPSBjcmVhdGVTb2NrZXQoY2xpZW50U29ja2V0KTsKKyAgaWYgKHNlbmRUaW1lb3V0XyA+IDApIHsKKyAgICBjbGllbnQtPnNldFNlbmRUaW1lb3V0KHNlbmRUaW1lb3V0Xyk7CisgIH0KKyAgaWYgKHJlY3ZUaW1lb3V0XyA+IDApIHsKKyAgICBjbGllbnQtPnNldFJlY3ZUaW1lb3V0KHJlY3ZUaW1lb3V0Xyk7CisgIH0KKyAgaWYgKGtlZXBBbGl2ZV8pIHsKKyAgICBjbGllbnQtPnNldEtlZXBBbGl2ZShrZWVwQWxpdmVfKTsKKyAgfQorICBjbGllbnQtPnNldENhY2hlZEFkZHJlc3MoKHNvY2thZGRyKikmY2xpZW50QWRkcmVzcywgc2l6ZSk7CisKKyAgaWYgKGFjY2VwdENhbGxiYWNrXykKKyAgICBhY2NlcHRDYWxsYmFja18oY2xpZW50U29ja2V0KTsKKworICByZXR1cm4gY2xpZW50OworfQorCitzaGFyZWRfcHRyPFRTb2NrZXQ+IFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0KSB7CisgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFRTb2NrZXQ+KGNsaWVudFNvY2tldCk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpjbG9zZSgpIHsKKyAgaWYgKHNlcnZlclNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgc2h1dGRvd24oc2VydmVyU29ja2V0XywgVEhSSUZUX1NIVVRfUkRXUik7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoc2VydmVyU29ja2V0Xyk7CisgIH0KKyAgc2VydmVyU29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgbGlzdGVuaW5nXyA9IGZhbHNlOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjhjMjhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlNPQ0tFVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJTT0NLRVRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgVFNvY2tldDsKKworLyoqCisgKiBOb25ibG9ja2luZyBTZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC4gV3JhcHBlciBhcm91bmQgYSB1bml4CisgKiBzb2NrZXQgbGlzdGVuIGFuZCBhY2NlcHQgY2FsbHMuCisgKgorICovCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgOiBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoVEhSSUZUX1NPQ0tFVCBmZCk+IHNvY2tldF9mdW5jX3Q7CisKKyAgY29uc3Qgc3RhdGljIGludCBERUZBVUxUX0JBQ0tMT0cgPSAxMDI0OworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgKi8KKyAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGludCBwb3J0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgICAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqIEBwYXJhbSBzZW5kVGltZW91dCBTb2NrZXQgc2VuZCB0aW1lb3V0CisgICAqIEBwYXJhbSByZWN2VGltZW91dCBTb2NrZXQgcmVjZWl2ZSB0aW1lb3V0CisgICAqLworICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBzZW5kVGltZW91dCwgaW50IHJlY3ZUaW1lb3V0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgKiBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqLworICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsIGludCBwb3J0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IgdXNlZCBmb3IgdW5peCBzb2NrZXRzLgorICAgKgorICAgKiBAcGFyYW0gcGF0aCBQYXRobmFtZSBmb3IgdW5peCBzb2NrZXQuCisgICAqLworICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOworCisgIH5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoKSBvdmVycmlkZTsKKworICB2b2lkIHNldFNlbmRUaW1lb3V0KGludCBzZW5kVGltZW91dCk7CisgIHZvaWQgc2V0UmVjdlRpbWVvdXQoaW50IHJlY3ZUaW1lb3V0KTsKKworICB2b2lkIHNldEFjY2VwdEJhY2tsb2coaW50IGFjY0JhY2tsb2cpOworCisgIHZvaWQgc2V0UmV0cnlMaW1pdChpbnQgcmV0cnlMaW1pdCk7CisgIHZvaWQgc2V0UmV0cnlEZWxheShpbnQgcmV0cnlEZWxheSk7CisKKyAgdm9pZCBzZXRLZWVwQWxpdmUoYm9vbCBrZWVwQWxpdmUpIHsga2VlcEFsaXZlXyA9IGtlZXBBbGl2ZTsgfQorCisgIHZvaWQgc2V0VGNwU2VuZEJ1ZmZlcihpbnQgdGNwU2VuZEJ1ZmZlcik7CisgIHZvaWQgc2V0VGNwUmVjdkJ1ZmZlcihpbnQgdGNwUmVjdkJ1ZmZlcik7CisKKyAgLy8gbGlzdGVuQ2FsbGJhY2sgZ2V0cyBjYWxsZWQganVzdCBiZWZvcmUgbGlzdGVuLCBhbmQgYWZ0ZXIgYWxsIFRocmlmdAorICAvLyBzZXRzb2Nrb3B0IGNhbGxzIGhhdmUgYmVlbiBtYWRlLiAgSWYgeW91IGhhdmUgY3VzdG9tIHNldHNvY2tvcHQKKyAgLy8gdGhpbmdzIHRoYXQgbmVlZCB0byBoYXBwZW4gb24gdGhlIGxpc3RlbmluZyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorICB2b2lkIHNldExpc3RlbkNhbGxiYWNrKGNvbnN0IHNvY2tldF9mdW5jX3QmIGxpc3RlbkNhbGxiYWNrKSB7IGxpc3RlbkNhbGxiYWNrXyA9IGxpc3RlbkNhbGxiYWNrOyB9CisKKyAgLy8gYWNjZXB0Q2FsbGJhY2sgZ2V0cyBjYWxsZWQgYWZ0ZXIgZWFjaCBhY2NlcHQgY2FsbCwgb24gdGhlIG5ld2x5IGNyZWF0ZWQgc29ja2V0LgorICAvLyBJdCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIFRocmlmdCBzZXRzb2Nrb3B0IGNhbGxzIGhhdmUgYmVlbiBtYWRlLiAgSWYgeW91IGhhdmUKKyAgLy8gY3VzdG9tIHNldHNvY2tvcHQgdGhpbmdzIHRoYXQgbmVlZCB0byBoYXBwZW4gb24gdGhlIGFjY2VwdGVkCisgIC8vIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgIHZvaWQgc2V0QWNjZXB0Q2FsbGJhY2soY29uc3Qgc29ja2V0X2Z1bmNfdCYgYWNjZXB0Q2FsbGJhY2spIHsgYWNjZXB0Q2FsbGJhY2tfID0gYWNjZXB0Q2FsbGJhY2s7IH0KKworICBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgb3ZlcnJpZGUgeyByZXR1cm4gc2VydmVyU29ja2V0XzsgfQorCisgIGludCBnZXRQb3J0KCkgb3ZlcnJpZGU7CisgIAorICBpbnQgZ2V0TGlzdGVuUG9ydCgpIG92ZXJyaWRlOworCisgIHZvaWQgbGlzdGVuKCkgb3ZlcnJpZGU7CisgIHZvaWQgY2xvc2UoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gYWNjZXB0SW1wbCgpIG92ZXJyaWRlOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpOworCitwcml2YXRlOgorICBpbnQgcG9ydF87CisgIGludCBsaXN0ZW5Qb3J0XzsKKyAgc3RkOjpzdHJpbmcgYWRkcmVzc187CisgIHN0ZDo6c3RyaW5nIHBhdGhfOworICBUSFJJRlRfU09DS0VUIHNlcnZlclNvY2tldF87CisgIGludCBhY2NlcHRCYWNrbG9nXzsKKyAgaW50IHNlbmRUaW1lb3V0XzsKKyAgaW50IHJlY3ZUaW1lb3V0XzsKKyAgaW50IHJldHJ5TGltaXRfOworICBpbnQgcmV0cnlEZWxheV87CisgIGludCB0Y3BTZW5kQnVmZmVyXzsKKyAgaW50IHRjcFJlY3ZCdWZmZXJfOworICBib29sIGtlZXBBbGl2ZV87CisgIGJvb2wgbGlzdGVuaW5nXzsKKworICBzb2NrZXRfZnVuY190IGxpc3RlbkNhbGxiYWNrXzsKKyAgc29ja2V0X2Z1bmNfdCBhY2NlcHRDYWxsYmFja187Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlNPQ0tFVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxMTMyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJUUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogU2VydmVyIHRyYW5zcG9ydCBmcmFtZXdvcmsuIEEgc2VydmVyIG5lZWRzIHRvIGhhdmUgc29tZSBmYWNpbGl0eSBmb3IKKyAqIGNyZWF0aW5nIGJhc2UgdHJhbnNwb3J0cyB0byByZWFkL3dyaXRlIGZyb20uICBUaGUgc2VydmVyIGlzIGV4cGVjdGVkCisgKiB0byBrZWVwIHRyYWNrIG9mIFRUcmFuc3BvcnQgY2hpbGRyZW4gdGhhdCBpdCBjcmVhdGVzIGZvciBwdXJwb3NlcyBvZgorICogY29udHJvbGxpbmcgdGhlaXIgbGlmZXRpbWUuCisgKi8KK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCB7CitwdWJsaWM6CisgIHZpcnR1YWwgflROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCgpID0gZGVmYXVsdDsKKworICAvKioKKyAgICogU3RhcnRzIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IGxpc3RlbmluZyBmb3IgbmV3IGNvbm5lY3Rpb25zLiBQcmlvciB0byB0aGlzCisgICAqIGNhbGwgbW9zdCB0cmFuc3BvcnRzIHdpbGwgbm90IHJldHVybiBhbnl0aGluZyB3aGVuIGFjY2VwdCBpcyBjYWxsZWQuCisgICAqCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3ZSB3ZXJlIHVuYWJsZSB0byBsaXN0ZW4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBsaXN0ZW4oKSB7fQorCisgIC8qKgorICAgKiBHZXRzIGEgbmV3IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB0cmFuc3BvcnQgb2JqZWN0IGFuZCBwYXNzZXMgaXQgdG8gdGhlCisgICAqIGNhbGxlci4gTm90ZSB0aGF0IGl0IGlzIHRoZSBleHBsaWNpdCBkdXR5IG9mIHRoZSBjYWxsZXIgdG8gZnJlZSB0aGUKKyAgICogYWxsb2NhdGVkIG9iamVjdC4gVGhlIHJldHVybmVkIFRUcmFuc3BvcnQgb2JqZWN0IG11c3QgYWx3YXlzIGJlIGluIHRoZQorICAgKiBvcGVuZWQgc3RhdGUuIE5VTEwgc2hvdWxkIG5ldmVyIGJlIHJldHVybmVkLCBpbnN0ZWFkIGFuIEV4Y2VwdGlvbiBzaG91bGQKKyAgICogYWx3YXlzIGJlIHRocm93bi4KKyAgICoKKyAgICogQHJldHVybiBBIG5ldyBUVHJhbnNwb3J0IG9iamVjdAorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICovCisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBhY2NlcHQoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHJlc3VsdCA9IGFjY2VwdEltcGwoKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICogVXRpbGl0eSBtZXRob2QKKyAgKiAKKyAgKiBAcmV0dXJuIHNlcnZlciBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yIAorICAqIEB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAqLworCisgIHZpcnR1YWwgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpID0gMDsKKworICB2aXJ0dWFsIGludCBnZXRQb3J0KCkgPSAwOworCisgIHZpcnR1YWwgaW50IGdldExpc3RlblBvcnQoKSA9IDA7CisKKyAgLyoqCisgICAqIENsb3NlcyB0aGlzIHRyYW5zcG9ydCBzdWNoIHRoYXQgZnV0dXJlIGNhbGxzIHRvIGFjY2VwdCB3aWxsIGRvIG5vdGhpbmcuCisgICAqLworICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0KCkgPSBkZWZhdWx0OworCisgIC8qKgorICAgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBmb3IgYWNjZXB0LgorICAgKgorICAgKiBAcmV0dXJuIEEgbmV3bHkgYWxsb2NhdGVkIFRUcmFuc3BvcnQgb2JqZWN0CisgICAqIEB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gYWNjZXB0SW1wbCgpID0gMDsKKworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKaW5kZXggYjFlMWI3Mi4uNzJhZjRmYyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKQEAgLTI4LDggKzI4LDYgQEAKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KIC8qKgogKiBUUGlwZSBpbXBsZW1lbnRhdGlvbi4KICovCkBAIC00NSw3ICs0Myw3IEBACiBjbGFzcyBUUGlwZUltcGwgOiBib29zdDo6bm9uY29weWFibGUgewogcHVibGljOgogICBUUGlwZUltcGwoKSB7fQotICB2aXJ0dWFsIH5UUGlwZUltcGwoKSA9IDAge30KKyAgdmlydHVhbCB+VFBpcGVJbXBsKCkge30KICAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgPSAwOwogICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgPSAwOyAvLyBkb3VibGVzIGFzIHRoZSByZWFkIGhhbmRsZSBmb3IgYW5vbiBwaXBlCkBAIC0xNjAsNyArMTU4LDggQEAKICAgICBlbmRfdW5yZWFkX2lkeF8gPSBlbmRBc3luY1JlYWQoKTsKICAgfQogCi0gIHVpbnQzMl90IGJ5dGVzX3RvX2NvcHkgPSAoc3RkOjptaW4pKGxlbiwgZW5kX3VucmVhZF9pZHhfIC0gYmVnaW5fdW5yZWFkX2lkeF8pOworICB1aW50MzJfdCBfX2lkeHNpemUgPSBlbmRfdW5yZWFkX2lkeF8gLSBiZWdpbl91bnJlYWRfaWR4XzsKKyAgdWludDMyX3QgYnl0ZXNfdG9fY29weSA9IChsZW4gPCBfX2lkeHNpemUpID8gbGVuIDogX19pZHhzaXplOwogICBtZW1jcHkoYnVmLCAmYnVmZmVyX1tiZWdpbl91bnJlYWRfaWR4X10sIGJ5dGVzX3RvX2NvcHkpOwogICBiZWdpbl91bnJlYWRfaWR4XyArPSBieXRlc190b19jb3B5OwogICBpZiAoYmVnaW5fdW5yZWFkX2lkeF8gIT0gZW5kX3VucmVhZF9pZHhfKSB7CkBAIC0yNTUsNyArMjU0LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBUcmFuc3BvcnQgY2FsbGJhY2tzCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotYm9vbCBUUGlwZTo6aXNPcGVuKCkgeworYm9vbCBUUGlwZTo6aXNPcGVuKCkgY29uc3QgewogICByZXR1cm4gaW1wbF8uZ2V0KCkgIT0gTlVMTDsKIH0KIApAQCAtMzQxLDEyICszNDAsMTIgQEAKIC8vIEFjY2Vzc29ycwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RyaW5nIFRQaXBlOjpnZXRQaXBlbmFtZSgpIHsKK3N0ZDo6c3RyaW5nIFRQaXBlOjpnZXRQaXBlbmFtZSgpIHsKICAgcmV0dXJuIHBpcGVuYW1lXzsKIH0KIAogdm9pZCBUUGlwZTo6c2V0UGlwZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKSB7Ci0gIGlmIChwaXBlbmFtZS5maW5kKCJcXFxcIikgPT0gLTEpCisgIGlmIChwaXBlbmFtZS5maW5kKCJcXFxcIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCiAgICAgcGlwZW5hbWVfID0gIlxcXFwuXFxwaXBlXFwiICsgcGlwZW5hbWU7CiAgIGVsc2UKICAgICBwaXBlbmFtZV8gPSBwaXBlbmFtZTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaAppbmRleCBmZGIxN2VlLi5iYTE0OWIxIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oCkBAIC01MSw4ICs1MSw4IEBACiAgIC8vIENvbnN0cnVjdHMgYSBuZXcgcGlwZSBvYmplY3QuCiAgIFRQaXBlKCk7CiAgIC8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3JzIC0KLSAgZXhwbGljaXQgVFBpcGUoSEFORExFIFBpcGUpOyAvLyBIQU5ETEUgaXMgYSB2b2lkKgotICBleHBsaWNpdCBUUGlwZShUQXV0b0hhbmRsZSAmUGlwZSk7IC8vIHRoaXMgY3RvciB3aWxsIGNsZWFyIG91dCAvIG1vdmUgZnJvbSBQaXBlCisgIGV4cGxpY2l0IFRQaXBlKEhBTkRMRSBQaXBlKTsgICAgICAgLy8gSEFORExFIGlzIGEgdm9pZCoKKyAgZXhwbGljaXQgVFBpcGUoVEF1dG9IYW5kbGUmIFBpcGUpOyAvLyB0aGlzIGN0b3Igd2lsbCBjbGVhciBvdXQgLyBtb3ZlIGZyb20gUGlwZQogICAvLyBuZWVkIGEgY29uc3QgY2hhciAqIG92ZXJsb2FkIHNvIHN0cmluZyBsaXRlcmFscyBkb24ndCBnbyB0byB0aGUgSEFORExFIG92ZXJsb2FkCiAgIGV4cGxpY2l0IFRQaXBlKGNvbnN0IGNoYXIqIHBpcGVuYW1lKTsKICAgZXhwbGljaXQgVFBpcGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKTsKQEAgLTYzLDE2ICs2MywxNiBAQAogICB2aXJ0dWFsIH5UUGlwZSgpOwogCiAgIC8vIFJldHVybnMgd2hldGhlciB0aGUgcGlwZSBpcyBvcGVuICYgdmFsaWQuCi0gIHZpcnR1YWwgYm9vbCBpc09wZW4oKTsKKyAgYm9vbCBpc09wZW4oKSBjb25zdCBvdmVycmlkZTsKIAogICAvLyBDaGVja3Mgd2hldGhlciBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSBwaXBlLgotICB2aXJ0dWFsIGJvb2wgcGVlaygpOworICBib29sIHBlZWsoKSBvdmVycmlkZTsKIAogICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgbmFtZWQvYW5vbnltb3VzIHBpcGUuCi0gIHZpcnR1YWwgdm9pZCBvcGVuKCk7CisgIHZvaWQgb3BlbigpIG92ZXJyaWRlOwogCiAgIC8vIFNodXRzIGRvd24gY29tbXVuaWNhdGlvbnMgb24gdGhlIHBpcGUuCi0gIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGU7CiAKICAgLy8gUmVhZHMgZnJvbSB0aGUgcGlwZS4KICAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKQEAgLTk1LDcgKzk1LDcgQEAKICAgSEFORExFIGdldE5hdGl2ZVdhaXRIYW5kbGUoKTsKIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFBpcGVJbXBsPiBpbXBsXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlSW1wbD4gaW1wbF87CiAKICAgc3RkOjpzdHJpbmcgcGlwZW5hbWVfOwogCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCmluZGV4IGJhYTI2MDMuLjQ3ZDg4MjIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KIAogI2lmZGVmIF9XSU4zMgpAQCAtMzcsMTUgKzM2LDE0IEBACiAKICNpZmRlZiBfV0lOMzIKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCiBjbGFzcyBUUGlwZVNlcnZlckltcGwgOiBib29zdDo6bm9uY29weWFibGUgewogcHVibGljOgogICBUUGlwZVNlcnZlckltcGwoKSB7fQotICB2aXJ0dWFsIH5UUGlwZVNlcnZlckltcGwoKSA9IDAge30KKyAgdmlydHVhbCB+VFBpcGVTZXJ2ZXJJbXBsKCkge30KICAgdmlydHVhbCB2b2lkIGludGVycnVwdCgpID0gMDsKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCkgPSAwOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCkgPSAwOwogCiAgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSA9IDA7CiAgIHZpcnR1YWwgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKSA9IDA7CkBAIC03Niw3ICs3NCw3IEBACiAKICAgdmlydHVhbCB2b2lkIGludGVycnVwdCgpIHt9IC8vIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQKIAotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOwogCiAgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlUl8uaDsgfQogICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZVdfLmg7IH0KQEAgLTExOCw3ICsxMTYsNyBAQAogICAgIH0KICAgfQogCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CiAKICAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVfLmg7IH0KICAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOyB9CkBAIC0xNDIsNyArMTQwLDcgQEAKIAogICBUQ3JpdGljYWxTZWN0aW9uIHBpcGVfcHJvdGVjdF87CiAgIC8vIG9ubHkgcmVhZCBvciB3cml0ZSB0aGVzZSB2YXJpYWJsZXMgdW5kZXJuZWF0aCBhIGxvY2tlZCBwaXBlX3Byb3RlY3RfCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQaXBlPiBjYWNoZWRfY2xpZW50XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlPiBjYWNoZWRfY2xpZW50XzsKICAgVEF1dG9IYW5kbGUgUGlwZV87CiB9OwogCkBAIC0yOTcsNiArMjk1LDEwIEBACiAgIC8vIGlmIHdlIGdvdCBoZXJlLCB0aGVuIHdlIGFyZSBpbiBhbiBlcnJvciAvIHNodXRkb3duIGNhc2UKICAgRFdPUkQgZ2xlID0gR2V0TGFzdEVycm9yKCk7IC8vIHNhdmUgZXJyb3IgYmVmb3JlIGRvaW5nIGNsZWFudXAKICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ29ubmVjdE5hbWVkUGlwZSBHTEU9IiwgZ2xlKTsKKyAgaWYoZ2xlID09IEVSUk9SX09QRVJBVElPTl9BQk9SVEVEKSB7CisgICAgVEF1dG9Dcml0IGxvY2socGlwZV9wcm90ZWN0Xyk7ICAgIAkvLyBOZWVkZWQgdG8gaW5zdXJlIGNvbmN1cnJlbnQgdGhyZWFkIHRvIGJlIG91dCBvZiBpbnRlcnJ1cHQuCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgIlRQaXBlU2VydmVyOiBzZXJ2ZXIgaW50ZXJ1cHRlZCIpOworICB9CiAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUUGlwZVNlcnZlcjogY2xpZW50IGNvbm5lY3Rpb24gZmFpbGVkIik7CiB9CiAKQEAgLTMzMSw4ICszMzMsMjIgQEAKICAgU2V0RW50cmllc0luQWNsKDEsICZlYSwgTlVMTCwgJmFjbCk7CiAKICAgUFNFQ1VSSVRZX0RFU0NSSVBUT1Igc2QgPSAoUFNFQ1VSSVRZX0RFU0NSSVBUT1IpTG9jYWxBbGxvYyhMUFRSLCBTRUNVUklUWV9ERVNDUklQVE9SX01JTl9MRU5HVEgpOwotICBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKHNkLCBTRUNVUklUWV9ERVNDUklQVE9SX1JFVklTSU9OKTsKLSAgU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbChzZCwgVFJVRSwgYWNsLCBGQUxTRSk7CisgIGlmICghSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvcihzZCwgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTikpIHsKKyAgICBhdXRvIGxhc3RFcnJvciA9IEdldExhc3RFcnJvcigpOworICAgIExvY2FsRnJlZShzZCk7CisgICAgTG9jYWxGcmVlKGFjbCk7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXI6OkluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3IoKSBHTEU9IiwgbGFzdEVycm9yKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvcigpIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3IpOworICB9CisgIGlmICghU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbChzZCwgVFJVRSwgYWNsLCBGQUxTRSkpIHsKKyAgICBhdXRvIGxhc3RFcnJvciA9IEdldExhc3RFcnJvcigpOworICAgIExvY2FsRnJlZShzZCk7CisgICAgTG9jYWxGcmVlKGFjbCk7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXI6OlNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2woKSBHTEU9IiwgbGFzdEVycm9yKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2woKSBmYWlsZWQiLCBsYXN0RXJyb3IpOworICB9CiAKICAgU0VDVVJJVFlfQVRUUklCVVRFUyBzYTsKICAgc2Eubkxlbmd0aCA9IHNpemVvZihTRUNVUklUWV9BVFRSSUJVVEVTKTsKQEAgLTM1MSwxMyArMzY3LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCB0aW1lLW91dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYSkpOyAgICAgICAgICAgICAgICAvLyBzZWN1cml0eSBhdHRyaWJ1dGVzCiAKKyAgYXV0byBsYXN0RXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgTG9jYWxGcmVlKHNkKTsKKyAgTG9jYWxGcmVlKGFjbCk7CisgIEZyZWVTaWQoZXZlcnlvbmVfc2lkKTsKKwogICBpZiAoaFBpcGUuaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewogICAgIFBpcGVfLnJlc2V0KCk7Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXI6OlRDcmVhdGVOYW1lZFBpcGUoKSBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyOjpUQ3JlYXRlTmFtZWRQaXBlKCkgR0xFPSIsIGxhc3RFcnJvcik7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQ3JlYXRlTmFtZWRQaXBlKCkgZmFpbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhc3RFcnJvcigpKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgbGFzdEVycm9yKTsKICAgfQogCiAgIFBpcGVfLnJlc2V0KGhQaXBlLnJlbGVhc2UoKSk7CkBAIC0zNjgsOCArMzg4LDE3IEBACiAgIFNFQ1VSSVRZX0FUVFJJQlVURVMgc2E7CiAgIFNFQ1VSSVRZX0RFU0NSSVBUT1Igc2Q7IC8vIHNlY3VyaXR5IGluZm9ybWF0aW9uIGZvciBwaXBlcwogCi0gIEluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3IoJnNkLCBTRUNVUklUWV9ERVNDUklQVE9SX1JFVklTSU9OKTsKLSAgU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbCgmc2QsIHRydWUsIE5VTEwsIGZhbHNlKTsKKyAgaWYgKCFJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKCZzZCwgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTikpCisgIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yIChhbm9uKSBmYWlsZWQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbCgmc2QsIHRydWUsIE5VTEwsIGZhbHNlKSkKKyAgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIFNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2wgKGFub24pIGZhaWxlZCwgR0xFPSIsCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CiAgIHNhLmxwU2VjdXJpdHlEZXNjcmlwdG9yID0gJnNkOwogICBzYS5uTGVuZ3RoID0gc2l6ZW9mKFNFQ1VSSVRZX0FUVFJJQlVURVMpOwogICBzYS5iSW5oZXJpdEhhbmRsZSA9IHRydWU7IC8vIGFsbG93IHBhc3NpbmcgaGFuZGxlIHRvIGNoaWxkCkBAIC0zOTksMTIgKzQyOCwxMiBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEFjY2Vzc29ycwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0cmluZyBUUGlwZVNlcnZlcjo6Z2V0UGlwZW5hbWUoKSB7CitzdGQ6OnN0cmluZyBUUGlwZVNlcnZlcjo6Z2V0UGlwZW5hbWUoKSB7CiAgIHJldHVybiBwaXBlbmFtZV87CiB9CiAKIHZvaWQgVFBpcGVTZXJ2ZXI6OnNldFBpcGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSkgewotICBpZiAocGlwZW5hbWUuZmluZCgiXFxcXCIpID09IC0xKQorICBpZiAocGlwZW5hbWUuZmluZCgiXFxcXCIpID09IHN0ZDo6c3RyaW5nOjpucG9zKQogICAgIHBpcGVuYW1lXyA9ICJcXFxcLlxccGlwZVxcIiArIHBpcGVuYW1lOwogICBlbHNlCiAgICAgcGlwZW5hbWVfID0gcGlwZW5hbWU7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmgKaW5kZXggNDA1NzkzZS4uODcxYjZhZiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaApAQCAtMjAsOCArMjAsOCBAQAogI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSV0lOUElQRVNfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUldJTlBJUEVTX0hfIDEKIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpZm5kZWYgX1dJTjMyCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CiAjZW5kaWYKQEAgLTYwLDkgKzYwLDkgQEAKICAgdmlydHVhbCB+VFBpcGVTZXJ2ZXIoKTsKIAogICAvLyBTdGFuZGFyZCB0cmFuc3BvcnQgY2FsbGJhY2tzCi0gIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKTsKLSAgdmlydHVhbCB2b2lkIGNsb3NlKCk7Ci0gIHZpcnR1YWwgdm9pZCBsaXN0ZW4oKTsKKyAgdm9pZCBpbnRlcnJ1cHQoKSBvdmVycmlkZTsKKyAgdm9pZCBjbG9zZSgpIG92ZXJyaWRlOworICB2b2lkIGxpc3RlbigpIG92ZXJyaWRlOwogCiAgIC8vIEFjY2Vzc29ycwogICBzdGQ6OnN0cmluZyBnZXRQaXBlbmFtZSgpOwpAQCAtODIsMTAgKzgyLDEwIEBACiAgIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCk7CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFBpcGVTZXJ2ZXJJbXBsPiBpbXBsXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlU2VydmVySW1wbD4gaW1wbF87CiAKICAgc3RkOjpzdHJpbmcgcGlwZW5hbWVfOwogICB1aW50MzJfdCBidWZzaXplXzsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwCmluZGV4IDdlMTQ4NGQuLmIyMGMxNzQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcApAQCAtMTcsNiArMTcsNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPHRocmlmdC90aHJpZnRfZXhwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CiAKQEAgLTI3LDE0ICsyOCwxNCBAQAogLyoqCiAgKiBTU0wgc2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KICAqLwotVFNTTFNlcnZlclNvY2tldDo6VFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCitUU1NMU2VydmVyU29ja2V0OjpUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCiAgIDogVFNlcnZlclNvY2tldChwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgewogICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOwogfQogCiBUU1NMU2VydmVyU29ja2V0OjpUU1NMU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKICAgOiBUU2VydmVyU29ja2V0KGFkZHJlc3MsIHBvcnQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CiAgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7CiB9CkBAIC00MiwxMyArNDMsMTggQEAKIFRTU0xTZXJ2ZXJTb2NrZXQ6OlRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQogICA6IFRTZXJ2ZXJTb2NrZXQocG9ydCwgc2VuZFRpbWVvdXQsIHJlY3ZUaW1lb3V0KSwgZmFjdG9yeV8oZmFjdG9yeSkgewogICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOwogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBUU1NMU2VydmVyU29ja2V0OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpIHsKLSAgcmV0dXJuIGZhY3RvcnlfLT5jcmVhdGVTb2NrZXQoY2xpZW50KTsKK3N0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBUU1NMU2VydmVyU29ja2V0OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpIHsKKyAgaWYgKGludGVycnVwdGFibGVDaGlsZHJlbl8pIHsKKyAgICAgIHJldHVybiBmYWN0b3J5Xy0+Y3JlYXRlU29ja2V0KGNsaWVudCwgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8pOworCisgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFjdG9yeV8tPmNyZWF0ZVNvY2tldChjbGllbnQpOworICB9CiB9CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCmluZGV4IGRmZGJkZTguLjQ0ZGY0MzIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCkBAIC0yMCw3ICsyMCw2IEBACiAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTU0xTRVJWRVJTT0NLRVRfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNFUlZFUlNPQ0tFVF9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CkBAIC00MCw3ICszOSw3IEBACiAgICAqIEBwYXJhbSBwb3J0ICAgIExpc3RlbmluZyBwb3J0CiAgICAqIEBwYXJhbSBmYWN0b3J5IFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgogICAgKi8KLSAgVFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworICBUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOwogCiAgIC8qKgogICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KQEAgLTUxLDcgKzUwLDcgQEAKICAgICovCiAgIFRTU0xTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CiAKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gYWxsIGludGVyZmFjZXMuCkBAIC02NCwxMSArNjMsMTEgQEAKICAgVFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwKICAgICAgICAgICAgICAgICAgICBpbnQgc2VuZFRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAotICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOwogCiBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCkgb3ZlcnJpZGU7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeV87CiB9OwogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKaW5kZXggOThjNTMyNi4uYjQxMzAwMiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwCkBAIC0xOSw3ICsxOSw5IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCisjaW5jbHVkZSA8Y3N0cmluZz4KICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaWZkZWYgSEFWRV9BUlBBX0lORVRfSAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgpAQCAtMjgsOCArMzAsMjEgQEAKICNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNlbmRpZgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CisjaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfRkNOVExfSAorI2luY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEX0JFRk9SRSAgICAweDEwMDAwMDAwTAorI2RlZmluZSBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSAweDEwMTAwMDAwTAorCiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSkKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgpAQCAtMzcsMTEgKzUyLDEwIEBACiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KIAotI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEIDB4MTAwMDAwMDBMCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwordXNpbmcgc3RkOjpzdHJpbmc7CiAKIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSB7CiAgIE11dGV4IG11dGV4OwpAQCAtNTgsMTUgKzcyLDIyIEBACiAKIHN0YXRpYyB2b2lkIGNhbGxiYWNrTG9ja2luZyhpbnQgbW9kZSwgaW50IG4sIGNvbnN0IGNoYXIqLCBpbnQpIHsKICAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgeworICAgIC8vIGFzc2VydGlvbiBvZiAocHggIT0gMCkgaGVyZSB0eXBpY2FsbHkgbWVhbnMgdGhhdCBhIFRTU0xTb2NrZXQncyBsaWZldGltZQorICAgIC8vIGV4Y2VlZGVkIHRoZSBsaWZldGltZSBvZiB0aGUgVFNTTFNvY2tldEZhY3RvcnkgdGhhdCBjcmVhdGVkIGl0LCBhbmQgdGhlCisgICAgLy8gVFNTTFNvY2tldEZhY3RvcnkgYWxyZWFkeSByYW4gY2xlYW51cE9wZW5TU0woKSwgd2hpY2ggZGVsZXRlZCAibXV0ZXhlcyIuCiAgICAgbXV0ZXhlc1tuXS5sb2NrKCk7CiAgIH0gZWxzZSB7CiAgICAgbXV0ZXhlc1tuXS51bmxvY2soKTsKICAgfQogfQogCi0jaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEKQorI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUpCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxsYmFja1RocmVhZElEKCkgeworI2lmZGVmIF9XSU4zMgorICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpR2V0Q3VycmVudFRocmVhZElkKCk7CisjZWxzZQogICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpcHRocmVhZF9zZWxmKCk7CisjZW5kaWYKIH0KICNlbmRpZgogCkBAIC03NSw3ICs5Niw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGR5bl9sb2NrKGludCBtb2RlLCBzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUqIGxvY2ssIGNvbnN0IGNoYXIqLCBpbnQpIHsKLSAgaWYgKGxvY2sgIT0gTlVMTCkgeworICBpZiAobG9jayAhPSBudWxscHRyKSB7CiAgICAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgewogICAgICAgbG9jay0+bXV0ZXgubG9jaygpOwogICAgIH0gZWxzZSB7CkBAIC05NSwxNyArMTE2LDIyIEBACiAgIG9wZW5TU0xJbml0aWFsaXplZCA9IHRydWU7CiAgIFNTTF9saWJyYXJ5X2luaXQoKTsKICAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworICBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCiAgIC8vIHN0YXRpYyBsb2NraW5nCisgIC8vIG5ld2VyIHZlcnNpb25zIG9mIE9wZW5TU0wgY2hhbmdlZCBDUllQVE9fbnVtX2xvY2tzIC0gc2VlIFRIUklGVC0zODc4CisjaWZkZWYgQ1JZUFRPX251bV9sb2NrcworICBtdXRleGVzID0gYm9vc3Q6OnNoYXJlZF9hcnJheTxNdXRleD4obmV3IE11dGV4W0NSWVBUT19udW1fbG9ja3MoKV0pOworI2Vsc2UKICAgbXV0ZXhlcyA9IGJvb3N0OjpzaGFyZWRfYXJyYXk8TXV0ZXg+KG5ldyBNdXRleFsgOjpDUllQVE9fbnVtX2xvY2tzKCldKTsKLSAgaWYgKG11dGV4ZXMgPT0gTlVMTCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdGlhbGl6ZU9wZW5TU0woKSBmYWlsZWQsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXQgb2YgbWVtb3J5IHdoaWxlIGNyZWF0aW5nIG11dGV4IGFycmF5Iik7Ci0gIH0KLSNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IE9QRU5TU0xfVkVSU0lPTl9OT19USFJFQURfSUQpCisjZW5kaWYKKworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUpCiAgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soY2FsbGJhY2tUaHJlYWRJRCk7CiAjZW5kaWYKKwogICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soY2FsbGJhY2tMb2NraW5nKTsKKwogICAvLyBkeW5hbWljIGxvY2tpbmcKICAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhkeW5fY3JlYXRlKTsKICAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soZHluX2xvY2spOwpAQCAtMTE3LDIxICsxNDMsMjIgQEAKICAgICByZXR1cm47CiAgIH0KICAgb3BlblNTTEluaXRpYWxpemVkID0gZmFsc2U7Ci0jaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEKQotICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKE5VTEwpOworCisgIC8vIGh0dHBzOi8vd2lraS5vcGVuc3NsLm9yZy9pbmRleC5waHAvTGlicmFyeV9Jbml0aWFsaXphdGlvbiNDbGVhbnVwCisgIC8vIHdlIHB1cnBvc2VmdWxseSBkbyBOT1QgY2FsbCBGSVBTX21vZGVfc2V0KDApIGFuZCBsZWF2ZSBpdCB1cCB0byB0aGUgZW5jbG9zaW5nIGFwcGxpY2F0aW9uIHRvIG1hbmFnZSBGSVBTIGVudGlyZWx5CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSkKKyAgRU5HSU5FX2NsZWFudXAoKTsgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9tYW4xLjEuMC9jcnlwdG8vRU5HSU5FX2NsZWFudXAuaHRtbCAtIGNsZWFudXAgY2FsbCBpcyBuZWVkZWQgYmVmb3JlIDEuMS4wCiAjZW5kaWYKLSAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOwotICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKE5VTEwpOwotICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhOVUxMKTsKLSAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soTlVMTCk7Ci0gIEVSUl9mcmVlX3N0cmluZ3MoKTsKKyAgQ09ORl9tb2R1bGVzX3VubG9hZCgxKTsKICAgRVZQX2NsZWFudXAoKTsKICAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgRVJSX2ZyZWVfc3RyaW5ncygpOworCiAgIG11dGV4ZXMucmVzZXQoKTsKIH0KIAotc3RhdGljIHZvaWQgYnVpbGRFcnJvcnMoc3RyaW5nJiBtZXNzYWdlLCBpbnQgZXJyb3IgPSAwKTsKK3N0YXRpYyB2b2lkIGJ1aWxkRXJyb3JzKHN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkgPSAwLCBpbnQgc3NsZXJybm8gPSAwKTsKIHN0YXRpYyBib29sIG1hdGNoTmFtZShjb25zdCBjaGFyKiBob3N0LCBjb25zdCBjaGFyKiBwYXR0ZXJuLCBpbnQgc2l6ZSk7CiBzdGF0aWMgY2hhciB1cHBlcmNhc2UoY2hhciBjKTsKIApAQCAtMTM5LDggKzE2NiwxMCBAQAogU1NMQ29udGV4dDo6U1NMQ29udGV4dChjb25zdCBTU0xQcm90b2NvbCYgcHJvdG9jb2wpIHsKICAgaWYgKHByb3RvY29sID09IFNTTFRMUykgewogICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpOworI2lmbmRlZiBPUEVOU1NMX05PX1NTTDMKICAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBTU0x2MykgewogICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhTU0x2M19tZXRob2QoKSk7CisjZW5kaWYKICAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBUTFN2MV8wKSB7CiAgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFRMU3YxX21ldGhvZCgpKTsKICAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBUTFN2MV8xKSB7CkBAIC0xNTIsNyArMTgxLDcgQEAKICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX25ldzogVW5rbm93biBwcm90b2NvbCIpOwogICB9CiAKLSAgaWYgKGN0eF8gPT0gTlVMTCkgeworICBpZiAoY3R4XyA9PSBudWxscHRyKSB7CiAgICAgc3RyaW5nIGVycm9yczsKICAgICBidWlsZEVycm9ycyhlcnJvcnMpOwogICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9DVFhfbmV3OiAiICsgZXJyb3JzKTsKQEAgLTE2OCwxNSArMTk3LDE1IEBACiB9CiAKIFNTTENvbnRleHQ6On5TU0xDb250ZXh0KCkgewotICBpZiAoY3R4XyAhPSBOVUxMKSB7CisgIGlmIChjdHhfICE9IG51bGxwdHIpIHsKICAgICBTU0xfQ1RYX2ZyZWUoY3R4Xyk7Ci0gICAgY3R4XyA9IE5VTEw7CisgICAgY3R4XyA9IG51bGxwdHI7CiAgIH0KIH0KIAogU1NMKiBTU0xDb250ZXh0OjpjcmVhdGVTU0woKSB7CiAgIFNTTCogc3NsID0gU1NMX25ldyhjdHhfKTsKLSAgaWYgKHNzbCA9PSBOVUxMKSB7CisgIGlmIChzc2wgPT0gbnVsbHB0cikgewogICAgIHN0cmluZyBlcnJvcnM7CiAgICAgYnVpbGRFcnJvcnMoZXJyb3JzKTsKICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfbmV3OiAiICsgZXJyb3JzKTsKQEAgLTE4NSwyNCArMjE0LDYxIEBACiB9CiAKIC8vIFRTU0xTb2NrZXQgaW1wbGVtZW50YXRpb24KLVRTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4KQotICA6IFRTb2NrZXQoKSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgpCisgIDogVFNvY2tldCgpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhudWxscHRyKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOwogfQogCi1UU1NMU29ja2V0OjpUU1NMU29ja2V0KGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQpCi0gIDogVFNvY2tldChzb2NrZXQpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQorICAgICAgICA6IFRTb2NrZXQoKSwgc2VydmVyXyhmYWxzZSksIHNzbF8obnVsbHB0ciksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKKyAgaW50ZXJydXB0TGlzdGVuZXJfID0gaW50ZXJydXB0TGlzdGVuZXI7CiB9CiAKLVRTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdHJpbmcgaG9zdCwgaW50IHBvcnQpCi0gIDogVFNvY2tldChob3N0LCBwb3J0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIFRIUklGVF9TT0NLRVQgc29ja2V0KQorICA6IFRTb2NrZXQoc29ja2V0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8obnVsbHB0ciksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKK30KKworVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQorICAgICAgICA6IFRTb2NrZXQoc29ja2V0LCBpbnRlcnJ1cHRMaXN0ZW5lciksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKG51bGxwdHIpLCBjdHhfKGN0eCkgeworICBpbml0KCk7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RyaW5nIGhvc3QsIGludCBwb3J0KQorICA6IFRTb2NrZXQoaG9zdCwgcG9ydCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKG51bGxwdHIpLCBjdHhfKGN0eCkgeworICBpbml0KCk7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpCisgICAgICAgIDogVFNvY2tldChob3N0LCBwb3J0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8obnVsbHB0ciksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKKyAgaW50ZXJydXB0TGlzdGVuZXJfID0gaW50ZXJydXB0TGlzdGVuZXI7CiB9CiAKIFRTU0xTb2NrZXQ6On5UU1NMU29ja2V0KCkgewogICBjbG9zZSgpOwogfQogCi1ib29sIFRTU0xTb2NrZXQ6OmlzT3BlbigpIHsKLSAgaWYgKHNzbF8gPT0gTlVMTCB8fCAhVFNvY2tldDo6aXNPcGVuKCkpIHsKK2Jvb2wgVFNTTFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSB7CisgIGlmICghaXNPcGVuKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiVFNTTFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQ6IEhhbmRzaGFrZSBpcyBub3QgY29tcGxldGVkIik7CisgIC8vIGRhdGEgbWF5IGJlIGF2YWlsYWJsZSBpbiBTU0wgYnVmZmVycyAobm90ZTogU1NMX3BlbmRpbmcgZG9lcyBub3QgaGF2ZSBhIGZhaWx1cmUgbW9kZSkKKyAgcmV0dXJuIFNTTF9wZW5kaW5nKHNzbF8pID4gMCB8fCBUU29ja2V0OjpoYXNQZW5kaW5nRGF0YVRvUmVhZCgpOworfQorCit2b2lkIFRTU0xTb2NrZXQ6OmluaXQoKSB7CisgIGhhbmRzaGFrZUNvbXBsZXRlZF8gPSBmYWxzZTsKKyAgcmVhZFJldHJ5Q291bnRfID0gMDsKKyAgZXZlbnRTYWZlXyA9IGZhbHNlOworfQorCitib29sIFRTU0xTb2NrZXQ6OmlzT3BlbigpIGNvbnN0IHsKKyAgaWYgKHNzbF8gPT0gbnVsbHB0ciB8fCAhVFNvY2tldDo6aXNPcGVuKCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgaW50IHNodXRkb3duID0gU1NMX2dldF9zaHV0ZG93bihzc2xfKTsKQEAgLTIxNSwyMyArMjgxLDQ3IEBACiAgIHJldHVybiB0cnVlOwogfQogCisvKgorICogTm90ZTogVGhpcyBtZXRob2QgaXMgbm90IGxpYmV2ZW50IHNhZmUuCisqLwogYm9vbCBUU1NMU29ja2V0OjpwZWVrKCkgewogICBpZiAoIWlzT3BlbigpKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIGNoZWNrSGFuZHNoYWtlKCk7CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9wZWVrOiBIYW5kc2hha2UgaXMgbm90IGNvbXBsZXRlZCIpOwogICBpbnQgcmM7Ci0gIHVpbnQ4X3QgYnl0ZTsKLSAgcmMgPSBTU0xfcGVlayhzc2xfLCAmYnl0ZSwgMSk7Ci0gIGlmIChyYyA8IDApIHsKLSAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwotICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcGVlazogIiArIGVycm9ycyk7Ci0gIH0KLSAgaWYgKHJjID09IDApIHsKLSAgICBFUlJfY2xlYXJfZXJyb3IoKTsKLSAgfQorICBkbyB7CisgICAgdWludDhfdCBieXRlOworICAgIHJjID0gU1NMX3BlZWsoc3NsXywgJmJ5dGUsIDEpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpbnQgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIHJjKTsKKyAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiByZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgfQorICAgICAgc3RyaW5nIGVycm9yczsKKyAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSwgZXJyb3IpOworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX3BlZWs6ICIgKyBlcnJvcnMpOworICAgIH0gZWxzZSBpZiAocmMgPT0gMCkgeworICAgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlICh0cnVlKTsKICAgcmV0dXJuIChyYyA+IDApOwogfQogCkBAIC0yNDIsNjYgKzMzMiwyMzYgQEAKICAgVFNvY2tldDo6b3BlbigpOwogfQogCisvKgorICogTm90ZTogVGhpcyBtZXRob2QgaXMgbm90IGxpYmV2ZW50IHNhZmUuCisqLwogdm9pZCBUU1NMU29ja2V0OjpjbG9zZSgpIHsKLSAgaWYgKHNzbF8gIT0gTlVMTCkgewotICAgIGludCByYyA9IFNTTF9zaHV0ZG93bihzc2xfKTsKLSAgICBpZiAocmMgPCAwKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwotICAgICAgc3RyaW5nIGVycm9yczsKLSAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7Ci0gICAgICBHbG9iYWxPdXRwdXQoKCJTU0xfc2h1dGRvd246ICIgKyBlcnJvcnMpLmNfc3RyKCkpOworICBpZiAoc3NsXyAhPSBudWxscHRyKSB7CisgICAgdHJ5IHsKKyAgICAgIGludCByYzsKKyAgICAgIGludCBlcnJub19jb3B5ID0gMDsKKyAgICAgIGludCBlcnJvciA9IDA7CisKKyAgICAgIGRvIHsKKyAgICAgICAgcmMgPSBTU0xfc2h1dGRvd24oc3NsXyk7CisgICAgICAgIGlmIChyYyA8PSAwKSB7CisgICAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CisgICAgICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlL3JlYWQgZXZlbnQgYWdhaW4KKyAgICAgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOworICAgICAgICAgICAgICByYyA9IDI7CisgICAgICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IHdoaWxlIChyYyA9PSAyKTsKKworICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICAgICAgR2xvYmFsT3V0cHV0KCgiU1NMX3NodXRkb3duOiAiICsgZXJyb3JzKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgeworICAgICAgLy8gRG9uJ3QgZW1pdCBhbiBleGNlcHRpb24gYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlCisgICAgICAvLyBkZXN0cnVjdG9yLiBUaGVyZSdzIGFsc28gbm90IG11Y2ggdGhhdCBhIHVzZXIgY2FuIGRvIHRvIHJlY292ZXIsIHNvCisgICAgICAvLyBqdXN0IGNsZWFuIHVwIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aG91dCB0aHJvd2luZywgc2ltaWxhciB0byB0aGUgcmMKKyAgICAgIC8vIDwgMCBjYXNlIGFib3ZlLgorICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiU1NMX3NodXRkb3duOiAlcyIsIHRlLndoYXQoKSk7CiAgICAgfQogICAgIFNTTF9mcmVlKHNzbF8pOwotICAgIHNzbF8gPSBOVUxMOworICAgIHNzbF8gPSBudWxscHRyOworICAgIGhhbmRzaGFrZUNvbXBsZXRlZF8gPSBmYWxzZTsKICAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOwogICB9CiAgIFRTb2NrZXQ6OmNsb3NlKCk7CiB9CiAKKy8qCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGluIFNTTCBTb2NrZXQuCisgKiBJZiBldmVudFNhZmUgaXMgc2V0LCBhbmQgaXQgbWF5IHJldHVybnMgMCBieXRlcyB0aGVuIHJlYWQgbWV0aG9kCisgKiBuZWVkcyB0byBiZSBjYWxsZWQgYWdhaW4gdW50aWwgaXQgaXMgc3VjY2Vzc2Z1bGwgb3IgaXQgdGhyb3dzCisgKiBleGNlcHRpb24gaW5jYXNlIG9mIGZhaWx1cmUuCisqLwogdWludDMyX3QgVFNTTFNvY2tldDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBjaGVja0hhbmRzaGFrZSgpOworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJyZXRyeSBhZ2FpbiIpOwogICBpbnQzMl90IGJ5dGVzID0gMDsKLSAgZm9yIChpbnQzMl90IHJldHJpZXMgPSAwOyByZXRyaWVzIDwgbWF4UmVjdlJldHJpZXNfOyByZXRyaWVzKyspIHsKKyAgd2hpbGUgKHJlYWRSZXRyeUNvdW50XyA8IG1heFJlY3ZSZXRyaWVzXykgewogICAgIGJ5dGVzID0gU1NMX3JlYWQoc3NsXywgYnVmLCBsZW4pOwotICAgIGlmIChieXRlcyA+PSAwKQorICAgIGludDMyX3QgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIGludDMyX3QgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIGJ5dGVzKTsKKyAgICByZWFkUmV0cnlDb3VudF8rKzsKKyAgICBpZiAoZXJyb3IgPT0gU1NMX0VSUk9SX05PTkUpIHsKKyAgICAgIHJlYWRSZXRyeUNvdW50XyA9IDA7CiAgICAgICBicmVhazsKLSAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwotICAgIGlmIChTU0xfZ2V0X2Vycm9yKHNzbF8sIGJ5dGVzKSA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgewotICAgICAgaWYgKEVSUl9nZXRfZXJyb3IoKSA9PSAwICYmIGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQorICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgd2FpdEV2ZW50UmV0dXJuOworICAgIGJvb2wgYnJlYWtvdXQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwgImNsaWVudCBkaXNjb25uZWN0ZWQiKTsKKworICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgaWYgKGVycm5vX2NvcHkgPT0gMCAmJiBFUlJfcGVla19lcnJvcigpID09IDApIHsKKyAgICAgICAgICBicmVha291dCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZWFkUmV0cnlDb3VudF8gPj0gbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgLy8gZmFsbHRocm91Z2gKKworICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICBpZiAocmVhZFJldHJ5Q291bnRfIDwgbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJyZXRyeSBhZ2FpbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCAidG9vIG11Y2ggcmVjdiByZXRyaWVzIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiByZWFkIGV2ZW50IGFnYWluCisgICAgICAgIGVsc2UgaWYgKCh3YWl0RXZlbnRSZXR1cm4gPSB3YWl0Rm9yRXZlbnQoZXJyb3IgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpKSA9PSBUU1NMX0VJTlRSICkgeworICAgICAgICAgIC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICAgICAgICBpZiAocmVhZFJldHJ5Q291bnRfIDwgbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgInRvbyBtdWNoIHJlY3YgcmV0cmllcyIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHdhaXRFdmVudFJldHVybiA9PSBUU1NMX0RBVEEpIHsKKyAgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgU1NMIGFuZCBodWdlIHRocmlmdCBwYWNrZXRzLCB0aGVyZSBtYXkgYmUgYSBudW1iZXIgb2YKKyAgICAgICAgICAgIC8vIHNvY2tldCBvcGVyYXRpb25zLCBiZWZvcmUgYW55IGRhdGEgYmVjb21lcyBhdmFpbGFibGUgYnkgU1NMX3JlYWQoKS4KKyAgICAgICAgICAgIC8vIFRoZXJlZm9yZSB0aGUgbnVtYmVyIG9mIHJldHJpZXMgc2hvdWxkIG5vdCBiZSBpbmNyZWFzZWQgYW5kCisgICAgICAgICAgICAvLyB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSByZXBlYXRlZC4KKyAgICAgICAgICAgIHJlYWRSZXRyeUNvdW50Xy0tOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgInVua293biB3YWl0Rm9yRXZlbnQgcmV0dXJuIHZhbHVlIik7CisgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgfQorICAgIGlmIChicmVha291dCkgeworICAgICAgYnJlYWs7CiAgICAgfQogICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcmVhZDogIiArIGVycm9ycyk7CiAgIH0KICAgcmV0dXJuIGJ5dGVzOwogfQogCiB2b2lkIFRTU0xTb2NrZXQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGNoZWNrSGFuZHNoYWtlKCk7CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHJldHVybjsKICAgLy8gbG9vcCBpbiBjYXNlIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIGlzIHNldCBpbiBTU0xfQ1RYLgogICB1aW50MzJfdCB3cml0dGVuID0gMDsKICAgd2hpbGUgKHdyaXR0ZW4gPCBsZW4pIHsKKyAgICBFUlJfY2xlYXJfZXJyb3IoKTsKICAgICBpbnQzMl90IGJ5dGVzID0gU1NMX3dyaXRlKHNzbF8sICZidWZbd3JpdHRlbl0sIGxlbiAtIHdyaXR0ZW4pOwogICAgIGlmIChieXRlcyA8PSAwKSB7CiAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaW50IGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCBieXRlcyk7CisgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgLy8gZmFsbHRocm91Z2ggICAgICAgIAorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlIGV2ZW50IGFnYWluCisgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgIH0KICAgICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CiAgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfd3JpdGU6ICIgKyBlcnJvcnMpOwogICAgIH0KICAgICB3cml0dGVuICs9IGJ5dGVzOwogICB9CiB9CiAKKy8qCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGluIFNTTCBTb2NrZXQuCisgKiBJZiBldmVudFNhZmUgaXMgc2V0LCBhbmQgaXQgbWF5IHJldHVybnMgMCBieXRlcyB0aGVuIHdyaXRlIG1ldGhvZAorICogbmVlZHMgdG8gYmUgY2FsbGVkIGFnYWluIHVudGlsIGl0IGlzIHN1Y2Nlc3NmdWxsIG9yIGl0IHRocm93cworICogZXhjZXB0aW9uIGluY2FzZSBvZiBmYWlsdXJlLgorKi8KK3VpbnQzMl90IFRTU0xTb2NrZXQ6OndyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgcmV0dXJuIDA7CisgIC8vIGxvb3AgaW4gY2FzZSBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURSBpcyBzZXQgaW4gU1NMX0NUWC4KKyAgdWludDMyX3Qgd3JpdHRlbiA9IDA7CisgIHdoaWxlICh3cml0dGVuIDwgbGVuKSB7CisgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgaW50MzJfdCBieXRlcyA9IFNTTF93cml0ZShzc2xfLCAmYnVmW3dyaXR0ZW5dLCBsZW4gLSB3cml0dGVuKTsKKyAgICBpZiAoYnl0ZXMgPD0gMCkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIGludCBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgYnl0ZXMpOworICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICBpZiAoaXNMaWJldmVudFNhZmUoKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZSBldmVudCBhZ2FpbgorICAgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICB9CisgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CisgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfd3JpdGU6ICIgKyBlcnJvcnMpOworICAgIH0KKyAgICB3cml0dGVuICs9IGJ5dGVzOworICB9CisgIHJldHVybiB3cml0dGVuOworfQorCiB2b2lkIFRTU0xTb2NrZXQ6OmZsdXNoKCkgewogICAvLyBEb24ndCB0aHJvdyBleGNlcHRpb24gaWYgbm90IG9wZW4uIFRocmlmdCBzZXJ2ZXJzIGNsb3NlIHNvY2tldCB0d2ljZS4KLSAgaWYgKHNzbF8gPT0gTlVMTCkgeworICBpZiAoc3NsXyA9PSBudWxscHRyKSB7CiAgICAgcmV0dXJuOwogICB9Ci0gIGNoZWNrSGFuZHNoYWtlKCk7CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHRocm93IFRTU0xFeGNlcHRpb24oIkJJT19mbHVzaDogSGFuZHNoYWtlIGlzIG5vdCBjb21wbGV0ZWQiKTsKICAgQklPKiBiaW8gPSBTU0xfZ2V0X3diaW8oc3NsXyk7Ci0gIGlmIChiaW8gPT0gTlVMTCkgeworICBpZiAoYmlvID09IG51bGxwdHIpIHsKICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfZ2V0X3diaW8gcmV0dXJucyBOVUxMIik7CiAgIH0KICAgaWYgKEJJT19mbHVzaChiaW8pICE9IDEpIHsKQEAgLTMxMiwyOSArNTcyLDExMCBAQAogICB9CiB9CiAKLXZvaWQgVFNTTFNvY2tldDo6Y2hlY2tIYW5kc2hha2UoKSB7Ci0gIGlmICghVFNvY2tldDo6aXNPcGVuKCkpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgfQotICBpZiAoc3NsXyAhPSBOVUxMKSB7Cit2b2lkIFRTU0xTb2NrZXQ6OmluaXRpYWxpemVIYW5kc2hha2VQYXJhbXMoKSB7CisgIC8vIHNldCB1bmRlcmx5aW5nIHNvY2tldCB0byBub24tYmxvY2tpbmcKKyAgaW50IGZsYWdzOworICBpZiAoKGZsYWdzID0gVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX0dFVEZMLCAwKSkgPCAwCisgICAgICB8fCBUSFJJRlRfRkNOVEwoc29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spIDwgMCkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoInRocmlmdFNlcnZlckV2ZW50SGFuZGxlcjogc2V0IFRIUklGVF9PX05PTkJMT0NLIChUSFJJRlRfRkNOVEwpICIsCisgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoc29ja2V0Xyk7CiAgICAgcmV0dXJuOwogICB9CiAgIHNzbF8gPSBjdHhfLT5jcmVhdGVTU0woKTsKKwogICBTU0xfc2V0X2ZkKHNzbF8sIHN0YXRpY19jYXN0PGludD4oc29ja2V0XykpOworfQorCitib29sIFRTU0xTb2NrZXQ6OmNoZWNrSGFuZHNoYWtlKCkgeworICByZXR1cm4gaGFuZHNoYWtlQ29tcGxldGVkXzsKK30KKwordm9pZCBUU1NMU29ja2V0Ojppbml0aWFsaXplSGFuZHNoYWtlKCkgeworICBpZiAoIVRTb2NrZXQ6OmlzT3BlbigpKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgIH0KKyAgaWYgKGNoZWNrSGFuZHNoYWtlKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3NsXyA9PSBudWxscHRyKSB7CisgICAgaW5pdGlhbGl6ZUhhbmRzaGFrZVBhcmFtcygpOworICB9CisKICAgaW50IHJjOworICBpbnQgZXJybm9fY29weSA9IDA7CisgIGludCBlcnJvciA9IDA7CiAgIGlmIChzZXJ2ZXIoKSkgewotICAgIHJjID0gU1NMX2FjY2VwdChzc2xfKTsKKyAgICBkbyB7CisgICAgICByYyA9IFNTTF9hY2NlcHQoc3NsXyk7CisgICAgICBpZiAocmMgPD0gMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CisgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZS9yZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgICAgcmMgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gd2hpbGUgKHJjID09IDIpOwogICB9IGVsc2UgewotICAgIHJjID0gU1NMX2Nvbm5lY3Qoc3NsXyk7CisgICAgLy8gT3BlblNTTCA8IDAuOS44ZiBkb2VzIG5vdCBoYXZlIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSgpCisgICAgI2lmIGRlZmluZWQoU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKQorICAgICAgLy8gc2V0IHRoZSBTTkkgaG9zdG5hbWUKKyAgICAgIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZShzc2xfLCBnZXRIb3N0KCkuY19zdHIoKSk7CisgICAgI2VuZGlmCisgICAgZG8geworICAgICAgcmMgPSBTU0xfY29ubmVjdChzc2xfKTsKKyAgICAgIGlmIChyYyA8PSAwKSB7CisgICAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIHJjKTsKKyAgICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgICBpZiAoaXNMaWJldmVudFNhZmUoKSkgeworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgLy8gcmVwZWF0IG9wZXJhdGlvbgorICAgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlL3JlYWQgZXZlbnQgYWdhaW4KKyAgICAgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOworICAgICAgICAgICAgICByYyA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgICB9CisgICAgICB9CisgICAgfSB3aGlsZSAocmMgPT0gMik7CiAgIH0KICAgaWYgKHJjIDw9IDApIHsKLSAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgIHN0cmluZyBmbmFtZShzZXJ2ZXIoKSA/ICJTU0xfYWNjZXB0IiA6ICJTU0xfY29ubmVjdCIpOwogICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKGZuYW1lICsgIjogIiArIGVycm9ycyk7CiAgIH0KICAgYXV0aG9yaXplKCk7CisgIGhhbmRzaGFrZUNvbXBsZXRlZF8gPSB0cnVlOwogfQogCiB2b2lkIFRTU0xTb2NrZXQ6OmF1dGhvcml6ZSgpIHsKQEAgLTM0NCwxOSArNjg1LDE5IEBACiAgIH0KIAogICBYNTA5KiBjZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzbF8pOwotICBpZiAoY2VydCA9PSBOVUxMKSB7CisgIGlmIChjZXJ0ID09IG51bGxwdHIpIHsKICAgICAvLyBjZXJ0aWZpY2F0ZSBpcyBub3QgcHJlc2VudAogICAgIGlmIChTU0xfZ2V0X3ZlcmlmeV9tb2RlKHNzbF8pICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgewogICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiYXV0aG9yaXplOiByZXF1aXJlZCBjZXJ0aWZpY2F0ZSBub3QgcHJlc2VudCIpOwogICAgIH0KICAgICAvLyBjZXJ0aWZpY2F0ZSB3YXMgb3B0aW9uYWw6IGRpZG4ndCBpbnRlbmQgdG8gYXV0aG9yaXplIHJlbW90ZQotICAgIGlmIChzZXJ2ZXIoKSAmJiBhY2Nlc3NfICE9IE5VTEwpIHsKKyAgICBpZiAoc2VydmVyKCkgJiYgYWNjZXNzXyAhPSBudWxscHRyKSB7CiAgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJhdXRob3JpemU6IGNlcnRpZmljYXRlIHJlcXVpcmVkIGZvciBhdXRob3JpemF0aW9uIik7CiAgICAgfQogICAgIHJldHVybjsKICAgfQogICAvLyBjZXJ0aWZpY2F0ZSBpcyBwcmVzZW50Ci0gIGlmIChhY2Nlc3NfID09IE5VTEwpIHsKKyAgaWYgKGFjY2Vzc18gPT0gbnVsbHB0cikgewogICAgIFg1MDlfZnJlZShjZXJ0KTsKICAgICByZXR1cm47CiAgIH0KQEAgLTM4MSwxMyArNzIyLDEzIEBACiAgIH0KIAogICAvLyBleHRyYWN0IHN1YmplY3RBbHRlcm5hdGl2ZU5hbWUKLSAgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSogYWx0ZXJuYXRpdmVzCi0gICAgICA9IChTVEFDS19PRihHRU5FUkFMX05BTUUpKilYNTA5X2dldF9leHRfZDJpKGNlcnQsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCBOVUxMLCBOVUxMKTsKLSAgaWYgKGFsdGVybmF0aXZlcyAhPSBOVUxMKSB7CisgIGF1dG8qIGFsdGVybmF0aXZlcworICAgICAgPSAoU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSopWDUwOV9nZXRfZXh0X2QyaShjZXJ0LCBOSURfc3ViamVjdF9hbHRfbmFtZSwgbnVsbHB0ciwgbnVsbHB0cik7CisgIGlmIChhbHRlcm5hdGl2ZXMgIT0gbnVsbHB0cikgewogICAgIGNvbnN0IGludCBjb3VudCA9IHNrX0dFTkVSQUxfTkFNRV9udW0oYWx0ZXJuYXRpdmVzKTsKICAgICBmb3IgKGludCBpID0gMDsgZGVjaXNpb24gPT0gQWNjZXNzTWFuYWdlcjo6U0tJUCAmJiBpIDwgY291bnQ7IGkrKykgewogICAgICAgY29uc3QgR0VORVJBTF9OQU1FKiBuYW1lID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGFsdGVybmF0aXZlcywgaSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogICAgICAgY2hhciogZGF0YSA9IChjaGFyKilBU04xX1NUUklOR19kYXRhKG5hbWUtPmQuaWE1KTsKQEAgLTQxNyw3ICs3NTgsNyBAQAogCiAgIC8vIGV4dHJhY3QgY29tbW9uTmFtZQogICBYNTA5X05BTUUqIG5hbWUgPSBYNTA5X2dldF9zdWJqZWN0X25hbWUoY2VydCk7Ci0gIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgaWYgKG5hbWUgIT0gbnVsbHB0cikgewogICAgIFg1MDlfTkFNRV9FTlRSWSogZW50cnk7CiAgICAgdW5zaWduZWQgY2hhciogdXRmODsKICAgICBpbnQgbGFzdCA9IC0xOwpAQCAtNDI2LDcgKzc2Nyw3IEBACiAgICAgICBpZiAobGFzdCA9PSAtMSkKICAgICAgICAgYnJlYWs7CiAgICAgICBlbnRyeSA9IFg1MDlfTkFNRV9nZXRfZW50cnkobmFtZSwgbGFzdCk7Ci0gICAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgIGlmIChlbnRyeSA9PSBudWxscHRyKQogICAgICAgICBjb250aW51ZTsKICAgICAgIEFTTjFfU1RSSU5HKiBjb21tb24gPSBYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEoZW50cnkpOwogICAgICAgaW50IHNpemUgPSBBU04xX1NUUklOR190b19VVEY4KCZ1dGY4LCBjb21tb24pOwpAQCAtNDQzLDYgKzc4NCw2NyBAQAogICB9CiB9CiAKKy8qCisgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBub3QgbGliZXZlbnQgc2FmZS4KKyovCit1bnNpZ25lZCBpbnQgVFNTTFNvY2tldDo6d2FpdEZvckV2ZW50KGJvb2wgd2FudFJlYWQpIHsKKyAgaW50IGZkU29ja2V0OworICBCSU8qIGJpbzsKKworICBpZiAod2FudFJlYWQpIHsKKyAgICBiaW8gPSBTU0xfZ2V0X3JiaW8oc3NsXyk7CisgIH0gZWxzZSB7CisgICAgYmlvID0gU1NMX2dldF93YmlvKHNzbF8pOworICB9CisKKyAgaWYgKGJpbyA9PSBudWxscHRyKSB7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX2dldF8/YmlvIHJldHVybmVkIE5VTEwiKTsKKyAgfQorCisgIGlmIChCSU9fZ2V0X2ZkKGJpbywgJmZkU29ja2V0KSA8PSAwKSB7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiQklPX2dldF9mZCBmYWlsZWQiKTsKKyAgfQorCisgIHN0cnVjdCBUSFJJRlRfUE9MTEZEIGZkc1syXTsKKyAgbWVtc2V0KGZkcywgMCwgc2l6ZW9mKGZkcykpOworICBmZHNbMF0uZmQgPSBmZFNvY2tldDsKKyAgLy8gdXNlIFBPTExJTiBhbHNvIG9uIHdyaXRlIG9wZXJhdGlvbnMgdG9vLCB0aGlzIGlzIG5lZWRlZCBmb3Igb3BlcmF0aW9ucworICAvLyB3aGljaCByZXF1aXJlcyByZWFkIGFuZCB3cml0ZSBvbiB0aGUgc29ja2V0LgorICBmZHNbMF0uZXZlbnRzID0gd2FudFJlYWQgPyBUSFJJRlRfUE9MTElOIDogVEhSSUZUX1BPTExJTiB8IFRIUklGVF9QT0xMT1VUOworCisgIGlmIChpbnRlcnJ1cHRMaXN0ZW5lcl8pIHsKKyAgICBmZHNbMV0uZmQgPSAqKGludGVycnVwdExpc3RlbmVyXy5nZXQoKSk7CisgICAgZmRzWzFdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgIH0KKworICBpbnQgdGltZW91dCA9IC0xOworICBpZiAod2FudFJlYWQgJiYgcmVjdlRpbWVvdXRfKSB7CisgICAgdGltZW91dCA9IHJlY3ZUaW1lb3V0XzsKKyAgfQorICBpZiAoIXdhbnRSZWFkICYmIHNlbmRUaW1lb3V0XykgeworICAgIHRpbWVvdXQgPSBzZW5kVGltZW91dF87CisgIH0KKworICBpbnQgcmV0ID0gVEhSSUZUX1BPTEwoZmRzLCBpbnRlcnJ1cHRMaXN0ZW5lcl8gPyAyIDogMSwgdGltZW91dCk7CisKKyAgaWYgKHJldCA8IDApIHsKKyAgICAvLyBlcnJvciBjYXNlcworICAgIGlmIChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA9PSBUSFJJRlRfRUlOVFIpIHsKKyAgICAgIHJldHVybiBUU1NMX0VJTlRSOyAvLyByZXBlYXQgb3BlcmF0aW9uCisgICAgfQorICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNTTFNvY2tldDo6cmVhZCBUSFJJRlRfUE9MTCgpICIsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlVua25vd24iLCBlcnJub19jb3B5KTsKKyAgfSBlbHNlIGlmIChyZXQgPiAwKXsKKyAgICBpZiAoZmRzWzFdLnJldmVudHMgJiBUSFJJRlRfUE9MTElOKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVELCAiSW50ZXJydXB0ZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIFRTU0xfREFUQTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgIlRIUklGVF9QT0xMICh0aW1lZCBvdXQpIik7CisgIH0KK30KKwogLy8gVFNTTFNvY2tldEZhY3RvcnkgaW1wbGVtZW50YXRpb24KIHVpbnQ2NF90IFRTU0xTb2NrZXRGYWN0b3J5Ojpjb3VudF8gPSAwOwogTXV0ZXggVFNTTFNvY2tldEZhY3Rvcnk6Om11dGV4XzsKQEAgLTQ1Nyw3ICs4NTksNyBAQAogICAgIHJhbmRvbWl6ZSgpOwogICB9CiAgIGNvdW50XysrOwotICBjdHhfID0gYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4obmV3IFNTTENvbnRleHQocHJvdG9jb2wpKTsKKyAgY3R4XyA9IHN0ZDo6bWFrZV9zaGFyZWQ8U1NMQ29udGV4dD4ocHJvdG9jb2wpOwogfQogCiBUU1NMU29ja2V0RmFjdG9yeTo6flRTU0xTb2NrZXRGYWN0b3J5KCkgewpAQCAtNDY5LDMwICs4NzEsNDkgQEAKICAgfQogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KCkgewotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XykpOworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XykpOwogICBzZXR1cChzc2wpOwogICByZXR1cm4gc3NsOwogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBzb2NrZXQpKTsKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIGludGVycnVwdExpc3RlbmVyKSk7CiAgIHNldHVwKHNzbCk7CiAgIHJldHVybiBzc2w7CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCkgewotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaG9zdCwgcG9ydCkpOworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBzb2NrZXQpKTsKICAgc2V0dXAoc3NsKTsKICAgcmV0dXJuIHNzbDsKIH0KIAotdm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6c2V0dXAoYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKSB7CitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4Xywgc29ja2V0LCBpbnRlcnJ1cHRMaXN0ZW5lcikpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaG9zdCwgcG9ydCkpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBob3N0LCBwb3J0LCBpbnRlcnJ1cHRMaXN0ZW5lcikpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCisKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OnNldHVwKHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wpIHsKICAgc3NsLT5zZXJ2ZXIoc2VydmVyKCkpOwotICBpZiAoYWNjZXNzXyA9PSBOVUxMICYmICFzZXJ2ZXIoKSkgewotICAgIGFjY2Vzc18gPSBib29zdDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPihuZXcgRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXIpOworICBpZiAoYWNjZXNzXyA9PSBudWxscHRyICYmICFzZXJ2ZXIoKSkgeworICAgIGFjY2Vzc18gPSBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4obmV3IERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyKTsKICAgfQotICBpZiAoYWNjZXNzXyAhPSBOVUxMKSB7CisgIGlmIChhY2Nlc3NfICE9IG51bGxwdHIpIHsKICAgICBzc2wtPmFjY2VzcyhhY2Nlc3NfKTsKICAgfQogfQpAQCAtNTE2LDExICs5MzcsMTEgQEAKICAgfSBlbHNlIHsKICAgICBtb2RlID0gU1NMX1ZFUklGWV9OT05FOwogICB9Ci0gIFNTTF9DVFhfc2V0X3ZlcmlmeShjdHhfLT5nZXQoKSwgbW9kZSwgTlVMTCk7CisgIFNTTF9DVFhfc2V0X3ZlcmlmeShjdHhfLT5nZXQoKSwgbW9kZSwgbnVsbHB0cik7CiB9CiAKIHZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmxvYWRDZXJ0aWZpY2F0ZShjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBmb3JtYXQpIHsKLSAgaWYgKHBhdGggPT0gTlVMTCB8fCBmb3JtYXQgPT0gTlVMTCkgeworICBpZiAocGF0aCA9PSBudWxscHRyIHx8IGZvcm1hdCA9PSBudWxscHRyKSB7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkQ2VydGlmaWNhdGVDaGFpbjogZWl0aGVyIDxwYXRoPiBvciA8Zm9ybWF0PiBpcyBOVUxMIik7CiAgIH0KQEAgLTUzNyw3ICs5NTgsNyBAQAogfQogCiB2b2lkIFRTU0xTb2NrZXRGYWN0b3J5Ojpsb2FkUHJpdmF0ZUtleShjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBmb3JtYXQpIHsKLSAgaWYgKHBhdGggPT0gTlVMTCB8fCBmb3JtYXQgPT0gTlVMTCkgeworICBpZiAocGF0aCA9PSBudWxscHRyIHx8IGZvcm1hdCA9PSBudWxscHRyKSB7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkUHJpdmF0ZUtleTogZWl0aGVyIDxwYXRoPiBvciA8Zm9ybWF0PiBpcyBOVUxMIik7CiAgIH0KQEAgLTU1MSwxMiArOTcyLDEyIEBACiAgIH0KIH0KIAotdm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY29uc3QgY2hhciogcGF0aCkgewotICBpZiAocGF0aCA9PSBOVUxMKSB7Cit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5Ojpsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBjYXBhdGgpIHsKKyAgaWYgKHBhdGggPT0gbnVsbHB0cikgewogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXM6IDxwYXRoPiBpcyBOVUxMIik7CiAgIH0KLSAgaWYgKFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGN0eF8tPmdldCgpLCBwYXRoLCBOVUxMKSA9PSAwKSB7CisgIGlmIChTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjdHhfLT5nZXQoKSwgcGF0aCwgY2FwYXRoKSA9PSAwKSB7CiAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBzdHJpbmcgZXJyb3JzOwogICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CkBAIC01NzQsNyArOTk1LDcgQEAKIH0KIAogaW50IFRTU0xTb2NrZXRGYWN0b3J5OjpwYXNzd29yZENhbGxiYWNrKGNoYXIqIHBhc3N3b3JkLCBpbnQgc2l6ZSwgaW50LCB2b2lkKiBkYXRhKSB7Ci0gIFRTU0xTb2NrZXRGYWN0b3J5KiBmYWN0b3J5ID0gKFRTU0xTb2NrZXRGYWN0b3J5KilkYXRhOworICBhdXRvKiBmYWN0b3J5ID0gKFRTU0xTb2NrZXRGYWN0b3J5KilkYXRhOwogICBzdHJpbmcgdXNlclBhc3N3b3JkOwogICBmYWN0b3J5LT5nZXRQYXNzd29yZCh1c2VyUGFzc3dvcmQsIHNpemUpOwogICBpbnQgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50Pih1c2VyUGFzc3dvcmQuc2l6ZSgpKTsKQEAgLTU4Nyw3ICsxMDA4LDcgQEAKIH0KIAogLy8gZXh0cmFjdCBlcnJvciBtZXNzYWdlcyBmcm9tIGVycm9yIHF1ZXVlCi12b2lkIGJ1aWxkRXJyb3JzKHN0cmluZyYgZXJyb3JzLCBpbnQgZXJybm9fY29weSkgewordm9pZCBidWlsZEVycm9ycyhzdHJpbmcmIGVycm9ycywgaW50IGVycm5vX2NvcHksIGludCBzc2xlcnJubykgewogICB1bnNpZ25lZCBsb25nIGVycm9yQ29kZTsKICAgY2hhciBtZXNzYWdlWzI1Nl07CiAKQEAgLTU5Nyw3ICsxMDE4LDcgQEAKICAgICAgIGVycm9ycyArPSAiOyAiOwogICAgIH0KICAgICBjb25zdCBjaGFyKiByZWFzb24gPSBFUlJfcmVhc29uX2Vycm9yX3N0cmluZyhlcnJvckNvZGUpOwotICAgIGlmIChyZWFzb24gPT0gTlVMTCkgeworICAgIGlmIChyZWFzb24gPT0gbnVsbHB0cikgewogICAgICAgVEhSSUZUX1NOUFJJTlRGKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSAtIDEsICJTU0wgZXJyb3IgIyAlbHUiLCBlcnJvckNvZGUpOwogICAgICAgcmVhc29uID0gbWVzc2FnZTsKICAgICB9CkBAIC02MDksMjIgKzEwMzAsMzMgQEAKICAgICB9CiAgIH0KICAgaWYgKGVycm9ycy5lbXB0eSgpKSB7Ci0gICAgZXJyb3JzID0gImVycm9yIGNvZGU6ICIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oZXJybm9fY29weSk7CisgICAgZXJyb3JzID0gImVycm9yIGNvZGU6ICIgKyB0b19zdHJpbmcoZXJybm9fY29weSk7CisgIH0KKyAgaWYgKHNzbGVycm5vKSB7CisgICAgZXJyb3JzICs9ICIgKFNTTF9lcnJvcl9jb2RlID0gIiArIHRvX3N0cmluZyhzc2xlcnJubykgKyAiKSI7CisgICAgaWYgKHNzbGVycm5vID09IFNTTF9FUlJPUl9TWVNDQUxMKSB7CisgICAgICBjaGFyIGJ1Zls0MDk2XTsKKyAgICAgIGludCBlcnI7CisgICAgICB3aGlsZSAoKGVyciA9IEVSUl9nZXRfZXJyb3IoKSkgIT0gMCkgeworICAgICAgICBlcnJvcnMgKz0gIiAiOworICAgICAgICBlcnJvcnMgKz0gRVJSX2Vycm9yX3N0cmluZyhlcnIsIGJ1Zik7CisgICAgICB9CisgICAgfQogICB9CiB9CiAKIC8qKgogICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBBY2Nlc3NNYW5hZ2VyCiAgKi8KLURlY2lzaW9uIERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyOjp2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EpIHRocm93KCkgeworRGVjaXNpb24gRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6OnZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSkgbm9leGNlcHQgewogICAodm9pZClzYTsKICAgcmV0dXJuIFNLSVA7CiB9CiAKIERlY2lzaW9uIERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyOjp2ZXJpZnkoY29uc3Qgc3RyaW5nJiBob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgdGhyb3coKSB7Ci0gIGlmIChob3N0LmVtcHR5KCkgfHwgbmFtZSA9PSBOVUxMIHx8IHNpemUgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgbm9leGNlcHQgeworICBpZiAoaG9zdC5lbXB0eSgpIHx8IG5hbWUgPT0gbnVsbHB0ciB8fCBzaXplIDw9IDApIHsKICAgICByZXR1cm4gU0tJUDsKICAgfQogICByZXR1cm4gKG1hdGNoTmFtZShob3N0LmNfc3RyKCksIG5hbWUsIHNpemUpID8gQUxMT1cgOiBTS0lQKTsKQEAgLTYzMiw3ICsxMDY0LDcgQEAKIAogRGVjaXNpb24gRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6OnZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIHRocm93KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgbm9leGNlcHQgewogICBib29sIG1hdGNoID0gZmFsc2U7CiAgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVCAmJiBzaXplID09IHNpemVvZihpbl9hZGRyKSkgewogICAgIG1hdGNoID0gKG1lbWNtcCgmKChzb2NrYWRkcl9pbiopJnNhKS0+c2luX2FkZHIsIGRhdGEsIHNpemUpID09IDApOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaAppbmRleCAwMmQ0MTRiLi44N2E5NjAxIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaApAQCAtMjAsMTIgKzIwLDEzIEBACiAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTU0xTT0NLRVRfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNPQ0tFVF9IXyAxCiAKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKy8vIFB1dCB0aGlzIGZpcnN0IHRvIGF2b2lkIFdJTjMyIGJ1aWxkIGZhaWx1cmUKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KIAorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CkBAIC00Myw2ICs0NCw5IEBACiAgIExBVEVTVCAgPSBUTFN2MV8yCiB9OwogCisjZGVmaW5lIFRTU0xfRUlOVFIgMAorI2RlZmluZSBUU1NMX0RBVEEgMQorCiAvKioKICAqIEluaXRpYWxpemUgT3BlblNTTCBsaWJyYXJ5LiAgVGhpcyBmdW5jdGlvbiwgb3Igc29tZSBvdGhlcgogICogZXF1aXZhbGVudCBmdW5jdGlvbiB0byBpbml0aWFsaXplIE9wZW5TU0wsIG11c3QgYmUgY2FsbGVkIGJlZm9yZQpAQCAtNjUsMTcgKzY5LDE5IEBACiAgKi8KIGNsYXNzIFRTU0xTb2NrZXQgOiBwdWJsaWMgVFNvY2tldCB7CiBwdWJsaWM6Ci0gIH5UU1NMU29ja2V0KCk7CisgIH5UU1NMU29ja2V0KCkgb3ZlcnJpZGU7CiAgIC8qKgogICAgKiBUVHJhbnNwb3J0IGludGVyZmFjZS4KICAgICovCi0gIGJvb2wgaXNPcGVuKCk7Ci0gIGJvb2wgcGVlaygpOwotICB2b2lkIG9wZW4oKTsKLSAgdm9pZCBjbG9zZSgpOwotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHZvaWQgZmx1c2goKTsKKyAgYm9vbCBpc09wZW4oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBwZWVrKCkgb3ZlcnJpZGU7CisgIHZvaWQgb3BlbigpIG92ZXJyaWRlOworICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGU7CisgIGJvb2wgaGFzUGVuZGluZ0RhdGFUb1JlYWQoKSBvdmVycmlkZTsKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgb3ZlcnJpZGU7CisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIG92ZXJyaWRlOworICB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSBvdmVycmlkZTsKKyAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlOwogICAvKioKICAgKiBTZXQgd2hldGhlciB0byB1c2UgY2xpZW50IG9yIHNlcnZlciBzaWRlIFNTTCBoYW5kc2hha2UgcHJvdG9jb2wuCiAgICoKQEAgLTkxLDI2ICs5Nyw1MSBAQAogICAgKgogICAgKiBAcGFyYW0gbWFuYWdlciAgSW5zdGFuY2Ugb2YgQWNjZXNzTWFuYWdlcgogICAgKi8KLSAgdmlydHVhbCB2b2lkIGFjY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBtYW5hZ2VyKSB7IGFjY2Vzc18gPSBtYW5hZ2VyOyB9CisgIHZpcnR1YWwgdm9pZCBhY2Nlc3Moc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IG1hbmFnZXIpIHsgYWNjZXNzXyA9IG1hbmFnZXI7IH0KKyAgLyoqCisgICAqIFNldCBldmVudFNhZmUgZmxhZyBpZiBsaWJldmVudCBpcyB1c2VkLgorICAgKi8KKyAgdm9pZCBzZXRMaWJldmVudFNhZmUoKSB7IGV2ZW50U2FmZV8gPSB0cnVlOyB9CisgIC8qKgorICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgU1NMIFNvY2tldCBpcyBsaWJldmVudCBzYWZlIG9yIG5vdC4KKyAgICovCisgIGJvb2wgaXNMaWJldmVudFNhZmUoKSBjb25zdCB7IHJldHVybiBldmVudFNhZmVfOyB9CiAKIHByb3RlY3RlZDoKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yLgogICAgKi8KLSAgVFNTTFNvY2tldChib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgpOworICBUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgpOworICAvKioKKyAgICogQ29uc3RydWN0b3Igd2l0aCBhbiBpbnRlcnJ1cHQgc2lnbmFsLgorICAgKi8KKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOwogICAvKioKICAgICogQ29uc3RydWN0b3IsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IGdpdmVuIGFuIGV4aXN0aW5nIHNvY2tldC4KICAgICoKICAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQKICAgICovCi0gIFRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQpOwogICAvKioKKyAgICogQ29uc3RydWN0b3IsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IGdpdmVuIGFuIGV4aXN0aW5nIHNvY2tldCB0aGF0IGNhbiBiZSBpbnRlcnJ1cHRlZC4KKyAgICoKKyAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQKKyAgICovCisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgICAvKioKICAgICogQ29uc3RydWN0b3IuCiAgICAqCiAgICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCBuYW1lCiAgICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCBudW1iZXIKICAgICovCi0gIFRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCk7CisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQpOworICAgIC8qKgorICAqIENvbnN0cnVjdG9yIHdpdGggYW4gaW50ZXJydXB0IHNpZ25hbC4KKyAgKgorICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCBuYW1lCisgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IG51bWJlcgorICAqLworICAgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CiAgIC8qKgogICAgKiBBdXRob3JpemUgcGVlciBhY2Nlc3MgYWZ0ZXIgU1NMIGhhbmRzaGFrZSBjb21wbGV0ZXMuCiAgICAqLwpAQCAtMTE4LDE3ICsxNDksNTUgQEAKICAgLyoqCiAgICAqIEluaXRpYXRlIFNTTCBoYW5kc2hha2UgaWYgbm90IGFscmVhZHkgaW5pdGlhdGVkLgogICAgKi8KLSAgdm9pZCBjaGVja0hhbmRzaGFrZSgpOworICB2b2lkIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgLyoqCisgICAqIEluaXRpYXRlIFNTTCBoYW5kc2hha2UgcGFyYW1zLgorICAgKi8KKyAgdm9pZCBpbml0aWFsaXplSGFuZHNoYWtlUGFyYW1zKCk7CisgIC8qKgorICAgKiBDaGVjayBpZiAgU1NMIGhhbmRzaGFrZSBpcyBjb21wbGV0ZWQgb3Igbm90LgorICAgKi8KKyAgYm9vbCBjaGVja0hhbmRzaGFrZSgpOworICAvKioKKyAgICogV2FpdHMgZm9yIGFuIHNvY2tldCBvciBzaHV0ZG93biBldmVudC4KKyAgICoKKyAgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEIGlmIGludGVycnVwdGVkIGlzIHNpZ25hbGVkLgorICAgKgorICAgKiBAcmV0dXJuIFRTU0xfRUlOVFIgaWYgRUlOVFIgaGFwcGVuZWQgb24gdGhlIHVuZGVybHlpbmcgc29ja2V0CisgICAqICAgICAgICAgVFNTTF9EQVRBICBpZiBkYXRhIGlzIGF2YWlsYWJsZSBvbiB0aGUgc29ja2V0LgorICAgKi8KKyAgdW5zaWduZWQgaW50IHdhaXRGb3JFdmVudChib29sIHdhbnRSZWFkKTsKIAogICBib29sIHNlcnZlcl87CiAgIFNTTCogc3NsXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eF87CisgIHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NfOwogICBmcmllbmQgY2xhc3MgVFNTTFNvY2tldEZhY3Rvcnk7CisKK3ByaXZhdGU6CisgIGJvb2wgaGFuZHNoYWtlQ29tcGxldGVkXzsKKyAgaW50IHJlYWRSZXRyeUNvdW50XzsKKyAgYm9vbCBldmVudFNhZmVfOworCisgIHZvaWQgaW5pdCgpOwogfTsKIAogLyoqCiAgKiBTU0wgc29ja2V0IGZhY3RvcnkuIFNTTCBzb2NrZXRzIHNob3VsZCBiZSBjcmVhdGVkIHZpYSBTU0wgZmFjdG9yeS4KKyAqIFRoZSBmYWN0b3J5IHdpbGwgYXV0b21hdGljYWxseSBpbml0aWFsaXplIGFuZCBjbGVhbnVwIG9wZW5zc2wgYXMgbG9uZyBhcworICogdGhlcmUgaXMgYSBUU1NMU29ja2V0RmFjdG9yeSBpbnN0YW50aWF0ZWQsIGFuZCBhcyBsb25nIGFzIHRoZSBzdGF0aWMKKyAqIGJvb2xlYW4gbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyBpcyBzZXQgdG8gZmFsc2UsIHRoZSBkZWZhdWx0LgorICoKKyAqIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluaXRpYWxpemUgYW5kIGNsZWFudXAgb3BlbnNzbCB5b3Vyc2VsZiwgc2V0CisgKiBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fIHRvIHRydWUgYW5kIFRTU0xTb2NrZXRGYWN0b3J5IHdpbGwgbm8KKyAqIGxvbmdlciBiZSByZXNwb25zaWJsZSBmb3Igb3BlbnNzbCBpbml0aWFsaXphdGlvbiBhbmQgdGVhcmRvd24uCisgKgorICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjb2RlIHVzaW5nIFRTU0xTb2NrZXRGYWN0b3J5IHRvCisgKiBlbnN1cmUgdGhhdCB0aGUgZmFjdG9yeSBsaWZldGltZSBleGNlZWRzIHRoZSBsaWZldGltZSBvZiBhbnkgc29ja2V0cworICogaXQgbWlnaHQgY3JlYXRlLiAgSWYgdGhpcyBpcyBub3QgZ3VhcmFudGVlZCwgYSBzb2NrZXQgbWF5IGNhbGwgaW50bworICogb3BlbnNzbCBhZnRlciB0aGUgc29ja2V0IGZhY3RvcnkgaGFzIGNsZWFuZWQgdXAgb3BlbnNzbCEgIFRoaXMKKyAqIGd1YXJhbnRlZSBpcyB1bm5lY2Vzc2FyeSBpZiBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fIGlzIHRydWUsCisgKiBob3dldmVyLCBzaW5jZSBpdCB3b3VsZCBiZSB1cCB0byB0aGUgY29uc3VtaW5nIGFwcGxpY2F0aW9uIGluc3RlYWQuCiAgKi8KIGNsYXNzIFRTU0xTb2NrZXRGYWN0b3J5IHsKIHB1YmxpYzoKQEAgLTE0MiwyMCArMjExLDM3IEBACiAgIC8qKgogICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCB3aXRoIGEgZnJlc2ggbmV3IHNvY2tldC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldCgpOworICAvKioKKyAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCBhIGZyZXNoIG5ldyBzb2NrZXQsIHdoaWNoIGlzIGludGVycnVwdGFibGUuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKICAgLyoqCiAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IHdpdGggdGhlIGdpdmVuIHNvY2tldC4KICAgICoKICAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIC8qKgorICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCB3aXRoIHRoZSBnaXZlbiBzb2NrZXQgd2hpY2ggaXMgaW50ZXJydXB0YWJsZS4KKyAgICoKKyAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CiAgIC8qKgogICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0LgogICAqCiAgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IHRvIGJlIGNvbm5lY3RlZCB0bwogICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCB0byBiZSBjb25uZWN0ZWQgdG8KICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisgIC8qKgorICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0LgorICAqCisgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IHRvIGJlIGNvbm5lY3RlZCB0bworICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCB0byBiZSBjb25uZWN0ZWQgdG8KKyAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKICAgLyoqCiAgICAqIFNldCBjaXBoZXJzIHRvIGJlIHVzZWQgaW4gU1NMIGhhbmRzaGFrZSBwcm9jZXNzLgogICAgKgpAQCAtMTg3LDcgKzI3Myw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBmaWxlCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgbG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY29uc3QgY2hhciogcGF0aCk7CisgIHZpcnR1YWwgdm9pZCBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBjYXBhdGggPSBudWxscHRyKTsKICAgLyoqCiAgICAqIERlZmF1bHQgcmFuZG9taXplIG1ldGhvZC4KICAgICovCkBAIC0yMTMsMTMgKzI5OSwxMyBAQAogICAgKgogICAgKiBAcGFyYW0gbWFuYWdlciAgVGhlIEFjY2Vzc01hbmFnZXIgaW5zdGFuY2UKICAgICovCi0gIHZpcnR1YWwgdm9pZCBhY2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gbWFuYWdlcikgeyBhY2Nlc3NfID0gbWFuYWdlcjsgfQorICB2aXJ0dWFsIHZvaWQgYWNjZXNzKHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBtYW5hZ2VyKSB7IGFjY2Vzc18gPSBtYW5hZ2VyOyB9CiAgIHN0YXRpYyB2b2lkIHNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbihib29sIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbikgewogICAgIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gPSBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb247CiAgIH0KIAogcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHhfOworICBzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKIAogICAvKioKICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGN1c3RvbSBwYXNzd29yZCBjYWxsYmFjay4gSXQgbWF5IGJlIGNhbGxlZApAQCAtMjMyLDExICszMTgsMTEgQEAKIAogcHJpdmF0ZToKICAgYm9vbCBzZXJ2ZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NfOworICBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzXzsKICAgc3RhdGljIGNvbmN1cnJlbmN5OjpNdXRleCBtdXRleF87CiAgIHN0YXRpYyB1aW50NjRfdCBjb3VudF87Ci0gIHN0YXRpYyBib29sIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl87Ci0gIHZvaWQgc2V0dXAoYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKTsKKyAgVEhSSUZUX0VYUE9SVCBzdGF0aWMgYm9vbCBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fOworICB2b2lkIHNldHVwKHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wpOwogICBzdGF0aWMgaW50IHBhc3N3b3JkQ2FsbGJhY2soY2hhciogcGFzc3dvcmQsIGludCBzaXplLCBpbnQsIHZvaWQqIGRhdGEpOwogfTsKIApAQCAtMjQ4LDcgKzMzNCw3IEBACiAgIFRTU0xFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCiAgICAgOiBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCBtZXNzYWdlKSB7fQogCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgeworICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgb3ZlcnJpZGUgewogICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CiAgICAgICByZXR1cm4gIlRTU0xFeGNlcHRpb24iOwogICAgIH0gZWxzZSB7CkBAIC0yODcsNyArMzczLDcgQEAKICAgLyoqCiAgICAqIERlc3RydWN0b3IKICAgICovCi0gIHZpcnR1YWwgfkFjY2Vzc01hbmFnZXIoKSB7fQorICB2aXJ0dWFsIH5BY2Nlc3NNYW5hZ2VyKCkgPSBkZWZhdWx0OwogICAvKioKICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKICAgICogb25jZSBhZnRlciB0aGUgU1NMIGhhbmRzaGFrZSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCBiZWZvcmUgcGVlciBjZXJ0aWZpY2F0ZQpAQCAtMjk5LDcgKzM4NSw3IEBACiAgICAqIEBwYXJhbSAgc2EgUGVlciBJUCBhZGRyZXNzCiAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGVlciBpcyB0cnVzdGVkLCBmYWxzZSBvdGhlcndpc2UKICAgICovCi0gIHZpcnR1YWwgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIC8qIHNhICovKSB0aHJvdygpIHsgcmV0dXJuIERFTlk7IH0KKyAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgLyogc2EgKi8pIG5vZXhjZXB0IHsgcmV0dXJuIERFTlk7IH0KICAgLyoqCiAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QuIEl0J3MgY2FsbGVkCiAgICAqIGV2ZXJ5IHRpbWUgYSBETlMgc3ViamVjdEFsdE5hbWUvY29tbW9uIG5hbWUgaXMgZXh0cmFjdGVkIGZyb20gcGVlcidzCkBAIC0zMTUsNyArNDAxLDcgQEAKICAgICovCiAgIHZpcnR1YWwgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBob3N0ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBuYW1lICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogc2l6ZSAqLykgdGhyb3coKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBzaXplICovKSBub2V4Y2VwdCB7CiAgICAgcmV0dXJuIERFTlk7CiAgIH0KICAgLyoqCkBAIC0zMjksNyArNDE1LDcgQEAKICAgICovCiAgIHZpcnR1YWwgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIC8qIHNhICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBkYXRhICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogc2l6ZSAqLykgdGhyb3coKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBzaXplICovKSBub2V4Y2VwdCB7CiAgICAgcmV0dXJuIERFTlk7CiAgIH0KIH07CkBAIC0zMzksOSArNDI1LDkgQEAKIGNsYXNzIERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyIDogcHVibGljIEFjY2Vzc01hbmFnZXIgewogcHVibGljOgogICAvLyBBY2Nlc3NNYW5hZ2VyIGludGVyZmFjZQotICBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EpIHRocm93KCk7Ci0gIERlY2lzaW9uIHZlcmlmeShjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgY29uc3QgY2hhciogbmFtZSwgaW50IHNpemUpIHRocm93KCk7Ci0gIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwgY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUpIHRocm93KCk7CisgIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSkgbm9leGNlcHQgb3ZlcnJpZGU7CisgIERlY2lzaW9uIHZlcmlmeShjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgY29uc3QgY2hhciogbmFtZSwgaW50IHNpemUpIG5vZXhjZXB0IG92ZXJyaWRlOworICBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EsIGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKSBub2V4Y2VwdCBvdmVycmlkZTsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcAppbmRleCBkYWExNTI0Li5lY2UwNTQ0IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCiAjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICkBAIC00Niw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogCiAjaWZuZGVmIEFGX0xPQ0FMCiAjZGVmaW5lIEFGX0xPQ0FMIEFGX1VOSVgKQEAgLTc1LDE1ICs3NSwzNyBAQAogICBkZWxldGUgc3NvY2s7CiB9CiAKK3VzaW5nIHN0ZDo6c3RyaW5nOworCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworVEdldEFkZHJJbmZvV3JhcHBlcjo6VEdldEFkZHJJbmZvV3JhcHBlcihjb25zdCBjaGFyKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIGhpbnRzKQorICA6IG5vZGVfKG5vZGUpLCBzZXJ2aWNlXyhzZXJ2aWNlKSwgaGludHNfKGhpbnRzKSwgcmVzXyhudWxscHRyKSB7fQorCitUR2V0QWRkckluZm9XcmFwcGVyOjp+VEdldEFkZHJJbmZvV3JhcHBlcigpIHsKKyAgaWYgKHRoaXMtPnJlc18gIT0gbnVsbHB0cikKKyAgICBmcmVlYWRkcmluZm8odGhpcy0+cmVzXyk7Cit9CisKK2ludCBUR2V0QWRkckluZm9XcmFwcGVyOjppbml0KCkgeworICBpZiAodGhpcy0+cmVzXyA9PSBudWxscHRyKQorICAgIHJldHVybiBnZXRhZGRyaW5mbyh0aGlzLT5ub2RlXywgdGhpcy0+c2VydmljZV8sIHRoaXMtPmhpbnRzXywgJih0aGlzLT5yZXNfKSk7CisgIHJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIFRHZXRBZGRySW5mb1dyYXBwZXI6OnJlcygpIHsKKyAgcmV0dXJuIHRoaXMtPnJlc187Cit9CiAKIFRTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCi0gIDogcG9ydF8ocG9ydCksCisgIDogaW50ZXJydXB0YWJsZUNoaWxkcmVuXyh0cnVlKSwKKyAgICBwb3J0Xyhwb3J0KSwKICAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCiAgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKICAgICBzZW5kVGltZW91dF8oMCksCkBAIC05NCw3ICsxMTYsNiBAQAogICAgIHRjcFNlbmRCdWZmZXJfKDApLAogICAgIHRjcFJlY3ZCdWZmZXJfKDApLAogICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAotICAgIGludGVycnVwdGFibGVDaGlsZHJlbl8odHJ1ZSksCiAgICAgbGlzdGVuaW5nXyhmYWxzZSksCiAgICAgaW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKICAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLApAQCAtMTAyLDcgKzEyMyw4IEBACiB9CiAKIFRTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBzZW5kVGltZW91dCwgaW50IHJlY3ZUaW1lb3V0KQotICA6IHBvcnRfKHBvcnQpLAorICA6IGludGVycnVwdGFibGVDaGlsZHJlbl8odHJ1ZSksCisgICAgcG9ydF8ocG9ydCksCiAgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAogICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCiAgICAgc2VuZFRpbWVvdXRfKHNlbmRUaW1lb3V0KSwKQEAgLTExMyw3ICsxMzUsNiBAQAogICAgIHRjcFNlbmRCdWZmZXJfKDApLAogICAgIHRjcFJlY3ZCdWZmZXJfKDApLAogICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAotICAgIGludGVycnVwdGFibGVDaGlsZHJlbl8odHJ1ZSksCiAgICAgbGlzdGVuaW5nXyhmYWxzZSksCiAgICAgaW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKICAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLApAQCAtMTIxLDcgKzE0Miw4IEBACiB9CiAKIFRTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RyaW5nJiBhZGRyZXNzLCBpbnQgcG9ydCkKLSAgOiBwb3J0Xyhwb3J0KSwKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKHBvcnQpLAogICAgIGFkZHJlc3NfKGFkZHJlc3MpLAogICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKICAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLApAQCAtMTMzLDcgKzE1NSw2IEBACiAgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCiAgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCiAgICAga2VlcEFsaXZlXyhmYWxzZSksCi0gICAgaW50ZXJydXB0YWJsZUNoaWxkcmVuXyh0cnVlKSwKICAgICBsaXN0ZW5pbmdfKGZhbHNlKSwKICAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAogICAgIGludGVycnVwdFNvY2tSZWFkZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCkBAIC0xNDEsNyArMTYyLDggQEAKIH0KIAogVFNlcnZlclNvY2tldDo6VFNlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIHBhdGgpCi0gIDogcG9ydF8oMCksCisgIDogaW50ZXJydXB0YWJsZUNoaWxkcmVuXyh0cnVlKSwKKyAgICBwb3J0XygwKSwKICAgICBwYXRoXyhwYXRoKSwKICAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCiAgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKQEAgLTE1Myw3ICsxNzUsNiBAQAogICAgIHRjcFNlbmRCdWZmZXJfKDApLAogICAgIHRjcFJlY3ZCdWZmZXJfKDApLAogICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAotICAgIGludGVycnVwdGFibGVDaGlsZHJlbl8odHJ1ZSksCiAgICAgbGlzdGVuaW5nXyhmYWxzZSksCiAgICAgaW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKICAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLApAQCAtMjI4LDcgKzI0OSw3IEBACiAgIH0gZWxzZSB7CiAgICAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IHN2WzFdOwogICAgIHBDaGlsZEludGVycnVwdFNvY2tSZWFkZXJfCi0gICAgICAgID0gYm9vc3Q6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4obmV3IFRIUklGVF9TT0NLRVQoc3ZbMF0pLCBkZXN0cm95ZXJfb2ZfZmluZV9zb2NrZXRzKTsKKyAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4obmV3IFRIUklGVF9TT0NLRVQoc3ZbMF0pLCBkZXN0cm95ZXJfb2ZfZmluZV9zb2NrZXRzKTsKICAgfQogCiAgIC8vIFZhbGlkYXRlIHBvcnQgbnVtYmVyCkBAIC0yMzYsMTcgKzI1NywyMSBAQAogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkIik7CiAgIH0KIAotICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXMwOworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnJlczsKICAgaW50IGVycm9yOwogICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNSIpXTsKKyAgVEhSSUZUX1NOUFJJTlRGKHBvcnQsIHNpemVvZihwb3J0KSwgIiVkIiwgcG9ydF8pOworCisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKICAgc3RkOjptZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKICAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOwogICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwogICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOwotICBzcHJpbnRmKHBvcnQsICIlZCIsIHBvcnRfKTsKIAogICAvLyBJZiBhZGRyZXNzIGlzIG5vdCBzcGVjaWZpZWQgdXNlIHdpbGRjYXJkIGFkZHJlc3MgKE5VTEwpCi0gIGVycm9yID0gZ2V0YWRkcmluZm8oYWRkcmVzc18uZW1wdHkoKSA/IE5VTEwgOiAmYWRkcmVzc19bMF0sIHBvcnQsICZoaW50cywgJnJlczApOworICBUR2V0QWRkckluZm9XcmFwcGVyIGluZm8oYWRkcmVzc18uZW1wdHkoKSA/IG51bGxwdHIgOiAmYWRkcmVzc19bMF0sIHBvcnQsICZoaW50cyk7CisKKyAgZXJyb3IgPSBpbmZvLmluaXQoKTsKICAgaWYgKGVycm9yKSB7CiAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiZ2V0YWRkcmluZm8gJWQ6ICVzIiwgZXJyb3IsIFRIUklGVF9HQUlfU1RSRVJST1IoZXJyb3IpKTsKICAgICBjbG9zZSgpOwpAQCAtMjU2LDE0ICsyODEsMTQgQEAKIAogICAvLyBQaWNrIHRoZSBpcHY2IGFkZHJlc3MgZmlyc3Qgc2luY2UgaXB2NCBhZGRyZXNzZXMgY2FuIGJlIG1hcHBlZAogICAvLyBpbnRvIGlwdjYgc3BhY2UuCi0gIGZvciAocmVzID0gcmVzMDsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKLSAgICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgfHwgcmVzLT5haV9uZXh0ID09IE5VTEwpCisgIGZvciAocmVzID0gaW5mby5yZXMoKTsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKKyAgICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgfHwgcmVzLT5haV9uZXh0ID09IG51bGxwdHIpCiAgICAgICBicmVhazsKICAgfQogCiAgIGlmICghcGF0aF8uZW1wdHkoKSkgewogICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVApOwotICB9IGVsc2UgeworICB9IGVsc2UgaWYgKHJlcyAhPSBudWxscHRyKSB7CiAgICAgc2VydmVyU29ja2V0XyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CiAgIH0KIApAQCAtNDAyLDYgKzQyNyw3IEBACiAgIC8vIHdlIG1heSB3YW50IHRvIHRyeSB0byBiaW5kIG1vcmUgdGhhbiBvbmNlLCBzaW5jZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgZG9lc24ndAogICAvLyBhbHdheXMgc2VlbSB0byB3b3JrLiBUaGUgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHJldHJ5IHZhcmlhYmxlcy4KICAgaW50IHJldHJpZXMgPSAwOworICBpbnQgZXJybm9fY29weSA9IDA7CiAKICAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CiAKQEAgLTQwOSw4ICs0MzUsOCBAQAogCiAgICAgLy8gVW5peCBEb21haW4gU29ja2V0CiAgICAgc2l6ZV90IGxlbiA9IHBhdGhfLnNpemUoKSArIDE7Ci0gICAgaWYgKGxlbiA+IHNpemVvZigoKHNvY2thZGRyX3VuKilOVUxMKS0+c3VuX3BhdGgpKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIGlmIChsZW4gPiBzaXplb2YoKChzb2NrYWRkcl91biopbnVsbHB0ciktPnN1bl9wYXRoKSkgeworICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6bGlzdGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLCBlcnJub19jb3B5KTsKICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbml4IERvbWFpbiBzb2NrZXQgcGF0aCB0b28gbG9uZyIsCkBAIC00MjAsMTIgKzQ0NiwyNSBAQAogICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyZXNzOwogICAgIGFkZHJlc3Muc3VuX2ZhbWlseSA9IEFGX1VOSVg7CiAgICAgbWVtY3B5KGFkZHJlc3Muc3VuX3BhdGgsIHBhdGhfLmNfc3RyKCksIGxlbik7Ci0gICAgc29ja2xlbl90IHN0cnVjdGxlbiA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKGFkZHJlc3MpKTsKKworICAgIGF1dG8gc3RydWN0bGVuID0gc3RhdGljX2Nhc3Q8c29ja2xlbl90PihzaXplb2YoYWRkcmVzcykpOworCisgICAgaWYgKCFhZGRyZXNzLnN1bl9wYXRoWzBdKSB7IC8vIGFic3RyYWN0IG5hbWVzcGFjZSBzb2NrZXQKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIC8vIHN1bl9wYXRoIGlzIG5vdCBudWxsLXRlcm1pbmF0ZWQgaW4gdGhpcyBjYXNlIGFuZCBzdHJ1Y3RsZW4gZGV0ZXJtaW5lcyBpdHMgbGVuZ3RoCisgICAgICBzdHJ1Y3RsZW4gLT0gc2l6ZW9mKGFkZHJlc3Muc3VuX3BhdGgpIC0gbGVuOworI2Vsc2UKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldHMgb25seSBzdXBwb3J0ZWQgb24gbGludXg6ICIsIC05OSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisgICAgfQogCiAgICAgZG8gewogICAgICAgaWYgKDAgPT0gOjpiaW5kKHNlcnZlclNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyZXNzLCBzdHJ1Y3RsZW4pKSB7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQorICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgICAgLy8gdXNlIHNob3J0IGNpcmN1aXQgZXZhbHVhdGlvbiBoZXJlIHRvIG9ubHkgc2xlZXAgaWYgd2UgbmVlZCB0bwogICAgIH0gd2hpbGUgKChyZXRyaWVzKysgPCByZXRyeUxpbWl0XykgJiYgKFRIUklGVF9TTEVFUF9TRUMocmV0cnlEZWxheV8pID09IDApKTsKICNlbHNlCkBAIC00MzgsMjYgKzQ3NywyNCBAQAogICAgICAgaWYgKDAgPT0gOjpiaW5kKHNlcnZlclNvY2tldF8sIHJlcy0+YWlfYWRkciwgc3RhdGljX2Nhc3Q8aW50PihyZXMtPmFpX2FkZHJsZW4pKSkgewogICAgICAgICBicmVhazsKICAgICAgIH0KKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICAgIC8vIHVzZSBzaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24gaGVyZSB0byBvbmx5IHNsZWVwIGlmIHdlIG5lZWQgdG8KICAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChUSFJJRlRfU0xFRVBfU0VDKHJldHJ5RGVsYXlfKSA9PSAwKSk7CiAKLSAgICAvLyBmcmVlIGFkZHJpbmZvCi0gICAgZnJlZWFkZHJpbmZvKHJlczApOwotCiAgICAgLy8gcmV0cmlldmUgYmluZCBpbmZvCiAgICAgaWYgKHBvcnRfID09IDAgJiYgcmV0cmllcyA8PSByZXRyeUxpbWl0XykgewotICAgICAgc3RydWN0IHNvY2thZGRyIHNhOworICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2E7CiAgICAgICBzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHNhKTsKICAgICAgIHN0ZDo6bWVtc2V0KCZzYSwgMCwgbGVuKTsKLSAgICAgIGlmICg6OmdldHNvY2tuYW1lKHNlcnZlclNvY2tldF8sICZzYSwgJmxlbikgPCAwKSB7Ci0gICAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87CisgICAgICBpZiAoOjpnZXRzb2NrbmFtZShzZXJ2ZXJTb2NrZXRfLCByZWludGVycHJldF9jYXN0PHN0cnVjdCBzb2NrYWRkcio+KCZzYSksICZsZW4pIDwgMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmdldFBvcnQoKSBnZXRzb2NrbmFtZSgpICIsIGVycm5vX2NvcHkpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgewotICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNio+KCZzYSk7CisgICAgICAgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgICAgICBjb25zdCBhdXRvKiBzaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqPigmc2EpOwogICAgICAgICAgIHBvcnRfID0gbnRvaHMoc2luLT5zaW42X3BvcnQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qPigmc2EpOworICAgICAgICAgIGNvbnN0IGF1dG8qIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luKj4oJnNhKTsKICAgICAgICAgICBwb3J0XyA9IG50b2hzKHNpbi0+c2luX3BvcnQpOwogICAgICAgICB9CiAgICAgICB9CkBAIC00NjgsMTUgKzUwNSwxNSBAQAogICBpZiAocmV0cmllcyA+IHJldHJ5TGltaXRfKSB7CiAgICAgY2hhciBlcnJidWZbMTAyNF07CiAgICAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7Ci0gICAgICBzcHJpbnRmKGVycmJ1ZiwgIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIFBBVEggJXMiLCBwYXRoXy5jX3N0cigpKTsKKyAgICAgIFRIUklGVF9TTlBSSU5URihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgUEFUSCAlcyIsIHBhdGhfLmNfc3RyKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICBzcHJpbnRmKGVycmJ1ZiwgIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIEJJTkQgJWQiLCBwb3J0Xyk7CisgICAgICBUSFJJRlRfU05QUklOVEYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIEJJTkQgJWQiLCBwb3J0Xyk7CiAgICAgfQogICAgIEdsb2JhbE91dHB1dChlcnJidWYpOwogICAgIGNsb3NlKCk7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYmluZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgfQogCiAgIGlmIChsaXN0ZW5DYWxsYmFja18pCkBAIC00ODQsNyArNTIxLDcgQEAKIAogICAvLyBDYWxsIGxpc3RlbgogICBpZiAoLTEgPT0gOjpsaXN0ZW4oc2VydmVyU29ja2V0XywgYWNjZXB0QmFja2xvZ18pKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgbGlzdGVuKCkgIiwgZXJybm9fY29weSk7CiAgICAgY2xvc2UoKTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGxpc3RlbiIsIGVycm5vX2NvcHkpOwpAQCAtNTU3LDcgKzU5NCw3IEBACiAgIFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0CiAgICAgICA9IDo6YWNjZXB0KHNlcnZlclNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCAoc29ja2xlbl90Kikmc2l6ZSk7CiAKLSAgaWYgKGNsaWVudFNvY2tldCA9PSAtMSkgeworICBpZiAoY2xpZW50U29ja2V0ID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIDo6YWNjZXB0KCkgIiwgZXJybm9fY29weSk7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiYWNjZXB0KCkiLCBlcnJub19jb3B5KTsKQEAgLTYwNSw5ICs2NDIsOSBAQAogCiBzaGFyZWRfcHRyPFRTb2NrZXQ+IFRTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudFNvY2tldCkgewogICBpZiAoaW50ZXJydXB0YWJsZUNoaWxkcmVuXykgewotICAgIHJldHVybiBzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGNsaWVudFNvY2tldCwgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8pKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxUU29ja2V0PihjbGllbnRTb2NrZXQsIHBDaGlsZEludGVycnVwdFNvY2tSZWFkZXJfKTsKICAgfSBlbHNlIHsKLSAgICByZXR1cm4gc2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChjbGllbnRTb2NrZXQpKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxUU29ja2V0PihjbGllbnRTb2NrZXQpOwogICB9CiB9CiAKQEAgLTYyMSwxNCArNjU4LDIxIEBACiB9CiAKIHZvaWQgVFNlcnZlclNvY2tldDo6aW50ZXJydXB0KCkgewotICBub3RpZnkoaW50ZXJydXB0U29ja1dyaXRlcl8pOworICBjb25jdXJyZW5jeTo6R3VhcmQgZyhyd011dGV4Xyk7CisgIGlmIChpbnRlcnJ1cHRTb2NrV3JpdGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBub3RpZnkoaW50ZXJydXB0U29ja1dyaXRlcl8pOworICB9CiB9CiAKIHZvaWQgVFNlcnZlclNvY2tldDo6aW50ZXJydXB0Q2hpbGRyZW4oKSB7Ci0gIG5vdGlmeShjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKTsKKyAgY29uY3VycmVuY3k6Okd1YXJkIGcocndNdXRleF8pOworICBpZiAoY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBub3RpZnkoY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyk7CisgIH0KIH0KIAogdm9pZCBUU2VydmVyU29ja2V0OjpjbG9zZSgpIHsKKyAgY29uY3VycmVuY3k6Okd1YXJkIGcocndNdXRleF8pOwogICBpZiAoc2VydmVyU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKICAgICBzaHV0ZG93bihzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfU0hVVF9SRFdSKTsKICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzZXJ2ZXJTb2NrZXRfKTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmgKaW5kZXggNThlNGFmZC4uZDY0MDk2OCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmgKQEAgLTIwLDEwICsyMCwxNyBAQAogI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSU09DS0VUX0hfCiAjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJTT0NLRVRfSF8gMQogCi0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTkVUREJfSAorI2luY2x1ZGUgPG5ldGRiLmg+CisjZW5kaWYKIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTMxLDYgKzM4LDIyIEBACiAKIGNsYXNzIFRTb2NrZXQ7CiAKK2NsYXNzIFRHZXRBZGRySW5mb1dyYXBwZXIgeworcHVibGljOgorICBUR2V0QWRkckluZm9XcmFwcGVyKGNvbnN0IGNoYXIqIG5vZGUsIGNvbnN0IGNoYXIqIHNlcnZpY2UsIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogaGludHMpOworCisgIHZpcnR1YWwgflRHZXRBZGRySW5mb1dyYXBwZXIoKTsKKworICBpbnQgaW5pdCgpOworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIHJlcygpOworCitwcml2YXRlOgorICBjb25zdCBjaGFyKiBub2RlXzsKKyAgY29uc3QgY2hhciogc2VydmljZV87CisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogaGludHNfOworICBzdHJ1Y3QgYWRkcmluZm8qIHJlc187Cit9OworCiAvKioKICAqIFNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclRyYW5zcG9ydC4gV3JhcHBlciBhcm91bmQgYSB1bml4CiAgKiBzb2NrZXQgbGlzdGVuIGFuZCBhY2NlcHQgY2FsbHMuCkBAIC0zOCw3ICs2MSw3IEBACiAgKi8KIGNsYXNzIFRTZXJ2ZXJTb2NrZXQgOiBwdWJsaWMgVFNlcnZlclRyYW5zcG9ydCB7CiBwdWJsaWM6Ci0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChUSFJJRlRfU09DS0VUIGZkKT4gc29ja2V0X2Z1bmNfdDsKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoVEhSSUZUX1NPQ0tFVCBmZCk+IHNvY2tldF9mdW5jX3Q7CiAKICAgY29uc3Qgc3RhdGljIGludCBERUZBVUxUX0JBQ0tMT0cgPSAxMDI0OwogCkBAIC03Myw3ICs5Niw3IEBACiAgICAqLwogICBUU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKIAotICB2aXJ0dWFsIH5UU2VydmVyU29ja2V0KCk7CisgIH5UU2VydmVyU29ja2V0KCkgb3ZlcnJpZGU7CiAKICAgdm9pZCBzZXRTZW5kVGltZW91dChpbnQgc2VuZFRpbWVvdXQpOwogICB2b2lkIHNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCk7CkBAIC0xMTMsMTYgKzEzNiwyMCBAQAogICAvLyBcdGhyb3dzIHN0ZDo6bG9naWNfZXJyb3IgaWYgbGlzdGVuKCkgaGFzIGJlZW4gY2FsbGVkCiAgIHZvaWQgc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGJvb2wgZW5hYmxlKTsKIAorICBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgb3ZlcnJpZGUgeyByZXR1cm4gc2VydmVyU29ja2V0XzsgfQorCiAgIGludCBnZXRQb3J0KCk7CiAKLSAgdm9pZCBsaXN0ZW4oKTsKLSAgdm9pZCBpbnRlcnJ1cHQoKTsKLSAgdm9pZCBpbnRlcnJ1cHRDaGlsZHJlbigpOwotICB2b2lkIGNsb3NlKCk7CisgIHZvaWQgbGlzdGVuKCkgb3ZlcnJpZGU7CisgIHZvaWQgaW50ZXJydXB0KCkgb3ZlcnJpZGU7CisgIHZvaWQgaW50ZXJydXB0Q2hpbGRyZW4oKSBvdmVycmlkZTsKKyAgdm9pZCBjbG9zZSgpIG92ZXJyaWRlOwogCiBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpIG92ZXJyaWRlOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpOworICBib29sIGludGVycnVwdGFibGVDaGlsZHJlbl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXzsgLy8gaWYgaW50ZXJydXB0YWJsZUNoaWxkcmVuXyB0aGlzIGlzIHNoYXJlZCB3aXRoIGNoaWxkIFRTb2NrZXRzCiAKIHByaXZhdGU6CiAgIHZvaWQgbm90aWZ5KFRIUklGVF9TT0NLRVQgbm90aWZ5U29jayk7CkBAIC0xNDAsMTMgKzE2NywxMiBAQAogICBpbnQgdGNwU2VuZEJ1ZmZlcl87CiAgIGludCB0Y3BSZWN2QnVmZmVyXzsKICAgYm9vbCBrZWVwQWxpdmVfOwotICBib29sIGludGVycnVwdGFibGVDaGlsZHJlbl87CiAgIGJvb2wgbGlzdGVuaW5nXzsKIAorICBjb25jdXJyZW5jeTo6TXV0ZXggcndNdXRleF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkLXNhZmUgaW50ZXJydXB0CiAgIFRIUklGVF9TT0NLRVQgaW50ZXJydXB0U29ja1dyaXRlcl87ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3RpZmllZCBvbiBpbnRlcnJ1cHQoKQogICBUSFJJRlRfU09DS0VUIGludGVycnVwdFNvY2tSZWFkZXJfOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdXNlZCBpbiBzZWxlY3QvcG9sbCB3aXRoIHNlcnZlclNvY2tldF8gZm9yIGludGVycnVwdGFiaWxpdHkKICAgVEhSSUZUX1NPQ0tFVCBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfOyAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdGlmaWVkIG9uIGludGVycnVwdENoaWxkcmVuKCkKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl87IC8vIGlmIGludGVycnVwdGFibGVDaGlsZHJlbl8gdGhpcyBpcyBzaGFyZWQgd2l0aCBjaGlsZCBUU29ja2V0cwogCiAgIHNvY2tldF9mdW5jX3QgbGlzdGVuQ2FsbGJhY2tfOwogICBzb2NrZXRfZnVuY190IGFjY2VwdENhbGxiYWNrXzsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmgKaW5kZXggY2QxZDNkYS4uZjQ2NWJiMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmgKQEAgLTIyLDcgKzIyLDYgQEAKIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtMzYsNyArMzUsNyBAQAogICovCiBjbGFzcyBUU2VydmVyVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgdmlydHVhbCB+VFNlcnZlclRyYW5zcG9ydCgpIHt9CisgIHZpcnR1YWwgflRTZXJ2ZXJUcmFuc3BvcnQoKSA9IGRlZmF1bHQ7CiAKICAgLyoqCiAgICAqIFN0YXJ0cyB0aGUgc2VydmVyIHRyYW5zcG9ydCBsaXN0ZW5pbmcgZm9yIG5ldyBjb25uZWN0aW9ucy4gUHJpb3IgdG8gdGhpcwpAQCAtNTYsOCArNTUsOCBAQAogICAgKiBAcmV0dXJuIEEgbmV3IFRUcmFuc3BvcnQgb2JqZWN0CiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvcgogICAgKi8KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0KCkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHJlc3VsdCA9IGFjY2VwdEltcGwoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcmVzdWx0ID0gYWNjZXB0SW1wbCgpOwogICAgIGlmICghcmVzdWx0KSB7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CiAgICAgfQpAQCAtODMsMTIgKzgyLDIxIEBACiAgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHRDaGlsZHJlbigpIHt9CiAKICAgLyoqCisgICogVXRpbGl0eSBtZXRob2QKKyAgKgorICAqIEByZXR1cm4gc2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKKyAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKKyAgKi8KKworICB2aXJ0dWFsIFRIUklGVF9TT0NLRVQgZ2V0U29ja2V0RkQoKSB7IHJldHVybiAtMTsgfQorCisgIC8qKgogICAgKiBDbG9zZXMgdGhpcyB0cmFuc3BvcnQgc3VjaCB0aGF0IGZ1dHVyZSBjYWxscyB0byBhY2NlcHQgd2lsbCBkbyBub3RoaW5nLgogICAgKi8KICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOwogCiBwcm90ZWN0ZWQ6Ci0gIFRTZXJ2ZXJUcmFuc3BvcnQoKSB7fQorICBUU2VydmVyVHJhbnNwb3J0KCkgPSBkZWZhdWx0OwogCiAgIC8qKgogICAgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBmb3IgYWNjZXB0LgpAQCAtOTYsNyArMTA0LDcgQEAKICAgICogQHJldHVybiBBIG5ld2x5IGFsbG9jYXRlZCBUVHJhbnNwb3J0IG9iamVjdAogICAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCmluZGV4IGYyZWNhZTEuLjE4NWM3OGQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCkBAIC0zOCwxNiArMzgsMTYgQEAKICAqLwogY2xhc3MgVFNob3J0UmVhZFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUU2hvcnRSZWFkVHJhbnNwb3J0PiB7CiBwdWJsaWM6Ci0gIFRTaG9ydFJlYWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBkb3VibGUgZnVsbF9wcm9iKQorICBUU2hvcnRSZWFkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIGRvdWJsZSBmdWxsX3Byb2IpCiAgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksIGZ1bGxQcm9iXyhmdWxsX3Byb2IpIHt9CiAKLSAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsgfQorICBib29sIGlzT3BlbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOyB9CiAKLSAgYm9vbCBwZWVrKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+cGVlaygpOyB9CisgIGJvb2wgcGVlaygpIG92ZXJyaWRlIHsgcmV0dXJuIHRyYW5zcG9ydF8tPnBlZWsoKTsgfQogCi0gIHZvaWQgb3BlbigpIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CisgIHZvaWQgb3BlbigpIG92ZXJyaWRlIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CiAKLSAgdm9pZCBjbG9zZSgpIHsgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsgfQorICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGUgeyB0cmFuc3BvcnRfLT5jbG9zZSgpOyB9CiAKICAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICAgIGlmIChsZW4gPT0gMCkgewpAQCAtNjIsMTYgKzYyLDE2IEBACiAKICAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7IH0KIAotICB2b2lkIGZsdXNoKCkgeyB0cmFuc3BvcnRfLT5mbHVzaCgpOyB9CisgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7IHRyYW5zcG9ydF8tPmZsdXNoKCk7IH0KIAogICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7IHJldHVybiB0cmFuc3BvcnRfLT5ib3Jyb3coYnVmLCBsZW4pOyB9CiAKICAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbikgeyByZXR1cm4gdHJhbnNwb3J0Xy0+Y29uc3VtZShsZW4pOyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7IHJldHVybiB0cmFuc3BvcnRfOyB9CiAKIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CiAgIGRvdWJsZSBmdWxsUHJvYl87CiB9OwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5jcHAKaW5kZXggZDMzNmJiNC4uOTc3ODM0ZCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwCkBAIC0yMSw2ICsyMSw5IEBACiAKICNpbmNsdWRlIDxjc3RyaW5nPgogI2luY2x1ZGUgPHNzdHJlYW0+CisjaWZkZWYgSEFWRV9TWVNfSU9DVExfSAorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmCiAjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjZW5kaWYKQEAgLTYzLDEyICs2NiwxMiBAQAogICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTT0NLT1BUX0NBU1RfVCo+KHYpOwogfQogCit1c2luZyBzdGQ6OnN0cmluZzsKKwogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiAvKioKICAqIFRTb2NrZXQgaW1wbGVtZW50YXRpb24uCiAgKgpAQCAtNzcsOCArODAsOCBAQAogVFNvY2tldDo6VFNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KQogICA6IGhvc3RfKGhvc3QpLAogICAgIHBvcnRfKHBvcnQpLAotICAgIHBhdGhfKCIiKSwKICAgICBzb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgcGVlclBvcnRfKDApLAogICAgIGNvbm5UaW1lb3V0XygwKSwKICAgICBzZW5kVGltZW91dF8oMCksCiAgICAgcmVjdlRpbWVvdXRfKDApLApAQCAtOTAsMTAgKzkzLDEwIEBACiB9CiAKIFRTb2NrZXQ6OlRTb2NrZXQoY29uc3Qgc3RyaW5nJiBwYXRoKQotICA6IGhvc3RfKCIiKSwKLSAgICBwb3J0XygwKSwKKyAgOiBwb3J0XygwKSwKICAgICBwYXRoXyhwYXRoKSwKICAgICBzb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgcGVlclBvcnRfKDApLAogICAgIGNvbm5UaW1lb3V0XygwKSwKICAgICBzZW5kVGltZW91dF8oMCksCiAgICAgcmVjdlRpbWVvdXRfKDApLApAQCAtMTA2LDEwICsxMDksOSBAQAogfQogCiBUU29ja2V0OjpUU29ja2V0KCkKLSAgOiBob3N0XygiIiksCi0gICAgcG9ydF8oMCksCi0gICAgcGF0aF8oIiIpLAorICA6IHBvcnRfKDApLAogICAgIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBwZWVyUG9ydF8oMCksCiAgICAgY29ublRpbWVvdXRfKDApLAogICAgIHNlbmRUaW1lb3V0XygwKSwKICAgICByZWN2VGltZW91dF8oMCksCkBAIC0xMjIsMTAgKzEyNCw5IEBACiB9CiAKIFRTb2NrZXQ6OlRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpCi0gIDogaG9zdF8oIiIpLAotICAgIHBvcnRfKDApLAotICAgIHBhdGhfKCIiKSwKKyAgOiBwb3J0XygwKSwKICAgICBzb2NrZXRfKHNvY2tldCksCisgICAgcGVlclBvcnRfKDApLAogICAgIGNvbm5UaW1lb3V0XygwKSwKICAgICBzZW5kVGltZW91dF8oMCksCiAgICAgcmVjdlRpbWVvdXRfKDApLApAQCAtMTQzLDExICsxNDQsMTAgQEAKICNlbmRpZgogfQogCi1UU29ja2V0OjpUU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0LCBib29zdDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKLSAgOiBob3N0XygiIiksCi0gICAgcG9ydF8oMCksCi0gICAgcGF0aF8oIiIpLAorVFNvY2tldDo6VFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQorICA6IHBvcnRfKDApLAogICAgIHNvY2tldF8oc29ja2V0KSwKKyAgICBwZWVyUG9ydF8oMCksCiAgICAgaW50ZXJydXB0TGlzdGVuZXJfKGludGVycnVwdExpc3RlbmVyKSwKICAgICBjb25uVGltZW91dF8oMCksCiAgICAgc2VuZFRpbWVvdXRfKDApLApAQCAtMTcwLDcgKzE3MCwyNyBAQAogICBjbG9zZSgpOwogfQogCi1ib29sIFRTb2NrZXQ6OmlzT3BlbigpIHsKK2Jvb2wgVFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSB7CisgIGlmICghaXNPcGVuKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbnQzMl90IHJldHJpZXMgPSAwOworICBUSFJJRlRfSU9DVExfU09DS0VUX05VTV9CWVRFU19UWVBFIG51bUJ5dGVzQXZhaWxhYmxlOwordHJ5X2FnYWluOgorICBpbnQgciA9IFRIUklGVF9JT0NUTF9TT0NLRVQoc29ja2V0XywgRklPTlJFQUQsICZudW1CeXRlc0F2YWlsYWJsZSk7CisgIGlmIChyID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRUlOVFIgJiYgKHJldHJpZXMrKyA8IG1heFJlY3ZSZXRyaWVzXykpIHsKKyAgICAgIGdvdG8gdHJ5X2FnYWluOworICAgIH0KKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpoYXNQZW5kaW5nRGF0YVRvUmVhZCgpIFRIUklGVF9JT0NUTF9TT0NLRVQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CisgIH0KKyAgcmV0dXJuIG51bUJ5dGVzQXZhaWxhYmxlID4gMDsKK30KKworYm9vbCBUU29ja2V0Ojppc09wZW4oKSBjb25zdCB7CiAgIHJldHVybiAoc29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpOwogfQogCkBAIC0yMjAsNyArMjQwLDYgQEAKICAgICAgKiB0aGUgb3RoZXIgc2lkZQogICAgICAqLwogICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FQ09OTlJFU0VUKSB7Ci0gICAgICBjbG9zZSgpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICNlbmRpZgpAQCAtMzA1LDcgKzMyNCw3IEBACiAKICNpZm5kZWYgX1dJTjMyCiAgICAgc2l6ZV90IGxlbiA9IHBhdGhfLnNpemUoKSArIDE7Ci0gICAgaWYgKGxlbiA+IHNpemVvZigoKHNvY2thZGRyX3VuKilOVUxMKS0+c3VuX3BhdGgpKSB7CisgICAgaWYgKGxlbiA+IHNpemVvZigoKHNvY2thZGRyX3VuKiludWxscHRyKS0+c3VuX3BhdGgpKSB7CiAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwgZXJybm9fY29weSk7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIik7CkBAIC0zMTQsNyArMzMzLDIwIEBACiAgICAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHJlc3M7CiAgICAgYWRkcmVzcy5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKICAgICBtZW1jcHkoYWRkcmVzcy5zdW5fcGF0aCwgcGF0aF8uY19zdHIoKSwgbGVuKTsKLSAgICBzb2NrbGVuX3Qgc3RydWN0bGVuID0gc3RhdGljX2Nhc3Q8c29ja2xlbl90PihzaXplb2YoYWRkcmVzcykpOworCisgICAgYXV0byBzdHJ1Y3RsZW4gPSBzdGF0aWNfY2FzdDxzb2NrbGVuX3Q+KHNpemVvZihhZGRyZXNzKSk7CisKKyAgICBpZiAoIWFkZHJlc3Muc3VuX3BhdGhbMF0pIHsgLy8gYWJzdHJhY3QgbmFtZXNwYWNlIHNvY2tldAorI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gc3VuX3BhdGggaXMgbm90IG51bGwtdGVybWluYXRlZCBpbiB0aGlzIGNhc2UgYW5kIHN0cnVjdGxlbiBkZXRlcm1pbmVzIGl0cyBsZW5ndGgKKyAgICAgIHN0cnVjdGxlbiAtPSBzaXplb2YoYWRkcmVzcy5zdW5fcGF0aCkgLSBsZW47CisjZWxzZQorICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0cyBvbmx5IHN1cHBvcnRlZCBvbiBsaW51eDogIiwgLTk5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKyAgICB9CisKICAgICByZXQgPSBjb25uZWN0KHNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyZXNzLCBzdHJ1Y3RsZW4pOwogI2Vsc2UKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCBvbiB3aW5kb3dzIiwgLTk5KTsKQEAgLTM3Niw3ICs0MDgsMTEgQEAKIAogZG9uZToKICAgLy8gU2V0IHNvY2tldCBiYWNrIHRvIG5vcm1hbCBtb2RlIChibG9ja2luZykKLSAgVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncyk7CisgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoc29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFRIUklGVF9GQ05UTCAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVEhSSUZUX0ZDTlRMKCkgZmFpbGVkIiwgZXJybm9fY29weSk7CisgIH0KIAogICBpZiAocGF0aF8uZW1wdHkoKSkgewogICAgIHNldENhY2hlZEFkZHJlc3MocmVzLT5haV9hZGRyLCBzdGF0aWNfY2FzdDxzb2NrbGVuX3Q+KHJlcy0+YWlfYWRkcmxlbikpOwpAQCAtMzk3LDcgKzQzMyw3IEBACiB2b2lkIFRTb2NrZXQ6OnVuaXhfb3BlbigpIHsKICAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CiAgICAgLy8gVW5peCBEb21haW4gU09ja2V0IGRvZXMgbm90IG5lZWQgYWRkcmluZm8gc3RydWN0LCBzbyB3ZSBwYXNzIE5VTEwKLSAgICBvcGVuQ29ubmVjdGlvbihOVUxMKTsKKyAgICBvcGVuQ29ubmVjdGlvbihudWxscHRyKTsKICAgfQogfQogCkBAIC00MTcsOCArNDUzLDggQEAKICAgfQogCiAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlczA7Ci0gIHJlcyA9IE5VTEw7Ci0gIHJlczAgPSBOVUxMOworICByZXMgPSBudWxscHRyOworICByZXMwID0gbnVsbHB0cjsKICAgaW50IGVycm9yOwogICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNSIpXTsKICAgc3RkOjptZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKQEAgLTUwNCw3ICs1NDAsNyBAQAogICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAogICBzdHJ1Y3QgdGltZXZhbCBiZWdpbjsKICAgaWYgKHJlY3ZUaW1lb3V0XyA+IDApIHsKLSAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZiZWdpbiwgTlVMTCk7CisgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmYmVnaW4sIG51bGxwdHIpOwogICB9IGVsc2UgewogICAgIC8vIGlmIHRoZXJlIGlzIG5vIHJlYWQgdGltZW91dCB3ZSBkb24ndCBuZWVkIHRoZSBUT0QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKICAgICAvLyBhbiBUSFJJRlRfRUFHQUlOIGlzIGR1ZSB0byBhIHRpbWVvdXQgb3IgYW4gb3V0LW9mLXJlc291cmNlIGNvbmRpdGlvbi4KQEAgLTU1Niw4ICs1OTIsOCBAQAogICAgICAgfQogICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFjayBvZiByZXNvdXJjZXMgb3IgdGltZW91dCBjYXNlCiAgICAgICBzdHJ1Y3QgdGltZXZhbCBlbmQ7Ci0gICAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZlbmQsIE5VTEwpOwotICAgICAgdWludDMyX3QgcmVhZEVsYXBzZWRNaWNyb3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKChlbmQudHZfc2VjIC0gYmVnaW4udHZfc2VjKSAqIDEwMDAgKiAxMDAwKQorICAgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmZW5kLCBudWxscHRyKTsKKyAgICAgIGF1dG8gcmVhZEVsYXBzZWRNaWNyb3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKChlbmQudHZfc2VjIC0gYmVnaW4udHZfc2VjKSAqIDEwMDAgKiAxMDAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoZW5kLnR2X3VzZWMgLSBiZWdpbi50dl91c2VjKSk7CiAKICAgICAgIGlmICghZWFnYWluVGhyZXNob2xkTWljcm9zIHx8IChyZWFkRWxhcHNlZE1pY3JvcyA8IGVhZ2FpblRocmVzaG9sZE1pY3JvcykpIHsKQEAgLTY0Myw3ICs2NzksNiBAQAogCiAgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VQSVBFIHx8IGVycm5vX2NvcHkgPT0gVEhSSUZUX0VDT05OUkVTRVQKICAgICAgICAgfHwgZXJybm9fY29weSA9PSBUSFJJRlRfRU5PVENPTk4pIHsKLSAgICAgIGNsb3NlKCk7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAid3JpdGUoKSBzZW5kKCkiLCBlcnJub19jb3B5KTsKICAgICB9CiAKQEAgLTY4Myw3ICs3MTgsNyBAQAogI2lmbmRlZiBfV0lOMzIKICAgc3RydWN0IGxpbmdlciBsID0geyhsaW5nZXJPbl8gPyAxIDogMCksIGxpbmdlclZhbF99OwogI2Vsc2UKLSAgc3RydWN0IGxpbmdlciBsID0geyhsaW5nZXJPbl8gPyAxIDogMCksIHN0YXRpY19jYXN0PHVfc2hvcnQ+KGxpbmdlclZhbF8pfTsKKyAgc3RydWN0IGxpbmdlciBsID0ge3N0YXRpY19jYXN0PHVfc2hvcnQ+KGxpbmdlck9uXyA/IDEgOiAwKSwgc3RhdGljX2Nhc3Q8dV9zaG9ydD4obGluZ2VyVmFsXyl9OwogI2VuZGlmCiAKICAgaW50IHJldCA9IHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjYXN0X3NvY2tvcHQoJmwpLCBzaXplb2YobCkpOwpAQCAtNzUzLDcgKzc4OCw3IEBACiB2b2lkIFRTb2NrZXQ6OnNldEtlZXBBbGl2ZShib29sIGtlZXBBbGl2ZSkgewogICBrZWVwQWxpdmVfID0ga2VlcEFsaXZlOwogCi0gIGlmIChzb2NrZXRfID09IC0xKSB7CisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIHJldHVybjsKICAgfQogCkBAIC03NzIsMTggKzgwNywyMiBAQAogICBtYXhSZWN2UmV0cmllc18gPSBtYXhSZWN2UmV0cmllczsKIH0KIAotc3RyaW5nIFRTb2NrZXQ6OmdldFNvY2tldEluZm8oKSB7CitzdHJpbmcgVFNvY2tldDo6Z2V0U29ja2V0SW5mbygpIGNvbnN0IHsKICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKLSAgaWYgKGhvc3RfLmVtcHR5KCkgfHwgcG9ydF8gPT0gMCkgewotICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgZ2V0UGVlckFkZHJlc3MoKTsKLSAgICBvc3MgPDwgIiBQb3J0OiAiIDw8IGdldFBlZXJQb3J0KCkgPDwgIj4iOworICBpZiAocGF0aF8uZW1wdHkoKSkgeworICAgIGlmIChob3N0Xy5lbXB0eSgpIHx8IHBvcnRfID09IDApIHsKKyAgICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgZ2V0UGVlckFkZHJlc3MoKTsKKyAgICAgIG9zcyA8PCAiIFBvcnQ6ICIgPDwgZ2V0UGVlclBvcnQoKSA8PCAiPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgaG9zdF8gPDwgIiBQb3J0OiAiIDw8IHBvcnRfIDw8ICI+IjsKKyAgICB9CiAgIH0gZWxzZSB7Ci0gICAgb3NzIDw8ICI8SG9zdDogIiA8PCBob3N0XyA8PCAiIFBvcnQ6ICIgPDwgcG9ydF8gPDwgIj4iOworICAgIG9zcyA8PCAiPFBhdGg6ICIgPDwgcGF0aF8gPDwgIj4iOwogICB9CiAgIHJldHVybiBvc3Muc3RyKCk7CiB9CiAKLXN0ZDo6c3RyaW5nIFRTb2NrZXQ6OmdldFBlZXJIb3N0KCkgeworc3RkOjpzdHJpbmcgVFNvY2tldDo6Z2V0UGVlckhvc3QoKSBjb25zdCB7CiAgIGlmIChwZWVySG9zdF8uZW1wdHkoKSAmJiBwYXRoXy5lbXB0eSgpKSB7CiAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKICAgICBzdHJ1Y3Qgc29ja2FkZHIqIGFkZHJQdHI7CkBAIC03OTUsMTQgKzgzNCwxNCBAQAogCiAgICAgYWRkclB0ciA9IGdldENhY2hlZEFkZHJlc3MoJmFkZHJMZW4pOwogCi0gICAgaWYgKGFkZHJQdHIgPT0gTlVMTCkgeworICAgIGlmIChhZGRyUHRyID09IG51bGxwdHIpIHsKICAgICAgIGFkZHJMZW4gPSBzaXplb2YoYWRkcik7CiAgICAgICBpZiAoZ2V0cGVlcm5hbWUoc29ja2V0XywgKHNvY2thZGRyKikmYWRkciwgJmFkZHJMZW4pICE9IDApIHsKICAgICAgICAgcmV0dXJuIHBlZXJIb3N0XzsKICAgICAgIH0KICAgICAgIGFkZHJQdHIgPSAoc29ja2FkZHIqKSZhZGRyOwogCi0gICAgICBzZXRDYWNoZWRBZGRyZXNzKGFkZHJQdHIsIGFkZHJMZW4pOworICAgICAgY29uc3RfY2FzdDxUU29ja2V0Jj4oKnRoaXMpLnNldENhY2hlZEFkZHJlc3MoYWRkclB0ciwgYWRkckxlbik7CiAgICAgfQogCiAgICAgY2hhciBjbGllbnRob3N0W05JX01BWEhPU1RdOwpAQCAtODIxLDcgKzg2MCw3IEBACiAgIHJldHVybiBwZWVySG9zdF87CiB9CiAKLXN0ZDo6c3RyaW5nIFRTb2NrZXQ6OmdldFBlZXJBZGRyZXNzKCkgeworc3RkOjpzdHJpbmcgVFNvY2tldDo6Z2V0UGVlckFkZHJlc3MoKSBjb25zdCB7CiAgIGlmIChwZWVyQWRkcmVzc18uZW1wdHkoKSAmJiBwYXRoXy5lbXB0eSgpKSB7CiAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKICAgICBzdHJ1Y3Qgc29ja2FkZHIqIGFkZHJQdHI7CkBAIC04MzMsMTQgKzg3MiwxNCBAQAogCiAgICAgYWRkclB0ciA9IGdldENhY2hlZEFkZHJlc3MoJmFkZHJMZW4pOwogCi0gICAgaWYgKGFkZHJQdHIgPT0gTlVMTCkgeworICAgIGlmIChhZGRyUHRyID09IG51bGxwdHIpIHsKICAgICAgIGFkZHJMZW4gPSBzaXplb2YoYWRkcik7CiAgICAgICBpZiAoZ2V0cGVlcm5hbWUoc29ja2V0XywgKHNvY2thZGRyKikmYWRkciwgJmFkZHJMZW4pICE9IDApIHsKICAgICAgICAgcmV0dXJuIHBlZXJBZGRyZXNzXzsKICAgICAgIH0KICAgICAgIGFkZHJQdHIgPSAoc29ja2FkZHIqKSZhZGRyOwogCi0gICAgICBzZXRDYWNoZWRBZGRyZXNzKGFkZHJQdHIsIGFkZHJMZW4pOworICAgICAgY29uc3RfY2FzdDxUU29ja2V0Jj4oKnRoaXMpLnNldENhY2hlZEFkZHJlc3MoYWRkclB0ciwgYWRkckxlbik7CiAgICAgfQogCiAgICAgY2hhciBjbGllbnRob3N0W05JX01BWEhPU1RdOwpAQCAtODYwLDcgKzg5OSw3IEBACiAgIHJldHVybiBwZWVyQWRkcmVzc187CiB9CiAKLWludCBUU29ja2V0OjpnZXRQZWVyUG9ydCgpIHsKK2ludCBUU29ja2V0OjpnZXRQZWVyUG9ydCgpIGNvbnN0IHsKICAgZ2V0UGVlckFkZHJlc3MoKTsKICAgcmV0dXJuIHBlZXJQb3J0XzsKIH0KQEAgLTg5OCw3ICs5MzcsNyBAQAogICAgIHJldHVybiAoc29ja2FkZHIqKSZjYWNoZWRQZWVyQWRkcl8uaXB2NjsKIAogICBkZWZhdWx0OgotICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBudWxscHRyOwogICB9CiB9CiAKQEAgLTkxMCw3ICs5NDksNyBAQAogICByZXR1cm4gdXNlTG93TWluUnRvXzsKIH0KIAotY29uc3Qgc3RkOjpzdHJpbmcgVFNvY2tldDo6Z2V0T3JpZ2luKCkgeworY29uc3Qgc3RkOjpzdHJpbmcgVFNvY2tldDo6Z2V0T3JpZ2luKCkgY29uc3QgewogICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOwogICBvc3MgPDwgZ2V0UGVlckhvc3QoKSA8PCAiOiIgPDwgZ2V0UGVlclBvcnQoKTsKICAgcmV0dXJuIG9zcy5zdHIoKTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmgKaW5kZXggOWYwMDc0ZC4uYjBlOGFkZSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmgKQEAgLTc0LDMxICs3NCw0NCBAQAogICAvKioKICAgICogRGVzdHJveWVzIHRoZSBzb2NrZXQgb2JqZWN0LCBjbG9zaW5nIGl0IGlmIG5lY2Vzc2FyeS4KICAgICovCi0gIHZpcnR1YWwgflRTb2NrZXQoKTsKKyAgflRTb2NrZXQoKSBvdmVycmlkZTsKIAogICAvKioKICAgICogV2hldGhlciB0aGUgc29ja2V0IGlzIGFsaXZlLgogICAgKgogICAgKiBAcmV0dXJuIElzIHRoZSBzb2NrZXQgYWxpdmU/CiAgICAqLwotICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCk7CisgIGJvb2wgaXNPcGVuKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgLyoqCi0gICAqIENhbGxzIHNlbGVjdCBvbiB0aGUgc29ja2V0IHRvIHNlZSBpZiB0aGVyZSBpcyBtb3JlIGRhdGEgYXZhaWxhYmxlLgorICAgKiBDaGVja3Mgd2hldGhlciB0aGVyZSBpcyBtb3JlIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBzb2NrZXQgdG8gcmVhZC4KKyAgICoKKyAgICogVGhpcyBjYWxsIGJsb2NrcyB1bnRpbCBhdCBsZWFzdCBvbmUgYnl0ZSBpcyBhdmFpbGFibGUgb3IgdGhlIHNvY2tldCBpcyBjbG9zZWQuCiAgICAqLwotICB2aXJ0dWFsIGJvb2wgcGVlaygpOworICBib29sIHBlZWsoKSBvdmVycmlkZTsKIAogICAvKioKICAgICogQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIFVOSVggc29ja2V0LgogICAgKgogICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgdGhlIHNvY2tldCBjb3VsZCBub3QgY29ubmVjdAogICAgKi8KLSAgdmlydHVhbCB2b2lkIG9wZW4oKTsKKyAgdm9pZCBvcGVuKCkgb3ZlcnJpZGU7CiAKICAgLyoqCiAgICAqIFNodXRzIGRvd24gY29tbXVuaWNhdGlvbnMgb24gdGhlIHNvY2tldC4KICAgICovCi0gIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgLyoqCisgICAqIERldGVybWluZXMgd2hldGhlciB0aGVyZSBpcyBwZW5kaW5nIGRhdGEgdG8gcmVhZCBvciBub3QuCisgICAqCisgICAqIFRoaXMgY2FsbCBkb2VzIG5vdCBibG9jay4KKyAgICogXHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIG9mIHR5cGVzOgorICAgKiAgICAgICAgICAgTk9UX09QRU4gbWVhbnMgdGhlIHNvY2tldCBoYXMgYmVlbiBjbG9zZWQKKyAgICogICAgICAgICAgIFVOS05PV04gbWVhbnMgc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuZWQKKyAgICogXHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBwZW5kaW5nIGRhdGEgdG8gcmVhZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAqLworICB2aXJ0dWFsIGJvb2wgaGFzUGVuZGluZ0RhdGFUb1JlYWQoKTsKIAogICAvKioKICAgICogUmVhZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzb2NrZXQuCkBAIC0xMjAsNyArMTMzLDcgQEAKICAgLyoqCiAgICAqIFdyaXRlcyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQuICBEb2VzIHNpbmdsZSBzZW5kKCkgYW5kIHJldHVybnMgcmVzdWx0LgogICAgKi8KLSAgdWludDMyX3Qgd3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAKICAgLyoqCiAgICAqIEdldCB0aGUgaG9zdCB0aGF0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCkBAIC0xOTUsMjIgKzIwOCwyMiBAQAogICAvKioKICAgICogR2V0IHNvY2tldCBpbmZvcm1hdGlvbiBmb3JtYXR0ZWQgYXMgYSBzdHJpbmcgPEhvc3Q6IHggUG9ydDogeD4KICAgICovCi0gIHN0ZDo6c3RyaW5nIGdldFNvY2tldEluZm8oKTsKKyAgc3RkOjpzdHJpbmcgZ2V0U29ja2V0SW5mbygpIGNvbnN0OwogCiAgIC8qKgogICAgKiBSZXR1cm5zIHRoZSBETlMgbmFtZSBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAogICAgKi8KLSAgc3RkOjpzdHJpbmcgZ2V0UGVlckhvc3QoKTsKKyAgc3RkOjpzdHJpbmcgZ2V0UGVlckhvc3QoKSBjb25zdDsKIAogICAvKioKICAgICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAogICAgKi8KLSAgc3RkOjpzdHJpbmcgZ2V0UGVlckFkZHJlc3MoKTsKKyAgc3RkOjpzdHJpbmcgZ2V0UGVlckFkZHJlc3MoKSBjb25zdDsKIAogICAvKioKICAgICogUmV0dXJucyB0aGUgcG9ydCBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAogICAgKiovCi0gIGludCBnZXRQZWVyUG9ydCgpOworICBpbnQgZ2V0UGVlclBvcnQoKSBjb25zdDsKIAogICAvKioKICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yLgpAQCAtMjQ2LDcgKzI1OSw3IEBACiAgICAqCiAgICAqIEByZXR1cm4gc3RyaW5nIHBlZXIgaG9zdCBpZGVudGlmaWVyIGFuZCBwb3J0CiAgICAqLwotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpOworICBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKSBjb25zdCBvdmVycmlkZTsKIAogICAvKioKICAgICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIHNvY2tldCBmcm9tIGZpbGUgZGVzY3JpcHRvci4KQEAgLTI1Nyw3ICsyNzAsNyBAQAogICAgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gZmlsZSBkZXNjcmlwdG9yIHRoYXQKICAgICogY2FuIGJlIGludGVycnVwdGVkIHNhZmVseS4KICAgICovCi0gIFRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIGJvb3N0OjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgVFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKIAogICAvKioKICAgICogU2V0IGEgY2FjaGUgb2YgdGhlIHBlZXIgYWRkcmVzcyAodXNlZCB3aGVuIHRyaXZpYWxseSBhdmFpbGFibGU6IGUuZy4KQEAgLTI3MiwxNSArMjg1LDYgQEAKICAgLyoqIEhvc3QgdG8gY29ubmVjdCB0byAqLwogICBzdGQ6OnN0cmluZyBob3N0XzsKIAotICAvKiogUGVlciBob3N0bmFtZSAqLwotICBzdGQ6OnN0cmluZyBwZWVySG9zdF87Ci0KLSAgLyoqIFBlZXIgYWRkcmVzcyAqLwotICBzdGQ6OnN0cmluZyBwZWVyQWRkcmVzc187Ci0KLSAgLyoqIFBlZXIgcG9ydCAqLwotICBpbnQgcGVlclBvcnRfOwotCiAgIC8qKiBQb3J0IG51bWJlciB0byBjb25uZWN0IG9uICovCiAgIGludCBwb3J0XzsKIApAQCAtMjkwLDExICsyOTQsMjAgQEAKICAgLyoqIFVuZGVybHlpbmcgc29ja2V0IGhhbmRsZSAqLwogICBUSFJJRlRfU09DS0VUIHNvY2tldF87CiAKKyAgLyoqIFBlZXIgaG9zdG5hbWUgKi8KKyAgbXV0YWJsZSBzdGQ6OnN0cmluZyBwZWVySG9zdF87CisKKyAgLyoqIFBlZXIgYWRkcmVzcyAqLworICBtdXRhYmxlIHN0ZDo6c3RyaW5nIHBlZXJBZGRyZXNzXzsKKworICAvKiogUGVlciBwb3J0ICovCisgIG11dGFibGUgaW50IHBlZXJQb3J0XzsKKwogICAvKioKICAgICogQSBzaGFyZWQgc29ja2V0IHBvaW50ZXIgdGhhdCB3aWxsIGludGVycnVwdCBhIGJsb2NraW5nIHJlYWQgaWYgZGF0YQogICAgKiBiZWNvbWVzIGF2YWlsYWJsZSBvbiBpdAogICAgKi8KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXJfOwogCiAgIC8qKiBDb25uZWN0IHRpbWVvdXQgaW4gbXMgKi8KICAgaW50IGNvbm5UaW1lb3V0XzsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAKaW5kZXggY2NhYjI1OC4uYjZlNzlkMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAKQEAgLTIxLDE2ICsyMSwyMiBAQAogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDE3MDNMCisjaW5jbHVkZSA8cmFuZG9tPgorI2VuZGlmCiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmg+CiAKK3VzaW5nIHN0ZDo6cGFpcjsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKIC8qKgogICogVFNvY2tldFBvb2xTZXJ2ZXIgaW1wbGVtZW50YXRpb24KQEAgLTg5LDggKzk1LDggQEAKICAgICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKICAgICByYW5kb21pemVfKHRydWUpLAogICAgIGFsd2F5c1RyeUxhc3RfKHRydWUpIHsKLSAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNlcnZlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICBhZGRTZXJ2ZXIoc2VydmVyc1tpXS5maXJzdCwgc2VydmVyc1tpXS5zZWNvbmQpOworICBmb3IgKGNvbnN0IGF1dG8gJiBzZXJ2ZXIgOiBzZXJ2ZXJzKSB7CisgICAgYWRkU2VydmVyKHNlcnZlci5maXJzdCwgc2VydmVyLnNlY29uZCk7CiAgIH0KIH0KIApAQCAtMTI0LDcgKzEzMCw3IEBACiB9CiAKIHZvaWQgVFNvY2tldFBvb2w6OmFkZFNlcnZlcihjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KSB7Ci0gIHNlcnZlcnNfLnB1c2hfYmFjayhzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPihuZXcgVFNvY2tldFBvb2xTZXJ2ZXIoaG9zdCwgcG9ydCkpKTsKKyAgc2VydmVyc18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8VFNvY2tldFBvb2xTZXJ2ZXI+KGhvc3QsIHBvcnQpKTsKIH0KIAogdm9pZCBUU29ja2V0UG9vbDo6YWRkU2VydmVyKHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpIHsKQEAgLTE4Niw3ICsxOTIsMTMgQEAKICAgfQogCiAgIGlmIChyYW5kb21pemVfICYmIG51bVNlcnZlcnMgPiAxKSB7Ci0gICAgcmFuZG9tX3NodWZmbGUoc2VydmVyc18uYmVnaW4oKSwgc2VydmVyc18uZW5kKCkpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTcwM0wKKyAgICBzdGQ6OnJhbmRvbV9kZXZpY2Ugcm5nOworICAgIHN0ZDo6bXQxOTkzNyB1cm5nKHJuZygpKTsKKyAgICBzdGQ6OnNodWZmbGUoc2VydmVyc18uYmVnaW4oKSwgc2VydmVyc18uZW5kKCksIHVybmcpOworI2Vsc2UKKyAgICBzdGQ6OnJhbmRvbV9zaHVmZmxlKHNlcnZlcnNfLmJlZ2luKCksIHNlcnZlcnNfLmVuZCgpKTsKKyNlbmRpZgogICB9CiAKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TZXJ2ZXJzOyArK2kpIHsKQEAgLTIwNSw3ICsyMTcsNyBAQAogCiAgICAgaWYgKHNlcnZlci0+bGFzdEZhaWxUaW1lXyA+IDApIHsKICAgICAgIC8vIFRoZSBzZXJ2ZXIgd2FzIG1hcmtlZCBhcyBkb3duLCBzbyBjaGVjayBpZiBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCB0byByZXRyeQotICAgICAgdGltZV90IGVsYXBzZWRUaW1lID0gdGltZShOVUxMKSAtIHNlcnZlci0+bGFzdEZhaWxUaW1lXzsKKyAgICAgIHRpbWVfdCBlbGFwc2VkVGltZSA9IHRpbWUobnVsbHB0cikgLSBzZXJ2ZXItPmxhc3RGYWlsVGltZV87CiAgICAgICBpZiAoZWxhcHNlZFRpbWUgPiByZXRyeUludGVydmFsXykgewogICAgICAgICByZXRyeUludGVydmFsUGFzc2VkID0gdHJ1ZTsKICAgICAgIH0KQEAgLTIxNSw3ICsyMjcsNyBAQAogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1SZXRyaWVzXzsgKytqKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgVFNvY2tldDo6b3BlbigpOwotICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoY29uc3QgVEV4Y2VwdGlvbiAmZSkgewogICAgICAgICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldFBvb2w6Om9wZW4gZmFpbGVkICIgKyBnZXRTb2NrZXRJbmZvKCkgKyAiOiAiICsgZS53aGF0KCk7CiAgICAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKICAgICAgICAgICBzb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOwpAQCAtMjM0LDcgKzI0Niw3IEBACiAgICAgICBpZiAoc2VydmVyLT5jb25zZWN1dGl2ZUZhaWx1cmVzXyA+IG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKSB7CiAgICAgICAgIC8vIE1hcmsgc2VydmVyIGFzIGRvd24KICAgICAgICAgc2VydmVyLT5jb25zZWN1dGl2ZUZhaWx1cmVzXyA9IDA7Ci0gICAgICAgIHNlcnZlci0+bGFzdEZhaWxUaW1lXyA9IHRpbWUoTlVMTCk7CisgICAgICAgIHNlcnZlci0+bGFzdEZhaWxUaW1lXyA9IHRpbWUobnVsbHB0cik7CiAgICAgICB9CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmgKaW5kZXggNzhmMGViZi4uOTdhMmI5MCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaApAQCAtOTIsNyArOTIsNyBAQAogICAgKgogICAgKiBAcGFyYW0gc2VydmVycyBsaXN0IG9mIFRTb2NrZXRQb29sU2VydmVycwogICAgKi8KLSAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOworICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOwogCiAgIC8qKgogICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgpAQCAtMTA1LDcgKzEwNSw3IEBACiAgIC8qKgogICAgKiBEZXN0cm95ZXMgdGhlIHNvY2tldCBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgogICAgKi8KLSAgdmlydHVhbCB+VFNvY2tldFBvb2woKTsKKyAgflRTb2NrZXRQb29sKCkgb3ZlcnJpZGU7CiAKICAgLyoqCiAgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbApAQCAtMTE1LDE3ICsxMTUsMTcgQEAKICAgLyoqCiAgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAogICAgKi8KLSAgdm9pZCBhZGRTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpOworICB2b2lkIGFkZFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpOwogCiAgIC8qKgogICAgKiBTZXQgbGlzdCBvZiBzZXJ2ZXJzIGluIHRoaXMgcG9vbAogICAgKi8KLSAgdm9pZCBzZXRTZXJ2ZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKTsKKyAgdm9pZCBzZXRTZXJ2ZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CiAKICAgLyoqCiAgICAqIEdldCBsaXN0IG9mIHNlcnZlcnMgaW4gdGhpcyBwb29sCiAgICAqLwotICB2b2lkIGdldFNlcnZlcnMoc3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOworICB2b2lkIGdldFNlcnZlcnMoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKTsKIAogICAvKioKICAgICogU2V0cyBob3cgbWFueSB0aW1lcyB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBpbiB0aGUgY29ubmVjdCBmdW5jdGlvbi4KQEAgLTE1NSwyMSArMTU1LDIxIEBACiAgIC8qKgogICAgKiBDcmVhdGVzIGFuZCBvcGVucyB0aGUgVU5JWCBzb2NrZXQuCiAgICAqLwotICB2b2lkIG9wZW4oKTsKKyAgdm9pZCBvcGVuKCkgb3ZlcnJpZGU7CiAKICAgLyoKICAgICogQ2xvc2VzIHRoZSBVTklYIHNvY2tldAogICAgKi8KLSAgdm9pZCBjbG9zZSgpOworICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGU7CiAKIHByb3RlY3RlZDoKLSAgdm9pZCBzZXRDdXJyZW50U2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiYgc2VydmVyKTsKKyAgdm9pZCBzZXRDdXJyZW50U2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcik7CiAKICAgLyoqIExpc3Qgb2Ygc2VydmVycyB0byBjb25uZWN0IHRvICovCi0gIHN0ZDo6dmVjdG9yPGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+IHNlcnZlcnNfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4gc2VydmVyc187CiAKICAgLyoqIEN1cnJlbnQgc2VydmVyICovCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiBjdXJyZW50U2VydmVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiBjdXJyZW50U2VydmVyXzsKIAogICAvKiogSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgZWFjaCBob3N0IGluIGNvbm5lY3QgKi8KICAgaW50IG51bVJldHJpZXNfOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaAppbmRleCBkMDZiMGY4Li44OTFiZmUxIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaApAQCAtMjEsOCArMjEsOCBAQAogI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUX0hfIDEKIAogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKQEAgLTU4LDEyICs1OCwxMiBAQAogICAvKioKICAgICogVmlydHVhbCBkZWNvbnN0cnVjdG9yLgogICAgKi8KLSAgdmlydHVhbCB+VFRyYW5zcG9ydCgpIHt9CisgIHZpcnR1YWwgflRUcmFuc3BvcnQoKSA9IGRlZmF1bHQ7CiAKICAgLyoqCiAgICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KICAgICovCi0gIHZpcnR1YWwgYm9vbCBpc09wZW4oKSB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAogICAvKioKICAgICogVGVzdHMgd2hldGhlciB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gcmVhZCBvciBpZiB0aGUgcmVtb3RlIHNpZGUgaXMKQEAgLTIwOSw3ICsyMDksNyBAQAogICAgIFRfVklSVFVBTF9DQUxMKCk7CiAgICAgcmV0dXJuIGJvcnJvd192aXJ0KGJ1ZiwgbGVuKTsKICAgfQotICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd192aXJ0KHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QqIC8qIGxlbiAqLykgeyByZXR1cm4gTlVMTDsgfQorICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd192aXJ0KHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QqIC8qIGxlbiAqLykgeyByZXR1cm4gbnVsbHB0cjsgfQogCiAgIC8qKgogICAgKiBSZW1vdmUgbGVuIGJ5dGVzIGZyb20gdGhlIHRyYW5zcG9ydC4gIFRoaXMgc2hvdWxkIGFsd2F5cyBmb2xsb3cgYSBib3Jyb3cKQEAgLTIzNiwxMyArMjM2LDEzIEBACiAgICAqCiAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgdXNlZCBpbiBhIGxvZyBtZXNzYWdlIGZvciBleGFtcGxlCiAgICAqLwotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpIHsgcmV0dXJuICJVbmtub3duIjsgfQorICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpIGNvbnN0IHsgcmV0dXJuICJVbmtub3duIjsgfQogCiBwcm90ZWN0ZWQ6CiAgIC8qKgogICAgKiBTaW1wbGUgY29uc3RydWN0b3IuCiAgICAqLwotICBUVHJhbnNwb3J0KCkge30KKyAgVFRyYW5zcG9ydCgpID0gZGVmYXVsdDsKIH07CiAKIC8qKgpAQCAtMjUzLDE0ICsyNTMsMTQgQEAKICAqLwogY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkgewogcHVibGljOgotICBUVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisgIFRUcmFuc3BvcnRGYWN0b3J5KCkgPSBkZWZhdWx0OwogCi0gIHZpcnR1YWwgflRUcmFuc3BvcnRGYWN0b3J5KCkge30KKyAgdmlydHVhbCB+VFRyYW5zcG9ydEZhY3RvcnkoKSA9IGRlZmF1bHQ7CiAKICAgLyoqCiAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLCBqdXN0IHJldHVybnMgdGhlIHRyYW5zcG9ydCBnaXZlbi4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKICAgICByZXR1cm4gdHJhbnM7CiAgIH0KIH07CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcAppbmRleCA2MTJlN2I3Li5hNTI3MzE3IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAKQEAgLTE4LDE5ICsxOCwxNyBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgogI2luY2x1ZGUgPGNzdHJpbmc+CiAKICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCiB1c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGJvb3N0OjpsZXhpY2FsX2Nhc3Q7CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAotY29uc3QgY2hhciogVFRyYW5zcG9ydEV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IHRocm93KCkgeworY29uc3QgY2hhciogVFRyYW5zcG9ydEV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKICAgICBzd2l0Y2ggKHR5cGVfKSB7CiAgICAgY2FzZSBVTktOT1dOOgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaAppbmRleCA4M2U4NzZhLi4zOGI3NTIxIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaApAQCAtMjAsNiArMjAsNyBAQAogI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JURVhDRVBUSU9OX0hfCiAjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRFWENFUFRJT05fSF8gMQogCisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9jb252ZXJzaW9uL2Nhc3QuaHBwPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CiAKQEAgLTY0LDcgKzY1LDcgQEAKICAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpCiAgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlICsgIjogIiArIFRPdXRwdXQ6OnN0cmVycm9yX3MoZXJybm9fY29weSkpLCB0eXBlXyh0eXBlKSB7fQogCi0gIHZpcnR1YWwgflRUcmFuc3BvcnRFeGNlcHRpb24oKSB0aHJvdygpIHt9CisgIH5UVHJhbnNwb3J0RXhjZXB0aW9uKCkgbm9leGNlcHQgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgIC8qKgogICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgpAQCAtNzIsOSArNzMsOSBAQAogICAgKgogICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKICAgICovCi0gIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIHR5cGVfOyB9CisgIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiB0eXBlXzsgfQogCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCk7CisgIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdCBvdmVycmlkZTsKIAogcHJvdGVjdGVkOgogICAvKiogSnVzdCBsaWtlIHN0cmVycm9yX3IgYnV0IHJldHVybnMgYSBDKysgc3RyaW5nIG9iamVjdC4gKi8KQEAgLTgzLDYgKzg0LDIxIEBACiAgIC8qKiBFcnJvciBjb2RlICovCiAgIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGVfOwogfTsKKworLyoqCisgKiBMZWdhY3kgY29kZSBpbiB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIGhhdmUgb3ZlcmZsb3cgaXNzdWVzCisgKiB0aGF0IG5lZWQgdG8gYmUgZW5mb3JjZWQuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gVG8gc2FmZV9udW1lcmljX2Nhc3QoRnJvbSBpKSB7CisgIHRyeSB7CisgICAgcmV0dXJuIGJvb3N0OjpudW1lcmljX2Nhc3Q8VG8+KGkpOworICB9CisgIGNhdGNoIChjb25zdCBzdGQ6OmJhZF9jYXN0JiBiYykgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYy53aGF0KCkpOworICB9Cit9CisKIH0KIH0KIH0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwCmluZGV4IDBmMjRjOTUuLjY5MzcyZjMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAKQEAgLTQxLDcgKzQxLDExIEBACiAgICAgLy8gRG91YmxlIHRoZSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBpZiBpdCBpcyBmdWxsCiAgICAgaWYgKHJMZW5fID09IHJCdWZTaXplXykgewogICAgICAgckJ1ZlNpemVfICo9IDI7Ci0gICAgICByQnVmXyA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MockJ1Zl8sIHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisgICAgICBhdXRvICp0bXBCdWYgPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHJCdWZfLCBzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOworICAgICAgaWYgKHRtcEJ1ZiA9PSBudWxscHRyKSB7CisgICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICAgIH0KKyAgICAgIHJCdWZfID0gdG1wQnVmOwogICAgIH0KIAogICAgIC8vIHRyeSB0byBmaWxsIHVwIHRoZSBidWZmZXIKQEAgLTczLDcgKzc3LDEyIEBACiAgICAgd2hpbGUgKChsZW4gKyB3TGVuXykgPj0gbmV3QnVmU2l6ZSkgewogICAgICAgbmV3QnVmU2l6ZSAqPSAyOwogICAgIH0KLSAgICB3QnVmXyA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2Mod0J1Zl8sIHNpemVvZih1aW50OF90KSAqIG5ld0J1ZlNpemUpOworICAgIGF1dG8gKnRtcEJ1Zj0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyh3QnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogbmV3QnVmU2l6ZSk7CisgICAgaWYgKHRtcEJ1ZiA9PSBudWxscHRyKSB7CisgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgIH0KKyAgICB3QnVmXyA9IHRtcEJ1ZjsKKwogICAgIHdCdWZTaXplXyA9IG5ld0J1ZlNpemU7CiAgIH0KIApAQCAtOTQsMTUgKzEwMywxNCBAQAogfQogCiBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKICAgOiBUUGlwZWRUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zKSwgc3JjVHJhbnNfKHNyY1RyYW5zKSB7CiB9CiAKLVRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6On5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCkgewotfQorVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6flRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoKSA9IGRlZmF1bHQ7CiAKLWJvb2wgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6aXNPcGVuKCkgeworYm9vbCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0Ojppc09wZW4oKSBjb25zdCB7CiAgIHJldHVybiBUUGlwZWRUcmFuc3BvcnQ6OmlzT3BlbigpOwogfQogCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaAppbmRleCBjMjIxODM2Li4yOGM5M2QyIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmgKQEAgLTQyLDEzICs0MiwxMyBAQAogICovCiBjbGFzcyBUTnVsbFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUTnVsbFRyYW5zcG9ydD4gewogcHVibGljOgotICBUTnVsbFRyYW5zcG9ydCgpIHt9CisgIFROdWxsVHJhbnNwb3J0KCkgPSBkZWZhdWx0OwogCi0gIH5UTnVsbFRyYW5zcG9ydCgpIHt9CisgIH5UTnVsbFRyYW5zcG9ydCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAotICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBpc09wZW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKLSAgdm9pZCBvcGVuKCkge30KKyAgdm9pZCBvcGVuKCkgb3ZlcnJpZGUge30KIAogICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QgLyogbGVuICovKSB7IHJldHVybjsgfQogfTsKQEAgLTYzLDcgKzYzLDcgQEAKICAqLwogY2xhc3MgVFBpcGVkVHJhbnNwb3J0IDogdmlydHVhbCBwdWJsaWMgVFRyYW5zcG9ydCB7CiBwdWJsaWM6Ci0gIFRQaXBlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpCisgIFRQaXBlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKICAgICA6IHNyY1RyYW5zXyhzcmNUcmFucyksCiAgICAgICBkc3RUcmFuc18oZHN0VHJhbnMpLAogICAgICAgckJ1ZlNpemVfKDUxMiksCkBAIC03NywxNyArNzcsMTcgQEAKICAgICBwaXBlT25Xcml0ZV8gPSBmYWxzZTsKIAogICAgIHJCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6bWFsbG9jKHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7Ci0gICAgaWYgKHJCdWZfID09IE5VTEwpIHsKKyAgICBpZiAockJ1Zl8gPT0gbnVsbHB0cikgewogICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKICAgICB9CiAgICAgd0J1Zl8gPSAodWludDhfdCopc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogd0J1ZlNpemVfKTsKLSAgICBpZiAod0J1Zl8gPT0gTlVMTCkgeworICAgIGlmICh3QnVmXyA9PSBudWxscHRyKSB7CiAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICAgIH0KICAgfQogCi0gIFRQaXBlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zLAorICBUUGlwZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zLAorICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zLAogICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3opCiAgICAgOiBzcmNUcmFuc18oc3JjVHJhbnMpLAogICAgICAgZHN0VHJhbnNfKGRzdFRyYW5zKSwKQEAgLTk4LDI4ICs5OCwzMiBAQAogICAgICAgd0xlbl8oMCkgewogCiAgICAgckJ1Zl8gPSAodWludDhfdCopc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKLSAgICBpZiAockJ1Zl8gPT0gTlVMTCkgeworICAgIGlmIChyQnVmXyA9PSBudWxscHRyKSB7CiAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICAgIH0KICAgICB3QnVmXyA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiB3QnVmU2l6ZV8pOwotICAgIGlmICh3QnVmXyA9PSBOVUxMKSB7CisgICAgaWYgKHdCdWZfID09IG51bGxwdHIpIHsKICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CiAgICAgfQogICB9CiAKLSAgflRQaXBlZFRyYW5zcG9ydCgpIHsKKyAgflRQaXBlZFRyYW5zcG9ydCgpIG92ZXJyaWRlIHsKICAgICBzdGQ6OmZyZWUockJ1Zl8pOwogICAgIHN0ZDo6ZnJlZSh3QnVmXyk7CiAgIH0KIAotICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHNyY1RyYW5zXy0+aXNPcGVuKCk7IH0KKyAgYm9vbCBpc09wZW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBzcmNUcmFuc18tPmlzT3BlbigpOyB9CiAKLSAgYm9vbCBwZWVrKCkgeworICBib29sIHBlZWsoKSBvdmVycmlkZSB7CiAgICAgaWYgKHJQb3NfID49IHJMZW5fKSB7CiAgICAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKICAgICAgIGlmIChyTGVuXyA9PSByQnVmU2l6ZV8pIHsKICAgICAgICAgckJ1ZlNpemVfICo9IDI7Ci0gICAgICAgIHJCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKKyAgICAgICAgYXV0byAqIHRtcEJ1ZiA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MockJ1Zl8sIHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisJaWYgKHRtcEJ1ZiA9PSBudWxscHRyKSB7CisJICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworCX0KKwlyQnVmXyA9IHRtcEJ1ZjsKICAgICAgIH0KIAogICAgICAgLy8gdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlcgpAQCAtMTI4LDkgKzEzMiw5IEBACiAgICAgcmV0dXJuIChyTGVuXyA+IHJQb3NfKTsKICAgfQogCi0gIHZvaWQgb3BlbigpIHsgc3JjVHJhbnNfLT5vcGVuKCk7IH0KKyAgdm9pZCBvcGVuKCkgb3ZlcnJpZGUgeyBzcmNUcmFuc18tPm9wZW4oKTsgfQogCi0gIHZvaWQgY2xvc2UoKSB7IHNyY1RyYW5zXy0+Y2xvc2UoKTsgfQorICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGUgeyBzcmNUcmFuc18tPmNsb3NlKCk7IH0KIAogICB2b2lkIHNldFBpcGVPblJlYWQoYm9vbCBwaXBlVmFsKSB7IHBpcGVPblJlYWRfID0gcGlwZVZhbDsgfQogCkBAIC0xMzgsNyArMTQyLDcgQEAKIAogICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIAotICB1aW50MzJfdCByZWFkRW5kKCkgeworICB1aW50MzJfdCByZWFkRW5kKCkgb3ZlcnJpZGUgewogCiAgICAgaWYgKHBpcGVPblJlYWRfKSB7CiAgICAgICBkc3RUcmFuc18tPndyaXRlKHJCdWZfLCByUG9zXyk7CkBAIC0xNjAsNyArMTY0LDcgQEAKIAogICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIAotICB1aW50MzJfdCB3cml0ZUVuZCgpIHsKKyAgdWludDMyX3Qgd3JpdGVFbmQoKSBvdmVycmlkZSB7CiAgICAgaWYgKHBpcGVPbldyaXRlXykgewogICAgICAgZHN0VHJhbnNfLT53cml0ZSh3QnVmXywgd0xlbl8pOwogICAgICAgZHN0VHJhbnNfLT5mbHVzaCgpOwpAQCAtMTY4LDIxICsxNzIsMjEgQEAKICAgICByZXR1cm4gd0xlbl87CiAgIH0KIAotICB2b2lkIGZsdXNoKCk7CisgIHZvaWQgZmx1c2goKSBvdmVycmlkZTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUYXJnZXRUcmFuc3BvcnQoKSB7IHJldHVybiBkc3RUcmFuc187IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRhcmdldFRyYW5zcG9ydCgpIHsgcmV0dXJuIGRzdFRyYW5zXzsgfQogCiAgIC8qCiAgICAqIE92ZXJyaWRlIFRUcmFuc3BvcnQgKl92aXJ0KCkgZnVuY3Rpb25zIHRvIGludm9rZSBvdXIgaW1wbGVtZW50YXRpb25zLgogICAgKiBXZSBjYW5ub3QgdXNlIFRWaXJ0dWFsVHJhbnNwb3J0IHRvIHByb3ZpZGUgdGhlc2UsIHNpbmNlIHdlIG5lZWQgdG8gaW5oZXJpdAogICAgKiB2aXJ0dWFsbHkgZnJvbSBUVHJhbnNwb3J0LgogICAgKi8KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOyB9Ci0gIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHRoaXMtPndyaXRlKGJ1ZiwgbGVuKTsgfQorICB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIG92ZXJyaWRlIHsgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOyB9CisgIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgb3ZlcnJpZGUgeyB0aGlzLT53cml0ZShidWYsIGxlbik7IH0KIAogcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFuc187Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zXzsKIAogICB1aW50OF90KiByQnVmXzsKICAgdWludDMyX3QgckJ1ZlNpemVfOwpAQCAtMjAzLDIxICsyMDcsMjEgQEAKICAqLwogY2xhc3MgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CiBwdWJsaWM6Ci0gIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQotICBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSB7CisgIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoKSA9IGRlZmF1bHQ7CisgIFRQaXBlZFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSB7CiAgICAgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChkc3RUcmFucyk7CiAgIH0KLSAgdmlydHVhbCB+VFBpcGVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisgIH5UUGlwZWRUcmFuc3BvcnRGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgIC8qKgogICAgKiBXcmFwcyB0aGUgYmFzZSB0cmFuc3BvcnQgaW50byBhIHBpcGVkIHRyYW5zcG9ydC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUUGlwZWRUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgb3ZlcnJpZGUgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRQaXBlZFRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnNfKSk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykgewotICAgIGlmIChkc3RUcmFuc18uZ2V0KCkgPT0gTlVMTCkgeworICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIHsKKyAgICBpZiAoZHN0VHJhbnNfLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgIGRzdFRyYW5zXyA9IGRzdFRyYW5zOwogICAgIH0gZWxzZSB7CiAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUYXJnZXQgdHJhbnNwb3J0IGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKQEAgLTIyNSw3ICsyMjksNyBAQAogICB9CiAKIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnNfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnNfOwogfTsKIAogLyoqCkBAIC0yMzYsNDQgKzI0MCw0NCBAQAogICovCiBjbGFzcyBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0IDogcHVibGljIFRQaXBlZFRyYW5zcG9ydCwgcHVibGljIFRGaWxlUmVhZGVyVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpOworICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKTsKIAotICB+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgpOworICB+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgpIG92ZXJyaWRlOwogCiAgIC8vIFRUcmFuc3BvcnQgZnVuY3Rpb25zCi0gIGJvb2wgaXNPcGVuKCk7Ci0gIGJvb2wgcGVlaygpOwotICB2b2lkIG9wZW4oKTsKLSAgdm9pZCBjbG9zZSgpOworICBib29sIGlzT3BlbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIHBlZWsoKSBvdmVycmlkZTsKKyAgdm9pZCBvcGVuKCkgb3ZlcnJpZGU7CisgIHZvaWQgY2xvc2UoKSBvdmVycmlkZTsKICAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotICB1aW50MzJfdCByZWFkRW5kKCk7CisgIHVpbnQzMl90IHJlYWRFbmQoKSBvdmVycmlkZTsKICAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHVpbnQzMl90IHdyaXRlRW5kKCk7Ci0gIHZvaWQgZmx1c2goKTsKKyAgdWludDMyX3Qgd3JpdGVFbmQoKSBvdmVycmlkZTsKKyAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlOwogCiAgIC8vIFRGaWxlUmVhZGVyVHJhbnNwb3J0IGZ1bmN0aW9ucwotICBpbnQzMl90IGdldFJlYWRUaW1lb3V0KCk7Ci0gIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCk7Ci0gIHVpbnQzMl90IGdldE51bUNodW5rcygpOwotICB1aW50MzJfdCBnZXRDdXJDaHVuaygpOwotICB2b2lkIHNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspOwotICB2b2lkIHNlZWtUb0VuZCgpOworICBpbnQzMl90IGdldFJlYWRUaW1lb3V0KCkgb3ZlcnJpZGU7CisgIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCkgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE51bUNodW5rcygpIG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRDdXJDaHVuaygpIG92ZXJyaWRlOworICB2b2lkIHNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspIG92ZXJyaWRlOworICB2b2lkIHNlZWtUb0VuZCgpIG92ZXJyaWRlOwogCiAgIC8qCiAgICAqIE92ZXJyaWRlIFRUcmFuc3BvcnQgKl92aXJ0KCkgZnVuY3Rpb25zIHRvIGludm9rZSBvdXIgaW1wbGVtZW50YXRpb25zLgogICAgKiBXZSBjYW5ub3QgdXNlIFRWaXJ0dWFsVHJhbnNwb3J0IHRvIHByb3ZpZGUgdGhlc2UsIHNpbmNlIHdlIG5lZWQgdG8gaW5oZXJpdAogICAgKiB2aXJ0dWFsbHkgZnJvbSBUVHJhbnNwb3J0LgogICAgKi8KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOyB9Ci0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5yZWFkQWxsKGJ1ZiwgbGVuKTsgfQotICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyB0aGlzLT53cml0ZShidWYsIGxlbik7IH0KKyAgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSBvdmVycmlkZSB7IHJldHVybiB0aGlzLT5yZWFkKGJ1ZiwgbGVuKTsgfQorICB1aW50MzJfdCByZWFkQWxsX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIG92ZXJyaWRlIHsgcmV0dXJuIHRoaXMtPnJlYWRBbGwoYnVmLCBsZW4pOyB9CisgIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgb3ZlcnJpZGUgeyB0aGlzLT53cml0ZShidWYsIGxlbik7IH0KIAogcHJvdGVjdGVkOgogICAvLyBzaG91bGRuJ3QgYmUgdXNlZAogICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnNfOwogfTsKIAogLyoqCkBAIC0yODIsMjQgKzI4NiwyNCBAQAogICovCiBjbGFzcyBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5IHsKIHB1YmxpYzoKLSAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQotICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSA9IGRlZmF1bHQ7CisgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKICAgICA6IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZHN0VHJhbnMpIHt9Ci0gIHZpcnR1YWwgflRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KKyAgflRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBwRmlsZVJlYWRlclRyYW5zcG9ydAotICAgICAgICA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxURmlsZVJlYWRlclRyYW5zcG9ydD4oc3JjVHJhbnMpOwotICAgIGlmIChwRmlsZVJlYWRlclRyYW5zcG9ydC5nZXQoKSAhPSBOVUxMKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zKSBvdmVycmlkZSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBwRmlsZVJlYWRlclRyYW5zcG9ydAorICAgICAgICA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+KHNyY1RyYW5zKTsKKyAgICBpZiAocEZpbGVSZWFkZXJUcmFuc3BvcnQuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgcmV0dXJuIGdldEZpbGVSZWFkZXJUcmFuc3BvcnQocEZpbGVSZWFkZXJUcmFuc3BvcnQpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4oKTsKKyAgICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4oKTsKICAgICB9CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gZ2V0RmlsZVJlYWRlclRyYW5zcG9ydCgKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4oCisgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gZ2V0RmlsZVJlYWRlclRyYW5zcG9ydCgKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PigKICAgICAgICAgbmV3IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOwogICB9CiB9OwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oCmluZGV4IDBjYWNmNjEuLjBhMDQ4NTcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmgKQEAgLTU3LDcgKzU3LDcgQEAKICAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbikgeyB0aGlzLT5UVHJhbnNwb3J0Ojpjb25zdW1lX3ZpcnQobGVuKTsgfQogCiBwcm90ZWN0ZWQ6Ci0gIFRUcmFuc3BvcnREZWZhdWx0cygpIHt9CisgIFRUcmFuc3BvcnREZWZhdWx0cygpID0gZGVmYXVsdDsKIH07CiAKIC8qKgpAQCAtODQsMjMgKzg0LDIzIEBACiAgICAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgKl92aXJ0KCkgZnVuY3Rpb25zLCB0byBjYWxsIHRoZSBzdWJjbGFzcydzCiAgICAqIG5vbi12aXJ0dWFsIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9uLgogICAgKi8KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+cmVhZChidWYsIGxlbik7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRBbGxfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCByZWFkQWxsX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHJhbnNwb3J0Xyo+KHRoaXMpLT5yZWFkQWxsKGJ1ZiwgbGVuKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgb3ZlcnJpZGUgewogICAgIHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+d3JpdGUoYnVmLCBsZW4pOwogICB9CiAKLSAgdmlydHVhbCBjb25zdCB1aW50OF90KiBib3Jyb3dfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKKyAgY29uc3QgdWludDhfdCogYm9ycm93X3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+Ym9ycm93KGJ1ZiwgbGVuKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBjb25zdW1lX3ZpcnQodWludDMyX3QgbGVuKSB7IHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+Y29uc3VtZShsZW4pOyB9CisgIHZvaWQgY29uc3VtZV92aXJ0KHVpbnQzMl90IGxlbikgb3ZlcnJpZGUgeyBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyktPmNvbnN1bWUobGVuKTsgfQogCiAgIC8qCiAgICAqIFByb3ZpZGUgYSBkZWZhdWx0IHJlYWRBbGwoKSBpbXBsZW1lbnRhdGlvbiB0aGF0IGludm9rZXMKQEAgLTExMywxMiArMTEzLDEyIEBACiAgICAqIHRoZSBjb3JyZWN0IHBhcmVudCBpbXBsZW1lbnRhdGlvbiwgaWYgZGVzaXJlZC4KICAgICovCiAgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICBUcmFuc3BvcnRfKiB0cmFucyA9IHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKTsKKyAgICBhdXRvKiB0cmFucyA9IHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKTsKICAgICByZXR1cm4gOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpyZWFkQWxsKCp0cmFucywgYnVmLCBsZW4pOwogICB9CiAKIHByb3RlY3RlZDoKLSAgVFZpcnR1YWxUcmFuc3BvcnQoKSB7fQorICBUVmlydHVhbFRyYW5zcG9ydCgpID0gZGVmYXVsdDsKIAogICAvKgogICAgKiBUZW1wbGF0aXplZCBjb25zdHJ1Y3RvcnMsIHRvIGFsbG93IGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIFN1cGVyXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcAppbmRleCBmYjVjYzVkLi40MzcxOTBiIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcApAQCAtMTEwLDcgKzExMCw3IEBACiAgIGRlbGV0ZSB3c3RyZWFtXzsKIH0KIAotYm9vbCBUWmxpYlRyYW5zcG9ydDo6aXNPcGVuKCkgeworYm9vbCBUWmxpYlRyYW5zcG9ydDo6aXNPcGVuKCkgY29uc3QgewogICByZXR1cm4gKHJlYWRBdmFpbCgpID4gMCkgfHwgKHJzdHJlYW1fLT5hdmFpbF9pbiA+IDApIHx8IHRyYW5zcG9ydF8tPmlzT3BlbigpOwogfQogCkBAIC0xMzEsNyArMTMxLDcgQEAKIC8vIEluIHN0YW5kYWxvbmUgb2JqZWN0cywgd2Ugc2V0IGlucHV0X2VuZGVkXyB0byB0cnVlIHdoZW4gaW5mbGF0ZSByZXR1cm5zCiAvLyBaX1NUUkVBTV9FTkQuICBUaGlzIGFsbG93cyB0byBtYWtlIHN1cmUgdGhhdCBhIGNoZWNrc3VtIHdhcyB2ZXJpZmllZC4KIAotaW5saW5lIGludCBUWmxpYlRyYW5zcG9ydDo6cmVhZEF2YWlsKCkgeworaW5saW5lIGludCBUWmxpYlRyYW5zcG9ydDo6cmVhZEF2YWlsKCkgY29uc3QgewogICByZXR1cm4gdXJidWZfc2l6ZV8gLSByc3RyZWFtXy0+YXZhaWxfb3V0IC0gdXJwb3NfOwogfQogCkBAIC0yNTUsNiArMjU1LDE1IEBACiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgImZsdXNoKCkgY2FsbGVkIGFmdGVyIGZpbmlzaCgpIik7CiAgIH0KIAorICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXywgWl9CTE9DSyk7CisgIHV3cG9zXyA9IDA7CisKKyAgaWYod3N0cmVhbV8tPmF2YWlsX291dCA8IDYpeworICAgIHRyYW5zcG9ydF8tPndyaXRlKGN3YnVmXywgY3didWZfc2l6ZV8gLSB3c3RyZWFtXy0+YXZhaWxfb3V0KTsKKyAgICB3c3RyZWFtXy0+bmV4dF9vdXQgPSBjd2J1Zl87CisgICAgd3N0cmVhbV8tPmF2YWlsX291dCA9IGN3YnVmX3NpemVfOworICB9CisKICAgZmx1c2hUb1RyYW5zcG9ydChaX0ZVTExfRkxVU0gpOwogfQogCkBAIC0yODUsNyArMjk0LDcgQEAKICAgd3N0cmVhbV8tPmF2YWlsX2luID0gbGVuOwogCiAgIHdoaWxlICh0cnVlKSB7Ci0gICAgaWYgKGZsdXNoID09IFpfTk9fRkxVU0ggJiYgd3N0cmVhbV8tPmF2YWlsX2luID09IDApIHsKKyAgICBpZiAoKGZsdXNoID09IFpfTk9fRkxVU0ggfHwgZmx1c2ggPT0gWl9CTE9DSykgJiYgd3N0cmVhbV8tPmF2YWlsX2luID09IDApIHsKICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMzIyLDcgKzMzMSw3IEBACiAgICAgKmxlbiA9ICh1aW50MzJfdClyZWFkQXZhaWwoKTsKICAgICByZXR1cm4gdXJidWZfICsgdXJwb3NfOwogICB9Ci0gIHJldHVybiBOVUxMOworICByZXR1cm4gbnVsbHB0cjsKIH0KIAogdm9pZCBUWmxpYlRyYW5zcG9ydDo6Y29uc3VtZSh1aW50MzJfdCBsZW4pIHsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaAppbmRleCAxZTdiNWVjLi4yOWFmYWUwIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCkBAIC0yMCw5ICsyMCw5IEBACiAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RaTElCVFJBTlNQT1JUX0hfCiAjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RaTElCVFJBTlNQT1JUX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KICNpbmNsdWRlIDx6bGliLmg+CiAKIHN0cnVjdCB6X3N0cmVhbV9zOwpAQCAtMzYsOSArMzYsOSBAQAogICBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbihpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpCiAgICAgOiBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCBlcnJvck1lc3NhZ2Uoc3RhdHVzLCBtc2cpKSwKICAgICAgIHpsaWJfc3RhdHVzXyhzdGF0dXMpLAotICAgICAgemxpYl9tc2dfKG1zZyA9PSBOVUxMID8gIihudWxsKSIgOiBtc2cpIHt9CisgICAgICB6bGliX21zZ18obXNnID09IG51bGxwdHIgPyAiKG51bGwpIiA6IG1zZykge30KIAotICB2aXJ0dWFsIH5UWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbigpIHRocm93KCkge30KKyAgflRabGliVHJhbnNwb3J0RXhjZXB0aW9uKCkgbm9leGNlcHQgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgIGludCBnZXRabGliU3RhdHVzKCkgeyByZXR1cm4gemxpYl9zdGF0dXNfOyB9CiAgIHN0ZDo6c3RyaW5nIGdldFpsaWJNZXNzYWdlKCkgeyByZXR1cm4gemxpYl9tc2dfOyB9CkBAIC01MSw3ICs1MSw3IEBACiAgICAgICBydiArPSAiKG5vIG1lc3NhZ2UpIjsKICAgICB9CiAgICAgcnYgKz0gIiAoc3RhdHVzID0gIjsKLSAgICBydiArPSBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihzdGF0dXMpOworICAgIHJ2ICs9IHRvX3N0cmluZyhzdGF0dXMpOwogICAgIHJ2ICs9ICIpIjsKICAgICByZXR1cm4gcnY7CiAgIH0KQEAgLTc4LDcgKzc4LDcgQEAKICAgICogQHBhcmFtIGN3YnVmX3NpemUgICBDb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciB3cml0aW5nLgogICAgKiBAcGFyYW0gY29tcF9sZXZlbCAgIENvbXByZXNzaW9uIGxldmVsICgwPW5vbmVbZmFzdF0sIDY9ZGVmYXVsdCwgOT1tYXhbc2xvd10pLgogICAgKi8KLSAgVFpsaWJUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAorICBUWmxpYlRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICBpbnQgdXJidWZfc2l6ZSA9IERFRkFVTFRfVVJCVUZfU0laRSwKICAgICAgICAgICAgICAgICAgaW50IGNyYnVmX3NpemUgPSBERUZBVUxUX0NSQlVGX1NJWkUsCiAgICAgICAgICAgICAgICAgIGludCB1d2J1Zl9zaXplID0gREVGQVVMVF9VV0JVRl9TSVpFLApAQCAtOTMsMTkgKzkzLDE5IEBACiAgICAgICBjcmJ1Zl9zaXplXyhjcmJ1Zl9zaXplKSwKICAgICAgIHV3YnVmX3NpemVfKHV3YnVmX3NpemUpLAogICAgICAgY3didWZfc2l6ZV8oY3didWZfc2l6ZSksCi0gICAgICB1cmJ1Zl8oTlVMTCksCi0gICAgICBjcmJ1Zl8oTlVMTCksCi0gICAgICB1d2J1Zl8oTlVMTCksCi0gICAgICBjd2J1Zl8oTlVMTCksCi0gICAgICByc3RyZWFtXyhOVUxMKSwKLSAgICAgIHdzdHJlYW1fKE5VTEwpLAorICAgICAgdXJidWZfKG51bGxwdHIpLAorICAgICAgY3JidWZfKG51bGxwdHIpLAorICAgICAgdXdidWZfKG51bGxwdHIpLAorICAgICAgY3didWZfKG51bGxwdHIpLAorICAgICAgcnN0cmVhbV8obnVsbHB0ciksCisgICAgICB3c3RyZWFtXyhudWxscHRyKSwKICAgICAgIGNvbXBfbGV2ZWxfKGNvbXBfbGV2ZWwpIHsKICAgICBpZiAodXdidWZfc2l6ZV8gPCBNSU5fRElSRUNUX0RFRkxBVEVfU0laRSkgewogICAgICAgLy8gSGF2ZSB0byBjb3B5IHRoaXMgaW50byBhIGxvY2FsIGJlY2F1c2Ugb2YgYSBsaW5raW5nIGlzc3VlLgogICAgICAgaW50IG1pbmltdW0gPSBNSU5fRElSRUNUX0RFRkxBVEVfU0laRTsKICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUWkxpYlRyYW5zcG9ydDogdW5jb21wcmVzc2VkIHdyaXRlIGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KG1pbmltdW0pICsgIi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0b19zdHJpbmcobWluaW11bSkgKyAiLiIpOwogICAgIH0KIAogICAgIHRyeSB7CkBAIC0xMzYsMjAgKzEzNiwyMCBAQAogICAgKiB1bmZsdXNoZWQgZGF0YS4gIFlvdSBtdXN0IGV4cGxpY2l0bHkgY2FsbCBmbHVzaCgpIG9yIGZpbmlzaCgpIHRvIGVuc3VyZQogICAgKiB0aGF0IGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiBhbmQgZmx1c2hlZCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCiAgICAqLwotICB+VFpsaWJUcmFuc3BvcnQoKTsKKyAgflRabGliVHJhbnNwb3J0KCkgb3ZlcnJpZGU7CiAKLSAgYm9vbCBpc09wZW4oKTsKLSAgYm9vbCBwZWVrKCk7CisgIGJvb2wgaXNPcGVuKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgcGVlaygpIG92ZXJyaWRlOwogCi0gIHZvaWQgb3BlbigpIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CisgIHZvaWQgb3BlbigpIG92ZXJyaWRlIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CiAKLSAgdm9pZCBjbG9zZSgpIHsgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsgfQorICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGUgeyB0cmFuc3BvcnRfLT5jbG9zZSgpOyB9CiAKICAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAKICAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAKLSAgdm9pZCBmbHVzaCgpOworICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGU7CiAKICAgLyoqCiAgICAqIEZpbmFsaXplIHRoZSB6bGliIHN0cmVhbS4KQEAgLTE4MCwxMCArMTgwLDEyIEBACiAgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9VV0JVRl9TSVpFID0gMTI4OwogICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQ1dCVUZfU0laRSA9IDEwMjQ7CiAKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSBjb25zdCB7IHJldHVybiB0cmFuc3BvcnRfOyB9CisKIHByb3RlY3RlZDoKICAgaW5saW5lIHZvaWQgY2hlY2tabGliUnYoaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKTsKICAgaW5saW5lIHZvaWQgY2hlY2tabGliUnZOb3Rocm93KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZyk7Ci0gIGlubGluZSBpbnQgcmVhZEF2YWlsKCk7CisgIGlubGluZSBpbnQgcmVhZEF2YWlsKCkgY29uc3Q7CiAgIHZvaWQgZmx1c2hUb1RyYW5zcG9ydChpbnQgZmx1c2gpOwogICB2b2lkIGZsdXNoVG9abGliKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50IGxlbiwgaW50IGZsdXNoKTsKICAgYm9vbCByZWFkRnJvbVpsaWIoKTsKQEAgLTE5Myw3ICsxOTUsNyBAQAogICAvLyBMYXJnZXIgKG9yIGVxdWFsKSB3cml0ZXMgYXJlIGR1bXBlZCBzdHJhaWdodCB0byB6bGliLgogICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUgPSAzMjsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKIAogICBpbnQgdXJwb3NfOwogICBpbnQgdXdwb3NfOwpAQCAtMjI1LDEyICsyMjcsMTIgQEAKICAqLwogY2xhc3MgVFpsaWJUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKIHB1YmxpYzoKLSAgVFpsaWJUcmFuc3BvcnRGYWN0b3J5KCkge30KKyAgVFpsaWJUcmFuc3BvcnRGYWN0b3J5KCkgPSBkZWZhdWx0OwogCi0gIHZpcnR1YWwgflRabGliVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisgIH5UWmxpYlRyYW5zcG9ydEZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRabGliVHJhbnNwb3J0KHRyYW5zKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFpsaWJUcmFuc3BvcnQodHJhbnMpKTsKICAgfQogfTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuY3BwCmluZGV4IDY1NGQwMDUuLjBhMDI5MmMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmNwcApAQCAtMjEsNjQgKzIxLDYzIEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KIAogLy8gd2luMzIKLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9NU0NfRVhURU5TSU9OUykKLSNkZWZpbmUgREVMVEFfRVBPQ0hfSU5fTUlDUk9TRUNTIDExNjQ0NDczNjAwMDAwMDAwVWk2NAotI2Vsc2UKLSNkZWZpbmUgREVMVEFfRVBPQ0hfSU5fTUlDUk9TRUNTIDExNjQ0NDczNjAwMDAwMDAwVUxMCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjZW5kaWYKIAorI2lmICFkZWZpbmVkKF9fTUlOR1czMl9fKQogc3RydWN0IHRpbWV6b25lIHsKICAgaW50IHR6X21pbnV0ZXN3ZXN0OyAvKiBtaW51dGVzIFcgb2YgR3JlZW53aWNoICovCiAgIGludCB0el9kc3R0aW1lOyAgICAgLyogdHlwZSBvZiBkc3QgY29ycmVjdGlvbiAqLwogfTsKKyNlbmRpZgogCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKIGludCB0aHJpZnRfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsKiB0diwgc3RydWN0IHRpbWV6b25lKiB0eikgewotICBGSUxFVElNRSBmdDsKLSAgdW5zaWduZWQgX19pbnQ2NCB0bXByZXMoMCk7Ci0gIHN0YXRpYyBpbnQgdHpmbGFnOwotCi0gIGlmIChOVUxMICE9IHR2KSB7Ci0gICAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoJmZ0KTsKLQotICAgIHRtcHJlcyB8PSBmdC5kd0hpZ2hEYXRlVGltZTsKLSAgICB0bXByZXMgPDw9IDMyOwotICAgIHRtcHJlcyB8PSBmdC5kd0xvd0RhdGVUaW1lOwotCi0gICAgLypjb252ZXJ0aW5nIGZpbGUgdGltZSB0byB1bml4IGVwb2NoKi8KLSAgICB0bXByZXMgLT0gREVMVEFfRVBPQ0hfSU5fTUlDUk9TRUNTOwotICAgIHRtcHJlcyAvPSAxMDsgLypjb252ZXJ0IGludG8gbWljcm9zZWNvbmRzKi8KLSAgICB0di0+dHZfc2VjID0gKGxvbmcpKHRtcHJlcyAvIDEwMDAwMDBVTCk7Ci0gICAgdHYtPnR2X3VzZWMgPSAobG9uZykodG1wcmVzICUgMTAwMDAwMFVMKTsKLSAgfQotCi0gIGlmIChOVUxMICE9IHR6KSB7Ci0gICAgaWYgKCF0emZsYWcpIHsKLSAgICAgIF90enNldCgpOwotICAgICAgdHpmbGFnKys7Ci0gICAgfQotCi0gICAgbG9uZyB0aW1lX3pvbmUoMCk7Ci0gICAgZXJybm9fdCBlcnIoX2dldF90aW1lem9uZSgmdGltZV96b25lKSk7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgdHotPnR6X21pbnV0ZXN3ZXN0ID0gdGltZV96b25lIC8gNjA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpbnQgZGF5X2xpZ2h0KDApOwotICAgIGVyciA9IChfZ2V0X2RheWxpZ2h0KCZkYXlfbGlnaHQpKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICB0ei0+dHpfZHN0dGltZSA9IGRheV9saWdodDsKLSAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7CisgIHJldHVybiBnZXR0aW1lb2ZkYXkodHYsdHopOwogfQorI2Vsc2UKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPFdpbnNvY2syLmg+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorCisvLyBUaGlzIGNvZGUgc3RhcnRlZCBmcm9tIGEgIkZSRUUgaW1wbGVtZW50YXRpb24iIHBvc3RlZCB0byBTdGFjayBPdmVyZmxvdyBhdDoKKy8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwOTA1ODkyL2VxdWl2YWxlbnQtb2YtZ2V0dGltZWRheS1mb3Itd2luZG93cworLy8gYWRkZWQ6IGFzc2VydAorLy8gYWRkZWQ6IGVycm9yIGhhbmRsaW5nCisvLyBhZGRlZDogQysrIHN0eWxlIGNhc3RzCitpbnQgdGhyaWZ0X2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqIHRwLCBzdHJ1Y3QgdGltZXpvbmUgKiB0enApCit7CisgICAgLy8gV2UgZG9uJ3QgZmlsbCBpdCBpbiBzbyBwcm92ZSBub2JvZHkgaXMgbG9va2luZyBmb3IgdGhlIGRhdGEKKyAgICBhc3NlcnQodHpwID09IE5VTEwpOworCisgICAgLy8gTm90ZTogc29tZSBicm9rZW4gdmVyc2lvbnMgb25seSBoYXZlIDggdHJhaWxpbmcgemVybydzLCB0aGUgY29ycmVjdCBlcG9jaCBoYXMgOSB0cmFpbGluZyB6ZXJvJ3MKKyAgICAvLyBUaGlzIG1hZ2ljIG51bWJlciBpcyB0aGUgbnVtYmVyIG9mIDEwMCBuYW5vc2Vjb25kIGludGVydmFscyBzaW5jZSBKYW51YXJ5IDEsIDE2MDEgKFVUQykKKyAgICAvLyB1bnRpbCAwMDowMDowMCBKYW51YXJ5IDEsIDE5NzAgCisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IEVQT0NIID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KDExNjQ0NDczNjAwMDAwMDAwMFVMTCk7CisKKyAgICBTWVNURU1USU1FICBzeXN0ZW1fdGltZTsKKyAgICBGSUxFVElNRSAgICBmaWxlX3RpbWU7CisgICAgdWludDY0X3QgICAgdGltZTsKKworICAgIEdldFN5c3RlbVRpbWUoICZzeXN0ZW1fdGltZSApOworICAgIGlmICghU3lzdGVtVGltZVRvRmlsZVRpbWUoICZzeXN0ZW1fdGltZSwgJmZpbGVfdGltZSApKSB7CisgICAgICBEV09SRCBsYXN0RXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgc3MgPDwgIlN5c3RlbVRpbWVUb0ZpbGVUaW1lIGZhaWxlZDogMHgiIDw8IHN0ZDo6aGV4IDw8IGxhc3RFcnJvcjsKKyAgICAgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCBzcy5zdHIoKSk7CisgICAgfQorICAgIHRpbWUgPSAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGZpbGVfdGltZS5kd0xvd0RhdGVUaW1lICkgICAgICA7CisgICAgdGltZSArPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZmlsZV90aW1lLmR3SGlnaERhdGVUaW1lKSA8PCAzMjsKKworICAgIHRwLT50dl9zZWMgID0gc3RhdGljX2Nhc3Q8bG9uZz4oKHRpbWUgLSBFUE9DSCkgLyAxMDAwMDAwMEwpOworICAgIHRwLT50dl91c2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oc3lzdGVtX3RpbWUud01pbGxpc2Vjb25kcyAqIDEwMDApOworICAgIHJldHVybiAwOworfQorI2VuZGlmCiAKIGludCB0aHJpZnRfc2xlZXAodW5zaWduZWQgaW50IHNlY29uZHMpIHsKICAgOjpTbGVlcChzZWNvbmRzICogMTAwMCk7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oCmluZGV4IDZlOTBiYTEuLjc2MmFjNWUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oCkBAIC0yOSw2ICsyOSw3IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisjaW5jbHVkZSA8dGltZS5oPgogCiBzdHJ1Y3QgdGhyaWZ0X3RpbWVzcGVjIHsKICAgaW50NjRfdCB0dl9zZWM7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaAppbmRleCA1NjY4NGJiLi5kZDBjNWM5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmgKQEAgLTYzLDcgKzYzLDcgQEAKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLURFQ0xTUEVDX0FMSUdOKE1FTU9SWV9BTExPQ0FUSU9OX0FMSUdOTUVOVCkgc3RydWN0IFRPdmVybGFwcGVkV29ya0l0ZW0gOiBwdWJsaWMgU0xJU1RfRU5UUlkgeworc3RydWN0IERFQ0xTUEVDX0FMSUdOKE1FTU9SWV9BTExPQ0FUSU9OX0FMSUdOTUVOVCkgVE92ZXJsYXBwZWRXb3JrSXRlbSA6IHB1YmxpYyBTTElTVF9FTlRSWSB7CiAgIFRPdmVybGFwcGVkV29ya0l0ZW0oKTsKIAogICBlbnVtIGFjdGlvbl90IHsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmNwcAppbmRleCAyZTBjY2Y1Li5hNTAyY2JkIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KIAogLy8gYm9vc3QKLSNpbmNsdWRlIDxib29zdC9hc3NlcnQuaHBwPgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CkBAIC0yOCwxMyArMjcsNyBAQAogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIFRXaW5zb2NrU2luZ2xldG9uOjppbnN0YW5jZV9wdHIgVFdpbnNvY2tTaW5nbGV0b246Omluc3RhbmNlX3B0cl8oTlVMTCk7Ci0jaWYgVVNFX0JPT1NUX1RIUkVBRAotYm9vc3Q6Om9uY2VfZmxhZyBUV2luc29ja1NpbmdsZXRvbjo6ZmxhZ3NfID0gQk9PU1RfT05DRV9JTklUOwotI2VsaWYgVVNFX1NURF9USFJFQUQKIHN0ZDo6b25jZV9mbGFnIFRXaW5zb2NrU2luZ2xldG9uOjpmbGFnc187Ci0jZWxzZQotI2Vycm9yIEZvciB3aW5kb3dzIHlvdSBtdXN0IGNob29zZSBVU0VfQk9PU1RfVEhSRUFEIG9yIFVTRV9TVERfVEhSRUFECi0jZW5kaWYKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFRXaW5zb2NrU2luZ2xldG9uOjpUV2luc29ja1NpbmdsZXRvbih2b2lkKSB7CkBAIC00Myw3ICszNiw2IEBACiAKICAgaW50IGVycm9yKFdTQVN0YXJ0dXAodmVyc2lvbiwgJmRhdGEpKTsKICAgaWYgKGVycm9yICE9IDApIHsKLSAgICBCT09TVF9BU1NFUlQoZmFsc2UpOwogICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpc2UgV2luc29jay4iKTsKICAgfQogfQpAQCAtNTUsMTEgKzQ3LDcgQEAKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHZvaWQgVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSh2b2lkKSB7Ci0jaWYgVVNFX0JPT1NUX1RIUkVBRAotICBib29zdDo6Y2FsbF9vbmNlKGluaXQsIGZsYWdzXyk7Ci0jZWxpZiBVU0VfU1REX1RIUkVBRAogICBzdGQ6OmNhbGxfb25jZShmbGFnc18sIGluaXQpOwotI2VuZGlmCiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaAppbmRleCBkYzFiNTJmLi5hMzA4MDZiIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmgKQEAgLTMyLDE1ICszMiwxMCBAQAogCiAvLyBib29zdAogI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KLSNpbmNsdWRlIDxib29zdC9zY29wZWRfcHRyLmhwcD4KIAotI2lmIFVTRV9CT09TVF9USFJFQUQKLSNpbmNsdWRlIDxib29zdC90aHJlYWQvb25jZS5ocHA+Ci0jZWxpZiBVU0VfU1REX1RIUkVBRAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxtdXRleD4KLSNlbHNlCi0jZXJyb3IgRm9yIHdpbmRvd3MgeW91IG11c3QgY2hvb3NlIFVTRV9CT09TVF9USFJFQUQgb3IgVVNFX1NURF9USFJFQUQKLSNlbmRpZgorCiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CkBAIC01Myw3ICs0OCw3IEBACiBjbGFzcyBUV2luc29ja1NpbmdsZXRvbiA6IHByaXZhdGUgYm9vc3Q6Om5vbmNvcHlhYmxlIHsKIAogcHVibGljOgotICB0eXBlZGVmIGJvb3N0OjpzY29wZWRfcHRyPFRXaW5zb2NrU2luZ2xldG9uPiBpbnN0YW5jZV9wdHI7CisgIHR5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPFRXaW5zb2NrU2luZ2xldG9uPiBpbnN0YW5jZV9wdHI7CiAKIHByaXZhdGU6CiAgIFRXaW5zb2NrU2luZ2xldG9uKHZvaWQpOwpAQCAtNjksMTMgKzY0LDcgQEAKIAogcHJpdmF0ZToKICAgc3RhdGljIGluc3RhbmNlX3B0ciBpbnN0YW5jZV9wdHJfOwotI2lmIFVTRV9CT09TVF9USFJFQUQKLSAgc3RhdGljIGJvb3N0OjpvbmNlX2ZsYWcgZmxhZ3NfOwotI2VsaWYgVVNFX1NURF9USFJFQUQKICAgc3RhdGljIHN0ZDo6b25jZV9mbGFnIGZsYWdzXzsKLSNlbHNlCi0jZXJyb3IgTmVlZCBhIG5vbi1Cb29zdCBub24tQysrMTEgd2F5IHRvIHRyYWNrIHNpbmdsZSBpbml0aWFsaXphdGlvbiBoZXJlLgotI2VuZGlmCiB9OwogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuY3BwCmluZGV4IGM4Yjg1ZjMuLmM5MDdlOTIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5jcHAKQEAgLTY3LDcgKzY3LDggQEAKICAgdGltZXZhbCB0aW1lX291dDsKICAgdGltZXZhbCogdGltZV9vdXRfcHRyID0gTlVMTDsKICAgaWYgKHRpbWVvdXQgPj0gMCkgewotICAgIHRpbWV2YWwgdGltZV9vdXQgPSB7dGltZW91dCAvIDEwMDAsICh0aW1lb3V0ICUgMTAwMCkgKiAxMDAwfTsKKyAgICB0aW1lX291dC50dl9zZWMgPSB0aW1lb3V0IC8gMTAwMDsKKyAgICB0aW1lX291dC50dl91c2VjID0gKHRpbWVvdXQgJSAxMDAwKSAqIDEwMDA7CiAgICAgdGltZV9vdXRfcHRyID0gJnRpbWVfb3V0OwogICB9IGVsc2UgeyAvLyB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncwogICAgICh2b2lkKXRpbWVfb3V0OwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaAppbmRleCA1ODBkNjgwLi4wNjNhOTJhIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaApAQCAtMjUsMjkgKzI1LDExIEBACiAjZW5kaWYgLy8gX01TQ19WRVIKIAogI2lmbmRlZiBfV0lOMzIKLSNlcnJvciBUaGlzIGlzIGEgTVNWQyBoZWFkZXIgb25seS4KKyNlcnJvciAiVGhpcyBpcyBhIFdpbmRvd3MgaGVhZGVyIG9ubHkiCiAjZW5kaWYKIAotLy8gdXNlIHN0ZDo6dGhyZWFkIGluIE1TVkMxMSAoMjAxMikgb3IgbmV3ZXIKLSNpZiBfTVNDX1ZFUiA+PSAxNzAwCi0jZGVmaW5lIFVTRV9TVERfVEhSRUFEIDEKLS8vIG90aGVyd2lzZSB1c2UgYm9vc3QgdGhyZWFkcwotI2Vsc2UKLSNkZWZpbmUgVVNFX0JPT1NUX1RIUkVBRCAxCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfV0lOX1hQCi0jZGVmaW5lIFRBUkdFVF9XSU5fWFAgMQotI2VuZGlmCi0KLSNpZiBUQVJHRVRfV0lOX1hQCi0jaWZuZGVmIFdJTlZFUgotI2RlZmluZSBXSU5WRVIgMHgwNTAxCi0jZW5kaWYKLSNpZm5kZWYgX1dJTjMyX1dJTk5UCi0jZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA1MDEKLSNlbmRpZgotI2VuZGlmCisvLyBTb21ldGhpbmcgdGhhdCBkZWZpbmVzIFBSSWQ2NCBpcyByZXF1aXJlZCB0byBidWlsZAorI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQogCiAjaWZuZGVmIF9XSU4zMl9XSU5OVAogI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNjAxCkBAIC01OCwyNiArNDAsMTQgQEAKICNkZWZpbmUgU0lHTkVEX1JJR0hUX1NISUZUX0lTIDEKICNlbmRpZgogCisjaWZuZGVmIF9fTUlOR1czMl9fCiAjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ5OTYpIC8vIERlcHJlY2F0ZWQgcG9zaXggbmFtZS4KKyNlbmRpZgogCi0jZGVmaW5lIFZFUlNJT04gIjAuOS4zIgogI2RlZmluZSBIQVZFX0dFVFRJTUVPRkRBWSAxCiAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCiAKLSNpZmRlZiBIQVZFX1NURElOVF9ICiAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPGJvb3N0L2NzdGRpbnQuaHBwPgotCi10eXBlZGVmIGJvb3N0OjppbnQ2NF90IGludDY0X3Q7Ci10eXBlZGVmIGJvb3N0Ojp1aW50NjRfdCB1aW50NjRfdDsKLXR5cGVkZWYgYm9vc3Q6OmludDMyX3QgaW50MzJfdDsKLXR5cGVkZWYgYm9vc3Q6OnVpbnQzMl90IHVpbnQzMl90OwotdHlwZWRlZiBib29zdDo6aW50MTZfdCBpbnQxNl90OwotdHlwZWRlZiBib29zdDo6dWludDE2X3QgdWludDE2X3Q7Ci10eXBlZGVmIGJvb3N0OjppbnQ4X3QgaW50OF90OwotdHlwZWRlZiBib29zdDo6dWludDhfdCB1aW50OF90OwotI2VuZGlmCiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5Lmg+CkBAIC04OSwxMSArNTksMTQgQEAKIC8vIHdpbmRvd3MKICNpbmNsdWRlIDxXaW5zb2NrMi5oPgogI2luY2x1ZGUgPHdzMnRjcGlwLmg+Ci0jaWZkZWYgX1dJTjMyX1dDRQotI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMi5saWIiKQotI2Vsc2UKLSNwcmFnbWEgY29tbWVudChsaWIsICJXczJfMzIubGliIikKLSNwcmFnbWEgY29tbWVudChsaWIsICJhZHZhcGkzMi5saWIiKSAvLyBGb3Igc2VjdXJpdHkgQVBJcyBpbiBUUGlwZVNlcnZlcgotI3ByYWdtYSBjb21tZW50KGxpYiwgIlNobHdhcGkubGliIikgLy8gRm9yIFN0clN0cklBIGluIFRQaXBlU2VydmVyCi0jZW5kaWYKKyNpZm5kZWYgX19NSU5HVzMyX18KKyAgI2lmZGVmIF9XSU4zMl9XQ0UKKyAgI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMi5saWIiKQorICAjZWxzZQorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiV3MyXzMyLmxpYiIpCisgICNwcmFnbWEgY29tbWVudChsaWIsICJhZHZhcGkzMi5saWIiKSAvLyBGb3Igc2VjdXJpdHkgQVBJcyBpbiBUUGlwZVNlcnZlcgorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiU2hsd2FwaS5saWIiKSAgLy8gRm9yIFN0clN0cklBIGluIFRQaXBlU2VydmVyCisgICNlbmRpZgorI2VuZGlmIC8vIF9fTUlOR1czMl9fCisKICNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy50Y2MgYi9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy50Y2MKaW5kZXggOGM4ZWFhOC4uODBhNGVhMCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjCisrKyBiL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLnRjYwpAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiR2VuZXJpY0hlbHBlcnMuaCIKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CkBAIC0xOTAsMTQgKzE5MCwxNCBAQAogCiAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMCk7CiAgICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgNjI7IGkrKykgewotICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMUwgPDwgaSk7Ci0gICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigtKDFMIDw8IGkpKTsKKyAgICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KDFMTCA8PCBpKTsKKyAgICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KC0oMUxMIDw8IGkpKTsKICAgICB9CiAKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2MjsgaSsrKSB7Ci0gICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMUwgPDwgaSk7Ci0gICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oLSgxTCA8PCBpKSk7CisgICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMUxMIDw8IGkpOworICAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JNjQsIGludDY0X3Q+KC0oMUxMIDw8IGkpKTsKICAgICB9CiAKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBkb3VibGU+KDEyMy40NTYpOwpAQCAtMjE2LDcgKzIxNiw3IEBACiAgICAgdGVzdE1lc3NhZ2U8VFByb3RvPigpOwogCiAgICAgcHJpbnRmKCIlcyA9PiBPS1xuIiwgcHJvdG9uYW1lKTsKLSAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7CisgIH0gY2F0Y2ggKGNvbnN0IFRFeGNlcHRpb24gJmUpIHsKICAgICBUSFJJRlRfU05QUklOVEYoZXJyb3JNZXNzYWdlLCBFUlJfTEVOLCAiJXMgPT4gVGVzdCBGQUlMRUQ6ICVzIiwgcHJvdG9uYW1lLCBlLndoYXQoKSk7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOwogICB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQW5ub3RhdGlvblRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTE4ODQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0LmNwcApAQCAtMCwwICsxLDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEFubm90YXRpb25UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgImdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaCIKKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8vIE5vcm1hbGx5IHRocmlmdCBnZW5lcmF0ZXMgb3N0cmVhbSBvcGVyYXRvcnMsIGhvd2V2ZXIKKy8vIHdpdGggdGhlIGFubm90YXRpb24gImNwcC5jdXN0b21vc3RyZWFtIiBvbmUgY2FuIHRlbGwgdGhlCisvLyBjb21waWxlciB0aGV5IGFyZSBnb2luZyB0byBwcm92aWRlIHRoZWlyIG93biwgYW5kIG5vdAorLy8gZW1pdCBvcGVyYXRvciA8PCBvciBwcmludFRvKCkuCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBvc3RyX2N1c3RvbSYgb3NjKQoreworICBvcyA8PCAieyBiYXIgPSAiIDw8IG9zYy5iYXIgPDwgIjsgfSI7CisgIHJldHVybiBvczsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKEJPT1NUX1RFU1RfTU9EVUxFKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NwcF9jb21waWxlcl9nZW5lcmF0ZWRfb3N0cmVhbV9vcGVyYXRvcikKK3sKKyAgb3N0cl9kZWZhdWx0IGRlZjsKKyAgZGVmLl9fc2V0X2JhcigxMCk7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3NkOworICBzc2QgPDwgZGVmOworICBCT09TVF9DSEVDS19FUVVBTChzc2Quc3RyKCksICJvc3RyX2RlZmF1bHQoYmFyPTEwKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NwcF9jdXN0b21vc3RyZWFtX3VzZXNfY29uc3VtaW5nX2FwcGxpY2F0aW9uX2RlZmluaXRpb24pCit7CisgIG9zdHJfY3VzdG9tIGN1czsKKyAgY3VzLl9fc2V0X2JhcigxMCk7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gY3NkOworICBjc2QgPDwgY3VzOworICBCT09TVF9DSEVDS19FUVVBTChjc2Quc3RyKCksICJ7IGJhciA9IDEwOyB9Iik7Cit9CisKKy8qKgorICogRGlzYWJsZWQ7IHNlZSBUSFJJRlQtMTU2NyAtIG5vdCBzdXJlIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY3BwX3R5cGUpIHsKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgImNwcC50eXBlIiBhbm5vdGF0aW9uIGNoYW5nZXMgInN0cnVjdCBmb28iIHRvICJEZW5zZUZvbyIKKyAgLy8gVGhpcyB3b24ndCBjb21waWxlIGlmIHRoZSBhbm5vdGF0aW9uIGlzIG1pc2hhbmRsZWQKKyAgRGVuc2VGb28gZm9vOworICBmb28uX19zZXRfYmFyKDUpOworfQorICovCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0Jhc2U2NFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0Jhc2U2NFRlc3QuY3BwCmluZGV4IGU5ZTg2ZGQuLjc2ODZlNGUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9CYXNlNjRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvQmFzZTY0VGVzdC5jcHAKQEAgLTM3LDYgKzM3LDEwIEBACiB9CiAKIHZvaWQgY2hlY2tFbmNvZGluZyh1aW50OF90KiBkYXRhLCBpbnQgbGVuKSB7CisjaWZkZWYgTkRFQlVHCisgICgodm9pZClkYXRhKTsKKyNlbmRpZgorCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICBCT09TVF9BU1NFUlQoaXNhbG51bShkYXRhW2ldKSB8fCBkYXRhW2ldID09ICcvJyB8fCBkYXRhW2ldID09ICcrJyk7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsuY3BwIGIvbGliL2NwcC90ZXN0L0JlbmNobWFyay5jcHAKaW5kZXggNjllNjQxNC4uNTZhZGFjMCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0JlbmNobWFyay5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0JlbmNobWFyay5jcHAKQEAgLTIzLDggKzIzLDkgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNkZWZpbmUgX1VTRV9NQVRIX0RFRklORVMKICNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlICJ0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIgogI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKIAogI2lmZGVmIEhBVkVfU1lTX1RJTUVfSApAQCAtMzUsMTIgKzM2LDEyIEBACiBwdWJsaWM6CiAgIHRpbWV2YWwgdlN0YXJ0OwogCi0gIFRpbWVyKCkgeyBUSFJJRlRfR0VUVElNRU9GREFZKCZ2U3RhcnQsIDApOyB9Ci0gIHZvaWQgc3RhcnQoKSB7IFRIUklGVF9HRVRUSU1FT0ZEQVkoJnZTdGFydCwgMCk7IH0KKyAgVGltZXIoKSB7IFRIUklGVF9HRVRUSU1FT0ZEQVkoJnZTdGFydCwgbnVsbHB0cik7IH0KKyAgdm9pZCBzdGFydCgpIHsgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdlN0YXJ0LCBudWxscHRyKTsgfQogCiAgIGRvdWJsZSBmcmFtZSgpIHsKICAgICB0aW1ldmFsIHZFbmQ7Ci0gICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdkVuZCwgMCk7CisgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdkVuZCwgbnVsbHB0cik7CiAgICAgZG91YmxlIGRzdGFydCA9IHZTdGFydC50dl9zZWMgKyAoKGRvdWJsZSl2U3RhcnQudHZfdXNlYyAvIDEwMDAwMDAuMCk7CiAgICAgZG91YmxlIGRlbmQgPSB2RW5kLnR2X3NlYyArICgoZG91YmxlKXZFbmQudHZfdXNlYyAvIDEwMDAwMDAuMCk7CiAgICAgcmV0dXJuIGRlbmQgLSBkc3RhcnQ7CkBAIC00OCwxMSArNDksMTEgQEAKIH07CiAKIGludCBtYWluKCkgewotICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKICAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0gIHVzaW5nIG5hbWVzcGFjZSBib29zdDsKKyAgdXNpbmcgc3RkOjpjb3V0OworICB1c2luZyBzdGQ6OmVuZGw7CiAKICAgT25lT2ZFYWNoIG9vZTsKICAgb29lLmltX3RydWUgPSB0cnVlOwpAQCAtNjcsOSArNjgsOSBAQAogICBvb2UuYmFzZTY0ID0gIlwxXDJcM1wyNTUiOwogCiAgIGludCBudW0gPSAxMDAwMDA7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcihudW0qMTAwMCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKG51bSoxMDAwKSk7CiAKLSAgdWludDhfdCogZGF0YSA9IE5VTEw7CisgIHVpbnQ4X3QqIGRhdGEgPSBudWxscHRyOwogICB1aW50MzJfdCBkYXRhc2l6ZSA9IDA7CiAKICAgewpAQCAtODgsNyArODksNyBAQAogICBidWYtPmdldEJ1ZmZlcigmZGF0YSwgJmRhdGFzaXplKTsKIAogICB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CiAgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1ZjIpOwogICAgIE9uZU9mRWFjaCBvb2UyOwogICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOwpAQCAtMTE2LDcgKzExNyw3IEBACiAKICAgewogICAgIE9uZU9mRWFjaCBvb2UyOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOwogICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmMik7CiAgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CiAgICAgVGltZXIgdGltZXI7CkBAIC0xNDIsNyArMTQzLDcgQEAKICAgfQogCiAgIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKICAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmMik7CiAgICAgT25lT2ZFYWNoIG9vZTI7CiAgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CkBAIC0xNTYsNyArMTU3LDcgQEAKICAgfQogCiAKLSAgZGF0YSA9IE5VTEw7CisgIGRhdGEgPSBudWxscHRyOwogICBkYXRhc2l6ZSA9IDA7CiAgIG51bSA9IDEwMDAwMDAwOwogCkBAIC0xODEsNyArMTgyLDcgQEAKICAgYnVmLT5nZXRCdWZmZXIoJmRhdGEsICZkYXRhc2l6ZSk7CiAKICAgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOwogICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKICAgICBMaXN0RG91YmxlUGVyZiBsaXN0RG91YmxlUGVyZjI7CiAgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CkBAIC0yMDUsNyArMjA2LDcgQEAKIAogICB7CiAgICAgTGlzdERvdWJsZVBlcmYgbGlzdERvdWJsZVBlcmYyOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOwogICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmMik7CiAgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CiAgICAgVGltZXIgdGltZXI7CkBAIC0yMjcsNyArMjI4LDcgQEAKICAgfQogCiAgIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKICAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmMik7CiAgICAgTGlzdERvdWJsZVBlcmYgbGlzdERvdWJsZVBlcmYyOwogICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0CmluZGV4IDVkZTlmYzQuLmVmMDhkYmMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvY3BwL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTE3LDE2ICsxNywyMSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBGaW5kIHJlcXVpcmVkIHBhY2thZ2VzCi1zZXQoQm9vc3RfVVNFX1NUQVRJQ19MSUJTIE9OKSAjIEZvcmNlIHRoZSB1c2Ugb2Ygc3RhdGljIGJvb3N0IHRlc3QgZnJhbWV3b3JrCi1maW5kX3BhY2thZ2UoQm9vc3QgMS41My4wIFJFUVVJUkVEIENPTVBPTkVOVFMgY2hyb25vIGZpbGVzeXN0ZW0gc3lzdGVtIHRocmVhZCB1bml0X3Rlc3RfZnJhbWV3b3JrKQotaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCisjIFVuaXQgdGVzdHMgc3RpbGwgcmVxdWlyZSBib29zdAoraW5jbHVkZShCb29zdE1hY3JvcykKK1JFUVVJUkVfQk9PU1RfSEVBREVSUygpCitzZXQoQk9PU1RfQ09NUE9ORU5UUyBjaHJvbm8gZGF0ZV90aW1lIGZpbGVzeXN0ZW0gcmFuZG9tIHRocmVhZCB1bml0X3Rlc3RfZnJhbWV3b3JrKQorUkVRVUlSRV9CT09TVF9MSUJSQVJJRVMoQk9PU1RfQ09NUE9ORU5UUykKIAotI01ha2Ugc3VyZSBnZW4tY3BwIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAoraW5jbHVkZShUaHJpZnRNYWNyb3MpCisKKyMgTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCiBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQogCiAjIENyZWF0ZSB0aGUgdGhyaWZ0IEMrKyB0ZXN0IGxpYnJhcnkKIHNldCh0ZXN0Z2VuY3BwX1NPVVJDRVMKKyAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaAogICAgIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwCiAgICAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oCiAgICAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5jcHAKQEAgLTM3LDYgKzQyLDEwIEBACiAgICAgZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaAogICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAKICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAorICAgIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaAorICAgIGdlbi1jcHAvT25lV2F5U2VydmljZS5jcHAKKyAgICBnZW4tY3BwL09uZVdheVNlcnZpY2UuaAogICAgIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuY3BwCiAgICAgZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5oCiAgICAgVGhyaWZ0VGVzdF9leHRyYXMuY3BwCkBAIC01NywxNCArNjYsMTUgQEAKICkKIGFkZF9saWJyYXJ5KHRlc3RnZW5jcHBfY29iIFNUQVRJQyAke3Rlc3RnZW5jcHBfY29iX1NPVVJDRVN9KQogCi0KIGFkZF9leGVjdXRhYmxlKEJlbmNobWFyayBCZW5jaG1hcmsuY3BwKQogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKEJlbmNobWFyayB0ZXN0Z2VuY3BwKQogTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKEJlbmNobWFyayB0aHJpZnQpCiBhZGRfdGVzdChOQU1FIEJlbmNobWFyayBDT01NQU5EIEJlbmNobWFyaykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhCZW5jaG1hcmsgdGVzdGdlbmNwcCkKIAogc2V0KFVuaXRUZXN0X1NPVVJDRVMKICAgICBVbml0VGVzdE1haW4uY3BwCisgICAgT25lV2F5SFRUUFRlc3QuY3BwCiAgICAgVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCiAgICAgVEJ1ZmZlckJhc2VUZXN0LmNwcAogICAgIEJhc2U2NFRlc3QuY3BwCkBAIC03NCwxMCArODQsNiBAQAogICAgIFRTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcAogKQogCi1pZihOT1QgV0lUSF9CT09TVFRIUkVBRFMgQU5EIE5PVCBXSVRIX1NURFRIUkVBRFMgQU5EIE5PVCBNU1ZDKQotICAgIGxpc3QoQVBQRU5EIFVuaXRUZXN0X1NPVVJDRVMgUldNdXRleFN0YXJ2ZVRlc3QuY3BwKQotZW5kaWYoKQotCiBhZGRfZXhlY3V0YWJsZShVbml0VGVzdHMgJHtVbml0VGVzdF9TT1VSQ0VTfSkKIHRhcmdldF9saW5rX2xpYnJhcmllcyhVbml0VGVzdHMgdGVzdGdlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30pCiBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVW5pdFRlc3RzIHRocmlmdCkKQEAgLTg5LDcgKzk1LDEwIEBACiBlbmRpZiAoIE1TVkMgKQogCiAKLXNldCggVEludGVycnVwdFRlc3RfU09VUkNFUyBUU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgKQorc2V0KCBUSW50ZXJydXB0VGVzdF9TT1VSQ0VTCisgICAgIFRTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcAorICAgICBUU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKKykKIGlmIChXSU4zMikKICAgICBsaXN0KEFQUEVORCBUSW50ZXJydXB0VGVzdF9TT1VSQ0VTCiAgICAgICAgIFRQaXBlSW50ZXJydXB0VGVzdC5jcHAKQEAgLTEwMSwxMCArMTEwLDEwIEBACiAgICAgJHtCb29zdF9MSUJSQVJJRVN9CiApCiBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVEludGVycnVwdFRlc3QgdGhyaWZ0KQotaWYgKE5PVCBNU1ZDIEFORCBOT1QgJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRGFyd2luIikKK2lmIChOT1QgTVNWQyBBTkQgTk9UICR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIgQU5EIE5PVCBNSU5HVykKIHRhcmdldF9saW5rX2xpYnJhcmllcyhUSW50ZXJydXB0VGVzdCAtbHJ0KQogZW5kaWYgKCkKLWFkZF90ZXN0KE5BTUUgVEludGVycnVwdFRlc3QgQ09NTUFORCBUSW50ZXJydXB0VGVzdCkKK2FkZF90ZXN0KE5BTUUgVEludGVycnVwdFRlc3QgQ09NTUFORCBUSW50ZXJydXB0VGVzdCAtLSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uLy4uLy4uL3Rlc3Qva2V5cyIpCiAKIGFkZF9leGVjdXRhYmxlKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgVFNlcnZlckludGVncmF0aW9uVGVzdC5jcHApCiB0YXJnZXRfbGlua19saWJyYXJpZXMoVFNlcnZlckludGVncmF0aW9uVGVzdApAQCAtMTEyLDEyICsxMjEsMTMgQEAKICAgICAke0Jvb3N0X0xJQlJBUklFU30KICkKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUU2VydmVySW50ZWdyYXRpb25UZXN0IHRocmlmdCkKLWlmIChOT1QgTVNWQyBBTkQgTk9UICR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIpCitpZiAoTk9UIE1TVkMgQU5EIE5PVCAke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iIEFORCBOT1QgTUlOR1cpCiB0YXJnZXRfbGlua19saWJyYXJpZXMoVFNlcnZlckludGVncmF0aW9uVGVzdCAtbHJ0KQogZW5kaWYgKCkKIGFkZF90ZXN0KE5BTUUgVFNlcnZlckludGVncmF0aW9uVGVzdCBDT01NQU5EIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QpCiAKIGlmKFdJVEhfWkxJQikKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke1pMSUJfSU5DTFVERV9ESVJTfSIpCiBhZGRfZXhlY3V0YWJsZShUcmFuc3BvcnRUZXN0IFRyYW5zcG9ydFRlc3QuY3BwKQogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRyYW5zcG9ydFRlc3QKICAgICB0ZXN0Z2VuY3BwCkBAIC0xMzksNiArMTQ5LDEzIEBACiBhZGRfdGVzdChOQU1FIFpsaWJUZXN0IENPTU1BTkQgWmxpYlRlc3QpCiBlbmRpZihXSVRIX1pMSUIpCiAKK2FkZF9leGVjdXRhYmxlKEFubm90YXRpb25UZXN0IEFubm90YXRpb25UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhBbm5vdGF0aW9uVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShBbm5vdGF0aW9uVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIEFubm90YXRpb25UZXN0IENPTU1BTkQgQW5ub3RhdGlvblRlc3QpCiAKIGFkZF9leGVjdXRhYmxlKEVudW1UZXN0IEVudW1UZXN0LmNwcCkKIHRhcmdldF9saW5rX2xpYnJhcmllcyhFbnVtVGVzdApAQCAtMjQ5LDYgKzI2Niw3IEBACiBhZGRfZXhlY3V0YWJsZShsaW5rX3Rlc3QgJHtsaW5rX3Rlc3RfU09VUkNFU30pCiB0YXJnZXRfbGlua19saWJyYXJpZXMobGlua190ZXN0IHRlc3RnZW5jcHBfY29iKQogTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKGxpbmtfdGVzdCB0aHJpZnQpCit0YXJnZXRfbGlua19saWJyYXJpZXMobGlua190ZXN0IHRlc3RnZW5jcHApCiBhZGRfdGVzdChOQU1FIGxpbmtfdGVzdCBDT01NQU5EIGxpbmtfdGVzdCkKIAogaWYoV0lUSF9MSUJFVkVOVCkKQEAgLTI4MCw3ICsyOTgsMjEgQEAKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IHRocmlmdCkKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IHRocmlmdG5iKQogYWRkX3Rlc3QoTkFNRSBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IENPTU1BTkQgVE5vbmJsb2NraW5nU2VydmVyVGVzdCkKLWVuZGlmKCkKKworaWYoT1BFTlNTTF9GT1VORCBBTkQgV0lUSF9PUEVOU1NMKQorICBzZXQoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9TT1VSQ0VTIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwKQorICBhZGRfZXhlY3V0YWJsZShUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0ICR7VE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9TT1VSQ0VTfSkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0xJQkVWRU5UX0lOQ0xVREVfRElSU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CisgICAgdGVzdGdlbmNwcF9jb2IKKyAgICAke0xJQkVWRU5UX0xJQlJBUklFU30KKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgKQorICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCB0aHJpZnQpCisgIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IHRocmlmdG5iKQorICBhZGRfdGVzdChOQU1FIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QgQ09NTUFORCBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IC0tICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4vdGVzdC9rZXlzIikKK2VuZGlmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKK2VuZGlmKFdJVEhfTElCRVZFTlQpCiAKIGlmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKIGFkZF9leGVjdXRhYmxlKE9wZW5TU0xNYW51YWxJbml0VGVzdCBPcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwKQpAQCAtMjk3LDI1ICszMjksMTMgQEAKICAgICAke0Jvb3N0X0xJQlJBUklFU30KICkKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTZWN1cml0eVRlc3QgdGhyaWZ0KQotaWYgKE5PVCBNU1ZDIEFORCBOT1QgJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRGFyd2luIikKK2lmIChOT1QgTVNWQyBBTkQgTk9UICR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIgQU5EIE5PVCBNSU5HVykKIHRhcmdldF9saW5rX2xpYnJhcmllcyhTZWN1cml0eVRlc3QgLWxydCkKIGVuZGlmICgpCi1hZGRfdGVzdChOQU1FIFNlY3VyaXR5VGVzdCBDT01NQU5EIFNlY3VyaXR5VGVzdCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uLy4uLy4uL3Rlc3Qva2V5cyIpCithZGRfdGVzdChOQU1FIFNlY3VyaXR5VGVzdCBDT01NQU5EIFNlY3VyaXR5VGVzdCAtLSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uLy4uLy4uL3Rlc3Qva2V5cyIpCiAKIGVuZGlmKCkKIAotaWYoV0lUSF9RVDQpCi1zZXQoQ01BS0VfQVVUT01PQyBPTikKLWZpbmRfcGFja2FnZShRdDQgUkVRVUlSRUQgQ09NUE9ORU5UUyBRdFRlc3QpCi1zZXQoVFFUY3BTZXJ2ZXJUZXN0X1NPVVJDRVMKLSAgICBxdC9UUVRjcFNlcnZlclRlc3QuY3BwCi0pCi1hZGRfZXhlY3V0YWJsZShUUVRjcFNlcnZlclRlc3QgJHtUUVRjcFNlcnZlclRlc3RfU09VUkNFU30pCi10YXJnZXRfbGlua19saWJyYXJpZXMoVFFUY3BTZXJ2ZXJUZXN0IHRlc3RnZW5jcHBfY29iIHRocmlmdHF0IFF0NDo6UXRUZXN0KQotTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRRVGNwU2VydmVyVGVzdCB0aHJpZnQpCi1hZGRfdGVzdChOQU1FIFRRVGNwU2VydmVyVGVzdCBDT01NQU5EIFRRVGNwU2VydmVyVGVzdCkKLWVuZGlmKCkKLQogaWYoV0lUSF9RVDUpCiBhZGRfc3ViZGlyZWN0b3J5KHF0KQogZW5kaWYoKQpAQCAtMzI0LDM1ICszNDQsNDcgQEAKICMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKICMKIAorYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0Fubm90YXRpb25UZXN0X2NvbnN0YW50cy5jcHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF9jb25zdGFudHMuaAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmNwcAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLWNwcC9mb29fc2VydmljZS5jcHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLWNwcC9mb29fc2VydmljZS5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdAorKQogCi1hZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCBnZW4tY3BwL0VtcHR5U2VydmljZS5jcHAgIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmgKLSAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCBnZW4tY3BwL0VtcHR5U2VydmljZS5jcHAgZ2VuLWNwcC9FbXB0eVNlcnZpY2UuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKICkKIAogYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmgKLSAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRW51bVRlc3QudGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0VudW1UZXN0LnRocmlmdAogKQogCiBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaAotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UeXBlZGVmVGVzdC50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVHlwZWRlZlRlc3QudGhyaWZ0CiApCiAKIGFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oCi0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKICkKIAogYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5jcHAgZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaAotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKICkKIAogYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1NlcnZpY2UuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAKLSAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKICkKIAogYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvT25lV2F5U2VydmljZS5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmggZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5oIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5jcHAKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L09uZVdheVRlc3QudGhyaWZ0CiApCiAKIGFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuY3BwIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCBnZW4tY3BwL3Byb2NfdHlwZXMuY3BwIGdlbi1jcHAvcHJvY190eXBlcy5oCi0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Byb2Nlc3Nvci9wcm9jLnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcDp0ZW1wbGF0ZXMsY29iX3N0eWxlICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9wcm9jZXNzb3IvcHJvYy50aHJpZnQKICkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3QuY3BwCmluZGV4IDYwNzc0NGIuLjA2MGYzNTQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcApAQCAtMjEsMTMgKzIxLDE0IEBACiAjaW5jbHVkZSA8Y21hdGg+CiAjaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBEZWJ1Z1Byb3RvVGVzdAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KIAogdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7CiAKLXN0YXRpYyBzdGQ6OmF1dG9fcHRyPE9uZU9mRWFjaD4gb29lOworc3RhdGljIDo6c3RkOjpzaGFyZWRfcHRyPE9uZU9mRWFjaD4gb29lOwogCiB2b2lkIHRlc3RDYXNlU2V0dXBfMSgpIHsKICAgb29lLnJlc2V0KG5ldyBPbmVPZkVhY2gpOwpAQCAtODAsNyArODEsNyBAQAogICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKIH0KIAotc3RhdGljIHN0ZDo6YXV0b19wdHI8TmVzdGluZz4gbjsKK3N0YXRpYyA6OnN0ZDo6c2hhcmVkX3B0cjxOZXN0aW5nPiBuOwogCiB2b2lkIHRlc3RDYXNlU2V0dXBfMigpIHsKICAgdGVzdENhc2VTZXR1cF8xKCk7CkBAIC0xNDgsNyArMTQ5LDcgQEAKICAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7CiB9CiAKLXN0YXRpYyBzdGQ6OmF1dG9fcHRyPEhvbHlNb2xleT4gaG07CitzdGF0aWMgOjpzdGQ6OnNoYXJlZF9wdHI8SG9seU1vbGV5PiBobTsKIAogdm9pZCB0ZXN0Q2FzZVNldHVwXzMoKSB7CiAgIHRlc3RDYXNlU2V0dXBfMigpOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0VudW1UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9FbnVtVGVzdC5jcHAKaW5kZXggMGUzNGIxNi4uNjQ4NzkwNiAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0VudW1UZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvRW51bVRlc3QuY3BwCkBAIC0yMCw5ICsyMCwxNSBAQAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KICNpbmNsdWRlICJnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmgiCiAKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgTXlFbnVtV2l0aEN1c3RvbU9zdHJlYW06OnR5cGUmIHZhbCkKK3sKKyAgb3MgPDwgInsiIDw8IChpbnQpdmFsIDw8ICI6Q1VTVE9NISIgPDwgIn0iOworICByZXR1cm4gb3M7Cit9CisKIEJPT1NUX0FVVE9fVEVTVF9TVUlURShFbnVtVGVzdCkKIAotQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lbnVtKSB7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2VudW1fdmFsdWUpIHsKICAgLy8gQ2hlY2sgdGhhdCBhbGwgdGhlIGVudW0gdmFsdWVzIG1hdGNoIHdoYXQgd2UgZXhwZWN0CiAgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTE6Ok1FMV8wLCAwKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMTo6TUUxXzEsIDEpOwpAQCAtNDcsOSArNTMsMzQgQEAKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNDo6TUU0X0EsIDB4N2ZmZmZmZmQpOwogICBCT09TVF9DSEVDS19FUVVBTChNeUVudW00OjpNRTRfQiwgMHg3ZmZmZmZmZSk7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTQ6Ok1FNF9DLCAweDdmZmZmZmZmKTsKKworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW01OjplMSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTU6OmUyLCA0Mik7CiB9CiAKLUJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZW51bV9jb25zdGFudCkgewordGVtcGxhdGUgPGNsYXNzIF9UPgorc3RkOjpzdHJpbmcgRW51bVRvU3RyaW5nKF9UIGUpCit7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBlOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lbnVtX29zdHJlYW0pCit7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyhNeUVudW0xOjpNRTFfMCksICJNRTFfMCIpOworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcoTXlFbnVtNTo6ZTIpLCAiZTIiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKE15RW51bTM6Ok1FM19OMSksICJNRTNfTjEiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKE15RW51bVdpdGhDdXN0b21Pc3RyZWFtOjpDdXN0b00yKSwgInsyOkNVU1RPTSF9Iik7CisKKyAgLy8gc29tZSBpbnZhbGlkIG9yIHVua25vd24gdmFsdWUKKyAgYXV0byB1dXQgPSAoTXlFbnVtNTo6dHlwZSk0NDsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKHV1dCksICI0NCIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2VudW1fY29uc3RhbnQpCit7CiAgIE15U3RydWN0IG1zOwogICBCT09TVF9DSEVDS19FUVVBTChtcy5tZTJfMiwgMik7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKG1zLm1lM19uMiwgLTIpOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0dlbmVyaWNIZWxwZXJzLmggYi9saWIvY3BwL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaAppbmRleCBjMTc1NTYxLi5iY2VmOWYyIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaAorKysgYi9saWIvY3BwL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaApAQCAtMjAsMTMgKzIwLDEwIEBACiAjaWZuZGVmIF9USFJJRlRfVEVTVF9HRU5FUklDSEVMUEVSU19IXwogI2RlZmluZSBfVEhSSUZUX1RFU1RfR0VORVJJQ0hFTFBFUlNfSF8gMQogCi0jaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotCiAvKiBDbGFzc05hbWUgSGVscGVyIGZvciBjbGVhbmVyIGV4Y2VwdGlvbnMgKi8KIGNsYXNzIENsYXNzTmFtZXMgewogcHVibGljOgpAQCAtNjYsNDMgKzYzLDQzIEBACiBwdWJsaWM6CiAgIC8qIFdyaXRlIGZ1bmN0aW9ucyAqLwogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDhfdCYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQ4X3QmIHZhbCkgewogICAgIHJldHVybiBwcm90by0+d3JpdGVCeXRlKHZhbCk7CiAgIH0KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQxNl90JiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDE2X3QmIHZhbCkgewogICAgIHJldHVybiBwcm90by0+d3JpdGVJMTYodmFsKTsKICAgfQogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDMyX3QmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MzJfdCYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZUkzMih2YWwpOwogICB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgZG91YmxlJiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGRvdWJsZSYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZURvdWJsZSh2YWwpOwogICB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50NjRfdCYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQ2NF90JiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlSTY0KHZhbCk7CiAgIH0KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZVN0cmluZyh2YWwpOwogICB9CiAKICAgLyogUmVhZCBmdW5jdGlvbnMgKi8KIAotICBzdGF0aWMgdWludDMyX3QgcmVhZChzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGludDhfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEJ5dGUodmFsKTsgfQorICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBpbnQ4X3QmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWRCeXRlKHZhbCk7IH0KIAotICBzdGF0aWMgdWludDMyX3QgcmVhZChzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGludDE2X3QmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWRJMTYodmFsKTsgfQorICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBpbnQxNl90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkSTE2KHZhbCk7IH0KIAotICBzdGF0aWMgdWludDMyX3QgcmVhZChzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGludDMyX3QmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWRJMzIodmFsKTsgfQorICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBpbnQzMl90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkSTMyKHZhbCk7IH0KIAotICBzdGF0aWMgdWludDMyX3QgcmVhZChzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGludDY0X3QmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWRJNjQodmFsKTsgfQorICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBpbnQ2NF90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkSTY0KHZhbCk7IH0KIAotICBzdGF0aWMgdWludDMyX3QgcmVhZChzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGRvdWJsZSYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZERvdWJsZSh2YWwpOyB9CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGRvdWJsZSYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZERvdWJsZSh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBzdGQ6OnN0cmluZyYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIHN0ZDo6c3RyaW5nJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPnJlYWRTdHJpbmcodmFsKTsKICAgfQogfTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0LmNwcAppbmRleCBmMDNiMmNhLi5jMmFkNzNlIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0pTT05Qcm90b1Rlc3QuY3BwCkBAIC0xOSwxOCArMTksMjIgQEAKIAogI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUwogI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKIAogI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBKU09OUHJvdG9UZXN0CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgogCiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRKU09OUHJvdG9jb2w7CiAKLXN0YXRpYyBzdGQ6OmF1dG9fcHRyPE9uZU9mRWFjaD4gb29lOworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxPbmVPZkVhY2g+IG9vZTsKIAogdm9pZCB0ZXN0Q2FzZVNldHVwXzEoKSB7CiAgIG9vZS5yZXNldChuZXcgT25lT2ZFYWNoKTsKQEAgLTUyLDcgKzU2LDcgQEAKICAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAogICAie1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOjEyN30sXCI0XCI6e1wiaTE2XCI6MjcwMDB9LCIKICAgIlwiNVwiOntcImkzMlwiOjE2Nzc3MjE2fSxcIjZcIjp7XCJpNjRcIjo2MDAwMDAwMDAwfSxcIjdcIjp7XCJkYmxcIjozLjE0MTU5MjYiCi0gICI1MzU4OTc5M30sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCJ9LFwiOVwiOntcInN0clwiOlwiXHhkN1xcIgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIn0sXCI5XCI6e1wic3RyXCI6XCJceGQ3XFwiCiAgICJuXFx1MDAwN1xcdFwifSxcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiIgogICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKICAgIlwiLDMsMSwyLDNdfX0iKTsKQEAgLTYzLDcgKzY3LDcgQEAKICAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7CiB9CiAKLXN0YXRpYyBzdGQ6OmF1dG9fcHRyPE5lc3Rpbmc+IG47CitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE5lc3Rpbmc+IG47CiAKIHZvaWQgdGVzdENhc2VTZXR1cF8yKCkgewogICB0ZXN0Q2FzZVNldHVwXzEoKTsKQEAgLTkxLDcgKzk1LDcgQEAKICAgICAie1wiMVwiOntcInJlY1wiOntcIjFcIjp7XCJpMzJcIjozMTMzN30sXCIyXCI6e1wic3RyXCI6XCJJIGFtIGEgYm9uay4uLiB4b3IiCiAgICAgIiFcIn19fSxcIjJcIjp7XCJyZWNcIjp7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3IgogICAgICJ9LFwiNFwiOntcImkxNlwiOjE2fSxcIjVcIjp7XCJpMzJcIjozMn0sXCI2XCI6e1wiaTY0XCI6NjR9LFwiN1wiOntcImRibFwiOiIKLSAgICAiMS42MTgwMzM5ODg3NDk4OTV9LFwiOFwiOntcInN0clwiOlwiOlIgKG1lIGdvaW5nIFxcXCJycnJyXFxcIilcIn0sXCI5XCI6eyIKKyAgICAiMS42MTgwMzM5ODg3NDk4OTQ5fSxcIjhcIjp7XCJzdHJcIjpcIjpSIChtZSBnb2luZyBcXFwicnJyclxcXCIpXCJ9LFwiOVwiOnsiCiAgICAgIlwic3RyXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc66x4PigLxcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiIgogICAgICJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiIKICAgICAiLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0XCIsMywxLDIsM119fX19IgpAQCAtMTAzLDcgKzEwNyw3IEBACiAgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOwogfQogCi1zdGF0aWMgc3RkOjphdXRvX3B0cjxIb2x5TW9sZXk+IGhtOworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxIb2x5TW9sZXk+IGhtOwogCiB2b2lkIHRlc3RDYXNlU2V0dXBfMygpIHsKICAgdGVzdENhc2VTZXR1cF8yKCk7CkBAIC0xNTUsMTIgKzE1OSwxMiBAQAogICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCiAgICJ7XCIxXCI6e1wibHN0XCI6W1wicmVjXCIsMix7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6IgogICAiMzR9LFwiNFwiOntcImkxNlwiOjI3MDAwfSxcIjVcIjp7XCJpMzJcIjoxNjc3NzIxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMCIKLSAgIn0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2NTM1ODk3OTN9LFwiOFwiOntcInN0clwiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMSIKKyAgIn0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2NTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDEiCiAgICJcIn0sXCI5XCI6e1wic3RyXCI6XCJceGQ3XFxuXFx1MDAwN1xcdFwifSxcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6IgogICAiXCJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiIKICAgIiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NFwiLDMsMSwyLDNdfX0se1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSwiCiAgICJcIjNcIjp7XCJpOFwiOjUxfSxcIjRcIjp7XCJpMTZcIjoxNn0sXCI1XCI6e1wiaTMyXCI6MzJ9LFwiNlwiOntcImk2NFwiOjY0fSwiCi0gICJcIjdcIjp7XCJkYmxcIjoxLjYxODAzMzk4ODc0OTg5NX0sXCI4XCI6e1wic3RyXCI6XCI6UiAobWUgZ29pbmcgXFxcInJycnJcXFwiIgorICAiXCI3XCI6e1wiZGJsXCI6MS42MTgwMzM5ODg3NDk4OTQ5fSxcIjhcIjp7XCJzdHJcIjpcIjpSIChtZSBnb2luZyBcXFwicnJyclxcXCIiCiAgICIpXCJ9LFwiOVwiOntcInN0clwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3OuseD4oC8XCJ9LFwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7IgogICAiXCJzdHJcIjpcIkFRSURyUVwifSxcIjEyXCI6e1wibHN0XCI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNiIKICAgIlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0XCIsMywxLDIsM119fV19LFwiMlwiOntcInNldFwiOltcImxzdFwiLDMiCkBAIC0xODEsOCArMTg1LDggQEAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b180KSB7CiAgIHRlc3RDYXNlU2V0dXBfMSgpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAogICBvb2UtPndyaXRlKHByb3RvLmdldCgpKTsKICAgT25lT2ZFYWNoIG9vZTI7CkBAIC0xOTQsOCArMTk4LDggQEAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b181KSB7CiAgIHRlc3RDYXNlU2V0dXBfMygpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAogICBobS0+d3JpdGUocHJvdG8uZ2V0KCkpOwogICBIb2x5TW9sZXkgaG0yOwpAQCAtMjIxLDcgKzIyNSw3IEBACiAKICAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAogICAie1wiMVwiOntcImRibFwiOlwiTmFOXCJ9LFwiMlwiOntcImRibFwiOlwiSW5maW5pdHlcIn0sXCIzXCI6e1wiZGJsXCI6XCItSW5maSIKLSAgIm5pdHlcIn0sXCI0XCI6e1wiZGJsXCI6My4zMzMzMzMzMzMzMzMzMzN9LFwiNVwiOntcImRibFwiOjkuOTk5OTk5OTk5OTk5OTk5ZSsiCisgICJuaXR5XCJ9LFwiNFwiOntcImRibFwiOjMuMzMzMzMzMzMzMzMzMzMzNX0sXCI1XCI6e1wiZGJsXCI6OS45OTk5OTk5OTk5OTk5OTk0ZSsiCiAgICIzMDR9LFwiNlwiOntcImRibFwiOjFlLTMwNX0sXCI3XCI6e1wiZGJsXCI6MH0sXCI4XCI6e1wiZGJsXCI6LTB9fSIKICAgKTsKIApAQCAtMjMyLDggKzIzNiw4IEBACiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b183KSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAogICBCYXNlNjQgYmFzZTsKICAgYmFzZS5hID0gMTIzOwpAQCAtMjU1LDE3ICsyNTksODUgQEAKICAgY29uc3QgY2hhcioganNvbl9zdHJpbmcgPQogICAie1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOjEyN30sXCI0XCI6e1wiaTE2XCI6MjcwMDB9LCIKICAgIlwiNVwiOntcImkzMlwiOjE2Ljc3MjE2fSxcIjZcIjp7XCJpNjRcIjo2MDAwMDAwMDAwfSxcIjdcIjp7XCJkYmxcIjozLjE0MTU5MjYiCi0gICI1MzU4OTc5M30sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCJ9LFwiOVwiOntcInN0clwiOlwiXHhkN1xcIgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIn0sXCI5XCI6e1wic3RyXCI6XCJceGQ3XFwiCiAgICJuXFx1MDAwN1xcdFwifSxcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiIgogICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKICAgIlwiLDMsMSwyLDNdfX0iOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigKLSAgICAodWludDhfdCopKGpzb25fc3RyaW5nKSwgc3RybGVuKGpzb25fc3RyaW5nKSpzaXplb2YoY2hhcikpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisgIGNvbnN0IHN0ZDo6c2l6ZV90IGJ1ZlNpeiA9IHN0cmxlbihqc29uX3N0cmluZykgKiBzaXplb2YoY2hhcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZTaXopKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAogICBPbmVPZkVhY2ggb29lMjsKIAogICBCT09TVF9DSEVDS19USFJPVyhvb2UyLnJlYWQocHJvdG8uZ2V0KCkpLAogICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uKTsKIH0KKworc3RhdGljIHN0ZDo6c3RyaW5nIHRvSGV4U2VxdWVuY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJyk7CisgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyBpKyspIHsKKyAgICBzcyA8PCAiXFx4IiA8PCBpbnQodWludDhfdChzdHJbaV0pKTsKKyAgfQorICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl91bmljb2RlX2VzY2FwZWQpIHsKKyAgY29uc3QgY2hhciBqc29uX3N0cmluZ1tdID0KKyAgIntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjd9LFwiNFwiOntcImkxNlwiOjI3MDAwfSwiCisgICJcIjVcIjp7XCJpMzJcIjoxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMH0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2IgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyFcIn0sXCI5XCI6e1wic3RyXCI6XCJcXHUwZTAxIFxcdWQ4MzVcXHVkZDNlXCJ9LCIKKyAgIlwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjpcIjAwMDAwMFwifSxcIjEyXCI6e1wibHN0XCIiCisgICI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0IgorICAiXCIsMywxLDIsM119fSI7CisgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX3pvbWdfdW5pY29kZSA9ICJceGUwXHhiOFx4ODEgXHhmMFx4OWRceDk0XHhiZSI7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigKKyAgICAodWludDhfdCopKGpzb25fc3RyaW5nKSwgc2l6ZW9mKGpzb25fc3RyaW5nKSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgT25lT2ZFYWNoIG9vZTI7CisgIG9vZTIucmVhZChwcm90by5nZXQoKSk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIW9vZTIuem9tZ191bmljb2RlLmNvbXBhcmUoZXhwZWN0ZWRfem9tZ191bmljb2RlKSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IHRvSGV4U2VxdWVuY2UoZXhwZWN0ZWRfem9tZ191bmljb2RlKSA8PCAiXG5Hb3R0ZW46XG4iCisgICAgICAgICAgICAgICAgICA8PCB0b0hleFNlcXVlbmNlKG9vZTIuem9tZ191bmljb2RlKSk7CisKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3VuaWNvZGVfZXNjYXBlZF9taXNzaW5nX2xvd19zdXJyb2dhdGUpIHsKKyAgY29uc3QgY2hhciBqc29uX3N0cmluZ1tdID0KKyAgIntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjd9LFwiNFwiOntcImkxNlwiOjI3MDAwfSwiCisgICJcIjVcIjp7XCJpMzJcIjoxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMH0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2IgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyFcIn0sXCI5XCI6e1wic3RyXCI6XCJcXHVkODM1XCJ9LCIKKyAgIlwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjpcIjAwMDAwMFwifSxcIjEyXCI6e1wibHN0XCIiCisgICI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0IgorICAiXCIsMywxLDIsM119fSI7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigKKyAgICAodWludDhfdCopKGpzb25fc3RyaW5nKSwgc2l6ZW9mKGpzb25fc3RyaW5nKSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgT25lT2ZFYWNoIG9vZTI7CisgIEJPT1NUX0NIRUNLX1RIUk9XKG9vZTIucmVhZChwcm90by5nZXQoKSksCisgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb24pOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fdW5pY29kZV9lc2NhcGVkX21pc3NpbmdfaGlfc3Vycm9nYXRlKSB7CisgIGNvbnN0IGNoYXIganNvbl9zdHJpbmdbXSA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhXCJ9LFwiOVwiOntcInN0clwiOlwiXFx1ZGQzZVwifSwiCisgICJcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCIwMDAwMDBcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHNpemVvZihqc29uX3N0cmluZykpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIE9uZU9mRWFjaCBvb2UyOworICBCT09TVF9DSEVDS19USFJPVyhvb2UyLnJlYWQocHJvdG8uZ2V0KCkpLAorICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbQppbmRleCA0NGI5NGE3Li41YmI5ZWI3IDEwMDc1NQotLS0gYS9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NwcC90ZXN0L01ha2VmaWxlLmFtCkBAIC0xOCw3ICsxOCw4IEBACiAjCiBBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCiAKLUJVSUxUX1NPVVJDRVMgPSBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggXAorQlVJTFRfU09VUkNFUyA9IGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIFwKICAgICAgICAgICAgICAgICBnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmggXAogICAgICAgICAgICAgICAgIGdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCBcCiAgICAgICAgICAgICAgICAgZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaCBcCkBAIC0yNywxMiArMjgsMTkgQEAKICAgICAgICAgICAgICAgICBnZW4tY3BwL0NoaWxkU2VydmljZS5oIFwKICAgICAgICAgICAgICAgICBnZW4tY3BwL0VtcHR5U2VydmljZS5oIFwKICAgICAgICAgICAgICAgICBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCBcCisJCWdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oIFwKKwkJZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggXAorCQlnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmggXAogICAgICAgICAgICAgICAgIGdlbi1jcHAvcHJvY190eXBlcy5oCiAKIG5vaW5zdF9MVExJQlJBUklFUyA9IGxpYnRlc3RnZW5jcHAubGEgbGlicHJvY2Vzc29ydGVzdC5sYQogbm9kaXN0X2xpYnRlc3RnZW5jcHBfbGFfU09VUkNFUyA9IFwKKwlnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmNwcCBcCisJZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oIFwKIAlnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBcCiAJZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIFwKKwlnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmNwcCBcCisJZ2VuLWNwcC9Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5oIFwKIAlnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmNwcCBcCiAJZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oIFwKIAlnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcCBcCkBAIC00NSw2ICs1MywxMiBAQAogCWdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuaCBcCiAJZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5jcHAgXAogCWdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmNwcCBcCisJZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5jcHAgXAorCWdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oIFwKKwlnZW4tY3BwL09uZVdheVNlcnZpY2UuaCBcCisJZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5oIFwKKwlnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuY3BwIFwKIAlUaHJpZnRUZXN0X2V4dHJhcy5jcHAgXAogCURlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKIApAQCAtODksMjUgKzEwMywyOSBAQAogCVRGaWxlVHJhbnNwb3J0VGVzdCBcCiAJbGlua190ZXN0IFwKIAlPcGVuU1NMTWFudWFsSW5pdFRlc3QgXAotCUVudW1UZXN0CisJRW51bVRlc3QgXAorCVJlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdCBcCisgICAgICAgIEFubm90YXRpb25UZXN0CiAKIGlmIEFNWF9IQVZFX0xJQkVWRU5UCiBub2luc3RfUFJPR1JBTVMgKz0gXAogCXByb2Nlc3Nvcl90ZXN0CiBjaGVja19QUk9HUkFNUyArPSBcCi0JVE5vbmJsb2NraW5nU2VydmVyVGVzdAorCVROb25ibG9ja2luZ1NlcnZlclRlc3QgXAorCVROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QKIGVuZGlmCiAKIFRFU1RTX0VOVklST05NRU5UPSBcCiAJQk9PU1RfVEVTVF9MT0dfU0lOSz10ZXN0cy54bWwgXAogCUJPT1NUX1RFU1RfTE9HX0xFVkVMPXRlc3Rfc3VpdGUgXAotCUJPT1NUX1RFU1RfTE9HX0ZPUk1BVD14bWwKKwlCT09TVF9URVNUX0xPR19GT1JNQVQ9WE1MCiAKIFRFU1RTID0gXAogCSQoY2hlY2tfUFJPR1JBTVMpCiAKIFVuaXRUZXN0c19TT1VSQ0VTID0gXAogCVVuaXRUZXN0TWFpbi5jcHAgXAorCU9uZVdheUhUVFBUZXN0LmNwcCBcCiAJVE1lbW9yeUJ1ZmZlclRlc3QuY3BwIFwKIAlUQnVmZmVyQmFzZVRlc3QuY3BwIFwKIAlCYXNlNjRUZXN0LmNwcCBcCkBAIC0xMTUsMjQgKzEzMywyMiBAQAogCVR5cGVkZWZUZXN0LmNwcCBcCiAJVFNlcnZlclNvY2tldFRlc3QuY3BwIFwKIAlUU2VydmVyVHJhbnNwb3J0VGVzdC5jcHAgXAotCVRlc3RQb3J0Rml4dHVyZS5oIFwKIAlUVHJhbnNwb3J0Q2hlY2tUaHJvdy5oCiAKLWlmICFXSVRIX0JPT1NUVEhSRUFEUwotVW5pdFRlc3RzX1NPVVJDRVMgKz0gXAotICAgIFJXTXV0ZXhTdGFydmVUZXN0LmNwcAotZW5kaWYKLQogVW5pdFRlc3RzX0xEQUREID0gXAogICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKLSAgJChCT09TVF9URVNUX0xEQUREKQorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgJChCT09TVF9TWVNURU1fTERBREQpIFwKKyAgJChCT09TVF9USFJFQURfTERBREQpCiAKIFRJbnRlcnJ1cHRUZXN0X1NPVVJDRVMgPSBcCi0JVFNvY2tldEludGVycnVwdFRlc3QuY3BwCisJVFNvY2tldEludGVycnVwdFRlc3QuY3BwIFwKKwlUU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKIAogVEludGVycnVwdFRlc3RfTERBREQgPSBcCiAgIGxpYnRlc3RnZW5jcHAubGEgXAogICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgJChCT09TVF9GSUxFU1lTVEVNX0xEQUREKSBcCiAgICQoQk9PU1RfQ0hST05PX0xEQUREKSBcCiAgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCiAgICQoQk9PU1RfVEhSRUFEX0xEQUREKQpAQCAtMTc3LDEyICsxOTMsMjMgQEAKICAgLWx6CiAKIEVudW1UZXN0X1NPVVJDRVMgPSBcCi0gIEVudW1UZXN0LmNwcAorCUVudW1UZXN0LmNwcAogCiBFbnVtVGVzdF9MREFERCA9IFwKICAgbGlidGVzdGdlbmNwcC5sYSBcCiAgICQoQk9PU1RfVEVTVF9MREFERCkKIAorUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0X1NPVVJDRVMgPSBSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QuY3BwCisKK1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdF9MREFERCA9IGxpYnRlc3RnZW5jcHAubGEgJChCT09TVF9URVNUX0xEQUREKQorCitBbm5vdGF0aW9uVGVzdF9TT1VSQ0VTID0gXAorCUFubm90YXRpb25UZXN0LmNwcAorCitBbm5vdGF0aW9uVGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkKKwogVEZpbGVUcmFuc3BvcnRUZXN0X1NPVVJDRVMgPSBcCiAJVEZpbGVUcmFuc3BvcnRUZXN0LmNwcAogCkBAIC0yNTksNiArMjg2LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9URVNUX0xEQUREKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9MREZMQUdTKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChMSUJFVkVOVF9MSUJTKQorIworIyBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CisjCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0X1NPVVJDRVMgPSBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcAorCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0X0xEQUREID0gbGlicHJvY2Vzc29ydGVzdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnRuYi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9MREZMQUdTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9GSUxFU1lTVEVNX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9DSFJPTk9fTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1NZU1RFTV9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfVEhSRUFEX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChMSUJFVkVOVF9MSUJTKQogCiAjCiAjIE9wdGlvbmFsUmVxdWlyZWRUZXN0CkBAIC0zMjQsMTYgKzM2NiwyNCBAQAogCiBPcGVuU1NMTWFudWFsSW5pdFRlc3RfTERBREQgPSBcCiAJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKLQkkKEJPT1NUX1RFU1RfTERBREQpCisJJChCT09TVF9URVNUX0xEQUREKSBcCisJJChPUEVOU1NMX0xERkxBR1MpIFwKKwkkKE9QRU5TU0xfTElCUykKIAogIwogIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcwogIwotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmggZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCiBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggZ2VuLWNwcC9FbXB0eVNlcnZpY2UuY3BwIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmg6ICQodG9wX3NyY2RpcikvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKK2dlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCisKIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0VudW1UZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKIApAQCAtMzUyLDE1ICs0MDIsMTggQEAKIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKK2dlbi1jcHAvT25lV2F5U2VydmljZS5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmggZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5oIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5jcHA6IE9uZVdheVRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCiBnZW4tY3BwL0NoaWxkU2VydmljZS5jcHAgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuY3BwIGdlbi1jcHAvUGFyZW50U2VydmljZS5oIGdlbi1jcHAvcHJvY190eXBlcy5jcHAgZ2VuLWNwcC9wcm9jX3R5cGVzLmg6IHByb2Nlc3Nvci9wcm9jLnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAkPAogCi1BTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9saWIvY3BwL3NyYyAtRF9fU1REQ19MSU1JVF9NQUNST1MKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjIC1EX19TVERDX0ZPUk1BVF9NQUNST1MgLURfX1NURENfTElNSVRfTUFDUk9TIC1JLgogQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykKIEFNX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLWNwcAorCSQoUk0pIGdlbi1jcHAvKgogCiBFWFRSQV9ESVNUID0gXAogCWNvbmN1cnJlbmN5IFwKQEAgLTM2OCw0ICs0MjEsNSBAQAogCXF0IFwKIAlDTWFrZUxpc3RzLnR4dCBcCiAJRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcCBcCi0JVGhyaWZ0VGVzdF9leHRyYXMuY3BwCisJVGhyaWZ0VGVzdF9leHRyYXMuY3BwIFwKKwlPbmVXYXlUZXN0LnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L09uZVdheUhUVFBUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9PbmVXYXlIVFRQVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkOTE5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9PbmVXYXlIVFRQVGVzdC5jcHAKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlICJnZW4tY3BwL09uZVdheVNlcnZpY2UuaCIKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKE9uZVdheUhUVFBUZXN0KQorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEh0dHBTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUSHR0cENsaWVudDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJlZFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpjb3V0OwordXNpbmcgc3RkOjpjZXJyOwordXNpbmcgc3RkOjplbmRsOwordXNpbmcgc3RkOjpzdHJpbmc7CituYW1lc3BhY2UgdXRmID0gYm9vc3Q6OnVuaXRfdGVzdDsKKworLy8gRGVmaW5lIHRoaXMgZW52IHZhciB0byBlbmFibGUgc29tZSBsb2dnaW5nIChpbiBjYXNlIHlvdSBuZWVkIHRvIGRlYnVnKQorI3VuZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworCitjbGFzcyBPbmVXYXlTZXJ2aWNlSGFuZGxlciA6IHB1YmxpYyBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWYgeworcHVibGljOgorICBPbmVXYXlTZXJ2aWNlSGFuZGxlcigpID0gZGVmYXVsdDsKKworICB2b2lkIHJvdW5kVHJpcFJQQygpIG92ZXJyaWRlIHsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICBjZXJyIDw8ICJyb3VuZFRyaXBSUEMoKSIgPDwgZW5kbDsKKyNlbmRpZgorICB9CisgIHZvaWQgb25lV2F5UlBDKCkgb3ZlcnJpZGUgeworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICAgIGNlcnIgPDwgIm9uZVdheVJQQygpIiA8PCBzdGQ6OmVuZGwgOworI2VuZGlmCisgfQorfTsKKworY2xhc3MgT25lV2F5U2VydmljZUNsb25lRmFjdG9yeSA6IHZpcnR1YWwgcHVibGljIG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VJZkZhY3RvcnkgeworIHB1YmxpYzoKKyAgfk9uZVdheVNlcnZpY2VDbG9uZUZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisgIG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VJZiogZ2V0SGFuZGxlcihjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSBvdmVycmlkZQorICB7CisgICAgKHZvaWQpY29ubkluZm8gOworICAgIHJldHVybiBuZXcgT25lV2F5U2VydmljZUhhbmRsZXI7CisgIH0KKyAgdm9pZCByZWxlYXNlSGFuZGxlciggb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmKiBoYW5kbGVyKSBvdmVycmlkZSB7CisgICAgZGVsZXRlIGhhbmRsZXI7CisgIH0KK307CisKK2NsYXNzIFJQQzBUaHJlYWRDbGFzcyB7CitwdWJsaWM6CisgIFJQQzBUaHJlYWRDbGFzcyhUVGhyZWFkZWRTZXJ2ZXImIHNlcnZlcikgOiBzZXJ2ZXJfKHNlcnZlcikgeyB9IC8vIENvbnN0cnVjdG9yCit+UlBDMFRocmVhZENsYXNzKCkgPSBkZWZhdWx0OyAvLyBEZXN0cnVjdG9yCisKK3ZvaWQgUnVuKCkgeworICBzZXJ2ZXJfLnNlcnZlKCkgOworfQorIFRUaHJlYWRlZFNlcnZlciYgc2VydmVyXyA7Cit9IDsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkOworCisvLyBjb3BpZWQgZnJvbSBJbnRlZ3JhdGlvblRlc3QKK2NsYXNzIFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlciA6IHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyLCBwdWJsaWMgTW9uaXRvciB7CitwdWJsaWM6CisgIFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcigpIDogaXNMaXN0ZW5pbmdfKGZhbHNlKSwgYWNjZXB0ZWRfKDApIHt9CisgIH5UU2VydmVyUmVhZHlFdmVudEhhbmRsZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisgIHZvaWQgcHJlU2VydmUoKSBvdmVycmlkZSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgIGlzTGlzdGVuaW5nXyA9IHRydWU7CisgICAgbm90aWZ5KCk7CisgIH0KKyAgdm9pZCogY3JlYXRlQ29udGV4dChzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSBvdmVycmlkZSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgICsrYWNjZXB0ZWRfOworICAgIG5vdGlmeSgpOworCisgICAgKHZvaWQpaW5wdXQ7CisgICAgKHZvaWQpb3V0cHV0OworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGJvb2wgaXNMaXN0ZW5pbmcoKSBjb25zdCB7IHJldHVybiBpc0xpc3RlbmluZ187IH0KKyAgdWludDY0X3QgYWNjZXB0ZWRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGFjY2VwdGVkXzsgfQorCitwcml2YXRlOgorICBib29sIGlzTGlzdGVuaW5nXzsKKyAgdWludDY0X3QgYWNjZXB0ZWRfOworfTsKKworY2xhc3MgVEJsb2NrYWJsZUJ1ZmZlcmVkVHJhbnNwb3J0IDogcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydCB7CisgcHVibGljOgorICBUQmxvY2thYmxlQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKyAgICA6IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQsIDEwMjQwKSwKKyAgICBibG9ja2VkXyhmYWxzZSkgeworICB9CisKKyAgdWludDMyX3Qgd3JpdGVfYnVmZmVyX2xlbmd0aCgpIHsKKyAgICBhdXRvIGhhdmVfYnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOworICAgIHJldHVybiBoYXZlX2J5dGVzIDsKKyAgfQorCisgIHZvaWQgYmxvY2soKSB7CisgICAgYmxvY2tlZF8gPSB0cnVlIDsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICBjZXJyIDw8ICJibG9jayBmbHVzaGluZ1xuIiA7CisjZW5kaWYKKyB9CisgIHZvaWQgdW5ibG9jaygpIHsKKyAgICBibG9ja2VkXyA9IGZhbHNlIDsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICBjZXJyIDw8ICJ1bmJsb2NrIGZsdXNoaW5nLCBidWZmZXIgaXNcbjw8IiA8PCBzdGQ6OnN0cmluZygoY2hhciAqKXdCdWZfLmdldCgpLCB3cml0ZV9idWZmZXJfbGVuZ3RoKCkpIDw8ICI+PlxuIiA7CisjZW5kaWYKKyB9CisKKyAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICBpZiAoYmxvY2tlZF8pIHsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICAgIGNlcnIgPDwgImZsdXNoIHdhcyBibG9ja2VkXG4iIDsKKyNlbmRpZgorICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0OjpmbHVzaCgpIDsKKyAgfQorCisgIGJvb2wgYmxvY2tlZF8gOworfSA7CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKCBKU09OX0J1ZmZlcmVkSFRUUCApCit7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oMCkgOworICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8b25ld2F5dGVzdDo6T25lV2F5U2VydmljZVByb2Nlc3NvckZhY3Rvcnk+KHN0ZDo6bWFrZV9zaGFyZWQ8T25lV2F5U2VydmljZUNsb25lRmFjdG9yeT4oKSksCisgICAgc3MsIC8vcG9ydAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEpTT05Qcm90b2NvbEZhY3Rvcnk+KCkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+IHBFdmVudEhhbmRsZXIobmV3IFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcikgOworICBzZXJ2ZXIuc2V0U2VydmVyRXZlbnRIYW5kbGVyKHBFdmVudEhhbmRsZXIpOworCisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgIGNlcnIgPDwgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi5cbiI7CisjZW5kaWYKKyAgUlBDMFRocmVhZENsYXNzIHQoc2VydmVyKSA7CisgIGJvb3N0Ojp0aHJlYWQgdGhyZWFkKCZSUEMwVGhyZWFkQ2xhc3M6OlJ1biwgJnQpOworCisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYygqKHBFdmVudEhhbmRsZXIuZ2V0KCkpKTsKKyAgICB3aGlsZSAoIXBFdmVudEhhbmRsZXItPmlzTGlzdGVuaW5nKCkpIHsKKyAgICAgIHBFdmVudEhhbmRsZXItPndhaXQoKTsKKyAgICB9CisgIH0KKworICBpbnQgcG9ydCA9IHNzLT5nZXRQb3J0KCkgOworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICBjZXJyIDw8ICJwb3J0ICIgPDwgcG9ydCA8PCBlbmRsIDsKKyNlbmRpZgorCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KSk7CisgICAgc29ja2V0LT5zZXRSZWN2VGltZW91dCgxMDAwMCkgOyAvLyAxMDAwbXNlYyBzaG91bGQgYmUgZW5vdWdoCisgICAgc3RkOjpzaGFyZWRfcHRyPFRCbG9ja2FibGVCdWZmZXJlZFRyYW5zcG9ydD4gYmxvY2thYmxlX3RyYW5zcG9ydChuZXcgVEJsb2NrYWJsZUJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRIdHRwQ2xpZW50KGJsb2NrYWJsZV90cmFuc3BvcnQsICJsb2NhbGhvc3QiLCAiL3NlcnZpY2UiKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUNsaWVudCBjbGllbnQocHJvdG9jb2wpOworCisKKyAgICB0cmFuc3BvcnQtPm9wZW4oKTsKKyAgICBjbGllbnQucm91bmRUcmlwUlBDKCk7CisgICAgYmxvY2thYmxlX3RyYW5zcG9ydC0+YmxvY2soKSA7CisgICAgdWludDMyX3Qgc2l6ZTAgPSBibG9ja2FibGVfdHJhbnNwb3J0LT53cml0ZV9idWZmZXJfbGVuZ3RoKCkgOworICAgIGNsaWVudC5zZW5kX29uZVdheVJQQygpIDsKKyAgICB1aW50MzJfdCBzaXplMSA9IGJsb2NrYWJsZV90cmFuc3BvcnQtPndyaXRlX2J1ZmZlcl9sZW5ndGgoKSA7CisgICAgY2xpZW50LnNlbmRfb25lV2F5UlBDKCkgOworICAgIHVpbnQzMl90IHNpemUyID0gYmxvY2thYmxlX3RyYW5zcG9ydC0+d3JpdGVfYnVmZmVyX2xlbmd0aCgpIDsKKyAgICBCT09TVF9DSEVDSygoc2l6ZTEgLSBzaXplMCkgPT0gKHNpemUyIC0gc2l6ZTEpKSA7CisgICAgYmxvY2thYmxlX3RyYW5zcG9ydC0+dW5ibG9jaygpIDsKKyAgICBjbGllbnQuc2VuZF9yb3VuZFRyaXBSUEMoKSA7CisgICAgYmxvY2thYmxlX3RyYW5zcG9ydC0+Zmx1c2goKSA7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC5yZWN2X3JvdW5kVHJpcFJQQygpIDsKKyAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uICZlKSB7CisgICAgICBCT09TVF9FUlJPUiggIndlIHNob3VsZCBub3QgZ2V0IGEgdHJhbnNwb3J0IGV4Y2VwdGlvbiAtLSB0aGlzIG1lYW5zIHdlIGZhaWxlZDogIiArIHN0ZDo6c3RyaW5nKGUud2hhdCgpKSApIDsKKyAgICB9CisgICAgdHJhbnNwb3J0LT5jbG9zZSgpOworICB9CisgIHNlcnZlci5zdG9wKCk7CisgIHRocmVhZC5qb2luKCkgOworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICBjZXJyIDw8ICJmaW5pc2hlZC5cbiI7CisjZW5kaWYKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT25lV2F5VGVzdC50aHJpZnQgYi9saWIvY3BwL3Rlc3QvT25lV2F5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyY2YyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9PbmVXYXlUZXN0LnRocmlmdApAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCituYW1lc3BhY2UgY19nbGliIE9uZVdheVRlc3QKK25hbWVzcGFjZSBqYXZhIG9uZXdheXRlc3QKK25hbWVzcGFjZSBjcHAgb25ld2F5dGVzdAorbmFtZXNwYWNlIHJiIE9uZXdheXRlc3QKK25hbWVzcGFjZSBwZXJsIE9uZVdheVRlc3QKK25hbWVzcGFjZSBjc2hhcnAgT25ld2F5dGVzdAorbmFtZXNwYWNlIGpzIE9uZVdheVRlc3QKK25hbWVzcGFjZSBzdCBPbmVXYXlUZXN0CituYW1lc3BhY2UgcHkgT25lV2F5VGVzdAorbmFtZXNwYWNlIHB5LnR3aXN0ZWQgT25lV2F5VGVzdAorbmFtZXNwYWNlIGdvIG9uZXdheXRlc3QKK25hbWVzcGFjZSBwaHAgT25lV2F5VGVzdAorbmFtZXNwYWNlIGRlbHBoaSBPbmV3YXl0ZXN0CituYW1lc3BhY2UgbHVhIE9uZVdheVRlc3QKK25hbWVzcGFjZSB4c2QgdGVzdCAodXJpID0gJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9ucy9PbmVXYXlUZXN0JykKK25hbWVzcGFjZSBuZXRjb3JlIFRocmlmdEFzeW5jLk9uZVdheVRlc3QKKworLy8gYSBtaW5pbWFsIFRocmlmdCBzZXJ2aWNlLCBmb3IgdXNlIGluIE9uZVdheUhUVFBUdGVzdC5jcHAKK3NlcnZpY2UgT25lV2F5U2VydmljZSB7CisgIHZvaWQgcm91bmRUcmlwUlBDKCksCisgIG9uZXdheSB2b2lkIG9uZVdheVJQQygpCit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9PcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwCmluZGV4IDZhZmQ3Y2UuLmE3NTE4MDYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9PcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9PcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogCiB2b2lkIG1ha2VfaXNvbGF0ZWRfc3Nsc29ja2V0ZmFjdG9yeSgpIHsKQEAgLTYzLDEwICs2MiwyNCBAQAogICAvLyB1bmluaXRpYWxpemVkLiAgSXQgbWlnaHQgYWxzbyBmYWlsIG9uIHZlcnkgb2xkIHZlcnNpb25zIG9mCiAgIC8vIE9wZW5TU0wuLi4KICAgY29uc3QgRVZQX01EKiBtZCA9IEVWUF9nZXRfZGlnZXN0YnluYW1lKCJTSEEyNTYiKTsKLSAgQk9PU1RfQ0hFQ0sobWQgIT0gTlVMTCk7CisgIEJPT1NUX0NIRUNLKG1kICE9IG51bGxwdHIpOwogICBvcGVuc3NsX2NsZWFudXAoKTsKIH0KIAorI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJPcGVuU1NMTWFudWFsSW5pdCI7CisKKyAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9vcGVuc3NsX2F2YWlsYWJpbGl0eSkpOworCisgIHJldHVybiB0cnVlOworfQorIAoraW50IG1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSB7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSxhcmdjLGFyZ3YpOworfQorI2Vsc2UKIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKQEAgLTc3LDMgKzkwLDQgQEAKIAogICByZXR1cm4gTlVMTDsKIH0KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCmluZGV4IGIwZTVlZjcuLjRjNDM1NDYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcApAQCAtNDAsNyArNDAsNyBAQAogdm9pZCB0cnl3cml0ZShjb25zdCBTdHJ1Y3QmIHMsIGJvb2wgc2hvdWxkX3dvcmspIHsKICAgYm9vbCB3b3JrZWQ7CiAgIHRyeSB7Ci0gICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CisgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOwogICAgIHMud3JpdGUoJnByb3RvY29sKTsKICAgICB3b3JrZWQgPSB0cnVlOwogICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gJiBleCkgewpAQCAtNTIsNyArNTIsNyBAQAogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RydWN0MSwgdHlwZW5hbWUgU3RydWN0Mj4KIHZvaWQgd3JpdGVfdG9fcmVhZChjb25zdCBTdHJ1Y3QxJiB3LCBTdHJ1Y3QyJiByKSB7Ci0gIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOworICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CiAgIHcud3JpdGUoJnByb3RvY29sKTsKICAgci5yZWFkKCZwcm90b2NvbCk7CiB9CkBAIC0zMDMsNyArMzAzLDcgQEAKICAgbzEuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7CiAgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKIAotICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKKyAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOwogICBvMS53cml0ZSgmcHJvdG9jb2wpOwogCiAgIG8xLmltX2JpZy5wdXNoX2JhY2sobXltYXApOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1JXTXV0ZXhTdGFydmVUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9SV011dGV4U3RhcnZlVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzE1MzEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC90ZXN0L1JXTXV0ZXhTdGFydmVUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KLQotI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oIgotI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCIKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlOwotdXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZTsKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLWNsYXNzIExvY2tlciA6IHB1YmxpYyBSdW5uYWJsZSB7Ci1wcm90ZWN0ZWQ6Ci0gIExvY2tlcihib29zdDo6c2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrLCBib29sIHdyaXRlcikKLSAgICA6IHJ3bG9ja18ocndsb2NrKSwgd3JpdGVyXyh3cml0ZXIpLCBzdGFydGVkXyhmYWxzZSksIGdvdExvY2tfKGZhbHNlKSwgc2lnbmFsZWRfKGZhbHNlKSB7fQotCi1wdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBydW4oKSB7Ci0gICAgc3RhcnRlZF8gPSB0cnVlOwotICAgIGlmICh3cml0ZXJfKSB7Ci0gICAgICByd2xvY2tfLT5hY3F1aXJlV3JpdGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgcndsb2NrXy0+YWNxdWlyZVJlYWQoKTsKLSAgICB9Ci0gICAgZ290TG9ja18gPSB0cnVlOwotICAgIHdoaWxlICghc2lnbmFsZWRfKSB7Ci0gICAgICB1c2xlZXAoNTAwMCk7Ci0gICAgfQotICAgIHJ3bG9ja18tPnJlbGVhc2UoKTsKLSAgfQotCi0gIGJvb2wgc3RhcnRlZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0ZWRfOyB9Ci0gIGJvb2wgZ290TG9jaygpIGNvbnN0IHsgcmV0dXJuIGdvdExvY2tfOyB9Ci0gIHZvaWQgc2lnbmFsKCkgeyBzaWduYWxlZF8gPSB0cnVlOyB9Ci0KLXByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9ja187Ci0gIGJvb2wgd3JpdGVyXzsKLSAgdm9sYXRpbGUgYm9vbCBzdGFydGVkXzsKLSAgdm9sYXRpbGUgYm9vbCBnb3RMb2NrXzsKLSAgdm9sYXRpbGUgYm9vbCBzaWduYWxlZF87Ci19OwotCi1jbGFzcyBSZWFkZXIgOiBwdWJsaWMgTG9ja2VyIHsKLXB1YmxpYzoKLSAgUmVhZGVyKGJvb3N0OjpzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2spIDogTG9ja2VyKHJ3bG9jaywgZmFsc2UpIHt9Ci19OwotCi1jbGFzcyBXcml0ZXIgOiBwdWJsaWMgTG9ja2VyIHsKLXB1YmxpYzoKLSAgV3JpdGVyKGJvb3N0OjpzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2spIDogTG9ja2VyKHJ3bG9jaywgdHJ1ZSkge30KLX07Ci0KLXZvaWQgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpQT0xJQ1kgcG9saWN5KSB7Ci0gIC8vIHRoZSBtYW4gcGFnZXMgZm9yIHB0aHJlYWRfd3Jsb2NrX3JkbG9jayBzdWdnZXN0IHRoYXQgYW55IE9TIGd1YXJhbnRlZSBhYm91dAotICAvLyB3cml0ZXIgc3RhcnZhdGlvbiBtYXkgYmUgaW5mbHVlbmNlZCBieSB0aGUgc2NoZWR1bGluZyBwb2xpY3ksIHNvIGxldCdzIHRyeQotICAvLyBhbGwgMyBwb2xpY2llcyB0byBzZWUgaWYgYW55IG9mIHRoZW0gd29yay4KLSAgUG9zaXhUaHJlYWRGYWN0b3J5IGZhY3RvcnkocG9saWN5KTsKLSAgZmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9jayhuZXcgTm9TdGFydmVSZWFkV3JpdGVNdXRleCgpKTsKLQotICBib29zdDo6c2hhcmVkX3B0cjxSZWFkZXI+IHJlYWRlcjEobmV3IFJlYWRlcihyd2xvY2spKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UmVhZGVyPiByZWFkZXIyKG5ldyBSZWFkZXIocndsb2NrKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFdyaXRlcj4gd3JpdGVyKG5ldyBXcml0ZXIocndsb2NrKSk7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB0cmVhZGVyMSA9IGZhY3RvcnkubmV3VGhyZWFkKHJlYWRlcjEpOwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHRyZWFkZXIyID0gZmFjdG9yeS5uZXdUaHJlYWQocmVhZGVyMik7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gdHdyaXRlciA9IGZhY3RvcnkubmV3VGhyZWFkKHdyaXRlcik7Ci0KLSAgLy8gbGF1bmNoIGEgcmVhZGVyIGFuZCBtYWtlIHN1cmUgaGUgaGFzIHRoZSBsb2NrCi0gIHRyZWFkZXIxLT5zdGFydCgpOwotICB3aGlsZSAoIXJlYWRlcjEtPmdvdExvY2soKSkgewotICAgIHVzbGVlcCgyMDAwKTsKLSAgfQotCi0gIC8vIGxhdW5jaCBhIHdyaXRlciBhbmQgbWFrZSBzdXJlIGhlJ3MgYmxvY2tlZCBvbiB0aGUgbG9jawotICB0d3JpdGVyLT5zdGFydCgpOwotICB3aGlsZSAoIXdyaXRlci0+c3RhcnRlZCgpKSB7Ci0gICAgdXNsZWVwKDIwMDApOwotICB9Ci0gIC8vIHRyaWNreSBwYXJ0Li4uIHdlIGNhbiBuZXZlciBiZSAxMDAlIHN1cmUgdGhhdCB0aGUgd3JpdGVyIGlzIGFjdHVhbGx5Ci0gIC8vIGJsb2NrZWQgb24gdGhlIGxvY2ssIGJ1dCB3ZSBjYW4gcHJldHR5IHJlYXNvbmFibHkgc3VyZSBiZWNhdXNlIHdlIGtub3cKLSAgLy8gaGUganVzdCBleGVjdXRlZCB0aGUgbGluZSBpbW1lZGlhdGVseSBiZWZvcmUgZ2V0dGluZyB0aGUgbG9jaywgYW5kCi0gIC8vIHdlJ2xsIHdhaXQgYSBmdWxsIHNlY29uZCBmb3IgaGltIHRvIGdldCBvbiBpdC4KLSAgc2xlZXAoMSk7Ci0KLSAgLy8gbGF1bmNoIGEgc2Vjb25kIHJlYWRlci4uLiBpZiB0aGUgUldNdXRleCBndWFyYW50ZWVzIHRoYXQgd3JpdGVycyB3b24ndAotICAvLyBzdGFydmUsIHRoaXMgcmVhZGVyIHNob3VsZCBub3QgYmUgYWJsZSB0byBhY3F1aXJlIHRoZSBsb2NrIHVudGlsIHRoZSB3cml0ZXIKLSAgLy8gaGFzIGFjcXVpcmVkIGFuZCByZWxlYXNlZCBpdC4KLSAgdHJlYWRlcjItPnN0YXJ0KCk7Ci0gIHdoaWxlICghcmVhZGVyMi0+c3RhcnRlZCgpKSB7Ci0gICAgdXNsZWVwKDIwMDApOwotICB9Ci0gIC8vIGFnYWluLi4uIGNhbid0IGJlIDEwMCUgc3VyZSB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgb24gKG9yIGhhcykgdGhlIGxvY2sKLSAgLy8gYnV0IHdlIGNhbiBiZSBjbG9zZS4KLSAgc2xlZXAoMSk7Ci0KLSAgLy8gdGVsbCByZWFkZXIgMSB0byBsZXQgZ28gb2YgdGhlIGxvY2sKLSAgcmVhZGVyMS0+c2lnbmFsKCk7Ci0KLSAgLy8gd2FpdCBmb3Igc29tZW9uZSB0byBnZXQgdGhlIGxvY2sKLSAgd2hpbGUgKCFyZWFkZXIyLT5nb3RMb2NrKCkgJiYgIXdyaXRlci0+Z290TG9jaygpKSB7Ci0gICAgdXNsZWVwKDIwMDApOwotICB9Ci0KLSAgLy8gdGhlIHRlc3Qgc3VjY2VlZGVkIGlmIHRoZSBXUklURVIgZ290IHRoZSBsb2NrLgotICBib29sIHN1Y2Nlc3MgPSB3cml0ZXItPmdvdExvY2soKTsKLQotICAvLyB0ZWxsIGV2ZXJ5b25lIHdlJ3JlIGRvbmUgYW5kIHdhaXQgZm9yIHRoZW0gdG8gZmluaXNoCi0gIHJlYWRlcjItPnNpZ25hbCgpOwotICB3cml0ZXItPnNpZ25hbCgpOwotICB0cmVhZGVyMS0+am9pbigpOwotICB0cmVhZGVyMi0+am9pbigpOwotICB0d3JpdGVyLT5qb2luKCk7Ci0KLSAgLy8gbWFrZSBzdXJlIGl0IHdvcmtlZC4KLSAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShzdWNjZXNzLCAid3JpdGVyIGlzIHN0YXJ2aW5nIik7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9TVUlURShSV011dGV4U3RhcnZlVGVzdCkKLQotQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdGFydmVfb3RoZXIpIHsKLSAgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpPVEhFUik7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RhcnZlX3JyKSB7Ci0gIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6Uk9VTkRfUk9CSU4pOwotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0YXJ2ZV9maWZvKSB7Ci0gIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6RklGTyk7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QuY3BwCmluZGV4IGUzZTNmNTAuLmFiMmU0NmQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvUmVjdXJzaXZlVGVzdC5jcHAKQEAgLTIyLDIwICsyMiwyMSBAQAogICovCiAKICNpbmNsdWRlICJnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oIgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KIAogI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBSZWN1cnNpdmVUZXN0CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgogCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAogQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfMSkgewogICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKLSAgCisKICAgUmVjVHJlZSB0cmVlOwogICBSZWNUcmVlIGNoaWxkOwogICB0cmVlLmNoaWxkcmVuLnB1c2hfYmFjayhjaGlsZCk7CkBAIC01MCwxNyArNTEsMTcgQEAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVjdXJzaXZlXzIpIHsKICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CiAgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBwcm90KG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmKSk7Ci0gIAorCiAgIFJlY0xpc3QgbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UmVjTGlzdD4gbDIobmV3IFJlY0xpc3QpOworICBzaGFyZWRfcHRyPFJlY0xpc3Q+IGwyKG5ldyBSZWNMaXN0KTsKICAgbC5uZXh0aXRlbSA9IGwyOwogCiAgIGwud3JpdGUocHJvdC5nZXQoKSk7CiAKICAgUmVjTGlzdCByZXN1bHRsaXN0OwogICByZXN1bHRsaXN0LnJlYWQocHJvdC5nZXQoKSk7Ci0gIEJPT1NUX0NIRUNLKHJlc3VsdGxpc3QubmV4dGl0ZW0gIT0gTlVMTCk7Ci0gIEJPT1NUX0NIRUNLKHJlc3VsdGxpc3QubmV4dGl0ZW0tPm5leHRpdGVtID09IE5VTEwpOworICBCT09TVF9DSEVDSyhyZXN1bHRsaXN0Lm5leHRpdGVtICE9IG51bGxwdHIpOworICBCT09TVF9DSEVDSyhyZXN1bHRsaXN0Lm5leHRpdGVtLT5uZXh0aXRlbSA9PSBudWxscHRyKTsKIH0KIAogQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfMykgewpAQCAtNjgsMjEgKzY5LDIxIEBACiAgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBwcm90KG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmKSk7CiAKICAgQ29SZWMgYzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8Q29SZWMyPiByKG5ldyBDb1JlYzIpOworICBzaGFyZWRfcHRyPENvUmVjMj4gcihuZXcgQ29SZWMyKTsKICAgYy5vdGhlciA9IHI7CiAKICAgYy53cml0ZShwcm90LmdldCgpKTsKIAogICBjLnJlYWQocHJvdC5nZXQoKSk7Ci0gIEJPT1NUX0NIRUNLKGMub3RoZXIgIT0gTlVMTCk7Ci0gIEJPT1NUX0NIRUNLKGMub3RoZXItPm90aGVyLm90aGVyID09IE5VTEwpOworICBCT09TVF9DSEVDSyhjLm90aGVyICE9IG51bGxwdHIpOworICBCT09TVF9DSEVDSyhjLm90aGVyLT5vdGhlci5vdGhlciA9PSBudWxscHRyKTsKIH0KIAogQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfNCkgewogICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxSZWNMaXN0PiBkZXB0aExpbWl0KG5ldyBSZWNMaXN0KTsKKyAgc2hhcmVkX3B0cjxSZWNMaXN0PiBkZXB0aExpbWl0KG5ldyBSZWNMaXN0KTsKICAgZGVwdGhMaW1pdC0+bmV4dGl0ZW0gPSBkZXB0aExpbWl0OwogICBCT09TVF9DSEVDS19USFJPVyhkZXB0aExpbWl0LT53cml0ZShwcm90LmdldCgpKSwKICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbik7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9SZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTA0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBFUFNJTE9OIDAuMDAwMDAwMQorI2luY2x1ZGUgPHR5cGVpbmRleD4KKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmgiCit1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OworCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzKSB7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxLjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgPSAtMTAwLjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3LjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTID0gMy4xNDE1OTI2NTM1OTsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFID0gMS43ZSszMDg7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDg7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUykuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKQorICAgICAgICAgICAgLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVuZGVyZWRfZG91YmxlX2xpc3QpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+IEVYUEVDVEVEX0RPVUJMRV9MSVNUezEuMCwtMTAwLjAsMTAwLjAsOTIyMzM3MjAzNjg1NDc3NTgwNy4wLC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAsCisgICAgICAgIDMuMTQxNTkyNjUzNTksMTAwMDAwMC4xLC0xMDAwMDAwLjEsMS43ZSszMDgsLTEuN2UrMzA4LDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDN9OworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVC5zaXplKCksIEVYUEVDVEVEX0RPVUJMRV9MSVNULnNpemUoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9ET1VCTEVfTElTVC5zaXplKCk7ICsraSkgeworICAgICAgICBCT09TVF9DSEVDS19DTE9TRShnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1RbaV0sIEVYUEVDVEVEX0RPVUJMRV9MSVNUW2ldLCBFUFNJTE9OKTsKKyAgICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcAppbmRleCAyMTNlZmQ0Li45ODJhNGYzIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcApAQCAtMTksMTkgKzE5LDE2IEBACiAKICNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgU2VjdXJpdHlUZXN0CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgotI2luY2x1ZGUgPGJvb3N0L2JpbmQuaHBwPgogI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgogI2luY2x1ZGUgPGJvb3N0L2ZvcmVhY2guaHBwPgogI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvbWFrZV9zaGFyZWQuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgotI2luY2x1ZGUgIlRlc3RQb3J0Rml4dHVyZS5oIgogI2luY2x1ZGUgPHZlY3Rvcj4KLSNpZmRlZiBsaW51eAorI2lmZGVmIF9fbGludXhfXwogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2VuZGlmCiAKQEAgLTQzLDYgKzQwLDkgQEAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKIAordXNpbmcgc3RkOjpiaW5kOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCiBib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBrZXlEaXI7CiBib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBjZXJ0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCiB7CkBAIC01NSwzNiArNTUsMzYgQEAKICAgICBHbG9iYWxGaXh0dXJlKCkKICAgICB7CiAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjOyArK2kpCi0JCXsKLQkJCUJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJhcmd2WyUxJV0gPSBcIiUyJVwiIikgJSBpICUgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W2ldKTsKLQkJfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjOyArK2kpCisgICAgeworICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoImFyZ3ZbJTElXSA9IFwiJTIlXCIiKSAlIGkgJSBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbaV0pOworICAgIH0KIAotICAgICNpZmRlZiBsaW51eAotCQkvLyBPcGVuU1NMIGNhbGxzIHNlbmQoKSB3aXRob3V0IE1TR19OT1NJR1BJUEUgc28gd3JpdGluZyB0byBhIHNvY2tldCB0aGF0IGhhcwotCQkvLyBkaXNjb25uZWN0ZWQgY2FuIGNhdXNlIGEgU0lHUElQRSBzaWduYWwuLi4KLQkJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICAgICNpZmRlZiBfX2xpbnV4X18KKyAgICAvLyBPcGVuU1NMIGNhbGxzIHNlbmQoKSB3aXRob3V0IE1TR19OT1NJR1BJUEUgc28gd3JpdGluZyB0byBhIHNvY2tldCB0aGF0IGhhcworICAgIC8vIGRpc2Nvbm5lY3RlZCBjYW4gY2F1c2UgYSBTSUdQSVBFIHNpZ25hbC4uLgorICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKICAgICAjZW5kaWYKIAotCQlUU1NMU29ja2V0RmFjdG9yeTo6c2V0TWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKHRydWUpOwotCQlhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojppbml0aWFsaXplT3BlblNTTCgpOworICAgIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24odHJ1ZSk7CisgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6aW5pdGlhbGl6ZU9wZW5TU0woKTsKIAotCQlrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6Y3VycmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkgLyAidGVzdCIgLyAia2V5cyI7Ci0JCWlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKLQkJewotCQkJa2V5RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGgobWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W21hc3Rlcl90ZXN0X3N1aXRlKCkuYXJnYyAtIDFdKTsKLQkJCWlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKLQkJCXsKLQkJCQl0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIlRoZSBsYXN0IGFyZ3VtZW50IHRvIHRoaXMgdGVzdCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVzdCBjZXJ0aWZpY2F0ZShzKS4iKTsKLQkJCX0KLQkJfQorICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpjdXJyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKSAvICJ0ZXN0IiAvICJrZXlzIjsKKyAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgeworICAgICAga2V5RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGgobWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W21hc3Rlcl90ZXN0X3N1aXRlKCkuYXJnYyAtIDFdKTsKKyAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgIHsKKyAgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJUaGUgbGFzdCBhcmd1bWVudCB0byB0aGlzIHRlc3QgbXVzdCBiZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlc3QgY2VydGlmaWNhdGUocykuIik7CisgICAgICB9CisgICAgfQogICAgIH0KIAogICAgIHZpcnR1YWwgfkdsb2JhbEZpeHR1cmUoKQogICAgIHsKLQkJYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6Y2xlYW51cE9wZW5TU0woKTsKLSNpZmRlZiBsaW51eAotCQlzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7CisgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6Y2xlYW51cE9wZW5TU0woKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7CiAjZW5kaWYKICAgICB9CiB9OwpAQCAtOTUsNyArOTUsNyBAQAogQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZSkKICNlbmRpZgogCi1zdHJ1Y3QgU2VjdXJpdHlGaXh0dXJlIDogcHVibGljIFRlc3RQb3J0Rml4dHVyZQorc3RydWN0IFNlY3VyaXR5Rml4dHVyZQogewogICAgIHZvaWQgc2VydmVyKGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sIHByb3RvY29sKQogICAgIHsKQEAgLTEwMywyMCArMTAzLDIxIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGJvb3N0OjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOwogCi0gICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7Ci0gICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU2VydmVyU29ja2V0PiBwU2VydmVyU29ja2V0OworICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRTU0xTZXJ2ZXJTb2NrZXQ+IHBTZXJ2ZXJTb2NrZXQ7CiAKICAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LnJlc2V0KG5ldyBUU1NMU29ja2V0RmFjdG9yeShzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4ocHJvdG9jb2wpKSk7CiAgICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7Ci0gICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikubmF0aXZlKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoY2VydEZpbGUoInNlcnZlci5rZXkiKS5uYXRpdmUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoInNlcnZlci5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgic2VydmVyLmtleSIpLnN0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPnNlcnZlcih0cnVlKTsKLSAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXQucmVzZXQobmV3IFRTU0xTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIG1fc2VydmVyUG9ydCwgcFNlcnZlclNvY2tldEZhY3RvcnkpKTsKLSAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGNvbm5lY3RlZENsaWVudDsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXQucmVzZXQobmV3IFRTU0xTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIDAsIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5KSk7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGNvbm5lY3RlZENsaWVudDsKIAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcFNlcnZlclNvY2tldC0+bGlzdGVuKCk7CisgICAgICAgICAgICAgICAgbVBvcnQgPSBwU2VydmVyU29ja2V0LT5nZXRQb3J0KCk7CiAgICAgICAgICAgICAgICAgbUNWYXIubm90aWZ5X29uZSgpOwogICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CiAKQEAgLTE1MywxNyArMTU0LDE3IEBACiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5OwotICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gcENsaWVudFNvY2tldDsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5OworICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0PiBwQ2xpZW50U29ja2V0OwogCiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3Rvcnkoc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KHByb3RvY29sKSkpOwogICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5hdXRoZW50aWNhdGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgiY2xpZW50LmNydCIpLm5hdGl2ZSgpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgiY2xpZW50LmtleSIpLm5hdGl2ZSgpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjZXJ0RmlsZSgiQ0EucGVtIikubmF0aXZlKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgcENsaWVudFNvY2tldCA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIG1fc2VydmVyUG9ydCk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgiY2xpZW50LmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgiY2xpZW50LmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjZXJ0RmlsZSgiQ0EucGVtIikuc3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldCA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIG1Qb3J0KTsKICAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0LT5vcGVuKCk7CiAKICAgICAgICAgICAgICAgICB1aW50OF90IGJ1ZlszXTsKQEAgLTIwNyw2ICsyMDgsNyBAQAogCiAgICAgYm9vc3Q6Om11dGV4IG1NdXRleDsKICAgICBib29zdDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1DVmFyOworICAgIGludCBtUG9ydDsKICAgICBib29sIG1Db25uZWN0ZWQ7CiB9OwogCkBAIC0yMzksMTcgKzI0MSwyNiBAQAogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKKyNpZmRlZiBPUEVOU1NMX05PX1NTTDMKKyAgICAgICAgICAgICAgICBpZiAoc2kgPT0gMiB8fCBjaSA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBhbGwgU1NMdjMgY2FzZXMgLSBwcm90b2NvbCBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCiAgICAgICAgICAgICAgICAgYm9vc3Q6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CiAKICAgICAgICAgICAgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiVEVTVDogU2VydmVyID0gJTElLCBDbGllbnQgPSAlMiUiKQogICAgICAgICAgICAgICAgICAgICAlIHByb3RvY29sMnN0cihzaSkgJSBwcm90b2NvbDJzdHIoY2kpKTsKIAogICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAvLyB0aHJlYWRfZ3JvdXAgbWFuYWdlcyB0aGUgdGhyZWFkIGxpZmV0aW1lIC0gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2YgY3JlYXRlX3RocmVhZAogICAgICAgICAgICAgICAgIGJvb3N0Ojp0aHJlYWRfZ3JvdXAgdGhyZWFkczsKLSAgICAgICAgICAgICAgICB0aHJlYWRzLmNyZWF0ZV90aHJlYWQoYm9vc3Q6OmJpbmQoJlNlY3VyaXR5Rml4dHVyZTo6c2VydmVyLCB0aGlzLCBzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4oc2kpKSk7CisgICAgICAgICAgICAgICAgKHZvaWQpdGhyZWFkcy5jcmVhdGVfdGhyZWFkKGJpbmQoJlNlY3VyaXR5Rml4dHVyZTo6c2VydmVyLCB0aGlzLCBzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4oc2kpKSk7CiAgICAgICAgICAgICAgICAgbUNWYXIud2FpdChsb2NrKTsgICAgICAgICAgIC8vIHdhaXQgZm9yIGxpc3RlbigpIHRvIHN1Y2NlZWQKICAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgIHRocmVhZHMuY3JlYXRlX3RocmVhZChib29zdDo6YmluZCgmU2VjdXJpdHlGaXh0dXJlOjpjbGllbnQsIHRoaXMsIHN0YXRpY19jYXN0PGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sPihjaSkpKTsKKyAgICAgICAgICAgICAgICAodm9pZCl0aHJlYWRzLmNyZWF0ZV90aHJlYWQoYmluZCgmU2VjdXJpdHlGaXh0dXJlOjpjbGllbnQsIHRoaXMsIHN0YXRpY19jYXN0PGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sPihjaSkpKTsKICAgICAgICAgICAgICAgICB0aHJlYWRzLmpvaW5fYWxsKCk7CiAKICAgICAgICAgICAgICAgICBCT09TVF9DSEVDS19NRVNTQUdFKG1Db25uZWN0ZWQgPT0gbWF0cml4W2NpXVtzaV0sCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QuY3BwCmluZGV4IGU4NTFiYWMuLjAwODgzN2QgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QuY3BwCkBAIC04Miw4ICs4Miw4IEBACiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJuZXZlcm1vcmUiOwogICBobS5ib25rc1sicG9lIl0gPSBzdGFnZTI7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvKG5ldyBNeVByb3RvY29sKGJ1ZmZlcikpOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90byhuZXcgTXlQcm90b2NvbChidWZmZXIpKTsKIAogICBvb2Uud3JpdGUocHJvdG8uZ2V0KCkpOwogICBPbmVPZkVhY2ggb29lMjsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UQnVmZmVyQmFzZVRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RCdWZmZXJCYXNlVGVzdC5jcHAKaW5kZXggNWQwYmY0NS4uNzIwM2Y4MiAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RCdWZmZXJCYXNlVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RCdWZmZXJCYXNlVGVzdC5jcHAKQEAgLTIxLDEzICsyMSwxNCBAQAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlcmVkVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnRlc3Q6OlRTaG9ydFJlYWRUcmFuc3BvcnQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAogLy8gU2hhbWVsZXNzbHkgY29waWVkIGZyb20gWmxpYlRyYW5zcG9ydC4gIFRPRE86IHJlZmFjdG9yLgogdW5zaWduZWQgaW50IGRpc3RbXVs1MDAwXSA9IHsKQEAgLTE2NCw4ICsxNjUsOCBAQAogCiAgIC8vIFJlcGVhdGFiaWxpdHkuICBLaW5kIG9mLgogICBzdGQ6OnNyYW5kKDQyKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoc2l6ZW9mKGRhdGEpL3NpemVvZihkYXRhWzBdKSk7ICsraSkgewotICAgIGRhdGFbaV0gPSAodWludDhfdClyYW5kKCk7CisgIGZvciAodW5zaWduZWQgY2hhciAmIGkgOiBkYXRhKSB7CisgICAgaSA9ICh1aW50OF90KXJhbmQoKTsKICAgfQogCiAgIGRhdGFfc3RyLmFzc2lnbigoY2hhciopZGF0YSwgc2l6ZW9mKGRhdGEpKTsKQEAgLTE3NywxNCArMTc4LDE0IEBACiBCT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9NZW1vcnlCdWZmZXJfV3JpdGVfR2V0QnVmZmVyICkgewogICBpbml0X2RhdGEoKTsKIAotICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICBmb3IgKGF1dG8gJiBkMSA6IGRpc3QpIHsKICAgICBUTWVtb3J5QnVmZmVyIGJ1ZmZlcigxNik7CiAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgaW50IGluZGV4ID0gMDsKIAogICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewotICAgICAgYnVmZmVyLndyaXRlKCZkYXRhW29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7Ci0gICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOworICAgICAgYnVmZmVyLndyaXRlKCZkYXRhW29mZnNldF0sIGQxW2luZGV4XSk7CisgICAgICBvZmZzZXQgKz0gZDFbaW5kZXhdOwogICAgICAgaW5kZXgrKzsKICAgICB9CiAKQEAgLTE5Niw4ICsxOTcsOCBAQAogQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfTWVtb3J5QnVmZmVyX1dyaXRlX1JlYWQgKSB7CiAgIGluaXRfZGF0YSgpOwogCi0gIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7Ci0gICAgZm9yIChpbnQgZDIgPSAwOyBkMiA8IDM7IGQyKyspIHsKKyAgZm9yIChhdXRvICYgZDEgOiBkaXN0KSB7CisgICAgZm9yIChhdXRvICYgZDIgOiBkaXN0KSB7CiAgICAgICBUTWVtb3J5QnVmZmVyIGJ1ZmZlcigxNik7CiAgICAgICB1aW50OF90IGRhdGFfb3V0WzE8PDE1XTsKICAgICAgIGludCBvZmZzZXQ7CkBAIC0yMDYsMTcgKzIwNywxNyBAQAogICAgICAgb2Zmc2V0ID0gMDsKICAgICAgIGluZGV4ID0gMDsKICAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewotICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKKyAgICAgICAgYnVmZmVyLndyaXRlKCZkYXRhW29mZnNldF0sIGQxW2luZGV4XSk7CisgICAgICAgIG9mZnNldCArPSBkMVtpbmRleF07CiAgICAgICAgIGluZGV4Kys7CiAgICAgICB9CiAKICAgICAgIG9mZnNldCA9IDA7CiAgICAgICBpbmRleCA9IDA7CiAgICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKLSAgICAgICAgdW5zaWduZWQgaW50IGdvdCA9IGJ1ZmZlci5yZWFkKCZkYXRhX291dFtvZmZzZXRdLCBkaXN0W2QyXVtpbmRleF0pOwotICAgICAgICBCT09TVF9DSEVDS19FUVVBTChnb3QsIGRpc3RbZDJdW2luZGV4XSk7Ci0gICAgICAgIG9mZnNldCArPSBkaXN0W2QyXVtpbmRleF07CisgICAgICAgIHVuc2lnbmVkIGludCBnb3QgPSBidWZmZXIucmVhZCgmZGF0YV9vdXRbb2Zmc2V0XSwgZDJbaW5kZXhdKTsKKyAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ290LCBkMltpbmRleF0pOworICAgICAgICBvZmZzZXQgKz0gZDJbaW5kZXhdOwogICAgICAgICBpbmRleCsrOwogICAgICAgfQogCkBAIC0yMjgsOCArMjI5LDggQEAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X01lbW9yeUJ1ZmZlcl9Xcml0ZV9SZWFkU3RyaW5nICkgewogICBpbml0X2RhdGEoKTsKIAotICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgewotICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAzOyBkMisrKSB7CisgIGZvciAoYXV0byAmIGQxIDogZGlzdCkgeworICAgIGZvciAoYXV0byAmIGQyIDogZGlzdCkgewogICAgICAgVE1lbW9yeUJ1ZmZlciBidWZmZXIoMTYpOwogICAgICAgc3RyaW5nIG91dHB1dDsKICAgICAgIGludCBvZmZzZXQ7CkBAIC0yMzgsMTcgKzIzOSwxNyBAQAogICAgICAgb2Zmc2V0ID0gMDsKICAgICAgIGluZGV4ID0gMDsKICAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewotICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKKyAgICAgICAgYnVmZmVyLndyaXRlKCZkYXRhW29mZnNldF0sIGQxW2luZGV4XSk7CisgICAgICAgIG9mZnNldCArPSBkMVtpbmRleF07CiAgICAgICAgIGluZGV4Kys7CiAgICAgICB9CiAKICAgICAgIG9mZnNldCA9IDA7CiAgICAgICBpbmRleCA9IDA7CiAgICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKLSAgICAgICAgdW5zaWduZWQgaW50IGdvdCA9IGJ1ZmZlci5yZWFkQXBwZW5kVG9TdHJpbmcob3V0cHV0LCBkaXN0W2QyXVtpbmRleF0pOwotICAgICAgICBCT09TVF9DSEVDS19FUVVBTChnb3QsIGRpc3RbZDJdW2luZGV4XSk7Ci0gICAgICAgIG9mZnNldCArPSBkaXN0W2QyXVtpbmRleF07CisgICAgICAgIHVuc2lnbmVkIGludCBnb3QgPSBidWZmZXIucmVhZEFwcGVuZFRvU3RyaW5nKG91dHB1dCwgZDJbaW5kZXhdKTsKKyAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ290LCBkMltpbmRleF0pOworICAgICAgICBvZmZzZXQgKz0gZDJbaW5kZXhdOwogICAgICAgICBpbmRleCsrOwogICAgICAgfQogCkBAIC0yNjIsOCArMjYzLDggQEAKIAogICAvLyBEbyBzaG9ydGVyIHdyaXRlcyBhbmQgcmVhZHMgc28gd2UgZG9uJ3QgYWxpZ24gdG8gcG93ZXItb2YtdHdvIGJvdW5kYXJpZXMuCiAKLSAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKLSAgICBmb3IgKGludCBkMiA9IDA7IGQyIDwgMzsgZDIrKykgeworICBmb3IgKGF1dG8gJiBkMSA6IGRpc3QpIHsKKyAgICBmb3IgKGF1dG8gJiBkMiA6IGRpc3QpIHsKICAgICAgIFRNZW1vcnlCdWZmZXIgYnVmZmVyKDE2KTsKICAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOwogICAgICAgaW50IG9mZnNldDsKQEAgLTI3MywxNiArMjc0LDE2IEBACiAgICAgICAgIG9mZnNldCA9IDA7CiAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgd2hpbGUgKG9mZnNldCA8ICgxPDwxNSktNDIpIHsKLSAgICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOworICAgICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVtvZmZzZXRdLCBkMVtpbmRleF0pOworICAgICAgICAgIG9mZnNldCArPSBkMVtpbmRleF07CiAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgfQogCiAgICAgICAgIG9mZnNldCA9IDA7CiAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgd2hpbGUgKG9mZnNldCA8ICgxPDwxNSktNDIpIHsKLSAgICAgICAgICBidWZmZXIucmVhZCgmZGF0YV9vdXRbb2Zmc2V0XSwgZGlzdFtkMl1baW5kZXhdKTsKLSAgICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMl1baW5kZXhdOworICAgICAgICAgIGJ1ZmZlci5yZWFkKCZkYXRhX291dFtvZmZzZXRdLCBkMltpbmRleF0pOworICAgICAgICAgIG9mZnNldCArPSBkMltpbmRleF07CiAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgfQogCkBAIC0zMDIsOCArMzAzLDggQEAKICAgLy8gUHVsbCB0aGUgYnVmZmVyIG91dCBvZiB0aGUgbG9vcCBzbyBpdHMgc3RhdGUgZ2V0cyB3b3JrZWQgaGFyZGVyLgogICBUTWVtb3J5QnVmZmVyIGJ1ZmZlcigxNik7CiAKLSAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKLSAgICBmb3IgKGludCBkMiA9IDA7IGQyIDwgMzsgZDIrKykgeworICBmb3IgKGF1dG8gJiBkMSA6IGRpc3QpIHsKKyAgICBmb3IgKGF1dG8gJiBkMiA6IGRpc3QpIHsKICAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOwogICAgICAgaW50IG9mZnNldDsKICAgICAgIGludCBpbmRleDsKQEAgLTMxMiwxNiArMzEzLDE2IEBACiAgICAgICAgIG9mZnNldCA9IDA7CiAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgd2hpbGUgKG9mZnNldCA8ICgxPDwxNSktNDIpIHsKLSAgICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOworICAgICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVtvZmZzZXRdLCBkMVtpbmRleF0pOworICAgICAgICAgIG9mZnNldCArPSBkMVtpbmRleF07CiAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgfQogCiAgICAgICAgIG9mZnNldCA9IDA7CiAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgd2hpbGUgKG9mZnNldCA8ICgxPDwxNSktNDIpIHsKLSAgICAgICAgICBidWZmZXIucmVhZCgmZGF0YV9vdXRbb2Zmc2V0XSwgZGlzdFtkMl1baW5kZXhdKTsKLSAgICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMl1baW5kZXhdOworICAgICAgICAgIGJ1ZmZlci5yZWFkKCZkYXRhX291dFtvZmZzZXRdLCBkMltpbmRleF0pOworICAgICAgICAgIG9mZnNldCArPSBkMltpbmRleF07CiAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgfQogCkBAIC0zNDAsOCArMzQxLDggQEAKICAgLy8gRG8gc2hvcnRlciB3cml0ZXMgYW5kIHJlYWRzIHNvIHdlIGRvbid0IGFsaWduIHRvIHBvd2VyLW9mLXR3byBib3VuZGFyaWVzLgogICAvLyBQdWxsIHRoZSBidWZmZXIgb3V0IG9mIHRoZSBsb29wIHNvIGl0cyBzdGF0ZSBnZXRzIHdvcmtlZCBoYXJkZXIuCiAKLSAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKLSAgICBmb3IgKGludCBkMiA9IDA7IGQyIDwgMzsgZDIrKykgeworICBmb3IgKGF1dG8gJiBkMSA6IGRpc3QpIHsKKyAgICBmb3IgKGF1dG8gJiBkMiA6IGRpc3QpIHsKICAgICAgIFRNZW1vcnlCdWZmZXIgYnVmZmVyKDE2KTsKICAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTNdOwogCkBAIC0zNDksNyArMzUwLDcgQEAKICAgICAgIGludCB3cml0ZV9pbmRleCA9IDA7CiAgICAgICB1bnNpZ25lZCBpbnQgdG9fd3JpdGUgPSAoMTw8MTQpLTQyOwogICAgICAgd2hpbGUgKHRvX3dyaXRlID4gMCkgewotICAgICAgICBpbnQgd3JpdGVfYW10ID0gKHN0ZDo6bWluKShkaXN0W2QxXVt3cml0ZV9pbmRleF0sIHRvX3dyaXRlKTsKKyAgICAgICAgaW50IHdyaXRlX2FtdCA9IChzdGQ6Om1pbikoZDFbd3JpdGVfaW5kZXhdLCB0b193cml0ZSk7CiAgICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVt3cml0ZV9vZmZzZXRdLCB3cml0ZV9hbXQpOwogICAgICAgICB3cml0ZV9vZmZzZXQgKz0gd3JpdGVfYW10OwogICAgICAgICB3cml0ZV9pbmRleCsrOwpAQCAtMzYwLDcgKzM2MSw3IEBACiAgICAgICBpbnQgcmVhZF9pbmRleCA9IDA7CiAgICAgICB1bnNpZ25lZCBpbnQgdG9fcmVhZCA9ICgxPDwxMyktNDI7CiAgICAgICB3aGlsZSAodG9fcmVhZCA+IDApIHsKLSAgICAgICAgaW50IHJlYWRfYW10ID0gKHN0ZDo6bWluKShkaXN0W2QyXVtyZWFkX2luZGV4XSwgdG9fcmVhZCk7CisgICAgICAgIGludCByZWFkX2FtdCA9IChzdGQ6Om1pbikoZDJbcmVhZF9pbmRleF0sIHRvX3JlYWQpOwogICAgICAgICBpbnQgZ290ID0gYnVmZmVyLnJlYWQoJmRhdGFfb3V0W3JlYWRfb2Zmc2V0XSwgcmVhZF9hbXQpOwogICAgICAgICBCT09TVF9DSEVDS19FUVVBTChnb3QsIHJlYWRfYW10KTsKICAgICAgICAgcmVhZF9vZmZzZXQgKz0gcmVhZF9hbXQ7CkBAIC0zNzQsNyArMzc1LDcgQEAKICAgICAgIGludCBzZWNvbmRfaW5kZXggPSB3cml0ZV9pbmRleC0xOwogICAgICAgdW5zaWduZWQgaW50IHRvX3NlY29uZCA9ICgxPDwxNCkrNDI7CiAgICAgICB3aGlsZSAodG9fc2Vjb25kID4gMCkgewotICAgICAgICBpbnQgc2Vjb25kX2FtdCA9IChzdGQ6Om1pbikoZGlzdFtkMV1bc2Vjb25kX2luZGV4XSwgdG9fc2Vjb25kKTsKKyAgICAgICAgaW50IHNlY29uZF9hbXQgPSAoc3RkOjptaW4pKGQxW3NlY29uZF9pbmRleF0sIHRvX3NlY29uZCk7CiAgICAgICAgIC8vcHJpbnRmKCIlZFxuIiwgc2Vjb25kX2FtdCk7CiAgICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVtzZWNvbmRfb2Zmc2V0XSwgc2Vjb25kX2FtdCk7CiAgICAgICAgIHNlY29uZF9vZmZzZXQgKz0gc2Vjb25kX2FtdDsKQEAgLTM5OCwxNyArMzk5LDE2IEBACiAgICAgMTw8MTQsIDE8PDE3LAogICB9OwogCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIChzaXplcykgLyBzaXplb2YgKHNpemVzWzBdKTsgaSsrKSB7Ci0gICAgaW50IHNpemUgPSBzaXplc1tpXTsKLSAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICBmb3IgKGludCBzaXplIDogc2l6ZXMpIHsKKyAgICBmb3IgKGF1dG8gJiBkMSA6IGRpc3QpIHsKICAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKDE2KSk7CiAgICAgICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyLCBzaXplKTsKIAogICAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgICBpbnQgaW5kZXggPSAwOwogICAgICAgd2hpbGUgKG9mZnNldCA8IDE8PDE1KSB7Ci0gICAgICAgIHRyYW5zLndyaXRlKCZkYXRhW29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7Ci0gICAgICAgIG9mZnNldCArPSBkaXN0W2QxXVtpbmRleF07CisgICAgICAgIHRyYW5zLndyaXRlKCZkYXRhW29mZnNldF0sIGQxW2luZGV4XSk7CisgICAgICAgIG9mZnNldCArPSBkMVtpbmRleF07CiAgICAgICAgIGluZGV4Kys7CiAgICAgICB9CiAgICAgICB0cmFucy5mbHVzaCgpOwpAQCAtNDI5LDkgKzQyOSw4IEBACiAgICAgMTw8MTQsIDE8PDE3LAogICB9OwogCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIChzaXplcykgLyBzaXplb2YgKHNpemVzWzBdKTsgaSsrKSB7Ci0gICAgaW50IHNpemUgPSBzaXplc1tpXTsKLSAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICBmb3IgKGludCBzaXplIDogc2l6ZXMpIHsKKyAgICBmb3IgKGF1dG8gJiBkMSA6IGRpc3QpIHsKICAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIHNpemVvZihkYXRhKSkpOwogICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0IHRyYW5zKGJ1ZmZlciwgc2l6ZSk7CiAgICAgICB1aW50OF90IGRhdGFfb3V0WzE8PDE1XTsKQEAgLTQ0Miw4ICs0NDEsOCBAQAogICAgICAgICAvLyBOb3RlOiB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoICJyZWFkIiBiZWNhdXNlIFRCdWZmZXJlZFRyYW5zcG9ydAogICAgICAgICAvLyBkb2Vzbid0IHRyeSBsb29wIG92ZXIgcmVhZHMsIHNvIHdlIGdldCBzaG9ydCByZWFkcy4gIFdlIGRvbid0CiAgICAgICAgIC8vIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUsIHNvIHRoYXQgbWVzc2VzIHVzIHVwLgotICAgICAgICB0cmFucy5yZWFkQWxsKCZkYXRhX291dFtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOwotICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOworICAgICAgICB0cmFucy5yZWFkQWxsKCZkYXRhX291dFtvZmZzZXRdLCBkMVtpbmRleF0pOworICAgICAgICBvZmZzZXQgKz0gZDFbaW5kZXhdOwogICAgICAgICBpbmRleCsrOwogICAgICAgfQogCkBAIC00NjIsOSArNDYxLDggQEAKICAgICAxPDwxNCwgMTw8MTcsCiAgIH07CiAKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YgKHNpemVzKSAvIHNpemVvZiAoc2l6ZXNbMF0pOyBpKyspIHsKLSAgICBpbnQgc2l6ZSA9IHNpemVzW2ldOwotICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7CisgIGZvciAoaW50IHNpemUgOiBzaXplcykgeworICAgIGZvciAoYXV0byAmIGQxIDogZGlzdCkgewogICAgICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgc2l6ZW9mKGRhdGEpKSk7CiAgICAgICBzaGFyZWRfcHRyPFRTaG9ydFJlYWRUcmFuc3BvcnQ+IHRzaG9ydChuZXcgVFNob3J0UmVhZFRyYW5zcG9ydChidWZmZXIsIDAuMTI1KSk7CiAgICAgICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyLCBzaXplKTsKQEAgLTQ3Niw4ICs0NzQsOCBAQAogICAgICAgICAvLyBOb3RlOiB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoICJyZWFkIiBiZWNhdXNlIFRCdWZmZXJlZFRyYW5zcG9ydAogICAgICAgICAvLyBkb2Vzbid0IHRyeSBsb29wIG92ZXIgcmVhZHMsIHNvIHdlIGdldCBzaG9ydCByZWFkcy4gIFdlIGRvbid0CiAgICAgICAgIC8vIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUsIHNvIHRoYXQgbWVzc2VzIHVzIHVwLgotICAgICAgICB0cmFucy5yZWFkQWxsKCZkYXRhX291dFtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOwotICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOworICAgICAgICB0cmFucy5yZWFkQWxsKCZkYXRhX291dFtvZmZzZXRdLCBkMVtpbmRleF0pOworICAgICAgICBvZmZzZXQgKz0gZDFbaW5kZXhdOwogICAgICAgICBpbmRleCsrOwogICAgICAgfQogCkBAIC00OTYsMTcgKzQ5NCwxNiBAQAogICAgIDE8PDE0LCAxPDwxNywKICAgfTsKIAotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiAoc2l6ZXMpIC8gc2l6ZW9mIChzaXplc1swXSk7IGkrKykgewotICAgIGludCBzaXplID0gc2l6ZXNbaV07Ci0gICAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKKyAgZm9yIChpbnQgc2l6ZSA6IHNpemVzKSB7CisgICAgZm9yIChhdXRvICYgZDEgOiBkaXN0KSB7CiAgICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigxNikpOwogICAgICAgVEZyYW1lZFRyYW5zcG9ydCB0cmFucyhidWZmZXIsIHNpemUpOwogCiAgICAgICBpbnQgb2Zmc2V0ID0gMDsKICAgICAgIGludCBpbmRleCA9IDA7CiAgICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKLSAgICAgICAgdHJhbnMud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKKyAgICAgICAgdHJhbnMud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZDFbaW5kZXhdKTsKKyAgICAgICAgb2Zmc2V0ICs9IGQxW2luZGV4XTsKICAgICAgICAgaW5kZXgrKzsKICAgICAgIH0KICAgICAgIHRyYW5zLmZsdXNoKCk7CkBAIC01MjUsNyArNTIyLDcgQEAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X0ZyYW1lZFRyYW5zcG9ydF9SZWFkICkgewogICBpbml0X2RhdGEoKTsKIAotICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICBmb3IgKGF1dG8gJiBkMSA6IGRpc3QpIHsKICAgICB1aW50OF90IGRhdGFfb3V0WzE8PDE1XTsKICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgICBURnJhbWVkVHJhbnNwb3J0IHRyYW5zKGJ1ZmZlcik7CkBAIC01MzgsOCArNTM1LDggQEAKICAgICBpbnQgaW5kZXggPSAwOwogICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewogICAgICAgLy8gVGhpcyBzaG91bGQgd29yayB3aXRoIHJlYWQgYmVjYXVzZSB3ZSBoYXZlIG9uZSBodWdlIGZyYW1lLgotICAgICAgdHJhbnMucmVhZCgmZGF0YV9vdXRbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgIG9mZnNldCArPSBkaXN0W2QxXVtpbmRleF07CisgICAgICB0cmFucy5yZWFkKCZkYXRhX291dFtvZmZzZXRdLCBkMVtpbmRleF0pOworICAgICAgb2Zmc2V0ICs9IGQxW2luZGV4XTsKICAgICAgIGluZGV4Kys7CiAgICAgfQogCkBAIC01NTksMjMgKzU1NiwyMSBAQAogCiAgIGludCBwcm9ic1tdID0geyAxLCAyLCA0LCA4LCAxNiwgMzIsIH07CiAKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YgKHNpemVzKSAvIHNpemVvZiAoc2l6ZXNbMF0pOyBpKyspIHsKLSAgICBpbnQgc2l6ZSA9IHNpemVzW2ldOwotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZW9mIChwcm9icykgLyBzaXplb2YgKHByb2JzWzBdKTsgaisrKSB7Ci0gICAgICBpbnQgcHJvYiA9IHByb2JzW2pdOwotICAgICAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKKyAgZm9yIChpbnQgc2l6ZSA6IHNpemVzKSB7CisgICAgZm9yIChpbnQgcHJvYiA6IHByb2JzKSB7CisgICAgICBmb3IgKGF1dG8gJiBkMSA6IGRpc3QpIHsKICAgICAgICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoMTYpKTsKICAgICAgICAgVEZyYW1lZFRyYW5zcG9ydCB0cmFucyhidWZmZXIsIHNpemUpOwotICAgICAgICB1aW50OF90IGRhdGFfb3V0WzE8PDE1XTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV9vdXQoMTw8MTcsIDApOwogICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGZsdXNoX3NpemVzOwogCiAgICAgICAgIGludCB3cml0ZV9vZmZzZXQgPSAwOwogICAgICAgICBpbnQgd3JpdGVfaW5kZXggPSAwOwogICAgICAgICBpbnQgZmx1c2hfc2l6ZSA9IDA7CiAgICAgICAgIHdoaWxlICh3cml0ZV9vZmZzZXQgPCAxPDwxNSkgewotICAgICAgICAgIHRyYW5zLndyaXRlKCZkYXRhW3dyaXRlX29mZnNldF0sIGRpc3RbZDFdW3dyaXRlX2luZGV4XSk7Ci0gICAgICAgICAgd3JpdGVfb2Zmc2V0ICs9IGRpc3RbZDFdW3dyaXRlX2luZGV4XTsKLSAgICAgICAgICBmbHVzaF9zaXplICs9IGRpc3RbZDFdW3dyaXRlX2luZGV4XTsKKyAgICAgICAgICB0cmFucy53cml0ZSgmZGF0YVt3cml0ZV9vZmZzZXRdLCBkMVt3cml0ZV9pbmRleF0pOworICAgICAgICAgIHdyaXRlX29mZnNldCArPSBkMVt3cml0ZV9pbmRleF07CisgICAgICAgICAgZmx1c2hfc2l6ZSArPSBkMVt3cml0ZV9pbmRleF07CiAgICAgICAgICAgd3JpdGVfaW5kZXgrKzsKICAgICAgICAgICBpZiAoZmx1c2hfc2l6ZSA+IDAgJiYgcmFuZCgpJXByb2IgPT0gMCkgewogICAgICAgICAgICAgZmx1c2hfc2l6ZXMucHVzaF9iYWNrKGZsdXNoX3NpemUpOwpAQCAtNTkyLDggKzU4Nyw3IEBACiAgICAgICAgIGludCByZWFkX29mZnNldCA9IDA7CiAgICAgICAgIGludCByZWFkX2luZGV4ID0gMDsKIAotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBrID0gMDsgayA8IGZsdXNoX3NpemVzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgaW50IGZzaXplID0gZmx1c2hfc2l6ZXNba107CisgICAgICAgIGZvciAoaW50IGZzaXplIDogZmx1c2hfc2l6ZXMpIHsKICAgICAgICAgICAvLyBXZSBhcmUgZXhwbG9pdGluZyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgVEZyYW1lZFRyYW5zcG9ydC4KICAgICAgICAgICAvLyBUaGUgcmVhZCBidWZmZXIgc3RhcnRzIGVtcHR5IGFuZCBpdCB3aWxsIG5ldmVyIGRvIG1vcmUgdGhhbiBvbmUKICAgICAgICAgICAvLyByZWFkRnJhbWUgcGVyIHJlYWQsIHNvIHdlIHNob3VsZCBhbHdheXMgZ2V0IGV4YWN0bHkgb25lIGZyYW1lLgpAQCAtNjA0LDcgKzU5OCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBCT09TVF9DSEVDS19FUVVBTCgodW5zaWduZWQgaW50KXJlYWRfb2Zmc2V0LCBzaXplb2YoZGF0YSkpOwotICAgICAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsIGRhdGFfb3V0LCBzaXplb2YoZGF0YSkpKTsKKyAgICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCAmZGF0YV9vdXRbMF0sIHNpemVvZihkYXRhKSkpOwogICAgICAgfQogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0LmNwcAppbmRleCAyOTRjOWE2Li4yMWMxZjNiIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0LmNwcApAQCAtMzAsNiArMzAsMTQgQEAKIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KIAorI2lmZGVmIF9fTUlOR1czMl9fCisgICNpbmNsdWRlIDxpby5oPgorICAjaW5jbHVkZSA8dW5pc3RkLmg+CisgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgI2luY2x1ZGUgPGZjbnRsLmg+CisgICNpbmNsdWRlIDxzeXNcc3RhdC5oPgorI2VuZGlmCisKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ1LDIwICs1Myw2IEBACiAgKiBIZWxwZXIgY29kZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vLyBQcm92aWRlIEJPT1NUX1dBUk5fTFQoKSBhbmQgQk9PU1RfV0FSTl9HVCgpLCBpbiBjYXNlIHdlJ3JlIGNvbXBpbGVkCi0vLyB3aXRoIGFuIG9sZGVyIHZlcnNpb24gb2YgYm9vc3QKLSNpZm5kZWYgQk9PU1RfV0FSTl9MVAotI2RlZmluZSBCT09TVF9XQVJOX0NNUChhLCBiLCBvcCwgY2hlY2tfZm4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjaGVja19mbigoYSlvcChiKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAiY2hlY2sgIiBCT09TVF9TVFJJTkdJWkUoYSkgIiAiIEJPT1NUX1NUUklOR0laRShvcCkgIiAiIEJPT1NUX1NUUklOR0laRSggICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgYikgIiBmYWlsZWQ6ICIgQk9PU1RfU1RSSU5HSVpFKGEpICI9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA8PCAoYSkgPDwgIiAiIEJPT1NUX1NUUklOR0laRShiKSAiPSIgPDwgKGIpKQotCi0jZGVmaW5lIEJPT1NUX1dBUk5fTFQoYSwgYikgQk9PU1RfV0FSTl9DTVAoYSwgYiwgPCwgQk9PU1RfV0FSTl9NRVNTQUdFKQotI2RlZmluZSBCT09TVF9XQVJOX0dUKGEsIGIpIEJPT1NUX1dBUk5fQ01QKGEsIGIsID4sIEJPT1NUX1dBUk5fTUVTU0FHRSkKLSNkZWZpbmUgQk9PU1RfV0FSTl9MVChhLCBiKSBCT09TVF9XQVJOX0NNUChhLCBiLCA8LCBCT09TVF9XQVJOX01FU1NBR0UpCi0jZW5kaWYgLy8gQk9PU1RfV0FSTl9MVAotCiAvKioKICAqIENsYXNzIHRvIHJlY29yZCBjYWxscyB0byBmc3luYwogICovCkBAIC03MCwxMiArNjQsMTIgQEAKICAgfTsKICAgdHlwZWRlZiBzdGQ6Omxpc3Q8RnN5bmNDYWxsPiBDYWxsTGlzdDsKIAotICBGc3luY0xvZygpIHt9CisgIEZzeW5jTG9nKCkgPSBkZWZhdWx0OwogCiAgIHZvaWQgZnN5bmMoaW50IGZkKSB7CiAgICAgKHZvaWQpZmQ7CiAgICAgRnN5bmNDYWxsIGNhbGw7Ci0gICAgZ2V0dGltZW9mZGF5KCZjYWxsLnRpbWUsIE5VTEwpOworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmNhbGwudGltZSwgbnVsbHB0cik7CiAgICAgY2FsbHNfLnB1c2hfYmFjayhjYWxsKTsKICAgfQogCkBAIC05MSw2ICs4NSwyMCBAQAogY2xhc3MgVGVtcEZpbGUgewogcHVibGljOgogICBUZW1wRmlsZShjb25zdCBjaGFyKiBkaXJlY3RvcnksIGNvbnN0IGNoYXIqIHByZWZpeCkgeworICAjaWZkZWYgX19NSU5HVzMyX18KKyAgICAoKHZvaWQpZGlyZWN0b3J5KTsKKyAgICBzaXplX3QgcGF0aF9sZW4gPSBzdHJsZW4ocHJlZml4KSArIDg7CisgICAgcGF0aF8gPSBuZXcgY2hhcltwYXRoX2xlbl07CisgICAgc25wcmludGYocGF0aF8sIHBhdGhfbGVuLCAiJXNYWFhYWFgiLCBwcmVmaXgpOworICAgIGlmIChfbWt0ZW1wX3MocGF0aF8scGF0aF9sZW4pID09IDApIHsKKyAgICAgIGZkXyA9IG9wZW4ocGF0aF8sT19DUkVBVCB8IE9fUkRXUiB8IE9fQklOQVJZLFNfSVJFQUQgfCBTX0lXUklURSk7CisgICAgICBpZiAoZmRfIDwgMCkgeworICAgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigiX21rdGVtcF9zKCkgZmFpbGVkIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCJfbWt0ZW1wX3MoKSBmYWlsZWQiKTsKKyAgICB9CisgICNlbHNlCiAgICAgc2l6ZV90IHBhdGhfbGVuID0gc3RybGVuKGRpcmVjdG9yeSkgKyBzdHJsZW4ocHJlZml4KSArIDg7CiAgICAgcGF0aF8gPSBuZXcgY2hhcltwYXRoX2xlbl07CiAgICAgc25wcmludGYocGF0aF8sIHBhdGhfbGVuLCAiJXMvJXNYWFhYWFgiLCBkaXJlY3RvcnksIHByZWZpeCk7CkBAIC05OSw2ICsxMDcsNyBAQAogICAgIGlmIChmZF8gPCAwKSB7CiAgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigibWtzdGVtcCgpIGZhaWxlZCIpOwogICAgIH0KKyAgI2VuZGlmCiAgIH0KIAogICB+VGVtcEZpbGUoKSB7CkBAIC0xMTQsNyArMTIzLDcgQEAKICAgICBpZiAocGF0aF8pIHsKICAgICAgIDo6dW5saW5rKHBhdGhfKTsKICAgICAgIGRlbGV0ZVtdIHBhdGhfOwotICAgICAgcGF0aF8gPSBOVUxMOworICAgICAgcGF0aF8gPSBudWxscHRyOwogICAgIH0KICAgfQogCkBAIC0xNjcsNyArMTc2LDcgQEAKIAogICB1bnNpZ25lZCBpbnQgbnVtX292ZXIgPSAwOwogICBmb3IgKHVuc2lnbmVkIGludCBuID0gMDsgbiA8IE5VTV9JVEVSQVRJT05TOyArK24pIHsKLSAgICBmdHJ1bmNhdGUoZi5nZXRGRCgpLCAwKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTCgwLCBmdHJ1bmNhdGUoZi5nZXRGRCgpLCAwKSk7CiAKICAgICBURmlsZVRyYW5zcG9ydCogdHJhbnNwb3J0ID0gbmV3IFRGaWxlVHJhbnNwb3J0KGYuZ2V0UGF0aCgpKTsKIApAQCAtMTg2LDE2ICsxOTUsMTYgQEAKICAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydDsKICAgICBzdHJ1Y3QgdGltZXZhbCBlbmQ7CiAKLSAgICBnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZzdGFydCwgbnVsbHB0cik7CiAgICAgZGVsZXRlIHRyYW5zcG9ydDsKLSAgICBnZXR0aW1lb2ZkYXkoJmVuZCwgTlVMTCk7CisgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmZW5kLCBudWxscHRyKTsKIAogICAgIGludCBkZWx0YSA9IHRpbWVfZGlmZigmc3RhcnQsICZlbmQpOwogCiAgICAgLy8gSWYgYW55IGF0dGVtcHQgdGFrZXMgbW9yZSB0aGFuIDUwMG1zLCB0cmVhdCB0aGF0IGFzIGEgZmFpbHVyZS4KICAgICAvLyBUcmVhdCB0aGlzIGFzIGEgZmF0YWwgZmFpbHVyZSwgc28gd2UnbGwgcmV0dXJuIG5vdyBpbnN0ZWFkIG9mCiAgICAgLy8gbG9vcGluZyBvdmVyIGEgdmVyeSBzbG93IG9wZXJhdGlvbi4KLSAgICBCT09TVF9XQVJOX0xUKGRlbHRhLCA1MDAwMDApOworICAgIEJPT1NUX1dBUk4oIGRlbHRhIDwgNTAwMDAwICk7CiAKICAgICAvLyBOb3JtYWxseSwgaXQgdGFrZXMgbGVzcyB0aGFuIDEwMG1zIG9uIG15IGRldiBib3guCiAgICAgLy8gSG93ZXZlciwgaWYgdGhlIGJveCBpcyBoZWF2aWx5IGxvYWRlZCwgc29tZSBvZiB0aGUgdGVzdCBydW5zCkBAIC0yNTUsNyArMjY0LDcgQEAKICAgZGVsZXRlIHRyYW5zcG9ydDsKIAogICAvLyBTdG9wIGxvZ2dpbmcgbmV3IGZzeW5jKCkgY2FsbHMKLSAgZnN5bmNfbG9nID0gTlVMTDsKKyAgZnN5bmNfbG9nID0gbnVsbHB0cjsKIAogICAvLyBFeGFtaW5lIHRoZSBmc3luYygpIGxvZwogICAvLwpAQCAtMjY5LDEzICsyNzgsMTMgQEAKICAgLy8gTWFrZSBzdXJlIFRGaWxlVHJhbnNwb3J0IGNhbGxlZCBmc3luYyBhdCBsZWFzdCBvbmNlCiAgIEJPT1NUX1dBUk5fR0UoY2FsbHMtPnNpemUoKSwgc3RhdGljX2Nhc3Q8RnN5bmNMb2c6OkNhbGxMaXN0OjpzaXplX3R5cGU+KDEpKTsKIAotICBjb25zdCBzdHJ1Y3QgdGltZXZhbCogcHJldl90aW1lID0gTlVMTDsKLSAgZm9yIChGc3luY0xvZzo6Q2FsbExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2FsbHMtPmJlZ2luKCk7IGl0ICE9IGNhbGxzLT5lbmQoKTsgKytpdCkgeworICBjb25zdCBzdHJ1Y3QgdGltZXZhbCogcHJldl90aW1lID0gbnVsbHB0cjsKKyAgZm9yIChjb25zdCBhdXRvICYgY2FsbCA6ICpjYWxscykgewogICAgIGlmIChwcmV2X3RpbWUpIHsKLSAgICAgIGludCBkZWx0YSA9IHRpbWVfZGlmZihwcmV2X3RpbWUsICZpdC0+dGltZSk7Ci0gICAgICBCT09TVF9XQVJOX0xUKGRlbHRhLCBtYXhfYWxsb3dlZF9kZWx0YSk7CisgICAgICBpbnQgZGVsdGEgPSB0aW1lX2RpZmYocHJldl90aW1lLCAmY2FsbC50aW1lKTsKKyAgICAgIEJPT1NUX1dBUk4oIGRlbHRhIDwgbWF4X2FsbG93ZWRfZGVsdGEgKTsKICAgICB9Ci0gICAgcHJldl90aW1lID0gJml0LT50aW1lOworICAgIHByZXZfdGltZSA9ICZjYWxsLnRpbWU7CiAgIH0KIH0KIApAQCAtMzA5LDEzICszMTgsMTMgQEAKICAgdHJhbnNwb3J0LndyaXRlKGJ1ZiwgMSk7CiAKICAgc3RydWN0IHRpbWV2YWwgc3RhcnQ7Ci0gIGdldHRpbWVvZmRheSgmc3RhcnQsIE5VTEwpOworICBUSFJJRlRfR0VUVElNRU9GREFZKCZzdGFydCwgbnVsbHB0cik7CiAKICAgZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCAxMDsgKytuKSB7CiAgICAgdHJhbnNwb3J0LmZsdXNoKCk7CiAKICAgICBzdHJ1Y3QgdGltZXZhbCBub3c7Ci0gICAgZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJm5vdywgbnVsbHB0cik7CiAKICAgICAvLyBGYWlsIGlmIGF0IGFueSBwb2ludCB3ZSd2ZSBiZWVuIHJ1bm5pbmcgZm9yIGxvbmdlciB0aGFuIGhhbGYgYSBzZWNvbmQuCiAgICAgLy8gKFdpdGggdGhlIGJ1Z2d5IGNvZGUsIFRGaWxlVHJhbnNwb3J0IHVzZWQgdG8gdGFrZSAzIHNlY29uZHMgcGVyIGZsdXNoKCkpCkBAIC0zMjMsNyArMzMyLDcgQEAKICAgICAvLyBVc2UgYSBmYXRhbCBmYWlsIHNvIHdlIGJyZWFrIG91dCBlYXJseSwgcmF0aGVyIHRoYW4gY29udGludWluZyB0byBtYWtlCiAgICAgLy8gbWFueSBtb3JlIHNsb3cgZmx1c2goKSBjYWxscy4KICAgICBpbnQgZGVsdGEgPSB0aW1lX2RpZmYoJnN0YXJ0LCAmbm93KTsKLSAgICBCT09TVF9XQVJOX0xUKGRlbHRhLCAyMDAwMDAwKTsKKyAgICBCT09TVF9XQVJOKCBkZWx0YSA8IDIwMDAwMDAgKTsKICAgfQogfQogCkBAIC0zNDAsMTEgKzM0OSwxMSBAQAogCiB2b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewogICBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0c1tdCi0gICAgICA9IHt7ImhlbHAiLCBmYWxzZSwgTlVMTCwgJ2gnfSwgeyJ0bXAtZGlyIiwgdHJ1ZSwgTlVMTCwgJ3QnfSwge05VTEwsIDAsIE5VTEwsIDB9fTsKKyAgICAgID0ge3siaGVscCIsIGZhbHNlLCBudWxscHRyLCAnaCd9LCB7InRtcC1kaXIiLCB0cnVlLCBudWxscHRyLCAndCd9LCB7bnVsbHB0ciwgMCwgbnVsbHB0ciwgMH19OwogCiAgIHdoaWxlICh0cnVlKSB7CiAgICAgb3B0b3B0ID0gMTsKLSAgICBpbnQgb3B0Y2hhciA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJodDoiLCBsb25nX29wdHMsIE5VTEwpOworICAgIGludCBvcHRjaGFyID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImh0OiIsIGxvbmdfb3B0cywgbnVsbHB0cik7CiAgICAgaWYgKG9wdGNoYXIgPT0gLTEpIHsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTM2Nyw2ICszNzYsMjQgQEAKICAgfQogfQogCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworc3RhdGljIGludCBteUFyZ2MgPSAwOworc3RhdGljIGNoYXIgKipteUFyZ3YgPSBudWxscHRyOworCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlRGaWxlVHJhbnNwb3J0VGVzdCI7CisKKyAgLy8gUGFyc2UgYXJndW1lbnRzCisgIHBhcnNlX2FyZ3MobXlBcmdjLG15QXJndik7CisgIHJldHVybiB0cnVlOworfQorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIHsKKyAgbXlBcmdjID0gYXJnYzsKKyAgbXlBcmd2ID0gYXJndjsKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLGFyZ2MsYXJndik7Cit9CisjZWxzZQogYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewogICBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlRGaWxlVHJhbnNwb3J0VGVzdCI7CiAKQEAgLTM3NCwzICs0MDEsNCBAQAogICBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwogICByZXR1cm4gTlVMTDsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RNZW1vcnlCdWZmZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UTWVtb3J5QnVmZmVyVGVzdC5jcHAKaW5kZXggODQxMDNlMy4uNDJmOTcxMSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RNZW1vcnlCdWZmZXJUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCkBAIC0yMSw4ICsyMSw5IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KICNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgImdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIgogCiBCT09TVF9BVVRPX1RFU1RfU1VJVEUoVE1lbW9yeUJ1ZmZlclRlc3QpCkBAIC0zMCw3ICszMSw3IEBACiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBzdGQ6OmNvdXQ7CiB1c2luZyBzdGQ6OmVuZGw7CiB1c2luZyBzdGQ6OnN0cmluZzsKQEAgLTc5LDE5ICs4MCwxMSBAQAogICBCT09TVF9DSEVDSyhhID09IGEyKTsKIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jb3B5KSB7Ci0gIHN0cmluZyogc3RyMSA9IG5ldyBzdHJpbmcoImFiY2QxMjM0Iik7Ci0gIGNvbnN0IGNoYXIqIGRhdGExID0gc3RyMS0+ZGF0YSgpOwotICBUTWVtb3J5QnVmZmVyIGJ1ZigodWludDhfdCopc3RyMS0+ZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyMS0+bGVuZ3RoKCkpLAorQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWFkQXBwZW5kVG9TdHJpbmcpIHsKKyAgc3RyaW5nIHN0cjEgPSAiYWJjZDEyMzQiOworICBUTWVtb3J5QnVmZmVyIGJ1ZigodWludDhfdCopc3RyMS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHIxLmxlbmd0aCgpKSwKICAgICAgICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlcjo6Q09QWSk7Ci0gIGRlbGV0ZSBzdHIxOwotICBzdHJpbmcqIHN0cjIgPSBuZXcgc3RyaW5nKCJwbHNyZXVzZSIpOwotICBib29sIG9ial9yZXVzZSA9IChzdHIxID09IHN0cjIpOwotICBib29sIGRhdF9yZXVzZSA9IChkYXRhMSA9PSBzdHIyLT5kYXRhKCkpOwotICBCT09TVF9URVNUX01FU1NBR0UoIk9iamVjdCByZXVzZTogIiA8PCBvYmpfcmV1c2UgPDwgIiAgIERhdGEgcmV1c2U6ICIgPDwgZGF0X3JldXNlCi0gICAgICAgICAgICAgICAgPDwgKChvYmpfcmV1c2UgJiYgZGF0X3JldXNlKSA/ICIgICBZQVkhIiA6ICIiKSk7Ci0gIGRlbGV0ZSBzdHIyOwogCiAgIHN0cmluZyBzdHIzID0gInd4eXoiLCBzdHI0ID0gIjY3ODkiOwogICBidWYucmVhZEFwcGVuZFRvU3RyaW5nKHN0cjMsIDQpOwpAQCAtMTE2LDQgKzEwOSw1MiBAQAogICBCT09TVF9DSEVDS19OT19USFJPVyhidWYyLndyaXRlKChjb25zdCB1aW50OF90KikiYmFyIiwgMykpOwogfQogCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2RlZmF1bHRfbWF4aW11bV9idWZmZXJfc2l6ZSkKK3sKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCksIFRNZW1vcnlCdWZmZXIoKS5nZXRNYXhCdWZmZXJTaXplKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2RlZmF1bHRfYnVmZmVyX3NpemUpCit7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDEwMjQsIFRNZW1vcnlCdWZmZXIoKS5nZXRCdWZmZXJTaXplKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2Vycm9yX3NldF9tYXhfYnVmZmVyX3NpemVfdG9vX3NtYWxsKQoreworICBUTWVtb3J5QnVmZmVyIGJ1ZjsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coYnVmLnNldE1heEJ1ZmZlclNpemUoYnVmLmdldEJ1ZmZlclNpemUoKSAtIDEpLCBUVHJhbnNwb3J0RXhjZXB0aW9uKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9tYXhpbXVtX2J1ZmZlcl9zaXplKQoreworICBUTWVtb3J5QnVmZmVyIGJ1ZjsKKyAgYnVmLnNldE1heEJ1ZmZlclNpemUoODE5Mik7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNtYWxsX2J1ZmYoMSk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA4MTkyOyArK2kpCisgIHsKKyAgICBidWYud3JpdGUoJnNtYWxsX2J1ZmZbMF0sIDEpOworICB9CisKKyAgQk9PU1RfQ0hFQ0tfVEhST1coYnVmLndyaXRlKCZzbWFsbF9idWZmWzBdLCAxKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfbWVtb3J5X2J1ZmZlcl90b19nZXRfc2l6ZW9mX29iamVjdHMpCit7CisgIC8vIFRoaXMgaXMgYSBkZW1vbnN0cmF0aW9uIG9mIGhvdyB0byB1c2UgVE1lbW9yeUJ1ZmZlciB0byBkZXRlcm1pbmUKKyAgLy8gdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiBhIHRocmlmdCBvYmplY3QgaW4gdGhlIEJpbmFyeSBwcm90b2NvbC4KKyAgLy8gU2VlIFRIUklGVC0zNDgwCisKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1CdWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sKG5ldyBUQmluYXJ5UHJvdG9jb2wobWVtQnVmZmVyKSk7CisKKyAgdGhyaWZ0Ojp0ZXN0OjpYdHJ1Y3Qgb2JqZWN0OworICBvYmplY3QuaTMyX3RoaW5nID0gMTA7CisgIG9iamVjdC5pNjRfdGhpbmcgPSAzMDsKKyAgb2JqZWN0LnN0cmluZ190aGluZyA9ICJ3aG8ncyB5b3VyIGRhZGR5PyI7CisKKyAgdWludDMyX3Qgc2l6ZSA9IG9iamVjdC53cml0ZShiaW5hcnlQcm90Y29sLmdldCgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoNDcsIHNpemUpOworfQorCiBCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQwYzEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIgorCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxldmVudC5oPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0RmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTb2NrZXQ7CisKK3N0cnVjdCBIYW5kbGVyIDogcHVibGljIHRlc3Q6OlBhcmVudFNlcnZpY2VJZiB7CisgIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSBvdmVycmlkZSB7IHN0cmluZ3NfLnB1c2hfYmFjayhzKTsgfQorICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBfcmV0dXJuKSBvdmVycmlkZSB7IF9yZXR1cm4gPSBzdHJpbmdzXzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187CisKKyAgLy8gZHVtbXkgb3ZlcnJpZGVzIG5vdCB1c2VkIGluIHRoaXMgdGVzdAorICBpbnQzMl90IGluY3JlbWVudEdlbmVyYXRpb24oKSBvdmVycmlkZSB7IHJldHVybiAwOyB9CisgIGludDMyX3QgZ2V0R2VuZXJhdGlvbigpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgdm9pZCBnZXREYXRhV2FpdChzdGQ6OnN0cmluZyYsIGNvbnN0IGludDMyX3QpIG92ZXJyaWRlIHt9CisgIHZvaWQgb25ld2F5V2FpdCgpIG92ZXJyaWRlIHt9CisgIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYpIG92ZXJyaWRlIHt9CisgIHZvaWQgdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoY29uc3Qgc3RkOjpzdHJpbmcmKSBvdmVycmlkZSB7fQorfTsKKworYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGgga2V5RGlyOworYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggY2VydEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKQoreworICByZXR1cm4ga2V5RGlyIC8gZmlsZW5hbWU7Cit9CisKK3N0cnVjdCBHbG9iYWxGaXh0dXJlU1NMCit7CisgICAgR2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjOyArK2kpCisgICAgICB7CisgICAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJhcmd2WyUxJV0gPSBcIiUyJVwiIikgJSBpICUgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W2ldKTsKKyAgICAgIH0KKworI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gT3BlblNTTCBjYWxscyBzZW5kKCkgd2l0aG91dCBNU0dfTk9TSUdQSVBFIHNvIHdyaXRpbmcgdG8gYSBzb2NrZXQgdGhhdCBoYXMKKyAgICAgIC8vIGRpc2Nvbm5lY3RlZCBjYW4gY2F1c2UgYSBTSUdQSVBFIHNpZ25hbC4uLgorICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworI2VuZGlmCisKKyAgICAgIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24odHJ1ZSk7CisgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojppbml0aWFsaXplT3BlblNTTCgpOworCisgICAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6Y3VycmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkgLyAidGVzdCIgLyAia2V5cyI7CisgICAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgICB7CisgICAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoKG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlttYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgLSAxXSk7CisgICAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgICAgeworICAgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGhlIGxhc3QgYXJndW1lbnQgdG8gdGhpcyB0ZXN0IG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXN0IGNlcnRpZmljYXRlKHMpLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+R2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6Y2xlYW51cE9wZW5TU0woKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKyNlbmRpZgorICAgIH0KK307CisKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKTsKKyNlbHNlCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKQorI2VuZGlmCisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeTsKKworICBwU2VydmVyU29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgic2VydmVyLmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoY2VydEZpbGUoInNlcnZlci5rZXkiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPnNlcnZlcih0cnVlKTsKKyAgcmV0dXJuIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5OworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7CisKKyAgcENsaWVudFNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+YXV0aGVudGljYXRlKHRydWUpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJjbGllbnQuY3J0Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgiY2xpZW50LmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2VydEZpbGUoIkNBLnBlbSIpLnN0cmluZygpLmNfc3RyKCkpOworICByZXR1cm4gcENsaWVudFNvY2tldEZhY3Rvcnk7Cit9CisKK2NsYXNzIEZpeHR1cmUgeworcHJpdmF0ZToKKyAgc3RydWN0IExpc3RlbkV2ZW50SGFuZGxlciA6IHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICBMaXN0ZW5FdmVudEhhbmRsZXIoTXV0ZXgqIG11dGV4KSA6IGxpc3Rlbk1vbml0b3JfKG11dGV4KSwgcmVhZHlfKGZhbHNlKSB7fQorCisgICAgICB2b2lkIHByZVNlcnZlKCkgb3ZlcnJpZGUgLyogb3ZlcnJpZGUgKi8geworICAgICAgICBHdWFyZCBnKGxpc3Rlbk1vbml0b3JfLm11dGV4KCkpOworICAgICAgICByZWFkeV8gPSB0cnVlOworICAgICAgICBsaXN0ZW5Nb25pdG9yXy5ub3RpZnkoKTsKKyAgICAgIH0KKworICAgICAgTW9uaXRvciBsaXN0ZW5Nb25pdG9yXzsKKyAgICAgIGJvb2wgcmVhZHlfOworICB9OworCisgIHN0cnVjdCBSdW5uZXIgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZSB7CisgICAgaW50IHBvcnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGV2ZW50X2Jhc2U+IHVzZXJFdmVudEJhc2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuRXZlbnRIYW5kbGVyPiBsaXN0ZW5IYW5kbGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0PiBzb2NrZXQ7CisgICAgTXV0ZXggbXV0ZXhfOworCisgICAgUnVubmVyKCk6cG9ydCgwKSB7CisgICAgICBsaXN0ZW5IYW5kbGVyLnJlc2V0KG5ldyBMaXN0ZW5FdmVudEhhbmRsZXIoJm11dGV4XykpOworICAgIH0KKworICAgIHZvaWQgcnVuKCkgb3ZlcnJpZGUgeworICAgICAgLy8gV2hlbiBiaW5kaW5nIHRvIGV4cGxpY2l0IHBvcnQsIGFsbG93IHJldHJ5aW5nIHRvIHdvcmthcm91bmQgYmluZCBmYWlsdXJlcyBvbiBwb3J0cyBpbiB1c2UKKyAgICAgIGludCByZXRyeUNvdW50ID0gcG9ydCA/IDEwIDogMDsKKyAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOyAgCisgICAgICBzdGFydFNlcnZlcihyZXRyeUNvdW50KTsKKyAgICB9CisKKyAgICB2b2lkIHJlYWR5QmFycmllcigpIHsKKyAgICAgIC8vIGJsb2NrIHVudGlsIHNlcnZlciBpcyBsaXN0ZW5pbmcgYW5kIHJlYWR5IHRvIGFjY2VwdCBjb25uZWN0aW9ucworICAgICAgR3VhcmQgZyhtdXRleF8pOworICAgICAgd2hpbGUgKCFsaXN0ZW5IYW5kbGVyLT5yZWFkeV8pIHsKKyAgICAgICAgbGlzdGVuSGFuZGxlci0+bGlzdGVuTW9uaXRvcl8ud2FpdCgpOworICAgICAgfQorICAgIH0KKyAgcHJpdmF0ZToKKyAgICB2b2lkIHN0YXJ0U2VydmVyKGludCByZXRyeV9jb3VudCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgc29ja2V0LnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChwb3J0LCBwU2VydmVyU29ja2V0RmFjdG9yeSkpOworICAgICAgICBzZXJ2ZXIucmVzZXQobmV3IHNlcnZlcjo6VE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0KSk7CisJICAgICAgc2VydmVyLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIobGlzdGVuSGFuZGxlcik7CisgICAgICAgIHNlcnZlci0+c2V0TnVtSU9UaHJlYWRzKDEpOworICAgICAgICBpZiAodXNlckV2ZW50QmFzZSkgeworICAgICAgICAgIHNlcnZlci0+cmVnaXN0ZXJFdmVudHModXNlckV2ZW50QmFzZS5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2VydmVyLT5zZXJ2ZSgpOworICAgICAgfSBjYXRjaCAoY29uc3QgdHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgICBpZiAocmV0cnlfY291bnQgPiAwKSB7CisgICAgICAgICAgKytwb3J0OworICAgICAgICAgIHN0YXJ0U2VydmVyKHJldHJ5X2NvdW50IC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgc3RydWN0IEV2ZW50RGVsZXRlciB7CisgICAgdm9pZCBvcGVyYXRvcigpKGV2ZW50X2Jhc2UqIHApIHsgZXZlbnRfYmFzZV9mcmVlKHApOyB9CisgIH07CisKK3Byb3RlY3RlZDoKKyAgRml4dHVyZSgpIDogcHJvY2Vzc29yKG5ldyB0ZXN0OjpQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yKHN0ZDo6bWFrZV9zaGFyZWQ8SGFuZGxlcj4oKSkpIHt9CisKKyAgfkZpeHR1cmUoKSB7CisgICAgaWYgKHNlcnZlcikgeworICAgICAgc2VydmVyLT5zdG9wKCk7CisgICAgfQorICAgIGlmICh0aHJlYWQpIHsKKyAgICAgIHRocmVhZC0+am9pbigpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0RXZlbnRCYXNlKGV2ZW50X2Jhc2UqIHVzZXJfZXZlbnRfYmFzZSkgeworICAgIHVzZXJFdmVudEJhc2VfLnJlc2V0KHVzZXJfZXZlbnRfYmFzZSwgRXZlbnREZWxldGVyKCkpOworICB9CisKKyAgaW50IHN0YXJ0U2VydmVyKGludCBwb3J0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5lcj4gcnVubmVyKG5ldyBSdW5uZXIpOworICAgIHJ1bm5lci0+cG9ydCA9IHBvcnQ7CisgICAgcnVubmVyLT5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgcnVubmVyLT51c2VyRXZlbnRCYXNlID0gdXNlckV2ZW50QmFzZV87CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KAorICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5KGZhbHNlKSk7CisgICAgdGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHJ1bm5lcik7CisgICAgdGhyZWFkLT5zdGFydCgpOworICAgIHJ1bm5lci0+cmVhZHlCYXJyaWVyKCk7CisKKyAgICBzZXJ2ZXIgPSBydW5uZXItPnNlcnZlcjsKKyAgICByZXR1cm4gcnVubmVyLT5wb3J0OworICB9CisKKyAgYm9vbCBjYW5Db21tdW5pY2F0ZShpbnQgc2VydmVyUG9ydCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3RvcnkgPSBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNvY2tldCA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHNlcnZlclBvcnQpOworICAgIHNvY2tldC0+b3BlbigpOworICAgIHRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQgY2xpZW50KHN0ZDo6bWFrZV9zaGFyZWQ8cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbD4oCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8dHJhbnNwb3J0OjpURnJhbWVkVHJhbnNwb3J0Pihzb2NrZXQpKSk7CisgICAgY2xpZW50LmFkZFN0cmluZygiZm9vIik7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ3M7CisgICAgY2xpZW50LmdldFN0cmluZ3Moc3RyaW5ncyk7CisgICAgcmV0dXJuIHN0cmluZ3Muc2l6ZSgpID09IDEgJiYgIShzdHJpbmdzWzBdLmNvbXBhcmUoImZvbyIpKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8ZXZlbnRfYmFzZT4gdXNlckV2ZW50QmFzZV87CisgIHN0ZDo6c2hhcmVkX3B0cjx0ZXN0OjpQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yPiBwcm9jZXNzb3I7Citwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcj4gc2VydmVyOworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiB0aHJlYWQ7CisKK307CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0KQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShnZXRfc3BlY2lmaWVkX3BvcnQsIEZpeHR1cmUpIHsKKyAgaW50IHNwZWNpZmllZF9wb3J0ID0gc3RhcnRTZXJ2ZXIoMTIzNDUpOworICBCT09TVF9SRVFVSVJFX0dFKHNwZWNpZmllZF9wb3J0LCAxMjM0NSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCksIHNwZWNpZmllZF9wb3J0KTsKKyAgQk9PU1RfQ0hFQ0soY2FuQ29tbXVuaWNhdGUoc3BlY2lmaWVkX3BvcnQpKTsKKworICBzZXJ2ZXItPnN0b3AoKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoZ2V0X2Fzc2lnbmVkX3BvcnQsIEZpeHR1cmUpIHsKKyAgaW50IHNwZWNpZmllZF9wb3J0ID0gc3RhcnRTZXJ2ZXIoMCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoc3BlY2lmaWVkX3BvcnQsIDApOworICBpbnQgYXNzaWduZWRfcG9ydCA9IHNlcnZlci0+Z2V0TGlzdGVuUG9ydCgpOworICBCT09TVF9SRVFVSVJFX05FKGFzc2lnbmVkX3BvcnQsIDApOworICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShhc3NpZ25lZF9wb3J0KSk7CisKKyAgc2VydmVyLT5zdG9wKCk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHByb3ZpZGVfZXZlbnRfYmFzZSwgRml4dHVyZSkgeworICBldmVudF9iYXNlKiBlYiA9IGV2ZW50X2Jhc2VfbmV3KCk7CisgIHNldEV2ZW50QmFzZShlYik7CisgIHN0YXJ0U2VydmVyKDApOworCisgIC8vIGFzc2VydCB0aGF0IHRoZSBzZXJ2ZXIgd29ya3MKKyAgQk9PU1RfQ0hFQ0soY2FuQ29tbXVuaWNhdGUoc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCkpKTsKKyNpZiBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA+IDB4MDIwMTA0MDAKKyAgLy8gYWxzbyBhc3NlcnQgdGhhdCB0aGUgZXZlbnRfYmFzZSBpcyBhY3R1YWxseSB1c2VkIHdoZW4gaXQncyBlYXN5CisgIEJPT1NUX0NIRUNLX0dUKGV2ZW50X2Jhc2VfZ2V0X251bV9ldmVudHMoZWIsIEVWRU5UX0JBU0VfQ09VTlRfQURERUQpLCAwKTsKKyNlbmRpZgorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0LmNwcAppbmRleCA4ZjRlZjZlLi5mOWFhYjRjIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU2VydmVyVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwCkBAIC0xOSw0MiArMTksMTA0IEBACiAKICNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVE5vbmJsb2NraW5nU2VydmVyVGVzdAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KLSNpbmNsdWRlIDxib29zdC9zbWFydF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAorI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmgiCiAjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oIgogI2luY2x1ZGUgInRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCIKIAogI2luY2x1ZGUgImdlbi1jcHAvUGFyZW50U2VydmljZS5oIgogCiAjaW5jbHVkZSA8ZXZlbnQuaD4KIAordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyOwordXNpbmcgc3RkOjptYWtlX3NoYXJlZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogCiBzdHJ1Y3QgSGFuZGxlciA6IHB1YmxpYyB0ZXN0OjpQYXJlbnRTZXJ2aWNlSWYgewotICB2b2lkIGFkZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykgeyBzdHJpbmdzXy5wdXNoX2JhY2socyk7IH0KLSAgdm9pZCBnZXRTdHJpbmdzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgX3JldHVybikgeyBfcmV0dXJuID0gc3RyaW5nc187IH0KKyAgdm9pZCBhZGRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIG92ZXJyaWRlIHsgc3RyaW5nc18ucHVzaF9iYWNrKHMpOyB9CisgIHZvaWQgZ2V0U3RyaW5ncyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIF9yZXR1cm4pIG92ZXJyaWRlIHsgX3JldHVybiA9IHN0cmluZ3NfOyB9CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzXzsKIAogICAvLyBkdW1teSBvdmVycmlkZXMgbm90IHVzZWQgaW4gdGhpcyB0ZXN0Ci0gIGludDMyX3QgaW5jcmVtZW50R2VuZXJhdGlvbigpIHsgcmV0dXJuIDA7IH0KLSAgaW50MzJfdCBnZXRHZW5lcmF0aW9uKCkgeyByZXR1cm4gMDsgfQotICB2b2lkIGdldERhdGFXYWl0KHN0ZDo6c3RyaW5nJiwgY29uc3QgaW50MzJfdCkge30KLSAgdm9pZCBvbmV3YXlXYWl0KCkge30KLSAgdm9pZCBleGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJikge30KLSAgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYpIHt9CisgIGludDMyX3QgaW5jcmVtZW50R2VuZXJhdGlvbigpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgaW50MzJfdCBnZXRHZW5lcmF0aW9uKCkgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICB2b2lkIGdldERhdGFXYWl0KHN0ZDo6c3RyaW5nJiwgY29uc3QgaW50MzJfdCkgb3ZlcnJpZGUge30KKyAgdm9pZCBvbmV3YXlXYWl0KCkgb3ZlcnJpZGUge30KKyAgdm9pZCBleGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJikgb3ZlcnJpZGUge30KKyAgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYpIG92ZXJyaWRlIHt9CiB9OwogCiBjbGFzcyBGaXh0dXJlIHsKIHByaXZhdGU6Ci0gIHN0cnVjdCBSdW5uZXIgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKLSAgICBib29sIGVycm9yOwotICAgIHZpcnR1YWwgdm9pZCBydW4oKSB7Ci0gICAgICBlcnJvciA9IGZhbHNlOworICBzdHJ1Y3QgTGlzdGVuRXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICAgIHB1YmxpYzoKKyAgICAgIExpc3RlbkV2ZW50SGFuZGxlcihNdXRleCogbXV0ZXgpIDogbGlzdGVuTW9uaXRvcl8obXV0ZXgpLCByZWFkeV8oZmFsc2UpIHt9CisKKyAgICAgIHZvaWQgcHJlU2VydmUoKSBvdmVycmlkZSAvKiBvdmVycmlkZSAqLyB7CisgICAgICAgIEd1YXJkIGcobGlzdGVuTW9uaXRvcl8ubXV0ZXgoKSk7CisgICAgICAgIHJlYWR5XyA9IHRydWU7CisgICAgICAgIGxpc3Rlbk1vbml0b3JfLm5vdGlmeSgpOworICAgICAgfQorCisgICAgICBNb25pdG9yIGxpc3Rlbk1vbml0b3JfOworICAgICAgYm9vbCByZWFkeV87CisgIH07CisKKyAgc3RydWN0IFJ1bm5lciA6IHB1YmxpYyBSdW5uYWJsZSB7CisgICAgaW50IHBvcnQ7CisgICAgc2hhcmVkX3B0cjxldmVudF9iYXNlPiB1c2VyRXZlbnRCYXNlOworICAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yOworICAgIHNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKKyAgICBzaGFyZWRfcHRyPExpc3RlbkV2ZW50SGFuZGxlcj4gbGlzdGVuSGFuZGxlcjsKKyAgICBzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBzb2NrZXQ7CisgICAgTXV0ZXggbXV0ZXhfOworCisgICAgUnVubmVyKCkgeworICAgICAgcG9ydCA9IDA7CisgICAgICBsaXN0ZW5IYW5kbGVyLnJlc2V0KG5ldyBMaXN0ZW5FdmVudEhhbmRsZXIoJm11dGV4XykpOworICAgIH0KKworICAgIHZvaWQgcnVuKCkgb3ZlcnJpZGUgeworICAgICAgLy8gV2hlbiBiaW5kaW5nIHRvIGV4cGxpY2l0IHBvcnQsIGFsbG93IHJldHJ5aW5nIHRvIHdvcmthcm91bmQgYmluZCBmYWlsdXJlcyBvbiBwb3J0cyBpbiB1c2UKKyAgICAgIGludCByZXRyeUNvdW50ID0gcG9ydCA/IDEwIDogMDsKKyAgICAgIHN0YXJ0U2VydmVyKHJldHJ5Q291bnQpOworICAgIH0KKworICAgIHZvaWQgcmVhZHlCYXJyaWVyKCkgeworICAgICAgLy8gYmxvY2sgdW50aWwgc2VydmVyIGlzIGxpc3RlbmluZyBhbmQgcmVhZHkgdG8gYWNjZXB0IGNvbm5lY3Rpb25zCisgICAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgICB3aGlsZSAoIWxpc3RlbkhhbmRsZXItPnJlYWR5XykgeworICAgICAgICBsaXN0ZW5IYW5kbGVyLT5saXN0ZW5Nb25pdG9yXy53YWl0KCk7CisgICAgICB9CisgICAgfQorICBwcml2YXRlOgorICAgIHZvaWQgc3RhcnRTZXJ2ZXIoaW50IHJldHJ5X2NvdW50KSB7CiAgICAgICB0cnkgeworICAgICAgICBzb2NrZXQucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgICAgc2VydmVyLnJlc2V0KG5ldyBzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHNvY2tldCkpOworICAgICAgICBzZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihsaXN0ZW5IYW5kbGVyKTsKKyAgICAgICAgaWYgKHVzZXJFdmVudEJhc2UpIHsKKyAgICAgICAgICBzZXJ2ZXItPnJlZ2lzdGVyRXZlbnRzKHVzZXJFdmVudEJhc2UuZ2V0KCkpOworICAgICAgICB9CiAgICAgICAgIHNlcnZlci0+c2VydmUoKTsKLSAgICAgIH0gY2F0Y2ggKGNvbnN0IFRFeGNlcHRpb24mKSB7Ci0gICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgIH0gY2F0Y2ggKGNvbnN0IHRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgaWYgKHJldHJ5X2NvdW50ID4gMCkgeworICAgICAgICAgICsrcG9ydDsKKyAgICAgICAgICBzdGFydFNlcnZlcihyZXRyeV9jb3VudCAtIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93OworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9OwpAQCAtNjQsNyArMTI2LDcgQEAKICAgfTsKIAogcHJvdGVjdGVkOgotICBGaXh0dXJlKCkgOiBwcm9jZXNzb3IobmV3IHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3IoYm9vc3Q6Om1ha2Vfc2hhcmVkPEhhbmRsZXI+KCkpKSB7fQorICBGaXh0dXJlKCkgOiBwcm9jZXNzb3IobmV3IHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3IobWFrZV9zaGFyZWQ8SGFuZGxlcj4oKSkpIHt9CiAKICAgfkZpeHR1cmUoKSB7CiAgICAgaWYgKHNlcnZlcikgewpAQCAtODAsNDUgKzE0MiwyNiBAQAogICB9CiAKICAgaW50IHN0YXJ0U2VydmVyKGludCBwb3J0KSB7Ci0gICAgYm9vc3Q6OnNjb3BlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KAotICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KAotI2lmICFVU0VfQk9PU1RfVEhSRUFEICYmICFVU0VfU1REX1RIUkVBRAotICAgICAgICAgICAgY29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6T1RIRVIsCi0gICAgICAgICAgICBjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpOT1JNQUwsCi0gICAgICAgICAgICAxLAotI2VuZGlmCi0gICAgICAgICAgICB0cnVlKSk7CisgICAgc2hhcmVkX3B0cjxSdW5uZXI+IHJ1bm5lcihuZXcgUnVubmVyKTsKKyAgICBydW5uZXItPnBvcnQgPSBwb3J0OworICAgIHJ1bm5lci0+cHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgIHJ1bm5lci0+dXNlckV2ZW50QmFzZSA9IHVzZXJFdmVudEJhc2VfOwogCi0gICAgaW50IHJldHJ5X2NvdW50ID0gcG9ydCA/IDEwIDogMDsKLSAgICBmb3IgKGludCBwID0gcG9ydDsgcCA8PSBwb3J0ICsgcmV0cnlfY291bnQ7IHArKykgewotICAgICAgc2VydmVyLnJlc2V0KG5ldyBzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHApKTsKLSAgICAgIGlmICh1c2VyRXZlbnRCYXNlXykgewotICAgICAgICB0cnkgewotICAgICAgICAgIHNlcnZlci0+cmVnaXN0ZXJFdmVudHModXNlckV2ZW50QmFzZV8uZ2V0KCkpOwotICAgICAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uJikgewotICAgICAgICAgIC8vIHJldHJ5IHdpdGggbmV4dCBwb3J0Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5lcj4gcnVubmVyKG5ldyBSdW5uZXIpOwotICAgICAgcnVubmVyLT5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0gICAgICB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQocnVubmVyKTsKLSAgICAgIHRocmVhZC0+c3RhcnQoKTsKLSAgICAgIC8vIHdhaXQgNTBtcyBmb3IgdGhlIHNlcnZlciB0byBiZWdpbiBsaXN0ZW5pbmcKLSAgICAgIFRIUklGVF9TTEVFUF9VU0VDKDUwMDAwKTsKLSAgICAgIGlmICghcnVubmVyLT5lcnJvcikgewotICAgICAgICByZXR1cm4gcDsKLSAgICAgIH0KLSAgICB9Ci0gICAgdGhyb3cgdHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uKHRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc3RhcnQgc2VydmVyLiIpOworICAgIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgKKyAgICAgICAgbmV3IFRocmVhZEZhY3RvcnkoZmFsc2UpKTsKKyAgICB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQocnVubmVyKTsKKyAgICB0aHJlYWQtPnN0YXJ0KCk7CisgICAgcnVubmVyLT5yZWFkeUJhcnJpZXIoKTsKKworICAgIHNlcnZlciA9IHJ1bm5lci0+c2VydmVyOworICAgIHJldHVybiBydW5uZXItPnBvcnQ7CiAgIH0KIAogICBib29sIGNhbkNvbW11bmljYXRlKGludCBzZXJ2ZXJQb3J0KSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUU29ja2V0PiBzb2NrZXQobmV3IHRyYW5zcG9ydDo6VFNvY2tldCgibG9jYWxob3N0Iiwgc2VydmVyUG9ydCkpOworICAgIHNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUU29ja2V0PiBzb2NrZXQobmV3IHRyYW5zcG9ydDo6VFNvY2tldCgibG9jYWxob3N0Iiwgc2VydmVyUG9ydCkpOwogICAgIHNvY2tldC0+b3BlbigpOwotICAgIHRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQgY2xpZW50KGJvb3N0OjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sPigKLSAgICAgICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPHRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydD4oc29ja2V0KSkpOworICAgIHRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQgY2xpZW50KG1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w+KAorICAgICAgICBtYWtlX3NoYXJlZDx0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ+KHNvY2tldCkpKTsKICAgICBjbGllbnQuYWRkU3RyaW5nKCJmb28iKTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKICAgICBjbGllbnQuZ2V0U3RyaW5ncyhzdHJpbmdzKTsKQEAgLTEyNiwxMiArMTY5LDEzIEBACiAgIH0KIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8ZXZlbnRfYmFzZT4gdXNlckV2ZW50QmFzZV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3I+IHByb2Nlc3NvcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZDsKLQorICBzaGFyZWRfcHRyPGV2ZW50X2Jhc2U+IHVzZXJFdmVudEJhc2VfOworICBzaGFyZWRfcHRyPHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3I+IHByb2Nlc3NvcjsKIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKKyAgc2hhcmVkX3B0cjxzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcj4gc2VydmVyOworcHJpdmF0ZToKKyAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkOworCiB9OwogCiBCT09TVF9BVVRPX1RFU1RfU1VJVEUoVE5vbmJsb2NraW5nU2VydmVyVGVzdCkKQEAgLTE0Myw3ICsxODcsNiBAQAogICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShzcGVjaWZpZWRfcG9ydCkpOwogCiAgIHNlcnZlci0+c3RvcCgpOwotICBCT09TVF9DSEVDS19FUVVBTChzZXJ2ZXItPmdldExpc3RlblBvcnQoKSwgc3BlY2lmaWVkX3BvcnQpOwogfQogCiBCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShnZXRfYXNzaWduZWRfcG9ydCwgRml4dHVyZSkgewpAQCAtMTU0LDcgKzE5Nyw2IEBACiAgIEJPT1NUX0NIRUNLKGNhbkNvbW11bmljYXRlKGFzc2lnbmVkX3BvcnQpKTsKIAogICBzZXJ2ZXItPnN0b3AoKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCksIDApOwogfQogCiBCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShwcm92aWRlX2V2ZW50X2Jhc2UsIEZpeHR1cmUpIHsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UUGlwZUludGVycnVwdFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RQaXBlSW50ZXJydXB0VGVzdC5jcHAKaW5kZXggZTJmMjQ4OS4uMjQyM2Y1NiAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RQaXBlSW50ZXJydXB0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RQaXBlSW50ZXJydXB0VGVzdC5jcHAKQEAgLTIyLDE3ICsyMiwxOCBAQAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdGVzdF90b29scy5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3Rfc3VpdGUuaHBwPgogCi0jaW5jbHVkZSA8Ym9vc3QvYmluZC5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvY2hyb25vL2R1cmF0aW9uLmhwcD4KICNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lX2R1cmF0aW9uLmhwcD4KICNpbmNsdWRlIDxib29zdC90aHJlYWQvdGhyZWFkLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVTZXJ2ZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZTsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogCiBCT09TVF9BVVRPX1RFU1RfU1VJVEUoVFBpcGVJbnRlcnJ1cHRUZXN0KQogCkBAIC01MSw3ICs1Miw3IEBACiAgIHsKICAgICBmb3IgKDs7KQogICAgIHsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRlbXAgPSBwaXBlLT5hY2NlcHQoKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0ZW1wID0gcGlwZS0+YWNjZXB0KCk7CiAgICAgfQogICB9CiAgIGNhdGNoICguLi4pIHsvKmp1c3Qgd2FudCB0byBtYWtlIHN1cmUgbm90aGluZyBjcmFzaGVzKi8gfQpAQCAtNjMsMTQgKzY0LDE0IEBACiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHN0cmVzc19waXBlX2FjY2VwdF9pbnRlcnJ1cHRpb24pIHsKLSAgaW50IGludGVycnVwdEl0ZXJzID0gMTAwOworICBpbnQgaW50ZXJydXB0SXRlcnMgPSAxMDsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IGludGVycnVwdEl0ZXJzOyArK2kpCiAgIHsKICAgICBUUGlwZVNlcnZlciBwaXBlU2VydmVyKCJUUGlwZUludGVycnVwdFRlc3QiKTsKICAgICBwaXBlU2VydmVyLmxpc3RlbigpOwotICAgIGJvb3N0Ojp0aHJlYWQgYWNjZXB0VGhyZWFkKGJvb3N0OjpiaW5kKGFjY2VwdFdvcmtlciwgJnBpcGVTZXJ2ZXIpKTsKLSAgICBib29zdDo6dGhyZWFkIGludGVycnVwdFRocmVhZChib29zdDo6YmluZChpbnRlcnJ1cHRXb3JrZXIsICZwaXBlU2VydmVyKSk7CisgICAgYm9vc3Q6OnRocmVhZCBhY2NlcHRUaHJlYWQoc3RkOjpiaW5kKGFjY2VwdFdvcmtlciwgJnBpcGVTZXJ2ZXIpKTsKKyAgICBib29zdDo6dGhyZWFkIGludGVycnVwdFRocmVhZChzdGQ6OmJpbmQoaW50ZXJydXB0V29ya2VyLCAmcGlwZVNlcnZlcikpOwogICAgIHRyeQogICAgIHsKICAgICAgIGZvciAoOzspCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAKaW5kZXggMzIyMWZiOS4uZjMwOTFhNCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcApAQCAtMTgsNiArMTgsNyBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogCkBAIC0yNywxMSArMjgsMTIgQEAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogCiBCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlYWRfd3JpdGUpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gdW5kZXJseWluZyhuZXcgVE1lbW9yeUJ1ZmZlcik7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHBpcGUobmV3IFRNZW1vcnlCdWZmZXIpOwotICBib29zdDo6c2hhcmVkX3B0cjxUUGlwZWRUcmFuc3BvcnQ+IHRyYW5zKG5ldyBUUGlwZWRUcmFuc3BvcnQodW5kZXJseWluZywgcGlwZSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gdW5kZXJseWluZyhuZXcgVE1lbW9yeUJ1ZmZlcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBwaXBlKG5ldyBUTWVtb3J5QnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlZFRyYW5zcG9ydD4gdHJhbnMobmV3IFRQaXBlZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBwaXBlKSk7CiAKICAgdWludDhfdCBidWZmZXJbNF07CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjY4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdF9zdWl0ZS5ocHA+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+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHN0YXRpY19wb2ludGVyX2Nhc3Q8VFNTTFNvY2tldD4oYWNjZXB0ZWQpLT5zZXRSZWN2VGltZW91dCgxMDAwKTsKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghcGVla1RocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGludGVycnVwdGVkIGNoaWxkIHBlZWsiKTsKKworICAvLyB3YWl0IGZvciB0aGUgcmVjZWl2ZSB0aW1lb3V0IHRvIGtpY2sgaW4KKyAgcGVla1RocmVhZC5qb2luKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBjbGllbnRTb2NrLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcAppbmRleCBmNTMwNzcxLi5iODhjMzViIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVFNlcnZlckludGVncmF0aW9uVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwCkBAIC0xOCwyMiArMTgsMjIgQEAKICAqLwogCiAjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QKKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvYmluZC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcHRpbWUuaHBwPgogI2luY2x1ZGUgPGJvb3N0L2ZvcmVhY2guaHBwPgogI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvbWFrZV9zaGFyZWQuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKLSNpbmNsdWRlICJUZXN0UG9ydEZpeHR1cmUuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOwpAQCAtNTUsNiArNTUsOSBAQAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNpbXBsZVNlcnZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFRocmVhZGVkU2VydmVyOwordXNpbmcgc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDsKK3VzaW5nIHN0ZDo6bWFrZV9zaGFyZWQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dGVzdDo6UGFyZW50U2VydmljZUNsaWVudDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlSWY7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dGVzdDo6UGFyZW50U2VydmljZUlmRmFjdG9yeTsKQEAgLTcxLDIxICs3NCwyMSBAQAogY2xhc3MgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIsIHB1YmxpYyBNb25pdG9yIHsKIHB1YmxpYzoKICAgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkgOiBpc0xpc3RlbmluZ18oZmFsc2UpLCBhY2NlcHRlZF8oMCkge30KLSAgdmlydHVhbCB+VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkge30KLSAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkgeworICB+VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworICB2b2lkIHByZVNlcnZlKCkgb3ZlcnJpZGUgewogICAgIFN5bmNocm9uaXplZCBzeW5jKCp0aGlzKTsKICAgICBpc0xpc3RlbmluZ18gPSB0cnVlOwogICAgIG5vdGlmeSgpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgdm9pZCogY3JlYXRlQ29udGV4dChzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSBvdmVycmlkZSB7CiAgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOwogICAgICsrYWNjZXB0ZWRfOwogICAgIG5vdGlmeSgpOwogCiAgICAgKHZvaWQpaW5wdXQ7CiAgICAgKHZvaWQpb3V0cHV0OwotICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBudWxscHRyOwogICB9CiAgIGJvb2wgaXNMaXN0ZW5pbmcoKSBjb25zdCB7IHJldHVybiBpc0xpc3RlbmluZ187IH0KICAgdWludDY0X3QgYWNjZXB0ZWRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGFjY2VwdGVkXzsgfQpAQCAtMTAyLDM2ICsxMDUsMzYgQEAKIHB1YmxpYzoKICAgUGFyZW50SGFuZGxlcigpIDogZ2VuZXJhdGlvbl8oMCkge30KIAotICBpbnQzMl90IGluY3JlbWVudEdlbmVyYXRpb24oKSB7CisgIGludDMyX3QgaW5jcmVtZW50R2VuZXJhdGlvbigpIG92ZXJyaWRlIHsKICAgICBHdWFyZCBnKG11dGV4Xyk7CiAgICAgcmV0dXJuICsrZ2VuZXJhdGlvbl87CiAgIH0KIAotICBpbnQzMl90IGdldEdlbmVyYXRpb24oKSB7CisgIGludDMyX3QgZ2V0R2VuZXJhdGlvbigpIG92ZXJyaWRlIHsKICAgICBHdWFyZCBnKG11dGV4Xyk7CiAgICAgcmV0dXJuIGdlbmVyYXRpb25fOwogICB9CiAKLSAgdm9pZCBhZGRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgdm9pZCBhZGRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIG92ZXJyaWRlIHsKICAgICBHdWFyZCBnKG11dGV4Xyk7CiAgICAgc3RyaW5nc18ucHVzaF9iYWNrKHMpOwogICB9CiAKLSAgdm9pZCBnZXRTdHJpbmdzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgX3JldHVybikgeworICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBfcmV0dXJuKSBvdmVycmlkZSB7CiAgICAgR3VhcmQgZyhtdXRleF8pOwogICAgIF9yZXR1cm4gPSBzdHJpbmdzXzsKICAgfQogCi0gIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGNvbnN0IGludDMyX3QgbGVuZ3RoKSB7CisgIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGNvbnN0IGludDMyX3QgbGVuZ3RoKSBvdmVycmlkZSB7CiAgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShfcmV0dXJuKTsKICAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGxlbmd0aCk7CiAgIH0KIAotICB2b2lkIG9uZXdheVdhaXQoKSB7fQorICB2b2lkIG9uZXdheVdhaXQoKSBvdmVycmlkZSB7fQogCi0gIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeyBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKG1lc3NhZ2UpOyB9CisgIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgb3ZlcnJpZGUgeyBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKG1lc3NhZ2UpOyB9CiAKLSAgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeyBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKG1lc3NhZ2UpOyB9CisgIHZvaWQgdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIG92ZXJyaWRlIHsgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShtZXNzYWdlKTsgfQogCiBwcm90ZWN0ZWQ6CiAgIE11dGV4IG11dGV4XzsKQEAgLTE0NSwzMCArMTQ4LDM2IEBACiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBUU2VydmVyVHlwZT4KLWNsYXNzIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlIDogcHVibGljIFRlc3RQb3J0Rml4dHVyZSB7CitjbGFzcyBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZSB7CiBwdWJsaWM6Ci0gIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgX3Byb2Nlc3NvckZhY3RvcnkpCisgIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBfcHJvY2Vzc29yRmFjdG9yeSkKICAgICA6IHBTZXJ2ZXIobmV3IFRTZXJ2ZXJUeXBlKF9wcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIG1fc2VydmVyUG9ydCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSkpKSwKLSAgICAgIHBFdmVudEhhbmRsZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPihuZXcgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVFNlcnZlclNvY2tldCgibG9jYWxob3N0IiwgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkpKSksCisgICAgICBwRXZlbnRIYW5kbGVyKHNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPihuZXcgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKSksCisgICAgYlN0cmVzc0RvbmUoZmFsc2UpLAorICAgIGJTdHJlc3NDb25uZWN0aW9uQ291bnQoMCksCisgICAgYlN0cmVzc1JlcXVlc3RDb3VudCgwKSB7CiAgICAgcFNlcnZlci0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKHBFdmVudEhhbmRsZXIpOwogICB9CiAKLSAgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmUoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIF9wcm9jZXNzb3IpCisgIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIF9wcm9jZXNzb3IpCiAgICAgOiBwU2VydmVyKAogICAgICAgICAgIG5ldyBUU2VydmVyVHlwZShfcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PihuZXcgVFNlcnZlclNvY2tldCgibG9jYWxob3N0IiwgMCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkpKSksCi0gICAgICBwRXZlbnRIYW5kbGVyKGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcj4obmV3IFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PihuZXcgVFNlcnZlclNvY2tldCgibG9jYWxob3N0IiwgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KSkpLAorICAgICAgcEV2ZW50SGFuZGxlcihzaGFyZWRfcHRyPFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcj4obmV3IFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcikpLAorICAgICAgYlN0cmVzc0RvbmUoZmFsc2UpLAorICAgIGJTdHJlc3NDb25uZWN0aW9uQ291bnQoMCksCisgICAgYlN0cmVzc1JlcXVlc3RDb3VudCgwKSB7CiAgICAgcFNlcnZlci0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKHBFdmVudEhhbmRsZXIpOwogICB9CiAKICAgdm9pZCBzdGFydFNlcnZlcigpIHsKLSAgICBwU2VydmVyVGhyZWFkLnJlc2V0KG5ldyBib29zdDo6dGhyZWFkKGJvb3N0OjpiaW5kKCZUU2VydmVyVHlwZTo6c2VydmUsIHBTZXJ2ZXIuZ2V0KCkpKSk7CisgICAgcFNlcnZlclRocmVhZC5yZXNldChuZXcgYm9vc3Q6OnRocmVhZChzdGQ6OmJpbmQoJlRTZXJ2ZXJUeXBlOjpzZXJ2ZSwgcFNlcnZlci5nZXQoKSkpKTsKIAogICAgIC8vIGJsb2NrIHVudGlsIGxpc3RlbigpIGNvbXBsZXRlcyBzbyBjbGllbnRzIHdpbGwgYmUgYWJsZSB0byBjb25uZWN0CiAgICAgU3luY2hyb25pemVkIHN5bmMoKihwRXZlbnRIYW5kbGVyLmdldCgpKSk7CkBAIC0xNzYsNyArMTg1LDcgQEAKICAgICAgIHBFdmVudEhhbmRsZXItPndhaXQoKTsKICAgICB9CiAKLSAgICBCT09TVF9URVNUX01FU1NBR0UoInNlcnZlciBpcyBsaXN0ZW5pbmciKTsKKyAgICBCT09TVF9URVNUX01FU1NBR0UoIiAgc2VydmVyIGlzIGxpc3RlbmluZyIpOwogICB9CiAKICAgdm9pZCBibG9ja1VudGlsQWNjZXB0ZWQodWludDY0X3QgbnVtQWNjZXB0ZWQpIHsKQEAgLTE4NSw2MiArMTk0LDEzNiBAQAogICAgICAgcEV2ZW50SGFuZGxlci0+d2FpdCgpOwogICAgIH0KIAotICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJzZXJ2ZXIgaGFzIGFjY2VwdGVkICUxJSIpICUgbnVtQWNjZXB0ZWQpOworICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCIgIHNlcnZlciBoYXMgYWNjZXB0ZWQgJTElIikgJSBudW1BY2NlcHRlZCk7CiAgIH0KIAogICB2b2lkIHN0b3BTZXJ2ZXIoKSB7CiAgICAgaWYgKHBTZXJ2ZXJUaHJlYWQpIHsKICAgICAgIHBTZXJ2ZXItPnN0b3AoKTsKLSAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgic2VydmVyIHN0b3AgY29tcGxldGVkIik7CisgICAgICBCT09TVF9URVNUX01FU1NBR0UoIiAgc2VydmVyIHN0b3AgY29tcGxldGVkIik7CiAKICAgICAgIHBTZXJ2ZXJUaHJlYWQtPmpvaW4oKTsKLSAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgic2VydmVyIHRocmVhZCBqb2luZWQiKTsKKyAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgiICBzZXJ2ZXIgdGhyZWFkIGpvaW5lZCIpOwogICAgICAgcFNlcnZlclRocmVhZC5yZXNldCgpOwogICAgIH0KICAgfQogCiAgIH5UU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZSgpIHsgc3RvcFNlcnZlcigpOyB9CiAKLSAgaW50IGdldFNlcnZlclBvcnQoKSB7Ci0gICAgVFNlcnZlclNvY2tldCogcFNvY2sgPSBkeW5hbWljX2Nhc3Q8VFNlcnZlclNvY2tldCo+KHBTZXJ2ZXItPmdldFNlcnZlclRyYW5zcG9ydCgpLmdldCgpKTsKLSAgICByZXR1cm4gcFNvY2stPmdldFBvcnQoKTsKKyAgLyoqCisgICAqIFBlcmZvcm1zIGEgYmFzZWxpbmUgdGVzdCB3aGVyZSBzb21lIGNsaWVudHMgYXJlIG9wZW5lZCBhbmQgaXNzdWUgYSBzaW5nbGUgb3BlcmF0aW9uCisgICAqIGFuZCB0aGVuIGRpc2Nvbm5lY3QgYXQgZGlmZmVyZW50IGludGVydmFscy4KKyAgICogXHBhcmFtW2luXSAgbnVtVG9NYWtlICB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cworICAgKiBccGFyYW1baW5dICBleHBlY3RlZEhXTSAgdGhlIGhpZ2ggd2F0ZXIgbWFyayB3ZSBleHBlY3Qgb2YgY29uY3VycmVuY3kKKyAgICogXHBhcmFtW2luXSAgcHVycG9zZSAgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdGVzdCBmb3IgbG9nZ2luZyBwdXJwb3NlcworICAgKi8KKyAgdm9pZCBiYXNlbGluZShpbnQ2NF90IG51bVRvTWFrZSwgaW50NjRfdCBleHBlY3RlZEhXTSwgY29uc3Qgc3RkOjpzdHJpbmcmIHB1cnBvc2UpIHsKKyAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiVGVzdGluZyAlMSU6ICUyJSB3aXRoICUzJSBjbGllbnRzLCBleHBlY3QgJTQlIEhXTSIpCisgICAgICAgICAgICAlIHR5cGVpZChUU2VydmVyVHlwZSkubmFtZSgpICUgcHVycG9zZSAlIG51bVRvTWFrZSAlIGV4cGVjdGVkSFdNKTsKKworICAgIHN0YXJ0U2VydmVyKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXQ+ID4gaG9sZFNvY2tldHM7CisgICAgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPiA+IGhvbGRUaHJlYWRzOworCisgICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgbnVtVG9NYWtlOyArK2kpIHsKKyAgICAgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2sobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKKyAgICAgIGhvbGRTb2NrZXRzLnB1c2hfYmFjayhwQ2xpZW50U29jayk7CisgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcENsaWVudFByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wocENsaWVudFNvY2spKTsKKyAgICAgIFBhcmVudFNlcnZpY2VDbGllbnQgY2xpZW50KHBDbGllbnRQcm90b2NvbCk7CisgICAgICBwQ2xpZW50U29jay0+b3BlbigpOworICAgICAgY2xpZW50LmluY3JlbWVudEdlbmVyYXRpb24oKTsKKyAgICAgIGhvbGRUaHJlYWRzLnB1c2hfYmFjayhzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+KAorICAgICAgICAgIG5ldyBib29zdDo6dGhyZWFkKHN0ZDo6YmluZCgmVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU6OmRlbGF5Q2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMoMTAgKiBudW1Ub01ha2UpKSkpKTsKKyAgICB9CisKKyAgICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZEhXTSwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkpOworCisgICAgQk9PU1RfRk9SRUFDSCAoc2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPiBwVGhyZWFkLCBob2xkVGhyZWFkcykgeyBwVGhyZWFkLT5qb2luKCk7IH0KKyAgICBob2xkVGhyZWFkcy5jbGVhcigpOworICAgIGhvbGRTb2NrZXRzLmNsZWFyKCk7CisKKyAgICBzdG9wU2VydmVyKCk7CiAgIH0KIAotICB2b2lkIGRlbGF5Q2xvc2UoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdG9DbG9zZSwgYm9vc3Q6OnBvc2l4X3RpbWU6OnRpbWVfZHVyYXRpb24gYWZ0ZXIpIHsKKyAgLyoqCisgICAqIEhlbHBlciBtZXRob2QgdXNlZCB0byBjbG9zZSBhIGNvbm5lY3Rpb24gYWZ0ZXIgYSBkZWxheS4KKyAgICogXHBhcmFtW2luXSAgdG9DbG9zZSAgdGhlIGNvbm5lY3Rpb24gdG8gY2xvc2UKKyAgICogXHBhcmFtW2luXSAgYWZ0ZXIgIHRoZSBkZWxheSB0byBpbXBvc2UKKyAgICovCisgIHZvaWQgZGVsYXlDbG9zZShzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRvQ2xvc2UsIGJvb3N0Ojpwb3NpeF90aW1lOjp0aW1lX2R1cmF0aW9uIGFmdGVyKSB7CiAgICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChhZnRlcik7CiAgICAgdG9DbG9zZS0+Y2xvc2UoKTsKICAgfQogCi0gIHZvaWQgYmFzZWxpbmUoaW50NjRfdCBudW1Ub01ha2UsIGludDY0X3QgZXhwZWN0ZWRIV00pIHsKLSAgICBzdGFydFNlcnZlcigpOwotICAgIHN0ZDo6dmVjdG9yPGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+ID4gaG9sZFNvY2tldHM7Ci0gICAgc3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gPiBob2xkVGhyZWFkczsKLQotICAgIGZvciAoaW50NjRfdCBpID0gMDsgaSA8IG51bVRvTWFrZTsgKytpKSB7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jayhuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOwotICAgICAgaG9sZFNvY2tldHMucHVzaF9iYWNrKHBDbGllbnRTb2NrKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcENsaWVudFByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wocENsaWVudFNvY2spKTsKLSAgICAgIFBhcmVudFNlcnZpY2VDbGllbnQgY2xpZW50KHBDbGllbnRQcm90b2NvbCk7Ci0gICAgICBwQ2xpZW50U29jay0+b3BlbigpOwotICAgICAgY2xpZW50LmluY3JlbWVudEdlbmVyYXRpb24oKTsKLSAgICAgIGhvbGRUaHJlYWRzLnB1c2hfYmFjayhib29zdDo6c2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPigKLSAgICAgICAgICBuZXcgYm9vc3Q6OnRocmVhZChib29zdDo6YmluZCgmVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU6OmRlbGF5Q2xvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U29jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMoMTAwICogbnVtVG9NYWtlKSkpKSk7Ci0gICAgfQotCi0gICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRIV00sIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudEhXTSgpKTsKLSAgICBzdG9wU2VydmVyKCk7Ci0gICAgQk9PU1RfRk9SRUFDSCAoYm9vc3Q6OnNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gcFRocmVhZCwgaG9sZFRocmVhZHMpIHsgcFRocmVhZC0+am9pbigpOyB9Ci0gICAgaG9sZFRocmVhZHMuY2xlYXIoKTsKLSAgICBob2xkU29ja2V0cy5jbGVhcigpOworICAvKioKKyAgICogXHJldHVybnMgIHRoZSBzZXJ2ZXIgcG9ydCBudW1iZXIKKyAgICovCisgIGludCBnZXRTZXJ2ZXJQb3J0KCkgeworICAgIGF1dG8qIHBTb2NrID0gZHluYW1pY19jYXN0PFRTZXJ2ZXJTb2NrZXQqPihwU2VydmVyLT5nZXRTZXJ2ZXJUcmFuc3BvcnQoKS5nZXQoKSk7CisgICAgaWYgKCFwU29jaykgeyB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJob3cgY29tZT8iKTsgfQorICAgIHJldHVybiBwU29jay0+Z2V0UG9ydCgpOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclR5cGU+IHBTZXJ2ZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcj4gcEV2ZW50SGFuZGxlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gcFNlcnZlclRocmVhZDsKKyAgLyoqCisgICAqIFBlcmZvcm1zIGEgc3RyZXNzIHRlc3QgYnkgc3Bhd25pbmcgdGhyZWFkcyB0aGF0IGNvbm5lY3QsIGRvIGEgbnVtYmVyIG9mIG9wZXJhdGlvbnMKKyAgICogYW5kIGRpc2Nvbm5lY3QsIHRoZW4gYSByYW5kb20gZGVsYXksIHRoZW4gZG8gaXQgb3ZlciBhZ2Fpbi4gIFRoaXMgaXMgZG9uZSBmb3IgYSBmaXhlZAorICAgKiBwZXJpb2Qgb2YgdGltZSB0byB0ZXN0IGZvciBjb25jdXJyZW5jeSBjb3JyZWN0bmVzcy4KKyAgICogXHBhcmFtW2luXSAgbnVtVG9NYWtlICB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cworICAgKi8KKyAgdm9pZCBzdHJlc3MoaW50NjRfdCBudW1Ub01ha2UsIGNvbnN0IGJvb3N0Ojpwb3NpeF90aW1lOjp0aW1lX2R1cmF0aW9uJiBkdXJhdGlvbikgeworICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJTdHJlc3MgdGVzdGluZyAlMSUgd2l0aCAlMiUgY2xpZW50cyBmb3IgJTMlIHNlY29uZHMiKQorICAgICAgICAlIHR5cGVpZChUU2VydmVyVHlwZSkubmFtZSgpICUgbnVtVG9NYWtlICUgZHVyYXRpb24udG90YWxfc2Vjb25kcygpKTsKKworICAgIHN0YXJ0U2VydmVyKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+ID4gaG9sZFRocmVhZHM7CisgICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgbnVtVG9NYWtlOyArK2kpIHsKKyAgICAgIGhvbGRUaHJlYWRzLnB1c2hfYmFjayhzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+KAorICAgICAgICBuZXcgYm9vc3Q6OnRocmVhZChzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpzdHJlc3NvciwgdGhpcykpKSk7CisgICAgfQorCisgICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChkdXJhdGlvbik7CisgICAgYlN0cmVzc0RvbmUgPSB0cnVlOworCisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIiAgc2VydmljZWQgJTElIGNvbm5lY3Rpb25zIChIV00gJTIlKSB0b3RhbGluZyAlMyUgcmVxdWVzdHMiKQorICAgICAgICAlIGJTdHJlc3NDb25uZWN0aW9uQ291bnQgJSBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSAlIGJTdHJlc3NSZXF1ZXN0Q291bnQpOworCisgICAgQk9PU1RfRk9SRUFDSCAoc2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPiBwVGhyZWFkLCBob2xkVGhyZWFkcykgeyBwVGhyZWFkLT5qb2luKCk7IH0KKyAgICBob2xkVGhyZWFkcy5jbGVhcigpOworCisgICAgQk9PU1RfQ0hFQ0soYlN0cmVzc1JlcXVlc3RDb3VudCA+IDApOworCisgICAgc3RvcFNlcnZlcigpOworICB9CisKKyAgLyoqCisgICAqIEhlbHBlciBtZXRob2QgdG8gc3RyZXNzIHRoZSBzeXN0ZW0KKyAgICovCisgIHZvaWQgc3RyZXNzb3IoKSB7CisgIHdoaWxlICghYlN0cmVzc0RvbmUpIHsKKyAgICAgIHNoYXJlZF9wdHI8VFNvY2tldD4gcFNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwgYXV0b1NvY2tldENsb3Nlcik7CisgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcFByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wocFNvY2tldCkpOworICAgICAgUGFyZW50U2VydmljZUNsaWVudCBjbGllbnQocFByb3RvY29sKTsKKyAgICAgIHBTb2NrZXQtPm9wZW4oKTsKKyAgICAgIGJTdHJlc3NDb25uZWN0aW9uQ291bnQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5kKCkgJSAxMDAwOyArK2kpIHsKKyAgICAgIGNsaWVudC5pbmNyZW1lbnRHZW5lcmF0aW9uKCk7CisgICAgICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHNoYXJlZF9wdHI8VFNlcnZlclR5cGU+IHBTZXJ2ZXI7CisgIHNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPiBwRXZlbnRIYW5kbGVyOworICBzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+IHBTZXJ2ZXJUaHJlYWQ7CisgIHN0ZDo6YXRvbWljPGJvb2w+IGJTdHJlc3NEb25lOworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiBiU3RyZXNzQ29ubmVjdGlvbkNvdW50OworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiBiU3RyZXNzUmVxdWVzdENvdW50OwogfTsKIAogdGVtcGxhdGUgPGNsYXNzIFRTZXJ2ZXJUeXBlPgpAQCAtMjQ4LDkgKzMzMSw5IEBACiAgICAgOiBwdWJsaWMgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU8VFNlcnZlclR5cGU+IHsKIHB1YmxpYzoKICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlKCkKLSAgICA6IFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPihib29zdDo6bWFrZV9zaGFyZWQ8UGFyZW50U2VydmljZVByb2Nlc3NvckZhY3Rvcnk+KAotICAgICAgICAgIGJvb3N0OjptYWtlX3NoYXJlZDxQYXJlbnRTZXJ2aWNlSWZTaW5nbGV0b25GYWN0b3J5PigKLSAgICAgICAgICAgICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFBhcmVudEhhbmRsZXI+KCkpKSkge30KKyAgICA6IFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPihtYWtlX3NoYXJlZDxQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yRmFjdG9yeT4oCisgICAgICAgICAgbWFrZV9zaGFyZWQ8UGFyZW50U2VydmljZUlmU2luZ2xldG9uRmFjdG9yeT4oCisgICAgICAgICAgICAgIG1ha2Vfc2hhcmVkPFBhcmVudEhhbmRsZXI+KCkpKSkge30KIH07CiAKIHRlbXBsYXRlIDxjbGFzcyBUU2VydmVyVHlwZT4KQEAgLTI1OCw0MCArMzQxLDQ1IEBACiBwdWJsaWM6CiAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlKCkKICAgICA6IFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPigKLSAgICAgICAgICBib29zdDo6bWFrZV9zaGFyZWQ8UGFyZW50U2VydmljZVByb2Nlc3Nvcj4oYm9vc3Q6Om1ha2Vfc2hhcmVkPFBhcmVudEhhbmRsZXI+KCkpKSB7fQorICAgICAgICAgIG1ha2Vfc2hhcmVkPFBhcmVudFNlcnZpY2VQcm9jZXNzb3I+KG1ha2Vfc2hhcmVkPFBhcmVudEhhbmRsZXI+KCkpKSB7fQogfTsKIAogQk9PU1RfQVVUT19URVNUX1NVSVRFKGNvbnN0cnVjdG9ycykKIAogQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF9zaW1wbGVfZmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvckZhY3RvcnlUZXN0Rml4dHVyZTxUU2ltcGxlU2VydmVyPikgewotICBiYXNlbGluZSgzLCAxKTsKKyAgYmFzZWxpbmUoMywgMSwgImZhY3RvcnkiKTsKIH0KIAogQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF9zaW1wbGUsIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRTaW1wbGVTZXJ2ZXI+KSB7Ci0gIGJhc2VsaW5lKDMsIDEpOworICBiYXNlbGluZSgzLCAxLCAicHJvY2Vzc29yIik7CiB9CiAKIEJPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkZWRfZmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvckZhY3RvcnlUZXN0Rml4dHVyZTxUVGhyZWFkZWRTZXJ2ZXI+KSB7Ci0gIGJhc2VsaW5lKDEwLCAxMCk7CisgIGJhc2VsaW5lKDEwLCAxMCwgImZhY3RvcnkiKTsKIH0KIAogQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF90aHJlYWRlZCwgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZGVkU2VydmVyPikgewotICBiYXNlbGluZSgxMCwgMTApOworICBiYXNlbGluZSgxMCwgMTAsICJwcm9jZXNzb3IiKTsKIH0KIAogQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF90aHJlYWRlZF9ib3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRUaHJlYWRlZFNlcnZlcj4pIHsKICAgcFNlcnZlci0+c2V0Q29uY3VycmVudENsaWVudExpbWl0KDQpOwotICBiYXNlbGluZSgxMCwgNCk7CisgIGJhc2VsaW5lKDEwLCA0LCAibGltaXQgYnkgc2VydmVyIGZyYW1ld29yayIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZGVkX3N0cmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvckZhY3RvcnlUZXN0Rml4dHVyZTxUVGhyZWFkZWRTZXJ2ZXI+KSB7CisgIHN0cmVzcygxMCwgYm9vc3Q6OnBvc2l4X3RpbWU6OnNlY29uZHMoMykpOwogfQogCiBCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2xfZmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvckZhY3RvcnlUZXN0Rml4dHVyZTxUVGhyZWFkUG9vbFNlcnZlcj4pIHsKICAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT50aHJlYWRGYWN0b3J5KAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKLSAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkpKTsKKyAgICAgIHNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5KSk7CiAgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+c3RhcnQoKTsKIAogICAvLyB0aHJlYWQgZmFjdG9yeSBoYXMgNCB0aHJlYWRzIGFzIGEgZGVmYXVsdApAQCAtMjk5LDE0ICszODcsMTQgQEAKICAgLy8gYXMgYWNjZXB0KCkgd2lsbCBiZSBjYWxsZWQgdG8gZ3JhYiBhIDV0aCBjbGllbnQgc29ja2V0LCBpbiB0aGlzIGNhc2UKICAgLy8gYW5kIHRoZW4gdGhlIHRocmVhZCBmYWN0b3J5IHdpbGwgYmxvY2sgYWRkaW5nIHRoZSB0aHJlYWQgdG8gbWFuYWdlCiAgIC8vIHRoYXQgY2xpZW50LgotICBiYXNlbGluZSgxMCwgNSk7CisgIGJhc2VsaW5lKDEwLCA1LCAibGltaXQgYnkgdGhyZWFkIG1hbmFnZXIiKTsKIH0KIAogQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF90aHJlYWRwb29sLAogICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZFBvb2xTZXJ2ZXI+KSB7CiAgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+dGhyZWFkRmFjdG9yeSgKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCi0gICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CisgICAgICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeSkpOwogICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CiAKICAgLy8gdGhyZWFkIGZhY3RvcnkgaGFzIDQgdGhyZWFkcyBhcyBhIGRlZmF1bHQKQEAgLTMxNCwxOCArNDAyLDI4IEBACiAgIC8vIGFzIGFjY2VwdCgpIHdpbGwgYmUgY2FsbGVkIHRvIGdyYWIgYSA1dGggY2xpZW50IHNvY2tldCwgaW4gdGhpcyBjYXNlCiAgIC8vIGFuZCB0aGVuIHRoZSB0aHJlYWQgZmFjdG9yeSB3aWxsIGJsb2NrIGFkZGluZyB0aGUgdGhyZWFkIHRvIG1hbmFnZQogICAvLyB0aGF0IGNsaWVudC4KLSAgYmFzZWxpbmUoMTAsIDUpOworICBiYXNlbGluZSgxMCwgNSwgImxpbWl0IGJ5IHRocmVhZCBtYW5hZ2VyIik7CiB9CiAKIEJPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkcG9vbF9ib3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRUaHJlYWRQb29sU2VydmVyPikgewogICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnRocmVhZEZhY3RvcnkoCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAotICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3RvcnkpKTsKICAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT5zdGFydCgpOwogICBwU2VydmVyLT5zZXRDb25jdXJyZW50Q2xpZW50TGltaXQoNCk7CiAKLSAgYmFzZWxpbmUoMTAsIDQpOworICBiYXNlbGluZSgxMCwgNCwgInNlcnZlciBmcmFtZXdvcmsgY29ubmVjdGlvbiBsaW1pdCIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2xfc3RyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZFBvb2xTZXJ2ZXI+KSB7CisgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+dGhyZWFkRmFjdG9yeSgKKyAgICAgIHNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5KSk7CisgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+c3RhcnQoKTsKKworICBzdHJlc3MoMTAsIGJvb3N0Ojpwb3NpeF90aW1lOjpzZWNvbmRzKDMpKTsKIH0KIAogQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCkBAIC0zMzUsMTQgKzQzMywxNSBAQAogCiBCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0b3Bfd2l0aF9pbnRlcnJ1cHRhYmxlX2NsaWVudHNfY29ubmVjdGVkKSB7CiAgIC8vIFRoaXMgdGVzdHMgVEhSSUZULTI0NDEgbmV3IGJlaGF2aW9yOiBzdG9wcGluZyB0aGUgc2VydmVyIGRpc2Nvbm5lY3RzIGNsaWVudHMKKyAgQk9PU1RfVEVTVF9NRVNTQUdFKCJUZXN0aW5nIHN0b3Agd2l0aCBpbnRlcnJ1cHRhYmxlIGNsaWVudHMiKTsKIAogICBzdGFydFNlcnZlcigpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazEobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKICAgcENsaWVudFNvY2sxLT5vcGVuKCk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2syKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMihuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOwogICBwQ2xpZW50U29jazItPm9wZW4oKTsKIApAQCAtMzYyLDY0ICs0NjEsNjcgQEAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RvcF93aXRoX3VuaW50ZXJydXB0YWJsZV9jbGllbnRzX2Nvbm5lY3RlZCkgewogICAvLyBUaGlzIHRlc3RzIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcjogc3RvcHBpbmcgdGhlIHNlcnZlciBibG9ja3MgdW50aWwgY2xpZW50cwogICAvLyBkaXNjb25uZWN0LgorICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgiVGVzdGluZyBzdG9wIHdpdGggdW5pbnRlcnJ1cHRhYmxlIGNsaWVudHMiKTsKIAotICBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFNlcnZlclNvY2tldD4ocFNlcnZlci0+Z2V0U2VydmVyVHJhbnNwb3J0KCkpCisgIGR5bmFtaWNfcG9pbnRlcl9jYXN0PFRTZXJ2ZXJTb2NrZXQ+KHBTZXJ2ZXItPmdldFNlcnZlclRyYW5zcG9ydCgpKQogICAgICAgLT5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpOyAvLyByZXR1cm5zIHRvIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcgogCiAgIHN0YXJ0U2VydmVyKCk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2sxKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOwogICBwQ2xpZW50U29jazEtPm9wZW4oKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazIobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2syKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CiAgIHBDbGllbnRTb2NrMi0+b3BlbigpOwogCiAgIC8vIEVuc3VyZSB0aGV5IGhhdmUgYmVlbiBhY2NlcHRlZAogICBibG9ja1VudGlsQWNjZXB0ZWQoMik7CiAKLSAgYm9vc3Q6OnRocmVhZCB0MShib29zdDo6YmluZCgmVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU6OmRlbGF5Q2xvc2UsCisgIGJvb3N0Ojp0aHJlYWQgdDEoc3RkOjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMoMjUwKSkpOwotICBib29zdDo6dGhyZWFkIHQyKGJvb3N0OjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgYm9vc3Q6OnRocmVhZCB0MihzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2syLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygyNTApKSk7CiAKICAgLy8gT25jZSB0aGUgY2xpZW50cyBkaXNjb25uZWN0IHRoZSBzZXJ2ZXIgd2lsbCBzdG9wCiAgIHN0b3BTZXJ2ZXIoKTsKKyAgQk9PU1RfQ0hFQ0socFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkgPiAwKTsKICAgdDEuam9pbigpOwogICB0Mi5qb2luKCk7CiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY29uY3VycmVudF9jbGllbnRfbGltaXQpIHsKICAgc3RhcnRTZXJ2ZXIoKTsKKyAgQk9PU1RfVEVTVF9NRVNTQUdFKCJUZXN0aW5nIHRoZSBjb25jdXJyZW50IGNsaWVudCBsaW1pdCIpOwogCiAgIEJPT1NUX0NIRUNLX0VRVUFMKElOVDY0X01BWCwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudExpbWl0KCkpOwogICBwU2VydmVyLT5zZXRDb25jdXJyZW50Q2xpZW50TGltaXQoMik7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudExpbWl0KCkpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazEobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKICAgcENsaWVudFNvY2sxLT5vcGVuKCk7CiAgIGJsb2NrVW50aWxBY2NlcHRlZCgxKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMihuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazIobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKICAgcENsaWVudFNvY2syLT5vcGVuKCk7CiAgIGJsb2NrVW50aWxBY2NlcHRlZCgyKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOwogCiAgIC8vIGEgdGhpcmQgY2xpZW50IGNhbm5vdCBjb25uZWN0IHVudGlsIG9uZSBvZiB0aGUgb3RoZXIgdHdvIGNsb3NlcwotICBib29zdDo6dGhyZWFkIHQyKGJvb3N0OjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgYm9vc3Q6OnRocmVhZCB0MihzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2syLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygyNTApKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMyhuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazMobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKICAgcENsaWVudFNvY2syLT5vcGVuKCk7CiAgIGJsb2NrVW50aWxBY2NlcHRlZCgyKTsKQEAgLTQyNyw2ICs1MjksNyBAQAogICBCT09TVF9DSEVDS19FUVVBTCgyLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSk7CiAKICAgc3RvcFNlcnZlcigpOworICBCT09TVF9DSEVDSyhwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSA+IDApOwogICB0Mi5qb2luKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclNvY2tldFRlc3QuY3BwCmluZGV4IGFlODdiYTguLmJlYzZkNDcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJTb2NrZXRUZXN0LmNwcApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgotI2luY2x1ZGUgIlRlc3RQb3J0Rml4dHVyZS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlICJUVHJhbnNwb3J0Q2hlY2tUaHJvdy5oIgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCkBAIC0yOCwyMCArMjgsMjIgQEAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAotQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKFRTZXJ2ZXJTb2NrZXRUZXN0LCBUZXN0UG9ydEZpeHR1cmUpCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVFNlcnZlclNvY2tldFRlc3QpCiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfYmluZF90b19hZGRyZXNzKSB7Ci0gIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIG1fc2VydmVyUG9ydCk7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOwogICBzb2NrMS5saXN0ZW4oKTsKLSAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBtX3NlcnZlclBvcnQpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKICAgY2xpZW50U29jay5vcGVuKCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKICAgYWNjZXB0ZWQtPmNsb3NlKCk7CiAgIHNvY2sxLmNsb3NlKCk7CiAKICAgc3RkOjpjb3V0IDw8ICJBbiBlcnJvciBtZXNzYWdlIGZyb20gZ2V0YWRkcmluZm8gb24gdGhlIGNvbnNvbGUgaXMgZXhwZWN0ZWQ6IiA8PCBzdGQ6OmVuZGw7Ci0gIFRTZXJ2ZXJTb2NrZXQgc29jazIoIjI1Ny4yNTguMjU5LjI2MCIsIG1fc2VydmVyUG9ydCk7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazIoIjI1Ny4yNTguMjU5LjI2MCIsIDApOwogICBCT09TVF9DSEVDS19USFJPVyhzb2NrMi5saXN0ZW4oKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7CiAgIHNvY2syLmNsb3NlKCk7CiB9CkBAIC01NSw3ICs1Nyw3IEBACiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY2xvc2VfYmVmb3JlX2xpc3RlbikgewotICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCBtX3NlcnZlclBvcnQpOworICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwKTsKICAgc29jazEuY2xvc2UoKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU2VydmVyVHJhbnNwb3J0VGVzdC5jcHAKaW5kZXggMjA0NzMzNy4uMThhMzkzZSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwCkBAIC0yMCwxMSArMjAsMTIgQEAKICNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KLSNpbmNsdWRlICJUZXN0UG9ydEZpeHR1cmUuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAogQk9PU1RfQVVUT19URVNUX1NVSVRFKFRTZXJ2ZXJUcmFuc3BvcnRUZXN0KQogCkBAIC0zMywxMyArMzQsMTMgQEAKIGNsYXNzIFRlc3RUU2VydmVyVHJhbnNwb3J0IDogcHVibGljIFRTZXJ2ZXJUcmFuc3BvcnQgewogcHVibGljOgogICBUZXN0VFNlcnZlclRyYW5zcG9ydCgpIDogdmFsaWRfKHRydWUpIHt9Ci0gIHZvaWQgY2xvc2UoKSB7fQorICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGUge30KICAgYm9vbCB2YWxpZF87CiAKIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpIHsKLSAgICByZXR1cm4gdmFsaWRfID8gYm9vc3Q6OnNoYXJlZF9wdHI8VGVzdFRUcmFuc3BvcnQ+KG5ldyBUZXN0VFRyYW5zcG9ydCkKLSAgICAgICAgICAgICAgICAgIDogYm9vc3Q6OnNoYXJlZF9wdHI8VGVzdFRUcmFuc3BvcnQ+KCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gdmFsaWRfID8gc3RkOjptYWtlX3NoYXJlZDxUZXN0VFRyYW5zcG9ydD4oKQorICAgICAgICAgICAgICAgICAgOiBzaGFyZWRfcHRyPFRlc3RUVHJhbnNwb3J0PigpOwogICB9CiB9OwogCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVFNvY2tldEludGVycnVwdFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcAppbmRleCAwMmRhM2VlLi4zNjYyNDJmIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVFNvY2tldEludGVycnVwdFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKQEAgLTIwLDI3ICsyMCwyNyBAQAogI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUU29ja2V0SW50ZXJydXB0VGVzdAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgogCi0jaW5jbHVkZSA8Ym9vc3QvYmluZC5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvY2hyb25vL2R1cmF0aW9uLmhwcD4KICNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lX2R1cmF0aW9uLmhwcD4KICNpbmNsdWRlIDxib29zdC90aHJlYWQvdGhyZWFkLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KLSNpbmNsdWRlICJUZXN0UG9ydEZpeHR1cmUuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJTb2NrZXQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiAKLUJPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShUU29ja2V0SW50ZXJydXB0VGVzdCwgVGVzdFBvcnRGaXh0dXJlKQorQk9PU1RfQVVUT19URVNUX1NVSVRFKFRTb2NrZXRJbnRlcnJ1cHRUZXN0KQogCi12b2lkIHJlYWRlcldvcmtlcihib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgdWludDMyX3QgZXhwZWN0ZWRSZXN1bHQpIHsKK3ZvaWQgcmVhZGVyV29ya2VyKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgdWludDMyX3QgZXhwZWN0ZWRSZXN1bHQpIHsKICAgdWludDhfdCBidWZbNF07CiAgIEJPT1NUX0NIRUNLX0VRVUFMKGV4cGVjdGVkUmVzdWx0LCB0dC0+cmVhZChidWYsIDQpKTsKIH0KIAotdm9pZCByZWFkZXJXb3JrZXJNdXN0VGhyb3coYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQpIHsKK3ZvaWQgcmVhZGVyV29ya2VyTXVzdFRocm93KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCkgewogICB0cnkgewogICAgIHVpbnQ4X3QgYnVmWzRdOwogICAgIHR0LT5yZWFkKGJ1ZiwgNCk7CkBAIC01MSwxMiArNTEsMTMgQEAKIH0KIAogQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9pbnRlcnJ1cHRhYmxlX2NoaWxkX3JlYWQpIHsKLSAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgbV9zZXJ2ZXJQb3J0KTsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CiAgIHNvY2sxLmxpc3RlbigpOwotICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIG1fc2VydmVyUG9ydCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIHBvcnQpOwogICBjbGllbnRTb2NrLm9wZW4oKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKLSAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKGJvb3N0OjpiaW5kKHJlYWRlcldvcmtlck11c3RUaHJvdywgYWNjZXB0ZWQpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyTXVzdFRocm93LCBhY2NlcHRlZCkpOwogICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKICAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdwogICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOwpAQCAtNjgsMTMgKzY5LDE0IEBACiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgewotICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCBtX3NlcnZlclBvcnQpOworICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwKTsKICAgc29jazEuc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKTsgLy8gcmV0dXJucyB0byBwcmUtVEhSSUZULTI0NDEgYmVoYXZpb3IKICAgc29jazEubGlzdGVuKCk7Ci0gIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgbV9zZXJ2ZXJQb3J0KTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CiAgIGNsaWVudFNvY2sub3BlbigpOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOwotICBib29zdDo6dGhyZWFkIHJlYWRUaHJlYWQoYm9vc3Q6OmJpbmQocmVhZGVyV29ya2VyLCBhY2NlcHRlZCwgMCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKHN0ZDo6YmluZChyZWFkZXJXb3JrZXIsIGFjY2VwdGVkLCAwKSk7CiAgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOwogICAvLyByZWFkVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgaGVyZQogICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOwpAQCAtODksMjQgKzkxLDI1IEBACiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY2Fubm90X2NoYW5nZV9hZnRlcl9saXN0ZW4pIHsKLSAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgbV9zZXJ2ZXJQb3J0KTsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CiAgIHNvY2sxLmxpc3RlbigpOwogICBCT09TVF9DSEVDS19USFJPVyhzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpLCBzdGQ6OmxvZ2ljX2Vycm9yKTsKICAgc29jazEuY2xvc2UoKTsKIH0KIAotdm9pZCBwZWVrZXJXb3JrZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIGJvb2wgZXhwZWN0ZWRSZXN1bHQpIHsKK3ZvaWQgcGVla2VyV29ya2VyKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgYm9vbCBleHBlY3RlZFJlc3VsdCkgewogICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZFJlc3VsdCwgdHQtPnBlZWsoKSk7CiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfaW50ZXJydXB0YWJsZV9jaGlsZF9wZWVrKSB7Ci0gIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIG1fc2VydmVyUG9ydCk7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOwogICBzb2NrMS5saXN0ZW4oKTsKLSAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBtX3NlcnZlclBvcnQpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKICAgY2xpZW50U29jay5vcGVuKCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOwogICAvLyBwZWVrKCkgd2lsbCByZXR1cm4gZmFsc2UgaWYgY2hpbGQgaXMgaW50ZXJydXB0ZWQKLSAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKGJvb3N0OjpiaW5kKHBlZWtlcldvcmtlciwgYWNjZXB0ZWQsIGZhbHNlKSk7CisgIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChzdGQ6OmJpbmQocGVla2VyV29ya2VyLCBhY2NlcHRlZCwgZmFsc2UpKTsKICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CiAgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKICAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKQEAgLTExOCwxNCArMTIxLDE1IEBACiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcGVlaykgewotICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCBtX3NlcnZlclBvcnQpOworICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwKTsKICAgc29jazEuc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKTsgLy8gcmV0dXJucyB0byBwcmUtVEhSSUZULTI0NDEgYmVoYXZpb3IKICAgc29jazEubGlzdGVuKCk7Ci0gIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgbV9zZXJ2ZXJQb3J0KTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CiAgIGNsaWVudFNvY2sub3BlbigpOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKICAgLy8gcGVlaygpIHdpbGwgcmV0dXJuIGZhbHNlIHdoZW4gcmVtb3RlIHNpZGUgaXMgY2xvc2VkCi0gIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChib29zdDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBib29zdDo6dGhyZWFkIHBlZWtUaHJlYWQoc3RkOjpiaW5kKHBlZWtlcldvcmtlciwgYWNjZXB0ZWQsIGZhbHNlKSk7CiAgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOwogICAvLyBwZWVrVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CiAgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVGVzdFBvcnRGaXh0dXJlLmggYi9saWIvY3BwL3Rlc3QvVGVzdFBvcnRGaXh0dXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZjQ3ZDYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC90ZXN0L1Rlc3RQb3J0Rml4dHVyZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0KLWNsYXNzIFRlc3RQb3J0Rml4dHVyZSB7Ci1wdWJsaWM6Ci0gIFRlc3RQb3J0Rml4dHVyZSgpIHsKLSAgICBjb25zdCBjaGFyKiBzcEVudiA9IHN0ZDo6Z2V0ZW52KCJUSFJJRlRfVEVTVF9QT1JUIik7Ci0gICAgbV9zZXJ2ZXJQb3J0ID0gKHNwRW52KSA/IGF0b2koc3BFbnYpIDogOTA5MDsKLSAgfQotCi1wcm90ZWN0ZWQ6Ci0gIGludCBtX3NlcnZlclBvcnQ7Ci19OwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QuY3BwCmluZGV4IGMwNTZhNWQuLmE4OTBhYTggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UcmFuc3BvcnRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdC5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dGltZS5oPgpAQCAtMjYsNyArMjYsNiBAQAogI2VuZGlmCiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CiAKICNpbmNsdWRlIDxib29zdC9tcGwvbGlzdC5ocHA+CiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KQEAgLTQzLDEwICs0MiwxMiBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmg+CiAjaWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oPgogI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CiAjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiAKIHN0YXRpYyBib29zdDo6bXQxOTkzNyBybmc7CiAKQEAgLTU2LDcgKzU3LDcgQEAKIAogY2xhc3MgU2l6ZUdlbmVyYXRvciB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgflNpemVHZW5lcmF0b3IoKSB7fQorICB2aXJ0dWFsIH5TaXplR2VuZXJhdG9yKCkgPSBkZWZhdWx0OwogICB2aXJ0dWFsIHVpbnQzMl90IG5leHRTaXplKCkgPSAwOwogICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgPSAwOwogfTsKQEAgLTY0LDggKzY1LDggQEAKIGNsYXNzIENvbnN0YW50U2l6ZUdlbmVyYXRvciA6IHB1YmxpYyBTaXplR2VuZXJhdG9yIHsKIHB1YmxpYzoKICAgQ29uc3RhbnRTaXplR2VuZXJhdG9yKHVpbnQzMl90IHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLSAgdWludDMyX3QgbmV4dFNpemUoKSB7IHJldHVybiB2YWx1ZV87IH0KLSAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCB7CisgIHVpbnQzMl90IG5leHRTaXplKCkgb3ZlcnJpZGUgeyByZXR1cm4gdmFsdWVfOyB9CisgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBkZXNjOwogICAgIGRlc2MgPDwgdmFsdWVfOwogICAgIHJldHVybiBkZXNjLnN0cigpOwpAQCAtODAsOSArODEsOSBAQAogICBSYW5kb21TaXplR2VuZXJhdG9yKHVpbnQzMl90IG1pbiwgdWludDMyX3QgbWF4KQogICAgIDogZ2VuZXJhdG9yXyhybmcsIGJvb3N0Ojp1bmlmb3JtX2ludDxpbnQ+KG1pbiwgbWF4KSkge30KIAotICB1aW50MzJfdCBuZXh0U2l6ZSgpIHsgcmV0dXJuIGdlbmVyYXRvcl8oKTsgfQorICB1aW50MzJfdCBuZXh0U2l6ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIGdlbmVyYXRvcl8oKTsgfQogCi0gIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgeworICBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gZGVzYzsKICAgICBkZXNjIDw8ICJyYW5kKCIgPDwgZ2V0TWluKCkgPDwgIiwgIiA8PCBnZXRNYXgoKSA8PCAiKSI7CiAgICAgcmV0dXJuIGRlc2Muc3RyKCk7CkBAIC0xMDgsMTEgKzEwOSwxMSBAQAogICBHZW5lcmljU2l6ZUdlbmVyYXRvcih1aW50MzJfdCBtaW4sIHVpbnQzMl90IG1heCkKICAgICA6IGdlbmVyYXRvcl8obmV3IFJhbmRvbVNpemVHZW5lcmF0b3IobWluLCBtYXgpKSB7fQogCi0gIHVpbnQzMl90IG5leHRTaXplKCkgeyByZXR1cm4gZ2VuZXJhdG9yXy0+bmV4dFNpemUoKTsgfQotICBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IHsgcmV0dXJuIGdlbmVyYXRvcl8tPmRlc2NyaWJlKCk7IH0KKyAgdWludDMyX3QgbmV4dFNpemUoKSBvdmVycmlkZSB7IHJldHVybiBnZW5lcmF0b3JfLT5uZXh0U2l6ZSgpOyB9CisgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZ2VuZXJhdG9yXy0+ZGVzY3JpYmUoKTsgfQogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBnZW5lcmF0b3JfOworICBzdGQ6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gZ2VuZXJhdG9yXzsKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTMwLDE3ICsxMzEsMTcgQEAKIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgogY2xhc3MgQ291cGxlZFRyYW5zcG9ydHMgewogcHVibGljOgotICB2aXJ0dWFsIH5Db3VwbGVkVHJhbnNwb3J0cygpIHt9CisgIHZpcnR1YWwgfkNvdXBsZWRUcmFuc3BvcnRzKCkgPSBkZWZhdWx0OwogICB0eXBlZGVmIFRyYW5zcG9ydF8gVHJhbnNwb3J0VHlwZTsKIAogICBDb3VwbGVkVHJhbnNwb3J0cygpIDogaW4oKSwgb3V0KCkge30KIAotICBib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBpbjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gb3V0OworICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gaW47CisgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBvdXQ7CiAKIHByaXZhdGU6Ci0gIENvdXBsZWRUcmFuc3BvcnRzKGNvbnN0IENvdXBsZWRUcmFuc3BvcnRzJik7Ci0gIENvdXBsZWRUcmFuc3BvcnRzJiBvcGVyYXRvcj0oY29uc3QgQ291cGxlZFRyYW5zcG9ydHMmKTsKKyAgQ291cGxlZFRyYW5zcG9ydHMoY29uc3QgQ291cGxlZFRyYW5zcG9ydHMmKSA9IGRlbGV0ZTsKKyAgQ291cGxlZFRyYW5zcG9ydHMmIG9wZXJhdG9yPShjb25zdCBDb3VwbGVkVHJhbnNwb3J0cyYpID0gZGVsZXRlOwogfTsKIAogLyoqCkBAIC0xNTMsNyArMTU0LDcgQEAKICAgICBvdXQgPSBidWY7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWY7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWY7CiB9OwogCiAvKioKQEAgLTIxOSw2ICsyMjAsMjIgQEAKICAgICBvdXQucmVzZXQobmV3IFRGRFRyYW5zcG9ydChwaXBlc1sxXSwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKSk7CiAgIH0KIH07CisjZWxzZQorLyoqCisgKiBDb3VwbGVkIHBpcGUgdHJhbnNwb3J0cworICovCitjbGFzcyBDb3VwbGVkUGlwZVRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VFBpcGU+IHsKK3B1YmxpYzoKKyAgSEFORExFIGhSZWFkOworICBIQU5ETEUgaFdyaXRlOworCisgIENvdXBsZWRQaXBlVHJhbnNwb3J0cygpIHsKKyAgICBCT09TVF9SRVFVSVJFKENyZWF0ZVBpcGUoJmhSZWFkLCAmaFdyaXRlLCBOVUxMLCAxMDQ4NTc2ICogMikpOworICAgIGluLnJlc2V0KG5ldyBUUGlwZShoUmVhZCwgaFdyaXRlKSk7CisgICAgaW4tPm9wZW4oKTsKKyAgICBvdXQgPSBpbjsKKyAgfQorfTsKICNlbmRpZgogCiAvKioKQEAgLTI2NSw3ICsyODIsNyBAQAogICAgIG91dC5yZXNldChuZXcgVEZpbGVUcmFuc3BvcnQoZmlsZW5hbWUpKTsKICAgfQogCi0gIH5Db3VwbGVkRmlsZVRyYW5zcG9ydHMoKSB7IHJlbW92ZShmaWxlbmFtZS5jX3N0cigpKTsgfQorICB+Q291cGxlZEZpbGVUcmFuc3BvcnRzKCkgb3ZlcnJpZGUgeyByZW1vdmUoZmlsZW5hbWUuY19zdHIoKSk7IH0KIAogICBzdGQ6OnN0cmluZyBmaWxlbmFtZTsKIH07CkBAIC0zMjMsMTEgKzM0MCwxMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdHJ1Y3QgVHJpZ2dlckluZm8gewotICBUcmlnZ2VySW5mbyhpbnQgc2Vjb25kcywgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCwgdWludDMyX3Qgd3JpdGVMZW5ndGgpCi0gICAgOiB0aW1lb3V0U2Vjb25kcyhzZWNvbmRzKSwgdHJhbnNwb3J0KHRyYW5zcG9ydCksIHdyaXRlTGVuZ3RoKHdyaXRlTGVuZ3RoKSwgbmV4dChOVUxMKSB7fQorICBUcmlnZ2VySW5mbyhpbnQgc2Vjb25kcywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsIHVpbnQzMl90IHdyaXRlTGVuZ3RoKQorICAgIDogdGltZW91dFNlY29uZHMoc2Vjb25kcyksIHRyYW5zcG9ydCh0cmFuc3BvcnQpLCB3cml0ZUxlbmd0aCh3cml0ZUxlbmd0aCksIG5leHQobnVsbHB0cikge30KIAogICBpbnQgdGltZW91dFNlY29uZHM7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKICAgdWludDMyX3Qgd3JpdGVMZW5ndGg7CiAgIFRyaWdnZXJJbmZvKiBuZXh0OwogfTsKQEAgLTMzOCw3ICszNTUsNyBAQAogYm9vbCBnX3RlYXJkb3duID0gZmFsc2U7CiAKIHZvaWQgYWxhcm1faGFuZGxlcigpIHsKLSAgVHJpZ2dlckluZm8qIGluZm8gPSBOVUxMOworICBUcmlnZ2VySW5mbyogaW5mbyA9IG51bGxwdHI7CiAgIHsKICAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKGdfYWxhcm1fbW9uaXRvcik7CiAgICAgLy8gVGhlIGFsYXJtIHRpbWVkIG91dCwgd2hpY2ggYWxtb3N0IGNlcnRhaW5seSBtZWFucyB3ZSdyZSBzdHVjawpAQCAtMzQ5LDcgKzM2Niw3IEBACiAgICAgLy8gdG9vbHMvdGVzdC9ydW5uZXIgb25seSByZWNvcmRzIHN0ZG91dCBtZXNzYWdlcyBpbiB0aGUgZmFpbHVyZSBtZXNzYWdlcyBmb3IKICAgICAvLyBib29zdCB0ZXN0cy4gIChib29zdCBwcmludHMgaXRzIHRlc3QgaW5mbyB0byBzdGRvdXQuKQogICAgIHByaW50ZigiVGltZW91dCBhbGFybSBleHBpcmVkOyBhdHRlbXB0aW5nIHRvIHVuYmxvY2sgdHJhbnNwb3J0XG4iKTsKLSAgICBpZiAoZ190cmlnZ2VySW5mbyA9PSBOVUxMKSB7CisgICAgaWYgKGdfdHJpZ2dlckluZm8gPT0gbnVsbHB0cikgewogICAgICAgcHJpbnRmKCIgIHRyaWdnZXIgc3RhY2sgaXMgZW1wdHkhXG4iKTsKICAgICB9CiAKQEAgLTM2MCw3ICszNzcsNyBAQAogICB9CiAKICAgLy8gV3JpdGUgc29tZSBkYXRhIHRvIHRoZSB0cmFuc3BvcnQgdG8gaG9wZWZ1bGx5IHVuYmxvY2sgaXQuCi0gIHVpbnQ4X3QqIGJ1ZiA9IG5ldyB1aW50OF90W2luZm8tPndyaXRlTGVuZ3RoXTsKKyAgYXV0byogYnVmID0gbmV3IHVpbnQ4X3RbaW5mby0+d3JpdGVMZW5ndGhdOwogICBtZW1zZXQoYnVmLCAnYicsIGluZm8tPndyaXRlTGVuZ3RoKTsKICAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiBhcnJheShidWYpOwogICBpbmZvLT50cmFuc3BvcnQtPndyaXRlKGJ1ZiwgaW5mby0+d3JpdGVMZW5ndGgpOwpAQCAtMzc4LDcgKzM5NSw3IEBACiAgICAgICBpZiAoZ190ZWFyZG93bikKICAgICAgICAgcmV0dXJuOwogICAgICAgLy8gY2FsY3VsYXRlIHRpbWVvdXQKLSAgICAgIGlmIChnX3RyaWdnZXJJbmZvID09IE5VTEwpIHsKKyAgICAgIGlmIChnX3RyaWdnZXJJbmZvID09IG51bGxwdHIpIHsKICAgICAgICAgdGltZW91dCA9IDA7CiAgICAgICB9IGVsc2UgewogICAgICAgICB0aW1lb3V0ID0gZ190cmlnZ2VySW5mby0+dGltZW91dFNlY29uZHMgKiAxMDAwOwpAQCAtNDAyLDEyICs0MTksMTIgQEAKICAqIHRvIHRoZSBlbmQuKQogICovCiB2b2lkIGFkZF90cmlnZ2VyKHVuc2lnbmVkIGludCBzZWNvbmRzLAotICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd3JpdGVfbGVuKSB7Ci0gIFRyaWdnZXJJbmZvKiBpbmZvID0gbmV3IFRyaWdnZXJJbmZvKHNlY29uZHMsIHRyYW5zcG9ydCwgd3JpdGVfbGVuKTsKKyAgYXV0byogaW5mbyA9IG5ldyBUcmlnZ2VySW5mbyhzZWNvbmRzLCB0cmFuc3BvcnQsIHdyaXRlX2xlbik7CiAgIHsKICAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKGdfYWxhcm1fbW9uaXRvcik7Ci0gICAgaWYgKGdfdHJpZ2dlckluZm8gPT0gTlVMTCkgeworICAgIGlmIChnX3RyaWdnZXJJbmZvID09IG51bGxwdHIpIHsKICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHRyaWdnZXIuCiAgICAgICAvLyBTZXQgZ190cmlnZ2VySW5mbywgYW5kIHNjaGVkdWxlIHRoZSBhbGFybQogICAgICAgZ190cmlnZ2VySW5mbyA9IGluZm87CkBAIC00MjQsMTcgKzQ0MSwxNyBAQAogfQogCiB2b2lkIGNsZWFyX3RyaWdnZXJzKCkgewotICBUcmlnZ2VySW5mbyogaW5mbyA9IE5VTEw7CisgIFRyaWdnZXJJbmZvKiBpbmZvID0gbnVsbHB0cjsKIAogICB7CiAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhnX2FsYXJtX21vbml0b3IpOwogICAgIGluZm8gPSBnX3RyaWdnZXJJbmZvOwotICAgIGdfdHJpZ2dlckluZm8gPSBOVUxMOworICAgIGdfdHJpZ2dlckluZm8gPSBudWxscHRyOwogICAgIGdfbnVtVHJpZ2dlcnNGaXJlZCA9IDA7CiAgICAgZ19hbGFybV9tb25pdG9yLm5vdGlmeSgpOwogICB9CiAKLSAgd2hpbGUgKGluZm8gIT0gTlVMTCkgeworICB3aGlsZSAoaW5mbyAhPSBudWxscHRyKSB7CiAgICAgVHJpZ2dlckluZm8qIG5leHQgPSBpbmZvLT5uZXh0OwogICAgIGRlbGV0ZSBpbmZvOwogICAgIGluZm8gPSBuZXh0OwpAQCAtNDQyLDcgKzQ1OSw3IEBACiB9CiAKIHZvaWQgc2V0X3RyaWdnZXIodW5zaWduZWQgaW50IHNlY29uZHMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZV9sZW4pIHsKICAgY2xlYXJfdHJpZ2dlcnMoKTsKICAgYWRkX3RyaWdnZXIoc2Vjb25kcywgdHJhbnNwb3J0LCB3cml0ZV9sZW4pOwpAQCAtNDgzLDggKzUwMCw4IEBACiAgICAgICAgICAgICAgU2l6ZUdlbmVyYXRvciYgckNodW5rR2VuZXJhdG9yLAogICAgICAgICAgICAgIHVpbnQzMl90IG1heE91dHN0YW5kaW5nKSB7CiAgIENvdXBsZWRUcmFuc3BvcnRzIHRyYW5zcG9ydHM7Ci0gIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5pbiAhPSBOVUxMKTsKLSAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLm91dCAhPSBOVUxMKTsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IG51bGxwdHIpOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IG51bGxwdHIpOwogCiAgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gd2J1ZiA9IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4obmV3IHVpbnQ4X3RbdG90YWxTaXplXSk7CiAgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gcmJ1ZiA9IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4obmV3IHVpbnQ4X3RbdG90YWxTaXplXSk7CkBAIC01NzYsOCArNTkzLDggQEAKIHRlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KIHZvaWQgdGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlKCkgewogICBDb3VwbGVkVHJhbnNwb3J0cyB0cmFuc3BvcnRzOwotICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMuaW4gIT0gTlVMTCk7Ci0gIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5vdXQgIT0gTlVMTCk7CisgIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5pbiAhPSBudWxscHRyKTsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLm91dCAhPSBudWxscHRyKTsKIAogICB1aW50OF90IHdyaXRlX2J1ZlsxNl07CiAgIHVpbnQ4X3QgcmVhZF9idWZbMTZdOwpAQCAtNTk4LDggKzYxNSw4IEBACiB0ZW1wbGF0ZSA8Y2xhc3MgQ291cGxlZFRyYW5zcG9ydHM+CiB2b2lkIHRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZV9pbl9jaHVua3MoKSB7CiAgIENvdXBsZWRUcmFuc3BvcnRzIHRyYW5zcG9ydHM7Ci0gIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5pbiAhPSBOVUxMKTsKLSAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLm91dCAhPSBOVUxMKTsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IG51bGxwdHIpOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IG51bGxwdHIpOwogCiAgIHVpbnQ4X3Qgd3JpdGVfYnVmWzE2XTsKICAgdWludDhfdCByZWFkX2J1ZlsxNl07CkBAIC02MjUsOCArNjQyLDggQEAKIHRlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KIHZvaWQgdGVzdF9yZWFkX3BhcnRpYWxfbWlkZnJhbWUoKSB7CiAgIENvdXBsZWRUcmFuc3BvcnRzIHRyYW5zcG9ydHM7Ci0gIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5pbiAhPSBOVUxMKTsKLSAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLm91dCAhPSBOVUxMKTsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IG51bGxwdHIpOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IG51bGxwdHIpOwogCiAgIHVpbnQ4X3Qgd3JpdGVfYnVmWzE2XTsKICAgdWludDhfdCByZWFkX2J1ZlsxNl07CkBAIC02ODMsOCArNzAwLDggQEAKIHRlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KIHZvaWQgdGVzdF9ib3Jyb3dfcGFydF9hdmFpbGFibGUoKSB7CiAgIENvdXBsZWRUcmFuc3BvcnRzIHRyYW5zcG9ydHM7Ci0gIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5pbiAhPSBOVUxMKTsKLSAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLm91dCAhPSBOVUxMKTsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IG51bGxwdHIpOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IG51bGxwdHIpOwogCiAgIHVpbnQ4X3Qgd3JpdGVfYnVmWzE2XTsKICAgdWludDhfdCByZWFkX2J1ZlsxNl07CkBAIC02OTgsNyArNzE1LDcgQEAKICAgdWludDMyX3QgYm9ycm93X2xlbiA9IDEwOwogICBjb25zdCB1aW50OF90KiBib3Jyb3dlZF9idWYgPSB0cmFuc3BvcnRzLmluLT5ib3Jyb3cocmVhZF9idWYsICZib3Jyb3dfbGVuKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTApOwotICBCT09TVF9DSEVDSyhib3Jyb3dlZF9idWYgPT0gTlVMTCk7CisgIEJPT1NUX0NIRUNLKGJvcnJvd2VkX2J1ZiA9PSBudWxscHRyKTsKIAogICBjbGVhcl90cmlnZ2VycygpOwogfQpAQCAtNzA2LDEyICs3MjMsMTAgQEAKIHRlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KIHZvaWQgdGVzdF9yZWFkX25vbmVfYXZhaWxhYmxlKCkgewogICBDb3VwbGVkVHJhbnNwb3J0cyB0cmFuc3BvcnRzOwotICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMuaW4gIT0gTlVMTCk7Ci0gIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5vdXQgIT0gTlVMTCk7CisgIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5pbiAhPSBudWxscHRyKTsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLm91dCAhPSBudWxscHRyKTsKIAotICB1aW50OF90IHdyaXRlX2J1ZlsxNl07CiAgIHVpbnQ4X3QgcmVhZF9idWZbMTZdOwotICBtZW1zZXQod3JpdGVfYnVmLCAnYScsIHNpemVvZih3cml0ZV9idWYpKTsKIAogICAvLyBBdHRlbXB0aW5nIHRvIHJlYWQgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZSBzaG91bGQgZWl0aGVyIGJsb2NrIHVudGlsCiAgIC8vIHNvbWUgZGF0YSBpcyBhdmFpbGFibGUsIG9yIGZhaWwgaW1tZWRpYXRlbHkuICAoZS5nLiwgVFNvY2tldCBibG9ja3MsCkBAIC03MzYsOCArNzUxLDggQEAKIHRlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KIHZvaWQgdGVzdF9ib3Jyb3dfbm9uZV9hdmFpbGFibGUoKSB7CiAgIENvdXBsZWRUcmFuc3BvcnRzIHRyYW5zcG9ydHM7Ci0gIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5pbiAhPSBOVUxMKTsKLSAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLm91dCAhPSBOVUxMKTsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IG51bGxwdHIpOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IG51bGxwdHIpOwogCiAgIHVpbnQ4X3Qgd3JpdGVfYnVmWzE2XTsKICAgbWVtc2V0KHdyaXRlX2J1ZiwgJ2EnLCBzaXplb2Yod3JpdGVfYnVmKSk7CkBAIC03NDUsOCArNzYwLDggQEAKICAgLy8gQXR0ZW1wdGluZyB0byBib3Jyb3cgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZSBzaG91bGQgZmFpbCBpbW1lZGlhdGVseQogICBzZXRfdHJpZ2dlcigxLCB0cmFuc3BvcnRzLm91dCwgMTApOwogICB1aW50MzJfdCBib3Jyb3dfbGVuID0gMTA7Ci0gIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd2VkX2J1ZiA9IHRyYW5zcG9ydHMuaW4tPmJvcnJvdyhOVUxMLCAmYm9ycm93X2xlbik7Ci0gIEJPT1NUX0NIRUNLKGJvcnJvd2VkX2J1ZiA9PSBOVUxMKTsKKyAgY29uc3QgdWludDhfdCogYm9ycm93ZWRfYnVmID0gdHJhbnNwb3J0cy5pbi0+Ym9ycm93KG51bGxwdHIsICZib3Jyb3dfbGVuKTsKKyAgQk9PU1RfQ0hFQ0soYm9ycm93ZWRfYnVmID09IG51bGxwdHIpOwogICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpMCk7CiAKICAgY2xlYXJfdHJpZ2dlcnMoKTsKQEAgLTg0MCw2ICs4NTUsMTkgQEAKICAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7CiAKICAgICBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRGRFRyYW5zcG9ydHMpOworI2Vsc2UKKyAgICAvLyBUUGlwZSB0ZXN0cyAoV0lOMzIgb25seSkKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDEwMjQsIDAsIDApOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDE2LCAxLCAxKTsKKworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOworCisgICAgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkUGlwZVRyYW5zcG9ydHMpOwogI2VuZGlmIC8vX1dJTjMyCiAKICAgICAvLyBUU29ja2V0IHRlc3RzCkBAIC05NDUsMTEgKzk3MywxMSBAQAogICAgICAgICAgPDwgckNodW5rU2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIgPDwgbWF4T3V0c3RhbmRpbmcgPDwgIikiOwogCiAjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQotICAgIGJvb3N0OjpmdW5jdGlvbjx2b2lkICgpPiB0ZXN0X2Z1bmMKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQgKCk+IHRlc3RfZnVuYwogI2Vsc2UKICAgICBib29zdDo6dW5pdF90ZXN0OjpjYWxsYmFjazA8PiB0ZXN0X2Z1bmMKICNlbmRpZgotICAgICAgICA9IGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQodGVzdF9ydzxDb3VwbGVkVHJhbnNwb3J0cz4sCisgICAgICAgID0gc3RkOjpiaW5kKHRlc3Rfcnc8Q291cGxlZFRyYW5zcG9ydHM+LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1NpemVHZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByU2l6ZUdlbiwKQEAgLTk5NSwxMyArMTAyMywxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdHJ1Y3QgZ2xvYmFsX2ZpeHR1cmUgewotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gYWxhcm1UaHJlYWRfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IGFsYXJtVGhyZWFkXzsKICAgZ2xvYmFsX2ZpeHR1cmUoKSB7CiAjaWYgX1dJTjMyCiAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOwogI2VuZGlmCiAKLSAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSBmYWN0b3J5OworICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeSBmYWN0b3J5OwogICAgIGZhY3Rvcnkuc2V0RGV0YWNoZWQoZmFsc2UpOwogCiAgICAgYWxhcm1UaHJlYWRfID0gZmFjdG9yeS5uZXdUaHJlYWQoCkBAIC0xMDI0LDYgKzEwNTIsMjUgQEAKIEJPT1NUX0dMT0JBTF9GSVhUVVJFKGdsb2JhbF9maXh0dXJlKQogI2VuZGlmCiAKKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdHYsIG51bGxwdHIpOworICBpbnQgc2VlZCA9IHR2LnR2X3NlYyBeIHR2LnR2X3VzZWM7CisKKyAgaW5pdHJhbmQoc2VlZCk7CisKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIlRyYW5zcG9ydFRlc3QiOworICBUcmFuc3BvcnRUZXN0R2VuIHRyYW5zcG9ydF90ZXN0X2dlbmVyYXRvcihzdWl0ZSwgMSk7CisgIHRyYW5zcG9ydF90ZXN0X2dlbmVyYXRvci5nZW5lcmF0ZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSB7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSxhcmdjLGFyZ3YpOworfQorI2Vsc2UKIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKQEAgLTEwMzksMyArMTA4Niw0IEBACiAgIHRyYW5zcG9ydF90ZXN0X2dlbmVyYXRvci5nZW5lcmF0ZSgpOwogICByZXR1cm4gTlVMTDsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9abGliVGVzdC5jcHAKaW5kZXggZmEyMzdhMi4uM2UyZWI4MSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvWmxpYlRlc3QuY3BwCkBAIC0xNywyMiArMTcsMjcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKLQogI2lmbmRlZiBfR05VX1NPVVJDRQogI2RlZmluZSBfR05VX1NPVVJDRSAvLyBuZWVkZWQgZm9yIGdldG9wdF9sb25nCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA8PSAxNzAwKQorLy8gcG9seW5vbWlhbCBhbmQgc3RkOjpmaWxsX3Qgd2FybmluZyBoYXBwZW5zIGluIE1TVkMgMjAxMCwgMjAxMywgbWF5YmUgb3RoZXJzCisvLyBodHRwczovL3N2bi5ib29zdC5vcmcvdHJhYy9ib29zdC90aWNrZXQvMTE0MjYKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RESU5UX0gKICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgogI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxjc3RkZGVmPgogI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLSNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvcmFuZG9tLmhwcD4KICNpbmNsdWRlIDxib29zdC9zaGFyZWRfYXJyYXkuaHBwPgogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KQEAgLTQxLDggKzQ2LDkgQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAogYm9vc3Q6Om10MTk5Mzcgcm5nOwogCkBAIC01MiwxNCArNTgsMTQgQEAKIAogY2xhc3MgU2l6ZUdlbmVyYXRvciB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgflNpemVHZW5lcmF0b3IoKSB7fQorICB2aXJ0dWFsIH5TaXplR2VuZXJhdG9yKCkgPSBkZWZhdWx0OwogICB2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRTaXplKCkgPSAwOwogfTsKIAogY2xhc3MgQ29uc3RhbnRTaXplR2VuZXJhdG9yIDogcHVibGljIFNpemVHZW5lcmF0b3IgewogcHVibGljOgogICBDb25zdGFudFNpemVHZW5lcmF0b3IodW5zaWduZWQgaW50IHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLSAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0U2l6ZSgpIHsgcmV0dXJuIHZhbHVlXzsgfQorICB1bnNpZ25lZCBpbnQgZ2V0U2l6ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIHZhbHVlXzsgfQogCiBwcml2YXRlOgogICB1bnNpZ25lZCBpbnQgdmFsdWVfOwpAQCAtNzAsMTAgKzc2LDEwIEBACiAgIExvZ05vcm1hbFNpemVHZW5lcmF0b3IoZG91YmxlIG1lYW4sIGRvdWJsZSBzdGRfZGV2KQogICAgIDogZ2VuXyhybmcsIGJvb3N0Ojpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4obWVhbiwgc3RkX2RldikpIHt9CiAKLSAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0U2l6ZSgpIHsKKyAgdW5zaWduZWQgaW50IGdldFNpemUoKSBvdmVycmlkZSB7CiAgICAgLy8gTG9vcCB1bnRpbCB3ZSBnZXQgYSBzaXplIG9mIDEgb3IgbW9yZQogICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB1bnNpZ25lZCBpbnQgdmFsdWUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGdlbl8oKSk7CisgICAgICBhdXRvIHZhbHVlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihnZW5fKCkpOwogICAgICAgaWYgKHZhbHVlID49IDEpIHsKICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgfQpAQCAtODUsMTMgKzkxLDEzIEBACiB9OwogCiBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGdlbl91bmlmb3JtX2J1ZmZlcih1aW50MzJfdCBidWZfbGVuLCB1aW50OF90IGMpIHsKLSAgdWludDhfdCogYnVmID0gbmV3IHVpbnQ4X3RbYnVmX2xlbl07CisgIGF1dG8qIGJ1ZiA9IG5ldyB1aW50OF90W2J1Zl9sZW5dOwogICBtZW1zZXQoYnVmLCBjLCBidWZfbGVuKTsKICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4oYnVmKTsKIH0KIAogYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBnZW5fY29tcHJlc3NpYmxlX2J1ZmZlcih1aW50MzJfdCBidWZfbGVuKSB7Ci0gIHVpbnQ4X3QqIGJ1ZiA9IG5ldyB1aW50OF90W2J1Zl9sZW5dOworICBhdXRvKiBidWYgPSBuZXcgdWludDhfdFtidWZfbGVuXTsKIAogICAvLyBHZW5lcmF0ZSBzbWFsbCBydW5zIG9mIGFsdGVybmF0ZWx5IGluY3JlYXNpbmcgYW5kIGRlY3JlYXNpbmcgYnl0ZXMKICAgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDMyX3Q+IHJ1bl9sZW5ndGhfZGlzdHJpYnV0aW9uKDEsIDY0KTsKQEAgLTEyMyw3ICsxMjksNyBAQAogfQogCiBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGdlbl9yYW5kb21fYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4pIHsKLSAgdWludDhfdCogYnVmID0gbmV3IHVpbnQ4X3RbYnVmX2xlbl07CisgIGF1dG8qIGJ1ZiA9IG5ldyB1aW50OF90W2J1Zl9sZW5dOwogCiAgIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+IGRpc3RyaWJ1dGlvbigwLCBVSU5UOF9NQVgpOwogICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+ID4KQEAgLTE0MSw4ICsxNDcsOCBAQAogICovCiAKIHZvaWQgdGVzdF93cml0ZV90aGVuX3JlYWQoY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKICAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKICAgemxpYl90cmFucy0+ZmluaXNoKCk7CiAKQEAgLTE2MCw4ICsxNjYsOCBAQAogICAvLyBpdCBpc24ndCB0aGVyZS4gIFRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBjb21wbGFpbmVkIHRoYXQKICAgLy8gdGhlIHN0cmVhbSB3YXMgbm90IGNvbXBsZXRlLiAgSSdtIGFib3V0IHRvIGdvIGZpeCB0aGF0LgogICAvLyBJdCB3b3JrZWQuICBBd2Vzb21lLgotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOwogICB6bGliX3RyYW5zLT53cml0ZShidWYuZ2V0KCksIGJ1Zl9sZW4pOwogICB6bGliX3RyYW5zLT5maW5pc2goKTsKICAgc3RyaW5nIHRtcF9idWY7CkBAIC0xODAsOCArMTg2LDggQEAKIHZvaWQgdGVzdF9pbmNvbXBsZXRlX2NoZWNrc3VtKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CiAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGlsbCBnZXQgdGhhdCAibm90IGNvbXBsZXRlIiBlcnJvciBpZgogICAvLyBpdCByZWFsbHkgaXNuJ3QgY29tcGxldGUuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CiAgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CiAgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOwogICBzdHJpbmcgdG1wX2J1ZjsKQEAgLTIwNCwxMSArMjEwLDExIEBACiAKIHZvaWQgdGVzdF9yZWFkX3dyaXRlX21peChjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+JiB3cml0ZV9nZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4mIHJlYWRfZ2VuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiYgd3JpdGVfZ2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4mIHJlYWRfZ2VuKSB7CiAgIC8vIFRyeSBpdCB3aXRoIGEgbWl4IG9mIHJlYWQvd3JpdGUgc2l6ZXMuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CiAgIHVuc2lnbmVkIGludCB0b3Q7CiAKICAgdG90ID0gMDsKQEAgLTI0Myw4ICsyNDksOCBAQAogCiB2b2lkIHRlc3RfaW52YWxpZF9jaGVja3N1bShjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewogICAvLyBWZXJpZnkgY2hlY2tzdW0gY2hlY2tpbmcuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CiAgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CiAgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOwogICBzdHJpbmcgdG1wX2J1ZjsKQEAgLTI4MCw4ICsyODYsOCBAQAogCiB2b2lkIHRlc3Rfd3JpdGVfYWZ0ZXJfZmx1c2goY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKICAgLy8gd3JpdGUgc29tZSBkYXRhCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CiAgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CiAKICAgLy8gY2FsbCBmaW5pc2goKQpAQCAtMzE2LDcgKzMyMiw3IEBACiB2b2lkIHRlc3Rfbm9fd3JpdGUoKSB7CiAgIC8vIFZlcmlmeSB0aGF0IG5vIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaWYgd2UKICAgLy8gbmV2ZXIgd3JpdGUgZGF0YSB0byB0aGUgVFpsaWJUcmFuc3BvcnQuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CiAgIHsKICAgICAvLyBDcmVhdGUgYSBUWmxpYlRyYW5zcG9ydCBvYmplY3QsIGFuZCBpbW1lZGlhdGVseSBkZXN0cm95IGl0CiAgICAgLy8gd2hlbiBpdCBnb2VzIG91dCBvZiBzY29wZS4KQEAgLTMyNiw2ICszMzIsMTIgQEAKICAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtYnVmLT5hdmFpbGFibGVfcmVhZCgpLCAodWludDMyX3QpMCk7CiB9CiAKK3ZvaWQgdGVzdF9nZXRfdW5kZXJseWluZ190cmFuc3BvcnQoKSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtYnVmLmdldCgpLCB6bGliX3RyYW5zLT5nZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkuZ2V0KCkpOworfQorCiAvKgogICogSW5pdGlhbGl6YXRpb24KICAqLwpAQCAtMzM1LDcgKzM0Nyw4IEBACiAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgOjpzdGQ6Om9zdHJpbmdzdHJlYW0gbmFtZV9zczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgbmFtZV9zcyA8PCBuYW1lIDw8ICItIiA8PCBCT09TVF9TVFJJTkdJWkUoX0ZVTkMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYm9vc3Q6OmZ1bmN0aW9uPHZvaWQgKCk+IHRlc3RfZnVuYyA9IDo6YXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZChfRlVOQywgIyNfX1ZBX0FSR1NfXyk7ICAgICBcCisgICAgOjpzdGQ6OmZ1bmN0aW9uPHZvaWQgKCk+IHRlc3RfZnVuYyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOjpzdGQ6OmJpbmQoX0ZVTkMsICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9jYXNlKiB0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICA9IDo6Ym9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UodGVzdF9mdW5jLCBuYW1lX3NzLnN0cigpLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgICAgICAgXAogICAgIChzdWl0ZSktPmFkZCh0Yyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMzQ2LDcgKzM1OSw3IEBACiAgICAgOjpzdGQ6Om9zdHJpbmdzdHJlYW0gbmFtZV9zczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgbmFtZV9zcyA8PCBuYW1lIDw8ICItIiA8PCBCT09TVF9TVFJJTkdJWkUoX0ZVTkMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgOjpib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X2Nhc2UqIHRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgID0gOjpib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSg6OmFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQoX0ZVTkMsICAgICAgICAgICAgICAgICBcCisgICAgICAgID0gOjpib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSg6OnN0ZDo6YmluZChfRlVOQywgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjI19fVkFfQVJHU19fKSwgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc3Muc3RyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAoc3VpdGUpLT5hZGQodGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM2Myw4ICszNzYsOCBAQAogICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCB0ZXN0X2ludmFsaWRfY2hlY2tzdW0sIGJ1ZiwgYnVmX2xlbik7CiAgIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIHRlc3Rfd3JpdGVfYWZ0ZXJfZmx1c2gsIGJ1ZiwgYnVmX2xlbik7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gc2l6ZV8zMmsobmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcigxIDw8IDE1KSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHNpemVfbG9nbm9ybWFsKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOworICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHNpemVfMzJrKG5ldyBDb25zdGFudFNpemVHZW5lcmF0b3IoMSA8PCAxNSkpOworICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHNpemVfbG9nbm9ybWFsKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOwogICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lIDw8ICItY29uc3RhbnQiLCB0ZXN0X3JlYWRfd3JpdGVfbWl4LCBidWYsIGJ1Zl9sZW4sIHNpemVfMzJrLCBzaXplXzMyayk7CiAgIEFERF9URVNUX0NBU0Uoc3VpdGUsCiAgICAgICAgICAgICAgICAgbmFtZSA8PCAiLWxvZ25vcm1hbC13cml0ZSIsCkBAIC0zOTQsOCArNDA3LDggQEAKICAgLy8gQmVjYXVzZSB0aGUgU2l6ZUdlbmVyYXRvciBtYWtlcyBhIGNvcHkgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLAogICAvLyBib3RoIFNpemVHZW5lcmF0b3JzIHNob3VsZCByZXR1cm4gdGhlIGV4YWN0IHNhbWUgc2V0IG9mIHZhbHVlcywgc2luY2UgdGhleQogICAvLyBib3RoIHN0YXJ0IHdpdGggcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzIGluIHRoZSBzYW1lIHN0YXRlLgotICBib29zdDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiB3cml0ZV9zaXplX2dlbihuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gcmVhZF9zaXplX2dlbihuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKKyAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiB3cml0ZV9zaXplX2dlbihuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKKyAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiByZWFkX3NpemVfZ2VuKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOwogICBBRERfVEVTVF9DQVNFKHN1aXRlLAogICAgICAgICAgICAgICAgIG5hbWUgPDwgIi1sb2dub3JtYWwtc2FtZS1kaXN0cmlidXRpb24iLAogICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsCkBAIC00MTIsNiArNDI1LDMyIEBACiAgIGZwcmludGYoZiwgIiAgLS1oZWxwXG4iKTsKIH0KIAorI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIGF1dG8gc2VlZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0aW1lKG51bGxwdHIpKTsKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyAgcHJpbnRmKCJzZWVkOiAlIiBQUkl1MzIgIlxuIiwgc2VlZCk7CisjZW5kaWYKKyAgcm5nLnNlZWQoc2VlZCk7CisKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIlpsaWJUZXN0IjsKKworICB1aW50MzJfdCBidWZfbGVuID0gMTAyNCAqIDMyOworICBhZGRfdGVzdHMoc3VpdGUsIGdlbl91bmlmb3JtX2J1ZmZlcihidWZfbGVuLCAnYScpLCBidWZfbGVuLCAidW5pZm9ybSIpOworICBhZGRfdGVzdHMoc3VpdGUsIGdlbl9jb21wcmVzc2libGVfYnVmZmVyKGJ1Zl9sZW4pLCBidWZfbGVuLCAiY29tcHJlc3NpYmxlIik7CisgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX3JhbmRvbV9idWZmZXIoYnVmX2xlbiksIGJ1Zl9sZW4sICJyYW5kb20iKTsKKworICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X25vX3dyaXRlKSk7CisgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3RfZ2V0X3VuZGVybHlpbmdfdHJhbnNwb3J0KSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCiBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnYyk7CiAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJndik7CkBAIC00MzMsMyArNDcyLDQgQEAKIAogICByZXR1cm4gTlVMTDsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1Rlc3RzLmNwcCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UZXN0cy5jcHAKaW5kZXggMGQ4MWQ3ZS4uOGM3MzRjMiAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1Rlc3RzLmNwcAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGVzdHMuY3BwCkBAIC0yNSw5ICsyNSwxMSBAQAogI2luY2x1ZGUgIlRpbWVyTWFuYWdlclRlc3RzLmgiCiAjaW5jbHVkZSAiVGhyZWFkTWFuYWdlclRlc3RzLmgiCiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworLy8gVGhlIHRlc3Qgd2VpZ2h0LCB3aGVyZSAxMCBpcyAxMCB0aW1lcyBtb3JlIHRocmVhZHMgdGhhbiBiYXNlbGluZQorLy8gYW5kIHRoZSBiYXNlbGluZSBpcyBvcHRpbWl6ZWQgZm9yIHJ1bm5pbmcgaW4gdmFsZ3JpbmQKK3N0YXRpYyBpbnQgV0VJR0hUID0gMTA7CiAKLSAgc3RkOjpzdHJpbmcgYXJnOworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3MoYXJnYyAtIDEgPiAxID8gYXJnYyAtIDEgOiAxKTsKIApAQCAtMzcsNiArMzksMTEgQEAKICAgICBhcmdzW2l4IC0gMV0gPSBzdGQ6OnN0cmluZyhhcmd2W2l4XSk7CiAgIH0KIAorICBpZiAoZ2V0ZW52KCJWQUxHUklORCIpICE9IG51bGxwdHIpIHsKKwkgIC8vIGxvd2VyIHRoZSBzY2FsZSBvZiBldmVyeSB0ZXN0CisJICBXRUlHSFQgPSAxOworICB9CisKICAgYm9vbCBydW5BbGwgPSBhcmdzWzBdLmNvbXBhcmUoImFsbCIpID09IDA7CiAKICAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRocmVhZC1mYWN0b3J5IikgPT0gMCkgewpAQCAtNDUsMjUgKzUyLDM4IEBACiAKICAgICBzdGQ6OmNvdXQgPDwgIlRocmVhZEZhY3RvcnkgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKIAotICAgIHNpemVfdCBjb3VudCA9IDEwMDA7Ci0gICAgc2l6ZV90IGZsb29kTG9vcHMgPSAxOwotICAgIHNpemVfdCBmbG9vZENvdW50ID0gMTAwMDAwOworICAgIGludCByZWFwTG9vcHMgPSAyICogV0VJR0hUOworICAgIGludCByZWFwQ291bnQgPSAxMDAgKiBXRUlHSFQ7CisgICAgc2l6ZV90IGZsb29kTG9vcHMgPSAzOworICAgIHNpemVfdCBmbG9vZENvdW50ID0gNTAwICogV0VJR0hUOwogCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSByZWFwIE4gdGhyZWFkcyB0ZXN0OiBOID0gIiA8PCBjb3VudCA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSByZWFwIE4gdGhyZWFkcyB0ZXN0OiBOID0gIiA8PCByZWFwTG9vcHMgPDwgIngiIDw8IHJlYXBDb3VudCA8PCBzdGQ6OmVuZGw7CiAKLSAgICBhc3NlcnQodGhyZWFkRmFjdG9yeVRlc3RzLnJlYXBOVGhyZWFkcyhjb3VudCkpOworICAgIGlmICghdGhyZWFkRmFjdG9yeVRlc3RzLnJlYXBOVGhyZWFkcyhyZWFwTG9vcHMsIHJlYXBDb3VudCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdHRUaHJlYWRGYWN0b3J5IHJlYXAgTiB0aHJlYWRzIEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQogCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSBmbG9vZE4gdGhyZWFkcyB0ZXN0OiBOID0gIiA8PCBmbG9vZENvdW50IDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IGZsb29kIE4gdGhyZWFkcyB0ZXN0OiBOID0gIiA8PCBmbG9vZExvb3BzIDw8ICJ4IiA8PCBmbG9vZENvdW50IDw8IHN0ZDo6ZW5kbDsKIAotICAgIGFzc2VydCh0aHJlYWRGYWN0b3J5VGVzdHMuZmxvb2ROVGVzdChmbG9vZExvb3BzLCBmbG9vZENvdW50KSk7CisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMuZmxvb2ROVGVzdChmbG9vZExvb3BzLCBmbG9vZENvdW50KSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3RvcnkgZmxvb2QgTiB0aHJlYWRzIEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQogCiAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSBzeW5jaHJvbm91cyBzdGFydCB0ZXN0IiA8PCBzdGQ6OmVuZGw7CiAKLSAgICBhc3NlcnQodGhyZWFkRmFjdG9yeVRlc3RzLnN5bmNoU3RhcnRUZXN0KCkpOworICAgIGlmICghdGhyZWFkRmFjdG9yeVRlc3RzLnN5bmNoU3RhcnRUZXN0KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdHRUaHJlYWRGYWN0b3J5IHN5bmNocm9ub3VzIHN0YXJ0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQogCiAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSBtb25pdG9yIHRpbWVvdXQgdGVzdCIgPDwgc3RkOjplbmRsOwogCi0gICAgYXNzZXJ0KHRocmVhZEZhY3RvcnlUZXN0cy5tb25pdG9yVGltZW91dFRlc3QoKSk7CisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMubW9uaXRvclRpbWVvdXRUZXN0KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdHRUaHJlYWRGYWN0b3J5IG1vbml0b3IgdGltZW91dCBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KICAgfQogCiAgIGlmIChydW5BbGwgfHwgYXJnc1swXS5jb21wYXJlKCJ1dGlsIikgPT0gMCkgewpAQCAtNzIsMTggKzkyLDE4IEBACiAKICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRVdGlsIG1pbmltdW0gdGltZSIgPDwgc3RkOjplbmRsOwogCi0gICAgaW50NjRfdCB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotICAgIGludDY0X3QgdGltZTAxID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICBpbnQ2NF90IHRpbWUwMCA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKKyAgICBpbnQ2NF90IHRpbWUwMSA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKIAogICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0TWluaW11bSB0aW1lOiAiIDw8IHRpbWUwMSAtIHRpbWUwMCA8PCAibXMiIDw8IHN0ZDo6ZW5kbDsKIAotICAgIHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgdGltZTAwID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOwogICAgIHRpbWUwMSA9IHRpbWUwMDsKICAgICBzaXplX3QgY291bnQgPSAwOwogCiAgICAgd2hpbGUgKHRpbWUwMSA8IHRpbWUwMCArIDEwKSB7CiAgICAgICBjb3VudCsrOwotICAgICAgdGltZTAxID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICAgIHRpbWUwMSA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKICAgICB9CiAKICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdHNjYWxsIHBlciBtczogIiA8PCBjb3VudCAvICh0aW1lMDEgLSB0aW1lMDApIDw8IHN0ZDo6ZW5kbDsKQEAgLTk3LDcgKzExNywzOCBAQAogCiAgICAgVGltZXJNYW5hZ2VyVGVzdHMgdGltZXJNYW5hZ2VyVGVzdHM7CiAKLSAgICBhc3NlcnQodGltZXJNYW5hZ2VyVGVzdHMudGVzdDAwKCkpOworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAwKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDEiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAxKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDIiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAyKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDMiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAzKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDQiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDA0KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KICAgfQogCiAgIGlmIChydW5BbGwgfHwgYXJnc1swXS5jb21wYXJlKCJ0aHJlYWQtbWFuYWdlciIpID09IDApIHsKQEAgLTEwNSwyNCArMTU2LDM0IEBACiAgICAgc3RkOjpjb3V0IDw8ICJUaHJlYWRNYW5hZ2VyIHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7CiAKICAgICB7Ci0KLSAgICAgIHNpemVfdCB3b3JrZXJDb3VudCA9IDEwMDsKLQotICAgICAgc2l6ZV90IHRhc2tDb3VudCA9IDEwMDAwMDsKLQorICAgICAgc2l6ZV90IHdvcmtlckNvdW50ID0gMTAgKiBXRUlHSFQ7CisgICAgICBzaXplX3QgdGFza0NvdW50ID0gNTAwICogV0VJR0hUOwogICAgICAgaW50NjRfdCBkZWxheSA9IDEwTEw7CiAKKyAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7CisKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZE1hbmFnZXIgYXBpIHRlc3Q6IiA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIGlmICghdGhyZWFkTWFuYWdlclRlc3RzLmFwaVRlc3QoKSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGFwaVRlc3QgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorCiAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWQgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50CiAgICAgICAgICAgICAgICAgPDwgIiB0YXNrIGNvdW50OiAiIDw8IHRhc2tDb3VudCA8PCAiIGRlbGF5OiAiIDw8IGRlbGF5IDw8IHN0ZDo6ZW5kbDsKIAotICAgICAgVGhyZWFkTWFuYWdlclRlc3RzIHRocmVhZE1hbmFnZXJUZXN0czsKLQotICAgICAgYXNzZXJ0KHRocmVhZE1hbmFnZXJUZXN0cy5sb2FkVGVzdCh0YXNrQ291bnQsIGRlbGF5LCB3b3JrZXJDb3VudCkpOworICAgICAgaWYgKCF0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRocmVhZE1hbmFnZXIgbG9hZFRlc3QgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQogCiAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGJsb2NrIHRlc3Q6IHdvcmtlciBjb3VudDogIiA8PCB3b3JrZXJDb3VudAogICAgICAgICAgICAgICAgIDw8ICIgZGVsYXk6ICIgPDwgZGVsYXkgPDwgc3RkOjplbmRsOwogCi0gICAgICBhc3NlcnQodGhyZWFkTWFuYWdlclRlc3RzLmJsb2NrVGVzdChkZWxheSwgd29ya2VyQ291bnQpKTsKKyAgICAgIGlmICghdGhyZWFkTWFuYWdlclRlc3RzLmJsb2NrVGVzdChkZWxheSwgd29ya2VyQ291bnQpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRocmVhZE1hbmFnZXIgYmxvY2tUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KICAgICB9CiAgIH0KIApAQCAtMTM0LDEzICsxOTUsMTMgQEAKIAogICAgICAgc2l6ZV90IG1pbldvcmtlckNvdW50ID0gMjsKIAotICAgICAgc2l6ZV90IG1heFdvcmtlckNvdW50ID0gNTEyOworICAgICAgc2l6ZV90IG1heFdvcmtlckNvdW50ID0gODsKIAotICAgICAgc2l6ZV90IHRhc2tzUGVyV29ya2VyID0gMTAwMDsKKyAgICAgIHNpemVfdCB0YXNrc1BlcldvcmtlciA9IDEwMCAqIFdFSUdIVDsKIAotICAgICAgaW50NjRfdCBkZWxheSA9IDEwTEw7CisgICAgICBpbnQ2NF90IGRlbGF5ID0gNUxMOwogCi0gICAgICBmb3IgKHNpemVfdCB3b3JrZXJDb3VudCA9IG1pbldvcmtlckNvdW50OyB3b3JrZXJDb3VudCA8IG1heFdvcmtlckNvdW50OyB3b3JrZXJDb3VudCAqPSAyKSB7CisgICAgICBmb3IgKHNpemVfdCB3b3JrZXJDb3VudCA9IG1pbldvcmtlckNvdW50OyB3b3JrZXJDb3VudCA8PSBtYXhXb3JrZXJDb3VudDsgd29ya2VyQ291bnQgKj0gNCkgewogCiAgICAgICAgIHNpemVfdCB0YXNrQ291bnQgPSB3b3JrZXJDb3VudCAqIHRhc2tzUGVyV29ya2VyOwogCkBAIC0xNDksOCArMjEwLDE1IEBACiAKICAgICAgICAgVGhyZWFkTWFuYWdlclRlc3RzIHRocmVhZE1hbmFnZXJUZXN0czsKIAotICAgICAgICB0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpOworICAgICAgICBpZiAoIXRocmVhZE1hbmFnZXJUZXN0cy5sb2FkVGVzdCh0YXNrQ291bnQsIGRlbGF5LCB3b3JrZXJDb3VudCkpCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWRUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CisKKyAgc3RkOjpjb3V0IDw8ICJBTEwgVEVTVFMgUEFTU0VEIiA8PCBzdGQ6OmVuZGw7CisgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oCmluZGV4IDYzNWM4YTIuLmZlYmUzZjggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeVRlc3RzLmgKQEAgLTE5LDIwICsxOSwyMCBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiBuYW1lc3BhY2UgdGVzdCB7CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIAogLyoqCkBAIC00MywzNiArNDMsNiBAQAogY2xhc3MgVGhyZWFkRmFjdG9yeVRlc3RzIHsKIAogcHVibGljOgotICBzdGF0aWMgY29uc3QgZG91YmxlIFRFU1RfVE9MRVJBTkNFOwotCi0gIGNsYXNzIFRhc2sgOiBwdWJsaWMgUnVubmFibGUgewotCi0gIHB1YmxpYzoKLSAgICBUYXNrKCkge30KLQotICAgIHZvaWQgcnVuKCkgeyBzdGQ6OmNvdXQgPDwgIlx0XHRcdEhlbGxvIFdvcmxkIiA8PCBzdGQ6OmVuZGw7IH0KLSAgfTsKLQotICAvKioKLSAgICogSGVsbG8gd29ybGQgdGVzdAotICAgKi8KLSAgYm9vbCBoZWxsb1dvcmxkVGVzdCgpIHsKLQotICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7Ci0KLSAgICBzaGFyZWRfcHRyPFRhc2s+IHRhc2sgPSBzaGFyZWRfcHRyPFRhc2s+KG5ldyBUaHJlYWRGYWN0b3J5VGVzdHM6OlRhc2soKSk7Ci0KLSAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQodGFzayk7Ci0KLSAgICB0aHJlYWQtPnN0YXJ0KCk7Ci0KLSAgICB0aHJlYWQtPmpvaW4oKTsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0U3VjY2VzcyEiIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KICAgLyoqCiAgICAqIFJlYXAgTiB0aHJlYWRzCiAgICAqLwpAQCAtODEsNDEgKzUxLDM1IEBACiAgIHB1YmxpYzoKICAgICBSZWFwTlRhc2soTW9uaXRvciYgbW9uaXRvciwgaW50JiBhY3RpdmVDb3VudCkgOiBfbW9uaXRvcihtb25pdG9yKSwgX2NvdW50KGFjdGl2ZUNvdW50KSB7fQogCi0gICAgdm9pZCBydW4oKSB7CisgICAgdm9pZCBydW4oKSBvdmVycmlkZSB7CiAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0KLSAgICAgIF9jb3VudC0tOwotCi0gICAgICAvLyBzdGQ6OmNvdXQgPDwgIlx0XHRcdHRocmVhZCBjb3VudDogIiA8PCBfY291bnQgPDwgc3RkOjplbmRsOwotCi0gICAgICBpZiAoX2NvdW50ID09IDApIHsKKyAgICAgIAorICAgICAgaWYgKC0tX2NvdW50ID09IDApIHsKICAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7CiAgICAgICB9CiAgICAgfQogCiAgICAgTW9uaXRvciYgX21vbml0b3I7Ci0KICAgICBpbnQmIF9jb3VudDsKICAgfTsKIAogICBib29sIHJlYXBOVGhyZWFkcyhpbnQgbG9vcCA9IDEsIGludCBjb3VudCA9IDEwKSB7CiAKLSAgICBQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpOwotCi0gICAgTW9uaXRvciogbW9uaXRvciA9IG5ldyBNb25pdG9yKCk7CisgICAgVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gVGhyZWFkRmFjdG9yeSgpOworICAgIHNoYXJlZF9wdHI8TW9uaXRvcj4gbW9uaXRvcihuZXcgTW9uaXRvcik7CiAKICAgICBmb3IgKGludCBsaXggPSAwOyBsaXggPCBsb29wOyBsaXgrKykgewogCi0gICAgICBpbnQqIGFjdGl2ZUNvdW50ID0gbmV3IGludChjb3VudCk7CisgICAgICBpbnQgYWN0aXZlQ291bnQgPSAwOwogCi0gICAgICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiB0aHJlYWRzOwotCisgICAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPFRocmVhZD4gPiB0aHJlYWRzOwogICAgICAgaW50IHRpeDsKIAogICAgICAgZm9yICh0aXggPSAwOyB0aXggPCBjb3VudDsgdGl4KyspIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICB0aHJlYWRzLmluc2VydCgKLSAgICAgICAgICAgICAgdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQoc2hhcmVkX3B0cjxSdW5uYWJsZT4obmV3IFJlYXBOVGFzaygqbW9uaXRvciwgKmFjdGl2ZUNvdW50KSkpKTsKKyAgICAgICAgICArK2FjdGl2ZUNvdW50OworICAgICAgICAgIHRocmVhZHMucHVzaF9iYWNrKAorICAgICAgICAgICAgICB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPihuZXcgUmVhcE5UYXNrKCptb25pdG9yLCBhY3RpdmVDb3VudCkpKSk7CiAgICAgICAgIH0gY2F0Y2ggKFN5c3RlbVJlc291cmNlRXhjZXB0aW9uJiBlKSB7CiAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmYWlsZWQgdG8gY3JlYXRlICIgPDwgbGl4KiBjb3VudCArIHRpeCA8PCAiIHRocmVhZCAiIDw8IGUud2hhdCgpCiAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKQEAgLTEyNCw3ICs4OCw3IEBACiAgICAgICB9CiAKICAgICAgIHRpeCA9IDA7Ci0gICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSB0aHJlYWRzLmJlZ2luKCk7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSB0aHJlYWRzLmJlZ2luKCk7CiAgICAgICAgICAgIHRocmVhZCAhPSB0aHJlYWRzLmVuZCgpOwogICAgICAgICAgICB0aXgrKywgKyt0aHJlYWQpIHsKIApAQCAtMTM5LDE2ICsxMDMsMTUgQEAKIAogICAgICAgewogICAgICAgICBTeW5jaHJvbml6ZWQgcygqbW9uaXRvcik7Ci0gICAgICAgIHdoaWxlICgqYWN0aXZlQ291bnQgPiAwKSB7CisgICAgICAgIHdoaWxlIChhY3RpdmVDb3VudCA+IDApIHsKICAgICAgICAgICBtb25pdG9yLT53YWl0KDEwMDApOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBkZWxldGUgYWN0aXZlQ291bnQ7CisgICAgICAKICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0cmVhcGVkICIgPDwgbGl4KiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKICAgICB9CiAKICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFN1Y2Nlc3MhIiA8PCBzdGQ6OmVuZGw7Ci0KICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCkBAIC0xNTksNyArMTIyLDcgQEAKIAogICAgIFN5bmNoU3RhcnRUYXNrKE1vbml0b3ImIG1vbml0b3IsIHZvbGF0aWxlIFNUQVRFJiBzdGF0ZSkgOiBfbW9uaXRvcihtb25pdG9yKSwgX3N0YXRlKHN0YXRlKSB7fQogCi0gICAgdm9pZCBydW4oKSB7CisgICAgdm9pZCBydW4oKSBvdmVycmlkZSB7CiAgICAgICB7CiAgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKICAgICAgICAgaWYgKF9zdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRJTkcpIHsKQEAgLTE5NSw3ICsxNTgsNyBAQAogICAgIHNoYXJlZF9wdHI8U3luY2hTdGFydFRhc2s+IHRhc2sKICAgICAgICAgPSBzaGFyZWRfcHRyPFN5bmNoU3RhcnRUYXNrPihuZXcgU3luY2hTdGFydFRhc2sobW9uaXRvciwgc3RhdGUpKTsKIAotICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7CisgICAgVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gVGhyZWFkRmFjdG9yeSgpOwogCiAgICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9IHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHRhc2spOwogCkBAIC0yNDQsMTUgKzIwNywyMiBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgLyoqIFNlZSBob3cgYWNjdXJhdGUgbW9uaXRvciB0aW1lb3V0IGlzLiAqLworICAvKioKKyAgICogVGhlIG9ubHkgZ3VhcmFudGVlIGEgbW9uaXRvciB0aW1lb3V0IGNhbiBnaXZlIHlvdSBpcyB0aGF0CisgICAqIGl0IHdpbGwgdGFrZSAiYXQgbGVhc3QiIGFzIGxvbmcgYXMgdGhlIHRpbWVvdXQsIG5vIGxlc3MuCisgICAqIFRoZXJlIGlzIGFic29sdXRlbHkgbm8gZ3VhcmFudGVlIGFyb3VuZCByZWdhaW5pbmcgZXhlY3V0aW9uCisgICAqIG5lYXIgdGhlIHRpbWVvdXQuICBPbiBhIGJ1c3kgc3lzdGVtIChsaWtlIGluc2lkZSBhIHRoaXJkIHBhcnR5CisgICAqIENJIGVudmlyb25tZW50KSBpdCBjb3VsZCB0YWtlIHF1aXRlIGEgYml0IGxvbmdlciB0aGFuIHRoZQorICAgKiByZXF1ZXN0ZWQgdGltZW91dCwgYW5kIHRoYXQncyBvay4KKyAgICovCiAKLSAgYm9vbCBtb25pdG9yVGltZW91dFRlc3Qoc2l6ZV90IGNvdW50ID0gMTAwMCwgaW50NjRfdCB0aW1lb3V0ID0gMTApIHsKKyAgYm9vbCBtb25pdG9yVGltZW91dFRlc3QoaW50NjRfdCBjb3VudCA9IDEwMDAsIGludDY0X3QgdGltZW91dCA9IDIpIHsKIAogICAgIE1vbml0b3IgbW9uaXRvcjsKIAotICAgIGludDY0X3Qgc3RhcnRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZSA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKIAotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjb3VudDsgaXgrKykgeworICAgIGZvciAoaW50NjRfdCBpeCA9IDA7IGl4IDwgY291bnQ7IGl4KyspIHsKICAgICAgIHsKICAgICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7CiAgICAgICAgIHRyeSB7CkBAIC0yNjIsMjAgKzIzMiwxMyBAQAogICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3QgZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgaW50NjRfdCBlbmRUaW1lID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOwogCi0gICAgZG91YmxlIGVycm9yID0gKChlbmRUaW1lIC0gc3RhcnRUaW1lKSAtIChjb3VudCAqIHRpbWVvdXQpKSAvIChkb3VibGUpKGNvdW50ICogdGltZW91dCk7Ci0KLSAgICBpZiAoZXJyb3IgPCAwLjApIHsKLQotICAgICAgZXJyb3IgKj0gMS4wOwotICAgIH0KLQotICAgIGJvb2wgc3VjY2VzcyA9IGVycm9yIDwgVGhyZWFkRmFjdG9yeVRlc3RzOjpURVNUX1RPTEVSQU5DRTsKKyAgYm9vbCBzdWNjZXNzID0gKGVuZFRpbWUgLSBzdGFydFRpbWUpID49IChjb3VudCAqIHRpbWVvdXQpOwogCiAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKQotICAgICAgICAgICAgICA8PCAiISBleHBlY3RlZCB0aW1lOiAiIDw8IGNvdW50ICogdGltZW91dAotICAgICAgICAgICAgICA8PCAibXMgZWxhcHNlZCB0aW1lOiAiIDw8IGVuZFRpbWUgLSBzdGFydFRpbWUgPDwgIm1zIGVycm9yJTogIiA8PCBlcnJvciAqIDEwMC4wCisgICAgICAgICAgICAgIDw8ICI6IG1pbmltdW0gcmVxdWlyZWQgdGltZSB0byBlbGFwc2UgIiA8PCBjb3VudCAqIHRpbWVvdXQKKyAgICAgICAgICAgICAgPDwgIm1zOyBhY3R1YWwgZWxhcHNlZCB0aW1lICIgPDwgZW5kVGltZSAtIHN0YXJ0VGltZSA8PCAibXMiCiAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKIAogICAgIHJldHVybiBzdWNjZXNzOwpAQCAtMjgzLDQ2ICsyNDYsNDQgQEAKIAogICBjbGFzcyBGbG9vZFRhc2sgOiBwdWJsaWMgUnVubmFibGUgewogICBwdWJsaWM6Ci0gICAgRmxvb2RUYXNrKGNvbnN0IHNpemVfdCBpZCkgOiBfaWQoaWQpIHt9Ci0gICAgfkZsb29kVGFzaygpIHsKLSAgICAgIGlmIChfaWQgJSAxMDAwID09IDApIHsKKyAgICBGbG9vZFRhc2soY29uc3Qgc2l6ZV90IGlkLCBNb25pdG9yJiBtb24pIDogX2lkKGlkKSwgX21vbihtb24pIHt9CisgICAgfkZsb29kVGFzaygpIG92ZXJyaWRlIHsKKyAgICAgIGlmIChfaWQgJSAxMDAwMCA9PSAwKSB7CisJCVN5bmNocm9uaXplZCBzeW5jKF9tb24pOwogICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHR0aHJlYWQgIiA8PCBfaWQgPDwgIiBkb25lIiA8PCBzdGQ6OmVuZGw7CiAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBydW4oKSB7Ci0gICAgICBpZiAoX2lkICUgMTAwMCA9PSAwKSB7CisgICAgdm9pZCBydW4oKSBvdmVycmlkZSB7CisgICAgICBpZiAoX2lkICUgMTAwMDAgPT0gMCkgeworCQlTeW5jaHJvbml6ZWQgc3luYyhfbW9uKTsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgc3RhcnRlZCIgPDwgc3RkOjplbmRsOwogICAgICAgfQotCi0gICAgICBUSFJJRlRfU0xFRVBfVVNFQygxKTsKICAgICB9CiAgICAgY29uc3Qgc2l6ZV90IF9pZDsKKyAgICBNb25pdG9yJiBfbW9uOwogICB9OwogCi0gIHZvaWQgZm9vKFBsYXRmb3JtVGhyZWFkRmFjdG9yeSogdGYpIHsgKHZvaWQpdGY7IH0KKyAgdm9pZCBmb28oVGhyZWFkRmFjdG9yeSogdGYpIHsgKHZvaWQpdGY7IH0KIAogICBib29sIGZsb29kTlRlc3Qoc2l6ZV90IGxvb3AgPSAxLCBzaXplX3QgY291bnQgPSAxMDAwMDApIHsKIAogICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotCisgICAgTW9uaXRvciBtb247CisJCiAgICAgZm9yIChzaXplX3QgbGl4ID0gMDsgbGl4IDwgbG9vcDsgbGl4KyspIHsKIAotICAgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKTsKKyAgICAgIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IFRocmVhZEZhY3RvcnkoKTsKICAgICAgIHRocmVhZEZhY3Rvcnkuc2V0RGV0YWNoZWQodHJ1ZSk7CiAKICAgICAgIGZvciAoc2l6ZV90IHRpeCA9IDA7IHRpeCA8IGNvdW50OyB0aXgrKykgewogCiAgICAgICAgIHRyeSB7CiAKLSAgICAgICAgICBzaGFyZWRfcHRyPEZsb29kVGFzaz4gdGFzayhuZXcgRmxvb2RUYXNrKGxpeCAqIGNvdW50ICsgdGl4KSk7Ci0KKyAgICAgICAgICBzaGFyZWRfcHRyPEZsb29kVGFzaz4gdGFzayhuZXcgRmxvb2RUYXNrKGxpeCAqIGNvdW50ICsgdGl4LCBtb24pKTsKICAgICAgICAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQodGFzayk7Ci0KICAgICAgICAgICB0aHJlYWQtPnN0YXJ0KCk7CiAKLSAgICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQygxKTsKLQogICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uJiBlKSB7CiAKICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBzdGFydCAgIiA8PCBsaXgqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkKQEAgLTMzMiw4ICsyOTMsOCBAQAogICAgICAgICB9CiAgICAgICB9CiAKKyAgICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbik7CiAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZsb29kZWQgIiA8PCAobGl4ICsgMSkgKiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKLQogICAgICAgc3VjY2VzcyA9IHRydWU7CiAgICAgfQogCkBAIC0zNDEsNyArMzAyLDYgQEAKICAgfQogfTsKIAotY29uc3QgZG91YmxlIFRocmVhZEZhY3RvcnlUZXN0czo6VEVTVF9UT0xFUkFOQ0UgPSAuMjA7CiB9CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmggYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmgKaW5kZXggMDhlODE3OS4uZmVlN2M3YyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXJUZXN0cy5oCisrKyBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaApAQCAtMTksMTQgKzE5LDEzIEBACiAKICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CkBAIC0zNiwzNCArMzUsNDEgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIAotY2xhc3MgVGhyZWFkTWFuYWdlclRlc3RzIHsKK3N0YXRpYyBzdGQ6OmRlcXVlPHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gPiBtX2V4cGlyZWQ7CitzdGF0aWMgdm9pZCBleHBpcmVkTm90aWZpZXIoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkKK3sKKyAgbV9leHBpcmVkLnB1c2hfYmFjayhydW5uYWJsZSk7Cit9CiAKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBURVNUX1RPTEVSQU5DRTsKK3N0YXRpYyB2b2lkIHNsZWVwXyhpbnQ2NF90IG1pbGxpc2VjKSB7CisgIE1vbml0b3IgX3NsZWVwOworICBTeW5jaHJvbml6ZWQgcyhfc2xlZXApOworCisgIHRyeSB7CisgICAgX3NsZWVwLndhaXQobWlsbGlzZWMpOworICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICA7CisgIH0gY2F0Y2ggKC4uLikgeworICAgIGFzc2VydCgwKTsKKyAgfQorfQorCitjbGFzcyBUaHJlYWRNYW5hZ2VyVGVzdHMgewogCiBwdWJsaWM6CiAgIGNsYXNzIFRhc2sgOiBwdWJsaWMgUnVubmFibGUgewogCiAgIHB1YmxpYzoKICAgICBUYXNrKE1vbml0b3ImIG1vbml0b3IsIHNpemVfdCYgY291bnQsIGludDY0X3QgdGltZW91dCkKLSAgICAgIDogX21vbml0b3IobW9uaXRvciksIF9jb3VudChjb3VudCksIF90aW1lb3V0KHRpbWVvdXQpLCBfZG9uZShmYWxzZSkge30KKyAgICAgIDogX21vbml0b3IobW9uaXRvciksIF9jb3VudChjb3VudCksIF90aW1lb3V0KHRpbWVvdXQpLCBfc3RhcnRUaW1lKDApLCBfZW5kVGltZSgwKSwgX2RvbmUoZmFsc2UpIHt9CiAKLSAgICB2b2lkIHJ1bigpIHsKKyAgICB2b2lkIHJ1bigpIG92ZXJyaWRlIHsKIAotICAgICAgX3N0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICBfc3RhcnRUaW1lID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOwogCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKF9zbGVlcCk7CisgICAgICBzbGVlcF8oX3RpbWVvdXQpOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgX3NsZWVwLndhaXQoX3RpbWVvdXQpOwotICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKLSAgICAgICAgICA7Ci0gICAgICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgICAgIGFzc2VydCgwKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICBfZW5kVGltZSA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKIAogICAgICAgX2RvbmUgPSB0cnVlOwogCkBAIC03Myw5ICs3OSw3IEBACiAgICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiVGhyZWFkICIgPDwgX2NvdW50IDw8ICIgY29tcGxldGVkICIgPDwgc3RkOjplbmRsOwogCiAgICAgICAgIF9jb3VudC0tOwotCi0gICAgICAgIGlmIChfY291bnQgPT0gMCkgewotCisgICAgICAgIGlmIChfY291bnQgJSAxMDAwMCA9PSAwKSB7CiAgICAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTEwMywxMiArMTA3LDkgQEAKIAogICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOwogCi0gICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKLSAgICAgICAgPSBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKKyAgICBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKKyAgICAgICAgPSBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+KG5ldyBUaHJlYWRGYWN0b3J5KGZhbHNlKSk7CiAKLSNpZiAhVVNFX0JPT1NUX1RIUkVBRCAmJiAhVVNFX1NURF9USFJFQUQKLSAgICB0aHJlYWRGYWN0b3J5LT5zZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpOwotI2VuZGlmCiAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKIAogICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CkBAIC0xMjEsMjUgKzEyMiwyNyBAQAogICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2sobW9uaXRvciwgYWN0aXZlQ291bnQsIHRpbWVvdXQpKSk7CiAgICAgfQogCi0gICAgaW50NjRfdCB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIGludDY0X3QgdGltZTAwID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOwogCi0gICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gPjo6aXRlcmF0b3IgaXggPSB0YXNrcy5iZWdpbigpOworICAgIGZvciAoYXV0byBpeCA9IHRhc2tzLmJlZ2luKCk7CiAgICAgICAgICBpeCAhPSB0YXNrcy5lbmQoKTsKICAgICAgICAgIGl4KyspIHsKIAogICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKCppeCk7CiAgICAgfQogCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGxvYWRlZCAiIDw8IGNvdW50IDw8ICIgdGFza3MgdG8gZXhlY3V0ZSIgPDwgc3RkOjplbmRsOworCiAgICAgewogICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7CiAKICAgICAgIHdoaWxlIChhY3RpdmVDb3VudCA+IDApIHsKLQorICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWN0aXZlQ291bnQgPSAiIDw8IGFjdGl2ZUNvdW50IDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgbW9uaXRvci53YWl0KCk7CiAgICAgICB9CiAgICAgfQogCi0gICAgaW50NjRfdCB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIGludDY0X3QgdGltZTAxID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOwogCiAgICAgaW50NjRfdCBmaXJzdFRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CiAgICAgaW50NjRfdCBsYXN0VGltZSA9IDA7CkBAIC0xNDgsNyArMTUxLDcgQEAKICAgICBpbnQ2NF90IG1pblRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CiAgICAgaW50NjRfdCBtYXhUaW1lID0gMDsKIAotICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsKKyAgICBmb3IgKGF1dG8gaXggPSB0YXNrcy5iZWdpbigpOwogICAgICAgICAgaXggIT0gdGFza3MuZW5kKCk7CiAgICAgICAgICBpeCsrKSB7CiAKQEAgLTE3OSwyMyArMTgyLDE1IEBACiAKICAgICBhdmVyYWdlVGltZSAvPSBjb3VudDsKIAotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0Zmlyc3Qgc3RhcnQ6ICIgPDwgZmlyc3RUaW1lIDw8ICJtcyBMYXN0IGVuZDogIiA8PCBsYXN0VGltZQotICAgICAgICAgICAgICA8PCAibXMgbWluOiAiIDw8IG1pblRpbWUgPDwgIm1zIG1heDogIiA8PCBtYXhUaW1lIDw8ICJtcyBhdmVyYWdlOiAiIDw8IGF2ZXJhZ2VUaW1lCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmaXJzdCBzdGFydDogIiA8PCBmaXJzdFRpbWUgPDwgIiBMYXN0IGVuZDogIiA8PCBsYXN0VGltZQorICAgICAgICAgICAgICA8PCAiIG1pbjogIiA8PCBtaW5UaW1lIDw8ICJtcyBtYXg6ICIgPDwgbWF4VGltZSA8PCAibXMgYXZlcmFnZTogIiA8PCBhdmVyYWdlVGltZQogICAgICAgICAgICAgICA8PCAibXMiIDw8IHN0ZDo6ZW5kbDsKIAotICAgIGRvdWJsZSBleHBlY3RlZFRpbWUgPSAoZG91YmxlKGNvdW50ICsgKHdvcmtlckNvdW50IC0gMSkpIC8gd29ya2VyQ291bnQpICogdGltZW91dDsKLQotICAgIGRvdWJsZSBlcnJvciA9ICgodGltZTAxIC0gdGltZTAwKSAtIGV4cGVjdGVkVGltZSkgLyBleHBlY3RlZFRpbWU7Ci0KLSAgICBpZiAoZXJyb3IgPCAwKSB7Ci0gICAgICBlcnJvciAqPSAtMS4wOwotICAgIH0KLQotICAgIGJvb2wgc3VjY2VzcyA9IGVycm9yIDwgVEVTVF9UT0xFUkFOQ0U7CisgICAgYm9vbCBzdWNjZXNzID0gKHRpbWUwMSAtIHRpbWUwMCkgPj0gKChpbnQ2NF90KWNvdW50ICogdGltZW91dCkgLyAoaW50NjRfdCl3b3JrZXJDb3VudDsKIAogICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikKLSAgICAgICAgICAgICAgPDwgIiEgZXhwZWN0ZWQgdGltZTogIiA8PCBleHBlY3RlZFRpbWUgPDwgIm1zIGVsYXBzZWQgdGltZTogIiA8PCB0aW1lMDEgLSB0aW1lMDAKLSAgICAgICAgICAgICAgPDwgIm1zIGVycm9yJTogIiA8PCBlcnJvciAqIDEwMC4wIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgPDwgIiEgZXhwZWN0ZWQgdGltZTogIiA8PCAoKGludDY0X3QpY291bnQgKiB0aW1lb3V0KSAvIChpbnQ2NF90KXdvcmtlckNvdW50IDw8ICJtcyBlbGFwc2VkIHRpbWU6ICIgPDwgdGltZTAxIC0gdGltZTAwCisgICAgICAgICAgICAgIDw8ICJtcyIgPDwgc3RkOjplbmRsOwogCiAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgIH0KQEAgLTIwMywzMCArMTk4LDM2IEBACiAgIGNsYXNzIEJsb2NrVGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CiAKICAgcHVibGljOgotICAgIEJsb2NrVGFzayhNb25pdG9yJiBtb25pdG9yLCBNb25pdG9yJiBibW9uaXRvciwgc2l6ZV90JiBjb3VudCkKLSAgICAgIDogX21vbml0b3IobW9uaXRvciksIF9ibW9uaXRvcihibW9uaXRvciksIF9jb3VudChjb3VudCkge30KKyAgICBCbG9ja1Rhc2soTW9uaXRvciYgZW50cnlNb25pdG9yLCBNb25pdG9yJiBibG9ja01vbml0b3IsIGJvb2wmIGJsb2NrZWQsIE1vbml0b3ImIGRvbmVNb25pdG9yLCBzaXplX3QmIGNvdW50KQorICAgICAgOiBfZW50cnlNb25pdG9yKGVudHJ5TW9uaXRvciksIF9lbnRlcmVkKGZhbHNlKSwgX2Jsb2NrTW9uaXRvcihibG9ja01vbml0b3IpLCBfYmxvY2tlZChibG9ja2VkKSwgX2RvbmVNb25pdG9yKGRvbmVNb25pdG9yKSwgX2NvdW50KGNvdW50KSB7fQogCi0gICAgdm9pZCBydW4oKSB7CisgICAgdm9pZCBydW4oKSBvdmVycmlkZSB7CiAgICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKF9ibW9uaXRvcik7Ci0KLSAgICAgICAgX2Jtb25pdG9yLndhaXQoKTsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX2VudHJ5TW9uaXRvcik7CisgICAgICAgIF9lbnRlcmVkID0gdHJ1ZTsKKyAgICAgICAgX2VudHJ5TW9uaXRvci5ub3RpZnkoKTsKICAgICAgIH0KIAogICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9ibG9ja01vbml0b3IpOworICAgICAgICB3aGlsZSAoX2Jsb2NrZWQpIHsKKyAgICAgICAgICBfYmxvY2tNb25pdG9yLndhaXQoKTsKKyAgICAgICAgfQorICAgICAgfQogCi0gICAgICAgIF9jb3VudC0tOwotCi0gICAgICAgIGlmIChfY291bnQgPT0gMCkgewotCi0gICAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7CisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9kb25lTW9uaXRvcik7CisgICAgICAgIGlmICgtLV9jb3VudCA9PSAwKSB7CisgICAgICAgICAgX2RvbmVNb25pdG9yLm5vdGlmeSgpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogCi0gICAgTW9uaXRvciYgX21vbml0b3I7Ci0gICAgTW9uaXRvciYgX2Jtb25pdG9yOworICAgIE1vbml0b3ImIF9lbnRyeU1vbml0b3I7CisgICAgYm9vbCBfZW50ZXJlZDsKKyAgICBNb25pdG9yJiBfYmxvY2tNb25pdG9yOworICAgIGJvb2wmIF9ibG9ja2VkOworICAgIE1vbml0b3ImIF9kb25lTW9uaXRvcjsKICAgICBzaXplX3QmIF9jb3VudDsKICAgfTsKIApAQCAtMjQwLDggKzI0MSwxMCBAQAogCiAgICAgdHJ5IHsKIAotICAgICAgTW9uaXRvciBibW9uaXRvcjsKLSAgICAgIE1vbml0b3IgbW9uaXRvcjsKKyAgICAgIE1vbml0b3IgZW50cnlNb25pdG9yOyAgIC8vIG5vdCB1c2VkIGJ5IHRoaXMgdGVzdAorICAgICAgTW9uaXRvciBibG9ja01vbml0b3I7CisgICAgICBib29sIGJsb2NrZWRbXSA9IHt0cnVlLCB0cnVlLCB0cnVlfTsKKyAgICAgIE1vbml0b3IgZG9uZU1vbml0b3I7CiAKICAgICAgIHNpemVfdCBwZW5kaW5nVGFza01heENvdW50ID0gd29ya2VyQ291bnQ7CiAKQEAgLTI1MCwzMSArMjUzLDI5IEBACiAgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIKICAgICAgICAgICA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQsIHBlbmRpbmdUYXNrTWF4Q291bnQpOwogCi0gICAgICBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQotICAgICAgICAgID0gc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CisgICAgICBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKKyAgICAgICAgICA9IHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4obmV3IFRocmVhZEZhY3RvcnkoKSk7CiAKLSNpZiAhVVNFX0JPT1NUX1RIUkVBRCAmJiAhVVNFX1NURF9USFJFQUQKLSAgICAgIHRocmVhZEZhY3RvcnktPnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCk7Ci0jZW5kaWYKICAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CiAKICAgICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CiAKLSAgICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID4gdGFza3M7CisgICAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiA+IHRhc2tzOworICAgICAgdGFza3MucmVzZXJ2ZSh3b3JrZXJDb3VudCArIHBlbmRpbmdUYXNrTWF4Q291bnQpOwogCiAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgd29ya2VyQ291bnQ7IGl4KyspIHsKIAotICAgICAgICB0YXNrcy5pbnNlcnQoc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4oCi0gICAgICAgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2sobW9uaXRvciwgYm1vbml0b3IsIGFjdGl2ZUNvdW50c1swXSkpKTsKKyAgICAgICAgdGFza3MucHVzaF9iYWNrKHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+KAorICAgICAgICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKGVudHJ5TW9uaXRvciwgYmxvY2tNb25pdG9yLCBibG9ja2VkWzBdLCBkb25lTW9uaXRvciwgYWN0aXZlQ291bnRzWzBdKSkpOwogICAgICAgfQogCiAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcGVuZGluZ1Rhc2tNYXhDb3VudDsgaXgrKykgewogCi0gICAgICAgIHRhc2tzLmluc2VydChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPigKLSAgICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhtb25pdG9yLCBibW9uaXRvciwgYWN0aXZlQ291bnRzWzFdKSkpOworICAgICAgICB0YXNrcy5wdXNoX2JhY2soc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4oCisgICAgICAgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2soZW50cnlNb25pdG9yLCBibG9ja01vbml0b3IsIGJsb2NrZWRbMV0sIGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudHNbMV0pKSk7CiAgICAgICB9CiAKLSAgICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gPjo6aXRlcmF0b3IgaXggPSB0YXNrcy5iZWdpbigpOworICAgICAgZm9yIChhdXRvIGl4ID0gdGFza3MuYmVnaW4oKTsKICAgICAgICAgICAgaXggIT0gdGFza3MuZW5kKCk7CiAgICAgICAgICAgIGl4KyspIHsKICAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKCppeCk7CkBAIC0yODUsNyArMjg2LDcgQEAKICAgICAgIH0KIAogICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gZXh0cmFUYXNrKAotICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhtb25pdG9yLCBibW9uaXRvciwgYWN0aXZlQ291bnRzWzJdKSk7CisgICAgICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKGVudHJ5TW9uaXRvciwgYmxvY2tNb25pdG9yLCBibG9ja2VkWzJdLCBkb25lTW9uaXRvciwgYWN0aXZlQ291bnRzWzJdKSk7CiAKICAgICAgIHRyeSB7CiAgICAgICAgIHRocmVhZE1hbmFnZXItPmFkZChleHRyYVRhc2ssIDEpOwpAQCAtMzA5LDE2ICszMTAsMTUgQEAKICAgICAgICAgICAgICAgICA8PCAiUGVuZGluZyB0YXNrcyAiIDw8IHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSA8PCBzdGQ6OmVuZGw7CiAKICAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoYm1vbml0b3IpOwotCi0gICAgICAgIGJtb25pdG9yLm5vdGlmeUFsbCgpOworICAgICAgICBTeW5jaHJvbml6ZWQgcyhibG9ja01vbml0b3IpOworICAgICAgICBibG9ja2VkWzBdID0gZmFsc2U7CisgICAgICAgIGJsb2NrTW9uaXRvci5ub3RpZnlBbGwoKTsKICAgICAgIH0KIAogICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKLQorICAgICAgICBTeW5jaHJvbml6ZWQgcyhkb25lTW9uaXRvcik7CiAgICAgICAgIHdoaWxlIChhY3RpdmVDb3VudHNbMF0gIT0gMCkgewotICAgICAgICAgIG1vbml0b3Iud2FpdCgpOworICAgICAgICAgIGRvbmVNb25pdG9yLndhaXQoKTsKICAgICAgICAgfQogICAgICAgfQogCkBAIC0zNDEsMzcgKzM0MSwzNyBAQAogICAgICAgLy8gV2FrZSB1cCB0YXNrcyB0aGF0IHdlcmUgcGVuZGluZyBiZWZvcmUgYW5kIHdhaXQgZm9yIHRoZW0gdG8gY29tcGxldGUKIAogICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhibW9uaXRvcik7Ci0KLSAgICAgICAgYm1vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGJsb2NrTW9uaXRvcik7CisgICAgICAgIGJsb2NrZWRbMV0gPSBmYWxzZTsKKyAgICAgICAgYmxvY2tNb25pdG9yLm5vdGlmeUFsbCgpOwogICAgICAgfQogCiAgICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCisgICAgICAgIFN5bmNocm9uaXplZCBzKGRvbmVNb25pdG9yKTsKICAgICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50c1sxXSAhPSAwKSB7Ci0gICAgICAgICAgbW9uaXRvci53YWl0KCk7CisgICAgICAgICAgZG9uZU1vbml0b3Iud2FpdCgpOwogICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIC8vIFdha2UgdXAgdGhlIGV4dHJhIHRhc2sgYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlCiAKICAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoYm1vbml0b3IpOwotCi0gICAgICAgIGJtb25pdG9yLm5vdGlmeUFsbCgpOworICAgICAgICBTeW5jaHJvbml6ZWQgcyhibG9ja01vbml0b3IpOworICAgICAgICBibG9ja2VkWzJdID0gZmFsc2U7CisgICAgICAgIGJsb2NrTW9uaXRvci5ub3RpZnlBbGwoKTsKICAgICAgIH0KIAogICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKLQorICAgICAgICBTeW5jaHJvbml6ZWQgcyhkb25lTW9uaXRvcik7CiAgICAgICAgIHdoaWxlIChhY3RpdmVDb3VudHNbMl0gIT0gMCkgewotICAgICAgICAgIG1vbml0b3Iud2FpdCgpOworICAgICAgICAgIGRvbmVNb25pdG9yLndhaXQoKTsKICAgICAgICAgfQogICAgICAgfQogCisgICAgICB0aHJlYWRNYW5hZ2VyLT5zdG9wKCk7CisKICAgICAgIGlmICghKHN1Y2Nlc3MgPSAodGhyZWFkTWFuYWdlci0+dG90YWxUYXNrQ291bnQoKSA9PSAwKSkpIHsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBwZW5kaW5nIHRhc2sgY291bnQiKTsKKyAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0b3RhbCB0YXNrIGNvdW50Iik7CiAgICAgICB9CiAKICAgICB9IGNhdGNoIChURXhjZXB0aW9uJiBlKSB7CkBAIC0zODEsOSArMzgxLDI1NiBAQAogICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikgPDwgc3RkOjplbmRsOwogICAgIHJldHVybiBzdWNjZXNzOwogICB9CisKKworICBib29sIGFwaVRlc3QoKSB7CisKKyAgICAvLyBwcm92ZSBjdXJyZW50VGltZSBoYXMgbWlsbGlzZWNvbmRzIGdyYW51bGFyaXR5IHNpbmNlIG1hbnkgb3RoZXIgdGhpbmdzIGRlcGVuZCBvbiBpdAorICAgIGludDY0X3QgYSA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKKyAgICBzbGVlcF8oMTAwKTsKKyAgICBpbnQ2NF90IGIgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCk7CisgICAgaWYgKGIgLSBhIDwgNTAgfHwgYiAtIGEgPiAxNTApIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0ZXhwZWN0ZWQgMTAwbXMgZ2FwLCBmb3VuZCAiIDw8IChiLWEpIDw8ICJtcyBnYXAgaW5zdGVhZC4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gYXBpVGVzdFdpdGhUaHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4obmV3IFRocmVhZEZhY3RvcnkoKSkpOworCisgIH0KKworICBib29sIGFwaVRlc3RXaXRoVGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkpCisgIHsKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDEpOworICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0c3RhcnRpbmcuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisgICAgdGhyZWFkTWFuYWdlci0+c2V0RXhwaXJlQ2FsbGJhY2soZXhwaXJlZE5vdGlmaWVyKTsgLy8gc3RkOjpiaW5kKCZUaHJlYWRNYW5hZ2VyVGVzdHM6OmV4cGlyZWROb3RpZmllciwgdGhpcykpOworCisjZGVmaW5lIEVYUEVDVChGVU5DLCBDT1VOVCkgeyBzaXplX3QgYyA9IEZVTkM7IGlmIChjICE9IENPVU5UKSB7IHN0ZDo6Y2VyciA8PCAiZXhwZWN0ZWQgIiAjRlVOQyIgdG8gYmUgIiAjQ09VTlQgIiwgYnV0IHdhcyAiIDw8IGMgPDwgc3RkOjplbmRsOyByZXR1cm4gZmFsc2U7IH0gfQorCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIDJuZCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZFdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDIpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMik7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIDJuZCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIDFzdCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIGJsb2NraW5nIHRhc2suLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHRocm93IGEgYmxvY2tpbmcgdGFzayBpbnRvIHRoZSBtaXgKKyAgICBNb25pdG9yIGVudHJ5TW9uaXRvcjsgICAvLyBzaWduYWxlZCB3aGVuIHRhc2sgaXMgcnVubmluZworICAgIE1vbml0b3IgYmxvY2tNb25pdG9yOyAgIC8vIHRvIGJlIHNpZ25hbGVkIHRvIHVuYmxvY2sgdGhlIHRhc2sKKyAgICBib29sIGJsb2NrZWQodHJ1ZSk7ICAgICAvLyBzZXQgdG8gZmFsc2UgYmVmb3JlIG5vdGlmeWluZworICAgIE1vbml0b3IgZG9uZU1vbml0b3I7ICAgIC8vIHNpZ25hbGVkIHdoZW4gY291bnQgcmVhY2hlcyB6ZXJvCisgICAgc2l6ZV90IGFjdGl2ZUNvdW50ID0gMTsKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiBibG9ja2luZ1Rhc2soCisgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2soZW50cnlNb25pdG9yLCBibG9ja01vbml0b3IsIGJsb2NrZWQsIGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudCkpOworICAgIHRocmVhZE1hbmFnZXItPmFkZChibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIG90aGVyIHRhc2suLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiBvdGhlclRhc2soCisgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrKGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudCwgMCkpOworCisgICAgdGhyZWFkTWFuYWdlci0+YWRkKG90aGVyVGFzayk7CisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAyKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRyZW1vdmUgYmxvY2tpbmcgdGFzayBzcGVjaWZpY2FsbHkuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZShibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIG5leHQgcGVuZGluZyB0YXNrLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHNoYXJlZF9wdHI8UnVubmFibGU+IG5leHRUYXNrID0gdGhyZWFkTWFuYWdlci0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKKyAgICBpZiAobmV4dFRhc2sgIT0gb3RoZXJUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCByZW1vdmVOZXh0UGVuZGluZyB0byByZXR1cm4gb3RoZXJUYXNrIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIG5leHQgcGVuZGluZyB0YXNrIChub25lIGxlZnQpLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIG5leHRUYXNrID0gdGhyZWFkTWFuYWdlci0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKKyAgICBpZiAobmV4dFRhc2spIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIHJlbW92ZU5leHRQZW5kaW5nIHRvIHJldHVybiBhbiBlbXB0eSBSdW5uYWJsZSIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRhZGQgMiBleHBpcmVkIHRhc2tzIGFuZCAxIG5vdC4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gZXhwaXJlZFRhc2soCisgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrKGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudCwgMCkpOworCisgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4cGlyZWRUYXNrLCAwLCAxKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoYmxvY2tpbmdUYXNrKTsgICAgICAgLy8gYWRkIG9uZSB0aGF0IGhhc24ndCBleHBpcmVkIHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHNraXBwZWQKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXhwaXJlZFRhc2ssIDAsIDEpOyAgLy8gYWRkIGEgc2Vjb25kIGV4cGlyZWQgdG8gZW5zdXJlIHJlbW92ZUV4cGlyZWRUYXNrcyByZW1vdmVzIGJvdGgKKworICAgIHNsZWVwXyg1MCk7ICAvLyBtYWtlIHN1cmUgZW5vdWdoIHRpbWUgZWxhcHNlcyBmb3IgaXQgdG8gZXhwaXJlIC0gdGhlIHNob3J0ZXN0IGV4cGlyYXRpb24gdGltZSBpcyAxIG1pbGxpc2Vjb25kCisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAzKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+ZXhwaXJlZFRhc2tDb3VudCgpLCAwKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRyZW1vdmUgZXhwaXJlZCB0YXNrcy4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIW1fZXhwaXJlZC5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgZW1wdHkiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVFeHBpcmVkVGFza3MoKTsKKworICAgIGlmIChtX2V4cGlyZWQuc2l6ZSgpICE9IDIpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIG1fZXhwaXJlZCB0byBiZSBzZXQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobV9leHBpcmVkLmZyb250KCkgIT0gZXhwaXJlZFRhc2spIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIG1fZXhwaXJlZFswXSB0byBiZSB0aGUgZXhwaXJlZCB0YXNrIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1fZXhwaXJlZC5wb3BfZnJvbnQoKTsKKworICAgIGlmIChtX2V4cGlyZWQuZnJvbnQoKSAhPSBleHBpcmVkVGFzaykgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkWzFdIHRvIGJlIHRoZSBleHBpcmVkIHRhc2siIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2V4cGlyZWQuY2xlYXIoKTsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZShibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMik7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIGV4cGlyZWQgdGFzayAoYWdhaW4pLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChleHBpcmVkVGFzaywgMCwgMSk7ICAvLyBleHBpcmVzIGluIDFtcworICAgIHNsZWVwXyg1MCk7ICAvLyBtYWtlIHN1cmUgZW5vdWdoIHRpbWUgZWxhcHNlcyBmb3IgaXQgdG8gZXhwaXJlIC0gdGhlIHNob3J0ZXN0IGV4cGlyYXRpb24gdGltZSBpcyAxbXMKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRhZGQgd29ya2VyIHRvIGNvbnN1bWUgZXhwaXJlZCB0YXNrLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZFdvcmtlcigpOworICAgIHNsZWVwXygxMDApOyAgLy8gbWFrZSBzdXJlIGl0IGhhcyB0aW1lIHRvIHNwaW4gdXAgYW5kIGV4cGlyZSB0aGUgdGFzaworCisgICAgaWYgKG1fZXhwaXJlZC5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgc2V0IiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1fZXhwaXJlZC5mcm9udCgpICE9IGV4cGlyZWRUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgdGhlIGV4cGlyZWQgdGFzayIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fZXhwaXJlZC5jbGVhcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMyk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0dHJ5IHRvIHJlbW92ZSB0b28gbWFueSB3b3JrZXJzIiA8PCBzdGQ6OmVuZGw7CisgICAgdHJ5IHsKKyAgICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigyKTsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gY2F0Y2ggKGNvbnN0IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiYpIHsKKyAgICAgIC8qIGV4cGVjdGVkICovCisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMyk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIGJsb2NraW5nIHRhc2suLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIHdvcmtlci4uICIgPDwgc3RkOjplbmRsOworCisgICAgdGhyZWFkTWFuYWdlci0+YWRkV29ya2VyKCk7CisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoZW50cnlNb25pdG9yKTsKKyAgICAgIHdoaWxlICghYmxvY2tpbmdUYXNrLT5fZW50ZXJlZCkgeworICAgICAgICBlbnRyeU1vbml0b3Iud2FpdCgpOworICAgICAgfQorICAgIH0KKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHVuYmxvY2sgdGFzayBhbmQgcmVtb3ZlIHdvcmtlci4uICIgPDwgc3RkOjplbmRsOworCisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoYmxvY2tNb25pdG9yKTsKKyAgICAgIGJsb2NrZWQgPSBmYWxzZTsKKyAgICAgIGJsb2NrTW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICB9CisgICAgdGhyZWFkTWFuYWdlci0+cmVtb3ZlV29ya2VyKCk7CisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAwKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRjbGVhbnVwLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBibG9ja2luZ1Rhc2sucmVzZXQoKTsKKyAgICB0aHJlYWRNYW5hZ2VyLnJlc2V0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KIH07CiAKLWNvbnN0IGRvdWJsZSBUaHJlYWRNYW5hZ2VyVGVzdHM6OlRFU1RfVE9MRVJBTkNFID0gLjIwOwogfQogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmggYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyVGVzdHMuaAppbmRleCBmNDYwMGZjLi4yZDFhMjYyIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyVGVzdHMuaAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyVGVzdHMuaApAQCAtMTgsMTEgKzE4LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnkuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8dGhyZWFkPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKQEAgLTM0LDQyICszNSwyNyBAQAogCiBjbGFzcyBUaW1lck1hbmFnZXJUZXN0cyB7CiAKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBURVNUX1RPTEVSQU5DRTsKLQogcHVibGljOgogICBjbGFzcyBUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKICAgcHVibGljOgotICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgaW50NjRfdCB0aW1lb3V0KQorICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgdWludDY0X3QgdGltZW91dCkKICAgICAgIDogX3RpbWVvdXQodGltZW91dCksCi0gICAgICAgIF9zdGFydFRpbWUoVXRpbDo6Y3VycmVudFRpbWUoKSksCisgICAgICAgIF9zdGFydFRpbWUoc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpKSwKKyAgICAgICAgX2VuZFRpbWUoMCksCiAgICAgICAgIF9tb25pdG9yKG1vbml0b3IpLAogICAgICAgICBfc3VjY2VzcyhmYWxzZSksCiAgICAgICAgIF9kb25lKGZhbHNlKSB7fQogCi0gICAgflRhc2soKSB7IHN0ZDo6Y2VyciA8PCB0aGlzIDw8IHN0ZDo6ZW5kbDsgfQorICAgIH5UYXNrKCkgb3ZlcnJpZGUgeyBzdGQ6OmNlcnIgPDwgdGhpcyA8PCBzdGQ6OmVuZGw7IH0KIAotICAgIHZvaWQgcnVuKCkgeworICAgIHZvaWQgcnVuKCkgb3ZlcnJpZGUgewogCi0gICAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICAgIC8vIEZpZ3VyZSBvdXQgZXJyb3IgcGVyY2VudGFnZQotCi0gICAgICBpbnQ2NF90IGRlbHRhID0gX2VuZFRpbWUgLSBfc3RhcnRUaW1lOwotCi0gICAgICBkZWx0YSA9IGRlbHRhID4gX3RpbWVvdXQgPyBkZWx0YSAtIF90aW1lb3V0IDogX3RpbWVvdXQgLSBkZWx0YTsKLQotICAgICAgZG91YmxlIGVycm9yID0gZG91YmxlKGRlbHRhKSAvIF90aW1lb3V0OwotCi0gICAgICBpZiAoZXJyb3IgPCBURVNUX1RPTEVSQU5DRSkgewotICAgICAgICBfc3VjY2VzcyA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIF9kb25lID0gdHJ1ZTsKLQotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRUaW1lck1hbmFnZXJUZXN0czo6VGFza1siIDw8IHRoaXMgPDwgIl0gZG9uZSIgPDwgc3RkOjplbmRsOyAvLyBkZWJ1ZworICAgICAgX2VuZFRpbWUgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCk7CisgICAgICBfc3VjY2VzcyA9IChfZW5kVGltZSAtIF9zdGFydFRpbWUpID49IF90aW1lb3V0OwogCiAgICAgICB7CiAgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgICAgX2RvbmUgPSB0cnVlOwogICAgICAgICBfbW9uaXRvci5ub3RpZnlBbGwoKTsKICAgICAgIH0KICAgICB9CkBAIC04OCwyMCArNzQsMTkgQEAKICAgICogcHJvcGVybHkgY2xlYW4gdXAgaXRzZWxmIGFuZCB0aGUgcmVtYWluaW5nIG9ycGhhbmVkIHRpbWVvdXQgdGFzayB3aGVuIHRoZQogICAgKiBtYW5hZ2VyIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBpdHMgZGVzdHJ1Y3RvciBpcyBjYWxsZWQuCiAgICAqLwotICBib29sIHRlc3QwMChpbnQ2NF90IHRpbWVvdXQgPSAxMDAwTEwpIHsKKyAgYm9vbCB0ZXN0MDAodWludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgewogCiAgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gb3JwaGFuVGFzawogICAgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgMTAgKiB0aW1lb3V0KSk7CiAKICAgICB7Ci0KICAgICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7Ci0KLSAgICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpKTsKLQorICAgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PihuZXcgVGhyZWFkRmFjdG9yeSgpKSk7CiAgICAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKLQotICAgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisgICAgICBpZiAodGltZXJNYW5hZ2VyLnN0YXRlKCkgIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAidGltZXJNYW5hZ2VyIGlzIG5vdCBpbiB0aGUgU1RBUlRFRCBzdGF0ZSwgYnV0IHNob3VsZCBiZSIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CiAKICAgICAgIC8vIERvbid0IGNyZWF0ZSB0YXNrIHlldCwgYmVjYXVzZSBpdHMgY29uc3RydWN0b3Igc2V0cyB0aGUgZXhwZWN0ZWQgY29tcGxldGlvbiB0aW1lLCBhbmQgd2UKICAgICAgIC8vIG5lZWQgdG8gZGVsYXkgYmV0d2VlbiBpbnNlcnRpbmcgdGhlIHR3byB0YXNrcyBpbnRvIHRoZSBydW4gcXVldWUuCkBAIC0xMDksMzQgKzk0LDE3MCBAQAogCiAgICAgICB7CiAgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLQogICAgICAgICB0aW1lck1hbmFnZXIuYWRkKG9ycGhhblRhc2ssIDEwICogdGltZW91dCk7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAvLyBXYWl0IGZvciAxIHNlY29uZCBpbiBvcmRlciB0byBnaXZlIHRpbWVyTWFuYWdlciBhIGNoYW5jZSB0byBzdGFydCBzbGVlcGluZyBpbiByZXNwb25zZQotICAgICAgICAgIC8vIHRvIGFkZGluZyBvcnBoYW5UYXNrLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gd2UgY2FuIHZlcmlmeSB0aGF0IGFkZGluZyB0aGUgc2Vjb25kIHRhc2sKLSAgICAgICAgICAvLyBraWNrcyB0aGUgZGlzcGF0Y2hlciBvdXQgb2YgdGhlIGN1cnJlbnQgd2FpdCBhbmQgc3RhcnRzIHRoZSBuZXcgMSBzZWNvbmQgd2FpdC4KLSAgICAgICAgICBfbW9uaXRvci53YWl0KDEwMDApOwotICAgICAgICAgIGFzc2VydCgKLSAgICAgICAgICAgICAgMCA9PSAiRVJST1I6IFRoaXMgd2FpdCBzaG91bGQgdGltZSBvdXQuIFRpbWVyTWFuYWdlciBkaXNwYXRjaGVyIG1heSBoYXZlIGEgcHJvYmxlbS4iKTsKLSAgICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7Ci0gICAgICAgIH0KKyAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHModGltZW91dCkpOwogCiAgICAgICAgIHRhc2sucmVzZXQobmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7Ci0KICAgICAgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0aW1lb3V0KTsKLQogICAgICAgICBfbW9uaXRvci53YWl0KCk7CiAgICAgICB9CiAKLSAgICAgIGFzc2VydCh0YXNrLT5fZG9uZSk7CisgICAgICBpZiAoIXRhc2stPl9kb25lKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAidGFzayBpcyBub3QgZG9uZSwgYnV0IGl0IHNob3VsZCBoYXZlIGV4ZWN1dGVkIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KIAogICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8ICh0YXNrLT5fc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikgPDwgIiEiIDw8IHN0ZDo6ZW5kbDsKICAgICB9CiAKLSAgICAvLyB0aW1lck1hbmFnZXIuc3RvcCgpOyBUaGlzIGlzIHdoZXJlIGl0IGhhcHBlbnMgdmlhIGRlc3RydWN0b3IKKyAgICBpZiAob3JwaGFuVGFzay0+X2RvbmUpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAib3JwaGFuIHRhc2sgaXMgZG9uZSwgYnV0IGl0IHNob3VsZCBub3QgaGF2ZSBleGVjdXRlZCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotICAgIGFzc2VydCghb3JwaGFuVGFzay0+X2RvbmUpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdGVzdCBjcmVhdGVzIHR3byB0YXNrcywgcmVtb3ZlcyB0aGUgZmlyc3Qgb25lIHRoZW4gd2FpdHMgZm9yIHRoZSBzZWNvbmQgb25lLiBJdCB0aGVuCisgICAqIHZlcmlmaWVzIHRoYXQgdGhlIHRpbWVyIG1hbmFnZXIgcHJvcGVybHkgY2xlYW4gdXAgaXRzZWxmIGFuZCB0aGUgcmVtYWluaW5nIG9ycGhhbmVkIHRpbWVvdXQKKyAgICogdGFzayB3aGVuIHRoZSBtYW5hZ2VyIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBpdHMgZGVzdHJ1Y3RvciBpcyBjYWxsZWQuCisgICAqLworICBib29sIHRlc3QwMSh1aW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+KG5ldyBUaHJlYWRGYWN0b3J5KCkpKTsKKyAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKKyAgICBhc3NlcnQodGltZXJNYW5hZ2VyLnN0YXRlKCkgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKKworICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgIC8vIFNldHVwIHRoZSB0d28gdGFza3MKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrVG9SZW1vdmUKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMikpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFza1RvUmVtb3ZlLCB0YXNrVG9SZW1vdmUtPl90aW1lb3V0KTsKKworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisKKyAgICAvLyBSZW1vdmUgb25lIHRhc2sgYW5kIHdhaXQgdW50aWwgdGhlIG90aGVyIGhhcyBjb21wbGV0ZWQKKyAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRhc2tUb1JlbW92ZSk7CisgICAgX21vbml0b3Iud2FpdCh0aW1lb3V0ICogMik7CisKKyAgICBhc3NlcnQoIXRhc2tUb1JlbW92ZS0+X2RvbmUpOworICAgIGFzc2VydCh0YXNrLT5fZG9uZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3Mgd2l0aCB0aGUgc2FtZSBjYWxsYmFjayBhbmQgYW5vdGhlciBvbmUsIHRoZW4gcmVtb3ZlcyB0aGUgdHdvCisgICAqIGR1cGxpY2F0ZWQgdGhlbiB3YWl0cyBmb3IgdGhlIGxhc3Qgb25lLiBJdCB0aGVuIHZlcmlmaWVzIHRoYXQgdGhlIHRpbWVyIG1hbmFnZXIgcHJvcGVybHkKKyAgICogY2xlYW4gdXAgaXRzZWxmIGFuZCB0aGUgcmVtYWluaW5nIG9ycGhhbmVkIHRpbWVvdXQgdGFzayB3aGVuIHRoZSBtYW5hZ2VyIGdvZXMgb3V0IG9mIHNjb3BlCisgICAqIGFuZCBpdHMgZGVzdHJ1Y3RvciBpcyBjYWxsZWQuCisgICAqLworICBib29sIHRlc3QwMih1aW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+KG5ldyBUaHJlYWRGYWN0b3J5KCkpKTsKKyAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKKyAgICBhc3NlcnQodGltZXJNYW5hZ2VyLnN0YXRlKCkgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKKworICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgIC8vIFNldHVwIHRoZSBvbmUgdGFza3MgYW5kIGFkZCBpdCB0d2ljZQorICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2tUb1JlbW92ZQorICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQgLyAzKSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrVG9SZW1vdmUsIHRhc2tUb1JlbW92ZS0+X3RpbWVvdXQpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFza1RvUmVtb3ZlLCB0YXNrVG9SZW1vdmUtPl90aW1lb3V0ICogMik7CisKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGFzay0+X3RpbWVvdXQpOworCisgICAgLy8gUmVtb3ZlIHRoZSBmaXJzdCB0YXNrIChlLmcuIHR3byB0aW1lcnMpIGFuZCB3YWl0IHVudGlsIHRoZSBvdGhlciBoYXMgY29tcGxldGVkCisgICAgdGltZXJNYW5hZ2VyLnJlbW92ZSh0YXNrVG9SZW1vdmUpOworICAgIF9tb25pdG9yLndhaXQodGltZW91dCAqIDIpOworCisgICAgYXNzZXJ0KCF0YXNrVG9SZW1vdmUtPl9kb25lKTsKKyAgICBhc3NlcnQodGFzay0+X2RvbmUpOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgdHdvIHRhc2tzLCByZW1vdmVzIHRoZSBmaXJzdCBvbmUgdGhlbiB3YWl0cyBmb3IgdGhlIHNlY29uZCBvbmUuIEl0IHRoZW4KKyAgICogdmVyaWZpZXMgdGhhdCB0aGUgdGltZXIgbWFuYWdlciBwcm9wZXJseSBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dAorICAgKiB0YXNrIHdoZW4gdGhlIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KKyAgICovCisgIGJvb2wgdGVzdDAzKHVpbnQ2NF90IHRpbWVvdXQgPSAxMDAwTEwpIHsKKyAgICBUaW1lck1hbmFnZXIgdGltZXJNYW5hZ2VyOworICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4obmV3IFRocmVhZEZhY3RvcnkoKSkpOworICAgIHRpbWVyTWFuYWdlci5zdGFydCgpOworICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworCisgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworCisgICAgLy8gU2V0dXAgdGhlIHR3byB0YXNrcworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2tUb1JlbW92ZQorICAgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCAvIDIpKTsKKyAgICBUaW1lck1hbmFnZXI6OlRpbWVyIHRpbWVyID0gdGltZXJNYW5hZ2VyLmFkZCh0YXNrVG9SZW1vdmUsIHRhc2tUb1JlbW92ZS0+X3RpbWVvdXQpOworCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzaworICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRhc2stPl90aW1lb3V0KTsKKworICAgIC8vIFJlbW92ZSBvbmUgdGFzayBhbmQgd2FpdCB1bnRpbCB0aGUgb3RoZXIgaGFzIGNvbXBsZXRlZAorICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGltZXIpOworICAgIF9tb25pdG9yLndhaXQodGltZW91dCAqIDIpOworCisgICAgYXNzZXJ0KCF0YXNrVG9SZW1vdmUtPl9kb25lKTsKKyAgICBhc3NlcnQodGFzay0+X2RvbmUpOworCisgICAgLy8gVmVyaWZ5IGJlaGF2aW9yIHdoZW4gcmVtb3ZpbmcgdGhlIHJlbW92ZWQgdGFzaworICAgIHRyeSB7CisgICAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRpbWVyKTsKKyAgICAgIGFzc2VydChudWxscHRyID09ICJFUlJPUjogVGhpcyByZW1vdmUgc2hvdWxkIHNlbmQgYSBOb1N1Y2hUYXNrRXhjZXB0aW9uIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hUYXNrRXhjZXB0aW9uJikgeworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdGVzdCBjcmVhdGVzIG9uZSB0YXNrLCBhbmQgdHJpZXMgdG8gcmVtb3ZlIGl0IGFmdGVyIGl0IGhhcyBleHBpcmVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDQodWludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgeworICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7CisgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PihuZXcgVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgdGFzaworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMTApKTsKKyAgICBUaW1lck1hbmFnZXI6OlRpbWVyIHRpbWVyID0gdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisgICAgdGFzay5yZXNldCgpOworCisgICAgLy8gV2FpdCB1bnRpbCB0aGUgdGFzayBoYXMgY29tcGxldGVkCisgICAgX21vbml0b3Iud2FpdCh0aW1lb3V0KTsKKworICAgIC8vIFZlcmlmeSBiZWhhdmlvciB3aGVuIHJlbW92aW5nIHRoZSBleHBpcmVkIHRhc2sKKyAgICAvLyBub3RpZnkgaXMgY2FsbGVkIGluc2lkZSB0aGUgdGFzayBzbyB0aGUgdGFzayBtYXkgc3RpbGwKKyAgICAvLyBiZSBydW5uaW5nIHdoZW4gd2UgZ2V0IGhlcmUsIHNvIHdlIG5lZWQgdG8gbG9vcC4uLgorICAgIGZvciAoOzspIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGltZXIpOworICAgICAgICBhc3NlcnQobnVsbHB0ciA9PSAiRVJST1I6IFRoaXMgcmVtb3ZlIHNob3VsZCB0aHJvdyBOb1N1Y2hUYXNrRXhjZXB0aW9uLCBvciBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbi4iKTsKKyAgICAgIH0gY2F0Y2ggKGNvbnN0IE5vU3VjaFRhc2tFeGNlcHRpb24mKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9IGNhdGNoIChjb25zdCBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbiYpIHsKKyAgICAgICAgICAvLyB0aGUgdGhyZWFkIHdhcyBzdGlsbCBleGl0aW5nOyB0cnkgYWdhaW4uLi4KKyAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxKSk7CisgICAgICB9CisgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTE0Niw3ICsyNjcsNiBAQAogICBNb25pdG9yIF9tb25pdG9yOwogfTsKIAotY29uc3QgZG91YmxlIFRpbWVyTWFuYWdlclRlc3RzOjpURVNUX1RPTEVSQU5DRSA9IC4yMDsKIH0KIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9FdmVudExvZy5jcHAKaW5kZXggZDRiODM3Mi4uYzhlMGQ5YiAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9FdmVudExvZy5jcHAKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9FdmVudExvZy5jcHAKQEAgLTE5LDIyICsxOSwyNSBAQAogI2luY2x1ZGUgIkV2ZW50TG9nLmgiCiAKICNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiAKIG5hbWVzcGFjZSB7CiAKKy8vIERlZmluZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBERUJVR19FVkVOVExPRyB0byBlbmFibGUgZGVidWcgbG9nZ2luZworLy8gZXg6ICQgREVCVUdfRVZFTlRMT0c9MSBwcm9jZXNzb3JfdGVzdAorc3RhdGljIGNvbnN0IGNoYXIgKiBERUJVR19FVkVOVExPRyA9IGdldGVudigiREVCVUdfRVZFTlRMT0ciKTsKKwogdm9pZCBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICAvLyBDb21tZW50IG91dCB0aGlzIHJldHVybiB0byBlbmFibGUgZGVidWcgbG9ncyBmcm9tIHRoZSB0ZXN0IGNvZGUuCi0gIHJldHVybjsKKyAgaWYgKERFQlVHX0VWRU5UTE9HKSB7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CiAKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0KLSAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgfQogfQogfQogCkBAIC03OCw3ICs4MSw3IEBACiB2b2lkIEV2ZW50TG9nOjphcHBlbmQoRXZlbnRUeXBlIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubmVjdGlvbklkLAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhbGxJZCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgewogICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CiAgIGRlYnVnKCIlZCA8LS0gJXUsICV1LCAlcyBcIiVzXCIiLCBpZF8sIGNvbm5lY3Rpb25JZCwgY2FsbElkLCB0eXBlLCBtZXNzYWdlLmNfc3RyKCkpOwogCkBAIC0xMDcsNyArMTEwLDcgQEAKIEV2ZW50IEV2ZW50TG9nOjp3YWl0Rm9yQ29ubkV2ZW50KHVpbnQzMl90IGNvbm5JZCwgaW50NjRfdCB0aW1lb3V0KSB7CiAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKIAotICBFdmVudExpc3Q6Oml0ZXJhdG9yIGl0ID0gZXZlbnRzXy5iZWdpbigpOworICBhdXRvIGl0ID0gZXZlbnRzXy5iZWdpbigpOwogICB3aGlsZSAodHJ1ZSkgewogICAgIHRyeSB7CiAgICAgICAvLyBUT0RPOiBpdCB3b3VsZCBiZSBuaWNlciB0byBob25vciB0aW1lb3V0IGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9IYW5kbGVycy5oIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9IYW5kbGVycy5oCmluZGV4IDA0MWZkM2QuLjA1ZDE5ZWQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvSGFuZGxlcnMuaAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0hhbmRsZXJzLmgKQEAgLTI5LDM0ICsyOSwzNCBAQAogCiBjbGFzcyBQYXJlbnRIYW5kbGVyIDogdmlydHVhbCBwdWJsaWMgUGFyZW50U2VydmljZUlmIHsKIHB1YmxpYzoKLSAgUGFyZW50SGFuZGxlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykKKyAgUGFyZW50SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpCiAgICAgOiB0cmlnZ2VyTW9uaXRvcigmbXV0ZXhfKSwgZ2VuZXJhdGlvbl8oMCksIHdhaXRfKGZhbHNlKSwgbG9nXyhsb2cpIHt9CiAKLSAgaW50MzJfdCBpbmNyZW1lbnRHZW5lcmF0aW9uKCkgeworICBpbnQzMl90IGluY3JlbWVudEdlbmVyYXRpb24oKSBvdmVycmlkZSB7CiAgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfSU5DUkVNRU5UX0dFTkVSQVRJT04sIDAsIDApOwogICAgIHJldHVybiArK2dlbmVyYXRpb25fOwogICB9CiAKLSAgaW50MzJfdCBnZXRHZW5lcmF0aW9uKCkgeworICBpbnQzMl90IGdldEdlbmVyYXRpb24oKSBvdmVycmlkZSB7CiAgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfR0VUX0dFTkVSQVRJT04sIDAsIDApOwogICAgIHJldHVybiBnZW5lcmF0aW9uXzsKICAgfQogCi0gIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSBvdmVycmlkZSB7CiAgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfQUREX1NUUklORywgMCwgMCk7CiAgICAgc3RyaW5nc18ucHVzaF9iYWNrKHMpOwogICB9CiAKLSAgdm9pZCBnZXRTdHJpbmdzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgX3JldHVybikgeworICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBfcmV0dXJuKSBvdmVycmlkZSB7CiAgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfR0VUX1NUUklOR1MsIDAsIDApOwogICAgIF9yZXR1cm4gPSBzdHJpbmdzXzsKICAgfQogCi0gIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGNvbnN0IGludDMyX3QgbGVuZ3RoKSB7CisgIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGNvbnN0IGludDMyX3QgbGVuZ3RoKSBvdmVycmlkZSB7CiAgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfR0VUX0RBVEFfV0FJVCwgMCwgMCk7CiAKQEAgLTY1LDE0ICs2NSwxNCBAQAogICAgIF9yZXR1cm4uYXBwZW5kKGxlbmd0aCwgJ2EnKTsKICAgfQogCi0gIHZvaWQgb25ld2F5V2FpdCgpIHsKKyAgdm9pZCBvbmV3YXlXYWl0KCkgb3ZlcnJpZGUgewogICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CiAgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX09ORVdBWV9XQUlULCAwLCAwKTsKIAogICAgIGJsb2NrVW50aWxUcmlnZ2VyZWQoKTsKICAgfQogCi0gIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICB2b2lkIGV4Y2VwdGlvbldhaXQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIG92ZXJyaWRlIHsKICAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOwogICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9FWENFUFRJT05fV0FJVCwgMCwgMCk7CiAKQEAgLTgzLDcgKzgzLDcgQEAKICAgICB0aHJvdyBlOwogICB9CiAKLSAgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICB2b2lkIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSBvdmVycmlkZSB7CiAgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfVU5FWFBFQ1RFRF9FWENFUFRJT05fV0FJVCwgMCwgMCk7CiAKQEAgLTEzNiw3ICsxMzYsNyBAQAogICBpbnQzMl90IGdlbmVyYXRpb25fOwogICBib29sIHdhaXRfOwogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CiB9OwogCiAjaWZkZWYgX1dJTjMyCkBAIC0xNDYsOSArMTQ2LDkgQEAKIAogY2xhc3MgQ2hpbGRIYW5kbGVyIDogcHVibGljIFBhcmVudEhhbmRsZXIsIHZpcnR1YWwgcHVibGljIENoaWxkU2VydmljZUlmIHsKIHB1YmxpYzoKLSAgQ2hpbGRIYW5kbGVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6IFBhcmVudEhhbmRsZXIobG9nKSwgdmFsdWVfKDApIHt9CisgIENoaWxkSGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDogUGFyZW50SGFuZGxlcihsb2cpLCB2YWx1ZV8oMCkge30KIAotICBpbnQzMl90IHNldFZhbHVlKGNvbnN0IGludDMyX3QgdmFsdWUpIHsKKyAgaW50MzJfdCBzZXRWYWx1ZShjb25zdCBpbnQzMl90IHZhbHVlKSBvdmVycmlkZSB7CiAgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfU0VUX1ZBTFVFLCAwLCAwKTsKIApAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgcmV0dXJuIG9sZFZhbHVlOwogICB9CiAKLSAgaW50MzJfdCBnZXRWYWx1ZSgpIHsKKyAgaW50MzJfdCBnZXRWYWx1ZSgpIG92ZXJyaWRlIHsKICAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOwogICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9HRVRfVkFMVUUsIDAsIDApOwogCkBAIC0xNzQsMTMgKzE3NCwxMyBAQAogCiBzdHJ1Y3QgQ29ubkNvbnRleHQgewogcHVibGljOgotICBDb25uQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICBDb25uQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCiAgICAgICAgICAgICAgIHVpbnQzMl90IGlkKQogICAgIDogaW5wdXQoaW4pLCBvdXRwdXQob3V0KSwgaWQoaWQpIHt9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQ7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dDsKKyAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0OworICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0OwogICB1aW50MzJfdCBpZDsKIH07CiAKQEAgLTE5NiwyMiArMTk2LDIyIEBACiAKIGNsYXNzIFNlcnZlckV2ZW50SGFuZGxlciA6IHB1YmxpYyBzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXIgewogcHVibGljOgotICBTZXJ2ZXJFdmVudEhhbmRsZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDogbmV4dElkXygxKSwgbG9nXyhsb2cpIHt9CisgIFNlcnZlckV2ZW50SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDogbmV4dElkXygxKSwgbG9nXyhsb2cpIHt9CiAKLSAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkge30KKyAgdm9pZCBwcmVTZXJ2ZSgpIG92ZXJyaWRlIHt9CiAKLSAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0KSB7CisgIHZvaWQqIGNyZWF0ZUNvbnRleHQoc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dCkgb3ZlcnJpZGUgewogICAgIENvbm5Db250ZXh0KiBjb250ZXh0ID0gbmV3IENvbm5Db250ZXh0KGlucHV0LCBvdXRwdXQsIG5leHRJZF8pOwogICAgICsrbmV4dElkXzsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NPTk5fQ1JFQVRFRCwgY29udGV4dC0+aWQsIDApOwogICAgIHJldHVybiBjb250ZXh0OwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGRlbGV0ZUNvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dCkgewotICAgIENvbm5Db250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDb25uQ29udGV4dCo+KHNlcnZlckNvbnRleHQpOworICB2b2lkIGRlbGV0ZUNvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0KSBvdmVycmlkZSB7CisgICAgYXV0byogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29ubkNvbnRleHQqPihzZXJ2ZXJDb250ZXh0KTsKIAogICAgIGlmIChpbnB1dCAhPSBjb250ZXh0LT5pbnB1dCkgewogICAgICAgYWJvcnQoKTsKQEAgLTIyNSw4ICsyMjUsOCBAQAogICAgIGRlbGV0ZSBjb250ZXh0OwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHByb2Nlc3NDb250ZXh0KHZvaWQqIHNlcnZlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworICB2b2lkIHByb2Nlc3NDb250ZXh0KHZvaWQqIHNlcnZlckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIG92ZXJyaWRlIHsKIC8vIFRPRE86IFdlIGN1cnJlbnRseSBkb24ndCB0ZXN0IHRoZSBiZWhhdmlvciBvZiB0aGUgcHJvY2Vzc0NvbnRleHQoKQogLy8gY2FsbHMuICBUaGUgdmFyaW91cyBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGNhbGwgcHJvY2Vzc0NvbnRleHQoKSBhdAogLy8gc2xpZ2h0bHkgZGlmZmVyZW50IHRpbWVzLCBhbmQgaXQgaXMgdG9vIGFubm95aW5nIHRvIHRyeSBhbmQgYWNjb3VudCBmb3IKQEAgLTI1MSwxNSArMjUxLDE1IEBACiAKIHByb3RlY3RlZDoKICAgdWludDMyX3QgbmV4dElkXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKIH07CiAKIGNsYXNzIFByb2Nlc3NvckV2ZW50SGFuZGxlciA6IHB1YmxpYyBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKIHB1YmxpYzoKLSAgUHJvY2Vzc29yRXZlbnRIYW5kbGVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6IG5leHRJZF8oMSksIGxvZ18obG9nKSB7fQorICBQcm9jZXNzb3JFdmVudEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6IG5leHRJZF8oMSksIGxvZ18obG9nKSB7fQogCi0gIHZvaWQqIGdldENvbnRleHQoY29uc3QgY2hhciogZm5OYW1lLCB2b2lkKiBzZXJ2ZXJDb250ZXh0KSB7Ci0gICAgQ29ubkNvbnRleHQqIGNvbm5Db250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDb25uQ29udGV4dCo+KHNlcnZlckNvbnRleHQpOworICB2b2lkKiBnZXRDb250ZXh0KGNvbnN0IGNoYXIqIGZuTmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgb3ZlcnJpZGUgeworICAgIGF1dG8qIGNvbm5Db250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDb25uQ29udGV4dCo+KHNlcnZlckNvbnRleHQpOwogCiAgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSBuZXcgQ2FsbENvbnRleHQoY29ubkNvbnRleHQsIG5leHRJZF8sIGZuTmFtZSk7CiAgICAgKytuZXh0SWRfOwpAQCAtMjY4LDQ3ICsyNjgsNDcgQEAKICAgICByZXR1cm4gY29udGV4dDsKICAgfQogCi0gIHZvaWQgZnJlZUNvbnRleHQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUpIHsKLSAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICB2b2lkIGZyZWVDb250ZXh0KHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5OYW1lKSBvdmVycmlkZSB7CisgICAgYXV0byogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOwogICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOwogICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9GSU5JU0hFRCwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKICAgICBkZWxldGUgY29udGV4dDsKICAgfQogCi0gIHZvaWQgcHJlUmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgewotICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CisgIHZvaWQgcHJlUmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgb3ZlcnJpZGUgeworICAgIGF1dG8qIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKICAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BSRV9SRUFELCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOwogICB9CiAKLSAgdm9pZCBwb3N0UmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKKyAgdm9pZCBwb3N0UmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSwgdWludDMyX3QgYnl0ZXMpIG92ZXJyaWRlIHsKICAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGJ5dGVzKTsKLSAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICAgIGF1dG8qIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKICAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BPU1RfUkVBRCwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKICAgfQogCi0gIHZvaWQgcHJlV3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUpIHsKLSAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICB2b2lkIHByZVdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5OYW1lKSBvdmVycmlkZSB7CisgICAgYXV0byogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOwogICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOwogICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUFJFX1dSSVRFLCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOwogICB9CiAKLSAgdm9pZCBwb3N0V3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgIHZvaWQgcG9zdFdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5OYW1lLCB1aW50MzJfdCBieXRlcykgb3ZlcnJpZGUgewogICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYnl0ZXMpOwotICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CisgICAgYXV0byogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOwogICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOwogICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUE9TVF9XUklURSwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKICAgfQogCi0gIHZvaWQgYXN5bmNDb21wbGV0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgewotICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CisgIHZvaWQgYXN5bmNDb21wbGV0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgb3ZlcnJpZGUgeworICAgIGF1dG8qIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKICAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0FTWU5DX0NPTVBMRVRFLCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOwogICB9CiAKLSAgdm9pZCBoYW5kbGVyRXJyb3Iodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUpIHsKLSAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICB2b2lkIGhhbmRsZXJFcnJvcih2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgb3ZlcnJpZGUgeworICAgIGF1dG8qIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKICAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0hBTkRMRVJfRVJST1IsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CiAgIH0KQEAgLTMyOSw3ICszMjksNyBAQAogICB9CiAKICAgdWludDMyX3QgbmV4dElkXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcAppbmRleCA1YWFhNTdlLi5hMzZlZjNlIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvUHJvY2Vzc29yVGVzdC5jcHAKQEAgLTI1LDcgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KIAotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CkBAIC0zMywyMSArMzMsMjEgQEAKICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CiAKICNpbmNsdWRlICJFdmVudExvZy5oIgogI2luY2x1ZGUgIlNlcnZlclRocmVhZC5oIgogI2luY2x1ZGUgIkhhbmRsZXJzLmgiCiAjaW5jbHVkZSAiZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCIKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLQogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOwogCiAvKgogICogVHJhaXRzIGNsYXNzZXMgdGhhdCBlbmNhcHN1bGF0ZSBob3cgdG8gY3JlYXRlIHZhcmlvdXMgdHlwZXMgb2Ygc2VydmVycy4KQEAgLTU3LDEzICs1NywxMyBAQAogcHVibGljOgogICB0eXBlZGVmIFRTaW1wbGVTZXJ2ZXIgU2VydmVyVHlwZTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUU2ltcGxlU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICBzdGQ6OnNoYXJlZF9wdHI8VFNpbXBsZVNlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCiAgICAgICB1aW50MTZfdCBwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRTaW1wbGVTZXJ2ZXI+KAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUU2ltcGxlU2VydmVyPigKICAgICAgICAgbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOwogICB9CiB9OwpAQCAtNzIsMTMgKzcyLDEzIEBACiBwdWJsaWM6CiAgIHR5cGVkZWYgVFRocmVhZGVkU2VydmVyIFNlcnZlclR5cGU7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRocmVhZGVkU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZGVkU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKICAgICAgIHVpbnQxNl90IHBvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRocmVhZGVkU2VydmVyPigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZGVkU2VydmVyPigKICAgICAgICAgbmV3IFRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3IsIHNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CiAgIH0KIH07CkBAIC04NywxOSArODcsMTkgQEAKIHB1YmxpYzoKICAgdHlwZWRlZiBUVGhyZWFkUG9vbFNlcnZlciBTZXJ2ZXJUeXBlOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUaHJlYWRQb29sU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZFBvb2xTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAogICAgICAgdWludDE2X3QgcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoOCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkobmV3IFRocmVhZEZhY3RvcnkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcig4KTsKICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwogICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CiAKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRocmVhZFBvb2xTZXJ2ZXI+KAorICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZFBvb2xTZXJ2ZXI+KAogICAgICAgICBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgdGhyZWFkTWFuYWdlcikpOwogICB9CiB9OwpAQCAtMTA4LDI3ICsxMDgsMjggQEAKIHB1YmxpYzoKICAgdHlwZWRlZiBUTm9uYmxvY2tpbmdTZXJ2ZXIgU2VydmVyVHlwZTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAogICAgICAgdWludDE2X3QgcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgewogICAgIC8vIFROb25ibG9ja2luZ1NlcnZlciBhdXRvbWF0aWNhbGx5IHVzZXMgVEZyYW1lZFRyYW5zcG9ydC4KICAgICAvLyBSYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIHN1cHBsaWVkIHRyYW5zcG9ydCBmYWN0b3J5IGlzIG5vdCBhCiAgICAgLy8gVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkKLSAgICBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSogZnJhbWVkRmFjdG9yeQorICAgIGF1dG8qIGZyYW1lZEZhY3RvcnkKICAgICAgICAgPSBkeW5hbWljX2Nhc3Q8VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkqPih0cmFuc3BvcnRGYWN0b3J5LmdldCgpKTsKLSAgICBpZiAoZnJhbWVkRmFjdG9yeSA9PSBOVUxMKSB7CisgICAgaWYgKGZyYW1lZEZhY3RvcnkgPT0gbnVsbHB0cikgewogICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyIG11c3QgdXNlIFRGcmFtZWRUcmFuc3BvcnQiKTsKICAgICB9CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoOCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KG5ldyBUaHJlYWRGYWN0b3J5KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoOCk7CiAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwogCi0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4oCi0gICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQsIHRocmVhZE1hbmFnZXIpKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4oCisgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHNvY2tldCwgdGhyZWFkTWFuYWdlcikpOwogICB9CiB9OwogCkBAIC0xMzYsMjQgKzEzNywyNSBAQAogcHVibGljOgogICB0eXBlZGVmIFROb25ibG9ja2luZ1NlcnZlciBTZXJ2ZXJUeXBlOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4gY3JlYXRlU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCiAgICAgICB1aW50MTZfdCBwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CiAgICAgLy8gVE5vbmJsb2NraW5nU2VydmVyIGF1dG9tYXRpY2FsbHkgdXNlcyBURnJhbWVkVHJhbnNwb3J0LgogICAgIC8vIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3VwcGxpZWQgdHJhbnNwb3J0IGZhY3RvcnkgaXMgbm90IGEKICAgICAvLyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeQotICAgIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KiBmcmFtZWRGYWN0b3J5CisgICAgYXV0byogZnJhbWVkRmFjdG9yeQogICAgICAgICA9IGR5bmFtaWNfY2FzdDxURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSo+KHRyYW5zcG9ydEZhY3RvcnkuZ2V0KCkpOwotICAgIGlmIChmcmFtZWRGYWN0b3J5ID09IE5VTEwpIHsKKyAgICBpZiAoZnJhbWVkRmFjdG9yeSA9PSBudWxscHRyKSB7CiAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXIgbXVzdCB1c2UgVEZyYW1lZFRyYW5zcG9ydCIpOwogICAgIH0KIAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKICAgICAvLyBVc2UgYSBOVUxMIFRocmVhZE1hbmFnZXIKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyOwotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+KAotICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0LCB0aHJlYWRNYW5hZ2VyKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXI7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+KAorICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBzb2NrZXQsIHRocmVhZE1hbmFnZXIpKTsKICAgfQogfTsKIApAQCAtMjQyLDQ4ICsyNDQsNDggQEAKICAgICBwcm9jZXNzb3JfLT5zZXRFdmVudEhhbmRsZXIocHJvY2Vzc29yRXZlbnRIYW5kbGVyXyk7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPiBjcmVhdGVTZXJ2ZXIodWludDE2X3QgcG9ydCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4gY3JlYXRlU2VydmVyKHVpbnQxNl90IHBvcnQpIG92ZXJyaWRlIHsKICAgICBTZXJ2ZXJUcmFpdHNfIHNlcnZlclRyYWl0czsKICAgICByZXR1cm4gc2VydmVyVHJhaXRzLmNyZWF0ZVNlcnZlcihwcm9jZXNzb3JfLCBwb3J0LCB0cmFuc3BvcnRGYWN0b3J5XywgcHJvdG9jb2xGYWN0b3J5Xyk7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7IHJldHVybiBzZXJ2ZXJFdmVudEhhbmRsZXJfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSBvdmVycmlkZSB7IHJldHVybiBzZXJ2ZXJFdmVudEhhbmRsZXJfOyB9CiAKLSAgdm9pZCBiaW5kU3VjY2Vzc2Z1bCh1aW50MTZfdCBwb3J0KSB7IHBvcnRfID0gcG9ydDsgfQorICB2b2lkIGJpbmRTdWNjZXNzZnVsKHVpbnQxNl90IHBvcnQpIG92ZXJyaWRlIHsgcG9ydF8gPSBwb3J0OyB9CiAKICAgdWludDE2X3QgZ2V0UG9ydCgpIGNvbnN0IHsgcmV0dXJuIHBvcnRfOyB9CiAKLSAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBnZXRMb2coKSBjb25zdCB7IHJldHVybiBsb2dfOyB9CisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGdldExvZygpIGNvbnN0IHsgcmV0dXJuIGxvZ187IH0KIAotICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxIYW5kbGVyPiYgZ2V0SGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZXJfOyB9CisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyPiYgZ2V0SGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZXJfOyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50PiBjcmVhdGVDbGllbnQoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnQ+IGNyZWF0ZUNsaWVudCgpIHsKICAgICB0eXBlZGVmIHR5cGVuYW1lIFNlcnZpY2VUcmFpdHNfOjpQcm90b2NvbCBQcm90b2NvbDsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydF8pKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFuc3BvcnQobmV3IFRyYW5zcG9ydF8oc29ja2V0KSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvdG9jb2w+IHByb3RvY29sKG5ldyBQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0XykpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFuc3BvcnQobmV3IFRyYW5zcG9ydF8oc29ja2V0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFByb3RvY29sPiBwcm90b2NvbChuZXcgUHJvdG9jb2wodHJhbnNwb3J0KSk7CiAgICAgdHJhbnNwb3J0LT5vcGVuKCk7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxDbGllbnQ+IGNsaWVudChuZXcgQ2xpZW50KHByb3RvY29sKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudD4gY2xpZW50KG5ldyBDbGllbnQocHJvdG9jb2wpKTsKICAgICByZXR1cm4gY2xpZW50OwogICB9CiAKIHByaXZhdGU6CiAgIHVpbnQxNl90IHBvcnRfOwotICBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8SGFuZGxlcj4gaGFuZGxlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBwcm9jZXNzb3JFdmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyPiBoYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gcHJvY2Vzc29yRXZlbnRIYW5kbGVyXzsKIH07CiAKIC8qKgogICogQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMgaW4gdGhlIGxvZwogICovCi12b2lkIGNoZWNrTm9FdmVudHMoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIHsKK3ZvaWQgY2hlY2tOb0V2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIHsKICAgLy8gV2FpdCBmb3IgYW4gZXZlbnQgd2l0aCBhIHZlcnkgc2hvcnQgdGltZW91dCBwZXJpb2QuICBXZSBkb24ndCBleHBlY3QKICAgLy8gYW55dGhpbmcgdG8gYmUgcHJlc2VudCwgc28gd2Ugd2lsbCBub3JtYWxseSB3YWl0IGZvciB0aGUgZnVsbCB0aW1lb3V0LgogICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgYSBub24temVybyB0aW1lb3V0IGlzIG5pY2Ugc2luY2UgaXQgZG9lcyBnaXZlIGEgc2hvcnQKQEAgLTI5Nyw5ICsyOTksOSBAQAogICoKICAqIFJldHVybnMgdGhlIGNvbm5lY3Rpb24gSUQgYWxsb2NhdGVkIGJ5IHRoZSBzZXJ2ZXIuCiAgKi8KLXVpbnQzMl90IGNoZWNrTmV3Q29ubkV2ZW50cyhjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgewordWludDMyX3QgY2hlY2tOZXdDb25uRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgewogICAvLyBDaGVjayBmb3IgYW4gRVRfQ09OTl9DUkVBVEVEIGV2ZW50Ci0gIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgRXZlbnQgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgyNTAwKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NPTk5fQ1JFQVRFRCwgZXZlbnQudHlwZSk7CiAKICAgLy8gU29tZSBzZXJ2ZXJzIGNhbGwgdGhlIHByb2Nlc3NDb250ZXh0KCkgaG9vayBpbW1lZGlhdGVseS4KQEAgLTMxMiw3ICszMTQsNyBAQAogLyoqCiAgKiBDaGVjayBmb3IgdGhlIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgogICovCi12b2lkIGNoZWNrQ2xvc2VFdmVudHMoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csIHVpbnQzMl90IGNvbm5JZCkgewordm9pZCBjaGVja0Nsb3NlRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywgdWludDMyX3QgY29ubklkKSB7CiAgIC8vIENoZWNrIGZvciBhbiBFVF9DT05OX0RFU1RST1lFRCBldmVudAogICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DT05OX0RFU1RST1lFRCwgZXZlbnQudHlwZSk7CkBAIC0zMzAsNyArMzMyLDcgQEAKICAqCiAgKiBSZXR1cm5zIHRoZSBjYWxsIElEIGFsbG9jYXRlZCBieSB0aGUgc2VydmVyLgogICovCi11aW50MzJfdCBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nLAordWludDMyX3QgY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbm5JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlIGNhbGxUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNhbGxOYW1lKSB7CkBAIC0zNjcsNyArMzY5LDcgQEAKIC8qKgogICogQ2hlY2sgZm9yIHRoZSBldmVudHMgdGhhdCBzaG91bGQgYmUgYWZ0ZXIgYSBoYW5kbGVyIHJldHVybnMuCiAgKi8KLXZvaWQgY2hlY2tDYWxsUG9zdEhhbmRsZXJFdmVudHMoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCit2b2lkIGNoZWNrQ2FsbFBvc3RIYW5kbGVyRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjYWxsSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY2FsbE5hbWUpIHsKQEAgLTQwNyw3ICs0MDksNyBAQAogICoKICAqIFJldHVybnMgdGhlIGNhbGwgSUQgYWxsb2NhdGVkIGJ5IHRoZSBzZXJ2ZXIuCiAgKi8KLXVpbnQzMl90IGNoZWNrQ2FsbEV2ZW50cyhjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKK3VpbnQzMl90IGNoZWNrQ2FsbEV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubklkLAogICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZSBjYWxsVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNhbGxOYW1lKSB7CkBAIC00MjIsOCArNDI0LDggQEAKICAqLwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RhdGVfPgotdm9pZCB0ZXN0UGFyZW50U2VydmljZShjb25zdCBib29zdDo6c2hhcmVkX3B0cjxTdGF0ZV8+JiBzdGF0ZSkgewotICBib29zdDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZV86OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwordm9pZCB0ZXN0UGFyZW50U2VydmljZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVfPiYgc3RhdGUpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAKICAgaW50MzJfdCBnZW4gPSBjbGllbnQtPmdldEdlbmVyYXRpb24oKTsKICAgaW50MzJfdCBuZXdHZW4gPSBjbGllbnQtPmluY3JlbWVudEdlbmVyYXRpb24oKTsKQEAgLTQ0NCw4ICs0NDYsOCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RhdGVfPgotdm9pZCB0ZXN0Q2hpbGRTZXJ2aWNlKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlXz4mIHN0YXRlKSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7Cit2b2lkIHRlc3RDaGlsZFNlcnZpY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFN0YXRlXz4mIHN0YXRlKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZV86OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwogCiAgIC8vIFRlc3QgY2FsbGluZyBzb21lIG9mIHRoZSBwYXJlbnQgbWV0aGlkcyB2aWEgdGhlIGEgY2hpbGQgY2xpZW50CiAgIGludDMyX3QgZ2VuID0gY2xpZW50LT5nZXRHZW5lcmF0aW9uKCk7CkBAIC00NjYsNyArNDY4LDcgQEAKICAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBQYXJlbnRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKICAgdGVzdFBhcmVudFNlcnZpY2Uoc3RhdGUpOwpAQCAtNDc3LDcgKzQ3OSw3IEBACiAgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKICAgdGVzdFBhcmVudFNlcnZpY2Uoc3RhdGUpOwpAQCAtNTAwLDEwICs1MDIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0PiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CiAKICAgLy8gTWFrZSBzdXJlIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGxvZwogICBjaGVja05vRXZlbnRzKGxvZyk7CkBAIC01MTIsNyArNTE0LDcgQEAKIAogICAvLyBNYWtlIHN1cmUgY3JlYXRlQ29udGV4dCgpIGlzIGNhbGxlZCBhZnRlciBhIGNvbm5lY3Rpb24gaGFzIGJlZW4KICAgLy8gZXN0YWJsaXNoZWQuICBXZSBvcGVuIGEgcGxhaW4gc29ja2V0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBjbGllbnQuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgc3RhdGUtPmdldFBvcnQoKSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBzdGF0ZS0+Z2V0UG9ydCgpKSk7CiAgIHNvY2tldC0+b3BlbigpOwogCiAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvcGVyIGV2ZW50cyBvY2N1cnJlZCBhZnRlciBhIG5ldyBjb25uZWN0aW9uCkBAIC01MjIsNyArNTI0LDcgQEAKICAgLy8gY2FuIHRlc3QgdGhlIHRpbWluZyBmb3IgdGhlIHByZVJlYWQoKSBjYWxsLgogICBzdHJpbmcgcmVxdWVzdE5hbWUgPSAiZ2V0RGF0YVdhaXQiOwogICBzdHJpbmcgZXZlbnROYW1lID0gIlBhcmVudFNlcnZpY2UuZ2V0RGF0YVdhaXQiOwotICBpbnQzMl90IHNlcWlkID0gaW50MzJfdCh0aW1lKE5VTEwpKTsKKyAgYXV0byBzZXFpZCA9IGludDMyX3QodGltZShudWxscHRyKSk7CiAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChzb2NrZXQpOwogICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihyZXF1ZXN0TmFtZSwgVF9DQUxMLCBzZXFpZCk7CiAgIHNvY2tldC0+Zmx1c2goKTsKQEAgLTU5MCw3ICs1OTIsNyBAQAogICBjaGVja05vRXZlbnRzKGxvZyk7CiAKICAgLy8gUmVhZCB0aGUgcmVzcG9uc2UgaGVhZGVyCi0gIHN0ZDo6c3RyaW5nIHJlc3BvbnNlTmFtZTsKKyAgc3RyaW5nIHJlc3BvbnNlTmFtZTsKICAgaW50MzJfdCByZXNwb25zZVNlcWlkID0gMDsKICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgcmVzcG9uc2VUeXBlOwogICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKHJlc3BvbnNlTmFtZSwgcmVzcG9uc2VUeXBlLCByZXNwb25zZVNlcWlkKTsKQEAgLTYzMywxOSArNjM1LDE5IEBACiAgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKLSAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKIAogICAvLyBDcmVhdGUgYSBjbGllbnQKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50MSA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudDEgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAKICAgLy8gTWFrZSBzdXJlIHRoZSBleHBlY3RlZCBldmVudHMgd2VyZSBsb2dnZWQKICAgdWludDMyX3QgY2xpZW50MUlkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CiAKICAgLy8gQ3JlYXRlIGEgc2Vjb25kIGNsaWVudAotICBib29zdDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQyID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50MiA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKIAogICAvLyBNYWtlIHN1cmUgdGhlIGV4cGVjdGVkIGV2ZW50cyB3ZXJlIGxvZ2dlZAogICB1aW50MzJfdCBjbGllbnQySWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKQEAgLTY4MSwxMyArNjgzLDEzIEBACiAgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKLSAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKIAogICAvLyBDcmVhdGUgYSBjbGllbnQKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwogICB1aW50MzJfdCBjb25uSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKIAogICAvLyBNYWtlIGEgb25ld2F5IGNhbGwKQEAgLTczMywxMyArNzM1LDEzIEBACiAgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKLSAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKIAogICAvLyBDcmVhdGUgYSBjbGllbnQKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwogICB1aW50MzJfdCBjb25uSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKIAogICAvLyBTZW5kIHRoZSBleGNlcHRpb25XYWl0KCkgY2FsbApAQCAtNzY2LDggKzc2OCw4IEBACiAgIH0gY2F0Y2ggKGNvbnN0IE15RXJyb3ImIGUpIHsKICAgICBCT09TVF9DSEVDS19FUVVBTChtZXNzYWdlLCBlLm1lc3NhZ2UpOwogICAgIC8vIENoZWNrIGlmIHN0ZDo6ZXhjZXB0aW9uOjp3aGF0KCkgaXMgaGFuZGxlZCBwcm9wZXJseQotICAgIHNpemVfdCBtZXNzYWdlX3BvcyA9IHN0ZDo6c3RyaW5nKGUud2hhdCgpKS5maW5kKCJURXhjZXB0aW9uIC0gc2VydmljZSBoYXMgdGhyb3duOiBNeUVycm9yIik7Ci0gICAgQk9PU1RfQ0hFQ0tfTkUobWVzc2FnZV9wb3MsIHN0ZDo6c3RyaW5nOjpucG9zKTsKKyAgICBzaXplX3QgbWVzc2FnZV9wb3MgPSBzdHJpbmcoZS53aGF0KCkpLmZpbmQoIlRFeGNlcHRpb24gLSBzZXJ2aWNlIGhhcyB0aHJvd246IE15RXJyb3IiKTsKKyAgICBCT09TVF9DSEVDS19ORShtZXNzYWdlX3Bvcywgc3RyaW5nOjpucG9zKTsKICAgfQogCiAgIC8vIE5vdyB3ZSBzaG91bGQgc2VlIHRoZSBldmVudHMgZm9yIGEgbm9ybWFsIGNhbGwgZmluaXNoCkBAIC03ODgsMTMgKzc5MCwxMyBAQAogICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CiAKICAgLy8gQ3JlYXRlIGEgY2xpZW50Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKICAgdWludDMyX3QgY29ubklkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CiAKICAgLy8gU2VuZCB0aGUgdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoKSBjYWxsCkBAIC05MDgsOSArOTEwLDIwIEBACiAKIC8vIFRPRE86IFdlIHNob3VsZCB0ZXN0IFRFdmVudFNlcnZlciBpbiB0aGUgZnV0dXJlLgogLy8gRm9yIG5vdywgaXQgaXMga25vd24gbm90IHRvIHdvcmsgY29ycmVjdGx5IHdpdGggVFByb2Nlc3NvckV2ZW50SGFuZGxlci4KLXVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9ICJQcm9jZXNzb3JUZXN0IjsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCis6OmJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKLSAgdW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlByb2Nlc3NvclRlc3QiOworICA6OmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5wX25hbWUudmFsdWUgPSAiUHJvY2Vzc29yVGVzdCI7CiAgIHJldHVybiBOVUxMOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5jcHAgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5jcHAKaW5kZXggZTlkNDY4Zi4uYjA1MDUwMCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcApAQCAtMjEsNyArMjEsNyBAQAogCiAjaW5jbHVkZSAiU2VydmVyVGhyZWFkLmgiCiAKLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnkuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CkBAIC0zNSw4ICszNSwxMCBAQAogICBhc3NlcnQoIXJ1bm5pbmdfKTsKICAgcnVubmluZ18gPSB0cnVlOwogCisgIGhlbHBlcl8ucmVzZXQobmV3IEhlbHBlcih0aGlzKSk7CisKICAgLy8gU3RhcnQgdGhlIG90aGVyIHRocmVhZAotICBjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3Rvcnk7CisgIGNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3Rvcnk7CiAgIHRocmVhZEZhY3Rvcnkuc2V0RGV0YWNoZWQoZmFsc2UpOwogICB0aHJlYWRfID0gdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQoaGVscGVyXyk7CiAKQEAgLTEyOCw3ICsxMzAsNyBAQAogICBzZXJ2ZXJTdGF0ZV8tPmJpbmRTdWNjZXNzZnVsKHBvcnRfKTsKIAogICAvLyBTZXQgdGhlIHJlYWwgc2VydmVyIGV2ZW50IGhhbmRsZXIgKHJlcGxhY2luZyBvdXJzZWxmKQotICBib29zdDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcgorICBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXIKICAgICAgID0gc2VydmVyU3RhdGVfLT5nZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKICAgc2VydmVyXy0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50SGFuZGxlcik7CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmggYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5oCmluZGV4IGVlZDM0NjkuLjljY2EyZDYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaApAQCAtMzUsNyArMzUsNyBAQAogICovCiBjbGFzcyBTZXJ2ZXJTdGF0ZSB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgflNlcnZlclN0YXRlKCkge30KKyAgdmlydHVhbCB+U2VydmVyU3RhdGUoKSA9IGRlZmF1bHQ7CiAKICAgLyoqCiAgICAqIENyZWF0ZSBhIHNlcnZlciB0byBsaXN0ZW4gb24gdGhlIHNwZWNpZmllZCBwb3J0LgpAQCAtNDMsNyArNDMsNyBAQAogICAgKiBJZiB0aGUgc2VydmVyIHJldHVybmVkIGZhaWxzIHRvIGJpbmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0IHdoZW4gc2VydmUoKSBpcwogICAgKiBjYWxsZWQgb24gaXQsIGNyZWF0ZVNlcnZlcigpIG1heSBiZSBjYWxsZWQgYWdhaW4gb24gYSBkaWZmZXJlbnQgcG9ydC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyPiBjcmVhdGVTZXJ2ZXIodWludDE2X3QgcG9ydCkgPSAwOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXI+IGNyZWF0ZVNlcnZlcih1aW50MTZfdCBwb3J0KSA9IDA7CiAKICAgLyoqCiAgICAqIEdldCB0aGUgVFNlcnZlckV2ZW50SGFuZGxlciB0byBzZXQgb24gdGhlIHNlcnZlci4KQEAgLTUyLDggKzUyLDggQEAKICAgICogc3RhcnQgc2VydmluZyB0cmFmZmljLiAgSXQgaXMgaW52b2tlZCBmcm9tIHRoZSBzZXJ2ZXIgdGhyZWFkLCByYXRoZXIgdGhhbgogICAgKiB0aGUgbWFpbiB0aHJlYWQuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+KCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPigpOwogICB9CiAKICAgLyoqCkBAIC03MCw5ICs3MCw4IEBACiAgKi8KIGNsYXNzIFNlcnZlclRocmVhZCB7CiBwdWJsaWM6Ci0gIFNlcnZlclRocmVhZChjb25zdCBib29zdDo6c2hhcmVkX3B0cjxTZXJ2ZXJTdGF0ZT4mIHN0YXRlLCBib29sIGF1dG9TdGFydCkKLSAgICA6IGhlbHBlcl8obmV3IEhlbHBlcih0aGlzKSksCi0gICAgICBwb3J0XygwKSwKKyAgU2VydmVyVGhyZWFkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXJTdGF0ZT4mIHN0YXRlLCBib29sIGF1dG9TdGFydCkKKyAgICA6IHBvcnRfKDApLAogICAgICAgcnVubmluZ18oZmFsc2UpLAogICAgICAgc2VydmluZ18oZmFsc2UpLAogICAgICAgZXJyb3JfKGZhbHNlKSwKQEAgLTEwNiw5ICsxMDUsOSBAQAogICBwdWJsaWM6CiAgICAgSGVscGVyKFNlcnZlclRocmVhZCogc2VydmVyVGhyZWFkKSA6IHNlcnZlclRocmVhZF8oc2VydmVyVGhyZWFkKSB7fQogCi0gICAgdm9pZCBydW4oKSB7IHNlcnZlclRocmVhZF8tPnJ1bigpOyB9CisgICAgdm9pZCBydW4oKSBvdmVycmlkZSB7IHNlcnZlclRocmVhZF8tPnJ1bigpOyB9CiAKLSAgICB2b2lkIHByZVNlcnZlKCkgeyBzZXJ2ZXJUaHJlYWRfLT5wcmVTZXJ2ZSgpOyB9CisgICAgdm9pZCBwcmVTZXJ2ZSgpIG92ZXJyaWRlIHsgc2VydmVyVGhyZWFkXy0+cHJlU2VydmUoKTsgfQogCiAgIHByaXZhdGU6CiAgICAgU2VydmVyVGhyZWFkKiBzZXJ2ZXJUaHJlYWRfOwpAQCAtMTE3LDcgKzExNiw3IEBACiAgIHZvaWQgcnVuKCk7CiAgIHZvaWQgcHJlU2VydmUoKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxIZWxwZXI+IGhlbHBlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxIZWxwZXI+IGhlbHBlcl87CiAKICAgdWludDE2X3QgcG9ydF87CiAgIGJvb2wgcnVubmluZ187CkBAIC0xMjUsOSArMTI0LDkgQEAKICAgYm9vbCBlcnJvcl87CiAgIGNvbmN1cnJlbmN5OjpNb25pdG9yIHNlcnZlck1vbml0b3JfOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZlclN0YXRlPiBzZXJ2ZXJTdGF0ZV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlcj4gc2VydmVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlclN0YXRlPiBzZXJ2ZXJTdGF0ZV87CisgIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXI+IHNlcnZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxjb25jdXJyZW5jeTo6VGhyZWFkPiB0aHJlYWRfOwogfTsKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9xdC9UUVRjcFNlcnZlclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L3F0L1RRVGNwU2VydmVyVGVzdC5jcHAKaW5kZXggNzljMGRmYy4uMzM3MWE5YSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L3F0L1RRVGNwU2VydmVyVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L3F0L1RRVGNwU2VydmVyVGVzdC5jcHAKQEAgLTEsODUgKzEsMTA5IEBACiAjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRRVGNwU2VydmVyVGVzdAogI2luY2x1ZGUgPFFUZXN0PgotI2luY2x1ZGUgPGJvb3N0L3NtYXJ0X3B0ci5ocHA+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKICNpbmNsdWRlIDxRVGNwU2VydmVyPgogI2luY2x1ZGUgPFFUY3BTb2NrZXQ+CiAjaW5jbHVkZSA8UUhvc3RBZGRyZXNzPgorI2luY2x1ZGUgPFFUaHJlYWQ+CiAKLSNpbmNsdWRlICJ0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgiCi0jaW5jbHVkZSAidGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oIgotI2luY2x1ZGUgInRocmlmdC9xdC9UUVRjcFNlcnZlci5oIgotI2luY2x1ZGUgInRocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmgiCisjaWZuZGVmIFFfTU9DX1JVTgorICAjaW5jbHVkZSAidGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgorICAjaW5jbHVkZSAidGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oIgorICAjaW5jbHVkZSAidGhyaWZ0L3F0L1RRVGNwU2VydmVyLmgiCisgICNpbmNsdWRlICJ0aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oIgogCi0jaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisgICNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiAKIHN0cnVjdCBBc3luY0hhbmRsZXIgOiBwdWJsaWMgdGVzdDo6UGFyZW50U2VydmljZUNvYlN2SWYgewogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKLSAgdmlydHVhbCB2b2lkIGFkZFN0cmluZyh0Y3h4OjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgdm9pZCBhZGRTdHJpbmcoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3Qgc3RkOjpzdHJpbmcmIHMpIG92ZXJyaWRlIHsKICAgICBzdHJpbmdzLnB1c2hfYmFjayhzKTsKICAgICBjb2IoKTsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0U3RyaW5ncyh0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgX3JldHVybik+IGNvYikgeworICB2b2lkIGdldFN0cmluZ3Moc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgX3JldHVybik+IGNvYikgb3ZlcnJpZGUgewogICAgIGNvYihzdHJpbmdzKTsKICAgfQogCiAgIC8vIE92ZXJyaWRlcyBub3QgdXNlZCBpbiB0aGlzIHRlc3QKLSAgdmlydHVhbCB2b2lkIGluY3JlbWVudEdlbmVyYXRpb24odGN4eDo6ZnVuY3Rpb248dm9pZChpbnQzMl90IGNvbnN0JiBfcmV0dXJuKT4gY29iKSB7fQotICB2aXJ0dWFsIHZvaWQgZ2V0R2VuZXJhdGlvbih0Y3h4OjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IpIHt9Ci0gIHZpcnR1YWwgdm9pZCBnZXREYXRhV2FpdCh0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nIGNvbnN0JiBfcmV0dXJuKT4gY29iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBsZW5ndGgpIHt9Ci0gIHZpcnR1YWwgdm9pZCBvbmV3YXlXYWl0KHRjeHg6OmZ1bmN0aW9uPHZvaWQoKT4gY29iKSB7fQotICB2aXJ0dWFsIHZvaWQgZXhjZXB0aW9uV2FpdCgKLSAgICAgIHRjeHg6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLAotICAgICAgdGN4eDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gLyogZXhuX2NvYiAqLywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7fQotICB2aXJ0dWFsIHZvaWQgdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQodGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7fQorICB2b2lkIGluY3JlbWVudEdlbmVyYXRpb24oc3RkOjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IpIG92ZXJyaWRlIHt9CisgIHZvaWQgZ2V0R2VuZXJhdGlvbihzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50MzJfdCBjb25zdCYgX3JldHVybik+IGNvYikgb3ZlcnJpZGUge30KKyAgdm9pZCBnZXREYXRhV2FpdChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGxlbmd0aCkgb3ZlcnJpZGUge30KKyAgdm9pZCBvbmV3YXlXYWl0KHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IpIG92ZXJyaWRlIHt9CisgIHZvaWQgZXhjZXB0aW9uV2FpdCgKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IC8qIGV4bl9jb2IgKi8sCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgb3ZlcnJpZGUge30KKyAgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgb3ZlcnJpZGUge30KIH07CiAKIGNsYXNzIFRRVGNwU2VydmVyVGVzdCA6IHB1YmxpYyBRT2JqZWN0IHsKLSAgdm9pZCBpbml0KCkgewotICAgIC8vIHNldHVwIHNlcnZlcgotICAgIHNlcnZlclNvY2tldC5yZXNldChuZXcgUVRjcFNlcnZlcik7Ci0gICAgc2VydmVyLnJlc2V0KG5ldyBhc3luYzo6VFFUY3BTZXJ2ZXIoc2VydmVyU29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjptYWtlX3NoYXJlZDx0ZXN0OjpQYXJlbnRTZXJ2aWNlQXN5bmNQcm9jZXNzb3I+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6bWFrZV9zaGFyZWQ8QXN5bmNIYW5kbGVyPigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6bWFrZV9zaGFyZWQ8cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpKTsKLSAgICBRVkVSSUZZKHNlcnZlclNvY2tldC0+bGlzdGVuKFFIb3N0QWRkcmVzczo6TG9jYWxIb3N0KSk7Ci0gICAgaW50IHBvcnQgPSBzZXJ2ZXJTb2NrZXQtPnNlcnZlclBvcnQoKTsKLSAgICBRVkVSSUZZKHBvcnQgPiAwKTsKKyAgUV9PQkpFQ1QKIAotICAgIC8vIHNldHVwIGNsaWVudAotICAgIHNvY2tldC5yZXNldChuZXcgUVRjcFNvY2tldCk7Ci0gICAgY2xpZW50LnJlc2V0KG5ldyB0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50KGJvb3N0OjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sPigKLSAgICAgICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPHRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydD4oc29ja2V0KSkpKTsKLSAgICBzb2NrZXQtPmNvbm5lY3RUb0hvc3QoUUhvc3RBZGRyZXNzOjpMb2NhbEhvc3QsIHBvcnQpOwotICAgIFFWRVJJRlkoc29ja2V0LT53YWl0Rm9yQ29ubmVjdGVkKCkpOwotICB9Citwcml2YXRlIHNsb3RzOgorICB2b2lkIGluaXRUZXN0Q2FzZSgpOworICB2b2lkIGNsZWFudXBUZXN0Q2FzZSgpOworICB2b2lkIHRlc3RfY29tbXVuaWNhdGUoKTsKIAotICB2b2lkIGNsZWFudXAoKSB7Ci0gICAgc29ja2V0LT5jbG9zZSgpOwotICAgIHNlcnZlclNvY2tldC0+Y2xvc2UoKTsKLSAgfQotCi0gIHZvaWQgdGVzdF9jb21tdW5pY2F0ZSgpIHsKLSAgICBjbGllbnQtPmFkZFN0cmluZygiZm9vIik7Ci0gICAgY2xpZW50LT5hZGRTdHJpbmcoImJhciIpOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcGx5OwotICAgIGNsaWVudC0+Z2V0U3RyaW5ncyhyZXBseSk7Ci0gICAgUUNPTVBBUkUocmVwbHlbMF0sICJmb28iKTsKLSAgICBRQ09NUEFSRShyZXBseVsxXSwgImZvbyIpOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyU29ja2V0OwotICBib29zdDo6c2hhcmVkX3B0cjxhc3luYzo6VFFUY3BTZXJ2ZXI+IHNlcnZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UVRjcFNvY2tldD4gc29ja2V0OwotICBib29zdDo6c2hhcmVkX3B0cjx0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50PiBjbGllbnQ7Citwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8UVRocmVhZD4gc2VydmVyVGhyZWFkOworICBzdGQ6OnNoYXJlZF9wdHI8YXN5bmM6OlRRVGNwU2VydmVyPiBzZXJ2ZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjx0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50PiBjbGllbnQ7CiB9OwogCit2b2lkIFRRVGNwU2VydmVyVGVzdDo6aW5pdFRlc3RDYXNlKCkgeworICAvLyBzZXR1cCBzZXJ2ZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlclNvY2tldCA9IHN0ZDo6bWFrZV9zaGFyZWQ8UVRjcFNlcnZlcj4oKTsKKyAgc2VydmVyLnJlc2V0KG5ldyBhc3luYzo6VFFUY3BTZXJ2ZXIoc2VydmVyU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHRlc3Q6OlBhcmVudFNlcnZpY2VBc3luY1Byb2Nlc3Nvcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QXN5bmNIYW5kbGVyPigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSkpOworICBRVkVSSUZZKHNlcnZlclNvY2tldC0+bGlzdGVuKFFIb3N0QWRkcmVzczo6TG9jYWxIb3N0KSk7CisgIGludCBwb3J0ID0gc2VydmVyU29ja2V0LT5zZXJ2ZXJQb3J0KCk7CisgIFFWRVJJRlkocG9ydCA+IDApOworCisgIC8vc2V0dXAgc2VydmVyIHRocmVhZCBhbmQgbW92ZSBzZXJ2ZXIgdG8gaXQKKyAgc2VydmVyVGhyZWFkLnJlc2V0KG5ldyBRVGhyZWFkKCkpOworICBzZXJ2ZXJTb2NrZXQtPm1vdmVUb1RocmVhZChzZXJ2ZXJUaHJlYWQuZ2V0KCkpOworICBzZXJ2ZXItPm1vdmVUb1RocmVhZChzZXJ2ZXJUaHJlYWQuZ2V0KCkpOworICBzZXJ2ZXJUaHJlYWQtPnN0YXJ0KCk7CisKKyAgLy8gc2V0dXAgY2xpZW50CisgIHN0ZDo6c2hhcmVkX3B0cjxRVGNwU29ja2V0PiBzb2NrZXQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFFUY3BTb2NrZXQ+KCk7CisgIGNsaWVudC5yZXNldChuZXcgdGVzdDo6UGFyZW50U2VydmljZUNsaWVudChzdGQ6Om1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w+KAorICAgICAgc3RkOjptYWtlX3NoYXJlZDx0cmFuc3BvcnQ6OlRRSU9EZXZpY2VUcmFuc3BvcnQ+KHNvY2tldCkpKSk7CisgIHNvY2tldC0+Y29ubmVjdFRvSG9zdChRSG9zdEFkZHJlc3M6OkxvY2FsSG9zdCwgcG9ydCk7CisgIFFWRVJJRlkoc29ja2V0LT53YWl0Rm9yQ29ubmVjdGVkKCkpOworfQorCit2b2lkIFRRVGNwU2VydmVyVGVzdDo6Y2xlYW51cFRlc3RDYXNlKCkgeworICAvL2ZpcnN0LCBzdG9wIHRoZSB0aHJlYWQgd2hpY2ggaG9sZHMgdGhlIHNlcnZlcgorICBzZXJ2ZXJUaHJlYWQtPnF1aXQoKTsKKyAgc2VydmVyVGhyZWFkLT53YWl0KCk7CisgIC8vIG5vdywgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIHNlcnZlcgorICBzZXJ2ZXIucmVzZXQoKTsKKyAgLy8gZGVsZXRlIHRocmVhZCBub3cKKyAgc2VydmVyVGhyZWFkLnJlc2V0KCk7CisKKyAgLy8gY2xlYW51cCBjbGllbnQKKyAgY2xpZW50LnJlc2V0KCk7Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXJUZXN0Ojp0ZXN0X2NvbW11bmljYXRlKCkgeworICBjbGllbnQtPmFkZFN0cmluZygiZm9vIik7CisgIGNsaWVudC0+YWRkU3RyaW5nKCJiYXIiKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVwbHk7CisgIGNsaWVudC0+Z2V0U3RyaW5ncyhyZXBseSk7CisgIFFDT01QQVJFKFFTdHJpbmc6OmZyb21TdGRTdHJpbmcocmVwbHlbMF0pLCBRU3RyaW5nKCJmb28iKSk7CisgIFFDT01QQVJFKFFTdHJpbmc6OmZyb21TdGRTdHJpbmcocmVwbHlbMV0pLCBRU3RyaW5nKCJiYXIiKSk7Cit9CisKKwogI2lmIChRVF9WRVJTSU9OID49IFFUX1ZFUlNJT05fQ0hFQ0soNSwgMCwgMCkpCiBRVEVTVF9HVUlMRVNTX01BSU4oVFFUY3BTZXJ2ZXJUZXN0KTsKICNlbHNlCmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC1xdC5wYy5pbiBiL2xpYi9jcHAvdGhyaWZ0LXF0LnBjLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZTYwZDg0Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvdGhyaWZ0LXF0LnBjLmluCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXByZWZpeD1AcHJlZml4QAotZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAotbGliZGlyPUBsaWJkaXJACi1pbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAotCi1OYW1lOiBUaHJpZnQKLURlc2NyaXB0aW9uOiBUaHJpZnQgUXQgQVBJCi1WZXJzaW9uOiBAVkVSU0lPTkAKLVJlcXVpcmVzOiB0aHJpZnQgPSBAVkVSU0lPTkAKLUxpYnM6IC1MJHtsaWJkaXJ9IC1sdGhyaWZ0cXQKLUNmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC5zbG4gYi9saWIvY3BwL3RocmlmdC5zbG4KaW5kZXggODhkNzk2OC4uY2IwZjQ1NSAxMDA2NDQKLS0tIGEvbGliL2NwcC90aHJpZnQuc2xuCisrKyBiL2xpYi9jcHAvdGhyaWZ0LnNsbgpAQCAtNyw3ICs3LDcgQEAKIEVuZFByb2plY3QKIFByb2plY3QoInsyMTUwRTMzMy04RkRDLTQyQTMtOTQ3NC0xQTM5NTZENDZERTh9IikgPSAiZG9jIiwgImRvYyIsICJ7MDA2OTg0RTAtN0NDMS00N0UyLUFDRDItQTQwRkU0RDM4NjkzfSIKIAlQcm9qZWN0U2VjdGlvbihTb2x1dGlvbkl0ZW1zKSA9IHByZVByb2plY3QKLQkJUkVBRE1FX1dJTkRPV1MgPSBSRUFETUVfV0lORE9XUworCQlSRUFETUUubWQgPSBSRUFETUUubWQKIAlFbmRQcm9qZWN0U2VjdGlvbgogRW5kUHJvamVjdAogR2xvYmFsCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL01ha2VmaWxlLmFtIGIvbGliL2NzaGFycC9NYWtlZmlsZS5hbQppbmRleCA2MTE0MDVkLi5jYzJiYmM5IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL01ha2VmaWxlLmFtCisrKyBiL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0KQEAgLTE3LDkgKzE3LDkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVNVQkRJUlMgPSAuIHRlc3QvVGhyaWZ0VGVzdAorU1VCRElSUyA9IC4gdGVzdC9NdWx0aXBsZXgKIAotVEhSSUZUQ09ERT0gXAorVEhSSUZUQ09ERSA9IFwKICAgICAgICAgICAgIHNyYy9Db2xsZWN0aW9ucy9USGFzaFNldC5jcyBcCiAgICAgICAgICAgICBzcmMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBcCkBAIC01Miw2ICs1Miw3IEBACiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzIFwKKyAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFNvY2tldFZlcnNpb25pemVyLmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzIFwKQEAgLTY2LDQzICs2Nyw0OCBAQAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcyBcCiAgICAgICAgICAgICBzcmMvVFByb2Nlc3Nvci5jcyBcCisgICAgICAgICAgICBzcmMvVFByb2Nlc3NvckZhY3RvcnkuY3MgXAorICAgICAgICAgICAgc3JjL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIFwKKyAgICAgICAgICAgIHNyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyBcCisgICAgICAgICAgICBzcmMvVENvbnRyb2xsaW5nSGFuZGxlci5jcyBcCiAgICAgICAgICAgICBzcmMvVEV4Y2VwdGlvbi5jcyBcCiAgICAgICAgICAgICBzcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCiAKIGlmIE1PTk9fTUNTCi1DU0M9bWNzCitleHBvcnQgQ1NDID0gbWNzCiBlbHNlCi1DU0M9Z21jcworZXhwb3J0IENTQyA9IGdtY3MKIGVuZGlmCiAKIGlmIE5FVF8yXzAKLU1PTk9fREVGSU5FUz0vZDpORVRfMl8wCitleHBvcnQgQ1NDX0RFRklORVMgPSAtZDpORVRfMl8wCiBlbmRpZgogCi1hbGwtbG9jYWw6IFRocmlmdC5kbGwKK2FsbC1sb2NhbDogVGhyaWZ0LmRsbCBUaHJpZnQuNDUuZGxsCiAKIFRocmlmdC5kbGw6ICQoVEhSSUZUQ09ERSkKLQkkKENTQykgJChUSFJJRlRDT0RFKSAvb3V0OlRocmlmdC5kbGwgL3RhcmdldDpsaWJyYXJ5IC9yZWZlcmVuY2U6U3lzdGVtLldlYiAkKE1PTk9fREVGSU5FUykKKwkkKENTQykgJChDU0NfREVGSU5FUykgLW91dDokQCAtdGFyZ2V0OmxpYnJhcnkgLXJlZmVyZW5jZTpTeXN0ZW0uV2ViICQoVEhSSUZUQ09ERSkKIAotY2xlYW4tbG9jYWw6Ci0JJChSTSkgVGhyaWZ0LmRsbAorVGhyaWZ0LjQ1LmRsbDogJChUSFJJRlRDT0RFKQorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC10YXJnZXQ6bGlicmFyeSAtcmVmZXJlbmNlOlN5c3RlbS5XZWIgJChUSFJJRlRDT0RFKQogCi1wcmVjcm9zczoKLQkkKE1BS0UpIC1DIHRlc3QvVGhyaWZ0VGVzdCBwcmVjcm9zcworQ0xFQU5GSUxFUyA9IFwKKwlUaHJpZnQuZGxsIFwKKwlUaHJpZnQuNDUuZGxsCiAKLSMgcnVuIGNzaGFycCB0ZXN0cz8KLSMgY2hlY2s6Ci0jIAljZCB0ZXN0L1RocmlmdFRlc3QgJiYgLi9tYWtldGVzdC5zaAotIyAJY2QgdGVzdC9NdWx0aXBsZXggJiYgLi9tYWtldGVzdC5zaAorRElTVENMRUFORklMRVMgPSBcCisJTWFrZWZpbGUuaW4KIAogRVhUUkFfRElTVCA9IFwKLSAgICAgICAgICAgICAkKFRIUklGVENPREUpIFwKLSAgICAgICAgICAgICBUaHJpZnRNU0J1aWxkVGFzayBcCi0gICAgICAgICAgICAgc3JjL1RocmlmdC5jc3Byb2ogXAotICAgICAgICAgICAgIHNyYy9UaHJpZnQuc2xuIFwKLSAgICAgICAgICAgICBzcmMvVGhyaWZ0LldQNy5jc3Byb2ogXAotICAgICAgICAgICAgIHNyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5XUDcuY3MgXAotICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzIFwKLSAgICAgICAgICAgICB0ZXN0IFwKLSAgICAgICAgICAgICBjb2Rpbmdfc3RhbmRhcmRzLm1kIFwKLSAgICAgICAgICAgICBSRUFETUUubWQKKwkkKFRIUklGVENPREUpIFwKKwlUaHJpZnRNU0J1aWxkVGFzayBcCisJc3JjL1RocmlmdC5jc3Byb2ogXAorCXNyYy9UaHJpZnQuNDUuY3Nwcm9qIFwKKwlzcmMvVGhyaWZ0LnNsbiBcCisJc3JjL05ldDM1L0V4dGVuc2lvbnNOZXQzNS5jcyBcCisJc3JjL1RyYW5zcG9ydC9UU2lsdmVybGlnaHRTb2NrZXQuY3MgXAorCXNyYy9UcmFuc3BvcnQvVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzIFwKKwlzcmMvVEFzeW5jUHJvY2Vzc29yLmNzIFwKKwl0ZXN0IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvUkVBRE1FLm1kIGIvbGliL2NzaGFycC9SRUFETUUubWQKaW5kZXggYjdkYzVkZS4uNWZjMTRjYiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9SRUFETUUubWQKKysrIGIvbGliL2NzaGFycC9SRUFETUUubWQKQEAgLTEsNSArMSwxMSBAQAogVGhyaWZ0IEMjIFNvZnR3YXJlIExpYnJhcnkKIAorRGVwcmVjYXRpb24gbm90aWNlCis9PT09PT09CisKK1BlciBbVEhSSUZULTQ3MjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ3MjMpLCBib3RoIENTaGFycCBhbmQgTmV0Y29yZSB0YXJnZXRzIGFyZSBkZXByZWNhdGVkIAorYW5kIHdpbGwgYmUgcmVtb3ZlZCB3aXRoIHRoZSBuZXh0IHJlbGVhc2UuIE1pZ3JhdGUgdG8gdGhlIFtOZXRTdGQgbGFuZ3VhZ2UgdGFyZ2V0XSguLi9uZXRzdGQvUkVBRE1FLm1kKSBpbnN0ZWFkLgorCiBMaWNlbnNlCiA9PT09PT09CiAKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IDdiMDc0ZjAuLjZlOTlkZDkgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtNTYsNSArNTYsNSBAQAogLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKIC8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CiAvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjkuMy4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuOS4zLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjEzLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIwLjEzLjAuKiIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2ogYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagppbmRleCBhZTg2MDgxLi5mNGEyNmRlIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagorKysgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagpAQCAtNDUsNyArNDUsNyBAQAogICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CiAgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgogICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+Ci0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjAuMTMuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CiAgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KICAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KICAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgpAQCAtMTE1LDQgKzExNSw0IEBACiAgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CiAgIDwvVGFyZ2V0PgogICAtLT4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MgYi9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MKaW5kZXggZjBiYjFkZS4uODRhZmI2YSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcwpAQCAtNzksNyArNzksNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgaGFzaGNvZGUgPSAwOwotICAgICAgICAgICAgZm9yZWFjaCAoT2JqZWN0IG9iaiBpbiBlbnVtZXJhYmxlKQorICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IG9iaiBpbiBlbnVtZXJhYmxlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlIGVudW0yID0gb2JqIGFzIElFbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgIGludCBvYmpIYXNoID0gZW51bTIgPT0gbnVsbCA/IG9iai5HZXRIYXNoQ29kZSAoKSA6IEdldEhhc2hDb2RlIChlbnVtMik7CkBAIC05MSw0ICs5MSw0IEBACiAgICAgICAgICAgICByZXR1cm4gaGFzaGNvZGU7CiAgICAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvTmV0MzUvRXh0ZW5zaW9uc05ldDM1LmNzIGIvbGliL2NzaGFycC9zcmMvTmV0MzUvRXh0ZW5zaW9uc05ldDM1LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYTQyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MKQEAgLTAsMCArMSwzMSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCisjaWYgKCFORVQ0NSkKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBzdGF0aWMgY2xhc3MgU3RyZWFtRXh0ZW5zaW9uc05ldDM1CisgICAgeworICAgICAgICAvLyBDb3B5VG8oKSBoYXMgYmVlbiBhZGRlZCBpbiA0LjAKKyAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIENvcHlUbyh0aGlzIFN0cmVhbSBzb3VyY2UsIFN0cmVhbSB0YXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsgIC8vIG11bHRpcGxlIG9mIDQwOTYKKyAgICAgICAgICAgIGxvbmcgblRvdGFsID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBuUmVhZCA9IHNvdXJjZS5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKG5SZWFkIDw9IDApICAvLyBkb25lPworICAgICAgICAgICAgICAgICAgICByZXR1cm4gblRvdGFsOworCisgICAgICAgICAgICAgICAgdGFyZ2V0LldyaXRlKGJ1ZmZlciwgMCwgblJlYWQpOworICAgICAgICAgICAgICAgIG5Ub3RhbCArPSBuUmVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLldQNy5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLldQNy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzNzUwNi4uMDAwMDAwMAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5XUDcuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi3vu78vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Ci11c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7Ci0KLS8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKLS8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCi0vLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCi1bYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlRocmlmdC5XUDciKV0KLVthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiQyMgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCi0vL0BUT0RPIHdoZXJlIHRvIHB1dCBMaWNlbnNlIGluZm9ybWF0aW9uPwotCi0vLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKLS8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KLS8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KLVthc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCi0KLS8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQotW2Fzc2VtYmx5OiBHdWlkKCJhMzQzZjg5Yy01N2RkLTRmYTgtYTljNi0zNTM5MWNkNWY2NTUiKV0KLQotLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKLS8vCi0vLyAgICAgIE1ham9yIFZlcnNpb24KLS8vICAgICAgTWlub3IgVmVyc2lvbgotLy8gICAgICBCdWlsZCBOdW1iZXIKLS8vICAgICAgUmV2aXNpb24KLS8vCi0vLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycwotLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjkuMy4wIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuOS4zLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggMDkwMTI2ZS4uYWNlMDMxMCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTUxLDUgKzUxLDUgQEAKIC8vCiAvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycwogLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjkuMy4wIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuOS4zLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjEzLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIwLjEzLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEFic3RyYWN0QmFzZS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RBYnN0cmFjdEJhc2UuY3MKaW5kZXggYzBkNWFiZS4uZjVhNjFjZCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEFic3RyYWN0QmFzZS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQWJzdHJhY3RCYXNlLmNzCkBAIC0yMSw5ICsyMSw5IEBACiB7CiAgICAgcHVibGljIGludGVyZmFjZSBUQWJzdHJhY3RCYXNlCiAgICAgewotICAgICAgICAvLy8KLSAgICAgICAgLy8vIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIHByb3RvY29sCi0gICAgICAgIC8vLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgdm9pZCBXcml0ZShUUHJvdG9jb2wgdFByb3RvY29sKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzCmluZGV4IDM1MGZmNDkuLjQxMWU0ZDkgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzCkBAIC0yMSw5ICsyMSw5IEBACiB7CiAgICAgcHVibGljIGludGVyZmFjZSBUQmFzZSA6IFRBYnN0cmFjdEJhc2UKICAgICB7Ci0gICAgICAgIC8vLworICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KLSAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHZvaWQgUmVhZChUUHJvdG9jb2wgdFByb3RvY29sKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKaW5kZXggNGVjZWI4Ni4uYTRmYWE5NCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcwpAQCAtMzYsMjkgKzM2LDI4IEBACiAgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFdyaXRlXyA9IHRydWU7CiAKICAgICAgICAgI3JlZ2lvbiBCaW5hcnlQcm90b2NvbCBGYWN0b3J5Ci0gICAgICAgICAvKioKLSAgICAgICAgICAqIEZhY3RvcnkKLSAgICAgICAgICAqLwotICAgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSB7CiAKLSAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0UmVhZF8gPSBmYWxzZTsKLSAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0V3JpdGVfID0gdHJ1ZTsKKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFJlYWRfID0gZmFsc2U7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RXcml0ZV8gPSB0cnVlOwogCi0gICAgICAgICAgICAgIHB1YmxpYyBGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgIDp0aGlzKGZhbHNlLCB0cnVlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeShib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKLSAgICAgICAgICAgICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgewotICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgOiB0aGlzKGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgewogICAgICAgICAgICAgfQotICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKKyAgICAgICAgICAgICAgICBzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzdHJpY3RSZWFkXywgc3RyaWN0V3JpdGVfKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgICNlbmRyZWdpb24KIApAQCAtNjgsNyArNjcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCi0gICAgICAgICAgICA6YmFzZSh0cmFucykKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKICAgICAgICAgewogICAgICAgICAgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOwogICAgICAgICAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CkBAIC0zNDUsMTYgKzM0NCwxNyBAQAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBSZWFkSTY0KCkKICAgICAgICAgewogICAgICAgICAgICAgUmVhZEFsbChpNjRpbiwgMCwgOCk7Ci0gICAgICAgICAgICB1bmNoZWNrZWQgewotICAgICAgICAgICAgICByZXR1cm4gKGxvbmcpKAotICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblswXSAmIDB4ZmYpIDw8IDU2KSB8Ci0gICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzFdICYgMHhmZikgPDwgNDgpIHwKLSAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bMl0gJiAweGZmKSA8PCA0MCkgfAotICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblszXSAmIDB4ZmYpIDw8IDMyKSB8Ci0gICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzRdICYgMHhmZikgPDwgMjQpIHwKLSAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bNV0gJiAweGZmKSA8PCAxNikgfAotICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls2XSAmIDB4ZmYpIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bN10gJiAweGZmKSkpOworICAgICAgICAgICAgdW5jaGVja2VkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChsb25nKSgKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblswXSAmIDB4ZmYpIDw8IDU2KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bMV0gJiAweGZmKSA8PCA0OCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzJdICYgMHhmZikgPDwgNDApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblszXSAmIDB4ZmYpIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bNF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzVdICYgMHhmZikgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls2XSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls3XSAmIDB4ZmYpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzc4LDcgKzM3OCw3IEBACiAgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CiAgICAgICAgICAgICByZXR1cm4gYnVmOwogICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgIHN0cmluZyBSZWFkU3RyaW5nQm9keShpbnQgc2l6ZSkKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgUmVhZFN0cmluZ0JvZHkoaW50IHNpemUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKICAgICAgICAgICAgIHRyYW5zLlJlYWRBbGwoYnVmLCAwLCBzaXplKTsKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNzCmluZGV4IDJiNGY2ZjEuLmZmNjczOTcgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcwpAQCAtNDQsOSArNDQsOSBAQAogICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVFlQRV9CSVRTID0gMHgwNzsgLy8gMDAwMCAwMTExCiAgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogQWxsIG9mIHRoZSBvbi13aXJlIHR5cGUgY29kZXMuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZXMKICAgICAgICAgewogICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU1RPUCA9IDB4MDA7CkBAIC02NCwzMiArNjQsMjkgQEAKICAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFNUUlVDVCA9IDB4MEM7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKLSAgICAgICAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisgICAgICAgIC8vLyBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIFN0YWNrPHNob3J0PiBsYXN0RmllbGRfID0gbmV3IFN0YWNrPHNob3J0PigxNSk7CiAKICAgICAgICAgcHJpdmF0ZSBzaG9ydCBsYXN0RmllbGRJZF8gPSAwOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KLSAgICAgICAgICogaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisgICAgICAgIC8vLyBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgTnVsbGFibGU8VEZpZWxkPiBib29sZWFuRmllbGRfOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KLSAgICAgICAgICogdmFsdWUgaGVyZSBzbyB0aGF0IFJlYWRCb29sIGNhbiB1c2UgaXQuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlICBOdWxsYWJsZTxCb29sZWFuPiBib29sVmFsdWVfOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KKyAgICAgICAgLy8vIHZhbHVlIGhlcmUgc28gdGhhdCBSZWFkQm9vbCBjYW4gdXNlIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIE51bGxhYmxlPEJvb2xlYW4+IGJvb2xWYWx1ZV87CiAKIAogICAgICAgICAjcmVnaW9uIENvbXBhY3RQcm90b2NvbCBGYWN0b3J5CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBGYWN0b3J5Ci0gICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5CiAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYyBGYWN0b3J5KCkgeyB9CkBAIC0xMjcsMzEgKzEyNCwzMiBAQAogCiAgICAgICAgICNyZWdpb24gV3JpdGUgTWV0aG9kcwogCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgotICAgICAgICAgKiBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gV3JpdGUgYSBieXRlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgICAgICAgIC8vLyBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gV3JpdGUgYSBieXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGJ5dGVbXSBieXRlRGlyZWN0QnVmZmVyID0gbmV3IGJ5dGVbMV07CisKICAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQnl0ZURpcmVjdChieXRlIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVEaXJlY3RCdWZmZXJbMF0gPSBiOwogICAgICAgICAgICAgdHJhbnMuV3JpdGUoYnl0ZURpcmVjdEJ1ZmZlcik7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQnl0ZURpcmVjdChpbnQgbikKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KChieXRlKW4pOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCi0gICAgICAgICAqIFRPRE86IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2UgV3JpdGVWYXJpbnQ2ND8KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICAgIC8vLyBUT0RPOiBtYWtlIGEgcGVybWFuZW50IGJ1ZmZlciBsaWtlIFdyaXRlVmFyaW50NjQ/CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIGJ5dGVbXSBpMzJidWYgPSBuZXcgYnl0ZVs1XTsKKwogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVWYXJpbnQzMih1aW50IG4pCiAgICAgICAgIHsKICAgICAgICAgICAgIGludCBpZHggPSAwOwpAQCAtMTc0LDEwICsxNzIsMTAgQEAKICAgICAgICAgICAgIHRyYW5zLldyaXRlKGkzMmJ1ZiwgMCwgaWR4KTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAqIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKLSAgICAgICAgKiBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KLSAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQorICAgICAgICAvLy8gcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCiAgICAgICAgIHsKICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChQUk9UT0NPTF9JRCk7CkBAIC0xODYsMzMgKzE4NCwzMyBAQAogICAgICAgICAgICAgV3JpdGVTdHJpbmcobWVzc2FnZS5OYW1lKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKLSAgICAgICAgICogdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCi0gICAgICAgICAqIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCisgICAgICAgIC8vLyB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKKyAgICAgICAgLy8vIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RyY3QpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxhc3RGaWVsZF8uUHVzaChsYXN0RmllbGRJZF8pOwogICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQotICAgICAgICAgKiB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIHBvcCB0aGUgbGFzdCBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IHN0cnVjdCBvZmYKLSAgICAgICAgICogb2YgdGhlIGZpZWxkIHN0YWNrLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzdHJ1Y3QgZW5kLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UKKyAgICAgICAgLy8vIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgorICAgICAgICAvLy8gb2YgdGhlIGZpZWxkIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEVuZCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8uUG9wKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQotICAgICAgICAgKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksCi0gICAgICAgICAqIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUKLSAgICAgICAgICogZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUKKyAgICAgICAgLy8vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICgmbHQ7IDE1KSwKKyAgICAgICAgLy8vIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUKKyAgICAgICAgLy8vIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLkJvb2wpCkBAIC0yMjYsMTEgKzIyNCwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCi0gICAgICAgICAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlCi0gICAgICAgICAqIGJvb2xlYW4gZmllbGQgY2FzZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCisgICAgICAgIC8vLyAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZQorICAgICAgICAvLy8gYm9vbGVhbiBmaWVsZCBjYXNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSkKICAgICAgICAgewogICAgICAgICAgICAgLy8gc2hvcnQgbGFzdEZpZWxkID0gbGFzdEZpZWxkXy5Qb3AoKTsKQEAgLTI1NSwxOCArMjUzLDE4IEBACiAgICAgICAgICAgICAvLyBsYXN0RmllbGRfLnB1c2goZmllbGQuaWQpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZFN0b3AoKQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoVHlwZXMuU1RPUCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKLSAgICAgICAgICogaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKKyAgICAgICAgLy8vIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKG1hcC5Db3VudCA9PSAwKQpAQCAtMjgwLDI4ICsyNzgsMjggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIGxpc3QgaGVhZGVyLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVDb2xsZWN0aW9uQmVnaW4obGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBzZXQgaGVhZGVyLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzZXQgaGVhZGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUNvbGxlY3Rpb25CZWdpbihzZXQuRWxlbWVudFR5cGUsIHNldC5Db3VudCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCi0gICAgICAgICAqIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCi0gICAgICAgICAqIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gV3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KLSAgICAgICAgICogT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCisgICAgICAgIC8vLyB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQorICAgICAgICAvLy8gcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorICAgICAgICAvLy8gT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJvb2woQm9vbGVhbiBiKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoYm9vbGVhbkZpZWxkXyAhPSBudWxsKQpAQCAtMzE3LDQxICszMTUsNDEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShzYnl0ZSBiKQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpYik7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYW4gSTE2IGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTE2KHNob3J0IGkxNikKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVWYXJpbnQzMihpbnRUb1ppZ1phZyhpMTYpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTMyIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkzMikKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVWYXJpbnQzMihpbnRUb1ppZ1phZyhpMzIpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJNjQobG9uZyBpNjQpCiAgICAgICAgIHsKICAgICAgICAgICAgIFdyaXRlVmFyaW50NjQobG9uZ1RvWmlnemFnKGk2NCkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZURvdWJsZShkb3VibGUgZHViKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CkBAIC0zNTksMTggKzM1NywxOCBAQAogICAgICAgICAgICAgdHJhbnMuV3JpdGUoZGF0YSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKFN0cmluZyBzdHIpCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzdHIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IFVURjhFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHN0cik7CiAgICAgICAgICAgICBXcml0ZUJpbmFyeShieXRlcywgMCwgYnl0ZXMuTGVuZ3RoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIGJ5dGUgYXJyYXksIHVzaW5nIGEgdmFyaW50IGZvciB0aGUgc2l6ZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYmluKQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUJpbmFyeShiaW4sIDAsIGJpbi5MZW5ndGgpOwpAQCAtMzk3LDEwICszOTUsMTAgQEAKICAgICAgICAgLy8gSW50ZXJuYWwgd3JpdGluZyBtZXRob2RzCiAgICAgICAgIC8vCiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KLSAgICAgICAgICogdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgICAgICAvLy8gdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBXcml0ZUNvbGxlY3Rpb25CZWdpbihUVHlwZSBlbGVtVHlwZSwgaW50IHNpemUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChzaXplIDw9IDE0KQpAQCAtNDE0LDkgKzQxMiw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgYnl0ZVtdIHZhcmludDY0b3V0ID0gbmV3IGJ5dGVbMTBdOwogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVWYXJpbnQ2NCh1bG9uZyBuKQogICAgICAgICB7CkBAIC00MzcsMjggKzQzNSwyOCBAQAogICAgICAgICAgICAgdHJhbnMuV3JpdGUodmFyaW50NjRvdXQsIDAsIGlkeCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQotICAgICAgICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAgICAgIC8vLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgdWxvbmcgbG9uZ1RvWmlnemFnKGxvbmcgbikKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuICh1bG9uZykobiA8PCAxKSBeICh1bG9uZykobiA+PiA2Myk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCi0gICAgICAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgICAgICAvLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHVpbnQgaW50VG9aaWdaYWcoaW50IG4pCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiAodWludCkobiA8PCAxKSBeICh1aW50KShuID4+IDMxKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcKLSAgICAgICAgICogdW50aWwgb2ZmKzcuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcKKyAgICAgICAgLy8vIHVudGlsIG9mZis3LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHZvaWQgZml4ZWRMb25nVG9CeXRlcyhsb25nIG4sIGJ5dGVbXSBidWYsIGludCBvZmYpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ1ZltvZmYgKyAwXSA9IChieXRlKShuICYgMHhmZik7CkBAIC00NzUsOSArNDczLDkgQEAKIAogICAgICAgICAjcmVnaW9uIFJlYWRNZXRob2RzCiAKLSAgICAgICAgLyoqCi0gICAqIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KLSAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlIHByb3RvY29sSWQgPSAoYnl0ZSlSZWFkQnl0ZSgpOwpAQCAtNDkzLDE0ICs0OTEsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJ5dGUgdHlwZSA9IChieXRlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKICAgICAgICAgICAgIGludCBzZXFpZCA9IChpbnQpUmVhZFZhcmludDMyKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZU5hbWUgPSBSZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZU5hbWUgPSBSZWFkU3RyaW5nKCk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCAoVE1lc3NhZ2VUeXBlKXR5cGUsIHNlcWlkKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKLSAgICAgICAgICogb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIHN0cnVjdCBiZWdpbi4gVGhlcmUncyBub3RoaW5nIG9uIHRoZSB3aXJlIGZvciB0aGlzLCBidXQgaXQgaXMgb3VyCisgICAgICAgIC8vLyBvcHBvcnR1bml0eSB0byBwdXNoIGEgbmV3IHN0cnVjdCBiZWdpbiBtYXJrZXIgb250byB0aGUgZmllbGQgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxhc3RGaWVsZF8uUHVzaChsYXN0RmllbGRJZF8pOwpAQCAtNTA4LDE5ICs1MDYsMTkgQEAKICAgICAgICAgICAgIHJldHVybiBBTk9OWU1PVVNfU1RSVUNUOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yCi0gICAgICAgICAqIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKKyAgICAgICAgLy8vIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU3RydWN0RW5kKCkKICAgICAgICAgewogICAgICAgICAgICAgLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSBSZWFkIG9mZiB0aGUgd2lyZS4KICAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8uUG9wKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRGaWVsZCBSZWFkRmllbGRCZWdpbigpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGUgdHlwZSA9IChieXRlKVJlYWRCeXRlKCk7CkBAIC01NjAsMTEgKzU1OCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCBSZWFkaW5nIHRoZSBrZXkKLSAgICAgICAgICogYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKLSAgICAgICAgICogImNvcnJlY3QiIHR5cGVzLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQorICAgICAgICAvLy8gYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKKyAgICAgICAgLy8vICJjb3JyZWN0IiB0eXBlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNYXAgUmVhZE1hcEJlZ2luKCkKICAgICAgICAgewogICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KVJlYWRWYXJpbnQzMigpOwpAQCAtNTcyLDEyICs1NzAsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgVE1hcChnZXRUVHlwZSgoYnl0ZSkoa2V5QW5kVmFsdWVUeXBlID4+IDQpKSwgZ2V0VFR5cGUoKGJ5dGUpKGtleUFuZFZhbHVlVHlwZSAmIDB4ZikpLCBzaXplKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKLSAgICAgICAgICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCi0gICAgICAgICAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKLSAgICAgICAgICogdHJ1ZSBzaXplLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICAgIC8vLyBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKyAgICAgICAgLy8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKyAgICAgICAgLy8vIHRydWUgc2l6ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRMaXN0IFJlYWRMaXN0QmVnaW4oKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlIHNpemVfYW5kX3R5cGUgPSAoYnl0ZSlSZWFkQnl0ZSgpOwpAQCAtNTkwLDIyICs1ODgsMjIgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgVExpc3QodHlwZSwgc2l6ZSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAotICAgICAgICAgKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgotICAgICAgICAgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCi0gICAgICAgICAqIHRydWUgc2l6ZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBzZXQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNldCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAgICAgICAgLy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisgICAgICAgIC8vLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgIC8vLyB0cnVlIHNpemUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgVFNldChSZWFkTGlzdEJlZ2luKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKLSAgICAgICAgICogYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKLSAgICAgICAgICogcHJlLXN0b3JlZCB2YWx1ZS4gT3RoZXJ3aXNlLCBSZWFkIGEgYnl0ZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKyAgICAgICAgLy8vIGFscmVhZHkgaGF2ZSBiZWVuIFJlYWQgZHVyaW5nIFJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCisgICAgICAgIC8vLyBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIFJlYWQgYSBieXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQm9vbGVhbiBSZWFkQm9vbCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChib29sVmFsdWVfICE9IG51bGwpCkBAIC02MTgsNDIgKzYxNiw0MiBAQAogICAgICAgICB9CiAKICAgICAgICAgYnl0ZVtdIGJ5dGVSYXdCdWYgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHNieXRlIFJlYWRCeXRlKCkKICAgICAgICAgewogICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChieXRlUmF3QnVmLCAwLCAxKTsKICAgICAgICAgICAgIHJldHVybiAoc2J5dGUpYnl0ZVJhd0J1ZlswXTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiAoc2hvcnQpemlnemFnVG9JbnQoUmVhZFZhcmludDMyKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEkzMigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiB6aWd6YWdUb0ludChSZWFkVmFyaW50MzIoKSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiB6aWd6YWdUb0xvbmcoUmVhZFZhcmludDY0KCkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IFJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTm8gbWFnaWMgaGVyZSAtIGp1c3QgUmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBkb3VibGUgUmVhZERvdWJsZSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVbXSBsb25nQml0cyA9IG5ldyBieXRlWzhdOwpAQCAtNjYxLDEwICs2NTksMTAgQEAKICAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuSW50NjRCaXRzVG9Eb3VibGUoYnl0ZXNUb0xvbmcobG9uZ0JpdHMpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkcyBhIGJ5dGVbXSAodmlhIFJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cmluZyBSZWFkU3RyaW5nKCkKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZHMgYSBieXRlW10gKHZpYSBSZWFkQmluYXJ5KSwgYW5kIHRoZW4gVVRGLTggZGVjb2RlcyBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBSZWFkU3RyaW5nKCkKICAgICAgICAgewogICAgICAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpUmVhZFZhcmludDMyKCk7CiAKQEAgLTY3Niw5ICs2NzQsOSBAQAogICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKFJlYWRCaW5hcnkobGVuZ3RoKSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYnl0ZVtdIFJlYWRCaW5hcnkoKQogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gKGludClSZWFkVmFyaW50MzIoKTsKQEAgLTY4OSw5ICs2ODcsOSBAQAogICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgYnl0ZVtdIFJlYWRCaW5hcnkoaW50IGxlbmd0aCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbmV3IGJ5dGVbMF07CkBAIC03MTUsMTAgKzcxMywxMCBAQAogICAgICAgICAvLyBJbnRlcm5hbCBSZWFkaW5nIG1ldGhvZHMKICAgICAgICAgLy8KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0Ci0gICAgICAgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gNSBieXRlcy4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAvLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHVpbnQgUmVhZFZhcmludDMyKCkKICAgICAgICAgewogICAgICAgICAgICAgdWludCByZXN1bHQgPSAwOwpAQCAtNzMzLDEwICs3MzEsMTAgQEAKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAotICAgICAgICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAvLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB1bG9uZyBSZWFkVmFyaW50NjQoKQogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgc2hpZnQgPSAwOwpAQCAtNzU4LDI3ICs3NTYsMjcgQEAKICAgICAgICAgLy8gZW5jb2RpbmcgaGVscGVycwogICAgICAgICAvLwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgaW50IHppZ3phZ1RvSW50KHVpbnQgbikKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIChpbnQpKG4gPj4gMSkgXiAoLShpbnQpKG4gJiAxKSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBsb25nIHppZ3phZ1RvTG9uZyh1bG9uZyBuKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gKGxvbmcpKG4gPj4gMSkgXiAoLShsb25nKShuICYgMSkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAotICAgICAgICAgKiBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAotICAgICAgICAgKiB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCisgICAgICAgIC8vLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorICAgICAgICAvLy8geW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBsb25nIGJ5dGVzVG9Mb25nKGJ5dGVbXSBieXRlcykKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuCkBAIC04MDIsMTAgKzgwMCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIGxvd2VyTmliYmxlID09IFR5cGVzLkJPT0xFQU5fVFJVRSB8fCBsb3dlck5pYmJsZSA9PSBUeXBlcy5CT09MRUFOX0ZBTFNFOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZwotICAgICAgICAgKiBUVHlwZSB2YWx1ZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZworICAgICAgICAvLy8gVFR5cGUgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgVFR5cGUgZ2V0VFR5cGUoYnl0ZSB0eXBlKQogICAgICAgICB7CiAgICAgICAgICAgICBzd2l0Y2ggKChieXRlKSh0eXBlICYgMHgwZikpCkBAIC04NDAsOSArODM4LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBieXRlIGdldENvbXBhY3RUeXBlKFRUeXBlIHR0eXBlKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpdHR5cGVdOwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MKaW5kZXggMmU4ZDk5Zi4uOWRiZGVhOSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9USlNPTlByb3RvY29sLmNzCkBAIC0yOSwxOCArMjksMTggQEAKIHsKICAgICAvLy8gPHN1bW1hcnk+CiAgICAgLy8vIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KLSAgICAvLy8KKyAgICAvLy8gPHBhcmEvPgogICAgIC8vLyBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIFdyaXRlIGFuZCBSZWFkLgotICAgIC8vLworICAgIC8vLyA8cGFyYS8+CiAgICAgLy8vIFBsZWFzZSBzZWUgdGhlIEMrKyBjbGFzcyBoZWFkZXIgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlCiAgICAgLy8vIHByb3RvY29sJ3Mgd2lyZSBmb3JtYXQuCi0gICAgLy8vCisgICAgLy8vIDxwYXJhLz4KICAgICAvLy8gQWRhcHRlZCBmcm9tIHRoZSBKYXZhIHZlcnNpb24uCiAgICAgLy8vIDwvc3VtbWFyeT4KICAgICBwdWJsaWMgY2xhc3MgVEpTT05Qcm90b2NvbCA6IFRQcm90b2NvbAogICAgIHsKICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmFjdG9yeSBmb3IgSlNPTiBwcm90b2NvbCBvYmplY3RzCisgICAgICAgIC8vLyBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMuCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeQogICAgICAgICB7CkBAIC0xNzksMTEgKzE3OSwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUKICAgICAgICAgLy8vIGluc2VydGluZy9SZWFkaW5nIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycwogICAgICAgICAvLy8gVGhpcyBiYXNlIGNvbnRleHQgZG9lcyBub3RoaW5nLgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQKICAgICAgICAgewogICAgICAgICAgICAgcHJvdGVjdGVkIFRKU09OUHJvdG9jb2wgcHJvdG87CkBAIC0yMDAsMTAgKzIwMCwxMCBAQAogICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBFc2NhcGVOdW1iZXJzKCkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBDb250ZXh0IGZvciBKU09OIGxpc3RzLiBXaWxsIGluc2VydC9SZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdAogICAgICAgICAvLy8gZm9yIHRoZSBmaXJzdCBvbmUKLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkxpc3RDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CiAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYyBKU09OTGlzdENvbnRleHQoVEpTT05Qcm90b2NvbCBwcm90b2NvbCkKQEAgLTIzOSwxMiArMjM5LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gQ29udGV4dCBmb3IgSlNPTiByZWNvcmRzLiBXaWxsIGluc2VydC9SZWFkIGNvbG9ucyBiZWZvcmUgdGhlIHZhbHVlIHBvcnRpb24KICAgICAgICAgLy8vIG9mIGVhY2ggcmVjb3JkIHBhaXIsIGFuZCBjb21tYXMgYmVmb3JlIGVhY2gga2V5IGV4Y2VwdCB0aGUgZmlyc3QuIEluCiAgICAgICAgIC8vLyBhZGRpdGlvbiwgd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMgaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlCiAgICAgICAgIC8vLyBlc2NhcGVkIGluIHF1b3RlcyAoc2luY2UgSlNPTiBrZXlzIG11c3QgYmUgc3RyaW5ncykuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJvdGVjdGVkIGNsYXNzIEpTT05QYWlyQ29udGV4dCA6IEpTT05CYXNlQ29udGV4dAogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgSlNPTlBhaXJDb250ZXh0KFRKU09OUHJvdG9jb2wgcHJvdG8pCkBAIC0yOTAsOSArMjkwLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyCiAgICAgICAgIHsKICAgICAgICAgICAgIHByb3RlY3RlZCBUSlNPTlByb3RvY29sIHByb3RvOwpAQCAtMzA1LDEwICszMDUsMTAgQEAKICAgICAgICAgICAgIHByaXZhdGUgYm9vbCBoYXNEYXRhOwogICAgICAgICAgICAgcHJpdmF0ZSBieXRlW10gZGF0YSA9IG5ldyBieXRlWzFdOwogCi0gICAgICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgICAgIC8vLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCiAgICAgICAgICAgICAvLy8gZGF0YSBidWZmZXIgaWYgcHJlc2VudCBvciBnZXR0aW5nIGl0IGZyb20gdGhlIHRyYW5zcG9ydCBvdGhlcndpc2UuCi0gICAgICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICAgICAgcHVibGljIGJ5dGUgUmVhZCgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKGhhc0RhdGEpCkBAIC0zMjIsMTAgKzMyMiwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBkYXRhWzBdOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgICAgIC8vLyBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCiAgICAgICAgICAgICAvLy8gYnVmZmVyIGlmIGl0IGhhcyBub3QgYmVlbiBmaWxsZWQgYWxSZWFkeS4KLSAgICAgICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgICAgICBwdWJsaWMgYnl0ZSBQZWVrKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoIWhhc0RhdGEpCkBAIC0zNDksMjYgKzM0OSwyNiBAQAogICAgICAgICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgogICAgICAgICBwcm90ZWN0ZWQgTG9va2FoZWFkUmVhZGVyIHJlYWRlcjsKIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUHVzaCBhIG5ldyBKU09OIGNvbnRleHQgb250byB0aGUgc3RhY2suCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJvdGVjdGVkIHZvaWQgUHVzaENvbnRleHQoSlNPTkJhc2VDb250ZXh0IGMpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHRTdGFjay5QdXNoKGNvbnRleHQpOwogICAgICAgICAgICAgY29udGV4dCA9IGM7CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUG9wIHRoZSBsYXN0IEpTT04gY29udGV4dCBvZmYgdGhlIHN0YWNrCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJvdGVjdGVkIHZvaWQgUG9wQ29udGV4dCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0U3RhY2suUG9wKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gVEpTT05Qcm90b2NvbCBDb25zdHJ1Y3RvcgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBUSlNPTlByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCiAgICAgICAgICAgICA6IGJhc2UodHJhbnMpCiAgICAgICAgIHsKQEAgLTM3OSwxMSArMzc5LDExIEBACiAgICAgICAgIC8vIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBieSBzZXZlcmFsIG1ldGhvZHMKICAgICAgICAgcHJpdmF0ZSBieXRlW10gdGVtcEJ1ZmZlciA9IG5ldyBieXRlWzRdOwogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYlswXTsgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICAgIC8vLyBNYXJrZWQgcHJvdGVjdGVkIHRvIGF2b2lkIHN5bnRoZXRpYyBhY2Nlc3NvciBpbiBKU09OTGlzdENvbnRleHQuUmVhZAogICAgICAgICAvLy8gYW5kIEpTT05QYWlyQ29udGV4dC5SZWFkCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJvdGVjdGVkIHZvaWQgUmVhZEpTT05TeW50YXhDaGFyKGJ5dGVbXSBiKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlIGNoID0gcmVhZGVyLlJlYWQoKTsKQEAgLTM5NCwxMCArMzk0LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCBjaGFyICgnMCctJzknIG9yICdhJy0nZicpIGludG8gaXRzCiAgICAgICAgIC8vLyBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgSGV4VmFsKGJ5dGUgY2gpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKQEAgLTQxNiw5ICs0MTYsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggdmFsdWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgaGV4IGNoYXJhY3RlcgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgSGV4Q2hhcihieXRlIHZhbCkKICAgICAgICAgewogICAgICAgICAgICAgdmFsICY9IDB4MEY7CkBAIC00MzMsOSArNDMzLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBXcml0ZSB0aGUgYnl0ZXMgaW4gYXJyYXkgYnVmIGFzIGEgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQKLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OU3RyaW5nKGJ5dGVbXSBiKQogICAgICAgICB7CiAgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7CkBAIC00NzksMTQgKzQ3OSwxNCBAQAogICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywgaXQgd2lsbCBiZQogICAgICAgICAvLy8gd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkludGVnZXIobG9uZyBudW0pCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoKTsKIAogICAgICAgICAgICAgYm9vbCBlc2NhcGVOdW0gPSBjb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKICAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCkBAIC00OTgsMTQgKzQ5OCwxNCBAQAogICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKFFVT1RFKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBXcml0ZSBvdXQgYSBkb3VibGUgYXMgYSBKU09OIHZhbHVlLiBJZiBpdCBpcyBOYU4gb3IgaW5maW5pdHkgb3IgaWYgdGhlCiAgICAgICAgIC8vLyBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkRvdWJsZShkb3VibGUgbnVtKQogICAgICAgICB7CiAgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gbnVtLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgc3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZygiRzE3IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CiAgICAgICAgICAgICBib29sIHNwZWNpYWwgPSBmYWxzZTsKIAogICAgICAgICAgICAgc3dpdGNoIChzdHJbMF0pCkBAIC01MzIsMTAgKzUzMiwxMCBAQAogICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CiAgICAgICAgIH0KLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZAogICAgICAgICAvLy8gZGF0YQotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05CYXNlNjQoYnl0ZVtdIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKQEAgLTY5OCw3ICs2OTgsNyBAQAogICAgICAgICAgICAgV3JpdGVKU09ORG91YmxlKGR1Yik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhTdHJpbmcgc3RyKQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhzdHJpbmcgc3RyKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlW10gYiA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpOwogICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKGIpOwpAQCAtNzEzLDEzICs3MTMsMTQgQEAKICAgICAgICAgICogUmVhZGluZyBtZXRob2RzLgogICAgICAgICAgKi8KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLi4gU2tpcCBSZWFkaW5nIGZyb20gdGhlCiAgICAgICAgIC8vLyBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBieXRlW10gUmVhZEpTT05TdHJpbmcoYm9vbCBza2lwQ29udGV4dCkKICAgICAgICAgewogICAgICAgICAgICAgTWVtb3J5U3RyZWFtIGJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIExpc3Q8Y2hhcj4gY29kZXVuaXRzID0gbmV3IExpc3Q8Y2hhcj4oKTsKIAogCiAgICAgICAgICAgICBpZiAoIXNraXBDb250ZXh0KQpAQCAtNzY0LDE1ICs3NjUsNDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSGV4VmFsKChieXRlKXRlbXBCdWZmZXJbMV0pIDw8IDgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSGV4VmFsKChieXRlKXRlbXBCdWZmZXJbMl0pIDw8IDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV4VmFsKHRlbXBCdWZmZXJbM10pKTsKLSAgICAgICAgICAgICAgICB2YXIgdG1wID0gdXRmOEVuY29kaW5nLkdldEJ5dGVzKG5ldyBjaGFyW10geyAoY2hhcil3Y2ggfSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLldyaXRlKHRtcCwgMCwgdG1wLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKENoYXIuSXNIaWdoU3Vycm9nYXRlKChjaGFyKXdjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkFkZCgoY2hhcil3Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChDaGFyLklzTG93U3Vycm9nYXRlKChjaGFyKXdjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQWRkKChjaGFyKXdjaCk7CisgICAgICAgICAgICAgICAgICAgIHZhciB0bXAgPSB1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoY29kZXVuaXRzLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5Xcml0ZSh0bXAsIDAsIHRtcC5MZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhuZXcgY2hhcltdIHsgKGNoYXIpd2NoIH0pOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuV3JpdGUodG1wLCAwLCB0bXAuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5Db3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gYnVmZmVyLlRvQXJyYXkoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGJvb2wgSXNKU09OTnVtZXJpYyhieXRlIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN3aXRjaCAoYikKQEAgLTc5NywxMSArODMwLDExIEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUmVhZCBpbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsIHZhbGlkIGluIEpTT04gbnVtYmVycy4gRG9lcwogICAgICAgICAvLy8gbm90IGRvIGEgY29tcGxldGUgcmVnZXggY2hlY2sgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgbnVtYmVyLgotICAgICAgICAvLy8vPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIFN0cmluZyBSZWFkSlNPTk51bWVyaWNDaGFycygpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFJlYWRKU09OTnVtZXJpY0NoYXJzKCkKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzdHJibGQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgd2hpbGUgKHRydWUpCkBAIC04MTYsOSArODQ5LDkgQEAKICAgICAgICAgICAgIHJldHVybiBzdHJibGQuVG9TdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBsb25nIFJlYWRKU09OSW50ZWdlcigpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQuUmVhZCgpOwpAQCAtODI2LDM2ICs4NTksMzcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHN0ciA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisKKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSBSZWFkSlNPTk51bWVyaWNDaGFycygpOwogICAgICAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldHVybiBJbnQ2NC5QYXJzZShzdHIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKKyAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24gZmV4KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIsIGZleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gZG91YmxlIHZhbHVlLiBUaHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHdyYXBwZWQgaW4gcXVvdGVzCiAgICAgICAgIC8vLyB3aGVuIGV4cGVjdGVkIG9yIGlmIHdyYXBwZWQgaW4gcXVvdGVzIHdoZW4gbm90IGV4cGVjdGVkLgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgZG91YmxlIFJlYWRKU09ORG91YmxlKCkKICAgICAgICAgewogICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CiAgICAgICAgICAgICBpZiAocmVhZGVyLlBlZWsoKSA9PSBRVU9URVswXSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBieXRlW10gYXJyID0gUmVhZEpTT05TdHJpbmcodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGR1YiA9IERvdWJsZS5QYXJzZSh1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGFyciwwLGFyci5MZW5ndGgpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgZHViID0gRG91YmxlLlBhcnNlKHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYXJyLCAwLCBhcnIuTGVuZ3RoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuRXNjYXBlTnVtYmVycygpICYmICFEb3VibGUuSXNOYU4oZHViKSAmJgotICAgICAgICAgICAgICAgICAgICAhRG91YmxlLklzSW5maW5pdHkoZHViKSkKKyAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuRXNjYXBlTnVtYmVycygpICYmICFEb3VibGUuSXNOYU4oZHViKSAmJiAhRG91YmxlLklzSW5maW5pdHkoZHViKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCkBAIC04NzQsMTcgKzkwOCwxNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5QYXJzZShSZWFkSlNPTk51bWVyaWNDaGFycygpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uIGZleCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIiwgZmV4KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgYnl0ZVtdIFJlYWRKU09OQmFzZTY0KCkKICAgICAgICAgewogICAgICAgICAgICAgYnl0ZVtdIGIgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CkBAIC05NTYsNyArOTkwLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLDAsYnVmLkxlbmd0aCk7CisgICAgICAgICAgICBtZXNzYWdlLk5hbWUgPSB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CiAgICAgICAgICAgICBtZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKVJlYWRKU09OSW50ZWdlcigpOwogICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7CiAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKQEAgLTEwNzUsMTAgKzExMDksMTAgQEAKICAgICAgICAgICAgIHJldHVybiBSZWFkSlNPTkRvdWJsZSgpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cmluZyBSZWFkU3RyaW5nKCkKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBSZWFkU3RyaW5nKCkKICAgICAgICAgewogICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwwLGJ1Zi5MZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MKaW5kZXggMzVkMTM4Yy4uYWE5MWM1MiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcwpAQCAtMjksNzQgKzI5LDc3IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQotICAgIC8qKgotICAgICAqIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpcyBhIFRQcm9jZXNzb3IgYWxsb3dpbmcgYSBzaW5nbGUgVFNlcnZlciB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgotICAgICAqIFRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsIHByb2Nlc3NvcnMgd2l0aCBpdCwKLSAgICAgKiBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6Ci0gICAgICoKLSAgICAgKiAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKLSAgICAgKgotICAgICAqICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCi0gICAgICogICAgICAgICAiQ2FsY3VsYXRvciIsCi0gICAgICogICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKLSAgICAgKgotICAgICAqICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCi0gICAgICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCi0gICAgICogICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKLSAgICAgKgotICAgICAqICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKLSAgICAgKiAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOwotICAgICAqCi0gICAgICogICAgIHNlcnZlci5zZXJ2ZSgpOwotICAgICAqLworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gPHNlZSBjcmVmPSJUTXVsdGlwbGV4ZWRQcm9jZXNzb3IiLz4gaXMgYSA8c2VlIGNyZWY9IlRQcm9jZXNzb3IiLz4gYWxsb3dpbmcgYSBzaW5nbGUgPHNlZSBjcmVmPSJUaHJpZnQuU2VydmVyLlRTZXJ2ZXIiLz4KKyAgICAvLy8gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBUbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbCBwcm9jZXNzb3JzIHdpdGggaXQsCisgICAgLy8vIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyA8Y29kZT4KKyAgICAvLy8gICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgLy8vCisgICAgLy8vICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgLy8vICAgICAgICAgIkNhbGN1bGF0b3IiLAorICAgIC8vLyAgICAgICAgIG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpOworICAgIC8vLworICAgIC8vLyAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgIC8vLyAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAgICAvLy8gICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOworICAgIC8vLyAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOworICAgIC8vLworICAgIC8vLyAgICAgc2VydmVyLnNlcnZlKCk7CisgICAgLy8vIDwvY29kZT4KKyAgICAvLy8gPC9zdW1tYXJ5PgogICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiBUUHJvY2Vzc29yCiAgICAgewotICAgICAgICBwcml2YXRlIERpY3Rpb25hcnk8U3RyaW5nLFRQcm9jZXNzb3I+IFNlcnZpY2VQcm9jZXNzb3JNYXAgPSBuZXcgRGljdGlvbmFyeTxTdHJpbmcsVFByb2Nlc3Nvcj4oKTsKKyAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3Nvcj4gU2VydmljZVByb2Nlc3Nvck1hcCA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3Nvcj4oKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIFRNdWx0aXBsZXhlZFByb2Nlc3Nvci4gVGhpcyBhbGxvd3MgdXMgdG8gYnJva2VyCi0gICAgICAgICAqIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEFyZ3M6Ci0gICAgICAgICAqIC0gc2VydmljZU5hbWUgICAgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKLSAgICAgICAgICogICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCi0gICAgICAgICAqIC0gcHJvY2Vzc29yICAgICAgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLCB1c3VhbGx5IHJlZmVycmVkIHRvIGFzICJoYW5kbGVycyIsCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlZ2lzdGVyUHJvY2Vzc29yKFN0cmluZyBzZXJ2aWNlTmFtZSwgVFByb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuIFRoaXMgYWxsb3dzIHVzIHRvIGJyb2tlcgorICAgICAgICAvLy8gcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZSBuYW1lIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBBcmdzOgorICAgICAgICAvLy8gLSBzZXJ2aWNlTmFtZSAgICBOYW1lIG9mIGEgc2VydmljZSwgaGFzIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgbmFtZQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCisgICAgICAgIC8vLyAtIHByb2Nlc3NvciAgICAgIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0byBhcyAiaGFuZGxlcnMiLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICBlLmcuIFdlYXRoZXJSZXBvcnRIYW5kbGVyIGltcGxlbWVudGluZyBXZWF0aGVyUmVwb3J0LklmYWNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBSZWdpc3RlclByb2Nlc3NvcihzdHJpbmcgc2VydmljZU5hbWUsIFRQcm9jZXNzb3IgcHJvY2Vzc29yKQogICAgICAgICB7CiAgICAgICAgICAgICBTZXJ2aWNlUHJvY2Vzc29yTWFwLkFkZChzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKTsKICAgICAgICAgfQogCiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIEZhaWwoIFRQcm90b2NvbCBvcHJvdCwgVE1lc3NhZ2UgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUgZXh0eXBlLCBzdHJpbmcgZXR4dCkKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEZhaWwoVFByb3RvY29sIG9wcm90LCBUTWVzc2FnZSBtZXNzYWdlLCBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZSBleHR5cGUsIHN0cmluZyBldHh0KQogICAgICAgICB7Ci0gICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24gYXBwZXggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCBleHR5cGUsIGV0eHQpOworICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFwcGV4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihleHR5cGUsIGV0eHQpOwogCiAgICAgICAgICAgICBUTWVzc2FnZSBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKG1lc3NhZ2UuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbWVzc2FnZS5TZXFJRCk7CiAKICAgICAgICAgICAgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ld01lc3NhZ2UpOwotICAgICAgICAgICAgYXBwZXguV3JpdGUoIG9wcm90KTsKKyAgICAgICAgICAgIGFwcGV4LldyaXRlKG9wcm90KTsKICAgICAgICAgICAgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOwogICAgICAgICAgICAgb3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7CiAgICAgICAgIH0KIAogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3MgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKLSAgICAgICAgICoKLSAgICAgICAgICogLSBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICAgICAqIC0gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuCi0gICAgICAgICAqIC0gVXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3Nvci4KLSAgICAgICAgICogLSBEaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAotICAgICAgICAgKiAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZgotICAgICAgICAgKiAtIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLAotICAgICAgICAgKiAtIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IKLSAgICAgICAgICogLSB0aGUgc2VydmljZSBuYW1lIGhhcyBub3QgYmVlbiBSZWdpc3RlclByb2Nlc3NvcigpZWQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3MgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAtIFJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS4KKyAgICAgICAgLy8vIC0gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuCisgICAgICAgIC8vLyAtIFVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuCisgICAgICAgIC8vLyAtIERpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAgICAgIC8vLyAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS4KKyAgICAgICAgLy8vIDxwYXJhLz4KKyAgICAgICAgLy8vIFRocm93cyBhbiBleGNlcHRpb24gaWYKKyAgICAgICAgLy8vIC0gdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVksCisgICAgICAgIC8vLyAtIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IKKyAgICAgICAgLy8vIC0gdGhlIHNlcnZpY2UgbmFtZSBoYXMgbm90IGJlZW4gUmVnaXN0ZXJQcm9jZXNzb3IoKWVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KQogICAgICAgICB7CiAgICAgICAgICAgICAvKiAgVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCkBAIC0xNTUsMTcgKzE1OCwxNyBAQAogCiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiAgSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCi0gICAgICAgICAqICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgYSBUTWVzc2FnZSBpbiBleGFjdGx5Ci0gICAgICAgICAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgT3VyIGdvYWwgd2FzIHRvIHdvcmsgd2l0aCBhbnkgcHJvdG9jb2wuICBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKKyAgICAgICAgLy8vICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgYSBUTWVzc2FnZSBpbiBleGFjdGx5CisgICAgICAgIC8vLyAgdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgogICAgICAgICB7CiAgICAgICAgICAgICBUTWVzc2FnZSBNc2dCZWdpbjsKIAogICAgICAgICAgICAgcHVibGljIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIFRNZXNzYWdlIG1lc3NhZ2VCZWdpbikKLSAgICAgICAgICAgICAgICA6YmFzZShwcm90b2NvbCkKKyAgICAgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhpcy5Nc2dCZWdpbiA9IG1lc3NhZ2VCZWdpbjsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MKaW5kZXggMWUyYWY4My4uMWJkNDIwZiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MKQEAgLTI5LDYzICsyOSw2MiBAQAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewogCi0gICAgLyoqCi0gICAgICogVE11bHRpcGxleGVkUHJvdG9jb2wgaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IgdGhhdCBhbGxvd3MgYSBUaHJpZnQKLSAgICAgKiBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLCBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUKLSAgICAgKiB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCi0gICAgICoKLSAgICAgKiBOT1RFOiBUSElTIElTIE5PVCBUTyBCRSBVU0VEIEJZIFNFUlZFUlMuCi0gICAgICogT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCi0gICAgICoKLSAgICAgKiBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6Ci0gICAgICoKLSAgICAgKiAgICAgVFNvY2tldCB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7Ci0gICAgICogICAgIHRyYW5zcG9ydC5vcGVuKCk7Ci0gICAgICoKLSAgICAgKiAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwotICAgICAqCi0gICAgICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOwotICAgICAqICAgICBDYWxjdWxhdG9yLkNsaWVudCBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG1wKTsKLSAgICAgKgotICAgICAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7Ci0gICAgICogICAgIFdlYXRoZXJSZXBvcnQuQ2xpZW50IHNlcnZpY2UyID0gbmV3IFdlYXRoZXJSZXBvcnQuQ2xpZW50KG1wMik7Ci0gICAgICoKLSAgICAgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOwotICAgICAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZTIuZ2V0VGVtcGVyYXR1cmUoKSk7Ci0gICAgICoKLSAgICAgKi8KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yIHRoYXQgYWxsb3dzIGEgVGhyaWZ0CisgICAgLy8vIGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsIGJ5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgIC8vLyB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gTk9URTogVEhJUyBJUyBOT1QgVE8gQkUgVVNFRCBCWSBTRVJWRVJTLgorICAgIC8vLyBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0cyBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisgICAgLy8vIDxjb2RlPgorICAgIC8vLyAgICAgVFNvY2tldCB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgICAgLy8vICAgICB0cmFuc3BvcnQub3BlbigpOworICAgIC8vLworICAgIC8vLyAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgIC8vLworICAgIC8vLyAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgICAgLy8vICAgICBDYWxjdWxhdG9yLkNsaWVudCBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG1wKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTsKKyAgICAvLy8gICAgIFdlYXRoZXJSZXBvcnQuQ2xpZW50IHNlcnZpY2UyID0gbmV3IFdlYXRoZXJSZXBvcnQuQ2xpZW50KG1wMik7CisgICAgLy8vCisgICAgLy8vICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgICAgLy8vICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZTIuZ2V0VGVtcGVyYXR1cmUoKSk7CisgICAgLy8vIDwvY29kZT4KKyAgICAvLy8gPC9zdW1tYXJ5PgogICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgogICAgIHsKIAotICAgICAgICAvKiogVXNlZCB0byBkZWxpbWl0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgZnVuY3Rpb24gbmFtZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVBBUkFUT1IgPSAiOiI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFNFUEFSQVRPUiA9ICI6IjsKIAotICAgICAgICBwcml2YXRlIFN0cmluZyBTZXJ2aWNlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgU2VydmljZU5hbWU7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKLSAgICAgICAgICogbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKLSAgICAgICAgICogcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcgc2VydmVyIGNhbiBicm9rZXIKLSAgICAgICAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgotICAgICAgICAgKgotICAgICAgICAgKiBBcmdzOgotICAgICAgICAgKiAgcHJvdG9jb2wgICAgICAgIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gVEJpbmFyeVByb3RvY29sCi0gICAgICAgICAqICBzZXJ2aWNlTmFtZSAgICAgVGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgU3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCisgICAgICAgIC8vLyBtdWx0aXBsZXhpbmcgc2VydmVyLiAgVGhlIDxwYXJhbXJlZiBuYW1lPSJzZXJ2aWNlTmFtZSIvPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgICAgICAvLy8gcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcgc2VydmVyIGNhbiBicm9rZXIKKyAgICAgICAgLy8vIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm90b2NvbCI+WW91ciBjb21tdW5pY2F0aW9uIHByb3RvY29sIG9mIGNob2ljZSwgZS5nLiA8c2VlIGNyZWY9IlRCaW5hcnlQcm90b2NvbCIvPi48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlcnZpY2VOYW1lIj5UaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgc3RyaW5nIHNlcnZpY2VOYW1lKQogICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQogICAgICAgICB7CiAgICAgICAgICAgICBTZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IuCi0gICAgICAgICAqIEFyZ3M6Ci0gICAgICAgICAqICAgdE1lc3NhZ2UgICAgIFRoZSBvcmlnaW5hbCBtZXNzYWdlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0TWVzc2FnZSI+VGhlIG9yaWdpbmFsIG1lc3NhZ2UuPC9wYXJhbT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgdE1lc3NhZ2UpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCh0TWVzc2FnZS5UeXBlKQorICAgICAgICAgICAgc3dpdGNoICh0TWVzc2FnZS5UeXBlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLkNhbGw6CiAgICAgICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuT25ld2F5OgpAQCAtMTAxLDUgKzEwMCw0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcwppbmRleCBiZjQ4MWFiLi5kZDdhNmUwIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzCkBAIC0xMDgsNyArMTA4LDggQEAKICAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVJMzIoaW50IGkzMik7CiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KTsKICAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGQpOwotICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzKSB7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHMpCisgICAgICAgIHsKICAgICAgICAgICAgIFdyaXRlQmluYXJ5KEVuY29kaW5nLlVURjguR2V0Qnl0ZXMocykpOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiKTsKQEAgLTEzMSw3ICsxMzIsOCBAQAogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IFJlYWRJMzIoKTsKICAgICAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgUmVhZEk2NCgpOwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIFJlYWREb3VibGUoKTsKLSAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFJlYWRTdHJpbmcoKSB7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBSZWFkU3RyaW5nKCkKKyAgICAgICAgewogICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRCaW5hcnkoKTsKICAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuY3MKaW5kZXggN2JjMzRlZi4uODYwMDAwMiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5jcwpAQCAtMjgsMjYgKzI4LDI1IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQotICAgIC8qKgotICAgICAqIFRQcm90b2NvbERlY29yYXRvciBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQgVFByb3RvY29sIGluc3RhbmNlLAotICAgICAqIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZSBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4gIFdoaWxlIGl0IGhhcwotICAgICAqIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0IGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLAotICAgICAqIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCBUUHJvdG9jb2wuCi0gICAgICoKLSAgICAgKiBTZWUgcC4xNzUgb2YgRGVzaWduIFBhdHRlcm5zIChieSBHYW1tYSBldCBhbC4pCi0gICAgICogU2VlIFRNdWx0aXBsZXhlZFByb3RvY29sCi0gICAgICovCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyA8c2VlIGNyZWY9IlRQcm90b2NvbERlY29yYXRvciIvPiBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQgPHNlZSBjcmVmPSJUUHJvdG9jb2wiLz4gaW5zdGFuY2UsCisgICAgLy8vIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZSBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4gV2hpbGUgaXQgaGFzCisgICAgLy8vIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0IGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLAorICAgIC8vLyBpdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGJlaGF2aW91ciBvZiB0aGUgZW5jbG9zZWQgPHNlZSBjcmVmPSJUUHJvdG9jb2wiLz4uCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gU2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlRNdWx0aXBsZXhlZFByb3RvY29sIi8+CiAgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRQcm90b2NvbERlY29yYXRvciA6IFRQcm90b2NvbAogICAgIHsKICAgICAgICAgcHJpdmF0ZSBUUHJvdG9jb2wgV3JhcHBlZFByb3RvY29sOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgotICAgICAgICAgKiBAcGFyYW0gcHJvdG9jb2wgQWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoaXMgcHJvdG9jb2wuICBNdXN0IGJlIG5vbi1udWxsLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm90b2NvbCI+QWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoaXMgcHJvdG9jb2wuICBNdXN0IGJlIG5vbi1udWxsLjwvcGFyYW0+CiAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xEZWNvcmF0b3IoVFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgOiBiYXNlKCBwcm90b2NvbC5UcmFuc3BvcnQpCisgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wuVHJhbnNwb3J0KQogICAgICAgICB7CiAKICAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbCA9IHByb3RvY29sOwpAQCAtMTA0LDcgKzEwMyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKQoteworICAgICAgICB7CiAgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0RW5kKCk7CiAgICAgICAgIH0KIApAQCAtMTQ4LDcgKzE0Nyw3IEBACiAgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVEb3VibGUodik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhTdHJpbmcgcykKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHMpCiAgICAgICAgIHsKICAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cmluZyhzKTsKICAgICAgICAgfQpAQCAtMjQ4LDcgKzI0Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWREb3VibGUoKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdHJpbmcgUmVhZFN0cmluZygpCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgUmVhZFN0cmluZygpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cmluZygpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKaW5kZXggNzZjNzQ5ZC4uN2JlZjIzNiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwpAQCAtNDIsMjAgKzQyLDIwIEBACiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUpCi0gICAgICAgICAgICA6IGJhc2UoKQorICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKHN0cmluZy5FbXB0eSwgaW5uZXIpCiAgICAgICAgIHsKICAgICAgICAgICAgIHR5cGVfID0gdHlwZTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUsIFN0cmluZyBtZXNzYWdlKQotICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUsIHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQogICAgICAgICB7CiAgICAgICAgICAgICB0eXBlXyA9IHR5cGU7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQotICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCiAgICAgICAgIHsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcwppbmRleCAwOTMyYTdmLi5kOTk1YzZjIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MKQEAgLTk1LDggKzk1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZExpc3RFbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiVW5rbm93biBkYXRhIHR5cGUgIiArIHR5cGUuVG9TdHJpbmcoImQiKSk7CiAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5hbGx5CiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzCmluZGV4IGEyNjMxYTkuLjJiYzA0ZjMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzCkBAIC0yOCwxMDAgKzI4LDEyOCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgogewotICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgotICB7Ci0gICAgLy9BdHRyaWJ1dGVzCi0gICAgcHJvdGVjdGVkIFRQcm9jZXNzb3IgcHJvY2Vzc29yOwotICAgIHByb3RlY3RlZCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydDsKLSAgICBwcm90ZWN0ZWQgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5OwotICAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgVFNlcnZlckV2ZW50SGFuZGxlciBzZXJ2ZXJFdmVudEhhbmRsZXIgPSBudWxsOworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyCisgICAgeworICAgICAgICAvL0F0dHJpYnV0ZXMKKyAgICAgICAgcHJvdGVjdGVkIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUU2VydmVyRXZlbnRIYW5kbGVyIHNlcnZlckV2ZW50SGFuZGxlciA9IG51bGw7CiAKLSAgICAvL01ldGhvZHMKLSAgICBwdWJsaWMgdm9pZCBzZXRFdmVudEhhbmRsZXIoVFNlcnZlckV2ZW50SGFuZGxlciBzZWgpCi0gICAgewotICAgICAgc2VydmVyRXZlbnRIYW5kbGVyID0gc2VoOwotICAgIH0KLSAgICBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciBnZXRFdmVudEhhbmRsZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBzZXJ2ZXJFdmVudEhhbmRsZXI7Ci0gICAgfQorICAgICAgICAvL01ldGhvZHMKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RXZlbnRIYW5kbGVyKFRTZXJ2ZXJFdmVudEhhbmRsZXIgc2VoKQorICAgICAgICB7CisgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIgPSBzZWg7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZ2V0RXZlbnRIYW5kbGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcjsKKyAgICAgICAgfQogCi0gICAgLy9Mb2cgZGVsZWdhdGlvbgotICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIExvZ0RlbGVnYXRlKHN0cmluZyBzdHIpOwotICAgIHByaXZhdGUgTG9nRGVsZWdhdGUgX2xvZ0RlbGVnYXRlOwotICAgIHByb3RlY3RlZCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZQotICAgIHsKLSAgICAgIGdldCB7IHJldHVybiBfbG9nRGVsZWdhdGU7IH0KLSAgICAgIHNldCB7IF9sb2dEZWxlZ2F0ZSA9ICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlIDogRGVmYXVsdExvZ0RlbGVnYXRlOyB9Ci0gICAgfQotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBEZWZhdWx0TG9nRGVsZWdhdGUoc3RyaW5nIHMpCi0gICAgewotICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUocyk7Ci0gICAgfQorICAgICAgICAvL0xvZyBkZWxlZ2F0aW9uCisgICAgICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIExvZ0RlbGVnYXRlKHN0cmluZyBzdHIpOworICAgICAgICBwcml2YXRlIExvZ0RlbGVnYXRlIF9sb2dEZWxlZ2F0ZTsKKyAgICAgICAgcHJvdGVjdGVkIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfbG9nRGVsZWdhdGU7IH0KKyAgICAgICAgICAgIHNldCB7IF9sb2dEZWxlZ2F0ZSA9ICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlIDogRGVmYXVsdExvZ0RlbGVnYXRlOyB9CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIERlZmF1bHRMb2dEZWxlZ2F0ZShzdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUocyk7CisgICAgICAgIH0KIAotICAgIC8vQ29uc3RydWN0aW9uCi0gICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQotICAgICAgOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9CisgICAgICAgIC8vQ29uc3RydWN0aW9uCisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgICAgICAgOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLSAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAogICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAogICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wcm9jZXNzb3JGYWN0b3J5ID0gbmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3Nvcik7CisgICAgICAgICAgICB0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5sb2dEZWxlZ2F0ZSA9IChsb2dEZWxlZ2F0ZSAhPSBudWxsKSA/IGxvZ0RlbGVnYXRlIDogRGVmYXVsdExvZ0RlbGVnYXRlOworICAgICAgICB9CiAKLSAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnkpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLAotICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9CisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wcm9jZXNzb3JGYWN0b3J5ID0gcHJvY2Vzc29yRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgICAgICAgdGhpcy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLmxvZ0RlbGVnYXRlID0gKGxvZ0RlbGVnYXRlICE9IG51bGwpID8gbG9nRGVsZWdhdGUgOiBEZWZhdWx0TG9nRGVsZWdhdGU7CisgICAgICAgIH0KIAotICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLAotICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7CisgICAgICAgIC8vQWJzdHJhY3QgSW50ZXJmYWNlCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFNlcnZlKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFN0b3AoKTsKICAgICB9Ci0KLSAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQotICAgIHsKLSAgICAgIHRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yOwotICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7Ci0gICAgICB0aGlzLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICAgIHRoaXMub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0gICAgICB0aGlzLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7Ci0gICAgICB0aGlzLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKLSAgICAgIHRoaXMubG9nRGVsZWdhdGUgPSAobG9nRGVsZWdhdGUgIT0gbnVsbCkgPyBsb2dEZWxlZ2F0ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsKLSAgICB9Ci0KLSAgICAvL0Fic3RyYWN0IEludGVyZmFjZQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFNlcnZlKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgU3RvcCgpOwotICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzCmluZGV4IDg0M2IxNjYuLmU4MWVmYzYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzCkBAIC0yNSwyNiArMjUsMjkgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHNlcnZlciB1c2VycyB0byBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlcgotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgaW50ZXJmYWNlIFRTZXJ2ZXJFdmVudEhhbmRsZXIKLSAgewogICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucyAqLworICAgIC8vLyBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgc2VydmVyIHVzZXJzIHRvIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgc2VydmVyLgogICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgdm9pZCBwcmVTZXJ2ZSgpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcgKi8KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIE9iamVjdCBjcmVhdGVDb250ZXh0KFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGRlbGV0ZSBzZXJ2ZXIgY29udGV4dCAqLwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgdm9pZCBkZWxldGVDb250ZXh0KE9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IgKi8KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHZvaWQgcHJvY2Vzc0NvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5UcmFuc3BvcnQuVFRyYW5zcG9ydCB0cmFuc3BvcnQpOwotICB9OworICAgIHB1YmxpYyBpbnRlcmZhY2UgVFNlcnZlckV2ZW50SGFuZGxlcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBwcmVTZXJ2ZSgpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBvYmplY3QgY3JlYXRlQ29udGV4dChUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaGFzIGZpbmlzaGVkIHJlcXVlc3QtaGFuZGxpbmcgdG8gZGVsZXRlIHNlcnZlciBjb250ZXh0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIGRlbGV0ZUNvbnRleHQob2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgcHJvY2Vzc0NvbnRleHQob2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5UcmFuc3BvcnQuVFRyYW5zcG9ydCB0cmFuc3BvcnQpOworICAgIH07CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzCmluZGV4IDI2N2I0NzAuLjRlN2VhOTYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzCkBAIC0yNywxMzggKzI3LDE1NCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgogewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBTaW1wbGUgc2luZ2xlLXRocmVhZGVkIHNlcnZlciBmb3IgdGVzdGluZwotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgVFNpbXBsZVNlcnZlciA6IFRTZXJ2ZXIKLSAgewotICAgIHByaXZhdGUgYm9vbCBzdG9wID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCi0gICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTaW1wbGUgc2luZ2xlLXRocmVhZGVkIHNlcnZlciBmb3IgdGVzdGluZy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUU2ltcGxlU2VydmVyIDogVFNlcnZlcgogICAgIHsKLSAgICB9CisgICAgICAgIHByaXZhdGUgYm9vbCBzdG9wID0gZmFsc2U7CiAKLSAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbCkKLSAgICAgIDogYmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIGxvZ0RlbCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KQotICAgICAgOiBiYXNlKHByb2Nlc3NvciwKLSAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLSAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQotICAgICAgOiBiYXNlKHByb2Nlc3NvciwKLSAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLSAgICAgIHsKLSAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucwotICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKLQotICAgICAgd2hpbGUgKCFzdG9wKQotICAgICAgewotICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IG51bGw7Ci0gICAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOwotICAgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7Ci0gICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKLSAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKLSAgICAgICAgdHJ5CisgICAgICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgICAgICAgOiBiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgdXNpbmcgKGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsKQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIGxvZ0RlbCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnkpCisgICAgICAgICAgOiBiYXNlKHByb2Nlc3NvciwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiBiYXNlKHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgOiBiYXNlKHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdXNpbmcgKGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdXNpbmcgKG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7Ci0KLSAgICAgICAgICAgICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7Ci0KLSAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCi0gICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIC8vRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KLSAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgIC8vYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQotICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghc3RvcCB8fCB0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCi0gICAgICAgICAgewotICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCi0gICAgICAgIHsKLSAgICAgICAgICAvL1VuZXhwZWN0ZWQKLSAgICAgICAgICBsb2dEZWxlZ2F0ZSh4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucworICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOworCisgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dFRyYW5zcG9ydC5QZWVrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wIHx8IHR0eC5UeXBlICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vVW5leHBlY3RlZAorICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvL0ZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCi0gICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQogICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQotICAgIHsKLSAgICAgIHN0b3AgPSB0cnVlOwotICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7Ci0gICAgfQotICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKaW5kZXggNGMyMDFlOS4uYTQ5NGNlNyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcwpAQCAtMjgsMTg1ICsyOCwyNjggQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gU2VydmVyIHRoYXQgdXNlcyBDIyBidWlsdC1pbiBUaHJlYWRQb29sIHRvIHNwYXduIHRocmVhZHMgd2hlbiBoYW5kbGluZyByZXF1ZXN0cwotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIgOiBUU2VydmVyCi0gIHsKLSAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01JTl9USFJFQURTID0gMTA7Ci0gICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NQVhfVEhSRUFEUyA9IDEwMDsKLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2wgc3RvcCA9IGZhbHNlOwotCi0gICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKLSAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLSAgICAgICAgIERFRkFVTFRfTUlOX1RIUkVBRFMsIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICBERUZBVUxUX01JTl9USFJFQURTLCBERUZBVUxUX01BWF9USFJFQURTLCBsb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKLSAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgIERFRkFVTFRfTUlOX1RIUkVBRFMsIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgaW50IG1pblRocmVhZFBvb2xUaHJlYWRzLCBpbnQgbWF4VGhyZWFkUG9vbFRocmVhZHMsIExvZ0RlbGVnYXRlIGxvZ0RlbCkKLSAgICAgIDogYmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ0RlbCkKLSAgICB7Ci0gICAgICBsb2NrICh0eXBlb2YoVFRocmVhZFBvb2xTZXJ2ZXIpKQotICAgICAgewotICAgICAgICBpZiAoIVRocmVhZFBvb2wuU2V0TWF4VGhyZWFkcyhtYXhUaHJlYWRQb29sVGhyZWFkcywgbWF4VGhyZWFkUG9vbFRocmVhZHMpKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNYXhUaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIVRocmVhZFBvb2wuU2V0TWluVGhyZWFkcyhtaW5UaHJlYWRQb29sVGhyZWFkcywgbWluVGhyZWFkUG9vbFRocmVhZHMpKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNaW5UaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotCiAgICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBVc2UgbmV3IFRocmVhZFBvb2wgdGhyZWFkIGZvciBlYWNoIG5ldyBjbGllbnQgY29ubmVjdGlvbgorICAgIC8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIGJ1aWx0LWluIFRocmVhZFBvb2wgdG8gc3Bhd24gdGhyZWFkcyB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzLgogICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgIHB1YmxpYyBjbGFzcyBUVGhyZWFkUG9vbFNlcnZlciA6IFRTZXJ2ZXIKICAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotICAgICAgewotICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3IsIGNvdWxkIG5vdCBsaXN0ZW4gb24gU2VydmVyVHJhbnNwb3J0OiAiICsgdHR4KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01JTl9USFJFQURTID0gLTE7ICAvLyB1c2UgLk5FVCBUaHJlYWRQb29sIGRlZmF1bHRzCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAtMTsgIC8vIHVzZSAuTkVUIFRocmVhZFBvb2wgZGVmYXVsdHMKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIHN0b3AgPSBmYWxzZTsKIAotICAgICAgLy9GaXJlIHRoZSBwcmVTZXJ2ZSBzZXJ2ZXIgZXZlbnQgd2hlbiBzZXJ2ZXIgaXMgdXAgYnV0IGJlZm9yZSBhbnkgY2xpZW50IGNvbm5lY3Rpb25zCi0gICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOworICAgICAgICBwdWJsaWMgc3RydWN0IENvbmZpZ3VyYXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBNaW5Xb3JrZXJUaHJlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBNYXhXb3JrZXJUaHJlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBNaW5JT1RocmVhZHM7CisgICAgICAgICAgICBwdWJsaWMgaW50IE1heElPVGhyZWFkczsKIAotICAgICAgd2hpbGUgKCFzdG9wKQotICAgICAgewotICAgICAgICBpbnQgZmFpbHVyZUNvdW50ID0gMDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKLSAgICAgICAgICBUaHJlYWRQb29sLlF1ZXVlVXNlcldvcmtJdGVtKHRoaXMuRXhlY3V0ZSwgY2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICsrZmFpbHVyZUNvdW50OwotICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uKGludCBtaW4gPSBERUZBVUxUX01JTl9USFJFQURTLCBpbnQgbWF4ID0gREVGQVVMVF9NQVhfVEhSRUFEUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaW5Xb3JrZXJUaHJlYWRzID0gbWluOworICAgICAgICAgICAgICAgIE1heFdvcmtlclRocmVhZHMgPSBtYXg7CisgICAgICAgICAgICAgICAgTWluSU9UaHJlYWRzID0gbWluOworICAgICAgICAgICAgICAgIE1heElPVGhyZWFkcyA9IG1heDsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgcHVibGljIENvbmZpZ3VyYXRpb24oaW50IG1pbldvcmssIGludCBtYXhXb3JrLCBpbnQgbWluSU8sIGludCBtYXhJTykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaW5Xb3JrZXJUaHJlYWRzID0gbWluV29yazsKKyAgICAgICAgICAgICAgICBNYXhXb3JrZXJUaHJlYWRzID0gbWF4V29yazsKKyAgICAgICAgICAgICAgICBNaW5JT1RocmVhZHMgPSBtaW5JTzsKKyAgICAgICAgICAgICAgICBNYXhJT1RocmVhZHMgPSBtYXhJTzsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgfQogCi0gICAgICBpZiAoc3RvcCkKLSAgICAgIHsKLSAgICAgICAgdHJ5CisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKICAgICAgICAgewotICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwogICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSwgbG9nRGVsZWdhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICBsb2dEZWxlZ2F0ZSgiVFNlcnZlclRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7CiAgICAgICAgIH0KLSAgICAgICAgc3RvcCA9IGZhbHNlOwotICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBtaW5UaHJlYWRQb29sVGhyZWFkcywgaW50IG1heFRocmVhZFBvb2xUaHJlYWRzLCBMb2dEZWxlZ2F0ZSBsb2dEZWwpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbihtaW5UaHJlYWRQb29sVGhyZWFkcywgbWF4VGhyZWFkUG9vbFRocmVhZHMpLAorICAgICAgICAgICAgIGxvZ0RlbCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIHRocmVhZENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbCkKKyAgICAgICAgICAgIDogYmFzZShwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ0RlbCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jayAodHlwZW9mKFRUaHJlYWRQb29sU2VydmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRocmVhZENvbmZpZy5NYXhXb3JrZXJUaHJlYWRzID4gMCkgfHwgKHRocmVhZENvbmZpZy5NYXhJT1RocmVhZHMgPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB3b3JrLCBjb21tOworICAgICAgICAgICAgICAgICAgICBUaHJlYWRQb29sLkdldE1heFRocmVhZHMob3V0IHdvcmssIG91dCBjb21tKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NYXhXb3JrZXJUaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsgPSB0aHJlYWRDb25maWcuTWF4V29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NYXhJT1RocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29tbSA9IHRocmVhZENvbmZpZy5NYXhJT1RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICghVGhyZWFkUG9vbC5TZXRNYXhUaHJlYWRzKHdvcmssIGNvbW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNYXhUaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRocmVhZENvbmZpZy5NaW5Xb3JrZXJUaHJlYWRzID4gMCkgfHwgKHRocmVhZENvbmZpZy5NaW5JT1RocmVhZHMgPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB3b3JrLCBjb21tOworICAgICAgICAgICAgICAgICAgICBUaHJlYWRQb29sLkdldE1pblRocmVhZHMob3V0IHdvcmssIG91dCBjb21tKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NaW5Xb3JrZXJUaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsgPSB0aHJlYWRDb25maWcuTWluV29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NaW5JT1RocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29tbSA9IHRocmVhZENvbmZpZy5NaW5JT1RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICghVGhyZWFkUG9vbC5TZXRNaW5UaHJlYWRzKHdvcmssIGNvbW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNaW5UaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZSBuZXcgVGhyZWFkUG9vbCB0aHJlYWQgZm9yIGVhY2ggbmV3IGNsaWVudCBjb25uZWN0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3IsIGNvdWxkIG5vdCBsaXN0ZW4gb24gU2VydmVyVHJhbnNwb3J0OiAiICsgdHR4KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucworICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOworCisgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkUG9vbC5RdWV1ZVVzZXJXb3JrSXRlbSh0aGlzLkV4ZWN1dGUsIGNsaWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcCB8fCB0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrZmFpbHVyZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJUU2VydmVyVHJhbnNwb3J0IGZhaWxlZCBvbiBjbG9zZTogIiArIHR0eC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RvcCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCisgICAgICAgIC8vLyB0aHJlYWRDb250ZXh0IHdpbGwgYmUgYSBUVHJhbnNwb3J0IGluc3RhbmNlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGhyZWFkQ29udGV4dCI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEV4ZWN1dGUob2JqZWN0IHRocmVhZENvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KXRocmVhZENvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQsIHRoaXMpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBvYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dFRyYW5zcG9ydC5QZWVrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9VbmV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0Nsb3NlIHRyYW5zcG9ydHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkaXNwb3NhYmxlIHN0dWZmIHNob3VsZCBiZSBkaXNwb3NlZAorICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQogICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCi0gICAgLy8vIHRocmVhZENvbnRleHQgd2lsbCBiZSBhIFRUcmFuc3BvcnQgaW5zdGFuY2UKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0idGhyZWFkQ29udGV4dCI+PC9wYXJhbT4KLSAgICBwcml2YXRlIHZvaWQgRXhlY3V0ZShPYmplY3QgdGhyZWFkQ29udGV4dCkKLSAgICB7Ci0gICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KXRocmVhZENvbnRleHQ7Ci0gICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKLSAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKLSAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKLSAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7Ci0gICAgICBPYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotCi0gICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKLSAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotCi0gICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCi0gICAgICAgIHdoaWxlICghc3RvcCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAvL0ZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50Ci0gICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KLSAgICAgICAgICAvL1RoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKLSAgICAgICAgICAvL2FjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgotICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKLSAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgLy9Vc3VhbGx5IGEgY2xpZW50IGRpc2Nvbm5lY3QsIGV4cGVjdGVkCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCi0gICAgICB7Ci0gICAgICAgIC8vVW5leHBlY3RlZAotICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKLSAgICAgIH0KLQotICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cwotICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotCi0gICAgICAvL0Nsb3NlIHRyYW5zcG9ydHMKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQotICAgICAgICBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOwotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQotICAgICAgICBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKLSAgICB7Ci0gICAgICBzdG9wID0gdHJ1ZTsKLSAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotICAgIH0KLSAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3MKaW5kZXggZjhlZDhlMi4uY2MwNTFhMyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNzCkBAIC0yNiwyMzIgKzI2LDI1NyBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgogewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIHRocmVhZHMgKGFzIG9wcG9zZWQgdG8gdGhlIFRocmVhZFBvb2wpIHdoZW4gaGFuZGxpbmcgcmVxdWVzdHMKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIFRUaHJlYWRlZFNlcnZlciA6IFRTZXJ2ZXIKLSAgewotICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIHN0b3AgPSBmYWxzZTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IGludCBtYXhUaHJlYWRzOwotCi0gICAgcHJpdmF0ZSBRdWV1ZTxUVHJhbnNwb3J0PiBjbGllbnRRdWV1ZTsKLSAgICBwcml2YXRlIFRIYXNoU2V0PFRocmVhZD4gY2xpZW50VGhyZWFkczsKLSAgICBwcml2YXRlIG9iamVjdCBjbGllbnRMb2NrOwotICAgIHByaXZhdGUgVGhyZWFkIHdvcmtlclRocmVhZDsKLQotICAgIHB1YmxpYyBpbnQgQ2xpZW50VGhyZWFkc0NvdW50ICB7Ci0gICAgICAgIGdldCB7IHJldHVybiBjbGllbnRUaHJlYWRzLkNvdW50OyB9Ci0gICAgfQotCi0gICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKLSAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLSAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIGxvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKLSAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGludCBtYXhUaHJlYWRzLCBMb2dEZWxlZ2F0ZSBsb2dEZWwpCi0gICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dEZWwpCi0gICAgewotICAgICAgdGhpcy5tYXhUaHJlYWRzID0gbWF4VGhyZWFkczsKLSAgICAgIGNsaWVudFF1ZXVlID0gbmV3IFF1ZXVlPFRUcmFuc3BvcnQ+KCk7Ci0gICAgICBjbGllbnRMb2NrID0gbmV3IG9iamVjdCgpOwotICAgICAgY2xpZW50VGhyZWFkcyA9IG5ldyBUSGFzaFNldDxUaHJlYWQ+KCk7Ci0gICAgfQotCiAgICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBVc2UgbmV3IFRocmVhZCBmb3IgZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24uIGJsb2NrIHVudGlsIG51bUNvbm5lY3Rpb25zIDwgbWF4VGhyZWFkcworICAgIC8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIHRocmVhZHMgKGFzIG9wcG9zZWQgdG8gdGhlIFRocmVhZFBvb2wpIHdoZW4gaGFuZGxpbmcgcmVxdWVzdHMuCiAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCisgICAgcHVibGljIGNsYXNzIFRUaHJlYWRlZFNlcnZlciA6IFRTZXJ2ZXIKICAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy9zdGFydCB3b3JrZXIgdGhyZWFkCi0gICAgICAgIHdvcmtlclRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFRocmVhZFN0YXJ0KEV4ZWN1dGUpKTsKLSAgICAgICAgd29ya2VyVGhyZWFkLlN0YXJ0KCk7Ci0gICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLSAgICAgIHsKLSAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NQVhfVEhSRUFEUyA9IDEwMDsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIHN0b3AgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgbWF4VGhyZWFkczsKIAotICAgICAgLy9GaXJlIHRoZSBwcmVTZXJ2ZSBzZXJ2ZXIgZXZlbnQgd2hlbiBzZXJ2ZXIgaXMgdXAgYnV0IGJlZm9yZSBhbnkgY2xpZW50IGNvbm5lY3Rpb25zCi0gICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOworICAgICAgICBwcml2YXRlIFF1ZXVlPFRUcmFuc3BvcnQ+IGNsaWVudFF1ZXVlOworICAgICAgICBwcml2YXRlIFRIYXNoU2V0PFRocmVhZD4gY2xpZW50VGhyZWFkczsKKyAgICAgICAgcHJpdmF0ZSBvYmplY3QgY2xpZW50TG9jazsKKyAgICAgICAgcHJpdmF0ZSBUaHJlYWQgd29ya2VyVGhyZWFkOwogCi0gICAgICB3aGlsZSAoIXN0b3ApCi0gICAgICB7Ci0gICAgICAgIGludCBmYWlsdXJlQ291bnQgPSAwOwotICAgICAgICB0cnkKKyAgICAgICAgcHVibGljIGludCBDbGllbnRUaHJlYWRzQ291bnQKICAgICAgICAgewotICAgICAgICAgIFRUcmFuc3BvcnQgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpOwotICAgICAgICAgIGxvY2sgKGNsaWVudExvY2spCi0gICAgICAgICAgewotICAgICAgICAgICAgY2xpZW50UXVldWUuRW5xdWV1ZShjbGllbnQpOwotICAgICAgICAgICAgTW9uaXRvci5QdWxzZShjbGllbnRMb2NrKTsKLSAgICAgICAgICB9CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gY2xpZW50VGhyZWFkcy5Db3VudDsgfQogICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghc3RvcCB8fCB0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCi0gICAgICAgICAgewotICAgICAgICAgICAgKytmYWlsdXJlQ291bnQ7Ci0gICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKICAgICAgICAgfQotICAgICAgfQogCi0gICAgICBpZiAoc3RvcCkKLSAgICAgIHsKLSAgICAgICAgdHJ5CisgICAgICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgbG9nRGVsZWdhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKICAgICAgICAgfQotICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisKKworICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKICAgICAgICAgewotICAgICAgICAgIGxvZ0RlbGVnYXRlKCJUU2VydmVUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiICsgdHR4Lk1lc3NhZ2UpOwogICAgICAgICB9Ci0gICAgICAgIHN0b3AgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIExvb3BzIG9uIHByb2Nlc3NpbmcgYSBjbGllbnQgZm9yZXZlcgotICAgIC8vLyB0aHJlYWRDb250ZXh0IHdpbGwgYmUgYSBUVHJhbnNwb3J0IGluc3RhbmNlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InRocmVhZENvbnRleHQiPjwvcGFyYW0+Ci0gICAgcHJpdmF0ZSB2b2lkIEV4ZWN1dGUoKQotICAgIHsKLSAgICAgIHdoaWxlICghc3RvcCkKLSAgICAgIHsKLSAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQ7Ci0gICAgICAgIFRocmVhZCB0OwotICAgICAgICBsb2NrIChjbGllbnRMb2NrKQorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICAvL2Rvbid0IGRlcXVldWUgaWYgdG9vIG1hbnkgY29ubmVjdGlvbnMKLSAgICAgICAgICB3aGlsZSAoY2xpZW50VGhyZWFkcy5Db3VudCA+PSBtYXhUaHJlYWRzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1vbml0b3IuV2FpdChjbGllbnRMb2NrKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICB3aGlsZSAoY2xpZW50UXVldWUuQ291bnQgPT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNb25pdG9yLldhaXQoY2xpZW50TG9jayk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY2xpZW50ID0gY2xpZW50UXVldWUuRGVxdWV1ZSgpOwotICAgICAgICAgIHQgPSBuZXcgVGhyZWFkKG5ldyBQYXJhbWV0ZXJpemVkVGhyZWFkU3RhcnQoQ2xpZW50V29ya2VyKSk7Ci0gICAgICAgICAgY2xpZW50VGhyZWFkcy5BZGQodCk7CiAgICAgICAgIH0KLSAgICAgICAgLy9zdGFydCBwcm9jZXNzaW5nIHJlcXVlc3RzIGZyb20gY2xpZW50IG9uIG5ldyB0aHJlYWQKLSAgICAgICAgdC5TdGFydChjbGllbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBDbGllbnRXb3JrZXIoT2JqZWN0IGNvbnRleHQpCi0gICAgewotICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSAoVFRyYW5zcG9ydCljb250ZXh0OwotICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7Ci0gICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7Ci0gICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7Ci0gICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOwotICAgICAgT2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICB1c2luZyAoaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkpCisgICAgICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBtYXhUaHJlYWRzLCBMb2dEZWxlZ2F0ZSBsb2dEZWwpCisgICAgICAgICAgOiBiYXNlKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dEZWwpCiAgICAgICAgIHsKLSAgICAgICAgICB1c2luZyAob3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHRoaXMubWF4VGhyZWFkcyA9IG1heFRocmVhZHM7CisgICAgICAgICAgICBjbGllbnRRdWV1ZSA9IG5ldyBRdWV1ZTxUVHJhbnNwb3J0PigpOworICAgICAgICAgICAgY2xpZW50TG9jayA9IG5ldyBvYmplY3QoKTsKKyAgICAgICAgICAgIGNsaWVudFRocmVhZHMgPSBuZXcgVEhhc2hTZXQ8VGhyZWFkPigpOworICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlIG5ldyBUaHJlYWQgZm9yIGVhY2ggbmV3IGNsaWVudCBjb25uZWN0aW9uLiBibG9jayB1bnRpbCBudW1Db25uZWN0aW9ucyAmbHQ7IG1heFRocmVhZHMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9zdGFydCB3b3JrZXIgdGhyZWFkCisgICAgICAgICAgICAgICAgd29ya2VyVGhyZWFkID0gbmV3IFRocmVhZChuZXcgVGhyZWFkU3RhcnQoRXhlY3V0ZSkpOworICAgICAgICAgICAgICAgIHdvcmtlclRocmVhZC5TdGFydCgpOworICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3IsIGNvdWxkIG5vdCBsaXN0ZW4gb24gU2VydmVyVHJhbnNwb3J0OiAiICsgdHR4KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucwogICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKIAotICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKICAgICAgICAgICAgIHdoaWxlICghc3RvcCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCFpbnB1dFRyYW5zcG9ydC5QZWVrKCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jayAoY2xpZW50TG9jaykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UXVldWUuRW5xdWV1ZShjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgTW9uaXRvci5QdWxzZShjbGllbnRMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2ZhaWx1cmVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgIC8vRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKLSAgICAgICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KLSAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0Ci0gICAgICAgICAgICAgIC8vYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCi0gICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQotICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiVFNlcnZlVHJhbnNwb3J0IGZhaWxlZCBvbiBjbG9zZTogIiArIHR0eC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RvcCA9IGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgLy9Vc3VhbGx5IGEgY2xpZW50IGRpc2Nvbm5lY3QsIGV4cGVjdGVkCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCi0gICAgICB7Ci0gICAgICAgIC8vVW5leHBlY3RlZAotICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKLSAgICAgIH0KIAotICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cwotICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMb29wcyBvbiBwcm9jZXNzaW5nIGEgY2xpZW50IGZvcmV2ZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEV4ZWN1dGUoKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQ7CisgICAgICAgICAgICAgICAgVGhyZWFkIHQ7CisgICAgICAgICAgICAgICAgbG9jayAoY2xpZW50TG9jaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgZGVxdWV1ZSBpZiB0b28gbWFueSBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2xpZW50VGhyZWFkcy5Db3VudCA+PSBtYXhUaHJlYWRzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLldhaXQoY2xpZW50TG9jayk7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgbG9jayAoY2xpZW50TG9jaykKLSAgICAgIHsKLSAgICAgICAgY2xpZW50VGhyZWFkcy5SZW1vdmUoVGhyZWFkLkN1cnJlbnRUaHJlYWQpOwotICAgICAgICBNb25pdG9yLlB1bHNlKGNsaWVudExvY2spOwotICAgICAgfQotICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2xpZW50UXVldWUuQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTW9uaXRvci5XYWl0KGNsaWVudExvY2spOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gY2xpZW50UXVldWUuRGVxdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IFRocmVhZChuZXcgUGFyYW1ldGVyaXplZFRocmVhZFN0YXJ0KENsaWVudFdvcmtlcikpOworICAgICAgICAgICAgICAgICAgICBjbGllbnRUaHJlYWRzLkFkZCh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9zdGFydCBwcm9jZXNzaW5nIHJlcXVlc3RzIGZyb20gY2xpZW50IG9uIG5ldyB0aHJlYWQKKyAgICAgICAgICAgICAgICB0LlN0YXJ0KGNsaWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgQ2xpZW50V29ya2VyKG9iamVjdCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoVFRyYW5zcG9ydCBjbGllbnQgPSAoVFRyYW5zcG9ydCljb250ZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gcHJvY2Vzc29yRmFjdG9yeS5HZXRQcm9jZXNzb3IoY2xpZW50KTsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWNvdmVyIGV2ZW50IGhhbmRsZXIgKGlmIGFueSkgYW5kIGZpcmUgY3JlYXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgd2hlbiBhIGNsaWVudCBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL04uQi4gVGhpcyBpcyB0aGUgcGF0dGVybiBpbXBsZW1lbnRlZCBpbiBDKysgYW5kIHRoZSBldmVudCBmaXJlcyBwcm92aXNpb25hbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3QgKGJsb2NrcyB1bnRpbCB0cmFuc3BvcnQgaXMgcmVhZGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1VzdWFsbHkgYSBjbGllbnQgZGlzY29ubmVjdCwgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5leHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yOiAiICsgeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisKKyAgICAgICAgICAgICAgICAgICAgbG9jayAoY2xpZW50TG9jaykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VGhyZWFkcy5SZW1vdmUoVGhyZWFkLkN1cnJlbnRUaHJlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgTW9uaXRvci5QdWxzZShjbGllbnRMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vQ2xvc2UgdHJhbnNwb3J0cworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydC5DbG9zZSgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRpc3Bvc2FibGUgc3R1ZmYgc2hvdWxkIGJlIGRpc3Bvc2VkCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFByb3RvY29sICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFByb3RvY29sICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3AgPSB0cnVlOworICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAvL2NsZWFuIHVwIGFsbCB0aGUgdGhyZWFkcyBteXNlbGYKKyAgICAgICAgICAgIHdvcmtlclRocmVhZC5BYm9ydCgpOworICAgICAgICAgICAgZm9yZWFjaCAoVGhyZWFkIHQgaW4gY2xpZW50VGhyZWFkcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0LkFib3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKLSAgICB7Ci0gICAgICBzdG9wID0gdHJ1ZTsKLSAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotICAgICAgLy9jbGVhbiB1cCBhbGwgdGhlIHRocmVhZHMgbXlzZWxmCi0gICAgICB3b3JrZXJUaHJlYWQuQWJvcnQoKTsKLSAgICAgIGZvcmVhY2ggKFRocmVhZCB0IGluIGNsaWVudFRocmVhZHMpCi0gICAgICB7Ci0gICAgICAgIHQuQWJvcnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyBiL2xpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwppbmRleCA0YzBkM2EzLi44ZGQ3YWU1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCkBAIC00MCw3ICs0MCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSwgc3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBudWxsKSAvLyBUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgc2VyaWFsaXphYmxlLCBidXQgd2UgbmV2ZXIgc2VyaWFsaXplIElubmVyRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgICAgIH0KQEAgLTEwMyw3ICsxMDMsNyBAQAogCiAgICAgICAgICAgICBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsKIAotICAgICAgICAgICAgaWYgKCFTdHJpbmcuSXNOdWxsT3JFbXB0eShNZXNzYWdlKSkKKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoTWVzc2FnZSkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZmllbGQuTmFtZSA9ICJtZXNzYWdlIjsKICAgICAgICAgICAgICAgICBmaWVsZC5UeXBlID0gVFR5cGUuU3RyaW5nOwpAQCAtMTM3LDUgKzEzNywxMCBAQAogICAgICAgICAgICAgSW52YWxpZFByb3RvY29sLAogICAgICAgICAgICAgVW5zdXBwb3J0ZWRDbGllbnRUeXBlCiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uVHlwZSBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0eXBlOyB9CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UQXN5bmNQcm9jZXNzb3IuY3MgYi9saWIvY3NoYXJwL3NyYy9UQXN5bmNQcm9jZXNzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI0MzIyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RBc3luY1Byb2Nlc3Nvci5jcwpAQCAtMCwwICsxLDM4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm9jZXNzZXMgYSBtZXNzYWdlIGFzeW5jaHJvbm91c2x5LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBUQXN5bmNQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByb2Nlc3NlcyB0aGUgbmV4dCBwYXJ0IG9mIHRoZSBtZXNzYWdlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imlwcm90Ij5UaGUgaW5wdXQgcHJvdG9jb2wuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvcHJvdCI+VGhlIG91dHB1dCBwcm90b2NvbC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGVyZSdzIG1vcmUgdG8gcHJvY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLjwvcmV0dXJucz4KKyAgICAgICAgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RDb250cm9sbGluZ0hhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UQ29udHJvbGxpbmdIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNTIwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UQ29udHJvbGxpbmdIYW5kbGVyLmNzCkBAIC0wLDAgKzEsMjkgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgVENvbnRyb2xsaW5nSGFuZGxlcgorICAgIHsKKyAgICAgICAgVFNlcnZlciBzZXJ2ZXIgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9URXhjZXB0aW9uLmNzCmluZGV4IDY1NTA5ZWMuLmI5ZmFlNmUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RFeGNlcHRpb24uY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVEV4Y2VwdGlvbi5jcwpAQCAtMzEsOCArMzEsOCBAQAogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgVEV4Y2VwdGlvbiggc3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgcHVibGljIFRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCiAgICAgICAgIHsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjYzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5jcwpAQCAtMCwwICsxLDMwIEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGludGVyZmFjZSBUUHJvY2Vzc29yRmFjdG9yeQorICAgIHsKKyAgICAgICAgVFByb2Nlc3NvciBHZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBzZXJ2ZXIgPSBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1RQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNDcyNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcwpAQCAtMCwwICsxLDU1IEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGNsYXNzIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5PFAsIEg+IDogVFByb2Nlc3NvckZhY3Rvcnkgd2hlcmUgUCA6IFRQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIG9iamVjdFtdIGhhbmRsZXJBcmdzID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkoKQorICAgICAgICB7CisgICAgICAgICAgICBoYW5kbGVyQXJncyA9IG5ldyBvYmplY3RbMF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkocGFyYW1zIG9iamVjdFtdIGhhbmRsZXJBcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmhhbmRsZXJBcmdzID0gaGFuZGxlckFyZ3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb2Nlc3NvciBHZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBzZXJ2ZXIgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBIIGhhbmRsZXIgPSAoSClBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2UodHlwZW9mKEgpLCBoYW5kbGVyQXJncyk7CisKKyAgICAgICAgICAgIFRDb250cm9sbGluZ0hhbmRsZXIgaGFuZGxlclNlcnZlclJlZiA9IGhhbmRsZXIgYXMgVENvbnRyb2xsaW5nSGFuZGxlcjsKKyAgICAgICAgICAgIGlmIChoYW5kbGVyU2VydmVyUmVmICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlclNlcnZlclJlZi5zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHR5cGVvZihQKSwgbmV3IG9iamVjdFtdIHsgaGFuZGxlciB9KSBhcyBUUHJvY2Vzc29yOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDI4OTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSw0MyBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBjbGFzcyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSA6IFRQcm9jZXNzb3JGYWN0b3J5CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm9jZXNzb3IgcHJvY2Vzc29yXzsKKworICAgICAgICBwdWJsaWMgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkoVFByb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb2Nlc3Nvcl8gPSBwcm9jZXNzb3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb2Nlc3NvciBHZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBzZXJ2ZXIgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc29yXzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC40NS5jc3Byb2ogYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuNDUuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMjhiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuNDUuY3Nwcm9qCkBAIC0wLDAgKzEsMTI5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvamVjdEd1aWQ+e0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPlRocmlmdDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdDQ1PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5wb3J0YWJsZTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0RFQlVHO05FVDQ1PC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO05FVDQ1PC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYiIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkNTaGFycCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcVENvbGxlY3Rpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRIYXNoU2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRBYnN0cmFjdEJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCaW5hcnlQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQ29tcGFjdFByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRGaWVsZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUSlNPTlByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRMaXN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNYXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1lc3NhZ2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1lc3NhZ2VUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRGVjb3JhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbEV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbFV0aWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUU3RydWN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyRXZlbnRIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2ltcGxlU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXN5bmNQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVENvbnRyb2xsaW5nSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJURXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBDbGllbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2VydmVyVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2lsdmVybGlnaHRTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXRWZXJzaW9uaXplci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFN0cmVhbVRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NlcnZlclNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxGb2xkZXIgSW5jbHVkZT0iU2VydmVyXENvbGxlY3Rpb25zXCIgLz4KKyAgICA8Rm9sZGVyIEluY2x1ZGU9IlNlcnZlclxQcm90b2NvbFwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5XUDcuY3Nwcm9qIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LldQNy5jc3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNDk0MmYuLjAwMDAwMDAKLS0tIGEvbGliL2NzaGFycC9zcmMvVGhyaWZ0LldQNy5jc3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gIDxQcm9wZXJ0eUdyb3VwPgotICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgotICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KLSAgICA8UHJvZHVjdFZlcnNpb24+MTAuMC4yMDUwNjwvUHJvZHVjdFZlcnNpb24+Ci0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgotICAgIDxQcm9qZWN0R3VpZD57REY1OEJEQjAtMjQ1Ny00QTUyLTk5ODEtNjVBMEU4QjUwODMzfTwvUHJvamVjdEd1aWQ+Ci0gICAgPFByb2plY3RUeXBlR3VpZHM+e0MwODlDOEMwLTMwRTAtNEUyMi04MEMwLUNFMDkzRjExMUE0M307e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+Ci0gICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KLSAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+Ci0gICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0LldQNzwvUm9vdE5hbWVzcGFjZT4KLSAgICA8QXNzZW1ibHlOYW1lPlRocmlmdC5XUDc8L0Fzc2VtYmx5TmFtZT4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgotICAgIDxTaWx2ZXJsaWdodFZlcnNpb24+JChUYXJnZXRGcmFtZXdvcmtWZXJzaW9uKTwvU2lsdmVybGlnaHRWZXJzaW9uPgotICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPldpbmRvd3NQaG9uZTcxPC9UYXJnZXRGcmFtZXdvcmtQcm9maWxlPgotICAgIDxUYXJnZXRGcmFtZXdvcmtJZGVudGlmaWVyPlNpbHZlcmxpZ2h0PC9UYXJnZXRGcmFtZXdvcmtJZGVudGlmaWVyPgotICAgIDxTaWx2ZXJsaWdodEFwcGxpY2F0aW9uPmZhbHNlPC9TaWx2ZXJsaWdodEFwcGxpY2F0aW9uPgotICAgIDxWYWxpZGF0ZVhhbWw+dHJ1ZTwvVmFsaWRhdGVYYW1sPgotICAgIDxUaHJvd0Vycm9yc0luVmFsaWRhdGlvbj50cnVlPC9UaHJvd0Vycm9yc0luVmFsaWRhdGlvbj4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KLSAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPkJpblxEZWJ1ZzwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFO1NJTFZFUkxJR0hUO1dJTkRPV1NfUEhPTkU8L0RlZmluZUNvbnN0YW50cz4KLSAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+Ci0gICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+Ci0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+Ci0gICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPkJpblxSZWxlYXNlPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7U0lMVkVSTElHSFQ7V0lORE9XU19QSE9ORTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4KLSAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5QaG9uZSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5QaG9uZS5JbnRlcm9wIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbiIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZXJ2aWNlbW9kZWwuV2ViIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldpbmRvd3MiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJzeXN0ZW0iIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0IiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUQ29sbGVjdGlvbnMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcVEhhc2hTZXQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uV1A3LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRBYnN0cmFjdEJhc2UuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2UuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCaW5hcnlQcm90b2NvbC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxURmllbGQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTGlzdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWFwLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlVHlwZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbERlY29yYXRvci5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xFeGNlcHRpb24uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRmFjdG9yeS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xVdGlsLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTZXQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFN0cnVjdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUVHlwZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJURXhjZXB0aW9uLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvY2Vzc29yLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxURnJhbWVkVHJhbnNwb3J0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cENsaWVudC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNpbHZlcmxpZ2h0U29ja2V0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU3RyZWFtVHJhbnNwb3J0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RmFjdG9yeS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXE1pY3Jvc29mdFxTaWx2ZXJsaWdodCBmb3IgUGhvbmVcJChUYXJnZXRGcmFtZXdvcmtWZXJzaW9uKVxNaWNyb3NvZnQuU2lsdmVybGlnaHQuJChUYXJnZXRGcmFtZXdvcmtQcm9maWxlKS5PdmVycmlkZXMudGFyZ2V0cyIgLz4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0IGZvciBQaG9uZVwkKFRhcmdldEZyYW1ld29ya1ZlcnNpb24pXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5DU2hhcnAudGFyZ2V0cyIgLz4KLSAgPFByb2plY3RFeHRlbnNpb25zIC8+Ci0gIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCi0gICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgotICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICAtLT4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvagppbmRleCAxOTUwMDVhLi4wYTE1NTJmIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKQEAgLTQ1LDI2ICs0NSwyNyBAQAogICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CiAgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgogICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+Ci0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjAuMTMuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CiAgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KICAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KICAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgogICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxEZWJ1Z1R5cGU+cG9ydGFibGU8L0RlYnVnVHlwZT4KICAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgogICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7REVCVUc8L0RlZmluZUNvbnN0YW50cz4KICAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KICAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KICAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+Ci0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPERlYnVnVHlwZT5wb3J0YWJsZTwvRGVidWdUeXBlPgogICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KICAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxEZWZpbmVDb25zdGFudHM+CisgICAgPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CiAgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CiAgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KQEAgLTc5LDYgKzgwLDcgQEAKICAgPEl0ZW1Hcm91cD4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUQ29sbGVjdGlvbnMuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcVEhhc2hTZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iTmV0MzVcRXh0ZW5zaW9uc05ldDM1LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRBYnN0cmFjdEJhc2UuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2UuY3MiIC8+CkBAIC0xMDEsMzAgKzEwMywzNSBAQAogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTZXQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFN0cnVjdC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUVHlwZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyRXZlbnRIYW5kbGVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2ltcGxlU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRFeGNlcHRpb24uY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRDb250cm9sbGluZ0hhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVEV4Y2VwdGlvbi5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvY2Vzc29yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRGcmFtZWRUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwQ2xpZW50LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTZXJ2ZXJTb2NrZXQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTZXJ2ZXJUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXRWZXJzaW9uaXplci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFN0cmVhbVRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NlcnZlclNvY2tldC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NvY2tldC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEZhY3RvcnkuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CkBAIC0xNDcsNCArMTU0LDQgQEAKICAgPFByb2plY3RFeHRlbnNpb25zPgogICAgIDxWaXN1YWxTdHVkaW8gQWxsb3dFeGlzdGluZ0ZvbGRlcj0idHJ1ZSIgLz4KICAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KLTwvUHJvamVjdD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgppbmRleCBkZDg0MzdkLi5hMjllNDY4IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4KQEAgLTQsMzUgKzQsNDQgQEAKIFByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0IiwgIlRocmlmdC5jc3Byb2oiLCAiezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0iCiBFbmRQcm9qZWN0CiBQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdFRlc3QiLCAiLi5cdGVzdFxUaHJpZnRUZXN0XFRocmlmdFRlc3QuY3Nwcm9qIiwgIns0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9IgotICAgIFByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKLSAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0gPSB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfQotICAgIEVuZFByb2plY3RTZWN0aW9uCiBFbmRQcm9qZWN0CiBQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdE1TQnVpbGRUYXNrIiwgIi4uXFRocmlmdE1TQnVpbGRUYXNrXFRocmlmdE1TQnVpbGRUYXNrLmNzcHJvaiIsICJ7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfSIKIEVuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0LjQ1IiwgIlRocmlmdC40NS5jc3Byb2oiLCAie0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdE1WQ1Rlc3QiLCAiLi5cdGVzdFxUaHJpZnRNVkNUZXN0XFRocmlmdE1WQ1Rlc3QuY3Nwcm9qIiwgIns4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9IgorRW5kUHJvamVjdAogR2xvYmFsCi0gICAgR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KLSAgICAgICAgRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKLSAgICAgICAgUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCi0gICAgRW5kR2xvYmFsU2VjdGlvbgotICAgIEdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCi0gICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQotICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCi0gICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKLSAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKLSAgICAgICAgezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCi0gICAgICAgIHs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKLSAgICAgICAgezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQotICAgICAgICB7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQotICAgICAgICB7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKLSAgICAgICAge0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQotICAgICAgICB7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCi0gICAgICAgIHtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCi0gICAgRW5kR2xvYmFsU2VjdGlvbgotICAgIEdsb2JhbFNlY3Rpb24oTW9ub0RldmVsb3BQcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCi0gICAgICAgIFN0YXJ0dXBJdGVtID0gVGhyaWZ0LmNzcHJvagotICAgIEVuZEdsb2JhbFNlY3Rpb24KLSAgICBHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgotICAgICAgICBIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKLSAgICBFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihNb25vRGV2ZWxvcFByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJICAgICAgICBTdGFydHVwSXRlbSA9IFRocmlmdC5jc3Byb2oKKwlFbmRHbG9iYWxTZWN0aW9uCiBFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzCmluZGV4IDg5YjljYTcuLjg4NzA5ODggMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcwpAQCAtMjIsMTA1ICsyMiwxNzMgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLSAgcHVibGljIGNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQsIElEaXNwb3NhYmxlCisgICAgcHVibGljIGNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQsIElEaXNwb3NhYmxlCiAgICAgewotICAgICAgICBwcml2YXRlIEJ1ZmZlcmVkU3RyZWFtIGlucHV0QnVmZmVyOwotICAgICAgICBwcml2YXRlIEJ1ZmZlcmVkU3RyZWFtIG91dHB1dEJ1ZmZlcjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgYnVmU2l6ZTsKLSAgICAgICAgcHJpdmF0ZSBUU3RyZWFtVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgYnVmU2l6ZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gaW5wdXRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDApOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBvdXRwdXRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDApOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRUcmFuc3BvcnQgdHJhbnNwb3J0OwogCi0gICAgICAgIHB1YmxpYyBUQnVmZmVyZWRUcmFuc3BvcnQoVFN0cmVhbVRyYW5zcG9ydCB0cmFuc3BvcnQpCi0gICAgICAgICAgICA6dGhpcyh0cmFuc3BvcnQsIDEwMjQpCisgICAgICAgIHB1YmxpYyBUQnVmZmVyZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGludCBidWZTaXplID0gMTAyNCkKICAgICAgICAgewotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVEJ1ZmZlcmVkVHJhbnNwb3J0KFRTdHJlYW1UcmFuc3BvcnQgdHJhbnNwb3J0LCBpbnQgYnVmU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5idWZTaXplID0gYnVmU2l6ZTsKKyAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIGlmIChidWZTaXplIDw9IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJidWZTaXplIiwgIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIuIik7CiAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKLSAgICAgICAgICAgIEluaXRCdWZmZXJzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgSW5pdEJ1ZmZlcnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodHJhbnNwb3J0LklucHV0U3RyZWFtICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIgPSBuZXcgQnVmZmVyZWRTdHJlYW0odHJhbnNwb3J0LklucHV0U3RyZWFtLCBidWZTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0cmFuc3BvcnQuT3V0cHV0U3RyZWFtICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyID0gbmV3IEJ1ZmZlcmVkU3RyZWFtKHRyYW5zcG9ydC5PdXRwdXRTdHJlYW0sIGJ1ZlNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIENsb3NlQnVmZmVycygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlciAhPSBudWxsICYmIGlucHV0QnVmZmVyLkNhblJlYWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuQ2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIgIT0gbnVsbCAmJiBvdXRwdXRCdWZmZXIuQ2FuV3JpdGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLkNsb3NlKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmJ1ZlNpemUgPSBidWZTaXplOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgVW5kZXJseWluZ1RyYW5zcG9ydAogICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJhbnNwb3J0OyB9CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgogICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJhbnNwb3J0LklzT3BlbjsgfQorICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGxlZ2l0aW1hdGVseSB0aHJvdyBoZXJlIGJ1dCBiZSBuaWNlIGEgYml0LgorICAgICAgICAgICAgICAgIC8vIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gIV9Jc0Rpc3Bvc2VkICYmIHRyYW5zcG9ydC5Jc09wZW47CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKICAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOwogICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW4oKTsKLSAgICAgICAgICAgIEluaXRCdWZmZXJzKCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIENsb3NlQnVmZmVycygpOworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOwogICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGlucHV0QnVmZmVyLlJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisKKyAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlci5DYXBhY2l0eSA8IGJ1ZlNpemUpCisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuQ2FwYWNpdHkgPSBidWZTaXplOworCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZ290ID0gaW5wdXRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoZ290ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKworICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuU2V0TGVuZ3RoKGlucHV0QnVmZmVyLkNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICBpbnQgZmlsbGVkID0gdHJhbnNwb3J0LlJlYWQoaW5wdXRCdWZmZXIuR2V0QnVmZmVyKCksIDAsIChpbnQpaW5wdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5TZXRMZW5ndGgoZmlsbGVkKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsbGVkID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0QnVmZmVyLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgLy8gUmVsYXRpdmUgb2Zmc2V0IGZyb20gIm9mZiIgYXJndW1lbnQKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlci5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjYXBhID0gKGludCkob3V0cHV0QnVmZmVyLkNhcGFjaXR5IC0gb3V0cHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaW50IHdyaXRlU2l6ZSA9IGNhcGEgPD0gbGVuID8gY2FwYSA6IGxlbjsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuV3JpdGUoYnVmLCBvZmYsIHdyaXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHdyaXRlU2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAod3JpdGVTaXplID09IGNhcGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuV3JpdGUob3V0cHV0QnVmZmVyLkdldEJ1ZmZlcigpLCAwLCAoaW50KW91dHB1dEJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuU2V0TGVuZ3RoKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChsZW4gLSBvZmZzZXQgPj0gYnVmU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQuV3JpdGUoYnVmLCBvZmYgKyBvZmZzZXQsIGJ1ZlNpemUpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBidWZTaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHJlbWFpbiA9IGxlbiAtIG9mZnNldDsKKyAgICAgICAgICAgIGlmIChyZW1haW4gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIuQ2FwYWNpdHkgPCBidWZTaXplKQorICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuQ2FwYWNpdHkgPSBidWZTaXplOworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5Xcml0ZShidWYsIG9mZiArIG9mZnNldCwgcmVtYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBJbnRlcm5hbEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlci5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5Xcml0ZShvdXRwdXRCdWZmZXIuR2V0QnVmZmVyKCksIDAsIChpbnQpb3V0cHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLlNldExlbmd0aCgwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0QnVmZmVyLkZsdXNoKCk7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBJbnRlcm5hbEZsdXNoKCk7CisKKyAgICAgICAgICAgIHRyYW5zcG9ydC5GbHVzaCgpOwogICAgICAgICB9CiAKLSAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCi0gICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOwotCi0gICAgLy8gSURpc3Bvc2FibGUKLSAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQotICAgIHsKLSAgICAgIGlmICghX0lzRGlzcG9zZWQpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJQXN5bmNSZXN1bHQgQmVnaW5GbHVzaChBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICBpZiAoaW5wdXRCdWZmZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGlucHV0QnVmZmVyLkRpc3Bvc2UoKTsKLSAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyICE9IG51bGwpCi0gICAgICAgICAgICBvdXRwdXRCdWZmZXIuRGlzcG9zZSgpOworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgSW50ZXJuYWxGbHVzaCgpOworCisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LkJlZ2luRmx1c2goIGNhbGxiYWNrLCBzdGF0ZSk7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbmRGbHVzaChJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5FbmRGbHVzaCggYXN5bmNSZXN1bHQpOworICAgICAgICB9CisKKworCisgICAgICAgIHByb3RlY3RlZCB2b2lkIENoZWNrTm90RGlzcG9zZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX0lzRGlzcG9zZWQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJUQnVmZmVyZWRUcmFuc3BvcnQiKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJvdGVjdGVkIGJvb2wgX0lzRGlzcG9zZWQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KICAgICB9Ci0gICAgI2VuZHJlZ2lvbgotICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzCmluZGV4IDhhZjIyN2YuLmE3NDZhMzIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzCkBAIC0yMSwxNCArMjEsMTQgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLSAgcHVibGljIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBJRGlzcG9zYWJsZQorICAgIHB1YmxpYyBjbGFzcyBURnJhbWVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgSURpc3Bvc2FibGUKICAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG51bGw7Ci0gICAgICAgIHByb3RlY3RlZCBNZW1vcnlTdHJlYW0gd3JpdGVCdWZmZXI7Ci0gICAgICAgIHByb3RlY3RlZCBNZW1vcnlTdHJlYW0gcmVhZEJ1ZmZlciA9IG51bGw7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIHdyaXRlQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gcmVhZEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMTAyNCk7CiAKLSAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgaGVhZGVyX3NpemUgPSA0OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gaGVhZGVyX2R1bW15ID0gbmV3IGJ5dGVbaGVhZGVyX3NpemVdOyAvLyB1c2VkIGFzIGhlYWRlciBwbGFjZWhvbGRlciB3aGlsZSBpbml0aWxpemluZyBuZXcgd3JpdGUgYnVmZmVyCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEhlYWRlclNpemUgPSA0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBoZWFkZXJCdWYgPSBuZXcgYnl0ZVtIZWFkZXJTaXplXTsKIAogICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5CiAgICAgICAgIHsKQEAgLTM4LDE4ICszOCwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHJvdGVjdGVkIFRGcmFtZWRUcmFuc3BvcnQoKQorICAgICAgICBwdWJsaWMgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkKICAgICAgICAgewotICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgOiB0aGlzKCkKLSAgICAgICAgeworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInRyYW5zcG9ydCIpOwogICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgICAgICAgICBJbml0V3JpdGVCdWZmZXIoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQogICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CiAgICAgICAgICAgICB0cmFuc3BvcnQuT3BlbigpOwogICAgICAgICB9CiAKQEAgLTU3LDI0ICs1NiwyOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBnZXQKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LklzT3BlbjsKKyAgICAgICAgICAgICAgICAvLyBXZSBjYW4gbGVnaXRpbWF0ZWx5IHRocm93IGhlcmUgYnV0IGJlIG5pY2UgYSBiaXQuCisgICAgICAgICAgICAgICAgLy8gQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiAhX0lzRGlzcG9zZWQgJiYgdHJhbnNwb3J0LklzT3BlbjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKICAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOwogICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlYWRCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIGludCBnb3QgPSByZWFkQnVmZmVyLlJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoZ290ID4gMCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgZ290ID0gcmVhZEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotICAgICAgICAgICAgICAgIGlmIChnb3QgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKQEAgLTg1LDQ5ICs4OCw3NSBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkRnJhbWUoKQogICAgICAgICB7Ci0gICAgICAgICAgICBieXRlW10gaTMycmQgPSBuZXcgYnl0ZVtoZWFkZXJfc2l6ZV07Ci0gICAgICAgICAgICB0cmFuc3BvcnQuUmVhZEFsbChpMzJyZCwgMCwgaGVhZGVyX3NpemUpOwotICAgICAgICAgICAgaW50IHNpemUgPSBEZWNvZGVGcmFtZVNpemUoaTMycmQpOworICAgICAgICAgICAgdHJhbnNwb3J0LlJlYWRBbGwoaGVhZGVyQnVmLCAwLCBIZWFkZXJTaXplKTsKKyAgICAgICAgICAgIGludCBzaXplID0gRGVjb2RlRnJhbWVTaXplKGhlYWRlckJ1Zik7CiAKLSAgICAgICAgICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICByZWFkQnVmZmVyLlNldExlbmd0aChzaXplKTsKKyAgICAgICAgICAgIHJlYWRCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmID0gcmVhZEJ1ZmZlci5HZXRCdWZmZXIoKTsKICAgICAgICAgICAgIHRyYW5zcG9ydC5SZWFkQWxsKGJ1ZmYsIDAsIHNpemUpOwotICAgICAgICAgICAgcmVhZEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oYnVmZik7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQogICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICBpZiAod3JpdGVCdWZmZXIuTGVuZ3RoICsgKGxvbmcpbGVuID4gKGxvbmcpaW50Lk1heFZhbHVlKQorICAgICAgICAgICAgICAgIEZsdXNoKCk7CiAgICAgICAgICAgICB3cml0ZUJ1ZmZlci5Xcml0ZShidWYsIG9mZiwgbGVuKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEludGVybmFsRmx1c2goKQogICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CiAgICAgICAgICAgICBieXRlW10gYnVmID0gd3JpdGVCdWZmZXIuR2V0QnVmZmVyKCk7CiAgICAgICAgICAgICBpbnQgbGVuID0gKGludCl3cml0ZUJ1ZmZlci5MZW5ndGg7Ci0gICAgICAgICAgICBpbnQgZGF0YV9sZW4gPSBsZW4gLSBoZWFkZXJfc2l6ZTsKLSAgICAgICAgICAgIGlmICggZGF0YV9sZW4gPCAwICkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24gKCk7IC8vIGxvZ2ljIGVycm9yIGFjdHVhbGx5Ci0KLSAgICAgICAgICAgIEluaXRXcml0ZUJ1ZmZlcigpOworICAgICAgICAgICAgaW50IGRhdGFfbGVuID0gbGVuIC0gSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgIGlmIChkYXRhX2xlbiA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IC8vIGxvZ2ljIGVycm9yIGFjdHVhbGx5CiAKICAgICAgICAgICAgIC8vIEluamVjdCBtZXNzYWdlIGhlYWRlciBpbnRvIHRoZSByZXNlcnZlZCBidWZmZXIgc3BhY2UKLSAgICAgICAgICAgIEVuY29kZUZyYW1lU2l6ZShkYXRhX2xlbixyZWYgYnVmKTsKKyAgICAgICAgICAgIEVuY29kZUZyYW1lU2l6ZShkYXRhX2xlbiwgYnVmKTsKIAogICAgICAgICAgICAgLy8gU2VuZCB0aGUgZW50aXJlIG1lc3NhZ2UgYXQgb25jZQogICAgICAgICAgICAgdHJhbnNwb3J0LldyaXRlKGJ1ZiwgMCwgbGVuKTsKIAorICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIEludGVybmFsRmx1c2goKTsKKwogICAgICAgICAgICAgdHJhbnNwb3J0LkZsdXNoKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFdyaXRlQnVmZmVyICgpCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJQXN5bmNSZXN1bHQgQmVnaW5GbHVzaChBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgYnVmZmVyIGluc3RhbmNlCi0gICAgICAgICAgICB3cml0ZUJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMTAyNCk7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBJbnRlcm5hbEZsdXNoKCk7CiAKLSAgICAgICAgICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIG1lc3NhZ2UgaGVhZGVyIHRvIGJlIHB1dCByaWdodCBiZWZvcmUgc2VuZGluZyBpdCBvdXQKLSAgICAgICAgICAgIHdyaXRlQnVmZmVyLldyaXRlICggaGVhZGVyX2R1bW15LCAwLCBoZWFkZXJfc2l6ZSApOworICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5CZWdpbkZsdXNoKCBjYWxsYmFjaywgc3RhdGUpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBFbmNvZGVGcmFtZVNpemUoaW50IGZyYW1lU2l6ZSwgcmVmIGJ5dGVbXSBidWYpCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuZEZsdXNoKElBc3luY1Jlc3VsdCBhc3luY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LkVuZEZsdXNoKCBhc3luY1Jlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFdyaXRlQnVmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgbWVzc2FnZSBoZWFkZXIgdG8gYmUgcHV0IHJpZ2h0IGJlZm9yZSBzZW5kaW5nIGl0IG91dAorICAgICAgICAgICAgd3JpdGVCdWZmZXIuU2V0TGVuZ3RoKEhlYWRlclNpemUpOworICAgICAgICAgICAgd3JpdGVCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkVuZCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEVuY29kZUZyYW1lU2l6ZShpbnQgZnJhbWVTaXplLCBieXRlW10gYnVmKQogICAgICAgICB7CiAgICAgICAgICAgICBidWZbMF0gPSAoYnl0ZSkoMHhmZiAmIChmcmFtZVNpemUgPj4gMjQpKTsKICAgICAgICAgICAgIGJ1ZlsxXSA9IChieXRlKSgweGZmICYgKGZyYW1lU2l6ZSA+PiAxNikpOwpAQCAtMTQwLDExICsxNjksMTcgQEAKICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICgoYnVmWzBdICYgMHhmZikgPDwgMjQpIHwKICAgICAgICAgICAgICAgICAoKGJ1ZlsxXSAmIDB4ZmYpIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAgKChidWZbMl0gJiAweGZmKSA8PCAgOCkgfAorICAgICAgICAgICAgICAgICgoYnVmWzJdICYgMHhmZikgPDwgOCkgfAogICAgICAgICAgICAgICAgICgoYnVmWzNdICYgMHhmZikpOwogICAgICAgICB9CiAKIAorICAgICAgICBwcml2YXRlIHZvaWQgQ2hlY2tOb3REaXNwb3NlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIlRGcmFtZWRUcmFuc3BvcnQiKTsKKyAgICAgICAgfQorCiAgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKICAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOwogCkBAIC0xNTcsNiArMTkyLDEwIEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEJ1ZmZlciAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZUJ1ZmZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVCdWZmZXIuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuRGlzcG9zZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cENsaWVudC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cENsaWVudC5jcwppbmRleCBhNTZhM2U4Li42NjdmYzI1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNzCkBAIC0yNiwxMCArMjYsMTAgQEAKIHVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7CiB1c2luZyBTeXN0ZW0uTGlucTsKIHVzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5JTy5Db21wcmVzc2lvbjsKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQogICAgIHB1YmxpYyBjbGFzcyBUSHR0cENsaWVudCA6IFRUcmFuc3BvcnQsIElEaXNwb3NhYmxlCiAgICAgewogICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFVyaSB1cmk7CkBAIC00Miw3ICs0Miw3IEBACiAKICAgICAgICAgcHJpdmF0ZSBpbnQgcmVhZFRpbWVvdXQgPSAzMDAwMDsKIAotICAgICAgICBwcml2YXRlIElEaWN0aW9uYXJ5PFN0cmluZywgU3RyaW5nPiBjdXN0b21IZWFkZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CisgICAgICAgIHByaXZhdGUgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IGN1c3RvbUhlYWRlcnMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTsKIAogI2lmICFTSUxWRVJMSUdIVAogICAgICAgICBwcml2YXRlIElXZWJQcm94eSBwcm94eSA9IFdlYlJlcXVlc3QuRGVmYXVsdFdlYlByb3h5OwpAQCAtNjMsNyArNjMsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBzZXQKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNvbm5lY3RUaW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgY29ubmVjdFRpbWVvdXQgPSB2YWx1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC03NSw3ICs3NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8U3RyaW5nLCBTdHJpbmc+IEN1c3RvbUhlYWRlcnMKKyAgICAgICAgcHVibGljIElEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBDdXN0b21IZWFkZXJzCiAgICAgICAgIHsKICAgICAgICAgICAgIGdldAogICAgICAgICAgICAgewpAQCAtMTM5LDcgKzEzOSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpLCBpb3gpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE2Niw2ICsxNjYsNyBAQAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgSHR0cFdlYlJlcXVlc3QgY29ubmVjdGlvbiA9IENyZWF0ZVJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLkhlYWRlcnMuQWRkKCJBY2NlcHQtRW5jb2RpbmciLCAiZ3ppcCwgZGVmbGF0ZSIpOwogCiAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBvdXRwdXRTdHJlYW0uVG9BcnJheSgpOwogICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uQ29udGVudExlbmd0aCA9IGRhdGEuTGVuZ3RoOwpAQCAtMTg0LDI2ICsxODUsNjkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRoZSByZXNwb25zZSB0byBhIG1lbW9yeSBzdHJlYW0gc28gdGhhdCB3ZSBjYW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbmx5IGNsb3NlIHRoZSByZXNwb25zZSBhbmQgcmVzcG9uc2Ugc3RyZWFtLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MDk2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07ICAvLyBtdWx0aXBsZSBvZiA0MDk2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IHJlc3BvbnNlU3RyZWFtLlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKSkgPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uV3JpdGUgKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uV3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5TZWVrKDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jb2RpbmdzID0gcmVzcG9uc2UuSGVhZGVycy5HZXRWYWx1ZXMoIkNvbnRlbnQtRW5jb2RpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZW5jb2RpbmcgaW4gZW5jb2RpbmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZ3ppcCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb21wcmVzc0daaXBwZWQocmVmIGlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImRlZmxhdGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29tcHJlc3NEZWZsYXRlZChyZWYgaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCksIGlveCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoV2ViRXhjZXB0aW9uIHd4KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCAiQ291bGRuJ3QgY29ubmVjdCB0byBzZXJ2ZXI6ICIgKyB3eCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sICJDb3VsZG4ndCBjb25uZWN0IHRvIHNlcnZlcjogIiArIHd4LCB3eCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRGVjb21wcmVzc0RlZmxhdGVkKHJlZiBTdHJlYW0gaW5wdXRTdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0bXAgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB1c2luZyAodmFyIGRlY29tcCA9IG5ldyBEZWZsYXRlU3RyZWFtKGlucHV0U3RyZWFtLCBDb21wcmVzc2lvbk1vZGUuRGVjb21wcmVzcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVjb21wLkNvcHlUbyh0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSB0bXA7CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5TZWVrKDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIERlY29tcHJlc3NHWmlwcGVkKHJlZiBTdHJlYW0gaW5wdXRTdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0bXAgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB1c2luZyAodmFyIGRlY29tcCA9IG5ldyBHWmlwU3RyZWFtKGlucHV0U3RyZWFtLCBDb21wcmVzc2lvbk1vZGUuRGVjb21wcmVzcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVjb21wLkNvcHlUbyh0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSB0bXA7CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5TZWVrKDAsIDApOworICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgcHJpdmF0ZSBIdHRwV2ViUmVxdWVzdCBDcmVhdGVSZXF1ZXN0KCkKICAgICAgICAgewpAQCAtMjcyLDcgKzMxNiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlveC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb3guVG9TdHJpbmcoKSwgaW94KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yODAsNyArMzI0LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGZsdXNoQXN5bmNSZXN1bHQgPSAoRmx1c2hBc3luY1Jlc3VsdCkgYXN5bmNSZXN1bHQ7CisgICAgICAgICAgICAgICAgdmFyIGZsdXNoQXN5bmNSZXN1bHQgPSAoRmx1c2hBc3luY1Jlc3VsdClhc3luY1Jlc3VsdDsKIAogICAgICAgICAgICAgICAgIGlmICghZmx1c2hBc3luY1Jlc3VsdC5Jc0NvbXBsZXRlZCkKICAgICAgICAgICAgICAgICB7CkBAIC0yOTMsNyArMzM3LDggQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb247CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwogICAgICAgICAgICAgfQpAQCAtMzE1LDcgKzM2MCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXhjZXB0aW9uLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb24gPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleGNlcHRpb24uVG9TdHJpbmcoKSwgZXhjZXB0aW9uKTsKICAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LlVwZGF0ZVN0YXR1c1RvQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0Lk5vdGlmeUNhbGxiYWNrV2hlbkF2YWlsYWJsZSgpOwogICAgICAgICAgICAgfQpAQCAtMzMwLDcgKzM3NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXhjZXB0aW9uLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb24gPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleGNlcHRpb24uVG9TdHJpbmcoKSwgZXhjZXB0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuVXBkYXRlU3RhdHVzVG9Db21wbGV0ZSgpOwogICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Ob3RpZnlDYWxsYmFja1doZW5BdmFpbGFibGUoKTsKQEAgLTM0Miw5ICszODcsOSBAQAogICAgICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBCb29sZWFuIF9pc0NvbXBsZXRlZDsKICAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBfZXZ0OwogICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBc3luY0NhbGxiYWNrIF9jYk1ldGhvZDsKLSAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgT2JqZWN0IF9zdGF0ZTsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0IF9zdGF0ZTsKIAotICAgICAgICAgICAgcHVibGljIEZsdXNoQXN5bmNSZXN1bHQoQXN5bmNDYWxsYmFjayBjYk1ldGhvZCwgT2JqZWN0IHN0YXRlKQorICAgICAgICAgICAgcHVibGljIEZsdXNoQXN5bmNSZXN1bHQoQXN5bmNDYWxsYmFjayBjYk1ldGhvZCwgb2JqZWN0IHN0YXRlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIF9jYk1ldGhvZCA9IGNiTWV0aG9kOwogICAgICAgICAgICAgICAgIF9zdGF0ZSA9IHN0YXRlOwpAQCAtMzcwLDcgKzQxNSw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pc0NvbXBsZXRlZDsgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBPYmplY3QgX2xvY2tlciA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0IF9sb2NrZXIgPSBuZXcgb2JqZWN0KCk7CiAgICAgICAgICAgICBwcml2YXRlIE1hbnVhbFJlc2V0RXZlbnQgR2V0RXZ0SGFuZGxlKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBsb2NrIChfbG9ja2VyKQpAQCAtNDA3LDcgKzQ1Miw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCiAgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKIAogICAgICAgICAvLyBJRGlzcG9zYWJsZQpAQCAtNDI1LDYgKzQ3MCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CiAgICAgICAgIH0KLSNlbmRyZWdpb24KKyAgICAgICAgI2VuZHJlZ2lvbgogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OTFmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzCkBAIC0wLDAgKzEsOTcgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgU3lzdGVtLldlYjsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFuIGFzeW5jIHRhc2sgYmFzZWQgSFRUUCBoYW5kbGVyIGZvciBwcm9jZXNzaW5nIHRocmlmdCBzZXJ2aWNlcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUSHR0cFRhc2tBc3luY0hhbmRsZXIgOiBIdHRwVGFza0FzeW5jSGFuZGxlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUQXN5bmNQcm9jZXNzb3IgX3Byb2Nlc3NvcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvdG9jb2xGYWN0b3J5IF9pbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvdG9jb2xGYWN0b3J5IF9vdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVEh0dHBUYXNrQXN5bmNIYW5kbGVyIi8+IGNsYXNzCisgICAgICAgIC8vLyB1c2luZyB0aGUgPHNlZSBjcmVmPSJUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSIvPiBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvY2Vzc29yIj5UaGUgYXN5bmMgcHJvY2Vzc29yIGltcGxlbWVudGF0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUSHR0cFRhc2tBc3luY0hhbmRsZXIoVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvcikKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUSHR0cFRhc2tBc3luY0hhbmRsZXIiLz4gY2xhc3MKKyAgICAgICAgLy8vIHVzaW5nIDxwYXJhbXJlZiBuYW1lPSJwcm90b2NvbEZhY3RvcnkiLz4gZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb2Nlc3NvciI+VGhlIGFzeW5jIHByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbi48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb3RvY29sRmFjdG9yeSI+VGhlIHByb3RvY29sIGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRIdHRwVGFza0FzeW5jSGFuZGxlcihUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUSHR0cFRhc2tBc3luY0hhbmRsZXIiLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvY2Vzc29yIj5UaGUgYXN5bmMgcHJvY2Vzc29yIGltcGxlbWVudGF0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXRQcm90b2NvbEZhY3RvcnkiPlRoZSBpbnB1dCBwcm90b2NvbCBmYWN0b3J5LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0UHJvdG9jb2xGYWN0b3J5Ij5UaGUgb3V0cHV0IHByb3RvY29sIGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRIdHRwVGFza0FzeW5jSGFuZGxlcihUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgICAgICAgICBfaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIF9vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBQcm9jZXNzUmVxdWVzdEFzeW5jKEh0dHBDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChjb250ZXh0LlJlcXVlc3QuSW5wdXRTdHJlYW0sIGNvbnRleHQuUmVzcG9uc2UuT3V0cHV0U3RyZWFtKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gX2lucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgdmFyIG91dHB1dCA9IF9vdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChhd2FpdCBfcHJvY2Vzc29yLlByb2Nlc3NBc3luYyhpbnB1dCwgb3V0cHV0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2xpZW50IGRpZWQsIGp1c3QgbW92ZSBvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5jcwppbmRleCBkOGZmOWRjLi4zMDNkMDgzIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5jcwpAQCAtMjIsNDUgKzIyLDU2IEBACiB1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKIHVzaW5nIFRocmlmdC5Qcm90b2NvbDsKIAotbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQgewotICAgIHB1YmxpYyBjbGFzcyBUTWVtb3J5QnVmZmVyIDogVFRyYW5zcG9ydCB7CituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIHB1YmxpYyBjbGFzcyBUTWVtb3J5QnVmZmVyIDogVFRyYW5zcG9ydAorICAgIHsKIAogICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBieXRlU3RyZWFtOwogCi0gICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKCkgeworICAgICAgICBwdWJsaWMgVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgVE1lbW9yeUJ1ZmZlcihieXRlW10gYnVmKSB7CisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKGJ5dGVbXSBidWYpCisgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKGJ1Zik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgewogICAgICAgICAgICAgLyoqIGRvIG5vdGhpbmcgKiovCiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CiAgICAgICAgICAgICAvKiogZG8gbm90aGluZyAqKi8KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gYnl0ZVN0cmVhbS5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CiAgICAgICAgICAgICBieXRlU3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIGJ5dGVbXSBHZXRCdWZmZXIoKSB7CisgICAgICAgIHB1YmxpYyBieXRlW10gR2V0QnVmZmVyKCkKKyAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGJ5dGVTdHJlYW0uVG9BcnJheSgpOwogICAgICAgICB9CiAKIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4geworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgewogICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIFNlcmlhbGl6ZShUQWJzdHJhY3RCYXNlIHMpIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gU2VyaWFsaXplKFRBYnN0cmFjdEJhc2UgcykKKyAgICAgICAgewogICAgICAgICAgICAgdmFyIHQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOwogICAgICAgICAgICAgdmFyIHAgPSBuZXcgVEJpbmFyeVByb3RvY29sKHQpOwogCkBAIC02OSwyNiArODAsMzMgQEAKICAgICAgICAgICAgIHJldHVybiB0LkdldEJ1ZmZlcigpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBUIERlU2VyaWFsaXplPFQ+KGJ5dGVbXSBidWYpIHdoZXJlIFQgOiBUQWJzdHJhY3RCYXNlIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBUIERlU2VyaWFsaXplPFQ+KGJ5dGVbXSBidWYpIHdoZXJlIFQgOiBUQWJzdHJhY3RCYXNlCisgICAgICAgIHsKICAgICAgICAgICAgIHZhciB0cmFucyA9IG5ldyBUTWVtb3J5QnVmZmVyKGJ1Zik7CiAgICAgICAgICAgICB2YXIgcCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMpOwotICAgICAgICAgICAgaWYgKHR5cGVvZiAoVEJhc2UpLklzQXNzaWduYWJsZUZyb20odHlwZW9mIChUKSkpIHsKLSAgICAgICAgICAgICAgICB2YXIgbWV0aG9kID0gdHlwZW9mIChUKS5HZXRNZXRob2QoIlJlYWQiLCBCaW5kaW5nRmxhZ3MuSW5zdGFuY2UgfCBCaW5kaW5nRmxhZ3MuUHVibGljKTsKKyAgICAgICAgICAgIGlmICh0eXBlb2YoVEJhc2UpLklzQXNzaWduYWJsZUZyb20odHlwZW9mKFQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbWV0aG9kID0gdHlwZW9mKFQpLkdldE1ldGhvZCgiUmVhZCIsIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5QdWJsaWMpOwogICAgICAgICAgICAgICAgIHZhciB0ID0gQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlPFQ+KCk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kLkludm9rZSh0LCBuZXcgb2JqZWN0W10ge3B9KTsKKyAgICAgICAgICAgICAgICBtZXRob2QuSW52b2tlKHQsIG5ldyBvYmplY3RbXSB7IHAgfSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7Ci0gICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICB2YXIgbWV0aG9kID0gdHlwZW9mIChUKS5HZXRNZXRob2QoIlJlYWQiLCBCaW5kaW5nRmxhZ3MuU3RhdGljIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChUKSBtZXRob2QuSW52b2tlKG51bGwsIG5ldyBvYmplY3RbXSB7cH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YoVCkuR2V0TWV0aG9kKCJSZWFkIiwgQmluZGluZ0ZsYWdzLlN0YXRpYyB8IEJpbmRpbmdGbGFncy5QdWJsaWMpOworICAgICAgICAgICAgICAgIHJldHVybiAoVCltZXRob2QuSW52b2tlKG51bGwsIG5ldyBvYmplY3RbXSB7IHAgfSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CiAKICAgICAgICAgLy8gSURpc3Bvc2FibGUKLSAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykgewotICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkgewotICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpIHsKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVTdHJlYW0gIT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVTdHJlYW0uRGlzcG9zZSgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTk2LDQgKzExNCw0IEBACiAgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcwppbmRleCA5ZmFhNmU3Li40OWE1MGFhIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcwpAQCAtMjEsNyArMjEsOSBAQAogICogZGV0YWlscy4KICAqLwogCit1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uSU8uUGlwZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewpAQCAtMzAsMTcgKzMyLDIwIEBACiAgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlQ2xpZW50U3RyZWFtIGNsaWVudDsKICAgICAgICAgcHJpdmF0ZSBzdHJpbmcgU2VydmVyTmFtZTsKICAgICAgICAgcHJpdmF0ZSBzdHJpbmcgUGlwZU5hbWU7CisgICAgICAgIHByaXZhdGUgaW50IENvbm5lY3RUaW1lb3V0OwogCi0gICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBwaXBlKQorICAgICAgICBwdWJsaWMgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChzdHJpbmcgcGlwZSwgaW50IHRpbWVvdXQgPSBUaW1lb3V0LkluZmluaXRlKQogICAgICAgICB7CiAgICAgICAgICAgICBTZXJ2ZXJOYW1lID0gIi4iOwogICAgICAgICAgICAgUGlwZU5hbWUgPSBwaXBlOworICAgICAgICAgICAgQ29ubmVjdFRpbWVvdXQgPSB0aW1lb3V0OwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHNlcnZlciwgc3RyaW5nIHBpcGUpCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBzZXJ2ZXIsIHN0cmluZyBwaXBlLCBpbnQgdGltZW91dCA9IFRpbWVvdXQuSW5maW5pdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIFNlcnZlck5hbWUgPSAoc2VydmVyICE9ICIiKSA/IHNlcnZlciA6ICIuIjsKICAgICAgICAgICAgIFBpcGVOYW1lID0gcGlwZTsKKyAgICAgICAgICAgIENvbm5lY3RUaW1lb3V0ID0gdGltZW91dDsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgpAQCAtNTUsNyArNjAsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3Blbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbGllbnQgPSBuZXcgTmFtZWRQaXBlQ2xpZW50U3RyZWFtKFNlcnZlck5hbWUsIFBpcGVOYW1lLCBQaXBlRGlyZWN0aW9uLkluT3V0LCBQaXBlT3B0aW9ucy5Ob25lKTsKLSAgICAgICAgICAgIGNsaWVudC5Db25uZWN0KCk7CisgICAgICAgICAgICBjbGllbnQuQ29ubmVjdChDb25uZWN0VGltZW91dCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCkBAIC04NCw3ICs4OSwxOCBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2xpZW50LldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgLy8gaWYgbmVjZXNzYXJ5LCBzZW5kIHRoZSBkYXRhIGluIGNodW5rcworICAgICAgICAgICAgLy8gdGhlcmUncyBhIHN5c3RlbSBsaW1pdCBhcm91bmQgMHgxMDAwMCBieXRlcyB0aGF0IHdlIGhpdCBvdGhlcndpc2UKKyAgICAgICAgICAgIC8vIE1TRE46ICJQaXBlIHdyaXRlIG9wZXJhdGlvbnMgYWNyb3NzIGEgbmV0d29yayBhcmUgbGltaXRlZCB0byA2NSw1MzUgYnl0ZXMgcGVyIHdyaXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgcGlwZXMsIHNlZSB0aGUgUmVtYXJrcyBzZWN0aW9uLiIKKyAgICAgICAgICAgIHZhciBuQnl0ZXMgPSBNYXRoLk1pbihsZW4sIDE1ICogNDA5Nik7ICAvLyAxNiB3b3VsZCBleGNlZWQgdGhlIGxpbWl0CisgICAgICAgICAgICB3aGlsZSAobkJ5dGVzID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuV3JpdGUoYnVmLCBvZmYsIG5CeXRlcyk7CisKKyAgICAgICAgICAgICAgICBvZmYgKz0gbkJ5dGVzOworICAgICAgICAgICAgICAgIGxlbiAtPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgbkJ5dGVzID0gTWF0aC5NaW4obGVuLCBuQnl0ZXMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKQEAgLTkyLDQgKzEwOCw0IEBACiAgICAgICAgICAgICBjbGllbnQuRGlzcG9zZSgpOwogICAgICAgICB9CiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MKaW5kZXggYzFlODQwMC4uMzIyMTVjZiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTIyLDkgKzIyLDkgQEAKICAqLwogCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5JTy5QaXBlczsKIHVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsOwogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewpAQCAtNjgsMjMgKzY4LDMyIEBACiAgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbiA9IFBpcGVEaXJlY3Rpb24uSW5PdXQ7Ci0gICAgICAgICAgICAgICAgdmFyIG1heGNvbm4gPSAyNTQ7CisgICAgICAgICAgICAgICAgdmFyIG1heGNvbm4gPSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0uTWF4QWxsb3dlZFNlcnZlckluc3RhbmNlczsKICAgICAgICAgICAgICAgICB2YXIgbW9kZSA9IFBpcGVUcmFuc21pc3Npb25Nb2RlLkJ5dGU7CiAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBhc3luY01vZGUgPyBQaXBlT3B0aW9ucy5Bc3luY2hyb25vdXMgOiBQaXBlT3B0aW9ucy5Ob25lOwotICAgICAgICAgICAgICAgIHZhciBpbmJ1ZiA9IDQwOTY7Ci0gICAgICAgICAgICAgICAgdmFyIG91dGJ1ZiA9IDQwOTY7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogc2VjdXJpdHkKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgSU5CVUZfU0laRSA9IDQwOTY7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IE9VVEJVRl9TSVpFID0gNDA5NjsKKworICAgICAgICAgICAgICAgIC8vIHNlY3VyaXR5CisgICAgICAgICAgICAgICAgdmFyIHNlY3VyaXR5ID0gbmV3IFBpcGVTZWN1cml0eSgpOworICAgICAgICAgICAgICAgIHNlY3VyaXR5LkFkZEFjY2Vzc1J1bGUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBQaXBlQWNjZXNzUnVsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZWN1cml0eUlkZW50aWZpZXIoV2VsbEtub3duU2lkVHlwZS5Xb3JsZFNpZCwgbnVsbCksCisgICAgICAgICAgICAgICAgICAgICAgICBQaXBlQWNjZXNzUmlnaHRzLlJlYWQgfCBQaXBlQWNjZXNzUmlnaHRzLldyaXRlIHwgUGlwZUFjY2Vzc1JpZ2h0cy5TeW5jaHJvbml6ZSB8IFBpcGVBY2Nlc3NSaWdodHMuQ3JlYXRlTmV3SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5BY2Nlc3NDb250cm9sVHlwZS5BbGxvdworICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgKTsKIAogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShwaXBlQWRkcmVzcywgZGlyZWN0aW9uLCBtYXhjb25uLCBtb2RlLCBvcHRpb25zLCBpbmJ1Ziwgb3V0YnVmKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShwaXBlQWRkcmVzcywgZGlyZWN0aW9uLCBtYXhjb25uLCBtb2RlLCBvcHRpb25zLCBJTkJVRl9TSVpFLCBPVVRCVUZfU0laRSwgc2VjdXJpdHkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoTm90SW1wbGVtZW50ZWRFeGNlcHRpb24pICAvLyBNb25vIHN0aWxsIGRvZXMgbm90IHN1cHBvcnQgYXN5bmMsIGZhbGxiYWNrIHRvIHN5bmMKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChhc3luY01vZGUpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgJj0gKH5QaXBlT3B0aW9ucy5Bc3luY2hyb25vdXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShwaXBlQWRkcmVzcywgZGlyZWN0aW9uLCBtYXhjb25uLCBtb2RlLCBvcHRpb25zLCBpbmJ1Ziwgb3V0YnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0ocGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgSU5CVUZfU0laRSwgT1VUQlVGX1NJWkUsIHNlY3VyaXR5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jTW9kZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTEyMSw3ICsxMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCwgZS5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkLCBlLk1lc3NhZ2UsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LlNldCgpOwogICAgICAgICAgICAgICAgICAgICB9LCBudWxsKTsKQEAgLTE0OCw3ICsxNTcsNyBAQAogICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIENsb3NlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sIGUuTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sIGUuTWVzc2FnZSwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjA1LDcgKzIxNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkLCBlLk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQsIGUuTWVzc2FnZSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBldnQuU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwpAQCAtMjMwLDQwICsyMzksNTEgQEAKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChhc3luY01vZGUpCisgICAgICAgICAgICAgICAgLy8gaWYgbmVjZXNzYXJ5LCBzZW5kIHRoZSBkYXRhIGluIGNodW5rcworICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3MgYSBzeXN0ZW0gbGltaXQgYXJvdW5kIDB4MTAwMDAgYnl0ZXMgdGhhdCB3ZSBoaXQgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICAgICAgICAgICAgICAgIHZhciBuQnl0ZXMgPSBNYXRoLk1pbihsZW4sIDE1ICogNDA5Nik7ICAvLyAxNiB3b3VsZCBleGNlZWQgdGhlIGxpbWl0CisgICAgICAgICAgICAgICAgd2hpbGUgKG5CeXRlcyA+IDApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gZU91dGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGV2dCA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKIAotICAgICAgICAgICAgICAgICAgICBzdHJlYW0uQmVnaW5Xcml0ZShidWYsIG9mZiwgbGVuLCBhc3luY1Jlc3VsdCA9PgorICAgICAgICAgICAgICAgICAgICBpZiAoYXN5bmNNb2RlKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlT3V0ZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2dCA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkJlZ2luV3JpdGUoYnVmLCBvZmYsIG5CeXRlcywgYXN5bmNSZXN1bHQgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5FbmRXcml0ZShhc3luY1Jlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCwgZS5NZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5TZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uRW5kV3JpdGUoYXN5bmNSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQsIGUuTWVzc2FnZSwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5TZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwogCi0gICAgICAgICAgICAgICAgICAgIGV2dC5XYWl0T25lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBldnQuV2FpdE9uZSgpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChlT3V0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVPdXRlcjsgLy8gcmV0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlT3V0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlT3V0ZXI7IC8vIHJldGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uV3JpdGUoYnVmLCBvZmYsIG5CeXRlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvZmYgKz0gbkJ5dGVzOworICAgICAgICAgICAgICAgICAgICBsZW4gLT0gbkJ5dGVzOworICAgICAgICAgICAgICAgICAgICBuQnl0ZXMgPSBNYXRoLk1pbihsZW4sIG5CeXRlcyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MKaW5kZXggODJhMzY3Yy4uZDhlYzYyYSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MKQEAgLTI5LDU2ICsyOSw1NiBAQAogewogICAgIHB1YmxpYyBjbGFzcyBUU2VydmVyU29ja2V0IDogVFNlcnZlclRyYW5zcG9ydAogICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogVW5kZXJseWluZyBzZXJ2ZXIgd2l0aCBzb2NrZXQKLSAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVW5kZXJseWluZyBzZXJ2ZXIgd2l0aCBzb2NrZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgc2VydmVyID0gbnVsbDsKIAotICAgICAgICAvKioKLSAgICAgICAgICogUG9ydCB0byBsaXN0ZW4gb24KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBvcnQgdG8gbGlzdGVuIG9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGludCBwb3J0ID0gMDsKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGltZW91dCBmb3IgY2xpZW50IHNvY2tldHMgZnJvbSBhY2NlcHQKLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRpbWVvdXQgZm9yIGNsaWVudCBzb2NrZXRzIGZyb20gYWNjZXB0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGludCBjbGllbnRUaW1lb3V0ID0gMDsKIAotICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciBvciBub3QgdG8gd3JhcCBuZXcgVFNvY2tldCBjb25uZWN0aW9ucyBpbiBidWZmZXJzCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXaGV0aGVyIG9yIG5vdCB0byB3cmFwIG5ldyBUU29ja2V0IGNvbm5lY3Rpb25zIGluIGJ1ZmZlcnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QKLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICAgICAgICAgIDp0aGlzKGxpc3RlbmVyLCAwKQorICAgICAgICAgICAgOiB0aGlzKGxpc3RlbmVyLCAwKQogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QKLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldChUY3BMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGNsaWVudFRpbWVvdXQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMuc2VydmVyID0gbGlzdGVuZXI7CiAgICAgICAgICAgICB0aGlzLmNsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQKLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0KQogICAgICAgICAgICAgOiB0aGlzKHBvcnQsIDApCiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGp1c3QgYSBwb3J0IGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0Ci0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGp1c3QgYSBwb3J0IGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCi0gICAgICAgICAgICA6dGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCBmYWxzZSkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCBmYWxzZSkKICAgICAgICAgewogICAgICAgICB9CiAKQEAgLTkwLDEzICs5MCwxMyBAQAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gTWFrZSBzZXJ2ZXIgc29ja2V0Ci0gICAgICAgICAgICAgICAgc2VydmVyID0gbmV3IFRjcExpc3RlbmVyKFN5c3RlbS5OZXQuSVBBZGRyZXNzLkFueSwgdGhpcy5wb3J0KTsKLSAgICAgICAgICAgICAgICBzZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcExpc3RlbmVyKHRoaXMucG9ydCk7CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc2VydmVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQgIiArIHRoaXMucG9ydCArICIuIiwgZXgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTExMSw3ICsxMTEsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAiICsgc3guTWVzc2FnZSwgc3gpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTUzLDcgKzE1Myw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCksIGV4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNjcsNyArMTY3LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgZXgsIGV4KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc2VydmVyID0gbnVsbDsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKaW5kZXggMDVkN2QwZi4uZTYzODgwYiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTM0LDEwICszNCwxMSBAQAogICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydCBBY2NlcHQoKQogICAgICAgICB7CiAgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IEFjY2VwdEltcGwoKTsKLSAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OwotICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2lsdmVybGlnaHRTb2NrZXQuY3MKaW5kZXggY2JkM2JhYS4uNDA0NjlhYiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzCkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKFN0cmluZy5Jc051bGxPckVtcHR5KGhvc3QpKQorICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGhvc3QpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gbnVsbCBob3N0Iik7CiAgICAgICAgICAgICB9CkBAIC0yODIsOSArMjgyLDkgQEAKICAgICAgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgQm9vbGVhbiBfaXNDb21wbGV0ZWQ7CiAgICAgICAgICAgICBwcml2YXRlIE1hbnVhbFJlc2V0RXZlbnQgX2V2dDsKICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQXN5bmNDYWxsYmFjayBfY2JNZXRob2Q7Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE9iamVjdCBfc3RhdGU7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdCBfc3RhdGU7CiAKLSAgICAgICAgICAgIHB1YmxpYyBGbHVzaEFzeW5jUmVzdWx0KEFzeW5jQ2FsbGJhY2sgY2JNZXRob2QsIE9iamVjdCBzdGF0ZSkKKyAgICAgICAgICAgIHB1YmxpYyBGbHVzaEFzeW5jUmVzdWx0KEFzeW5jQ2FsbGJhY2sgY2JNZXRob2QsIG9iamVjdCBzdGF0ZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBfY2JNZXRob2QgPSBjYk1ldGhvZDsKICAgICAgICAgICAgICAgICBfc3RhdGUgPSBzdGF0ZTsKQEAgLTMxNCw3ICszMTQsNyBAQAogICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfaXNDb21wbGV0ZWQ7IH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBPYmplY3QgX2xvY2tlciA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0IF9sb2NrZXIgPSBuZXcgb2JqZWN0KCk7CiAKICAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBHZXRFdnRIYW5kbGUoKQogICAgICAgICAgICAgewpAQCAtMzYyLDcgKzM2Miw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCiAgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKIAogICAgICAgICAvLyBJRGlzcG9zYWJsZQpAQCAtMzg1LDcgKzM4NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgorI2VuZHJlZ2lvbgogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcwppbmRleCBjZjFhNDQwLi5kOGZhMzM1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcwpAQCAtNjAsOSArNjAsOSBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCBJbml0U29ja2V0KCkKICAgICAgICAgewotICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRjcENsaWVudCgpOwotICAgICAgICAgICAgY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gY2xpZW50LlNlbmRUaW1lb3V0ID0gdGltZW91dDsKLSAgICAgICAgICAgIGNsaWVudC5DbGllbnQuTm9EZWxheSA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmNsaWVudCA9IFRTb2NrZXRWZXJzaW9uaXplci5DcmVhdGVUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gY2xpZW50LlNlbmRUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50LkNsaWVudC5Ob0RlbGF5ID0gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dApAQCAtMTE3LDcgKzExNyw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChTdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOwogICAgICAgICAgICAgfQpAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgICAgICAgICAgICAgSW5pdFNvY2tldCgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiggdGltZW91dCA9PSAwKSAgICAgICAgICAgIC8vIG5vIHRpbWVvdXQgLT4gaW5maW5pdGUKKyAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IDApICAgICAgICAgICAgLy8gbm8gdGltZW91dCAtPiBpbmZpbml0ZQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNsaWVudC5Db25uZWN0KGhvc3QsIHBvcnQpOwogICAgICAgICAgICAgfQpAQCAtMTQ1LDcgKzE0NSw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBsb2NrIChobHAuTXV0ZXgpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBobHAuQ2FsbGJhY2tEb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhscC5DYWxsYmFja0RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNyZXMuQXN5bmNXYWl0SGFuZGxlLkNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LkNsb3NlKCk7CkBAIC0xNzQsNyArMTc0LDcgQEAKIAogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGhscC5DbGllbnQuQ2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGlmIChobHAuQ2xpZW50LkNsaWVudCAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgaGxwLkNsaWVudC5FbmRDb25uZWN0KGFzeW5jcmVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKQEAgLTE4NCwxNCArMTg0LDE4IEBACiAKICAgICAgICAgICAgICAgICBpZiAoaGxwLkRvQ2xlYW51cCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhc3luY3Jlcy5Bc3luY1dhaXRIYW5kbGUuQ2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uKSB7fQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pIHsgfQogCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGxwLkNsaWVudCBpcyBJRGlzcG9zYWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKWhscC5DbGllbnQpLkRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uKSB7fQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pIHsgfQogICAgICAgICAgICAgICAgICAgICBobHAuQ2xpZW50ID0gbnVsbDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMTksMjMgKzIyMywyMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCi0gICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworICAgICAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKIAotICAgIC8vIElEaXNwb3NhYmxlCi0gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKLSAgICB7Ci0gICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQotICAgICAgewotICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQogICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKQotICAgICAgICAgICAgKChJRGlzcG9zYWJsZSljbGllbnQpLkRpc3Bvc2UoKTsKLSAgICAgICAgICBiYXNlLkRpc3Bvc2UoZGlzcG9zaW5nKTsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpY2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgfQotICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICAjZW5kcmVnaW9uCiAgICAgfQotICAgICNlbmRyZWdpb24KLSAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXRWZXJzaW9uaXplci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0VmVyc2lvbml6ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0YzBlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0VmVyc2lvbml6ZXIuY3MKQEAgLTAsMCArMSw3OCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OworI2lmIE5FVDQ1Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworI2VuZGlmCisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm9wZXJ0eUluZm8gZm9yIHRoZSBEdWFsTW9kZSBwcm9wZXJ0eSBvZiB0aGUgU3lzdGVtLk5ldC5Tb2NrZXRzLlNvY2tldCBjbGFzcy4gVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHNvY2tldHMgYXJlIGNhcGFibGUgb2YKKyAgICAvLy8gYXV0b21hdGljIElQdjQgYW5kIElQdjYgaGFuZGxpbmcuIElmIER1YWxNb2RlIGlzIHByZXNlbnQgdGhlIHNvY2tldHMgYXV0b21hdGljYWxseSBoYW5kbGUgSVB2NCBhbmQgSVB2NiBjb25uZWN0aW9ucy4KKyAgICAvLy8gSWYgdGhlIER1YWxNb2RlIGlzIG5vdCBhdmFpbGFibGUgdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uIGRldGVybWluZXMgd2hldGhlciBJUHY0IG9yIElQdjYgaXMgdXNlZC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBUU29ja2V0VmVyc2lvbml6ZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBUY3BDbGllbnQgYWNjb3JkaW5nIHRvIHRoZSBjYXBhYmlsaXRpdGVzIG9mIHRoZSB1c2VkIGZyYW1ld29yaworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgVGNwQ2xpZW50IENyZWF0ZVRjcENsaWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcENsaWVudCBjbGllbnQgPSBudWxsOworCisjaWYgTkVUNDUKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUY3BDbGllbnQoQWRkcmVzc0ZhbWlseS5JbnRlck5ldHdvcmtWNik7CisgICAgICAgICAgICBjbGllbnQuQ2xpZW50LkR1YWxNb2RlID0gdHJ1ZTsKKyNlbHNlCisgICAgICAgICAgICBjbGllbnQgPSBuZXcgVGNwQ2xpZW50KEFkZHJlc3NGYW1pbHkuSW50ZXJOZXR3b3JrKTsKKyNlbmRpZgorCisgICAgICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIFRjcExpc3RlbmVyIGFjY29yZGluZyB0byB0aGUgY2FwYWJpbGl0aXRlcyBvZiB0aGUgdXNlZCBmcmFtZXdvcmsuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIHN0YXRpYyBUY3BMaXN0ZW5lciBDcmVhdGVUY3BMaXN0ZW5lcihJbnQzMiBwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBUY3BMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7CisKKyNpZiBORVQ0NQorICAgICAgICAgICAgbGlzdGVuZXIgPSBuZXcgVGNwTGlzdGVuZXIoU3lzdGVtLk5ldC5JUEFkZHJlc3MuSVB2NkFueSwgcG9ydCk7CisgICAgICAgICAgICBsaXN0ZW5lci5TZXJ2ZXIuRHVhbE1vZGUgPSB0cnVlOworI2Vsc2UKKworICAgICAgICAgICAgbGlzdGVuZXIgPSBuZXcgVGNwTGlzdGVuZXIoU3lzdGVtLk5ldC5JUEFkZHJlc3MuQW55LCBwb3J0KTsKKyNlbmRpZgorCisgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCmluZGV4IDQ2ODc0M2MuLjMwNDU5OWYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCkBAIC0xMDUsMjQgKzEwNSwyNCBAQAogICAgICAgICB9CiAKIAotICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKLSAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOwogCi0gICAgLy8gSURpc3Bvc2FibGUKLSAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQotICAgIHsKLSAgICAgIGlmICghX0lzRGlzcG9zZWQpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCiAgICAgICAgIHsKLSAgICAgICAgICBpZiAoSW5wdXRTdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgIElucHV0U3RyZWFtLkRpc3Bvc2UoKTsKLSAgICAgICAgICBpZiAoT3V0cHV0U3RyZWFtICE9IG51bGwpCi0gICAgICAgICAgICBPdXRwdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgICNlbmRyZWdpb24KICAgICB9Ci0gICAgI2VuZHJlZ2lvbgotICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU2VydmVyU29ja2V0LmNzCmluZGV4IDYzMWE1OTMuLjcxNmE5N2MgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU2VydmVyU29ja2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU2VydmVyU29ja2V0LmNzCkBAIC0yMCw2ICsyMCw3IEBACiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uTmV0LlNlY3VyaXR5OwogdXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOwogdXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydApAQCAtNDIsNyArNDMsNyBAQAogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBUaW1lb3V0IGZvciB0aGUgY3JlYXRlZCBzZXJ2ZXIgc29ja2V0CiAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgaW50IGNsaWVudFRpbWVvdXQgPSAwOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBjbGllbnRUaW1lb3V0OwogCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFdoZXRoZXIgb3Igbm90IHRvIHdyYXAgbmV3IFRTb2NrZXQgY29ubmVjdGlvbnMgaW4gYnVmZmVycwpAQCAtNjUsMTIgKzY2LDE3IEBACiAgICAgICAgIHByaXZhdGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKIAogICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29sczsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU2VydmVyU29ja2V0IiAvPiBjbGFzcy4KICAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydCB3aGVyZSB0aGUgc2VydmVyIHJ1bnMuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlIG9iamVjdC48L3BhcmFtPgogICAgICAgICBwdWJsaWMgVFRMU1NlcnZlclNvY2tldChpbnQgcG9ydCwgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSkKLSAgICAgICAgICAgIDogdGhpcyhwb3J0LCAgMCwgY2VydGlmaWNhdGUpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgMCwgY2VydGlmaWNhdGUpCiAgICAgICAgIHsKICAgICAgICAgfQogCkBAIC05NCwxMyArMTAwLDE2IEBACiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSBjZXJ0aWZpY2F0ZSBvYmplY3QuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbGllbnRDZXJ0VmFsaWRhdG9yIj5UaGUgY2VydGlmaWNhdGUgdmFsaWRhdG9yLjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgdG8gc2VsZWN0IHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFByb3RvY29scyI+VGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvcGFyYW0+CiAgICAgICAgIHB1YmxpYyBUVExTU2VydmVyU29ja2V0KAogICAgICAgICAgICAgaW50IHBvcnQsCiAgICAgICAgICAgICBpbnQgY2xpZW50VGltZW91dCwKICAgICAgICAgICAgIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzLAogICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNsaWVudENlcnRWYWxpZGF0b3IgPSBudWxsLAotICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwpCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIC8vIFRPRE86IEVuYWJsZSBUbHMxMSBhbmQgVGxzMTIgKFRMUyAxLjEgYW5kIDEuMikgYnkgZGVmYXVsdCBvbmNlIHdlIHN0YXJ0IHVzaW5nIC5ORVQgNC41Ky4KKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWNlcnRpZmljYXRlLkhhc1ByaXZhdGVLZXkpCiAgICAgICAgICAgICB7CkBAIC0xMDgsMjAgKzExNywyMiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy5jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKICAgICAgICAgICAgIHRoaXMuc2VydmVyQ2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZTsKICAgICAgICAgICAgIHRoaXMudXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOwogICAgICAgICAgICAgdGhpcy5jbGllbnRDZXJ0VmFsaWRhdG9yID0gY2xpZW50Q2VydFZhbGlkYXRvcjsKICAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgdGhpcy5zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgc2VydmVyIHNvY2tldAotICAgICAgICAgICAgICAgIHNlcnZlciA9IG5ldyBUY3BMaXN0ZW5lcihTeXN0ZW0uTmV0LklQQWRkcmVzcy5BbnksIHRoaXMucG9ydCk7Ci0gICAgICAgICAgICAgICAgc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlciA9IFRTb2NrZXRWZXJzaW9uaXplci5DcmVhdGVUY3BMaXN0ZW5lcih0aGlzLnBvcnQpOworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHNlcnZlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQgIiArIHBvcnQgKyAiLiIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyB0aGlzLnBvcnQgKyAiLiIsIGV4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMzksNyArMTUwLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UsIHN4KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE2OCw4ICsxNzksOCBAQAogICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlckNlcnRpZmljYXRlLAogICAgICAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudENlcnRWYWxpZGF0b3IsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrCi0gICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgIHRoaXMuc3NsUHJvdG9jb2xzKTsKIAogICAgICAgICAgICAgICAgIHNvY2tldC5zZXR1cFRMUygpOwogCkBAIC0xODYsNyArMTk3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSwgZXgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTIwMyw3ICsyMTQsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgZXgpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCwgZXgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlciA9IG51bGw7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzCmluZGV4IDU2NTI1NTYuLjA2Mjg2ZGMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzCkBAIC0zMyw0MyArMzMsNDMgQEAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gSW50ZXJuYWwgVENQIENsaWVudAogICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIFRjcENsaWVudCBjbGllbnQgPSBudWxsOworICAgICAgICBwcml2YXRlIFRjcENsaWVudCBjbGllbnQ7CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gVGhlIGhvc3QKICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgaG9zdCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIGhvc3Q7CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gVGhlIHBvcnQKICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IHBvcnQ7CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gVGhlIHRpbWVvdXQgZm9yIHRoZSBjb25uZWN0aW9uCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgaW50IHRpbWVvdXQgPSAwOworICAgICAgICBwcml2YXRlIGludCB0aW1lb3V0OwogCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIEludGVybmFsIFNTTCBTdHJlYW0gZm9yIElPCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgU3NsU3RyZWFtIHNlY3VyZVN0cmVhbSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3NsU3RyZWFtIHNlY3VyZVN0cmVhbTsKIAogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBEZWZpbmVzIHdoZXRlciBvciBub3QgdGhpcyBzb2NrZXQgaXMgYSBzZXJ2ZXIgc29ja2V0PGJyLz4KICAgICAgICAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgdGhlIFRMUy1hdXRoZW50aWNhdGlvbgogICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIGJvb2wgaXNTZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sIGlzU2VydmVyOwogCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFRoZSBjZXJ0aWZpY2F0ZQogICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlOwogCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFVzZXIgZGVmaW5lZCBjZXJ0aWZpY2F0ZSB2YWxpZGF0b3IuCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGw7CisgICAgICAgIHByaXZhdGUgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvcjsKIAogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS4KQEAgLTc3LDYgKzc3LDExIEBACiAgICAgICAgIHByaXZhdGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKIAogICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uU1NMIHByb3RvY29scyB0byBiZSB1c2VkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNzbFByb3RvY29scyBzc2xQcm90b2NvbHM7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVFRMU1NvY2tldCIvPiBjbGFzcy4KICAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbGllbnQiPkFuIGFscmVhZHkgY3JlYXRlZCBUQ1AtY2xpZW50PC9wYXJhbT4KQEAgLTg0LDE4ICs4OSwyNiBAQAogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlzU2VydmVyIj5pZiBzZXQgdG8gPGM+dHJ1ZTwvYz4gW2lzIHNlcnZlcl0uPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0VmFsaWRhdG9yIj5Vc2VyIGRlZmluZWQgY2VydCB2YWxpZGF0b3IuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KICAgICAgICAgcHVibGljIFRUTFNTb2NrZXQoCiAgICAgICAgICAgICBUY3BDbGllbnQgY2xpZW50LAogICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLAogICAgICAgICAgICAgYm9vbCBpc1NlcnZlciA9IGZhbHNlLAogICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCi0gICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCkKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgLy8gVE9ETzogRW5hYmxlIFRsczExIGFuZCBUbHMxMiAoVExTIDEuMSBhbmQgMS4yKSBieSBkZWZhdWx0IG9uY2Ugd2Ugc3RhcnQgdXNpbmcgLk5FVCA0LjUrLgorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OwogICAgICAgICAgICAgdGhpcy5jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOwogICAgICAgICAgICAgdGhpcy5jZXJ0VmFsaWRhdG9yID0gY2VydFZhbGlkYXRvcjsKICAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgdGhpcy5zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CiAgICAgICAgICAgICB0aGlzLmlzU2VydmVyID0gaXNTZXJ2ZXI7CisgICAgICAgICAgICBpZiAoaXNTZXJ2ZXIgJiYgY2VydGlmaWNhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRUTFNTb2NrZXQgbmVlZHMgY2VydGlmaWNhdGUgdG8gYmUgdXNlZCBmb3Igc2VydmVyIiwgImNlcnRpZmljYXRlIik7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChJc09wZW4pCiAgICAgICAgICAgICB7CkBAIC0xMTIsMTMgKzEyNSwxNSBAQAogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlUGF0aCI+VGhlIGNlcnRpZmljYXRlIHBhdGguPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0VmFsaWRhdG9yIj5Vc2VyIGRlZmluZWQgY2VydCB2YWxpZGF0b3IuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KICAgICAgICAgcHVibGljIFRUTFNTb2NrZXQoCiAgICAgICAgICAgICBzdHJpbmcgaG9zdCwKICAgICAgICAgICAgIGludCBwb3J0LAogICAgICAgICAgICAgc3RyaW5nIGNlcnRpZmljYXRlUGF0aCwKICAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAotICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwpCi0gICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwgWDUwOUNlcnRpZmljYXRlLkNyZWF0ZUZyb21DZXJ0RmlsZShjZXJ0aWZpY2F0ZVBhdGgpLCBjZXJ0VmFsaWRhdG9yLCBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2spCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzKQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDAsIFg1MDlDZXJ0aWZpY2F0ZS5DcmVhdGVGcm9tQ2VydEZpbGUoY2VydGlmaWNhdGVQYXRoKSwgY2VydFZhbGlkYXRvciwgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLCBzc2xQcm90b2NvbHMpCiAgICAgICAgIHsKICAgICAgICAgfQogCkBAIC0xMzAsMTMgKzE0NSwxNSBAQAogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0VmFsaWRhdG9yIj5Vc2VyIGRlZmluZWQgY2VydCB2YWxpZGF0b3IuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KICAgICAgICAgcHVibGljIFRUTFNTb2NrZXQoCiAgICAgICAgICAgICBzdHJpbmcgaG9zdCwKICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlID0gbnVsbCwKICAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAotICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwpCi0gICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwgY2VydGlmaWNhdGUsIGNlcnRWYWxpZGF0b3IsIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaykKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwgY2VydGlmaWNhdGUsIGNlcnRWYWxpZGF0b3IsIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywgc3NsUHJvdG9jb2xzKQogICAgICAgICB7CiAgICAgICAgIH0KIApAQCAtMTQ5LDEzICsxNjYsMTUgQEAKICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlLjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydFZhbGlkYXRvciI+VXNlciBkZWZpbmVkIGNlcnQgdmFsaWRhdG9yLjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgdG8gc2VsZWN0IHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFByb3RvY29scyI+VGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvcGFyYW0+CiAgICAgICAgIHB1YmxpYyBUVExTU29ja2V0KAogICAgICAgICAgICAgc3RyaW5nIGhvc3QsCiAgICAgICAgICAgICBpbnQgcG9ydCwKICAgICAgICAgICAgIGludCB0aW1lb3V0LAogICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLAogICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCi0gICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCkKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CiAgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OwpAQCAtMTYzLDYgKzE4Miw3IEBACiAgICAgICAgICAgICB0aGlzLmNlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CiAgICAgICAgICAgICB0aGlzLmNlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOwogICAgICAgICAgICAgdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICB0aGlzLnNzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKIAogICAgICAgICAgICAgSW5pdFNvY2tldCgpOwogICAgICAgICB9CkBAIC0xNzIsNyArMTkyLDcgQEAKICAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTb2NrZXQoKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIGNsaWVudCA9IFRTb2NrZXRWZXJzaW9uaXplci5DcmVhdGVUY3BDbGllbnQoKTsKICAgICAgICAgICAgIGNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7CiAgICAgICAgICAgICBjbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOwogICAgICAgICB9CkBAIC0yNDMsNyArMjYzLDcgQEAKICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBzZW5kZXItb2JqZWN0LjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSB1c2VkIGNlcnRpZmljYXRlLjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2hhaW4iPlRoZSBjZXJ0aWZpY2F0ZSBjaGFpbi48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFBvbGljeUVycm9ycyI+QW4gZW51bSwgd2hpY2ggbGlzdHMgYWxsIHRoZSBlcnJvcnMgZnJvbSB0aGUgLk5FVCBjZXJ0aWZpY2F0ZSBjaGVjay48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFZhbGlkYXRpb25FcnJvcnMiPkFuIGVudW0sIHdoaWNoIGxpc3RzIGFsbCB0aGUgZXJyb3JzIGZyb20gdGhlIC5ORVQgY2VydGlmaWNhdGUgY2hlY2suPC9wYXJhbT4KICAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KICAgICAgICAgcHJpdmF0ZSBib29sIERlZmF1bHRDZXJ0aWZpY2F0ZVZhbGlkYXRvcihvYmplY3Qgc2VuZGVyLCBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsIFg1MDlDaGFpbiBjaGFpbiwgU3NsUG9saWN5RXJyb3JzIHNzbFZhbGlkYXRpb25FcnJvcnMpCiAgICAgICAgIHsKQEAgLTI2MCw3ICsyODAsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QiKTsKICAgICAgICAgICAgIH0KQEAgLTI3NSw3ICsyOTUsMzMgQEAKICAgICAgICAgICAgICAgICBJbml0U29ja2V0KCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNsaWVudC5Db25uZWN0KGhvc3QsIHBvcnQpOworICAgICAgICAgICAgaWYgKHRpbWVvdXQgPT0gMCkgICAgICAgICAgICAvLyBubyB0aW1lb3V0IC0+IGluZmluaXRlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHRpbWVvdXQgLT4gdXNlIGl0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29ubmVjdEhlbHBlciBobHAgPSBuZXcgQ29ubmVjdEhlbHBlcihjbGllbnQpOworICAgICAgICAgICAgICAgIElBc3luY1Jlc3VsdCBhc3luY3JlcyA9IGNsaWVudC5CZWdpbkNvbm5lY3QoaG9zdCwgcG9ydCwgbmV3IEFzeW5jQ2FsbGJhY2soQ29ubmVjdENhbGxiYWNrKSwgaGxwKTsKKyAgICAgICAgICAgICAgICBib29sIGJDb25uZWN0ZWQgPSBhc3luY3Jlcy5Bc3luY1dhaXRIYW5kbGUuV2FpdE9uZSh0aW1lb3V0KSAmJiBjbGllbnQuQ29ubmVjdGVkOworICAgICAgICAgICAgICAgIGlmICghYkNvbm5lY3RlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvY2sgKGhscC5NdXRleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhscC5DYWxsYmFja0RvbmUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNyZXMuQXN5bmNXYWl0SGFuZGxlLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxwLkRvQ2xlYW51cCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVGltZWRPdXQsICJDb25uZWN0IHRpbWVkIG91dCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc2V0dXBUTFMoKTsKICAgICAgICAgfQpAQCAtMjg2LDggKzMzMiw4IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHNldHVwVExTKCkKICAgICAgICAgewogICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgdmFsaWRhdG9yID0gdGhpcy5jZXJ0VmFsaWRhdG9yID8/IERlZmF1bHRDZXJ0aWZpY2F0ZVZhbGlkYXRvcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrICE9IG51bGwpCisKKyAgICAgICAgICAgIGlmICh0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayAhPSBudWxsKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtID0gbmV3IFNzbFN0cmVhbSgKICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQuR2V0U3RyZWFtKCksCkBAIC0zMDQsMTggKzM1MCwxOSBAQAogICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IKICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChpc1NlcnZlcikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFNlcnZlciBhdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbS5BdXRoZW50aWNhdGVBc1NlcnZlcih0aGlzLmNlcnRpZmljYXRlLCB0aGlzLmNlcnRWYWxpZGF0b3IgIT0gbnVsbCwgU3NsUHJvdG9jb2xzLlRscywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtLkF1dGhlbnRpY2F0ZUFzU2VydmVyKHRoaXMuY2VydGlmaWNhdGUsIHRoaXMuY2VydFZhbGlkYXRvciAhPSBudWxsLCBzc2xQcm90b2NvbHMsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvLyBDbGllbnQgYXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNDbGllbnQoaG9zdCwgbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24geyBjZXJ0aWZpY2F0ZSB9LCBTc2xQcm90b2NvbHMuVGxzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiBjZXJ0cyA9IGNlcnRpZmljYXRlICE9IG51bGwgPyBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiB7IGNlcnRpZmljYXRlIH0gOiBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbS5BdXRoZW50aWNhdGVBc0NsaWVudChob3N0LCBjZXJ0cywgc3NsUHJvdG9jb2xzLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQpAQCAtMzI3LDYgKzM3NCw1NCBAQAogICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSB0aGlzLnNlY3VyZVN0cmVhbTsKICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IHRoaXMuc2VjdXJlU3RyZWFtOwogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdGF0aWMgdm9pZCBDb25uZWN0Q2FsbGJhY2soSUFzeW5jUmVzdWx0IGFzeW5jcmVzKQorICAgICAgICB7CisgICAgICAgICAgICBDb25uZWN0SGVscGVyIGhscCA9IGFzeW5jcmVzLkFzeW5jU3RhdGUgYXMgQ29ubmVjdEhlbHBlcjsKKyAgICAgICAgICAgIGxvY2sgKGhscC5NdXRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBobHAuQ2FsbGJhY2tEb25lID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhscC5DbGllbnQuQ2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBobHAuQ2xpZW50LkVuZENvbm5lY3QoYXN5bmNyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggdGhhdCBhd2F5CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGhscC5Eb0NsZWFudXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNyZXMuQXN5bmNXYWl0SGFuZGxlLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikgeyB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobHAuQ2xpZW50IGlzIElEaXNwb3NhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpaGxwLkNsaWVudCkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pIHsgfQorICAgICAgICAgICAgICAgICAgICBobHAuQ2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIENvbm5lY3RIZWxwZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIG9iamVjdCBNdXRleCA9IG5ldyBvYmplY3QoKTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIERvQ2xlYW51cCA9IGZhbHNlOworICAgICAgICAgICAgcHVibGljIGJvb2wgQ2FsbGJhY2tEb25lID0gZmFsc2U7CisgICAgICAgICAgICBwdWJsaWMgVGNwQ2xpZW50IENsaWVudDsKKyAgICAgICAgICAgIHB1YmxpYyBDb25uZWN0SGVscGVyKFRjcENsaWVudCBjbGllbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gQ2xvc2VzIHRoZSBTU0wgU29ja2V0CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCmluZGV4IDI4MTEzOTkuLjVlNGFjMjIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCkBAIC0zNCw3ICszNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIGJ5dGVbXSBfcGVla0J1ZmZlciA9IG5ldyBieXRlWzFdOwotICAgICAgICBwcml2YXRlIGJvb2wgX2hhc1BlZWtCeXRlID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaGFzUGVla0J5dGU7CiAKICAgICAgICAgcHVibGljIGJvb2wgUGVlaygpCiAgICAgICAgIHsKQEAgLTUzLDkgKzUzLDkgQEAKICAgICAgICAgICAgICAgICBpZiAoYnl0ZXMgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uKQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIAorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgX2hhc1BlZWtCeXRlID0gdHJ1ZTsKQEAgLTY2LDEwICs2NiwyMyBAQAogCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIENsb3NlKCk7CiAKKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIFZhbGlkYXRlQnVmZmVyQXJncyhieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiYnVmIik7CisgICAgICAgICAgICBpZiAob2ZmIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJCdWZmZXIgb2Zmc2V0IGlzIHNtYWxsZXIgdGhhbiB6ZXJvLiIpOworICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiQnVmZmVyIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIGlmIChvZmYgKyBsZW4gPiBidWYuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIk5vdCBlbm91Z2ggZGF0YS4iKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKTsKIAogICAgICAgICBwdWJsaWMgaW50IFJlYWRBbGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKICAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1Ziwgb2ZmLCBsZW4pOwogICAgICAgICAgICAgaW50IGdvdCA9IDA7CiAKICAgICAgICAgICAgIC8vSWYgd2UgcHJldmlvdXNseSBwZWVrZWQgYSBieXRlLCB3ZSBuZWVkIHRvIHVzZSB0aGF0IGZpcnN0LgpAQCAtOTUsNyArMTA4LDcgQEAKIAogICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlKGJ5dGVbXSBidWYpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlIChidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICAgICAgV3JpdGUoYnVmLCAwLCBidWYuTGVuZ3RoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pOwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcwppbmRleCBhZTk4N2Q1Li43ZjZjYzE4IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcwpAQCAtNDAsMTQgKzQwLDE0IEBACiAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKLSAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUsIHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCiAgICAgICAgIHsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MKaW5kZXggZmExMDAzMy4uNDdhMGM2MiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcwpAQCAtMjYsNyArMjYsNyBAQAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEZyb20gTWFyayBTbGVlICYgQWRpdHlhIEFnYXJ3YWwgb2YgRmFjZWJvb2s6CisgICAgLy8vIEZyb20gTWFyayBTbGVlICZhbXA7IEFkaXR5YSBBZ2Fyd2FsIG9mIEZhY2Vib29rOgogICAgIC8vLyBGYWN0b3J5IGNsYXNzIHVzZWQgdG8gY3JlYXRlIHdyYXBwZWQgaW5zdGFuY2Ugb2YgVHJhbnNwb3J0cy4KICAgICAvLy8gVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCiAgICAgLy8vIGEgU2VydmVyVHJhbnNwb3J0IGFuZCB0aGVuIG1heSB3YW50IHRvIG11dGF0ZSB0aGVtIChpLmUuIGNyZWF0ZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvZ3JhbS5jcyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb2dyYW0uY3MKaW5kZXggOTgyMzIyMS4uZjYxMzg4YSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvZ3JhbS5jcworKysgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9ncmFtLmNzCkBAIC0zNCw2ICszNCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFRlc3RUaHJpZnQyMzY1KCk7ICAvLyBKU09OIGJpbmFyeSBkZWNvZGVzIHRvbyBtdWNoIGRhdGEKICAgICAgICAgICAgIFRlc3RUaHJpZnQyMzM2KCk7ICAvLyBoZXggZW5jb2RpbmcgdXNpbmcgXHVYWFhYIHdoZXJlIDB4WFhYWCA+IDB4RkYKKyAgICAgICAgICAgIFRlc3RUaHJpZnQzNDAzKCk7IC8vIEpTT04gZXNjYXBlZCB1bmljb2RlIHN1cnJvZ2F0ZSBwYWlyIHN1cHBvcnQuCiAgICAgICAgIH0KIAogCkBAIC03OCw1ICs3OSwxNyBAQAogICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFucyk7CiAgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQocHJvdC5SZWFkU3RyaW5nKCkgPT0gUlVTU0lBTl9URVhULCAicmVhZGluZyBKU09OIHdpdGggaGV4LWVuY29kZWQgY2hhcnMgPiA4IGJpdCIpOwogICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFRlc3RUaHJpZnQzNDAzKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIEdDTEVGX1RFWFQgPSAiXHVkODM0XHVkZDFlIjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBHQ0xFRl9KU09OID0gIlwiXFx1ZDgzNFxcdWRkMWVcIiI7CisKKyAgICAgICAgICAgIC8vIHBhcnNlIGFuZCBjaGVjaworICAgICAgICAgICAgdmFyIHN0bSA9IG5ldyBNZW1vcnlTdHJlYW0oRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhHQ0xFRl9KU09OKSk7CisgICAgICAgICAgICB2YXIgdHJhbnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChzdG0sIG51bGwpOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQocHJvdC5SZWFkU3RyaW5nKCkgPT0gR0NMRUZfVEVYVCwgInJlYWRpbmcgSlNPTiB3aXRoIHN1cnJvZ2F0ZSBwYWlyIGhleC1lbmNvZGVkIGNoYXJzIik7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IGYwZmFmOWEuLmZkZmY0YTEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0yNyw5ICsyNyw5IEBACiBbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkpTT05UZXN0IildCiBbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkpTT05UZXN0IildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMTQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCiAKQEAgLTUxLDUgKzUxLDUgQEAKIC8vIFNpZSBrw7ZubmVuIGFsbGUgV2VydGUgYW5nZWJlbiBvZGVyIGRpZSBzdGFuZGFyZG3DpMOfaWdlbiBCdWlsZC0gdW5kIFJldmlzaW9uc251bW1lcm4KIC8vIMO8YmVybmVobWVuLCBpbmRlbSBTaWUgIioiIGVpbmdlYmVuOgogLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMC45LjMuMCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIwLjkuMy4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXguVGVzdC5DbGllbnQuY3MgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXguVGVzdC5DbGllbnQuY3MKaW5kZXggY2NmZTIxZC4uYzgxMGEwOCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleC5UZXN0LkNsaWVudC5jcwpAQCAtMjYsMTcgKzI2LDE2IEBACiB1c2luZyBUaHJpZnQ7CiB1c2luZyBUZXN0Lk11bHRpcGxleDsKIAotCiBuYW1lc3BhY2UgVGVzdC5NdWx0aXBsZXguQ2xpZW50CiB7CiAgICAgcHVibGljIGNsYXNzIFRlc3RDbGllbnQKICAgICB7Ci0gICAgICAgIHByaXZhdGUgdm9pZCBSdW4oKQorICAgICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKGludCBwb3J0KQogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zOwotICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOwogICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOwogICAgICAgICAgICAgICAgIHRyYW5zLk9wZW4oKTsKIApAQCAtNDQsNDQgKzQzLDQwIEBACiAKICAgICAgICAgICAgICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtdWx0aXBsZXg7CiAKLSAgICAgICAgICAgICAgICBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2woIFByb3RvY29sLCBDb25zdGFudHMuTkFNRV9CRU5DSE1BUktTRVJWSUNFKTsKLSAgICAgICAgICAgICAgICBCZW5jaG1hcmtTZXJ2aWNlLklmYWNlIGJlbmNoID0gbmV3IEJlbmNobWFya1NlcnZpY2UuQ2xpZW50KCBtdWx0aXBsZXgpOworICAgICAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChQcm90b2NvbCwgQ29uc3RhbnRzLk5BTUVfQkVOQ0hNQVJLU0VSVklDRSk7CisgICAgICAgICAgICAgICAgQmVuY2htYXJrU2VydmljZS5JZmFjZSBiZW5jaCA9IG5ldyBCZW5jaG1hcmtTZXJ2aWNlLkNsaWVudChtdWx0aXBsZXgpOwogCi0gICAgICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKCBQcm90b2NvbCwgQ29uc3RhbnRzLk5BTUVfQUdHUik7Ci0gICAgICAgICAgICAgICAgQWdnci5JZmFjZSBhZ2dyID0gbmV3IEFnZ3IuQ2xpZW50KCBtdWx0aXBsZXgpOworICAgICAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChQcm90b2NvbCwgQ29uc3RhbnRzLk5BTUVfQUdHUik7CisgICAgICAgICAgICAgICAgQWdnci5JZmFjZSBhZ2dyID0gbmV3IEFnZ3IuQ2xpZW50KG11bHRpcGxleCk7CiAKLSAgICAgICAgICAgICAgICBzYnl0ZSBpOwotICAgICAgICAgICAgICAgIGZvciggaSA9IDE7IDEwID49IGk7ICsraSkKKyAgICAgICAgICAgICAgICBmb3IgKHNieXRlIGkgPSAxOyAxMCA+PSBpOyArK2kpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZ2dyLmFkZFZhbHVlKCBiZW5jaC5maWJvbmFjY2koaSkpOworICAgICAgICAgICAgICAgICAgICBhZ2dyLmFkZFZhbHVlKGJlbmNoLmZpYm9uYWNjaShpKSk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZm9yZWFjaCggaW50IGsgaW4gYWdnci5nZXRWYWx1ZXMoKSkKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgayBpbiBhZ2dyLmdldFZhbHVlcygpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrLlRvU3RyaW5nKCkrIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrLlRvU3RyaW5nKCkgKyAiICIpOwogICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiIik7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zLkNsb3NlKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUpCisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGUuTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZS5NZXNzYWdlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEV4ZWN1dGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBUZXN0Q2xpZW50IGNsaWVudCA9IG5ldyBUZXN0Q2xpZW50KCk7Ci0gICAgICAgICAgICBjbGllbnQuUnVuKCk7Ci0gICAgICAgIH0KLQogICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgICAgIGlmIChhcmdzLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9ydCA9IHVzaG9ydC5QYXJzZShhcmdzWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV4ZWN1dGUocG9ydCk7CiAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKLSAgICAgICAgICAgIENvbnNvbGUuUmVhZExpbmUoKTsKICAgICAgICAgfQotCiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXhDbGllbnQuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJvagppbmRleCA2MjIxZTE0Li4wOWQyMGY1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXhDbGllbnQuY3Nwcm9qCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleENsaWVudC5jc3Byb2oKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgogICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KICAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgotICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuJTJhPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4wLjEzLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgogICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgogICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CiAgIDwvUHJvcGVydHlHcm91cD4KQEAgLTE0NSw0ICsxNDUsNCBAQAogCiA8L1ByZUJ1aWxkRXZlbnQ+CiAgIDwvUHJvcGVydHlHcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IDI2YzI3OTAuLjBiNjVjMWUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0yNyw5ICsyNyw5IEBACiBbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIk11bHRpcGxleENsaWVudCIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJNdWx0aXBsZXhDbGllbnQiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAyMDE1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KIApAQCAtNTEsNSArNTEsNSBAQAogLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKIC8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CiAvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjkuMy4wIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuOS4zLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjEzLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIwLjEzLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NYWtlZmlsZS5hbSBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxZjFiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0dFTkVSQVRFRCA9IFwKKwlnZW4tY3NoYXJwL0FnZ3IuY3MgXAorCWdlbi1jc2hhcnAvQmVuY2htYXJrU2VydmljZS5jcyBcCisJZ2VuLWNzaGFycC9FcnJvci5jcworCitCVUlMVF9TT1VSQ0VTID0gJChHRU5FUkFURUQpCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK2dlbi1jc2hhcnAvQWdnci5jczogJCh0b3Bfc3JjZGlyKS9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3NoYXJwICQ8CisKK2dlbi1jc2hhcnAvQmVuY2htYXJrU2VydmljZS5jcyBnZW4tY3NoYXJwL0Vycm9yLmNzOiAkKHRvcF9zcmNkaXIpL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjc2hhcnAgJDwKKworVGhyaWZ0SW1wbC5kbGw6IE11bHRpcGxleC5UZXN0LkNvbW1vbi5jcyAkKEdFTkVSQVRFRCkgLi4vLi4vVGhyaWZ0LmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtdDpsaWJyYXJ5IC1vdXQ6Li9UaHJpZnRJbXBsLmRsbCAtcmVmZXJlbmNlOi4uLy4uL1RocmlmdC5kbGwgJChHRU5FUkFURUQpICQ8CisKK011bHRpcGxleENsaWVudC5leGU6IENsaWVudC9NdWx0aXBsZXguVGVzdC5DbGllbnQuY3MgVGhyaWZ0SW1wbC5kbGwKKwkkKENTQykgJChDU0NfREVGSU5FUykgLW91dDokQCAtcmVmZXJlbmNlOi4uLy4uL1RocmlmdC5kbGwgLXJlZmVyZW5jZTpUaHJpZnRJbXBsLmRsbCAkPAorCitNdWx0aXBsZXhTZXJ2ZXIuZXhlOiBTZXJ2ZXIvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmNzIFRocmlmdEltcGwuZGxsCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXJlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsIC1yZWZlcmVuY2U6VGhyaWZ0SW1wbC5kbGwgJDwKKworQ0xFQU5GSUxFUyA9IFwKKwlNdWx0aXBsZXhDbGllbnQuZXhlIFwKKwlNdWx0aXBsZXhTZXJ2ZXIuZXhlIFwKKwlUaHJpZnRJbXBsLmRsbAorCitESVNUQ0xFQU5GSUxFUyA9IFwKKwlNYWtlZmlsZS5pbgorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtcmYgZ2VuLWNzaGFycAorCitkaXN0LWhvb2s6CisJJChSTSkgLXIgJChkaXN0ZGlyKS9nZW4tY3NoYXJwLworCitURVNUUE9SVCA9IDk1MDEKK2NoZWNrLWxvY2FsOiBNdWx0aXBsZXhTZXJ2ZXIuZXhlIE11bHRpcGxleENsaWVudC5leGUKKwllY2hvICQoVEVTVFBPUlQpCisJTU9OT19QQVRIPS4uLy4uLyB0aW1lb3V0IDEwIG1vbm8gTXVsdGlwbGV4U2VydmVyLmV4ZSAkKFRFU1RQT1JUKSAmCisJc2xlZXAgMQorCU1PTk9fUEFUSD0uLi8uLi8gbW9ubyBNdWx0aXBsZXhDbGllbnQuZXhlICQoVEVTVFBPUlQpCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MKaW5kZXggNjFjMmQ3Yy4uOTc4NjE4OSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleC5UZXN0LlNlcnZlci5jcwpAQCAtMzAsMzAgKzMwLDE0IEBACiB7CiAgICAgcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIKICAgICB7Ci0gICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRlc3RIYW5kbGVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZvaWQgU2V0U2VydmVyKCBUU2VydmVyIGFTZXJ2ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGNsYXNzIFRlc3RIYW5kbGVySW1wbCA6IElUZXN0SGFuZGxlcgotICAgICAgICB7Ci0gICAgICAgICAgICBwcml2YXRlIFRTZXJ2ZXIgU2VydmVyOwotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXRTZXJ2ZXIoIFRTZXJ2ZXIgYVNlcnZlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXJ2ZXIgPSBhU2VydmVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgQmVuY2htYXJrU2VydmljZUltcGwgOiBUZXN0SGFuZGxlckltcGwsIEJlbmNobWFya1NlcnZpY2UuSWZhY2UKKyAgICAgICAgY2xhc3MgQmVuY2htYXJrU2VydmljZUltcGwgOiBCZW5jaG1hcmtTZXJ2aWNlLklmYWNlCiAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYyBpbnQgZmlib25hY2NpKHNieXRlIG4pCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaW50IHByZXYsIG5leHQsIHJlc3VsdDsKICAgICAgICAgICAgICAgICBwcmV2ICAgPSAwOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICAgICAgICAgICAgd2hpbGUoIG4gPiAwKQorICAgICAgICAgICAgICAgIHdoaWxlIChuID4gMCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG5leHQgICA9IHJlc3VsdCArIHByZXY7CiAgICAgICAgICAgICAgICAgICAgIHByZXYgICA9IHJlc3VsdDsKQEAgLTY0LDE0ICs0OCwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLQotICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgQWdnclNlcnZpY2VJbXBsIDogVGVzdEhhbmRsZXJJbXBsLCAgQWdnci5JZmFjZQorICAgICAgICBjbGFzcyBBZ2dyU2VydmljZUltcGwgOiBBZ2dyLklmYWNlCiAgICAgICAgIHsKICAgICAgICAgICAgIExpc3Q8aW50PiB2YWx1ZXMgPSBuZXcgTGlzdDxpbnQ+KCk7CiAKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlKGludCB2YWx1ZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZXMuQWRkKCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgdmFsdWVzLkFkZCh2YWx1ZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHB1YmxpYyBMaXN0PGludD4gZ2V0VmFsdWVzKCkKQEAgLTgwLDUyICs2Myw0NSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKCkKLSAgICAgICB7Ci0gICAgICAgICAgIHRyeQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvLyBjcmVhdGUgcHJvdG9jb2wgZmFjdG9yeSwgZGVmYXVsdCB0byBCaW5hcnlQcm90b2NvbAotICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkodHJ1ZSx0cnVlKTsKLSAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVydHJhbnMgICAgID0gbmV3IFRTZXJ2ZXJTb2NrZXQoIDkwOTAsIDAsIGZhbHNlKTsKLSAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCk7CisgICAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoaW50IHBvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBwcm90b2NvbCBmYWN0b3J5LCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCisgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkodHJ1ZSx0cnVlKTsKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlcnRyYW5zID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCwgMCwgZmFsc2UpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCk7CiAKLSAgICAgICAgICAgICAgIEJlbmNobWFya1NlcnZpY2UuSWZhY2UgYmVuY2hIYW5kbGVyID0gbmV3IEJlbmNobWFya1NlcnZpY2VJbXBsKCk7Ci0gICAgICAgICAgICAgICBUUHJvY2Vzc29yIGJlbmNoUHJvY2Vzc29yID0gbmV3IEJlbmNobWFya1NlcnZpY2UuUHJvY2Vzc29yKCBiZW5jaEhhbmRsZXIpOworICAgICAgICAgICAgICAgIEJlbmNobWFya1NlcnZpY2UuSWZhY2UgYmVuY2hIYW5kbGVyID0gbmV3IEJlbmNobWFya1NlcnZpY2VJbXBsKCk7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBiZW5jaFByb2Nlc3NvciA9IG5ldyBCZW5jaG1hcmtTZXJ2aWNlLlByb2Nlc3NvcihiZW5jaEhhbmRsZXIpOwogCi0gICAgICAgICAgICAgICBBZ2dyLklmYWNlIGFnZ3JIYW5kbGVyID0gbmV3IEFnZ3JTZXJ2aWNlSW1wbCgpOwotICAgICAgICAgICAgICAgVFByb2Nlc3NvciBhZ2dyUHJvY2Vzc29yID0gbmV3IEFnZ3IuUHJvY2Vzc29yKCBhZ2dySGFuZGxlcik7CisgICAgICAgICAgICAgICAgQWdnci5JZmFjZSBhZ2dySGFuZGxlciA9IG5ldyBBZ2dyU2VydmljZUltcGwoKTsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIGFnZ3JQcm9jZXNzb3IgPSBuZXcgQWdnci5Qcm9jZXNzb3IoYWdnckhhbmRsZXIpOwogCi0gICAgICAgICAgICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOwotICAgICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKENvbnN0YW50cy5OQU1FX0JFTkNITUFSS1NFUlZJQ0UsIGJlbmNoUHJvY2Vzc29yKTsKLSAgICAgICAgICAgICAgIG11bHRpcGxleC5SZWdpc3RlclByb2Nlc3NvcihDb25zdGFudHMuTkFNRV9BR0dSLCBhZ2dyUHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgICAgICAgICAgICAgIG11bHRpcGxleC5SZWdpc3RlclByb2Nlc3NvcihDb25zdGFudHMuTkFNRV9CRU5DSE1BUktTRVJWSUNFLCBiZW5jaFByb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKENvbnN0YW50cy5OQU1FX0FHR1IsIGFnZ3JQcm9jZXNzb3IpOwogCi0gICAgICAgICAgICAgICBUU2VydmVyIFNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKCBtdWx0aXBsZXgsIHNlcnZlcnRyYW5zLCBUcmFuc3BvcnRGYWN0b3J5LCBQcm90b2NvbEZhY3RvcnkpOworICAgICAgICAgICAgICAgIFRTZXJ2ZXIgU2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIobXVsdGlwbGV4LCBzZXJ2ZXJ0cmFucywgVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9jb2xGYWN0b3J5KTsKIAotICAgICAgICAgICAgICAgKGJlbmNoSGFuZGxlciBhcyBJVGVzdEhhbmRsZXIpLlNldFNlcnZlciggU2VydmVyRW5naW5lKTsKLSAgICAgICAgICAgICAgIChhZ2dySGFuZGxlciBhcyBJVGVzdEhhbmRsZXIpLlNldFNlcnZlciggU2VydmVyRW5naW5lKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlIHNlcnZlciAuLi4iKTsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJFbmdpbmUuU2VydmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlLk1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgc2VydmVyIC4uLiIpOwotICAgICAgICAgICAgICAgU2VydmVyRW5naW5lLlNlcnZlKCk7Ci0KLSAgICAgICAgICAgICAgIChiZW5jaEhhbmRsZXIgYXMgSVRlc3RIYW5kbGVyKS5TZXRTZXJ2ZXIobnVsbCk7Ci0gICAgICAgICAgICAgICAoYWdnckhhbmRsZXIgYXMgSVRlc3RIYW5kbGVyKS5TZXRTZXJ2ZXIobnVsbCk7Ci0KLSAgICAgICAgICAgfQotICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBlLk1lc3NhZ2UpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCAiZG9uZS4iKTsKLSAgICAgICB9Ci0KLQotICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKLSAgICAgICB7Ci0gICAgICAgICAgIEV4ZWN1dGUoKTsKLSAgICAgICB9CisgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3J0ID0gdXNob3J0LlBhcnNlKGFyZ3NbMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXhlY3V0ZShwb3J0KTsKKyAgICAgICAgfQogICAgIH0KLQotCi0KIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4U2VydmVyLmNzcHJvaiBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleFNlcnZlci5jc3Byb2oKaW5kZXggZGMxZDEyMy4uMjNkMzI1MyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4U2VydmVyLmNzcHJvagorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qCkBAIC00Niw3ICs0Niw3IEBACiAgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KICAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CiAgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KLSAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLiUyYTwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MC4xMy4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KICAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KICAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgogICA8L1Byb3BlcnR5R3JvdXA+CkBAIC0xNDUsNCArMTQ1LDQgQEAKIAogPC9QcmVCdWlsZEV2ZW50PgogICA8L1Byb3BlcnR5R3JvdXA+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwppbmRleCAzYTk1ODM5Li4yYjhhNmFmIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMjcsOSArMjcsOSBAQAogW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJNdWx0aXBsZXhTZXJ2ZXIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiTXVsdGlwbGV4U2VydmVyIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAxNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCiAKQEAgLTUxLDUgKzUxLDUgQEAKIC8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCiAvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgogLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMC45LjMuMCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIwLjkuMy4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMC4xMy4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC4xMy4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvbWFrZXRlc3Quc2ggYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L21ha2V0ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjI5ZWUyLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvbWFrZXRlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLS4uLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gY3NoYXJwICAuLi8uLi8uLi8uLi9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKLS4uLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gY3NoYXJwICAuLi8uLi8uLi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAotZ21jcyAvdDpsaWJyYXJ5IC9vdXQ6Li9UaHJpZnRJbXBsLmRsbCAvcmVjdXJzZTouL2dlbi1jc2hhcnAvKiAvcmVmZXJlbmNlOi4uLy4uL1RocmlmdC5kbGwgTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzCi1nbWNzICAvb3V0Ok11bHRpcGxleENsaWVudC5leGUgL3JlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsIC9yZWZlcmVuY2U6VGhyaWZ0SW1wbC5kbGwgQ2xpZW50L011bHRpcGxleC5UZXN0LkNsaWVudC5jcwotZ21jcyAgL291dDpNdWx0aXBsZXhTZXJ2ZXIuZXhlIC9yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAvcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsIFNlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MKLQotCi0KLWV4cG9ydCBNT05PX1BBVEg9Li4vLi4vCi0KLXRpbWVvdXQgMTIwIC4vTXVsdGlwbGV4U2VydmVyLmV4ZSAmCi1zbGVlcCAzOwotLi9NdWx0aXBsZXhDbGllbnQuZXhlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvRmlsdGVyQ29uZmlnLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L0ZpbHRlckNvbmZpZy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTUxODRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L0ZpbHRlckNvbmZpZy5jcwpAQCAtMCwwICsxLDMxIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uV2ViLk12YzsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbHRlckNvbmZpZworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyR2xvYmFsRmlsdGVycyhHbG9iYWxGaWx0ZXJDb2xsZWN0aW9uIGZpbHRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbHRlcnMuQWRkKG5ldyBIYW5kbGVFcnJvckF0dHJpYnV0ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9Sb3V0ZUNvbmZpZy5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9Sb3V0ZUNvbmZpZy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI2MDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L1JvdXRlQ29uZmlnLmNzCkBAIC0wLDAgKzEsMzkgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5XZWIuTXZjOwordXNpbmcgU3lzdGVtLldlYi5Sb3V0aW5nOworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVDb25maWcKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlclJvdXRlcyhSb3V0ZUNvbGxlY3Rpb24gcm91dGVzKQorICAgICAgICB7CisgICAgICAgICAgICByb3V0ZXMuSWdub3JlUm91dGUoIntyZXNvdXJjZX0udGhyaWZ0Iik7CisgICAgICAgICAgICByb3V0ZXMuSWdub3JlUm91dGUoIntyZXNvdXJjZX0uYXhkL3sqcGF0aEluZm99Iik7CisKKyAgICAgICAgICAgIHJvdXRlcy5NYXBSb3V0ZSgKKyAgICAgICAgICAgICAgICBuYW1lOiAiRGVmYXVsdCIsCisgICAgICAgICAgICAgICAgdXJsOiAie2NvbnRyb2xsZXJ9L3thY3Rpb259L3tpZH0iLAorICAgICAgICAgICAgICAgIGRlZmF1bHRzOiBuZXcgeyBjb250cm9sbGVyID0gIkhvbWUiLCBhY3Rpb24gPSAiSW5kZXgiLCBpZCA9IFVybFBhcmFtZXRlci5PcHRpb25hbCB9CisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXN5bmNIdHRwSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FzeW5jSHR0cEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyNjE4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FzeW5jSHR0cEhhbmRsZXIuY3MKQEAgLTAsMCArMSwzMiBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgQXN5bmNIdHRwSGFuZGxlciA6IFRIdHRwVGFza0FzeW5jSGFuZGxlcgorICAgIHsKKyAgICAgICAgcHVibGljIEFzeW5jSHR0cEhhbmRsZXIoKQorICAgICAgICAgICAgOiBiYXNlKAorICAgICAgICAgICAgICAgIG5ldyBUaHJpZnQuVGVzdC5TZWNvbmRTZXJ2aWNlLkFzeW5jUHJvY2Vzc29yKG5ldyBTZWNvbmRTZXJ2aWNlSW1wbCgpKSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0NvbnRyb2xsZXJzL0hvbWVDb250cm9sbGVyLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQ29udHJvbGxlcnMvSG9tZUNvbnRyb2xsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhMWVjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0NvbnRyb2xsZXJzL0hvbWVDb250cm9sbGVyLmNzCkBAIC0wLDAgKzEsNzAgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uV2ViLk12YzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5UZXN0OwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QuQ29udHJvbGxlcnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgSG9tZUNvbnRyb2xsZXIgOiBDb250cm9sbGVyCisgICAgeworICAgICAgICBwdWJsaWMgQWN0aW9uUmVzdWx0IEluZGV4KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFZpZXcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPEFjdGlvblJlc3VsdD4gVGVzdFRocmlmdEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJhc2VVcmkgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoInswfTovL3sxfXsyfSIsIFJlcXVlc3QuVXJsLlNjaGVtZSwgUmVxdWVzdC5VcmwuQXV0aG9yaXR5LAorICAgICAgICAgICAgICAgIFVybC5Db250ZW50KCJ+IikpKTsKKworICAgICAgICAgICAgU2Vjb25kU2VydmljZS5JQXN5bmMgYXN5bmNTZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBuZXcgU2Vjb25kU2VydmljZS5DbGllbnQobmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEh0dHBDbGllbnQobmV3IFVyaShiYXNlVXJpLCAiQXN5bmMudGhyaWZ0IikpKSk7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBhc3luY1NlcnZpY2Uuc2Vjb25kdGVzdFN0cmluZ0FzeW5jKCJUZXN0U3RyaW5nIik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9ICJ0ZXN0U3RyaW5nKFwiVGVzdFN0cmluZ1wiKSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIHdyb25nIHJlc3VsdCB3YXMgcmV0dXJuZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFJlZGlyZWN0VG9BY3Rpb24oIkluZGV4Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWN0aW9uUmVzdWx0IFRlc3RUaHJpZnRTeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJhc2VVcmkgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoInswfTovL3sxfXsyfSIsIFJlcXVlc3QuVXJsLlNjaGVtZSwgUmVxdWVzdC5VcmwuQXV0aG9yaXR5LAorICAgICAgICAgICAgICAgIFVybC5Db250ZW50KCJ+IikpKTsKKworICAgICAgICAgICAgU2Vjb25kU2VydmljZS5JU3luYyBzZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBuZXcgU2Vjb25kU2VydmljZS5DbGllbnQobmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEh0dHBDbGllbnQobmV3IFVyaShiYXNlVXJpLCAiU3luYy50aHJpZnQiKSkpKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNlcnZpY2Uuc2Vjb25kdGVzdFN0cmluZygiVGVzdFN0cmluZyIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAidGVzdFN0cmluZyhcIlRlc3RTdHJpbmdcIikiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSB3cm9uZyByZXN1bHQgd2FzIHJldHVybmVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBSZWRpcmVjdFRvQWN0aW9uKCJJbmRleCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXggYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmI2ODhjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXgKQEAgLTAsMCArMSwxOSBAQAor77u/PCVAIEFwcGxpY2F0aW9uIENvZGViZWhpbmQ9Ikdsb2JhbC5hc2F4LmNzIiBJbmhlcml0cz0iVGhyaWZ0TVZDVGVzdC5NdmNBcHBsaWNhdGlvbiIgTGFuZ3VhZ2U9IkMjIiAlPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXguY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTczMWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXguY3MKQEAgLTAsMCArMSwzNCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLldlYi5NdmM7Cit1c2luZyBTeXN0ZW0uV2ViLlJvdXRpbmc7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIE12Y0FwcGxpY2F0aW9uIDogU3lzdGVtLldlYi5IdHRwQXBwbGljYXRpb24KKyAgICB7CisgICAgICAgIHByb3RlY3RlZCB2b2lkIEFwcGxpY2F0aW9uX1N0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQXJlYVJlZ2lzdHJhdGlvbi5SZWdpc3RlckFsbEFyZWFzKCk7CisgICAgICAgICAgICBGaWx0ZXJDb25maWcuUmVnaXN0ZXJHbG9iYWxGaWx0ZXJzKEdsb2JhbEZpbHRlcnMuRmlsdGVycyk7CisgICAgICAgICAgICBSb3V0ZUNvbmZpZy5SZWdpc3RlclJvdXRlcyhSb3V0ZVRhYmxlLlJvdXRlcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MTJhYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDUzIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0TVZDVGVzdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJBIHdlYiBwcm9qZWN0IGZvciB0ZXN0aW5nIHRoZSB0aHJpZnQgQVNQLk5FVCBmZWF0dXJlcy4iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIjM2NmY5YmQwLTNjMGUtNDhhYS1iMmNhLTYxZmQ0YTkzZTQyNyIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuMTMuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuMTMuMC4wIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TZWNvbmRTZXJ2aWNlSW1wbC5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1NlY29uZFNlcnZpY2VJbXBsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDMwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TZWNvbmRTZXJ2aWNlSW1wbC5jcwpAQCAtMCwwICsxLDM3IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlRlc3Q7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIFNlY29uZFNlcnZpY2VJbXBsIDogU2Vjb25kU2VydmljZS5JQXN5bmMsIFNlY29uZFNlcnZpY2UuSVN5bmMKKyAgICB7CisgICAgICAgIHB1YmxpYyBUYXNrPHN0cmluZz4gc2Vjb25kdGVzdFN0cmluZ0FzeW5jKHN0cmluZyB0aGluZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIHNlY29uZHRlc3RTdHJpbmcoc3RyaW5nIHRoaW5nKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gInRlc3RTdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1N5bmNIdHRwSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1N5bmNIdHRwSGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUyNjYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU3luY0h0dHBIYW5kbGVyLmNzCkBAIC0wLDAgKzEsMzIgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIFN5bmNIdHRwSGFuZGxlciA6IFRIdHRwSGFuZGxlcgorICAgIHsKKyAgICAgICAgcHVibGljIFN5bmNIdHRwSGFuZGxlcigpCisgICAgICAgICAgICA6IGJhc2UoCisgICAgICAgICAgICAgICAgbmV3IFRocmlmdC5UZXN0LlNlY29uZFNlcnZpY2UuUHJvY2Vzc29yKG5ldyBTZWNvbmRTZXJ2aWNlSW1wbCgpKSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1RocmlmdE1WQ1Rlc3QuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVGhyaWZ0TVZDVGVzdC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViOTY5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1RocmlmdE1WQ1Rlc3QuY3Nwcm9qCkBAIC0wLDAgKzEsMjAwIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSIxMi4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoKVwkKE1TQnVpbGRUb29sc1ZlcnNpb24pXE1pY3Jvc29mdC5Db21tb24ucHJvcHMiIENvbmRpdGlvbj0iRXhpc3RzKCckKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzJykiIC8+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+CisgICAgPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9PC9Qcm9qZWN0R3VpZD4KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57MzQ5YzU4NTEtNjVkZi0xMWRhLTkzODQtMDAwNjViODQ2ZjIxfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnRNVkNUZXN0PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0TVZDVGVzdDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPE12Y0J1aWxkVmlld3M+ZmFsc2U8L012Y0J1aWxkVmlld3M+CisgICAgPFVzZUlJU0V4cHJlc3M+dHJ1ZTwvVXNlSUlTRXhwcmVzcz4KKyAgICA8SUlTRXhwcmVzc1NTTFBvcnQgLz4KKyAgICA8SUlTRXhwcmVzc0Fub255bW91c0F1dGhlbnRpY2F0aW9uIC8+CisgICAgPElJU0V4cHJlc3NXaW5kb3dzQXV0aGVudGljYXRpb24gLz4KKyAgICA8SUlTRXhwcmVzc1VzZUNsYXNzaWNQaXBlbGluZU1vZGUgLz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQ1NoYXJwIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRHJhd2luZyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuRHluYW1pY0RhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkVudGl0eSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuQXBwbGljYXRpb25TZXJ2aWNlcyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db21wb25lbnRNb2RlbC5EYXRhQW5ub3RhdGlvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYiIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuRXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuQWJzdHJhY3Rpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5Sb3V0aW5nIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db25maWd1cmF0aW9uIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5TZXJ2aWNlcyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5FbnRlcnByaXNlU2VydmljZXMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2ViLkluZnJhc3RydWN0dXJlLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuV2ViLkluZnJhc3RydWN0dXJlLjEuMC4wLjBcbGliXG5ldDQwXE1pY3Jvc29mdC5XZWIuSW5mcmFzdHJ1Y3R1cmUuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuSHR0cCI+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2ViUmVxdWVzdCI+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkhlbHBlcnMsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuSGVscGVycy5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5NdmMsIFZlcnNpb249NS4yLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuTXZjLjUuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLk12Yy5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5SYXpvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5SYXpvci4zLjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5SYXpvci5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5XZWJQYWdlcywgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5XZWJQYWdlcy4zLjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5XZWJQYWdlcy5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5EZXBsb3ltZW50LCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzLjMuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLldlYlBhZ2VzLkRlcGxveW1lbnQuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdEltcGwiPgorICAgICAgPEhpbnRQYXRoPi5cVGhyaWZ0SW1wbC5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBcHBfU3RhcnRcRmlsdGVyQ29uZmlnLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFwcF9TdGFydFxSb3V0ZUNvbmZpZy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTeW5jSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXN5bmNIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb250cm9sbGVyc1xIb21lQ29udHJvbGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHbG9iYWwuYXNheC5jcyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5HbG9iYWwuYXNheDwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2Vjb25kU2VydmljZUltcGwuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb250ZW50IEluY2x1ZGU9ImZhdmljb24uaWNvIiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9Ikdsb2JhbC5hc2F4IiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IldlYi5jb25maWciIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iV2ViLkRlYnVnLmNvbmZpZyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5XZWIuY29uZmlnPC9EZXBlbmRlbnRVcG9uPgorICAgIDwvQ29udGVudD4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJXZWIuUmVsZWFzZS5jb25maWciPgorICAgICAgPERlcGVuZGVudFVwb24+V2ViLmNvbmZpZzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbnRlbnQ+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcV2ViLmNvbmZpZyIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJWaWV3c1xfVmlld1N0YXJ0LmNzaHRtbCIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJWaWV3c1xTaGFyZWRcX0xheW91dC5jc2h0bWwiIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcSG9tZVxJbmRleC5jc2h0bWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxGb2xkZXIgSW5jbHVkZT0iQXBwX0RhdGFcIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJwYWNrYWdlcy5jb25maWciPgorICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+CisgICAgPC9Db250ZW50PgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxzcmNcVGhyaWZ0LjQ1LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57ZWJjZTM1ZGEtY2Y2YS00MmJjLWEzNTctYTljMDliNTM0Mjk5fTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdC40NTwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VmlzdWFsU3R1ZGlvVmVyc2lvbiBDb25kaXRpb249IickKFZpc3VhbFN0dWRpb1ZlcnNpb24pJyA9PSAnJyI+MTAuMDwvVmlzdWFsU3R1ZGlvVmVyc2lvbj4KKyAgICA8VlNUb29sc1BhdGggQ29uZGl0aW9uPSInJChWU1Rvb2xzUGF0aCknID09ICcnIj4kKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXHYkKFZpc3VhbFN0dWRpb1ZlcnNpb24pPC9WU1Rvb2xzUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZTVG9vbHNQYXRoKVxXZWJBcHBsaWNhdGlvbnNcTWljcm9zb2Z0LldlYkFwcGxpY2F0aW9uLnRhcmdldHMiIENvbmRpdGlvbj0iJyQoVlNUb29sc1BhdGgpJyAhPSAnJyIgLz4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXHYxMC4wXFdlYkFwcGxpY2F0aW9uc1xNaWNyb3NvZnQuV2ViQXBwbGljYXRpb24udGFyZ2V0cyIgQ29uZGl0aW9uPSJmYWxzZSIgLz4KKyAgPFRhcmdldCBOYW1lPSJNdmNCdWlsZFZpZXdzIiBBZnRlclRhcmdldHM9IkFmdGVyQnVpbGQiIENvbmRpdGlvbj0iJyQoTXZjQnVpbGRWaWV3cyknPT0ndHJ1ZSciPgorICAgIDxBc3BOZXRDb21waWxlciBWaXJ0dWFsUGF0aD0idGVtcCIgUGh5c2ljYWxQYXRoPSIkKFdlYlByb2plY3RPdXRwdXREaXIpIiAvPgorICA8L1RhcmdldD4KKyAgPFByb2plY3RFeHRlbnNpb25zPgorICAgIDxWaXN1YWxTdHVkaW8+CisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7MzQ5YzU4NTEtNjVkZi0xMWRhLTkzODQtMDAwNjViODQ2ZjIxfSI+CisgICAgICAgIDxXZWJQcm9qZWN0UHJvcGVydGllcz4KKyAgICAgICAgICA8VXNlSUlTPlRydWU8L1VzZUlJUz4KKyAgICAgICAgICA8QXV0b0Fzc2lnblBvcnQ+VHJ1ZTwvQXV0b0Fzc2lnblBvcnQ+CisgICAgICAgICAgPERldmVsb3BtZW50U2VydmVyUG9ydD41NzQ4MjwvRGV2ZWxvcG1lbnRTZXJ2ZXJQb3J0PgorICAgICAgICAgIDxEZXZlbG9wbWVudFNlcnZlclZQYXRoPi88L0RldmVsb3BtZW50U2VydmVyVlBhdGg+CisgICAgICAgICAgPElJU1VybD5odHRwOi8vbG9jYWxob3N0OjU3NDgyLzwvSUlTVXJsPgorICAgICAgICAgIDxOVExNQXV0aGVudGljYXRpb24+RmFsc2U8L05UTE1BdXRoZW50aWNhdGlvbj4KKyAgICAgICAgICA8VXNlQ3VzdG9tU2VydmVyPkZhbHNlPC9Vc2VDdXN0b21TZXJ2ZXI+CisgICAgICAgICAgPEN1c3RvbVNlcnZlclVybD4KKyAgICAgICAgICA8L0N1c3RvbVNlcnZlclVybD4KKyAgICAgICAgICA8U2F2ZVNlcnZlclNldHRpbmdzSW5Vc2VyRmlsZT5GYWxzZTwvU2F2ZVNlcnZlclNldHRpbmdzSW5Vc2VyRmlsZT4KKyAgICAgICAgPC9XZWJQcm9qZWN0UHJvcGVydGllcz4KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4KKyAgICA8L1Zpc3VhbFN0dWRpbz4KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+cm1kaXIgL3MgL3EgIiQoUHJvamVjdERpcilnZW4tY3NoYXJwIgorZGVsIC9mIC9xICIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiCitTRVQgT1VUUFVUX0RJUj0kKFByb2plY3REaXIpCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlx0ZXN0XFRocmlmdFRlc3QudGhyaWZ0Citmb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKK2ZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKKyIkKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFxEZWJ1Z1x0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnA6YXN5bmM9dHJ1ZSAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CisiJChNU0J1aWxkVG9vbHNQYXRoKVxDc2MuZXhlIiAvdDpsaWJyYXJ5IC9vdXQ6IiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIgL3JlY3Vyc2U6IiQoUHJvamVjdERpcilnZW4tY3NoYXJwIlwqIC9yZWZlcmVuY2U6IiQoUHJvamVjdERpcikuLlwuLlxzcmNcYmluXERlYnVnXFRocmlmdDQ1LmRsbCI8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+IC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL0hvbWUvSW5kZXguY3NodG1sIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvSG9tZS9JbmRleC5jc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjYTdkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL0hvbWUvSW5kZXguY3NodG1sCkBAIC0wLDAgKzEsMjUgQEAKK++7v0AqCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisqQAorCitAeworICAgIFZpZXdCYWcuVGl0bGUgPSAiSG9tZSBQYWdlIjsKK30KKworPHA+QEh0bWwuQWN0aW9uTGluaygiVGVzdCBUaHJpZnQgQXN5bmMgU2VydmljZSIsICJUZXN0VGhyaWZ0QXN5bmMiKTwvcD4KKzxwPkBIdG1sLkFjdGlvbkxpbmsoIlRlc3QgVGhyaWZ0IFN5bmMgU2VydmljZSIsICJUZXN0VGhyaWZ0U3luYyIpPC9wPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MWM5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9TaGFyZWQvX0xheW91dC5jc2h0bWwKQEAgLTAsMCArMSwzMCBAQAor77u/QCoKKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKypACisKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCIgLz4KKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CisgICAgPHRpdGxlPlRocmlmdCBBU1AuTkVUIFRlc3Q8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgQFJlbmRlckJvZHkoKQorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvV2ViLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1dlYi5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyMTEzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1dlYi5jb25maWcKQEAgLTAsMCArMSw2MCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbj4KKyAgPGNvbmZpZ1NlY3Rpb25zPgorICAgIDxzZWN0aW9uR3JvdXAgbmFtZT0ic3lzdGVtLndlYi53ZWJQYWdlcy5yYXpvciIgdHlwZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvci5Db25maWd1cmF0aW9uLlJhem9yV2ViU2VjdGlvbkdyb3VwLCBTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSI+CisgICAgICA8c2VjdGlvbiBuYW1lPSJob3N0IiB0eXBlPSJTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLkNvbmZpZ3VyYXRpb24uSG9zdFNlY3Rpb24sIFN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1IiByZXF1aXJlUGVybWlzc2lvbj0iZmFsc2UiIC8+CisgICAgICA8c2VjdGlvbiBuYW1lPSJwYWdlcyIgdHlwZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvci5Db25maWd1cmF0aW9uLlJhem9yUGFnZXNTZWN0aW9uLCBTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIgcmVxdWlyZVBlcm1pc3Npb249ImZhbHNlIiAvPgorICAgIDwvc2VjdGlvbkdyb3VwPgorICA8L2NvbmZpZ1NlY3Rpb25zPgorCisgIDxzeXN0ZW0ud2ViLndlYlBhZ2VzLnJhem9yPgorICAgIDxob3N0IGZhY3RvcnlUeXBlPSJTeXN0ZW0uV2ViLk12Yy5NdmNXZWJSYXpvckhvc3RGYWN0b3J5LCBTeXN0ZW0uV2ViLk12YywgVmVyc2lvbj01LjIuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIC8+CisgICAgPHBhZ2VzIHBhZ2VCYXNlVHlwZT0iU3lzdGVtLldlYi5NdmMuV2ViVmlld1BhZ2UiPgorICAgICAgPG5hbWVzcGFjZXM+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLk12YyIgLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuTXZjLkFqYXgiIC8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLk12Yy5IdG1sIiAvPgorICAgICAgICA8YWRkIG5hbWVzcGFjZT0iU3lzdGVtLldlYi5PcHRpbWl6YXRpb24iLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuUm91dGluZyIgLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlRocmlmdE1WQ1Rlc3QiIC8+CisgICAgICA8L25hbWVzcGFjZXM+CisgICAgPC9wYWdlcz4KKyAgPC9zeXN0ZW0ud2ViLndlYlBhZ2VzLnJhem9yPgorCisgIDxhcHBTZXR0aW5ncz4KKyAgICA8YWRkIGtleT0id2VicGFnZXM6RW5hYmxlZCIgdmFsdWU9ImZhbHNlIiAvPgorICA8L2FwcFNldHRpbmdzPgorCisgIDxzeXN0ZW0ud2ViU2VydmVyPgorICAgIDxoYW5kbGVycz4KKyAgICAgIDxyZW1vdmUgbmFtZT0iQmxvY2tWaWV3SGFuZGxlciIvPgorICAgICAgPGFkZCBuYW1lPSJCbG9ja1ZpZXdIYW5kbGVyIiBwYXRoPSIqIiB2ZXJiPSIqIiBwcmVDb25kaXRpb249ImludGVncmF0ZWRNb2RlIiB0eXBlPSJTeXN0ZW0uV2ViLkh0dHBOb3RGb3VuZEhhbmRsZXIiIC8+CisgICAgPC9oYW5kbGVycz4KKyAgPC9zeXN0ZW0ud2ViU2VydmVyPgorCisgIDxzeXN0ZW0ud2ViPgorICAgIDxjb21waWxhdGlvbj4KKyAgICAgIDxhc3NlbWJsaWVzPgorICAgICAgICA8YWRkIGFzc2VtYmx5PSJTeXN0ZW0uV2ViLk12YywgVmVyc2lvbj01LjIuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIC8+CisgICAgICA8L2Fzc2VtYmxpZXM+CisgICAgPC9jb21waWxhdGlvbj4KKyAgPC9zeXN0ZW0ud2ViPgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvX1ZpZXdTdGFydC5jc2h0bWwgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9fVmlld1N0YXJ0LmNzaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2RlMmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvX1ZpZXdTdGFydC5jc2h0bWwKQEAgLTAsMCArMSwyMiBAQAor77u/QCoKKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKypACisKK0B7CisgICAgTGF5b3V0ID0gIn4vVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sIjsKK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5EZWJ1Zy5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuRGVidWcuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDU2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuRGVidWcuY29uZmlnCkBAIC0wLDAgKzEsNDUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24geG1sbnM6eGR0PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL1hNTC1Eb2N1bWVudC1UcmFuc2Zvcm0iPgorICA8IS0tCisgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSAiU2V0QXR0cmlidXRlcyIgdHJhbnNmb3JtIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZgorICAgICJjb25uZWN0aW9uU3RyaW5nIiB0byB1c2UgIlJlbGVhc2VTUUxTZXJ2ZXIiIG9ubHkgd2hlbiB0aGUgIk1hdGNoIiBsb2NhdG9yCisgICAgZmluZHMgYW4gYXR0cmlidXRlICJuYW1lIiB0aGF0IGhhcyBhIHZhbHVlIG9mICJNeURCIi4KKworICAgIDxjb25uZWN0aW9uU3RyaW5ncz4KKyAgICAgIDxhZGQgbmFtZT0iTXlEQiIKKyAgICAgICAgY29ubmVjdGlvblN0cmluZz0iRGF0YSBTb3VyY2U9UmVsZWFzZVNRTFNlcnZlcjtJbml0aWFsIENhdGFsb2c9TXlSZWxlYXNlREI7SW50ZWdyYXRlZCBTZWN1cml0eT1UcnVlIgorICAgICAgICB4ZHQ6VHJhbnNmb3JtPSJTZXRBdHRyaWJ1dGVzIiB4ZHQ6TG9jYXRvcj0iTWF0Y2gobmFtZSkiLz4KKyAgICA8L2Nvbm5lY3Rpb25TdHJpbmdzPgorICAtLT4KKyAgPHN5c3RlbS53ZWI+CisgICAgPCEtLQorICAgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSAiUmVwbGFjZSIgdHJhbnNmb3JtIHdpbGwgcmVwbGFjZSB0aGUgZW50aXJlCisgICAgICA8Y3VzdG9tRXJyb3JzPiBzZWN0aW9uIG9mIHlvdXIgV2ViLmNvbmZpZyBmaWxlLgorICAgICAgTm90ZSB0aGF0IGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgY3VzdG9tRXJyb3JzIHNlY3Rpb24gdW5kZXIgdGhlCisgICAgICA8c3lzdGVtLndlYj4gbm9kZSwgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgdGhlICJ4ZHQ6TG9jYXRvciIgYXR0cmlidXRlLgorCisgICAgICA8Y3VzdG9tRXJyb3JzIGRlZmF1bHRSZWRpcmVjdD0iR2VuZXJpY0Vycm9yLmh0bSIKKyAgICAgICAgbW9kZT0iUmVtb3RlT25seSIgeGR0OlRyYW5zZm9ybT0iUmVwbGFjZSI+CisgICAgICAgIDxlcnJvciBzdGF0dXNDb2RlPSI1MDAiIHJlZGlyZWN0PSJJbnRlcm5hbEVycm9yLmh0bSIvPgorICAgICAgPC9jdXN0b21FcnJvcnM+CisgICAgLS0+CisgIDwvc3lzdGVtLndlYj4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5SZWxlYXNlLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5SZWxlYXNlLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTdjMzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLlJlbGVhc2UuY29uZmlnCkBAIC0wLDAgKzEsNDYgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24geG1sbnM6eGR0PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL1hNTC1Eb2N1bWVudC1UcmFuc2Zvcm0iPgorICA8IS0tCisgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSAiU2V0QXR0cmlidXRlcyIgdHJhbnNmb3JtIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZgorICAgICJjb25uZWN0aW9uU3RyaW5nIiB0byB1c2UgIlJlbGVhc2VTUUxTZXJ2ZXIiIG9ubHkgd2hlbiB0aGUgIk1hdGNoIiBsb2NhdG9yCisgICAgZmluZHMgYW4gYXR0cmlidXRlICJuYW1lIiB0aGF0IGhhcyBhIHZhbHVlIG9mICJNeURCIi4KKworICAgIDxjb25uZWN0aW9uU3RyaW5ncz4KKyAgICAgIDxhZGQgbmFtZT0iTXlEQiIKKyAgICAgICAgY29ubmVjdGlvblN0cmluZz0iRGF0YSBTb3VyY2U9UmVsZWFzZVNRTFNlcnZlcjtJbml0aWFsIENhdGFsb2c9TXlSZWxlYXNlREI7SW50ZWdyYXRlZCBTZWN1cml0eT1UcnVlIgorICAgICAgICB4ZHQ6VHJhbnNmb3JtPSJTZXRBdHRyaWJ1dGVzIiB4ZHQ6TG9jYXRvcj0iTWF0Y2gobmFtZSkiLz4KKyAgICA8L2Nvbm5lY3Rpb25TdHJpbmdzPgorICAtLT4KKyAgPHN5c3RlbS53ZWI+CisgICAgPGNvbXBpbGF0aW9uIHhkdDpUcmFuc2Zvcm09IlJlbW92ZUF0dHJpYnV0ZXMoZGVidWcpIiAvPgorICAgIDwhLS0KKyAgICAgIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgIlJlcGxhY2UiIHRyYW5zZm9ybSB3aWxsIHJlcGxhY2UgdGhlIGVudGlyZQorICAgICAgPGN1c3RvbUVycm9ycz4gc2VjdGlvbiBvZiB5b3VyIFdlYi5jb25maWcgZmlsZS4KKyAgICAgIE5vdGUgdGhhdCBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lIGN1c3RvbUVycm9ycyBzZWN0aW9uIHVuZGVyIHRoZQorICAgICAgPHN5c3RlbS53ZWI+IG5vZGUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIHRoZSAieGR0OkxvY2F0b3IiIGF0dHJpYnV0ZS4KKworICAgICAgPGN1c3RvbUVycm9ycyBkZWZhdWx0UmVkaXJlY3Q9IkdlbmVyaWNFcnJvci5odG0iCisgICAgICAgIG1vZGU9IlJlbW90ZU9ubHkiIHhkdDpUcmFuc2Zvcm09IlJlcGxhY2UiPgorICAgICAgICA8ZXJyb3Igc3RhdHVzQ29kZT0iNTAwIiByZWRpcmVjdD0iSW50ZXJuYWxFcnJvci5odG0iLz4KKyAgICAgIDwvY3VzdG9tRXJyb3JzPgorICAgIC0tPgorICA8L3N5c3RlbS53ZWI+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuY29uZmlnIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzU3ZDExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLmNvbmZpZwpAQCAtMCwwICsxLDkyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorCis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KKyAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbmZpZ3VyZSB5b3VyIEFTUC5ORVQgYXBwbGljYXRpb24sIHBsZWFzZSB2aXNpdAorICBodHRwOi8vZ28ubWljcm9zb2Z0LmNvbS9md2xpbmsvP0xpbmtJZD0zMDE4ODAKKyAgLS0+Cis8Y29uZmlndXJhdGlvbj4KKyAgPGFwcFNldHRpbmdzPgorICAgIDxhZGQga2V5PSJ3ZWJwYWdlczpWZXJzaW9uIiB2YWx1ZT0iMy4wLjAuMCIgLz4KKyAgICA8YWRkIGtleT0id2VicGFnZXM6RW5hYmxlZCIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxhZGQga2V5PSJDbGllbnRWYWxpZGF0aW9uRW5hYmxlZCIgdmFsdWU9InRydWUiIC8+CisgICAgPGFkZCBrZXk9IlVub2J0cnVzaXZlSmF2YVNjcmlwdEVuYWJsZWQiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxhZGQga2V5PSJvd2luOkF1dG9tYXRpY0FwcFN0YXJ0dXAiIHZhbHVlPSJmYWxzZSIgLz4KKyAgPC9hcHBTZXR0aW5ncz4KKyAgPHN5c3RlbS53ZWI+CisgICAgPGF1dGhlbnRpY2F0aW9uIG1vZGU9Ik5vbmUiIC8+CisgICAgPGNvbXBpbGF0aW9uIGRlYnVnPSJ0cnVlIiB0YXJnZXRGcmFtZXdvcms9IjQuNSIgLz4KKyAgICA8aHR0cFJ1bnRpbWUgdGFyZ2V0RnJhbWV3b3JrPSI0LjUiIC8+CisgIDwvc3lzdGVtLndlYj4KKyAgPHN5c3RlbS53ZWJTZXJ2ZXI+CisgICAgPG1vZHVsZXM+CisgICAgICA8cmVtb3ZlIG5hbWU9IkZvcm1zQXV0aGVudGljYXRpb24iIC8+CisgICAgPC9tb2R1bGVzPgorICAgIDxoYW5kbGVycz4KKyAgICAgIDxhZGQgbmFtZT0iQXN5bmNIdHRwSGFuZGxlciIgdmVyYj0iKiIgcGF0aD0iQXN5bmMudGhyaWZ0IiB0eXBlPSJUaHJpZnRNVkNUZXN0LkFzeW5jSHR0cEhhbmRsZXIsIFRocmlmdE1WQ1Rlc3QiIC8+CisgICAgICA8YWRkIG5hbWU9IlN5bmNIdHRwSGFuZGxlciIgdmVyYj0iKiIgcGF0aD0iU3luYy50aHJpZnQiIHR5cGU9IlRocmlmdE1WQ1Rlc3QuU3luY0h0dHBIYW5kbGVyLCBUaHJpZnRNVkNUZXN0IiAvPgorICAgIDwvaGFuZGxlcnM+CisgIDwvc3lzdGVtLndlYlNlcnZlcj4KKyAgPHJ1bnRpbWU+CisgICAgPGFzc2VtYmx5QmluZGluZyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiPgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJNaWNyb3NvZnQuT3dpbi5TZWN1cml0eSIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMC4wLjAuMC0zLjAuMS4wIiBuZXdWZXJzaW9uPSIzLjAuMS4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iTWljcm9zb2Z0Lk93aW4uU2VjdXJpdHkuT0F1dGgiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMy4wLjEuMCIgbmV3VmVyc2lvbj0iMy4wLjEuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9Ik1pY3Jvc29mdC5Pd2luLlNlY3VyaXR5LkNvb2tpZXMiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMy4wLjEuMCIgbmV3VmVyc2lvbj0iMy4wLjEuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9Ik1pY3Jvc29mdC5Pd2luIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTMuMC4xLjAiIG5ld1ZlcnNpb249IjMuMC4xLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJOZXd0b25zb2Z0Lkpzb24iIGN1bHR1cmU9Im5ldXRyYWwiIHB1YmxpY0tleVRva2VuPSIzMGFkNGZlNmIyYTZhZWVkIiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtNi4wLjAuMCIgbmV3VmVyc2lvbj0iNi4wLjAuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XZWIuT3B0aW1pemF0aW9uIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuMC4wLTEuMS4wLjAiIG5ld1ZlcnNpb249IjEuMS4wLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJXZWJHcmVhc2UiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMS41LjIuMTQyMzQiIG5ld1ZlcnNpb249IjEuNS4yLjE0MjM0IiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldlYi5IZWxwZXJzIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuMC4wLTMuMC4wLjAiIG5ld1ZlcnNpb249IjMuMC4wLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2ViLk12YyIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC01LjIuMy4wIiBuZXdWZXJzaW9uPSI1LjIuMy4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldlYi5XZWJQYWdlcyIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC0zLjAuMC4wIiBuZXdWZXJzaW9uPSIzLjAuMC4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICA8L2Fzc2VtYmx5QmluZGluZz4KKyAgPC9ydW50aW1lPgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L2Zhdmljb24uaWNvIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvZmF2aWNvbi5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhNzk5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L2Zhdmljb24uaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L3BhY2thZ2VzLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L3BhY2thZ2VzLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGM4NDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvcGFja2FnZXMuY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cGFja2FnZXM+CisgIDxwYWNrYWdlIGlkPSJNaWNyb3NvZnQuQXNwTmV0Lk12YyIgdmVyc2lvbj0iNS4yLjMiIHRhcmdldEZyYW1ld29yaz0ibmV0NDUiIC8+CisgIDxwYWNrYWdlIGlkPSJNaWNyb3NvZnQuQXNwTmV0LlJhem9yIiB2ZXJzaW9uPSIzLjIuMyIgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgLz4KKyAgPHBhY2thZ2UgaWQ9Ik1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMiIHZlcnNpb249IjMuMi4zIiB0YXJnZXRGcmFtZXdvcms9Im5ldDQ1IiAvPgorICA8cGFja2FnZSBpZD0iTWljcm9zb2Z0LldlYi5JbmZyYXN0cnVjdHVyZSIgdmVyc2lvbj0iMS4wLjAuMCIgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgLz4KKzwvcGFja2FnZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdFRlc3QvTWFrZWZpbGUuYW0gYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyNWM5MC4uMDAwMDAwMAotLS0gYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotaWYgTU9OT19NQ1MKLUNTQz1tY3MKLWVsc2UKLUNTQz1nbWNzCi1lbmRpZgotCi1zdHViczogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNzaGFycCAtbyAuICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotCi1wcmVjcm9zczogVGVzdENsaWVudFNlcnZlci5leGUKLQotVGhyaWZ0SW1wbC5kbGw6IHN0dWJzCi0JJChDU0MpIC90OmxpYnJhcnkgL291dDouL1RocmlmdEltcGwuZGxsIC9yZWN1cnNlOi4vZ2VuLWNzaGFycC8qIC9yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbAotCi1UZXN0Q2xpZW50U2VydmVyLmV4ZTogVGVzdENsaWVudC5jcyBUZXN0U2VydmVyLmNzIFByb2dyYW0uY3MgVGhyaWZ0SW1wbC5kbGwKLQkkKENTQykgIC9vdXQ6VGVzdENsaWVudFNlcnZlci5leGUgL3JlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsIC9yZWZlcmVuY2U6VGhyaWZ0SW1wbC5kbGwgVGVzdENsaWVudC5jcyBUZXN0U2VydmVyLmNzIFByb2dyYW0uY3MKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Byb2dyYW0uY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9Qcm9ncmFtLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTQyNDViLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Byb2dyYW0uY3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQotLy8KLS8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKLS8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Ci11c2luZyBUaHJpZnQuUHJvdG9jb2w7Ci11c2luZyBUaHJpZnQuVGVzdDsgLy9nZW5lcmF0ZWQgY29kZQotCi1uYW1lc3BhY2UgVGVzdAotewotICAgIGNsYXNzIFByb2dyYW0KLSAgICB7Ci0gICAgICAgIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgibXVzdCBwcm92aWRlICdzZXJ2ZXInIG9yICdjbGllbnQnIGFyZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyaW5nW10gc3ViQXJncyA9IG5ldyBzdHJpbmdbYXJncy5MZW5ndGggLSAxXTsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1YkFyZ3NbaS0xXSA9IGFyZ3NbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXJnc1swXSA9PSAiY2xpZW50IikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGVzdENsaWVudC5FeGVjdXRlKHN1YkFyZ3MpID8gMCA6IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhcmdzWzBdID09ICJzZXJ2ZXIiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBUZXN0U2VydmVyLkV4ZWN1dGUoc3ViQXJncykgPyAwIDogMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSAnc2VydmVyJyBvciAnY2xpZW50JyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmE0YTIzLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Ci11c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7Ci0KLS8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKLS8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCi0vLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCi1bYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlRocmlmdFRlc3QiKV0KLVthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0VGVzdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIDIwMTUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KLQotLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCi0vLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCi0vLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCi1bYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQotCi0vLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KLVthc3NlbWJseTogR3VpZCgiZjQxYjE5M2ItZjFhYi00OGVlLTg4NDMtZjg4ZTQzMDg0ZTI2IildCi0KLS8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6Ci0vLwotLy8gICAgICBNYWpvciBWZXJzaW9uCi0vLyAgICAgIE1pbm9yIFZlcnNpb24KLS8vICAgICAgQnVpbGQgTnVtYmVyCi0vLyAgICAgIFJldmlzaW9uCi0vLwotLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKLS8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6Ci0vLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjkuMy4wIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuOS4zLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Rlc3RDbGllbnQuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9UZXN0Q2xpZW50LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODk0OWFjLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Rlc3RDbGllbnQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Ci11c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Ci11c2luZyBUaHJpZnQuUHJvdG9jb2w7Ci11c2luZyBUaHJpZnQuVHJhbnNwb3J0OwotdXNpbmcgVGhyaWZ0LlRlc3Q7Ci0KLW5hbWVzcGFjZSBUZXN0Ci17Ci0gICAgcHVibGljIGNsYXNzIFRlc3RDbGllbnQKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBudW1JdGVyYXRpb25zID0gMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIHByb3RvY29sID0gIiI7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEV4ZWN1dGUoc3RyaW5nW10gYXJncykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKLSAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IDkwOTA7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHVybCA9IG51bGwsIHBpcGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGludCBudW1UaHJlYWRzID0gMTsKLSAgICAgICAgICAgICAgICBib29sIGJ1ZmZlcmVkID0gZmFsc2UsIGZyYW1lZCA9IGZhbHNlLCBlbmNyeXB0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzdHJpbmcgY2VydFBhdGggPSAiLi4vLi4vLi4vLi4vLi4va2V5cy9zZXJ2ZXIucGVtIjsKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSAiLXUiKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1uIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1JdGVyYXRpb25zID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItcGlwZSIpICAvLyAtcGlwZSA8bmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBuYW1lZCBwaXBlcyB0cmFuc3BvcnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0taG9zdD0iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0ID0gYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0tcG9ydD0iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0gaW50LlBhcnNlKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpKzEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItLWJ1ZmZlcmVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1idWZmZXJlZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBidWZmZXJlZCBzb2NrZXRzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiICB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1mcmFtZWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGZyYW1lZCB0cmFuc3BvcnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi10IikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1UaHJlYWRzID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9Y29tcGFjdCIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSAiY29tcGFjdCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGNvbXBhY3QgcHJvdG9jb2wiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJqc29uIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgSlNPTiBwcm90b2NvbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1zc2wiKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGVuY3J5cHRlZCB0cmFuc3BvcnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1jZXJ0PSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRQYXRoID0gYXJnc1tpXS5TdWJzdHJpbmcoIi0tY2VydD0iLkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZS5TdGFja1RyYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKLSAgICAgICAgICAgICAgICBUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFtudW1UaHJlYWRzXTsKLSAgICAgICAgICAgICAgICBEYXRlVGltZSBzdGFydCA9IERhdGVUaW1lLk5vdzsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB0ZXN0ID0gMDsgdGVzdCA8IG51bVRocmVhZHM7IHRlc3QrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUGFyYW1ldGVyaXplZFRocmVhZFN0YXJ0KENsaWVudFRocmVhZCkpOwotICAgICAgICAgICAgICAgICAgICB0aHJlYWRzW3Rlc3RdID0gdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmRwb2ludCB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpcGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHBpcGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNyeXB0ZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRUTFNTb2NrZXQoaG9zdCwgcG9ydCwgY2VydFBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldChob3N0LCBwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF5ZXJlZCB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMgYXMgVFN0cmVhbVRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2Vuc3VyZSBwcm9wZXIgb3Blbi9jbG9zZSBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLk9wZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLkNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LlN0YXJ0KHRyYW5zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRIdHRwQ2xpZW50IGh0dHAgPSBuZXcgVEh0dHBDbGllbnQobmV3IFVyaSh1cmwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQuU3RhcnQoaHR0cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCB0ZXN0ID0gMDsgdGVzdCA8IG51bVRocmVhZHM7IHRlc3QrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocmVhZHNbdGVzdF0uSm9pbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUb3RhbCB0aW1lOiAiICsgKERhdGVUaW1lLk5vdyAtIHN0YXJ0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIG91dGVyRXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUob3V0ZXJFeC5NZXNzYWdlICsgIiBTVDogIiArIG91dGVyRXguU3RhY2tUcmFjZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIENsaWVudFRocmVhZChvYmplY3Qgb2JqKQotICAgICAgICB7Ci0gICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IChUVHJhbnNwb3J0KW9iajsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtSXRlcmF0aW9uczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENsaWVudFRlc3QodHJhbnNwb3J0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgQnl0ZXNUb0hleChieXRlW10gZGF0YSkgewotICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5Ub1N0cmluZyhkYXRhKS5SZXBsYWNlKCItIiwgc3RyaW5nLkVtcHR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIFByZXBhcmVUZXN0RGF0YShib29sIHJhbmRvbURpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSByZXR2YWwgPSBuZXcgYnl0ZVsweDEwMF07Ci0gICAgICAgICAgICBpbnQgaW5pdExlbiA9IE1hdGguTWluKDB4MTAwLHJldHZhbC5MZW5ndGgpOwotCi0gICAgICAgICAgICAvLyBsaW5lYXIgZGlzdHJpYnV0aW9uLCB1bmxlc3MgcmFuZG9tIGlzIHJlcXVlc3RlZAotICAgICAgICAgICAgaWYgKCFyYW5kb21EaXN0KSB7Ci0gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpIHsgCi0gICAgICAgICAgICAgICAgICAgIHJldHZhbFtpXSA9IChieXRlKWk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJhbmRvbSBkaXN0cmlidXRpb24KLSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKSB7IAotICAgICAgICAgICAgICAgIHJldHZhbFtpXSA9IChieXRlKTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgcm5kID0gbmV3IFJhbmRvbSgpOwotICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBpbml0TGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICB3aGlsZSggdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dFBvcyA9IHJuZC5OZXh0KCkgJSBpbml0TGVuOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsW25leHRQb3NdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbFtuZXh0UG9zXSA9IChieXRlKWk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ2xpZW50VGVzdChUVHJhbnNwb3J0IHRyYW5zcG9ydCkKLSAgICAgICAgewotICAgICAgICAgICAgVFByb3RvY29sIHByb3RvOwotICAgICAgICAgICAgaWYgKHByb3RvY29sID09ICJjb21wYWN0IikKLSAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChwcm90b2NvbCA9PSAianNvbiIpCi0gICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwotCi0gICAgICAgICAgICBUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQocHJvdG8pOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCF0cmFuc3BvcnQuSXNPcGVuKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNvbm5lY3QgZmFpbGVkOiAiICsgdHR4Lk1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9uZyBzdGFydCA9IERhdGVUaW1lLk5vdy5Ub0ZpbGVUaW1lKCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKLSAgICAgICAgICAgIGNsaWVudC50ZXN0Vm9pZCgpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHZvaWQiKTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKLSAgICAgICAgICAgIHN0cmluZyBzID0gY2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKHRydWUpIik7Ci0gICAgICAgICAgICBib29sIHQgPSBjbGllbnQudGVzdEJvb2woKGJvb2wpdHJ1ZSk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHQpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJvb2woZmFsc2UpIik7Ci0gICAgICAgICAgICBib29sIGYgPSBjbGllbnQudGVzdEJvb2woKGJvb2wpZmFsc2UpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBmKTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJ5dGUoMSkiKTsKLSAgICAgICAgICAgIHNieXRlIGk4ID0gY2xpZW50LnRlc3RCeXRlKChzYnl0ZSkxKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTgpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STMyKC0xKSIpOwotICAgICAgICAgICAgaW50IGkzMiA9IGNsaWVudC50ZXN0STMyKC0xKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTMyKTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7Ci0gICAgICAgICAgICBsb25nIGk2NCA9IGNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGk2NCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7Ci0gICAgICAgICAgICBkb3VibGUgZHViID0gY2xpZW50LnRlc3REb3VibGUoNS4zMjUwOTgyMzUpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOwotCi0gICAgICAgICAgICBieXRlW10gYmluT3V0ID0gUHJlcGFyZVRlc3REYXRhKHRydWUpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJpbmFyeSgiICsgQnl0ZXNUb0hleChiaW5PdXQpICsgIikiKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ5dGVbXSBiaW5JbiA9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBCeXRlc1RvSGV4KGJpbkluKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbkluLkxlbmd0aCAhPSBiaW5PdXQuTGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0QmluYXJ5OiBsZW5ndGggbWlzbWF0Y2giKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBvZnMgPSAwOyBvZnMgPCBNYXRoLk1pbihiaW5Jbi5MZW5ndGgsIGJpbk91dC5MZW5ndGgpOyArK29mcykKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluW29mc10gIT0gYmluT3V0W29mc10pCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0QmluYXJ5OiBjb250ZW50IG1pc21hdGNoIGF0IG9mZnNldCAiICsgb2ZzLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24gZSkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJpbmFyeSgiICsgQnl0ZXNUb0hleChiaW5PdXQpICsgIik6ICIrZS5NZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYmluYXJ5IGVxdWFscz8gb25seSB3aXRoIGhhc2hjb2RlIG9wdGlvbiBlbmFibGVkIC4uLgotICAgICAgICAgICAgaWYoIHR5cGVvZihDcmF6eU5lc3RpbmcpLkdldE1ldGhvZCgiRXF1YWxzIikuRGVjbGFyaW5nVHlwZSA9PSB0eXBlb2YoQ3JhenlOZXN0aW5nKSkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JhenlOZXN0aW5nIG9uZSA9IG5ldyBDcmF6eU5lc3RpbmcoKTsKLSAgICAgICAgICAgICAgICBDcmF6eU5lc3RpbmcgdHdvID0gbmV3IENyYXp5TmVzdGluZygpOwotICAgICAgICAgICAgICAgIG9uZS5TdHJpbmdfZmllbGQgPSAiY3JhenkiOwotICAgICAgICAgICAgICAgIHR3by5TdHJpbmdfZmllbGQgPSAiY3JhenkiOwotICAgICAgICAgICAgICAgIG9uZS5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVsxMF0geyAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweEZGIH07Ci0gICAgICAgICAgICAgICAgdHdvLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlWzEwXSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4RkYgfTsKLSAgICAgICAgICAgICAgICBpZiAoIW9uZS5FcXVhbHModHdvKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ3JhenlOZXN0aW5nLkVxdWFscyBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7Ci0gICAgICAgICAgICBYdHJ1Y3QgbyA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgICAgICAgIG8uU3RyaW5nX3RoaW5nID0gIlplcm8iOwotICAgICAgICAgICAgby5CeXRlX3RoaW5nID0gKHNieXRlKTE7Ci0gICAgICAgICAgICBvLkkzMl90aGluZyA9IC0zOwotICAgICAgICAgICAgby5JNjRfdGhpbmcgPSAtNTsKLSAgICAgICAgICAgIFh0cnVjdCBpID0gY2xpZW50LnRlc3RTdHJ1Y3Qobyk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0ge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0iKTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pIik7Ci0gICAgICAgICAgICBYdHJ1Y3QyIG8yID0gbmV3IFh0cnVjdDIoKTsKLSAgICAgICAgICAgIG8yLkJ5dGVfdGhpbmcgPSAoc2J5dGUpMTsKLSAgICAgICAgICAgIG8yLlN0cnVjdF90aGluZyA9IG87Ci0gICAgICAgICAgICBvMi5JMzJfdGhpbmcgPSA1OwotICAgICAgICAgICAgWHRydWN0MiBpMiA9IGNsaWVudC50ZXN0TmVzdChvMik7Ci0gICAgICAgICAgICBpID0gaTIuU3RydWN0X3RoaW5nOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHsiICsgaTIuQnl0ZV90aGluZyArICIsIHtcIiIgKyBpLlN0cmluZ190aGluZyArICJcIiwgIiArIGkuQnl0ZV90aGluZyArICIsICIgKyBpLkkzMl90aGluZyArICIsICIgKyBpLkk2NF90aGluZyArICJ9LCAiICsgaTIuSTMyX3RoaW5nICsgIn0iKTsKLQotICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbWFwb3V0ID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXBvdXRbal0gPSBqIC0gMTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwKHsiKTsKLSAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiBtYXBvdXQuS2V5cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4gIiArIG1hcG91dFtrZXldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7Ci0KLSAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IG1hcGluID0gY2xpZW50LnRlc3RNYXAobWFwb3V0KTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOwotICAgICAgICAgICAgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiBtYXBpbi5LZXlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwaW5ba2V5XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0gICAgICAgICAgICBMaXN0PGludD4gbGlzdG91dCA9IG5ldyBMaXN0PGludD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAtMjsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaXN0b3V0LkFkZChqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RMaXN0KHsiKTsKLSAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIGxpc3RvdXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7Ci0KLSAgICAgICAgICAgIExpc3Q8aW50PiBsaXN0aW4gPSBjbGllbnQudGVzdExpc3QobGlzdG91dCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKLSAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIGxpc3RpbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotICAgICAgICAgICAgLy9zZXQKLSAgICAgICAgICAgIFRIYXNoU2V0PGludD4gc2V0b3V0ID0gbmV3IFRIYXNoU2V0PGludD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAtMjsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXRvdXQuQWRkKGopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFNldCh7Iik7Ci0gICAgICAgICAgICBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRvdXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7Ci0KLSAgICAgICAgICAgIFRIYXNoU2V0PGludD4gc2V0aW4gPSBjbGllbnQudGVzdFNldChzZXRvdXQpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0gICAgICAgICAgICBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRpbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShPTkUpIik7Ci0gICAgICAgICAgICBOdW1iZXJ6IHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6Lk9ORSk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRXTykiKTsKLSAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRXTyk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRIUkVFKSIpOwotICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVEhSRUUpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShGSVZFKSIpOwotICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRklWRSk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEVJR0hUKSIpOwotICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRUlHSFQpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7Ci0gICAgICAgICAgICBsb25nIHVpZCA9IGNsaWVudC50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjNMKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdWlkKTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE1hcE1hcCgxKSIpOwotICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiBtbSA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOwotICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiBtbS5LZXlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7Ci0gICAgICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbTIgPSBtbVtrZXldOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBrMiBpbiBtMi5LZXlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMiArICIgPT4gIiArIG0yW2syXSArICIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7Ci0KLSAgICAgICAgICAgIEluc2FuaXR5IGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOwotICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDBMOwotICAgICAgICAgICAgWHRydWN0IHRydWNrID0gbmV3IFh0cnVjdCgpOwotICAgICAgICAgICAgdHJ1Y2suU3RyaW5nX3RoaW5nID0gIlRydWNrIjsKLSAgICAgICAgICAgIHRydWNrLkJ5dGVfdGhpbmcgPSAoc2J5dGUpODsKLSAgICAgICAgICAgIHRydWNrLkkzMl90aGluZyA9IDg7Ci0gICAgICAgICAgICB0cnVjay5JNjRfdGhpbmcgPSA4OwotICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7Ci0gICAgICAgICAgICBpbnNhbmUuWHRydWN0cy5BZGQodHJ1Y2spOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEluc2FuaXR5KCkiKTsKLSAgICAgICAgICAgIERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IHdob2EgPSBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0gICAgICAgICAgICBmb3JlYWNoIChsb25nIGtleSBpbiB3aG9hLktleXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gdmFsID0gd2hvYVtrZXldOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7Ci0KLSAgICAgICAgICAgICAgICBmb3JlYWNoIChOdW1iZXJ6IGsyIGluIHZhbC5LZXlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSW5zYW5pdHkgdjIgPSB2YWxbazJdOwotCi0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazIgKyAiID0+IHsiKTsKLSAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPiB1c2VyTWFwID0gdjIuVXNlck1hcDsKLQotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKE51bWJlcnogazMgaW4gdXNlck1hcC5LZXlzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazMgKyAiID0+ICIgKyB1c2VyTWFwW2szXSArICIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOwotCi0gICAgICAgICAgICAgICAgICAgIExpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIuWHRydWN0czsKLQotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFh0cnVjdCB4IGluIHh0cnVjdHMpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgie1wiIiArIHguU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgeC5CeXRlX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIn0sICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0iKTsKLQotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0gICAgICAgICAgICBzYnl0ZSBhcmcwID0gMTsKLSAgICAgICAgICAgIGludCBhcmcxID0gMjsKLSAgICAgICAgICAgIGxvbmcgYXJnMiA9IGxvbmcuTWF4VmFsdWU7Ci0gICAgICAgICAgICBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IG11bHRpRGljdCA9IG5ldyBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+KCk7Ci0gICAgICAgICAgICBtdWx0aURpY3RbMV0gPSAib25lIjsKLSAgICAgICAgICAgIE51bWJlcnogYXJnNCA9IE51bWJlcnouRklWRTsKLSAgICAgICAgICAgIGxvbmcgYXJnNSA9IDUwMDAwMDA7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IE11bHRpKCIgKyBhcmcwICsgIiwiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLCIgKyBtdWx0aURpY3QgKyAiLCIgKyBhcmc0ICsgIiwiICsgYXJnNSArICIpIik7Ci0gICAgICAgICAgICBYdHJ1Y3QgbXVsdGlSZXNwb25zZSA9IGNsaWVudC50ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgbXVsdGlEaWN0LCBhcmc0LCBhcmc1KTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IFh0cnVjdChieXRlX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkJ5dGVfdGhpbmcgKyAiLFN0cmluZ190aGluZzoiICsgbXVsdGlSZXNwb25zZS5TdHJpbmdfdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIixpMzJfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTMyX3RoaW5nICsgIixpNjRfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTY0X3RoaW5nICsgIilcbiIpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVGVzdCBPbmV3YXkoMSkiKTsKLSAgICAgICAgICAgIGNsaWVudC50ZXN0T25ld2F5KDEpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IENhbGx0aW1lKCkiKTsKLSAgICAgICAgICAgIHZhciBzdGFydHQgPSBEYXRlVGltZS5VdGNOb3c7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgaz0wOyBrPDEwMDA7ICsrayApCi0gICAgICAgICAgICAgICAgY2xpZW50LnRlc3RWb2lkKCk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIChEYXRlVGltZS5VdGNOb3cgLSBzdGFydHQpLlRvdGFsU2Vjb25kcy5Ub1N0cmluZygpICsgIiBtcyBhIHRlc3RWb2lkKCkgY2FsbCIgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Rlc3RTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9UZXN0U2VydmVyLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNjNzNjLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Rlc3RTZXJ2ZXIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UKLS8vCi0vLyBTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRSBvciB2aXNpdCB0aGUgVGhyaWZ0IHNpdGUgYXQ6Ci0vLyBodHRwOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vdGhyaWZ0LwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Ci11c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Ci11c2luZyBUaHJpZnQuVGVzdDsgLy9nZW5lcmF0ZWQgY29kZQotdXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKLXVzaW5nIFRocmlmdC5Qcm90b2NvbDsKLXVzaW5nIFRocmlmdC5TZXJ2ZXI7Ci0KLW5hbWVzcGFjZSBUZXN0Ci17Ci0gICAgcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIKLSAgICB7Ci0gICAgcHVibGljIGNsYXNzIFRyYWRlU2VydmVyRXZlbnRIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlcgotICAgIHsKLSAgICAgIHB1YmxpYyBpbnQgY2FsbENvdW50ID0gMDsKLSAgICAgIHB1YmxpYyB2b2lkIHByZVNlcnZlKCkKLSAgICAgIHsKLSAgICAgICAgY2FsbENvdW50Kys7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUNvbnRleHQoVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpCi0gICAgICB7Ci0gICAgICAgIGNhbGxDb3VudCsrOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQotICAgICAgewotICAgICAgICBjYWxsQ291bnQrKzsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDb250ZXh0KE9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuVHJhbnNwb3J0LlRUcmFuc3BvcnQgdHJhbnNwb3J0KQotICAgICAgewotICAgICAgICBjYWxsQ291bnQrKzsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0SGFuZGxlciA6IFRocmlmdFRlc3QuSWZhY2UKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIFRTZXJ2ZXIgc2VydmVyOwotCi0gICAgICAgICAgICBwdWJsaWMgVGVzdEhhbmRsZXIoKSB7IH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdFZvaWQoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0Vm9pZCgpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdGVzdFN0cmluZyhzdHJpbmcgdGhpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RzdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbCB0ZXN0Qm9vbChib29sIHRoaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0Qm9vbCgiICsgdGhpbmcgKyAiKSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHNieXRlIHRlc3RCeXRlKHNieXRlIHRoaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0Qnl0ZSgiICsgdGhpbmcgKyAiKSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCB0ZXN0STMyKGludCB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEkzMigiICsgdGhpbmcgKyAiKSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGxvbmcgdGVzdEk2NChsb25nIHRoaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0STY0KCIgKyB0aGluZyArICIpIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgZG91YmxlIHRlc3REb3VibGUoZG91YmxlIHRoaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RG91YmxlKCIgKyB0aGluZyArICIpIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIHRlc3RCaW5hcnkoYnl0ZVtdIHRoaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyBoZXggPSBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcodGhpbmcpLlJlcGxhY2UoIi0iLCBzdHJpbmcuRW1wdHkpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0QmluYXJ5KCIgKyBoZXggKyAiKSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFh0cnVjdCB0ZXN0U3RydWN0KFh0cnVjdCB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdFN0cnVjdCh7IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgdGhpbmcuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkJ5dGVfdGhpbmcgKyAiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkkzMl90aGluZyArICIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTY0X3RoaW5nICsgIn0pIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgWHRydWN0MiB0ZXN0TmVzdChYdHJ1Y3QyIG5lc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWHRydWN0IHRoaW5nID0gbmVzdC5TdHJ1Y3RfdGhpbmc7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3ROZXN0KHsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3QuQnl0ZV90aGluZyArICIsIHsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyB0aGluZy5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuQnl0ZV90aGluZyArICIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTMyX3RoaW5nICsgIiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5JNjRfdGhpbmcgKyAifSwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0LkkzMl90aGluZyArICJ9KSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXN0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxpbnQsIGludD4gdGVzdE1hcChEaWN0aW9uYXJ5PGludCwgaW50PiB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE1hcCh7Iik7Ci0gICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiB0aGluZy5LZXlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoa2V5ICsgIiA9PiAiICsgdGhpbmdba2V5XSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9KSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHRlc3RTdHJpbmdNYXAoRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGhpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RTdHJpbmdNYXAoeyIpOwotICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBrZXkgaW4gdGhpbmcuS2V5cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIsICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGtleSArICIgPT4gIiArIHRoaW5nW2tleV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBUSGFzaFNldDxpbnQ+IHRlc3RTZXQoVEhhc2hTZXQ8aW50PiB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdFNldCh7Iik7Ci0gICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGVsZW0gaW4gdGhpbmcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlbGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0pIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgTGlzdDxpbnQ+IHRlc3RMaXN0KExpc3Q8aW50PiB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdExpc3QoeyIpOwotICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZWxlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9KSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEVudW0oIiArIHRoaW5nICsgIikiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBsb25nIHRlc3RUeXBlZGVmKGxvbmcgdGhpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RUeXBlZGVmKCIgKyB0aGluZyArICIpIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiB0ZXN0TWFwTWFwKGludCBoZWxsbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE1hcE1hcCgiICsgaGVsbG8gKyAiKSIpOwotICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gbWFwbWFwID0KLSAgICAgICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7Ci0KLSAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBwb3MgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLSAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBuZWcgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc1tpXSA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIG5lZ1staV0gPSAtaTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXBtYXBbNF0gPSBwb3M7Ci0gICAgICAgICAgICAgICAgbWFwbWFwWy00XSA9IG5lZzsKLQotICAgICAgICAgICAgICAgIHJldHVybiBtYXBtYXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RJbnNhbml0eSgpIik7Ci0KLSAgICAgICAgICAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7Ci0gICAgICAgICAgICAgICAgaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgICAgICAgICAgICAgaGVsbG8uQnl0ZV90aGluZyA9IDI7Ci0gICAgICAgICAgICAgICAgaGVsbG8uSTMyX3RoaW5nID0gMjsKLSAgICAgICAgICAgICAgICBoZWxsby5JNjRfdGhpbmcgPSAyOwotCi0gICAgICAgICAgICAgICAgWHRydWN0IGdvb2RieWUgPSBuZXcgWHRydWN0KCk7Ci0gICAgICAgICAgICAgICAgZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOwotICAgICAgICAgICAgICAgIGdvb2RieWUuQnl0ZV90aGluZyA9IChzYnl0ZSk0OwotICAgICAgICAgICAgICAgIGdvb2RieWUuSTMyX3RoaW5nID0gNDsKLSAgICAgICAgICAgICAgICBnb29kYnllLkk2NF90aGluZyA9IChsb25nKTQ7Ci0KLSAgICAgICAgICAgICAgICBJbnNhbml0eSBjcmF6eSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgICAgICAgICAgIGNyYXp5LlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOwotICAgICAgICAgICAgICAgIGNyYXp5LlVzZXJNYXBbTnVtYmVyei5FSUdIVF0gPSAobG9uZyk4OwotICAgICAgICAgICAgICAgIGNyYXp5Llh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7Ci0gICAgICAgICAgICAgICAgY3JhenkuWHRydWN0cy5BZGQoZ29vZGJ5ZSk7Ci0KLSAgICAgICAgICAgICAgICBJbnNhbml0eSBsb29uZXkgPSBuZXcgSW5zYW5pdHkoKTsKLSAgICAgICAgICAgICAgICBjcmF6eS5Vc2VyTWFwW051bWJlcnouRklWRV0gPSAobG9uZyk1OwotICAgICAgICAgICAgICAgIGNyYXp5Llh0cnVjdHMuQWRkKGhlbGxvKTsKLQotICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IGZpcnN0X21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOwotICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IHNlY29uZF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsgOwotCi0gICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVFdPXSA9IGNyYXp5OwotICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRIUkVFXSA9IGNyYXp5OwotCi0gICAgICAgICAgICAgICAgc2Vjb25kX21hcFtOdW1iZXJ6LlNJWF0gPSBsb29uZXk7Ci0KLSAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiBpbnNhbmUgPQotICAgICAgICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+KCk7Ci0gICAgICAgICAgICAgICAgaW5zYW5lWyhsb25nKTFdID0gZmlyc3RfbWFwOwotICAgICAgICAgICAgICAgIGluc2FuZVsobG9uZykyXSA9IHNlY29uZF9tYXA7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gaW5zYW5lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aShzYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGkoKSIpOwotCi0gICAgICAgICAgICAgICAgWHRydWN0IGhlbGxvID0gbmV3IFh0cnVjdCgpOyA7Ci0gICAgICAgICAgICAgICAgaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgICAgICAgICAgICAgaGVsbG8uQnl0ZV90aGluZyA9IGFyZzA7Ci0gICAgICAgICAgICAgICAgaGVsbG8uSTMyX3RoaW5nID0gYXJnMTsKLSAgICAgICAgICAgICAgICBoZWxsby5JNjRfdGhpbmcgPSBhcmcyOwotICAgICAgICAgICAgICAgIHJldHVybiBoZWxsbzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBQcmludCAndGVzdEV4Y2VwdGlvbiglcyknIHdpdGggYXJnIGFzICclcycKLSAgICAgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93Ci0gICAgICAgICAgICAgKiBpZiBhcmcgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSBhcmcKLSAgICAgICAgICAgICAqIGVsc2VuIGlmIGFyZyA9PSAiVEV4Y2VwdGlvbiIgdGhyb3cgVEV4Y2VwdGlvbgotICAgICAgICAgICAgICogZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbihzdHJpbmcgYXJnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKCIgKyBhcmcgKyAiKSIpOwotICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlhjZXB0aW9uIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAxMDAxOwotICAgICAgICAgICAgICAgICAgICB4Lk1lc3NhZ2UgPSBhcmc7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oc3RyaW5nIGFyZzAsIHN0cmluZyBhcmcxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oIiArIGFyZzAgKyAiLCAiICsgYXJnMSArICIpIik7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAxMDAxOwotICAgICAgICAgICAgICAgICAgICB4Lk1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZzAgPT0gIlhjZXB0aW9uMiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYY2VwdGlvbjIgeCA9IG5ldyBYY2VwdGlvbjIoKTsKLSAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAyMDAyOwotICAgICAgICAgICAgICAgICAgICB4LlN0cnVjdF90aGluZyA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgICAgICAgICAgICAgICAgeC5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBYdHJ1Y3QgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5TdHJpbmdfdGhpbmcgPSBhcmcxOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9wKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuU3RvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdE9uZXdheShpbnQgYXJnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0T25ld2F5KCIgKyBhcmcgKyAiKSwgc2xlZXBpbmcuLi4iKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcChhcmcgKiAxMDAwKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gLy8gY2xhc3MgVGVzdEhhbmRsZXIKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgRXhlY3V0ZShzdHJpbmdbXSBhcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IGZhbHNlLCB1c2VGcmFtZWQgPSBmYWxzZSwgdXNlRW5jcnlwdGlvbiA9IGZhbHNlLCBjb21wYWN0ID0gZmFsc2UsIGpzb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IDkwOTA7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHBpcGUgPSBudWxsOwotICAgICAgICAgICAgICAgIHN0cmluZyBjZXJ0UGF0aCA9ICIuLi8uLi8uLi8uLi8uLi9rZXlzL3NlcnZlci5wZW0iOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldID09ICItcGlwZSIpICAvLyAtcGlwZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5Db250YWlucygiLS1wb3J0PSIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0gaW50LlBhcnNlKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpKzEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItYiIgfHwgYXJnc1tpXSA9PSAiLS1idWZmZXJlZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9YnVmZmVyZWQiKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2VCdWZmZXJlZFNvY2tldHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZyYW1lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tc3NsIikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdXNlRW5jcnlwdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLWNlcnQ9IikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRQYXRoID0gYXJnc1tpXS5TdWJzdHJpbmcoIi0tY2VydD0iLkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBQcm9jZXNzb3IKLSAgICAgICAgICAgICAgICBUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOwotICAgICAgICAgICAgICAgIFRocmlmdFRlc3QuUHJvY2Vzc29yIHRlc3RQcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IodGVzdEhhbmRsZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gVHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCB0cmFuczsKLSAgICAgICAgICAgICAgICBpZiggcGlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydChwaXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUVuY3J5cHRpb24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRUTFNTZXJ2ZXJTb2NrZXQocG9ydCwgMCwgdXNlQnVmZmVyZWRTb2NrZXRzLCBuZXcgWDUwOUNlcnRpZmljYXRlMihjZXJ0UGF0aCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNlcnZlclNvY2tldChwb3J0LCAwLCB1c2VCdWZmZXJlZFNvY2tldHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90bzsKLSAgICAgICAgICAgICAgICBpZiAoIGNvbXBhY3QgKQotICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgganNvbiApCi0gICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRKU09OUHJvdG9jb2wuRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKLQotICAgICAgICAgICAgICAgIC8vIFNpbXBsZSBTZXJ2ZXIKLSAgICAgICAgICAgICAgICBUU2VydmVyIHNlcnZlckVuZ2luZTsKLSAgICAgICAgICAgICAgICBpZiAoIHVzZUZyYW1lZCApCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHRlc3RQcm9jZXNzb3IsIHRyYW5zLCBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCksIHByb3RvKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHRlc3RQcm9jZXNzb3IsIHRyYW5zLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgcHJvdG8pOwotCi0gICAgICAgICAgICAgICAgLy8gVGhyZWFkUG9vbCBTZXJ2ZXIKLSAgICAgICAgICAgICAgICAvLyBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIodGVzdFByb2Nlc3NvciwgdFNlcnZlclNvY2tldCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaHJlYWRlZCBTZXJ2ZXIKLSAgICAgICAgICAgICAgICAvLyBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZGVkU2VydmVyKHRlc3RQcm9jZXNzb3IsIHRTZXJ2ZXJTb2NrZXQpOwotCi0gICAgICAgIC8vU2VydmVyIGV2ZW50IGhhbmRsZXIKLSAgICAgICAgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIgc2VydmVyRXZlbnRzID0gbmV3IFRyYWRlU2VydmVyRXZlbnRIYW5kbGVyKCk7Ci0gICAgICAgIHNlcnZlckVuZ2luZS5zZXRFdmVudEhhbmRsZXIoc2VydmVyRXZlbnRzKTsKLQotICAgICAgICAgICAgICAgIHRlc3RIYW5kbGVyLnNlcnZlciA9IHNlcnZlckVuZ2luZTsKLQotICAgICAgICAgICAgICAgIC8vIFJ1biBpdAotICAgICAgICAgICAgICAgIHN0cmluZyB3aGVyZSA9ICggcGlwZSAhPSBudWxsID8gIm9uIHBpcGUgIitwaXBlIDogIm9uIHBvcnQgIiArIHBvcnQpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgc2VydmVyICIgKyB3aGVyZSArCi0gICAgICAgICAgICAgICAgICAgICh1c2VCdWZmZXJlZFNvY2tldHMgPyAiIHdpdGggYnVmZmVyZWQgc29ja2V0IiA6ICIiKSArCi0gICAgICAgICAgICAgICAgICAgICh1c2VGcmFtZWQgPyAiIHdpdGggZnJhbWVkIHRyYW5zcG9ydCIgOiAiIikgKwotICAgICAgICAgICAgICAgICAgICAodXNlRW5jcnlwdGlvbiA/ICIgd2l0aCBlbmNyeXB0aW9uIiA6ICIiKSArCi0gICAgICAgICAgICAgICAgICAgIChjb21wYWN0ID8gIiB3aXRoIGNvbXBhY3QgcHJvdG9jb2wiIDogIiIpICsKLSAgICAgICAgICAgICAgICAgICAgKGpzb24gPyAiIHdpdGgganNvbiBwcm90b2NvbCIgOiAiIikgKwotICAgICAgICAgICAgICAgICAgICAiLi4uIik7Ci0gICAgICAgICAgICAgICAgc2VydmVyRW5naW5lLlNlcnZlKCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlKHgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkb25lLiIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LmNzcHJvaiBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1RocmlmdFRlc3QuY3Nwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjcxOTk3Li4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1RocmlmdFRlc3QuY3Nwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+Ci0gICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4yMTAyMjwvUHJvZHVjdFZlcnNpb24+Ci0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgotICAgIDxQcm9qZWN0R3VpZD57NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfTwvUHJvamVjdEd1aWQ+Ci0gICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgotICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KLSAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnRUZXN0PC9Sb290TmFtZXNwYWNlPgotICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0VGVzdDwvQXNzZW1ibHlOYW1lPgotICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+Ci0gICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgotICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+Ci0gICAgPEZpbGVVcGdyYWRlRmxhZ3M+Ci0gICAgPC9GaWxlVXBncmFkZUZsYWdzPgotICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+Ci0gICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgotICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgotICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+Ci0gICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgotICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgotICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+Ci0gICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgotICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+Ci0gICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgotICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+Ci0gICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgotICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+Ci0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4KLSAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KLSAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KLSAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdEltcGwsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+Ci0gICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+Ci0gICAgICA8SGludFBhdGg+LlxUaHJpZnRJbXBsLmRsbDwvSGludFBhdGg+Ci0gICAgPC9SZWZlcmVuY2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdENsaWVudC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0U2VydmVyLmNzIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMi4wIj4KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgotICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDIuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgotICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+Ci0gICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuMCI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KLSAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41PC9Qcm9kdWN0TmFtZT4KLSAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+Ci0gICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgotICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXHNyY1xUaHJpZnQuY3Nwcm9qIj4KLSAgICAgIDxQcm9qZWN0Pns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9PC9Qcm9qZWN0PgotICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgotICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+Ci0gIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCi0gICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgotICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICAtLT4KLSAgPFByb3BlcnR5R3JvdXA+Ci0gICAgPFByZUJ1aWxkRXZlbnQ+cm1kaXIgL3MgL3EgIiQoUHJvamVjdERpcilnZW4tY3NoYXJwIgotZGVsIC9mIC9xICIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiCi1TRVQgT1VUUFVUX0RJUj0kKFByb2plY3REaXIpCi1TRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlx0ZXN0XFRocmlmdFRlc3QudGhyaWZ0Ci1mb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKLWZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKLSIkKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFx0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnAgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQotJChNU0J1aWxkVG9vbHNQYXRoKVxDc2MuZXhlIC90OmxpYnJhcnkgL291dDoiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIiAvcmVjdXJzZToiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiXCogL3JlZmVyZW5jZToiJChQcm9qZWN0RGlyKS4uXC4uXHNyY1xiaW5cRGVidWdcVGhyaWZ0LmRsbCI8L1ByZUJ1aWxkRXZlbnQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9tYWtldGVzdC5zaCBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTBhNTIzLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0uLi8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGNzaGFycCAtbyAuIC4uLy4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLWdtY3MgL3Q6bGlicmFyeSAvb3V0Oi4vVGhyaWZ0SW1wbC5kbGwgL3JlY3Vyc2U6Li9nZW4tY3NoYXJwLyogL3JlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsCi1nbWNzICAvb3V0OlRlc3RDbGllbnRTZXJ2ZXIuZXhlIC9yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAvcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsIFRlc3RDbGllbnQuY3MgVGVzdFNlcnZlci5jcyBQcm9ncmFtLmNzCi0KLWV4cG9ydCBNT05PX1BBVEg9Li4vLi4vCi0KLXRpbWVvdXQgMTIwIC4vVGVzdENsaWVudFNlcnZlci5leGUgc2VydmVyICYKLXNsZWVwIDEKLS4vVGVzdENsaWVudFNlcnZlci5leGUgY2xpZW50CmRpZmYgLS1naXQgYS9saWIvZC9NYWtlZmlsZS5hbSBiL2xpYi9kL01ha2VmaWxlLmFtCmluZGV4IDMwYjVlYjMuLjQ3ODdlMGEgMTAwNjQ0Ci0tLSBhL2xpYi9kL01ha2VmaWxlLmFtCisrKyBiL2xpYi9kL01ha2VmaWxlLmFtCkBAIC0xNDEsOSArMTQxLDEzIEBACiBpbnN0YWxsLWV4ZWMtbG9jYWw6CiAJJChJTlNUQUxMX1BST0dSQU0pICQoYWxsX3RhcmdldHMpICQoREVTVERJUikkKGxpYmRpcikKIAotCiBjbGVhbi1sb2NhbDoKLQkkKFJNKSAtcmYgZG9jcyAkKERfTElCX05BTUUpICQoRF9FVkVOVF9MSUJfTkFNRSkgJChEX1NTTF9MSUJfTkFNRSkgdW5pdHRlc3QKKwkkKFJNKSAtciBkb2NzCisJJChSTSkgJChEX0xJQl9OQU1FKQorCSQoUk0pICQoRF9FVkVOVF9MSUJfTkFNRSkKKwkkKFJNKSAkKERfU1NMX0xJQl9OQU1FKQorCSQoUk0pIC1yIHRlc3QvZ2VuLWQKKwkkKFJNKSAtciB1bml0dGVzdAogCiAKICMKQEAgLTE3Nyw3ICsxODEsNyBAQAogCXRvdWNoICRACiAKIHVuaXR0ZXN0L2RlYnVnLyU6IHNyYy8lLmQgJChhbGxfdGFyZ2V0cykgdW5pdHRlc3QvZW1wdHltYWluLmQKLQkkKERNRCkgLWdjIC1vZiQoc3Vic3QgLywkKERNRF9PRl9ESVJTRVApLCRAKSAkKGRfdGVzdF9mbGFncykgJF4KKwkkKERNRCkgLWcgLW9mJChzdWJzdCAvLCQoRE1EX09GX0RJUlNFUCksJEApICQoZF90ZXN0X2ZsYWdzKSAkXgogCiB1bml0dGVzdC9yZWxlYXNlLyU6IHNyYy8lLmQgJChhbGxfdGFyZ2V0cykgdW5pdHRlc3QvZW1wdHltYWluLmQKIAkkKERNRCkgLU8gLXJlbGVhc2UgLW9mJChzdWJzdCAvLCQoRE1EX09GX0RJUlNFUCksJEApICQoZF90ZXN0X2ZsYWdzKSAkXgpAQCAtMTg1LDYgKzE4OSw4IEBACiBURVNUUyA9ICQoYWRkcHJlZml4IHVuaXR0ZXN0L2RlYnVnLywgJChkX3Rlc3RfbW9kdWxlcykpIFwKIAkkKGFkZHByZWZpeCB1bml0dGVzdC9yZWxlYXNlLywgJChkX3Rlc3RfbW9kdWxlcykpCiAKK3ByZWNyb3NzOiBhbGwtbG9jYWwKKwkkKE1BS0UpIC1DIHRlc3QgcHJlY3Jvc3MKIAogRVhUUkFfRElTVCA9IFwKIAlzcmMgXApkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9saWJldmVudC5kIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9saWJldmVudC5kCmluZGV4IDk2N2M0MWYuLjgxMmU0YTcgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvbGliZXZlbnQuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL2xpYmV2ZW50LmQKQEAgLTM5Miw3ICszOTIsNyBAQAogICAgICAgVEFzeW5jRXZlbnRSZWFzb24uTk9STUFMOwogICAgICgqKGNhc3QoVFNvY2tldEV2ZW50TGlzdGVuZXIqKWFyZykpKHJlYXNvbik7CiAgICAgR0MucmVtb3ZlUmFuZ2UoYXJnKTsKLSAgICBjbGVhcihhcmcpOworICAgIGRlc3Ryb3koYXJnKTsKICAgICBmcmVlKGFyZyk7CiAgIH0KIApAQCAtNDAyLDcgKzQwMiw3IEBACiAgICAgYXNzZXJ0KGZsYWdzICYgRVZfVElNRU9VVCk7CiAgICAgKCooY2FzdCh2b2lkIGRlbGVnYXRlKCkqKWFyZykpKCk7CiAgICAgR0MucmVtb3ZlUmFuZ2UoYXJnKTsKLSAgICBjbGVhcihhcmcpOworICAgIGRlc3Ryb3koYXJnKTsKICAgICBmcmVlKGFyZyk7CiAgIH0KIApAQCAtNDQyLDggKzQ0Miw4IEBACiAKIHByaXZhdGUgewogICB0aW1ldmFsIHRvVGltZXZhbChjb25zdChEdXJhdGlvbikgZHVyKSB7Ci0gICAgdGltZXZhbCB0diA9IHt0dl9zZWM6IGNhc3QoaW50KWR1ci50b3RhbCEic2Vjb25kcyIoKSwKLSAgICAgIHR2X3VzZWM6IGR1ci5mcmFjU2VjLnVzZWNzfTsKKyAgICB0aW1ldmFsIHR2OworICAgIGR1ci5zcGxpdCEoInNlY29uZHMiLCAidXNlY3MiKSh0di50dl9zZWMsIHR2LnR2X3VzZWMpOwogICAgIHJldHVybiB0djsKICAgfQogCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NvY2tldC5kIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zb2NrZXQuZAppbmRleCA2ZGUxM2Q5Li5hMDhmNTFkIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NvY2tldC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc29ja2V0LmQKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogbW9kdWxlIHRocmlmdC5hc3luYy5zb2NrZXQ7CiAKK2ltcG9ydCBjb3JlLnN0ZGMuZXJybm86IEVDT05OUkVTRVQ7CiBpbXBvcnQgY29yZS50aHJlYWQgOiBGaWJlcjsKIGltcG9ydCBjb3JlLnRpbWUgOiBkdXIsIER1cmF0aW9uOwogaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2Jhc2UuZAppbmRleCA2ZTFiNTU4Li4xNTBjM2RhIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2Jhc2UuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2Jhc2UuZApAQCAtNTAsNyArNTAsNyBAQAogLy8vIFRoZSBUaHJpZnQgdmVyc2lvbiBzdHJpbmcsIHVzZWQgZm9yIGluZm9ybWF0aXZlIHB1cnBvc2VzLgogLy8gTm90ZTogVGhpcyBpcyBjdXJyZW50bHkgaGFyZGNvZGVkLCBidXQgd2lsbCBsaWtlbHkgYmUgZmlsbGVkIGluIGJ5IHRoZSBidWlsZAogLy8gc3lzdGVtIGluIGZ1dHVyZSB2ZXJzaW9ucy4KLWVudW0gVkVSU0lPTiA9ICIwLjkuMyI7CitlbnVtIFZFUlNJT04gPSAiMC4xMy4wIjsKIAogLyoqCiAgKiBGdW5jdGlvbnMgdXNlZCBmb3IgbG9nZ2luZyBpbnNpZGUgVGhyaWZ0LgpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9iYXNlLmQKaW5kZXggOTA2MWQwYi4uZGI1NDk5MiAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2Jhc2UuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYmFzZS5kCkBAIC00OCw2ICs0OCw3IEBACiBpbXBvcnQgdGhyaWZ0LmJhc2U7CiBpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CiBpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsKIAogLyoKICAqIFRocmlmdCBzdHJ1Y3Qvc2VydmljZSBtZXRhIGRhdGEsIHdoaWNoIGlzIHVzZWQgdG8gc3RvcmUgaW5mb3JtYXRpb24gZnJvbQpAQCAtNDIwLDcgKzQyMSw3IEBACiAgICAgICByZXR1cm4gKGNhc3QoKXN1cGVyKS5vcEVxdWFscyhvdGhlcik7CiAgICAgfQogCi0gICAgc2l6ZV90IHRvSGFzaCgpIGNvbnN0IHsKKyAgICBvdmVycmlkZSBzaXplX3QgdG9IYXNoKCkgY29uc3QgewogICAgICAgcmV0dXJuIHRocmlmdFRvSGFzaEltcGwoKTsKICAgICB9CiAgIH0gZWxzZSB7CkBAIC00NjksOCArNDcwLDggQEAKIAogICBwcml2YXRlIHNpemVfdCB0aHJpZnRUb0hhc2hJbXBsKCkgY29uc3QgQHRydXN0ZWQgbm90aHJvdyB7CiAgICAgc2l6ZV90IGhhc2ggPSAwOwotICAgIGZvcmVhY2ggKG5hbWU7IEZpZWxkTmFtZXMhVGhpcykgewotICAgICAgYXV0byB2YWwgPSBtaXhpbigidGhpcy4iIH4gbmFtZSk7CisgICAgZm9yZWFjaCAoaSwgXzsgdGhpcy50dXBsZW9mKSB7CisgICAgICBhdXRvIHZhbCA9IHRoaXMudHVwbGVvZltpXTsKICAgICAgIGhhc2ggKz0gdHlwZWlkKHZhbCkuZ2V0SGFzaCgmdmFsKTsKICAgICB9CiAgICAgcmV0dXJuIGhhc2g7CkBAIC01OTEsNyArNTkyLDcgQEAKICAqIHRoZSB3aXJlIHdpdGhvdXQgYWx0ZXJpbmcgdGhlaXIgZGVmaW5pdGlvbnMuCiAgKi8KIHZvaWQgcmVhZFN0cnVjdChULCBQcm90b2NvbCwgYWxpYXMgZmllbGRNZXRhRGF0YSA9IGNhc3QoVEZpZWxkTWV0YVtdKW51bGwsCi0gIGJvb2wgcG9pbnRlclN0cnVjdCA9IGZhbHNlKShyZWYgVCBzLCBQcm90b2NvbCBwKSBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpCisgIGJvb2wgcG9pbnRlclN0cnVjdCA9IGZhbHNlKShhdXRvIHJlZiBUIHMsIFByb3RvY29sIHApIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCkKIHsKICAgbWl4aW4oewogICAgIHN0cmluZyBjb2RlOwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2lkbGdlbi5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2lkbGdlbi5kCmluZGV4IDE4YWYxYWEuLjlmODg5MzYgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9pZGxnZW4uZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vaWRsZ2VuLmQKQEAgLTY0MSwxMyArNjQxLDE2IEBACiB9CiBgKTsKIAotICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFXaXRoRGVmYXVsdHMgPT0KK2ltcG9ydCBzdGQuYWxnb3JpdGhtOworICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFXaXRoRGVmYXVsdHMuc3RhcnRzV2l0aCgKIGBzdHJ1Y3QgV2l0aERlZmF1bHRzIHsKICAgLTE6IHN0cmluZyBhID0gImFzZGYiLAotICAtMjogZG91YmxlIGIgPSAzLjE0MTUsCi0gIDE6IFdpdGhvdXRNZXRhIGMgPSB7YTogImZvbyIsIGI6IDMsIH0sCisgIC0yOiBkb3VibGUgYiA9IDMuMTQxYCkpOworCisgIHN0YXRpYyBhc3NlcnQoc3RydWN0SWRsU3RyaW5nIVdpdGhEZWZhdWx0cy5lbmRzV2l0aCgKK2AxOiBXaXRob3V0TWV0YSBjID0ge2E6ICJmb28iLCBiOiAzLCB9LAogfQotYCk7CitgKSk7CiAKICAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchT25lT2ZFYWNoID09CiBgc3RydWN0IE9uZU9mRWFjaCB7CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2wuZAppbmRleCA2M2EwYTJiLi4zYWY1NGI1IDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsLmQKQEAgLTE3OSw3ICsxNzksNyBAQAogICBFeGNlcHRpb24gZXhjZXB0aW9uOwogCiAgIHZvaWQgaW5pdE1lc3NhZ2UoKSB7Ci0gICAgbWVzc2FnZS5jbGVhcigpOworICAgIG1lc3NhZ2UuZGVzdHJveSgpOwogICAgIGhhZE1lc3NhZ2UgPSBmYWxzZTsKICAgICBpZiAoIWxvY2F0aW9uLmVtcHR5KSB7CiAgICAgICBtZXNzYWdlIH49IGxvY2F0aW9uOwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2xfYmlvLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZAppbmRleCA3OTZiZTkxLi5hZTg1MDI3IDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZApAQCAtNzMsNyArNzMsNyBAQAogICB2b2lkIHNldEVycm9yKEV4Y2VwdGlvbiBlKSBub3Rocm93IHsKICAgICBFUlJfcHV0X2Vycm9yKEVSUl9MSUJfRF9FWENFUFRJT04sIEVSUl9GX0RfRVhDRVBUSU9OLCBFUlJfUl9EX0VYQ0VQVElPTiwKICAgICAgIEVSUl9GSUxFX0RfRVhDRVBUSU9OLCBFUlJfTElORV9EX0VYQ0VQVElPTik7Ci0gICAgdHJ5IHsgR0MuYWRkUm9vdChjYXN0KHZvaWQqKWUpOyB9IGNhdGNoIHt9CisgICAgdHJ5IHsgR0MuYWRkUm9vdChjYXN0KHZvaWQqKWUpOyB9IGNhdGNoIChUaHJvd2FibGUpIHt9CiAgICAgRVJSX3NldF9lcnJvcl9kYXRhKGNhc3QoY2hhciopZSwgRVJSX0ZMQUdTX0RfRVhDRVBUSU9OKTsKICAgfQogCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvYmFzZS5kCmluZGV4IDcwNjQ4YjMuLjViNmQ4NDUgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvYmFzZS5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvYmFzZS5kCkBAIC0yNjAsNyArMjYwLDcgQEAKICAqIGluIGdlbmVyYXRlZCBjb2RlLgogICovCiB2b2lkIHNraXAoUHJvdG9jb2wpKFByb3RvY29sIHByb3QsIFRUeXBlIHR5cGUpIGlmIChpcyhQcm90b2NvbCA6IFRQcm90b2NvbCkpIHsKLSAgZmluYWwgc3dpdGNoICh0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgewogICAgIGNhc2UgVFR5cGUuQk9PTDoKICAgICAgIHByb3QucmVhZEJvb2woKTsKICAgICAgIGJyZWFrOwpAQCAtMzI0LDkgKzMyNCw5IEBACiAgICAgICB9CiAgICAgICBwcm90LnJlYWRTZXRFbmQoKTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgVFR5cGUuU1RPUDogZ290byBjYXNlOwotICAgIGNhc2UgVFR5cGUuVk9JRDoKLSAgICAgIGFzc2VydChmYWxzZSwgIkludmFsaWQgZmllbGQgdHlwZSBwYXNzZWQuIik7CisKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvanNvbi5kIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9qc29uLmQKaW5kZXggZTg5YWVlMS4uNTZhNzFkYSAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9qc29uLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9qc29uLmQKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBzdGQuc3RyaW5nIDogZm9ybWF0OwogaW1wb3J0IHN0ZC50cmFpdHMgOiBpc0ludGVncmFsOwogaW1wb3J0IHN0ZC50eXBldHVwbGUgOiBhbGxTYXRpc2Z5LCBUeXBlVHVwbGU7CitpbXBvcnQgc3RkLnV0ZiA6IHRvVVRGODsKIGltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CiAKQEAgLTYxLDcgKzYyLDcgQEAKICAgfQogCiAgIHZvaWQgcmVzZXQoKSB7Ci0gICAgY29udGV4dFN0YWNrXy5jbGVhcigpOworICAgIGRlc3Ryb3koY29udGV4dFN0YWNrXyk7CiAgICAgY29udGV4dF8gPSBuZXcgQ29udGV4dCgpOwogICAgIHJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKHRyYW5zXyk7CiAgIH0KQEAgLTEzMiw3ICsxMzMsOCBAQAogICAgIGJvb2wgZXNjYXBlTnVtID0gdmFsdWUgIWlzIG51bGwgfHwgY29udGV4dF8uZXNjYXBlTnVtOwogCiAgICAgaWYgKHZhbHVlIGlzIG51bGwpIHsKLSAgICAgIHZhbHVlID0gZm9ybWF0KCIlLjE2ZyIsIGR1Yik7CisgICAgICAvKiBwcmVjaXNpb24gaXMgMTcgKi8KKyAgICAgIHZhbHVlID0gZm9ybWF0KCIlLjE3ZyIsIGR1Yik7CiAgICAgfQogCiAgICAgaWYgKGVzY2FwZU51bSkgdHJhbnNfLndyaXRlKFNUUklOR19ERUxJTUlURVIpOwpAQCAtNDkyLDEyICs0OTQsMTUgQEAKICAgICByZXR1cm4gcmVhZFN5bnRheENoYXIocmVhZGVyXywgY2gpOwogICB9CiAKLSAgdWJ5dGUgcmVhZEpzb25Fc2NhcGVDaGFyKCkgewotICAgIHJlYWRKc29uU3ludGF4Q2hhcihaRVJPX0NIQVIpOwotICAgIHJlYWRKc29uU3ludGF4Q2hhcihaRVJPX0NIQVIpOworICB3Y2hhciByZWFkSnNvbkVzY2FwZUNoYXIoKSB7CiAgICAgYXV0byBhID0gcmVhZGVyXy5yZWFkKCk7CiAgICAgYXV0byBiID0gcmVhZGVyXy5yZWFkKCk7Ci0gICAgcmV0dXJuIGNhc3QodWJ5dGUpKChoZXhWYWwoYVswXSkgPDwgNCkgKyBoZXhWYWwoYlswXSkpOworICAgIGF1dG8gYyA9IHJlYWRlcl8ucmVhZCgpOworICAgIGF1dG8gZCA9IHJlYWRlcl8ucmVhZCgpOworICAgIHJldHVybiBjYXN0KHVzaG9ydCkoCisgICAgICAgICAgKGhleFZhbChhWzBdKSA8PCAxMikgKyAoaGV4VmFsKGJbMF0pIDw8IDgpICsKKyAgICAgICAgICAoaGV4VmFsKGNbMF0pIDw8IDQpICsgaGV4VmFsKGRbMF0pCisgICAgICAgICk7CiAgIH0KIAogICBzdHJpbmcgcmVhZEpzb25TdHJpbmcoYm9vbCBza2lwQ29udGV4dCA9IGZhbHNlKSB7CkBAIC01MDYsNiArNTExLDcgQEAKICAgICByZWFkSnNvblN5bnRheENoYXIoU1RSSU5HX0RFTElNSVRFUik7CiAgICAgYXV0byBidWZmZXIgPSBhcHBlbmRlciFzdHJpbmcoKTsKIAorICAgIHdjaGFyW10gd2NoczsKICAgICBpbnQgYnl0ZXNSZWFkOwogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICBhdXRvIGNoID0gcmVhZGVyXy5yZWFkKCk7CkBAIC01MjEsNyArNTI3LDE4IEBACiAgICAgICBpZiAoY2ggPT0gQkFDS1NMQVNIKSB7CiAgICAgICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7CiAgICAgICAgIGlmIChjaCA9PSBFU0NBUEVfQ0hBUikgewotICAgICAgICAgIGNoID0gcmVhZEpzb25Fc2NhcGVDaGFyKCk7CisgICAgICAgICAgYXV0byB3Y2ggPSByZWFkSnNvbkVzY2FwZUNoYXIoKTsKKyAgICAgICAgICBpZiAod2NoID49IDB4RDgwMCAmJiB3Y2ggPD0gMHhEQkZGKSB7CisgICAgICAgICAgICB3Y2hzIH49IHdjaDsKKyAgICAgICAgICB9IGVsc2UgaWYgKHdjaCA+PSAweERDMDAgJiYgd2NoIDw9IDB4REZGRiAmJiB3Y2hzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJNaXNzaW5nIFVURi0xNiBoaWdoIHN1cnJvZ2F0ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3Y2hzIH49IHdjaDsKKyAgICAgICAgICAgIGJ1ZmZlci5wdXQod2Nocy50b1VURjgpOworICAgICAgICAgICAgd2NocyA9IFtdOworICAgICAgICAgIH0KKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBhdXRvIHBvcyA9IGNvdW50VW50aWwoa0VzY2FwZUNoYXJzW10sIGNoWzBdKTsKICAgICAgICAgICBpZiAocG9zID09IC0xKSB7CkBAIC01MzEsOSArNTQ4LDE3IEBACiAgICAgICAgICAgY2ggPSBrRXNjYXBlQ2hhclZhbHNbcG9zXTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgaWYgKHdjaHMubGVuZ3RoICE9IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWlzc2luZyBVVEYtMTYgbG93IHN1cnJvZ2F0ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgICB9CiAgICAgICBidWZmZXIucHV0KGNoWzBdKTsKICAgICB9CiAKKyAgICBpZiAod2Nocy5sZW5ndGggIT0gMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWlzc2luZyBVVEYtMTYgbG93IHN1cnJvZ2F0ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgIH0KICAgICByZXR1cm4gYnVmZmVyLmRhdGE7CiAgIH0KIApAQCAtNzcyLDYgKzc5NywzNiBAQAogfQogCiB1bml0dGVzdCB7CisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcihjYXN0KHVieXRlW10pIlwiXFx1MGUwMSBcXHVkODM1XFx1ZGQzZVwiIik7CisgIGF1dG8ganNvbiA9IHRKc29uUHJvdG9jb2woYnVmKTsKKyAgYXV0byBzdHIgPSBqc29uLnJlYWRTdHJpbmcoKTsKKyAgZW5mb3JjZShzdHIgPT0gIuC4gSDwnZS+Iik7Cit9CisKK3VuaXR0ZXN0IHsKKyAgLy8gVGhyb3duIGlmIGxvdyBzdXJyb2dhdGUgaXMgbWlzc2luZy4KKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKGNhc3QodWJ5dGVbXSkiXCJcXHUwZTAxIFxcdWQ4MzVcIiIpOworICBhdXRvIGpzb24gPSB0SnNvblByb3RvY29sKGJ1Zik7CisgIGFzc2VydFRocm93biFUUHJvdG9jb2xFeGNlcHRpb24oanNvbi5yZWFkU3RyaW5nKCkpOworfQorCit1bml0dGVzdCB7CisgIC8vIFRocm93biBpZiBoaWdoIHN1cnJvZ2F0ZSBpcyBtaXNzaW5nLgorICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoY2FzdCh1Ynl0ZVtdKSJcIlxcdTBlMDEgXFx1ZGQzZVwiIik7CisgIGF1dG8ganNvbiA9IHRKc29uUHJvdG9jb2woYnVmKTsKKyAgYXNzZXJ0VGhyb3duIVRQcm90b2NvbEV4Y2VwdGlvbihqc29uLnJlYWRTdHJpbmcoKSk7Cit9CisKK3VuaXR0ZXN0IHsKICAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50ZXN0LnByb3RvY29sOwogICB0ZXN0Q29udGFpbmVyU2l6ZUxpbWl0IShUSnNvblByb3RvY29sISgpKSgpOwogICB0ZXN0U3RyaW5nU2l6ZUxpbWl0IShUSnNvblByb3RvY29sISgpKSgpOwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvYmFzZS5kCmluZGV4IGY5N2FkYmUuLmEyM2IxYzcgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL2Jhc2UuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9iYXNlLmQKQEAgLTExOCw2ICsxMTgsMzggQEAKICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CiAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnlfOwogICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeV87CisKK3B1YmxpYzoKKworICBAcHJvcGVydHkgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gcHJvY2Vzc29yRmFjdG9yeV87CisgIH0KKworICBAcHJvcGVydHkgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQoKQorICB7CisgICAgcmV0dXJuIHNlcnZlclRyYW5zcG9ydF87CisgIH0KKworICBAcHJvcGVydHkgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOworICB9CisKKyAgQHByb3BlcnR5IFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOworICB9CisKKyAgQHByb3BlcnR5IFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgfQogfQogCiAvKioKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZy5kCmluZGV4IDAyMTY3OTkuLjU4NjBjMGMgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmcuZApAQCAtODkzLDE0ICs4OTMsMTQgQEAKICAgICAgIGNhbGxzU2luY2VSZXNpemVfID0gMDsKIAogICAgICAgZmFjdG9yeUlucHV0VHJhbnNwb3J0XyA9Ci0gICAgICAgIHNlcnZlcl8uaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoaW5wdXRUcmFuc3BvcnRfKTsKKyAgICAgICAgc2VydmVyXy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGlucHV0VHJhbnNwb3J0Xyk7CiAgICAgICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XyA9Ci0gICAgICAgIHNlcnZlcl8ub3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KG91dHB1dFRyYW5zcG9ydF8pOworICAgICAgICBzZXJ2ZXJfLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KG91dHB1dFRyYW5zcG9ydF8pOwogCiAgICAgICBpbnB1dFByb3RvY29sXyA9Ci0gICAgICAgIHNlcnZlcl8uaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8pOworICAgICAgICBzZXJ2ZXJfLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8pOwogICAgICAgb3V0cHV0UHJvdG9jb2xfID0KLSAgICAgICAgc2VydmVyXy5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfKTsKKyAgICAgICAgc2VydmVyXy5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8pOwogCiAgICAgICBpZiAoc2VydmVyXy5ldmVudEhhbmRsZXIpIHsKICAgICAgICAgY29ubmVjdGlvbkNvbnRleHRfID0KQEAgLTkwOCw3ICs5MDgsNyBAQAogICAgICAgfQogCiAgICAgICBhdXRvIGluZm8gPSBUQ29ubmVjdGlvbkluZm8oaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgc29ja2V0Xyk7Ci0gICAgICBwcm9jZXNzb3JfID0gc2VydmVyXy5wcm9jZXNzb3JGYWN0b3J5Xy5nZXRQcm9jZXNzb3IoaW5mbyk7CisgICAgICBwcm9jZXNzb3JfID0gc2VydmVyXy5wcm9jZXNzb3JGYWN0b3J5LmdldFByb2Nlc3NvcihpbmZvKTsKICAgICB9CiAKICAgICB+dGhpcygpIHsKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3NpbXBsZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvc2ltcGxlLmQKaW5kZXggZjcxODNhNy4uNWFiYTRjMSAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvc2ltcGxlLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvc2ltcGxlLmQKQEAgLTE0MCw3ICsxNDAsOSBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKLSAgICAgICAgbG9nRXJyb3IoIkNsaWVudCBkaWVkOiAlcyIsIHR0eCk7CisgICAgICAgIGlmICh0dHgudHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5FTkRfT0ZfRklMRSkgeworICAgICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZCB1bmV4cGVjdGVkbHk6ICVzIiwgdHR4KTsKKyAgICAgICAgfQogICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgbG9nRXJyb3IoIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXMiLCBlKTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3Rhc2twb29sLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90YXNrcG9vbC5kCmluZGV4IGI0NzIwYTQuLjY3MGU3MjAgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3Rhc2twb29sLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGFza3Bvb2wuZApAQCAtMjY4LDcgKzI2OCw5IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewotICAgICAgbG9nRXJyb3IoIkNsaWVudCBkaWVkOiAlcyIsIHR0eCk7CisgICAgICBpZiAodHR4LnR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuRU5EX09GX0ZJTEUpIHsKKyAgICAgICAgbG9nRXJyb3IoIkNsaWVudCBkaWVkIHVuZXhwZWN0ZWRseTogJXMiLCB0dHgpOworICAgICAgfQogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICBsb2dFcnJvcigiVW5jYXVnaHQgZXhjZXB0aW9uOiAlcyIsIGUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RocmVhZGVkLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90aHJlYWRlZC5kCmluZGV4IDFjZGU5ODMuLjMwMGNjODQgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RocmVhZGVkLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWQuZApAQCAtMTczLDcgKzE3Myw5IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewotICAgICAgbG9nRXJyb3IoIkNsaWVudCBkaWVkOiAlcyIsIHR0eCk7CisgICAgICBpZiAodHR4LnR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuRU5EX09GX0ZJTEUpIHsKKyAgICAgICAgbG9nRXJyb3IoIkNsaWVudCBkaWVkIHVuZXhwZWN0ZWRseTogJXMiLCB0dHgpOworICAgICAgfQogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICBsb2dFcnJvcigiVW5jYXVnaHQgZXhjZXB0aW9uOiAlcyIsIGUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvYmFzZS5kCmluZGV4IGRhMTY1ZDMuLjcwNGUxNmQgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9iYXNlLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L2Jhc2UuZApAQCAtOTUsMTYgKzk1LDcgQEAKIAogICAvLy8KICAgdGhpcyhUeXBlIHR5cGUsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sIFRocm93YWJsZSBuZXh0ID0gbnVsbCkgewotICAgIHN0cmluZyBtc2cgPSAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogIjsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgIGNhc2UgVHlwZS5VTktOT1dOOiBtc2cgfj0gIlVua25vd24gc2VydmVyIHRyYW5zcG9ydCBleGNlcHRpb24iOyBicmVhazsKLSAgICAgIGNhc2UgVHlwZS5OT1RfTElTVEVOSU5HOiBtc2cgfj0gIlNlcnZlciB0cmFuc3BvcnQgbm90IGxpc3RlbmluZyI7IGJyZWFrOwotICAgICAgY2FzZSBUeXBlLkFMUkVBRFlfTElTVEVOSU5HOiBtc2cgfj0gIlNlcnZlciB0cmFuc3BvcnQgYWxyZWFkeSBsaXN0ZW5pbmciOyBicmVhazsKLSAgICAgIGNhc2UgVHlwZS5SRVNPVVJDRV9GQUlMRUQ6IG1zZyB+PSAiQW4gdW5kZXJseWluZyByZXNvdXJjZSBmYWlsZWQiOyBicmVhazsKLSAgICAgIGRlZmF1bHQ6IG1zZyB+PSAiKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsgYnJlYWs7Ci0gICAgfQotCi0gICAgdGhpcyhtc2csIHR5cGUsIGZpbGUsIGxpbmUsIG5leHQpOworICAgIHRoaXMoZXJyb3JNc2codHlwZSksIHR5cGUsIGZpbGUsIGxpbmUsIG5leHQpOwogICB9CiAKICAgLy8vCkBAIC0xMjksNSArMTIwLDE4IEBACiAKIHByb3RlY3RlZDoKICAgVHlwZSB0eXBlXzsKKworcHJpdmF0ZToKKyAgc3RyaW5nIGVycm9yTXNnKFR5cGUgdHlwZSkgeworICAgIHN0cmluZyBtc2cgPSAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogIjsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgVHlwZS5VTktOT1dOOiBtc2cgfj0gIlVua25vd24gc2VydmVyIHRyYW5zcG9ydCBleGNlcHRpb24iOyBicmVhazsKKyAgICAgIGNhc2UgVHlwZS5OT1RfTElTVEVOSU5HOiBtc2cgfj0gIlNlcnZlciB0cmFuc3BvcnQgbm90IGxpc3RlbmluZyI7IGJyZWFrOworICAgICAgY2FzZSBUeXBlLkFMUkVBRFlfTElTVEVOSU5HOiBtc2cgfj0gIlNlcnZlciB0cmFuc3BvcnQgYWxyZWFkeSBsaXN0ZW5pbmciOyBicmVhazsKKyAgICAgIGNhc2UgVHlwZS5SRVNPVVJDRV9GQUlMRUQ6IG1zZyB+PSAiQW4gdW5kZXJseWluZyByZXNvdXJjZSBmYWlsZWQiOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6IG1zZyB+PSAiKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBtc2c7CisgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZmlsZS5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZmlsZS5kCmluZGV4IGNiOGJjZDcuLmZlODhlNzMgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZpbGUuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9maWxlLmQKQEAgLTM3LDcgKzM3LDggQEAKIGltcG9ydCBzdGQuYWxnb3JpdGhtIDogbWluLCBtYXg7CiBpbXBvcnQgc3RkLmNvbmN1cnJlbmN5OwogaW1wb3J0IHN0ZC5jb252IDogdG87Ci1pbXBvcnQgc3RkLmRhdGV0aW1lIDogQXV0b1N0YXJ0LCBkdXIsIER1cmF0aW9uLCBTdG9wV2F0Y2g7CitpbXBvcnQgc3RkLmRhdGV0aW1lIDogZHVyLCBEdXJhdGlvbjsKK2ltcG9ydCBzdGQuZGF0ZXRpbWUuc3RvcHdhdGNoIDogQXV0b1N0YXJ0LCBTdG9wV2F0Y2g7CiBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKIGltcG9ydCBzdGQuc3RkaW8gOiBGaWxlOwogaW1wb3J0IHRocmlmdC5iYXNlOwpAQCAtNjM3LDcgKzYzOCw3IEBACiAgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CiAgICAgaWYgKCFpc09wZW4pIHJldHVybjsKIAotICAgIHByaW9yaXR5U2VuZCh3cml0ZXJUaHJlYWRfLCBTaHV0ZG93bk1lc3NhZ2UoKSwgdGhpc1RpZCk7IC8vIEZJWE1FOiBTaG91bGQgdXNlIG5vcm1hbCBzZW5kIGhlcmUuCisgICAgc2VuZCh3cml0ZXJUaHJlYWRfLCBTaHV0ZG93bk1lc3NhZ2UoKSwgdGhpc1RpZCk7CiAgICAgcmVjZWl2ZSgoU2h1dGRvd25NZXNzYWdlIG1zZywgVGlkIHRpZCl7fSk7CiAgICAgaXNPcGVuXyA9IGZhbHNlOwogICB9CkBAIC04NDcsNyArODQ4LDcgQEAKICAgICAgICAgKGltbXV0YWJsZSh1Ynl0ZSlbXSBkYXRhKSB7CiAgICAgICAgICAgd2hpbGUgKGVycm9yT3BlbmluZykgewogICAgICAgICAgICAgbG9nRXJyb3IoIldyaXRlciB0aHJlYWQgZ29pbmcgdG8gc2xlZXAgZm9yICVzIMK1cyBkdWUgdG8gSU8gZXJyb3JzIiwKLSAgICAgICAgICAgICAgaW9FcnJvclNsZWVwRHVyYXRpb24uZnJhY1NlYy51c2Vjcyk7CisgICAgICAgICAgICAgIGlvRXJyb3JTbGVlcER1cmF0aW9uLnRvdGFsISJ1c2VjcyIpOwogCiAgICAgICAgICAgICAvLyBTbGVlcCBmb3IgaW9FcnJvclNsZWVwRHVyYXRpb24sIGJlaW5nIHJlYWR5IHRvIGJlIGludGVycnVwdGVkCiAgICAgICAgICAgICAvLyBieSBzaHV0ZG93biByZXF1ZXN0cy4KQEAgLTEwNzYsMTUgKzEwNzcsMTUgQEAKIAogICAgICAgLy8gSWYgYW55IGF0dGVtcHQgdGFrZXMgbW9yZSB0aGFuIDUwMG1zLCB0cmVhdCB0aGF0IGFzIGEgZmF0YWwgZmFpbHVyZSB0bwogICAgICAgLy8gYXZvaWQgbG9vcGluZyBvdmVyIGEgcG90ZW50aWFsbHkgdmVyeSBzbG93IG9wZXJhdGlvbi4KLSAgICAgIGVuZm9yY2Uoc3cucGVlaygpLm1zZWNzIDwgMTUwMCwKLSAgICAgICAgdGV4dCgiY2xvc2UoKSB0b29rICIsIHN3LnBlZWsoKS5tc2VjcywgIm1zLiIpKTsKKyAgICAgIGVuZm9yY2Uoc3cucGVlaygpLnRvdGFsISJtc2VjcyIgPCAxNTAwLAorICAgICAgICB0ZXh0KCJjbG9zZSgpIHRvb2sgIiwgc3cucGVlaygpLnRvdGFsISJtc2VjcyIsICJtcy4iKSk7CiAKICAgICAgIC8vIE5vcm1hbGx5LCBpdCB0YWtlcyBsZXNzIHRoYW4gNW1zIG9uIG15IGRldiBib3guCiAgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgYm94IGlzIGhlYXZpbHkgbG9hZGVkLCBzb21lIG9mIHRoZSB0ZXN0IHJ1bnMgY2FuIHRha2UKICAgICAgIC8vIGxvbmdlci4gQWRkaXRpb25hbGx5LCBvbiBhIFdpbmRvd3MgU2VydmVyIDIwMDggaW5zdGFuY2UgcnVubmluZyBpbgogICAgICAgLy8gYSBWaXJ0dWFsQm94IFZNLCBpdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IGFib3V0IGEgcXVhcnRlciBvZiB0aGUgcnVucwogICAgICAgLy8gdGFrZXMgKDIxNyDCsSAxKSBtcywgZm9yIHJlYXNvbnMgbm90IHlldCBrbm93bi4KLSAgICAgIGlmIChzdy5wZWVrKCkubXNlY3MgPiA1MCkgeworICAgICAgaWYgKHN3LnBlZWsoKS50b3RhbCEibXNlY3MiID4gNTApIHsKICAgICAgICAgKytudW1PdmVyOwogICAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9odHRwLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9odHRwLmQKaW5kZXggNTE4NmYzZC4uMGU1OGRlZSAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvaHR0cC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2h0dHAuZApAQCAtMTM0LDcgKzEzNCw3IEBACiAgICAgfQogCiAgICAgc3RhdGljIGJvb2wgY29tcFRvTG93ZXIodWJ5dGUgYSwgdWJ5dGUgYikgewotICAgICAgcmV0dXJuIGEgPT0gdG9Mb3dlcihjYXN0KGNoYXIpYik7CisgICAgICByZXR1cm4gdG9Mb3dlcihjYXN0KGNoYXIpYSkgPT0gdG9Mb3dlcihjYXN0KGNoYXIpYik7CiAgICAgfQogCiAgICAgaWYgKHN0YXJ0c1dpdGghY29tcFRvTG93ZXIoc3BsaXRbMF0sIGNhc3QodWJ5dGVbXSkidHJhbnNmZXItZW5jb2RpbmciKSkgewpAQCAtMzMwLDcgKzMzMCw3IEBACiAgICAgICAiSG9zdDogIiB+IGhvc3RfIH4gIlxyXG4iIH4KICAgICAgICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIgfgogICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAiIH4gdG8hc3RyaW5nKGRhdGFMZW5ndGgpIH4gIlxyXG4iIH4KLSAgICAgICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIKKyAgICAgICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIgfgogICAgICAgIlVzZXItQWdlbnQ6IFRocmlmdC8iIH4gVkVSU0lPTiB+ICIgKEQvVENsaWVudEh0dHBUcmFuc3BvcnQpXHJcbiIgfgogICAgICAgIlxyXG4iOwogICB9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5kCmluZGV4IDM4YjU2N2EuLmZjYjM4ZGEgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5kCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIG1vZHVsZSB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKIAoraW1wb3J0IGNvcmUuc3RkYy5lcnJubzogRUNPTk5SRVNFVDsKIGltcG9ydCBjb3JlLnRocmVhZCA6IFRocmVhZDsKIGltcG9ydCBjb3JlLnRpbWUgOiBkdXIsIER1cmF0aW9uOwogaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OwpAQCAtNzksOCArODAsOCBAQAogICAgIHZlcnNpb24gKG5vbmUpIGFzc2VydCh3cml0dGVuIDw9IGJ1Zi5sZW5ndGgsIHRleHQoIkltcGxlbWVudGF0aW9uIHdyb3RlICIgfgogICAgICAgIm1vcmUgZGF0YSB0aGFuIHJlcXVlc3RlZCB0bz8hICgiLCB3cml0dGVuLCAiIHZzLiAiLCBidWYubGVuZ3RoLCAiKSIpKTsKICAgfSBib2R5IHsKLSAgICBhc3NlcnQoMCwgIkRNRCBidWc/IOKAkyBXaHkgd291bGQgY29udHJhY3RzIHdvcmsgZm9yIGludGVyZmFjZXMsIGJ1dCBub3QgIgotICAgICAgImZvciBhYnN0cmFjdCBtZXRob2RzPyAiCisgICAgYXNzZXJ0KDAsICJETUQgYnVnPyDigJMgV2h5IHdvdWxkIGNvbnRyYWN0cyB3b3JrIGZvciBpbnRlcmZhY2VzLCBidXQgbm90ICIgfgorICAgICAgImZvciBhYnN0cmFjdCBtZXRob2RzPyAiIH4KICAgICAgICIoRXJyb3I6IGZ1bmN0aW9uIFvigKZdIGluIGFuZCBvdXQgY29udHJhY3RzIHJlcXVpcmUgZnVuY3Rpb24gYm9keSIpOwogICB9CiAKQEAgLTI1Niw3ICsyNTcsNyBAQAogICAgICAgICBuZXcgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKAogICAgICAgICAgIHRleHQoCiAgICAgICAgICAgICAiQWxsIGFkZHJlc3NlcyB0cmllZCBmYWlsZWQgKCIsCi0gICAgICAgICAgICBqb2luZXIobWFwIXF7dGV4dChhLl8wLCBgOiAiYCwgYS5fMS5tc2csIGAiYCl9KHppcChhZGRycywgZXJyb3JzKSksICIsICIpLAorICAgICAgICAgICAgam9pbmVyKG1hcCFxe3RleHQoYVswXSwgYDogImAsIGFbMV0ubXNnLCBgImApfSh6aXAoYWRkcnMsIGVycm9ycykpLCAiLCAiKSwKICAgICAgICAgICAgICIpLiIKICAgICAgICAgICApLAogICAgICAgICAgIGVycm9ycwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc3NsLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zc2wuZAppbmRleCBjMWVhYjI1Li5mOGNlNDBlIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zc2wuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zc2wuZApAQCAtMjQ5LDcgKzI0OSwxMyBAQAogICAgIH0KICAgICBjb3VudF8rKzsKIAotICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhUTFN2MV9tZXRob2QoKSk7CisgICAgc3RhdGljIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAxMDAwMGYpIHsgLy8gT1BFTlNTTF9WRVJTSU9OX0FUX0xFQVNUKDEsIDEpKSB7CisgICAgICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhUTFNfbWV0aG9kKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpOworICAgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGN0eF8sIFNTTF9PUF9OT19TU0x2Mik7CisgICAgfQorICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4XywgU1NMX09QX05PX1NTTHYzKTsgICAvLyBUSFJJRlQtMzE2NAogICAgIGVuZm9yY2UoY3R4XywgZ2V0U1NMRXhjZXB0aW9uKCJTU0xfQ1RYX25ldyIpKTsKICAgICBTU0xfQ1RYX3NldF9tb2RlKGN0eF8sIFNTTF9NT0RFX0FVVE9fUkVUUlkpOwogICB9CkBAIC00NDYsNiArNDUyLDcgQEAKICAgICB9CiAgICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKIAorICAgc3RhdGljIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgxMDEwMDAwZikgeyAvLyBPUEVOU1NMX1ZFUlNJT05fQkVGT1JFKDEsIDEpKSB7CiAgICAgU1NMX2xpYnJhcnlfaW5pdCgpOwogICAgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKIApAQCAtNDYzLDEyICs0NzAsMTQgQEAKICAgICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKGFzc3VtZU5vdGhyb3coJmR5bmxvY2tDcmVhdGVDYWxsYmFjaykpOwogICAgIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKGFzc3VtZU5vdGhyb3coJmR5bmxvY2tMb2NrQ2FsbGJhY2spKTsKICAgICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZkeW5sb2NrRGVzdHJveUNhbGxiYWNrKSk7CisgICB9CiAgIH0KIAogICBzdGF0aWMgdm9pZCBjbGVhbnVwT3BlblNTTCgpIHsKICAgICBpZiAoIWluaXRpYWxpemVkXykgcmV0dXJuOwogCiAgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7CisgICBzdGF0aWMgaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDEwMTAwMDBmKSB7IC8vIE9QRU5TU0xfVkVSU0lPTl9CRUZPUkUoMSwgMSkpIHsKICAgICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2sobnVsbCk7CiAgICAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhudWxsKTsKICAgICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhudWxsKTsKQEAgLTQ3Niw2ICs0ODUsNyBAQAogICAgIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CiAgICAgRVJSX2ZyZWVfc3RyaW5ncygpOwogICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgICB9CiAgIH0KIAogICBzdGF0aWMgZXh0ZXJuKEMpIHsKQEAgLTUxOCw3ICs1MjgsNyBAQAogICAgICAgY29uc3QoY2hhcikqIGZpbGUsIGludCBsaW5lKQogICAgIHsKICAgICAgIEdDLnJlbW92ZVJhbmdlKGwpOwotICAgICAgY2xlYXIoY2FzdChNdXRleClsKTsKKyAgICAgIGRlc3Ryb3koY2FzdChNdXRleClsKTsKICAgICAgIGZyZWUobCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L01ha2VmaWxlLmFtIGIvbGliL2QvdGVzdC9NYWtlZmlsZS5hbQppbmRleCAwNDgyNTgzLi4zYjZhNmYxIDEwMDc1NQotLS0gYS9saWIvZC90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9kL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTE5LDkgKzE5LDEwIEBACiAKIEFVVE9NQUtFX09QVElPTlMgPSBzZXJpYWwtdGVzdHMKIAotIyBUaHJpZnQgY29tcGlsZXIgcnVsZXMKK0JVSUxUX1NPVVJDRVMgPSB0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSBzZXJ2ZXItY2VydGlmaWNhdGUucGVtCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKKyMgVGhyaWZ0IGNvbXBpbGVyIHJ1bGVzCiAKIGRlYnVnX3Byb3RvX2dlbiA9ICQoYWRkcHJlZml4IGdlbi1kLywgRGVidWdQcm90b1Rlc3RfdHlwZXMuZCkKIApAQCAtNzEsNyArNzIsNyBAQAogCiBpZiBXSVRIX0RfU1NMX1RFU1RTCiBkX3Rlc3RfZmxhZ3MgKz0gJChETURfT1BFTlNTTF9GTEFHUykgLi4vJChEX1NTTF9MSUJfTkFNRSkKLXRhcmdldHMgPSB0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSBzZXJ2ZXItY2VydGlmaWNhdGUucGVtICQodGFyZ2V0c18pCit0YXJnZXRzID0gJCh0YXJnZXRzXykKIHJhbl90ZXN0cyA9ICQocmFuX3Rlc3RzXykKIGVsc2UKIHRhcmdldHMgPSAkKGZpbHRlci1vdXQgJChvcGVuc3NsX2RlcGVuZGVudF90YXJnZXRzKSwgJCh0YXJnZXRzXykpCkBAIC0xMjIsMyArMTIzLDUgQEAKIAl0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSBzZXJ2ZXItY2VydGlmaWNhdGUucGVtCiAKIFRFU1RTID0gJChyYW5fdGVzdHMpCisKK3ByZWNyb3NzOiAkKHRhcmdldHMpCmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L2FzeW5jX3Rlc3QuZCBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kCmluZGV4IGYxYTBjZjMuLmZiNzY1YWQgMTAwNjQ0Ci0tLSBhL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kCisrKyBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kCkBAIC0xMzAsNyArMTMwLDcgQEAKICAgfQogCiAgIGF1dG8gbWFuYWdlcnMgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyW21hbmFnZXJDb3VudF07Ci0gIHNjb3BlIChleGl0KSBmb3JlYWNoIChyZWYgbTsgbWFuYWdlcnMpIGNsZWFyKG0pOworICBzY29wZSAoZXhpdCkgZm9yZWFjaCAocmVmIG07IG1hbmFnZXJzKSBkZXN0cm95KG0pOwogCiAgIGF1dG8gY2xpZW50c1RocmVhZHMgPSBuZXcgVGhyZWFkR3JvdXA7CiAgIGZvcmVhY2ggKG1hbmFnZXJJbmRleCwgcmVmIG1hbmFnZXI7IG1hbmFnZXJzKSB7CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L2FzeW5jX3Rlc3RfcnVubmVyLnNoIGIvbGliL2QvdGVzdC9hc3luY190ZXN0X3J1bm5lci5zaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDRiOWI3YzAuLjdkNTA3ZWUKLS0tIGEvbGliL2QvdGVzdC9hc3luY190ZXN0X3J1bm5lci5zaAorKysgYi9saWIvZC90ZXN0L2FzeW5jX3Rlc3RfcnVubmVyLnNoCkBAIC0xLDYgKzEsMjggQEAKICMhL2Jpbi9iYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitDVVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKKwogIyBSdW5zIHRoZSBhc3luYyB0ZXN0IGluIGJvdGggU1NMIGFuZCBub24tU1NMIG1vZGUuCi0uL2FzeW5jX3Rlc3QgPiAvZGV2L251bGwgfHwgZXhpdCAxCiske0NVUn0vYXN5bmNfdGVzdCA+IC9kZXYvbnVsbCB8fCBleGl0IDEKIGVjaG8gIk5vbi1TU0wgdGVzdHMgZG9uZS4iCi0uL2FzeW5jX3Rlc3QgLS1zc2wgPiAvZGV2L251bGwgfHwgZXhpdCAxCiske0NVUn0vYXN5bmNfdGVzdCAtLXNzbCA+IC9kZXYvbnVsbCB8fCBleGl0IDEKIGVjaG8gIlNTTCB0ZXN0cyBkb25lLiIKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdC5kIGIvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQKaW5kZXggODViY2IyOS4uYjI0Yzk3YSAxMDA2NDQKLS0tIGEvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQKKysrIGIvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogbW9kdWxlIGNsaWVudF9wb29sX3Rlc3Q7CiAKK2ltcG9ydCBjb3JlLnN5bmMuc2VtYXBob3JlIDogU2VtYXBob3JlOwogaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uLCBkdXI7CiBpbXBvcnQgY29yZS50aHJlYWQgOiBUaHJlYWQ7CiBpbXBvcnQgc3RkLmFsZ29yaXRobTsKQEAgLTI4LDYgKzI5LDcgQEAKIGltcG9ydCBzdGQucmFuZ2U7CiBpbXBvcnQgc3RkLnN0ZGlvOwogaW1wb3J0IHN0ZC50eXBlY29uczsKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CiBpbXBvcnQgdGhyaWZ0LmJhc2U7CiBpbXBvcnQgdGhyaWZ0LmFzeW5jLmxpYmV2ZW50OwogaW1wb3J0IHRocmlmdC5hc3luYy5zb2NrZXQ7CkBAIC0zNyw5ICszOSwxMiBAQAogaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudDsKIGltcG9ydCB0aHJpZnQuY29kZWdlbi5jbGllbnRfcG9vbDsKIGltcG9ydCB0aHJpZnQuY29kZWdlbi5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CiBpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CiBpbXBvcnQgdGhyaWZ0LnNlcnZlci5zaW1wbGU7CiBpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOwogaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OwogaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKQEAgLTEwOCwxMSArMTEzLDI5IEBACiAgIH0KIH0KIAorY2xhc3MgU2VydmVyUHJlU2VydmVIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlciB7CisgIHRoaXMoU2VtYXBob3JlIHNlbSkgeworICAgIHNlbV8gPSBzZW07CisgIH0KKworICBvdmVycmlkZSB2b2lkIHByZVNlcnZlKCkgeworICAgIHNlbV8ubm90aWZ5KCk7CisgIH0KKworICBWYXJpYW50IGNyZWF0ZUNvbnRleHQoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7IHJldHVybiBWYXJpYW50LmluaXQ7IH0KKyAgdm9pZCBkZWxldGVDb250ZXh0KFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7fQorICB2b2lkIHByZVByb2Nlc3MoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUVHJhbnNwb3J0IHRyYW5zcG9ydCkge30KKworcHJpdmF0ZToKKyAgU2VtYXBob3JlIHNlbV87Cit9CisKIGNsYXNzIFNlcnZlclRocmVhZCA6IFRocmVhZCB7Ci0gIHRoaXMoRXhUZXN0SGFuZGxlciBoYW5kbGVyLCBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbikgeworICB0aGlzKEV4VGVzdEhhbmRsZXIgaGFuZGxlciwgU2VydmVyUHJlU2VydmVIYW5kbGVyIHNlcnZlckhhbmRsZXIsIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uKSB7CiAgICAgc3VwZXIoJnJ1bik7CiAgICAgaGFuZGxlcl8gPSBoYW5kbGVyOwogICAgIGNhbmNlbGxhdGlvbl8gPSBjYW5jZWxsYXRpb247CisgICAgc2VydmVySGFuZGxlcl8gPSBzZXJ2ZXJIYW5kbGVyOwogICB9CiBwcml2YXRlOgogICB2b2lkIHJ1bigpIHsKQEAgLTEyMywxNiArMTQ2LDE3IEBACiAgICAgICBzZXJ2ZXJUcmFuc3BvcnQucmVjdlRpbWVvdXQgPSBkdXIhInNlY29uZHMiKDMpOwogICAgICAgYXV0byB0cmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CiAKLSAgICAgIGF1dG8gc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoCi0gICAgICAgIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICAgICAgYXV0byBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIHNlcnZlci5ldmVudEhhbmRsZXIgPSBzZXJ2ZXJIYW5kbGVyXzsKICAgICAgIHNlcnZlci5zZXJ2ZShjYW5jZWxsYXRpb25fKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgd3JpdGVmbG4oIlNlcnZlciB0aHJlYWQgb24gcG9ydCAlcyBmYWlsZWQ6ICVzIiwgaGFuZGxlcl8ucG9ydCwgZSk7CiAgICAgfQogICB9CiAKLSAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb25fOwogICBFeFRlc3RIYW5kbGVyIGhhbmRsZXJfOworICBTZXJ2ZXJQcmVTZXJ2ZUhhbmRsZXIgc2VydmVySGFuZGxlcl87CisgIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uXzsKIH0KIAogdm9pZCBtYWluKHN0cmluZ1tdIGFyZ3MpIHsKQEAgLTE0NSw2ICsxNjksOSBAQAogCiAgIGltbXV0YWJsZSBwb3J0cyA9IGNhc3QoaW1tdXRhYmxlKWFycmF5KG1hcCEiY2FzdCh1c2hvcnQpYSIoaW90YShwb3J0LCBwb3J0ICsgNikpKTsKIAorICAvLyBzZW1hcGhvcmUgdGhhdCB3aWxsIGJlIGluY3JlbWVudGVkIHdoZW5ldmVyIGVhY2ggc2VydmVyIHRocmVhZCBoYXMgYm91bmQgYW5kIHN0YXJ0ZWQgbGlzdGVuaW5nCisgIFNlbWFwaG9yZSBzZW0gPSBuZXcgU2VtYXBob3JlKDApOworCiB2ZXJzaW9uIChub25lKSB7CiAgIC8vIENhbm5vdCB1c2UgdGhpcyBkdWUgdG8gbXVsdGlwbGUgRE1EIEBAQlVHQEBzOgogICAvLyAxLiDCu2Z1bmN0aW9uIEQgbWFpbiBpcyBhIG5lc3RlZCBmdW5jdGlvbiBhbmQgY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gYXJyYXnCqwpAQCAtMTc0LDExICsyMDEsMTAgQEAKIH0KIAogICAvLyBGaXJlIHVwIHRoZSBzZXJ2ZXIgdGhyZWFkcy4KLSAgZm9yZWFjaCAoaDsgaGFuZGxlcnMpIChuZXcgU2VydmVyVGhyZWFkKGgsIHNlcnZlckNhbmNlbGxhdGlvbikpLnN0YXJ0KCk7CisgIGZvcmVhY2ggKGg7IGhhbmRsZXJzKSAobmV3IFNlcnZlclRocmVhZChoLCBuZXcgU2VydmVyUHJlU2VydmVIYW5kbGVyKHNlbSksIHNlcnZlckNhbmNlbGxhdGlvbikpLnN0YXJ0KCk7CiAKLSAgLy8gR2l2ZSB0aGUgc2VydmVycyBzb21lIHRpbWUgdG8gZ2V0IHVwLiBUaGlzIHNob3VsZCByZWFsbHkgYmUgYWNjb21wbGlzaGVkCi0gIC8vIHZpYSBhIGJhcnJpZXIgaGVyZSBhbmQgaW4gdGhlIHByZVNlcnZlKCkgaG9vay4KLSAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDEwKSk7CisgIC8vIHdhaXQgdW50aWwgYWxsIHRoZSBoYW5kbGVycyBzaWduYWwgdGhhdCB0aGV5J3JlIHJlYWR5IHRvIHNlcnZlCisgIGZvcmVhY2ggKGg7IGhhbmRsZXJzKSAoc2VtLndhaXQoZHVyIWBzZWNvbmRzYCgxKSkpOwogCiAgIHN5bmNDbGllbnRQb29sVGVzdChwb3J0cywgaGFuZGxlcnMpOwogICBhc3luY0NsaWVudFBvb2xUZXN0KHBvcnRzLCBoYW5kbGVycyk7CkBAIC00MDksOCArNDM1LDggQEAKICAgICApKCk7CiAgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDIwKSk7CiAgICAgYXV0byByZXN1bHRUdXBsZSA9IHBhcnRpYWxSZXN1bHQuZmluaXNoR2V0KCk7Ci0gICAgZW5mb3JjZShyZXN1bHRUdXBsZS5fMCA9PSBwb3J0c1swIC4uIDJdKTsKLSAgICBlbmZvcmNlKGVxdWFsKG1hcCEiYS5wb3J0IihjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uW10pcmVzdWx0VHVwbGUuXzEpLAorICAgIGVuZm9yY2UocmVzdWx0VHVwbGVbMF0gPT0gcG9ydHNbMCAuLiAyXSk7CisgICAgZW5mb3JjZShlcXVhbChtYXAhImEucG9ydCIoY2FzdChUZXN0U2VydmljZUV4Y2VwdGlvbltdKXJlc3VsdFR1cGxlWzFdKSwKICAgICAgIHBvcnRzWzMgLi4gJCAtIDFdKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsuZCBiL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsuZAppbmRleCAzNTUxNWM4Li40MGQwNDgwIDEwMDY0NAotLS0gYS9saWIvZC90ZXN0L3NlcmlhbGl6YXRpb25fYmVuY2htYXJrLmQKKysrIGIvbGliL2QvdGVzdC9zZXJpYWxpemF0aW9uX2JlbmNobWFyay5kCkBAIC0xMyw3ICsxMyw3IEBACiAgKi8KIG1vZHVsZSBzZXJpYWxpemF0aW9uX2JlbmNobWFyazsKIAotaW1wb3J0IHN0ZC5kYXRldGltZSA6IEF1dG9TdGFydCwgU3RvcFdhdGNoOworaW1wb3J0IHN0ZC5kYXRldGltZS5zdG9wd2F0Y2ggOiBBdXRvU3RhcnQsIFN0b3BXYXRjaDsKIGltcG9ydCBzdGQubWF0aCA6IFBJOwogaW1wb3J0IHN0ZC5zdGRpbzsKIGltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OwpAQCAtNDYsNyArNDYsNyBAQAogICAgIH0KICAgICBzdy5zdG9wKCk7CiAKLSAgICBhdXRvIG1zZWNzID0gc3cucGVlaygpLm1zZWNzOworICAgIGF1dG8gbXNlY3MgPSBzdy5wZWVrKCkudG90YWwhIm1zZWNzIjsKICAgICB3cml0ZWZsbigiV3JpdGU6ICVzIG1zICglcyBrSHopIiwgbXNlY3MsIElURVJBVElPTlMgLyBtc2Vjcyk7CiAgIH0KIApAQCAtNjQsNyArNjQsNyBAQAogICAgIH0KICAgICBzdy5zdG9wKCk7CiAKLSAgICBhdXRvIG1zZWNzID0gc3cucGVlaygpLm1zZWNzOworICAgIGF1dG8gbXNlY3MgPSBzdy5wZWVrKCkudG90YWwhIm1zZWNzIjsKICAgICB3cml0ZWZsbigiIFJlYWQ6ICVzIG1zICglcyBrSHopIiwgbXNlY3MsIElURVJBVElPTlMgLyBtc2Vjcyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50LmQgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NsaWVudC5kCmluZGV4IGZkNTMzMjguLjQ5NDE5ZjcgMTAwNjQ0Ci0tLSBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50LmQKKysrIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jbGllbnQuZApAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IHN0ZC5zdGRpbzsKIGltcG9ydCBzdGQuc3RyaW5nOwogaW1wb3J0IHN0ZC50cmFpdHM7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CiBpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uY2xpZW50OwogaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOwogaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CkBAIC03NSw2ICs3Niw3IEBACiAgICAgInNzbCIsICZzc2wsCiAgICAgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnRUeXBlLAogICAgICJ0cmFjZSIsICZ0cmFjZSwKKyAgICAicG9ydCIsICZwb3J0LAogICAgICJob3N0IiwgKHN0cmluZyBfLCBzdHJpbmcgdmFsdWUpIHsKICAgICAgIGF1dG8gcGFydHMgPSBzcGxpdCh2YWx1ZSwgIjoiKTsKICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7CkBAIC04NywxMyArODksMTQgQEAKICAgICAgIH0KICAgICB9CiAgICk7CisgIHBvcnQgPSB0byF1c2hvcnQocG9ydCk7CiAKICAgVFNvY2tldCBzb2NrZXQ7CiAgIGlmIChzc2wpIHsKICAgICBhdXRvIHNzbENvbnRleHQgPSBuZXcgVFNTTENvbnRleHQoKTsKICAgICBzc2xDb250ZXh0LmNpcGhlcnMgPSAiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIjsKICAgICBzc2xDb250ZXh0LmF1dGhlbnRpY2F0ZSA9IHRydWU7Ci0gICAgc3NsQ29udGV4dC5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcygiLi90cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSIpOworICAgIHNzbENvbnRleHQubG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoIi4uLy4uLy4uL3Rlc3Qva2V5cy9DQS5wZW0iKTsKICAgICBzb2NrZXQgPSBuZXcgVFNTTFNvY2tldChzc2xDb250ZXh0LCBob3N0LCBwb3J0KTsKICAgfSBlbHNlIHsKICAgICBzb2NrZXQgPSBuZXcgVFNvY2tldChob3N0LCBwb3J0KTsKQEAgLTI4MCw2ICsyODMsMTUgQEAKICAgICAgIH0KIAogICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZSgiY2xpZW50LnRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpID0+Iik7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgdm9pZFxuRkFJTFVSRSIpOworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0RXhjZXB0aW9uIGZhaWxlZC4iKTsKKyAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgIHslc30iLCBlLm1zZyk7CisgICAgICB9CisKKyAgICAgIHRyeSB7CiAgICAgICAgIGlmICh0cmFjZSkgd3JpdGUoImNsaWVudC50ZXN0RXhjZXB0aW9uKFwic3VjY2Vzc1wiKSA9PiIpOwogICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigic3VjY2VzcyIpOwogICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgdm9pZCIpOwpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9ydW5uZXIuc2ggYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3J1bm5lci5zaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGZiZTc1ZjAuLjUxYmZlOTkKLS0tIGEvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9ydW5uZXIuc2gKKysrIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9ydW5uZXIuc2gKQEAgLTEsMTAgKzEsMzQgQEAKICMhL2Jpbi9iYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCiAjIFJ1bnMgdGhlIEQgVGhyaWZ0VGVzdCBjbGllbnQgYW5kIHNlcnZlcnMgZm9yIGFsbCBjb21iaW5hdGlvbnMgb2YgdHJhbnNwb3J0LAogIyBwcm90b2NvbCwgU1NMLW1vZGUgYW5kIHNlcnZlciB0eXBlLgogIyBQYXNzIC1rIHRvIGtlZXAgZ29pbmcgYWZ0ZXIgZmFpbGVkIHRlc3RzLgogCitDVVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKKwogcHJvdG9jb2xzPSJiaW5hcnkgY29tcGFjdCBqc29uIgotdHJhbnNwb3J0cz0iYnVmZmVyZWQgZnJhbWVkIGh0dHAgcmF3IgorIyBUT0RPOiBmaXggYW5kIGVuYWJsZSBodHRwCisjIHRyYW5zcG9ydHM9ImJ1ZmZlcmVkIGZyYW1lZCByYXcgaHR0cCIKK3RyYW5zcG9ydHM9ImJ1ZmZlcmVkIGZyYW1lZCByYXciCiBzZXJ2ZXJzPSJzaW1wbGUgdGFza3Bvb2wgdGhyZWFkZWQiCiBmcmFtZWRfb25seV9zZXJ2ZXJzPSJub25ibG9ja2luZyBwb29sZWROb25ibG9ja2luZyIKIApAQCAtMjEsMTYgKzQ1LDIwIEBACiAgICAgICAgIGVzYWMKIAogICAgICAgICBhcmdzPSItLXRyYW5zcG9ydD0kdHJhbnNwb3J0IC0tcHJvdG9jb2w9JHByb3RvY29sJHNzbCIKLSAgICAgICAgLi90aHJpZnRfdGVzdF9zZXJ2ZXIgJGFyZ3MgLS1zZXJ2ZXItdHlwZT0kc2VydmVyID4gL2Rldi9udWxsICYKKyAgICAgICAgJHtDVVJ9L3RocmlmdF90ZXN0X3NlcnZlciAkYXJncyAtLXNlcnZlci10eXBlPSRzZXJ2ZXIgPiAvZGV2L251bGwgJgogICAgICAgICBzZXJ2ZXJfcGlkPSQhCiAKICAgICAgICAgIyBHaXZlIHRoZSBzZXJ2ZXIgc29tZSB0aW1lIHRvIGdldCB1cCBhbmQgY2hlY2sgaWYgaXQgcnVucyAoeWVzLCB0aGlzCiAgICAgICAgICMgaXMgYSBodWdlIGtsdWRnZSwgc2hvdWxkIGFkZCBhIGNvbm5lY3QgdGltZW91dCB0byB0ZXN0IGNsaWVudCkuCiAgICAgICAgIGNsaWVudF9yYz0tMQotICAgICAgICBzbGVlcCAwLjAxCisgICAgICAgIGlmIFsgIiRzZXJ2ZXIiID0gInRhc2twb29sIiBdOyB0aGVuCisgICAgICAgICAgc2xlZXAgMC41CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzbGVlcCAwLjAyCisgICAgICAgIGZpCiAgICAgICAgIGtpbGwgLTAgJHNlcnZlcl9waWQgMj4vZGV2L251bGwKICAgICAgICAgaWYgWyAkPyAtZXEgMCBdOyB0aGVuCi0gICAgICAgICAgLi90aHJpZnRfdGVzdF9jbGllbnQgJGFyZ3MgLS1udW1UZXN0cz0xMCA+IC9kZXYvbnVsbAorICAgICAgICAgICR7Q1VSfS90aHJpZnRfdGVzdF9jbGllbnQgJGFyZ3MgLS1udW1UZXN0cz0xMCA+IC9kZXYvbnVsbAogICAgICAgICAgIGNsaWVudF9yYz0kPwogCiAgICAgICAgICAgIyBUZW1wb3JhcmlseSByZWRpcmVjdCBzdGRlcnIgdG8gbnVsbCB0byBhdm9pZCBqb2IgY29udHJvbCBtZXNzYWdlcywKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3Rfc2VydmVyLmQgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlci5kCmluZGV4IDE2MDhhNTcuLmI1ODIyNTMgMTAwNjQ0Ci0tLSBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3Rfc2VydmVyLmQKKysrIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIuZApAQCAtMTYsOCArMTYsMTEgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisKIG1vZHVsZSB0aHJpZnRfdGVzdF9zZXJ2ZXI7CiAKK2ltcG9ydCBjb3JlLnN0ZGMuZXJybm8gOiBlcnJubzsKK2ltcG9ydCBjb3JlLnN0ZGMuc2lnbmFsIDogc2lnbmFsLCBzaWdmbl90LCBTSUdJTlQsIFNJR19ERkwsIFNJR19FUlI7CiBpbXBvcnQgY29yZS50aHJlYWQgOiBkdXIsIFRocmVhZDsKIGltcG9ydCBzdGQuYWxnb3JpdGhtOwogaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOwpAQCAtNDAsNiArNDMsNyBAQAogaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuZnJhbWVkOwogaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuaHR0cDsKIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNzbDsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CiBpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsKIGltcG9ydCB0ZXN0X3V0aWxzOwogCkBAIC04Niw2ICs5MCwxMSBAQAogICAgIHJldHVybiB0aGluZzsKICAgfQogCisgIG92ZXJyaWRlIGJvb2wgdGVzdEJvb2woYm9vbCB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0Qm9vbChcIiVzXCIpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCiAgIG92ZXJyaWRlIFh0cnVjdCB0ZXN0U3RydWN0KHJlZiBjb25zdChYdHJ1Y3QpIHRoaW5nKSB7CiAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RTdHJ1Y3Qoe1wiJXNcIiwgJXMsICVzLCAlc30pIiwKICAgICAgIHRoaW5nLnN0cmluZ190aGluZywgdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcpOwpAQCAtMTM4LDcgKzE0NywxNyBAQAogCiAgIG92ZXJyaWRlIEluc2FuaXR5W051bWJlcnpdW1VzZXJJZF0gdGVzdEluc2FuaXR5KHJlZiBjb25zdChJbnNhbml0eSkgYXJndW1lbnQpIHsKICAgICBpZiAodHJhY2VfKSB3cml0ZWxuKCJ0ZXN0SW5zYW5pdHkoKSIpOwotICAgIHJldHVybiB0ZXN0SW5zYW5pdHlSZXR1cm47CisgICAgSW5zYW5pdHlbTnVtYmVyel1bVXNlcklkXSByZXQ7CisgICAgSW5zYW5pdHlbTnVtYmVyel0gbTE7CisgICAgSW5zYW5pdHlbTnVtYmVyel0gbTI7CisgICAgSW5zYW5pdHkgdG1wOworICAgIHRtcCA9IGNhc3QoSW5zYW5pdHkpYXJndW1lbnQ7CisgICAgbTFbTnVtYmVyei5UV09dID0gdG1wOworICAgIG0xW051bWJlcnouVEhSRUVdID0gdG1wOworICAgIG0yW051bWJlcnouU0lYXSA9IEluc2FuaXR5KCk7CisgICAgcmV0WzFdID0gbTE7CisgICAgcmV0WzJdID0gbTI7CisgICAgcmV0dXJuIHJldDsKICAgfQogCiAgIG92ZXJyaWRlIFh0cnVjdCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBzdHJpbmdbc2hvcnRdIGFyZzMsCkBAIC0xNTUsNiArMTc0LDggQEAKICAgICAgIGUuZXJyb3JDb2RlID0gMTAwMTsKICAgICAgIGUubWVzc2FnZSA9IGFyZzsKICAgICAgIHRocm93IGU7CisgICAgfSBlbHNlIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigpOwogICAgIH0gZWxzZSBpZiAoYXJnID09ICJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpIHsKICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCk7CiAgICAgfQpAQCAtMTg4LDE0ICsyMDksNDQgQEAKICAgYm9vbCB0cmFjZV87CiB9CiAKK3NoYXJlZChib29sKSBnU2h1dGRvd24gPSBmYWxzZTsKKworbm90aHJvdyBAbm9nYyBleHRlcm4oQykgdm9pZCBoYW5kbGVTaWduYWwoaW50IHNpZykgeworICBnU2h1dGRvd24gPSB0cnVlOworfQorCisvLyBSdW5zIGEgdGhyZWFkIHRoYXQgd2FpdHMgZm9yIHNodXRkb3duIHRvIGJlCisvLyBzaWduYWxlZCBhbmQgdGhlbiB0cmlnZ2VycyBjYW5jZWxsYXRpb24sCisvLyBjYXVzaW5nIHRoZSBzZXJ2ZXIgdG8gc3RvcC4gIFdoaWxlIHdlIGNvdWxkCisvLyB1c2UgYSBzaWduYWxmZCBmb3IgdGhpcyBwdXJwb3NlLCB3ZSBhcmUgaW5zdGVhZAorLy8gb3B0aW5nIGZvciBhIGJ1c3kgd2FpdGluZyBzY2hlbWUgZm9yIG1heGltdW0KKy8vIHBvcnRhYmlsaXR5IHNpbmNlIHNpZ25hbGZkIGlzIGEgbGludXggdGhpbmcuCisKK2NsYXNzIFNodXRkb3duVGhyZWFkIDogVGhyZWFkIHsKKyAgdGhpcyhUQ2FuY2VsbGF0aW9uT3JpZ2luIGNhbmNlbGxhdGlvbikgeworICAgIGNhbmNlbGxhdGlvbl8gPSBjYW5jZWxsYXRpb247CisgICAgc3VwZXIoJnJ1bik7CisgIH0KKyAgCitwcml2YXRlOgorICB2b2lkIHJ1bigpIHsKKyAgICB3aGlsZSAoIWdTaHV0ZG93bikgeworICAgICAgVGhyZWFkLnNsZWVwKGR1ciEoIm1zZWNzIikoMjUpKTsKKyAgICB9CisgICAgY2FuY2VsbGF0aW9uXy50cmlnZ2VyKCk7CisgIH0KKyAgCisgIFRDYW5jZWxsYXRpb25PcmlnaW4gY2FuY2VsbGF0aW9uXzsKK30KKwogdm9pZCBtYWluKHN0cmluZ1tdIGFyZ3MpIHsKICAgdXNob3J0IHBvcnQgPSA5MDkwOwogICBTZXJ2ZXJUeXBlIHNlcnZlclR5cGU7CiAgIFByb3RvY29sVHlwZSBwcm90b2NvbFR5cGU7CiAgIHNpemVfdCBudW1JT1RocmVhZHMgPSAxOwogICBUcmFuc3BvcnRUeXBlIHRyYW5zcG9ydFR5cGU7Ci0gIGJvb2wgc3NsOwotICBib29sIHRyYWNlOworICBib29sIHNzbCA9IGZhbHNlOworICBib29sIHRyYWNlID0gdHJ1ZTsKICAgc2l6ZV90IHRhc2tQb29sU2l6ZSA9IHRvdGFsQ1BVczsKIAogICBnZXRvcHQoYXJncywgInBvcnQiLCAmcG9ydCwgInByb3RvY29sIiwgJnByb3RvY29sVHlwZSwgInNlcnZlci10eXBlIiwKQEAgLTI0OSw4ICszMDAsOCBAQAogICBpZiAoc3NsKSB7CiAgICAgYXV0byBzc2xDb250ZXh0ID0gbmV3IFRTU0xDb250ZXh0KCk7CiAgICAgc3NsQ29udGV4dC5zZXJ2ZXJTaWRlID0gdHJ1ZTsKLSAgICBzc2xDb250ZXh0LmxvYWRDZXJ0aWZpY2F0ZSgiLi9zZXJ2ZXItY2VydGlmaWNhdGUucGVtIik7Ci0gICAgc3NsQ29udGV4dC5sb2FkUHJpdmF0ZUtleSgiLi9zZXJ2ZXItcHJpdmF0ZS1rZXkucGVtIik7CisgICAgc3NsQ29udGV4dC5sb2FkQ2VydGlmaWNhdGUoIi4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0Iik7CisgICAgc3NsQ29udGV4dC5sb2FkUHJpdmF0ZUtleSgiLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5rZXkiKTsKICAgICBzc2xDb250ZXh0LmNpcGhlcnMgPSAiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIjsKICAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBzc2xDb250ZXh0KTsKICAgfSBlbHNlIHsKQEAgLTI2Miw4ICszMTMsMjYgQEAKICAgYXV0byBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoc2VydmVyVHlwZSwgbnVtSU9UaHJlYWRzLCB0YXNrUG9vbFNpemUsCiAgICAgcHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CiAKKyAgLy8gU2V0IHVwIFNJR0lOVCBzaWduYWwgaGFuZGxpbmcKKyAgc2lnZm5fdCBvbGRIYW5kbGVyID0gc2lnbmFsKFNJR0lOVCwgJmhhbmRsZVNpZ25hbCk7CisgIGVuZm9yY2Uob2xkSGFuZGxlciAhPSBTSUdfRVJSLAorICAgICJDb3VsZCBub3QgcmVwbGFjZSB0aGUgU0lHSU5UIHNpZ25hbCBoYW5kbGVyOiBlcnJubyB7MH0iLmZvcm1hdChlcnJubygpKSk7CisgIAorICAvLyBTZXQgdXAgYSBzZXJ2ZXIgY2FuY2VsbGF0aW9uIHRyaWdnZXIKKyAgYXV0byBjYW5jZWwgPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbigpOworCisgIC8vIFNldCB1cCBhIGxpc3RlbmVyIGZvciB0aGUgc2h1dGRvd24gY29uZGl0aW9uIC0gdGhpcyB3aWxsCisgIC8vIHdha2UgdXAgd2hlbiB0aGUgc2lnbmFsIG9jY3VycyBhbmQgdHJpZ2dlciBjYW5jZWxsYXRpb24uCisgIGF1dG8gc2h1dGRvd24gPSBuZXcgU2h1dGRvd25UaHJlYWQoY2FuY2VsKTsKKyAgc2h1dGRvd24uc3RhcnQoKTsKKyAgCisgIC8vIFNlcnZlIGZyb20gdGhpcyB0aHJlYWQ7IHRoZSBzaWduYWwgd2lsbCBzdG9wIHRoZSBzZXJ2ZXIKKyAgLy8gYW5kIGNvbnRyb2wgd2lsbCByZXR1cm4gaGVyZQogICB3cml0ZWZsbigiU3RhcnRpbmcgJXMvJXMgJXMgVGhyaWZ0VGVzdCBzZXJ2ZXIgJXNvbiBwb3J0ICVzLi4uIiwgcHJvdG9jb2xUeXBlLAogICAgIHRyYW5zcG9ydFR5cGUsIHNlcnZlclR5cGUsIHNzbCA/ICIodXNpbmcgU1NMKSAiOiAiIiwgcG9ydCk7Ci0gIHNlcnZlci5zZXJ2ZSgpOworICBzZXJ2ZXIuc2VydmUoY2FuY2VsKTsKKyAgc2h1dGRvd24uam9pbigpOworICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKyAgICAKICAgd3JpdGVsbigiZG9uZS4iKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdHJhbnNwb3J0X3Rlc3QuZCBiL2xpYi9kL3Rlc3QvdHJhbnNwb3J0X3Rlc3QuZAppbmRleCAwOWJmNmZkLi42MjNlMDNmIDEwMDY0NAotLS0gYS9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0LmQKKysrIGIvbGliL2QvdGVzdC90cmFuc3BvcnRfdGVzdC5kCkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgfQogCiAgIH50aGlzKCkgewotICAgIGNsZWFyKGlubmVyXyk7CisgICAgZGVzdHJveShpbm5lcl8pOwogICB9CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9saWIvZGFydC8uYW5hbHlzaXNfb3B0aW9ucyBiL2xpYi9kYXJ0Ly5hbmFseXNpc19vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMGQ0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvTElDRU5TRSBiL2xpYi9kYXJ0L0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhY2I2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L0xJQ0VOU0UKQEAgLTAsMCArMSwxNiBAQAorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvTWFrZWZpbGUuYW0gYi9saWIvZGFydC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzNhODgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2FsbC1sb2NhbDoKKwkkKERBUlRQVUIpIGdldAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciAucHViCisJZmluZCAuIC10eXBlIGQgLW5hbWUgIi5kYXJ0X3Rvb2wiIHwgeGFyZ3MgJChSTSkgLXIKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAiLnBhY2thZ2VzIiB8IHhhcmdzICQoUk0pCisJZmluZCAuIC10eXBlIGQgLW5hbWUgInBhY2thZ2VzIiB8IHhhcmdzICQoUk0pIC1yCisKK2NoZWNrLWxvY2FsOiBhbGwKKworZGlzdC1ob29rOgorCSQoUk0pIC1yICQoZGlzdGRpcikvLnB1YgorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIC1uYW1lICIuZGFydF90b29sIiB8IHhhcmdzICQoUk0pIC1yCisJZmluZCAkKGRpc3RkaXIpIC10eXBlIGYgLW5hbWUgIi5wYWNrYWdlcyIgfCB4YXJncyAkKFJNKQorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgorCitFWFRSQV9ESVNUID0gXAorCS5hbmFseXNpc19vcHRpb25zCisKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L1JFQURNRS5tZCBiL2xpYi9kYXJ0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzMwMjkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjYgQEAKK1RocmlmdCBEYXJ0IExpYnJhcnkKKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworVXNpbmcgVGhyaWZ0IHdpdGggRGFydAorPT09PT09PT09PT09PT09PT09PT0KKworRGFydCAxLjI0LjMgb3IgbmV3ZXIgaXMgcmVxdWlyZWQKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvZGFydC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZjYwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNiBAQAorIyBEYXJ0IENvZGluZyBTdGFuZGFyZHMKKworIyMjIFBsZWFzZSBmb2xsb3c6CisgKiBbVGhyaWZ0IEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorICogW1VzZSBkYXJ0Zm10XShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvdG9vbHMvZGFydGZtdC8pIGFuZCBmb2xsb3cgdGhlIAorICAgW0RhcnQgU3R5bGUgR3VpZGVdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9hcnRpY2xlcy9zdHlsZS1ndWlkZS8pCmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL2Jyb3dzZXIvdF93ZWJfc29ja2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL2Jyb3dzZXIvdF93ZWJfc29ja2V0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjOWZmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvYnJvd3Nlci90X3dlYl9zb2NrZXQuZGFydApAQCAtMCwwICsxLDEyOSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnNyYy5icm93c2VyOworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdwYWNrYWdlOmRhcnQyX2NvbnN0YW50L2NvbnZlcnQuZGFydCcgc2hvdyBiYXNlNjQ7CitpbXBvcnQgJ2RhcnQ6aHRtbCcgc2hvdyBDbG9zZUV2ZW50OworaW1wb3J0ICdkYXJ0Omh0bWwnIHNob3cgRXZlbnQ7CitpbXBvcnQgJ2RhcnQ6aHRtbCcgc2hvdyBNZXNzYWdlRXZlbnQ7CitpbXBvcnQgJ2RhcnQ6aHRtbCcgc2hvdyBXZWJTb2NrZXQ7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCisvLy8gQSBbVFNvY2tldF0gYmFja2VkIGJ5IGEgW1dlYlNvY2tldF0gZnJvbSBkYXJ0Omh0bWwKK2NsYXNzIFRXZWJTb2NrZXQgaW1wbGVtZW50cyBUU29ja2V0IHsKKyAgZmluYWwgVXJpIHVybDsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4gX29uU3RhdGVDb250cm9sbGVyOworICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZSA9PiBfb25TdGF0ZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PiBfb25FcnJvckNvbnRyb2xsZXI7CisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yID0+IF9vbkVycm9yQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+IF9vbk1lc3NhZ2VDb250cm9sbGVyOworICBTdHJlYW08VWludDhMaXN0PiBnZXQgb25NZXNzYWdlID0+IF9vbk1lc3NhZ2VDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBMaXN0PFVpbnQ4TGlzdD4gX3JlcXVlc3RzID0gW107CisKKyAgVFdlYlNvY2tldCh0aGlzLnVybCkKKyAgICAgIDogX29uU3RhdGVDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbkVycm9yQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBfb25NZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpIHsKKyAgICBpZiAodXJsID09IG51bGwgfHwgIXVybC5oYXNBdXRob3JpdHkgfHwgIXVybC5oYXNQb3J0KSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignSW52YWxpZCB1cmwnKTsKKyAgICB9CisgIH0KKworICBXZWJTb2NrZXQgX3NvY2tldDsKKworICBib29sIGdldCBpc09wZW4gPT4gX3NvY2tldCAhPSBudWxsICYmIF9zb2NrZXQucmVhZHlTdGF0ZSA9PSBXZWJTb2NrZXQuT1BFTjsKKworICBib29sIGdldCBpc0Nsb3NlZCA9PgorICAgICAgX3NvY2tldCA9PSBudWxsIHx8IF9zb2NrZXQucmVhZHlTdGF0ZSA9PSBXZWJTb2NrZXQuQ0xPU0VEOworCisgIEZ1dHVyZSBvcGVuKCkgeworICAgIGlmICghaXNDbG9zZWQpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCisgICAgICAgICAgVFRyYW5zcG9ydEVycm9yVHlwZS5BTFJFQURZX09QRU4sICdTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQnKTsKKyAgICB9CisKKyAgICBfc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwudG9TdHJpbmcoKSk7CisgICAgX3NvY2tldC5vbkVycm9yLmxpc3Rlbihfb25FcnJvcik7CisgICAgX3NvY2tldC5vbk9wZW4ubGlzdGVuKF9vbk9wZW4pOworICAgIF9zb2NrZXQub25DbG9zZS5saXN0ZW4oX29uQ2xvc2UpOworICAgIF9zb2NrZXQub25NZXNzYWdlLmxpc3Rlbihfb25NZXNzYWdlKTsKKworICAgIHJldHVybiBfc29ja2V0Lm9uT3Blbi5maXJzdDsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIHsKKyAgICBpZiAoX3NvY2tldCAhPSBudWxsKSB7CisgICAgICBfc29ja2V0LmNsb3NlKCk7CisgICAgICByZXR1cm4gX3NvY2tldC5vbkNsb3NlLmZpcnN0OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZSgpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2VuZChVaW50OExpc3QgZGF0YSkgeworICAgIF9yZXF1ZXN0cy5hZGQoZGF0YSk7CisgICAgX3NlbmRSZXF1ZXN0cygpOworICB9CisKKyAgdm9pZCBfc2VuZFJlcXVlc3RzKCkgeworICAgIHdoaWxlIChpc09wZW4gJiYgX3JlcXVlc3RzLmlzTm90RW1wdHkpIHsKKyAgICAgIFVpbnQ4TGlzdCBkYXRhID0gX3JlcXVlc3RzLnJlbW92ZUF0KDApOworICAgICAgX3NvY2tldC5zZW5kU3RyaW5nKGJhc2U2NC5lbmNvZGUoZGF0YSkpOworICAgIH0KKyAgfQorCisgIHZvaWQgX29uT3BlbihFdmVudCBldmVudCkgeworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLk9QRU4pOworICAgIF9zZW5kUmVxdWVzdHMoKTsKKyAgfQorCisgIHZvaWQgX29uQ2xvc2UoQ2xvc2VFdmVudCBldmVudCkgeworICAgIF9zb2NrZXQgPSBudWxsOworCisgICAgaWYgKF9yZXF1ZXN0cy5pc05vdEVtcHR5KSB7CisgICAgICBfb25FcnJvckNvbnRyb2xsZXIKKyAgICAgICAgICAuYWRkKG5ldyBTdGF0ZUVycm9yKCdTb2NrZXQgd2FzIGNsb3NlZCB3aXRoIHBlbmRpbmcgcmVxdWVzdHMnKSk7CisgICAgfQorICAgIF9yZXF1ZXN0cy5jbGVhcigpOworCisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuQ0xPU0VEKTsKKyAgfQorCisgIHZvaWQgX29uTWVzc2FnZShNZXNzYWdlRXZlbnQgbWVzc2FnZSkgeworICAgIHRyeSB7CisgICAgICBVaW50OExpc3QgZGF0YSA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoYmFzZTY0LmRlY29kZShtZXNzYWdlLmRhdGEpKTsKKyAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyLmFkZChkYXRhKTsKKyAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoXykgeworICAgICAgdmFyIGVycm9yID0gbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgIkV4cGVjdGVkIGEgQmFzZSA2NCBlbmNvZGVkIHN0cmluZy4iKTsKKyAgICAgIF9vbkVycm9yQ29udHJvbGxlci5hZGQoZXJyb3IpOworICAgIH0KKyAgfQorCisgIHZvaWQgX29uRXJyb3IoRXZlbnQgZXZlbnQpIHsKKyAgICBjbG9zZSgpOworICAgIF9vbkVycm9yQ29udHJvbGxlci5hZGQoZXZlbnQudG9TdHJpbmcoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3RjcF9zb2NrZXQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3RjcF9zb2NrZXQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzE0ODAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9jb25zb2xlL3RfdGNwX3NvY2tldC5kYXJ0CkBAIC0wLDAgKzEsODEgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC5zcmMuY29uc29sZS50X3RjcF9zb2NrZXQ7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6aW8nOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKworLy8vIEEgW1RTb2NrZXRdIGJhY2tlZCBieSBhIFtTb2NrZXRdIGZyb20gZGFydDppbworY2xhc3MgVFRjcFNvY2tldCBpbXBsZW1lbnRzIFRTb2NrZXQgeworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4gX29uU3RhdGVDb250cm9sbGVyOworICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZSA9PiBfb25TdGF0ZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PiBfb25FcnJvckNvbnRyb2xsZXI7CisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yID0+IF9vbkVycm9yQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+IF9vbk1lc3NhZ2VDb250cm9sbGVyOworICBTdHJlYW08VWludDhMaXN0PiBnZXQgb25NZXNzYWdlID0+IF9vbk1lc3NhZ2VDb250cm9sbGVyLnN0cmVhbTsKKworICBUVGNwU29ja2V0KFNvY2tldCBzb2NrZXQpCisgICAgICA6IF9vblN0YXRlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBfb25FcnJvckNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSB7CisgICAgaWYgKHNvY2tldCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCdzb2NrZXQnKTsKKyAgICB9CisKKyAgICBfc29ja2V0ID0gc29ja2V0OworICAgIF9zb2NrZXQubGlzdGVuKF9vbk1lc3NhZ2UsIG9uRXJyb3I6IF9vbkVycm9yLCBvbkRvbmU6IGNsb3NlKTsKKyAgfQorCisgIFNvY2tldCBfc29ja2V0OworCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfc29ja2V0ICE9IG51bGw7CisKKyAgYm9vbCBnZXQgaXNDbG9zZWQgPT4gX3NvY2tldCA9PSBudWxsOworCisgIEZ1dHVyZSBvcGVuKCkgYXN5bmMgeworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLk9QRU4pOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgYXN5bmMgeworICAgIGlmIChfc29ja2V0ICE9IG51bGwpIHsKKyAgICAgIGF3YWl0IF9zb2NrZXQuY2xvc2UoKTsKKyAgICAgIF9zb2NrZXQgPSBudWxsOworICAgIH0KKworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLkNMT1NFRCk7CisgIH0KKworICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpIHsKKyAgICBfc29ja2V0LmFkZChkYXRhKTsKKyAgfQorCisgIHZvaWQgX29uTWVzc2FnZShMaXN0PGludD4gbWVzc2FnZSkgeworICAgIFVpbnQ4TGlzdCBkYXRhID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChtZXNzYWdlKTsKKyAgICBfb25NZXNzYWdlQ29udHJvbGxlci5hZGQoZGF0YSk7CisgIH0KKworICB2b2lkIF9vbkVycm9yKE9iamVjdCBlcnJvcikgeworICAgIGNsb3NlKCk7CisgICAgX29uRXJyb3JDb250cm9sbGVyLmFkZCgnJGVycm9yJyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3dlYl9zb2NrZXQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3dlYl9zb2NrZXQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTM4YTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9jb25zb2xlL3Rfd2ViX3NvY2tldC5kYXJ0CkBAIC0wLDAgKzEsODggQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC5zcmMuY29uc29sZS50X3dlYl9zb2NrZXQ7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ3BhY2thZ2U6ZGFydDJfY29uc3RhbnQvY29udmVydC5kYXJ0JyBzaG93IGJhc2U2NDsKK2ltcG9ydCAnZGFydDppbyc7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCisvLy8gQSBbVFNvY2tldF0gYmFja2VkIGJ5IGEgW1dlYlNvY2tldF0gZnJvbSBkYXJ0OmlvCitjbGFzcyBUV2ViU29ja2V0IGltcGxlbWVudHMgVFNvY2tldCB7CisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPiBfb25TdGF0ZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlID0+IF9vblN0YXRlQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxPYmplY3Q+IF9vbkVycm9yQ29udHJvbGxlcjsKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3IgPT4gX29uRXJyb3JDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4gX29uTWVzc2FnZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxVaW50OExpc3Q+IGdldCBvbk1lc3NhZ2UgPT4gX29uTWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIFRXZWJTb2NrZXQoV2ViU29ja2V0IHNvY2tldCkKKyAgICAgIDogX29uU3RhdGVDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbkVycm9yQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBfb25NZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpIHsKKyAgICBpZiAoc29ja2V0ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoJ3NvY2tldCcpOworICAgIH0KKworICAgIF9zb2NrZXQgPSBzb2NrZXQ7CisgICAgX3NvY2tldC5saXN0ZW4oX29uTWVzc2FnZSwgb25FcnJvcjogX29uRXJyb3IsIG9uRG9uZTogY2xvc2UpOworICB9CisKKyAgV2ViU29ja2V0IF9zb2NrZXQ7CisKKyAgYm9vbCBnZXQgaXNPcGVuID0+IF9zb2NrZXQgIT0gbnVsbDsKKworICBib29sIGdldCBpc0Nsb3NlZCA9PiBfc29ja2V0ID09IG51bGw7CisKKyAgRnV0dXJlIG9wZW4oKSBhc3luYyB7CisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuT1BFTik7CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSBhc3luYyB7CisgICAgaWYgKF9zb2NrZXQgIT0gbnVsbCkgeworICAgICAgYXdhaXQgX3NvY2tldC5jbG9zZSgpOworICAgICAgX3NvY2tldCA9IG51bGw7CisgICAgfQorCisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuQ0xPU0VEKTsKKyAgfQorCisgIHZvaWQgc2VuZChVaW50OExpc3QgZGF0YSkgeworICAgIF9zb2NrZXQuYWRkKGJhc2U2NC5lbmNvZGUoZGF0YSkpOworICB9CisKKyAgdm9pZCBfb25NZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisgICAgdHJ5IHsKKyAgICAgIFVpbnQ4TGlzdCBkYXRhID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChiYXNlNjQuZGVjb2RlKG1lc3NhZ2UpKTsKKyAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyLmFkZChkYXRhKTsKKyAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoXykgeworICAgICAgdmFyIGVycm9yID0gbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgIkV4cGVjdGVkIGEgQmFzZSA2NCBlbmNvZGVkIHN0cmluZy4iKTsKKyAgICAgIF9vbkVycm9yQ29udHJvbGxlci5hZGQoZXJyb3IpOworICAgIH0KKyAgfQorCisgIHZvaWQgX29uRXJyb3IoT2JqZWN0IGVycm9yKSB7CisgICAgY2xvc2UoKTsKKyAgICBfb25FcnJvckNvbnRyb2xsZXIuYWRkKCckZXJyb3InKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2JpbmFyeV9wcm90b2NvbC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2JpbmFyeV9wcm90b2NvbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ODVkODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfYmluYXJ5X3Byb3RvY29sLmRhcnQKQEAgLTAsMCArMSwyODEgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3Rvcnk8VEJpbmFyeVByb3RvY29sPiB7CisgIFRCaW5hcnlQcm90b2NvbEZhY3Rvcnkoe3RoaXMuc3RyaWN0UmVhZDogZmFsc2UsIHRoaXMuc3RyaWN0V3JpdGU6IHRydWV9KTsKKworICBmaW5hbCBib29sIHN0cmljdFJlYWQ7CisgIGZpbmFsIGJvb2wgc3RyaWN0V3JpdGU7CisKKyAgVEJpbmFyeVByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0LAorICAgICAgICBzdHJpY3RSZWFkOiBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZTogc3RyaWN0V3JpdGUpOworICB9Cit9CisKKy8vLyBCaW5hcnkgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIFRocmlmdC4KKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgQyMgdmVyc2lvbi4KK2NsYXNzIFRCaW5hcnlQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7CisgIHN0YXRpYyBjb25zdCBpbnQgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKKyAgc3RhdGljIGNvbnN0IGludCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOworCisgIHN0YXRpYyBjb25zdCBVdGY4Q29kZWMgX3V0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIGZpbmFsIGJvb2wgc3RyaWN0UmVhZDsKKyAgZmluYWwgYm9vbCBzdHJpY3RXcml0ZTsKKworICBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgICB7dGhpcy5zdHJpY3RSZWFkOiBmYWxzZSwgdGhpcy5zdHJpY3RXcml0ZTogdHJ1ZX0pCisgICAgICA6IHN1cGVyKHRyYW5zcG9ydCk7CisKKyAgLy8vIHdyaXRlCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIGlmIChzdHJpY3RXcml0ZSkgeworICAgICAgaW50IHZlcnNpb24gPSBWRVJTSU9OXzEgfCBtZXNzYWdlLnR5cGU7CisgICAgICB3cml0ZUkzMih2ZXJzaW9uKTsKKyAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICB3cml0ZUkzMihtZXNzYWdlLnNlcWlkKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgICAgIHdyaXRlQnl0ZShtZXNzYWdlLnR5cGUpOworICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkge30KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkge30KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICB3cml0ZUJ5dGUoZmllbGQudHlwZSk7CisgICAgd3JpdGVJMTYoZmllbGQuaWQpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCkge30KKworICB2b2lkIHdyaXRlRmllbGRTdG9wKCkgeworICAgIHdyaXRlQnl0ZShUVHlwZS5TVE9QKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgeworICAgIHdyaXRlQnl0ZShtYXAua2V5VHlwZSk7CisgICAgd3JpdGVCeXRlKG1hcC52YWx1ZVR5cGUpOworICAgIHdyaXRlSTMyKG1hcC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgd3JpdGVCeXRlKGxpc3QuZWxlbWVudFR5cGUpOworICAgIHdyaXRlSTMyKGxpc3QubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkge30KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICB3cml0ZUJ5dGUoc2V0LmVsZW1lbnRUeXBlKTsKKyAgICB3cml0ZUkzMihzZXQubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIGlmIChiID09IG51bGwpIGIgPSBmYWxzZTsKKyAgICB3cml0ZUJ5dGUoYiA/IDEgOiAwKTsKKyAgfQorCisgIGZpbmFsIEJ5dGVEYXRhIF9ieXRlT3V0ID0gbmV3IEJ5dGVEYXRhKDEpOworICB2b2lkIHdyaXRlQnl0ZShpbnQgYnl0ZSkgeworICAgIGlmIChieXRlID09IG51bGwpIGJ5dGUgPSAwOworICAgIF9ieXRlT3V0LnNldFVpbnQ4KDAsIGJ5dGUpOworICAgIHRyYW5zcG9ydC53cml0ZShfYnl0ZU91dC5idWZmZXIuYXNVaW50OExpc3QoKSwgMCwgMSk7CisgIH0KKworICBmaW5hbCBCeXRlRGF0YSBfaTE2T3V0ID0gbmV3IEJ5dGVEYXRhKDIpOworICB2b2lkIHdyaXRlSTE2KGludCBpMTYpIHsKKyAgICBpZiAoaTE2ID09IG51bGwpIGkxNiA9IDA7CisgICAgX2kxNk91dC5zZXRJbnQxNigwLCBpMTYpOworICAgIHRyYW5zcG9ydC53cml0ZShfaTE2T3V0LmJ1ZmZlci5hc1VpbnQ4TGlzdCgpLCAwLCAyKTsKKyAgfQorCisgIGZpbmFsIEJ5dGVEYXRhIF9pMzJPdXQgPSBuZXcgQnl0ZURhdGEoNCk7CisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgeworICAgIGlmIChpMzIgPT0gbnVsbCkgaTMyID0gMDsKKyAgICBfaTMyT3V0LnNldEludDMyKDAsIGkzMik7CisgICAgdHJhbnNwb3J0LndyaXRlKF9pMzJPdXQuYnVmZmVyLmFzVWludDhMaXN0KCksIDAsIDQpOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9pNjRPdXQgPSBuZXcgVWludDhMaXN0KDgpOworICB2b2lkIHdyaXRlSTY0KGludCBpNjQpIHsKKyAgICBpZiAoaTY0ID09IG51bGwpIGk2NCA9IDA7CisgICAgdmFyIGkgPSBuZXcgSW50NjQoaTY0KTsKKyAgICB2YXIgYnRzID0gaS50b0J5dGVzKCk7CisgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgIF9pNjRPdXRbal0gPSBidHNbOCAtIGogLSAxXTsKKyAgICB9CisgICAgdHJhbnNwb3J0LndyaXRlKF9pNjRPdXQsIDAsIDgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgcykgeworICAgIHZhciBieXRlcyA9IHMgIT0gbnVsbCA/IF91dGY4Q29kZWMuZW5jb2RlKHMpIDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbXSk7CisgICAgd3JpdGVJMzIoYnl0ZXMubGVuZ3RoKTsKKyAgICB0cmFuc3BvcnQud3JpdGUoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CisgIH0KKworICBmaW5hbCBCeXRlRGF0YSBfZG91YmxlT3V0ID0gbmV3IEJ5dGVEYXRhKDgpOworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkKSB7CisgICAgaWYgKGQgPT0gbnVsbCkgZCA9IDAuMDsKKyAgICBfZG91YmxlT3V0LnNldEZsb2F0NjQoMCwgZCk7CisgICAgdHJhbnNwb3J0LndyaXRlKF9kb3VibGVPdXQuYnVmZmVyLmFzVWludDhMaXN0KCksIDAsIDgpOworICB9CisKKyAgdm9pZCB3cml0ZUJpbmFyeShVaW50OExpc3QgYnl0ZXMpIHsKKyAgICB2YXIgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICAgIHdyaXRlSTMyKGxlbmd0aCk7CisgICAgdHJhbnNwb3J0LndyaXRlKGJ5dGVzLCAwLCBsZW5ndGgpOworICB9CisKKyAgLy8vIHJlYWQKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHsKKyAgICBTdHJpbmcgbmFtZTsKKyAgICBpbnQgdHlwZTsKKyAgICBpbnQgc2VxaWQ7CisKKyAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIGludCB2ZXJzaW9uID0gc2l6ZSAmIFZFUlNJT05fTUFTSzsKKyAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgIkJhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW46ICR2ZXJzaW9uIik7CisgICAgICB9CisgICAgICB0eXBlID0gc2l6ZSAmIDB4MDAwMDAwZmY7CisgICAgICBuYW1lID0gcmVhZFN0cmluZygpOworICAgICAgc2VxaWQgPSByZWFkSTMyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzdHJpY3RSZWFkKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAiTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4iKTsKKyAgICAgIH0KKyAgICAgIG5hbWUgPSBfcmVhZFN0cmluZyhzaXplKTsKKyAgICAgIHR5cGUgPSByZWFkQnl0ZSgpOworICAgICAgc2VxaWQgPSByZWFkSTMyKCk7CisgICAgfQorICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobmFtZSwgdHlwZSwgc2VxaWQpOworICB9CisKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgIH0KKworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7fQorCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHsKKyAgICBTdHJpbmcgbmFtZSA9ICIiOworICAgIGludCB0eXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgaWQgPSB0eXBlICE9IFRUeXBlLlNUT1AgPyByZWFkSTE2KCkgOiAwOworCisgICAgcmV0dXJuIG5ldyBURmllbGQobmFtZSwgdHlwZSwgaWQpOworICB9CisKKyAgdm9pZCByZWFkRmllbGRFbmQoKSB7fQorCisgIFRNYXAgcmVhZE1hcEJlZ2luKCkgeworICAgIGludCBrZXlUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgdmFsdWVUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgbGVuZ3RoID0gcmVhZEkzMigpOworCisgICAgcmV0dXJuIG5ldyBUTWFwKGtleVR5cGUsIHZhbHVlVHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpIHsKKyAgICBpbnQgZWxlbWVudFR5cGUgPSByZWFkQnl0ZSgpOworICAgIGludCBsZW5ndGggPSByZWFkSTMyKCk7CisKKyAgICByZXR1cm4gbmV3IFRMaXN0KGVsZW1lbnRUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkTGlzdEVuZCgpIHt9CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSB7CisgICAgaW50IGVsZW1lbnRUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgbGVuZ3RoID0gcmVhZEkzMigpOworCisgICAgcmV0dXJuIG5ldyBUU2V0KGVsZW1lbnRUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkU2V0RW5kKCkge30KKworICBib29sIHJlYWRCb29sKCkgPT4gcmVhZEJ5dGUoKSA9PSAxOworCisgIGZpbmFsIFVpbnQ4TGlzdCBfYnl0ZUluID0gbmV3IFVpbnQ4TGlzdCgxKTsKKyAgaW50IHJlYWRCeXRlKCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9ieXRlSW4sIDAsIDEpOworICAgIHJldHVybiBfYnl0ZUluLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0VWludDgoMCk7CisgIH0KKworICBmaW5hbCBVaW50OExpc3QgX2kxNkluID0gbmV3IFVpbnQ4TGlzdCgyKTsKKyAgaW50IHJlYWRJMTYoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoX2kxNkluLCAwLCAyKTsKKyAgICByZXR1cm4gX2kxNkluLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0SW50MTYoMCk7CisgIH0KKworICBmaW5hbCBVaW50OExpc3QgX2kzMkluID0gbmV3IFVpbnQ4TGlzdCg0KTsKKyAgaW50IHJlYWRJMzIoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoX2kzMkluLCAwLCA0KTsKKyAgICByZXR1cm4gX2kzMkluLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0SW50MzIoMCk7CisgIH0KKworICBmaW5hbCBVaW50OExpc3QgX2k2NEluID0gbmV3IFVpbnQ4TGlzdCg4KTsKKyAgaW50IHJlYWRJNjQoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoX2k2NEluLCAwLCA4KTsKKyAgICB2YXIgaSA9IG5ldyBJbnQ2NC5mcm9tQnl0ZXNCaWdFbmRpYW4oX2k2NEluKTsKKyAgICByZXR1cm4gaS50b0ludCgpOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9kb3VibGVJbiA9IG5ldyBVaW50OExpc3QoOCk7CisgIGRvdWJsZSByZWFkRG91YmxlKCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9kb3VibGVJbiwgMCwgOCk7CisgICAgcmV0dXJuIF9kb3VibGVJbi5idWZmZXIuYXNCeXRlRGF0YSgpLmdldEZsb2F0NjQoMCk7CisgIH0KKworICBTdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICByZXR1cm4gX3JlYWRTdHJpbmcoc2l6ZSk7CisgIH0KKworICBTdHJpbmcgX3JlYWRTdHJpbmcoaW50IHNpemUpIHsKKyAgICBVaW50OExpc3Qgc3RyaW5nSW4gPSBuZXcgVWludDhMaXN0KHNpemUpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKHN0cmluZ0luLCAwLCBzaXplKTsKKyAgICByZXR1cm4gX3V0ZjhDb2RlYy5kZWNvZGUoc3RyaW5nSW4pOworICB9CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKSB7CisgICAgaW50IGxlbmd0aCA9IHJlYWRJMzIoKTsKKyAgICBVaW50OExpc3QgYmluYXJ5SW4gPSBuZXcgVWludDhMaXN0KGxlbmd0aCk7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoYmluYXJ5SW4sIDAsIGxlbmd0aCk7CisgICAgcmV0dXJuIGJpbmFyeUluOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfY29tcGFjdF9wcm90b2NvbC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2NvbXBhY3RfcHJvdG9jb2wuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTgwOTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2NvbXBhY3RfcHJvdG9jb2wuZGFydApAQCAtMCwwICsxLDQ3MCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3Rvcnk8VENvbXBhY3RQcm90b2NvbD4geworICBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpOworCisgIFRDb21wYWN0UHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgfQorfQorCisvLy8gQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgVGhyaWZ0LgorLy8vCisvLy8gVXNlIG9mIGZpeG51bSBsaWJyYXJ5IGlzIHJlcXVpcmVkIGR1ZSB0byBidWdzIGxpa2UKKy8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMTUzNjEKKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorY2xhc3MgVENvbXBhY3RQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7CisgIHN0YXRpYyBjb25zdCBpbnQgUFJPVE9DT0xfSUQgPSAweDgyOworICBzdGF0aWMgY29uc3QgaW50IFZFUlNJT04gPSAxOworICBzdGF0aWMgY29uc3QgaW50IFZFUlNJT05fTUFTSyA9IDB4MWY7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9NQVNLID0gMHhFMDsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0JJVFMgPSAweDA3OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBUU1RPUCA9IG5ldyBURmllbGQoIiIsIFRUeXBlLlNUT1AsIDApOworCisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CT09MRUFOX1RSVUUgPSAweDAxOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQk9PTEVBTl9GQUxTRSA9IDB4MDI7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CWVRFID0gMHgwMzsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0kxNiA9IDB4MDQ7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9JMzIgPSAweDA1OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfSTY0ID0gMHgwNjsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0RPVUJMRSA9IDB4MDc7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CSU5BUlkgPSAweDA4OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfTElTVCA9IDB4MDk7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9TRVQgPSAweDBBOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfTUFQID0gMHgwQjsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX1NUUlVDVCA9IDB4MEM7CisKKyAgc3RhdGljIGZpbmFsIExpc3Q8aW50PiBfdHlwZU1hcCA9IG5ldyBMaXN0LnVubW9kaWZpYWJsZShuZXcgTGlzdCgxNikKKyAgICAuLltUVHlwZS5TVE9QXSA9IFRUeXBlLlNUT1AKKyAgICAuLltUVHlwZS5CT09MXSA9IFRZUEVfQk9PTEVBTl9UUlVFCisgICAgLi5bVFR5cGUuQllURV0gPSBUWVBFX0JZVEUKKyAgICAuLltUVHlwZS5JMTZdID0gVFlQRV9JMTYKKyAgICAuLltUVHlwZS5JMzJdID0gVFlQRV9JMzIKKyAgICAuLltUVHlwZS5JNjRdID0gVFlQRV9JNjQKKyAgICAuLltUVHlwZS5ET1VCTEVdID0gVFlQRV9ET1VCTEUKKyAgICAuLltUVHlwZS5TVFJJTkddID0gVFlQRV9CSU5BUlkKKyAgICAuLltUVHlwZS5MSVNUXSA9IFRZUEVfTElTVAorICAgIC4uW1RUeXBlLlNFVF0gPSBUWVBFX1NFVAorICAgIC4uW1RUeXBlLk1BUF0gPSBUWVBFX01BUAorICAgIC4uW1RUeXBlLlNUUlVDVF0gPSBUWVBFX1NUUlVDVCk7CisKKyAgc3RhdGljIGNvbnN0IFV0ZjhDb2RlYyBfdXRmOENvZGVjID0gY29uc3QgVXRmOENvZGVjKCk7CisKKyAgLy8gUHJldGVuZCB0aGlzIGlzIGEgc3RhY2sKKyAgRG91YmxlTGlua2VkUXVldWU8aW50PiBfbGFzdEZpZWxkID0gbmV3IERvdWJsZUxpbmtlZFF1ZXVlPGludD4oKTsKKyAgaW50IF9sYXN0RmllbGRJZCA9IDA7CisKKyAgVEZpZWxkIF9ib29sZWFuRmllbGQgPSBudWxsOworICBib29sIF9ib29sVmFsdWUgPSBudWxsOworCisgIGZpbmFsIFVpbnQ4TGlzdCB0ZW1wTGlzdCA9IG5ldyBVaW50OExpc3QoMTApOworICBmaW5hbCBCeXRlRGF0YSB0ZW1wQkQgPSBuZXcgQnl0ZURhdGEoMTApOworCisgIFRDb21wYWN0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIDogc3VwZXIodHJhbnNwb3J0KTsKKworICAvLy8gV3JpdGUKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgd3JpdGVCeXRlKFBST1RPQ09MX0lEKTsKKyAgICB3cml0ZUJ5dGUoKFZFUlNJT04gJiBWRVJTSU9OX01BU0spIHwKKyAgICAgICAgKChtZXNzYWdlLnR5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKSk7CisgICAgX3dyaXRlVmFySW50MzIobmV3IEludDMyKG1lc3NhZ2Uuc2VxaWQpKTsKKyAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgeworICAgIF9sYXN0RmllbGQuYWRkTGFzdChfbGFzdEZpZWxkSWQpOworICAgIF9sYXN0RmllbGRJZCA9IDA7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkgeworICAgIF9sYXN0RmllbGRJZCA9IF9sYXN0RmllbGQucmVtb3ZlTGFzdCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB7CisgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQk9PTCkgeworICAgICAgX2Jvb2xlYW5GaWVsZCA9IGZpZWxkOworICAgIH0gZWxzZSB7CisgICAgICBfd3JpdGVGaWVsZEJlZ2luKGZpZWxkLCAtMSk7CisgICAgfQorICB9CisKKyAgdm9pZCBfd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCwgaW50IHR5cGVPdmVycmlkZSkgeworICAgIGludCB0eXBlVG9Xcml0ZSA9CisgICAgICAgIHR5cGVPdmVycmlkZSA9PSAtMSA/IF9nZXRDb21wYWN0VHlwZShmaWVsZC50eXBlKSA6IHR5cGVPdmVycmlkZTsKKworICAgIGlmIChmaWVsZC5pZCA+IF9sYXN0RmllbGRJZCAmJiBmaWVsZC5pZCAtIF9sYXN0RmllbGRJZCA8PSAxNSkgeworICAgICAgd3JpdGVCeXRlKChmaWVsZC5pZCAtIF9sYXN0RmllbGRJZCkgPDwgNCB8IHR5cGVUb1dyaXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKHR5cGVUb1dyaXRlKTsKKyAgICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKKyAgICB9CisKKyAgICBfbGFzdEZpZWxkSWQgPSBmaWVsZC5pZDsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICBpZiAobWFwLmxlbmd0aCA9PSAwKSB7CisgICAgICB3cml0ZUJ5dGUoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF93cml0ZVZhckludDMyKG5ldyBJbnQzMihtYXAubGVuZ3RoKSk7CisgICAgICB3cml0ZUJ5dGUoCisgICAgICAgICAgX2dldENvbXBhY3RUeXBlKG1hcC5rZXlUeXBlKSA8PCA0IHwgX2dldENvbXBhY3RUeXBlKG1hcC52YWx1ZVR5cGUpKTsKKyAgICB9CisgIH0KKworICB2b2lkIHdyaXRlTWFwRW5kKCkge30KKworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHsKKyAgICBfd3JpdGVDb2xsZWN0aW9uQmVnaW4obGlzdC5lbGVtZW50VHlwZSwgbGlzdC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgeworICAgIF93cml0ZUNvbGxlY3Rpb25CZWdpbihzZXQuZWxlbWVudFR5cGUsIHNldC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKSB7CisgICAgaWYgKGIgPT0gbnVsbCkgYiA9IGZhbHNlOworICAgIGlmIChfYm9vbGVhbkZpZWxkICE9IG51bGwpIHsKKyAgICAgIF93cml0ZUZpZWxkQmVnaW4oCisgICAgICAgICAgX2Jvb2xlYW5GaWVsZCwgYiA/IFRZUEVfQk9PTEVBTl9UUlVFIDogVFlQRV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgIF9ib29sZWFuRmllbGQgPSBudWxsOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUJ5dGUoYiA/IFRZUEVfQk9PTEVBTl9UUlVFIDogVFlQRV9CT09MRUFOX0ZBTFNFKTsKKyAgICB9CisgIH0KKworICB2b2lkIHdyaXRlQnl0ZShpbnQgYikgeworICAgIGlmIChiID09IG51bGwpIGIgPSAwOworICAgIHRlbXBMaXN0WzBdID0gYjsKKyAgICB0cmFuc3BvcnQud3JpdGUodGVtcExpc3QsIDAsIDEpOworICB9CisKKyAgdm9pZCB3cml0ZUkxNihpbnQgaTE2KSB7CisgICAgaWYgKGkxNiA9PSBudWxsKSBpMTYgPSAwOworICAgIF93cml0ZVZhckludDMyKF9pbnQzMlRvWmlnWmFnKG5ldyBJbnQzMihpMTYpKSk7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICBpZiAoaTMyID09IG51bGwpIGkzMiA9IDA7CisgICAgX3dyaXRlVmFySW50MzIoX2ludDMyVG9aaWdaYWcobmV3IEludDMyKGkzMikpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50IGk2NCkgeworICAgIGlmIChpNjQgPT0gbnVsbCkgaTY0ID0gMDsKKyAgICBfd3JpdGVWYXJJbnQ2NChfaW50NjRUb1ppZ1phZyhuZXcgSW50NjQoaTY0KSkpOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZCkgeworICAgIGlmIChkID09IG51bGwpIGQgPSAwLjA7CisgICAgdGVtcEJELnNldEZsb2F0NjQoMCwgZCwgRW5kaWFubmVzcy5saXR0bGUpOworICAgIHRyYW5zcG9ydC53cml0ZSh0ZW1wQkQuYnVmZmVyLmFzVWludDhMaXN0KCksIDAsIDgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB7CisgICAgVWludDhMaXN0IGJ5dGVzID0KKyAgICAgICAgc3RyICE9IG51bGwgPyBfdXRmOENvZGVjLmVuY29kZShzdHIpIDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbXSk7CisgICAgd3JpdGVCaW5hcnkoYnl0ZXMpOworICB9CisKKyAgdm9pZCB3cml0ZUJpbmFyeShVaW50OExpc3QgYnl0ZXMpIHsKKyAgICBfd3JpdGVWYXJJbnQzMihuZXcgSW50MzIoYnl0ZXMubGVuZ3RoKSk7CisgICAgdHJhbnNwb3J0LndyaXRlKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICB9CisKKyAgdm9pZCBfd3JpdGVWYXJJbnQzMihJbnQzMiBuKSB7CisgICAgaW50IGlkeCA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICAgIHRlbXBMaXN0W2lkeCsrXSA9IChuICYgMHhGRikudG9JbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZW1wTGlzdFtpZHgrK10gPSAoKChuICYgMHg3RikgfCAweDgwKSAmIDB4RkYpLnRvSW50KCk7CisgICAgICAgIG4gPSBuLnNoaWZ0UmlnaHRVbnNpZ25lZCg3KTsKKyAgICAgIH0KKyAgICB9CisgICAgdHJhbnNwb3J0LndyaXRlKHRlbXBMaXN0LCAwLCBpZHgpOworICB9CisKKyAgdm9pZCBfd3JpdGVWYXJJbnQ2NChJbnQ2NCBuKSB7CisgICAgaW50IGlkeCA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICAgIHRlbXBMaXN0W2lkeCsrXSA9IChuICYgMHhGRikudG9JbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZW1wTGlzdFtpZHgrK10gPSAoKChuICYgMHg3RikgfCAweDgwKSAmIDB4RkYpLnRvSW50KCk7CisgICAgICAgIG4gPSBuLnNoaWZ0UmlnaHRVbnNpZ25lZCg3KTsKKyAgICAgIH0KKyAgICB9CisgICAgdHJhbnNwb3J0LndyaXRlKHRlbXBMaXN0LCAwLCBpZHgpOworICB9CisKKyAgdm9pZCBfd3JpdGVDb2xsZWN0aW9uQmVnaW4oaW50IGVsZW1UeXBlLCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGxlbmd0aCA8PSAxNCkgeworICAgICAgd3JpdGVCeXRlKGxlbmd0aCA8PCA0IHwgX2dldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQnl0ZSgweEYwIHwgX2dldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgICBfd3JpdGVWYXJJbnQzMihuZXcgSW50MzIobGVuZ3RoKSk7CisgICAgfQorICB9CisKKyAgSW50MzIgX2ludDMyVG9aaWdaYWcoSW50MzIgbikgeworICAgIHJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKTsKKyAgfQorCisgIEludDY0IF9pbnQ2NFRvWmlnWmFnKEludDY0IG4pIHsKKyAgICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiA2Myk7CisgIH0KKworICAvLy8gUmVhZAorICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgeworICAgIGludCBwcm90b2NvbElkID0gcmVhZEJ5dGUoKTsKKyAgICBpZiAocHJvdG9jb2xJZCAhPSBQUk9UT0NPTF9JRCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5CQURfVkVSU0lPTiwKKyAgICAgICAgICAnRXhwZWN0ZWQgcHJvdG9jb2wgaWQgJFBST1RPQ09MX0lEIGJ1dCBnb3QgJHByb3RvY29sSWQnKTsKKyAgICB9CisgICAgaW50IHZlcnNpb25BbmRUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgdmVyc2lvbiA9IHZlcnNpb25BbmRUeXBlICYgVkVSU0lPTl9NQVNLOworICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT04pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuQkFEX1ZFUlNJT04sCisgICAgICAgICAgJ0V4cGVjdGVkIHZlcnNpb24gJFZFUlNJT04gYnV0IGdvdCAkdmVyc2lvbicpOworICAgIH0KKyAgICBpbnQgdHlwZSA9ICh2ZXJzaW9uQW5kVHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFM7CisgICAgaW50IHNlcUlkID0gX3JlYWRWYXJJbnQzMigpLnRvSW50KCk7CisgICAgU3RyaW5nIG1lc3NhZ2VOYW1lID0gcmVhZFN0cmluZygpOworICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobWVzc2FnZU5hbWUsIHR5cGUsIHNlcUlkKTsKKyAgfQorCisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7fQorCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIF9sYXN0RmllbGQuYWRkTGFzdChfbGFzdEZpZWxkSWQpOworICAgIF9sYXN0RmllbGRJZCA9IDA7CisgICAgLy8gVE9ETyBtYWtlIHRoaXMgYSBjb25zdGFudD8KKyAgICByZXR1cm4gbmV3IFRTdHJ1Y3QoKTsKKyAgfQorCisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICBfbGFzdEZpZWxkSWQgPSBfbGFzdEZpZWxkLnJlbW92ZUxhc3QoKTsKKyAgfQorCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHsKKyAgICBpbnQgdHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaWYgKHR5cGUgPT0gVFR5cGUuU1RPUCkgeworICAgICAgcmV0dXJuIFRTVE9QOworICAgIH0KKworICAgIGludCBmaWVsZElkOworICAgIGludCBtb2RpZmllciA9ICh0eXBlICYgMHhGMCkgPj4gNDsKKyAgICBpZiAobW9kaWZpZXIgPT0gMCkgeworICAgICAgZmllbGRJZCA9IHJlYWRJMTYoKTsKKyAgICB9IGVsc2UgeworICAgICAgZmllbGRJZCA9IF9sYXN0RmllbGRJZCArIG1vZGlmaWVyOworICAgIH0KKworICAgIFRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoJycsIF9nZXRUVHlwZSh0eXBlICYgMHgwRiksIGZpZWxkSWQpOworICAgIGlmIChfaXNCb29sVHlwZSh0eXBlKSkgeworICAgICAgX2Jvb2xWYWx1ZSA9ICh0eXBlICYgMHgwRikgPT0gVFlQRV9CT09MRUFOX1RSVUU7CisgICAgfQorCisgICAgX2xhc3RGaWVsZElkID0gZmllbGQuaWQ7CisgICAgcmV0dXJuIGZpZWxkOworICB9CisKKyAgdm9pZCByZWFkRmllbGRFbmQoKSB7fQorCisgIFRNYXAgcmVhZE1hcEJlZ2luKCkgeworICAgIGludCBsZW5ndGggPSBfcmVhZFZhckludDMyKCkudG9JbnQoKTsKKyAgICBfY2hlY2tOZWdSZWFkTGVuZ3RoKGxlbmd0aCk7CisKKyAgICBpbnQga2V5QW5kVmFsdWVUeXBlID0gbGVuZ3RoID09IDAgPyAwIDogcmVhZEJ5dGUoKTsKKyAgICBpbnQga2V5VHlwZSA9IF9nZXRUVHlwZShrZXlBbmRWYWx1ZVR5cGUgPj4gNCk7CisgICAgaW50IHZhbHVlVHlwZSA9IF9nZXRUVHlwZShrZXlBbmRWYWx1ZVR5cGUgJiAweDBGKTsKKyAgICByZXR1cm4gbmV3IFRNYXAoa2V5VHlwZSwgdmFsdWVUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkTWFwRW5kKCkge30KKworICBUTGlzdCByZWFkTGlzdEJlZ2luKCkgeworICAgIGludCBsZW5ndGhBbmRUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgbGVuZ3RoID0gKGxlbmd0aEFuZFR5cGUgPj4gNCkgJiAweDBGOworICAgIGlmIChsZW5ndGggPT0gMTUpIHsKKyAgICAgIGxlbmd0aCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIH0KKyAgICBfY2hlY2tOZWdSZWFkTGVuZ3RoKGxlbmd0aCk7CisgICAgaW50IHR5cGUgPSBfZ2V0VFR5cGUobGVuZ3RoQW5kVHlwZSk7CisgICAgcmV0dXJuIG5ldyBUTGlzdCh0eXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkTGlzdEVuZCgpIHt9CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSB7CisgICAgVExpc3QgdGxpc3QgPSByZWFkTGlzdEJlZ2luKCk7CisgICAgcmV0dXJuIG5ldyBUU2V0KHRsaXN0LmVsZW1lbnRUeXBlLCB0bGlzdC5sZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkU2V0RW5kKCkge30KKworICBib29sIHJlYWRCb29sKCkgeworICAgIGlmIChfYm9vbFZhbHVlICE9IG51bGwpIHsKKyAgICAgIGJvb2wgcmVzdWx0ID0gX2Jvb2xWYWx1ZTsKKyAgICAgIF9ib29sVmFsdWUgPSBudWxsOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRCeXRlKCkgPT0gVFlQRV9CT09MRUFOX1RSVUU7CisgIH0KKworICBpbnQgcmVhZEJ5dGUoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwodGVtcExpc3QsIDAsIDEpOworICAgIHJldHVybiB0ZW1wTGlzdC5idWZmZXIuYXNCeXRlRGF0YSgpLmdldFVpbnQ4KDApOworICB9CisKKyAgaW50IHJlYWRJMTYoKSB7CisgICAgcmV0dXJuIF96aWd6YWdUb0ludDMyKF9yZWFkVmFySW50MzIoKSkudG9JbnQoKTsKKyAgfQorCisgIGludCByZWFkSTMyKCkgeworICAgIHJldHVybiBfemlnemFnVG9JbnQzMihfcmVhZFZhckludDMyKCkpLnRvSW50KCk7CisgIH0KKworICBpbnQgcmVhZEk2NCgpIHsKKyAgICByZXR1cm4gX3ppZ3phZ1RvSW50NjQoX3JlYWRWYXJJbnQ2NCgpKS50b0ludCgpOworICB9CisKKyAgZG91YmxlIHJlYWREb3VibGUoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwodGVtcExpc3QsIDAsIDgpOworICAgIHJldHVybiB0ZW1wTGlzdC5idWZmZXIuYXNCeXRlRGF0YSgpLmdldEZsb2F0NjQoMCwgRW5kaWFubmVzcy5saXR0bGUpOworICB9CisKKyAgU3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKworICAgIC8vIFRPRE8gbG9vayBhdCB1c2luZyB0ZW1wIGZvciBzbWFsbCBzdHJpbmdzPworICAgIFVpbnQ4TGlzdCBidWZmID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmYsIDAsIGxlbmd0aCk7CisgICAgcmV0dXJuIF91dGY4Q29kZWMuZGVjb2RlKGJ1ZmYpOworICB9CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKSB7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKworICAgIFVpbnQ4TGlzdCBidWZmID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmYsIDAsIGxlbmd0aCk7CisgICAgcmV0dXJuIGJ1ZmY7CisgIH0KKworICBJbnQzMiBfcmVhZFZhckludDMyKCkgeworICAgIEludDMyIHJlc3VsdCA9IEludDMyLlpFUk87CisgICAgaW50IHNoaWZ0ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgSW50MzIgYiA9IG5ldyBJbnQzMihyZWFkQnl0ZSgpKTsKKyAgICAgIHJlc3VsdCB8PSAoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgYnJlYWs7CisgICAgICBzaGlmdCArPSA3OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgSW50NjQgX3JlYWRWYXJJbnQ2NCgpIHsKKyAgICBJbnQ2NCByZXN1bHQgPSBJbnQ2NC5aRVJPOworICAgIGludCBzaGlmdCA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIEludDY0IGIgPSBuZXcgSW50NjQocmVhZEJ5dGUoKSk7CisgICAgICByZXN1bHQgfD0gKGIgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApIGJyZWFrOworICAgICAgc2hpZnQgKz0gNzsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEludDMyIF96aWd6YWdUb0ludDMyKEludDMyIG4pIHsKKyAgICByZXR1cm4gKG4uc2hpZnRSaWdodFVuc2lnbmVkKDEpKSBeIC0obiAmIDEpOworICB9CisKKyAgSW50NjQgX3ppZ3phZ1RvSW50NjQoSW50NjQgbikgeworICAgIHJldHVybiAobi5zaGlmdFJpZ2h0VW5zaWduZWQoMSkpIF4gLShuICYgMSk7CisgIH0KKworICB2b2lkIF9jaGVja05lZ1JlYWRMZW5ndGgoaW50IGxlbmd0aCkgeworICAgIGlmIChsZW5ndGggPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLk5FR0FUSVZFX1NJWkUsICdOZWdhdGl2ZSBsZW5ndGg6ICRsZW5ndGgnKTsKKyAgICB9CisgIH0KKworICBpbnQgX2dldENvbXBhY3RUeXBlKGludCB0dHlwZSkgeworICAgIHJldHVybiBfdHlwZU1hcFt0dHlwZV07CisgIH0KKworICBpbnQgX2dldFRUeXBlKGludCB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlICYgMHgwRikgeworICAgICAgY2FzZSBUVHlwZS5TVE9QOgorICAgICAgICByZXR1cm4gVFR5cGUuU1RPUDsKKyAgICAgIGNhc2UgVFlQRV9CT09MRUFOX0ZBTFNFOgorICAgICAgY2FzZSBUWVBFX0JPT0xFQU5fVFJVRToKKyAgICAgICAgcmV0dXJuIFRUeXBlLkJPT0w7CisgICAgICBjYXNlIFRZUEVfQllURToKKyAgICAgICAgcmV0dXJuIFRUeXBlLkJZVEU7CisgICAgICBjYXNlIFRZUEVfSTE2OgorICAgICAgICByZXR1cm4gVFR5cGUuSTE2OworICAgICAgY2FzZSBUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuIFRUeXBlLkkzMjsKKyAgICAgIGNhc2UgVFlQRV9JNjQ6CisgICAgICAgIHJldHVybiBUVHlwZS5JNjQ7CisgICAgICBjYXNlIFRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gVFR5cGUuRE9VQkxFOworICAgICAgY2FzZSBUWVBFX0JJTkFSWToKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNUUklORzsKKyAgICAgIGNhc2UgVFlQRV9MSVNUOgorICAgICAgICByZXR1cm4gVFR5cGUuTElTVDsKKyAgICAgIGNhc2UgVFlQRV9TRVQ6CisgICAgICAgIHJldHVybiBUVHlwZS5TRVQ7CisgICAgICBjYXNlIFRZUEVfTUFQOgorICAgICAgICByZXR1cm4gVFR5cGUuTUFQOworICAgICAgY2FzZSBUWVBFX1NUUlVDVDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNUUlVDVDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJVbmtub3duIHR5cGU6ICR7dHlwZSAmIDB4MEZ9Iik7CisgICAgfQorICB9CisKKyAgYm9vbCBfaXNCb29sVHlwZShpbnQgYikgeworICAgIGludCBsb3dlck5pYmJsZSA9IGIgJiAweDBGOworICAgIHJldHVybiBsb3dlck5pYmJsZSA9PSBUWVBFX0JPT0xFQU5fVFJVRSB8fAorICAgICAgICBsb3dlck5pYmJsZSA9PSBUWVBFX0JPT0xFQU5fRkFMU0U7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9maWVsZC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2ZpZWxkLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0YjRlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9maWVsZC5kYXJ0CkBAIC0wLDAgKzEsMjYgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEZpZWxkIHsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisgIGZpbmFsIGludCB0eXBlOworICBmaW5hbCBpbnQgaWQ7CisKKyAgVEZpZWxkKHRoaXMubmFtZSwgdGhpcy50eXBlLCB0aGlzLmlkKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9qc29uX3Byb3RvY29sLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfanNvbl9wcm90b2NvbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDU2OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfanNvbl9wcm90b2NvbC5kYXJ0CkBAIC0wLDAgKzEsNzg0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRKc29uUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeTxUSnNvblByb3RvY29sPiB7CisgIFRKc29uUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgfQorfQorCisvLy8gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgVGhyaWZ0LgorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBDIyB2ZXJzaW9uLgorY2xhc3MgVEpzb25Qcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7CisgIHN0YXRpYyBjb25zdCBpbnQgVkVSU0lPTl8xID0gMTsKKworICBzdGF0aWMgY29uc3QgVXRmOENvZGVjIHV0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIF9CYXNlQ29udGV4dCBfY29udGV4dDsKKyAgX0Jhc2VDb250ZXh0IF9yb290Q29udGV4dDsKKyAgX0xvb2thaGVhZFJlYWRlciBfcmVhZGVyOworCisgIGZpbmFsIExpc3Q8X0Jhc2VDb250ZXh0PiBfY29udGV4dFN0YWNrID0gW107CisgIGZpbmFsIFVpbnQ4TGlzdCBfdGVtcEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoNCk7CisKKyAgVEpzb25Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgOiBzdXBlcih0cmFuc3BvcnQpIHsKKyAgICBfcm9vdENvbnRleHQgPSBuZXcgX0Jhc2VDb250ZXh0KHRoaXMpOworICAgIF9yZWFkZXIgPSBuZXcgX0xvb2thaGVhZFJlYWRlcih0aGlzKTsKKyAgICBfcmVzZXRDb250ZXh0KCk7CisgIH0KKworICB2b2lkIF9wdXNoQ29udGV4dChfQmFzZUNvbnRleHQgYykgeworICAgIF9jb250ZXh0U3RhY2suYWRkKGMpOworICAgIF9jb250ZXh0ID0gYzsKKyAgfQorCisgIHZvaWQgX3BvcENvbnRleHQoKSB7CisgICAgX2NvbnRleHRTdGFjay5yZW1vdmVMYXN0KCk7CisgICAgX2NvbnRleHQgPSBfY29udGV4dFN0YWNrLmlzRW1wdHkgPyBfcm9vdENvbnRleHQgOiBfY29udGV4dFN0YWNrLmxhc3Q7CisgIH0KKworICB2b2lkIF9yZXNldENvbnRleHQoKSB7CisgICAgX2NvbnRleHRTdGFjay5jbGVhcigpOworICAgIF9jb250ZXh0ID0gX3Jvb3RDb250ZXh0OworICB9CisKKyAgLy8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBbY2hhcl07IG90aGVyd2lzZSB0aHJvdyBhIFtUUHJvdG9jb2xFcnJvcl0uCisgIHZvaWQgX3JlYWRKc29uU3ludGF4Q2hhcihpbnQgY2hhckJ5dGUpIHsKKyAgICBpbnQgYnl0ZSA9IF9yZWFkZXIucmVhZCgpOworICAgIGlmIChieXRlICE9IGNoYXJCeXRlKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiRXhwZWN0ZWQgY2hhcmFjdGVyICR7bmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckJ5dGUpfSBidXQgZm91bmQ6ICR7bmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSl9Iik7CisgICAgfQorICB9CisKKyAgaW50IF9oZXhWYWwoaW50IGJ5dGUpIHsKKyAgICBpZiAoYnl0ZSA+PSBfQ29uc3RhbnRzLkhFWF8wX0JZVEVTWzBdICYmCisgICAgICAgIGJ5dGUgPD0gX0NvbnN0YW50cy5IRVhfOV9CWVRFU1swXSkgeworICAgICAgcmV0dXJuIGJ5dGUgLSBfQ29uc3RhbnRzLkhFWF8wX0JZVEVTWzBdOworICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSBfQ29uc3RhbnRzLkhFWF9BX0JZVEVTWzBdICYmCisgICAgICAgIGJ5dGUgPD0gX0NvbnN0YW50cy5IRVhfRl9CWVRFU1swXSkgeworICAgICAgYnl0ZSArPSAxMDsKKyAgICAgIHJldHVybiBieXRlIC0gX0NvbnN0YW50cy5IRVhfQV9CWVRFU1swXTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBoZXggY2hhcmFjdGVyIik7CisgICAgfQorICB9CisKKyAgaW50IF9oZXhDaGFyKGludCBieXRlKSA9PiBieXRlLnRvUmFkaXhTdHJpbmcoMTYpLmNvZGVVbml0QXQoMCk7CisKKyAgLy8vIHdyaXRlCisKKyAgLy8vIFdyaXRlIHRoZSBbYnl0ZXNdIGFzIEpTT04gY2hhcmFjdGVycywgZXNjYXBpbmcgYXMgbmVlZGVkLgorICB2b2lkIF93cml0ZUpzb25TdHJpbmcoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisKKyAgICBpbnQgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIGludCBieXRlID0gYnl0ZXNbaV07CisgICAgICBpZiAoKGJ5dGUgJiAweDAwRkYpID49IDB4MzApIHsKKyAgICAgICAgaWYgKGJ5dGUgPT0gX0NvbnN0YW50cy5CQUNLU0xBU0hfQllURVNbMF0pIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5CQUNLU0xBU0hfQllURVMpOworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkJBQ0tTTEFTSF9CWVRFUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKGJ5dGVzLCBpLCAxKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3RlbXBCdWZmZXJbMF0gPSBfQ29uc3RhbnRzLkpTT05fQ0hBUl9UQUJMRVtieXRlXTsKKyAgICAgICAgaWYgKF90ZW1wQnVmZmVyWzBdID09IDEpIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoYnl0ZXMsIGksIDEpOworICAgICAgICB9IGVsc2UgaWYgKF90ZW1wQnVmZmVyWzBdID4gMSkgeworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkJBQ0tTTEFTSF9CWVRFUyk7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKF90ZW1wQnVmZmVyLCAwLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5FU0NTRVFfQllURVMpOworICAgICAgICAgIF90ZW1wQnVmZmVyWzBdID0gX2hleENoYXIoYnl0ZSA+PiA0KTsKKyAgICAgICAgICBfdGVtcEJ1ZmZlclsxXSA9IF9oZXhDaGFyKGJ5dGUpOworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShfdGVtcEJ1ZmZlciwgMCwgMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgIH0KKworICB2b2lkIF93cml0ZUpzb25JbnRlZ2VyKGludCBpKSB7CisgICAgaWYgKGkgPT0gbnVsbCkgaSA9IDA7CisKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIFN0cmluZyBzdHIgPSBpLnRvU3RyaW5nKCk7CisKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICAgIH0KKyAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZShzdHIpKTsKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICAgIH0KKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbkRvdWJsZShkb3VibGUgZCkgeworICAgIGlmIChkID09IG51bGwpIGQgPSAwLjA7CisKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIFN0cmluZyBzdHIgPSBkLnRvU3RyaW5nKCk7CisgICAgYm9vbCBlc2NhcGVOdW1iZXJzID0gZC5pc05hTiB8fCBkLmlzSW5maW5pdGUgfHwgX2NvbnRleHQuZXNjYXBlTnVtYmVyczsKKworICAgIGlmIChlc2NhcGVOdW1iZXJzKSB7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgICAgfQorICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKHN0cikpOworICAgIGlmIChlc2NhcGVOdW1iZXJzKSB7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgICAgfQorICB9CisKKyAgdm9pZCBfd3JpdGVKc29uQmFzZTY0KFVpbnQ4TGlzdCBieXRlcykgeworICAgIF9jb250ZXh0LndyaXRlKCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworCisgICAgU3RyaW5nIGJhc2U2NHRleHQgPSBiYXNlNjQuZW5jb2RlKGJ5dGVzKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZShiYXNlNjR0ZXh0KSk7CisKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgIH0KKworICB2b2lkIF93cml0ZUpzb25PYmplY3RTdGFydCgpIHsKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkxCUkFDRV9CWVRFUyk7CisgICAgX3B1c2hDb250ZXh0KG5ldyBfUGFpckNvbnRleHQodGhpcykpOworICB9CisKKyAgdm9pZCBfd3JpdGVKc29uT2JqZWN0RW5kKCkgeworICAgIF9wb3BDb250ZXh0KCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUkJSQUNFX0JZVEVTKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbkFycmF5U3RhcnQoKSB7CisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5MQlJBQ0tFVF9CWVRFUyk7CisgICAgX3B1c2hDb250ZXh0KG5ldyBfTGlzdENvbnRleHQodGhpcykpOworICB9CisKKyAgdm9pZCBfd3JpdGVKc29uQXJyYXlFbmQoKSB7CisgICAgX3BvcENvbnRleHQoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5SQlJBQ0tFVF9CWVRFUyk7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBfcmVzZXRDb250ZXh0KCk7CisKKyAgICBfd3JpdGVKc29uQXJyYXlTdGFydCgpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKFZFUlNJT05fMSk7CisKKyAgICBfd3JpdGVKc29uU3RyaW5nKHV0ZjhDb2RlYy5lbmNvZGUobWVzc2FnZS5uYW1lKSk7CisgICAgX3dyaXRlSnNvbkludGVnZXIobWVzc2FnZS50eXBlKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihtZXNzYWdlLnNlcWlkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgeworICAgIF93cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB7CisgICAgX3dyaXRlSnNvbk9iamVjdFN0YXJ0KCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkgeworICAgIF93cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgeworICAgIF93cml0ZUpzb25JbnRlZ2VyKGZpZWxkLmlkKTsKKyAgICBfd3JpdGVKc29uT2JqZWN0U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChmaWVsZC50eXBlKSk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7CisgICAgX3dyaXRlSnNvbk9iamVjdEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHt9CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB7CisgICAgX3dyaXRlSnNvbkFycmF5U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChtYXAua2V5VHlwZSkpOworICAgIF93cml0ZUpzb25TdHJpbmcoX0NvbnN0YW50cy5nZXRUeXBlTmFtZUJ5dGVzRm9yVHlwZUlkKG1hcC52YWx1ZVR5cGUpKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihtYXAubGVuZ3RoKTsKKyAgICBfd3JpdGVKc29uT2JqZWN0U3RhcnQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBFbmQoKSB7CisgICAgX3dyaXRlSnNvbk9iamVjdEVuZCgpOworICAgIF93cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgX3dyaXRlSnNvbkFycmF5U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChsaXN0LmVsZW1lbnRUeXBlKSk7CisgICAgX3dyaXRlSnNvbkludGVnZXIobGlzdC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RFbmQoKSB7CisgICAgX3dyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICBfd3JpdGVKc29uQXJyYXlTdGFydCgpOworICAgIF93cml0ZUpzb25TdHJpbmcoX0NvbnN0YW50cy5nZXRUeXBlTmFtZUJ5dGVzRm9yVHlwZUlkKHNldC5lbGVtZW50VHlwZSkpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKHNldC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEVuZCgpIHsKKyAgICBfd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIGlmIChiID09IG51bGwpIGIgPSBmYWxzZTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihiID8gMSA6IDApOworICB9CisKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGIpIHsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihiKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMTYoaW50IGkxNikgeworICAgIF93cml0ZUpzb25JbnRlZ2VyKGkxNik7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihpMzIpOworICB9CisKKyAgdm9pZCB3cml0ZUk2NChpbnQgaTY0KSB7CisgICAgX3dyaXRlSnNvbkludGVnZXIoaTY0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpIHsKKyAgICBfd3JpdGVKc29uRG91YmxlKGQpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgcykgeworICAgIHZhciBieXRlcyA9IHMgIT0gbnVsbCA/IHV0ZjhDb2RlYy5lbmNvZGUocykgOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KFtdKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKGJ5dGVzKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX3dyaXRlSnNvbkJhc2U2NChieXRlcyk7CisgIH0KKworICBib29sIF9pc0hpZ2hTdXJyb2dhdGUoaW50IGIpID0+IGIgPj0gMHhEODAwICYmIGIgPD0gMHhEQkZGOworCisgIGJvb2wgX2lzTG93U3Vycm9nYXRlKGludCBiKSA9PiBiID49IDB4REMwMCAmJiBiIDw9IDB4REZGRjsKKworICAvLy8gcmVhZAorCisgIFVpbnQ4TGlzdCBfcmVhZEpzb25TdHJpbmcoe2Jvb2wgc2tpcENvbnRleHQ6IGZhbHNlfSkgeworICAgIExpc3Q8aW50PiBieXRlcyA9IFtdOworICAgIExpc3Q8aW50PiBjb2RldW5pdHMgPSBbXTsKKworICAgIGlmICghc2tpcENvbnRleHQpIHsKKyAgICAgIF9jb250ZXh0LnJlYWQoKTsKKyAgICB9CisKKyAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpbnQgYnl0ZSA9IF9yZWFkZXIucmVhZCgpOworICAgICAgaWYgKGJ5dGUgPT0gX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gZXNjYXBlZD8KKyAgICAgIGlmIChieXRlICE9IF9Db25zdGFudHMuRVNDU0VRX0JZVEVTWzBdKSB7CisgICAgICAgIGJ5dGVzLmFkZChieXRlKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGJ5dGUgPSBfcmVhZGVyLnJlYWQoKTsKKworICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBcdVhYWFggYW5kIGNvbnRyb2wgY2hhcnMgbGlrZSBcbgorICAgICAgaWYgKGJ5dGUgIT0gX0NvbnN0YW50cy5FU0NTRVFfQllURVNbMV0pIHsKKyAgICAgICAgU3RyaW5nIGNoYXIgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKTsKKyAgICAgICAgaW50IG9mZnNldCA9IF9Db25zdGFudHMuRVNDQVBFX0NIQVJTLmluZGV4T2YoY2hhcik7CisgICAgICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKTsKKyAgICAgICAgfQorICAgICAgICBieXRlID0gX0NvbnN0YW50cy5FU0NBUEVfQ0hBUl9WQUxTLmNvZGVVbml0QXQob2Zmc2V0KTsKKyAgICAgICAgYnl0ZXMuYWRkKGJ5dGUpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gaXQncyBcdVhYWFgKKyAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKF90ZW1wQnVmZmVyLCAwLCA0KTsKKyAgICAgIGJ5dGUgPSAoX2hleFZhbChfdGVtcEJ1ZmZlclswXSkgPDwgMTIpCisgICAgICAgICsgKF9oZXhWYWwoX3RlbXBCdWZmZXJbMV0pIDw8IDgpCisgICAgICAgICsgKF9oZXhWYWwoX3RlbXBCdWZmZXJbMl0pIDw8IDQpCisgICAgICAgICsgX2hleFZhbChfdGVtcEJ1ZmZlclszXSk7CisgICAgICBpZiAoX2lzSGlnaFN1cnJvZ2F0ZShieXRlKSkgeworICAgICAgICBpZiAoY29kZXVuaXRzLmlzTm90RW1wdHkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIik7CisgICAgICAgIH0KKyAgICAgICAgY29kZXVuaXRzLmFkZChieXRlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9pc0xvd1N1cnJvZ2F0ZShieXRlKSkgeworICAgICAgICBpZiAoY29kZXVuaXRzLmlzRW1wdHkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSIpOworICAgICAgICB9CisgICAgICAgIGNvZGV1bml0cy5hZGQoYnl0ZSk7CisgICAgICAgIGJ5dGVzLmFkZEFsbCh1dGY4Q29kZWMuZW5jb2RlKG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RldW5pdHMpKSk7CisgICAgICAgIGNvZGV1bml0cy5jbGVhcigpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGJ5dGVzLmFkZEFsbCh1dGY4Q29kZWMuZW5jb2RlKG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvZGV1bml0cy5pc05vdEVtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUiKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChieXRlcyk7CisgIH0KKworICBTdHJpbmcgX3JlYWRKc29uTnVtZXJpY0NoYXJzKCkgeworICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICghX0NvbnN0YW50cy5pc0pzb25OdW1lcmljKF9yZWFkZXIucGVlaygpKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJ1ZmZlci53cml0ZShuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShfcmVhZGVyLnJlYWQoKSkpOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgIH0KKworICBpbnQgX3JlYWRKc29uSW50ZWdlcigpIHsKKyAgICBfY29udGV4dC5yZWFkKCk7CisKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlFVT1RFX0JZVEVTWzBdKTsKKyAgICB9CisgICAgU3RyaW5nIHN0ciA9IF9yZWFkSnNvbk51bWVyaWNDaGFycygpOworICAgIGlmIChfY29udGV4dC5lc2NhcGVOdW1iZXJzKSB7CisgICAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pOworICAgIH0KKworICAgIHRyeSB7CisgICAgICByZXR1cm4gaW50LnBhcnNlKHN0cik7CisgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKF8pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgfQorICB9CisKKyAgZG91YmxlIF9yZWFkSnNvbkRvdWJsZSgpIHsKKyAgICBfY29udGV4dC5yZWFkKCk7CisKKyAgICBpZiAoX3JlYWRlci5wZWVrKCkgPT0gX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSkgeworICAgICAgVWludDhMaXN0IGJ5dGVzID0gX3JlYWRKc29uU3RyaW5nKHNraXBDb250ZXh0OiB0cnVlKTsKKyAgICAgIGRvdWJsZSBkID0gZG91YmxlLnBhcnNlKHV0ZjhDb2RlYy5kZWNvZGUoYnl0ZXMpLCAoXykgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgICB9KTsKKyAgICAgIGlmICghX2NvbnRleHQuZXNjYXBlTnVtYmVycyAmJiAhZC5pc05hTiAmJiAhZC5pc0luZmluaXRlKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CisgICAgICB9CisgICAgICByZXR1cm4gZDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKF9jb250ZXh0LmVzY2FwZU51bWJlcnMpIHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IC0gd2Ugc2hvdWxkIGhhdmUgaGFkIGEgcXVvdGUgaWYgZXNjYXBlTnVtYmVycyA9PSB0cnVlCisgICAgICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSk7CisgICAgICB9CisgICAgICByZXR1cm4gZG91YmxlLnBhcnNlKF9yZWFkSnNvbk51bWVyaWNDaGFycygpLCAoXykgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBVaW50OExpc3QgX3JlYWRKc29uQmFzZTY0KCkgeworICAgIC8vIGNvbnZlcnQgVVRGLTggYnl0ZXMgb2YgYSBCYXNlIDY0IGVuY29kZWQgc3RyaW5nIHRvIGJpbmFyeSBieXRlcworICAgIFVpbnQ4TGlzdCBiYXNlNjRCeXRlcyA9IF9yZWFkSnNvblN0cmluZygpOworICAgIFN0cmluZyBiYXNlNjR0ZXh0ID0gdXRmOENvZGVjLmRlY29kZShiYXNlNjRCeXRlcyk7CisKKyAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChiYXNlNjQuZGVjb2RlKGJhc2U2NHRleHQpKTsKKyAgfQorCisgIHZvaWQgX3JlYWRKc29uT2JqZWN0U3RhcnQoKSB7CisgICAgX2NvbnRleHQucmVhZCgpOworICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5MQlJBQ0VfQllURVNbMF0pOworICAgIF9wdXNoQ29udGV4dChuZXcgX1BhaXJDb250ZXh0KHRoaXMpKTsKKyAgfQorCisgIHZvaWQgX3JlYWRKc29uT2JqZWN0RW5kKCkgeworICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5SQlJBQ0VfQllURVNbMF0pOworICAgIF9wb3BDb250ZXh0KCk7CisgIH0KKworICB2b2lkIF9yZWFkSnNvbkFycmF5U3RhcnQoKSB7CisgICAgX2NvbnRleHQucmVhZCgpOworICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5MQlJBQ0tFVF9CWVRFU1swXSk7CisgICAgX3B1c2hDb250ZXh0KG5ldyBfTGlzdENvbnRleHQodGhpcykpOworICB9CisKKyAgdm9pZCBfcmVhZEpzb25BcnJheUVuZCgpIHsKKyAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUkJSQUNLRVRfQllURVNbMF0pOworICAgIF9wb3BDb250ZXh0KCk7CisgIH0KKworICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgeworICAgIF9yZXNldENvbnRleHQoKTsKKworICAgIF9yZWFkSnNvbkFycmF5U3RhcnQoKTsKKyAgICBpZiAoX3JlYWRKc29uSW50ZWdlcigpICE9IFZFUlNJT05fMSkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5CQURfVkVSU0lPTiwgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOworICAgIH0KKworICAgIFVpbnQ4TGlzdCBidWZmZXIgPSBfcmVhZEpzb25TdHJpbmcoKTsKKyAgICBTdHJpbmcgbmFtZSA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICBpbnQgdHlwZSA9IF9yZWFkSnNvbkludGVnZXIoKTsKKyAgICBpbnQgc2VxaWQgPSBfcmVhZEpzb25JbnRlZ2VyKCk7CisKKyAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG5hbWUsIHR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7CisgICAgX3JlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIF9yZWFkSnNvbk9iamVjdFN0YXJ0KCk7CisgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgIH0KKworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgX3JlYWRKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB7CisgICAgU3RyaW5nIG5hbWUgPSAiIjsKKyAgICBpbnQgdHlwZSA9IFRUeXBlLlNUT1A7CisgICAgaW50IGlkID0gMDsKKworICAgIGlmIChfcmVhZGVyLnBlZWsoKSAhPSBfQ29uc3RhbnRzLlJCUkFDRV9CWVRFU1swXSkgeworICAgICAgaWQgPSBfcmVhZEpzb25JbnRlZ2VyKCk7CisgICAgICBfcmVhZEpzb25PYmplY3RTdGFydCgpOworICAgICAgdHlwZSA9IF9Db25zdGFudHMuZ2V0VHlwZUlkRm9yVHlwZU5hbWUoX3JlYWRKc29uU3RyaW5nKCkpOworICAgIH0KKworICAgIHJldHVybiBuZXcgVEZpZWxkKG5hbWUsIHR5cGUsIGlkKTsKKyAgfQorCisgIHZvaWQgcmVhZEZpZWxkRW5kKCkgeworICAgIF9yZWFkSnNvbk9iamVjdEVuZCgpOworICB9CisKKyAgVE1hcCByZWFkTWFwQmVnaW4oKSB7CisgICAgX3JlYWRKc29uQXJyYXlTdGFydCgpOworICAgIGludCBrZXlUeXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgaW50IHZhbHVlVHlwZSA9IF9Db25zdGFudHMuZ2V0VHlwZUlkRm9yVHlwZU5hbWUoX3JlYWRKc29uU3RyaW5nKCkpOworICAgIGludCBsZW5ndGggPSBfcmVhZEpzb25JbnRlZ2VyKCk7CisgICAgX3JlYWRKc29uT2JqZWN0U3RhcnQoKTsKKworICAgIHJldHVybiBuZXcgVE1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRNYXBFbmQoKSB7CisgICAgX3JlYWRKc29uT2JqZWN0RW5kKCk7CisgICAgX3JlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB7CisgICAgX3JlYWRKc29uQXJyYXlTdGFydCgpOworICAgIGludCBlbGVtZW50VHlwZSA9IF9Db25zdGFudHMuZ2V0VHlwZUlkRm9yVHlwZU5hbWUoX3JlYWRKc29uU3RyaW5nKCkpOworICAgIGludCBsZW5ndGggPSBfcmVhZEpzb25JbnRlZ2VyKCk7CisKKyAgICByZXR1cm4gbmV3IFRMaXN0KGVsZW1lbnRUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkTGlzdEVuZCgpIHsKKyAgICBfcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSB7CisgICAgX3JlYWRKc29uQXJyYXlTdGFydCgpOworICAgIGludCBlbGVtZW50VHlwZSA9IF9Db25zdGFudHMuZ2V0VHlwZUlkRm9yVHlwZU5hbWUoX3JlYWRKc29uU3RyaW5nKCkpOworICAgIGludCBsZW5ndGggPSBfcmVhZEpzb25JbnRlZ2VyKCk7CisKKyAgICByZXR1cm4gbmV3IFRTZXQoZWxlbWVudFR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRTZXRFbmQoKSB7CisgICAgX3JlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIGJvb2wgcmVhZEJvb2woKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkludGVnZXIoKSA9PSAwID8gZmFsc2UgOiB0cnVlOworICB9CisKKyAgaW50IHJlYWRCeXRlKCkgeworICAgIHJldHVybiBfcmVhZEpzb25JbnRlZ2VyKCk7CisgIH0KKworICBpbnQgcmVhZEkxNigpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uSW50ZWdlcigpOworICB9CisKKyAgaW50IHJlYWRJMzIoKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkludGVnZXIoKTsKKyAgfQorCisgIGludCByZWFkSTY0KCkgeworICAgIHJldHVybiBfcmVhZEpzb25JbnRlZ2VyKCk7CisgIH0KKworICBkb3VibGUgcmVhZERvdWJsZSgpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uRG91YmxlKCk7CisgIH0KKworICBTdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICByZXR1cm4gdXRmOENvZGVjLmRlY29kZShfcmVhZEpzb25TdHJpbmcoKSk7CisgIH0KKworICBVaW50OExpc3QgcmVhZEJpbmFyeSgpIHsKKyAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChfcmVhZEpzb25CYXNlNjQoKSk7CisgIH0KK30KKworY2xhc3MgX0NvbnN0YW50cyB7CisgIHN0YXRpYyBjb25zdCB1dGY4Y29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEhFWF8wX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnMCcuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBIRVhfOV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJzknLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgSEVYX0FfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCdhJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEhFWF9GX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnZicuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBDT01NQV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJywnLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgQ09MT05fQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCc6Jy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IExCUkFDRV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ3snLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgUkJSQUNFX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnfScuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBMQlJBQ0tFVF9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ1snLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgUkJSQUNLRVRfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCddJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IFFVT1RFX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnIicuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBCQUNLU0xBU0hfQllURVMgPQorICAgICAgbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChyJ1wnLmNvZGVVbml0cyk7CisKKyAgc3RhdGljIGZpbmFsIEVTQ1NFUV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QocidcdTAwJy5jb2RlVW5pdHMpOworCisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgSlNPTl9DSEFSX1RBQkxFID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gOCBieXRlcworICAgICdiJy5jb2RlVW5pdEF0KDApLCAndCcuY29kZVVuaXRBdCgwKSwgJ24nLmNvZGVVbml0QXQoMCksIDAsIC8vIDQgYnl0ZXMKKyAgICAnZicuY29kZVVuaXRBdCgwKSwgJ3InLmNvZGVVbml0QXQoMCksIDAsIDAsIC8vIDQgYnl0ZXMKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyA4IGJ5dGVzCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gOCBieXRlcworICAgIDEsIDEsICciJy5jb2RlVW5pdEF0KDApLCAxLCAxLCAxLCAxLCAxLCAvLyA4IGJ5dGVzCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSAvLyA4IGJ5dGVzCisgIF0pOworCisgIHN0YXRpYyBjb25zdCBTdHJpbmcgRVNDQVBFX0NIQVJTID0gciciXC9iZm5ydCc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgRVNDQVBFX0NIQVJfVkFMUyA9ICciXFwvXGJcZlxuXHJcdCc7CisKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0JPT0wgPSAndGYnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfQllURSA9ICdpOCc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9JMTYgPSAnaTE2JzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0kzMiA9ICdpMzInOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfSTY0ID0gJ2k2NCc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9ET1VCTEUgPSAnZGJsJzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX1NUUlVDVCA9ICdyZWMnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfU1RSSU5HID0gJ3N0cic7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9NQVAgPSAnbWFwJzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0xJU1QgPSAnbHN0JzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX1NFVCA9ICdzZXQnOworCisgIHN0YXRpYyBmaW5hbCBNYXA8aW50LCBVaW50OExpc3Q+IF9UWVBFX0lEX1RPX05BTUVfQllURVMgPQorICAgICAgbmV3IE1hcC51bm1vZGlmaWFibGUoeworICAgIFRUeXBlLkJPT0w6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9CT09MLmNvZGVVbml0cyksCisgICAgVFR5cGUuQllURTogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0JZVEUuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5JMTY6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9JMTYuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5JMzI6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9JMzIuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5JNjQ6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9JNjQuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5ET1VCTEU6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9ET1VCTEUuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5TVFJJTkc6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9TVFJJTkcuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5TVFJVQ1Q6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9TVFJVQ1QuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5NQVA6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9NQVAuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5TRVQ6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9TRVQuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5MSVNUOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfTElTVC5jb2RlVW5pdHMpCisgIH0pOworCisgIHN0YXRpYyBVaW50OExpc3QgZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChpbnQgdHlwZUlkKSB7CisgICAgaWYgKCFfVFlQRV9JRF9UT19OQU1FX0JZVEVTLmNvbnRhaW5zS2V5KHR5cGVJZCkpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB9CisKKyAgICByZXR1cm4gX1RZUEVfSURfVE9fTkFNRV9CWVRFU1t0eXBlSWRdOworICB9CisKKyAgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIGludD4gX05BTUVfVE9fVFlQRV9JRCA9IG5ldyBNYXAudW5tb2RpZmlhYmxlKHsKKyAgICBOQU1FX0JPT0w6IFRUeXBlLkJPT0wsCisgICAgTkFNRV9CWVRFOiBUVHlwZS5CWVRFLAorICAgIE5BTUVfSTE2OiBUVHlwZS5JMTYsCisgICAgTkFNRV9JMzI6IFRUeXBlLkkzMiwKKyAgICBOQU1FX0k2NDogVFR5cGUuSTY0LAorICAgIE5BTUVfRE9VQkxFOiBUVHlwZS5ET1VCTEUsCisgICAgTkFNRV9TVFJJTkc6IFRUeXBlLlNUUklORywKKyAgICBOQU1FX1NUUlVDVDogVFR5cGUuU1RSVUNULAorICAgIE5BTUVfTUFQOiBUVHlwZS5NQVAsCisgICAgTkFNRV9TRVQ6IFRUeXBlLlNFVCwKKyAgICBOQU1FX0xJU1Q6IFRUeXBlLkxJU1QKKyAgfSk7CisKKyAgc3RhdGljIGludCBnZXRUeXBlSWRGb3JUeXBlTmFtZShVaW50OExpc3QgYnl0ZXMpIHsKKyAgICBTdHJpbmcgbmFtZSA9IHV0Zjhjb2RlYy5kZWNvZGUoYnl0ZXMpOworICAgIGlmICghX05BTUVfVE9fVFlQRV9JRC5jb250YWluc0tleShuYW1lKSkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIH0KKworICAgIHJldHVybiBfTkFNRV9UT19UWVBFX0lEW25hbWVdOworICB9CisKKyAgc3RhdGljIGZpbmFsIFNldDxpbnQ+IF9KU09OX05VTUVSSUNTID0gbmV3IFNldC5mcm9tKFsKKyAgICAnKycuY29kZVVuaXRBdCgwKSwKKyAgICAnLScuY29kZVVuaXRBdCgwKSwKKyAgICAnLicuY29kZVVuaXRBdCgwKSwKKyAgICAnMCcuY29kZVVuaXRBdCgwKSwKKyAgICAnMScuY29kZVVuaXRBdCgwKSwKKyAgICAnMicuY29kZVVuaXRBdCgwKSwKKyAgICAnMycuY29kZVVuaXRBdCgwKSwKKyAgICAnNCcuY29kZVVuaXRBdCgwKSwKKyAgICAnNScuY29kZVVuaXRBdCgwKSwKKyAgICAnNicuY29kZVVuaXRBdCgwKSwKKyAgICAnNycuY29kZVVuaXRBdCgwKSwKKyAgICAnOCcuY29kZVVuaXRBdCgwKSwKKyAgICAnOScuY29kZVVuaXRBdCgwKSwKKyAgICAnRScuY29kZVVuaXRBdCgwKSwKKyAgICAnZScuY29kZVVuaXRBdCgwKQorICBdKTsKKworICBzdGF0aWMgYm9vbCBpc0pzb25OdW1lcmljKGludCBieXRlKSB7CisgICAgcmV0dXJuIF9KU09OX05VTUVSSUNTLmNvbnRhaW5zKGJ5dGUpOworICB9Cit9CisKK2NsYXNzIF9Mb29rYWhlYWRSZWFkZXIgeworICBmaW5hbCBUSnNvblByb3RvY29sIHByb3RvY29sOworCisgIF9Mb29rYWhlYWRSZWFkZXIodGhpcy5wcm90b2NvbCk7CisKKyAgYm9vbCBfaGFzRGF0YSA9IGZhbHNlOworICBmaW5hbCBVaW50OExpc3QgX2RhdGEgPSBuZXcgVWludDhMaXN0KDEpOworCisgIGludCByZWFkKCkgeworICAgIGlmIChfaGFzRGF0YSkgeworICAgICAgX2hhc0RhdGEgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG9jb2wudHJhbnNwb3J0LnJlYWRBbGwoX2RhdGEsIDAsIDEpOworICAgIH0KKworICAgIHJldHVybiBfZGF0YVswXTsKKyAgfQorCisgIGludCBwZWVrKCkgeworICAgIGlmICghX2hhc0RhdGEpIHsKKyAgICAgIHByb3RvY29sLnRyYW5zcG9ydC5yZWFkQWxsKF9kYXRhLCAwLCAxKTsKKyAgICB9CisgICAgX2hhc0RhdGEgPSB0cnVlOworCisgICAgcmV0dXJuIF9kYXRhWzBdOworICB9Cit9CisKK2NsYXNzIF9CYXNlQ29udGV4dCB7CisgIGZpbmFsIFRKc29uUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgX0Jhc2VDb250ZXh0KHRoaXMucHJvdG9jb2wpOworCisgIHZvaWQgd3JpdGUoKSB7fQorCisgIHZvaWQgcmVhZCgpIHt9CisKKyAgYm9vbCBnZXQgZXNjYXBlTnVtYmVycyA9PiBmYWxzZTsKKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQmFzZUNvbnRleHQnOworfQorCitjbGFzcyBfTGlzdENvbnRleHQgZXh0ZW5kcyBfQmFzZUNvbnRleHQgeworICBfTGlzdENvbnRleHQoVEpzb25Qcm90b2NvbCBwcm90b2NvbCkgOiBzdXBlcihwcm90b2NvbCk7CisKKyAgYm9vbCBfZmlyc3QgPSB0cnVlOworCisgIHZvaWQgd3JpdGUoKSB7CisgICAgaWYgKF9maXJzdCkgeworICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3RvY29sLnRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkNPTU1BX0JZVEVTKTsKKyAgICB9CisgIH0KKworICB2b2lkIHJlYWQoKSB7CisgICAgaWYgKF9maXJzdCkgeworICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3RvY29sLl9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5DT01NQV9CWVRFU1swXSk7CisgICAgfQorICB9CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0xpc3RDb250ZXh0JzsKK30KKworY2xhc3MgX1BhaXJDb250ZXh0IGV4dGVuZHMgX0Jhc2VDb250ZXh0IHsKKyAgX1BhaXJDb250ZXh0KFRKc29uUHJvdG9jb2wgcHJvdG9jb2wpIDogc3VwZXIocHJvdG9jb2wpOworCisgIGJvb2wgX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCBfY29sb24gPSB0cnVlOworCisgIFVpbnQ4TGlzdCBnZXQgc3ltYm9sQnl0ZXMgPT4KKyAgICAgIF9jb2xvbiA/IF9Db25zdGFudHMuQ09MT05fQllURVMgOiBfQ29uc3RhbnRzLkNPTU1BX0JZVEVTOworCisgIHZvaWQgd3JpdGUoKSB7CisgICAgaWYgKF9maXJzdCkgeworICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICBfY29sb24gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBwcm90b2NvbC50cmFuc3BvcnQud3JpdGVBbGwoc3ltYm9sQnl0ZXMpOworICAgICAgX2NvbG9uID0gIV9jb2xvbjsKKyAgICB9CisgIH0KKworICB2b2lkIHJlYWQoKSB7CisgICAgaWYgKF9maXJzdCkgeworICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICBfY29sb24gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBwcm90b2NvbC5fcmVhZEpzb25TeW50YXhDaGFyKHN5bWJvbEJ5dGVzWzBdKTsKKyAgICAgIF9jb2xvbiA9ICFfY29sb247CisgICAgfQorICB9CisKKyAgYm9vbCBnZXQgZXNjYXBlTnVtYmVycyA9PiBfY29sb247CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1BhaXJDb250ZXh0JzsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9saXN0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbGlzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjQ2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbGlzdC5kYXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVExpc3QgeworICBmaW5hbCBpbnQgZWxlbWVudFR5cGU7CisgIGZpbmFsIGludCBsZW5ndGg7CisKKyAgVExpc3QodGhpcy5lbGVtZW50VHlwZSwgdGhpcy5sZW5ndGgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X21hcC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X21hcC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZGY2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWFwLmRhcnQKQEAgLTAsMCArMSwyNiBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUTWFwIHsKKyAgZmluYWwgaW50IGtleVR5cGU7CisgIGZpbmFsIGludCB2YWx1ZVR5cGU7CisgIGZpbmFsIGludCBsZW5ndGg7CisKKyAgVE1hcCh0aGlzLmtleVR5cGUsIHRoaXMudmFsdWVUeXBlLCB0aGlzLmxlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWVzc2FnZS5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X21lc3NhZ2UuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdiODg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X21lc3NhZ2UuZGFydApAQCAtMCwwICsxLDM1IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRNZXNzYWdlVHlwZSB7CisgIHN0YXRpYyBjb25zdCBpbnQgQ0FMTCA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQgUkVQTFkgPSAyOworICBzdGF0aWMgY29uc3QgaW50IEVYQ0VQVElPTiA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQgT05FV0FZID0gNDsKK30KKworY2xhc3MgVE1lc3NhZ2UgeworICBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgZmluYWwgaW50IHR5cGU7CisgIGZpbmFsIGludCBzZXFpZDsKKworICBUTWVzc2FnZSh0aGlzLm5hbWUsIHRoaXMudHlwZSwgdGhpcy5zZXFpZCk7CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIjxUTWVzc2FnZSBuYW1lOiAnJG5hbWUnIHR5cGU6ICR0eXBlIHNlcWlkOiAkc2VxaWQ+IjsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X211bHRpcGxleGVkX3Byb3RvY29sLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4YTZkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5kYXJ0CkBAIC0wLDAgKzEsNDMgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgQyMgdmVyc2lvbi4KK2NsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yIHsKKyAgc3RhdGljIGNvbnN0IFNFUEFSQVRPUiA9ICc6JzsKKworICBmaW5hbCBTdHJpbmcgX3NlcnZpY2VOYW1lOworCisgIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgU3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgOiBfc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZSwKKyAgICAgICAgc3VwZXIocHJvdG9jb2wpIHsKKyAgICBpZiAoc2VydmljZU5hbWUgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgic2VydmljZU5hbWUiKTsKKyAgICB9CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBpZiAobWVzc2FnZS50eXBlID09IFRNZXNzYWdlVHlwZS5DQUxMIHx8CisgICAgICAgIG1lc3NhZ2UudHlwZSA9PSBUTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgICBTdHJpbmcgbmFtZSA9IF9zZXJ2aWNlTmFtZSArIFNFUEFSQVRPUiArIG1lc3NhZ2UubmFtZTsKKyAgICAgIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UobmFtZSwgbWVzc2FnZS50eXBlLCBtZXNzYWdlLnNlcWlkKTsKKyAgICB9CisKKyAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2wuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDljMDMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sLmRhcnQKQEAgLTAsMCArMSw5NSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCithYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wgeworICBmaW5hbCBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICBUUHJvdG9jb2wodGhpcy50cmFuc3BvcnQpOworCisgIC8vLyBXcml0ZQorICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpOworICB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpOworCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCk7CisgIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKTsKKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpOworICB2b2lkIHdyaXRlRmllbGRFbmQoKTsKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpOworCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCk7CisgIHZvaWQgd3JpdGVNYXBFbmQoKTsKKworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpOworICB2b2lkIHdyaXRlTGlzdEVuZCgpOworCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCk7CisgIHZvaWQgd3JpdGVTZXRFbmQoKTsKKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpOworCisgIHZvaWQgd3JpdGVCeXRlKGludCBiKTsKKworICB2b2lkIHdyaXRlSTE2KGludCBpMTYpOworCisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMik7CisKKyAgdm9pZCB3cml0ZUk2NChpbnQgaTY0KTsKKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkKTsKKworICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpOworCisgIHZvaWQgd3JpdGVCaW5hcnkoVWludDhMaXN0IGJ5dGVzKTsKKworICAvLy8gUmVhZAorICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCk7CisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKTsKKworICBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpOworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKTsKKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKTsKKyAgdm9pZCByZWFkRmllbGRFbmQoKTsKKworICBUTWFwIHJlYWRNYXBCZWdpbigpOworICB2b2lkIHJlYWRNYXBFbmQoKTsKKworICBUTGlzdCByZWFkTGlzdEJlZ2luKCk7CisgIHZvaWQgcmVhZExpc3RFbmQoKTsKKworICBUU2V0IHJlYWRTZXRCZWdpbigpOworICB2b2lkIHJlYWRTZXRFbmQoKTsKKworICBib29sIHJlYWRCb29sKCk7CisKKyAgaW50IHJlYWRCeXRlKCk7CisKKyAgaW50IHJlYWRJMTYoKTsKKworICBpbnQgcmVhZEkzMigpOworCisgIGludCByZWFkSTY0KCk7CisKKyAgZG91YmxlIHJlYWREb3VibGUoKTsKKworICBTdHJpbmcgcmVhZFN0cmluZygpOworCisgIFVpbnQ4TGlzdCByZWFkQmluYXJ5KCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZGVjb3JhdG9yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZGVjb3JhdG9yLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkMDJmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9kZWNvcmF0b3IuZGFydApAQCAtMCwwICsxLDE1MCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gRm9yd2FyZCBhbGwgb3BlcmF0aW9ucyB0byB0aGUgd3JhcHBlZCBwcm90b2NvbC4gIFVzZWQgYXMgYSBiYXNlIGNsYXNzLgorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBDIyB2ZXJzaW9uLgorY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIGV4dGVuZHMgVFByb3RvY29sIHsKKyAgZmluYWwgVFByb3RvY29sIF9wcm90b2NvbDsKKworICBUUHJvdG9jb2xEZWNvcmF0b3IoVFByb3RvY29sIHByb3RvY29sKQorICAgICAgOiBfcHJvdG9jb2wgPSBwcm90b2NvbCwKKyAgICAgICAgc3VwZXIocHJvdG9jb2wudHJhbnNwb3J0KTsKKworICAvLy8gV3JpdGUKKworICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZSk7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Y3QpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgeworICAgIF9wcm90b2NvbC53cml0ZUZpZWxkQmVnaW4oZmllbGQpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZUZpZWxkRW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRTdG9wKCkgeworICAgIF9wcm90b2NvbC53cml0ZUZpZWxkU3RvcCgpOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB7CisgICAgX3Byb3RvY29sLndyaXRlTWFwQmVnaW4obWFwKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBFbmQoKSB7CisgICAgX3Byb3RvY29sLndyaXRlTWFwRW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4obGlzdCk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEVuZCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVTZXRCZWdpbihzZXQpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEVuZCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVTZXRFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIF9wcm90b2NvbC53cml0ZUJvb2woYik7CisgIH0KKworICB2b2lkIHdyaXRlQnl0ZShpbnQgYikgeworICAgIF9wcm90b2NvbC53cml0ZUJ5dGUoYik7CisgIH0KKworICB2b2lkIHdyaXRlSTE2KGludCBpMTYpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVJMTYoaTE2KTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgeworICAgIF9wcm90b2NvbC53cml0ZUkzMihpMzIpOworICB9CisKKyAgdm9pZCB3cml0ZUk2NChpbnQgaTY0KSB7CisgICAgX3Byb3RvY29sLndyaXRlSTY0KGk2NCk7CisgIH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkKSB7CisgICAgX3Byb3RvY29sLndyaXRlRG91YmxlKGQpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB7CisgICAgX3Byb3RvY29sLndyaXRlU3RyaW5nKHN0cik7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KFVpbnQ4TGlzdCBieXRlcykgeworICAgIF9wcm90b2NvbC53cml0ZUJpbmFyeShieXRlcyk7CisgIH0KKworICAvLy8gUmVhZAorICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpID0+IF9wcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRTdHJ1Y3RCZWdpbigpOworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSA9PiBfcHJvdG9jb2wucmVhZFN0cnVjdEVuZCgpOworCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpID0+IF9wcm90b2NvbC5yZWFkRmllbGRCZWdpbigpOworICB2b2lkIHJlYWRGaWVsZEVuZCgpID0+IF9wcm90b2NvbC5yZWFkRmllbGRFbmQoKTsKKworICBUTWFwIHJlYWRNYXBCZWdpbigpID0+IF9wcm90b2NvbC5yZWFkTWFwQmVnaW4oKTsKKyAgdm9pZCByZWFkTWFwRW5kKCkgPT4gX3Byb3RvY29sLnJlYWRNYXBFbmQoKTsKKworICBUTGlzdCByZWFkTGlzdEJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRMaXN0QmVnaW4oKTsKKyAgdm9pZCByZWFkTGlzdEVuZCgpID0+IF9wcm90b2NvbC5yZWFkTGlzdEVuZCgpOworCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRTZXRCZWdpbigpOworICB2b2lkIHJlYWRTZXRFbmQoKSA9PiBfcHJvdG9jb2wucmVhZFNldEVuZCgpOworCisgIGJvb2wgcmVhZEJvb2woKSA9PiBfcHJvdG9jb2wucmVhZEJvb2woKTsKKworICBpbnQgcmVhZEJ5dGUoKSA9PiBfcHJvdG9jb2wucmVhZEJ5dGUoKTsKKworICBpbnQgcmVhZEkxNigpID0+IF9wcm90b2NvbC5yZWFkSTE2KCk7CisKKyAgaW50IHJlYWRJMzIoKSA9PiBfcHJvdG9jb2wucmVhZEkzMigpOworCisgIGludCByZWFkSTY0KCkgPT4gX3Byb3RvY29sLnJlYWRJNjQoKTsKKworICBkb3VibGUgcmVhZERvdWJsZSgpID0+IF9wcm90b2NvbC5yZWFkRG91YmxlKCk7CisKKyAgU3RyaW5nIHJlYWRTdHJpbmcoKSA9PiBfcHJvdG9jb2wucmVhZFN0cmluZygpOworCisgIFVpbnQ4TGlzdCByZWFkQmluYXJ5KCkgPT4gX3Byb3RvY29sLnJlYWRCaW5hcnkoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9lcnJvci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2Vycm9yLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2YmFlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9lcnJvci5kYXJ0CkBAIC0wLDAgKzEsMzMgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFByb3RvY29sRXJyb3JUeXBlIHsKKyAgc3RhdGljIGNvbnN0IGludCBVTktOT1dOID0gMDsKKyAgc3RhdGljIGNvbnN0IGludCBJTlZBTElEX0RBVEEgPSAxOworICBzdGF0aWMgY29uc3QgaW50IE5FR0FUSVZFX1NJWkUgPSAyOworICBzdGF0aWMgY29uc3QgaW50IFNJWkVfTElNSVQgPSAzOworICBzdGF0aWMgY29uc3QgaW50IEJBRF9WRVJTSU9OID0gNDsKKyAgc3RhdGljIGNvbnN0IGludCBOT1RfSU1QTEVNRU5URUQgPSA1OworICBzdGF0aWMgY29uc3QgaW50IERFUFRIX0xJTUlUID0gNjsKK30KKworY2xhc3MgVFByb3RvY29sRXJyb3IgZXh0ZW5kcyBURXJyb3IgeworICBUUHJvdG9jb2xFcnJvcihbaW50IHR5cGUgPSBUUHJvdG9jb2xFcnJvclR5cGUuVU5LTk9XTiwgU3RyaW5nIG1lc3NhZ2UgPSAiIl0pCisgICAgICA6IHN1cGVyKHR5cGUsIG1lc3NhZ2UpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2ZhY3RvcnkuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9mYWN0b3J5LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyYzZjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9mYWN0b3J5LmRhcnQKQEAgLTAsMCArMSwyMiBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCithYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xGYWN0b3J5PFQgZXh0ZW5kcyBUUHJvdG9jb2w+IHsKKyAgVCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfdXRpbC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX3V0aWwuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDFlYTgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX3V0aWwuZGFydApAQCAtMCwwICsxLDEwNyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUUHJvdG9jb2xVdGlsIHsKKyAgLy8gZXF1YWwgdG8gSmF2YVNjcmlwdCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgMl41MyAtIDEKKyAgc3RhdGljIGNvbnN0IGludCBkZWZhdWx0UmVjdXJzaW9uTGltaXQgPSA5MDA3MTk5MjU0NzQwOTkxOworCisgIHN0YXRpYyBpbnQgbWF4UmVjdXJzaW9uTGltaXQgPSBkZWZhdWx0UmVjdXJzaW9uTGltaXQ7CisKKyAgc3RhdGljIHNraXAoVFByb3RvY29sIHByb3QsIGludCB0eXBlKSB7CisgICAgX3NraXAocHJvdCwgdHlwZSwgbWF4UmVjdXJzaW9uTGltaXQpOworICB9CisKKyAgc3RhdGljIF9za2lwKFRQcm90b2NvbCBwcm90LCBpbnQgdHlwZSwgaW50IHJlY3Vyc2lvbkxpbWl0KSB7CisgICAgaWYgKHJlY3Vyc2lvbkxpbWl0IDw9IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuREVQVEhfTElNSVQsICJEZXB0aCBsaW1pdCBleGNlZWRlZCIpOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgICBwcm90LnJlYWRCb29sKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICAgIHByb3QucmVhZEJ5dGUoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICBwcm90LnJlYWRJMTYoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICBwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICBwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgICBwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgICBwcm90LnJlYWRCaW5hcnkoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgICBwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IHByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgX3NraXAocHJvdCwgZmllbGQudHlwZSwgcmVjdXJzaW9uTGltaXQgLSAxKTsKKyAgICAgICAgICBwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIHByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5NQVA6CisgICAgICAgIFRNYXAgbWFwID0gcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBfc2tpcChwcm90LCBtYXAua2V5VHlwZSwgcmVjdXJzaW9uTGltaXQgLSAxKTsKKyAgICAgICAgICBfc2tpcChwcm90LCBtYXAudmFsdWVUeXBlLCByZWN1cnNpb25MaW1pdCAtIDEpOworICAgICAgICB9CisgICAgICAgIHByb3QucmVhZE1hcEVuZCgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5TRVQ6CisgICAgICAgIFRTZXQgc2V0ID0gcHJvdC5yZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBfc2tpcChwcm90LCBzZXQuZWxlbWVudFR5cGUsIHJlY3Vyc2lvbkxpbWl0IC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdC5yZWFkU2V0RW5kKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLkxJU1Q6CisgICAgICAgIFRMaXN0IGxpc3QgPSBwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgX3NraXAocHJvdCwgbGlzdC5lbGVtZW50VHlwZSwgcmVjdXJzaW9uTGltaXQgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBwcm90LnJlYWRMaXN0RW5kKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwgIkludmFsaWQgZGF0YSIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3NldC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3NldC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDI1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc2V0LmRhcnQKQEAgLTAsMCArMSwyNSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUU2V0IHsKKyAgZmluYWwgaW50IGVsZW1lbnRUeXBlOworICBmaW5hbCBpbnQgbGVuZ3RoOworCisgIFRTZXQodGhpcy5lbGVtZW50VHlwZSwgdGhpcy5sZW5ndGgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3N0cnVjdC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3N0cnVjdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDNmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc3RydWN0LmRhcnQKQEAgLTAsMCArMSwyNCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUU3RydWN0IHsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgVFN0cnVjdChbdGhpcy5uYW1lID0gIiJdKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF90eXBlLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfdHlwZS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTlkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfdHlwZS5kYXJ0CkBAIC0wLDAgKzEsMzQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IFNUT1AgPSAwOworICBzdGF0aWMgY29uc3QgaW50IFZPSUQgPSAxOworICBzdGF0aWMgY29uc3QgaW50IEJPT0wgPSAyOworICBzdGF0aWMgY29uc3QgaW50IEJZVEUgPSAzOworICBzdGF0aWMgY29uc3QgaW50IERPVUJMRSA9IDQ7CisgIHN0YXRpYyBjb25zdCBpbnQgSTE2ID0gNjsKKyAgc3RhdGljIGNvbnN0IGludCBJMzIgPSA4OworICBzdGF0aWMgY29uc3QgaW50IEk2NCA9IDEwOworICBzdGF0aWMgY29uc3QgaW50IFNUUklORyA9IDExOworICBzdGF0aWMgY29uc3QgaW50IFNUUlVDVCA9IDEyOworICBzdGF0aWMgY29uc3QgaW50IE1BUCA9IDEzOworICBzdGF0aWMgY29uc3QgaW50IFNFVCA9IDE0OworICBzdGF0aWMgY29uc3QgaW50IExJU1QgPSAxNTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X2Rlc2VyaWFsaXplci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3RfZGVzZXJpYWxpemVyLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmYmVlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X2Rlc2VyaWFsaXplci5kYXJ0CkBAIC0wLDAgKzEsNTAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVERlc2VyaWFsaXplciB7CisgIGZpbmFsIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ0Rlc2VyaWFsaXplcicsIFRNZXNzYWdlVHlwZS5PTkVXQVksIDEpOworICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnNwb3J0OworICBUUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgVERlc2VyaWFsaXplcih7VFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnl9KSB7CisgICAgdGhpcy50cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisgICAgCisgICAgaWYgKHByb3RvY29sRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpOworICAgIH0KKyAgICAKKyAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKHRoaXMudHJhbnNwb3J0KTsKKyAgfQorCisgIHZvaWQgcmVhZChUQmFzZSBiYXNlLCBVaW50OExpc3QgZGF0YSkgeworICAgIHRyYW5zcG9ydC53cml0ZUFsbChkYXRhKTsKKyAgICAKKyAgICB0cmFuc3BvcnQuZmx1c2goKTsKKyAgICAKKyAgICBiYXNlLnJlYWQocHJvdG9jb2wpOworICB9CisKKyAgdm9pZCByZWFkU3RyaW5nKFRCYXNlIGJhc2UsIFN0cmluZyBkYXRhKSB7CisgICAgCisgICAgdHJhbnNwb3J0LndyaXRlQWxsKGJhc2U2NC5kZWNvZGUoZGF0YSkpOworICAgIHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgYmFzZS5yZWFkKHByb3RvY29sKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3Rfc2VyaWFsaXplci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3Rfc2VyaWFsaXplci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZWM4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3NlcmlhbGl6ZXIvdF9zZXJpYWxpemVyLmRhcnQKQEAgLTAsMCArMSw0OCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUU2VyaWFsaXplciB7CisgIGZpbmFsIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ1NlcmlhbGl6ZXInLCBUTWVzc2FnZVR5cGUuT05FV0FZLCAxKTsKKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgVFByb3RvY29sIHByb3RvY29sOworCisgIFRTZXJpYWxpemVyKHtUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeX0pIHsKKyAgICB0aGlzLnRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKKyAgICAKKyAgICBpZiAocHJvdG9jb2xGYWN0b3J5ID09IG51bGwpIHsKKyAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgICAgfQorCisgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbCh0aGlzLnRyYW5zcG9ydCk7CisgIH0KKworICBVaW50OExpc3Qgd3JpdGUoVEJhc2UgYmFzZSkgeworICAgIGJhc2Uud3JpdGUocHJvdG9jb2wpOworICAgIAorICAgIHJldHVybiB0cmFuc3BvcnQuY29uc3VtZVdyaXRlQnVmZmVyKCk7CisgIH0KKworICBTdHJpbmcgd3JpdGVTdHJpbmcoVEJhc2UgYmFzZSkgeworICAgIGJhc2Uud3JpdGUocHJvdG9jb2wpOworICAgIAorICAgIFVpbnQ4TGlzdCBieXRlcyA9IHRyYW5zcG9ydC5jb25zdW1lV3JpdGVCdWZmZXIoKTsKKyAgICAKKyAgICByZXR1cm4gYmFzZTY0LmVuY29kZShieXRlcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdF9hcHBsaWNhdGlvbl9lcnJvci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90X2FwcGxpY2F0aW9uX2Vycm9yLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4YWJkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9hcHBsaWNhdGlvbl9lcnJvci5kYXJ0CkBAIC0wLDAgKzEsMTA0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRBcHBsaWNhdGlvbkVycm9yVHlwZSB7CisgIHN0YXRpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7CisgIHN0YXRpYyBjb25zdCBpbnQgVU5LTk9XTl9NRVRIT0QgPSAxOworICBzdGF0aWMgY29uc3QgaW50IElOVkFMSURfTUVTU0FHRV9UWVBFID0gMjsKKyAgc3RhdGljIGNvbnN0IGludCBXUk9OR19NRVRIT0RfTkFNRSA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQgQkFEX1NFUVVFTkNFX0lEID0gNDsKKyAgc3RhdGljIGNvbnN0IGludCBNSVNTSU5HX1JFU1VMVCA9IDU7CisgIHN0YXRpYyBjb25zdCBpbnQgSU5URVJOQUxfRVJST1IgPSA2OworICBzdGF0aWMgY29uc3QgaW50IFBST1RPQ09MX0VSUk9SID0gNzsKKyAgc3RhdGljIGNvbnN0IGludCBJTlZBTElEX1RSQU5TRk9STSA9IDg7CisgIHN0YXRpYyBjb25zdCBpbnQgSU5WQUxJRF9QUk9UT0NPTCA9IDk7CisgIHN0YXRpYyBjb25zdCBpbnQgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMDsKK30KKworY2xhc3MgVEFwcGxpY2F0aW9uRXJyb3IgZXh0ZW5kcyBURXJyb3IgeworICBzdGF0aWMgZmluYWwgVFN0cnVjdCBfc3RydWN0ID0gbmV3IFRTdHJ1Y3QoIlRBcHBsaWNhdGlvbkVycm9yIik7CisgIHN0YXRpYyBjb25zdCBpbnQgTUVTU0FHRSA9IDE7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX21lc3NhZ2VGaWVsZCA9CisgICAgICBuZXcgVEZpZWxkKCJtZXNzYWdlIiwgVFR5cGUuU1RSSU5HLCBNRVNTQUdFKTsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFID0gMjsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfdHlwZUZpZWxkID0gbmV3IFRGaWVsZCgidHlwZSIsIFRUeXBlLkkzMiwgVFlQRSk7CisKKyAgVEFwcGxpY2F0aW9uRXJyb3IoCisgICAgICBbaW50IHR5cGUgPSBUQXBwbGljYXRpb25FcnJvclR5cGUuVU5LTk9XTiwgU3RyaW5nIG1lc3NhZ2UgPSAiIl0pCisgICAgICA6IHN1cGVyKHR5cGUsIG1lc3NhZ2UpOworCisgIHN0YXRpYyBUQXBwbGljYXRpb25FcnJvciByZWFkKFRQcm90b2NvbCBpcHJvdCkgeworICAgIFRGaWVsZCBmaWVsZDsKKworICAgIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKKyAgICBpbnQgdHlwZSA9IFRBcHBsaWNhdGlvbkVycm9yVHlwZS5VTktOT1dOOworCisgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKworICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChmaWVsZC5pZCkgeworICAgICAgICBjYXNlIE1FU1NBR0U6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRZUEU6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgICB0eXBlID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworCisgICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FcnJvcih0eXBlLCBtZXNzYWdlKTsKKyAgfQorCisgIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeworICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oX3N0cnVjdCk7CisKKyAgICBpZiAobWVzc2FnZSAhPSBudWxsICYmICFtZXNzYWdlLmlzRW1wdHkpIHsKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfbWVzc2FnZUZpZWxkKTsKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKG1lc3NhZ2UpOworICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfdHlwZUZpZWxkKTsKKyAgICBvcHJvdC53cml0ZUkzMih0eXBlKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdF9iYXNlLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RfYmFzZS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NTcxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RfYmFzZS5kYXJ0CkBAIC0wLDAgKzEsMzcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworYWJzdHJhY3QgY2xhc3MgVEJhc2UgeworICAvLy8gUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCisgIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpOworCisgIC8vLyBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBbb3Byb3RdIHByb3RvY29sLgorICB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCk7CisKKyAgLy8vIENoZWNrIGlmIGEgZmllbGQgaXMgY3VycmVudGx5IHNldCBvciB1bnNldCwgdXNpbmcgdGhlIFtmaWVsZElkXS4KKyAgYm9vbCBpc1NldChpbnQgZmllbGRJZCk7CisKKyAgLy8vIEdldCBhIGZpZWxkJ3MgdmFsdWUgYnkgW2ZpZWxkSWRdLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluIHRoZQorICAvLy8gYXBwcm9wcmlhdGUgImJveGVkIiB0eXBlcy4KKyAgZ2V0RmllbGRWYWx1ZShpbnQgZmllbGRJZCk7CisKKyAgLy8vIFNldCBhIGZpZWxkJ3MgdmFsdWUgYnkgW2ZpZWxkSWRdLiBQcmltaXRpdmUgdHlwZXMgbXVzdCBiZSAiYm94ZWQiIGluIHRoZQorICAvLy8gYXBwcm9wcmlhdGUgb2JqZWN0IHdyYXBwZXIgdHlwZS4KKyAgc2V0RmllbGRWYWx1ZShpbnQgZmllbGRJZCwgT2JqZWN0IHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdF9lcnJvci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90X2Vycm9yLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhYjczMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9lcnJvci5kYXJ0CkBAIC0wLDAgKzEsMjcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEVycm9yIGV4dGVuZHMgRXJyb3IgeworICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKyAgZmluYWwgaW50IHR5cGU7CisKKyAgVEVycm9yKHRoaXMudHlwZSwgdGhpcy5tZXNzYWdlKTsKKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiPFRFcnJvciB0eXBlOiAkdHlwZSBtZXNzYWdlOiAnJG1lc3NhZ2UnPiI7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RfcHJvY2Vzc29yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RfcHJvY2Vzc29yLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmMjBmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9wcm9jZXNzb3IuZGFydApAQCAtMCwwICsxLDI0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHdoaWNoIG9wZXJhdGVzIHVwb24gYW4gaW5wdXQgc3RyZWFtIGFuZAorLy8vIHdyaXRlcyB0byBzb21lIG91dHB1dCBzdHJlYW0uCithYnN0cmFjdCBjbGFzcyBUUHJvY2Vzc29yIHsKKyAgYm9vbCBwcm9jZXNzKFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2J1ZmZlcmVkX3RyYW5zcG9ydC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9idWZmZXJlZF90cmFuc3BvcnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzNhMzBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9idWZmZXJlZF90cmFuc3BvcnQuZGFydApAQCAtMCwwICsxLDk4IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBCdWZmZXJlZCBpbXBsZW1lbnRhdGlvbiBvZiBbVFRyYW5zcG9ydF0uCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKyAgZmluYWwgTGlzdDxpbnQ+IF93cml0ZUJ1ZmZlciA9IFtdOworICBJdGVyYXRvcjxpbnQ+IF9yZWFkSXRlcmF0b3I7CisKKyAgVWludDhMaXN0IGNvbnN1bWVXcml0ZUJ1ZmZlcigpIHsKKyAgICBVaW50OExpc3QgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChfd3JpdGVCdWZmZXIpOworICAgIF93cml0ZUJ1ZmZlci5jbGVhcigpOworICAgIHJldHVybiBidWZmZXI7CisgIH0KKworICB2b2lkIF9zZXRSZWFkQnVmZmVyKFVpbnQ4TGlzdCByZWFkQnVmZmVyKSB7CisgICAgX3JlYWRJdGVyYXRvciA9IHJlYWRCdWZmZXIgIT0gbnVsbCA/IHJlYWRCdWZmZXIuaXRlcmF0b3IgOiBudWxsOworICB9CisKKyAgdm9pZCBfcmVzZXQoe2Jvb2wgaXNPcGVuOiBmYWxzZX0pIHsKKyAgICBfaXNPcGVuID0gaXNPcGVuOworICAgIF93cml0ZUJ1ZmZlci5jbGVhcigpOworICAgIF9yZWFkSXRlcmF0b3IgPSBudWxsOworICB9CisKKyAgYm9vbCBnZXQgaGFzUmVhZERhdGEgPT4gX3JlYWRJdGVyYXRvciAhPSBudWxsOworCisgIGJvb2wgX2lzT3BlbjsKKyAgYm9vbCBnZXQgaXNPcGVuID0+IF9pc09wZW47CisKKyAgRnV0dXJlIG9wZW4oKSBhc3luYyB7CisgICAgX3Jlc2V0KGlzT3BlbjogdHJ1ZSk7CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSBhc3luYyB7CisgICAgX3Jlc2V0KGlzT3BlbjogZmFsc2UpOworICB9CisKKyAgaW50IHJlYWQoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGlmIChidWZmZXIgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiYnVmZmVyIik7CisgICAgfQorCisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJUaGUgcmFuZ2UgZXhjZWVkcyB0aGUgYnVmZmVyIGxlbmd0aCIpOworICAgIH0KKworICAgIGlmIChfcmVhZEl0ZXJhdG9yID09IG51bGwgfHwgbGVuZ3RoIDw9IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IGxlbmd0aCAmJiBfcmVhZEl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKKyAgICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IF9yZWFkSXRlcmF0b3IuY3VycmVudDsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgICAvLyBjbGVhbnVwIGl0ZXJhdG9yIHdoZW4gd2UndmUgcmVhY2hlZCB0aGUgZW5kCisgICAgaWYgKF9yZWFkSXRlcmF0b3IuY3VycmVudCA9PSBudWxsKSB7CisgICAgICBfcmVhZEl0ZXJhdG9yID0gbnVsbDsKKyAgICB9CisKKyAgICByZXR1cm4gaTsKKyAgfQorCisgIHZvaWQgd3JpdGUoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGlmIChidWZmZXIgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiYnVmZmVyIik7CisgICAgfQorCisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJUaGUgcmFuZ2UgZXhjZWVkcyB0aGUgYnVmZmVyIGxlbmd0aCIpOworICAgIH0KKworICAgIF93cml0ZUJ1ZmZlci5hZGRBbGwoYnVmZmVyLnN1Ymxpc3Qob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpKTsKKyAgfQorCisgIEZ1dHVyZSBmbHVzaCgpIHsKKyAgICBfcmVhZEl0ZXJhdG9yID0gY29uc3VtZVdyaXRlQnVmZmVyKCkuaXRlcmF0b3I7CisKKyAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjAzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnQuZGFydApAQCAtMCwwICsxLDE2OSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gRnJhbWVkIFtUVHJhbnNwb3J0XS4KKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSBGcmFtZWQgdHJhbnNwb3J0LgorY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRCdWZmZXJlZFRyYW5zcG9ydCB7CisgIHN0YXRpYyBjb25zdCBpbnQgaGVhZGVyQnl0ZUNvdW50ID0gNDsKKworICBmaW5hbCBUVHJhbnNwb3J0IF90cmFuc3BvcnQ7CisKKyAgZmluYWwgVWludDhMaXN0IF9oZWFkZXJCeXRlcyA9IG5ldyBVaW50OExpc3QoaGVhZGVyQnl0ZUNvdW50KTsKKyAgaW50IF9yZWNlaXZlZEhlYWRlckJ5dGVzID0gMDsKKworICBpbnQgX2JvZHlTaXplID0gMDsKKyAgVWludDhMaXN0IF9ib2R5ID0gbnVsbDsKKyAgaW50IF9yZWNlaXZlZEJvZHlCeXRlcyA9IDA7CisKKyAgQ29tcGxldGVyPFVpbnQ4TGlzdD4gX2ZyYW1lQ29tcGxldGVyID0gbnVsbDsKKworICBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA6IF90cmFuc3BvcnQgPSB0cmFuc3BvcnQgeworICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgidHJhbnNwb3J0Iik7CisgICAgfQorICB9CisKKyAgYm9vbCBnZXQgaXNPcGVuID0+IF90cmFuc3BvcnQuaXNPcGVuOworCisgIEZ1dHVyZSBvcGVuKCkgeworICAgIF9yZXNldChpc09wZW46IHRydWUpOworICAgIHJldHVybiBfdHJhbnNwb3J0Lm9wZW4oKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIHsKKyAgICBfcmVzZXQoaXNPcGVuOiBmYWxzZSk7CisgICAgcmV0dXJuIF90cmFuc3BvcnQuY2xvc2UoKTsKKyAgfQorCisgIGludCByZWFkKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBpZiAoaGFzUmVhZERhdGEpIHsKKyAgICAgIGludCBnb3QgPSBzdXBlci5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgaWYgKGdvdCA+IDApIHJldHVybiBnb3Q7CisgICAgfQorCisgICAgLy8gSU1QT1JUQU5UOiBieSB0aGUgdGltZSB5b3UndmUgZ290IGhlcmUsCisgICAgLy8gYW4gZW50aXJlIGZyYW1lIGlzIGF2YWlsYWJsZSBmb3IgcmVhZGluZworCisgICAgcmV0dXJuIHN1cGVyLnJlYWQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIF9yZWFkRnJhbWUoKSB7CisgICAgaWYgKF9ib2R5ID09IG51bGwpIHsKKyAgICAgIGJvb2wgZ290RnVsbEhlYWRlciA9IF9yZWFkRnJhbWVIZWFkZXIoKTsKKyAgICAgIGlmICghZ290RnVsbEhlYWRlcikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgX3JlYWRGcmFtZUJvZHkoKTsKKyAgfQorCisgIGJvb2wgX3JlYWRGcmFtZUhlYWRlcigpIHsKKyAgICB2YXIgcmVtYWluaW5nSGVhZGVyQnl0ZXMgPSBoZWFkZXJCeXRlQ291bnQgLSBfcmVjZWl2ZWRIZWFkZXJCeXRlczsKKworICAgIGludCBnb3QgPSBfdHJhbnNwb3J0LnJlYWQoX2hlYWRlckJ5dGVzLCBfcmVjZWl2ZWRIZWFkZXJCeXRlcywgcmVtYWluaW5nSGVhZGVyQnl0ZXMpOworICAgIGlmIChnb3QgPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKAorICAgICAgICAgIFRUcmFuc3BvcnRFcnJvclR5cGUuVU5LTk9XTiwgIlNvY2tldCBjbG9zZWQgZHVyaW5nIGZyYW1lIGhlYWRlciByZWFkIik7CisgICAgfQorCisgICAgX3JlY2VpdmVkSGVhZGVyQnl0ZXMgKz0gZ290OworCisgICAgaWYgKF9yZWNlaXZlZEhlYWRlckJ5dGVzID09IGhlYWRlckJ5dGVDb3VudCkgeworICAgICAgaW50IHNpemUgPSBfaGVhZGVyQnl0ZXMuYnVmZmVyLmFzQnl0ZURhdGEoKS5nZXRVaW50MzIoMCk7CisKKyAgICAgIF9yZWNlaXZlZEhlYWRlckJ5dGVzID0gMDsKKworICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCisgICAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLlVOS05PV04sICJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZTogJHNpemUiKTsKKyAgICAgIH0KKworICAgICAgX2JvZHlTaXplID0gc2l6ZTsKKyAgICAgIF9ib2R5ID0gbmV3IFVpbnQ4TGlzdChfYm9keVNpemUpOworICAgICAgX3JlY2VpdmVkQm9keUJ5dGVzID0gMDsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIF9yZWdpc3RlckZvclJlYWRhYmxlQnl0ZXMoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICB2b2lkIF9yZWFkRnJhbWVCb2R5KCkgeworICAgIHZhciByZW1haW5pbmdCb2R5Qnl0ZXMgPSBfYm9keVNpemUgLSBfcmVjZWl2ZWRCb2R5Qnl0ZXM7CisKKyAgICBpbnQgZ290ID0gX3RyYW5zcG9ydC5yZWFkKF9ib2R5LCBfcmVjZWl2ZWRCb2R5Qnl0ZXMsIHJlbWFpbmluZ0JvZHlCeXRlcyk7CisgICAgaWYgKGdvdCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCisgICAgICAgICAgVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLCAiU29ja2V0IGNsb3NlZCBkdXJpbmcgZnJhbWUgYm9keSByZWFkIik7CisgICAgfQorCisgICAgX3JlY2VpdmVkQm9keUJ5dGVzICs9IGdvdDsKKworICAgIGlmIChfcmVjZWl2ZWRCb2R5Qnl0ZXMgPT0gX2JvZHlTaXplKSB7CisgICAgICB2YXIgYm9keSA9IF9ib2R5OworCisgICAgICBfYm9keVNpemUgPSAwOworICAgICAgX2JvZHkgPSBudWxsOworICAgICAgX3JlY2VpdmVkQm9keUJ5dGVzID0gMDsKKworICAgICAgX3NldFJlYWRCdWZmZXIoYm9keSk7CisKKyAgICAgIHZhciBjb21wbGV0ZXIgPSBfZnJhbWVDb21wbGV0ZXI7CisgICAgICBfZnJhbWVDb21wbGV0ZXIgPSBudWxsOworICAgICAgY29tcGxldGVyLmNvbXBsZXRlKG5ldyBVaW50OExpc3QoMCkpOworICAgIH0gZWxzZSB7CisgICAgICBfcmVnaXN0ZXJGb3JSZWFkYWJsZUJ5dGVzKCk7CisgICAgfQorICB9CisKKyAgRnV0dXJlIGZsdXNoKCkgeworICAgIGlmIChfZnJhbWVDb21wbGV0ZXIgPT0gbnVsbCkgeworICAgICAgVWludDhMaXN0IGJ1ZmZlciA9IGNvbnN1bWVXcml0ZUJ1ZmZlcigpOworICAgICAgaW50IGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7CisKKyAgICAgIF9oZWFkZXJCeXRlcy5idWZmZXIuYXNCeXRlRGF0YSgpLnNldFVpbnQzMigwLCBsZW5ndGgpOworICAgICAgX3RyYW5zcG9ydC53cml0ZShfaGVhZGVyQnl0ZXMsIDAsIGhlYWRlckJ5dGVDb3VudCk7CisgICAgICBfdHJhbnNwb3J0LndyaXRlKGJ1ZmZlciwgMCwgbGVuZ3RoKTsKKworICAgICAgX2ZyYW1lQ29tcGxldGVyICA9IG5ldyBDb21wbGV0ZXI8VWludDhMaXN0PigpOworICAgICAgX3JlZ2lzdGVyRm9yUmVhZGFibGVCeXRlcygpOworICAgIH0KKworICAgIHJldHVybiBfZnJhbWVDb21wbGV0ZXIuZnV0dXJlOworICB9CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JSZWFkYWJsZUJ5dGVzKCkgeworICAgIF90cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICBfcmVhZEZyYW1lKCk7CisgICAgfSkuY2F0Y2hFcnJvcigoZSkgeworICAgICAgdmFyIGNvbXBsZXRlciA9IF9mcmFtZUNvbXBsZXRlcjsKKworICAgICAgX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPSAwOworICAgICAgX2JvZHlTaXplID0gMDsKKyAgICAgIF9ib2R5ID0gbnVsbDsKKyAgICAgIF9yZWNlaXZlZEJvZHlCeXRlcyA9IDA7CisgICAgICBfZnJhbWVDb21wbGV0ZXIgPSBudWxsOworCisgICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihlKTsKKyAgICB9KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMDIxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0LmRhcnQKQEAgLTAsMCArMSw5OSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiBbVFRyYW5zcG9ydF0uCisvLy8KKy8vLyBGb3IgZXhhbXBsZToKKy8vLworLy8vICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KG5ldyBCcm93c2VyQ2xpZW50KCksCisvLy8gICAgICAgICBuZXcgVEh0dHBDb25maWcodXJsLCB7J1gtTXktQ3VzdG9tLUhlYWRlcic6ICdteSB2YWx1ZSd9KSk7CisvLy8gICAgIHZhciBwcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCk7CisvLy8gICAgIHZhciBjbGllbnQgPSBuZXcgTXlUaHJpZnRTZXJ2aWNlQ2xpZW50KHByb3RvY29sKTsKKy8vLyAgICAgdmFyIHJlc3VsdCA9IGNsaWVudC5teU1ldGhvZCgpOworLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBKUyBYSFIgSFRUUCB0cmFuc3BvcnQuCitjbGFzcyBUSHR0cENsaWVudFRyYW5zcG9ydCBleHRlbmRzIFRCdWZmZXJlZFRyYW5zcG9ydCB7CisgIGZpbmFsIENsaWVudCBodHRwQ2xpZW50OworICBmaW5hbCBUSHR0cENvbmZpZyBjb25maWc7CisKKyAgVEh0dHBDbGllbnRUcmFuc3BvcnQodGhpcy5odHRwQ2xpZW50LCB0aGlzLmNvbmZpZykgeworICAgIGlmIChodHRwQ2xpZW50ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoImh0dHBDbGllbnQiKTsKKyAgICB9CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSBhc3luYyB7CisgICAgX3Jlc2V0KGlzT3BlbjogZmFsc2UpOworICAgIGh0dHBDbGllbnQuY2xvc2UoKTsKKyAgfQorCisgIEZ1dHVyZSBmbHVzaCgpIHsKKyAgICB2YXIgcmVxdWVzdEJvZHkgPSBiYXNlNjQuZW5jb2RlKGNvbnN1bWVXcml0ZUJ1ZmZlcigpKTsKKworICAgIC8vIFVzZSBhIHN5bmMgY29tcGxldGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgY2FuIGJlIHJlYWQgaW1tZWRpYXRlbHkKKyAgICAvLyBhZnRlciB0aGUgcmVhZCBidWZmZXIgaXMgc2V0LCBhbmQgYXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBhbm90aGVyCisgICAgLy8gcmVzcG9uc2UgY291bGQgb3ZlcndyaXRlIHRoZSByZWFkIGJ1ZmZlci4KKyAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlci5zeW5jKCk7CisKKyAgICBodHRwQ2xpZW50CisgICAgICAgIC5wb3N0KGNvbmZpZy51cmwsIGhlYWRlcnM6IGNvbmZpZy5oZWFkZXJzLCBib2R5OiByZXF1ZXN0Qm9keSkKKyAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CisgICAgICBVaW50OExpc3QgZGF0YTsKKyAgICAgIHRyeSB7CisgICAgICAgIGRhdGEgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KGJhc2U2NC5kZWNvZGUocmVzcG9uc2UuYm9keSkpOworICAgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKF8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiRXhwZWN0ZWQgYSBCYXNlIDY0IGVuY29kZWQgc3RyaW5nLiIpOworICAgICAgfQorCisgICAgICBfc2V0UmVhZEJ1ZmZlcihkYXRhKTsKKyAgICAgIGNvbXBsZXRlci5jb21wbGV0ZSgpOworICAgIH0pOworCisgICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CisgIH0KK30KKworY2xhc3MgVEh0dHBDb25maWcgeworICBmaW5hbCBVcmkgdXJsOworCisgIE1hcDxTdHJpbmcsIFN0cmluZz4gX2hlYWRlcnM7CisgIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0IGhlYWRlcnMgPT4gX2hlYWRlcnM7CisKKyAgVEh0dHBDb25maWcodGhpcy51cmwsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgeworICAgIGlmICh1cmwgPT0gbnVsbCB8fCAhdXJsLmhhc0F1dGhvcml0eSkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgdXJsIik7CisgICAgfQorCisgICAgX2luaXRIZWFkZXJzKGhlYWRlcnMpOworICB9CisKKyAgdm9pZCBfaW5pdEhlYWRlcnMoTWFwPFN0cmluZywgU3RyaW5nPiBpbml0aWFsKSB7CisgICAgdmFyIGggPSB7fTsKKworICAgIGlmIChpbml0aWFsICE9IG51bGwpIHsKKyAgICAgIGguYWRkQWxsKGluaXRpYWwpOworICAgIH0KKworICAgIGhbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JzsKKyAgICBoWydBY2NlcHQnXSA9ICdhcHBsaWNhdGlvbi94LXRocmlmdCc7CisKKyAgICBfaGVhZGVycyA9IG5ldyBNYXAudW5tb2RpZmlhYmxlKGgpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X21lc3NhZ2VfcmVhZGVyLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X21lc3NhZ2VfcmVhZGVyLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhMDcwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfbWVzc2FnZV9yZWFkZXIuZGFydApAQCAtMCwwICsxLDk5IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBbVE1lc3NhZ2VSZWFkZXJdIGV4dHJhY3RzIGEgW1RNZXNzYWdlXSBmcm9tIGJ5dGVzLiAgVGhpcyBpcyB1c2VkIHRvIGFsbG93IGEKKy8vLyB0cmFuc3BvcnQgdG8gaW5zcGVjdCB0aGUgbWVzc2FnZSBzZXFpZCBhbmQgbWFwIHJlc3BvbnNlcyB0byByZXF1ZXN0cy4KK2NsYXNzIFRNZXNzYWdlUmVhZGVyIHsKKyAgZmluYWwgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnk7CisKKyAgZmluYWwgaW50IGJ5dGVPZmZzZXQ7CisgIGZpbmFsIF9UTWVzc2FnZVJlYWRlclRyYW5zcG9ydCBfdHJhbnNwb3J0OworCisgIC8vLyBDb25zdHJ1Y3QgYSBbTWVzc2FnZVJlYWRlcl0uICBUaGUgb3B0aW9uYWwgW2J5dGVPZmZzZXRdIHNwZWNpZmllcyB0aGUKKyAgLy8vIG51bWJlciBvZiBieXRlcyB0byBza2lwIGJlZm9yZSByZWFkaW5nIHRoZSBbVE1lc3NhZ2VdLgorICBUTWVzc2FnZVJlYWRlcih0aGlzLnByb3RvY29sRmFjdG9yeSwge2ludCBieXRlT2Zmc2V0OiAwfSkKKyAgICAgIDogX3RyYW5zcG9ydCA9IG5ldyBfVE1lc3NhZ2VSZWFkZXJUcmFuc3BvcnQoKSwKKyAgICAgICAgdGhpcy5ieXRlT2Zmc2V0ID0gYnl0ZU9mZnNldDsKKworICBUTWVzc2FnZSByZWFkTWVzc2FnZShVaW50OExpc3QgYnl0ZXMpIHsKKyAgICBfdHJhbnNwb3J0LnJlc2V0KGJ5dGVzLCBieXRlT2Zmc2V0KTsKKyAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woX3RyYW5zcG9ydCk7CisgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICBfdHJhbnNwb3J0LnJlc2V0KG51bGwpOworCisgICAgcmV0dXJuIG1lc3NhZ2U7CisgIH0KK30KKworLy8vIEFuIGludGVybmFsIGNsYXNzIHVzZWQgdG8gc3VwcG9ydCBbVE1lc3NhZ2VSZWFkZXJdLgorY2xhc3MgX1RNZXNzYWdlUmVhZGVyVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisgIF9UTWVzc2FnZVJlYWRlclRyYW5zcG9ydCgpOworCisgIEl0ZXJhdG9yPGludD4gX3JlYWRJdGVyYXRvcjsKKworICB2b2lkIHJlc2V0KFVpbnQ4TGlzdCBieXRlcywgW2ludCBvZmZzZXQgPSAwXSkgeworICAgIGlmIChieXRlcyA9PSBudWxsKSB7CisgICAgICBfcmVhZEl0ZXJhdG9yID0gbnVsbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ID4gYnl0ZXMubGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiVGhlIG9mZnNldCBleGNlZWRzIHRoZSBieXRlcyBsZW5ndGgiKTsKKyAgICB9CisKKyAgICBfcmVhZEl0ZXJhdG9yID0gYnl0ZXMuaXRlcmF0b3I7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9mZnNldDsgaSsrKSB7CisgICAgICBfcmVhZEl0ZXJhdG9yLm1vdmVOZXh0KCk7CisgICAgfQorICB9CisKKyAgZ2V0IGlzT3BlbiA9PiB0cnVlOworCisgIEZ1dHVyZSBvcGVuKCkgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIGluIE1lc3NhZ2VSZWFkZXIiKTsKKworICBGdXR1cmUgY2xvc2UoKSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgaW4gTWVzc2FnZVJlYWRlciIpOworCisgIGludCByZWFkKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoImJ1ZmZlciIpOworICAgIH0KKworICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBidWZmZXIubGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiVGhlIHJhbmdlIGV4Y2VlZHMgdGhlIGJ1ZmZlciBsZW5ndGgiKTsKKyAgICB9CisKKyAgICBpZiAoX3JlYWRJdGVyYXRvciA9PSBudWxsIHx8IGxlbmd0aCA8PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBsZW5ndGggJiYgX3JlYWRJdGVyYXRvci5tb3ZlTmV4dCgpKSB7CisgICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSBfcmVhZEl0ZXJhdG9yLmN1cnJlbnQ7CisgICAgICBpKys7CisgICAgfQorCisgICAgcmV0dXJuIGk7CisgIH0KKworICB2b2lkIHdyaXRlKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpID0+CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgaW4gTWVzc2FnZVJlYWRlciIpOworCisgIEZ1dHVyZSBmbHVzaCgpID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbnN1cHBvcnRlZCBpbiBNZXNzYWdlUmVhZGVyIik7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmViNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXQuZGFydApAQCAtMCwwICsxLDM4IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2VudW0gVFNvY2tldFN0YXRlIHsgQ0xPU0VELCBPUEVOIH0KKworYWJzdHJhY3QgY2xhc3MgVFNvY2tldCB7CisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlOworCisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yOworCisgIFN0cmVhbTxVaW50OExpc3Q+IGdldCBvbk1lc3NhZ2U7CisKKyAgYm9vbCBnZXQgaXNPcGVuOworCisgIGJvb2wgZ2V0IGlzQ2xvc2VkOworCisgIEZ1dHVyZSBvcGVuKCk7CisKKyAgRnV0dXJlIGNsb3NlKCk7CisKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3Rfc29ja2V0X3RyYW5zcG9ydC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxMzc0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3Rfc29ja2V0X3RyYW5zcG9ydC5kYXJ0CkBAIC0wLDAgKzEsMTc3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgW1RUcmFuc3BvcnRdLgorLy8vCisvLy8gRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUQ2xpZW50U29ja2V0VHJhbnNwb3J0KG5ldyBUV2ViU29ja2V0KHVybCkpOworLy8vICAgICB2YXIgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisvLy8gICAgIHZhciBjbGllbnQgPSBuZXcgTXlUaHJpZnRTZXJ2aWNlQ2xpZW50KHByb3RvY29sKTsKKy8vLyAgICAgdmFyIHJlc3VsdCA9IGNsaWVudC5teU1ldGhvZCgpOworLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBKUyBXZWJTb2NrZXQgdHJhbnNwb3J0LgorYWJzdHJhY3QgY2xhc3MgVFNvY2tldFRyYW5zcG9ydCBleHRlbmRzIFRCdWZmZXJlZFRyYW5zcG9ydCB7CisgIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBuZXcgTG9nZ2VyKCd0aHJpZnQuVFNvY2tldFRyYW5zcG9ydCcpOworCisgIGZpbmFsIFRTb2NrZXQgc29ja2V0OworCisgIC8vLyBBIHRyYW5zcG9ydCB1c2luZyB0aGUgcHJvdmlkZWQgW3NvY2tldF0uCisgIFRTb2NrZXRUcmFuc3BvcnQodGhpcy5zb2NrZXQpIHsKKyAgICBpZiAoc29ja2V0ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoJ3NvY2tldCcpOworICAgIH0KKworICAgIHNvY2tldC5vbkVycm9yLmxpc3RlbigoZSkgPT4gbG9nZ2VyLndhcm5pbmcoZSkpOworICAgIHNvY2tldC5vbk1lc3NhZ2UubGlzdGVuKGhhbmRsZUluY29taW5nTWVzc2FnZSk7CisgIH0KKworICBib29sIGdldCBpc09wZW4gPT4gc29ja2V0LmlzT3BlbjsKKworICBGdXR1cmUgb3BlbigpIHsKKyAgICBfcmVzZXQoaXNPcGVuOiB0cnVlKTsKKyAgICByZXR1cm4gc29ja2V0Lm9wZW4oKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIHsKKyAgICBfcmVzZXQoaXNPcGVuOiBmYWxzZSk7CisgICAgcmV0dXJuIHNvY2tldC5jbG9zZSgpOworICB9CisKKyAgLy8vIE1ha2UgYW4gaW5jb21pbmcgbWVzc2FnZSBhdmFpbGFibGUgdG8gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQuCisgIHZvaWQgaGFuZGxlSW5jb21pbmdNZXNzYWdlKFVpbnQ4TGlzdCBtZXNzYWdlQnl0ZXMpIHsKKyAgICBfc2V0UmVhZEJ1ZmZlcihtZXNzYWdlQnl0ZXMpOworICB9Cit9CisKKy8vLyBbVENsaWVudFNvY2tldFRyYW5zcG9ydF0gaXMgYSBiYXNpYyBjbGllbnQgc29ja2V0IHRyYW5zcG9ydC4gIEl0IHNlbmRzCisvLy8gb3V0Z29pbmcgbWVzc2FnZXMgYW5kIGV4cGVjdHMgYSByZXNwb25zZS4KKy8vLworLy8vIE5PVEU6IFRoaXMgdHJhbnNwb3J0IGV4cGVjdHMgYSBzaW5nbGUgdGhyZWFkZWQgc2VydmVyLCBhcyBpdCB3aWxsIHByb2Nlc3MKKy8vLyByZXNwb25zZXMgaW4gRklGTyBvcmRlci4KK2NsYXNzIFRDbGllbnRTb2NrZXRUcmFuc3BvcnQgZXh0ZW5kcyBUU29ja2V0VHJhbnNwb3J0IHsKKyAgZmluYWwgTGlzdDxDb21wbGV0ZXI8VWludDhMaXN0Pj4gX2NvbXBsZXRlcnMgPSBbXTsKKworICBUQ2xpZW50U29ja2V0VHJhbnNwb3J0KFRTb2NrZXQgc29ja2V0KSA6IHN1cGVyKHNvY2tldCk7CisKKyAgRnV0dXJlIGZsdXNoKCkgeworICAgIFVpbnQ4TGlzdCBieXRlcyA9IGNvbnN1bWVXcml0ZUJ1ZmZlcigpOworCisgICAgLy8gVXNlIGEgc3luYyBjb21wbGV0ZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBjYW4gYmUgcmVhZCBpbW1lZGlhdGVseQorICAgIC8vIGFmdGVyIHRoZSByZWFkIGJ1ZmZlciBpcyBzZXQsIGFuZCBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGFub3RoZXIKKyAgICAvLyByZXNwb25zZSBjb3VsZCBvdmVyd3JpdGUgdGhlIHJlYWQgYnVmZmVyLgorICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFVpbnQ4TGlzdD4uc3luYygpOworICAgIF9jb21wbGV0ZXJzLmFkZChjb21wbGV0ZXIpOworCisgICAgaWYgKGJ5dGVzLmxlbmd0aEluQnl0ZXMgPiAwKSB7CisgICAgICBzb2NrZXQuc2VuZChieXRlcyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CisgIH0KKworICB2b2lkIGhhbmRsZUluY29taW5nTWVzc2FnZShVaW50OExpc3QgbWVzc2FnZUJ5dGVzKSB7CisgICAgc3VwZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlKG1lc3NhZ2VCeXRlcyk7CisKKyAgICBpZiAoX2NvbXBsZXRlcnMuaXNOb3RFbXB0eSkgeworICAgICAgdmFyIGNvbXBsZXRlciA9IF9jb21wbGV0ZXJzLnJlbW92ZUF0KDApOworICAgICAgY29tcGxldGVyLmNvbXBsZXRlKCk7CisgICAgfQorICB9Cit9CisKKy8vLyBbVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0XSBzZW5kcyBvdXRnb2luZyBtZXNzYWdlcyBhbmQgZXhwZWN0cyBhbgorLy8vIGFzeW5jaHJvbm91cyByZXNwb25zZS4KKy8vLworLy8vIE5PVEU6IFRoaXMgdHJhbnNwb3J0IHVzZXMgYSBbTWVzc2FnZVJlYWRlcl0gdG8gcmVhZCBhIFtUTWVzc2FnZV0gd2hlbiBhbgorLy8vIGluY29taW5nIG1lc3NhZ2UgYXJyaXZlcyB0byBjb3JyZWxhdGUgYSByZXNwb25zZSB0byBhIHJlcXVlc3QsIHVzaW5nIHRoZQorLy8vIHNlcWlkLgorY2xhc3MgVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0IGV4dGVuZHMgVFNvY2tldFRyYW5zcG9ydCB7CisgIHN0YXRpYyBjb25zdCBkZWZhdWx0VGltZW91dCA9IGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDMwKTsKKworICBmaW5hbCBNYXA8aW50LCBDb21wbGV0ZXI8VWludDhMaXN0Pj4gX2NvbXBsZXRlcnMgPSB7fTsKKworICBmaW5hbCBUTWVzc2FnZVJlYWRlciBtZXNzYWdlUmVhZGVyOworCisgIGZpbmFsIER1cmF0aW9uIHJlc3BvbnNlVGltZW91dDsKKworICBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoVFNvY2tldCBzb2NrZXQsIFRNZXNzYWdlUmVhZGVyIG1lc3NhZ2VSZWFkZXIsCisgICAgICB7RHVyYXRpb24gcmVzcG9uc2VUaW1lb3V0OiBkZWZhdWx0VGltZW91dH0pCisgICAgICA6IHRoaXMubWVzc2FnZVJlYWRlciA9IG1lc3NhZ2VSZWFkZXIsCisgICAgICAgIHRoaXMucmVzcG9uc2VUaW1lb3V0ID0gcmVzcG9uc2VUaW1lb3V0LAorICAgICAgICBzdXBlcihzb2NrZXQpOworCisgIEZ1dHVyZSBmbHVzaCgpIHsKKyAgICBVaW50OExpc3QgYnl0ZXMgPSBjb25zdW1lV3JpdGVCdWZmZXIoKTsKKyAgICBUTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZVJlYWRlci5yZWFkTWVzc2FnZShieXRlcyk7CisgICAgaW50IHNlcWlkID0gbWVzc2FnZS5zZXFpZDsKKworICAgIC8vIFVzZSBhIHN5bmMgY29tcGxldGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgY2FuIGJlIHJlYWQgaW1tZWRpYXRlbHkKKyAgICAvLyBhZnRlciB0aGUgcmVhZCBidWZmZXIgaXMgc2V0LCBhbmQgYXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBhbm90aGVyCisgICAgLy8gcmVzcG9uc2UgY291bGQgb3ZlcndyaXRlIHRoZSByZWFkIGJ1ZmZlci4KKyAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxVaW50OExpc3Q+LnN5bmMoKTsKKyAgICBfY29tcGxldGVyc1tzZXFpZF0gPSBjb21wbGV0ZXI7CisKKyAgICBpZiAocmVzcG9uc2VUaW1lb3V0ICE9IG51bGwpIHsKKyAgICAgIG5ldyBGdXR1cmUuZGVsYXllZChyZXNwb25zZVRpbWVvdXQsICgpIHsKKyAgICAgICAgdmFyIGNvbXBsZXRlciA9IF9jb21wbGV0ZXJzLnJlbW92ZShzZXFpZCk7CisgICAgICAgIGlmIChjb21wbGV0ZXIgIT0gbnVsbCkgeworICAgICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKAorICAgICAgICAgICAgICBuZXcgVGltZW91dEV4Y2VwdGlvbigiUmVzcG9uc2UgdGltZWQgb3V0LiIsIHJlc3BvbnNlVGltZW91dCkpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisKKyAgICBzb2NrZXQuc2VuZChieXRlcyk7CisKKyAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKKyAgfQorCisgIHZvaWQgaGFuZGxlSW5jb21pbmdNZXNzYWdlKFVpbnQ4TGlzdCBtZXNzYWdlQnl0ZXMpIHsKKyAgICBzdXBlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2UobWVzc2FnZUJ5dGVzKTsKKworICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlUmVhZGVyLnJlYWRNZXNzYWdlKG1lc3NhZ2VCeXRlcyk7CisgICAgdmFyIGNvbXBsZXRlciA9IF9jb21wbGV0ZXJzLnJlbW92ZShtZXNzYWdlLnNlcWlkKTsKKyAgICBpZiAoY29tcGxldGVyICE9IG51bGwpIHsKKyAgICAgIGNvbXBsZXRlci5jb21wbGV0ZSgpOworICAgIH0KKyAgfQorfQorCisvLy8gW1RTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRdIGxpc3RlbnMgZm9yIGluY29taW5nIG1lc3NhZ2VzLiAgV2hlbiBpdCBzZW5kcyBhCisvLy8gcmVzcG9uc2UsIGl0IGRvZXMgbm90IGV4cGVjdCBhbiBhY2tub3dsZWRnZW1lbnQuCitjbGFzcyBUU2VydmVyU29ja2V0VHJhbnNwb3J0IGV4dGVuZHMgVFNvY2tldFRyYW5zcG9ydCB7CisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXIgX29uSW5jb21pbmdNZXNzYWdlQ29udHJvbGxlcjsKKyAgU3RyZWFtIGdldCBvbkluY29taW5nTWVzc2FnZSA9PiBfb25JbmNvbWluZ01lc3NhZ2VDb250cm9sbGVyLnN0cmVhbTsKKworICBUU2VydmVyU29ja2V0VHJhbnNwb3J0KFRTb2NrZXQgc29ja2V0KQorICAgICAgOiBfb25JbmNvbWluZ01lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIHN1cGVyKHNvY2tldCk7CisKKyAgRnV0dXJlIGZsdXNoKCkgYXN5bmMgeworICAgIFVpbnQ4TGlzdCBtZXNzYWdlID0gY29uc3VtZVdyaXRlQnVmZmVyKCk7CisgICAgc29ja2V0LnNlbmQobWVzc2FnZSk7CisgIH0KKworICB2b2lkIGhhbmRsZUluY29taW5nTWVzc2FnZShVaW50OExpc3QgbWVzc2FnZUJ5dGVzKSB7CisgICAgc3VwZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlKG1lc3NhZ2VCeXRlcyk7CisKKyAgICBfb25JbmNvbWluZ01lc3NhZ2VDb250cm9sbGVyLmFkZChudWxsKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzZDVlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0LmRhcnQKQEAgLTAsMCArMSw3MCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCithYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0IHsKKyAgLy8vIFF1ZXJpZXMgd2hldGhlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCisgIC8vLyBSZXR1cm5zIFt0cnVlXSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCisgIGJvb2wgZ2V0IGlzT3BlbjsKKworICAvLy8gT3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nLgorICAvLy8gVGhyb3dzIFtUVHJhbnNwb3J0RXJyb3JdIGlmIHRoZSB0cmFuc3BvcnQgY291bGQgbm90IGJlIG9wZW5lZC4KKyAgRnV0dXJlIG9wZW4oKTsKKworICAvLy8gQ2xvc2VzIHRoZSB0cmFuc3BvcnQuCisgIEZ1dHVyZSBjbG9zZSgpOworCisgIC8vLyBSZWFkcyB1cCB0byBbbGVuZ3RoXSBieXRlcyBpbnRvIFtidWZmZXJdLCBzdGFydGluZyBhdCBbb2Zmc2V0XS4KKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLgorICAvLy8gVGhyb3dzIFtUVHJhbnNwb3J0RXJyb3JdIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKKyAgaW50IHJlYWQoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisKKyAgLy8vIEd1YXJhbnRlZXMgdGhhdCBhbGwgb2YgW2xlbmd0aF0gYnl0ZXMgYXJlIGFjdHVhbGx5IHJlYWQgb2ZmIHRoZSB0cmFuc3BvcnQuCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCwgd2hpY2ggbXVzdCBiZSBlcXVhbCB0bworICAvLy8gW2xlbmd0aF0uCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQorICBpbnQgcmVhZEFsbChVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaW50IGdvdCA9IDA7CisgICAgaW50IHJldCA9IDA7CisgICAgd2hpbGUgKGdvdCA8IGxlbmd0aCkgeworICAgICAgcmV0ID0gcmVhZChidWZmZXIsIG9mZnNldCArIGdvdCwgbGVuZ3RoIC0gZ290KTsKKyAgICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKAorICAgICAgICAgICAgVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLAorICAgICAgICAgICAgIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiBUcmllZCB0byByZWFkICRsZW5ndGggIgorICAgICAgICAgICAgImJ5dGVzLCBidXQgb25seSBnb3QgJGdvdCBieXRlcy4iKTsKKyAgICAgIH0KKyAgICAgIGdvdCArPSByZXQ7CisgICAgfQorICAgIHJldHVybiBnb3Q7CisgIH0KKworICAvLy8gV3JpdGVzIHVwIHRvIFtsZW5dIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlci4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyBkYXRhCisgIHZvaWQgd3JpdGUoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisKKyAgLy8vIFdyaXRlcyB0aGUgW2J5dGVzXSB0byB0aGUgb3V0cHV0LgorICAvLy8gVGhyb3dzIFtUVHJhbnNwb3J0RXJyb3JdIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIGRhdGEKKyAgdm9pZCB3cml0ZUFsbChVaW50OExpc3QgYnVmZmVyKSB7CisgICAgd3JpdGUoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKKyAgfQorCisgIC8vLyBGbHVzaCBhbnkgcGVuZGluZyBkYXRhIG91dCBvZiBhIHRyYW5zcG9ydCBidWZmZXIuCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgb3V0IGRhdGEuCisgIEZ1dHVyZSBmbHVzaCgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZXJyb3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2Vycm9yLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1MDhlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2Vycm9yLmRhcnQKQEAgLTAsMCArMSwzMSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUVHJhbnNwb3J0RXJyb3JUeXBlIHsKKyAgc3RhdGljIGNvbnN0IGludCBVTktOT1dOID0gMDsKKyAgc3RhdGljIGNvbnN0IGludCBOT1RfT1BFTiA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQgQUxSRUFEWV9PUEVOID0gMjsKKyAgc3RhdGljIGNvbnN0IGludCBUSU1FRF9PVVQgPSAzOworICBzdGF0aWMgY29uc3QgaW50IEVORF9PRl9GSUxFID0gNDsKK30KKworY2xhc3MgVFRyYW5zcG9ydEVycm9yIGV4dGVuZHMgVEVycm9yIHsKKyAgVFRyYW5zcG9ydEVycm9yKFtpbnQgdHlwZSA9IFRUcmFuc3BvcnRFcnJvclR5cGUuVU5LTk9XTiwgU3RyaW5nIG1lc3NhZ2UgPSAiIl0pCisgICAgICA6IHN1cGVyKHR5cGUsIG1lc3NhZ2UpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZmFjdG9yeS5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZmFjdG9yeS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMTA0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9mYWN0b3J5LmRhcnQKQEAgLTAsMCArMSwyNyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIGEgW1RUcmFuc3BvcnRdLiBUaGlzIGlzCisvLy8gdXNlZCBwcmltYXJpbHkgaW4gc2VydmVycy4KKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkgeworICBGdXR1cmU8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA9PgorICAgICAgbmV3IEZ1dHVyZS52YWx1ZSh0cmFuc3BvcnQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3RocmlmdC5kYXJ0IGIvbGliL2RhcnQvbGliL3RocmlmdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjlkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvdGhyaWZ0LmRhcnQKQEAgLTAsMCArMSw2NSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgVXRmOENvZGVjOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgQnl0ZURhdGE7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTpkYXJ0Ml9jb25zdGFudC9jb252ZXJ0LmRhcnQnIHNob3cgYmFzZTY0OworaW1wb3J0ICdwYWNrYWdlOmRhcnQyX2NvbnN0YW50L3R5cGVkX2RhdGEuZGFydCcgc2hvdyBFbmRpYW5uZXNzOworaW1wb3J0ICdwYWNrYWdlOmZpeG51bS9maXhudW0uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIHNob3cgQ2xpZW50OworaW1wb3J0ICdwYWNrYWdlOmxvZ2dpbmcvbG9nZ2luZy5kYXJ0JzsKKworcGFydCAnc3JjL3RfYXBwbGljYXRpb25fZXJyb3IuZGFydCc7CitwYXJ0ICdzcmMvdF9iYXNlLmRhcnQnOworcGFydCAnc3JjL3RfZXJyb3IuZGFydCc7CitwYXJ0ICdzcmMvdF9wcm9jZXNzb3IuZGFydCc7CisKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2JpbmFyeV9wcm90b2NvbC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2NvbXBhY3RfcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9maWVsZC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2pzb25fcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9saXN0LmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfbWFwLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfbWVzc2FnZS5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X211bHRpcGxleGVkX3Byb3RvY29sLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9kZWNvcmF0b3IuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9lcnJvci5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2ZhY3RvcnkuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbF91dGlsLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3Rfc2V0LmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3Rfc3RydWN0LmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfdHlwZS5kYXJ0JzsKKworcGFydCAnc3JjL3NlcmlhbGl6ZXIvdF9kZXNlcmlhbGl6ZXIuZGFydCc7CitwYXJ0ICdzcmMvc2VyaWFsaXplci90X3NlcmlhbGl6ZXIuZGFydCc7CisKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9idWZmZXJlZF90cmFuc3BvcnQuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydC5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydC5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9tZXNzYWdlX3JlYWRlci5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9zb2NrZXQuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0LmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9lcnJvci5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZmFjdG9yeS5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0LmRhcnQnOwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3RocmlmdF9icm93c2VyLmRhcnQgYi9saWIvZGFydC9saWIvdGhyaWZ0X2Jyb3dzZXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWJjMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3RocmlmdF9icm93c2VyLmRhcnQKQEAgLTAsMCArMSwyMiBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0X2Jyb3dzZXI7CisKKy8vLyBDbGFzc2VzIHRoYXQgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGJyb3dzZXIgYXBwbGljYXRpb25zIGdvIGhlcmUKKworZXhwb3J0ICdzcmMvYnJvd3Nlci90X3dlYl9zb2NrZXQuZGFydCcgc2hvdyBUV2ViU29ja2V0OwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3RocmlmdF9jb25zb2xlLmRhcnQgYi9saWIvZGFydC9saWIvdGhyaWZ0X2NvbnNvbGUuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGE4M2QxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3RocmlmdF9jb25zb2xlLmRhcnQKQEAgLTAsMCArMSwyMyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0X2NvbnNvbGU7CisKKy8vLyBDbGFzc2VzIHRoYXQgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGNvbnNvbGUgYXBwbGljYXRpb25zIGdvIGhlcmUKKworZXhwb3J0ICdzcmMvY29uc29sZS90X3RjcF9zb2NrZXQuZGFydCcgc2hvdyBUVGNwU29ja2V0OworZXhwb3J0ICdzcmMvY29uc29sZS90X3dlYl9zb2NrZXQuZGFydCcgc2hvdyBUV2ViU29ja2V0OwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvcHVic3BlYy55YW1sIGIvbGliL2RhcnQvcHVic3BlYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MDZiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSwzOCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0aHJpZnQKK3ZlcnNpb246IDAuMTMuMAorZGVzY3JpcHRpb246ID4KKyAgQSBEYXJ0IGxpYnJhcnkgZm9yIEFwYWNoZSBUaHJpZnQKK2F1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Citob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCitkb2N1bWVudGF0aW9uOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworZW52aXJvbm1lbnQ6CisgIHNkazogIj49MS4yNC4zIDwzLjAuMCIKKworZGVwZW5kZW5jaWVzOgorICBkYXJ0Ml9jb25zdGFudDogXjEuMC4wCisgIGZpeG51bTogXjAuMTAuMgorICBodHRwOiBeMC4xMS4zCisgIGxvZ2dpbmc6IF4wLjExLjAKKworZGV2X2RlcGVuZGVuY2llczoKKyAgZGFydF9kZXY6IF4yLjAuMAorICBtb2NraXRvOiAiPj0yLjIuMiA8NC4wLjAiCisgIHRlc3Q6ICI+PTAuMTIuMzAgPDIuMC4wIgpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC9wcm90b2NvbC90X3Byb3RvY29sX3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3QvcHJvdG9jb2wvdF9wcm90b2NvbF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2M2RiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvcHJvdG9jb2wvdF9wcm90b2NvbF90ZXN0LmRhcnQKQEAgLTAsMCArMSw0MDYgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3QudHJhbnNwb3J0LnRfanNvbl9wcm90b2NvbF90ZXN0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6ZGFydDJfY29uc3RhbnQvY29udmVydC5kYXJ0JyBzaG93IHV0Zjg7CitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKK3ZvaWQgbWFpbigpIHsKKyAgZmluYWwgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnbXkgbWVzc2FnZScsIFRNZXNzYWdlVHlwZS5PTkVXQVksIDEyMyk7CisKKyAgVFByb3RvY29sIHByb3RvY29sOworCisgIFByaW1pdGl2ZSBnZXRQcmltaXRpdmUoaW50IHRUeXBlKSB7CisgICAgc3dpdGNoICh0VHlwZSkgeworICAgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkQm9vbCwgcHJvdG9jb2wud3JpdGVCb29sLCBmYWxzZSk7CisKKyAgICAgIGNhc2UgVFR5cGUuQllURToKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEJ5dGUsIHByb3RvY29sLndyaXRlQnl0ZSwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkSTE2LCBwcm90b2NvbC53cml0ZUkxNiwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkSTMyLCBwcm90b2NvbC53cml0ZUkzMiwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkSTY0LCBwcm90b2NvbC53cml0ZUk2NCwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkRG91YmxlLCBwcm90b2NvbC53cml0ZURvdWJsZSwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkU3RyaW5nLCBwcm90b2NvbC53cml0ZVN0cmluZywgJycpOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgVFR5cGUgJHRUeXBlIik7CisgICAgfQorICB9CisKKyAgRnV0dXJlIHByaW1pdGl2ZVRlc3QoUHJpbWl0aXZlIHByaW1pdGl2ZSwgaW5wdXQpIGFzeW5jIHsKKyAgICBwcmltaXRpdmUud3JpdGUoaW5wdXQpOworICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgdmFyIG91dHB1dCA9IHByaW1pdGl2ZS5yZWFkKCk7CisKKyAgICBleHBlY3Qob3V0cHV0LCBpbnB1dCk7CisgIH0KKworICBGdXR1cmUgcHJpbWl0aXZlTnVsbFRlc3QoUHJpbWl0aXZlIHByaW1pdGl2ZSkgYXN5bmMgeworICAgIHByaW1pdGl2ZS53cml0ZShudWxsKTsKKyAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIHZhciBvdXRwdXQgPSBwcmltaXRpdmUucmVhZCgpOworCisgICAgZXhwZWN0KG91dHB1dCwgcHJpbWl0aXZlLmRlZmF1bHRWYWx1ZSk7CisgIH0KKworICB2YXIgc2hhcmVkVGVzdHMgPSAoKSB7CisgICAgdGVzdCgnVGVzdCBtZXNzYWdlJywgKCkgYXN5bmMgeworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICB2YXIgc3ViamVjdCA9IHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKworICAgICAgZXhwZWN0KHN1YmplY3QubmFtZSwgbWVzc2FnZS5uYW1lKTsKKyAgICAgIGV4cGVjdChzdWJqZWN0LnR5cGUsIG1lc3NhZ2UudHlwZSk7CisgICAgICBleHBlY3Qoc3ViamVjdC5zZXFpZCwgbWVzc2FnZS5zZXFpZCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHN0cnVjdCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBUU3RydWN0KCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlU3RydWN0QmVnaW4oaW5wdXQpOworICAgICAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRTdHJ1Y3RCZWdpbigpOworCisgICAgICAvLyBuYW1lIGlzIG5vdCBzZXJpYWxpemVkLCBzZWUgQyMgdmVyc2lvbiBmb3IgcmVmZXJlbmNlCisgICAgICBleHBlY3Qob3V0cHV0LCBpc05vdE51bGwpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBmaWVsZCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBURmllbGQoJ215IGZpZWxkJywgVFR5cGUuTUFQLCAxMjMpOworCisgICAgICBwcm90b2NvbC53cml0ZUZpZWxkQmVnaW4oaW5wdXQpOworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgb3V0cHV0ID0gcHJvdG9jb2wucmVhZEZpZWxkQmVnaW4oKTsKKworICAgICAgLy8gbmFtZSBpcyBub3Qgc2VyaWFsaXplZCwgc2VlIEMjIHZlcnNpb24gZm9yIHJlZmVyZW5jZQorICAgICAgZXhwZWN0KG91dHB1dC50eXBlLCBpbnB1dC50eXBlKTsKKyAgICAgIGV4cGVjdChvdXRwdXQuaWQsIGlucHV0LmlkKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgbWFwJywgKCkgYXN5bmMgeworICAgICAgdmFyIGlucHV0ID0gbmV3IFRNYXAoVFR5cGUuU1RSSU5HLCBUVHlwZS5TVFJVQ1QsIDEyMyk7CisKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4oaW5wdXQpOworICAgICAgcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRNYXBCZWdpbigpOworCisgICAgICBleHBlY3Qob3V0cHV0LmtleVR5cGUsIGlucHV0LmtleVR5cGUpOworICAgICAgZXhwZWN0KG91dHB1dC52YWx1ZVR5cGUsIGlucHV0LnZhbHVlVHlwZSk7CisgICAgICBleHBlY3Qob3V0cHV0Lmxlbmd0aCwgaW5wdXQubGVuZ3RoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgbGlzdCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBUTGlzdChUVHlwZS5TVFJJTkcsIDEyMyk7CisKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgb3V0cHV0ID0gcHJvdG9jb2wucmVhZExpc3RCZWdpbigpOworCisgICAgICBleHBlY3Qob3V0cHV0LmVsZW1lbnRUeXBlLCBpbnB1dC5lbGVtZW50VHlwZSk7CisgICAgICBleHBlY3Qob3V0cHV0Lmxlbmd0aCwgaW5wdXQubGVuZ3RoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3Qgc2V0JywgKCkgYXN5bmMgeworICAgICAgdmFyIGlucHV0ID0gbmV3IFRTZXQoVFR5cGUuU1RSSU5HLCAxMjMpOworCisgICAgICBwcm90b2NvbC53cml0ZVNldEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlU2V0RW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkTGlzdEJlZ2luKCk7CisKKyAgICAgIGV4cGVjdChvdXRwdXQuZWxlbWVudFR5cGUsIGlucHV0LmVsZW1lbnRUeXBlKTsKKyAgICAgIGV4cGVjdChvdXRwdXQubGVuZ3RoLCBpbnB1dC5sZW5ndGgpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBib29sJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuQk9PTCksIHRydWUpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBib29sIG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuQk9PTCkpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBieXRlJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuQllURSksIDY0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYnl0ZSBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkJZVEUpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTE2JywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTE2KSwgMzI3NjcpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBJMTYgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5JMTYpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTMyJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTMyKSwgMjE0NzQ4MzY0Nyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEkzMiBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkkzMikpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBJNjQnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5JNjQpLCA5MjIzMzcyMDM2ODU0Nzc1ODA3KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTY0IG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTY0KSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGRvdWJsZScsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkRPVUJMRSksIDMuMTQxNTkyNik7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGRvdWJsZSBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkRPVUJMRSkpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBzdHJpbmcnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSAnVGhlcmUgYXJlIG9ubHkgdHdvIGhhcmQgdGhpbmdzIGluIGNvbXB1dGVyIHNjaWVuY2U6ICcKKyAgICAgICAgICAnY2FjaGUgaW52YWxpZGF0aW9uLCBuYW1pbmcgdGhpbmdzLCBhbmQgb2ZmLWJ5LW9uZSBlcnJvcnMuJzsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLlNUUklORyksIGlucHV0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3Qgc3RyaW5nIG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuU1RSSU5HKSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGJpbmFyeScsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QobmV3IExpc3QuZmlsbGVkKDEwMCwgMTIzKSk7CisKKyAgICAgIHByb3RvY29sLndyaXRlQmluYXJ5KGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRCaW5hcnkoKTsKKworICAgICAgZXhwZWN0KG91dHB1dC5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7CisgICAgICBleHBlY3Qob3V0cHV0LmV2ZXJ5KChpKSA9PiBpID09IDEyMyksIGlzVHJ1ZSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGNvbXBsZXggc3RydWN0JywgKCkgYXN5bmMgeworICAgICAgLy8gezE6IHsxMDogMjB9LCAyOiB7MzA6IDQwfX0KKyAgICAgIHByb3RvY29sLndyaXRlU3RydWN0QmVnaW4obmV3IFRTdHJ1Y3QoKSk7CisgICAgICBwcm90b2NvbC53cml0ZUZpZWxkQmVnaW4obmV3IFRGaWVsZCgnc3VjY2VzcycsIFRUeXBlLk1BUCwgMCkpOworICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLk1BUCwgMikpOworCisgICAgICBwcm90b2NvbC53cml0ZUkzMigxKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKFRUeXBlLkkzMiwgVFR5cGUuSTMyLCAxKSk7CisgICAgICBwcm90b2NvbC53cml0ZUkzMigxMCk7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMjApOyAvLyB2YWx1ZQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMik7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMzApOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDQwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZUZpZWxkRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgcHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEZpZWxkQmVnaW4oKS50eXBlLCBUVHlwZS5NQVApOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRNYXBCZWdpbigpLmxlbmd0aCwgMik7CisKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDEpOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMTApOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDIwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMik7IC8vIGtleQorICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRNYXBCZWdpbigpLmxlbmd0aCwgMSk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAzMCk7IC8vIGtleQorICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgNDApOyAvLyB2YWx1ZQorICAgICAgcHJvdG9jb2wucmVhZE1hcEVuZCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IG5lc3RlZCBtYXBzIGFuZCBsaXN0cycsICgpIGFzeW5jIHsKKyAgICAgIC8vIHsxOiBbezEwOiAyMH1dLCAyOiBbezMwOiA0MH1dfQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkxJU1QsIDIpKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMSk7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KFRUeXBlLk1BUCwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMTApOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDIwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMik7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KFRUeXBlLk1BUCwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMzApOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDQwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRNYXBCZWdpbigpLmxlbmd0aCwgMik7CisKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDEpOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTGlzdEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMTApOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDIwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRMaXN0RW5kKCk7CisKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDIpOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTGlzdEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMzApOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDQwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRMaXN0RW5kKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisgICAgfSk7CisgIH07CisKKyAgZ3JvdXAoJ0pTT04nLCAoKSB7CisgICAgc2V0VXAoKCkgeworICAgICAgcHJvdG9jb2wgPSBuZXcgVEpzb25Qcm90b2NvbChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCkpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGVzY2FwZWQgdW5pY29kZScsICgpIGFzeW5jIHsKKyAgICAgIC8qCisgICAgICAgICBLT1JfS0FJCisgICAgICAgICAgIFVURi04OiAgMHhFMCAweEI4IDB4ODEKKyAgICAgICAgICAgVVRGLTE2OiAweDBFMDEKKyAgICAgICAgIEcgY2xlZjoKKyAgICAgICAgICAgVVRGLTg6ICAweEYwIDB4OUQgMHg4NCAweDlFCisgICAgICAgICAgIFVURi0xNjogMHhEODM0IDB4REQxRQorICAgICAgICovCisgICAgICB2YXIgYnVmZmVyID0gdXRmOC5lbmNvZGUociciXHUwMDAxXHUwZTAxIFx1ZDgzNFx1ZGQxZSInKTsKKyAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoYnVmZmVyKTsKKworICAgICAgdmFyIHByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHZhciBzdWJqZWN0ID0gcHJvdG9jb2wucmVhZFN0cmluZygpOworICAgICAgZXhwZWN0KHN1YmplY3QsCisgICAgICAgICAgdXRmOC5kZWNvZGUoWzB4MDEsIDB4RTAsIDB4QjgsIDB4ODEsIDB4MjAsIDB4RjAsIDB4OUQsIDB4ODQsIDB4OUVdKSk7CisgICAgfSk7CisKKyAgICBncm91cCgnc2hhcmVkIHRlc3RzJywgc2hhcmVkVGVzdHMpOworICB9KTsKKworICBncm91cCgnYmluYXJ5JywgKCkgeworICAgIHNldFVwKCgpIHsKKyAgICAgIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCkpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZSk7CisgICAgfSk7CisKKyAgICBncm91cCgnc2hhcmVkIHRlc3RzJywgc2hhcmVkVGVzdHMpOworICB9KTsKKworICBncm91cCgnY29tcGFjdCcsICgpIHsKKyAgICBzZXRVcCgoKSB7CisgICAgICBwcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKSk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlKTsKKyAgICB9KTsKKworICAgIGdyb3VwKCdzaGFyZWQgdGVzdHMnLCBzaGFyZWRUZXN0cyk7CisgIH0pOworfQorCitjbGFzcyBQcmltaXRpdmUgeworICBmaW5hbCBGdW5jdGlvbiByZWFkOworICBmaW5hbCBGdW5jdGlvbiB3cml0ZTsKKyAgZmluYWwgZGVmYXVsdFZhbHVlOworCisgIFByaW1pdGl2ZSh0aGlzLnJlYWQsIHRoaXMud3JpdGUsIHRoaXMuZGVmYXVsdFZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjc2NTAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3Quc2VyaWFsaXplci5zZXJpYWxpemVyX3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAnc2VyaWFsaXplcl90ZXN0X2RhdGEuZGFydCc7CisKK3ZvaWQgbWFpbigpIHsKKyAgdmFyIHNlcmlhbGl6ZXIgPSAoKSB7CisgICAgVERlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXI7CisgICAgVFNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKKyAgICBUZXN0VE9iamVjdCB0ZXN0VE9iamVjdDsKKworICAgIHNldFVwKCgpIHsKKyAgICAgIHNlcmlhbGl6ZXIgPSBuZXcgVFNlcmlhbGl6ZXIoKTsKKyAgICAgIGRlc2VyaWFsaXplciA9IG5ldyBURGVzZXJpYWxpemVyKCk7CisgICAgICAKKyAgICAgIHRlc3RUT2JqZWN0ID0gbmV3IFRlc3RUT2JqZWN0KCk7CisgICAgICB0ZXN0VE9iamVjdC5iID0gdHJ1ZTsKKyAgICAgIHRlc3RUT2JqZWN0LnMgPSAiVEVTVCI7CisgICAgICB0ZXN0VE9iamVjdC5kID0gMTUuMjU7CisgICAgICB0ZXN0VE9iamVjdC5pID0gMTA7CisgICAgICAKKyAgICAgIHZhciB0ZXN0TGlzdCA9IG5ldyBMaXN0PFN0cmluZz4oKTsKKyAgICAgIHRlc3RMaXN0LmFkZCgiVEVTVCAxIik7CisgICAgICB0ZXN0TGlzdC5hZGQoIlRFU1QgMiIpOworICAgICAgCisgICAgICB0ZXN0VE9iamVjdC5sID0gdGVzdExpc3Q7CisgICAgfSk7CisgICAgCisgICAgYXNzZXJ0TmV3T2JqZWN0RXF1YWxzVE9iamVjdChUZXN0VE9iamVjdCBuZXdPYmplY3QpIHsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QubCwgZXF1YWxzKHRlc3RUT2JqZWN0LmwpKTsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QuYiwgZXF1YWxzKHRlc3RUT2JqZWN0LmIpKTsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QuaSwgZXF1YWxzKHRlc3RUT2JqZWN0LmkpKTsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QuZCwgZXF1YWxzKHRlc3RUT2JqZWN0LmQpKTsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QucywgZXF1YWxzKHRlc3RUT2JqZWN0LnMpKTsKKyAgICB9CisgICAgCisgICAgcnVuV3JpdGVTdHJpbmdUZXN0KCkgeworICAgICAgdmFyIHMgPSBzZXJpYWxpemVyLndyaXRlU3RyaW5nKHRlc3RUT2JqZWN0KTsKKworICAgICAgdmFyIG5ld09iamVjdCA9IG5ldyBUZXN0VE9iamVjdCgpOworICAgICAgZGVzZXJpYWxpemVyLnJlYWRTdHJpbmcobmV3T2JqZWN0LCBzKTsKKworICAgICAgYXNzZXJ0TmV3T2JqZWN0RXF1YWxzVE9iamVjdChuZXdPYmplY3QpOworICAgIH07CisKKyAgICBydW5Xcml0ZVRlc3QoKSB7CisgICAgICB2YXIgcyA9IHNlcmlhbGl6ZXIud3JpdGUodGVzdFRPYmplY3QpOworCisgICAgICB2YXIgbmV3T2JqZWN0ID0gbmV3IFRlc3RUT2JqZWN0KCk7CisgICAgICBkZXNlcmlhbGl6ZXIucmVhZChuZXdPYmplY3QsIHMpOworCisgICAgICBhc3NlcnROZXdPYmplY3RFcXVhbHNUT2JqZWN0KG5ld09iamVjdCk7CisgICAgfTsKKworICAgIHRlc3QoJ0pTT04gUHJvdG9jb2wgU3RyaW5nJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgCisgICAgICBydW5Xcml0ZVN0cmluZ1Rlc3QoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0pTT04gUHJvdG9jb2wnLCAoKSB7CisgICAgICBzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2woc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgZGVzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisKKyAgICAgIHJ1bldyaXRlVGVzdCgpOworICAgIH0pOworCisgICAgdGVzdCgnQmluYXJ5IFByb3RvY29sIFN0cmluZycsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisKKyAgICAgIHJ1bldyaXRlU3RyaW5nVGVzdCgpOworICAgIH0pOworCisgICAgdGVzdCgnQmluYXJ5IFByb3RvY29sJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgZGVzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKworICAgICAgcnVuV3JpdGVUZXN0KCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdDb21wYWN0IFByb3RvY29sIFN0cmluZycsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKworICAgICAgcnVuV3JpdGVTdHJpbmdUZXN0KCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdDb21wYWN0IFByb3RvY29sJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworCisgICAgICBydW5Xcml0ZVRlc3QoKTsKKyAgICB9KTsKKyAgfTsKKworICBncm91cCgnU2VyaWFsaXplcicsIHNlcmlhbGl6ZXIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdF9kYXRhLmRhcnQgYi9saWIvZGFydC90ZXN0L3NlcmlhbGl6ZXIvc2VyaWFsaXplcl90ZXN0X2RhdGEuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTg2ZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdF9kYXRhLmRhcnQKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbGlicmFyeSB0aHJpZnQudGVzdC5zZXJpYWxpemVyLnNlcmlhbGl6ZXJfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBUZXN0VE9iamVjdCBpcyBhIHNpbXBsZSB0ZXN0IHN0cnVjdAorY2xhc3MgVGVzdFRPYmplY3QgaW1wbGVtZW50cyBUQmFzZSB7CisgIHN0YXRpYyBmaW5hbCBUU3RydWN0IF9TVFJVQ1RfREVTQyA9IG5ldyBUU3RydWN0KCJUZXN0VE9iamVjdCIpOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9JX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKCJpIiwgVFR5cGUuSTMyLCAxKTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfRF9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZCgiZCIsIFRUeXBlLkRPVUJMRSwgMik7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX1NfRklFTERfREVTQyA9IG5ldyBURmllbGQoInMiLCBUVHlwZS5TVFJJTkcsIDMpOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9MX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKCJsIiwgVFR5cGUuTElTVCwgNCk7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX0JfRklFTERfREVTQyA9IG5ldyBURmllbGQoImIiLCBUVHlwZS5CT09MLCA1KTsKKworICBpbnQgX2k7CisgIHN0YXRpYyBjb25zdCBpbnQgSSA9IDE7CisgIGRvdWJsZSBfZDsKKyAgc3RhdGljIGNvbnN0IGludCBEID0gMjsKKyAgU3RyaW5nIF9zOworICBzdGF0aWMgY29uc3QgaW50IFMgPSAzOworICBMaXN0PFN0cmluZz4gX2w7CisgIHN0YXRpYyBjb25zdCBpbnQgTCA9IDQ7CisgIGJvb2wgX2I7CisgIHN0YXRpYyBjb25zdCBpbnQgQiA9IDU7CisKKyAgYm9vbCBfX2lzc2V0X2kgPSBmYWxzZTsKKyAgYm9vbCBfX2lzc2V0X2QgPSBmYWxzZTsKKyAgYm9vbCBfX2lzc2V0X2IgPSBmYWxzZTsKKworICBUZXN0VE9iamVjdCgpIHsKKyAgfQorCisgIC8vIGkKKyAgaW50IGdldCBpID0+IHRoaXMuX2k7CisKKyAgc2V0IGkoaW50IGkpIHsKKyAgICB0aGlzLl9pID0gaTsKKyAgICB0aGlzLl9faXNzZXRfaSA9IHRydWU7CisgIH0KKworICBib29sIGlzU2V0SSgpID0+IHRoaXMuX19pc3NldF9pOworCisgIHVuc2V0SSgpIHsKKyAgICB0aGlzLl9faXNzZXRfaSA9IGZhbHNlOworICB9CisKKyAgLy8gZAorICBkb3VibGUgZ2V0IGQgPT4gdGhpcy5fZDsKKworICBzZXQgZChkb3VibGUgZCkgeworICAgIHRoaXMuX2QgPSBkOworICAgIHRoaXMuX19pc3NldF9kID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaXNTZXREKCkgPT4gdGhpcy5fX2lzc2V0X2Q7CisKKyAgdW5zZXREKCkgeworICAgIHRoaXMuX19pc3NldF9kID0gZmFsc2U7CisgIH0KKworICAvLyBzCisgIFN0cmluZyBnZXQgcyA9PiB0aGlzLl9zOworCisgIHNldCBzKFN0cmluZyBzKSB7CisgICAgdGhpcy5fcyA9IHM7CisgIH0KKworICBib29sIGlzU2V0UygpID0+IHRoaXMucyAhPSBudWxsOworCisgIHVuc2V0UygpIHsKKyAgICB0aGlzLnMgPSBudWxsOworICB9CisKKyAgLy8gbAorICBMaXN0PFN0cmluZz4gZ2V0IGwgPT4gdGhpcy5fbDsKKworICBzZXQgbChMaXN0PFN0cmluZz4gbCkgeworICAgIHRoaXMuX2wgPSBsOworICB9CisKKyAgYm9vbCBpc1NldEwoKSA9PiB0aGlzLmwgIT0gbnVsbDsKKworICB1bnNldEwoKSB7CisgICAgdGhpcy5sID0gbnVsbDsKKyAgfQorCisgIC8vIGIKKyAgYm9vbCBnZXQgYiA9PiB0aGlzLl9iOworCisgIHNldCBiKGJvb2wgYikgeworICAgIHRoaXMuX2IgPSBiOworICAgIHRoaXMuX19pc3NldF9iID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaXNTZXRCKCkgPT4gdGhpcy5fX2lzc2V0X2I7CisKKyAgdW5zZXRCKCkgeworICAgIHRoaXMuX19pc3NldF9iID0gZmFsc2U7CisgIH0KKworICBnZXRGaWVsZFZhbHVlKGludCBmaWVsZElEKSB7CisgICAgc3dpdGNoIChmaWVsZElEKSB7CisgICAgICBjYXNlIEk6CisgICAgICAgIHJldHVybiB0aGlzLmk7CisgICAgICBjYXNlIEQ6CisgICAgICAgIHJldHVybiB0aGlzLmQ7CisgICAgICBjYXNlIFM6CisgICAgICAgIHJldHVybiB0aGlzLnM7CisgICAgICBjYXNlIEw6CisgICAgICAgIHJldHVybiB0aGlzLmw7CisgICAgICBjYXNlIEI6CisgICAgICAgIHJldHVybiB0aGlzLmI7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiRmllbGQgJGZpZWxkSUQgZG9lc24ndCBleGlzdCEiKTsKKyAgICB9CisgIH0KKworICBzZXRGaWVsZFZhbHVlKGludCBmaWVsZElELCBPYmplY3QgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKGZpZWxkSUQpIHsKKyAgICAgIGNhc2UgSToKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldEkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmkgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBEOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0RCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuZCA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFM6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRTKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5zID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTDoKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldEwoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmwgPSB2YWx1ZSBhcyBMaXN0PFN0cmluZz47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQjoKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldEIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmIgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkZpZWxkICRmaWVsZElEIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgfQorICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UKKyAgYm9vbCBpc1NldChpbnQgZmllbGRJRCkgeworICAgIHN3aXRjaCAoZmllbGRJRCkgeworICAgICAgY2FzZSBJOgorICAgICAgICByZXR1cm4gaXNTZXRJKCk7CisgICAgICBjYXNlIEQ6CisgICAgICAgIHJldHVybiBpc1NldEQoKTsKKyAgICAgIGNhc2UgUzoKKyAgICAgICAgcmV0dXJuIGlzU2V0UygpOworICAgICAgY2FzZSBMOgorICAgICAgICByZXR1cm4gaXNTZXRMKCk7CisgICAgICBjYXNlIEI6CisgICAgICAgIHJldHVybiBpc1NldEIoKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0ISIpOworICAgIH0KKyAgfQorCisgIHJlYWQoVFByb3RvY29sIGlwcm90KSB7CisgICAgVEZpZWxkIGZpZWxkOworICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc3dpdGNoIChmaWVsZC5pZCkgeworICAgICAgICBjYXNlIEk6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgICB0aGlzLmkgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgICB0aGlzLl9faXNzZXRfaSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEQ6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuRE9VQkxFKSB7CisgICAgICAgICAgICB0aGlzLmQgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgICB0aGlzLl9faXNzZXRfZCA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFM6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICB0aGlzLnMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEw6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuTElTVCkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICBUTGlzdCBfbGlzdDc0ID0gaXByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgICAgICAgICB0aGlzLmwgPSBuZXcgTGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgIGZvciAoaW50IF9pNzUgPSAwOyBfaTc1IDwgX2xpc3Q3NC5sZW5ndGg7ICsrX2k3NSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBfZWxlbTc2OworICAgICAgICAgICAgICAgIF9lbGVtNzYgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgdGhpcy5sLmFkZChfZWxlbTc2KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpIHsKKyAgICAgICAgICAgIHRoaXMuYiA9IGlwcm90LnJlYWRCb29sKCk7CisgICAgICAgICAgICB0aGlzLl9faXNzZXRfYiA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworCisgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kCisgICAgdmFsaWRhdGUoKTsKKyAgfQorCisgIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeworICAgIHZhbGlkYXRlKCk7CisKKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKF9TVFJVQ1RfREVTQyk7CisgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9JX0ZJRUxEX0RFU0MpOworICAgIG9wcm90LndyaXRlSTMyKHRoaXMuaSk7CisgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfRF9GSUVMRF9ERVNDKTsKKyAgICBvcHJvdC53cml0ZURvdWJsZSh0aGlzLmQpOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICBpZiAodGhpcy5zICE9IG51bGwpIHsKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfU19GSUVMRF9ERVNDKTsKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKHRoaXMucyk7CisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorICAgIGlmICh0aGlzLmwgIT0gbnVsbCkgeworICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9MX0ZJRUxEX0RFU0MpOworICAgICAgeworICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoVFR5cGUuU1RSSU5HLCB0aGlzLmwubGVuZ3RoKSk7CisgICAgICAgIGZvciAodmFyIGVsZW03NyBpbiB0aGlzLmwpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhlbGVtNzcpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKyAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX0JfRklFTERfREVTQyk7CisgICAgb3Byb3Qud3JpdGVCb29sKHRoaXMuYik7CisgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgfQorCisgIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWZmZXIgcmV0ID0gbmV3IFN0cmluZ0J1ZmZlcigiVGVzdFRPYmplY3QoIik7CisKKyAgICByZXQud3JpdGUoImk6Iik7CisgICAgcmV0LndyaXRlKHRoaXMuaSk7CisKKyAgICByZXQud3JpdGUoIiwgIik7CisgICAgcmV0LndyaXRlKCJkOiIpOworICAgIHJldC53cml0ZSh0aGlzLmQpOworCisgICAgcmV0LndyaXRlKCIsICIpOworICAgIHJldC53cml0ZSgiczoiKTsKKyAgICBpZiAodGhpcy5zID09IG51bGwpIHsKKyAgICAgIHJldC53cml0ZSgibnVsbCIpOworICAgIH0gZWxzZSB7CisgICAgICByZXQud3JpdGUodGhpcy5zKTsKKyAgICB9CisKKyAgICByZXQud3JpdGUoIiwgIik7CisgICAgcmV0LndyaXRlKCJsOiIpOworICAgIGlmICh0aGlzLmwgPT0gbnVsbCkgeworICAgICAgcmV0LndyaXRlKCJudWxsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldC53cml0ZSh0aGlzLmwpOworICAgIH0KKworICAgIHJldC53cml0ZSgiLCAiKTsKKyAgICByZXQud3JpdGUoImI6Iik7CisgICAgcmV0LndyaXRlKHRoaXMuYik7CisKKyAgICByZXQud3JpdGUoIikiKTsKKworICAgIHJldHVybiByZXQudG9TdHJpbmcoKTsKKyAgfQorCisgIHZhbGlkYXRlKCkgeworICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICAvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RfYXBwbGljYXRpb25fZXJyb3JfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90X2FwcGxpY2F0aW9uX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTFkOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90X2FwcGxpY2F0aW9uX2Vycm9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDQ2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRfYXBwbGljYXRpb25fZXJyb3JfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIFRQcm90b2NvbCBwcm90b2NvbDsKKworICBzZXRVcCgoKSB7CisgICAgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKSk7CisgIH0pOworCisgIHRlc3QoJ1dyaXRlIGFuZCByZWFkIGFuIGFwcGxpY2F0aW9uIGVycm9yJywgKCkgeworICAgIHZhciBleHBlY3RlZFR5cGUgPSBUQXBwbGljYXRpb25FcnJvclR5cGUuSU5URVJOQUxfRVJST1I7CisgICAgdmFyIGV4cGVjdGVkTWVzc2FnZSA9ICd0ZXN0IGVycm9yIG1lc3NhZ2UnOworCisgICAgVEFwcGxpY2F0aW9uRXJyb3IgZXJyb3IgPQorICAgICAgICBuZXcgVEFwcGxpY2F0aW9uRXJyb3IoZXhwZWN0ZWRUeXBlLCBleHBlY3RlZE1lc3NhZ2UpOworICAgIGVycm9yLndyaXRlKHByb3RvY29sKTsKKworICAgIHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgVEFwcGxpY2F0aW9uRXJyb3Igc3ViamVjdCA9IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQocHJvdG9jb2wpOworCisgICAgZXhwZWN0KHN1YmplY3QsIGlzTm90TnVsbCk7CisgICAgZXhwZWN0KHN1YmplY3QudHlwZSwgZXhwZWN0ZWRUeXBlKTsKKyAgICBleHBlY3Qoc3ViamVjdC5tZXNzYWdlLCBleHBlY3RlZE1lc3NhZ2UpOworICB9KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjQ5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTc1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X2ZyYW1lZF90cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOmRhcnQyX2NvbnN0YW50L2NvbnZlcnQuZGFydCcgc2hvdyB1dGY4OworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIGdyb3VwKCdURnJhbWVkVHJhbnNwb3J0IHBhcnRpYWwgcmVhZHMnLCAoKSB7CisgICAgZmluYWwgZmx1c2hBd2FpdER1cmF0aW9uID0gbmV3IER1cmF0aW9uKHNlY29uZHM6IDEwKTsKKworICAgIEZha2VSZWFkT25seVNvY2tldCBzb2NrZXQ7CisgICAgVFNvY2tldFRyYW5zcG9ydCBzb2NrZXRUcmFuc3BvcnQ7CisgICAgVEZyYW1lZFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgdmFyIG1lc3NhZ2VBdmFpbGFibGU7CisKKyAgICBzZXRVcCgoKSB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVJlYWRPbmx5U29ja2V0KCk7CisgICAgICBzb2NrZXRUcmFuc3BvcnQgPSBuZXcgVENsaWVudFNvY2tldFRyYW5zcG9ydChzb2NrZXQpOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0VHJhbnNwb3J0KTsKKyAgICAgIG1lc3NhZ2VBdmFpbGFibGUgPSBmYWxzZTsKKyAgICB9KTsKKworICAgIGV4cGVjdE5vUmVhZGFibGVCeXRlcygpIHsKKyAgICAgIHZhciByZWFkQnVmZmVyID0gbmV3IFVpbnQ4TGlzdCgxMjgpOworICAgICAgdmFyIHJlYWRCeXRlcyA9IHRyYW5zcG9ydC5yZWFkKHJlYWRCdWZmZXIsIDAsIHJlYWRCdWZmZXIubGVuZ3RoSW5CeXRlcyk7CisgICAgICBleHBlY3QocmVhZEJ5dGVzLCAwKTsKKyAgICAgIGV4cGVjdChtZXNzYWdlQXZhaWxhYmxlLCBmYWxzZSk7CisgICAgfQorCisgICAgdGVzdCgnVGVzdCB0cmFuc3BvcnQgcmVhZHMgbWVzc2FnZXMgd2hlcmUgaGVhZGVyIGFuZCBib2R5IGFyZSBzZW50IHNlcGFyYXRlbHknLCAoKSBhc3luYyB7CisgICAgICAvLyBidWZmZXIgaW50byB3aGljaCB3ZSdsbCByZWFkCisgICAgICB2YXIgcmVhZEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoMTApOworICAgICAgdmFyIHJlYWRCeXRlczsKKworICAgICAgLy8gcmVnaXN0ZXJzIGZvciByZWFkYWJsZSBieXRlcworICAgICAgdmFyIGZsdXNoRnV0dXJlID0gdHJhbnNwb3J0LmZsdXNoKCkudGltZW91dChmbHVzaEF3YWl0RHVyYXRpb24pOworICAgICAgZmx1c2hGdXR1cmUudGhlbigoXykgeworICAgICAgICBtZXNzYWdlQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgIH0pOworCisgICAgICAvLyB3cml0ZSBoZWFkZXIgYnl0ZXMKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNl0pKTsKKworICAgICAgLy8geW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBhbnkgYnl0ZXMgZnJvbSB0aGUgcmVhZCwKKyAgICAgIC8vIGJlY2F1c2UgdGhlIGhlYWRlciBoYXMgYmVlbiBjb25zdW1lZCBpbnRlcm5hbGx5CisgICAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgZmlyc3QgYmF0Y2ggb2YgYm9keQorICAgICAgc29ja2V0Lm1lc3NhZ2VDb250cm9sbGVyLmFkZChuZXcgVWludDhMaXN0LmZyb21MaXN0KHV0ZjguZW5jb2RlKCJIZSIpKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQsCisgICAgICAvLyBiZWNhdXNlIHRoZSBmcmFtZSBoYXMgYmVlbiBjb25zdW1lZCBpbnRlcm5hbGx5CisgICAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgc2Vjb25kIGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCh1dGY4LmVuY29kZSgibGxvISIpKSk7CisKKyAgICAgIC8vIGhhdmUgdG8gd2FpdCBmb3IgdGhlIGZsdXNoIHRvIGNvbXBsZXRlLAorICAgICAgLy8gYmVjYXVzZSBpdCdzIG9ubHkgdGhlbiB0aGF0IHRoZSBmcmFtZSBpcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcKKyAgICAgIGF3YWl0IGZsdXNoRnV0dXJlOworICAgICAgZXhwZWN0KG1lc3NhZ2VBdmFpbGFibGUsIHRydWUpOworCisgICAgICAvLyBhdCB0aGlzIHBvaW50IHRoZSBmcmFtZSBpcyBjb21wbGV0ZSwgc28gd2UgZXhwZWN0IHRoZSByZWFkIHRvIGNvbXBsZXRlCisgICAgICByZWFkQnl0ZXMgPSB0cmFuc3BvcnQucmVhZChyZWFkQnVmZmVyLCAwLCByZWFkQnVmZmVyLmxlbmd0aEluQnl0ZXMpOworICAgICAgZXhwZWN0KHJlYWRCeXRlcywgNik7CisgICAgICBleHBlY3QocmVhZEJ1ZmZlci5zdWJsaXN0KDAsIDYpLCB1dGY4LmVuY29kZSgiSGVsbG8hIikpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCB0cmFuc3BvcnQgcmVhZHMgbWVzc2FnZXMgd2hlcmUgaGVhZGVyIGlzIHNlbnQgaW4gcGllY2VzICcKKyAgICAgICAgICdhbmQgYm9keSBpcyBhbHNvIHNlbnQgaW4gcGllY2VzJywgKCkgYXN5bmMgeworICAgICAgLy8gYnVmZmVyIGludG8gd2hpY2ggd2UnbGwgcmVhZAorICAgICAgdmFyIHJlYWRCdWZmZXIgPSBuZXcgVWludDhMaXN0KDEwKTsKKyAgICAgIHZhciByZWFkQnl0ZXM7CisKKyAgICAgIC8vIHJlZ2lzdGVycyBmb3IgcmVhZGFibGUgYnl0ZXMKKyAgICAgIHZhciBmbHVzaEZ1dHVyZSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRpbWVvdXQoZmx1c2hBd2FpdER1cmF0aW9uKTsKKyAgICAgIGZsdXNoRnV0dXJlLnRoZW4oKF8pIHsKKyAgICAgICAgbWVzc2FnZUF2YWlsYWJsZSA9IHRydWU7CisgICAgICB9KTsKKworICAgICAgLy8gd3JpdGUgZmlyc3QgcGFydCBvZiBoZWFkZXIgYnl0ZXMKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbMHgwMCwgMHgwMF0pKTsKKworICAgICAgLy8geW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBhbnkgYnl0ZXMgZnJvbSB0aGUgcmVhZAorICAgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIHNlY29uZCBwYXJ0IG9mIGhlYWRlciBieXRlcworICAgICAgc29ja2V0Lm1lc3NhZ2VDb250cm9sbGVyLmFkZChuZXcgVWludDhMaXN0LmZyb21MaXN0KFsweDAwLCAweDAzXSkpOworCisgICAgICAvLyB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGFueSBieXRlcyBmcm9tIHRoZSByZWFkIGFnYWluCisgICAgICAvLyBiZWNhdXNlIG9ubHkgdGhlIGhlYWRlciB3YXMgcmVhZCwgYW5kIHRoZXJlJ3Mgbm8gZnJhbWUgYm9keQorICAgICAgcmVhZEJ5dGVzID0gZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIGZpcnN0IGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCh1dGY4LmVuY29kZSgiSCIpKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQsCisgICAgICAvLyBiZWNhdXNlIHRoZSBmcmFtZSBoYXMgYmVlbiBjb25zdW1lZCBpbnRlcm5hbGx5CisgICAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgc2Vjb25kIGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCh1dGY4LmVuY29kZSgiaSEiKSkpOworCisgICAgICAvLyBoYXZlIHRvIHdhaXQgZm9yIHRoZSBmbHVzaCB0byBjb21wbGV0ZSwKKyAgICAgIC8vIGJlY2F1c2UgaXQncyBvbmx5IHRoZW4gdGhhdCB0aGUgZnJhbWUgaXMgYXZhaWxhYmxlIGZvciByZWFkaW5nCisgICAgICBhd2FpdCBmbHVzaEZ1dHVyZTsKKyAgICAgIGV4cGVjdChtZXNzYWdlQXZhaWxhYmxlLCB0cnVlKTsKKworICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGUgZnJhbWUgaXMgY29tcGxldGUsIHNvIHdlIGV4cGVjdCB0aGUgcmVhZCB0byBjb21wbGV0ZQorICAgICAgcmVhZEJ5dGVzID0gdHJhbnNwb3J0LnJlYWQocmVhZEJ1ZmZlciwgMCwgcmVhZEJ1ZmZlci5sZW5ndGhJbkJ5dGVzKTsKKyAgICAgIGV4cGVjdChyZWFkQnl0ZXMsIDMpOworICAgICAgZXhwZWN0KHJlYWRCdWZmZXIuc3VibGlzdCgwLCAzKSwgdXRmOC5lbmNvZGUoIkhpISIpKTsKKyAgICB9KTsKKyAgfSk7Cit9CisKKworCitjbGFzcyBGYWtlUmVhZE9ubHlTb2NrZXQgZXh0ZW5kcyBUU29ja2V0IHsKKworICBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4gbWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+KHN5bmM6IHRydWUpOworICBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gZXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PigpOworICBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4gc3RhdGVDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPigpOworCisgIEBvdmVycmlkZQorICBGdXR1cmUgY2xvc2UoKSB7CisgICAgLy8gbm9vcAorICB9CisKKyAgQG92ZXJyaWRlCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IGZhbHNlOworCisgIEBvdmVycmlkZQorICBib29sIGdldCBpc09wZW4gPT4gdHJ1ZTsKKworICBAb3ZlcnJpZGUKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3IgPT4gZXJyb3JDb250cm9sbGVyLnN0cmVhbTsKKworICBAb3ZlcnJpZGUKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBtZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgQG92ZXJyaWRlCisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlID0+IHN0YXRlQ29udHJvbGxlci5zdHJlYW07CisKKyAgQG92ZXJyaWRlCisgIEZ1dHVyZSBvcGVuKCkgeworICAgIC8vIG5vb3AKKyAgfQorCisgIEBvdmVycmlkZQorICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpIHsKKyAgICAvLyBub29wCisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2NjZWRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydF90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNjQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3QudHJhbnNwb3J0LnRfc29ja2V0X3RyYW5zcG9ydF90ZXN0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgRW5jb2Rpbmc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBVdGY4Q29kZWM7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTpkYXJ0Ml9jb25zdGFudC9jb252ZXJ0LmRhcnQnIHNob3cgYmFzZTY0OworaW1wb3J0ICdwYWNrYWdlOmh0dHAvaHR0cC5kYXJ0JyBzaG93IEJhc2VSZXF1ZXN0OworaW1wb3J0ICdwYWNrYWdlOmh0dHAvaHR0cC5kYXJ0JyBzaG93IENsaWVudDsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBSZXNwb25zZTsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBTdHJlYW1lZFJlc3BvbnNlOworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIGNvbnN0IHV0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIGdyb3VwKCdUSHR0cENsaWVudFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlSHR0cENsaWVudCBjbGllbnQ7CisgICAgVEh0dHBDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgeworICAgICAgY2xpZW50ID0gbmV3IEZha2VIdHRwQ2xpZW50KHN5bmM6IGZhbHNlKTsKKyAgICAgIHZhciBjb25maWcgPSBuZXcgVEh0dHBDb25maWcoVXJpLnBhcnNlKCdodHRwOi8vbG9jYWxob3N0JyksIHt9KTsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudFRyYW5zcG9ydChjbGllbnQsIGNvbmZpZyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHRyYW5zcG9ydCBzZW5kcyBib2R5JywgKCkgYXN5bmMgeworICAgICAgdmFyIGV4cGVjdGVkVGV4dCA9ICdteSByZXF1ZXN0JzsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKGV4cGVjdGVkVGV4dCkpOworCisgICAgICBleHBlY3QoY2xpZW50LnBvc3RSZXF1ZXN0LCBpc0VtcHR5KTsKKworICAgICAgYXdhaXQgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIGV4cGVjdChjbGllbnQucG9zdFJlcXVlc3QsIGlzTm90RW1wdHkpOworCisgICAgICB2YXIgcmVxdWVzdFRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJhc2U2NC5kZWNvZGUoY2xpZW50LnBvc3RSZXF1ZXN0KSk7CisgICAgICBleHBlY3QocmVxdWVzdFRleHQsIGV4cGVjdGVkVGV4dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHRyYW5zcG9ydCByZWNlaXZlcyByZXNwb25zZScsICgpIGFzeW5jIHsKKyAgICAgIHZhciBleHBlY3RlZFRleHQgPSAnbXkgcmVzcG9uc2UnOworICAgICAgdmFyIGV4cGVjdGVkQnl0ZXMgPSB1dGY4Q29kZWMuZW5jb2RlKGV4cGVjdGVkVGV4dCk7CisgICAgICBjbGllbnQucG9zdFJlc3BvbnNlID0gYmFzZTY0LmVuY29kZShleHBlY3RlZEJ5dGVzKTsKKworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoJ215IHJlcXVlc3QnKSk7CisgICAgICBleHBlY3QodHJhbnNwb3J0Lmhhc1JlYWREYXRhLCBpc0ZhbHNlKTsKKworICAgICAgYXdhaXQgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQuaGFzUmVhZERhdGEsIGlzVHJ1ZSk7CisKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KGV4cGVjdGVkQnl0ZXMubGVuZ3RoKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgZXhwZWN0ZWRCeXRlcy5sZW5ndGgpOworCisgICAgICB2YXIgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCBleHBlY3RlZFRleHQpOworICAgIH0pOworICB9KTsKKworICBncm91cCgnVEh0dHBDbGllbnRUcmFuc3BvcnQgd2l0aCBtdWx0aXBsZSBtZXNzYWdlcycsICgpIHsKKyAgICBGYWtlSHR0cENsaWVudCBjbGllbnQ7CisgICAgVEh0dHBDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgeworICAgICAgY2xpZW50ID0gbmV3IEZha2VIdHRwQ2xpZW50KHN5bmM6IHRydWUpOworICAgICAgdmFyIGNvbmZpZyA9IG5ldyBUSHR0cENvbmZpZyhVcmkucGFyc2UoJ2h0dHA6Ly9sb2NhbGhvc3QnKSwge30pOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KGNsaWVudCwgY29uZmlnKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgcmVhZCBjb3JyZWN0IGJ1ZmZlciBhZnRlciBmbHVzaCcsICgpIGFzeW5jIHsKKyAgICAgIFN0cmluZyBidWZmZXJUZXh0OworICAgICAgdmFyIGV4cGVjdGVkVGV4dCA9ICdyZXNwb25zZSAxJzsKKyAgICAgIHZhciBleHBlY3RlZEJ5dGVzID0gdXRmOENvZGVjLmVuY29kZShleHBlY3RlZFRleHQpOworCisgICAgICAvLyBwcmVwYXJlIGEgcmVzcG9uc2UKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKCdyZXF1ZXN0IDEnKSk7CisgICAgICBjbGllbnQucG9zdFJlc3BvbnNlID0gYmFzZTY0LmVuY29kZShleHBlY3RlZEJ5dGVzKTsKKworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KGV4cGVjdGVkQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCBleHBlY3RlZEJ5dGVzLmxlbmd0aCk7CisgICAgICAgIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICB9KTsKKworICAgICAgLy8gcHJlcGFyZSBhIHNlY29uZCByZXNwb25zZQorICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoJ3JlcXVlc3QgMicpKTsKKyAgICAgIHZhciByZXNwb25zZTJCeXRlcyA9IHV0ZjhDb2RlYy5lbmNvZGUoJ3Jlc3BvbnNlIDInKTsKKyAgICAgIGNsaWVudC5wb3N0UmVzcG9uc2UgPSBiYXNlNjQuZW5jb2RlKHJlc3BvbnNlMkJ5dGVzKTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIGV4cGVjdGVkVGV4dCk7CisgICAgfSk7CisgIH0pOworfQorCitjbGFzcyBGYWtlSHR0cENsaWVudCBpbXBsZW1lbnRzIENsaWVudCB7CisgIFN0cmluZyBwb3N0UmVzcG9uc2UgPSAnJzsKKyAgU3RyaW5nIHBvc3RSZXF1ZXN0ID0gJyc7CisKKyAgZmluYWwgYm9vbCBzeW5jOworCisgIEZha2VIdHRwQ2xpZW50KHt0aGlzLnN5bmM6IGZhbHNlfSk7CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBwb3N0KHVybCwKKyAgICAgIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIGJvZHksIEVuY29kaW5nIGVuY29kaW5nfSkgeworICAgIHBvc3RSZXF1ZXN0ID0gYm9keTsKKyAgICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocG9zdFJlc3BvbnNlLCAyMDApOworCisgICAgaWYgKHN5bmMpIHsKKyAgICAgIHJldHVybiBuZXcgRnV0dXJlLnN5bmMoKCkgPT4gcmVzcG9uc2UpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShyZXNwb25zZSk7CisgICAgfQorICB9CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBoZWFkKHVybCwge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc30pID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBnZXQodXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8UmVzcG9uc2U+IHB1dCh1cmwsCisgICAgICAgICAge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywgYm9keSwgRW5jb2RpbmcgZW5jb2Rpbmd9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxSZXNwb25zZT4gcGF0Y2godXJsLAorICAgICAgICAgIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIGJvZHksIEVuY29kaW5nIGVuY29kaW5nfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8UmVzcG9uc2U+IGRlbGV0ZSh1cmwsIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnN9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxTdHJpbmc+IHJlYWQodXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8VWludDhMaXN0PiByZWFkQnl0ZXModXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8U3RyZWFtZWRSZXNwb25zZT4gc2VuZChCYXNlUmVxdWVzdCByZXF1ZXN0KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIHZvaWQgY2xvc2UoKSA9PiB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnRfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGJmZmJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDMxMSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50cmFuc3BvcnQudF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3Q7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBVdGY4Q29kZWM7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTpkYXJ0Ml9jb25zdGFudC9jb252ZXJ0LmRhcnQnIHNob3cgYmFzZTY0OworaW1wb3J0ICdwYWNrYWdlOmRhcnQyX2NvbnN0YW50L2NvcmUuZGFydCcgYXMgY29yZTsKK2ltcG9ydCAncGFja2FnZTptb2NraXRvL21vY2tpdG8uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKK3ZvaWQgbWFpbigpIHsKKyAgY29uc3QgdXRmOENvZGVjID0gY29uc3QgVXRmOENvZGVjKCk7CisKKyAgZmluYWwgcmVxdWVzdFRleHQgPSAnbXkgdGVzdCByZXF1ZXN0JzsKKyAgZmluYWwgcmVxdWVzdEJ5dGVzID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCh1dGY4Q29kZWMuZW5jb2RlKHJlcXVlc3RUZXh0KSk7CisgIGZpbmFsIHJlcXVlc3RCYXNlNjQgPSBiYXNlNjQuZW5jb2RlKHJlcXVlc3RCeXRlcyk7CisKKyAgZmluYWwgcmVzcG9uc2VUZXh0ID0gJ3Jlc3BvbnNlIDEnOworICBmaW5hbCByZXNwb25zZUJ5dGVzID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCh1dGY4Q29kZWMuZW5jb2RlKHJlc3BvbnNlVGV4dCkpOworICBmaW5hbCByZXNwb25zZUJhc2U2NCA9IGJhc2U2NC5lbmNvZGUocmVzcG9uc2VCeXRlcyk7CisKKyAgZmluYWwgZnJhbWVkUmVzcG9uc2VCYXNlNjQgPSBiYXNlNjQuZW5jb2RlKF9nZXRGcmFtZWRSZXNwb25zZShyZXNwb25zZUJ5dGVzKSk7CisKKyAgZ3JvdXAoJ1RDbGllbnRTb2NrZXRUcmFuc3BvcnQnLCAoKSB7CisgICAgRmFrZVNvY2tldCBzb2NrZXQ7CisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICBzZXRVcCgoKSBhc3luYyB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldChzeW5jOiBmYWxzZSk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwocmVxdWVzdEJ5dGVzKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgY2xpZW50IHNlbmRpbmcgZGF0YSBvdmVyIHRyYW5zcG9ydCcsICgpIGFzeW5jIHsKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIGlzTnVsbCk7CisKKyAgICAgIEZ1dHVyZSByZXNwb25zZVJlYWR5ID0gdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIC8vIGFsbG93IG1pY3JvdGFzayBldmVudHMgdG8gZmluaXNoCisgICAgICBhd2FpdCBuZXcgRnV0dXJlLnZhbHVlKCk7CisKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIGlzTm90TnVsbCk7CisgICAgICBleHBlY3Qoc29ja2V0LnNlbmRQYXlsb2FkLCByZXF1ZXN0Qnl0ZXMpOworCisgICAgICAvLyBzaW11bGF0ZSBhIHJlc3BvbnNlCisgICAgICBzb2NrZXQucmVjZWl2ZUZha2VNZXNzYWdlKHJlc3BvbnNlQmFzZTY0KTsKKworICAgICAgYXdhaXQgcmVzcG9uc2VSZWFkeTsKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgcmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgdmFyIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCByZXNwb25zZVRleHQpOworICAgIH0pOworICB9LCB0aW1lb3V0OiBuZXcgVGltZW91dChuZXcgRHVyYXRpb24oc2Vjb25kczogMSkpKTsKKworICBncm91cCgnVENsaWVudFNvY2tldFRyYW5zcG9ydCB3aXRoIEZyYW1lZFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlU29ja2V0IHNvY2tldDsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIGFzeW5jIHsKKyAgICAgIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KHN5bmM6IHRydWUpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQobmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoc29ja2V0KSk7CisgICAgICBhd2FpdCB0cmFuc3BvcnQub3BlbigpOworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHJlcXVlc3RCeXRlcyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGNsaWVudCBzZW5kaW5nIGRhdGEgb3ZlciBmcmFtZWQgdHJhbnNwb3J0JywgKCkgYXN5bmMgeworICAgICAgU3RyaW5nIGJ1ZmZlclRleHQ7CisKKyAgICAgIEZ1dHVyZSByZXNwb25zZVJlYWR5ID0gdHJhbnNwb3J0LmZsdXNoKCkudGhlbigoXykgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChyZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgcmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICBidWZmZXJUZXh0ID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgICAgfSk7CisKKyAgICAgIC8vIHNpbXVsYXRlIGEgcmVzcG9uc2UKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UoZnJhbWVkUmVzcG9uc2VCYXNlNjQpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIHJlc3BvbnNlVGV4dCk7CisgICAgfSk7CisgIH0sIHRpbWVvdXQ6IG5ldyBUaW1lb3V0KG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxKSkpOworCisgIGdyb3VwKCdUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQnLCAoKSB7CisgICAgRmFrZVNvY2tldCBzb2NrZXQ7CisgICAgRmFrZVByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnk7CisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICBzZXRVcCgoKSBhc3luYyB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldChzeW5jOiB0cnVlKTsKKyAgICAgIGF3YWl0IHNvY2tldC5vcGVuKCk7CisKKyAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBGYWtlUHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vJywgVE1lc3NhZ2VUeXBlLkNBTEwsIDEyMyk7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0KAorICAgICAgICAgIHNvY2tldCwgbmV3IFRNZXNzYWdlUmVhZGVyKHByb3RvY29sRmFjdG9yeSksCisgICAgICAgICAgcmVzcG9uc2VUaW1lb3V0OiBjb3JlLkR1cmF0aW9uLnplcm8pOworICAgICAgYXdhaXQgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChyZXF1ZXN0Qnl0ZXMpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCByZXNwb25zZSBjb3JyZWxhdGVzIHRvIGNvcnJlY3QgcmVxdWVzdCcsICgpIGFzeW5jIHsKKyAgICAgIFN0cmluZyBidWZmZXJUZXh0OworCisgICAgICBGdXR1cmUgcmVzcG9uc2VSZWFkeSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRoZW4oKF8pIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QocmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmZXIsIDAsIHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIH0pOworCisgICAgICAvLyBzaW11bGF0ZSBhIHJlc3BvbnNlCisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vJywgVE1lc3NhZ2VUeXBlLlJFUExZLCAxMjMpOworICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShyZXNwb25zZUJhc2U2NCk7CisKKyAgICAgIC8vIHNpbXVsYXRlIGEgc2Vjb25kIHJlc3BvbnNlCisgICAgICB2YXIgcmVzcG9uc2UyVGV4dCA9ICdyZXNwb25zZSAyJzsKKyAgICAgIHZhciByZXNwb25zZTJCeXRlcyA9CisgICAgICAgICAgbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCh1dGY4Q29kZWMuZW5jb2RlKHJlc3BvbnNlMlRleHQpKTsKKyAgICAgIHZhciByZXNwb25zZTJCYXNlNjQgPSBiYXNlNjQuZW5jb2RlKHJlc3BvbnNlMkJ5dGVzKTsKKyAgICAgIHByb3RvY29sRmFjdG9yeS5tZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdmb28yJywgVE1lc3NhZ2VUeXBlLlJFUExZLCAxMjQpOworICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShyZXNwb25zZTJCYXNlNjQpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIHJlc3BvbnNlVGV4dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHJlc3BvbnNlIHRpbWVvdXQnLCAoKSBhc3luYyB7CisgICAgICBGdXR1cmUgcmVzcG9uc2VSZWFkeSA9IHRyYW5zcG9ydC5mbHVzaCgpOworICAgICAgZXhwZWN0KHJlc3BvbnNlUmVhZHksIHRocm93c0EobmV3IGlzSW5zdGFuY2VPZjxUaW1lb3V0RXhjZXB0aW9uPigpKSk7CisgICAgfSk7CisgIH0sIHRpbWVvdXQ6IG5ldyBUaW1lb3V0KG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxKSkpOworCisgIGdyb3VwKCdUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQgd2l0aCBURnJhbWVkVHJhbnNwb3J0JywgKCkgeworICAgIEZha2VTb2NrZXQgc29ja2V0OworICAgIEZha2VQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5OworICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgYXN5bmMgeworICAgICAgc29ja2V0ID0gbmV3IEZha2VTb2NrZXQoc3luYzogdHJ1ZSk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworCisgICAgICBwcm90b2NvbEZhY3RvcnkgPSBuZXcgRmFrZVByb3RvY29sRmFjdG9yeSgpOworICAgICAgcHJvdG9jb2xGYWN0b3J5Lm1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ2ZvbycsIFRNZXNzYWdlVHlwZS5DQUxMLCAxMjMpOworICAgICAgdmFyIG1lc3NhZ2VSZWFkZXIgPSBuZXcgVE1lc3NhZ2VSZWFkZXIocHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgIGJ5dGVPZmZzZXQ6IFRGcmFtZWRUcmFuc3BvcnQuaGVhZGVyQnl0ZUNvdW50KTsKKworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQobmV3IFRBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydCgKKyAgICAgICAgICBzb2NrZXQsIG1lc3NhZ2VSZWFkZXIsCisgICAgICAgICAgcmVzcG9uc2VUaW1lb3V0OiBjb3JlLkR1cmF0aW9uLnplcm8pKTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwocmVxdWVzdEJ5dGVzKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYXN5bmMgY2xpZW50IHNlbmRpbmcgZGF0YSBvdmVyIGZyYW1lZCB0cmFuc3BvcnQnLCAoKSBhc3luYyB7CisgICAgICBTdHJpbmcgYnVmZmVyVGV4dDsKKworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICB9KTsKKworICAgICAgLy8gc2ltdWxhdGUgYSByZXNwb25zZQorICAgICAgcHJvdG9jb2xGYWN0b3J5Lm1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ2ZvbycsIFRNZXNzYWdlVHlwZS5SRVBMWSwgMTIzKTsKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UoZnJhbWVkUmVzcG9uc2VCYXNlNjQpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIHJlc3BvbnNlVGV4dCk7CisgICAgfSk7CisgIH0sIHRpbWVvdXQ6IG5ldyBUaW1lb3V0KG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxKSkpOworCisgIGdyb3VwKCdUU2VydmVyVHJhbnNwb3J0JywgKCkgeworICAgIHRlc3QoJ1Rlc3Qgc2VydmVyIHRyYW5zcG9ydCBsaXN0ZW5zIHRvIHNvY2tldCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldCgpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKyAgICAgIGV4cGVjdChzb2NrZXQuaXNPcGVuLCBpc1RydWUpOworCisgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQuaGFzUmVhZERhdGEsIGlzRmFsc2UpOworCisgICAgICBzb2NrZXQucmVjZWl2ZUZha2VNZXNzYWdlKHJlcXVlc3RCYXNlNjQpOworCisgICAgICAvLyBhbGxvdyBtaWNyb3Rhc2sgZXZlbnRzIHRvIGZpbmlzaAorICAgICAgYXdhaXQgbmV3IEZ1dHVyZS52YWx1ZSgpOworCisgICAgICBleHBlY3QodHJhbnNwb3J0Lmhhc1JlYWREYXRhLCBpc1RydWUpOworCisgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChyZXF1ZXN0Qnl0ZXMubGVuZ3RoKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgcmVxdWVzdEJ5dGVzLmxlbmd0aCk7CisKKyAgICAgIHZhciBidWZmZXJUZXh0ID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIHJlcXVlc3RUZXh0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3Qgc2VydmVyIHNlbmRpbmcgZGF0YSBvdmVyIHRyYW5zcG9ydCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldCgpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKworICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KHNvY2tldCk7CisKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChyZXNwb25zZUJ5dGVzKTsKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIGlzTnVsbCk7CisKKyAgICAgIHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICAvLyBhbGxvdyBtaWNyb3Rhc2sgZXZlbnRzIHRvIGZpbmlzaAorICAgICAgYXdhaXQgbmV3IEZ1dHVyZS52YWx1ZSgpOworCisgICAgICBleHBlY3Qoc29ja2V0LnNlbmRQYXlsb2FkLCBpc05vdE51bGwpOworICAgICAgZXhwZWN0KHNvY2tldC5zZW5kUGF5bG9hZCwgcmVzcG9uc2VCeXRlcyk7CisgICAgfSk7CisgIH0sIHRpbWVvdXQ6IG5ldyBUaW1lb3V0KG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxKSkpOworfQorCitjbGFzcyBGYWtlU29ja2V0IGV4dGVuZHMgVFNvY2tldCB7CisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPiBfb25TdGF0ZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlID0+IF9vblN0YXRlQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxPYmplY3Q+IF9vbkVycm9yQ29udHJvbGxlcjsKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3IgPT4gX29uRXJyb3JDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4gX29uTWVzc2FnZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxVaW50OExpc3Q+IGdldCBvbk1lc3NhZ2UgPT4gX29uTWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIEZha2VTb2NrZXQoe2Jvb2wgc3luYzogZmFsc2V9KQorICAgICAgOiBfb25TdGF0ZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3Qoc3luYzogc3luYyksCisgICAgICAgIF9vbkVycm9yQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdChzeW5jOiBzeW5jKSwKKyAgICAgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3Qoc3luYzogc3luYyk7CisKKyAgYm9vbCBfaXNPcGVuOworCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfaXNPcGVuOworCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+ICFpc09wZW47CisKKyAgRnV0dXJlIG9wZW4oKSBhc3luYyB7CisgICAgX2lzT3BlbiA9IHRydWU7CisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuT1BFTik7CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSBhc3luYyB7CisgICAgX2lzT3BlbiA9IGZhbHNlOworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLkNMT1NFRCk7CisgIH0KKworICBVaW50OExpc3QgX3NlbmRQYXlsb2FkOworICBVaW50OExpc3QgZ2V0IHNlbmRQYXlsb2FkID0+IF9zZW5kUGF5bG9hZDsKKworICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpIHsKKyAgICBpZiAoIWlzT3BlbikgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ1RoZSBzb2NrZXQgaXMgbm90IG9wZW4nKTsKKworICAgIF9zZW5kUGF5bG9hZCA9IGRhdGE7CisgIH0KKworICB2b2lkIHJlY2VpdmVGYWtlTWVzc2FnZShTdHJpbmcgYmFzZTY0dGV4dCkgeworICAgIGlmICghaXNPcGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcignVGhlIHNvY2tldCBpcyBub3Qgb3BlbicpOworCisgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KGJhc2U2NC5kZWNvZGUoYmFzZTY0dGV4dCkpOworICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyLmFkZChtZXNzYWdlKTsKKyAgfQorfQorCitjbGFzcyBGYWtlUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisgIEZha2VQcm90b2NvbEZhY3RvcnkoKTsKKworICBUTWVzc2FnZSBtZXNzYWdlOworCisgIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA9PiBuZXcgRmFrZVByb3RvY29sKG1lc3NhZ2UpOworfQorCitjbGFzcyBGYWtlUHJvdG9jb2wgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgVFByb3RvY29sIHsKKyAgRmFrZVByb3RvY29sKHRoaXMuX21lc3NhZ2UpOworCisgIFRNZXNzYWdlIF9tZXNzYWdlOworCisgIHJlYWRNZXNzYWdlQmVnaW4oKSA9PiBfbWVzc2FnZTsKK30KKworVWludDhMaXN0IF9nZXRGcmFtZWRSZXNwb25zZShVaW50OExpc3QgcmVzcG9uc2VCeXRlcykgeworICB2YXIgYnl0ZU9mZnNldCA9IFRGcmFtZWRUcmFuc3BvcnQuaGVhZGVyQnl0ZUNvdW50OworICB2YXIgcmVzcG9uc2UgPSBuZXcgVWludDhMaXN0KGJ5dGVPZmZzZXQgKyByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisKKyAgcmVzcG9uc2UuYnVmZmVyLmFzQnl0ZURhdGEoKS5zZXRJbnQzMigwLCByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgIHJlc3BvbnNlLnNldEFsbChieXRlT2Zmc2V0LCByZXNwb25zZUJ5dGVzKTsKKworICByZXR1cm4gcmVzcG9uc2U7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3RyYW5zcG9ydF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3RyYW5zcG9ydF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiMzgxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDQxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X3NvY2tldF90cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCisvLy8gQ29tbW9uIHRyYW5zcG9ydCB0ZXN0cwordm9pZCBtYWluKCkgeworICBncm91cCgnVFRyYW5zcG9ydEZhY3RvcnknLCAoKSB7CisgICAgdGVzdCgndHJhbnNwb3J0IGlzIHJldHVybmVkIGZyb20gYmFzZSBmYWN0b3J5JywgKCkgYXN5bmMgeworICAgICAgVFRyYW5zcG9ydCByZXN1bHQ7CisgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG51bGw7CisKKyAgICAgIHZhciBmYWN0b3J5ID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7CisKKyAgICAgIHJlc3VsdCA9IGF3YWl0IGZhY3RvcnkuZ2V0VHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICBleHBlY3QocmVzdWx0LCBpc051bGwpOworCisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisgICAgICByZXN1bHQgPSBhd2FpdCBmYWN0b3J5LmdldFRyYW5zcG9ydCh0cmFuc3BvcnQpOworCisgICAgICBleHBlY3QocmVzdWx0LCB0cmFuc3BvcnQpOworICAgIH0pOworICB9KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rvb2wvZGV2LmRhcnQgYi9saWIvZGFydC90b29sL2Rldi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjhiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90b29sL2Rldi5kYXJ0CkBAIC0wLDAgKzEsMzMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdG9vbC5kZXY7CisKK2ltcG9ydCAncGFja2FnZTpkYXJ0X2Rldi9kYXJ0X2Rldi5kYXJ0JyBzaG93IGRldiwgY29uZmlnOworCittYWluKExpc3Q8U3RyaW5nPiBhcmdzKSBhc3luYyB7CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Xb3JraXZhL2RhcnRfZGV2CisKKyAgdmFyIGRpcmVjdG9yaWVzID0gWydsaWIvJywgJ3Rlc3QvJywgJ3Rvb2wvJ107CisgIGNvbmZpZy5hbmFseXplLmVudHJ5UG9pbnRzID0gZGlyZWN0b3JpZXM7CisgIGNvbmZpZy5mb3JtYXQuZGlyZWN0b3JpZXMgPSBkaXJlY3RvcmllczsKKyAgY29uZmlnLmNvcHlMaWNlbnNlCisgICAgLi5saWNlbnNlUGF0aCA9ICdMSUNFTlNFX0hFQURFUicKKyAgICAuLmRpcmVjdG9yaWVzID0gZGlyZWN0b3JpZXM7CisKKyAgYXdhaXQgZGV2KGFyZ3MpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9EZWxwaGlUaHJpZnQuZ3JvdXBwcm9qIGIvbGliL2RlbHBoaS9EZWxwaGlUaHJpZnQuZ3JvdXBwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzJlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL0RlbHBoaVRocmlmdC5ncm91cHByb2oKQEAgLTAsMCArMSwxNTYgQEAKK++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+CisJPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkNvbnNvbGUucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkNvbnNvbGUucGFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTJlZWI5Li4wMDAwMDAwCi0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Db25zb2xlLnBhcworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0oKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICopCi0KLXVuaXQgVGhyaWZ0LkNvbnNvbGU7Ci0KLWludGVyZmFjZQotCi11c2VzCi0gIFN0ZEN0cmxzOwotCi10eXBlCi0gIFRUaHJpZnRDb25zb2xlID0gY2xhc3MKLSAgcHVibGljCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBTOiBzdHJpbmcpOyB2aXJ0dWFsOwotICAgIHByb2NlZHVyZSBXcml0ZUxpbmUoIGNvbnN0IFM6IHN0cmluZyk7IHZpcnR1YWw7Ci0gIGVuZDsKLQotICBUR1VJQ29uc29sZSA9IGNsYXNzKCBUVGhyaWZ0Q29uc29sZSApCi0gIHByaXZhdGUKLSAgICBGTGluZUJyZWFrIDogQm9vbGVhbjsKLSAgICBGTWVtbyA6IFRNZW1vOwotCi0gICAgcHJvY2VkdXJlIEludGVybmFsV3JpdGUoIGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7Ci0gIHB1YmxpYwotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTGluZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBTWVtbzogVE1lbW8pOwotICBlbmQ7Ci0KLWZ1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOwotcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOwotcHJvY2VkdXJlIFJlc3RvcmVDb25zb2xlVG9EZWZhdWx0OwotCi1pbXBsZW1lbnRhdGlvbgotCi12YXIKLSAgRkRlZmF1bHRDb25zb2xlIDogVFRocmlmdENvbnNvbGU7Ci0gIEZDb25zb2xlIDogVFRocmlmdENvbnNvbGU7Ci0KLWZ1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZDb25zb2xlOwotZW5kOwotCi17IFRUaHJpZnRDb25zb2xlIH0KLQotcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlKGNvbnN0IFM6IHN0cmluZyk7Ci1iZWdpbgotICBTeXN0ZW0uV3JpdGUoIFMgKTsKLWVuZDsKLQotcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOwotYmVnaW4KLSAgU3lzdGVtLldyaXRlbG4oIFMgKTsKLWVuZDsKLQotcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOwotYmVnaW4KLSAgRkNvbnNvbGUgOj0gQUNvbnNvbGU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBSZXN0b3JlQ29uc29sZVRvRGVmYXVsdDsKLWJlZ2luCi0gIEZDb25zb2xlIDo9IEZEZWZhdWx0Q29uc29sZTsKLWVuZDsKLQoteyBUR1VJQ29uc29sZSB9Ci0KLWNvbnN0cnVjdG9yIFRHVUlDb25zb2xlLkNyZWF0ZSggQU1lbW86IFRNZW1vKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZNZW1vIDo9IEFNZW1vOwotICBGTGluZUJyZWFrIDo9IFRydWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUR1VJQ29uc29sZS5JbnRlcm5hbFdyaXRlKGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7Ci12YXIKLSAgaWR4IDogSW50ZWdlcjsKLWJlZ2luCi0gIGlmIEZMaW5lQnJlYWsgdGhlbgotICBiZWdpbgotICAgIEZNZW1vLkxpbmVzLkFkZCggUyApOwotICBlbmQgZWxzZQotICBiZWdpbgotICAgIGlkeCA6PSBGTWVtby5MaW5lcy5Db3VudCAtIDE7Ci0gICAgaWYgaWR4IDwgMCB0aGVuCi0gICAgYmVnaW4KLSAgICAgIEZNZW1vLkxpbmVzLkFkZCggUyApOwotICAgIGVuZDsKLSAgICBGTWVtby5MaW5lc1tpZHhdIDo9IEZNZW1vLkxpbmVzW2lkeF0gKyBTOwotICBlbmQ7Ci0gIEZMaW5lQnJlYWsgOj0gYldyaXRlTGluZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRHVUlDb25zb2xlLldyaXRlKGNvbnN0IFM6IHN0cmluZyk7Ci1iZWdpbgotICBJbnRlcm5hbFdyaXRlKCBTLCBGYWxzZSk7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUR1VJQ29uc29sZS5Xcml0ZUxpbmUoY29uc3QgUzogc3RyaW5nKTsKLWJlZ2luCi0gIEludGVybmFsV3JpdGUoIFMsIFRydWUpOwotZW5kOwotCi1pbml0aWFsaXphdGlvbgotYmVnaW4KLSAgRkRlZmF1bHRDb25zb2xlIDo9IFRUaHJpZnRDb25zb2xlLkNyZWF0ZTsKLSAgRkNvbnNvbGUgOj0gRkRlZmF1bHRDb25zb2xlOwotZW5kOwotCi1maW5hbGl6YXRpb24KLWJlZ2luCi0gIEZEZWZhdWx0Q29uc29sZS5GcmVlOwotZW5kOwotCi1lbmQuCi0KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5EZWZpbmVzLmluYyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5EZWZpbmVzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTljY2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkRlZmluZXMuaW5jCkBAIC0wLDAgKzEsNTAgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworCisvLyBHb29kIGxpc3RzIG9mIERlbHBoaSB2ZXJzaW9uIG51bWJlcnMKKy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9qZWN0LWplZGkvamVkaS9ibG9iL21hc3Rlci9qZWRpLmluYworLy8gaHR0cDovL2RvY3dpa2kuZW1iYXJjYWRlcm8uY29tL1JBRFN0dWRpby9TZWF0dGxlL2VuL0NvbXBpbGVyX1ZlcnNpb25zCisKKworLy8gc3RhcnQgd2l0aCBtb3N0IGJhY2t3YXJkcyBjb21wYXRpYmxlIGRlZmF1bHRzCisKK3skREVGSU5FIE9MRF9VTklUX05BTUVTfQoreyRERUZJTkUgT0xEX1NPQ0tFVFN9ICAgICAgLy8gVE9ETzogYWRkIHNvY2tldCBzdXBwb3J0IGZvciBDb21waWxlclZlcnNpb24gPj0gMjguMAoreyRVTkRFRiBIQVZFX0NMQVNTX0NUT1J9CisKKworLy8gZW5hYmxlIGZlYXR1cmVzIGFzIHRoZXkgYXJlIGF2YWlsYWJsZQorCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfSAgIC8vIERlbHBoaSAyMDEwCisgIHskREVGSU5FIEhBVkVfQ0xBU1NfQ1RPUn0KK3skSUZFTkR9CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIzLjB9ICAgLy8gRGVscGhpIFhFMgorICB7JFVOREVGIE9MRF9VTklUX05BTUVTfQoreyRJRkVORH0KKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjguMH0gICAvLyBEZWxwaGkgWEU3CisgIHskVU5ERUYgT0xEX1NPQ0tFVFN9Cit7JElGRU5EfQorCisKKy8vIEVPRgorCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5FeGNlcHRpb24ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkV4Y2VwdGlvbi5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxNWMzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5FeGNlcHRpb24ucGFzCkBAIC0wLDAgKzEsNjIgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworeyRTQ09QRURFTlVNUyBPTn0KKwordW5pdCBUaHJpZnQuRXhjZXB0aW9uOworCitpbnRlcmZhY2UKKwordXNlcworICBDbGFzc2VzLCBTeXNVdGlsczsKKwordHlwZQorICAvLyBiYXNlIGNsYXNzIGZvciBhbGwgVGhyaWZ0IGV4Y2VwdGlvbnMKKyAgVEV4Y2VwdGlvbiA9IGNsYXNzKCBTeXNVdGlscy5FeGNlcHRpb24pCisgIHB1YmxpYworICAgIGZ1bmN0aW9uIE1lc3NhZ2UgOiBzdHJpbmc7ICAgICAgICAvLyBoaWRlIGluaGVyaXRlZCBwcm9wZXJ0eTogYWxsb3cgcmVhZCwgYnV0IHByZXZlbnQgYWNjaWRlbnRhbCB3cml0ZXMKKyAgICBwcm9jZWR1cmUgVXBkYXRlTWVzc2FnZVByb3BlcnR5OyAgLy8gdXBkYXRlIGluaGVyaXRlZCBtZXNzYWdlIHByb3BlcnR5IHdpdGggdG9TdHJpbmcoKQorICBlbmQ7CisKKworCisKK2ltcGxlbWVudGF0aW9uCisKK3sgVEV4Y2VwdGlvbiB9CisKK2Z1bmN0aW9uIFRFeGNlcHRpb24uTWVzc2FnZTsKKy8vIGFsbG93IHJlYWQgKGV4Y2VwdGlvbiBzdW1tYXJ5KSwgYnV0IHByZXZlbnQgYWNjaWRlbnRhbCB3cml0ZXMKKy8vIHJlYWQgd2lsbCByZXR1cm4gdGhlIGV4Y2VwdGlvbiBzdW1tYXJ5CitiZWdpbgorICByZXN1bHQgOj0gU2VsZi5Ub1N0cmluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRFeGNlcHRpb24uVXBkYXRlTWVzc2FnZVByb3BlcnR5OworLy8gVXBkYXRlIHRoZSBpbmhlcml0ZWQgTWVzc2FnZSBwcm9wZXJ0eSB0byBiZXR0ZXIgY29uZm9ybSB0byBzdGFuZGFyZCBiZWhhdmlvdXIuCisvLyBOaWNlIGJlbmVmaXQ6IFRoZSBJREUgaXMgbm93IGFibGUgdG8gc2hvdyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgYWdhaW4uCitiZWdpbgorICBpbmhlcml0ZWQgTWVzc2FnZSA6PSBTZWxmLlRvU3RyaW5nOyAgLy8gcHJvZHVjZXMgYSBzdW1tYXJ5IHRleHQKK2VuZDsKKworCisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMKaW5kZXggZjZkOTQ0Ni4uOGNmMjNkYiAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcwpAQCAtNTMsMTEgKzUzLDExIEBACiAKIHR5cGUKICAgSU11bHRpcGxleGVkUHJvY2Vzc29yID0gaW50ZXJmYWNlKCBJUHJvY2Vzc29yKQotICAgIFsnezgxMEZGMzJELTIyQTItNEQ1OC1CMTI5LUIwNTkwNzAzRUNFQ30nXQorICAgIFsnezgwN0Y5RDE5LTZDRjQtNDc4OS04NDBFLTkzRTg3QTEyRUI2M30nXQogICAgIC8vIFJlZ2lzdGVyIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdXMKICAgICAvLyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZSBuYW1lCiAgICAgLy8gdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgotICAgIHByb2NlZHVyZSBSZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3IpOworICAgIHByb2NlZHVyZSBSZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3I7IGNvbnN0IGFzRGVmYXVsdCA6IEJvb2xlYW4gPSBGQUxTRSk7CiAgIGVuZDsKIAogCkBAIC02OCwxNyArNjgsMTggQEAKICAgICAvLyB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCiAgICAgVFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA9IGNsYXNzKCBUUHJvdG9jb2xEZWNvcmF0b3IpCiAgICAgcHJpdmF0ZQotICAgICAgRk1lc3NhZ2VCZWdpbiA6IElNZXNzYWdlOworICAgICAgRk1lc3NhZ2VCZWdpbiA6IFRUaHJpZnRNZXNzYWdlOwogICAgIHB1YmxpYwotICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBwcm90b2NvbCA6IElQcm90b2NvbDsgY29uc3QgYU1zZ0JlZ2luIDogSU1lc3NhZ2UpOwotICAgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7IG92ZXJyaWRlOworICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBwcm90b2NvbCA6IElQcm90b2NvbDsgY29uc3QgYU1zZ0JlZ2luIDogVFRocmlmdE1lc3NhZ2UpOworICAgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOwogICAgIGVuZDsKIAogICBwcml2YXRlCiAgICAgRlNlcnZpY2VQcm9jZXNzb3JNYXAgOiBURGljdGlvbmFyeTxTdHJpbmcsIElQcm9jZXNzb3I+OworICAgIEZEZWZhdWx0UHJvY2Vzc29yIDogSVByb2Nlc3NvcjsKIAotICAgIHByb2NlZHVyZSBFcnJvciggY29uc3Qgb3Byb3QgOiBJUHJvdG9jb2w7IGNvbnN0IG1zZyA6IElNZXNzYWdlOwotICAgICAgICAgICAgICAgICAgICAgZXh0eXBlIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlOyBjb25zdCBldHh0IDogc3RyaW5nKTsKKyAgICBwcm9jZWR1cmUgRXJyb3IoIGNvbnN0IG9wcm90IDogSVByb3RvY29sOyBjb25zdCBtc2cgOiBUVGhyaWZ0TWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgIGV4dHlwZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7IGNvbnN0IGV0eHQgOiBzdHJpbmcpOwogCiAgIHB1YmxpYwogICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKQEAgLTg3LDcgKzg4LDcgQEAKICAgICAvLyBSZWdpc3RlciBhIHNlcnZpY2Ugd2l0aCB0aGlzIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuICBUaGlzIGFsbG93cyB1cwogICAgIC8vIHRvIGJyb2tlciByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUKICAgICAvLyB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCi0gICAgcHJvY2VkdXJlIFJlZ2lzdGVyUHJvY2Vzc29yKCBjb25zdCBzZXJ2aWNlTmFtZSA6IFN0cmluZzsgY29uc3QgcHJvY2Vzc29yIDogSVByb2Nlc3Nvcik7CisgICAgcHJvY2VkdXJlIFJlZ2lzdGVyUHJvY2Vzc29yKCBjb25zdCBzZXJ2aWNlTmFtZSA6IFN0cmluZzsgY29uc3QgcHJvY2Vzc29yIDogSVByb2Nlc3NvcjsgY29uc3QgYXNEZWZhdWx0IDogQm9vbGVhbiA9IEZBTFNFKTsKIAogICAgIHsgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBwcm9jZXNzIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CiAgICAgICAtIFJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS4KQEAgLTEwNSwxNCArMTA2LDE0IEBACiAKIGltcGxlbWVudGF0aW9uCiAKLWNvbnN0cnVjdG9yIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuVFN0b3JlZE1lc3NhZ2VQcm90b2NvbC5DcmVhdGUoIGNvbnN0IHByb3RvY29sIDogSVByb3RvY29sOyBjb25zdCBhTXNnQmVnaW4gOiBJTWVzc2FnZSk7Citjb25zdHJ1Y3RvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlRTdG9yZWRNZXNzYWdlUHJvdG9jb2wuQ3JlYXRlKCBjb25zdCBwcm90b2NvbCA6IElQcm90b2NvbDsgY29uc3QgYU1zZ0JlZ2luIDogVFRocmlmdE1lc3NhZ2UpOwogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZSggcHJvdG9jb2wpOwogICBGTWVzc2FnZUJlZ2luIDo9IGFNc2dCZWdpbjsKIGVuZDsKIAogCi1mdW5jdGlvbiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlRTdG9yZWRNZXNzYWdlUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7CitmdW5jdGlvbiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlRTdG9yZWRNZXNzYWdlUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CiBiZWdpbgogICByZXN1bHQgOj0gRk1lc3NhZ2VCZWdpbjsKIGVuZDsKQEAgLTEzNSwyMSArMTM2LDI3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yKTsKK3Byb2NlZHVyZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlJlZ2lzdGVyUHJvY2Vzc29yKCBjb25zdCBzZXJ2aWNlTmFtZSA6IFN0cmluZzsgY29uc3QgcHJvY2Vzc29yIDogSVByb2Nlc3NvcjsgY29uc3QgYXNEZWZhdWx0IDogQm9vbGVhbik7CiBiZWdpbgogICBGU2VydmljZVByb2Nlc3Nvck1hcC5BZGQoIHNlcnZpY2VOYW1lLCBwcm9jZXNzb3IpOworCisgIGlmIGFzRGVmYXVsdCB0aGVuIGJlZ2luCisgICAgaWYgRkRlZmF1bHRQcm9jZXNzb3IgPSBuaWwKKyAgICB0aGVuIEZEZWZhdWx0UHJvY2Vzc29yIDo9IHByb2Nlc3NvcgorICAgIGVsc2UgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvci5DcmVhdGUoJ09ubHkgb25lIGRlZmF1bHQgc2VydmljZSBhbGxvd2VkJyk7CisgIGVuZDsKIGVuZDsKIAogCi1wcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5FcnJvciggY29uc3Qgb3Byb3QgOiBJUHJvdG9jb2w7IGNvbnN0IG1zZyA6IElNZXNzYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHlwZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZTsKK3Byb2NlZHVyZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLkVycm9yKCBjb25zdCBvcHJvdCA6IElQcm90b2NvbDsgY29uc3QgbXNnIDogVFRocmlmdE1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0eXBlIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWRDbGFzczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBldHh0IDogc3RyaW5nKTsKIHZhciBhcHBleCAgOiBUQXBwbGljYXRpb25FeGNlcHRpb247Ci0gICAgbmV3TXNnIDogSU1lc3NhZ2U7CisgICAgbmV3TXNnIDogVFRocmlmdE1lc3NhZ2U7CiBiZWdpbgotICBhcHBleCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKCBleHR5cGUsIGV0eHQpOworICBhcHBleCA6PSBleHR5cGUuQ3JlYXRlKGV0eHQpOwogICB0cnkKLSAgICBuZXdNc2cgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZSggbXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCk7CisgICAgSW5pdCggbmV3TXNnLCBtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKTsKIAogICAgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ld01zZyk7CiAgICAgYXBwZXguV3JpdGUob3Byb3QpOwpAQCAtMTYzLDcgKzE3MCw3IEBACiAKIAogZnVuY3Rpb24gVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5Qcm9jZXNzKGNvbnN0IGlwcm90LCBvcHJvdCA6IElQcm90b2NvbDsgY29uc3QgZXZlbnRzIDogSVByb2Nlc3NvckV2ZW50cyA9IG5pbCk6IEJvb2xlYW47Ci12YXIgbXNnLCBuZXdNc2cgOiBJTWVzc2FnZTsKK3ZhciBtc2csIG5ld01zZyA6IFRUaHJpZnRNZXNzYWdlOwogICAgIGlkeCAgICAgICAgIDogSW50ZWdlcjsKICAgICBzU2VydmljZSAgICA6IHN0cmluZzsKICAgICBwcm9jZXNzb3IgICA6IElQcm9jZXNzb3I7CkBAIC0xNzgsMzQgKzE4NSw0MyBAQAogICBtc2cgOj0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOwogICBpZiBub3QgKG1zZy5UeXBlXyBpbiBbVE1lc3NhZ2VUeXBlLkNhbGwsIFRNZXNzYWdlVHlwZS5PbmV3YXldKSB0aGVuIGJlZ2luCiAgICAgRXJyb3IoIG9wcm90LCBtc2csCi0gICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5JbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRNZXNzYWdlVHlwZSwKICAgICAgICAgICAgRVJST1JfSU5WQUxJRF9NU0dUWVBFKTsKICAgICBFeGl0KCBGQUxTRSk7CiAgIGVuZDsKIAogICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKKyAgLy8gdXNlIEZEZWZhdWx0UHJvY2Vzc29yIGFzIGZhbGxiYWNrIGlmIHRoZXJlIGlzIG5vIHNlcGFyYXRvcgogICBpZHggOj0gUG9zKCBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IsIG1zZy5OYW1lKTsKLSAgaWYgaWR4IDwgMSB0aGVuIGJlZ2luCisgIGlmIGlkeCA+IDAgdGhlbiBiZWdpbgorCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAorICAgIHNTZXJ2aWNlIDo9IENvcHkoIG1zZy5OYW1lLCAxLCBpZHgtMSk7CisgICAgaWYgbm90IEZTZXJ2aWNlUHJvY2Vzc29yTWFwLlRyeUdldFZhbHVlKCBzU2VydmljZSwgcHJvY2Vzc29yKQorICAgIHRoZW4gYmVnaW4KKyAgICAgIEVycm9yKCBvcHJvdCwgbXNnLAorICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IsCisgICAgICAgICAgICAgRm9ybWF0KEVSUk9SX1VOS05PV05fU0VSVklDRSxbc1NlcnZpY2VdKSk7CisgICAgICBFeGl0KCBGQUxTRSk7CisgICAgZW5kOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCByZW1vdmluZyB0aGUgc2VydmljZSBuYW1lCisgICAgSW5jKCBpZHgsIExlbmd0aChUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpKTsKKyAgICBJbml0KCBuZXdNc2csIENvcHkoIG1zZy5OYW1lLCBpZHgsIE1BWElOVCksIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKKworICBlbmQKKyAgZWxzZSBpZiBGRGVmYXVsdFByb2Nlc3NvciA8PiBuaWwgdGhlbiBiZWdpbgorICAgIHByb2Nlc3NvciA6PSBGRGVmYXVsdFByb2Nlc3NvcjsKKyAgICBuZXdNc2cgICAgOj0gbXNnOyAgLy8gbm8gbmVlZCB0byBjaGFuZ2UKKworICBlbmQKKyAgZWxzZSBiZWdpbgogICAgIEVycm9yKCBvcHJvdCwgbXNnLAotICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuSW52YWxpZFByb3RvY29sLAorICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2wsCiAgICAgICAgICAgIEZvcm1hdChFUlJPUl9JTkNPTVBBVElCTEVfUFJPVCxbbXNnLk5hbWVdKSk7CiAgICAgRXhpdCggRkFMU0UpOwogICBlbmQ7CiAKLSAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAotICBzU2VydmljZSA6PSBDb3B5KCBtc2cuTmFtZSwgMSwgaWR4LTEpOwotICBpZiBub3QgRlNlcnZpY2VQcm9jZXNzb3JNYXAuVHJ5R2V0VmFsdWUoIHNTZXJ2aWNlLCBwcm9jZXNzb3IpCi0gIHRoZW4gYmVnaW4KLSAgICBFcnJvciggb3Byb3QsIG1zZywKLSAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsCi0gICAgICAgICAgIEZvcm1hdChFUlJPUl9VTktOT1dOX1NFUlZJQ0UsW3NTZXJ2aWNlXSkpOwotICAgIEV4aXQoIEZBTFNFKTsKLSAgZW5kOwotCi0gIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgbmFtZQotICBJbmMoIGlkeCwgTGVuZ3RoKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUikpOwotICBuZXdNc2cgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZSggQ29weSggbXNnLk5hbWUsIGlkeCwgTUFYSU5UKSwgbXNnLlR5cGVfLCBtc2cuU2VxSUQpOwotCiAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKICAgcHJvdG9jb2wgOj0gVFN0b3JlZE1lc3NhZ2VQcm90b2NvbC5DcmVhdGUoIGlwcm90LCBuZXdNc2cpOwogICByZXN1bHQgICA6PSBwcm9jZXNzb3IucHJvY2VzcyggcHJvdG9jb2wsIG9wcm90LCBldmVudHMpOwpAQCAtMjEzLDQgKzIyOSwzIEBACiAKIAogZW5kLgotCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMKaW5kZXggNjFhZjQ0ZC4uMWMxYjNkYSAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5Db21wYWN0LnBhcwpAQCAtMTIzLDcgKzEyMyw3IEBACiAKICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KICAgICAvLyBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCi0gICAgcHJpdmF0ZSBib29sZWFuRmllbGRfIDogSUZpZWxkOworICAgIHByaXZhdGUgYm9vbGVhbkZpZWxkXyA6IFRUaHJpZnRGaWVsZDsKIAogICAgIC8vIElmIHdlIFJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbgogICAgIC8vIHZhbHVlIGhlcmUgc28gdGhhdCBSZWFkQm9vbCBjYW4gdXNlIGl0LgpAQCAtMTQ4LDIxICsxNDgsMjEgQEAKICAgcHJpdmF0ZQogICAgIC8vIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhICd0eXBlIG92ZXJyaWRlJwogICAgIC8vIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUgYm9vbGVhbiBmaWVsZCBjYXNlLgotICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggY29uc3QgZmllbGQgOiBJRmllbGQ7IHR5cGVPdmVycmlkZSA6IEJ5dGUpOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggY29uc3QgZmllbGQgOiBUVGhyaWZ0RmllbGQ7IHR5cGVPdmVycmlkZSA6IEJ5dGUpOwogCiAgIHB1YmxpYwotICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IElGaWVsZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBJTWFwKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBJTGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0ICk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOyBvdmVycmlkZTsKQEAgLTE5NCwxNyArMTk0LDE3IEBACiAgICAgY2xhc3MgcHJvY2VkdXJlIGZpeGVkTG9uZ1RvQnl0ZXMoIGNvbnN0IG4gOiBJbnQ2NDsgdmFyIGJ1ZiA6IFRCeXRlcyk7CiAKICAgcHVibGljCi0gICAgZnVuY3Rpb24gIFJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiAgUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gIFJlYWRGaWVsZEJlZ2luOiBJRmllbGQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uICBSZWFkTWFwQmVnaW46IElNYXA7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uICBSZWFkTGlzdEJlZ2luOiBJTGlzdDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gIFJlYWRTZXRCZWdpbjogSVNldDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7CiAgICAgZnVuY3Rpb24gIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiAgUmVhZEJ5dGU6IFNob3J0SW50OyBvdmVycmlkZTsKQEAgLTI3Myw3ICsyNzMsNyBAQAogICBsYXN0RmllbGRJZF8gOj0gMDsKICAgbGFzdEZpZWxkXyA6PSBUU3RhY2s8SW50ZWdlcj4uQ3JlYXRlOwogCi0gIGJvb2xlYW5GaWVsZF8gOj0gbmlsOworICBJbml0KCBib29sZWFuRmllbGRfLCAnJywgVFR5cGUuU3RvcCwgMCk7CiAgIGJvb2xWYWx1ZV8gOj0gdW51c2VkOwogZW5kOwogCkBAIC0yOTMsNyArMjkzLDcgQEAKIGJlZ2luCiAgIGxhc3RGaWVsZF8uQ2xlYXIoKTsKICAgbGFzdEZpZWxkSWRfIDo9IDA7Ci0gIGJvb2xlYW5GaWVsZF8gOj0gbmlsOworICBJbml0KCBib29sZWFuRmllbGRfLCAnJywgVFR5cGUuU3RvcCwgMCk7CiAgIGJvb2xWYWx1ZV8gOj0gdW51c2VkOwogZW5kOwogCkBAIC0zMDEsMTEgKzMwMSw4IEBACiAvLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KIC8vIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byBXcml0ZSBhIGJ5dGUuCiBwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCeXRlRGlyZWN0KCBjb25zdCBiIDogQnl0ZSk7Ci12YXIgZGF0YSA6IFRCeXRlczsKIGJlZ2luCi0gIFNldExlbmd0aCggZGF0YSwgMSk7Ci0gIGRhdGFbMF0gOj0gYjsKLSAgVHJhbnNwb3J0LldyaXRlKCBkYXRhKTsKKyAgVHJhbnNwb3J0LldyaXRlKCBAYiwgU2l6ZU9mKGIpKTsKIGVuZDsKIAogCkBAIC0zNDQsNyArMzQxLDcgQEAKIAogLy8gV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQogLy8gcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCi1wcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogSU1lc3NhZ2UpOworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKIHZhciB2ZXJzaW9uQW5kVHlwZSA6IEJ5dGU7CiBiZWdpbgogICBSZXNldDsKQEAgLTM2Miw3ICszNTksNyBAQAogLy8gV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZSBpdCBhcyBhbgogLy8gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGdldCB0aGUKIC8vIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgotcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CiBiZWdpbgogICBsYXN0RmllbGRfLlB1c2gobGFzdEZpZWxkSWRfKTsKICAgbGFzdEZpZWxkSWRfIDo9IDA7CkBAIC0zODAsNyArMzc3LDcgQEAKIC8vIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQogLy8gY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwgdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluCiAvLyB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUgZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KLXByb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBJRmllbGQpOworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CiBiZWdpbgogICBjYXNlIGZpZWxkLlR5cGVfIG9mCiAgICAgVFR5cGUuQm9vbF8gOiBib29sZWFuRmllbGRfIDo9IGZpZWxkOyAvLyB3ZSB3YW50IHRvIHBvc3NpYmx5IGluY2x1ZGUgdGhlIHZhbHVlLCBzbyB3ZSdsbCB3YWl0LgpAQCAtMzkyLDcgKzM4OSw3IEBACiAKIC8vIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhICd0eXBlIG92ZXJyaWRlJwogLy8gb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZSBib29sZWFuIGZpZWxkIGNhc2UuCi1wcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGNvbnN0IGZpZWxkIDogSUZpZWxkOyB0eXBlT3ZlcnJpZGUgOiBCeXRlKTsKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggY29uc3QgZmllbGQgOiBUVGhyaWZ0RmllbGQ7IHR5cGVPdmVycmlkZSA6IEJ5dGUpOwogdmFyIHR5cGVUb1dyaXRlIDogQnl0ZTsKIGJlZ2luCiAgIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KQEAgLTQyNSw3ICs0MjIsNyBAQAogCiAvLyBXcml0ZSBhIG1hcCBoZWFkZXIuIElmIHRoZSBtYXAgaXMgZW1wdHksIG9taXQgdGhlIGtleSBhbmQgdmFsdWUgdHlwZQogLy8gaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgotcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogSU1hcCk7Citwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKIHZhciBrZXksIHZhbCA6IEJ5dGU7CiBiZWdpbgogICBpZiAobWFwLkNvdW50ID0gMCkKQEAgLTQ0MCwxNCArNDM3LDE0IEBACiAKIAogLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KLXByb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogSUxpc3QpOworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CiBiZWdpbgogICBXcml0ZUNvbGxlY3Rpb25CZWdpbiggbGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCk7CiBlbmQ7CiAKIAogLy8gV3JpdGUgYSBzZXQgaGVhZGVyLgotcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7CiBiZWdpbgogICBXcml0ZUNvbGxlY3Rpb25CZWdpbiggc2V0Xy5FbGVtZW50VHlwZSwgc2V0Xy5Db3VudCk7CiBlbmQ7CkBAIC00NjQsMTAgKzQ2MSwxMCBAQAogICB0aGVuIGJ0IDo9IFR5cGVzLkJPT0xFQU5fVFJVRQogICBlbHNlIGJ0IDo9IFR5cGVzLkJPT0xFQU5fRkFMU0U7CiAKLSAgaWYgYm9vbGVhbkZpZWxkXyA8PiBuaWwgdGhlbiBiZWdpbgorICBpZiBib29sZWFuRmllbGRfLlR5cGVfID0gVFR5cGUuQm9vbF8gdGhlbiBiZWdpbgogICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAogICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKCBib29sZWFuRmllbGRfLCBCeXRlKGJ0KSk7Ci0gICAgYm9vbGVhbkZpZWxkXyA6PSBuaWw7CisgICAgYm9vbGVhbkZpZWxkXy5UeXBlXyA6PSBUVHlwZS5TdG9wOwogICBlbmQKICAgZWxzZSBiZWdpbgogICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3QgV3JpdGUgdGhlIHZhbHVlLgpAQCAtNjQyLDcgKzYzOSw3IEBACiAKIAogLy8gUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgotZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbiA6IElNZXNzYWdlOworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbiA6IFRUaHJpZnRNZXNzYWdlOwogdmFyIHByb3RvY29sSWQsIHZlcnNpb25BbmRUeXBlLCB2ZXJzaW9uLCB0eXBlXyA6IEJ5dGU7CiAgICAgc2VxaWQgOiBJbnRlZ2VyOwogICAgIG1zZ05tIDogU3RyaW5nOwpAQCAtNjUxLDI5ICs2NDgsMjkgQEAKIAogICBwcm90b2NvbElkIDo9IEJ5dGUoIFJlYWRCeXRlKTsKICAgaWYgKHByb3RvY29sSWQgPD4gUFJPVE9DT0xfSUQpCi0gIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggJ0V4cGVjdGVkIHByb3RvY29sIGlkICcgKyBJbnRUb0hleChQUk9UT0NPTF9JRCwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgYnV0IGdvdCAnICsgSW50VG9IZXgocHJvdG9jb2xJZCwyKSk7CisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoICdFeHBlY3RlZCBwcm90b2NvbCBpZCAnICsgSW50VG9IZXgoUFJPVE9DT0xfSUQsMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyBidXQgZ290ICcgKyBJbnRUb0hleChwcm90b2NvbElkLDIpKTsKIAogICB2ZXJzaW9uQW5kVHlwZSA6PSBCeXRlKCBSZWFkQnl0ZSk7CiAgIHZlcnNpb24gICAgICAgIDo9IEJ5dGUoIHZlcnNpb25BbmRUeXBlIGFuZCBWRVJTSU9OX01BU0spOwogICBpZiAodmVyc2lvbiA8PiBWRVJTSU9OKQotICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoICdFeHBlY3RlZCB2ZXJzaW9uICcgK0ludFRvU3RyKFZFUlNJT04pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyBidXQgZ290ICcgKyBJbnRUb1N0cih2ZXJzaW9uKSk7CisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoICdFeHBlY3RlZCB2ZXJzaW9uICcgK0ludFRvU3RyKFZFUlNJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgYnV0IGdvdCAnICsgSW50VG9TdHIodmVyc2lvbikpOwogCiAgIHR5cGVfIDo9IEJ5dGUoICh2ZXJzaW9uQW5kVHlwZSBzaHIgVFlQRV9TSElGVF9BTU9VTlQpIGFuZCBUWVBFX0JJVFMpOwogICBzZXFpZCA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOwogICBtc2dObSA6PSBSZWFkU3RyaW5nOwotICByZXN1bHQgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZSggbXNnTm0sIFRNZXNzYWdlVHlwZSh0eXBlXyksIHNlcWlkKTsKKyAgSW5pdCggcmVzdWx0LCBtc2dObSwgVE1lc3NhZ2VUeXBlKHR5cGVfKSwgc2VxaWQpOwogZW5kOwogCiAKIC8vIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgogLy8gb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgotZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OwogYmVnaW4KICAgbGFzdEZpZWxkXy5QdXNoKCBsYXN0RmllbGRJZF8pOwogICBsYXN0RmllbGRJZF8gOj0gMDsKLSAgcmVzdWx0IDo9IFRTdHJ1Y3RJbXBsLkNyZWF0ZSgnJyk7CisgIEluaXQoIHJlc3VsdCk7CiBlbmQ7CiAKIApAQCAtNjg3LDcgKzY4NCw3IEBACiAKIAogLy8gUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCi1mdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbjogSUZpZWxkOworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKIHZhciB0eXBlXyA6IEJ5dGU7CiAgICAgZmllbGRJZCwgbW9kaWZpZXIgOiBTaG9ydEludDsKIGJlZ2luCkBAIC02OTUsNyArNjkyLDcgQEAKIAogICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCiAgIGlmIHR5cGVfID0gQnl0ZShUeXBlcy5TVE9QKSB0aGVuIGJlZ2luCi0gICAgcmVzdWx0IDo9IFRGaWVsZEltcGwuQ3JlYXRlKCAnJywgVFR5cGUuU3RvcCwgMCk7CisgICAgSW5pdCggcmVzdWx0LCAnJywgVFR5cGUuU3RvcCwgMCk7CiAgICAgRXhpdDsKICAgZW5kOwogCkBAIC03MDUsNyArNzAyLDcgQEAKICAgdGhlbiBmaWVsZElkIDo9IFJlYWRJMTYgICAgLy8gbm90IGEgZGVsdGEuIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLgogICBlbHNlIGZpZWxkSWQgOj0gU2hvcnRJbnQoIGxhc3RGaWVsZElkXyArIG1vZGlmaWVyKTsgLy8gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgogCi0gIHJlc3VsdCA6PSBURmllbGRJbXBsLkNyZWF0ZSggJycsIGdldFRUeXBlKEJ5dGUodHlwZV8gYW5kICQwRikpLCBmaWVsZElkKTsKKyAgSW5pdCggcmVzdWx0LCAnJywgZ2V0VFR5cGUoQnl0ZSh0eXBlXyBhbmQgJDBGKSksIGZpZWxkSWQpOwogCiAgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCiAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KQEAgLTcyMyw3ICs3MjAsNyBAQAogLy8gUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQogLy8gYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKIC8vICJjb3JyZWN0IiB0eXBlcy4KLWZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbjogSU1hcDsKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsKIHZhciBzaXplIDogSW50ZWdlcjsKICAgICBrZXlBbmRWYWx1ZVR5cGUgOiBCeXRlOwogICAgIGtleSwgdmFsIDogVFR5cGU7CkBAIC03MzUsNyArNzMyLDcgQEAKIAogICBrZXkgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBzaHIgNCkpOwogICB2YWwgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBhbmQgJEYpKTsKLSAgcmVzdWx0IDo9IFRNYXBJbXBsLkNyZWF0ZSgga2V5LCB2YWwsIHNpemUpOworICBJbml0KCByZXN1bHQsIGtleSwgdmFsLCBzaXplKTsKICAgQVNTRVJUKCAocmVzdWx0LktleVR5cGUgPSBrZXkpIGFuZCAocmVzdWx0LlZhbHVlVHlwZSA9IHZhbCkpOwogZW5kOwogCkBAIC03NDQsNyArNzQxLDcgQEAKIC8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgogLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAkRiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCiAvLyB0cnVlIHNpemUuCi1mdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luOiBJTGlzdDsKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OwogdmFyIHNpemVfYW5kX3R5cGUgOiBCeXRlOwogICAgIHNpemUgOiBJbnRlZ2VyOwogICAgIHR5cGVfIDogVFR5cGU7CkBAIC03NTYsNyArNzUzLDcgQEAKICAgdGhlbiBzaXplIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CiAKICAgdHlwZV8gOj0gZ2V0VFR5cGUoIHNpemVfYW5kX3R5cGUpOwotICByZXN1bHQgOj0gVExpc3RJbXBsLkNyZWF0ZSggdHlwZV8sIHNpemUpOworICBJbml0KCByZXN1bHQsIHR5cGVfLCBzaXplKTsKIGVuZDsKIAogCkBAIC03NjQsNyArNzYxLDcgQEAKIC8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCiAvLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlICRGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKIC8vIHRydWUgc2l6ZS4KLWZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbjogSVNldDsKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKIHZhciBzaXplX2FuZF90eXBlIDogQnl0ZTsKICAgICBzaXplIDogSW50ZWdlcjsKICAgICB0eXBlXyA6IFRUeXBlOwpAQCAtNzc2LDcgKzc3Myw3IEBACiAgIHRoZW4gc2l6ZSA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOwogCiAgIHR5cGVfIDo9IGdldFRUeXBlKCBzaXplX2FuZF90eXBlKTsKLSAgcmVzdWx0IDo9IFRTZXRJbXBsLkNyZWF0ZSggdHlwZV8sIHNpemUpOworICBJbml0KCByZXN1bHQsIHR5cGVfLCBzaXplKTsKIGVuZDsKIAogCkBAIC03OTcsMTEgKzc5NCw4IEBACiAKIC8vIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRCeXRlOiBTaG9ydEludDsKLXZhciBkYXRhIDogVEJ5dGVzOwogYmVnaW4KLSAgU2V0TGVuZ3RoKCBkYXRhLCAxKTsKLSAgVHJhbnNwb3J0LlJlYWRBbGwoIGRhdGEsIDAsIDEpOwotICByZXN1bHQgOj0gZGF0YVswXTsKKyAgVHJhbnNwb3J0LlJlYWRBbGwoIEByZXN1bHQsIFNpemVPZihyZXN1bHQpLCAwLCAxKTsKIGVuZDsKIAogCkBAIC05NjAsNyArOTU0LDcgQEAKICAgdGN0IDo9IFR5cGVzKCB0eXBlXyBhbmQgJDBGKTsKICAgaWYgdGN0IGluIFtMb3coVHlwZXMpLi5IaWdoKFR5cGVzKV0KICAgdGhlbiByZXN1bHQgOj0gdGNvbXBhY3RUeXBlVG9UeXBlW3RjdF0KLSAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCdkb24nJ3Qga25vdyB3aGF0IHR5cGU6ICcrSW50VG9TdHIoT3JkKHRjdCkpKTsKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ2RvbicndCBrbm93IHdoYXQgdHlwZTogJytJbnRUb1N0cihPcmQodGN0KSkpOwogZW5kOwogCiAKQEAgLTk2OSw3ICs5NjMsNyBAQAogYmVnaW4KICAgaWYgdHR5cGUgaW4gVkFMSURfVFRZUEVTCiAgIHRoZW4gcmVzdWx0IDo9IEJ5dGUoIHR0eXBlVG9Db21wYWN0VHlwZVt0dHlwZV0pCi0gIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSgnZG9uJyd0IGtub3cgd2hhdCB0eXBlOiAnK0ludFRvU3RyKE9yZCh0dHlwZSkpKTsKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ2RvbicndCBrbm93IHdoYXQgdHlwZTogJytJbnRUb1N0cihPcmQodHR5cGUpKSk7CiBlbmQ7CiAKIApAQCAtMTA5NCwxMSArMTA4OCwyOSBAQAogeyRFTkRJRn0KIAogCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFVuaXRUZXN0OwordmFyIHcgOiBXT1JEOworY29uc3QgRlBVX0NXX0RFTk9STUFMSVpFRCA9ICQwMDAyOworYmVnaW4KKyAgdyA6PSBHZXQ4MDg3Q1c7CisgIHRyeQorICAgIFNldDgwODdDVyggdyBvciBGUFVfQ1dfREVOT1JNQUxJWkVEKTsKKworICAgIFRlc3REb3VibGVUb0ludDY0Qml0czsKKyAgICBUZXN0WmlnWmFnOworICAgIFRlc3RMb25nQnl0ZXM7CisKKyAgZmluYWxseQorICAgIFNldDgwODdDVyggdyk7CisgIGVuZDsKK2VuZDsKK3skRU5ESUZ9CisKKwogaW5pdGlhbGl6YXRpb24KICAgeyRJRkRFRiBEZWJ1Z30KLSAgVGVzdERvdWJsZVRvSW50NjRCaXRzOwotICBUZXN0WmlnWmFnOwotICBUZXN0TG9uZ0J5dGVzOworICBVbml0VGVzdDsKICAgeyRFTkRJRn0KIAogZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzCmluZGV4IGY0OTFmNTMuLjMwNjAwYWEgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5KU09OLnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMKQEAgLTI0LDYgKzI0LDcgQEAKIGludGVyZmFjZQogCiB1c2VzCisgIENoYXJhY3RlciwKICAgQ2xhc3NlcywKICAgU3lzVXRpbHMsCiAgIE1hdGgsCkBAIC0xMDIsNyArMTAzLDcgQEAKIAogICAgICAgcHJpdmF0ZQogICAgICAgICBGSGFzRGF0YSA6IEJvb2xlYW47Ci0gICAgICAgIEZEYXRhICAgIDogVEJ5dGVzOworICAgICAgICBGRGF0YSAgICA6IEJ5dGU7CiAKICAgICAgIHB1YmxpYwogICAgICAgICAvLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCkBAIC0xNjgsMTggKzE2OSwxOCBAQAogCiAgIHB1YmxpYwogICAgIC8vIElQcm90b2NvbAotICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgYU1zZyA6IElNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBhTXNnIDogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IElTdHJ1Y3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBJRmllbGQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogSU1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogSUxpc3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogSVNldCApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgb3ZlcnJpZGU7CkBAIC0xOTAsMTcgKzE5MSwxNyBAQAogICAgIHByb2NlZHVyZSBXcml0ZVN0cmluZyggY29uc3Qgczogc3RyaW5nICk7ICAgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyBvdmVycmlkZTsKICAgICAvLwotICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogSVN0cnVjdDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IElGaWVsZDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IElNYXA7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogSUxpc3Q7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBJU2V0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOwogICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7IG92ZXJyaWRlOwpAQCAtMzA5LDcgKzMxMCw3IEBACiAgICAgVFR5cGUuU2V0XzogICAgIHJlc3VsdCA6PSBOQU1FX1NFVDsKICAgICBUVHlwZS5MaXN0OiAgICAgcmVzdWx0IDo9IE5BTUVfTElTVDsKICAgZWxzZQotICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsICdVbnJlY29nbml6ZWQgdHlwZSAoJytJbnRUb1N0cihPcmQodHlwZUlEKSkrJyknKTsKKyAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZC5DcmVhdGUoJ1VucmVjb2duaXplZCB0eXBlICgnK0ludFRvU3RyKE9yZCh0eXBlSUQpKSsnKScpOwogICBlbmQ7CiBlbmQ7CiAKQEAgLTMyNyw3ICszMjgsNyBAQAogICBlbHNlIGlmIG5hbWUgPSBOQU1FX01BUCAgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5NYXAKICAgZWxzZSBpZiBuYW1lID0gTkFNRV9MSVNUICAgdGhlbiByZXN1bHQgOj0gVFR5cGUuTGlzdAogICBlbHNlIGlmIG5hbWUgPSBOQU1FX1NFVCAgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5TZXRfCi0gIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwgJ1VucmVjb2duaXplZCB0eXBlICgnK25hbWUrJyknKTsKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZC5DcmVhdGUoJ1VucmVjb2duaXplZCB0eXBlICgnK25hbWUrJyknKTsKIGVuZDsKIAogCkBAIC00MzYsMjEgKzQzNywxOSBAQAogICBpZiBGSGFzRGF0YQogICB0aGVuIEZIYXNEYXRhIDo9IEZBTFNFCiAgIGVsc2UgYmVnaW4KLSAgICBTZXRMZW5ndGgoIEZEYXRhLCAxKTsKLSAgICBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LlJlYWRBbGwoIEZEYXRhLCAwLCAxKTsKKyAgICBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LlJlYWRBbGwoIEBGRGF0YSwgU2l6ZU9mKEZEYXRhKSwgMCwgMSk7CiAgIGVuZDsKLSAgcmVzdWx0IDo9IEZEYXRhWzBdOworICByZXN1bHQgOj0gRkRhdGE7CiBlbmQ7CiAKIAogZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuVExvb2thaGVhZFJlYWRlci5QZWVrIDogQnl0ZTsKIGJlZ2luCiAgIGlmIG5vdCBGSGFzRGF0YSB0aGVuIGJlZ2luCi0gICAgU2V0TGVuZ3RoKCBGRGF0YSwgMSk7Ci0gICAgSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5SZWFkQWxsKCBGRGF0YSwgMCwgMSk7CisgICAgSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5SZWFkQWxsKCBARkRhdGEsIFNpemVPZihGRGF0YSksIDAsIDEpOwogICAgIEZIYXNEYXRhIDo9IFRSVUU7CiAgIGVuZDsKLSAgcmVzdWx0IDo9IEZEYXRhWzBdOworICByZXN1bHQgOj0gRkRhdGE7CiBlbmQ7CiAKIApAQCAtNTA1LDcgKzUwNCw3IEBACiBiZWdpbgogICBjaCA6PSBGUmVhZGVyLlJlYWQ7CiAgIGlmIChjaCA8PiBiKQotICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdVbmV4cGVjdGVkIGNoYXJhY3RlciAoJytDaGFyKGNoKSsnKScpOworICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnVW5leHBlY3RlZCBjaGFyYWN0ZXIgKCcrQ2hhcihjaCkrJyknKTsKIGVuZDsKIAogCkBAIC01MTUsNyArNTE0LDcgQEAKICAgaSA6PSBTdHJUb0ludERlZiggJyQwJytDaGFyKGNoKSwgLTEpOwogICBpZiAoMCA8PSBpKSBhbmQgKGkgPCAkMTApCiAgIHRoZW4gcmVzdWx0IDo9IGkKLSAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciAoJytDaGFyKGNoKSsnKScpOworICBlbHNlIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciAoJytDaGFyKGNoKSsnKScpOwogZW5kOwogCiAKQEAgLTY4MCw3ICs2NzksNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgYU1zZyA6IElNZXNzYWdlKTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgYU1zZyA6IFRUaHJpZnRNZXNzYWdlKTsKIGJlZ2luCiAgIFJlc2V0Q29udGV4dFN0YWNrOyAgLy8gVEhSSUZULTE0NzMKIApAQCAtNjk5LDcgKzY5OCw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CiBiZWdpbgogICBXcml0ZUpTT05PYmplY3RTdGFydDsKIGVuZDsKQEAgLTcxMSw3ICs3MTAsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkIDogSUZpZWxkKTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkIDogVFRocmlmdEZpZWxkKTsKIGJlZ2luCiAgIFdyaXRlSlNPTkludGVnZXIoZmllbGQuSUQpOwogICBXcml0ZUpTT05PYmplY3RTdGFydDsKQEAgLTczMCw3ICs3MjksNyBAQAogICAvLyBub3RoaW5nIHRvIGRvCiBlbmQ7CiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CiBiZWdpbgogICBXcml0ZUpTT05BcnJheVN0YXJ0OwogICBXcml0ZUpTT05TdHJpbmcoIEdldFR5cGVOYW1lRm9yVHlwZUlEKCBtYXAuS2V5VHlwZSkpOwpAQCAtNzQ3LDcgKzc0Niw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBJTGlzdCk7Citwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKIGJlZ2luCiAgIFdyaXRlSlNPTkFycmF5U3RhcnQ7CiAgIFdyaXRlSlNPTlN0cmluZyggR2V0VHlwZU5hbWVGb3JUeXBlSUQoIGxpc3QuRWxlbWVudFR5cGUpKTsKQEAgLTc2MSw3ICs3NjAsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0KTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0KTsKIGJlZ2luCiAgIFdyaXRlSlNPTkFycmF5U3RhcnQ7CiAgIFdyaXRlSlNPTlN0cmluZyggR2V0VHlwZU5hbWVGb3JUeXBlSUQoIHNldF8uRWxlbWVudFR5cGUpKTsKQEAgLTgyMSw5ICs4MjAsMTIgQEAKIHZhciBidWZmZXIgOiBUTWVtb3J5U3RyZWFtOwogICAgIGNoICA6IEJ5dGU7CiAgICAgd2NoIDogV29yZDsKKyAgICBoaWdoU3Vyb2dhdGU6IENoYXI7CisgICAgc3Vycm9nYXRlUGFpcnM6IEFycmF5WzAuLjFdIG9mIENoYXI7CiAgICAgb2ZmIDogSW50ZWdlcjsKICAgICB0bXAgOiBUQnl0ZXM7CiBiZWdpbgorICBoaWdoU3Vyb2dhdGUgOj0gIzA7CiAgIGJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKICAgdHJ5CiAgICAgaWYgbm90IHNraXBDb250ZXh0CkBAIC04NDksNyArODUxLDcgQEAKICAgICAgIHRoZW4gYmVnaW4KICAgICAgICAgb2ZmIDo9IFBvcyggQ2hhcihjaCksIEVTQ0FQRV9DSEFSUyk7CiAgICAgICAgIGlmIG9mZiA8IDEKLSAgICAgICAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnRXhwZWN0ZWQgY29udHJvbCBjaGFyJyk7CisgICAgICAgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBjb250cm9sIGNoYXInKTsKICAgICAgICAgY2ggOj0gQnl0ZSggRVNDQVBFX0NIQVJfVkFMU1tvZmZdKTsKICAgICAgICAgYnVmZmVyLldyaXRlKCBjaCwgMSk7CiAgICAgICAgIENvbnRpbnVlOwpAQCAtODYyLDExICs4NjQsMzEgQEAKICAgICAgICAgICAgKyAoSGV4VmFsKHRtcFsxXSkgc2hsIDgpCiAgICAgICAgICAgICsgKEhleFZhbCh0bXBbMl0pIHNobCA0KQogICAgICAgICAgICArICBIZXhWYWwodG1wWzNdKTsKKwogICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIFVURjggYnl0ZXMgZnJvbSBpdCwgdG8gYmUgZGVjb2RlZCBsYXRlcgotICAgICAgdG1wIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKENoYXIod2NoKSk7Ci0gICAgICBidWZmZXIuV3JpdGUoIHRtcFswXSwgbGVuZ3RoKHRtcCkpOworICAgICAgaWYgQ2hhclV0aWxzLklzSGlnaFN1cnJvZ2F0ZShjaGFyKHdjaCkpIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgaGlnaFN1cm9nYXRlIDw+ICMwCisgICAgICAgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXInKTsKKyAgICAgICAgaGlnaFN1cm9nYXRlIDo9IGNoYXIod2NoKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBDaGFyVXRpbHMuSXNMb3dTdXJyb2dhdGUoY2hhcih3Y2gpKSB0aGVuIGJlZ2luCisgICAgICAgIGlmIGhpZ2hTdXJvZ2F0ZSA9ICMwCisgICAgICAgIHRoZW4gVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyJyk7CisgICAgICAgIHN1cnJvZ2F0ZVBhaXJzWzBdIDo9IGhpZ2hTdXJvZ2F0ZTsKKyAgICAgICAgc3Vycm9nYXRlUGFpcnNbMV0gOj0gY2hhcih3Y2gpOworICAgICAgICB0bXAgOj0gVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoc3Vycm9nYXRlUGFpcnMpOworICAgICAgICBidWZmZXIuV3JpdGUoIHRtcFswXSwgTGVuZ3RoKHRtcCkpOworICAgICAgICBoaWdoU3Vyb2dhdGUgOj0gIzA7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgdG1wIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKENoYXIod2NoKSk7CisgICAgICAgIGJ1ZmZlci5Xcml0ZSggdG1wWzBdLCBMZW5ndGgodG1wKSk7CisgICAgICBlbmQ7CiAgICAgZW5kOwogCisgICAgaWYgaGlnaFN1cm9nYXRlIDw+ICMwCisgICAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0V4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhcicpOworCiAgICAgU2V0TGVuZ3RoKCByZXN1bHQsIGJ1ZmZlci5TaXplKTsKICAgICBpZiBidWZmZXIuU2l6ZSA+IDAgdGhlbiBNb3ZlKCBidWZmZXIuTWVtb3J5XiwgcmVzdWx0WzBdLCBMZW5ndGgocmVzdWx0KSk7CiAKQEAgLTkxOSw4ICs5NDEsNyBAQAogICAgIHJlc3VsdCA6PSBTdHJUb0ludDY0KHN0cik7CiAgIGV4Y2VwdAogICAgIG9uIGU6RXhjZXB0aW9uIGRvIGJlZ2luCi0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEgKCcrc3RyKycpICgnK2UuTWVzc2FnZSsnKScpOworICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhICgnK3N0cisnKSAoJytlLk1lc3NhZ2UrJyknKTsKICAgICBlbmQ7CiAgIGVuZDsKIGVuZDsKQEAgLTk0Miw3ICs5NjMsNyBAQAogICAgIGFuZCBub3QgTWF0aC5Jc0luZmluaXRlKGR1YikKICAgICB0aGVuIGJlZ2luCiAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiAgU2VsZiBjYXNlCi0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQnKTsKKyAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQnKTsKICAgICBlbmQ7CiAgICAgcmVzdWx0IDo9IGR1YjsKICAgICBFeGl0OwpAQCAtOTU3LDggKzk3OCw3IEBACiAgICAgcmVzdWx0IDo9IFN0clRvRmxvYXQoIHN0ciwgSU5WQVJJQU5UX0NVTFRVUkUpOwogICBleGNlcHQKICAgICBvbiBlOkV4Y2VwdGlvbgotICAgIGRvIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSAoJytzdHIrJykgKCcrZS5NZXNzYWdlKycpJyk7CisgICAgZG8gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhICgnK3N0cisnKSAoJytlLk1lc3NhZ2UrJyknKTsKICAgZW5kOwogZW5kOwogCkBAIC0xMDI5LDE1ICsxMDQ5LDE1IEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7CitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsKIGJlZ2luCiAgIFJlc2V0Q29udGV4dFN0YWNrOyAgLy8gVEhSSUZULTE0NzMKIAotICByZXN1bHQgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZTsKKyAgSW5pdCggcmVzdWx0KTsKICAgUmVhZEpTT05BcnJheVN0YXJ0OwogCiAgIGlmIFJlYWRKU09OSW50ZWdlciA8PiBWRVJTSU9OCi0gIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAnTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uJyk7CisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoJ01lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLicpOwogCiAgIHJlc3VsdC5OYW1lICA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKCBGQUxTRSkpOwogICByZXN1bHQuVHlwZV8gOj0gVE1lc3NhZ2VUeXBlKCBSZWFkSlNPTkludGVnZXIpOwpAQCAtMTA1MSwxMCArMTA3MSwxMCBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RCZWdpbiA6IElTdHJ1Y3QgOworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luIDogVFRocmlmdFN0cnVjdCA7CiBiZWdpbgogICBSZWFkSlNPTk9iamVjdFN0YXJ0OwotICByZXN1bHQgOj0gVFN0cnVjdEltcGwuQ3JlYXRlKCcnKTsKKyAgSW5pdCggcmVzdWx0KTsKIGVuZDsKIAogCkBAIC0xMDY0LDExICsxMDg0LDExIEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW4gOiBJRmllbGQ7CitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbiA6IFRUaHJpZnRGaWVsZDsKIHZhciBjaCA6IEJ5dGU7CiAgICAgc3RyIDogc3RyaW5nOwogYmVnaW4KLSAgcmVzdWx0IDo9IFRGaWVsZEltcGwuQ3JlYXRlOworICBJbml0KCByZXN1bHQpOwogICBjaCA6PSBGUmVhZGVyLlBlZWs7CiAgIGlmIGNoID0gUkJSQUNFWzBdCiAgIHRoZW4gcmVzdWx0LlR5cGVfIDo9IFRUeXBlLlN0b3AKQEAgLTEwODgsMTAgKzExMDgsMTAgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTWFwQmVnaW4gOiBJTWFwOworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZE1hcEJlZ2luIDogVFRocmlmdE1hcDsKIHZhciBzdHIgOiBzdHJpbmc7CiBiZWdpbgotICByZXN1bHQgOj0gVE1hcEltcGwuQ3JlYXRlOworICBJbml0KCByZXN1bHQpOwogICBSZWFkSlNPTkFycmF5U3RhcnQ7CiAKICAgc3RyIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoRkFMU0UpKTsKQEAgLTExMTIsMTAgKzExMzIsMTAgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luIDogSUxpc3Q7CitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luIDogVFRocmlmdExpc3Q7CiB2YXIgc3RyIDogc3RyaW5nOwogYmVnaW4KLSAgcmVzdWx0IDo9IFRMaXN0SW1wbC5DcmVhdGU7CisgIEluaXQoIHJlc3VsdCk7CiAgIFJlYWRKU09OQXJyYXlTdGFydDsKIAogICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyhGQUxTRSkpOwpAQCAtMTEzMCwxMCArMTE1MCwxMCBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbiA6IElTZXQ7CitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW4gOiBUVGhyaWZ0U2V0OwogdmFyIHN0ciA6IHN0cmluZzsKIGJlZ2luCi0gIHJlc3VsdCA6PSBUU2V0SW1wbC5DcmVhdGU7CisgIEluaXQoIHJlc3VsdCk7CiAgIFJlYWRKU09OQXJyYXlTdGFydDsKIAogICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyhGQUxTRSkpOwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcwppbmRleCAxOGIzOWI1Li45M2EzODM4IDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcwpAQCAtNzEsNyArNzEsNyBAQAogICAgIHsgUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFNFUEFSQVRPUi4KICAgICAgIEFyZ3M6IFRoZSBvcmlnaW5hbCBtZXNzYWdlLgogICAgIH0KLSAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogSU1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKICAgZW5kOwogCiAKQEAgLTg2LDE0ICs4NiwxNCBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7Citwcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOwogLy8gUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi4KLXZhciBuZXdNc2cgOiBJTWVzc2FnZTsKK3ZhciBuZXdNc2cgOiBUVGhyaWZ0TWVzc2FnZTsKIGJlZ2luCiAgIGNhc2UgbXNnLlR5cGVfIG9mCiAgICAgVE1lc3NhZ2VUeXBlLkNhbGwsCiAgICAgVE1lc3NhZ2VUeXBlLk9uZXdheSA6IGJlZ2luCi0gICAgICBuZXdNc2cgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZSggRlNlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbXNnLk5hbWUsIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKKyAgICAgIEluaXQoIG5ld01zZywgRlNlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbXNnLk5hbWUsIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKICAgICAgIGluaGVyaXRlZCBXcml0ZU1lc3NhZ2VCZWdpbiggbmV3TXNnKTsKICAgICBlbmQ7CiAKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wucGFzCmluZGV4IDAxYjExYTguLjM2NTA5Y2EgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLnBhcwpAQCAtMjcsNiArMjcsNyBAQAogICBDbGFzc2VzLAogICBTeXNVdGlscywKICAgQ29udG5ycywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiwKICAgVGhyaWZ0LlN0cmVhbSwKICAgVGhyaWZ0LkNvbGxlY3Rpb25zLAogICBUaHJpZnQuVHJhbnNwb3J0OwpAQCAtNzAsNyArNzEsNDAgQEAKIAogdHlwZQogICBJUHJvdG9jb2wgPSBpbnRlcmZhY2U7Ci0gIElTdHJ1Y3QgPSBpbnRlcmZhY2U7CisKKyAgVFRocmlmdE1lc3NhZ2UgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgICAgVHlwZV86IFRNZXNzYWdlVHlwZTsKKyAgICBTZXFJRDogSW50ZWdlcjsKKyAgZW5kOworCisgIFRUaHJpZnRTdHJ1Y3QgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgIGVuZDsKKworICBUVGhyaWZ0RmllbGQgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgICAgVHlwZV86IFRUeXBlOworICAgIElkOiBTbWFsbEludDsKKyAgZW5kOworCisgIFRUaHJpZnRMaXN0ID0gcmVjb3JkCisgICAgRWxlbWVudFR5cGU6IFRUeXBlOworICAgIENvdW50OiBJbnRlZ2VyOworICBlbmQ7CisKKyAgVFRocmlmdE1hcCA9IHJlY29yZAorICAgIEtleVR5cGU6IFRUeXBlOworICAgIFZhbHVlVHlwZTogVFR5cGU7CisgICAgQ291bnQ6IEludGVnZXI7CisgIGVuZDsKKworICBUVGhyaWZ0U2V0ID0gcmVjb3JkCisgICAgRWxlbWVudFR5cGU6IFRUeXBlOworICAgIENvdW50OiBJbnRlZ2VyOworICBlbmQ7CisKKwogCiAgIElQcm90b2NvbEZhY3RvcnkgPSBpbnRlcmZhY2UKICAgICBbJ3s3Q0Q2NEExMC00RTlGLTRFOTktOTNCRi03MDhBMzFGNEE2N0J9J10KQEAgLTgzLDE2NCArMTE3LDQwIEBACiAgICAgZnVuY3Rpb24gQXBwZW5kKGNvbnN0IFZhbHVlOiBJVGhyaWZ0Q29udGFpbmVyKTogVFN0cmluZ0J1aWxkZXI7IG92ZXJsb2FkOwogICBlbmQ7CiAKLSAgVFByb3RvY29sRXhjZXB0aW9uID0gY2xhc3MoIEV4Y2VwdGlvbiApCisgIFRQcm90b2NvbEV4Y2VwdGlvbiA9IGNsYXNzKCBURXhjZXB0aW9uKQogICBwdWJsaWMKICAgICBjb25zdCAvLyBUT0RPKGplbnNnKTogY2hhbmdlIGludG8gZW51bQotICAgICAgVU5LTk9XTiA6IEludGVnZXIgPSAwOwotICAgICAgSU5WQUxJRF9EQVRBIDogSW50ZWdlciA9IDE7Ci0gICAgICBORUdBVElWRV9TSVpFIDogSW50ZWdlciA9IDI7Ci0gICAgICBTSVpFX0xJTUlUIDogSW50ZWdlciA9IDM7Ci0gICAgICBCQURfVkVSU0lPTiA6IEludGVnZXIgPSA0OwotICAgICAgTk9UX0lNUExFTUVOVEVEIDogSW50ZWdlciA9IDU7Ci0gICAgICBERVBUSF9MSU1JVCA6IEludGVnZXIgPSA2OworICAgICAgVU5LTk9XTiA9IDA7CisgICAgICBJTlZBTElEX0RBVEEgPSAxOworICAgICAgTkVHQVRJVkVfU0laRSA9IDI7CisgICAgICBTSVpFX0xJTUlUID0gMzsKKyAgICAgIEJBRF9WRVJTSU9OID0gNDsKKyAgICAgIE5PVF9JTVBMRU1FTlRFRCA9IDU7CisgICAgICBERVBUSF9MSU1JVCA9IDY7CiAgIHByb3RlY3RlZAotICAgIEZUeXBlIDogSW50ZWdlcjsKKyAgICBjb25zdHJ1Y3RvciBIaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOwogICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggdHlwZV86IEludGVnZXIgKTsgb3ZlcmxvYWQ7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCB0eXBlXzogSW50ZWdlcjsgY29uc3QgbXNnOiBzdHJpbmcpOyBvdmVybG9hZDsKKyAgICAvLyBwdXJwb3NlZnVsbHkgaGlkZSBpbmhlcml0ZWQgY29uc3RydWN0b3IKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCB0eXBlXzogSW50ZWdlcik6IFRQcm90b2NvbEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUUHJvdG9jb2xFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIHR5cGVfOiBJbnRlZ2VyOyBjb25zdCBtc2c6IHN0cmluZyk6IFRQcm90b2NvbEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUUHJvdG9jb2xFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKICAgZW5kOwogCi0gIElNYXAgPSBpbnRlcmZhY2UKLSAgICBbJ3szMDUzMUQ5Ny03RTA2LTQyMzMtQjgwMC1DM0Y1M0NDRDIzRTd9J10KLSAgICBmdW5jdGlvbiBHZXRLZXlUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0S2V5VHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRWYWx1ZVR5cGU6IFRUeXBlOwotICAgIHByb2NlZHVyZSBTZXRWYWx1ZVR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldENvdW50KCBWYWx1ZTogSW50ZWdlcik7Ci0gICAgcHJvcGVydHkgS2V5VHlwZTogVFR5cGUgcmVhZCBHZXRLZXlUeXBlIHdyaXRlIFNldEtleVR5cGU7Ci0gICAgcHJvcGVydHkgVmFsdWVUeXBlOiBUVHlwZSByZWFkIEdldFZhbHVlVHlwZSB3cml0ZSBTZXRWYWx1ZVR5cGU7Ci0gICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudCB3cml0ZSBTZXRDb3VudDsKLSAgZW5kOwotCi0gIFRNYXBJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJTWFwKQotICBwcml2YXRlCi0gICAgRlZhbHVlVHlwZTogVFR5cGU7Ci0gICAgRktleVR5cGU6IFRUeXBlOwotICAgIEZDb3VudDogSW50ZWdlcjsKLSAgcHJvdGVjdGVkCi0gICAgZnVuY3Rpb24gR2V0S2V5VHlwZTogVFR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldEtleVR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0VmFsdWVUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0VmFsdWVUeXBlKCBWYWx1ZTogVFR5cGUpOwotICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOwotICAgIHByb2NlZHVyZSBTZXRDb3VudCggVmFsdWU6IEludGVnZXIpOworICAvLyBOZWVkZWQgdG8gcmVtb3ZlIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQgPSBjbGFzcyBhYnN0cmFjdCAoVFByb3RvY29sRXhjZXB0aW9uKQogICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFLZXlUeXBlLCBBVmFsdWVUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOwogICBlbmQ7CiAKLSAgSUxpc3QgPSBpbnRlcmZhY2UKLSAgICBbJ3s2NzYzRTFFQS1BOTM0LTQ0NzItOTA0Ri0wMDgzOTgwQjlCODd9J10KLSAgICBmdW5jdGlvbiBHZXRFbGVtZW50VHlwZTogVFR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldEVsZW1lbnRUeXBlKCBWYWx1ZTogVFR5cGUpOwotICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOwotICAgIHByb2NlZHVyZSBTZXRDb3VudCggVmFsdWU6IEludGVnZXIpOwotICAgIHByb3BlcnR5IEVsZW1lbnRUeXBlOiBUVHlwZSByZWFkIEdldEVsZW1lbnRUeXBlIHdyaXRlIFNldEVsZW1lbnRUeXBlOwotICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQgd3JpdGUgU2V0Q291bnQ7Ci0gIGVuZDsKKyAgVFByb3RvY29sRXhjZXB0aW9uVW5rbm93biA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uTmVnYXRpdmVTaXplID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uU2l6ZUxpbWl0ID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbiA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRQcm90b2NvbEV4Y2VwdGlvbk5vdEltcGxlbWVudGVkID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uRGVwdGhMaW1pdCA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CiAKLSAgVExpc3RJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJTGlzdCkKLSAgcHJpdmF0ZQotICAgIEZFbGVtZW50VHlwZTogVFR5cGU7Ci0gICAgRkNvdW50IDogSW50ZWdlcjsKLSAgcHJvdGVjdGVkCi0gICAgZnVuY3Rpb24gR2V0RWxlbWVudFR5cGU6IFRUeXBlOwotICAgIHByb2NlZHVyZSBTZXRFbGVtZW50VHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKLSAgICBwcm9jZWR1cmUgU2V0Q291bnQoIFZhbHVlOiBJbnRlZ2VyKTsKLSAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBRWxlbWVudFR5cGU6IFRUeXBlOyBBQ291bnQ6IEludGVnZXIpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOwotICBlbmQ7Ci0KLSAgSVNldCA9IGludGVyZmFjZQotICAgIFsne0E4NjcxNzAwLTc1MTQtNEMxRS04QTA1LTYyNzg2ODcyMDA1Rn0nXQotICAgIGZ1bmN0aW9uIEdldEVsZW1lbnRUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0RWxlbWVudFR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldENvdW50KCBWYWx1ZTogSW50ZWdlcik7Ci0gICAgcHJvcGVydHkgRWxlbWVudFR5cGU6IFRUeXBlIHJlYWQgR2V0RWxlbWVudFR5cGUgd3JpdGUgU2V0RWxlbWVudFR5cGU7Ci0gICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudCB3cml0ZSBTZXRDb3VudDsKLSAgZW5kOwotCi0gIFRTZXRJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJU2V0KQotICBwcml2YXRlCi0gICAgRkNvdW50OiBJbnRlZ2VyOwotICAgIEZFbGVtZW50VHlwZTogVFR5cGU7Ci0gIHByb3RlY3RlZAotICAgIGZ1bmN0aW9uIEdldEVsZW1lbnRUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0RWxlbWVudFR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldENvdW50KCBWYWx1ZTogSW50ZWdlcik7Ci0gIHB1YmxpYwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQUVsZW1lbnRUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKLSAgZW5kOwotCi0gIElNZXNzYWdlID0gaW50ZXJmYWNlCi0gICAgWyd7OUUzNjhCNEEtQjFGQS00M0U3LThDRjUtNTZDNjZEMjU2Q0E3fSddCi0gICAgZnVuY3Rpb24gR2V0TmFtZTogc3RyaW5nOwotICAgIHByb2NlZHVyZSBTZXROYW1lKCBjb25zdCBWYWx1ZTogc3RyaW5nKTsKLSAgICBmdW5jdGlvbiBHZXRUeXBlOiBUTWVzc2FnZVR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldFR5cGUoIFZhbHVlOiBUTWVzc2FnZVR5cGUpOwotICAgIGZ1bmN0aW9uIEdldFNlcUlEOiBJbnRlZ2VyOwotICAgIHByb2NlZHVyZSBTZXRTZXFJRCggVmFsdWU6IEludGVnZXIpOwotICAgIHByb3BlcnR5IE5hbWU6IHN0cmluZyByZWFkIEdldE5hbWUgd3JpdGUgU2V0TmFtZTsKLSAgICBwcm9wZXJ0eSBUeXBlXzogVE1lc3NhZ2VUeXBlIHJlYWQgR2V0VHlwZSB3cml0ZSBTZXRUeXBlOwotICAgIHByb3BlcnR5IFNlcUlEOiBJbnRlZ2VyIHJlYWQgR2V0U2VxSUQgd3JpdGUgU2V0U2VxSUQ7Ci0gIGVuZDsKLQotICBUTWVzc2FnZUltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElNZXNzYWdlICkKLSAgcHJpdmF0ZQotICAgIEZOYW1lOiBzdHJpbmc7Ci0gICAgRk1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGU7Ci0gICAgRlNlcUlEOiBJbnRlZ2VyOwotICBwcm90ZWN0ZWQKLSAgICBmdW5jdGlvbiBHZXROYW1lOiBzdHJpbmc7Ci0gICAgcHJvY2VkdXJlIFNldE5hbWUoIGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotICAgIGZ1bmN0aW9uIEdldFR5cGU6IFRNZXNzYWdlVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0VHlwZSggVmFsdWU6IFRNZXNzYWdlVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0U2VxSUQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldFNlcUlEKCBWYWx1ZTogSW50ZWdlcik7Ci0gIHB1YmxpYwotICAgIHByb3BlcnR5IE5hbWU6IHN0cmluZyByZWFkIEZOYW1lIHdyaXRlIEZOYW1lOwotICAgIHByb3BlcnR5IFR5cGVfOiBUTWVzc2FnZVR5cGUgcmVhZCBGTWVzc2FnZVR5cGUgd3JpdGUgRk1lc3NhZ2VUeXBlOwotICAgIHByb3BlcnR5IFNlcUlEOiBJbnRlZ2VyIHJlYWQgRlNlcUlEIHdyaXRlIEZTZXFJRDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFOYW1lOiBzdHJpbmc7IEFNZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlOyBBU2VxSUQ6IEludGVnZXIpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOwotICBlbmQ7Ci0KLSAgSUZpZWxkID0gaW50ZXJmYWNlCi0gICAgWyd7RjBENDNCRTUtNzg4My00NDJFLTgzRkYtMDU4MENDNjMyQjcyfSddCi0gICAgZnVuY3Rpb24gR2V0TmFtZTogc3RyaW5nOwotICAgIHByb2NlZHVyZSBTZXROYW1lKCBjb25zdCBWYWx1ZTogc3RyaW5nKTsKLSAgICBmdW5jdGlvbiBHZXRUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0VHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRJZDogU21hbGxJbnQ7Ci0gICAgcHJvY2VkdXJlIFNldElkKCBWYWx1ZTogU21hbGxJbnQpOwotICAgIHByb3BlcnR5IE5hbWU6IHN0cmluZyByZWFkIEdldE5hbWUgd3JpdGUgU2V0TmFtZTsKLSAgICBwcm9wZXJ0eSBUeXBlXzogVFR5cGUgcmVhZCBHZXRUeXBlIHdyaXRlIFNldFR5cGU7Ci0gICAgcHJvcGVydHkgSWQ6IFNtYWxsSW50IHJlYWQgR2V0SWQgd3JpdGUgU2V0SWQ7Ci0gIGVuZDsKLQotICBURmllbGRJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJRmllbGQpCi0gIHByaXZhdGUKLSAgICBGTmFtZSA6IHN0cmluZzsKLSAgICBGVHlwZSA6IFRUeXBlOwotICAgIEZJZCAgIDogU21hbGxJbnQ7Ci0gIHByb3RlY3RlZAotICAgIGZ1bmN0aW9uIEdldE5hbWU6IHN0cmluZzsKLSAgICBwcm9jZWR1cmUgU2V0TmFtZSggY29uc3QgVmFsdWU6IHN0cmluZyk7Ci0gICAgZnVuY3Rpb24gR2V0VHlwZTogVFR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldFR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0SWQ6IFNtYWxsSW50OwotICAgIHByb2NlZHVyZSBTZXRJZCggVmFsdWU6IFNtYWxsSW50KTsKLSAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBTmFtZTogc3RyaW5nOyBjb25zdCBBVHlwZTogVFR5cGU7IEFJZDogU21hbGxJbnQpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOwotICBlbmQ7CiAKICAgVFByb3RvY29sVXRpbCA9IGNsYXNzCiAgIHB1YmxpYwpAQCAtMjYzLDE4ICsxNzMsMTggQEAKICAgSVByb3RvY29sID0gaW50ZXJmYWNlCiAgICAgWyd7NjAyQTdGRkItMEQ5RS00Q0Q4LThEN0YtRTUwNzY2NjA1ODhBfSddCiAgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0OiBJVHJhbnNwb3J0OwotICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKICAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOwotICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKICAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7Ci0gICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IElGaWVsZCk7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOwotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOwogICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKICAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOwogICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOwogICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOwogICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsKQEAgLTI4NiwxNyArMTk2LDE3IEBACiAgICAgcHJvY2VkdXJlIFdyaXRlQW5zaVN0cmluZyggY29uc3QgczogQW5zaVN0cmluZyk7CiAgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOwogCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7CisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CiAgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsKICAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsKLSAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogSUZpZWxkOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7CiAgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOwotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7CiAgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsKLSAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBJTGlzdDsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKICAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsKLSAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IElTZXQ7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OwogICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7CiAgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47CiAgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OwpAQCAtMzMyLDE4ICsyNDIsMTggQEAKIAogICAgIGZ1bmN0aW9uIEdldFRyYW5zcG9ydDogSVRyYW5zcG9ydDsKICAgcHVibGljCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IHZpcnR1YWw7IGFic3RyYWN0OwotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IHZpcnR1YWw7IGFic3RyYWN0OwpAQCAtMzU1LDE3ICsyNjUsMTcgQEAKICAgICBwcm9jZWR1cmUgV3JpdGVBbnNpU3RyaW5nKCBjb25zdCBzOiBBbnNpU3RyaW5nKTsgdmlydHVhbDsKICAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IHZpcnR1YWw7IGFic3RyYWN0OwogCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogSUZpZWxkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OwotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBJTGlzdDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IElTZXQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgdmlydHVhbDsgYWJzdHJhY3Q7CkBAIC0zODksMjIgKzI5OSw2IEBACiAgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsKICAgZW5kOwogCi0gIElTdHJ1Y3QgPSBpbnRlcmZhY2UKLSAgICBbJ3s1RENFMzlBQS1DOTE2LTRCQzctQTc5Qi05NkEwQzM2QjIyMjB9J10KLSAgICBwcm9jZWR1cmUgU2V0TmFtZShjb25zdCBWYWx1ZTogc3RyaW5nKTsKLSAgICBmdW5jdGlvbiBHZXROYW1lOiBzdHJpbmc7Ci0gICAgcHJvcGVydHkgTmFtZTogc3RyaW5nIHJlYWQgR2V0TmFtZSB3cml0ZSBTZXROYW1lOwotICBlbmQ7Ci0KLSAgVFN0cnVjdEltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElTdHJ1Y3QgKQotICBwcml2YXRlCi0gICAgRk5hbWU6IHN0cmluZzsKLSAgcHJvdGVjdGVkCi0gICAgZnVuY3Rpb24gR2V0TmFtZTogc3RyaW5nOwotICAgIHByb2NlZHVyZSBTZXROYW1lKGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFOYW1lOiBzdHJpbmcpOwotICBlbmQ7CiAKICAgVEJpbmFyeVByb3RvY29sSW1wbCA9IGNsYXNzKCBUUHJvdG9jb2xJbXBsICkKICAgcHJvdGVjdGVkCkBAIC00MTYsNyArMzEwLDcgQEAKICAgICBGU3RyaWN0V3JpdGUgOiBCb29sZWFuOwogCiAgIHByaXZhdGUKLSAgICBmdW5jdGlvbiBSZWFkQWxsKCB2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyICk6IEludGVnZXI7CisgICAgZnVuY3Rpb24gUmVhZEFsbCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyICk6IEludGVnZXI7ICBpbmxpbmU7CiAgICAgZnVuY3Rpb24gUmVhZFN0cmluZ0JvZHkoIHNpemU6IEludGVnZXIpOiBzdHJpbmc7CiAKICAgcHVibGljCkBAIC00MzUsMTggKzMyOSwxOCBAQAogICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOyBvdmVybG9hZDsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0OyBzdHJpY3RSZWFkOiBCb29sZWFuOyBzdHJpY3RXcml0ZTogQm9vbGVhbik7IG92ZXJsb2FkOwogCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOwpAQCAtNDU2LDE3ICszNTAsMTcgQEAKICAgICBwcm9jZWR1cmUgV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgb3ZlcnJpZGU7CiAKLSAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBJTWVzc2FnZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IElTdHJ1Y3Q7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBJRmllbGQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBJTWFwOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IElMaXN0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogSVNldDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZFNldEVuZCgpOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBSZWFkQm9vbDogQm9vbGVhbjsgb3ZlcnJpZGU7CiAgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OyBvdmVycmlkZTsKQEAgLTQ5NCwxOCArMzg4LDE4IEBACiAgICAgLy8gQWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoZSBnaXZlbiBwcm90b2NvbC4gIE11c3QgYmUgbm9uLW51bGwuCiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUHJvdG9jb2wgOiBJUHJvdG9jb2wpOwogCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOwpAQCAtNTE3LDE3ICs0MTEsMTcgQEAKICAgICBwcm9jZWR1cmUgV3JpdGVBbnNpU3RyaW5nKCBjb25zdCBzOiBBbnNpU3RyaW5nKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyBvdmVycmlkZTsKIAotICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogSVN0cnVjdDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IElGaWVsZDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IElNYXA7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogSUxpc3Q7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBJU2V0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOwogICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7IG92ZXJyaWRlOwpAQCAtNTc4LDYgKzQ3MiwxMyBAQAogICBlbmQ7CiAKIAorcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWVzc2FnZTsgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnOyBjb25zdCBBTWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSA9IExvdyhUTWVzc2FnZVR5cGUpOyBjb25zdCBBU2VxSUQ6IEludGVnZXIgPSAwKTsgIG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U3RydWN0OyAgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnKTsgIG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0RmllbGQ7ICAgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnOyBjb25zdCBBVHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBSUQ6IFNtYWxsSW50ID0gMCk7ICBvdmVybG9hZDsgIGlubGluZTsKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdE1hcDsgICAgIGNvbnN0IEFLZXlUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFWYWx1ZVR5cGU6IFRUeXBlID0gTG93KFRUeXBlKTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyID0gMCk7IG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U2V0OyAgICAgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFDb3VudDogSW50ZWdlciA9IDApOyBvdmVybG9hZDsgIGlubGluZTsKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdExpc3Q7ICAgIGNvbnN0IEFFbGVtZW50VHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBQ291bnQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7ICBpbmxpbmU7CisKIAogaW1wbGVtZW50YXRpb24KIApAQCAtNTkzLDU0ICs0OTQsNyBAQAogICBTeXN0ZW0uTW92ZSggZCwgUmVzdWx0LCBTaXplT2YoUmVzdWx0KSk7CiBlbmQ7CiAKLXsgVEZpZWxkSW1wbCB9CiAKLWNvbnN0cnVjdG9yIFRGaWVsZEltcGwuQ3JlYXRlKGNvbnN0IEFOYW1lOiBzdHJpbmc7IGNvbnN0IEFUeXBlOiBUVHlwZTsKLSAgQUlkOiBTbWFsbEludCk7Ci1iZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlOwotICBGTmFtZSA6PSBBTmFtZTsKLSAgRlR5cGUgOj0gQVR5cGU7Ci0gIEZJZCA6PSBBSWQ7Ci1lbmQ7Ci0KLWNvbnN0cnVjdG9yIFRGaWVsZEltcGwuQ3JlYXRlOwotYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZTsKLSAgRk5hbWUgOj0gJyc7Ci0gIEZUeXBlIDo9IExvdyhUVHlwZSk7Ci0gIEZJZCAgIDo9IDA7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRGaWVsZEltcGwuR2V0SWQ6IFNtYWxsSW50OwotYmVnaW4KLSAgUmVzdWx0IDo9IEZJZDsKLWVuZDsKLQotZnVuY3Rpb24gVEZpZWxkSW1wbC5HZXROYW1lOiBzdHJpbmc7Ci1iZWdpbgotICBSZXN1bHQgOj0gRk5hbWU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRGaWVsZEltcGwuR2V0VHlwZTogVFR5cGU7Ci1iZWdpbgotICBSZXN1bHQgOj0gRlR5cGU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBURmllbGRJbXBsLlNldElkKFZhbHVlOiBTbWFsbEludCk7Ci1iZWdpbgotICBGSWQgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBURmllbGRJbXBsLlNldE5hbWUoY29uc3QgVmFsdWU6IHN0cmluZyk7Ci1iZWdpbgotICBGTmFtZSA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRGaWVsZEltcGwuU2V0VHlwZShWYWx1ZTogVFR5cGUpOwotYmVnaW4KLSAgRlR5cGUgOj0gVmFsdWU7Ci1lbmQ7CiAKIHsgVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwgfQogCkBAIC02OTUsNyArNTQ5LDcgQEAKIGJlZ2luCiAgIGlmIEZSZWN1cnNpb25EZXB0aCA8IEZSZWN1cnNpb25MaW1pdAogICB0aGVuIEluYyhGUmVjdXJzaW9uRGVwdGgpCi0gIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLkRFUFRIX0xJTUlULCAnRGVwdGggbGltaXQgZXhjZWVkZWQnKTsKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25EZXB0aExpbWl0LkNyZWF0ZSgnRGVwdGggbGltaXQgZXhjZWVkZWQnKTsKIGVuZDsKIAogcHJvY2VkdXJlIFRQcm90b2NvbEltcGwuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGg7CkBAIC03NTMsMTAgKzYwNywxMCBAQAogeyBUUHJvdG9jb2xVdGlsIH0KIAogY2xhc3MgcHJvY2VkdXJlIFRQcm90b2NvbFV0aWwuU2tpcCggcHJvdDogSVByb3RvY29sOyB0eXBlXzogVFR5cGUpOwotdmFyIGZpZWxkIDogSUZpZWxkOwotICAgIG1hcCAgIDogSU1hcDsKLSAgICBzZXRfICA6IElTZXQ7Ci0gICAgbGlzdCAgOiBJTGlzdDsKK3ZhciBmaWVsZCA6IFRUaHJpZnRGaWVsZDsKKyAgICBtYXAgICA6IFRUaHJpZnRNYXA7CisgICAgc2V0XyAgOiBUVGhyaWZ0U2V0OworICAgIGxpc3QgIDogVFRocmlmdExpc3Q7CiAgICAgaSAgICAgOiBJbnRlZ2VyOwogICAgIHRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOwogYmVnaW4KQEAgLTgwNywxODYgKzY2MSwxMCBAQAogICAgIGVuZDsKIAogICBlbHNlCi0gICAgQVNTRVJUKCBGQUxTRSk7IC8vIGFueSBuZXcgdHlwZXM/CisgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdVbmV4cGVjdGVkIHR5cGUgJytJbnRUb1N0cihPcmQodHlwZV8pKSk7CiAgIGVuZDsKIGVuZDsKIAoteyBUU3RydWN0SW1wbCB9Ci0KLWNvbnN0cnVjdG9yIFRTdHJ1Y3RJbXBsLkNyZWF0ZShjb25zdCBBTmFtZTogc3RyaW5nKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZOYW1lIDo9IEFOYW1lOwotZW5kOwotCi1mdW5jdGlvbiBUU3RydWN0SW1wbC5HZXROYW1lOiBzdHJpbmc7Ci1iZWdpbgotICBSZXN1bHQgOj0gRk5hbWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUU3RydWN0SW1wbC5TZXROYW1lKGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotYmVnaW4KLSAgRk5hbWUgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXsgVE1hcEltcGwgfQotCi1jb25zdHJ1Y3RvciBUTWFwSW1wbC5DcmVhdGUoIEFLZXlUeXBlLCBBVmFsdWVUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZWYWx1ZVR5cGUgOj0gQVZhbHVlVHlwZTsKLSAgRktleVR5cGUgOj0gQUtleVR5cGU7Ci0gIEZDb3VudCA6PSBBQ291bnQ7Ci1lbmQ7Ci0KLWNvbnN0cnVjdG9yIFRNYXBJbXBsLkNyZWF0ZTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRNYXBJbXBsLkdldENvdW50OiBJbnRlZ2VyOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZDb3VudDsKLWVuZDsKLQotZnVuY3Rpb24gVE1hcEltcGwuR2V0S2V5VHlwZTogVFR5cGU7Ci1iZWdpbgotICBSZXN1bHQgOj0gRktleVR5cGU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRNYXBJbXBsLkdldFZhbHVlVHlwZTogVFR5cGU7Ci1iZWdpbgotICBSZXN1bHQgOj0gRlZhbHVlVHlwZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRNYXBJbXBsLlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIEZDb3VudCA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRNYXBJbXBsLlNldEtleVR5cGUoVmFsdWU6IFRUeXBlKTsKLWJlZ2luCi0gIEZLZXlUeXBlIDo9IFZhbHVlOwotZW5kOwotCi1wcm9jZWR1cmUgVE1hcEltcGwuU2V0VmFsdWVUeXBlKFZhbHVlOiBUVHlwZSk7Ci1iZWdpbgotICBGVmFsdWVUeXBlIDo9IFZhbHVlOwotZW5kOwotCi17IElNZXNzYWdlIH0KLQotY29uc3RydWN0b3IgVE1lc3NhZ2VJbXBsLkNyZWF0ZShBTmFtZTogc3RyaW5nOyBBTWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZTsKLSAgQVNlcUlEOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZOYW1lIDo9IEFOYW1lOwotICBGTWVzc2FnZVR5cGUgOj0gQU1lc3NhZ2VUeXBlOwotICBGU2VxSUQgOj0gQVNlcUlEOwotZW5kOwotCi1jb25zdHJ1Y3RvciBUTWVzc2FnZUltcGwuQ3JlYXRlOwotYmVnaW4KLSAgaW5oZXJpdGVkOwotZW5kOwotCi1mdW5jdGlvbiBUTWVzc2FnZUltcGwuR2V0TmFtZTogc3RyaW5nOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZOYW1lOwotZW5kOwotCi1mdW5jdGlvbiBUTWVzc2FnZUltcGwuR2V0U2VxSUQ6IEludGVnZXI7Ci1iZWdpbgotICBSZXN1bHQgOj0gRlNlcUlEOwotZW5kOwotCi1mdW5jdGlvbiBUTWVzc2FnZUltcGwuR2V0VHlwZTogVE1lc3NhZ2VUeXBlOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZNZXNzYWdlVHlwZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRNZXNzYWdlSW1wbC5TZXROYW1lKGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotYmVnaW4KLSAgRk5hbWUgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUTWVzc2FnZUltcGwuU2V0U2VxSUQoVmFsdWU6IEludGVnZXIpOwotYmVnaW4KLSAgRlNlcUlEIDo9IFZhbHVlOwotZW5kOwotCi1wcm9jZWR1cmUgVE1lc3NhZ2VJbXBsLlNldFR5cGUoVmFsdWU6IFRNZXNzYWdlVHlwZSk7Ci1iZWdpbgotICBGTWVzc2FnZVR5cGUgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXsgSVNldCB9Ci0KLWNvbnN0cnVjdG9yIFRTZXRJbXBsLkNyZWF0ZSggQUVsZW1lbnRUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZDb3VudCA6PSBBQ291bnQ7Ci0gIEZFbGVtZW50VHlwZSA6PSBBRWxlbWVudFR5cGU7Ci1lbmQ7Ci0KLWNvbnN0cnVjdG9yIFRTZXRJbXBsLkNyZWF0ZTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRTZXRJbXBsLkdldENvdW50OiBJbnRlZ2VyOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZDb3VudDsKLWVuZDsKLQotZnVuY3Rpb24gVFNldEltcGwuR2V0RWxlbWVudFR5cGU6IFRUeXBlOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZFbGVtZW50VHlwZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRTZXRJbXBsLlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIEZDb3VudCA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRTZXRJbXBsLlNldEVsZW1lbnRUeXBlKFZhbHVlOiBUVHlwZSk7Ci1iZWdpbgotICBGRWxlbWVudFR5cGUgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXsgSUxpc3QgfQotCi1jb25zdHJ1Y3RvciBUTGlzdEltcGwuQ3JlYXRlKCBBRWxlbWVudFR5cGU6IFRUeXBlOyBBQ291bnQ6IEludGVnZXIpOwotYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZTsKLSAgRkNvdW50IDo9IEFDb3VudDsKLSAgRkVsZW1lbnRUeXBlIDo9IEFFbGVtZW50VHlwZTsKLWVuZDsKLQotY29uc3RydWN0b3IgVExpc3RJbXBsLkNyZWF0ZTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRMaXN0SW1wbC5HZXRDb3VudDogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGQ291bnQ7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRMaXN0SW1wbC5HZXRFbGVtZW50VHlwZTogVFR5cGU7Ci1iZWdpbgotICBSZXN1bHQgOj0gRkVsZW1lbnRUeXBlOwotZW5kOwotCi1wcm9jZWR1cmUgVExpc3RJbXBsLlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIEZDb3VudCA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRMaXN0SW1wbC5TZXRFbGVtZW50VHlwZShWYWx1ZTogVFR5cGUpOwotYmVnaW4KLSAgRkVsZW1lbnRUeXBlIDo9IFZhbHVlOwotZW5kOwogCiB7IFRCaW5hcnlQcm90b2NvbEltcGwgfQogCkBAIC0xMDA0LDEwICs2ODIsOSBAQAogICBGU3RyaWN0V3JpdGUgOj0gc3RyaWN0V3JpdGU7CiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEFsbCggdmFyIGJ1ZjogVEJ5dGVzOyBvZmYsCi0gIGxlbjogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRBbGwoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlciApOiBJbnRlZ2VyOwogYmVnaW4KLSAgUmVzdWx0IDo9IEZUcmFucy5SZWFkQWxsKCBidWYsIG9mZiwgbGVuICk7CisgIFJlc3VsdCA6PSBGVHJhbnMuUmVhZEFsbCggcEJ1ZiwgYnVmbGVuLCBvZmYsIGxlbiApOwogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCaW5hcnk6IFRCeXRlczsKQEAgLTEwMjMsMTYgKzcwMCwxMiBAQAogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCb29sOiBCb29sZWFuOwogYmVnaW4KLSAgUmVzdWx0IDo9IFJlYWRCeXRlID0gMTsKKyAgUmVzdWx0IDo9IChSZWFkQnl0ZSA9IDEpOwogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCeXRlOiBTaG9ydEludDsKLXZhcgotICBiaW4gOiBUQnl0ZXM7CiBiZWdpbgotICBTZXRMZW5ndGgoIGJpbiwgMSk7Ci0gIFJlYWRBbGwoIGJpbiwgMCwgMSApOwotICBSZXN1bHQgOj0gU2hvcnRJbnQoIGJpblswXSk7CisgIFJlYWRBbGwoIEByZXN1bHQsIFNpemVPZihyZXN1bHQpLCAwLCAxKTsKIGVuZDsKIAogZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRG91YmxlOiBEb3VibGU7CkBAIC0xMDQwLDE3ICs3MTMsMTIgQEAKICAgUmVzdWx0IDo9IENvbnZlcnRJbnQ2NFRvRG91YmxlKCBSZWFkSTY0ICkKIGVuZDsKIAotZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbjogSUZpZWxkOwotdmFyCi0gIGZpZWxkIDogSUZpZWxkOworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOwogYmVnaW4KLSAgZmllbGQgOj0gVEZpZWxkSW1wbC5DcmVhdGU7Ci0gIGZpZWxkLlR5cGVfIDo9IFRUeXBlKCBSZWFkQnl0ZSk7Ci0gIGlmICggZmllbGQuVHlwZV8gPD4gVFR5cGUuU3RvcCApIHRoZW4KLSAgYmVnaW4KLSAgICBmaWVsZC5JZCA6PSBSZWFkSTE2OworICBJbml0KCByZXN1bHQsICcnLCBUVHlwZSggUmVhZEJ5dGUpLCAwKTsKKyAgaWYgKCByZXN1bHQuVHlwZV8gPD4gVFR5cGUuU3RvcCApIHRoZW4gYmVnaW4KKyAgICByZXN1bHQuSWQgOj0gUmVhZEkxNjsKICAgZW5kOwotICBSZXN1bHQgOj0gZmllbGQ7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRGaWVsZEVuZDsKQEAgLTEwNTksMjAgKzcyNywxNiBAQAogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRJMTY6IFNtYWxsSW50OwotdmFyCi0gIGkxNmluIDogVEJ5dGVzOwordmFyIGkxNmluIDogcGFja2VkIGFycmF5WzAuLjFdIG9mIEJ5dGU7CiBiZWdpbgotICBTZXRMZW5ndGgoIGkxNmluLCAyICk7Ci0gIFJlYWRBbGwoIGkxNmluLCAwLCAyKTsKKyAgUmVhZEFsbCggQGkxNmluLCBTaXplb2YoaTE2aW4pLCAwLCAyKTsKICAgUmVzdWx0IDo9IFNtYWxsSW50KCgoaTE2aW5bMF0gYW5kICRGRikgc2hsIDgpIG9yIChpMTZpblsxXSBhbmQgJEZGKSk7CiBlbmQ7CiAKIGZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEkzMjogSW50ZWdlcjsKLXZhcgotICBpMzJpbiA6IFRCeXRlczsKK3ZhciBpMzJpbiA6IHBhY2tlZCBhcnJheVswLi4zXSBvZiBCeXRlOwogYmVnaW4KLSAgU2V0TGVuZ3RoKCBpMzJpbiwgNCApOwotICBSZWFkQWxsKCBpMzJpbiwgMCwgNCk7CisgIFJlYWRBbGwoIEBpMzJpbiwgU2l6ZU9mKGkzMmluKSwgMCwgNCk7CiAKICAgUmVzdWx0IDo9IEludGVnZXIoCiAgICAgKChpMzJpblswXSBhbmQgJEZGKSBzaGwgMjQpIG9yCkBAIC0xMDgzLDExICs3NDcsOSBAQAogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRJNjQ6IEludDY0OwotdmFyCi0gIGk2NGluIDogVEJ5dGVzOwordmFyIGk2NGluIDogcGFja2VkIGFycmF5WzAuLjddIG9mIEJ5dGU7CiBiZWdpbgotICBTZXRMZW5ndGgoIGk2NGluLCA4KTsKLSAgUmVhZEFsbCggaTY0aW4sIDAsIDgpOworICBSZWFkQWxsKCBAaTY0aW4sIFNpemVPZihpNjRpbiksIDAsIDgpOwogICBSZXN1bHQgOj0KICAgICAoSW50NjQoIGk2NGluWzBdIGFuZCAkRkYpIHNobCA1Nikgb3IKICAgICAoSW50NjQoIGk2NGluWzFdIGFuZCAkRkYpIHNobCA0OCkgb3IKQEAgLTEwOTksMTQgKzc2MSwxMCBAQAogICAgIChJbnQ2NCggaTY0aW5bN10gYW5kICRGRikpOwogZW5kOwogCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRMaXN0QmVnaW46IElMaXN0OwotdmFyCi0gIGxpc3QgOiBJTGlzdDsKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7CiBiZWdpbgotICBsaXN0IDo9IFRMaXN0SW1wbC5DcmVhdGU7Ci0gIGxpc3QuRWxlbWVudFR5cGUgOj0gVFR5cGUoIFJlYWRCeXRlICk7Ci0gIGxpc3QuQ291bnQgOj0gUmVhZEkzMjsKLSAgUmVzdWx0IDo9IGxpc3Q7CisgIHJlc3VsdC5FbGVtZW50VHlwZSA6PSBUVHlwZShSZWFkQnl0ZSk7CisgIHJlc3VsdC5Db3VudCAgICAgICA6PSBSZWFkSTMyOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTGlzdEVuZDsKQEAgLTExMTQsMTUgKzc3MiwxMSBAQAogCiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZE1hcEJlZ2luOiBJTWFwOwotdmFyCi0gIG1hcCA6IElNYXA7CitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsKIGJlZ2luCi0gIG1hcCA6PSBUTWFwSW1wbC5DcmVhdGU7Ci0gIG1hcC5LZXlUeXBlIDo9IFRUeXBlKCBSZWFkQnl0ZSApOwotICBtYXAuVmFsdWVUeXBlIDo9IFRUeXBlKCBSZWFkQnl0ZSApOwotICBtYXAuQ291bnQgOj0gUmVhZEkzMjsKLSAgUmVzdWx0IDo9IG1hcDsKKyAgcmVzdWx0LktleVR5cGUgICA6PSBUVHlwZShSZWFkQnl0ZSk7CisgIHJlc3VsdC5WYWx1ZVR5cGUgOj0gVFR5cGUoUmVhZEJ5dGUpOworICByZXN1bHQuQ291bnQgICAgIDo9IFJlYWRJMzI7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNYXBFbmQ7CkBAIC0xMTMwLDM1ICs3ODQsMzAgQEAKIAogZW5kOwogCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsKIHZhcgogICBzaXplIDogSW50ZWdlcjsKICAgdmVyc2lvbiA6IEludGVnZXI7Ci0gIG1lc3NhZ2UgOiBJTWVzc2FnZTsKIGJlZ2luCi0gIG1lc3NhZ2UgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZTsKKyAgSW5pdCggcmVzdWx0KTsKICAgc2l6ZSA6PSBSZWFkSTMyOwotICBpZiAoc2l6ZSA8IDApIHRoZW4KLSAgYmVnaW4KKyAgaWYgKHNpemUgPCAwKSB0aGVuIGJlZ2luCiAgICAgdmVyc2lvbiA6PSBzaXplIGFuZCBJbnRlZ2VyKCBWRVJTSU9OX01BU0spOwotICAgIGlmICggdmVyc2lvbiA8PiBJbnRlZ2VyKCBWRVJTSU9OXzEpKSB0aGVuCi0gICAgYmVnaW4KLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAnQmFkIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbjogJyArIEludFRvU3RyKHZlcnNpb24pICk7CisgICAgaWYgKCB2ZXJzaW9uIDw+IEludGVnZXIoIFZFUlNJT05fMSkpIHRoZW4gYmVnaW4KKyAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCdCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luOiAnICsgSW50VG9TdHIodmVyc2lvbikgKTsKICAgICBlbmQ7Ci0gICAgbWVzc2FnZS5UeXBlXyA6PSBUTWVzc2FnZVR5cGUoIHNpemUgYW5kICQwMDAwMDBmZik7Ci0gICAgbWVzc2FnZS5OYW1lIDo9IFJlYWRTdHJpbmc7Ci0gICAgbWVzc2FnZS5TZXFJRCA6PSBSZWFkSTMyOwotICBlbmQgZWxzZQotICBiZWdpbgotICAgIGlmIEZTdHJpY3RSZWFkIHRoZW4KLSAgICBiZWdpbgotICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAnTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/JyApOworICAgIHJlc3VsdC5UeXBlXyA6PSBUTWVzc2FnZVR5cGUoIHNpemUgYW5kICQwMDAwMDBmZik7CisgICAgcmVzdWx0Lk5hbWUgOj0gUmVhZFN0cmluZzsKKyAgICByZXN1bHQuU2VxSUQgOj0gUmVhZEkzMjsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBpZiBGU3RyaWN0UmVhZCB0aGVuIGJlZ2luCisgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uLkNyZWF0ZSgnTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/JyApOwogICAgIGVuZDsKLSAgICBtZXNzYWdlLk5hbWUgOj0gUmVhZFN0cmluZ0JvZHkoIHNpemUgKTsKLSAgICBtZXNzYWdlLlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggUmVhZEJ5dGUgKTsKLSAgICBtZXNzYWdlLlNlcUlEIDo9IFJlYWRJMzI7CisgICAgcmVzdWx0Lk5hbWUgOj0gUmVhZFN0cmluZ0JvZHkoIHNpemUgKTsKKyAgICByZXN1bHQuVHlwZV8gOj0gVE1lc3NhZ2VUeXBlKCBSZWFkQnl0ZSApOworICAgIHJlc3VsdC5TZXFJRCA6PSBSZWFkSTMyOwogICBlbmQ7Ci0gIFJlc3VsdCA6PSBtZXNzYWdlOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUVuZDsKQEAgLTExNjcsMTQgKzgxNiwxMCBAQAogCiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFNldEJlZ2luOiBJU2V0OwotdmFyCi0gIHNldF8gOiBJU2V0OworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7CiBiZWdpbgotICBzZXRfIDo9IFRTZXRJbXBsLkNyZWF0ZTsKLSAgc2V0Xy5FbGVtZW50VHlwZSA6PSBUVHlwZSggUmVhZEJ5dGUgKTsKLSAgc2V0Xy5Db3VudCA6PSBSZWFkSTMyOwotICBSZXN1bHQgOj0gc2V0XzsKKyAgcmVzdWx0LkVsZW1lbnRUeXBlIDo9IFRUeXBlKFJlYWRCeXRlKTsKKyAgcmVzdWx0LkNvdW50ICAgICAgIDo9IFJlYWRJMzI7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTZXRFbmQ7CkBAIC0xMTkxLDkgKzgzNiw5IEBACiAgIFJlc3VsdCA6PSBURW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIGJ1Zik7CiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7CiBiZWdpbgotICBSZXN1bHQgOj0gVFN0cnVjdEltcGwuQ3JlYXRlKCcnKTsKKyAgSW5pdCggUmVzdWx0KTsKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFN0cnVjdEVuZDsKQEAgLTEyMTIsMjIgKzg1NywxNiBAQAogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUJvb2woYjogQm9vbGVhbik7CiBiZWdpbgotICBpZiBiIHRoZW4KLSAgYmVnaW4KKyAgaWYgYiB0aGVuIGJlZ2luCiAgICAgV3JpdGVCeXRlKCAxICk7Ci0gIGVuZCBlbHNlCi0gIGJlZ2luCisgIGVuZCBlbHNlIGJlZ2luCiAgICAgV3JpdGVCeXRlKCAwICk7CiAgIGVuZDsKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVCeXRlKGI6IFNob3J0SW50KTsKLXZhcgotICBhIDogVEJ5dGVzOwogYmVnaW4KLSAgU2V0TGVuZ3RoKCBhLCAxKTsKLSAgYVswXSA6PSBCeXRlKCBiICk7Ci0gIEZUcmFucy5Xcml0ZSggYSwgMCwgMSApOworICBGVHJhbnMuV3JpdGUoIEBiLCAwLCAxKTsKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7CkBAIC0xMjM1LDcgKzg3NCw3IEBACiAgIFdyaXRlSTY0KENvbnZlcnREb3VibGVUb0ludDY0KGQpKTsKIGVuZDsKIAotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CiBiZWdpbgogICBXcml0ZUJ5dGUoU2hvcnRJbnQoZmllbGQuVHlwZV8pKTsKICAgV3JpdGVJMTYoZmllbGQuSUQpOwpAQCAtMTI1MiwzMiArODkxLDI2IEBACiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlSTE2KGkxNjogU21hbGxJbnQpOwotdmFyCi0gIGkxNm91dCA6IFRCeXRlczsKK3ZhciBpMTZvdXQgOiBwYWNrZWQgYXJyYXlbMC4uMV0gb2YgQnl0ZTsKIGJlZ2luCi0gIFNldExlbmd0aCggaTE2b3V0LCAyKTsKICAgaTE2b3V0WzBdIDo9IEJ5dGUoJEZGIGFuZCAoaTE2IHNociA4KSk7CiAgIGkxNm91dFsxXSA6PSBCeXRlKCRGRiBhbmQgaTE2KTsKLSAgRlRyYW5zLldyaXRlKCBpMTZvdXQgKTsKKyAgRlRyYW5zLldyaXRlKCBAaTE2b3V0LCAwLCAyKTsKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVJMzIoaTMyOiBJbnRlZ2VyKTsKLXZhcgotICBpMzJvdXQgOiBUQnl0ZXM7Cit2YXIgaTMyb3V0IDogcGFja2VkIGFycmF5WzAuLjNdIG9mIEJ5dGU7CiBiZWdpbgotICBTZXRMZW5ndGgoIGkzMm91dCwgNCk7CiAgIGkzMm91dFswXSA6PSBCeXRlKCRGRiBhbmQgKGkzMiBzaHIgMjQpKTsKICAgaTMyb3V0WzFdIDo9IEJ5dGUoJEZGIGFuZCAoaTMyIHNociAxNikpOwogICBpMzJvdXRbMl0gOj0gQnl0ZSgkRkYgYW5kIChpMzIgc2hyIDgpKTsKICAgaTMyb3V0WzNdIDo9IEJ5dGUoJEZGIGFuZCBpMzIpOwotICBGVHJhbnMuV3JpdGUoIGkzMm91dCwgMCwgNCk7CisgIEZUcmFucy5Xcml0ZSggQGkzMm91dCwgMCwgNCk7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsKLXZhcgotICBpNjRvdXQgOiBUQnl0ZXM7Cit2YXIgaTY0b3V0IDogcGFja2VkIGFycmF5WzAuLjddIG9mIEJ5dGU7CiBiZWdpbgotICBTZXRMZW5ndGgoIGk2NG91dCwgOCk7CiAgIGk2NG91dFswXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgNTYpKTsKICAgaTY0b3V0WzFdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociA0OCkpOwogICBpNjRvdXRbMl0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDQwKSk7CkBAIC0xMjg2LDEwICs5MTksMTAgQEAKICAgaTY0b3V0WzVdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociAxNikpOwogICBpNjRvdXRbNl0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDgpKTsKICAgaTY0b3V0WzddIDo9IEJ5dGUoJEZGIGFuZCBpNjQpOwotICBGVHJhbnMuV3JpdGUoIGk2NG91dCwgMCwgOCk7CisgIEZUcmFucy5Xcml0ZSggQGk2NG91dCwgMCwgOCk7CiBlbmQ7CiAKLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBJTGlzdCk7Citwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOwogYmVnaW4KICAgV3JpdGVCeXRlKFNob3J0SW50KGxpc3QuRWxlbWVudFR5cGUpKTsKICAgV3JpdGVJMzIobGlzdC5Db3VudCk7CkBAIC0xMzAwLDcgKzkzMyw3IEBACiAKIGVuZDsKIAotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBJTWFwKTsKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CiBiZWdpbgogICBXcml0ZUJ5dGUoU2hvcnRJbnQobWFwLktleVR5cGUpKTsKICAgV3JpdGVCeXRlKFNob3J0SW50KG1hcC5WYWx1ZVR5cGUpKTsKQEAgLTEzMTIsNyArOTQ1LDcgQEAKIAogZW5kOwogCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7Citwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7CiB2YXIKICAgdmVyc2lvbiA6IENhcmRpbmFsOwogYmVnaW4KQEAgLTEzMzUsNyArOTY4LDcgQEAKIAogZW5kOwogCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0KTsKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQpOwogYmVnaW4KICAgV3JpdGVCeXRlKFNob3J0SW50KHNldF8uRWxlbWVudFR5cGUpKTsKICAgV3JpdGVJMzIoc2V0Xy5Db3VudCk7CkBAIC0xMzQ2LDcgKzk3OSw3IEBACiAKIGVuZDsKIAotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IElTdHJ1Y3QpOworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOwogYmVnaW4KIAogZW5kOwpAQCAtMTM1OCwyMiArOTkxLDQ3IEBACiAKIHsgVFByb3RvY29sRXhjZXB0aW9uIH0KIAotY29uc3RydWN0b3IgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZTsKK2NvbnN0cnVjdG9yIFRQcm90b2NvbEV4Y2VwdGlvbi5IaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOwogYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZSgnJyk7Ci0gIEZUeXBlIDo9IFVOS05PV047CisgIGluaGVyaXRlZCBDcmVhdGUoTXNnKTsKIGVuZDsKIAotY29uc3RydWN0b3IgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSh0eXBlXzogSW50ZWdlcik7CitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTogVFByb3RvY29sRXhjZXB0aW9uOwogYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZSgnJyk7Ci0gIEZUeXBlIDo9IHR5cGVfOworICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoTXNnKTsKIGVuZDsKIAotY29uc3RydWN0b3IgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSh0eXBlXzogSW50ZWdlcjsgY29uc3QgbXNnOiBzdHJpbmcpOworY2xhc3MgZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZTogVFByb3RvY29sRXhjZXB0aW9uOwogYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZSggbXNnICk7Ci0gIEZUeXBlIDo9IHR5cGVfOworICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJycpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKHR5cGVfOiBJbnRlZ2VyKTogVFByb3RvY29sRXhjZXB0aW9uOworYmVnaW4KK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBPRkZ9CisgIFJlc3VsdCA6PSBDcmVhdGUodHlwZV8sICcnKTsKK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBERUZBVUxUfQorZW5kOworCitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKHR5cGVfOiBJbnRlZ2VyOyBjb25zdCBtc2c6IHN0cmluZyk6IFRQcm90b2NvbEV4Y2VwdGlvbjsKK2JlZ2luCisgIGNhc2UgdHlwZV8gb2YKKyAgICBJTlZBTElEX0RBVEE6ICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUobXNnKTsKKyAgICBORUdBVElWRV9TSVpFOiAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25OZWdhdGl2ZVNpemUuQ3JlYXRlKG1zZyk7CisgICAgU0laRV9MSU1JVDogICAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uU2l6ZUxpbWl0LkNyZWF0ZShtc2cpOworICAgIEJBRF9WRVJTSU9OOiAgICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKG1zZyk7CisgICAgTk9UX0lNUExFTUVOVEVEOiBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uTm90SW1wbGVtZW50ZWQuQ3JlYXRlKG1zZyk7CisgICAgREVQVEhfTElNSVQ6ICAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uRGVwdGhMaW1pdC5DcmVhdGUobXNnKTsKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShtc2cpOworICBlbmQ7CitlbmQ7CisKK3sgVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQgfQorCitjb25zdHJ1Y3RvciBUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZC5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIEhpZGRlbkNyZWF0ZShNc2cpOwogZW5kOwogCiB7IFRUaHJpZnRTdHJpbmdCdWlsZGVyIH0KQEAgLTE0MjAsNyArMTA3OCw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7Citwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKIGJlZ2luCiAgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7CiBlbmQ7CkBAIC0xNDMyLDcgKzEwOTAsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IElTdHJ1Y3QpOworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CiBiZWdpbgogICBGV3JhcHBlZFByb3RvY29sLldyaXRlU3RydWN0QmVnaW4oIHN0cnVjKTsKIGVuZDsKQEAgLTE0NDQsNyArMTEwMiw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBJRmllbGQpOworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOwogYmVnaW4KICAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkQmVnaW4oIGZpZWxkKTsKIGVuZDsKQEAgLTE0NjIsNyArMTEyMCw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOwogYmVnaW4KICAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZU1hcEJlZ2luKCBtYXApOwogZW5kOwpAQCAtMTQ3NCw3ICsxMTMyLDcgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBJTGlzdCk7Citwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CiBiZWdpbgogICBGV3JhcHBlZFByb3RvY29sLldyaXRlTGlzdEJlZ2luKCBsaXN0KTsKIGVuZDsKQEAgLTE0ODYsNyArMTE0NCw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0ICk7Citwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsKIGJlZ2luCiAgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVTZXRCZWdpbiggc2V0Xyk7CiBlbmQ7CkBAIC0xNTUyLDcgKzEyMTAsNyBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkTWVzc2FnZUJlZ2luOiBJTWVzc2FnZTsKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsKIGJlZ2luCiAgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW47CiBlbmQ7CkBAIC0xNTY0LDcgKzEyMjIsNyBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkU3RydWN0QmVnaW46IElTdHJ1Y3Q7CitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OwogYmVnaW4KICAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luOwogZW5kOwpAQCAtMTU3Niw3ICsxMjM0LDcgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEZpZWxkQmVnaW46IElGaWVsZDsKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOwogYmVnaW4KICAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEZpZWxkQmVnaW47CiBlbmQ7CkBAIC0xNTg4LDcgKzEyNDYsNyBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkTWFwQmVnaW46IElNYXA7CitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOwogYmVnaW4KICAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZE1hcEJlZ2luOwogZW5kOwpAQCAtMTYwMCw3ICsxMjU4LDcgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZExpc3RCZWdpbjogSUxpc3Q7CitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7CiBiZWdpbgogICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkTGlzdEJlZ2luOwogZW5kOwpAQCAtMTYxMiw3ICsxMjcwLDcgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFNldEJlZ2luOiBJU2V0OworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKIGJlZ2luCiAgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRTZXRCZWdpbjsKIGVuZDsKQEAgLTE2NzgsNiArMTMzNiw1NCBAQAogZW5kOwogCiAKK3sgSW5pdCBoZWxwZXIgZnVuY3Rpb25zIH0KKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWVzc2FnZTsgY29uc3QgQU5hbWU6IHN0cmluZzsgY29uc3QgQU1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGU7IGNvbnN0IEFTZXFJRDogSW50ZWdlcik7CitiZWdpbgorICByZWMuTmFtZSA6PSBBTmFtZTsKKyAgcmVjLlR5cGVfIDo9IEFNZXNzYWdlVHlwZTsKKyAgcmVjLlNlcUlEIDo9IEFTZXFJRDsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRTdHJ1Y3Q7IGNvbnN0IEFOYW1lOiBzdHJpbmcgPSAnJyk7CitiZWdpbgorICByZWMuTmFtZSA6PSBBTmFtZTsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRGaWVsZDsgY29uc3QgQU5hbWU6IHN0cmluZzsgY29uc3QgQVR5cGU6IFRUeXBlOyBjb25zdCBBSUQ6IFNtYWxsSW50KTsKK2JlZ2luCisgIHJlYy5OYW1lIDo9IEFOYW1lOworICByZWMuVHlwZV8gOj0gQVR5cGU7CisgIHJlYy5JZCA6PSBBSWQ7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWFwOyBjb25zdCBBS2V5VHlwZSwgQVZhbHVlVHlwZTogVFR5cGU7IGNvbnN0IEFDb3VudDogSW50ZWdlcik7CitiZWdpbgorICByZWMuVmFsdWVUeXBlIDo9IEFWYWx1ZVR5cGU7CisgIHJlYy5LZXlUeXBlIDo9IEFLZXlUeXBlOworICByZWMuQ291bnQgOj0gQUNvdW50OworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdFNldDsgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIHJlYy5Db3VudCA6PSBBQ291bnQ7CisgIHJlYy5FbGVtZW50VHlwZSA6PSBBRWxlbWVudFR5cGU7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TGlzdDsgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIHJlYy5Db3VudCA6PSBBQ291bnQ7CisgIHJlYy5FbGVtZW50VHlwZSA6PSBBRWxlbWVudFR5cGU7CitlbmQ7CisKKworCisKIAogZW5kLgogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VyaWFsaXplci5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VyaWFsaXplci5wYXMKaW5kZXggY2Y2NDZjOC4uNWYyOTA1YSAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcmlhbGl6ZXIucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJpYWxpemVyLnBhcwpAQCAtMTgsMTAgKzE4LDE2IEBACiAgKikKIHVuaXQgVGhyaWZ0LlNlcmlhbGl6ZXI7CiAKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CisKIGludGVyZmFjZQogCiB1c2VzCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CiAgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLAorICB7JEVMU0V9CisgIFN5c3RlbS5DbGFzc2VzLCBXaW5hcGkuV2luZG93cywgU3lzdGVtLlN5c1V0aWxzLAorICB7JEVORElGfQogICBUaHJpZnQuUHJvdG9jb2wsCiAgIFRocmlmdC5UcmFuc3BvcnQsCiAgIFRocmlmdC5TdHJlYW07CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VydmVyLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJ2ZXIucGFzCmluZGV4IDI5MzU3NDcuLjEzYzU3NjIgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJ2ZXIucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJ2ZXIucGFzCkBAIC0xOSwxMiArMTksMTcgQEAKIAogIHVuaXQgVGhyaWZ0LlNlcnZlcjsKIAoreyRJIFRocmlmdC5EZWZpbmVzLmluY30KIHskSS19ICAvLyBwcmV2ZW50IGFubm95aW5nIGVycm9ycyB3aXRoIGRlZmF1bHQgbG9nIGRlbGVnYXRlIGFuZCBubyBjb25zb2xlCiAKIGludGVyZmFjZQogCiB1c2VzCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CiAgIFdpbmRvd3MsIFN5c1V0aWxzLAorICB7JEVMU0V9CisgIFdpbmFwaS5XaW5kb3dzLCBTeXN0ZW0uU3lzVXRpbHMsCisgIHskRU5ESUZ9CiAgIFRocmlmdCwKICAgVGhyaWZ0LlByb3RvY29sLAogICBUaHJpZnQuVHJhbnNwb3J0OwpAQCAtMzQ1LDcgKzM1MCw3IEBACiAgICAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiBiZWdpbgogICAgICAgICBpZiBGU3RvcAogICAgICAgICB0aGVuIEFib3J0ICAvLyBzaWxlbnQgZXhjZXB0aW9uCi0gICAgICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoICdTZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCcgKTsKKyAgICAgICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ1NlcnZlclRyYW5zcG9ydC5BY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMJyk7CiAgICAgICBlbmQ7CiAKICAgICAgIEZMb2dEZWxlZ2F0ZSggJ0NsaWVudCBDb25uZWN0ZWQhJyk7CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU29ja2V0LnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Tb2NrZXQucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2FiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU29ja2V0LnBhcwpAQCAtMCwwICsxLDE2MTcgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUaHJpZnQuU29ja2V0OworCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQoreyRJLX0gIC8vIHByZXZlbnQgYW5ub3lpbmcgZXJyb3JzIHdpdGggZGVmYXVsdCBsb2cgZGVsZWdhdGUgYW5kIG5vIGNvbnNvbGUKKworaW50ZXJmYWNlCit7JElGTkRFRiBPTERfU09DS0VUU30gLy8gbm90IGZvciBPTERfU09DS0VUUworCit1c2VzCisgIFdpbmFwaS5XaW5kb3dzLCBXaW5hcGkuV2luc29jazI7CisKK2NvbnN0CisgIEFJX1BBU1NJVkUgICAgICAgICAgICAgICAgPSAkMDAwMDAwMDE7ICAvLyBTb2NrZXQgYWRkcmVzcyB3aWxsIGJlIHVzZWQgaW4gYmluZCgpIGNhbGwKKyAgQUlfQ0FOT05OQU1FICAgICAgICAgICAgICA9ICQwMDAwMDAwMjsgIC8vIFJldHVybiBjYW5vbmljYWwgbmFtZSBpbiBmaXJzdCBhaV9jYW5vbm5hbWUKKyAgQUlfTlVNRVJJQ0hPU1QgICAgICAgICAgICA9ICQwMDAwMDAwNDsgIC8vIE5vZGVuYW1lIG11c3QgYmUgYSBudW1lcmljIGFkZHJlc3Mgc3RyaW5nCisgIEFJX05VTUVSSUNTRVJWICAgICAgICAgICAgPSAkMDAwMDAwMDg7ICAvLyBTZXJ2aWNlbmFtZSBtdXN0IGJlIGEgbnVtZXJpYyBwb3J0IG51bWJlcgorCisgIEFJX0FMTCAgICAgICAgICAgICAgICAgICAgPSAkMDAwMDAxMDA7ICAvLyBRdWVyeSBib3RoIElQNiBhbmQgSVA0IHdpdGggQUlfVjRNQVBQRUQKKyAgQUlfQUREUkNPTkZJRyAgICAgICAgICAgICA9ICQwMDAwMDQwMDsgIC8vIFJlc29sdXRpb24gb25seSBpZiBnbG9iYWwgYWRkcmVzcyBjb25maWd1cmVkCisgIEFJX1Y0TUFQUEVEICAgICAgICAgICAgICAgPSAkMDAwMDA4MDA7ICAvLyBPbiB2NiBmYWlsdXJlLCBxdWVyeSB2NCBhbmQgY29udmVydCB0byBWNE1BUFBFRCBmb3JtYXQKKworICBBSV9OT05fQVVUSE9SSVRBVElWRSAgICAgID0gJDAwMDA0MDAwOyAgLy8gTFVQX05PTl9BVVRIT1JJVEFUSVZFCisgIEFJX1NFQ1VSRSAgICAgICAgICAgICAgICAgPSAkMDAwMDgwMDA7ICAvLyBMVVBfU0VDVVJFCisgIEFJX1JFVFVSTl9QUkVGRVJSRURfTkFNRVMgPSAkMDAwMTAwMDA7ICAvLyBMVVBfUkVUVVJOX1BSRUZFUlJFRF9OQU1FUworCisgIEFJX0ZRRE4gICAgICAgICAgICAgICAgICAgPSAkMDAwMjAwMDA7ICAvLyBSZXR1cm4gdGhlIEZRRE4gaW4gYWlfY2Fub25uYW1lCisgIEFJX0ZJTEVTRVJWRVIgICAgICAgICAgICAgPSAkMDAwNDAwMDA7ICAvLyBSZXNvbHZpbmcgZmlsZXNlcnZlciBuYW1lIHJlc29sdXRpb24KKwordHlwZQorICBQQWRkckluZm9BID0gXlRBZGRySW5mb0E7CisgIFRBZGRySW5mb0EgPSByZWNvcmQKKyAgICBhaV9mbGFnczogSW50ZWdlcjsKKyAgICBhaV9mYW1pbHk6IEludGVnZXI7CisgICAgYWlfc29ja3R5cGU6IEludGVnZXI7CisgICAgYWlfcHJvdG9jb2w6IEludGVnZXI7CisgICAgYWlfYWRkcmxlbjogTmF0aXZlVUludDsKKyAgICBhaV9jYW5vbm5hbWU6IFBBbnNpQ2hhcjsKKyAgICBhaV9hZGRyOiBQU29ja0FkZHI7CisgICAgYWlfbmV4dDogUEFkZHJJbmZvQTsKKyAgZW5kOworCisgIFBBZGRySW5mb1cgPSBeVEFkZHJJbmZvVzsKKyAgVEFkZHJJbmZvVyA9IHJlY29yZAorICAgIGFpX2ZsYWdzOiBJbnRlZ2VyOworICAgIGFpX2ZhbWlseTogSW50ZWdlcjsKKyAgICBhaV9zb2NrdHlwZTogSW50ZWdlcjsKKyAgICBhaV9wcm90b2NvbDogSW50ZWdlcjsKKyAgICBhaV9hZGRybGVuOiBOYXRpdmVVSW50OworICAgIGFpX2Nhbm9ubmFtZTogUENoYXI7CisgICAgYWlfYWRkcjogUFNvY2tBZGRyOworICAgIGFpX25leHQ6IFBBZGRySW5mb1c7CisgIGVuZDsKKworICBUQWRkcmVzc0ZhbWlseSA9IFVTSE9SVDsKKworICBUSW42QWRkciA9IHJlY29yZAorICBjYXNlIEludGVnZXIgb2YKKyAgICAwOiAoX0J5dGU6IGFycmF5WzAuLjE1XSBvZiBVQ0hBUik7CisgICAgMTogKF9Xb3JkOiBhcnJheVswLi43XSBvZiBVU0hPUlQpOworICBlbmQ7CisKKyAgVFNjb3BlSWQgPSByZWNvcmQKKyAgcHVibGljCisgICAgVmFsdWU6IFVMT05HOworICBwcml2YXRlCisgICAgZnVuY3Rpb24gR2V0Qml0RmllbGQoTG9jOiBJbnRlZ2VyKTogSW50ZWdlcjsgaW5saW5lOworICAgIHByb2NlZHVyZSBTZXRCaXRGaWVsZChMb2M6IEludGVnZXI7IGNvbnN0IGFWYWx1ZTogSW50ZWdlcik7IGlubGluZTsKKyAgcHVibGljCisgICAgcHJvcGVydHkgWm9uZTogSW50ZWdlciBpbmRleCAkMDAyOCByZWFkIEdldEJpdEZpZWxkIHdyaXRlIFNldEJpdEZpZWxkOworICAgIHByb3BlcnR5IExldmVsOiBJbnRlZ2VyIGluZGV4ICQyODA0IHJlYWQgR2V0Qml0RmllbGQgd3JpdGUgU2V0Qml0RmllbGQ7CisgIGVuZDsKKworICBUU29ja0FkZHJJbjYgPSByZWNvcmQKKyAgICBzaW42X2ZhbWlseTogVEFkZHJlc3NGYW1pbHk7CisgICAgc2luNl9wb3J0OiBVU0hPUlQ7CisgICAgc2luNl9mbG93aW5mbzogVUxPTkc7CisgICAgc2luNl9hZGRyOiBUSW42QWRkcjsKKyAgY2FzZSBJbnRlZ2VyIG9mCisgICAgMDogKHNpbjZfc2NvcGVfaWQ6IFVMT05HKTsKKyAgICAxOiAoc2luNl9zY29wZV9zdHJ1Y3Q6IFRTY29wZUlkKTsKKyAgZW5kOworICBQU29ja0FkZHJJbjYgPSBeVFNvY2tBZGRySW42OworCitjb25zdAorICBOSV9OT0ZRRE4gICAgICA9ICQwMTsgIC8vIE9ubHkgcmV0dXJuIG5vZGVuYW1lIHBvcnRpb24gZm9yIGxvY2FsIGhvc3RzCisgIE5JX05VTUVSSUNIT1NUID0gJDAyOyAgLy8gUmV0dXJuIG51bWVyaWMgZm9ybSBvZiB0aGUgaG9zdCdzIGFkZHJlc3MKKyAgTklfTkFNRVJFUUQgICAgPSAkMDQ7ICAvLyBFcnJvciBpZiB0aGUgaG9zdCdzIG5hbWUgbm90IGluIEROUworICBOSV9OVU1FUklDU0VSViA9ICQwODsgIC8vIFJldHVybiBudW1lcmljIGZvcm0gb2YgdGhlIHNlcnZpY2UgKHBvcnQgIykKKyAgTklfREdSQU0gICAgICAgPSAkMTA7ICAvLyBTZXJ2aWNlIGlzIGEgZGF0YWdyYW0gc2VydmljZQorCisgIE5JX01BWEhPU1QgICAgID0gMTAyNTsgIC8vIE1heCBzaXplIG9mIGEgZnVsbHktcXVhbGlmaWVkIGRvbWFpbiBuYW1lCisgIE5JX01BWFNFUlYgICAgID0gMzI7ICAgIC8vIE1heCBzaXplIG9mIGEgc2VydmljZSBuYW1lCisKK2Z1bmN0aW9uIGdldGFkZHJpbmZvKHBOb2RlTmFtZSwgcFNlcnZpY2VOYW1lOiBQQW5zaUNoYXI7IGNvbnN0IHBIaW50czogVEFkZHJJbmZvQTsgdmFyIHBwUmVzdWx0OiBQQWRkckluZm9BKTogSW50ZWdlcjsgc3RkY2FsbDsKK2Z1bmN0aW9uIEdldEFkZHJJbmZvVyhwTm9kZU5hbWUsIHBTZXJ2aWNlTmFtZTogUFdpZGVDaGFyOyBjb25zdCBwSGludHM6IFRBZGRySW5mb1c7IHZhciBwcFJlc3VsdDogUEFkZHJJbmZvVyk6IEludGVnZXI7IHN0ZGNhbGw7Citwcm9jZWR1cmUgZnJlZWFkZHJpbmZvKHBBZGRySW5mbzogUEFkZHJJbmZvQSk7IHN0ZGNhbGw7Citwcm9jZWR1cmUgRnJlZUFkZHJJbmZvVyhwQWRkckluZm86IFBBZGRySW5mb1cpOyBzdGRjYWxsOworZnVuY3Rpb24gZ2V0bmFtZWluZm8oY29uc3QgcFNvY2thZGRyOiBUU29ja0FkZHI7IFNvY2thZGRyTGVuZ3RoOiBJbnRlZ2VyOyBwTm9kZUJ1ZmZlcjogUEFuc2lDaGFyOyBOb2RlQnVmZmVyU2l6ZTogRFdPUkQ7IHBTZXJ2aWNlQnVmZmVyOiBQQW5zaUNoYXI7CisgIFNlcnZpY2VCdWZmZXJTaXplOiBEV09SRDsgRmxhZ3M6IEludGVnZXIpOiBJbnRlZ2VyOyBzdGRjYWxsOworZnVuY3Rpb24gR2V0TmFtZUluZm9XKGNvbnN0IHBTb2NrYWRkcjogVFNvY2tBZGRyOyBTb2NrYWRkckxlbmd0aDogSW50ZWdlcjsgcE5vZGVCdWZmZXI6IFBXaWRlQ2hhcjsgTm9kZUJ1ZmZlclNpemU6IERXT1JEOyBwU2VydmljZUJ1ZmZlcjogUFdpZGVDaGFyOworICBTZXJ2aWNlQnVmZmVyU2l6ZTogRFdPUkQ7IEZsYWdzOiBJbnRlZ2VyKTogSW50ZWdlcjsgc3RkY2FsbDsKKwordHlwZQorICBUU21hcnRQb2ludGVyRGVzdHJveWVyPFQ+ID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZShWYWx1ZTogVCk7CisKKyAgSVNtYXJ0UG9pbnRlcjxUPiA9IHJlZmVyZW5jZSB0byBmdW5jdGlvbjogVDsKKworICBUU21hcnRQb2ludGVyPFQ+ID0gY2xhc3MoVEludGVyZmFjZWRPYmplY3QsIElTbWFydFBvaW50ZXI8VD4pCisgIHByaXZhdGUKKyAgICBGVmFsdWU6IFQ7CisgICAgRkRlc3Ryb3llcjogVFNtYXJ0UG9pbnRlckRlc3Ryb3llcjxUPjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFWYWx1ZTogVDsgQURlc3Ryb3llcjogVFNtYXJ0UG9pbnRlckRlc3Ryb3llcjxUPik7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBJbnZva2U6IFQ7CisgIGVuZDsKKworICBUQmFzZVNvY2tldCA9IGNsYXNzIGFic3RyYWN0CisgIHB1YmxpYyB0eXBlCisgICAgVExvZ0RlbGVnYXRlID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZSggY29uc3Qgc3RyOiBzdHJpbmcpOworICBzdHJpY3QgcHJpdmF0ZQorICAgIEZQb3J0OiBJbnRlZ2VyOworICAgIEZTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OworICAgIEZTZW5kVGltZW91dCwKKyAgICBGUmVjdlRpbWVvdXQ6IExvbmd3b3JkOworICAgIEZLZWVwQWxpdmU6IEJvb2xlYW47CisgICAgRkxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGU7CisgICAgY2xhc3MgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIGNsYXNzIGRlc3RydWN0b3IgRGVzdHJveTsKKyAgICBjbGFzcyBwcm9jZWR1cmUgRGVmYXVsdExvZ0RlbGVnYXRlKGNvbnN0IFN0cjogc3RyaW5nKTsKKyAgcHJvdGVjdGVkIHR5cGUKKyAgICBJR2V0QWRkckluZm9XcmFwcGVyID0gaW50ZXJmYWNlCisgICAgICBmdW5jdGlvbiBJbml0OiBJbnRlZ2VyOworICAgICAgZnVuY3Rpb24gR2V0UmVzOiBQQWRkckluZm9XOworICAgICAgcHJvcGVydHkgUmVzOiBQQWRkckluZm9XIHJlYWQgR2V0UmVzOworICAgIGVuZDsKKyAgICBUR2V0QWRkckluZm9XcmFwcGVyID0gY2xhc3MoVEludGVyZmFjZWRPYmplY3QsIElHZXRBZGRySW5mb1dyYXBwZXIpCisgICAgc3RyaWN0IHByaXZhdGUKKyAgICAgIEZOb2RlOiBzdHJpbmc7CisgICAgICBGU2VydmljZTogc3RyaW5nOworICAgICAgRkhpbnRzLAorICAgICAgRlJlczogUEFkZHJJbmZvVzsKKyAgICBwdWJsaWMKKyAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBTm9kZSwgQVNlcnZpY2U6IHN0cmluZzsgQUhpbnRzOiBQQWRkckluZm9XKTsKKyAgICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgICAgICBmdW5jdGlvbiBJbml0OiBJbnRlZ2VyOworICAgICAgZnVuY3Rpb24gR2V0UmVzOiBQQWRkckluZm9XOworICAgICAgcHJvcGVydHkgUmVzOiBQQWRkckluZm9XIHJlYWQgR2V0UmVzOworICAgIGVuZDsKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBDb21tb25Jbml0OyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIENyZWF0ZVNvY2tldChBQWRkcmVzczogc3RyaW5nOyBBUG9ydDogSW50ZWdlcik6IElHZXRBZGRySW5mb1dyYXBwZXI7CisgICAgcHJvY2VkdXJlIFNldFJlY3ZUaW1lb3V0KEFSZWN2VGltZW91dDogTG9uZ3dvcmQpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQ6IExvbmd3b3JkKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmU6IEJvb2xlYW4pOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRTb2NrZXQoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworICAgIHByb3BlcnR5IExvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUgcmVhZCBGTG9nRGVsZWdhdGU7CisgIHB1YmxpYworICAgIC8vCisgICAgLy8gQ29uc3RydWN0cyBhIG5ldyBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlCisgICAgLy8gc29ja2V0LgorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBEZXN0cm95cyB0aGUgc29ja2V0IG9iamVjdCwgY2xvc2luZyBpdCBpZiBuZWNlc3NhcnkuCisgICAgLy8KKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworCisgICAgLy8KKyAgICAvLyBTaHV0cyBkb3duIGNvbW11bmljYXRpb25zIG9uIHRoZSBzb2NrZXQKKyAgICAvLworICAgIHByb2NlZHVyZSBDbG9zZTsgdmlydHVhbDsKKworICAgIC8vIFRoZSBwb3J0IHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICBwcm9wZXJ0eSBQb3J0OiBJbnRlZ2VyIHJlYWQgRlBvcnQgd3JpdGUgRlBvcnQ7CisKKyAgICAvLyBUaGUgcmVjZWl2ZSB0aW1lb3V0CisgICAgcHJvcGVydHkgUmVjdlRpbWVvdXQ6IExvbmd3b3JkIHJlYWQgRlJlY3ZUaW1lb3V0IHdyaXRlIFNldFJlY3ZUaW1lb3V0OworCisgICAgLy8gVGhlIHNlbmQgdGltZW91dAorICAgIHByb3BlcnR5IFNlbmRUaW1lb3V0OiBMb25nd29yZCByZWFkIEZTZW5kVGltZW91dCB3cml0ZSBTZXRTZW5kVGltZW91dDsKKworICAgIC8vIFNldCBTT19LRUVQQUxJVkUKKyAgICBwcm9wZXJ0eSBLZWVwQWxpdmU6IEJvb2xlYW4gcmVhZCBGS2VlcEFsaXZlIHdyaXRlIFNldEtlZXBBbGl2ZTsKKworICAgIC8vIFRoZSB1bmRlcmx5aW5nIHNvY2tldCBkZXNjcmlwdG9yCisgICAgcHJvcGVydHkgU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCByZWFkIEZTb2NrZXQgd3JpdGUgU2V0U29ja2V0OworICBlbmQ7CisKKyAgVFNvY2tldCA9IGNsYXNzKFRCYXNlU29ja2V0KQorICBzdHJpY3QgcHJpdmF0ZSB0eXBlCisgICAgVENhY2hlZFBlZXJBZGRyID0gcmVjb3JkCisgICAgY2FzZSBJbnRlZ2VyIG9mCisgICAgICAwOiAoaXB2NDogVFNvY2tBZGRySW4pOworICAgICAgMTogKGlwdjY6IFRTb2NrQWRkckluNik7CisgICAgZW5kOworICBzdHJpY3QgcHJpdmF0ZQorICAgIEZIb3N0OiBzdHJpbmc7CisgICAgRlBlZXJIb3N0OiBzdHJpbmc7CisgICAgRlBlZXJBZGRyZXNzOiBzdHJpbmc7CisgICAgRlBlZXJQb3J0OiBJbnRlZ2VyOworICAgIEZJbnRlcnJ1cHRMaXN0ZW5lcjogSVNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD47CisgICAgRkNvbm5UaW1lb3V0OiBMb25nd29yZDsKKyAgICBGTGluZ2VyT246IEJvb2xlYW47CisgICAgRkxpbmdlclZhbDogSW50ZWdlcjsKKyAgICBGTm9EZWxheTogQm9vbGVhbjsKKyAgICBGTWF4UmVjdlJldHJpZXM6IExvbmd3b3JkOworICAgIEZDYWNoZWRQZWVyQWRkcjogVENhY2hlZFBlZXJBZGRyOworICAgIHByb2NlZHVyZSBJbml0UGVlckluZm87CisgICAgcHJvY2VkdXJlIE9wZW5Db25uZWN0aW9uKFJlczogVEJhc2VTb2NrZXQuSUdldEFkZHJJbmZvV3JhcHBlcik7CisgICAgcHJvY2VkdXJlIExvY2FsT3BlbjsKKyAgICBwcm9jZWR1cmUgU2V0R2VuZXJpY1RpbWVvdXQoUzogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IFRpbWVvdXQ6IExvbmd3b3JkOyBPcHROYW1lOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47CisgICAgcHJvY2VkdXJlIFNldE5vRGVsYXkoQU5vRGVsYXk6IEJvb2xlYW4pOworICAgIGZ1bmN0aW9uIEdldFNvY2tldEluZm86IHN0cmluZzsKKyAgICBmdW5jdGlvbiBHZXRQZWVySG9zdDogc3RyaW5nOworICAgIGZ1bmN0aW9uIEdldFBlZXJBZGRyZXNzOiBzdHJpbmc7CisgICAgZnVuY3Rpb24gR2V0UGVlclBvcnQ6IEludGVnZXI7CisgICAgZnVuY3Rpb24gR2V0T3JpZ2luOiBzdHJpbmc7CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgQ29tbW9uSW5pdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFNldFJlY3ZUaW1lb3V0KEFSZWN2VGltZW91dDogTG9uZ3dvcmQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0OiBMb25nd29yZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRLZWVwQWxpdmUoQUtlZXBBbGl2ZTogQm9vbGVhbik7IG92ZXJyaWRlOworICBwdWJsaWMKKyAgICAvLworICAgIC8vIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQorICAgIC8vIHNvY2tldC4KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RzIGEgbmV3IHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUKKyAgICAvLyBzb2NrZXQuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gaG9zdCBBbiBJUCBhZGRyZXNzIG9yIGhvc3RuYW1lIHRvIGNvbm5lY3QgdG8KKyAgICAvLyBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byBjb25uZWN0IG9uCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUhvc3Q6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBzb2NrZXQgZnJvbSBzb2NrZXQgZGVzY3JpcHRvci4KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3IgdG8gY3JlYXRlIHNvY2tldCBmcm9tIHNvY2tldCBkZXNjcmlwdG9yIHRoYXQKKyAgICAvLyBjYW4gYmUgaW50ZXJydXB0ZWQgc2FmZWx5LgorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBBSW50ZXJydXB0TGlzdGVuZXI6IElTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+OworICAgICAgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIHNvY2tldAorICAgIC8vCisgICAgLy8gQHRocm93cyBFVHJhbnNwb3J0YXRpb25FeGNlcHRpb24gSWYgdGhlIHNvY2tldCBjb3VsZCBub3QgY29ubmVjdAorICAgIC8vCisgICAgcHJvY2VkdXJlIE9wZW47CisKKyAgICAvLworICAgIC8vIFNodXRzIGRvd24gY29tbXVuaWNhdGlvbnMgb24gdGhlIHNvY2tldAorICAgIC8vCisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKworICAgIC8vCisgICAgLy8gUmVhZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisgICAgLy8gXHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIDAgaW5kaWNhdGVzIEVPRgorICAgIC8vIFx0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvZiB0eXBlczoKKyAgICAvLyAgICAgICAgICBJbnRlcnJ1cHRlZCBtZWFucyB0aGUgc29ja2V0IHdhcyBpbnRlcnJ1cHRlZAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgIG91dCBvZiBhIGJsb2NraW5nIGNhbGwKKyAgICAvLyAgICAgICAgICBOb3RPcGVuIG1lYW5zIHRoZSBzb2NrZXQgaGFzIGJlZW4gY2xvc2VkCisgICAgLy8gICAgICAgICAgVGltZWRPdXQgbWVhbnMgdGhlIHJlY2VpdmUgdGltZW91dCBleHBpcmVkCisgICAgLy8gICAgICAgICAgVW5rbm93biBtZWFucyBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5lZAorICAgIC8vCisgICAgZnVuY3Rpb24gUmVhZCh2YXIgQnVmOyBMZW46IEludGVnZXIpOiBJbnRlZ2VyOworCisgICAgLy8KKyAgICAvLyBXcml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0LiAgTG9vcHMgdW50aWwgZG9uZSBvciBmYWlsLgorICAgIC8vCisgICAgcHJvY2VkdXJlIFdyaXRlKGNvbnN0IEJ1ZjsgTGVuOiBJbnRlZ2VyKTsKKworICAgIC8vCisgICAgLy8gV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gIERvZXMgc2luZ2xlIHNlbmQoKSBhbmQgcmV0dXJucyByZXN1bHQuCisgICAgLy8KKyAgICBmdW5jdGlvbiBXcml0ZVBhcnRpYWwoY29uc3QgQnVmOyBMZW46IEludGVnZXIpOiBJbnRlZ2VyOworCisgICAgLy8KKyAgICAvLyBSZXR1cm5zIGEgY2FjaGVkIGNvcHkgb2YgdGhlIHBlZXIgYWRkcmVzcy4KKyAgICAvLworICAgIGZ1bmN0aW9uIEdldENhY2hlZEFkZHJlc3Mob3V0IExlbjogSW50ZWdlcik6IFBTb2NrQWRkcjsKKworICAgIC8vCisgICAgLy8gU2V0IGEgY2FjaGUgb2YgdGhlIHBlZXIgYWRkcmVzcyAodXNlZCB3aGVuIHRyaXZpYWxseSBhdmFpbGFibGU6IGUuZy4KKyAgICAvLyBhY2NlcHQoKSBvciBjb25uZWN0KCkpLiBPbmx5IGNhY2hlcyBJUFY0IGFuZCBJUFY2OyB1bnNldCBmb3Igb3RoZXJzLgorICAgIC8vCisgICAgcHJvY2VkdXJlIFNldENhY2hlZEFkZHJlc3MoY29uc3QgQWRkcjogVFNvY2tBZGRyOyBMZW46IEludGVnZXIpOworCisgICAgLy8KKyAgICAvLyBDb250cm9scyB3aGV0aGVyIHRoZSBsaW5nZXIgb3B0aW9uIGlzIHNldCBvbiB0aGUgc29ja2V0LgorICAgIC8vCisgICAgLy8gQHBhcmFtIG9uICAgICAgV2hldGhlciBTT19MSU5HRVIgaXMgb24KKyAgICAvLyBAcGFyYW0gbGluZ2VyICBJZiBsaW5nZXIgaXMgYWN0aXZlLCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gbGluZ2VyIGZvcgorICAgIC8vCisgICAgcHJvY2VkdXJlIFNldExpbmdlcihMaW5nZXJPbjogQm9vbGVhbjsgTGluZ2VyVmFsOiBJbnRlZ2VyKTsKKworICAgIC8vCisgICAgLy8gQ2FsbHMgc2VsZWN0KCkgb24gdGhlIHNvY2tldCB0byBzZWUgaWYgdGhlcmUgaXMgbW9yZSBkYXRhIGF2YWlsYWJsZS4KKyAgICAvLworICAgIGZ1bmN0aW9uIFBlZWs6IEJvb2xlYW47CisKKyAgICAvLyBXaGV0aGVyIHRoZSBzb2NrZXQgaXMgYWxpdmUKKyAgICBwcm9wZXJ0eSBJc09wZW46IEJvb2xlYW4gcmVhZCBHZXRJc09wZW47CisKKyAgICAvLyBUaGUgaG9zdCB0aGF0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgcHJvcGVydHkgSG9zdDogc3RyaW5nIHJlYWQgRkhvc3Qgd3JpdGUgRkhvc3Q7CisKKyAgICAvLyBXaGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtCisgICAgcHJvcGVydHkgTm9EZWxheTogQm9vbGVhbiByZWFkIEZOb0RlbGF5IHdyaXRlIFNldE5vRGVsYXk7CisKKyAgICAvLyBDb25uZWN0IHRpbWVvdXQKKyAgICBwcm9wZXJ0eSBDb25uVGltZW91dDogTG9uZ3dvcmQgcmVhZCBGQ29ublRpbWVvdXQgd3JpdGUgRkNvbm5UaW1lb3V0OworCisgICAgLy8gVGhlIG1heCBudW1iZXIgb2YgcmVjdiByZXRyaWVzIGluIHRoZSBjYXNlIG9mIGEgV1NBRVdPVUxEQkxPQ0sKKyAgICBwcm9wZXJ0eSBNYXhSZWN2UmV0cmllczogTG9uZ3dvcmQgcmVhZCBGTWF4UmVjdlJldHJpZXMgd3JpdGUgRk1heFJlY3ZSZXRyaWVzOworCisgICAgLy8gU29ja2V0IGluZm9ybWF0aW9uIGZvcm1hdHRlZCBhcyBhIHN0cmluZyA8SG9zdDogeCBQb3J0OiB4PgorICAgIHByb3BlcnR5IFNvY2tldEluZm86IHN0cmluZyByZWFkIEdldFNvY2tldEluZm87CisKKyAgICAvLyBUaGUgRE5TIG5hbWUgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICBwcm9wZXJ0eSBQZWVySG9zdDogc3RyaW5nIHJlYWQgR2V0UGVlckhvc3Q7CisKKyAgICAvLyBUaGUgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAorICAgIHByb3BlcnR5IFBlZXJBZGRyZXNzOiBzdHJpbmcgcmVhZCBHZXRQZWVyQWRkcmVzczsKKworICAgIC8vIFRoZSBwb3J0IG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCisgICAgcHJvcGVydHkgUGVlclBvcnQ6IEludGVnZXIgcmVhZCBHZXRQZWVyUG9ydDsKKworICAgIC8vIFRoZSBvcmlnaW4gdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICBwcm9wZXJ0eSBPcmlnaW46IHN0cmluZyByZWFkIEdldE9yaWdpbjsKKyAgZW5kOworCisgIFRTZXJ2ZXJTb2NrZXRGdW5jID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZShzb2NrOiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CisKKyAgVFNlcnZlclNvY2tldCA9IGNsYXNzKFRCYXNlU29ja2V0KQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZBZGRyZXNzOiBzdHJpbmc7CisgICAgRkFjY2VwdEJhY2tsb2csCisgICAgRlJldHJ5TGltaXQsCisgICAgRlJldHJ5RGVsYXksCisgICAgRlRjcFNlbmRCdWZmZXIsCisgICAgRlRjcFJlY3ZCdWZmZXI6IEludGVnZXI7CisgICAgRkFjY2VwdFRpbWVvdXQ6IExvbmd3b3JkOworICAgIEZMaXN0ZW5pbmcsCisgICAgRkludGVycnVwdGFibGVDaGlsZHJlbjogQm9vbGVhbjsKKyAgICBGSW50ZXJydXB0U29ja1dyaXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdGlmaWVkIG9uIEludGVycnVwdCgpCisgICAgRkludGVycnVwdFNvY2tSZWFkZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1c2VkIGluIHNlbGVjdCB3aXRoIEZTb2NrZXQgZm9yIGludGVycnVwdGFiaWxpdHkKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyOiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgICAgICAgICAgICAgICAgIC8vIGlzIG5vdGlmaWVkIG9uIEludGVycnVwdENoaWxkcmVuKCkKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyOiBJU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0PjsgIC8vIGlmIEZudGVycnVwdGFibGVDaGlsZHJlbiB0aGlzIGlzIHNoYXJlZCB3aXRoIGNoaWxkIFRTb2NrZXRzCisgICAgRkxpc3RlbkNhbGxiYWNrLAorICAgIEZBY2NlcHRDYWxsYmFjazogVFNlcnZlclNvY2tldEZ1bmM7CisgICAgZnVuY3Rpb24gQ3JlYXRlU29ja2V0T2JqKENsaWVudDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOiBUU29ja2V0OworICAgIHByb2NlZHVyZSBOb3RpZnkoTm90aWZ5U29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CisgICAgcHJvY2VkdXJlIFNldEludGVycnVwdGFibGVDaGlsZHJlbihBVmFsdWU6IEJvb2xlYW4pOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIENvbW1vbkluaXQ7IG92ZXJyaWRlOworICBwdWJsaWMgY29uc3QKKyAgICBERUZBVUxUX0JBQ0tMT0cgPSAxMDI0OworICBwdWJsaWMKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yLgorICAgIC8vCisgICAgLy8gQHBhcmFtIHBvcnQgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3Rvci4KKyAgICAvLworICAgIC8vIEBwYXJhbSBwb3J0ICAgICAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAgLy8gQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICAvLyBAcGFyYW0gcmVjdlRpbWVvdXQgU29ja2V0IHJlY2VpdmUgdGltZW91dAorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBU2VuZFRpbWVvdXQsIEFSZWN2VGltZW91dDogTG9uZ3dvcmQ7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yLgorICAgIC8vCisgICAgLy8gQHBhcmFtIGFkZHJlc3MgQWRkcmVzcyB0byBiaW5kIHRvCisgICAgLy8gQHBhcmFtIHBvcnQgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFBZGRyZXNzOiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgcHJvY2VkdXJlIExpc3RlbjsKKyAgICBmdW5jdGlvbiBBY2NlcHQ6IFRTb2NrZXQ7CisgICAgcHJvY2VkdXJlIEludGVycnVwdDsKKyAgICBwcm9jZWR1cmUgSW50ZXJydXB0Q2hpbGRyZW47CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKworICAgIHByb3BlcnR5IEFjY2VwdEJhY2tsb2c6IEludGVnZXIgcmVhZCBGQWNjZXB0QmFja2xvZyB3cml0ZSBGQWNjZXB0QmFja2xvZzsKKyAgICBwcm9wZXJ0eSBBY2NlcHRUaW1lb3V0OiBMb25nd29yZCByZWFkIEZBY2NlcHRUaW1lb3V0IHdyaXRlIEZBY2NlcHRUaW1lb3V0OworICAgIHByb3BlcnR5IFJldHJ5TGltaXQ6IEludGVnZXIgcmVhZCBGUmV0cnlMaW1pdCB3cml0ZSBGUmV0cnlMaW1pdDsKKyAgICBwcm9wZXJ0eSBSZXRyeURlbGF5OiBJbnRlZ2VyIHJlYWQgRlJldHJ5RGVsYXkgd3JpdGUgRlJldHJ5RGVsYXk7CisgICAgcHJvcGVydHkgVGNwU2VuZEJ1ZmZlcjogSW50ZWdlciByZWFkIEZUY3BTZW5kQnVmZmVyIHdyaXRlIEZUY3BTZW5kQnVmZmVyOworICAgIHByb3BlcnR5IFRjcFJlY3ZCdWZmZXI6IEludGVnZXIgcmVhZCBGVGNwUmVjdkJ1ZmZlciB3cml0ZSBGVGNwUmVjdkJ1ZmZlcjsKKworICAgIC8vIFdoZW4gZW5hYmxlZCAodGhlIGRlZmF1bHQpLCBuZXcgY2hpbGRyZW4gVFNvY2tldHMgd2lsbCBiZSBjb25zdHJ1Y3RlZCBzbworICAgIC8vIHRoZXkgY2FuIGJlIGludGVycnVwdGVkIGJ5IFRTZXJ2ZXJUcmFuc3BvcnQuSW50ZXJydXB0Q2hpbGRyZW4oKS4KKyAgICAvLyBUaGlzIGlzIG1vcmUgZXhwZW5zaXZlIGluIHRlcm1zIG9mIHN5c3RlbSBjYWxscyAocG9sbCArIHJlY3YpIGhvd2V2ZXIKKyAgICAvLyBlbnN1cmVzIGEgY29ubmVjdGVkIGNsaWVudCBjYW5ub3QgaW50ZXJmZXJlIHdpdGggVFNlcnZlci5TdG9wKCkuCisgICAgLy8KKyAgICAvLyBXaGVuIGRpc2FibGVkLCBUU29ja2V0IGNoaWxkcmVuIGRvIG5vdCBpbmN1ciBhbiBhZGRpdGlvbmFsIHBvbGwoKSBjYWxsLgorICAgIC8vIFNlcnZlci1zaWRlIHJlYWRzIGFyZSBtb3JlIGVmZmljaWVudCwgaG93ZXZlciBhIGNsaWVudCBjYW4gaW50ZXJmZXJlIHdpdGgKKyAgICAvLyB0aGUgc2VydmVyJ3MgYWJpbGl0eSB0byBzaHV0ZG93biBwcm9wZXJseSBieSBzdGF5aW5nIGNvbm5lY3RlZC4KKyAgICAvLworICAgIC8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBsaXN0ZW4oKTsgbW9kZSBjYW5ub3QgYmUgc3dpdGNoZWQgYWZ0ZXIgdGhhdC4KKyAgICAvLyBcdGhyb3dzIEVQcm9wZXJ0eUVycm9yIGlmIGxpc3RlbigpIGhhcyBiZWVuIGNhbGxlZAorICAgIHByb3BlcnR5IEludGVycnVwdGFibGVDaGlsZHJlbjogQm9vbGVhbiByZWFkIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gd3JpdGUgU2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuOworCisgICAgLy8gbGlzdGVuQ2FsbGJhY2sgZ2V0cyBjYWxsZWQganVzdCBiZWZvcmUgbGlzdGVuLCBhbmQgYWZ0ZXIgYWxsIFRocmlmdAorICAgIC8vIHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZSBjdXN0b20gc2V0c29ja29wdAorICAgIC8vIHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBsaXN0ZW5pbmcgc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgICBwcm9wZXJ0eSBMaXN0ZW5DYWxsYmFjazogVFNlcnZlclNvY2tldEZ1bmMgcmVhZCBGTGlzdGVuQ2FsbGJhY2sgd3JpdGUgRkxpc3RlbkNhbGxiYWNrOworCisgICAgLy8gYWNjZXB0Q2FsbGJhY2sgZ2V0cyBjYWxsZWQgYWZ0ZXIgZWFjaCBhY2NlcHQgY2FsbCwgb24gdGhlIG5ld2x5IGNyZWF0ZWQgc29ja2V0LgorICAgIC8vIEl0IGlzIGNhbGxlZCBhZnRlciBhbGwgVGhyaWZ0IHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZQorICAgIC8vIGN1c3RvbSBzZXRzb2Nrb3B0IHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBhY2NlcHRlZAorICAgIC8vIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgICAgcHJvcGVydHkgQWNjZXB0Q2FsbGJhY2s6IFRTZXJ2ZXJTb2NrZXRGdW5jIHJlYWQgRkFjY2VwdENhbGxiYWNrIHdyaXRlIEZBY2NlcHRDYWxsYmFjazsKKyAgZW5kOworCit7JEVORElGfSAvLyBub3QgZm9yIE9MRF9TT0NLRVRTCitpbXBsZW1lbnRhdGlvbgoreyRJRk5ERUYgT0xEX1NPQ0tFVFN9IC8vIG5vdCBmb3IgT0xEX1NPQ0tFVFMKKwordXNlcworICBTeXN0ZW0uU3lzVXRpbHMsIFN5c3RlbS5NYXRoLCBTeXN0ZW0uRGF0ZVV0aWxzLCBUaHJpZnQuVHJhbnNwb3J0OworCitjb25zdHJ1Y3RvciBUQmFzZVNvY2tldC5UR2V0QWRkckluZm9XcmFwcGVyLkNyZWF0ZShBTm9kZSwgQVNlcnZpY2U6IHN0cmluZzsgQUhpbnRzOiBQQWRkckluZm9XKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZOb2RlIDo9IEFOb2RlOworICBGU2VydmljZSA6PSBBU2VydmljZTsKKyAgRkhpbnRzIDo9IEFIaW50czsKKyAgRlJlcyA6PSBuaWw7CitlbmQ7CisKK2Rlc3RydWN0b3IgVEJhc2VTb2NrZXQuVEdldEFkZHJJbmZvV3JhcHBlci5EZXN0cm95OworYmVnaW4KKyAgaWYgQXNzaWduZWQoRlJlcykgdGhlbgorICAgIEZyZWVBZGRySW5mb1coRlJlcyk7CisgIGluaGVyaXRlZCBEZXN0cm95OworZW5kOworCitmdW5jdGlvbiBUQmFzZVNvY2tldC5UR2V0QWRkckluZm9XcmFwcGVyLkluaXQ6IEludGVnZXI7CitiZWdpbgorICBpZiBGUmVzID0gbmlsIHRoZW4KKyAgICBFeGl0KEdldEFkZHJJbmZvVyhARk5vZGVbMV0sIEBGU2VydmljZVsxXSwgRkhpbnRzXiwgRlJlcykpOworICBSZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VTb2NrZXQuVEdldEFkZHJJbmZvV3JhcHBlci5HZXRSZXM6IFBBZGRySW5mb1c7CitiZWdpbgorICBSZXN1bHQgOj0gRlJlczsKK2VuZDsKKworcHJvY2VkdXJlIERlc3Ryb3llck9mRmluZVNvY2tldHMoc3NvY2s6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKK2JlZ2luCisgIGNsb3Nlc29ja2V0KHNzb2NrKTsKK2VuZDsKKworZnVuY3Rpb24gVFNjb3BlSWQuR2V0Qml0RmllbGQoTG9jOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSAoVmFsdWUgc2hyIChMb2Mgc2hyIDgpKSBhbmQgKCgxIHNobCAoTG9jIGFuZCAkRkYpKSAtIDEpOworZW5kOworCitwcm9jZWR1cmUgVFNjb3BlSWQuU2V0Qml0RmllbGQoTG9jOiBJbnRlZ2VyOyBjb25zdCBhVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgVmFsdWUgOj0gKFZhbHVlIGFuZCBVTE9ORygobm90ICgoMSBzaGwgKExvYyBhbmQgJEZGKSkgLSAxKSkpKSBvciBVTE9ORyhhVmFsdWUgc2hsIChMb2Mgc2hyIDgpKTsKK2VuZDsKKworZnVuY3Rpb24gZ2V0YWRkcmluZm87IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdnZXRhZGRyaW5mbyc7CitmdW5jdGlvbiBHZXRBZGRySW5mb1c7IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdHZXRBZGRySW5mb1cnOworcHJvY2VkdXJlIGZyZWVhZGRyaW5mbzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ2ZyZWVhZGRyaW5mbyc7Citwcm9jZWR1cmUgRnJlZUFkZHJJbmZvVzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ0ZyZWVBZGRySW5mb1cnOworZnVuY3Rpb24gZ2V0bmFtZWluZm87IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdnZXRuYW1laW5mbyc7CitmdW5jdGlvbiBHZXROYW1lSW5mb1c7IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdHZXROYW1lSW5mb1cnOworCitjb25zdHJ1Y3RvciBUU21hcnRQb2ludGVyPFQ+LkNyZWF0ZShBVmFsdWU6IFQ7IEFEZXN0cm95ZXI6IFRTbWFydFBvaW50ZXJEZXN0cm95ZXI8VD4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlZhbHVlIDo9IEFWYWx1ZTsKKyAgRkRlc3Ryb3llciA6PSBBRGVzdHJveWVyOworZW5kOworCitkZXN0cnVjdG9yIFRTbWFydFBvaW50ZXI8VD4uRGVzdHJveTsKK2JlZ2luCisgIGlmIEFzc2lnbmVkKEZEZXN0cm95ZXIpIHRoZW4gRkRlc3Ryb3llcihGVmFsdWUpOworICBpbmhlcml0ZWQgRGVzdHJveTsKK2VuZDsKKworZnVuY3Rpb24gVFNtYXJ0UG9pbnRlcjxUPi5JbnZva2U6IFQ7CitiZWdpbgorICBSZXN1bHQgOj0gRlZhbHVlOworZW5kOworCitjbGFzcyBjb25zdHJ1Y3RvciBUQmFzZVNvY2tldC5DcmVhdGU7Cit2YXIKKyAgVmVyc2lvbjogV09SRDsKKyAgRGF0YTogV1NBRGF0YTsKKyAgRXJyb3I6IEludGVnZXI7CitiZWdpbgorICBWZXJzaW9uIDo9ICQwMjAyOworICBGaWxsQ2hhcihEYXRhLCBTaXplT2YoRGF0YSksIDApOworICBFcnJvciA6PSBXU0FTdGFydHVwKFZlcnNpb24sIERhdGEpOworICBpZiBFcnJvciA8PiAwIHRoZW4KKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXaW5zb2NrLicpOworZW5kOworCitjbGFzcyBkZXN0cnVjdG9yIFRCYXNlU29ja2V0LkRlc3Ryb3k7CitiZWdpbgorICBXU0FDbGVhbnVwOworZW5kOworCitjbGFzcyBwcm9jZWR1cmUgVEJhc2VTb2NrZXQuRGVmYXVsdExvZ0RlbGVnYXRlKGNvbnN0IFN0cjogc3RyaW5nKTsKK3ZhcgorICBPdXRTdHI6IHN0cmluZzsKK2JlZ2luCisgIE91dFN0ciA6PSBGb3JtYXQoJ1RocmlmdDogJXMgJXMnLCBbRGF0ZVRpbWVUb1N0cihOb3csIFRGb3JtYXRTZXR0aW5ncy5DcmVhdGUpLCBTdHJdKTsKKyAgdHJ5CisgICAgV3JpdGVsbihPdXRTdHIpOworICAgIGlmIElvUmVzdWx0IDw+IDAgdGhlbiBPdXRwdXREZWJ1Z1N0cmluZyhQQ2hhcihPdXRTdHIpKTsKKyAgZXhjZXB0CisgICAgT3V0cHV0RGVidWdTdHJpbmcoUENoYXIoT3V0U3RyKSk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LkNvbW1vbkluaXQ7CitiZWdpbgorICBGU29ja2V0IDo9IElOVkFMSURfU09DS0VUOworICBGUG9ydCA6PSAwOworICBGU2VuZFRpbWVvdXQgOj0gMDsKKyAgRlJlY3ZUaW1lb3V0IDo9IDA7CisgIEZLZWVwQWxpdmUgOj0gRmFsc2U7CisgIEZMb2dEZWxlZ2F0ZSA6PSBEZWZhdWx0TG9nRGVsZWdhdGU7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlU29ja2V0LkNyZWF0ZVNvY2tldChBQWRkcmVzczogc3RyaW5nOyBBUG9ydDogSW50ZWdlcik6IElHZXRBZGRySW5mb1dyYXBwZXI7Cit2YXIKKyAgSGludHM6IFRBZGRySW5mb1c7CisgIFJlczogUEFkZHJJbmZvVzsKKyAgVGhlUG9ydDogYXJyYXlbMC4uNV0gb2YgQ2hhcjsKKyAgRXJyb3I6IEludGVnZXI7CitiZWdpbgorICBGaWxsQ2hhcihIaW50cywgU2l6ZU9mKEhpbnRzKSwgMCk7CisgIEhpbnRzLmFpX2ZhbWlseSA6PSBQRl9VTlNQRUM7CisgIEhpbnRzLmFpX3NvY2t0eXBlIDo9IFNPQ0tfU1RSRUFNOworICBIaW50cy5haV9mbGFncyA6PSBBSV9QQVNTSVZFIG9yIEFJX0FERFJDT05GSUc7CisgIFN0ckZtdChUaGVQb3J0LCAnJWQnLCBbRlBvcnRdKTsKKworICBSZXN1bHQgOj0gVEdldEFkZHJJbmZvV3JhcHBlci5DcmVhdGUoQUFkZHJlc3MsIFRoZVBvcnQsIEBIaW50cyk7CisgIEVycm9yIDo9IFJlc3VsdC5Jbml0OworICBpZiBFcnJvciA8PiAwIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ0dldEFkZHJJbmZvVyAlZDogJXMnLCBbRXJyb3IsIFN5c0Vycm9yTWVzc2FnZShFcnJvcildKSk7CisgICAgQ2xvc2U7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDb3VsZCBub3QgcmVzb2x2ZSBob3N0IGZvciBzZXJ2ZXIgc29ja2V0LicpOworICBlbmQ7CisKKyAgLy8gUGljayB0aGUgaXB2NiBhZGRyZXNzIGZpcnN0IHNpbmNlIGlwdjQgYWRkcmVzc2VzIGNhbiBiZSBtYXBwZWQKKyAgLy8gaW50byBpcHY2IHNwYWNlLgorICBSZXMgOj0gUmVzdWx0LlJlczsKKyAgd2hpbGUgQXNzaWduZWQoUmVzKSBkbyBiZWdpbgorICAgIGlmIChSZXNeLmFpX2ZhbWlseSA9IEFGX0lORVQ2KSBvciAobm90IEFzc2lnbmVkKFJlc14uYWlfbmV4dCkpIHRoZW4KKyAgICAgIEJyZWFrOworICAgIFJlcyA6PSBSZXNeLmFpX25leHQ7CisgIGVuZDsKKworICBGU29ja2V0IDo9IFdpbmFwaS5XaW5zb2NrMi5zb2NrZXQoUmVzXi5haV9mYW1pbHksIFJlc14uYWlfc29ja3R5cGUsIFJlc14uYWlfcHJvdG9jb2wpOworICBpZiBGU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbiBiZWdpbgorICAgIEVycm9yIDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RCYXNlU29ja2V0LkNyZWF0ZVNvY2tldCgpIHNvY2tldCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJvcildKSk7CisgICAgQ2xvc2U7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnc29ja2V0KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJvcildKSk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LlNldFJlY3ZUaW1lb3V0KEFSZWN2VGltZW91dDogTG9uZ3dvcmQpOworYmVnaW4KKyAgRlJlY3ZUaW1lb3V0IDo9IEFSZWN2VGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LlNldFNlbmRUaW1lb3V0KEFTZW5kVGltZW91dDogTG9uZ3dvcmQpOworYmVnaW4KKyAgRlNlbmRUaW1lb3V0IDo9IEFTZW5kVGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LlNldEtlZXBBbGl2ZShBS2VlcEFsaXZlOiBCb29sZWFuKTsKK2JlZ2luCisgIEZLZWVwQWxpdmUgOj0gQUtlZXBBbGl2ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LlNldFNvY2tldChBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CitiZWdpbgorICBpZiBGU29ja2V0IDw+IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBDbG9zZTsKKyAgRlNvY2tldCA6PSBBU29ja2V0OworZW5kOworCitjb25zdHJ1Y3RvciBUQmFzZVNvY2tldC5DcmVhdGUoQUxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgQ29tbW9uSW5pdDsKKyAgaWYgQXNzaWduZWQoQUxvZ0RlbGVnYXRlKSB0aGVuIEZMb2dEZWxlZ2F0ZSA6PSBBTG9nRGVsZWdhdGU7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCYXNlU29ja2V0LkNyZWF0ZShBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgQ29tbW9uSW5pdDsKKyAgRlBvcnQgOj0gQVBvcnQ7CisgIGlmIEFzc2lnbmVkKEFMb2dEZWxlZ2F0ZSkgdGhlbiBGTG9nRGVsZWdhdGUgOj0gQUxvZ0RlbGVnYXRlOworZW5kOworCitkZXN0cnVjdG9yIFRCYXNlU29ja2V0LkRlc3Ryb3k7CitiZWdpbgorICBDbG9zZTsKKyAgaW5oZXJpdGVkIERlc3Ryb3k7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5DbG9zZTsKK2JlZ2luCisgIGlmIEZTb2NrZXQgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbiBiZWdpbgorICAgIHNodXRkb3duKEZTb2NrZXQsIFNEX0JPVEgpOworICAgIGNsb3Nlc29ja2V0KEZTb2NrZXQpOworICBlbmQ7CisgIEZTb2NrZXQgOj0gSU5WQUxJRF9TT0NLRVQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LkluaXRQZWVySW5mbzsKK2JlZ2luCisgIEZDYWNoZWRQZWVyQWRkci5pcHY0LnNpbl9mYW1pbHkgOj0gQUZfVU5TUEVDOworICBGUGVlckhvc3QgOj0gJyc7CisgIEZQZWVyQWRkcmVzcyA6PSAnJzsKKyAgRlBlZXJQb3J0IDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LkNvbW1vbkluaXQ7CitiZWdpbgorICBpbmhlcml0ZWQgQ29tbW9uSW5pdDsKKyAgRkhvc3QgOj0gJyc7CisgIEZJbnRlcnJ1cHRMaXN0ZW5lciA6PSBuaWw7CisgIEZDb25uVGltZW91dCA6PSAwOworICBGTGluZ2VyT24gOj0gVHJ1ZTsKKyAgRkxpbmdlclZhbCA6PSAwOworICBGTm9EZWxheSA6PSBUcnVlOworICBGTWF4UmVjdlJldHJpZXMgOj0gNTsKKyAgSW5pdFBlZXJJbmZvOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5PcGVuQ29ubmVjdGlvbihSZXM6IFRCYXNlU29ja2V0LklHZXRBZGRySW5mb1dyYXBwZXIpOworbGFiZWwKKyAgRG9uZTsKK3ZhcgorICBFcnJub0NvcHk6IEludGVnZXI7CisgIFJldCwKKyAgUmV0MjogSW50ZWdlcjsKKyAgRmRzOiBURmRTZXQ7CisgIFRWYWw6IFRUaW1lVmFsOworICBQVFZhbDogUFRpbWVWYWw7CisgIFZhbCwKKyAgTG9uOiBJbnRlZ2VyOworICBPbmUsCisgIFplcm86IENhcmRpbmFsOworYmVnaW4KKyAgaWYgU2VuZFRpbWVvdXQgPiAwIHRoZW4gU2V0U2VuZFRpbWVvdXQoU2VuZFRpbWVvdXQpOworICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbiBTZXRSZWN2VGltZW91dChSZWN2VGltZW91dCk7CisgIGlmIEtlZXBBbGl2ZSB0aGVuIFNldEtlZXBBbGl2ZShLZWVwQWxpdmUpOworICBTZXRMaW5nZXIoRkxpbmdlck9uLCBGTGluZ2VyVmFsKTsKKyAgU2V0Tm9EZWxheShGTm9EZWxheSk7CisKKyAgLy8gU2V0IHRoZSBzb2NrZXQgdG8gYmUgbm9uIGJsb2NraW5nIGZvciBjb25uZWN0IGlmIGEgdGltZW91dCBleGlzdHMKKyAgWmVybyA6PSAwOworICBpZiBGQ29ublRpbWVvdXQgPiAwIHRoZW4gYmVnaW4KKyAgICBPbmUgOj0gMTsKKyAgICBpZiBpb2N0bHNvY2tldChTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIE9uZSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIGlvY3Rsc29ja2V0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdpb2N0bHNvY2tldCgpIGZhaWxlZDogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIGlmIGlvY3Rsc29ja2V0KFNvY2tldCwgSW50ZWdlcihGSU9OQklPKSwgWmVybykgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIGlvY3Rsc29ja2V0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdpb2N0bHNvY2tldCgpIGZhaWxlZDogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworICBlbmQ7CisKKyAgUmV0IDo9IGNvbm5lY3QoU29ja2V0LCBSZXMuUmVzXi5haV9hZGRyXiwgUmVzLlJlc14uYWlfYWRkcmxlbik7CisgIGlmIFJldCA9IDAgdGhlbiBnb3RvIERvbmU7CisKKyAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgaWYgKEVycm5vQ29weSA8PiBXU0FFSU5QUk9HUkVTUykgYW5kIChFcnJub0NvcHkgPD4gV1NBRVdPVUxEQkxPQ0spIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBjb25uZWN0KCkgJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ2Nvbm5lY3QoKSBmYWlsZWQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgRkRfWkVSTyhGZHMpOworICBfRkRfU0VUKFNvY2tldCwgRmRzKTsKKyAgaWYgRkNvbm5UaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgVFZhbC50dl9zZWMgOj0gRkNvbm5UaW1lb3V0IGRpdiAxMDAwOworICAgIFRWYWwudHZfdXNlYyA6PSAoRkNvbm5UaW1lb3V0IG1vZCAxMDAwKSAqIDEwMDA7CisgICAgUFRWYWwgOj0gQFRWYWw7CisgIGVuZAorICBlbHNlCisgICAgUFRWYWwgOj0gbmlsOworICBSZXQgOj0gc2VsZWN0KDEsIG5pbCwgQEZkcywgbmlsLCBQVFZhbCk7CisKKyAgaWYgUmV0ID4gMCB0aGVuIGJlZ2luCisgICAgLy8gRW5zdXJlIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIGFuZCB0aGF0IHRoZXJlIGFyZSBubyBlcnJvcnMgc2V0CisgICAgTG9uIDo9IFNpemVPZihWYWwpOworICAgIFJldDIgOj0gZ2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCBAVmFsLCBMb24pOworICAgIGlmIFJldDIgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIGdldHNvY2tvcHQoKSAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdnZXRzb2Nrb3B0KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgICAvLyBubyBlcnJvcnMgb24gc29ja2V0LCBnbyB0byB0b3duCisgICAgaWYgVmFsID0gMCB0aGVuIGdvdG8gRG9uZTsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBlcnJvciBvbiBzb2NrZXQgKGFmdGVyIHNlbGVjdCgpKSAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnc29ja2V0IE9wZW5Db25uZWN0aW9uKCkgZXJyb3I6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShWYWwpXSkpOworICBlbmQKKyAgZWxzZSBpZiBSZXQgPSAwIHRoZW4gYmVnaW4KKyAgICAvLyBzb2NrZXQgdGltZWQgb3V0CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgdGltZWQgb3V0ICcsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ09wZW5Db25uZWN0aW9uKCkgdGltZWQgb3V0Jyk7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgLy8gZXJyb3Igb24gc2VsZWN0KCkKKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIHNlbGVjdCgpICcsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdzZWxlY3QoKSBmYWlsZWQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKK0RvbmU6CisgIC8vIFNldCBzb2NrZXQgYmFjayB0byBub3JtYWwgbW9kZSAoYmxvY2tpbmcpCisgIGlvY3Rsc29ja2V0KFNvY2tldCwgSW50ZWdlcihGSU9OQklPKSwgWmVybyk7CisgIFNldENhY2hlZEFkZHJlc3MoUmVzLlJlc14uYWlfYWRkcl4sIFJlcy5SZXNeLmFpX2FkZHJsZW4pOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5Mb2NhbE9wZW47Cit2YXIKKyAgUmVzOiBUQmFzZVNvY2tldC5JR2V0QWRkckluZm9XcmFwcGVyOworYmVnaW4KKyAgaWYgSXNPcGVuIHRoZW4gRXhpdDsKKworICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgorICBpZiAoUG9ydCA8IDApIG9yIChQb3J0ID4gJEZGRkYpIHRoZW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncy5DcmVhdGUoJ1NwZWNpZmllZCBwb3J0IGlzIGludmFsaWQnKTsKKworICBSZXMgOj0gQ3JlYXRlU29ja2V0KEhvc3QsIFBvcnQpOworCisgIE9wZW5Db25uZWN0aW9uKFJlcyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldEdlbmVyaWNUaW1lb3V0KFM6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBUaW1lb3V0OiBMb25nd29yZDsgT3B0TmFtZTogSW50ZWdlcik7Cit2YXIKKyAgVGltZTogRFdPUkQ7CitiZWdpbgorICBpZiBTID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIEV4aXQ7CisKKyAgVGltZSA6PSBUaW1lb3V0OworCisgIGlmIHNldHNvY2tvcHQoUywgU09MX1NPQ0tFVCwgT3B0TmFtZSwgQFRpbWUsIFNpemVPZihUaW1lKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnU2V0R2VuZXJpY1RpbWVvdXQoKSBzZXRzb2Nrb3B0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IFNvY2tldCA8PiBJTlZBTElEX1NPQ0tFVDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0Tm9EZWxheShBTm9EZWxheTogQm9vbGVhbik7Cit2YXIKKyAgVjogSW50ZWdlcjsKK2JlZ2luCisgIEZOb0RlbGF5IDo9IEFOb0RlbGF5OworICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgRXhpdDsKKworICBWIDo9IElmVGhlbihGTm9EZWxheSwgMSwgMCk7CisgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIEBWLCBTaXplT2YoVikpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuU2V0Tm9EZWxheSgpIHNldHNvY2tvcHQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRTb2NrZXRJbmZvOiBzdHJpbmc7CitiZWdpbgorICBpZiAoRkhvc3QgPSAnJykgb3IgKFBvcnQgPSAwKSB0aGVuCisgICAgUmVzdWx0IDo9ICc8SG9zdDogJyArIEdldFBlZXJBZGRyZXNzICsgJyBQb3J0OiAnICsgR2V0UGVlclBvcnQuVG9TdHJpbmcgKyAnPicKKyAgZWxzZQorICAgIFJlc3VsdCA6PSAnPEhvc3Q6ICcgKyBGSG9zdCArICcgUG9ydDogJyArIFBvcnQuVG9TdHJpbmcgKyAnPic7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0UGVlckhvc3Q6IHN0cmluZzsKK3ZhcgorICBBZGRyOiBUU29ja0FkZHJTdG9yYWdlOworICBBZGRyUHRyOiBQU29ja0FkZHI7CisgIEFkZHJMZW46IEludGVnZXI7CisgIENsaWVudEhvc3Q6IGFycmF5WzAuLk5JX01BWEhPU1QtMV0gb2YgQ2hhcjsKKyAgQ2xpZW50U2VydmljZTogYXJyYXlbMC4uTklfTUFYU0VSVi0xXSBvZiBDaGFyOworYmVnaW4KKyAgaWYgRlBlZXJIb3N0ID0gJycgdGhlbiBiZWdpbgorICAgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIEV4aXQoRlBlZXJIb3N0KTsKKworICAgIEFkZHJQdHIgOj0gR2V0Q2FjaGVkQWRkcmVzcyhBZGRyTGVuKTsKKyAgICBpZiBBZGRyUHRyID0gbmlsIHRoZW4gYmVnaW4KKyAgICAgIEFkZHJMZW4gOj0gU2l6ZU9mKEFkZHIpOworICAgICAgaWYgZ2V0cGVlcm5hbWUoU29ja2V0LCBQU29ja0FkZHIoQEFkZHIpXiwgQWRkckxlbikgPD4gMCB0aGVuCisgICAgICAgIEV4aXQoRlBlZXJIb3N0KTsKKyAgICAgIEFkZHJQdHIgOj0gUFNvY2tBZGRyKEBBZGRyKTsKKyAgICAgIFNldENhY2hlZEFkZHJlc3MoQWRkclB0cl4sIEFkZHJMZW4pOworICAgIGVuZDsKKworICAgIEdldE5hbWVJbmZvVyhBZGRyUHRyXiwgQWRkckxlbiwgQ2xpZW50SG9zdCwgTklfTUFYSE9TVCwgQ2xpZW50U2VydmljZSwgTklfTUFYU0VSViwgMCk7CisgICAgRlBlZXJIb3N0IDo9IENsaWVudEhvc3Q7CisgIGVuZDsKKyAgUmVzdWx0IDo9IEZQZWVySG9zdDsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRQZWVyQWRkcmVzczogc3RyaW5nOwordmFyCisgIEFkZHI6IFRTb2NrQWRkclN0b3JhZ2U7CisgIEFkZHJQdHI6IFBTb2NrQWRkcjsKKyAgQWRkckxlbjogSW50ZWdlcjsKKyAgQ2xpZW50SG9zdDogYXJyYXlbMC4uTklfTUFYSE9TVC0xXSBvZiBDaGFyOworICBDbGllbnRTZXJ2aWNlOiBhcnJheVswLi5OSV9NQVhTRVJWLTFdIG9mIENoYXI7CitiZWdpbgorICBpZiBGUGVlckFkZHJlc3MgPSAnJyB0aGVuIGJlZ2luCisgICAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgICAgRXhpdChGUGVlckFkZHJlc3MpOworCisgICAgQWRkclB0ciA6PSBHZXRDYWNoZWRBZGRyZXNzKEFkZHJMZW4pOworICAgIGlmIEFkZHJQdHIgPSBuaWwgdGhlbiBiZWdpbgorICAgICAgQWRkckxlbiA6PSBTaXplT2YoQWRkcik7CisgICAgICBpZiBnZXRwZWVybmFtZShTb2NrZXQsIFBTb2NrQWRkcihAQWRkcileLCBBZGRyTGVuKSA8PiAwIHRoZW4KKyAgICAgICAgRXhpdChGUGVlckhvc3QpOworICAgICAgQWRkclB0ciA6PSBQU29ja0FkZHIoQEFkZHIpOworICAgICAgU2V0Q2FjaGVkQWRkcmVzcyhBZGRyUHRyXiwgQWRkckxlbik7CisgICAgZW5kOworCisgICAgR2V0TmFtZUluZm9XKEFkZHJQdHJeLCBBZGRyTGVuLCBDbGllbnRIb3N0LCBOSV9NQVhIT1NULCBDbGllbnRTZXJ2aWNlLCBOSV9NQVhTRVJWLCBOSV9OVU1FUklDSE9TVCBvciBOSV9OVU1FUklDU0VSVik7CisgICAgRlBlZXJBZGRyZXNzIDo9IENsaWVudEhvc3Q7CisgICAgVHJ5U3RyVG9JbnQoQ2xpZW50U2VydmljZSwgRlBlZXJQb3J0KTsKKyAgZW5kOworICBSZXN1bHQgOj0gRlBlZXJBZGRyZXNzCitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0UGVlclBvcnQ6IEludGVnZXI7CitiZWdpbgorICBHZXRQZWVyQWRkcmVzczsKKyAgUmVzdWx0IDo9IEZQZWVyUG9ydDsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRPcmlnaW46IHN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSBHZXRQZWVySG9zdCArICc6JyArIEdldFBlZXJQb3J0LlRvU3RyaW5nOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQ6IExvbmd3b3JkKTsKK2JlZ2luCisgIGluaGVyaXRlZCBTZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQpOworICBTZXRHZW5lcmljVGltZW91dChTb2NrZXQsIEFSZWN2VGltZW91dCwgU09fUkNWVElNRU8pOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQ6IExvbmd3b3JkKTsKK2JlZ2luCisgIGluaGVyaXRlZCBTZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQpOworICBTZXRHZW5lcmljVGltZW91dChTb2NrZXQsIEFTZW5kVGltZW91dCwgU09fU05EVElNRU8pOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRLZWVwQWxpdmUoQUtlZXBBbGl2ZTogQm9vbGVhbik7Cit2YXIKKyAgVmFsdWU6IEludGVnZXI7CitiZWdpbgorICBpbmhlcml0ZWQgU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmUpOworCisgIFZhbHVlIDo9IElmVGhlbihLZWVwQWxpdmUsIDEsIDApOworICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCBAVmFsdWUsIFNpemVPZihWYWx1ZSkpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuU2V0S2VlcEFsaXZlKCkgc2V0c29ja29wdCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworZW5kOworCitjb25zdHJ1Y3RvciBUU29ja2V0LkNyZWF0ZShBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7CitiZWdpbgorICAvLyBOb3QgbmVlZGVkLCBidXQganVzdCBhIHBsYWNlaG9sZGVyCisgIGluaGVyaXRlZCBDcmVhdGUoQUxvZ0RlbGVnYXRlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNvY2tldC5DcmVhdGUoQUhvc3Q6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQVBvcnQsIEFMb2dEZWxlZ2F0ZSk7CisgIEZIb3N0IDo9IEFIb3N0OworZW5kOworCitjb25zdHJ1Y3RvciBUU29ja2V0LkNyZWF0ZShBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBTG9nRGVsZWdhdGUpOworICBTb2NrZXQgOj0gQVNvY2tldDsKK2VuZDsKKworY29uc3RydWN0b3IgVFNvY2tldC5DcmVhdGUoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IEFJbnRlcnJ1cHRMaXN0ZW5lcjogSVNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD47CisgIEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQUxvZ0RlbGVnYXRlKTsKKyAgU29ja2V0IDo9IEFTb2NrZXQ7CisgIEZJbnRlcnJ1cHRMaXN0ZW5lciA6PSBBSW50ZXJydXB0TGlzdGVuZXI7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0Lk9wZW47CitiZWdpbgorICBpZiBJc09wZW4gdGhlbiBFeGl0OworICBMb2NhbE9wZW47CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LkNsb3NlOworYmVnaW4KKyAgaW5oZXJpdGVkIENsb3NlOworICBJbml0UGVlckluZm87CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuUmVhZCh2YXIgQnVmOyBMZW46IEludGVnZXIpOiBJbnRlZ2VyOworbGFiZWwKKyAgVHJ5QWdhaW47Cit2YXIKKyAgUmV0cmllczogTG9uZ3dvcmQ7CisgIEVBZ2FpblRocmVzaG9sZCwKKyAgUmVhZEVsYXBzZWQ6IFVJbnQ2NDsKKyAgU3RhcnQ6IFREYXRlVGltZTsKKyAgR290OiBJbnRlZ2VyOworICBGZHM6IFRGZFNldDsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBUVmFsOiBUVGltZVZhbDsKKyAgUFRWYWw6IFBUaW1lVmFsOworICBSZXQ6IEludGVnZXI7CitiZWdpbgorICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBzb2NrZXQnKTsKKworICBSZXRyaWVzIDo9IDA7CisKKyAgLy8gVEhSSUZUX0VBR0FJTiBjYW4gYmUgc2lnbmFsbGVkIGJvdGggd2hlbiBhIHRpbWVvdXQgaGFzIG9jY3VycmVkIGFuZCB3aGVuCisgIC8vIHRoZSBzeXN0ZW0gaXMgb3V0IG9mIHJlc291cmNlcyAoYW4gYXdlc29tZSB1bmRvY3VtZW50ZWQgZmVhdHVyZSkuCisgIC8vIFRoZSBmb2xsb3dpbmcgaXMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgdGltZSBpbnRlcnZhbCB1bmRlciB3aGljaAorICAvLyBUSFJJRlRfRUFHQUlOIGlzIHRha2VuIHRvIGluZGljYXRlIGFuIG91dCBvZiByZXNvdXJjZXMgZXJyb3IuCisgIEVBZ2FpblRocmVzaG9sZCA6PSAwOworICBpZiBSZWN2VGltZW91dCA8PiAwIHRoZW4KKyAgICAvLyBpZiBhIHJlYWRUaW1lb3V0IGlzIHNwZWNpZmllZCBhbG9uZyB3aXRoIGEgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMsIHRoZW4KKyAgICAvLyB0aGUgdGhyZXNob2xkIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHJlYWQgdGltZW91dCBpcyBub3QgZXhjZWVkZWQgZXZlbiBpbiB0aGUKKyAgICAvLyBjYXNlIG9mIHJlc291cmNlIGVycm9ycworICAgIEVBZ2FpblRocmVzaG9sZCA6PSBSZWN2VGltZW91dCBkaXYgSWZUaGVuKEZNYXhSZWN2UmV0cmllcyA+IDAsIEZNYXhSZWN2UmV0cmllcywgMik7CisKK1RyeUFnYWluOgorICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAorICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbgorICAgIFN0YXJ0IDo9IE5vdworICBlbHNlCisgICAgLy8gaWYgdGhlcmUgaXMgbm8gcmVhZCB0aW1lb3V0IHdlIGRvbid0IG5lZWQgdGhlIFRPRCB0byBkZXRlcm1pbmUgd2hldGhlcgorICAgIC8vIGFuIFRIUklGVF9FQUdBSU4gaXMgZHVlIHRvIGEgdGltZW91dCBvciBhbiBvdXQtb2YtcmVzb3VyY2UgY29uZGl0aW9uLgorICAgIFN0YXJ0IDo9IDA7CisKKyAgaWYgQXNzaWduZWQoRkludGVycnVwdExpc3RlbmVyKSB0aGVuIGJlZ2luCisgICAgRkRfWkVSTyhGZHMpOworICAgIF9GRF9TRVQoU29ja2V0LCBGZHMpOworICAgIF9GRF9TRVQoRkludGVycnVwdExpc3RlbmVyLCBGZHMpOworICAgIGlmIFJlY3ZUaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgICBUVmFsLnR2X3NlYyA6PSBSZWN2VGltZW91dCBkaXYgMTAwMDsKKyAgICAgIFRWYWwudHZfdXNlYyA6PSAoUmVjdlRpbWVvdXQgbW9kIDEwMDApICogMTAwMDsKKyAgICAgIFBUVmFsIDo9IEBUVmFsOworICAgIGVuZAorICAgIGVsc2UKKyAgICAgIFBUVmFsIDo9IG5pbDsKKworICAgIFJldCA6PSBzZWxlY3QoMiwgQEZkcywgbmlsLCBuaWwsIFBUVmFsKTsKKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGlmIFJldCA8IDAgdGhlbiBiZWdpbgorICAgICAgLy8gZXJyb3IgY2FzZXMKKyAgICAgIGlmIChFcnJub0NvcHkgPSBXU0FFSU5UUikgYW5kIChSZXRyaWVzIDwgRk1heFJlY3ZSZXRyaWVzKSB0aGVuIGJlZ2luCisgICAgICAgIEluYyhSZXRyaWVzKTsKKyAgICAgICAgZ290byBUcnlBZ2FpbjsKKyAgICAgIGVuZDsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5SZWFkKCkgc2VsZWN0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdVbmtub3duOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQKKyAgICBlbHNlIGlmIFJldCA+IDAgdGhlbiBiZWdpbgorICAgICAgLy8gQ2hlY2sgdGhlIGludGVycnVwdExpc3RlbmVyCisgICAgICBpZiBGRF9JU1NFVChGSW50ZXJydXB0TGlzdGVuZXIsIEZkcykgdGhlbgorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQuQ3JlYXRlKCdJbnRlcnJ1cHRlZCcpOworICAgIGVuZAorICAgIGVsc2UgLy8gUmV0ID0gMAorICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnV1NBRVdPVUxEQkxPQ0sgKHRpbWVkIG91dCknKTsKKworICAgIC8vIGZhbGxpbmcgdGhyb3VnaCBtZWFucyB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcmVjdiBhbmQgaXQgY2Fubm90IGJsb2NrCisgIGVuZDsKKworICBHb3QgOj0gcmVjdihTb2NrZXQsIEJ1ZiwgTGVuLCAwKTsKKyAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgLy8gQ2hlY2sgZm9yIGVycm9yIG9uIHJlYWQKKyAgaWYgR290IDwgMCB0aGVuIGJlZ2luCisgICAgaWYgRXJybm9Db3B5ID0gV1NBRVdPVUxEQkxPQ0sgdGhlbiBiZWdpbgorICAgICAgLy8gaWYgbm8gdGltZW91dCB3ZSBjYW4gYXNzdW1lIHRoYXQgcmVzb3VyY2UgZXhoYXVzdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICBpZiBSZWN2VGltZW91dCA9IDAgdGhlbgorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdXU0FFV09VTERCTE9DSyAodW5hdmFpbGFibGUgcmVzb3VyY2VzKScpOworICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFjayBvZiByZXNvdXJjZXMgb3IgdGltZW91dCBjYXNlCisgICAgICBSZWFkRWxhcHNlZCA6PSBNaWxsaVNlY29uZHNCZXR3ZWVuKE5vdywgU3RhcnQpOworICAgICAgaWYgKEVBZ2FpblRocmVzaG9sZCA9IDApIG9yIChSZWFkRWxhcHNlZCA8IEVBZ2FpblRocmVzaG9sZCkgdGhlbiBiZWdpbgorICAgICAgICBpZiBSZXRyaWVzIDwgRk1heFJlY3ZSZXRyaWVzIHRoZW4gYmVnaW4KKyAgICAgICAgICBJbmMoUmV0cmllcyk7CisgICAgICAgICAgU2xlZXAoMSk7CisgICAgICAgICAgZ290byBUcnlBZ2FpbjsKKyAgICAgICAgZW5kCisgICAgICAgIGVsc2UKKyAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdXU0FFV09VTERCTE9DSyAodW5hdmFpbGFibGUgcmVzb3VyY2VzKScpOworICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIC8vIGluZmVyIHRoYXQgdGltZW91dCBoYXMgYmVlbiBoaXQKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnV1NBRVdPVUxEQkxPQ0sgKHRpbWVkIG91dCknKTsKKyAgICBlbmQ7CisKKyAgICAvLyBJZiBpbnRlcnJ1cHRlZCwgdHJ5IGFnYWluCisgICAgaWYgKEVycm5vQ29weSA9IFdTQUVJTlRSKSBhbmQgKFJldHJpZXMgPCBGTWF4UmVjdlJldHJpZXMpIHRoZW4gYmVnaW4KKyAgICAgIEluYyhSZXRyaWVzKTsKKyAgICAgIGdvdG8gVHJ5QWdhaW47CisgICAgZW5kOworCisgICAgaWYgRXJybm9Db3B5ID0gV1NBRUNPTk5SRVNFVCB0aGVuCisgICAgICBFeGl0KDApOworCisgICAgLy8gVGhpcyBpc2ggaXNuJ3Qgb3BlbgorICAgIGlmIEVycm5vQ29weSA9IFdTQUVOT1RDT05OIHRoZW4KKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnV1NBRU5PVENPTk4nKTsKKworICAgIC8vIFRpbWVkIG91dCEKKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFVElNRURPVVQgdGhlbgorICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdXU0FFVElNRURPVVQnKTsKKworICAgIC8vIE5vdyBpdCdzIG5vdCBhIHRyeSBhZ2FpbiBjYXNlLCBidXQgYSByZWFsIHByb2JibGV6CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlJlYWQoKSByZWN2KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisKKyAgICAvLyBTb21lIG90aGVyIGVycm9yLCB3aGF0ZXZ6CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnVW5rbm93bjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICBSZXN1bHQgOj0gR290OworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5Xcml0ZShjb25zdCBCdWY7IExlbjogSW50ZWdlcik7Cit2YXIKKyAgU2VudCwgQjogSW50ZWdlcjsKK2JlZ2luCisgIFNlbnQgOj0gMDsKKyAgd2hpbGUgU2VudCA8IExlbiBkbyBiZWdpbgorICAgIEIgOj0gV3JpdGVQYXJ0aWFsKChQQnl0ZShAQnVmKSArIFNlbnQpXiwgTGVuIC0gU2VudCk7CisgICAgaWYgQiA9IDAgdGhlbgorICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIHRpbWVvdXQgc2V0IHdpdGggU09fU05EVElNRU8gZXhwaXJlZC4KKyAgICAgIC8vIFJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ3NlbmQgdGltZW91dCBleHBpcmVkJyk7CisgICAgSW5jKFNlbnQsIEIpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuV3JpdGVQYXJ0aWFsKGNvbnN0IEJ1ZjsgTGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhcgorICBCOiBJbnRlZ2VyOworICBFcnJub0NvcHk6IEludGVnZXI7CitiZWdpbgorICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gc29ja2V0Jyk7CisKKyAgQiA6PSBzZW5kKFNvY2tldCwgQnVmLCBMZW4sIDApOworCisgIGlmIEIgPCAwIHRoZW4gYmVnaW4KKyAgICAvLyBGYWlsIG9uIGEgc2VuZCBlcnJvcgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgaWYgRXJybm9Db3B5ID0gV1NBRVdPVUxEQkxPQ0sgdGhlbgorICAgICAgRXhpdCgwKTsKKworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5Xcml0ZVBhcnRpYWwoKSBzZW5kKCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisKKyAgICBpZiAoRXJybm9Db3B5ID0gV1NBRUNPTk5SRVNFVCkgb3IgKEVycm5vQ29weSA9IFdTQUVOT1RDT05OKSB0aGVuIGJlZ2luCisgICAgICBDbG9zZTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ3dyaXRlKCkgc2VuZCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCd3cml0ZSgpIHNlbmQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBGYWlsIG9uIGJsb2NrZWQgc2VuZAorICBpZiBCID0gMCB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdTb2NrZXQgc2VuZCByZXR1cm5lZCAwLicpOworCisgIFJlc3VsdCA6PSBCOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldENhY2hlZEFkZHJlc3Mob3V0IExlbjogSW50ZWdlcik6IFBTb2NrQWRkcjsKK2JlZ2luCisgIGNhc2UgRkNhY2hlZFBlZXJBZGRyLmlwdjQuc2luX2ZhbWlseSBvZgorICAgIEFGX0lORVQ6IGJlZ2luCisgICAgICBMZW4gOj0gU2l6ZU9mKFRTb2NrQWRkckluKTsKKyAgICAgIFJlc3VsdCA6PSBQU29ja0FkZHIoQEZDYWNoZWRQZWVyQWRkci5pcHY0KTsKKyAgICBlbmQ7CisgICAgQUZfSU5FVDY6IGJlZ2luCisgICAgICBMZW4gOj0gU2l6ZU9mKFRTb2NrQWRkckluNik7CisgICAgICBSZXN1bHQgOj0gUFNvY2tBZGRyKEBGQ2FjaGVkUGVlckFkZHIuaXB2Nik7CisgICAgZW5kOworICBlbHNlCisgICAgTGVuIDo9IDA7CisgICAgUmVzdWx0IDo9IG5pbDsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRDYWNoZWRBZGRyZXNzKGNvbnN0IEFkZHI6IFRTb2NrQWRkcjsgTGVuOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGNhc2UgQWRkci5zYV9mYW1pbHkgb2YKKyAgICBBRl9JTkVUOiBpZiBMZW4gPSBTaXplT2YoVFNvY2tBZGRySW4pIHRoZW4gRkNhY2hlZFBlZXJBZGRyLmlwdjQgOj0gUFNvY2tBZGRySW4oQEFkZHIpXjsKKyAgICBBRl9JTkVUNjogaWYgTGVuID0gU2l6ZU9mKFRTb2NrQWRkckluNikgdGhlbiBGQ2FjaGVkUGVlckFkZHIuaXB2NiA6PSBQU29ja0FkZHJJbjYoQEFkZHIpXjsKKyAgZW5kOworICBGUGVlckFkZHJlc3MgOj0gJyc7CisgIEZQZWVySG9zdCA6PSAnJzsKKyAgRlBlZXJQb3J0IDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldExpbmdlcihMaW5nZXJPbjogQm9vbGVhbjsgTGluZ2VyVmFsOiBJbnRlZ2VyKTsKK3ZhcgorICBMOiBUTGluZ2VyOworYmVnaW4KKyAgRkxpbmdlck9uIDo9IExpbmdlck9uOworICBGTGluZ2VyVmFsIDo9IExpbmdlclZhbDsKKyAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIEV4aXQ7CisKKyAgTC5sX29ub2ZmIDo9IElmVGhlbihGTGluZ2VyT24sIDEsIDApOworICBMLmxfbGluZ2VyIDo9IExpbmdlclZhbDsKKworICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBATCwgU2l6ZU9mKEwpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlNldExpbmdlcigpIHNldHNvY2tvcHQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5QZWVrOiBCb29sZWFuOwordmFyCisgIFJldHJpZXM6IExvbmd3b3JkOworICBGZHM6IFRGZFNldDsKKyAgVFZhbDogVFRpbWVWYWw7CisgIFBUVmFsOiBQVGltZVZhbDsKKyAgUmV0OiBJbnRlZ2VyOworICBFcnJub0NvcHk6IEludGVnZXI7CisgIEJ1ZjogQnl0ZTsKK2JlZ2luCisgIGlmIG5vdCBJc09wZW4gdGhlbiBFeGl0KEZhbHNlKTsKKworICBpZiBBc3NpZ25lZChGSW50ZXJydXB0TGlzdGVuZXIpIHRoZW4gYmVnaW4KKyAgICBSZXRyaWVzIDo9IDA7CisgICAgd2hpbGUgdHJ1ZSBkbyBiZWdpbgorICAgICAgRkRfWkVSTyhGZHMpOworICAgICAgX0ZEX1NFVChTb2NrZXQsIEZkcyk7CisgICAgICBfRkRfU0VUKEZJbnRlcnJ1cHRMaXN0ZW5lciwgRmRzKTsKKyAgICAgIGlmIFJlY3ZUaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgICAgIFRWYWwudHZfc2VjIDo9IFJlY3ZUaW1lb3V0IGRpdiAxMDAwOworICAgICAgICBUVmFsLnR2X3VzZWMgOj0gKFJlY3ZUaW1lb3V0IG1vZCAxMDAwKSAqIDEwMDA7CisgICAgICAgIFBUVmFsIDo9IEBUVmFsOworICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIFBUVmFsIDo9IG5pbDsKKworICAgICAgUmV0IDo9IHNlbGVjdCgyLCBARmRzLCBuaWwsIG5pbCwgUFRWYWwpOworICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIGlmIFJldCA8IDAgdGhlbiBiZWdpbgorICAgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgICBpZiAoRXJybm9Db3B5ID0gV1NBRUlOVFIpIGFuZCAoUmV0cmllcyA8IEZNYXhSZWN2UmV0cmllcykgdGhlbiBiZWdpbgorICAgICAgICAgIEluYyhSZXRyaWVzKTsKKyAgICAgICAgICBDb250aW51ZTsKKyAgICAgICAgZW5kOworICAgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuUGVlaygpIHNlbGVjdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdVbmtub3duOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBSZXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gQ2hlY2sgdGhlIGludGVycnVwdExpc3RlbmVyCisgICAgICAgIGlmIEZEX0lTU0VUKEZJbnRlcnJ1cHRMaXN0ZW5lciwgRmRzKSB0aGVuCisgICAgICAgICAgRXhpdChGYWxzZSk7CisgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZGF0YSBvciBhIGRpc2Nvbm5lY3Rpb24sIGZhbGwgdGhyb3VnaCB0byB0aGUgUEVFSworICAgICAgICBCcmVhazsKKyAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICAvLyB0aW1lb3V0CisgICAgICAgIEV4aXQoRmFsc2UpOworICAgIGVuZDsKKyAgZW5kOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiBkYXRhIGlzIGF2YWlsYWJsZSBvciBpZiB0aGUgcmVtb3RlIHNpZGUgY2xvc2VkCisgIFJldCA6PSByZWN2KFNvY2tldCwgQnVmLCAxLCBNU0dfUEVFSyk7CisgIGlmIFJldCA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFQ09OTlJFU0VUIHRoZW4gYmVnaW4KKyAgICAgIENsb3NlOworICAgICAgRXhpdChGYWxzZSk7CisgICAgZW5kOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5QZWVrKCkgcmVjdigpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ3JlY3YoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKyAgUmVzdWx0IDo9IFJldCA+IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRTZXJ2ZXJTb2NrZXQuQ3JlYXRlU29ja2V0T2JqKENsaWVudDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOiBUU29ja2V0OworYmVnaW4KKyAgaWYgRkludGVycnVwdGFibGVDaGlsZHJlbiB0aGVuCisgICAgUmVzdWx0IDo9IFRTb2NrZXQuQ3JlYXRlKENsaWVudCwgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlcikKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUU29ja2V0LkNyZWF0ZShDbGllbnQpOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5Ob3RpZnkoTm90aWZ5U29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7Cit2YXIKKyAgQnl0OiBCeXRlOworYmVnaW4KKyAgaWYgTm90aWZ5U29ja2V0IDw+IElOVkFMSURfU09DS0VUIHRoZW4gYmVnaW4KKyAgICBCeXQgOj0gMDsKKyAgICBpZiBzZW5kKE5vdGlmeVNvY2tldCwgQnl0LCBTaXplT2YoQnl0KSwgMCkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lk5vdGlmeSgpIHNlbmQoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5TZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oQVZhbHVlOiBCb29sZWFuKTsKK2JlZ2luCisgIGlmIEZMaXN0ZW5pbmcgdGhlbgorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ0ludGVycnVwdGFibGVDaGlsZHJlbiBjYW5ub3QgYmUgc2V0IGFmdGVyIGxpc3RlbigpJyk7CisgIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gOj0gQVZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5Db21tb25Jbml0OworYmVnaW4KKyAgaW5oZXJpdGVkIENvbW1vbkluaXQ7CisgIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gOj0gVHJ1ZTsKKyAgRkFjY2VwdEJhY2tsb2cgOj0gREVGQVVMVF9CQUNLTE9HOworICBGQWNjZXB0VGltZW91dCA6PSAwOworICBGUmV0cnlMaW1pdCA6PSAwOworICBGUmV0cnlEZWxheSA6PSAwOworICBGVGNwU2VuZEJ1ZmZlciA6PSAwOworICBGVGNwUmVjdkJ1ZmZlciA6PSAwOworICBGTGlzdGVuaW5nIDo9IEZhbHNlOworICBGSW50ZXJydXB0U29ja1dyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgRkludGVycnVwdFNvY2tSZWFkZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgIEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXQuQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7CitiZWdpbgorICAvLyBVbm5lY2Vzc2FyeSwgYnV0IGhlcmUgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMKKyAgaW5oZXJpdGVkIENyZWF0ZShBUG9ydCwgQUxvZ0RlbGVnYXRlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNlcnZlclNvY2tldC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFTZW5kVGltZW91dCwgQVJlY3ZUaW1lb3V0OiBMb25nd29yZDsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBUG9ydCwgQUxvZ0RlbGVnYXRlKTsKKyAgU2VuZFRpbWVvdXQgOj0gQVNlbmRUaW1lb3V0OworICBSZWN2VGltZW91dCA6PSBBUmVjdlRpbWVvdXQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXQuQ3JlYXRlKEFBZGRyZXNzOiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFQb3J0LCBBTG9nRGVsZWdhdGUpOworICBGQWRkcmVzcyA6PSBBQWRkcmVzczsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuTGlzdGVuOworCisgIGZ1bmN0aW9uIENyZWF0ZVNvY2tldFBhaXIodmFyIFJlYWRlciwgV3JpdGVyOiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk6IEludGVnZXI7CisgIGxhYmVsCisgICAgRXJyb3I7CisgIHR5cGUKKyAgICBUU0FVbmlvbiA9IHJlY29yZAorICAgIGNhc2UgSW50ZWdlciBvZgorICAgICAgMDogKGluYWRkcjogVFNvY2tBZGRySW4pOworICAgICAgMTogKGFkZHI6IFRTb2NrQWRkcik7CisgICAgZW5kOworICB2YXIKKyAgICBhOiBUU0FVbmlvbjsKKyAgICBsaXN0ZW5lcjogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7CisgICAgZTogSW50ZWdlcjsKKyAgICBhZGRybGVuOiBJbnRlZ2VyOworICAgIGZsYWdzOiBEV09SRDsKKyAgICByZXVzZTogSW50ZWdlcjsKKyAgYmVnaW4KKyAgICBhZGRybGVuIDo9IFNpemVPZihhLmluYWRkcik7CisgICAgZmxhZ3MgOj0gMDsKKyAgICByZXVzZSA6PSAxOworCisgICAgbGlzdGVuZXIgOj0gV2luYXBpLldpbnNvY2syLnNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworICAgIGlmIGxpc3RlbmVyID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgICAgRXhpdChTT0NLRVRfRVJST1IpOworCisgICAgRmlsbENoYXIoYSwgU2l6ZU9mKGEpLCAwKTsKKyAgICBhLmluYWRkci5zaW5fZmFtaWx5IDo9IEFGX0lORVQ7CisgICAgYS5pbmFkZHIuc2luX2FkZHIuc19hZGRyIDo9IGh0b25sKElOQUREUl9MT09QQkFDSyk7CisgICAgYS5pbmFkZHIuc2luX3BvcnQgOj0gMDsKKyAgICBSZWFkZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgICAgV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworCisgICAgLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdC4gIFRoaXMgaXMgYmVjYXVzZQorICAgIC8vIFNPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0CisgICAgLy8gd2FudCB0byBmb3JjZSBzb2NrZXQgcGFpcnMgdG8gYmUgYW4gYWRtaW4uCisgICAgc2V0c29ja29wdChsaXN0ZW5lciwgU09MX1NPQ0tFVCwgSW50ZWdlcihTT19FWENMVVNJVkVBRERSVVNFKSwgQHJldXNlLCBTaXplT2YocmV1c2UpKTsKKyAgICBpZiBiaW5kKGxpc3RlbmVyLCBhLmFkZHIsIFNpemVPZihhLmluYWRkcikpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBpZiBnZXRzb2NrbmFtZShsaXN0ZW5lciwgYS5hZGRyLCBhZGRybGVuKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgV2luYXBpLldpbnNvY2syLmxpc3RlbihsaXN0ZW5lciwgMSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIFJlYWRlciA6PSBXU0FTb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDAsIG5pbCwgMCwgZmxhZ3MpOworICAgIGlmIFJlYWRlciA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBpZiBjb25uZWN0KFJlYWRlciwgYS5hZGRyLCBTaXplT2YoYS5pbmFkZHIpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgV3JpdGVyIDo9IFdpbmFwaS5XaW5zb2NrMi5hY2NlcHQobGlzdGVuZXIsIG5pbCwgbmlsKTsKKyAgICBpZiBXcml0ZXIgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICAgIEV4aXQoMCk7CisKKyAgRXJyb3I6CisgICAgZSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICAgIGNsb3Nlc29ja2V0KFJlYWRlcik7CisgICAgY2xvc2Vzb2NrZXQoV3JpdGVyKTsKKyAgICBXU0FTZXRMYXN0RXJyb3IoZSk7CisgICAgUmVzdWx0IDo9IFNPQ0tFVF9FUlJPUjsKKyAgZW5kOworCit2YXIKKyAgVGVtcEludFJlYWRlciwKKyAgVGVtcEludFdyaXRlcjogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7CisgIE9uZTogQ2FyZGluYWw7CisgIEVycm5vQ29weTogSW50ZWdlcjsKKyAgTGluZzogVExpbmdlcjsKKyAgUmV0cmllczogSW50ZWdlcjsKKyAgQWRkckluZm86IElHZXRBZGRySW5mb1dyYXBwZXI7CisgIFNBOiBUU29ja0FkZHJTdG9yYWdlOworICBMZW46IEludGVnZXI7CitiZWdpbgorICAvLyBDcmVhdGUgdGhlIHNvY2tldCBwYWlyIHVzZWQgdG8gaW50ZXJydXB0CisgIGlmIENyZWF0ZVNvY2tldFBhaXIoVGVtcEludFJlYWRlciwgVGVtcEludFdyaXRlcikgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBDcmVhdGVTb2NrZXRQYWlyKCkgSW50ZXJydXB0ICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworICAgIEZJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IElOVkFMSURfU09DS0VUOworICAgIEZJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIEZJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IFRlbXBJbnRSZWFkZXI7CisgICAgRkludGVycnVwdFNvY2tXcml0ZXIgOj0gVGVtcEludFdyaXRlcjsKKyAgZW5kOworCisgIC8vIENyZWF0ZSB0aGUgc29ja2V0IHBhaXIgdXNlZCB0byBpbnRlcnJ1cHQgYWxsIGNsaWVudHMKKyAgaWYgQ3JlYXRlU29ja2V0UGFpcihUZW1wSW50UmVhZGVyLCBUZW1wSW50V3JpdGVyKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIENyZWF0ZVNvY2tldFBhaXIoKSBDaGlsZEludGVycnVwdCAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IFRTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+LkNyZWF0ZShJTlZBTElEX1NPQ0tFVCwgbmlsKTsKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIEZDaGlsZEludGVycnVwdFNvY2tSZWFkZXIgOj0gVFNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD4uQ3JlYXRlKFRlbXBJbnRSZWFkZXIsIERlc3Ryb3llck9mRmluZVNvY2tldHMpOworICAgIEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIgOj0gVGVtcEludFdyaXRlcjsKKyAgZW5kOworCisgIGlmIChQb3J0IDwgMCkgb3IgKFBvcnQgPiAkRkZGRikgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25CYWRBcmdzLkNyZWF0ZSgnU3BlY2lmaWVkIHBvcnQgaXMgaW52YWxpZCcpOworCisgIEFkZHJJbmZvIDo9IENyZWF0ZVNvY2tldChGQWRkcmVzcywgUG9ydCk7CisKKyAgLy8gU2V0IFNPX0VYQ0xVU0lWRUFERFJVU0UgdG8gcHJldmVudCAyTVNMIGRlbGF5IG9uIGFjY2VwdAorICBPbmUgOj0gMTsKKyAgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIEludGVnZXIoU09fRVhDTFVTSVZFQUREUlVTRSksIEBvbmUsIFNpemVPZihPbmUpKTsKKyAgLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdCBvbiBXaW5kb3dzLiAgVGhpcyBpcyBiZWNhdXNlCisgIC8vIFNPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0CisgIC8vIHdhbnQgdG8gZm9yY2Ugc2VydmVycyB0byBiZSBhbiBhZG1pbi4KKworICAvLyBTZXQgVENQIGJ1ZmZlciBzaXplcworICBpZiBGVGNwU2VuZEJ1ZmZlciA+IDAgdGhlbiBiZWdpbgorICAgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19TTkRCVUYsIEBGVGNwU2VuZEJ1ZmZlciwgU2l6ZU9mKEZUY3BTZW5kQnVmZmVyKSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fU05EQlVGICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IHNldCBTT19TTkRCVUY6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgZW5kOworCisgIGlmIEZUY3BSZWN2QnVmZmVyID4gMCB0aGVuIGJlZ2luCisgICAgaWYgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgQEZUY3BSZWN2QnVmZmVyLCBTaXplT2YoRlRjcFJlY3ZCdWZmZXIpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19SQ1ZCVUYgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3Qgc2V0IFNPX1JDVkJVRjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworICBlbmQ7CisKKyAgLy8gVHVybiBsaW5nZXIgb2ZmLCBkb24ndCB3YW50IHRvIGJsb2NrIG9uIGNhbGxzIHRvIGNsb3NlCisgIExpbmcubF9vbm9mZiA6PSAwOworICBMaW5nLmxfbGluZ2VyIDo9IDA7CisgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19MSU5HRVIsIEBMaW5nLCBTaXplT2YoTGluZykpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fTElOR0VSICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBzZXQgU09fTElOR0VSOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIFRDUCBOb2RlbGF5LCBzcGVlZCBvdmVyIGJhbmR3aWR0aAorICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBAT25lLCBTaXplT2YoT25lKSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTk9ERUxBWSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIFNldCBOT05CTE9DSyBvbiB0aGUgYWNjZXB0IHNvY2tldAorICBpZiBpb2N0bHNvY2tldChTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIE9uZSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIGlvY3Rsc29ja2V0KCkgRklPTkJJTyAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdpb2N0bHNvY2tldCgpIEZJT05CSU86ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gcHJlcGFyZSB0aGUgcG9ydCBpbmZvcm1hdGlvbgorICAvLyB3ZSBtYXkgd2FudCB0byB0cnkgdG8gYmluZCBtb3JlIHRoYW4gb25jZSwgc2luY2UgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIGRvZXNuJ3QKKyAgLy8gYWx3YXlzIHNlZW0gdG8gd29yay4gVGhlIGNsaWVudCBjYW4gY29uZmlndXJlIHRoZSByZXRyeSB2YXJpYWJsZXMuCisgIFJldHJpZXMgOj0gMDsKKyAgd2hpbGUgVHJ1ZSBkbyBiZWdpbgorICAgIGlmIGJpbmQoU29ja2V0LCBBZGRySW5mby5SZXNeLmFpX2FkZHJeLCBBZGRySW5mby5SZXNeLmFpX2FkZHJsZW4pID0gMCB0aGVuCisgICAgICBCcmVhazsKKyAgICBJbmMoUmV0cmllcyk7CisgICAgaWYgUmV0cmllcyA+IEZSZXRyeUxpbWl0IHRoZW4KKyAgICAgIEJyZWFrOworICAgIFNsZWVwKEZSZXRyeURlbGF5ICogMTAwMCk7CisgIGVuZDsKKworICAvLyByZXRyaWV2ZSBiaW5kIGluZm8KKyAgaWYgKFBvcnQgPSAwKSBhbmQgKFJldHJpZXMgPCBGUmV0cnlMaW1pdCkgdGhlbiBiZWdpbgorICAgIExlbiA6PSBTaXplT2YoU0EpOworICAgIEZpbGxDaGFyKFNBLCBMZW4sIDApOworICAgIGlmIGdldHNvY2tuYW1lKFNvY2tldCwgUFNvY2tBZGRyKEBTQSleLCBMZW4pID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBnZXRzb2NrbmFtZSgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpCisgICAgZWxzZSBiZWdpbgorICAgICAgaWYgU0Euc3NfZmFtaWx5ID0gQUZfSU5FVDYgdGhlbgorICAgICAgICBQb3J0IDo9IG50b2hzKFBTb2NrQWRkckluNihAU0EpXi5zaW42X3BvcnQpCisgICAgICBlbHNlCisgICAgICAgIFBvcnQgOj0gbnRvaHMoUFNvY2tBZGRySW4oQFNBKV4uc2luX3BvcnQpOworICAgIGVuZDsKKyAgZW5kOworCisgIC8vIHRocm93IGFuIGVycm9yIGlmIHdlIGZhaWxlZCB0byBiaW5kIHByb3Blcmx5CisgIGlmIChSZXRyaWVzID4gRlJldHJ5TGltaXQpIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgQklORCAlZCcsIFtQb3J0XSkpOworICAgIENsb3NlOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBiaW5kOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgZW5kOworCisgIGlmIEFzc2lnbmVkKEZMaXN0ZW5DYWxsYmFjaykgdGhlbgorICAgIEZMaXN0ZW5DYWxsYmFjayhTb2NrZXQpOworCisgIC8vIENhbGwgbGlzdGVuCisgIGlmIFdpbmFwaS5XaW5zb2NrMi5saXN0ZW4oU29ja2V0LCBGQWNjZXB0QmFja2xvZykgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIGxpc3RlbigpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBsaXN0ZW46ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gVGhlIHNvY2tldCBpcyBub3cgbGlzdGVuaW5nIQorZW5kOworCitmdW5jdGlvbiBUU2VydmVyU29ja2V0LkFjY2VwdDogVFNvY2tldDsKK3ZhcgorICBGZHM6IFRGZFNldDsKKyAgTWF4RUludGVycywKKyAgTnVtRUludGVyczogSW50ZWdlcjsKKyAgVFZhbDogVFRpbWVWYWw7CisgIFBUVmFsOiBQVGltZVZhbDsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBCdWY6IEJ5dGU7CisgIENsaWVudEFkZHJlc3M6IFRTb2NrQWRkclN0b3JhZ2U7CisgIFNpemU6IEludGVnZXI7CisgIENsaWVudFNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7CisgIFplcm86IENhcmRpbmFsOworICBDbGllbnQ6IFRTb2NrZXQ7CisgIFJldDogSW50ZWdlcjsKK2JlZ2luCisgIE1heEVJbnRlcnMgOj0gNTsKKyAgTnVtRUludGVycyA6PSAwOworCisgIHdoaWxlIFRydWUgZG8gYmVnaW4KKyAgICBGRF9aRVJPKEZkcyk7CisgICAgX0ZEX1NFVChTb2NrZXQsIEZkcyk7CisgICAgX0ZEX1NFVChGSW50ZXJydXB0U29ja1JlYWRlciwgRmRzKTsKKyAgICBpZiBGQWNjZXB0VGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgICAgVFZhbC50dl9zZWMgOj0gRkFjY2VwdFRpbWVvdXQgZGl2IDEwMDA7CisgICAgICBUVmFsLnR2X3VzZWMgOj0gKEZBY2NlcHRUaW1lb3V0IG1vZCAxMDAwKSAqIDEwMDA7CisgICAgICBQVFZhbCA6PSBAVFZhbDsKKyAgICBlbmQKKyAgICBlbHNlCisgICAgICBQVFZhbCA6PSBuaWw7CisKKyAgICAvLyBUT0RPOiBpZiBXU0FFSU5UUiBpcyByZWNlaXZlZCwgd2UnbGwgcmVzdGFydCB0aGUgdGltZW91dC4KKyAgICAvLyBUbyBiZSBhY2N1cmF0ZSwgd2UgbmVlZCB0byBmaXggdGhpcyBpbiB0aGUgZnV0dXJlLgorICAgIFJldCA6PSBzZWxlY3QoMiwgQEZkcywgbmlsLCBuaWwsIFBUVmFsKTsKKworICAgIGlmIFJldCA8IDAgdGhlbiBiZWdpbgorICAgICAgLy8gZXJyb3IgY2FzZXMKKyAgICAgIGlmIChXU0FHZXRMYXN0RXJyb3IgPSBXU0FFSU5UUikgYW5kIChOdW1FSW50ZXJzIDwgTWF4RUludGVycykgdGhlbiBiZWdpbgorICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKKyAgICAgICAgSW5jKE51bUVJbnRlcnMpOworICAgICAgICBDb250aW51ZTsKKyAgICAgIGVuZDsKKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgc2VsZWN0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdVbmtub3duOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQKKyAgICBlbHNlIGlmIFJldCA+IDAgdGhlbiBiZWdpbgorICAgICAgLy8gQ2hlY2sgZm9yIGFuIGludGVycnVwdCBzaWduYWwKKyAgICAgIGlmIChGSW50ZXJydXB0U29ja1JlYWRlciA8PiBJTlZBTElEX1NPQ0tFVCkgYW5kIEZEX0lTU0VUKEZJbnRlcnJ1cHRTb2NrUmVhZGVyLCBGZHMpIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgcmVjdihGSW50ZXJydXB0U29ja1JlYWRlciwgQnVmLCBTaXplT2YoQnVmKSwgMCkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5BY2NlcHQoKSByZWN2KCkgaW50ZXJydXB0ICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQuQ3JlYXRlKCdpbnRlcnJ1cHRlZCcpOworICAgICAgZW5kOworCisgICAgICAvLyBDaGVjayBmb3IgdGhlIGFjdHVhbCBzZXJ2ZXIgc29ja2V0IGJlaW5nIHJlYWR5CisgICAgICBpZiBGRF9JU1NFVChTb2NrZXQsIEZkcykgdGhlbgorICAgICAgICBCcmVhazsKKyAgICBlbmQKKyAgICBlbHNlIGJlZ2luCisgICAgICBMb2dEZWxlZ2F0ZSgnVFNlcnZlclNvY2tldC5BY2NlcHQoKSBzZWxlY3QoKSAwJyk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ3Vua25vd24gZXJyb3InKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBTaXplIDo9IFNpemVPZihDbGllbnRBZGRyZXNzKTsKKyAgQ2xpZW50U29ja2V0IDo9IFdpbmFwaS5XaW5zb2NrMi5hY2NlcHQoU29ja2V0LCBAQ2xpZW50QWRkcmVzcywgQFNpemUpOworICBpZiBDbGllbnRTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgYWNjZXB0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnYWNjZXB0KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gTWFrZSBzdXJlIGNsaWVudCBzb2NrZXQgaXMgYmxvY2tpbmcKKyAgWmVybyA6PSAwOworICBpZiBpb2N0bHNvY2tldChDbGllbnRTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIFplcm8pID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGNsb3Nlc29ja2V0KENsaWVudFNvY2tldCk7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0LkFjY2VwdCgpIGlvY3Rsc29ja2V0KCkgRklPTkJJTyAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdpb2N0bHNvY2tldCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIENsaWVudCA6PSBDcmVhdGVTb2NrZXRPYmooQ2xpZW50U29ja2V0KTsKKyAgaWYgU2VuZFRpbWVvdXQgPiAwIHRoZW4KKyAgICBDbGllbnQuU2VuZFRpbWVvdXQgOj0gU2VuZFRpbWVvdXQ7CisgIGlmIFJlY3ZUaW1lb3V0ID4gMCB0aGVuCisgICAgQ2xpZW50LlJlY3ZUaW1lb3V0IDo9IFJlY3ZUaW1lb3V0OworICBpZiBLZWVwQWxpdmUgdGhlbgorICAgIENsaWVudC5LZWVwQWxpdmUgOj0gS2VlcEFsaXZlOworICBDbGllbnQuU2V0Q2FjaGVkQWRkcmVzcyhQU29ja0FkZHIoQENsaWVudEFkZHJlc3MpXiwgU2l6ZSk7CisKKyAgaWYgQXNzaWduZWQoRkFjY2VwdENhbGxiYWNrKSB0aGVuCisgICAgRkFjY2VwdENhbGxiYWNrKENsaWVudFNvY2tldCk7CisKKyAgUmVzdWx0IDo9IENsaWVudDsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuSW50ZXJydXB0OworYmVnaW4KKyAgTm90aWZ5KEZJbnRlcnJ1cHRTb2NrV3JpdGVyKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuSW50ZXJydXB0Q2hpbGRyZW47CitiZWdpbgorICBOb3RpZnkoRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlcik7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0LkNsb3NlOworYmVnaW4KKyAgaW5oZXJpdGVkIENsb3NlOworICBpZiBGSW50ZXJydXB0U29ja1dyaXRlciA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgY2xvc2Vzb2NrZXQoRkludGVycnVwdFNvY2tXcml0ZXIpOworICBpZiBGSW50ZXJydXB0U29ja1JlYWRlciA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgY2xvc2Vzb2NrZXQoRkludGVycnVwdFNvY2tSZWFkZXIpOworICBpZiBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyIDw+IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBjbG9zZXNvY2tldChGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyKTsKKyAgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlciA6PSBUU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0Pi5DcmVhdGUoSU5WQUxJRF9TT0NLRVQsIG5pbCk7CisgIEZMaXN0ZW5pbmcgOj0gRmFsc2U7CitlbmQ7CisKK3skRU5ESUZ9IC8vIG5vdCBmb3IgT0xEX1NPQ0tFVFMKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TdHJlYW0ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlN0cmVhbS5wYXMKaW5kZXggZDFmNjM4NC4uMzMwOGM1MyAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlN0cmVhbS5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlN0cmVhbS5wYXMKQEAgLTE5LDYgKzE5LDggQEAKIAogdW5pdCBUaHJpZnQuU3RyZWFtOwogCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQorCiBpbnRlcmZhY2UKIAogdXNlcwpAQCAtMjYsMTUgKzI4LDIxIEBACiAgIFN5c1V0aWxzLAogICBTeXNDb25zdCwKICAgUlRMQ29uc3RzLAotICBUaHJpZnQuVXRpbHMsCi0gIEFjdGl2ZVg7CisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgIEFjdGl2ZVgsCisgIHskRUxTRX0KKyAgV2luYXBpLkFjdGl2ZVgsCisgIHskRU5ESUZ9CisgIFRocmlmdC5VdGlsczsKIAogdHlwZQogCiAgIElUaHJpZnRTdHJlYW0gPSBpbnRlcmZhY2UKLSAgICBbJ3s3MzI2MjFCMy1GNjk3LTRENzYtQTFCMC1CNERENUE4RTQwMTh9J10KLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworICAgIFsnezJBNzdEOTE2LTc0NDYtNDZDMS04NTQ1LTBBRUMwMDA4REJDQX0nXQorICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7CiAgICAgcHJvY2VkdXJlIE9wZW47CiAgICAgcHJvY2VkdXJlIENsb3NlOwogICAgIHByb2NlZHVyZSBGbHVzaDsKQEAgLTQ0LDEwICs1MiwxMiBAQAogCiAgIFRUaHJpZnRTdHJlYW1JbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVGhyaWZ0U3RyZWFtKQogICBwcml2YXRlCi0gICAgcHJvY2VkdXJlIENoZWNrU2l6ZUFuZE9mZnNldCggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBDaGVja1NpemVBbmRPZmZzZXQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOwogICBwcm90ZWN0ZWQKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgdmlydHVhbDsKLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyB2aXJ0dWFsOwogICAgIHByb2NlZHVyZSBPcGVuOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgQ2xvc2U7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBGbHVzaDsgdmlydHVhbDsgYWJzdHJhY3Q7CkBAIC02MCw4ICs3MCw4IEBACiAgICAgRlN0cmVhbSA6IFRTdHJlYW07CiAgICAgRk93bnNTdHJlYW0gOiBCb29sZWFuOwogICBwcm90ZWN0ZWQKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKQEAgLTc2LDggKzg2LDggQEAKICAgcHJpdmF0ZQogICAgIEZTdHJlYW0gOiBJU3RyZWFtOwogICBwcm90ZWN0ZWQKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKQEAgLTEwNCwxMCArMTE0LDggQEAKIAogcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLkZsdXNoOwogYmVnaW4KLSAgaWYgSXNPcGVuIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBGU3RyZWFtIDw+IG5pbCB0aGVuCi0gICAgYmVnaW4KKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICBpZiBGU3RyZWFtIDw+IG5pbCB0aGVuIGJlZ2luCiAgICAgICBGU3RyZWFtLkNvbW1pdCggU1RHQ19ERUZBVUxUICk7CiAgICAgZW5kOwogICBlbmQ7CkBAIC0xMjAsMTggKzEyOCwyMyBAQAogCiBwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uT3BlbjsKIGJlZ2luCi0KKyAgLy8gbm90aGluZyB0byBkbwogZW5kOwogCi1mdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5SZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCiAgIGluaGVyaXRlZDsKKworICBpZiBjb3VudCA+PSBidWZsZW4tb2Zmc2V0CisgIHRoZW4gY291bnQgOj0gYnVmbGVuLW9mZnNldDsKKwogICBSZXN1bHQgOj0gMDsKLSAgaWYgRlN0cmVhbSA8PiBuaWwgdGhlbgotICBiZWdpbgotICAgIGlmIGNvdW50ID4gMCB0aGVuCi0gICAgYmVnaW4KLSAgICAgIEZTdHJlYW0uUmVhZCggQGJ1ZmZlcltvZmZzZXRdLCBjb3VudCwgQFJlc3VsdCk7CisgIGlmIEZTdHJlYW0gPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgICAgcFRtcCA6PSBwQnVmOworICAgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgICAgRlN0cmVhbS5SZWFkKCBwVG1wLCBjb3VudCwgQFJlc3VsdCk7CiAgICAgZW5kOwogICBlbmQ7CiBlbmQ7CkBAIC0xNDAsNzUgKzE1Myw3NiBAQAogdmFyCiAgIHN0YXRzdGc6IFRTdGF0U3RnOwogICBsZW4gOiBJbnRlZ2VyOwotICBOZXdQb3MgOiBJbnQ2NDsKKyAgTmV3UG9zIDogeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjkuMH0gVUludDY0IHskRUxTRX0gSW50NjQgIHskSUZFTkR9OwogICBjYlJlYWQgOiBJbnRlZ2VyOwogYmVnaW4KICAgRmlsbENoYXIoIHN0YXRzdGcsIFNpemVPZiggc3RhdHN0ZyksIDApOwogICBsZW4gOj0gMDsKLSAgaWYgSXNPcGVuIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBTdWNjZWVkZWQoIEZTdHJlYW0uU3RhdCggc3RhdHN0ZywgU1RBVEZMQUdfTk9OQU1FICkpIHRoZW4KLSAgICBiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGlmIFN1Y2NlZWRlZCggRlN0cmVhbS5TdGF0KCBzdGF0c3RnLCBTVEFURkxBR19OT05BTUUgKSkgdGhlbiBiZWdpbgogICAgICAgbGVuIDo9IHN0YXRzdGcuY2JTaXplOwogICAgIGVuZDsKICAgZW5kOwogCiAgIFNldExlbmd0aCggUmVzdWx0LCBsZW4gKTsKIAotICBpZiBsZW4gPiAwIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBTdWNjZWVkZWQoIEZTdHJlYW0uU2VlayggMCwgU1RSRUFNX1NFRUtfU0VULCBOZXdQb3MpICkgdGhlbgotICAgIGJlZ2luCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIGlmIFN1Y2NlZWRlZCggRlN0cmVhbS5TZWVrKCAwLCBTVFJFQU1fU0VFS19TRVQsIE5ld1BvcykgKSB0aGVuIGJlZ2luCiAgICAgICBGU3RyZWFtLlJlYWQoIEBSZXN1bHRbMF0sIGxlbiwgQGNiUmVhZCk7CiAgICAgZW5kOwogICBlbmQ7CiBlbmQ7CiAKLXByb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5Xcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwotdmFyCi0gIG5Xcml0dGVuIDogSW50ZWdlcjsKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5Xcml0ZSggY29uc3QgcEJ1ZjogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Cit2YXIgbldyaXR0ZW4gOiBJbnRlZ2VyOworICAgIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCiAgIGluaGVyaXRlZDsKLSAgaWYgSXNPcGVuIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBjb3VudCA+IDAgdGhlbgotICAgIGJlZ2luCi0gICAgICBGU3RyZWFtLldyaXRlKCBAYnVmZmVyWzBdLCBjb3VudCwgQG5Xcml0dGVuKTsKKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgICAgcFRtcCA6PSBwQnVmOworICAgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgICAgRlN0cmVhbS5Xcml0ZSggcFRtcCwgY291bnQsIEBuV3JpdHRlbik7CiAgICAgZW5kOwogICBlbmQ7CiBlbmQ7CiAKIHsgVFRocmlmdFN0cmVhbUltcGwgfQogCi1wcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuQ2hlY2tTaXplQW5kT2Zmc2V0KGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsCi0gIGNvdW50OiBJbnRlZ2VyKTsKLXZhcgotICBsZW4gOiBJbnRlZ2VyOworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1JbXBsLkNoZWNrU2l6ZUFuZE9mZnNldCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwogYmVnaW4KLSAgaWYgY291bnQgPiAwIHRoZW4KLSAgYmVnaW4KLSAgICBsZW4gOj0gTGVuZ3RoKCBidWZmZXIgKTsKLSAgICBpZiAob2Zmc2V0IDwgMCkgb3IgKCBvZmZzZXQgPj0gbGVuKSB0aGVuCi0gICAgYmVnaW4KKyAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICBpZiAob2Zmc2V0IDwgMCkgb3IgKCBvZmZzZXQgPj0gYnVmbGVuKSB0aGVuIGJlZ2luCiAgICAgICByYWlzZSBFUmFuZ2VFcnJvci5DcmVhdGUoIFNCaXRzSW5kZXhFcnJvciApOwogICAgIGVuZDsKLSAgICBpZiBjb3VudCA+IGxlbiB0aGVuCi0gICAgYmVnaW4KKyAgICBpZiBjb3VudCA+IGJ1ZmxlbiB0aGVuIGJlZ2luCiAgICAgICByYWlzZSBFUmFuZ2VFcnJvci5DcmVhdGUoIFNCaXRzSW5kZXhFcnJvciApOwogICAgIGVuZDsKICAgZW5kOwogZW5kOwogCi1mdW5jdGlvbiBUVGhyaWZ0U3RyZWFtSW1wbC5SZWFkKHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LAotICBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtSW1wbC5SZWFkKHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmZmVyKSA+IDAKKyAgdGhlbiBSZXN1bHQgOj0gUmVhZCggQGJ1ZmZlclswXSwgTGVuZ3RoKGJ1ZmZlciksIG9mZnNldCwgY291bnQpCisgIGVsc2UgUmVzdWx0IDo9IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1JbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCiAgIFJlc3VsdCA6PSAwOwotICBDaGVja1NpemVBbmRPZmZzZXQoIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCApOworICBDaGVja1NpemVBbmRPZmZzZXQoIHBCdWYsIGJ1Zmxlbiwgb2Zmc2V0LCBjb3VudCApOwogZW5kOwogCiBwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuV3JpdGUoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOwogYmVnaW4KLSAgQ2hlY2tTaXplQW5kT2Zmc2V0KCBidWZmZXIsIG9mZnNldCwgY291bnQgKTsKKyAgaWYgTGVuZ3RoKGJ1ZmZlcikgPiAwCisgIHRoZW4gV3JpdGUoIEBidWZmZXJbMF0sIG9mZnNldCwgY291bnQpOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIENoZWNrU2l6ZUFuZE9mZnNldCggcEJ1Ziwgb2Zmc2V0K2NvdW50LCBvZmZzZXQsIGNvdW50KTsKIGVuZDsKIAogeyBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaSB9CkBAIC0yMjksMTYgKzI0MywxNSBAQAogCiBkZXN0cnVjdG9yIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkRlc3Ryb3k7CiBiZWdpbgotICBpZiBGT3duc1N0cmVhbSB0aGVuCi0gIGJlZ2luCi0gICAgRlN0cmVhbS5GcmVlOwotICBlbmQ7CisgIGlmIEZPd25zU3RyZWFtIAorICB0aGVuIENsb3NlOworICAKICAgaW5oZXJpdGVkOwogZW5kOwogCiBwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuRmx1c2g7CiBiZWdpbgotCisgIC8vIG5vdGhpbmcgdG8gZG8KIGVuZDsKIAogZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuSXNPcGVuOiBCb29sZWFuOwpAQCAtMjQ4LDE4ICsyNjEsMjMgQEAKIAogcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLk9wZW47CiBiZWdpbgotCisgIC8vIG5vdGhpbmcgdG8gZG8KIGVuZDsKIAotZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuUmVhZCh2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwKLSAgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuUmVhZChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgcFRtcCA6IFBCeXRlOwogYmVnaW4KICAgaW5oZXJpdGVkOwotICBSZXN1bHQgOj0gMDsKLSAgaWYgY291bnQgPiAwIHRoZW4KLSAgYmVnaW4KLSAgICBSZXN1bHQgOj0gRlN0cmVhbS5SZWFkKCBQb2ludGVyKEBidWZmZXJbb2Zmc2V0XSleLCBjb3VudCkKLSAgZW5kOworCisgIGlmIGNvdW50ID49IGJ1Zmxlbi1vZmZzZXQKKyAgdGhlbiBjb3VudCA6PSBidWZsZW4tb2Zmc2V0OworCisgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgcFRtcCA6PSBwQnVmOworICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICBSZXN1bHQgOj0gRlN0cmVhbS5SZWFkKCBwVG1wXiwgY291bnQpCisgIGVuZAorICBlbHNlIFJlc3VsdCA6PSAwOwogZW5kOwogCiBmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5Ub0FycmF5OiBUQnl0ZXM7CkBAIC0yODcsMTMgKzMwNSwxNCBAQAogICBlbmQKIGVuZDsKIAotcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLldyaXRlKGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsCi0gIGNvdW50OiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5Xcml0ZShjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7Cit2YXIgcFRtcCA6IFBCeXRlOwogYmVnaW4KICAgaW5oZXJpdGVkOwotICBpZiBjb3VudCA+IDAgdGhlbgotICBiZWdpbgotICAgIEZTdHJlYW0uV3JpdGUoIFBvaW50ZXIoQGJ1ZmZlcltvZmZzZXRdKV4sIGNvdW50KQorICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgRlN0cmVhbS5Xcml0ZSggcFRtcF4sIGNvdW50KQogICBlbmQ7CiBlbmQ7CiAKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMKaW5kZXggNTkzYmIzYS4uNzdhMzQzYiAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMKQEAgLTE5LDE4ICsxOSwyMiBAQAogdW5pdCBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzOwogCiB7JFdBUk4gU1lNQk9MX1BMQVRGT1JNIE9GRn0KK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CiAKIGludGVyZmFjZQogCiB1c2VzCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CiAgIFdpbmRvd3MsIFN5c1V0aWxzLCBNYXRoLCBBY2NDdHJsLCBBY2xBUEksIFN5bmNPYmpzLAorICB7JEVMU0V9CisgIFdpbmFwaS5XaW5kb3dzLCBTeXN0ZW0uU3lzVXRpbHMsIFN5c3RlbS5NYXRoLCBXaW5hcGkuQWNjQ3RybCwgV2luYXBpLkFjbEFQSSwgU3lzdGVtLlN5bmNPYmpzLAorICB7JEVORElGfQogICBUaHJpZnQuVHJhbnNwb3J0LAogICBUaHJpZnQuVXRpbHMsCiAgIFRocmlmdC5TdHJlYW07CiAKIGNvbnN0Ci0gIERFRkFVTFRfVEhSSUZUX1BJUEVfVElNRU9VVCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQgZGVwcmVjYXRlZCAndXNlIERFRkFVTFRfVEhSSUZUX1RJTUVPVVQnOwotCisgIERFRkFVTFRfVEhSSUZUX1BJUEVfT1BFTl9USU1FT1VUID0gMTA7ICAvLyBkZWZhdWx0OiBmYWlsIGZhc3Qgb24gb3BlbgogCiAKIHR5cGUKQEAgLTQxLDIzICs0NSwyNiBAQAogICBzdHJpY3QgcHJvdGVjdGVkCiAgICAgRlBpcGUgICAgOiBUSGFuZGxlOwogICAgIEZUaW1lb3V0IDogRFdPUkQ7CisgICAgRk9wZW5UaW1lT3V0IDogRFdPUkQ7ICAvLyBzZXBhcmF0ZSB2YWx1ZSB0byBhbGxvdyBmb3IgZmFpbC1mYXN0LW9uLW9wZW4gc2NlbmFyaW9zCiAgICAgRk92ZXJsYXBwZWQgOiBCb29sZWFuOwogCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uICBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQsIGNvdW50IDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOwogICAgIC8vcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOyAtIHNlZSBkZXJpdmVkIGNsYXNzZXMKICAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CiAKLSAgICBmdW5jdGlvbiAgUmVhZERpcmVjdCggICAgIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Ci0gICAgZnVuY3Rpb24gIFJlYWRPdmVybGFwcGVkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwotICAgIHByb2NlZHVyZSBXcml0ZURpcmVjdCggICAgIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKLSAgICBwcm9jZWR1cmUgV3JpdGVPdmVybGFwcGVkKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gIFJlYWREaXJlY3QoICAgICBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiAgUmVhZE92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZURpcmVjdCggICAgIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZU92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOwogCiAgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IG92ZXJyaWRlOwogICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQpOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggYUVuYWJsZU92ZXJsYXBwZWQgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhT3BlblRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1BJUEVfT1BFTl9USU1FT1VUKTsKICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKICAgZW5kOwogCkBAIC03Niw3ICs4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2hhcmVNb2RlOiBEV09SRCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzID0gbmlsOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQpOyAgb3ZlcmxvYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFPcGVuVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfUElQRV9PUEVOX1RJTUVPVVQpOyAgb3ZlcmxvYWQ7CiAgIGVuZDsKIAogCkBAIC0xMjAsNyArMTI4LDggQEAKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQaXBlTmFtZSA6IHN0cmluZzsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTZWN1cml0eUF0dHJpYnV0ZXM6IFBTZWN1cml0eUF0dHJpYnV0ZXMgPSBuaWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7ICBvdmVybG9hZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYU9wZW5UaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9QSVBFX09QRU5fVElNRU9VVCk7ICBvdmVybG9hZDsKICAgZW5kOwogCiAKQEAgLTEzOCw3ICsxNDcsOSBAQAogICBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFBpcGVUcmFuc3BvcnRCYXNlKQogICBwdWJsaWMKICAgICAvLyBBbm9ueW1vdXMgcGlwZSBjb25zdHJ1Y3RvcgotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVBpcGVSZWFkLCBhUGlwZVdyaXRlIDogVEhhbmRsZTsgYU93bnNIYW5kbGVzIDogQm9vbGVhbik7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBhUGlwZVJlYWQsIGFQaXBlV3JpdGUgOiBUSGFuZGxlOworICAgICAgICAgICAgICAgICAgICAgICBhT3duc0hhbmRsZXMgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7IG92ZXJsb2FkOwogICBlbmQ7CiAKIApAQCAtMTg3LDYgKzE5OCw3IEBACiAgICAgRkNsaWVudEFub25SZWFkLAogICAgIEZDbGllbnRBbm9uV3JpdGUgIDogVEhhbmRsZTsKIAorICAgIEZUaW1lT3V0OiBEV09SRDsKICAgcHJvdGVjdGVkCiAgICAgZnVuY3Rpb24gQWNjZXB0KGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7IG92ZXJyaWRlOwogCkBAIC0yMDEsNyArMjEzLDcgQEAKICAgICBwcm9jZWR1cmUgSW50ZXJuYWxDbG9zZTsgb3ZlcnJpZGU7CiAKICAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBhQnVmc2l6ZSA6IENhcmRpbmFsID0gNDA5Nik7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGFCdWZzaXplIDogQ2FyZGluYWwgPSA0MDk2OyBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7CiAgIGVuZDsKIAogCkBAIC0yNTAsOCArMjYyLDcgQEAKICAgaWYgbm90IER1cGxpY2F0ZUhhbmRsZSggR2V0Q3VycmVudFByb2Nlc3MsIGhTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzLCBAcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGQUxTRSwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKQotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEdXBsaWNhdGVIYW5kbGU6ICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnRHVwbGljYXRlSGFuZGxlOiAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKIGVuZDsKIAogCkBAIC0yNjAsMTMgKzI3MSwxNCBAQAogCiAKIGNvbnN0cnVjdG9yIFRQaXBlU3RyZWFtQmFzZS5DcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0LCBhT3BlblRpbWVPdXQgOiBEV09SRCk7CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlOwotICBBU1NFUlQoIGFUaW1lb3V0ID4gMCk7Ci0gIEZQaXBlICAgICAgIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICBGVGltZW91dCAgICA6PSBhVGltZU91dDsKLSAgRk92ZXJsYXBwZWQgOj0gYUVuYWJsZU92ZXJsYXBwZWQ7CisgIEFTU0VSVCggYVRpbWVvdXQgPiAwKTsgIC8vIGFPcGVuVGltZW91dCBtYXkgYmUgMAorICBGUGlwZSAgICAgICAgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIEZUaW1lb3V0ICAgICA6PSBhVGltZU91dDsKKyAgRk9wZW5UaW1lT3V0IDo9IGFPcGVuVGltZU91dDsKKyAgRk92ZXJsYXBwZWQgIDo9IGFFbmFibGVPdmVybGFwcGVkOwogZW5kOwogCiAKQEAgLTI4OCw3ICszMDAsNyBAQAogCiBwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLkZsdXNoOwogYmVnaW4KLSAgLy8gbm90aGluZyB0byBkbworICBGbHVzaEZpbGVCdWZmZXJzKCBGUGlwZSk7CiBlbmQ7CiAKIApAQCAtMjk4LDQ0ICszMTAsMTAyIEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZShjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7Citwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudCA6IEludGVnZXIpOwogYmVnaW4KICAgaWYgRk92ZXJsYXBwZWQKLSAgdGhlbiBXcml0ZU92ZXJsYXBwZWQoIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCkKLSAgZWxzZSBXcml0ZURpcmVjdCggYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKKyAgdGhlbiBXcml0ZU92ZXJsYXBwZWQoIHBCdWYsIG9mZnNldCwgY291bnQpCisgIGVsc2UgV3JpdGVEaXJlY3QoIHBCdWYsIG9mZnNldCwgY291bnQpOwogZW5kOwogCiAKLWZ1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5SZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCiAgIGlmIEZPdmVybGFwcGVkCi0gIHRoZW4gcmVzdWx0IDo9IFJlYWRPdmVybGFwcGVkKCBidWZmZXIsIG9mZnNldCwgY291bnQpCi0gIGVsc2UgcmVzdWx0IDo9IFJlYWREaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7CisgIHRoZW4gcmVzdWx0IDo9IFJlYWRPdmVybGFwcGVkKCBwQnVmLCBidWZsZW4sIG9mZnNldCwgY291bnQpCisgIGVsc2UgcmVzdWx0IDo9IFJlYWREaXJlY3QoIHBCdWYsIGJ1Zmxlbiwgb2Zmc2V0LCBjb3VudCk7CiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZURpcmVjdChjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7Ci12YXIgY2JXcml0dGVuIDogRFdPUkQ7Citwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLldyaXRlRGlyZWN0KCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Cit2YXIgY2JXcml0dGVuLCBuQnl0ZXMgOiBEV09SRDsKKyAgICBwRGF0YSA6IFBCeXRlOwogYmVnaW4KICAgaWYgbm90IElzT3BlbgotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOworICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHdyaXRlIG9uIG5vbi1vcGVuIHBpcGUnKTsKIAotICBpZiBub3QgV3JpdGVGaWxlKCBGUGlwZSwgYnVmZmVyW29mZnNldF0sIGNvdW50LCBjYldyaXR0ZW4sIG5pbCkKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV3JpdGUgdG8gcGlwZSBmYWlsZWQnKTsKKyAgLy8gaWYgbmVjZXNzYXJ5LCBzZW5kIHRoZSBkYXRhIGluIGNodW5rcworICAvLyB0aGVyZSdzIGEgc3lzdGVtIGxpbWl0IGFyb3VuZCAweDEwMDAwIGJ5dGVzIHRoYXQgd2UgaGl0IG90aGVyd2lzZQorICAvLyBNU0ROOiAiUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBpcGVzLCBzZWUgdGhlIFJlbWFya3Mgc2VjdGlvbi4iCisgIG5CeXRlcyA6PSBNaW4oIDE1KjQwOTYsIGNvdW50KTsgLy8gMTYgd291bGQgZXhjZWVkIHRoZSBsaW1pdAorICBwRGF0YSAgOj0gcEJ1ZjsKKyAgSW5jKCBwRGF0YSwgb2Zmc2V0KTsKKyAgd2hpbGUgbkJ5dGVzID4gMCBkbyBiZWdpbgorICAgIGlmIG5vdCBXcml0ZUZpbGUoIEZQaXBlLCBwRGF0YV4sIG5CeXRlcywgY2JXcml0dGVuLCBuaWwpCisgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1dyaXRlIHRvIHBpcGUgZmFpbGVkJyk7CisKKyAgICBJbmMoIHBEYXRhLCBjYldyaXR0ZW4pOworICAgIERlYyggY291bnQsIGNiV3JpdHRlbik7CisgICAgbkJ5dGVzIDo9IE1pbiggbkJ5dGVzLCBjb3VudCk7CisgIGVuZDsKIGVuZDsKIAogCi1mdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZERpcmVjdCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKLXZhciBjYlJlYWQsIGR3RXJyICA6IERXT1JEOworcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZU92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBjYldyaXR0ZW4sIGR3V2FpdCwgZHdFcnJvciwgbkJ5dGVzIDogRFdPUkQ7CisgICAgb3ZlcmxhcHBlZCA6IElPdmVybGFwcGVkSGVscGVyOworICAgIHBEYXRhIDogUEJ5dGU7CitiZWdpbgorICBpZiBub3QgSXNPcGVuCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOworCisgIC8vIGlmIG5lY2Vzc2FyeSwgc2VuZCB0aGUgZGF0YSBpbiBjaHVua3MKKyAgLy8gdGhlcmUncyBhIHN5c3RlbSBsaW1pdCBhcm91bmQgMHgxMDAwMCBieXRlcyB0aGF0IHdlIGhpdCBvdGhlcndpc2UKKyAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICBuQnl0ZXMgOj0gTWluKCAxNSo0MDk2LCBjb3VudCk7IC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgcERhdGEgIDo9IHBCdWY7CisgIEluYyggcERhdGEsIG9mZnNldCk7CisgIHdoaWxlIG5CeXRlcyA+IDAgZG8gYmVnaW4KKyAgICBvdmVybGFwcGVkIDo9IFRPdmVybGFwcGVkSGVscGVySW1wbC5DcmVhdGU7CisgICAgaWYgbm90IFdyaXRlRmlsZSggRlBpcGUsIHBEYXRhXiwgbkJ5dGVzLCBjYldyaXR0ZW4sIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cikKKyAgICB0aGVuIGJlZ2luCisgICAgICBkd0Vycm9yIDo9IEdldExhc3RFcnJvcjsKKyAgICAgIGNhc2UgZHdFcnJvciBvZgorICAgICAgICBFUlJPUl9JT19QRU5ESU5HIDogYmVnaW4KKyAgICAgICAgICBkd1dhaXQgOj0gb3ZlcmxhcHBlZC5XYWl0Rm9yKEZUaW1lb3V0KTsKKworICAgICAgICAgIGlmIChkd1dhaXQgPSBXQUlUX1RJTUVPVVQpIHRoZW4gYmVnaW4KKyAgICAgICAgICAgIENhbmNlbElvKCBGUGlwZSk7ICAvLyBwcmV2ZW50cyBwb3NzaWJsZSBBViBvbiBpbnZhbGlkIG92ZXJsYXBwZWQgcHRyCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdQaXBlIHdyaXRlIHRpbWVkIG91dCcpOworICAgICAgICAgIGVuZDsKKworICAgICAgICAgIGlmIChkd1dhaXQgPD4gV0FJVF9PQkpFQ1RfMCkKKyAgICAgICAgICBvciBub3QgR2V0T3ZlcmxhcHBlZFJlc3VsdCggRlBpcGUsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZCwgY2JXcml0dGVuLCBUUlVFKQorICAgICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdQaXBlIHdyaXRlIGVycm9yJyk7CisgICAgICAgIGVuZDsKKworICAgICAgZWxzZQorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKGR3RXJyb3IpKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKyAgICBBU1NFUlQoIERXT1JEKG5CeXRlcykgPSBjYldyaXR0ZW4pOworCisgICAgSW5jKCBwRGF0YSwgY2JXcml0dGVuKTsKKyAgICBEZWMoIGNvdW50LCBjYldyaXR0ZW4pOworICAgIG5CeXRlcyA6PSBNaW4oIG5CeXRlcywgY291bnQpOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlJlYWREaXJlY3QoICAgICBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgY2JSZWFkLCBkd0VyciwgblJlbWFpbmluZyAgOiBEV09SRDsKICAgICBieXRlcywgcmV0cmllcyAgOiBMb25nSW50OwogICAgIGJPayAgICAgOiBCb29sZWFuOworICAgIHBEYXRhICAgOiBQQnl0ZTsKIGNvbnN0IElOVEVSVkFMID0gMTA7ICAvLyBtcwogYmVnaW4KICAgaWYgbm90IElzT3BlbgotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBwaXBlJyk7CisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBwaXBlJyk7CiAKICAgLy8gTVNETjogSGFuZGxlIGNhbiBiZSBhIGhhbmRsZSB0byBhIG5hbWVkIHBpcGUgaW5zdGFuY2UsCiAgIC8vIG9yIGl0IGNhbiBiZSBhIGhhbmRsZSB0byB0aGUgcmVhZCBlbmQgb2YgYW4gYW5vbnltb3VzIHBpcGUsCkBAIC0zNDMsMTExICs0MTMsODkgQEAKICAgaWYgRlRpbWVPdXQgPD4gSU5GSU5JVEUgdGhlbiBiZWdpbgogICAgIHJldHJpZXMgOj0gTWF4KCAxLCBSb3VuZCggMS4wICogRlRpbWVPdXQgLyBJTlRFUlZBTCkpOwogICAgIHdoaWxlIFRSVUUgZG8gYmVnaW4KLSAgICAgIGlmICBJc09wZW4KLSAgICAgIGFuZCBQZWVrTmFtZWRQaXBlKCBGUGlwZSwgbmlsLCAwLCBuaWwsIEBieXRlcywgbmlsKQotICAgICAgYW5kIChieXRlcyA+IDApCi0gICAgICB0aGVuIEJyZWFrOyAgLy8gdGhlcmUgYXJlIGRhdGEKLQotICAgICAgZHdFcnIgOj0gR2V0TGFzdEVycm9yOwotICAgICAgaWYgKGR3RXJyID0gRVJST1JfSU5WQUxJRF9IQU5ETEUpCi0gICAgICBvciAoZHdFcnIgPSBFUlJPUl9CUk9LRU5fUElQRSkKLSAgICAgIG9yIChkd0VyciA9IEVSUk9SX1BJUEVfTk9UX0NPTk5FQ1RFRCkKLSAgICAgIHRoZW4gYmVnaW4KLSAgICAgICAgcmVzdWx0IDo9IDA7ICAvLyBvdGhlciBzaWRlIGNsb3NlZCB0aGUgcGlwZQotICAgICAgICBFeGl0OworICAgICAgaWYgbm90IFBlZWtOYW1lZFBpcGUoIEZQaXBlLCBuaWwsIDAsIG5pbCwgQGJ5dGVzLCBuaWwpIHRoZW4gYmVnaW4KKyAgICAgICAgZHdFcnIgOj0gR2V0TGFzdEVycm9yOworICAgICAgICBpZiAoZHdFcnIgPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkKKyAgICAgICAgb3IgKGR3RXJyID0gRVJST1JfQlJPS0VOX1BJUEUpCisgICAgICAgIG9yIChkd0VyciA9IEVSUk9SX1BJUEVfTk9UX0NPTk5FQ1RFRCkKKyAgICAgICAgdGhlbiBiZWdpbgorICAgICAgICAgIHJlc3VsdCA6PSAwOyAgLy8gb3RoZXIgc2lkZSBjbG9zZWQgdGhlIHBpcGUKKyAgICAgICAgICBFeGl0OworICAgICAgICBlbmQ7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgYnl0ZXMgPiAwIHRoZW4gYmVnaW4KKyAgICAgICAgQnJlYWs7ICAvLyB0aGVyZSBhcmUgZGF0YQogICAgICAgZW5kOwogCiAgICAgICBEZWMoIHJldHJpZXMpOwogICAgICAgaWYgcmV0cmllcyA+IDAKICAgICAgIHRoZW4gU2xlZXAoIElOVEVSVkFMKQotICAgICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5UaW1lZE91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQaXBlIHJlYWQgdGltZWQgb3V0Jyk7CisgICAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1BpcGUgcmVhZCB0aW1lZCBvdXQnKTsKICAgICBlbmQ7CiAgIGVuZDsKIAotICAvLyByZWFkIHRoZSBkYXRhIChvciBibG9jayBJTkZJTklURS1seSkKLSAgYk9rIDo9IFJlYWRGaWxlKCBGUGlwZSwgYnVmZmVyW29mZnNldF0sIGNvdW50LCBjYlJlYWQsIG5pbCk7Ci0gIGlmIChub3QgYk9rKSBhbmQgKEdldExhc3RFcnJvcigpIDw+IEVSUk9SX01PUkVfREFUQSkKLSAgdGhlbiByZXN1bHQgOj0gMCAvLyBObyBtb3JlIGRhdGEsIHBvc3NpYmx5IGJlY2F1c2UgY2xpZW50IGRpc2Nvbm5lY3RlZC4KLSAgZWxzZSByZXN1bHQgOj0gY2JSZWFkOwotZW5kOworICByZXN1bHQgOj0gMDsKKyAgblJlbWFpbmluZyA6PSBjb3VudDsKKyAgcERhdGEgOj0gcEJ1ZjsKKyAgSW5jKCBwRGF0YSwgb2Zmc2V0KTsKKyAgd2hpbGUgblJlbWFpbmluZyA+IDAgZG8gYmVnaW4KKyAgICAvLyByZWFkIHRoZSBkYXRhIChvciBibG9jayBJTkZJTklURS1seSkKKyAgICBiT2sgOj0gUmVhZEZpbGUoIEZQaXBlLCBwRGF0YV4sIG5SZW1haW5pbmcsIGNiUmVhZCwgbmlsKTsKKyAgICBpZiAobm90IGJPaykgYW5kIChHZXRMYXN0RXJyb3IoKSA8PiBFUlJPUl9NT1JFX0RBVEEpCisgICAgdGhlbiBCcmVhazsgLy8gTm8gbW9yZSBkYXRhLCBwb3NzaWJseSBiZWNhdXNlIGNsaWVudCBkaXNjb25uZWN0ZWQuCiAKLQotcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZU92ZXJsYXBwZWQoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOwotdmFyIGNiV3JpdHRlbiwgZHdXYWl0LCBkd0Vycm9yIDogRFdPUkQ7Ci0gICAgb3ZlcmxhcHBlZCA6IElPdmVybGFwcGVkSGVscGVyOwotYmVnaW4KLSAgaWYgbm90IElzT3BlbgotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOwotCi0gIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKLQotICBpZiBub3QgV3JpdGVGaWxlKCBGUGlwZSwgYnVmZmVyW29mZnNldF0sIGNvdW50LCBjYldyaXR0ZW4sIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cikKLSAgdGhlbiBiZWdpbgotICAgIGR3RXJyb3IgOj0gR2V0TGFzdEVycm9yOwotICAgIGNhc2UgZHdFcnJvciBvZgotICAgICAgRVJST1JfSU9fUEVORElORyA6IGJlZ2luCi0gICAgICAgIGR3V2FpdCA6PSBvdmVybGFwcGVkLldhaXRGb3IoRlRpbWVvdXQpOwotCi0gICAgICAgIGlmIChkd1dhaXQgPSBXQUlUX1RJTUVPVVQpCi0gICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVGltZWRPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQaXBlIHdyaXRlIHRpbWVkIG91dCcpOwotCi0gICAgICAgIGlmIChkd1dhaXQgPD4gV0FJVF9PQkpFQ1RfMCkKLSAgICAgICAgb3Igbm90IEdldE92ZXJsYXBwZWRSZXN1bHQoIEZQaXBlLCBvdmVybGFwcGVkLk92ZXJsYXBwZWQsIGNiV3JpdHRlbiwgVFJVRSkKLSAgICAgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Vbmtub3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGlwZSB3cml0ZSBlcnJvcicpOwotICAgICAgZW5kOwotCi0gICAgZWxzZQotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVW5rbm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXNFcnJvck1lc3NhZ2UoZHdFcnJvcikpOwotICAgIGVuZDsKKyAgICBEZWMoIG5SZW1haW5pbmcsIGNiUmVhZCk7CisgICAgSW5jKCBwRGF0YSwgY2JSZWFkKTsKKyAgICBJbmMoIHJlc3VsdCwgY2JSZWFkKTsKICAgZW5kOwotCi0gIEFTU0VSVCggRFdPUkQoY291bnQpID0gY2JXcml0dGVuKTsKIGVuZDsKIAogCi1mdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZE92ZXJsYXBwZWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Ci12YXIgY2JSZWFkLCBkd1dhaXQsIGR3RXJyb3IgIDogRFdPUkQ7CitmdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZE92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciBjYlJlYWQsIGR3V2FpdCwgZHdFcnJvciwgblJlbWFpbmluZyA6IERXT1JEOwogICAgIGJPayAgICAgOiBCb29sZWFuOwogICAgIG92ZXJsYXBwZWQgOiBJT3ZlcmxhcHBlZEhlbHBlcjsKKyAgICBwRGF0YSAgIDogUEJ5dGU7CiBiZWdpbgogICBpZiBub3QgSXNPcGVuCi0gIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHBpcGUnKTsKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHBpcGUnKTsKIAotICBvdmVybGFwcGVkIDo9IFRPdmVybGFwcGVkSGVscGVySW1wbC5DcmVhdGU7CisgIHJlc3VsdCA6PSAwOworICBuUmVtYWluaW5nIDo9IGNvdW50OworICBwRGF0YSA6PSBwQnVmOworICBJbmMoIHBEYXRhLCBvZmZzZXQpOworICB3aGlsZSBuUmVtYWluaW5nID4gMCBkbyBiZWdpbgorICAgIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKIAotICAvLyByZWFkIHRoZSBkYXRhCi0gIGJPayA6PSBSZWFkRmlsZSggRlBpcGUsIGJ1ZmZlcltvZmZzZXRdLCBjb3VudCwgY2JSZWFkLCBvdmVybGFwcGVkLk92ZXJsYXBwZWRQdHIpOwotICBpZiBub3QgYk9rIHRoZW4gYmVnaW4KLSAgICBkd0Vycm9yIDo9IEdldExhc3RFcnJvcjsKLSAgICBjYXNlIGR3RXJyb3Igb2YKLSAgICAgIEVSUk9SX0lPX1BFTkRJTkcgOiBiZWdpbgotICAgICAgICBkd1dhaXQgOj0gb3ZlcmxhcHBlZC5XYWl0Rm9yKEZUaW1lb3V0KTsKKyAgICAgLy8gcmVhZCB0aGUgZGF0YQorICAgIGJPayA6PSBSZWFkRmlsZSggRlBpcGUsIHBEYXRhXiwgblJlbWFpbmluZywgY2JSZWFkLCBvdmVybGFwcGVkLk92ZXJsYXBwZWRQdHIpOworICAgIGlmIG5vdCBiT2sgdGhlbiBiZWdpbgorICAgICAgZHdFcnJvciA6PSBHZXRMYXN0RXJyb3I7CisgICAgICBjYXNlIGR3RXJyb3Igb2YKKyAgICAgICAgRVJST1JfSU9fUEVORElORyA6IGJlZ2luCisgICAgICAgICAgZHdXYWl0IDo9IG92ZXJsYXBwZWQuV2FpdEZvcihGVGltZW91dCk7CiAKLSAgICAgICAgaWYgKGR3V2FpdCA9IFdBSVRfVElNRU9VVCkKLSAgICAgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5UaW1lZE91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BpcGUgcmVhZCB0aW1lZCBvdXQnKTsKKyAgICAgICAgICBpZiAoZHdXYWl0ID0gV0FJVF9USU1FT1VUKSB0aGVuIGJlZ2luCisgICAgICAgICAgICBDYW5jZWxJbyggRlBpcGUpOyAgLy8gcHJldmVudHMgcG9zc2libGUgQVYgb24gaW52YWxpZCBvdmVybGFwcGVkIHB0cgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnUGlwZSByZWFkIHRpbWVkIG91dCcpOworICAgICAgICAgIGVuZDsKIAotICAgICAgICBpZiAoZHdXYWl0IDw+IFdBSVRfT0JKRUNUXzApCi0gICAgICAgIG9yIG5vdCBHZXRPdmVybGFwcGVkUmVzdWx0KCBGUGlwZSwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkLCBjYlJlYWQsIFRSVUUpCi0gICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVW5rbm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BpcGUgcmVhZCBlcnJvcicpOworICAgICAgICAgIGlmIChkd1dhaXQgPD4gV0FJVF9PQkpFQ1RfMCkKKyAgICAgICAgICBvciBub3QgR2V0T3ZlcmxhcHBlZFJlc3VsdCggRlBpcGUsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZCwgY2JSZWFkLCBUUlVFKQorICAgICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdQaXBlIHJlYWQgZXJyb3InKTsKKyAgICAgICAgZW5kOworCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShTeXNFcnJvck1lc3NhZ2UoZHdFcnJvcikpOwogICAgICAgZW5kOwotCi0gICAgZWxzZQotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVW5rbm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXNFcnJvck1lc3NhZ2UoZHdFcnJvcikpOwogICAgIGVuZDsKLSAgZW5kOwogCi0gIEFTU0VSVCggY2JSZWFkID4gMCk7ICAvLyBzZWUgVFRyYW5zcG9ydEltcGwuUmVhZEFsbCgpCi0gIEFTU0VSVCggY2JSZWFkID0gRFdPUkQoY291bnQpKTsKLSAgcmVzdWx0IDo9IGNiUmVhZDsKKyAgICBBU1NFUlQoIGNiUmVhZCA+IDApOyAgLy8gc2VlIFRUcmFuc3BvcnRJbXBsLlJlYWRBbGwoKQorICAgIEFTU0VSVCggY2JSZWFkIDw9IERXT1JEKG5SZW1haW5pbmcpKTsKKyAgICBEZWMoIG5SZW1haW5pbmcsIGNiUmVhZCk7CisgICAgSW5jKCBwRGF0YSwgY2JSZWFkKTsKKyAgICBJbmMoIHJlc3VsdCwgY2JSZWFkKTsKKyAgZW5kOwogZW5kOwogCiAKQEAgLTQ3NCw5ICs1MjIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQsIGFPcGVuVGltZU91dCA6IERXT1JEKTsKIGJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkLCBhVGltZW91dCk7CisgIGluaGVyaXRlZCBDcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkLCBhVGltZW91dCwgYU9wZW5UaW1lT3V0KTsKIAogICBGUGlwZU5hbWUgICAgICAgIDo9IGFQaXBlTmFtZTsKICAgRlNoYXJlTW9kZSAgICAgICA6PSBhU2hhcmVNb2RlOwpAQCAtNDg5LDE1ICs1MzcsMzMgQEAKIAogcHJvY2VkdXJlIFROYW1lZFBpcGVTdHJlYW1JbXBsLk9wZW47CiB2YXIgaFBpcGUgICAgOiBUSGFuZGxlOworICAgIHJldHJpZXMsIHRpbWVvdXQsIGR3RXJyIDogRFdPUkQ7Citjb25zdCBJTlRFUlZBTCA9IDEwOyAvLyBtcwogYmVnaW4KICAgaWYgSXNPcGVuIHRoZW4gRXhpdDsKIAorICByZXRyaWVzIDo9IE1heCggMSwgUm91bmQoIDEuMCAqIEZPcGVuVGltZU91dCAvIElOVEVSVkFMKSk7CisgIHRpbWVvdXQgOj0gRk9wZW5UaW1lT3V0OworCisgIC8vIGlmIHRoZSBzZXJ2ZXIgaGFzbid0IGdvdHRlbiB0byB0aGUgcG9pbnQgd2hlcmUgdGhlIHBpcGUgaGFzIGJlZW4gY3JlYXRlZCwgYXQgbGVhc3Qgd2FpdCB0aGUgdGltZW91dAorICAvLyBBY2NvcmRpbmcgdG8gTVNETiwgaWYgbm8gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWZpZWQgbmFtZWQgcGlwZSBleGlzdCwgdGhlIFdhaXROYW1lZFBpcGUgZnVuY3Rpb24KKyAgLy8gcmV0dXJucyBJTU1FRElBVEVMWSwgcmVnYXJkbGVzcyBvZiB0aGUgdGltZS1vdXQgdmFsdWUuCisgIC8vIEFsd2F5cyB1c2UgSU5URVJWQUwsIHNpbmNlIFdhaXROYW1lZFBpcGUoMCkgZGVmYXVsdHMgdG8gc29tZSBvdGhlciB2YWx1ZQorICB3aGlsZSBub3QgV2FpdE5hbWVkUGlwZSggUENoYXIoRlBpcGVOYW1lKSwgSU5URVJWQUwpIGRvIGJlZ2luCisgICAgZHdFcnIgOj0gR2V0TGFzdEVycm9yOworICAgIGlmIGR3RXJyIDw+IEVSUk9SX0ZJTEVfTk9UX0ZPVU5ECisgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1VuYWJsZSB0byBvcGVuIHBpcGUsICcrU3lzRXJyb3JNZXNzYWdlKGR3RXJyKSk7CisKKyAgICBpZiB0aW1lb3V0IDw+IElORklOSVRFIHRoZW4gYmVnaW4KKyAgICAgIGlmIChyZXRyaWVzID4gMCkKKyAgICAgIHRoZW4gRGVjKHJldHJpZXMpCisgICAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVW5hYmxlIHRvIG9wZW4gcGlwZSwgdGltZWQgb3V0Jyk7CisgICAgZW5kOworCisgICAgU2xlZXAoSU5URVJWQUwpCisgIGVuZDsKKwogICAvLyBvcGVuIHRoYXQgdGhpbmd5Ci0KLSAgaWYgbm90IFdhaXROYW1lZFBpcGUoIFBDaGFyKEZQaXBlTmFtZSksIEZUaW1lb3V0KQotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gb3BlbiBwaXBlLCAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKLQogICBoUGlwZSA6PSBDcmVhdGVGaWxlKCBQQ2hhciggRlBpcGVOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEIG9yIEdFTkVSSUNfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgIEZTaGFyZU1vZGUsICAgICAgICAvLyBzaGFyaW5nCkBAIC01MDcsOCArNTczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgIC8vIG5vIHRlbXBsYXRlIGZpbGUKIAogICBpZiBoUGlwZSA9IElOVkFMSURfSEFORExFX1ZBTFVFCi0gIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBvcGVuIHBpcGUsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVW5hYmxlIHRvIG9wZW4gcGlwZSwgJytTeXNFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKSk7CiAKICAgLy8gZXZlcnl0aGluZyBmaW5lCiAgIEZQaXBlIDo9IGhQaXBlOwpAQCAtNTc4LDExICs2NDMsMTEgQEAKIAogY29uc3RydWN0b3IgVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwuQ3JlYXRlKCBjb25zdCBhUGlwZU5hbWUgOiBzdHJpbmc7IGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQsIGFPcGVuVGltZU91dCA6IERXT1JEKTsKIC8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3IKIGJlZ2luCiAgIGluaGVyaXRlZCBDcmVhdGUoIG5pbCwgbmlsKTsKLSAgRklucHV0U3RyZWFtICA6PSBUTmFtZWRQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGFQaXBlTmFtZSwgVFJVRSwgYVNoYXJlTW9kZSwgYVNlY3VyaXR5QXR0cmlidXRlcywgYVRpbWVPdXQpOworICBGSW5wdXRTdHJlYW0gIDo9IFROYW1lZFBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggYVBpcGVOYW1lLCBUUlVFLCBhU2hhcmVNb2RlLCBhU2VjdXJpdHlBdHRyaWJ1dGVzLCBhVGltZU91dCwgYU9wZW5UaW1lT3V0KTsKICAgRk91dHB1dFN0cmVhbSA6PSBGSW5wdXRTdHJlYW07ICAvLyB0cnVlIGZvciBuYW1lZCBwaXBlcwogZW5kOwogCkBAIC02MjIsMTMgKzY4NywxNSBAQAogeyBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwgfQogCiAKLWNvbnN0cnVjdG9yIFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IGFQaXBlUmVhZCwgYVBpcGVXcml0ZSA6IFRIYW5kbGU7IGFPd25zSGFuZGxlcyA6IEJvb2xlYW4pOworY29uc3RydWN0b3IgVEFub255bW91c1BpcGVUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgYVBpcGVSZWFkLCBhUGlwZVdyaXRlIDogVEhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFPd25zSGFuZGxlcyA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7CiAvLyBBbm9ueW1vdXMgcGlwZSBjb25zdHJ1Y3RvcgogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZSggbmlsLCBuaWwpOwogICAvLyBvdmVybGFwcGVkIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBBbm9uUGlwZXMsIHNlZSBNU0ROCi0gIEZJbnB1dFN0cmVhbSAgOj0gVEhhbmRsZVBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggYVBpcGVSZWFkLCBhT3duc0hhbmRsZXMsIEZBTFNFKTsKLSAgRk91dHB1dFN0cmVhbSA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZVdyaXRlLCBhT3duc0hhbmRsZXMsIEZBTFNFKTsKKyAgRklucHV0U3RyZWFtICA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZVJlYWQsIGFPd25zSGFuZGxlcywgRkFMU0UsIGFUaW1lT3V0KTsKKyAgRk91dHB1dFN0cmVhbSA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZVdyaXRlLCBhT3duc0hhbmRsZXMsIEZBTFNFLCBhVGltZU91dCk7CiBlbmQ7CiAKIApAQCAtNjc1LDcgKzc0Miw3IEBACiB7IFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbCB9CiAKIAotY29uc3RydWN0b3IgVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZSggYUJ1ZnNpemUgOiBDYXJkaW5hbCk7Citjb25zdHJ1Y3RvciBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlKGFCdWZzaXplIDogQ2FyZGluYWw7IGFUaW1lT3V0IDogRFdPUkQpOwogLy8gQW5vbnltb3VzIHBpcGUgQ1RPUgogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZTsKQEAgLTY4NCwxMyArNzUxLDEzIEBACiAgIEZXcml0ZUhhbmRsZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKICAgRkNsaWVudEFub25SZWFkIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwogICBGQ2xpZW50QW5vbldyaXRlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBGVGltZU91dCA6PSBhVGltZU91dDsKIAogICAvLyBUaGUgYW5vbnltb3VzIHBpcGUgbmVlZHMgdG8gYmUgY3JlYXRlZCBmaXJzdCBzbyB0aGF0IHRoZSBzZXJ2ZXIgY2FuCiAgIC8vIHBhc3MgdGhlIGhhbmRsZXMgb24gdG8gdGhlIGNsaWVudCBiZWZvcmUgdGhlIHNlcnZlIChhY2NlcHRJbXBsKQogICAvLyBibG9ja2luZyBjYWxsLgogICBpZiBub3QgQ3JlYXRlQW5vblBpcGUKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWUrJy5DcmVhdGUoKSBmYWlsZWQnKTsKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoQ2xhc3NOYW1lKycuQ3JlYXRlKCkgZmFpbGVkJyk7CiBlbmQ7CiAKIApAQCAtNzA0LDExICs3NzEsMTAgQEAKICAgLy8gVGhpcyAwLWJ5dGUgcmVhZCBzZXJ2ZXMgbWVyZWx5IGFzIGEgYmxvY2tpbmcgY2FsbC4KICAgaWYgbm90IFJlYWRGaWxlKCBGUmVhZEhhbmRsZSwgYnVmLCAwLCBiciwgbmlsKQogICBhbmQgKEdldExhc3RFcnJvcigpIDw+IEVSUk9SX01PUkVfREFUQSkKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNlcnZlclBpcGUgdW5hYmxlIHRvIGluaXRpYXRlIHBpcGUgY29tbXVuaWNhdGlvbicpOworICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVFNlcnZlclBpcGUgdW5hYmxlIHRvIGluaXRpYXRlIHBpcGUgY29tbXVuaWNhdGlvbicpOwogCiAgIC8vIGNyZWF0ZSB0aGUgdHJhbnNwb3J0IGltcGwKLSAgcmVzdWx0IDo9IFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZSZWFkSGFuZGxlLCBGV3JpdGVIYW5kbGUsIEZBTFNFKTsKKyAgcmVzdWx0IDo9IFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZSZWFkSGFuZGxlLCBGV3JpdGVIYW5kbGUsIEZBTFNFLCBGVGltZU91dCk7CiBlbmQ7CiAKIApAQCAtNzUwLDggKzgxNiw2IEBACiAgICAgc2EgICAgICAgICAgIDogU0VDVVJJVFlfQVRUUklCVVRFUzsgLy9UU2VjdXJpdHlBdHRyaWJ1dGVzOwogICAgIGhDQVIsIGhQaXBlVywgaENBVywgaFBpcGUgOiBUSGFuZGxlOwogYmVnaW4KLSAgcmVzdWx0IDo9IEZBTFNFOwotCiAgIHNkIDo9IFBTRUNVUklUWV9ERVNDUklQVE9SKCBMb2NhbEFsbG9jKCBMUFRSLFNFQ1VSSVRZX0RFU0NSSVBUT1JfTUlOX0xFTkdUSCkpOwogICB0cnkKICAgICBXaW4zMkNoZWNrKCBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKCBzZCwgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTikpOwpAQCAtNzYxLDE3ICs4MjUsMTcgQEAKICAgICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA6PSBzZDsKICAgICBzYS5iSW5oZXJpdEhhbmRsZSAgICAgICA6PSBUUlVFOyAvL2FsbG93IHBhc3NpbmcgaGFuZGxlIHRvIGNoaWxkCiAKLSAgICBpZiBub3QgQ3JlYXRlUGlwZSggaENBUiwgaFBpcGVXLCBAc2EsIEZCdWZTaXplKSB0aGVuIGJlZ2luICAgLy9jcmVhdGUgc3RkaW4gcGlwZQotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNlcnZlclBpcGUgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKKyAgICBSZXN1bHQgOj0gQ3JlYXRlUGlwZSggaENBUiwgaFBpcGVXLCBAc2EsIEZCdWZTaXplKTsgLy9jcmVhdGUgc3RkaW4gcGlwZQorICAgIGlmIG5vdCBSZXN1bHQgdGhlbiBiZWdpbiAgIC8vY3JlYXRlIHN0ZGluIHBpcGUKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVFNlcnZlclBpcGUgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKICAgICAgIEV4aXQ7CiAgICAgZW5kOwogCi0gICAgaWYgbm90IENyZWF0ZVBpcGUoIGhQaXBlLCBoQ0FXLCBAc2EsIEZCdWZTaXplKSB0aGVuIGJlZ2luICAvL2NyZWF0ZSBzdGRvdXQgcGlwZQorICAgIFJlc3VsdCA6PSBDcmVhdGVQaXBlKCBoUGlwZSwgaENBVywgQHNhLCBGQnVmU2l6ZSk7IC8vY3JlYXRlIHN0ZG91dCBwaXBlCisgICAgaWYgbm90IFJlc3VsdCB0aGVuIGJlZ2luICAvL2NyZWF0ZSBzdGRvdXQgcGlwZQogICAgICAgQ2xvc2VIYW5kbGUoIGhDQVIpOwogICAgICAgQ2xvc2VIYW5kbGUoIGhQaXBlVyk7Ci0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU2VydmVyUGlwZSBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdUU2VydmVyUGlwZSBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOwogICAgICAgRXhpdDsKICAgICBlbmQ7CiAKQEAgLTc3OSw5ICs4NDMsNiBAQAogICAgIEZDbGllbnRBbm9uV3JpdGUgOj0gaENBVzsKICAgICBGUmVhZEhhbmRsZSAgICAgIDo9IGhQaXBlOwogICAgIEZXcml0ZUhhbmRsZSAgICAgOj0gaFBpcGVXOwotCi0gICAgcmVzdWx0IDo9IFRSVUU7Ci0KICAgZmluYWxseQogICAgIGlmIHNkIDw+IG5pbCB0aGVuIExvY2FsRnJlZSggQ2FyZGluYWwoc2QpKTsKICAgZW5kOwpAQCAtODE5LDggKzg4MCwxMCBAQAogICBDcmVhdGVOYW1lZFBpcGU7CiAgIHdoaWxlIG5vdCBGQ29ubmVjdGVkIGRvIGJlZ2luCiAKLSAgICBpZiBRdWVyeVN0b3BTZXJ2ZXIKLSAgICB0aGVuIEFib3J0OworICAgIGlmIFF1ZXJ5U3RvcFNlcnZlciB0aGVuIGJlZ2luCisgICAgICBJbnRlcm5hbENsb3NlOworICAgICAgQWJvcnQ7CisgICAgZW5kOwogCiAgICAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpCiAgICAgdGhlbiBmbkFjY2VwdGluZygpOwpAQCAtODUyLDggKzkxNSw3IEBACiAKICAgICBlbHNlCiAgICAgICBJbnRlcm5hbENsb3NlOwotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2xpZW50IGNvbm5lY3Rpb24gZmFpbGVkJyk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NsaWVudCBjb25uZWN0aW9uIGZhaWxlZCcpOwogICAgIGVuZDsKICAgZW5kOwogCkBAIC04OTgsNyArOTYwLDcgQEAKIGZ1bmN0aW9uIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkhhbmRsZSA6IFRIYW5kbGU7CiBiZWdpbgogICB7JElGREVGIFdJTjY0fQotICByZXN1bHQgOj0gVEhhbmRsZSggSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCBJbnRlZ2VyKEZIYW5kbGUpLCAwKSk7CisgIHJlc3VsdCA6PSBUSGFuZGxlKCBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIEludDY0KEZIYW5kbGUpLCAwKSk7CiAgIHskRUxTRX0KICAgcmVzdWx0IDo9IFRIYW5kbGUoIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoIEludGVnZXIoRkhhbmRsZSksIDApKTsKICAgeyRFTkRJRn0KQEAgLTk0NiwyMSArMTAwOCwyNiBAQAogICAgIHNhLmJJbmhlcml0SGFuZGxlICAgICAgIDo9IEZBTFNFOwogCiAgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBuYW1lZCBwaXBlCi0gICAgcmVzdWx0IDo9IFdpbmRvd3MuQ3JlYXRlTmFtZWRQaXBlKCBQQ2hhciggRlBpcGVOYW1lKSwgICAgICAgIC8vIHBpcGUgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9BQ0NFU1NfRFVQTEVYIG9yICAgICAvLyByZWFkL3dyaXRlIGFjY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9GTEFHX09WRVJMQVBQRUQsICAgICAvLyBhc3luYyBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFX1RZUEVfQllURSBvciAgICAgICAgIC8vIGJ5dGUgdHlwZSBwaXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFX1JFQURNT0RFX0JZVEUsICAgICAgIC8vIGJ5dGUgcmVhZCBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTWF4Q29ubnMsICAgICAgICAgICAgICAgIC8vIG1heC4gaW5zdGFuY2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQnVmU2l6ZSwgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJ1ZlNpemUsICAgICAgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRpbWVvdXQsICAgICAgICAgICAgICAgICAvLyB0aW1lLW91dCwgc2VlIE1TRE4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBzYSk7ICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGUKKyAgICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICAgIHJlc3VsdCA6PSBXaW5kb3dzLkNyZWF0ZU5hbWVkUGlwZSgKKyAgICB7JEVMU0V9CisgICAgcmVzdWx0IDo9IFdpbmFwaS5XaW5kb3dzLkNyZWF0ZU5hbWVkUGlwZSgKKyAgICB7JEVORElGfQorICAgICAgICBQQ2hhciggRlBpcGVOYW1lKSwgICAgICAgIC8vIHBpcGUgbmFtZQorICAgICAgICBQSVBFX0FDQ0VTU19EVVBMRVggb3IgICAgIC8vIHJlYWQvd3JpdGUgYWNjZXNzCisgICAgICAgIEZJTEVfRkxBR19PVkVSTEFQUEVELCAgICAgLy8gYXN5bmMgbW9kZQorICAgICAgICBQSVBFX1RZUEVfQllURSBvciAgICAgICAgIC8vIGJ5dGUgdHlwZSBwaXBlCisgICAgICAgIFBJUEVfUkVBRE1PREVfQllURSwgICAgICAgLy8gYnl0ZSByZWFkIG1vZGUKKyAgICAgICAgRk1heENvbm5zLCAgICAgICAgICAgICAgICAvLyBtYXguIGluc3RhbmNlcworICAgICAgICBGQnVmU2l6ZSwgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgc2l6ZQorICAgICAgICBGQnVmU2l6ZSwgICAgICAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBzaXplCisgICAgICAgIEZUaW1lb3V0LCAgICAgICAgICAgICAgICAgLy8gdGltZS1vdXQsIHNlZSBNU0ROCisgICAgICAgIEBzYSAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGUKKyAgICApOwogCiAgICAgaWYoIHJlc3VsdCA8PiBJTlZBTElEX0hBTkRMRV9WQUxVRSkKICAgICB0aGVuIEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKCBQb2ludGVyKEZIYW5kbGUpLCBQb2ludGVyKHJlc3VsdCkpCi0gICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVOYW1lZFBpcGUoKSBmYWlsZWQgJyArIEludFRvU3RyKEdldExhc3RFcnJvcikpOworICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDcmVhdGVOYW1lZFBpcGUoKSBmYWlsZWQgJyArIEludFRvU3RyKEdldExhc3RFcnJvcikpOwogCiAgIGZpbmFsbHkKICAgICBpZiBzZCA8PiBuaWwgdGhlbiBMb2NhbEZyZWUoIENhcmRpbmFsKCBzZCkpOwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LnBhcwppbmRleCBjNDg1ZTcwLi5kYWQ5YWI3IDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LnBhcwpAQCAtMTYsMzcgKzE2LDQ5IEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqKQotCi0geyRTQ09QRURFTlVNUyBPTn0KLQogdW5pdCBUaHJpZnQuVHJhbnNwb3J0OwogCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQoreyRTQ09QRURFTlVNUyBPTn0KKwogaW50ZXJmYWNlCiAKIHVzZXMKICAgQ2xhc3NlcywKICAgU3lzVXRpbHMsCiAgIE1hdGgsCi0gIFNvY2tldHMsIFdpblNvY2ssCiAgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICAgIEFjdGl2ZVgsIG1zeG1sLCBXaW5Tb2NrLCBTb2NrZXRzLAorICB7JEVMU0V9CisgICAgV2luYXBpLkFjdGl2ZVgsIFdpbmFwaS5tc3htbCwgV2luYXBpLldpblNvY2ssCisgICAgeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICAgIFdlYi5XaW4uU29ja2V0cywKKyAgICB7JEVMU0V9CisgICAgICBUaHJpZnQuU29ja2V0LAorICAgIHskRU5ESUZ9CisgIHskRU5ESUZ9CiAgIFRocmlmdC5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiwKICAgVGhyaWZ0LlV0aWxzLAotICBUaHJpZnQuU3RyZWFtLAotICBBY3RpdmVYLAotICBtc3htbDsKKyAgVGhyaWZ0LlN0cmVhbTsKIAogdHlwZQogICBJVHJhbnNwb3J0ID0gaW50ZXJmYWNlCi0gICAgWyd7QTRBOUZDMzctRDYyMC00NERDLUFEMjEtNjYyRDE2MzY0Q0U0fSddCisgICAgWyd7REI4NDk2MUUtOEJCMy00NTMyLTk5RTEtQThDN0FDMjMwMEY3fSddCiAgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOwogICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsKICAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOwogICAgIHByb2NlZHVyZSBPcGVuOwogICAgIHByb2NlZHVyZSBDbG9zZTsKLSAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOwotICAgIGZ1bmN0aW9uIFJlYWRBbGwodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CisgICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVhZChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkQWxsKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOwogICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXMpOyBvdmVybG9hZDsKICAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGxlbiA6IEludGVnZXIpOyBvdmVybG9hZDsKICAgICBwcm9jZWR1cmUgRmx1c2g7CiAgIGVuZDsKIApAQCAtNTcsMTQgKzY5LDE4IEBACiAgICAgZnVuY3Rpb24gUGVlazogQm9vbGVhbjsgdmlydHVhbDsKICAgICBwcm9jZWR1cmUgT3BlbigpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgZnVuY3Rpb24gUmVhZEFsbCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgdmlydHVhbDsKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7Ci0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVybG9hZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBmdW5jdGlvbiBSZWFkKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBmdW5jdGlvbiBSZWFkQWxsKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXMpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBsZW4gOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVybG9hZDsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyB2aXJ0dWFsOwogICBlbmQ7CiAKLSAgVFRyYW5zcG9ydEV4Y2VwdGlvbiA9IGNsYXNzKCBFeGNlcHRpb24gKQorICBUVHJhbnNwb3J0RXhjZXB0aW9uID0gY2xhc3MoIFRFeGNlcHRpb24pCiAgIHB1YmxpYwogICAgIHR5cGUKICAgICAgIFRFeGNlcHRpb25UeXBlID0gKApAQCAtNzIsMjYgKzg4LDUxIEBACiAgICAgICAgIE5vdE9wZW4sCiAgICAgICAgIEFscmVhZHlPcGVuLAogICAgICAgICBUaW1lZE91dCwKLSAgICAgICAgRW5kT2ZGaWxlCisgICAgICAgIEVuZE9mRmlsZSwKKyAgICAgICAgQmFkQXJncywKKyAgICAgICAgSW50ZXJydXB0ZWQKICAgICAgICk7CiAgIHByaXZhdGUKLSAgICBGVHlwZSA6IFRFeGNlcHRpb25UeXBlOworICAgIGZ1bmN0aW9uIEdldFR5cGU6IFRFeGNlcHRpb25UeXBlOworICBwcm90ZWN0ZWQKKyAgICBjb25zdHJ1Y3RvciBIaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOwogICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZSk7IG92ZXJsb2FkOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgbXNnOiBzdHJpbmcpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZTsgY29uc3QgbXNnOiBzdHJpbmcpOyBvdmVybG9hZDsKLSAgICBwcm9wZXJ0eSBUeXBlXzogVEV4Y2VwdGlvblR5cGUgcmVhZCBGVHlwZTsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRUcmFuc3BvcnRFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggY29uc3QgbXNnOiBzdHJpbmcpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOyByZWludHJvZHVjZTsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUVHJhbnNwb3J0RXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGU7IGNvbnN0IG1zZzogc3RyaW5nKTogVFRyYW5zcG9ydEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUVHJhbnNwb3J0RXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgcHJvcGVydHkgVHlwZV86IFRFeGNlcHRpb25UeXBlIHJlYWQgR2V0VHlwZTsKICAgZW5kOwogCisgIC8vIE5lZWRlZCB0byByZW1vdmUgZGVwcmVjYXRpb24gd2FybmluZworICBUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQgPSBjbGFzcyBhYnN0cmFjdCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKKyAgZW5kOworCisgIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3BlbiA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbkVuZE9mRmlsZSA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncyA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKwogICBJSFRUUENsaWVudCA9IGludGVyZmFjZSggSVRyYW5zcG9ydCApCi0gICAgWyd7MEY1REI4QUItNzEwRC00MzM4LUFBQzktNDZCNTczNEM1MDU3fSddCisgICAgWyd7QkExNDJEMTItOEFFNi00QjUwLTlFMzMtNkI3ODQzQjIxRDczfSddCisgICAgcHJvY2VkdXJlIFNldERuc1Jlc29sdmVUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXREbnNSZXNvbHZlVGltZW91dDogSW50ZWdlcjsKICAgICBwcm9jZWR1cmUgU2V0Q29ubmVjdGlvblRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOwogICAgIGZ1bmN0aW9uIEdldENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRTZW5kVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0U2VuZFRpbWVvdXQ6IEludGVnZXI7CiAgICAgcHJvY2VkdXJlIFNldFJlYWRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKICAgICBmdW5jdGlvbiBHZXRSZWFkVGltZW91dDogSW50ZWdlcjsKICAgICBmdW5jdGlvbiBHZXRDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKICAgICBwcm9jZWR1cmUgU2VuZFJlcXVlc3Q7CisKKyAgICBwcm9wZXJ0eSBEbnNSZXNvbHZlVGltZW91dDogSW50ZWdlciByZWFkIEdldERuc1Jlc29sdmVUaW1lb3V0IHdyaXRlIFNldERuc1Jlc29sdmVUaW1lb3V0OwogICAgIHByb3BlcnR5IENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0Q29ubmVjdGlvblRpbWVvdXQgd3JpdGUgU2V0Q29ubmVjdGlvblRpbWVvdXQ7CisgICAgcHJvcGVydHkgU2VuZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRTZW5kVGltZW91dCB3cml0ZSBTZXRTZW5kVGltZW91dDsKICAgICBwcm9wZXJ0eSBSZWFkVGltZW91dDogSW50ZWdlciByZWFkIEdldFJlYWRUaW1lb3V0IHdyaXRlIFNldFJlYWRUaW1lb3V0OwogICAgIHByb3BlcnR5IEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+IHJlYWQgR2V0Q3VzdG9tSGVhZGVyczsKICAgZW5kOwpAQCAtMTAxLDcgKzE0Miw5IEBACiAgICAgRlVyaSA6IHN0cmluZzsKICAgICBGSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOwogICAgIEZPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworICAgIEZEbnNSZXNvbHZlVGltZW91dCA6IEludGVnZXI7CiAgICAgRkNvbm5lY3Rpb25UaW1lb3V0IDogSW50ZWdlcjsKKyAgICBGU2VuZFRpbWVvdXQgOiBJbnRlZ2VyOwogICAgIEZSZWFkVGltZW91dCA6IEludGVnZXI7CiAgICAgRkN1c3RvbUhlYWRlcnMgOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKIApAQCAtMTEwLDE3ICsxNTMsMjQgQEAKICAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKIAorICAgIHByb2NlZHVyZSBTZXREbnNSZXNvbHZlVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CiAgICAgcHJvY2VkdXJlIFNldENvbm5lY3Rpb25UaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKICAgICBmdW5jdGlvbiBHZXRDb25uZWN0aW9uVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFNlbmRUaW1lb3V0OiBJbnRlZ2VyOwogICAgIHByb2NlZHVyZSBTZXRSZWFkVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CiAgICAgZnVuY3Rpb24gR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CisKICAgICBmdW5jdGlvbiBHZXRDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKICAgICBwcm9jZWR1cmUgU2VuZFJlcXVlc3Q7CisgICAgcHJvcGVydHkgRG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXREbnNSZXNvbHZlVGltZW91dCB3cml0ZSBTZXREbnNSZXNvbHZlVGltZW91dDsKICAgICBwcm9wZXJ0eSBDb25uZWN0aW9uVGltZW91dDogSW50ZWdlciByZWFkIEdldENvbm5lY3Rpb25UaW1lb3V0IHdyaXRlIFNldENvbm5lY3Rpb25UaW1lb3V0OworICAgIHByb3BlcnR5IFNlbmRUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0U2VuZFRpbWVvdXQgd3JpdGUgU2V0U2VuZFRpbWVvdXQ7CiAgICAgcHJvcGVydHkgUmVhZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRSZWFkVGltZW91dCB3cml0ZSBTZXRSZWFkVGltZW91dDsKICAgICBwcm9wZXJ0eSBDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPiByZWFkIEdldEN1c3RvbUhlYWRlcnM7CiAgIHB1YmxpYwpAQCAtMTUyLDYgKzIwMiw3IEBACiAgIGVuZDsKIAogICBUVGNwU29ja2V0U3RyZWFtSW1wbCA9IGNsYXNzKCBUVGhyaWZ0U3RyZWFtSW1wbCApCit7JElGREVGIE9MRF9TT0NLRVRTfQogICBwcml2YXRlIHR5cGUKICAgICBUV2FpdEZvckRhdGEgPSAoIHdmZF9IYXZlRGF0YSwgd2ZkX1RpbWVvdXQsIHdmZF9FcnJvcik7CiAgIHByaXZhdGUKQEAgLTE2MSw5ICsyMTIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgIFRpbWVPdXQ6IEludGVnZXI7IHZhciB3c2FFcnJvciA6IEludGVnZXIpOiBJbnRlZ2VyOwogICAgIGZ1bmN0aW9uIFdhaXRGb3JEYXRhKCBUaW1lT3V0IDogSW50ZWdlcjsgcEJ1ZiA6IFBvaW50ZXI7IERlc2lyZWRCeXRlczogSW50ZWdlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdzYUVycm9yLCBieXRlc1JlYWR5IDogSW50ZWdlcik6IFRXYWl0Rm9yRGF0YTsKK3skRUxTRX0KKyAgICBGVGNwQ2xpZW50OiBUU29ja2V0OworICBwcm90ZWN0ZWQgY29uc3QKKyAgICBTTEVFUF9USU1FID0gMjAwOworeyRFTkRJRn0KICAgcHJvdGVjdGVkCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CkBAIC0xNzEsNyArMjI3LDExIEBACiAgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IG92ZXJyaWRlOwogICBwdWJsaWMKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUQ3VzdG9tSXBDbGllbnQ7IGNvbnN0IGFUaW1lb3V0IDogSW50ZWdlciA9IDApOworeyRFTFNFfQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRjcENsaWVudDogVFNvY2tldDsgY29uc3QgYVRpbWVvdXQgOiBMb25nd29yZCA9IDApOworeyRFTkRJRn0KICAgZW5kOwogCiAgIElTdHJlYW1UcmFuc3BvcnQgPSBpbnRlcmZhY2UoIElUcmFuc3BvcnQgKQpAQCAtMTk4LDggKzI1OCw4IEBACiAgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVycmlkZTsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07IGNvbnN0IEFPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtKTsKICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOwogICBlbmQ7CkBAIC0yMTEsOCArMjcxLDggQEAKICAgICBGUmVhZEJ1ZmZlciA6IFRNZW1vcnlTdHJlYW07CiAgICAgRldyaXRlQnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKICAgcHJvdGVjdGVkCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBPcGVuOyAgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOwpAQCAtMjI1LDE2ICsyODUsMjUgQEAKIAogICBUU2VydmVyU29ja2V0SW1wbCA9IGNsYXNzKCBUU2VydmVyVHJhbnNwb3J0SW1wbCkKICAgcHJpdmF0ZQoreyRJRkRFRiBPTERfU09DS0VUU30KICAgICBGU2VydmVyIDogVFRjcFNlcnZlcjsKICAgICBGUG9ydCA6IEludGVnZXI7CiAgICAgRkNsaWVudFRpbWVvdXQgOiBJbnRlZ2VyOworeyRFTFNFfQorICAgIEZTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7Cit7JEVORElGfQogICAgIEZVc2VCdWZmZXJlZFNvY2tldCA6IEJvb2xlYW47CiAgICAgRk93bnNTZXJ2ZXIgOiBCb29sZWFuOwogICBwcm90ZWN0ZWQKICAgICBmdW5jdGlvbiBBY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYykgOiBJVHJhbnNwb3J0OyBvdmVycmlkZTsKICAgcHVibGljCit7JElGREVGIE9MRF9TT0NLRVRTfQogICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVNlcnZlcjogVFRjcFNlcnZlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7CiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBUG9ydDogSW50ZWdlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIgPSAwOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuID0gRkFMU0UpOyBvdmVybG9hZDsKK3skRUxTRX0KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZCA9IDApOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFQb3J0OiBJbnRlZ2VyOyBBQ2xpZW50VGltZW91dDogTG9uZ3dvcmQgPSAwOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuID0gRkFMU0UpOyBvdmVybG9hZDsKK3skRU5ESUZ9CiAgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgTGlzdGVuOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOwpAQCAtMjU1LDggKzMyNCw4IEBACiAgIHB1YmxpYwogICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVycmlkZTsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQgOiBJU3RyZWFtVHJhbnNwb3J0ICk7IG92ZXJsb2FkOwogICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRyYW5zcG9ydCA6IElTdHJlYW1UcmFuc3BvcnQ7IEFCdWZTaXplOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CiAgICAgcHJvcGVydHkgVW5kZXJseWluZ1RyYW5zcG9ydDogSVRyYW5zcG9ydCByZWFkIEdldFVuZGVybHlpbmdUcmFuc3BvcnQ7CkBAIC0yNjUsMjIgKzMzNCwzOSBAQAogCiAgIFRTb2NrZXRJbXBsID0gY2xhc3MoVFN0cmVhbVRyYW5zcG9ydEltcGwpCiAgIHByaXZhdGUKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgICAgRkNsaWVudCA6IFRDdXN0b21JcENsaWVudDsKK3skRUxTRX0KKyAgICBGQ2xpZW50OiBUU29ja2V0OworeyRFTkRJRn0KICAgICBGT3duc0NsaWVudCA6IEJvb2xlYW47CiAgICAgRkhvc3QgOiBzdHJpbmc7CiAgICAgRlBvcnQgOiBJbnRlZ2VyOworeyRJRkRFRiBPTERfU09DS0VUU30KICAgICBGVGltZW91dCA6IEludGVnZXI7Cit7JEVMU0V9CisgICAgRlRpbWVvdXQgOiBMb25nd29yZDsKK3skRU5ESUZ9CiAKICAgICBwcm9jZWR1cmUgSW5pdFNvY2tldDsKICAgcHJvdGVjdGVkCiAgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKICAgcHVibGljCiAgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworeyRJRkRFRiBPTERfU09DS0VUU30KICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFDbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7IGFPd25zQ2xpZW50IDogQm9vbGVhbjsgQVRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7CiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7Cit7JEVMU0V9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFDbGllbnQ6IFRTb2NrZXQ7IGFPd25zQ2xpZW50OiBCb29sZWFuKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IExvbmd3b3JkID0gMCk7IG92ZXJsb2FkOworeyRFTkRJRn0KICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7Cit7JElGREVGIE9MRF9TT0NLRVRTfQogICAgIHByb3BlcnR5IFRjcENsaWVudDogVEN1c3RvbUlwQ2xpZW50IHJlYWQgRkNsaWVudDsKK3skRUxTRX0KKyAgICBwcm9wZXJ0eSBUY3BDbGllbnQ6IFRTb2NrZXQgcmVhZCBGQ2xpZW50OworeyRFTkRJRn0KICAgICBwcm9wZXJ0eSBIb3N0IDogc3RyaW5nIHJlYWQgRkhvc3Q7CiAgICAgcHJvcGVydHkgUG9ydDogSW50ZWdlciByZWFkIEZQb3J0OwogICBlbmQ7CkBAIC0zMDQsOSArMzkwLDEwIEBACiAgICAgICAgIGZ1bmN0aW9uIEdldFRyYW5zcG9ydCggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7CiAgICAgICBlbmQ7CiAKLXskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgICAgeyRJRkRFRiBIQVZFX0NMQVNTX0NUT1J9CiAgICAgY2xhc3MgY29uc3RydWN0b3IgQ3JlYXRlOwoteyRJRkVORH0KKyAgICB7JEVORElGfQorCiAgICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk7IG92ZXJsb2FkOwogICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CkBAIC0zMTUsMTQgKzQwMiwxNCBAQAogICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CiAKICAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKICAgZW5kOwogCi17JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9Cit7JElGTkRFRiBIQVZFX0NMQVNTX0NUT1J9CiBwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGxfSW5pdGlhbGl6ZTsKLXskSUZFTkR9Cit7JEVORElGfQogCiBjb25zdAogICBERUZBVUxUX1RIUklGVF9USU1FT1VUID0gNSAqIDEwMDA7IC8vIG1zCkBAIC0zMzQsNyArNDIxLDcgQEAKIAogcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLkZsdXNoOwogYmVnaW4KLQorICAvLyBub3RoaW5nIHRvIGRvCiBlbmQ7CiAKIGZ1bmN0aW9uIFRUcmFuc3BvcnRJbXBsLlBlZWs6IEJvb2xlYW47CkBAIC0zNDIsNDEgKzQyOSw2MiBAQAogICBSZXN1bHQgOj0gSXNPcGVuOwogZW5kOwogCi1mdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKCB2YXIgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKLXZhcgotICBnb3QgOiBJbnRlZ2VyOwotICByZXQgOiBJbnRlZ2VyOworZnVuY3Rpb24gVFRyYW5zcG9ydEltcGwuUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCi0gIGdvdCA6PSAwOwotICB3aGlsZSAoIGdvdCA8IGxlbikgZG8KLSAgYmVnaW4KLSAgICByZXQgOj0gUmVhZCggYnVmLCBvZmYgKyBnb3QsIGxlbiAtIGdvdCk7Ci0gICAgaWYgKCByZXQgPD0gMCApIHRoZW4KLSAgICBiZWdpbgotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoICdDYW5ub3QgcmVhZCwgUmVtb3RlIHNpZGUgaGFzIGNsb3NlZCcgKTsKLSAgICBlbmQ7Ci0gICAgZ290IDo9IGdvdCArIHJldDsKLSAgZW5kOwotICBSZXN1bHQgOj0gZ290OworICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiByZXN1bHQgOj0gUmVhZCggQGJ1ZlswXSwgTGVuZ3RoKGJ1ZiksIG9mZiwgbGVuKQorICBlbHNlIHJlc3VsdCA6PSAwOworZW5kOworCitmdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgTGVuZ3RoKGJ1ZikgPiAwCisgIHRoZW4gcmVzdWx0IDo9IFJlYWRBbGwoIEBidWZbMF0sIExlbmd0aChidWYpLCBvZmYsIGxlbikKKyAgZWxzZSByZXN1bHQgOj0gMDsKIGVuZDsKIAogcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7CiBiZWdpbgotICBTZWxmLldyaXRlKCBidWYsIDAsIExlbmd0aChidWYpICk7CisgIGlmIExlbmd0aChidWYpID4gMAorICB0aGVuIFdyaXRlKCBAYnVmWzBdLCAwLCBMZW5ndGgoYnVmKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIExlbmd0aChidWYpID4gMAorICB0aGVuIFdyaXRlKCBAYnVmWzBdLCBvZmYsIGxlbik7CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmFuc3BvcnRJbXBsLlJlYWRBbGwoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciByZXQgOiBJbnRlZ2VyOworYmVnaW4KKyAgcmVzdWx0IDo9IDA7CisgIHdoaWxlIHJlc3VsdCA8IGxlbiBkbyBiZWdpbgorICAgIHJldCA6PSBSZWFkKCBwQnVmLCBidWZsZW4sIG9mZiArIHJlc3VsdCwgbGVuIC0gcmVzdWx0KTsKKyAgICBpZiByZXQgPiAwCisgICAgdGhlbiBJbmMoIHJlc3VsdCwgcmV0KQorICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCAnQ2Fubm90IHJlYWQsIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQnICk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgbGVuIDogSW50ZWdlcik7CitiZWdpbgorICBTZWxmLldyaXRlKCBwQnVmLCAwLCBsZW4pOwogZW5kOwogCiB7IFRIVFRQQ2xpZW50SW1wbCB9CiAKLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuQ2xvc2U7Ci1iZWdpbgotICBGSW5wdXRTdHJlYW0gOj0gbmlsOwotICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKLWVuZDsKLQogY29uc3RydWN0b3IgVEhUVFBDbGllbnRJbXBsLkNyZWF0ZShjb25zdCBBVXJpOiBzdHJpbmcpOwogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZTsKICAgRlVyaSA6PSBBVXJpOworCisgIC8vIGRlZmF1bHRzIGFjY29yZGluZyB0byBNU0ROCisgIEZEbnNSZXNvbHZlVGltZW91dCA6PSAwOyAvLyBubyB0aW1lb3V0CisgIEZDb25uZWN0aW9uVGltZW91dCA6PSA2MCAqIDEwMDA7CisgIEZTZW5kVGltZW91dCAgICAgICA6PSAzMCAqIDEwMDA7CisgIEZSZWFkVGltZW91dCAgICAgICA6PSAzMCAqIDEwMDA7CisKICAgRkN1c3RvbUhlYWRlcnMgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPHN0cmluZyxzdHJpbmc+LkNyZWF0ZTsKICAgRk91dHB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIFRNZW1vcnlTdHJlYW0uQ3JlYXRlLCBUcnVlKTsKIGVuZDsKQEAgLTM4NCwyMCArNDkyLDI0IEBACiBmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuQ3JlYXRlUmVxdWVzdDogSVhNTEhUVFBSZXF1ZXN0OwogdmFyCiAgIHBhaXIgOiBUUGFpcjxzdHJpbmcsc3RyaW5nPjsKKyAgc3J2SHR0cCA6IElTZXJ2ZXJYTUxIVFRQUmVxdWVzdDsKIGJlZ2luCi17JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQotICBSZXN1bHQgOj0gQ29YTUxIVFRQLkNyZWF0ZTsKLXskRUxTRX0KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgUmVzdWx0IDo9IENvU2VydmVyWE1MSFRUUC5DcmVhdGU7CisgIHskRUxTRX0KICAgUmVzdWx0IDo9IENvWE1MSFRUUFJlcXVlc3QuQ3JlYXRlOwoteyRJRkVORH0KKyAgeyRJRkVORH0KKworICAvLyBzZXR0aW5nIGEgdGltZW91dCB2YWx1ZSB0byAwICh6ZXJvKSBtZWFucyAibm8gdGltZW91dCIgZm9yIHRoYXQgc2V0dGluZworICBpZiBTdXBwb3J0cyggcmVzdWx0LCBJU2VydmVyWE1MSFRUUFJlcXVlc3QsIHNydkh0dHApCisgIHRoZW4gc3J2SHR0cC5zZXRUaW1lb3V0cyggRG5zUmVzb2x2ZVRpbWVvdXQsIENvbm5lY3Rpb25UaW1lb3V0LCBTZW5kVGltZW91dCwgUmVhZFRpbWVvdXQpOwogCiAgIFJlc3VsdC5vcGVuKCdQT1NUJywgRlVyaSwgRmFsc2UsICcnLCAnJyk7CiAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CiAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CiAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnVXNlci1BZ2VudCcsICdEZWxwaGkvSUhUVFBDbGllbnQnKTsKIAotICBmb3IgcGFpciBpbiBGQ3VzdG9tSGVhZGVycyBkbwotICBiZWdpbgorICBmb3IgcGFpciBpbiBGQ3VzdG9tSGVhZGVycyBkbyBiZWdpbgogICAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCBwYWlyLktleSwgcGFpci5WYWx1ZSApOwogICBlbmQ7CiBlbmQ7CkBAIC00MDgsMTQgKzUyMCwxNCBAQAogICBpbmhlcml0ZWQ7CiBlbmQ7CiAKLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuRmx1c2g7CitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CiBiZWdpbgotICB0cnkKLSAgICBTZW5kUmVxdWVzdDsKLSAgZmluYWxseQotICAgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOwotICAgIEZPdXRwdXRTdHJlYW0gOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBUTWVtb3J5U3RyZWFtLkNyZWF0ZSwgVHJ1ZSk7Ci0gIGVuZDsKKyAgUmVzdWx0IDo9IEZEbnNSZXNvbHZlVGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXREbnNSZXNvbHZlVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGRG5zUmVzb2x2ZVRpbWVvdXQgOj0gVmFsdWU7CiBlbmQ7CiAKIGZ1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRDb25uZWN0aW9uVGltZW91dDogSW50ZWdlcjsKQEAgLTQyMyw2ICs1MzUsMzEgQEAKICAgUmVzdWx0IDo9IEZDb25uZWN0aW9uVGltZW91dDsKIGVuZDsKIAorcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGQ29ubmVjdGlvblRpbWVvdXQgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRTZW5kVGltZW91dDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGU2VuZFRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlNlbmRUaW1lb3V0IDo9IFZhbHVlOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRlJlYWRUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldFJlYWRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZSZWFkVGltZW91dCA6PSBWYWx1ZTsKK2VuZDsKKwogZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+OwogYmVnaW4KICAgUmVzdWx0IDo9IEZDdXN0b21IZWFkZXJzOwpAQCAtNDMzLDMxICs1NzAsMzkgQEAKICAgUmVzdWx0IDo9IFRydWU7CiBlbmQ7CiAKLWZ1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRSZWFkVGltZW91dDogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGUmVhZFRpbWVvdXQ7Ci1lbmQ7Ci0KIHByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuT3BlbjsKIGJlZ2luCi0KKyAgRk91dHB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIFRNZW1vcnlTdHJlYW0uQ3JlYXRlLCBUcnVlKTsKIGVuZDsKIAotZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLlJlYWQoIHZhciBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5DbG9zZTsKIGJlZ2luCi0gIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICdObyByZXF1ZXN0IGhhcyBiZWVuIHNlbnQnKTsKLSAgZW5kOworICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5GbHVzaDsKK2JlZ2luCiAgIHRyeQotICAgIFJlc3VsdCA6PSBGSW5wdXRTdHJlYW0uUmVhZCggYnVmLCBvZmYsIGxlbiApCisgICAgU2VuZFJlcXVlc3Q7CisgIGZpbmFsbHkKKyAgICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKKyAgICBGT3V0cHV0U3RyZWFtIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggVE1lbW9yeVN0cmVhbS5DcmVhdGUsIFRydWUpOworICAgIEFTU0VSVCggRk91dHB1dFN0cmVhbSA8PiBuaWwpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgRklucHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ05vIHJlcXVlc3QgaGFzIGJlZW4gc2VudCcpOworICBlbmQ7CisKKyAgdHJ5CisgICAgUmVzdWx0IDo9IEZJbnB1dFN0cmVhbS5SZWFkKCBwQnVmLCBidWZsZW4sIG9mZiwgbGVuKQogICBleGNlcHQKLSAgICBvbiBFOiBFeGNlcHRpb24gZG8KLSAgICBiZWdpbgotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVW5rbm93biwKLSAgICAgICAgRS5NZXNzYWdlKTsKLSAgICBlbmQ7CisgICAgb24gRTogRXhjZXB0aW9uCisgICAgZG8gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEUuTWVzc2FnZSk7CiAgIGVuZDsKIGVuZDsKIApAQCAtNDc0LDggKzYxOSw3IEBACiAgIHRyeQogICAgIGEgOj0gRk91dHB1dFN0cmVhbS5Ub0FycmF5OwogICAgIGxlbiA6PSBMZW5ndGgoYSk7Ci0gICAgaWYgbGVuID4gMCB0aGVuCi0gICAgYmVnaW4KKyAgICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KICAgICAgIG1zLldyaXRlQnVmZmVyKCBQb2ludGVyKEBhWzBdKV4sIGxlbik7CiAgICAgZW5kOwogICAgIG1zLlBvc2l0aW9uIDo9IDA7CkBAIC00ODcsMzkgKzYzMSw2MiBAQAogICBlbmQ7CiBlbmQ7CiAKLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0Q29ubmVjdGlvblRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7CiBiZWdpbgotICBGQ29ubmVjdGlvblRpbWVvdXQgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0UmVhZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOwotYmVnaW4KLSAgRlJlYWRUaW1lb3V0IDo9IFZhbHVlCi1lbmQ7Ci0KLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmYsIGxlbjogSW50ZWdlcik7Ci1iZWdpbgotICBGT3V0cHV0U3RyZWFtLldyaXRlKCBidWYsIG9mZiwgbGVuKTsKKyAgRk91dHB1dFN0cmVhbS5Xcml0ZSggcEJ1Ziwgb2ZmLCBsZW4pOwogZW5kOwogCiB7IFRUcmFuc3BvcnRFeGNlcHRpb24gfQogCi1jb25zdHJ1Y3RvciBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShBVHlwZTogVEV4Y2VwdGlvblR5cGUpOworZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5HZXRUeXBlOiBURXhjZXB0aW9uVHlwZTsKK2JlZ2luCisgIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4gdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuTm90T3BlbgorICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbkFscmVhZHlPcGVuIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuCisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVGltZWRPdXQKKyAgZWxzZSBpZiBTZWxmIGlzIFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlCisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncyB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5CYWRBcmdzCisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQKKyAgZWxzZSBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKK2VuZDsKKworY29uc3RydWN0b3IgVFRyYW5zcG9ydEV4Y2VwdGlvbi5IaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShNc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOwogYmVnaW4KICAgLy9ubyBpbmhlcml0ZWQ7Ci0gIENyZWF0ZSggQVR5cGUsICcnICkKK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBPRkZ9CisgIFJlc3VsdCA6PSBDcmVhdGUoQVR5cGUsICcnKQoreyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIERFRkFVTFR9CiBlbmQ7CiAKLWNvbnN0cnVjdG9yIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKEFUeXBlOiBURXhjZXB0aW9uVHlwZTsKLSAgY29uc3QgbXNnOiBzdHJpbmcpOworY2xhc3MgZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlOworICBjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKG1zZyk7Ci0gIEZUeXBlIDo9IEFUeXBlOworICBjYXNlIEFUeXBlIG9mCisgICAgVEV4Y2VwdGlvblR5cGUuTm90T3BlbjogICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbjogUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3Blbi5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5UaW1lZE91dDogICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5FbmRPZkZpbGU6ICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUuQ3JlYXRlKG1zZyk7CisgICAgVEV4Y2VwdGlvblR5cGUuQmFkQXJnczogICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncy5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZDogUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25JbnRlcnJ1cHRlZC5DcmVhdGUobXNnKTsKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUobXNnKTsKKyAgZW5kOwogZW5kOwogCi1jb25zdHJ1Y3RvciBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShjb25zdCBtc2c6IHN0cmluZyk7CitjbGFzcyBmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKG1zZyk7CisgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoTXNnKTsKK2VuZDsKKworeyBUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQgfQorCitjb25zdHJ1Y3RvciBUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBIaWRkZW5DcmVhdGUoTXNnKTsKIGVuZDsKIAogeyBUVHJhbnNwb3J0RmFjdG9yeUltcGwgfQpAQCAtNTMxLDI3ICs2OTgsNDUgQEAKIAogeyBUU2VydmVyU29ja2V0IH0KIAoreyRJRkRFRiBPTERfU09DS0VUU30KIGNvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggY29uc3QgQVNlcnZlcjogVFRjcFNlcnZlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIpOwogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZTsKICAgRlNlcnZlciA6PSBBU2VydmVyOwogICBGQ2xpZW50VGltZW91dCA6PSBBQ2xpZW50VGltZW91dDsKIGVuZDsKLQotY29uc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKEFQb3J0LCBBQ2xpZW50VGltZW91dDogSW50ZWdlcjsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZCk7CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU2VydmVyIDo9IEFTZXJ2ZXI7CisgIEZTZXJ2ZXIuUmVjdlRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CisgIEZTZXJ2ZXIuU2VuZFRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CitlbmQ7Cit7JEVORElGfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorY29uc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKEFQb3J0LCBBQ2xpZW50VGltZW91dDogSW50ZWdlcjsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZDsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVORElGfQorYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgIEZQb3J0IDo9IEFQb3J0OwogICBGQ2xpZW50VGltZW91dCA6PSBBQ2xpZW50VGltZW91dDsKLSAgRlVzZUJ1ZmZlcmVkU29ja2V0IDo9IEFVc2VCdWZmZXJlZFNvY2tldHM7Ci0gIEZPd25zU2VydmVyIDo9IFRydWU7CiAgIEZTZXJ2ZXIgOj0gVFRjcFNlcnZlci5DcmVhdGUoIG5pbCApOwogICBGU2VydmVyLkJsb2NrTW9kZSA6PSBibUJsb2NraW5nOwoteyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KICAgRlNlcnZlci5Mb2NhbFBvcnQgOj0gQW5zaVN0cmluZyggSW50VG9TdHIoIEZQb3J0KSk7Ci17JEVMU0V9CisgIHskRUxTRX0KICAgRlNlcnZlci5Mb2NhbFBvcnQgOj0gSW50VG9TdHIoIEZQb3J0KTsKLXskSUZFTkR9CisgIHskSUZFTkR9Cit7JEVMU0V9CisgIEZTZXJ2ZXIgOj0gVFNlcnZlclNvY2tldC5DcmVhdGUoQVBvcnQsIEFDbGllbnRUaW1lb3V0LCBBQ2xpZW50VGltZW91dCk7Cit7JEVORElGfQorICBGVXNlQnVmZmVyZWRTb2NrZXQgOj0gQVVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgRk93bnNTZXJ2ZXIgOj0gVHJ1ZTsKIGVuZDsKIAogZGVzdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5EZXN0cm95OwpAQCAtNTY1LDE1ICs3NTAsMTggQEAKIAogZnVuY3Rpb24gVFNlcnZlclNvY2tldEltcGwuQWNjZXB0KCBjb25zdCBmbkFjY2VwdGluZzogVFByb2MpOiBJVHJhbnNwb3J0OwogdmFyCit7JElGREVGIE9MRF9TT0NLRVRTfQogICBjbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7Cit7JEVMU0V9CisgIGNsaWVudDogVFNvY2tldDsKK3skRU5ESUZ9CiAgIHRyYW5zICA6IElTdHJlYW1UcmFuc3BvcnQ7CiBiZWdpbgotICBpZiBGU2VydmVyID0gbmlsIHRoZW4KLSAgYmVnaW4KLSAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgJ05vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4nKTsKKyAgaWYgRlNlcnZlciA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuJyk7CiAgIGVuZDsKIAoreyRJRkRFRiBPTERfU09DS0VUU30KICAgY2xpZW50IDo9IG5pbDsKICAgdHJ5CiAgICAgY2xpZW50IDo9IFRDdXN0b21JcENsaWVudC5DcmVhdGUobmlsKTsKQEAgLTU4MSwxNSArNzY5LDEzIEBACiAgICAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpCiAgICAgdGhlbiBmbkFjY2VwdGluZygpOwogCi0gICAgaWYgbm90IEZTZXJ2ZXIuQWNjZXB0KCBjbGllbnQpIHRoZW4KLSAgICBiZWdpbgorICAgIGlmIG5vdCBGU2VydmVyLkFjY2VwdCggY2xpZW50KSB0aGVuIGJlZ2luCiAgICAgICBjbGllbnQuRnJlZTsKICAgICAgIFJlc3VsdCA6PSBuaWw7CiAgICAgICBFeGl0OwogICAgIGVuZDsKIAotICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuCi0gICAgYmVnaW4KKyAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiBiZWdpbgogICAgICAgUmVzdWx0IDo9IG5pbDsKICAgICAgIEV4aXQ7CiAgICAgZW5kOwpAQCAtNjA0LDQzICs3OTAsNjQgQEAKICAgZXhjZXB0CiAgICAgb24gRTogRXhjZXB0aW9uIGRvIGJlZ2luCiAgICAgICBjbGllbnQuRnJlZTsKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBFLlRvU3RyaW5nICk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRS5Ub1N0cmluZyk7CiAgICAgZW5kOwogICBlbmQ7Cit7JEVMU0V9CisgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKSB0aGVuCisgICAgZm5BY2NlcHRpbmcoKTsKKworICBjbGllbnQgOj0gRlNlcnZlci5BY2NlcHQ7CisgIHRyeQorICAgIHRyYW5zIDo9IFRTb2NrZXRJbXBsLkNyZWF0ZShjbGllbnQsIFRydWUpOworICAgIGNsaWVudCA6PSBuaWw7CisKKyAgICBpZiBGVXNlQnVmZmVyZWRTb2NrZXQgdGhlbgorICAgICAgUmVzdWx0IDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKHRyYW5zKQorICAgIGVsc2UKKyAgICAgIFJlc3VsdCA6PSB0cmFuczsKKyAgZXhjZXB0CisgICAgY2xpZW50LkZyZWU7CisgICAgcmFpc2U7CisgIGVuZDsKK3skRU5ESUZ9CiBlbmQ7CiAKIHByb2NlZHVyZSBUU2VydmVyU29ja2V0SW1wbC5MaXN0ZW47CiBiZWdpbgogICBpZiBGU2VydmVyIDw+IG5pbCB0aGVuCiAgIGJlZ2luCit7JElGREVGIE9MRF9TT0NLRVRTfQogICAgIHRyeQogICAgICAgRlNlcnZlci5BY3RpdmUgOj0gVHJ1ZTsKICAgICBleGNlcHQKLSAgICAgIG9uIEU6IEV4Y2VwdGlvbiBkbwotICAgICAgYmVnaW4KLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoJ0NvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogJyArIEUuTWVzc2FnZSk7Ci0gICAgICBlbmQ7CisgICAgICBvbiBFOiBFeGNlcHRpb24KKyAgICAgIGRvIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAnICsgRS5NZXNzYWdlKTsKICAgICBlbmQ7Cit7JEVMU0V9CisgICAgRlNlcnZlci5MaXN0ZW47Cit7JEVORElGfQogICBlbmQ7CiBlbmQ7CiAKIHByb2NlZHVyZSBUU2VydmVyU29ja2V0SW1wbC5DbG9zZTsKIGJlZ2luCiAgIGlmIEZTZXJ2ZXIgPD4gbmlsIHRoZW4KLSAgYmVnaW4KK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgICAgdHJ5CiAgICAgICBGU2VydmVyLkFjdGl2ZSA6PSBGYWxzZTsKICAgICBleGNlcHQKLSAgICAgIG9uIEU6IEV4Y2VwdGlvbiBkbwotICAgICAgYmVnaW4KLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoJ0Vycm9yIG9uIGNsb3Npbmcgc29ja2V0IDogJyArIEUuTWVzc2FnZSk7Ci0gICAgICBlbmQ7CisgICAgICBvbiBFOiBFeGNlcHRpb24KKyAgICAgIGRvIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnRXJyb3Igb24gY2xvc2luZyBzb2NrZXQgOiAnICsgRS5NZXNzYWdlKTsKICAgICBlbmQ7Ci0gIGVuZDsKK3skRUxTRX0KKyAgICBGU2VydmVyLkNsb3NlOworeyRFTkRJRn0KIGVuZDsKIAogeyBUU29ja2V0IH0KIAoreyRJRkRFRiBPTERfU09DS0VUU30KIGNvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZSggY29uc3QgQUNsaWVudCA6IFRDdXN0b21JcENsaWVudDsgYU93bnNDbGllbnQgOiBCb29sZWFuOyBBVGltZW91dDogSW50ZWdlciA9IDApOwogdmFyIHN0cmVhbSA6IElUaHJpZnRTdHJlYW07CiBiZWdpbgpAQCAtNjUwLDggKzg1NywyMyBAQAogICBzdHJlYW0gOj0gVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBGQ2xpZW50LCBGVGltZW91dCk7CiAgIGluaGVyaXRlZCBDcmVhdGUoIHN0cmVhbSwgc3RyZWFtKTsKIGVuZDsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBQ2xpZW50OiBUU29ja2V0OyBhT3duc0NsaWVudDogQm9vbGVhbik7Cit2YXIgc3RyZWFtIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIEZDbGllbnQgOj0gQUNsaWVudDsKKyAgRlRpbWVvdXQgOj0gQUNsaWVudC5SZWN2VGltZW91dDsKKyAgRk93bnNDbGllbnQgOj0gYU93bnNDbGllbnQ7CisgIHN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoRkNsaWVudCwgRlRpbWVvdXQpOworICBpbmhlcml0ZWQgQ3JlYXRlKHN0cmVhbSwgc3RyZWFtKTsKK2VuZDsKK3skRU5ESUZ9CiAKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiBjb25zdHJ1Y3RvciBUU29ja2V0SW1wbC5DcmVhdGUoY29uc3QgQUhvc3Q6IHN0cmluZzsgQVBvcnQsIEFUaW1lb3V0OiBJbnRlZ2VyKTsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IExvbmd3b3JkKTsKK3skRU5ESUZ9CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlKG5pbCxuaWwpOwogICBGSG9zdCA6PSBBSG9zdDsKQEAgLTY3MCwxMyArODkyLDIyIEBACiBwcm9jZWR1cmUgVFNvY2tldEltcGwuQ2xvc2U7CiBiZWdpbgogICBpbmhlcml0ZWQgQ2xvc2U7CisKKyAgRklucHV0U3RyZWFtIDo9IG5pbDsKKyAgRk91dHB1dFN0cmVhbSA6PSBuaWw7CisKICAgaWYgRk93bnNDbGllbnQKLSAgdGhlbiBGcmVlQW5kTmlsKCBGQ2xpZW50KTsKKyAgdGhlbiBGcmVlQW5kTmlsKCBGQ2xpZW50KQorICBlbHNlIEZDbGllbnQgOj0gbmlsOwogZW5kOwogCiBmdW5jdGlvbiBUU29ja2V0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47CiBiZWdpbgoreyRJRkRFRiBPTERfU09DS0VUU30KICAgUmVzdWx0IDo9IChGQ2xpZW50IDw+IG5pbCkgYW5kIEZDbGllbnQuQ29ubmVjdGVkOworeyRFTFNFfQorICBSZXN1bHQgOj0gKEZDbGllbnQgPD4gbmlsKSBhbmQgRkNsaWVudC5Jc09wZW4KK3skRU5ESUZ9CiBlbmQ7CiAKIHByb2NlZHVyZSBUU29ja2V0SW1wbC5Jbml0U29ja2V0OwpAQCAtNjg3LDcgKzkxOCwxMSBAQAogICB0aGVuIEZyZWVBbmROaWwoIEZDbGllbnQpCiAgIGVsc2UgRkNsaWVudCA6PSBuaWw7CiAKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgIEZDbGllbnQgOj0gVFRjcENsaWVudC5DcmVhdGUoIG5pbCk7Cit7JEVMU0V9CisgIEZDbGllbnQgOj0gVFNvY2tldC5DcmVhdGUoRkhvc3QsIEZQb3J0KTsKK3skRU5ESUZ9CiAgIEZPd25zQ2xpZW50IDo9IFRydWU7CiAKICAgc3RyZWFtIDo9IFRUY3BTb2NrZXRTdHJlYW1JbXBsLkNyZWF0ZSggRkNsaWVudCwgRlRpbWVvdXQpOwpAQCAtNjk3LDMyICs5MzIsMjggQEAKIAogcHJvY2VkdXJlIFRTb2NrZXRJbXBsLk9wZW47CiBiZWdpbgotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLAotICAgICAgJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcpOworICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3Blbi5DcmVhdGUoJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcpOwogICBlbmQ7CiAKLSAgaWYgRkhvc3QgPSAgJycgdGhlbgotICBiZWdpbgotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAnQ2Fubm90IG9wZW4gbnVsbCBob3N0Jyk7CisgIGlmIEZIb3N0ID0gJycgdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2Fubm90IG9wZW4gbnVsbCBob3N0Jyk7CiAgIGVuZDsKIAotICBpZiBQb3J0IDw9IDAgdGhlbgotICBiZWdpbgotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAnQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Jyk7CisgIGlmIFBvcnQgPD0gMCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQnKTsKICAgZW5kOwogCi0gIGlmIEZDbGllbnQgPSBuaWwgdGhlbgotICBiZWdpbgotICAgIEluaXRTb2NrZXQ7Ci0gIGVuZDsKKyAgaWYgRkNsaWVudCA9IG5pbAorICB0aGVuIEluaXRTb2NrZXQ7CiAKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgIEZDbGllbnQuUmVtb3RlSG9zdCA6PSBUU29ja2V0SG9zdCggSG9zdCk7CiAgIEZDbGllbnQuUmVtb3RlUG9ydCA6PSBUU29ja2V0UG9ydCggSW50VG9TdHIoIFBvcnQpKTsKICAgRkNsaWVudC5Db25uZWN0OworeyRFTFNFfQorICBGQ2xpZW50Lk9wZW47Cit7JEVORElGfQogCiAgIEZJbnB1dFN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIEZDbGllbnQsIEZUaW1lb3V0KTsKICAgRk91dHB1dFN0cmVhbSA6PSBGSW5wdXRTdHJlYW07CkBAIC03NjIsMTEgKzk5Myw5IEBACiAgIGJ1ZiA6IFRCeXRlczsKICAgbGVuIDogSW50ZWdlcjsKIGJlZ2luCi0gIGlmIElzT3BlbiB0aGVuCi0gIGJlZ2luCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCiAgICAgbGVuIDo9IEZXcml0ZUJ1ZmZlci5TaXplOwotICAgIGlmIGxlbiA+IDAgdGhlbgotICAgIGJlZ2luCisgICAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCiAgICAgICBTZXRMZW5ndGgoIGJ1ZiwgbGVuICk7CiAgICAgICBGV3JpdGVCdWZmZXIuUG9zaXRpb24gOj0gMDsKICAgICAgIEZXcml0ZUJ1ZmZlci5SZWFkKCBQb2ludGVyKEBidWZbMF0pXiwgbGVuICk7CkBAIC03ODAsMjcgKzEwMDksMjggQEAKIGJlZ2luCiAgIFJlc3VsdCA6PSAoRldyaXRlQnVmZmVyIDw+IG5pbCkKICAgICAgICAgYW5kIChGUmVhZEJ1ZmZlciA8PiBuaWwpCi0gICAgICAgIGFuZCAoRlN0cmVhbSA8PiBuaWwpOworICAgICAgICBhbmQgKEZTdHJlYW0gPD4gbmlsKQorICAgICAgICBhbmQgRlN0cmVhbS5Jc09wZW47CiBlbmQ7CiAKIHByb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLk9wZW47CiBiZWdpbgotCisgIEZTdHJlYW0uT3BlbjsKIGVuZDsKIAotZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5SZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CiB2YXIKICAgblJlYWQgOiBJbnRlZ2VyOwogICB0ZW1wYnVmIDogVEJ5dGVzOworICBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAgIFJlc3VsdCA6PSAwOwotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgorCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCiAgICAgd2hpbGUgY291bnQgPiAwIGRvIGJlZ2luCiAKLSAgICAgIGlmIEZSZWFkQnVmZmVyLlBvc2l0aW9uID49IEZSZWFkQnVmZmVyLlNpemUgdGhlbgotICAgICAgYmVnaW4KKyAgICAgIGlmIEZSZWFkQnVmZmVyLlBvc2l0aW9uID49IEZSZWFkQnVmZmVyLlNpemUgdGhlbiBiZWdpbgogICAgICAgICBGUmVhZEJ1ZmZlci5DbGVhcjsKICAgICAgICAgU2V0TGVuZ3RoKCB0ZW1wYnVmLCBGQnVmU2l6ZSk7CiAgICAgICAgIG5SZWFkIDo9IEZTdHJlYW0uUmVhZCggdGVtcGJ1ZiwgMCwgRkJ1ZlNpemUgKTsKQEAgLTgxMCwxMCArMTA0MCwxMSBAQAogICAgICAgICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOwogICAgICAgZW5kOwogCi0gICAgICBpZiBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA8IEZSZWFkQnVmZmVyLlNpemUgdGhlbgotICAgICAgYmVnaW4KLSAgICAgICAgblJlYWQgIDo9IE1pbiggRlJlYWRCdWZmZXIuU2l6ZSAtIEZSZWFkQnVmZmVyLlBvc2l0aW9uLCBjb3VudCk7Ci0gICAgICAgIEluYyggUmVzdWx0LCBGUmVhZEJ1ZmZlci5SZWFkKCBQb2ludGVyKEBidWZmZXJbb2Zmc2V0XSleLCBuUmVhZCkpOworICAgICAgaWYgRlJlYWRCdWZmZXIuUG9zaXRpb24gPCBGUmVhZEJ1ZmZlci5TaXplIHRoZW4gYmVnaW4KKyAgICAgICAgblJlYWQgOj0gTWluKCBGUmVhZEJ1ZmZlci5TaXplIC0gRlJlYWRCdWZmZXIuUG9zaXRpb24sIGNvdW50KTsKKyAgICAgICAgcFRtcCAgOj0gcEJ1ZjsKKyAgICAgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgICAgICBJbmMoIFJlc3VsdCwgRlJlYWRCdWZmZXIuUmVhZCggcFRtcF4sIG5SZWFkKSk7CiAgICAgICAgIERlYyggY291bnQsIG5SZWFkKTsKICAgICAgICAgSW5jKCBvZmZzZXQsIG5SZWFkKTsKICAgICAgIGVuZDsKQEAgLTgyMiwzNSArMTA1MywzMiBAQAogZW5kOwogCiBmdW5jdGlvbiBUQnVmZmVyZWRTdHJlYW1JbXBsLlRvQXJyYXk6IFRCeXRlczsKLXZhcgotICBsZW4gOiBJbnRlZ2VyOwordmFyIGxlbiA6IEludGVnZXI7CiBiZWdpbgogICBsZW4gOj0gMDsKIAotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgogICAgIGxlbiA6PSBGUmVhZEJ1ZmZlci5TaXplOwogICBlbmQ7CiAKICAgU2V0TGVuZ3RoKCBSZXN1bHQsIGxlbik7CiAKLSAgaWYgbGVuID4gMCB0aGVuCi0gIGJlZ2luCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgogICAgIEZSZWFkQnVmZmVyLlBvc2l0aW9uIDo9IDA7CiAgICAgRlJlYWRCdWZmZXIuUmVhZCggUG9pbnRlcihAUmVzdWx0WzBdKV4sIGxlbiApOwogICBlbmQ7CiBlbmQ7CiAKLXByb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Citwcm9jZWR1cmUgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwordmFyIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCiAgIGluaGVyaXRlZDsKLSAgaWYgY291bnQgPiAwIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBJc09wZW4gdGhlbgotICAgIGJlZ2luCi0gICAgICBGV3JpdGVCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQGJ1ZmZlcltvZmZzZXRdKV4sIGNvdW50ICk7Ci0gICAgICBpZiBGV3JpdGVCdWZmZXIuU2l6ZSA+IEZCdWZTaXplIHRoZW4KLSAgICAgIGJlZ2luCisgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICAgIEZXcml0ZUJ1ZmZlci5Xcml0ZSggcFRtcF4sIGNvdW50ICk7CisgICAgICBpZiBGV3JpdGVCdWZmZXIuU2l6ZSA+IEZCdWZTaXplIHRoZW4gYmVnaW4KICAgICAgICAgRmx1c2g7CiAgICAgICBlbmQ7CiAgICAgZW5kOwpAQCAtODU5LDI1ICsxMDg3LDYgQEAKIAogeyBUU3RyZWFtVHJhbnNwb3J0SW1wbCB9CiAKLXByb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DbG9zZTsKLWJlZ2luCi0gIGlmIEZJbnB1dFN0cmVhbSA8PiBGT3V0cHV0U3RyZWFtIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBGSW5wdXRTdHJlYW0gPD4gbmlsIHRoZW4KLSAgICBiZWdpbgotICAgICAgRklucHV0U3RyZWFtIDo9IG5pbDsKLSAgICBlbmQ7Ci0gICAgaWYgRk91dHB1dFN0cmVhbSA8PiBuaWwgdGhlbgotICAgIGJlZ2luCi0gICAgICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKLSAgICBlbmQ7Ci0gIGVuZCBlbHNlCi0gIGJlZ2luCi0gICAgRklucHV0U3RyZWFtIDo9IG5pbDsKLSAgICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKLSAgZW5kOwotZW5kOwotCiBjb25zdHJ1Y3RvciBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IEFJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07IGNvbnN0IEFPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtKTsKIGJlZ2luCiAgIGluaGVyaXRlZCBDcmVhdGU7CkBAIC04OTIsMTEgKzExMDEsMTYgQEAKICAgaW5oZXJpdGVkOwogZW5kOwogCitwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ2xvc2U7CitiZWdpbgorICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKK2VuZDsKKwogcHJvY2VkdXJlIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkZsdXNoOwogYmVnaW4KLSAgaWYgRk91dHB1dFN0cmVhbSA9IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwgJ0Nhbm5vdCBmbHVzaCBudWxsIG91dHB1dHN0cmVhbScgKTsKKyAgaWYgRk91dHB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3QgZmx1c2ggbnVsbCBvdXRwdXRzdHJlYW0nICk7CiAgIGVuZDsKIAogICBGT3V0cHV0U3RyZWFtLkZsdXNoOwpAQCAtOTE0LDcgKzExMjgsNyBAQAogCiBmdW5jdGlvbiBUU3RyZWFtVHJhbnNwb3J0SW1wbC5HZXRPdXRwdXRTdHJlYW06IElUaHJpZnRTdHJlYW07CiBiZWdpbgotICBSZXN1bHQgOj0gRklucHV0U3RyZWFtOworICBSZXN1bHQgOj0gRk91dHB1dFN0cmVhbTsKIGVuZDsKIAogcHJvY2VkdXJlIFRTdHJlYW1UcmFuc3BvcnRJbXBsLk9wZW47CkBAIC05MjIsMjMgKzExMzYsMjIgQEAKIAogZW5kOwogCi1mdW5jdGlvbiBUU3RyZWFtVHJhbnNwb3J0SW1wbC5SZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVFN0cmVhbVRyYW5zcG9ydEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCi0gIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwgJ0Nhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbScgKTsKKyAgaWYgRklucHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbScgKTsKICAgZW5kOwotICBSZXN1bHQgOj0gRklucHV0U3RyZWFtLlJlYWQoIGJ1Ziwgb2ZmLCBsZW4gKTsKKworICBSZXN1bHQgOj0gRklucHV0U3RyZWFtLlJlYWQoIHBCdWYsYnVmbGVuLCBvZmYsIGxlbiApOwogZW5kOwogCi1wcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuV3JpdGUoY29uc3QgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7CiBiZWdpbgotICBpZiBGT3V0cHV0U3RyZWFtID0gbmlsIHRoZW4KLSAgYmVnaW4KLSAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAnQ2Fubm90IHdyaXRlIHRvIG51bGwgb3V0cHV0c3RyZWFtJyApOworICBpZiBGT3V0cHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCB3cml0ZSB0byBudWxsIG91dHB1dHN0cmVhbScgKTsKICAgZW5kOwogCi0gIEZPdXRwdXRTdHJlYW0uV3JpdGUoIGJ1Ziwgb2ZmLCBsZW4gKTsKKyAgRk91dHB1dFN0cmVhbS5Xcml0ZSggcEJ1Ziwgb2ZmLCBsZW4gKTsKIGVuZDsKIAogeyBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsIH0KQEAgLTk0OSwxMyArMTE2Miw3IEBACiAgIENyZWF0ZSggQVRyYW5zcG9ydCwgMTAyNCApOwogZW5kOwogCi1wcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DbG9zZTsKLWJlZ2luCi0gIEZUcmFuc3BvcnQuQ2xvc2U7Ci1lbmQ7Ci0KLWNvbnN0cnVjdG9yIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0OiBJU3RyZWFtVHJhbnNwb3J0OwotICBBQnVmU2l6ZTogSW50ZWdlcik7Citjb25zdHJ1Y3RvciBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgQVRyYW5zcG9ydDogSVN0cmVhbVRyYW5zcG9ydDsgIEFCdWZTaXplOiBJbnRlZ2VyKTsKIGJlZ2luCiAgIGluaGVyaXRlZCBDcmVhdGU7CiAgIEZUcmFuc3BvcnQgOj0gQVRyYW5zcG9ydDsKQEAgLTk2MywxMCArMTE3MCwxNiBAQAogICBJbml0QnVmZmVyczsKIGVuZDsKIAorcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ2xvc2U7CitiZWdpbgorICBGVHJhbnNwb3J0LkNsb3NlOworICBGSW5wdXRCdWZmZXIgOj0gbmlsOworICBGT3V0cHV0QnVmZmVyIDo9IG5pbDsgIAorZW5kOworCiBwcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5GbHVzaDsKIGJlZ2luCi0gIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4KLSAgYmVnaW4KKyAgaWYgRk91dHB1dEJ1ZmZlciA8PiBuaWwgdGhlbiBiZWdpbgogICAgIEZPdXRwdXRCdWZmZXIuRmx1c2g7CiAgIGVuZDsKIGVuZDsKQEAgLTk4Myw1NCArMTE5Niw1MSBAQAogCiBwcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5Jbml0QnVmZmVyczsKIGJlZ2luCi0gIGlmIEZUcmFuc3BvcnQuSW5wdXRTdHJlYW0gPD4gbmlsIHRoZW4KLSAgYmVnaW4KKyAgaWYgRlRyYW5zcG9ydC5JbnB1dFN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgogICAgIEZJbnB1dEJ1ZmZlciA6PSBUQnVmZmVyZWRTdHJlYW1JbXBsLkNyZWF0ZSggRlRyYW5zcG9ydC5JbnB1dFN0cmVhbSwgRkJ1ZlNpemUgKTsKICAgZW5kOwotICBpZiBGVHJhbnNwb3J0Lk91dHB1dFN0cmVhbSA8PiBuaWwgdGhlbgotICBiZWdpbgorICBpZiBGVHJhbnNwb3J0Lk91dHB1dFN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgogICAgIEZPdXRwdXRCdWZmZXIgOj0gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQuT3V0cHV0U3RyZWFtLCBGQnVmU2l6ZSApOwogICBlbmQ7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLk9wZW47CiBiZWdpbgotICBGVHJhbnNwb3J0Lk9wZW4KKyAgRlRyYW5zcG9ydC5PcGVuOworICBJbml0QnVmZmVyczsgIC8vIHdlIG5lZWQgdG8gZ2V0IHRoZSBidWZmZXJzIHRvIG1hdGNoIEZUcmFuc3BvcnQgc3Vic3RyZWFtcyBhZ2FpbgogZW5kOwogCi1mdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLlJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmYsIGxlbjogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CiBiZWdpbgogICBSZXN1bHQgOj0gMDsKLSAgaWYgRklucHV0QnVmZmVyIDw+IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgUmVzdWx0IDo9IEZJbnB1dEJ1ZmZlci5SZWFkKCBidWYsIG9mZiwgbGVuICk7CisgIGlmIEZJbnB1dEJ1ZmZlciA8PiBuaWwgdGhlbiBiZWdpbgorICAgIFJlc3VsdCA6PSBGSW5wdXRCdWZmZXIuUmVhZCggcEJ1ZixidWZsZW4sIG9mZiwgbGVuICk7CiAgIGVuZDsKIGVuZDsKIAotcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuV3JpdGUoY29uc3QgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsKIGJlZ2luCi0gIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4KLSAgYmVnaW4KLSAgICBGT3V0cHV0QnVmZmVyLldyaXRlKCBidWYsIG9mZiwgbGVuICk7CisgIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBGT3V0cHV0QnVmZmVyLldyaXRlKCBwQnVmLCBvZmYsIGxlbiApOwogICBlbmQ7CiBlbmQ7CiAKIHsgVEZyYW1lZFRyYW5zcG9ydEltcGwgfQogCi17JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9Cit7JElGREVGIEhBVkVfQ0xBU1NfQ1RPUn0KK2NsYXNzIGNvbnN0cnVjdG9yIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIFNldExlbmd0aCggRkhlYWRlcl9EdW1teSwgRkhlYWRlclNpemUpOworICBGaWxsQ2hhciggRkhlYWRlcl9EdW1teVswXSwgTGVuZ3RoKCBGSGVhZGVyX0R1bW15KSAqIFNpemVPZiggQnl0ZSApLCAwKTsKK2VuZDsKK3skRUxTRX0KIHByb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbF9Jbml0aWFsaXplOwogYmVnaW4KICAgU2V0TGVuZ3RoKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15LCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyU2l6ZSk7CiAgIEZpbGxDaGFyKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15WzBdLAogICAgIExlbmd0aCggVEZyYW1lZFRyYW5zcG9ydEltcGwuRkhlYWRlcl9EdW1teSkgKiBTaXplT2YoIEJ5dGUgKSwgMCk7CiBlbmQ7Ci17JEVMU0V9Ci1jbGFzcyBjb25zdHJ1Y3RvciBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGU7Ci1iZWdpbgotICBTZXRMZW5ndGgoIEZIZWFkZXJfRHVtbXksIEZIZWFkZXJTaXplKTsKLSAgRmlsbENoYXIoIEZIZWFkZXJfRHVtbXlbMF0sIExlbmd0aCggRkhlYWRlcl9EdW1teSkgKiBTaXplT2YoIEJ5dGUgKSwgMCk7Ci1lbmQ7Ci17JElGRU5EfQoreyRFTkRJRn0KIAogY29uc3RydWN0b3IgVEZyYW1lZFRyYW5zcG9ydEltcGwuQ3JlYXRlOwogYmVnaW4KQEAgLTEwNjYsMTUgKzEyNzYsMTMgQEAKIGJlZ2luCiAgIGxlbiA6PSBGV3JpdGVCdWZmZXIuU2l6ZTsKICAgU2V0TGVuZ3RoKCBidWYsIGxlbik7Ci0gIGlmIGxlbiA+IDAgdGhlbgotICBiZWdpbgorICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KICAgICBTeXN0ZW0uTW92ZSggRldyaXRlQnVmZmVyLk1lbW9yeV4sIGJ1ZlswXSwgbGVuICk7CiAgIGVuZDsKIAogICBkYXRhX2xlbiA6PSBsZW4gLSBGSGVhZGVyU2l6ZTsKLSAgaWYgKGRhdGFfbGVuIDwgMCkgdGhlbgotICBiZWdpbgotICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoICdURnJhbWVkVHJhbnNwb3J0LkZsdXNoOiBkYXRhX2xlbiA8IDAnICk7CisgIGlmIChkYXRhX2xlbiA8IDApIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ1RGcmFtZWRUcmFuc3BvcnQuRmx1c2g6IGRhdGFfbGVuIDwgMCcgKTsKICAgZW5kOwogCiAgIEluaXRXcml0ZUJ1ZmZlcjsKQEAgLTExMTAsMjUgKzEzMTgsMjUgQEAKICAgRlRyYW5zcG9ydC5PcGVuOwogZW5kOwogCi1mdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5SZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOiBJbnRlZ2VyOwotdmFyCi0gIGdvdCA6IEludGVnZXI7CitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCi0gIGlmIEZSZWFkQnVmZmVyIDw+IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgaWYgbGVuID4gMAotICAgIHRoZW4gZ290IDo9IEZSZWFkQnVmZmVyLlJlYWQoIFBvaW50ZXIoQGJ1ZltvZmZdKV4sIGxlbiApCi0gICAgZWxzZSBnb3QgOj0gMDsKLSAgICBpZiBnb3QgPiAwIHRoZW4KLSAgICBiZWdpbgotICAgICAgUmVzdWx0IDo9IGdvdDsKKyAgaWYgbGVuID4gKGJ1Zmxlbi1vZmYpCisgIHRoZW4gbGVuIDo9IGJ1Zmxlbi1vZmY7CisKKyAgcFRtcCA6PSBwQnVmOworICBJbmMoIHBUbXAsIG9mZik7CisKKyAgaWYgKEZSZWFkQnVmZmVyIDw+IG5pbCkgYW5kIChsZW4gPiAwKSB0aGVuIGJlZ2luCisgICAgcmVzdWx0IDo9IEZSZWFkQnVmZmVyLlJlYWQoIHBUbXBeLCBsZW4pOworICAgIGlmIHJlc3VsdCA+IDAgdGhlbiBiZWdpbgogICAgICAgRXhpdDsKICAgICBlbmQ7CiAgIGVuZDsKIAogICBSZWFkRnJhbWU7CiAgIGlmIGxlbiA+IDAKLSAgdGhlbiBSZXN1bHQgOj0gRlJlYWRCdWZmZXIuUmVhZCggUG9pbnRlcihAYnVmW29mZl0pXiwgbGVuKQorICB0aGVuIFJlc3VsdCA6PSBGUmVhZEJ1ZmZlci5SZWFkKCBwVG1wXiwgbGVuKQogICBlbHNlIFJlc3VsdCA6PSAwOwogZW5kOwogCkBAIC0xMTQ5LDE0ICsxMzU3LDIwIEBACiAgIEZUcmFuc3BvcnQuUmVhZEFsbCggYnVmZiwgMCwgc2l6ZSApOwogICBGUmVhZEJ1ZmZlci5GcmVlOwogICBGUmVhZEJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKLSAgRlJlYWRCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQGJ1ZmZbMF0pXiwgc2l6ZSApOworICBpZiBMZW5ndGgoYnVmZikgPiAwCisgIHRoZW4gRlJlYWRCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQGJ1ZmZbMF0pXiwgc2l6ZSApOwogICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOwogZW5kOwogCi1wcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuV3JpdGUoY29uc3QgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7Cit2YXIgcFRtcCA6IFBCeXRlOwogYmVnaW4KLSAgaWYgbGVuID4gMAotICB0aGVuIEZXcml0ZUJ1ZmZlci5Xcml0ZSggUG9pbnRlcihAYnVmW29mZl0pXiwgbGVuICk7CisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICBJbmMoIHBUbXAsIG9mZik7CisKKyAgICBGV3JpdGVCdWZmZXIuV3JpdGUoIHBUbXBeLCBsZW4gKTsKKyAgZW5kOwogZW5kOwogCiB7IFRGcmFtZWRUcmFuc3BvcnQuVEZhY3RvcnkgfQpAQCAtMTE3MywxMiArMTM4NywyNSBAQAogICBGVGNwQ2xpZW50LkNsb3NlOwogZW5kOwogCit7JElGREVGIE9MRF9TT0NLRVRTfQogY29uc3RydWN0b3IgVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUQ3VzdG9tSXBDbGllbnQ7IGNvbnN0IGFUaW1lb3V0IDogSW50ZWdlcik7CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlOwogICBGVGNwQ2xpZW50IDo9IEFUY3BDbGllbnQ7CiAgIEZUaW1lb3V0IDo9IGFUaW1lb3V0OwogZW5kOworeyRFTFNFfQorY29uc3RydWN0b3IgVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUU29ja2V0OyBjb25zdCBhVGltZW91dCA6IExvbmd3b3JkKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUY3BDbGllbnQgOj0gQVRjcENsaWVudDsKKyAgaWYgYVRpbWVvdXQgPSAwIHRoZW4KKyAgICBGVGNwQ2xpZW50LlJlY3ZUaW1lb3V0IDo9IFNMRUVQX1RJTUUKKyAgZWxzZQorICAgIEZUY3BDbGllbnQuUmVjdlRpbWVvdXQgOj0gYVRpbWVvdXQ7CisgIEZUY3BDbGllbnQuU2VuZFRpbWVvdXQgOj0gYVRpbWVvdXQ7CitlbmQ7Cit7JEVORElGfQogCiBwcm9jZWR1cmUgVFRjcFNvY2tldFN0cmVhbUltcGwuRmx1c2g7CiBiZWdpbgpAQCAtMTE4Nyw3ICsxNDE0LDExIEBACiAKIGZ1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLklzT3BlbjogQm9vbGVhbjsKIGJlZ2luCit7JElGREVGIE9MRF9TT0NLRVRTfQogICBSZXN1bHQgOj0gRlRjcENsaWVudC5BY3RpdmU7Cit7JEVMU0V9CisgIFJlc3VsdCA6PSBGVGNwQ2xpZW50LklzT3BlbjsKK3skRU5ESUZ9CiBlbmQ7CiAKIHByb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5PcGVuOwpAQCAtMTE5Niw2ICsxNDI3LDcgQEAKIGVuZDsKIAogCit7JElGREVGIE9MRF9TT0NLRVRTfQogZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuU2VsZWN0KCBSZWFkUmVhZHksIFdyaXRlUmVhZHksIEV4Y2VwdEZsYWc6IFBCb29sZWFuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lT3V0OiBJbnRlZ2VyOyB2YXIgd3NhRXJyb3IgOiBJbnRlZ2VyKTogSW50ZWdlcjsKIHZhcgpAQCAtMTIxNiw1MCArMTQ0OCw1NSBAQAogCiAgIHNvY2tldCA6PSBGVGNwQ2xpZW50LkhhbmRsZTsKIAotICBpZiBBc3NpZ25lZChSZWFkUmVhZHkpIHRoZW4KLSAgYmVnaW4KKyAgaWYgQXNzaWduZWQoUmVhZFJlYWR5KSB0aGVuIGJlZ2luCiAgICAgUmVhZEZkc3B0ciA6PSBAUmVhZEZkczsKICAgICBGRF9aRVJPKFJlYWRGZHMpOwogICAgIEZEX1NFVChzb2NrZXQsIFJlYWRGZHMpOwogICBlbmQKLSAgZWxzZQorICBlbHNlIGJlZ2luCiAgICAgUmVhZEZkc3B0ciA6PSBuaWw7CisgIGVuZDsKIAotICBpZiBBc3NpZ25lZChXcml0ZVJlYWR5KSB0aGVuCi0gIGJlZ2luCisgIGlmIEFzc2lnbmVkKFdyaXRlUmVhZHkpIHRoZW4gYmVnaW4KICAgICBXcml0ZUZkc3B0ciA6PSBAV3JpdGVGZHM7CiAgICAgRkRfWkVSTyhXcml0ZUZkcyk7CiAgICAgRkRfU0VUKHNvY2tldCwgV3JpdGVGZHMpOwogICBlbmQKLSAgZWxzZQorICBlbHNlIGJlZ2luCiAgICAgV3JpdGVGZHNwdHIgOj0gbmlsOworICBlbmQ7CiAKLSAgaWYgQXNzaWduZWQoRXhjZXB0RmxhZykgdGhlbgotICBiZWdpbgorICBpZiBBc3NpZ25lZChFeGNlcHRGbGFnKSB0aGVuIGJlZ2luCiAgICAgRXhjZXB0RmRzcHRyIDo9IEBFeGNlcHRGZHM7CiAgICAgRkRfWkVSTyhFeGNlcHRGZHMpOwogICAgIEZEX1NFVChzb2NrZXQsIEV4Y2VwdEZkcyk7CiAgIGVuZAotICBlbHNlCisgIGVsc2UgYmVnaW4KICAgICBFeGNlcHRGZHNwdHIgOj0gbmlsOworICBlbmQ7CiAKLSAgaWYgVGltZU91dCA+PSAwIHRoZW4KLSAgYmVnaW4KKyAgaWYgVGltZU91dCA+PSAwIHRoZW4gYmVnaW4KICAgICB0di50dl9zZWMgOj0gVGltZU91dCBkaXYgMTAwMDsKICAgICB0di50dl91c2VjIDo9ICAxMDAwICogKFRpbWVPdXQgbW9kIDEwMDApOwogICAgIFRpbWVwdHIgOj0gQHR2OwogICBlbmQKLSAgZWxzZQorICBlbHNlIGJlZ2luCiAgICAgVGltZXB0ciA6PSBuaWw7ICAvLyB3YWl0IGZvcmV2ZXIKKyAgZW5kOwogCiAgIHdzYUVycm9yIDo9IDA7CiAgIHRyeQoteyRJRkRFRiBNU1dJTkRPV1N9Ci0gICAgcmVzdWx0IDo9IFdpblNvY2suc2VsZWN0KHNvY2tldCArIDEsIFJlYWRGZHNwdHIsIFdyaXRlRmRzcHRyLCBFeGNlcHRGZHNwdHIsIFRpbWVwdHIpOwoteyRFTkRJRn0KLXskSUZERUYgTElOVVh9Ci0gICAgcmVzdWx0IDo9IExpYmMuc2VsZWN0KHNvY2tldCArIDEsIFJlYWRGZHNwdHIsIFdyaXRlRmRzcHRyLCBFeGNlcHRGZHNwdHIsIFRpbWVwdHIpOwoteyRFTkRJRn0KKyAgICB7JElGREVGIE1TV0lORE9XU30KKyAgICAgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgICByZXN1bHQgOj0gV2luU29jay5zZWxlY3QoICAgICAgICBzb2NrZXQgKyAxLCBSZWFkRmRzcHRyLCBXcml0ZUZkc3B0ciwgRXhjZXB0RmRzcHRyLCBUaW1lcHRyKTsKKyAgICAgIHskRUxTRX0KKyAgICAgIHJlc3VsdCA6PSBXaW5hcGkuV2luU29jay5zZWxlY3QoIHNvY2tldCArIDEsIFJlYWRGZHNwdHIsIFdyaXRlRmRzcHRyLCBFeGNlcHRGZHNwdHIsIFRpbWVwdHIpOworICAgICAgeyRFTkRJRn0KKyAgICB7JEVORElGfQorICAgIHskSUZERUYgTElOVVh9CisgICAgICByZXN1bHQgOj0gTGliYy5zZWxlY3QoICAgICAgICAgICBzb2NrZXQgKyAxLCBSZWFkRmRzcHRyLCBXcml0ZUZkc3B0ciwgRXhjZXB0RmRzcHRyLCBUaW1lcHRyKTsKKyAgICB7JEVORElGfQorCQogICAgIGlmIHJlc3VsdCA9IFNPQ0tFVF9FUlJPUgogICAgIHRoZW4gd3NhRXJyb3IgOj0gV1NBR2V0TGFzdEVycm9yOwogCkBAIC0xMjY4LDE4ICsxNTA1LDI0IEBACiAgIGVuZDsKIAogICBpZiBBc3NpZ25lZChSZWFkUmVhZHkpIHRoZW4KLSAgICBSZWFkUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgUmVhZEZkcyk7CisgICBSZWFkUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgUmVhZEZkcyk7CisgICAKICAgaWYgQXNzaWduZWQoV3JpdGVSZWFkeSkgdGhlbgogICAgIFdyaXRlUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgV3JpdGVGZHMpOworICAKICAgaWYgQXNzaWduZWQoRXhjZXB0RmxhZykgdGhlbgogICAgIEV4Y2VwdEZsYWdeIDo9IEZEX0lTU0VUKHNvY2tldCwgRXhjZXB0RmRzKTsKIGVuZDsKK3skRU5ESUZ9CiAKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiBmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5XYWl0Rm9yRGF0YSggVGltZU91dCA6IEludGVnZXI7IHBCdWYgOiBQb2ludGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2lyZWRCeXRlcyA6IEludGVnZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdzYUVycm9yLCBieXRlc1JlYWR5IDogSW50ZWdlcik6IFRXYWl0Rm9yRGF0YTsKIHZhciBiQ2FuUmVhZCwgYkVycm9yIDogQm9vbGVhbjsKICAgICByZXR2YWwgOiBJbnRlZ2VyOworY29uc3QgCisgIE1TR19QRUVLID0geyRJRkRFRiBPTERfVU5JVF9OQU1FU30gV2luU29jay5NU0dfUEVFSyAgeyRFTFNFfSBXaW5hcGkuV2luU29jay5NU0dfUEVFSyAgeyRFTkRJRn07CiBiZWdpbgogICBieXRlc1JlYWR5IDo9IDA7CiAKQEAgLTEyOTUsNyArMTUzOCw4IEBACiAKICAgLy8gcmVjdigpIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiAgIC8vIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSAwIHdoZW4gdGhlIHBlZXIgaGFzIHBlcmZvcm1lZCBhbiBvcmRlcmx5IHNodXRkb3duLgotICByZXR2YWwgOj0gcmVjdiggRlRjcENsaWVudC5IYW5kbGUsIHBCdWZeLCBEZXNpcmVkQnl0ZXMsIFdpblNvY2suTVNHX1BFRUspOworICAKKyAgcmV0dmFsIDo9IHJlY3YoIEZUY3BDbGllbnQuSGFuZGxlLCBwQnVmXiwgRGVzaXJlZEJ5dGVzLCBNU0dfUEVFSyk7CiAgIGlmIHJldHZhbCA8PSAwCiAgIHRoZW4gRXhpdCggVFdhaXRGb3JEYXRhLndmZF9FcnJvcik7CiAKQEAgLTEzMDMsNzIgKzE1NDcsODYgQEAKICAgYnl0ZXNSZWFkeSA6PSBNaW4oIHJldHZhbCwgRGVzaXJlZEJ5dGVzKTsKICAgcmVzdWx0IDo9IFRXYWl0Rm9yRGF0YS53ZmRfSGF2ZURhdGE7CiBlbmQ7Cit7JEVORElGfQogCi1mdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5SZWFkKHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit7JElGREVGIE9MRF9TT0NLRVRTfQorZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworLy8gb2xkIHNvY2tldHMgdmVyc2lvbgogdmFyIHdmZCA6IFRXYWl0Rm9yRGF0YTsKLSAgICB3c2FFcnJvciwgbkJ5dGVzIDogSW50ZWdlcjsKLSAgICBwRGVzdCA6IFBCeXRlOwotY29uc3QKLSAgU0xFRVBfVElNRSA9IDIwMDsKKyAgICB3c2FFcnJvciwKKyAgICBtc2VjcyA6IEludGVnZXI7CisgICAgbkJ5dGVzIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAKKyAgaWYgRlRpbWVvdXQgPiAwCisgIHRoZW4gbXNlY3MgOj0gRlRpbWVvdXQKKyAgZWxzZSBtc2VjcyA6PSBERUZBVUxUX1RIUklGVF9USU1FT1VUOworCiAgIHJlc3VsdCA6PSAwOwotICBwRGVzdCA6PSBQb2ludGVyKEBidWZmZXJbb2Zmc2V0XSk7CisgIHBUbXAgICA6PSBwQnVmOworICBJbmMoIHBUbXAsIG9mZnNldCk7CiAgIHdoaWxlIGNvdW50ID4gMCBkbyBiZWdpbgogCiAgICAgd2hpbGUgVFJVRSBkbyBiZWdpbgotICAgICAgaWYgRlRpbWVvdXQgPiAwCi0gICAgICB0aGVuIHdmZCA6PSBXYWl0Rm9yRGF0YSggRlRpbWVvdXQsICAgcERlc3QsIGNvdW50LCB3c2FFcnJvciwgbkJ5dGVzKQotICAgICAgZWxzZSB3ZmQgOj0gV2FpdEZvckRhdGEoIFNMRUVQX1RJTUUsIHBEZXN0LCBjb3VudCwgd3NhRXJyb3IsIG5CeXRlcyk7Ci0KKyAgICAgIHdmZCA6PSBXYWl0Rm9yRGF0YSggbXNlY3MsIHBUbXAsIGNvdW50LCB3c2FFcnJvciwgbkJ5dGVzKTsKICAgICAgIGNhc2Ugd2ZkIG9mCi0gICAgICAgIFRXYWl0Rm9yRGF0YS53ZmRfRXJyb3IgICAgOiAgRXhpdCgwKTsKKyAgICAgICAgVFdhaXRGb3JEYXRhLndmZF9FcnJvciAgICA6ICBFeGl0OwogICAgICAgICBUV2FpdEZvckRhdGEud2ZkX0hhdmVEYXRhIDogIEJyZWFrOwogICAgICAgICBUV2FpdEZvckRhdGEud2ZkX1RpbWVvdXQgIDogIGJlZ2luCi0gICAgICAgICAgaWYgKEZUaW1lb3V0ID4gMCkKLSAgICAgICAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLlRpbWVkT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c0Vycm9yTWVzc2FnZShDYXJkaW5hbCh3c2FFcnJvcikpKTsKKyAgICAgICAgICBpZiAoRlRpbWVvdXQgPSAwKQorICAgICAgICAgIHRoZW4gRXhpdAorICAgICAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKENhcmRpbmFsKHdzYUVycm9yKSkpOworCisgICAgICAgICAgZW5kOwogICAgICAgICBlbmQ7CiAgICAgICBlbHNlCiAgICAgICAgIEFTU0VSVCggRkFMU0UpOwogICAgICAgZW5kOwogICAgIGVuZDsKIAorICAgIC8vIHJlZHVjZSB0aGUgdGltZW91dCBvbmNlIHdlIGdvdCBkYXRhCisgICAgaWYgRlRpbWVvdXQgPiAwCisgICAgdGhlbiBtc2VjcyA6PSBGVGltZW91dCBkaXYgMTAKKyAgICBlbHNlIG1zZWNzIDo9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQgZGl2IDEwOworICAgIG1zZWNzIDo9IE1heCggbXNlY3MsIDIwMCk7CisKICAgICBBU1NFUlQoIG5CeXRlcyA8PSBjb3VudCk7Ci0gICAgbkJ5dGVzIDo9IEZUY3BDbGllbnQuUmVjZWl2ZUJ1ZiggcERlc3ReLCBuQnl0ZXMpOwotICAgIEluYyggcERlc3QsIG5CeXRlcyk7CisgICAgbkJ5dGVzIDo9IEZUY3BDbGllbnQuUmVjZWl2ZUJ1ZiggcFRtcF4sIG5CeXRlcyk7CisgICAgSW5jKCBwVG1wLCBuQnl0ZXMpOwogICAgIERlYyggY291bnQsIG5CeXRlcyk7CiAgICAgSW5jKCByZXN1bHQsIG5CeXRlcyk7CiAgIGVuZDsKIGVuZDsKIAogZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuVG9BcnJheTogVEJ5dGVzOwotdmFyCi0gIGxlbiA6IEludGVnZXI7CisvLyBvbGQgc29ja2V0cyB2ZXJzaW9uCit2YXIgbGVuIDogSW50ZWdlcjsKIGJlZ2luCiAgIGxlbiA6PSAwOwotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgogICAgIGxlbiA6PSBGVGNwQ2xpZW50LkJ5dGVzUmVjZWl2ZWQ7CiAgIGVuZDsKIAogICBTZXRMZW5ndGgoIFJlc3VsdCwgbGVuICk7CiAKLSAgaWYgbGVuID4gMCB0aGVuCi0gIGJlZ2luCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgogICAgIEZUY3BDbGllbnQuUmVjZWl2ZUJ1ZiggUG9pbnRlcihAUmVzdWx0WzBdKV4sIGxlbik7CiAgIGVuZDsKIGVuZDsKIAotcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLldyaXRlKGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOworLy8gb2xkIHNvY2tldHMgdmVyc2lvbgogdmFyIGJDYW5Xcml0ZSwgYkVycm9yIDogQm9vbGVhbjsKICAgICByZXR2YWwsIHdzYUVycm9yIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAKICAgaWYgbm90IEZUY3BDbGllbnQuQWN0aXZlCi0gIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdub3Qgb3BlbicpOwogCiAgIC8vIFRoZSBzZWxlY3QgZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHNvY2tldCBoYW5kbGVzIHRoYXQgYXJlIHJlYWR5CiAgIC8vIGFuZCBjb250YWluZWQgaW4gdGhlIGZkX3NldCBzdHJ1Y3R1cmVzLCB6ZXJvIGlmIHRoZSB0aW1lIGxpbWl0IGV4cGlyZWQsCkBAIC0xMzc2LDE2ICsxNjM0LDc2IEBACiAgIC8vIFdTQUdldExhc3RFcnJvciBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIHNwZWNpZmljIGVycm9yIGNvZGUuCiAgIHJldHZhbCA6PSBTZWxmLlNlbGVjdCggbmlsLCBAYkNhbldyaXRlLCBAYkVycm9yLCBGVGltZU91dCwgd3NhRXJyb3IpOwogICBpZiByZXR2YWwgPSBTT0NLRVRfRVJST1IKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Vbmtub3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXNFcnJvck1lc3NhZ2UoQ2FyZGluYWwod3NhRXJyb3IpKSk7Ci0gIGlmIChyZXR2YWwgPSAwKQotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLlRpbWVkT3V0KTsKLSAgaWYgYkVycm9yIG9yIG5vdCBiQ2FuV3JpdGUKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Vbmtub3duKTsKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKENhcmRpbmFsKHdzYUVycm9yKSkpOwogCi0gIEZUY3BDbGllbnQuU2VuZEJ1ZiggUG9pbnRlcihAYnVmZmVyW29mZnNldF0pXiwgY291bnQpOworICBpZiAocmV0dmFsID0gMCkKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCd0aW1lZCBvdXQnKTsKKworICBpZiBiRXJyb3Igb3Igbm90IGJDYW5Xcml0ZQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgndW5rbm93biBlcnJvcicpOworCisgIHBUbXAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICBGVGNwQ2xpZW50LlNlbmRCdWYoIHBUbXBeLCBjb3VudCk7CiBlbmQ7CiAKK3skRUxTRX0KKworZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworLy8gbmV3IHNvY2tldHMgdmVyc2lvbgordmFyIG5CeXRlcyA6IEludGVnZXI7CisgICAgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIHJlc3VsdCA6PSAwOworICBwVG1wICAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICB3aGlsZSBjb3VudCA+IDAgZG8gYmVnaW4KKyAgICBuQnl0ZXMgOj0gRlRjcENsaWVudC5SZWFkKCBwVG1wXiwgY291bnQpOworICAgIGlmIG5CeXRlcyA9IDAgdGhlbiBFeGl0OworICAgIEluYyggcFRtcCwgbkJ5dGVzKTsKKyAgICBEZWMoIGNvdW50LCBuQnl0ZXMpOworICAgIEluYyggcmVzdWx0LCBuQnl0ZXMpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlRvQXJyYXk6IFRCeXRlczsKKy8vIG5ldyBzb2NrZXRzIHZlcnNpb24KK3ZhciBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IDA7CisgIHRyeQorICAgIGlmIEZUY3BDbGllbnQuUGVlayB0aGVuCisgICAgICByZXBlYXQKKyAgICAgICAgU2V0TGVuZ3RoKFJlc3VsdCwgTGVuZ3RoKFJlc3VsdCkgKyAxMDI0KTsKKyAgICAgICAgbGVuIDo9IEZUY3BDbGllbnQuUmVhZChSZXN1bHRbTGVuZ3RoKFJlc3VsdCkgLSAxMDI0XSwgMTAyNCk7CisgICAgICB1bnRpbCBsZW4gPCAxMDI0OworICBleGNlcHQKKyAgICBvbiBUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIGJlZ2luIHsgZG9uJ3QgYWxsb3cgZGVmYXVsdCBleGNlcHRpb25zIH0gZW5kOworICAgIGVsc2UgcmFpc2U7CisgIGVuZDsKKyAgaWYgbGVuID4gMCB0aGVuCisgICAgU2V0TGVuZ3RoKFJlc3VsdCwgTGVuZ3RoKFJlc3VsdCkgLSAxMDI0ICsgbGVuKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7CisvLyBuZXcgc29ja2V0cyB2ZXJzaW9uCit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIG5vdCBGVGNwQ2xpZW50LklzT3BlbgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnbm90IG9wZW4nKTsKKworICBwVG1wIDo9IHBCdWY7CisgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgRlRjcENsaWVudC5Xcml0ZSggcFRtcF4sIGNvdW50KTsKK2VuZDsKKworeyRFTkRJRn0KKworCiB7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9CiBpbml0aWFsaXphdGlvbgogYmVnaW4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5VdGlscy5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVXRpbHMucGFzCmluZGV4IDE1ZWEzNmYuLjdlNTc4NjMgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5VdGlscy5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlV0aWxzLnBhcwpAQCAtMjEsOCArMjEsMTQgQEAKIAogaW50ZXJmYWNlCiAKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CisKIHVzZXMKLSAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsIFN5bmNPYmpzOworICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywgQ2hhcmFjdGVyLCBTeW5jT2JqczsKKyAgeyRFTFNFfQorICBTeXN0ZW0uQ2xhc3NlcywgV2luYXBpLldpbmRvd3MsIFN5c3RlbS5TeXNVdGlscywgU3lzdGVtLkNoYXJhY3RlciwgU3lzdGVtLlN5bmNPYmpzOworICB7JEVORElGfQogCiB0eXBlCiAgIElPdmVybGFwcGVkSGVscGVyID0gaW50ZXJmYWNlCkBAIC01Niw2ICs2MiwxOCBAQAogICBlbmQ7CiAKIAorICBDaGFyVXRpbHMgPSBjbGFzcyBzZWFsZWQKKyAgcHVibGljCisgICAgY2xhc3MgZnVuY3Rpb24gSXNIaWdoU3Vycm9nYXRlKCBjb25zdCBjIDogQ2hhcikgOiBCb29sZWFuOyBzdGF0aWM7IGlubGluZTsKKyAgICBjbGFzcyBmdW5jdGlvbiBJc0xvd1N1cnJvZ2F0ZSggY29uc3QgYyA6IENoYXIpIDogQm9vbGVhbjsgc3RhdGljOyBpbmxpbmU7CisgIGVuZDsKKworCit7JElGREVGIFdpbjY0fQorZnVuY3Rpb24gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCB2YXIgQWRkZW5kIDogSW50NjQ7IFZhbHVlIDogSW50NjQpIDogSW50NjQ7ICAKK3skRU5ESUZ9CisKKwogaW1wbGVtZW50YXRpb24KIAogeyBUT3ZlcmxhcHBlZEhlbHBlckltcGwgfQpAQCAtMTg2LDQgKzIwNCw1NiBAQAogZW5kOwogCiAKK2NsYXNzIGZ1bmN0aW9uIENoYXJVdGlscy5Jc0hpZ2hTdXJyb2dhdGUoIGNvbnN0IGMgOiBDaGFyKSA6IEJvb2xlYW47CitiZWdpbgorICB7JElGIENvbXBpbGVyVmVyc2lvbiA8IDI1LjB9CisgICAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICByZXN1bHQgOj0gQ2hhcmFjdGVyLklzSGlnaFN1cnJvZ2F0ZShjKTsKKyAgICB7JEVMU0V9CisgICAgcmVzdWx0IDo9IFN5c3RlbS5DaGFyYWN0ZXIuSXNIaWdoU3Vycm9nYXRlKGMpOworICAgIHskRU5ESUZ9CisgIHskRUxTRX0KKyAgcmVzdWx0IDo9IGMuSXNIaWdoU3Vycm9nYXRlKCk7CisgIHskSUZFTkR9CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gQ2hhclV0aWxzLklzTG93U3Vycm9nYXRlKCBjb25zdCBjIDogQ2hhcikgOiBCb29sZWFuOworYmVnaW4KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPCAyNS4wfQorICAgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgcmVzdWx0IDo9IENoYXJhY3Rlci5Jc0xvd1N1cnJvZ2F0ZShjKTsKKyAgICB7JEVMU0V9CisgICAgcmVzdWx0IDo9IFN5c3RlbS5DaGFyYWN0ZXIuSXNMb3dTdXJyb2dhdGUoYyk7CisgICAgeyRFTkRJRn0KKyAgeyRFTFNFfQorICByZXN1bHQgOj0gYy5Jc0xvd1N1cnJvZ2F0ZSgpOworICB7JElGRU5EfQorZW5kOworCisKK3skSUZERUYgV2luNjR9CisKK2Z1bmN0aW9uIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoIHZhciBUYXJnZXQgOiBJbnQ2NDsgRXhjaGFuZ2UsIENvbXBhcmFuZCA6IEludDY0KSA6IEludDY0OyAgaW5saW5lOworYmVnaW4KKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgcmVzdWx0IDo9IFdpbmRvd3MuSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggVGFyZ2V0LCBFeGNoYW5nZSwgQ29tcGFyYW5kKTsKKyAgeyRFTFNFfQorICByZXN1bHQgOj0gV2luQXBpLldpbmRvd3MuSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggVGFyZ2V0LCBFeGNoYW5nZSwgQ29tcGFyYW5kKTsKKyAgeyRFTkRJRn0KK2VuZDsKKworCitmdW5jdGlvbiBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIHZhciBBZGRlbmQgOiBJbnQ2NDsgVmFsdWUgOiBJbnQ2NCkgOiBJbnQ2NDsKK3ZhciBvbGQgOiBJbnQ2NDsKK2JlZ2luCisgIHJlcGVhdAorICAgIE9sZCA6PSBBZGRlbmQ7CisgIHVudGlsIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KCBBZGRlbmQsIE9sZCArIFZhbHVlLCBPbGQpID0gT2xkKTsKKyAgcmVzdWx0IDo9IE9sZDsKK2VuZDsKKworeyRFTkRJRn0KKworCiBlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LnBhcwppbmRleCAwOTZkNmExLi4yZWU4MzQ0IDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5wYXMKQEAgLTIyLDEzICsyMiwxOSBAQAogaW50ZXJmYWNlCiAKIHVzZXMKLSAgU3lzVXRpbHMsIFRocmlmdC5Qcm90b2NvbDsKKyAgU3lzVXRpbHMsCisgIFRocmlmdC5FeGNlcHRpb24sCisgIFRocmlmdC5Qcm90b2NvbDsKIAogY29uc3QKLSAgVmVyc2lvbiA9ICcwLjkuMyc7CisgIFZlcnNpb24gPSAnMC4xMy4wJzsKIAogdHlwZQotICBUQXBwbGljYXRpb25FeGNlcHRpb24gPSBjbGFzcyggU3lzVXRpbHMuRXhjZXB0aW9uICkKKyAgVEV4Y2VwdGlvbiA9IFRocmlmdC5FeGNlcHRpb24uVEV4Y2VwdGlvbjsgLy8gY29tcGF0aWJpbGl0eSBhbGlhcworCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3MgPSBjbGFzcyBvZiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZDsKKworICBUQXBwbGljYXRpb25FeGNlcHRpb24gPSBjbGFzcyggVEV4Y2VwdGlvbikKICAgcHVibGljCiAgICAgdHlwZQogeyRTQ09QRURFTlVNUyBPTn0KQEAgLTQ3LDY3ICs1MywxMTEgQEAKICAgICAgICk7CiB7JFNDT1BFREVOVU1TIE9GRn0KICAgcHJpdmF0ZQotICAgIEZUeXBlIDogVEV4Y2VwdGlvblR5cGU7CisgICAgZnVuY3Rpb24gR2V0VHlwZTogVEV4Y2VwdGlvblR5cGU7CisgIHByb3RlY3RlZAorICAgIGNvbnN0cnVjdG9yIEhpZGRlbkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CiAgIHB1YmxpYwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZTsgY29uc3QgbXNnOiBzdHJpbmcpOyBvdmVybG9hZDsKKyAgICAvLyBwdXJwb3NlZnVsbHkgaGlkZSBpbmhlcml0ZWQgY29uc3RydWN0b3IKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGU7IGNvbnN0IG1zZzogc3RyaW5nKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworCisgICAgY2xhc3MgZnVuY3Rpb24gR2V0U3BlY2lhbGl6ZWRFeGNlcHRpb25UeXBlKEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7CiAKICAgICBjbGFzcyBmdW5jdGlvbiBSZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOwogICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCApOwogICBlbmQ7CiAKLSAgLy8gYmFzZSBjbGFzcyBmb3IgSURMLWdlbmVyYXRlZCBleGNlcHRpb25zCi0gIFRFeGNlcHRpb24gPSBjbGFzcyggU3lzVXRpbHMuRXhjZXB0aW9uKQorICAvLyBOZWVkZWQgdG8gcmVtb3ZlIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQgPSBjbGFzcyBhYnN0cmFjdCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQogICBwdWJsaWMKLSAgICBmdW5jdGlvbiBNZXNzYWdlIDogc3RyaW5nOyAgICAgICAgLy8gaGlkZSBpbmhlcml0ZWQgcHJvcGVydHk6IGFsbG93IHJlYWQsIGJ1dCBwcmV2ZW50IGFjY2lkZW50YWwgd3JpdGVzCi0gICAgcHJvY2VkdXJlIFVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsgIC8vIHVwZGF0ZSBpbmhlcml0ZWQgbWVzc2FnZSBwcm9wZXJ0eSB3aXRoIHRvU3RyaW5nKCkKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOwogICBlbmQ7CiAKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93biA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd25NZXRob2QgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkTWVzc2FnZVR5cGUgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25Xcm9uZ01ldGhvZE5hbWUgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25CYWRTZXF1ZW5jZUlEID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uTWlzc2luZ1Jlc3VsdCA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25Qcm90b2NvbEVycm9yID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFRyYW5zZm9ybSA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRQcm90b2NvbCA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVuc3VwcG9ydGVkQ2xpZW50VHlwZSA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisKKwogaW1wbGVtZW50YXRpb24KIAoteyBURXhjZXB0aW9uIH0KLQotZnVuY3Rpb24gVEV4Y2VwdGlvbi5NZXNzYWdlOwotLy8gYWxsb3cgcmVhZCAoZXhjZXB0aW9uIHN1bW1hcnkpLCBidXQgcHJldmVudCBhY2NpZGVudGFsIHdyaXRlcwotLy8gcmVhZCB3aWxsIHJldHVybiB0aGUgZXhjZXB0aW9uIHN1bW1hcnkKLWJlZ2luCi0gIHJlc3VsdCA6PSBTZWxmLlRvU3RyaW5nOwotZW5kOwotCi1wcm9jZWR1cmUgVEV4Y2VwdGlvbi5VcGRhdGVNZXNzYWdlUHJvcGVydHk7Ci0vLyBVcGRhdGUgdGhlIGluaGVyaXRlZCBNZXNzYWdlIHByb3BlcnR5IHRvIGJldHRlciBjb25mb3JtIHRvIHN0YW5kYXJkIGJlaGF2aW91ci4KLS8vIE5pY2UgYmVuZWZpdDogVGhlIElERSBpcyBub3cgYWJsZSB0byBzaG93IHRoZSBleGNlcHRpb24gbWVzc2FnZSBhZ2Fpbi4KLWJlZ2luCi0gIGluaGVyaXRlZCBNZXNzYWdlIDo9IFNlbGYuVG9TdHJpbmc7ICAvLyBwcm9kdWNlcyBhIHN1bW1hcnkgdGV4dAotZW5kOwotCiB7IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB9CiAKLWNvbnN0cnVjdG9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGU7CitmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uR2V0VHlwZTogVEV4Y2VwdGlvblR5cGU7CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKCAnJyApOworICBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd25NZXRob2QgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZAorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZE1lc3NhZ2VUeXBlIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludmFsaWRNZXNzYWdlVHlwZQorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uV3JvbmdNZXRob2ROYW1lIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLldyb25nTWV0aG9kTmFtZQorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uQmFkU2VxdWVuY2VJRCB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5CYWRTZXF1ZW5jZUlECisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25NaXNzaW5nUmVzdWx0IHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcgorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uUHJvdG9jb2xFcnJvciB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5Qcm90b2NvbEVycm9yCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkVHJhbnNmb3JtIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludmFsaWRUcmFuc2Zvcm0KKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRQcm90b2NvbCB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5JbnZhbGlkUHJvdG9jb2wKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVuc3VwcG9ydGVkQ2xpZW50VHlwZSB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5VbnN1cHBvcnRlZENsaWVudFR5cGUKKyAgZWxzZSBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKIGVuZDsKIAotY29uc3RydWN0b3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZShBVHlwZTogVEV4Y2VwdGlvblR5cGU7Ci0gIGNvbnN0IG1zZzogc3RyaW5nKTsKK2NvbnN0cnVjdG9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5IaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOwogYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZSggbXNnICk7Ci0gIEZUeXBlIDo9IEFUeXBlOworICBpbmhlcml0ZWQgQ3JlYXRlKE1zZyk7CiBlbmQ7CiAKLWNvbnN0cnVjdG9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlKTsKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUQXBwbGljYXRpb25FeGNlcHRpb247CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKCcnKTsKLSAgRlR5cGUgOj0gQVR5cGU7CisgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duLkNyZWF0ZShNc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlOiBUQXBwbGljYXRpb25FeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJycpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUQXBwbGljYXRpb25FeGNlcHRpb247CitiZWdpbgoreyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIE9GRn0KKyAgUmVzdWx0IDo9IENyZWF0ZShBVHlwZSwgJycpOworeyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIERFRkFVTFR9CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZTsgY29uc3QgbXNnOiBzdHJpbmcpOiBUQXBwbGljYXRpb25FeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gR2V0U3BlY2lhbGl6ZWRFeGNlcHRpb25UeXBlKEFUeXBlKS5DcmVhdGUobXNnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkdldFNwZWNpYWxpemVkRXhjZXB0aW9uVHlwZShBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZENsYXNzOworYmVnaW4KKyAgY2FzZSBBVHlwZSBvZgorICAgIFRFeGNlcHRpb25UeXBlLlVua25vd25NZXRob2Q6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd25NZXRob2Q7CisgICAgVEV4Y2VwdGlvblR5cGUuSW52YWxpZE1lc3NhZ2VUeXBlOiAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZE1lc3NhZ2VUeXBlOworICAgIFRFeGNlcHRpb25UeXBlLldyb25nTWV0aG9kTmFtZTogICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbldyb25nTWV0aG9kTmFtZTsKKyAgICBURXhjZXB0aW9uVHlwZS5CYWRTZXF1ZW5jZUlEOiAgICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25CYWRTZXF1ZW5jZUlEOworICAgIFRFeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQ6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1pc3NpbmdSZXN1bHQ7CisgICAgVEV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcjogICAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvcjsKKyAgICBURXhjZXB0aW9uVHlwZS5Qcm90b2NvbEVycm9yOiAgICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Qcm90b2NvbEVycm9yOworICAgIFRFeGNlcHRpb25UeXBlLkludmFsaWRUcmFuc2Zvcm06ICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRUcmFuc2Zvcm07CisgICAgVEV4Y2VwdGlvblR5cGUuSW52YWxpZFByb3RvY29sOiAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFByb3RvY29sOworICAgIFRFeGNlcHRpb25UeXBlLlVuc3VwcG9ydGVkQ2xpZW50VHlwZTogUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVuc3VwcG9ydGVkQ2xpZW50VHlwZTsKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duOworICBlbmQ7CiBlbmQ7CiAKIGNsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOwogdmFyCi0gIGZpZWxkIDogSUZpZWxkOworICBmaWVsZCA6IFRUaHJpZnRGaWVsZDsKICAgbXNnIDogc3RyaW5nOwogICB0eXAgOiBURXhjZXB0aW9uVHlwZTsKLSAgc3RydWMgOiBJU3RydWN0OworICBzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7CiBiZWdpbgogICBtc2cgOj0gJyc7CiAgIHR5cCA6PSBURXhjZXB0aW9uVHlwZS5Vbmtub3duOwpAQCAtMTQ3LDE3ICsxOTcsMTYgQEAKICAgICBpcHJvdC5SZWFkRmllbGRFbmQ7CiAgIGVuZDsKICAgaXByb3QuUmVhZFN0cnVjdEVuZDsKLSAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoIHR5cCwgbXNnICk7CisgIFJlc3VsdCA6PSBHZXRTcGVjaWFsaXplZEV4Y2VwdGlvblR5cGUodHlwKS5DcmVhdGUobXNnKTsKIGVuZDsKIAogcHJvY2VkdXJlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5Xcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7CiB2YXIKLSAgc3RydWMgOiBJU3RydWN0OwotICBmaWVsZCA6IElGaWVsZDsKLQorICBzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7CisgIGZpZWxkIDogVFRocmlmdEZpZWxkOwogYmVnaW4KLSAgc3RydWMgOj0gVFN0cnVjdEltcGwuQ3JlYXRlKCAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyApOwotICBmaWVsZCA6PSBURmllbGRJbXBsLkNyZWF0ZTsKKyAgSW5pdChzdHJ1YywgJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworICBJbml0KGZpZWxkKTsKIAogICBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKCBzdHJ1YyApOwogICBpZiBNZXNzYWdlIDw+ICcnIHRoZW4KQEAgLTE3NCwxMCArMjIzLDE3IEBACiAgIGZpZWxkLlR5cGVfIDo9IFRUeXBlLkkzMjsKICAgZmllbGQuSWQgOj0gMjsKICAgb3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsKLSAgb3Byb3QuV3JpdGVJMzIoSW50ZWdlcihGVHlwZSkpOworICBvcHJvdC5Xcml0ZUkzMihJbnRlZ2VyKEdldFR5cGUpKTsKICAgb3Byb3QuV3JpdGVGaWVsZEVuZCgpOwogICBvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOwogICBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOwogZW5kOwogCit7IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkIH0KKworY29uc3RydWN0b3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBIaWRkZW5DcmVhdGUoTXNnKTsKK2VuZDsKKwogZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L0NvbnNvbGVIZWxwZXIucGFzIGIvbGliL2RlbHBoaS90ZXN0L0NvbnNvbGVIZWxwZXIucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGRkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvQ29uc29sZUhlbHBlci5wYXMKQEAgLTAsMCArMSwxMzIgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBDb25zb2xlSGVscGVyOworCitpbnRlcmZhY2UKKwordXNlcyBDbGFzc2VzOworCit0eXBlCisgIFRUaHJpZnRDb25zb2xlID0gY2xhc3MKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBTOiBzdHJpbmcpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBXcml0ZUxpbmUoIGNvbnN0IFM6IHN0cmluZyk7IHZpcnR1YWw7CisgIGVuZDsKKworICBUR1VJQ29uc29sZSA9IGNsYXNzKCBUVGhyaWZ0Q29uc29sZSApCisgIHByaXZhdGUKKyAgICBGTGluZUJyZWFrIDogQm9vbGVhbjsKKyAgICBGTWVtbyA6IFRTdHJpbmdzOworCisgICAgcHJvY2VkdXJlIEludGVybmFsV3JpdGUoIGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGluZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBTWVtbzogVFN0cmluZ3MpOworICBlbmQ7CisKK2Z1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOworcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOworcHJvY2VkdXJlIFJlc3RvcmVDb25zb2xlVG9EZWZhdWx0OworCitpbXBsZW1lbnRhdGlvbgorCit2YXIKKyAgRkRlZmF1bHRDb25zb2xlIDogVFRocmlmdENvbnNvbGU7CisgIEZDb25zb2xlIDogVFRocmlmdENvbnNvbGU7CisKK2Z1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOworYmVnaW4KKyAgUmVzdWx0IDo9IEZDb25zb2xlOworZW5kOworCit7IFRUaHJpZnRDb25zb2xlIH0KKworcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlKGNvbnN0IFM6IHN0cmluZyk7CitiZWdpbgorICBTeXN0ZW0uV3JpdGUoIFMgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgU3lzdGVtLldyaXRlbG4oIFMgKTsKK2VuZDsKKworcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOworYmVnaW4KKyAgRkNvbnNvbGUgOj0gQUNvbnNvbGU7CitlbmQ7CisKK3Byb2NlZHVyZSBSZXN0b3JlQ29uc29sZVRvRGVmYXVsdDsKK2JlZ2luCisgIEZDb25zb2xlIDo9IEZEZWZhdWx0Q29uc29sZTsKK2VuZDsKKworeyBUR1VJQ29uc29sZSB9CisKK2NvbnN0cnVjdG9yIFRHVUlDb25zb2xlLkNyZWF0ZSggQU1lbW86IFRTdHJpbmdzKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZNZW1vIDo9IEFNZW1vOworICBGTGluZUJyZWFrIDo9IFRydWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUR1VJQ29uc29sZS5JbnRlcm5hbFdyaXRlKGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7Cit2YXIKKyAgaWR4IDogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZMaW5lQnJlYWsgdGhlbgorICBiZWdpbgorICAgIEZNZW1vLkFkZCggUyApOworICBlbmQgZWxzZQorICBiZWdpbgorICAgIGlkeCA6PSBGTWVtby5Db3VudCAtIDE7CisgICAgaWYgaWR4IDwgMCB0aGVuCisgICAgICBGTWVtby5BZGQoIFMgKQorICAgIGVsc2UKKyAgICAgIEZNZW1vW2lkeF0gOj0gRk1lbW9baWR4XSArIFM7CisgIGVuZDsKKyAgRkxpbmVCcmVhayA6PSBiV3JpdGVMaW5lOworZW5kOworCitwcm9jZWR1cmUgVEdVSUNvbnNvbGUuV3JpdGUoY29uc3QgUzogc3RyaW5nKTsKK2JlZ2luCisgIEludGVybmFsV3JpdGUoIFMsIEZhbHNlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRHVUlDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgSW50ZXJuYWxXcml0ZSggUywgVHJ1ZSk7CitlbmQ7CisKK2luaXRpYWxpemF0aW9uCitiZWdpbgorICBGRGVmYXVsdENvbnNvbGUgOj0gVFRocmlmdENvbnNvbGUuQ3JlYXRlOworICBGQ29uc29sZSA6PSBGRGVmYXVsdENvbnNvbGU7CitlbmQ7CisKK2ZpbmFsaXphdGlvbgorYmVnaW4KKyAgRkRlZmF1bHRDb25zb2xlLkZyZWU7CitlbmQ7CisKK2VuZC4KKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdENsaWVudC5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdENsaWVudC5wYXMKaW5kZXggNWYzNzVlZi4uMGZhNDNiMCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RDbGllbnQucGFzCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q2xpZW50LnBhcwpAQCAtMTksMTYgKzE5LDI1IEBACiAKIHVuaXQgVGVzdENsaWVudDsKIAoreyRJIC4uL3NyYy9UaHJpZnQuRGVmaW5lcy5pbmN9CisKIHsuJERFRklORSBTdHJlc3NUZXN0fSAgIC8vIGFjdGl2YXRlIHRvIHN0cmVzcy10ZXN0IHRoZSBzZXJ2ZXIgd2l0aCBmcmVxdWVudCBjb25uZWN0cy9kaXNjb25uZWN0cwotey4kREVGSU5FIFBlcmZUZXN0fSAgICAgLy8gYWN0aXZhdGUgdG8gYWN0aXZhdGUgdGhlIHBlcmZvcm1hbmNlIHRlc3QKK3suJERFRklORSBQZXJmVGVzdH0gICAgIC8vIGFjdGl2YXRlIHRoZSBwZXJmb3JtYW5jZSB0ZXN0Cit7JERFRklORSBFeGNlcHRpb25zfSAgICAvLyBhY3RpdmF0ZSB0aGUgZXhjZXB0aW9ucyB0ZXN0IChvciBkaXNhYmxlIHdoaWxlIGRlYnVnZ2luZykKKworeyRpZiBDb21waWxlclZlcnNpb24gPj0gMjh9Cit7JERFRklORSBTdXBwb3J0c0FzeW5jfQoreyRpZmVuZH0KIAogaW50ZXJmYWNlCiAKIHVzZXMKLSAgV2luZG93cywgU3lzVXRpbHMsIENsYXNzZXMsIE1hdGgsCisgIFdpbmRvd3MsIFN5c1V0aWxzLCBDbGFzc2VzLCBNYXRoLCBDb21PYmosIEFjdGl2ZVgsCisgIHskSUZERUYgU3VwcG9ydHNBc3luY30gU3lzdGVtLlRocmVhZGluZywgeyRFTkRJRn0KICAgRGF0ZVV0aWxzLAogICBHZW5lcmljcy5Db2xsZWN0aW9ucywKICAgVGVzdENvbnN0YW50cywKKyAgQ29uc29sZUhlbHBlciwKICAgVGhyaWZ0LAogICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCwKICAgVGhyaWZ0LlByb3RvY29sLkpTT04sCkBAIC0zNyw4ICs0Niw4IEBACiAgIFRocmlmdC5UcmFuc3BvcnQsCiAgIFRocmlmdC5TdHJlYW0sCiAgIFRocmlmdC5UZXN0LAotICBUaHJpZnQuQ29sbGVjdGlvbnMsCi0gIFRocmlmdC5Db25zb2xlOworICBUaHJpZnQuVXRpbHMsCisgIFRocmlmdC5Db2xsZWN0aW9uczsKIAogdHlwZQogICBUVGhyZWFkQ29uc29sZSA9IGNsYXNzCkBAIC01MCw2ICs1OSwxNyBAQAogICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQVRocmVhZDogVFRocmVhZCk7CiAgIGVuZDsKIAorICBUVGVzdFNldHVwID0gcmVjb3JkCisgICAgcHJvdFR5cGUgIDogVEtub3duUHJvdG9jb2w7CisgICAgZW5kcG9pbnQgIDogVEVuZHBvaW50VHJhbnNwb3J0OworICAgIGxheWVyZWQgICA6IFRMYXllcmVkVHJhbnNwb3J0czsKKyAgICB1c2VTU0wgICAgOiBCb29sZWFuOyAvLyBpbmNsdWRlIHdoZXJlIGFwcHJvcHJpYXRlIChUTGF5ZXJlZFRyYW5zcG9ydD8pCisgICAgaG9zdCAgICAgIDogc3RyaW5nOworICAgIHBvcnQgICAgICA6IEludGVnZXI7CisgICAgc1BpcGVOYW1lIDogc3RyaW5nOworICAgIGhBbm9uUmVhZCwgaEFub25Xcml0ZSA6IFRIYW5kbGU7CisgIGVuZDsKKwogICBUQ2xpZW50VGhyZWFkID0gY2xhc3MoIFRUaHJlYWQgKQogICBwcml2YXRlIHR5cGUKICAgICBUVGVzdEdyb3VwID0gKApAQCAtNjIsNyArODIsMTUgQEAKICAgICApOwogICAgIFRUZXN0R3JvdXBzID0gc2V0IG9mIFRUZXN0R3JvdXA7CiAKKyAgICBUVGVzdFNpemUgPSAoCisgICAgICBFbXB0eSwgICAgICAgICAgIC8vIEVkZ2UgY2FzZTogdGhlIHplcm8tbGVuZ3RoIGVtcHR5IGJpbmFyeQorICAgICAgTm9ybWFsLCAgICAgICAgICAvLyBGYWlybHkgc21hbGwgYXJyYXkgb2YgdXN1YWwgc2l6ZSAoMjU2IGJ5dGVzKQorICAgICAgQnl0ZUFycmF5VGVzdCwgICAvLyBUSFJJRlQtNDQ1NCBMYXJnZSB3cml0ZXMvcmVhZHMgbWF5IGNhdXNlIHJhbmdlIGNoZWNrIGVycm9ycyBpbiBkZWJ1ZyBtb2RlCisgICAgICBQaXBlV3JpdGVMaW1pdCAgIC8vIFRIUklGVC00MzcyIFBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuCisgICAgKTsKKwogICBwcml2YXRlCisgICAgRlNldHVwIDogVFRlc3RTZXR1cDsKICAgICBGVHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKICAgICBGUHJvdG9jb2wgOiBJUHJvdG9jb2w7CiAgICAgRk51bUl0ZXJhdGlvbiA6IEludGVnZXI7CkBAIC04MSwxNSArMTA5LDI1IEBACiAgICAgZnVuY3Rpb24gIENhbGN1bGF0ZUV4aXRDb2RlIDogQnl0ZTsKIAogICAgIHByb2NlZHVyZSBDbGllbnRUZXN0OworICAgIHskSUZERUYgU3VwcG9ydHNBc3luY30KKyAgICBwcm9jZWR1cmUgQ2xpZW50QXN5bmNUZXN0OworICAgIHskRU5ESUZ9CisKKyAgICBwcm9jZWR1cmUgSW5pdGlhbGl6ZVByb3RvY29sVHJhbnNwb3J0U3RhY2s7CisgICAgcHJvY2VkdXJlIFNodXRkb3duUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKKwogICAgIHByb2NlZHVyZSBKU09OUHJvdG9jb2xSZWFkV3JpdGVUZXN0OwotICAgIGZ1bmN0aW9uICBQcmVwYXJlQmluYXJ5RGF0YSggYVJhbmRvbURpc3QgOiBCb29sZWFuID0gRkFMU0UpIDogVEJ5dGVzOworICAgIGZ1bmN0aW9uICBQcmVwYXJlQmluYXJ5RGF0YSggYVJhbmRvbURpc3QgOiBCb29sZWFuOyBhU2l6ZSA6IFRUZXN0U2l6ZSkgOiBUQnl0ZXM7CiAgICAgeyRJRkRFRiBTdHJlc3NUZXN0fQogICAgIHByb2NlZHVyZSBTdHJlc3NUZXN0KGNvbnN0IGNsaWVudCA6IFRUaHJpZnRUZXN0LklmYWNlKTsKICAgICB7JEVORElGfQorICAgIHskSUZERUYgV2luNjR9CisgICAgcHJvY2VkdXJlIFVzZUludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NDsKKyAgICB7JEVORElGfQogICBwcm90ZWN0ZWQKICAgICBwcm9jZWR1cmUgRXhlY3V0ZTsgb3ZlcnJpZGU7CiAgIHB1YmxpYwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRyYW5zcG9ydDogSVRyYW5zcG9ydDsgY29uc3QgQVByb3RvY29sIDogSVByb3RvY29sOyBBTnVtSXRlcmF0aW9uOiBJbnRlZ2VyKTsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFTZXR1cCA6IFRUZXN0U2V0dXA7IGNvbnN0IGFOdW1JdGVyYXRpb246IEludGVnZXIpOwogICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CiAgIGVuZDsKIApAQCAtMTcwLDM4ICsyMDgsMjcgQEAKIGNsYXNzIGZ1bmN0aW9uIFRUZXN0Q2xpZW50LkV4ZWN1dGUoY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKSA6IEJ5dGU7CiB2YXIKICAgaSA6IEludGVnZXI7Ci0gIGhvc3QgOiBzdHJpbmc7Ci0gIHBvcnQgOiBJbnRlZ2VyOwotICBzUGlwZU5hbWUgOiBzdHJpbmc7Ci0gIGhBbm9uUmVhZCwgaEFub25Xcml0ZSA6IFRIYW5kbGU7CisgIHRocmVhZEV4aXRDb2RlIDogQnl0ZTsKICAgcyA6IHN0cmluZzsKICAgdGhyZWFkcyA6IGFycmF5IG9mIFRUaHJlYWQ7CiAgIGR0U3RhcnQgOiBURGF0ZVRpbWU7CiAgIHRlc3QgOiBJbnRlZ2VyOwogICB0aHJlYWQgOiBUVGhyZWFkOwotICB0cmFucyA6IElUcmFuc3BvcnQ7Ci0gIHByb3QgOiBJUHJvdG9jb2w7Ci0gIHN0cmVhbXRyYW5zIDogSVN0cmVhbVRyYW5zcG9ydDsKLSAgaHR0cCA6IElIVFRQQ2xpZW50OwotICBwcm90VHlwZSA6IFRLbm93blByb3RvY29sOwotICBlbmRwb2ludCA6IFRFbmRwb2ludFRyYW5zcG9ydDsKLSAgbGF5ZXJlZCA6IFRMYXllcmVkVHJhbnNwb3J0czsKLSAgVXNlU1NMIDogQm9vbGVhbjsgLy8gaW5jbHVkZSB3aGVyZSBhcHByb3ByaWF0ZSAoVExheWVyZWRUcmFuc3BvcnQ/KQotY29uc3QKLSAgLy8gcGlwZSB0aW1lb3V0cyB0byBiZSB1c2VkCi0gIERFQlVHX1RJTUVPVVQgICA9IDMwICogMTAwMDsKLSAgUkVMRUFTRV9USU1FT1VUID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKLSAgVElNRU9VVCAgICAgICAgID0gUkVMRUFTRV9USU1FT1VUOworICBzZXR1cCA6IFRUZXN0U2V0dXA7CiBiZWdpbgotICBwcm90VHlwZSA6PSBwcm90X0JpbmFyeTsKLSAgZW5kcG9pbnQgOj0gdHJuc19Tb2NrZXRzOwotICBsYXllcmVkIDo9IFtdOwotICBVc2VTU0wgOj0gRkFMU0U7Ci0gIGhvc3QgOj0gJ2xvY2FsaG9zdCc7Ci0gIHBvcnQgOj0gOTA5MDsKLSAgc1BpcGVOYW1lIDo9ICcnOwotICBoQW5vblJlYWQgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0gIGhBbm9uV3JpdGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIC8vIGluaXQgcmVjb3JkCisgIHdpdGggc2V0dXAgZG8gYmVnaW4KKyAgICBwcm90VHlwZSAgIDo9IHByb3RfQmluYXJ5OworICAgIGVuZHBvaW50ICAgOj0gdHJuc19Tb2NrZXRzOworICAgIGxheWVyZWQgICAgOj0gW107CisgICAgdXNlU1NMICAgICA6PSBGQUxTRTsKKyAgICBob3N0ICAgICAgIDo9ICdsb2NhbGhvc3QnOworICAgIHBvcnQgICAgICAgOj0gOTA5MDsKKyAgICBzUGlwZU5hbWUgIDo9ICcnOworICAgIGhBbm9uUmVhZCAgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgaEFub25Xcml0ZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgZW5kOworCiAgIHRyeQogICAgIGkgOj0gMDsKICAgICB3aGlsZSAoIGkgPCBMZW5ndGgoYXJncykgKSBkbyBiZWdpbgpAQCAtMjE2LDE1ICsyNDMsMTUgQEAKICAgICAgIGVuZAogICAgICAgZWxzZSBpZiBzID0gJy0taG9zdCcgdGhlbiBiZWdpbgogICAgICAgICAvLyAtLWhvc3QgYXJnICg9bG9jYWxob3N0KSAgICAgSG9zdCB0byBjb25uZWN0Ci0gICAgICAgIGhvc3QgOj0gYXJnc1tpXTsKKyAgICAgICAgc2V0dXAuaG9zdCA6PSBhcmdzW2ldOwogICAgICAgICBJbmMoIGkpOwogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS1wb3J0JyB0aGVuIGJlZ2luCiAgICAgICAgIC8vIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBjb25uZWN0CiAgICAgICAgIHMgOj0gYXJnc1tpXTsKICAgICAgICAgSW5jKCBpKTsKLSAgICAgICAgcG9ydCA6PSBTdHJUb0ludERlZihzLDApOwotICAgICAgICBpZiBwb3J0IDw9IDAgdGhlbiBJbnZhbGlkQXJnczsKKyAgICAgICAgc2V0dXAucG9ydCA6PSBTdHJUb0ludERlZihzLDApOworICAgICAgICBpZiBzZXR1cC5wb3J0IDw9IDAgdGhlbiBJbnZhbGlkQXJnczsKICAgICAgIGVuZAogICAgICAgZWxzZSBpZiBzID0gJy0tZG9tYWluLXNvY2tldCcgdGhlbiBiZWdpbgogICAgICAgICAvLyAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSwgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0CkBAIC0yMzIsMjcgKzI1OSwyOSBAQAogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS1uYW1lZC1waXBlJyB0aGVuIGJlZ2luCiAgICAgICAgIC8vIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKQotICAgICAgICBlbmRwb2ludCA6PSB0cm5zX05hbWVkUGlwZXM7Ci0gICAgICAgIHNQaXBlTmFtZSA6PSBhcmdzW2ldOworICAgICAgICBzZXR1cC5lbmRwb2ludCA6PSB0cm5zX05hbWVkUGlwZXM7CisgICAgICAgIHNldHVwLnNQaXBlTmFtZSA6PSBhcmdzW2ldOwogICAgICAgICBJbmMoIGkpOworICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgbmFtZWQgcGlwZSAoJytzZXR1cC5zUGlwZU5hbWUrJyknKTsKICAgICAgIGVuZAogICAgICAgZWxzZSBpZiBzID0gJy0tYW5vbi1waXBlcycgdGhlbiBiZWdpbgogICAgICAgICAvLyAtLWFub24tcGlwZXMgaFJlYWQgaFdyaXRlICAgV2luZG93cyBBbm9ueW1vdXMgUGlwZXMgcGFpciAoaGFuZGxlcykKLSAgICAgICAgZW5kcG9pbnQgOj0gdHJuc19Bbm9uUGlwZXM7Ci0gICAgICAgIGhBbm9uUmVhZCA6PSBUSGFuZGxlKCBTdHJUb0ludERlZiggYXJnc1tpXSwgSW50ZWdlcihJTlZBTElEX0hBTkRMRV9WQUxVRSkpKTsKKyAgICAgICAgc2V0dXAuZW5kcG9pbnQgOj0gdHJuc19Bbm9uUGlwZXM7CisgICAgICAgIHNldHVwLmhBbm9uUmVhZCA6PSBUSGFuZGxlKCBTdHJUb0ludERlZiggYXJnc1tpXSwgSW50ZWdlcihJTlZBTElEX0hBTkRMRV9WQUxVRSkpKTsKICAgICAgICAgSW5jKCBpKTsKLSAgICAgICAgaEFub25Xcml0ZSA6PSBUSGFuZGxlKCBTdHJUb0ludERlZiggYXJnc1tpXSwgSW50ZWdlcihJTlZBTElEX0hBTkRMRV9WQUxVRSkpKTsKKyAgICAgICAgc2V0dXAuaEFub25Xcml0ZSA6PSBUSGFuZGxlKCBTdHJUb0ludERlZiggYXJnc1tpXSwgSW50ZWdlcihJTlZBTElEX0hBTkRMRV9WQUxVRSkpKTsKICAgICAgICAgSW5jKCBpKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGFub255bW91cyBwaXBlcyAoJytJbnRUb1N0cihJbnRlZ2VyKHNldHVwLmhBbm9uUmVhZCkpKycgYW5kICcrSW50VG9TdHIoSW50ZWdlcihzZXR1cC5oQW5vbldyaXRlKSkrJyknKTsKICAgICAgIGVuZAogICAgICAgZWxzZSBpZiBzID0gJy0tdHJhbnNwb3J0JyB0aGVuIGJlZ2luCiAgICAgICAgIC8vIC0tdHJhbnNwb3J0IGFyZyAoPXNvY2tldHMpICBUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cAogICAgICAgICBzIDo9IGFyZ3NbaV07CiAgICAgICAgIEluYyggaSk7CiAKLSAgICAgICAgaWYgICAgICBzID0gJ2J1ZmZlcmVkJyB0aGVuIEluY2x1ZGUoIGxheWVyZWQsIHRybnNfQnVmZmVyZWQpCi0gICAgICAgIGVsc2UgaWYgcyA9ICdmcmFtZWQnICAgdGhlbiBJbmNsdWRlKCBsYXllcmVkLCB0cm5zX0ZyYW1lZCkKLSAgICAgICAgZWxzZSBpZiBzID0gJ2h0dHAnICAgICB0aGVuIGVuZHBvaW50IDo9IHRybnNfSHR0cAotICAgICAgICBlbHNlIGlmIHMgPSAnZXZodHRwJyAgIHRoZW4gZW5kcG9pbnQgOj0gdHJuc19Bbm9uUGlwZXMKKyAgICAgICAgaWYgICAgICBzID0gJ2J1ZmZlcmVkJyB0aGVuIEluY2x1ZGUoIHNldHVwLmxheWVyZWQsIHRybnNfQnVmZmVyZWQpCisgICAgICAgIGVsc2UgaWYgcyA9ICdmcmFtZWQnICAgdGhlbiBJbmNsdWRlKCBzZXR1cC5sYXllcmVkLCB0cm5zX0ZyYW1lZCkKKyAgICAgICAgZWxzZSBpZiBzID0gJ2h0dHAnICAgICB0aGVuIHNldHVwLmVuZHBvaW50IDo9IHRybnNfSHR0cAorICAgICAgICBlbHNlIGlmIHMgPSAnZXZodHRwJyAgIHRoZW4gc2V0dXAuZW5kcG9pbnQgOj0gdHJuc19Fdkh0dHAKICAgICAgICAgZWxzZSBJbnZhbGlkQXJnczsKICAgICAgIGVuZAogICAgICAgZWxzZSBpZiBzID0gJy0tcHJvdG9jb2wnIHRoZW4gYmVnaW4KQEAgLTI2MCwxNCArMjg5LDE0IEBACiAgICAgICAgIHMgOj0gYXJnc1tpXTsKICAgICAgICAgSW5jKCBpKTsKIAotICAgICAgICBpZiAgICAgIHMgPSAnYmluYXJ5JyAgIHRoZW4gcHJvdFR5cGUgOj0gcHJvdF9CaW5hcnkKLSAgICAgICAgZWxzZSBpZiBzID0gJ2NvbXBhY3QnICB0aGVuIHByb3RUeXBlIDo9IHByb3RfQ29tcGFjdAotICAgICAgICBlbHNlIGlmIHMgPSAnanNvbicgICAgIHRoZW4gcHJvdFR5cGUgOj0gcHJvdF9KU09OCisgICAgICAgIGlmICAgICAgcyA9ICdiaW5hcnknICAgdGhlbiBzZXR1cC5wcm90VHlwZSA6PSBwcm90X0JpbmFyeQorICAgICAgICBlbHNlIGlmIHMgPSAnY29tcGFjdCcgIHRoZW4gc2V0dXAucHJvdFR5cGUgOj0gcHJvdF9Db21wYWN0CisgICAgICAgIGVsc2UgaWYgcyA9ICdqc29uJyAgICAgdGhlbiBzZXR1cC5wcm90VHlwZSA6PSBwcm90X0pTT04KICAgICAgICAgZWxzZSBJbnZhbGlkQXJnczsKICAgICAgIGVuZAogICAgICAgZWxzZSBpZiBzID0gJy0tc3NsJyB0aGVuIGJlZ2luCiAgICAgICAgIC8vIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTAotICAgICAgICBVc2VTU0wgOj0gVFJVRTsKKyAgICAgICAgc2V0dXAudXNlU1NMIDo9IFRSVUU7CiAKICAgICAgIGVuZAogICAgICAgZWxzZSBpZiAocyA9ICctbicpIG9yIChzID0gJy0tdGVzdGxvb3BzJykgdGhlbiBiZWdpbgpAQCAtMjkzLDcgKzMyMiw3IEBACiAKICAgICAvLyBJbiB0aGUgYW5vbnltb3VzIHBpcGVzIG1vZGUgdGhlIGNsaWVudCBpcyBsYXVuY2hlZCBieSB0aGUgdGVzdCBzZXJ2ZXIKICAgICAvLyAtPiBiZWhhdmUgbmljZWx5IGFuZCBhbGxvdyBmb3IgYXR0YWNoaW5nIGEgZGVidWdnZXIgdG8gdGhpcyBwcm9jZXNzCi0gICAgaWYgKGVuZHBvaW50ID0gdHJuc19Bbm9uUGlwZXMpIGFuZCBub3QgSXNEZWJ1Z2dlclByZXNlbnQKKyAgICBpZiAoc2V0dXAuZW5kcG9pbnQgPSB0cm5zX0Fub25QaXBlcykgYW5kIG5vdCBJc0RlYnVnZ2VyUHJlc2VudAogICAgIHRoZW4gTWVzc2FnZUJveCggMCwgJ0F0dGFjaCBEZWJ1Z2dlciBhbmQvb3IgY2xpY2sgT0sgdG8gY29udGludWUuJywKICAgICAgICAgICAgICAgICAgICAgICAgICdUaHJpZnQgVGVzdENsaWVudCAoRGVscGhpKScsCiAgICAgICAgICAgICAgICAgICAgICAgICBNQl9PSyBvciBNQl9JQ09ORVhDTEFNQVRJT04pOwpAQCAtMzAxLDc4ICszMzAsMzAgQEAKICAgICBTZXRMZW5ndGgoIHRocmVhZHMsIEZOdW1UaHJlYWQpOwogICAgIGR0U3RhcnQgOj0gTm93OwogCi0gICAgZm9yIHRlc3QgOj0gMCB0byBGTnVtVGhyZWFkIC0gMSBkbwotICAgIGJlZ2luCi0gICAgICBjYXNlIGVuZHBvaW50IG9mCi0gICAgICAgIHRybnNfU29ja2V0czogYmVnaW4KLSAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgc29ja2V0cyAoJytob3N0KycgcG9ydCAnK0ludFRvU3RyKHBvcnQpKycpJyk7Ci0gICAgICAgICAgc3RyZWFtdHJhbnMgOj0gVFNvY2tldEltcGwuQ3JlYXRlKCBob3N0LCBwb3J0ICk7Ci0gICAgICAgIGVuZDsKKyAgICAvLyBsYXllcmVkIHRyYW5zcG9ydHMgYXJlIG5vdCByZWFsbHkgbWVhbnQgdG8gYmUgc3RhY2tlZCB1cG9uIGVhY2ggb3RoZXIKKyAgICBpZiAodHJuc19GcmFtZWQgaW4gc2V0dXAubGF5ZXJlZCkgdGhlbiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGZyYW1lZCB0cmFuc3BvcnQnKTsKKyAgICBlbmQKKyAgICBlbHNlIGlmICh0cm5zX0J1ZmZlcmVkIGluIHNldHVwLmxheWVyZWQpIHRoZW4gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBidWZmZXJlZCB0cmFuc3BvcnQnKTsKKyAgICBlbmQ7CiAKLSAgICAgICAgdHJuc19IdHRwOiBiZWdpbgotICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBIVFRQQ2xpZW50Jyk7Ci0gICAgICAgICAgaHR0cCA6PSBUSFRUUENsaWVudEltcGwuQ3JlYXRlKCBob3N0KTsKLSAgICAgICAgICB0cmFucyA6PSBodHRwOwotICAgICAgICBlbmQ7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoVEhSSUZUX1BST1RPQ09MU1tzZXR1cC5wcm90VHlwZV0rJyBwcm90b2NvbCcpOwogCi0gICAgICAgIHRybnNfRXZIdHRwOiBiZWdpbgotICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoRU5EUE9JTlRfVFJBTlNQT1JUU1tlbmRwb2ludF0rJyB0cmFuc3BvcnQgbm90IGltcGxlbWVudGVkJyk7Ci0gICAgICAgIGVuZDsKLQotICAgICAgICB0cm5zX05hbWVkUGlwZXM6IGJlZ2luCi0gICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIG5hbWVkIHBpcGUgKCcrc1BpcGVOYW1lKycpJyk7Ci0gICAgICAgICAgc3RyZWFtdHJhbnMgOj0gVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwuQ3JlYXRlKCBzUGlwZU5hbWUsIDAsIG5pbCwgVElNRU9VVCk7Ci0gICAgICAgIGVuZDsKLQotICAgICAgICB0cm5zX0Fub25QaXBlczogYmVnaW4KLSAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgYW5vbnltb3VzIHBpcGVzICgnK0ludFRvU3RyKEludGVnZXIoaEFub25SZWFkKSkrJyBhbmQgJytJbnRUb1N0cihJbnRlZ2VyKGhBbm9uV3JpdGUpKSsnKScpOwotICAgICAgICAgIHN0cmVhbXRyYW5zIDo9IFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGhBbm9uUmVhZCwgaEFub25Xcml0ZSwgRkFMU0UpOwotICAgICAgICBlbmQ7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIGVuZHBvaW50IHRyYW5zcG9ydCcpOwotICAgICAgZW5kOwotICAgICAgdHJhbnMgOj0gc3RyZWFtdHJhbnM7Ci0gICAgICBBU1NFUlQoIHRyYW5zIDw+IG5pbCk7Ci0KLSAgICAgIGlmICh0cm5zX0J1ZmZlcmVkIGluIGxheWVyZWQpIHRoZW4gYmVnaW4KLSAgICAgICAgdHJhbnMgOj0gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIHN0cmVhbXRyYW5zLCAzMik7ICAvLyBzbWFsbCBidWZmZXIgdG8gdGVzdCByZWFkKCkKLSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGJ1ZmZlcmVkIHRyYW5zcG9ydCcpOwotICAgICAgZW5kOwotCi0gICAgICBpZiAodHJuc19GcmFtZWQgaW4gbGF5ZXJlZCkgdGhlbiBiZWdpbgotICAgICAgICB0cmFucyA6PSBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIHRyYW5zICk7Ci0gICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBmcmFtZWQgdHJhbnNwb3J0Jyk7Ci0gICAgICBlbmQ7Ci0KLSAgICAgIGlmIFVzZVNTTCB0aGVuIGJlZ2luCi0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1NTTCBub3QgaW1wbGVtZW50ZWQnKTsKLSAgICAgIGVuZDsKLQotICAgICAgLy8gY3JlYXRlIHByb3RvY29sIGluc3RhbmNlLCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCi0gICAgICBjYXNlIHByb3RUeXBlIG9mCi0gICAgICAgIHByb3RfQmluYXJ5ICA6ICBwcm90IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuQ3JlYXRlKCB0cmFucywgQklOQVJZX1NUUklDVF9SRUFELCBCSU5BUllfU1RSSUNUX1dSSVRFKTsKLSAgICAgICAgcHJvdF9KU09OICAgIDogIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKCB0cmFucyk7Ci0gICAgICAgIHByb3RfQ29tcGFjdCA6ICBwcm90IDo9IFRDb21wYWN0UHJvdG9jb2xJbXBsLkNyZWF0ZSggdHJhbnMpOwotICAgICAgZWxzZQotICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdVbmhhbmRsZWQgcHJvdG9jb2wnKTsKLSAgICAgIGVuZDsKLSAgICAgIEFTU0VSVCggdHJhbnMgPD4gbmlsKTsKLSAgICAgIENvbnNvbGUuV3JpdGVMaW5lKFRIUklGVF9QUk9UT0NPTFNbcHJvdFR5cGVdKycgcHJvdG9jb2wnKTsKLQotICAgICAgdGhyZWFkIDo9IFRDbGllbnRUaHJlYWQuQ3JlYXRlKCB0cmFucywgcHJvdCwgRk51bUl0ZXJhdGlvbik7CisgICAgZm9yIHRlc3QgOj0gMCB0byBGTnVtVGhyZWFkIC0gMSBkbyBiZWdpbgorICAgICAgdGhyZWFkIDo9IFRDbGllbnRUaHJlYWQuQ3JlYXRlKCBzZXR1cCwgRk51bUl0ZXJhdGlvbik7CiAgICAgICB0aHJlYWRzW3Rlc3RdIDo9IHRocmVhZDsKICAgICAgIHRocmVhZC5TdGFydDsKICAgICBlbmQ7CiAKICAgICByZXN1bHQgOj0gMDsKICAgICBmb3IgdGVzdCA6PSAwIHRvIEZOdW1UaHJlYWQgLSAxIGRvIGJlZ2luCi0gICAgICByZXN1bHQgOj0gcmVzdWx0IG9yIHRocmVhZHNbdGVzdF0uV2FpdEZvcjsKKyAgICAgIHRocmVhZEV4aXRDb2RlIDo9IHRocmVhZHNbdGVzdF0uV2FpdEZvcjsKKyAgICAgIHJlc3VsdCA6PSByZXN1bHQgb3IgdGhyZWFkRXhpdENvZGU7CisgICAgICB0aHJlYWRzW3Rlc3RdLkZyZWU7CisgICAgICB0aHJlYWRzW3Rlc3RdIDo9IG5pbDsKICAgICBlbmQ7CiAKLSAgICBmb3IgdGVzdCA6PSAwIHRvIEZOdW1UaHJlYWQgLSAxCi0gICAgZG8gdGhyZWFkc1t0ZXN0XS5GcmVlOwotCiAgICAgQ29uc29sZS5Xcml0ZSgnVG90YWwgdGltZTogJyArIEludFRvU3RyKCBNaWxsaVNlY29uZHNCZXR3ZWVuKE5vdywgZHRTdGFydCkpKTsKIAogICBleGNlcHQKQEAgLTQzOCwxNSArNDE5LDE3IEBACiAgIGFyZzMgOiBJVGhyaWZ0RGljdGlvbmFyeTxTbWFsbEludCwgc3RyaW5nPjsKICAgYXJnNCA6IFROdW1iZXJ6OwogICBhcmc1IDogSW50NjQ7CisgIHskSUZERUYgUGVyZlRlc3R9CiAgIFN0YXJ0VGljayA6IENhcmRpbmFsOwogICBrIDogSW50ZWdlcjsKLSAgcHJvYyA6IFRUaHJlYWRQcm9jZWR1cmU7CisgIHskRU5ESUZ9CiAgIGhlbGxvLCBnb29kYnllIDogSVh0cnVjdDsKICAgY3JhenkgOiBJSW5zYW5pdHk7CiAgIGxvb25leSA6IElJbnNhbml0eTsKICAgZmlyc3RfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CiAgIHNlY29uZF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKLQorICBwYWlyIDogVFBhaXI8VE51bWJlcnosIFRVc2VySWQ+OworICB0ZXN0c2l6ZSA6IFRUZXN0U2l6ZTsKIGJlZ2luCiAgIGNsaWVudCA6PSBUVGhyaWZ0VGVzdC5UQ2xpZW50LkNyZWF0ZSggRlByb3RvY29sKTsKICAgRlRyYW5zcG9ydC5PcGVuOwpAQCAtNDU1LDYgKzQzOCw3IEBACiAgIFN0cmVzc1Rlc3QoIGNsaWVudCk7CiAgIHskRU5ESUYgU3RyZXNzVGVzdH0KIAorICB7JElGREVGIEV4Y2VwdGlvbnN9CiAgIC8vIGluLWRlcHRoIGV4Y2VwdGlvbiB0ZXN0CiAgIC8vICgxKSBkbyB3ZSBnZXQgYW4gZXhjZXB0aW9uIGF0IGFsbD8KICAgLy8gKDIpIGRvIHdlIGdldCB0aGUgcmlnaHQgZXhjZXB0aW9uPwpAQCAtNDcxLDcgKzQ1NSw3IEBACiAgICAgICBDb25zb2xlLldyaXRlTGluZSggJyA9ICcgKyBJbnRUb1N0cihlLkVycm9yQ29kZSkgKyAnLCAnICsgZS5NZXNzYWdlXyApOwogICAgIGVuZDsKICAgICBvbiBlOlRUcmFuc3BvcnRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgOiAiJytlLlRvU3RyaW5nKyciJyk7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUgIicrZS5DbGFzc05hbWUrJyInKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKICAgZW5kOwogCiAgIC8vIGNhc2UgMjogZXhjZXB0aW9uIHR5cGUgTk9UIGRlY2xhcmVkIGluIElETCBhdCB0aGUgZnVuY3Rpb24gY2FsbApAQCAtNDg2LDE0ICs0NzAsMTQgQEAKICAgICBvbiBlOlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBkbyBiZWdpbgogICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGUuQ2xhc3NOYW1lKycgPSAnK2UuTWVzc2FnZSk7IC8vIHRoaXMgaXMgd2hhdCB3ZSBnZXQKICAgICBlbmQ7Ci0gICAgb24gZTpURXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiB0eXBlICInK2UuQ2xhc3NOYW1lKyciJyk7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUgIicrZS5DbGFzc05hbWUrJyInKTsKKyAgICBvbiBlOlRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CiAgIGVuZDsKIAotICB7CisKICAgaWYgRlRyYW5zcG9ydC5Jc09wZW4gdGhlbiBGVHJhbnNwb3J0LkNsb3NlOwogICBGVHJhbnNwb3J0Lk9wZW47ICAgLy8gcmUtb3BlbiBjb25uZWN0aW9uLCBzZXJ2ZXIgaGFzIGFscmVhZHkgY2xvc2VkCi0gIH0KKwogCiAgIC8vIGNhc2UgMzogbm8gZXhjZXB0aW9uCiAgIHRyeQpAQCAtNTAxLDggKzQ4NSw5IEBACiAgICAgRXhwZWN0KCBUUlVFLCAndGVzdEV4Y2VwdGlvbignJ3NvbWV0aGluZycnKTogbXVzdCBub3QgdHJvdyBhbiBleGNlcHRpb24nKTsKICAgZXhjZXB0CiAgICAgb24gZTpUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIDogIicrZS5Ub1N0cmluZysnIicpOwotICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIicpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOwogICBlbmQ7CisgIHskRU5ESUYgRXhjZXB0aW9uc30KIAogCiAgIC8vIHNpbXBsZSB0aGluZ3MKQEAgLTUxOCw2ICs1MDMsOSBAQAogICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nKCdUZXN0Jyk7CiAgIEV4cGVjdCggcyA9ICdUZXN0JywgJ3Rlc3RTdHJpbmcoJydUZXN0JycpID0gIicrcysnIicpOwogCisgIHMgOj0gY2xpZW50LnRlc3RTdHJpbmcoJycpOyAgLy8gZW1wdHkgc3RyaW5nCisgIEV4cGVjdCggcyA9ICcnLCAndGVzdFN0cmluZygnJycnKSA9ICInK3MrJyInKTsKKwogICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nKEhVR0VfVEVTVF9TVFJJTkcpOwogICBFeHBlY3QoIGxlbmd0aChzKSA9IGxlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSwKICAgICAgICAgICAndGVzdFN0cmluZyggbGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpID0gJytJbnRUb1N0cihMZW5ndGgoSFVHRV9URVNUX1NUUklORykpKycpICcKQEAgLTUzMywxNiArNTIxLDE5IEBACiAgIGk2NCA6PSBjbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpOwogICBFeHBlY3QoIGk2NCA9IC0zNDM1OTczODM2OCwgJ3Rlc3RJNjQoLTM0MzU5NzM4MzY4KSA9ICcgKyBJbnRUb1N0ciggaTY0KSk7CiAKLSAgYmluT3V0IDo9IFByZXBhcmVCaW5hcnlEYXRhKCBUUlVFKTsKLSAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJyknKTsKLSAgdHJ5Ci0gICAgYmluSW4gOj0gY2xpZW50LnRlc3RCaW5hcnkoYmluT3V0KTsKLSAgICBFeHBlY3QoIExlbmd0aChiaW5PdXQpID0gTGVuZ3RoKGJpbkluKSwgJ3Rlc3RCaW5hcnkoKTogbGVuZ3RoICcrSW50VG9TdHIoTGVuZ3RoKGJpbk91dCkpKycgPSAnK0ludFRvU3RyKExlbmd0aChiaW5JbikpKTsKLSAgICBpMzIgOj0gTWluKCBMZW5ndGgoYmluT3V0KSwgTGVuZ3RoKGJpbkluKSk7Ci0gICAgRXhwZWN0KCBDb21wYXJlTWVtKCBiaW5PdXQsIGJpbkluLCBpMzIpLCAndGVzdEJpbmFyeSgnK0J5dGVzVG9IZXgoYmluT3V0KSsnKSA9ICcrQnl0ZXNUb0hleChiaW5JbikpOwotICBleGNlcHQKLSAgICBvbiBlOlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBkbyBDb25zb2xlLldyaXRlTGluZSgndGVzdEJpbmFyeSgpOiAnK2UuTWVzc2FnZSk7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ3Rlc3RCaW5hcnkoKTogVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgLy8gcmFuZG9tIGJpbmFyeSBzbWFsbAorICBmb3IgdGVzdHNpemUgOj0gTG93KFRUZXN0U2l6ZSkgdG8gSGlnaChUVGVzdFNpemUpIGRvIGJlZ2luCisgICAgYmluT3V0IDo9IFByZXBhcmVCaW5hcnlEYXRhKCBUUlVFLCB0ZXN0c2l6ZSk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJyknKTsKKyAgICB0cnkKKyAgICAgIGJpbkluIDo9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7CisgICAgICBFeHBlY3QoIExlbmd0aChiaW5PdXQpID0gTGVuZ3RoKGJpbkluKSwgJ3Rlc3RCaW5hcnkoKTogbGVuZ3RoICcrSW50VG9TdHIoTGVuZ3RoKGJpbk91dCkpKycgPSAnK0ludFRvU3RyKExlbmd0aChiaW5JbikpKTsKKyAgICAgIGkzMiA6PSBNaW4oIExlbmd0aChiaW5PdXQpLCBMZW5ndGgoYmluSW4pKTsKKyAgICAgIEV4cGVjdCggQ29tcGFyZU1lbSggYmluT3V0LCBiaW5JbiwgaTMyKSwgJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJykgPSAnK0J5dGVzVG9IZXgoYmluSW4pKTsKKyAgICBleGNlcHQKKyAgICAgIG9uIGU6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIGRvIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0QmluYXJ5KCk6ICcrZS5NZXNzYWdlKTsKKyAgICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICd0ZXN0QmluYXJ5KCk6IFVuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgICAgZW5kOwogICBlbmQ7CiAKICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3REb3VibGUoNS4zMjUwOTgyMzUpJyk7CkBAIC03NjksOSArNzYwLDkgQEAKICAgaW5zYW5lLlVzZXJNYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouRklWRSwgNTAwMCk7CiAgIHRydWNrIDo9IFRYdHJ1Y3RJbXBsLkNyZWF0ZTsKICAgdHJ1Y2suU3RyaW5nX3RoaW5nIDo9ICdUcnVjayc7Ci0gIHRydWNrLkJ5dGVfdGhpbmcgOj0gODsKLSAgdHJ1Y2suSTMyX3RoaW5nIDo9IDg7Ci0gIHRydWNrLkk2NF90aGluZyA6PSA4OworICB0cnVjay5CeXRlX3RoaW5nIDo9IC04OyAgLy8gYnl0ZSBpcyBzaWduZWQKKyAgdHJ1Y2suSTMyX3RoaW5nIDo9IDMyOworICB0cnVjay5JNjRfdGhpbmcgOj0gNjQ7CiAgIGluc2FuZS5YdHJ1Y3RzIDo9IFRUaHJpZnRMaXN0SW1wbDxJWHRydWN0Pi5DcmVhdGU7CiAgIGluc2FuZS5YdHJ1Y3RzLkFkZCggdHJ1Y2sgKTsKICAgd2hvYSA6PSBjbGllbnQudGVzdEluc2FuaXR5KCBpbnNhbmUgKTsKQEAgLTgyMCw2ICs4MTEsMTggQEAKICAgZW5kOwogICBDb25zb2xlLldyaXRlTGluZSgnfScpOwogCisgICgqKgorICAgKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKyAgICoKKyAgICogQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisgICAqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgKiAgICAgICAgICB9LAorICAgKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAqICAgfQorICAgKiBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICopCisKICAgLy8gdmVyaWZ5IHJlc3VsdCBkYXRhCiAgIEV4cGVjdCggd2hvYS5Db3VudCA9IDIsICd3aG9hLkNvdW50ID0gJytJbnRUb1N0cih3aG9hLkNvdW50KSk7CiAgIC8vCkBAIC04NDAsMzEgKzg0MywyMCBAQAogICAgIEV4cGVjdCggY3JhenkuX19pc3NldF9Vc2VyTWFwLCAnY3JhenkuX19pc3NldF9Vc2VyTWFwID0gJytCb29sVG9TdHJpbmcoY3JhenkuX19pc3NldF9Vc2VyTWFwKSk7CiAgICAgRXhwZWN0KCBjcmF6eS5fX2lzc2V0X1h0cnVjdHMsICdjcmF6eS5fX2lzc2V0X1h0cnVjdHMgPSAnK0Jvb2xUb1N0cmluZyhjcmF6eS5fX2lzc2V0X1h0cnVjdHMpKTsKIAotICAgIEV4cGVjdCggY3JhenkuVXNlck1hcC5Db3VudCA9IDIsICdjcmF6eS5Vc2VyTWFwLkNvdW50ID0gJytJbnRUb1N0cihjcmF6eS5Vc2VyTWFwLkNvdW50KSk7Ci0gICAgRXhwZWN0KCBjcmF6eS5Vc2VyTWFwW1ROdW1iZXJ6LkZJVkVdID0gNSwgJ2NyYXp5LlVzZXJNYXBbVE51bWJlcnouRklWRV0gPSAnK0ludFRvU3RyKGNyYXp5LlVzZXJNYXBbVE51bWJlcnouRklWRV0pKTsKLSAgICBFeHBlY3QoIGNyYXp5LlVzZXJNYXBbVE51bWJlcnouRUlHSFRdID0gOCwgJ2NyYXp5LlVzZXJNYXBbVE51bWJlcnouRUlHSFRdID0gJytJbnRUb1N0cihjcmF6eS5Vc2VyTWFwW1ROdW1iZXJ6LkVJR0hUXSkpOworICAgIEV4cGVjdCggY3JhenkuVXNlck1hcC5Db3VudCA9IGluc2FuZS5Vc2VyTWFwLkNvdW50LCAnY3JhenkuVXNlck1hcC5Db3VudCA9ICcrSW50VG9TdHIoY3JhenkuVXNlck1hcC5Db3VudCkpOworICAgIGZvciBwYWlyIGluIGluc2FuZS5Vc2VyTWFwIGRvIGJlZ2luCisgICAgICBFeHBlY3QoIGNyYXp5LlVzZXJNYXBbcGFpci5LZXldID0gcGFpci5WYWx1ZSwgJ2NyYXp5LlVzZXJNYXBbJytJbnRUb1N0cihPcmQocGFpci5rZXkpKSsnXSA9ICcrSW50VG9TdHIoY3JhenkuVXNlck1hcFtwYWlyLktleV0pKTsKKyAgICBlbmQ7CiAKLSAgICBFeHBlY3QoIGNyYXp5Llh0cnVjdHMuQ291bnQgPSAyLCAnY3JhenkuWHRydWN0cy5Db3VudCA9ICcrSW50VG9TdHIoY3JhenkuWHRydWN0cy5Db3VudCkpOwotICAgIGdvb2RieWUgOj0gY3JhenkuWHRydWN0c1swXTsgIC8vIGxpc3RzIGFyZSBvcmRlcmVkLCBzbyB3ZSBhcmUgYWxsb3dlZCB0byBhc3N1bWUgdGhpcyBvcmRlcgotICAgICAgaGVsbG8gICA6PSBjcmF6eS5YdHJ1Y3RzWzFdOwotCi0gICAgRXhwZWN0KCBnb29kYnllLlN0cmluZ190aGluZyA9ICdHb29kYnllNCcsICdnb29kYnllLlN0cmluZ190aGluZyA9ICInK2dvb2RieWUuU3RyaW5nX3RoaW5nKyciJyk7Ci0gICAgRXhwZWN0KCBnb29kYnllLkJ5dGVfdGhpbmcgPSA0LCAnZ29vZGJ5ZS5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkJ5dGVfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGdvb2RieWUuSTMyX3RoaW5nID0gNCwgJ2dvb2RieWUuSTMyX3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkkzMl90aGluZykpOwotICAgIEV4cGVjdCggZ29vZGJ5ZS5JNjRfdGhpbmcgPSA0LCAnZ29vZGJ5ZS5JNjRfdGhpbmcgPSAnK0ludFRvU3RyKGdvb2RieWUuSTY0X3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBnb29kYnllLl9faXNzZXRfU3RyaW5nX3RoaW5nLCAnZ29vZGJ5ZS5fX2lzc2V0X1N0cmluZ190aGluZyA9ICcrQm9vbFRvU3RyaW5nKGdvb2RieWUuX19pc3NldF9TdHJpbmdfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGdvb2RieWUuX19pc3NldF9CeXRlX3RoaW5nLCAnZ29vZGJ5ZS5fX2lzc2V0X0J5dGVfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhnb29kYnllLl9faXNzZXRfQnl0ZV90aGluZykpOwotICAgIEV4cGVjdCggZ29vZGJ5ZS5fX2lzc2V0X0kzMl90aGluZywgJ2dvb2RieWUuX19pc3NldF9JMzJfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhnb29kYnllLl9faXNzZXRfSTMyX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBnb29kYnllLl9faXNzZXRfSTY0X3RoaW5nLCAnZ29vZGJ5ZS5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGdvb2RieWUuX19pc3NldF9JNjRfdGhpbmcpKTsKLQotICAgIEV4cGVjdCggaGVsbG8uU3RyaW5nX3RoaW5nID0gJ0hlbGxvMicsICdoZWxsby5TdHJpbmdfdGhpbmcgPSAiJytoZWxsby5TdHJpbmdfdGhpbmcrJyInKTsKLSAgICBFeHBlY3QoIGhlbGxvLkJ5dGVfdGhpbmcgPSAyLCAnaGVsbG8uQnl0ZV90aGluZyA9ICcrSW50VG9TdHIoaGVsbG8uQnl0ZV90aGluZykpOwotICAgIEV4cGVjdCggaGVsbG8uSTMyX3RoaW5nID0gMiwgJ2hlbGxvLkkzMl90aGluZyA9ICcrSW50VG9TdHIoaGVsbG8uSTMyX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBoZWxsby5JNjRfdGhpbmcgPSAyLCAnaGVsbG8uSTY0X3RoaW5nID0gJytJbnRUb1N0cihoZWxsby5JNjRfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGhlbGxvLl9faXNzZXRfU3RyaW5nX3RoaW5nLCAnaGVsbG8uX19pc3NldF9TdHJpbmdfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhoZWxsby5fX2lzc2V0X1N0cmluZ190aGluZykpOwotICAgIEV4cGVjdCggaGVsbG8uX19pc3NldF9CeXRlX3RoaW5nLCAnaGVsbG8uX19pc3NldF9CeXRlX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaGVsbG8uX19pc3NldF9CeXRlX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBoZWxsby5fX2lzc2V0X0kzMl90aGluZywgJ2hlbGxvLl9faXNzZXRfSTMyX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaGVsbG8uX19pc3NldF9JMzJfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGhlbGxvLl9faXNzZXRfSTY0X3RoaW5nLCAnaGVsbG8uX19pc3NldF9JNjRfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhoZWxsby5fX2lzc2V0X0k2NF90aGluZykpOworICAgIEV4cGVjdCggY3JhenkuWHRydWN0cy5Db3VudCA9IGluc2FuZS5YdHJ1Y3RzLkNvdW50LCAnY3JhenkuWHRydWN0cy5Db3VudCA9ICcrSW50VG9TdHIoY3JhenkuWHRydWN0cy5Db3VudCkpOworICAgIGZvciBhcmcwIDo9IDAgdG8gaW5zYW5lLlh0cnVjdHMuQ291bnQtMSBkbyBiZWdpbgorICAgICAgaGVsbG8gICA6PSBpbnNhbmUuWHRydWN0c1thcmcwXTsKKyAgICAgIGdvb2RieWUgOj0gY3JhenkuWHRydWN0c1thcmcwXTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSBoZWxsby5TdHJpbmdfdGhpbmcsICdnb29kYnllLlN0cmluZ190aGluZyA9ICcrZ29vZGJ5ZS5TdHJpbmdfdGhpbmcpOworICAgICAgRXhwZWN0KCBnb29kYnllLkJ5dGVfdGhpbmcgPSBoZWxsby5CeXRlX3RoaW5nLCAnZ29vZGJ5ZS5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkJ5dGVfdGhpbmcpKTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5JMzJfdGhpbmcgPSBoZWxsby5JMzJfdGhpbmcsICdnb29kYnllLkkzMl90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5JMzJfdGhpbmcpKTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5JNjRfdGhpbmcgPSBoZWxsby5JNjRfdGhpbmcsICdnb29kYnllLkk2NF90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5JNjRfdGhpbmcpKTsKKyAgICBlbmQ7CiAgIGVuZDsKIAogCkBAIC05MDQsNyArODk2LDcgQEAKICAgICBFeHBlY3QoIG5vdCBpLl9faXNzZXRfSTY0X3RoaW5nLCAnaS5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JNjRfdGhpbmcpKTsKICAgICB9CiAgIGV4Y2VwdAotICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIicpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOwogICBlbmQ7CiAKICAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TXVsdGlFeGNlcHRpb24oWGNlcHRpb24pJywgdGVzdF9FeGNlcHRpb25zKTsKQEAgLTkxOCw3ICs5MTAsNyBAQAogICAgICAgRXhwZWN0KCB4LkVycm9yQ29kZSA9IDEwMDEsICd4LkVycm9yQ29kZSA9ICcrSW50VG9TdHIoeC5FcnJvckNvZGUpKTsKICAgICAgIEV4cGVjdCggeC5NZXNzYWdlXyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uJywgJ3guTWVzc2FnZSA9ICInK3guTWVzc2FnZV8rJyInKTsKICAgICBlbmQ7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciJyk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CiAgIGVuZDsKIAogICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNdWx0aUV4Y2VwdGlvbihYY2VwdGlvbjIpJywgdGVzdF9FeGNlcHRpb25zKTsKQEAgLTkzOCw3ICs5MzAsNyBAQAogICAgICAgRXhwZWN0KCBub3QgeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JNjRfdGhpbmcsICd4LlN0cnVjdF90aGluZy5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKHguU3RydWN0X3RoaW5nLl9faXNzZXRfSTY0X3RoaW5nKSk7CiAgICAgICB9CiAgICAgZW5kOwotICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIicpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOwogICBlbmQ7CiAKIApAQCAtOTUwLDcgKzk0Miw3IEBACiAgIC8vIGNhbGwgdGltZQogICB7JElGREVGIFBlcmZUZXN0fQogICBTdGFydFRlc3RHcm91cCggJ1Rlc3QgQ2FsbHRpbWUoKScpOwotICBTdGFydFRpY2sgOj0gR2V0VElja0NvdW50OworICBTdGFydFRpY2sgOj0gR2V0VGlja0NvdW50OwogICBmb3IgayA6PSAwIHRvIDEwMDAgLSAxIGRvCiAgIGJlZ2luCiAgICAgY2xpZW50LnRlc3RWb2lkKCk7CkBAIC05NjMsNiArOTU1LDMzIEBACiBlbmQ7CiAKIAoreyRJRkRFRiBTdXBwb3J0c0FzeW5jfQorcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuQ2xpZW50QXN5bmNUZXN0OwordmFyCisgIGNsaWVudCA6IFRUaHJpZnRUZXN0LklBc3luYzsKKyAgcyA6IHN0cmluZzsKKyAgaTggOiBTaG9ydEludDsKK2JlZ2luCisgIFN0YXJ0VGVzdEdyb3VwKCAnQXN5bmMgVGVzdHMnLCB0ZXN0X1Vua25vd24pOworICBjbGllbnQgOj0gVFRocmlmdFRlc3QuVENsaWVudC5DcmVhdGUoIEZQcm90b2NvbCk7CisgIEZUcmFuc3BvcnQuT3BlbjsKKworICAvLyBvbmV3YXkgdm9pZCBmdW5jdGlvbnMKKyAgY2xpZW50LnRlc3RPbmV3YXlBc3luYygxKS5XYWl0OworICBFeHBlY3QoIFRSVUUsICdUZXN0IE9uZXdheSgxKScpOyAgLy8gc3VjY2VzcyA6PSBubyBleGNlcHRpb24KKworICAvLyBub3JtYWwgZnVuY3Rpb25zCisgIHMgOj0gY2xpZW50LnRlc3RTdHJpbmdBc3luYyhIVUdFX1RFU1RfU1RSSU5HKS5WYWx1ZTsKKyAgRXhwZWN0KCBsZW5ndGgocykgPSBsZW5ndGgoSFVHRV9URVNUX1NUUklORyksCisgICAgICAgICAgJ3Rlc3RTdHJpbmcoIGxlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSA9ICcrSW50VG9TdHIoTGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpKSsnKSAnCisgICAgICAgICArJz0+IGxlbmd0aChyZXN1bHQpID0gJytJbnRUb1N0cihMZW5ndGgocykpKTsKKworICBpOCA6PSBjbGllbnQudGVzdEJ5dGUoMSkuVmFsdWU7CisgIEV4cGVjdCggaTggPSAxLCAndGVzdEJ5dGUoMSkgPSAnICsgSW50VG9TdHIoIGk4ICkpOworZW5kOworeyRFTkRJRn0KKworCiB7JElGREVGIFN0cmVzc1Rlc3R9CiBwcm9jZWR1cmUgVENsaWVudFRocmVhZC5TdHJlc3NUZXN0KGNvbnN0IGNsaWVudCA6IFRUaHJpZnRUZXN0LklmYWNlKTsKIGJlZ2luCkBAIC05ODMsMzMgKzEwMDIsNDkgQEAKIHskRU5ESUZ9CiAKIAotZnVuY3Rpb24gVENsaWVudFRocmVhZC5QcmVwYXJlQmluYXJ5RGF0YSggYVJhbmRvbURpc3QgOiBCb29sZWFuID0gRkFMU0UpIDogVEJ5dGVzOwotdmFyIGksIG5leHRQb3MgOiBJbnRlZ2VyOworZnVuY3Rpb24gVENsaWVudFRocmVhZC5QcmVwYXJlQmluYXJ5RGF0YSggYVJhbmRvbURpc3QgOiBCb29sZWFuOyBhU2l6ZSA6IFRUZXN0U2l6ZSkgOiBUQnl0ZXM7Cit2YXIgaSA6IEludGVnZXI7CiBiZWdpbgotICBTZXRMZW5ndGgoIHJlc3VsdCwgJDEwMCk7CisgIGNhc2UgYVNpemUgb2YKKyAgICBFbXB0eSAgICAgICAgICA6IFNldExlbmd0aCggcmVzdWx0LCAwKTsKKyAgICBOb3JtYWwgICAgICAgICA6IFNldExlbmd0aCggcmVzdWx0LCAkMTAwKTsKKyAgICBCeXRlQXJyYXlUZXN0ICA6IFNldExlbmd0aCggcmVzdWx0LCBTaXplT2YoVEJ5dGVBcnJheSkgKyAxMjgpOworICAgIFBpcGVXcml0ZUxpbWl0IDogU2V0TGVuZ3RoKCByZXN1bHQsIDY1NTM1ICsgMTI4KTsKKyAgZWxzZQorICAgIHJhaXNlIEVBcmd1bWVudEV4Y2VwdGlvbi5DcmVhdGUoJ2FTaXplJyk7CisgIGVuZDsKKwogICBBU1NFUlQoIExvdyhyZXN1bHQpID0gMCk7CisgIGlmIExlbmd0aChyZXN1bHQpID0gMCB0aGVuIEV4aXQ7CiAKICAgLy8gbGluZWFyIGRpc3RyaWJ1dGlvbiwgdW5sZXNzIHJhbmRvbSBpcyByZXF1ZXN0ZWQKICAgaWYgbm90IGFSYW5kb21EaXN0IHRoZW4gYmVnaW4KICAgICBmb3IgaSA6PSBMb3cocmVzdWx0KSB0byBIaWdoKHJlc3VsdCkgZG8gYmVnaW4KLSAgICAgIHJlc3VsdFtpXSA6PSBpOworICAgICAgcmVzdWx0W2ldIDo9IGkgbW9kICQxMDA7CiAgICAgZW5kOwogICAgIEV4aXQ7CiAgIGVuZDsKIAogICAvLyByYW5kb20gZGlzdHJpYnV0aW9uIG9mIGFsbCAyNTYgdmFsdWVzCiAgIEZpbGxDaGFyKCByZXN1bHRbMF0sIExlbmd0aChyZXN1bHQpICogU2l6ZU9mKHJlc3VsdFswXSksICQwKTsKLSAgaSA6PSAxOwotICB3aGlsZSBpIDwgTGVuZ3RoKHJlc3VsdCkgZG8gYmVnaW4KLSAgICBuZXh0UG9zIDo9IEJ5dGUoIFJhbmRvbSgkMTAwKSk7Ci0gICAgaWYgcmVzdWx0W25leHRQb3NdID0gMCB0aGVuIGJlZ2luICAvLyB1bnVzZWQ/Ci0gICAgICByZXN1bHRbbmV4dFBvc10gOj0gaTsKLSAgICAgIEluYyhpKTsKLSAgICBlbmQ7CisgIGZvciBpIDo9IExvdyhyZXN1bHQpIHRvIEhpZ2gocmVzdWx0KSBkbyBiZWdpbgorICAgIHJlc3VsdFtpXSA6PSBCeXRlKCBSYW5kb20oJDEwMCkpOwogICBlbmQ7CiBlbmQ7CiAKIAoreyRJRkRFRiBXaW42NH0KK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLlVzZUludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NDsKK3ZhciBhLGIgOiBJbnQ2NDsKK2JlZ2luCisgIGEgOj0gMTsKKyAgYiA6PSAyOworICBUaHJpZnQuVXRpbHMuSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCBhLGIpOworICBFeHBlY3QoIGEgPSAzLCAnSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0Jyk7CitlbmQ7Cit7JEVORElGfQorCisKIHByb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkpTT05Qcm90b2NvbFJlYWRXcml0ZVRlc3Q7CiAvLyBUZXN0cyBvbmx5IHRoZW4gcmVhZC93cml0ZSBwcm9jZWR1cmVzIG9mIHRoZSBKU09OIHByb3RvY29sCiAvLyBBbGwgdGVzdHMgc3VjY2VlZCwgaWYgd2UgY2FuIHJlYWQgd2hhdCB3ZSB3cm90ZSBiZWZvcmUKQEAgLTEwMTcsOCArMTA1Miw4IEBACiAvLyBvdGhlciBjbGllbnRzIG9yIHNlcnZlcnMgZXhwZWN0IGFzIHRoZSByZWFsIEpTT04uIFRoaXMgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIHRlc3QuCiB2YXIgcHJvdCAgIDogSVByb3RvY29sOwogICAgIHN0bSAgICA6IFRTdHJpbmdTdHJlYW07Ci0gICAgbGlzdCAgIDogSUxpc3Q7Ci0gICAgYmluYXJ5LCBiaW5SZWFkIDogVEJ5dGVzOworICAgIGxpc3QgICA6IFRUaHJpZnRMaXN0OworICAgIGJpbmFyeSwgYmluUmVhZCwgZW1wdHlCaW5hcnkgOiBUQnl0ZXM7CiAgICAgaSxpRXJyIDogSW50ZWdlcjsKIGNvbnN0CiAgIFRFU1RfU0hPUlQgICA9IFNob3J0SW50KCAkRkUpOwpAQCAtMTAyOCw5ICsxMDYzLDkgQEAKICAgVEVTVF9ET1VCTEUgID0gLTEuMjM0ZS01NjsKICAgREVMVEFfRE9VQkxFID0gVEVTVF9ET1VCTEUgKiAxZS0xNDsKICAgVEVTVF9TVFJJTkcgID0gJ2FiYy0nIyQwMEU0IyQwMGY2IyQwMGZjOyAvLyBnZXJtYW4gdW1sYXV0cyAoZW4tdXM6ICJmdW5ueSBjaGFycyIpCi0gIC8vIFRlc3QgVEhSSUZULTIzMzYgd2l0aCAn0KDRg9GB0YHQutC+0LUg0J3QsNC30LLQsNC90LjQtSc7Ci0gIFJVU1NJQU5fVEVYVCA9ICMkMDQyMCMkMDQ0MyMkMDQ0MSMkMDQ0MSMkMDQzYSMkMDQzZSMkMDQzNScgJyMkMDQxZCMkMDQzMCMkMDQzNyMkMDQzMiMkMDQzMCMkMDQzZCMkMDQzOCMkMDQzNTsKLSAgUlVTU0lBTl9KU09OID0gJyJcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzUgXHUwNDFkXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Iic7CisgIC8vIFRlc3QgVEhSSUZULTIzMzYgYW5kIFRIUklGVC0zNDA0IHdpdGggVSsxRDExRSAoRyBDbGVmIHN5bWJvbCkgYW5kICfQoNGD0YHRgdC60L7QtSDQndCw0LfQstCw0L3QuNC1JzsKKyAgR19DTEVGX0FORF9DWVJJTExJQ19URVhUID0gIyQxZDExZScgJyMkMDQyMCMkMDQ0MyMkMDQ0MSMkMDQ0MSMkMDQzYSMkMDQzZSMkMDQzNScgJyMkMDQxZCMkMDQzMCMkMDQzNyMkMDQzMiMkMDQzMCMkMDQzZCMkMDQzOCMkMDQzNTsKKyAgR19DTEVGX0FORF9DWVJJTExJQ19KU09OID0gJyJcdWQ4MzRcdWRkMWUgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM1IFx1MDQxZFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSInOwogICAvLyB0ZXN0IGJvdGggcG9zc2libGUgc29saWR1cyBlbmNvZGluZ3MKICAgU09MSURVU19KU09OX0RBVEEgPSAnIm9uZS90d29cL3RocmVlIic7CiAgIFNPTElEVVNfRVhDUEVDVEVEID0gJ29uZS90d28vdGhyZWUnOwpAQCAtMTA0MCw3ICsxMDc1LDggQEAKICAgICBTdGFydFRlc3RHcm91cCggJ0pzb25Qcm90b2NvbFRlc3QnLCB0ZXN0X1Vua25vd24pOwogCiAgICAgLy8gcHJlcGFyZSBiaW5hcnkgZGF0YQotICAgIGJpbmFyeSA6PSBQcmVwYXJlQmluYXJ5RGF0YSggRkFMU0UpOworICAgIGJpbmFyeSA6PSBQcmVwYXJlQmluYXJ5RGF0YSggRkFMU0UsIE5vcm1hbCk7CisgICAgU2V0TGVuZ3RoKCBlbXB0eUJpbmFyeSwgMCk7IC8vIGVtcHR5IGJpbmFyeSBkYXRhIGJsb2NrCiAKICAgICAvLyBvdXRwdXQgc2V0dXAKICAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKQEAgLTEwNDgsNyArMTA4NCw4IEBACiAgICAgICAgICAgICAgICAgbmlsLCBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpKSk7CiAKICAgICAvLyB3cml0ZQotICAgIHByb3QuV3JpdGVMaXN0QmVnaW4oIFRMaXN0SW1wbC5DcmVhdGUoIFRUeXBlLlN0cmluZ18sIDkpKTsKKyAgICBJbml0KCBsaXN0LCBUVHlwZS5TdHJpbmdfLCA5KTsKKyAgICBwcm90LldyaXRlTGlzdEJlZ2luKCBsaXN0KTsKICAgICBwcm90LldyaXRlQm9vbCggVFJVRSk7CiAgICAgcHJvdC5Xcml0ZUJvb2woIEZBTFNFKTsKICAgICBwcm90LldyaXRlQnl0ZSggVEVTVF9TSE9SVCk7CkBAIC0xMDU4LDYgKzEwOTUsOCBAQAogICAgIHByb3QuV3JpdGVEb3VibGUoIFRFU1RfRE9VQkxFKTsKICAgICBwcm90LldyaXRlU3RyaW5nKCBURVNUX1NUUklORyk7CiAgICAgcHJvdC5Xcml0ZUJpbmFyeSggYmluYXJ5KTsKKyAgICBwcm90LldyaXRlU3RyaW5nKCAnJyk7ICAvLyBlbXB0eSBzdHJpbmcKKyAgICBwcm90LldyaXRlQmluYXJ5KCBlbXB0eUJpbmFyeSk7IC8vIGVtcHR5IGJpbmFyeSBkYXRhIGJsb2NrCiAgICAgcHJvdC5Xcml0ZUxpc3RFbmQ7CiAKICAgICAvLyBpbnB1dCBzZXR1cApAQCAtMTA4MCw2ICsxMTE5LDggQEAKICAgICBFeHBlY3QoIGFicyhwcm90LlJlYWREb3VibGUtVEVTVF9ET1VCTEUpIDwgYWJzKERFTFRBX0RPVUJMRSksICdXcml0ZURvdWJsZS9SZWFkRG91YmxlJyk7CiAgICAgRXhwZWN0KCBwcm90LlJlYWRTdHJpbmcgPSBURVNUX1NUUklORywgJ1dyaXRlU3RyaW5nL1JlYWRTdHJpbmcnKTsKICAgICBiaW5SZWFkIDo9IHByb3QuUmVhZEJpbmFyeTsKKyAgICBFeHBlY3QoIExlbmd0aChwcm90LlJlYWRTdHJpbmcpID0gMCwgJ1dyaXRlU3RyaW5nL1JlYWRTdHJpbmcgKGVtcHR5IHN0cmluZyknKTsKKyAgICBFeHBlY3QoIExlbmd0aChwcm90LlJlYWRCaW5hcnkpID0gMCwgJ2VtcHR5IFdyaXRlQmluYXJ5L1JlYWRCaW5hcnkgKGVtcHR5IGRhdGEgYmxvY2spJyk7CiAgICAgcHJvdC5SZWFkTGlzdEVuZDsKIAogICAgIC8vIHRlc3QgYmluYXJ5IGRhdGEKQEAgLTExMTcsMjIgKzExNTgsMjIgQEAKICAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKICAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAogICAgICAgICAgICAgICAgIG5pbCwgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKSkpOwotICAgIHByb3QuV3JpdGVTdHJpbmcoIFJVU1NJQU5fVEVYVCk7CisgICAgcHJvdC5Xcml0ZVN0cmluZyggR19DTEVGX0FORF9DWVJJTExJQ19URVhUKTsKICAgICBzdG0uUG9zaXRpb24gOj0gMDsKICAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKICAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAogICAgICAgICAgICAgICAgIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSksIG5pbCkpOwotICAgIEV4cGVjdCggcHJvdC5SZWFkU3RyaW5nID0gUlVTU0lBTl9URVhULCAnV3JpdGluZyBKU09OIHdpdGggY2hhcnMgPiA4IGJpdCcpOworICAgIEV4cGVjdCggcHJvdC5SZWFkU3RyaW5nID0gR19DTEVGX0FORF9DWVJJTExJQ19URVhULCAnV3JpdGluZyBKU09OIHdpdGggY2hhcnMgPiA4IGJpdCcpOwogCiAgICAgLy8gV2lkZWNoYXJzIHNob3VsZCB3b3JrIHdpdGggaGV4LWVuY29kaW5nIHRvby4gRG8gdGhleT8KICAgICBzdG0uUG9zaXRpb24gOj0gMDsKICAgICBzdG0uU2l6ZSAgICAgOj0gMDsKLSAgICBzdG0uV3JpdGVTdHJpbmcoIFJVU1NJQU5fSlNPTik7CisgICAgc3RtLldyaXRlU3RyaW5nKCBHX0NMRUZfQU5EX0NZUklMTElDX0pTT04pOwogICAgIHN0bS5Qb3NpdGlvbiA6PSAwOwogICAgIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKAogICAgICAgICAgICAgICBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoCiAgICAgICAgICAgICAgICAgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKSwgbmlsKSk7Ci0gICAgRXhwZWN0KCBwcm90LlJlYWRTdHJpbmcgPSBSVVNTSUFOX1RFWFQsICdSZWFkaW5nIEpTT04gd2l0aCBjaGFycyA+IDggYml0Jyk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRTdHJpbmcgPSBHX0NMRUZfQU5EX0NZUklMTElDX1RFWFQsICdSZWFkaW5nIEpTT04gd2l0aCBjaGFycyA+IDggYml0Jyk7CiAKIAogICBmaW5hbGx5CkBAIC0xMTcyLDcgKzEyMTMsOCBAQAogICAgIC8vIFdlIGhhdmUgYSBmYWlsZWQgdGVzdCEKICAgICAvLyAtPiBpc3N1ZSBEZWJ1Z0JyZWFrIE9OTFkgaWYgYSBkZWJ1Z2dlciBpcyBhdHRhY2hlZCwKICAgICAvLyAtPiB1bmhhbmRsZWQgRGVidWdCcmVha3Mgd291bGQgY2F1c2UgV2luZG93cyB0byB0ZXJtaW5hdGUgdGhlIGFwcCBvdGhlcndpc2UKLSAgICBpZiBJc0RlYnVnZ2VyUHJlc2VudCB0aGVuIGFzbSBpbnQgMyBlbmQ7CisgICAgaWYgSXNEZWJ1Z2dlclByZXNlbnQKKyAgICB0aGVuIHskSUZERUYgQ1BVWDY0fSBEZWJ1Z0JyZWFrIHskRUxTRX0gYXNtIGludCAzIGVuZCB7JEVORElGfTsKICAgZW5kOwogZW5kOwogCkBAIC0xMjE1LDEyICsxMjU3LDExIEBACiBlbmQ7CiAKIAotY29uc3RydWN0b3IgVENsaWVudFRocmVhZC5DcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7IGNvbnN0IEFQcm90b2NvbCA6IElQcm90b2NvbDsgQU51bUl0ZXJhdGlvbjogSW50ZWdlcik7Citjb25zdHJ1Y3RvciBUQ2xpZW50VGhyZWFkLkNyZWF0ZSggY29uc3QgYVNldHVwIDogVFRlc3RTZXR1cDsgY29uc3QgYU51bUl0ZXJhdGlvbjogSW50ZWdlcik7CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKCBUcnVlICk7CisgIEZTZXR1cCA6PSBhU2V0dXA7CiAgIEZOdW1JdGVyYXRpb24gOj0gQU51bUl0ZXJhdGlvbjsKLSAgRlRyYW5zcG9ydCA6PSBBVHJhbnNwb3J0OwotICBGUHJvdG9jb2wgOj0gQVByb3RvY29sOworCiAgIEZDb25zb2xlIDo9IFRUaHJlYWRDb25zb2xlLkNyZWF0ZSggU2VsZiApOwogICBGQ3VycmVudFRlc3QgOj0gdGVzdF9Vbmtub3duOwogCkBAIC0xMjI4LDYgKzEyNjksOCBAQAogICBGRXJyb3JzIDo9IFRTdHJpbmdMaXN0LkNyZWF0ZTsKICAgRkVycm9ycy5Tb3J0ZWQgOj0gRkFMU0U7CiAgIEZFcnJvcnMuRHVwbGljYXRlcyA6PSBkdXBBY2NlcHQ7CisKKyAgaW5oZXJpdGVkIENyZWF0ZSggVFJVRSk7CiBlbmQ7CiAKIGRlc3RydWN0b3IgVENsaWVudFRocmVhZC5EZXN0cm95OwpAQCAtMTI0MCwzNCArMTI4MywxMzYgQEAKIHByb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkV4ZWN1dGU7CiB2YXIKICAgaSA6IEludGVnZXI7Ci0gIHByb2MgOiBUVGhyZWFkUHJvY2VkdXJlOwogYmVnaW4KICAgLy8gcGVyZm9ybSBhbGwgdGVzdHMKICAgdHJ5CisgICAgeyRJRkRFRiBXaW42NH0KKyAgICBVc2VJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQ7CisgICAgeyRFTkRJRn0KICAgICBKU09OUHJvdG9jb2xSZWFkV3JpdGVUZXN0OwotICAgIGZvciBpIDo9IDAgdG8gRk51bUl0ZXJhdGlvbiAtIDEgZG8KLSAgICBiZWdpbgotICAgICAgQ2xpZW50VGVzdDsKKworICAgIC8vIG11c3QgYmUgcnVuIGluIHRoZSBjb250ZXh0IG9mIHRoZSB0aHJlYWQKKyAgICBJbml0aWFsaXplUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKKyAgICB0cnkKKyAgICAgIGZvciBpIDo9IDAgdG8gRk51bUl0ZXJhdGlvbiAtIDEgZG8gYmVnaW4KKyAgICAgICAgQ2xpZW50VGVzdDsKKyAgICAgICAgeyRJRkRFRiBTdXBwb3J0c0FzeW5jfQorICAgICAgICBDbGllbnRBc3luY1Rlc3Q7CisgICAgICAgIHskRU5ESUZ9CisgICAgICBlbmQ7CisKKyAgICAgIC8vIHJlcG9ydCB0aGUgb3V0Y29tZQorICAgICAgUmVwb3J0UmVzdWx0czsKKyAgICAgIFNldFJldHVyblZhbHVlKCBDYWxjdWxhdGVFeGl0Q29kZSk7CisKKyAgICBmaW5hbGx5CisgICAgICBTaHV0ZG93blByb3RvY29sVHJhbnNwb3J0U3RhY2s7CiAgICAgZW5kOworCiAgIGV4Y2VwdAogICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICd1bmV4cGVjdGVkIGV4Y2VwdGlvbjogIicrZS5tZXNzYWdlKyciJyk7CiAgIGVuZDsKK2VuZDsKIAotICAvLyByZXBvcnQgdGhlIG91dGNvbWUKLSAgUmVwb3J0UmVzdWx0czsKLSAgU2V0UmV0dXJuVmFsdWUoIENhbGN1bGF0ZUV4aXRDb2RlKTsKIAotICAvLyBzaHV0ZG93bgotICBwcm9jIDo9IHByb2NlZHVyZQotICBiZWdpbgotICAgIGlmIEZUcmFuc3BvcnQgPD4gbmlsIHRoZW4KLSAgICBiZWdpbgorcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuSW5pdGlhbGl6ZVByb3RvY29sVHJhbnNwb3J0U3RhY2s7Cit2YXIKKyAgc3RyZWFtdHJhbnMgOiBJU3RyZWFtVHJhbnNwb3J0OworICBodHRwIDogSUhUVFBDbGllbnQ7CisgIHNVcmwgOiBzdHJpbmc7Citjb25zdAorICBERUJVR19USU1FT1VUICAgPSAzMCAqIDEwMDA7CisgIFJFTEVBU0VfVElNRU9VVCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgIFBJUEVfVElNRU9VVCAgICA9IFJFTEVBU0VfVElNRU9VVDsKKyAgSFRUUF9USU1FT1VUUyAgID0gMTAgKiAxMDAwOworYmVnaW4KKyAgLy8gbmVlZGVkIGZvciBIVFRQIGNsaWVudHMgYXMgdGhleSB1dGlsaXplIHRoZSBNU1hNTCBDT00gY29tcG9uZW50cworICBPbGVDaGVjayggQ29Jbml0aWFsaXplKCBuaWwpKTsKKworICBjYXNlIEZTZXR1cC5lbmRwb2ludCBvZgorICAgIHRybnNfU29ja2V0czogYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBzb2NrZXRzICgnK0ZTZXR1cC5ob3N0KycgcG9ydCAnK0ludFRvU3RyKEZTZXR1cC5wb3J0KSsnKScpOworICAgICAgc3RyZWFtdHJhbnMgOj0gVFNvY2tldEltcGwuQ3JlYXRlKCBGU2V0dXAuaG9zdCwgRlNldHVwLnBvcnQgKTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gc3RyZWFtdHJhbnM7CisgICAgZW5kOworCisgICAgdHJuc19IdHRwOiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIEhUVFBDbGllbnQnKTsKKyAgICAgIGlmIEZTZXR1cC51c2VTU0wKKyAgICAgIHRoZW4gc1VybCA6PSAnaHR0cDovLycKKyAgICAgIGVsc2Ugc1VybCA6PSAnaHR0cHM6Ly8nOworICAgICAgc1VybCA6PSBzVXJsICsgRlNldHVwLmhvc3Q7CisgICAgICBjYXNlIEZTZXR1cC5wb3J0IG9mCisgICAgICAgIDgwICA6IGlmIEZTZXR1cC51c2VTU0wgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgICAgNDQzIDogaWYgbm90IEZTZXR1cC51c2VTU0wgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgRlNldHVwLnBvcnQgPiAwIHRoZW4gc1VybCA6PSBzVXJsICsgJzonKyBJbnRUb1N0cihGU2V0dXAucG9ydCk7CisgICAgICBlbmQ7CisgICAgICBodHRwIDo9IFRIVFRQQ2xpZW50SW1wbC5DcmVhdGUoIHNVcmwpOworICAgICAgaHR0cC5EbnNSZXNvbHZlVGltZW91dCA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5Db25uZWN0aW9uVGltZW91dCA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5TZW5kVGltZW91dCAgICAgICA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5SZWFkVGltZW91dCAgICAgICA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgRlRyYW5zcG9ydCA6PSBodHRwOworICAgIGVuZDsKKworICAgIHRybnNfRXZIdHRwOiBiZWdpbgorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZShFTkRQT0lOVF9UUkFOU1BPUlRTW0ZTZXR1cC5lbmRwb2ludF0rJyB0cmFuc3BvcnQgbm90IGltcGxlbWVudGVkJyk7CisgICAgZW5kOworCisgICAgdHJuc19OYW1lZFBpcGVzOiBiZWdpbgorICAgICAgc3RyZWFtdHJhbnMgOj0gVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwuQ3JlYXRlKCBGU2V0dXAuc1BpcGVOYW1lLCAwLCBuaWwsIFBJUEVfVElNRU9VVCwgUElQRV9USU1FT1VUKTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gc3RyZWFtdHJhbnM7CisgICAgZW5kOworCisgICAgdHJuc19Bbm9uUGlwZXM6IGJlZ2luCisgICAgICBzdHJlYW10cmFucyA6PSBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBGU2V0dXAuaEFub25SZWFkLCBGU2V0dXAuaEFub25Xcml0ZSwgRkFMU0UpOworICAgICAgRlRyYW5zcG9ydCA6PSBzdHJlYW10cmFuczsKKyAgICBlbmQ7CisKKyAgZWxzZQorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBlbmRwb2ludCB0cmFuc3BvcnQnKTsKKyAgZW5kOworICBBU1NFUlQoIEZUcmFuc3BvcnQgPD4gbmlsKTsKKworICAvLyBsYXllcmVkIHRyYW5zcG9ydHMgYXJlIG5vdCByZWFsbHkgbWVhbnQgdG8gYmUgc3RhY2tlZCB1cG9uIGVhY2ggb3RoZXIKKyAgaWYgKHRybnNfRnJhbWVkIGluIEZTZXR1cC5sYXllcmVkKSB0aGVuIGJlZ2luCisgICAgRlRyYW5zcG9ydCA6PSBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQpOworICBlbmQKKyAgZWxzZSBpZiAodHJuc19CdWZmZXJlZCBpbiBGU2V0dXAubGF5ZXJlZCkgYW5kIChzdHJlYW10cmFucyA8PiBuaWwpIHRoZW4gYmVnaW4KKyAgICBGVHJhbnNwb3J0IDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBzdHJlYW10cmFucywgMzIpOyAgLy8gc21hbGwgYnVmZmVyIHRvIHRlc3QgcmVhZCgpCisgIGVuZDsKKworICBpZiBGU2V0dXAudXNlU1NMIHRoZW4gYmVnaW4KKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdTU0wvVExTIG5vdCBpbXBsZW1lbnRlZCcpOworICBlbmQ7CisKKyAgLy8gY3JlYXRlIHByb3RvY29sIGluc3RhbmNlLCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCisgIGNhc2UgRlNldHVwLnByb3RUeXBlIG9mCisgICAgcHJvdF9CaW5hcnkgIDogIEZQcm90b2NvbCA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCwgQklOQVJZX1NUUklDVF9SRUFELCBCSU5BUllfU1RSSUNUX1dSSVRFKTsKKyAgICBwcm90X0pTT04gICAgOiAgRlByb3RvY29sIDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCk7CisgICAgcHJvdF9Db21wYWN0IDogIEZQcm90b2NvbCA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQpOworICBlbHNlCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIHByb3RvY29sJyk7CisgIGVuZDsKKworICBBU1NFUlQoIChGVHJhbnNwb3J0IDw+IG5pbCkgYW5kIChGUHJvdG9jb2wgPD4gbmlsKSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuU2h1dGRvd25Qcm90b2NvbFRyYW5zcG9ydFN0YWNrOworYmVnaW4KKyAgdHJ5CisgICAgRlByb3RvY29sIDo9IG5pbDsKKworICAgIGlmIEZUcmFuc3BvcnQgPD4gbmlsIHRoZW4gYmVnaW4KICAgICAgIEZUcmFuc3BvcnQuQ2xvc2U7CiAgICAgICBGVHJhbnNwb3J0IDo9IG5pbDsKICAgICBlbmQ7Ci0gIGVuZDsKIAotICBTeW5jaHJvbml6ZSggcHJvYyApOworICBmaW5hbGx5CisgICAgQ29VbmluaXRpYWxpemU7CisgIGVuZDsKIGVuZDsKIAogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlci5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlci5wYXMKaW5kZXggMDE4MjgyYy4uNjljYjE3NSAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXIucGFzCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyLnBhcwpAQCAtMTksNiArMTksNyBAQAogCiB1bml0IFRlc3RTZXJ2ZXI7CiAKK3skSSAuLi9zcmMvVGhyaWZ0LkRlZmluZXMuaW5jfQogeyRXQVJOIFNZTUJPTF9QTEFURk9STSBPRkZ9CiAKIHsuJERFRklORSBSdW5FbmRsZXNzfSAgIC8vIGFjdGl2YXRlIHRvIGludGVyYWN0aXZlbHkgc3RyZXNzLXRlc3QgdGhlIHNlcnZlciBzdG9wIHJvdXRpbmVzIHZpYSBDdHJsK0MKQEAgLTI4LDcgKzI5LDYgQEAKIHVzZXMKICAgV2luZG93cywgU3lzVXRpbHMsCiAgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAotICBUaHJpZnQuQ29uc29sZSwKICAgVGhyaWZ0LlNlcnZlciwKICAgVGhyaWZ0LlRyYW5zcG9ydCwKICAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcywKQEAgLTQxLDYgKzQxLDcgQEAKICAgVGhyaWZ0LAogICBUZXN0Q29uc3RhbnRzLAogICBUZXN0U2VydmVyRXZlbnRzLAorICBDb25zb2xlSGVscGVyLAogICBDb250bnJzOwogCiB0eXBlCkBAIC0xNjMsNyArMTY0LDcgQEAKIAogICBpZiAoYXJnID0gJ1RFeGNlcHRpb24nKSB0aGVuCiAgIGJlZ2luCi0gICAgcmFpc2UgVEV4Y2VwdGlvbi5DcmVhdGUoJycpOworICAgIHJhaXNlIFRFeGNlcHRpb24uQ3JlYXRlKCdURXhjZXB0aW9uJyk7CiAgIGVuZDsKIAogICAvLyBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZwpAQCAtMTg0LDQ0ICsxODUsMzMgQEAKIGZ1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEluc2FuaXR5KAogICBjb25zdCBhcmd1bWVudDogSUluc2FuaXR5KTogSVRocmlmdERpY3Rpb25hcnk8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+PjsKIHZhcgotICBoZWxsbywgZ29vZGJ5ZSA6IElYdHJ1Y3Q7Ci0gIGNyYXp5IDogSUluc2FuaXR5OwogICBsb29uZXkgOiBJSW5zYW5pdHk7CiAgIGZpcnN0X21hcCA6IElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+OwogICBzZWNvbmRfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CiAgIGluc2FuZSA6IElUaHJpZnREaWN0aW9uYXJ5PEludDY0LCBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5Pj47CiAKIGJlZ2luCi0KICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RJbnNhbml0eSgpJyk7Ci0gIGhlbGxvIDo9IFRYdHJ1Y3RJbXBsLkNyZWF0ZTsKLSAgaGVsbG8uU3RyaW5nX3RoaW5nIDo9ICdIZWxsbzInOwotICBoZWxsby5CeXRlX3RoaW5nIDo9IDI7Ci0gIGhlbGxvLkkzMl90aGluZyA6PSAyOwotICBoZWxsby5JNjRfdGhpbmcgOj0gMjsKIAotICBnb29kYnllIDo9IFRYdHJ1Y3RJbXBsLkNyZWF0ZTsKLSAgZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgOj0gJ0dvb2RieWU0JzsKLSAgZ29vZGJ5ZS5CeXRlX3RoaW5nIDo9IDQ7Ci0gIGdvb2RieWUuSTMyX3RoaW5nIDo9IDQ7Ci0gIGdvb2RieWUuSTY0X3RoaW5nIDo9IDQ7Ci0KLSAgY3JhenkgOj0gVEluc2FuaXR5SW1wbC5DcmVhdGU7Ci0gIGNyYXp5LlVzZXJNYXAgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPFROdW1iZXJ6LCBJbnQ2ND4uQ3JlYXRlOwotICBjcmF6eS5Vc2VyTWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LkVJR0hULCA4KTsKLSAgY3JhenkuWHRydWN0cyA6PSBUVGhyaWZ0TGlzdEltcGw8SVh0cnVjdD4uQ3JlYXRlOwotICBjcmF6eS5YdHJ1Y3RzLkFkZChnb29kYnllKTsKLQotICBsb29uZXkgOj0gVEluc2FuaXR5SW1wbC5DcmVhdGU7Ci0gIGNyYXp5LlVzZXJNYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouRklWRSwgNSk7Ci0gIGNyYXp5Llh0cnVjdHMuQWRkKGhlbGxvKTsKKyAgKCoqCisgICAqIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworICAgKgorICAgKiBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKyAgICogICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgIH0sCisgICAqICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICogICB9CisgICAqIEByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworICAgKikKIAogICBmaXJzdF9tYXAgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPFROdW1iZXJ6LCBJSW5zYW5pdHk+LkNyZWF0ZTsKICAgc2Vjb25kX21hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIElJbnNhbml0eT4uQ3JlYXRlOwogCi0gIGZpcnN0X21hcC5BZGRPclNldFZhbHVlKCBUTnVtYmVyei5UV08sIGNyYXp5KTsKLSAgZmlyc3RfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlRIUkVFLCBjcmF6eSk7CisgIGZpcnN0X21hcC5BZGRPclNldFZhbHVlKCBUTnVtYmVyei5UV08sIGFyZ3VtZW50KTsKKyAgZmlyc3RfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlRIUkVFLCBhcmd1bWVudCk7CiAKKyAgbG9vbmV5IDo9IFRJbnNhbml0eUltcGwuQ3JlYXRlOwogICBzZWNvbmRfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlNJWCwgbG9vbmV5KTsKIAogICBpbnNhbmUgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPEludDY0LCBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5Pj4uQ3JlYXRlOwpAQCAtNjYxLDcgKzY1MSw3IEBACiAgICAgICBlbmQ7CiAKICAgICAgIHRybnNfSHR0cCA6IGJlZ2luCi0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ0hUVFAgc2VydmVyIHRyYW5zcG9ydCBub3QgaW1wbGVtZW50ZWQnKTsKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZShFTkRQT0lOVF9UUkFOU1BPUlRTW2VuZHBvaW50XSsnIHNlcnZlciB0cmFuc3BvcnQgbm90IGltcGxlbWVudGVkJyk7CiAgICAgICBlbmQ7CiAKICAgICAgIHRybnNfTmFtZWRQaXBlcyA6IGJlZ2luCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlckV2ZW50cy5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlckV2ZW50cy5wYXMKaW5kZXggMmU3NzZkMi4uMjIwOGNkNCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXJFdmVudHMucGFzCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyRXZlbnRzLnBhcwpAQCAtMjcsNyArMjcsNyBAQAogICBUaHJpZnQuUHJvdG9jb2wsCiAgIFRocmlmdC5UcmFuc3BvcnQsCiAgIFRocmlmdC5TZXJ2ZXIsCi0gIFRocmlmdC5Db25zb2xlOworICBDb25zb2xlSGVscGVyOwogCiB0eXBlCiAgIFRSZXF1ZXN0RXZlbnRzSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVJlcXVlc3RFdmVudHMpCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvY2xpZW50LmRwciBiL2xpYi9kZWxwaGkvdGVzdC9jbGllbnQuZHByCmluZGV4IDY5ZTQ0YzIuLjA2ZGJkM2QgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC9jbGllbnQuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9jbGllbnQuZHByCkBAIC0yOCwxNCArMjgsMTYgQEAKICAgVGhyaWZ0LlRlc3QsIC8vIGluICdnZW4tZGVscGhpXFRocmlmdC5UZXN0LnBhcycsCiAgIFRocmlmdCBpbiAnLi5cc3JjXFRocmlmdC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzIGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKICAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXggaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAogICBUaHJpZnQuU2VydmVyIGluICcuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAogICBUaHJpZnQuU3RyZWFtIGluICcuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCiAgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnOwogCkBAIC00NCwxOSArNDYsMTkgQEAKICAgYXJncyA6IGFycmF5IG9mIHN0cmluZzsKICAgaSA6IEludGVnZXI7CiAgIGFyZyA6IHN0cmluZzsKLSAgcyA6IHN0cmluZzsKIAogYmVnaW4KICAgdHJ5CiAgICAgV3JpdGVsbiggJ0RlbHBoaSBUZXN0Q2xpZW50ICcrVGhyaWZ0LlZlcnNpb24pOwogICAgIG5QYXJhbUNvdW50IDo9IFBhcmFtQ291bnQ7CiAgICAgU2V0TGVuZ3RoKCBhcmdzLCBuUGFyYW1Db3VudCk7Ci0gICAgZm9yIGkgOj0gMSB0byBuUGFyYW1Db3VudCBkbwotICAgIGJlZ2luCisgICAgZm9yIGkgOj0gMSB0byBuUGFyYW1Db3VudCBkbyBiZWdpbgogICAgICAgYXJnIDo9IFBhcmFtU3RyKCBpICk7CiAgICAgICBhcmdzW2ktMV0gOj0gYXJnOwogICAgIGVuZDsKKwogICAgIEV4aXRDb2RlIDo9IFRUZXN0Q2xpZW50LkV4ZWN1dGUoIGFyZ3MpOworCiAgIGV4Y2VwdAogICAgIG9uIEU6IEVBYm9ydCBkbyBiZWdpbgogICAgICAgRXhpdENvZGUgOj0gJEZGOwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQgYi9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9SZXNlcnZlZEtleXdvcmRzLnRocmlmdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwYWRmOS4uMDAwMDAwMAotLS0gYS9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9SZXNlcnZlZEtleXdvcmRzLnRocmlmdAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gbWFrZSBzdXJlIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHByb2R1Y2UgbmFtZSBjb2xsaXNpb25zIHdpdGggcHJlZGVmaW5lZCBrZXl3b3JkcwotCi0KLQotdHlwZWRlZiBpMzIgQ2FyZGluYWwKLXR5cGVkZWYgc3RyaW5nIG1lc3NhZ2UKLXR5cGVkZWYgbGlzdDwgbWFwPCBDYXJkaW5hbCwgbWVzc2FnZT4+IHByb2dyYW0KLQotc3RydWN0IHVuaXQgewotICAxOiBDYXJkaW5hbCBkb3dudG87Ci0gIDI6IHByb2dyYW0gcHJvY2VkdXJlOwotfQotCi10eXBlZGVmIHNldDwgdW5pdD4gdW5pdHMKLQotZXhjZXB0aW9uIGV4Y2VwdGlvbjEgewotICAxOiBwcm9ncmFtIG1lc3NhZ2U7Ci0gIDI6IHVuaXQgYXJyYXk7Ci19Ci0KLXNlcnZpY2UgY29uc3RydWN0b3IgewotICB1bml0IENyZWF0ZSgxOiBDYXJkaW5hbCBhc207IDI6IG1lc3NhZ2UgaW5oZXJpdGVkKSB0aHJvd3MgKDE6IGV4Y2VwdGlvbjEgbGFiZWwpOwotICB1bml0cyBEZXN0cm95KCk7Ci19Ci0KLWNvbnN0IENhcmRpbmFsIGRvd250byA9ICsxCi1jb25zdCBDYXJkaW5hbCBwdWJsaXNoZWQgPSAtMQotCi1lbnVtIGtleXdvcmRzIHsKLSAgcmVjb3JkID0gMSwKLSAgcmVwZWF0ID0gMiwKLSAgZGVwcmVjYXRlZCA9IDMKLX0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEluY2x1ZGVkLnRocmlmdCBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEluY2x1ZGVkLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQ3YTUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkSW5jbHVkZWQudGhyaWZ0CkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gbWFrZSBzdXJlIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHByb2R1Y2UgbmFtZSBjb2xsaXNpb25zIHdpdGggcHJlZGVmaW5lZCBrZXl3b3JkcworbmFtZXNwYWNlIGRlbHBoaSBTeXNVdGlscworCitjb25zdCBpMzIgaW50ZWdlciA9IDQyCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYmM4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHIKQEAgLTAsMCArMSwxNSBAQAorcHJvZ3JhbSBSZXNlcnZlZEtleXdvcmRzOworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBTeXNVdGlscywgU3lzdGVtXzsKKworYmVnaW4KKyAgdHJ5CisgICAgeyBUT0RPIC1vVXNlciAtY0NvbnNvbGUgTWFpbiA6IENvZGUgaGllciBlaW5m/GdlbiB9CisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbworICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgZW5kOworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByb2ogYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQ5NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByb2oKQEAgLTAsMCArMSwxMTIgQEAKK++7vwk8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKwkJPFByb3BlcnR5R3JvdXA+CisJCQk8UHJvamVjdEd1aWQ+e0YyRTlCNkZDLUE5MzEtNDI3MS04RTMwLTVBNEU0MDI0ODFCNH08L1Byb2plY3RHdWlkPgorCQkJPE1haW5Tb3VyY2U+UmVzZXJ2ZWRLZXl3b3Jkcy5kcHI8L01haW5Tb3VyY2U+CisJCQk8UHJvamVjdFZlcnNpb24+MTIuMzwvUHJvamVjdFZlcnNpb24+CisJCQk8QmFzaXM+VHJ1ZTwvQmFzaXM+CisJCQk8Q29uZmlnIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PScnIj5EZWJ1ZzwvQ29uZmlnPgorCQkJPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKwkJCTxBcHBUeXBlPkNvbnNvbGU8L0FwcFR5cGU+CisJCQk8RnJhbWV3b3JrVHlwZT5Ob25lPC9GcmFtZXdvcmtUeXBlPgorCQkJPERDQ19EQ0NDb21waWxlcj5EQ0MzMjwvRENDX0RDQ0NvbXBpbGVyPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNpcycgb3IgJyQoQmFzZSknIT0nJyI+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPgorCQkJPENmZ18xPnRydWU8L0NmZ18xPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+CisJCQk8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KKwkJCTxEQ0NfSW1hZ2VCYXNlPjAwNDAwMDAwPC9EQ0NfSW1hZ2VCYXNlPgorCQkJPERDQ19EY3VPdXRwdXQ+LlwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19EY3VPdXRwdXQ+CisJCQk8RENDX1VuaXRTZWFyY2hQYXRoPmdlbi1kZWxwaGk7Li5cLi5cc3JjOyQoRENDX1VuaXRTZWFyY2hQYXRoKTwvRENDX1VuaXRTZWFyY2hQYXRoPgorCQkJPERDQ19Vbml0QWxpYXM+V2luVHlwZXM9V2luZG93cztXaW5Qcm9jcz1XaW5kb3dzO0RiaVR5cGVzPUJERTtEYmlQcm9jcz1CREU7JChEQ0NfVW5pdEFsaWFzKTwvRENDX1VuaXRBbGlhcz4KKwkJCTxEQ0NfRXhlT3V0cHV0Pi5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgorCQkJPERDQ19OPmZhbHNlPC9EQ0NfTj4KKwkJCTxEQ0NfUz5mYWxzZTwvRENDX1M+CisJCQk8RENDX0s+ZmFsc2U8L0RDQ19LPgorCQkJPERDQ19FPmZhbHNlPC9EQ0NfRT4KKwkJCTxEQ0NfRj5mYWxzZTwvRENDX0Y+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+CisJCQk8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgorCQkJPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgorCQkJPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgorCQkJPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgorCQkJPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8SXRlbUdyb3VwPgorCQkJPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iUmVzZXJ2ZWRLZXl3b3Jkcy5kcHIiPgorCQkJCTxNYWluU291cmNlPk1haW5Tb3VyY2U8L01haW5Tb3VyY2U+CisJCQk8L0RlbHBoaUNvbXBpbGU+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UiPgorCQkJCTxLZXk+Q2ZnXzI8L0tleT4KKwkJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJCYXNpcyI+CisJCQkJPEtleT5CYXNlPC9LZXk+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWciPgorCQkJCTxLZXk+Q2ZnXzE8L0tleT4KKwkJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQk8L0l0ZW1Hcm91cD4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cycpIiBQcm9qZWN0PSIkKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzIi8+CisJCTxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2onKSIgUHJvamVjdD0iJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaiIvPgorCQk8UHJvcGVydHlHcm91cD4KKwkJCTxQcmVCdWlsZEV2ZW50PjwhW0NEQVRBW3RocmlmdCAtciAgLWdlbiBkZWxwaGkgUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnRdXT48L1ByZUJ1aWxkRXZlbnQ+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb2plY3RFeHRlbnNpb25zPgorCQkJPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVscGhpLlBlcnNvbmFsaXR5LjEyPC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgorCQkJPEJvcmxhbmQuUHJvamVjdFR5cGUvPgorCQkJPEJvcmxhbmRQcm9qZWN0PgorCQkJCTxEZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJCTxWZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4xPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUmVsZWFzZSI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJlUmVsZWFzZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iRExMIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMxPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+CisJCQkJCTwvVmVyc2lvbkluZm8+CisJCQkJCTxWZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiLz4KKwkJCQkJPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCTxTb3VyY2U+CisJCQkJCQk8U291cmNlIE5hbWU9Ik1haW5Tb3VyY2UiPlJlc2VydmVkS2V5d29yZHMuZHByPC9Tb3VyY2U+CisJCQkJCTwvU291cmNlPgorCQkJCTwvRGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCTxQbGF0Zm9ybXM+CisJCQkJCTxQbGF0Zm9ybSB2YWx1ZT0iV2luMzIiPlRydWU8L1BsYXRmb3JtPgorCQkJCTwvUGxhdGZvcm1zPgorCQkJPC9Cb3JsYW5kUHJvamVjdD4KKwkJCTxQcm9qZWN0RmlsZVZlcnNpb24+MTI8L1Byb2plY3RGaWxlVmVyc2lvbj4KKwkJPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKwk8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY0OWQ3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLnRocmlmdApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBtYWtlIHN1cmUgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgcHJvZHVjZSBuYW1lIGNvbGxpc2lvbnMgd2l0aCBwcmVkZWZpbmVkIGtleXdvcmRzCituYW1lc3BhY2UgZGVscGhpIFN5c3RlbQorCitpbmNsdWRlICJSZXNlcnZlZEluY2x1ZGVkLnRocmlmdCIKKworCit0eXBlZGVmIGkzMiBDYXJkaW5hbAordHlwZWRlZiBzdHJpbmcgbWVzc2FnZQordHlwZWRlZiBsaXN0PCBtYXA8IENhcmRpbmFsLCBtZXNzYWdlPj4gcHJvZ3JhbQorCitzdHJ1Y3QgdW5pdCB7CisgIDE6IENhcmRpbmFsIGRvd250bzsKKyAgMjogcHJvZ3JhbSBwcm9jZWR1cmU7Cit9CisKK3R5cGVkZWYgc2V0PCB1bml0PiB1bml0cworCitleGNlcHRpb24gZXhjZXB0aW9uMSB7CisgIDE6IHByb2dyYW0gbWVzc2FnZTsKKyAgMjogdW5pdCBhcnJheTsKK30KKworc2VydmljZSBjb25zdHJ1Y3RvciB7CisgIHVuaXQgQ3JlYXRlKDE6IENhcmRpbmFsIGFzbTsgMjogbWVzc2FnZSBpbmhlcml0ZWQpIHRocm93cyAoMTogZXhjZXB0aW9uMSBsYWJlbCk7CisgIHVuaXRzIERlc3Ryb3koKTsKK30KKworY29uc3QgQ2FyZGluYWwgZG93bnRvID0gKzEKK2NvbnN0IENhcmRpbmFsIHB1Ymxpc2hlZCA9IC0xCisKK2VudW0ga2V5d29yZHMgeworICByZWNvcmQgPSAxLAorICByZXBlYXQgPSAyLAorICBkZXByZWNhdGVkID0gMworfQorCisKK3N0cnVjdCBTdHJ1Y3RfbGlzdHMgeworICAxOiBsaXN0PFN0cnVjdF9zaW1wbGU+IGluaXQ7CisgIDI6IGxpc3Q8U3RydWN0X3NpbXBsZT4gc3RydWM7CisgIDM6IGxpc3Q8U3RydWN0X3NpbXBsZT4gZmllbGQ7CisgIDQ6IGxpc3Q8U3RydWN0X3NpbXBsZT4gZmllbGRfOworICA1OiBsaXN0PFN0cnVjdF9zaW1wbGU+IHRyYWNrZXI7CisgIDY6IGxpc3Q8U3RydWN0X3NpbXBsZT4gU2VsZjsKK30KKworc3RydWN0IFN0cnVjdF9zdHJ1Y3RzIHsKKyAgMTogU3RydWN0X3NpbXBsZSBpbml0OworICAyOiBTdHJ1Y3Rfc2ltcGxlIHN0cnVjOworICAzOiBTdHJ1Y3Rfc2ltcGxlIGZpZWxkOworICA0OiBTdHJ1Y3Rfc2ltcGxlIGZpZWxkXzsKKyAgNTogU3RydWN0X3NpbXBsZSB0cmFja2VyOworICA2OiBTdHJ1Y3Rfc2ltcGxlIFNlbGY7Cit9CisKK3N0cnVjdCBTdHJ1Y3Rfc2ltcGxlIHsKKyAgMTogYm9vbCBpbml0OworICAyOiBib29sIHN0cnVjOworICAzOiBib29sIGZpZWxkOworICA0OiBib29sIGZpZWxkXzsKKyAgNTogYm9vbCB0cmFja2VyOworICA2OiBib29sIFNlbGY7Cit9CisKK3N0cnVjdCBTdHJ1Y3Rfc3RyaW5ncyB7CisgIDE6IHN0cmluZyBpbml0OworICAyOiBzdHJpbmcgc3RydWM7CisgIDM6IHN0cmluZyBmaWVsZDsKKyAgNDogc3RyaW5nIGZpZWxkXzsKKyAgNTogc3RyaW5nIHRyYWNrZXI7CisgIDY6IHN0cmluZyBTZWxmOworfQorCitzdHJ1Y3QgU3RydWN0X2JpbmFyeSB7CisgIDE6IGJpbmFyeSBpbml0OworICAyOiBiaW5hcnkgc3RydWM7CisgIDM6IGJpbmFyeSBmaWVsZDsKKyAgNDogYmluYXJ5IGZpZWxkXzsKKyAgNTogYmluYXJ5IHRyYWNrZXI7CisgIDY6IGJpbmFyeSBTZWxmOworfQorCisKK3R5cGVkZWYgaTMyIElQcm90b2NvbCAKK3R5cGVkZWYgaTMyIElUcmFuc3BvcnQKK3R5cGVkZWYgaTMyIElGYWNlCit0eXBlZGVmIGkzMiBJQXN5bmMKK3R5cGVkZWYgaTMyIFN5c3RlbQordHlwZWRlZiBpMzIgU3lzVXRpbHMKK3R5cGVkZWYgaTMyIEdlbmVyaWNzCit0eXBlZGVmIGkzMiBUaHJpZnQKKworc3RydWN0IFN0cnVjdF9UaHJpZnRfTmFtZXMgeworICAxOiBJUHJvdG9jb2wgICBJUHJvdG9jb2wKKyAgMjogSVRyYW5zcG9ydCAgSVRyYW5zcG9ydAorICAzOiBJRmFjZSAgICAgICBJRmFjZQorICA0OiBJQXN5bmMgICAgICBJQXN5bmMKKyAgNTogU3lzdGVtICAgICAgU3lzdGVtCisgIDY6IFN5c1V0aWxzICAgIFN5c1V0aWxzCisgIDc6IEdlbmVyaWNzICAgIEdlbmVyaWNzCisgIDg6IFRocmlmdCAgICAgIFRocmlmdAorfQorCisKK2VudW0gVGhyaWZ0NDU1NF9FbnVtIHsKKyAgRm9vID0gMCwKKyAgQmFyID0gMSwKKyAgQmF6ID0gMiwKK30KKworc3RydWN0IFRocmlmdDQ1NTRfU3RydWN0IHsKKyAgMSA6IG9wdGlvbmFsIGRvdWJsZSBNaW5WYWx1ZQorICAyIDogb3B0aW9uYWwgZG91YmxlIE1heFZhbHVlCisgIDMgOiBvcHRpb25hbCBib29sIEludGVnZXIgIC8vIGNhdXNlcyBpc3N1ZQorICA0IDogb3B0aW9uYWwgVGhyaWZ0NDU1NF9FbnVtIEZvbworfQorCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5TZXJ2ZXIuTWFpbi5wYXMgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcwppbmRleCAzN2Y4NGJiLi4zODYwZjVhIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcworKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcwpAQCAtMjgsNyArMjgsNiBAQAogdXNlcwogICBXaW5kb3dzLCBTeXNVdGlscywKICAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCi0gIFRocmlmdC5Db25zb2xlLAogICBUaHJpZnQuU2VydmVyLAogICBUaHJpZnQuVHJhbnNwb3J0LAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLApAQCAtNDEsNiArNDAsNyBAQAogICBCZW5jaG1hcmssICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgogICBBZ2dyLCAgICAgICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgogICBNdWx0aXBsZXguVGVzdC5Db21tb24sCisgIENvbnNvbGVIZWxwZXIsCiAgIENvbnRucnM7CiAKIHR5cGUKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5DbGllbnQuZHByIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIKaW5kZXggOTVlZTQ4Ni4uNDI3OGQ4ZiAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIKQEAgLTI2LDYgKzI2LDggQEAKICAgU3lzVXRpbHMsCiAgIE11bHRpcGxleC5DbGllbnQuTWFpbiBpbiAnTXVsdGlwbGV4LkNsaWVudC5NYWluLnBhcycsCiAgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKQEAgLTMzLDcgKzM1LDYgQEAKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCiAgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCi0gIFRocmlmdC5Db25zb2xlIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKICAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcyc7CiAKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LlNlcnZlci5kcHIKaW5kZXggYzdhMWExOS4uMTIwNDYyYiAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LlNlcnZlci5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LlNlcnZlci5kcHIKQEAgLTI0LDcgKzI0LDEwIEBACiB1c2VzCiAgIFN5c1V0aWxzLAogICBNdWx0aXBsZXguU2VydmVyLk1haW4gaW4gJ011bHRpcGxleC5TZXJ2ZXIuTWFpbi5wYXMnLAorICBDb25zb2xlSGVscGVyIGluICcuLlxDb25zb2xlSGVscGVyLnBhcycsCiAgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKQEAgLTMyLDcgKzM1LDYgQEAKICAgVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXggaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKICAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJzsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLkRhdGEucGFzIGIvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMKaW5kZXggMzBkOWRkNC4uNWZjMDA3MCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMKQEAgLTIyLDYgKzIyLDcgQEAKIGludGVyZmFjZQogCiB1c2VzCisgIFN5c1V0aWxzLAogICBUaHJpZnQuQ29sbGVjdGlvbnMsCiAgIERlYnVnUHJvdG9UZXN0OwogCkBAIC0xOTQsNyArMTk1LDcgQEAKICAgeyRJRiBjRGVidWdQcm90b1Rlc3RfT3B0aW9uX0Fuc2lTdHJfQmluYXJ5fQogICByZXN1bHQuU2V0QmFzZTY0KCdiYXNlNjQnKTsKICAgeyRFTFNFfQotICBub3QgeWV0IGltcGwKKyAgcmVzdWx0LlNldEJhc2U2NCggVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoJ2Jhc2U2NCcpKTsKICAgeyRJRkVORH0KIAogICAvLyBieXRlLCBpMTYsIGFuZCBpNjQgbGlzdHMgYXJlIHBvcHVsYXRlZCBieSBkZWZhdWx0IGNvbnN0cnVjdG9yCkBAIC0zMzgsNyArMzM5LDcgQEAKICAgeyRJRiBjRGVidWdQcm90b1Rlc3RfT3B0aW9uX0Fuc2lTdHJfQmluYXJ5fQogICByZXN1bHQuQV9iaW5hcnkgOj0gQW5zaVN0cmluZyggIzAjMSMyIzMjNCM1IzYjNyM4KTsKICAgeyRFTFNFfQotICBub3QgeWV0IGltcGwKKyAgcmVzdWx0LkFfYmluYXJ5IDo9IFRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCAjMCMxIzIjMyM0IzUjNiM3IzgpOwogICB7JElGRU5EfQogZW5kOwogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIKaW5kZXggM2Q5YTQ1My4uNTFlMjJhNCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLmRwcgpAQCAtMjQsMTYgKzI0LDE4IEBACiB1c2VzCiAgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLCBHZW5lcmljcy5Db2xsZWN0aW9ucywKICAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAogICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAogICBUaHJpZnQuU2VyaWFsaXplciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJpYWxpemVyLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCiAgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIFN5c3RlbV8sCiAgIERlYnVnUHJvdG9UZXN0LAogICBUZXN0U2VyaWFsaXplci5EYXRhOwogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VydmVyLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCmluZGV4IGQ1MzJlMzQuLmI1ZTQ4YTYgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCkBAIC0yNywxNCArMjcsMTcgQEAKICAgVGVzdFNlcnZlckV2ZW50cyBpbiAnVGVzdFNlcnZlckV2ZW50cy5wYXMnLAogICBUaHJpZnQuVGVzdCwgIC8vIGluIGdlbi1kZWxwaGkgZm9sZGVyCiAgIFRocmlmdCBpbiAnLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzIGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKICAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXggaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcycsCisgIFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4IGluICcuLlxzcmNcVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzJywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCiAgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCi0gIFRocmlmdC5Db25zb2xlIGluICcuLlxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKICAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyc7CkBAIC00NCwxOSArNDcsMTkgQEAKICAgYXJncyA6IGFycmF5IG9mIHN0cmluZzsKICAgaSA6IEludGVnZXI7CiAgIGFyZyA6IHN0cmluZzsKLSAgcyA6IHN0cmluZzsKIAogYmVnaW4KICAgdHJ5CiAgICAgV3JpdGVsbiggJ0RlbHBoaSBUZXN0U2VydmVyICcrVGhyaWZ0LlZlcnNpb24pOwogICAgIG5QYXJhbUNvdW50IDo9IFBhcmFtQ291bnQ7CiAgICAgU2V0TGVuZ3RoKCBhcmdzLCBuUGFyYW1Db3VudCk7Ci0gICAgZm9yIGkgOj0gMSB0byBuUGFyYW1Db3VudCBkbwotICAgIGJlZ2luCisgICAgZm9yIGkgOj0gMSB0byBuUGFyYW1Db3VudCBkbyBiZWdpbgogICAgICAgYXJnIDo9IFBhcmFtU3RyKCBpICk7CiAgICAgICBhcmdzW2ktMV0gOj0gYXJnOwogICAgIGVuZDsKKwogICAgIFRUZXN0U2VydmVyLkV4ZWN1dGUoIGFyZ3MgKTsKKwogICBleGNlcHQKICAgICBvbiBFOiBFQWJvcnQgZG8gYmVnaW4KICAgICAgIEV4aXRDb2RlIDo9ICRGRjsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24xLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24xLmRwcgppbmRleCBhYjU3YmEwLi44MDNkNmJkIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMS5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjEuZHByCkBAIC0yNSwxMiArMjUsMTMgQEAKICAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsCiAgIFNraXB0ZXN0Lk9uZSwKICAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAogICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAogICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAogICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnOwpAQCAtNDMsNyArNDQsNyBAQAogZnVuY3Rpb24gQ3JlYXRlUGluZyA6IElQaW5nOwogYmVnaW4KICAgcmVzdWx0IDo9IFRQaW5nSW1wbC5DcmVhdGU7Ci0gIHJlc3VsdC5WZXJzaW9uMSAgOj0gU2tpcHRlc3QuT25lLlRDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT047CisgIHJlc3VsdC5WZXJzaW9uMSAgOj0gVHNraXB0ZXN0X3ZlcnNpb25fMUNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTjsKIGVuZDsKIAogCkBAIC0xNzgsNyArMTc5LDcgQEAKICAgRklMRV9KU09OICAgPSAncGluZ3BvbmcuanNvbic7CiBiZWdpbgogICB0cnkKLSAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVENvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKKyAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVHNraXB0ZXN0X3ZlcnNpb25fMUNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKIAogICAgIFdyaXRlbG47CiAgICAgV3JpdGVsbignQmluYXJ5IHByb3RvY29sJyk7CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMi5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMi5kcHIKaW5kZXggYWI1ZDQxYS4uNjMzYjI0NyAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjIuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24yLmRwcgpAQCAtMjUsMTIgKzI1LDEzIEBACiAgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLAogICBTa2lwdGVzdC5Ud28sCiAgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKICAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKICAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJzsKQEAgLTQ0LDcgKzQ1LDcgQEAKICAgICBzZXRfIDogSUhhc2hTZXQ8c3RyaW5nPjsKIGJlZ2luCiAgIHJlc3VsdCA6PSBUUGluZ0ltcGwuQ3JlYXRlOwotICByZXN1bHQuVmVyc2lvbjEgIDo9IFNraXB0ZXN0LlR3by5UQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OOworICByZXN1bHQuVmVyc2lvbjEgIDo9IFRza2lwdGVzdF92ZXJzaW9uXzJDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT047CiAgIHJlc3VsdC5Cb29sVmFsICAgOj0gVFJVRTsKICAgcmVzdWx0LkJ5dGVWYWwgICA6PSAyOwogICByZXN1bHQuRGJWYWwgICAgIDo9IDM7CkBAIC0yMDUsNyArMjA2LDcgQEAKICAgRklMRV9KU09OICAgPSAncGluZ3BvbmcuanNvbic7CiBiZWdpbgogICB0cnkKLSAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVENvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKKyAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVHNraXB0ZXN0X3ZlcnNpb25fMkNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKIAogICAgIFdyaXRlbG47CiAgICAgV3JpdGVsbignQmluYXJ5IHByb3RvY29sJyk7CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5L1Rlc3RUeXBlUmVnaXN0cnkuZHByIGIvbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS9UZXN0VHlwZVJlZ2lzdHJ5LmRwcgppbmRleCA5YTY1MDNhLi4xOGE3YzdkIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5L1Rlc3RUeXBlUmVnaXN0cnkuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvVGVzdFR5cGVSZWdpc3RyeS5kcHIKQEAgLTI1LDExICsyNSwxMiBAQAogICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywgR2VuZXJpY3MuQ29sbGVjdGlvbnMsIFR5cEluZm8sCiAgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKICAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKICAgVGhyaWZ0LlNlcmlhbGl6ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VyaWFsaXplci5wYXMnLAogICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLApkaWZmIC0tZ2l0IGEvbGliL2VybC9NYWtlZmlsZS5hbSBiL2xpYi9lcmwvTWFrZWZpbGUuYW0KaW5kZXggZjU3N2E2My4uZmRmYzllYiAxMDA2NDQKLS0tIGEvbGliL2VybC9NYWtlZmlsZS5hbQorKysgYi9saWIvZXJsL01ha2VmaWxlLmFtCkBAIC0xOCwyOSArMTgsNDQgQEAKICMKIAogVEhSSUZUID0gLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdAorVEhSSUZUX09NSVRfRklMRSA9IHRlc3QvVGhyaWZ0X29taXRfd2l0aG91dC50aHJpZnQKIFRIUklGVF9GSUxFUyA9ICQod2lsZGNhcmQgdGVzdC8qLnRocmlmdCkgXAorCQkgICQoVEhSSUZUX09NSVRfRklMRSkgXAorCQkgIC4uLy4uL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQgXAorCQkgIC4uLy4uL3Rlc3QvTmFtZUNvbmZsaWN0VGVzdC50aHJpZnQgXAorCQkgIC4uLy4uL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgXAogCQkgIC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAogaWYgRVJMQU5HX09UUDE2Ci0uZ2VuZXJhdGVkOiAkKFRIUklGVCkgJChUSFJJRlRfRklMRVMpCi0JZm9yIGYgaW4gJChUSFJJRlRfRklMRVMpIDsgZG8gXAotCQkkKFRIUklGVCkgLS1nZW4gZXJsOm90cDE2IC1vIHRlc3QgJCRmIDsgXAotCWRvbmUgOworRVJMX0ZMQUcgPSBlcmw6b3RwMTYKK0VSTF9GTEFHX0xFR0FDWSA9IGVybDpvdHAxNixsZWdhY3luYW1lcworIyBvdHAxNiArIG1hcHMgZG9lcyBub3QgbWFrZSBzZW5zZS4gV2UgbmVlZCB0byBnZW5lcmF0ZSBpdCBhbnl3YXkgdG8gYXZvaWQgaW5jbHVkZSBlcnJvci4KK0VSTF9GTEFHX01BUFMgPSBlcmw6b3RwMTYKIGVsc2UKLS5nZW5lcmF0ZWQ6ICQoVEhSSUZUKSAkKFRIUklGVF9GSUxFUykKLQlmb3IgZiBpbiAkKFRIUklGVF9GSUxFUykgOyBkbyBcCi0JCSQoVEhSSUZUKSAtLWdlbiBlcmwgLW8gdGVzdCAkJGYgOyBcCi0JZG9uZSA7IFwKLQkkKFRIUklGVCkgLS1nZW4gZXJsOm1hcHMgLW8gdGVzdCB0ZXN0L1RocmlmdDMyMTQudGhyaWZ0IDsgXAotCXRvdWNoIC5nZW5lcmF0ZWQKK0VSTF9GTEFHID0gZXJsCitFUkxfRkxBR19MRUdBQ1kgPSBlcmw6bGVnYWN5bmFtZXMKK0VSTF9GTEFHX01BUFMgPSBlcmw6bWFwcwogZW5kaWYKIAorJChUSFJJRlRfT01JVF9GSUxFKTogdGVzdC9UaHJpZnRfb21pdF93aXRoLnRocmlmdAorCWdyZXAgLXYgb21pdCAkPCA+JEAKKworLmdlbmVyYXRlZDogJChUSFJJRlQpICQoVEhSSUZUX0ZJTEVTKQorCWZvciBmIGluICQoVEhSSUZUX0ZJTEVTKSA7IGRvIFwKKwkJJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUcpIC1vIHRlc3QgJCRmIDsgXAorCWRvbmUKKwkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBR19MRUdBQ1kpIC1vIHRlc3QgdGVzdC9mbGFncy9MZWdhY3lOYW1lcy50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBR19NQVBTKSAtbyB0ZXN0IHRlc3QvZmxhZ3MvVGhyaWZ0MzIxNC50aHJpZnQKKwl0b3VjaCAuZ2VuZXJhdGVkCisKIGFsbDogLmdlbmVyYXRlZAotCS4vcmViYXIgZ2V0LWRlcHMKLQkuL3JlYmFyIGNvbXBpbGUKKwkkKFJFQkFSKSBnZXQtZGVwcworCSQoUkVCQVIpIGNvbXBpbGUKIAogY2hlY2s6IC5nZW5lcmF0ZWQKLQkuL3JlYmFyIHNraXBfZGVwcz10cnVlIGV1bml0CisJJChSRUJBUikgLUMgcmViYXIudGVzdC5jb25maWcgZ2V0LWRlcHMKKwkkKFJFQkFSKSAtQyByZWJhci50ZXN0LmNvbmZpZyBjb21waWxlCisJJChSRUJBUikgLUMgcmViYXIudGVzdC5jb25maWcgc2tpcF9kZXBzPXRydWUgZXVuaXQKIAogaW5zdGFsbDogYWxsCiAJbWtkaXIgLXAgJChERVNURElSKSQoRVJMQU5HX0lOU1RBTExfTElCX0RJUl90aHJpZnQpIDsgXApAQCAtNTIsMjIgKzY3LDM0IEBACiAJZG9uZQogCiB1bmluc3RhbGw6Ci0Jcm0gLXJmICQoREVTVERJUikkKEVSTEFOR19JTlNUQUxMX0xJQl9ESVJfdGhyaWZ0KQorCSQoUk0pIC1yZiAkKERFU1RESVIpJChFUkxBTkdfSU5TVEFMTF9MSUJfRElSX3RocmlmdCkKIAotY2xlYW46Ci0Jcm0gLWYgLmdlbmVyYXRlZAotCXJtIC1yZiB0ZXN0L2dlbi1lcmwvCi0JLi9yZWJhciBjbGVhbgorY2xlYW4tbG9jYWw6CisJJChSRUJBUikgY2xlYW4KKwkkKFJNKSAgICAuZ2VuZXJhdGVkCisJJChSTSkgLXIgLnJlYmFyLworCSQoUk0pIC1yIGRlcHMvCisJJChSTSkgLXIgdGVzdC9nZW4tZXJsLworCSQoUk0pICAgICQoVEhSSUZUX09NSVRfRklMRSkKIAogbWFpbnRhaW5lci1jbGVhbi1sb2NhbDoKLQlybSAtcmYgZWJpbgorCSQoUk0pIC1yIGViaW4vCisKK2Rpc3QtaG9vazoKKwkkKFJNKSAgICAkKGRpc3RkaXIpLy5nZW5lcmF0ZWQKKwkkKFJNKSAtciAkKGRpc3RkaXIpLy5yZWJhci8KKwkkKFJNKSAtciAkKGRpc3RkaXIpL2RlcHMvCisJJChSTSkgLXIgJChkaXN0ZGlyKS9lYmluLworCSQoUk0pIC1yICQoZGlzdGRpcikvdGVzdC9nZW4tZXJsLworCSQoUk0pICAgICQoZGlzdGRpcikvJChUSFJJRlRfT01JVF9GSUxFKQogCiBFWFRSQV9ESVNUID0gXAogCWluY2x1ZGUgXAogCXNyYyBcCiAJY29kaW5nX3N0YW5kYXJkcy5tZCBcCi0JcmViYXIgXAogCXJlYmFyLmNvbmZpZyBcCisJcmViYXIuY29uZmlnLnNjcmlwdCBcCisJcmViYXIudGVzdC5jb25maWcgXAogCXRlc3QgXAogCVJFQURNRS5tZAogCmRpZmYgLS1naXQgYS9saWIvZXJsL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKaW5kZXggZmEwMzkwYi4uNGQzN2RiYyAxMDA2NDQKLS0tIGEvbGliL2VybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCisrKyBiL2xpYi9lcmwvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMSArMSwzIEBACiBQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKworUGFydGljdWxhcmx5IGZvciBFcmxhbmcgcGxlYXNlIGZvbGxvdyB0aGUgRXJsYW5nIFtQcm9ncmFtbWluZyBSdWxlcyBhbmQgQ29udmVudGlvbnNdKGh0dHA6Ly93d3cuZXJsYW5nLnNlL2RvYy9wcm9ncmFtbWluZ19ydWxlcy5zaHRtbCkuIApkaWZmIC0tZ2l0IGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF9jb25zdGFudHMuaHJsIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9jb25zdGFudHMuaHJsCmluZGV4IGRiZmFhZjYuLjdjYjI5ZWIgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfY29uc3RhbnRzLmhybAorKysgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X2NvbnN0YW50cy5ocmwKQEAgLTIyLDYgKzIyLDcgQEAKIC1kZWZpbmUodFR5cGVfVk9JRCwgMSkuCiAtZGVmaW5lKHRUeXBlX0JPT0wsIDIpLgogLWRlZmluZSh0VHlwZV9CWVRFLCAzKS4KKy1kZWZpbmUodFR5cGVfSTgsIDMpLgogLWRlZmluZSh0VHlwZV9ET1VCTEUsIDQpLgogLWRlZmluZSh0VHlwZV9JMTYsIDYpLgogLWRlZmluZSh0VHlwZV9JMzIsIDgpLgpAQCAtNTYsMyArNTcsNiBAQAogLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fSU5WQUxJRF9UUkFOU0ZPUk0sIDgpLgogLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fSU5WQUxJRF9QUk9UT0NPTCwgOSkuCiAtZGVmaW5lKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTlNVUFBPUlRFRF9DTElFTlRfVFlQRSwgMTApLgorCistZGVmaW5lIChNVUxUSVBMRVhFRF9TRVJWSUNFX1NFUEFSQVRPUiwgIjoiKS4KKy1kZWZpbmUgKE1VTFRJUExFWEVEX0VSUk9SX0hBTkRMRVJfS0VZLCAiZXJyb3JfaGFuZGxlciIpLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbC5ocmwgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3Byb3RvY29sLmhybAppbmRleCBmODVmNDU1Li5iYzBhY2M4IDEwMDY0NAotLS0gYS9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3Byb3RvY29sLmhybAorKysgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3Byb3RvY29sLmhybApAQCAtMjAsMTIgKzIwLDEyIEBACiAtaWZuZGVmKFRIUklGVF9QUk9UT0NPTF9JTkNMVURFRCkuCiAtZGVmaW5lKFRIUklGVF9QUk9UT0NPTF9JTkNMVURFRCwgdHJ1ZSkuCiAKLS1yZWNvcmQocHJvdG9jb2xfbWVzc2FnZV9iZWdpbiwge25hbWUsIHR5cGUsIHNlcWlkfSkuCi0tcmVjb3JkKHByb3RvY29sX3N0cnVjdF9iZWdpbiwge25hbWV9KS4KLS1yZWNvcmQocHJvdG9jb2xfZmllbGRfYmVnaW4sIHtuYW1lLCB0eXBlLCBpZH0pLgotLXJlY29yZChwcm90b2NvbF9tYXBfYmVnaW4sIHtrdHlwZSwgdnR5cGUsIHNpemV9KS4KLS1yZWNvcmQocHJvdG9jb2xfbGlzdF9iZWdpbiwge2V0eXBlLCBzaXplfSkuCi0tcmVjb3JkKHByb3RvY29sX3NldF9iZWdpbiwge2V0eXBlLCBzaXplfSkuCistcmVjb3JkKHByb3RvY29sX21lc3NhZ2VfYmVnaW4sIHtuYW1lIDo6IHN0cmluZygpLCB0eXBlIDo6IGludGVnZXIoKSwgc2VxaWQgOjogaW50ZWdlcigpfSkuCistcmVjb3JkKHByb3RvY29sX3N0cnVjdF9iZWdpbiwge25hbWUgOjogc3RyaW5nKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfZmllbGRfYmVnaW4sIHtuYW1lIDo6IHN0cmluZygpLCB0eXBlIDo6IGludGVnZXIoKSwgaWQgOjogaW50ZWdlcigpfSkuCistcmVjb3JkKHByb3RvY29sX21hcF9iZWdpbiwge2t0eXBlIDo6IGludGVnZXIoKSwgdnR5cGUgOjogaW50ZWdlcigpLCBzaXplIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9saXN0X2JlZ2luLCB7ZXR5cGUgOjogaW50ZWdlcigpLCBzaXplIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9zZXRfYmVnaW4sIHtldHlwZSA6OiBpbnRlZ2VyKCksIHNpemUgOjogaW50ZWdlcigpfSkuCiAKIC10eXBlIHRwcm90X2hlYWRlcl92YWwoKSA6OiAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI3Byb3RvY29sX3N0cnVjdF9iZWdpbnt9CmRpZmYgLS1naXQgYS9saWIvZXJsL3JlYmFyIGIvbGliL2VybC9yZWJhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM0MTllYS4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3JlYmFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2VybC9yZWJhci5jb25maWcuc2NyaXB0IGIvbGliL2VybC9yZWJhci5jb25maWcuc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzM4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3JlYmFyLmNvbmZpZy5zY3JpcHQKQEAgLTAsMCArMSw3IEBACitEZWYwID0gY2FzZSBub3QgZXJsYW5nOmlzX2J1aWx0aW4oZXJsYW5nLCBtb25vdG9uaWNfdGltZSwgMCkgb2YKKyAgICAgICAgICAgdHJ1ZSAtPiBbXTsKKyAgICAgICAgICAgZmFsc2UgLT4gW3tkLCB0aW1lX2NvcnJlY3Rpb259XQorICAgICAgIGVuZCwKK0RlZnMgPSBEZWYwLAorbGlzdHM6a2V5c3RvcmUoZXJsX29wdHMsIDEsIENPTkZJRywKKyAgICAgICAgICAgICAgIHtlcmxfb3B0cywgcHJvcGxpc3RzOmdldF92YWx1ZShlcmxfb3B0cywgQ09ORklHLCBbXSkgKysgRGVmc30pLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9yZWJhci50ZXN0LmNvbmZpZyBiL2xpYi9lcmwvcmViYXIudGVzdC5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmMmFmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvcmViYXIudGVzdC5jb25maWcKQEAgLTAsMCArMSw1IEBACit7ZXJsX29wdHMsIFt7cGxhdGZvcm1fZGVmaW5lLCAiXlIuKiIsIG90cDE2X29yX2xlc3N9LCBkZWJ1Z19pbmZvXX0uCisKK3tkZXBzLCBbCisgIHttZWNrLCAiIiwge2dpdCwgImh0dHBzOi8vZ2l0aHViLmNvbS9lcHJveHVzL21lY2suZ2l0Iiwge3RhZywgIjAuOC45In19fQorXX0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYyBiL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCmluZGV4IGMzMDZlMGEuLmU1ZTZlZDUgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCkBAIC0yMiw3ICsyMiw3IEBACiAgIHtkZXNjcmlwdGlvbiwgIlRocmlmdCBiaW5kaW5ncyJ9LAogCiAgICUgVGhlIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0b24KLSAge3ZzbiwgIjAuOS4zIn0sCisgIHt2c24sICIwLjEzLjAifSwKIAogICAlIEFsbCBtb2R1bGVzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgogICB7bW9kdWxlcywgWwpAQCAtMzcsNiArMzcsNyBAQAogICAgIHRocmlmdF9odHRwX3RyYW5zcG9ydCwKICAgICB0aHJpZnRfanNvbl9wYXJzZXIsCiAgICAgdGhyaWZ0X2pzb25fcHJvdG9jb2wsCisgICAgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsCiAgICAgdGhyaWZ0X21lbW9yeV9idWZmZXIsCiAgICAgdGhyaWZ0X3Byb2Nlc3NvciwKICAgICB0aHJpZnRfcHJvdG9jb2wsCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsCmluZGV4IGQ0ZDYxNGUuLmU5ZDNmZmYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsCkBAIC0yMSw1NyArMjEsNzggQEAKIAogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotJSUgQVBJCi0tZXhwb3J0KFtuZXcvMSwgbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzFdKS4KKyUlIGNvbnN0cnVjdG9yCistZXhwb3J0KFtuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorJSUgbGVnYWN5IGFwaQorLWV4cG9ydChbbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzFdKS4KIAotJSUgdGhyaWZ0X3RyYW5zcG9ydCBjYWxsYmFja3MKLS1leHBvcnQoW3dyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgogCi0tcmVjb3JkKGJ1ZmZlcmVkX3RyYW5zcG9ydCwge3dyYXBwZWQsICUgYSB0aHJpZnRfdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlciAlIGlvbGlzdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuCi0tdHlwZSBzdGF0ZSgpIDo6ICNidWZmZXJlZF90cmFuc3BvcnR7fS4KKy1yZWNvcmQodF9idWZmZXJlZCwgeworICB3cmFwcGVkLAorICB3cml0ZV9idWZmZXIKK30pLgorCistdHlwZSBzdGF0ZSgpIDo6ICN0X2J1ZmZlcmVke30uCisKKworLXNwZWMgbmV3KFRyYW5zcG9ydDo6dGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCisKK25ldyhXcmFwcGVkKSAtPgorICBTdGF0ZSA9ICN0X2J1ZmZlcmVkeworICAgIHdyYXBwZWQgPSBXcmFwcGVkLAorICAgIHdyaXRlX2J1ZmZlciA9IFtdCisgIH0sCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworCiAtaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCiAKIAotbmV3KFdyYXBwZWRUcmFuc3BvcnQpIC0+Ci0gICAgU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXIgPSBbXX0sCi0gICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorJSUgcmVhZHMgZGF0YSB0aHJvdWdoIGZyb20gdGhlIHdyYXBwZWQgdHJhbnNwb3J0CityZWFkKFN0YXRlID0gI3RfYnVmZmVyZWR7d3JhcHBlZCA9IFdyYXBwZWR9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAge05ld1N0YXRlLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoV3JhcHBlZCwgTGVuKSwKKyAge1N0YXRlI3RfYnVmZmVyZWR7d3JhcHBlZCA9IE5ld1N0YXRlfSwgUmVzcG9uc2V9LgogCiAKLSUlIFdyaXRlcyBkYXRhIGludG8gdGhlIGJ1ZmZlcgotd3JpdGUoU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFdCdWZ9LCBEYXRhKSAtPgotICAgIHtTdGF0ZSNidWZmZXJlZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gW1dCdWYsIERhdGFdfSwgb2t9LgorJSUgcmVhZHMgZGF0YSB0aHJvdWdoIGZyb20gdGhlIHdyYXBwZWQgdHJhbnNwb3J0CityZWFkX2V4YWN0KFN0YXRlID0gI3RfYnVmZmVyZWR7d3JhcHBlZCA9IFdyYXBwZWR9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAge05ld1N0YXRlLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWRfZXhhY3QoV3JhcHBlZCwgTGVuKSwKKyAge1N0YXRlI3RfYnVmZmVyZWR7d3JhcHBlZCA9IE5ld1N0YXRlfSwgUmVzcG9uc2V9LgogCi0lJSBGbHVzaGVzIHRoZSBidWZmZXIgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLWZsdXNoKFN0YXRlID0gI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBXQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgPSBXcmFwcGVkMH0pIC0+Ci0gICAge1dyYXBwZWQxLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFdyYXBwZWQwLCBXQnVmKSwKLSAgICB7V3JhcHBlZDIsIF99ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChXcmFwcGVkMSksCi0gICAgTmV3U3RhdGUgPSBTdGF0ZSNidWZmZXJlZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCA9IFdyYXBwZWQyfSwKLSAgICB7TmV3U3RhdGUsIFJlc3BvbnNlfS4KIAotJSUgQ2xvc2VzIHRoZSB0cmFuc3BvcnQgYW5kIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotY2xvc2UoU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMH0pIC0+Ci0gICAge1dyYXBwZWQxLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShXcmFwcGVkMCksCi0gICAgTmV3U3RhdGUgPSBTdGF0ZSNidWZmZXJlZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQxfSwKLSAgICB7TmV3U3RhdGUsIFJlc3VsdH0uCit3cml0ZShTdGF0ZSA9ICN0X2J1ZmZlcmVke3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcn0sIERhdGEpIC0+CisgIHtTdGF0ZSN0X2J1ZmZlcmVke3dyaXRlX2J1ZmZlciA9IFtCdWZmZXIsIERhdGFdfSwgb2t9LgogCi0lJSBSZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLXJlYWQoU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMH0sIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgLT4KLSAgICB7V3JhcHBlZDEsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZChXcmFwcGVkMCwgTGVuKSwKLSAgICBOZXdTdGF0ZSA9IFN0YXRlI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDF9LAotICAgIHtOZXdTdGF0ZSwgUmVzcG9uc2V9LgorCitmbHVzaChTdGF0ZSA9ICN0X2J1ZmZlcmVke3dyYXBwZWQgPSBXcmFwcGVkLCB3cml0ZV9idWZmZXIgPSBCdWZmZXJ9KSAtPgorICBjYXNlIGlvbGlzdF9zaXplKEJ1ZmZlcikgb2YKKyAgICAlJSBpZiB3cml0ZSBidWZmZXIgaXMgZW1wdHksIGRvIG5vdGhpbmcKKyAgICAwIC0+IHtTdGF0ZSwgb2t9OworICAgIF8gLT4KKyAgICAgIHtXcml0dGVuLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFdyYXBwZWQsIEJ1ZmZlciksCisgICAgICB7Rmx1c2hlZCwgb2t9ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChXcml0dGVuKSwKKyAgICAgIHtTdGF0ZSN0X2J1ZmZlcmVke3dyYXBwZWQgPSBGbHVzaGVkLCB3cml0ZV9idWZmZXIgPSBbXX0sIFJlc3BvbnNlfQorICBlbmQuCisKKworY2xvc2UoU3RhdGUgPSAjdF9idWZmZXJlZHt3cmFwcGVkID0gV3JhcHBlZH0pIC0+CisgIHtDbG9zZWQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFdyYXBwZWQpLAorICB7U3RhdGUjdF9idWZmZXJlZHt3cmFwcGVkID0gQ2xvc2VkfSwgUmVzdWx0fS4KKwogCiAlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlJSUgSW50ZXJuYWwgZnVuY3Rpb25zCiAlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlJSUlIEZBQ1RPUlkgR0VORVJBVElPTiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiBuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoV3JhcEZhY3RvcnkpIC0+Ci0gICAgRiA9IGZ1bigpIC0+Ci0gICAgICAgICAgICAgICAge29rLCBXcmFwcGVkfSA9IFdyYXBGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgbmV3KFdyYXBwZWQpCi0gICAgICAgIGVuZCwKLSAgICB7b2ssIEZ9LgorICBGID0gZnVuKCkgLT4KKyAgICB7b2ssIFdyYXBwZWR9ID0gV3JhcEZhY3RvcnkoKSwKKyAgICBuZXcoV3JhcHBlZCkKKyAgZW5kLAorICB7b2ssIEZ9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnQuZXJsCmluZGV4IGZmNWMzZGMuLjFhOWNiNTAgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnQuZXJsCkBAIC0zNiwxMyArMzYsMTIgQEAKIAogLXNwZWMgY2FsbCgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSkgLT4geyN0Y2xpZW50e30sIHtvaywgYW55KCl9IHwge2Vycm9yLCBhbnkoKX19LgogY2FsbChDbGllbnQgPSAjdGNsaWVudHt9LCBGdW5jdGlvbiwgQXJncykKLSAgd2hlbiBpc19hdG9tKEZ1bmN0aW9uKSwgaXNfbGlzdChBcmdzKSAtPgotICAgIGNhc2Ugc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCwgRnVuY3Rpb24sIEFyZ3MpIG9mCi0gICAgICAgIHtDbGllbnQxLCBva30gLT4KLSAgICAgICAgICAgIHJlY2VpdmVfZnVuY3Rpb25fcmVzdWx0KENsaWVudDEsIEZ1bmN0aW9uKTsKLSAgICAgICAgRWxzZSAtPgotICAgICAgICAgICAgRWxzZQotICAgIGVuZC4KK3doZW4gaXNfYXRvbShGdW5jdGlvbiksIGlzX2xpc3QoQXJncykgLT4KKyAgY2FzZSBzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykgb2YKKyAgICB7b2ssIENsaWVudDF9IC0+IHJlY2VpdmVfZnVuY3Rpb25fcmVzdWx0KENsaWVudDEsIEZ1bmN0aW9uKTsKKyAgICB7e2Vycm9yLCBYfSwgQ2xpZW50MX0gLT4ge0NsaWVudDEsIHtlcnJvciwgWH19OworICAgIEVsc2UgLT4gRWxzZQorICBlbmQuCiAKIAogJSUgU2VuZHMgYSBmdW5jdGlvbiBjYWxsIGJ1dCBkb2VzIG5vdCByZWFkIHRoZSByZXN1bHQuIFRoaXMgaXMgdXNlZnVsCkBAIC01MSw3ICs1MCwxMCBAQAogLXNwZWMgc2VuZF9jYWxsKCN0Y2xpZW50e30sIGF0b20oKSwgbGlzdCgpKSAtPiB7I3RjbGllbnR7fSwgb2t9Lgogc2VuZF9jYWxsKENsaWVudCA9ICN0Y2xpZW50e30sIEZ1bmN0aW9uLCBBcmdzKQogICB3aGVuIGlzX2F0b20oRnVuY3Rpb24pLCBpc19saXN0KEFyZ3MpIC0+Ci0gICAgc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCwgRnVuY3Rpb24sIEFyZ3MpLgorICAgIGNhc2Ugc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCwgRnVuY3Rpb24sIEFyZ3MpIG9mCisgICAgICB7b2ssIENsaWVudDF9IC0+IHtDbGllbnQxLCBva307CisgICAgICBFbHNlIC0+IEVsc2UKKyAgICBlbmQuCiAKIC1zcGVjIGNsb3NlKCN0Y2xpZW50e30pIC0+IG9rLgogY2xvc2UoI3RjbGllbnR7cHJvdG9jb2w9UHJvdG9jb2x9KSAtPgpAQCAtNjEsMzAgKzYzLDQwIEBACiAlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlJSUgSW50ZXJuYWwgZnVuY3Rpb25zCiAlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tc3BlYyBzZW5kX2Z1bmN0aW9uX2NhbGwoI3RjbGllbnR7fSwgYXRvbSgpLCBsaXN0KCkpIC0+IHsjdGNsaWVudHt9LCBvayB8IHtlcnJvciwgYW55KCl9fS4KLXNlbmRfZnVuY3Rpb25fY2FsbChDbGllbnQgPSAjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlICA9IFNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgICAgPSBTZXFJZH0sCi0gICAgICAgICAgICAgICAgICAgRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgQXJncykgLT4KLSAgICBQYXJhbXMgPSB0cnkgU2VydmljZTpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBwYXJhbXNfdHlwZSkKLSAgICBjYXRjaCBlcnJvcjpmdW5jdGlvbl9jbGF1c2UgLT4gbm9fZnVuY3Rpb24KLSAgICBlbmQsCi0gICAgY2FzZSBQYXJhbXMgb2YKLSAgICAgICAgbm9fZnVuY3Rpb24gLT4KLSAgICAgICAgICAgIHtDbGllbnQsIHtlcnJvciwge25vX2Z1bmN0aW9uLCBGdW5jdGlvbn19fTsKLSAgICAgICAge3N0cnVjdCwgUExpc3R9IHdoZW4gbGVuZ3RoKFBMaXN0KSA9Lz0gbGVuZ3RoKEFyZ3MpIC0+Ci0gICAgICAgICAgICB7Q2xpZW50LCB7ZXJyb3IsIHtiYWRfYXJncywgRnVuY3Rpb24sIEFyZ3N9fX07Ci0gICAgICAgIHtzdHJ1Y3QsIF9QTGlzdH0gLT4KLSAgICAgICAgICAgIEJlZ2luID0gI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSA9IGF0b21fdG9fbGlzdChGdW5jdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSA/dE1lc3NhZ2VUeXBlX0NBTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkID0gU2VxSWR9LAotICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvMCwgQmVnaW4pLAotICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvMSwge1BhcmFtcywgbGlzdF90b190dXBsZShbRnVuY3Rpb24gfCBBcmdzXSl9KSwKLSAgICAgICAgICAgIHtQcm90bzMsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzIsIG1lc3NhZ2VfZW5kKSwKLSAgICAgICAgICAgIHtQcm90bzQsIG9rfSA9IHRocmlmdF9wcm90b2NvbDpmbHVzaF90cmFuc3BvcnQoUHJvdG8zKSwKLSAgICAgICAgICAgIHtDbGllbnQjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvNH0sIG9rfQotICAgIGVuZC4KKy1zcGVjIHNlbmRfZnVuY3Rpb25fY2FsbCgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSkgLT4ge29rIHwge2Vycm9yLCBhbnkoKX0sICN0Y2xpZW50e319Lgorc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCA9ICN0Y2xpZW50e3NlcnZpY2UgPSBTZXJ2aWNlfSwgRnVuY3Rpb24sIEFyZ3MpIC0+CisgIHtQYXJhbXMsIFJlcGx5fSA9IHRyeQorICAgIHtTZXJ2aWNlOmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHBhcmFtc190eXBlKSwgU2VydmljZTpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCByZXBseV90eXBlKX0KKyAgY2F0Y2ggZXJyb3I6ZnVuY3Rpb25fY2xhdXNlIC0+IHtub19mdW5jdGlvbiwgMH0KKyAgZW5kLAorICBNc2dUeXBlID0gY2FzZSBSZXBseSBvZgorICAgIG9uZXdheV92b2lkIC0+ID90TWVzc2FnZVR5cGVfT05FV0FZOworICAgIF8gLT4gP3RNZXNzYWdlVHlwZV9DQUxMCisgIGVuZCwKKyAgY2FzZSBQYXJhbXMgb2YKKyAgICBub19mdW5jdGlvbiAtPgorICAgICAge3tlcnJvciwge25vX2Z1bmN0aW9uLCBGdW5jdGlvbn19LCBDbGllbnR9OworICAgIHtzdHJ1Y3QsIFBMaXN0fSB3aGVuIGxlbmd0aChQTGlzdCkgPS89IGxlbmd0aChBcmdzKSAtPgorICAgICAge3tlcnJvciwge2JhZF9hcmdzLCBGdW5jdGlvbiwgQXJnc319LCBDbGllbnR9OworICAgIHtzdHJ1Y3QsIF9QTGlzdH0gLT4gd3JpdGVfbWVzc2FnZShDbGllbnQsIEZ1bmN0aW9uLCBBcmdzLCBQYXJhbXMsIE1zZ1R5cGUpCisgIGVuZC4KKworLXNwZWMgd3JpdGVfbWVzc2FnZSgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSwge3N0cnVjdCwgbGlzdCgpfSwgaW50ZWdlcigpKSAtPgorICB7b2sgfCB7ZXJyb3IsIGFueSgpfSwgI3RjbGllbnR7fX0uCit3cml0ZV9tZXNzYWdlKENsaWVudCA9ICN0Y2xpZW50e3Byb3RvY29sID0gUDAsIHNlcWlkID0gU2VxfSwgRnVuY3Rpb24sIEFyZ3MsIFBhcmFtcywgTXNnVHlwZSkgLT4KKyAgdHJ5CisgICAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueworICAgICAgbmFtZSA9IGF0b21fdG9fbGlzdChGdW5jdGlvbiksCisgICAgICB0eXBlID0gTXNnVHlwZSwKKyAgICAgIHNlcWlkID0gU2VxCisgICAgfSksCisgICAge1AyLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDEsIHtQYXJhbXMsIGxpc3RfdG9fdHVwbGUoW0Z1bmN0aW9ufEFyZ3NdKX0pLAorICAgIHtQMywgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAyLCBtZXNzYWdlX2VuZCksCisgICAge1A0LCBva30gPSB0aHJpZnRfcHJvdG9jb2w6Zmx1c2hfdHJhbnNwb3J0KFAzKSwKKyAgICB7b2ssIENsaWVudCN0Y2xpZW50e3Byb3RvY29sID0gUDR9fQorICBjYXRjaAorICAgIGVycm9yOntiYWRtYXRjaCwge18sIHtlcnJvciwgX30gPSBFcnJvcn19IC0+IHtFcnJvciwgQ2xpZW50fQorICBlbmQuCiAKIC1zcGVjIHJlY2VpdmVfZnVuY3Rpb25fcmVzdWx0KCN0Y2xpZW50e30sIGF0b20oKSkgLT4geyN0Y2xpZW50e30sIHtvaywgYW55KCl9IHwge2Vycm9yLCBhbnkoKX19LgogcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoQ2xpZW50ID0gI3RjbGllbnR7c2VydmljZSA9IFNlcnZpY2V9LCBGdW5jdGlvbikgLT4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnRfdXRpbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50X3V0aWwuZXJsCmluZGV4IDdhMTFmM2EuLjFkYmU1MWUgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnRfdXRpbC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudF91dGlsLmVybApAQCAtMjAsNiArMjAsMTEgQEAKIC1tb2R1bGUodGhyaWZ0X2NsaWVudF91dGlsKS4KIAogLWV4cG9ydChbbmV3LzRdKS4KKy1leHBvcnQoW25ld19tdWx0aXBsZXhlZC8zLCBuZXdfbXVsdGlwbGV4ZWQvNF0pLgorCistdHlwZSBzZXJ2aWNlX25hbWUoKSAgICAgICAgICAgIDo6IG5vbmVtcHR5X3N0cmluZygpLgorLXR5cGUgc2VydmljZV9tb2R1bGUoKSAgICAgICAgICA6OiBhdG9tKCkuCistdHlwZSBtdWx0aXBsZXhlZF9zZXJ2aWNlX21hcCgpIDo6IFt7U2VydmljZU5hbWU6OnNlcnZpY2VfbmFtZSgpLCBTZXJ2aWNlTW9kdWxlOjpzZXJ2aWNlX21vZHVsZSgpfV0uCiAKICUlCiAlJSBTcGxpdHMgY2xpZW50IG9wdGlvbnMgaW50byBjbGllbnQsIHByb3RvY29sLCBhbmQgdHJhbnNwb3J0IG9wdGlvbnMKQEAgLTM0LDI4ICszOSw0MSBAQAogCiBzcGxpdF9vcHRpb25zKFtPcHQgPSB7T3B0S2V5LCBffSB8IFJlc3RdLCBQcm90b0luLCBUcmFuc0luKQogICB3aGVuIE9wdEtleSA9Oj0gc3RyaWN0X3JlYWQ7Ci0gICAgICAgT3B0S2V5ID06PSBzdHJpY3Rfd3JpdGUgLT4KKyAgICAgICBPcHRLZXkgPTo9IHN0cmljdF93cml0ZTsKKyAgICAgICBPcHRLZXkgPTo9IHByb3RvY29sIC0+CiAgICAgc3BsaXRfb3B0aW9ucyhSZXN0LCBbT3B0IHwgUHJvdG9Jbl0sIFRyYW5zSW4pOwogCiBzcGxpdF9vcHRpb25zKFtPcHQgPSB7T3B0S2V5LCBffSB8IFJlc3RdLCBQcm90b0luLCBUcmFuc0luKQogICB3aGVuIE9wdEtleSA9Oj0gZnJhbWVkOwogICAgICAgIE9wdEtleSA9Oj0gY29ubmVjdF90aW1lb3V0OwogICAgICAgIE9wdEtleSA9Oj0gcmVjdl90aW1lb3V0OwotICAgICAgIE9wdEtleSA9Oj0gc29ja29wdHMgLT4KKyAgICAgICBPcHRLZXkgPTo9IHNvY2tvcHRzOworICAgICAgIE9wdEtleSA9Oj0gc3NsdHJhbnNwb3J0OworICAgICAgIE9wdEtleSA9Oj0gc3Nsb3B0aW9ucy0+CiAgICAgc3BsaXRfb3B0aW9ucyhSZXN0LCBQcm90b0luLCBbT3B0IHwgVHJhbnNJbl0pLgogCiAKICUlIENsaWVudCBjb25zdHJ1Y3RvciBmb3IgdGhlIGNvbW1vbi1jYXNlIG9mIHNvY2tldCB0cmFuc3BvcnRzCi0lJSB3aXRoIHRoZSBiaW5hcnkgcHJvdG9jb2wKIG5ldyhIb3N0LCBQb3J0LCBTZXJ2aWNlLCBPcHRpb25zKQogICB3aGVuIGlzX2ludGVnZXIoUG9ydCksIGlzX2F0b20oU2VydmljZSksIGlzX2xpc3QoT3B0aW9ucykgLT4KLSAgICB7UHJvdG9PcHRzLCBUcmFuc09wdHN9ID0gc3BsaXRfb3B0aW9ucyhPcHRpb25zKSwKKyAgICB7UHJvdG9PcHRzLCBUcmFuc09wdHMwfSA9IHNwbGl0X29wdGlvbnMoT3B0aW9ucyksCiAKKyAgICB7VHJhbnNwb3J0TW9kdWxlLCBUcmFuc09wdHMyfSA9IGNhc2UgbGlzdHM6a2V5dGFrZShzc2x0cmFuc3BvcnQsIDEsIFRyYW5zT3B0czApIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLCB7XywgdHJ1ZX0sIFRyYW5zT3B0czF9IC0+IHt0aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydCwgVHJhbnNPcHRzMX07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4ge3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LCBUcmFuc09wdHMwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorCisgICAge1Byb3RvY29sTW9kdWxlLCBQcm90b09wdHMxfSA9IGNhc2UgbGlzdHM6a2V5dGFrZShwcm90b2NvbCwgMSwgUHJvdG9PcHRzKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZSwge18sIGNvbXBhY3R9LCBPcHRzfSAtPiB7dGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wsIE9wdHN9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZSwge18sIGpzb259LCBPcHRzfSAtPiB7dGhyaWZ0X2pzb25fcHJvdG9jb2wsIE9wdHN9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZSwge18sIGJpbmFyeX0sIE9wdHN9IC0+IHt0aHJpZnRfYmluYXJ5X3Byb3RvY29sLCBPcHRzfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB7dGhyaWZ0X2JpbmFyeV9wcm90b2NvbCwgUHJvdG9PcHRzfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCiAgICAge29rLCBUcmFuc3BvcnRGYWN0b3J5fSA9Ci0gICAgICAgIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeShIb3N0LCBQb3J0LCBUcmFuc09wdHMpLAorICAgICAgICBUcmFuc3BvcnRNb2R1bGU6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIFRyYW5zT3B0czIpLAogCi0gICAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXdfcHJvdG9jb2xfZmFjdG9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEZhY3RvcnksIFByb3RvT3B0cyksCisgICAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0gUHJvdG9jb2xNb2R1bGU6bmV3X3Byb3RvY29sX2ZhY3RvcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRGYWN0b3J5LCBQcm90b09wdHMxKSwKIAogICAgIGNhc2UgUHJvdG9jb2xGYWN0b3J5KCkgb2YKICAgICAgICAge29rLCBQcm90b2NvbH0gLT4KQEAgLTYzLDMgKzgxLDMyIEBACiAgICAgICAgIHtlcnJvciwgRXJyb3J9IC0+CiAgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfQogICAgIGVuZC4KKworLXNwZWMgbmV3X211bHRpcGxleGVkKEhvc3QsIFBvcnQsIFNlcnZpY2VzLCBPcHRpb25zKSAtPiB7b2ssIFNlcnZpY2VUaHJpZnRDbGllbnRMaXN0fSB3aGVuCisgICAgSG9zdCAgICAgICAgOjogbm9uZW1wdHlfc3RyaW5nKCksCisgICAgUG9ydCAgICAgICAgOjogbm9uX25lZ19pbnRlZ2VyKCksCisgICAgU2VydmljZXMgICAgOjogbXVsdGlwbGV4ZWRfc2VydmljZV9tYXAoKSwKKyAgICBPcHRpb25zICAgICA6OiBsaXN0KCksCisgICAgU2VydmljZVRocmlmdENsaWVudExpc3QgOjogW3tTZXJ2aWNlTmFtZTo6bGlzdCgpLCBUaHJpZnRDbGllbnQ6OnRlcm0oKX1dLgorbmV3X211bHRpcGxleGVkKEhvc3QsIFBvcnQsIFNlcnZpY2VzLCBPcHRpb25zKSB3aGVuIGlzX2ludGVnZXIoUG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbGlzdChTZXJ2aWNlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbGlzdChPcHRpb25zKSAtPgorICAgIG5ld19tdWx0aXBsZXhlZCh0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgT3B0aW9ucyksIFNlcnZpY2VzLCBPcHRpb25zKS4KKworLXNwZWMgbmV3X211bHRpcGxleGVkKFRyYW5zcG9ydEZhY3RvcnlUdXBsZSwgU2VydmljZXMsIE9wdGlvbnMpIC0+IHtvaywgU2VydmljZVRocmlmdENsaWVudExpc3R9IHdoZW4KKyAgICBUcmFuc3BvcnRGYWN0b3J5VHVwbGUgICA6OiB7b2ssIFRyYW5zcG9ydEZhY3Rvcnk6OnRlcm0oKX0sCisgICAgU2VydmljZXMgICAgICAgICAgICAgICAgOjogbXVsdGlwbGV4ZWRfc2VydmljZV9tYXAoKSwKKyAgICBPcHRpb25zICAgICAgICAgICAgICAgICA6OiBsaXN0KCksCisgICAgU2VydmljZVRocmlmdENsaWVudExpc3QgOjogW3tTZXJ2aWNlTmFtZTo6c2VydmljZV9uYW1lKCksIFRocmlmdENsaWVudDo6dGVybSgpfV0uCituZXdfbXVsdGlwbGV4ZWQoVHJhbnNwb3J0RmFjdG9yeVR1cGxlLCBTZXJ2aWNlcywgT3B0aW9ucykgd2hlbiBpc19saXN0KFNlcnZpY2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoT3B0aW9ucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc190dXBsZShUcmFuc3BvcnRGYWN0b3J5VHVwbGUpIC0+CisgICAge1Byb3RvT3B0cywgX30gPSBzcGxpdF9vcHRpb25zKE9wdGlvbnMpLAorCisgICAge29rLCBUcmFuc3BvcnRGYWN0b3J5fSA9IFRyYW5zcG9ydEZhY3RvcnlUdXBsZSwKKworICAgIHtvaywgUHJvdG9jb2xGYWN0b3J5fSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3X3Byb3RvY29sX2ZhY3RvcnkoVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9PcHRzKSwKKworICAgIHtvaywgUHJvdG9jb2x9ID0gUHJvdG9jb2xGYWN0b3J5KCksCisKKyAgICB7b2ssIFt7U2VydmljZU5hbWUsIGVsZW1lbnQoMiwgdGhyaWZ0X2NsaWVudDpuZXcoZWxlbWVudCgyLCB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2w6bmV3KFByb3RvY29sLCBTZXJ2aWNlTmFtZSkpLCBTZXJ2aWNlKSl9IHx8IHtTZXJ2aWNlTmFtZSwgU2VydmljZX0gPC0gU2VydmljZXNdfS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjE0MjIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsCkBAIC0wLDAgKzEsMzkwIEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0aHJpZnRfY29tcGFjdF9wcm90b2NvbCkuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3Byb3RvY29sKS4KKworLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sLmhybCIpLgorCistZXhwb3J0KFtuZXcvMSwgbmV3LzIsCisgICAgICAgICByZWFkLzIsCisgICAgICAgICB3cml0ZS8yLAorICAgICAgICAgZmx1c2hfdHJhbnNwb3J0LzEsCisgICAgICAgICBjbG9zZV90cmFuc3BvcnQvMSwKKyAgICAgICAgIG5ld19wcm90b2NvbF9mYWN0b3J5LzIKKyAgICAgICAgXSkuCisKKy1kZWZpbmUoSURfTk9ORSwgMTYjMTAwMDApLgorLWRlZmluZShDQk9PTF9OT05FLCAwKS4KKy1kZWZpbmUoQ0JPT0xfVFJVRSwgMSkuCistZGVmaW5lKENCT09MX0ZBTFNFLCAyKS4KKworLXJlY29yZCh0X2NvbXBhY3QsIHt0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHN0YXRlIGZvciBwZW5kaW5nIGJvb2xlYW4gZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3N0YWNrPVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF92YWx1ZT0/Q0JPT0xfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3N0YWNrPVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfaWQ9P0lEX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuCistdHlwZSBzdGF0ZSgpIDo6ICN0X2NvbXBhY3R7fS4KKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2xfYmVoYXZpb3VyLmhybCIpLgorCistZGVmaW5lKFBST1RPQ09MX0lELCAxNiM4MikuCistZGVmaW5lKFZFUlNJT05fTUFTSywgMTYjMWYpLgorLWRlZmluZShWRVJTSU9OXzEsIDE2IzAxKS4KKy1kZWZpbmUoVFlQRV9NQVNLLCAxNiNFMCkuCistZGVmaW5lKFRZUEVfQklUUywgMTYjMDcpLgorLWRlZmluZShUWVBFX1NISUZUX0FNT1VOVCwgNSkuCisKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9TVE9QKSAtPiAxNiMwOwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0JPT0wpIC0+IDE2IzI7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfSTgpIC0+IDE2IzM7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfSTE2KSAtPiAxNiM0OwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0kzMikgLT4gMTYjNTsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9JNjQpIC0+IDE2IzY7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfRE9VQkxFKSAtPiAxNiM3OwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX1NUUklORykgLT4gMTYjODsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9TVFJVQ1QpIC0+IDE2I0M7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfTUFQKSAtPiAxNiNCOwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX1NFVCkgLT4gMTYjQTsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9MSVNUKSAtPiAxNiM5LgorCitjb21wYWN0X3RvX3R5cGVpZCgxNiMwKSAtPiAgP3RUeXBlX1NUT1A7Citjb21wYWN0X3RvX3R5cGVpZCg/Q0JPT0xfRkFMU0UpIC0+ICA/dFR5cGVfQk9PTDsKK2NvbXBhY3RfdG9fdHlwZWlkKD9DQk9PTF9UUlVFKSAtPiAgP3RUeXBlX0JPT0w7Citjb21wYWN0X3RvX3R5cGVpZCgxNiM3KSAtPiAgP3RUeXBlX0RPVUJMRTsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzMpIC0+ICA/dFR5cGVfSTg7Citjb21wYWN0X3RvX3R5cGVpZCgxNiM0KSAtPiAgP3RUeXBlX0kxNjsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzUpIC0+ICA/dFR5cGVfSTMyOworY29tcGFjdF90b190eXBlaWQoMTYjNikgLT4gID90VHlwZV9JNjQ7Citjb21wYWN0X3RvX3R5cGVpZCgxNiM4KSAtPiAgP3RUeXBlX1NUUklORzsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2I0MpIC0+ICA/dFR5cGVfU1RSVUNUOworY29tcGFjdF90b190eXBlaWQoMTYjQikgLT4gID90VHlwZV9NQVA7Citjb21wYWN0X3RvX3R5cGVpZCgxNiNBKSAtPiAgP3RUeXBlX1NFVDsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzkpIC0+ICA/dFR5cGVfTElTVC4KKworYm9vbF90b19jYm9vbChWYWx1ZSkgd2hlbiBWYWx1ZSAtPiA/Q0JPT0xfVFJVRTsKK2Jvb2xfdG9fY2Jvb2woXykgLT4gP0NCT09MX0ZBTFNFLgorY2Jvb2xfdG9fYm9vbChWYWx1ZSkgLT4gVmFsdWUgPTo9ID9DQk9PTF9UUlVFLgorCituZXcoVHJhbnNwb3J0KSAtPiBuZXcoVHJhbnNwb3J0LCBfT3B0aW9ucyA9IFtdKS4KKworbmV3KFRyYW5zcG9ydCwgX09wdGlvbnMpIC0+CisgIFN0YXRlICA9ICN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSwKKyAgdGhyaWZ0X3Byb3RvY29sOm5ldyg/TU9EVUxFLCBTdGF0ZSkuCisKK2ZsdXNoX3RyYW5zcG9ydChUaGlzID0gI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBUcmFuc3BvcnR9KSAtPgorICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLAorICB7VGhpcyN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gTmV3VHJhbnNwb3J0fSwgUmVzdWx0fS4KKworY2xvc2VfdHJhbnNwb3J0KFRoaXMgPSAjdF9jb21wYWN0e3RyYW5zcG9ydCA9IFRyYW5zcG9ydH0pIC0+CisgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCksCisgIHtUaGlzI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgorCislJSUKKyUlJSBpbnN0YW5jZSBtZXRob2RzCislJSUKKword3JpdGVfZmllbGRfYmVnaW4oVGhpczAgPSAjdF9jb21wYWN0e3dyaXRlX3N0YWNrPVtMYXN0SWR8VF19LCBDb21wYWN0VHlwZSwgSWQpIC0+CisgIElkRGlmZiA9IElkIC0gTGFzdElkLAorICBUaGlzMSA9IFRoaXMwI3RfY29tcGFjdHt3cml0ZV9zdGFjaz1bSWR8VF19LAorICBjYXNlIChJZERpZmYgPiAwKSBhbmQgKElkRGlmZiA8IDE2KSBvZgorICAgIHRydWUgLT4gd3JpdGUoVGhpczEsIHtieXRlLCAoSWREaWZmIGJzbCA0KSBib3IgQ29tcGFjdFR5cGV9KTsKKyAgICBmYWxzZSAtPgorICAgICAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwge2J5dGUsIENvbXBhY3RUeXBlfSksCisgICAgICB3cml0ZShUaGlzMiwge2kxNiwgSWR9KQorICBlbmQuCisKKy1zcGVjIHRvX3ppZ3phZyhpbnRlZ2VyKCkpIC0+IG5vbl9uZWdfaW50ZWdlcigpLgordG9femlnemFnKFZhbHVlKSAtPiAxNiNGRkZGRkZGRkZGRkZGRkZGIGJhbmQgKChWYWx1ZSBic2wgMSkgYnhvciAoVmFsdWUgYnNyIDYzKSkuCisKKy1zcGVjIGZyb21femlnemFnKG5vbl9uZWdfaW50ZWdlcigpKSAtPiBpbnRlZ2VyKCkuCitmcm9tX3ppZ3phZyhWYWx1ZSkgLT4gKFZhbHVlIGJzciAxKSBieG9yIC0oVmFsdWUgYmFuZCAxKS4KKworLXNwZWMgdG9fdmFyaW50KG5vbl9uZWdfaW50ZWdlcigpLCBpb2xpc3QoKSkgLT4gaW9saXN0KCkuCit0b192YXJpbnQoVmFsdWUsIEFjYykgd2hlbiAoVmFsdWUgPCAxNiM4MCkgLT4gW0FjYywgVmFsdWVdOwordG9fdmFyaW50KFZhbHVlLCBBY2MpIC0+CisgIHRvX3ZhcmludChWYWx1ZSBic3IgNywgW0FjYywgKChWYWx1ZSBiYW5kIDE2IzdGKSBib3IgMTYjODApXSkuCisKKy1zcGVjIHJlYWRfdmFyaW50KCN0X2NvbXBhY3R7fSwgbm9uX25lZ19pbnRlZ2VyKCksIG5vbl9uZWdfaW50ZWdlcigpKSAtPiBub25fbmVnX2ludGVnZXIoKS4KK3JlYWRfdmFyaW50KFRoaXMwLCBBY2MsIENvdW50KSAtPgorICB7VGhpczEsIHtvaywgQnl0ZX19ID0gcmVhZChUaGlzMCwgYnl0ZSksCisgIGNhc2UgKEJ5dGUgYmFuZCAxNiM4MCkgb2YKKyAgICAwIC0+IHtUaGlzMSwge29rLCAoQnl0ZSBic2wgKDcgKiBDb3VudCkpICsgQWNjfX07CisgICAgXyAtPiByZWFkX3ZhcmludChUaGlzMSwgKChCeXRlIGJhbmQgMTYjN2YpIGJzbCAoNyAqIENvdW50KSkgKyBBY2MsIENvdW50ICsgMSkKKyAgZW5kLgorCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57CisgICAgICAgIG5hbWUgPSBOYW1lLAorICAgICAgICB0eXBlID0gVHlwZSwKKyAgICAgICAgc2VxaWQgPSBTZXFpZH0pIC0+CisgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHtieXRlLCA/UFJPVE9DT0xfSUR9KSwKKyAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwge2J5dGUsICg/VkVSU0lPTl8xIGJhbmQgP1ZFUlNJT05fTUFTSykgYm9yIChUeXBlIGJzbCA/VFlQRV9TSElGVF9BTU9VTlQpfSksCisgIHtUaGlzMywgb2t9ID0gd3JpdGUoVGhpczIsIHt1aTMyLCBTZXFpZH0pLAorICB7VGhpczQsIG9rfSA9IHdyaXRlKFRoaXMzLCB7c3RyaW5nLCBOYW1lfSksCisgIHtUaGlzNCwgb2t9OworCit3cml0ZShUaGlzLCBtZXNzYWdlX2VuZCkgLT4ge1RoaXMsIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9maWVsZF9iZWdpbnsKKyAgICAgICBuYW1lID0gX05hbWUsCisgICAgICAgdHlwZSA9IFR5cGUsCisgICAgICAgaWQgPSBJZH0pCit3aGVuIChUeXBlID06PSA/dFR5cGVfQk9PTCkgLT4ge1RoaXMwI3RfY29tcGFjdHt3cml0ZV9pZCA9IElkfSwgb2t9OworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueworICAgICAgIG5hbWUgPSBfTmFtZSwKKyAgICAgICB0eXBlID0gVHlwZSwKKyAgICAgICBpZCA9IElkfSkgLT4KKyAgd3JpdGVfZmllbGRfYmVnaW4oVGhpczAsIHR5cGVpZF90b19jb21wYWN0KFR5cGUpLCBJZCk7CisKK3dyaXRlKFRoaXMsIGZpZWxkX3N0b3ApIC0+IHdyaXRlKFRoaXMsIHtieXRlLCA/dFR5cGVfU1RPUH0pOworCit3cml0ZShUaGlzLCBmaWVsZF9lbmQpIC0+IHtUaGlzLCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWFwX2JlZ2lueworICAgICAga3R5cGUgPSBfS3R5cGUsCisgICAgICB2dHlwZSA9IF9WdHlwZSwKKyAgICAgIHNpemUgPSBTaXplfSkKK3doZW4gU2l6ZSA9Oj0gMCAtPgorICB3cml0ZShUaGlzMCwge2J5dGUsIDB9KTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9tYXBfYmVnaW57CisgICAgICAga3R5cGUgPSBLdHlwZSwKKyAgICAgICB2dHlwZSA9IFZ0eXBlLAorICAgICAgIHNpemUgPSBTaXplfSkgLT4KKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge3VpMzIsIFNpemV9KSwKKyAgd3JpdGUoVGhpczEsIHtieXRlLCAodHlwZWlkX3RvX2NvbXBhY3QoS3R5cGUpIGJzbCA0KSBib3IgdHlwZWlkX3RvX2NvbXBhY3QoVnR5cGUpfSk7CisKK3dyaXRlKFRoaXMsIG1hcF9lbmQpIC0+IHtUaGlzLCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbGlzdF9iZWdpbnsKKyAgICAgICAgZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgc2l6ZSA9IFNpemV9KQord2hlbiBTaXplIDwgMTYjZiAtPgorICB3cml0ZShUaGlzMCwge2J5dGUsIChTaXplIGJzbCA0KSBib3IgdHlwZWlkX3RvX2NvbXBhY3QoRXR5cGUpfSk7CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbGlzdF9iZWdpbnsKKyAgICAgICAgZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7Ynl0ZSwgMTYjZjAgYm9yIHR5cGVpZF90b19jb21wYWN0KEV0eXBlKX0pLAorICB3cml0ZShUaGlzMSwge3VpMzIsIFNpemV9KTsKKword3JpdGUoVGhpcywgbGlzdF9lbmQpIC0+IHtUaGlzLCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfc2V0X2JlZ2lueworICAgICAgICBldHlwZSA9IEV0eXBlLAorICAgICAgICBzaXplID0gU2l6ZX0pIC0+CisgIHdyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbGlzdF9iZWdpbntldHlwZSA9IEV0eXBlLCBzaXplID0gIFNpemV9KTsKKword3JpdGUoVGhpcywgc2V0X2VuZCkgLT4ge1RoaXMsIG9rfTsKKword3JpdGUoVGhpcyA9ICN0X2NvbXBhY3R7d3JpdGVfc3RhY2sgPSBTdGFja30sICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSkgLT4KKyAge1RoaXMjdF9jb21wYWN0e3dyaXRlX3N0YWNrID0gWzB8U3RhY2tdfSwgb2t9Oword3JpdGUoVGhpcyA9ICN0X2NvbXBhY3R7d3JpdGVfc3RhY2sgPSBbX3xUXX0sIHN0cnVjdF9lbmQpIC0+CisgIHtUaGlzI3RfY29tcGFjdHt3cml0ZV9zdGFjayA9IFR9LCBva307CisKK3dyaXRlKFRoaXMgPSAjdF9jb21wYWN0e3dyaXRlX2lkID0gP0lEX05PTkV9LCB7Ym9vbCwgVmFsdWV9KSAtPgorICB3cml0ZShUaGlzLCB7Ynl0ZSwgYm9vbF90b19jYm9vbChWYWx1ZSl9KTsKKword3JpdGUoVGhpczAgPSAjdF9jb21wYWN0e3dyaXRlX2lkID0gSWR9LCB7Ym9vbCwgVmFsdWV9KSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlX2ZpZWxkX2JlZ2luKFRoaXMwLCBib29sX3RvX2Nib29sKFZhbHVlKSwgSWQpLAorICB7VGhpczEjdF9jb21wYWN0e3dyaXRlX2lkID0gP0lEX05PTkV9LCBva307CisKK3dyaXRlKFRoaXMsIHtieXRlLCBWYWx1ZX0pIHdoZW4gaXNfaW50ZWdlcihWYWx1ZSkgLT4KKyAgd3JpdGUoVGhpcywgPDxWYWx1ZTo4L2JpZy1zaWduZWQ+Pik7CisKK3dyaXRlKFRoaXMsIHtpMTYsIFZhbHVlfSkgd2hlbiBpc19pbnRlZ2VyKFZhbHVlKSAtPiB3cml0ZShUaGlzLCB0b192YXJpbnQodG9femlnemFnKFZhbHVlKSwgW10pKTsKK3dyaXRlKFRoaXMsIHt1aTMyLCBWYWx1ZX0pIHdoZW4gaXNfaW50ZWdlcihWYWx1ZSkgLT4gd3JpdGUoVGhpcywgdG9fdmFyaW50KFZhbHVlLCBbXSkpOword3JpdGUoVGhpcywge2kzMiwgVmFsdWV9KSB3aGVuIGlzX2ludGVnZXIoVmFsdWUpIC0+CisgIHdyaXRlKFRoaXMsIHRvX3ZhcmludCh0b196aWd6YWcoVmFsdWUpLCBbXSkpOword3JpdGUoVGhpcywge2k2NCwgVmFsdWV9KSB3aGVuIGlzX2ludGVnZXIoVmFsdWUpIC0+IHdyaXRlKFRoaXMsIHRvX3ZhcmludCh0b196aWd6YWcoVmFsdWUpLCBbXSkpOworCit3cml0ZShUaGlzLCB7ZG91YmxlLCBEb3VibGV9KSAtPgorICB3cml0ZShUaGlzLCA8PERvdWJsZTo2NC9mbG9hdC1zaWduZWQtbGl0dGxlPj4pOworCit3cml0ZShUaGlzMCwge3N0cmluZywgU3RyfSkgd2hlbiBpc19saXN0KFN0cikgLT4KKyAgJSBUT0RPOiBsaW1pdCBsZW5ndGgKKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge3VpMzIsIGxlbmd0aChTdHIpfSksCisgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIGxpc3RfdG9fYmluYXJ5KFN0cikpLAorICB7VGhpczIsIG9rfTsKKword3JpdGUoVGhpczAsIHtzdHJpbmcsIEJpbn0pIHdoZW4gaXNfYmluYXJ5KEJpbikgLT4KKyAgJSBUT0RPOiBsaW1pdCBsZW5ndGgKKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge3VpMzIsIHNpemUoQmluKX0pLAorICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCBCaW4pLAorICB7VGhpczIsIG9rfTsKKworJSUgRGF0YSA6OiBpb2xpc3QoKQord3JpdGUoVGhpcyA9ICN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gVHJhbnN9LCBEYXRhKSAtPgorICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShUcmFucywgRGF0YSksCisgIHtUaGlzI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgorCislJQorJSUKKworcmVhZChUaGlzMCwgbWVzc2FnZV9iZWdpbikgLT4KKyAge1RoaXMxLCB7b2ssID9QUk9UT0NPTF9JRH19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICB7VGhpczIsIHtvaywgVmVyQW5kVHlwZX19ID0gcmVhZChUaGlzMSwgdWJ5dGUpLAorICA/VkVSU0lPTl8xID0gVmVyQW5kVHlwZSBiYW5kID9WRVJTSU9OX01BU0ssCisgIHtUaGlzMywge29rLCBTZXFJZH19ID0gcmVhZChUaGlzMiwgdWkzMiksCisgIHtUaGlzNCwge29rLCBOYW1lfX0gPSByZWFkKFRoaXMzLCBzdHJpbmcpLAorICB7VGhpczQsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueworICAgICAgICAgICAgIG5hbWUgID0gYmluYXJ5X3RvX2xpc3QoTmFtZSksCisgICAgICAgICAgICAgdHlwZSAgPSAoVmVyQW5kVHlwZSBic3IgP1RZUEVfU0hJRlRfQU1PVU5UKSBiYW5kID9UWVBFX0JJVFMsCisgICAgICAgICAgICAgc2VxaWQgPSBTZXFJZH19OworCityZWFkKFRoaXMsIG1lc3NhZ2VfZW5kKSAtPiB7VGhpcywgb2t9OworCityZWFkKFRoaXMgPSAjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBTdGFja30sIHN0cnVjdF9iZWdpbikgLT4KKyAge1RoaXMjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBbMHxTdGFja119LCBva307CityZWFkKFRoaXMgPSAjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBbX0h8VF19LCBzdHJ1Y3RfZW5kKSAtPgorICB7VGhpcyN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFR9LCBva307CisKK3JlYWQoVGhpczAgPSAjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBbTGFzdElkfFRdfSwgZmllbGRfYmVnaW4pIC0+CisgIHtUaGlzMSwge29rLCBCeXRlfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIGNhc2UgQnl0ZSBiYW5kIDE2I2Ygb2YKKyAgICBDb21wYWN0VHlwZSA9ID90VHlwZV9TVE9QIC0+CisgICAgICB7VGhpczEsICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gQ29tcGFjdFR5cGV9fTsKKyAgICBDb21wYWN0VHlwZSAtPgorICAgICAge1RoaXMyLCB7b2ssIElkfX0gPSBjYXNlIEJ5dGUgYnNyIDQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0+IHJlYWQoVGhpczEsIGkxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWREaWZmIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7VGhpczEsIHtvaywgTGFzdElkICsgSWREaWZmfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgY2FzZSBjb21wYWN0X3RvX3R5cGVpZChDb21wYWN0VHlwZSkgb2YKKyAgICAgICAgP3RUeXBlX0JPT0wgLT4KKyAgICAgICAgICB7VGhpczIjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBbSWR8VF0sIHJlYWRfdmFsdWUgPSBjYm9vbF90b19ib29sKENvbXBhY3RUeXBlKX0sCisgICAgICAgICAgICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gSWR9fTsKKyAgICAgICAgVHlwZSAtPgorICAgICAgICAgIHtUaGlzMiN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFtJZHxUXX0sCisgICAgICAgICAgICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gVHlwZSwgaWQgPSBJZH19CisgICAgICBlbmQKKyAgZW5kOworCityZWFkKFRoaXMsIGZpZWxkX2VuZCkgLT4ge1RoaXMsIG9rfTsKKworcmVhZChUaGlzMCwgbWFwX2JlZ2luKSAtPgorICB7VGhpczEsIHtvaywgU2l6ZX19ICA9IHJlYWQoVGhpczAsIHVpMzIpLAorICB7VGhpczIsIHtvaywgS1Z9fSA9IGNhc2UgU2l6ZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgMCAtPiB7VGhpczEsIHtvaywgMH19OworICAgICAgICAgICAgICAgICAgICAgICAgXyAtPiByZWFkKFRoaXMxLCB1Ynl0ZSkKKyAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgIHtUaGlzMiwgI3Byb3RvY29sX21hcF9iZWdpbntrdHlwZSA9IGNvbXBhY3RfdG9fdHlwZWlkKEtWIGJzciA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0eXBlID0gY29tcGFjdF90b190eXBlaWQoS1YgYmFuZCAxNiNmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CityZWFkKFRoaXMsIG1hcF9lbmQpIC0+IHtUaGlzLCBva307CisKK3JlYWQoVGhpczAsIGxpc3RfYmVnaW4pIC0+CisgIHtUaGlzMSwge29rLCBTaXplQW5kVHlwZX19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICB7VGhpczIsIHtvaywgU2l6ZX19ID0gY2FzZSAoU2l6ZUFuZFR5cGUgYnNyIDQpIGJhbmQgMTYjZiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAxNiNmIC0+IHJlYWQoVGhpczEsIHVpMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICBFbHNlIC0+IHtUaGlzMSwge29rLCBFbHNlfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAge1RoaXMyLCAjcHJvdG9jb2xfbGlzdF9iZWdpbntldHlwZSA9IGNvbXBhY3RfdG9fdHlwZWlkKFNpemVBbmRUeXBlIGJhbmQgMTYjZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9fTsKKworcmVhZChUaGlzLCBsaXN0X2VuZCkgLT4ge1RoaXMsIG9rfTsKKworcmVhZChUaGlzMCwgc2V0X2JlZ2luKSAtPgorICB7VGhpczEsIHtvaywgU2l6ZUFuZFR5cGV9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAge1RoaXMyLCB7b2ssIFNpemV9fSA9IGNhc2UgKFNpemVBbmRUeXBlIGJzciA0KSBiYW5kIDE2I2Ygb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMTYjZiAtPiByZWFkKFRoaXMxLCB1aTMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRWxzZSAtPiB7VGhpczEsIHtvaywgRWxzZX19CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgIHtUaGlzMiwgI3Byb3RvY29sX3NldF9iZWdpbntldHlwZSA9IGNvbXBhY3RfdG9fdHlwZWlkKFNpemVBbmRUeXBlIGJhbmQgMTYjZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9fTsKKworcmVhZChUaGlzLCBzZXRfZW5kKSAtPiB7VGhpcywgb2t9OworCityZWFkKFRoaXMwLCBmaWVsZF9zdG9wKSAtPgorICB7VGhpczEsIHtvaywgP3RUeXBlX1NUT1B9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAge1RoaXMxLCBva307CisKKyUlCisKK3JlYWQoVGhpczAgPSAjdF9jb21wYWN0e3JlYWRfdmFsdWUgPSA/Q0JPT0xfTk9ORX0sIGJvb2wpIC0+CisgIHtUaGlzMSwge29rLCBCeXRlfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIHtUaGlzMSwge29rLCBjYm9vbF90b19ib29sKEJ5dGUpfX07CisKK3JlYWQoVGhpczAgPSAjdF9jb21wYWN0e3JlYWRfdmFsdWUgPSBCb29sfSwgYm9vbCkgLT4KKyAge1RoaXMwI3RfY29tcGFjdHtyZWFkX3ZhbHVlID0gP0NCT09MX05PTkV9LCB7b2ssIEJvb2x9fTsKKworcmVhZChUaGlzMCwgdWJ5dGUpIC0+CisgIHtUaGlzMSwge29rLCA8PFZhbDo4L2ludGVnZXItdW5zaWduZWQtYmlnLCBfL2JpbmFyeT4+fX0gPSByZWFkX2RhdGEoVGhpczAsIDEpLAorICB7VGhpczEsIHtvaywgVmFsfX07CisKK3JlYWQoVGhpczAsIGJ5dGUpIC0+CisgIHtUaGlzMSwgQnl0ZXN9ID0gcmVhZF9kYXRhKFRoaXMwLCAxKSwKKyAgY2FzZSBCeXRlcyBvZgorICAgIHtvaywgPDxWYWw6OC9pbnRlZ2VyLXNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59IC0+IHtUaGlzMSwge29rLCBWYWx9fTsKKyAgICBFbHNlIC0+IHtUaGlzMSwgRWxzZX0KKyAgZW5kOworCityZWFkKFRoaXMwLCBpMTYpIC0+CisgIHtUaGlzMSwge29rLCBaaWd6YWd9fSA9IHJlYWRfdmFyaW50KFRoaXMwLCAwLCAwKSwKKyAge1RoaXMxLCB7b2ssIGZyb21femlnemFnKFppZ3phZyl9fTsKKworcmVhZChUaGlzMCwgdWkzMikgLT4gcmVhZF92YXJpbnQoVGhpczAsIDAsIDApOworCityZWFkKFRoaXMwLCBpMzIpIC0+CisgIHtUaGlzMSwge29rLCBaaWd6YWd9fSA9IHJlYWRfdmFyaW50KFRoaXMwLCAwLCAwKSwKKyAge1RoaXMxLCB7b2ssIGZyb21femlnemFnKFppZ3phZyl9fTsKKworcmVhZChUaGlzMCwgaTY0KSAtPgorICB7VGhpczEsIHtvaywgWmlnemFnfX0gPSByZWFkX3ZhcmludChUaGlzMCwgMCwgMCksCisgIHtUaGlzMSwge29rLCBmcm9tX3ppZ3phZyhaaWd6YWcpfX07CisKK3JlYWQoVGhpczAsIGRvdWJsZSkgLT4KKyAge1RoaXMxLCBCeXRlc30gPSByZWFkX2RhdGEoVGhpczAsIDgpLAorICBjYXNlIEJ5dGVzIG9mCisgICAge29rLCA8PFZhbDo2NC9mbG9hdC1zaWduZWQtbGl0dGxlLCBfL2JpbmFyeT4+fSAtPiB7VGhpczEsIHtvaywgVmFsfX07CisgICAgRWxzZSAtPiB7VGhpczEsIEVsc2V9CisgIGVuZDsKKworJSByZXR1cm5zIGEgYmluYXJ5IGRpcmVjdGx5LCBjYWxsIGJpbmFyeV90b19saXN0IGlmIG5lY2Vzc2FyeQorcmVhZChUaGlzMCwgc3RyaW5nKSAtPgorICB7VGhpczEsIHtvaywgU3p9fSAgPSByZWFkKFRoaXMwLCB1aTMyKSwKKyAgcmVhZF9kYXRhKFRoaXMxLCBTeikuCisKKy1zcGVjIHJlYWRfZGF0YSgjdF9jb21wYWN0e30sIG5vbl9uZWdfaW50ZWdlcigpKSAtPgorICAgIHsjdF9jb21wYWN0e30sIHtvaywgYmluYXJ5KCl9IHwge2Vycm9yLCBfUmVhc29ufX0uCityZWFkX2RhdGEoVGhpcywgMCkgLT4ge1RoaXMsIHtvaywgPDw+Pn19OworcmVhZF9kYXRhKFRoaXMgPSAjdF9jb21wYWN0e3RyYW5zcG9ydCA9IFRyYW5zfSwgTGVuKSB3aGVuIGlzX2ludGVnZXIoTGVuKSBhbmRhbHNvIExlbiA+IDAgLT4KKyAgICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFRyYW5zLCBMZW4pLAorICAgIHtUaGlzI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgorCisKKyUlJSUgRkFDVE9SWSBHRU5FUkFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSUgcmV0dXJucyBhIChmdW4oKSAtPiB0aHJpZnRfcHJvdG9jb2woKSkKK25ld19wcm90b2NvbF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnksIF9PcHRpb25zKSAtPgorICBGID0gZnVuKCkgLT4KKyAgICAgICAgICBjYXNlIFRyYW5zcG9ydEZhY3RvcnkoKSBvZgorICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9IC0+CisgICAgICAgICAgICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sOm5ldygKKyAgICAgICAgICAgICAgICBUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgW10pOworICAgICAgICAgICAge2Vycm9yLCBFcnJvcn0gLT4KKyAgICAgICAgICAgICAge2Vycm9yLCBFcnJvcn0KKyAgICAgICAgICBlbmQKKyAgICAgIGVuZCwKKyAge29rLCBGfS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9maWxlX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsCmluZGV4IGJhM2FhODkuLjA3MTE1MmIgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9maWxlX3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybApAQCAtMjEsNjkgKzIxLDk1IEBACiAKIC1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCiAKLS1leHBvcnQoW25ld19yZWFkZXIvMSwKLSAgICAgICAgIG5ldy8xLAotICAgICAgICAgbmV3LzIsCi0gICAgICAgICB3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGNvbnN0cnVjdG9ycworLWV4cG9ydChbbmV3LzEsIG5ldy8yXSkuCislJSBwcm90b2NvbCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgcmVhZF9leGFjdC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCislJSBsZWdhY3kgYXBpCistZXhwb3J0KFtuZXdfcmVhZGVyLzFdKS4KIAotLXJlY29yZCh0X2ZpbGVfdHJhbnNwb3J0LCB7ZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2Nsb3NlID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSB3cml0ZX0pLgotLXR5cGUgc3RhdGUoKSA6OiAjdF9maWxlX3RyYW5zcG9ydHt9LgotLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgogCi0lJSUlIENPTlNUUlVDVElPTiAgICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKy1yZWNvcmQodF9maWxlLCB7CisgIGRldmljZSwKKyAgc2hvdWxkX2Nsb3NlID0gdHJ1ZSwKKyAgbW9kZSA9IHdyaXRlCit9KS4KIAotbmV3X3JlYWRlcihGaWxlbmFtZSkgLT4KLSAgICBjYXNlIGZpbGU6b3BlbihGaWxlbmFtZSwgW3JlYWQsIGJpbmFyeSwge3JlYWRfYWhlYWQsIDEwMjQqMTAyNH1dKSBvZgotICAgICAgICB7b2ssIElPRGV2aWNlfSAtPgotICAgICAgICAgICAgbmV3KElPRGV2aWNlLCBbe3Nob3VsZF9jbG9zZSwgdHJ1ZX0sIHttb2RlLCByZWFkfV0pOwotICAgICAgICBFcnJvciAtPiBFcnJvcgotICAgIGVuZC4KKy10eXBlIHN0YXRlKCkgOjogI3RfZmlsZXt9LgogCi1uZXcoRGV2aWNlKSAtPgotICAgIG5ldyhEZXZpY2UsIFtdKS4KIAotJSUgRGV2aWNlIDo6IGlvX2RldmljZSgpCi0lJQorLXNwZWMgbmV3KERldmljZTo6ZmlsZTppb19kZXZpY2UoKSkgLT4KKyAgdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgorCituZXcoRGV2aWNlKSAtPiBuZXcoRGV2aWNlLCBbXSkuCisKKy1zcGVjIG5ldyhEZXZpY2U6OmZpbGU6aW9fZGV2aWNlKCksIE9wdHM6Omxpc3QoKSkgLT4KKyAgdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgorCiAlJSBEZXZpY2Ugc2hvdWxkIGJlIG9wZW5lZCBpbiByYXcgYW5kIGJpbmFyeSBtb2RlLgogbmV3KERldmljZSwgT3B0cykgd2hlbiBpc19saXN0KE9wdHMpIC0+Ci0gICAgU3RhdGUgPSBwYXJzZV9vcHRzKE9wdHMsICN0X2ZpbGVfdHJhbnNwb3J0e2RldmljZSA9IERldmljZX0pLAotICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKyAgU3RhdGUgPSBwYXJzZV9vcHRzKE9wdHMsICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlfSksCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KIAogCi0lJSBQYXJzZSBvcHRpb25zCi1wYXJzZV9vcHRzKFt7c2hvdWxkX2Nsb3NlLCBCb29sfSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBpc19ib29sZWFuKEJvb2wpIC0+Ci0gICAgcGFyc2Vfb3B0cyhSZXN0LCBTdGF0ZSN0X2ZpbGVfdHJhbnNwb3J0e3Nob3VsZF9jbG9zZSA9IEJvb2x9KTsKLXBhcnNlX29wdHMoW3ttb2RlLCBNb2RlfSB8IFJlc3RdLCBTdGF0ZSkKLSAgd2hlbiBNb2RlID06PSB3cml0ZTsKLSAgICAgICBNb2RlID06PSByZWFkIC0+Ci0gICAgcGFyc2Vfb3B0cyhSZXN0LCBTdGF0ZSN0X2ZpbGVfdHJhbnNwb3J0e21vZGUgPSBNb2RlfSk7CitwYXJzZV9vcHRzKFt7c2hvdWxkX2Nsb3NlLCBCb29sfXxSZXN0XSwgU3RhdGUpCit3aGVuIGlzX2Jvb2xlYW4oQm9vbCkgLT4KKyAgcGFyc2Vfb3B0cyhSZXN0LCBTdGF0ZSN0X2ZpbGV7c2hvdWxkX2Nsb3NlID0gQm9vbH0pOworcGFyc2Vfb3B0cyhbe21vZGUsIE1vZGV9fFJlc3RdLCBTdGF0ZSkKK3doZW4gTW9kZSA9Oj0gd3JpdGU7IE1vZGUgPTo9IHJlYWQgLT4KKyAgcGFyc2Vfb3B0cyhSZXN0LCBTdGF0ZSN0X2ZpbGV7bW9kZSA9IE1vZGV9KTsKIHBhcnNlX29wdHMoW10sIFN0YXRlKSAtPgotICAgICBTdGF0ZS4KKyAgU3RhdGUuCiAKIAotJSUlJSBUUkFOU1BPUlQgSU1QTCAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCi0KLXdyaXRlKFRoaXMgPSAjdF9maWxlX3RyYW5zcG9ydHtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSB3cml0ZX0sIERhdGEpIC0+Ci0gICAge1RoaXMsIGZpbGU6d3JpdGUoRGV2aWNlLCBEYXRhKX07Ci13cml0ZShUaGlzLCBfRCkgLT4KLSAgICB7VGhpcywge2Vycm9yLCByZWFkX21vZGV9fS4KKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KIAogCi1yZWFkKFRoaXMgPSAjdF9maWxlX3RyYW5zcG9ydHtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSByZWFkfSwgTGVuKQotICB3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KLSAgICB7VGhpcywgZmlsZTpyZWFkKERldmljZSwgTGVuKX07Ci1yZWFkKFRoaXMsIF9EKSAtPgotICAgIHtUaGlzLCB7ZXJyb3IsIHJlYWRfbW9kZX19LgorcmVhZChTdGF0ZSA9ICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gcmVhZH0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBjYXNlIGZpbGU6cmVhZChEZXZpY2UsIExlbikgb2YKKyAgICBlb2YgLT4ge1N0YXRlLCB7ZXJyb3IsIGVvZn19OworICAgIHtvaywgUmVzdWx0fSAtPiB7U3RhdGUsIHtvaywgaW9saXN0X3RvX2JpbmFyeShSZXN1bHQpfX0KKyAgZW5kOworcmVhZChTdGF0ZSwgXykgLT4KKyAge1N0YXRlLCB7ZXJyb3IsIHdyaXRlX21vZGV9fS4KIAotZmx1c2goVGhpcyA9ICN0X2ZpbGVfdHJhbnNwb3J0e2RldmljZSA9IERldmljZSwgbW9kZSA9IHdyaXRlfSkgLT4KLSAgICB7VGhpcywgZmlsZTpzeW5jKERldmljZSl9LgogCi1jbG9zZShUaGlzID0gI3RfZmlsZV90cmFuc3BvcnR7ZGV2aWNlID0gRGV2aWNlLCBzaG91bGRfY2xvc2UgPSBTQ30pIC0+Ci0gICAgY2FzZSBTQyBvZgotICAgICAgICB0cnVlIC0+Ci0gICAgICAgICAgICB7VGhpcywgZmlsZTpjbG9zZShEZXZpY2UpfTsKLSAgICAgICAgZmFsc2UgLT4KLSAgICAgICAgICAgIHtUaGlzLCBva30KLSAgICBlbmQuCityZWFkX2V4YWN0KFN0YXRlID0gI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSByZWFkfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIGNhc2UgZmlsZTpyZWFkKERldmljZSwgTGVuKSBvZgorICAgIGVvZiAtPiB7U3RhdGUsIHtlcnJvciwgZW9mfX07CisgICAge29rLCBSZXN1bHR9IC0+CisgICAgICBjYXNlIGlvbGlzdF9zaXplKFJlc3VsdCkgb2YKKyAgICAgICAgWCB3aGVuIFggPCBMZW4gLT4ge1N0YXRlLCB7ZXJyb3IsIGVvZn19OworICAgICAgICBfIC0+IHtTdGF0ZSwge29rLCBpb2xpc3RfdG9fYmluYXJ5KFJlc3VsdCl9fQorICAgICAgZW5kCisgIGVuZDsKK3JlYWRfZXhhY3QoU3RhdGUsIF8pIC0+CisgIHtTdGF0ZSwge2Vycm9yLCB3cml0ZV9tb2RlfX0uCisKKword3JpdGUoU3RhdGUgPSAjdF9maWxle2RldmljZSA9IERldmljZSwgbW9kZSA9IHdyaXRlfSwgRGF0YSkgLT4KKyAge1N0YXRlLCBmaWxlOndyaXRlKERldmljZSwgRGF0YSl9Oword3JpdGUoU3RhdGUsIF8pIC0+CisgIHtTdGF0ZSwge2Vycm9yLCByZWFkX21vZGV9fS4KKworCitmbHVzaChTdGF0ZSA9ICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gd3JpdGV9KSAtPgorICB7U3RhdGUsIGZpbGU6c3luYyhEZXZpY2UpfS4KKworCitjbG9zZShTdGF0ZSA9ICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlLCBzaG91bGRfY2xvc2UgPSBTQ30pIC0+CisgIGNhc2UgU0Mgb2YKKyAgICB0cnVlIC0+IHtTdGF0ZSwgZmlsZTpjbG9zZShEZXZpY2UpfTsKKyAgICBmYWxzZSAtPiB7U3RhdGUsIG9rfQorICBlbmQuCisKKworJSUgbGVnYWN5IGFwaS4gbGVmdCBmb3IgY29tcGF0aWJpbGl0eQorbmV3X3JlYWRlcihGaWxlbmFtZSkgLT4KKyAgY2FzZSBmaWxlOm9wZW4oRmlsZW5hbWUsIFtyZWFkLCBiaW5hcnksIHtyZWFkX2FoZWFkLCAxMDI0KjEwMjR9XSkgb2YKKyAgICB7b2ssIElPRGV2aWNlfSAtPiBuZXcoSU9EZXZpY2UsIFt7c2hvdWxkX2Nsb3NlLCB0cnVlfSwge21vZGUsIHJlYWR9XSk7CisgICAgRXJyb3IgLT4gRXJyb3IKKyAgZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwKaW5kZXggZWNhM2NiZS4uOWE1ZDZhZiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybApAQCAtMjEsODMgKzIxLDEwNiBAQAogCiAtYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgogCi0lJSBBUEkKKyUlIGNvbnN0cnVjdG9yCiAtZXhwb3J0KFtuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgogCi0lJSB0aHJpZnRfdHJhbnNwb3J0IGNhbGxiYWNrcwotLWV4cG9ydChbd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCiAKLS1yZWNvcmQoZnJhbWVkX3RyYW5zcG9ydCwge3dyYXBwZWQsICUgYSB0aHJpZnRfdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2J1ZmZlciwgJSBpb2xpc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyICUgaW9saXN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuCi0tdHlwZSBzdGF0ZSgpIDo6ICNmcmFtZWRfdHJhbnNwb3J0e30uCistcmVjb3JkKHRfZnJhbWVkLCB7CisgIHdyYXBwZWQsCisgIHJlYWRfYnVmZmVyLAorICB3cml0ZV9idWZmZXIKK30pLgorCistdHlwZSBzdGF0ZSgpIDo6ICN0X2ZyYW1lZHt9LgorCisKKy1zcGVjIG5ldyhUcmFuc3BvcnQ6OnRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKSkgLT4KKyAgdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgorCituZXcoV3JhcHBlZCkgLT4KKyAgU3RhdGUgPSAjdF9mcmFtZWR7CisgICAgd3JhcHBlZCA9IFdyYXBwZWQsCisgICAgcmVhZF9idWZmZXIgPSBbXSwKKyAgICB3cml0ZV9idWZmZXIgPSBbXQorICB9LAorICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCisKKwogLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgogCi1uZXcoV3JhcHBlZFRyYW5zcG9ydCkgLT4KLSAgICBTdGF0ZSA9ICNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9idWZmZXIgPSBbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlciA9IFtdfSwKLSAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCiAKLSUlIFdyaXRlcyBkYXRhIGludG8gdGhlIGJ1ZmZlcgotd3JpdGUoU3RhdGUgPSAjZnJhbWVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBXQnVmfSwgRGF0YSkgLT4KLSAgICB7U3RhdGUjZnJhbWVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbV0J1ZiwgRGF0YV19LCBva30uCityZWFkKFN0YXRlID0gI3RfZnJhbWVke3dyYXBwZWQgPSBXcmFwcGVkLCByZWFkX2J1ZmZlciA9IEJ1ZmZlcn0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZmZlciksCisgIGNhc2UgQmluYXJ5IG9mCisgICAgPDw+PiB3aGVuIExlbiA+IDAgLT4KKyAgICAgIGNhc2UgbmV4dF9mcmFtZShXcmFwcGVkKSBvZgorICAgICAgICB7TmV3U3RhdGUsIHtvaywgRnJhbWV9fSAtPgorICAgICAgICAgIE5ld0JpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoW0JpbmFyeSwgRnJhbWVdKSwKKyAgICAgICAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKE5ld0JpbmFyeSksIExlbiksCisgICAgICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShOZXdCaW5hcnksIEdpdmUpLAorICAgICAgICAgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gTmV3U3RhdGUsIHJlYWRfYnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fTsKKyAgICAgICAge05ld1N0YXRlLCBFcnJvcn0gLT4KKyAgICAgICAgICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IE5ld1N0YXRlfSwgRXJyb3J9CisgICAgICBlbmQ7CisgICAgJSUgcmVhZCBvZiB6ZXJvIGJ5dGVzCisgICAgPDw+PiAtPiB7U3RhdGUsIHtvaywgPDw+Pn19OworICAgICUlIHJlYWQgYnVmZmVyIGlzIG5vbmVtcHR5CisgICAgXyAtPgorICAgICAgR2l2ZSA9IG1pbihpb2xpc3Rfc2l6ZShCaW5hcnkpLCBMZW4pLAorICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIEdpdmUpLAorICAgICAge1N0YXRlI3RfZnJhbWVke3JlYWRfYnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fQorICBlbmQuCiAKLSUlIEZsdXNoZXMgdGhlIGJ1ZmZlciB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotZmx1c2goU3RhdGUwID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkID0gV3JhcHBlZDB9KSAtPgotICAgIEZyYW1lTGVuID0gaW9saXN0X3NpemUoQnVmZmVyKSwKLSAgICBEYXRhICAgICA9IFs8PEZyYW1lTGVuOjMyL2ludGVnZXItc2lnbmVkLWJpZz4+LCBCdWZmZXJdLAogCi0gICAge1dyYXBwZWQxLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFdyYXBwZWQwLCBEYXRhKSwKK3JlYWRfZXhhY3QoU3RhdGUgPSAjdF9mcmFtZWR7d3JhcHBlZCA9IFdyYXBwZWQsIHJlYWRfYnVmZmVyID0gQnVmZmVyfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoQnVmZmVyKSwKKyAgY2FzZSBpb2xpc3Rfc2l6ZShCaW5hcnkpIG9mCisgICAgJSUgcmVhZCBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gcmVxdWVzdGVkIHJlYWQgc2l6ZQorICAgIFggd2hlbiBYID49IExlbiAtPgorICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIExlbiksCisgICAgICB7U3RhdGUjdF9mcmFtZWR7cmVhZF9idWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19OworICAgICUlIHJlYWQgYnVmZmVyIGlzIGluc3VmZmljaWVudCBmb3IgcmVxdWVzdGVkIHJlYWQgc2l6ZQorICAgIF8gLT4KKyAgICAgIGNhc2UgbmV4dF9mcmFtZShXcmFwcGVkKSBvZgorICAgICAgICB7TmV3U3RhdGUsIHtvaywgRnJhbWV9fSAtPgorICAgICAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgICAgICBTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gTmV3U3RhdGUsIHJlYWRfYnVmZmVyID0gW0J1ZmZlciwgRnJhbWVdfSwKKyAgICAgICAgICAgIExlbgorICAgICAgICAgICk7CisgICAgICAgIHtOZXdTdGF0ZSwgRXJyb3J9IC0+CisgICAgICAgICAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBOZXdTdGF0ZX0sIEVycm9yfQorICAgICAgZW5kCisgIGVuZC4KIAotICAgIHtXcmFwcGVkMiwgX30gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyYXBwZWQxKSwKK25leHRfZnJhbWUoVHJhbnNwb3J0KSAtPgorICBjYXNlIHRocmlmdF90cmFuc3BvcnQ6cmVhZF9leGFjdChUcmFuc3BvcnQsIDQpIG9mCisgICAge05ld1N0YXRlLCB7b2ssIDw8RnJhbWVMZW5ndGg6MzIvaW50ZWdlci1zaWduZWQtYmlnPj59fSAtPgorICAgICAgdGhyaWZ0X3RyYW5zcG9ydDpyZWFkX2V4YWN0KE5ld1N0YXRlLCBGcmFtZUxlbmd0aCk7CisgICAgRXJyb3IgLT4gRXJyb3IKKyAgZW5kLgogCi0gICAgU3RhdGUxID0gU3RhdGUwI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQyLCB3cml0ZV9idWZmZXIgPSBbXX0sCi0gICAge1N0YXRlMSwgUmVzcG9uc2V9LgogCi0lJSBDbG9zZXMgdGhlIHRyYW5zcG9ydCBhbmQgdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci1jbG9zZShTdGF0ZSA9ICNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMH0pIC0+Ci0gICAge1dyYXBwZWQxLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShXcmFwcGVkMCksCi0gICAgTmV3U3RhdGUgPSBTdGF0ZSNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMX0sCi0gICAge05ld1N0YXRlLCBSZXN1bHR9Lgord3JpdGUoU3RhdGUgPSAjdF9mcmFtZWR7d3JpdGVfYnVmZmVyID0gQnVmZmVyfSwgRGF0YSkgLT4KKyAge1N0YXRlI3RfZnJhbWVke3dyaXRlX2J1ZmZlciA9IFtCdWZmZXIsIERhdGFdfSwgb2t9LgogCi0lJSBSZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLXJlYWQoU3RhdGUwID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQwLCByZWFkX2J1ZmZlciA9IFJCdWZ9LAotICAgICBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIC0+Ci0gICAge1dyYXBwZWQxLCB7UkJ1ZjEsIFJCdWYxU2l6ZX19ID0KLSAgICAgICAgJSUgaWYgdGhlIHJlYWQgYnVmZmVyIGlzIGVtcHR5LCByZWFkIGFub3RoZXIgZnJhbWUKLSAgICAgICAgJSUgb3RoZXJ3aXNlLCBqdXN0IHJlYWQgZnJvbSB3aGF0J3MgbGVmdCBpbiB0aGUgYnVmZmVyCi0gICAgICAgIGNhc2UgaW9saXN0X3NpemUoUkJ1Zikgb2YKLSAgICAgICAgICAgIDAgLT4KLSAgICAgICAgICAgICAgICAlJSByZWFkIHRoZSBmcmFtZSBsZW5ndGgKLSAgICAgICAgICAgICAgICBjYXNlIHRocmlmdF90cmFuc3BvcnQ6cmVhZChXcmFwcGVkMCwgNCkgb2YKLSAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzEsCi0gICAgICAgICAgICAgICAgICAgIHtvaywgPDxGcmFtZUxlbjozMi9pbnRlZ2VyLXNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59fSAtPgotICAgICAgICAgICAgICAgICAgICAlJSB0aGVuIHJlYWQgdGhlIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgY2FzZSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoV3JhcHBlZFMxLCBGcmFtZUxlbikgb2YKLSAgICAgICAgICAgICAgICAgICAgICB7V3JhcHBlZFMyLCB7b2ssIEJpbn19IC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICB7V3JhcHBlZFMyLCB7QmluLCBlcmxhbmc6Ynl0ZV9zaXplKEJpbil9fTsKLSAgICAgICAgICAgICAgICAgICAgICB7V3JhcHBlZFMyLCB7ZXJyb3IsIFJlYXNvbjF9fSAtPgotICAgICAgICAgICAgICAgICAgICAgICAge1dyYXBwZWRTMiwge2Vycm9yLCBSZWFzb24xfX0KLSAgICAgICAgICAgICAgICAgICAgZW5kOwotICAgICAgICAgICAgICAgICAge1dyYXBwZWRTMSwge2Vycm9yLCBSZWFzb24yfX0gLT4KLSAgICAgICAgICAgICAgICAgICAge1dyYXBwZWRTMSwge2Vycm9yLCBSZWFzb24yfX0KLSAgICAgICAgICAgICAgICBlbmQ7Ci0gICAgICAgICAgICBTeiAtPgotICAgICAgICAgICAgICAgIHtXcmFwcGVkMCwge1JCdWYsIFN6fX0KLSAgICAgICAgZW5kLAogCi0gICAgJSUgcHVsbCBvZmYgR2l2ZSBieXRlcywgcmV0dXJuIHRoZW0gdG8gdGhlIHVzZXIsIGxlYXZlIHRoZSByZXN0IGluIHRoZSBidWZmZXIKLSAgICBjYXNlIFJCdWYxIG9mCi0gICAgICBlcnJvciAtPgotICAgICAgICB7IFN0YXRlMCNmcmFtZWRfdHJhbnNwb3J0IHt3cmFwcGVkID0gV3JhcHBlZDEsIHJlYWRfYnVmZmVyID0gW10gfSwKLSAgICAgICAgICB7UkJ1ZjEsIFJCdWYxU2l6ZX0gfTsKLSAgICAgIF8gLT4KLSAgICAgICAgR2l2ZSA9IG1pbihSQnVmMVNpemUsIExlbiksCi0gICAgICAgIDw8RGF0YTpHaXZlL2JpbmFyeSwgUkJ1ZjIvYmluYXJ5Pj4gPSBpb2xpc3RfdG9fYmluYXJ5KFJCdWYxKSwKK2ZsdXNoKFN0YXRlID0gI3RfZnJhbWVke3dyaXRlX2J1ZmZlciA9IEJ1ZmZlciwgd3JhcHBlZCA9IFdyYXBwZWR9KSAtPgorICBjYXNlIGlvbGlzdF9zaXplKEJ1ZmZlcikgb2YKKyAgICAlJSBpZiB3cml0ZSBidWZmZXIgaXMgZW1wdHksIGRvIG5vdGhpbmcKKyAgICAwIC0+IHtTdGF0ZSwgb2t9OworICAgIEZyYW1lTGVuIC0+CisgICAgICBEYXRhID0gWzw8RnJhbWVMZW46MzIvaW50ZWdlci1zaWduZWQtYmlnPj4sIEJ1ZmZlcl0sCisgICAgICB7V3JpdHRlbiwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShXcmFwcGVkLCBEYXRhKSwKKyAgICAgIHtGbHVzaGVkLCBva30gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyaXR0ZW4pLAorICAgICAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBGbHVzaGVkLCB3cml0ZV9idWZmZXIgPSBbXX0sIFJlc3BvbnNlfQorICBlbmQuCiAKLSAgICAgICAgeyBTdGF0ZTAjZnJhbWVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDEsIHJlYWRfYnVmZmVyPVJCdWYyfSwKLSAgICAgICAgICB7b2ssIERhdGF9IH0KLSAgICBlbmQuCisKK2Nsb3NlKFN0YXRlID0gI3RfZnJhbWVke3dyYXBwZWQgPSBXcmFwcGVkfSkgLT4KKyAge0Nsb3NlZCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoV3JhcHBlZCksCisgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gQ2xvc2VkfSwgUmVzdWx0fS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcHJvdG9jb2wuZXJsCmluZGV4IDhiOWU2MTMuLmM1ZjNkYTggMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3Byb3RvY29sLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wcm90b2NvbC5lcmwKQEAgLTU2LDYgKzU2LDcgQEAKIHR5cGVpZF90b19qc29uKD90VHlwZV9CT09MKSAtPiAidGYiOwogdHlwZWlkX3RvX2pzb24oP3RUeXBlX0JZVEUpIC0+ICJpOCI7CiB0eXBlaWRfdG9fanNvbig/dFR5cGVfRE9VQkxFKSAtPiAiZGJsIjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9JOCkgLT4gImk4IjsKIHR5cGVpZF90b19qc29uKD90VHlwZV9JMTYpIC0+ICJpMTYiOwogdHlwZWlkX3RvX2pzb24oP3RUeXBlX0kzMikgLT4gImkzMiI7CiB0eXBlaWRfdG9fanNvbig/dFR5cGVfSTY0KSAtPiAiaTY0IjsKQEAgLTY2LDggKzY3LDggQEAKIHR5cGVpZF90b19qc29uKD90VHlwZV9MSVNUKSAtPiAibHN0Ii4KIAoganNvbl90b190eXBlaWQoInRmIikgLT4gP3RUeXBlX0JPT0w7Ci1qc29uX3RvX3R5cGVpZCgiaTgiKSAtPiA/dFR5cGVfQllURTsKIGpzb25fdG9fdHlwZWlkKCJkYmwiKSAtPiA/dFR5cGVfRE9VQkxFOworanNvbl90b190eXBlaWQoImk4IikgLT4gP3RUeXBlX0k4OwoganNvbl90b190eXBlaWQoImkxNiIpIC0+ID90VHlwZV9JMTY7CiBqc29uX3RvX3R5cGVpZCgiaTMyIikgLT4gP3RUeXBlX0kzMjsKIGpzb25fdG9fdHlwZWlkKCJpNjQiKSAtPiA/dFR5cGVfSTY0OwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWFjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSw4MyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQpLgorCistYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgorCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8wLCBuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorCisKKy1yZWNvcmQodF9tZW1idWZmZXIsIHsKKyAgYnVmZmVyID0gW10KK30pLgorCistdHlwZSBzdGF0ZSgpIDo6ICN0X21lbWJ1ZmZlcnt9LgorCisKKy1zcGVjIG5ldygpIC0+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+biIpLAotICAgICAgICAgICAgSGFuZGxlcjpoYW5kbGVfZXJyb3IodW5kZWZpbmVkLCBSZWFzb24pLAorCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFt1bmRlZmluZWQsIFJlYXNvbl0pLAogICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAogICAgICAgICAgICAgZXhpdChzaHV0ZG93bik7CiAgICAgICAgIHtlcnJvciwgUmVhc29ufSAtPgotICAgICAgICAgICAgSGFuZGxlcjpoYW5kbGVfZXJyb3IodW5kZWZpbmVkLCBSZWFzb24pLAorCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFt1bmRlZmluZWQsIFJlYXNvbl0pLAogICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAogICAgICAgICAgICAgZXhpdChzaHV0ZG93bikKICAgICBlbmQuCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfcHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3Byb3RvY29sLmVybAppbmRleCBjNmRiNDZkLi4yZmUxMGQ2IDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfcHJvdG9jb2wuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm90b2NvbC5lcmwKQEAgLTYzLDggKzYzLDggQEAKIHR5cGVpZF90b19hdG9tKD90VHlwZV9TVE9QKSAtPiBmaWVsZF9zdG9wOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX1ZPSUQpIC0+IHZvaWQ7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfQk9PTCkgLT4gYm9vbDsKLXR5cGVpZF90b19hdG9tKD90VHlwZV9CWVRFKSAtPiBieXRlOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0RPVUJMRSkgLT4gZG91YmxlOwordHlwZWlkX3RvX2F0b20oP3RUeXBlX0k4KSAtPiBieXRlOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0kxNikgLT4gaTE2OwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0kzMikgLT4gaTMyOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0k2NCkgLT4gaTY0OwpAQCAtNzYsOCArNzYsOSBAQAogCiB0ZXJtX3RvX3R5cGVpZCh2b2lkKSAtPiA/dFR5cGVfVk9JRDsKIHRlcm1fdG9fdHlwZWlkKGJvb2wpIC0+ID90VHlwZV9CT09MOwotdGVybV90b190eXBlaWQoYnl0ZSkgLT4gP3RUeXBlX0JZVEU7Cit0ZXJtX3RvX3R5cGVpZChieXRlKSAtPiA/dFR5cGVfSTg7CiB0ZXJtX3RvX3R5cGVpZChkb3VibGUpIC0+ID90VHlwZV9ET1VCTEU7Cit0ZXJtX3RvX3R5cGVpZChpOCkgLT4gP3RUeXBlX0k4OwogdGVybV90b190eXBlaWQoaTE2KSAtPiA/dFR5cGVfSTE2OwogdGVybV90b190eXBlaWQoaTMyKSAtPiA/dFR5cGVfSTMyOwogdGVybV90b190eXBlaWQoaTY0KSAtPiA/dFR5cGVfSTY0OwpAQCAtMTQ4LDggKzE0OSwxMiBAQAogcmVhZChJUHJvdG8wLCB7bWFwLCBLZXlUeXBlLCBWYWxUeXBlfSkgLT4KICAgICB7SVByb3RvMSwgI3Byb3RvY29sX21hcF9iZWdpbntzaXplID0gU2l6ZSwga3R5cGUgPSBLVHlwZSwgdnR5cGUgPSBWVHlwZX19ID0KICAgICAgICAgcmVhZChJUHJvdG8wLCBtYXBfYmVnaW4pLAotICAgIHtLVHlwZSwgS1R5cGV9ID0ge3Rlcm1fdG9fdHlwZWlkKEtleVR5cGUpLCBLVHlwZX0sCi0gICAge1ZUeXBlLCBWVHlwZX0gPSB7dGVybV90b190eXBlaWQoVmFsVHlwZSksIFZUeXBlfSwKKyAgICBfID0gY2FzZSBTaXplIG9mCisgICAgICAwIC0+IDA7CisgICAgICBfIC0+CisgICAgICAgIHtLVHlwZSwgS1R5cGV9ID0ge3Rlcm1fdG9fdHlwZWlkKEtleVR5cGUpLCBLVHlwZX0sCisgICAgICAgIHtWVHlwZSwgVlR5cGV9ID0ge3Rlcm1fdG9fdHlwZWlkKFZhbFR5cGUpLCBWVHlwZX0KKyAgICBlbmQsCiAgICAge0xpc3QsIElQcm90bzJ9ID0gbGlzdHM6bWFwZm9sZGwoZnVuKF8sIFByb3RvUzApIC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UHJvdG9TMSwge29rLCBLZXl9fSA9IHJlYWQoUHJvdG9TMCwgS2V5VHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UHJvdG9TMiwge29rLCBWYWx9fSA9IHJlYWQoUHJvdG9TMSwgVmFsVHlwZSksCkBAIC0xOTEsNyArMTk2LDggQEAKICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOnJlYWQoSVByb3RvMCwgZmllbGRfYmVnaW4pLAogICAgIGNhc2Uge0ZUeXBlLCBGaWR9IG9mCiAgICAgICAgIHs/dFR5cGVfU1RPUCwgX30gLT4KLSAgICAgICAgICAgIHtJUHJvdG8xLCBSVHVwbGV9OworICAgICAgICAgICAge0lQcm90bzIsIG9rfSA9IHJlYWQoSVByb3RvMSwgc3RydWN0X2VuZCksCisgICAgICAgICAgICB7SVByb3RvMiwgUlR1cGxlfTsKICAgICAgICAgX0Vsc2UgLT4KICAgICAgICAgICAgIGNhc2UgZGljdDpmaW5kKEZpZCwgU0RpY3QpIG9mCiAgICAgICAgICAgICAgICAge29rLCB7VHlwZSwgSW5kZXh9fSAtPgpAQCAtMjEzLDEyICsyMTksMTEgQEAKICAgICBlbmQuCiAKIHNraXBfZmllbGQoRlR5cGUsIElQcm90bzAsIFNEaWN0LCBSVHVwbGUpIC0+Ci0gICAgRlR5cGVBdG9tID0gdGhyaWZ0X3Byb3RvY29sOnR5cGVpZF90b19hdG9tKEZUeXBlKSwKLSAgICB7SVByb3RvMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOnNraXAoSVByb3RvMCwgRlR5cGVBdG9tKSwKKyAgICB7SVByb3RvMSwgb2t9ID0gc2tpcChJUHJvdG8wLCB0eXBlaWRfdG9fYXRvbShGVHlwZSkpLAogICAgIHtJUHJvdG8yLCBva30gPSByZWFkKElQcm90bzEsIGZpZWxkX2VuZCksCiAgICAgcmVhZF9zdHJ1Y3RfbG9vcChJUHJvdG8yLCBTRGljdCwgUlR1cGxlKS4KIAotLXNwZWMgc2tpcCgjcHJvdG9jb2x7fSwgYW55KCkpIC0+IHsjcHJvdG9jb2x7fSwgb2t9LgorLXNwZWMgc2tpcCgjcHJvdG9jb2x7fSwgYXRvbSgpKSAtPiB7I3Byb3RvY29se30sIG9rfS4KIAogc2tpcChQcm90bzAsIHN0cnVjdCkgLT4KICAgICB7UHJvdG8xLCBva30gPSByZWFkKFByb3RvMCwgc3RydWN0X2JlZ2luKSwKQEAgLTI1NSw3ICsyNjAsNyBAQAogICAgICAgICA/dFR5cGVfU1RPUCAtPgogICAgICAgICAgICAge1Byb3RvMSwgb2t9OwogICAgICAgICBfRWxzZSAtPgotICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gc2tpcChQcm90bzEsIFR5cGUpLAorICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gc2tpcChQcm90bzEsIHR5cGVpZF90b19hdG9tKFR5cGUpKSwKICAgICAgICAgICAgIHtQcm90bzMsIG9rfSA9IHJlYWQoUHJvdG8yLCBmaWVsZF9lbmQpLAogICAgICAgICAgICAgc2tpcF9zdHJ1Y3RfbG9vcChQcm90bzMpCiAgICAgZW5kLgpAQCAtMjY1LDggKzI3MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX0pIC0+CiAgICAgY2FzZSBTaXplIG9mCiAgICAgICAgIE4gd2hlbiBOID4gMCAtPgotICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIEt0eXBlKSwKLSAgICAgICAgICAgIHtQcm90bzIsIG9rfSA9IHNraXAoUHJvdG8xLCBWdHlwZSksCisgICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgdHlwZWlkX3RvX2F0b20oS3R5cGUpKSwKKyAgICAgICAgICAgIHtQcm90bzIsIG9rfSA9IHNraXAoUHJvdG8xLCB0eXBlaWRfdG9fYXRvbShWdHlwZSkpLAogICAgICAgICAgICAgc2tpcF9tYXBfbG9vcChQcm90bzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCNwcm90b2NvbF9tYXBfYmVnaW57c2l6ZSA9IFNpemUgLSAxfSk7CiAgICAgICAgIDAgLT4ge1Byb3RvMCwgb2t9CkBAIC0yNzYsNyArMjgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KICAgICBjYXNlIFNpemUgb2YKICAgICAgICAgTiB3aGVuIE4gPiAwIC0+Ci0gICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgRXR5cGUpLAorICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIHR5cGVpZF90b19hdG9tKEV0eXBlKSksCiAgICAgICAgICAgICBza2lwX3NldF9sb29wKFByb3RvMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwI3Byb3RvY29sX3NldF9iZWdpbntzaXplID0gU2l6ZSAtIDF9KTsKICAgICAgICAgMCAtPiB7UHJvdG8wLCBva30KQEAgLTI4Niw3ICsyOTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX0pIC0+CiAgICAgY2FzZSBTaXplIG9mCiAgICAgICAgIE4gd2hlbiBOID4gMCAtPgotICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIEV0eXBlKSwKKyAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCB0eXBlaWRfdG9fYXRvbShFdHlwZSkpLAogICAgICAgICAgICAgc2tpcF9saXN0X2xvb3AoUHJvdG8xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwI3Byb3RvY29sX2xpc3RfYmVnaW57c2l6ZSA9IFNpemUgLSAxfSk7CiAgICAgICAgIDAgLT4ge1Byb3RvMCwgb2t9CmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudC5lcmwKaW5kZXggOWRkNjI3YS4uNTM4ZmQzYSAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3JlY29ubmVjdGluZ19jbGllbnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LmVybApAQCAtMzYsMTQgKzM2LDE0IEBACiAgICAgICAgICAgdGVybWluYXRlLzIsCiAgICAgICAgICAgY29kZV9jaGFuZ2UvMyBdKS4KIAotLXJlY29yZCggc3RhdGUsIHsgY2xpZW50ID0gbmlsLCAKKy1yZWNvcmQoIHN0YXRlLCB7IGNsaWVudCA9IG5pbCwKICAgICAgICAgICAgICAgICAgIGhvc3QsCiAgICAgICAgICAgICAgICAgICBwb3J0LAogICAgICAgICAgICAgICAgICAgdGhyaWZ0X3N2YywKICAgICAgICAgICAgICAgICAgIHRocmlmdF9vcHRzLAogICAgICAgICAgICAgICAgICAgcmVjb25uX21pbiwKICAgICAgICAgICAgICAgICAgIHJlY29ubl9tYXgsCi0gICAgICAgICAgICAgICAgICByZWNvbm5fdGltZSwKKyAgICAgICAgICAgICAgICAgIHJlY29ubl90aW1lID0gMCwKICAgICAgICAgICAgICAgICAgIG9wX2NudF9kaWN0LAogICAgICAgICAgICAgICAgICAgb3BfdGltZV9kaWN0IH0gKS4KIApAQCAtMTE1LDkgKzExNSw5IEBACiAgICAgICAgICAgICAgX0Zyb20sCiAgICAgICAgICAgICAgU3RhdGU9I3N0YXRleyBjbGllbnQgPSBDbGllbnQgfSApIC0+CiAKLSAgU3RhcnQgPSBub3coKSwKKyAgVGltZXIgPSB0aW1lcl9mdW4oKSwKICAgUmVzdWx0ID0gKCBjYXRjaCB0aHJpZnRfY2xpZW50OmNhbGwoIENsaWVudCwgT3AsIEFyZ3MpICksCi0gIFRpbWUgPSB0aW1lcjpub3dfZGlmZiggbm93KCksIFN0YXJ0ICksCisgIFRpbWUgPSBUaW1lcigpLAogCiAgIGNhc2UgUmVzdWx0IG9mCiAgICAgeyBDLCB7IG9rLCBSZXBseSB9IH0gLT4KQEAgLTIxNyw2ICsyMTcsMjEgQEAKICAgICBmYWxzZSAtPiBCYWNrb2ZmCiAgIGVuZC4KIAorLWlmZGVmKHRpbWVfY29ycmVjdGlvbikuCit0aW1lcl9mdW4oKSAtPgorICBUMSA9IGVybGFuZzptb25vdG9uaWNfdGltZSgpLAorICBmdW4oKSAtPgorICAgIFQyID0gZXJsYW5nOm1vbm90b25pY190aW1lKCksCisgICAgZXJsYW5nOmNvbnZlcnRfdGltZV91bml0KFQyIC0gVDEsIG5hdGl2ZSwgbWljcm9fc2Vjb25kcykKKyAgZW5kLgorLWVsc2UuCit0aW1lcl9mdW4oKSAtPgorICBUMSA9IGVybGFuZzp0aW1lc3RhbXAoKSwKKyAgZnVuKCkgLT4KKyAgICBUMiA9IGVybGFuZzp0aW1lc3RhbXAoKSwKKyAgICB0aW1lcjpub3dfZGlmZihUMiwgVDEpCisgIGVuZC4KKy1lbmRpZi4KIAogaW5jcl9zdGF0cyggT3AsIFJlc3VsdCwgVGltZSwKICAgICAgICAgICAgIFN0YXRlID0gI3N0YXRleyBvcF9jbnRfZGljdCAgPSBPcENudERpY3QsCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3NlcnZlci5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3NlcnZlci5lcmwKaW5kZXggZjdjN2EwMi4uNGUzYzA1MiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfc2VydmVyLmVybApAQCAtMjEsMTIgKzIxLDE5IEBACiAKIC1iZWhhdmlvdXIoZ2VuX3NlcnZlcikuCiAKLS1leHBvcnQoW3N0YXJ0LzEsIHN0b3AvMV0pLgorLWluY2x1ZGUgKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgogCi0tZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9jYWxsLzMsIGhhbmRsZV9jYXN0LzIsIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zLAotICAgICAgICAgaGFuZGxlX2luZm8vMl0pLgorLWlmZGVmKFRFU1QpLgorICAgIC1jb21waWxlKGV4cG9ydF9hbGwpLgorICAgIC1leHBvcnRfcmVjb3JkcyhbdGhyaWZ0X3NvY2tldF9zZXJ2ZXJdKS4KKy1lbHNlLgorICAgIC1leHBvcnQoW3N0YXJ0LzEsIHN0b3AvMV0pLgogCi0tZXhwb3J0KFthY2NlcHRvcl9sb29wLzFdKS4KKyAgICAtZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9jYWxsLzMsIGhhbmRsZV9jYXN0LzIsIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zLAorICAgICAgICAgICAgIGhhbmRsZV9pbmZvLzJdKS4KKworICAgIC1leHBvcnQoW2FjY2VwdG9yX2xvb3AvMV0pLgorLWVuZGlmLgogCiAtcmVjb3JkKHRocmlmdF9zb2NrZXRfc2VydmVyLAogICAgICAgICB7cG9ydCwKQEAgLTM4LDcgKzQ1LDEwIEBACiAgICAgICAgICBsaXN0ZW49bnVsbCwKICAgICAgICAgIGFjY2VwdG9yPW51bGwsCiAgICAgICAgICBzb2NrZXRfb3B0cz1be3JlY3ZfdGltZW91dCwgNTAwfV0sCi0gICAgICAgICBmcmFtZWQ9ZmFsc2UKKyAgICAgICAgIHByb3RvY29sPWJpbmFyeSwKKyAgICAgICAgIGZyYW1lZD1mYWxzZSwKKyAgICAgICAgIHNzbHRyYW5zcG9ydD1mYWxzZSwKKyAgICAgICAgIHNzbG9wdGlvbnM9W10KICAgICAgICAgfSkuCiAKIHN0YXJ0KFN0YXRlPSN0aHJpZnRfc29ja2V0X3NlcnZlcnt9KSAtPgpAQCAtOTEsMTAgKzEwMSw0NiBAQAogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7aXA9UGFyc2VkSXB9KTsKIHBhcnNlX29wdGlvbnMoW3tzb2NrZXRfb3B0cywgTH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfbGlzdChMKSwgbGVuZ3RoKEwpID4gMCAtPgogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c29ja2V0X29wdHM9TH0pOwotcGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIEhhbmRsZXJ9IHwgUmVzdF0sIFN0YXRlKSAtPgorCitwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgW119IHwgX1Jlc3RdLCBfU3RhdGUpIC0+CisgICAgdGhyb3coIkF0IGxlYXN0IGFuIGVycm9yIGhhbmRsZXIgbXVzdCBiZSBkZWZpbmVkLiIpOworcGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIFNlcnZpY2VIYW5kbGVyUHJvcGVydHlMaXN0fSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBpc19saXN0KFNlcnZpY2VIYW5kbGVyUHJvcGVydHlMaXN0KSAtPgorICAgIFNlcnZpY2VIYW5kbGVyTWFwID0KKyAgICBjYXNlIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVyLmhhbmRsZXIgb2YKKyAgICAgICAgdW5kZWZpbmVkIC0+CisgICAgICAgICAgICBsaXN0czpmb2xkbCgKKyAgICAgICAgICAgICAgICBmdW4gKHtTZXJ2aWNlTmFtZSwgU2VydmljZUhhbmRsZXJ9LCBBY2MpIHdoZW4gaXNfbGlzdChTZXJ2aWNlTmFtZSksIGlzX2F0b20oU2VydmljZUhhbmRsZXIpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6c3RvcmUoU2VydmljZU5hbWUsIFNlcnZpY2VIYW5kbGVyLCBBY2MpOworICAgICAgICAgICAgICAgICAgICAoXywgX0FjYykgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KCJUaGUgaGFuZGxlciBvcHRpb24gaXMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzLiBJdCBzaG91bGQgYmUgYSBraW5kIG9mIFt7XCJlcnJvcl9oYW5kbGVyXCIsIE1vZHVsZTo6YXRvbSgpfSwge1NlcmljZU5hbWU6Omxpc3QoKSwgTW9kdWxlOjphdG9tKCl9LCAuLi5dIikKKyAgICAgICAgICAgICAgICBlbmQsIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpuZXcoKSwgU2VydmljZUhhbmRsZXJQcm9wZXJ0eUxpc3QpOworICAgICAgICBfIC0+IHRocm93KCJFcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBoYW5kbGVyIG9wdGlvbi4iKQorICAgIGVuZCwKKyAgICBjYXNlIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmaW5kKD9NVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgU2VydmljZUhhbmRsZXJNYXApIG9mCisgICAgICAgIHtvaywgX0Vycm9ySGFuZGxlcn0gLT4gcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntoYW5kbGVyPVNlcnZpY2VIYW5kbGVyTWFwfSk7CisgICAgICAgIGVycm9yIC0+IHRocm93KCJUaGUgaGFuZGxlciBvcHRpb24gaXMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzLiBJdCBzaG91bGQgYmUgYSBraW5kIG9mIFt7XCJlcnJvcl9oYW5kbGVyXCIsIE1vZHVsZTo6YXRvbSgpfSwge1NlcmljZU5hbWU6Omxpc3QoKSwgTW9kdWxlOjphdG9tKCl9LCAuLi5dIikKKyAgICBlbmQ7CitwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgSGFuZGxlcn0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuaGFuZGxlciA9PSB1bmRlZmluZWQsIGlzX2F0b20oSGFuZGxlcikgLT4KICAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2hhbmRsZXI9SGFuZGxlcn0pOwotcGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFNlcnZpY2V9IHwgUmVzdF0sIFN0YXRlKSAtPgorCitwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgW119IHwgX1Jlc3RdLCBfU3RhdGUpIC0+CisgICAgdGhyb3coIkF0IGxlYXN0IG9uZSBzZXJ2aWNlIG1vZHVsZSBtdXN0IGJlIGRlZmluZWQuIik7CitwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgU2VydmljZU1vZHVsZVByb3BlcnR5TGlzdH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfbGlzdChTZXJ2aWNlTW9kdWxlUHJvcGVydHlMaXN0KSAtPgorICAgIFNlcnZpY2VNb2R1bGVNYXAgPQorICAgIGNhc2UgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuc2VydmljZSBvZgorICAgICAgICB1bmRlZmluZWQgLT4KKyAgICAgICAgICAgIGxpc3RzOmZvbGRsKAorICAgICAgICAgICAgICAgIGZ1biAoe1NlcnZpY2VOYW1lLCBTZXJ2aWNlTW9kdWxlfSwgQWNjKSB3aGVuIGlzX2xpc3QoU2VydmljZU5hbWUpLCBpc19hdG9tKFNlcnZpY2VNb2R1bGUpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6c3RvcmUoU2VydmljZU5hbWUsIFNlcnZpY2VNb2R1bGUsIEFjYyk7CisgICAgICAgICAgICAgICAgICAgIChfLCBfQWNjKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3coIlRoZSBzZXJ2aWNlIG9wdGlvbiBpcyBub3QgcHJvcGVybHkgY29uZmlndXJlZCBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMuIEl0IHNob3VsZCBiZSBhIGtpbmQgb2YgW3tTZXJpY2VOYW1lOjpsaXN0KCksIFNlcnZpY2VNb2R1bGU6OmF0b20oKX0sIC4uLl0iKQorICAgICAgICAgICAgICAgIGVuZCwgdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOm5ldygpLCBTZXJ2aWNlTW9kdWxlUHJvcGVydHlMaXN0KTsKKyAgICAgICAgXyAtPiB0aHJvdygiRXJyb3Igd2hpbGUgcGFyc2luZyB0aGUgc2VydmljZSBvcHRpb24uIikKKyAgICBlbmQsCisgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntzZXJ2aWNlPVNlcnZpY2VNb2R1bGVNYXB9KTsKK3BhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBTZXJ2aWNlfSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlci5zZXJ2aWNlID09IHVuZGVmaW5lZCwgaXNfYXRvbShTZXJ2aWNlKSAtPgogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c2VydmljZT1TZXJ2aWNlfSk7CisKIHBhcnNlX29wdGlvbnMoW3ttYXgsIE1heH0gfCBSZXN0XSwgU3RhdGUpIC0+CiAgICAgTWF4SW50ID0gY2FzZSBNYXggb2YKICAgICAgICAgICAgICAgICAgTWF4IHdoZW4gaXNfbGlzdChNYXgpIC0+CkBAIC0xMDMsOCArMTQ5LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICBNYXgKICAgICAgICAgICAgICBlbmQsCiAgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcnttYXg9TWF4SW50fSk7CisKK3BhcnNlX29wdGlvbnMoW3twcm90b2NvbCwgUHJvdG99IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2F0b20oUHJvdG8pIC0+CisgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntwcm90b2NvbD1Qcm90b30pOworCiBwYXJzZV9vcHRpb25zKFt7ZnJhbWVkLCBGcmFtZWR9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oRnJhbWVkKSAtPgotICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7ZnJhbWVkPUZyYW1lZH0pLgorICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7ZnJhbWVkPUZyYW1lZH0pOworCitwYXJzZV9vcHRpb25zKFt7c3NsdHJhbnNwb3J0LCBTU0xUcmFuc3BvcnR9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oU1NMVHJhbnNwb3J0KSAtPgorICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c3NsdHJhbnNwb3J0PVNTTFRyYW5zcG9ydH0pOworcGFyc2Vfb3B0aW9ucyhbe3NzbG9wdGlvbnMsIFNTTE9wdGlvbnN9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2xpc3QoU1NMT3B0aW9ucykgLT4KKyAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye3NzbG9wdGlvbnM9U1NMT3B0aW9uc30pLgogCiBzdGFydF9zZXJ2ZXIoU3RhdGU9I3RocmlmdF9zb2NrZXRfc2VydmVye25hbWU9TmFtZX0pIC0+CiAgICAgY2FzZSBOYW1lIG9mCkBAIC0xNjgsMjUgKzIyMywzMiBAQAogICAgIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2FjY2VwdG9yPW51bGx9OwogbmV3X2FjY2VwdG9yKFN0YXRlPSN0aHJpZnRfc29ja2V0X3NlcnZlcntsaXN0ZW49TGlzdGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlPVNlcnZpY2UsIGhhbmRsZXI9SGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X29wdHM9T3B0cywgZnJhbWVkPUZyYW1lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfb3B0cz1PcHRzLCBmcmFtZWQ9RnJhbWVkLCBwcm90b2NvbD1Qcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsdHJhbnNwb3J0PVNzbFRyYW5zcG9ydCwgc3Nsb3B0aW9ucz1Tc2xPcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgLT4KICAgICBQaWQgPSBwcm9jX2xpYjpzcGF3bl9saW5rKD9NT0RVTEUsIGFjY2VwdG9yX2xvb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3NlbGYoKSwgTGlzdGVuLCBTZXJ2aWNlLCBIYW5kbGVyLCBPcHRzLCBGcmFtZWR9XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3NlbGYoKSwgTGlzdGVuLCBTZXJ2aWNlLCBIYW5kbGVyLCBPcHRzLCBGcmFtZWQsIFNzbFRyYW5zcG9ydCwgU3NsT3B0aW9ucywgUHJvdG99XSksCiAgICAgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7YWNjZXB0b3I9UGlkfS4KIAotYWNjZXB0b3JfbG9vcCh7U2VydmVyLCBMaXN0ZW4sIFNlcnZpY2UsIEhhbmRsZXIsIFNvY2tldE9wdHMsIEZyYW1lZH0pCithY2NlcHRvcl9sb29wKHtTZXJ2ZXIsIExpc3RlbiwgU2VydmljZSwgSGFuZGxlciwgU29ja2V0T3B0cywgRnJhbWVkLCBTc2xUcmFuc3BvcnQsIFNzbE9wdGlvbnMsIFByb3RvfSkKICAgd2hlbiBpc19waWQoU2VydmVyKSwgaXNfbGlzdChTb2NrZXRPcHRzKSAtPgogICAgIGNhc2UgY2F0Y2ggZ2VuX3RjcDphY2NlcHQoTGlzdGVuKSBvZiAlIGluZmluaXRlIHRpbWVvdXQKICAgICAgICAge29rLCBTb2NrZXR9IC0+CiAgICAgICAgICAgICBnZW5fc2VydmVyOmNhc3QoU2VydmVyLCB7YWNjZXB0ZWQsIHNlbGYoKX0pLAogICAgICAgICAgICAgUHJvdG9HZW4gPSBmdW4oKSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU29ja2V0VHJhbnNwb3J0fSAgID0gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgU29ja2V0T3B0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ICAgICAgICAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyYW1lZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFNvY2tldFRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFByb3RvY29sfSAgICAgICAgICA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBTb2NrZXRUcmFuc3BvcnR9ID0gY2FzZSBTc2xUcmFuc3BvcnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgU29ja2V0T3B0cywgU3NsT3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQsIFNvY2tldE9wdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSAgICAgICA9IGNhc2UgRnJhbWVkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgUHJvdG9jb2x9ICAgICAgICA9IGNhc2UgUHJvdG8gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3QgLT4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uIC0+IHRocmlmdF9qc29uX3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyAtPiB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgUHJvdG9jb2x9CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKICAgICAgICAgICAgIHRocmlmdF9wcm9jZXNzb3I6aW5pdCh7U2VydmVyLCBQcm90b0dlbiwgU2VydmljZSwgSGFuZGxlcn0pOwpAQCAtMjE0LDggKzI3NiwxMSBAQAogaGFuZGxlX2Nhc3Qoc3RvcCwgU3RhdGUpIC0+CiAgICAge3N0b3AsIG5vcm1hbCwgU3RhdGV9LgogCi10ZXJtaW5hdGUoX1JlYXNvbiwgI3RocmlmdF9zb2NrZXRfc2VydmVye2xpc3Rlbj1MaXN0ZW4sIHBvcnQ9UG9ydH0pIC0+Cit0ZXJtaW5hdGUoUmVhc29uLCAjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7bGlzdGVuPUxpc3RlbiwgcG9ydD1Qb3J0fSkgLT4KICAgICBnZW5fdGNwOmNsb3NlKExpc3RlbiksCisgICAge2JhY2t0cmFjZSwgQnR9ID0gZXJsYW5nOnByb2Nlc3NfaW5mbyhzZWxmKCksIGJhY2t0cmFjZSksCisgICAgZXJyb3JfbG9nZ2VyOmVycm9yX3JlcG9ydCh7P01PRFVMRSwgP0xJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NoaWxkX2Vycm9yLCBSZWFzb24sIEJ0fX0pLAogICAgIGNhc2UgUG9ydCA8IDEwMjQgb2YKICAgICAgICAgdHJ1ZSAtPgogICAgICAgICAgICAgY2F0Y2ggZmRzcnY6c3RvcCgpLApkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsCmluZGV4IGZlYzAyNDEuLmZhMTBlZDAgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwKQEAgLTIxLDEwNCArMjEsMTU2IEBACiAKIC1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCiAKLS1leHBvcnQoW25ldy8xLAotICAgICAgICAgbmV3LzIsCi0gICAgICAgICB3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzEsCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8xLCBuZXcvMl0pLgorJSUgdHJhbnNwb3J0IGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGxlZ2FjeSBhcGkKKy1leHBvcnQoW25ld190cmFuc3BvcnRfZmFjdG9yeS8zXSkuCiAKLSAgICAgICAgIG5ld190cmFuc3BvcnRfZmFjdG9yeS8zXSkuCiAKLS1yZWNvcmQoZGF0YSwge3NvY2tldCwKLSAgICAgICAgICAgICAgIHJlY3ZfdGltZW91dD1pbmZpbml0eX0pLgotLXR5cGUgc3RhdGUoKSA6OiAjZGF0YXt9LgotLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgorLXJlY29yZCh0X3NvY2tldCwgeworICBzb2NrZXQsCisgIHJlY3ZfdGltZW91dD02MDAwMCwKKyAgYnVmZmVyID0gW10KK30pLgogCi1uZXcoU29ja2V0KSAtPgotICAgIG5ldyhTb2NrZXQsIFtdKS4KKy10eXBlIHN0YXRlKCkgOjogI3Rfc29ja2V0e30uCisKKworLXNwZWMgbmV3KFNvY2tldDo6YW55KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KFNvY2tldCkgLT4gbmV3KFNvY2tldCwgW10pLgorCistc3BlYyBuZXcoU29ja2V0OjphbnkoKSwgT3B0czo6bGlzdCgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCiAKIG5ldyhTb2NrZXQsIE9wdHMpIHdoZW4gaXNfbGlzdChPcHRzKSAtPgotICAgIFN0YXRlID0KLSAgICAgICAgY2FzZSBsaXN0czprZXlzZWFyY2gocmVjdl90aW1lb3V0LCAxLCBPcHRzKSBvZgotICAgICAgICAgICAge3ZhbHVlLCB7cmVjdl90aW1lb3V0LCBUaW1lb3V0fX0KLSAgICAgICAgICAgIHdoZW4gaXNfaW50ZWdlcihUaW1lb3V0KSwgVGltZW91dCA+IDAgLT4KLSAgICAgICAgICAgICAgICAjZGF0YXtzb2NrZXQ9U29ja2V0LCByZWN2X3RpbWVvdXQ9VGltZW91dH07Ci0gICAgICAgICAgICBfIC0+Ci0gICAgICAgICAgICAgICAgI2RhdGF7c29ja2V0PVNvY2tldH0KLSAgICAgICAgZW5kLAotICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KLQotJSUgRGF0YSA6OiBpb2xpc3QoKQotd3JpdGUoVGhpcyA9ICNkYXRhe3NvY2tldCA9IFNvY2tldH0sIERhdGEpIC0+Ci0gICAge1RoaXMsIGdlbl90Y3A6c2VuZChTb2NrZXQsIERhdGEpfS4KLQotcmVhZChUaGlzID0gI2RhdGF7c29ja2V0PVNvY2tldCwgcmVjdl90aW1lb3V0PVRpbWVvdXR9LCBMZW4pCi0gIHdoZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgotICAgIGNhc2UgZ2VuX3RjcDpyZWN2KFNvY2tldCwgTGVuLCBUaW1lb3V0KSBvZgotICAgICAgICBFcnIgPSB7ZXJyb3IsIHRpbWVvdXR9IC0+Ci0gICAgICAgICAgICBnZW5fdGNwOmNsb3NlKFNvY2tldCksCi0gICAgICAgICAgICB7VGhpcywgRXJyfTsKLSAgICAgICAgRGF0YSAtPgotICAgICAgICAgICAge1RoaXMsIERhdGF9Ci0gICAgZW5kLgotCi0lJSBXZSBjYW4ndCByZWFsbHkgZmx1c2ggLSBldmVyeXRoaW5nIGlzIGZsdXNoZWQgd2hlbiB3ZSB3cml0ZQotZmx1c2goVGhpcykgLT4KLSAgICB7VGhpcywgb2t9LgotCi1jbG9zZShUaGlzID0gI2RhdGF7c29ja2V0ID0gU29ja2V0fSkgLT4KLSAgICB7VGhpcywgZ2VuX3RjcDpjbG9zZShTb2NrZXQpfS4KKyAgU3RhdGUgPSBwYXJzZV9vcHRzKE9wdHMsICN0X3NvY2tldHtzb2NrZXQgPSBTb2NrZXR9KSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgogCiAKLSUlJSUgRkFDVE9SWSBHRU5FUkFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKK3BhcnNlX29wdHMoW3tyZWN2X3RpbWVvdXQsIFRpbWVvdXR9fFJlc3RdLCBTdGF0ZSkKK3doZW4gaXNfaW50ZWdlcihUaW1lb3V0KSwgVGltZW91dCA+IDAgLT4KKyAgcGFyc2Vfb3B0cyhSZXN0LCBTdGF0ZSN0X3NvY2tldHtyZWN2X3RpbWVvdXQgPSBUaW1lb3V0fSk7CitwYXJzZV9vcHRzKFt7cmVjdl90aW1lb3V0LCBpbmZpbml0eX18UmVzdF0sIFN0YXRlKSAtPgorICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3Rfc29ja2V0e3JlY3ZfdGltZW91dCA9IGluZmluaXR5fSk7CitwYXJzZV9vcHRzKFtdLCBTdGF0ZSkgLT4KKyAgU3RhdGUuCiAKIAorLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgorCisKK3JlYWQoU3RhdGUgPSAjdF9zb2NrZXR7YnVmZmVyID0gQnVmfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoQnVmKSwKKyAgY2FzZSBpb2xpc3Rfc2l6ZShCaW5hcnkpIG9mCisgICAgWCB3aGVuIFggPj0gTGVuIC0+CisgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgTGVuKSwKKyAgICAgIHtTdGF0ZSN0X3NvY2tldHtidWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19OworICAgIF8gLT4gcmVjdihTdGF0ZSwgTGVuKQorICBlbmQuCisKK3JlY3YoU3RhdGUgPSAjdF9zb2NrZXR7c29ja2V0ID0gU29ja2V0LCBidWZmZXIgPSBCdWZ9LCBMZW4pIC0+CisgIGNhc2UgZ2VuX3RjcDpyZWN2KFNvY2tldCwgMCwgU3RhdGUjdF9zb2NrZXQucmVjdl90aW1lb3V0KSBvZgorICAgIHtlcnJvciwgRXJyb3J9IC0+CisgICAgICBnZW5fdGNwOmNsb3NlKFNvY2tldCksCisgICAgICB7U3RhdGUsIHtlcnJvciwgRXJyb3J9fTsKKyAgICB7b2ssIERhdGF9IC0+CisgICAgICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KFtCdWYsIERhdGFdKSwKKyAgICAgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoQmluYXJ5KSwgTGVuKSwKKyAgICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBHaXZlKSwKKyAgICAgIHtTdGF0ZSN0X3NvY2tldHtidWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19CisgIGVuZC4KKworCityZWFkX2V4YWN0KFN0YXRlID0gI3Rfc29ja2V0e2J1ZmZlciA9IEJ1Zn0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZiksCisgIGNhc2UgaW9saXN0X3NpemUoQmluYXJ5KSBvZgorICAgIFggd2hlbiBYID49IExlbiAtPiByZWFkKFN0YXRlLCBMZW4pOworICAgIFggLT4KKyAgICAgIGNhc2UgZ2VuX3RjcDpyZWN2KFN0YXRlI3Rfc29ja2V0LnNvY2tldCwgTGVuIC0gWCwgU3RhdGUjdF9zb2NrZXQucmVjdl90aW1lb3V0KSBvZgorICAgICAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgICAgIGdlbl90Y3A6Y2xvc2UoU3RhdGUjdF9zb2NrZXQuc29ja2V0KSwKKyAgICAgICAgICB7U3RhdGUsIHtlcnJvciwgRXJyb3J9fTsKKyAgICAgICAge29rLCBEYXRhfSAtPgorICAgICAgICAgIHtTdGF0ZSN0X3NvY2tldHtidWZmZXIgPSBbXX0sIHtvaywgPDxCaW5hcnkvYmluYXJ5LCBEYXRhL2JpbmFyeT4+fX0KKyAgICAgIGVuZAorICBlbmQuCisKKword3JpdGUoU3RhdGUgPSAjdF9zb2NrZXR7c29ja2V0ID0gU29ja2V0fSwgRGF0YSkgLT4KKyAgY2FzZSBnZW5fdGNwOnNlbmQoU29ja2V0LCBEYXRhKSBvZgorICAgIHtlcnJvciwgRXJyb3J9IC0+CisgICAgICBnZW5fdGNwOmNsb3NlKFNvY2tldCksCisgICAgICB7U3RhdGUsIHtlcnJvciwgRXJyb3J9fTsKKyAgICBvayAtPiB7U3RhdGUsIG9rfQorICBlbmQuCisKKworZmx1c2goU3RhdGUpIC0+CisgIHtTdGF0ZSN0X3NvY2tldHtidWZmZXIgPSBbXX0sIG9rfS4KKworCitjbG9zZShTdGF0ZSA9ICN0X3NvY2tldHtzb2NrZXQgPSBTb2NrZXR9KSAtPgorICB7U3RhdGUsIGdlbl90Y3A6Y2xvc2UoU29ja2V0KX0uCisKKworJSUgbGVnYWN5IGFwaS4gbGVmdCBmb3IgY29tcGF0aWJpbGl0eQorCiAlJSBUaGUgZm9sbG93aW5nICJsb2NhbCIgcmVjb3JkIGlzIGZpbGxlZCBpbiBieSBwYXJzZV9mYWN0b3J5X29wdGlvbnMvMgogJSUgYmVsb3cuIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHBhc3NlZCB0byBuZXdfcHJvdG9jb2xfZmFjdG9yeS8zIGluIGEKICUlIHByb3BsaXN0cy1zdHlsZSBvcHRpb24gbGlzdC4gVGhleSdyZSBwYXJzZWQgbGlrZSB0aGlzIHNvIGl0IGlzIGFuIE8obikKICUlIG9wZXJhdGlvbiBpbnN0ZWFkIG9mIE8obl4yKQotLXJlY29yZChmYWN0b3J5X29wdHMsIHtjb25uZWN0X3RpbWVvdXQgPSBpbmZpbml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgc29ja29wdHMgPSBbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVkID0gZmFsc2V9KS4KKy1yZWNvcmQoZmFjdG9yeV9vcHRzLCB7CisgIGNvbm5lY3RfdGltZW91dCA9IGluZmluaXR5LAorICBzb2Nrb3B0cyA9IFtdLAorICBmcmFtZWQgPSBmYWxzZQorfSkuCiAKLXBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbXSwgT3B0cykgLT4KLSAgICBPcHRzOwotcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7ZnJhbWVkLCBCb29sfSB8IFJlc3RdLCBPcHRzKSB3aGVuIGlzX2Jvb2xlYW4oQm9vbCkgLT4KLSAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7ZnJhbWVkPUJvb2x9KTsKLXBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe3NvY2tvcHRzLCBPcHRMaXN0fSB8IFJlc3RdLCBPcHRzKSB3aGVuIGlzX2xpc3QoT3B0TGlzdCkgLT4KLSAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7c29ja29wdHM9T3B0TGlzdH0pOwotcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7Y29ubmVjdF90aW1lb3V0LCBUT30gfCBSZXN0XSwgT3B0cykgd2hlbiBUTyA9Oj0gaW5maW5pdHk7IGlzX2ludGVnZXIoVE8pIC0+Ci0gICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze2Nvbm5lY3RfdGltZW91dD1UT30pOwotcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7cmVjdl90aW1lb3V0LCBUT30gfCBSZXN0XSwgT3B0cykgd2hlbiBUTyA9Oj0gaW5maW5pdHk7IGlzX2ludGVnZXIoVE8pIC0+Ci0gICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMpLgorcGFyc2VfZmFjdG9yeV9vcHRpb25zKFtdLCBGYWN0b3J5T3B0cywgVHJhbnNPcHRzKSAtPiB7RmFjdG9yeU9wdHMsIFRyYW5zT3B0c307CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tmcmFtZWQsIEJvb2x9fFJlc3RdLCBGYWN0b3J5T3B0cywgVHJhbnNPcHRzKQord2hlbiBpc19ib29sZWFuKEJvb2wpIC0+CisgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHN7ZnJhbWVkID0gQm9vbH0sIFRyYW5zT3B0cyk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tzb2Nrb3B0cywgT3B0TGlzdH18UmVzdF0sIEZhY3RvcnlPcHRzLCBUcmFuc09wdHMpCit3aGVuIGlzX2xpc3QoT3B0TGlzdCkgLT4KKyAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIEZhY3RvcnlPcHRzI2ZhY3Rvcnlfb3B0c3tzb2Nrb3B0cyA9IE9wdExpc3R9LCBUcmFuc09wdHMpOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7Y29ubmVjdF90aW1lb3V0LCBUT318UmVzdF0sIEZhY3RvcnlPcHRzLCBUcmFuc09wdHMpCit3aGVuIFRPID06PSBpbmZpbml0eTsgaXNfaW50ZWdlcihUTykgLT4KKyAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIEZhY3RvcnlPcHRzI2ZhY3Rvcnlfb3B0c3tjb25uZWN0X3RpbWVvdXQgPSBUT30sIFRyYW5zT3B0cyk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tyZWN2X3RpbWVvdXQsIFRPfXxSZXN0XSwgRmFjdG9yeU9wdHMsIFRyYW5zT3B0cykKK3doZW4gVE8gPTo9IGluZmluaXR5OyBpc19pbnRlZ2VyKFRPKSAtPgorICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgRmFjdG9yeU9wdHMsIFt7cmVjdl90aW1lb3V0LCBUT31dICsrIFRyYW5zT3B0cykuCiAKIAotJSUKICUlIEdlbmVyYXRlcyBhICJ0cmFuc3BvcnQgZmFjdG9yeSIgZnVuY3Rpb24gLSBhIGZ1biB3aGljaCByZXR1cm5zIGEgdGhyaWZ0X3RyYW5zcG9ydCgpCiAlJSBpbnN0YW5jZS4KLSUlIFRoaXMgY2FuIGJlIHBhc3NlZCBpbnRvIGEgcHJvdG9jb2wgZmFjdG9yeSB0byBnZW5lcmF0ZSBhIGNvbm5lY3Rpb24gdG8gYQorJSUgU3RhdGUgY2FuIGJlIHBhc3NlZCBpbnRvIGEgcHJvdG9jb2wgZmFjdG9yeSB0byBnZW5lcmF0ZSBhIGNvbm5lY3Rpb24gdG8gYQogJSUgdGhyaWZ0IHNlcnZlciBvdmVyIGEgc29ja2V0LgotJSUKIG5ld190cmFuc3BvcnRfZmFjdG9yeShIb3N0LCBQb3J0LCBPcHRpb25zKSAtPgotICAgIFBhcnNlZE9wdHMgPSBwYXJzZV9mYWN0b3J5X29wdGlvbnMoT3B0aW9ucywgI2ZhY3Rvcnlfb3B0c3t9KSwKLQotICAgIEYgPSBmdW4oKSAtPgotICAgICAgICAgICAgICAgIFNvY2tPcHRzID0gW2JpbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFja2V0LCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YWN0aXZlLCBmYWxzZX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge25vZGVsYXksIHRydWV9IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5zb2Nrb3B0c10sCi0gICAgICAgICAgICAgICAgY2FzZSBjYXRjaCBnZW5fdGNwOmNvbm5lY3QoSG9zdCwgUG9ydCwgU29ja09wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuY29ubmVjdF90aW1lb3V0KSBvZgotICAgICAgICAgICAgICAgICAgICB7b2ssIFNvY2t9IC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29jaywgT3B0aW9ucyksCi0gICAgICAgICAgICAgICAgICAgICAgICB7b2ssIEJ1ZlRyYW5zcG9ydH0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuZnJhbWVkIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9OwotICAgICAgICAgICAgICAgICAgICBFcnJvciAgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yCi0gICAgICAgICAgICAgICAgZW5kCisgIHtGYWN0b3J5T3B0cywgVHJhbnNPcHRzfSA9IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhPcHRpb25zLCAjZmFjdG9yeV9vcHRze30sIFtdKSwKKyAge29rLCBmdW4oKSAtPiBTb2NrT3B0cyA9IFtiaW5hcnksCisgICAgICB7cGFja2V0LCAwfSwKKyAgICAgIHthY3RpdmUsIGZhbHNlfSwKKyAgICAgIHtub2RlbGF5LCB0cnVlfXxGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHMuc29ja29wdHMKKyAgICBdLAorICAgIGNhc2UgY2F0Y2ggZ2VuX3RjcDpjb25uZWN0KAorICAgICAgSG9zdCwKKyAgICAgIFBvcnQsCisgICAgICBTb2NrT3B0cywKKyAgICAgIEZhY3RvcnlPcHRzI2ZhY3Rvcnlfb3B0cy5jb25uZWN0X3RpbWVvdXQKKyAgICApIG9mCisgICAgICB7b2ssIFNvY2t9IC0+CisgICAgICAgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrLCBUcmFuc09wdHMpLAorICAgICAgICB7b2ssIEJ1ZlRyYW5zcG9ydH0gPSBjYXNlIEZhY3RvcnlPcHRzI2ZhY3Rvcnlfb3B0cy5mcmFtZWQgb2YKKyAgICAgICAgICB0cnVlICAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KTsKKyAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpCiAgICAgICAgIGVuZCwKLSAgICB7b2ssIEZ9LgorICAgICAgICB7b2ssIEJ1ZlRyYW5zcG9ydH07CisgICAgICBFcnJvciAgLT4gRXJyb3IKKyAgICBlbmQKKyAgZW5kfS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMTE1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSwxNDcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorLW1vZHVsZSh0aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydCkuCisKKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KKworLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KKworLWV4cG9ydChbbmV3LzMsCisgICAgICAgICB3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzEsCisKKyAgICAgICAgIG5ld190cmFuc3BvcnRfZmFjdG9yeS8zXSkuCisKKyUlIEV4cG9ydCBvbmx5IGZvciB0aGUgdHJhbnNwb3J0IGZhY3RvcnkKKy1leHBvcnQoW25ldy8yXSkuCisKKy1yZWNvcmQoZGF0YSwge3NvY2tldCwKKyAgICAgICAgICAgICAgIHJlY3ZfdGltZW91dD1pbmZpbml0eX0pLgorLXR5cGUgc3RhdGUoKSA6OiAjZGF0YXt9LgorCislJSBUaGUgZm9sbG93aW5nICJsb2NhbCIgcmVjb3JkIGlzIGZpbGxlZCBpbiBieSBwYXJzZV9mYWN0b3J5X29wdGlvbnMvMgorJSUgYmVsb3cuIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHBhc3NlZCB0byBuZXdfcHJvdG9jb2xfZmFjdG9yeS8zIGluIGEKKyUlIHByb3BsaXN0cy1zdHlsZSBvcHRpb24gbGlzdC4gVGhleSdyZSBwYXJzZWQgbGlrZSB0aGlzIHNvIGl0IGlzIGFuIE8obikKKyUlIG9wZXJhdGlvbiBpbnN0ZWFkIG9mIE8obl4yKQorLXJlY29yZChmYWN0b3J5X29wdHMsIHtjb25uZWN0X3RpbWVvdXQgPSBpbmZpbml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgc29ja29wdHMgPSBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIHNzbG9wdGlvbnMgPSBbXX0pLgorCitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW10sIE9wdHMpIC0+CisgICAgT3B0czsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2ZyYW1lZCwgQm9vbH0gfCBSZXN0XSwgT3B0cykgd2hlbiBpc19ib29sZWFuKEJvb2wpIC0+CisgICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze2ZyYW1lZD1Cb29sfSk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tzb2Nrb3B0cywgT3B0TGlzdH0gfCBSZXN0XSwgT3B0cykgd2hlbiBpc19saXN0KE9wdExpc3QpIC0+CisgICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze3NvY2tvcHRzPU9wdExpc3R9KTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2Nvbm5lY3RfdGltZW91dCwgVE99IHwgUmVzdF0sIE9wdHMpIHdoZW4gVE8gPTo9IGluZmluaXR5OyBpc19pbnRlZ2VyKFRPKSAtPgorICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tjb25uZWN0X3RpbWVvdXQ9VE99KTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe3NzbG9wdGlvbnMsIFNzbE9wdGlvbnN9IHwgUmVzdF0sIE9wdHMpIHdoZW4gaXNfbGlzdChTc2xPcHRpb25zKSAtPgorICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tzc2xvcHRpb25zPVNzbE9wdGlvbnN9KS4KKworbmV3KFNvY2tldCwgU29ja09wdHMsIFNzbE9wdGlvbnMpIHdoZW4gaXNfbGlzdChTb2NrT3B0cyksIGlzX2xpc3QoU3NsT3B0aW9ucykgLT4KKyAgICBpbmV0OnNldG9wdHMoU29ja2V0LCBbe2FjdGl2ZSwgZmFsc2V9XSksICUlID0+IHByZXZlbnQgdGhlIHNzbCBoYW5kc2hha2UgbWVzc2FnZXMgZ2V0IGxvc3QKKworICAgICUlIHVwZ3JhZGUgdG8gYW4gc3NsIHNvY2tldAorICAgIGNhc2UgY2F0Y2ggc3NsOnNzbF9hY2NlcHQoU29ja2V0LCBTc2xPcHRpb25zKSBvZiAlIGluZmluaXRlIHRpbWVvdXQKKyAgICAgICAge29rLCBTc2xTb2NrZXR9IC0+CisgICAgICAgICAgICBuZXcoU3NsU29ja2V0LCBTb2NrT3B0cyk7CisgICAgICAgIHtlcnJvciwgUmVhc29ufSAtPgorICAgICAgICAgICAgZXhpdCh7ZXJyb3IsIFJlYXNvbn0pOworICAgICAgICBPdGhlciAtPgorICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmVycm9yX3JlcG9ydCgKKyAgICAgICAgICAgICAgW3thcHBsaWNhdGlvbiwgdGhyaWZ0fSwKKyAgICAgICAgICAgICAgICJTU0wgYWNjZXB0IGZhaWxlZCBlcnJvciIsCisgICAgICAgICAgICAgICBsaXN0czpmbGF0dGVuKGlvX2xpYjpmb3JtYXQoIn5wIiwgW090aGVyXSkpXSksCisgICAgICAgICAgICBleGl0KHtlcnJvciwgc3NsX2FjY2VwdF9mYWlsZWR9KQorICAgIGVuZC4KKworbmV3KFNzbFNvY2tldCwgU29ja09wdHMpIC0+CisgICAgU3RhdGUgPQorICAgICAgICBjYXNlIGxpc3RzOmtleXNlYXJjaChyZWN2X3RpbWVvdXQsIDEsIFNvY2tPcHRzKSBvZgorICAgICAgICAgICAge3ZhbHVlLCB7cmVjdl90aW1lb3V0LCBUaW1lb3V0fX0KKyAgICAgICAgICAgICAgd2hlbiBpc19pbnRlZ2VyKFRpbWVvdXQpLCBUaW1lb3V0ID4gMCAtPgorICAgICAgICAgICAgICAgICNkYXRhe3NvY2tldD1Tc2xTb2NrZXQsIHJlY3ZfdGltZW91dD1UaW1lb3V0fTsKKyAgICAgICAgICAgIF8gLT4KKyAgICAgICAgICAgICAgICAjZGF0YXtzb2NrZXQ9U3NsU29ja2V0fQorICAgICAgICBlbmQsCisgICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCislJSBEYXRhIDo6IGlvbGlzdCgpCit3cml0ZShUaGlzID0gI2RhdGF7c29ja2V0ID0gU29ja2V0fSwgRGF0YSkgLT4KKyAgICB7VGhpcywgc3NsOnNlbmQoU29ja2V0LCBEYXRhKX0uCisKK3JlYWQoVGhpcyA9ICNkYXRhe3NvY2tldD1Tb2NrZXQsIHJlY3ZfdGltZW91dD1UaW1lb3V0fSwgTGVuKQorICB3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgICBjYXNlIHNzbDpyZWN2KFNvY2tldCwgTGVuLCBUaW1lb3V0KSBvZgorICAgICAgICBFcnIgPSB7ZXJyb3IsIHRpbWVvdXR9IC0+CisgICAgICAgICAgICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInJlYWQgdGltZW91dDogcGVlciBjb25uIH5wIiwgW2luZXQ6cGVlcm5hbWUoU29ja2V0KV0pLAorICAgICAgICAgICAgc3NsOmNsb3NlKFNvY2tldCksCisgICAgICAgICAgICB7VGhpcywgRXJyfTsKKyAgICAgICAgRGF0YSAtPgorICAgICAgICAgICAge1RoaXMsIERhdGF9CisgICAgZW5kLgorCislJSBXZSBjYW4ndCByZWFsbHkgZmx1c2ggLSBldmVyeXRoaW5nIGlzIGZsdXNoZWQgd2hlbiB3ZSB3cml0ZQorZmx1c2goVGhpcykgLT4KKyAgICB7VGhpcywgb2t9LgorCitjbG9zZShUaGlzID0gI2RhdGF7c29ja2V0ID0gU29ja2V0fSkgLT4KKyAgICB7VGhpcywgc3NsOmNsb3NlKFNvY2tldCl9LgorCislJSUlIEZBQ1RPUlkgR0VORVJBVElPTiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCisKKyUlCislJSBHZW5lcmF0ZXMgYSAidHJhbnNwb3J0IGZhY3RvcnkiIGZ1bmN0aW9uIC0gYSBmdW4gd2hpY2ggcmV0dXJucyBhIHRocmlmdF90cmFuc3BvcnQoKQorJSUgaW5zdGFuY2UuCislJSBUaGlzIGNhbiBiZSBwYXNzZWQgaW50byBhIHByb3RvY29sIGZhY3RvcnkgdG8gZ2VuZXJhdGUgYSBjb25uZWN0aW9uIHRvIGEKKyUlIHRocmlmdCBzZXJ2ZXIgb3ZlciBhIHNvY2tldC4KKyUlCituZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgT3B0aW9ucykgLT4KKyAgICBQYXJzZWRPcHRzID0gcGFyc2VfZmFjdG9yeV9vcHRpb25zKE9wdGlvbnMsICNmYWN0b3J5X29wdHN7fSksCisKKyAgICBGID0gZnVuKCkgLT4KKyAgICAgICAgICAgICAgICBTb2NrT3B0cyA9IFtiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhY2tldCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAge2FjdGl2ZSwgZmFsc2V9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub2RlbGF5LCB0cnVlfSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuc29ja29wdHNdLAorICAgICAgICAgICAgICAgIGNhc2UgY2F0Y2ggZ2VuX3RjcDpjb25uZWN0KEhvc3QsIFBvcnQsIFNvY2tPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLmNvbm5lY3RfdGltZW91dCkgb2YKKyAgICAgICAgICAgICAgICAgICAge29rLCBTb2NrfSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgU3NsU29jayA9IGNhc2UgY2F0Y2ggc3NsOmNvbm5lY3QoU29jaywgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuc3Nsb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLmNvbm5lY3RfdGltZW91dCkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBTc2xTb2NrZXR9IC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2xTb2NrZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9sb2dnZXI6aW5mb19tc2coImVycm9yIHdoaWxlIGNvbm5lY3Rpbmcgb3ZlciBzc2wgLSByZWFzb246IH5wfm4iLCBbT3RoZXJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIGdlbl90Y3A6Y2xvc2UoU29jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KGVycm9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0Om5ldyhTc2xTb2NrLCBTb2NrT3B0cyksCisgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIEJ1ZlRyYW5zcG9ydH0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuZnJhbWVkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9OworICAgICAgICAgICAgICAgICAgICBFcnJvciAgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZCwKKyAgICB7b2ssIEZ9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydC5lcmwKaW5kZXggMzlmOGMwNS4uMjQxNGJkZSAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydC5lcmwKQEAgLTIwLDU5ICsyMCwxMDcgQEAKIC1tb2R1bGUodGhyaWZ0X3RyYW5zcG9ydCkuCiAKIC1leHBvcnQoW2JlaGF2aW91cl9pbmZvLzFdKS4KKyUlIGNvbnN0cnVjdG9ycworLWV4cG9ydChbbmV3LzEsIG5ldy8yXSkuCislJSB0cmFuc3BvcnQgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgogCi0tZXhwb3J0KFtuZXcvMiwKLSAgICAgICAgIHdyaXRlLzIsCi0gICAgICAgICByZWFkLzIsCi0gICAgICAgICBmbHVzaC8xLAotICAgICAgICAgY2xvc2UvMQotICAgICAgICBdKS4KKy1leHBvcnRfdHlwZShbdF90cmFuc3BvcnQvMF0pLgorCiAKIGJlaGF2aW91cl9pbmZvKGNhbGxiYWNrcykgLT4KLSAgICBbe3JlYWQsIDJ9LAotICAgICB7d3JpdGUsIDJ9LAotICAgICB7Zmx1c2gsIDF9LAotICAgICB7Y2xvc2UsIDF9Ci0gICAgXS4KKyAgW3tyZWFkLCAyfSwge3dyaXRlLCAyfSwge2ZsdXNoLCAxfSwge2Nsb3NlLCAxfV0uCiAKLS1yZWNvcmQodHJhbnNwb3J0LCB7bW9kdWxlLCBkYXRhfSkuCisKKy1yZWNvcmQodF90cmFuc3BvcnQsIHsKKyAgbW9kdWxlLAorICBzdGF0ZQorfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI3RfdHJhbnNwb3J0e30uCistdHlwZSB0X3RyYW5zcG9ydCgpIDo6ICN0X3RyYW5zcG9ydHt9LgorCiAKIC1pZmRlZih0cmFuc3BvcnRfd3JhcHBlcl9tb2R1bGUpLgogLWRlZmluZShkZWJ1Z193cmFwKFRyYW5zcG9ydCksCi0gICAgICAgIGNhc2UgVHJhbnNwb3J0I3RyYW5zcG9ydC5tb2R1bGUgb2YKLSAgICAgICAgICAgID90cmFuc3BvcnRfd3JhcHBlcl9tb2R1bGUgLT4KLSAgICAgICAgICAgICAgICBUcmFuc3BvcnQ7Ci0gICAgICAgICAgICBfRWxzZSAtPgotICAgICAgICAgICAgICAgIHtvaywgUmVzdWx0fSA9ID90cmFuc3BvcnRfd3JhcHBlcl9tb2R1bGU6bmV3KFRyYW5zcG9ydCksCi0gICAgICAgICAgICAgICAgUmVzdWx0Ci0gICAgICAgIGVuZCkuCisgIGNhc2UgVHJhbnNwb3J0I3RfdHJhbnNwb3J0Lm1vZHVsZSBvZgorICAgID90cmFuc3BvcnRfd3JhcHBlcl9tb2R1bGUgLT4gVHJhbnNwb3J0OworICAgIF9FbHNlIC0+CisgICAgICB7b2ssIFJlc3VsdH0gPSA/dHJhbnNwb3J0X3dyYXBwZXJfbW9kdWxlOm5ldyhUcmFuc3BvcnQpLAorICAgICAgUmVzdWx0CisgIGVuZAorKS4KIC1lbHNlLgogLWRlZmluZShkZWJ1Z193cmFwKFRyYW5zcG9ydCksIFRyYW5zcG9ydCkuCiAtZW5kaWYuCiAKLW5ldyhNb2R1bGUsIERhdGEpIHdoZW4gaXNfYXRvbShNb2R1bGUpIC0+Ci0gICAgVHJhbnNwb3J0MCA9ICN0cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlLCBkYXRhID0gRGF0YX0sCi0gICAgVHJhbnNwb3J0MSA9ID9kZWJ1Z193cmFwKFRyYW5zcG9ydDApLAotICAgIHtvaywgVHJhbnNwb3J0MX0uCiAKLS1zcGVjIHdyaXRlKCN0cmFuc3BvcnR7fSwgaW9saXN0KCkgfCBiaW5hcnkoKSkgLT4geyN0cmFuc3BvcnR7fSwgb2sgfCB7ZXJyb3IsIF9SZWFzb259fS4KLXdyaXRlKFRyYW5zcG9ydCwgRGF0YSkgLT4KLSAgICBNb2R1bGUgPSBUcmFuc3BvcnQjdHJhbnNwb3J0Lm1vZHVsZSwKLSAgICB7TmV3VHJhbnNEYXRhLCBSZXN1bHR9ID0gTW9kdWxlOndyaXRlKFRyYW5zcG9ydCN0cmFuc3BvcnQuZGF0YSwgRGF0YSksCi0gICAge1RyYW5zcG9ydCN0cmFuc3BvcnR7ZGF0YSA9IE5ld1RyYW5zRGF0YX0sIFJlc3VsdH0uCistdHlwZSB3cmFwcGFibGUoKSA6OgorICBiaW5hcnkoKSB8CisgIGxpc3QoKSB8CisgIHttZW1idWZmZXIsIGJpbmFyeSgpIHwgbGlzdCgpfSB8CisgIHt0Y3AsIHBvcnQoKX0gfAorICB7dGNwLCBwb3J0KCksIGxpc3QoKX0gfAorICB7ZmlsZSwgZmlsZTppb19kZXZpY2UoKX0gfAorICB7ZmlsZSwgZmlsZTppb19kZXZpY2UoKSwgbGlzdCgpfSB8CisgIHtmaWxlLCBmaWxlOmZpbGVuYW1lKCl9IHwKKyAge2ZpbGUsIGZpbGU6ZmlsZW5hbWUoKSwgbGlzdCgpfS4KIAotLXNwZWMgcmVhZCgjdHJhbnNwb3J0e30sIG5vbl9uZWdfaW50ZWdlcigpKSAtPiB7I3RyYW5zcG9ydHt9LCB7b2ssIGJpbmFyeSgpfSB8IHtlcnJvciwgX1JlYXNvbn19LgotcmVhZChUcmFuc3BvcnQsIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgLT4KLSAgICBNb2R1bGUgPSBUcmFuc3BvcnQjdHJhbnNwb3J0Lm1vZHVsZSwKLSAgICB7TmV3VHJhbnNEYXRhLCBSZXN1bHR9ID0gTW9kdWxlOnJlYWQoVHJhbnNwb3J0I3RyYW5zcG9ydC5kYXRhLCBMZW4pLAotICAgIHtUcmFuc3BvcnQjdHJhbnNwb3J0e2RhdGEgPSBOZXdUcmFuc0RhdGF9LCBSZXN1bHR9LgorLXNwZWMgbmV3KHdyYXBwYWJsZSgpKSAtPiB7b2ssICN0X3RyYW5zcG9ydHt9fS4KIAotLXNwZWMgZmx1c2goI3RyYW5zcG9ydHt9KSAtPiB7I3RyYW5zcG9ydHt9LCBvayB8IHtlcnJvciwgX1JlYXNvbn19LgotZmx1c2goVHJhbnNwb3J0ID0gI3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGUsIGRhdGEgPSBEYXRhfSkgLT4KLSAgICB7TmV3VHJhbnNEYXRhLCBSZXN1bHR9ID0gTW9kdWxlOmZsdXNoKERhdGEpLAotICAgIHtUcmFuc3BvcnQjdHJhbnNwb3J0e2RhdGEgPSBOZXdUcmFuc0RhdGF9LCBSZXN1bHR9LgorbmV3KHttZW1idWZmZXIsIE1lbWJ1ZmZlcn0pIHdoZW4gaXNfYmluYXJ5KE1lbWJ1ZmZlcik7IGlzX2xpc3QoTWVtYnVmZmVyKSAtPgorICB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoTWVtYnVmZmVyKTsKK25ldyh7bWVtYnVmZmVyLCBNZW1idWZmZXIsIFtdfSkgd2hlbiBpc19iaW5hcnkoTWVtYnVmZmVyKTsgaXNfbGlzdChNZW1idWZmZXIpIC0+CisgIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldyhNZW1idWZmZXIpOworbmV3KHt0Y3AsIFNvY2tldH0pIHdoZW4gaXNfcG9ydChTb2NrZXQpIC0+CisgIG5ldyh7dGNwLCBTb2NrZXQsIFtdfSk7CituZXcoe3RjcCwgU29ja2V0LCBPcHRzfSkgd2hlbiBpc19wb3J0KFNvY2tldCkgLT4KKyAgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgT3B0cyk7CituZXcoe2ZpbGUsIEZpbGVuYW1lfSkgd2hlbiBpc19saXN0KEZpbGVuYW1lKTsgaXNfYmluYXJ5KEZpbGVuYW1lKSAtPgorICBuZXcoe2ZpbGUsIEZpbGVuYW1lLCBbXX0pOworbmV3KHtmaWxlLCBGaWxlbmFtZSwgT3B0c30pIHdoZW4gaXNfbGlzdChGaWxlbmFtZSk7IGlzX2JpbmFyeShGaWxlbmFtZSkgLT4KKyAge29rLCBGaWxlfSA9IGZpbGU6b3BlbihGaWxlbmFtZSwgW3JhdywgYmluYXJ5XSksCisgIG5ldyh7ZmlsZSwgRmlsZSwgT3B0c30pOworbmV3KHtmaWxlLCBGaWxlLCBPcHRzfSkgLT4KKyAgdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0Om5ldyhGaWxlLCBPcHRzKS4KIAotLXNwZWMgY2xvc2UoI3RyYW5zcG9ydHt9KSAtPiB7I3RyYW5zcG9ydHt9LCBvayB8IHtlcnJvciwgX1JlYXNvbn19LgotY2xvc2UoVHJhbnNwb3J0ID0gI3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGUsIGRhdGEgPSBEYXRhfSkgLT4KLSAgICB7TmV3VHJhbnNEYXRhLCBSZXN1bHR9ID0gTW9kdWxlOmNsb3NlKERhdGEpLAotICAgIHtUcmFuc3BvcnQjdHJhbnNwb3J0e2RhdGEgPSBOZXdUcmFuc0RhdGF9LCBSZXN1bHR9LgorLXNwZWMgbmV3KE1vZHVsZTo6bW9kdWxlKCksIFN0YXRlOjphbnkoKSkgLT4ge29rLCAjdF90cmFuc3BvcnR7fX0uCisKK25ldyhNb2R1bGUsIFN0YXRlKSB3aGVuIGlzX2F0b20oTW9kdWxlKSAtPgorICB7b2ssID9kZWJ1Z193cmFwKCN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGUsIHN0YXRlID0gU3RhdGV9KX0uCisKKworLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgorCisKK3JlYWQoVHJhbnNwb3J0ID0gI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZX0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICB7TmV3U3RhdGUsIFJlc3VsdH0gPSBNb2R1bGU6cmVhZChUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUsIExlbiksCisgIHtUcmFuc3BvcnQjdF90cmFuc3BvcnR7c3RhdGUgPSBOZXdTdGF0ZX0sIFJlc3VsdH0uCisKKworcmVhZF9leGFjdChUcmFuc3BvcnQgPSAjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIGNhc2UgbGlzdHM6a2V5ZmluZChyZWFkX2V4YWN0LCAxLCBNb2R1bGU6bW9kdWxlX2luZm8oZXhwb3J0cykpIG9mCisgICAge3JlYWRfZXhhY3QsIDJ9IC0+CisgICAgICB7TmV3U3RhdGUsIFJlc3VsdH0gPSBNb2R1bGU6cmVhZF9leGFjdChUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUsIExlbiksCisgICAgICB7VHJhbnNwb3J0I3RfdHJhbnNwb3J0e3N0YXRlID0gTmV3U3RhdGV9LCBSZXN1bHR9OworICAgIF8gLT4KKyAgICAgIHJlYWQoVHJhbnNwb3J0LCBMZW4pCisgIGVuZC4KKworCit3cml0ZShUcmFuc3BvcnQgPSAjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlfSwgRGF0YSkgLT4KKyAge05ld1N0YXRlLCBSZXN1bHR9ID0gTW9kdWxlOndyaXRlKFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5zdGF0ZSwgRGF0YSksCisgIHtUcmFuc3BvcnQjdF90cmFuc3BvcnR7c3RhdGUgPSBOZXdTdGF0ZX0sIFJlc3VsdH0uCisKKworZmx1c2goVHJhbnNwb3J0ID0gI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZX0pIC0+CisgIHtOZXdTdGF0ZSwgUmVzdWx0fSA9IE1vZHVsZTpmbHVzaChUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUpLAorICB7VHJhbnNwb3J0I3RfdHJhbnNwb3J0e3N0YXRlID0gTmV3U3RhdGV9LCBSZXN1bHR9LgorCisKK2Nsb3NlKFRyYW5zcG9ydCA9ICN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGV9KSAtPgorICB7TmV3U3RhdGUsIFJlc3VsdH0gPSBNb2R1bGU6Y2xvc2UoVHJhbnNwb3J0I3RfdHJhbnNwb3J0LnN0YXRlKSwKKyAge1RyYW5zcG9ydCN0X3RyYW5zcG9ydHtzdGF0ZSA9IE5ld1N0YXRlfSwgUmVzdWx0fS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0IGIvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZmZjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvVGhyaWZ0X29taXRfd2l0aC50aHJpZnQKQEAgLTAsMCArMSwyMiBAQAorc3RydWN0IHRlc3QxIHsKKyAgMTogaTMyIG9uZQorICAyOiBpMzIgdHdvICAgICAgICAgICAgICAgICAgICAvLyBvbWl0CisgIDM6IGkzMiB0aHJlZQorfQorCitzdHJ1Y3QgdGVzdDIgeworICAxOiBpMzIgb25lCisgIDI6IHRlc3QyIHR3byAgICAgICAgICAgICAgICAgIC8vIG9taXQKKyAgMzogaTMyIHRocmVlCit9CisKK3N0cnVjdCB0ZXN0MyB7CisgIDE6IGkzMiBvbmUKKyAgMjogbGlzdDx0ZXN0MT4gdHdvICAgICAgICAgICAgLy8gb21pdAorfQorCitzdHJ1Y3QgdGVzdDQgeworICAxOiBpMzIgb25lCisgIDI6IG1hcDxpMzIsdGVzdDE+IHR3byAgICAgICAgIC8vIG9taXQKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvTGVnYWN5TmFtZXMudGhyaWZ0IGIvbGliL2VybC90ZXN0L2ZsYWdzL0xlZ2FjeU5hbWVzLnRocmlmdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9lcmwvTGVnYWN5TmFtZXMudGhyaWZ0CnJlbmFtZSB0byBsaWIvZXJsL3Rlc3QvZmxhZ3MvTGVnYWN5TmFtZXMudGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvVGhyaWZ0MzIxNC50aHJpZnQgYi9saWIvZXJsL3Rlc3QvZmxhZ3MvVGhyaWZ0MzIxNC50aHJpZnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvdGVzdC9UaHJpZnQzMjE0LnRocmlmdApyZW5hbWUgdG8gbGliL2VybC90ZXN0L2ZsYWdzL1RocmlmdDMyMTQudGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvbGVnYWN5X25hbWVzX3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L2xlZ2FjeV9uYW1lc190ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTZhYTNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L2xlZ2FjeV9uYW1lc190ZXN0LmVybApAQCAtMCwwICsxLDY5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZShsZWdhY3lfbmFtZXNfdGVzdCkuCistY29tcGlsZShleHBvcnRfYWxsKS4KKworLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSgiZ2VuLWVybC9sZWdhY3lOYW1lc19jb25zdGFudHMuaHJsIikuCisKK3JlY29yZF9nZW5lcmF0aW9uX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiY2FwaXRhbGl6ZWRTdHJ1Y3QgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtjYXBpdGFsaXplZFN0cnVjdCwgXywgX30sCisgICAgICAjY2FwaXRhbGl6ZWRTdHJ1Y3R7aWQ9bnVsbCxtZXNzYWdlPW51bGx9CisgICAgKX0KKyAgXS4KKworc3RydWN0X2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJjYXBpdGFsaXplZFN0cnVjdCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCAnaWQnLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBzdHJpbmcsICdtZXNzYWdlJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBsZWdhY3lOYW1lc190eXBlczpzdHJ1Y3RfaW5mb19leHQoY2FwaXRhbGl6ZWRTdHJ1Y3QpCisgICAgKX0sCisgICAgeyJsaXN0Q2FwaXRhbGl6ZWRTdHJ1Y3RzIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge3N0cnVjdCwgeydsZWdhY3lOYW1lc190eXBlcycsICdjYXBpdGFsaXplZFN0cnVjdCd9fX0sICdzdHJ1Y3RzJywgW119CisgICAgICBdfSwKKyAgICAgIGxlZ2FjeU5hbWVzX3R5cGVzOnN0cnVjdF9pbmZvX2V4dChsaXN0Q2FwaXRhbGl6ZWRTdHJ1Y3RzKQorICAgICl9CisgIF0uCisKK3NlcnZpY2VfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5hbWVzIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2NhcGl0YWxpemVkU3RydWN0J319fSwKKyAgICAgICAgezIsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnY2FwaXRhbGl6ZWRTdHJ1Y3QnfX19CisgICAgICBdfSwKKyAgICAgIGxlZ2FjeU5hbWVzX3RocmlmdDpmdW5jdGlvbl9pbmZvKG5hbWVzLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7Im5hbWVzIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnbGlzdENhcGl0YWxpemVkU3RydWN0cyd9fSwKKyAgICAgIGxlZ2FjeU5hbWVzX3RocmlmdDpmdW5jdGlvbl9pbmZvKG5hbWVzLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsibmFtZXMgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAneGNlcHRpb24nfX19XX0sCisgICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgZXhjZXB0aW9ucykKKyAgICApfQorICBdLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L211bHRpcGxleGluZy50aHJpZnQgYi9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzc5OTRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L211bHRpcGxleGluZy50aHJpZnQKQEAgLTAsMCArMSw3IEBACitzZXJ2aWNlIE11bHRpcGxleGluZ19DYWxjdWxhdG9yIHsKKyAgICBpMzIgYWRkKDE6IGkzMiB4LCAyOiBpMzIgeSkKK30KKworc2VydmljZSBNdWx0aXBsZXhpbmdfV2VhdGhlclJlcG9ydCB7CisgICAgZG91YmxlIGdldFRlbXBlcmF0dXJlKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9tdWx0aXBsZXhpbmdfdGVzdC5lcmwgYi9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nX3Rlc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMmQ2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nX3Rlc3QuZXJsCkBAIC0wLDAgKzEsNTcgQEAKKy1tb2R1bGUobXVsdGlwbGV4aW5nX3Rlc3QpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1leHBvcnQoWworICAgICBoYW5kbGVfZnVuY3Rpb24vMgorICAgICxoYW5kbGVfZXJyb3IvMgorXSkuCisKK3N0YXJ0X211bHRpcGxleGVkX3NlcnZlcl90ZXN0KCkgLT4KKworICAgIFBvcnQgPSA5MDkwLAorICAgIFNlcnZpY2VzID0gWworICAgICAgICAgICAgICAgIHsiTXVsdGlwbGV4aW5nX0NhbGN1bGF0b3IiLCAgICBtdWx0aXBsZXhpbmdfX2NhbGN1bGF0b3JfdGhyaWZ0fSwKKyAgICAgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19XZWF0aGVyUmVwb3J0IiwgbXVsdGlwbGV4aW5nX193ZWF0aGVyX3JlcG9ydF90aHJpZnR9CisgICAgICAgICAgICAgICBdLAorCisgICAge29rLCBQaWR9ID0gdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RhcnQoWworICAgICAgICB7aXAsICIxMjcuMC4wLjEifSwKKyAgICAgICAge3BvcnQsIFBvcnR9LAorICAgICAgICB7bmFtZSwgP01PRFVMRX0sCisgICAgICAgIHtzZXJ2aWNlLCBTZXJ2aWNlc30sCisgICAgICAgIHtoYW5kbGVyLCBbCisgICAgICAgICAgICB7ImVycm9yX2hhbmRsZXIiLCAgICAgICAgICAgICAgP01PRFVMRX0sCisgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19DYWxjdWxhdG9yIiwgICAgP01PRFVMRX0sCisgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19XZWF0aGVyUmVwb3J0IiwgP01PRFVMRX0KKyAgICAgICAgXX0KKyAgICAgXSksCisKKyAgICB7b2ssIFt7Ik11bHRpcGxleGluZ19DYWxjdWxhdG9yIiwgQ2FsY3VsYXRvckNsaWVudDB9LAorICAgICAgICAgIHsiTXVsdGlwbGV4aW5nX1dlYXRoZXJSZXBvcnQiLCBXZWF0aGVyUmVwb3J0Q2xpZW50MH1dfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXdfbXVsdGlwbGV4ZWQoIjEyNy4wLjAuMSIsIFBvcnQsIFNlcnZpY2VzLCBbXSksCisKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtlcnJvciwge2JhZF9hcmdzLCBfLCBffX19LCB0aHJpZnRfY2xpZW50OmNhbGwoV2VhdGhlclJlcG9ydENsaWVudDAsIGdldFRlbXBlcmF0dXJlLCBbMV0pKSwKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtlcnJvciwge2JhZF9hcmdzLCBfLCBffX19LCB0aHJpZnRfY2xpZW50OmNhbGwoQ2FsY3VsYXRvckNsaWVudDAsIGFkZCwgWzFdKSksCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtiYWRfYXJncywgXywgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKENhbGN1bGF0b3JDbGllbnQwLCBhZGQsIFsxLDEsMV0pKSwKKworICAgID9hc3NlcnRNYXRjaCh7Xywge2Vycm9yLCB7bm9fZnVuY3Rpb24sIF99fX0sIHRocmlmdF9jbGllbnQ6Y2FsbChDYWxjdWxhdG9yQ2xpZW50MCwgZ2V0VGVtcGVyYXR1cmUsIFtdKSksCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtub19mdW5jdGlvbiwgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKFdlYXRoZXJSZXBvcnRDbGllbnQwLCBhZGQsIFs0MSwgMV0pKSwKKworICAgID9hc3NlcnRNYXRjaCh7Xywge29rLCA0Mn19LCB0aHJpZnRfY2xpZW50OmNhbGwoQ2FsY3VsYXRvckNsaWVudDAsIGFkZCwgWzQxLCAxXSkpLAorICAgID9hc3NlcnRNYXRjaCh7Xywge29rLCA0Mi4wfX0sIHRocmlmdF9jbGllbnQ6Y2FsbChXZWF0aGVyUmVwb3J0Q2xpZW50MCwgZ2V0VGVtcGVyYXR1cmUsIFtdKSksCisKKyAgICB0aHJpZnRfc29ja2V0X3NlcnZlcjpzdG9wKFBpZCkuCisKKyUlIEhBTkRMRSBGVU5DVElPTlMKKworJSUgQ2FsY3VsYXRvciBoYW5kbGVzCitoYW5kbGVfZnVuY3Rpb24oYWRkLCB7WCwgWX0pIC0+CisgICAge3JlcGx5LCBYICsgWX07CisKKyUlIFdlYXRoZXJSZXBvcnQgaGFuZGxlcworaGFuZGxlX2Z1bmN0aW9uKGdldFRlbXBlcmF0dXJlLCB7fSkgLT4KKyAgICB7cmVwbHksIDQyLjB9LgorCitoYW5kbGVfZXJyb3IoX0YsIF9SZWFzb24pIC0+CislJSAgICAgP2RlYnVnSGVyZSwgP2RlYnVnVmFsKHtfRiwgX1JlYXNvbn0pLAorICAgIG9rLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L25hbWVfY29uZmxpY3RfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxZGY1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsCkBAIC0wLDAgKzEsMjk5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZShuYW1lX2NvbmZsaWN0X3Rlc3QpLgorLWNvbXBpbGUoZXhwb3J0X2FsbCkuCisKKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvbmFtZV9jb25mbGljdF90ZXN0X2NvbnN0YW50cy5ocmwiKS4KKworcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgorICBbCisgICAgeyJ1c2luZyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3VzaW5nLCBfLCBffSwKKyAgICAgICN1c2luZ3tzaW5nbGU9bnVsbCxpbnRlZ2VyPW51bGx9CisgICAgKX0sCisgICAgeyJkZWxlZ2F0ZSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge2RlbGVnYXRlLCBfLCBffSwKKyAgICAgICNkZWxlZ2F0ZXtwYXJ0aWFsPW51bGwsZGVsZWdhdGU9bnVsbH0KKyAgICApfSwKKyAgICB7ImdldCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge2dldCwgX30sCisgICAgICAjZ2V0e3NieXRlPW51bGx9CisgICAgKX0sCisgICAgeyJwYXJ0aWFsIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7cGFydGlhbCwgXywgXywgX30sCisgICAgICAjcGFydGlhbHt1c2luZz1udWxsfQorICAgICl9LAorICAgIHsiQ2xhc3NBbmRQcm9wIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J0NsYXNzQW5kUHJvcCcsIF8sIF8sIF8sIF99LAorICAgICAgIydDbGFzc0FuZFByb3AneworICAgICAgICAnQ2xhc3NBbmRQcm9wJz1udWxsLAorICAgICAgICAnQ2xhc3NBbmRQcm9wXyc9bnVsbCwKKyAgICAgICAgJ0NsYXNzQW5kUHJvcF9fJz1udWxsLAorICAgICAgICAnQ2xhc3NBbmRQcm9wZXInPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7InNlY29uZF9jaGFuY2UgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtzZWNvbmRfY2hhbmNlLCBfLCBfLCBfLCBffSwKKyAgICAgICNzZWNvbmRfY2hhbmNleworICAgICAgICAnU0VDT05EX0NIQU5DRSc9bnVsbCwKKyAgICAgICAgJ1NFQ09ORF9DSEFOQ0VfJz1udWxsLAorICAgICAgICAnU0VDT05EX0NIQU5DRV9fJz1udWxsLAorICAgICAgICAnU0VDT05EX0NIQU5DRVMnPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7Ik5PV19FQVRfVEhJUyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydOT1dfRUFUX1RISVMnLCBfLCBfLCBfLCBffSwKKyAgICAgICMnTk9XX0VBVF9USElTJ3sKKyAgICAgICAgbm93X2VhdF90aGlzPW51bGwsCisgICAgICAgIG5vd19lYXRfdGhpc189bnVsbCwKKyAgICAgICAgbm93X2VhdF90aGlzX189bnVsbCwKKyAgICAgICAgbm93X2VhdF90aGlzX2FuZF90aGlzPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7IlRoZUVkZ2VDYXNlIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J1RoZUVkZ2VDYXNlJywgXywgXywgXywgXywgXywgX30sCisgICAgICAjJ1RoZUVkZ2VDYXNlJ3sKKyAgICAgICAgdGhlRWRnZUNhc2U9bnVsbCwKKyAgICAgICAgdGhlRWRnZUNhc2VfPW51bGwsCisgICAgICAgIHRoZUVkZ2VDYXNlX189bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAorICAgICAgICAnVGhlRWRnZUNhc2VfJz1udWxsLAorICAgICAgICAnVGhlRWRnZUNhc2VfXyc9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiVHJpY2t5XyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydUcmlja3lfJywgXywgX30sCisgICAgICAjJ1RyaWNreV8ne3RyaWNreT1udWxsLCdUcmlja3knPW51bGx9CisgICAgKX0sCisgICAgeyJOZXN0ZWQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnTmVzdGVkJywgXywgXywgXywgXywgXywgX30sCisgICAgICAjJ05lc3RlZCd7CisgICAgICAgICdDbGFzc0FuZFByb3AnPW51bGwsCisgICAgICAgIHNlY29uZF9jaGFuY2U9bnVsbCwKKyAgICAgICAgJ05PV19FQVRfVEhJUyc9bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAorICAgICAgICAnVHJpY2t5Xyc9bnVsbCwKKyAgICAgICAgJ05lc3RlZCc9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiUHJvYmxlbV8gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnUHJvYmxlbV8nLCBfLCBffSwKKyAgICAgICMnUHJvYmxlbV8ne3Byb2JsZW09bnVsbCwnUHJvYmxlbSc9bnVsbH0KKyAgICApfQorICBdLgorCitzdHJ1Y3RfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7InVzaW5nIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBkb3VibGV9LHsyLCBkb3VibGV9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8odXNpbmcpCisgICAgKX0sCisgICAgeyJkZWxlZ2F0ZSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHN0cmluZ30sCisgICAgICAgIHsyLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19fQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZGVsZWdhdGUpCisgICAgKX0sCisgICAgeyJnZXQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZ2V0KQorICAgICl9LAorICAgIHsicGFydGlhbCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHVzaW5nfX19LAorICAgICAgICB7MiwgYm9vbH0sCisgICAgICAgIHszLCBib29sfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8ocGFydGlhbCkKKyAgICApfSwKKyAgICB7IkNsYXNzQW5kUHJvcCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnQ2xhc3NBbmRQcm9wJykKKyAgICApfSwKKyAgICB7InNlY29uZF9jaGFuY2UgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oc2Vjb25kX2NoYW5jZSkKKyAgICApfSwKKyAgICB7Ik5PV19FQVRfVEhJUyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnTk9XX0VBVF9USElTJykKKyAgICApfSwKKyAgICB7IlRoZUVkZ2VDYXNlIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH0sezMsIGJvb2x9LHs0LCBib29sfSx7NSwgYm9vbH0sezYsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1RoZUVkZ2VDYXNlJykKKyAgICApfSwKKyAgICB7IlRyaWNreV8gZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdUcmlja3lfJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdDbGFzc0FuZFByb3AnfX19LAorICAgICAgICB7Miwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgc2Vjb25kX2NoYW5jZX19fSwKKyAgICAgICAgezMsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdOT1dfRUFUX1RISVMnfX19LAorICAgICAgICB7NCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ1RoZUVkZ2VDYXNlJ319fSwKKyAgICAgICAgezUsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdUcmlja3lfJ319fSwKKyAgICAgICAgezYsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdOZXN0ZWQnfX19CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnTmVzdGVkJykKKyAgICApfSwKKyAgICB7IlByb2JsZW1fIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnUHJvYmxlbV8nKQorICAgICl9LAorICAgIHsidXNpbmcgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGRvdWJsZSwgc2luZ2xlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBkb3VibGUsIGludGVnZXIsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCh1c2luZykKKyAgICApfSwKKyAgICB7ImRlbGVnYXRlIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHBhcnRpYWwsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIGRlbGVnYXRlfX0sIGRlbGVnYXRlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoZGVsZWdhdGUpCisgICAgKX0sCisgICAgeyJnZXQgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHVuZGVmaW5lZCwgYm9vbCwgc2J5dGUsIHVuZGVmaW5lZH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoZ2V0KQorICAgICl9LAorICAgIHsicGFydGlhbCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgdXNpbmd9fSwgdXNpbmcsICN1c2luZ3t9fSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgcmVhZCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgd3JpdGUsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dChwYXJ0aWFsKQorICAgICl9LAorICAgIHsiQ2xhc3NBbmRQcm9wIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcF8nLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wX18nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wZXInLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0NsYXNzQW5kUHJvcCcpCisgICAgKX0sCisgICAgeyJzZWNvbmRfY2hhbmNlIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRScsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFXycsIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFX18nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRVMnLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoc2Vjb25kX2NoYW5jZSkKKyAgICApfSwKKyAgICB7Ik5PV19FQVRfVEhJUyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXNfLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXNfXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzX2FuZF90aGlzLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ05PV19FQVRfVEhJUycpCisgICAgKX0sCisgICAgeyJUaGVFZGdlQ2FzZSBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgdGhlRWRnZUNhc2UsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgdGhlRWRnZUNhc2VfXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ1RoZUVkZ2VDYXNlJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezUsIHVuZGVmaW5lZCwgYm9vbCwgJ1RoZUVkZ2VDYXNlXycsIHVuZGVmaW5lZH0sCisgICAgICAgIHs2LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZV9fJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdUaGVFZGdlQ2FzZScpCisgICAgKX0sCisgICAgeyJUcmlja3lfIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCB0cmlja3ksIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdUcmlja3knLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ1RyaWNreV8nKQorICAgICl9LAorICAgIHsiTmVzdGVkIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdDbGFzc0FuZFByb3AnCisgICAgICAgIH19LCAnQ2xhc3NBbmRQcm9wJywgIydDbGFzc0FuZFByb3Ane319LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgIHNlY29uZF9jaGFuY2UKKyAgICAgICAgfX0sIHNlY29uZF9jaGFuY2UsICNzZWNvbmRfY2hhbmNle319LAorICAgICAgICB7MywgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdOT1dfRUFUX1RISVMnCisgICAgICAgIH19LCAnTk9XX0VBVF9USElTJywgIydOT1dfRUFUX1RISVMne319LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdUaGVFZGdlQ2FzZScKKyAgICAgICAgfX0sICdUaGVFZGdlQ2FzZScsICMnVGhlRWRnZUNhc2Une319LAorICAgICAgICB7NSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdUcmlja3lfJworICAgICAgICB9fSwgJ1RyaWNreV8nLCAjJ1RyaWNreV8ne319LAorICAgICAgICB7NiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdOZXN0ZWQnCisgICAgICAgIH19LCAnTmVzdGVkJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdOZXN0ZWQnKQorICAgICl9LAorICAgIHsiUHJvYmxlbV8gZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIHByb2JsZW0sIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdQcm9ibGVtJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdQcm9ibGVtXycpCisgICAgKX0KKyAgXS4KKworc2VydmljZV9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZXZlbnQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgcGFydGlhbH19fV19LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKGV2ZW50LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7ImV2ZW50IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIGRlbGVnYXRlfX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oZXZlbnQsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJldmVudCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhldmVudCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7IkZvbyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnTmVzdGVkJ319fV19LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKCdGb28nLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7IkZvbyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oJ0ZvbycsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJGb28gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdQcm9ibGVtXyd9fX1dfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbygnRm9vJywgZXhjZXB0aW9ucykKKyAgICApfQorICBdLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfY2xpZW50LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X2NsaWVudC5lcmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODVjNDcuLjAwMDAwMDAKLS0tIGEvbGliL2VybC90ZXN0L3Rlc3RfY2xpZW50LmVybAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZSh0ZXN0X2NsaWVudCkuCi0KLS1leHBvcnQoW3N0YXJ0LzAsIHN0YXJ0LzFdKS4KLQotLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0X3Rlc3RfdHlwZXMuaHJsIikuCi0KLS1yZWNvcmQob3B0aW9ucywge3BvcnQgPSA5MDkwLAotICAgICAgICAgICAgICAgICAgY2xpZW50X29wdHMgPSBbXX0pLgotCi1wYXJzZV9hcmdzKEFyZ3MpIC0+IHBhcnNlX2FyZ3MoQXJncywgI29wdGlvbnN7fSkuCi1wYXJzZV9hcmdzKFtdLCBPcHRzKSAtPiBPcHRzOwotcGFyc2VfYXJncyhbSGVhZCB8IFJlc3RdLCBPcHRzKSAtPgotICAgIE5ld09wdHMgPQotICAgICAgICBjYXNlIGNhdGNoIGxpc3RfdG9faW50ZWdlcihIZWFkKSBvZgotICAgICAgICAgICAgUG9ydCB3aGVuIGlzX2ludGVnZXIoUG9ydCkgLT4KLSAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7cG9ydCA9IFBvcnR9OwotICAgICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgICAgICBjYXNlIEhlYWQgb2YKLSAgICAgICAgICAgICAgICAgICAgImZyYW1lZCIgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7ZnJhbWVkLCB0cnVlfSB8IE9wdHMjb3B0aW9ucy5jbGllbnRfb3B0c119OwotICAgICAgICAgICAgICAgICAgICAiIiAtPgotICAgICAgICAgICAgICAgICAgICAgICAgT3B0czsKLSAgICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCi0gICAgICAgICAgICAgICAgZW5kCi0gICAgICAgIGVuZCwKLSAgICBwYXJzZV9hcmdzKFJlc3QsIE5ld09wdHMpLgotCi0KLXN0YXJ0KCkgLT4gc3RhcnQoW10pLgotc3RhcnQoQXJncykgLT4KLSAgI29wdGlvbnN7cG9ydCA9IFBvcnQsIGNsaWVudF9vcHRzID0gQ2xpZW50T3B0c30gPSBwYXJzZV9hcmdzKEFyZ3MpLAotICB7b2ssIENsaWVudDB9ID0gdGhyaWZ0X2NsaWVudF91dGlsOm5ldygKLSAgICAiMTI3LjAuMC4xIiwgUG9ydCwgdGhyaWZ0X3Rlc3RfdGhyaWZ0LCBDbGllbnRPcHRzKSwKLQotICBEZW1vWHRydWN0ID0gIydYdHJ1Y3QnewotICAgIHN0cmluZ190aGluZyA9IDw8Ilplcm8iPj4sCi0gICAgYnl0ZV90aGluZyA9IDEsCi0gICAgaTMyX3RoaW5nID0gOTEyODM2MSwKLSAgICBpNjRfdGhpbmcgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3fSwKLQotICBEZW1vTmVzdCA9ICMnWHRydWN0Mid7Ci0gICAgYnl0ZV90aGluZyA9IDcsCi0gICAgc3RydWN0X3RoaW5nID0gRGVtb1h0cnVjdCwKLSAgICAlIE5vdGUgdGhhdCB3ZSBkb24ndCBzZXQgaTMyX3RoaW5nLCBpdCB3aWxsIGNvbWUgYmFjayBhcyB1bmRlZmluZWQKLSAgICAlIGZyb20gdGhlIFB5dGhvbiBzZXJ2ZXIsIGJ1dCAwIGZyb20gdGhlIEMrKyBzZXJ2ZXIsIHNpbmNlIGl0IGlzIG5vdAotICAgICUgb3B0aW9uYWwKLSAgICBpMzJfdGhpbmcgPSAyfSwKLQotICAlIElzIGl0IHNhZmUgdG8gbWF0Y2ggdGhlc2UgdGhpbmdzPwotICBEZW1vRGljdCA9IGRpY3Q6ZnJvbV9saXN0KFsge0tleSwgS2V5LTEwfSB8fCBLZXkgPC0gbGlzdHM6c2VxKDAsMTApIF0pLAotICBEZW1vU2V0ID0gc2V0czpmcm9tX2xpc3QoWyBLZXkgfHwgS2V5IDwtIGxpc3RzOnNlcSgtMywzKSBdKSwKLQotICAlRGVtb0luc2FuZSA9ICNpbnNhbml0eXsKLSAgJSAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P3RocmlmdFRlc3RfRklWRSwgNTAwMH1dKSwKLSAgJSAgeHRydWN0cyA9IFsjeHRydWN0eyBzdHJpbmdfdGhpbmcgPSA8PCJUcnVjayI+PiwgYnl0ZV90aGluZyA9IDgsIGkzMl90aGluZyA9IDgsIGk2NF90aGluZyA9IDh9XX0sCi0KLSAge0NsaWVudDAxLCB7b2ssIG9rfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MCwgdGVzdFZvaWQsIFtdKSwKLQotICB7Q2xpZW50MDIsIHtvaywgPDwiVGVzdCI+Pn19ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDEsIHRlc3RTdHJpbmcsIFsiVGVzdCJdKSwKLSAge0NsaWVudDAzLCB7b2ssIDw8IlRlc3QiPj59fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAyLCB0ZXN0U3RyaW5nLCBbPDwiVGVzdCI+Pl0pLAotICB7Q2xpZW50MDQsIHtvaywgNjN9fSAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDMsIHRlc3RCeXRlLCBbNjNdKSwKLSAge0NsaWVudDA1LCB7b2ssIC0xfX0gICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA0LCB0ZXN0STMyLCBbLTFdKSwKLSAge0NsaWVudDA2LCB7b2ssIDB9fSAgICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA1LCB0ZXN0STMyLCBbMF0pLAotICB7Q2xpZW50MDcsIHtvaywgLTM0MzU5NzM4MzY4fX0gICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDYsIHRlc3RJNjQsIFstMzQzNTk3MzgzNjhdKSwKLSAge0NsaWVudDA4LCB7b2ssIC01LjIwOTg1MjN9fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA3LCB0ZXN0RG91YmxlLCBbLTUuMjA5ODUyM10pLAotICAlJSBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKLSAge0NsaWVudDA5LCB7b2ssIERlbW9YdHJ1Y3R9fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA4LCB0ZXN0U3RydWN0LCBbRGVtb1h0cnVjdF0pLAotICB7Q2xpZW50MTAsIHtvaywgRGVtb05lc3R9fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDksIHRlc3ROZXN0LCBbRGVtb05lc3RdKSwKLSAge0NsaWVudDExLCB7b2ssIERlbW9EaWN0fX0gICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEwLCB0ZXN0TWFwLCBbRGVtb0RpY3RdKSwKLSAge0NsaWVudDEyLCB7b2ssIERlbW9TZXR9fSAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDExLCB0ZXN0U2V0LCBbRGVtb1NldF0pLAotICB7Q2xpZW50MTMsIHtvaywgWy0xLDIsM119fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTIsIHRlc3RMaXN0LCBbWy0xLDIsM11dKSwKLSAge0NsaWVudDE0LCB7b2ssIDF9fSAgICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEzLCB0ZXN0RW51bSwgWz9USFJJRlRfVEVTVF9OVU1CRVJaX09ORV0pLAotICB7Q2xpZW50MTUsIHtvaywgMzA5ODU4MjM1MDgyNTIzfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTQsIHRlc3RUeXBlZGVmLCBbMzA5ODU4MjM1MDgyNTIzXSksCi0KLSAgJSBObyBweXRob24gaW1wbGVtZW50YXRpb24sIGJ1dCB3b3JrcyB3aXRoIEMrKyBhbmQgRXJsYW5nLgotICAle0NsaWVudDE2LCB7b2ssIEluc2FuZVJlc3VsdH19ICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE1LCB0ZXN0SW5zYW5pdHksIFtEZW1vSW5zYW5lXSksCi0gICVpbzpmb3JtYXQoIn5wfm4iLCBbSW5zYW5lUmVzdWx0XSksCi0gIENsaWVudDE2ID0gQ2xpZW50MTUsCi0KLSAge0NsaWVudDE3LCB7b2ssICMnWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJNZXNzYWdlIj4+fX19ID0KLSAgICB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTYsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJTYWZlIiwgIk1lc3NhZ2UiXSksCi0KLSAgQ2xpZW50MTggPQotICAgIHRyeQotICAgICAge0NsaWVudFMxLCBSZXN1bHQxfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxNywgdGVzdE11bHRpRXhjZXB0aW9uLCBbIlhjZXB0aW9uIiwgIk1lc3NhZ2UiXSksCi0gICAgICBpbzpmb3JtYXQoIlVuZXhwZWN0ZWQgcmV0dXJuISB+cH5uIiwgW1Jlc3VsdDFdKSwKLSAgICAgIENsaWVudFMxCi0gICAgY2F0Y2gKLSAgICAgIHRocm93OntDbGllbnRTMiwge2V4Y2VwdGlvbiwgRXhuUzEgPSAjJ1hjZXB0aW9uJ3t9fX0gLT4KLSAgICAgICAgIydYY2VwdGlvbid7ZXJyb3JDb2RlID0gMTAwMSwgbWVzc2FnZSA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24iPj59ID0gRXhuUzEsCi0gICAgICAgIENsaWVudFMyOwotICAgICAgdGhyb3c6e0NsaWVudFMyLCB7ZXhjZXB0aW9uLCBfRXhuUzEgPSAjJ1hjZXB0aW9uMid7fX19IC0+Ci0gICAgICAgIGlvOmZvcm1hdCgiV3JvbmcgZXhjZXB0aW9uIHR5cGUhfm4iLCBbXSksCi0gICAgICAgIENsaWVudFMyCi0gICAgZW5kLAotCi0gIENsaWVudDE5ID0KLSAgICB0cnkKLSAgICAgIHtDbGllbnRTMywgUmVzdWx0Mn0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTgsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJYY2VwdGlvbjIiLCAiTWVzc2FnZSJdKSwKLSAgICAgIGlvOmZvcm1hdCgiVW5leHBlY3RlZCByZXR1cm4hIH5wfm4iLCBbUmVzdWx0Ml0pLAotICAgICAgQ2xpZW50UzMKLSAgICBjYXRjaAotICAgICAgdGhyb3c6e0NsaWVudFM0LCB7ZXhjZXB0aW9uLCBfRXhuUzIgPSAjJ1hjZXB0aW9uJ3t9fX0gLT4KLSAgICAgICAgaW86Zm9ybWF0KCJXcm9uZyBleGNlcHRpb24gdHlwZSF+biIsIFtdKSwKLSAgICAgICAgQ2xpZW50UzQ7Ci0gICAgICB0aHJvdzp7Q2xpZW50UzQsIHtleGNlcHRpb24sIEV4blMyID0gIydYY2VwdGlvbjIne319fSAtPgotICAgICAgICAjJ1hjZXB0aW9uMid7ZXJyb3JDb2RlID0gMjAwMiwKLSAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmcgPSAjJ1h0cnVjdCd7Ci0gICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmcgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uMiI+Pn19ID0gRXhuUzIsCi0gICAgICAgIENsaWVudFM0Ci0gICAgZW5kLAotCi0gIHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MTkpLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzc3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9jb25zdC5lcmwKQEAgLTAsMCArMSw1NCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9jb25zdCkuCisKKy1pZmRlZihURVNUKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvY29uc3RhbnRzX2RlbW9fdHlwZXMuaHJsIikuCisKK25hbWVzcGFjZV90ZXN0KCkgLT4KKyAgJSUgVmVyaWZ5IHRoYXQgcmVjb3JkcyBwcm9kdWNlZCBieSBDb25zdGFudHNEZW1vLnRocmlmdCBoYXZlIHRoZSByaWdodCBuYW1lc3BhY2UuCisgIGlvOmZvcm1hdCh1c2VyLCAiaW4gbmFtZXNwYWNlX3Rlc3QoKVxuIiwgW10pLAorICB7c3RydWN0LCBffSA9IGNvbnN0YW50c19kZW1vX3R5cGVzOnN0cnVjdF9pbmZvKCdjb25zdHNfdGhpbmcnKSwKKyAge3N0cnVjdCwgX30gPSBjb25zdGFudHNfZGVtb190eXBlczpzdHJ1Y3RfaW5mbygnY29uc3RzX0JsYWgnKSwKKyAgb2suCisKK2NvbnN0X21hcF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMzU1MzIpKSwKKyAgP2Fzc2VydEVycm9yKGZ1bmN0aW9uX2NsYXVzZSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMCkpLAorCisgID9hc3NlcnRFcXVhbCg4NTMsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwKDQzNTIzLCBkZWZhdWx0KSksCisgID9hc3NlcnRFcXVhbChkZWZhdWx0LCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcCgxMDExMCwgZGVmYXVsdCkpLAorCisgID9hc3NlcnRFcXVhbCg5ODMyNSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJsa2pzZGYiKSksCisgID9hc3NlcnRFcnJvcihmdW5jdGlvbl9jbGF1c2UsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwMigibm9uZXhpc3QiKSksCisKKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJoZWxsbyIsIDMyMSkpLAorICA/YXNzZXJ0RXF1YWwoMzIxLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcDIoImdvb2RieWUiLCAzMjEpKS4KKworY29uc3RfbGlzdF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzNTk4MzUyLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMikpLAorICA/YXNzZXJ0RXJyb3IoZnVuY3Rpb25fY2xhdXNlLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMCkpLAorCisgID9hc3NlcnRFcXVhbCgzMjUzNTIzLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMywgZGVmYXVsdCkpLAorICA/YXNzZXJ0RXF1YWwoZGVmYXVsdCwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9saXN0KDEwLCBkZWZhdWx0KSkuCisKKy1lbmRpZi4gJSUgVEVTVApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfbWVtYnVmZmVyLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X21lbWJ1ZmZlci5lcmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MWFlMTEuLjAwMDAwMDAKLS0tIGEvbGliL2VybC90ZXN0L3Rlc3RfbWVtYnVmZmVyLmVybAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZSh0ZXN0X21lbWJ1ZmZlcikuCi0KLS1pZmRlZihURVNUKS4KLS1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KLQotLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0X3Rlc3RfdHlwZXMuaHJsIikuCi0KLXRlc3RfZGF0YSgpIC0+Ci0gICMnWHRydWN0J3sKLSAgICBzdHJpbmdfdGhpbmcgPSA8PCJmb29iYXIiPj4sCi0gICAgYnl0ZV90aGluZyA9IDEyMywKLSAgICBpMzJfdGhpbmcgPSAxMjM0NTY3LAotICAgIGk2NF90aGluZyA9IDEyMzQ1Njc4OTAwCi0gIH0uCi0KLWVuY29kZV9kZWNvZGVfMV90ZXN0KCkgLT4KLSAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gIHtvaywgUHJvdG9jb2wwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gIFRlc3REYXRhID0gdGVzdF9kYXRhKCksCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1h0cnVjdCcpKX0sCi0gICAgICBUZXN0RGF0YX0pLAotICB7X1Byb3RvY29sMiwge29rLCBSZXN1bHR9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvY29sMSwKLSAgICB7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdYdHJ1Y3QnKSl9LAotICAgICdYdHJ1Y3QnKSwKLSAgUmVzdWx0ID0gVGVzdERhdGEuCi0KLWVuY29kZV9kZWNvZGVfMl90ZXN0KCkgLT4KLSAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gIHtvaywgUHJvdG9jb2wwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gIFRlc3REYXRhID0gdGVzdF9kYXRhKCksCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1h0cnVjdCcpKX0sCi0gICAgICBUZXN0RGF0YX0pLAotICB7X1Byb3RvY29sMiwge29rLCBSZXN1bHR9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvY29sMSwKLSAgICB7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdYdHJ1Y3QzJykpfSwKLSAgICAnWHRydWN0MycpLAotCi0gIFJlc3VsdCA9ICMnWHRydWN0Myd7c3RyaW5nX3RoaW5nID0gVGVzdERhdGEjJ1h0cnVjdCcuc3RyaW5nX3RoaW5nLAotICAgIGNoYW5nZWQgPSB1bmRlZmluZWQsCi0gICAgaTMyX3RoaW5nID0gVGVzdERhdGEjJ1h0cnVjdCcuaTMyX3RoaW5nLAotICAgIGk2NF90aGluZyA9IFRlc3REYXRhIydYdHJ1Y3QnLmk2NF90aGluZ30uCi0KLQotZW5jb2RlX2RlY29kZV8zX3Rlc3QoKSAtPgotICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKLSAge29rLCBQcm90b2NvbDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKLSAgVGVzdERhdGEgPSAjJ0Jvb2xzJ3tpbV90cnVlID0gdHJ1ZSwgaW1fZmFsc2UgPSBmYWxzZX0sCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0Jvb2xzJykpfSwKLSAgICAgIFRlc3REYXRhfSksCi0gIHtfUHJvdG9jb2wyLCB7b2ssIFJlc3VsdH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG9jb2wxLAotICAgIHtzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0Jvb2xzJykpfSwKLSAgICAnQm9vbHMnKSwKLQotICB0cnVlID0gVGVzdERhdGEjJ0Jvb2xzJy5pbV90cnVlICA9Oj0gUmVzdWx0IydCb29scycuaW1fdHJ1ZSwKLSAgdHJ1ZSA9IFRlc3REYXRhIydCb29scycuaW1fZmFsc2UgPTo9IFJlc3VsdCMnQm9vbHMnLmltX2ZhbHNlLgotCi0KLWVuY29kZV9kZWNvZGVfNF90ZXN0KCkgLT4KLSAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gIHtvaywgUHJvdG9jb2wwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gIFRlc3REYXRhID0gIydJbnNhbml0eSd7eHRydWN0cz1bXX0sCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0luc2FuaXR5JykpfSwKLSAgICAgIFRlc3REYXRhfSksCi0gIHtfUHJvdG9jb2wyLCB7b2ssIFJlc3VsdH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG9jb2wxLAotICAgIHtzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0luc2FuaXR5JykpfSwKLSAgICAnSW5zYW5pdHknKSwKLQotICBUZXN0RGF0YSA9IFJlc3VsdC4KLQotZW5jb2RlX2RlY29kZV81X3Rlc3QoKSAtPgotICAlIHRlc3Qgd3JpdGluZyB0byBhIGJ1ZmZlciwgZ2V0dGluZyB0aGUgYnl0ZXMgb3V0LCBwdXR0aW5nIHRoZW0KLSAgJSBpbiBhIG5ldyBidWZmZXIgYW5kIHJlYWRpbmcgdGhlbQotCi0gICUgaGVyZSdzIHRoZSB3cml0aW5nIHBhcnQKLSAge29rLCBUcmFuc3BvcnQwfSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyOm5ldygpLAotICB7b2ssIFByb3RvY29sMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQwKSwKLSAgVGVzdERhdGEgPSB0ZXN0X2RhdGEoKSwKLSAge1Byb3RvY29sMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvY29sMCwKLSAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnWHRydWN0JykpfSwKLSAgICAgIFRlc3REYXRhfSksCi0gICUgZmx1c2ggbm93IHJldHVybnMgdGhlIGJ1ZmZlcgotICB7X1Byb3RvY29sMiwgQnVmfSA9IHRocmlmdF9wcm90b2NvbDpmbHVzaF90cmFuc3BvcnQoUHJvdG9jb2wxKSwKLQotICAlIG5vdyB0aGUgcmVhZGluZyBwYXJ0Ci0gIHtvaywgVDJ9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3IChCdWYpLAotICB7b2ssIFAyfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFQyKSwKLSAge18sIHtvaywgUmVzdWx0fX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMiwKLSAgICB7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdYdHJ1Y3QnKSl9LAotICAgICdYdHJ1Y3QnKSwKLQotICBSZXN1bHQgPSBUZXN0RGF0YS4KLQotLWVuZGlmLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3Rfb21pdC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9vbWl0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDg0MWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3Rfb21pdC5lcmwKQEAgLTAsMCArMSw3OSBAQAorLW1vZHVsZSh0ZXN0X29taXQpLgorCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfb21pdF93aXRoX3R5cGVzLmhybCIpLgorCistaWZkZWYoVEVTVCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKK29taXRfc3RydWN0MV90ZXN0KCkgLT4KKyAgJSUgSW4gdGhpcyB0ZXN0LCB0aGUgZmllbGQgdGhhdCBpcyBkZWxldGVkIGlzIGEgYmFzaWMgdHlwZSAoYW4gaTMyKS4KKyAgQSA9ICN0ZXN0MXtvbmUgPSAxLCB0aHJlZSA9IDN9LAorICBCID0gI3Rlc3Qxe29uZSA9IDEsIHR3byA9IDIsIHRocmVlID0gM30sCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB7b2ssIFAwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisKKyAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBBKX19LCBBfSksCisgIHtQMiwge29rLCBPMH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUDEsIHtzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRob3V0X3R5cGVzLCBlbGVtZW50KDEsIEEpfX0pLAorICA/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/RVBTSUxPTikuCisKKy1lbmRpZi4gJSUgVEVTVApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxOWU4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsMzU5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldyhUcmFuc3BvcnQpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCkuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7dF90cmFuc3BvcnQsIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQsIHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIFtdfX0sCisgICAgICAgIFtdCisgICAgICB9fX0sCisgICAgICBuZXcoe3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCBbXX19KQorICAgICl9CisgIF0uCisKKworcmVhZChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6cmVhZChGcmFtZSwgQnl0ZXMpLgorCityZWFkX3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMAorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaGFsbG8gd29ybGQiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpyZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7ZXJyb3IsIGVvZn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCit3cml0ZShGcmFtZWQsIERhdGEpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6d3JpdGUoRnJhbWVkLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICBbCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtbXSwgW11dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIFtdCisgICAgICApCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtbImhhbGxvIHdvcmxkIl0sIFtdXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgW10KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBlbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbW10sIDw8Pj5dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDw8Pj4KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbWyJoYWxsbyB3b3JsZCJdLCA8PD4+XQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgPDw+PgorICAgICAgKQorICAgICl9CisgIF0uCisKKworZmx1c2goVHJhbnNwb3J0KSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIGZsdXNoKHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10KKyAgICAgIH0pCisgICAgKX0sCisgICAgeyJmbHVzaCBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIFs8PD4+LCA8PCJoYWxsbyB3b3JsZCI+Pl0KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIGZsdXNoKHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4KKyAgICAgIH0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7ImNsb3NlIGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAge3t0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10KKyAgICAgIH0sCisgICAgICBvaworICAgIH0sCisgICAgY2xvc2Uoe3RfYnVmZmVyZWQsCisgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgIFtdCisgICAgfSkKKyAgKX0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE3OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsCkBAIC0wLDAgKzEsMjE5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgorLWluY2x1ZGUoInRocmlmdF9wcm90b2NvbC5ocmwiKS4KKworCituZXcoVHJhbnNwb3J0KSAtPiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KS4KK25ldygpIC0+CisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KS4KKworbmV3X3Rlc3QoKSAtPgorICBuZXcodGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCkpLgorCit3cml0ZShUaGlzLCBWYWx1ZSkgLT4gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFRoaXMsIFZhbHVlKS4KK3JlYWQoVGhpcywgVHlwZSkgLT4gdGhyaWZ0X3Byb3RvY29sOnJlYWQoVGhpcywgVHlwZSkuCisKK3N0cihUaGlzMCwgVmFsdWUwKSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7c3RyaW5nLCBWYWx1ZTB9KSwKKyAge1RoaXMyLCB7b2ssIFZhbHVlMX19ID0gcmVhZChUaGlzMSwgc3RyaW5nKSwKKyAgP2Fzc2VydEVxdWFsKFZhbHVlMCwgYmluYXJ5X3RvX2xpc3QoVmFsdWUxKSksCisgIHtUaGlzMiwgb2t9Lgorc3RyaW5nX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IHN0cihUaGlzMCwgImFhYSIpLAorICB7VGhpczIsIG9rfSA9IHN0cihUaGlzMSwgIiIpLAorICB7VGhpczIsIG9rfS4KKworcm91bmRfdHJpcChUaGlzMCwgVHlwZSwgVmFsdWUwKSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7VHlwZSwgVmFsdWUwfSksCisgIHtUaGlzMiwge29rLCBWYWx1ZTF9fSA9IHJlYWQoVGhpczEsIFR5cGUpLAorICA/YXNzZXJ0RXF1YWwoVmFsdWUwLCBWYWx1ZTEpLAorICB7VGhpczIsIG9rfS4KKworYm9vbF90ZXN0KCkgLT4KKyAge29rLCBUaGlzMH0gPSBuZXcoKSwKKyAge1RoaXMxLCBva30gPSByb3VuZF90cmlwKFRoaXMwLCBib29sLCB0cnVlKSwKKyAge1RoaXMyLCBva30gPSByb3VuZF90cmlwKFRoaXMxLCBib29sLCBmYWxzZSksCisgIHtUaGlzMiwgb2t9LgorCitieXRlKFRoaXMwLCBWYWx1ZTApIC0+IHJvdW5kX3RyaXAoVGhpczAsIGJ5dGUsIFZhbHVlMCkuCitieXRlX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGJ5dGUoVGhpczAsIDApLAorICB7VGhpczIsIG9rfSA9IGJ5dGUoVGhpczEsIDQyKSwKKyAge1RoaXMzLCBva30gPSBieXRlKFRoaXMyLCAtMSksCisgIHtUaGlzNCwgb2t9ID0gYnl0ZShUaGlzMywgLTEyOCksCisgIHtUaGlzNCwgb2t9LgorCitpMTYoVGhpczAsIFZhbHVlMCkgLT4gcm91bmRfdHJpcChUaGlzMCwgaTE2LCBWYWx1ZTApLgoraTE2X3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGkxNihUaGlzMCwgMCksCisgIHtUaGlzMiwgb2t9ID0gaTE2KFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gaTE2KFRoaXMyLCAzMDAwMCksCisgIHtUaGlzNCwgb2t9ID0gaTE2KFRoaXMzLCAtMSksCisgIHtUaGlzNSwgb2t9ID0gaTE2KFRoaXM0LCAtMTI4KSwKKyAge1RoaXM2LCBva30gPSBpMTYoVGhpczUsIC0zMDAwMCksCisgIHtUaGlzNiwgb2t9LgorCitpMzIoVGhpczAsIFZhbHVlMCkgLT4gcm91bmRfdHJpcChUaGlzMCwgaTMyLCBWYWx1ZTApLgoraTMyX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGkzMihUaGlzMCwgMCksCisgIHtUaGlzMiwgb2t9ID0gaTMyKFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gaTMyKFRoaXMyLCAzMDAwMCksCisgIHtUaGlzNCwgb2t9ID0gaTMyKFRoaXMzLCAyMDAwMDAwMDAyKSwKKyAge1RoaXM1LCBva30gPSBpMzIoVGhpczQsIC0xKSwKKyAge1RoaXM2LCBva30gPSBpMzIoVGhpczUsIC0xMjgpLAorICB7VGhpczcsIG9rfSA9IGkzMihUaGlzNiwgLTMwMDAwKSwKKyAge1RoaXM4LCBva30gPSBpMzIoVGhpczcsIC0yMDAwMDAwMDAyKSwKKyAge1RoaXM4LCBva30uCisKK2k2NChUaGlzMCwgVmFsdWUwKSAtPiByb3VuZF90cmlwKFRoaXMwLCBpNjQsIFZhbHVlMCkuCitpNjRfdGVzdCgpIC0+CisgIHtvaywgVGhpczB9ID0gbmV3KCksCisgIHtUaGlzMSwgb2t9ID0gaTY0KFRoaXMwLCAwKSwKKyAge1RoaXMyLCBva30gPSBpNjQoVGhpczEsIDQyKSwKKyAge1RoaXMzLCBva30gPSBpNjQoVGhpczIsIDMwMDAwKSwKKyAge1RoaXM0LCBva30gPSBpNjQoVGhpczMsIDIwMDAwMDAwMDIpLAorICB7VGhpczUsIG9rfSA9IGk2NChUaGlzNCwgMTAwMDAwMDAwMDAwMDAwMDY0KSwKKyAge1RoaXM2LCBva30gPSBpNjQoVGhpczUsIC0xKSwKKyAge1RoaXM3LCBva30gPSBpNjQoVGhpczYsIC0xMjgpLAorICB7VGhpczgsIG9rfSA9IGk2NChUaGlzNywgLTMwMDAwKSwKKyAge1RoaXM5LCBva30gPSBpNjQoVGhpczgsIC0yMDAwMDAwMDAyKSwKKyAge1RoaXMxMCwgb2t9ID0gaTY0KFRoaXM5LCAtMTAwMDAwMDAwMDAwMDAwMDY0KSwKKyAge1RoaXMxMCwgb2t9LgorCitzdHJ1Y3RfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDF9KSwKKyAge1A0LCBva30gPSB3cml0ZShQMywge2J5dGUsIDQyfSksCisgIHtQNSwgb2t9ID0gd3JpdGUoUDQsIGZpZWxkX2VuZCksCisgIHtQNiwgb2t9ID0gd3JpdGUoUDUsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDIiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDE0fSksCisgIHtQNywgb2t9ID0gd3JpdGUoUDYsIHtieXRlLCAzfSksCisgIHtQOCwgb2t9ID0gd3JpdGUoUDcsIGZpZWxkX2VuZCksCisgIHtQOSwgb2t9ID0gd3JpdGUoUDgsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDMiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDQyfSksCisgIHtQMTAsIG9rfSA9IHdyaXRlKFA5LCB7Ynl0ZSwgOH0pLAorICB7UDExLCBva30gPSB3cml0ZShQMTAsIGZpZWxkX2VuZCksCisgIHtQMTIsIG9rfSA9IHdyaXRlKFAxMSwgZmllbGRfc3RvcCksCisgIHtQMTMsIG9rfSA9IHdyaXRlKFAxMiwgc3RydWN0X2VuZCksCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgbWVzc2FnZV9lbmQpLAorCisgIHtQMTUsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfX0gPSByZWFkKFAxNCwgbWVzc2FnZV9iZWdpbiksCisgIHtQMTYsIG9rfSA9IHJlYWQoUDE1LCBzdHJ1Y3RfYmVnaW4pLAorICB7UDE3LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfSTgsIGlkID0gMSB9fSA9IHJlYWQoUDE2LCBmaWVsZF9iZWdpbiksCisgIHtQMTgsIHtvaywgNDJ9fSA9IHJlYWQoUDE3LCBieXRlKSwKKyAge1AxOSwgb2t9ID0gcmVhZChQMTgsIGZpZWxkX2VuZCksCisgIHtQMjAsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9JOCwgaWQgPSAxNCB9fSA9IHJlYWQoUDE5LCBmaWVsZF9iZWdpbiksCisgIHtQMjEsIHtvaywgM319ID0gcmVhZChQMjAsIGJ5dGUpLAorICB7UDIyLCBva30gPSByZWFkKFAyMSwgZmllbGRfZW5kKSwKKyAge1AyMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDQyIH19ID0gcmVhZChQMjIsIGZpZWxkX2JlZ2luKSwKKyAge1AyNCwge29rLCA4fX0gPSByZWFkKFAyMywgYnl0ZSksCisgIHtQMjUsIG9rfSA9IHJlYWQoUDI0LCBmaWVsZF9lbmQpLAorICB7UDI2LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUH19ID0gcmVhZChQMjUsIGZpZWxkX2JlZ2luKSwKKyAge1AyNywgb2t9ID0gcmVhZChQMjYsIHN0cnVjdF9lbmQpLAorICB7UDI4LCBva30gPSByZWFkKFAyNywgbWVzc2FnZV9lbmQpLAorICB7UDI4LCBva30uCisKK2Jvb2xfZmllbGRfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMX0pLAorICB7UDQsIG9rfSA9IHdyaXRlKFAzLCB7Ym9vbCwgdHJ1ZX0pLAorICB7UDUsIG9rfSA9IHdyaXRlKFA0LCBmaWVsZF9lbmQpLAorICB7UDYsIG9rfSA9IHdyaXRlKFA1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQyIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDE0fSksCisgIHtQNywgb2t9ID0gd3JpdGUoUDYsIHtib29sLCBmYWxzZX0pLAorICB7UDgsIG9rfSA9IHdyaXRlKFA3LCBmaWVsZF9lbmQpLAorICB7UDksIG9rfSA9IHdyaXRlKFA4LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQzIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDQyfSksCisgIHtQMTAsIG9rfSA9IHdyaXRlKFA5LCB7Ym9vbCwgdHJ1ZX0pLAorICB7UDExLCBva30gPSB3cml0ZShQMTAsIGZpZWxkX2VuZCksCisgIHtQMTIsIG9rfSA9IHdyaXRlKFAxMSwgZmllbGRfc3RvcCksCisgIHtQMTMsIG9rfSA9IHdyaXRlKFAxMiwgc3RydWN0X2VuZCksCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgbWVzc2FnZV9lbmQpLAorCisgIHtQMTUsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfX0gPSByZWFkKFAxNCwgbWVzc2FnZV9iZWdpbiksCisgIHtQMTYsIG9rfSA9IHJlYWQoUDE1LCBzdHJ1Y3RfYmVnaW4pLAorICB7UDE3LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxIH19ID0gcmVhZChQMTYsIGZpZWxkX2JlZ2luKSwKKyAge1AxOCwge29rLCB0cnVlfX0gPSByZWFkKFAxNywgYm9vbCksCisgIHtQMTksIG9rfSA9IHJlYWQoUDE4LCBmaWVsZF9lbmQpLAorICB7UDIwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxNCB9fSA9IHJlYWQoUDE5LCBmaWVsZF9iZWdpbiksCisgIHtQMjEsIHtvaywgZmFsc2V9fSA9IHJlYWQoUDIwLCBib29sKSwKKyAge1AyMiwgb2t9ID0gcmVhZChQMjEsIGZpZWxkX2VuZCksCisgIHtQMjMsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDQyIH19ID0gcmVhZChQMjIsIGZpZWxkX2JlZ2luKSwKKyAge1AyNCwge29rLCB0cnVlfX0gPSByZWFkKFAyMywgYm9vbCksCisgIHtQMjUsIG9rfSA9IHJlYWQoUDI0LCBmaWVsZF9lbmQpLAorICB7UDI2LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUH19ID0gcmVhZChQMjUsIGZpZWxkX2JlZ2luKSwKKyAge1AyNywgb2t9ID0gcmVhZChQMjYsIHN0cnVjdF9lbmQpLAorICB7UDI4LCBva30gPSByZWFkKFAyNywgbWVzc2FnZV9lbmQpLAorICB7UDI4LCBva30uCisKK25lc3RpbmdfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMTR9KSwKKyAge1A0LCBva30gPSB3cml0ZShQMywge2Jvb2wsIHRydWV9KSwKKyAge1A1LCBva30gPSB3cml0ZShQNCwgZmllbGRfZW5kKSwKKworICB7UDYsIG9rfSA9IHdyaXRlKFA1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQyIiwgdHlwZSA9ID90VHlwZV9TVFJVQ1QsIGlkID0gMjh9KSwKKyAge1A3LCBva30gPSB3cml0ZShQNiwgI3Byb3RvY29sX3N0cnVjdF9iZWdpbnt9KSwKKyAge1A4LCBva30gPSB3cml0ZShQNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMl8xIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDMwMDAwfSksCisgIHtQOSwgb2t9ID0gd3JpdGUoUDgsIHtib29sLCBmYWxzZX0pLAorICB7UDEwLCBva30gPSB3cml0ZShQOSwgZmllbGRfZW5kKSwKKyAge1AxMSwgb2t9ID0gd3JpdGUoUDEwLCBmaWVsZF9zdG9wKSwKKyAge1AxMiwgb2t9ID0gd3JpdGUoUDExLCBzdHJ1Y3RfZW5kKSwKKyAge1AxMywgb2t9ID0gd3JpdGUoUDEyLCBmaWVsZF9lbmQpLAorCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMyIsIHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSA0Mn0pLAorICB7UDE1LCBva30gPSB3cml0ZShQMTQsIHtib29sLCB0cnVlfSksCisgIHtQMTYsIG9rfSA9IHdyaXRlKFAxNSwgZmllbGRfZW5kKSwKKyAge1AxNywgb2t9ID0gd3JpdGUoUDE2LCBmaWVsZF9zdG9wKSwKKyAge1AxOCwgb2t9ID0gd3JpdGUoUDE3LCBzdHJ1Y3RfZW5kKSwKKyAge1AxOSwgb2t9ID0gd3JpdGUoUDE4LCBtZXNzYWdlX2VuZCksCisKKyAge1AyMCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57IG5hbWUgPSAiTWVzc2FnZTEiLCB0eXBlID0gP3RUeXBlX0k4LCBzZXFpZCA9IDN9fSA9IHJlYWQoUDE5LCBtZXNzYWdlX2JlZ2luKSwKKyAge1AyMSwgb2t9ID0gcmVhZChQMjAsIHN0cnVjdF9iZWdpbiksCisgIHtQMjIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDE0IH19ID0gcmVhZChQMjEsIGZpZWxkX2JlZ2luKSwKKyAge1AyMywge29rLCB0cnVlfX0gPSByZWFkKFAyMiwgYm9vbCksCisgIHtQMjQsIG9rfSA9IHJlYWQoUDIzLCBmaWVsZF9lbmQpLAorCisgIHtQMjUsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9TVFJVQ1QsIGlkID0gMjggfX0gPSByZWFkKFAyNCwgZmllbGRfYmVnaW4pLAorICB7UDI2LCBva30gPSByZWFkKFAyNSwgc3RydWN0X2JlZ2luKSwKKyAge1AyNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMzAwMDAgfX0gPSByZWFkKFAyNiwgZmllbGRfYmVnaW4pLAorICB7UDI4LCB7b2ssIGZhbHNlfX0gPSByZWFkKFAyNywgYm9vbCksCisgIHtQMjksIG9rfSA9IHJlYWQoUDI4LCBmaWVsZF9lbmQpLAorICB7UDMwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUCB9fSA9IHJlYWQoUDI5LCBmaWVsZF9iZWdpbiksCisgIHtQMzEsIG9rfSA9IHJlYWQoUDMwLCBzdHJ1Y3RfZW5kKSwKKyAge1AzMiwgb2t9ID0gcmVhZChQMzEsIGZpZWxkX2VuZCksCisKKyAge1AzMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gNDIgfX0gPSByZWFkKFAzMiwgZmllbGRfYmVnaW4pLAorICB7UDM0LCB7b2ssIHRydWV9fSA9IHJlYWQoUDMzLCBib29sKSwKKyAge1AzNSwgb2t9ID0gcmVhZChQMzQsIGZpZWxkX2VuZCksCisgIHtQMzYsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9TVE9QIH19ID0gcmVhZChQMzUsIGZpZWxkX2JlZ2luKSwKKyAge1AzNywgb2t9ID0gcmVhZChQMzYsIHN0cnVjdF9lbmQpLAorICB7UDM4LCBva30gPSByZWFkKFAzNywgbWVzc2FnZV9lbmQpLAorICB7UDM4LCBva30uCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTVjMWQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDIxMyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfZmlsZV90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldyhGaWxlKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6bmV3KEZpbGUpLgorbmV3KEZpbGUsIE9wdHMpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDpuZXcoRmlsZSwgT3B0cykuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfX19LAorICAgICAgbmV3KGFfZmFrZV9maWxlKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gcmVhZCBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHJlYWR9fX0sCisgICAgICBuZXcoYV9mYWtlX2ZpbGUsIFt7bW9kZSwgcmVhZH1dKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3ttb2RlLCB3cml0ZX1dKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gc2hvdWxkX2Nsb3NlIHRydWUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3tzaG91bGRfY2xvc2UsIHRydWV9XSkKKyAgICApfSwKKyAgICB7Im5ldyBmaWxlIGluIHNob3VsZF9jbG9zZSBmYWxzZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIGZhbHNlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3tzaG91bGRfY2xvc2UsIGZhbHNlfV0pCisgICAgKX0KKyAgXS4KKworCityZWFkKEZpbGUsIEJ5dGVzKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6cmVhZChGaWxlLCBCeXRlcykuCisKK3JlYWRfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgcmVhZCwgZnVuKEJpbiwgTikgLT4KKyAgICAgICAge1Jlc3VsdCwgX30gPSBzcGxpdF9iaW5hcnkoQmluLCBtaW4oaW9saXN0X3NpemUoQmluKSwgTikpLAorICAgICAgICB7b2ssIFJlc3VsdH0KKyAgICAgIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDw+PiwgdHJ1ZSwgcmVhZH0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBlbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDY1NTM2KQorICAgICAgKX0sCisgICAgICB7InJlYWQgMCBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHdyaXRlX21vZGV9fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PD4+LCB0cnVlLCB3cml0ZX0sIDEpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCityZWFkX2V4YWN0KEZpbGUsIEJ5dGVzKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6cmVhZF9leGFjdChGaWxlLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgcmVhZCwgZnVuKEJpbiwgTikgLT4KKyAgICAgICAge1Jlc3VsdCwgX30gPSBzcGxpdF9iaW5hcnkoQmluLCBtaW4oaW9saXN0X3NpemUoQmluKSwgTikpLAorICAgICAgICB7b2ssIFJlc3VsdH0KKyAgICAgIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PD4+LCB0cnVlLCByZWFkfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgZXhhY3RseSBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCA2NTUzNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMCBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMSkKKyAgICAgICl9CisgICAgXQorICB9LgorCisKK3dyaXRlKEZpbGUsIERhdGEpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDp3cml0ZShGaWxlLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgd3JpdGUsIGZ1bihfLCBfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCBbXSkKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBlbXB0eSBiaW5hcnkgdG8gZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCBva30sCisgICAgICAgIHdyaXRlKHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIDw8Pj4pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgYSBsaXN0IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCAiaGFsbG8gd29ybGQiKQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgYmluYXJ5IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBmaWxlIGluIHJlYWQgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHJlYWRfbW9kZX19LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgcmVhZH0sIDw8ImhhbGxvIHdvcmxkIj4+KQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgbGlzdCB0byBmaWxlIGluIHJlYWQgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHJlYWRfbW9kZX19LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgcmVhZH0sICJoYWxsbyB3b3JsZCIpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLgorCitmbHVzaF90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZmlsZSwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChmaWxlLCBzeW5jLCBmdW4oX0ZpbGUpIC0+IG9rIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7ImZsdXNoIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICBmbHVzaCh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9KQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKworY2xvc2UoVHJhbnNwb3J0KSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgY2xvc2UsIGZ1bihfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJjbG9zZSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIG9rfSwKKyAgICAgICAgY2xvc2Uoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSkKKyAgICAgICl9CisgICAgXQorICB9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTUzOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsNDA0IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0KS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworCituZXcoVHJhbnNwb3J0KSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KS4KKworbmV3X3Rlc3RfKCkgLT4KKyAgWworICAgIHsibmV3IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7dF90cmFuc3BvcnQsIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0LCB7dF9mcmFtZWQsCisgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgW119fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9fX0sCisgICAgICBuZXcoe3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCBbXX19KQorICAgICl9CisgIF0uCisKKworcmVhZChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OnJlYWQoRnJhbWUsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGFuIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICByZWFkKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8Pj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBidWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgPDwiYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PD4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaGFsbG8gd29ybGQiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6cmVhZF9leGFjdChGcmFtZSwgQnl0ZXMpLgorCityZWFkX2V4YWN0X3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBhbiBlbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8Pj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gYW4gZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgPDw+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8Pj59CisgICAgICB9LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSAxIGJ5dGUgZnJvbSBub25lbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbW10sPDwiaGFsbG8gd29ybGQiPj5dLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtlcnJvciwgZW9mfQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICA2NTUzNgorICAgICAgKQorICAgICl9CisgIF0uCisKKword3JpdGUoRnJhbWVkLCBEYXRhKSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDp3cml0ZShGcmFtZWQsIERhdGEpLgorCit3cml0ZV90ZXN0XygpIC0+CisgIFsKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbW10sIFtdXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgW10KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbWyJoYWxsbyB3b3JsZCJdLCBbXV0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFsiaGFsbG8gd29ybGQiXQorICAgICAgICB9LAorICAgICAgICBbXQorICAgICAgKQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1tdLCA8PD4+XQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgPDw+PgorICAgICAgKQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1siaGFsbG8gd29ybGQiXSwgPDw+Pl0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFsiaGFsbG8gd29ybGQiXQorICAgICAgICB9LAorICAgICAgICA8PD4+CisgICAgICApCisgICAgKX0KKyAgXS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgZmx1c2goe3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9KQorICAgICl9LAorICAgIHsiZmx1c2ggbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIFs8PD4+LCBbPDwwLCAwLCAwLCAxMT4+LCA8PCJoYWxsbyB3b3JsZCI+Pl1dCisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICBmbHVzaCh7dF9mcmFtZWQsCisgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICBbXSwKKyAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4KKyAgICAgIH0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCisKK2Nsb3NlX3Rlc3RfKCkgLT4KKyAgeyJjbG9zZSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICB7e3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9LAorICAgICAgb2sKKyAgICB9LAorICAgIGNsb3NlKHt0X2ZyYW1lZCwKKyAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgW10sCisgICAgICBbXQorICAgIH0pCisgICl9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4OWM3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDE2NyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKworbmV3KCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCkuCituZXcoRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KERhdGEpLgorCituZXdfdGVzdF8oKSAtPgorICBbCisgICAgeyJuZXcgZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIF8sIHt0X21lbWJ1ZmZlciwgW119fX0sCisgICAgICBuZXcoKQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIDw8Pj4iLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCBbPDw+Pl19fX0sCisgICAgICBuZXcoPDw+PikKKyAgICApfSwKKyAgICB7Im5ldyBtZW1idWZmZXIgd2l0aCBbXSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCBfLCB7dF9tZW1idWZmZXIsIFtdfX19LAorICAgICAgbmV3KFtdKQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIDw8XCJoYWxsbyB3b3JsZFwiPj4iLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfX19LAorICAgICAgbmV3KDw8ImhhbGxvIHdvcmxkIj4+KQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIFwiaGFsbG8gd29ybGRcIiIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCBfLCB7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9fX0sCisgICAgICBuZXcoImhhbGxvIHdvcmxkIikKKyAgICApfQorICBdLgorCisKK3JlYWQoTWVtYnVmZmVyLCBCeXRlcykgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6cmVhZChNZW1idWZmZXIsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICByZWFkKHt0X21lbWJ1ZmZlciwgW119LCAwKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBhbiBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtdfSwgMSkKKyAgICApfSwKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAwKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAxKQorICAgICl9LAorICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDw+Pn0sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgIHJlYWQoe3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgNjU1MzYpCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KE1lbWJ1ZmZlciwgQnl0ZXMpIC0+CisgIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OnJlYWRfZXhhY3QoTWVtYnVmZmVyLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICByZWFkX2V4YWN0KHt0X21lbWJ1ZmZlciwgW119LCAwKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3Qoe3RfbWVtYnVmZmVyLCBbXX0sIDEpCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAwKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fSwge29rLCA8PCJoIj4+fX0sCisgICAgICByZWFkX2V4YWN0KHt0X21lbWJ1ZmZlciwgW1siaGFsbG8iLCAiICJdLCAid29ybGQiXX0sIDEpCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCB7ZXJyb3IsIGVvZn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCA2NTUzNikKKyAgICApfQorICBdLgorCisKK3dyaXRlKE1lbWJ1ZmZlciwgRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6d3JpdGUoTWVtYnVmZmVyLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICBbCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sIFtdXX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCBbXSkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gbm9uZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFsiaGFsbG8gd29ybGQiLCBbXV19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9LCBbXSkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW1tdLCA8PD4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCA8PD4+KQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbImhhbGxvIHdvcmxkIiwgPDw+Pl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9LCA8PD4+KQorICAgICl9LAorICAgIHsid3JpdGUgYSBsaXN0IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sICJoYWxsbyB3b3JsZCJdfSwgb2t9LAorICAgICAgd3JpdGUoe3RfbWVtYnVmZmVyLCBbXX0sICJoYWxsbyB3b3JsZCIpCisgICAgKX0sCisgICAgeyJ3cml0ZSBhIGxpc3QgdG8gbm9uZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsIFsiaGFsbG8iLCAiICJdfSwgIndvcmxkIikKKyAgICApfSwKKyAgICB7IndyaXRlIGEgYmluYXJ5IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sIDw8ImhhbGxvIHdvcmxkIj4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICApfSwKKyAgICB7IndyaXRlIGEgYmluYXJ5IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sIDw8IndvcmxkIj4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgWyJoYWxsbyIsICIgIl19LCA8PCJ3b3JsZCI+PikKKyAgICApfQorICBdLgorCisKK2ZsdXNoKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6Zmx1c2goVHJhbnNwb3J0KS4KKworZmx1c2hfdGVzdF8oKSAtPgorICBbCisgICAgeyJmbHVzaCBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW119LCBva30sCisgICAgICBmbHVzaCh7dF9tZW1idWZmZXIsIFtdfSkKKyAgICApfSwKKyAgICB7ImZsdXNoIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfSwgb2t9LAorICAgICAgZmx1c2goe3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfSkKKyAgICApfQorICBdLgorCisKK2Nsb3NlKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7ImNsb3NlIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAge3t0X21lbWJ1ZmZlciwgX30sIG9rfSwKKyAgICBjbG9zZSh7dF9tZW1idWZmZXIsIFtdfSkKKyAgKX0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X3NlcnZlci5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfc2VydmVyLmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0M2I3Mi4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfc2VydmVyLmVybAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZSh0ZXN0X3RocmlmdF9zZXJ2ZXIpLgotCi0tZXhwb3J0KFtnby8wLCBnby8xLCBzdGFydF9saW5rLzIsIGhhbmRsZV9mdW5jdGlvbi8yXSkuCi0KLS1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF90ZXN0X3R5cGVzLmhybCIpLgotCi0tcmVjb3JkKG9wdGlvbnMsIHtwb3J0ID0gOTA5MCwKLSAgICAgICAgICAgICAgICAgIHNlcnZlcl9vcHRzID0gW119KS4KLQotcGFyc2VfYXJncyhBcmdzKSAtPiBwYXJzZV9hcmdzKEFyZ3MsICNvcHRpb25ze30pLgotcGFyc2VfYXJncyhbXSwgT3B0cykgLT4gT3B0czsKLXBhcnNlX2FyZ3MoW0hlYWQgfCBSZXN0XSwgT3B0cykgLT4KLSAgICBOZXdPcHRzID0KLSAgICAgICAgY2FzZSBjYXRjaCBsaXN0X3RvX2ludGVnZXIoSGVhZCkgb2YKLSAgICAgICAgICAgIFBvcnQgd2hlbiBpc19pbnRlZ2VyKFBvcnQpIC0+Ci0gICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3BvcnQgPSBQb3J0fTsKLSAgICAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICAgICAgY2FzZSBIZWFkIG9mCi0gICAgICAgICAgICAgICAgICAgICJmcmFtZWQiIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7c2VydmVyX29wdHMgPSBbe2ZyYW1lZCwgdHJ1ZX0gfCBPcHRzI29wdGlvbnMuc2VydmVyX29wdHNdfTsKLSAgICAgICAgICAgICAgICAgICAgIiIgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIE9wdHM7Ci0gICAgICAgICAgICAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQotICAgICAgICAgICAgICAgIGVuZAotICAgICAgICBlbmQsCi0gICAgcGFyc2VfYXJncyhSZXN0LCBOZXdPcHRzKS4KLQotZ28oKSAtPiBnbyhbXSkuCi1nbyhBcmdzKSAtPgotICAgICNvcHRpb25ze3BvcnQgPSBQb3J0LCBzZXJ2ZXJfb3B0cyA9IFNlcnZlck9wdHN9ID0gcGFyc2VfYXJncyhBcmdzKSwKLSAgICBzcGF3bihmdW4oKSAtPiBzdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpLCByZWNlaXZlIGFmdGVyIGluZmluaXR5IC0+IG9rIGVuZCBlbmQpLgotCi1zdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpIC0+Ci0gICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RhcnQoW3toYW5kbGVyLCA/TU9EVUxFfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlcnZpY2UsIHRocmlmdF90ZXN0X3RocmlmdH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwb3J0LCBQb3J0fV0gKysKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJPcHRzKS4KLQotCi1oYW5kbGVfZnVuY3Rpb24odGVzdFZvaWQsIHt9KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdFZvaWR+biIpLAotICAgIG9rOwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdFN0cmluZywge1N9KSB3aGVuIGlzX2JpbmFyeShTKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdFN0cmluZzogfnB+biIsIFtTXSksCi0gICAge3JlcGx5LCBTfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RCeXRlLCB7STh9KSB3aGVuIGlzX2ludGVnZXIoSTgpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0Qnl0ZTogfnB+biIsIFtJOF0pLAotICAgIHtyZXBseSwgSTh9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdEkzMiwge0kzMn0pIHdoZW4gaXNfaW50ZWdlcihJMzIpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0STMyOiB+cH5uIiwgW0kzMl0pLAotICAgIHtyZXBseSwgSTMyfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RJNjQsIHtJNjR9KSB3aGVuIGlzX2ludGVnZXIoSTY0KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdEk2NDogfnB+biIsIFtJNjRdKSwKLSAgICB7cmVwbHksIEk2NH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0RG91YmxlLCB7RG91YmxlfSkgd2hlbiBpc19mbG9hdChEb3VibGUpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0RG91YmxlOiB+cH5uIiwgW0RvdWJsZV0pLAotICAgIHtyZXBseSwgRG91YmxlfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RCaW5hcnksIHtTfSkgd2hlbiBpc19iaW5hcnkoUykgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RCaW5hcnk6IH5wfm4iLCBbU10pLAotICAgIHtyZXBseSwgU307Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0U3RydWN0LAotICAgICAgICAgICAgICAgIHtTdHJ1Y3QgPSAjJ1h0cnVjdCd7c3RyaW5nX3RoaW5nID0gU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IEJ5dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSBJMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSBJNjR9fSkKLXdoZW4gaXNfYmluYXJ5KFN0cmluZyksCi0gICAgIGlzX2ludGVnZXIoQnl0ZSksCi0gICAgIGlzX2ludGVnZXIoSTMyKSwKLSAgICAgaXNfaW50ZWdlcihJNjQpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0U3RydWN0OiB+cH5uIiwgW1N0cnVjdF0pLAotICAgIHtyZXBseSwgU3RydWN0fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3ROZXN0LAotICAgICAgICAgICAgICAgIHtOZXN0fSkgd2hlbiBpc19yZWNvcmQoTmVzdCwgJ1h0cnVjdDInKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVjb3JkKE5lc3QjJ1h0cnVjdDInLnN0cnVjdF90aGluZywgJ1h0cnVjdCcpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0TmVzdDogfnB+biIsIFtOZXN0XSksCi0gICAge3JlcGx5LCBOZXN0fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RNYXAsIHtNYXB9KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdE1hcDogfnB+biIsIFtkaWN0OnRvX2xpc3QoTWFwKV0pLAotICAgIHtyZXBseSwgTWFwfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RTZXQsIHtTZXR9KSAtPgotICAgIHRydWUgPSBzZXRzOmlzX3NldChTZXQpLAotICAgIGlvOmZvcm1hdCgidGVzdFNldDogfnB+biIsIFtzZXRzOnRvX2xpc3QoU2V0KV0pLAotICAgIHtyZXBseSwgU2V0fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RMaXN0LCB7TGlzdH0pIHdoZW4gaXNfbGlzdChMaXN0KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdExpc3Q6IH5wfm4iLCBbTGlzdF0pLAotICAgIHtyZXBseSwgTGlzdH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0RW51bSwge0VudW19KSB3aGVuIGlzX2ludGVnZXIoRW51bSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RFbnVtOiB+cH5uIiwgW0VudW1dKSwKLSAgICB7cmVwbHksIEVudW19OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdFR5cGVkZWYsIHtVc2VySUR9KSB3aGVuIGlzX2ludGVnZXIoVXNlcklEKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdFR5cGVkZWY6IH5wfm4iLCBbVXNlcklEXSksCi0gICAge3JlcGx5LCBVc2VySUR9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdE1hcE1hcCwge0hlbGxvfSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RNYXBNYXA6IH5wfm4iLCBbSGVsbG9dKSwKLQotICAgIFBvc0xpc3QgPSBbe0ksIEl9ICAgfHwgSSA8LSBsaXN0czpzZXEoMSwgNSldLAotICAgIE5lZ0xpc3QgPSBbey1JLCAtSX0gfHwgSSA8LSBsaXN0czpzZXEoMSwgNSldLAotCi0gICAgTWFwTWFwID0gZGljdDpmcm9tX2xpc3QoW3s0LCAgZGljdDpmcm9tX2xpc3QoUG9zTGlzdCl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTQsIGRpY3Q6ZnJvbV9saXN0KE5lZ0xpc3QpfV0pLAotICAgIHtyZXBseSwgTWFwTWFwfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RJbnNhbml0eSwge0luc2FuaXR5fSkgd2hlbiBpc19yZWNvcmQoSW5zYW5pdHksICdJbnNhbml0eScpIC0+Ci0gICAgSGVsbG8gPSAjJ1h0cnVjdCd7c3RyaW5nX3RoaW5nID0gPDwiSGVsbG8yIj4+LAotICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gMiwKLSAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gMiwKLSAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gMn0sCi0KLSAgICBHb29kYnllID0gIydYdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8Ikdvb2RieWU0Ij4+LAotICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSA0LAotICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IDQsCi0gICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gNH0sCi0gICAgQ3JhenkgPSAjJ0luc2FuaXR5J3sKLSAgICAgIHVzZXJNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX0VJR0hULCA4fV0pLAotICAgICAgeHRydWN0cyA9IFtHb29kYnllXQotICAgICAgfSwKLQotICAgIExvb25leSA9ICMnSW5zYW5pdHknewotICAgICAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P1RIUklGVF9URVNUX05VTUJFUlpfRklWRSwgNX1dKSwKLSAgICAgIHh0cnVjdHMgPSBbSGVsbG9dCi0gICAgICB9LAotCi0gICAgRmlyc3RNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX1RXTywgQ3Jhenl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs/VEhSSUZUX1RFU1RfTlVNQkVSWl9USFJFRSwgQ3Jhenl9XSksCi0KLSAgICBTZWNvbmRNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX1NJWCwgTG9vbmV5fV0pLAotCi0gICAgSW5zYW5lID0gZGljdDpmcm9tX2xpc3QoW3sxLCBGaXJzdE1hcH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLCBTZWNvbmRNYXB9XSksCi0KLSAgICBpbzpmb3JtYXQoIlJldHVybiA9IH5wfm4iLCBbSW5zYW5lXSksCi0KLSAgICB7cmVwbHksIEluc2FuZX07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TXVsdGksIEFyZ3MgPSB7QXJnMCwgQXJnMSwgQXJnMiwgX0FyZzMsIEFyZzQsIEFyZzV9KQotICB3aGVuIGlzX2ludGVnZXIoQXJnMCksCi0gICAgICAgaXNfaW50ZWdlcihBcmcxKSwKLSAgICAgICBpc19pbnRlZ2VyKEFyZzIpLAotICAgICAgIGlzX2ludGVnZXIoQXJnNCksCi0gICAgICAgaXNfaW50ZWdlcihBcmc1KSAtPgotCi0gICAgaW86Zm9ybWF0KCJ0ZXN0TXVsdGkofnApfm4iLCBbQXJnc10pLAotICAgIHtyZXBseSwgIydYdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8IkhlbGxvMiI+PiwKLSAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IEFyZzAsCi0gICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IEFyZzEsCi0gICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IEFyZzJ9fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RFeGNlcHRpb24sIHtTdHJpbmd9KSB3aGVuIGlzX2JpbmFyeShTdHJpbmcpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0RXhjZXB0aW9uKH5wKX5uIiwgW1N0cmluZ10pLAotICAgIGNhc2UgU3RyaW5nIG9mCi0gICAgICAgIDw8IlhjZXB0aW9uIj4+IC0+Ci0gICAgICAgICAgICB0aHJvdygjJ1hjZXB0aW9uJ3tlcnJvckNvZGUgPSAxMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBTdHJpbmd9KTsKLSAgICAgICAgXyAtPgotICAgICAgICAgICAgb2sKLSAgICBlbmQ7Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TXVsdGlFeGNlcHRpb24sIHtBcmcwLCBBcmcxfSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RNdWx0aUV4Y2VwdGlvbih+cCwgfnApfm4iLCBbQXJnMCwgQXJnMV0pLAotICAgIGNhc2UgQXJnMCBvZgotICAgICAgICA8PCJYY2VwdGlvbiI+PiAtPgotICAgICAgICAgICAgdGhyb3coIydYY2VwdGlvbid7ZXJyb3JDb2RlID0gMTAwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24iPj59KTsKLSAgICAgICAgPDwiWGNlcHRpb24yIj4+IC0+Ci0gICAgICAgICAgICB0aHJvdygjJ1hjZXB0aW9uMid7ZXJyb3JDb2RlID0gMjAwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ1h0cnVjdCd7c3RyaW5nX3RoaW5nID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbjIiPj59fSk7Ci0gICAgICAgIF8gLT4KLSAgICAgICAgICAgIHtyZXBseSwgIydYdHJ1Y3Qne3N0cmluZ190aGluZyA9IEFyZzF9fQotICAgIGVuZDsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RPbmV3YXksIHtTZWNvbmRzfSkgLT4KLSAgICB0aW1lcjpzbGVlcCgxMDAwICogU2Vjb25kcyksCi0gICAgb2suCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjMGYyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDE5OSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfc29ja2V0X3RyYW5zcG9ydCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKworbmV3KFNvY2tldCkgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCkuCituZXcoU29ja2V0LCBPcHRzKSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29ja2V0LCBPcHRzKS4KKworbmV3X3Rlc3RfKCkgLT4KKyAgWworICAgIHsibmV3IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydCwge3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119fX0sCisgICAgICBuZXcoYV9mYWtlX3NvY2tldCkKKyAgICApfSwKKyAgICB7Im5ldyBzb2NrZXQgd2l0aCBubyBvcHRpb25zIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0LCB7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX19fSwKKyAgICAgIG5ldyhhX2Zha2Vfc29ja2V0LCBbXSkKKyAgICApfSwKKyAgICB7Im5ldyBzb2NrZXQgd2l0aCBpbnRlZ2VyIHRpbWVvdXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsIHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNTAwMCwgW119fX0sCisgICAgICBuZXcoYV9mYWtlX3NvY2tldCwgW3tyZWN2X3RpbWVvdXQsIDUwMDB9XSkKKyAgICApfSwKKyAgICB7Im5ldyBzb2NrZXQgd2l0aCBpbmZpbml0eSB0aW1lb3V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0LCB7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIGluZmluaXR5LCBbXX19fSwKKyAgICAgIG5ldyhhX2Zha2Vfc29ja2V0LCBbe3JlY3ZfdGltZW91dCwgaW5maW5pdHl9XSkKKyAgICApfQorICBdLgorCisKK3JlYWQoU29ja2V0LCBCeXRlcykgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6cmVhZChTb2NrZXQsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZ2VuX3RjcCwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChnZW5fdGNwLCByZWN2LCBmdW4oQmluLCAwLCBfKSAtPiB7b2ssIEJpbn0gZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZ2VuX3RjcCkgZW5kLAorICAgIFsKKyAgICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDw+PiwgNjAwMDAsIFtdfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8Pj4sIDYwMDAwLCBbXX0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgX30sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PCJhbGxvIHdvcmxkIj4+fSwge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8Pj59LCB7b2ssIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgNjU1MzYpCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8ImFsbG8iPj59LCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8IiB3b3JsZCI+PiwgNjAwMDAsIDw8ImhhbGxvIj4+fSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDYgYnl0ZSBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDwid29ybGQiPj59LCB7b2ssIDw8ImhhbGxvICI+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiIHdvcmxkIj4+LCA2MDAwMCwgPDwiaGFsbG8iPj59LCA2KQorICAgICAgKX0sCisgICAgICB7InJlYWQgYSB6aWxsaW9uIGJ5dGVzIGZyb20gcHJldmlvdXNseSBidWZmZXJlZCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PD4+fSwge29rLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiIHdvcmxkIj4+LCA2MDAwMCwgPDwiaGFsbG8iPj59LCA2NTUzNikKKyAgICAgICl9CisgICAgXQorICB9LgorCisKK3JlYWRfZXhhY3QoU29ja2V0LCBCeXRlcykgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6cmVhZF9leGFjdChTb2NrZXQsIEJ5dGVzKS4KKworcmVhZF9leGFjdF90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZ2VuX3RjcCwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChnZW5fdGNwLCByZWN2LCBmdW4oQmluLCBOLCBfKSAtPgorICAgICAgICBjYXNlIE4gb2YKKyAgICAgICAgICAwIC0+IHtvaywgQmlufTsKKyAgICAgICAgICAxIC0+IHtvaywgPDwiaCI+Pn07CisgICAgICAgICAgTiB3aGVuIE4gPiAyIC0+IHtlcnJvciwgdGltZW91dH0KKyAgICAgICAgZW5kCisgICAgICBlbmQpLAorICAgICAgbWVjazpleHBlY3QoZ2VuX3RjcCwgY2xvc2UsIGZ1bihfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChnZW5fdGNwKSBlbmQsCisgICAgWworICAgICAgeyJyZWFkX2V4YWN0IHplcm8gYnl0ZXMgZnJvbSBlbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PD4+LCA2MDAwMCwgW119LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWRfZXhhY3QgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIF99LCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8ImhhbGxvIHdvcmxkIj4+LCA2MDAwMCwgW119LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWRfZXhhY3QgMSBieXRlIGZyb20gbm9uZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgW119LCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8ImhhbGxvIHdvcmxkIj4+LCA2MDAwMCwgW119LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWRfZXhhY3QgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgW119LCB7ZXJyb3IsIHRpbWVvdXR9fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8ImhhbGxvIHdvcmxkIj4+LCA2MDAwMCwgW119LCA2NTUzNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IDEgYnl0ZSBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDwiYWxsbyI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDwiIHdvcmxkIj4+LCA2MDAwMCwgPDwiaGFsbG8iPj59LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWRfZXhhY3QgNiBieXRlIGZyb20gcHJldmlvdXNseSBidWZmZXJlZCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCBbXX0sIHtvaywgPDwibW9yZSBoIj4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCJoYWxsbyI+PiwgNjAwMDAsIDw8Im1vcmUgIj4+fSwgNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IGEgemlsbGlvbiBieXRlcyBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDwiaGFsbG8iPj59LCB7ZXJyb3IsIHRpbWVvdXR9fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8IiB3b3JsZCI+PiwgNjAwMDAsIDw8ImhhbGxvIj4+fSwgNjU1MzYpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCit3cml0ZShTb2NrZXQsIERhdGEpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0OndyaXRlKFNvY2tldCwgRGF0YSkuCisKK3dyaXRlX3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhnZW5fdGNwLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGdlbl90Y3AsIHNlbmQsIGZ1bihfLCBfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChnZW5fdGNwKSBlbmQsCisgICAgWworICAgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBbXSkKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBlbXB0eSBiaW5hcnkgdG8gc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIDw8Pj4pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgYSBsaXN0IHRvIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCAiaGFsbG8gd29ybGQiKQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgYmluYXJ5IHRvIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICAgICl9CisgICAgXQorICB9LgorCisKK2ZsdXNoKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6Zmx1c2goVHJhbnNwb3J0KS4KKworZmx1c2hfdGVzdF8oKSAtPgorICBbCisgICAgeyJmbHVzaCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgb2t9LAorICAgICAgZmx1c2goe3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119KQorICAgICl9CisgIF0uCisKKworY2xvc2UoVHJhbnNwb3J0KSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpjbG9zZShUcmFuc3BvcnQpLgorCitjbG9zZV90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZ2VuX3RjcCwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChnZW5fdGNwLCBjbG9zZSwgZnVuKF8pIC0+IG9rIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGdlbl90Y3ApIGVuZCwKKyAgICBbCisgICAgICB7ImNsb3NlIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgICAgY2xvc2Uoe3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119KQorICAgICAgKX0KKyAgICBdCisgIH0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3RocmlmdF9zb2NrZXRfc2VydmVyX3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L3RocmlmdF9zb2NrZXRfc2VydmVyX3Rlc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MThiODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfdGVzdC5lcmwKQEAgLTAsMCArMSw0OSBAQAorLW1vZHVsZSAodGhyaWZ0X3NvY2tldF9zZXJ2ZXJfdGVzdCkuCisKKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUgKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgorCitwYXJzZV9oYW5kbGVyX29wdGlvbnNfdGVzdF8oKSAtPgorICAgIENvcnJlY3RTZXJ2aWNlSGFuZGxlck9wdGlvbkxpc3QgPSBbez9NVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgP01PRFVMRX0sIHsiU2VydmljZTEiLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsID9NT0RVTEV9XSwKKyAgICBNaXNzaW5nRXJyb3JIYW5kbGVyT3B0aW9uTGlzdCAgID0gW3siU2VydmljZTEiLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsID9NT0RVTEV9XSwKKyAgICBXcm9uZ1NlcnZpY2UySGFuZGxlck9wdGlvbkxpc3QgID0gW3s/TVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksID9NT0RVTEV9LCB7IlNlcnZpY2UxIiwgP01PRFVMRX0sIHsiU2VydmljZTIiLCAiTW9kdWxlIn1dLAorICAgIFdyb25nU2VydmljZUtleU9wdGlvbkxpc3QgICAgICAgPSBbez9NVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgP01PRFVMRX0sIHsnc2VydmljZTEnLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsID9NT0RVTEV9XSwKKyAgICBDb3JyZWN0SGFuZGxlclRlc3RGdW5jdGlvbiA9IGZ1bigpIC0+CisgICAgICAgID9hc3NlcnRNYXRjaCh7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXyxfLF8sXyxfLF8sXyxfLF8sXyxfLF8sX30sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBDb3JyZWN0U2VydmljZUhhbmRsZXJPcHRpb25MaXN0fV0pKSwKKyAgICAgICAge3RocmlmdF9zb2NrZXRfc2VydmVyLF8sXywgSGFuZGxlckxpc3QsXyxfLF8sXyxfLF8sXyxfLF8sX30gPSB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgQ29ycmVjdFNlcnZpY2VIYW5kbGVyT3B0aW9uTGlzdH1dKSwKKyAgICAgICAgbGlzdHM6Zm9yZWFjaChmdW4KKyAgICAgICAgICAgICh7U2VydmljZU5hbWUsIEhhbmRsZXJNb2R1bGV9KSAtPgorICAgICAgICAgICAgICAgID9hc3NlcnRNYXRjaCh7b2ssIEhhbmRsZXJNb2R1bGV9IHdoZW4gaXNfYXRvbShIYW5kbGVyTW9kdWxlKSwgdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOmZpbmQoU2VydmljZU5hbWUsIEhhbmRsZXJMaXN0KSkKKyAgICAgICAgZW5kLCBDb3JyZWN0U2VydmljZUhhbmRsZXJPcHRpb25MaXN0KQorICAgIGVuZCwKKyAgICBbCisgICAgIHsiQmFkIGFyZ3VtZW50IGZvciB0aGUgaGFuZGxlciBvcHRpb24iLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBbXX1dKSl9LAorICAgICB7IlRyeSB0byBwYXJzZSB0aGUgaGFuZGxlciBvcHRpb24gdHdpY2UiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCA/TU9EVUxFfSwge2hhbmRsZXIsIENvcnJlY3RTZXJ2aWNlSGFuZGxlck9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJQYXJzZSB0aGUgaGFuZGxlciBvcHRpb24gYXMgYSBub24gbXVsdGlwbGV4ZWQgc2VydmljZSBoYW5kbGVyIiwgP19hc3NlcnRNYXRjaCh7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXyxfLD9NT0RVTEUsXyxfLF8sXyxfLF8sXyxfLF8sX30sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCA/TU9EVUxFfV0pKX0sCisgICAgIHsiTm8gZXJyb3IgaGFuZGxlciB3YXMgZGVmaW5lZCIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIE1pc3NpbmdFcnJvckhhbmRsZXJPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiQmFkIGhhbmRsZXIgbW9kdWxlIGZvciBTZXJ2aWNlMiIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIFdyb25nU2VydmljZTJIYW5kbGVyT3B0aW9uTGlzdH1dKSl9LAorICAgICB7IkJhZCBzZXJ2aWNlIGtleSBmb3IgU2VydmljZTEiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBXcm9uZ1NlcnZpY2VLZXlPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiVHJ5IHRvIHBhcnNlIGEgY29ycmVjdCBoYW5kbGVyIG9wdGlvbiBsaXN0IiwgQ29ycmVjdEhhbmRsZXJUZXN0RnVuY3Rpb259CisgICAgXS4KKworcGFyc2Vfc2VydmljZV9vcHRpb25zX3Rlc3RfKCkgLT4KKyAgICBDb3JyZWN0U2VydmljZU1vZHVsZU9wdGlvbkxpc3QgPSBbeyJTZXJ2aWNlMSIsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgP01PRFVMRX1dLAorICAgIFdyb25nU2VydmljZTJNb2R1bGVPcHRpb25MaXN0ICA9IFt7IlNlcnZpY2UxIiwgP01PRFVMRX0sIHsiU2VydmljZTIiLCAidGhyaWZ0X3NlcnZpY2VfbW9kdWxlIn1dLAorICAgIFdyb25nU2VydmljZUtleU9wdGlvbkxpc3QgICAgICAgPSBbeydzZXJ2aWNlMScsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgP01PRFVMRX1dLAorICAgIENvcnJlY3RTZXJ2aWNlTW9kdWxlVGVzdEZ1bmN0aW9uID0gZnVuKCkgLT4KKyAgICAgICAgP2Fzc2VydE1hdGNoKHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLF8sXyxfLF8sXyxfLF8sXyxfLF8sXyxffSwgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIENvcnJlY3RTZXJ2aWNlTW9kdWxlT3B0aW9uTGlzdH1dKSksCisgICAgICAgIHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLCBTZXJ2aWNlTW9kdWxlTGlzdCxfLF8sXyxfLF8sXyxfLF8sXyxfLF99ID0gdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIENvcnJlY3RTZXJ2aWNlTW9kdWxlT3B0aW9uTGlzdH1dKSwKKyAgICAgICAgbGlzdHM6Zm9yZWFjaChmdW4KKyAgICAgICAgICAgICh7U2VydmljZU5hbWUsIFNlcnZpY2VNb2R1bGV9KSAtPgorICAgICAgICAgICAgICAgID9hc3NlcnRNYXRjaCh7b2ssIFNlcnZpY2VNb2R1bGV9IHdoZW4gaXNfYXRvbShTZXJ2aWNlTW9kdWxlKSwgdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOmZpbmQoU2VydmljZU5hbWUsIFNlcnZpY2VNb2R1bGVMaXN0KSkKKyAgICAgICAgZW5kLCBDb3JyZWN0U2VydmljZU1vZHVsZU9wdGlvbkxpc3QpCisgICAgZW5kLAorICAgIFsKKyAgICAgeyJCYWQgYXJndW1lbnQgZm9yIHRoZSBzZXJ2aWNlIG9wdGlvbiIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFtdfV0pKX0sCisgICAgIHsiVHJ5IHRvIHBhcnNlIHRoZSBzZXJ2aWNlIG9wdGlvbiB0d2ljZSIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsID9NT0RVTEV9LCB7c2VydmljZSwgQ29ycmVjdFNlcnZpY2VNb2R1bGVPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiUGFyc2UgYSBzZXJ2aWNlIG1vZHVsZSBmb3IgYSBub24gbXVsdGlwbGV4ZWQgc2VydmljZSIsID9fYXNzZXJ0TWF0Y2goe3RocmlmdF9zb2NrZXRfc2VydmVyLF8sP01PRFVMRSxfLF8sXyxfLF8sXyxfLF8sXyxfLF99LCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgP01PRFVMRX1dKSl9LAorICAgICB7IkJhZCBzZXJ2aWNlIG1vZHVsZSBmb3IgU2VydmljZTIiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBXcm9uZ1NlcnZpY2UyTW9kdWxlT3B0aW9uTGlzdH1dKSl9LAorICAgICB7IkJhZCBzZXJ2aWNlIGtleSBmb3IgU2VydmljZTEiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBXcm9uZ1NlcnZpY2VLZXlPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiVHJ5IHRvIHBhcnNlIGEgY29ycmVjdCBzZXJ2aWNlIG9wdGlvbiBsaXN0IiwgQ29ycmVjdFNlcnZpY2VNb2R1bGVUZXN0RnVuY3Rpb259CisgICAgXS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90aHJpZnRfdGVzdF90ZXN0LmVybCBiL2xpYi9lcmwvdGVzdC90aHJpZnRfdGVzdF90ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2RmNjFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3RocmlmdF90ZXN0X3Rlc3QuZXJsCkBAIC0wLDAgKzEsNjQzIEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworJSBkb24ndCByZW5hbWUgdGhpcyB0aHJpZnRfdGVzdCwgaXQgY2xvYmJlcnMgZ2VuZXJhdGVkIGZpbGVzCistbW9kdWxlKHRocmlmdF90ZXN0X3Rlc3QpLgorLWNvbXBpbGUoZXhwb3J0X2FsbCkuCisKKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0X3Rlc3RfY29uc3RhbnRzLmhybCIpLgorCitjb25zdGFudF90ZXN0XygpIC0+CisgIFsKKyAgICB7Im15TnVtYmVyeiBlcXVhbHMgMSIsID9fYXNzZXJ0RXF1YWwoMSwgP1RIUklGVF9URVNUX01ZTlVNQkVSWil9CisgIF0uCisKK3JlY29yZF9nZW5lcmF0aW9uX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiQm9uayByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5Cb25rJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LkJvbmsne21lc3NhZ2U9bnVsbCx0eXBlPW51bGx9CisgICAgKX0sCisgICAgeyJCb29scyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5Cb29scycsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5Cb29scyd7aW1fdHJ1ZT1udWxsLGltX2ZhbHNlPW51bGx9CisgICAgKX0sCisgICAgeyJYdHJ1Y3QgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuWHRydWN0JywgXywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nPW51bGwsYnl0ZV90aGluZz1udWxsLGkzMl90aGluZz1udWxsLGk2NF90aGluZz1udWxsfQorICAgICl9LAorICAgIHsiWHRydWN0MiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5YdHJ1Y3QyJywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Llh0cnVjdDIne2J5dGVfdGhpbmc9bnVsbCxzdHJ1Y3RfdGhpbmc9bnVsbCxpMzJfdGhpbmc9bnVsbH0KKyAgICApfSwKKyAgICB7Ilh0cnVjdDMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuWHRydWN0MycsIF8sIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5YdHJ1Y3QzJ3tzdHJpbmdfdGhpbmc9bnVsbCxjaGFuZ2VkPW51bGwsaTMyX3RoaW5nPW51bGwsaTY0X3RoaW5nPW51bGx9CisgICAgKX0sCisgICAgeyJJbnNhbml0eSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5JbnNhbml0eScsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5JbnNhbml0eSd7dXNlck1hcD1udWxsLHh0cnVjdHM9bnVsbH0KKyAgICApfSwKKyAgICB7IkNyYXp5TmVzdGluZyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5DcmF6eU5lc3RpbmcnLCBfLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuQ3JhenlOZXN0aW5nJ3sKKyAgICAgICAgc3RyaW5nX2ZpZWxkPW51bGwsCisgICAgICAgIHNldF9maWVsZD1udWxsLAorICAgICAgICBsaXN0X2ZpZWxkPW51bGwsCisgICAgICAgIGJpbmFyeV9maWVsZD1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJYY2VwdGlvbiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5YY2VwdGlvbicsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7ZXJyb3JDb2RlPW51bGwsbWVzc2FnZT1udWxsfQorICAgICl9LAorICAgIHsiWGNlcHRpb24yIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LlhjZXB0aW9uMicsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne2Vycm9yQ29kZT1udWxsLHN0cnVjdF90aGluZz1udWxsfQorICAgICl9LAorICAgIHsiRW1wdHlTdHJ1Y3QgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J3RocmlmdC50ZXN0LkVtcHR5U3RydWN0J30sICMndGhyaWZ0LnRlc3QuRW1wdHlTdHJ1Y3Qne30pfSwKKyAgICB7Ik9uZUZpZWxkIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goeyd0aHJpZnQudGVzdC5PbmVGaWVsZCcsIF99LCAjJ3RocmlmdC50ZXN0Lk9uZUZpZWxkJ3tmaWVsZD1udWxsfSl9LAorICAgIHsiVmVyc2lvbmluZ1Rlc3RWMSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYxJywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjEne2JlZ2luX2luX2JvdGg9bnVsbCxvbGRfc3RyaW5nPW51bGwsZW5kX2luX2JvdGg9bnVsbH0KKyAgICApfSwKKyAgICB7IlZlcnNpb25pbmdUZXN0VjIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMicsIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJ3sKKyAgICAgICAgYmVnaW5faW5fYm90aD1udWxsLAorICAgICAgICBuZXdpbnQ9bnVsbCwKKyAgICAgICAgbmV3Ynl0ZT1udWxsLAorICAgICAgICBuZXdzaG9ydD1udWxsLAorICAgICAgICBuZXdsb25nPW51bGwsCisgICAgICAgIG5ld2RvdWJsZT1udWxsLAorICAgICAgICBuZXdzdHJ1Y3Q9bnVsbCwKKyAgICAgICAgbmV3bGlzdD1udWxsLAorICAgICAgICBuZXdzZXQ9bnVsbCwKKyAgICAgICAgbmV3bWFwPW51bGwsCisgICAgICAgIG5ld3N0cmluZz1udWxsLAorICAgICAgICBlbmRfaW5fYm90aD1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJMaXN0VHlwZVZlcnNpb25pbmdWMSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMScsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMSd7bXlpbnRzPW51bGwsaGVsbG89bnVsbH0KKyAgICApfSwKKyAgICB7Ikxpc3RUeXBlVmVyc2lvbmluZ1YyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lkxpc3RUeXBlVmVyc2lvbmluZ1YyJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lkxpc3RUeXBlVmVyc2lvbmluZ1YyJ3tzdHJpbmdzPW51bGwsaGVsbG89bnVsbH0KKyAgICApfSwKKyAgICB7Ikd1ZXNzUHJvdG9jb2xTdHJ1Y3QgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuR3Vlc3NQcm90b2NvbFN0cnVjdCcsIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5HdWVzc1Byb3RvY29sU3RydWN0J3ttYXBfZmllbGQ9bnVsbH0KKyAgICApfSwKKyAgICB7IkxhcmdlRGVsdGFzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LkxhcmdlRGVsdGFzJywgXywgXywgXywgXywgXywgXywgXywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LkxhcmdlRGVsdGFzJ3sKKyAgICAgICAgYjE9bnVsbCwKKyAgICAgICAgYjEwPW51bGwsCisgICAgICAgIGIxMDA9bnVsbCwKKyAgICAgICAgY2hlY2tfdHJ1ZT1udWxsLAorICAgICAgICBiMTAwMD1udWxsLAorICAgICAgICBjaGVja19mYWxzZT1udWxsLAorICAgICAgICB2ZXJ0d28yMDAwPW51bGwsCisgICAgICAgIGFfc2V0MjUwMD1udWxsLAorICAgICAgICB2ZXJ0d28zMDAwPW51bGwsCisgICAgICAgIGJpZ19udW1iZXJzPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7Ik5lc3RlZExpc3RzSTMyeDIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4MicsIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngyJ3tpbnRlZ2VybGlzdD1udWxsfQorICAgICl9LAorICAgIHsiTmVzdGVkTGlzdHNJMzJ4MyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngzJywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDMne2ludGVnZXJsaXN0PW51bGx9CisgICAgKX0sCisgICAgeyJOZXN0ZWRNaXhlZHgyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lk5lc3RlZE1peGVkeDInLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTmVzdGVkTWl4ZWR4Mid7CisgICAgICAgIGludF9zZXRfbGlzdD1udWxsLAorICAgICAgICBtYXBfaW50X3N0cnNldD1udWxsLAorICAgICAgICBtYXBfaW50X3N0cnNldF9saXN0PW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7Ikxpc3RCb25rcyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsndGhyaWZ0LnRlc3QuTGlzdEJvbmtzJywgX30sICMndGhyaWZ0LnRlc3QuTGlzdEJvbmtzJ3tib25rPW51bGx9KX0sCisgICAgeyJOZXN0ZWRMaXN0c0JvbmsgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNCb25rJywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzQm9uayd7Ym9uaz1udWxsfQorICAgICl9LAorICAgIHsiQm9vbFRlc3QgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuQm9vbFRlc3QnLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuQm9vbFRlc3Qne2I9bnVsbCxzPW51bGx9CisgICAgKX0sCisgICAgeyJTdHJ1Y3RBIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goeyd0aHJpZnQudGVzdC5TdHJ1Y3RBJywgX30sICMndGhyaWZ0LnRlc3QuU3RydWN0QSd7cz1udWxsfSl9LAorICAgIHsiU3RydWN0QiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5TdHJ1Y3RCJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LlN0cnVjdEIne2FhPW51bGwsYWI9bnVsbH0KKyAgICApfQorICBdLgorCitzdHJ1Y3RfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7IkJvbmsgZGVmaW5pdGlvbiAoc2hvcnQgdmVyc2lvbikiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBzdHJpbmd9LCB7MiwgaTMyfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ3RocmlmdC50ZXN0LkJvbmsnKQorICAgICl9LAorICAgIHsiQm9uayBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgc3RyaW5nLCBtZXNzYWdlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBpMzIsIHR5cGUsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5Cb25rJykKKyAgICApfSwKKyAgICB7IkJvb2xzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCBpbV90cnVlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCBpbV9mYWxzZSwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkJvb2xzJykKKyAgICApfSwKKyAgICB7Ilh0cnVjdCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgc3RyaW5nLCBzdHJpbmdfdGhpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGJ5dGUsIGJ5dGVfdGhpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHs5LCB1bmRlZmluZWQsIGkzMiwgaTMyX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7MTEsIHVuZGVmaW5lZCwgaTY0LCBpNjRfdGhpbmcsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5YdHJ1Y3QnKQorICAgICl9LAorICAgIHsiWHRydWN0MiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYnl0ZSwgYnl0ZV90aGluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX0sIHN0cnVjdF90aGluZywgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne319LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBpMzIsIGkzMl90aGluZywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Llh0cnVjdDInKQorICAgICl9LAorICAgIHsiWHRydWN0MyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgc3RyaW5nLCBzdHJpbmdfdGhpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGkzMiwgY2hhbmdlZCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezksIHVuZGVmaW5lZCwgaTMyLCBpMzJfdGhpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsxMSwgdW5kZWZpbmVkLCBpNjQsIGk2NF90aGluZywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Llh0cnVjdDMnKQorICAgICl9LAorICAgIHsiSW5zYW5pdHkgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHttYXAsIGkzMiwgaTY0fSwgdXNlck1hcCwgZGljdDpuZXcoKX0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHtsaXN0LCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fX0sIHh0cnVjdHMsIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lkluc2FuaXR5JykKKyAgICApfSwKKyAgICB7IkNyYXp5TmVzdGluZyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgc3RyaW5nLCBzdHJpbmdfZmllbGQsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCBvcHRpb25hbCwge3NldCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5JbnNhbml0eSd9fX0sIHNldF9maWVsZCwgc2V0czpuZXcoKX0sCisgICAgICAgIHszLCByZXF1aXJlZCwge2xpc3QsIHttYXAsCisgICAgICAgICAge3NldCwgaTMyfSwKKyAgICAgICAgICB7bWFwLCBpMzIsIHtzZXQsIHtsaXN0LCB7bWFwLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0Lkluc2FuaXR5J319LCBzdHJpbmd9fX19CisgICAgICAgIH19LCBsaXN0X2ZpZWxkLCBbXX0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIHN0cmluZywgYmluYXJ5X2ZpZWxkLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuQ3JhenlOZXN0aW5nJykKKyAgICApfSwKKyAgICB7IlhjZXB0aW9uIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGVycm9yQ29kZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCBtZXNzYWdlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuWGNlcHRpb24nKQorICAgICl9LAorICAgIHsiWGNlcHRpb24yIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGVycm9yQ29kZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX0sIHN0cnVjdF90aGluZywgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne319CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuWGNlcHRpb24yJykKKyAgICApfSwKKyAgICB7IkVtcHR5U3RydWN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5FbXB0eVN0cnVjdCcpCisgICAgKX0sCisgICAgeyJPbmVGaWVsZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5FbXB0eVN0cnVjdCd9fSwgZmllbGQsICMndGhyaWZ0LnRlc3QuRW1wdHlTdHJ1Y3Qne319CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuT25lRmllbGQnKQorICAgICl9LAorICAgIHsiVmVyc2lvbmluZ1Rlc3RWMSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCBiZWdpbl9pbl9ib3RoLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBzdHJpbmcsIG9sZF9zdHJpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsxMiwgdW5kZWZpbmVkLCBpMzIsIGVuZF9pbl9ib3RoLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMScpCisgICAgKX0sCisgICAgeyJWZXJzaW9uaW5nVGVzdFYyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGJlZ2luX2luX2JvdGgsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGkzMiwgbmV3aW50LCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBieXRlLCBuZXdieXRlLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBpMTYsIG5ld3Nob3J0LCB1bmRlZmluZWR9LAorICAgICAgICB7NSwgdW5kZWZpbmVkLCBpNjQsIG5ld2xvbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHs2LCB1bmRlZmluZWQsIGRvdWJsZSwgbmV3ZG91YmxlLCB1bmRlZmluZWR9LAorICAgICAgICB7NywgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb25rJ319LCBuZXdzdHJ1Y3QsICMndGhyaWZ0LnRlc3QuQm9uayd7fX0sCisgICAgICAgIHs4LCB1bmRlZmluZWQsIHtsaXN0LCBpMzJ9LCBuZXdsaXN0LCBbXX0sCisgICAgICAgIHs5LCB1bmRlZmluZWQsIHtzZXQsIGkzMn0sIG5ld3NldCwgc2V0czpuZXcoKX0sCisgICAgICAgIHsxMCwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIGkzMn0sIG5ld21hcCwgZGljdDpuZXcoKX0sCisgICAgICAgIHsxMSwgdW5kZWZpbmVkLCBzdHJpbmcsIG5ld3N0cmluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezEyLCB1bmRlZmluZWQsIGkzMiwgZW5kX2luX2JvdGgsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJykKKyAgICApfSwKKyAgICB7Ikxpc3RUeXBlVmVyc2lvbmluZ1YxIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwgaTMyfSwgbXlpbnRzLCBbXX0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHN0cmluZywgaGVsbG8sIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMScpCisgICAgKX0sCisgICAgeyJMaXN0VHlwZVZlcnNpb25pbmdWMiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHN0cmluZ30sIHN0cmluZ3MsIFtdfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCBoZWxsbywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lkxpc3RUeXBlVmVyc2lvbmluZ1YyJykKKyAgICApfSwKKyAgICB7Ikd1ZXNzUHJvdG9jb2xTdHJ1Y3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHs3LCB1bmRlZmluZWQsIHttYXAsIHN0cmluZywgc3RyaW5nfSwgbWFwX2ZpZWxkLCBkaWN0Om5ldygpfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lkd1ZXNzUHJvdG9jb2xTdHJ1Y3QnKQorICAgICl9LAorICAgIHsiTGFyZ2VEZWx0YXMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvb2xzJ319LCBiMSwgIyd0aHJpZnQudGVzdC5Cb29scyd7fX0sCisgICAgICAgIHsxMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb29scyd9fSwgYjEwLCAjJ3RocmlmdC50ZXN0LkJvb2xzJ3t9fSwKKyAgICAgICAgezEwMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb29scyd9fSwgYjEwMCwgIyd0aHJpZnQudGVzdC5Cb29scyd7fX0sCisgICAgICAgIHs1MDAsIHVuZGVmaW5lZCwgYm9vbCwgY2hlY2tfdHJ1ZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezEwMDAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9vbHMnfX0sIGIxMDAwLCAjJ3RocmlmdC50ZXN0LkJvb2xzJ3t9fSwKKyAgICAgICAgezE1MDAsIHVuZGVmaW5lZCwgYm9vbCwgY2hlY2tfZmFsc2UsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyMDAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjInfX0sIHZlcnR3bzIwMDAsICMndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMid7fX0sCisgICAgICAgIHsyNTAwLCB1bmRlZmluZWQsIHtzZXQsIHN0cmluZ30sIGFfc2V0MjUwMCwgc2V0czpuZXcoKX0sCisgICAgICAgIHszMDAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjInfX0sIHZlcnR3bzMwMDAsICMndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMid7fX0sCisgICAgICAgIHs0MDAwLCB1bmRlZmluZWQsIHtsaXN0LCBpMzJ9LCBiaWdfbnVtYmVycywgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTGFyZ2VEZWx0YXMnKQorICAgICl9LAorICAgIHsiTmVzdGVkTGlzdHNJMzJ4MiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtsaXN0LCBpMzJ9fSwgaW50ZWdlcmxpc3QsIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDInKQorICAgICl9LAorICAgIHsiTmVzdGVkTGlzdHNJMzJ4MyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtsaXN0LCB7bGlzdCwgaTMyfX19LCBpbnRlZ2VybGlzdCwgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4MycpCisgICAgKX0sCisgICAgeyJOZXN0ZWRNaXhlZHgyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge3NldCwgaTMyfX0sIGludF9zZXRfbGlzdCwgW119LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIHtzZXQsIHN0cmluZ319LCBtYXBfaW50X3N0cnNldCwgZGljdDpuZXcoKX0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIHtsaXN0LCB7bWFwLCBpMzIsIHtzZXQsIHN0cmluZ319fSwgbWFwX2ludF9zdHJzZXRfbGlzdCwgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTmVzdGVkTWl4ZWR4MicpCisgICAgKX0sCisgICAgeyJMaXN0Qm9ua3MgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb25rJ319fSwgYm9uaywgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTGlzdEJvbmtzJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZExpc3RzQm9uayBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtsaXN0LCB7bGlzdCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9uayd9fX19fSwgYm9uaywgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNCb25rJykKKyAgICApfSwKKyAgICB7IkJvb2xUZXN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgb3B0aW9uYWwsIGJvb2wsIGIsIHRydWV9LAorICAgICAgICB7Miwgb3B0aW9uYWwsIHN0cmluZywgcywgInRydWUifQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkJvb2xUZXN0JykKKyAgICApfSwKKyAgICB7IlN0cnVjdEEgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHJlcXVpcmVkLCBzdHJpbmcsIHMsIHVuZGVmaW5lZH1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuU3RydWN0QScpCisgICAgKX0sCisgICAgeyJTdHJ1Y3RCIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgb3B0aW9uYWwsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlN0cnVjdEEnfX0sIGFhLCAjJ3RocmlmdC50ZXN0LlN0cnVjdEEne319LAorICAgICAgICB7MiwgcmVxdWlyZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlN0cnVjdEEnfX0sIGFiLCAjJ3RocmlmdC50ZXN0LlN0cnVjdEEne319CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuU3RydWN0QicpCisgICAgKX0KKyAgXS4KKworc2VydmljZV9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsidGVzdFZvaWQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RWb2lkLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RWb2lkIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RWb2lkLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFZvaWQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Vm9pZCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmcgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZywgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RyaW5nIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHN0cmluZywKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmcsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RyaW5nIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZywgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RCeXRlIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJ5dGV9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Qnl0ZSwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0Qnl0ZSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBieXRlLAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEJ5dGUsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0Qnl0ZSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RCeXRlLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdEkzMiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBpMzJ9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STMyLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RJMzIgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgaTMyLAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEkzMiwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RJMzIgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STMyLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdEk2NCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBpNjR9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STY0LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RJNjQgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgaTY0LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEk2NCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RJNjQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STY0LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdERvdWJsZSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBkb3VibGV9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RG91YmxlLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3REb3VibGUgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgZG91YmxlLAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdERvdWJsZSwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3REb3VibGUgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RG91YmxlLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdFN0cnVjdCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWHRydWN0J319fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RydWN0LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJ1Y3QgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWHRydWN0J319LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cnVjdCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJ1Y3QgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RydWN0LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE5lc3QgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdDInfX19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3ROZXN0LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3ROZXN0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdDInfX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TmVzdCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3ROZXN0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE5lc3QsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TWFwIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7bWFwLCBpMzIsIGkzMn19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXAsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdE1hcCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7bWFwLCBpMzIsIGkzMn0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE1hcCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXAsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RyaW5nTWFwIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7bWFwLCBzdHJpbmcsIHN0cmluZ319CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmdNYXAsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZ01hcCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7bWFwLCBzdHJpbmcsIHN0cmluZ30sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nTWFwLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZ01hcCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmdNYXAsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0U2V0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c2V0LCBpMzJ9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U2V0LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTZXQgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3NldCwgaTMyfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTZXQsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U2V0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFNldCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RMaXN0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7bGlzdCwgaTMyfX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdExpc3QsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdExpc3QgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge2xpc3QsIGkzMn0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TGlzdCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RMaXN0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdExpc3QsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0RW51bSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgaTMyfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RW51bSwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RW51bSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBpMzIsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RW51bSwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RFbnVtIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEVudW0sIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0VHlwZWRlZiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBpNjR9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0VHlwZWRlZiwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0VHlwZWRlZiByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBpNjQsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0VHlwZWRlZiwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RUeXBlZGVmIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFR5cGVkZWYsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TWFwTWFwIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCBpMzJ9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXBNYXAsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdE1hcE1hcCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7bWFwLCBpMzIsIHttYXAsIGkzMixpMzJ9fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXBNYXAsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TWFwTWFwIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcE1hcCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RJbnNhbml0eSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuSW5zYW5pdHknfX19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJbnNhbml0eSwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0SW5zYW5pdHkgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge21hcCwgaTY0LCB7bWFwLCBpMzIsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuSW5zYW5pdHknfX19fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJbnNhbml0eSwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RJbnNhbml0eSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJbnNhbml0eSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgYnl0ZX0sCisgICAgICAgIHsyLCBpMzJ9LAorICAgICAgICB7MywgaTY0fSwKKyAgICAgICAgezQsIHttYXAsIGkxNiwgc3RyaW5nfX0sCisgICAgICAgIHs1LCBpMzJ9LAorICAgICAgICB7NiwgaTY0fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGksIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdE11bHRpIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aSwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RFeGNlcHRpb24gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEV4Y2VwdGlvbiwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RXhjZXB0aW9uIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFeGNlcHRpb24sIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RXhjZXB0aW9uIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWGNlcHRpb24nfX19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFeGNlcHRpb24sIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGlFeGNlcHRpb24gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfSwgezIsIHN0cmluZ31dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aUV4Y2VwdGlvbiwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGlFeGNlcHRpb24gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWHRydWN0J319LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpRXhjZXB0aW9uLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE11bHRpRXhjZXB0aW9uIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWGNlcHRpb24nfX19LAorICAgICAgICB7Miwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWGNlcHRpb24yJ319fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGlFeGNlcHRpb24sIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0T25ld2F5IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGkzMn1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RPbmV3YXksIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdE9uZXdheSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBvbmV3YXlfdm9pZCwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RPbmV3YXksIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0T25ld2F5IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE9uZXdheSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InNlY29uZHRlc3RTdHJpbmcgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfV19LAorICAgICAgc2Vjb25kX3NlcnZpY2VfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oc2Vjb25kdGVzdFN0cmluZywgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJzZWNvbmR0ZXN0U3RyaW5nIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHN0cmluZywKKyAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKHNlY29uZHRlc3RTdHJpbmcsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJzZWNvbmR0ZXN0U3RyaW5nIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgc2Vjb25kX3NlcnZpY2VfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oc2Vjb25kdGVzdFN0cmluZywgZXhjZXB0aW9ucykKKyAgICApfQorICBdLgpkaWZmIC0tZ2l0IGEvbGliL2dvL01ha2VmaWxlLmFtIGIvbGliL2dvL01ha2VmaWxlLmFtCmluZGV4IGZmOTQ2ZWEuLjBkZmE1ZmEgMTAwNjQ0Ci0tLSBhL2xpYi9nby9NYWtlZmlsZS5hbQorKysgYi9saWIvZ28vTWFrZWZpbGUuYW0KQEAgLTMxLDEwICszMSwxMyBAQAogCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKIAogY2hlY2stbG9jYWw6Ci0JJChHTykgdGVzdCAuL3RocmlmdAorCUdPUEFUSD1gcHdkYCAkKEdPKSB0ZXN0IC1yYWNlIC4vdGhyaWZ0CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBwa2cKIAogYWxsLWxvY2FsOgotCSQoR08pIGJ1aWxkIC4vdGhyaWZ0CisJR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC4vdGhyaWZ0CiAKIEVYVFJBX0RJU1QgPSBcCiAJdGhyaWZ0IFwKZGlmZiAtLWdpdCBhL2xpYi9nby9SRUFETUUubWQgYi9saWIvZ28vUkVBRE1FLm1kCmluZGV4IDFlMTQzNDIuLmNlNmQ1ZWQgMTAwNjQ0Ci0tLSBhL2xpYi9nby9SRUFETUUubWQKKysrIGIvbGliL2dvL1JFQURNRS5tZApAQCAtMjQsMTAgKzI0LDEyIEBACiBVc2luZyBUaHJpZnQgd2l0aCBHbwogPT09PT09PT09PT09PT09PT09PT0KIAorVGhyaWZ0IHN1cHBvcnRzIEdvIDEuNysKKwogSW4gZm9sbG93aW5nIEdvIGNvbnZlbnRpb25zLCB3ZSByZWNvbW1lbmQgeW91IHVzZSB0aGUgJ2dvJyB0b29sIHRvIGluc3RhbGwKIFRocmlmdCBmb3IgZ28uCiAKLSAgICAkIGdvIGdldCBnaXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0L2xpYi9nby90aHJpZnQvLi4uCisgICAgJCBnbyBnZXQgZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQvLi4uCiAKIFdpbGwgcmV0cmlldmUgYW5kIGluc3RhbGwgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgdGhlIHBhY2thZ2UuCiAKQEAgLTY0LDMgKzY2LDE4IEBACiAKIEFuZCBzbyBvbi4gVGhlIGNvZGUgZ2VuZXJhdG9yIGFsc28gY3JlYXRlcyBhbmFsb2dvdXMgaGVscGVycyBmb3IgdXNlci1kZWZpbmVkCiB0eXBlZGVmcyBhbmQgZW51bXMuCisKK0FkZGluZyBjdXN0b20gdGFncyB0byBnZW5lcmF0ZWQgVGhyaWZ0IHN0cnVjdHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworWW91IGNhbiBhZGQgdGFncyB0byB0aGUgYXV0by1nZW5lcmF0ZWQgdGhyaWZ0IHN0cnVjdHMgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAgICBzdHJ1Y3QgZm9vIHsKKyAgICAgIDE6IHJlcXVpcmVkIHN0cmluZyBCYXIgKGdvLnRhZyA9ICJzb21lX3RhZzpcInNvbWVfdGFnX3ZhbHVlXCIiKQorICAgIH0KKyAgICAKK3doaWNoIHdpbGwgZ2VuZXJhdGU6CisKKyAgICB0eXBlIEZvbyBzdHJ1Y3QgeworICAgICAgQmFyIHN0cmluZyBgdGhyaWZ0OiJiYXIsMSxyZXF1aXJlZCIgc29tZV90YWc6InNvbWVfdGFnX3ZhbHVlImAKKyAgICB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9Hb1RhZ1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvR29UYWdUZXN0LnRocmlmdAppbmRleCA1MDhiM2I2Li41NjY3YzZlIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC9Hb1RhZ1Rlc3QudGhyaWZ0CisrKyBiL2xpYi9nby90ZXN0L0dvVGFnVGVzdC50aHJpZnQKQEAgLTIxLDQgKzIxLDUgQEAKICAgICAxOiBzdHJpbmcgc3RyaW5nX3RoaW5nLAogICAgIDI6IGk2NCBpbnRfdGhpbmcgKGdvLnRhZyA9ICJqc29uOlwiaW50X3RoaW5nLHN0cmluZ1wiIiksCiAgICAgMzogb3B0aW9uYWwgaTY0IG9wdGlvbmFsX2ludF90aGluZworICAgIDQ6IG9wdGlvbmFsIGJvb2wgb3B0aW9uYWxfYm9vbF90aGluZyA9IGZhbHNlCiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9nby90ZXN0L01ha2VmaWxlLmFtCmluZGV4IGJiY2VjOTYuLjc4ZDQ2ODEgMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9nby90ZXN0L01ha2VmaWxlLmFtCkBAIC0xNyw4ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotVEhSSUZUQVJHUyA9IC1vdXQgZ29wYXRoL3NyYy8gLS1nZW4gZ286dGhyaWZ0X2ltcG9ydD10aHJpZnQKK1RIUklGVEFSR1MgPSAtb3V0IGdvcGF0aC9zcmMvIC0tZ2VuIGdvOnRocmlmdF9pbXBvcnQ9dGhyaWZ0JChDT01QSUxFUl9FWFRSQUZMQUcpCiBUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiAKICMgVGhyaWZ0IGZvciBHTyBoYXMgcHJvYmxlbXMgd2l0aCBjb21wbGV4IG1hcCBrZXlzOiBUSFJJRlQtMjA2MwpAQCAtMjgsMTEgKzI3LDEzIEBACiAJCQkJTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0IFwKIAkJCQlPbmV3YXlUZXN0LnRocmlmdCBcCiAJCQkJT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdCBcCisJCQkJUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0IFwKIAkJCQlTZXJ2aWNlc1Rlc3QudGhyaWZ0IFwKIAkJCQlHb1RhZ1Rlc3QudGhyaWZ0IFwKIAkJCQlUeXBlZGVmRmllbGRUZXN0LnRocmlmdCBcCiAJCQkJUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0IFwKIAkJCQlVbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0IFwKKwkJCQlVbmlvbkJpbmFyeVRlc3QudGhyaWZ0IFwKIAkJCQlFcnJvclRlc3QudGhyaWZ0IFwKIAkJCQlOYW1lc1Rlc3QudGhyaWZ0IFwKIAkJCQlJbml0aWFsaXNtc1Rlc3QudGhyaWZ0IFwKQEAgLTQ2LDE2ICs0NywyMCBAQAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIE11bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIE9uZXdheVRlc3QudGhyaWZ0CiAJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFJlcXVpcmVkRmllbGRUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFNlcnZpY2VzVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBHb1RhZ1Rlc3QudGhyaWZ0CiAJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBSZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBVbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgVW5pb25CaW5hcnlUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIEVycm9yVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBOYW1lc1Rlc3QudGhyaWZ0CiAJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgSW5pdGlhbGlzbXNUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpLHJlYWRfd3JpdGVfcHJpdmF0ZSBEb250RXhwb3J0UldUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpLGlnbm9yZV9pbml0aWFsaXNtcyBJZ25vcmVJbml0aWFsaXNtc1Rlc3QudGhyaWZ0CisJR09QQVRIPWBwd2RgL2dvcGF0aCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sgfHwgdHJ1ZQorCXNlZCAtaSAncy9cImNvbnRleHRcIi9cImdvbGFuZy5vcmdcL3hcL25ldFwvY29udGV4dFwiL2cnIGdvcGF0aC9zcmMvZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2svY29udHJvbGxlci5nbyB8fCB0cnVlCiAJR09QQVRIPWBwd2RgL2dvcGF0aCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sKIAlsbiAtbmZzIC4uLy4uLy4uL3RocmlmdCBnb3BhdGgvc3JjL3RocmlmdAogCWxuIC1uZnMgLi4vLi4vdGVzdHMgZ29wYXRoL3NyYy90ZXN0cwpAQCAtNzMsNyArNzgsOCBAQAogCQkJCW5hbWVzdGVzdCBcCiAJCQkJaW5pdGlhbGlzbXN0ZXN0IFwKIAkJCQlkb250ZXhwb3J0cnd0ZXN0IFwKLQkJCQlpZ25vcmVpbml0aWFsaXNtc3Rlc3QKKwkJCQlpZ25vcmVpbml0aWFsaXNtc3Rlc3QgXAorCQkJCXVuaW9uYmluYXJ5dGVzdAogCUdPUEFUSD1gcHdkYC9nb3BhdGggJChHTykgdGVzdCB0aHJpZnQgdGVzdHMgZG9udGV4cG9ydHJ3dGVzdAogCiBjbGVhbi1sb2NhbDoKQEAgLTkyLDggKzk4LDEwIEBACiAJTmFtZXNwYWNlZFRlc3QudGhyaWZ0IFwKIAlPbmV3YXlUZXN0LnRocmlmdCBcCiAJT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdCBcCisJUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0IFwKIAlSZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQgXAogCVVuaW9uRGVmYXVsdFZhbHVlVGVzdC50aHJpZnQgXAorCVVuaW9uQmluYXJ5VGVzdC50aHJpZnQgXAogCVNlcnZpY2VzVGVzdC50aHJpZnQgXAogCVR5cGVkZWZGaWVsZFRlc3QudGhyaWZ0IFwKIAlFcnJvclRlc3QudGhyaWZ0IFwKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1JlcXVpcmVkRmllbGRUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1JlcXVpcmVkRmllbGRUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTJkY2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNyBAQAorc3RydWN0IFJlcXVpcmVkRmllbGQgeworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorfQorCitzdHJ1Y3QgT3RoZXJUaGluZyB7CisgIDE6IHJlcXVpcmVkIGkxNiB2YWx1ZQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvVW5pb25CaW5hcnlUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1VuaW9uQmluYXJ5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3MTEyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L1VuaW9uQmluYXJ5VGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgU2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NzMKK3VuaW9uIFNhbXBsZSB7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gdTEsCisgIDI6IGJpbmFyeSB1MiwKKyAgMzogbGlzdDxzdHJpbmc+IHUzCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9kb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbyBiL2xpYi9nby90ZXN0L2RvbnRleHBvcnRyd3Rlc3QvY29tcGlsZV90ZXN0LmdvCmluZGV4IDJiODc3ZTMuLmNmNjc2M2UgMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L2RvbnRleHBvcnRyd3Rlc3QvY29tcGlsZV90ZXN0LmdvCisrKyBiL2xpYi9nby90ZXN0L2RvbnRleHBvcnRyd3Rlc3QvY29tcGlsZV90ZXN0LmdvCkBAIC0yMCw3ICsyMCw2IEBACiBwYWNrYWdlIGRvbnRleHBvcnRyd3Rlc3QKIAogaW1wb3J0ICgKLQkiZm10IgogCSJ0ZXN0aW5nIgogKQogCkBAIC0yOSwxMCArMjgsMTAgQEAKIGZ1bmMgVGVzdFJlYWRXcml0ZU1ldGhvZHNBcmVQcml2YXRlKHQgKnRlc3RpbmcuVCkgewogCS8vIFRoaXMgd2lsbCBvbmx5IGNvbXBpbGUgaWYgcmVhZC93cml0ZSBtZXRob2RzIGV4aXN0CiAJcyA6PSBOZXdUZXN0U3RydWN0KCkKLQlmbXQuU3ByaW50ZigiJXYiLCBzLnJlYWQpCi0JZm10LlNwcmludGYoIiV2Iiwgcy53cml0ZSkKKwlfID0gcy5yZWFkCisJXyA9IHMud3JpdGUKIAogCWlzIDo9IE5ld0lubmVyU3RydWN0KCkKLQlmbXQuU3ByaW50ZigiJXYiLCBpcy5yZWFkKQotCWZtdC5TcHJpbnRmKCIldiIsIGlzLndyaXRlKQorCV8gPSBpcy5yZWFkCisJXyA9IGlzLndyaXRlCiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9jbGllbnRfZXJyb3JfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2NsaWVudF9lcnJvcl90ZXN0LmdvCmluZGV4IDgyOWExZGQuLmZkZWM0ZWEgMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L3Rlc3RzL2NsaWVudF9lcnJvcl90ZXN0LmdvCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2NsaWVudF9lcnJvcl90ZXN0LmdvCkBAIC0yMCwxMSArMjAsMTMgQEAKIHBhY2thZ2UgdGVzdHMKIAogaW1wb3J0ICgKLQkiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCisJImNvbnRleHQiCiAJImVycm9ycyIKIAkiZXJyb3J0ZXN0IgogCSJ0ZXN0aW5nIgogCSJ0aHJpZnQiCisKKwkiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCiApCiAKIC8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCkBAIC0yMTEsNyArMjEzLDcgQEAKIAlpZiBmYWlsQXQgPT0gMjUgewogCQllcnIgPSBmYWlsV2l0aAogCX0KLQlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKIAlpZiBmYWlsQXQgPT0gMjUgewogCQlyZXR1cm4gdHJ1ZQogCX0KQEAgLTM5NywxMiArMzk5LDQ0IEBACiAvLyBFeHBlY3RpbmcgVFRyYW5zcG9ydEVycm9yIG9uIGZhaWwuCiBmdW5jIFRlc3RDbGllbnRSZXBvcnRUVHJhbnNwb3J0RXJyb3JzKHQgKnRlc3RpbmcuVCkgewogCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCi0JdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKIAogCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKIAl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKIAl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKLQl0aGluZy5TID0gbWFrZShtYXBbc3RyaW5nXWJvb2wpCisJdGhpbmcuUyA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuSSA9IDMKKworCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQlpZiAhcHJlcGFyZUNsaWVudENhbGxSZXBseShwcm90b2NvbCwgaSwgZXJyKSB7CisJCQlyZXR1cm4KKwkJfQorCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB0aGluZykKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQorCQlpZiAhb2sgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUVHJhc3BvcnRFeGNlcHRpb24iKQorCQl9CisKKwkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuVElNRURfT1VUIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIFRJTUVEX09VVCBlcnJvciIpCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBFeHBlY3RpbmcgVFRyYW5zcG9ydEVycm9yIG9uIGZhaWwuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRSZXBvcnRUVHJhbnNwb3J0RXJyb3JzLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFJlcG9ydFRUcmFuc3BvcnRFcnJvcnNMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKKwl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKIAl0aGluZy5JID0gMwogCiAJZXJyIDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RXhjZXB0aW9uKHRocmlmdC5USU1FRF9PVVQsICJ0ZXN0IikKQEAgLTQxMiw4ICs0NDYsOSBAQAogCQkJcmV0dXJuCiAJCX0KIAkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKLQkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KHRoaW5nKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgdGhpbmcpCiAJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKIAkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikKIAkJaWYgIW9rIHsKIAkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFRyYXNwb3J0RXhjZXB0aW9uIikKQEAgLTQyOSwxMiArNDY0LDQzIEBACiAvLyBFeHBlY3RpbmcgVFRQcm90b2NvbEVycm9ycyBvbiBmYWlsLgogZnVuYyBUZXN0Q2xpZW50UmVwb3J0VFByb3RvY29sRXJyb3JzKHQgKnRlc3RpbmcuVCkgewogCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCi0JdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKIAogCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKIAl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKIAl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKLQl0aGluZy5TID0gbWFrZShtYXBbc3RyaW5nXWJvb2wpCisJdGhpbmcuUyA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuSSA9IDMKKworCWVyciA6PSB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUodGhyaWZ0LklOVkFMSURfREFUQSwgZXJyb3JzLk5ldygidGVzdCIpKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJaWYgIXByZXBhcmVDbGllbnRDYWxsUmVwbHkocHJvdG9jb2wsIGksIGVycikgeworCQkJcmV0dXJuCisJCX0KKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgdGhpbmcpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKQorCQlpZiAhb2sgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCQl9CisJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfREFUQSB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX0RBVEEgZXJyb3IiKQorCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gRXhwZWN0aW5nIFRUUHJvdG9jb2xFcnJvcnMgb24gZmFpbC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFJlcG9ydFRQcm90b2NvbEVycm9ycywgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRSZXBvcnRUUHJvdG9jb2xFcnJvcnNMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKKwl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKIAl0aGluZy5JID0gMwogCiAJZXJyIDo9IHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZSh0aHJpZnQuSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KCJ0ZXN0IikpCkBAIC00NDQsOCArNTEwLDkgQEAKIAkJCXJldHVybgogCQl9CiAJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCi0JCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdCh0aGluZykKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHRoaW5nKQogCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCiAJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikKIAkJaWYgIW9rIHsKIAkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFByb3RvY29sRXhjZXB0aW9uIikKQEAgLTQ3MCw3ICs1MzcsNyBAQAogCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLkFmdGVyKGxhc3QpCiAJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuQWZ0ZXIobGFzdCkKIAlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCkuQWZ0ZXIobGFzdCkKLQlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkuQWZ0ZXIobGFzdCkKIAogCS8vIFJlYWRpbmcgdGhlIGV4Y2VwdGlvbiwgbWlnaHQgZmFpbC4KIAlpZiBmYWlsQXQgPT0gMCB7CkBAIC01NTcsMTYgKzYyNCw1MiBAQAogLy8gVGVzdENhc2U6IGNhbGwgYW5kIHJlcGx5IHdpdGggZXhjZXB0aW9uIHdvcmtmbG93IGluIHRoZSBjbGllbnQuCiBmdW5jIFRlc3RDbGllbnRDYWxsRXhjZXB0aW9uKHQgKnRlc3RpbmcuVCkgewogCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCi0JdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKIAogCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCiAJZm9yIGkgOj0gMDsgOyBpKysgewogCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQogCQl3aWxsQ29tcGxldGUgOj0gIXByZXBhcmVDbGllbnRDYWxsRXhjZXB0aW9uKHByb3RvY29sLCBpLCBlcnIpCiAKLQkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKLQkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKCJ0ZXN0IikKKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQogCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisKKwkJaWYgIXdpbGxDb21wbGV0ZSB7CisJCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRUcmFuc3BvcnRFeGNlcHRpb24iKQorCQkJfQorCQkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuVElNRURfT1VUIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBUSU1FRF9PVVQgZXJyb3IiKQorCQkJfQorCQl9IGVsc2UgeworCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJCQl9CisJCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5QUk9UT0NPTF9FUlJPUiB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgUFJPVE9DT0xfRVJST1IgZXJyb3IiKQorCQkJfQorCQkJYnJlYWsKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IGNhbGwgYW5kIHJlcGx5IHdpdGggZXhjZXB0aW9uIHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRDYWxsRXhjZXB0aW9uLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudENhbGxFeGNlcHRpb25MZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQl3aWxsQ29tcGxldGUgOj0gIXByZXBhcmVDbGllbnRDYWxsRXhjZXB0aW9uKHByb3RvY29sLCBpLCBlcnIpCisKKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQogCiAJCWlmICF3aWxsQ29tcGxldGUgewogCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikKQEAgLTU5Miw2ICs2OTUsMzYgQEAKIC8vIFRlc3RDYXNlOiBNaXNtYXRjaGluZyBzZXF1ZW5jZSBpZCBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgogZnVuYyBUZXN0Q2xpZW50U2VxSWRNaXNtYXRjaCh0ICp0ZXN0aW5nLlQpIHsKIAltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJpbmciLCB0aHJpZnQuUkVQTFksIGludDMyKDIpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5CQURfU0VRVUVOQ0VfSUQgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBCQURfU0VRVUVOQ0VfSUQgZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IE1pc21hdGNoaW5nIHNlcXVlbmNlIGlkIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRTZXFJZE1pc21hdGNoLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFNlcUlkTWlzbWF0Y2hMZWdlYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCiAJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKIAlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQogCWdvbW9jay5Jbk9yZGVyKApAQCAtNjAzLDEyICs3MzYsMTIgQEAKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCi0JCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5SRVBMWSwgaW50MzIoMiksIG5pbCksCiAJKQogCiAJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKLQlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoInRlc3QiKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCiAJbW9ja0N0cmwuRmluaXNoKCkKIAlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKIAlpZiAhb2sgewpAQCAtNjIyLDYgKzc1NSwzNiBAQAogLy8gVGVzdENhc2U6IFdyb25nIG1ldGhvZCBuYW1lIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCiBmdW5jIFRlc3RDbGllbnRXcm9uZ01ldGhvZE5hbWUodCAqdGVzdGluZy5UKSB7CiAJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ1bmtub3duIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigxKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuV1JPTkdfTUVUSE9EX05BTUUgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBXUk9OR19NRVRIT0RfTkFNRSBlcnJvciIpCisJfQorfQorCisvLyBUZXN0Q2FzZTogV3JvbmcgbWV0aG9kIG5hbWUgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFdyb25nTWV0aG9kTmFtZSwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01ldGhvZE5hbWVMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKIAl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQogCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCiAJZ29tb2NrLkluT3JkZXIoCkBAIC02MzMsMTIgKzc5NiwxMiBAQAogCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAogCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAogCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKLQkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAogCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ1bmtub3duIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigxKSwgbmlsKSwKIAkpCiAKIAljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQotCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZygidGVzdCIpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKIAltb2NrQ3RybC5GaW5pc2goKQogCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQogCWlmICFvayB7CkBAIC02NTIsNiArODE1LDM2IEBACiAvLyBUZXN0Q2FzZTogV3JvbmcgbWVzc2FnZSB0eXBlIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCiBmdW5jIFRlc3RDbGllbnRXcm9uZ01lc3NhZ2VUeXBlKHQgKnRlc3RpbmcuVCkgewogCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5JTlZBTElEX1RNRVNTQUdFX1RZUEUsIGludDMyKDEpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04geworCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04gZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IFdyb25nIG1lc3NhZ2UgdHlwZSBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50V3JvbmdNZXNzYWdlVHlwZSwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01lc3NhZ2VUeXBlTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCiAJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKIAlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQogCWdvbW9jay5Jbk9yZGVyKApAQCAtNjYzLDEyICs4NTYsMTIgQEAKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCi0JCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5JTlZBTElEX1RNRVNTQUdFX1RZUEUsIGludDMyKDEpLCBuaWwpLAogCSkKIAogCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCi0JXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKCJ0ZXN0IikKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQogCW1vY2tDdHJsLkZpbmlzaCgpCiAJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCiAJaWYgIW9rIHsKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2NvbnRleHQuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9jb250ZXh0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5M2E4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9jb250ZXh0LmdvCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorKQorCit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9nb3RhZ190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvZ290YWdfdGVzdC5nbwppbmRleCAzMmYwNTZmLi5mZjJmMTRlIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy9nb3RhZ190ZXN0LmdvCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2dvdGFnX3Rlc3QuZ28KQEAgLTUxLDMgKzUxLDEyIEBACiAJCXQuRXJyb3IoIlVuZXhwZWN0ZWQgZGVmYXVsdCB0YWcgdmFsdWUgZm9yIG9wdGlvbmFsIGZpZWxkIikKIAl9CiB9CisKK2Z1bmMgVGVzdE9wdGlvbmFsVGFnV2l0aERlZmF1bHRWYWx1ZSh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IGdvdGFndGVzdC5UYWdnZWR7fQorCXN0IDo9IHJlZmxlY3QuVHlwZU9mKHMpCisJZmllbGQsIG9rIDo9IHN0LkZpZWxkQnlOYW1lKCJPcHRpb25hbEJvb2xUaGluZyIpCisJaWYgIW9rIHx8IGZpZWxkLlRhZy5HZXQoImpzb24iKSAhPSAib3B0aW9uYWxfYm9vbF90aGluZyIgeworCQl0LkVycm9yKCJVbmV4cGVjdGVkIGRlZmF1bHQgdGFnIHZhbHVlIGZvciBvcHRpb25hbCBmaWVsZCB0aGF0IGhhcyBhIGRlZmF1bHQgdmFsdWUiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL211bHRpcGxleGVkX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9tdWx0aXBsZXhlZF9wcm90b2NvbF90ZXN0LmdvCmluZGV4IDAwNjY5ZWYuLjYxYWM2MjggMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L3Rlc3RzL211bHRpcGxleGVkX3Byb3RvY29sX3Rlc3QuZ28KKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvbXVsdGlwbGV4ZWRfcHJvdG9jb2xfdGVzdC5nbwpAQCAtMjAsMTAgKzIwLDEyIEBACiBwYWNrYWdlIHRlc3RzCiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJIm11bHRpcGxleGVkcHJvdG9jb2x0ZXN0IgogCSJuZXQiCiAJInRlc3RpbmciCiAJInRocmlmdCIKKwkidGltZSIKICkKIAogZnVuYyBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpIG5ldC5BZGRyIHsKQEAgLTM3LDI0ICszOSwzMiBAQAogCiB0eXBlIEZpcnN0SW1wbCBzdHJ1Y3R7fQogCi1mdW5jIChmICpGaXJzdEltcGwpIFJldHVybk9uZSgpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGYgKkZpcnN0SW1wbCkgUmV0dXJuT25lKGN0eCBjb250ZXh0LkNvbnRleHQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gMSwgbmlsCiB9CiAKIHR5cGUgU2Vjb25kSW1wbCBzdHJ1Y3R7fQogCi1mdW5jIChzICpTZWNvbmRJbXBsKSBSZXR1cm5Ud28oKSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CitmdW5jIChzICpTZWNvbmRJbXBsKSBSZXR1cm5Ud28oY3R4IGNvbnRleHQuQ29udGV4dCkgKHIgaW50NjQsIGVyciBlcnJvcikgewogCXJldHVybiAyLCBuaWwKIH0KIAotdmFyIHByb2Nlc3NvciA9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQorZnVuYyBjcmVhdGVUcmFuc3BvcnQoYWRkciBuZXQuQWRkcikgKHRocmlmdC5UVHJhbnNwb3J0LCBlcnJvcikgeworCXNvY2tldCA6PSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCisJZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCXJldHVybiB0cmFuc3BvcnQsIG5pbAorfQogCi1mdW5jIFRlc3RJbml0VHdvU2VydmVycyh0ICp0ZXN0aW5nLlQpIHsKLQl2YXIgZXJyIGVycm9yCitmdW5jIFRlc3RNdWx0aXBsZXhlZFByb3RvY29sRmlyc3QodCAqdGVzdGluZy5UKSB7CisJcHJvY2Vzc29yIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQogCXByb3RvY29sRmFjdG9yeSA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQogCXRyYW5zcG9ydEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKIAl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCi0JYWRkciA9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KCkKKwlhZGRyIDo9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KCkKIAlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldFRpbWVvdXQoYWRkci5TdHJpbmcoKSwgVElNRU9VVCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwgZXJyKQpAQCAtNjcsODEgKzc3LDExNyBAQAogCXNlY29uZFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkKIAlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpCiAKKwlkZWZlciBzZXJ2ZXIuU3RvcCgpCiAJZ28gc2VydmVyLlNlcnZlKCkKLX0KKwl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKIAotdmFyIGZpcnN0Q2xpZW50ICptdWx0aXBsZXhlZHByb3RvY29sdGVzdC5GaXJzdENsaWVudAotCi1mdW5jIFRlc3RJbml0Q2xpZW50MSh0ICp0ZXN0aW5nLlQpIHsKLQlzb2NrZXQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKLQl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQoc29ja2V0KQotCXZhciBwcm90b2NvbCB0aHJpZnQuVFByb3RvY29sID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCi0JcHJvdG9jb2wgPSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJGaXJzdFNlcnZpY2UiKQotCWZpcnN0Q2xpZW50ID0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKLQllcnIgOj0gdHJhbnNwb3J0Lk9wZW4oKQorCXRyYW5zcG9ydCwgZXJyIDo9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkZhdGFsKCJVbmFibGUgdG8gb3BlbiBjbGllbnQgc29ja2V0IiwgZXJyKQorCQl0LkZhdGFsKGVycikKIAl9Ci19CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKwlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wodGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpLCAiRmlyc3RTZXJ2aWNlIikKIAotdmFyIHNlY29uZENsaWVudCAqbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuU2Vjb25kQ2xpZW50CisJY2xpZW50IDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld0ZpcnN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKIAotZnVuYyBUZXN0SW5pdENsaWVudDIodCAqdGVzdGluZy5UKSB7Ci0Jc29ja2V0IDo9IHRocmlmdC5OZXdUU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCi0JdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0KHNvY2tldCkKLQl2YXIgcHJvdG9jb2wgdGhyaWZ0LlRQcm90b2NvbCA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQotCXByb3RvY29sID0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiU2Vjb25kU2VydmljZSIpCi0Jc2Vjb25kQ2xpZW50ID0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCi0JZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbCgiVW5hYmxlIHRvIG9wZW4gY2xpZW50IHNvY2tldCIsIGVycikKLQl9Ci19Ci0KLS8vY3JlYXRlIGNsaWVudCB3aXRob3V0IHNlcnZpY2UgcHJlZml4Ci1mdW5jIGNyZWF0ZUxlZ2FjeUNsaWVudCh0ICp0ZXN0aW5nLlQpICptdWx0aXBsZXhlZHByb3RvY29sdGVzdC5TZWNvbmRDbGllbnQgewotCXNvY2tldCA6PSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQotCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCi0JdmFyIHByb3RvY29sIHRocmlmdC5UUHJvdG9jb2wgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKLQlsZWdhY3lDbGllbnQgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCi0JZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbCgiVW5hYmxlIHRvIG9wZW4gY2xpZW50IHNvY2tldCIsIGVycikKLQl9Ci0JcmV0dXJuIGxlZ2FjeUNsaWVudAotfQotCi1mdW5jIFRlc3RDYWxsRmlyc3QodCAqdGVzdGluZy5UKSB7Ci0JcmV0LCBlcnIgOj0gZmlyc3RDbGllbnQuUmV0dXJuT25lKCkKKwlyZXQsIGVyciA6PSBjbGllbnQuUmV0dXJuT25lKGRlZmF1bHRDdHgpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlVuYWJsZSB0byBjYWxsIGZpcnN0IHNlcnZlcjoiLCBlcnIpCi0JfQotCWlmIHJldCAhPSAxIHsKKwl9IGVsc2UgaWYgcmV0ICE9IDEgewogCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHJlc3VsdCBmcm9tIHNlcnZlcjogIiwgcmV0KQogCX0KIH0KIAotZnVuYyBUZXN0Q2FsbFNlY29uZCh0ICp0ZXN0aW5nLlQpIHsKLQlyZXQsIGVyciA6PSBzZWNvbmRDbGllbnQuUmV0dXJuVHdvKCkKK2Z1bmMgVGVzdE11bHRpcGxleGVkUHJvdG9jb2xTZWNvbmQodCAqdGVzdGluZy5UKSB7CisJcHJvY2Vzc29yIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQorCXByb3RvY29sRmFjdG9yeSA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQorCXRyYW5zcG9ydEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJYWRkciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCisJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKKwl9CisJc2VydmVyID0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisKKwlmaXJzdFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdGaXJzdFByb2Nlc3NvcigmRmlyc3RJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJGaXJzdFNlcnZpY2UiLCBmaXJzdFByb2Nlc3NvcikKKworCXNlY29uZFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkKKwlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpCisKKwlkZWZlciBzZXJ2ZXIuU3RvcCgpCisJZ28gc2VydmVyLlNlcnZlKCkKKwl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKKworCXRyYW5zcG9ydCwgZXJyIDo9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKwlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wodGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpLCAiU2Vjb25kU2VydmljZSIpCisKKwljbGllbnQgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKworCXJldCwgZXJyIDo9IGNsaWVudC5SZXR1cm5Ud28oZGVmYXVsdEN0eCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5hYmxlIHRvIGNhbGwgc2Vjb25kIHNlcnZlcjoiLCBlcnIpCi0JfQotCWlmIHJldCAhPSAyIHsKKwl9IGVsc2UgaWYgcmV0ICE9IDIgewogCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHJlc3VsdCBmcm9tIHNlcnZlcjogIiwgcmV0KQogCX0KIH0KIAotZnVuYyBUZXN0Q2FsbExlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKLQlsZWdhY3lDbGllbnQgOj0gY3JlYXRlTGVnYWN5Q2xpZW50KHQpCi0JcmV0LCBlcnIgOj0gbGVnYWN5Q2xpZW50LlJldHVyblR3bygpCitmdW5jIFRlc3RNdWx0aXBsZXhlZFByb3RvY29sTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCXByb2Nlc3NvciA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKKwlwcm90b2NvbEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwl0cmFuc3BvcnRGYWN0b3J5IDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCWFkZHIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCisJZmlyc3RQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RQcm9jZXNzb3IoJkZpcnN0SW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiRmlyc3RTZXJ2aWNlIiwgZmlyc3RQcm9jZXNzb3IpCisKKwlzZWNvbmRQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kUHJvY2Vzc29yKCZTZWNvbmRJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKQorCisJZGVmZXIgc2VydmVyLlN0b3AoKQorCWdvIHNlcnZlci5TZXJ2ZSgpCisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCisKKwl0cmFuc3BvcnQsIGVyciA6PSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcihlcnIpCisJCXJldHVybgorCX0KKwlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQorCisJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJY2xpZW50IDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA6PSBjbGllbnQuUmV0dXJuVHdvKGRlZmF1bHRDdHgpCiAJLy9leHBlY3QgZXJyb3Igc2luY2UgZGVmYXVsdCBwcm9jZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQKIAlpZiBlcnIgPT0gbmlsIHsKIAkJdC5GYXRhbCgiRXhwZWN0aW5nIGVycm9yIikKIAl9CisKIAkvL3JlZ2lzdGVyIGRlZmF1bHQgcHJvY2Vzc29yIGFuZCBjYWxsIGFnYWluCiAJcHJvY2Vzc29yLlJlZ2lzdGVyRGVmYXVsdChtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkpCi0JbGVnYWN5Q2xpZW50ID0gY3JlYXRlTGVnYWN5Q2xpZW50KHQpCi0JcmV0LCBlcnIgPSBsZWdhY3lDbGllbnQuUmV0dXJuVHdvKCkKKwl0cmFuc3BvcnQsIGVyciA9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwkJcmV0dXJuCisJfQorCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCisKKwlwcm90b2NvbCA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQorCWNsaWVudCA9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA9IGNsaWVudC5SZXR1cm5Ud28oZGVmYXVsdEN0eCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5hYmxlIHRvIGNhbGwgbGVnYWN5IHNlcnZlcjoiLCBlcnIpCiAJfQpAQCAtMTQ5LDkgKzE5NSwzIEBACiAJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgcmVzdWx0IGZyb20gc2VydmVyOiAiLCByZXQpCiAJfQogfQotCi1mdW5jIFRlc3RTaHV0ZG93blNlcnZlckFuZENsaWVudHModCAqdGVzdGluZy5UKSB7Ci0JZmlyc3RDbGllbnQuVHJhbnNwb3J0LkNsb3NlKCkKLQlzZWNvbmRDbGllbnQuVHJhbnNwb3J0LkNsb3NlKCkKLQlzZXJ2ZXIuU3RvcCgpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9vbmVfd2F5X3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9vbmVfd2F5X3Rlc3QuZ28KaW5kZXggM2ZmMDI1Zi4uNDhkMGJiZSAxMDA2NDQKLS0tIGEvbGliL2dvL3Rlc3QvdGVzdHMvb25lX3dheV90ZXN0LmdvCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL29uZV93YXlfdGVzdC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0ZXN0cwogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJmbXQiCiAJIm5ldCIKIAkib25ld2F5dGVzdCIKQEAgLTM5LDkgKzQwLDkgQEAKIAogdHlwZSBpbXBsIHN0cnVjdHt9CiAKLWZ1bmMgKGkgKmltcGwpIEhpKGluIGludDY0LCBzIHN0cmluZykgKGVyciBlcnJvcikgICAgICAgIHsgZm10LlByaW50bG4oIkhpISIpOyByZXR1cm4gfQotZnVuYyAoaSAqaW1wbCkgRW1wdHlmdW5jKCkgKGVyciBlcnJvcikgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gfQotZnVuYyAoaSAqaW1wbCkgRWNob0ludChwYXJhbSBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeyByZXR1cm4gcGFyYW0sIG5pbCB9CitmdW5jIChpICppbXBsKSBIaShjdHggY29udGV4dC5Db250ZXh0LCBpbiBpbnQ2NCwgcyBzdHJpbmcpIChlcnIgZXJyb3IpICAgICAgICB7IGZtdC5QcmludGxuKCJIaSEiKTsgcmV0dXJuIH0KK2Z1bmMgKGkgKmltcGwpIEVtcHR5ZnVuYyhjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIH0KK2Z1bmMgKGkgKmltcGwpIEVjaG9JbnQoY3R4IGNvbnRleHQuQ29udGV4dCwgcGFyYW0gaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsgcmV0dXJuIHBhcmFtLCBuaWwgfQogCiBjb25zdCBUSU1FT1VUID0gdGltZS5TZWNvbmQKIApAQCAtNjAsMTIgKzYxLDEzIEBACiAJc2VydmVyID0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXIyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KQogCiAJZ28gc2VydmVyLlNlcnZlKCkKKwl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKIH0KIAogZnVuYyBUZXN0SW5pdE9uZXdheUNsaWVudCh0ICp0ZXN0aW5nLlQpIHsKIAl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKIAlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKLQljbGllbnQgPSBvbmV3YXl0ZXN0Lk5ld09uZVdheUNsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCWNsaWVudCA9IG9uZXdheXRlc3QuTmV3T25lV2F5Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKIAllcnIgOj0gdHJhbnNwb3J0Lk9wZW4oKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJVbmFibGUgdG8gb3BlbiBjbGllbnQgc29ja2V0IiwgZXJyKQpAQCAtNzQsMTIgKzc2LDEyIEBACiAKIGZ1bmMgVGVzdENhbGxPbmV3YXlTZXJ2ZXIodCAqdGVzdGluZy5UKSB7CiAJLy9jYWxsIG9uZXdheSBmdW5jdGlvbgotCWVyciA6PSBjbGllbnQuSGkoMSwgIiIpCisJZXJyIDo9IGNsaWVudC5IaShkZWZhdWx0Q3R4LCAxLCAiIikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5leHBlY3RlZCBlcnJvcjogIiwgZXJyKQogCX0KIAkvL1RoZXJlIGlzIG5vIHdheSB0byBkZXRlY3QgcHJvdG9jb2wgcHJvYmxlbXMgd2l0aCBzaW5nbGUgb25ld2F5IGNhbGwgc28gd2UgY2FsbCBpdCBzZWNvbmQgdGltZQotCWksIGVyciA6PSBjbGllbnQuRWNob0ludCg0MikKKwlpLCBlcnIgOj0gY2xpZW50LkVjaG9JbnQoZGVmYXVsdEN0eCwgNDIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgZXJyb3I6ICIsIGVycikKIAl9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbF9tb2NrLmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xfbW9jay5nbwppbmRleCA5MTk3ZmVkLi41MWQ3YTAyIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbF9tb2NrLmdvCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sX21vY2suZ28KQEAgLTIzLDcgKzIzLDkgQEAKIHBhY2thZ2UgdGVzdHMKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAl0aHJpZnQgInRocmlmdCIKKwogCWdvbW9jayAiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCiApCiAKQEAgLTQ4LDEzICs1MCwxMyBAQAogCXJldHVybiBfbS5yZWNvcmRlcgogfQogCi1mdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgRmx1c2goKSBlcnJvciB7CitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgewogCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJGbHVzaCIpCiAJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQogCXJldHVybiByZXQwCiB9CiAKLWZ1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgRmx1c2goKSAqZ29tb2NrLkNhbGwgeworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAqZ29tb2NrLkNhbGwgewogCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJGbHVzaCIpCiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xzX3Rlc3QuZ28KaW5kZXggNDIyYjVjOC4uY2ZmZDljMyAxMDA2NDQKLS0tIGEvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xzX3Rlc3QuZ28KKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xzX3Rlc3QuZ28KQEAgLTQyLDkgKzQyLDEyIEBACiAKIAkvLyBjbGllbnQKIAl2YXIgdHJhbnNwb3J0IHRocmlmdC5UVHJhbnNwb3J0ID0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKLQl0cmFuc3BvcnQgPSB0cmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJdHJhbnNwb3J0LCBlcnIgPSB0cmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KIAl2YXIgcHJvdG9jb2wgdGhyaWZ0LlRQcm90b2NvbCA9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpCi0JdGhyaWZ0VGVzdENsaWVudCA6PSB0aHJpZnR0ZXN0Lk5ld1RocmlmdFRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwl0aHJpZnRUZXN0Q2xpZW50IDo9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCiAJZXJyID0gdHJhbnNwb3J0Lk9wZW4oKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJVbmFibGUgdG8gb3BlbiBjbGllbnQgc29ja2V0IiwgZXJyKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvcmVxdWlyZWRfZmllbGRzX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9yZXF1aXJlZF9maWVsZHNfdGVzdC5nbwppbmRleCAyMDUzNzEyLi4zZmE0MTRhIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy9yZXF1aXJlZF9maWVsZHNfdGVzdC5nbworKysgYi9saWIvZ28vdGVzdC90ZXN0cy9yZXF1aXJlZF9maWVsZHNfdGVzdC5nbwpAQCAtMjAsMTIgKzIwLDQ1IEBACiBwYWNrYWdlIHRlc3RzCiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgogCSJvcHRpb25hbGZpZWxkc3Rlc3QiCisJInJlcXVpcmVkZmllbGR0ZXN0IgogCSJ0ZXN0aW5nIgogCSJ0aHJpZnQiCiApCiAKK2Z1bmMgVGVzdFJlcXVpcmVkRmllbGRfU3VjZWNzc1doZW5TZXQodCAqdGVzdGluZy5UKSB7CisJLy8gY3JlYXRlIGEgbmV3IFJlcXVpcmVkRmllbGQgaW5zdGFuY2Ugd2l0aCB0aGUgcmVxdWlyZWQgZmllbGQgc2V0CisJc291cmNlIDo9ICZyZXF1aXJlZGZpZWxkdGVzdC5SZXF1aXJlZEZpZWxke05hbWU6ICJ0aGlzIGlzIGEgdGVzdCJ9CisJc291cmNlRGF0YSwgZXJyIDo9IHRocmlmdC5OZXdUU2VyaWFsaXplcigpLldyaXRlKGNvbnRleHQuQmFja2dyb3VuZCgpLCBzb3VyY2UpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJmYWlsZWQgdG8gc2VyaWFsaXplICVUOiAldiIsIHNvdXJjZSwgZXJyKQorCX0KKworCWQgOj0gdGhyaWZ0Lk5ld1REZXNlcmlhbGl6ZXIoKQorCWVyciA9IGQuUmVhZCgmcmVxdWlyZWRmaWVsZHRlc3QuUmVxdWlyZWRGaWVsZHt9LCBzb3VyY2VEYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRGlkIG5vdCBleHBlY3QgYW4gZXJyb3Igd2hlbiB0cnlpbmcgdG8gZGVzZXJpYWxpemUgdGhlIHJlcXVpcmVkZmllbGR0ZXN0LlJlcXVpcmVkRmllbGQ6ICV2IiwgZXJyKQorCX0KK30KKworZnVuYyBUZXN0UmVxdWlyZWRGaWVsZF9FcnJvcldoZW5NaXNzaW5nKHQgKnRlc3RpbmcuVCkgeworCS8vIGNyZWF0ZSBhIG5ldyBPdGhlclRoaW5nIGluc3RhbmNlLCB3aXRob3V0IHNldHRpbmcgdGhlIHJlcXVpcmVkIGZpZWxkCisJc291cmNlIDo9ICZyZXF1aXJlZGZpZWxkdGVzdC5PdGhlclRoaW5ne30KKwlzb3VyY2VEYXRhLCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJpYWxpemVyKCkuV3JpdGUoY29udGV4dC5CYWNrZ3JvdW5kKCksIHNvdXJjZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoImZhaWxlZCB0byBzZXJpYWxpemUgJVQ6ICV2Iiwgc291cmNlLCBlcnIpCisJfQorCisJLy8gYXR0ZW1wdCB0byBkZXNlcmlhbGl6ZSBpbnRvIGEgZGlmZmVyZW50IHR5cGUgKHdoaWNoIHNob3VsZCBmYWlsKQorCWQgOj0gdGhyaWZ0Lk5ld1REZXNlcmlhbGl6ZXIoKQorCWVyciA9IGQuUmVhZCgmcmVxdWlyZWRmaWVsZHRlc3QuUmVxdWlyZWRGaWVsZHt9LCBzb3VyY2VEYXRhKQorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBhbiBlcnJvciB3aGVuIHRyeWluZyB0byBkZXNlcmlhbGl6ZSBhbiBvYmplY3Qgd2hpY2ggaXMgbWlzc2luZyBhIHJlcXVpcmVkIGZpZWxkIikKKwl9Cit9CisKIGZ1bmMgVGVzdFN0cnVjdFJlYWRSZXF1aXJlZEZpZWxkcyh0ICp0ZXN0aW5nLlQpIHsKIAltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQogCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCkBAIC00MCw2ICs3Myw3IEBACiAKIAllcnIgOj0gdGVzdFN0cnVjdC5SZWFkKHByb3RvY29sKQogCW1vY2tDdHJsLkZpbmlzaCgpCisJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQogCWlmIGVyciA9PSBuaWwgewogCQl0LkZhdGFsKCJFeHBlY3RlZCByZWFkIHRvIGZhaWwiKQogCX0KQEAgLTYzLDYgKzk3LDcgQEAKIAogCWVyciA9IHRlc3RTdHJ1Y3QuUmVhZChwcm90b2NvbCkKIAltb2NrQ3RybC5GaW5pc2goKQorCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKIAlpZiBlcnIgPT0gbmlsIHsKIAkJdC5GYXRhbCgiRXhwZWN0ZWQgcmVhZCB0byBmYWlsIikKIAl9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9zdHJ1Y3RfYXJnc19yZXRzX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9zdHJ1Y3RfYXJnc19yZXRzX3Rlc3QuZ28KaW5kZXggMzYzNDIzZC4uODFlOWIyNiAxMDA2NDQKLS0tIGEvbGliL2dvL3Rlc3QvdGVzdHMvc3RydWN0X2FyZ3NfcmV0c190ZXN0LmdvCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3N0cnVjdF9hcmdzX3JldHNfdGVzdC5nbwpAQCAtMzAsNyArMzAsNyBAQAogCXZhciBpZmFjZSBzdC5BU2VydgogCXZhciBlcnIgZXJyb3IKIAotCXNhLCBlcnIgPSBpZmFjZS5TdHJ1Y3RBRnVuY18xc3RydWN0QShzYSkKKwlzYSwgZXJyID0gaWZhY2UuU3RydWN0QUZ1bmNfMXN0cnVjdEEoZGVmYXVsdEN0eCwgc2EpCiAJXyA9IGVycgogCV8gPSBzYQogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9kcml2ZXIuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2RyaXZlci5nbwppbmRleCA5MTUzODNmLi5kZTU0Y2JjIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2RyaXZlci5nbworKysgYi9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2RyaXZlci5nbwpAQCAtMzgsMTUgKzM4LDE1IEBACiAJY2xpZW50IDo9IHAuY2xpZW50CiAJdCA6PSBwLnQKIAotCWlmIGNsaWVudC5UZXN0Vm9pZCgpICE9IG5pbCB7CisJaWYgY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RWb2lkIGZhaWxlZCIpCiAJfQogCi0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKCJUZXN0Iik7IHIgIT0gIlRlc3QiIHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAiVGVzdCIpOyByICE9ICJUZXN0IiB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIHNpbXBsZSB0ZXh0IGZhaWxlZCIpCiAJfQogCi0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKCIiKTsgciAhPSAiIiB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgIiIpOyByICE9ICIiIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0U3RyaW5nIHdpdGggZW1wdHkgdGV4dCBmYWlsZWQiKQogCX0KIApAQCAtNzYsNyArNzYsNyBAQAogCQkiV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgIiArCiAJCSJCw6JuLWzDom0tZ8O6LCDnsrXoqp4iCiAKLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoc3RyaW5nVGVzdCk7IHIgIT0gc3RyaW5nVGVzdCB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgc3RyaW5nVGVzdCk7IHIgIT0gc3RyaW5nVGVzdCB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIGFsbCBsYW5ndWFnZXMgZmFpbGVkIikKIAl9CiAKQEAgLTg2LDQ0ICs4Niw0NCBAQAogCQkiIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwiICsKIAkJIiBjaGFyLXRvLXRlc3QtanNvbi1wYXJzaW5nOiBdXSBcIl1dIFxcXCIgfX19eyBbW1sgIgogCi0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKTsgciAhPSBzcGVjaWFsQ2hhcmFjdGVycyB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgc3BlY2lhbENoYXJhY3RlcnMpOyByICE9IHNwZWNpYWxDaGFyYWN0ZXJzIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0U3RyaW5nIHdpdGggc3BlY2lhbENoYXJhY3RlcnMgZmFpbGVkIikKIAl9CiAKLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKDEpOyByICE9IDEgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAxKTsgciAhPSAxIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0Qnl0ZSgxKSBmYWlsZWQiKQogCX0KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKDApOyByICE9IDAgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAwKTsgciAhPSAwIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0Qnl0ZSgwKSBmYWlsZWQiKQogCX0KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKC0xKTsgciAhPSAtMSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIC0xKTsgciAhPSAtMSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEJ5dGUoLTEpIGZhaWxlZCIpCiAJfQotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoLTEyNyk7IHIgIT0gLTEyNyB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIC0xMjcpOyByICE9IC0xMjcgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RCeXRlKC0xMjcpIGZhaWxlZCIpCiAJfQogCi0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STMyKC0xKTsgciAhPSAtMSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoZGVmYXVsdEN0eCwgLTEpOyByICE9IC0xIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0STMyKC0xKSBmYWlsZWQiKQogCX0KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoMSk7IHIgIT0gMSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoZGVmYXVsdEN0eCwgMSk7IHIgIT0gMSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEkzMigxKSBmYWlsZWQiKQogCX0KIAotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NCgtNSk7IHIgIT0gLTUgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIC01KTsgciAhPSAtNSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEk2NCgtNSkgZmFpbGVkIikKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KDUpOyByICE9IDUgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIDUpOyByICE9IDUgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RJNjQoNSkgZmFpbGVkIikKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KC0zNDM1OTczODM2OCk7IHIgIT0gLTM0MzU5NzM4MzY4IHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCAtMzQzNTk3MzgzNjgpOyByICE9IC0zNDM1OTczODM2OCB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEk2NCgtMzQzNTk3MzgzNjgpIGZhaWxlZCIpCiAJfQogCi0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RG91YmxlKC01LjIwOTg1MjMpOyByICE9IC01LjIwOTg1MjMgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RG91YmxlKGRlZmF1bHRDdHgsIC01LjIwOTg1MjMpOyByICE9IC01LjIwOTg1MjMgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3REb3VibGUoLTUuMjA5ODUyMykgZmFpbGVkIikKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RG91YmxlKC03LjAxMjA1MjE3NTIxNTA0NCk7IHIgIT0gLTcuMDEyMDUyMTc1MjE1MDQ0IHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZShkZWZhdWx0Q3R4LCAtNy4wMTIwNTIxNzUyMTUwNDQpOyByICE9IC03LjAxMjA1MjE3NTIxNTA0NCB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdERvdWJsZSgtNy4wMTIwNTIxNzUyMTUwNDQpIGZhaWxlZCIpCiAJfQogCkBAIC0xMzQsNyArMTM0LDcgQEAKIAlvdXQuQnl0ZVRoaW5nID0gMQogCW91dC5JMzJUaGluZyA9IC0zCiAJb3V0Lkk2NFRoaW5nID0gMTAwMDAwMAotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChvdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgb3V0KSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgb3V0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG91dCkgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RTdHJ1Y3QgZmFpbGVkIikKIAl9CiAKQEAgLTE0Miw3ICsxNDIsNyBAQAogCW91dDIuQnl0ZVRoaW5nID0gMQogCW91dDIuU3RydWN0VGhpbmcgPSBvdXQKIAlvdXQyLkkzMlRoaW5nID0gNQotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdE5lc3Qob3V0Mik7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBvdXQyKSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KGRlZmF1bHRDdHgsIG91dDIpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgb3V0MikgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3ROZXN0IGZhaWxlZCIpCiAJfQogCkBAIC0xNTAsNyArMTUwLDcgQEAKIAlmb3IgaSA6PSBpbnQzMigwKTsgaSA8IDU7IGkrKyB7CiAJCW1hcG91dFtpXSA9IGkgLSAxMAogCX0KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RNYXAobWFwb3V0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG1hcG91dCkgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TWFwKGRlZmF1bHRDdHgsIG1hcG91dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBvdXQpIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0TWFwIGZhaWxlZCIpCiAJfQogCkBAIC0xNTgsMjUgKzE1OCwyNSBAQAogCQkiYSI6ICIxMjMiLCAiYSBiIjogIndpdGggc3BhY2VzICIsICJzYW1lIjogInNhbWUiLCAiMCI6ICJudW1lcmljIGtleSIsCiAJCSJsb25nVmFsdWUiOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAibG9uZyBrZXkiLAogCX0KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG1hcFRlc3RJbnB1dCkgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nTWFwKGRlZmF1bHRDdHgsIG1hcFRlc3RJbnB1dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBUZXN0SW5wdXQpIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0U3RyaW5nTWFwIGZhaWxlZCIpCiAJfQogCi0Jc2V0VGVzdElucHV0IDo9IG1hcFtpbnQzMl1ib29sezE6IHRydWUsIDI6IHRydWUsIDM6IHRydWV9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U2V0KHNldFRlc3RJbnB1dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBzZXRUZXN0SW5wdXQpIHx8IGVyciAhPSBuaWwgeworCXNldFRlc3RJbnB1dCA6PSBbXWludDMyezEsIDIsIDN9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U2V0KGRlZmF1bHRDdHgsIHNldFRlc3RJbnB1dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBzZXRUZXN0SW5wdXQpIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0U2V0IGZhaWxlZCIpCiAJfQogCiAJbGlzdFRlc3QgOj0gW11pbnQzMnsxLCAyLCAzfQotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdExpc3QobGlzdFRlc3QpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbGlzdFRlc3QpIHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdExpc3QoZGVmYXVsdEN0eCwgbGlzdFRlc3QpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbGlzdFRlc3QpIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0TGlzdCBmYWlsZWQiKQogCX0KIAotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEVudW0odGhyaWZ0dGVzdC5OdW1iZXJ6X09ORSk7IHIgIT0gdGhyaWZ0dGVzdC5OdW1iZXJ6X09ORSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKGRlZmF1bHRDdHgsIHRocmlmdHRlc3QuTnVtYmVyel9PTkUpOyByICE9IHRocmlmdHRlc3QuTnVtYmVyel9PTkUgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RFbnVtIGZhaWxlZCIpCiAJfQogCi0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZig2OSk7IHIgIT0gNjkgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCA2OSk7IHIgIT0gNjkgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RUeXBlZGVmIGZhaWxlZCIpCiAJfQogCkBAIC0xODQsNyArMTg0LDcgQEAKIAkJNDogIHsxOiAxLCAyOiAyLCAzOiAzLCA0OiA0fSwKIAkJLTQ6IHstNDogLTQsIC0zOiAtMywgLTI6IC0yLCAtMTogLTF9LAogCX0KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoMSk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBNYXBUZXN0KSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoZGVmYXVsdEN0eCwgMSk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBNYXBUZXN0KSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdE1hcE1hcCBmYWlsZWQiKQogCX0KIApAQCAtMjEyLDI1ICsyMTIsMjUgQEAKIAkJMToge3RocmlmdHRlc3QuTnVtYmVyel9UV086IGNyYXp5LCB0aHJpZnR0ZXN0Lk51bWJlcnpfVEhSRUU6IGNyYXp5fSwKIAkJMjoge3RocmlmdHRlc3QuTnVtYmVyel9TSVg6IGNyYXp5RW1wdHl9LAogCX0KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJbnNhbml0eShjcmF6eSk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBpbnNhbml0eSkgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0SW5zYW5pdHkoZGVmYXVsdEN0eCwgY3JhenkpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgaW5zYW5pdHkpIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0SW5zYW5pdHkgZmFpbGVkIikKIAl9CiAKLQlpZiBlcnIgOj0gY2xpZW50LlRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKTsgZXJyID09IG5pbCB7CisJaWYgZXJyIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJURXhjZXB0aW9uIik7IGVyciA9PSBuaWwgewogCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIFRFeGNlcHRpb24gZmFpbGVkIikKIAl9CiAKLQlpZiBlcnIsIG9rIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpLigqdGhyaWZ0dGVzdC5YY2VwdGlvbik7IG9rID09IGZhbHNlIHx8IGVyciA9PSBuaWwgeworCWlmIGVyciwgb2sgOj0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uIikuKCp0aHJpZnR0ZXN0LlhjZXB0aW9uKTsgb2sgPT0gZmFsc2UgfHwgZXJyID09IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RFeGNlcHRpb24gWGNlcHRpb24gZmFpbGVkIikKIAl9IGVsc2UgaWYgZXJyLkVycm9yQ29kZSAhPSAxMDAxIHx8IGVyci5NZXNzYWdlICE9ICJYY2VwdGlvbiIgewogCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIFhjZXB0aW9uIGZhaWxlZCIpCiAJfQogCi0JaWYgZXJyIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJubyBFeGNlcHRpb24iKTsgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RFeGNlcHRpb24gbm8gRXhjZXB0aW9uIGZhaWxlZCIpCiAJfQogCi0JaWYgZXJyIDo9IGNsaWVudC5UZXN0T25ld2F5KDApOyBlcnIgIT0gbmlsIHsKKwlpZiBlcnIgOj0gY2xpZW50LlRlc3RPbmV3YXkoZGVmYXVsdEN0eCwgMCk7IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0T25ld2F5IGZhaWxlZCIpCiAJfQogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9oYW5kbGVyLmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9oYW5kbGVyLmdvCmluZGV4IDUwZmU3MTguLjMxYjllZTIgMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfaGFuZGxlci5nbworKysgYi9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2hhbmRsZXIuZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgdGVzdHMKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZXJyb3JzIgogCSJ0aHJpZnQiCiAJInRocmlmdHRlc3QiCkBAIC0zMywxMSArMzQsMTEgQEAKIAlyZXR1cm4gJlNlY29uZFNlcnZpY2VIYW5kbGVye30KIH0KIAotZnVuYyAocCAqU2Vjb25kU2VydmljZUhhbmRsZXIpIEJsYWhCbGFoKCkgKGVyciBlcnJvcikgeworZnVuYyAocCAqU2Vjb25kU2VydmljZUhhbmRsZXIpIEJsYWhCbGFoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKIAlyZXR1cm4gbmlsCiB9CiAKLWZ1bmMgKHAgKlNlY29uZFNlcnZpY2VIYW5kbGVyKSBTZWNvbmR0ZXN0U3RyaW5nKHRoaW5nIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlNlY29uZFNlcnZpY2VIYW5kbGVyKSBTZWNvbmR0ZXN0U3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCkBAIC00OCw3MSArNDksNzEgQEAKIAlyZXR1cm4gJlRocmlmdFRlc3RIYW5kbGVye30KIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RWb2lkKCkgKGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RWb2lkKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKIAlyZXR1cm4gbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U3RyaW5nKHRoaW5nIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEJvb2wodGhpbmcgYm9vbCkgKHIgYm9vbCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEJvb2woY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgYm9vbCkgKHIgYm9vbCwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCeXRlKHRoaW5nIGludDgpIChyIGludDgsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCeXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGludDgpIChyIGludDgsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0STMyKHRoaW5nIGludDMyKSAociBpbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEkzMihjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQzMikgKHIgaW50MzIsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0STY0KHRoaW5nIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEk2NChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0RG91YmxlKHRoaW5nIGZsb2F0NjQpIChyIGZsb2F0NjQsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3REb3VibGUoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgZmxvYXQ2NCkgKHIgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCaW5hcnkodGhpbmcgW11ieXRlKSAociBbXWJ5dGUsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCaW5hcnkoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11ieXRlKSAociBbXWJ5dGUsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U3RydWN0KHRoaW5nICp0aHJpZnR0ZXN0Llh0cnVjdCkgKHIgKnRocmlmdHRlc3QuWHRydWN0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U3RydWN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nICp0aHJpZnR0ZXN0Llh0cnVjdCkgKHIgKnRocmlmdHRlc3QuWHRydWN0LCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE5lc3QodGhpbmcgKnRocmlmdHRlc3QuWHRydWN0MikgKHIgKnRocmlmdHRlc3QuWHRydWN0MiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE5lc3QoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgKnRocmlmdHRlc3QuWHRydWN0MikgKHIgKnRocmlmdHRlc3QuWHRydWN0MiwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNYXAodGhpbmcgbWFwW2ludDMyXWludDMyKSAociBtYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgbWFwW2ludDMyXWludDMyKSAociBtYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U3RyaW5nTWFwKHRoaW5nIG1hcFtzdHJpbmddc3RyaW5nKSAociBtYXBbc3RyaW5nXXN0cmluZywgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cmluZ01hcChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBtYXBbc3RyaW5nXXN0cmluZykgKHIgbWFwW3N0cmluZ11zdHJpbmcsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U2V0KHRoaW5nIG1hcFtpbnQzMl1ib29sKSAociBtYXBbaW50MzJdYm9vbCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFNldChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdExpc3QodGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdExpc3QoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RFbnVtKHRoaW5nIHRocmlmdHRlc3QuTnVtYmVyeikgKHIgdGhyaWZ0dGVzdC5OdW1iZXJ6LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0RW51bShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyB0aHJpZnR0ZXN0Lk51bWJlcnopIChyIHRocmlmdHRlc3QuTnVtYmVyeiwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RUeXBlZGVmKHRoaW5nIHRocmlmdHRlc3QuVXNlcklkKSAociB0aHJpZnR0ZXN0LlVzZXJJZCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFR5cGVkZWYoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgdGhyaWZ0dGVzdC5Vc2VySWQpIChyIHRocmlmdHRlc3QuVXNlcklkLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE1hcE1hcChoZWxsbyBpbnQzMikgKHIgbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE1hcE1hcChjdHggY29udGV4dC5Db250ZXh0LCBoZWxsbyBpbnQzMikgKHIgbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CiAJciA9IG1ha2UobWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMikKIAlwb3MgOj0gbWFrZShtYXBbaW50MzJdaW50MzIpCiAJbmVnIDo9IG1ha2UobWFwW2ludDMyXWludDMyKQpAQCAtMTI3LDcgKzEyOCw3IEBACiAJcmV0dXJuIHIsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEluc2FuaXR5KGFyZ3VtZW50ICp0aHJpZnR0ZXN0Lkluc2FuaXR5KSAociBtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEluc2FuaXR5KGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZ3VtZW50ICp0aHJpZnR0ZXN0Lkluc2FuaXR5KSAociBtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSwgZXJyIGVycm9yKSB7CiAJaGVsbG8gOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQogCWhlbGxvLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKIAloZWxsby5CeXRlVGhpbmcgPSAyCkBAIC0xNjIsNyArMTYzLDcgQEAKIAlyZXR1cm4gaW5zYW5lLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNdWx0aShhcmcwIGludDgsIGFyZzEgaW50MzIsIGFyZzIgaW50NjQsIGFyZzMgbWFwW2ludDE2XXN0cmluZywgYXJnNCB0aHJpZnR0ZXN0Lk51bWJlcnosIGFyZzUgdGhyaWZ0dGVzdC5Vc2VySWQpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE11bHRpKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZzAgaW50OCwgYXJnMSBpbnQzMiwgYXJnMiBpbnQ2NCwgYXJnMyBtYXBbaW50MTZdc3RyaW5nLCBhcmc0IHRocmlmdHRlc3QuTnVtYmVyeiwgYXJnNSB0aHJpZnR0ZXN0LlVzZXJJZCkgKHIgKnRocmlmdHRlc3QuWHRydWN0LCBlcnIgZXJyb3IpIHsKIAlyID0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQogCXIuU3RyaW5nVGhpbmcgPSAiSGVsbG8yIgogCXIuQnl0ZVRoaW5nID0gYXJnMApAQCAtMTcxLDcgKzE3Miw3IEBACiAJcmV0dXJuIHIsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEV4Y2VwdGlvbihhcmcgc3RyaW5nKSAoZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEV4Y2VwdGlvbihjdHggY29udGV4dC5Db250ZXh0LCBhcmcgc3RyaW5nKSAoZXJyIGVycm9yKSB7CiAJaWYgYXJnID09ICJYY2VwdGlvbiIgewogCQl4IDo9IHRocmlmdHRlc3QuTmV3WGNlcHRpb24oKQogCQl4LkVycm9yQ29kZSA9IDEwMDEKQEAgLTE4NCw3ICsxODUsNyBAQAogCX0KIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwIHN0cmluZywgYXJnMSBzdHJpbmcpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE11bHRpRXhjZXB0aW9uKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZzAgc3RyaW5nLCBhcmcxIHN0cmluZykgKHIgKnRocmlmdHRlc3QuWHRydWN0LCBlcnIgZXJyb3IpIHsKIAlpZiBhcmcwID09ICJYY2VwdGlvbiIgewogCQl4IDo9IHRocmlmdHRlc3QuTmV3WGNlcHRpb24oKQogCQl4LkVycm9yQ29kZSA9IDEwMDEKQEAgLTIwMyw3ICsyMDQsNyBAQAogCXJldHVybiByZXMsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCBpbnQzMikgKGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RPbmV3YXkoY3R4IGNvbnRleHQuQ29udGV4dCwgc2Vjb25kc1RvU2xlZXAgaW50MzIpIChlcnIgZXJyb3IpIHsKIAl0aW1lLlNsZWVwKHRpbWUuU2Vjb25kICogdGltZS5EdXJhdGlvbihzZWNvbmRzVG9TbGVlcCkpCiAJcmV0dXJuIG5pbAogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fYmluYXJ5X3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9iaW5hcnlfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGFlMmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fYmluYXJ5X3Rlc3QuZ28KQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJInRlc3RpbmciCisJInVuaW9uYmluYXJ5dGVzdCIKKykKKworCisvLyBTZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU3MworZnVuYyBUZXN0VW5pb25CaW5hcnkodCAqdGVzdGluZy5UKSB7CisJcyA6PSB1bmlvbmJpbmFyeXRlc3QuTmV3U2FtcGxlKCkKKwlzLlUxID0gbWFwW3N0cmluZ11zdHJpbmd7fQorCXMuVTIgPSBbXWJ5dGV7fQorCWlmIG4gOj0gcy5Db3VudFNldEZpZWxkc1NhbXBsZSgpOyBuICE9IDIgeworCQl0LkVycm9yZigiRXhwZWN0ZWQgMiBzZXQgZmllbGRzLCBnb3QgJWQhIiwgbikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5nbyBiL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCmluZGV4IDY2NTVjYzUuLmI5ZDdlZWQgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCisrKyBiL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCkBAIC0zMCwxMSArMzAsMjIgQEAKIAlQUk9UT0NPTF9FUlJPUiAgICAgICAgICAgICAgICAgPSA3CiApCiAKK3ZhciBkZWZhdWx0QXBwbGljYXRpb25FeGNlcHRpb25NZXNzYWdlID0gbWFwW2ludDMyXXN0cmluZ3sKKwlVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTjogICJ1bmtub3duIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiIsCisJVU5LTk9XTl9NRVRIT0Q6ICAgICAgICAgICAgICAgICAidW5rbm93biBtZXRob2QiLAorCUlOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTjogImludmFsaWQgbWVzc2FnZSB0eXBlIiwKKwlXUk9OR19NRVRIT0RfTkFNRTogICAgICAgICAgICAgICJ3cm9uZyBtZXRob2QgbmFtZSIsCisJQkFEX1NFUVVFTkNFX0lEOiAgICAgICAgICAgICAgICAiYmFkIHNlcXVlbmNlIElEIiwKKwlNSVNTSU5HX1JFU1VMVDogICAgICAgICAgICAgICAgICJtaXNzaW5nIHJlc3VsdCIsCisJSU5URVJOQUxfRVJST1I6ICAgICAgICAgICAgICAgICAidW5rbm93biBpbnRlcm5hbCBlcnJvciIsCisJUFJPVE9DT0xfRVJST1I6ICAgICAgICAgICAgICAgICAidW5rbm93biBwcm90b2NvbCBlcnJvciIsCit9CisKIC8vIEFwcGxpY2F0aW9uIGxldmVsIFRocmlmdCBleGNlcHRpb24KIHR5cGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGludGVyZmFjZSB7CiAJVEV4Y2VwdGlvbgogCVR5cGVJZCgpIGludDMyCi0JUmVhZChpcHJvdCBUUHJvdG9jb2wpIChUQXBwbGljYXRpb25FeGNlcHRpb24sIGVycm9yKQorCVJlYWQoaXByb3QgVFByb3RvY29sKSBlcnJvcgogCVdyaXRlKG9wcm90IFRQcm90b2NvbCkgZXJyb3IKIH0KIApAQCAtNDQsNyArNTUsMTAgQEAKIH0KIAogZnVuYyAoZSB0QXBwbGljYXRpb25FeGNlcHRpb24pIEVycm9yKCkgc3RyaW5nIHsKLQlyZXR1cm4gZS5tZXNzYWdlCisJaWYgZS5tZXNzYWdlICE9ICIiIHsKKwkJcmV0dXJuIGUubWVzc2FnZQorCX0KKwlyZXR1cm4gZGVmYXVsdEFwcGxpY2F0aW9uRXhjZXB0aW9uTWVzc2FnZVtlLnR5cGVfXQogfQogCiBmdW5jIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlXyBpbnQzMiwgbWVzc2FnZSBzdHJpbmcpIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CkBAIC01NSwxMCArNjksMTEgQEAKIAlyZXR1cm4gcC50eXBlXwogfQogCi1mdW5jIChwICp0QXBwbGljYXRpb25FeGNlcHRpb24pIFJlYWQoaXByb3QgVFByb3RvY29sKSAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBlcnJvcikgeworZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBSZWFkKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCS8vIFRPRE86IHRoaXMgc2hvdWxkIHJlYWxseSBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyCiAJXywgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBuaWwsIGVycgorCQlyZXR1cm4gZXJyCiAJfQogCiAJbWVzc2FnZSA6PSAiIgpAQCAtNjcsNyArODIsNyBAQAogCWZvciB7CiAJCV8sIHR0eXBlLCBpZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkKIAkJaWYgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4gbmlsLCBlcnIKKwkJCXJldHVybiBlcnIKIAkJfQogCQlpZiB0dHlwZSA9PSBTVE9QIHsKIAkJCWJyZWFrCkBAIC03NiwzMyArOTEsNDAgQEAKIAkJY2FzZSAxOgogCQkJaWYgdHR5cGUgPT0gU1RSSU5HIHsKIAkJCQlpZiBtZXNzYWdlLCBlcnIgPSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgewotCQkJCQlyZXR1cm4gbmlsLCBlcnIKKwkJCQkJcmV0dXJuIGVycgogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJaWYgZXJyID0gU2tpcERlZmF1bHREZXB0aChpcHJvdCwgdHR5cGUpOyBlcnIgIT0gbmlsIHsKLQkJCQkJcmV0dXJuIG5pbCwgZXJyCisJCQkJCXJldHVybiBlcnIKIAkJCQl9CiAJCQl9CiAJCWNhc2UgMjoKIAkJCWlmIHR0eXBlID09IEkzMiB7CiAJCQkJaWYgdHlwZV8sIGVyciA9IGlwcm90LlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7Ci0JCQkJCXJldHVybiBuaWwsIGVycgorCQkJCQlyZXR1cm4gZXJyCiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlpZiBlcnIgPSBTa2lwRGVmYXVsdERlcHRoKGlwcm90LCB0dHlwZSk7IGVyciAhPSBuaWwgewotCQkJCQlyZXR1cm4gbmlsLCBlcnIKKwkJCQkJcmV0dXJuIGVycgogCQkJCX0KIAkJCX0KIAkJZGVmYXVsdDoKIAkJCWlmIGVyciA9IFNraXBEZWZhdWx0RGVwdGgoaXByb3QsIHR0eXBlKTsgZXJyICE9IG5pbCB7Ci0JCQkJcmV0dXJuIG5pbCwgZXJyCisJCQkJcmV0dXJuIGVycgogCQkJfQogCQl9CiAJCWlmIGVyciA9IGlwcm90LlJlYWRGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKLQkJCXJldHVybiBuaWwsIGVycgorCQkJcmV0dXJuIGVycgogCQl9CiAJfQotCXJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZV8sIG1lc3NhZ2UpLCBpcHJvdC5SZWFkU3RydWN0RW5kKCkKKwlpZiBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCXAubWVzc2FnZSA9IG1lc3NhZ2UKKwlwLnR5cGVfID0gdHlwZV8KKworCXJldHVybiBuaWwKIH0KIAogZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBXcml0ZShvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl90ZXN0LmdvCmluZGV4IDcwMTBmODYuLjc3NDMzNTcgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9hcHBsaWNhdGlvbl9leGNlcHRpb25fdGVzdC5nbwpAQCAtMjUsMTcgKzI1LDE3IEBACiAKIGZ1bmMgVGVzdFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0ICp0ZXN0aW5nLlQpIHsKIAlleGMgOj0gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKFVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OLCAiIikKLQlpZiBleGMuRXJyb3IoKSAhPSAiIiB7CisJaWYgZXhjLkVycm9yKCkgIT0gZGVmYXVsdEFwcGxpY2F0aW9uRXhjZXB0aW9uTWVzc2FnZVtVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl0gewogCQl0LkZhdGFsZigiRXhwZWN0ZWQgZW1wdHkgc3RyaW5nIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICclcyciLCBleGMuRXJyb3IoKSkKIAl9CiAJaWYgZXhjLlR5cGVJZCgpICE9IFVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OIHsKLQkJdC5GYXRhbGYoIkV4cGVjdGVkIHR5cGUgVU5LTk9XTiBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLlR5cGVJZCgpKQorCQl0LkZhdGFsZigiRXhwZWN0ZWQgdHlwZSBVTktOT1dOIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICcldiciLCBleGMuVHlwZUlkKCkpCiAJfQogCWV4YyA9IE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihXUk9OR19NRVRIT0RfTkFNRSwgImp1bmtfbWV0aG9kIikKIAlpZiBleGMuRXJyb3IoKSAhPSAianVua19tZXRob2QiIHsKIAkJdC5GYXRhbGYoIkV4cGVjdGVkICdqdW5rX21ldGhvZCcgZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyVzJyIsIGV4Yy5FcnJvcigpKQogCX0KIAlpZiBleGMuVHlwZUlkKCkgIT0gV1JPTkdfTUVUSE9EX05BTUUgewotCQl0LkZhdGFsZigiRXhwZWN0ZWQgdHlwZSBXUk9OR19NRVRIT0RfTkFNRSBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLlR5cGVJZCgpKQorCQl0LkZhdGFsZigiRXhwZWN0ZWQgdHlwZSBXUk9OR19NRVRIT0RfTkFNRSBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXYnIiwgZXhjLlR5cGVJZCgpKQogCX0KIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28KaW5kZXggZTFiNDA1Ni4uMWY5MGJmNCAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28KKysrIGIvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28KQEAgLTIwLDYgKzIwLDggQEAKIHBhY2thZ2UgdGhyaWZ0CiAKIGltcG9ydCAoCisJImJ5dGVzIgorCSJjb250ZXh0IgogCSJlbmNvZGluZy9iaW5hcnkiCiAJImVycm9ycyIKIAkiZm10IgpAQCAtNDQ2LDkgKzQ0OCw2IEBACiAJaWYgc2l6ZSA8IDAgewogCQlyZXR1cm4gbmlsLCBpbnZhbGlkRGF0YUxlbmd0aAogCX0KLQlpZiB1aW50NjQoc2l6ZSkgPiBwLnRyYW5zLlJlbWFpbmluZ0J5dGVzKCkgewotCQlyZXR1cm4gbmlsLCBpbnZhbGlkRGF0YUxlbmd0aAotCX0KIAogCWlzaXplIDo9IGludChzaXplKQogCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgaXNpemUpCkBAIC00NTYsOCArNDU1LDggQEAKIAlyZXR1cm4gYnVmLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQogfQogCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIEZsdXNoKCkgKGVyciBlcnJvcikgewotCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24ocC50cmFucy5GbHVzaCgpKQorZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLnRyYW5zLkZsdXNoKGN0eCkpCiB9CiAKIGZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgU2tpcChmaWVsZFR5cGUgVFR5cGUpIChlcnIgZXJyb3IpIHsKQEAgLTQ3MywxOSArNDcyLDM4IEBACiAJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCiB9CiAKK2NvbnN0IHJlYWRMaW1pdCA9IDMyNzY4CisKIGZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgcmVhZFN0cmluZ0JvZHkoc2l6ZSBpbnQzMikgKHZhbHVlIHN0cmluZywgZXJyIGVycm9yKSB7CiAJaWYgc2l6ZSA8IDAgewogCQlyZXR1cm4gIiIsIG5pbAogCX0KLQlpZiB1aW50NjQoc2l6ZSkgPiBwLnRyYW5zLlJlbWFpbmluZ0J5dGVzKCkgewotCQlyZXR1cm4gIiIsIGludmFsaWREYXRhTGVuZ3RoCisKKwl2YXIgKAorCQlidWYgYnl0ZXMuQnVmZmVyCisJCWUgICBlcnJvcgorCQliICAgW11ieXRlCisJKQorCisJc3dpdGNoIHsKKwljYXNlIGludChzaXplKSA8PSBsZW4ocC5idWZmZXIpOgorCQliID0gcC5idWZmZXJbOnNpemVdIC8vIGF2b2lkcyBhbGxvY2F0aW9uIGZvciBzbWFsbCByZWFkcworCWNhc2UgaW50KHNpemUpIDwgcmVhZExpbWl0OgorCQliID0gbWFrZShbXWJ5dGUsIHNpemUpCisJZGVmYXVsdDoKKwkJYiA9IG1ha2UoW11ieXRlLCByZWFkTGltaXQpCiAJfQotCXZhciBidWYgW11ieXRlCi0JaWYgaW50KHNpemUpIDw9IGxlbihwLmJ1ZmZlcikgewotCQlidWYgPSBwLmJ1ZmZlclswOnNpemVdCi0JfSBlbHNlIHsKLQkJYnVmID0gbWFrZShbXWJ5dGUsIHNpemUpCisKKwlmb3Igc2l6ZSA+IDAgeworCQlfLCBlID0gaW8uUmVhZEZ1bGwocC50cmFucywgYikKKwkJYnVmLldyaXRlKGIpCisJCWlmIGUgIT0gbmlsIHsKKwkJCWJyZWFrCisJCX0KKwkJc2l6ZSAtPSByZWFkTGltaXQKKwkJaWYgc2l6ZSA8IHJlYWRMaW1pdCAmJiBzaXplID4gMCB7CisJCQliID0gYls6c2l6ZV0KKwkJfQogCX0KLQlfLCBlIDo9IGlvLlJlYWRGdWxsKHAudHJhbnMsIGJ1ZikKLQlyZXR1cm4gc3RyaW5nKGJ1ZiksIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCXJldHVybiBidWYuU3RyaW5nKCksIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5nbwppbmRleCA4YmNhZDFlLi45NjcwMjA2IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5nbworKysgYi9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5nbwpAQCAtMjEsNiArMjEsNyBAQAogCiBpbXBvcnQgKAogCSJidWZpbyIKKwkiY29udGV4dCIKICkKIAogdHlwZSBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7CkBAIC0zMiw4ICszMyw4IEBACiAJdHAgVFRyYW5zcG9ydAogfQogCi1mdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7Ci0JcmV0dXJuIE5ld1RCdWZmZXJlZFRyYW5zcG9ydCh0cmFucywgcC5zaXplKQorZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMsIHAuc2l6ZSksIG5pbAogfQogCiBmdW5jIE5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoYnVmZmVyU2l6ZSBpbnQpICpUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IHsKQEAgLTYyLDE0ICs2MywzMCBAQAogCXJldHVybiBwLnRwLkNsb3NlKCkKIH0KIAotZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgUmVhZChiIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwluLCBlcnIgOj0gcC5SZWFkV3JpdGVyLlJlYWQoYikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcC5SZWFkV3JpdGVyLlJlYWRlci5SZXNldChwLnRwKQorCX0KKwlyZXR1cm4gbiwgZXJyCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgV3JpdGUoYiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAuUmVhZFdyaXRlci5Xcml0ZShiKQorCWlmIGVyciAhPSBuaWwgeworCQlwLlJlYWRXcml0ZXIuV3JpdGVyLlJlc2V0KHAudHApCisJfQorCXJldHVybiBuLCBlcnIKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CiAJaWYgZXJyIDo9IHAuUmVhZFdyaXRlci5GbHVzaCgpOyBlcnIgIT0gbmlsIHsKKwkJcC5SZWFkV3JpdGVyLldyaXRlci5SZXNldChwLnRwKQogCQlyZXR1cm4gZXJyCiAJfQotCXJldHVybiBwLnRwLkZsdXNoKCkKKwlyZXR1cm4gcC50cC5GbHVzaChjdHgpCiB9CiAKIGZ1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgewogCXJldHVybiBwLnRwLlJlbWFpbmluZ0J5dGVzKCkKIH0KLQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jbGllbnQuZ28gYi9saWIvZ28vdGhyaWZ0L2NsaWVudC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODc5MWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9jbGllbnQuZ28KQEAgLTAsMCArMSw4NSBAQAorcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorKQorCit0eXBlIFRDbGllbnQgaW50ZXJmYWNlIHsKKwlDYWxsKGN0eCBjb250ZXh0LkNvbnRleHQsIG1ldGhvZCBzdHJpbmcsIGFyZ3MsIHJlc3VsdCBUU3RydWN0KSBlcnJvcgorfQorCit0eXBlIFRTdGFuZGFyZENsaWVudCBzdHJ1Y3QgeworCXNlcUlkICAgICAgICBpbnQzMgorCWlwcm90LCBvcHJvdCBUUHJvdG9jb2wKK30KKworLy8gVFN0YW5kYXJkQ2xpZW50IGltcGxlbWVudHMgVENsaWVudCwgYW5kIHVzZXMgdGhlIHN0YW5kYXJkIG1lc3NhZ2UgZm9ybWF0IGZvciBUaHJpZnQuCisvLyBJdCBpcyBub3Qgc2FmZSBmb3IgY29uY3VycmVudCB1c2UuCitmdW5jIE5ld1RTdGFuZGFyZENsaWVudChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCBUUHJvdG9jb2wpICpUU3RhbmRhcmRDbGllbnQgeworCXJldHVybiAmVFN0YW5kYXJkQ2xpZW50eworCQlpcHJvdDogaW5wdXRQcm90b2NvbCwKKwkJb3Byb3Q6IG91dHB1dFByb3RvY29sLAorCX0KK30KKworZnVuYyAocCAqVFN0YW5kYXJkQ2xpZW50KSBTZW5kKGN0eCBjb250ZXh0LkNvbnRleHQsIG9wcm90IFRQcm90b2NvbCwgc2VxSWQgaW50MzIsIG1ldGhvZCBzdHJpbmcsIGFyZ3MgVFN0cnVjdCkgZXJyb3IgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihtZXRob2QsIENBTEwsIHNlcUlkKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IGFyZ3MuV3JpdGUob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXJldHVybiBvcHJvdC5GbHVzaChjdHgpCit9CisKK2Z1bmMgKHAgKlRTdGFuZGFyZENsaWVudCkgUmVjdihpcHJvdCBUUHJvdG9jb2wsIHNlcUlkIGludDMyLCBtZXRob2Qgc3RyaW5nLCByZXN1bHQgVFN0cnVjdCkgZXJyb3IgeworCXJNZXRob2QsIHJUeXBlSWQsIHJTZXFJZCwgZXJyIDo9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJaWYgbWV0aG9kICE9IHJNZXRob2QgeworCQlyZXR1cm4gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKFdST05HX01FVEhPRF9OQU1FLCBmbXQuU3ByaW50ZigiJXM6IHdyb25nIG1ldGhvZCBuYW1lIiwgbWV0aG9kKSkKKwl9IGVsc2UgaWYgc2VxSWQgIT0gclNlcUlkIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihCQURfU0VRVUVOQ0VfSUQsIGZtdC5TcHJpbnRmKCIlczogb3V0IG9mIG9yZGVyIHNlcXVlbmNlIHJlc3BvbnNlIiwgbWV0aG9kKSkKKwl9IGVsc2UgaWYgclR5cGVJZCA9PSBFWENFUFRJT04geworCQl2YXIgZXhjZXB0aW9uIHRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorCQlpZiBlcnIgOj0gZXhjZXB0aW9uLlJlYWQoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCisJCWlmIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCisJCXJldHVybiAmZXhjZXB0aW9uCisJfSBlbHNlIGlmIHJUeXBlSWQgIT0gUkVQTFkgeworCQlyZXR1cm4gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKElOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiwgZm10LlNwcmludGYoIiVzOiBpbnZhbGlkIG1lc3NhZ2UgdHlwZSIsIG1ldGhvZCkpCisJfQorCisJaWYgZXJyIDo9IHJlc3VsdC5SZWFkKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisKKwlyZXR1cm4gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKQorfQorCitmdW5jIChwICpUU3RhbmRhcmRDbGllbnQpIENhbGwoY3R4IGNvbnRleHQuQ29udGV4dCwgbWV0aG9kIHN0cmluZywgYXJncywgcmVzdWx0IFRTdHJ1Y3QpIGVycm9yIHsKKwlwLnNlcUlkKysKKwlzZXFJZCA6PSBwLnNlcUlkCisKKwlpZiBlcnIgOj0gcC5TZW5kKGN0eCwgcC5vcHJvdCwgc2VxSWQsIG1ldGhvZCwgYXJncyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJLy8gbWV0aG9kIGlzIG9uZXdheQorCWlmIHJlc3VsdCA9PSBuaWwgeworCQlyZXR1cm4gbmlsCisJfQorCisJcmV0dXJuIHAuUmVjdihwLmlwcm90LCBzZXFJZCwgbWV0aG9kLCByZXN1bHQpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2NvbW1vbl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9jb21tb25fdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzU5N2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9jb21tb25fdGVzdC5nbwpAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAiY29udGV4dCIKKwordHlwZSBtb2NrUHJvY2Vzc29yIHN0cnVjdCB7CisJUHJvY2Vzc0Z1bmMgZnVuYyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pCit9CisKK2Z1bmMgKG0gKm1vY2tQcm9jZXNzb3IpIFByb2Nlc3MoY3R4IGNvbnRleHQuQ29udGV4dCwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CisJcmV0dXJuIG0uUHJvY2Vzc0Z1bmMoaW4sIG91dCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5nbwppbmRleCAwYmM1ZmRkLi4xOTAwZDUwIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28KKysrIGIvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJlbmNvZGluZy9iaW5hcnkiCiAJImZtdCIKIAkiaW8iCkBAIC01NjEsOSArNTYyLDYgQEAKIAlpZiBsZW5ndGggPCAwIHsKIAkJcmV0dXJuICIiLCBpbnZhbGlkRGF0YUxlbmd0aAogCX0KLQlpZiB1aW50NjQobGVuZ3RoKSA+IHAudHJhbnMuUmVtYWluaW5nQnl0ZXMoKSB7Ci0JCXJldHVybiAiIiwgaW52YWxpZERhdGFMZW5ndGgKLQl9CiAKIAlpZiBsZW5ndGggPT0gMCB7CiAJCXJldHVybiAiIiwgbmlsCkBAIC01OTAsMTcgKzU4OCwxNCBAQAogCWlmIGxlbmd0aCA8IDAgewogCQlyZXR1cm4gbmlsLCBpbnZhbGlkRGF0YUxlbmd0aAogCX0KLQlpZiB1aW50NjQobGVuZ3RoKSA+IHAudHJhbnMuUmVtYWluaW5nQnl0ZXMoKSB7Ci0JCXJldHVybiBuaWwsIGludmFsaWREYXRhTGVuZ3RoCi0JfQogCiAJYnVmIDo9IG1ha2UoW11ieXRlLCBsZW5ndGgpCiAJXywgZSA9IGlvLlJlYWRGdWxsKHAudHJhbnMsIGJ1ZikKIAlyZXR1cm4gYnVmLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIH0KIAotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgRmx1c2goKSAoZXJyIGVycm9yKSB7Ci0JcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLnRyYW5zLkZsdXNoKCkpCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLnRyYW5zLkZsdXNoKGN0eCkpCiB9CiAKIGZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIGVycm9yKSB7CkBAIC04MDYsNyArODAxLDcgQEAKIAljYXNlIENPTVBBQ1RfU1RSVUNUOgogCQlyZXR1cm4gU1RSVUNULCBuaWwKIAl9Ci0JcmV0dXJuIFNUT1AsIFRFeGNlcHRpb24oZm10LkVycm9yZigiZG9uJ3Qga25vdyB3aGF0IHR5cGU6ICVzIiwgdCYweDBmKSkKKwlyZXR1cm4gU1RPUCwgVEV4Y2VwdGlvbihmbXQuRXJyb3JmKCJkb24ndCBrbm93IHdoYXQgdHlwZTogJXYiLCB0JjB4MGYpKQogfQogCiAvLyBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2xfdGVzdC5nbwppbmRleCA3MjgxMmY5Li42NWY3N2YyIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2xfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2xfdGVzdC5nbwpAQCAtMjYsMjggKzI2LDM1IEBACiAKIGZ1bmMgVGVzdFJlYWRXcml0ZUNvbXBhY3RQcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKIAlSZWFkV3JpdGVQcm90b2NvbFRlc3QodCwgTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKLQkgICB0cmFuc3BvcnRzIDo9IFtdVFRyYW5zcG9ydHsKLQkgICAgIE5ld1RNZW1vcnlCdWZmZXIoKSwKLQkgICAgIE5ld1N0cmVhbVRyYW5zcG9ydFJXKGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTYzODQpKSksCi0JICAgICBOZXdURnJhbWVkVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSksCi0JICAgfQotCSAgIGZvciBfLCB0cmFucyA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLQkgICAgIHAgOj0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0JICAgICBSZWFkV3JpdGVCb29sKHQsIHAsIHRyYW5zKTsKLQkgICAgIHAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKLQkgICAgIFJlYWRXcml0ZUJ5dGUodCwgcCwgdHJhbnMpOwotCSAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotCSAgICAgUmVhZFdyaXRlSTE2KHQsIHAsIHRyYW5zKTsKLQkgICAgIHAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKLQkgICAgIFJlYWRXcml0ZUkzMih0LCBwLCB0cmFucyk7Ci0JICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0JICAgICBSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpOwotCSAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotCSAgICAgUmVhZFdyaXRlRG91YmxlKHQsIHAsIHRyYW5zKTsKLQkgICAgIHAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKLQkgICAgIFJlYWRXcml0ZVN0cmluZyh0LCBwLCB0cmFucyk7Ci0JICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0JICAgICBSZWFkV3JpdGVCaW5hcnkodCwgcCwgdHJhbnMpOwotCSAgICAgdHJhbnMuQ2xvc2UoKTsKLQkgICB9CisKKwl0cmFuc3BvcnRzIDo9IFtdVFRyYW5zcG9ydHsKKwkJTmV3VE1lbW9yeUJ1ZmZlcigpLAorCQlOZXdTdHJlYW1UcmFuc3BvcnRSVyhieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDE2Mzg0KSkpLAorCQlOZXdURnJhbWVkVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSksCisJfQorCisJemxpYjAsIF8gOj0gTmV3VFpsaWJUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpLCAwKQorCXpsaWI2LCBfIDo9IE5ld1RabGliVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSwgNikKKwl6bGliOSwgXyA6PSBOZXdUWmxpYlRyYW5zcG9ydChOZXdURnJhbWVkVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSksIDkpCisJdHJhbnNwb3J0cyA9IGFwcGVuZCh0cmFuc3BvcnRzLCB6bGliMCwgemxpYjYsIHpsaWI5KQorCisJZm9yIF8sIHRyYW5zIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQlwIDo9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJvb2wodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCeXRlKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlSTE2KHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlSTMyKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlSTY0KHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlRG91YmxlKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlU3RyaW5nKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQmluYXJ5KHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jb250ZXh0LmdvIGIvbGliL2dvL3RocmlmdC9jb250ZXh0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNWMxYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2NvbnRleHQuZ28KQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgImNvbnRleHQiCisKK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZGVidWdfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2RlYnVnX3Byb3RvY29sLmdvCmluZGV4IGQzNzI1MmMuLjU3OTQzZTAgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvZGVidWdfcHJvdG9jb2wuZ28KKysrIGIvbGliL2dvL3RocmlmdC9kZWJ1Z19wcm90b2NvbC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkibG9nIgogKQogCkBAIC0yNTgsOCArMjU5LDggQEAKIAlsb2cuUHJpbnRmKCIlc1NraXAoZmllbGRUeXBlPSUjdikgKGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgZmllbGRUeXBlLCBlcnIpCiAJcmV0dXJuCiB9Ci1mdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBGbHVzaCgpIChlcnIgZXJyb3IpIHsKLQllcnIgPSB0ZHAuRGVsZWdhdGUuRmx1c2goKQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5GbHVzaChjdHgpCiAJbG9nLlByaW50ZigiJXNGbHVzaCgpIChlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIGVycikKIAlyZXR1cm4KIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5nbwppbmRleCBkMGJhZTIxLi44MWZhNjVhIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmdvCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgKAogCSJidWZpbyIKIAkiYnl0ZXMiCisJImNvbnRleHQiCiAJImVuY29kaW5nL2JpbmFyeSIKIAkiZm10IgogCSJpbyIKQEAgLTQ4LDExICs0OSwxNSBAQAogfQogCiBmdW5jIE5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5TWF4TGVuZ3RoKGZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIG1heExlbmd0aCB1aW50MzIpIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSAgICAgICAgcmV0dXJuICZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeXtmYWN0b3J5OiBmYWN0b3J5LCBtYXhMZW5ndGg6IG1heExlbmd0aH0KKwlyZXR1cm4gJnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5e2ZhY3Rvcnk6IGZhY3RvcnksIG1heExlbmd0aDogbWF4TGVuZ3RofQogfQogCi1mdW5jIChwICp0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KGJhc2UgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7Ci0JcmV0dXJuIE5ld1RGcmFtZWRUcmFuc3BvcnRNYXhMZW5ndGgocC5mYWN0b3J5LkdldFRyYW5zcG9ydChiYXNlKSwgcC5tYXhMZW5ndGgpCitmdW5jIChwICp0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KGJhc2UgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJdHQsIGVyciA6PSBwLmZhY3RvcnkuR2V0VHJhbnNwb3J0KGJhc2UpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlyZXR1cm4gTmV3VEZyYW1lZFRyYW5zcG9ydE1heExlbmd0aCh0dCwgcC5tYXhMZW5ndGgpLCBuaWwKIH0KIAogZnVuYyBOZXdURnJhbWVkVHJhbnNwb3J0KHRyYW5zcG9ydCBUVHJhbnNwb3J0KSAqVEZyYW1lZFRyYW5zcG9ydCB7CkBAIC0xMzEsMjEgKzEzNiwyMyBAQAogCXJldHVybiBwLmJ1Zi5Xcml0ZVN0cmluZyhzKQogfQogCi1mdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKIAlzaXplIDo9IHAuYnVmLkxlbigpCiAJYnVmIDo9IHAuYnVmZmVyWzo0XQogCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDMyKGJ1ZiwgdWludDMyKHNpemUpKQogCV8sIGVyciA6PSBwLnRyYW5zcG9ydC5Xcml0ZShidWYpCiAJaWYgZXJyICE9IG5pbCB7CisJCXAuYnVmLlRydW5jYXRlKDApCiAJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKIAl9CiAJaWYgc2l6ZSA+IDAgewogCQlpZiBuLCBlcnIgOj0gcC5idWYuV3JpdGVUbyhwLnRyYW5zcG9ydCk7IGVyciAhPSBuaWwgewogCQkJcHJpbnQoIkVycm9yIHdoaWxlIGZsdXNoaW5nIHdyaXRlIGJ1ZmZlciBvZiBzaXplICIsIHNpemUsICIgdG8gdHJhbnNwb3J0LCBvbmx5IHdyb3RlICIsIG4sICIgYnl0ZXM6ICIsIGVyci5FcnJvcigpLCAiXG4iKQorCQkJcC5idWYuVHJ1bmNhdGUoMCkKIAkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKIAkJfQogCX0KLQllcnIgPSBwLnRyYW5zcG9ydC5GbHVzaCgpCisJZXJyID0gcC50cmFuc3BvcnQuRmx1c2goY3R4KQogCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKIH0KIApAQCAtMTY0LDQgKzE3MSwzIEBACiBmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CiAJcmV0dXJuIHVpbnQ2NChwLmZyYW1lU2l6ZSkKIH0KLQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudC5nbyBiL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnQuZ28KaW5kZXggYmYwZWQ2Mi4uNWM4MmJmNSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudC5nbworKysgYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50LmdvCkBAIC0yMSwxMyArMjEsMjEgQEAKIAogaW1wb3J0ICgKIAkiYnl0ZXMiCisJImNvbnRleHQiCiAJImlvIgorCSJpby9pb3V0aWwiCiAJIm5ldC9odHRwIgogCSJuZXQvdXJsIgogCSJzdHJjb252IgogKQogCisvLyBEZWZhdWx0IHRvIHVzaW5nIHRoZSBzaGFyZWQgaHR0cCBjbGllbnQuIExpYnJhcnkgdXNlcnMgYXJlCisvLyBmcmVlIHRvIGNoYW5nZSB0aGlzIGdsb2JhbCBjbGllbnQgb3Igc3BlY2lmeSBvbmUgdGhyb3VnaAorLy8gVEh0dHBDbGllbnRPcHRpb25zLgordmFyIERlZmF1bHRIdHRwQ2xpZW50ICpodHRwLkNsaWVudCA9IGh0dHAuRGVmYXVsdENsaWVudAorCiB0eXBlIFRIdHRwQ2xpZW50IHN0cnVjdCB7CisJY2xpZW50ICAgICAgICAgICAgICpodHRwLkNsaWVudAogCXJlc3BvbnNlICAgICAgICAgICAqaHR0cC5SZXNwb25zZQogCXVybCAgICAgICAgICAgICAgICAqdXJsLlVSTAogCXJlcXVlc3RCdWZmZXIgICAgICAqYnl0ZXMuQnVmZmVyCkBAIC0zNyw1NyArNDUsNDkgQEAKIH0KIAogdHlwZSBUSHR0cENsaWVudFRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKLQl1cmwgICAgc3RyaW5nCi0JaXNQb3N0IGJvb2wKKwlvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucworCXVybCAgICAgc3RyaW5nCiB9CiAKLWZ1bmMgKHAgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQgeworZnVuYyAocCAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CiAJaWYgdHJhbnMgIT0gbmlsIHsKIAkJdCwgb2sgOj0gdHJhbnMuKCpUSHR0cENsaWVudCkKIAkJaWYgb2sgJiYgdC51cmwgIT0gbmlsIHsKLQkJCWlmIHQucmVxdWVzdEJ1ZmZlciAhPSBuaWwgewotCQkJCXQyLCBfIDo9IE5ld1RIdHRwUG9zdENsaWVudCh0LnVybC5TdHJpbmcoKSkKLQkJCQlyZXR1cm4gdDIKLQkJCX0KLQkJCXQyLCBfIDo9IE5ld1RIdHRwQ2xpZW50KHQudXJsLlN0cmluZygpKQotCQkJcmV0dXJuIHQyCisJCQlyZXR1cm4gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh0LnVybC5TdHJpbmcoKSwgcC5vcHRpb25zKQogCQl9CiAJfQotCWlmIHAuaXNQb3N0IHsKLQkJcywgXyA6PSBOZXdUSHR0cFBvc3RDbGllbnQocC51cmwpCi0JCXJldHVybiBzCi0JfQotCXMsIF8gOj0gTmV3VEh0dHBDbGllbnQocC51cmwpCi0JcmV0dXJuIHMKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyhwLnVybCwgcC5vcHRpb25zKQorfQorCit0eXBlIFRIdHRwQ2xpZW50T3B0aW9ucyBzdHJ1Y3QgeworCS8vIElmIG5pbCwgRGVmYXVsdEh0dHBDbGllbnQgaXMgdXNlZAorCUNsaWVudCAqaHR0cC5DbGllbnQKIH0KIAogZnVuYyBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkodXJsIHN0cmluZykgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSB7Ci0JcmV0dXJuICZUSHR0cENsaWVudFRyYW5zcG9ydEZhY3Rvcnl7dXJsOiB1cmwsIGlzUG9zdDogZmFsc2V9CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCwgVEh0dHBDbGllbnRPcHRpb25ze30pCiB9CiAKLWZ1bmMgTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeSh1cmwgc3RyaW5nKSAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKLQlyZXR1cm4gJlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeXt1cmw6IHVybCwgaXNQb3N0OiB0cnVlfQorZnVuYyBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZUSHR0cENsaWVudFRyYW5zcG9ydEZhY3Rvcnl7dXJsOiB1cmwsIG9wdGlvbnM6IG9wdGlvbnN9CiB9CiAKLWZ1bmMgTmV3VEh0dHBDbGllbnQodXJsc3RyIHN0cmluZykgKFRUcmFuc3BvcnQsIGVycm9yKSB7Ci0JcGFyc2VkVVJMLCBlcnIgOj0gdXJsLlBhcnNlKHVybHN0cikKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgZXJyCi0JfQotCXJlc3BvbnNlLCBlcnIgOj0gaHR0cC5HZXQodXJsc3RyKQotCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4gbmlsLCBlcnIKLQl9Ci0JcmV0dXJuICZUSHR0cENsaWVudHtyZXNwb25zZTogcmVzcG9uc2UsIHVybDogcGFyc2VkVVJMfSwgbmlsCi19Ci0KLWZ1bmMgTmV3VEh0dHBQb3N0Q2xpZW50KHVybHN0ciBzdHJpbmcpIChUVHJhbnNwb3J0LCBlcnJvcikgeworZnVuYyBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciBzdHJpbmcsIG9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKIAlwYXJzZWRVUkwsIGVyciA6PSB1cmwuUGFyc2UodXJsc3RyKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gbmlsLCBlcnIKIAl9CiAJYnVmIDo9IG1ha2UoW11ieXRlLCAwLCAxMDI0KQotCXJldHVybiAmVEh0dHBDbGllbnR7dXJsOiBwYXJzZWRVUkwsIHJlcXVlc3RCdWZmZXI6IGJ5dGVzLk5ld0J1ZmZlcihidWYpLCBoZWFkZXI6IGh0dHAuSGVhZGVye319LCBuaWwKKwljbGllbnQgOj0gb3B0aW9ucy5DbGllbnQKKwlpZiBjbGllbnQgPT0gbmlsIHsKKwkJY2xpZW50ID0gRGVmYXVsdEh0dHBDbGllbnQKKwl9CisJaHR0cEhlYWRlciA6PSBtYXBbc3RyaW5nXVtdc3RyaW5neyJDb250ZW50LVR5cGUiOiB7ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In19CisJcmV0dXJuICZUSHR0cENsaWVudHtjbGllbnQ6IGNsaWVudCwgdXJsOiBwYXJzZWRVUkwsIHJlcXVlc3RCdWZmZXI6IGJ5dGVzLk5ld0J1ZmZlcihidWYpLCBoZWFkZXI6IGh0dHBIZWFkZXJ9LCBuaWwKK30KKworZnVuYyBOZXdUSHR0cENsaWVudCh1cmxzdHIgc3RyaW5nKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQogfQogCiAvLyBTZXQgdGhlIEhUVFAgSGVhZGVyIGZvciB0aGlzIHNwZWNpZmljIFRocmlmdCBUcmFuc3BvcnQKQEAgLTEzMiw2ICsxMzIsMTMgQEAKIGZ1bmMgKHAgKlRIdHRwQ2xpZW50KSBjbG9zZVJlc3BvbnNlKCkgZXJyb3IgewogCXZhciBlcnIgZXJyb3IKIAlpZiBwLnJlc3BvbnNlICE9IG5pbCAmJiBwLnJlc3BvbnNlLkJvZHkgIT0gbmlsIHsKKwkJLy8gVGhlIGRvY3Mgc3BlY2lmeSB0aGF0IGlmIGtlZXBhbGl2ZSBpcyBlbmFibGVkIGFuZCB0aGUgcmVzcG9uc2UgYm9keSBpcyBub3QKKwkJLy8gcmVhZCB0byBjb21wbGV0aW9uIHRoZSBjb25uZWN0aW9uIHdpbGwgbmV2ZXIgYmUgcmV0dXJuZWQgdG8gdGhlIHBvb2wgYW5kCisJCS8vIHJldXNlZC4gRXJyb3JzIGFyZSBiZWluZyBpZ25vcmVkIGhlcmUgYmVjYXVzZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBpbnZhbGlkCisJCS8vIGFuZCB0aGlzIGZhaWxzIGZvciBzb21lIHJlYXNvbiwgdGhlIENsb3NlKCkgbWV0aG9kIHdpbGwgZG8gYW55IHJlbWFpbmluZworCQkvLyBjbGVhbnVwLgorCQlpby5Db3B5KGlvdXRpbC5EaXNjYXJkLCBwLnJlc3BvbnNlLkJvZHkpCisKIAkJZXJyID0gcC5yZXNwb25zZS5Cb2R5LkNsb3NlKCkKIAl9CiAKQEAgLTE3NSwyNCArMTgyLDI4IEBACiAJcmV0dXJuIHAucmVxdWVzdEJ1ZmZlci5Xcml0ZVN0cmluZyhzKQogfQogCi1mdW5jIChwICpUSHR0cENsaWVudCkgRmx1c2goKSBlcnJvciB7CitmdW5jIChwICpUSHR0cENsaWVudCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgewogCS8vIENsb3NlIGFueSBwcmV2aW91cyByZXNwb25zZSBib2R5IHRvIGF2b2lkIGxlYWtpbmcgY29ubmVjdGlvbnMuCiAJcC5jbG9zZVJlc3BvbnNlKCkKIAotCWNsaWVudCA6PSAmaHR0cC5DbGllbnR7fQogCXJlcSwgZXJyIDo9IGh0dHAuTmV3UmVxdWVzdCgiUE9TVCIsIHAudXJsLlN0cmluZygpLCBwLnJlcXVlc3RCdWZmZXIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKIAl9Ci0JcC5oZWFkZXIuQWRkKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQogCXJlcS5IZWFkZXIgPSBwLmhlYWRlcgotCXJlc3BvbnNlLCBlcnIgOj0gY2xpZW50LkRvKHJlcSkKKwlpZiBjdHggIT0gbmlsIHsKKwkJcmVxID0gcmVxLldpdGhDb250ZXh0KGN0eCkKKwl9CisJcmVzcG9uc2UsIGVyciA6PSBwLmNsaWVudC5EbyhyZXEpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKIAl9CiAJaWYgcmVzcG9uc2UuU3RhdHVzQ29kZSAhPSBodHRwLlN0YXR1c09LIHsKLQkJLy8gQ2xvc2UgdGhlIHJlc3BvbnNlIHRvIGF2b2lkIGxlYWtpbmcgZmlsZSBkZXNjcmlwdG9ycy4KLQkJcmVzcG9uc2UuQm9keS5DbG9zZSgpCisJCS8vIENsb3NlIHRoZSByZXNwb25zZSB0byBhdm9pZCBsZWFraW5nIGZpbGUgZGVzY3JpcHRvcnMuIGNsb3NlUmVzcG9uc2UgZG9lcworCQkvLyBtb3JlIHRoYW4ganVzdCBjYWxsIENsb3NlKCksIHNvIHRlbXBvcmFyaWx5IGFzc2lnbiBpdCBhbmQgcmV1c2UgdGhlIGxvZ2ljLgorCQlwLnJlc3BvbnNlID0gcmVzcG9uc2UKKwkJcC5jbG9zZVJlc3BvbnNlKCkKKwogCQkvLyBUT0RPKHBvbWFjaykgbG9nIGJhZCByZXNwb25zZQogCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sICJIVFRQIFJlc3BvbnNlIGNvZGU6ICIrc3RyY29udi5JdG9hKHJlc3BvbnNlLlN0YXR1c0NvZGUpKQogCX0KQEAgLTIwMSwxMiArMjEyLDMxIEBACiB9CiAKIGZ1bmMgKHAgKlRIdHRwQ2xpZW50KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7Ci0JbGVuIDo9IHAucmVzcG9uc2UuQ29udGVudExlbmd0aCAKKwlsZW4gOj0gcC5yZXNwb25zZS5Db250ZW50TGVuZ3RoCiAJaWYgbGVuID49IDAgewogCQlyZXR1cm4gdWludDY0KGxlbikKIAl9Ci0JCisKIAljb25zdCBtYXhTaXplID0gXnVpbnQ2NCgwKQotCXJldHVybiBtYXhTaXplICAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAogfQogCisvLyBEZXByZWNhdGVkOiBVc2UgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IGluc3RlYWQuCitmdW5jIE5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnkodXJsIHN0cmluZykgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCwgVEh0dHBDbGllbnRPcHRpb25ze30pCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyBpbnN0ZWFkLgorZnVuYyBOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsIHN0cmluZywgb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwsIG9wdGlvbnMpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zIGluc3RlYWQuCitmdW5jIE5ld1RIdHRwUG9zdENsaWVudFdpdGhPcHRpb25zKHVybHN0ciBzdHJpbmcsIG9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIsIG9wdGlvbnMpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBOZXdUSHR0cENsaWVudCBpbnN0ZWFkLgorZnVuYyBOZXdUSHR0cFBvc3RDbGllbnQodXJsc3RyIHN0cmluZykgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModXJsc3RyLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnRfdGVzdC5nbwppbmRleCAwYzJjYjI4Li40NTM2ODBhIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50X3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudF90ZXN0LmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJuZXQvaHR0cCIKIAkidGVzdGluZyIKICkKIApAQCAtNDgsMyArNDksNTggQEAKIAl9CiAJVHJhbnNwb3J0SGVhZGVyVGVzdCh0LCB0cmFucywgdHJhbnMpCiB9CisKK2Z1bmMgVGVzdEh0dHBDdXN0b21DbGllbnQodCAqdGVzdGluZy5UKSB7CisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJaWYgbCAhPSBuaWwgeworCQlkZWZlciBsLkNsb3NlKCkKKwl9CisKKwlodHRwVHJhbnNwb3J0IDo9ICZjdXN0b21IdHRwVHJhbnNwb3J0e30KKworCXRyYW5zLCBlcnIgOj0gTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnMoImh0dHA6Ly8iK2FkZHIuU3RyaW5nKCksIFRIdHRwQ2xpZW50T3B0aW9uc3sKKwkJQ2xpZW50OiAmaHR0cC5DbGllbnR7CisJCQlUcmFuc3BvcnQ6IGh0dHBUcmFuc3BvcnQsCisJCX0sCisJfSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbC5DbG9zZSgpCisJCXQuRmF0YWxmKCJVbmFibGUgdG8gY29ubmVjdCB0byAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJfQorCVRyYW5zcG9ydEhlYWRlclRlc3QodCwgdHJhbnMsIHRyYW5zKQorCisJaWYgIWh0dHBUcmFuc3BvcnQuaGl0IHsKKwkJdC5GYXRhbGYoIkN1c3RvbSBjbGllbnQgd2FzIG5vdCB1c2VkIikKKwl9Cit9CisKK2Z1bmMgVGVzdEh0dHBDdXN0b21DbGllbnRQYWNrYWdlU2NvcGUodCAqdGVzdGluZy5UKSB7CisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJaWYgbCAhPSBuaWwgeworCQlkZWZlciBsLkNsb3NlKCkKKwl9CisJaHR0cFRyYW5zcG9ydCA6PSAmY3VzdG9tSHR0cFRyYW5zcG9ydHt9CisJRGVmYXVsdEh0dHBDbGllbnQgPSAmaHR0cC5DbGllbnR7CisJCVRyYW5zcG9ydDogaHR0cFRyYW5zcG9ydCwKKwl9CisKKwl0cmFucywgZXJyIDo9IE5ld1RIdHRwUG9zdENsaWVudCgiaHR0cDovLyIgKyBhZGRyLlN0cmluZygpKQorCWlmIGVyciAhPSBuaWwgeworCQlsLkNsb3NlKCkKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBjb25uZWN0IHRvICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwl9CisJVHJhbnNwb3J0SGVhZGVyVGVzdCh0LCB0cmFucywgdHJhbnMpCisKKwlpZiAhaHR0cFRyYW5zcG9ydC5oaXQgeworCQl0LkZhdGFsZigiQ3VzdG9tIGNsaWVudCB3YXMgbm90IHVzZWQiKQorCX0KK30KKwordHlwZSBjdXN0b21IdHRwVHJhbnNwb3J0IHN0cnVjdCB7CisJaGl0IGJvb2wKK30KKworZnVuYyAoYyAqY3VzdG9tSHR0cFRyYW5zcG9ydCkgUm91bmRUcmlwKHJlcSAqaHR0cC5SZXF1ZXN0KSAoKmh0dHAuUmVzcG9uc2UsIGVycm9yKSB7CisJYy5oaXQgPSB0cnVlCisJcmV0dXJuIGh0dHAuRGVmYXVsdFRyYW5zcG9ydC5Sb3VuZFRyaXAocmVxKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9odHRwX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvaHR0cF90cmFuc3BvcnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmMGYzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvaHR0cF90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb21wcmVzcy9nemlwIgorCSJpbyIKKwkibmV0L2h0dHAiCisJInN0cmluZ3MiCispCisKKy8vIE5ld1RocmlmdEhhbmRsZXJGdW5jIGlzIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGUgYSByZWFkeSB0byB1c2UgQXBhY2hlIFRocmlmdCBIYW5kbGVyIGZ1bmN0aW9uCitmdW5jIE5ld1RocmlmdEhhbmRsZXJGdW5jKHByb2Nlc3NvciBUUHJvY2Vzc29yLAorCWluUGZhY3RvcnksIG91dFBmYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpIGZ1bmModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKKworCXJldHVybiBneihmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CisJCXcuSGVhZGVyKCkuQWRkKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQorCisJCXRyYW5zcG9ydCA6PSBOZXdTdHJlYW1UcmFuc3BvcnQoci5Cb2R5LCB3KQorCQlwcm9jZXNzb3IuUHJvY2VzcyhyLkNvbnRleHQoKSwgaW5QZmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpLCBvdXRQZmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpKQorCX0pCit9CisKKy8vIGd6IHRyYW5zcGFyZW50bHkgY29tcHJlc3NlcyB0aGUgSFRUUCByZXNwb25zZSBpZiB0aGUgY2xpZW50IHN1cHBvcnRzIGl0LgorZnVuYyBneihoYW5kbGVyIGh0dHAuSGFuZGxlckZ1bmMpIGh0dHAuSGFuZGxlckZ1bmMgeworCXJldHVybiBmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CisJCWlmICFzdHJpbmdzLkNvbnRhaW5zKHIuSGVhZGVyLkdldCgiQWNjZXB0LUVuY29kaW5nIiksICJnemlwIikgeworCQkJaGFuZGxlcih3LCByKQorCQkJcmV0dXJuCisJCX0KKwkJdy5IZWFkZXIoKS5TZXQoIkNvbnRlbnQtRW5jb2RpbmciLCAiZ3ppcCIpCisJCWd6IDo9IGd6aXAuTmV3V3JpdGVyKHcpCisJCWRlZmVyIGd6LkNsb3NlKCkKKwkJZ3p3IDo9IGd6aXBSZXNwb25zZVdyaXRlcntXcml0ZXI6IGd6LCBSZXNwb25zZVdyaXRlcjogd30KKwkJaGFuZGxlcihnencsIHIpCisJfQorfQorCit0eXBlIGd6aXBSZXNwb25zZVdyaXRlciBzdHJ1Y3QgeworCWlvLldyaXRlcgorCWh0dHAuUmVzcG9uc2VXcml0ZXIKK30KKworZnVuYyAodyBnemlwUmVzcG9uc2VXcml0ZXIpIFdyaXRlKGIgW11ieXRlKSAoaW50LCBlcnJvcikgeworCXJldHVybiB3LldyaXRlci5Xcml0ZShiKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydC5nbwppbmRleCA3OTQ4NzJmLi5mZWE5M2JjIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydC5nbworKysgYi9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydC5nbwpAQCAtMjEsNiArMjEsNyBAQAogCiBpbXBvcnQgKAogCSJidWZpbyIKKwkiY29udGV4dCIKIAkiaW8iCiApCiAKQEAgLTM4LDM4ICszOSwzOCBAQAogCWlzUmVhZFdyaXRlciBib29sCiB9CiAKLWZ1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKIAlpZiB0cmFucyAhPSBuaWwgewogCQl0LCBvayA6PSB0cmFucy4oKlN0cmVhbVRyYW5zcG9ydCkKIAkJaWYgb2sgewogCQkJaWYgdC5pc1JlYWRXcml0ZXIgewotCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSVyh0LlJlYWRlci4oaW8uUmVhZFdyaXRlcikpCisJCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFJXKHQuUmVhZGVyLihpby5SZWFkV3JpdGVyKSksIG5pbAogCQkJfQogCQkJaWYgdC5SZWFkZXIgIT0gbmlsICYmIHQuV3JpdGVyICE9IG5pbCB7Ci0JCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydCh0LlJlYWRlciwgdC5Xcml0ZXIpCisJCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydCh0LlJlYWRlciwgdC5Xcml0ZXIpLCBuaWwKIAkJCX0KIAkJCWlmIHQuUmVhZGVyICE9IG5pbCAmJiB0LldyaXRlciA9PSBuaWwgewotCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSKHQuUmVhZGVyKQorCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSKHQuUmVhZGVyKSwgbmlsCiAJCQl9CiAJCQlpZiB0LlJlYWRlciA9PSBuaWwgJiYgdC5Xcml0ZXIgIT0gbmlsIHsKLQkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0Vyh0LldyaXRlcikKKwkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0Vyh0LldyaXRlciksIG5pbAogCQkJfQotCQkJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7fQorCQkJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7fSwgbmlsCiAJCX0KIAl9CiAJaWYgcC5pc1JlYWRXcml0ZXIgewotCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0UlcocC5SZWFkZXIuKGlvLlJlYWRXcml0ZXIpKQorCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0UlcocC5SZWFkZXIuKGlvLlJlYWRXcml0ZXIpKSwgbmlsCiAJfQogCWlmIHAuUmVhZGVyICE9IG5pbCAmJiBwLldyaXRlciAhPSBuaWwgewotCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0KHAuUmVhZGVyLCBwLldyaXRlcikKKwkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydChwLlJlYWRlciwgcC5Xcml0ZXIpLCBuaWwKIAl9CiAJaWYgcC5SZWFkZXIgIT0gbmlsICYmIHAuV3JpdGVyID09IG5pbCB7Ci0JCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSKHAuUmVhZGVyKQorCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0UihwLlJlYWRlciksIG5pbAogCX0KIAlpZiBwLlJlYWRlciA9PSBuaWwgJiYgcC5Xcml0ZXIgIT0gbmlsIHsKLQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFcocC5Xcml0ZXIpCisJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRXKHAuV3JpdGVyKSwgbmlsCiAJfQotCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e30KKwlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydHt9LCBuaWwKIH0KIAogZnVuYyBOZXdTdHJlYW1UcmFuc3BvcnRGYWN0b3J5KHJlYWRlciBpby5SZWFkZXIsIHdyaXRlciBpby5Xcml0ZXIsIGlzUmVhZFdyaXRlciBib29sKSAqU3RyZWFtVHJhbnNwb3J0RmFjdG9yeSB7CkBAIC0xMzgsNyArMTM5LDcgQEAKIH0KIAogLy8gRmx1c2hlcyB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGlmIG5vdCBudWxsLgotZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgewogCWlmIHAuV3JpdGVyID09IG5pbCB7CiAJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IGZsdXNoIG51bGwgb3V0cHV0U3RyZWFtIikKIAl9CkBAIC0yMDksNiArMjEwLDUgQEAKIAogZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CiAJY29uc3QgbWF4U2l6ZSA9IF51aW50NjQoMCkKLQlyZXR1cm4gbWF4U2l6ZSAgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorCXJldHVybiBtYXhTaXplIC8vIHRoZSB0aHJ1dGggaXMsIHdlIGp1c3QgZG9uJ3Qga25vdyB1bmxlc3MgZnJhbWVkIGlzIHVzZWQKIH0KLQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sLmdvCmluZGV4IDY2OWE3YmQuLjgwMGFjMjIgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbC5nbworKysgYi9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2wuZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgdGhyaWZ0CiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImVuY29kaW5nL2Jhc2U2NCIKIAkiZm10IgogKQpAQCAtMzEsMTAgKzMyLDcgQEAKIC8vIGZvciByZWZlcmVuY2VzIHRvIF9QYXJzZUNvbnRleHQgc2VlIHRzaW1wbGVqc29uX3Byb3RvY29sLmdvCiAKIC8vIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KLS8vCi0vLyBUaGlzIHByb3RvY29sIHByb2R1Y2VzL2NvbnN1bWVzIGEgc2ltcGxlIG91dHB1dCBmb3JtYXQKLS8vIHN1aXRhYmxlIGZvciBwYXJzaW5nIGJ5IHNjcmlwdGluZyBsYW5ndWFnZXMuICBJdCBzaG91bGQgbm90IGJlCi0vLyBjb25mdXNlZCB3aXRoIHRoZSBmdWxsLWZlYXR1cmVkIFRKU09OUHJvdG9jb2wuCisvLyBVdGlsaXplcyBTaW1wbGUgSlNPTiBwcm90b2NvbAogLy8KIHR5cGUgVEpTT05Qcm90b2NvbCBzdHJ1Y3QgewogCSpUU2ltcGxlSlNPTlByb3RvY29sCkBAIC02MCw2ICs1OCw3IEBACiB9CiAKIGZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMikgZXJyb3IgeworCXAucmVzZXRDb250ZXh0U3RhY2soKSAvLyBUSFJJRlQtMzczNQogCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gZQogCX0KQEAgLTIwMiwxNyArMjAxLDE4IEBACiAJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9Ci0JaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJfQogCXdyaXRlciA6PSBiYXNlNjQuTmV3RW5jb2RlcihiYXNlNjQuU3RkRW5jb2RpbmcsIHAud3JpdGVyKQogCWlmIF8sIGUgOj0gd3JpdGVyLldyaXRlKHYpOyBlICE9IG5pbCB7CisJCXAud3JpdGVyLlJlc2V0KHAudHJhbnMpIC8vIFRIUklGVC0zNzM1CiAJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAl9CiAJaWYgZSA6PSB3cml0ZXIuQ2xvc2UoKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJfQotCWlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9RVU9URV9CWVRFUyk7IGUgIT0gbmlsIHsKKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9RVU9URV9CWVRFUyk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCX0KIAlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQpAQCAtMjIwLDYgKzIyMCw3IEBACiAKIC8vIFJlYWRpbmcgbWV0aG9kcy4KIGZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyLCBlcnIgZXJyb3IpIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKIAlpZiBpc051bGwsIGVyciA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgogCX0KQEAgLTM4Nyw3ICszODgsNyBAQAogCQlpZiBlcnIgIT0gbmlsIHsKIAkJCXJldHVybiB2LCBlcnIKIAkJfQotCX0gZWxzZSBpZiBsZW4oZikgPj0gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CisJfSBlbHNlIGlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0gewogCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKIAkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKIAkJaWYgZXJyICE9IG5pbCB7CkBAIC00MTcsNyArNDE4LDcgQEAKIAkJaWYgZXJyICE9IG5pbCB7CiAJCQlyZXR1cm4gdiwgZXJyCiAJCX0KLQl9IGVsc2UgaWYgbGVuKGYpID49IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0geworCX0gZWxzZSBpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9OVUxMWzBdIHsKIAkJYiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpCiAJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCiAJCWlmIGVyciAhPSBuaWwgewpAQCAtNDM1LDEwICs0MzYsMTAgQEAKIAlyZXR1cm4gdiwgcC5QYXJzZVBvc3RWYWx1ZSgpCiB9CiAKLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIEZsdXNoKCkgKGVyciBlcnJvcikgeworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgewogCWVyciA9IHAud3JpdGVyLkZsdXNoKCkKIAlpZiBlcnIgPT0gbmlsIHsKLQkJZXJyID0gcC50cmFucy5GbHVzaCgpCisJCWVyciA9IHAudHJhbnMuRmx1c2goY3R4KQogCX0KIAlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sX3Rlc3QuZ28KaW5kZXggNzEwNGNlMy4uNTljNGQ2NCAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sX3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sX3Rlc3QuZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgdGhyaWZ0CiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImVuY29kaW5nL2Jhc2U2NCIKIAkiZW5jb2RpbmcvanNvbiIKIAkiZm10IgpAQCAtMzYsNyArMzcsNyBAQAogCQlpZiBlIDo9IHAuV3JpdGVCb29sKHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTY4LDcgKzY5LDcgQEAKIAkJfSBlbHNlIHsKIAkJCXRyYW5zLldyaXRlKFtdYnl0ZXsnMCd9KSAvLyBub3QgSlNPTl9GQUxTRQogCQl9Ci0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRCb29sKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtOTQsNyArOTUsNyBAQAogCQlpZiBlIDo9IHAuV3JpdGVCeXRlKHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTExNiw3ICsxMTcsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRCeXRlKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMTQxLDcgKzE0Miw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUkxNih2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0xNjMsNyArMTY0LDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkSTE2KCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMTg4LDcgKzE4OSw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUkzMih2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0yMTAsNyArMjExLDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkSTMyKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMjM1LDcgKzIzNiw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUk2NCh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0yNTcsNyArMjU4LDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQodmFsdWUsIDEwKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZEk2NCgpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTI4Miw3ICsyODMsNyBAQAogCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtMzE5LDcgKzMyMCw3IEBACiAJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKIAkJbiA6PSBOZXdOdW1lcmljRnJvbURvdWJsZSh2YWx1ZSkKIAkJdHJhbnMuV3JpdGVTdHJpbmcobi5TdHJpbmcoKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZERvdWJsZSgpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTM1OCw3ICszNTksNyBAQAogCQlpZiBlIDo9IHAuV3JpdGVTdHJpbmcodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtMzgwLDcgKzM4MSw3IEBACiAJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCQlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCiAJCXRyYW5zLldyaXRlU3RyaW5nKGpzb25RdW90ZSh2YWx1ZSkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRTdHJpbmcoKQogCQlpZiBlICE9IG5pbCB7CkBAIC00MDksNyArNDEwLDcgQEAKIAlpZiBlIDo9IHAuV3JpdGVCaW5hcnkodmFsdWUpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJfQotCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCX0KIAlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC00NDEsNyArNDQyLDcgQEAKIAl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCiAJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKGI2NFN0cmluZykpCi0JdHJhbnMuRmx1c2goKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAl2LCBlIDo9IHAuUmVhZEJpbmFyeSgpCiAJaWYgZSAhPSBuaWwgewpAQCAtNDc0LDcgKzQ3NSw3IEBACiAJCX0KIAl9CiAJcC5Xcml0ZUxpc3RFbmQoKQotCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCiAJfQogCXN0ciA6PSB0cmFucy5TdHJpbmcoKQpAQCAtNTI4LDcgKzUyOSw3IEBACiAJCX0KIAl9CiAJcC5Xcml0ZVNldEVuZCgpCi0JaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKIAl9CiAJc3RyIDo9IHRyYW5zLlN0cmluZygpCkBAIC01ODUsMTIgKzU4NiwxMiBAQAogCQl9CiAJfQogCXAuV3JpdGVNYXBFbmQoKQotCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCiAJfQogCXN0ciA6PSB0cmFucy5TdHJpbmcoKQogCWlmIHN0clswXSAhPSAnWycgfHwgc3RyW2xlbihzdHIpLTFdICE9ICddJyB7Ci0JCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzLCB3cm90ZTogJXEsIGluIGdvOiAlcSIsIHRoZXR5cGUsIHN0ciwgRE9VQkxFX1ZBTFVFUykKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMsIHdyb3RlOiAldiwgaW4gZ286ICV2IiwgdGhldHlwZSwgc3RyLCBET1VCTEVfVkFMVUVTKQogCX0KIAlleHBlY3RlZEtleVR5cGUsIGV4cGVjdGVkVmFsdWVUeXBlLCBleHBlY3RlZFNpemUsIGVyciA6PSBwLlJlYWRNYXBCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2xvd2xldmVsX2JlbmNobWFya3NfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvbG93bGV2ZWxfYmVuY2htYXJrc190ZXN0LmdvCmluZGV4IGE1MDk0YWUuLmUxNzM2NTUgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvbG93bGV2ZWxfYmVuY2htYXJrc190ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvbG93bGV2ZWxfYmVuY2htYXJrc190ZXN0LmdvCkBAIC0zNiw3ICszNiwxMCBAQAogfQogCiBmdW5jIEJlbmNobWFya0JpbmFyeUJvb2xfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTQ0LDcgKzQ3LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5Qnl0ZV8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCeXRlKGIsIHAsIHRyYW5zKQpAQCAtNTIsNyArNTgsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlJMTZfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQpAQCAtNjAsMzUgKzY5LDUwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5STMyXzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeUk2NF8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtCaW5hcnlEb3VibGVfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5U3RyaW5nXzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZVN0cmluZyhiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeUJpbmFyeV8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCkBAIC05Niw3ICsxMjAsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlCb29sXzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJvb2woYiwgcCwgdHJhbnMpCkBAIC0xMDQsNyArMTMxLDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5Qnl0ZV8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCeXRlKGIsIHAsIHRyYW5zKQpAQCAtMTEyLDcgKzE0MiwxMCBAQAogfQogCiBmdW5jIEJlbmNobWFya0JpbmFyeUkxNl8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCkBAIC0xMjAsMzUgKzE1Myw1MCBAQAogfQogCiBmdW5jIEJlbmNobWFya0JpbmFyeUkzMl8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtCaW5hcnlJNjRfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTY0KGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5RG91YmxlXzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeVN0cmluZ18xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtCaW5hcnlCaW5hcnlfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQmluYXJ5KGIsIHAsIHRyYW5zKQpAQCAtMTU2LDcgKzIwNCwxMCBAQAogfQogCiBmdW5jIEJlbmNobWFya0JpbmFyeUJvb2xfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTE2NCw3ICsyMTUsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlCeXRlXzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCkBAIC0xNzIsNyArMjI2LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5STE2XzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkxNihiLCBwLCB0cmFucykKQEAgLTE4MCwzNSArMjM3LDUwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5STMyXzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeUk2NF8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtCaW5hcnlEb3VibGVfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5U3RyaW5nXzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZVN0cmluZyhiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeUJpbmFyeV8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCkBAIC0yMTYsNyArMjg4LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQ29tcGFjdEJvb2xfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJvb2woYiwgcCwgdHJhbnMpCkBAIC0yMjQsNyArMjk5LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQ29tcGFjdEJ5dGVfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCkBAIC0yMzIsNyArMzEwLDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQ29tcGFjdEkxNl8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQpAQCAtMjQwLDM1ICszMjEsNTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0STMyXzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0STY0XzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0RG91YmxlMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3RTdHJpbmcwKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQ29tcGFjdEJpbmFyeTAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCkBAIC0yNzYsNyArMzcyLDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQ29tcGFjdEJvb2xfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJvb2woYiwgcCwgdHJhbnMpCkBAIC0yODQsNyArMzgzLDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQ29tcGFjdEJ5dGVfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCkBAIC0yOTIsNyArMzk0LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQ29tcGFjdEkxNl8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQpAQCAtMzAwLDM1ICs0MDUsNTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0STMyXzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0STY0XzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0RG91YmxlMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3RTdHJpbmcxKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQ29tcGFjdEJpbmFyeTEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCkBAIC0zMzYsNyArNDU2LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQ29tcGFjdEJvb2xfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJvb2woYiwgcCwgdHJhbnMpCkBAIC0zNDQsNyArNDY3LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQ29tcGFjdEJ5dGVfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCkBAIC0zNTIsNyArNDc4LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQ29tcGFjdEkxNl8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQpAQCAtMzYwLDM1ICs0ODksNTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0STMyXzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0STY0XzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0RG91YmxlMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3RTdHJpbmcyKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQ29tcGFjdEJpbmFyeTIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXIuZ28gYi9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXIuZ28KaW5kZXggYjYyZmQ1Ni4uNTkzNmQyNyAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyLmdvCisrKyBiL2xpYi9nby90aHJpZnQvbWVtb3J5X2J1ZmZlci5nbwpAQCAtMjEsNiArMjEsNyBAQAogCiBpbXBvcnQgKAogCSJieXRlcyIKKwkiY29udGV4dCIKICkKIAogLy8gTWVtb3J5IGJ1ZmZlci1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCkBAIC0zMywxNCArMzQsMTQgQEAKIAlzaXplIGludAogfQogCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQgeworZnVuYyAocCAqVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKIAlpZiB0cmFucyAhPSBuaWwgewogCQl0LCBvayA6PSB0cmFucy4oKlRNZW1vcnlCdWZmZXIpCiAJCWlmIG9rICYmIHQuc2l6ZSA+IDAgewotCQkJcmV0dXJuIE5ld1RNZW1vcnlCdWZmZXJMZW4odC5zaXplKQorCQkJcmV0dXJuIE5ld1RNZW1vcnlCdWZmZXJMZW4odC5zaXplKSwgbmlsCiAJCX0KIAl9Ci0JcmV0dXJuIE5ld1RNZW1vcnlCdWZmZXJMZW4ocC5zaXplKQorCXJldHVybiBOZXdUTWVtb3J5QnVmZmVyTGVuKHAuc2l6ZSksIG5pbAogfQogCiBmdW5jIE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KHNpemUgaW50KSAqVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkgewpAQCAtNzAsNyArNzEsNyBAQAogfQogCiAvLyBGbHVzaGluZyBhIG1lbW9yeSBidWZmZXIgaXMgYSBuby1vcAotZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgRmx1c2goKSBlcnJvciB7CitmdW5jIChwICpUTWVtb3J5QnVmZmVyKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CiAJcmV0dXJuIG5pbAogfQogCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5nbwppbmRleCAzMTU3ZTBkLi5kMDI4YTMwIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmdvCisrKyBiL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgdGhyaWZ0CiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImZtdCIKIAkic3RyaW5ncyIKICkKQEAgLTEyNyw3ICsxMjgsNyBAQAogCXQuc2VydmljZVByb2Nlc3Nvck1hcFtuYW1lXSA9IHByb2Nlc3NvcgogfQogCi1mdW5jICh0ICpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IpIFByb2Nlc3MoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CitmdW5jICh0ICpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IpIFByb2Nlc3MoY3R4IGNvbnRleHQuQ29udGV4dCwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CiAJbmFtZSwgdHlwZUlkLCBzZXFpZCwgZXJyIDo9IGluLlJlYWRNZXNzYWdlQmVnaW4oKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gZmFsc2UsIGVycgpAQCAtMTQwLDcgKzE0MSw3IEBACiAJaWYgbGVuKHYpICE9IDIgewogCQlpZiB0LkRlZmF1bHRQcm9jZXNzb3IgIT0gbmlsIHsKIAkJCXNtYiA6PSBOZXdTdG9yZWRNZXNzYWdlUHJvdG9jb2woaW4sIG5hbWUsIHR5cGVJZCwgc2VxaWQpCi0JCQlyZXR1cm4gdC5EZWZhdWx0UHJvY2Vzc29yLlByb2Nlc3Moc21iLCBvdXQpCisJCQlyZXR1cm4gdC5EZWZhdWx0UHJvY2Vzc29yLlByb2Nlc3MoY3R4LCBzbWIsIG91dCkKIAkJfQogCQlyZXR1cm4gZmFsc2UsIGZtdC5FcnJvcmYoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAlcy4gIERpZCB5b3UgZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iLCBuYW1lKQogCX0KQEAgLTE0OSw3ICsxNTAsNyBAQAogCQlyZXR1cm4gZmFsc2UsIGZtdC5FcnJvcmYoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICVzLiAgRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIsIHZbMF0pCiAJfQogCXNtYiA6PSBOZXdTdG9yZWRNZXNzYWdlUHJvdG9jb2woaW4sIHZbMV0sIHR5cGVJZCwgc2VxaWQpCi0JcmV0dXJuIGFjdHVhbFByb2Nlc3Nvci5Qcm9jZXNzKHNtYiwgb3V0KQorCXJldHVybiBhY3R1YWxQcm9jZXNzb3IuUHJvY2VzcyhjdHgsIHNtYiwgb3V0KQogfQogCiAvL1Byb3RvY29sIHRoYXQgdXNlIHN0b3JlZCBtZXNzYWdlIGZvciBSZWFkTWVzc2FnZUJlZ2luCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Byb2Nlc3Nvci5nbyBiL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTBkM2ZhLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yLmdvCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi0vLyBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHdoaWNoIG9wZXJhdGVzIHVwb24gYW4gaW5wdXQgc3RyZWFtIGFuZAotLy8gd3JpdGVzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbS4KLXR5cGUgVFByb2Nlc3NvciBpbnRlcmZhY2UgewotCVByb2Nlc3MoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQotfQotCi10eXBlIFRQcm9jZXNzb3JGdW5jdGlvbiBpbnRlcmZhY2UgewotCVByb2Nlc3Moc2VxSWQgaW50MzIsIGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yX2ZhY3RvcnkuZ28gYi9saWIvZ28vdGhyaWZ0L3Byb2Nlc3Nvcl9mYWN0b3J5LmdvCmluZGV4IDlkNjQ1ZGYuLmU0YjEzMmIgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yX2ZhY3RvcnkuZ28KKysrIGIvbGliL2dvL3RocmlmdC9wcm9jZXNzb3JfZmFjdG9yeS5nbwpAQCAtMTksNiArMTksMTggQEAKIAogcGFja2FnZSB0aHJpZnQKIAoraW1wb3J0ICJjb250ZXh0IgorCisvLyBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHdoaWNoIG9wZXJhdGVzIHVwb24gYW4gaW5wdXQgc3RyZWFtIGFuZAorLy8gd3JpdGVzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbS4KK3R5cGUgVFByb2Nlc3NvciBpbnRlcmZhY2UgeworCVByb2Nlc3MoY3R4IGNvbnRleHQuQ29udGV4dCwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCit0eXBlIFRQcm9jZXNzb3JGdW5jdGlvbiBpbnRlcmZhY2UgeworCVByb2Nlc3MoY3R4IGNvbnRleHQuQ29udGV4dCwgc2VxSWQgaW50MzIsIGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikKK30KKwogLy8gVGhlIGRlZmF1bHQgcHJvY2Vzc29yIGZhY3RvcnkganVzdCByZXR1cm5zIGEgc2luZ2xldG9uCiAvLyBpbnN0YW5jZS4KIHR5cGUgVFByb2Nlc3NvckZhY3RvcnkgaW50ZXJmYWNlIHsKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sLmdvCmluZGV4IDQ1ZmEyMDIuLjJlNmJjNGIgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2wuZ28KKysrIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbC5nbwpAQCAtMjAsNyArMjAsOSBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZXJyb3JzIgorCSJmbXQiCiApCiAKIGNvbnN0ICgKQEAgLTczLDcgKzc1LDcgQEAKIAlSZWFkQmluYXJ5KCkgKHZhbHVlIFtdYnl0ZSwgZXJyIGVycm9yKQogCiAJU2tpcChmaWVsZFR5cGUgVFR5cGUpIChlcnIgZXJyb3IpCi0JRmx1c2goKSAoZXJyIGVycm9yKQorCUZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpCiAKIAlUcmFuc3BvcnQoKSBUVHJhbnNwb3J0CiB9CkBAIC04OCwxNCArOTAsMTIgQEAKIAogLy8gU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KIGZ1bmMgU2tpcChzZWxmIFRQcm90b2NvbCwgZmllbGRUeXBlIFRUeXBlLCBtYXhEZXB0aCBpbnQpIChlcnIgZXJyb3IpIHsKLQkKLSAgICBpZiBtYXhEZXB0aCA8PSAwIHsKLQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKCBERVBUSF9MSU1JVCwgZXJyb3JzLk5ldygiRGVwdGggbGltaXQgZXhjZWVkZWQiKSkKKworCWlmIG1heERlcHRoIDw9IDAgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoREVQVEhfTElNSVQsIGVycm9ycy5OZXcoIkRlcHRoIGxpbWl0IGV4Y2VlZGVkIikpCiAJfQogCiAJc3dpdGNoIGZpZWxkVHlwZSB7Ci0JY2FzZSBTVE9QOgotCQlyZXR1cm4KIAljYXNlIEJPT0w6CiAJCV8sIGVyciA9IHNlbGYuUmVhZEJvb2woKQogCQlyZXR1cm4KQEAgLTE3MCw2ICsxNzAsOCBAQAogCQkJfQogCQl9CiAJCXJldHVybiBzZWxmLlJlYWRMaXN0RW5kKCkKKwlkZWZhdWx0OgorCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KGZtdC5TcHJpbnRmKCJVbmtub3duIGRhdGEgdHlwZSAlZCIsIGZpZWxkVHlwZSkpKQogCX0KIAlyZXR1cm4gbmlsCiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2V4Y2VwdGlvbi5nbyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfZXhjZXB0aW9uLmdvCmluZGV4IDZlMzU3ZWUuLjI5YWI3NWQgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfZXhjZXB0aW9uLmdvCisrKyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfZXhjZXB0aW9uLmdvCkBAIC02MCw3ICs2MCw3IEBACiAJaWYgZXJyID09IG5pbCB7CiAJCXJldHVybiBuaWwKIAl9Ci0JaWYgZSxvayA6PSBlcnIuKFRQcm90b2NvbEV4Y2VwdGlvbik7IG9rIHsKKwlpZiBlLCBvayA6PSBlcnIuKFRQcm90b2NvbEV4Y2VwdGlvbik7IG9rIHsKIAkJcmV0dXJuIGUKIAl9CiAJaWYgXywgb2sgOj0gZXJyLihiYXNlNjQuQ29ycnVwdElucHV0RXJyb3IpOyBvayB7CkBAIC03NSw0ICs3NSwzIEBACiAJfQogCXJldHVybiAmdFByb3RvY29sRXhjZXB0aW9ue2VyclR5cGUsIGVyci5FcnJvcigpfQogfQotCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX3Rlc3QuZ28KaW5kZXggNjEzZWFlNi4uOTQ0MDU1YyAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfdGVzdC5nbwpAQCAtMjEsNiArMjEsNyBAQAogCiBpbXBvcnQgKAogCSJieXRlcyIKKwkiY29udGV4dCIKIAkiaW8vaW91dGlsIgogCSJtYXRoIgogCSJuZXQiCkBAIC0zMSw3ICszMiw2IEBACiBjb25zdCBQUk9UT0NPTF9CSU5BUllfREFUQV9TSVpFID0gMTU1CiAKIHZhciAoCi0JZGF0YSAgICAgICAgICAgc3RyaW5nIC8vIHRlc3QgZGF0YSBmb3Igd3JpdGluZwogCXByb3RvY29sX2JkYXRhIFtdYnl0ZSAvLyB0ZXN0IGRhdGEgZm9yIHdyaXRpbmc7IHNhbWUgYXMgZGF0YQogCUJPT0xfVkFMVUVTICAgIFtdYm9vbAogCUJZVEVfVkFMVUVTICAgIFtdaW50OApAQCAtNDcsNyArNDcsNiBAQAogCWZvciBpIDo9IDA7IGkgPCBQUk9UT0NPTF9CSU5BUllfREFUQV9TSVpFOyBpKysgewogCQlwcm90b2NvbF9iZGF0YVtpXSA9IGJ5dGUoKGkgKyAnYScpICUgMjU1KQogCX0KLQlkYXRhID0gc3RyaW5nKHByb3RvY29sX2JkYXRhKQogCUJPT0xfVkFMVUVTID0gW11ib29se2ZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWV9CiAJQllURV9WQUxVRVMgPSBbXWludDh7MTE3LCAwLCAxLCAzMiwgMTI3LCAtMTI4LCAtMX0KIAlJTlQxNl9WQUxVRVMgPSBbXWludDE2ezQ1OSwgMCwgMSwgLTEsIC0xMjgsIDEyNywgMzI3NjcsIC0zMjc2OH0KQEAgLTEyMCw1OCArMTE5LDk3IEBACiAJCU5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpLAogCQlOZXdTdHJlYW1UcmFuc3BvcnRGYWN0b3J5KGJ1ZiwgYnVmLCB0cnVlKSwKIAkJTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAorCQlOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnlXaXRoRmFjdG9yeSgwLCBOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSksCisJCU5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KDYsIE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKKwkJTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoOSwgTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpKSwKIAkJTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeSgiaHR0cDovLyIgKyBhZGRyLlN0cmluZygpKSwKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVCb29sKHQsIHAsIHRyYW5zKQogCQl0cmFucy5DbG9zZSgpCiAJfQogCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLQkJdHJhbnMgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQogCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKIAkJUmVhZFdyaXRlQnl0ZSh0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZUkxNih0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZUkzMih0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZUk2NCh0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZVN0cmluZyh0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZUJpbmFyeSh0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZUk2NCh0LCBwLCB0cmFucykKIAkJUmVhZFdyaXRlRG91YmxlKHQsIHAsIHRyYW5zKQpAQCAtMTkxLDE3ICsyMjksMTcgQEAKIAlmb3IgaywgdiA6PSByYW5nZSBCT09MX1ZBTFVFUyB7CiAJCWVyciA9IHAuV3JpdGVCb29sKHYpCiAJCWlmIGVyciAhPSBuaWwgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGJvb2wgaW4gbGlzdCBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHdyaXRpbmcgYm9vbCBpbiBsaXN0IGF0IGluZGV4ICV2OiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgaywgdikKIAkJfQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3Igd3JpdGluZyBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIEJPT0xfVkFMVUVTKQorCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBCT09MX1ZBTFVFUykKIAl9Ci0JcC5GbHVzaCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgQk9PTF9WQUxVRVMpCisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3IgcmVhZGluZyBsaXN0OiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgQk9PTF9WQUxVRVMpCiAJfQogCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQogCWlmICFvayB7CkBAIC0yMDksMTYgKzI0NywxNiBAQAogCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKIAkJfQogCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCiAJCX0KIAl9CiAJZm9yIGssIHYgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgewogCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZEJvb2woKQogCQlpZiBlcnIgIT0gbmlsIHsKLQkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBib29sIGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3IgcmVhZGluZyBib29sIGF0IGluZGV4ICV2OiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgaywgdikKIAkJfQogCQlpZiB2ICE9IHZhbHVlIHsKLQkJCXQuRXJyb3JmKCIlczogaW5kZXggJWQgJXEgJXEgJXEgIT0gJXEiLCAiUmVhZFdyaXRlQm9vbCIsIGssIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJCXQuRXJyb3JmKCIlczogaW5kZXggJXYgJXYgJXYgJXYgIT0gJXYiLCAiUmVhZFdyaXRlQm9vbCIsIGssIHAsIHRyYW5zLCB2LCB2YWx1ZSkKIAkJfQogCX0KIAllcnIgPSBwLlJlYWRMaXN0RW5kKCkKQEAgLTI0NCw3ICsyODIsNyBAQAogCWlmIGVyciAhPSBuaWwgewogCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBCWVRFX1ZBTFVFUykKIAl9Ci0JZXJyID0gcC5GbHVzaCgpCisJZXJyID0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciBmbHVzaGluZyBsaXN0IG9mIGJ5dGVzOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgQllURV9WQUxVRVMpCiAJfQpAQCAtMjU4LDcgKzI5Niw3IEBACiAJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQogCQl9CiAJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKLQkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICVzICE9IGxlbiAlcyIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKIAkJfQogCX0KIAlmb3IgaywgdiA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7CkBAIC0yODQsNyArMzIyLDcgQEAKIAkJcC5Xcml0ZUkxNih2KQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JcC5GbHVzaCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgZXJyLCBJTlQxNl9WQUxVRVMpCkBAIC0yOTUsNyArMzMzLDcgQEAKIAkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKIAkJfQogCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQogCQl9CiAJfQogCWZvciBrLCB2IDo9IHJhbmdlIElOVDE2X1ZBTFVFUyB7CkBAIC0zMjEsNyArMzU5LDcgQEAKIAkJcC5Xcml0ZUkzMih2KQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JcC5GbHVzaCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgZXJyLCBJTlQzMl9WQUxVRVMpCkBAIC0zMzIsNyArMzcwLDcgQEAKIAkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKIAkJfQogCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQogCQl9CiAJfQogCWZvciBrLCB2IDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CkBAIC0zNTcsNyArMzk1LDcgQEAKIAkJcC5Xcml0ZUk2NCh2KQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JcC5GbHVzaCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgZXJyLCBJTlQ2NF9WQUxVRVMpCkBAIC0zNjgsNyArNDA2LDcgQEAKIAkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKIAkJfQogCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQogCQl9CiAJfQogCWZvciBrLCB2IDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CkBAIC0zOTMsMjggKzQzMSwyOCBAQAogCQlwLldyaXRlRG91YmxlKHYpCiAJfQogCXAuV3JpdGVMaXN0RW5kKCkKLQlwLkZsdXNoKCkKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCBlcnIsIERPVUJMRV9WQUxVRVMpCisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3IgcmVhZGluZyBsaXN0OiAldiIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgZXJyLCBET1VCTEVfVkFMVUVTKQogCX0KIAlpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKIAkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQogCX0KIAlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0JCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICVzICE9IGxlbiAlcyIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKIAl9CiAJZm9yIGssIHYgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CiAJCXZhbHVlLCBlcnIgOj0gcC5SZWFkRG91YmxlKCkKIAkJaWYgZXJyICE9IG5pbCB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgZG91YmxlIGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGRvdWJsZSBhdCBpbmRleCAlZDogJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIGVyciwgaywgdikKIAkJfQogCQlpZiBtYXRoLklzTmFOKHYpIHsKIAkJCWlmICFtYXRoLklzTmFOKHZhbHVlKSB7Ci0JCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBtYXRoLklzTmFOKCVxKSAhPSBtYXRoLklzTmFOKCVxKSIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBtYXRoLklzTmFOKCV2KSAhPSBtYXRoLklzTmFOKCV2KSIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdiwgdmFsdWUpCiAJCQl9CiAJCX0gZWxzZSBpZiB2ICE9IHZhbHVlIHsKLQkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgIT0gJXEiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiAhPSAldiIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdiwgdmFsdWUpCiAJCX0KIAl9CiAJZXJyID0gcC5SZWFkTGlzdEVuZCgpCkBAIC00MzEsNyArNDY5LDcgQEAKIAkJcC5Xcml0ZVN0cmluZyh2KQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JcC5GbHVzaCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgZXJyLCBTVFJJTkdfVkFMVUVTKQpAQCAtNDQyLDcgKzQ4MCw3IEBACiAJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCiAJCX0KIAkJaWYgdGhlbGVuICE9IHRoZWxlbjIgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXMgIT0gbGVuICVzIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKIAkJfQogCX0KIAlmb3IgaywgdiA6PSByYW5nZSBTVFJJTkdfVkFMVUVTIHsKQEAgLTQ1MSw3ICs0ODksNyBAQAogCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIHN0cmluZyBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIGVyciwgaywgdikKIAkJfQogCQlpZiB2ICE9IHZhbHVlIHsKLQkJCXQuRXJyb3JmKCIlczogJVQgJVQgJWQgIT0gJWQiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiAhPSAldiIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgdiwgdmFsdWUpCiAJCX0KIAl9CiAJaWYgZXJyICE9IG5pbCB7CkBAIC00NjIsNyArNTAwLDcgQEAKIGZ1bmMgUmVhZFdyaXRlQmluYXJ5KHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKIAl2IDo9IHByb3RvY29sX2JkYXRhCiAJcC5Xcml0ZUJpbmFyeSh2KQotCXAuRmx1c2goKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJdmFsdWUsIGVyciA6PSBwLlJlYWRCaW5hcnkoKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGJpbmFyeTogJXMiLCAiUmVhZFdyaXRlQmluYXJ5IiwgcCwgdHJhbnMsIGVyci5FcnJvcigpKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnQuZ28KaW5kZXggOGUyOTZhOS4uNDAyNWJlYiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0LmdvCkBAIC02Niw0ICs2NiwzIEBACiAJXywgZXJyIDo9IHcuV3JpdGUodlswOjFdKQogCXJldHVybiBlcnIKIH0KLQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydF90ZXN0LmdvCmluZGV4IDQxNTEzZjguLjI1YzNmZDUgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTM3LDcgKzM3LDExIEBACiAJCU5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnkoImh0dHA6Ly8xMjcuMC4wLjEiKSwKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCV8sIG9rIDo9IHRyYW5zLihUUmljaFRyYW5zcG9ydCkKIAkJaWYgIW9rIHsKIAkJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJXMgZG9lcyBub3QgaW1wbGVtZW50IFRSaWNoVHJhbnNwb3J0IGludGVyZmFjZSIsIHJlZmxlY3QuVmFsdWVPZih0cmFucykpCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXIuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXIuZ28KaW5kZXggNzcxMjIyOS4uMWZmNGQzNyAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvCisrKyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplci5nbwpAQCAtMTksNiArMTksMTAgQEAKIAogcGFja2FnZSB0aHJpZnQKIAoraW1wb3J0ICgKKwkiY29udGV4dCIKKykKKwogdHlwZSBUU2VyaWFsaXplciBzdHJ1Y3QgewogCVRyYW5zcG9ydCAqVE1lbW9yeUJ1ZmZlcgogCVByb3RvY29sICBUUHJvdG9jb2wKQEAgLTM4LDM1ICs0MiwzNSBAQAogCQlwcm90b2NvbH0KIH0KIAotZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlU3RyaW5nKG1zZyBUU3RydWN0KSAocyBzdHJpbmcsIGVyciBlcnJvcikgeworZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlU3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIG1zZyBUU3RydWN0KSAocyBzdHJpbmcsIGVyciBlcnJvcikgewogCXQuVHJhbnNwb3J0LlJlc2V0KCkKIAogCWlmIGVyciA9IG1zZy5Xcml0ZSh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CiAJCXJldHVybgogCX0KIAotCWlmIGVyciA9IHQuUHJvdG9jb2wuRmx1c2goKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyID0gdC5Qcm90b2NvbC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuCiAJfQotCWlmIGVyciA9IHQuVHJhbnNwb3J0LkZsdXNoKCk7IGVyciAhPSBuaWwgeworCWlmIGVyciA9IHQuVHJhbnNwb3J0LkZsdXNoKGN0eCk7IGVyciAhPSBuaWwgewogCQlyZXR1cm4KIAl9CiAKIAlyZXR1cm4gdC5UcmFuc3BvcnQuU3RyaW5nKCksIG5pbAogfQogCi1mdW5jICh0ICpUU2VyaWFsaXplcikgV3JpdGUobXNnIFRTdHJ1Y3QpIChiIFtdYnl0ZSwgZXJyIGVycm9yKSB7CitmdW5jICh0ICpUU2VyaWFsaXplcikgV3JpdGUoY3R4IGNvbnRleHQuQ29udGV4dCwgbXNnIFRTdHJ1Y3QpIChiIFtdYnl0ZSwgZXJyIGVycm9yKSB7CiAJdC5UcmFuc3BvcnQuUmVzZXQoKQogCiAJaWYgZXJyID0gbXNnLldyaXRlKHQuUHJvdG9jb2wpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuCiAJfQogCi0JaWYgZXJyID0gdC5Qcm90b2NvbC5GbHVzaCgpOyBlcnIgIT0gbmlsIHsKKwlpZiBlcnIgPSB0LlByb3RvY29sLkZsdXNoKGN0eCk7IGVyciAhPSBuaWwgewogCQlyZXR1cm4KIAl9CiAKLQlpZiBlcnIgPSB0LlRyYW5zcG9ydC5GbHVzaCgpOyBlcnIgIT0gbmlsIHsKKwlpZiBlcnIgPSB0LlRyYW5zcG9ydC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuCiAJfQogCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90ZXN0LmdvCmluZGV4IDNjZGIzODcuLjMyMjI3ZWYgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90ZXN0LmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJlcnJvcnMiCiAJImZtdCIKIAkidGVzdGluZyIKQEAgLTg1LDEwICs4NiwxMCBAQAogCW0uQmluID0gbWFrZShbXWJ5dGUsIDEwKQogCW0uU3RyaW5nTWFwID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZywgNSkKIAltLlN0cmluZ0xpc3QgPSBtYWtlKFtdc3RyaW5nLCA1KQotCW0uU3RyaW5nU2V0ID0gbWFrZShtYXBbc3RyaW5nXWJvb2wsIDUpCisJbS5TdHJpbmdTZXQgPSBtYWtlKG1hcFtzdHJpbmddc3RydWN0e30sIDUpCiAJbS5FID0gMgogCi0JcywgZXJyIDo9IHQuV3JpdGVTdHJpbmcoJm0pCisJcywgZXJyIDo9IHQuV3JpdGVTdHJpbmcoY29udGV4dC5CYWNrZ3JvdW5kKCksICZtKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoZm10LlNwcmludGYoIlVuYWJsZSB0byBTZXJpYWxpemUgc3RydWN0XG5cdCAlcyIsIGVycikpCiAJfQpAQCAtMTE5LDEwICsxMjAsMTAgQEAKIAltLkJpbiA9IG1ha2UoW11ieXRlLCAxMCkKIAltLlN0cmluZ01hcCA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcsIDUpCiAJbS5TdHJpbmdMaXN0ID0gbWFrZShbXXN0cmluZywgNSkKLQltLlN0cmluZ1NldCA9IG1ha2UobWFwW3N0cmluZ11ib29sLCA1KQorCW0uU3RyaW5nU2V0ID0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdHt9LCA1KQogCW0uRSA9IDIKIAotCXMsIGVyciA6PSB0LldyaXRlU3RyaW5nKCZtKQorCXMsIGVyciA6PSB0LldyaXRlU3RyaW5nKGNvbnRleHQuQmFja2dyb3VuZCgpLCAmbSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gU2VyaWFsaXplIHN0cnVjdFxuXHQgJXMiLCBlcnIpKQogCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdHlwZXNfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90eXBlc190ZXN0LmdvCmluZGV4IDEwZjQ3MzcuLmU1NDcyYmIgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90eXBlc190ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90eXBlc190ZXN0LmdvCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2UgdGhyaWZ0CiAKLS8vIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgxLjAuMC1kZXYpCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoRklYTUUpCiAvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAKIC8qIFRIRSBGT0xMT1dJTkcgVEhSSUZUIEZJTEUgV0FTIFVTRUQgVE8gQ1JFQVRFIFRISVMKQEAgLTk3LDE4ICs5NywxOCBAQAogZnVuYyBNeVRlc3RFbnVtUHRyKHYgTXlUZXN0RW51bSkgKk15VGVzdEVudW0geyByZXR1cm4gJnYgfQogCiB0eXBlIE15VGVzdFN0cnVjdCBzdHJ1Y3QgewotCU9uICAgICAgICAgYm9vbCAgICAgICAgICAgICAgYHRocmlmdDoib24sMSIganNvbjoib24iYAotCUIgICAgICAgICAgaW50OCAgICAgICAgICAgICAgYHRocmlmdDoiYiwyIiBqc29uOiJiImAKLQlJbnQxNiAgICAgIGludDE2ICAgICAgICAgICAgIGB0aHJpZnQ6ImludDE2LDMiIGpzb246ImludDE2ImAKLQlJbnQzMiAgICAgIGludDMyICAgICAgICAgICAgIGB0aHJpZnQ6ImludDMyLDQiIGpzb246ImludDMyImAKLQlJbnQ2NCAgICAgIGludDY0ICAgICAgICAgICAgIGB0aHJpZnQ6ImludDY0LDUiIGpzb246ImludDY0ImAKLQlEICAgICAgICAgIGZsb2F0NjQgICAgICAgICAgIGB0aHJpZnQ6ImQsNiIganNvbjoiZCJgCi0JU3QgICAgICAgICBzdHJpbmcgICAgICAgICAgICBgdGhyaWZ0OiJzdCw3IiBqc29uOiJzdCJgCi0JQmluICAgICAgICBbXWJ5dGUgICAgICAgICAgICBgdGhyaWZ0OiJiaW4sOCIganNvbjoiYmluImAKLQlTdHJpbmdNYXAgIG1hcFtzdHJpbmddc3RyaW5nIGB0aHJpZnQ6InN0cmluZ01hcCw5IiBqc29uOiJzdHJpbmdNYXAiYAotCVN0cmluZ0xpc3QgW11zdHJpbmcgICAgICAgICAgYHRocmlmdDoic3RyaW5nTGlzdCwxMCIganNvbjoic3RyaW5nTGlzdCJgCi0JU3RyaW5nU2V0ICBtYXBbc3RyaW5nXWJvb2wgICBgdGhyaWZ0OiJzdHJpbmdTZXQsMTEiIGpzb246InN0cmluZ1NldCJgCi0JRSAgICAgICAgICBNeVRlc3RFbnVtICAgICAgICBgdGhyaWZ0OiJlLDEyIiBqc29uOiJlImAKKwlPbiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgYHRocmlmdDoib24sMSIganNvbjoib24iYAorCUIgICAgICAgICAgaW50OCAgICAgICAgICAgICAgICBgdGhyaWZ0OiJiLDIiIGpzb246ImIiYAorCUludDE2ICAgICAgaW50MTYgICAgICAgICAgICAgICBgdGhyaWZ0OiJpbnQxNiwzIiBqc29uOiJpbnQxNiJgCisJSW50MzIgICAgICBpbnQzMiAgICAgICAgICAgICAgIGB0aHJpZnQ6ImludDMyLDQiIGpzb246ImludDMyImAKKwlJbnQ2NCAgICAgIGludDY0ICAgICAgICAgICAgICAgYHRocmlmdDoiaW50NjQsNSIganNvbjoiaW50NjQiYAorCUQgICAgICAgICAgZmxvYXQ2NCAgICAgICAgICAgICBgdGhyaWZ0OiJkLDYiIGpzb246ImQiYAorCVN0ICAgICAgICAgc3RyaW5nICAgICAgICAgICAgICBgdGhyaWZ0OiJzdCw3IiBqc29uOiJzdCJgCisJQmluICAgICAgICBbXWJ5dGUgICAgICAgICAgICAgIGB0aHJpZnQ6ImJpbiw4IiBqc29uOiJiaW4iYAorCVN0cmluZ01hcCAgbWFwW3N0cmluZ11zdHJpbmcgICBgdGhyaWZ0OiJzdHJpbmdNYXAsOSIganNvbjoic3RyaW5nTWFwImAKKwlTdHJpbmdMaXN0IFtdc3RyaW5nICAgICAgICAgICAgYHRocmlmdDoic3RyaW5nTGlzdCwxMCIganNvbjoic3RyaW5nTGlzdCJgCisJU3RyaW5nU2V0ICBtYXBbc3RyaW5nXXN0cnVjdHt9IGB0aHJpZnQ6InN0cmluZ1NldCwxMSIganNvbjoic3RyaW5nU2V0ImAKKwlFICAgICAgICAgIE15VGVzdEVudW0gICAgICAgICAgYHRocmlmdDoiZSwxMiIganNvbjoiZSJgCiB9CiAKIGZ1bmMgTmV3TXlUZXN0U3RydWN0KCkgKk15VGVzdFN0cnVjdCB7CkBAIC0xNTUsNyArMTU1LDcgQEAKIAlyZXR1cm4gcC5TdHJpbmdMaXN0CiB9CiAKLWZ1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0U3RyaW5nU2V0KCkgbWFwW3N0cmluZ11ib29sIHsKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0U3RyaW5nU2V0KCkgbWFwW3N0cmluZ11zdHJ1Y3R7fSB7CiAJcmV0dXJuIHAuU3RyaW5nU2V0CiB9CiAKQEAgLTM2Niw3ICszNjYsNyBAQAogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIHNldCBiZWdpbjogIiwgZXJyKQogCX0KLQl0U2V0IDo9IG1ha2UobWFwW3N0cmluZ11ib29sLCBzaXplKQorCXRTZXQgOj0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdHt9LCBzaXplKQogCXAuU3RyaW5nU2V0ID0gdFNldAogCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgewogCQl2YXIgX2VsZW0zIHN0cmluZwpAQCAtMzc1LDcgKzM3NSw3IEBACiAJCX0gZWxzZSB7CiAJCQlfZWxlbTMgPSB2CiAJCX0KLQkJcC5TdHJpbmdTZXRbX2VsZW0zXSA9IHRydWUKKwkJcC5TdHJpbmdTZXRbX2VsZW0zXSA9IHN0cnVjdHt9e30KIAl9CiAJaWYgZXJyIDo9IGlwcm90LlJlYWRTZXRFbmQoKTsgZXJyICE9IG5pbCB7CiAJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgc2V0IGVuZDogIiwgZXJyKQpAQCAtNTk4LDcgKzU5OCw3IEBACiAJaWYgZXJyIDo9IG9wcm90LldyaXRlU2V0QmVnaW4oU1RSSU5HLCBsZW4ocC5TdHJpbmdTZXQpKTsgZXJyICE9IG5pbCB7CiAJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgc2V0IGJlZ2luOiAiLCBlcnIpCiAJfQotCWZvciB2LCBfIDo9IHJhbmdlIHAuU3RyaW5nU2V0IHsKKwlmb3IgdiA6PSByYW5nZSBwLlN0cmluZ1NldCB7CiAJCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcodikpOyBlcnIgIT0gbmlsIHsKIAkJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULiAoMCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCiAJCX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldC5nbwppbmRleCAyNTgxMDU2Li43ZGQyNGFlIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0LmdvCkBAIC00Nyw3ICs0NywxNCBAQAogCXJldHVybiAmVFNlcnZlclNvY2tldHthZGRyOiBhZGRyLCBjbGllbnRUaW1lb3V0OiBjbGllbnRUaW1lb3V0fSwgbmlsCiB9CiAKKy8vIENyZWF0ZXMgYSBUU2VydmVyU29ja2V0IGZyb20gYSBuZXQuQWRkcgorZnVuYyBOZXdUU2VydmVyU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIgbmV0LkFkZHIsIGNsaWVudFRpbWVvdXQgdGltZS5EdXJhdGlvbikgKlRTZXJ2ZXJTb2NrZXQgeworCXJldHVybiAmVFNlcnZlclNvY2tldHthZGRyOiBhZGRyLCBjbGllbnRUaW1lb3V0OiBjbGllbnRUaW1lb3V0fQorfQorCiBmdW5jIChwICpUU2VydmVyU29ja2V0KSBMaXN0ZW4oKSBlcnJvciB7CisJcC5tdS5Mb2NrKCkKKwlkZWZlciBwLm11LlVubG9jaygpCiAJaWYgcC5Jc0xpc3RlbmluZygpIHsKIAkJcmV0dXJuIG5pbAogCX0KQEAgLTY3LDEwICs3NCwxNSBAQAogCWlmIGludGVycnVwdGVkIHsKIAkJcmV0dXJuIG5pbCwgZXJyVHJhbnNwb3J0SW50ZXJydXB0ZWQKIAl9Ci0JaWYgcC5saXN0ZW5lciA9PSBuaWwgeworCisJcC5tdS5Mb2NrKCkKKwlsaXN0ZW5lciA6PSBwLmxpc3RlbmVyCisJcC5tdS5VbmxvY2soKQorCWlmIGxpc3RlbmVyID09IG5pbCB7CiAJCXJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQiKQogCX0KLQljb25uLCBlcnIgOj0gcC5saXN0ZW5lci5BY2NlcHQoKQorCisJY29ubiwgZXJyIDo9IGxpc3RlbmVyLkFjY2VwdCgpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQogCX0KQEAgLTg0LDYgKzk2LDggQEAKIAogLy8gQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCiBmdW5jIChwICpUU2VydmVyU29ja2V0KSBPcGVuKCkgZXJyb3IgeworCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQogCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CiAJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNlcnZlciBzb2NrZXQgYWxyZWFkeSBvcGVuIikKIAl9CkBAIC0xMDMsMTkgKzExNywyMSBAQAogfQogCiBmdW5jIChwICpUU2VydmVyU29ja2V0KSBDbG9zZSgpIGVycm9yIHsKLQlkZWZlciBmdW5jKCkgewotCQlwLmxpc3RlbmVyID0gbmlsCi0JfSgpCisJdmFyIGVyciBlcnJvcgorCXAubXUuTG9jaygpCiAJaWYgcC5Jc0xpc3RlbmluZygpIHsKLQkJcmV0dXJuIHAubGlzdGVuZXIuQ2xvc2UoKQorCQllcnIgPSBwLmxpc3RlbmVyLkNsb3NlKCkKKwkJcC5saXN0ZW5lciA9IG5pbAogCX0KLQlyZXR1cm4gbmlsCisJcC5tdS5VbmxvY2soKQorCXJldHVybiBlcnIKIH0KIAogZnVuYyAocCAqVFNlcnZlclNvY2tldCkgSW50ZXJydXB0KCkgZXJyb3IgewogCXAubXUuTG9jaygpCiAJcC5pbnRlcnJ1cHRlZCA9IHRydWUKIAlwLm11LlVubG9jaygpCisJcC5DbG9zZSgpCiAKIAlyZXR1cm4gbmlsCiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTE5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXRfdGVzdC5nbwpAQCAtMCwwICsxLDYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImZtdCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0U29ja2V0SXNudExpc3RlbmluZ0FmdGVySW50ZXJydXB0KHQgKnRlc3RpbmcuVCkgeworCWhvc3QgOj0gIjEyNy4wLjAuMSIKKwlwb3J0IDo9IDkwOTAKKwlhZGRyIDo9IGZtdC5TcHJpbnRmKCIlczolZCIsIGhvc3QsIHBvcnQpCisKKwlzb2NrZXQgOj0gQ3JlYXRlU2VydmVyU29ja2V0KHQsIGFkZHIpCisJc29ja2V0Lkxpc3RlbigpCisJc29ja2V0LkludGVycnVwdCgpCisKKwluZXdTb2NrZXQgOj0gQ3JlYXRlU2VydmVyU29ja2V0KHQsIGFkZHIpCisJZXJyIDo9IG5ld1NvY2tldC5MaXN0ZW4oKQorCWRlZmVyIG5ld1NvY2tldC5JbnRlcnJ1cHQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRmFpbGVkIHRvIHJlYmluZHM6ICVzIiwgZXJyKQorCX0KK30KKworZnVuYyBUZXN0U29ja2V0Q29uY3VycmVuY3kodCAqdGVzdGluZy5UKSB7CisJaG9zdCA6PSAiMTI3LjAuMC4xIgorCXBvcnQgOj0gOTA5MAorCWFkZHIgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKKworCXNvY2tldCA6PSBDcmVhdGVTZXJ2ZXJTb2NrZXQodCwgYWRkcikKKwlnbyBmdW5jKCkgeyBzb2NrZXQuTGlzdGVuKCkgfSgpCisJZ28gZnVuYygpIHsgc29ja2V0LkludGVycnVwdCgpIH0oKQorfQorCitmdW5jIENyZWF0ZVNlcnZlclNvY2tldCh0ICp0ZXN0aW5nLlQsIGFkZHIgc3RyaW5nKSAqVFNlcnZlclNvY2tldCB7CisJc29ja2V0LCBlcnIgOj0gTmV3VFNlcnZlclNvY2tldChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0OiAlcyIsIGVycikKKwl9CisJcmV0dXJuIHNvY2tldAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2wuZ28KaW5kZXggZDMwZTJiYy4uZjVlMGMwNSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sLmdvCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgKAogCSJidWZpbyIKIAkiYnl0ZXMiCisJImNvbnRleHQiCiAJImVuY29kaW5nL2Jhc2U2NCIKIAkiZW5jb2RpbmcvanNvbiIKIAkiZm10IgpAQCAtNTksNyArNjAsNyBAQAogCXJldHVybiAiVU5LTk9XTi1QQVJTRS1DT05URVhUIgogfQogCi0vLyBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisvLyBTaW1wbGUgSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgogLy8KIC8vIFRoaXMgcHJvdG9jb2wgcHJvZHVjZXMvY29uc3VtZXMgYSBzaW1wbGUgb3V0cHV0IGZvcm1hdAogLy8gc3VpdGFibGUgZm9yIHBhcnNpbmcgYnkgc2NyaXB0aW5nIGxhbmd1YWdlcy4gIEl0IHNob3VsZCBub3QgYmUKQEAgLTE1Niw2ICsxNTcsNyBAQAogfQogCiBmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIpIGVycm9yIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKIAlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9CkBAIC0yNjksMTcgKzI3MSwxOCBAQAogCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CiAJCXJldHVybiBlCiAJfQotCWlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9RVU9URV9CWVRFUyk7IGUgIT0gbmlsIHsKKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9RVU9URV9CWVRFUyk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCX0KIAl3cml0ZXIgOj0gYmFzZTY0Lk5ld0VuY29kZXIoYmFzZTY0LlN0ZEVuY29kaW5nLCBwLndyaXRlcikKIAlpZiBfLCBlIDo9IHdyaXRlci5Xcml0ZSh2KTsgZSAhPSBuaWwgeworCQlwLndyaXRlci5SZXNldChwLnRyYW5zKSAvLyBUSFJJRlQtMzczNQogCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJfQogCWlmIGUgOj0gd3JpdGVyLkNsb3NlKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCX0KLQlpZiBfLCBlIDo9IHAud3JpdGVyLldyaXRlKEpTT05fUVVPVEVfQllURVMpOyBlICE9IG5pbCB7CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fUVVPVEVfQllURVMpOyBlICE9IG5pbCB7CiAJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAl9CiAJcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKQEAgLTI4Nyw2ICsyOTAsNyBAQAogCiAvLyBSZWFkaW5nIG1ldGhvZHMuCiBmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMiwgZXJyIGVycm9yKSB7CisJcC5yZXNldENvbnRleHRTdGFjaygpIC8vIFRIUklGVC0zNzM1CiAJaWYgaXNOdWxsLCBlcnIgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZXJyICE9IG5pbCB7CiAJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKIAl9CkBAIC01MDEsNyArNTA1LDcgQEAKIAkJaWYgZXJyICE9IG5pbCB7CiAJCQlyZXR1cm4gdiwgZXJyCiAJCX0KLQl9IGVsc2UgaWYgbGVuKGYpID49IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0geworCX0gZWxzZSBpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9OVUxMWzBdIHsKIAkJYiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpCiAJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCiAJCWlmIGVyciAhPSBuaWwgewpAQCAtNTMxLDcgKzUzNSw3IEBACiAJCWlmIGVyciAhPSBuaWwgewogCQkJcmV0dXJuIHYsIGVycgogCQl9Ci0JfSBlbHNlIGlmIGxlbihmKSA+PSAwICYmIGZbMF0gPT0gSlNPTl9OVUxMWzBdIHsKKwl9IGVsc2UgaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CiAJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQogCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQogCQlpZiBlcnIgIT0gbmlsIHsKQEAgLTU0OSw3ICs1NTMsNyBAQAogCXJldHVybiB2LCBwLlBhcnNlUG9zdFZhbHVlKCkKIH0KIAotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgRmx1c2goKSAoZXJyIGVycm9yKSB7CitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CiAJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLndyaXRlci5GbHVzaCgpKQogfQogCkBAIC01NjUsMTIgKzU2OSwxMiBAQAogCWN4dCA6PSBfUGFyc2VDb250ZXh0KHAuZHVtcENvbnRleHRbbGVuKHAuZHVtcENvbnRleHQpLTFdKQogCXN3aXRjaCBjeHQgewogCWNhc2UgX0NPTlRFWFRfSU5fTElTVCwgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgotCQlpZiBfLCBlIDo9IHAud3JpdGVyLldyaXRlKEpTT05fQ09NTUEpOyBlICE9IG5pbCB7CisJCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX0NPTU1BKTsgZSAhPSBuaWwgewogCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCQl9CiAJCWJyZWFrCiAJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKLQkJaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX0NPTE9OKTsgZSAhPSBuaWwgeworCQlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9DT0xPTik7IGUgIT0gbmlsIHsKIAkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAkJfQogCQlicmVhawpAQCAtNjI2LDcgKzYzMCw3IEBACiAJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9Ci0JaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX05VTEwpOyBlICE9IG5pbCB7CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fTlVMTCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCX0KIAlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQpAQCAtNjg0LDcgKzY4OCw3IEBACiB9CiAKIGZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dFN0cmluZ0RhdGEocyBzdHJpbmcpIGVycm9yIHsKLQlfLCBlIDo9IHAud3JpdGVyLldyaXRlKFtdYnl0ZShzKSkKKwlfLCBlIDo9IHAud3JpdGUoW11ieXRlKHMpKQogCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIH0KIApAQCAtNjkyLDcgKzY5Niw3IEBACiAJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9Ci0JaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX0xCUkFDRSk7IGUgIT0gbmlsIHsKKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9MQlJBQ0UpOyBlICE9IG5pbCB7CiAJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAl9CiAJcC5kdW1wQ29udGV4dCA9IGFwcGVuZChwLmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUKSkKQEAgLTcwMCw3ICs3MDQsNyBAQAogfQogCiBmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRPYmplY3RFbmQoKSBlcnJvciB7Ci0JaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX1JCUkFDRSk7IGUgIT0gbmlsIHsKKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9SQlJBQ0UpOyBlICE9IG5pbCB7CiAJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAl9CiAJcC5kdW1wQ29udGV4dCA9IHAuZHVtcENvbnRleHRbOmxlbihwLmR1bXBDb250ZXh0KS0xXQpAQCAtNzE0LDcgKzcxOCw3IEBACiAJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9Ci0JaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX0xCUkFDS0VUKTsgZSAhPSBuaWwgeworCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX0xCUkFDS0VUKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJfQogCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX0xJU1RfRklSU1QpKQpAQCAtNzIyLDcgKzcyNiw3IEBACiB9CiAKIGZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dExpc3RFbmQoKSBlcnJvciB7Ci0JaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX1JCUkFDS0VUKTsgZSAhPSBuaWwgeworCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1JCUkFDS0VUKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJfQogCXAuZHVtcENvbnRleHQgPSBwLmR1bXBDb250ZXh0WzpsZW4ocC5kdW1wQ29udGV4dCktMV0KQEAgLTEwNjEsNyArMTA2NSw3IEBACiAJZm9yIF8sIGNoYXIgOj0gcmFuZ2UgbGluZSB7CiAJCXN3aXRjaCBjaGFyIHsKIAkJZGVmYXVsdDoKLQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0aW5nIGVuZCBvZiBsaXN0IFwiXVwiLCBidXQgZm91bmQ6IFwiIiwgbGluZSwgIlwiIikKKwkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0aW5nIGVuZCBvZiBsaXN0IFwiXVwiLCBidXQgZm91bmQ6IFwiJXZcIiIsIGxpbmUpCiAJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQogCQljYXNlICcgJywgJ1xuJywgJ1xyJywgJ1x0JywgcnVuZShKU09OX1JCUkFDS0VUWzBdKToKIAkJCWJyZWFrCkBAIC0xMzEyLDkgKzEzMTYsMjMgQEAKIGZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHNhZmVQZWVrQ29udGFpbnMoYiBbXWJ5dGUpIGJvb2wgewogCWZvciBpIDo9IDA7IGkgPCBsZW4oYik7IGkrKyB7CiAJCWEsIF8gOj0gcC5yZWFkZXIuUGVlayhpICsgMSkKLQkJaWYgbGVuKGEpID09IDAgfHwgYVtpXSAhPSBiW2ldIHsKKwkJaWYgbGVuKGEpIDwgKGkrMSkgfHwgYVtpXSAhPSBiW2ldIHsKIAkJCXJldHVybiBmYWxzZQogCQl9CiAJfQogCXJldHVybiB0cnVlCiB9CisKKy8vIFJlc2V0IHRoZSBjb250ZXh0IHN0YWNrIHRvIGl0cyBpbml0aWFsIHN0YXRlLgorZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVzZXRDb250ZXh0U3RhY2soKSB7CisJcC5wYXJzZUNvbnRleHRTdGFjayA9IFtdaW50e2ludChfQ09OVEVYVF9JTl9UT1BMRVZFTCl9CisJcC5kdW1wQ29udGV4dCA9IFtdaW50e2ludChfQ09OVEVYVF9JTl9UT1BMRVZFTCl9Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHdyaXRlKGIgW11ieXRlKSAoaW50LCBlcnJvcikgeworCW4sIGVyciA6PSBwLndyaXRlci5Xcml0ZShiKQorCWlmIGVyciAhPSBuaWwgeworCQlwLndyaXRlci5SZXNldChwLnRyYW5zKSAvLyBUSFJJRlQtMzczNQorCX0KKwlyZXR1cm4gbiwgZXJyCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28KaW5kZXggOGYwZGNjOS4uMDEyNmRhMCAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbF90ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2xfdGVzdC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZW5jb2RpbmcvYmFzZTY0IgogCSJlbmNvZGluZy9qc29uIgogCSJmbXQiCkBAIC0zNyw3ICszOCw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUJvb2wodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtNjMsNyArNjQsNyBAQAogCQl9IGVsc2UgewogCQkJdHJhbnMuV3JpdGUoSlNPTl9GQUxTRSkKIAkJfQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkQm9vbCgpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTg4LDcgKzg5LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlQnl0ZSh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0xMTAsNyArMTExLDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkQnl0ZSgpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTEzNSw3ICsxMzYsNyBAQAogCQlpZiBlIDo9IHAuV3JpdGVJMTYodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtMTU3LDcgKzE1OCw3IEBACiAJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCiAJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZEkxNigpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTE4Miw3ICsxODMsNyBAQAogCQlpZiBlIDo9IHAuV3JpdGVJMzIodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtMjA0LDcgKzIwNSw3IEBACiAJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCiAJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZEkzMigpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTIyOCw3ICsyMjksNyBAQAogCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKLQl0cmFucy5GbHVzaCgpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJcyA6PSB0cmFucy5TdHJpbmcoKQogCXYsIGUgOj0gcC5SZWFkSTMyKCkKIApAQCAtMjUwLDcgKzI1MSw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUk2NCh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0yNzIsNyArMjczLDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQodmFsdWUsIDEwKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZEk2NCgpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTI5Niw3ICsyOTcsNyBAQAogCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKLQl0cmFucy5GbHVzaCgpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJcyA6PSB0cmFucy5TdHJpbmcoKQogCXYsIGUgOj0gcC5SZWFkSTY0KCkKIApAQCAtMzE4LDcgKzMxOSw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0zNTUsNyArMzU2LDcgQEAKIAkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCQluIDo9IE5ld051bWVyaWNGcm9tRG91YmxlKHZhbHVlKQogCQl0cmFucy5Xcml0ZVN0cmluZyhuLlN0cmluZygpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkRG91YmxlKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMzk0LDcgKzM5NSw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC00MTYsNyArNDE3LDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKHZhbHVlKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZFN0cmluZygpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTQ0MCw3ICs0NDEsNyBAQAogCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKLQl0cmFucy5GbHVzaCgpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJcyA6PSB0cmFucy5TdHJpbmcoKQogCXYsIGUgOj0gcC5SZWFkU3RyaW5nKCkKIAlpZiBlICE9IG5pbCB7CkBAIC00NjQsNyArNDY1LDcgQEAKIAlpZiBlIDo9IHAuV3JpdGVCaW5hcnkodmFsdWUpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJfQotCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCX0KIAlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC00ODcsNyArNDg4LDcgQEAKIAl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCiAJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKGI2NFN0cmluZykpCi0JdHJhbnMuRmx1c2goKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAl2LCBlIDo9IHAuUmVhZEJpbmFyeSgpCiAJaWYgZSAhPSBuaWwgewpAQCAtNTE2LDcgKzUxNyw3IEBACiAJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQotCXRyYW5zLkZsdXNoKCkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAlzIDo9IHRyYW5zLlN0cmluZygpCiAJYiwgZSA6PSBwLlJlYWRCaW5hcnkoKQogCXYgOj0gc3RyaW5nKGIpCkBAIC01NDIsNyArNTQzLDcgQEAKIAkJfQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKIAl9CiAJc3RyIDo9IHRyYW5zLlN0cmluZygpCkBAIC01OTYsNyArNTk3LDcgQEAKIAkJfQogCX0KIAlwLldyaXRlU2V0RW5kKCkKLQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQogCX0KIAlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTY1MywxMiArNjU0LDEyIEBACiAJCX0KIAl9CiAJcC5Xcml0ZU1hcEVuZCgpCi0JaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKIAl9CiAJc3RyIDo9IHRyYW5zLlN0cmluZygpCiAJaWYgc3RyWzBdICE9ICdbJyB8fCBzdHJbbGVuKHN0ciktMV0gIT0gJ10nIHsKLQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMsIHdyb3RlOiAlcSwgaW4gZ286ICVxIiwgdGhldHlwZSwgc3RyLCBET1VCTEVfVkFMVUVTKQorCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcywgd3JvdGU6ICV2LCBpbiBnbzogJXYiLCB0aGV0eXBlLCBzdHIsIERPVUJMRV9WQUxVRVMpCiAJfQogCWwgOj0gc3RyaW5ncy5TcGxpdChzdHJbMTpsZW4oc3RyKS0xXSwgIiwiKQogCWlmIGxlbihsKSA8IDMgewpAQCAtNzEzLDMgKzcxNCwyNSBAQAogCX0KIAl0cmFucy5DbG9zZSgpCiB9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sU2FmZVBlZWsodCAqdGVzdGluZy5UKSB7CisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXRyYW5zLldyaXRlKFtdYnl0ZXsnYScsICdiJ30pCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCisJdGVzdDEgOj0gcC5zYWZlUGVla0NvbnRhaW5zKFtdYnl0ZXsnYScsICdiJ30pCisJaWYgIXRlc3QxIHsKKwkJdC5GYXRhbGYoIlNob3VsZCBtYXRjaCBhdCB0ZXN0IDEiKQorCX0KKwkKKwl0ZXN0MiA6PSBwLnNhZmVQZWVrQ29udGFpbnMoW11ieXRleydhJywgJ2InLCAnYycsICdkJ30pCisJaWYgdGVzdDIgeworCQl0LkZhdGFsZigiU2hvdWxkIG5vdCBtYXRjaCBhdCB0ZXN0IDIiKQorCX0KKwkKKwl0ZXN0MyA6PSBwLnNhZmVQZWVrQ29udGFpbnMoW11ieXRleyd4JywgJ3knfSkKKwlpZiB0ZXN0MyB7CisJCXQuRmF0YWxmKCJTaG91bGQgbm90IG1hdGNoIGF0IHRlc3QgMyIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyLmdvIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyLmdvCmluZGV4IGE1NGQ4MDQuLjYwMzU4MDIgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlci5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXIuZ28KQEAgLTIyLDExICsyMiwxOSBAQAogaW1wb3J0ICgKIAkibG9nIgogCSJydW50aW1lL2RlYnVnIgorCSJzeW5jIgorCSJzeW5jL2F0b21pYyIKICkKIAotLy8gU2ltcGxlLCBub24tY29uY3VycmVudCBzZXJ2ZXIgZm9yIHRlc3RpbmcuCisvKgorICogVGhpcyBpcyBub3QgYSB0eXBpY2FsIFRTaW1wbGVTZXJ2ZXIgYXMgaXQgaXMgbm90IGJsb2NrZWQgYWZ0ZXIgYWNjZXB0IGEgc29ja2V0LgorICogSXQgaXMgbW9yZSBsaWtlIGEgVFRocmVhZGVkU2VydmVyIHRoYXQgY2FuIGhhbmRsZSBkaWZmZXJlbnQgY29ubmVjdGlvbnMgaW4gZGlmZmVyZW50IGdvcm91dGluZXMuCisgKiBUaGlzIHdpbGwgd29yayBpZiBnb2xhbmcgdXNlciBpbXBsZW1lbnRzIGEgY29ubi1wb29sIGxpa2UgdGhpbmcgaW4gY2xpZW50IHNpZGUuCisgKi8KIHR5cGUgVFNpbXBsZVNlcnZlciBzdHJ1Y3QgewotCXF1aXQgY2hhbiBzdHJ1Y3R7fQorCWNsb3NlZCBpbnQzMgorCXdnICAgICBzeW5jLldhaXRHcm91cAorCW11ICAgICBzeW5jLk11dGV4CiAKIAlwcm9jZXNzb3JGYWN0b3J5ICAgICAgIFRQcm9jZXNzb3JGYWN0b3J5CiAJc2VydmVyVHJhbnNwb3J0ICAgICAgICBUU2VydmVyVHJhbnNwb3J0CkBAIC04Niw3ICs5NCw2IEBACiAJCW91dHB1dFRyYW5zcG9ydEZhY3Rvcnk6IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCiAJCWlucHV0UHJvdG9jb2xGYWN0b3J5OiAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAogCQlvdXRwdXRQcm90b2NvbEZhY3Rvcnk6ICBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0JCXF1aXQ6IG1ha2UoY2hhbiBzdHJ1Y3R7fSwgMSksCiAJfQogfQogCkBAIC0xMTgsMjMgKzEyNSwzNyBAQAogCXJldHVybiBwLnNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKQogfQogCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBpbm5lckFjY2VwdCgpIChpbnQzMiwgZXJyb3IpIHsKKwljbGllbnQsIGVyciA6PSBwLnNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKQorCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQorCWNsb3NlZCA6PSBhdG9taWMuTG9hZEludDMyKCZwLmNsb3NlZCkKKwlpZiBjbG9zZWQgIT0gMCB7CisJCXJldHVybiBjbG9zZWQsIG5pbAorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGVycgorCX0KKwlpZiBjbGllbnQgIT0gbmlsIHsKKwkJcC53Zy5BZGQoMSkKKwkJZ28gZnVuYygpIHsKKwkJCWRlZmVyIHAud2cuRG9uZSgpCisJCQlpZiBlcnIgOj0gcC5wcm9jZXNzUmVxdWVzdHMoY2xpZW50KTsgZXJyICE9IG5pbCB7CisJCQkJbG9nLlByaW50bG4oImVycm9yIHByb2Nlc3NpbmcgcmVxdWVzdDoiLCBlcnIpCisJCQl9CisJCX0oKQorCX0KKwlyZXR1cm4gMCwgbmlsCit9CisKIGZ1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIEFjY2VwdExvb3AoKSBlcnJvciB7CiAJZm9yIHsKLQkJY2xpZW50LCBlcnIgOj0gcC5zZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkKKwkJY2xvc2VkLCBlcnIgOj0gcC5pbm5lckFjY2VwdCgpCiAJCWlmIGVyciAhPSBuaWwgewotCQkJc2VsZWN0IHsKLQkJCWNhc2UgPC1wLnF1aXQ6Ci0JCQkJcmV0dXJuIG5pbAotCQkJZGVmYXVsdDoKLQkJCX0KIAkJCXJldHVybiBlcnIKIAkJfQotCQlpZiBjbGllbnQgIT0gbmlsIHsKLQkJCWdvIGZ1bmMoKSB7Ci0JCQkJaWYgZXJyIDo9IHAucHJvY2Vzc1JlcXVlc3RzKGNsaWVudCk7IGVyciAhPSBuaWwgewotCQkJCQlsb2cuUHJpbnRsbigiZXJyb3IgcHJvY2Vzc2luZyByZXF1ZXN0OiIsIGVycikKLQkJCQl9Ci0JCQl9KCkKKwkJaWYgY2xvc2VkICE9IDAgeworCQkJcmV0dXJuIG5pbAogCQl9CiAJfQogfQpAQCAtMTQ5LDE1ICsxNzAsMjcgQEAKIH0KIAogZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgU3RvcCgpIGVycm9yIHsKLQlwLnF1aXQgPC0gc3RydWN0e317fQorCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQorCWlmIGF0b21pYy5Mb2FkSW50MzIoJnAuY2xvc2VkKSAhPSAwIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlhdG9taWMuU3RvcmVJbnQzMigmcC5jbG9zZWQsIDEpCiAJcC5zZXJ2ZXJUcmFuc3BvcnQuSW50ZXJydXB0KCkKKwlwLndnLldhaXQoKQogCXJldHVybiBuaWwKIH0KIAogZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgcHJvY2Vzc1JlcXVlc3RzKGNsaWVudCBUVHJhbnNwb3J0KSBlcnJvciB7CiAJcHJvY2Vzc29yIDo9IHAucHJvY2Vzc29yRmFjdG9yeS5HZXRQcm9jZXNzb3IoY2xpZW50KQotCWlucHV0VHJhbnNwb3J0IDo9IHAuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCi0Jb3V0cHV0VHJhbnNwb3J0IDo9IHAub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KQorCWlucHV0VHJhbnNwb3J0LCBlcnIgOj0gcC5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlvdXRwdXRUcmFuc3BvcnQsIGVyciA6PSBwLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KIAlpbnB1dFByb3RvY29sIDo9IHAuaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpCiAJb3V0cHV0UHJvdG9jb2wgOj0gcC5vdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KQogCWRlZmVyIGZ1bmMoKSB7CkBAIC0xNjUsNiArMTk4LDcgQEAKIAkJCWxvZy5QcmludGYoInBhbmljIGluIHByb2Nlc3NvcjogJXM6ICVzIiwgZSwgZGVidWcuU3RhY2soKSkKIAkJfQogCX0oKQorCiAJaWYgaW5wdXRUcmFuc3BvcnQgIT0gbmlsIHsKIAkJZGVmZXIgaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKQogCX0KQEAgLTE3MiwxMyArMjA2LDE5IEBACiAJCWRlZmVyIG91dHB1dFRyYW5zcG9ydC5DbG9zZSgpCiAJfQogCWZvciB7Ci0JCW9rLCBlcnIgOj0gcHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpCisJCWlmIGF0b21pYy5Mb2FkSW50MzIoJnAuY2xvc2VkKSAhPSAwIHsKKwkJCXJldHVybiBuaWwKKwkJfQorCisJCW9rLCBlcnIgOj0gcHJvY2Vzc29yLlByb2Nlc3MoZGVmYXVsdEN0eCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpCiAJCWlmIGVyciwgb2sgOj0gZXJyLihUVHJhbnNwb3J0RXhjZXB0aW9uKTsgb2sgJiYgZXJyLlR5cGVJZCgpID09IEVORF9PRl9GSUxFIHsKIAkJCXJldHVybiBuaWwKIAkJfSBlbHNlIGlmIGVyciAhPSBuaWwgewotCQkJbG9nLlByaW50ZigiZXJyb3IgcHJvY2Vzc2luZyByZXF1ZXN0OiAlcyIsIGVycikKIAkJCXJldHVybiBlcnIKIAkJfQorCQlpZiBlcnIsIG9rIDo9IGVyci4oVEFwcGxpY2F0aW9uRXhjZXB0aW9uKTsgb2sgJiYgZXJyLlR5cGVJZCgpID09IFVOS05PV05fTUVUSE9EIHsKKwkJCWNvbnRpbnVlCisJCX0KIAkJaWYgIW9rIHsKIAkJCWJyZWFrCiAJCX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlcl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxNDlhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlcl90ZXN0LmdvCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCisJImVycm9ycyIKKwkicnVudGltZSIKKykKKwordHlwZSBtb2NrU2VydmVyVHJhbnNwb3J0IHN0cnVjdCB7CisJTGlzdGVuRnVuYyAgICBmdW5jKCkgZXJyb3IKKwlBY2NlcHRGdW5jICAgIGZ1bmMoKSAoVFRyYW5zcG9ydCwgZXJyb3IpCisJQ2xvc2VGdW5jICAgICBmdW5jKCkgZXJyb3IKKwlJbnRlcnJ1cHRGdW5jIGZ1bmMoKSBlcnJvcgorfQorCitmdW5jIChtICptb2NrU2VydmVyVHJhbnNwb3J0KSBMaXN0ZW4oKSBlcnJvciB7CisJcmV0dXJuIG0uTGlzdGVuRnVuYygpCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIEFjY2VwdCgpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBtLkFjY2VwdEZ1bmMoKQorfQorCitmdW5jIChtICptb2NrU2VydmVyVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlyZXR1cm4gbS5DbG9zZUZ1bmMoKQorfQorCitmdW5jIChtICptb2NrU2VydmVyVHJhbnNwb3J0KSBJbnRlcnJ1cHQoKSBlcnJvciB7CisJcmV0dXJuIG0uSW50ZXJydXB0RnVuYygpCit9CisKK3R5cGUgbW9ja1RUcmFuc3BvcnQgc3RydWN0IHsKKwlUVHJhbnNwb3J0Cit9CisKK2Z1bmMgKG0gKm1vY2tUVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgVGVzdE11bHRpcGxlU3RvcCh0ICp0ZXN0aW5nLlQpIHsKKwlwcm9jIDo9ICZtb2NrUHJvY2Vzc29yeworCQlQcm9jZXNzRnVuYzogZnVuYyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKKwkJCXJldHVybiBmYWxzZSwgbmlsCisJCX0sCisJfQorCisJdmFyIGludGVycnVwdENhbGxlZCBib29sCisJYyA6PSBtYWtlKGNoYW4gc3RydWN0e30pCisJdHJhbnMgOj0gJm1vY2tTZXJ2ZXJUcmFuc3BvcnR7CisJCUxpc3RlbkZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUFjY2VwdEZ1bmM6IGZ1bmMoKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwkJCTwtYworCQkJcmV0dXJuIG5pbCwgbmlsCisJCX0sCisJCUNsb3NlRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCWMgPC0gc3RydWN0e317fQorCQkJcmV0dXJuIG5pbAorCQl9LAorCQlJbnRlcnJ1cHRGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJaW50ZXJydXB0Q2FsbGVkID0gdHJ1ZQorCQkJcmV0dXJuIG5pbAorCQl9LAorCX0KKworCXNlcnYgOj0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJZ28gc2Vydi5TZXJ2ZSgpCisJc2Vydi5TdG9wKCkKKwlpZiAhaW50ZXJydXB0Q2FsbGVkIHsKKwkJdC5FcnJvcigiZmlyc3Qgc2VydmVyIHRyYW5zcG9ydCBzaG91bGQgaGF2ZSBiZWVuIGludGVycnVwdGVkIikKKwl9CisKKwlzZXJ2ID0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJaW50ZXJydXB0Q2FsbGVkID0gZmFsc2UKKwlnbyBzZXJ2LlNlcnZlKCkKKwlzZXJ2LlN0b3AoKQorCWlmICFpbnRlcnJ1cHRDYWxsZWQgeworCQl0LkVycm9yKCJzZWNvbmQgc2VydmVyIHRyYW5zcG9ydCBzaG91bGQgaGF2ZSBiZWVuIGludGVycnVwdGVkIikKKwl9Cit9CisKK2Z1bmMgVGVzdFdhaXRSYWNlKHQgKnRlc3RpbmcuVCkgeworCXByb2MgOj0gJm1vY2tQcm9jZXNzb3J7CisJCVByb2Nlc3NGdW5jOiBmdW5jKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJfSwKKwl9CisKKwl0cmFucyA6PSAmbW9ja1NlcnZlclRyYW5zcG9ydHsKKwkJTGlzdGVuRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJQWNjZXB0RnVuYzogZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCQkJcmV0dXJuICZtb2NrVFRyYW5zcG9ydHt9LCBuaWwKKwkJfSwKKwkJQ2xvc2VGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlJbnRlcnJ1cHRGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCX0KKworCXNlcnYgOj0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJZ28gc2Vydi5TZXJ2ZSgpCisJcnVudGltZS5Hb3NjaGVkKCkKKwlzZXJ2LlN0b3AoKQorfQorCitmdW5jIFRlc3ROb0hhbmdEdXJpbmdTdG9wRnJvbURhbmdsaW5nTG9ja0FjcXVpcmVEdXJpbmdBY2NlcHRMb29wKHQgKnRlc3RpbmcuVCkgeworCXByb2MgOj0gJm1vY2tQcm9jZXNzb3J7CisJCVByb2Nlc3NGdW5jOiBmdW5jKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJfSwKKwl9CisKKwl0cmFucyA6PSAmbW9ja1NlcnZlclRyYW5zcG9ydHsKKwkJTGlzdGVuRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJQWNjZXB0RnVuYzogZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCQkJcmV0dXJuIG5pbCwgZXJyb3JzLk5ldygibm8gc2lyIikKKwkJfSwKKwkJQ2xvc2VGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlJbnRlcnJ1cHRGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCX0KKworCXNlcnYgOj0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJZ28gc2Vydi5TZXJ2ZSgpCisJcnVudGltZS5Hb3NjaGVkKCkKKwlzZXJ2LlN0b3AoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbwppbmRleCA4MmUyOGI0Li44ODU0Mjc5IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkibmV0IgogCSJ0aW1lIgogKQpAQCAtMTQ4LDcgKzE0OSw3IEBACiAJcmV0dXJuIHAuY29ubi5Xcml0ZShidWYpCiB9CiAKLWZ1bmMgKHAgKlRTb2NrZXQpIEZsdXNoKCkgZXJyb3IgeworZnVuYyAocCAqVFNvY2tldCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgewogCXJldHVybiBuaWwKIH0KIApAQCAtMTYxLDYgKzE2Miw1IEBACiAKIGZ1bmMgKHAgKlRTb2NrZXQpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKIAljb25zdCBtYXhTaXplID0gXnVpbnQ2NCgwKQotCXJldHVybiBtYXhTaXplICAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAogfQotCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NzbF9zZXJ2ZXJfc29ja2V0LmdvIGIvbGliL2dvL3RocmlmdC9zc2xfc2VydmVyX3NvY2tldC5nbwppbmRleCA1OGY4NTliLi45MDdhZmNhIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NzbF9zZXJ2ZXJfc29ja2V0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvc3NsX3NlcnZlcl9zb2NrZXQuZ28KQEAgLTIwLDkgKzIwLDkgQEAKIHBhY2thZ2UgdGhyaWZ0CiAKIGltcG9ydCAoCisJImNyeXB0by90bHMiCiAJIm5ldCIKIAkidGltZSIKLQkiY3J5cHRvL3RscyIKICkKIAogdHlwZSBUU1NMU2VydmVyU29ja2V0IHN0cnVjdCB7CkBAIC0zOCw2ICszOCw5IEBACiB9CiAKIGZ1bmMgTmV3VFNTTFNlcnZlclNvY2tldFRpbWVvdXQobGlzdGVuQWRkciBzdHJpbmcsIGNmZyAqdGxzLkNvbmZpZywgY2xpZW50VGltZW91dCB0aW1lLkR1cmF0aW9uKSAoKlRTU0xTZXJ2ZXJTb2NrZXQsIGVycm9yKSB7CisJaWYgY2ZnLk1pblZlcnNpb24gPT0gMCB7CisJCWNmZy5NaW5WZXJzaW9uID0gdGxzLlZlcnNpb25UTFMxMAorCX0KIAlhZGRyLCBlcnIgOj0gbmV0LlJlc29sdmVUQ1BBZGRyKCJ0Y3AiLCBsaXN0ZW5BZGRyKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gbmlsLCBlcnIKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc3NsX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc3NsX3NvY2tldC5nbwppbmRleCAwNGQzODUwLi5iYTYzMzc3IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NzbF9zb2NrZXQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9zc2xfc29ja2V0LmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJjcnlwdG8vdGxzIgogCSJuZXQiCiAJInRpbWUiCkBAIC00OCw2ICs0OSw5IEBACiAvLyBOZXdUU1NMU29ja2V0VGltZW91dCBjcmVhdGVzIGEgbmV0LkNvbm4tYmFja2VkIFRUcmFuc3BvcnQsIGdpdmVuIGEgaG9zdCBhbmQgcG9ydAogLy8gaXQgYWxzbyBhY2NlcHRzIGEgdGxzIENvbmZpZ3VyYXRpb24gYW5kIGEgdGltZW91dCBhcyBhIHRpbWUuRHVyYXRpb24KIGZ1bmMgTmV3VFNTTFNvY2tldFRpbWVvdXQoaG9zdFBvcnQgc3RyaW5nLCBjZmcgKnRscy5Db25maWcsIHRpbWVvdXQgdGltZS5EdXJhdGlvbikgKCpUU1NMU29ja2V0LCBlcnJvcikgeworCWlmIGNmZy5NaW5WZXJzaW9uID09IDAgeworCQljZmcuTWluVmVyc2lvbiA9IHRscy5WZXJzaW9uVExTMTAKKwl9CiAJcmV0dXJuICZUU1NMU29ja2V0e2hvc3RQb3J0OiBob3N0UG9ydCwgdGltZW91dDogdGltZW91dCwgY2ZnOiBjZmd9LCBuaWwKIH0KIApAQCAtODcsNyArOTEsOCBAQAogCS8vIElmIHdlIGhhdmUgYSBob3N0bmFtZSwgd2UgbmVlZCB0byBwYXNzIHRoZSBob3N0bmFtZSB0byB0bHMuRGlhbCBmb3IKIAkvLyBjZXJ0aWZpY2F0ZSBob3N0bmFtZSBjaGVja3MuCiAJaWYgcC5ob3N0UG9ydCAhPSAiIiB7Ci0JCWlmIHAuY29ubiwgZXJyID0gdGxzLkRpYWwoInRjcCIsIHAuaG9zdFBvcnQsIHAuY2ZnKTsgZXJyICE9IG5pbCB7CisJCWlmIHAuY29ubiwgZXJyID0gdGxzLkRpYWxXaXRoRGlhbGVyKCZuZXQuRGlhbGVyeworCQkJVGltZW91dDogcC50aW1lb3V0fSwgInRjcCIsIHAuaG9zdFBvcnQsIHAuY2ZnKTsgZXJyICE9IG5pbCB7CiAJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgZXJyLkVycm9yKCkpCiAJCX0KIAl9IGVsc2UgewpAQCAtMTAzLDcgKzEwOCw4IEBACiAJCWlmIGxlbihwLmFkZHIuU3RyaW5nKCkpID09IDAgewogCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYWQgYWRkcmVzcy4iKQogCQl9Ci0JCWlmIHAuY29ubiwgZXJyID0gdGxzLkRpYWwocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpLCBwLmNmZyk7IGVyciAhPSBuaWwgeworCQlpZiBwLmNvbm4sIGVyciA9IHRscy5EaWFsV2l0aERpYWxlcigmbmV0LkRpYWxlcnsKKwkJCVRpbWVvdXQ6IHAudGltZW91dH0sIHAuYWRkci5OZXR3b3JrKCksIHAuYWRkci5TdHJpbmcoKSwgcC5jZmcpOyBlcnIgIT0gbmlsIHsKIAkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCBlcnIuRXJyb3IoKSkKIAkJfQogCX0KQEAgLTE1Myw3ICsxNTksNyBAQAogCXJldHVybiBwLmNvbm4uV3JpdGUoYnVmKQogfQogCi1mdW5jIChwICpUU1NMU29ja2V0KSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKIAlyZXR1cm4gbmlsCiB9CiAKQEAgLTE2Niw2ICsxNzIsNSBAQAogCiBmdW5jIChwICpUU1NMU29ja2V0KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CiAJY29uc3QgbWF4U2l6ZSA9IF51aW50NjQoMCkKLQlyZXR1cm4gbWF4U2l6ZSAgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorCXJldHVybiBtYXhTaXplIC8vIHRoZSB0aHJ1dGggaXMsIHdlIGp1c3QgZG9uJ3Qga25vdyB1bmxlc3MgZnJhbWVkIGlzIHVzZWQKIH0KLQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbwppbmRleCA0NTM4OTk2Li5iYTI3MzhhIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZXJyb3JzIgogCSJpbyIKICkKQEAgLTMwLDE1ICszMSwxOCBAQAogCUZsdXNoKCkgKGVyciBlcnJvcikKIH0KIAordHlwZSBDb250ZXh0Rmx1c2hlciBpbnRlcmZhY2UgeworCUZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpCit9CisKIHR5cGUgUmVhZFNpemVQcm92aWRlciBpbnRlcmZhY2UgewogCVJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpCiB9CiAKLQogLy8gRW5jYXBzdWxhdGVzIHRoZSBJL08gbGF5ZXIKIHR5cGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UgewogCWlvLlJlYWRXcml0ZUNsb3NlcgotCUZsdXNoZXIKKwlDb250ZXh0Rmx1c2hlcgogCVJlYWRTaXplUHJvdmlkZXIKIAogCS8vIE9wZW5zIHRoZSB0cmFuc3BvcnQgZm9yIGNvbW11bmljYXRpb24KQEAgLTUyLDcgKzU2LDYgQEAKIAlXcml0ZVN0cmluZyhzIHN0cmluZykgKG4gaW50LCBlcnIgZXJyb3IpCiB9CiAKLQogLy8gVGhpcyBpcyAiZW5jaGFuY2VkIiB0cmFuc3BvcnQgd2l0aCBleHRyYSBjYXBhYmlsaXRpZXMuIFlvdSBuZWVkIHRvIHVzZSBvbmUgb2YgdGhlc2UKIC8vIHRvIGNvbnN0cnVjdCBwcm90b2NvbC4KIC8vIE5vdGFibHksIFRTb2NrZXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBhbmQgaXQgaXMgYWx3YXlzIGEgbWlzdGFrZSB0byB1c2UKQEAgLTYyLDcgKzY1LDYgQEAKIAlpby5CeXRlUmVhZGVyCiAJaW8uQnl0ZVdyaXRlcgogCXN0cmluZ1dyaXRlcgotCUZsdXNoZXIKKwlDb250ZXh0Rmx1c2hlcgogCVJlYWRTaXplUHJvdmlkZXIKIH0KLQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2ZhY3RvcnkuZ28KaW5kZXggNTMzZDFiNC4uYzgwNTgwNyAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZmFjdG9yeS5nbworKysgYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9mYWN0b3J5LmdvCkBAIC0yNCwxNCArMjQsMTQgQEAKIC8vIGEgU2VydmVyVHJhbnNwb3J0IGFuZCB0aGVuIG1heSB3YW50IHRvIG11dGF0ZSB0aGVtIChpLmUuIGNyZWF0ZQogLy8gYSBCdWZmZXJlZFRyYW5zcG9ydCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJhc2UgdHJhbnNwb3J0KQogdHlwZSBUVHJhbnNwb3J0RmFjdG9yeSBpbnRlcmZhY2UgewotCUdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0CisJR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikKIH0KIAogdHlwZSB0VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3R7fQogCiAvLyBSZXR1cm4gYSB3cmFwcGVkIGluc3RhbmNlIG9mIHRoZSBiYXNlIFRyYW5zcG9ydC4KLWZ1bmMgKHAgKnRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7Ci0JcmV0dXJuIHRyYW5zCitmdW5jIChwICp0VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiB0cmFucywgbmlsCiB9CiAKIGZ1bmMgTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeSB7CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfdGVzdC5nbwppbmRleCA4NjQ5NThhLi4wMTI3ODAzIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF90ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgdGhyaWZ0CiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImlvIgogCSJuZXQiCiAJInN0cmNvbnYiCkBAIC01NCw3ICs1NSw3IEBACiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHdyaXRlIGJpbmFyeSBkYXRhIG9mIGxlbmd0aCAlZDogJXMiLCB3cml0ZVRyYW5zLCBsZW4odHJhbnNwb3J0X2JkYXRhKSwgZXJyKQogCX0KLQllcnIgPSB3cml0ZVRyYW5zLkZsdXNoKCkKKwllcnIgPSB3cml0ZVRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCBmbHVzaCB3cml0ZSBvZiBiaW5hcnkgZGF0YTogJXMiLCB3cml0ZVRyYW5zLCBlcnIpCiAJfQpAQCAtNzQsNyArNzUsNyBAQAogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCB3cml0ZSBiaW5hcnkgZGF0YSAyIG9mIGxlbmd0aCAlZDogJXMiLCB3cml0ZVRyYW5zLCBsZW4odHJhbnNwb3J0X2JkYXRhKSwgZXJyKQogCX0KLQllcnIgPSB3cml0ZVRyYW5zLkZsdXNoKCkKKwllcnIgPSB3cml0ZVRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCBmbHVzaCB3cml0ZSBiaW5hcnkgZGF0YSAyOiAlcyIsIHdyaXRlVHJhbnMsIGVycikKIAl9CkBAIC0xMTMsNyArMTE0LDcgQEAKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3Qgd3JpdGUgYmluYXJ5IGRhdGEgb2YgbGVuZ3RoICVkOiAlcyIsIHdyaXRlVHJhbnMsIGxlbih0cmFuc3BvcnRfYmRhdGEpLCBlcnIpCiAJfQotCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goKQorCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGZsdXNoIHdyaXRlIG9mIGJpbmFyeSBkYXRhOiAlcyIsIHdyaXRlVHJhbnMsIGVycikKIAl9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3R5cGUuZ28gYi9saWIvZ28vdGhyaWZ0L3R5cGUuZ28KaW5kZXggN2M2OGMyYi4uNDI5MmZmYyAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC90eXBlLmdvCisrKyBiL2xpYi9nby90aHJpZnQvdHlwZS5nbwpAQCAtNDAsNyArNDAsNyBAQAogCUxJU1QgICA9IDE1CiAJVVRGOCAgID0gMTYKIAlVVEYxNiAgPSAxNwotCUJJTkFSWSA9IDE4CisJLy9CSU5BUlkgPSAxOCAgIHdyb25nIGFuZCB1bnVzdWVkCiApCiAKIHZhciB0eXBlTmFtZXMgPSBtYXBbaW50XXN0cmluZ3sKQEAgLTQ4LDYgKzQ4LDcgQEAKIAlWT0lEOiAgICJWT0lEIiwKIAlCT09MOiAgICJCT09MIiwKIAlCWVRFOiAgICJCWVRFIiwKKwlET1VCTEU6ICJET1VCTEUiLAogCUkxNjogICAgIkkxNiIsCiAJSTMyOiAgICAiSTMyIiwKIAlJNjQ6ICAgICJJNjQiLApkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvemxpYl90cmFuc3BvcnQuZ28KaW5kZXggZTQ3NDU1Zi4uZjNkNDI2NyAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvCkBAIC0yMSwxMyArMjEsMTUgQEAKIAogaW1wb3J0ICgKIAkiY29tcHJlc3MvemxpYiIKKwkiY29udGV4dCIKIAkiaW8iCiAJImxvZyIKICkKIAogLy8gVFpsaWJUcmFuc3BvcnRGYWN0b3J5IGlzIGEgZmFjdG9yeSBmb3IgVFpsaWJUcmFuc3BvcnQgaW5zdGFuY2VzCiB0eXBlIFRabGliVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgewotCWxldmVsIGludAorCWxldmVsICAgaW50CisJZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeQogfQogCiAvLyBUWmxpYlRyYW5zcG9ydCBpcyBhIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24gdGhhdCBtYWtlcyB1c2Ugb2YgemxpYiBjb21wcmVzc2lvbi4KQEAgLTM4LDE0ICs0MCwyNyBAQAogfQogCiAvLyBHZXRUcmFuc3BvcnQgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBOZXdUWmxpYlRyYW5zcG9ydAotZnVuYyAocCAqVFpsaWJUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7Ci0JdCwgXyA6PSBOZXdUWmxpYlRyYW5zcG9ydCh0cmFucywgcC5sZXZlbCkKLQlyZXR1cm4gdAorZnVuYyAocCAqVFpsaWJUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgcC5mYWN0b3J5ICE9IG5pbCB7CisJCS8vIHdyYXAgb3RoZXIgZmFjdG9yeQorCQl2YXIgZXJyIGVycm9yCisJCXRyYW5zLCBlcnIgPSBwLmZhY3RvcnkuR2V0VHJhbnNwb3J0KHRyYW5zKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBuaWwsIGVycgorCQl9CisJfQorCXJldHVybiBOZXdUWmxpYlRyYW5zcG9ydCh0cmFucywgcC5sZXZlbCkKIH0KIAogLy8gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5IGNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5CiBmdW5jIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeShsZXZlbCBpbnQpICpUWmxpYlRyYW5zcG9ydEZhY3RvcnkgewotCXJldHVybiAmVFpsaWJUcmFuc3BvcnRGYWN0b3J5e2xldmVsOiBsZXZlbH0KKwlyZXR1cm4gJlRabGliVHJhbnNwb3J0RmFjdG9yeXtsZXZlbDogbGV2ZWwsIGZhY3Rvcnk6IG5pbH0KK30KKworLy8gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5IGNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgVFpsaWJUcmFuc3BvcnRGYWN0b3J5CisvLyBhcyBhIHdyYXBwZXIgb3ZlciBleGlzdGluZyB0cmFuc3BvcnQgZmFjdG9yeQorZnVuYyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnlXaXRoRmFjdG9yeShsZXZlbCBpbnQsIGZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnkpICpUWmxpYlRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVFpsaWJUcmFuc3BvcnRGYWN0b3J5e2xldmVsOiBsZXZlbCwgZmFjdG9yeTogZmFjdG9yeX0KIH0KIAogLy8gTmV3VFpsaWJUcmFuc3BvcnQgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBUWmxpYlRyYW5zcG9ydApAQCAtNzcsMTEgKzkyLDExIEBACiB9CiAKIC8vIEZsdXNoIGZsdXNoZXMgdGhlIHdyaXRlciBhbmQgaXRzIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIEZsdXNoKCkgZXJyb3IgeworZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKIAlpZiBlcnIgOj0gei53cml0ZXIuRmx1c2goKTsgZXJyICE9IG5pbCB7CiAJCXJldHVybiBlcnIKIAl9Ci0JcmV0dXJuIHoudHJhbnNwb3J0LkZsdXNoKCkKKwlyZXR1cm4gei50cmFuc3BvcnQuRmx1c2goY3R4KQogfQogCiAvLyBJc09wZW4gcmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbgpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydF90ZXN0LmdvCmluZGV4IGY1NzYxMGMuLjNjNmYxMWUgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvemxpYl90cmFuc3BvcnRfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTMxLDMgKzMxLDMyIEBACiAJfQogCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQogfQorCit0eXBlIER1bW15VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3R7fQorCitmdW5jIChwICpEdW1teVRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlcigpLCBuaWwKK30KKworZnVuYyBUZXN0WmxpYkZhY3RvcnlUcmFuc3BvcnRXaXRoRmFjdG9yeSh0ICp0ZXN0aW5nLlQpIHsKKwlmYWN0b3J5IDo9IE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KAorCQl6bGliLkJlc3RDb21wcmVzc2lvbiwKKwkJJkR1bW15VHJhbnNwb3J0RmFjdG9yeXt9LAorCSkKKwlidWZmZXIgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJdHJhbnMsIGVyciA6PSBmYWN0b3J5LkdldFRyYW5zcG9ydChidWZmZXIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KKworZnVuYyBUZXN0WmxpYkZhY3RvcnlUcmFuc3BvcnRXaXRob3V0RmFjdG9yeSh0ICp0ZXN0aW5nLlQpIHsKKwlmYWN0b3J5IDo9IE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KHpsaWIuQmVzdENvbXByZXNzaW9uLCBuaWwpCisJYnVmZmVyIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXRyYW5zLCBlcnIgOj0gZmFjdG9yeS5HZXRUcmFuc3BvcnQoYnVmZmVyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9SRUFETUUubWQgYi9saWIvaGF4ZS9SRUFETUUubWQKaW5kZXggZmQ0ZGViZS4uYzlmNzRiNSAxMDA2NDQKLS0tIGEvbGliL2hheGUvUkVBRE1FLm1kCisrKyBiL2xpYi9oYXhlL1JFQURNRS5tZApAQCAtNDQsOSArNDQsOSBAQAogSGF4ZSBvbiBMaW51eCAKIC0tLS0tLS0tLS0tLS0tLQogCi1Gb3IgTGludXggcGxhdGZvcm1zIGl0IGlzIHJlY29tbWVuZGVkIG5vdCB0byBkb3dubG9hZCB0aGUgCi1iaW5hcmllcyBtYW51YWxseSwgaW5zdGVhZCB1c2UgdGhlIEhheGUgaW5zdGFsbGF0aW9uIHNoZWxsIAotc2NyaXB0IHdoaWNoIGNhbiBiZSBmb3VuZCBhdCBgaHR0cDovL3d3dy5vcGVuZmwub3JnL2Rvd25sb2FkYC4KK0ZvciBMaW51eCBwbGF0Zm9ybXMgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBkaXN0cm8tc3BlY2lmaWMgcGFja2FnZQorbWFuYWdlciwgd2hlcmUgcG9zc2libGUuIE1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGF0IHRoZSAKK0hheGUgTGludXggZG93bmxvYWQgc2VjdGlvbjogaHR0cDovL2hheGUub3JnL2Rvd25sb2FkL2xpbnV4CiAKIElmIHlvdSBydW4gaW50byB0aGUgZXJyb3IgbWVzc2FnZSAKIApAQCAtNjksMTQgKzY5LDEyIEBACiBUaHJpZnQgSGF4ZSBiaW5kaW5ncyBjYW4gYmUgc2V0IHVwIHZpYSB0aGUgYGhheGVsaWJgIHRvb2wgIAogZWl0aGVyIGZyb20gdGhlIG9mZmljaWFsIEFTRiByZXBvLCBvciB2aWEgdGhlIGdpdGh1YiBtaXJyb3IuCiAKLS0gVG8gc2V0IHVwIGFueSAqKnN0YWJsZSB2ZXJzaW9uKiosIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgYnJhbmNoIChlLmcuIGAwLjkuM2ApOgorLSBUbyBzZXQgdXAgYW55ICoqc3RhYmxlIHZlcnNpb24qKiwgY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSBicmFuY2ggKGUuZy4gYDAuMTIuMGApOgogCi0gICAgLSBgaGF4ZWxpYiBnaXQgdGhyaWZ0IGh0dHBzOi8vZ2l0LmFwYWNoZS5vcmcvdGhyaWZ0LmdpdCAwLjkuMyBsaWIvaGF4ZWAKLSAgICAtIGBoYXhlbGliIGdpdCB0aHJpZnQgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IDAuOS4zIGxpYi9oYXhlYAorICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQgMC4xMi4wIGxpYi9oYXhlYAogCiAtIFRvIHNldCB1cCB0aGUgY3VycmVudCAqKmRldmVsb3BtZW50IHZlcnNpb24qKiwgdXNlIHRoZSBgbWFzdGVyYCBicmFuY2g6CiAgIAotICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdC5hcGFjaGUub3JnL3RocmlmdC5naXQgbWFzdGVyIGxpYi9oYXhlYAkKICAgICAtIGBoYXhlbGliIGdpdCB0aHJpZnQgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IG1hc3RlciBsaWIvaGF4ZWAKIAogQXMgdXN1YWwsIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBjYW4gYmUgdXBkYXRlZCB1c2luZyBgaGF4ZWxpYiB1cGdyYWRlYCAKQEAgLTk0LDcgKzkyLDggQEAKIEN1cnJlbnQgc3RhdHVzCiA9PT09PT09PT09PT09PT09PT09PT09PT0KIC0gdGVzdGVkIHdpdGggSGF4ZSBDKysgdGFyZ2V0Ci0tIHRyYW5zcG9ydHM6IFNvY2tldCwgSFRUUCAoY2xpZW50IG9ubHkpLCBTdHJlYW0KKy0gdGVzdGVkIHdpdGggSGF4ZSBQSFAgdGFyZ2V0IChjb25zb2xlL3dlYiBzZXJ2ZXIsIGJpbmFyeSBwcm90b2NvbHMpCistIHRyYW5zcG9ydHM6IFNvY2tldCwgSFRUUCAoc2VydmVycyBydW4gaW5zaWRlIFBIUCBzZXJ2ZXIvUEhQIHRhcmdldCBvbmx5KSwgU3RyZWFtCiAtIHByb3RvY29sczogQmluYXJ5LCBKU09OLCBNdWx0aXBsZXgsIENvbXBhY3QKIC0gdHV0b3JpYWwgY2xpZW50IGFuZCBzZXJ2ZXIgYXZhaWxhYmxlCiAtIGNyb3NzLXRlc3QgY2xpZW50IGFuZCBzZXJ2ZXIgYXZhaWxhYmxlIApAQCAtMTE2LDMgKzExNSw0OCBAQAogSmF2YXNjcmlwdDoKIC0gdHV0b3JpYWwgZmFpbHMgdG8gYnVpbGQgYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCBTeXMuYXJncwogCitQSFAgSFRUUCBTZXJ2ZXIgbm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PQorCistIHlvdSBoYXZlIHRvIGltcG9ydCBQSFAgZmlsZXMgZ2VuZXJhdGVkIGJ5IGhheGUgaW50byBQSFAKK2BgYHBocAorcmVxdWlyZV9vbmNlICBkaXJuYW1lKF9fRklMRV9fKSAuICcvYmluL3BocC13ZWItc2VydmVyL01haW4tZGVidWcucGhwJzsKK2BgYAorCistIHRyYWNlKCkgYnkgZGVmYXVsdCBvdXRwdXRzIGludG8gc3Rkb3V0IChodHRwIHJlc3BvbnNlKSwgc28geW91IGhhdmUgdG8gcmVkaXJlY3QgaXQgdG8gc3RkZXJyIG9yIHlvdSBvd24gbG9ncywgc29tZXRoaW5nIGxpa2UKK2BgYGhheGUKKy8vcmVtYXAgdHJhY2UgdG8gZXJyb3IgbG9nCitoYXhlLkxvZy50cmFjZSA9IGZ1bmN0aW9uKHY6RHluYW1pYywgP2luZm9zOmhheGUuUG9zSW5mb3MpIAoreyAKKwkvL3NpbXVsYXRlIG5vcm1hbCB0cmFjZSBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9ibG9iL2RldmVsb3BtZW50L3N0ZC9oYXhlL0xvZy5oeAorCXZhciBuZXdWYWx1ZSA6IER5bmFtaWM7CisJaWYgKGluZm9zICE9IG51bGwgJiYgaW5mb3MuY3VzdG9tUGFyYW1zIT1udWxsKSB7CisJCXZhciBleHRyYTpTdHJpbmcgPSAiIjsKKwkJZm9yKCB2IGluIGluZm9zLmN1c3RvbVBhcmFtcyApCisJCQlleHRyYSArPSAiLCIgKyB2OworCQluZXdWYWx1ZSA9IHYgKyBleHRyYTsKKwl9CisJZWxzZSB7CisJCW5ld1ZhbHVlID0gdjsKKwl9CisJdmFyIG1zZyA9IGluZm9zICE9IG51bGwgPyBpbmZvcy5maWxlTmFtZSArICc6JyArIGluZm9zLmxpbmVOdW1iZXIgKyAnOiAnIDogJyc7CisJU3lzLnN0ZGVycigpLndyaXRlU3RyaW5nKCcke21zZ30ke25ld1ZhbHVlfVxuJyk7Cit9CitgYGAKKworLSB0byBhbGxvdyB0aHJpZnQgc2VydmVyIHRvIHJlYWQvd3JpdGUgSFRUUCByZXF1ZXN0L3Jlc3BvbnNlLCBpdCBzaG91bGQgYmUgcG9pbnRlZCBvdXQgdG8gcGhwIHN0cmVhbXMKK2BgYGhheGUKK3RyYW5zcG9ydCA9CW5ldyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQoCisJCQkJbmV3IFRTdHJlYW1UcmFuc3BvcnQoCisJCQkJCW5ldyBURmlsZVN0cmVhbSgicGhwOi8vaW5wdXQiLCBSZWFkKSwKKwkJCQkJbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9vdXRwdXQiLCBBcHBlbmQpCisJCQkJCSkKKwkJCQkpOworYGBgCisKKy0gVFNpbXBsZVNlcnZlciBkb2Vzbid0IHN0b3AgYWZ0ZXIgZmlyc3QgY2FsbCwgc28gcHJvY2Vzc29yLnByb2Nlc3MoKSBzaG91bGQgYmUgY2FsbGVkIGluc3RlYWQsIG9yIHVzZSBydW5PbmNlIHByb3BlcnR5IAorYGBgaGF4ZQordmFyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKCBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdHJhbnNmYWN0b3J5LCBwcm90ZmFjdG9yeSk7CitzZXJ2ZXIucnVuT25jZSA9IHRydWU7CitgYGAKKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvaGF4ZWxpYi5qc29uIGIvbGliL2hheGUvaGF4ZWxpYi5qc29uCmluZGV4IGJkMDdhYzUuLmIzYzE1MzAgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL2hheGVsaWIuanNvbgorKysgYi9saWIvaGF4ZS9oYXhlbGliLmpzb24KQEAgLTEsMTEgKzEsMTIgQEAKIHsKIAkibmFtZSI6ICJ0aHJpZnQiLAotCSJ1cmwiIDogImh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L3RyZWUvbWFzdGVyL2xpYi9oYXhlIiwKLQkibGljZW5zZSI6ICJBcGFjaGUgMi4wIiwKKwkidXJsIiA6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciLAorCSJsaWNlbnNlIjogIkFwYWNoZSIsCiAJInRhZ3MiOiBbInRocmlmdCIsICJycGMiLCAic2VyaWFsaXphdGlvbiIsICJjcm9zcyIsICJmcmFtZXdvcmsiXSwKIAkiZGVzY3JpcHRpb24iOiAiSGF4ZSBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIGFuZCBzZXJpYWxpemF0aW9uIGZyYW1ld29yayIsCi0JInZlcnNpb24iOiAiMC45LjMiLAotCSJyZWxlYXNlbm90ZSI6ICJUaGUgQXBhY2hlIFRocmlmdCBjb21waWxlciBuZWVkcyB0byBiZSBpbnN0YWxsZWQgc2VwYXJhdGVseSwgc2VlIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIsCisJInZlcnNpb24iOiAiMC4xMy4wIiwKKwkicmVsZWFzZW5vdGUiOiAiTGljZW5zZWQgdW5kZXIgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBUaGUgQXBhY2hlIFRocmlmdCBjb21waWxlciBuZWVkcyB0byBiZSBpbnN0YWxsZWQgc2VwYXJhdGVseS4iLAogCSJjb250cmlidXRvcnMiOiBbIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIl0sCi0JImRlcGVuZGVuY2llcyI6IHsgfQorCSJkZXBlbmRlbmNpZXMiOiB7IH0sCisJImNsYXNzUGF0aCI6ICJzcmMiCiB9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1ppZ1phZy5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvWmlnWmFnLmh4CmluZGV4IDg2MjA2MGQuLjNmODYwMWIgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvWmlnWmFnLmh4CisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvWmlnWmFnLmh4CkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlcjsKIAogaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5JbnQzMjsKIAogY2xhc3MgWmlnWmFnIHsKIApAQCAtMjgsNyArMjksMTUgQEAKICAgICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBGcm9tSW50KCBuIDogSW50KSA6IFVJbnQgICAgeworICAgICAgICAjaWYgcGhwCisKKyAgICAgICAgcmV0dXJuIGNhc3QoY2FzdChjYXN0KG4sSW50MzIpIDw8IDEsSW50MzIpIF4gY2FzdChjYXN0KG4sSW50MzIpID4+IDMxLEludDMyKSxVSW50KTsKKworICAgICAgICAjZWxzZQorCiAgICAgICAgIHJldHVybiBjYXN0KG4gPDwgMSxVSW50KSBeIGNhc3QobiA+PiAzMSxVSW50KTsKKworICAgICAgICAjZW5kCiAgICAgfQogCiAKQEAgLTM2LDcgKzQ1LDE4IEBACiAgICAgICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVG9JbnQoIG4gOiBVSW50KSA6IEludCB7CisgICAgICAgICNpZiBwaHAKKworICAgICAgICB2YXIgYSA9ICgweDdGRkZGRkZGICYgY2FzdChuID4+IDEsSW50KSk7CisgICAgICAgIHZhciBiID0gKGNhc3QobiAmIDEsSW50KSk7CisgICAgICAgIGIgPSAtYjsgIC8vIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy81Mjg4CisgICAgICAgIHJldHVybiBhIF4gYjsKKworICAgICAgICAjZWxzZQorCiAgICAgICAgIHJldHVybiAoMHg3RkZGRkZGRiAmIGNhc3QobiA+PiAxLEludCkpIF4gKC1jYXN0KG4gJiAxLEludCkpOworCisgICAgICAgICNlbmQKICAgICB9CiAKIApAQCAtNjcsNiArODcsOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3QzMiggdGVzdCA6IEludCkgOiBWb2lkIHsKICAgICAgICAgdmFyIGEgOiBVSW50ID0gWmlnWmFnLkZyb21JbnQoIHRlc3QpOwogICAgICAgICB2YXIgYiA6IEludCA9IFppZ1phZy5Ub0ludChhKTsKKyAgICAgICAgI2lmIHBocAorICAgICAgICB0ZXN0ID0gdGVzdCAmIDB4RkZGRkZGRkY7ICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvNTI4OQorICAgICAgICAjZW5kCiAgICAgICAgIGlmKCB0ZXN0ICE9IGIpCiAgICAgICAgICAgICB0aHJvdyAnWmlnWmFnLlRlc3QzMigkdGVzdCkgZmFpbGVkOiBhID0gJGEsIGIgPSAkYic7CiAgICAgfQpAQCAtODgsMjIgKzExMSwyOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVW5pdFRlc3QoKSA6IFZvaWQgewogICAgICAgdmFyIHUxIDogVUludCA9IDB4RkZGRkZGRkU7CiAgICAgICB2YXIgdTIgOiBVSW50ID0gMHhGRkZGRkZGRjsKKyAgICAgIHZhciBpMSA6IEludCA9IDIxNDc0ODM2NDc7CisgICAgICB2YXIgaTIgOiBJbnQgPSAtMjE0NzQ4MzY0ODsKKworICAgICAgI2lmIHBocAorICAgICAgaTIgPSBpMiAmIDB4RkZGRkZGRkY7ICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvNTI4OQorICAgICAgI2VuZAogCiAgICAgICAvLyBwcm90b2J1ZiB0ZXN0Y2FzZXMKICAgICAgIGlmKCBGcm9tSW50KDApICAhPSAwKSB0aHJvdyAncGIgIzEgdG8gWmlnWmFnJzsKICAgICAgIGlmKCBGcm9tSW50KC0xKSAhPSAxKSB0aHJvdyAncGIgIzIgdG8gWmlnWmFnJzsKICAgICAgIGlmKCBGcm9tSW50KDEpICAhPSAyKSB0aHJvdyAncGIgIzMgdG8gWmlnWmFnJzsKICAgICAgIGlmKCBGcm9tSW50KC0yKSAhPSAzKSB0aHJvdyAncGIgIzQgdG8gWmlnWmFnJzsKLSAgICAgIGlmKCBGcm9tSW50KDIxNDc0ODM2NDcpICE9IHUxKSB0aHJvdyAncGIgIzUgdG8gWmlnWmFnJzsKLSAgICAgIGlmKCBGcm9tSW50KC0yMTQ3NDgzNjQ4KSAhPSB1MikgdGhyb3cgJ3BiICM2IHRvIFppZ1phZyc7CisgICAgICBpZiggRnJvbUludChpMSkgIT0gdTEpIHRocm93ICdwYiAjNSB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoaTIpICE9IHUyKSB0aHJvdyAncGIgIzYgdG8gWmlnWmFnJzsKIAogICAgICAgLy8gcHJvdG9idWYgdGVzdGNhc2VzCiAgICAgICBpZiggVG9JbnQoMCkgIT0gMCkgdGhyb3cgJ3BiICMxIGZyb20gWmlnWmFnJzsKICAgICAgIGlmKCBUb0ludCgxKSAhPSAtMSkgdGhyb3cgJ3BiICMyIGZyb20gWmlnWmFnJzsKICAgICAgIGlmKCBUb0ludCgyKSAhPSAxKSB0aHJvdyAncGIgIzMgZnJvbSBaaWdaYWcnOwogICAgICAgaWYoIFRvSW50KDMpICE9IC0yKSB0aHJvdyAncGIgIzQgZnJvbSBaaWdaYWcnOwotICAgICAgaWYoIFRvSW50KHUxKSAhPSAyMTQ3NDgzNjQ3KSB0aHJvdyAncGIgIzUgZnJvbSBaaWdaYWcsIGdvdCAke1RvSW50KHUxKX0nOwotICAgICAgaWYoIFRvSW50KHUyKSAhPSAtMjE0NzQ4MzY0OCkgdGhyb3cgJ3BiICM2IGZyb20gWmlnWmFnLCBnb3QgJHtUb0ludCh1Mil9JzsKKyAgICAgIGlmKCBUb0ludCh1MSkgIT0gaTEpIHRocm93ICdwYiAjNSBmcm9tIFppZ1phZywgZ290ICR7VG9JbnQodTEpfSBleHBlY3RlZCAkaTEnOworICAgICAgaWYoIFRvSW50KHUyKSAhPSBpMikgdGhyb3cgJ3BiICM2IGZyb20gWmlnWmFnLCBnb3QgJHtUb0ludCh1Mil9IGV4cGVjdGVkICRpMic7CiAKICAgICAgIC8vIGJhY2sgYW5kIGZvcnRoIDMyCiAgICAgICBUZXN0MzIoIDApOwpAQCAtMTI1LDQgKzE1NCw1IEBACiAgICAgfQogICAgICNlbmQKIH0KLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisKKyAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmh4CmluZGV4IDIyZTg4ZTQuLmI3ZjM4NDIgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaHgKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oeApAQCAtNzksNyArNzksNyBAQAogICAgIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZzsKICAgICBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlczsKIAotCS8vIHJlY3Vyc2lvbiB0cmFja2luZwotCWZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOwotCWZ1bmN0aW9uIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOworICAgIC8vIHJlY3Vyc2lvbiB0cmFja2luZworICAgIGZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOwogfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaHgKaW5kZXggZTQzZDJkOS4uNzY5ZTkzYyAxMDA2NDQKLS0tIGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oeAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmh4CkBAIC0yMTUsNCArMjE1LDEyIEBACiAgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCaW5hcnkoKSA6IEJ5dGVzIHsKICAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEJpbmFyeSgpOwogICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIDogVm9pZCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmh4CmluZGV4IDcxZWQ0YmEuLjAwMWU0MDUgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmh4CisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmh4CkBAIC0zNSw3NiArMzUsNzYgQEAKICAgICAgKiBAcGFyYW0gdHlwZSAgdGhlIG5leHQgdmFsdWUgd2lsbCBiZSBpbnRlcHJldGVkIGFzIHRoaXMgVFR5cGUgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBza2lwKHByb3Q6VFByb3RvY29sLCB0eXBlIDogSW50KSA6IFZvaWQgewotCQlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0JCXRyeQotCQl7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQljYXNlIFRUeXBlLkJPT0w6IAotCQkJCQlwcm90LnJlYWRCb29sKCk7CisgICAgICAgIHByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkQm9vbCgpOwogCi0JCQkJY2FzZSBUVHlwZS5CWVRFOiAKLQkJCQkJcHJvdC5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQllURToKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkQnl0ZSgpOwogCi0JCQkJY2FzZSBUVHlwZS5JMTY6IAotCQkJCQlwcm90LnJlYWRJMTYoKTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkSTE2KCk7CiAKLQkJCQljYXNlIFRUeXBlLkkzMjogCi0JCQkJCXByb3QucmVhZEkzMigpOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRJMzIoKTsKIAotCQkJCWNhc2UgVFR5cGUuSTY0OiAKLQkJCQkJcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgICAgICAgICAgICAgIHByb3QucmVhZEk2NCgpOwogCi0JCQkJY2FzZSBUVHlwZS5ET1VCTEU6IAotCQkJCQlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkRG91YmxlKCk7CiAKLQkJCQljYXNlIFRUeXBlLlNUUklORzogCi0JCQkJCXByb3QucmVhZEJpbmFyeSgpOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRCaW5hcnkoKTsKIAotCQkJCWNhc2UgVFR5cGUuU1RSVUNUOiAKLQkJCQkJcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKLQkJCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJCXZhciBmaWVsZDpURmllbGQgPSBwcm90LnJlYWRGaWVsZEJlZ2luKCk7Ci0JCQkJCQlpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7Ci0JCQkJCQkgIGJyZWFrOwotCQkJCQkJfQotCQkJCQkJc2tpcChwcm90LCBmaWVsZC50eXBlKTsKLQkJCQkJCXByb3QucmVhZEZpZWxkRW5kKCk7Ci0JCQkJCX0KLQkJCQkJcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgIHByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQ6VEZpZWxkID0gcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByb3QucmVhZFN0cnVjdEVuZCgpOwogCi0JCQkJY2FzZSBUVHlwZS5NQVA6IAotCQkJCQl2YXIgbWFwOlRNYXAgPSBwcm90LnJlYWRNYXBCZWdpbigpOwotCQkJCQlmb3IgKGkgaW4gMCAuLi4gbWFwLnNpemUpIHsKLQkJCQkJCXNraXAocHJvdCwgbWFwLmtleVR5cGUpOwotCQkJCQkJc2tpcChwcm90LCBtYXAudmFsdWVUeXBlKTsKLQkJCQkJfQotCQkJCQlwcm90LnJlYWRNYXBFbmQoKTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLk1BUDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIG1hcDpUTWFwID0gcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIDAgLi4uIG1hcC5zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwKHByb3QsIG1hcC5rZXlUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgbWFwLnZhbHVlVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkTWFwRW5kKCk7CiAKLQkJCQljYXNlIFRUeXBlLlNFVDogCi0JCQkJCXZhciBzZXQ6VFNldCA9IHByb3QucmVhZFNldEJlZ2luKCk7Ci0JCQkJCWZvciAoaiBpbiAwIC4uLiBzZXQuc2l6ZSkgewotCQkJCQkJc2tpcChwcm90LCBzZXQuZWxlbVR5cGUpOwotCQkJCQl9Ci0JCQkJCXByb3QucmVhZFNldEVuZCgpOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgICAgICAgICAgICAgICB2YXIgc2V0OlRTZXQgPSBwcm90LnJlYWRTZXRCZWdpbigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogaW4gMCAuLi4gc2V0LnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgc2V0LmVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRTZXRFbmQoKTsKIAotCQkJCWNhc2UgVFR5cGUuTElTVDogCi0JCQkJCXZhciBsaXN0OlRMaXN0ID0gcHJvdC5yZWFkTGlzdEJlZ2luKCk7Ci0JCQkJCWZvciAoayBpbiAwIC4uLiBsaXN0LnNpemUpIHsKLQkJCQkJCXNraXAocHJvdCwgbGlzdC5lbGVtVHlwZSk7Ci0JCQkJCX0KLQkJCQkJcHJvdC5yZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3Q6VExpc3QgPSBwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrIGluIDAgLi4uIGxpc3Quc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcChwcm90LCBsaXN0LmVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRMaXN0RW5kKCk7CiAKLQkJCQlkZWZhdWx0OgotCQkJCQl0cmFjZSgiVW5rbm93biBmaWVsZCB0eXBlICIsdHlwZSwiIGluIHNraXBNYXhEZXB0aCgpIik7Ci0JCQl9Ci0JCQkKLQkJCXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLQkJfQotCQljYXRjaChlOkR5bmFtaWMpCi0JCXsKLQkJCXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLQkJCXRocm93IGU7Ci0JCX0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCAiVW5rbm93biBmaWVsZCB0eXBlICR7dHlwZX0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGU6RHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RSZWN1cnNpb25UcmFja2VyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RSZWN1cnNpb25UcmFja2VyLmh4CmluZGV4IGI4ODJjZjIuLmNmMDIxMWIgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUmVjdXJzaW9uVHJhY2tlci5oeAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFJlY3Vyc2lvblRyYWNrZXIuaHgKQEAgLTI0LDI1ICsyNCwyNSBAQAogCiBjbGFzcyBUUmVjdXJzaW9uVHJhY2tlciB7CiAKLQkvLyBkZWZhdWx0IAotICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgREVGQVVMVF9SRUNVUlNJT05fREVQVEggOiBJbnQgPSA2NDsgCisgICAgLy8gZGVmYXVsdAorICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgREVGQVVMVF9SRUNVUlNJT05fREVQVEggOiBJbnQgPSA2NDsKIAotCS8vIGxpbWl0IGFuZCBhY3R1YWwgdmFsdWUKLQlwdWJsaWMgdmFyIHJlY3Vyc2lvbkxpbWl0IDogSW50ID0gREVGQVVMVF9SRUNVUlNJT05fREVQVEg7CisgICAgLy8gbGltaXQgYW5kIGFjdHVhbCB2YWx1ZQorICAgIHB1YmxpYyB2YXIgcmVjdXJzaW9uTGltaXQgOiBJbnQgPSBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSDsKICAgICBwcml2YXRlIHZhciByZWN1cnNpb25EZXB0aCA6IEludCA9IDA7CiAKLQlwdWJsaWMgZnVuY3Rpb24gSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQgCi0JewotCQlpZiAocmVjdXJzaW9uRGVwdGggPCByZWN1cnNpb25MaW1pdCkKLQkJCSsrcmVjdXJzaW9uRGVwdGg7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkRFUFRIX0xJTUlULCAiRGVwdGggbGltaXQgZXhjZWVkZWQiKTsKLQl9CisgICAgcHVibGljIGZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkCisgICAgeworICAgICAgICBpZiAocmVjdXJzaW9uRGVwdGggPCByZWN1cnNpb25MaW1pdCkKKyAgICAgICAgICAgICsrcmVjdXJzaW9uRGVwdGg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkRFUFRIX0xJTUlULCAiRGVwdGggbGltaXQgZXhjZWVkZWQiKTsKKyAgICB9CiAKLQlwdWJsaWMgZnVuY3Rpb24gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQgCi0JewotCQktLXJlY3Vyc2lvbkRlcHRoOwotCX0KKyAgICBwdWJsaWMgZnVuY3Rpb24gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQKKyAgICB7CisgICAgICAgIC0tcmVjdXJzaW9uRGVwdGg7CisgICAgfQogCiAKIH0KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeAppbmRleCAzYjY0YjYyLi4wNjAwNzQ0IDEwMDY0NAotLS0gYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaHgKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmh4CkBAIC0yOSw2ICsyOSwxMCBAQAogCiAgICAgcHJpdmF0ZSB2YXIgc3RvcCA6IEJvb2wgPSBmYWxzZTsKIAorICAgIC8vc3RvcHMganVzdCBhZnRlciBpbnB1dCB0cmFuc3BvcnQgcmV0dXJucyBFT0YKKyAgICAvL3VzZWZ1bCBmb3IgbGltaXRlZCBzY2VuYXJpb3MsIGxpa2UgZW1iZWRpbmcgaW50byBwaHAgc2VydmVyCisgICAgcHVibGljIHZhciBydW5PbmNlIDogQm9vbCA9IGZhbHNlOworCiAgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvY2Vzc29yIDogVFByb2Nlc3NvciwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeSA9IG51bGwsCkBAIC0xMDIsNiArMTA2LDExIEBACiAgICAgICAgICAgICBjYXRjaCggdHR4IDogVFRyYW5zcG9ydEV4Y2VwdGlvbikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBVc3VhbGx5IGEgY2xpZW50IGRpc2Nvbm5lY3QsIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgaWYocnVuT25jZSAmJiB0dHguZXJyb3JJRCA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFKSB7CisgICAgICAgICAgICAgICAgICAvL2lucHV0IHJldHVybnMgZW9mLCBleGl0CisgICAgICAgICAgICAgICAgICAvL2ZvbGxvd3MgbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcAorICAgICAgICAgICAgICAgICAgU3RvcCgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoKCBwZXggOiBUUHJvdG9jb2xFeGNlcHRpb24pCiAgICAgICAgICAgICB7CkBAIC0xMTIsNiArMTIxLDExIEBACiAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoZSk7IC8vIFVuZXhwZWN0ZWQKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYoY2xpZW50ICE9IG51bGwgJiYgIXJ1bk9uY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIEZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCiAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmh4CmluZGV4IDU4NmE4YjYuLjRiYWRiMmEgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oeAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaHgKQEAgLTM5LDI2ICszOSwyMiBAQAogICAgIC8vIFVuZGVybHlpbmcgc2VydmVyIHdpdGggc29ja2V0CiAgICAgcHJpdmF0ZSB2YXIgX3NvY2tldCA6IFNvY2tldD0gbnVsbDsKIAotICAgIC8vIFBvcnQgdG8gbGlzdGVuIG9uCi0gICAgcHJpdmF0ZSB2YXIgX3BvcnQgOiBJbnQgPSAwOwotCiAgICAgLy8gVGltZW91dCBmb3IgY2xpZW50IHNvY2tldHMgZnJvbSBhY2NlcHQKLSAgICBwcml2YXRlIHZhciBfY2xpZW50VGltZW91dCA6IEZsb2F0ID0gMDsKKyAgICBwcml2YXRlIHZhciBfY2xpZW50VGltZW91dCA6IEZsb2F0ID0gNTsKIAogICAgIC8vIFdoZXRoZXIgb3Igbm90IHRvIHdyYXAgbmV3IFRTb2NrZXQgY29ubmVjdGlvbnMgaW4gYnVmZmVycwogICAgIHByaXZhdGUgdmFyIF91c2VCdWZmZXJlZFNvY2tldHMgOiBCb29sID0gZmFsc2U7CiAKIAotICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHBvcnQgOiBJbnQsIGNsaWVudFRpbWVvdXQgOiBGbG9hdCA9IDAsIHVzZUJ1ZmZlcmVkU29ja2V0cyA6IEJvb2wgPSBmYWxzZSkKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KD9hZGRyZXNzIDogU3RyaW5nID0gJ2xvY2FsaG9zdCcsICBwb3J0IDogSW50LCBjbGllbnRUaW1lb3V0IDogRmxvYXQgPSA1LCB1c2VCdWZmZXJlZFNvY2tldHMgOiBCb29sID0gZmFsc2UpCiAgICAgewotICAgICAgICBfcG9ydCA9IHBvcnQ7CiAgICAgICAgIF9jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKICAgICAgICAgX3VzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKIAogICAgICAgICB0cnkKICAgICAgICAgewogICAgICAgICAgICAgX3NvY2tldCA9IG5ldyBTb2NrZXQoKTsKLSAgICAgICAgICAgIF9zb2NrZXQuYmluZCggbmV3IEhvc3QoJ2xvY2FsaG9zdCcpLCBwb3J0KTsKKyAgICAgICAgICAgIF9zb2NrZXQuYmluZCggbmV3IEhvc3QoYWRkcmVzcyksIHBvcnQpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKICAgICAgICAgewpAQCAtNzQsNyArNzAsOSBAQAogICAgICAgICBpZiAoX3NvY2tldCAhPSBudWxsKSAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjaWYgIXBocAogICAgICAgICAgICAgICAgIF9zb2NrZXQubGlzdGVuKDEpOworICAgICAgICAgICAgICAgICNlbmQKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKICAgICAgICAgICAgIHsKQEAgLTk0LDcgKzkyLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgdmFyIGFjY2VwdGVkID0gX3NvY2tldC5hY2NlcHQoKTsKICAgICAgICAgICAgIHZhciByZXN1bHQgPSBUU29ja2V0LmZyb21Tb2NrZXQoYWNjZXB0ZWQpOwotICAgICAgICAgICAgYWNjZXB0ZWQuc2V0VGltZW91dCggX2NsaWVudFRpbWVvdXQpOworICAgICAgICAgICAgcmVzdWx0LnNldFRpbWVvdXQoIF9jbGllbnRUaW1lb3V0KTsKIAogICAgICAgICAgICAgaWYoIF91c2VCdWZmZXJlZFNvY2tldHMpCiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaHgKaW5kZXggOGFhMDYwOC4uNzk0MWFiOSAxMDA2NDQKLS0tIGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmh4CisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oeApAQCAtNzMsNyArNzMsNyBAQAogICAgIHByaXZhdGUgdmFyIG91dHB1dCA6IE91dHB1dCA9IG51bGw7CiAgICAgI2VuZAogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBERUZBVUxUX1RJTUVPVVQgPSA1LjA7CisgICAgcHJpdmF0ZSB2YXIgdGltZW91dCA6IEZsb2F0ID0gMzA7CiAKICAgICBwcml2YXRlIHZhciBvYnVmZmVyIDogQnl0ZXNPdXRwdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKICAgICBwcml2YXRlIHZhciBpb0NhbGxiYWNrIDogVEV4Y2VwdGlvbi0+Vm9pZCA9IG51bGw7CkBAIC05Miw3ICs5Miw4IEBACiAgICAgI2lmICEgKGZsYXNoIHx8IGpzKQogICAgIC8vIHVzZWQgYnkgVFNvY2tldFNlcnZlcgogICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVNvY2tldCggc29ja2V0IDogU29ja2V0KSA6IFRTb2NrZXQgIHsKLSAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBUU29ja2V0KCIiLDApOworICAgICAgICB2YXIgc29ja2V0SG9zdCA9IHNvY2tldC5ob3N0KCk7CisgICAgICAgIHZhciByZXN1bHQgPSBuZXcgVFNvY2tldChzb2NrZXRIb3N0Lmhvc3QudG9TdHJpbmcoKSwgc29ja2V0SG9zdC5wb3J0KTsKICAgICAgICAgcmVzdWx0LmFzc2lnblNvY2tldChzb2NrZXQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTI0MCw3ICsyNDEsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKICAgICAgICAgewotICAgICAgICAgICAgdHJhY2UoJ1RFeGNlcHRpb24gJGUnKTsKKyAgICAgICAgICAgIHRyYWNlKCdURXhjZXB0aW9uICRlLCBtZXNzYWdlIDogJHtlLmVycm9yTXNnfScpOwogICAgICAgICAgICAgaWYoaW9DYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaW9DYWxsYmFjayhlKTsKICAgICAgICAgICAgIH0KQEAgLTI3MCwxMSArMjcxLDE3IEBACiAgICAgICAgIHZhciBzb2NrZXQgPSBuZXcgU29ja2V0KCk7CiAgICAgICAgIHNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOwogCisgICAgICAgICNlbHNlaWYgcGhwCisgICAgICAgIHZhciBzb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgIHNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOworICAgICAgICBzb2NrZXQuc2V0QmxvY2tpbmcodHJ1ZSk7CisgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KHRpbWVvdXQpOworCiAgICAgICAgICNlbHNlCiAgICAgICAgIHZhciBzb2NrZXQgPSBuZXcgU29ja2V0KCk7CiAgICAgICAgIHNvY2tldC5zZXRCbG9ja2luZyh0cnVlKTsKICAgICAgICAgc29ja2V0LnNldEZhc3RTZW5kKHRydWUpOwotICAgICAgICBzb2NrZXQuc2V0VGltZW91dCggREVGQVVMVF9USU1FT1VUKTsKKyAgICAgICAgc29ja2V0LnNldFRpbWVvdXQodGltZW91dCk7CiAgICAgICAgIHNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOwogCiAgICAgICAgICNlbmQKQEAgLTMwMSw0ICszMDgsMTEgQEAKICAgICAgICAgI2VuZAogICAgIH0KIAorICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0KCB0aW1lb3V0IDogRmxvYXQgKSA6IFZvaWQgeworICAgICAgICBpZihpc09wZW4oKSkgeworICAgICAgICAgICAgc29ja2V0LnNldFRpbWVvdXQodGltZW91dCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oeAppbmRleCA0YTNiZDkwLi5lNmIzMTc5IDEwMDY0NAotLS0gYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaHgKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmh4CkBAIC0xOSw2ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgaGF4ZS5pby5Fb2Y7CiBpbXBvcnQgaGF4ZS5pby5CeXRlczsKIGltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkFic3RyYWN0TWV0aG9kRXJyb3I7CkBAIC04NSwxNiArODYsMjEgQEAKICAgICAgICAgdmFyIGdvdCA6IEludCA9IDA7CiAgICAgICAgIHZhciByZXQgOiBJbnQgPSAwOwogICAgICAgICB3aGlsZSAoZ290IDwgbGVuKSB7CisgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldCA9IHJlYWQoYnVmLCBvZmYrZ290LCBsZW4tZ290KTsKICAgICAgICAgICAgIGlmIChyZXQgPD0gMCkgewogICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiBUcmllZCB0byByZWFkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxlbiArICIgYnl0ZXMsIGJ1dCBvbmx5IGdvdCAiICsgZ290ICsgIiBieXRlcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiBUcmllZCB0byByZWFkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsZW4gKyAiIGJ5dGVzLCBidXQgb25seSBnb3QgIiArIGdvdCArICIgYnl0ZXMuIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBnb3QgKz0gcmV0OworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoZW9mIDogRW9mKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgJGxlbiBieXRlcyEnKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ290ICs9IHJldDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZ290OwotICAgICAgfQorICAgIH0KIAogICAgIC8qKgogICAgICAqIFdyaXRlcyB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQKQEAgLTEzMCw0ICsxMzYsNCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKICAgICB9CiAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RXcmFwcGluZ1NlcnZlclRyYW5zcG9ydC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMjcyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RXcmFwcGluZ1NlcnZlclRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisKKy8qCisgICB3cmFwcyByZWFsIHRyYW5zcG9ydCwgcHJvdmlkZWQgYnkgY29uc3RydWN0b3IKKyovCitjbGFzcyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQgZXh0ZW5kcyBUU2VydmVyVHJhbnNwb3J0IHsKKworICBwcml2YXRlIHZhciB0cmFuc3BvcnQoZGVmYXVsdCxudWxsKSA6IFRUcmFuc3BvcnQ7CisKKyAgcHVibGljIGZ1bmN0aW9uIG5ldyh0cmFuc3BvcnQgOiBUVHJhbnNwb3J0KSB7CisgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gTGlzdGVuKCkgOiBWb2lkCisgIHsKKyAgfQorCisgIHByaXZhdGUgb3ZlcnJpZGUgZnVuY3Rpb24gQWNjZXB0SW1wbCgpIDogVFRyYW5zcG9ydAorICB7CisgICAgcmV0dXJuIHRyYW5zcG9ydDsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBDbG9zZSgpIDogVm9pZAorICB7CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9oYXhlL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggN2QyOWY4MS4uMmI4YjI0NSAxMDA2NDQKLS0tIGEvbGliL2hheGUvdGVzdC9NYWtlZmlsZS5hbQorKysgYi9saWIvaGF4ZS90ZXN0L01ha2VmaWxlLmFtCkBAIC0xNywxMyArMTcsMTMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CiBUSFJJRlRDTUQgPSAkKFRIUklGVCkgLS1nZW4gaGF4ZSAtcgogVEhSSUZUVEVTVCA9ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogQUdHUiA9ICQodG9wX3NyY2RpcikvY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0CiBCRU5DSE1BUksgPSAkKHRvcF9zcmNkaXIpL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAogCiBCSU5fQ1BQID0gYmluL01haW4tZGVidWcKK0JJTl9QSFAgPSBiaW4vcGhwL01haW4tZGVidWcucGhwCiAKIGdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHg6ICQoVEhSSUZUVEVTVCkKIAkkKFRIUklGVENNRCkgJChUSFJJRlRURVNUKQpAQCAtMzQsNyArMzQsNyBAQAogZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQmVuY2htYXJrU2VydmljZS5oeDogJChCRU5DSE1BUkspCiAJJChUSFJJRlRDTUQpICQoQkVOQ0hNQVJLKQogCi1hbGwtbG9jYWw6ICQoQklOX0NQUCkKK2FsbC1sb2NhbDogJChCSU5fQ1BQKSAkKEJJTl9QSFApCiAKICQoQklOX0NQUCk6IFwKIAkJc3JjLyouaHggXApAQCAtNDQsNiArNDQsMTQgQEAKIAkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQmVuY2htYXJrU2VydmljZS5oeAogCSQoSEFYRSkgLS1jd2QgLiAgY3BwLmh4bWwKIAorJChCSU5fUEhQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L0FnZ3IuaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9CZW5jaG1hcmtTZXJ2aWNlLmh4CisJJChIQVhFKSAtLWN3ZCAuICBwaHAuaHhtbAorCiAKICNUT0RPOiBvdGhlciBoYXhlIHRhcmdldHMKICMgICAgJChIQVhFKSAgLS1jd2QgLiAgY3NoYXJwCkBAIC01MSwxNSArNTksMTUgQEAKICMgICAgJChIQVhFKSAgLS1jd2QgLiAgamF2YQogIyAgICAkKEhBWEUpICAtLWN3ZCAuICBqYXZhc2NyaXB0CiAjICAgICQoSEFYRSkgIC0tY3dkIC4gIG5la28KLSMgICAgJChIQVhFKSAgLS1jd2QgLiAgcGhwCiAjICAgICQoSEFYRSkgIC0tY3dkIC4gIHB5dGhvbiAgIyBuZWVkcyBIYXhlIDMuMi4wCiAKIAogY2xlYW4tbG9jYWw6CiAJJChSTSkgLXIgZ2VuLWhheGUgYmluCiAKLWNoZWNrOiAkKEJJTl9DUFApCitjaGVjazogJChCSU5fQ1BQKSAkKEJJTl9QSFApCiAJJChCSU5fQ1BQKQorCXBocCAtZiAkKEJJTl9QSFApCiAKIEVYVFJBX0RJU1QgPSBcCiAgICAgICAgICAgICAgc3JjIFwKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvcGhwLmh4bWwgYi9saWIvaGF4ZS90ZXN0L3BocC5oeG1sCmluZGV4IGI4NmU2NGMuLjE0ZjJiMmQgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL3Rlc3QvcGhwLmh4bWwKKysrIGIvbGliL2hheGUvdGVzdC9waHAuaHhtbApAQCAtMjYsNyArMjYsOCBAQAogLW1haW4gTWFpbgogCiAjUEhQIHRhcmdldAotLXBocCBiaW4vVGVzdC5waHAKKy1waHAgYmluL3BocC8KKy0tcGhwLWZyb250IE1haW4tZGVidWcucGhwCiAKICNBZGQgZGVidWcgaW5mb3JtYXRpb24KIC1kZWJ1ZwpAQCAtMzUsNCArMzYsNCBAQAogIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKICMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQogIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQotLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS9saWIvaHMvQ01ha2VMaXN0cy50eHQgYi9saWIvaHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE1YjhmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBSZWJ1aWxkIHdoZW4gYW55IG9mIHRoZXNlIGZpbGVzIGNoYW5nZXMKK3NldChoYXNrZWxsX3NvdXJjZXMKKyAgICBzcmMvVGhyaWZ0LmhzCisgICAgc3JjL1RocmlmdC9BcmJpdHJhcmllcy5ocworICAgIHNyYy9UaHJpZnQvUHJvdG9jb2wuaHMKKyAgICBzcmMvVGhyaWZ0L1Byb3RvY29sL0JpbmFyeS5ocworICAgIHNyYy9UaHJpZnQvUHJvdG9jb2wvQ29tcGFjdC5ocworICAgIHNyYy9UaHJpZnQvUHJvdG9jb2wvSlNPTi5ocworICAgIHNyYy9UaHJpZnQvU2VydmVyLmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC9FbXB0eS5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0L0ZyYW1lZC5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0L0h0dHBDbGllbnQuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC9JT0J1ZmZlci5ocworICAgIHNyYy9UaHJpZnQvVHlwZXMuaHMKKyAgICB0aHJpZnQuY2FiYWwKKykKKworaWYoQlVJTERfVEVTVElORykKKyAgICBsaXN0KEFQUEVORCBoYXNrZWxsX3NvcnVjZXMKKyAgICAgICAgdGVzdC9TcGVjLmhzCisgICAgICAgIHRlc3QvQmluYXJ5U3BlYy5ocworICAgICAgICB0ZXN0L0NvbXBhY3RTcGVjLmhzCisgICAgICAgIHRlc3QvSlNPTlNwZWMuaHMKKyAgICApCisgICAgc2V0KGhzX2VuYWJsZV90ZXN0ICItLWVuYWJsZS10ZXN0cyIpCitlbmRpZigpCisKK3NldChoYXNrZWxsX2FydGlmYWN0cyB0aHJpZnRfY2FiYWwuc3RhbXApCisjIEFkZGluZyAqLmhpIGZpbGVzIHNvIHRoYXQgYW55IG1pc3NpbmcgZmlsZSB0cmlnZ2VycyB0aGUgYnVpbGQKK2ZvcmVhY2goU1JDICR7aGFza2VsbF9zb3VyY2VzfSkKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KEVYICR7U1JDfSBFWFQpCisgICAgaWYoJHtFWH0gU1RSRVFVQUwgIi5ocyIpCisgICAgICAgIGZpbGUoUkVMQVRJVkVfUEFUSCBSRUwgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtTUkN9KQorICAgICAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KERJUiAke1JFTH0gRElSRUNUT1JZKQorICAgICAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KEJBU0UgJHtSRUx9IE5BTUVfV0UpCisgICAgICAgIGxpc3QoQVBQRU5EIGhhc2tlbGxfYXJ0aWZhY3RzIGRpc3QvYnVpbGQvJHtESVJ9LyR7QkFTRX0uaGkpCisgICAgZW5kaWYoKQorZW5kZm9yZWFjaCgpCisKK2lmKENNQUtFX0JVSUxEX1RZUEUgU1RSRVFVQUwgIkRlYnVnIikKKyAgICBzZXQoaHNfb3B0aW1pemUgLU8wKQorZWxzZSgpCisgICAgc2V0KGhzX29wdGltaXplIC1PMSkKK2VuZGlmKCkKKworYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAke2hhc2tlbGxfYXJ0aWZhY3RzfQorICAgIENPTU1BTkQgJHtDQUJBTH0gdXBkYXRlCisgICAgIyBCdWlsZCBkZXBlbmRlbmNpZXMgZmlyc3Qgd2l0aG91dCAtLWJ1aWxkZGlyLCBvdGhlcndpc2UgaXQgZmFpbHMuCisgICAgQ09NTUFORCAke0NBQkFMfSBpbnN0YWxsIC0tb25seS1kZXBlbmRlbmNpZXMgJHtoc19lbmFibGVfdGVzdH0KKyAgICBDT01NQU5EICR7Q0FCQUx9IGNvbmZpZ3VyZSAke2hzX29wdGltaXplfSAke2hzX2VuYWJsZV90ZXN0fSAtLWJ1aWxkZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kaXN0CisgICAgQ09NTUFORCAke0NBQkFMfSBidWlsZCAtLWJ1aWxkZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kaXN0CisgICAgQ09NTUFORCAke0NBQkFMfSBpbnN0YWxsIC0tYnVpbGRkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2Rpc3QKKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdF9jYWJhbC5zdGFtcAorICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgIERFUEVORFMgJHtoYXNrZWxsX3NvdXJjZXN9CisgICAgQ09NTUVOVCAiQnVpbGRpbmcgSGFza2VsbCBsaWJyYXJ5IikKKworYWRkX2N1c3RvbV90YXJnZXQoaGFza2VsbF9saWJyYXJ5IEFMTAorICAgIERFUEVORFMgJHtoYXNrZWxsX2FydGlmYWN0c30pCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3Rlc3QoTkFNRSBIYXNrZWxsQ2FiYWxDaGVjaworICAgICAgICAgICAgQ09NTUFORCAke0NBQkFMfSBjaGVjaworICAgICAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorICAgIGFkZF90ZXN0KE5BTUUgSGFza2VsbENhYmFsVGVzdAorICAgICAgICAgICAgIyBDYWJhbCBmYWlscyB0byBmaW5kIGJ1aWx0IGV4ZWN1dGFibGUgd2hlbiAtLWJ1aWxkZGlyIGlzIHNwZWNpZmllZC4KKyAgICAgICAgICAgICMgU28gd2UgaW52b2tlIHRoZSBleGVjdXRhYmxlIGRpcmVjdGx5LgorICAgICAgICAgICAgIyBDT01NQU5EICR7Q0FCQUx9IHRlc3QgLS1idWlsZGRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZGlzdAorICAgICAgICAgICAgIyBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisgICAgICAgICAgICBDT01NQU5EIGRpc3QvYnVpbGQvc3BlYy9zcGVjKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvbGliL2hzL0xJQ0VOU0UgYi9saWIvaHMvTElDRU5TRQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9saWIvaHMvTWFrZWZpbGUuYW0gYi9saWIvaHMvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0NTUyOWM3Li4zY2Q4YjU3Ci0tLSBhL2xpYi9ocy9NYWtlZmlsZS5hbQorKysgYi9saWIvaHMvTWFrZWZpbGUuYW0KQEAgLTE5LDEyICsxOSwxNCBAQAogCiBFWFRSQV9ESVNUID0gXAogCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCUNNYWtlTGlzdHMudHh0IFwKIAlMSUNFTlNFIFwKIAlSRUFETUUubWQgXAogCVNldHVwLmxocyBcCiAJVE9ETyBcCi0JVGhyaWZ0LmNhYmFsIFwKLQlzcmMKKwl0aHJpZnQuY2FiYWwgXAorCXNyYyBcCisJdGVzdAogCiBhbGwtbG9jYWw6CiAJJChDQUJBTCkgdXBkYXRlCkBAIC00MiwzICs0NCw3IEBACiAKIGNoZWNrLWxvY2FsOgogCSQoQ0FCQUwpIGNoZWNrCisJJChDQUJBTCkgaW5zdGFsbCAtLW9ubHktZGVwZW5kZW5jaWVzIC0tZW5hYmxlLXRlc3RzCisJJChDQUJBTCkgY29uZmlndXJlIC0tZW5hYmxlLXRlc3RzCisJJChDQUJBTCkgYnVpbGQKKwkkKENBQkFMKSB0ZXN0CmRpZmYgLS1naXQgYS9saWIvaHMvUkVBRE1FLm1kIGIvbGliL2hzL1JFQURNRS5tZApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGVlYTBhNzMuLjEwYmRlZmYKLS0tIGEvbGliL2hzL1JFQURNRS5tZAorKysgYi9saWIvaHMvUkVBRE1FLm1kCkBAIC05NywzICs5NywxNyBAQAogCiBKdXN0IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGhhbmRsZXIgbGFiZWwsIHByb3RvY29scy4gSXQgY2FsbHMgdGhlCiBzdXBlcmNsYXNzZXMgcHJvY2VzcyBpZiB0aGVyZSBpcyBhIHN1cGVyY2xhc3MuCisKK1JlbGVhc2luZyB0byBIYWNrYWdlCis9PT09PT09PT09PT09PT09PT09PQorCitVc2luZyB0aGUgW0RvY2tlciBDb250YWluZXIgZm9yIFVidW50dSBCaW9uaWNdKC4uLy4uL2J1aWxkL2RvY2tlci9SRUFETUUubWQpLCBydW46CisKKyAgICByb290QGU5NDFmNTMxMTU0NTovdGhyaWZ0L3NyYyMgLi9ib290c3RyYXAuc2ggJiYgLi9jb25maWd1cmUKKyAgICByb290QGU5NDFmNTMxMTU0NTovdGhyaWZ0L3NyYyMgY2QgbGliL2hzICYmIG1ha2UgZGlzdC1sb2NhbAorCitUaGlzIHdpbGwgcHJvZHVjZSBhIGBsaWIvaHMvZGlzdC90aHJpZnQtPHZlcnNpb24+LnRhci5nemAgZmlsZS4gIFRha2UgdGhpcworZmlsZSBhbmQgdXBsb2FkIGl0IGFzIGEgSGFza2VsbCBIYWNrYWdlCitbcGFja2FnZSBjYW5kaWRhdGVdKGh0dHBzOi8vaGFja2FnZS5oYXNrZWxsLm9yZy91cGxvYWQjY2FuZGlkYXRlcykgYW5kIAorY2hlY2sgdG8gbWFrZSBzdXJlIGFsbCB0aGUgaW5mb3JtYXRpb24gaXMgY29ycmVjdC4gIEFzc3VtaW5nIGFsbCBpcyBzYXRpc2ZhY3RvcnksCit5b3UgY2FuIHVwbG9hZCB0aGUgcGFja2FnZSBhcyBvZmZpY2lhbCB1c2luZyB0aGUgbGluayBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlLgpkaWZmIC0tZ2l0IGEvbGliL2hzL1RPRE8gYi9saWIvaHMvVE9ETwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9saWIvaHMvVGhyaWZ0LmNhYmFsIGIvbGliL2hzL1RocmlmdC5jYWJhbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGFhNjU1NS4uMDAwMDAwMAotLS0gYS9saWIvaHMvVGhyaWZ0LmNhYmFsCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLS0KLS0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLS0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0tLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0tLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0tLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0tLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS0tCi0tLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLS0KLS0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLS0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0tLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLS0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0tLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0tLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tCi0KLU5hbWU6ICAgICAgICAgICB0aHJpZnQKLVZlcnNpb246ICAgICAgICAwLjkuMwotQ2FiYWwtVmVyc2lvbjogID49IDEuOAotTGljZW5zZTogICAgICAgIE90aGVyTGljZW5zZQotQ2F0ZWdvcnk6ICAgICAgIEZvcmVpZ24KLUJ1aWxkLVR5cGU6ICAgICBTaW1wbGUKLVN5bm9wc2lzOiAgICAgICBIYXNrZWxsIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCi1Ib21lcGFnZTogICAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCi1CdWctUmVwb3J0czogICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQKLU1haW50YWluZXI6ICAgICBkZXZAdGhyaWZ0LmFwYWNoZS5vcmcKLUxpY2Vuc2UtRmlsZTogICBMSUNFTlNFCi0KLURlc2NyaXB0aW9uOgotICBIYXNrZWxsIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLiBSZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuCi0KLWZsYWcgbmV0d29yay11cmkKLSAgIGRlc2NyaXB0aW9uOiBHZXQgTmV0d29yay5VUkkgZnJvbSB0aGUgbmV0d29yay11cmkgcGFja2FnZQotICAgZGVmYXVsdDogVHJ1ZQotCi1MaWJyYXJ5Ci0gIEhzLVNvdXJjZS1EaXJzOgotICAgIHNyYwotICBCdWlsZC1EZXBlbmRzOgotICAgIGJhc2UgPj0gNCwgYmFzZSA8IDUsIGNvbnRhaW5lcnMsIGdoYy1wcmltLCBhdHRvcGFyc2VjLCBiaW5hcnksIGJ5dGVzdHJpbmcgPj0gMC4xMCwgaGFzaGFibGUsIEhUVFAsIHRleHQsIHVub3JkZXJlZC1jb250YWluZXJzLCB2ZWN0b3IsIFF1aWNrQ2hlY2ssIHNwbGl0Ci0gIGlmIGZsYWcobmV0d29yay11cmkpCi0gICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmstdXJpID49IDIuNiwgbmV0d29yayA+PSAyLjYKLSAgZWxzZQotICAgICBidWlsZC1kZXBlbmRzOiBuZXR3b3JrIDwgMi42Ci0gIEV4cG9zZWQtTW9kdWxlczoKLSAgICBUaHJpZnQsCi0gICAgVGhyaWZ0LkFyYml0cmFyaWVzCi0gICAgVGhyaWZ0LlByb3RvY29sLAotICAgIFRocmlmdC5Qcm90b2NvbC5CaW5hcnksCi0gICAgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QsCi0gICAgVGhyaWZ0LlByb3RvY29sLkpTT04sCi0gICAgVGhyaWZ0LlNlcnZlciwKLSAgICBUaHJpZnQuVHJhbnNwb3J0LAotICAgIFRocmlmdC5UcmFuc3BvcnQuRW1wdHksCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5GcmFtZWQsCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUsCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5IdHRwQ2xpZW50LAotICAgIFRocmlmdC5UcmFuc3BvcnQuSU9CdWZmZXIsCi0gICAgVGhyaWZ0LlR5cGVzCi0gIEV4dGVuc2lvbnM6Ci0gICAgRGVyaXZlRGF0YVR5cGVhYmxlLAotICAgIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24sCi0gICAgRmxleGlibGVJbnN0YW5jZXMsCi0gICAgS2luZFNpZ25hdHVyZXMsCi0gICAgTWFnaWNIYXNoLAotICAgIFJhbmtOVHlwZXMsCi0gICAgUmVjb3JkV2lsZENhcmRzLAotICAgIFNjb3BlZFR5cGVWYXJpYWJsZXMsCi0gICAgVHlwZVN5bm9ueW1JbnN0YW5jZXMKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQuaHMKaW5kZXggNThhMzA0Yi4uNjU4MDIwOSAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQuaHMKQEAgLTkwLDEzICs5MCwxMyBAQAogICBkZXJpdmluZyAoIFNob3csIFR5cGVhYmxlICkKIGluc3RhbmNlIEV4Y2VwdGlvbiBBcHBFeG4KIAotd3JpdGVBcHBFeG4gOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gQXBwRXhuIC0+IElPICgpCit3cml0ZUFwcEV4biA6OiBQcm90b2NvbCBwID0+IHAgLT4gQXBwRXhuIC0+IElPICgpCiB3cml0ZUFwcEV4biBwdCBhZSA9IHdyaXRlVmFsIHB0ICQgVFN0cnVjdCAkIE1hcC5mcm9tTGlzdAogICAgICAgICAgICAgICAgICAgICBbICgxLCAoIm1lc3NhZ2UiLCBUU3RyaW5nICQgZW5jb2RlVXRmOCAkIHBhY2sgJCBhZV9tZXNzYWdlIGFlKSkKICAgICAgICAgICAgICAgICAgICAgLCAoMiwgKCJ0eXBlIiwgVEkzMiAkIGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIChhZV90eXBlIGFlKSkpCiAgICAgICAgICAgICAgICAgICAgIF0KIAotcmVhZEFwcEV4biA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBJTyBBcHBFeG4KK3JlYWRBcHBFeG4gOjogUHJvdG9jb2wgcCA9PiBwIC0+IElPIEFwcEV4bgogcmVhZEFwcEV4biBwdCA9IGRvCiAgICAgbGV0IHR5cGVtYXAgPSBNYXAuZnJvbUxpc3QgWygxLCgibWVzc2FnZSIsVF9TVFJJTkcpKSwoMiwoInR5cGUiLFRfSTMyKSldCiAgICAgVFN0cnVjdCBmaWVsZHMgPC0gcmVhZFZhbCBwdCAkIFRfU1RSVUNUIHR5cGVtYXAKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L0FyYml0cmFyaWVzLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMKaW5kZXggM2E2MGVkMi4uZTljMGZjMyAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMKQEAgLTI2LDEyICsyNiw2IEBACiBpbnN0YW5jZSBBcmJpdHJhcnkgQnl0ZVN0cmluZyB3aGVyZQogICBhcmJpdHJhcnkgPSBCUy5wYWNrIC4gZmlsdGVyICgvPSAwKSA8JD4gYXJiaXRyYXJ5CiAKLWluc3RhbmNlIChPcmQgaywgQXJiaXRyYXJ5IGssIEFyYml0cmFyeSB2KSA9PiBBcmJpdHJhcnkgKE1hcCBrIHYpIHdoZXJlCi0gIGFyYml0cmFyeSA9IE1hcC5mcm9tTGlzdCA8JD4gYXJiaXRyYXJ5Ci0KLWluc3RhbmNlIChPcmQgaywgQXJiaXRyYXJ5IGspID0+IEFyYml0cmFyeSAoU2V0LlNldCBrKSB3aGVyZQotICBhcmJpdHJhcnkgPSBTZXQuZnJvbUxpc3QgPCQ+IGFyYml0cmFyeQotCiBpbnN0YW5jZSAoQXJiaXRyYXJ5IGspID0+IEFyYml0cmFyeSAoVmVjdG9yLlZlY3RvciBrKSB3aGVyZQogICBhcmJpdHJhcnkgPSBWZWN0b3IuZnJvbUxpc3QgPCQ+IGFyYml0cmFyeQogCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzCmluZGV4IGVhNTg2NDIuLjY3YTkxNzUgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzCkBAIC0yMiwxOSArMjIsMTggQEAKIAogbW9kdWxlIFRocmlmdC5Qcm90b2NvbAogICAgICggUHJvdG9jb2woLi4pCisgICAgLCBTdGF0ZWxlc3NQcm90b2NvbCguLikKICAgICAsIFByb3RvY29sRXhuKC4uKQogICAgICwgUHJvdG9jb2xFeG5UeXBlKC4uKQogICAgICwgZ2V0VHlwZU9mCiAgICAgLCBydW5QYXJzZXIKLSAgICAsIHZlcnNpb25NYXNrCi0gICAgLCB2ZXJzaW9uMQogICAgICwgYnNUb0RvdWJsZQorICAgICwgYnNUb0RvdWJsZUxFCiAgICAgKSB3aGVyZQogCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24KIGltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZwogaW1wb3J0IERhdGEuQml0cwotaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5IChCeXRlU3RyaW5nLCB0b1N0cmljdCkKIGltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuVW5zYWZlCiBpbXBvcnQgRGF0YS5GdW5jdG9yICgoPCQ+KSkKIGltcG9ydCBEYXRhLkludApAQCAtNDMsMzcgKzQyLDI2IEBACiBpbXBvcnQgRGF0YS5UeXBlYWJsZSAoVHlwZWFibGUpCiBpbXBvcnQgRGF0YS5Xb3JkCiBpbXBvcnQgRm9yZWlnbi5QdHIgKGNhc3RQdHIpCi1pbXBvcnQgRm9yZWlnbi5TdG9yYWJsZSAoU3RvcmFibGUsIHBlZWssIHBva2UpCitpbXBvcnQgRm9yZWlnbi5TdG9yYWJsZSAocGVlaywgcG9rZSkKIGltcG9ydCBTeXN0ZW0uSU8uVW5zYWZlCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZyBhcyBCUwogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKIAotaW1wb3J0IFRocmlmdC5UeXBlcwogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKLQotdmVyc2lvbk1hc2sgOjogSW50MzIKLXZlcnNpb25NYXNrID0gZnJvbUludGVncmFsICgweGZmZmYwMDAwIDo6IFdvcmQzMikKLQotdmVyc2lvbjEgOjogSW50MzIKLXZlcnNpb24xID0gZnJvbUludGVncmFsICgweDgwMDEwMDAwIDo6IFdvcmQzMikKK2ltcG9ydCBUaHJpZnQuVHlwZXMKIAogY2xhc3MgUHJvdG9jb2wgYSB3aGVyZQotICBnZXRUcmFuc3BvcnQgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IHQKKyAgcmVhZEJ5dGUgOjogYSAtPiBJTyBMQlMuQnl0ZVN0cmluZworICByZWFkVmFsIDo6IGEgLT4gVGhyaWZ0VHlwZSAtPiBJTyBUaHJpZnRWYWwKKyAgcmVhZE1lc3NhZ2UgOjogYSAtPiAoKFRleHQsIE1lc3NhZ2VUeXBlLCBJbnQzMikgLT4gSU8gYikgLT4gSU8gYgogCi0gIHdyaXRlTWVzc2FnZUJlZ2luIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiAoVGV4dCwgTWVzc2FnZVR5cGUsIEludDMyKSAtPiBJTyAoKQotICB3cml0ZU1lc3NhZ2VFbmQgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gIHdyaXRlTWVzc2FnZUVuZCBfID0gcmV0dXJuICgpCi0gIAotICByZWFkTWVzc2FnZUJlZ2luIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoVGV4dCwgTWVzc2FnZVR5cGUsIEludDMyKQotICByZWFkTWVzc2FnZUVuZCA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgcmVhZE1lc3NhZ2VFbmQgXyA9IHJldHVybiAoKQorICB3cml0ZVZhbCA6OiBhIC0+IFRocmlmdFZhbCAtPiBJTyAoKQorICB3cml0ZU1lc3NhZ2UgOjogYSAtPiAoVGV4dCwgTWVzc2FnZVR5cGUsIEludDMyKSAtPiBJTyAoKSAtPiBJTyAoKQogCi0gIHNlcmlhbGl6ZVZhbCA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gVGhyaWZ0VmFsIC0+IEJ5dGVTdHJpbmcKLSAgZGVzZXJpYWxpemVWYWwgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IFRocmlmdFR5cGUgLT4gQnl0ZVN0cmluZyAtPiBUaHJpZnRWYWwKLQotICB3cml0ZVZhbCA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gVGhyaWZ0VmFsIC0+IElPICgpCi0gIHdyaXRlVmFsIHAgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAuIHNlcmlhbGl6ZVZhbCBwCi0gIHJlYWRWYWwgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IFRocmlmdFR5cGUgLT4gSU8gVGhyaWZ0VmFsCitjbGFzcyBQcm90b2NvbCBhID0+IFN0YXRlbGVzc1Byb3RvY29sIGEgd2hlcmUKKyAgc2VyaWFsaXplVmFsIDo6IGEgLT4gVGhyaWZ0VmFsIC0+IExCUy5CeXRlU3RyaW5nCisgIGRlc2VyaWFsaXplVmFsIDo6IGEgLT4gVGhyaWZ0VHlwZSAtPiBMQlMuQnl0ZVN0cmluZyAtPiBUaHJpZnRWYWwKIAogZGF0YSBQcm90b2NvbEV4blR5cGUKICAgICA9IFBFX1VOS05PV04KQEAgLTEwMSwxMiArODksMTMgQEAKICAgVEkzMnt9IC0+IFRfSTMyCiAgIFRJNjR7fSAtPiBUX0k2NAogICBUU3RyaW5ne30gLT4gVF9TVFJJTkcKKyAgVEJpbmFyeXt9IC0+IFRfQklOQVJZCiAgIFREb3VibGV7fSAtPiBUX0RPVUJMRQogCi1ydW5QYXJzZXIgOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0LCBTaG93IGEpID0+IHAgdCAtPiBQYXJzZXIgYSAtPiBJTyBhCitydW5QYXJzZXIgOjogKFByb3RvY29sIHAsIFNob3cgYSkgPT4gcCAtPiBQYXJzZXIgYSAtPiBJTyBhCiBydW5QYXJzZXIgcHJvdCBwID0gcmVmaWxsID4+PSBnZXRSZXN1bHQgLiBwYXJzZSBwCiAgIHdoZXJlCi0gICAgcmVmaWxsID0gaGFuZGxlIGhhbmRsZUVPRiAkIHRvU3RyaWN0IDwkPiB0UmVhZCAoZ2V0VHJhbnNwb3J0IHByb3QpIDEKKyAgICByZWZpbGwgPSBoYW5kbGUgaGFuZGxlRU9GICQgTEJTLnRvU3RyaWN0IDwkPiByZWFkQnl0ZSBwcm90CiAgICAgZ2V0UmVzdWx0IChEb25lIF8gYSkgPSByZXR1cm4gYQogICAgIGdldFJlc3VsdCAoUGFydGlhbCBrKSA9IHJlZmlsbCA+Pj0gZ2V0UmVzdWx0IC4gawogICAgIGdldFJlc3VsdCBmID0gdGhyb3cgJCBQcm90b2NvbEV4biBQRV9JTlZBTElEX0RBVEEgKHNob3cgZikKQEAgLTExOSwxOCArMTA4LDIyIEBACiAtLSB0aGVyZWZvcmUgdGhlIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gdmFyaWVzIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGxvY2FsCiAtLSBtYWNoaW5lIGlzIGJpZyBlbmRpYW4gb3IgbGl0dGxlIGVuZGlhbi4KIGJzVG9Eb3VibGUgOjogQlMuQnl0ZVN0cmluZyAtPiBEb3VibGUKLWJzVG9Eb3VibGUgYnMgPSB1bnNhZmVEdXBhYmxlUGVyZm9ybUlPICQgdW5zYWZlVXNlQXNDU3RyaW5nIGJzIGNhc3RCcwotICB3aGVyZQorYnNUb0RvdWJsZUxFIDo6IEJTLkJ5dGVTdHJpbmcgLT4gRG91YmxlCiAjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgotICAgIGNhc3RCcyBjaHJQdHIgPSBkbwotICAgICAgdyA8LSBwZWVrIChjYXN0UHRyIGNoclB0cikKLSAgICAgIHBva2UgKGNhc3RQdHIgY2hyUHRyKSAoYnl0ZVN3YXAgdykKLSAgICAgIHBlZWsgKGNhc3RQdHIgY2hyUHRyKQorYnNUb0RvdWJsZSBicyA9IHVuc2FmZUR1cGFibGVQZXJmb3JtSU8gJCB1bnNhZmVVc2VBc0NTdHJpbmcgYnMgY2FzdEJzU3dhcHBlZAorYnNUb0RvdWJsZUxFIGJzID0gdW5zYWZlRHVwYWJsZVBlcmZvcm1JTyAkIHVuc2FmZVVzZUFzQ1N0cmluZyBicyBjYXN0QnMKICNlbHNlCi0gICAgY2FzdEJzID0gcGVlayAuIGNhc3RQdHIKK2JzVG9Eb3VibGUgYnMgPSB1bnNhZmVEdXBhYmxlUGVyZm9ybUlPICQgdW5zYWZlVXNlQXNDU3RyaW5nIGJzIGNhc3RCcworYnNUb0RvdWJsZUxFIGJzID0gdW5zYWZlRHVwYWJsZVBlcmZvcm1JTyAkIHVuc2FmZVVzZUFzQ1N0cmluZyBicyBjYXN0QnNTd2FwcGVkCiAjZW5kaWYKIAotI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKworY2FzdEJzU3dhcHBlZCBjaHJQdHIgPSBkbworICB3IDwtIHBlZWsgKGNhc3RQdHIgY2hyUHRyKQorICBwb2tlIChjYXN0UHRyIGNoclB0cikgKGJ5dGVTd2FwIHcpCisgIHBlZWsgKGNhc3RQdHIgY2hyUHRyKQorY2FzdEJzID0gcGVlayAuIGNhc3RQdHIKKwogLS0gfCBTd2FwIGVuZGlhbm5lc3Mgb2YgYSA2NC1iaXQgd29yZAogYnl0ZVN3YXAgOjogV29yZDY0IC0+IFdvcmQ2NAogYnl0ZVN3YXAgdyA9ICh3IGBzaGlmdExgIDU2IC4mLiAweEZGMDAwMDAwMDAwMDAwMDApIC58LgpAQCAtMTQxLDQgKzEzNCwzIEBACiAgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgMjQgLiYuIDB4MDAwMDAwMDAwMEZGMDAwMCkgLnwuCiAgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgNDAgLiYuIDB4MDAwMDAwMDAwMDAwRkYwMCkgLnwuCiAgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgNTYgLiYuIDB4MDAwMDAwMDAwMDAwMDBGRikKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzCmluZGV4IGFjNzg0ODMuLjdiMGFjZDkgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0JpbmFyeS5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMKQEAgLTI1LDYgKzI1LDggQEAKIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CiAgICAgKCBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCiAgICAgLCBCaW5hcnlQcm90b2NvbCguLikKKyAgICAsIHZlcnNpb25NYXNrCisgICAgLCB2ZXJzaW9uMQogICAgICkgd2hlcmUKIAogaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uICggdGhyb3cgKQpAQCAtMzUsNiArMzcsNyBAQAogaW1wb3J0IERhdGEuSW50CiBpbXBvcnQgRGF0YS5Nb25vaWQKIGltcG9ydCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZyAoIGRlY29kZVV0ZjgsIGVuY29kZVV0ZjggKQoraW1wb3J0IERhdGEuV29yZAogCiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sCiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydApAQCAtNDcsMzcgKzUwLDU1IEBACiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5IGFzIExUCiAKLWRhdGEgQmluYXJ5UHJvdG9jb2wgYSA9IEJpbmFyeVByb3RvY29sIGEKK3ZlcnNpb25NYXNrIDo6IEludDMyCit2ZXJzaW9uTWFzayA9IGZyb21JbnRlZ3JhbCAoMHhmZmZmMDAwMCA6OiBXb3JkMzIpCisKK3ZlcnNpb24xIDo6IEludDMyCit2ZXJzaW9uMSA9IGZyb21JbnRlZ3JhbCAoMHg4MDAxMDAwMCA6OiBXb3JkMzIpCisKK2RhdGEgQmluYXJ5UHJvdG9jb2wgYSA9IFRyYW5zcG9ydCBhID0+IEJpbmFyeVByb3RvY29sIGEKKworZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IEJpbmFyeVByb3RvY29sIHQgLT4gdAorZ2V0VHJhbnNwb3J0IChCaW5hcnlQcm90b2NvbCB0KSA9IHQKIAogLS0gTk9URTogUmVhZGluZyBhbmQgV3JpdGluZyBmdW5jdGlvbnMgcmVseSBvbiBCdWlsZGVycyBhbmQgRGF0YS5CaW5hcnkgdG8KIC0tIGVuY29kZSBhbmQgZGVjb2RlIGRhdGEuICBEYXRhLkJpbmFyeSBhc3N1bWVzIHRoYXQgdGhlIGJpbmFyeSB2YWx1ZXMgaXQgaXMKIC0tIGVuY29kaW5nIHRvIGFuZCBkZWNvZGluZyBmcm9tIGFyZSBpbiBCSUcgRU5ESUFOIGZvcm1hdCwgYW5kIGNvbnZlcnRzIHRoZQogLS0gZW5kaWFubmVzcyBhcyBuZWNlc3NhcnkgdG8gbWF0Y2ggdGhlIGxvY2FsIG1hY2hpbmUuCi1pbnN0YW5jZSBQcm90b2NvbCBCaW5hcnlQcm90b2NvbCB3aGVyZQotICAgIGdldFRyYW5zcG9ydCAoQmluYXJ5UHJvdG9jb2wgdCkgPSB0CitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbCAoQmluYXJ5UHJvdG9jb2wgdCkgd2hlcmUKKyAgICByZWFkQnl0ZSBwID0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCisgICAgLS0gZmx1c2hUcmFuc3BvcnQgcCA9IHRGbHVzaCAoZ2V0VHJhbnNwb3J0IHApCisgICAgd3JpdGVNZXNzYWdlIHAgKG4sIHQsIHMpIGYgPSBkbworICAgICAgdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgbWVzc2FnZUJlZ2luCisgICAgICBmCisgICAgICB0Rmx1c2ggJCBnZXRUcmFuc3BvcnQgcAorICAgICAgd2hlcmUKKyAgICAgICAgbWVzc2FnZUJlZ2luID0gdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiAodmVyc2lvbjEgLnwuIGZyb21JbnRlZ3JhbCAoZnJvbUVudW0gdCkpKSA8PgorICAgICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRTdHJpbmcgJCBlbmNvZGVVdGY4IG4pIDw+CisgICAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiBzKQogCi0gICAgd3JpdGVNZXNzYWdlQmVnaW4gcCAobiwgdCwgcykgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAkIHRvTGF6eUJ5dGVTdHJpbmcgJAotICAgICAgICBidWlsZEJpbmFyeVZhbHVlIChUSTMyICh2ZXJzaW9uMSAufC4gZnJvbUludGVncmFsIChmcm9tRW51bSB0KSkpIDw+Ci0gICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRTdHJpbmcgJCBlbmNvZGVVdGY4IG4pIDw+Ci0gICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRJMzIgcykKKyAgICByZWFkTWVzc2FnZSBwID0gKHJlYWRNZXNzYWdlQmVnaW4gcCA+Pj0pCisgICAgICB3aGVyZQorICAgICAgICByZWFkTWVzc2FnZUJlZ2luIHAgPSBydW5QYXJzZXIgcCAkIGRvCisgICAgICAgICAgVEkzMiB2ZXIgPC0gcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMgorICAgICAgICAgIGlmIHZlciAuJi4gdmVyc2lvbk1hc2sgLz0gdmVyc2lvbjEKKyAgICAgICAgICAgIHRoZW4gdGhyb3cgJCBQcm90b2NvbEV4biBQRV9CQURfVkVSU0lPTiAiTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXIiCisgICAgICAgICAgICBlbHNlIGRvCisgICAgICAgICAgICAgIFRTdHJpbmcgcyA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfU1RSSU5HCisgICAgICAgICAgICAgIFRJMzIgc3ogPC0gcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMgorICAgICAgICAgICAgICByZXR1cm4gKGRlY29kZVV0ZjggcywgdG9FbnVtICQgZnJvbUludGVncmFsICQgdmVyIC4mLiAweEZGLCBzeikKIAotICAgIHJlYWRNZXNzYWdlQmVnaW4gcCA9IHJ1blBhcnNlciBwICQgZG8KLSAgICAgIFRJMzIgdmVyIDwtIHBhcnNlQmluYXJ5VmFsdWUgVF9JMzIKLSAgICAgIGlmIHZlciAuJi4gdmVyc2lvbk1hc2sgLz0gdmVyc2lvbjEKLSAgICAgICAgdGhlbiB0aHJvdyAkIFByb3RvY29sRXhuIFBFX0JBRF9WRVJTSU9OICJNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllciIKLSAgICAgICAgZWxzZSBkbwotICAgICAgICAgIFRTdHJpbmcgcyA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfU1RSSU5HCi0gICAgICAgICAgVEkzMiBzeiA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfSTMyCi0gICAgICAgICAgcmV0dXJuIChkZWNvZGVVdGY4IHMsIHRvRW51bSAkIGZyb21JbnRlZ3JhbCAkIHZlciAuJi4gMHhGRiwgc3opCisgICAgd3JpdGVWYWwgcCA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIC4gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkQmluYXJ5VmFsdWUKKyAgICByZWFkVmFsIHAgPSBydW5QYXJzZXIgcCAuIHBhcnNlQmluYXJ5VmFsdWUKIAoraW5zdGFuY2UgVHJhbnNwb3J0IHQgPT4gU3RhdGVsZXNzUHJvdG9jb2wgKEJpbmFyeVByb3RvY29sIHQpIHdoZXJlCiAgICAgc2VyaWFsaXplVmFsIF8gPSB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRCaW5hcnlWYWx1ZQogICAgIGRlc2VyaWFsaXplVmFsIF8gdHkgYnMgPQogICAgICAgY2FzZSBMUC5laXRoZXJSZXN1bHQgJCBMUC5wYXJzZSAocGFyc2VCaW5hcnlWYWx1ZSB0eSkgYnMgb2YKICAgICAgICAgTGVmdCBzIC0+IGVycm9yIHMKICAgICAgICAgUmlnaHQgdmFsIC0+IHZhbAogCi0gICAgcmVhZFZhbCBwID0gcnVuUGFyc2VyIHAgLiBwYXJzZUJpbmFyeVZhbHVlCi0KIC0tIHwgV3JpdGluZyBGdW5jdGlvbnMKIGJ1aWxkQmluYXJ5VmFsdWUgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKIGJ1aWxkQmluYXJ5VmFsdWUgKFRTdHJ1Y3QgZmllbGRzKSA9IGJ1aWxkQmluYXJ5U3RydWN0IGZpZWxkcyA8PiBidWlsZFR5cGUgVF9TVE9QCkBAIC0xMDQsNiArMTI1LDcgQEAKIGJ1aWxkQmluYXJ5VmFsdWUgKFRTdHJpbmcgcykgPSBpbnQzMkJFIGxlbiA8PiBsYXp5Qnl0ZVN0cmluZyBzCiAgIHdoZXJlCiAgICAgbGVuIDo6IEludDMyID0gZnJvbUludGVncmFsIChMQlMubGVuZ3RoIHMpCitidWlsZEJpbmFyeVZhbHVlIChUQmluYXJ5IHMpID0gYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cmluZyBzKQogCiBidWlsZEJpbmFyeVN0cnVjdCA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSAtPiBCdWlsZGVyCiBidWlsZEJpbmFyeVN0cnVjdCA9IE1hcC5mb2xkcldpdGhLZXkgY29tYmluZSBtZW1wdHkKQEAgLTEyMSw3ICsxNDMsNyBAQAogCiAtLSB8IFJlYWRpbmcgRnVuY3Rpb25zCiBwYXJzZUJpbmFyeVZhbHVlIDo6IFRocmlmdFR5cGUgLT4gUC5QYXJzZXIgVGhyaWZ0VmFsCi1wYXJzZUJpbmFyeVZhbHVlIChUX1NUUlVDVCBfKSA9IFRTdHJ1Y3QgPCQ+IHBhcnNlQmluYXJ5U3RydWN0CitwYXJzZUJpbmFyeVZhbHVlIChUX1NUUlVDVCB0bWFwKSA9IFRTdHJ1Y3QgPCQ+IHBhcnNlQmluYXJ5U3RydWN0IHRtYXAKIHBhcnNlQmluYXJ5VmFsdWUgKFRfTUFQIF8gXykgPSBkbwogICBrdCA8LSBwYXJzZVR5cGUKICAgdnQgPC0gcGFyc2VUeXBlCkBAIC0xNDEsMTggKzE2MywyMyBAQAogcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMiA9IFRJMzIgLiBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CiBwYXJzZUJpbmFyeVZhbHVlIFRfSTY0ID0gVEk2NCAuIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDgKIHBhcnNlQmluYXJ5VmFsdWUgVF9ET1VCTEUgPSBURG91YmxlIC4gYnNUb0RvdWJsZSA8JD4gUC50YWtlIDgKLXBhcnNlQmluYXJ5VmFsdWUgVF9TVFJJTkcgPSBkbwotICBpIDo6IEludDMyICA8LSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0Ci0gIFRTdHJpbmcgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIChmcm9tSW50ZWdyYWwgaSkKK3BhcnNlQmluYXJ5VmFsdWUgVF9TVFJJTkcgPSBwYXJzZUJpbmFyeVN0cmluZyBUU3RyaW5nCitwYXJzZUJpbmFyeVZhbHVlIFRfQklOQVJZID0gcGFyc2VCaW5hcnlTdHJpbmcgVEJpbmFyeQogcGFyc2VCaW5hcnlWYWx1ZSB0eSA9IGVycm9yICQgIkNhbm5vdCByZWFkIHZhbHVlIG9mIHR5cGUgIiArKyBzaG93IHR5CiAKLXBhcnNlQmluYXJ5U3RydWN0IDo6IFAuUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKLXBhcnNlQmluYXJ5U3RydWN0ID0gTWFwLmZyb21MaXN0IDwkPiBQLm1hbnlUaWxsIHBhcnNlRmllbGQgKG1hdGNoVHlwZSBUX1NUT1ApCitwYXJzZUJpbmFyeVN0cmluZyB0eSA9IGRvCisgIGkgOjogSW50MzIgIDwtIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDQKKyAgdHkgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIChmcm9tSW50ZWdyYWwgaSkKKworcGFyc2VCaW5hcnlTdHJ1Y3QgOjogVHlwZU1hcCAtPiBQLlBhcnNlciAoTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkpCitwYXJzZUJpbmFyeVN0cnVjdCB0bWFwID0gTWFwLmZyb21MaXN0IDwkPiBQLm1hbnlUaWxsIHBhcnNlRmllbGQgKG1hdGNoVHlwZSBUX1NUT1ApCiAgIHdoZXJlCiAgICAgcGFyc2VGaWVsZCA9IGRvCiAgICAgICB0IDwtIHBhcnNlVHlwZQogICAgICAgbiA8LSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAyCi0gICAgICB2IDwtIHBhcnNlQmluYXJ5VmFsdWUgdAorICAgICAgdiA8LSBjYXNlICh0LCBNYXAubG9va3VwIG4gdG1hcCkgb2YKKyAgICAgICAgICAgICAoVF9TVFJJTkcsIEp1c3QgKF8sIFRfQklOQVJZKSkgLT4gcGFyc2VCaW5hcnlWYWx1ZSBUX0JJTkFSWQorICAgICAgICAgICAgIF8gLT4gcGFyc2VCaW5hcnlWYWx1ZSB0CiAgICAgICByZXR1cm4gKG4sICgiIiwgdikpCiAKIHBhcnNlQmluYXJ5TWFwIDo6IFRocmlmdFR5cGUgLT4gVGhyaWZ0VHlwZSAtPiBJbnQzMiAtPiBQLlBhcnNlciBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0KZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0NvbXBhY3QuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzCmluZGV4IGEzMjlmNGUuLmYyMzk3MGEgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0NvbXBhY3QuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQ29tcGFjdC5ocwpAQCAtMjUsMTAgKzI1LDExIEBACiBtb2R1bGUgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKICAgICAoIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wKICAgICAsIENvbXBhY3RQcm90b2NvbCguLikKKyAgICAsIHBhcnNlVmFyaW50CisgICAgLCBidWlsZFZhcmludAogICAgICkgd2hlcmUKIAogaW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKLWltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIHRocm93ICkKIGltcG9ydCBDb250cm9sLk1vbmFkCiBpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAogaW1wb3J0IERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nLkxhenkgYXMgTFAKQEAgLTQwLDcgKzQxLDcgQEAKIGltcG9ydCBEYXRhLldvcmQKIGltcG9ydCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZyAoIGRlY29kZVV0ZjgsIGVuY29kZVV0ZjggKQogCi1pbXBvcnQgVGhyaWZ0LlByb3RvY29sIGhpZGluZyAodmVyc2lvbk1hc2spCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAogaW1wb3J0IFRocmlmdC5UeXBlcwogCkBAIC01NSw3ICs1Niw3IEBACiBkYXRhIENvbXBhY3RQcm90b2NvbCBhID0gQ29tcGFjdFByb3RvY29sIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBeIENvbnN0dWN0IGEgJ0NvbXBhY3RQcm90b2NvbCcgd2l0aCBhICdUcmFuc3BvcnQnCiAKLXByb3RvY29sSUQsIHZlcnNpb24sIHR5cGVNYXNrIDo6IEludDgKK3Byb3RvY29sSUQsIHZlcnNpb24sIHZlcnNpb25NYXNrLCB0eXBlTWFzaywgdHlwZUJpdHMgOjogV29yZDgKIHByb3RvY29sSUQgID0gMHg4MiAtLSAxMDAwIDAwMTAKIHZlcnNpb24gICAgID0gMHgwMQogdmVyc2lvbk1hc2sgPSAweDFmIC0tIDAwMDEgMTExMQpAQCAtNjQsMzggKzY1LDQ3IEBACiB0eXBlU2hpZnRBbW91bnQgOjogSW50CiB0eXBlU2hpZnRBbW91bnQgPSA1CiAKK2dldFRyYW5zcG9ydCA6OiBUcmFuc3BvcnQgdCA9PiBDb21wYWN0UHJvdG9jb2wgdCAtPiB0CitnZXRUcmFuc3BvcnQgKENvbXBhY3RQcm90b2NvbCB0KSA9IHQKIAotaW5zdGFuY2UgUHJvdG9jb2wgQ29tcGFjdFByb3RvY29sIHdoZXJlCi0gICAgZ2V0VHJhbnNwb3J0IChDb21wYWN0UHJvdG9jb2wgdCkgPSB0CitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbCAoQ29tcGFjdFByb3RvY29sIHQpIHdoZXJlCisgICAgcmVhZEJ5dGUgcCA9IHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgMQorICAgIHdyaXRlTWVzc2FnZSBwIChuLCB0LCBzKSBmID0gZG8KKyAgICAgIHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIG1lc3NhZ2VCZWdpbgorICAgICAgZgorICAgICAgdEZsdXNoICQgZ2V0VHJhbnNwb3J0IHAKKyAgICAgIHdoZXJlCisgICAgICAgIG1lc3NhZ2VCZWdpbiA9IHRvTGF6eUJ5dGVTdHJpbmcgJAorICAgICAgICAgIEIud29yZDggcHJvdG9jb2xJRCA8PgorICAgICAgICAgIEIud29yZDggKCh2ZXJzaW9uIC4mLiB2ZXJzaW9uTWFzaykgLnwuCisgICAgICAgICAgICAgICAgICAoKChmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSB0KSBgc2hpZnRMYAorICAgICAgICAgICAgICAgICAgdHlwZVNoaWZ0QW1vdW50KSAuJi4gdHlwZU1hc2spKSA8PgorICAgICAgICAgIGJ1aWxkVmFyaW50IChpMzJUb1ppZ1phZyBzKSA8PgorICAgICAgICAgIGJ1aWxkQ29tcGFjdFZhbHVlIChUU3RyaW5nICQgZW5jb2RlVXRmOCBuKQogCi0gICAgd3JpdGVNZXNzYWdlQmVnaW4gcCAobiwgdCwgcykgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAkIHRvTGF6eUJ5dGVTdHJpbmcgJAotICAgICAgQi5pbnQ4IHByb3RvY29sSUQgPD4KLSAgICAgIEIuaW50OCAoKHZlcnNpb24gLiYuIHZlcnNpb25NYXNrKSAufC4KLSAgICAgICAgICAgICAgKCgoZnJvbUludGVncmFsICQgZnJvbUVudW0gdCkgYHNoaWZ0TGAKLSAgICAgICAgICAgICAgICB0eXBlU2hpZnRBbW91bnQpIC4mLiB0eXBlTWFzaykpIDw+Ci0gICAgICBidWlsZFZhcmludCAoaTMyVG9aaWdaYWcgcykgPD4KLSAgICAgIGJ1aWxkQ29tcGFjdFZhbHVlIChUU3RyaW5nICQgZW5jb2RlVXRmOCBuKQotICAgIAotICAgIHJlYWRNZXNzYWdlQmVnaW4gcCA9IHJ1blBhcnNlciBwICQgZG8KLSAgICAgIHBpZCA8LSBmcm9tSW50ZWdyYWwgPCQ+IFAuYW55V29yZDgKLSAgICAgIHdoZW4gKHBpZCAvPSBwcm90b2NvbElEKSAkIGVycm9yICJCYWQgUHJvdG9jb2wgSUQiCi0gICAgICB3IDwtIGZyb21JbnRlZ3JhbCA8JD4gUC5hbnlXb3JkOAotICAgICAgbGV0IHZlciA9IHcgLiYuIHZlcnNpb25NYXNrIAotICAgICAgd2hlbiAodmVyIC89IHZlcnNpb24pICQgZXJyb3IgIkJhZCBQcm90b2NvbCB2ZXJzaW9uIgotICAgICAgbGV0IHR5cCA9ICh3IGBzaGlmdFJgIHR5cGVTaGlmdEFtb3VudCkgLiYuIHR5cGVCaXRzCi0gICAgICBzZXFJZCA8LSBwYXJzZVZhcmludCB6aWdaYWdUb0kzMgotICAgICAgVFN0cmluZyBuYW1lIDwtIHBhcnNlQ29tcGFjdFZhbHVlIFRfU1RSSU5HCi0gICAgICByZXR1cm4gKGRlY29kZVV0ZjggbmFtZSwgdG9FbnVtICQgZnJvbUludGVncmFsICQgdHlwLCBzZXFJZCkKKyAgICByZWFkTWVzc2FnZSBwIGYgPSByZWFkTWVzc2FnZUJlZ2luID4+PSBmCisgICAgICB3aGVyZQorICAgICAgICByZWFkTWVzc2FnZUJlZ2luID0gcnVuUGFyc2VyIHAgJCBkbworICAgICAgICAgIHBpZCA8LSBmcm9tSW50ZWdyYWwgPCQ+IFAuYW55V29yZDgKKyAgICAgICAgICB3aGVuIChwaWQgLz0gcHJvdG9jb2xJRCkgJCBlcnJvciAiQmFkIFByb3RvY29sIElEIgorICAgICAgICAgIHcgPC0gZnJvbUludGVncmFsIDwkPiBQLmFueVdvcmQ4CisgICAgICAgICAgbGV0IHZlciA9IHcgLiYuIHZlcnNpb25NYXNrCisgICAgICAgICAgd2hlbiAodmVyIC89IHZlcnNpb24pICQgZXJyb3IgIkJhZCBQcm90b2NvbCB2ZXJzaW9uIgorICAgICAgICAgIGxldCB0eXAgPSAodyBgc2hpZnRSYCB0eXBlU2hpZnRBbW91bnQpIC4mLiB0eXBlQml0cworICAgICAgICAgIHNlcUlkIDwtIHBhcnNlVmFyaW50IHppZ1phZ1RvSTMyCisgICAgICAgICAgVFN0cmluZyBuYW1lIDwtIHBhcnNlQ29tcGFjdFZhbHVlIFRfU1RSSU5HCisgICAgICAgICAgcmV0dXJuIChkZWNvZGVVdGY4IG5hbWUsIHRvRW51bSAkIGZyb21JbnRlZ3JhbCAkIHR5cCwgc2VxSWQpCiAKKyAgICB3cml0ZVZhbCBwID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgLiB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRDb21wYWN0VmFsdWUKKyAgICByZWFkVmFsIHAgdHkgPSBydW5QYXJzZXIgcCAkIHBhcnNlQ29tcGFjdFZhbHVlIHR5CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFN0YXRlbGVzc1Byb3RvY29sIChDb21wYWN0UHJvdG9jb2wgdCkgd2hlcmUKICAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZENvbXBhY3RWYWx1ZQogICAgIGRlc2VyaWFsaXplVmFsIF8gdHkgYnMgPQogICAgICAgY2FzZSBMUC5laXRoZXJSZXN1bHQgJCBMUC5wYXJzZSAocGFyc2VDb21wYWN0VmFsdWUgdHkpIGJzIG9mCiAgICAgICAgIExlZnQgcyAtPiBlcnJvciBzCiAgICAgICAgIFJpZ2h0IHZhbCAtPiB2YWwKIAotICAgIHJlYWRWYWwgcCB0eSA9IHJ1blBhcnNlciBwICQgcGFyc2VDb21wYWN0VmFsdWUgdHkKLQotCiAtLSB8IFdyaXRpbmcgRnVuY3Rpb25zCiBidWlsZENvbXBhY3RWYWx1ZSA6OiBUaHJpZnRWYWwgLT4gQnVpbGRlcgogYnVpbGRDb21wYWN0VmFsdWUgKFRTdHJ1Y3QgZmllbGRzKSA9IGJ1aWxkQ29tcGFjdFN0cnVjdCBmaWVsZHMKQEAgLTEyMCwxMCArMTMwLDExIEBACiBidWlsZENvbXBhY3RWYWx1ZSAoVEkxNiBpKSA9IGJ1aWxkVmFyaW50ICQgaTE2VG9aaWdaYWcgaQogYnVpbGRDb21wYWN0VmFsdWUgKFRJMzIgaSkgPSBidWlsZFZhcmludCAkIGkzMlRvWmlnWmFnIGkKIGJ1aWxkQ29tcGFjdFZhbHVlIChUSTY0IGkpID0gYnVpbGRWYXJpbnQgJCBpNjRUb1ppZ1phZyBpCi1idWlsZENvbXBhY3RWYWx1ZSAoVERvdWJsZSBkKSA9IGRvdWJsZUJFIGQKK2J1aWxkQ29tcGFjdFZhbHVlIChURG91YmxlIGQpID0gZG91YmxlTEUgZAogYnVpbGRDb21wYWN0VmFsdWUgKFRTdHJpbmcgcykgPSBidWlsZFZhcmludCBsZW4gPD4gbGF6eUJ5dGVTdHJpbmcgcwogICB3aGVyZQogICAgIGxlbiA9IGZyb21JbnRlZ3JhbCAoTEJTLmxlbmd0aCBzKSA6OiBXb3JkMzIKK2J1aWxkQ29tcGFjdFZhbHVlIChUQmluYXJ5IHMpID0gYnVpbGRDb21wYWN0VmFsdWUgKFRTdHJpbmcgcykKIAogYnVpbGRDb21wYWN0U3RydWN0IDo6IE1hcC5IYXNoTWFwIEludDE2IChMVC5UZXh0LCBUaHJpZnRWYWwpIC0+IEJ1aWxkZXIKIGJ1aWxkQ29tcGFjdFN0cnVjdCA9IGZsaXAgKGxvb3AgMCkgbWVtcHR5IC4gTWFwLnRvTGlzdApAQCAtMTQ2LDcgKzE1Nyw3IEBACiAKIC0tIHwgUmVhZGluZyBGdW5jdGlvbnMKIHBhcnNlQ29tcGFjdFZhbHVlIDo6IFRocmlmdFR5cGUgLT4gUGFyc2VyIFRocmlmdFZhbAotcGFyc2VDb21wYWN0VmFsdWUgKFRfU1RSVUNUIF8pID0gVFN0cnVjdCA8JD4gcGFyc2VDb21wYWN0U3RydWN0CitwYXJzZUNvbXBhY3RWYWx1ZSAoVF9TVFJVQ1QgdG1hcCkgPSBUU3RydWN0IDwkPiBwYXJzZUNvbXBhY3RTdHJ1Y3QgdG1hcAogcGFyc2VDb21wYWN0VmFsdWUgKFRfTUFQIGt0JyB2dCcpID0gZG8KICAgbiA8LSBwYXJzZVZhcmludCBpZAogICBpZiBuID09IDAKQEAgLTE2MywxNCArMTc0LDE3IEBACiBwYXJzZUNvbXBhY3RWYWx1ZSBUX0kxNiA9IFRJMTYgPCQ+IHBhcnNlVmFyaW50IHppZ1phZ1RvSTE2CiBwYXJzZUNvbXBhY3RWYWx1ZSBUX0kzMiA9IFRJMzIgPCQ+IHBhcnNlVmFyaW50IHppZ1phZ1RvSTMyCiBwYXJzZUNvbXBhY3RWYWx1ZSBUX0k2NCA9IFRJNjQgPCQ+IHBhcnNlVmFyaW50IHppZ1phZ1RvSTY0Ci1wYXJzZUNvbXBhY3RWYWx1ZSBUX0RPVUJMRSA9IFREb3VibGUgLiBic1RvRG91YmxlIDwkPiBQLnRha2UgOAotcGFyc2VDb21wYWN0VmFsdWUgVF9TVFJJTkcgPSBkbwotICBsZW4gOjogV29yZDMyIDwtIHBhcnNlVmFyaW50IGlkCi0gIFRTdHJpbmcgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIChmcm9tSW50ZWdyYWwgbGVuKQorcGFyc2VDb21wYWN0VmFsdWUgVF9ET1VCTEUgPSBURG91YmxlIC4gYnNUb0RvdWJsZUxFIDwkPiBQLnRha2UgOAorcGFyc2VDb21wYWN0VmFsdWUgVF9TVFJJTkcgPSBwYXJzZUNvbXBhY3RTdHJpbmcgVFN0cmluZworcGFyc2VDb21wYWN0VmFsdWUgVF9CSU5BUlkgPSBwYXJzZUNvbXBhY3RTdHJpbmcgVEJpbmFyeQogcGFyc2VDb21wYWN0VmFsdWUgdHkgPSBlcnJvciAkICJDYW5ub3QgcmVhZCB2YWx1ZSBvZiB0eXBlICIgKysgc2hvdyB0eQogCi1wYXJzZUNvbXBhY3RTdHJ1Y3QgOjogUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKLXBhcnNlQ29tcGFjdFN0cnVjdCA9IE1hcC5mcm9tTGlzdCA8JD4gcGFyc2VGaWVsZHMgMAorcGFyc2VDb21wYWN0U3RyaW5nIHR5ID0gZG8KKyAgbGVuIDo6IFdvcmQzMiA8LSBwYXJzZVZhcmludCBpZAorICB0eSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgKGZyb21JbnRlZ3JhbCBsZW4pCisKK3BhcnNlQ29tcGFjdFN0cnVjdCA6OiBUeXBlTWFwIC0+IFBhcnNlciAoTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkpCitwYXJzZUNvbXBhY3RTdHJ1Y3QgdG1hcCA9IE1hcC5mcm9tTGlzdCA8JD4gcGFyc2VGaWVsZHMgMAogICB3aGVyZQogICAgIHBhcnNlRmllbGRzIDo6IEludDE2IC0+IFBhcnNlciBbKEludDE2LCAoTFQuVGV4dCwgVGhyaWZ0VmFsKSldCiAgICAgcGFyc2VGaWVsZHMgbGFzdElkID0gZG8KQEAgLTE4NSw3ICsxOTksOSBAQAogICAgICAgICAgICAgICAgICBlbHNlIHBhcnNlVmFyaW50IHppZ1phZ1RvSTE2CiAgICAgICAgICAgdmFsIDwtIGlmIHR5ID09IFRfQk9PTAogICAgICAgICAgICAgICAgICB0aGVuIHJldHVybiAoVEJvb2wgJCAodyAuJi4gMHgwRikgPT0gMHgwMSkKLSAgICAgICAgICAgICAgICAgZWxzZSBwYXJzZUNvbXBhY3RWYWx1ZSB0eQorICAgICAgICAgICAgICAgICBlbHNlIGNhc2UgKHR5LCBNYXAubG9va3VwIGZpZCB0bWFwKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgKFRfU1RSSU5HLCBKdXN0IChfLCBUX0JJTkFSWSkpIC0+IHBhcnNlQ29tcGFjdFZhbHVlIFRfQklOQVJZCisgICAgICAgICAgICAgICAgICAgICAgICBfIC0+IHBhcnNlQ29tcGFjdFZhbHVlIHR5CiAgICAgICAgICAgKChmaWQsIChMVC5lbXB0eSwgdmFsKSkgOiApIDwkPiBwYXJzZUZpZWxkcyBmaWQKIAogcGFyc2VDb21wYWN0TWFwIDo6IFRocmlmdFR5cGUgLT4gVGhyaWZ0VHlwZSAtPiBJbnQzMiAtPgpAQCAtMjU1LDYgKzI3MSw3IEBACiAgIFRfSTY0IC0+IDB4MDYKICAgVF9ET1VCTEUgLT4gMHgwNwogICBUX1NUUklORyAtPiAweDA4CisgIFRfQklOQVJZIC0+IDB4MDgKICAgVF9MSVNUe30gLT4gMHgwOQogICBUX1NFVHt9IC0+IDB4MEEKICAgVF9NQVB7fSAtPiAweDBCCkBAIC0yNzEsMTEgKzI4OCwxMiBAQAogICBUSTY0IF8gLT4gMHgwNgogICBURG91YmxlIF8gLT4gMHgwNwogICBUU3RyaW5nIF8gLT4gMHgwOAorICBUQmluYXJ5IF8gLT4gMHgwOAogICBUTGlzdHt9IC0+IDB4MDkKICAgVFNldHt9IC0+IDB4MEEKICAgVE1hcHt9IC0+IDB4MEIKICAgVFN0cnVjdHt9IC0+IDB4MEMKLSAgCisKIHR5cGVGcm9tIDo6IFdvcmQ4IC0+IFRocmlmdFR5cGUKIHR5cGVGcm9tIHcgPSBjYXNlIHcgb2YKICAgMHgwMSAtPiBUX0JPT0wKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0hlYWRlci5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0hlYWRlci5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQyZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSGVhZGVyLmhzCkBAIC0wLDAgKzEsMTQxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworCittb2R1bGUgVGhyaWZ0LlByb3RvY29sLkhlYWRlcgorICAgICggbW9kdWxlIFRocmlmdC5Qcm90b2NvbAorICAgICwgSGVhZGVyUHJvdG9jb2woLi4pCisgICAgLCBnZXRQcm90b2NvbFR5cGUKKyAgICAsIHNldFByb3RvY29sVHlwZQorICAgICwgZ2V0SGVhZGVycworICAgICwgZ2V0V3JpdGVIZWFkZXJzCisgICAgLCBzZXRIZWFkZXIKKyAgICAsIHNldEhlYWRlcnMKKyAgICAsIGNyZWF0ZUhlYWRlclByb3RvY29sCisgICAgLCBjcmVhdGVIZWFkZXJQcm90b2NvbDEKKyAgICApIHdoZXJlCisKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkpTT04KK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhlYWRlcgoraW1wb3J0IERhdGEuSU9SZWYKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXAgYXMgTWFwCisKK2RhdGEgUHJvdG9jb2xXcmFwID0gZm9yYWxsIGEuIChQcm90b2NvbCBhKSA9PiBQcm90b2NvbFdyYXAoYSkKKworaW5zdGFuY2UgUHJvdG9jb2wgUHJvdG9jb2xXcmFwIHdoZXJlCisgIHJlYWRCeXRlIChQcm90b2NvbFdyYXAgcCkgPSByZWFkQnl0ZSBwCisgIHJlYWRWYWwgKFByb3RvY29sV3JhcCBwKSA9IHJlYWRWYWwgcAorICByZWFkTWVzc2FnZSAoUHJvdG9jb2xXcmFwIHApID0gcmVhZE1lc3NhZ2UgcAorICB3cml0ZVZhbCAoUHJvdG9jb2xXcmFwIHApID0gd3JpdGVWYWwgcAorICB3cml0ZU1lc3NhZ2UgKFByb3RvY29sV3JhcCBwKSA9IHdyaXRlTWVzc2FnZSBwCisKK2RhdGEgSGVhZGVyUHJvdG9jb2wgaSBvID0gKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgeworICAgIHRyYW5zIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8sCisgICAgd3JhcHBlZFByb3RvIDo6IElPUmVmIFByb3RvY29sV3JhcAorICB9CisKK2NyZWF0ZVByb3RvY29sV3JhcCA6OiBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbFR5cGUgLT4gdCAtPiBQcm90b2NvbFdyYXAKK2NyZWF0ZVByb3RvY29sV3JhcCB0eXAgdCA9CisgIGNhc2UgdHlwIG9mCisgICAgVEJpbmFyeSAtPiBQcm90b2NvbFdyYXAgJCBCaW5hcnlQcm90b2NvbCB0CisgICAgVENvbXBhY3QgLT4gUHJvdG9jb2xXcmFwICQgQ29tcGFjdFByb3RvY29sIHQKKyAgICBUSlNPTiAtPiBQcm90b2NvbFdyYXAgJCBKU09OUHJvdG9jb2wgdAorCitjcmVhdGVIZWFkZXJQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBpIC0+IG8gLT4gSU8oSGVhZGVyUHJvdG9jb2wgaSBvKQorY3JlYXRlSGVhZGVyUHJvdG9jb2wgaSBvID0gZG8KKyAgdCA8LSBvcGVuSGVhZGVyVHJhbnNwb3J0IGkgbworICBwaWQgPC0gcmVhZElPUmVmICQgcHJvdG9jb2xUeXBlIHQKKyAgcHJvdG8gPC0gbmV3SU9SZWYgJCBjcmVhdGVQcm90b2NvbFdyYXAgcGlkIHQKKyAgcmV0dXJuICQgSGVhZGVyUHJvdG9jb2wgeyB0cmFucyA9IHQsIHdyYXBwZWRQcm90byA9IHByb3RvIH0KKworY3JlYXRlSGVhZGVyUHJvdG9jb2wxIDo6IFRyYW5zcG9ydCB0ID0+IHQgLT4gSU8oSGVhZGVyUHJvdG9jb2wgdCB0KQorY3JlYXRlSGVhZGVyUHJvdG9jb2wxIHQgPSBjcmVhdGVIZWFkZXJQcm90b2NvbCB0IHQKKworcmVzZXRQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSU8gKCkKK3Jlc2V0UHJvdG9jb2wgcCA9IGRvCisgIHBpZCA8LSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgJCB0cmFucyBwCisgIHdyaXRlSU9SZWYgKHdyYXBwZWRQcm90byBwKSAkIGNyZWF0ZVByb3RvY29sV3JhcCBwaWQgJCB0cmFucyBwCisKK2dldFdyYXBwZWQgPSByZWFkSU9SZWYgLiB3cmFwcGVkUHJvdG8KKworc2V0VHJhbnNwb3J0IDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEhlYWRlclByb3RvY29sIGkgbworc2V0VHJhbnNwb3J0IHAgdCA9IHAgeyB0cmFucyA9IHQgfQorCit1cGRhdGVUcmFuc3BvcnQgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IChIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEhlYWRlclRyYW5zcG9ydCBpIG8pLT4gSGVhZGVyUHJvdG9jb2wgaSBvCit1cGRhdGVUcmFuc3BvcnQgcCBmID0gc2V0VHJhbnNwb3J0IHAgKGYgJCB0cmFucyBwKQorCit0eXBlIEhlYWRlcnMgPSBNYXAuTWFwIFN0cmluZyBTdHJpbmcKKworLS0gVE9ETzogd2Ugd2FudCB0byBzZXQgaGVhZGVycyB3aXRob3V0IHJlY3JlYXRpbmcgY2xpZW50Li4uCitzZXRIZWFkZXIgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFN0cmluZyAtPiBTdHJpbmcgLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRIZWFkZXIgcCBrIHYgPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZUhlYWRlcnMgPSBNYXAuaW5zZXJ0IGsgdiAkIHdyaXRlSGVhZGVycyB0IH0KKworc2V0SGVhZGVycyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSGVhZGVycyAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldEhlYWRlcnMgcCBoID0gdXBkYXRlVHJhbnNwb3J0IHAgJCBcdCAtPiB0IHsgd3JpdGVIZWFkZXJzID0gaCB9CisKKy0tIFRPRE86IG1ha2UgaXQgcHVibGljIG9uY2Ugd2UgaGF2ZSBmaXJzdCB0cmFuc2Zvcm0gaW1wbGVtZW50YXRpb24gZm9yIEhhc2tlbGwKK3NldFRyYW5zZm9ybXMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFtUcmFuc2Zvcm1UeXBlXSAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldFRyYW5zZm9ybXMgcCB0cnMgPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZVRyYW5zZm9ybXMgPSB0cnMgfQorCitzZXRUcmFuc2Zvcm0gOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFRyYW5zZm9ybVR5cGUgLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRUcmFuc2Zvcm0gcCB0ciA9IHVwZGF0ZVRyYW5zcG9ydCBwICQgXHQgLT4gdCB7IHdyaXRlVHJhbnNmb3JtcyA9IHRyOih3cml0ZVRyYW5zZm9ybXMgdCkgfQorCitnZXRXcml0ZUhlYWRlcnMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IEhlYWRlcnMKK2dldFdyaXRlSGVhZGVycyA9IHdyaXRlSGVhZGVycyAuIHRyYW5zCisKK2dldEhlYWRlcnMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IElPIFsoU3RyaW5nLCBTdHJpbmcpXQorZ2V0SGVhZGVycyA9IHJlYWRJT1JlZiAuIGhlYWRlcnMgLiB0cmFucworCitnZXRQcm90b2NvbFR5cGUgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IElPIFByb3RvY29sVHlwZQorZ2V0UHJvdG9jb2xUeXBlIHAgPSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgJCB0cmFucyBwCisKK3NldFByb3RvY29sVHlwZSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gUHJvdG9jb2xUeXBlIC0+IElPICgpCitzZXRQcm90b2NvbFR5cGUgcCB0eXAgPSBkbworICB0eXAwIDwtIGdldFByb3RvY29sVHlwZSBwCisgIGlmIHR5cCA9PSB0eXAwCisgICAgdGhlbiByZXR1cm4gKCkKKyAgICBlbHNlIGRvCisgICAgICB0U2V0UHJvdG9jb2wgKHRyYW5zIHApIHR5cAorICAgICAgcmVzZXRQcm90b2NvbCBwCisKK2luc3RhbmNlIChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IFByb3RvY29sIChIZWFkZXJQcm90b2NvbCBpIG8pIHdoZXJlCisgIHJlYWRCeXRlIHAgPSB0UmVhZEFsbCAodHJhbnMgcCkgMQorCisgIHJlYWRWYWwgcCB0cCA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgcmVhZFZhbCBwcm90byB0cAorCisgIHJlYWRNZXNzYWdlIHAgZiA9IGRvCisgICAgdFJlc2V0UHJvdG9jb2wgKHRyYW5zIHApCisgICAgcmVzZXRQcm90b2NvbCBwCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgcmVhZE1lc3NhZ2UgcHJvdG8gZgorCisgIHdyaXRlVmFsIHAgdiA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgd3JpdGVWYWwgcHJvdG8gdgorCisgIHdyaXRlTWVzc2FnZSBwIHggZiA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgd3JpdGVNZXNzYWdlIHByb3RvIHggZgorCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSlNPTi5ocwppbmRleCBmMzc4ZWEyLi44MzllZGRjIDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0pTT04uaHMKQEAgLTI5LDEwICsyOSwxMiBAQAogICAgICkgd2hlcmUKIAogaW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKK2ltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoYnJhY2tldCkKIGltcG9ydCBDb250cm9sLk1vbmFkCiBpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAogaW1wb3J0IERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nLkNoYXI4IGFzIFBDCiBpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuTGF6eSBhcyBMUAoraW1wb3J0IERhdGEuQnl0ZVN0cmluZy5CYXNlNjQuTGF6eSBhcyBCNjRDCiBpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQnVpbGRlciBhcyBCCiBpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkludGVybmFsIChjMncsIHcyYykKIGltcG9ydCBEYXRhLkZ1bmN0b3IKQEAgLTQ5LDQ0ICs1MSw1NSBAQAogaW1wb3J0IFRocmlmdC5UeXBlcwogCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5DaGFyOCBhcyBMQlNDCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5IGFzIExUCiAKLS0tIHwgVGhlIEpTT04gUHJvdG9jb2wgZGF0YSB1c2VzIHRoZSBzdGFuZGFyZCAnVFNpbXBsZUpTT05Qcm90b2NvbCcuICBEYXRhIGlzCistLSB8IFRoZSBKU09OIFByb3RvY29sIGRhdGEgdXNlcyB0aGUgc3RhbmRhcmQgJ1RKU09OUHJvdG9jb2wnLiAgRGF0YSBpcwogLS0gZW5jb2RlZCBhcyBhIEpTT04gJ0J5dGVTdHJpbmcnCiBkYXRhIEpTT05Qcm90b2NvbCB0ID0gSlNPTlByb3RvY29sIHQKICAgICAgICAgICAgICAgICAgICAgICAtLSBeIENvbnN0cnVjdCBhICdKU09OUHJvdG9jb2wnIHdpdGggYSAnVHJhbnNwb3J0JworZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IEpTT05Qcm90b2NvbCB0IC0+IHQKK2dldFRyYW5zcG9ydCAoSlNPTlByb3RvY29sIHQpID0gdAogCi1pbnN0YW5jZSBQcm90b2NvbCBKU09OUHJvdG9jb2wgd2hlcmUKLSAgICBnZXRUcmFuc3BvcnQgKEpTT05Qcm90b2NvbCB0KSA9IHQKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFByb3RvY29sIChKU09OUHJvdG9jb2wgdCkgd2hlcmUKKyAgICByZWFkQnl0ZSBwID0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCiAKLSAgICB3cml0ZU1lc3NhZ2VCZWdpbiAoSlNPTlByb3RvY29sIHQpIChzLCB0eSwgc3EpID0gdFdyaXRlIHQgJCB0b0xhenlCeXRlU3RyaW5nICQKLSAgICAgIEIuY2hhcjggJ1snIDw+IGJ1aWxkU2hvd2FibGUgKDEgOjogSW50MzIpIDw+Ci0gICAgICBCLnN0cmluZzggIixcIiIgPD4gZXNjYXBlIChlbmNvZGVVdGY4IHMpIDw+IEIuY2hhcjggJ1wiJyA8PgotICAgICAgQi5jaGFyOCAnLCcgPD4gYnVpbGRTaG93YWJsZSAoZnJvbUVudW0gdHkpIDw+Ci0gICAgICBCLmNoYXI4ICcsJyA8PiBidWlsZFNob3dhYmxlIHNxIDw+Ci0gICAgICBCLmNoYXI4ICcsJwotICAgIHdyaXRlTWVzc2FnZUVuZCAoSlNPTlByb3RvY29sIHQpID0gdFdyaXRlIHQgIl0iCi0gICAgcmVhZE1lc3NhZ2VCZWdpbiBwID0gcnVuUGFyc2VyIHAgJCBza2lwU3BhY2UgKj4gZG8KLSAgICAgIF92ZXIgOjogSW50MzIgPC0gbGV4ZW1lIChQQy5jaGFyOCAnWycpICo+IGxleGVtZSAoc2lnbmVkIGRlY2ltYWwpCi0gICAgICBicyA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIGVzY2FwZWRTdHJpbmcKLSAgICAgIGNhc2UgZGVjb2RlVXRmOCcgYnMgb2YKLSAgICAgICAgTGVmdCBfIC0+IGZhaWwgInJlYWRNZXNzYWdlOiBpbnZhbGlkIHRleHQgZW5jb2RpbmciCi0gICAgICAgIFJpZ2h0IHN0ciAtPiBkbwotICAgICAgICAgIHR5IDwtIHRvRW51bSA8JD4gKGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgKHNpZ25lZCBkZWNpbWFsKSkKLSAgICAgICAgICBzZXFOdW0gPC0gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSAoc2lnbmVkIGRlY2ltYWwpCi0gICAgICAgICAgXyA8LSBQQy5jaGFyOCAnLCcKLSAgICAgICAgICByZXR1cm4gKHN0ciwgdHksIHNlcU51bSkKLSAgICByZWFkTWVzc2FnZUVuZCBwID0gdm9pZCAkIHJ1blBhcnNlciBwIChQQy5jaGFyOCAnXScpCisgICAgd3JpdGVNZXNzYWdlIChKU09OUHJvdG9jb2wgdCkgKHMsIHR5LCBzcSkgPSBicmFja2V0IHJlYWRNZXNzYWdlQmVnaW4gcmVhZE1lc3NhZ2VFbmQgLiBjb25zdAorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiA9IHRXcml0ZSB0ICQgdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgQi5jaGFyOCAnWycgPD4gYnVpbGRTaG93YWJsZSAoMSA6OiBJbnQzMikgPD4KKyAgICAgICAgICBCLnN0cmluZzggIixcIiIgPD4gZXNjYXBlIChlbmNvZGVVdGY4IHMpIDw+IEIuY2hhcjggJ1wiJyA8PgorICAgICAgICAgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgKGZyb21FbnVtIHR5KSA8PgorICAgICAgICAgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgc3EgPD4KKyAgICAgICAgICBCLmNoYXI4ICcsJworICAgICAgICByZWFkTWVzc2FnZUVuZCBfID0gZG8KKyAgICAgICAgICB0V3JpdGUgdCAiXSIKKyAgICAgICAgICB0Rmx1c2ggdAogCisgICAgcmVhZE1lc3NhZ2UgcCA9IGJyYWNrZXQgcmVhZE1lc3NhZ2VCZWdpbiByZWFkTWVzc2FnZUVuZAorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiA9IHJ1blBhcnNlciBwICQgc2tpcFNwYWNlICo+IGRvCisgICAgICAgICAgX3ZlciA6OiBJbnQzMiA8LSBsZXhlbWUgKFBDLmNoYXI4ICdbJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKKyAgICAgICAgICBicyA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIGVzY2FwZWRTdHJpbmcKKyAgICAgICAgICBjYXNlIGRlY29kZVV0ZjgnIGJzIG9mCisgICAgICAgICAgICBMZWZ0IF8gLT4gZmFpbCAicmVhZE1lc3NhZ2U6IGludmFsaWQgdGV4dCBlbmNvZGluZyIKKyAgICAgICAgICAgIFJpZ2h0IHN0ciAtPiBkbworICAgICAgICAgICAgICB0eSA8LSB0b0VudW0gPCQ+IChsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkpCisgICAgICAgICAgICAgIHNlcU51bSA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKKyAgICAgICAgICAgICAgXyA8LSBQQy5jaGFyOCAnLCcKKyAgICAgICAgICAgICAgcmV0dXJuIChzdHIsIHR5LCBzZXFOdW0pCisgICAgICAgIHJlYWRNZXNzYWdlRW5kIF8gPSB2b2lkICQgcnVuUGFyc2VyIHAgKFBDLmNoYXI4ICddJykKKworICAgIHdyaXRlVmFsIHAgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAuIHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEpTT05WYWx1ZQorICAgIHJlYWRWYWwgcCB0eSA9IHJ1blBhcnNlciBwICQgc2tpcFNwYWNlICo+IHBhcnNlSlNPTlZhbHVlIHR5CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFN0YXRlbGVzc1Byb3RvY29sIChKU09OUHJvdG9jb2wgdCkgd2hlcmUKICAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEpTT05WYWx1ZQogICAgIGRlc2VyaWFsaXplVmFsIF8gdHkgYnMgPQogICAgICAgY2FzZSBMUC5laXRoZXJSZXN1bHQgJCBMUC5wYXJzZSAocGFyc2VKU09OVmFsdWUgdHkpIGJzIG9mCiAgICAgICAgIExlZnQgcyAtPiBlcnJvciBzCiAgICAgICAgIFJpZ2h0IHZhbCAtPiB2YWwKIAotICAgIHJlYWRWYWwgcCB0eSA9IHJ1blBhcnNlciBwICQgc2tpcFNwYWNlICo+IHBhcnNlSlNPTlZhbHVlIHR5Ci0KLQogLS0gV3JpdGluZyBGdW5jdGlvbnMKIAogYnVpbGRKU09OVmFsdWUgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKQEAgLTEwNSwxMyArMTE4LDE0IEBACiAgICBlbHNlIG1lbXB0eSkgPD4KICAgQi5jaGFyOCAnXScKIGJ1aWxkSlNPTlZhbHVlIChUU2V0IHR5IGVudHJpZXMpID0gYnVpbGRKU09OVmFsdWUgKFRMaXN0IHR5IGVudHJpZXMpCi1idWlsZEpTT05WYWx1ZSAoVEJvb2wgYikgPSBpZiBiIHRoZW4gQi5zdHJpbmc4ICJ0cnVlIiBlbHNlIEIuc3RyaW5nOCAiZmFsc2UiCitidWlsZEpTT05WYWx1ZSAoVEJvb2wgYikgPSBpZiBiIHRoZW4gQi5jaGFyOCAnMScgZWxzZSBCLmNoYXI4ICcwJwogYnVpbGRKU09OVmFsdWUgKFRCeXRlIGIpID0gYnVpbGRTaG93YWJsZSBiCiBidWlsZEpTT05WYWx1ZSAoVEkxNiBpKSA9IGJ1aWxkU2hvd2FibGUgaQogYnVpbGRKU09OVmFsdWUgKFRJMzIgaSkgPSBidWlsZFNob3dhYmxlIGkKIGJ1aWxkSlNPTlZhbHVlIChUSTY0IGkpID0gYnVpbGRTaG93YWJsZSBpCiBidWlsZEpTT05WYWx1ZSAoVERvdWJsZSBkKSA9IGJ1aWxkU2hvd2FibGUgZAogYnVpbGRKU09OVmFsdWUgKFRTdHJpbmcgcykgPSBCLmNoYXI4ICdcIicgPD4gZXNjYXBlIHMgPD4gQi5jaGFyOCAnXCInCitidWlsZEpTT05WYWx1ZSAoVEJpbmFyeSBzKSA9IEIuY2hhcjggJ1wiJyA8PiAoQi5sYXp5Qnl0ZVN0cmluZyAuIEI2NEMuZW5jb2RlICQgcykgPD4gQi5jaGFyOCAnXCInCiAKIGJ1aWxkSlNPTlN0cnVjdCA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSAtPiBCdWlsZGVyCiBidWlsZEpTT05TdHJ1Y3QgPSBtY29uY2F0IC4gaW50ZXJzcGVyc2UgKEIuY2hhcjggJywnKSAuIE1hcC5mb2xkcldpdGhLZXkgYnVpbGRGaWVsZCBbXQpAQCAtMTQ5LDIyICsxNjMsMjUgQEAKICAgICBiZXR3ZWVuICd7JyAnfScgKHBhcnNlSlNPTk1hcCBrdCB2dCkKIHBhcnNlSlNPTlZhbHVlIChUX0xJU1QgdHkpID0gZm1hcCAoVExpc3QgdHkpICQKICAgYmV0d2VlbiAnWycgJ10nICQgZG8KLSAgICBsZW4gPC0gbGV4ZW1lIGVzY2FwZWRTdHJpbmcgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+Ci0gICAgICAgICAgIGxleGVtZSBkZWNpbWFsIDwqIGxleGVtZSAoUEMuY2hhcjggJywnKQotICAgIGlmIGxlbiA+IDAgdGhlbiBwYXJzZUpTT05MaXN0IHR5IGVsc2UgcmV0dXJuIFtdCisgICAgbGVuIDwtIGxleGVtZSBlc2NhcGVkU3RyaW5nICo+IGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgZGVjaW1hbAorICAgIGlmIGxlbiA+IDAKKyAgICAgIHRoZW4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IHBhcnNlSlNPTkxpc3QgdHkKKyAgICAgIGVsc2UgcmV0dXJuIFtdCiBwYXJzZUpTT05WYWx1ZSAoVF9TRVQgdHkpID0gZm1hcCAoVFNldCB0eSkgJAogICBiZXR3ZWVuICdbJyAnXScgJCBkbwotICAgIGxlbiA8LSBsZXhlbWUgZXNjYXBlZFN0cmluZyAqPiBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4KLSAgICAgICAgICAgbGV4ZW1lIGRlY2ltYWwgPCogbGV4ZW1lIChQQy5jaGFyOCAnLCcpCi0gICAgaWYgbGVuID4gMCB0aGVuIHBhcnNlSlNPTkxpc3QgdHkgZWxzZSByZXR1cm4gW10KKyAgICBsZW4gPC0gbGV4ZW1lIGVzY2FwZWRTdHJpbmcgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSBkZWNpbWFsCisgICAgaWYgbGVuID4gMAorICAgICAgdGhlbiAgbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IHBhcnNlSlNPTkxpc3QgdHkKKyAgICAgIGVsc2UgcmV0dXJuIFtdCiBwYXJzZUpTT05WYWx1ZSBUX0JPT0wgPQotICAoVEJvb2wgVHJ1ZSA8JCBzdHJpbmcgInRydWUiKSA8fD4gKFRCb29sIEZhbHNlIDwkIHN0cmluZyAiZmFsc2UiKQorICAoVEJvb2wgVHJ1ZSA8JCBQQy5jaGFyOCAnMScpIDx8PiAoVEJvb2wgRmFsc2UgPCQgUEMuY2hhcjggJzAnKQogcGFyc2VKU09OVmFsdWUgVF9CWVRFID0gVEJ5dGUgPCQ+IHNpZ25lZCBkZWNpbWFsCiBwYXJzZUpTT05WYWx1ZSBUX0kxNiA9IFRJMTYgPCQ+IHNpZ25lZCBkZWNpbWFsCiBwYXJzZUpTT05WYWx1ZSBUX0kzMiA9IFRJMzIgPCQ+IHNpZ25lZCBkZWNpbWFsCiBwYXJzZUpTT05WYWx1ZSBUX0k2NCA9IFRJNjQgPCQ+IHNpZ25lZCBkZWNpbWFsCiBwYXJzZUpTT05WYWx1ZSBUX0RPVUJMRSA9IFREb3VibGUgPCQ+IGRvdWJsZQogcGFyc2VKU09OVmFsdWUgVF9TVFJJTkcgPSBUU3RyaW5nIDwkPiBlc2NhcGVkU3RyaW5nCitwYXJzZUpTT05WYWx1ZSBUX0JJTkFSWSA9IFRCaW5hcnkgPCQ+IGJhc2U2NFN0cmluZwogcGFyc2VKU09OVmFsdWUgVF9TVE9QID0gZmFpbCAicGFyc2VKU09OVmFsdWU6IGNhbm5vdCBwYXJzZSB0eXBlIFRfU1RPUCIKIHBhcnNlSlNPTlZhbHVlIFRfVk9JRCA9IGZhaWwgInBhcnNlSlNPTlZhbHVlOiBjYW5ub3QgcGFyc2UgdHlwZSBUX1ZPSUQiCiAKQEAgLTE3OSw2ICsxOTYsNyBAQAogICAgICAgICAgICAgICAgICAgLCBUX0k2NAogICAgICAgICAgICAgICAgICAgLCBUX0RPVUJMRQogICAgICAgICAgICAgICAgICAgLCBUX1NUUklORworICAgICAgICAgICAgICAgICAgLCBUX0JJTkFSWQogICAgICAgICAgICAgICAgICAgXQogICB3aGVyZQogICAgIHNraXBCZXR3ZWVuIDo6IENoYXIgLT4gQ2hhciAtPiBQYXJzZXIgKCkKQEAgLTIwMCw5ICsyMTgsMTMgQEAKIAogcGFyc2VKU09OTWFwIDo6IFRocmlmdFR5cGUgLT4gVGhyaWZ0VHlwZSAtPiBQYXJzZXIgWyhUaHJpZnRWYWwsIFRocmlmdFZhbCldCiBwYXJzZUpTT05NYXAga3QgdnQgPQotICAoKCwpIDwkPiBsZXhlbWUgKFBDLmNoYXI4ICciJyAqPiBwYXJzZUpTT05WYWx1ZSBrdCA8KiBQQy5jaGFyOCAnIicpIDwqPgorICAoKCwpIDwkPiBsZXhlbWUgKHBhcnNlSlNPTktleSBrdCkgPCo+CiAgICAobGV4ZW1lIChQQy5jaGFyOCAnOicpICo+IGxleGVtZSAocGFyc2VKU09OVmFsdWUgdnQpKSkgYHNlcEJ5YAogICBsZXhlbWUgKFBDLmNoYXI4ICcsJykKKyAgd2hlcmUKKyAgICBwYXJzZUpTT05LZXkgVF9TVFJJTkcgPSBwYXJzZUpTT05WYWx1ZSBUX1NUUklORworICAgIHBhcnNlSlNPTktleSBUX0JJTkFSWSA9IHBhcnNlSlNPTlZhbHVlIFRfQklOQVJZCisgICAgcGFyc2VKU09OS2V5IGt0ID0gUEMuY2hhcjggJyInICo+IHBhcnNlSlNPTlZhbHVlIGt0IDwqIFBDLmNoYXI4ICciJwogCiBwYXJzZUpTT05MaXN0IDo6IFRocmlmdFR5cGUgLT4gUGFyc2VyIFtUaHJpZnRWYWxdCiBwYXJzZUpTT05MaXN0IHR5ID0gbGV4ZW1lIChwYXJzZUpTT05WYWx1ZSB0eSkgYHNlcEJ5YCBsZXhlbWUgKFBDLmNoYXI4ICcsJykKQEAgLTIxMiw2ICsyMzQsMjAgQEAKICAgICAgICAgICAgICAgICAoTEJTLnBhY2sgPCQ+IFAubWFueScgKGVzY2FwZWRDaGFyIDx8PiBub3RDaGFyOCAnIicpKSA8KgogICAgICAgICAgICAgICAgIFBDLmNoYXI4ICciJwogCitiYXNlNjRTdHJpbmcgOjogUGFyc2VyIExCUy5CeXRlU3RyaW5nCitiYXNlNjRTdHJpbmcgPSBQQy5jaGFyOCAnIicgKj4KKyAgICAgICAgICAgICAgIChkZWNvZGVCYXNlNjQgLiBMQlNDLnBhY2sgPCQ+IFAubWFueScgKFBDLm5vdENoYXIgJyInKSkgPCoKKyAgICAgICAgICAgICAgIFBDLmNoYXI4ICciJworICAgICAgICAgICAgICAgd2hlcmUKKyAgICAgICAgICAgICAgICAgZGVjb2RlQmFzZTY0IGIgPQorICAgICAgICAgICAgICAgICAgIGxldCBwYWRkZWQgPSBjYXNlIChMQlMubGVuZ3RoIGIpIGBtb2RgIDQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0+IExCUy5hcHBlbmQgYiAiPT0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAtPiBMQlMuYXBwZW5kIGIgIj0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyAtPiBiIGluCisgICAgICAgICAgICAgICAgICAgY2FzZSBCNjRDLmRlY29kZSBwYWRkZWQgb2YKKyAgICAgICAgICAgICAgICAgICAgIFJpZ2h0IHMgLT4gcworICAgICAgICAgICAgICAgICAgICAgTGVmdCB4IC0+IGVycm9yIHgKKwogZXNjYXBlZENoYXIgOjogUGFyc2VyIFdvcmQ4CiBlc2NhcGVkQ2hhciA9IFBDLmNoYXI4ICdcXCcgKj4gKGMydyA8JD4gY2hvaWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgJ1xTT0gnIDwkIFAuc3RyaW5nICJ1MDAwMSIKQEAgLTMyMSw1ICszNTcsNiBAQAogICBUX0k2NCAgICAgIC0+ICJpNjQiCiAgIFRfRE9VQkxFICAgLT4gImRibCIKICAgVF9TVFJJTkcgICAtPiAic3RyIgorICBUX0JJTkFSWSAgIC0+ICJzdHIiCiAgIF8gLT4gZXJyb3IgIlVucmVjb2duaXplZCBUeXBlIgogCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9TZXJ2ZXIuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9TZXJ2ZXIuaHMKaW5kZXggZWQ3NGNlYi4uNTQzZjMzOCAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvU2VydmVyLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1NlcnZlci5ocwpAQCAtMzgsMTAgKzM4LDEwIEBACiAKIC0tIHwgQSB0aHJlYWRlZCBzZXZlciB0aGF0IGlzIGNhcGFibGUgb2YgdXNpbmcgYW55IFRyYW5zcG9ydCBvciBQcm90b2NvbAogLS0gaW5zdGFuY2VzLgotcnVuVGhyZWFkZWRTZXJ2ZXIgOjogKFRyYW5zcG9ydCB0LCBQcm90b2NvbCBpLCBQcm90b2NvbCBvKQotICAgICAgICAgICAgICAgICAgPT4gKFNvY2tldCAtPiBJTyAoaSB0LCBvIHQpKQorcnVuVGhyZWFkZWRTZXJ2ZXIgOjogKFByb3RvY29sIGksIFByb3RvY29sIG8pCisgICAgICAgICAgICAgICAgICA9PiAoU29ja2V0IC0+IElPIChpLCBvKSkKICAgICAgICAgICAgICAgICAgIC0+IGgKLSAgICAgICAgICAgICAgICAgIC0+IChoIC0+IChpIHQsIG8gdCkgLT4gSU8gQm9vbCkKKyAgICAgICAgICAgICAgICAgIC0+IChoIC0+IChpLCBvKSAtPiBJTyBCb29sKQogICAgICAgICAgICAgICAgICAgLT4gUG9ydElECiAgICAgICAgICAgICAgICAgICAtPiBJTyBhCiBydW5UaHJlYWRlZFNlcnZlciBhY2NlcHRlciBoYW5kIHByb2NfIHBvcnQgPSBkbwpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMKaW5kZXggYjdkMTZlNC4uZmY2Mjk1YiAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzCkBAIC00NCw3ICs0NCwxMyBAQAogaW5zdGFuY2UgVHJhbnNwb3J0IEhhbmRsZSB3aGVyZQogICAgIHRJc09wZW4gPSBoSXNPcGVuCiAgICAgdENsb3NlID0gaENsb3NlCi0gICAgdFJlYWQgaCBuID0gTEJTLmhHZXQgaCBuIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgaGFuZGxlRU9GIG1lbXB0eQorICAgIHRSZWFkIGggbiA9IHJlYWQgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCBoYW5kbGVFT0YgbWVtcHR5CisgICAgICB3aGVyZQorICAgICAgICByZWFkID0gZG8KKyAgICAgICAgICBoTG9va0FoZWFkIGgKKyAgICAgICAgICBMQlMuaEdldE5vbkJsb2NraW5nIGggbgorICAgIHRSZWFkQWxsIF8gMCA9IHJldHVybiBtZW1wdHkKKyAgICB0UmVhZEFsbCBoIG4gPSBMQlMuaEdldCBoIG4gYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCB0aHJvd1RyYW5zcG9ydEV4bgogICAgIHRQZWVrIGggPSAoSnVzdCAuIGMydyA8JD4gaExvb2tBaGVhZCBoKSBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIGhhbmRsZUVPRiBOb3RoaW5nCiAgICAgdFdyaXRlID0gTEJTLmhQdXQKICAgICB0Rmx1c2ggPSBoRmx1c2gKQEAgLTYxLDggKzY3LDEyIEBACiBpbnN0YW5jZSBIYW5kbGVTb3VyY2UgKEhvc3ROYW1lLCBQb3J0SUQpIHdoZXJlCiAgICAgaE9wZW4gPSB1bmN1cnJ5IGNvbm5lY3RUbwogCit0aHJvd1RyYW5zcG9ydEV4biA6OiBJT0Vycm9yIC0+IElPIGEKK3Rocm93VHJhbnNwb3J0RXhuIGUgPSBpZiBpc0VPRkVycm9yIGUKKyAgICB0aGVuIHRocm93ICQgVHJhbnNwb3J0RXhuICJDYW5ub3QgcmVhZC4gUmVtb3RlIHNpZGUgaGFzIGNsb3NlZC4iIFRFX1VOS05PV04KKyAgICBlbHNlIHRocm93ICQgVHJhbnNwb3J0RXhuICJIYW5kbGUgdFJlYWRBbGw6IENvdWxkIG5vdCByZWFkIiBURV9VTktOT1dOCiAKIGhhbmRsZUVPRiA6OiBhIC0+IElPRXJyb3IgLT4gSU8gYQogaGFuZGxlRU9GIGEgZSA9IGlmIGlzRU9GRXJyb3IgZQogICAgIHRoZW4gcmV0dXJuIGEKLSAgICBlbHNlIHRocm93ICQgVHJhbnNwb3J0RXhuICJUQ2hhbm5lbFRyYW5zcG9ydDogQ291bGQgbm90IHJlYWQiIFRFX1VOS05PV04KKyAgICBlbHNlIHRocm93ICQgVHJhbnNwb3J0RXhuICJIYW5kbGU6IENvdWxkIG5vdCByZWFkIiBURV9VTktOT1dOCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGVhZGVyLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hlYWRlci5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGFjYWQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hlYWRlci5ocwpAQCAtMCwwICsxLDM1NCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBUaHJpZnQuVHJhbnNwb3J0LkhlYWRlcgorICAoIG1vZHVsZSBUaHJpZnQuVHJhbnNwb3J0CisgICwgSGVhZGVyVHJhbnNwb3J0KC4uKQorICAsIG9wZW5IZWFkZXJUcmFuc3BvcnQKKyAgLCBQcm90b2NvbFR5cGUoLi4pCisgICwgVHJhbnNmb3JtVHlwZSguLikKKyAgLCBDbGllbnRUeXBlKC4uKQorICAsIHRSZXNldFByb3RvY29sCisgICwgdFNldFByb3RvY29sCisgICkgd2hlcmUKKworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKK2ltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIHRocm93ICkKK2ltcG9ydCBDb250cm9sLk1vbmFkCitpbXBvcnQgRGF0YS5CaXRzCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgRGF0YS5Nb25vaWQKK2ltcG9ydCBEYXRhLldvcmQKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZyBhcyBQCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQmluYXJ5IGFzIEJpbmFyeQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcgYXMgQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkNoYXI4IGFzIEMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkJ1aWxkZXIgYXMgQgoraW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXAKKworZGF0YSBQcm90b2NvbFR5cGUgPSBUQmluYXJ5IHwgVENvbXBhY3QgfCBUSlNPTiBkZXJpdmluZyAoRW51bSwgRXEpCitkYXRhIENsaWVudFR5cGUgPSBIZWFkZXJDbGllbnQgfCBGcmFtZWQgfCBVbmZyYW1lZCBkZXJpdmluZyAoRW51bSwgRXEpCisKK2luZm9JZEtleVZhbHVlID0gMQorCit0eXBlIEhlYWRlcnMgPSBNYXAuTWFwIFN0cmluZyBTdHJpbmcKKworZGF0YSBUcmFuc2Zvcm1UeXBlID0gWmxpYlRyYW5zZm9ybSBkZXJpdmluZyAoRW51bSwgRXEpCisKK2Zyb21UcmFuc3BvcnRUeXBlIDo6IFRyYW5zZm9ybVR5cGUgLT4gSW50MTYKK2Zyb21UcmFuc3BvcnRUeXBlIFpsaWJUcmFuc2Zvcm0gPSAxCisKK3RvVHJhbnNwb3J0VHlwZSA6OiBJbnQxNiAtPiBUcmFuc2Zvcm1UeXBlCit0b1RyYW5zcG9ydFR5cGUgMSA9IFpsaWJUcmFuc2Zvcm0KK3RvVHJhbnNwb3J0VHlwZSBfID0gIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IFVua25vd24gdHJhbnNmb3JtIElEIiBURV9VTktOT1dOCisKK2RhdGEgSGVhZGVyVHJhbnNwb3J0IGkgbyA9IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclRyYW5zcG9ydAorICAgIHsgcmVhZEJ1ZmZlciA6OiBJT1JlZiBMQlMuQnl0ZVN0cmluZworICAgICwgd3JpdGVCdWZmZXIgOjogSU9SZWYgQi5CdWlsZGVyCisgICAgLCBpblRyYW5zIDo6IGkKKyAgICAsIG91dFRyYW5zIDo6IG8KKyAgICAsIGNsaWVudFR5cGUgOjogSU9SZWYgQ2xpZW50VHlwZQorICAgICwgcHJvdG9jb2xUeXBlIDo6IElPUmVmIFByb3RvY29sVHlwZQorICAgICwgaGVhZGVycyA6OiBJT1JlZiBbKFN0cmluZywgU3RyaW5nKV0KKyAgICAsIHdyaXRlSGVhZGVycyA6OiBIZWFkZXJzCisgICAgLCB0cmFuc2Zvcm1zIDo6IElPUmVmIFtUcmFuc2Zvcm1UeXBlXQorICAgICwgd3JpdGVUcmFuc2Zvcm1zIDo6IFtUcmFuc2Zvcm1UeXBlXQorICAgIH0KKworb3BlbkhlYWRlclRyYW5zcG9ydCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBpIC0+IG8gLT4gSU8gKEhlYWRlclRyYW5zcG9ydCBpIG8pCitvcGVuSGVhZGVyVHJhbnNwb3J0IGkgbyA9IGRvCisgIHBpZCA8LSBuZXdJT1JlZiBUQ29tcGFjdAorICByQnVmIDwtIG5ld0lPUmVmIExCUy5lbXB0eQorICB3QnVmIDwtIG5ld0lPUmVmIG1lbXB0eQorICBjVHlwZSA8LSBuZXdJT1JlZiBIZWFkZXJDbGllbnQKKyAgaCA8LSBuZXdJT1JlZiBbXQorICB0cmFucyA8LSBuZXdJT1JlZiBbXQorICByZXR1cm4gSGVhZGVyVHJhbnNwb3J0CisgICAgICB7IHJlYWRCdWZmZXIgPSByQnVmCisgICAgICAsIHdyaXRlQnVmZmVyID0gd0J1ZgorICAgICAgLCBpblRyYW5zID0gaQorICAgICAgLCBvdXRUcmFucyA9IG8KKyAgICAgICwgY2xpZW50VHlwZSA9IGNUeXBlCisgICAgICAsIHByb3RvY29sVHlwZSA9IHBpZAorICAgICAgLCBoZWFkZXJzID0gaAorICAgICAgLCB3cml0ZUhlYWRlcnMgPSBNYXAuZW1wdHkKKyAgICAgICwgdHJhbnNmb3JtcyA9IHRyYW5zCisgICAgICAsIHdyaXRlVHJhbnNmb3JtcyA9IFtdCisgICAgICB9CisKK2lzRnJhbWVkIHQgPSAoLz0gVW5mcmFtZWQpIDwkPiByZWFkSU9SZWYgKGNsaWVudFR5cGUgdCkKKworcmVhZEZyYW1lIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSU8gQm9vbAorcmVhZEZyYW1lIHQgPSBkbworICBsZXQgaW5wdXQgPSBpblRyYW5zIHQKKyAgbGV0IHJCdWYgPSByZWFkQnVmZmVyIHQKKyAgbGV0IGNUeXBlID0gY2xpZW50VHlwZSB0CisgIGxzeiA8LSB0UmVhZCBpbnB1dCA0CisgIGxldCBzeiA9IExCUy50b1N0cmljdCBsc3oKKyAgY2FzZSBQLnBhcnNlT25seSBQLmVuZE9mSW5wdXQgc3ogb2YKKyAgICBSaWdodCBfIC0+IGRvIHJldHVybiBGYWxzZQorICAgIExlZnQgXyAtPiBkbworICAgICAgY2FzZSBwYXJzZUJpbmFyeU1hZ2ljIHN6IG9mCisgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgJCBsc3oKKyAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIFVuZnJhbWVkCisgICAgICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIFRCaW5hcnkKKyAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgICBjYXNlIHBhcnNlQ29tcGFjdE1hZ2ljIHN6IG9mCisgICAgICAgICAgICBSaWdodCBfIC0+IGRvCisgICAgICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiAkIGxzegorICAgICAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIFVuZnJhbWVkCisgICAgICAgICAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBUQ29tcGFjdAorICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgICAgICAgIGxldCBsZW4gPSBCaW5hcnkuZGVjb2RlIGxzeiA6OiBJbnQzMgorICAgICAgICAgICAgICBsYnVmIDwtIHRSZWFkQWxsIGlucHV0ICQgZnJvbUludGVncmFsIGxlbgorICAgICAgICAgICAgICBsZXQgYnVmID0gTEJTLnRvU3RyaWN0IGxidWYKKyAgICAgICAgICAgICAgY2FzZSBwYXJzZUJpbmFyeU1hZ2ljIGJ1ZiBvZgorICAgICAgICAgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgRnJhbWVkCisgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgVEJpbmFyeQorICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiByQnVmIGxidWYKKyAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgICAgICAgICAgICBjYXNlIHBhcnNlQ29tcGFjdE1hZ2ljIGJ1ZiBvZgorICAgICAgICAgICAgICAgICAgICBSaWdodCBfIC0+IGRvCisgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBGcmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgVENvbXBhY3QKKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgbGJ1ZgorICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgIExlZnQgXyAtPiBkbworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcGFyc2VIZWFkZXJNYWdpYyBidWYgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0IGZsYWdzIC0+IGRvCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCAoZmxhZ3MsIHNlcU51bSwgaGVhZGVyLCBib2R5KSA9IGV4dHJhY3RIZWFkZXIgYnVmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgSGVhZGVyQ2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUhlYWRlciB0IGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkIDwtIHVudHJhbnNmb3JtIHQgYm9keQorICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgJCBMQlMuZnJvbVN0cmljdCAkIHBheWxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIExlZnQgXyAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiB1bmtvbnduIGNsaWVudCB0eXBlIiBURV9VTktOT1dOCisKK3BhcnNlQmluYXJ5TWFnaWMgPSBQLnBhcnNlT25seSAkIFAud29yZDggMHg4MCAqPiBQLndvcmQ4IDB4MDEgKj4gUC53b3JkOCAweDAwICo+IFAuYW55V29yZDgKK3BhcnNlQ29tcGFjdE1hZ2ljID0gUC5wYXJzZU9ubHkgJCBQLndvcmQ4IDB4ODIgKj4gUC5zYXRpc2Z5IChcYiAtPiBiIC4mLiAweDFmID09IDB4MDEpCitwYXJzZUhlYWRlck1hZ2ljID0gUC5wYXJzZU9ubHkgJCBQLndvcmQ4IDB4MGYgKj4gUC53b3JkOCAweGZmICo+IChQLmNvdW50IDIgUC5hbnlXb3JkOCkKKworcGFyc2VJMzIgOjogUC5QYXJzZXIgSW50MzIKK3BhcnNlSTMyID0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgNAorcGFyc2VJMTYgOjogUC5QYXJzZXIgSW50MTYKK3BhcnNlSTE2ID0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgMgorCitleHRyYWN0SGVhZGVyIDo6IEJTLkJ5dGVTdHJpbmcgLT4gKEludDE2LCBJbnQzMiwgQlMuQnl0ZVN0cmluZywgQlMuQnl0ZVN0cmluZykKK2V4dHJhY3RIZWFkZXIgYnMgPQorICBjYXNlIFAucGFyc2UgZXh0cmFjdEhlYWRlcl8gYnMgb2YKKyAgICBQLkRvbmUgcmVtYWluIChmbGFncywgc2VxTnVtLCBoZWFkZXIpIC0+IChmbGFncywgc2VxTnVtLCBoZWFkZXIsIHJlbWFpbikKKyAgICBfIC0+IHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IEludmFsaWQgaGVhZGVyIiBURV9VTktOT1dOCisgIHdoZXJlCisgICAgZXh0cmFjdEhlYWRlcl8gPSBkbworICAgICAgbWFnaWMgPC0gUC53b3JkOCAweDBmICo+IFAud29yZDggMHhmZgorICAgICAgZmxhZ3MgPC0gcGFyc2VJMTYKKyAgICAgIHNlcU51bSA8LSBwYXJzZUkzMgorICAgICAgKGhlYWRlclNpemUgOjogSW50KSA8LSAoKiA0KSAuIGZyb21JbnRlZ3JhbCA8JD4gcGFyc2VJMTYKKyAgICAgIGhlYWRlciA8LSBQLnRha2UgaGVhZGVyU2l6ZQorICAgICAgcmV0dXJuIChmbGFncywgc2VxTnVtLCBoZWFkZXIpCisKK2hhbmRsZUhlYWRlciB0IGhlYWRlciA9CisgIGNhc2UgUC5wYXJzZU9ubHkgcGFyc2VIZWFkZXIgaGVhZGVyIG9mCisgICAgUmlnaHQgKHBUeXBlLCB0cmFucywgaW5mbykgLT4gZG8KKyAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBwVHlwZQorICAgICAgd3JpdGVJT1JlZiAodHJhbnNmb3JtcyB0KSB0cmFucworICAgICAgd3JpdGVJT1JlZiAoaGVhZGVycyB0KSBpbmZvCisgICAgXyAtPiB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBJbnZhbGlkIGhlYWRlciIgVEVfVU5LTk9XTgorCisKK2l3MTYgOjogSW50MTYgLT4gV29yZDE2CitpdzE2ID0gZnJvbUludGVncmFsCitpdzMyIDo6IEludDMyIC0+IFdvcmQzMgoraXczMiA9IGZyb21JbnRlZ3JhbAord2kxNiA6OiBXb3JkMTYgLT4gSW50MTYKK3dpMTYgPSBmcm9tSW50ZWdyYWwKK3dpMzIgOjogV29yZDMyIC0+IEludDMyCit3aTMyID0gZnJvbUludGVncmFsCisKK3BhcnNlSGVhZGVyIDo6IFAuUGFyc2VyIChQcm90b2NvbFR5cGUsIFtUcmFuc2Zvcm1UeXBlXSwgWyhTdHJpbmcsIFN0cmluZyldKQorcGFyc2VIZWFkZXIgPSBkbworICBwcm90b2NvbFR5cGUgPC0gdG9Qcm90b2NvbFR5cGUgPCQ+IHBhcnNlVmFyaW50IHdpMTYKKyAgbnVtVHJhbnMgPC0gZnJvbUludGVncmFsIDwkPiBwYXJzZVZhcmludCB3aTE2CisgIHRyYW5zIDwtIHJlcGxpY2F0ZU0gbnVtVHJhbnMgcGFyc2VUcmFuc2Zvcm0KKyAgaW5mbyA8LSBwYXJzZUluZm8KKyAgcmV0dXJuIChwcm90b2NvbFR5cGUsIHRyYW5zLCBpbmZvKQorCit0b1Byb3RvY29sVHlwZSA6OiBJbnQxNiAtPiBQcm90b2NvbFR5cGUKK3RvUHJvdG9jb2xUeXBlIDAgPSBUQmluYXJ5Cit0b1Byb3RvY29sVHlwZSAxID0gVEpTT04KK3RvUHJvdG9jb2xUeXBlIDIgPSBUQ29tcGFjdAorCitmcm9tUHJvdG9jb2xUeXBlIDo6IFByb3RvY29sVHlwZSAtPiBJbnQxNgorZnJvbVByb3RvY29sVHlwZSBUQmluYXJ5ID0gMAorZnJvbVByb3RvY29sVHlwZSBUSlNPTiA9IDEKK2Zyb21Qcm90b2NvbFR5cGUgVENvbXBhY3QgPSAyCisKK3BhcnNlVHJhbnNmb3JtIDo6IFAuUGFyc2VyIFRyYW5zZm9ybVR5cGUKK3BhcnNlVHJhbnNmb3JtID0gdG9UcmFuc3BvcnRUeXBlIDwkPiBwYXJzZVZhcmludCB3aTE2CisKK3BhcnNlSW5mbyA6OiBQLlBhcnNlciBbKFN0cmluZywgU3RyaW5nKV0KK3BhcnNlSW5mbyA9IGRvCisgIG4gPC0gUC5laXRoZXJQIFAuZW5kT2ZJbnB1dCAocGFyc2VWYXJpbnQgd2kzMikKKyAgY2FzZSBuIG9mCisgICAgTGVmdCBfIC0+IHJldHVybiBbXQorICAgIFJpZ2h0IG4wIC0+CisgICAgICByZXBsaWNhdGVNIChmcm9tSW50ZWdyYWwgbjApICQgZG8KKyAgICAgICAga2xlbiA8LSBwYXJzZVZhcmludCB3aTE2CisgICAgICAgIGsgPC0gUC50YWtlICQgZnJvbUludGVncmFsIGtsZW4KKyAgICAgICAgdmxlbiA8LSBwYXJzZVZhcmludCB3aTE2CisgICAgICAgIHYgPC0gUC50YWtlICQgZnJvbUludGVncmFsIHZsZW4KKyAgICAgICAgcmV0dXJuIChDLnVucGFjayBrLCBDLnVucGFjayB2KQorCitwYXJzZVN0cmluZyA6OiBQLlBhcnNlciBCUy5CeXRlU3RyaW5nCitwYXJzZVN0cmluZyA9IHBhcnNlVmFyaW50IHdpMzIgPj49IChQLnRha2UgLiBmcm9tSW50ZWdyYWwpCisKK2J1aWxkSGVhZGVyIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSU8gQi5CdWlsZGVyCitidWlsZEhlYWRlciB0ID0gZG8KKyAgcFR5cGUgPC0gcmVhZElPUmVmICQgcHJvdG9jb2xUeXBlIHQKKyAgbGV0IHBJZCA9IGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21Qcm90b2NvbFR5cGUgcFR5cGUKKyAgbGV0IGhlYWRlckNvbnRlbnQgPSBwSWQgPD4gKGJ1aWxkVHJhbnNmb3JtcyB0KSA8PiAoYnVpbGRJbmZvIHQpCisgIGxldCBsZW4gPSBmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoICQgQi50b0xhenlCeXRlU3RyaW5nIGhlYWRlckNvbnRlbnQKKyAgLS0gVE9ETzogbGVuZ3RoIGxpbWl0IGNoZWNrCisgIGxldCBwYWRkaW5nID0gbWNvbmNhdCAkIHJlcGxpY2F0ZSAobW9kIGxlbiA0KSAkIEIud29yZDggMAorICBsZXQgY29kZWRMZW4gPSBCLmludDE2QkUgKGZyb21JbnRlZ3JhbCAkIChxdW90IChsZW4gLSAxKSA0KSArIDEpCisgIGxldCBmbGFncyA9IDAKKyAgbGV0IHNlcU51bSA9IDAKKyAgcmV0dXJuICQgQi5pbnQxNkJFIDB4MGZmZiA8PiBCLmludDE2QkUgZmxhZ3MgPD4gQi5pbnQzMkJFIHNlcU51bSA8PiBjb2RlZExlbiA8PiBoZWFkZXJDb250ZW50IDw+IHBhZGRpbmcKKworYnVpbGRUcmFuc2Zvcm1zIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gQi5CdWlsZGVyCistLSBUT0RPOiBjaGVjayBsZW5ndGggbGltaXQKK2J1aWxkVHJhbnNmb3JtcyB0ID0KKyAgbGV0IHRyYW5zID0gd3JpdGVUcmFuc2Zvcm1zIHQgaW4KKyAgKGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21JbnRlZ3JhbCAkIGxlbmd0aCB0cmFucykgPD4KKyAgKG1jb25jYXQgJCBtYXAgKGJ1aWxkVmFyaW50IC4gaXcxNiAuIGZyb21UcmFuc3BvcnRUeXBlKSB0cmFucykKKworYnVpbGRJbmZvIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gQi5CdWlsZGVyCitidWlsZEluZm8gdCA9CisgIGxldCBoID0gTWFwLmFzc29jcyAkIHdyaXRlSGVhZGVycyB0IGluCisgIC0tIFRPRE86IGNoZWNrIGxlbmd0aCBsaW1pdAorICBjYXNlIGxlbmd0aCBoIG9mCisgICAgMCAtPiBtZW1wdHkKKyAgICBsZW4gLT4gKGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21JbnRlZ3JhbCAkIGxlbikgPD4gKG1jb25jYXQgJCBtYXAgYnVpbGRJbmZvRW50cnkgaCkKKyAgd2hlcmUKKyAgICBidWlsZEluZm9FbnRyeSAoaywgdikgPSBidWlsZFZhclN0ciBrIDw+IGJ1aWxkVmFyU3RyIHYKKyAgICAtLSBUT0RPOiBjaGVjayBsZW5ndGggbGltaXQKKyAgICBidWlsZFZhclN0ciBzID0gKGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21JbnRlZ3JhbCAkIGxlbmd0aCBzKSA8PiBCLnN0cmluZzggcworCit0UmVzZXRQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IElPIEJvb2wKK3RSZXNldFByb3RvY29sIHQgPSBkbworICByQnVmIDwtIHJlYWRJT1JlZiAkIHJlYWRCdWZmZXIgdAorICB3cml0ZUlPUmVmIChjbGllbnRUeXBlIHQpIEhlYWRlckNsaWVudAorICByZWFkRnJhbWUgdAorCit0U2V0UHJvdG9jb2wgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBQcm90b2NvbFR5cGUgLT4gSU8gKCkKK3RTZXRQcm90b2NvbCB0ID0gd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpCisKK3RyYW5zZm9ybSA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IExCUy5CeXRlU3RyaW5nIC0+IExCUy5CeXRlU3RyaW5nCit0cmFuc2Zvcm0gdCBicyA9CisgIGZvbGRyIGFwcGx5VHJhbnNmb3JtIGJzICQgd3JpdGVUcmFuc2Zvcm1zIHQKKyAgd2hlcmUKKyAgICAtLSBhcHBseVRyYW5zZm9ybSBicyBabGliVHJhbnNmb3JtID0KKyAgICAtLSAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IG5vdCBpbXBsZW1lbnRlZDogWmxpYlRyYW5zZm9ybSAgIiBURV9VTktOT1dOCisgICAgYXBwbHlUcmFuc2Zvcm0gYnMgXyA9CisgICAgICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBVbmtub3duIHRyYW5zZm9ybSIgVEVfVU5LTk9XTgorCit1bnRyYW5zZm9ybSA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEJTLkJ5dGVTdHJpbmcgLT4gSU8gQlMuQnl0ZVN0cmluZwordW50cmFuc2Zvcm0gdCBicyA9IGRvCisgIHRyYW5zIDwtIHJlYWRJT1JlZiAkIHRyYW5zZm9ybXMgdAorICByZXR1cm4gJCBmb2xkbCB1bmFwcGx5VHJhbnNmb3JtIGJzIHRyYW5zCisgIHdoZXJlCisgICAgLS0gdW5hcHBseVRyYW5zZm9ybSBicyBabGliVHJhbnNmb3JtID0KKyAgICAtLSAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IG5vdCBpbXBsZW1lbnRlZDogWmxpYlRyYW5zZm9ybSAgIiBURV9VTktOT1dOCisgICAgdW5hcHBseVRyYW5zZm9ybSBicyBfID0KKyAgICAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IFVua25vd24gdHJhbnNmb3JtIiBURV9VTktOT1dOCisKK2luc3RhbmNlIChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IFRyYW5zcG9ydCAoSGVhZGVyVHJhbnNwb3J0IGkgbykgd2hlcmUKKyAgdElzT3BlbiB0ID0gZG8KKyAgICB0SXNPcGVuIChpblRyYW5zIHQpCisgICAgdElzT3BlbiAob3V0VHJhbnMgdCkKKworICB0Q2xvc2UgdCA9IGRvCisgICAgdENsb3NlKG91dFRyYW5zIHQpCisgICAgdENsb3NlKGluVHJhbnMgdCkKKworICB0UmVhZCB0IGxlbiA9IGRvCisgICAgckJ1ZiA8LSByZWFkSU9SZWYgJCByZWFkQnVmZmVyIHQKKyAgICBpZiBub3QgJCBMQlMubnVsbCByQnVmCisgICAgICB0aGVuIGRvCisgICAgICAgIGxldCAoY29uc3VtZWQsIHJlbWFpbikgPSBMQlMuc3BsaXRBdCAoZnJvbUludGVncmFsIGxlbikgckJ1ZgorICAgICAgICB3cml0ZUlPUmVmIChyZWFkQnVmZmVyIHQpIHJlbWFpbgorICAgICAgICByZXR1cm4gY29uc3VtZWQKKyAgICAgIGVsc2UgZG8KKyAgICAgICAgZnJhbWVkIDwtIGlzRnJhbWVkIHQKKyAgICAgICAgaWYgbm90IGZyYW1lZAorICAgICAgICAgIHRoZW4gdFJlYWQgKGluVHJhbnMgdCkgbGVuCisgICAgICAgICAgZWxzZSBkbworICAgICAgICAgICAgb2sgPC0gcmVhZEZyYW1lIHQKKyAgICAgICAgICAgIGlmIG9rCisgICAgICAgICAgICAgIHRoZW4gdFJlYWQgdCBsZW4KKyAgICAgICAgICAgICAgZWxzZSByZXR1cm4gTEJTLmVtcHR5CisKKyAgdFBlZWsgdCA9IGRvCisgICAgckJ1ZiA8LSByZWFkSU9SZWYgKHJlYWRCdWZmZXIgdCkKKyAgICBpZiBub3QgJCBMQlMubnVsbCByQnVmCisgICAgICB0aGVuIHJldHVybiAkIEp1c3QgJCBMQlMuaGVhZCByQnVmCisgICAgICBlbHNlIGRvCisgICAgICAgIGZyYW1lZCA8LSBpc0ZyYW1lZCB0CisgICAgICAgIGlmIG5vdCBmcmFtZWQKKyAgICAgICAgICB0aGVuIHRQZWVrIChpblRyYW5zIHQpCisgICAgICAgICAgZWxzZSBkbworICAgICAgICAgICAgb2sgPC0gcmVhZEZyYW1lIHQKKyAgICAgICAgICAgIGlmIG9rCisgICAgICAgICAgICAgIHRoZW4gdFBlZWsgdAorICAgICAgICAgICAgICBlbHNlIHJldHVybiBOb3RoaW5nCisKKyAgdFdyaXRlIHQgYnVmID0gZG8KKyAgICBsZXQgd0J1ZiA9IHdyaXRlQnVmZmVyIHQKKyAgICBmcmFtZWQgPC0gaXNGcmFtZWQgdAorICAgIGlmIGZyYW1lZAorICAgICAgdGhlbiBtb2RpZnlJT1JlZiB3QnVmICg8PiBCLmxhenlCeXRlU3RyaW5nIGJ1ZikKKyAgICAgIGVsc2UKKyAgICAgICAgLS0gVE9ETzogd2hhdCBzaG91bGQgd2UgZG8gd2hlbiBzd2l0Y2hlZCB0byB1bmZyYW1lZCBpbiB0aGUgbWlkZGxlID8KKyAgICAgICAgdFdyaXRlKG91dFRyYW5zIHQpIGJ1ZgorCisgIHRGbHVzaCB0ID0gZG8KKyAgICBjVHlwZSA8LSByZWFkSU9SZWYgJCBjbGllbnRUeXBlIHQKKyAgICBjYXNlIGNUeXBlIG9mCisgICAgICBVbmZyYW1lZCAtPiB0Rmx1c2ggJCBvdXRUcmFucyB0CisgICAgICBGcmFtZWQgLT4gZmx1c2hCdWZmZXIgdCBpZCBtZW1wdHkKKyAgICAgIEhlYWRlckNsaWVudCAtPiBidWlsZEhlYWRlciB0ID4+PSBmbHVzaEJ1ZmZlciB0ICh0cmFuc2Zvcm0gdCkKKyAgICB3aGVyZQorICAgICAgZmx1c2hCdWZmZXIgdCBmIGhlYWRlciA9IGRvCisgICAgICAgIHdCdWYgPC0gcmVhZElPUmVmICQgd3JpdGVCdWZmZXIgdAorICAgICAgICB3cml0ZUlPUmVmICh3cml0ZUJ1ZmZlciB0KSBtZW1wdHkKKyAgICAgICAgbGV0IHBheWxvYWQgPSBCLnRvTGF6eUJ5dGVTdHJpbmcgKGhlYWRlciA8PiB3QnVmKQorICAgICAgICB0V3JpdGUgKG91dFRyYW5zIHQpICQgQmluYXJ5LmVuY29kZSAoZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCBwYXlsb2FkIDo6IEludDMyKQorICAgICAgICB0V3JpdGUgKG91dFRyYW5zIHQpICQgZiBwYXlsb2FkCisgICAgICAgIHRGbHVzaCAob3V0VHJhbnMgdCkKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9NZW1vcnkuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvTWVtb3J5LmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTNhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvTWVtb3J5LmhzCkBAIC0wLDAgKzEsNzcgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnkKKyAgICAgICAoIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAsIE1lbW9yeUJ1ZmZlciguLikKKyAgICAgICApIHdoZXJlCisKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyCitpbXBvcnQgRGF0YS5GdW5jdG9yCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IERhdGEuTW9ub2lkCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAorCisKK2RhdGEgTWVtb3J5QnVmZmVyID0gTWVtb3J5QnVmZmVyIHsKKyAgd3JpdGVCdWZmZXIgOjogSU9SZWYgQnVpbGRlciwKKyAgcmVhZEJ1ZmZlciA6OiBJT1JlZiBMQlMuQnl0ZVN0cmluZworfQorCitvcGVuTWVtb3J5QnVmZmVyIDo6IElPIE1lbW9yeUJ1ZmZlcgorb3Blbk1lbW9yeUJ1ZmZlciA9IGRvCisgIHdidWYgPC0gbmV3SU9SZWYgbWVtcHR5CisgIHJidWYgPC0gbmV3SU9SZWYgbWVtcHR5CisgIHJldHVybiBNZW1vcnlCdWZmZXIgeworICAgIHdyaXRlQnVmZmVyID0gd2J1ZiwKKyAgICByZWFkQnVmZmVyID0gcmJ1ZgorICB9CisKK2luc3RhbmNlIFRyYW5zcG9ydCBNZW1vcnlCdWZmZXIgd2hlcmUKKyAgdElzT3BlbiA9IGNvbnN0ICQgcmV0dXJuIEZhbHNlCisgIHRDbG9zZSAgPSBjb25zdCAkIHJldHVybiAoKQorICB0Rmx1c2ggdHJhbnMgPSBkbworICAgIGxldCB3QnVmID0gd3JpdGVCdWZmZXIgdHJhbnMKKyAgICB3YiA8LSByZWFkSU9SZWYgd0J1ZgorICAgIG1vZGlmeUlPUmVmIChyZWFkQnVmZmVyIHRyYW5zKSAkIFxyYiAtPiBtYXBwZW5kIHJiICQgdG9MYXp5Qnl0ZVN0cmluZyB3YgorICAgIHdyaXRlSU9SZWYgd0J1ZiBtZW1wdHkKKworICB0UmVhZCBfIDAgPSByZXR1cm4gbWVtcHR5CisgIHRSZWFkIHRyYW5zIG4gPSBkbworICAgIGxldCByYnVmID0gcmVhZEJ1ZmZlciB0cmFucworICAgIHJiIDwtIHJlYWRJT1JlZiByYnVmCisgICAgbGV0IGxlbiA9IGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggcmIKKyAgICBpZiBsZW4gPT0gMAorICAgICAgdGhlbiBkbworICAgICAgICB0Rmx1c2ggdHJhbnMKKyAgICAgICAgcmIyIDwtIHJlYWRJT1JlZiAocmVhZEJ1ZmZlciB0cmFucykKKyAgICAgICAgaWYgKGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggcmIyKSA9PSAwCisgICAgICAgICAgdGhlbiByZXR1cm4gbWVtcHR5CisgICAgICAgICAgZWxzZSB0UmVhZCB0cmFucyBuCisgICAgICBlbHNlIGRvCisgICAgICAgIGxldCAocmV0LCByZW1haW4pID0gTEJTLnNwbGl0QXQgKGZyb21JbnRlZ3JhbCBuKSByYgorICAgICAgICB3cml0ZUlPUmVmIHJidWYgcmVtYWluCisgICAgICAgIHJldHVybiByZXQKKworICB0UGVlayB0cmFucyA9IChmbWFwIGZzdCAuIExCUy51bmNvbnMpIDwkPiByZWFkSU9SZWYgKHJlYWRCdWZmZXIgdHJhbnMpCisKKyAgdFdyaXRlIHRyYW5zIHYgPSBkbworICAgIG1vZGlmeUlPUmVmICh3cml0ZUJ1ZmZlciB0cmFucykgKDw+IGxhenlCeXRlU3RyaW5nIHYpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UeXBlcy5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1R5cGVzLmhzCmluZGV4IGI5MGM0MmMuLjJhMjAwMjUgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1R5cGVzLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1R5cGVzLmhzCkBAIC0zMSwxMiArMzEsNiBAQAogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0CiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvcgogCi1pbnN0YW5jZSAoSGFzaGFibGUgaywgSGFzaGFibGUgdikgPT4gSGFzaGFibGUgKE1hcC5IYXNoTWFwIGsgdikgd2hlcmUKLSAgaGFzaFdpdGhTYWx0IHNhbHQgPSBmb2xkbCcgaGFzaFdpdGhTYWx0IHNhbHQgLiBNYXAudG9MaXN0Ci0KLWluc3RhbmNlIChIYXNoYWJsZSBhKSA9PiBIYXNoYWJsZSAoU2V0Lkhhc2hTZXQgYSkgd2hlcmUKLSAgaGFzaFdpdGhTYWx0ID0gZm9sZGwnIGhhc2hXaXRoU2FsdAotCiBpbnN0YW5jZSAoSGFzaGFibGUgYSkgPT4gSGFzaGFibGUgKFZlY3Rvci5WZWN0b3IgYSkgd2hlcmUKICAgaGFzaFdpdGhTYWx0ID0gVmVjdG9yLmZvbGRsJyBoYXNoV2l0aFNhbHQKIApAQCAtNTMsNiArNDcsNyBAQAogICAgICAgICAgICAgICAgfCBUSTMyIEludDMyCiAgICAgICAgICAgICAgICB8IFRJNjQgSW50NjQKICAgICAgICAgICAgICAgIHwgVFN0cmluZyBMQlMuQnl0ZVN0cmluZworICAgICAgICAgICAgICAgfCBUQmluYXJ5IExCUy5CeXRlU3RyaW5nCiAgICAgICAgICAgICAgICB8IFREb3VibGUgRG91YmxlCiAgICAgICAgICAgICAgICAgIGRlcml2aW5nIChFcSwgU2hvdykKIApAQCAtNzAsNiArNjUsNyBAQAogICAgIHwgVF9JMzIKICAgICB8IFRfSTY0CiAgICAgfCBUX1NUUklORworICAgIHwgVF9CSU5BUlkKICAgICB8IFRfU1RSVUNUIFR5cGVNYXAKICAgICB8IFRfTUFQIFRocmlmdFR5cGUgVGhyaWZ0VHlwZQogICAgIHwgVF9TRVQgVGhyaWZ0VHlwZQpAQCAtODksNiArODUsNyBAQAogICAgIGZyb21FbnVtIFRfSTMyICAgICAgICA9IDgKICAgICBmcm9tRW51bSBUX0k2NCAgICAgICAgPSAxMAogICAgIGZyb21FbnVtIFRfU1RSSU5HICAgICA9IDExCisgICAgZnJvbUVudW0gVF9CSU5BUlkgICAgID0gMTEKICAgICBmcm9tRW51bSAoVF9TVFJVQ1QgXykgPSAxMgogICAgIGZyb21FbnVtIChUX01BUCBfIF8pICA9IDEzCiAgICAgZnJvbUVudW0gKFRfU0VUIF8pICAgID0gMTQKQEAgLTEwMyw2ICsxMDAsNyBAQAogICAgIHRvRW51bSA4ICA9IFRfSTMyCiAgICAgdG9FbnVtIDEwID0gVF9JNjQKICAgICB0b0VudW0gMTEgPSBUX1NUUklORworICAgIC0tIHRvRW51bSAxMSA9IFRfQklOQVJZCiAgICAgdG9FbnVtIDEyID0gVF9TVFJVQ1QgTWFwLmVtcHR5CiAgICAgdG9FbnVtIDEzID0gVF9NQVAgVF9WT0lEIFRfVk9JRAogICAgIHRvRW51bSAxNCA9IFRfU0VUIFRfVk9JRApkaWZmIC0tZ2l0IGEvbGliL2hzL3Rlc3QvQmluYXJ5U3BlYy5ocyBiL2xpYi9ocy90ZXN0L0JpbmFyeVNwZWMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5MmZhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy90ZXN0L0JpbmFyeVNwZWMuaHMKQEAgLTAsMCArMSw5MSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBCaW5hcnlTcGVjIHdoZXJlCisKK2ltcG9ydCBUZXN0LkhzcGVjCitpbXBvcnQgVGVzdC5Ic3BlYy5RdWlja0NoZWNrIChwcm9wKQorCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5DaGFyOCBhcyBDCisKK2ltcG9ydCBUaHJpZnQuVHlwZXMKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CisKK3NwZWMgOjogU3BlYworc3BlYyA9IGRvCisgIGRlc2NyaWJlICJCaW5hcnlQcm90b2NvbCIgJCBkbworICAgIGRlc2NyaWJlICJkb3VibGUiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgaW4gYmlnIGVuZGlhbiBvcmRlciIgJCBkbworICAgICAgICBsZXQgdmFsID0gMiAqKiA1MworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChURG91YmxlIHZhbCkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDgKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgWzY3LCA2NCwgMCwgMCwgMCwgMCwgMCwgMF0KKworICAgICAgaXQgInJlYWRzIGluIGJpZyBlbmRpYW4gb3JkZXIiICQgZG8KKyAgICAgICAgbGV0IGJpbiA9IExCUy5wYWNrIFs2NywgNjQsIDAsIDAsIDAsIDAsIDAsIDBdCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIGJpbgorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byBUX0RPVUJMRQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVERvdWJsZSAkIDIgKiogNTMpCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgVERvdWJsZSB2YWwKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIFRfRE9VQkxFCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVERvdWJsZSB2YWwpCisKKyAgICBkZXNjcmliZSAic3RyaW5nIiAkIGRvCisgICAgICBpdCAid3JpdGVzIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSBDLnBhY2sgImFhYSIKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVFN0cmluZyB2YWwpCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyA3CisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbMCwgMCwgMCwgMywgOTcsIDk3LCA5N10KKworICAgIGRlc2NyaWJlICJiaW5hcnkiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIFs0MiwgNDMsIDQ0XSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoTEJTLnVucGFjayBiaW4pIGBzaG91bGRCZWAgWzAsIDAsIDAsIDMsIDQyLCA0MywgNDRdCisKKyAgICAgIGl0ICJyZWFkcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIExCUy5wYWNrIFswLCAwLCAwLCAzLCA0MiwgNDMsIDQ0XQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgWzQyLCA0MywgNDRdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorCmRpZmYgLS1naXQgYS9saWIvaHMvdGVzdC9Db21wYWN0U3BlYy5ocyBiL2xpYi9ocy90ZXN0L0NvbXBhY3RTcGVjLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDBlN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGVzdC9Db21wYWN0U3BlYy5ocwpAQCAtMCwwICsxLDgxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIENvbXBhY3RTcGVjIHdoZXJlCisKK2ltcG9ydCBUZXN0LkhzcGVjCitpbXBvcnQgVGVzdC5Ic3BlYy5RdWlja0NoZWNrIChwcm9wKQorCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworCitpbXBvcnQgVGhyaWZ0LlR5cGVzCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuTWVtb3J5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKKworc3BlYyA6OiBTcGVjCitzcGVjID0gZG8KKyAgZGVzY3JpYmUgIkNvbXBhY3RQcm90b2NvbCIgJCBkbworICAgIGRlc2NyaWJlICJkb3VibGUiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgaW4gbGl0dGxlIGVuZGlhbiBvcmRlciIgJCBkbworICAgICAgICBsZXQgdmFsID0gMiAqKiA1MworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVERvdWJsZSB2YWwpCisgICAgICAgIGJpbiA8LSB0UmVhZEFsbCB0cmFucyA4CisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYFswLCAwLCAwLCAwLCAwLCAwLCA2NCwgNjddCisKKyAgICAgIGl0ICJyZWFkcyBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyIiAkIGRvCisgICAgICAgIGxldCBiaW4gPSBMQlMucGFjayBbMCwgMCwgMCwgMCwgMCwgMCwgNjQsIDY3XQorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgYmluCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIFRfRE9VQkxFCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChURG91YmxlICQgMiAqKiA1MykKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgVERvdWJsZSB2YWwKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIFRfRE9VQkxFCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVERvdWJsZSB2YWwpCisKKyAgICBkZXNjcmliZSAiYmluYXJ5IiAkIGRvCisgICAgICBpdCAid3JpdGVzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgWzQyLCA0MywgNDRdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbMywgNDIsIDQzLCA0NF0KKworICAgICAgaXQgInJlYWRzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIExCUy5wYWNrIFszLCA0MiwgNDMsIDQ0XQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgWzQyLCA0MywgNDRdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKwpkaWZmIC0tZ2l0IGEvbGliL2hzL3Rlc3QvSlNPTlNwZWMuaHMgYi9saWIvaHMvdGVzdC9KU09OU3BlYy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjJjODI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3Rlc3QvSlNPTlNwZWMuaHMKQEAgLTAsMCArMSwyMjUgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgSlNPTlNwZWMgd2hlcmUKKworaW1wb3J0IFRlc3QuSHNwZWMKK2ltcG9ydCBUZXN0LkhzcGVjLlF1aWNrQ2hlY2sgKHByb3ApCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIEMKKworaW1wb3J0IFRocmlmdC5UeXBlcworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0Lk1lbW9yeQoraW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5KU09OCisKK3RTdHJpbmcgOjogW0NoYXJdIC0+IFRocmlmdFZhbAordFN0cmluZyA9IFRTdHJpbmcgLiBDLnBhY2sKKworc3BlYyA6OiBTcGVjCitzcGVjID0gZG8KKyAgZGVzY3JpYmUgIkpTT05Qcm90b2NvbCIgJCBkbworICAgIGRlc2NyaWJlICJib29sIiAkIGRvCisgICAgICBpdCAid3JpdGVzIHRydWUgYXMgMSIgJCBkbworICAgICAgICBsZXQgdmFsID0gVHJ1ZQorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJvb2wgdmFsKQorICAgICAgICBiaW4gPC10UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbJzEnXQorCisgICAgICBpdCAid3JpdGVzIGZhbHNlIGFzIDAiICQgZG8KKyAgICAgICAgbGV0IHZhbCA9IEZhbHNlCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQm9vbCB2YWwpCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbJzAnXQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCBUQm9vbCB2YWwKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIFRfQk9PTAorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRCb29sIHZhbCkKKworICAgIGRlc2NyaWJlICJzdHJpbmciICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRTdHJpbmcgJCBDLnBhY2sgIlwiYSIpCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCAiXCJcXFwiYVwiIgorCisgICAgICBpdCAicmVhZHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgQy5wYWNrICJcIlxcXCJhXCIiCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX1NUUklORykKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRTdHJpbmcgJCBDLnBhY2sgIlwiYSIpCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVFN0cmluZyAkIEMucGFjayB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAoVF9TVFJJTkcpCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVFN0cmluZyAkIEMucGFjayB2YWwpCisKKyAgICBkZXNjcmliZSAiYmluYXJ5IiAkIGRvCisgICAgICBpdCAid3JpdGVzIHdpdGggcGFkZGluZyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIFsxXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJcIkFRPT1cIiIKKworICAgICAgaXQgInJlYWRzIHdpdGggcGFkZGluZyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgJCBDLnBhY2sgIlwiQVE9PVwiIgorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgWzFdKQorCisgICAgICBpdCAicmVhZHMgd2l0aG91dCBwYWRkaW5nIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIEMucGFjayAiXCJBUVwiIgorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgWzFdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKworICAgIGRlc2NyaWJlICJsaXN0IiAkIGRvCisgICAgICBpdCAid3JpdGVzIGVtcHR5IGxpc3QiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRMaXN0IFRfQllURSBbXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJbXCJpOFwiLDBdIgorCisgICAgICBpdCAicmVhZHMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMF0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9MSVNUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRMaXN0IFRfQllURSBbXSkKKworICAgICAgaXQgIndyaXRlcyBzaW5nbGUgZWxlbWVudCIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVExpc3QgVF9CWVRFIFtUQnl0ZSAwXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJbXCJpOFwiLDEsMF0iCisKKyAgICAgIGl0ICJyZWFkcyBzaW5nbGUgZWxlbWVudCIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwxLDBdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTElTVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUTGlzdCBUX0JZVEUgW1RCeXRlIDBdKQorCisgICAgICBpdCAicmVhZHMgZWxlbWVudHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMiw0MiwgNDNdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTElTVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUTGlzdCBUX0JZVEUgW1RCeXRlIDQyLCBUQnl0ZSA0M10pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIChUTGlzdCBUX1NUUklORyAkIG1hcCB0U3RyaW5nIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvICQgVF9MSVNUIFRfU1RSSU5HCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVExpc3QgVF9TVFJJTkcgJCBtYXAgdFN0cmluZyB2YWwpCisKKyAgICBkZXNjcmliZSAic2V0IiAkIGRvCisgICAgICBpdCAid3JpdGVzIGVtcHR5IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUU2V0IFRfQllURSBbXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJbXCJpOFwiLDBdIgorCisgICAgICBpdCAicmVhZHMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMF0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9TRVQgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVFNldCBUX0JZVEUgW10pCisKKyAgICAgIGl0ICJyZWFkcyBzaW5nbGUgZWxlbWVudCIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwxLDBdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfU0VUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRTZXQgVF9CWVRFIFtUQnl0ZSAwXSkKKworICAgICAgaXQgInJlYWRzIGVsZW1lbnRzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDIsNDIsIDQzXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX1NFVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUU2V0IFRfQllURSBbVEJ5dGUgNDIsIFRCeXRlIDQzXSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgKFRTZXQgVF9TVFJJTkcgJCBtYXAgdFN0cmluZyB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAkIFRfU0VUIFRfU1RSSU5HCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVFNldCBUX1NUUklORyAkIG1hcCB0U3RyaW5nIHZhbCkKKworICAgIGRlc2NyaWJlICJtYXAiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRNYXAgVF9CWVRFIFRfQllURSBbXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIltcImk4XCIsXCJpOFwiLDAse31dIgorCisgICAgICBpdCAicmVhZHMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsXCJpOFwiLDAse31dIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTUFQIFRfQllURSBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUTWFwIFRfQllURSBUX0JZVEUgW10pCisKKyAgICAgIGl0ICJyZWFkcyBzdHJpbmctc3RyaW5nIiAkIGRvCisgICAgICAgIGxldCBiaW4gPSAiW1wic3RyXCIsXCJzdHJcIiwyLHtcImFcIjpcIjJcIixcImJcIjpcImJsYWhcIn1dIgorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayBiaW4pCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX01BUCBUX1NUUklORyBUX1NUUklORykKKyAgICAgICAgdmFsYHNob3VsZEJlYCAoVE1hcCBUX1NUUklORyBUX1NUUklORyBbKHRTdHJpbmcgImEiLCB0U3RyaW5nICIyIiksICh0U3RyaW5nICJiIiwgdFN0cmluZyAiYmxhaCIpXSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgKFRNYXAgVF9TVFJJTkcgVF9TVFJJTkcgJCBtYXAgdG9LViB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAkIFRfTUFQIFRfU1RSSU5HIFRfU1RSSU5HCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVE1hcCBUX1NUUklORyBUX1NUUklORyAkIG1hcCB0b0tWIHZhbCkKKyAgICAgICAgd2hlcmUKKyAgICAgICAgICB0b0tWIHYgPSAodFN0cmluZyB2LCB0U3RyaW5nIHYpCisKZGlmZiAtLWdpdCBhL2xpYi9ocy90ZXN0L1NwZWMuaHMgYi9saWIvaHMvdGVzdC9TcGVjLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzlhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGVzdC9TcGVjLmhzCkBAIC0wLDAgKzEsMzggQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCistLSBPdXIgQ0kgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggYXV0byBkaXNjb3Zlci4KKy0tIE5lZWQgdG8gYWRkIGJ1aWxkLXRpbWUgUEFUSCB2YXJpYWJsZSB0byBoc3BlYy1kaXNjb3ZlciBkaXIgZnJvbSBDTWFrZQorLS0gb3IgaW5zdGFsbCBoc3BlYyBzeXN0ZW0td2lkZSBmb3IgdGhlIGZvbGxvd2luZyB0byB3b3JrLgorLS0gey0jIE9QVElPTlNfR0hDIC1GIC1wZ21GIGhzcGVjLWRpc2NvdmVyICMtfQorCitpbXBvcnQgVGVzdC5Ic3BlYworCitpbXBvcnQgcXVhbGlmaWVkIEJpbmFyeVNwZWMKK2ltcG9ydCBxdWFsaWZpZWQgQ29tcGFjdFNwZWMKK2ltcG9ydCBxdWFsaWZpZWQgSlNPTlNwZWMKKworbWFpbiA6OiBJTyAoKQorbWFpbiA9IGhzcGVjIHNwZWMKKworc3BlYyA6OiBTcGVjCitzcGVjID0gZG8KKyAgZGVzY3JpYmUgIkJpbmFyeSIgQmluYXJ5U3BlYy5zcGVjCisgIGRlc2NyaWJlICJDb21wYWN0IiBDb21wYWN0U3BlYy5zcGVjCisgIGRlc2NyaWJlICJKU09OIiBKU09OU3BlYy5zcGVjCmRpZmYgLS1naXQgYS9saWIvaHMvdGhyaWZ0LmNhYmFsIGIvbGliL2hzL3RocmlmdC5jYWJhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGE1OWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3RocmlmdC5jYWJhbApAQCAtMCwwICsxLDg0IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworTmFtZTogICAgICAgICAgIHRocmlmdAorVmVyc2lvbjogICAgICAgIDAuMTMuMAorQ2FiYWwtVmVyc2lvbjogIDEuMjQKK0xpY2Vuc2U6ICAgICAgICBPdGhlckxpY2Vuc2UKK0NhdGVnb3J5OiAgICAgICBGb3JlaWduCitCdWlsZC1UeXBlOiAgICAgU2ltcGxlCitTeW5vcHNpczogICAgICAgSGFza2VsbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbQorSG9tZXBhZ2U6ICAgICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworQnVnLVJlcG9ydHM6ICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUCitNYWludGFpbmVyOiAgICAgZGV2QHRocmlmdC5hcGFjaGUub3JnCitMaWNlbnNlLUZpbGU6ICAgTElDRU5TRQorCitEZXNjcmlwdGlvbjoKKyAgSGFza2VsbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbS4gUmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLgorCitmbGFnIG5ldHdvcmstdXJpCisgICBkZXNjcmlwdGlvbjogR2V0IE5ldHdvcmsuVVJJIGZyb20gdGhlIG5ldHdvcmstdXJpIHBhY2thZ2UKKyAgIGRlZmF1bHQ6IFRydWUKKworTGlicmFyeQorICBIcy1Tb3VyY2UtRGlyczoKKyAgICBzcmMKKyAgQnVpbGQtRGVwZW5kczoKKyAgICBiYXNlID49IDQsIGJhc2UgPCA1LCBjb250YWluZXJzLCBnaGMtcHJpbSwgYXR0b3BhcnNlYywgYmluYXJ5LCBieXRlc3RyaW5nID49IDAuMTAsIGJhc2U2NC1ieXRlc3RyaW5nLCBoYXNoYWJsZSwgSFRUUCwgdGV4dCwgaHNwZWMtY29yZSA+IDIuNC4wLCB1bm9yZGVyZWQtY29udGFpbmVycyA+PSAwLjIuNiwgdmVjdG9yID49IDAuMTAuMTIuMiwgUXVpY2tDaGVjayA+PSAyLjguMiwgc3BsaXQKKyAgaWYgZmxhZyhuZXR3b3JrLXVyaSkKKyAgICAgYnVpbGQtZGVwZW5kczogbmV0d29yay11cmkgPj0gMi42LCBuZXR3b3JrID49IDIuNgorICBlbHNlCisgICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmsgPCAyLjYKKyAgRXhwb3NlZC1Nb2R1bGVzOgorICAgIFRocmlmdCwKKyAgICBUaHJpZnQuQXJiaXRyYXJpZXMKKyAgICBUaHJpZnQuUHJvdG9jb2wsCisgICAgVGhyaWZ0LlByb3RvY29sLkhlYWRlciwKKyAgICBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5LAorICAgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LAorICAgIFRocmlmdC5Qcm90b2NvbC5KU09OLAorICAgIFRocmlmdC5TZXJ2ZXIsCisgICAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LkVtcHR5LAorICAgIFRocmlmdC5UcmFuc3BvcnQuRnJhbWVkLAorICAgIFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlLAorICAgIFRocmlmdC5UcmFuc3BvcnQuSGVhZGVyLAorICAgIFRocmlmdC5UcmFuc3BvcnQuSHR0cENsaWVudCwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LklPQnVmZmVyLAorICAgIFRocmlmdC5UcmFuc3BvcnQuTWVtb3J5LAorICAgIFRocmlmdC5UeXBlcworICBEZWZhdWx0LUxhbmd1YWdlOiBIYXNrZWxsMjAxMAorICBEZWZhdWx0LUV4dGVuc2lvbnM6CisgICAgRGVyaXZlRGF0YVR5cGVhYmxlLAorICAgIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24sCisgICAgRmxleGlibGVJbnN0YW5jZXMsCisgICAgS2luZFNpZ25hdHVyZXMsCisgICAgTWFnaWNIYXNoLAorICAgIFJhbmtOVHlwZXMsCisgICAgUmVjb3JkV2lsZENhcmRzLAorICAgIFNjb3BlZFR5cGVWYXJpYWJsZXMsCisgICAgVHlwZVN5bm9ueW1JbnN0YW5jZXMKKworVGVzdC1TdWl0ZSBzcGVjCisgIFR5cGU6IGV4aXRjb2RlLXN0ZGlvLTEuMAorICBIcy1Tb3VyY2UtRGlyczogdGVzdAorICBHaGMtT3B0aW9uczogLVdhbGwKKyAgbWFpbi1pczogU3BlYy5ocworICBCdWlsZC1EZXBlbmRzOiBiYXNlLCB0aHJpZnQsIGhzcGVjLCBRdWlja0NoZWNrID49IDIuOC4yLCBieXRlc3RyaW5nID49IDAuMTAsIHVub3JkZXJlZC1jb250YWluZXJzID49IDAuMi42CisgIERlZmF1bHQtTGFuZ3VhZ2U6IEhhc2tlbGwyMDEwCmRpZmYgLS1naXQgYS9saWIvamF2YS9DTWFrZUxpc3RzLnR4dCBiL2xpYi9qYXZhL0NNYWtlTGlzdHMudHh0CmluZGV4IGJhMTFmMzQuLmE2Nzg0NWEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL0NNYWtlTGlzdHMudHh0CisrKyBiL2xpYi9qYXZhL0NNYWtlTGlzdHMudHh0CkBAIC0xNywzMiArMTcsNzggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWlmKElTX0FCU09MVVRFICIke0xJQl9JTlNUQUxMX0RJUn0iKQotICAgIHNldChKQVZBX0lOU1RBTExfRElSICIke0xJQl9JTlNUQUxMX0RJUn0vamF2YSIpCitpZihBTkRST0lEKQorCisgICAgc2V0KFRIUklGVF9BQVIgb3V0cHV0cy9hYXIvdGhyaWZ0LWRlYnVnLmFhciBvdXRwdXRzL2Fhci90aHJpZnQtcmVsZWFzZS5hYXIpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgJHtUSFJJRlRfQUFSfQorICAgICAgICBDT01NQU5EICR7R1JBRExFX0VYRUNVVEFCTEV9CisgICAgICAgICAgICAtcCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2FuZHJvaWQiCisgICAgICAgICAgICAiLVBidWlsZERpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYW5kcm9pZC9idWlsZCIgYXNzZW1ibGUKKyAgICApCisgICAgYWRkX2N1c3RvbV90YXJnZXQodGhyaWZ0X2FhciBBTEwgREVQRU5EUyAke1RIUklGVF9BQVJ9KQorCiBlbHNlKCkKLSAgICBzZXQoSkFWQV9JTlNUQUxMX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtMSUJfSU5TVEFMTF9ESVJ9L2phdmEiKQotZW5kaWYoKQogCi1pZihJU19BQlNPTFVURSAiJHtET0NfSU5TVEFMTF9ESVJ9IikKLSAgICBzZXQoSkFWQV9ET0NfSU5TVEFMTF9ESVIgIiR7RE9DX0lOU1RBTExfRElSfS9qYXZhIikKLWVsc2UoKQotICAgIHNldChKQVZBX0RPQ19JTlNUQUxMX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtET0NfSU5TVEFMTF9ESVJ9L2phdmEiKQotZW5kaWYoKQorICAgIGlmKElTX0FCU09MVVRFICIke0xJQl9JTlNUQUxMX0RJUn0iKQorICAgICAgICBzZXQoSkFWQV9JTlNUQUxMX0RJUiAiJHtMSUJfSU5TVEFMTF9ESVJ9L2phdmEiKQorICAgIGVsc2UoKQorICAgICAgICBzZXQoSkFWQV9JTlNUQUxMX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtMSUJfSU5TVEFMTF9ESVJ9L2phdmEiKQorICAgIGVuZGlmKCkKIAotYWRkX2N1c3RvbV90YXJnZXQoYW50X2J1aWxkIEFMTAotICAgIENPTU1BTkQgJHtBbnRfRVhFQ1VUQUJMRX0gJHtBTlRfRkxBR1N9IC1EYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSAtRHdvcmtpbmcuZGlyPSR7d29ya19kaXJ9IC1mIGJ1aWxkLnhtbAotICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQotICAgIENPTU1FTlQgIkJ1aWxkaW5nIEphdmEgbGlicmFyeSB1c2luZyBBbnQiCi0pCisgICAgaWYoSVNfQUJTT0xVVEUgIiR7RE9DX0lOU1RBTExfRElSfSIpCisgICAgICAgIHNldChKQVZBX0RPQ19JTlNUQUxMX0RJUiAiJHtET0NfSU5TVEFMTF9ESVJ9L2phdmEiKQorICAgIGVsc2UoKQorICAgICAgICBzZXQoSkFWQV9ET0NfSU5TVEFMTF9ESVIgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9LyR7RE9DX0lOU1RBTExfRElSfS9qYXZhIikKKyAgICBlbmRpZigpCiAKLSMgSG9vayB0aGUgYW50IGluc3RhbGwgdGFzayBpbnRvIENNYWtlIGluc3RhbGwKLWluc3RhbGwoQ09ERSAiZXhlY3V0ZV9wcm9jZXNzKAotICAgIENPTU1BTkQgJHtBbnRfRVhFQ1VUQUJMRX0gJHtBTlRfRkxBR1N9IGluc3RhbGwKLSAgICAtRGJ1aWxkLmRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0gLUR3b3JraW5nLmRpcj0ke3dvcmtfZGlyfQotICAgIC1EaW5zdGFsbC5wYXRoPSR7SkFWQV9JTlNUQUxMX0RJUn0gLURpbnN0YWxsLmphdmFkb2MucGF0aD0ke0pBVkFfRE9DX0lOU1RBTExfRElSfSAtZiBidWlsZC54bWwKLSAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KLSkiKQorICAgIHNldChQUkVMRUFTRSAidHJ1ZSIpCisgICAgaWYgKENNQUtFX0JVSUxEX1RZUEUgTUFUQ0hFUyBERUJVRykKKyAgICAgICAgc2V0KFBSRUxFQVNFICJmYWxzZSIpCisgICAgZW5kaWYgKCkKIAotaWYoQlVJTERfVEVTVElORykKLSAgICAjYWRkX3N1YmRpcmVjdG9yeSh0ZXN0KQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KFRocmlmdEphdmEgQUxMCisgICAgICAgIENPTU1FTlQgIkJ1aWxkaW5nIEphdmEgbGlicmFyeSB1c2luZyBHcmFkbGUgV3JhcHBlciIKKyAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gYXNzZW1ibGUKKyAgICAgICAgICAgIC0tY29uc29sZT1wbGFpbiAtLW5vLWRhZW1vbgorICAgICAgICAgICAgLVByZWxlYXNlPSR7UFJFTEVBU0V9CisgICAgICAgICAgICAtUHRocmlmdC52ZXJzaW9uPSR7dGhyaWZ0X1ZFUlNJT059CisgICAgICAgICAgICAiLVBidWlsZC5kaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkIgorICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICApCisKKyAgICAjIEVuYWJsZSBwdWJsaXNoaW5nIGZyb20gQ01ha2UgaWYgdGhlIHB1Ymxpc2hpbmcgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQKKyAgICBhZGRfY3VzdG9tX3RhcmdldChNYXZlblB1Ymxpc2gKKyAgICAgICAgQ09NTUVOVCAiUHVibGlzaGluZyBKYXZhIExpYnJhcnkgdG8gQXBhY2hlIE1hdmVuIHN0YWdpbmciCisgICAgICAgIENPTU1BTkQgJHtHUkFETEVXX0VYRUNVVEFCTEV9ICR7R1JBRExFX09QVFN9IGNsZWFuIHVwbG9hZEFyY2hpdmVzCisgICAgICAgICAgICAtLWNvbnNvbGU9cGxhaW4gLS1uby1kYWVtb24KKyAgICAgICAgICAgIC1QcmVsZWFzZT0ke1BSRUxFQVNFfQorICAgICAgICAgICAgLVB0aHJpZnQudmVyc2lvbj0ke3RocmlmdF9WRVJTSU9OfQorICAgICAgICAgICAgIi1QYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZCIKKyAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgKQorCisgICAgIyBIb29rIHRoZSBDTWFrZSBpbnN0YWxsIHByb2Nlc3MgdG8gdGhlIHJlc3VsdHMgZnJvbSBtYWtlIEFMTC4KKyAgICAjIFRoaXMgd29ya3MgYmVzdCB3aGVuICdtYWtlIGFsbCAmJiBzdWRvIG1ha2UgaW5zdGFsbC9mYXN0JyBpcyB1c2VkLgorICAgICMgVXNpbmcgc2xhc2ggdG8gZW5kIHRoZSBzb3VyY2UgbG9jYXRpb24gdG8gYXZvaWQgY29weWluZyB0aGUgZGlyZWN0b3J5IHBhdGguCisgICAgaW5zdGFsbChESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkL2xpYnMvCisgICAgICAgICAgICBERVNUSU5BVElPTiAke0pBVkFfSU5TVEFMTF9ESVJ9CisgICAgICAgICAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICJsaWJ0aHJpZnQtJHt0aHJpZnRfVkVSU0lPTn0uamFyIikKKyAgICBpbnN0YWxsKERJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQvZGVwcy8KKyAgICAgICAgICAgIERFU1RJTkFUSU9OICR7SkFWQV9JTlNUQUxMX0RJUn0KKyAgICAgICAgICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouamFyIikKKyAgICBpbnN0YWxsKERJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQvZG9jcy9qYXZhZG9jLworICAgICAgICAgICAgREVTVElOQVRJT04gJHtKQVZBX0RPQ19JTlNUQUxMX0RJUn0pCisKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBhZGRfdGVzdChOQU1FIEphdmFUZXN0CisgICAgICAgICAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gdGVzdAorICAgICAgICAgICAgICAgICAgICAtLWNvbnNvbGU9cGxhaW4gLS1uby1kYWVtb24KKyAgICAgICAgICAgICAgICAgICAgLVByZWxlYXNlPSR7UFJFTEVBU0V9CisgICAgICAgICAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICAgICAgICAgIi1QYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZCIKKyAgICAgICAgICAgICAgICAgICAgIi1QdGhyaWZ0LmNvbXBpbGVyPSR7VEhSSUZUX0NPTVBJTEVSfSIKKyAgICAgICAgICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisgICAgZW5kaWYoKQorCiBlbmRpZigpCmRpZmYgLS1naXQgYS9saWIvamF2YS9NYWtlZmlsZS5hbSBiL2xpYi9qYXZhL01ha2VmaWxlLmFtCmluZGV4IDg1OWYzZjIuLjY1OTgxY2EgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL01ha2VmaWxlLmFtCisrKyBiL2xpYi9qYXZhL01ha2VmaWxlLmFtCkBAIC0xOSwzMSArMTksNTQgQEAKIAogZXhwb3J0IENMQVNTUEFUSAogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBhbGwtbG9jYWw6Ci0JJChBTlQpICQoQU5UX0ZMQUdTKQorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSBhc3NlbWJsZSBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktLWNvbnNvbGU9cGxhaW4KIAogaW5zdGFsbC1leGVjLWhvb2s6Ci0JJChBTlQpICQoQU5UX0ZMQUdTKSBpbnN0YWxsIC1EaW5zdGFsbC5wYXRoPSQoREVTVERJUikkKEpBVkFfUFJFRklYKSBcCi0JCS1EaW5zdGFsbC5qYXZhZG9jLnBhdGg9JChERVNURElSKSQoZG9jZGlyKS9qYXZhCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIGluc3RhbGwgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS1QaW5zdGFsbC5wYXRoPSQoREVTVERJUikkKEpBVkFfUFJFRklYKSBcCisJCS1QaW5zdGFsbC5qYXZhZG9jLnBhdGg9JChERVNURElSKSQoZG9jZGlyKS9qYXZhIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktLWNvbnNvbGU9cGxhaW4KIAotIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgogY2xlYW4tbG9jYWw6Ci0JQU5UPSQoQU5UKSA7IGlmIHRlc3QgLXogIiQkQU5UIiA7IHRoZW4gQU5UPTogOyBmaSA7IFwKLQkkJEFOVCAkKEFOVF9GTEFHUykgY2xlYW4KKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgY2xlYW4gLS1jb25zb2xlPXBsYWluCiAKIHByZWNyb3NzOiAkKFRIUklGVCkKLQkkKEFOVCkgJChBTlRfRkxBR1MpIGNvbXBpbGUtdGVzdAorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSBzaGFkb3dKYXIgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS1QdGhyaWZ0LnZlcnNpb249JChQQUNLQUdFX1ZFUlNJT04pIFwKKwkJLVB0aHJpZnQuY29tcGlsZXI9JChUSFJJRlQpIFwKKwkJLS1jb25zb2xlPXBsYWluCiAKLWNoZWNrLWxvY2FsOiBhbGwKLQkkKEFOVCkgJChBTlRfRkxBR1MpIHRlc3QKK2NoZWNrLWxvY2FsOiAkKFRIUklGVCkKKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgdGVzdCBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktUHRocmlmdC5jb21waWxlcj0kKFRIUklGVCkgXAorCQktLWNvbnNvbGU9cGxhaW4KKworbWF2ZW4tcHVibGlzaDoKKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgdXBsb2FkQXJjaGl2ZXMgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS1QdGhyaWZ0LnZlcnNpb249JChQQUNLQUdFX1ZFUlNJT04pIFwKKwkJLS1jb25zb2xlPXBsYWluCiAKIEVYVFJBX0RJU1QgPSBcCi0JYnVpbGQueG1sIFwKLQlidWlsZC5wcm9wZXJ0aWVzIFwKKwlidWlsZC5ncmFkbGUgXAorCWdyYWRsZS5wcm9wZXJ0aWVzIFwKKwlzZXR0aW5ncy5ncmFkbGUgXAorCWdyYWRsZSBcCisJZ3JhZGxldyBcCisJZ3JhZGxldy5iYXQgXAogCUNNYWtlTGlzdHMudHh0IFwKIAljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlhbmRyb2lkIFwKIAlzcmMgXAogCXRlc3QgXAotCVJFQURNRS5tZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwljb2RlX3F1YWxpdHlfdG9vbHMgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL2phdmEvUkVBRE1FLm1kIGIvbGliL2phdmEvUkVBRE1FLm1kCmluZGV4IDY2YmNmYTUuLjdkY2E0NTYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL1JFQURNRS5tZAorKysgYi9saWIvamF2YS9SRUFETUUubWQKQEAgLTIwLDE4ICsyMCw1OSBAQAogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogdW5kZXIgdGhlIExpY2Vuc2UuCiAKLVVzaW5nIFRocmlmdCB3aXRoIEphdmEKLT09PT09PT09PT09PT09PT09PT09PT0KK0J1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIGZyb20gc291cmNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXaGVuIHVzaW5nIGEgQ01ha2UgYnVpbGQgZnJvbSB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBvbiBMaW51eCB0aGUKK2Vhc2llc3Qgd2F5IHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGlzIHRoaXMgc2ltcGxlIGNvbW1hbmQgbGluZToKKworICAgIG1ha2UgYWxsICYmIHN1ZG8gbWFrZSBpbnN0YWxsL2Zhc3QKKworSXQgaXMgaW1wb3J0YW50IHRvIHVzZSB0aGUgaW5zdGFsbC9mYXN0IG9wdGlvbiB0byBlbGltaW5hdGUKK3RoZSBhdXRvbWF0aWMgcmVidWlsZCBieSBkZXBlbmRlbmN5IHRoYXQgY2F1c2VzIGlzc3VlcyBiZWNhdXNlCit0aGUgYnVpbGQgdG9vbGluZyBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggY2FjaGVkIGZpbGVzIGluIHRoZQordXNlciBob21lIGRpcmVjdG9yeSBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuIEluc3RlYWQgdGhpcyBidWlsZHMKK3RoZSBjb2RlIGluIHRoZSBleHBlY3RlZCBsb2NhbCBidWlsZCB0cmVlIGFuZCB0aGVuIHVzZXMgQ01ha2UKK2luc3RhbGwgY29kZSB0byBjb3B5IHRvIHRoZSB0YXJnZXQgZGVzdGluYXRpb24uCisKK0J1aWxkaW5nIFRocmlmdCB3aXRoIEdyYWRsZSB3aXRob3V0IENNYWtlL0F1dG9jb25mCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBUaGUgVGhyaWZ0IEphdmEgc291cmNlIGlzIG5vdCBidWlsZCB1c2luZyB0aGUgR05VIHRvb2xzLCBidXQgcmF0aGVyIHVzZXMKLXRoZSBBcGFjaGUgQW50IGJ1aWxkIHN5c3RlbSwgd2hpY2ggdGVuZHMgdG8gYmUgcHJlZG9taW5hbnQgYW1vbmdzdCBKYXZhCit0aGUgR3JhZGxlIGJ1aWxkIHN5c3RlbSwgd2hpY2ggdGVuZHMgdG8gYmUgcHJlZG9taW5hbnQgYW1vbmdzdCBKYXZhCiBkZXZlbG9wZXJzLgogCiBUbyBjb21waWxlIHRoZSBKYXZhIFRocmlmdCBsaWJyYXJpZXMsIHNpbXBseSBkbyB0aGUgZm9sbG93aW5nOgogCi0gICAgYW50CisgICAgLi9ncmFkbGV3CiAKLVllcCwgdGhhdCdzIGVhc3kuIExvb2sgZm9yIGxpYnRocmlmdC5qYXIgaW4gdGhlIGJhc2UgZGlyZWN0b3J5LgorWWVwLCB0aGF0J3MgZWFzeS4gTG9vayBmb3IgbGlidGhyaWZ0LTx2ZXJzaW9uPi5qYXIgaW4gdGhlIGJ1aWxkL2xpYnMgZGlyZWN0b3J5LgorCitUaGUgZGVmYXVsdCBidWlsZCB3aWxsIHJ1biB0aGUgdW5pdCB0ZXN0cyB3aGljaCBleHBlY3QgYSB1c2FibGUKK1RocmlmdCBjb21waWxlciB0byBleGlzdCBvbiB0aGUgc3lzdGVtLiBZb3UgaGF2ZSB0d28gY2hvaWNlcyBmb3IKK3RoYXQuCisKKyogQnVpbGQgdGhlIFRocmlmdCBleGVjdXRhYmxlIGZyb20gc291cmNlIGF0IHRoZSBkZWZhdWx0CisgIGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgdHJlZS4gVGhlIHByb2plY3QgaXMgY29uZmlndXJlZAorICB0byBsb29rIGZvciBpdCB0aGVyZS4KKyogSW5zdGFsbCB0aGUgcHVibGlzaGVkIGJpbmFyeSBkaXN0cmlidXRpb24gdG8gaGF2ZSBUaHJpZnQKKyAgZXhlY3V0YWJsZSBpbiBhIGtub3duIGxvY2F0aW9uIGFuZCBhZGQgdGhlIHBhdGggdG8gdGhlCisgIH4vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBmaWxlIHVzaW5nIHRoZSBwcm9wZXJ0eSBuYW1lCisgICJ0aHJpZnQuY29tcGlsZXIiLiBGb3IgZXhhbXBsZSB0aGlzIHdvdWxkIHNldCB0aGUgcGF0aCBpbgorICBhIFdpbmRvd3MgYm94IGlmIFRocmlmdCB3YXMgaW5zdGFsbGVkIHVuZGVyIEM6XFRocmlmdAorCisgICAgdGhyaWZ0LmNvbXBpbGVyPUM6L1RocmlmdC90aHJpZnQuZXhlCisKK1RvIGp1c3QgYnVpbGQgdGhlIGxpYnJhcnkgd2l0aG91dCBydW5uaW5nIHVuaXQgdGVzdHMgeW91IHNpbXBseSBkbyB0aGlzLgorCisgICAgLi9ncmFkbGV3IGFzc2VtYmxlCisKK1RvIGluc3RhbGwgdGhlIGxpYnJhcnkgaW4gdGhlIGxvY2FsIE1hdmVuIHJlcG9zaXRvcnkgbG9jYXRpb24KK3doZXJlIG90aGVyIE1hdmVuIG9yIEdyYWRsZSBidWlsZHMgY2FuIHJlZmVyZW5jZSBpdCBzaW1wbHkgZG8gdGhpcy4KKworICAgIC4vZ3JhZGxldyBpbnN0YWxsCisKK1RoZSBsaWJyYXJ5IHdpbGwgYmUgcGxhY2VkIGluIHlvdXIgaG9tZSBkaXJlY3RvcnkgdW5kZXIgLm0yL3JlcG9zaXRvcnkKIAogVG8gaW5jbHVkZSBUaHJpZnQgaW4geW91ciBhcHBsaWNhdGlvbnMgc2ltcGx5IGFkZCBsaWJ0aHJpZnQuamFyIHRvIHlvdXIKIGNsYXNzcGF0aCwgb3IgaW5zdGFsbCBpZiBpbiB5b3VyIGRlZmF1bHQgc3lzdGVtIGNsYXNzcGF0aCBvZiBjaG9pY2UuCkBAIC0zOSwxNSArODAsMTA2IEBACiAKIEJ1aWxkIFRocmlmdCBiZWhpbmQgYSBwcm94eToKIAotICAgIGFudCAtRHByb3h5LmVuYWJsZWQ9MSAtRHByb3h5Lmhvc3Q9bXlwcm94eWhvc3QgLURwcm94eS51c2VyPXRocmlmdHVzZXIgLURwcm94eS5wYXNzPXRvcHNlY3JldAorICAgIC4vZ3JhZGxldyAtRGh0dHAucHJveHlIb3N0PW15cHJveHlob3N0IC1EaHR0cC5wcm94eVBvcnQ9ODA4MCAtRGh0dHAucHJveHlVc2VyPXRocmlmdHVzZXIgLURodHRwLnByb3h5UGFzc3dvcmQ9dG9wc2VjcmV0CiAKIG9yIHZpYQogCi0gICAgLi9jb25maWd1cmUgLS13aXRoLWphdmEgQU5UX0ZMQUdTPSctRHByb3h5LmVuYWJsZWQ9MSAtRHByb3h5Lmhvc3Q9bXlwcm94eWhvc3QgLURwcm94eS51c2VyPXRocmlmdHVzZXIgLURwcm94eS5wYXNzPXRvcHNlY3JldCcKKyAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtamF2YSBHUkFETEVfT1BUUz0nLURodHRwLnByb3h5SG9zdD1teXByb3h5aG9zdCAtRGh0dHAucHJveHlQb3J0PTgwODAgLURodHRwLnByb3h5VXNlcj10aHJpZnR1c2VyIC1EaHR0cC5wcm94eVBhc3N3b3JkPXRvcHNlY3JldCcKKworCitVbml0IFRlc3QgSFRNTCBSZXBvcnRzCis9PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBidWlsZCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYW4gSFRNTCBVbml0IFRlc3QgcmVwb3J0LiBUaGlzIGNhbiBiZSBmb3VuZAordW5kZXIgYnVpbGQvcmVwb3J0cy90ZXN0cy90ZXN0L2luZGV4Lmh0bWwuIEl0IGNhbiBiZSB2aWV3ZWQgd2l0aCBhIGJyb3dzZXIKK2RpcmVjdGx5IGZyb20gdGhhdCBsb2NhdGlvbi4KKworCitDbG92ZXIgQ29kZSBDb3ZlcmFnZSBmb3IgVGhyaWZ0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBidWlsZCB3aWxsIG9wdGlvbmFsbHkgZ2VuZXJhdGUgQ2xvdmVyIENvZGUgY292ZXJhZ2UgaWYgdGhlIEdyYWRsZSBwcm9wZXJ0eQorYGNsb3ZlckVuYWJsZWQ9dHJ1ZWAgaXMgc2V0IGluIH4vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBvciBvbiB0aGUgY29tbWFuZCBsaW5lCit2aWEgYC1QY2xvdmVyRW5hYmxlZD10cnVlYC4gVGhlIGdlbmVyYXRlZCByZXBvcnQgY2FuIGJlIGZvdW5kIHVuZGVyIHRoZSBsb2NhdGlvbgorYnVpbGQvcmVwb3J0cy9jbG92ZXIvaHRtbC9pbmRleC5odG1sLiBJdCBjYW4gYmUgdmlld2VkIHdpdGggYSBicm93c2VyCitkaXJlY3RseSBmcm9tIHRoYXQgbG9jYXRpb24uIEFkZGl0aW9uYWxseSwgYSBQREYgcmVwb3J0IGlzIGdlbmVyYXRlZCBhbmQgaXMgZm91bmQKK3VuZGVyIHRoZSBsb2NhdGlvbiBidWlsZC9yZXBvcnRzL2Nsb3Zlci9jbG92ZXIucGRmLgorCitUaGUgZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBidWlsZCwgdW5pdCB0ZXN0LCBhbmQgZ2VuZXJhdGUgQ2xvdmVyIHJlcG9ydHM6CisKKyAgICAuL2dyYWRsZXcgLVBjbG92ZXJFbmFibGVkPXRydWUKKworCitQdWJsaXNoaW5nIE1hdmVuIEFydGlmYWN0cyB0byBNYXZlbiBDZW50cmFsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBBdXRvbWFrZSBidWlsZCBnZW5lcmF0ZXMgYSBNYWtlZmlsZSB0aGF0IHByb3ZpZGVzIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMKK3doZW4geW91IHJ1biB0aGUgYnVpbGQgcHJvdmlkZWQgdGhlIGNvbmZpZ3VyZS5hYyBoYXMgYmVlbiBzZXQgd2l0aCB0aGUgY29ycmVjdAordmVyc2lvbiBudW1iZXIuIFRoZSBHcmFkbGUgYnVpbGQgd2lsbCByZWNlaXZlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgYnVpbGQuCitUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBDTWFrZSBidWlsZCwgdGhlIHZhbHVlIGZyb20gdGhlIGNvbmZpZ3VyZS5hYyBmaWxlIHdpbGwKK2JlIHVzZWQgaWYgeW91IGV4ZWN1dGUgdGhlc2UgY29tbWFuZHM6CisKKyAgICBtYWtlIG1hdmVuLXB1Ymxpc2ggICAtLSBUaGlzIGlzIGZvciBhbiBBdXRvbWFrZSBMaW51eCBidWlsZAorICAgIG1ha2UgTWF2ZW5QdWJsaXNoICAgIC0tIFRoaXMgaXMgZm9yIGEgQ01ha2UgZ2VuZXJhdGVkIGJ1aWxkCisKK1RoZSB1cGxvYWRBcmNoaXZlcyB0YXNrIGluIEdyYWRsZSBpcyBwcmVjb25maWd1cmVkIHdpdGggYWxsIG5lY2Vzc2FyeSBkZXRhaWxzCit0byBzaWduIGFuZCBwdWJsaXNoIHRoZSBhcnRpZmFjdHMgZnJvbSB0aGUgYnVpbGQgdG8gdGhlIEFwYWNoZSBNYXZlbiBzdGFnaW5nCityZXBvc2l0b3J5LiBUaGUgdGFzayByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGV4dGVybmFsbHkgcHJvdmlkZWQgcHJvcGVydGllcyB0bworYXV0aGVudGljYXRlIHRvIHRoZSByZXBvc2l0b3J5IGFuZCBzaWduIHRoZSBhcnRpZmFjdHMuIFRoZSBwcmVmZXJyZWQgYXBwcm9hY2gKK2lzIHRvIGNyZWF0ZSBvciBlZGl0IHRoZSB+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgZmlsZSBhbmQgYWRkIHRoZSBmb2xsb3dpbmcKK3Byb3BlcnRpZXMgdG8gaXQuCisKKyAgICAjIFNpZ25pbmcga2V5IGluZm9ybWF0aW9uIGZvciBhcnRpZmFjdHMgUEdQIHNpZ25hdHVyZSAodmFsdWVzIGFyZSBleGFtcGxlcykKKyAgICBzaWduaW5nLmtleUlkPTI0ODc1RDczCisgICAgc2lnbmluZy5wYXNzd29yZD1zZWNyZXQKKyAgICBzaWduaW5nLnNlY3JldEtleVJpbmdGaWxlPS9Vc2Vycy9tZS8uZ251cGcvc2VjcmluZy5ncGcKKworICAgICMgQXBhY2hlIE1hdmVuIHN0YWdpbmcgcmVwb3NpdG9yeSB1c2VyIGNyZWRlbnRpYWxzCisgICAgbWF2ZW5Vc2VyPW1lTXlzZWxmQW5kSQorICAgIG1hdmVuUGFzc3dvcmQ9TXlTdXBlckF3ZXNvbWVTZWNyZXRQYXNzd29yZAorCitOT1RFOiBJZiB5b3UgZG8gbm90IGhhdmUgYSBzZWNyaW5nLmdwZyBmaWxlLCBzZWUgdGhlCitbZ3JhZGxlIHNpZ25pbmcgZG9jc10oaHR0cHM6Ly9kb2NzLmdyYWRsZS5vcmcvY3VycmVudC91c2VyZ3VpZGUvc2lnbmluZ19wbHVnaW4uaHRtbCkKK2ZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGdlbmVyYXRlIGl0LgorCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG1hbnVhbGx5IHB1Ymxpc2ggdXNpbmcgdGhlIEdyYWRsZSBidWlsZCBkaXJlY3RseS4KK1dpdGggdGhlIGtleSBpbmZvcm1hdGlvbiBhbmQgY3JlZGVudGlhbHMgaW4gcGxhY2UgdGhlIGZvbGxvd2luZyB3aWxsIGdlbmVyYXRlCitpZiBuZWVkZWQgdGhlIGJ1aWxkIGFydGlmYWN0cyBhbmQgcHJvY2VlZCB0byBwdWJsaXNoIHRoZSByZXN1bHRzLgorCisgICAgLi9ncmFkbGV3IC1QcmVsZWFzZT10cnVlIHVwbG9hZEFyY2hpdmVzCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIHRhcmdldCByZXBvc2l0b3J5IGZvciB0aGUgTWF2ZW4gUHVibGljYXRpb24KK2J5IHVzaW5nIGEgR3JhZGxlIHByb3BlcnR5LCBmb3IgZXhhbXBsZSB5b3UgY2FuIHB1Ymxpc2ggc2lnbmVkIEpBUiBmaWxlcyB0byB5b3VyCitjb21wYW55IGludGVybmFsIHNlcnZlciBpZiB5b3UgYWRkIHRoaXMgdG8gdGhlIGNvbW1hbmQgbGluZSBvciBpbiB0aGUKK34vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBmaWxlLiBUaGUgVVJMIGJlbG93IGFzc3VtZXMgYSBOZXh1cyBSZXBvc2l0b3J5LgorCisgICAgbWF2ZW4tcmVwb3NpdG9yeS11cmw9aHR0cHM6Ly9teS5jb21wYW55LmNvbS9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMgorCitPciB0aGUgc2FtZSBvbiB0aGUgY29tbWFuZCBsaW5lOgorCisgICAgLi9ncmFkbGV3IC1QbWF2ZW4tcmVwb3NpdG9yeS11cmw9aHR0cHM6Ly9teS5jb21wYW55LmNvbS9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMiAtUHJlbGVhc2U9dHJ1ZSAtUHRocmlmdC52ZXJzaW9uPTAuMTEuMCB1cGxvYWRBcmNoaXZlcwogCiAKIERlcGVuZGVuY2llcwogPT09PT09PT09PT09CiAKLUFwYWNoZSBBbnQKLWh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8KK0dyYWRsZQoraHR0cDovL2dyYWRsZS5vcmcvCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAxLjAKKworVGhlIHNpZ25hdHVyZSBvZiB0aGUgJ3Byb2Nlc3MnIG1ldGhvZCBpbiBUQXN5bmNQcm9jZXNzb3IgYW5kIFRQcm9jZXNzb3IgaGFzCitjaGFuZ2VkIHRvIHJlbW92ZSBhIGJvb2xlYW4gcmV0dXJuIHR5cGUgYW5kIHRvIGluc3RlYWQgcmVseSBvbiBFeGNlcHRpb25zLgorCisjIyAwLjEyLjAKKworVGhlIGFjY2VzcyBtb2RpZmllciBvZiB0aGUgQXV0b0V4cGFuZGluZ0J1ZmZlciBjbGFzcyBoYXMgYmVlbiBjaGFuZ2VkIGZyb20KK3B1YmxpYyB0byBkZWZhdWx0IChwYWNrYWdlKSBhbmQgd2lsbCBubyBsb25nZXIgYmUgYWNjZXNzaWJsZSBieSB0aGlyZC1wYXJ0eQorbGlicmFyaWVzLgorCitUaGUgYWNjZXNzIG1vZGlmaWVyIG9mIHRoZSBTaG9ydFN0YWNrIGNsYXNzIGhhcyBiZWVuIGNoYW5nZWQgZnJvbQorcHVibGljIHRvIGRlZmF1bHQgKHBhY2thZ2UpIGFuZCB3aWxsIG5vIGxvbmdlciBiZSBhY2Nlc3NpYmxlIGJ5IHRoaXJkLXBhcnR5CitsaWJyYXJpZXMuCisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2FuZHJvaWQvYnVpbGQuZ3JhZGxlIGIvbGliL2phdmEvYW5kcm9pZC9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5ODQyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2FuZHJvaWQvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworYXBwbHkgcGx1Z2luOiAnY29tLmFuZHJvaWQubGlicmFyeScKKworYW5kcm9pZCB7CisgICAgY29tcGlsZVNka1ZlcnNpb24gMjMKKyAgICBidWlsZFRvb2xzVmVyc2lvbiAiMjMuMC4xIgorICAgIHVzZUxpYnJhcnkgJ29yZy5hcGFjaGUuaHR0cC5sZWdhY3knCisgICAgc291cmNlU2V0cy5tYWluLmphdmEgeworICAgICAgICBzcmNEaXIgJy4uL3NyYycKKyAgICAgICAgZXhjbHVkZSAnb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEnCisgICAgICAgIGV4Y2x1ZGUgJ29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhJworICAgICAgICBleGNsdWRlICdvcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YScKKyAgICB9Cit9CisKK3JlcG9zaXRvcmllcyB7CisgICAgbWF2ZW5DZW50cmFsKCkKK30KK2RlcGVuZGVuY2llcyB7CisgICAgY29tcGlsZSAnb3JnLnNsZjRqOnNsZjRqLWFwaToxLjcuMTMnCisgICAgY29tcGlsZSAnamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaToyLjUnCisgICAgY29tcGlsZSAnb3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY29yZTo0LjQuNCcKK30KKworYnVpbGRzY3JpcHQgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIG1hdmVuQ2VudHJhbCgpCisgICAgfQorICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjEuNS4wJworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2FuZHJvaWQvc2V0dGluZ3MuZ3JhZGxlIGIvbGliL2phdmEvYW5kcm9pZC9zZXR0aW5ncy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlOTdiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2FuZHJvaWQvc2V0dGluZ3MuZ3JhZGxlCkBAIC0wLDAgKzEgQEAKK3Jvb3RQcm9qZWN0Lm5hbWU9J3RocmlmdCcKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2FuZHJvaWQvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYi9qYXZhL2FuZHJvaWQvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FiZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvYW5kcm9pZC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCBwYWNrYWdlPSJvcmcuYXBhY2hlLnRocmlmdCI+CisgIDxhcHBsaWNhdGlvbiAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2J1aWxkLmdyYWRsZSBiL2xpYi9qYXZhL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjBkMjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVXNpbmcgdGhlIGxlZ2FjeSBwbHVnaW4gY2xhc3NwYXRoIGZvciBDbG92ZXIgc28gaXQgY2FuIGJlIGxvYWRlZCBvcHRpb25hbGx5CitidWlsZHNjcmlwdCB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgbWF2ZW5DZW50cmFsKCkKKyAgICAgICAgZ29vZ2xlKCkKKyAgICAgICAgamNlbnRlcigpCisgICAgICAgIGdyYWRsZVBsdWdpblBvcnRhbCgpCisgICAgfQorCisgICAgZGVwZW5kZW5jaWVzIHsKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYm11c2Noa286Z3JhZGxlLWNsb3Zlci1wbHVnaW46Mi4yLjEnCisgICAgfQorfQorCitwbHVnaW5zIHsKKyAgICBpZCAnamF2YScKKyAgICBpZCAnbWF2ZW4nCisgICAgaWQgJ3NpZ25pbmcnCisgICAgaWQgJ2NvbS5naXRodWIuam9obnJlbmdlbG1hbi5zaGFkb3cnIHZlcnNpb24gJzQuMC40JworfQorCitkZXNjcmlwdGlvbiA9ICdBcGFjaGUgVGhyaWZ0IEphdmEgTGlicmFyeScKKworZGVmYXVsdFRhc2tzICdidWlsZCcKKworLy8gVmVyc2lvbiBjb21wb25lbnRzIGZvciB0aGlzIHByb2plY3QKK2dyb3VwID0gcHJvcGVydHkoJ3RocmlmdC5ncm91cGlkJykKKworaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb2plY3QucmVsZWFzZSkpIHsKKyAgICB2ZXJzaW9uID0gcHJvcGVydHkoJ3RocmlmdC52ZXJzaW9uJykKK30gZWxzZSB7CisgICAgdmVyc2lvbiA9IHByb3BlcnR5KCd0aHJpZnQudmVyc2lvbicpICsgJy1TTkFQU0hPVCcKK30KKworLy8gS2VlcGluZyB0aGUgcmVzdCBvZiB0aGUgYnVpbGQgbG9naWMgaW4gZnVuY3Rpb25hbCBuYW1lZCBzY3JpcHRzIGZvciBjbGFyaXR5CithcHBseSBmcm9tOiAnZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvc291cmNlQ29uZmlndXJhdGlvbi5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2FkZGl0aW9uYWxBcnRpZmFjdHMuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS91bml0VGVzdHMuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9jbG92ZXJDb3ZlcmFnZS5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2Z1bmN0aW9uYWxUZXN0cy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9jb2RlUXVhbGl0eUNoZWNrcy5ncmFkbGUnCmRpZmYgLS1naXQgYS9saWIvamF2YS9idWlsZC5wcm9wZXJ0aWVzIGIvbGliL2phdmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlZjY2Yi4uMDAwMDAwMAotLS0gYS9saWIvamF2YS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotdGhyaWZ0LnZlcnNpb249MC45LjMtMQotdGhyaWZ0Lmdyb3VwaWQ9b3JnLmFwYWNoZS50aHJpZnQKLXJlbGVhc2U9dHJ1ZQotCi0jIExvY2FsIEluc3RhbGwgcGF0aHMKLWluc3RhbGwucGF0aD0vdXNyL2xvY2FsL2xpYgotaW5zdGFsbC5qYXZhZG9jLnBhdGg9JHtpbnN0YWxsLnBhdGh9Ci0KLSMgTWF2ZW4gZGVwZW5kZW5jeSBkb3dubG9hZCBsb2NhdGlvbnMKLW12bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCi1hcGFjaGUucmVwbz1odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9yZWxlYXNlcwotbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQotbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCi0KLSMgQXBhY2hlIE1hdmVuIHB1Ymxpc2ggCi1saWNlbnNlPWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQKLW1hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL3NlcnZpY2UvbG9jYWwvc3RhZ2luZy9kZXBsb3kvbWF2ZW4yCi1tYXZlbi1yZXBvc2l0b3J5LWlkPWFwYWNoZS5yZWxlYXNlcy5odHRwcwotCi0jIEphciBWZXJzaW9ucyAKLW12bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCi0KLSMgRGVwZW5kZW5jeSB2ZXJzaW9ucwotaHR0cGNsaWVudC52ZXJzaW9uPTQuNC4xCi1odHRwY29yZS52ZXJzaW9uPTQuNC4xCi1zbGY0ai52ZXJzaW9uPTEuNy4xMgotc2VydmxldC52ZXJzaW9uPTIuNQotCmRpZmYgLS1naXQgYS9saWIvamF2YS9idWlsZC54bWwgYi9saWIvamF2YS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0NjI4ZGYuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci08cHJvamVjdCBuYW1lPSJsaWJ0aHJpZnQiIGRlZmF1bHQ9ImRpc3QiIGJhc2VkaXI9Ii4iCi0gIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiPgotCi0gIDxkZXNjcmlwdGlvbj5UaHJpZnQgQnVpbGQgRmlsZTwvZGVzY3JpcHRpb24+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQucm9vdCIgbG9jYXRpb249Ii4uLy4uLyIvPgotICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmFydGlmYWN0aWQiIHZhbHVlPSJsaWJ0aHJpZnQiLz4KLQotICA8IS0tIEluY2x1ZGUgdGhlIGJhc2UgcHJvcGVydGllcyBmaWxlIC0tPgotICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgotCi0gIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0KLSAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259Ij4KLSAgICA8aXNzZXQgcHJvcGVydHk9InJlbGVhc2UiLz4KLSAgPC9jb25kaXRpb24+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0tc25hcHNob3QiLz4KLQotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9IiR7dGhyaWZ0LmFydGlmYWN0aWR9LSR7dmVyc2lvbn0iLz4KLQotICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS9zcmMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vYnVpbGQiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYi5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vbGliIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50b29scy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vdG9vbHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy50ZXN0IiBsb2NhdGlvbj0idGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvYy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vamF2YWRvYyIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudGVzdC5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vdGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC50aHJpZnQuaG9tZSIgbG9jYXRpb249IiR7dGhyaWZ0LnJvb3R9L3Rlc3QiLz4KLQotICA8cHJvcGVydHkgbmFtZT0iZ2VuIiBsb2NhdGlvbj0iZ2VuLWphdmEiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImdlbmJlYW4iIGxvY2F0aW9uPSJnZW4tamF2YWJlYW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9ImdlbnJldXNlIiBsb2NhdGlvbj0iZ2VuLWphdmFyZXVzZSIvPgotICA8cHJvcGVydHkgbmFtZT0iZ2VuZnVsbGNhbWVsIiBsb2NhdGlvbj0iZ2VuLWZ1bGxjYW1lbCIvPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LmphciIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5qYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LXRlc3QuamFyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jLmphci5maWxlIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9LyR7ZmluYWwubmFtZX0tamF2YWRvYy5qYXIiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNvdXJjZS5qYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LXNvdXJjZXMuamFyIi8+Ci0KLSAgPCEtLSBKdW5pdCBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5qdW5pdC5vdXRwdXQuZm9ybWF0IiB2YWx1ZT0icGxhaW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QudGltZW91dCIgdmFsdWU9IjIwMDAwMDAiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3Quc3JjLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vdGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5sb2cuZGlyIiB2YWx1ZT0iJHtidWlsZC50ZXN0LmRpcn0vbG9nIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnBvcnQiIHZhbHVlPSI5MDkwIi8+Ci0KLSAgPCEtLSBtYXZlbiBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0icG9tLnhtbCIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LnBvbSIvPgotCi0gIDxwYXRoIGlkPSJjb21waWxlLmNsYXNzcGF0aCI+Ci0gICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ij4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIi8+Ci0gICAgPC9maWxlc2V0PgotICA8L3BhdGg+Ci0KLSAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KLSAgICA8cGF0aCByZWZpZD0iY29tcGlsZS5jbGFzc3BhdGgiLz4KLSAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtlbnYuQ0xBU1NQQVRIfSIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC50ZXN0LmRpcn0iLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amFyLmZpbGV9Ii8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuamFyLmZpbGV9Ii8+Ci0KLSAgPC9wYXRoPgotCi0gIDwhLS0gVGFza3MgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0ic2V0dXAuaW5pdCxtdm4uaW5pdCIgdW5sZXNzPSJpbml0LmZpbmlzaGVkIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iaW5pdC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJzZXR1cC5pbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC50b29scy5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC50ZXN0LmRpcn0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGQuZGlyfSIgc291cmNlPSIxLjUiIHRhcmdldD0iMS41IgotICAgIGRlYnVnPSJ0cnVlIiBjbGFzc3BhdGhyZWY9ImNvbXBpbGUuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGVuY29kaW5nPSJVVEYtOCI+Ci0gICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDp1bmNoZWNrZWQiLz4KLSAgICA8L2phdmFjPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlcGVuZHM9ImluaXQiPgotICAgIDxqYXZhZG9jIHNvdXJjZXBhdGg9IiR7c3JjfSIgZGVzdGRpcj0iJHtqYXZhZG9jLmRpcn0iCi0gICAgICB2ZXJzaW9uPSJ0cnVlIiB3aW5kb3d0aXRsZT0iVGhyaWZ0IEphdmEgQVBJIiBkb2N0aXRsZT0iVGhyaWZ0IEphdmEgQVBJIgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgPC9qYXZhZG9jPgotICAgIDxqYXIgamFyZmlsZT0iJHtqYXZhZG9jLmphci5maWxlfSIgYmFzZWRpcj0iJHtqYXZhZG9jLmRpcn0iPgotICAgICAgPG1hbmlmZXN0PgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICA8L21hbmlmZXN0PgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfS9NRVRBLUlORiIvPgotICAgIDxjb3B5IGZpbGU9IiR7dGhyaWZ0LnJvb3R9L0xJQ0VOU0UiIHRvZmlsZT0iJHtidWlsZC5kaXJ9L01FVEEtSU5GL0xJQ0VOU0UudHh0Ii8+Ci0gICAgPGNvcHkgZmlsZT0iJHt0aHJpZnQucm9vdH0vTk9USUNFIiB0b2ZpbGU9IiR7YnVpbGQuZGlyfS9NRVRBLUlORi9OT1RJQ0UudHh0Ii8+Ci0gICAgPGphciBqYXJmaWxlPSIke2phci5maWxlfSI+Ci0gICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiB2YWx1ZT0iMiIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1TeW1ib2xpY05hbWUiIHZhbHVlPSIke3RocmlmdC5ncm91cGlkfSIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1OYW1lIiB2YWx1ZT0iQXBhY2hlIFRocmlmdCIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1WZXJzaW9uIiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1EZXNjcmlwdGlvbiIgdmFsdWU9IkFwYWNoZSBUaHJpZnQgbGlicmFyeSIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1MaWNlbnNlIiB2YWx1ZT0iJHtsaWNlbnNlfSIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5IiB2YWx1ZT0ibGF6eSIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkV4cG9ydC1QYWNrYWdlIiB2YWx1ZT0iJHt0aHJpZnQuZ3JvdXBpZH0uYXN5bmM7dXNlczo9JnF1b3Q7JHt0aHJpZnQuZ3JvdXBpZH0ucHJvdG9jb2wsJHt0aHJpZnQuZ3JvdXBpZH0udHJhbnNwb3J0LG9yZy5zbGY0aiwke3RocmlmdC5ncm91cGlkfSZxdW90Ozt2ZXJzaW9uPSZxdW90OyR7dmVyc2lvbn0mcXVvdDssJHt0aHJpZnQuZ3JvdXBpZH0ucHJvdG9jb2w7dXNlczo9JnF1b3Q7JHt0aHJpZnQuZ3JvdXBpZH0udHJhbnNwb3J0LCR7dGhyaWZ0Lmdyb3VwaWR9LCR7dGhyaWZ0Lmdyb3VwaWR9LnNjaGVtZSZxdW90Ozt2ZXJzaW9uPSZxdW90OyR7dmVyc2lvbn0mcXVvdDssJHt0aHJpZnQuZ3JvdXBpZH0uc2VydmVyO3VzZXM6PSZxdW90OyR7dGhyaWZ0Lmdyb3VwaWR9LnRyYW5zcG9ydCwke3RocmlmdC5ncm91cGlkfS5wcm90b2NvbCwke3RocmlmdC5ncm91cGlkfSxvcmcuc2xmNGosamF2YXguc2VydmxldCxqYXZheC5zZXJ2bGV0Lmh0dHAmcXVvdDs7dmVyc2lvbj0mcXVvdDske3ZlcnNpb259JnF1b3Q7LCR7dGhyaWZ0Lmdyb3VwaWR9LnRyYW5zcG9ydDt1c2VzOj0mcXVvdDske3RocmlmdC5ncm91cGlkfS5wcm90b2NvbCwke3RocmlmdC5ncm91cGlkfSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50LG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMsb3JnLmFwYWNoZS5odHRwLmVudGl0eSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMsb3JnLmFwYWNoZS5odHRwLG9yZy5zbGY0aixqYXZheC5uZXQuc3NsLGphdmF4Lm5ldCxqYXZheC5zZWN1cml0eS5zYXNsLGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2smcXVvdDs7dmVyc2lvbj0mcXVvdDske3ZlcnNpb259JnF1b3Q7LCR7dGhyaWZ0Lmdyb3VwaWR9O3VzZXM6PSZxdW90OyR7dGhyaWZ0Lmdyb3VwaWR9LnByb3RvY29sLCR7dGhyaWZ0Lmdyb3VwaWR9LmFzeW5jLCR7dGhyaWZ0Lmdyb3VwaWR9LnNlcnZlciwke3RocmlmdC5ncm91cGlkfS50cmFuc3BvcnQsb3JnLnNsZjRqLG9yZy5hcGFjaGUubG9nNGosJHt0aHJpZnQuZ3JvdXBpZH0uc2NoZW1lJnF1b3Q7O3ZlcnNpb249JnF1b3Q7JHt2ZXJzaW9ufSZxdW90Oywke3RocmlmdC5ncm91cGlkfS5tZXRhX2RhdGE7dXNlczo9JnF1b3Q7JHt0aHJpZnQuZ3JvdXBpZH0mcXVvdDs7dmVyc2lvbj0mcXVvdDske3ZlcnNpb259JnF1b3Q7LCR7dGhyaWZ0Lmdyb3VwaWR9LnNjaGVtZTt1c2VzOj0mcXVvdDske3RocmlmdC5ncm91cGlkfS5wcm90b2NvbCwke3RocmlmdC5ncm91cGlkfSZxdW90Ozt2ZXJzaW9uPSZxdW90OyR7dmVyc2lvbn0mcXVvdDsiLz4KLSAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcG9ydC1QYWNrYWdlIiB2YWx1ZT0iamF2YXgubmV0LGphdmF4Lm5ldC5zc2wsamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjayxqYXZheC5zZWN1cml0eS5zYXNsLGphdmF4LnNlcnZsZXQ7cmVzb2x1dGlvbjo9b3B0aW9uYWwsamF2YXguc2VydmxldC5odHRwO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5zbGY0ajtyZXNvbHV0aW9uOj1vcHRpb25hbDt2ZXJzaW9uPSZxdW90O1sxLjQsMikmcXVvdDssb3JnLmFwYWNoZS5odHRwLmNsaWVudDtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmh0dHAucGFyYW1zO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cC5lbnRpdHk7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cDtyZXNvbHV0aW9uOj1vcHRpb25hbCIvPgotICAgICAgPC9tYW5pZmVzdD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXJ9Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90aHJpZnQvKiovKi5jbGFzcyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qLnR4dCIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InBhY2suc3JjIj4KLSAgICA8amFyIGphcmZpbGU9IiR7c291cmNlLmphci5maWxlfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwiIGRlcGVuZHM9ImRpc3QsamF2YWRvYyI+Ci0gICAgPGNvcHkgdG9kaXI9IiR7aW5zdGFsbC5wYXRofSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfSIgaW5jbHVkZXM9IiouamFyIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQubGliLmRpcn0iIGluY2x1ZGVzPSIqLmphciIvPgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHtpbnN0YWxsLmphdmFkb2MucGF0aH0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmFkb2MuZGlyfSIgaW5jbHVkZXM9IioqLyoiLz4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtnZW59Ii8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7Z2VuYmVhbn0iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtnZW5yZXVzZX0iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtnZW5mdWxsY2FtZWx9Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ib3B0aW9uYWwtZ2VuZXJhdGUiIHVubGVzcz0ibm8tZ2VuLXRocmlmdCI+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJnZW5lcmF0ZSI+Ci0gICAgPC9hbnRjYWxsPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdCIgZGVzY3JpcHRpb249IkJ1aWxkIHRoZSB0ZXN0IHN1aXRlIGNsYXNzZXMiIGRlcGVuZHM9Im9wdGlvbmFsLWdlbmVyYXRlLGRpc3QiPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke2dlbn0iIGRlc3RkaXI9IiR7YnVpbGQudGVzdC5kaXJ9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGVuY29kaW5nPSJVVEYtOCI+Ci0gICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDpkZXByZWNhdGlvbiIvPgotICAgICAgPCEtLTxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OnVuY2hlY2tlZCIvPi0tPgotICAgIDwvamF2YWM+Ci0gICAgPGphdmFjIGRlYnVnPSJ0cnVlIiBzcmNkaXI9IiR7Z2VuYmVhbn0iIGRlc3RkaXI9IiR7YnVpbGQudGVzdC5kaXJ9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGVuY29kaW5nPSJVVEYtOCI+Ci0gICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDpkZXByZWNhdGlvbiIvPgotICAgICAgPCEtLTxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OnVuY2hlY2tlZCIvPi0tPgotICAgIDwvamF2YWM+Ci0gICAgPGphdmFjIGRlYnVnPSJ0cnVlIiBzcmNkaXI9IiR7Z2VucmV1c2V9IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiPgotICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6ZGVwcmVjYXRpb24iLz4KLSAgICAgIDwhLS08Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDp1bmNoZWNrZWQiLz4tLT4KLSAgICA8L2phdmFjPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke2dlbmZ1bGxjYW1lbH0iIGRlc3RkaXI9IiR7YnVpbGQudGVzdC5kaXJ9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGVuY29kaW5nPSJVVEYtOCI+Ci0gICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDpkZXByZWNhdGlvbiIvPgotICAgICAgPCEtLTxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OnVuY2hlY2tlZCIvPi0tPgotICAgIDwvamF2YWM+Ci0gICAgPGphdmFjIGRlYnVnPSJ0cnVlIiBzcmNkaXI9IiR7c3JjLnRlc3R9IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiPgotICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6ZGVwcmVjYXRpb24iLz4KLSAgICAgIDwhLS08Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDp1bmNoZWNrZWQiLz4tLT4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLnRlc3QuZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLnRlc3R9IiBpbmNsdWRlcz0ibG9nNGoucHJvcGVydGllcyIvPgotICAgIDwvY29weT4KLSAgICA8amFyIGphcmZpbGU9IiR7dGVzdC5qYXIuZmlsZX0iIGJhc2VkaXI9IiR7YnVpbGQudGVzdC5kaXJ9Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ianVuaXQtdGVzdCIgZGVzY3JpcHRpb249IlJ1biB0aGUgSlVuaXQgdGVzdCBzdWl0ZSIgZGVwZW5kcz0iY29tcGlsZS10ZXN0Ij4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3QubG9nLmRpcn0iLz4KLSAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ0cnVlIiBzaG93b3V0cHV0PSIke3Rlc3Qub3V0cHV0fSIgdGltZW91dD0iJHt0ZXN0LnRpbWVvdXR9IgotICAgICAgaGFsdG9uZmFpbHVyZT0idHJ1ZSIgZXJyb3JQcm9wZXJ0eT0idGVzdHMuZmFpbGVkIiBmYWlsdXJlUHJvcGVydHk9InRlc3RzLmZhaWxlZCIKLSAgICAgIGZvcms9InRydWUiIGZvcmttb2RlPSJwZXJUZXN0IiBtYXhtZW1vcnk9IjUxMm0iCi0gICAgPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYnVpbGQudGVzdCIgdmFsdWU9IiR7YnVpbGQudGVzdC5kaXJ9Ii8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJ0ZXN0LnBvcnQiIHZhbHVlPSIke3Rlc3QucG9ydH0iLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIgdmFsdWU9IiR7c3JjLnRlc3R9Ly50cnVzdHN0b3JlIi8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIgdmFsdWU9InRocmlmdCIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC5rZXlTdG9yZSIgdmFsdWU9IiR7c3JjLnRlc3R9Ly5rZXlzdG9yZSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIiB2YWx1ZT0idGhyaWZ0Ii8+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPGZvcm1hdHRlciB0eXBlPSIke3Rlc3QuanVuaXQub3V0cHV0LmZvcm1hdH0iLz4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5sb2cuZGlyfSIgdW5sZXNzPSJ0ZXN0Y2FzZSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnNyYy5kaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIi8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovVGVzdENsaWVudC5qYXZhIi8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovVGVzdFNlcnZlci5qYXZhIi8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3QubG9nLmRpcn0iIGlmPSJ0ZXN0Y2FzZSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnNyYy5kaXJ9IiBpbmNsdWRlcz0iKiovJHt0ZXN0Y2FzZX0uamF2YSIvPgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgICA8ZmFpbCBpZj0idGVzdHMuZmFpbGVkIj5UZXN0cyBmYWlsZWQhPC9mYWlsPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImRlcHJlY2F0ZWQtdGVzdCIgZGVzY3JpcHRpb249IlJ1biB0aGUgbm9uLUpVbml0IHRlc3Qgc3VpdGUiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LkVxdWFsaXR5VGVzdCIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiLz4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuSmF2YUJlYW5zVGVzdCIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRoZSBmdWxsIHRlc3Qgc3VpdGUiIGRlcGVuZHM9Imp1bml0LXRlc3QsZGVwcmVjYXRlZC10ZXN0Ii8+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0Y2xpZW50IiBkZXNjcmlwdGlvbj0iUnVuIGEgdGVzdCBjbGllbnQiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCwgcnVuLXRlc3RjbGllbnQiLz4KLSAgPHRhcmdldCBuYW1lPSJydW4tdGVzdGNsaWVudCIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3QgY2xpZW50Ij4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdENsaWVudCIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIiBmb3JrPSJ0cnVlIj4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIgdmFsdWU9IiR7c3JjLnRlc3R9Ly50cnVzdHN0b3JlIi8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIgdmFsdWU9InRocmlmdCIvPgotICAgICAgPGFyZyBsaW5lPSIke3Rlc3RhcmdzfSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0c2VydmVyIiBkZXNjcmlwdGlvbj0iUnVuIGEgdGVzdCBzZXJ2ZXIiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCwgcnVuLXRlc3RzZXJ2ZXIiLz4KLSAgPHRhcmdldCBuYW1lPSJydW4tdGVzdHNlcnZlciIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3Qgc2VydmVyIj4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdFNlcnZlciIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIiBmb3JrPSJ0cnVlIj4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wua2V5U3RvcmUiIHZhbHVlPSIke3NyYy50ZXN0fS8ua2V5c3RvcmUiLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZCIgdmFsdWU9InRocmlmdCIvPgotICAgICAgPGFyZyBsaW5lPSIke3Rlc3RhcmdzfSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0bm9uYmxvY2tpbmdzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJSdW4gYSB0ZXN0IG5vbmJsb2NraW5nIHNlcnZlciIgZGVwZW5kcz0iY29tcGlsZS10ZXN0LCBydW4tdGVzdG5vbmJsb2NraW5nc2VydmVyIi8+Ci0gIDx0YXJnZXQgbmFtZT0icnVuLXRlc3Rub25ibG9ja2luZ3NlcnZlciIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3Qgbm9uYmxvY2tpbmcgc2VydmVyIj4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdE5vbmJsb2NraW5nU2VydmVyIgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSIke3Rlc3RhcmdzfSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSI+Ci0gICAgPCEtLSBHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1qYXZhIHNvdXJjZSAtLT4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6aGFzaGNvZGUgJHt0ZXN0LnRocmlmdC5ob21lfS9UaHJpZnRUZXN0LnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6aGFzaGNvZGUgJHt0ZXN0LnRocmlmdC5ob21lfS9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhOmhhc2hjb2RlICR7dGVzdC50aHJpZnQuaG9tZX0vT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0Ii8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpiZWFucyxub2NhbWVsICR7dGVzdC50aHJpZnQuaG9tZX0vSmF2YUJlYW5zVGVzdC50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhOmhhc2hjb2RlICR7dGVzdC50aHJpZnQuaG9tZX0vTWFueU9wdGlvbmFscy50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0ibWtkaXIiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLXAgJHtnZW5mdWxsY2FtZWx9Ii8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpoYXNoY29kZSxmdWxsY2FtZWwgLW91dCAke2dlbmZ1bGxjYW1lbH0gJHt0ZXN0LnRocmlmdC5ob21lfS9EZW5zZUxpbmtpbmdUZXN0LnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSJta2RpciIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItcCAke2dlbnJldXNlfSIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6cmV1c2Utb2JqZWN0cyAtb3V0ICR7Z2VucmV1c2V9ICR7dGVzdC50aHJpZnQuaG9tZX0vUmV1c2VPYmplY3RzLnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwcm94eSIgaWY9InByb3h5LmVuYWJsZWQiPgotICAgIDxzZXRwcm94eSBwcm94eWhvc3Q9IiR7cHJveHkuaG9zdH0iIHByb3h5cG9ydD0iJHtwcm94eS5wb3J0fSIKLSAgICAgIHByb3h5dXNlcj0iJHtwcm94eS51c2VyfSIgcHJveHlwYXNzd29yZD0iJHtwcm94eS5wYXNzfSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9InNldHVwLmluaXQsbXZuLmFudC50YXNrcy5jaGVjayxwcm94eSIgdW5sZXNzPSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KLSAgICA8Z2V0IHNyYz0iJHttdm4uYW50LnRhc2sudXJsfS8ke212bi5hbnQudGFzay5qYXJ9IiBkZXN0PSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5jaGVjayI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXZuLmFudC50YXNrcy5mb3VuZCI+Ci0gICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im12bi5pbml0IiBkZXBlbmRzPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+Ci0gICAgPCEtLSBEb3dubG9hZCBtdm4gYW50IHRhc2tzLCBkb3dubG9hZCBkZXBlbmRlbmNpZXMsIGFuZCBzZXR1cCBwb20gZmlsZSAtLT4KLSAgICA8dHlwZWRlZiB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgY2xhc3NwYXRoPSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIvPgotCi0gICAgPCEtLSByZW1vdGUgcmVwb3NpdG9yaWVzIHVzZWQgdG8gZG93bmxvYWQgZGVwZW5kZW5jaWVzIGZyb20gLS0+Ci0gICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9ImNlbnRyYWwiIHVybD0iJHttdm4ucmVwb30iLz4KLSAgICA8YXJ0aWZhY3Q6cmVtb3RlUmVwb3NpdG9yeSBpZD0iYXBhY2hlIiB1cmw9IiR7YXBhY2hlLnJlcG99Ii8+Ci0KLSAgICA8IS0tIFBvbSBmaWxlIGluZm9ybWF0aW9uIC0tPgotICAgIDxhcnRpZmFjdDpwb20gaWQ9InBvbSIKLSAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IgotICAgICAgYXJ0aWZhY3RJZD0iJHt0aHJpZnQuYXJ0aWZhY3RpZH0iCi0gICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IgotICAgICAgdXJsPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCi0gICAgICBuYW1lPSJBcGFjaGUgVGhyaWZ0IgotICAgICAgZGVzY3JpcHRpb249IlRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuIgotICAgICAgcGFja2FnaW5nPSJwb20iCi0gICAgPgotICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImNlbnRyYWwiLz4KLSAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJhcGFjaGUiLz4KLSAgICAgIDxsaWNlbnNlIG5hbWU9IlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAiIHVybD0iJHtsaWNlbnNlfSIvPgotICAgICAgPHNjbSBjb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKLSAgICAgICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCi0gICAgICAgICAgIHVybD0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiIC8+Ci0KLSAgICAgIDwhLS0gVGhyaWZ0IERldmVsb3BlcnMgLS0+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJtY3NsZWUiIG5hbWU9Ik1hcmsgU2xlZSIvPgotICAgICAgPGRldmVsb3BlciBpZD0iZHJlaXNzIiBuYW1lPSJEYXZpZCBSZWlzcyIvPgotICAgICAgPGRldmVsb3BlciBpZD0iYWRpdHlhIiBuYW1lPSJBZGl0eWEgQWdhcndhbCIvPgotICAgICAgPGRldmVsb3BlciBpZD0ibWFyY2siIG5hbWU9Ik1hcmMgS3dpYXRrb3dza2kiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Imp3YW5nIiBuYW1lPSJKYW1lcyBXYW5nIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJjcGlybyIgbmFtZT0iQ2hyaXMgUGlybyIvPgotICAgICAgPGRldmVsb3BlciBpZD0iYm1hdXJlciIgbmFtZT0iQmVuIE1hdXJlciIvPgotICAgICAgPGRldmVsb3BlciBpZD0ia2NsYXJrIiBuYW1lPSJLZXZpbiBDbGFyayIvPgotICAgICAgPGRldmVsb3BlciBpZD0iamFrZSIgbmFtZT0iSmFrZSBMdWNpYW5pIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJicnlhbmR1eGJ1cnkiIG5hbWU9IkJyeWFuIER1eGJ1cnkiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImVzdGV2ZSIgbmFtZT0iRXN0ZXZlIEZlcm5hbmRleiIvPgotICAgICAgPGRldmVsb3BlciBpZD0idG9kZCIgbmFtZT0iVG9kZCBMaXBjb24iLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImdlZWNob3JhbWEiIG5hbWU9IkFuZHJldyBNY0dlYWNoaWUiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Im1vbGluYXJvIiBuYW1lPSJBbnRob255IE1vbGluYXJvIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJyb2dlciIgbmFtZT0iUm9nZXIgTWVpZXIiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImpmYXJyZWxsIiBuYW1lPSJKYWtlIEZhcnJlbGwiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImplbnNnIiBuYW1lPSJKZW5zIEdleWVyIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJjYXJsIiBuYW1lPSJDYXJsIFlla3NpZ2lhbiIvPgotCi0gICAgICA8IS0tIFRocmlmdCBkZXBlbmRlbmNpZXMgbGlzdCAtLT4KLSAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5zbGY0aiIgYXJ0aWZhY3RJZD0ic2xmNGotYXBpIiB2ZXJzaW9uPSIke3NsZjRqLnZlcnNpb259Ii8+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJqYXZheC5zZXJ2bGV0IiBhcnRpZmFjdElkPSJzZXJ2bGV0LWFwaSIgdmVyc2lvbj0iJHtzZXJ2bGV0LnZlcnNpb259IiBzY29wZT0icHJvdmlkZWQiLz4KLSAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMiIGFydGlmYWN0SWQ9Imh0dHBjbGllbnQiIHZlcnNpb249IiR7aHR0cGNsaWVudC52ZXJzaW9ufSIvPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cyIgYXJ0aWZhY3RJZD0iaHR0cGNvcmUiIHZlcnNpb249IiR7aHR0cGNvcmUudmVyc2lvbn0iLz4KLSAgICA8L2FydGlmYWN0OnBvbT4KLQotICAgIDwhLS0gR2VuZXJhdGUgdGhlIHBvbSBmaWxlIC0tPgotICAgIDxhcnRpZmFjdDp3cml0ZXBvbSBwb21SZWZJZD0icG9tIiBmaWxlPSIke3BvbS54bWx9Ii8+Ci0KLSAgICA8IS0tIERvd25sb2FkIHRoZSBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgPGFydGlmYWN0OmRlcGVuZGVuY2llcyBmaWxlc2V0SWQ9ImJ1aWxkLWRlcGVuZGVuY3ktamFycyIgcG9tUmVmSWQ9InBvbSIvPgotCi0gICAgPCEtLSBDb3B5IHRoZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGJ1aWxkL2xpYiBkaXIgLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuZGlyfS9saWIiPgotICAgICAgPGZpbGVzZXQgcmVmaWQ9ImJ1aWxkLWRlcGVuZGVuY3ktamFycyIvPgotICAgICAgPG1hcHBlciB0eXBlPSJmbGF0dGVuIi8+Ci0gICAgPC9jb3B5PgotCi0gICAgPCEtLSBEZXBlbmRlbmNpZXMgbmVlZGVkIGZvciB0ZXN0aW5nIC0tPgotICAgIDxhcnRpZmFjdDpkZXBlbmRlbmNpZXMgZmlsZXNldElkPSJ0ZXN0LWRlcGVuZGVuY3ktamFycyIgdXNlU2NvcGU9InJ1bnRpbWUiPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnNsZjRqIiBhcnRpZmFjdElkPSJzbGY0ai1sb2c0ajEyIiB2ZXJzaW9uPSIxLjUuOCIvPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ianVuaXQiIGFydGlmYWN0SWQ9Imp1bml0IiB2ZXJzaW9uPSI0LjQiLz4KLSAgICA8L2FydGlmYWN0OmRlcGVuZGVuY2llcz4KLQotICAgIDwhLS0gQ29weSB0aGUgdGVzdCBkZXBlbmRlbmNpZXMgdG8gdGhlIGJ1aWxkL2xpYiBkaXIgLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuZGlyfS9saWIiPgotICAgICAgPGZpbGVzZXQgcmVmaWQ9InRlc3QtZGVwZW5kZW5jeS1qYXJzIi8+Ci0gICAgICA8bWFwcGVyIHR5cGU9ImZsYXR0ZW4iLz4KLSAgICA8L2NvcHk+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0ibXZuLmZpbmlzaGVkIiB2YWx1ZT0idHJ1ZSIvPgotICA8L3RhcmdldD4KLQotICA8bWFjcm9kZWYgbmFtZT0ic2lnbkFuZERlcGxveSI+Ci0gICAgPCEtLSBTaWduIGFuZCBkZXBsb3kgamFycyB0byBhcGFjaGUgcmVwbyAtLT4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzaWZpZXIiIGRlZmF1bHQ9IiIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFja2FnaW5nIiBkZWZhdWx0PSJqYXIiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9InBvbSIgZGVmYXVsdD0iIi8+Ci0gICAgPHNlcXVlbnRpYWw+Ci0gICAgICAgIDxhcnRpZmFjdDptdm4gZm9yaz0idHJ1ZSIgbWF2ZW5Ib21lPSIvdXNyL2xvY2FsL2FwYWNoZS1tYXZlbi0zLjYuMCI+Ci0gICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EbWF2ZW4ubXVsdGlNb2R1bGVQcm9qZWN0RGlyZWN0b3J5PS91c3IvbG9jYWwvYXBhY2hlLW1hdmVuLTMuNi4wIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1ncGctcGx1Z2luOjEuNjpzaWduLWFuZC1kZXBsb3ktZmlsZSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRHJlcG9zaXRvcnlJZD0ke21hdmVuLXJlcG9zaXRvcnktaWR9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EdXJsPSR7bWF2ZW4tcmVwb3NpdG9yeS11cmx9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EcG9tRmlsZT1Ae3BvbX0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURmaWxlPUB7ZmlsZX0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURjbGFzc2lmaWVyPUB7Y2xhc3NpZmllcn0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURwYWNrYWdpbmc9QHtwYWNrYWdpbmd9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1QZ3BnIi8+Ci0gICAgICA8L2FydGlmYWN0Om12bj4KLSAgICA8L3NlcXVlbnRpYWw+Ci0gIDwvbWFjcm9kZWY+Ci0KLSAgPHRhcmdldCBuYW1lPSJwdWJsaXNoIiBkZXBlbmRzPSJjbGVhbixpbml0LGNvbXBpbGUsZGlzdCxqYXZhZG9jLHBhY2suc3JjIj4KLSAgICA8IS0tIENvbXBpbGUsIHBhY2thZ2UsIHRlc3QgYW5kIHRoZW4gc2VuZCByZWxlYXNlIHRvIGFwYWNoZSBtYXZlbiByZXBvIC0tPgotICAgIDwhLS0gcnVuIHdpdGg6IGFudCAtRHJlbGVhc2U9dHJ1ZSBwdWJsaXNoLS0+Ci0gICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHtwb20ueG1sfSIgcGFja2FnaW5nPSJwb20iIGNsYXNzaWZpZXI9IiIgcG9tPSIke3BvbS54bWx9Ii8+Ci0gICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHtqYXIuZmlsZX0iIGNsYXNzaWZpZXI9IiIgcG9tPSIke3BvbS54bWx9Ii8+Ci0gICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHtqYXZhZG9jLmphci5maWxlfSIgY2xhc3NpZmllcj0iamF2YWRvYyIgcG9tPSIke3BvbS54bWx9Ii8+Ci0gICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHtzb3VyY2UuamFyLmZpbGV9IiBjbGFzc2lmaWVyPSJzb3VyY2VzIiBwb209IiR7cG9tLnhtbH0iLz4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvamF2YS9jb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbCBiL2xpYi9qYXZhL2NvZGVfcXVhbGl0eV90b29scy9maW5kYnVncy1maWx0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOTNiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9jb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbApAQCAtMCwwICsxLDUxIEBACis8RmluZEJ1Z3NGaWx0ZXI+CisgICAgPCEtLQorICAgICAgICBUaGlzIGZpbGUgY29udHJvbHMgZmlsdGVyaW5nIHNvbWUgb2YgdGhlIG1vcmUgb2Jub3hpb3VzIGZpbmRidWdzIHJlcG9ydHMuCisgICAgICAgIFNvbWUgbWF5IGJlIHdvcnRoeSBvZiBleGFtaW5hdGlvbiBhbmQgcmVzb2x1dGlvbiwgb3RoZXJzIGFyZSB0b28gbml0LXBpY2t5LgorICAgIC0tPgorICAgIDxNYXRjaD4KKyAgICAgICAgPE9yPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgdGhlIG1pc3Npbmcgc2VyaWFsVmVyc2lvblVJRCBlcnJvcnMgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlNuVkkiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBNYWxpY2lvdXMgY29kZSB2dWxuZXJhYmlsaXR5IFdhcm5pbmdzIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJFSSxFSTIiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBVbmNoZWNrZWQvdW5jb25maXJtZWQgY2FzdCAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iQkMiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBTaG91bGQgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkgcmF0aGVyIHRoYW4gbnVsbD8gLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlBaTEEiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBSZWR1bmRhbnQgbnVsbGNoZWNrIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJSQ04iIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBFeGNlcHRpb24gaXMgY2F1Z2h0IHdoZW4gRXhjZXB0aW9uIGlzIG5vdCB0aHJvd24gLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlJFQyIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIFN3aXRjaCBzdGF0ZW1lbnQgZm91bmQgd2hlcmUgZGVmYXVsdCBjYXNlIGlzIG1pc3NpbmcgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlNGIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgVW5yZWFkIHB1YmxpYy9wcm90ZWN0ZWQgZmllbGQgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlVyRiIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIEZpZWxkIG5vdCBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBhbmQgZGVyZWZlcmVuY2VkIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJVd0YiIC8+CisgICAgICAgIDwvT3I+CisgICAgPC9NYXRjaD4KKyAgICAgPE1hdGNoPgorICAgICAgICA8IS0tIEZpbHRlciBtZXRob2QgaW52b2tlcyBTeXN0ZW0uZXhpdCguLi4pLCB3aGljaCBzaHV0cyBkb3duIHRoZSBlbnRpcmUgdmlydHVhbCBtYWNoaW5lIC0tPgorICAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGaWxlVHJhbnNwb3J0IiAvPgorICAgICAgICA8TWV0aG9kIG5hbWU9InByaW50VXNhZ2UiIC8+CisgICAgICAgIDxCdWcgY29kZT0iRG0iIC8+CisgICAgIDwvTWF0Y2g+CisgICAgIDxNYXRjaD4KKyAgICAgICAgPCEtLSBGaWx0ZXIgbWV0aG9kIG1pZ2h0IGlnbm9yZSBqYXZhLmxhbmcuRXhjZXB0aW9uIC0tPgorICAgICAgIDxDbGFzcyBuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNpbXBsZUZpbGVUcmFuc3BvcnQiIC8+CisgICAgICAgPE1ldGhvZCBuYW1lPSJjbG9zZSIgLz4KKyAgICAgICA8QnVnIGNvZGU9IkRFIiAvPgorICAgICA8L01hdGNoPgorICAgICA8TWF0Y2g+CisgICAgICAgIDwhLS0gRmlsdGVyIG1ldGhvZCBtaWdodCBpZ25vcmUgamF2YS5sYW5nLkV4Y2VwdGlvbiAtLT4KKyAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQuVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudCRNdWx0aUZldGNoIiAvPgorICAgICAgIDxNZXRob2QgbmFtZT0icnVuIiAvPgorICAgICAgIDxCdWcgY29kZT0iREUiIC8+CisgICAgIDwvTWF0Y2g+CisgICAgIDxNYXRjaD4KKyAgICAgICAgPCEtLSBGaWx0ZXIgQ2xhc3MgZGVmaW5lcyBub24tdHJhbnNpZW50IG5vbi1zZXJpYWxpemFibGUgaW5zdGFuY2UgZmllbGQgLS0+CisgICAgICAgPENsYXNzIG5hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmxldCIgLz4KKyAgICAgICA8QnVnIGNvZGU9IlNlIiAvPgorICAgICA8L01hdGNoPgorPC9GaW5kQnVnc0ZpbHRlcj4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS5wcm9wZXJ0aWVzIGIvbGliL2phdmEvZ3JhZGxlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxMTY1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzQgQEAKKyMgVGhpcyBmaWxlIGlzIHNoYXJlZCBjdXJyZW50bHkgYmV0d2VlbiB0aGlzIEdyYWRsZSBidWlsZCBhbmQgdGhlCisjIEFudCBidWlsZHMgZm9yIGZkMzAzIGFuZCBKYXZhU2NyaXB0LiBLZWVwIHRoZSBkb3R0ZWQgbm90YXRpb24gZm9yCisjIHRoZSBwcm9wZXJ0aWVzIHRvIG1pbmltaXplIHRoZSBjaGFuZ2VzIGluIHRoZSBkZXBlbmRlbmNpZXMuCit0aHJpZnQudmVyc2lvbj0wLjEzLjAKK3RocmlmdC5ncm91cGlkPW9yZy5hcGFjaGUudGhyaWZ0CityZWxlYXNlPWZhbHNlCisKKyMgTG9jYWwgSW5zdGFsbCBwYXRocworaW5zdGFsbC5wYXRoPS91c3IvbG9jYWwvbGliCitpbnN0YWxsLmphdmFkb2MucGF0aD0vdXNyL2xvY2FsL2xpYgorCisjIFRlc3QgZXhlY3V0aW9uIHByb3BlcnRpZXMKK3Rlc3RQb3J0PTkwOTAKKworIyBUZXN0IHdpdGggQ2xvdmVyIENvZGUgY292ZXJhZ2UgKGRpc2FibGVkIGJ5IGRlZmF1bHQpCitjbG92ZXJFbmFibGVkPWZhbHNlCisKKyMgTWF2ZW4gZGVwZW5kZW5jeSBkb3dubG9hZCBsb2NhdGlvbnMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCithcGFjaGUucmVwbz1odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9yZWxlYXNlcworCisjIEFwYWNoZSBNYXZlbiBwdWJsaXNoCitsaWNlbnNlPWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQKK21hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL3NlcnZpY2UvbG9jYWwvc3RhZ2luZy9kZXBsb3kvbWF2ZW4yCittYXZlbi1yZXBvc2l0b3J5LWlkPWFwYWNoZS5yZWxlYXNlcy5odHRwcworCisjIERlcGVuZGVuY3kgdmVyc2lvbnMKK2h0dHBjbGllbnQudmVyc2lvbj00LjUuNgoraHR0cGNvcmUudmVyc2lvbj00LjQuMQorc2xmNGoudmVyc2lvbj0xLjcuMjUKK3NlcnZsZXQudmVyc2lvbj0yLjUKK2p1bml0LnZlcnNpb249NC4xMgorbW9ja2l0by52ZXJzaW9uPTEuOS41CitqYXZheC5hbm5vdGF0aW9uLnZlcnNpb249MS4zLjIKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9hZGRpdGlvbmFsQXJ0aWZhY3RzLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9hZGRpdGlvbmFsQXJ0aWZhY3RzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDE0NjlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2FkZGl0aW9uYWxBcnRpZmFjdHMuZ3JhZGxlCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCit0YXNrIHNvdXJjZXNKYXIodHlwZTogSmFyLCBncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0Fzc2VtYmxlcyBhIGphciBhcmNoaXZlIGNvbnRhaW5pbmcgdGhlIG1haW4gSmF2YSBzb3VyY2VzLicKKworICAgIGNsYXNzaWZpZXIgJ3NvdXJjZXMnCisgICAgZnJvbSBzb3VyY2VTZXRzLm1haW4uYWxsU291cmNlCit9CisKK3Rhc2sgamF2YWRvY0phcih0eXBlOiBKYXIsIGRlcGVuZHNPbjogamF2YWRvYywgZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZXMgYSBqYXIgYXJjaGl2ZSBjb250YWluaW5nIHRoZSBKYXZhRG9jLicKKworICAgIGNsYXNzaWZpZXIgJ2phdmFkb2MnCisgICAgZnJvbSBqYXZhZG9jLmRlc3RpbmF0aW9uRGlyCit9CisKK2FydGlmYWN0cyB7CisgICAgYXJjaGl2ZXMgc291cmNlc0phcgorICAgIGFyY2hpdmVzIGphdmFkb2NKYXIKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL2Nsb3ZlckNvdmVyYWdlLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9jbG92ZXJDb3ZlcmFnZS5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmMGU3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9jbG92ZXJDb3ZlcmFnZS5ncmFkbGUKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIEtlZXAgdGhpcyBhcyBhbiBvcHRpb25hbCBmZWF0dXJlIGZvciBub3csIGRpc2FibGVkIGJ5IGRlZmF1bHQKK2lmIChCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9qZWN0LmNsb3ZlckVuYWJsZWQpKSB7CisgICAgYXBwbHkgcGx1Z2luOiAnY29tLmJtdXNjaGtvLmNsb3ZlcicKKworICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsb3ZlciAnb3JnLm9wZW5jbG92ZXI6Y2xvdmVyOjQuMi4rJworICAgIH0KKworICAgIGNsb3ZlciB7CisKKyAgICAgICAgdGVzdEluY2x1ZGVzID0gWycqKi9UZXN0Ki5qYXZhJ10KKyAgICAgICAgLy8gRXhjbHVkZSB0aGUgZ2VuZXJhdGVkIHRlc3QgY29kZSBmcm9tIGNvZGUgY292ZXJhZ2UKKyAgICAgICAgdGVzdEV4Y2x1ZGVzID0gWyd0aHJpZnQvdGVzdC9UZXN0Ki5qYXZhJ10KKworICAgICAgICBjb21waWxlciB7CisgICAgICAgICAgICBlbmNvZGluZyA9ICdVVEYtOCcKKyAgICAgICAgICAgIGRlYnVnID0gdHJ1ZQorICAgICAgICB9CisKKyAgICAgICAgcmVwb3J0IHsKKyAgICAgICAgICAgIGh0bWwgPSB0cnVlCisgICAgICAgICAgICBwZGYgPSB0cnVlCisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWlsZC5kZXBlbmRzT24gY2xvdmVyR2VuZXJhdGVSZXBvcnQKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9jb2RlUXVhbGl0eUNoZWNrcy5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvY29kZVF1YWxpdHlDaGVja3MuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZjFjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvY29kZVF1YWxpdHlDaGVja3MuZ3JhZGxlCkBAIC0wLDAgKzEsMzkgQEAKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvbmZpZ3VyZSB0aGUgR3JhZGxlIGNvZGUgcXVhbGl0eSBwbHVnaW5zIGhlcmUuCisvLworCithcHBseSBwbHVnaW46ICdmaW5kYnVncycKKworZmluZGJ1Z3MgeworICAgIGlnbm9yZUZhaWx1cmVzID0gdHJ1ZQorICAgIHRvb2xWZXJzaW9uID0gJzMuMC4xJworICAgIHNvdXJjZVNldHMgPSBbIHNvdXJjZVNldHMubWFpbiBdCisgICAgZWZmb3J0ID0gJ21heCcKKyAgICByZXBvcnRMZXZlbCA9ICdsb3cnCisgICAgZXhjbHVkZUZpbHRlciA9IGZpbGUoJ2NvZGVfcXVhbGl0eV90b29scy9maW5kYnVncy1maWx0ZXIueG1sJykKK30KKwordGFza3Mud2l0aFR5cGUoRmluZEJ1Z3MpIHsKKyAgICByZXBvcnRzIHsKKyAgICAgICAgdGV4dC5lbmFibGVkID0gZmFsc2UKKyAgICAgICAgaHRtbC5lbmFibGVkID0gdHJ1ZQorICAgICAgICB4bWwuZW5hYmxlZCA9IGZhbHNlCisgICAgfQorfQorCithcHBseSBwbHVnaW46ICdwbWQnCisKK3BtZCB7CisgICAgaWdub3JlRmFpbHVyZXMgPSB0cnVlCisgICAgdG9vbFZlcnNpb24gPSAnNi4wLjAnCisgICAgc291cmNlU2V0cyA9IFsgc291cmNlU2V0cy5tYWluIF0KKyAgICBydWxlU2V0cyA9IFsgJ2phdmEtYmFzaWMnIF0KK30KKwordGFza3Mud2l0aFR5cGUoUG1kKSB7CisgICAgcmVwb3J0cyB7CisgICAgICAgIGh0bWwuZW5hYmxlZCA9IHRydWUKKyAgICAgICAgeG1sLmVuYWJsZWQgPSBmYWxzZQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9lbnZpcm9ubWVudC5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvZW52aXJvbm1lbnQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZmE2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvZW52aXJvbm1lbnQuZ3JhZGxlCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyBPdmVycmlkZSB0aGUgYnVpbGQgZGlyZWN0b3J5IGlmIENNYWtlIGlzIHVzZWQgKGFsbG93cyBmb3Igb3V0LW9mLXRyZWUtYnVpbGRzKQoraWYgKGhhc1Byb3BlcnR5KCdidWlsZC5kaXInKSkgeworICAgIGJ1aWxkRGlyID0gZmlsZShwcm9wZXJ0eSgnYnVpbGQuZGlyJykpCit9CisKKy8vIEluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggb3RoZXIgQW50IGJhc2VkIGJ1aWxkcyBpbiB0aGUgc3lzdGVtCisvLyB3ZSBjb252ZXJ0IHRoZSBncmFkbGUucHJvcGVydGllcyBpbnRvIERTTCBmcmllbmRseSBjYW1lbENhc2VkIHByb3BlcnRpZXMKK2V4dC5pbnN0YWxsUGF0aCA9IHByb3BlcnR5KCdpbnN0YWxsLnBhdGgnKQorZXh0Lmluc3RhbGxKYXZhZG9jUGF0aCA9IHByb3BlcnR5KCdpbnN0YWxsLmphdmFkb2MucGF0aCcpCisKK2V4dC50aHJpZnRSb290ID0gZmlsZSgnLi4vLi4nKQorCitpZiAoaGFzUHJvcGVydHkoJ3RocmlmdC5jb21waWxlcicpKSB7CisgICAgZXh0LnRocmlmdENvbXBpbGVyID0gcHJvcGVydHkoJ3RocmlmdC5jb21waWxlcicpCit9IGVsc2UgeworICAgIGV4dC50aHJpZnRDb21waWxlciA9ICIkdGhyaWZ0Um9vdC9jb21waWxlci9jcHAvdGhyaWZ0IgorfQorCitleHQubXZuUmVwbyA9IHByb3BlcnR5KCdtdm4ucmVwbycpCitleHQuYXBhY2hlUmVwbyA9IHByb3BlcnR5KCdhcGFjaGUucmVwbycpCitleHQubWF2ZW5SZXBvc2l0b3J5VXJsID0gcHJvcGVydHkoJ21hdmVuLXJlcG9zaXRvcnktdXJsJykKKworLy8gVmVyc2lvbnMgdXNlZCBpbiB0aGlzIHByb2plY3QKK2V4dC5odHRwY2xpZW50VmVyc2lvbiA9IHByb3BlcnR5KCdodHRwY2xpZW50LnZlcnNpb24nKQorZXh0Lmh0dHBjb3JlVmVyc2lvbiA9IHByb3BlcnR5KCdodHRwY29yZS52ZXJzaW9uJykKK2V4dC5zZXJ2bGV0VmVyc2lvbiA9IHByb3BlcnR5KCdzZXJ2bGV0LnZlcnNpb24nKQorZXh0LnNsZjRqVmVyc2lvbiA9IHByb3BlcnR5KCdzbGY0ai52ZXJzaW9uJykKK2V4dC5qdW5pdFZlcnNpb24gPSBwcm9wZXJ0eSgnanVuaXQudmVyc2lvbicpCitleHQubW9ja2l0b1ZlcnNpb24gPSBwcm9wZXJ0eSgnbW9ja2l0by52ZXJzaW9uJykKK2V4dC5qYXZheEFubm90YXRpb25WZXJzaW9uID0gcHJvcGVydHkoJ2phdmF4LmFubm90YXRpb24udmVyc2lvbicpCisKKy8vIEluIHRoaXMgc2VjdGlvbiB5b3UgZGVjbGFyZSB3aGVyZSB0byBmaW5kIHRoZSBkZXBlbmRlbmNpZXMgb2YgeW91ciBwcm9qZWN0CityZXBvc2l0b3JpZXMgeworICAgIG1hdmVuIHsKKyAgICAgICAgbmFtZSAnTWF2ZW4gQ2VudHJhbCBSZXBvc2l0b3J5JworICAgICAgICB1cmwgbXZuUmVwbworICAgIH0KKyAgICBtYXZlbiB7CisgICAgICAgIG5hbWUgJ0FwYWNoZSBNYXZlbiBSZXBvc2l0b3J5JworICAgICAgICB1cmwgYXBhY2hlUmVwbworICAgIH0KK30KKworZGVwZW5kZW5jaWVzIHsKKyAgICBjb21waWxlICJvcmcuc2xmNGo6c2xmNGotYXBpOiR7c2xmNGpWZXJzaW9ufSIKKyAgICBjb21waWxlICJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzOmh0dHBjbGllbnQ6JHtodHRwY2xpZW50VmVyc2lvbn0iCisgICAgY29tcGlsZSAib3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY29yZToke2h0dHBjb3JlVmVyc2lvbn0iCisgICAgY29tcGlsZSAiamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaToke3NlcnZsZXRWZXJzaW9ufSIKKyAgICBjb21waWxlICJqYXZheC5hbm5vdGF0aW9uOmphdmF4LmFubm90YXRpb24tYXBpOiR7amF2YXhBbm5vdGF0aW9uVmVyc2lvbn0iCisKKyAgICB0ZXN0Q29tcGlsZSAianVuaXQ6anVuaXQ6JHtqdW5pdFZlcnNpb259IgorICAgIHRlc3RDb21waWxlICJvcmcubW9ja2l0bzptb2NraXRvLWFsbDoke21vY2tpdG9WZXJzaW9ufSIKKyAgICB0ZXN0UnVudGltZSAib3JnLnNsZjRqOnNsZjRqLWxvZzRqMTI6JHtzbGY0alZlcnNpb259IgorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL2Z1bmN0aW9uYWxUZXN0cy5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDIwZDEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2Z1bmN0aW9uYWxUZXN0cy5ncmFkbGUKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbmFsIHRlc3RpbmcgaGFybmVzcyBjcmVhdGlvbi4gVGhpcyBoZWxwcyBydW4gdGhlIGNyb3NzLWNoZWNrIHRlc3RzLgorLy8gVGhlIE1ha2VmaWxlIHByZWNyb3NzIHRhcmdldCBpbnZva2VzIHRoZSBzaGFkb3dKYXIgdGFzayBhbmQgdGhlIHRlc3RzLmpzb24KKy8vIGNvZGUgaXMgY2hhbmdlZCB0byBjYWxsIHJ1bmNsaWVudCBvciBydW5zZXJ2ZXIgYXMgbmVlZGVkLgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDcm9zcyBUZXN0IHNvdXJjZXMgYXJlIHNlcGFyYXRlZCBpbiB0aGVpciBvd24gc291cmNlU2V0CisvLworc291cmNlU2V0cyB7CisgICAgY3Jvc3NUZXN0IHsKKyAgICAgICAgamF2YSB7CisgICAgICAgICAgICBzcmNEaXIgJ3Rlc3QnCisgICAgICAgICAgICBpbmNsdWRlICcqKi90ZXN0L1Rlc3RDbGllbnQuamF2YScKKyAgICAgICAgICAgIGluY2x1ZGUgJyoqL3Rlc3QvVGVzdFNlcnZlci5qYXZhJworICAgICAgICAgICAgaW5jbHVkZSAnKiovdGVzdC9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YScKKyAgICAgICAgfQorICAgIH0KK30KKworY29uZmlndXJhdGlvbnMgeworICAgIGNyb3NzVGVzdENvbXBpbGUgeyBleHRlbmRzRnJvbSB0ZXN0Q29tcGlsZSB9CisgICAgY3Jvc3NUZXN0UnVudGltZSB7IGV4dGVuZHNGcm9tIGNyb3NzVGVzdENvbXBpbGUsIHRlc3RSdW50aW1lIH0KK30KKworZGVwZW5kZW5jaWVzIHsKKyAgICBjcm9zc1Rlc3RDb21waWxlIHNvdXJjZVNldHMubWFpbi5vdXRwdXQKKyAgICBjcm9zc1Rlc3RDb21waWxlIHNvdXJjZVNldHMudGVzdC5vdXRwdXQKK30KKworLy8gSSBhbSB1c2luZyBzaGFkb3cgcGx1Z2luIHRvIG1ha2UgYSBzZWxmIGNvbnRhaW5lZCBmdW5jdGlvbmFsIHRlc3QgVWJlciBKQVIgdGhhdAorLy8gZWxpbWluYXRlcyBzdGFydHVwIHByb2JsZW1zIHdpdGggd3JhcHBpbmcgdGhlIGNyb3NzLWNoZWNrIGhhcm5lc3MgaW4gR3JhZGxlLgorLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBydW5uZXIgc2NyaXB0cyBhcyB0aGUgc2luZ2xlIGNsYXNzcGF0aCBlbnRyeSB3aGljaAorLy8gYWxsb3dzIHRoZSBwcm9jZXNzIHRvIGJlIGFzIGxpZ2h0d2VpZ2h0IGFzIGl0IGNhbi4KK3NoYWRvd0phciB7CisgICAgZGVzY3JpcHRpb24gPSAnQXNzZW1ibGUgYSB0ZXN0IEpBUiBmaWxlIGZvciBjcm9zcy1jaGVjayBleGVjdXRpb24nCisgICAgLy8gbWFrZSBzdXJlIHRoZSBydW5uZXJzIGFyZSBjcmVhdGVkIHdoZW4gdGhpcyBydW5zCisgICAgZGVwZW5kc09uICdnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvckNsaWVudCcsICdnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvclNlcnZlcicsICdnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvck5vbmJsb2NraW5nU2VydmVyJworCisgICAgYmFzZU5hbWUgPSAnZnVuY3Rpb25hbFRlc3QnCisgICAgZGVzdGluYXRpb25EaXIgPSBmaWxlKCIkYnVpbGREaXIvZnVuY3Rpb25hbFRlc3RKYXIiKQorICAgIGNsYXNzaWZpZXIgPSBudWxsCisKKyAgICAvLyBXZSBkbyBub3QgbmVlZCBhIHZlcnNpb24gbnVtYmVyIGZvciB0aGlzIGludGVybmFsIGphcgorICAgIHZlcnNpb24gPSBudWxsCisKKyAgICAvLyBCdW5kbGUgdGhlIGNvbXBsZXRlIHNldCBvZiB1bml0IHRlc3QgY2xhc3NlcyBpbmNsdWRpbmcgZ2VuZXJhdGVkIGNvZGUKKyAgICAvLyBhbmQgdGhlIHJ1bnRpbWUgZGVwZW5kZW5jaWVzIGluIG9uZSBKQVIgdG8gZXhwZWRpdGUgZXhlY3V0aW9uLgorICAgIGZyb20gc291cmNlU2V0cy50ZXN0Lm91dHB1dAorICAgIGZyb20gc291cmNlU2V0cy5jcm9zc1Rlc3Qub3V0cHV0CisgICAgY29uZmlndXJhdGlvbnMgPSBbcHJvamVjdC5jb25maWd1cmF0aW9ucy50ZXN0UnVudGltZV0KK30KKworLy8gQ29tbW9uIHNjcmlwdCBydW5uZXIgY29uZmlndXJhdGlvbiBlbGVtZW50cworZGVmIHNjcmlwdEV4dCA9ICcnCitkZWYgZXhlY0V4dCA9ICcnCitkZWYgc2NyaXB0SGVhZCA9ICcjIS9iaW4vYmFzaCcKK2RlZiBhcmdzID0gJyQqJworCisvLyBBbHRob3VnaCB0aGlzIGlzIG1hcmtlZCBpbnRlcm5hbCBpdCBpcyBhbiBhdmFpbGFibGUgYW5kIHN0YWJsZSBpbnRlcmZhY2UKK2lmIChvcmcuZ3JhZGxlLmludGVybmFsLm9zLk9wZXJhdGluZ1N5c3RlbS5jdXJyZW50KCkud2luZG93cykgeworICAgIHNjcmlwdEV4dCA9ICcuYmF0JworICAgIGV4ZWNFeHQgPSAnLmV4ZScKKyAgICBzY3JpcHRIZWFkID0gJ0BlY2hvIG9mZicKKyAgICBhcmdzID0gJyUqJworfQorCisvLyBUaGUgSmF2YSBleGVjdXRhYmxlIHRvIHVzZSB3aXRoIHRoZSBydW5uZXIgc2NyaXB0cworZGVmIGphdmFFeGUgPSBmaWxlKCIke1N5c3RlbS5nZXRQcm9wZXJ0eSgnamF2YS5ob21lJyl9L2Jpbi9qYXZhJHtleGVjRXh0fSIpLmNhbm9uaWNhbFBhdGgKKy8vIFRoZSBjb21tb24gVWJlciBqYXIgcGF0aAorZGVmIGphclBhdGggPSBzaGFkb3dKYXIuYXJjaGl2ZVBhdGguY2Fub25pY2FsUGF0aAorZGVmIHRydXN0U3RvcmUgPSBmaWxlKCd0ZXN0Ly50cnVzdHN0b3JlJykuY2Fub25pY2FsUGF0aAorZGVmIGtleVN0b3JlID0gZmlsZSgndGVzdC8ua2V5c3RvcmUnKS5jYW5vbmljYWxQYXRoCisKK3Rhc2sgZ2VuZXJhdGVSdW5uZXJTY3JpcHRGb3JDbGllbnQoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSBhIHJ1bm5lciBzY3JpcHQgZm9yIGNyb3NzLWNoZWNrIHRlc3RzIHdpdGggVGVzdENsaWVudCcKKworICAgIGRlZiBjbGllbnRGaWxlID0gZmlsZSgiJGJ1aWxkRGlyL3J1bmNsaWVudCR7c2NyaXB0RXh0fSIpCisKKyAgICBkZWYgcnVuQ2xpZW50VGV4dCA9ICIiIlwKKyR7c2NyaXB0SGVhZH0KKworIiR7amF2YUV4ZX0iIC1jcCAiJGphclBhdGgiICItRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZT0kdHJ1c3RTdG9yZSIgLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZD10aHJpZnQgb3JnLmFwYWNoZS50aHJpZnQudGVzdC5UZXN0Q2xpZW50ICRhcmdzCisiIiIKKyAgICBpbnB1dHMucHJvcGVydHkgJ3J1bkNsaWVudFRleHQnLCBydW5DbGllbnRUZXh0CisgICAgb3V0cHV0cy5maWxlIGNsaWVudEZpbGUKKworICAgIGRvTGFzdCB7CisgICAgICAgIGNsaWVudEZpbGUucGFyZW50RmlsZS5ta2RpcnMoKQorICAgICAgICBjbGllbnRGaWxlLnRleHQgPSBydW5DbGllbnRUZXh0CisgICAgICAgIGNsaWVudEZpbGUuc2V0RXhlY3V0YWJsZSh0cnVlLCBmYWxzZSkKKyAgICB9Cit9CisKK3Rhc2sgZ2VuZXJhdGVSdW5uZXJTY3JpcHRGb3JTZXJ2ZXIoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSBhIHJ1bm5lciBzY3JpcHQgZm9yIGNyb3NzLWNoZWNrIHRlc3RzIHdpdGggVGVzdFNlcnZlcicKKworICAgIGRlZiBzZXJ2ZXJGaWxlID0gZmlsZSgiJGJ1aWxkRGlyL3J1bnNlcnZlciR7c2NyaXB0RXh0fSIpCisKKyAgICBkZWYgcnVuU2VydmVyVGV4dCA9ICIiIlwKKyR7c2NyaXB0SGVhZH0KKworIiR7amF2YUV4ZX0iIC1jcCAiJGphclBhdGgiICItRGphdmF4Lm5ldC5zc2wua2V5U3RvcmU9JGtleVN0b3JlIiAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZD10aHJpZnQgb3JnLmFwYWNoZS50aHJpZnQudGVzdC5UZXN0U2VydmVyICRhcmdzCisiIiIKKworICAgIGlucHV0cy5wcm9wZXJ0eSAncnVuU2VydmVyVGV4dCcsIHJ1blNlcnZlclRleHQKKyAgICBvdXRwdXRzLmZpbGUgc2VydmVyRmlsZQorCisgICAgZG9MYXN0IHsKKyAgICAgICAgc2VydmVyRmlsZS5wYXJlbnRGaWxlLm1rZGlycygpCisgICAgICAgIHNlcnZlckZpbGUudGV4dCA9IHJ1blNlcnZlclRleHQKKyAgICAgICAgc2VydmVyRmlsZS5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKQorICAgIH0KK30KKwordGFzayBnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvck5vbmJsb2NraW5nU2VydmVyKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgYSBydW5uZXIgc2NyaXB0IGZvciBjcm9zcy1jaGVjayB0ZXN0cyB3aXRoIFRlc3ROb25ibG9ja2luZ1NlcnZlcicKKworICAgIGRlZiBzZXJ2ZXJGaWxlID0gZmlsZSgiJGJ1aWxkRGlyL3J1bm5vbmJsb2NraW5nc2VydmVyJHtzY3JpcHRFeHR9IikKKworICAgIGRlZiBydW5TZXJ2ZXJUZXh0ID0gIiIiXAorJHtzY3JpcHRIZWFkfQorCisiJHtqYXZhRXhlfSIgLWNwICIkamFyUGF0aCIgIi1EamF2YXgubmV0LnNzbC5rZXlTdG9yZT0ka2V5U3RvcmUiIC1EamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkPXRocmlmdCBvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3ROb25ibG9ja2luZ1NlcnZlciAkYXJncworIiIiCisKKyAgICBpbnB1dHMucHJvcGVydHkgJ3J1blNlcnZlclRleHQnLCBydW5TZXJ2ZXJUZXh0CisgICAgb3V0cHV0cy5maWxlIHNlcnZlckZpbGUKKworICAgIGRvTGFzdCB7CisgICAgICAgIHNlcnZlckZpbGUucGFyZW50RmlsZS5ta2RpcnMoKQorICAgICAgICBzZXJ2ZXJGaWxlLnRleHQgPSBydW5TZXJ2ZXJUZXh0CisgICAgICAgIHNlcnZlckZpbGUuc2V0RXhlY3V0YWJsZSh0cnVlLCBmYWxzZSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvZ2VuZXJhdGVUZXN0VGhyaWZ0LmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTM3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvZ2VuZXJhdGVUZXN0VGhyaWZ0LmdyYWRsZQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIEdlbmVyYXRlZCBjb2RlIGxvY2F0aW9ucyBmb3IgVW5pdCB0ZXN0cworZXh0LmdlblNyYyA9IGZpbGUoIiRidWlsZERpci9nZW4tamF2YSIpCitleHQuZ2VuQmVhblNyYyA9IGZpbGUoIiRidWlsZERpci9nZW4tamF2YWJlYW4iKQorZXh0LmdlblJldXNlU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1qYXZhcmV1c2UiKQorZXh0LmdlbkZ1bGxDYW1lbFNyYyA9IGZpbGUoIiRidWlsZERpci9nZW4tZnVsbGNhbWVsIikKK2V4dC5nZW5VbnNhZmVTcmMgPSBmaWxlKCIkYnVpbGREaXIvZ2VuLXVuc2FmZSIpCisKKy8vIEFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgZGlyZWN0b3JpZXMgdG8gdGhlIHRlc3Qgc291cmNlIHNldAorc291cmNlU2V0cyB7CisgICAgdGVzdC5qYXZhLnNyY0RpcnMgZ2VuU3JjLCBnZW5CZWFuU3JjLCBnZW5SZXVzZVNyYywgZ2VuRnVsbENhbWVsU3JjLCBnZW5VbnNhZmVTcmMKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBnZW5lcmF0aW9uIGZvciBVbml0IFRlc3RpbmcKKworLy8gQSBjYWxsYWJsZSBjbG9zdXJlIHRvIG1ha2UgdGhpcyBlYXNpZXIKK2V4dC50aHJpZnRDb21waWxlID0geyBUYXNrIHRhc2ssIFN0cmluZyB0aHJpZnRGaWxlTmFtZSwgU3RyaW5nIGdlbmVyYXRvciA9ICdqYXZhJywgRmlsZSBvdXRwdXREaXIgPSBnZW5TcmMgLT4KKyAgICBkZWYgdGhyaWZ0RmlsZSA9IGZpbGUoIiR0aHJpZnRSb290L3Rlc3QvJHRocmlmdEZpbGVOYW1lIikKKyAgICBhc3NlcnQgdGhyaWZ0RmlsZS5leGlzdHMoKQorCisgICAgdGFzay5pbnB1dHMuZmlsZSB0aHJpZnRGaWxlCisgICAgdGFzay5vdXRwdXRzLmRpciBvdXRwdXREaXIKKworICAgIHRhc2suZG9MYXN0IHsKKyAgICAgICAgb3V0cHV0RGlyLm1rZGlycygpCisgICAgICAgIGRlZiByZXN1bHQgPSBleGVjIHsKKyAgICAgICAgICAgIGV4ZWN1dGFibGUgZmlsZSh0aHJpZnRDb21waWxlcikKKyAgICAgICAgICAgIGFyZ3MgJy0tZ2VuJywgZ2VuZXJhdG9yCisgICAgICAgICAgICBhcmdzICctb3V0Jywgb3V0cHV0RGlyCisgICAgICAgICAgICBhcmdzIHRocmlmdEZpbGUKKyAgICAgICAgICAgIHN0YW5kYXJkT3V0cHV0ID0gdGFzay5vdXRwdXRCdWZmZXIKKyAgICAgICAgICAgIGVycm9yT3V0cHV0ID0gdGFzay5vdXRwdXRCdWZmZXIKKyAgICAgICAgICAgIGlnbm9yZUV4aXRWYWx1ZSA9IHRydWUKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0LmV4aXRWYWx1ZSAhPSAwKSB7CisgICAgICAgICAgICAvLyBPbmx5IHNob3cgdGhlIFRocmlmdCBjb21waWxlciBvdXRwdXQgb24gZmFpbHVyZXMsIGN1dHMgZG93biBvbiBub2lzZSEKKyAgICAgICAgICAgIHByaW50bG4gdGFzay5vdXRwdXRCdWZmZXIudG9TdHJpbmcoKQorICAgICAgICAgICAgcmVzdWx0LnJldGhyb3dGYWlsdXJlKCkKKyAgICAgICAgfQorICAgIH0KK30KKwordGFzayBnZW5lcmF0ZShncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIGFsbCB1bml0IHRlc3QgVGhyaWZ0IHNvdXJjZXMnCisgICAgY29tcGlsZVRlc3RKYXZhLmRlcGVuZHNPbiBpdAorfQorCit0YXNrIGdlbmVyYXRlSmF2YShncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLWphdmEgc291cmNlJworICAgIGdlbmVyYXRlLmRlcGVuZHNPbiBpdAorCisgICAgZXh0Lm91dHB1dEJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ1RocmlmdFRlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnSmF2YVR5cGVzLnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0RlYnVnUHJvdG9UZXN0LnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnTWFueU9wdGlvbmFscy50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdKYXZhRGVlcENvcHlUZXN0LnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0VudW1Db250YWluZXJzVGVzdC50aHJpZnQnKQorfQorCit0YXNrIGdlbmVyYXRlQmVhbkphdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1qYXZhYmVhbiBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnSmF2YUJlYW5zVGVzdC50aHJpZnQnLCAnamF2YTpiZWFucyxub2NhbWVsJywgZ2VuQmVhblNyYykKK30KKwordGFzayBnZW5lcmF0ZVJldXNlSmF2YShncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLWphdmFyZXVzZSBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRnVsbENhbWVsVGVzdC50aHJpZnQnLCAnamF2YTpmdWxsY2FtZWwnLCBnZW5GdWxsQ2FtZWxTcmMpCit9CisKK3Rhc2sgZ2VuZXJhdGVGdWxsQ2FtZWxKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tZnVsbGNhbWVsIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdSZXVzZU9iamVjdHMudGhyaWZ0JywgJ2phdmE6cmV1c2Utb2JqZWN0cycsIGdlblJldXNlU3JjKQorfQorCit0YXNrIGdlbmVyYXRlVW5zYWZlQmluYXJpZXNKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tdW5zYWZlYmluYXJpZXMgc291cmNlJworICAgIGdlbmVyYXRlLmRlcGVuZHNPbiBpdAorCisgICAgZXh0Lm91dHB1dEJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ1Vuc2FmZVR5cGVzLnRocmlmdCcsICdqYXZhOnVuc2FmZV9iaW5hcmllcycsIGdlblVuc2FmZVNyYykKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9wdWJsaXNoaW5nLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9wdWJsaXNoaW5nLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjliZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5zdGFsbGF0aW9uIHN1YnRhc2tzLCBub3QgdXNlZCBjdXJyZW50bHksIHdlIHVzZSAibWFrZSBpbnN0YWxsL2Zhc3QiCit0YXNrIGluc3RhbGxEaXN0KHR5cGU6IENvcHksIGdyb3VwOiAnSW5zdGFsbCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICJDb3B5IFRocmlmdCBKQVIgYW5kIGRlcGVuZGVuY2llcyBpbnRvICRpbnN0YWxsUGF0aCBsb2NhdGlvbiIKKworICAgIGRlc3RpbmF0aW9uRGlyID0gZmlsZShpbnN0YWxsUGF0aCkKKworICAgIGZyb20gamFyCisgICAgZnJvbSBjb25maWd1cmF0aW9ucy5jb21waWxlCit9CisKK3Rhc2sgaW5zdGFsbEphdmFkb2ModHlwZTogQ29weSwgZ3JvdXA6ICdJbnN0YWxsJywgZGVwZW5kc09uOiBqYXZhZG9jKSB7CisgICAgZGVzY3JpcHRpb24gPSAiSW5zdGFsbCBUaHJpZnQgSmF2YURvYyBpbnRvICRpbnN0YWxsSmF2YWRvY1BhdGggbG9jYXRpb24iCisKKyAgICBkZXN0aW5hdGlvbkRpciA9IGZpbGUoaW5zdGFsbEphdmFkb2NQYXRoKQorCisgICAgZnJvbSBqYXZhZG9jLmRlc3RpbmF0aW9uRGlyCit9CisKKy8vIFRoaXMgaXMgbm90IG5lZWRlZCBieSBHcmFkbGUgYnVpbGRzIGJ1dCB0aGUgcmVtYWluaW5nIEFudCBidWlsZHMgc2VlbSB0bworLy8gbmVlZCBhY2Nlc3MgdG8gdGhlIGdlbmVyYXRlZCB0ZXN0IGNsYXNzZXMgZm9yIFRocmlmdCB1bml0IHRlc3RzIHNvIHdlCisvLyBhc3Npc3QgdGhlbSB0byB1c2UgaXQgdGhpcyB3YXkuCit0YXNrIGNvcHlEZXBlbmRlbmNpZXModHlwZTogQ29weSwgZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdDb3B5IHJ1bnRpbWUgZGVwZW5kZW5jaWVzIGluIGEgY29tbW9uIGxvY2F0aW9uIGZvciBvdGhlciBBbnQgYmFzZWQgcHJvamVjdHMnCisgICAgcHJvamVjdC5hc3NlbWJsZS5kZXBlbmRzT24gaXQKKworICAgIGRlc3RpbmF0aW9uRGlyID0gZmlsZSgiJGJ1aWxkRGlyL2RlcHMiKQorICAgIGZyb20gY29uZmlndXJhdGlvbnMudGVzdFJ1bnRpbWUKKyAgICAvLyBleGNsdWRlIHNvbWUgdmVyeSBzcGVjaWZpYyB1bml0IHRlc3QgZGVwZW5kZW5jaWVzCisgICAgZXhjbHVkZSAnKiovanVuaXQqLmphcicsICcqKi9tb2NraXRvKi5qYXInLCAnKiovaGFtY3Jlc3QqLmphcicKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWxsb3cgdGhpcyBjb25maWd1cmF0aW9uIHRvIGJlIHNoYXJlZCBiZXR3ZWVuIGluc3RhbGwgYW5kIHVwbG9hZEFyY2hpdmVzIHRhc2tzCitkZWYgY29uZmlndXJlUG9tKHBvbSkgeworICAgIHBvbS5wcm9qZWN0IHsKKyAgICAgICAgbmFtZSAnQXBhY2hlIFRocmlmdCcKKyAgICAgICAgZGVzY3JpcHRpb24gJ1RocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuJworICAgICAgICBwYWNrYWdpbmcgJ2phcicKKyAgICAgICAgdXJsICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnCisKKyAgICAgICAgc2NtIHsKKyAgICAgICAgICAgIHVybCAnaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQnCisgICAgICAgICAgICBjb25uZWN0aW9uICdzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCcKKyAgICAgICAgICAgIGRldmVsb3BlckNvbm5lY3Rpb24gJ3NjbTpnaXQ6Z2l0QGdpdGh1Yi5jb206YXBhY2hlL3RocmlmdC5naXQnCisgICAgICAgIH0KKworICAgICAgICBsaWNlbnNlcyB7CisgICAgICAgICAgICBsaWNlbnNlIHsKKyAgICAgICAgICAgICAgICBuYW1lICdUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wJworICAgICAgICAgICAgICAgIHVybCAiJHtwcm9qZWN0LmxpY2Vuc2V9IgorICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbiAncmVwbycKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRldmVsb3BlcnMgeworICAgICAgICAgICAgZGV2ZWxvcGVyIHsKKyAgICAgICAgICAgICAgICBpZCAnZGV2JworICAgICAgICAgICAgICAgIG5hbWUgJ0FwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycycKKyAgICAgICAgICAgICAgICBlbWFpbCAnZGV2QHRocmlmdC5hcGFjaGUub3JnJworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcG9tLndoZW5Db25maWd1cmVkIHsKKyAgICAgICAgLy8gRml4dXAgdGhlIHNjb3BlIGZvciBzZXJ2bGV0LWFwaSB0byBiZSAncHJvdmlkZWQnIGluc3RlYWQgb2YgJ2NvbXBpbGUnCisgICAgICAgIGRlcGVuZGVuY2llcy5maW5kIHsgZGVwIC0+IGRlcC5ncm91cElkID09ICdqYXZheC5zZXJ2bGV0JyAmJiBkZXAuYXJ0aWZhY3RJZCA9PSAnc2VydmxldC1hcGknIH0ud2l0aCB7CisgICAgICAgICAgICAvLyBpdC5vcHRpb25hbCA9IHRydWUKKyAgICAgICAgICAgIGl0LnNjb3BlID0gJ3Byb3ZpZGVkJworICAgICAgICB9CisgICAgfQorfQorCitpbnN0YWxsIHsKKyAgICByZXBvc2l0b3JpZXMubWF2ZW5JbnN0YWxsZXIgeworICAgICAgICBjb25maWd1cmVQb20ocG9tKQorICAgIH0KK30KKwordXBsb2FkQXJjaGl2ZXMgeworICAgIGRlcGVuZHNPbiB0ZXN0IC8vIG1ha2Ugc3VyZSB3ZSBydW4gdW5pdCB0ZXN0cyB3aGVuIHB1Ymxpc2hpbmcKKyAgICByZXBvc2l0b3JpZXMubWF2ZW5EZXBsb3llciB7CisgICAgICAgIC8vIHNpZ25Qb20gd2lsbCBzaWxlbnRseSBkbyBub3RoaW5nIHdoZW4gbm8gc2lnbmluZyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZAorICAgICAgICBiZWZvcmVEZXBsb3ltZW50IHsgTWF2ZW5EZXBsb3ltZW50IGRlcGxveW1lbnQgLT4gc2lnbmluZy5zaWduUG9tKGRlcGxveW1lbnQpIH0KKyAgICAgICAgcmVwb3NpdG9yeSh1cmw6IHByb2plY3QubWF2ZW5SZXBvc2l0b3J5VXJsKSB7CisgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNQcm9wZXJ0eSgnbWF2ZW5Vc2VyJykgJiYgcHJvamVjdC5oYXNQcm9wZXJ0eSgnbWF2ZW5QYXNzd29yZCcpKSB7CisgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24odXNlck5hbWU6IG1hdmVuVXNlciwgcGFzc3dvcmQ6IG1hdmVuUGFzc3dvcmQpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uZmlndXJlUG9tKHBvbSkKKyAgICB9Cit9CisKKy8vIFNpZ25pbmcgY29uZmlndXJhdGlvbiwgb3B0aW9uYWwsIG9ubHkgd2hlbiByZWxlYXNlIGFuZCB1cGxvYWRBcmNoaXZlcyBpcyBhY3RpdmF0ZWQKK3NpZ25pbmcgeworICAgIHJlcXVpcmVkIHsgIXZlcnNpb24uZW5kc1dpdGgoIlNOQVBTSE9UIikgJiYgZ3JhZGxlLnRhc2tHcmFwaC5oYXNUYXNrKCJ1cGxvYWRBcmNoaXZlcyIpIH0KKyAgICBzaWduIGNvbmZpZ3VyYXRpb25zLmFyY2hpdmVzCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvc291cmNlQ29uZmlndXJhdGlvbi5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvc291cmNlQ29uZmlndXJhdGlvbi5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkMDMzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9zb3VyY2VDb25maWd1cmF0aW9uLmdyYWRsZQpAQCAtMCwwICsxLDg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gc291cmNlIHNldHMgZm9yIG1haW4gYW5kIHRlc3Qgc291cmNlcworc291cmNlU2V0cyB7CisgICAgbWFpbiB7CisgICAgICAgIGphdmEgeworICAgICAgICAgICAgc3JjRGlyICdzcmMnCisgICAgICAgIH0KKyAgICB9CisgICAgdGVzdCB7CisgICAgICAgIGphdmEgeworICAgICAgICAgICAgc3JjRGlyICd0ZXN0JworICAgICAgICAgICAgLy8gc2VlIGZ1bmN0aW9uYWxUZXN0cy5ncmFkbGUgZm9yIHRoZXNlIGZpbGVzCisgICAgICAgICAgICBleGNsdWRlICcqKi90ZXN0L1Rlc3RDbGllbnQuamF2YScKKyAgICAgICAgICAgIGV4Y2x1ZGUgJyoqL3Rlc3QvVGVzdFNlcnZlci5qYXZhJworICAgICAgICAgICAgZXhjbHVkZSAnKiovdGVzdC9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YScKKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZXMgeworICAgICAgICAgICAgc3JjRGlyICd0ZXN0JworICAgICAgICAgICAgaW5jbHVkZSAnbG9nNGoucHJvcGVydGllcycKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tcGlsZXIgY29uZmlndXJhdGlvbiBkZXRhaWxzCisKK3NvdXJjZUNvbXBhdGliaWxpdHkgPSAnMS44JwordGFyZ2V0Q29tcGF0aWJpbGl0eSA9ICcxLjgnCisKK3Rhc2tzLndpdGhUeXBlKEphdmFDb21waWxlKSB7CisgICAgb3B0aW9ucy5lbmNvZGluZyA9ICdVVEYtOCcKKyAgICBvcHRpb25zLmRlYnVnID0gdHJ1ZQorICAgIG9wdGlvbnMuZGVwcmVjYXRpb24gPSB0cnVlCisgICAgLy8gb3B0aW9ucy5jb21waWxlckFyZ3MuYWRkQWxsKCctWGxpbnQ6dW5jaGVja2VkJykKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSmFyIHBhY2thZ2luZyBkZXRhaWxzCitwcm9jZXNzUmVzb3VyY2VzIHsKKyAgICBpbnRvKCdNRVRBLUlORicpIHsKKyAgICAgICAgZnJvbSAiJHRocmlmdFJvb3QvTElDRU5TRSIKKyAgICAgICAgZnJvbSAiJHRocmlmdFJvb3QvTk9USUNFIgorICAgICAgICByZW5hbWUoJyguKyknLCAnJDEudHh0JykKKyAgICB9Cit9CisKK2phciB7CisgICAgcHJvamVjdC50ZXN0LmRlcGVuZHNPbiBpdAorICAgIG1hbmlmZXN0IHsKKyAgICAgICAgYXR0cmlidXRlcyhbCisgICAgICAgICAgICAiSW1wbGVtZW50YXRpb24tVmVyc2lvbiI6ICIke3Byb2plY3QudmVyc2lvbn0iLAorICAgICAgICAgICAgIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iOiAiMiIsCisgICAgICAgICAgICAiQnVuZGxlLVN5bWJvbGljTmFtZSI6ICIke3Byb2plY3QuZ3JvdXB9IiwKKyAgICAgICAgICAgICJCdW5kbGUtTmFtZSI6ICJBcGFjaGUgVGhyaWZ0IiwKKyAgICAgICAgICAgICJCdW5kbGUtVmVyc2lvbiI6ICIke3Byb2plY3QudmVyc2lvbn0iLAorICAgICAgICAgICAgIkJ1bmRsZS1EZXNjcmlwdGlvbiI6ICJBcGFjaGUgVGhyaWZ0IGxpYnJhcnkiLAorICAgICAgICAgICAgIkJ1bmRsZS1MaWNlbnNlIjogIiR7cHJvamVjdC5saWNlbnNlfSIsCisgICAgICAgICAgICAiQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3kiOiAibGF6eSIsCisgICAgICAgICAgICAiRXhwb3J0LVBhY2thZ2UiOiAiJHtwcm9qZWN0Lmdyb3VwfS5hc3luYzt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2wsJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQsb3JnLnNsZjRqLCR7cHJvamVjdC5ncm91cH1cIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2w7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydCwke3Byb2plY3QuZ3JvdXB9LCR7cHJvamVjdC5ncm91cH0uc2NoZW1lXCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnNlcnZlcjt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0udHJhbnNwb3J0LCR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2wsJHtwcm9qZWN0Lmdyb3VwfSxvcmcuc2xmNGosamF2YXguc2VydmxldCxqYXZheC5zZXJ2bGV0Lmh0dHBcIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH0udHJhbnNwb3J0O3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfS5wcm90b2NvbCwke3Byb2plY3QuZ3JvdXB9LG9yZy5hcGFjaGUuaHR0cC5jbGllbnQsb3JnLmFwYWNoZS5odHRwLnBhcmFtcyxvcmcuYXBhY2hlLmh0dHAuZW50aXR5LG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcyxvcmcuYXBhY2hlLmh0dHAsb3JnLnNsZjRqLGphdmF4Lm5ldC5zc2wsamF2YXgubmV0LGphdmF4LnNlY3VyaXR5LnNhc2wsamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFja1wiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfTt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2wsJHtwcm9qZWN0Lmdyb3VwfS5hc3luYywke3Byb2plY3QuZ3JvdXB9LnNlcnZlciwke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydCxvcmcuc2xmNGosb3JnLmFwYWNoZS5sb2c0aiwke3Byb2plY3QuZ3JvdXB9LnNjaGVtZVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS5tZXRhX2RhdGE7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9XCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnNjaGVtZTt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2wsJHtwcm9qZWN0Lmdyb3VwfVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIiLAorICAgICAgICAgICAgIkltcG9ydC1QYWNrYWdlIjogImphdmF4Lm5ldCxqYXZheC5uZXQuc3NsLGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2ssamF2YXguc2VjdXJpdHkuc2FzbCxqYXZheC5zZXJ2bGV0O3Jlc29sdXRpb246PW9wdGlvbmFsLGphdmF4LnNlcnZsZXQuaHR0cDtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuc2xmNGo7cmVzb2x1dGlvbjo9b3B0aW9uYWw7dmVyc2lvbj1cIlsxLjQsMilcIixvcmcuYXBhY2hlLmh0dHAuY2xpZW50O3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cC5wYXJhbXM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS5odHRwLmVudGl0eTtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS5odHRwO3Jlc29sdXRpb246PW9wdGlvbmFsIgorICAgICAgICBdKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS91bml0VGVzdHMuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL3VuaXRUZXN0cy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmMmZiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS91bml0VGVzdHMuZ3JhZGxlCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyBCdW5kbGUgdGhlIHRlc3QgY2xhc3NlcyBpbiBhIEpBUiBmb3Igb3RoZXIgQW50IGJhc2VkIGJ1aWxkcwordGFzayB0ZXN0SmFyKHR5cGU6IEphciwgZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZXMgYSBqYXIgYXJjaGl2ZSBjb250YWluaW5nIHRoZSB0ZXN0IGNsYXNzZXMuJworICAgIHByb2plY3QudGVzdC5kZXBlbmRzT24gaXQKKworICAgIGNsYXNzaWZpZXIgJ3Rlc3QnCisgICAgZnJvbSBzb3VyY2VTZXRzLnRlc3Qub3V0cHV0Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVuaXQgdGVzdCB0YXNrcyBhbmQgY29uZmlndXJhdGlvbnMKKworLy8gSGVscCB0aGUgdXAgdG8gZGF0ZSBhbGdvcml0aG0gdG8gbWFrZSB0aGVzZSB0ZXN0cyBkb25lCitleHQubWFya1Rhc2tEb25lID0geyB0YXNrIC0+CisgICAgZGVmIGJ1aWxkRmlsZSA9IGZpbGUoIiRidWlsZERpci8ke3Rhc2submFtZX0uZmxhZyIpCisgICAgdGFzay5pbnB1dHMuZmlsZXMgdGFzay5jbGFzc3BhdGgKKyAgICB0YXNrLm91dHB1dHMuZmlsZSBidWlsZEZpbGUKKyAgICB0YXNrLmRvTGFzdCB7CisgICAgICAgIGJ1aWxkRmlsZS50ZXh0ID0gJ1Bhc3NlZCEnCisgICAgfQorfQorCit0YXNrIGRlcHJlY2F0ZWRFcXVhbGl0eVRlc3QodHlwZTogSmF2YUV4ZWMsIGdyb3VwOiAnVmVyaWZpY2F0aW9uJykgeworICAgIGRlc2NyaXB0aW9uID0gJ1J1biB0aGUgbm9uLUpVbml0IHRlc3Qgc3VpdGUgJworICAgIGNsYXNzcGF0aCA9IHNvdXJjZVNldHMudGVzdC5ydW50aW1lQ2xhc3NwYXRoCisgICAgbWFpbiAnb3JnLmFwYWNoZS50aHJpZnQudGVzdC5FcXVhbGl0eVRlc3QnCisgICAgbWFya1Rhc2tEb25lKGl0KQorfQorCit0YXNrIGRlcHJlY2F0ZWRKYXZhQmVhbnNUZXN0KHR5cGU6IEphdmFFeGVjLCBncm91cDogJ1ZlcmlmaWNhdGlvbicpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdSdW4gdGhlIG5vbi1KVW5pdCB0ZXN0IHN1aXRlICcKKyAgICBjbGFzc3BhdGggPSBzb3VyY2VTZXRzLnRlc3QucnVudGltZUNsYXNzcGF0aAorICAgIG1haW4gJ29yZy5hcGFjaGUudGhyaWZ0LnRlc3QuSmF2YUJlYW5zVGVzdCcKKyAgICBtYXJrVGFza0RvbmUoaXQpCit9CisKKy8vIE1haW4gVW5pdCBUZXN0IHRhc2sgY29uZmlndXJhdGlvbgordGVzdCB7CisgICAgZGVzY3JpcHRpb249IlJ1biB0aGUgZnVsbCB0ZXN0IHN1aXRlIgorICAgIGRlcGVuZHNPbiBkZXByZWNhdGVkRXF1YWxpdHlUZXN0LCBkZXByZWNhdGVkSmF2YUJlYW5zVGVzdAorCisgICAgLy8gQWxsb3cgcmVwZWF0aW5nIHRlc3RzIGV2ZW4gYWZ0ZXIgc3VjY2Vzc2Z1bCBleGVjdXRpb24KKyAgICBpZiAocHJvamVjdC5oYXNQcm9wZXJ0eSgncmVydW5UZXN0cycpKSB7CisgICAgICAgIG91dHB1dHMudXBUb0RhdGVXaGVuIHsgZmFsc2UgfQorICAgIH0KKworICAgIGluY2x1ZGUgJyoqL1Rlc3QqLmNsYXNzJworICAgIGV4Y2x1ZGUgJyoqL1Rlc3QqXCQqLmNsYXNzJworCisgICAgbWF4SGVhcFNpemUgPSAnNTEybScKKyAgICBmb3JrRXZlcnkgPSAxCisKKyAgICBzeXN0ZW1Qcm9wZXJ0aWVzID0gWworICAgICAgICAnYnVpbGQudGVzdCc6ICIke2NvbXBpbGVUZXN0SmF2YS5kZXN0aW5hdGlvbkRpcn0iLAorICAgICAgICAndGVzdC5wb3J0JzogIiR7dGVzdFBvcnR9IiwKKyAgICAgICAgJ2phdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSc6ICIke3Byb2plY3REaXJ9L3Rlc3QvLnRydXN0c3RvcmUiLAorICAgICAgICAnamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQnOiAndGhyaWZ0JywKKyAgICAgICAgJ2phdmF4Lm5ldC5zc2wua2V5U3RvcmUnOiAiJHtwcm9qZWN0RGlyfS90ZXN0Ly5rZXlzdG9yZSIsCisgICAgICAgICdqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQnOiAndGhyaWZ0JworICAgIF0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphciBiL2xpYi9qYXZhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM0MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMgYi9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNmM4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorZGlzdHJpYnV0aW9uQmFzZT1HUkFETEVfVVNFUl9IT01FCitkaXN0cmlidXRpb25QYXRoPXdyYXBwZXIvZGlzdHMKK3ppcFN0b3JlQmFzZT1HUkFETEVfVVNFUl9IT01FCit6aXBTdG9yZVBhdGg9d3JhcHBlci9kaXN0cworZGlzdHJpYnV0aW9uVXJsPWh0dHBzXDovL3NlcnZpY2VzLmdyYWRsZS5vcmcvZGlzdHJpYnV0aW9ucy9ncmFkbGUtNS4xLjEtYmluLnppcApkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxldyBiL2xpYi9qYXZhL2dyYWRsZXcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2NjZGQzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZXcKQEAgLTAsMCArMSwxNzIgQEAKKyMhL3Vzci9iaW4vZW52IHNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjICBHcmFkbGUgc3RhcnQgdXAgc2NyaXB0IGZvciBVTipYCisjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQXR0ZW1wdCB0byBzZXQgQVBQX0hPTUUKKyMgUmVzb2x2ZSBsaW5rczogJDAgbWF5IGJlIGEgbGluaworUFJHPSIkMCIKKyMgTmVlZCB0aGlzIGZvciByZWxhdGl2ZSBzeW1saW5rcy4KK3doaWxlIFsgLWggIiRQUkciIF0gOyBkbworICAgIGxzPWBscyAtbGQgIiRQUkciYAorICAgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBQUkc9IiRsaW5rIgorICAgIGVsc2UKKyAgICAgICAgUFJHPWBkaXJuYW1lICIkUFJHImAiLyRsaW5rIgorICAgIGZpCitkb25lCitTQVZFRD0iYHB3ZGAiCitjZCAiYGRpcm5hbWUgXCIkUFJHXCJgLyIgPi9kZXYvbnVsbAorQVBQX0hPTUU9ImBwd2QgLVBgIgorY2QgIiRTQVZFRCIgPi9kZXYvbnVsbAorCitBUFBfTkFNRT0iR3JhZGxlIgorQVBQX0JBU0VfTkFNRT1gYmFzZW5hbWUgIiQwImAKKworIyBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4KK0RFRkFVTFRfSlZNX09QVFM9IiIKKworIyBVc2UgdGhlIG1heGltdW0gYXZhaWxhYmxlLCBvciBzZXQgTUFYX0ZEICE9IC0xIHRvIHVzZSB0aGF0IHZhbHVlLgorTUFYX0ZEPSJtYXhpbXVtIgorCit3YXJuICgpIHsKKyAgICBlY2hvICIkKiIKK30KKworZGllICgpIHsKKyAgICBlY2hvCisgICAgZWNobyAiJCoiCisgICAgZWNobworICAgIGV4aXQgMQorfQorCisjIE9TIHNwZWNpZmljIHN1cHBvcnQgKG11c3QgYmUgJ3RydWUnIG9yICdmYWxzZScpLgorY3lnd2luPWZhbHNlCittc3lzPWZhbHNlCitkYXJ3aW49ZmFsc2UKK25vbnN0b3A9ZmFsc2UKK2Nhc2UgImB1bmFtZWAiIGluCisgIENZR1dJTiogKQorICAgIGN5Z3dpbj10cnVlCisgICAgOzsKKyAgRGFyd2luKiApCisgICAgZGFyd2luPXRydWUKKyAgICA7OworICBNSU5HVyogKQorICAgIG1zeXM9dHJ1ZQorICAgIDs7CisgIE5PTlNUT1AqICkKKyAgICBub25zdG9wPXRydWUKKyAgICA7OworZXNhYworCitDTEFTU1BBVEg9JEFQUF9IT01FL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgorCisjIERldGVybWluZSB0aGUgSmF2YSBjb21tYW5kIHRvIHVzZSB0byBzdGFydCB0aGUgSlZNLgoraWYgWyAtbiAiJEpBVkFfSE9NRSIgXSA7IHRoZW4KKyAgICBpZiBbIC14ICIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIiBdIDsgdGhlbgorICAgICAgICAjIElCTSdzIEpESyBvbiBBSVggdXNlcyBzdHJhbmdlIGxvY2F0aW9ucyBmb3IgdGhlIGV4ZWN1dGFibGVzCisgICAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvanJlL3NoL2phdmEiCisgICAgZWxzZQorICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2Jpbi9qYXZhIgorICAgIGZpCisgICAgaWYgWyAhIC14ICIkSkFWQUNNRCIgXSA7IHRoZW4KKyAgICAgICAgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJEpBVkFfSE9NRQorCitQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2xvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgorICAgIGZpCitlbHNlCisgICAgSkFWQUNNRD0iamF2YSIKKyAgICB3aGljaCBqYXZhID4vZGV2L251bGwgMj4mMSB8fCBkaWUgIkVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorCitQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2xvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgorZmkKKworIyBJbmNyZWFzZSB0aGUgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3JzIGlmIHdlIGNhbi4KK2lmIFsgIiRjeWd3aW4iID0gImZhbHNlIiAtYSAiJGRhcndpbiIgPSAiZmFsc2UiIC1hICIkbm9uc3RvcCIgPSAiZmFsc2UiIF0gOyB0aGVuCisgICAgTUFYX0ZEX0xJTUlUPWB1bGltaXQgLUggLW5gCisgICAgaWYgWyAkPyAtZXEgMCBdIDsgdGhlbgorICAgICAgICBpZiBbICIkTUFYX0ZEIiA9ICJtYXhpbXVtIiAtbyAiJE1BWF9GRCIgPSAibWF4IiBdIDsgdGhlbgorICAgICAgICAgICAgTUFYX0ZEPSIkTUFYX0ZEX0xJTUlUIgorICAgICAgICBmaQorICAgICAgICB1bGltaXQgLW4gJE1BWF9GRAorICAgICAgICBpZiBbICQ/IC1uZSAwIF0gOyB0aGVuCisgICAgICAgICAgICB3YXJuICJDb3VsZCBub3Qgc2V0IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEIgorICAgICAgICBmaQorICAgIGVsc2UKKyAgICAgICAgd2FybiAiQ291bGQgbm90IHF1ZXJ5IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEX0xJTUlUIgorICAgIGZpCitmaQorCisjIEZvciBEYXJ3aW4sIGFkZCBvcHRpb25zIHRvIHNwZWNpZnkgaG93IHRoZSBhcHBsaWNhdGlvbiBhcHBlYXJzIGluIHRoZSBkb2NrCitpZiAkZGFyd2luOyB0aGVuCisgICAgR1JBRExFX09QVFM9IiRHUkFETEVfT1BUUyBcIi1YZG9jazpuYW1lPSRBUFBfTkFNRVwiIFwiLVhkb2NrOmljb249JEFQUF9IT01FL21lZGlhL2dyYWRsZS5pY25zXCIiCitmaQorCisjIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBXaW5kb3dzIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCitpZiAkY3lnd2luIDsgdGhlbgorICAgIEFQUF9IT01FPWBjeWdwYXRoIC0tcGF0aCAtLW1peGVkICIkQVBQX0hPTUUiYAorICAgIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJENMQVNTUEFUSCJgCisgICAgSkFWQUNNRD1gY3lncGF0aCAtLXVuaXggIiRKQVZBQ01EImAKKworICAgICMgV2UgYnVpbGQgdGhlIHBhdHRlcm4gZm9yIGFyZ3VtZW50cyB0byBiZSBjb252ZXJ0ZWQgdmlhIGN5Z3BhdGgKKyAgICBST09URElSU1JBVz1gZmluZCAtTCAvIC1tYXhkZXB0aCAxIC1taW5kZXB0aCAxIC10eXBlIGQgMj4vZGV2L251bGxgCisgICAgU0VQPSIiCisgICAgZm9yIGRpciBpbiAkUk9PVERJUlNSQVcgOyBkbworICAgICAgICBST09URElSUz0iJFJPT1RESVJTJFNFUCRkaXIiCisgICAgICAgIFNFUD0ifCIKKyAgICBkb25lCisgICAgT1VSQ1lHUEFUVEVSTj0iKF4oJFJPT1RESVJTKSkiCisgICAgIyBBZGQgYSB1c2VyLWRlZmluZWQgcGF0dGVybiB0byB0aGUgY3lncGF0aCBhcmd1bWVudHMKKyAgICBpZiBbICIkR1JBRExFX0NZR1BBVFRFUk4iICE9ICIiIF0gOyB0aGVuCisgICAgICAgIE9VUkNZR1BBVFRFUk49IiRPVVJDWUdQQVRURVJOfCgkR1JBRExFX0NZR1BBVFRFUk4pIgorICAgIGZpCisgICAgIyBOb3cgY29udmVydCB0aGUgYXJndW1lbnRzIC0ga2x1ZGdlIHRvIGxpbWl0IG91cnNlbHZlcyB0byAvYmluL3NoCisgICAgaT0wCisgICAgZm9yIGFyZyBpbiAiJEAiIDsgZG8KKyAgICAgICAgQ0hFQ0s9YGVjaG8gIiRhcmcifGVncmVwIC1jICIkT1VSQ1lHUEFUVEVSTiIgLWAKKyAgICAgICAgQ0hFQ0syPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiXi0iYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBEZXRlcm1pbmUgaWYgYW4gb3B0aW9uCisKKyAgICAgICAgaWYgWyAkQ0hFQ0sgLW5lIDAgXSAmJiBbICRDSEVDSzIgLWVxIDAgXSA7IHRoZW4gICAgICAgICAgICAgICAgICAgICMjIyBBZGRlZCBhIGNvbmRpdGlvbgorICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPWBjeWdwYXRoIC0tcGF0aCAtLWlnbm9yZSAtLW1peGVkICIkYXJnImAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPSJcIiRhcmdcIiIKKyAgICAgICAgZmkKKyAgICAgICAgaT0kKChpKzEpKQorICAgIGRvbmUKKyAgICBjYXNlICRpIGluCisgICAgICAgICgwKSBzZXQgLS0gOzsKKyAgICAgICAgKDEpIHNldCAtLSAiJGFyZ3MwIiA7OworICAgICAgICAoMikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiIDs7CisgICAgICAgICgzKSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgOzsKKyAgICAgICAgKDQpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiA7OworICAgICAgICAoNSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiIDs7CisgICAgICAgICg2KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgOzsKKyAgICAgICAgKDcpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiA7OworICAgICAgICAoOCkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciIDs7CisgICAgICAgICg5KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgIiRhcmdzNyIgIiRhcmdzOCIgOzsKKyAgICBlc2FjCitmaQorCisjIEVzY2FwZSBhcHBsaWNhdGlvbiBhcmdzCitzYXZlICgpIHsKKyAgICBmb3IgaSBkbyBwcmludGYgJXNcXG4gIiRpIiB8IHNlZCAicy8nLydcXFxcJycvZzsxcy9eLycvO1wkcy9cJC8nIFxcXFwvIiA7IGRvbmUKKyAgICBlY2hvICIgIgorfQorQVBQX0FSR1M9JChzYXZlICIkQCIpCisKKyMgQ29sbGVjdCBhbGwgYXJndW1lbnRzIGZvciB0aGUgamF2YSBjb21tYW5kLCBmb2xsb3dpbmcgdGhlIHNoZWxsIHF1b3RpbmcgYW5kIHN1YnN0aXR1dGlvbiBydWxlcworZXZhbCBzZXQgLS0gJERFRkFVTFRfSlZNX09QVFMgJEpBVkFfT1BUUyAkR1JBRExFX09QVFMgIlwiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JEFQUF9CQVNFX05BTUVcIiIgLWNsYXNzcGF0aCAiXCIkQ0xBU1NQQVRIXCIiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAiJEFQUF9BUkdTIgorCisjIGJ5IGRlZmF1bHQgd2Ugc2hvdWxkIGJlIGluIHRoZSBjb3JyZWN0IHByb2plY3QgZGlyLCBidXQgd2hlbiBydW4gZnJvbSBGaW5kZXIgb24gTWFjLCB0aGUgY3dkIGlzIHdyb25nCitpZiBbICIkKHVuYW1lKSIgPSAiRGFyd2luIiBdICYmIFsgIiRIT01FIiA9ICIkUFdEIiBdOyB0aGVuCisgIGNkICIkKGRpcm5hbWUgIiQwIikiCitmaQorCitleGVjICIkSkFWQUNNRCIgIiRAIgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxldy5iYXQgYi9saWIvamF2YS9ncmFkbGV3LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTU1MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxldy5iYXQKQEAgLTAsMCArMSw4NCBAQAorQGlmICIlREVCVUclIiA9PSAiIiBAZWNobyBvZmYKK0ByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0ByZW0KK0ByZW0gIEdyYWRsZSBzdGFydHVwIHNjcmlwdCBmb3IgV2luZG93cworQHJlbQorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitAcmVtIFNldCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwKK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIHNldGxvY2FsCisKK3NldCBESVJOQU1FPSV+ZHAwCitpZiAiJURJUk5BTUUlIiA9PSAiIiBzZXQgRElSTkFNRT0uCitzZXQgQVBQX0JBU0VfTkFNRT0lfm4wCitzZXQgQVBQX0hPTUU9JURJUk5BTUUlCisKK0ByZW0gQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitzZXQgREVGQVVMVF9KVk1fT1BUUz0KKworQHJlbSBGaW5kIGphdmEuZXhlCitpZiBkZWZpbmVkIEpBVkFfSE9NRSBnb3RvIGZpbmRKYXZhRnJvbUphdmFIb21lCisKK3NldCBKQVZBX0VYRT1qYXZhLmV4ZQorJUpBVkFfRVhFJSAtdmVyc2lvbiA+TlVMIDI+JjEKK2lmICIlRVJST1JMRVZFTCUiID09ICIwIiBnb3RvIGluaXQKKworZWNoby4KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBub3Qgc2V0IGFuZCBubyAnamF2YScgY29tbWFuZCBjb3VsZCBiZSBmb3VuZCBpbiB5b3VyIFBBVEguCitlY2hvLgorZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4KKworZ290byBmYWlsCisKKzpmaW5kSmF2YUZyb21KYXZhSG9tZQorc2V0IEpBVkFfSE9NRT0lSkFWQV9IT01FOiI9JQorc2V0IEpBVkFfRVhFPSVKQVZBX0hPTUUlL2Jpbi9qYXZhLmV4ZQorCitpZiBleGlzdCAiJUpBVkFfRVhFJSIgZ290byBpbml0CisKK2VjaG8uCitlY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgc2V0IHRvIGFuIGludmFsaWQgZGlyZWN0b3J5OiAlSkFWQV9IT01FJQorZWNoby4KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uCisKK2dvdG8gZmFpbAorCis6aW5pdAorQHJlbSBHZXQgY29tbWFuZC1saW5lIGFyZ3VtZW50cywgaGFuZGxpbmcgV2luZG93cyB2YXJpYW50cworCitpZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBnb3RvIHdpbjl4TUVfYXJncworCis6d2luOXhNRV9hcmdzCitAcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorc2V0IENNRF9MSU5FX0FSR1M9CitzZXQgX1NLSVA9MgorCis6d2luOXhNRV9hcmdzX3NsdXJwCitpZiAieCV+MSIgPT0gIngiIGdvdG8gZXhlY3V0ZQorCitzZXQgQ01EX0xJTkVfQVJHUz0lKgorCis6ZXhlY3V0ZQorQHJlbSBTZXR1cCB0aGUgY29tbWFuZCBsaW5lCisKK3NldCBDTEFTU1BBVEg9JUFQUF9IT01FJVxncmFkbGVcd3JhcHBlclxncmFkbGUtd3JhcHBlci5qYXIKKworQHJlbSBFeGVjdXRlIEdyYWRsZQorIiVKQVZBX0VYRSUiICVERUZBVUxUX0pWTV9PUFRTJSAlSkFWQV9PUFRTJSAlR1JBRExFX09QVFMlICItRG9yZy5ncmFkbGUuYXBwbmFtZT0lQVBQX0JBU0VfTkFNRSUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gJUNNRF9MSU5FX0FSR1MlCisKKzplbmQKK0ByZW0gRW5kIGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbAoraWYgIiVFUlJPUkxFVkVMJSI9PSIwIiBnb3RvIG1haW5FbmQKKworOmZhaWwKK3JlbSBTZXQgdmFyaWFibGUgR1JBRExFX0VYSVRfQ09OU09MRSBpZiB5b3UgbmVlZCB0aGUgX3NjcmlwdF8gcmV0dXJuIGNvZGUgaW5zdGVhZCBvZgorcmVtIHRoZSBfY21kLmV4ZSAvY18gcmV0dXJuIGNvZGUhCitpZiAgbm90ICIiID09ICIlR1JBRExFX0VYSVRfQ09OU09MRSUiIGV4aXQgMQorZXhpdCAvYiAxCisKKzptYWluRW5kCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBlbmRsb2NhbAorCis6b21lZ2EKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NldHRpbmdzLmdyYWRsZSBiL2xpYi9qYXZhL3NldHRpbmdzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJkOGJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc2V0dGluZ3MuZ3JhZGxlCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcm9vdFByb2plY3QubmFtZSA9ICdsaWJ0aHJpZnQnCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXN5bmNQcm9jZXNzRnVuY3Rpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Bc3luY1Byb2Nlc3NGdW5jdGlvbi5qYXZhCmluZGV4IDc5OWUwMmQuLjQ4M2M4ZDAgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Bc3luY1Byb2Nlc3NGdW5jdGlvbi5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Bc3luY1Byb2Nlc3NGdW5jdGlvbi5qYXZhCkBAIC0yMCwxMSArMjAsMTAgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlcjsKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIEFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksIFQsIFI+IHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCBUIGV4dGVuZHMgVEJhc2UsIFI+IHsKICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZTsKIAogICAgIHB1YmxpYyBBc3luY1Byb2Nlc3NGdW5jdGlvbihTdHJpbmcgbWV0aG9kTmFtZSkgewpAQCAtMzcsMTMgKzM2LDEzIEBACiAKICAgICBwdWJsaWMgYWJzdHJhY3QgVCBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpOwogCi0gICAgcHVibGljIGFic3RyYWN0IEFzeW5jTWV0aG9kQ2FsbGJhY2sgZ2V0UmVzdWx0SGFuZGxlcihmaW5hbCBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLkFzeW5jRnJhbWVCdWZmZXIgZmIsIGludCBzZXFpZCk7CisgICAgcHVibGljIGFic3RyYWN0IEFzeW5jTWV0aG9kQ2FsbGJhY2s8Uj4gZ2V0UmVzdWx0SGFuZGxlcihmaW5hbCBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLkFzeW5jRnJhbWVCdWZmZXIgZmIsIGludCBzZXFpZCk7CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7CiAgICAgICAgIHJldHVybiBtZXRob2ROYW1lOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNlbmRSZXNwb25zZShmaW5hbCBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLkFzeW5jRnJhbWVCdWZmZXIgZmIsIGZpbmFsIFRCYXNlIHJlc3VsdCwgZmluYWwgYnl0ZSB0eXBlLCBmaW5hbCBpbnQgc2VxaWQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzZW5kUmVzcG9uc2UoZmluYWwgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBmaW5hbCBUU2VyaWFsaXphYmxlIHJlc3VsdCwgZmluYWwgYnl0ZSB0eXBlLCBmaW5hbCBpbnQgc2VxaWQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAgICAgVFByb3RvY29sIG9wcm90ID0gZmIuZ2V0T3V0cHV0UHJvdG9jb2woKTsKIAogICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoZ2V0TWV0aG9kTmFtZSgpLCB0eXBlLCBzZXFpZCkpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L09wdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L09wdGlvbi5qYXZhCmluZGV4IGRiMjVlYzUuLmQ1Y2QzMDkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9PcHRpb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvT3B0aW9uLmphdmEKQEAgLTI0LDYgKzI0LDkgQEAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIE9wdGlvbjxUPiB7CiAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9wdGlvbiBOT05FID0gbmV3IE5vbmUoKTsKKwogICAgIC8qKgogICAgICAqIFdoZXRoZXIgdGhlIE9wdGlvbiBpcyBkZWZpbmVkIG9yIG5vdAogICAgICAqIEByZXR1cm4KQEAgLTg3LDcgKzkwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlNvbWUoIit2YWx1ZS50b1N0cmluZygpKyIpIjsKKyAgICAgICAgICAgIHJldHVybiAiU29tZSgiICsgdmFsdWUgKyAiKSI7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTk5LDkgKzEwMiw5IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8VD4gT3B0aW9uPFQ+IGZyb21OdWxsYWJsZShUIHZhbHVlKSB7CiAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNvbWU8VD4odmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHNvbWUodmFsdWUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBOb25lPFQ+KCk7CisgICAgICAgICAgICByZXR1cm4gbm9uZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTUsNyArMTE4LDggQEAKICAgICAgICAgcmV0dXJuIG5ldyBTb21lPFQ+KHZhbHVlKTsKICAgICB9CiAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIDxUPiBOb25lPFQ+IG5vbmUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTm9uZTxUPigpOworICAgICAgICByZXR1cm4gKE5vbmU8VD4pIE5PTkU7CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Qcm9jZXNzRnVuY3Rpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Qcm9jZXNzRnVuY3Rpb24uamF2YQppbmRleCAxOWM4ZjE0Li5lNjIxM2RmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvUHJvY2Vzc0Z1bmN0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Byb2Nlc3NGdW5jdGlvbi5qYXZhCkBAIC0xLDEyICsxLDEwIEBACi0vKioKLSAqIAotICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtMzMsMjcgKzMxLDQ5IEBACiAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgVEJhc2UgcmVzdWx0ID0gbnVsbDsKKyAgICBUU2VyaWFsaXphYmxlIHJlc3VsdCA9IG51bGw7CisgICAgYnl0ZSBtc2dUeXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZOwogCiAgICAgdHJ5IHsKICAgICAgIHJlc3VsdCA9IGdldFJlc3VsdChpZmFjZSwgYXJncyk7Ci0gICAgfSBjYXRjaChURXhjZXB0aW9uIHRleCkgewotICAgICAgTE9HR0VSLmVycm9yKCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCksIHRleCk7Ci0gICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGV4KSB7CisgICAgICBMT0dHRVIuZXJyb3IoIlRyYW5zcG9ydCBlcnJvciB3aGlsZSBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCksIGV4KTsKKyAgICAgIHRocm93IGV4OworICAgIH0gY2F0Y2ggKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgTE9HR0VSLmVycm9yKCJJbnRlcm5hbCBhcHBsaWNhdGlvbiBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCksIGV4KTsKKyAgICAgIHJlc3VsdCA9IGV4OworICAgICAgbXNnVHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT047CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICBMT0dHRVIuZXJyb3IoIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiArIGdldE1ldGhvZE5hbWUoKSwgZXgpOworICAgICAgaWYocmV0aHJvd1VuaGFuZGxlZEV4Y2VwdGlvbnMoKSkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBleCk7CisgICAgICBpZighaXNPbmV3YXkoKSkgeworICAgICAgICByZXN1bHQgPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwKKyAgICAgICAgICAgICJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCkpOworICAgICAgICBtc2dUeXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZighaXNPbmV3YXkoKSkgeworICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKGdldE1ldGhvZE5hbWUoKSwgbXNnVHlwZSwgc2VxaWQpKTsKKyAgICAgIHJlc3VsdC53cml0ZShvcHJvdCk7CisgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihpbnQgc2VxaWQsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGlmICghaXNPbmV3YXkoKSkgeworICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwKICAgICAgICAgIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiArIGdldE1ldGhvZE5hbWUoKSk7CiAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoZ2V0TWV0aG9kTmFtZSgpLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOwogICAgICAgeC53cml0ZShvcHJvdCk7CiAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKICAgICAgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7Ci0gICAgICByZXR1cm47CiAgICAgfQorICB9CiAKLSAgICBpZighaXNPbmV3YXkoKSkgewotICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKGdldE1ldGhvZE5hbWUoKSwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkpOwotICAgICAgcmVzdWx0LndyaXRlKG9wcm90KTsKLSAgICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOwotICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKLSAgICB9CisgIHByb3RlY3RlZCBib29sZWFuIHJldGhyb3dVbmhhbmRsZWRFeGNlcHRpb25zKCl7CisgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNPbmV3YXkoKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9TaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvU2hvcnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTU3ZDFjLi4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9TaG9ydFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwotCi0vKioKLSAqIFNob3J0U3RhY2sgaXMgYSBzaG9ydC1zcGVjaWZpYyBTdGFjayBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGZvciB0aGUgZXhwcmVzcwotICogcHVycG9zZSBvZiB2ZXJ5IGZhc3Qgb3BlcmF0aW9ucyBvbiBUQ29tcGFjdFByb3RvY29sJ3MgZmllbGQgaWQgc3RhY2suIFRoaXMKLSAqIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIGF0IGxlYXN0IDEweCBmYXN0ZXIgdGhhbiBqYXZhLnV0aWwuU3RhY2suCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG9ydFN0YWNrIHsKLQotICBwcml2YXRlIHNob3J0W10gdmVjdG9yOwotICBwcml2YXRlIGludCB0b3AgPSAtMTsKLQotICBwdWJsaWMgU2hvcnRTdGFjayhpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0gICAgdmVjdG9yID0gbmV3IHNob3J0W2luaXRpYWxDYXBhY2l0eV07Ci0gIH0KLQotICBwdWJsaWMgc2hvcnQgcG9wKCkgewotICAgIHJldHVybiB2ZWN0b3JbdG9wLS1dOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHVzaChzaG9ydCBwdXNoZWQpIHsKLSAgICBpZiAodmVjdG9yLmxlbmd0aCA9PSB0b3AgKyAxKSB7Ci0gICAgICBncm93KCk7Ci0gICAgfQotICAgIHZlY3RvclsrK3RvcF0gPSBwdXNoZWQ7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZ3JvdygpIHsKLSAgICBzaG9ydFtdIG5ld1ZlY3RvciA9IG5ldyBzaG9ydFt2ZWN0b3IubGVuZ3RoICogMl07Ci0gICAgU3lzdGVtLmFycmF5Y29weSh2ZWN0b3IsIDAsIG5ld1ZlY3RvciwgMCwgdmVjdG9yLmxlbmd0aCk7Ci0gICAgdmVjdG9yID0gbmV3VmVjdG9yOwotICB9Ci0KLSAgcHVibGljIHNob3J0IHBlZWsoKSB7Ci0gICAgcmV0dXJuIHZlY3Rvclt0b3BdOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgdG9wID0gLTE7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBzYi5hcHBlbmQoIjxTaG9ydFN0YWNrIHZlY3RvcjpbIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3IubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmIChpICE9IDApIHsKLSAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpID09IHRvcCkgewotICAgICAgICBzYi5hcHBlbmQoIj4+Iik7Ci0gICAgICB9Ci0KLSAgICAgIHNiLmFwcGVuZCh2ZWN0b3JbaV0pOwotCi0gICAgICBpZiAoaSA9PSB0b3ApIHsKLSAgICAgICAgc2IuYXBwZW5kKCI8PCIpOwotICAgICAgfQotICAgIH0KLSAgICBzYi5hcHBlbmQoIl0+Iik7Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YQppbmRleCBiNTRhNWNlLi40ZDY5M2Q5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAgKiBBcHBsaWNhdGlvbiBsZXZlbCBleGNlcHRpb24KICAqCiAgKi8KLXB1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKK3B1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIGltcGxlbWVudHMgVFNlcmlhbGl6YWJsZSB7CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVFN0cnVjdCBUQVBQTElDQVRJT05fRVhDRVBUSU9OX1NUUlVDVCA9IG5ldyBUU3RydWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVEZpZWxkIE1FU1NBR0VfRklFTEQgPSBuZXcgVEZpZWxkKCJtZXNzYWdlIiwgVFR5cGUuU1RSSU5HLCAoc2hvcnQpMSk7CkBAIC01MCw2ICs1MCw3IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTA7CiAKICAgcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CisgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VfID0gbnVsbDsKIAogICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgewogICAgIHN1cGVyKCk7CkBAIC03Myw3ICs3NCwxOCBAQAogICAgIHJldHVybiB0eXBlXzsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgaWYgKG1lc3NhZ2VfID09IG51bGwpIHsKKyAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmV0dXJuIG1lc3NhZ2VfOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbgorICB7CiAgICAgVEZpZWxkIGZpZWxkOwogICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOwogCkBAIC04NiwzMiArOTgsNDMgQEAKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBzd2l0Y2ggKGZpZWxkLmlkKSB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgewotICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgICB0eXBlID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKLSAgICAgICAgICB0eXBlID0gaXByb3QucmVhZEkzMigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOwotICAgICAgICBicmVhazsKKyAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOwogICAgIH0KICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKTsKKyAgICB0eXBlXyA9IHR5cGU7CisgICAgbWVzc2FnZV8gPSBtZXNzYWdlOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBmYWN0b3J5IG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGdpdmVuIGEgVFByb3RvY29sIGlucHV0CisgICAqLworICBwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZWFkRnJvbShUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uCisgIHsKKyAgICBUQXBwbGljYXRpb25FeGNlcHRpb24gcmVzdWx0ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOworICAgIHJlc3VsdC5yZWFkKGlwcm90KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbgorICB7CiAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihUQVBQTElDQVRJT05fRVhDRVBUSU9OX1NUUlVDVCk7CiAgICAgaWYgKGdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CiAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oTUVTU0FHRV9GSUVMRCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFzeW5jUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFzeW5jUHJvY2Vzc29yLmphdmEKaW5kZXggMGEwNjllYS4uNjZmNzY4OCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBc3luY1Byb2Nlc3Nvci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXN5bmNQcm9jZXNzb3IuamF2YQpAQCAtMTgsMTggKzE4LDE2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuKjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuQXN5bmNGcmFtZUJ1ZmZlcjsKIAogcHVibGljIGludGVyZmFjZSBUQXN5bmNQcm9jZXNzb3IgewotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9ucyBtdXN0IGNhbGwgZmIucmVzcG9uc2VSZWFkeSgpIG9uY2UgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoZmluYWwgQXN5bmNGcmFtZUJ1ZmZlciBmYikgdGhyb3dzIFRFeGNlcHRpb247CisgIC8qKgorICAgKiBQcm9jZXNzIGEgc2luZ2xlIGZyYW1lLgorICAgCisgICAqIDxiPk5vdGU6PC9iPiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBjYWxsIGZiLnJlc3BvbnNlUmVhZHkoKSBvbmNlIHByb2Nlc3NpbmcKKyAgICogaXMgY29tcGxldGUKKyAgICoKKyAgICogQHRocm93cyBURXhjZXB0aW9uIGlmIHRoZSBmcmFtZSBjYW5ub3QgYmUgcHJvY2Vzc2VkCisgICAqLworICBwdWJsaWMgdm9pZCBwcm9jZXNzKGZpbmFsIEFzeW5jRnJhbWVCdWZmZXIgZmIpIHRocm93cyBURXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQppbmRleCBiM2VkMWJjLi5lMTQ4OWQ1IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQpAQCAtMjcsMjEgKzI3LDcgQEAKICAqIEdlbmVyaWMgYmFzZSBpbnRlcmZhY2UgZm9yIGdlbmVyYXRlZCBUaHJpZnQgb2JqZWN0cy4KICAqCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgVEJhc2U8VCBleHRlbmRzIFRCYXNlPD8sPz4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGV4dGVuZHMgQ29tcGFyYWJsZTxUPiwgIFNlcmlhbGl6YWJsZSB7Ci0KLSAgLyoqCi0gICAqIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgotICAgKgotICAgKiBAcGFyYW0gaXByb3QgSW5wdXQgcHJvdG9jb2wKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKLSAgICoKLSAgICogQHBhcmFtIG9wcm90IE91dHB1dCBwcm90b2NvbAotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKK3B1YmxpYyBpbnRlcmZhY2UgVEJhc2U8VCBleHRlbmRzIFRCYXNlPFQsRj4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGV4dGVuZHMgQ29tcGFyYWJsZTxUPiwgIFRTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZSB7CiAKICAgLyoqCiAgICAqIEdldCB0aGUgRiBpbnN0YW5jZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGZpZWxkSWQuCkBAIC01Niw3ICs0Miw3IEBACiAgIHB1YmxpYyBib29sZWFuIGlzU2V0KEYgZmllbGQpOwogCiAgIC8qKgotICAgKiBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIHZhcmlhYmxlLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluIAorICAgKiBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIHZhcmlhYmxlLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluCiAgICAqIHRoZSBhcHByb3ByaWF0ZSAiYm94ZWQiIHR5cGVzLgogICAgKgogICAgKiBAcGFyYW0gZmllbGQKQEAgLTcxLDcgKzU3LDcgQEAKICAgICovCiAgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoRiBmaWVsZCwgT2JqZWN0IHZhbHVlKTsKIAotICBwdWJsaWMgVEJhc2U8VCwgRj4gZGVlcENvcHkoKTsKKyAgcHVibGljIFQgZGVlcENvcHkoKTsKIAogICAvKioKICAgICogUmV0dXJuIHRvIHRoZSBzdGF0ZSBvZiBoYXZpbmcganVzdCBiZWVuIGluaXRpYWxpemVkLCBhcyB0aG91Z2ggeW91IGhhZCBqdXN0CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VBc3luY1Byb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlQXN5bmNQcm9jZXNzb3IuamF2YQppbmRleCBlZDZjMzIzLi5mMTNmMDY4IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VBc3luY1Byb2Nlc3Nvci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUFzeW5jUHJvY2Vzc29yLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CkBAIC00Miw3ICs0Myw3IEBACiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocHJvY2Vzc01hcCk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhmaW5hbCBBc3luY0ZyYW1lQnVmZmVyIGZiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgcHJvY2VzcyhmaW5hbCBBc3luY0ZyYW1lQnVmZmVyIGZiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAKICAgICAgICAgZmluYWwgVFByb3RvY29sIGluID0gZmIuZ2V0SW5wdXRQcm90b2NvbCgpOwogICAgICAgICBmaW5hbCBUUHJvdG9jb2wgb3V0ID0gZmIuZ2V0T3V0cHV0UHJvdG9jb2woKTsKQEAgLTUzLDQwICs1NCw2MSBAQAogICAgICAgICBpZiAoZm4gPT0gbnVsbCkgewogICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGluLCBUVHlwZS5TVFJVQ1QpOwogICAgICAgICAgICAgaW4ucmVhZE1lc3NhZ2VFbmQoKTsKLSAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsICJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnIittc2cubmFtZSsiJyIpOwotICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7Ci0gICAgICAgICAgICB4LndyaXRlKG91dCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlRW5kKCk7Ci0gICAgICAgICAgICBvdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKworICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBtZXRob2QgbmFtZTogJyIgKyBtc2cubmFtZSArICInIik7CisgICAgICAgICAgICBMT0dHRVIuZGVidWcoIkludmFsaWQgbWV0aG9kIG5hbWUiLCB4KTsKKworICAgICAgICAgICAgLy8gdGhpcyBtZWFucyBpdCBpcyBhIHR3by13YXkgcmVxdWVzdCwgc28gd2UgY2FuIHNlbmQgYSByZXBseQorICAgICAgICAgICAgaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5DQUxMKSB7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOworICAgICAgICAgICAgICB4LndyaXRlKG91dCk7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgICAgb3V0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBmYi5yZXNwb25zZVJlYWR5KCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIC8vR2V0IEFyZ3MKLSAgICAgICAgVEJhc2UgYXJncyA9IChUQmFzZSlmbi5nZXRFbXB0eUFyZ3NJbnN0YW5jZSgpOworICAgICAgICBUQmFzZSBhcmdzID0gZm4uZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgYXJncy5yZWFkKGluKTsKICAgICAgICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGluLnJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlBST1RPQ09MX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsKLSAgICAgICAgICAgIHgud3JpdGUob3V0KTsKLSAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VFbmQoKTsKLSAgICAgICAgICAgIG91dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworCisgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlBST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIExPR0dFUi5kZWJ1ZygiQ291bGQgbm90IHJldHJpZXZlIGZ1bmN0aW9uIGFyZ3VtZW50cyIsIHgpOworCisgICAgICAgICAgICBpZiAoIWZuLmlzT25ld2F5KCkpIHsKKyAgICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7CisgICAgICAgICAgICAgIHgud3JpdGUob3V0KTsKKyAgICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgICAgICAgICBvdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZiLnJlc3BvbnNlUmVhZHkoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGluLnJlYWRNZXNzYWdlRW5kKCk7CiAKKyAgICAgICAgaWYgKGZuLmlzT25ld2F5KCkpIHsKKyAgICAgICAgICBmYi5yZXNwb25zZVJlYWR5KCk7CisgICAgICAgIH0KIAogICAgICAgICAvL3N0YXJ0IG9mZiBwcm9jZXNzaW5nIGZ1bmN0aW9uCi0gICAgICAgIGZuLnN0YXJ0KGlmYWNlLCBhcmdzLGZuLmdldFJlc3VsdEhhbmRsZXIoZmIsbXNnLnNlcWlkKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIgPSBmbi5nZXRSZXN1bHRIYW5kbGVyKGZiLCBtc2cuc2VxaWQpOworICAgICAgICB0cnkgeworICAgICAgICAgIGZuLnN0YXJ0KGlmYWNlLCBhcmdzLCByZXN1bHRIYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoIkV4Y2VwdGlvbiBoYW5kbGluZyBmdW5jdGlvbiIsIGUpOworICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25FcnJvcihlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaW4sIFRQcm90b2NvbCBvdXQpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoVFByb3RvY29sIGluLCBUUHJvdG9jb2wgb3V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YQppbmRleCA1NTE3NTM2Li42ZjZjNmViIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YQpAQCAtMjUsMTAgKzI1LDExIEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgVEJhc2VIZWxwZXIgewogCkBAIC01Myw1NyArNTQsMjcgQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhib29sZWFuIGEsIGJvb2xlYW4gYikgewotICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoYSkuY29tcGFyZVRvKGIpOworICAgIHJldHVybiBCb29sZWFuLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYnl0ZSBhLCBieXRlIGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBCeXRlLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oc2hvcnQgYSwgc2hvcnQgYikgewotICAgIGlmIChhIDwgYikgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIFNob3J0LmNvbXBhcmUoYSxiKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhpbnQgYSwgaW50IGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBJbnRlZ2VyLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8obG9uZyBhLCBsb25nIGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBMb25nLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oZG91YmxlIGEsIGRvdWJsZSBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gRG91YmxlLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oU3RyaW5nIGEsIFN0cmluZyBiKSB7CkBAIC0xMTEsMTcgKzgyLDE2IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYnl0ZVtdIGEsIGJ5dGVbXSBiKSB7Ci0gICAgaW50IHNpemVDb21wYXJlID0gY29tcGFyZVRvKGEubGVuZ3RoLCBiLmxlbmd0aCk7Ci0gICAgaWYgKHNpemVDb21wYXJlICE9IDApIHsKLSAgICAgIHJldHVybiBzaXplQ29tcGFyZTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpbnQgYnl0ZUNvbXBhcmUgPSBjb21wYXJlVG8oYVtpXSwgYltpXSk7Ci0gICAgICBpZiAoYnl0ZUNvbXBhcmUgIT0gMCkgewotICAgICAgICByZXR1cm4gYnl0ZUNvbXBhcmU7CisgICAgaW50IGNvbXBhcmUgPSBjb21wYXJlVG8oYS5sZW5ndGgsIGIubGVuZ3RoKTsKKyAgICBpZiAoY29tcGFyZSA9PSAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgY29tcGFyZSA9IGNvbXBhcmVUbyhhW2ldLCBiW2ldKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiBjb21wYXJlOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKENvbXBhcmFibGUgYSwgQ29tcGFyYWJsZSBiKSB7CkBAIC0xMjksNDEgKzk5LDM5IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oTGlzdCBhLCBMaXN0IGIpIHsKLSAgICBpbnQgbGFzdENvbXBhcmlzb24gPSBjb21wYXJlVG8oYS5zaXplKCksIGIuc2l6ZSgpKTsKLSAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgewotICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGxhc3RDb21wYXJpc29uID0gY29tcGFyYXRvci5jb21wYXJlKGEuZ2V0KGkpLCBiLmdldChpKSk7Ci0gICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgewotICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgaW50IGNvbXBhcmUgPSBjb21wYXJlVG8oYS5zaXplKCksIGIuc2l6ZSgpKTsKKyAgICBpZiAoY29tcGFyZSA9PSAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29tcGFyZSA9IGNvbXBhcmF0b3IuY29tcGFyZShhLmdldChpKSwgYi5nZXQoaSkpOworICAgICAgICBpZiAoY29tcGFyZSAhPSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNvbXBhcmU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oU2V0IGEsIFNldCBiKSB7Ci0gICAgaW50IGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7Ci0gICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKLSAgICB9Ci0gICAgU29ydGVkU2V0IHNvcnRlZEEgPSBuZXcgVHJlZVNldChjb21wYXJhdG9yKTsKLSAgICBzb3J0ZWRBLmFkZEFsbChhKTsKLSAgICBTb3J0ZWRTZXQgc29ydGVkQiA9IG5ldyBUcmVlU2V0KGNvbXBhcmF0b3IpOwotICAgIHNvcnRlZEIuYWRkQWxsKGIpOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgQXJyYXlMaXN0IHNvcnRlZEEgPSBuZXcgQXJyYXlMaXN0KGEpOworICAgICAgQXJyYXlMaXN0IHNvcnRlZEIgPSBuZXcgQXJyYXlMaXN0KGIpOwogCi0gICAgSXRlcmF0b3IgaXRlckEgPSBzb3J0ZWRBLml0ZXJhdG9yKCk7Ci0gICAgSXRlcmF0b3IgaXRlckIgPSBzb3J0ZWRCLml0ZXJhdG9yKCk7CisgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZEEsIGNvbXBhcmF0b3IpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRCLCBjb21wYXJhdG9yKTsKIAotICAgIC8vIENvbXBhcmUgZWFjaCBpdGVtLgotICAgIHdoaWxlIChpdGVyQS5oYXNOZXh0KCkgJiYgaXRlckIuaGFzTmV4dCgpKSB7Ci0gICAgICBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZShpdGVyQS5uZXh0KCksIGl0ZXJCLm5leHQoKSk7Ci0gICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgewotICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICBJdGVyYXRvciBpdGVyQSA9IHNvcnRlZEEuaXRlcmF0b3IoKTsKKyAgICAgIEl0ZXJhdG9yIGl0ZXJCID0gc29ydGVkQi5pdGVyYXRvcigpOworCisgICAgICAvLyBDb21wYXJlIGVhY2ggaXRlbS4KKyAgICAgIHdoaWxlIChpdGVyQS5oYXNOZXh0KCkgJiYgaXRlckIuaGFzTmV4dCgpKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJhdG9yLmNvbXBhcmUoaXRlckEubmV4dCgpLCBpdGVyQi5uZXh0KCkpOworICAgICAgICBpZiAoY29tcGFyZSAhPSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY29tcGFyZTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhNYXAgYSwgTWFwIGIpIHsKQEAgLTMxNiwxMiArMjg0LDE0IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBjb3B5QmluYXJ5KGZpbmFsIGJ5dGVbXSBvcmlnKSB7Ci0gICAgaWYgKG9yaWcgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorICAgIHJldHVybiAob3JpZyA9PSBudWxsKSA/IG51bGwgOiBBcnJheXMuY29weU9mKG9yaWcsIG9yaWcubGVuZ3RoKTsKKyAgfQogCi0gICAgYnl0ZVtdIGNvcHkgPSBuZXcgYnl0ZVtvcmlnLmxlbmd0aF07Ci0gICAgU3lzdGVtLmFycmF5Y29weShvcmlnLCAwLCBjb3B5LCAwLCBvcmlnLmxlbmd0aCk7Ci0gICAgcmV0dXJuIGNvcHk7CisgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGxvbmcgdmFsdWUpIHsKKyAgICByZXR1cm4gTG9uZy5oYXNoQ29kZSh2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShkb3VibGUgdmFsdWUpIHsKKyAgICByZXR1cm4gRG91YmxlLmhhc2hDb2RlKHZhbHVlKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VQcm9jZXNzb3IuamF2YQppbmRleCBmOWE5YTllLi41NWEwZjE1IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VQcm9jZXNzb3IuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VQcm9jZXNzb3IuamF2YQpAQCAtMjMsNyArMjMsNyBAQAogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGluLCBUUHJvdG9jb2wgb3V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgIHB1YmxpYyB2b2lkIHByb2Nlc3MoVFByb3RvY29sIGluLCBUUHJvdG9jb2wgb3V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgVE1lc3NhZ2UgbXNnID0gaW4ucmVhZE1lc3NhZ2VCZWdpbigpOwogICAgIFByb2Nlc3NGdW5jdGlvbiBmbiA9IHByb2Nlc3NNYXAuZ2V0KG1zZy5uYW1lKTsKICAgICBpZiAoZm4gPT0gbnVsbCkgewpAQCAtMzQsOSArMzQsOCBAQAogICAgICAgeC53cml0ZShvdXQpOwogICAgICAgb3V0LndyaXRlTWVzc2FnZUVuZCgpOwogICAgICAgb3V0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgZm4ucHJvY2Vzcyhtc2cuc2VxaWQsIGluLCBvdXQsIGlmYWNlKTsKICAgICB9Ci0gICAgZm4ucHJvY2Vzcyhtc2cuc2VxaWQsIGluLCBvdXQsIGlmYWNlKTsKLSAgICByZXR1cm4gdHJ1ZTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKaW5kZXggMWMzN2VjZC4uM2EyZDU2YyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogCiAvKioKICAqIENsYXNzIHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBidWYgd2l0aG91dCBkb2luZyBkZWVwCkBAIC01Myw0ICs1NCw4IEBACiAgIHB1YmxpYyBpbnQgbGVuKCkgewogICAgIHJldHVybiBjb3VudDsKICAgfQorCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoQ2hhcnNldCBjaGFyc2V0KSB7CisgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCAwLCBjb3VudCwgY2hhcnNldCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVERlc2VyaWFsaXplci5qYXZhCmluZGV4IGJmNmM5N2MuLmQxZDM5NjYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YQpAQCAtMjUxLDQ4ICsyNTEsMzEgQEAKICAgICB0cnkgewogICAgICAgVEZpZWxkIGZpZWxkID0gbG9jYXRlRmllbGQoYnl0ZXMsIGZpZWxkSWRQYXRoRmlyc3QsIGZpZWxkSWRQYXRoUmVzdCk7CiAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkgewotICAgICAgICAvLyBpZiB0aGlzIHBvaW50IGlzIHJlYWNoZWQsIGlwcm90IHdpbGwgYmUgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpZWxkLgotICAgICAgICBzd2l0Y2godHR5cGUpeworICAgICAgICBpZiAodHR5cGUgPT0gZmllbGQudHlwZSkgeworICAgICAgICAgIC8vIGlmIHRoaXMgcG9pbnQgaXMgcmVhY2hlZCwgaXByb3Qgd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZgorICAgICAgICAgIC8vIHRoZSBmaWVsZAorICAgICAgICAgIHN3aXRjaCAodHR5cGUpIHsKICAgICAgICAgICBjYXNlIFRUeXBlLkJPT0w6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CT09MKXsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQm9vbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCb29sKCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5CWVRFOgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQllURSkgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCeXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJ5dGUoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkRPVUJMRSkgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWREb3VibGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkRG91YmxlKCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMTYpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTE2KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEkxNigpOwogICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEkzMigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJMzIoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkk2NCkgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJNjQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTY0KCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5TVFJJTkc6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwMDogLy8gaGFjayB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gc3RyaW5nIGFuZCBiaW5hcnkKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCaW5hcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBoYWNrIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBzdHJpbmcgYW5kIGJpbmFyeQorICAgICAgICBpZiAodHR5cGUgPT0gMTAwICYmIGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQmluYXJ5KCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHJldHVybiBudWxsOwpAQCAtMzA3LDExICsyOTAsOSBAQAogICBwcml2YXRlIFRGaWVsZCBsb2NhdGVGaWVsZChieXRlW10gYnl0ZXMsIFRGaWVsZElkRW51bSBmaWVsZElkUGF0aEZpcnN0LCBURmllbGRJZEVudW0gLi4uIGZpZWxkSWRQYXRoUmVzdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHRyYW5zXy5yZXNldChieXRlcyk7CiAKLSAgICBURmllbGRJZEVudW1bXSBmaWVsZElkUGF0aD0gbmV3IFRGaWVsZElkRW51bVtmaWVsZElkUGF0aFJlc3QubGVuZ3RoICsgMV07CisgICAgVEZpZWxkSWRFbnVtW10gZmllbGRJZFBhdGggPSBuZXcgVEZpZWxkSWRFbnVtW2ZpZWxkSWRQYXRoUmVzdC5sZW5ndGggKyAxXTsKICAgICBmaWVsZElkUGF0aFswXSA9IGZpZWxkSWRQYXRoRmlyc3Q7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZElkUGF0aFJlc3QubGVuZ3RoOyBpKyspewotICAgICAgZmllbGRJZFBhdGhbaSArIDFdID0gZmllbGRJZFBhdGhSZXN0W2ldOwotICAgIH0KKyAgICBTeXN0ZW0uYXJyYXljb3B5KGZpZWxkSWRQYXRoUmVzdCwgMCwgZmllbGRJZFBhdGgsIDEsIGZpZWxkSWRQYXRoUmVzdC5sZW5ndGgpOwogCiAgICAgLy8gaW5kZXggaW50byBmaWVsZCBJRCBwYXRoIGJlaW5nIGN1cnJlbnRseSBzZWFyY2hlZCBmb3IKICAgICBpbnQgY3VyUGF0aEluZGV4ID0gMDsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URW51bUhlbHBlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEKaW5kZXggYzE3ZDY2MS4uZmJjNzc4NyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAotaW1wb3J0IGphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLklsbGVnYWxBY2Nlc3NFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YQppbmRleCBmNjU0N2FjLi5jNDk0ODYyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiAKICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsVFByb2Nlc3Nvcj4gU0VSVklDRV9QUk9DRVNTT1JfTUFQCiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZyxUUHJvY2Vzc29yPigpOworICAgIHByaXZhdGUgVFByb2Nlc3NvciBkZWZhdWx0UHJvY2Vzc29yOwogCiAgICAgLyoqCiAgICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4uICBUaGlzCkBAIC02OCw2ICs2OSwxNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgc2VydmljZSB0byBiZSBjYWxsZWQgdG8gcHJvY2VzcyBxdWVyaWVzIHdpdGhvdXQgc2VydmljZSBuYW1lCisgICAgICogQHBhcmFtIHByb2Nlc3NvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGVmYXVsdChUUHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgICAgICBkZWZhdWx0UHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgIH0KKworICAgIC8qKgogICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+cHJvY2VzczwvY29kZT4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKICAgICAgKgogICAgICAqIDxvbD4KQEAgLTc3LDEzICs4NiwxMyBAQAogICAgICAqICAgICA8bGk+RGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKICAgICAgKiAgICAgICAgIHRoYXQgYWxsb3dzIHJlYWRNZXNzYWdlQmVnaW4oKSB0byByZXR1cm4gdGhlIG9yaWdpbmFsIFRNZXNzYWdlLjwvbGk+CiAgICAgICogPC9vbD4KLSAgICAgKiAgCi0gICAgICogQHRocm93cyBURXhjZXB0aW9uIElmIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLCBpZgorICAgICAqCisgICAgICogQHRocm93cyBUUHJvdG9jb2xFeGNlcHRpb24gSWYgdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVksIGlmCiAgICAgICogdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvciBpZiB0aGUgc2VydmljZQogICAgICAqIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VydmljZSBtYXAuICBZb3UgY2FsbGVkIHtAbGluayAjcmVnaXN0ZXJQcm9jZXNzb3IoU3RyaW5nLCBUUHJvY2Vzc29yKSByZWdpc3RlclByb2Nlc3Nvcn0KICAgICAgKiBkdXJpbmcgaW5pdGlhbGl6YXRpb24sIHJpZ2h0PyA6KQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgICAgIC8qCiAgICAgICAgICAgICBVc2UgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHByb3RvY29sIChlLmcuIFRCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKICAgICAgICAgICAgIG1lc3NhZ2UgaGVhZGVyLiAgVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKQEAgLTkyLDI0ICsxMDEsMzAgQEAKICAgICAgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsKIAogICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9IFRNZXNzYWdlVHlwZS5DQUxMICYmIG1lc3NhZ2UudHlwZSAhPSBUTWVzc2FnZVR5cGUuT05FV0FZKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIEFwYWNoZSBHdXlzIC0gQ2FuIHRoZSBzZXJ2ZXIgZXZlciBnZXQgYW4gRVhDRVBUSU9OIG9yIFJFUExZPwotICAgICAgICAgICAgLy8gVE9ETyBTaG91bGQgd2UgY2hlY2sgZm9yIHRoaXMgaGVyZT8KLSAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJUaGlzIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCE/Iik7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgIlRoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQogICAgICAgICBpbnQgaW5kZXggPSBtZXNzYWdlLm5hbWUuaW5kZXhPZihUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpOwogICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICIgKyBtZXNzYWdlLm5hbWUgKyAiLiAgRGlkIHlvdSAiICsKLSAgICAgICAgICAgICAgICAgICAgImZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Iik7CisgICAgICAgICAgaWYgKGRlZmF1bHRQcm9jZXNzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgICAgICAgICBkZWZhdWx0UHJvY2Vzc29yLnByb2Nlc3MobmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbChpcHJvdCwgbWVzc2FnZSksIG9wcm90KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG1lc3NhZ2UubmFtZSArICIuICBEaWQgeW91ICIgKworICAgICAgICAgICAgICAgICJmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAogICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBtZXNzYWdlLm5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKICAgICAgICAgVFByb2Nlc3NvciBhY3R1YWxQcm9jZXNzb3IgPSBTRVJWSUNFX1BST0NFU1NPUl9NQVAuZ2V0KHNlcnZpY2VOYW1lKTsKICAgICAgICAgaWYgKGFjdHVhbFByb2Nlc3NvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogIiArIHNlcnZpY2VOYW1lICsgIi4gIERpZCB5b3UgZm9yZ2V0ICIgKwotICAgICAgICAgICAgICAgICAgICAidG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiAiICsgc2VydmljZU5hbWUgKyAiLiAgRGlkIHlvdSBmb3JnZXQgIiArCisgICAgICAgICAgICAgICAgInRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgbmFtZQpAQCAtMTIwLDcgKzEzNSw3IEBACiAgICAgICAgICk7CiAKICAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgotICAgICAgICByZXR1cm4gYWN0dWFsUHJvY2Vzc29yLnByb2Nlc3MobmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbChpcHJvdCwgc3RhbmRhcmRNZXNzYWdlKSwgb3Byb3QpOworICAgICAgICBhY3R1YWxQcm9jZXNzb3IucHJvY2VzcyhuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKGlwcm90LCBzdGFuZGFyZE1lc3NhZ2UpLCBvcHJvdCk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yLmphdmEKaW5kZXggZDc5NTIyYy4uMTViYTljMCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3IuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3Nvci5qYXZhCkBAIC0yNCw5ICsyNCw3IEBACiAvKioKICAqIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCiAgKiB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgotICoKICAqLwogcHVibGljIGludGVyZmFjZSBUUHJvY2Vzc29yIHsKLSAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaW4sIFRQcm90b2NvbCBvdXQpCi0gICAgdGhyb3dzIFRFeGNlcHRpb247CisgIHB1YmxpYyB2b2lkIHByb2Nlc3MoVFByb3RvY29sIGluLCBUUHJvdG9jb2wgb3V0KSB0aHJvd3MgVEV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VyaWFsaXphYmxlLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcmlhbGl6YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMDAyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcmlhbGl6YWJsZS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKKworLyoqCisgKiBHZW5lcmljIGJhc2UgaW50ZXJmYWNlIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IG9iamVjdHMuCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRTZXJpYWxpemFibGUgeworCisgIC8qKgorICAgKiBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KKyAgICoKKyAgICogQHBhcmFtIGlwcm90IElucHV0IHByb3RvY29sCisgICAqLworICBwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIHByb3RvY29sCisgICAqCisgICAqIEBwYXJhbSBvcHJvdCBPdXRwdXQgcHJvdG9jb2wKKyAgICovCisgIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKaW5kZXggMjU5YTUwNy4uMDBhMzZlZSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKQEAgLTc2LDEyICs3NiwxNCBAQAogICBwcm90ZWN0ZWQgdm9pZCByZWNlaXZlQmFzZShUQmFzZTw/LD8+IHJlc3VsdCwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBUTWVzc2FnZSBtc2cgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOwogICAgIGlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7Ci0gICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7CisgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIHgucmVhZChpcHJvdF8pOwogICAgICAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7CiAgICAgICB0aHJvdyB4OwogICAgIH0KICAgICBpZiAobXNnLnNlcWlkICE9IHNlcWlkXykgewotICAgICAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELCBtZXRob2ROYW1lICsgIiBmYWlsZWQ6IG91dCBvZiBzZXF1ZW5jZSByZXNwb25zZSIpOworICAgICAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELAorICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzIGZhaWxlZDogb3V0IG9mIHNlcXVlbmNlIHJlc3BvbnNlOiBleHBlY3RlZCAlZCBidXQgZ290ICVkIiwgbWV0aG9kTmFtZSwgc2VxaWRfLCBtc2cuc2VxaWQpKTsKICAgICB9CiAgICAgcmVzdWx0LnJlYWQoaXByb3RfKTsKICAgICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UVW5pb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UVW5pb24uamF2YQppbmRleCAzMDUyZWUxLi4xZWYxMWRmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFVuaW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RVbmlvbi5qYXZhCkBAIC0zNCw3ICszNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTsKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIFRVbmlvbjxUIGV4dGVuZHMgVFVuaW9uPD8sPz4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGltcGxlbWVudHMgVEJhc2U8VCwgRj4geworcHVibGljIGFic3RyYWN0IGNsYXNzIFRVbmlvbjxUIGV4dGVuZHMgVFVuaW9uPFQsRj4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGltcGxlbWVudHMgVEJhc2U8VCwgRj4gewogCiAgIHByb3RlY3RlZCBPYmplY3QgdmFsdWVfOwogICBwcm90ZWN0ZWQgRiBzZXRGaWVsZF87CkBAIC03OSw3ICs3OSw3IEBACiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBNYXAgZGVlcENvcHlNYXAoTWFwPE9iamVjdCwgT2JqZWN0PiBtYXApIHsKLSAgICBNYXAgY29weSA9IG5ldyBIYXNoTWFwKCk7CisgICAgTWFwIGNvcHkgPSBuZXcgSGFzaE1hcChtYXAuc2l6ZSgpKTsKICAgICBmb3IgKE1hcC5FbnRyeTxPYmplY3QsIE9iamVjdD4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgewogICAgICAgY29weS5wdXQoZGVlcENvcHlPYmplY3QoZW50cnkuZ2V0S2V5KCkpLCBkZWVwQ29weU9iamVjdChlbnRyeS5nZXRWYWx1ZSgpKSk7CiAgICAgfQpAQCAtODcsNyArODcsNyBAQAogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgU2V0IGRlZXBDb3B5U2V0KFNldCBzZXQpIHsKLSAgICBTZXQgY29weSA9IG5ldyBIYXNoU2V0KCk7CisgICAgU2V0IGNvcHkgPSBuZXcgSGFzaFNldChzZXQuc2l6ZSgpKTsKICAgICBmb3IgKE9iamVjdCBvIDogc2V0KSB7CiAgICAgICBjb3B5LmFkZChkZWVwQ29weU9iamVjdChvKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2Fubm90YXRpb24vTnVsbGFibGUuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hbm5vdGF0aW9uL051bGxhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0YjAxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hbm5vdGF0aW9uL051bGxhYmxlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKKy8qKgorICogQW5ub3RhdGlvbiBpbmRpY2F0aW5nIGEgZmllbGQsIG1ldGhvZCByZXR1cm4sIG9yIG1ldGhvZCBwYXJhbWV0ZXIgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAqIFdlIHBhY2thZ2Ugb3VyIG93biBhbm5vdGF0aW9uIHRvIGF2b2lkIGEgbWFuZGF0b3J5IHRoaXJkLXBhcnR5IGRlcGVuZGVuY3kuCisgKi8KK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LkNMQVNTKQorcHVibGljIEBpbnRlcmZhY2UgTnVsbGFibGUgeworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvQXN5bmNNZXRob2RDYWxsYmFjay5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL0FzeW5jTWV0aG9kQ2FsbGJhY2suamF2YQppbmRleCAwMDAwNGI3Li40ZWJkZTA3IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvQXN5bmNNZXRob2RDYWxsYmFjay5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9Bc3luY01ldGhvZENhbGxiYWNrLmphdmEKQEAgLTE4LDIyICsxOCwzNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jOwogCi0KKy8qKgorICogQSBoYW5kbGVyIGludGVyZmFjZSBhc3luY2hyb25vdXMgY2xpZW50cyBjYW4gaW1wbGVtZW50IHRvIHJlY2VpdmUgZnV0dXJlCisgKiBub3RpY2Ugb2YgdGhlIHJlc3VsdHMgb2YgYW4gYXN5bmNocm9ub3VzIG1ldGhvZCBjYWxsLgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBhc3luY2hyb25vdXNseSBpbnZva2VkIG1ldGhvZC4KKyAqLwogcHVibGljIGludGVyZmFjZSBBc3luY01ldGhvZENhbGxiYWNrPFQ+IHsKICAgLyoqCiAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJlbW90ZSBzaWRlIGhhcyBjb21wbGV0ZWQgaW52b2tpbmcKLSAgICogeW91ciBtZXRob2QgY2FsbCBhbmQgdGhlIHJlc3VsdCBpcyBmdWxseSByZWFkLiBGb3Igb25ld2F5IG1ldGhvZCBjYWxscywKLSAgICogdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYXMgc29vbiBhcyB3ZSBoYXZlIGNvbXBsZXRlZCB3cml0aW5nIG91dCB0aGUKLSAgICogcmVxdWVzdC4KLSAgICogQHBhcmFtIHJlc3BvbnNlCisgICAqIHlvdXIgbWV0aG9kIGNhbGwgYW5kIHRoZSByZXN1bHQgaXMgZnVsbHkgcmVhZC4gRm9yIHtAY29kZSBvbmV3YXl9IG1ldGhvZAorICAgKiBjYWxscywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYXMgc29vbiBhcyB3ZSBoYXZlIGNvbXBsZXRlZCB3cml0aW5nIG91dAorICAgKiB0aGUgcmVxdWVzdC4KKyAgICoKKyAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGFzeW5jaHJvbm91c2x5IGludm9rZWQgbWV0aG9kOworICAgKiAgICAgICAgICAgICAgICAge0Bjb2RlIG51bGx9IGZvciB2b2lkIG1ldGhvZHMgd2hpY2ggaW5jbHVkZXMKKyAgICogICAgICAgICAgICAgICAgIHtAY29kZSBvbmV3YXl9IG1ldGhvZHMuCiAgICAqLwotICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKFQgcmVzcG9uc2UpOworICB2b2lkIG9uQ29tcGxldGUoVCByZXNwb25zZSk7CiAKICAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gdW5leHBlY3RlZCBjbGllbnRzaWRlCi0gICAqIGV4Y2VwdGlvbi4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFwcGxpY2F0aW9uLWRlZmluZWQgZXhjZXB0aW9ucyB0aGF0Ci0gICAqIGFwcGVhciBpbiB0aGUgSURMLCBidXQgcmF0aGVyIHRoaW5ncyBsaWtlIElPRXhjZXB0aW9ucy4KLSAgICogQHBhcmFtIGV4Y2VwdGlvbgorICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGVpdGhlciBhbiB1bmV4cGVjdGVkIGNsaWVudC1zaWRlCisgICAqIGV4Y2VwdGlvbiBsaWtlIGFuIElPRXhjZXB0aW9uIG9yIGVsc2Ugd2hlbiB0aGUgcmVtb3RlIG1ldGhvZCByYWlzZXMgYW4KKyAgICogZXhjZXB0aW9uLCBlaXRoZXIgZGVjbGFyZWQgaW4gdGhlIElETCBvciBkdWUgdG8gYW4gdW5leHBlY3RlZCBzZXJ2ZXItc2lkZQorICAgKiBlcnJvci4KKyAgICoKKyAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgdGhlIHRoZSBhc3luY2hyb25vdXMKKyAgICogICAgICAgICAgICAgICAgICBtZXRob2QgY2FsbCwgbWF5IGJlIGEgbG9jYWwgZXhjZXB0aW9uIG9yIGFuIHVubWFyc2hhbGxlZAorICAgKiAgICAgICAgICAgICAgICAgIHJlbW90ZSBleGNlcHRpb24uCiAgICAqLwotICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pOworICB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbik7CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50LmphdmEKaW5kZXggOWEyMjcxNy4uMDA1MDE4YSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnQuamF2YQpAQCAtNjYsNyArNjYsNyBAQAogCiAgIC8qKgogICAgKiBHZXQgdGhlIGNsaWVudCdzIGVycm9yIC0gcmV0dXJucyBudWxsIGlmIG5vIGVycm9yCi0gICAqIEByZXR1cm4gR2V0IHRoZSBjbGllbnQncyBlcnJvci4gPGJyIC8+IHJldHVybnMgbnVsbCBpZiBubyBlcnJvcgorICAgKiBAcmV0dXJuIEdldCB0aGUgY2xpZW50J3MgZXJyb3IuIDxwPiByZXR1cm5zIG51bGwgaWYgbm8gZXJyb3IKICAgICovCiAgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXJyb3IoKSB7CiAgICAgcmV0dXJuIF9fX2Vycm9yOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY01ldGhvZENhbGwuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNNZXRob2RDYWxsLmphdmEKaW5kZXggNWM2NzliNi4uM2JmMTc0NyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY01ldGhvZENhbGwuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jTWV0aG9kQ2FsbC5qYXZhCkBAIC0zMywxMSArMzMsMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKIAogLyoqCi0gKiBFbmNhcHN1bGF0ZXMgYW4gYXN5bmMgbWV0aG9kIGNhbGwKKyAqIEVuY2Fwc3VsYXRlcyBhbiBhc3luYyBtZXRob2QgY2FsbC4KKyAqIDxwPgogICogTmVlZCB0byBnZW5lcmF0ZToKLSAqICAgLSBwcml2YXRlIHZvaWQgd3JpdGVfYXJncyhUUHJvdG9jb2wgcHJvdG9jb2wpCi0gKiAgIC0gcHVibGljIFQgZ2V0UmVzdWx0KCkgdGhyb3dzIDxFeGNlcHRpb25fMT4sIDxFeGNlcHRpb25fMj4sIC4uLgotICogQHBhcmFtIDxUPgorICogPHVsPgorICogICA8bGk+cHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVfYXJncyhUUHJvdG9jb2wgcHJvdG9jb2wpPC9saT4KKyAqICAgPGxpPnByb3RlY3RlZCBhYnN0cmFjdCBUIGdldFJlc3VsdCgpIHRocm93cyAmbHQ7RXhjZXB0aW9uXzEmZ3Q7LCAmbHQ7RXhjZXB0aW9uXzImZ3Q7LCAuLi48L2xpPgorICogPC91bD4KKyAqCisgKiBAcGFyYW0gPFQ+IFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZW5jYXBzdWxhdGVkIG1ldGhvZCBjYWxsLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVEFzeW5jTWV0aG9kQ2FsbDxUPiB7CiAKQEAgLTExMyw2ICsxMTcsOCBAQAogCiAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlX2FyZ3MoVFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgVEV4Y2VwdGlvbjsKIAorICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBnZXRSZXN1bHQoKSB0aHJvd3MgRXhjZXB0aW9uOworCiAgIC8qKgogICAgKiBJbml0aWFsaXplIGJ1ZmZlcnMuCiAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBpZiBidWZmZXIgaW5pdGlhbGl6YXRpb24gZmFpbHMKQEAgLTE2Nyw3ICsxNzMsNyBAQAogICAgKiBzZWxlY3QgaW50ZXJlc3RzIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgY29uY3VycmVuY3kuCiAgICAqIEBwYXJhbSBrZXkKICAgICovCi0gIHByb3RlY3RlZCB2b2lkIHRyYW5zaXRpb24oU2VsZWN0aW9uS2V5IGtleSkgeworICB2b2lkIHRyYW5zaXRpb24oU2VsZWN0aW9uS2V5IGtleSkgewogICAgIC8vIEVuc3VyZSBrZXkgaXMgdmFsaWQKICAgICBpZiAoIWtleS5pc1ZhbGlkKCkpIHsKICAgICAgIGtleS5jYW5jZWwoKTsKQEAgLTIyNSw4ICsyMzEsMTQgQEAKICAgICBrZXkuaW50ZXJlc3RPcHMoMCk7CiAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIFRBc3luY01ldGhvZCBpbnN0YW5jZSBkb2Vzbid0IGhhbmcgYXJvdW5kCiAgICAga2V5LmF0dGFjaChudWxsKTsKLSAgICBjbGllbnQub25Db21wbGV0ZSgpOwotICAgIGNhbGxiYWNrLm9uQ29tcGxldGUoKFQpdGhpcyk7CisgICAgdHJ5IHsKKyAgICAgIFQgcmVzdWx0ID0gdGhpcy5nZXRSZXN1bHQoKTsKKyAgICAgIGNsaWVudC5vbkNvbXBsZXRlKCk7CisgICAgICBjYWxsYmFjay5vbkNvbXBsZXRlKHJlc3VsdCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgIG9uRXJyb3IoZSk7CisgICAgfQogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGRvUmVhZGluZ1Jlc3BvbnNlU2l6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvU2hvcnRTdGFjay5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Nob3J0U3RhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTY1OTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Nob3J0U3RhY2suamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworLyoqCisgKiBTaG9ydFN0YWNrIGlzIGEgc2hvcnQtc3BlY2lmaWMgU3RhY2sgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBmb3IgdGhlIGV4cHJlc3MKKyAqIHB1cnBvc2Ugb2YgdmVyeSBmYXN0IG9wZXJhdGlvbnMgb24gVENvbXBhY3RQcm90b2NvbCdzIGZpZWxkIGlkIHN0YWNrLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcyBhdCBsZWFzdCAxMHggZmFzdGVyIHRoYW4gamF2YS51dGlsLlN0YWNrLgorICovCitjbGFzcyBTaG9ydFN0YWNrIHsKKworICBwcml2YXRlIHNob3J0W10gdmVjdG9yOworCisgIC8qKiBBbHdheXMgcG9pbnRzIHRvIHRoZSBuZXh0IGxvY2F0aW9uICovCisgIHByaXZhdGUgaW50IHRvcCA9IDA7CisKKyAgcHVibGljIFNob3J0U3RhY2soaW50IGluaXRpYWxDYXBhY2l0eSkgeworICAgIHZlY3RvciA9IG5ldyBzaG9ydFtpbml0aWFsQ2FwYWNpdHldOworICB9CisKKyAgcHVibGljIHNob3J0IHBvcCgpIHsKKyAgICByZXR1cm4gdmVjdG9yWy0tdG9wXTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHB1c2goc2hvcnQgcHVzaGVkKSB7CisgICAgaWYgKHZlY3Rvci5sZW5ndGggPT0gdG9wKSB7CisgICAgICBncm93KCk7CisgICAgfQorICAgIHZlY3Rvclt0b3ArK10gPSBwdXNoZWQ7CisgIH0KKworICBwcml2YXRlIHZvaWQgZ3JvdygpIHsKKyAgICB2ZWN0b3IgPSBBcnJheXMuY29weU9mKHZlY3RvciwgdmVjdG9yLmxlbmd0aCA8PCAxKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIHRvcCA9IDA7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBzYi5hcHBlbmQoIjxTaG9ydFN0YWNrIHZlY3RvcjpbIik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3IubGVuZ3RoOyBpKyspIHsKKyAgICAgIGJvb2xlYW4gaXNUb3AgPSAoaSA9PSAodG9wIC0gMSkpOworICAgICAgc2hvcnQgdmFsdWUgPSB2ZWN0b3JbaV07CisgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgIHNiLmFwcGVuZCgnICcpOworICAgICAgfQorICAgICAgaWYgKGlzVG9wKSB7CisgICAgICAgIHNiLmFwcGVuZCgiPj4iKS5hcHBlbmQodmFsdWUpLmFwcGVuZCgiPDwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh2YWx1ZSk7CisgICAgICB9CisgICAgfQorICAgIHNiLmFwcGVuZCgiXT4iKTsKKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCmluZGV4IDY1YjMzNTMuLjc5MjRlMmYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKQEAgLTE5LDggKzE5LDggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CkBAIC01Miw2ICs1Miw4IEBACiAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFJlYWRfOwogICBwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpY3RXcml0ZV87CiAKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaW5vdXRUZW1wID0gbmV3IGJ5dGVbOF07CisKICAgLyoqCiAgICAqIEZhY3RvcnkKICAgICovCkBAIC02OSw2ICs3MSwxMCBAQAogICAgICAgdGhpcyhzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSwgTk9fTEVOR1RIX0xJTUlULCBOT19MRU5HVEhfTElNSVQpOwogICAgIH0KIAorICAgIHB1YmxpYyBGYWN0b3J5KGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXQpIHsKKyAgICAgIHRoaXMoZmFsc2UsIHRydWUsIHN0cmluZ0xlbmd0aExpbWl0LCBjb250YWluZXJMZW5ndGhMaW1pdCk7CisgICAgfQorCiAgICAgcHVibGljIEZhY3RvcnkoYm9vbGVhbiBzdHJpY3RSZWFkLCBib29sZWFuIHN0cmljdFdyaXRlLCBsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CiAgICAgICBzdHJpbmdMZW5ndGhMaW1pdF8gPSBzdHJpbmdMZW5ndGhMaW1pdDsKICAgICAgIGNvbnRhaW5lckxlbmd0aExpbWl0XyA9IGNvbnRhaW5lckxlbmd0aExpbWl0OwpAQCAtOTIsNiArOTgsMTAgQEAKICAgICB0aGlzKHRyYW5zLCBOT19MRU5HVEhfTElNSVQsIE5PX0xFTkdUSF9MSU1JVCwgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpOwogICB9CiAKKyAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CisgICAgdGhpcyh0cmFucywgc3RyaW5nTGVuZ3RoTGltaXQsIGNvbnRhaW5lckxlbmd0aExpbWl0LCBmYWxzZSwgdHJ1ZSk7CisgIH0KKwogICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXQsIGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSkgewogICAgIHN1cGVyKHRyYW5zKTsKICAgICBzdHJpbmdMZW5ndGhMaW1pdF8gPSBzdHJpbmdMZW5ndGhMaW1pdDsKQEAgLTEwMCw2ICsxMTAsNyBAQAogICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpZiAoc3RyaWN0V3JpdGVfKSB7CiAgICAgICBpbnQgdmVyc2lvbiA9IFZFUlNJT05fMSB8IG1lc3NhZ2UudHlwZTsKQEAgLTExMyw5OCArMTI0LDExMCBAQAogICAgIH0KICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShmaWVsZC50eXBlKTsKICAgICB3cml0ZUkxNihmaWVsZC5pZCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShtYXAua2V5VHlwZSk7CiAgICAgd3JpdGVCeXRlKG1hcC52YWx1ZVR5cGUpOwogICAgIHdyaXRlSTMyKG1hcC5zaXplKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlTWFwRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShsaXN0LmVsZW1UeXBlKTsKICAgICB3cml0ZUkzMihsaXN0LnNpemUpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVMaXN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUoc2V0LmVsZW1UeXBlKTsKICAgICB3cml0ZUkzMihzZXQuc2l6ZSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZVNldEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZVNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbChib29sZWFuIGIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUoYiA/IChieXRlKTEgOiAoYnl0ZSkwKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZSBbXSBib3V0ID0gbmV3IGJ5dGVbMV07CisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYm91dFswXSA9IGI7Ci0gICAgdHJhbnNfLndyaXRlKGJvdXQsIDAsIDEpOworICAgIGlub3V0VGVtcFswXSA9IGI7CisgICAgdHJhbnNfLndyaXRlKGlub3V0VGVtcCwgMCwgMSk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpMTZvdXQgPSBuZXcgYnl0ZVsyXTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGkxNm91dFswXSA9IChieXRlKSgweGZmICYgKGkxNiA+PiA4KSk7Ci0gICAgaTE2b3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTE2KSk7Ci0gICAgdHJhbnNfLndyaXRlKGkxNm91dCwgMCwgMik7CisgICAgaW5vdXRUZW1wWzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTE2ID4+IDgpKTsKKyAgICBpbm91dFRlbXBbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMTYpKTsKKyAgICB0cmFuc18ud3JpdGUoaW5vdXRUZW1wLCAwLCAyKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGkzMm91dCA9IG5ldyBieXRlWzRdOworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGkzMm91dFswXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAyNCkpOwotICAgIGkzMm91dFsxXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAxNikpOwotICAgIGkzMm91dFsyXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiA4KSk7Ci0gICAgaTMyb3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyKSk7Ci0gICAgdHJhbnNfLndyaXRlKGkzMm91dCwgMCwgNCk7CisgICAgaW5vdXRUZW1wWzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDI0KSk7CisgICAgaW5vdXRUZW1wWzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDE2KSk7CisgICAgaW5vdXRUZW1wWzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDgpKTsKKyAgICBpbm91dFRlbXBbM10gPSAoYnl0ZSkoMHhmZiAmIChpMzIpKTsKKyAgICB0cmFuc18ud3JpdGUoaW5vdXRUZW1wLCAwLCA0KTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGk2NG91dCA9IG5ldyBieXRlWzhdOworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpNjRvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNTYpKTsKLSAgICBpNjRvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDgpKTsKLSAgICBpNjRvdXRbMl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDApKTsKLSAgICBpNjRvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMzIpKTsKLSAgICBpNjRvdXRbNF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMjQpKTsKLSAgICBpNjRvdXRbNV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMTYpKTsKLSAgICBpNjRvdXRbNl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gOCkpOwotICAgIGk2NG91dFs3XSA9IChieXRlKSgweGZmICYgKGk2NCkpOwotICAgIHRyYW5zXy53cml0ZShpNjRvdXQsIDAsIDgpOworICAgIGlub3V0VGVtcFswXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA1NikpOworICAgIGlub3V0VGVtcFsxXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0OCkpOworICAgIGlub3V0VGVtcFsyXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0MCkpOworICAgIGlub3V0VGVtcFszXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAzMikpOworICAgIGlub3V0VGVtcFs0XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAyNCkpOworICAgIGlub3V0VGVtcFs1XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAxNikpOworICAgIGlub3V0VGVtcFs2XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA4KSk7CisgICAgaW5vdXRUZW1wWzddID0gKGJ5dGUpKDB4ZmYgJiAoaTY0KSk7CisgICAgdHJhbnNfLndyaXRlKGlub3V0VGVtcCwgMCwgOCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlSTY0KERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGR1YikpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGRhdCA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlSTMyKGRhdC5sZW5ndGgpOwotICAgICAgdHJhbnNfLndyaXRlKGRhdCwgMCwgZGF0Lmxlbmd0aCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gZGF0ID0gc3RyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHdyaXRlSTMyKGRhdC5sZW5ndGgpOworICAgIHRyYW5zXy53cml0ZShkYXQsIDAsIGRhdC5sZW5ndGgpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVCdWZmZXIgYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IGxlbmd0aCA9IGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCk7CiAgICAgd3JpdGVJMzIobGVuZ3RoKTsKQEAgLTIxNSw2ICsyMzgsNyBAQAogICAgKiBSZWFkaW5nIG1ldGhvZHMuCiAgICAqLwogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKICAgICBpZiAoc2l6ZSA8IDApIHsKQEAgLTIzMSw2NCArMjU1LDc2IEBACiAgICAgfQogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCi0gIHB1YmxpYyBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYnl0ZSB0eXBlID0gcmVhZEJ5dGUoKTsKICAgICBzaG9ydCBpZCA9IHR5cGUgPT0gVFR5cGUuU1RPUCA/IDAgOiByZWFkSTE2KCk7CiAgICAgcmV0dXJuIG5ldyBURmllbGQoIiIsIHR5cGUsIGlkKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgVE1hcCBtYXAgPSBuZXcgVE1hcChyZWFkQnl0ZSgpLCByZWFkQnl0ZSgpLCByZWFkSTMyKCkpOwogICAgIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChtYXAuc2l6ZSk7CiAgICAgcmV0dXJuIG1hcDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRNYXBFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTGlzdCByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIFRMaXN0IGxpc3QgPSBuZXcgVExpc3QocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKICAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgobGlzdC5zaXplKTsKICAgICByZXR1cm4gbGlzdDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRTZXQgcmVhZFNldEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIFRTZXQgc2V0ID0gbmV3IFRTZXQocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKICAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgoc2V0LnNpemUpOwogICAgIHJldHVybiBzZXQ7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU2V0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgYm9vbGVhbiByZWFkQm9vbCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICByZXR1cm4gKHJlYWRCeXRlKCkgPT0gMSk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBiaW4gPSBuZXcgYnl0ZVsxXTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IDEpIHsKICAgICAgIGJ5dGUgYiA9IHRyYW5zXy5nZXRCdWZmZXIoKVt0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKV07CiAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcigxKTsKICAgICAgIHJldHVybiBiOwogICAgIH0KLSAgICByZWFkQWxsKGJpbiwgMCwgMSk7Ci0gICAgcmV0dXJuIGJpblswXTsKKyAgICByZWFkQWxsKGlub3V0VGVtcCwgMCwgMSk7CisgICAgcmV0dXJuIGlub3V0VGVtcFswXTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGkxNnJkID0gbmV3IGJ5dGVbMl07CisgIEBPdmVycmlkZQogICBwdWJsaWMgc2hvcnQgcmVhZEkxNigpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlW10gYnVmID0gaTE2cmQ7CisgICAgYnl0ZVtdIGJ1ZiA9IGlub3V0VGVtcDsKICAgICBpbnQgb2ZmID0gMDsKIAogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IDIpIHsKQEAgLTI5Niw3ICszMzIsNyBAQAogICAgICAgb2ZmID0gdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCk7CiAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcigyKTsKICAgICB9IGVsc2UgewotICAgICAgcmVhZEFsbChpMTZyZCwgMCwgMik7CisgICAgICByZWFkQWxsKGlub3V0VGVtcCwgMCwgMik7CiAgICAgfQogCiAgICAgcmV0dXJuCkBAIC0zMDUsOSArMzQxLDkgQEAKICAgICAgICAoKGJ1ZltvZmYrMV0gJiAweGZmKSkpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTMycmQgPSBuZXcgYnl0ZVs0XTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBpbnQgcmVhZEkzMigpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlW10gYnVmID0gaTMycmQ7CisgICAgYnl0ZVtdIGJ1ZiA9IGlub3V0VGVtcDsKICAgICBpbnQgb2ZmID0gMDsKIAogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IDQpIHsKQEAgLTMxNSw3ICszNTEsNyBAQAogICAgICAgb2ZmID0gdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCk7CiAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcig0KTsKICAgICB9IGVsc2UgewotICAgICAgcmVhZEFsbChpMzJyZCwgMCwgNCk7CisgICAgICByZWFkQWxsKGlub3V0VGVtcCwgMCwgNCk7CiAgICAgfQogICAgIHJldHVybgogICAgICAgKChidWZbb2ZmXSAmIDB4ZmYpIDw8IDI0KSB8CkBAIC0zMjQsOSArMzYwLDkgQEAKICAgICAgICgoYnVmW29mZiszXSAmIDB4ZmYpKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGk2NHJkID0gbmV3IGJ5dGVbOF07CisgIEBPdmVycmlkZQogICBwdWJsaWMgbG9uZyByZWFkSTY0KCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBidWYgPSBpNjRyZDsKKyAgICBieXRlW10gYnVmID0gaW5vdXRUZW1wOwogICAgIGludCBvZmYgPSAwOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gOCkgewpAQCAtMzM0LDcgKzM3MCw3IEBACiAgICAgICBvZmYgPSB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDgpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZWFkQWxsKGk2NHJkLCAwLCA4KTsKKyAgICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCA4KTsKICAgICB9CiAKICAgICByZXR1cm4KQEAgLTM0OCw0OSArMzg0LDM5IEBACiAgICAgICAoKGxvbmcpKGJ1ZltvZmYrN10gJiAweGZmKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiBEb3VibGUubG9uZ0JpdHNUb0RvdWJsZShyZWFkSTY0KCkpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKIAogICAgIGNoZWNrU3RyaW5nUmVhZExlbmd0aChzaXplKTsKLSAgICBpZiAoc3RyaW5nTGVuZ3RoTGltaXRfID4gMCAmJiBzaXplID4gc3RyaW5nTGVuZ3RoTGltaXRfKSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5TSVpFX0xJTUlULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIGZpZWxkIGV4Y2VlZGVkIHN0cmluZyBzaXplIGxpbWl0Iik7Ci0gICAgfQogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gc2l6ZSkgewotICAgICAgdHJ5IHsKLSAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksIHNpemUsICJVVEYtOCIpOwotICAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcihzaXplKTsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgICB9CisgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwKKyAgICAgICAgICBzaXplLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKHNpemUpOworICAgICAgcmV0dXJuIHM7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlYWRTdHJpbmdCb2R5KHNpemUpOwogICB9CiAKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nQm9keShpbnQgc2l6ZSkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIHNpemUpOwotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCAiVVRGLTgiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGNoZWNrU3RyaW5nUmVhZExlbmd0aChzaXplKTsKKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKKyAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CiAKLSAgICBpZiAoc3RyaW5nTGVuZ3RoTGltaXRfID4gMCAmJiBzaXplID4gc3RyaW5nTGVuZ3RoTGltaXRfKSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5TSVpFX0xJTUlULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmluYXJ5IGZpZWxkIGV4Y2VlZGVkIHN0cmluZyBzaXplIGxpbWl0Iik7Ci0gICAgfQorICAgIGNoZWNrU3RyaW5nUmVhZExlbmd0aChzaXplKTsKIAogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IHNpemUpIHsKICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLndyYXAodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwgc2l6ZSk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YQppbmRleCA1OTczZmNkLi5lZTA1ODY5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmphdmEKQEAgLTIyLDggKzIyLDggQEAKIAogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIAotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlNob3J0U3RhY2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKIApAQCAtMzcsNiArMzcsOCBAQAogICogYW5kIGk2NCBmaWVsZHMgeW91IGhhdmUsIHRoZSBtb3JlIGJlbmVmaXQgeW91J2xsIHNlZS4KICAqLwogcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gRU1QVFlfQllURVMgPSBuZXcgYnl0ZVswXTsKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQnl0ZUJ1ZmZlciBFTVBUWV9CVUZGRVIgPSBCeXRlQnVmZmVyLndyYXAoRU1QVFlfQllURVMpOwogCiAgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgTk9fTEVOR1RIX0xJTUlUID0gLTE7CiAKQEAgLTE0NCw2ICsxNDYsMTIgQEAKICAgcHJpdmF0ZSBmaW5hbCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0XzsKIAogICAvKioKKyAgICogVGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciB2YXJpb3VzIG9wZXJhdGlvbnMgdGhhdCB3b3VsZCBvdGhlcndpc2UgcmVxdWlyZSBhCisgICAqIHNtYWxsIGFsbG9jYXRpb24uCisgICAqLworICBwcml2YXRlIGZpbmFsIGJ5dGVbXSB0ZW1wID0gbmV3IGJ5dGVbMTBdOworCisgIC8qKgogICAgKiBDcmVhdGUgYSBUQ29tcGFjdFByb3RvY29sLgogICAgKgogICAgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSBUVHJhbnNwb3J0IG9iamVjdCB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8uCkBAIC0xOTQsNiArMjAyLDcgQEAKICAgICogV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQogICAgKiBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KICAgICovCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlRGlyZWN0KFBST1RPQ09MX0lEKTsKICAgICB3cml0ZUJ5dGVEaXJlY3QoKFZFUlNJT04gJiBWRVJTSU9OX01BU0spIHwgKChtZXNzYWdlLnR5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKSk7CkBAIC0yMDYsNiArMjE1LDcgQEAKICAgICogdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCiAgICAqIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgogICAgKi8KKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBsYXN0RmllbGRfLnB1c2gobGFzdEZpZWxkSWRfKTsKICAgICBsYXN0RmllbGRJZF8gPSAwOwpAQCAtMjIyLDcgKzIzMiw3IEBACiAKICAgLyoqCiAgICAqIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUKLSAgICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGZpZWxkIGlkIGFuZCB0aGUgbGFzdCBvbmUgaXMgc21hbGwgKDwgMTUpLAorICAgKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoJmx0OyAxNSksCiAgICAqIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUKICAgICogZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KICAgICovCkBAIC0zNDMsMjEgKzM1MywxNiBAQAogICAgKiBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXXswLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLSAgICBmaXhlZExvbmdUb0J5dGVzKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGR1YiksIGRhdGEsIDApOwotICAgIHRyYW5zXy53cml0ZShkYXRhKTsKKyAgICBmaXhlZExvbmdUb0J5dGVzKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGR1YiksIHRlbXAsIDApOworICAgIHRyYW5zXy53cml0ZSh0ZW1wLCAwLCA4KTsKICAgfQogCiAgIC8qKgogICAgKiBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VkaW5nLgogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYnl0ZXMgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB3cml0ZUJpbmFyeShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJVVEYtOCBub3Qgc3VwcG9ydGVkISIpOwotICAgIH0KKyAgICBieXRlW10gYnl0ZXMgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgd3JpdGVCaW5hcnkoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CiAgIH0KIAogICAvKioKQEAgLTQwNSw0MCArNDEwLDM4IEBACiAgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCiAgICAqIFRPRE86IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2Ugd3JpdGVWYXJpbnQ2ND8KICAgICovCi0gIGJ5dGVbXSBpMzJidWYgPSBuZXcgYnl0ZVs1XTsKICAgcHJpdmF0ZSB2b2lkIHdyaXRlVmFyaW50MzIoaW50IG4pIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgaWR4ID0gMDsKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKLSAgICAgICAgaTMyYnVmW2lkeCsrXSA9IChieXRlKW47CisgICAgICAgIHRlbXBbaWR4KytdID0gKGJ5dGUpbjsKICAgICAgICAgLy8gd3JpdGVCeXRlRGlyZWN0KChieXRlKW4pOwogICAgICAgICBicmVhazsKICAgICAgICAgLy8gcmV0dXJuOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgaTMyYnVmW2lkeCsrXSA9IChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgIHRlbXBbaWR4KytdID0gKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKTsKICAgICAgICAgLy8gd3JpdGVCeXRlRGlyZWN0KChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCkpOwogICAgICAgICBuID4+Pj0gNzsKICAgICAgIH0KICAgICB9Ci0gICAgdHJhbnNfLndyaXRlKGkzMmJ1ZiwgMCwgaWR4KTsKKyAgICB0cmFuc18ud3JpdGUodGVtcCwgMCwgaWR4KTsKICAgfQogCiAgIC8qKgogICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KICAgICovCi0gIGJ5dGVbXSB2YXJpbnQ2NG91dCA9IG5ldyBieXRlWzEwXTsKICAgcHJpdmF0ZSB2b2lkIHdyaXRlVmFyaW50NjQobG9uZyBuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IGlkeCA9IDA7CiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgIGlmICgobiAmIH4weDdGTCkgPT0gMCkgewotICAgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoYnl0ZSluOworICAgICAgICB0ZW1wW2lkeCsrXSA9IChieXRlKW47CiAgICAgICAgIGJyZWFrOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCkpOworICAgICAgICB0ZW1wW2lkeCsrXSA9ICgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsKICAgICAgICAgbiA+Pj49IDc7CiAgICAgICB9CiAgICAgfQotICAgIHRyYW5zXy53cml0ZSh2YXJpbnQ2NG91dCwgMCwgaWR4KTsKKyAgICB0cmFuc18ud3JpdGUodGVtcCwgMCwgaWR4KTsKICAgfQogCiAgIC8qKgpAQCAtNDc2LDEwICs0NzksOSBAQAogICAgKiBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIHdyaXRpbmcgbWV0aG9kcyB0aGF0IGtub3cgdGhleSBuZWVkIHRvIHdyaXRlIGEgYnl0ZS4KICAgICovCi0gIHByaXZhdGUgYnl0ZVtdIGJ5dGVEaXJlY3RCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKICAgcHJpdmF0ZSB2b2lkIHdyaXRlQnl0ZURpcmVjdChieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlRGlyZWN0QnVmZmVyWzBdID0gYjsKLSAgICB0cmFuc18ud3JpdGUoYnl0ZURpcmVjdEJ1ZmZlcik7CisgICAgdGVtcFswXSA9IGI7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIDEpOwogICB9CiAKICAgLyoqCkBAIC02MjEsNyArNjIzLDYgQEAKICAgICByZXR1cm4gcmVhZEJ5dGUoKSA9PSBUeXBlcy5CT09MRUFOX1RSVUU7CiAgIH0KIAotICBieXRlW10gYnl0ZVJhd0J1ZiA9IG5ldyBieXRlWzFdOwogICAvKioKICAgICogUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgogICAgKi8KQEAgLTYzMSw4ICs2MzIsOCBAQAogICAgICAgYiA9IHRyYW5zXy5nZXRCdWZmZXIoKVt0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKV07CiAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcigxKTsKICAgICB9IGVsc2UgewotICAgICAgdHJhbnNfLnJlYWRBbGwoYnl0ZVJhd0J1ZiwgMCwgMSk7Ci0gICAgICBiID0gYnl0ZVJhd0J1ZlswXTsKKyAgICAgIHRyYW5zXy5yZWFkQWxsKHRlbXAsIDAsIDEpOworICAgICAgYiA9IHRlbXBbMF07CiAgICAgfQogICAgIHJldHVybiBiOwogICB9CkBAIC02NjIsOSArNjYzLDggQEAKICAgICogTm8gbWFnaWMgaGVyZSAtIGp1c3QgcmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCiAgICAqLwogICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGxvbmdCaXRzID0gbmV3IGJ5dGVbOF07Ci0gICAgdHJhbnNfLnJlYWRBbGwobG9uZ0JpdHMsIDAsIDgpOwotICAgIHJldHVybiBEb3VibGUubG9uZ0JpdHNUb0RvdWJsZShieXRlc1RvTG9uZyhsb25nQml0cykpOworICAgIHRyYW5zXy5yZWFkQWxsKHRlbXAsIDAsIDgpOworICAgIHJldHVybiBEb3VibGUubG9uZ0JpdHNUb0RvdWJsZShieXRlc1RvTG9uZyh0ZW1wKSk7CiAgIH0KIAogICAvKioKQEAgLTY3OCwxNyArNjc4LDE1IEBACiAgICAgICByZXR1cm4gIiI7CiAgICAgfQogCi0gICAgdHJ5IHsKLSAgICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IGxlbmd0aCkgewotICAgICAgICBTdHJpbmcgc3RyID0gbmV3IFN0cmluZyh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLCBsZW5ndGgsICJVVEYtOCIpOwotICAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcihsZW5ndGgpOwotICAgICAgICByZXR1cm4gc3RyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcocmVhZEJpbmFyeShsZW5ndGgpLCAiVVRGLTgiKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJVVEYtOCBub3Qgc3VwcG9ydGVkISIpOworICAgIGZpbmFsIFN0cmluZyBzdHI7CisgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gbGVuZ3RoKSB7CisgICAgICBzdHIgPSBuZXcgU3RyaW5nKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksCisgICAgICAgICAgbGVuZ3RoLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKGxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ciA9IG5ldyBTdHJpbmcocmVhZEJpbmFyeShsZW5ndGgpLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICB9CisgICAgcmV0dXJuIHN0cjsKICAgfQogCiAgIC8qKgpAQCAtNjk3LDcgKzY5NSw3IEBACiAgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IGxlbmd0aCA9IHJlYWRWYXJpbnQzMigpOwogICAgIGNoZWNrU3RyaW5nUmVhZExlbmd0aChsZW5ndGgpOwotICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVswXSk7CisgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gRU1QVFlfQlVGRkVSOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gbGVuZ3RoKSB7CiAgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci53cmFwKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksIGxlbmd0aCk7CkBAIC03MTQsNyArNzEyLDcgQEAKICAgICogUmVhZCBhIGJ5dGVbXSBvZiBhIGtub3duIGxlbmd0aCBmcm9tIHRoZSB3aXJlLgogICAgKi8KICAgcHJpdmF0ZSBieXRlW10gcmVhZEJpbmFyeShpbnQgbGVuZ3RoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbmV3IGJ5dGVbMF07CisgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gRU1QVFlfQllURVM7CiAKICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKICAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIGxlbmd0aCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQppbmRleCBmNTEzMjJjLi5kMzdjNDkzIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKQEAgLTE5LDggKzE5LDEwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07CkBAIC0zMDYsNiArMzA4LDEzIEBACiAgICAgY29udGV4dF8gPSBjb250ZXh0U3RhY2tfLnBvcCgpOwogICB9CiAKKyAgLy8gUmVzZXQgdGhlIGNvbnRleHQgc3RhY2sgdG8gaXRzIGluaXRpYWwgc3RhdGUKKyAgcHJpdmF0ZSB2b2lkIHJlc2V0Q29udGV4dCgpIHsKKyAgICB3aGlsZSAoIWNvbnRleHRTdGFja18uaXNFbXB0eSgpKSB7CisgICAgICBwb3BDb250ZXh0KCk7CisgICAgfQorICB9CisKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yCiAgICAqLwpAQCAtNDA5LDEyICs0MTgsOCBAQAogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYnVmID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgdHJhbnNfLndyaXRlKGJ1Zik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYnVmID0gc3RyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHRyYW5zXy53cml0ZShidWYpOwogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQpAQCAtNDQ0LDEyICs0NDksOCBAQAogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHRyYW5zXy53cml0ZShiLCAwLCBiLmxlbmd0aCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB0cmFuc18ud3JpdGUoYiwgMCwgYi5sZW5ndGgpOwogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQpAQCAtNTAxLDE0ICs1MDIsMTEgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlc2V0Q29udGV4dCgpOyAvLyBUSFJJRlQtMzc0MwogICAgIHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKICAgICB3cml0ZUpTT05JbnRlZ2VyKFZFUlNJT04pOwotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IG1lc3NhZ2UubmFtZS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBiID0gbWVzc2FnZS5uYW1lLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKICAgICB3cml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2UudHlwZSk7CiAgICAgd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLnNlcWlkKTsKICAgfQpAQCAtNjE4LDEyICs2MTYsOCBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBiID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgd3JpdGVKU09OU3RyaW5nKGIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGIpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC02NDAsNiArNjM0LDcgQEAKICAgcHJpdmF0ZSBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlYWRKU09OU3RyaW5nKGJvb2xlYW4gc2tpcENvbnRleHQpCiAgICAgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oREVGX1NUUklOR19TSVpFKTsKKyAgICBBcnJheUxpc3Q8Q2hhcmFjdGVyPiBjb2RldW5pdHMgPSBuZXcgQXJyYXlMaXN0PENoYXJhY3Rlcj4oKTsKICAgICBpZiAoIXNraXBDb250ZXh0KSB7CiAgICAgICBjb250ZXh0Xy5yZWFkKCk7CiAgICAgfQpAQCAtNjUyLDEwICs2NDcsNDEgQEAKICAgICAgIGlmIChjaCA9PSBFU0NTRVFbMF0pIHsKICAgICAgICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKICAgICAgICAgaWYgKGNoID09IEVTQ1NFUVsxXSkgewotICAgICAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihaRVJPKTsKLSAgICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoWkVSTyk7Ci0gICAgICAgICAgdHJhbnNfLnJlYWRBbGwodG1wYnVmXywgMCwgMik7Ci0gICAgICAgICAgY2ggPSAoYnl0ZSkoKGhleFZhbCgoYnl0ZSl0bXBidWZfWzBdKSA8PCA0KSArIGhleFZhbCh0bXBidWZfWzFdKSk7CisgICAgICAgICAgdHJhbnNfLnJlYWRBbGwodG1wYnVmXywgMCwgNCk7CisgICAgICAgICAgc2hvcnQgY3UgPSAoc2hvcnQpKAorICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzBdKSA8PCAxMikgKworICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzFdKSA8PCA4KSArCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMl0pIDw8IDQpICsKKyAgICAgICAgICAgICAgKHNob3J0KWhleFZhbCh0bXBidWZfWzNdKSk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNIaWdoU3Vycm9nYXRlKChjaGFyKWN1KSkgeworICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjb2RldW5pdHMuYWRkKChjaGFyKWN1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKENoYXJhY3Rlci5pc0xvd1N1cnJvZ2F0ZSgoY2hhciljdSkpIHsKKyAgICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvZGV1bml0cy5hZGQoKGNoYXIpY3UpOworICAgICAgICAgICAgICBhcnIud3JpdGUoCisgICAgICAgICAgICAgICAgICAobmV3IFN0cmluZyhuZXcgaW50W10geyBjb2RldW5pdHMuZ2V0KDApLCBjb2RldW5pdHMuZ2V0KDEpIH0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgMikpLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgICAgICAgICAgY29kZXVuaXRzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgYXJyLndyaXRlKChuZXcgU3RyaW5nKG5ldyBpbnRbXSB7IGN1IH0sIDAsIDEpKQorICAgICAgICAgICAgICAgICAgLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgIkludmFsaWQgdW5pY29kZSBzZXF1ZW5jZSIpOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICBpbnQgb2ZmID0gRVNDQVBFX0NIQVJTLmluZGV4T2YoY2gpOwpAQCAtNzMzLDE5ICs3NTksMTQgQEAKICAgICBjb250ZXh0Xy5yZWFkKCk7CiAgICAgaWYgKHJlYWRlcl8ucGVlaygpID09IFFVT1RFWzBdKSB7CiAgICAgICBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyciA9IHJlYWRKU09OU3RyaW5nKHRydWUpOwotICAgICAgdHJ5IHsKLSAgICAgICAgZG91YmxlIGR1YiA9IERvdWJsZS52YWx1ZU9mKGFyci50b1N0cmluZygiVVRGLTgiKSk7Ci0gICAgICAgIGlmICghY29udGV4dF8uZXNjYXBlTnVtKCkgJiYgIURvdWJsZS5pc05hTihkdWIpICYmCi0gICAgICAgICAgICAhRG91YmxlLmlzSW5maW5pdGUoZHViKSkgewotICAgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQotICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkdWI7CisgICAgICBkb3VibGUgZHViID0gRG91YmxlLnZhbHVlT2YoYXJyLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgIGlmICghY29udGV4dF8uZXNjYXBlTnVtKCkgJiYgIURvdWJsZS5pc05hTihkdWIpCisgICAgICAgICAgJiYgIURvdWJsZS5pc0luZmluaXRlKGR1YikpIHsKKyAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOwogICAgICAgfQotICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgICB9CisgICAgICByZXR1cm4gZHViOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgIGlmIChjb250ZXh0Xy5lc2NhcGVOdW0oKSkgewpAQCAtNzY5LDYgKzc5MCwxMSBAQAogICAgIGludCBsZW4gPSBhcnIubGVuKCk7CiAgICAgaW50IG9mZiA9IDA7CiAgICAgaW50IHNpemUgPSAwOworICAgIC8vIElnbm9yZSBwYWRkaW5nCisgICAgaW50IGJvdW5kID0gbGVuID49IDIgPyBsZW4gLSAyIDogMDsKKyAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSBib3VuZCAmJiBiW2ldID09ICc9JzsgLS1pKSB7CisgICAgICAtLWxlbjsKKyAgICB9CiAgICAgd2hpbGUgKGxlbiA+PSA0KSB7CiAgICAgICAvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKICAgICAgIFRCYXNlNjRVdGlscy5kZWNvZGUoYiwgb2ZmLCA0LCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKQEAgLTgxMywxOCArODM5LDEzIEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlc2V0Q29udGV4dCgpOyAvLyBUSFJJRlQtMzc0MwogICAgIHJlYWRKU09OQXJyYXlTdGFydCgpOwogICAgIGlmIChyZWFkSlNPTkludGVnZXIoKSAhPSBWRVJTSU9OKSB7CiAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOwogICAgIH0KLSAgICBTdHJpbmcgbmFtZTsKLSAgICB0cnkgewotICAgICAgbmFtZSA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZygiVVRGLTgiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBTdHJpbmcgbmFtZSA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICBieXRlIHR5cGUgPSAoYnl0ZSkgcmVhZEpTT05JbnRlZ2VyKCk7CiAgICAgaW50IHNlcWlkID0gKGludCkgcmVhZEpTT05JbnRlZ2VyKCk7CiAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShuYW1lLCB0eXBlLCBzZXFpZCk7CkBAIC05NDEsMTIgKzk2Miw3IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZygiVVRGLTgiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICByZXR1cm4gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5qYXZhCmluZGV4IDM1MzUyNzQuLjBlYTU2NmIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5qYXZhCkBAIC0zMSwyMSArMzEsMjMgQEAKICAqCiAgKiA8cD5UaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CiAgKgotICogPGJsb2NrcXVvdGU+PGNvZGU+Ci0gKiAgICAgVFNvY2tldCB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7PGJyLz4KLSAqICAgICB0cmFuc3BvcnQub3BlbigpOzxici8+Ci0gKjxici8+Ci0gKiAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOzxici8+Ci0gKjxici8+Ci0gKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7PGJyLz4KLSAqICAgICBDYWxjdWxhdG9yLkNsaWVudCBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG1wKTs8YnIvPgotICo8YnIvPgotICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTs8YnIvPgotICogICAgIFdlYXRoZXJSZXBvcnQuQ2xpZW50IHNlcnZpY2UyID0gbmV3IFdlYXRoZXJSZXBvcnQuQ2xpZW50KG1wMik7PGJyLz4KLSAqPGJyLz4KLSAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7PGJyLz4KLSAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZTIuZ2V0VGVtcGVyYXR1cmUoKSk7PGJyLz4KLSAqIDwvY29kZT48L2Jsb2NrcXVvdGU+CisgKiA8cHJlPgorICoge0Bjb2RlCisgKiAgICAgVFNvY2tldCB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgKiAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAqCisgKiAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICoKKyAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIkNhbGN1bGF0b3IiKTsKKyAqICAgICBDYWxjdWxhdG9yLkNsaWVudCBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG1wKTsKKyAqCisgKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAyID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiV2VhdGhlclJlcG9ydCIpOworICogICAgIFdlYXRoZXJSZXBvcnQuQ2xpZW50IHNlcnZpY2UyID0gbmV3IFdlYXRoZXJSZXBvcnQuQ2xpZW50KG1wMik7CisgKgorICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlLmFkZCgyLDIpKTsKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZTIuZ2V0VGVtcGVyYXR1cmUoKSk7CisgKiB9CisgKiA8L3ByZT4KICAqCiAgKiBAc2VlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbERlY29yYXRvcgogICovCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YQppbmRleCA3NTI1MjBhLi5jZGFhMzBiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEKQEAgLTE0MSw3ICsxNDEsOCBAQAogICAgICAgICBicmVhazsKIAogICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCB0eXBlICIgKyB0eXBlKTsKICAgICB9CiAgIH0KIApAQCAtMTUyLDcgKzE1Myw3IEBACiAgICAqIEluIHNvbWUgY2FzZXMsIG5vIGd1ZXNzIGNhbiBiZSBkb25lLCBpbiB0aGF0IGNhc2Ugd2UgcmV0dXJuIHRoZQogICAgKiBmYWxsYmFjayBUUHJvdG9jb2xGYWN0b3J5LgogICAgKiBUbyBiZSBjZXJ0YWluIHRvIGNvcnJlY3RseSBkZXRlY3QgdGhlIHByb3RvY29sLCB0aGUgZmlyc3QgZW5jb2RlZAotICAgKiBmaWVsZCBzaG91bGQgaGF2ZSBhIGZpZWxkIGlkIDwgMjU2CisgICAqIGZpZWxkIHNob3VsZCBoYXZlIGEgZmllbGQgaWQgJmx0OyAyNTYKICAgICoKICAgICogQHBhcmFtIGRhdGEgVGhlIHNlcmlhbGl6ZWQgZGF0YSB0byBndWVzcyB0aGUgcHJvdG9jb2wgZm9yLgogICAgKiBAcGFyYW0gZmFsbGJhY2sgVGhlIFRQcm90b2NvbCB0byByZXR1cm4gaWYgbm8gZ3Vlc3MgY2FuIGJlIG1hZGUuCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wuamF2YQppbmRleCBmZmExMzlhLi5lYjdlMjNiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLmphdmEKQEAgLTE5LDggKzE5LDggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwpAQCAtMTQzLDYgKzE0MywxNSBAQAogICB9CiAKICAgLyoqCisgICAqIFJlc2V0IHRoZSB3cml0ZSBjb250ZXh0IHN0YWNrIHRvIGl0cyBpbml0aWFsIHN0YXRlLgorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgcmVzZXRXcml0ZUNvbnRleHQoKSB7CisgICAgd2hpbGUgKCF3cml0ZUNvbnRleHRTdGFja18uaXNFbXB0eSgpKSB7CisgICAgICBwb3BXcml0ZUNvbnRleHQoKTsKKyAgICB9CisgIH0KKworICAvKioKICAgICogVXNlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90IGVuY291bnRlcmluZyBhIG1hcCB3aG9zZSBrZXlzIGFyZSBjb250YWluZXJzCiAgICAqLwogICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoU3RyaW5nIGludmFsaWRLZXlUeXBlKSB0aHJvd3MgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbiB7CkBAIC0xNTgsNyArMTY3LDkgQEAKICAgICBzdXBlcih0cmFucyk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlc2V0V3JpdGVDb250ZXh0KCk7IC8vIFRIUklGVC0zNzQzCiAgICAgdHJhbnNfLndyaXRlKExCUkFDS0VUKTsKICAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgpKTsKICAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOwpAQCAtMTY2LDMxICsxNzcsMzggQEAKICAgICB3cml0ZUkzMihtZXNzYWdlLnNlcWlkKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwogICAgIHRyYW5zXy53cml0ZShMQlJBQ0UpOwogICAgIHB1c2hXcml0ZUNvbnRleHQobmV3IFN0cnVjdENvbnRleHQoKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDRSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIE5vdGUgdGhhdCBleHRyYSB0eXBlIGluZm9ybWF0aW9uIGlzIG9taXR0ZWQgaW4gSlNPTiEKICAgICB3cml0ZVN0cmluZyhmaWVsZC5uYW1lKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KE1BUCk7CiAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwpAQCAtMTk5LDExICsyMTcsMTMgQEAKICAgICAvLyBObyBtZXRhZGF0YSEKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBwb3BXcml0ZUNvbnRleHQoKTsKICAgICB0cmFuc18ud3JpdGUoUkJSQUNFKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KExJU1QpOwogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKQEAgLTIxMiwxMSArMjMyLDEzIEBACiAgICAgLy8gTm8gbWV0YWRhdGEhCiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0tFVCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGFzc2VydENvbnRleHRJc05vdE1hcEtleShTRVQpOwogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKQEAgLTIyNSwyMyArMjQ3LDI4IEBACiAgICAgLy8gTm8gbWV0YWRhdGEhCiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGIgPyAoYnl0ZSkxIDogKGJ5dGUpMCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlSTMyKGIpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlSTMyKGkxNik7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlmKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgewogICAgICAgd3JpdGVTdHJpbmcoSW50ZWdlci50b1N0cmluZyhpMzIpKTsKQEAgLTI1MiwxNCArMjc5LDExIEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCBfd3JpdGVTdHJpbmdEYXRhKFN0cmluZyBzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBiID0gcy5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHRyYW5zXy53cml0ZShiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBiID0gcy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB0cmFuc18ud3JpdGUoYik7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpZih3cml0ZUNvbnRleHRfLmlzTWFwS2V5KCkpIHsKICAgICAgIHdyaXRlU3RyaW5nKExvbmcudG9TdHJpbmcoaTY0KSk7CkBAIC0yNjksNiArMjkzLDcgQEAKICAgICB9CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlmKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgewogICAgICAgd3JpdGVTdHJpbmcoRG91YmxlLnRvU3RyaW5nKGR1YikpOwpAQCAtMjc4LDYgKzMwMyw3IEBACiAgICAgfQogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CiAgICAgaW50IGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKQEAgLTMzMSw5MCArMzU3LDEwOCBAQAogICAgIF93cml0ZVN0cmluZ0RhdGEoZXNjYXBlLnRvU3RyaW5nKCkpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVCdWZmZXIgYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIC8vIFRPRE8obWNzbGVlKTogRml4IHRoaXMKLSAgICAgIHdyaXRlU3RyaW5nKG5ldyBTdHJpbmcoYmluLmFycmF5KCksIGJpbi5wb3NpdGlvbigpICsgYmluLmFycmF5T2Zmc2V0KCksIGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCkgLSBiaW4uYXJyYXlPZmZzZXQoKSwgIlVURi04IikpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgLy8gVE9ETyhtY3NsZWUpOiBGaXggdGhpcworICAgIHdyaXRlU3RyaW5nKG5ldyBTdHJpbmcoYmluLmFycmF5KCksIGJpbi5wb3NpdGlvbigpICsgYmluLmFycmF5T2Zmc2V0KCksCisgICAgICAgIGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCkgLSBiaW4uYXJyYXlPZmZzZXQoKSwKKyAgICAgICAgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICB9CiAKICAgLyoqCiAgICAqIFJlYWRpbmcgbWV0aG9kcy4KICAgICovCiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEVNUFRZX01FU1NBR0U7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEFOT05ZTU9VU19GSUVMRDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfTUFQOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfTElTVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRTZXQgcmVhZFNldEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEVNUFRZX1NFVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSAxKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkSTMyKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGxvbmcgcmVhZEk2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAiIjsKQEAgLTQyNSw2ICs0NjksNyBAQAogICAgIHJldHVybiAiIjsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgQnl0ZUJ1ZmZlciByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVswXSk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL0Fic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCmluZGV4IDBjNDkyY2MuLjhjMjA2ZTQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCkBAIC0xOSwxNSArMTksNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKLQogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRBc3luY1Byb2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CkBAIC00Miw2ICszMywxNSBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CisKIC8qKgogICogUHJvdmlkZXMgY29tbW9uIG1ldGhvZHMgYW5kIGNsYXNzZXMgdXNlZCBieSBub25ibG9ja2luZyBUU2VydmVyCiAgKiBpbXBsZW1lbnRhdGlvbnMuCkBAIC01MCw3ICs1MCw3IEBACiAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwogCiAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3M8VCBleHRlbmRzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzPFQ+PiBleHRlbmRzIEFic3RyYWN0U2VydmVyQXJnczxUPiB7Ci0gICAgcHVibGljIGxvbmcgbWF4UmVhZEJ1ZmZlckJ5dGVzID0gTG9uZy5NQVhfVkFMVUU7CisgICAgcHVibGljIGxvbmcgbWF4UmVhZEJ1ZmZlckJ5dGVzID0gMjU2ICogMTAyNCAqIDEwMjQ7CiAKICAgICBwdWJsaWMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3MoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHRyYW5zcG9ydCkgewogICAgICAgc3VwZXIodHJhbnNwb3J0KTsKQEAgLTEwMiw3ICsxMDIsNyBAQAogCiAgIC8qKgogICAgKiBTdGFydHMgYW55IHRocmVhZHMgcmVxdWlyZWQgZm9yIHNlcnZpbmcuCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyB3ZW50IG9rLCBmYWxzZSBpZiB0aHJlYWRzIGNvdWxkIG5vdCBiZSBzdGFydGVkLgogICAgKi8KICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc3RhcnRUaHJlYWRzKCk7CkBAIC0xMTUsNyArMTE1LDcgQEAKIAogICAvKioKICAgICogSGF2ZSB0aGUgc2VydmVyIHRyYW5zcG9ydCBzdGFydCBhY2NlcHRpbmcgY29ubmVjdGlvbnMuCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIHRydWUgaWYgd2Ugc3RhcnRlZCBsaXN0ZW5pbmcgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBpZiBzb21ldGhpbmcgd2VudAogICAgKiAgICAgICAgIHdyb25nLgogICAgKi8KQEAgLTEzOSw3ICsxMzksNyBAQAogICAvKioKICAgICogUGVyZm9ybSBhbiBpbnZvY2F0aW9uLiBUaGlzIG1ldGhvZCBjb3VsZCBiZWhhdmUgc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cyAtCiAgICAqIGludm9rZSBpbW1lZGlhdGVseSBpbmxpbmUsIHF1ZXVlIGZvciBzZXBhcmF0ZSBleGVjdXRpb24sIGV0Yy4KLSAgICogCisgICAqCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbnZvY2F0aW9uIHdhcyBzdWNjZXNzZnVsbHkgcmVxdWVzdGVkLCB3aGljaCBpcyBub3QgYQogICAgKiAgICAgICAgIGd1YXJhbnRlZSB0aGF0IGludm9jYXRpb24gaGFzIGNvbXBsZXRlZC4gRmFsc2UgaWYgdGhlIHJlcXVlc3QKICAgICogICAgICAgICBmYWlsZWQuCkBAIC0xNTIsNyArMTUyLDcgQEAKICAgICogY29ycmVzcG9uZGluZyB0byByZXF1ZXN0cy4KICAgICovCiAgIHByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlbGVjdFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOworICAgIHByb3RlY3RlZCBTZWxlY3RvciBzZWxlY3RvcjsKIAogICAgIC8vIExpc3Qgb2YgRnJhbWVCdWZmZXJzIHRoYXQgd2FudCB0byBjaGFuZ2UgdGhlaXIgc2VsZWN0aW9uIGludGVyZXN0cy4KICAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PEZyYW1lQnVmZmVyPiBzZWxlY3RJbnRlcmVzdENoYW5nZXMgPSBuZXcgSGFzaFNldDxGcmFtZUJ1ZmZlcj4oKTsKQEAgLTI4NSwyMSArMjg1LDIxIEBACiAgICAgcHJvdGVjdGVkIEJ5dGVCdWZmZXIgYnVmZmVyXzsKIAogICAgIHByb3RlY3RlZCBmaW5hbCBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3BvbnNlXzsKLSAgICAKKwogICAgIC8vIHRoZSBmcmFtZSB0aGF0IHRoZSBUVHJhbnNwb3J0IHNob3VsZCB3cmFwLgogICAgIHByb3RlY3RlZCBmaW5hbCBUTWVtb3J5SW5wdXRUcmFuc3BvcnQgZnJhbWVUcmFuc187Ci0gICAgCisKICAgICAvLyB0aGUgdHJhbnNwb3J0IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY29ubmVjdCB0byBjbGllbnRzCiAgICAgcHJvdGVjdGVkIGZpbmFsIFRUcmFuc3BvcnQgaW5UcmFuc187Ci0gICAgCisKICAgICBwcm90ZWN0ZWQgZmluYWwgVFRyYW5zcG9ydCBvdXRUcmFuc187Ci0gICAgCisKICAgICAvLyB0aGUgaW5wdXQgcHJvdG9jb2wgdG8gdXNlIG9uIGZyYW1lcwogICAgIHByb3RlY3RlZCBmaW5hbCBUUHJvdG9jb2wgaW5Qcm90XzsKLSAgICAKKwogICAgIC8vIHRoZSBvdXRwdXQgcHJvdG9jb2wgdG8gdXNlIG9uIGZyYW1lcwogICAgIHByb3RlY3RlZCBmaW5hbCBUUHJvdG9jb2wgb3V0UHJvdF87Ci0gICAgCisKICAgICAvLyBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24KICAgICBwcm90ZWN0ZWQgZmluYWwgU2VydmVyQ29udGV4dCBjb250ZXh0XzsKIApAQCAtMzI4LDcgKzMyOCw3IEBACiAgICAgLyoqCiAgICAgICogR2l2ZSB0aGlzIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIHJlYWQuIFRoZSBzZWxlY3RvciBsb29wIHNob3VsZCBoYXZlCiAgICAgICogcmVjZWl2ZWQgYSByZWFkIGV2ZW50IGZvciB0aGlzIEZyYW1lQnVmZmVyLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCBsaXZlIG9uLCBmYWxzZSBpZiBpdCBzaG91bGQgYmUKICAgICAgKiAgICAgICAgIGNsb3NlZAogICAgICAqLwpAQCAtNDM1LDE3ICs0MzUsMjMgQEAKICAgICAgKiBoYXMgY29tZSBpbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKSB7Ci0gICAgICBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuQVdBSVRJTkdfUkVHSVNURVJfV1JJVEUpIHsKKyAgICAgIHN3aXRjaCAoc3RhdGVfKSB7CisgICAgICBjYXNlIEFXQUlUSU5HX1JFR0lTVEVSX1dSSVRFOgogICAgICAgICAvLyBzZXQgdGhlIE9QX1dSSVRFIGludGVyZXN0CiAgICAgICAgIHNlbGVjdGlvbktleV8uaW50ZXJlc3RPcHMoU2VsZWN0aW9uS2V5Lk9QX1dSSVRFKTsKICAgICAgICAgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5XUklUSU5HOwotICAgICAgfSBlbHNlIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19SRUdJU1RFUl9SRUFEKSB7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBV0FJVElOR19SRUdJU1RFUl9SRUFEOgogICAgICAgICBwcmVwYXJlUmVhZCgpOwotICAgICAgfSBlbHNlIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19DTE9TRSkgeworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQVdBSVRJTkdfQ0xPU0U6CiAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgIHNlbGVjdGlvbktleV8uY2FuY2VsKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0dHRVIuZXJyb3IoImNoYW5nZVNlbGVjdEludGVyZXN0IHdhcyBjYWxsZWQsIGJ1dCBzdGF0ZSBpcyBpbnZhbGlkICgiICsgc3RhdGVfICsgIikiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBMT0dHRVIuZXJyb3IoCisgICAgICAgICAgICAiY2hhbmdlU2VsZWN0SW50ZXJlc3Qgd2FzIGNhbGxlZCwgYnV0IHN0YXRlIGlzIGludmFsaWQgKHt9KSIsCisgICAgICAgICAgICBzdGF0ZV8pOwogICAgICAgfQogICAgIH0KIApAQCAtNDU1LDcgKzQ2MSw3IEBACiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAgICAgICAvLyBpZiB3ZSdyZSBiZWluZyBjbG9zZWQgZHVlIHRvIGFuIGVycm9yLCB3ZSBtaWdodCBoYXZlIGFsbG9jYXRlZCBhCiAgICAgICAvLyBidWZmZXIgdGhhdCB3ZSBuZWVkIHRvIHN1YnRyYWN0IGZvciBvdXIgbWVtb3J5IGFjY291bnRpbmcuCi0gICAgICBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRSB8fCAKKyAgICAgIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFESU5HX0ZSQU1FIHx8CiAgICAgICAgICAgc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRF9GUkFNRV9DT01QTEVURSB8fAogICAgICAgICAgIHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX0NMT1NFKSB7CiAgICAgICAgIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZC5hZGRBbmRHZXQoLWJ1ZmZlcl8uYXJyYXkoKS5sZW5ndGgpOwpAQCAtNTEwLDcgKzUxNiw3IEBACiAgICAgcHVibGljIHZvaWQgaW52b2tlKCkgewogICAgICAgZnJhbWVUcmFuc18ucmVzZXQoYnVmZmVyXy5hcnJheSgpKTsKICAgICAgIHJlc3BvbnNlXy5yZXNldCgpOwotICAgICAgCisKICAgICAgIHRyeSB7CiAgICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKICAgICAgICAgICBldmVudEhhbmRsZXJfLnByb2Nlc3NDb250ZXh0KGNvbnRleHRfLCBpblRyYW5zXywgb3V0VHJhbnNfKTsKQEAgLTUzMCw3ICs1MzYsNyBAQAogCiAgICAgLyoqCiAgICAgICogUGVyZm9ybSBhIHJlYWQgaW50byBidWZmZXIuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWQgc3VjY2VlZGVkLCBmYWxzZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igb3IgdGhlCiAgICAgICogICAgICAgICBjb25uZWN0aW9uIGNsb3NlZC4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEV4dGVuc2libGVTZXJ2bGV0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RFeHRlbnNpYmxlU2VydmxldC5qYXZhCmluZGV4IGQzMjhkZDYuLjc1MDgyYzAgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEV4dGVuc2libGVTZXJ2bGV0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9URXh0ZW5zaWJsZVNlcnZsZXQuamF2YQpAQCAtNjMsNyArNjMsNyBAQAogICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgVFByb2Nlc3Nvcn0uIFRoaXMgd2lsbCBiZSBjYWxsZWQgPGI+b25jZTwvYj4ganVzdAogICAgKiBhZnRlciB0aGUge0BsaW5rICNpbml0KCl9IG1ldGhvZAogICAgKiAKLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgVFByb2Nlc3Nvcn0KICAgICovCiAgIHByb3RlY3RlZCBhYnN0cmFjdCBUUHJvY2Vzc29yIGdldFByb2Nlc3NvcigpOwogCkBAIC03MSw3ICs3MSw3IEBACiAgICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGluIHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fS4gVGhpcyB3aWxsIGJlIGNhbGxlZAogICAgKiA8Yj5vbmNlPC9iPiBqdXN0IGFmdGVyIHRoZSB7QGxpbmsgI2luaXQoKX0gbWV0aG9kCiAgICAqIAotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGluIHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fQogICAgKi8KICAgcHJvdGVjdGVkIGFic3RyYWN0IFRQcm90b2NvbEZhY3RvcnkgZ2V0SW5Qcm90b2NvbEZhY3RvcnkoKTsKIApAQCAtNzksNyArNzksNyBAQAogICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBvdXQge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9LiBUaGlzIHdpbGwgYmUgY2FsbGVkCiAgICAqIDxiPm9uY2U8L2I+IGp1c3QgYWZ0ZXIgdGhlIHtAbGluayAjaW5pdCgpfSBtZXRob2QKICAgICogCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUgb3V0IHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fQogICAgKi8KICAgcHJvdGVjdGVkIGFic3RyYWN0IFRQcm90b2NvbEZhY3RvcnkgZ2V0T3V0UHJvdG9jb2xGYWN0b3J5KCk7CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEhzSGFTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEhzSGFTZXJ2ZXIuamF2YQppbmRleCAyZWY0YjgzLi40YzVkN2I1IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RIc0hhU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9USHNIYVNlcnZlci5qYXZhCkBAIC00NSw2ICs0NSwyOCBAQAogICAgICAgc3VwZXIodHJhbnNwb3J0KTsKICAgICB9CiAKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1pbiBhbmQgbWF4IHRocmVhZHMuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNtaW5Xb3JrZXJUaHJlYWRzKGludCl9IGFuZCB7QGxpbmsgI21heFdvcmtlclRocmVhZHMoaW50KX0gIGluc3RlYWQuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgQXJncyB3b3JrZXJUaHJlYWRzKGludCBuKSB7CisgICAgICBtaW5Xb3JrZXJUaHJlYWRzID0gbjsKKyAgICAgIG1heFdvcmtlclRocmVhZHMgPSBuOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGF0IHRoZSBtaW4gdGhyZWFkcyB3YXMgc2V0IHRvLgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldE1pbldvcmtlclRocmVhZHMoKX0gYW5kIHtAbGluayAjZ2V0TWF4V29ya2VyVGhyZWFkcygpfSBpbnN0ZWFkLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGludCBnZXRXb3JrZXJUaHJlYWRzKCkgeworICAgICAgcmV0dXJuIG1pbldvcmtlclRocmVhZHM7CisgICAgfQorCiAgICAgcHVibGljIEFyZ3MgbWluV29ya2VyVGhyZWFkcyhpbnQgbikgewogICAgICAgbWluV29ya2VyVGhyZWFkcyA9IG47CiAgICAgICByZXR1cm4gdGhpczsKQEAgLTEwOSw3ICsxMzEsNyBAQAogICB9CiAKICAgLyoqCi0gICAqIEBpbmhlcml0RG9jCisgICAqIHtAaW5oZXJpdERvY30KICAgICovCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yU2h1dGRvd24oKSB7CkBAIC0xMzMsNiArMTU1LDkgQEAKICAgICByZXR1cm4gaW52b2tlcjsKICAgfQogCisgIHByb3RlY3RlZCBFeGVjdXRvclNlcnZpY2UgZ2V0SW52b2tlcigpIHsKKyAgICByZXR1cm4gaW52b2tlcjsKKyAgfQogCiAgIHByb3RlY3RlZCB2b2lkIGdyYWNlZnVsbHlTaHV0ZG93bkludm9rZXJQb29sKCkgewogICAgIC8vIHRyeSB0byBncmFjZWZ1bGx5IHNodXQgZG93biB0aGUgZXhlY3V0b3Igc2VydmljZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YQppbmRleCA4MGY0Zjg2Li5iYWMwNmIyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YQpAQCAtMTIzLDcgKzEyMyw3IEBACiAgICAqLwogICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOwogCi0gIHByaXZhdGUgYm9vbGVhbiBpc1NlcnZpbmc7CisgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBpc1NlcnZpbmc7CiAKICAgcHJvdGVjdGVkIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyXzsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuamF2YQppbmRleCBlODE1YjJjLi4xMzUwMWVmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuamF2YQpAQCAtNzcsOSArNzcsNyBAQAogICAgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgewogICAgICAgICAgICAgICBldmVudEhhbmRsZXJfLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCwgb3V0cHV0VHJhbnNwb3J0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCFwcm9jZXNzb3IucHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpIHsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9jZXNzb3IucHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMDUyOWQ3Mi4uZGIxZWNiOQotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5qYXZhCkBAIC03NSw2ICs3NSwxMSBAQAogICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCisgICAgcHVibGljIEFyZ3Mgc3RvcFRpbWVvdXRVbml0KFRpbWVVbml0IHR1KSB7CisgICAgICBzdG9wVGltZW91dFVuaXQgPSB0dTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKwogICAgIHB1YmxpYyBBcmdzIHJlcXVlc3RUaW1lb3V0KGludCBuKSB7CiAgICAgICByZXF1ZXN0VGltZW91dCA9IG47CiAgICAgICByZXR1cm4gdGhpczsKQEAgLTEzNiwyNiArMTQxLDQ0IEBACiAgICAgcmV0dXJuIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoYXJncy5taW5Xb3JrZXJUaHJlYWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MubWF4V29ya2VyVGhyZWFkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnN0b3BUaW1lb3V0VmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zdG9wVGltZW91dFVuaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JRdWV1ZSk7CiAgIH0KIAotCi0gIHB1YmxpYyB2b2lkIHNlcnZlKCkgewotICAgIHRyeSB7CisgIHByb3RlY3RlZCBFeGVjdXRvclNlcnZpY2UgZ2V0RXhlY3V0b3JTZXJ2aWNlKCkgeworICAgIHJldHVybiBleGVjdXRvclNlcnZpY2VfOworICB9CisgIAorICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmVTZXJ2ZSgpIHsKKyAgCXRyeSB7CiAgICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmxpc3RlbigpOwogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CiAgICAgICBMT0dHRVIuZXJyb3IoIkVycm9yIG9jY3VycmVkIGR1cmluZyBsaXN0ZW5pbmcuIiwgdHR4KTsKLSAgICAgIHJldHVybjsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50CiAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgewogICAgICAgZXZlbnRIYW5kbGVyXy5wcmVTZXJ2ZSgpOwogICAgIH0KLQogICAgIHN0b3BwZWRfID0gZmFsc2U7CiAgICAgc2V0U2VydmluZyh0cnVlKTsKKyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNlcnZlKCkgeworICAJaWYgKCFwcmVTZXJ2ZSgpKSB7CisgIAkJcmV0dXJuOworICAJfQorCisgIAlleGVjdXRlKCk7CisgIAl3YWl0Rm9yU2h1dGRvd24oKTsKKyAgICAKKyAgICBzZXRTZXJ2aW5nKGZhbHNlKTsKKyAgfQorICAKKyAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZSgpIHsKICAgICBpbnQgZmFpbHVyZUNvdW50ID0gMDsKICAgICB3aGlsZSAoIXN0b3BwZWRfKSB7CiAgICAgICB0cnkgewpAQCAtMjA4LDggKzIzMSwxMCBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotCi0gICAgZXhlY3V0b3JTZXJ2aWNlXy5zaHV0ZG93bigpOworICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yU2h1dGRvd24oKSB7CisgIAlleGVjdXRvclNlcnZpY2VfLnNodXRkb3duKCk7CiAKICAgICAvLyBMb29wIHVudGlsIGF3YWl0VGVybWluYXRpb24gZmluYWxseSBkb2VzIHJldHVybiB3aXRob3V0IGEgaW50ZXJydXB0ZWQKICAgICAvLyBleGNlcHRpb24uIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZW4gd2UnbGwgc2h1dCBkb3duIHByZW1hdHVyZWx5LiBXZSB3YW50CkBAIC0yMjcsNyArMjUyLDYgQEAKICAgICAgICAgbm93ID0gbmV3bm93OwogICAgICAgfQogICAgIH0KLSAgICBzZXRTZXJ2aW5nKGZhbHNlKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CkBAIC0yNjksNyArMjkzLDcgQEAKICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChjbGllbnRfKTsKICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudF8pOwogICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CSAgCisgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwogCiAgICAgICAgIGV2ZW50SGFuZGxlciA9IGdldEV2ZW50SGFuZGxlcigpOwogICAgICAgICBpZiAoZXZlbnRIYW5kbGVyICE9IG51bGwpIHsKQEAgLTI4MywxOCArMzA3LDI3IEBACiAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQsIG91dHB1dFRyYW5zcG9ydCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmKHN0b3BwZWRfIHx8ICFwcm9jZXNzb3IucHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpIHsKKyAgICAgICAgICAgIGlmIChzdG9wcGVkXykgewogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKICAgICAgICAgfQotICAgICAgfSBjYXRjaCAoVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7Ci0gICAgICAgIC8vIFNvbWV0aGluZyB0aGF0cyBub3QgU0FTTCB3YXMgaW4gdGhlIHN0cmVhbSwgY29udGludWUgc2lsZW50bHkgCi0gICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewotICAgICAgICAvLyBBc3N1bWUgdGhlIGNsaWVudCBkaWVkIGFuZCBjb250aW51ZSBzaWxlbnRseQogICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0eCkgewogICAgICAgICBMT0dHRVIuZXJyb3IoIlRocmlmdCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiBtZXNzYWdlLiIsIHR4KTsKICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7Ci0gICAgICAgIExPR0dFUi5lcnJvcigiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4iLCB4KTsKKyAgICAgICAgLy8gV2UnbGwgdXN1YWxseSByZWNlaXZlIFJ1bnRpbWVFeGNlcHRpb24gdHlwZXMgaGVyZQorICAgICAgICAvLyBOZWVkIHRvIHVud3JhcCB0byBhc2NlcnRhaW4gcmVhbCBjYXVzaW5nIGV4Y2VwdGlvbiBiZWZvcmUgd2UgY2hvb3NlIHRvIGlnbm9yZQorICAgICAgICBUaHJvd2FibGUgcmVhbENhdXNlID0geC5nZXRDYXVzZSgpOworICAgICAgICAvLyBJZ25vcmUgZXJyLWxvZ2dpbmcgYWxsIHRyYW5zcG9ydC1sZXZlbC90eXBlIGV4Y2VwdGlvbnMKKyAgICAgICAgaWYgKChyZWFsQ2F1c2UgIT0gbnVsbCAmJiByZWFsQ2F1c2UgaW5zdGFuY2VvZiBUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgfHwgKHggaW5zdGFuY2VvZiBUVHJhbnNwb3J0RXhjZXB0aW9uKSkgeworICAgICAgICAgIExPR0dFUi5kZWJ1ZygKKyAgICAgICAgICAgICAgIlJlY2VpdmVkIFRUcmFuc3BvcnRFeGNlcHRpb24gZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4gSWdub3JpbmcuIiwKKyAgICAgICAgICAgICAgeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gTG9nIHRoZSBleGNlcHRpb24gYXQgZXJyb3IgbGV2ZWwgYW5kIGNvbnRpbnVlCisgICAgICAgICAgTE9HR0VSLmVycm9yKCJFcnJvciBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiBtZXNzYWdlLiIsIHgpOworICAgICAgICB9CiAgICAgICB9IGZpbmFsbHkgewogICAgICAgICBpZiAoZXZlbnRIYW5kbGVyICE9IG51bGwpIHsKICAgICAgICAgICBldmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhCmluZGV4IDM1M2I4ZTAuLjAzODUwN2UgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEKQEAgLTE5LDcgKzE5LDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOwogCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOwpAQCAtMzcsMjQgKzQ1LDE4IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQogLyoqCiAgKiBBIEhhbGYtU3luYy9IYWxmLUFzeW5jIHNlcnZlciB3aXRoIGEgc2VwYXJhdGUgcG9vbCBvZiB0aHJlYWRzIHRvIGhhbmRsZQogICogbm9uLWJsb2NraW5nIEkvTy4gQWNjZXB0cyBhcmUgaGFuZGxlZCBvbiBhIHNpbmdsZSB0aHJlYWQsIGFuZCBhIGNvbmZpZ3VyYWJsZQogICogbnVtYmVyIG9mIG5vbmJsb2NraW5nIHNlbGVjdG9yIHRocmVhZHMgbWFuYWdlIHJlYWRpbmcgYW5kIHdyaXRpbmcgb2YgY2xpZW50CiAgKiBjb25uZWN0aW9ucy4gQSBzeW5jaHJvbm91cyB3b3JrZXIgdGhyZWFkIHBvb2wgaGFuZGxlcyBwcm9jZXNzaW5nIG9mIHJlcXVlc3RzLgotICogCisgKgogICogUGVyZm9ybXMgYmV0dGVyIHRoYW4gVE5vbmJsb2NraW5nU2VydmVyL1RIc0hhU2VydmVyIGluIG11bHRpLWNvcmUKICAqIGVudmlyb25tZW50cyB3aGVuIHRoZSB0aGUgYm90dGxlbmVjayBpcyBDUFUgb24gdGhlIHNpbmdsZSBzZWxlY3RvciB0aHJlYWQKICAqIGhhbmRsaW5nIEkvTy4gSW4gYWRkaXRpb24sIGJlY2F1c2UgdGhlIGFjY2VwdCBoYW5kbGluZyBpcyBkZWNvdXBsZWQgZnJvbQogICogcmVhZHMvd3JpdGVzIGFuZCBpbnZvY2F0aW9uLCB0aGUgc2VydmVyIGhhcyBiZXR0ZXIgYWJpbGl0eSB0byBoYW5kbGUgYmFjay0KICAqIHByZXNzdXJlIGZyb20gbmV3IGNvbm5lY3Rpb25zIChlLmcuIHN0b3AgYWNjZXB0aW5nIHdoZW4gYnVzeSkuCi0gKiAKKyAqCiAgKiBMaWtlIFROb25ibG9ja2luZ1NlcnZlciwgaXQgcmVsaWVzIG9uIHRoZSB1c2Ugb2YgVEZyYW1lZFRyYW5zcG9ydC4KICAqLwogcHVibGljIGNsYXNzIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlciB7CkBAIC0yMDUsNyArMjA3LDcgQEAKIAogICAvKioKICAgICogU3RhcnQgdGhlIGFjY2VwdCBhbmQgc2VsZWN0b3IgdGhyZWFkcyBydW5uaW5nIHRvIGRlYWwgd2l0aCBjbGllbnRzLgotICAgKiAKKyAgICoKICAgICogQHJldHVybiB0cnVlIGlmIGV2ZXJ5dGhpbmcgd2VudCBvaywgZmFsc2UgaWYgd2UgY291bGRuJ3Qgc3RhcnQgZm9yIHNvbWUKICAgICogICAgICAgICByZWFzb24uCiAgICAqLwpAQCAtMzQ5LDcgKzM1MSw3IEBACiAKICAgICAvKioKICAgICAgKiBTZXQgdXAgdGhlIEFjY2VwdFRoZWFkCi0gICAgICogCisgICAgICoKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICovCiAgICAgcHVibGljIEFjY2VwdFRocmVhZChUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LApAQCAtNDc4LDEwICs0ODAsMTMgQEAKIAogICAgIC8vIEFjY2VwdGVkIGNvbm5lY3Rpb25zIGFkZGVkIGJ5IHRoZSBhY2NlcHQgdGhyZWFkLgogICAgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxUTm9uYmxvY2tpbmdUcmFuc3BvcnQ+IGFjY2VwdGVkUXVldWU7CisgICAgcHJpdmF0ZSBpbnQgU0VMRUNUT1JfQVVUT19SRUJVSUxEX1RIUkVTSE9MRCA9IDUxMjsKKyAgICBwcml2YXRlIGxvbmcgTU9OSVRPUl9QRVJJT0QgPSAxMDAwTDsKKyAgICBwcml2YXRlIGludCBqdm1CdWcgPSAwOwogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIHRoZSBTZWxlY3RvclRocmVhZCB3aXRoIGFuIHVuYm91bmRlZCBxdWV1ZSBmb3IgaW5jb21pbmcgYWNjZXB0cy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgaWYgYSBzZWxlY3RvciBjYW5ub3QgYmUgY3JlYXRlZAogICAgICAqLwpAQCAtNDkxLDcgKzQ5Niw3IEBACiAKICAgICAvKioKICAgICAgKiBTZXQgdXAgdGhlIFNlbGVjdG9yVGhyZWFkIHdpdGggYW4gYm91bmRlZCBxdWV1ZSBmb3IgaW5jb21pbmcgYWNjZXB0cy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgaWYgYSBzZWxlY3RvciBjYW5ub3QgYmUgY3JlYXRlZAogICAgICAqLwpAQCAtNTAxLDcgKzUwNiw3IEBACiAKICAgICAvKioKICAgICAgKiBTZXQgdXAgdGhlIFNlbGVjdG9yVGhyZWFkIHdpdGggYSBzcGVjaWZpZWQgcXVldWUgZm9yIGNvbm5lY3Rpb25zLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFjY2VwdGVkUXVldWUKICAgICAgKiAgICAgICAgICBUaGUgQmxvY2tpbmdRdWV1ZSBpbXBsZW1lbnRhdGlvbiBmb3IgaG9sZGluZyBpbmNvbWluZyBhY2NlcHRlZAogICAgICAqICAgICAgICAgIGNvbm5lY3Rpb25zLgpAQCAtNTE1LDcgKzUyMCw3IEBACiAgICAgLyoqCiAgICAgICogSGFuZHMgb2ZmIGFuIGFjY2VwdGVkIGNvbm5lY3Rpb24gdG8gYmUgaGFuZGxlZCBieSB0aGlzIHRocmVhZC4gVGhpcwogICAgICAqIG1ldGhvZCB3aWxsIGJsb2NrIGlmIHRoZSBxdWV1ZSBmb3IgbmV3IGNvbm5lY3Rpb25zIGlzIGF0IGNhcGFjaXR5LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFjY2VwdGVkCiAgICAgICogICAgICAgICAgVGhlIGNvbm5lY3Rpb24gdGhhdCBoYXMgYmVlbiBhY2NlcHRlZC4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGFkZGVkLgpAQCAtNTY2LDggKzU3MSw4IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHNlbGVjdCgpIHsKICAgICAgIHRyeSB7Ci0gICAgICAgIC8vIHdhaXQgZm9yIGlvIGV2ZW50cy4KLSAgICAgICAgc2VsZWN0b3Iuc2VsZWN0KCk7CisKKyAgICAgICAgZG9TZWxlY3QoKTsKIAogICAgICAgICAvLyBwcm9jZXNzIHRoZSBpbyBldmVudHMgd2UgcmVjZWl2ZWQKICAgICAgICAgSXRlcmF0b3I8U2VsZWN0aW9uS2V5PiBzZWxlY3RlZEtleXMgPSBzZWxlY3Rvci5zZWxlY3RlZEtleXMoKS5pdGVyYXRvcigpOwpAQCAtNTk2LDYgKzYwMSw3NyBAQAogICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIERvIHNlbGVjdCBhbmQganVkZ2UgZXBvbGwgYnVnIGhhcHBlbi4KKyAgICAgKiBTZWUgOiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjUxCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRvU2VsZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGxvbmcgYmVmb3JlU2VsZWN0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICBpbnQgc2VsZWN0ZWROdW1zID0gc2VsZWN0b3Iuc2VsZWN0KCk7CisgICAgICBsb25nIGFmdGVyU2VsZWN0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgIGlmIChzZWxlY3RlZE51bXMgPT0gMCkgeworICAgICAgICBqdm1CdWcrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGp2bUJ1ZyA9IDA7CisgICAgICB9CisKKyAgICAgIGxvbmcgc2VsZWN0ZWRUaW1lID0gYWZ0ZXJTZWxlY3QgLSBiZWZvcmVTZWxlY3Q7CisgICAgICBpZiAoc2VsZWN0ZWRUaW1lID49IE1PTklUT1JfUEVSSU9EKSB7CisgICAgICAgIGp2bUJ1ZyA9IDA7CisgICAgICB9IGVsc2UgaWYgKGp2bUJ1ZyA+IFNFTEVDVE9SX0FVVE9fUkVCVUlMRF9USFJFU0hPTEQpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkluIHt9IG1zIGhhcHBlbiB7fSB0aW1lcyBqdm0gYnVnOyByZWJ1aWxkaW5nIHNlbGVjdG9yLiIsIE1PTklUT1JfUEVSSU9ELCBqdm1CdWcpOworICAgICAgICByZWJ1aWxkU2VsZWN0b3IoKTsKKyAgICAgICAgc2VsZWN0b3Iuc2VsZWN0Tm93KCk7CisgICAgICAgIGp2bUJ1ZyA9IDA7CisgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyB0aGUgY3VycmVudCBTZWxlY3RvciBvZiB0aGlzIFNlbGVjdG9yVGhyZWFkIHdpdGggbmV3bHkgY3JlYXRlZCBTZWxlY3RvciB0byB3b3JrCisgICAgICogYXJvdW5kIHRoZSBpbmZhbW91cyBlcG9sbCAxMDAlIENQVSBidWcuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZWJ1aWxkU2VsZWN0b3IoKSB7CisgICAgICBmaW5hbCBTZWxlY3RvciBvbGRTZWxlY3RvciA9IHNlbGVjdG9yOworICAgICAgaWYgKG9sZFNlbGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgU2VsZWN0b3IgbmV3U2VsZWN0b3IgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgbmV3U2VsZWN0b3IgPSBTZWxlY3Rvci5vcGVuKCk7CisgICAgICAgIExPR0dFUi53YXJuKCJDcmVhdGVkIG5ldyBTZWxlY3Rvci4iKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJDcmVhdGUgbmV3IFNlbGVjdG9yIGVycm9yLiIsIGUpOworICAgICAgfQorCisgICAgICBmb3IgKFNlbGVjdGlvbktleSBrZXkgOiBvbGRTZWxlY3Rvci5zZWxlY3RlZEtleXMoKSkgeworICAgICAgICBpZiAoIWtleS5pc1ZhbGlkKCkgJiYga2V5LnJlYWR5T3BzKCkgPT0gMCkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgU2VsZWN0YWJsZUNoYW5uZWwgY2hhbm5lbCA9IGtleS5jaGFubmVsKCk7CisgICAgICAgIE9iamVjdCBhdHRhY2htZW50ID0ga2V5LmF0dGFjaG1lbnQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGlmIChhdHRhY2htZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIGNoYW5uZWwucmVnaXN0ZXIobmV3U2VsZWN0b3IsIGtleS5yZWFkeU9wcygpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhbm5lbC5yZWdpc3RlcihuZXdTZWxlY3Rvciwga2V5LnJlYWR5T3BzKCksIGF0dGFjaG1lbnQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HR0VSLmVycm9yKCJSZWdpc3RlciBuZXcgc2VsZWN0b3Iga2V5IGVycm9yLiIsIGUpOworICAgICAgICB9CisKKyAgICAgIH0KKworICAgICAgc2VsZWN0b3IgPSBuZXdTZWxlY3RvcjsKKyAgICAgIHRyeSB7CisgICAgICAgIG9sZFNlbGVjdG9yLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi5lcnJvcigiQ2xvc2Ugb2xkIHNlbGVjdG9yIGVycm9yLiIsIGUpOworICAgICAgfQorICAgICAgTE9HR0VSLndhcm4oIlJlcGxhY2UgbmV3IHNlbGVjdG9yIHN1Y2Nlc3MuIik7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NBY2NlcHRlZENvbm5lY3Rpb25zKCkgewogICAgICAgLy8gUmVnaXN0ZXIgYWNjZXB0ZWQgY29ubmVjdGlvbnMKICAgICAgIHdoaWxlICghc3RvcHBlZF8pIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKaW5kZXggYjAyOTA1Zi4uZmMzYWE5MiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKQEAgLTE4LDYgKzE4LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCiAvKioKICAqIEhlbHBlciBjbGFzcyB0aGF0IHdyYXBzIGEgYnl0ZVtdIHNvIHRoYXQgaXQgY2FuIGV4cGFuZCBhbmQgYmUgcmV1c2VkLiBVc2VycwogICogc2hvdWxkIGNhbGwgcmVzaXplSWZOZWNlc3NhcnkgdG8gbWFrZSBzdXJlIHRoZSBidWZmZXIgaGFzIHN1aXRhYmxlIGNhcGFjaXR5LApAQCAtMjUsMjggKzI3LDI0IEBACiAgKiByYXRlIHNsaWdodGx5IGZhc3RlciB0aGFuIHRoZSByZXF1ZXN0ZWQgY2FwYWNpdHkgd2l0aCB0aGUgKHVudGVzdGVkKQogICogb2JqZWN0aXZlIG9mIGF2b2lkaW5nIGV4cGVuc2l2ZSBidWZmZXIgYWxsb2NhdGlvbnMgYW5kIGNvcGllcy4KICAqLwotcHVibGljIGNsYXNzIEF1dG9FeHBhbmRpbmdCdWZmZXIgeworY2xhc3MgQXV0b0V4cGFuZGluZ0J1ZmZlciB7CiAgIHByaXZhdGUgYnl0ZVtdIGFycmF5OwogCi0gIHByaXZhdGUgZmluYWwgZG91YmxlIGdyb3d0aENvZWZmaWNpZW50OwotCi0gIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyKGludCBpbml0aWFsQ2FwYWNpdHksIGRvdWJsZSBncm93dGhDb2VmZmljaWVudCkgewotICAgIGlmIChncm93dGhDb2VmZmljaWVudCA8IDEuMCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR3Jvd3RoIGNvZWZmaWNpZW50IG11c3QgYmUgPj0gMS4wIik7Ci0gICAgfQotICAgIGFycmF5ID0gbmV3IGJ5dGVbaW5pdGlhbENhcGFjaXR5XTsKLSAgICB0aGlzLmdyb3d0aENvZWZmaWNpZW50ID0gZ3Jvd3RoQ29lZmZpY2llbnQ7CisgIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKKyAgICB0aGlzLmFycmF5ID0gbmV3IGJ5dGVbaW5pdGlhbENhcGFjaXR5XTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHJlc2l6ZUlmTmVjZXNzYXJ5KGludCBzaXplKSB7Ci0gICAgaWYgKGFycmF5Lmxlbmd0aCA8IHNpemUpIHsKLSAgICAgIGJ5dGVbXSBuZXdCdWYgPSBuZXcgYnl0ZVsoaW50KShzaXplICogZ3Jvd3RoQ29lZmZpY2llbnQpXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIG5ld0J1ZiwgMCwgYXJyYXkubGVuZ3RoKTsKLSAgICAgIGFycmF5ID0gbmV3QnVmOworICAgIGZpbmFsIGludCBjdXJyZW50Q2FwYWNpdHkgPSB0aGlzLmFycmF5Lmxlbmd0aDsKKyAgICBpZiAoY3VycmVudENhcGFjaXR5IDwgc2l6ZSkgeworICAgICAgLy8gSW5jcmVhc2UgYnkgYSBmYWN0b3Igb2YgMS41eAorICAgICAgaW50IGdyb3dDYXBhY2l0eSA9IGN1cnJlbnRDYXBhY2l0eSArIChjdXJyZW50Q2FwYWNpdHkgPj4gMSk7CisgICAgICBpbnQgbmV3Q2FwYWNpdHkgPSBNYXRoLm1heChncm93Q2FwYWNpdHksIHNpemUpOworICAgICAgdGhpcy5hcnJheSA9IEFycmF5cy5jb3B5T2YoYXJyYXksIG5ld0NhcGFjaXR5KTsKICAgICB9CiAgIH0KIAogICBwdWJsaWMgYnl0ZVtdIGFycmF5KCkgewotICAgIHJldHVybiBhcnJheTsKKyAgICByZXR1cm4gdGhpcy5hcnJheTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhCmluZGV4IDA4MWJjNDguLmEyOGQyNTQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKQEAgLTI4LDggKzI4LDggQEAKICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKICAgcHJpdmF0ZSBpbnQgbGltaXQgPSAwOwogCi0gIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbnQgaW5pdGlhbENhcGFjaXR5LCBkb3VibGUgb3Zlcmdyb3d0aENvZWZmaWNpZW50KSB7Ci0gICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHksIG92ZXJncm93dGhDb2VmZmljaWVudCk7CisgIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHkpOwogICB9CiAKICAgcHVibGljIHZvaWQgZmlsbChUVHJhbnNwb3J0IGluVHJhbnMsIGludCBsZW5ndGgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCmluZGV4IDliMzU2OTMuLmVjN2U3ZDQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQpAQCAtMjUsMTAgKzI1LDI5IEBACiAKICAgcHJpdmF0ZSBmaW5hbCBBdXRvRXhwYW5kaW5nQnVmZmVyIGJ1ZjsKICAgcHJpdmF0ZSBpbnQgcG9zOworICBwcml2YXRlIGludCByZXM7CiAKLSAgcHVibGljIEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydChpbnQgaW5pdGlhbENhcGFjaXR5LCBkb3VibGUgZ3Jvd3RoQ29lZmZpY2llbnQpIHsKLSAgICB0aGlzLmJ1ZiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKGluaXRpYWxDYXBhY2l0eSwgZ3Jvd3RoQ29lZmZpY2llbnQpOwotICAgIHRoaXMucG9zID0gMDsKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoZSBidWZmZXIKKyAgICogQHBhcmFtIGZyb250UmVzZXJ2ZSBzcGFjZSwgaWYgYW55LCB0byByZXNlcnZlIGF0IHRoZSBiZWdpbm5pbmcgc3VjaAorICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIGZpcnN0IHdyaXRlIGlzIGFmdGVyIHRoaXMgcmVzZXJ2ZS4KKyAgICogICAgICAgICAgICAgICAgICAgICBUaGlzIGFsbG93cyBmcmFtZWQgdHJhbnNwb3J0IHRvIHJlc2VydmUgc3BhY2UKKyAgICogICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGZyYW1lIGJ1ZmZlciBsZW5ndGguCisgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGluaXRpYWxDYXBhY2l0eSBpcyBsZXNzIHRoYW4gb25lCisgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGZyb250UmVzZXJ2ZSBpcyBsZXNzIHRoYW4gemVybworICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBmcm9udFJlc2VydmUgaXMgZ3JlYXRlciB0aGFuIGluaXRpYWxDYXBhY2l0eQorICAgKi8KKyAgcHVibGljIEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydChpbnQgaW5pdGlhbENhcGFjaXR5LCBpbnQgZnJvbnRSZXNlcnZlKSB7CisgICAgaWYgKGluaXRpYWxDYXBhY2l0eSA8IDEpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluaXRpYWxDYXBhY2l0eSIpOworICAgIH0KKyAgICBpZiAoZnJvbnRSZXNlcnZlIDwgMCB8fCBpbml0aWFsQ2FwYWNpdHkgPCBmcm9udFJlc2VydmUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZyb250UmVzZXJ2ZSIpOworICAgIH0KKyAgICB0aGlzLmJ1ZiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKGluaXRpYWxDYXBhY2l0eSk7CisgICAgdGhpcy5wb3MgPSBmcm9udFJlc2VydmU7CisgICAgdGhpcy5yZXMgPSBmcm9udFJlc2VydmU7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTU2LDExICs3NSwxNCBAQAogICAgIHJldHVybiBidWY7CiAgIH0KIAotICBwdWJsaWMgaW50IGdldFBvcygpIHsKKyAgLyoqCisgICAqIEByZXR1cm4gbGVuZ3RoIG9mIHRoZSBidWZmZXIsIGluY2x1ZGluZyBhbnkgZnJvbnQgcmVzZXJ2ZQorICAgKi8KKyAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CiAgICAgcmV0dXJuIHBvczsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIHBvcyA9IDA7CisgICAgcG9zID0gcmVzOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCeXRlQnVmZmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCeXRlQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiMDY1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ5dGVCdWZmZXIuamF2YQpAQCAtMCwwICsxLDg3IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEubmlvLkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIEJ5dGVCdWZmZXItYmFja2VkIGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUQnl0ZUJ1ZmZlciBleHRlbmRzIFRUcmFuc3BvcnQgeworICBwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcjsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBUQnl0ZUJ1ZmZlciB3cmFwcGluZyBhIGdpdmVuIE5JTyBCeXRlQnVmZmVyLgorICAgKi8KKyAgcHVibGljIFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcikgeworICAgIHRoaXMuYnl0ZUJ1ZmZlciA9IGJ5dGVCdWZmZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9wZW4oKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgbiA9IE1hdGgubWluKGJ5dGVCdWZmZXIucmVtYWluaW5nKCksIGxlbik7CisgICAgaWYgKG4gPiAwKSB7CisgICAgICB0cnkgeworICAgICAgICBieXRlQnVmZmVyLmdldChidWYsIG9mZiwgbik7CisgICAgICB9IGNhdGNoIChCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgYnVmZmVyIiwgZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgYnl0ZUJ1ZmZlci5wdXQoYnVmLCBvZmYsIGxlbik7CisgICAgfSBjYXRjaCAoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIk5vdCBlbm91Z2ggcm9vbSBpbiBvdXRwdXQgYnVmZmVyIiwgZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlci4KKyAgICovCisgIHB1YmxpYyBCeXRlQnVmZmVyIGdldEJ5dGVCdWZmZXIoKSB7CisgICAgcmV0dXJuIGJ5dGVCdWZmZXI7CisgIH0KKworICAvKioKKyAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNhbGwgY2xlYXIoKSBvbiB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlci4KKyAgICovCisgIHB1YmxpYyBUQnl0ZUJ1ZmZlciBjbGVhcigpIHsKKyAgICBieXRlQnVmZmVyLmNsZWFyKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNhbGwgZmxpcCgpIG9uIHRoZSB1bmRlcmx5aW5nIE5JTyBCeXRlQnVmZmVyLgorICAgICAqLworICBwdWJsaWMgVEJ5dGVCdWZmZXIgZmxpcCgpIHsKKyAgICBieXRlQnVmZmVyLmZsaXAoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29udmVydCB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlciB0byBhCisgICAqIHBsYWluIG9sZCBieXRlIGFycmF5LgorICAgKi8KKyAgcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKKyAgICBmaW5hbCBieXRlW10gZGF0YSA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOworICAgIGJ5dGVCdWZmZXIuc2xpY2UoKS5nZXQoZGF0YSk7CisgICAgcmV0dXJuIGRhdGE7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCBlMzJiN2RiLi5hMWZkMjQ5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCkBAIC0xOSwxMiArMTksMTIgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiAvKioKLSAqIFRoaXMgdHJhbnNwb3J0IGlzIHdpcmUgY29tcGF0aWJsZSB3aXRoIHtAbGluayBURnJhbWVkVHJhbnNwb3J0fSwgYnV0IG1ha2VzIAorICogVGhpcyB0cmFuc3BvcnQgaXMgd2lyZSBjb21wYXRpYmxlIHdpdGgge0BsaW5rIFRGcmFtZWRUcmFuc3BvcnR9LCBidXQgbWFrZXMKICAqIHVzZSBvZiByZXVzYWJsZSwgZXhwYW5kaW5nIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMgaW4gb3JkZXIgdG8gYXZvaWQKICAqIGFsbG9jYXRpbmcgbmV3IGJ5dGVbXXMgYWxsIHRoZSB0aW1lLiBTaW5jZSB0aGUgYnVmZmVycyBvbmx5IGV4cGFuZCwgeW91CiAgKiBzaG91bGQgcHJvYmFibHkgb25seSB1c2UgdGhpcyB0cmFuc3BvcnQgaWYgeW91ciBtZXNzYWdlcyBhcmUgbm90IHRvbyB2YXJpYWJseQogICogbGFyZ2UsIHVubGVzcyB0aGUgcGVyc2lzdGVudCBtZW1vcnkgY29zdCBpcyBub3QgYW4gaXNzdWUuCi0gKiAKKyAqCiAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIE5PVCB0aHJlYWRzYWZlLgogICovCiBwdWJsaWMgY2xhc3MgVEZhc3RGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKQEAgLTY1LDcgKzY1LDggQEAKIAogICBwcml2YXRlIGZpbmFsIFRUcmFuc3BvcnQgdW5kZXJseWluZzsKICAgcHJpdmF0ZSBmaW5hbCBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgd3JpdGVCdWZmZXI7Ci0gIHByaXZhdGUgZmluYWwgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQgcmVhZEJ1ZmZlcjsKKyAgcHJpdmF0ZSBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCByZWFkQnVmZmVyOworICBwcml2YXRlIGZpbmFsIGludCBpbml0aWFsQnVmZmVyQ2FwYWNpdHk7CiAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzRdOwogICBwcml2YXRlIGZpbmFsIGludCBtYXhMZW5ndGg7CiAKQEAgLTkxLDcgKzkyLDcgQEAKICAgfQogCiAgIC8qKgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHVuZGVybHlpbmcgVHJhbnNwb3J0IHRoYXQgcmVhbCByZWFkcyBhbmQgd3JpdGVzIHdpbGwgZ28gdGhyb3VnaCB0by4KICAgICogQHBhcmFtIGluaXRpYWxCdWZmZXJDYXBhY2l0eSBUaGUgaW5pdGlhbCBzaXplIG9mIHRoZSByZWFkIGFuZCB3cml0ZSBidWZmZXJzLgogICAgKiBJbiBwcmFjdGljZSwgaXQncyBub3QgY3JpdGljYWwgdG8gc2V0IHRoaXMgdW5sZXNzIHlvdSBrbm93IGluIGFkdmFuY2UgdGhhdApAQCAtMTA0LDggKzEwNSw5IEBACiAgIHB1YmxpYyBURmFzdEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcsIGludCBpbml0aWFsQnVmZmVyQ2FwYWNpdHksIGludCBtYXhMZW5ndGgpIHsKICAgICB0aGlzLnVuZGVybHlpbmcgPSB1bmRlcmx5aW5nOwogICAgIHRoaXMubWF4TGVuZ3RoID0gbWF4TGVuZ3RoOwotICAgIHdyaXRlQnVmZmVyID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHksIDEuNSk7Ci0gICAgcmVhZEJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHksIDEuNSk7CisgICAgdGhpcy5pbml0aWFsQnVmZmVyQ2FwYWNpdHkgPSBpbml0aWFsQnVmZmVyQ2FwYWNpdHk7CisgICAgcmVhZEJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHkpOworICAgIHdyaXRlQnVmZmVyID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHksIDQpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC0xNDEsMTEgKzE0MywxNCBAQAogICAgIGludCBzaXplID0gVEZyYW1lZFRyYW5zcG9ydC5kZWNvZGVGcmFtZVNpemUoaTMyYnVmKTsKIAogICAgIGlmIChzaXplIDwgMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplICgiICsgc2l6ZSArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsICJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSEiKTsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA+IG1heExlbmd0aCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkZyYW1lIHNpemUgKCIgKyBzaXplICsgIikgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoIiArIG1heExlbmd0aCArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgIkZyYW1lIHNpemUgKCIgKyBzaXplICsgIikgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoIiArIG1heExlbmd0aCArICIpISIpOwogICAgIH0KIAogICAgIHJlYWRCdWZmZXIuZmlsbCh1bmRlcmx5aW5nLCBzaXplKTsKQEAgLTE2MSwxMiArMTY2LDE5IEBACiAgICAgcmVhZEJ1ZmZlci5jb25zdW1lQnVmZmVyKGxlbik7CiAgIH0KIAorICAvKioKKyAgICogT25seSBjbGVhcnMgdGhlIHJlYWQgYnVmZmVyIQorICAgKi8KKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgcmVhZEJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHkpOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIGludCBsZW5ndGggPSB3cml0ZUJ1ZmZlci5nZXRQb3MoKTsKLSAgICBURnJhbWVkVHJhbnNwb3J0LmVuY29kZUZyYW1lU2l6ZShsZW5ndGgsIGkzMmJ1Zik7Ci0gICAgdW5kZXJseWluZy53cml0ZShpMzJidWYsIDAsIDQpOwotICAgIHVuZGVybHlpbmcud3JpdGUod3JpdGVCdWZmZXIuZ2V0QnVmKCkuYXJyYXkoKSwgMCwgbGVuZ3RoKTsKKyAgICBpbnQgcGF5bG9hZExlbmd0aCA9IHdyaXRlQnVmZmVyLmdldExlbmd0aCgpIC0gNDsgICAgICAgIAorICAgIGJ5dGVbXSBkYXRhID0gd3JpdGVCdWZmZXIuZ2V0QnVmKCkuYXJyYXkoKTsKKyAgICBURnJhbWVkVHJhbnNwb3J0LmVuY29kZUZyYW1lU2l6ZShwYXlsb2FkTGVuZ3RoLCBkYXRhKTsKKyAgICB1bmRlcmx5aW5nLndyaXRlKGRhdGEsIDAsIHBheWxvYWRMZW5ndGggKyA0KTsKICAgICB3cml0ZUJ1ZmZlci5yZXNldCgpOwogICAgIHVuZGVybHlpbmcuZmx1c2goKTsKICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVByb2Nlc3Nvci5qYXZhCmluZGV4IDRlNmExOTguLjk2MDg3ZDEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVQcm9jZXNzb3IuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlUHJvY2Vzc29yLmphdmEKQEAgLTI3LDggKzI3LDYgQEAKIC8qKgogICogRmlsZVByb2Nlc3NvcjogaGVscHMgaW4gcHJvY2Vzc2luZyBmaWxlcyBnZW5lcmF0ZWQgYnkgVEZpbGVUcmFuc3BvcnQuCiAgKiBQb3J0IG9mIG9yaWdpbmFsIGNwcCBpbXBsZW1lbnRhdGlvbgotICoKLSAqIEBhdXRob3IgSm95ZGVlcCBTZW4gU2FybWEgPGpzc2FybWFAZmFjZWJvb2suY29tPgogICovCiBwdWJsaWMgY2xhc3MgVEZpbGVQcm9jZXNzb3IgewogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmphdmEKaW5kZXggMDA0NGQyYS4uYzAxMWM1MiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuamF2YQpAQCAtMzMsOCArMzMsNiBAQAogICogSXQgbWF5IG1ha2UgYmV0dGVyIHNlbnNlIHRvIHByb3ZpZGUgYSBiYXNpYyBzdHJlYW0gYWNjZXNzIG9uIHRvcCBvZiB0aGUgZnJhbWVkIGZpbGUgZm9ybWF0CiAgKiBUaGUgRmlsZVRyYW5zcG9ydCBjYW4gdGhlbiBiZSBhIHVzZXIgb2YgdGhpcyBmcmFtZWQgZmlsZSBmb3JtYXQgd2l0aCBzb21lIGFkZGl0aW9uYWwgbG9naWMKICAqIGZvciBjaHVua2luZy4KLSAqCi0gKiBAYXV0aG9yIEpveWRlZXAgU2VuIFNhcm1hIDxqc3Nhcm1hQGZhY2Vib29rLmNvbT4KICAqLwogcHVibGljIGNsYXNzIFRGaWxlVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CiAKQEAgLTM2OCw3ICszNjYsNyBAQAogICAgICAgY3VycmVudEV2ZW50XyA9IG5ldyBFdmVudChuZXcgYnl0ZSBbMjU2XSk7CiAKICAgICAgIGlmKCFyZWFkT25seV8pCi0gICAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oaW5wdXRGaWxlXy5nZXRPdXRwdXRTdHJlYW0oKSwgODE5Mik7CisgICAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oaW5wdXRGaWxlXy5nZXRPdXRwdXRTdHJlYW0oKSk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CiAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBpb3gpOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmphdmEKaW5kZXggYzk0OGFhNC4uYTAwNmMzYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTQ1LDcgKzQ1LDggQEAKICAgLyoqCiAgICAqIEJ1ZmZlciBmb3IgaW5wdXQKICAgICovCi0gIHByaXZhdGUgVE1lbW9yeUlucHV0VHJhbnNwb3J0IHJlYWRCdWZmZXJfID0gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydChuZXcgYnl0ZVswXSk7CisgIHByaXZhdGUgZmluYWwgVE1lbW9yeUlucHV0VHJhbnNwb3J0IHJlYWRCdWZmZXJfID0KKyAgICBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KG5ldyBieXRlWzBdKTsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBUVHJhbnNwb3J0RmFjdG9yeSB7CiAgICAgcHJpdmF0ZSBpbnQgbWF4TGVuZ3RoXzsKQEAgLTY1LDE2ICs2NiwyNSBAQAogICB9CiAKICAgLyoqCisgICAqIFNvbWV0aGluZyB0byBmaWxsIGluIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSBidWZmZXIKKyAgICogdG8gbWFrZSByb29tIGZvciB0aGUgZnJhbWUgc2l6ZS4gIFRoaXMgYWxsb3dzIHRoZQorICAgKiBpbXBsZW1lbnRhdGlvbiB0byB3cml0ZSBvbmNlIGluc3RlYWQgb2YgdHdpY2UuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gc2l6ZUZpbGxlcl8gPSBuZXcgYnl0ZVtdIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCisgIC8qKgogICAgKiBDb25zdHJ1Y3RvciB3cmFwcyBhcm91bmQgYW5vdGhlciB0cmFuc3BvcnQKICAgICovCiAgIHB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBpbnQgbWF4TGVuZ3RoKSB7CiAgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKICAgICBtYXhMZW5ndGhfID0gbWF4TGVuZ3RoOworICAgIHdyaXRlQnVmZmVyXy53cml0ZShzaXplRmlsbGVyXywgMCwgNCk7CiAgIH0KIAogICBwdWJsaWMgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgewogICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CiAgICAgbWF4TGVuZ3RoXyA9IFRGcmFtZWRUcmFuc3BvcnQuREVGQVVMVF9NQVhfTEVOR1RIOworICAgIHdyaXRlQnVmZmVyXy53cml0ZShzaXplRmlsbGVyXywgMCwgNCk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewpAQCAtOTAsMTEgKzEwMCw5IEBACiAgIH0KIAogICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIGlmIChyZWFkQnVmZmVyXyAhPSBudWxsKSB7Ci0gICAgICBpbnQgZ290ID0gcmVhZEJ1ZmZlcl8ucmVhZChidWYsIG9mZiwgbGVuKTsKLSAgICAgIGlmIChnb3QgPiAwKSB7Ci0gICAgICAgIHJldHVybiBnb3Q7Ci0gICAgICB9CisgICAgaW50IGdvdCA9IHJlYWRCdWZmZXJfLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgaWYgKGdvdCA+IDApIHsKKyAgICAgIHJldHVybiBnb3Q7CiAgICAgfQogCiAgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKQEAgLTEyMyw2ICsxMzEsMTAgQEAKICAgICByZWFkQnVmZmVyXy5jb25zdW1lQnVmZmVyKGxlbik7CiAgIH0KIAorICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICByZWFkQnVmZmVyXy5jbGVhcigpOworICB9CisKICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaTMyYnVmID0gbmV3IGJ5dGVbNF07CiAKICAgcHJpdmF0ZSB2b2lkIHJlYWRGcmFtZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKQEAgLTEzMCwxMSArMTQyLDE0IEBACiAgICAgaW50IHNpemUgPSBkZWNvZGVGcmFtZVNpemUoaTMyYnVmKTsKIAogICAgIGlmIChzaXplIDwgMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplICgiICsgc2l6ZSArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsICJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSEiKTsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA+IG1heExlbmd0aF8pIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGcmFtZSBzaXplICgiICsgc2l6ZSArICIpIGxhcmdlciB0aGFuIG1heCBsZW5ndGggKCIgKyBtYXhMZW5ndGhfICsgIikhIik7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5DT1JSVVBURURfREFUQSwKKyAgICAgICAgICAiRnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSBsYXJnZXIgdGhhbiBtYXggbGVuZ3RoICgiICsgbWF4TGVuZ3RoXyArICIpISIpOwogICAgIH0KIAogICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbc2l6ZV07CkBAIC0xNDksMTIgKzE2NCwxMiBAQAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAgICAgYnl0ZVtdIGJ1ZiA9IHdyaXRlQnVmZmVyXy5nZXQoKTsKLSAgICBpbnQgbGVuID0gd3JpdGVCdWZmZXJfLmxlbigpOworICAgIGludCBsZW4gPSB3cml0ZUJ1ZmZlcl8ubGVuKCkgLSA0OyAgICAgICAvLyBhY2NvdW50IGZvciB0aGUgcHJlcGVuZGVkIGZyYW1lIHNpemUKICAgICB3cml0ZUJ1ZmZlcl8ucmVzZXQoKTsKKyAgICB3cml0ZUJ1ZmZlcl8ud3JpdGUoc2l6ZUZpbGxlcl8sIDAsIDQpOyAgLy8gbWFrZSByb29tIGZvciB0aGUgbmV4dCBmcmFtZSdzIHNpemUgZGF0YQogCi0gICAgZW5jb2RlRnJhbWVTaXplKGxlbiwgaTMyYnVmKTsKLSAgICB0cmFuc3BvcnRfLndyaXRlKGkzMmJ1ZiwgMCwgNCk7Ci0gICAgdHJhbnNwb3J0Xy53cml0ZShidWYsIDAsIGxlbik7CisgICAgZW5jb2RlRnJhbWVTaXplKGxlbiwgYnVmKTsgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGZyYW1lIGxlbmd0aCB3aXRob3V0IHRoZSBmaWxsZXIKKyAgICB0cmFuc3BvcnRfLndyaXRlKGJ1ZiwgMCwgbGVuICsgNCk7ICAgICAgLy8gd2UgaGF2ZSB0byB3cml0ZSB0aGUgZnJhbWUgc2l6ZSBhbmQgZnJhbWUgZGF0YQogICAgIHRyYW5zcG9ydF8uZmx1c2goKTsKICAgfQogCkBAIC0xNjYsNyArMTgxLDcgQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRlY29kZUZyYW1lU2l6ZShmaW5hbCBieXRlW10gYnVmKSB7Ci0gICAgcmV0dXJuIAorICAgIHJldHVybgogICAgICAgKChidWZbMF0gJiAweGZmKSA8PCAyNCkgfAogICAgICAgKChidWZbMV0gJiAweGZmKSA8PCAxNikgfAogICAgICAgKChidWZbMl0gJiAweGZmKSA8PCAgOCkgfApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhCmluZGV4IDVhNWIzN2MuLmMzMDYzZmUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEKQEAgLTMwNCw2ICszMDQsOSBAQAogICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlvZSk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIGlmIChwb3N0ICE9IG51bGwpIHsKKyAgICAgICAgcG9zdC5yZWxlYXNlQ29ubmVjdGlvbigpOworICAgICAgfQogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhCmluZGV4IGVmNWY1YzIuLmIxOWFjODYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhCkBAIC0yMCw3ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIAogLyoqCiAgKiBNZW1vcnkgYnVmZmVyLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KQEAgLTMwLDYgKzMwLDggQEAKICAgICogQ3JlYXRlIGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGFuIGluaXRpYWwgYnVmZmVyIHNpemUgb2YgPGk+c2l6ZTwvaT4uIFRoZQogICAgKiBpbnRlcm5hbCBidWZmZXIgd2lsbCBncm93IGFzIG5lY2Vzc2FyeSB0byBhY2NvbW1vZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YQogICAgKiBiZWluZyB3cml0dGVuIHRvIGl0LgorICAgKgorICAgKiBAcGFyYW0gc2l6ZSB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBidWZmZXIKICAgICovCiAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKGludCBzaXplKSB7CiAgICAgYXJyXyA9IG5ldyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKHNpemUpOwpAQCAtNjksMTEgKzcxLDExIEBACiAgIC8qKgogICAgKiBPdXRwdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtZW1vcnkgYnVmZmVyIGFzIGEgU3RyaW5nLCB1c2luZyB0aGUgc3VwcGxpZWQKICAgICogZW5jb2RpbmcKLSAgICogQHBhcmFtIGVuYyAgdGhlIGVuY29kaW5nIHRvIHVzZQorICAgKiBAcGFyYW0gY2hhcnNldCB0aGUgZW5jb2RpbmcgdG8gdXNlCiAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBtZW1vcnkgYnVmZmVyIGFzIGEgU3RyaW5nCiAgICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFN0cmluZyBlbmMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gYXJyXy50b1N0cmluZyhlbmMpOworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKENoYXJzZXQgY2hhcnNldCkgeworICAgIHJldHVybiBhcnJfLnRvU3RyaW5nKGNoYXJzZXQpOwogICB9CiAKICAgcHVibGljIFN0cmluZyBpbnNwZWN0KCkgewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmphdmEKaW5kZXggNDRmZTI3My4uZWY4MmFjMiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5qYXZhCkBAIC05Myw3ICs5Myw3IEBACiAgICAgICBzZXJ2ZXJTb2NrZXRfLmJpbmQoYXJncy5iaW5kQWRkciwgYXJncy5iYWNrbG9nKTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgIHNlcnZlclNvY2tldF8gPSBudWxsOwotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIGFkZHJlc3MgIiArIGFyZ3MuYmluZEFkZHIudG9TdHJpbmcoKSArICIuIik7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYXJncy5iaW5kQWRkci50b1N0cmluZygpICsgIi4iLCBpb2UpOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NvY2tldC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTb2NrZXQuamF2YQppbmRleCAyM2Y4NTc0Li5mODZhNDhiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NvY2tldC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU29ja2V0LmphdmEKQEAgLTU1LDcgKzU1LDYgQEAKICAgICogQ3JlYXRlIGEgbmV3IG5vbmJsb2NraW5nIHNvY2tldCB0cmFuc3BvcnQgdGhhdCB3aWxsIGJlIGNvbm5lY3RlZCB0byBob3N0OnBvcnQuCiAgICAqIEBwYXJhbSBob3N0CiAgICAqIEBwYXJhbSBwb3J0Ci0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgogICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAqLwogICBwdWJsaWMgVE5vbmJsb2NraW5nU29ja2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3NmM5OGM4Li4yMjMyYTMxCi0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKQEAgLTQ5LDkgKzQ5LDkgQEAKICAgICogZnJvbSBTeXN0ZW0gcHJvcGVydGllcyB0aGF0IGFyZSBzZXQuCiAgICAqCiAgICAqIEV4YW1wbGUgc3lzdGVtIHByb3BlcnRpZXM6Ci0gICAqIC1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlPTx0cnVzdHN0b3JlIGxvY2F0aW9uPgorICAgKiAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZT0mbHQ7dHJ1c3RzdG9yZSBsb2NhdGlvbiZndDsKICAgICogLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZD1wYXNzd29yZAotICAgKiAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmU9PGtleXN0b3JlIGxvY2F0aW9uPgorICAgKiAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmU9Jmx0O2tleXN0b3JlIGxvY2F0aW9uJmd0OwogICAgKiAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZD1wYXNzd29yZAogICAgKgogICAgKiBAcGFyYW0gcG9ydApAQCAtMTg2LDcgKzE4NiwxMSBAQAogICAgICAgaWYgKHBhcmFtcy5pc1RydXN0U3RvcmVTZXQpIHsKICAgICAgICAgdG1mID0gVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShwYXJhbXMudHJ1c3RNYW5hZ2VyVHlwZSk7CiAgICAgICAgIEtleVN0b3JlIHRzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UocGFyYW1zLnRydXN0U3RvcmVUeXBlKTsKLSAgICAgICAgaW4gPSBnZXRTdG9yZUFzU3RyZWFtKHBhcmFtcy50cnVzdFN0b3JlKTsKKyAgICAgICAgaWYgKHBhcmFtcy50cnVzdFN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICBpbiA9IHBhcmFtcy50cnVzdFN0b3JlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluID0gZ2V0U3RvcmVBc1N0cmVhbShwYXJhbXMudHJ1c3RTdG9yZSk7CisgICAgICAgIH0KICAgICAgICAgdHMubG9hZChpbiwKICAgICAgICAgICAgICAgICAocGFyYW1zLnRydXN0UGFzcyAhPSBudWxsID8gcGFyYW1zLnRydXN0UGFzcy50b0NoYXJBcnJheSgpIDogbnVsbCkpOwogICAgICAgICB0bWYuaW5pdCh0cyk7CkBAIC0xOTUsNyArMTk5LDExIEBACiAgICAgICBpZiAocGFyYW1zLmlzS2V5U3RvcmVTZXQpIHsKICAgICAgICAga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UocGFyYW1zLmtleU1hbmFnZXJUeXBlKTsKICAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShwYXJhbXMua2V5U3RvcmVUeXBlKTsKLSAgICAgICAgaXMgPSBnZXRTdG9yZUFzU3RyZWFtKHBhcmFtcy5rZXlTdG9yZSk7CisgICAgICAgIGlmIChwYXJhbXMua2V5U3RvcmVTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAJaXMgPSBwYXJhbXMua2V5U3RvcmVTdHJlYW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIAlpcyA9IGdldFN0b3JlQXNTdHJlYW0ocGFyYW1zLmtleVN0b3JlKTsKKyAgICAgICAgfQogICAgICAgICBrcy5sb2FkKGlzLCBwYXJhbXMua2V5UGFzcy50b0NoYXJBcnJheSgpKTsKICAgICAgICAga21mLmluaXQoa3MsIHBhcmFtcy5rZXlQYXNzLnRvQ2hhckFycmF5KCkpOwogICAgICAgfQpAQCAtMjczLDEwICsyODEsMTIgQEAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyB7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbCA9ICJUTFMiOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5U3RvcmU7CisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGtleVN0b3JlU3RyZWFtOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5UGFzczsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleU1hbmFnZXJUeXBlID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5U3RvcmVUeXBlID0gIkpLUyI7CiAgICAgcHJvdGVjdGVkIFN0cmluZyB0cnVzdFN0b3JlOworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSB0cnVzdFN0b3JlU3RyZWFtOwogICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RQYXNzOwogICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RNYW5hZ2VyVHlwZSA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpOwogICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RTdG9yZVR5cGUgPSAiSktTIjsKQEAgLTMwOSw3ICszMTksNyBAQAogICAgICAgaWYgKHByb3RvY29sICE9IG51bGwpIHsKICAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOwogICAgICAgfQotICAgICAgdGhpcy5jaXBoZXJTdWl0ZXMgPSBBcnJheXMuY29weU9mKGNpcGhlclN1aXRlcywgY2lwaGVyU3VpdGVzLmxlbmd0aCk7CisgICAgICB0aGlzLmNpcGhlclN1aXRlcyA9IGNpcGhlclN1aXRlcyAhPSBudWxsID8gQXJyYXlzLmNvcHlPZihjaXBoZXJTdWl0ZXMsIGNpcGhlclN1aXRlcy5sZW5ndGgpIDogbnVsbDsKICAgICAgIHRoaXMuY2xpZW50QXV0aCA9IGNsaWVudEF1dGg7CiAgICAgfQogCkBAIC0zMzIsNyArMzQyLDIwIEBACiAgICAgICB9CiAgICAgICBpc0tleVN0b3JlU2V0ID0gdHJ1ZTsKICAgICB9Ci0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGtleXN0b3JlLCBwYXNzd29yZCwgY2VydGlmaWNhdGUgdHlwZSBhbmQgdGhlIHN0b3JlIHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlTdG9yZVN0cmVhbSBLZXlzdG9yZSBjb250ZW50IGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSBrZXlQYXNzIEtleXN0b3JlIHBhc3N3b3JkCisgICAgICogQHBhcmFtIGtleU1hbmFnZXJUeXBlIFRoZSBkZWZhdWx0IGlzIFg1MDkKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmVUeXBlIFRoZSBkZWZhdWx0IGlzIEpLUworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtleVN0b3JlKElucHV0U3RyZWFtIGtleVN0b3JlU3RyZWFtLCBTdHJpbmcga2V5UGFzcywgU3RyaW5nIGtleU1hbmFnZXJUeXBlLCBTdHJpbmcga2V5U3RvcmVUeXBlKSB7CisgICAgCXRoaXMua2V5U3RvcmVTdHJlYW0gPSBrZXlTdG9yZVN0cmVhbTsKKyAgICAJc2V0S2V5U3RvcmUoIiIsIGtleVBhc3MsIGtleU1hbmFnZXJUeXBlLCBrZXlTdG9yZVR5cGUpOworICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIGtleXN0b3JlIGFuZCBwYXNzd29yZAogICAgICAqCkBAIC0zNDIsNyArMzY1LDE3IEBACiAgICAgcHVibGljIHZvaWQgc2V0S2V5U3RvcmUoU3RyaW5nIGtleVN0b3JlLCBTdHJpbmcga2V5UGFzcykgewogICAgICAgc2V0S2V5U3RvcmUoa2V5U3RvcmUsIGtleVBhc3MsIG51bGwsIG51bGwpOwogICAgIH0KLQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUga2V5c3RvcmUgYW5kIHBhc3N3b3JkCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmVTdHJlYW0gS2V5c3RvcmUgY29udGVudCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtleVN0b3JlKElucHV0U3RyZWFtIGtleVN0b3JlU3RyZWFtLCBTdHJpbmcga2V5UGFzcykgeworICAgICAgc2V0S2V5U3RvcmUoa2V5U3RvcmVTdHJlYW0sIGtleVBhc3MsIG51bGwsIG51bGwpOworICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUsIHBhc3N3b3JkLCBjZXJ0aWZpY2F0ZSB0eXBlIGFuZCB0aGUgc3RvcmUgdHlwZQogICAgICAqCkBAIC0zNjIsNiArMzk1LDE5IEBACiAgICAgICB9CiAgICAgICBpc1RydXN0U3RvcmVTZXQgPSB0cnVlOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUsIHBhc3N3b3JkLCBjZXJ0aWZpY2F0ZSB0eXBlIGFuZCB0aGUgc3RvcmUgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtIHRydXN0U3RvcmVTdHJlYW0gVHJ1c3RzdG9yZSBjb250ZW50IGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAorICAgICAqIEBwYXJhbSB0cnVzdE1hbmFnZXJUeXBlIFRoZSBkZWZhdWx0IGlzIFg1MDkKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZVR5cGUgVGhlIGRlZmF1bHQgaXMgSktTCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZShJbnB1dFN0cmVhbSB0cnVzdFN0b3JlU3RyZWFtLCBTdHJpbmcgdHJ1c3RQYXNzLCBTdHJpbmcgdHJ1c3RNYW5hZ2VyVHlwZSwgU3RyaW5nIHRydXN0U3RvcmVUeXBlKSB7CisgICAgICB0aGlzLnRydXN0U3RvcmVTdHJlYW0gPSB0cnVzdFN0b3JlU3RyZWFtOworICAgICAgc2V0VHJ1c3RTdG9yZSgiIiwgdHJ1c3RQYXNzLCB0cnVzdE1hbmFnZXJUeXBlLCB0cnVzdFN0b3JlVHlwZSk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB0cnVzdHN0b3JlIGFuZCBwYXNzd29yZApAQCAtMzcyLDYgKzQxOCwxNiBAQAogICAgIHB1YmxpYyB2b2lkIHNldFRydXN0U3RvcmUoU3RyaW5nIHRydXN0U3RvcmUsIFN0cmluZyB0cnVzdFBhc3MpIHsKICAgICAgIHNldFRydXN0U3RvcmUodHJ1c3RTdG9yZSwgdHJ1c3RQYXNzLCBudWxsLCBudWxsKTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0cnVzdHN0b3JlIGFuZCBwYXNzd29yZAorICAgICAqCisgICAgICogQHBhcmFtIHRydXN0U3RvcmVTdHJlYW0gVHJ1c3RzdG9yZSBjb250ZW50IGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRydXN0U3RvcmUoSW5wdXRTdHJlYW0gdHJ1c3RTdG9yZVN0cmVhbSwgU3RyaW5nIHRydXN0UGFzcykgeworICAgICAgc2V0VHJ1c3RTdG9yZSh0cnVzdFN0b3JlU3RyZWFtLCB0cnVzdFBhc3MsIG51bGwsIG51bGwpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldCBpZiBjbGllbnQgYXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQKQEAgLTM4MCw2ICs0MzYsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlcXVpcmVDbGllbnRBdXRoKGJvb2xlYW4gY2xpZW50QXV0aCkgewogICAgICAgdGhpcy5jbGllbnRBdXRoID0gY2xpZW50QXV0aDsKLSAgICB9Ci0gIH0KKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xDbGllbnRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xDbGllbnRUcmFuc3BvcnQuamF2YQppbmRleCA1YWEwY2NkLi40YjFjYTBhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlcjsKQEAgLTk2LDcgKzk3LDcgQEAKICAgICBMT0dHRVIuZGVidWcoIlNlbmRpbmcgbWVjaGFuaXNtIG5hbWUge30gYW5kIGluaXRpYWwgcmVzcG9uc2Ugb2YgbGVuZ3RoIHt9IiwgbWVjaGFuaXNtLAogICAgICAgICBpbml0aWFsUmVzcG9uc2UubGVuZ3RoKTsKIAotICAgIGJ5dGVbXSBtZWNoYW5pc21CeXRlcyA9IG1lY2hhbmlzbS5nZXRCeXRlcygpOworICAgIGJ5dGVbXSBtZWNoYW5pc21CeXRlcyA9IG1lY2hhbmlzbS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICBzZW5kU2FzbE1lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuU1RBUlQsCiAgICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbUJ5dGVzKTsKICAgICAvLyBTZW5kIGluaXRpYWwgcmVzcG9uc2UKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuamF2YQppbmRleCBjODgzYzhmLi4zOWI4MWNhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0xMzAsNyArMTMxLDcgQEAKICAgICB9CiAKICAgICAvLyBHZXQgdGhlIG1lY2hhbmlzbSBuYW1lLgotICAgIFN0cmluZyBtZWNoYW5pc21OYW1lID0gbmV3IFN0cmluZyhtZXNzYWdlLnBheWxvYWQpOworICAgIFN0cmluZyBtZWNoYW5pc21OYW1lID0gbmV3IFN0cmluZyhtZXNzYWdlLnBheWxvYWQsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIFRTYXNsU2VydmVyRGVmaW5pdGlvbiBzZXJ2ZXJEZWZpbml0aW9uID0gc2VydmVyRGVmaW5pdGlvbk1hcC5nZXQobWVjaGFuaXNtTmFtZSk7CiAgICAgTE9HR0VSLmRlYnVnKCJSZWNlaXZlZCBtZWNoYW5pc20gbmFtZSAne30nIiwgbWVjaGFuaXNtTmFtZSk7CiAKQEAgLTE0NSw3ICsxNDYsNyBAQAogCiAgIC8qKgogICAgKiA8Y29kZT5UVHJhbnNwb3J0RmFjdG9yeTwvY29kZT4gdG8gY3JlYXRlCi0gICAqIDxjb2RlPlRTYXNsU2VydmVyVHJhbnNwb3J0czxjL29kZT4uIEVuc3VyZXMgdGhhdCBhIGdpdmVuCisgICAqIDxjb2RlPlRTYXNsU2VydmVyVHJhbnNwb3J0czwvY29kZT4uIEVuc3VyZXMgdGhhdCBhIGdpdmVuCiAgICAqIHVuZGVybHlpbmcgPGNvZGU+VFRyYW5zcG9ydDwvY29kZT4gaW5zdGFuY2UgcmVjZWl2ZXMgdGhlIHNhbWUKICAgICogPGNvZGU+VFNhc2xTZXJ2ZXJUcmFuc3BvcnQ8L2NvZGU+LiBUaGlzIGlzIGtpbmQgb2YgYW4gYXdmdWwgaGFjayB0byB3b3JrCiAgICAqIGFyb3VuZCB0aGUgZmFjdCB0aGF0IFRocmlmdCBpcyBkZXNpZ25lZCBhc3N1bWluZyB0aGF0CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEKaW5kZXggMDcwOTM0Mi4uYzg1ODQyNSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YQpAQCAtMTksNyArMTksNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApAQCAtMzUsNyArMzUsNyBAQAogCiAvKioKICAqIEEgc3VwZXJjbGFzcyBmb3IgU0FTTCBjbGllbnQvc2VydmVyIHRocmlmdCB0cmFuc3BvcnRzLiBBIHN1YmNsYXNzIG5lZWQgb25seQotICogaW1wbGVtZW50IHRoZSA8Y29kZT5vcGVuPC9vcGVuPiBtZXRob2QuCisgKiBpbXBsZW1lbnQgdGhlIDxjb2RlPm9wZW48L2NvZGU+IG1ldGhvZC4KICAqLwogYWJzdHJhY3QgY2xhc3MgVFNhc2xUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKIApAQCAtMTU4LDkgKzE1OCw5IEBACiAgICAgbWVzc2FnZUhlYWRlclswXSA9IHN0YXR1cy5nZXRWYWx1ZSgpOwogICAgIEVuY29kaW5nVXRpbHMuZW5jb2RlQmlnRW5kaWFuKHBheWxvYWQubGVuZ3RoLCBtZXNzYWdlSGVhZGVyLCBTVEFUVVNfQllURVMpOwogCi0gICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgTE9HR0VSLmRlYnVnKGdldFJvbGUoKSArICI6IFdyaXRpbmcgbWVzc2FnZSB3aXRoIHN0YXR1cyB7fSBhbmQgcGF5bG9hZCBsZW5ndGgge30iLAotICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcGF5bG9hZC5sZW5ndGgpOworICAgIExPR0dFUi5kZWJ1Zygie306IFdyaXRpbmcgbWVzc2FnZSB3aXRoIHN0YXR1cyB7fSBhbmQgcGF5bG9hZCBsZW5ndGgge30iLAorICAgICAgICBnZXRSb2xlKCksIHN0YXR1cywgcGF5bG9hZC5sZW5ndGgpOworCiAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC53cml0ZShtZXNzYWdlSGVhZGVyKTsKICAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LndyaXRlKHBheWxvYWQpOwogICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuZmx1c2goKTsKQEAgLTE5NCwxNyArMTk0LDExIEBACiAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC5yZWFkQWxsKHBheWxvYWQsIDAsIHBheWxvYWQubGVuZ3RoKTsKIAogICAgIGlmIChzdGF0dXMgPT0gTmVnb3RpYXRpb25TdGF0dXMuQkFEIHx8IHN0YXR1cyA9PSBOZWdvdGlhdGlvblN0YXR1cy5FUlJPUikgewotICAgICAgdHJ5IHsKLSAgICAgICAgU3RyaW5nIHJlbW90ZU1lc3NhZ2UgPSBuZXcgU3RyaW5nKHBheWxvYWQsICJVVEYtOCIpOwotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVlciBpbmRpY2F0ZWQgZmFpbHVyZTogIiArIHJlbW90ZU1lc3NhZ2UpOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGUpOwotICAgICAgfQorICAgICAgU3RyaW5nIHJlbW90ZU1lc3NhZ2UgPSBuZXcgU3RyaW5nKHBheWxvYWQsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlBlZXIgaW5kaWNhdGVkIGZhaWx1cmU6ICIgKyByZW1vdGVNZXNzYWdlKTsKICAgICB9Ci0KLSAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICBMT0dHRVIuZGVidWcoZ2V0Um9sZSgpICsgIjogUmVjZWl2ZWQgbWVzc2FnZSB3aXRoIHN0YXR1cyB7fSBhbmQgcGF5bG9hZCBsZW5ndGgge30iLAotICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcGF5bG9hZC5sZW5ndGgpOworICAgIExPR0dFUi5kZWJ1Zygie306IFJlY2VpdmVkIG1lc3NhZ2Ugd2l0aCBzdGF0dXMge30gYW5kIHBheWxvYWQgbGVuZ3RoIHt9IiwKKyAgICAgICAgZ2V0Um9sZSgpLCBzdGF0dXMsIHBheWxvYWQubGVuZ3RoKTsKICAgICByZXR1cm4gbmV3IFNhc2xSZXNwb25zZShzdGF0dXMsIHBheWxvYWQpOwogICB9CiAKQEAgLTIyNCw3ICsyMTgsNyBAQAogICAgKi8KICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRFeGNlcHRpb24gc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cyBzdGF0dXMsIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAgICAgdHJ5IHsKLSAgICAgIHNlbmRTYXNsTWVzc2FnZShzdGF0dXMsIG1lc3NhZ2UuZ2V0Qnl0ZXMoKSk7CisgICAgICBzZW5kU2FzbE1lc3NhZ2Uoc3RhdHVzLCBtZXNzYWdlLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgTE9HR0VSLndhcm4oIkNvdWxkIG5vdCBzZW5kIGZhaWx1cmUgcmVzcG9uc2UiLCBlKTsKICAgICAgIG1lc3NhZ2UgKz0gIlxuQWxzbywgY291bGQgbm90IHNlbmQgcmVzcG9uc2U6ICIgKyBlLnRvU3RyaW5nKCk7CkBAIC0zMjMsNyArMzE3LDcgQEAKICAgICAgIGlmICghcmVhZFNhc2xIZWFkZXIgJiYgZS5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSkgewogICAgICAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LmNsb3NlKCk7CiAgICAgICAgIExPR0dFUi5kZWJ1ZygiTm8gZGF0YSBvciBubyBzYXNsIGRhdGEgaW4gdGhlIHN0cmVhbSIpOwotICAgICAgICB0aHJvdyBuZXcgVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24oIk5vIGRhdGEgb3Igbm8gc2FzbCBkYXRhIGluIHRoZSBzdHJlYW0iKTsKKyAgICAgICAgdGhyb3cgbmV3IFRTYXNsVHJhbnNwb3J0RXhjZXB0aW9uKCJObyBkYXRhIG9yIG5vIHNhc2wgZGF0YSBpbiB0aGUgc3RyZWFtIGR1cmluZyBuZWdvdGlhdGlvbiIsIGUpOwogICAgICAgfQogICAgICAgdGhyb3cgZTsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5qYXZhCmluZGV4IDdiZDg3ZjQuLjc5ZjdiN2YgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5qYXZhCkBAIC0xMTEsNyArMTExLDcgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIGxpc3RlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgIC8vIE1ha2Ugc3VyZSB0byBibG9jayBvbiBhY2NlcHQKICAgICBpZiAoc2VydmVyU29ja2V0XyAhPSBudWxsKSB7CiAgICAgICB0cnkgewogICAgICAgICBzZXJ2ZXJTb2NrZXRfLnNldFNvVGltZW91dCgwKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmphdmEKaW5kZXggYmM0NDIwOS4uYjIwYjMyYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmphdmEKQEAgLTQwLDI3ICs0MCwyNyBAQAogICAvKioKICAgICogV3JhcHBlZCBTb2NrZXQgb2JqZWN0CiAgICAqLwotICBwcml2YXRlIFNvY2tldCBzb2NrZXRfID0gbnVsbDsKKyAgcHJpdmF0ZSBTb2NrZXQgc29ja2V0XzsKIAogICAvKioKICAgICogUmVtb3RlIGhvc3QKICAgICovCi0gIHByaXZhdGUgU3RyaW5nIGhvc3RfICA9IG51bGw7CisgIHByaXZhdGUgU3RyaW5nIGhvc3RfOwogCiAgIC8qKgogICAgKiBSZW1vdGUgcG9ydAogICAgKi8KLSAgcHJpdmF0ZSBpbnQgcG9ydF8gPSAwOworICBwcml2YXRlIGludCBwb3J0XzsKIAogICAvKioKICAgICogU29ja2V0IHRpbWVvdXQgLSByZWFkIHRpbWVvdXQgb24gdGhlIHNvY2tldAogICAgKi8KLSAgcHJpdmF0ZSBpbnQgc29ja2V0VGltZW91dF8gPSAwOworICBwcml2YXRlIGludCBzb2NrZXRUaW1lb3V0XzsKIAogICAvKioKICAgICogQ29ubmVjdGlvbiB0aW1lb3V0CiAgICAqLwotICBwcml2YXRlIGludCBjb25uZWN0VGltZW91dF8gPSAwOworICBwcml2YXRlIGludCBjb25uZWN0VGltZW91dF87CiAKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYW4gYWxyZWFkeSBjcmVhdGVkIHNvY2tldC4KQEAgLTgwLDggKzgwLDggQEAKIAogICAgIGlmIChpc09wZW4oKSkgewogICAgICAgdHJ5IHsKLSAgICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpLCAxMDI0KTsKLSAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXRfLmdldE91dHB1dFN0cmVhbSgpLCAxMDI0KTsKKyAgICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXRfLmdldE91dHB1dFN0cmVhbSgpKTsKICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgICBjbG9zZSgpOwogICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBpb3gpOwpAQCAtMjA2LDExICsyMDYsMTEgQEAKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQUxSRUFEWV9PUEVOLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkLiIpOwogICAgIH0KIAotICAgIGlmIChob3N0Xy5sZW5ndGgoKSA9PSAwKSB7CisgICAgaWYgKGhvc3RfID09IG51bGwgfHwgaG9zdF8ubGVuZ3RoKCkgPT0gMCkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdC4iKTsKICAgICB9Ci0gICAgaWYgKHBvcnRfIDw9IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQuIik7CisgICAgaWYgKHBvcnRfIDw9IDAgfHwgcG9ydF8gPiA2NTUzNSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkludmFsaWQgcG9ydCAiICsgcG9ydF8pOwogICAgIH0KIAogICAgIGlmIChzb2NrZXRfID09IG51bGwpIHsKQEAgLTIxOSw4ICsyMTksOCBAQAogCiAgICAgdHJ5IHsKICAgICAgIHNvY2tldF8uY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoaG9zdF8sIHBvcnRfKSwgY29ubmVjdFRpbWVvdXRfKTsKLSAgICAgIGlucHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2tldF8uZ2V0SW5wdXRTdHJlYW0oKSwgMTAyNCk7Ci0gICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNvY2tldF8uZ2V0T3V0cHV0U3RyZWFtKCksIDEwMjQpOworICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29ja2V0Xy5nZXRPdXRwdXRTdHJlYW0oKSk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CiAgICAgICBjbG9zZSgpOwogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgaW94KTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKaW5kZXggZDA4ZjNiMC4uYjg4NmJjMiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxSRUFEWV9PUEVOID0gMjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRURfT1VUID0gMzsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EX09GX0ZJTEUgPSA0OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1JSVVBURURfREFUQSA9IDU7CiAKICAgcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuamF2YQppbmRleCBkZjRkZTEzLi5lNzU1YWE1IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5qYXZhCkBAIC03NCwxMSArNzQsMTEgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBzdXBlci5jbG9zZSgpOwogICAgICAgICBpZiAodHJhbnNwb3J0Xy5pc09wZW4oKSkgewogICAgICAgICAgICAgdHJhbnNwb3J0Xy5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQotCiB9CiAKIGNsYXNzIFRUcmFuc3BvcnRJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvRml4dHVyZXMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvRml4dHVyZXMuamF2YQppbmRleCA5ZjI4MTI0Li42MWY0MGE1IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L0ZpeHR1cmVzLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9GaXh0dXJlcy5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTI2Nyw3ICsyNjgsNyBAQAogICAgICAgb25lT2ZFYWNoLnNldEludGVnZXI2NCgobG9uZykgNjAwMCAqIDEwMDAgKiAxMDAwKTsKICAgICAgIG9uZU9mRWFjaC5zZXREb3VibGVfcHJlY2lzaW9uKE1hdGguUEkpOwogICAgICAgb25lT2ZFYWNoLnNldFNvbWVfY2hhcmFjdGVycygiSlNPTiBUSElTISBcIlwxIik7Ci0gICAgICBvbmVPZkVhY2guc2V0Wm9tZ191bmljb2RlKG5ldyBTdHJpbmcoa1VuaWNvZGVCeXRlcywgIlVURi04IikpOworICAgICAgb25lT2ZFYWNoLnNldFpvbWdfdW5pY29kZShuZXcgU3RyaW5nKGtVbmljb2RlQnl0ZXMsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKICAgICAgIG9uZU9mRWFjaC5zZXRCYXNlNjQoQnl0ZUJ1ZmZlci53cmFwKCJiYXNlNjQiLmdldEJ5dGVzKCkpKTsKICAgICAgIC8vIGJ5dGUsIGkxNiwgYW5kIGk2NCBsaXN0cyBhcmUgcG9wdWxhdGVkIGJ5IGRlZmF1bHQgY29uc3RydWN0b3IKIApAQCAtMjc3LDcgKzI3OCw3IEBACiAgICAgICBuZXN0aW5nID0gbmV3IE5lc3RpbmcoYm9uaywgb25lT2ZFYWNoKTsKIAogICAgICAgaG9seU1vbGV5ID0gbmV3IEhvbHlNb2xleSgpOwotICAgICAgQXJyYXlMaXN0IGJpZyA9IG5ldyBBcnJheUxpc3Q8T25lT2ZFYWNoPigpOworICAgICAgTGlzdDxPbmVPZkVhY2g+IGJpZyA9IG5ldyBBcnJheUxpc3Q8T25lT2ZFYWNoPigpOwogICAgICAgYmlnLmFkZChuZXcgT25lT2ZFYWNoKG9uZU9mRWFjaCkpOwogICAgICAgYmlnLmFkZChuZXN0aW5nLm15X29vZSk7CiAgICAgICBob2x5TW9sZXkuc2V0QmlnKGJpZyk7CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3REZWVwQ29weS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RGVlcENvcHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2FmYWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RGVlcENvcHkuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IHRocmlmdC50ZXN0LkRlZXBDb3B5QmFyOworaW1wb3J0IHRocmlmdC50ZXN0LkRlZXBDb3B5Rm9vOworCitwdWJsaWMgY2xhc3MgVGVzdERlZXBDb3B5IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyB2b2lkIHRlc3REZWVwQ29weSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIERlZXBDb3B5Rm9vIGZvbyA9IG5ldyBEZWVwQ29weUZvbygpOworCisgICAgZm9vLmFkZFRvTChuZXcgRGVlcENvcHlCYXIoKSk7CisgICAgZm9vLmFkZFRvUyhuZXcgRGVlcENvcHlCYXIoKSk7CisgICAgZm9vLnB1dFRvTSgidGVzdCAzIiwgbmV3IERlZXBDb3B5QmFyKCkpOworCisgICAgZm9vLmFkZFRvTGkobmV3IHRocmlmdC50ZXN0Lk9iamVjdCgpKTsKKyAgICBmb28uYWRkVG9TaShuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0KCkpOworICAgIGZvby5wdXRUb01pKCJ0ZXN0IDMiLCBuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0KCkpOworCisgICAgZm9vLnNldEJhcihuZXcgRGVlcENvcHlCYXIoKSk7CisKKyAgICBmaW5hbCBEZWVwQ29weUZvbyBkZWVwQ29weUZvbyA9IGZvby5kZWVwQ29weSgpOworCisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0QmFyKCksIGRlZXBDb3B5Rm9vLmdldEJhcigpKTsKKworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldEwoKS5nZXQoMCksICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQ29weUZvby5nZXRMKCkuZ2V0KDApKTsKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRTKCkudG9BcnJheShuZXcgRGVlcENvcHlCYXJbMF0pWzBdLCAgZGVlcENvcHlGb28uZ2V0UygpLnRvQXJyYXkobmV3IERlZXBDb3B5QmFyWzBdKVswXSk7CisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0TSgpLmdldCgidGVzdCAzIiksICAgICAgICAgICAgICAgICAgIGRlZXBDb3B5Rm9vLmdldE0oKS5nZXQoInRlc3QgMyIpKTsKKworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldExpKCkuZ2V0KDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBDb3B5Rm9vLmdldExpKCkuZ2V0KDApKTsKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRTaSgpLnRvQXJyYXkobmV3IHRocmlmdC50ZXN0Lk9iamVjdFswXSlbMF0sICBkZWVwQ29weUZvby5nZXRTaSgpLnRvQXJyYXkobmV3IHRocmlmdC50ZXN0Lk9iamVjdFswXSlbMF0pOworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldE1pKCkuZ2V0KCJ0ZXN0IDMiKSwgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBDb3B5Rm9vLmdldE1pKCkuZ2V0KCJ0ZXN0IDMiKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEVudW1Db250YWluZXJzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RFbnVtQ29udGFpbmVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MzI0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RFbnVtQ29udGFpbmVycy5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycy5FbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHM7CitpbXBvcnQgdGhyaWZ0LnRlc3QuZW51bWNvbnRhaW5lcnMuR29kQmVhbjsKK2ltcG9ydCB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycy5HcmVla0dvZEdvZGRlc3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworcHVibGljIGNsYXNzIFRlc3RFbnVtQ29udGFpbmVycyBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtQ29udGFpbmVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBHb2RCZWFuIGIxID0gbmV3IEdvZEJlYW4oKTsKKyAgICAgICAgYjEuYWRkVG9Hb2RkZXNzKEdyZWVrR29kR29kZGVzcy5IRVJBKTsKKyAgICAgICAgYjEuZ2V0R29kZGVzcygpLmFkZChHcmVla0dvZEdvZGRlc3MuQVBIUk9ESVRFKTsKKyAgICAgICAgYjEucHV0VG9Qb3dlcihHcmVla0dvZEdvZGRlc3MuWkVVUywgMTAwMCk7CisgICAgICAgIGIxLmdldFBvd2VyKCkucHV0KEdyZWVrR29kR29kZGVzcy5IRVJBLCAzMzMpOworICAgICAgICBiMS5wdXRUb0J5QWxpYXMoIk1yLiBaIiwgR3JlZWtHb2RHb2RkZXNzLlpFVVMpOworICAgICAgICBiMS5hZGRUb0ltYWdlcygiQmF0aHMgb2YgQXBocm9kaXRlIDAxLmpwZWciKTsKKworICAgICAgICBmaW5hbCBHb2RCZWFuIGIyID0gbmV3IEdvZEJlYW4oYjEpOworCisgICAgICAgIGZpbmFsIEdvZEJlYW4gYjMgPSBuZXcgR29kQmVhbigpOworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBUU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFRTZXJpYWxpemVyKCk7CisgICAgICAgICAgICBmaW5hbCBURGVzZXJpYWxpemVyIGRlc2VyaWFsaXplciA9IG5ldyBURGVzZXJpYWxpemVyKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGIxKTsKKyAgICAgICAgICAgIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShiMywgYnl0ZXMpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShiMS5nZXRHb2RkZXNzKCkgIT0gYjIuZ2V0R29kZGVzcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShiMS5nZXRQb3dlcigpICE9IGIyLmdldFBvd2VyKCkpOworCisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0R29kZGVzcygpICE9IGIzLmdldEdvZGRlc3MoKSk7CisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0UG93ZXIoKSAhPSBiMy5nZXRQb3dlcigpKTsKKworICAgICAgICBmb3IgKEdvZEJlYW4gZWFjaCA6IG5ldyBHb2RCZWFuW117YjEsIGIyLCBiM30pIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRHb2RkZXNzKCkuY29udGFpbnMoR3JlZWtHb2RHb2RkZXNzLkhFUkEpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGVhY2guZ2V0R29kZGVzcygpLmNvbnRhaW5zKEdyZWVrR29kR29kZGVzcy5QT1NFSURPTikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldEdvZGRlc3MoKSBpbnN0YW5jZW9mIEVudW1TZXQpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwMDApLCBlYWNoLmdldFBvd2VyKCkuZ2V0KEdyZWVrR29kR29kZGVzcy5aRVVTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDMzMyksIGVhY2guZ2V0UG93ZXIoKS5nZXQoR3JlZWtHb2RHb2RkZXNzLkhFUkEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRQb3dlcigpIGluc3RhbmNlb2YgRW51bU1hcCk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRCeUFsaWFzKCkgaW5zdGFuY2VvZiBIYXNoTWFwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRJbWFnZXMoKSBpbnN0YW5jZW9mIEhhc2hTZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVudW1Db25zdGFudHMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygibGlnaHRuaW5nIGJvbHQiLCBFbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHMuQVRUUklCVVRFUy5nZXQoR3JlZWtHb2RHb2RkZXNzLlpFVVMpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShFbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHMuQVRUUklCVVRFUyBpbnN0YW5jZW9mIEVudW1NYXApOworCisgICAgICAgIGFzc2VydFRydWUoRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzLkJFQVVUWS5jb250YWlucyhHcmVla0dvZEdvZGRlc3MuQVBIUk9ESVRFKSk7CisgICAgICAgIGFzc2VydFRydWUoRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzLkJFQVVUWSBpbnN0YW5jZW9mIEVudW1TZXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEZ1bGxDYW1lbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RnVsbENhbWVsLmphdmEKaW5kZXggMTY4MWZiOC4uZmM5ODg5OCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RnVsbENhbWVsLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RnVsbENhbWVsLmphdmEKQEAgLTI2LDggKzI2LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGU7CiAKLWltcG9ydCB0aHJpZnQudGVzdC5PbmVPZkVhY2haWjsKLWltcG9ydCB0aHJpZnQudGVzdC5VbmRlcnNjb3JlU3J2OworaW1wb3J0IHRocmlmdC50ZXN0LmZ1bGxjYW1lbC5PbmVPZkVhY2haWjsKK2ltcG9ydCB0aHJpZnQudGVzdC5mdWxsY2FtZWwuVW5kZXJzY29yZVNydjsKIAogLy8gU2FuaXR5IGNoZWNrIGZvciB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgJ2Z1bGxjYW1lbCcuCiAvLwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0TXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVlNzk2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgcHJpdmF0ZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgbXA7CisgIHByaXZhdGUgVFByb3RvY29sIGlwcm90OworICBwcml2YXRlIFRQcm90b2NvbCBvcHJvdDsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgaXByb3QgPSBtb2NrKFRQcm90b2NvbC5jbGFzcyk7CisgICAgb3Byb3QgPSBtb2NrKFRQcm90b2NvbC5jbGFzcyk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IFRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ01lc3NhZ2VUeXBlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4gKGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSkudGhlblJldHVybihuZXcgVE1lc3NhZ2UoInNlcnZpY2U6ZnVuYyIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgNDIpKTsKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IFRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hTZXJ2aWNlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4oaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpKS50aGVuUmV0dXJuKG5ldyBUTWVzc2FnZSgic2VydmljZTpmdW5jIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDQyKSk7CisKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgIH0KKworICBzdGF0aWMgY2xhc3MgU3R1YlByb2Nlc3NvciBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoVFByb3RvY29sIGluLCBUUHJvdG9jb2wgb3V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBUTWVzc2FnZSBtc2cgPSBpbi5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICBpZiAoISJmdW5jIi5lcXVhbHMobXNnLm5hbWUpIHx8IG1zZy50eXBlIT1UTWVzc2FnZVR5cGUuQ0FMTCB8fCBtc2cuc2VxaWQhPTQyKSB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJpbmNvcnJlY3QgcGFyYW1ldGVycyIpOworICAgICAgfQorICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZSgiZnVuYyIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgNDIpKTsKKyAgICB9CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0RXhpc3RpbmdTZXJ2aWNlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4oaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpKS50aGVuUmV0dXJuKG5ldyBUTWVzc2FnZSgic2VydmljZTpmdW5jIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDQyKSk7CisgICAgbXAucmVnaXN0ZXJQcm9jZXNzb3IoInNlcnZpY2UiLCBuZXcgU3R1YlByb2Nlc3NvcigpKTsKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgICAgdmVyaWZ5KG9wcm90KS53cml0ZU1lc3NhZ2VCZWdpbihhbnkoVE1lc3NhZ2UuY2xhc3MpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U2VydmljZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3aGVuKGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSkudGhlblJldHVybihuZXcgVE1lc3NhZ2UoImZ1bmMiLCBUTWVzc2FnZVR5cGUuQ0FMTCwgNDIpKTsKKyAgICBtcC5yZWdpc3RlckRlZmF1bHQobmV3IFN0dWJQcm9jZXNzb3IoKSk7CisgICAgbXAucHJvY2VzcyhpcHJvdCwgb3Byb3QpOworICAgIHZlcmlmeShvcHJvdCkud3JpdGVNZXNzYWdlQmVnaW4oYW55KFRNZXNzYWdlLmNsYXNzKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5MWZlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHRocmlmdC50ZXN0LkRvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHM7CisKK3B1YmxpYyBjbGFzcyBUZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIEVQU0lMT04gPSAwLjAwMDAwMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgPQorICAgICAgICAiZmFpbGVkIHRvIHZlcmlmeSBhIGRvdWJsZSBjb25zdGFudCBnZW5lcmF0ZWQgYnkgVGhyaWZ0IChleHBlY3RlZCA9ICVmLCBnb3QgPSAlZikiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0xJU1RfVEVTVCA9CisgICAgICAgICJmYWlsZWQgdG8gdmVyaWZ5IGEgbGlzdCBpdGVtIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTID0KKyAgICAgICAgInRoZSByZW5kZXJlZCB2YXJpYWJsZSB3aXRoIG5hbWUgJXMgaXMgbm90IG9mIGRvdWJsZSB0eXBlIjsKKworICAgIC8vIHRvIG1ha2Ugc3VyZSBsaXN0cyBjb250YWluaW5nIGRvdWJsZXMgYXJlIGdlbmVyYXRlZCBjb3JyZWN0bHkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGVyZWREb3VibGVMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGRvdWJsZVtdIEVYUEVDVEVEX0xJU1QgPQorICAgICAgICAgICAgezFkLC0xMDBkLDEwMGQsOTIyMzM3MjAzNjg1NDc3NTgwN2QsLTkyMjMzNzIwMzY4NTQ3NzU4MDdkLDMuMTQxNTkyNjUzNTksMTAwMDAwMC4xLC0xMDAwMDAwLjEsMS43ZSszMDgsCisgICAgICAgICAgICAgLTEuN2UrMzA4LDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDN9OworICAgICAgICBhc3NlcnRFcXVhbHMoRVhQRUNURURfTElTVC5sZW5ndGgsIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVC5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVYUEVDVEVEX0xJU1QubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0xJU1RfVEVTVCwKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNURURfTElTVFtpXSwKKyAgICAgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfTElTVF9URVNULmdldChpKSksCisgICAgICAgICAgICAgICAgRVhQRUNURURfTElTVFtpXSwgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfTElTVF9URVNULmdldChpKSwgRVBTSUxPTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0byBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBpbnNpZGUgVGhyaWZ0IGZpbGVzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5CisgICAgcHVibGljIHZvaWQgdGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UID0gMS4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCA9IC0xMDAuMDsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNy4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgPSAzLjE0MTU5MjY1MzU5OworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTEwMDAwMDAuMTsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgPSAxLjdlKzMwODsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFID0gLTEuN2UrMzA4OworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgLy9hc3NlcnRUcnVlKAorICAgICAgICAvLyAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCIpLAorICAgICAgICAvLyAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpOworICAgICAgICAvL2Fzc2VydFRydWUoCisgICAgICAgIC8vICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUIiksCisgICAgICAgIC8vICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZXVzZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmV1c2UuamF2YQppbmRleCBkYjE2Yzc0Li5iNDRhYmQwIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZXVzZS5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJldXNlLmphdmEKQEAgLTIxLDEwICsyMSw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKIAogaW1wb3J0IHRocmlmdC50ZXN0LlJldXNlOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTaG9ydFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ODMxZTUuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U2hvcnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U2hvcnRTdGFjayBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9UUklBTFMgPSA1OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1JFUFMgPSAxMDAwMDAwMDsKLQotICBwdWJsaWMgdm9pZCB0ZXN0T3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMTApOwotICAgIHMucHVzaCgoc2hvcnQpMTApOwotICAgIHMucHVzaCgoc2hvcnQpMTEpOwotICAgIHMucHVzaCgoc2hvcnQpMTIpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTIsIHMucGVlaygpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEyLCBzLnBlZWsoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMiwgcy5wb3AoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMSwgcy5wb3AoKSk7Ci0gICAgcy5wdXNoKChzaG9ydCk0MCk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCk0MCwgcy5wZWVrKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpNDAsIHMucG9wKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTAsIHMucGVlaygpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEwLCBzLnBvcCgpKTsKLSAgICB0cnkgewotICAgICAgcy5wZWVrKCk7Ci0gICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyB5YXkKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgcy5wb3AoKTsKLSAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHlheQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHcm93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZm9yIChpbnQgdHJpYWwgPSAwOyB0cmlhbCA8IE5VTV9UUklBTFM7IHRyaWFsKyspIHsKLSAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIFNob3J0U3RhY2sgcyA9IG5ldyBTaG9ydFN0YWNrKDEwKTsKLSAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IE5VTV9SRVBTOyByZXArKykgewotICAgICAgICBzLnB1c2goKHNob3J0KTEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTExKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMTEpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMjEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyMTEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyMTExKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCk1KTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgIH0KLSAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNob3J0U3RhY2s6ICIgKyAoZW5kLXN0YXJ0KSk7Ci0KLSAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTdGFjazxTaG9ydD4gc3RkU3RhY2sgPSBuZXcgU3RhY2s8U2hvcnQ+KCk7Ci0gICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCBOVU1fUkVQUzsgcmVwKyspIHsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTExKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTExKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMik7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyMTEpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMjExMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCk1KTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgfQotICAgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWx0LWluIHN0YWNrOiAiICsgKGVuZC1zdGFydCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U3RydWN0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YQppbmRleCBiMGRmZmM4Li4zMzc5ZWQxIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YQpAQCAtMzA4LDEyICszMDgsNDAgQEAKICAgICAgICAgb2JqZWN0LnRvU3RyaW5nKCkpOwogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheUVxdWFscyhieXRlW10gZXhwZWN0ZWQsIGJ5dGVbXSBhY3R1YWwpIHsKKyAgICBpZiAoIWphdmEudXRpbC5BcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7CisgICAgICBmYWlsKCJFeHBlY3RlZCBieXRlIGFycmF5IGRpZCBub3QgbWF0Y2ggYWN0dWFsLiIpOworICAgIH0KKyAgfQorCiAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlc0J1ZmZlckZlYXR1cmVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgSmF2YVRlc3RIZWxwZXIgbyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOworICAgIAorICAgIGZpbmFsIFN0cmluZyB0ZXN0U3RyaW5nID0gInRlc3RCeXRlc0J1ZmZlckZlYXR1cmVzIjsKKyAgICBmaW5hbCBKYXZhVGVzdEhlbHBlciBvID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CisKICAgICBvLnNldFJlcV9iaW4oKEJ5dGVCdWZmZXIpbnVsbCk7CiAgICAgYXNzZXJ0TnVsbChvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldFJlcV9iaW4oQnl0ZUJ1ZmZlci53cmFwKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSkpOworICAgIGFzc2VydEFycmF5RXF1YWxzKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSwgby5nZXRSZXFfYmluKCkpOworCiAgICAgby5zZXRSZXFfYmluKChieXRlW10pbnVsbCk7CiAgICAgYXNzZXJ0TnVsbChvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldFJlcV9iaW4odGVzdFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICBhc3NlcnRBcnJheUVxdWFscyh0ZXN0U3RyaW5nLmdldEJ5dGVzKCksIG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0RmllbGRWYWx1ZShKYXZhVGVzdEhlbHBlci5fRmllbGRzLlJFUV9CSU4sIG51bGwpOworICAgIGFzc2VydE51bGwoby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRGaWVsZFZhbHVlKEphdmFUZXN0SGVscGVyLl9GaWVsZHMuUkVRX0JJTiwgdGVzdFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICBhc3NlcnRBcnJheUVxdWFscyh0ZXN0U3RyaW5nLmdldEJ5dGVzKCksIG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0RmllbGRWYWx1ZShKYXZhVGVzdEhlbHBlci5fRmllbGRzLlJFUV9CSU4sIG51bGwpOworICAgIGFzc2VydE51bGwoby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRGaWVsZFZhbHVlKEphdmFUZXN0SGVscGVyLl9GaWVsZHMuUkVRX0JJTiwgQnl0ZUJ1ZmZlci53cmFwKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSkpOworICAgIGFzc2VydEFycmF5RXF1YWxzKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSwgby5nZXRSZXFfYmluKCkpOwogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdEphdmFTZXJpYWxpemFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFVuc2FmZUJpbmFyaWVzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RVbnNhZmVCaW5hcmllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZmMyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RVbnNhZmVCaW5hcmllcy5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5TYWZlQnl0ZXM7CitpbXBvcnQgdGhyaWZ0LnRlc3QuVW5zYWZlQnl0ZXM7CisKKy8vICB0ZXN0IGdlbmVyYXRpbmcgdHlwZXMgd2l0aCB1bi1jb3BpZWQgYnl0ZVtdL0J5dGVCdWZmZXIgaW5wdXQvb3V0cHV0CisvLworcHVibGljIGNsYXNzIFRlc3RVbnNhZmVCaW5hcmllcyBleHRlbmRzIFRlc3RTdHJ1Y3QgeworCisgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBpbnB1dCgpIHsKKyAgICByZXR1cm4gbmV3IGJ5dGVbXXsxLCAxfTsKKyAgfQorCisgIC8vCisgIC8vICB2ZXJpZnkgdGhhdCB0aGUgdW5zYWZlX2JpbmFyaWVzIG9wdGlvbiBtb2RpZmllcyBiZWhhdmlvcgorICAvLworCisgIC8vICBjb25zdHJ1Y3RvciBkb2Vzbid0IGNvcHkKKyAgcHVibGljIHZvaWQgdGVzdFVuc2FmZUNvbnN0cnVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBieXRlW10gaW5wdXQgPSBpbnB1dCgpOworICAgIFVuc2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBVbnNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQpKTsKKworICAgIGlucHV0WzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8gIGdldHRlciBkb2Vzbid0IGNvcHkKKyAgLy8gIG5vdGU6IHRoaXMgYmVoYXZpb3IgaXMgdGhlIHNhbWUgd2l0aC93aXRob3V0IHRoZSBmbGFnLCBidXQgaWYgdGhpcyBkZWZhdWx0IGV2ZXIgY2hhbmdlcywgdGhlIGN1cnJlbnQgYmVoYXZpb3IKKyAgLy8gICAgICAgIHNob3VsZCBiZSByZXRhaW5lZCB3aGVuIHVzaW5nIHRoaXMgZmxhZworICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlR2V0dGVyKCl7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCgpKSk7CisKKyAgICBieXRlW10gdmFsID0gc3RydWN0LmdldEJ5dGVzKCk7CisgICAgdmFsWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8gIHNldHRlciBkb2Vzbid0IGNvcHkKKyAgcHVibGljIHZvaWQgdGVzdFVuc2FmZVNldHRlcigpeworICAgIFVuc2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBVbnNhZmVCeXRlcygpOworCisgICAgYnl0ZVtdIHZhbCA9IGlucHV0KCk7CisgICAgc3RydWN0LnNldEJ5dGVzKHZhbCk7CisKKyAgICB2YWxbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezIsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICAvLyAgYnVmZmVyIGRvZW5zJ3QgY29weQorICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlQnVmZmVyRm9yKCl7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCgpKSk7CisKKyAgICBCeXRlQnVmZmVyIHZhbCA9IHN0cnVjdC5idWZmZXJGb3JCeXRlcygpOworICAgIHZhbC5hcnJheSgpWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8KKyAgLy8gIHZlcmlmeSB0aGF0IHRoZSBkZWZhdWx0IGdlbmVyYXRvciBkb2VzIG5vdCBjaGFuZ2UgYmVoYXZpb3IKKyAgLy8KKworICBwdWJsaWMgdm9pZCB0ZXN0U2FmZUNvbnN0cnVjdG9yKCkgeworCisgICAgYnl0ZVtdIGlucHV0ID0gaW5wdXQoKTsKKyAgICBTYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQpKTsKKworICAgIGlucHV0WzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsxLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNhZmVTZXR0ZXIoKSB7CisKKyAgICBieXRlW10gaW5wdXQgPSBpbnB1dCgpOworICAgIFNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgU2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCkpOworCisgICAgaW5wdXRbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezEsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2FmZUJ1ZmZlckZvcigpeworICAgIFNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgU2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCgpKSk7CisKKyAgICBCeXRlQnVmZmVyIHZhbCA9IHN0cnVjdC5idWZmZXJGb3JCeXRlcygpOworICAgIHZhbC5hcnJheSgpWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsxLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudE1hbmFnZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudE1hbmFnZXIuamF2YQppbmRleCAxMmQwZWFmLi5jNDgzY2YyIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1Rlc3RUQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UZXN0VEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCkBAIC0yMiwxMSArMjIsMTMgQEAKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCkBAIC0zOSwxMiArNDEsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTb2NrZXQ7CiAKIGltcG9ydCB0aHJpZnQudGVzdC5Db21wYWN0UHJvdG9UZXN0U3RydWN0OworaW1wb3J0IHRocmlmdC50ZXN0LkV4Y2VwdGlvbldpdGhBTWFwOwogaW1wb3J0IHRocmlmdC50ZXN0LlNydjsKIGltcG9ydCB0aHJpZnQudGVzdC5TcnYuSWZhY2U7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuU3J2LkFzeW5jQ2xpZW50Lkphbmt5X2NhbGw7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuU3J2LkFzeW5jQ2xpZW50Lm9uZXdheU1ldGhvZF9jYWxsOwotaW1wb3J0IHRocmlmdC50ZXN0LlNydi5Bc3luY0NsaWVudC5wcmltaXRpdmVNZXRob2RfY2FsbDsKLWltcG9ydCB0aHJpZnQudGVzdC5TcnYuQXN5bmNDbGllbnQudm9pZE1ldGhvZF9jYWxsOwogCiBwdWJsaWMgY2xhc3MgVGVzdFRBc3luY0NsaWVudE1hbmFnZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKQEAgLTgzLDUzICs4MiwxMTMgQEAKICAgICBiYXNpY0NhbGwoY2xpZW50KTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHRlc3RUaW1lb3V0Q2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotICAgIFNydi5Bc3luY0NsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoKTsKLSAgICBjbGllbnQuc2V0VGltZW91dCgxMDApOwotICAgIGNsaWVudC5wcmltaXRpdmVNZXRob2QobmV3IEFzeW5jTWV0aG9kQ2FsbGJhY2s8cHJpbWl0aXZlTWV0aG9kX2NhbGw+KCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBUaW1lb3V0RXhjZXB0aW9uKSkgewotICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHNpbmsgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzaW5rLCB0cnVlKSk7Ci0gICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBUaW1lb3V0RXhjZXB0aW9uIGJ1dCBnb3QgIiArIHNpbmsudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgeworICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFcnJvckNhbGxUZXN0PEMgZXh0ZW5kcyBUQXN5bmNDbGllbnQsIFI+IHsKKyAgICBmaW5hbCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPEV4Y2VwdGlvbj4gZXJyb3IgPSBuZXcgQXRvbWljUmVmZXJlbmNlPEV4Y2VwdGlvbj4oKTsKKyAgICAgIEMgY2xpZW50ID0gZXhlY3V0ZUVycm9yaW5nQ2FsbChuZXcgQXN5bmNNZXRob2RDYWxsYmFjazxSPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoUiByZXNwb25zZSkgewogICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgIGVycm9yLnNldChleGNlcHRpb24pOworICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGxhdGNoLmF3YWl0KDIsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgYXNzZXJ0VHJ1ZShjbGllbnQuaGFzRXJyb3IoKSk7CisgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gZXJyb3IuZ2V0KCk7CisgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7CisgICAgICBhc3NlcnRTYW1lKGV4Y2VwdGlvbiwgY2xpZW50LmdldEVycm9yKCkpOworICAgICAgdmFsaWRhdGVFcnJvcihjbGllbnQsIGV4Y2VwdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgYSBjYWxsIHRoYXQgaXMgZXhwZWN0ZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSB0ZXN0aW5nIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIGluc3RhbGxlZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBjbGllbnQgdGhlIGNhbGwgd2FzIG1hZGUgYWdhaW5zdC4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHNldHRpbmcgdXAgdGhlIGNsaWVudCBvciBtYWtpbmcgdGhlIGNhbGwuCisgICAgICovCisgICAgYWJzdHJhY3QgQyBleGVjdXRlRXJyb3JpbmdDYWxsKEFzeW5jTWV0aG9kQ2FsbGJhY2s8Uj4gY2FsbGJhY2spIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBGdXJ0aGVyIHZhbGlkYXRlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgZXJyb3IgcmFpc2VkIGluIHRoZSByZW1vdGUgY2FsbCBhbmQgdGhlIHN0YXRlIG9mIHRoZQorICAgICAqIGNsaWVudCBhZnRlciB0aGF0IGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50IFRoZSBjbGllbnQgcmV0dXJuZWQgZnJvbSB7QGxpbmsgI2V4ZWN1dGVFcnJvcmluZ0NhbGwoQXN5bmNNZXRob2RDYWxsYmFjayl9LgorICAgICAqIEBwYXJhbSBlcnJvciBUaGUgZXhjZXB0aW9uIHJhaXNlZCBieSB0aGUgcmVtb3RlIGNhbGwuCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCB2YWxpZGF0ZUVycm9yKEMgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuZXhwZWN0ZWRSZW1vdGVFeGNlcHRpb25DYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbmV3IEVycm9yQ2FsbFRlc3Q8U3J2LkFzeW5jQ2xpZW50LCBCb29sZWFuPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgU3J2LkFzeW5jQ2xpZW50IGV4ZWN1dGVFcnJvcmluZ0NhbGwoQXN5bmNNZXRob2RDYWxsYmFjazxCb29sZWFuPiBjYWxsYmFjaykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNydi5Bc3luY0NsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoKTsKKyAgICAgICAgY2xpZW50LmRlY2xhcmVkRXhjZXB0aW9uTWV0aG9kKGZhbHNlLCBjYWxsYmFjayk7CisgICAgICAgIHJldHVybiBjbGllbnQ7CiAgICAgICB9CiAKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShwcmltaXRpdmVNZXRob2RfY2FsbCByZXNwb25zZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgaGF2ZSBmaW5pc2hlZCB0aW1lZCBvdXQgY2FsbC4iKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgfQorICAgICAgdm9pZCB2YWxpZGF0ZUVycm9yKFNydi5Bc3luY0NsaWVudCBjbGllbnQsIEV4Y2VwdGlvbiBlcnJvcikgeworICAgICAgICBhc3NlcnRGYWxzZShjbGllbnQuaGFzVGltZW91dCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlcnJvciBpbnN0YW5jZW9mIFRFeGNlcHRpb24pOwogICAgICAgfQotICAgIH0pOwotICAgIGxhdGNoLmF3YWl0KDIsIFRpbWVVbml0LlNFQ09ORFMpOwotICAgIGFzc2VydFRydWUoY2xpZW50Lmhhc0Vycm9yKCkpOwotICAgIGFzc2VydFRydWUoY2xpZW50LmdldEVycm9yKCkgaW5zdGFuY2VvZiBUaW1lb3V0RXhjZXB0aW9uKTsKKyAgICB9LnJ1blRlc3QoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REZWNsYXJlZFJlbW90ZUV4Y2VwdGlvbkNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBuZXcgRXJyb3JDYWxsVGVzdDxTcnYuQXN5bmNDbGllbnQsIEJvb2xlYW4+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBTcnYuQXN5bmNDbGllbnQgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPEJvb2xlYW4+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICBjbGllbnQuZGVjbGFyZWRFeGNlcHRpb25NZXRob2QodHJ1ZSwgY2FsbGJhY2spOworICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHZvaWQgdmFsaWRhdGVFcnJvcihTcnYuQXN5bmNDbGllbnQgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc1RpbWVvdXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFeGNlcHRpb25XaXRoQU1hcC5jbGFzcywgZXJyb3IuZ2V0Q2xhc3MoKSk7CisgICAgICAgIEV4Y2VwdGlvbldpdGhBTWFwIGV4Y2VwdGlvbldpdGhBTWFwID0gKEV4Y2VwdGlvbldpdGhBTWFwKSBlcnJvcjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJibGFoIiwgZXhjZXB0aW9uV2l0aEFNYXAuZ2V0QmxhaCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpLCBleGNlcHRpb25XaXRoQU1hcC5nZXRNYXBfZmllbGQoKSk7CisgICAgICB9CisgICAgfS5ydW5UZXN0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VGltZW91dENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBuZXcgRXJyb3JDYWxsVGVzdDxTcnYuQXN5bmNDbGllbnQsIEludGVnZXI+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBTcnYuQXN5bmNDbGllbnQgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPEludGVnZXI+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICBjbGllbnQuc2V0VGltZW91dCgxMDApOworICAgICAgICBjbGllbnQucHJpbWl0aXZlTWV0aG9kKGNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICB2b2lkIHZhbGlkYXRlRXJyb3IoU3J2LkFzeW5jQ2xpZW50IGNsaWVudCwgRXhjZXB0aW9uIGVycm9yKSB7CisgICAgICAgIGFzc2VydFRydWUoY2xpZW50Lmhhc1RpbWVvdXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoZXJyb3IgaW5zdGFuY2VvZiBUaW1lb3V0RXhjZXB0aW9uKTsKKyAgICAgIH0KKyAgICB9LnJ1blRlc3QoKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkQ2FsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwogICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gcmV0dXJuZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOwotICAgIGNsaWVudC52b2lkTWV0aG9kKG5ldyBGYWlsdXJlTGVzc0NhbGxiYWNrPFNydi5Bc3luY0NsaWVudC52b2lkTWV0aG9kX2NhbGw+KCkgeworICAgIGNsaWVudC52b2lkTWV0aG9kKG5ldyBGYWlsdXJlTGVzc0NhbGxiYWNrPFZvaWQ+KCkgewogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKHZvaWRNZXRob2RfY2FsbCByZXNwb25zZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgIHJlc3BvbnNlLmdldFJlc3VsdCgpOwotICAgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgZmFpbChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgfQorICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShWb2lkIHJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKKyAgICAgICAgbGF0Y2guY291bnREb3duKCk7CiAgICAgICB9CiAgICAgfSk7CiAgICAgbGF0Y2guYXdhaXQoMSwgVGltZVVuaXQuU0VDT05EUyk7CkBAIC0xNDAsMTcgKzE5OSwxMSBAQAogICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwogICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gcmV0dXJuZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOwotICAgIGNsaWVudC5vbmV3YXlNZXRob2QobmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8b25ld2F5TWV0aG9kX2NhbGw+KCkgeworICAgIGNsaWVudC5vbmV3YXlNZXRob2QobmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8Vm9pZD4oKSB7CiAgICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUob25ld2F5TWV0aG9kX2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICByZXNwb25zZS5nZXRSZXN1bHQoKTsKLSAgICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgIGZhaWwoZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgIH0KKyAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoVm9pZCByZXNwb25zZSkgeworICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7CisgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwogICAgICAgfQogICAgIH0pOwogICAgIGxhdGNoLmF3YWl0KDEsIFRpbWVVbml0LlNFQ09ORFMpOwpAQCAtMTg4LDE3ICsyNDEsMTIgQEAKICAgcHJpdmF0ZSB2b2lkIGJhc2ljQ2FsbChTcnYuQXN5bmNDbGllbnQgY2xpZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKICAgICBmaW5hbCBBdG9taWNCb29sZWFuIHJldHVybmVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwotICAgIGNsaWVudC5KYW5reSgxLCBuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxTcnYuQXN5bmNDbGllbnQuSmFua3lfY2FsbD4oKSB7CisgICAgY2xpZW50Lkphbmt5KDEsIG5ldyBGYWlsdXJlTGVzc0NhbGxiYWNrPEludGVnZXI+KCkgewogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEphbmt5X2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzcG9uc2UuZ2V0UmVzdWx0KCkpOwotICAgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgZmFpbChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgfQorICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShJbnRlZ2VyIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydEVxdWFscygzLCByZXNwb25zZS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOworICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKICAgICAgIH0KIAogICAgICAgQE92ZXJyaWRlCkBAIC0yNTAsOSArMjk4LDE4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25ld2F5TWV0aG9kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGRlY2xhcmVkRXhjZXB0aW9uTWV0aG9kKGJvb2xlYW4gc2hvdWxkVGhyb3dEZWNsYXJlZCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKHNob3VsZFRocm93RGVjbGFyZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbldpdGhBTWFwKCJibGFoIiwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQhIik7CisgICAgICB9CisgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRmFpbHVyZUxlc3NDYWxsYmFjazxUIGV4dGVuZHMgVEFzeW5jTWV0aG9kQ2FsbD4gaW1wbGVtZW50cyBBc3luY01ldGhvZENhbGxiYWNrPFQ+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRmFpbHVyZUxlc3NDYWxsYmFjazxUPiBpbXBsZW1lbnRzIEFzeW5jTWV0aG9kQ2FsbGJhY2s8VD4gewogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewogICAgICAgZmFpbChleGNlcHRpb24pOwpAQCAtMjg3LDE4ICszNDQsMTMgQEAKICAgICAgICAgICAvLyBjb25uZWN0IGFuIGFzeW5jIGNsaWVudAogICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwogICAgICAgICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gcmV0dXJuZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7Ci0gICAgICAgICAgY2xpZW50Xy5KYW5reSgxLCBuZXcgQXN5bmNNZXRob2RDYWxsYmFjazxTcnYuQXN5bmNDbGllbnQuSmFua3lfY2FsbD4oKSB7CisgICAgICAgICAgY2xpZW50Xy5KYW5reSgxLCBuZXcgQXN5bmNNZXRob2RDYWxsYmFjazxJbnRlZ2VyPigpIHsKIAogICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEphbmt5X2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzcG9uc2UuZ2V0UmVzdWx0KCkpOwotICAgICAgICAgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKLSAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgICAgICAgICAgZmFpbChlKTsKLSAgICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShJbnRlZ2VyIHJlc3VsdCkgeworICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzdWx0LmludFZhbHVlKCkpOworICAgICAgICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7CisgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTMyMyw0ICszNzUsNCBAQAogICAgICAgfQogICAgIH0KICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvUHJvdG9jb2xUZXN0QmFzZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKaW5kZXggMmFjMDIxMS4uMDM4NmQ4MyAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKQEAgLTMyNyw2ICszMjcsMTEgQEAKICAgICAgIEBPdmVycmlkZQogICAgICAgcHVibGljIHZvaWQgb25ld2F5TWV0aG9kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIGRlY2xhcmVkRXhjZXB0aW9uTWV0aG9kKGJvb2xlYW4gc2hvdWxkVGhyb3cpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNob3VsZFRocm93OworICAgICAgfQogICAgIH07CiAKICAgICBTcnYuUHJvY2Vzc29yIHRlc3RQcm9jZXNzb3IgPSBuZXcgU3J2LlByb2Nlc3NvcihoYW5kbGVyKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFNob3J0U3RhY2suamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFNob3J0U3RhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGU3OGVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0U2hvcnRTdGFjay5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0U2hvcnRTdGFjayBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0T3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMSk7CisgICAgcy5wdXNoKChzaG9ydCkxMCk7CisgICAgcy5wdXNoKChzaG9ydCkxMSk7CisgICAgcy5wdXNoKChzaG9ydCkxMik7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMiwgcy5wb3AoKSk7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMSwgcy5wb3AoKSk7CisgICAgcy5wdXNoKChzaG9ydCk0MCk7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCk0MCwgcy5wb3AoKSk7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMCwgcy5wb3AoKSk7CisgICAgdHJ5IHsKKyAgICAgIHMucG9wKCk7CisgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyB5YXkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wuamF2YQppbmRleCBkNzM3NmFjLi5jMmNhMWZhIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5qYXZhCkBAIC0xOCw2ICsxOCwxMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOworCiBwdWJsaWMgY2xhc3MgVGVzdFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBQcm90b2NvbFRlc3RCYXNlIHsKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGdldEZhY3RvcnkoKSB7CkBAIC0yOCw0ICszNCwxNSBAQAogICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5CZVVzZWROYWtlZCgpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlZFVuaWNvZGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGpzb25TdHJpbmcgPSAiXCJoZWxsbyB1bmljb2RlIFxcdTBlMDFcXHVkODM0XFx1ZGQxZSB3b3JsZFwiIjsKKyAgICBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcgPSAiaGVsbG8gdW5pY29kZSBcdTBlMDFcdWQ4MzRcdWRkMWUgd29ybGQiOworCisgICAgVE1lbW9yeUJ1ZmZlciBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcigxMDAwKTsKKyAgICBUSlNPTlByb3RvY29sIHByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKTsKKyAgICBidWZmZXIud3JpdGUoanNvblN0cmluZy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHByb3RvY29sLnJlYWRTdHJpbmcoKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRQcm90b2NvbFV0aWwuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRQcm90b2NvbFV0aWwuamF2YQppbmRleCAxOTljNzA3Li44OWNmNTM2IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUUHJvdG9jb2xVdGlsLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFByb3RvY29sVXRpbC5qYXZhCkBAIC0xOCwyNCArMTgsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkZpeHR1cmVzOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlREZXNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcjsKIAotaW1wb3J0IHRocmlmdC50ZXN0LkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuSG9seU1vbGV5OwotaW1wb3J0IHRocmlmdC50ZXN0Lk5lc3Rpbmc7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuT25lT2ZFYWNoOwotaW1wb3J0IHRocmlmdC50ZXN0LlNydjsKIGltcG9ydCB0aHJpZnQudGVzdC5HdWVzc1Byb3RvY29sU3RydWN0OwogCiBwdWJsaWMgY2xhc3MgVGVzdFRQcm90b2NvbFV0aWwgZXh0ZW5kcyBUZXN0Q2FzZSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUU2ltcGxlSlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUU2ltcGxlSlNPTlByb3RvY29sLmphdmEKaW5kZXggM2JiNmE5ZS4uOWQxMjViMSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIApAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOwogCiBpbXBvcnQgdGhyaWZ0LnRlc3QuQ29tcGFjdFByb3RvVGVzdFN0cnVjdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5Ib2x5TW9sZXk7CiAKIHB1YmxpYyBjbGFzcyBUZXN0VFNpbXBsZUpTT05Qcm90b2NvbCBleHRlbmRzIFRlc3RDYXNlIHsKICAgcHJpdmF0ZSBUTWVtb3J5QnVmZmVyIGJ1ZjsKQEAgLTM5LDE2ICs0MCwxNiBAQAogICB9CiAKICAgcHJpdmF0ZSBTdHJpbmcgYnVmVG9TdHJpbmcoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBidWYudG9TdHJpbmcoIlVURi04Iik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICB9CisgICAgcmV0dXJuIGJ1Zi50b1N0cmluZyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RIb2x5TW9sZXkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgRml4dHVyZXMuaG9seU1vbGV5LndyaXRlKHByb3RvKTsKLSAgICBhc3NlcnRFcXVhbHMoIntcImJpZ1wiOlt7XCJpbV90cnVlXCI6MSxcImltX2ZhbHNlXCI6MCxcImFfYml0ZVwiOjM1LFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119LHtcImltX3RydWVcIjoxLFwiaW1fZmFsc2VcIjowLFwiYV9iaXRlXCI6LTQyLFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119XSxcImNvbnRhaW5cIjpbW10sW1widGhlbiBhIG9uZSwgdHdvXCIsXCJ0aHJlZSFcIixcIkZPVVIhIVwiXSxbXCJhbmQgYSBvbmVcIixcImFuZCBhIHR3b1wiXV0sXCJib25rc1wiOntcInR3b1wiOlt7XCJ0eXBlXCI6MSxcIm1lc3NhZ2VcIjpcIldhaXQuXCJ9LHtcInR5cGVcIjoyLFwibWVzc2FnZVwiOlwiV2hhdD9cIn1dLFwidGhyZWVcIjpbXSxcInplcm9cIjpbXX19IiwgYnVmVG9TdHJpbmcoKSk7CisgICAgZmluYWwgSG9seU1vbGV5IGhvbHlNb2xleSA9IEZpeHR1cmVzLmhvbHlNb2xleS5kZWVwQ29weSgpOworICAgIC8vIHVuc2V0IHNldHMgdGhhdCBwcm9kdWNlIGluY29uc2lzdGVudCBvcmRlcmluZyBiZXR3ZWVuIEpESzcvOAorICAgIGhvbHlNb2xleS51bnNldEJvbmtzKCk7CisgICAgaG9seU1vbGV5LnVuc2V0Q29udGFpbigpOworICAgIGhvbHlNb2xleS53cml0ZShwcm90byk7CisgICAgYXNzZXJ0RXF1YWxzKCJ7XCJiaWdcIjpbe1wiaW1fdHJ1ZVwiOjEsXCJpbV9mYWxzZVwiOjAsXCJhX2JpdGVcIjozNSxcImludGVnZXIxNlwiOjI3MDAwLFwiaW50ZWdlcjMyXCI6MTY3NzcyMTYsXCJpbnRlZ2VyNjRcIjo2MDAwMDAwMDAwLFwiZG91YmxlX3ByZWNpc2lvblwiOjMuMTQxNTkyNjUzNTg5NzkzLFwic29tZV9jaGFyYWN0ZXJzXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCIsXCJ6b21nX3VuaWNvZGVcIjpcItOA4oWuzp0g0J3Ov+KFv9C+yaHQs9Cwz4HihI4gzpF0dM6x4oW9zrrvv73igLxcIixcIndoYXRfd2hvXCI6MCxcImJhc2U2NFwiOlwiYmFzZTY0XCIsXCJieXRlX2xpc3RcIjpbMSwyLDNdLFwiaTE2X2xpc3RcIjpbMSwyLDNdLFwiaTY0X2xpc3RcIjpbMSwyLDNdfSx7XCJpbV90cnVlXCI6MSxcImltX2ZhbHNlXCI6MCxcImFfYml0ZVwiOi00MixcImludGVnZXIxNlwiOjI3MDAwLFwiaW50ZWdlcjMyXCI6MTY3NzcyMTYsXCJpbnRlZ2VyNjRcIjo2MDAwMDAwMDAwLFwiZG91YmxlX3ByZWNpc2lvblwiOjMuMTQxNTkyNjUzNTg5NzkzLFwic29tZV9jaGFyYWN0ZXJzXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCIsXCJ6b21nX3VuaWNvZGVcIjpcItOA4oWuzp0g0J3Ov+KFv9C+yaHQs9Cwz4HihI4gzpF0dM6x4oW9zrrvv73igLxcIixcIndoYXRfd2hvXCI6MCxcImJhc2U2NFwiOlwiYmFzZTY0XCIsXCJieXRlX2xpc3RcIjpbMSwyLDNdLFwiaTE2X2xpc3RcIjpbMSwyLDNdLFwiaTY0X2xpc3RcIjpbMSwyLDNdfV19IiwgYnVmVG9TdHJpbmcoKSk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGluZygpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTY3LDggKzY4LDE5IEBACiAgICAgc3RydWN0LnVuc2V0TGlzdF9ieXRlX21hcCgpOwogICAgIHN0cnVjdC51bnNldFNldF9ieXRlX21hcCgpOwogICAgIHN0cnVjdC51bnNldE1hcF9ieXRlX21hcCgpOworICAgIC8vIHVuc2V0IHNldHMgYW5kIG1hcHMgdGhhdCBwcm9kdWNlIGluY29uc2lzdGVudCBvcmRlcmluZyBiZXR3ZWVuIEpESzcvOAorICAgIHN0cnVjdC51bnNldEJ5dGVfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0STE2X3NldCgpOworICAgIHN0cnVjdC51bnNldEk2NF9zZXQoKTsKKyAgICBzdHJ1Y3QudW5zZXREb3VibGVfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0U3RyaW5nX3NldCgpOworICAgIHN0cnVjdC51bnNldEkxNl9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldEkzMl9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldEk2NF9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldERvdWJsZV9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldFN0cmluZ19ieXRlX21hcCgpOwogICAgIHN0cnVjdC53cml0ZShwcm90byk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJ7XCJhX2J5dGVcIjoxMjcsXCJhX2kxNlwiOjMyMDAwLFwiYV9pMzJcIjoxMDAwMDAwMDAwLFwiYV9pNjRcIjoxMDk5NTExNjI3Nzc1LFwiYV9kb3VibGVcIjo1LjY3ODksXCJhX3N0cmluZ1wiOlwibXkgc3RyaW5nXCIsXCJhX2JpbmFyeVwiOlwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcIixcInRydWVfZmllbGRcIjoxLFwiZmFsc2VfZmllbGRcIjowLFwiZW1wdHlfc3RydWN0X2ZpZWxkXCI6e30sXCJieXRlX2xpc3RcIjpbLTEyNywtMSwwLDEsMTI3XSxcImkxNl9saXN0XCI6Wy0xLDAsMSwzMjc2N10sXCJpMzJfbGlzdFwiOlstMSwwLDI1NSw2NTUzNSwxNjc3NzIxNSwyMTQ3NDgzNjQ3XSxcImk2NF9saXN0XCI6Wy0xLDAsMjU1LDY1NTM1LDE2Nzc3MjE1LDQyOTQ5NjcyOTUsMTA5OTUxMTYyNzc3NSwyODE0NzQ5NzY3MTA2NTUsNzIwNTc1OTQwMzc5Mjc5MzUsOTIyMzM3MjAzNjg1NDc3NTgwN10sXCJkb3VibGVfbGlzdFwiOlswLjEsMC4yLDAuM10sXCJzdHJpbmdfbGlzdFwiOltcImZpcnN0XCIsXCJzZWNvbmRcIixcInRoaXJkXCJdLFwiYm9vbGVhbl9saXN0XCI6WzEsMSwxLDAsMCwwXSxcInN0cnVjdF9saXN0XCI6W3t9LHt9XSxcImJ5dGVfc2V0XCI6WzAsMSwtMTI3LDEyNywtMV0sXCJpMTZfc2V0XCI6WzAsMSwzMjc2NywtMV0sXCJpMzJfc2V0XCI6WzEsMiwzXSxcImk2NF9zZXRcIjpbOTIyMzM3MjAzNjg1NDc3NTgwNyw3MjA1NzU5NDAzNzkyNzkzNSw2NTUzNSwwLC0xLDI1NSwxMDk5NTExNjI3Nzc1LDI4MTQ3NDk3NjcxMDY1NSw0Mjk0OTY3Mjk1LDE2Nzc3MjE1XSxcImRvdWJsZV9zZXRcIjpbMC4xLDAuMiwwLjNdLFwic3RyaW5nX3NldFwiOltcInNlY29uZFwiLFwidGhpcmRcIixcImZpcnN0XCJdLFwiYm9vbGVhbl9zZXRcIjpbMCwxXSxcInN0cnVjdF9zZXRcIjpbe31dLFwiYnl0ZV9ieXRlX21hcFwiOntcIjFcIjoyfSxcImkxNl9ieXRlX21hcFwiOntcIjFcIjoxLFwiMzI3NjdcIjoxLFwiLTFcIjoxfSxcImkzMl9ieXRlX21hcFwiOntcIjFcIjoxLFwiMjE0NzQ4MzY0N1wiOjEsXCItMVwiOjF9LFwiaTY0X2J5dGVfbWFwXCI6e1wiOTIyMzM3MjAzNjg1NDc3NTgwN1wiOjEsXCItMVwiOjEsXCIwXCI6MSxcIjFcIjoxfSxcImRvdWJsZV9ieXRlX21hcFwiOntcIjEuMVwiOjEsXCItMS4xXCI6MX0sXCJzdHJpbmdfYnl0ZV9tYXBcIjp7XCJcIjowLFwic2Vjb25kXCI6MixcInRoaXJkXCI6MyxcImZpcnN0XCI6MX0sXCJib29sZWFuX2J5dGVfbWFwXCI6e1wiMFwiOjAsXCIxXCI6MX0sXCJieXRlX2kxNl9tYXBcIjp7XCIxXCI6MSxcIjJcIjotMSxcIjNcIjozMjc2N30sXCJieXRlX2kzMl9tYXBcIjp7XCIxXCI6MSxcIjJcIjotMSxcIjNcIjoyMTQ3NDgzNjQ3fSxcImJ5dGVfaTY0X21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjkyMjMzNzIwMzY4NTQ3NzU4MDd9LFwiYnl0ZV9kb3VibGVfbWFwXCI6e1wiMVwiOjAuMSxcIjJcIjotMC4xLFwiM1wiOjEwMDAwMDAuMH0sXCJieXRlX3N0cmluZ19tYXBcIjp7XCIxXCI6XCJcIixcIjJcIjpcImJsYWhcIixcIjNcIjpcImxvb29vb29vb29vb29vb25nIHN0cmluZ1wifSxcImJ5dGVfYm9vbGVhbl9tYXBcIjp7XCIxXCI6MSxcIjJcIjowfSxcImJ5dGVfbWFwX21hcFwiOntcIjBcIjp7fSxcIjFcIjp7XCIxXCI6MX0sXCIyXCI6e1wiMVwiOjEsXCIyXCI6Mn19LFwiYnl0ZV9zZXRfbWFwXCI6e1wiMFwiOltdLFwiMVwiOlsxXSxcIjJcIjpbMSwyXX0sXCJieXRlX2xpc3RfbWFwXCI6e1wiMFwiOltdLFwiMVwiOlsxXSxcIjJcIjpbMSwyXX19IiwgYnVmVG9TdHJpbmcoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhX2J5dGVcIjoxMjcsXCJhX2kxNlwiOjMyMDAwLFwiYV9pMzJcIjoxMDAwMDAwMDAwLFwiYV9pNjRcIjoxMDk5NTExNjI3Nzc1LFwiYV9kb3VibGVcIjo1LjY3ODksXCJhX3N0cmluZ1wiOlwibXkgc3RyaW5nXCIsXCJhX2JpbmFyeVwiOlwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcIixcInRydWVfZmllbGRcIjoxLFwiZmFsc2VfZmllbGRcIjowLFwiZW1wdHlfc3RydWN0X2ZpZWxkXCI6e30sXCJieXRlX2xpc3RcIjpbLTEyNywtMSwwLDEsMTI3XSxcImkxNl9saXN0XCI6Wy0xLDAsMSwzMjc2N10sXCJpMzJfbGlzdFwiOlstMSwwLDI1NSw2NTUzNSwxNjc3NzIxNSwyMTQ3NDgzNjQ3XSxcImk2NF9saXN0XCI6Wy0xLDAsMjU1LDY1NTM1LDE2Nzc3MjE1LDQyOTQ5NjcyOTUsMTA5OTUxMTYyNzc3NSwyODE0NzQ5NzY3MTA2NTUsNzIwNTc1OTQwMzc5Mjc5MzUsOTIyMzM3MjAzNjg1NDc3NTgwN10sXCJkb3VibGVfbGlzdFwiOlswLjEsMC4yLDAuM10sXCJzdHJpbmdfbGlzdFwiOltcImZpcnN0XCIsXCJzZWNvbmRcIixcInRoaXJkXCJdLFwiYm9vbGVhbl9saXN0XCI6WzEsMSwxLDAsMCwwXSxcInN0cnVjdF9saXN0XCI6W3t9LHt9XSxcImkzMl9zZXRcIjpbMSwyLDNdLFwiYm9vbGVhbl9zZXRcIjpbMCwxXSxcInN0cnVjdF9zZXRcIjpbe31dLFwiYnl0ZV9ieXRlX21hcFwiOntcIjFcIjoyfSxcImJvb2xlYW5fYnl0ZV9tYXBcIjp7XCIwXCI6MCxcIjFcIjoxfSxcImJ5dGVfaTE2X21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjMyNzY3fSxcImJ5dGVfaTMyX21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjIxNDc0ODM2NDd9LFwiYnl0ZV9pNjRfbWFwXCI6e1wiMVwiOjEsXCIyXCI6LTEsXCIzXCI6OTIyMzM3MjAzNjg1NDc3NTgwN30sXCJieXRlX2RvdWJsZV9tYXBcIjp7XCIxXCI6MC4xLFwiMlwiOi0wLjEsXCIzXCI6MTAwMDAwMC4xfSxcImJ5dGVfc3RyaW5nX21hcFwiOntcIjFcIjpcIlwiLFwiMlwiOlwiYmxhaFwiLFwiM1wiOlwibG9vb29vb29vb29vb29vbmcgc3RyaW5nXCJ9LFwiYnl0ZV9ib29sZWFuX21hcFwiOntcIjFcIjoxLFwiMlwiOjB9LFwiYnl0ZV9tYXBfbWFwXCI6e1wiMFwiOnt9LFwiMVwiOntcIjFcIjoxfSxcIjJcIjp7XCIxXCI6MSxcIjJcIjoyfX0sXCJieXRlX3NldF9tYXBcIjp7XCIwXCI6W10sXCIxXCI6WzFdLFwiMlwiOlsxLDJdfSxcImJ5dGVfbGlzdF9tYXBcIjp7XCIwXCI6W10sXCIxXCI6WzFdLFwiMlwiOlsxLDJdfX0iLCBidWZUb1N0cmluZygpKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd3NPbkNvbGxlY3Rpb25LZXlzKCkgdGhyb3dzIFRFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyVGVzdEJhc2UuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlclRlc3RCYXNlLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBiOTU3NzliLi4xZGVlMjJkCi0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlclRlc3RCYXNlLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyVGVzdEJhc2UuamF2YQpAQCAtNTQsMTMgKzU0LDEzIEBACiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyVGVzdEJhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0SGFuZGxlciBpbXBsZW1lbnRzIFRocmlmdFRlc3QuSWZhY2UgewotICAKKwogICAgIHB1YmxpYyBUZXN0SGFuZGxlcigpIHt9Ci0gIAorCiAgICAgcHVibGljIHZvaWQgdGVzdFZvaWQoKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Vm9pZCgpXG4iKTsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFN0cmluZyB0ZXN0U3RyaW5nKFN0cmluZyB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFN0cmluZyhcIiIgKyB0aGluZyArICJcIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwpAQCAtNzAsMzAgKzcwLDM1IEBACiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Qm9vbCgiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBieXRlIHRlc3RCeXRlKGJ5dGUgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCeXRlKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIGludCB0ZXN0STMyKGludCB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEkzMigiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBsb25nIHRlc3RJNjQobG9uZyB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEk2NCgiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBkb3VibGUgdGVzdERvdWJsZShkb3VibGUgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3REb3VibGUoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIHRlc3RCaW5hcnkoQnl0ZUJ1ZmZlciB0aGluZykgewotICAgICAgU3RyaW5nIGhleHN0ciA9ICJUT0RPOiB0b0hleFN0cmluZyh0aGluZykiOwotCSAgU3lzdGVtLm91dC5wcmludCgidGVzdEJpbmFyeSgiICsgaGV4c3RyICsgIilcbiIpOworICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaW5nLnJlbWFpbmluZygpICogMyk7CisgICAgICB0aGluZy5tYXJrKCk7CisgICAgICB3aGlsZSAodGhpbmcucmVtYWluaW5nKCkgPiAwKSB7CisgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlMDJYICIsIHRoaW5nLmdldCgpKSk7CisgICAgICB9CisgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0QmluYXJ5KCIgKyBzYi50b1N0cmluZygpICsgIilcbiIpOworICAgICAgdGhpbmcucmVzZXQoKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9CiAKQEAgLTEwNSw3ICsxMTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5pNjRfdGhpbmcgKyAifSlcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgWHRydWN0MiB0ZXN0TmVzdChYdHJ1Y3QyIG5lc3QpIHsKICAgICAgIFh0cnVjdCB0aGluZyA9IG5lc3Quc3RydWN0X3RoaW5nOwogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE5lc3QoeyIgKwpAQCAtMTE3LDcgKzEyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3QuaTMyX3RoaW5nICsgIn0pXG4iKTsKICAgICAgIHJldHVybiBuZXN0OwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTWFwPEludGVnZXIsSW50ZWdlcj4gdGVzdE1hcChNYXA8SW50ZWdlcixJbnRlZ2VyPiB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE1hcCh7Iik7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KHRoaW5nKTsKQEAgLTEzMSw3ICsxMzYsNyBAQAogICAgICAgU3lzdGVtLm91dC5wcmludCgifSlcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgU2V0PEludGVnZXI+IHRlc3RTZXQoU2V0PEludGVnZXI+IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0U2V0KHsiKTsKICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwpAQCAtMTQ2LDcgKzE1MSw3IEBACiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IHRlc3RMaXN0KExpc3Q8SW50ZWdlcj4gdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RMaXN0KHsiKTsKICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwpAQCAtMTYxLDc4ICsxNjYsNTggQEAKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEVudW0oIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgbG9uZyB0ZXN0VHlwZWRlZihsb25nIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0VHlwZWRlZigiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4gdGVzdE1hcE1hcChpbnQgaGVsbG8pIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNYXBNYXAoIiArIGhlbGxvICsgIilcbiIpOwogICAgICAgTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+IG1hcG1hcCA9CiAgICAgICAgIG5ldyBIYXNoTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+KCk7Ci0gIAorCiAgICAgICBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4gcG9zID0gbmV3IEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPigpOwogICAgICAgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+IG5lZyA9IG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKTsKICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKSB7CiAgICAgICAgIHBvcy5wdXQoaSwgaSk7CiAgICAgICAgIG5lZy5wdXQoLWksIC1pKTsKICAgICAgIH0KLSAgCisKICAgICAgIG1hcG1hcC5wdXQoNCwgcG9zKTsKICAgICAgIG1hcG1hcC5wdXQoLTQsIG5lZyk7Ci0gIAorCiAgICAgICByZXR1cm4gbWFwbWFwOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTWFwPExvbmcsIE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50KSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0SW5zYW5pdHkoKVxuIik7Ci0gIAotICAgICAgWHRydWN0IGhlbGxvID0gbmV3IFh0cnVjdCgpOwotICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKLSAgICAgIGhlbGxvLmkzMl90aGluZyA9IDI7Ci0gICAgICBoZWxsby5pNjRfdGhpbmcgPSAyOwotICAKLSAgICAgIFh0cnVjdCBnb29kYnllID0gbmV3IFh0cnVjdCgpOwotICAgICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOwotICAgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gKGJ5dGUpNDsKLSAgICAgIGdvb2RieWUuaTMyX3RoaW5nID0gNDsKLSAgICAgIGdvb2RieWUuaTY0X3RoaW5nID0gKGxvbmcpNDsKLSAgCi0gICAgICBJbnNhbml0eSBjcmF6eSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgY3JhenkudXNlck1hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIExvbmc+KCk7Ci0gICAgICBjcmF6eS51c2VyTWFwLnB1dChOdW1iZXJ6LkVJR0hULCAobG9uZyk4KTsKLSAgICAgIGNyYXp5LnVzZXJNYXAucHV0KE51bWJlcnouRklWRSwgKGxvbmcpNSk7Ci0gICAgICBjcmF6eS54dHJ1Y3RzID0gbmV3IEFycmF5TGlzdDxYdHJ1Y3Q+KCk7Ci0gICAgICBjcmF6eS54dHJ1Y3RzLmFkZChnb29kYnllKTsKLSAgICAgIGNyYXp5Lnh0cnVjdHMuYWRkKGhlbGxvKTsKLSAgCisKICAgICAgIEhhc2hNYXA8TnVtYmVyeixJbnNhbml0eT4gZmlyc3RfbWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgSW5zYW5pdHk+KCk7CiAgICAgICBIYXNoTWFwPE51bWJlcnosSW5zYW5pdHk+IHNlY29uZF9tYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4oKTs7Ci0gIAotICAgICAgZmlyc3RfbWFwLnB1dChOdW1iZXJ6LlRXTywgY3JhenkpOwotICAgICAgZmlyc3RfbWFwLnB1dChOdW1iZXJ6LlRIUkVFLCBjcmF6eSk7Ci0gIAorCisgICAgICBmaXJzdF9tYXAucHV0KE51bWJlcnouVFdPLCBhcmd1bWVudCk7CisgICAgICBmaXJzdF9tYXAucHV0KE51bWJlcnouVEhSRUUsIGFyZ3VtZW50KTsKKwogICAgICAgSW5zYW5pdHkgbG9vbmV5ID0gbmV3IEluc2FuaXR5KCk7CiAgICAgICBzZWNvbmRfbWFwLnB1dChOdW1iZXJ6LlNJWCwgbG9vbmV5KTsKLSAgCisKICAgICAgIE1hcDxMb25nLE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gaW5zYW5lID0KICAgICAgICAgbmV3IEhhc2hNYXA8TG9uZywgTWFwPE51bWJlcnosSW5zYW5pdHk+PigpOwogICAgICAgaW5zYW5lLnB1dCgobG9uZykxLCBmaXJzdF9tYXApOwogICAgICAgaW5zYW5lLnB1dCgobG9uZykyLCBzZWNvbmRfbWFwKTsKLSAgCisKICAgICAgIHJldHVybiBpbnNhbmU7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpKGJ5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgTWFwPFNob3J0LFN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNdWx0aSgpXG4iKTsKLSAgCisKICAgICAgIFh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTs7CiAgICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKICAgICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSBhcmcwOwpAQCAtMjQwLDIzICsyMjUsMjQgQEAKICAgICAgIGhlbGxvLmk2NF90aGluZyA9IGFyZzI7CiAgICAgICByZXR1cm4gaGVsbG87CiAgICAgfQotICAKKwogICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oU3RyaW5nIGFyZykgdGhyb3dzIFhjZXB0aW9uLCBURXhjZXB0aW9uIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFeGNlcHRpb24oIithcmcrIilcbiIpOwotICAgICAgaWYgKGFyZy5lcXVhbHMoIlhjZXB0aW9uIikpIHsKKyAgICAgIGlmICgiWGNlcHRpb24iLmVxdWFscyhhcmcpKSB7CiAgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKICAgICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOwogICAgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CiAgICAgICAgIHRocm93IHg7Ci0gICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIlRFeGNlcHRpb24iKSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbihhcmcpOworICAgICAgfSBlbHNlIGlmICgiVEV4Y2VwdGlvbiIuZXF1YWxzKGFyZykpIHsKKyAgICAgICAgLy8gVW5zcGVjaWZpZWQgZXhjZXB0aW9uIHNob3VsZCB5aWVsZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBvbiBjbGllbnQgc2lkZQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihhcmcpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKICAgICAgICAgcmVzdWx0LnN0cmluZ190aGluZyA9IGFyZzsKICAgICAgIH0KICAgICAgIHJldHVybjsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB0aHJvd3MgWGNlcHRpb24sIFhjZXB0aW9uMiB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TXVsdGlFeGNlcHRpb24oIiArIGFyZzAgKyAiLCAiICsgYXJnMSArICIpXG4iKTsKICAgICAgIGlmIChhcmcwLmVxdWFscygiWGNlcHRpb24iKSkgewpAQCAtMjcxLDE3ICsyNTcsMTcgQEAKICAgICAgICAgeC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKICAgICAgICAgdGhyb3cgeDsKICAgICAgIH0KLSAgCisKICAgICAgIFh0cnVjdCByZXN1bHQgPSBuZXcgWHRydWN0KCk7CiAgICAgICByZXN1bHQuc3RyaW5nX3RoaW5nID0gYXJnMTsKICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IHNsZWVwRm9yKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RPbmV3YXkoIiArIEludGVnZXIudG9TdHJpbmcoc2xlZXBGb3IpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAiKSA9PiBzbGVlcGluZy4uLiIpOwogICAgICAgdHJ5IHsKLSAgICAgICAgVGhyZWFkLnNsZWVwKHNsZWVwRm9yICogMTAwMCk7CisgICAgICAgIFRocmVhZC5zbGVlcChzbGVlcEZvciAqIFNMRUVQX0RFTEFZKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb25lIHNsZWVwaW5nISIpOwogICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWUpOwpAQCAtMjk2LDcgKzI4Miw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1QgPSAibG9jYWxob3N0IjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9SVCA9IEludGVnZXIudmFsdWVPZigKICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3QucG9ydCIsICI5MDkwIikpOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTT0NLRVRfVElNRU9VVCA9IDEwMDA7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNMRUVQX0RFTEFZID0gMTAwMDsKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU09DS0VUX1RJTUVPVVQgPSAxNTAwOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYdHJ1Y3QgWFNUUlVDVCA9IG5ldyBYdHJ1Y3QoIlplcm8iLCAoYnl0ZSkgMSwgLTMsIC01KTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWHRydWN0MiBYU1RSVUNUMiA9IG5ldyBYdHJ1Y3QyKChieXRlKTEsIFhTVFJVQ1QsIDUpOwogCkBAIC0zNDgsNyArMzM1LDcgQEAKICAgLy8gdG9kbzogYWRkIGFzc2VydGlvbnMKICAgcHJpdmF0ZSB2b2lkIHRlc3RJbnNhbml0eShUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgSW5zYW5pdHkgaW5zYW5lOwotICAKKwogICAgIGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOwogICAgIGluc2FuZS51c2VyTWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgTG9uZz4oKTsKICAgICBpbnNhbmUudXNlck1hcC5wdXQoTnVtYmVyei5GSVZFLCAobG9uZyk1MDAwKTsKQEAgLTM2Niw3ICszNTMsNyBAQAogICAgIGZvciAobG9uZyBrZXkgOiB3aG9hLmtleVNldCgpKSB7CiAgICAgICBNYXA8TnVtYmVyeixJbnNhbml0eT4gdmFsID0gd2hvYS5nZXQoa2V5KTsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiB7Iik7Ci0gIAorCiAgICAgICBmb3IgKE51bWJlcnogazIgOiB2YWwua2V5U2V0KCkpIHsKICAgICAgICAgSW5zYW5pdHkgdjIgPSB2YWwuZ2V0KGsyKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludChrMiArICIgPT4geyIpOwpAQCAtMzc4LDcgKzM2NSw3IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwotICAKKwogICAgICAgICBMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLnh0cnVjdHM7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkgewpAQCAtMzg3LDcgKzM3NCw3IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0iKTsKLSAgCisKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CiAgICAgICB9CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKQEAgLTQwMiw3ICszODksNyBAQAogICBwdWJsaWMgdm9pZCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgIGZvciAoVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkgOiBnZXRQcm90b2NvbHMoKSkgewotICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSB1c2VBc3luY1Byb2Nlc3NvcigpID8gbmV3IFRocmlmdFRlc3QuQXN5bmNQcm9jZXNzb3IobmV3IEFzeW5jVGVzdEhhbmRsZXIoKSkgOiBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IobmV3IFRlc3RIYW5kbGVyKCkpOworICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSB1c2VBc3luY1Byb2Nlc3NvcigpID8gbmV3IFRocmlmdFRlc3QuQXN5bmNQcm9jZXNzb3I8QXN5bmNUZXN0SGFuZGxlcj4obmV3IEFzeW5jVGVzdEhhbmRsZXIoKSkgOiBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3I8VGVzdEhhbmRsZXI+KG5ldyBUZXN0SGFuZGxlcigpKTsKIAogICAgICAgc3RhcnRTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b0ZhY3RvcnkpOwogCkBAIC00MzEsOSArNDE4LDExIEBACiAgICAgICB0ZXN0VHlwZWRlZih0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3ROZXN0ZWRNYXAodGVzdENsaWVudCk7CiAgICAgICB0ZXN0SW5zYW5pdHkodGVzdENsaWVudCk7Ci0gICAgICB0ZXN0T25ld2F5KHRlc3RDbGllbnQpOwogICAgICAgdGVzdEV4Y2VwdGlvbih0ZXN0Q2xpZW50KTsKKyAgICAgIHRlc3RPbmV3YXkodGVzdENsaWVudCk7CisgICAgICB0ZXN0STMyKHRlc3RDbGllbnQpOwogICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICBzb2NrZXQuY2xvc2UoKTsKIAogICAgICAgc3RvcFNlcnZlcigpOwogICAgIH0KQEAgLTQ0NCw3ICs0MzMsNyBAQAogICB9CiAKICAgcHVibGljIExpc3Q8VFByb3RvY29sRmFjdG9yeT4gZ2V0UHJvdG9jb2xzKCkgewotICAgIHJldHVybiBQUk9UT0NPTFM7ICAKKyAgICByZXR1cm4gUFJPVE9DT0xTOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RMaXN0KFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTQ4MCwxNCArNDY5LDE0IEBACiAgICAgICB0ZXN0Q2xpZW50LnRlc3RNYXBNYXAoMSk7CiAgICAgTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+IG1hcG1hcCA9CiAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PigpOwotICAKKwogICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBwb3MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+IG5lZyA9IG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKTsKICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewogICAgICAgcG9zLnB1dChpLCBpKTsKICAgICAgIG5lZy5wdXQoLWksIC1pKTsKICAgICB9Ci0gIAorCiAgICAgbWFwbWFwLnB1dCg0LCBwb3MpOwogICAgIG1hcG1hcC5wdXQoLTQsIG5lZyk7CiAgICAgYXNzZXJ0RXF1YWxzKG1hcG1hcCwgbW0pOwpAQCAtNDk5LDcgKzQ4OCwxMCBAQAogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RPbmV3YXkoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDMpOworICAgIGxvbmcgYmVnaW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSk7CisgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpbjsKKyAgICBhc3NlcnRUcnVlKGVsYXBzZWQgPCA1MDApOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RTZXQoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtNTQ0LDE2MyArNTM2LDE3NiBAQAogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdFRyYW5zcG9ydEZhY3RvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAKICAgICBmb3IgKFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5IDogZ2V0UHJvdG9jb2xzKCkpIHsKICAgICAgIFRlc3RIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKLSAgICAgIFRocmlmdFRlc3QuUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcihoYW5kbGVyKTsKLSAgCisgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvcjxUZXN0SGFuZGxlcj4gcHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yPFRlc3RIYW5kbGVyPihoYW5kbGVyKTsKKwogICAgICAgZmluYWwgQ2FsbENvdW50aW5nVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IENhbGxDb3VudGluZ1RyYW5zcG9ydEZhY3RvcnkobmV3IFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpKTsKLSAgCisKICAgICAgIHN0YXJ0U2VydmVyKHByb2Nlc3NvciwgcHJvdG9GYWN0b3J5LCBmYWN0b3J5KTsKICAgICAgIGFzc2VydEVxdWFscygwLCBmYWN0b3J5LmNvdW50KTsKLSAgCisKICAgICAgIFRTb2NrZXQgc29ja2V0ID0gbmV3IFRTb2NrZXQoSE9TVCwgUE9SVCk7CiAgICAgICBzb2NrZXQuc2V0VGltZW91dChTT0NLRVRfVElNRU9VVCk7CiAgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IGdldENsaWVudFRyYW5zcG9ydChzb2NrZXQpOwogICAgICAgb3Blbih0cmFuc3BvcnQpOwotICAKKwogICAgICAgVFByb3RvY29sIHByb3RvY29sID0gcHJvdG9GYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCk7CiAgICAgICBUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHByb3RvY29sKTsKICAgICAgIGFzc2VydEVxdWFscygwLCB0ZXN0Q2xpZW50LnRlc3RCeXRlKChieXRlKSAwKSk7CiAgICAgICBhc3NlcnRFcXVhbHMoMiwgZmFjdG9yeS5jb3VudCk7CisgICAgICBzb2NrZXQuY2xvc2UoKTsKICAgICAgIHN0b3BTZXJ2ZXIoKTsKICAgICB9CiAgIH0KIAogICBwcml2YXRlIHZvaWQgdGVzdEV4Y2VwdGlvbihUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiwgWGNlcHRpb24gewotICAgIC8vQFRPRE8gdGVzdEV4Y2VwdGlvbgotICAgIC8vdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKTsKLSAgICAvKnRyeSB7Ci0gICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICB0cnkgeworICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgYXNzZXJ0IGZhbHNlOwogICAgIH0gY2F0Y2goWGNlcHRpb24gZSkgewotICAgIAlhc3NlcnRFcXVhbHMoZS5tZXNzYWdlLCAiWGNlcHRpb24iKTsKLSAgICB9Ki8KLSAgICAvKnRyeSB7Ci0gICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiQXBwbGljYXRpb25FeGNlcHRpb24iKTsKKyAgICAgIGFzc2VydEVxdWFscyhlLm1lc3NhZ2UsICJYY2VwdGlvbiIpOworICAgICAgYXNzZXJ0RXF1YWxzKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOworICAgICAgYXNzZXJ0IGZhbHNlOwogICAgIH0gY2F0Y2goVEV4Y2VwdGlvbiBlKSB7Ci0gICAgCWFzc2VydEVxdWFscyhlLm1lc3NhZ2UsICJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOwotICAgIH0qLworICAgIH0KKyAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIpOwogICB9CiAKIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNUZXN0SGFuZGxlciBpbXBsZW1lbnRzIFRocmlmdFRlc3QuQXN5bmNJZmFjZSB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNUZXN0SGFuZGxlciBpbXBsZW1lbnRzIFRocmlmdFRlc3QuQXN5bmNJZmFjZSB7CiAKLSAgICAgICAgVGVzdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOworICAgIFRlc3RIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFZvaWQoQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZyhTdHJpbmcgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdFN0cmluZyh0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sKGJvb2xlYW4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEJvb2wodGhpbmcpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZShieXRlIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RCeXRlKHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdEkzMihpbnQgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEkzMih0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RJNjQobG9uZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0STY0KHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZShkb3VibGUgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdERvdWJsZSh0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlIAotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QmluYXJ5KEJ5dGVCdWZmZXIgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEJpbmFyeSh0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3QoWHRydWN0IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTdHJ1Y3QodGhpbmcpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdChYdHJ1Y3QyIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3ROZXN0KHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdE1hcChNYXA8SW50ZWdlciwgSW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdE1hcCh0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdNYXAoTWFwPFN0cmluZywgU3RyaW5nPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RyaW5nTWFwKHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFNldChTZXQ8SW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdFNldCh0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0KExpc3Q8SW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdExpc3QodGhpbmcpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bShOdW1iZXJ6IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RFbnVtKHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFR5cGVkZWYobG9uZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0VHlwZWRlZih0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBNYXAoaW50IGhlbGxvLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RNYXBNYXAoaGVsbG8pKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEluc2FuaXR5KGFyZ3VtZW50KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpKGJ5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgTWFwPFNob3J0LCBTdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1LCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RNdWx0aShhcmcwLGFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oU3RyaW5nIGFyZywgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgLy8gaGFuZGxlci50ZXN0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IHNlY29uZHNUb1NsZWVwLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGhhbmRsZXIudGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCk7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7Ci0gICAgICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZChBc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShudWxsKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nKFN0cmluZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxTdHJpbmc+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTdHJpbmcodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbChib29sZWFuIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEJvb2xlYW4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RCb29sKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGUoYnl0ZSB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxCeXRlPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0Qnl0ZSh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RJMzIoaW50IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEludGVnZXI+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RJMzIodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0STY0KGxvbmcgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TG9uZz4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEk2NCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGUoZG91YmxlIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPERvdWJsZT4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdERvdWJsZSh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5hcnkoQnl0ZUJ1ZmZlciB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxCeXRlQnVmZmVyPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0QmluYXJ5KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RydWN0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3QoWHRydWN0MiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxYdHJ1Y3QyPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TmVzdCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXAoTWFwPEludGVnZXIsIEludGVnZXI+IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdE1hcCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdNYXAoTWFwPFN0cmluZywgU3RyaW5nPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxNYXA8U3RyaW5nLCBTdHJpbmc+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RyaW5nTWFwKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFNldChTZXQ8SW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8U2V0PEludGVnZXI+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U2V0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdExpc3QoTGlzdDxJbnRlZ2VyPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxMaXN0PEludGVnZXI+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TGlzdCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtKE51bWJlcnogdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TnVtYmVyej4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEVudW0odGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZWRlZihsb25nIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPExvbmc+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RUeXBlZGVmKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE1hcE1hcChpbnQgaGVsbG8sIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TWFwTWFwKGhlbGxvKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50LCBBc3luY01ldGhvZENhbGxiYWNrPE1hcDxMb25nLCBNYXA8TnVtYmVyeixJbnNhbml0eT4+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0SW5zYW5pdHkoYXJndW1lbnQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBNYXA8U2hvcnQsIFN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TXVsdGkoYXJnMCxhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKFN0cmluZyBhcmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8Vm9pZD4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEV4Y2VwdGlvbigiK2FyZysiKVxuIik7CisgICAgICBpZiAoIlhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgeworICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgICAvLyB0aHJvdyBhbmQgb25FcnJvciB5aWVsZCB0aGUgc2FtZSByZXN1bHQuCisgICAgICAgIC8vIHRocm93IHg7CisgICAgICAgIHJlc3VsdEhhbmRsZXIub25FcnJvcih4KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmICgiVEV4Y2VwdGlvbiIuZXF1YWxzKGFyZykpIHsKKyAgICAgICAgLy8gdGhyb3cgYW5kIG9uRXJyb3IgeWllbGQgdGhlIHNhbWUgcmVzdWx0LgorICAgICAgICAvLyByZXN1bHRIYW5kbGVyLm9uRXJyb3IobmV3IFRFeGNlcHRpb24oYXJnKSk7CisgICAgICAgIC8vIHJldHVybjsKKyAgICAgICAgLy8gVW5zcGVjaWZpZWQgZXhjZXB0aW9uIHNob3VsZCB5aWVsZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBvbiBjbGllbnQgc2lkZQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihhcmcpOworICAgICAgfQorICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IHNlY29uZHNUb1NsZWVwLCBBc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGhhbmRsZXIudGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCk7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7CisgICAgfQorICB9CisKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Q2xpZW50LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdENsaWVudC5qYXZhCmluZGV4IGI1NDQ2MWUuLjg0NDEwY2UgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Q2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RDbGllbnQuamF2YQpAQCAtMTksMzIgKzE5LDQwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudGVzdDsKIAotLy8gR2VuZXJhdGVkIGNvZGUKLWltcG9ydCB0aHJpZnQudGVzdC4qOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEh0dHBDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGYXN0RnJhbWVkVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU1NMVHJhbnNwb3J0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNpbXBsZUpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZhc3RGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU1NMVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworLy8gR2VuZXJhdGVkIGNvZGUKK2ltcG9ydCB0aHJpZnQudGVzdC5JbnNhbml0eTsKK2ltcG9ydCB0aHJpZnQudGVzdC5OdW1iZXJ6OworaW1wb3J0IHRocmlmdC50ZXN0LlNlY29uZFNlcnZpY2U7CitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjI7CitpbXBvcnQgdGhyaWZ0LnRlc3QuWHRydWN0OworaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDI7CiAKIC8qKgogICogVGVzdCBKYXZhIGNsaWVudCBmb3IgdGhyaWZ0LiBFc3NlbnRpYWxseSBqdXN0IGEgY29weSBvZiB0aGUgQysrIHZlcnNpb24sCkBAIC01Myw2ICs2MSwxNCBAQAogICoKICAqLwogcHVibGljIGNsYXNzIFRlc3RDbGllbnQgeworCisgIHByaXZhdGUgc3RhdGljIGludCBFUlJfQkFTRVRZUEVTID0gMTsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9TVFJVQ1RTID0gMjsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9DT05UQUlORVJTID0gNDsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9FWENFUFRJT05TID0gODsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9QUk9UT0NPTFMgPSAxNjsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9VTktOT1dOID0gNjQ7CisKICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKICAgICBTdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOwogICAgIGludCBwb3J0ID0gOTA5MDsKQEAgLTY5LDggKzg1LDggQEAKICAgICAgICAgICBob3N0ID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOwogICAgICAgICAgIGhvc3QudHJpbSgpOwogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1wb3J0IikpIHsKLSAgICAgICAgICBwb3J0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7IAotICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1uIikgfHwgCisgICAgICAgICAgcG9ydCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1uIikgfHwKICAgICAgICAgICAgIGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS10ZXN0bG9vcHMiKSl7CiAgICAgICAgICAgbnVtVGVzdHMgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS10aW1lb3V0IikpIHsKQEAgLTg1LDExICsxMDEsMTEgQEAKICAgICAgICAgICBzc2wgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWhlbHAiKSkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsb3dlZCBvcHRpb25zOiIpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLWhlbHBcdFx0XHRQcm9kdWNlIGhlbHAgbWVzc2FnZSIpOyAKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1oZWxwXHRcdFx0UHJvZHVjZSBoZWxwIG1lc3NhZ2UiKTsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1ob3N0PWFyZyAoPSIgKyBob3N0ICsgIilcdEhvc3QgdG8gY29ubmVjdCIpOwogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXBvcnQ9YXJnICg9IiArIHBvcnQgKyAiKVx0UG9ydCBudW1iZXIgdG8gY29ubmVjdCIpOwogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXRyYW5zcG9ydD1hcmcgKD0iICsgdHJhbnNwb3J0X3R5cGUgKyAiKVxuXHRcdFx0XHRUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGZhc3RmcmFtZWQsIGh0dHAiKTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wcm90b2NvbD1hcmcgKD0iICsgcHJvdG9jb2xfdHlwZSArICIpXHRQcm90b2NvbDogYmluYXJ5LCBqc29uLCBjb21wYWN0Iik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcHJvdG9jb2w9YXJnICg9IiArIHByb3RvY29sX3R5cGUgKyAiKVx0UHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGlqIik7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc3NsXHRcdFx0RW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKTsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10ZXN0bG9vcHNbLS1uXT1hcmcgKD0iICsgbnVtVGVzdHMgKyAiKVx0TnVtYmVyIG9mIFRlc3RzIik7CiAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CkBAIC05NywxNSArMTEzLDE4IEBACiAgICAgICB9CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2FuIG5vdCBwYXJzZSBhcmd1bWVudHMhIFNlZSAtLWhlbHAiKTsKLSAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgU3lzdGVtLmV4aXQoRVJSX1VOS05PV04pOwogICAgIH0KIAogICAgIHRyeSB7CiAgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImJpbmFyeSIpKSB7CiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikpIHsKICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGkiKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGljIikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CiAgICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHByb3RvY29sIHR5cGUhICIgKyBwcm90b2NvbF90eXBlKTsgCisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gcHJvdG9jb2wgdHlwZSEgIiArIHByb3RvY29sX3R5cGUpOwogICAgICAgfQogICAgICAgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiYnVmZmVyZWQiKSkgewogICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZyYW1lZCIpKSB7CkBAIC0xMTksNyArMTM4LDcgQEAKICAgICAgIH0KICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgU3lzdGVtLmV4aXQoRVJSX1VOS05PV04pOwogICAgIH0KIAogICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKQEAgLTE0NiwyNyArMTY1LDMyIEBACiAgICAgICB9CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgIFN5c3RlbS5leGl0KEVSUl9VTktOT1dOKTsKICAgICB9CiAKICAgICBUUHJvdG9jb2wgdFByb3RvY29sID0gbnVsbDsKLSAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgIFRQcm90b2NvbCB0UHJvdG9jb2wyID0gbnVsbDsKKyAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSB8fCBwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGlqIikpIHsKICAgICAgIHRQcm90b2NvbCA9IG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiY29tcGFjdCIpKSB7CisgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiY29tcGFjdCIpIHx8IHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWMiKSkgewogICAgICAgdFByb3RvY29sID0gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KTsKICAgICB9IGVsc2UgewogICAgICAgdFByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwogICAgIH0KIAotICAgIFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQgPQotICAgICAgbmV3IFRocmlmdFRlc3QuQ2xpZW50KHRQcm90b2NvbCk7CisgICAgaWYgKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSkgeworICAgICAgdFByb3RvY29sMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCh0UHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIik7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wodFByb3RvY29sLCAiVGhyaWZ0VGVzdCIpOworICAgIH0KKworICAgIFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQodFByb3RvY29sKTsKICAgICBJbnNhbml0eSBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKIAogICAgIGxvbmcgdGltZU1pbiA9IDA7CiAgICAgbG9uZyB0aW1lTWF4ID0gMDsKICAgICBsb25nIHRpbWVUb3QgPSAwOwogCi0gICAgaW50IGZhaWxDb3VudCA9IDA7CisgICAgaW50IHJldHVybkNvZGUgPSAwOwogICAgIGZvciAoaW50IHRlc3QgPSAwOyB0ZXN0IDwgbnVtVGVzdHM7ICsrdGVzdCkgewogICAgICAgdHJ5IHsKICAgICAgICAgLyoqCkBAIC0xODAsNyArMjA0LDcgQEAKICAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewogICAgICAgICAgICAgdHR4LnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25uZWN0IGZhaWxlZDogIiArIHR0eC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdChFUlJfVU5LTk9XTik7CiAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE5NSw3ICsyMTksNyBAQAogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHZvaWRcbiIpOwogICAgICAgICB9IGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24gdGF4KSB7CiAgICAgICAgICAgdGF4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgIGZhaWxDb3VudCsrOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMjA1LDE5ICsyMjksMzIgQEAKICAgICAgICAgU3RyaW5nIHMgPSB0ZXN0Q2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gXCIiICsgcyArICJcIlxuIik7CiAgICAgICAgIGlmICghcy5lcXVhbHMoIlRlc3QiKSkgewotICAgICAgICAgIGZhaWxDb3VudCsrOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBNdWx0aXBsZXhlZCB0ZXN0CisgICAgICAgICAqLworICAgICAgICBpZiAocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpKSB7CisgICAgICAgICAgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kQ2xpZW50ID0gbmV3IFNlY29uZFNlcnZpY2UuQ2xpZW50KHRQcm90b2NvbDIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInNlY29uZHRlc3RTdHJpbmcoXCJUZXN0MlwiKSIpOworICAgICAgICAgIHMgPSBzZWNvbmRDbGllbnQuc2Vjb25kdGVzdFN0cmluZygiVGVzdDIiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSBcIiIgKyBzICsgIlwiXG4iKTsKKyAgICAgICAgICBpZiAoIXMuZXF1YWxzKCJ0ZXN0U3RyaW5nKFwiVGVzdDJcIikiKSkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfUFJPVE9DT0xTOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKioKICAgICAgICAgICogQllURSBURVNUCiAgICAgICAgICAqLwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Qnl0ZSgxKSIpOwogICAgICAgICBieXRlIGk4ID0gdGVzdENsaWVudC50ZXN0Qnl0ZSgoYnl0ZSkxKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIGk4ICsgIlxuIik7CiAgICAgICAgIGlmIChpOCAhPSAxKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7IAotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMjI3LDggKzI2NCw4IEBACiAgICAgICAgIGludCBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgaTMyICsgIlxuIik7CiAgICAgICAgIGlmIChpMzIgIT0gLTEpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsgCi0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0yMzgsOCArMjc1LDggQEAKICAgICAgICAgbG9uZyBpNjQgPSB0ZXN0Q2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4TCk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyBpNjQgKyAiXG4iKTsKICAgICAgICAgaWYgKGk2NCAhPSAtMzQzNTk3MzgzNjhMKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0yNDksMTQgKzI4Niw0MCBAQAogICAgICAgICBkb3VibGUgZHViID0gdGVzdENsaWVudC50ZXN0RG91YmxlKC01LjMyNTA5ODIzNSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyBkdWIgKyAiXG4iKTsKICAgICAgICAgaWYgKE1hdGguYWJzKGR1YiAtICgtNS4zMjUwOTgyMzUpKSA+IDAuMDAxKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEJJTkFSWSBURVNUCiAgICAgICAgICAqLwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJUT0RPOiB0ZXN0QmluYXJ5KCAuLi4gKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCaW5hcnkoLTEyOC4uLjEyNykgPSAiKTsKKyAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10gey0xMjgsIC0xMjcsIC0xMjYsIC0xMjUsIC0xMjQsIC0xMjMsIC0xMjIsIC0xMjEsIC0xMjAsIC0xMTksIC0xMTgsIC0xMTcsIC0xMTYsIC0xMTUsIC0xMTQsIC0xMTMsIC0xMTIsIC0xMTEsIC0xMTAsIC0xMDksIC0xMDgsIC0xMDcsIC0xMDYsIC0xMDUsIC0xMDQsIC0xMDMsIC0xMDIsIC0xMDEsIC0xMDAsIC05OSwgLTk4LCAtOTcsIC05NiwgLTk1LCAtOTQsIC05MywgLTkyLCAtOTEsIC05MCwgLTg5LCAtODgsIC04NywgLTg2LCAtODUsIC04NCwgLTgzLCAtODIsIC04MSwgLTgwLCAtNzksIC03OCwgLTc3LCAtNzYsIC03NSwgLTc0LCAtNzMsIC03MiwgLTcxLCAtNzAsIC02OSwgLTY4LCAtNjcsIC02NiwgLTY1LCAtNjQsIC02MywgLTYyLCAtNjEsIC02MCwgLTU5LCAtNTgsIC01NywgLTU2LCAtNTUsIC01NCwgLTUzLCAtNTIsIC01MSwgLTUwLCAtNDksIC00OCwgLTQ3LCAtNDYsIC00NSwgLTQ0LCAtNDMsIC00MiwgLTQxLCAtNDAsIC0zOSwgLTM4LCAtMzcsIC0zNiwgLTM1LCAtMzQsIC0zMywgLTMyLCAtMzEsIC0zMCwgLTI5LCAtMjgsIC0yNywgLTI2LCAtMjUsIC0yNCwgLTIzLCAtMjIsIC0yMSwgLTIwLCAtMTksIC0xOCwgLTE3LCAtMTYsIC0xNSwgLTE0LCAtMTMsIC0xMiwgLTExLCAtMTAsIC05LCAtOCwgLTcsIC02LCAtNSwgLTQsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyN307CisgICAgICAgICAgQnl0ZUJ1ZmZlciBiaW4gPSB0ZXN0Q2xpZW50LnRlc3RCaW5hcnkoQnl0ZUJ1ZmZlci53cmFwKGRhdGEpKTsKKyAgICAgICAgICBiaW4ubWFyaygpOworICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2Jpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCldOworICAgICAgICAgIGJpbi5nZXQoYnl0ZXMpOworICAgICAgICAgIGJpbi5yZXNldCgpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKKyAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGJ5dGVzW2ldKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ9Iik7CisgICAgICAgICAgaWYgKCFCeXRlQnVmZmVyLndyYXAoZGF0YSkuZXF1YWxzKGJpbikpIHsKKyAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogU1RSVUNUIFRFU1QKQEAgLTI2OCwxNCArMzMxLDE0IEBACiAgICAgICAgIG91dC5pMzJfdGhpbmcgPSAtMzsKICAgICAgICAgb3V0Lmk2NF90aGluZyA9IC01OwogICAgICAgICBYdHJ1Y3QgaW4gPSB0ZXN0Q2xpZW50LnRlc3RTdHJ1Y3Qob3V0KTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIgKyAiXCIiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW4uc3RyaW5nX3RoaW5nICsgIlwiLCIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbi5ieXRlX3RoaW5nICsgIiwgIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgIGluLmkzMl90aGluZyArICIsICIgKyAKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIgKyAiXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5zdHJpbmdfdGhpbmcgKyAiXCIsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uYnl0ZV90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmkzMl90aGluZyArICIsICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGluLmk2NF90aGluZyArICJ9XG4iKTsKICAgICAgICAgaWYgKCFpbi5lcXVhbHMob3V0KSkgewotICAgICAgICAgIGZhaWxDb3VudCsrOyAKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxVUkVcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0yODgsMTUgKzM1MSwxNSBAQAogICAgICAgICBvdXQyLmkzMl90aGluZyA9IDU7CiAgICAgICAgIFh0cnVjdDIgaW4yID0gdGVzdENsaWVudC50ZXN0TmVzdChvdXQyKTsKICAgICAgICAgaW4gPSBpbjIuc3RydWN0X3RoaW5nOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7IiArIGluMi5ieXRlX3RoaW5nICsgIiwgeyIgKyAiXCIiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW4uc3RyaW5nX3RoaW5nICsgIlwiLCAiICsgCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiICsgaW4yLmJ5dGVfdGhpbmcgKyAiLCB7IiArICJcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLnN0cmluZ190aGluZyArICJcIiwgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uYnl0ZV90aGluZyArICIsICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGluLmkzMl90aGluZyArICIsICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGluLmk2NF90aGluZyArICJ9LCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICBpbjIuaTMyX3RoaW5nICsgIn1cbiIpOwogICAgICAgICBpZiAoIWluMi5lcXVhbHMob3V0MikpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxVUkVcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0zMzAsMTQgKzM5Myw0OCBAQAogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOwogICAgICAgICBpZiAoIW1hcG91dC5lcXVhbHMobWFwaW4pKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7IAotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogU1RSSU5HIE1BUCBURVNUCi0gICAgICAgICAqICBtaXNzaW5nCiAgICAgICAgICAqLworICAgICAgICB0cnkgeworICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc21hcG91dCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICAgIHNtYXBvdXQucHV0KCJhIiwgIjIiKTsKKyAgICAgICAgICBzbWFwb3V0LnB1dCgiYiIsICJibGFoIik7CisgICAgICAgICAgc21hcG91dC5wdXQoInNvbWUiLCAidGhpbmciKTsKKyAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBzbWFwb3V0LmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4gIiArIHNtYXBvdXQuZ2V0KGtleSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KSIpOworICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc21hcGluID0gdGVzdENsaWVudC50ZXN0U3RyaW5nTWFwKHNtYXBvdXQpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiKTsKKyAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogc21hcGluLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4gIiArIHNtYXBvdXQuZ2V0KGtleSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9XG4iKTsKKyAgICAgICAgICBpZiAoIXNtYXBvdXQuZXF1YWxzKHNtYXBpbikpIHsKKyAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogU0VUIFRFU1QKQEAgLTM3MCw4ICs0NjcsOCBAQAogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOwogICAgICAgICBpZiAoIXNldG91dC5lcXVhbHMoc2V0aW4pKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7IAotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTQwNSw4ICs1MDIsOCBAQAogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOwogICAgICAgICBpZiAoIWxpc3RvdXQuZXF1YWxzKGxpc3RpbikpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsgCi0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtNDE2LDQwICs1MTMsNDAgQEAKICAgICAgICAgTnVtYmVyeiByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOwogICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouT05FKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKFRXTykiKTsKICAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRXTyk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyByZXQgKyAiXG4iKTsKICAgICAgICAgaWYgKHJldCAhPSBOdW1iZXJ6LlRXTykgewotICAgICAgICAgIGZhaWxDb3VudCsrOyAKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxVUkVcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEVudW0oVEhSRUUpIik7CiAgICAgICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyei5USFJFRSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyByZXQgKyAiXG4iKTsKICAgICAgICAgaWYgKHJldCAhPSBOdW1iZXJ6LlRIUkVFKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKEZJVkUpIik7CiAgICAgICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyei5GSVZFKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOwogICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouRklWRSkgewotICAgICAgICAgIGZhaWxDb3VudCsrOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CiAgICAgICAgIH0KIAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bShFSUdIVCkiKTsKICAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOwogICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouRUlHSFQpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxVUkVcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC00NTksOCArNTU2LDggQEAKICAgICAgICAgbG9uZyB1aWQgPSB0ZXN0Q2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgdWlkICsgIlxuIik7CiAgICAgICAgIGlmICh1aWQgIT0gMzA5ODU4MjM1MDgyNTIzTCkgewotICAgICAgICAgIGZhaWxDb3VudCsrOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtNDc5LDEyMSArNTc2LDE3NCBAQAogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAobW0uc2l6ZSgpICE9IDIgfHwgIW1tLmNvbnRhaW5zS2V5KDQpIHx8ICFtbS5jb250YWluc0tleSgtNCkpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbTEgPSBtbS5nZXQoNCk7CisgICAgICAgICAgTWFwPEludGVnZXIsIEludGVnZXI+IG0yID0gbW0uZ2V0KC00KTsKKyAgICAgICAgICBpZiAobTEuZ2V0KDEpICE9IDEgfHwgbTEuZ2V0KDIpICE9IDIgfHwgbTEuZ2V0KDMpICE9IDMgfHwgbTEuZ2V0KDQpICE9IDQgfHwKKyAgICAgICAgICAgICAgbTIuZ2V0KC0xKSAhPSAtMSB8fCBtMi5nZXQoLTIpICE9IC0yIHx8IG0yLmdldCgtMykgIT0gLTMgfHwgbTIuZ2V0KC00KSAhPSAtNCkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogSU5TQU5JVFkgVEVTVAogICAgICAgICAgKi8KLSAgICAgICAgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7Ci0gICAgICAgIGluc2FuZS51c2VyTWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgTG9uZz4oKTsKLSAgICAgICAgaW5zYW5lLnVzZXJNYXAucHV0KE51bWJlcnouRklWRSwgKGxvbmcpNTAwMCk7Ci0gICAgICAgIFh0cnVjdCB0cnVjayA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgICAgdHJ1Y2suc3RyaW5nX3RoaW5nID0gIlRydWNrIjsKLSAgICAgICAgdHJ1Y2suYnl0ZV90aGluZyA9IChieXRlKTg7Ci0gICAgICAgIHRydWNrLmkzMl90aGluZyA9IDg7Ci0gICAgICAgIHRydWNrLmk2NF90aGluZyA9IDg7Ci0gICAgICAgIGluc2FuZS54dHJ1Y3RzID0gbmV3IEFycmF5TGlzdDxYdHJ1Y3Q+KCk7Ci0gICAgICAgIGluc2FuZS54dHJ1Y3RzLmFkZCh0cnVjayk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJbnNhbml0eSgpIik7Ci0gICAgICAgIE1hcDxMb25nLE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gd2hvYSA9Ci0gICAgICAgICAgdGVzdENsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIpOwotICAgICAgICBmb3IgKGxvbmcga2V5IDogd2hvYS5rZXlTZXQoKSkgewotICAgICAgICAgIE1hcDxOdW1iZXJ6LEluc2FuaXR5PiB2YWwgPSB3aG9hLmdldChrZXkpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiB7Iik7CiAKLSAgICAgICAgICBmb3IgKE51bWJlcnogazIgOiB2YWwua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIEluc2FuaXR5IHYyID0gdmFsLmdldChrMik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGsyICsgIiA9PiB7Iik7Ci0gICAgICAgICAgICBNYXA8TnVtYmVyeiwgTG9uZz4gdXNlck1hcCA9IHYyLnVzZXJNYXA7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7Iik7Ci0gICAgICAgICAgICBpZiAodXNlck1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGZvciAoTnVtYmVyeiBrMyA6IHVzZXJNYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGszICsgIiA9PiAiICsgdXNlck1hcC5nZXQoazMpICsgIiwgIik7CisgICAgICAgIGJvb2xlYW4gaW5zYW5pdHlGYWlsZWQgPSB0cnVlOworICAgICAgICB0cnkgeworICAgICAgICAgIFh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgICAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKKyAgICAgICAgICBoZWxsby5pMzJfdGhpbmcgPSAyOworICAgICAgICAgIGhlbGxvLmk2NF90aGluZyA9IDI7CisKKyAgICAgICAgICBYdHJ1Y3QgZ29vZGJ5ZSA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7CisgICAgICAgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gKGJ5dGUpNDsKKyAgICAgICAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7CisgICAgICAgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSAobG9uZyk0OworCisgICAgICAgICAgaW5zYW5lLnVzZXJNYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBMb25nPigpOworICAgICAgICAgIGluc2FuZS51c2VyTWFwLnB1dChOdW1iZXJ6LkVJR0hULCAobG9uZyk4KTsKKyAgICAgICAgICBpbnNhbmUudXNlck1hcC5wdXQoTnVtYmVyei5GSVZFLCAobG9uZyk1KTsKKyAgICAgICAgICBpbnNhbmUueHRydWN0cyA9IG5ldyBBcnJheUxpc3Q8WHRydWN0PigpOworICAgICAgICAgIGluc2FuZS54dHJ1Y3RzLmFkZChnb29kYnllKTsKKyAgICAgICAgICBpbnNhbmUueHRydWN0cy5hZGQoaGVsbG8pOworCisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgICBNYXA8TG9uZyxNYXA8TnVtYmVyeixJbnNhbml0eT4+IHdob2EgPQorICAgICAgICAgICAgdGVzdENsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7Iik7CisgICAgICAgICAgZm9yIChsb25nIGtleSA6IHdob2Eua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIE1hcDxOdW1iZXJ6LEluc2FuaXR5PiB2YWwgPSB3aG9hLmdldChrZXkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+IHsiKTsKKworICAgICAgICAgICAgZm9yIChOdW1iZXJ6IGsyIDogdmFsLmtleVNldCgpKSB7CisgICAgICAgICAgICAgIEluc2FuaXR5IHYyID0gdmFsLmdldChrMik7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoazIgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgTWFwPE51bWJlcnosIExvbmc+IHVzZXJNYXAgPSB2Mi51c2VyTWFwOworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7Iik7CisgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKE51bWJlcnogazMgOiB1c2VyTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGszICsgIiA9PiAiICsgdXNlck1hcC5nZXQoazMpICsgIiwgIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CiAKLSAgICAgICAgICAgIExpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIueHRydWN0czsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKLSAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgZm9yIChYdHJ1Y3QgeCA6IHh0cnVjdHMpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7IiArICJcIiIgKyB4LnN0cmluZ190aGluZyArICJcIiwgIiArIHguYnl0ZV90aGluZyArICIsICIgKyB4LmkzMl90aGluZyArICIsICIrIHguaTY0X3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICBMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLnh0cnVjdHM7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKKyAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoWHRydWN0IHggOiB4dHJ1Y3RzKSB7CisgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7IiArICJcIiIgKyB4LnN0cmluZ190aGluZyArICJcIiwgIiArIHguYnl0ZV90aGluZyArICIsICIgKyB4LmkzMl90aGluZyArICIsICIrIHguaTY0X3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSIpOworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9Iik7CiAKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKICAgICAgICAgICB9Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgICAgaWYgKHdob2Euc2l6ZSgpID09IDIgJiYgd2hvYS5jb250YWluc0tleSgxTCkgJiYgd2hvYS5jb250YWluc0tleSgyTCkpIHsKKyAgICAgICAgICAgIE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gZmlyc3RfbWFwID0gd2hvYS5nZXQoMUwpOworICAgICAgICAgICAgTWFwPE51bWJlcnosIEluc2FuaXR5PiBzZWNvbmRfbWFwID0gd2hvYS5nZXQoMkwpOworICAgICAgICAgICAgaWYgKGZpcnN0X21hcC5zaXplKCkgPT0gMiAmJgorICAgICAgICAgICAgICAgIGZpcnN0X21hcC5jb250YWluc0tleShOdW1iZXJ6LlRXTykgJiYKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXAuY29udGFpbnNLZXkoTnVtYmVyei5USFJFRSkgJiYKKyAgICAgICAgICAgICAgICBzZWNvbmRfbWFwLnNpemUoKSA9PSAxICYmCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcC5jb250YWluc0tleShOdW1iZXJ6LlNJWCkgJiYKKyAgICAgICAgICAgICAgICBpbnNhbmUuZXF1YWxzKGZpcnN0X21hcC5nZXQoTnVtYmVyei5UV08pKSAmJgorICAgICAgICAgICAgICAgIGluc2FuZS5lcXVhbHMoZmlyc3RfbWFwLmdldChOdW1iZXJ6LlRIUkVFKSkpIHsKKyAgICAgICAgICAgICAgSW5zYW5pdHkgc2l4ID1zZWNvbmRfbWFwLmdldChOdW1iZXJ6LlNJWCk7CisgICAgICAgICAgICAgIC8vIENhbm5vdCB1c2UgIm5ldyBJbnNhbml0eSgpLmVxdWFscyhzaXgpIiBiZWNhdXNlIGFzIG9mIG5vdywgc3RydWN0L2NvbnRhaW5lcgorICAgICAgICAgICAgICAvLyBmaWVsZHMgd2l0aCBkZWZhdWx0IHJlcXVpcmVkbmVzcyBoYXZlIGlzc2V0PWZhbHNlIGZvciBsb2NhbCBpbnN0YW5jZXMgYW5kIHlldAorICAgICAgICAgICAgICAvLyByZWNlaXZlZCBlbXB0eSB2YWx1ZXMgZnJvbSBvdGhlciBsYW5ndWFnZXMgbGlrZSBDKysgaGF2ZSBpc3NldD10cnVlIC4KKyAgICAgICAgICAgICAgaWYgKHNpeC5nZXRVc2VyTWFwU2l6ZSgpID09IDAgJiYgc2l4LmdldFh0cnVjdHNTaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICAgICAgaW5zYW5pdHlGYWlsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICAgIGluc2FuaXR5RmFpbGVkID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgIGlmIChpbnNhbml0eUZhaWxlZCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CiAKLSAgICAgICAgCiAgICAgICAgIC8qKgogICAgICAgICAgKiBFWEVDUFRJT04gVEVTVAogICAgICAgICAgKi8KICAgICAgICAgdHJ5IHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSA9PiIpOwogICAgICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHZvaWRcbkZBSUxVUkVcbiIpOwotICAgICAgICAgIGZhaWxDb3VudCsrOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgdm9pZFxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOwogICAgICAgICB9IGNhdGNoKFhjZXB0aW9uIGUpIHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7JWQsIFwiJXNcIn1cbiIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIpOwogICAgICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgdm9pZFxuRkFJTFVSRVxuIik7Ci0gICAgICAgICAgZmFpbENvdW50Kys7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICB2b2lkXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAgICAgICAgIH0gY2F0Y2goVEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAge1wiJXNcIn1cbiIsIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iKTsKICAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oInN1Y2Nlc3MiKTsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHZvaWRcbiIpOwogICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBleGNlcHRpb25cbkZBSUxVUkVcbiIpOwotICAgICAgICAgIGZhaWxDb3VudCsrOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIGV4Y2VwdGlvblxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKKworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNVUxUSSBFWENFUFRJT04gVEVTVAogICAgICAgICAgKi8KLSAgICAgICAgCisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCBcInRlc3QgMVwiKSA9PiIpOwogICAgICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbiIsICJ0ZXN0IDEiKTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7Ci0gICAgICAgICAgZmFpbENvdW50Kys7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICByZXN1bHRcbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICAgICAgfSBjYXRjaChYY2VwdGlvbiBlKSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgeyVkLCBcIiVzXCJ9XG4iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCBcInRlc3QgMlwiKSA9PiIpOwogICAgICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbjIiLCAidGVzdCAyIik7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICByZXN1bHRcbkZBSUxVUkVcbiIpOwotICAgICAgICAgIGZhaWxDb3VudCsrOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgcmVzdWx0XG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAgICAgICAgIH0gY2F0Y2goWGNlcHRpb24yIGUpIHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7JWQsIHtcIiVzXCJ9fVxuIiwgZS5lcnJvckNvZGUsIGUuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJ0ZXN0IDNcIikgPT4iKTsKICAgICAgICAgICBYdHJ1Y3QgcmVzdWx0OwogICAgICAgICAgIHJlc3VsdCA9IHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJzdWNjZXNzIiwgInRlc3QgMyIpOwogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHt7XCIlc1wifX1cbiIsIHJlc3VsdC5zdHJpbmdfdGhpbmcpOwogICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgZXhjZXB0aW9uXG5GQUlMVVJFXG4iKTsKLSAgICAgICAgICBmYWlsQ291bnQrKzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBleGNlcHRpb25cbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICAgICAgfQogCiAKLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIE9ORVdBWSBURVNUCiAgICAgICAgICAqLwpAQCAtNjAyLDEyICs3NTIsMTggQEAKICAgICAgICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDMpOwogICAgICAgICBsb25nIG9uZXdheUVsYXBzZWRNaWxsaXMgPSAoU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydE9uZXdheSkgLyAxMDAwMDAwOwogICAgICAgICBpZiAob25ld2F5RWxhcHNlZE1pbGxpcyA+IDIwMCkgewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT25ld2F5IHRlc3QgZmFpbGVkOiB0b29rICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhvbmV3YXlFbGFwc2VkTWlsbGlzKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXMiKTsKLSAgICAgICAgICBmYWlsQ291bnQrKzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9uZXdheSB0ZXN0IHRvb2sgdG9vIGxvbmcgdG8gZXhlY3V0ZSBmYWlsZWQ6IHRvb2sgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcob25ld2F5RWxhcHNlZE1pbGxpcykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXMiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm9uZXdheSBjYWxscyBhcmUgJ2ZpcmUgYW5kIGZvcmdldCcgYW5kIHRoZXJlZm9yZSBzaG91bGQgbm90IGNhdXNlIGJsb2NraW5nLiIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU29tZSB0cmFuc3BvcnRzIChIVFRQKSBoYXZlIGEgcmVxdWlyZWQgcmVzcG9uc2UsIGFuZCB0eXBpY2FsbHkgdGhpcyBmYWlsdXJlIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtZWFucyB0aGUgdHJhbnNwb3J0IHJlc3BvbnNlIHdhcyBkZWxheWVkIHVudGlsIGFmdGVyIHRoZSBleGVjdXRpb24iKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm9mIHRoZSBSUEMuICBUaGUgc2VydmVyIHNob3VsZCBwb3N0IHRoZSB0cmFuc3BvcnQgcmVzcG9uc2UgaW1tZWRpYXRlbHkgYW5kIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiZWZvcmUgZXhlY3V0aW5nIHRoZSBSUEMuIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKioiKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdWNjZXNzIC0gdG9vayAiICsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2Nlc3MgLSBmaXJlIGFuZCBmb3JnZXQgb25seSB0b29rICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKG9uZXdheUVsYXBzZWRNaWxsaXMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zIik7CiAgICAgICAgIH0KQEAgLTYyOCw4ICs3ODQsOSBAQAogCiAgICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOwogICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIioqKiBGQUlMVVJFICoqKlxuIik7CiAgICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIGZhaWxDb3VudCsrOworICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9VTktOT1dOOwogICAgICAgfQogICAgIH0KIApAQCAtNjQxLDEzICs3OTgsMTQgQEAKIAogICAgIHRyeSB7CiAgICAgICBTdHJpbmcganNvbiA9IChuZXcgVFNlcmlhbGl6ZXIobmV3IFRTaW1wbGVKU09OUHJvdG9jb2wuRmFjdG9yeSgpKSkudG9TdHJpbmcoaW5zYW5lKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5Gb3IgZ29vZCBtZWF1c3JlIGhlcmUgaXMgc29tZSBKU09OOlxuIiArIGpzb24pOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNhbXBsZSBUU2ltcGxlSlNPTlByb3RvY29sIG91dHB1dDpcbiIgKyBqc29uKTsKICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHgpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqIik7CiAgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CiAgICAgfQogCiAKLSAgICBTeXN0ZW0uZXhpdChmYWlsQ291bnQpOworICAgIFN5c3RlbS5leGl0KHJldHVybkNvZGUpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdFNlcnZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RTZXJ2ZXIuamF2YQppbmRleCBlZTA4NjZlLi4xZjNlNTU1IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdFNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0U2VydmVyLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5TZXJ2ZXJDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyLkFyZ3M7CkBAIC00NiwxMCArNDcsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclNvY2tldDsKLQoraW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRNdWx0aXBsZXhlZFByb2Nlc3NvcjsKIAogaW1wb3J0IHRocmlmdC50ZXN0Lkluc2FuaXR5OwogaW1wb3J0IHRocmlmdC50ZXN0Lk51bWJlcno7CitpbXBvcnQgdGhyaWZ0LnRlc3QuU2Vjb25kU2VydmljZTsKIGltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0OwogaW1wb3J0IHRocmlmdC50ZXN0LlhjZXB0aW9uOwogaW1wb3J0IHRocmlmdC50ZXN0LlhjZXB0aW9uMjsKQEAgLTU4LDYgKzYwLDI0IEBACiAKIHB1YmxpYyBjbGFzcyBUZXN0U2VydmVyIHsKIAorICAvLyBNdWx0aXBsZXhlZCBQcm90b2NvbCBTdXBwb3J0IERldGFpbHM6CisgIC8vCisgIC8vIEZvciBtdWx0aXBsZXhlZCB0ZXN0aW5nIHdlIGFsd2F5cyB1c2UgYmluYXJ5IHByb3RvY29sIHVuZGVybmVhdGguCisgIC8vCisgIC8vICJUaHJpZnRUZXN0IiBuYW1lZCBzZXJ2aWNlIGltcGxlbWVudHMgIlRocmlmdFRlc3QiIGZyb20gVGhyaWZ0VGVzdC50aHJpZnQKKyAgLy8gIlNlY29uZFNlcnZpY2UiIG5hbWVkIHNlcnZpY2UgaW1wbGVtZW50cyAiU2Vjb25kU2VydmljZSIgZnJvbSBUaHJpZnRUZXN0LnRocmlmdAorICAvLyBJbiBhZGRpdGlvbiwgdG8gc3VwcG9ydCBvbGRlciBub24tbXVsdGlwbGV4ZWQgY2xpZW50cyB1c2luZyB0aGUgc2FtZSBjb25jcmV0ZSBwcm90b2NvbAorICAvLyB0aGUgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yIGlzIHRhdWdodCB0byB1c2UgIlRocmlmdFRlc3QiIGlmIHRoZSBpbmNvbWluZyByZXF1ZXN0IGhhcyBubworICAvLyBtdWx0aXBsZXhlZCBjYWxsIG5hbWUgZGVjb3JhdGlvbi4KKworICBzdGF0aWMgY2xhc3MgU2Vjb25kSGFuZGxlciBpbXBsZW1lbnRzIHRocmlmdC50ZXN0LlNlY29uZFNlcnZpY2UuSWZhY2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgc2Vjb25kdGVzdFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHRoaW5nKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbgorICAgIHsgcmV0dXJuICJ0ZXN0U3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKSI7IH0KKworICB9CisKICAgc3RhdGljIGNsYXNzIFRlc3RTZXJ2ZXJDb250ZXh0IGltcGxlbWVudHMgU2VydmVyQ29udGV4dCB7CiAKICAgICAgICAgaW50IGNvbm5lY3Rpb25JZDsKQEAgLTExMSw2ICsxMzEsOCBAQAogICAgICAgU3RyaW5nIHByb3RvY29sX3R5cGUgPSAiYmluYXJ5IjsKICAgICAgIFN0cmluZyBzZXJ2ZXJfdHlwZSA9ICJ0aHJlYWQtcG9vbCI7CiAgICAgICBTdHJpbmcgZG9tYWluX3NvY2tldCA9ICIiOworICAgICAgaW50IHN0cmluZ19saW1pdCA9IC0xOworICAgICAgaW50IGNvbnRhaW5lcl9saW1pdCA9IC0xOwogICAgICAgdHJ5IHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1wb3J0IikpIHsKQEAgLTEyOCwxNCArMTUwLDIwIEBACiAgICAgICAgICAgICB0cmFuc3BvcnRfdHlwZS50cmltKCk7CiAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1zc2wiKSkgewogICAgICAgICAgICAgc3NsID0gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1zdHJpbmctbGltaXQiKSkgeworICAgICAgICAgICAgc3RyaW5nX2xpbWl0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tY29udGFpbmVyLWxpbWl0IikpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOwogICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0taGVscCIpKSB7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFsbG93ZWQgb3B0aW9uczoiKTsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLWhlbHBcdFx0XHRQcm9kdWNlIGhlbHAgbWVzc2FnZSIpOwogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcG9ydD1hcmcgKD0iICsgcG9ydCArICIpXHRQb3J0IG51bWJlciB0byBjb25uZWN0Iik7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10cmFuc3BvcnQ9YXJnICg9IiArIHRyYW5zcG9ydF90eXBlICsgIilcblx0XHRcdFx0VHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBmYXN0ZnJhbWVkIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wcm90b2NvbD1hcmcgKD0iICsgcHJvdG9jb2xfdHlwZSArICIpXHRQcm90b2NvbDogYmluYXJ5LCBqc29uLCBjb21wYWN0Iik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wcm90b2NvbD1hcmcgKD0iICsgcHJvdG9jb2xfdHlwZSArICIpXHRQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uLCBtdWx0aSwgbXVsdGljLCBtdWx0aWoiKTsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXNzbFx0XHRcdEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIik7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1zZXJ2ZXItdHlwZT1hcmcgKD0iICsgc2VydmVyX3R5cGUgKyIpXG5cdFx0XHRcdFR5cGUgb2Ygc2VydmVyOiBzaW1wbGUsIHRocmVhZC1wb29sLCBub25ibG9ja2luZywgdGhyZWFkZWQtc2VsZWN0b3IiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXN0cmluZy1saW1pdD1hcmcgKD0iICsgc3RyaW5nX2xpbWl0ICsgIilcdFN0cmluZyByZWFkIGxlbmd0aCBsaW1pdCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tY29udGFpbmVyLWxpbWl0PWFyZyAoPSIgKyBjb250YWluZXJfbGltaXQgKyAiKVx0Q29udGFpbmVyIHJlYWQgbGVuZ3RoIGxpbWl0Iik7CiAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1OSw4ICsxODcsMTEgQEAKICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHNlcnZlciB0eXBlISAiICsgc2VydmVyX3R5cGUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiYmluYXJ5IikpIHsKLSAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygianNvbiIpKSB7CiAgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImNvbXBhY3QiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGkiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWMiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWoiKSkgewogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gcHJvdG9jb2wgdHlwZSEgIiArIHByb3RvY29sX3R5cGUpOwogICAgICAgICB9CkBAIC0xNzUsMjAgKzIwNiwyMSBAQAogICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKICAgICAgIH0KIAotICAgICAgLy8gUHJvY2Vzc29yCi0gICAgICBUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9Ci0gICAgICAgIG5ldyBUZXN0SGFuZGxlcigpOwotICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgdGVzdFByb2Nlc3NvciA9Ci0gICAgICAgIG5ldyBUaHJpZnRUZXN0LlByb2Nlc3Nvcih0ZXN0SGFuZGxlcik7CisgICAgICAvLyBQcm9jZXNzb3JzCisgICAgICBUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOworICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgdGVzdFByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3Nvcih0ZXN0SGFuZGxlcik7CisKKyAgICAgIFNlY29uZEhhbmRsZXIgc2Vjb25kSGFuZGxlciA9IG5ldyBTZWNvbmRIYW5kbGVyKCk7CisgICAgICBTZWNvbmRTZXJ2aWNlLlByb2Nlc3NvciBzZWNvbmRQcm9jZXNzb3IgPSBuZXcgU2Vjb25kU2VydmljZS5Qcm9jZXNzb3Ioc2Vjb25kSGFuZGxlcik7CiAKICAgICAgIC8vIFByb3RvY29sIGZhY3RvcnkKICAgICAgIFRQcm90b2NvbEZhY3RvcnkgdFByb3RvY29sRmFjdG9yeSA9IG51bGw7Ci0gICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgICAgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CiAgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEpTT05Qcm90b2NvbC5GYWN0b3J5KCk7Ci0gICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikpIHsKLSAgICAgICAgdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImNvbXBhY3QiKSB8fCBwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGljIikpIHsKKyAgICAgICAgdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3Rvcnkoc3RyaW5nX2xpbWl0LCBjb250YWluZXJfbGltaXQpOworICAgICAgfSBlbHNlIHsgLy8gYWxzbyBjb3ZlcnMgbXVsdGkKKyAgICAgICAgdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeShzdHJpbmdfbGltaXQsIGNvbnRhaW5lcl9saW1pdCk7CiAgICAgICB9CiAKICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKQEAgLTIwMyw2ICsyMzUsMTEgQEAKIAogICAgICAgVFNlcnZlciBzZXJ2ZXJFbmdpbmUgPSBudWxsOwogCisgICAgICAvLyBJZiB3ZSBhcmUgbXVsdGlwbGV4aW5nIHNlcnZpY2VzIGluIG9uZSBzZXJ2ZXIuLi4KKyAgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBtdWx0aXBsZXhlZFByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyRGVmYXVsdCAgKHRlc3RQcm9jZXNzb3IpOworICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoIlRocmlmdFRlc3QiLCB0ZXN0UHJvY2Vzc29yKTsKKyAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKTsKIAogICAgICAgaWYgKHNlcnZlcl90eXBlLmVxdWFscygibm9uYmxvY2tpbmciKSB8fAogICAgICAgICAgIHNlcnZlcl90eXBlLmVxdWFscygidGhyZWFkZWQtc2VsZWN0b3IiKSkgewpAQCAtMjEwLDIzICsyNDcsMjEgQEAKICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHROb25ibG9ja2luZ1NlcnZlclNvY2tldCA9CiAgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lk5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzKCkucG9ydChwb3J0KSk7CiAKLSAgICAgICAgaWYgKHNlcnZlcl90eXBlLmVxdWFscygibm9uYmxvY2tpbmciKSkgeworICAgICAgICBpZiAoc2VydmVyX3R5cGUuY29udGFpbnMoIm5vbmJsb2NraW5nIikpIHsKICAgICAgICAgICAvLyBOb25ibG9ja2luZyBTZXJ2ZXIKICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXIuQXJncyB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzCiAgICAgICAgICAgICAgID0gbmV3IFROb25ibG9ja2luZ1NlcnZlci5BcmdzKHROb25ibG9ja2luZ1NlcnZlclNvY2tldCk7Ci0gICAgICAgICAgdE5vbmJsb2NraW5nU2VydmVyQXJncy5wcm9jZXNzb3IodGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgdE5vbmJsb2NraW5nU2VydmVyQXJncy5wcm9jZXNzb3IocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpID8gbXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiB0ZXN0UHJvY2Vzc29yKTsKICAgICAgICAgICB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKICAgICAgICAgICB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzLnRyYW5zcG9ydEZhY3RvcnkodFRyYW5zcG9ydEZhY3RvcnkpOwotCiAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFROb25ibG9ja2luZ1NlcnZlcih0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzKTsKICAgICAgICAgfSBlbHNlIHsgLy8gc2VydmVyX3R5cGUuZXF1YWxzKCJ0aHJlYWRlZC1zZWxlY3RvciIpCiAgICAgICAgICAgLy8gVGhyZWFkZWRTZWxlY3RvciBTZXJ2ZXIKICAgICAgICAgICBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzIHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncwogICAgICAgICAgICAgICA9IG5ldyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzKHROb25ibG9ja2luZ1NlcnZlclNvY2tldCk7Ci0gICAgICAgICAgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzLnByb2Nlc3Nvcih0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICB0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MucHJvY2Vzc29yKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSA/IG11bHRpcGxleGVkUHJvY2Vzc29yIDogdGVzdFByb2Nlc3Nvcik7CiAgICAgICAgICAgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKICAgICAgICAgICB0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7Ci0KICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIodFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzKTsKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKQEAgLTI0MywyOSArMjc4LDI4IEBACiAgICAgICAgIGlmIChzZXJ2ZXJfdHlwZS5lcXVhbHMoInNpbXBsZSIpKSB7CiAgICAgICAgICAgLy8gU2ltcGxlIFNlcnZlcgogICAgICAgICAgIFRTZXJ2ZXIuQXJncyB0U2VydmVyQXJncyA9IG5ldyBUU2VydmVyLkFyZ3ModFNlcnZlclNvY2tldCk7Ci0gICAgICAgICAgdFNlcnZlckFyZ3MucHJvY2Vzc29yKHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgIHRTZXJ2ZXJBcmdzLnByb2Nlc3Nvcihwcm90b2NvbF90eXBlLnN0YXJ0c1dpdGgoIm11bHRpIikgPyBtdWx0aXBsZXhlZFByb2Nlc3NvciA6IHRlc3RQcm9jZXNzb3IpOwogICAgICAgICAgIHRTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKICAgICAgICAgICB0U2VydmVyQXJncy50cmFuc3BvcnRGYWN0b3J5KHRUcmFuc3BvcnRGYWN0b3J5KTsKLQogICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHRTZXJ2ZXJBcmdzKTsKICAgICAgICAgfSBlbHNlIHsgLy8gc2VydmVyX3R5cGUuZXF1YWxzKCJ0aHJlYWRwb29sIikKICAgICAgICAgICAvLyBUaHJlYWRQb29sIFNlcnZlcgogICAgICAgICAgIFRUaHJlYWRQb29sU2VydmVyLkFyZ3MgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzCiAgICAgICAgICAgICAgID0gbmV3IFRUaHJlYWRQb29sU2VydmVyLkFyZ3ModFNlcnZlclNvY2tldCk7Ci0gICAgICAgICAgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzLnByb2Nlc3Nvcih0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MucHJvY2Vzc29yKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSA/IG11bHRpcGxleGVkUHJvY2Vzc29yIDogdGVzdFByb2Nlc3Nvcik7CiAgICAgICAgICAgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKICAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7Ci0KICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIodFRocmVhZFBvb2xTZXJ2ZXJBcmdzKTsKICAgICAgICAgfQogICAgICAgfQogCi0KLSAgICAgIC8vU2V0IHNlcnZlciBldmVudCBoYW5kbGVyCisgICAgICAvLyBTZXQgc2VydmVyIGV2ZW50IGhhbmRsZXIKICAgICAgIHNlcnZlckVuZ2luZS5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIobmV3IFRlc3RTZXJ2ZXJFdmVudEhhbmRsZXIoKSk7CiAKICAgICAgIC8vIFJ1biBpdAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiArIHBvcnQgKyAiLi4uIik7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRoZSAiICsgKHNzbCA/ICJzc2wgc2VydmVyIiA6ICJzZXJ2ZXIiKSArCisgICAgICAgICIgWyIgKyBwcm90b2NvbF90eXBlICsgIi8iICsgdHJhbnNwb3J0X3R5cGUgKyAiLyIgKyBzZXJ2ZXJfdHlwZSArICJdIG9uICIgKworICAgICAgICAoKGRvbWFpbl9zb2NrZXQgPT0gIiIpID8gKCJwb3J0ICIgKyBwb3J0KSA6ICgidW5peCBzb2NrZXQgIiArIGRvbWFpbl9zb2NrZXQpKSk7CiAgICAgICBzZXJ2ZXJFbmdpbmUuc2VydmUoKTsKIAogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9SZWFkQ291bnRpbmdUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1JlYWRDb3VudGluZ1RyYW5zcG9ydC5qYXZhCmluZGV4IDg0NzQxODguLjNjNzQ5ZjkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1JlYWRDb3VudGluZ1RyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1JlYWRDb3VudGluZ1RyYW5zcG9ydC5qYXZhCkBAIC0yMiwyNiArMjIsNDAgQEAKIHB1YmxpYyBjbGFzcyBSZWFkQ291bnRpbmdUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKICAgcHVibGljIGludCByZWFkQ291bnQgPSAwOwogICBwcml2YXRlIFRUcmFuc3BvcnQgdHJhbnM7CisgIHByaXZhdGUgYm9vbGVhbiBvcGVuID0gdHJ1ZTsKIAogICBwdWJsaWMgUmVhZENvdW50aW5nVHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZykgewogICAgIHRyYW5zID0gdW5kZXJseWluZzsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHt9CisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIG9wZW4gPSBmYWxzZTsKKyAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7cmV0dXJuIHRydWU7fQorICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuIG9wZW47CisgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHt9CisgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgb3BlbiA9IHRydWU7CisgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiVHJhbnNwb3J0IGlzIGNsb3NlZCIpOworICAgIH0KICAgICByZWFkQ291bnQrKzsKICAgICByZXR1cm4gdHJhbnMucmVhZChidWYsIG9mZiwgbGVuKTsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7fQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJUcmFuc3BvcnQgaXMgY2xvc2VkIik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQppbmRleCAzMzdkY2Y4Li5jMzUzNDg5IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIHB1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlciBleHRlbmRzIFRlc3RDYXNlIHsKICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAvLyBoYXMgZXhwZWN0ZWQgaW5pdGlhbCBjYXBhY2l0eQotICAgIEF1dG9FeHBhbmRpbmdCdWZmZXIgYiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKDEwLCAxLjUpOworICAgIEF1dG9FeHBhbmRpbmdCdWZmZXIgYiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKDEwKTsKICAgICBhc3NlcnRFcXVhbHMoMTAsIGIuYXJyYXkoKS5sZW5ndGgpOwogCiAgICAgLy8gZG9lc24ndCBzaHJpbmsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKaW5kZXggMmUxZjk0Ny4uODNlYmMyZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoMTUwLCAxLjUpOworICAgIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoMTUwKTsKIAogICAgIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCBtZW1idWYgPSBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KEhVTkRSRURfQllURVMpOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKaW5kZXggZDVmMjM5ZC4uODZiNWIwZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQpAQCAtMTksMjYgKzE5LDUxIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK3B1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHsKIAotcHVibGljIGNsYXNzIFRlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KKyAgQFRlc3QKICAgcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDEsIDEuNSk7CisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDEsIDApOworICAgIGFzc2VydEVxdWFscygwLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRFcXVhbHMoMSwgdC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCk7CiAgICAgYnl0ZVtdIGIxID0gbmV3IGJ5dGVbXXsxLDIsM307CiAgICAgdC53cml0ZShiMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIHQuZ2V0UG9zKCkpOworICAgIGFzc2VydEVxdWFscygzLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRUcnVlKHQuZ2V0QnVmKCkuYXJyYXkoKS5sZW5ndGggPj0gMyk7CiAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChiMSksIEJ5dGVCdWZmZXIud3JhcCh0LmdldEJ1ZigpLmFycmF5KCksIDAsIDMpKTsKIAogICAgIHQucmVzZXQoKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgdC5nZXRMZW5ndGgoKSk7CiAgICAgYXNzZXJ0VHJ1ZSh0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoID49IDMpOwotICAgIGFzc2VydEVxdWFscygwLCB0LmdldFBvcygpKTsKICAgICBieXRlW10gYjIgPSBuZXcgYnl0ZVtdezQsNX07CiAgICAgdC53cml0ZShiMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIHQuZ2V0UG9zKCkpOworICAgIGFzc2VydEVxdWFscygyLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGIyKSwgQnl0ZUJ1ZmZlci53cmFwKHQuZ2V0QnVmKCkuYXJyYXkoKSwgMCwgMikpOworCisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHV1dCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoOCwgNCk7CisgICAgYXNzZXJ0RXF1YWxzKDQsIHV1dC5nZXRMZW5ndGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDgsIHV1dC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCk7CisgICAgdXV0LndyaXRlKGIxKTsKKyAgICBhc3NlcnRFcXVhbHMoNywgdXV0LmdldExlbmd0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoOCwgdXV0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoKTsKKyAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGIxKSwgQnl0ZUJ1ZmZlci53cmFwKHV1dC5nZXRCdWYoKS5hcnJheSgpLCA0LCAzKSk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdEJhZEluaXRpYWxTaXplKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCgwLCAwKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0QmFkRnJvbnRSZXNlcnZlU2l6ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoNCwgLTEpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RUb29TbWFsbEZyb250UmVzZXJ2ZVNpemUoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDQsIDUpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEJ5dGVCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUQnl0ZUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MzA3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEJ5dGVCdWZmZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuQ2hhcnNldHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0VEJ5dGVCdWZmZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gbmV3IFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTYpKTsKKyAgICBieXRlQnVmZmVyLndyaXRlKCJIZWxsbyBXb3JsZCIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkIiwgbmV3IFN0cmluZyhieXRlQnVmZmVyLmZsaXAoKS50b0J5dGVBcnJheSgpLCBDaGFyc2V0cy5VVEZfOCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJldXNlUmVhZFdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgVEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IG5ldyBUQnl0ZUJ1ZmZlcihCeXRlQnVmZmVyLmFsbG9jYXRlKDE2KSk7CisgICAgYnl0ZUJ1ZmZlci53cml0ZSgiSGVsbG8gV29ybGQiLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCIsIG5ldyBTdHJpbmcoYnl0ZUJ1ZmZlci5mbGlwKCkudG9CeXRlQXJyYXkoKSwgQ2hhcnNldHMuVVRGXzgpKTsKKworICAgIGJ5dGVCdWZmZXIuY2xlYXIoKTsKKworICAgIGJ5dGVCdWZmZXIud3JpdGUoIkdvb2RieWUgSG9yc2VzIi5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgIGFzc2VydEVxdWFscygiR29vZGJ5ZSBIb3JzZXMiLCBuZXcgU3RyaW5nKGJ5dGVCdWZmZXIuZmxpcCgpLnRvQnl0ZUFycmF5KCksIENoYXJzZXRzLlVURl84KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcmZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gbmV3IFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCkpOworICAgIHRyeSB7CisgICAgICBieXRlQnVmZmVyLndyaXRlKCJIZWxsbyBXb3JsZCIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIHdyaXRlIG9wZXJhdGlvbiB0byBmYWlsIHdpdGggVFRyYW5zcG9ydEV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKCJOb3QgZW5vdWdoIHJvb20gaW4gb3V0cHV0IGJ1ZmZlciIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKaW5kZXggZTAyNDA0OS4uMDZlZTIwNiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTE5LDggKzE5LDE1IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogcHVibGljIGNsYXNzIFRlc3RURmFzdEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRlc3RURnJhbWVkVHJhbnNwb3J0IHsKKyAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgSU5JVElBTF9DQVBBQ0lUWSA9IDUwOworCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nKSB7Ci0gICAgcmV0dXJuIG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCA1MCwgMTAgKiAxMDI0ICogMTAyNCk7CisgICAgcmV0dXJuIG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBJTklUSUFMX0NBUEFDSVRZLCAxMCAqIDEwMjQgKiAxMDI0KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nLCBpbnQgbWF4TGVuZ3RoKSB7CisgICAgcmV0dXJuIG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBJTklUSUFMX0NBUEFDSVRZLCBtYXhMZW5ndGgpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZyYW1lZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCA3OGY1OGVjLi5lMzBkNzRiIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZyYW1lZFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTM0LDYgKzM0LDEwIEBACiAgICAgcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcpOwogICB9CiAKKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZywgaW50IG1heExlbmd0aCkgeworICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBtYXhMZW5ndGgpOworICB9CisKICAgcHVibGljIHN0YXRpYyBieXRlW10gYnl0ZVNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtlbmQtc3RhcnQrMV07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gKGVuZC1zdGFydCk7IGkrKykgewpAQCAtNzUsNiArNzksNDAgQEAKICAgICBhc3NlcnRFcXVhbHMoNCwgY291bnRUcmFucy5yZWFkQ291bnQpOwogICB9CiAKKyAgcHVibGljIHZvaWQgdGVzdEludmFsaWRGcmFtZVNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGludCBtYXhMZW5ndGggPSAxMjg7CisKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJhb3MpOworICAgIGRvcy53cml0ZUludCgxMzApOworICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgMTI5KSk7CisKKyAgICBUTWVtb3J5QnVmZmVyIG1lbWJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgIG1lbWJ1Zi53cml0ZShiYW9zLnRvQnl0ZUFycmF5KCkpOworCisgICAgUmVhZENvdW50aW5nVHJhbnNwb3J0IGNvdW50VHJhbnMgPSBuZXcgUmVhZENvdW50aW5nVHJhbnNwb3J0KG1lbWJ1Zik7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChjb3VudFRyYW5zLCBtYXhMZW5ndGgpOworCisgICAgYnl0ZVtdIHJlYWRCdWYgPSBuZXcgYnl0ZVsxMF07CisgICAgdHJ5IHsKKyAgICAgIHRyYW5zLnJlYWQocmVhZEJ1ZiwgMCwgNCk7CisgICAgICBmYWlsKCJFeHBlY3RlZCBhIFRUcmFuc3BvcnRFeGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbiBiZWNhdXNlIHRoZSBmcmFtZSB3ZSdyZSB0cnlpbmcgdG8gcmVhZCBpcyBsYXJnZXIgdGhhbiBvdXIgbWF4IGZyYW1lIGxlbmd0aAorICAgICAgYXNzZXJ0RXF1YWxzKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsIGUuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBhc3NlcnRGYWxzZSh0cmFucy5pc09wZW4oKSk7CisKKyAgICB0cnkgeworICAgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCA0KTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgLy8gVGhpcyB0aW1lIHdlIGdldCBhbiBleGNlcHRpb24gaW5kaWNhdGluZyB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkCisgICAgICBhc3NlcnRFcXVhbHMoVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgZS5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorCiAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgV3JpdGVDb3VudGluZ1RyYW5zcG9ydCBjb3VudGluZ1RyYW5zID0gbmV3IFdyaXRlQ291bnRpbmdUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYmFvcykpKTsKQEAgLTg3LDExICsxMjUsMTEgQEAKICAgICBhc3NlcnRFcXVhbHMoMCwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKIAogICAgIHRyYW5zLmZsdXNoKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CiAKICAgICB0cmFucy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjQ1KSk7CiAgICAgdHJhbnMuZmx1c2goKTsKLSAgICBhc3NlcnRFcXVhbHMoNCwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKIAogICAgIERhdGFJbnB1dFN0cmVhbSBkaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKICAgICBhc3NlcnRFcXVhbHMoMjU2LCBkaW4ucmVhZEludCgpKTsKQEAgLTE0NSw0ICsxODMsMzIgQEAKICAgICBhc3NlcnRFcXVhbHMoNjUsIHRyYW5zLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSk7CiAgICAgYXNzZXJ0RXF1YWxzKDEwLCB0cmFucy5nZXRCdWZmZXJQb3NpdGlvbigpKTsKICAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShiYW9zKTsKKyAgICBkb3Mud3JpdGVJbnQoMjIwKTsKKyAgICBkb3Mud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDIxOSkpOworCisgICAgVE1lbW9yeUJ1ZmZlciBtZW1idWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBtZW1idWYud3JpdGUoYmFvcy50b0J5dGVBcnJheSgpKTsKKworICAgIFJlYWRDb3VudGluZ1RyYW5zcG9ydCBjb3VudFRyYW5zID0gbmV3IFJlYWRDb3VudGluZ1RyYW5zcG9ydChtZW1idWYpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQoY291bnRUcmFucyk7CisKKyAgICBieXRlW10gcmVhZEJ1ZiA9IG5ldyBieXRlWzIyMF07CisgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCAyMjApOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZWFkQnVmLCBieXRlU2VxdWVuY2UoMCwyMTkpKSk7CisKKyAgICBhc3NlcnRUcnVlKHRyYW5zIGluc3RhbmNlb2YgVEZyYW1lZFRyYW5zcG9ydCB8fCB0cmFucyBpbnN0YW5jZW9mIFRGYXN0RnJhbWVkVHJhbnNwb3J0KTsKKyAgICBpZiAodHJhbnMgaW5zdGFuY2VvZiBURnJhbWVkVHJhbnNwb3J0KSB7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpICE9IG51bGwgJiYgdHJhbnMuZ2V0QnVmZmVyKCkubGVuZ3RoID4gMCk7CisgICAgICAoKFRGcmFtZWRUcmFuc3BvcnQpIHRyYW5zKS5jbGVhcigpOworICAgICAgYXNzZXJ0VHJ1ZSh0cmFucy5nZXRCdWZmZXIoKSA9PSBudWxsKTsKKyAgICB9IGVsc2UgaWYgKHRyYW5zIGluc3RhbmNlb2YgVEZhc3RGcmFtZWRUcmFuc3BvcnQpIHsKKyAgICAgIGFzc2VydFRydWUodHJhbnMuZ2V0QnVmZmVyKCkubGVuZ3RoID4gVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LklOSVRJQUxfQ0FQQUNJVFkpOworICAgICAgKChURmFzdEZyYW1lZFRyYW5zcG9ydCkgdHJhbnMpLmNsZWFyKCk7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpLmxlbmd0aCA9PSBUZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuSU5JVElBTF9DQVBBQ0lUWSk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCmluZGV4IDQ3ODQwN2EuLjAzMmMyZWIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCkBAIC00NSw2ICs0NSwxMCBAQAogICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KEhPU1QsIFBPUlQpOwogICB9CisgIAorICBwcm90ZWN0ZWQgVFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJUcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0U2VydmVyU29ja2V0KFBPUlQpOworICB9CiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKGZpbmFsIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSwgZmluYWwgVFRyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSkKQEAgLTUyLDExICs1NiwxMSBAQAogICAgIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCk7CisgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBnZXRTZXJ2ZXJUcmFuc3BvcnQoKTsKICAgICAgICAgICBmaW5hbCBBcmdzIGFyZ3MgPSBuZXcgQXJncyhzZXJ2ZXJUcmFuc3BvcnQpLnByb2Nlc3Nvcihwcm9jZXNzb3IpOwogICAgICAgICAgIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKGFyZ3MpOwogICAgICAgICAgIHNlcnZlci5zZXJ2ZSgpOwotICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgIGFzc2VydCBmYWxzZTsKICAgICAgICAgfQpAQCAtNjQsNyArNjgsNyBAQAogICAgIH07CiAKICAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKLSAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgVGhyZWFkLnNsZWVwKFNMRUVQX0RFTEFZKTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmY1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworCitwdWJsaWMgY2xhc3MgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZSBleHRlbmRzIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeSB7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBrZXlTdG9yZUxvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIik7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnVzdFN0b3JlTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIpOworICAKKyAgcHVibGljIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeVN0cmVhbWVkU3RvcmUoKSB7CisgICAgc3VwZXIoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiAgT3ZlcnJpZGUgc3lzdGVtIHByb3BlcnRpZXMgdG8gYmUgYWJsZSB0byB0ZXN0IHBhc3NpbmcKKyAgICAgKiAgdGhlIHRydXN0U3RvcmUgYW5kIGtleVN0b3JlIGFzIGlucHV0IHN0cmVhbQorICAgICAqLworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwgIiIpOworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZSIsICIiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KQorICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMgPSBuZXcKKyAgICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzKCk7CisKKyAgICBwYXJhbXMuc2V0VHJ1c3RTdG9yZShuZXcgRmlsZUlucHV0U3RyZWFtKHRydXN0U3RvcmVMb2NhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIpKTsKKyAgICAKKyAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KEhPU1QsIFBPUlQsIDAvKnRpbWVvdXQqLywgcGFyYW1zKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgVFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJUcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMgPSBuZXcKKyAgICAgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMoKTsKKyAgICAKKyAgICBwYXJhbXMuc2V0S2V5U3RvcmUobmV3IEZpbGVJbnB1dFN0cmVhbShrZXlTdG9yZUxvY2F0aW9uKSwgCisgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIikpOworICAgIAorICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCwgMC8qdGltZW91dCovLCBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoSE9TVCksIHBhcmFtcyk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEKaW5kZXggNzg4Mzk1Zi4uMzZhMDZlOSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTYXNsVHJhbnNwb3J0cy5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2FzbFRyYW5zcG9ydHMuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC0zMzIsMTIgKzMzMyw4IEBACiAgICAgICAgIHRocm93IG5ldyBTYXNsRXhjZXB0aW9uKCJBbHJlYWR5IGNvbXBsZXRlISIpOwogICAgICAgfQogCi0gICAgICB0cnkgewotICAgICAgICBoYXNQcm92aWRlZEluaXRpYWxSZXNwb25zZSA9IHRydWU7Ci0gICAgICAgIHJldHVybiB1c2VybmFtZS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFNhc2xFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLSAgICAgIH0KKyAgICAgIGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlID0gdHJ1ZTsKKyAgICAgIHJldHVybiB1c2VybmFtZS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICB9CiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsgcmV0dXJuIGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlOyB9CiAgICAgcHVibGljIGJ5dGVbXSB1bndyYXAoYnl0ZVtdIGluY29taW5nLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CkBAIC0zNTQsMTEgKzM1MSw3IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcjsKICAgICBwdWJsaWMgU3RyaW5nIGdldE1lY2hhbmlzbU5hbWUoKSB7IHJldHVybiAiQU5PTllNT1VTIjsgfQogICAgIHB1YmxpYyBieXRlW10gZXZhbHVhdGVSZXNwb25zZShieXRlW10gcmVzcG9uc2UpIHRocm93cyBTYXNsRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHRoaXMudXNlciA9IG5ldyBTdHJpbmcocmVzcG9uc2UsICJVVEYtOCIpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgU2FzbEV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgfQorICAgICAgdGhpcy51c2VyID0gbmV3IFN0cmluZyhyZXNwb25zZSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsgcmV0dXJuIHVzZXIgIT0gbnVsbDsgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTaW1wbGVGaWxlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQppbmRleCA1ZDJmYjQ1Li43Yjg4MGY0IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQpAQCAtMjcsMjEgKzI3LDIxIEBACiAgIHB1YmxpYyB2b2lkIHRlc3RGcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewogICAgIC8vVGVzdCB3cml0ZSBzaWRlCiAgICAgUGF0aCB0ZW1wRmlsZVBhdGhOYW1lID0gRmlsZXMuY3JlYXRlVGVtcEZpbGUoIlRTaW1wbGVGaWxlVHJhbnNwb3J0VGVzdCIsIG51bGwpOwotICAgIEZpbGVzLmRlbGV0ZSh0ZW1wRmlsZVBhdGhOYW1lKTsgICAgICAgIAorICAgIEZpbGVzLmRlbGV0ZSh0ZW1wRmlsZVBhdGhOYW1lKTsKICAgICBieXRlW10gaW5wdXRfYnVmID0gbmV3IGJ5dGVbXXsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMH07CiAgICAgVFNpbXBsZUZpbGVUcmFuc3BvcnQgdHJhbnNfd3JpdGUgPSBuZXcgVFNpbXBsZUZpbGVUcmFuc3BvcnQodGVtcEZpbGVQYXRoTmFtZS50b1N0cmluZygpLGZhbHNlLCB0cnVlLCBmYWxzZSk7CiAgICAgYXNzZXJ0ICghdHJhbnNfd3JpdGUuaXNPcGVuKCkpOwogICAgIHRyYW5zX3dyaXRlLm9wZW4oKTsKICAgICBhc3NlcnQodHJhbnNfd3JpdGUuaXNPcGVuKCkpOwogICAgIHRyYW5zX3dyaXRlLndyaXRlKGlucHV0X2J1Zik7Ci0gICAgdHJhbnNfd3JpdGUud3JpdGUoaW5wdXRfYnVmLDIsMik7ICAgIAorICAgIHRyYW5zX3dyaXRlLndyaXRlKGlucHV0X2J1ZiwyLDIpOwogICAgIHRyYW5zX3dyaXRlLmZsdXNoKCk7CiAgICAgdHJhbnNfd3JpdGUuY2xvc2UoKTsKLSAgICAKKwogICAgIC8vVGVzdCByZWFkIHNpZGUKICAgICBUU2ltcGxlRmlsZVRyYW5zcG9ydCB0cmFucyA9IG5ldyBUU2ltcGxlRmlsZVRyYW5zcG9ydCh0ZW1wRmlsZVBhdGhOYW1lLnRvU3RyaW5nKCksdHJ1ZSwgZmFsc2UpOwotICAgIGFzc2VydCh0cmFuc193cml0ZS5pc09wZW4oKSk7Ci0gICAgCisgICAgYXNzZXJ0KHRyYW5zLmlzT3BlbigpKTsKKwogICAgIC8vU2ltcGxlIGZpbGUgdHJhbnMgcHJvdmlkZXMgbm8gYnVmZmVyIGFjY2VzcwogICAgIGFzc2VydCgwID09IHRyYW5zLmdldEJ1ZmZlclBvc2l0aW9uKCkpOwogICAgIGFzc2VydChudWxsID09IHRyYW5zLmdldEJ1ZmZlcigpKTsKQEAgLTU2LDE5ICs1NiwxOSBAQAogICAgIHRyYW5zLnJlYWRBbGwoYnVmMSwgMCwgQlVGU0laKTsKICAgICBhc3NlcnQoQlVGU0laID09IHRyYW5zLmdldEZpbGVQb2ludGVyKCkpOwogICAgIGFzc2VydChBcnJheXMuZXF1YWxzKG5ldyBieXRlW117MSwgMiwgMywgNH0sIGJ1ZjEpKTsKLSAgICAKKwogICAgIGludCBieXRlc1JlYWQgPSB0cmFucy5yZWFkKGJ1ZjEsIDAsIEJVRlNJWik7CiAgICAgYXNzZXJ0KGJ5dGVzUmVhZCA+IDApOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXNSZWFkOyArK2kpIHsKLSAgICAgIGFzc2VydChidWYxW2ldID09IGkrNSk7ICAgIAorICAgICAgYXNzZXJ0KGJ1ZjFbaV0gPT0gaSs1KTsKICAgICB9Ci0gICAgCisKICAgICB0cmFucy5zZWVrKDApOwogICAgIGFzc2VydCgwID09IHRyYW5zLmdldEZpbGVQb2ludGVyKCkpOwogICAgIHRyYW5zLnJlYWRBbGwoYnVmMSwgMCwgQlVGU0laKTsKICAgICBhc3NlcnQoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdezEsIDIsIDMsIDR9LCBidWYxKSk7CiAgICAgYXNzZXJ0KEJVRlNJWiA9PSB0cmFucy5nZXRGaWxlUG9pbnRlcigpKTsKICAgICB0cmFucy5jbG9zZSgpOwotICAgIEZpbGVzLmRlbGV0ZSh0ZW1wRmlsZVBhdGhOYW1lKTsgICAgICAKKyAgICBGaWxlcy5kZWxldGUodGVtcEZpbGVQYXRoTmFtZSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUWmxpYlRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRabGliVHJhbnNwb3J0LmphdmEKaW5kZXggZmU4ZGQ1MS4uM2Q3ZjljMSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRabGliVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRabGliVHJhbnNwb3J0LmphdmEKQEAgLTE4LDE0ICsxOCwxOSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkRhdGFGb3JtYXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CiAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIHB1YmxpYyBjbGFzcyBUZXN0VFpsaWJUcmFuc3BvcnQgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZykgewpAQCAtNTAsNiArNTUsMjEgQEAKICAgICB0cmFucy5jbG9zZSgpOwogICB9CiAKKyAgcHVibGljIHZvaWQgdGVzdENsb3NlT3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQoYmFvcykpOworICAgIGJ5dGVbXSB1bmNvbXByZXNzZWQgPSBieXRlU2VxdWVuY2UoMCwgMjQ1KTsKKyAgICB0cmFucy53cml0ZSh1bmNvbXByZXNzZWQpOworICAgIHRyYW5zLmNsb3NlKCk7CisgICAgZmluYWwgYnl0ZVtdIGNvbXByZXNzZWQgPSBiYW9zLnRvQnl0ZUFycmF5KCk7CisKKyAgICBmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbMjU1XTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zUmVhZCA9IGdldFRyYW5zcG9ydChuZXcgVElPU3RyZWFtVHJhbnNwb3J0KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb21wcmVzc2VkKSkpOworICAgIGludCByZWFkQnl0ZXMgPSB0cmFuc1JlYWQucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIGFzc2VydEVxdWFscyh1bmNvbXByZXNzZWQubGVuZ3RoLCByZWFkQnl0ZXMpOworICAgIHRyYW5zUmVhZC5jbG9zZSgpOworICB9CisKICAgcHVibGljIHZvaWQgdGVzdFJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgIERlZmxhdGVyT3V0cHV0U3RyZWFtIGRlZmxhdGVyT3V0cHV0U3RyZWFtID0gbmV3IERlZmxhdGVyT3V0cHV0U3RyZWFtKGJhb3MpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCmluZGV4IGRlNzA4NmYuLmQzOTE2ODYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIApAQCAtMzQ4LDYgKzM0OSw0NyBAQAogICAgIH0KICAgfQogCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIaWdoU3Vycm9nYXRlKGNoYXIgYykgeworICAgIHJldHVybiBjID49ICdcdUQ4MDAnICYmIGMgPD0gJ1x1REJGRic7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTG93U3Vycm9nYXRlKGNoYXIgYykgeworICAgIHJldHVybiBjID49ICdcdURDMDAnICYmIGMgPD0gJ1x1REZGRic7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gdG9VVEY4KGludCBjb2RlcG9pbnQpIHsKKyAgICBmaW5hbCBpbnRbXSBGSVJTVF9CWVRFX01BU0sgPSB7IDAsIDB4YzAsIDB4ZTAsIDB4ZjAgfTsKKyAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICBpZiAoY29kZXBvaW50IDw9IDB4N2YpIGxlbmd0aCA9IDE7CisgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4N2ZmKSBsZW5ndGggPSAyOworICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweGZmZmYpIGxlbmd0aCA9IDM7CisgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4MWZmZmZmKSBsZW5ndGggPSA0OworICAgIGVsc2UgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvZGUgcG9pbnQgb3ZlciBVKzFGRkZGRiBpcyBub3Qgc3VwcG9ydGVkIik7CisKKyAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgIHN3aXRjaCAobGVuZ3RoKSB7CisgICAgY2FzZSA0OgorICAgICAgYnl0ZXNbM10gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAzOgorICAgICAgYnl0ZXNbMl0gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAyOgorICAgICAgYnl0ZXNbMV0gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAxOgorICAgICAgYnl0ZXNbMF0gPSAoYnl0ZSkoY29kZXBvaW50IHwgRklSU1RfQllURV9NQVNLW2xlbmd0aCAtIDFdKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXM7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gdG9VVEY4KGludCBoaWdoLCBpbnQgbG93KSB7CisgICAgaW50IGNvZGVwb2ludCA9ICgxIDw8IDE2KSArICgoaGlnaCAmIDB4M2ZmKSA8PCAxMCk7CisgICAgY29kZXBvaW50ICs9IGxvdyAmIDB4M2ZmOworICAgIHJldHVybiB0b1VURjgoY29kZXBvaW50KTsKKyAgfQorCiAgIC8vIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAogICBwcml2YXRlIHZvaWQgd3JpdGVKU09OU3RyaW5nKGJ5dGVbXSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgY29udGV4dF8ud3JpdGUoKTsKQEAgLTU5Niw2ICs2MzgsNyBAQAogICBwcml2YXRlIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVhZEpTT05TdHJpbmcoYm9vbGVhbiBza2lwQ29udGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oREVGX1NUUklOR19TSVpFKTsKKyAgICBpbnQgaGlnaFN1cnJvZ2F0ZSA9IDA7CiAgICAgaWYgKCFza2lwQ29udGV4dCkgewogICAgICAgY29udGV4dF8ucmVhZCgpOwogICAgIH0KQEAgLTYwOCwxMCArNjUxLDQyIEBACiAgICAgICBpZiAoY2ggPT0gRVNDU0VRWzBdKSB7CiAgICAgICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7CiAgICAgICAgIGlmIChjaCA9PSBFU0NTRVFbMV0pIHsKLSAgICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoWkVSTyk7Ci0gICAgICAgICAgcmVhZEpTT05TeW50YXhDaGFyKFpFUk8pOwotICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKHRtcGJ1Zl8sIDAsIDIpOwotICAgICAgICAgIGNoID0gKGJ5dGUpKChoZXhWYWwodG1wYnVmX1swXSkgPDwgNCkgKyBoZXhWYWwodG1wYnVmX1sxXSkpOworICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKHRtcGJ1Zl8sIDAsIDQpOworICAgICAgICAgIHNob3J0IGN1ID0gKHNob3J0KSgKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1swXSkgPDwgMTIpICsKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1sxXSkgPDwgOCkgKworICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzJdKSA8PCA0KSArCisgICAgICAgICAgICAgIChzaG9ydCloZXhWYWwodG1wYnVmX1szXSkpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaXNIaWdoU3Vycm9nYXRlKChjaGFyKWN1KSkgeworICAgICAgICAgICAgICBpZiAoaGlnaFN1cnJvZ2F0ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IGN1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaXNMb3dTdXJyb2dhdGUoKGNoYXIpY3UpKSB7CisgICAgICAgICAgICAgIGlmIChoaWdoU3Vycm9nYXRlID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBhcnIud3JpdGUodG9VVEY4KGhpZ2hTdXJyb2dhdGUsIGN1KSk7CisgICAgICAgICAgICAgIGhpZ2hTdXJyb2dhdGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIGFyci53cml0ZSh0b1VURjgoY3UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICJKVk0gZG9lcyBub3Qgc3VwcG9ydCBVVEYtOCIpOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCB1bmljb2RlIHNlcXVlbmNlIik7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgIGludCBvZmYgPSBFU0NBUEVfQ0hBUlMuaW5kZXhPZihjaCk7CkBAIC02MjQsNiArNjk5LDExIEBACiAgICAgICB9CiAgICAgICBhcnIud3JpdGUoY2gpOwogICAgIH0KKworICAgIGlmIChoaWdoU3Vycm9nYXRlICE9IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgfQogICAgIHJldHVybiBhcnI7CiAgIH0KIApAQCAtNzIyLDYgKzgwMiwxMSBAQAogICAgIGludCBsZW4gPSBhcnIubGVuKCk7CiAgICAgaW50IG9mZiA9IDA7CiAgICAgaW50IHNpemUgPSAwOworICAgIC8vIElnbm9yZSBwYWRkaW5nCisgICAgaW50IGJvdW5kID0gbGVuID49IDIgPyBsZW4gLSAyIDogMDsKKyAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSBib3VuZCAmJiBiW2ldID09ICc9JzsgLS1pKSB7CisgICAgICAtLWxlbjsKKyAgICB9CiAgICAgd2hpbGUgKGxlbiA+PSA0KSB7CiAgICAgICAvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKICAgICAgIFRCYXNlNjRVdGlscy5kZWNvZGUoYiwgb2ZmLCA0LCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YQppbmRleCA5YmYxMGY2Li5jMzI3NDQ4IDEwMDY0NAotLS0gYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhCkBAIC0xNTIsNyArMTUyLDggQEAKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgdHlwZSAiICsgdHlwZSk7CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvanMvR3J1bnRmaWxlLmpzIGIvbGliL2pzL0dydW50ZmlsZS5qcwppbmRleCAzMmM4ODM0Li44N2I4MjZmIDEwMDY0NAotLS0gYS9saWIvanMvR3J1bnRmaWxlLmpzCisrKyBiL2xpYi9qcy9HcnVudGZpbGUuanMKQEAgLTMsNiArMyw3IEBACiAvL1ByZXJlcXVpc2l0ZXM6CiAvLyBOb2RlIFNldHVwIC0gICBub2RlanMub3JnCiAvLyBHcnVudCBTZXR1cCAtICBucG0gaW5zdGFsbCAgLy9yZWFkcyB0aGUgLi9wYWNrYWdlLmpzb24gYW5kIGluc3RhbGxzIHByb2plY3QgZGVwZW5kZW5jaWVzCisvLyBSdW4gZ3J1bnQgLSAgICBucHggZ3J1bnQgIC8vIHVzZXMgcHJvamVjdC1sb2NhbCBpbnN0YWxsZWQgdmVyc2lvbiBvZiBncnVudCAoZnJvbSBwYWNrYWdlLmpzb24pCiAKIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZ3J1bnQpIHsKICAgJ3VzZSBzdHJpY3QnOwpAQCAtMzgsMTEyICszOSwyMzggQEAKICAgICB9LAogICAgIHNoZWxsOiB7CiAgICAgICBJbnN0YWxsVGhyaWZ0SlM6IHsKLSAgICAgICAgY29tbWFuZDogJ21rZGlyIHRlc3QvYnVpbGQ7IG1rZGlyIHRlc3QvYnVpbGQvanM7IGNwIHNyYy90aHJpZnQuanMgdGVzdC9idWlsZC9qcy90aHJpZnQuanMnCisgICAgICAgIGNvbW1hbmQ6ICdta2RpciAtcCB0ZXN0L2J1aWxkL2pzL2xpYjsgY3Agc3JjL3RocmlmdC5qcyB0ZXN0L2J1aWxkL2pzL3RocmlmdC5qcycKICAgICAgIH0sCiAgICAgICBJbnN0YWxsVGhyaWZ0Tm9kZUpTRGVwOiB7Ci0gICAgICAgIGNvbW1hbmQ6ICdjZCAuLi9ub2RlanM7IG5wbSBpbnN0YWxsJworICAgICAgICBjb21tYW5kOiAnY2QgLi4vLi47IG5wbSBpbnN0YWxsJworICAgICAgfSwKKyAgICAgIEluc3RhbGxUZXN0TGliczogeworICAgICAgICBjb21tYW5kOiAnY2QgdGVzdDsgYW50IGRvd25sb2FkX2pzbGlicycKICAgICAgIH0sCiAgICAgICBUaHJpZnRHZW46IHsKLSAgICAgICAgY29tbWFuZDogJ3RocmlmdCAtZ2VuIGpzIC1nZW4ganM6bm9kZSAtbyB0ZXN0IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnCisgICAgICAgIGNvbW1hbmQ6IFsKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tanMnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLS1vdXQgdGVzdC9nZW4tanMgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqcyAtLW91dCB0ZXN0L2dlbi1qcyAuLi8uLi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQnLAorICAgICAgICAgICdta2RpciAtcCB0ZXN0L2dlbi1qcy1qcXVlcnknLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6anF1ZXJ5IC0tb3V0IHRlc3QvZ2VuLWpzLWpxdWVyeSAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tbm9kZWpzJywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOm5vZGUgLS1vdXQgdGVzdC9nZW4tbm9kZWpzIC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICAgICdta2RpciAtcCB0ZXN0L2dlbi1qcy1lczYnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6ZXM2IC0tb3V0IHRlc3QvZ2VuLWpzLWVzNiAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tbm9kZWpzLWVzNicsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqczpub2RlLGVzNiAtLW91dCAuL3Rlc3QvZ2VuLW5vZGVqcy1lczYgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgIF0uam9pbignICYmICcpCiAgICAgICB9LAogICAgICAgVGhyaWZ0R2VuSlE6IHsKLSAgICAgICAgY29tbWFuZDogJ3RocmlmdCAtZ2VuIGpzOmpxdWVyeSAtZ2VuIGpzOm5vZGUgLW8gdGVzdCAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JworICAgICAgICBjb21tYW5kOiAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOmpxdWVyeSAtZ2VuIGpzOm5vZGUgLW8gdGVzdCAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JwogICAgICAgfSwKICAgICAgIFRocmlmdEdlbkRlZXBDb25zdHJ1Y3RvcjogewotICAgICAgICBjb21tYW5kOiAndGhyaWZ0IC1nZW4ganMgLW8gdGVzdCAuLi8uLi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQnCi0gICAgICB9Ci0gICAgfSwKLSAgICBleHRlcm5hbF9kYWVtb246IHsKKyAgICAgICAgY29tbWFuZDogJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqcyAtbyB0ZXN0IC4uLy4uL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdCcKKyAgICAgIH0sCisgICAgICBUaHJpZnRCcm93c2VyaWZ5Tm9kZUludDY0OiB7CisgICAgICAgIGNvbW1hbmQ6IFsKKyAgICAgICAgICAnLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9iaW4vY21kLmpzIC4vbm9kZV9tb2R1bGVzL25vZGUtaW50NjQvSW50NjQuanMgLXMgSW50NjQgLW8gdGVzdC9idWlsZC9qcy9saWIvSW50NjQuanMnLAorICAgICAgICAgICcuL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L2Jpbi9jbWQuanMgLi4vbm9kZWpzL2xpYi90aHJpZnQvaW50NjRfdXRpbC5qcyAtcyBJbnQ2NFV0aWwgLW8gdGVzdC9idWlsZC9qcy9saWIvSW50NjRVdGlsLmpzJywKKyAgICAgICAgICAnLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9iaW4vY21kLmpzIC4vbm9kZV9tb2R1bGVzL2pzb24taW50NjQvaW5kZXguanMgLXMgSlNPTkludDY0IC1vIHRlc3QvYnVpbGQvanMvbGliL0pTT05JbnQ2NC5qcycKKyAgICAgICAgXS5qb2luKCcgJiYgJykKKyAgICAgIH0sCisgICAgICBUaHJpZnRHZW5JbnQ2NDogeworICAgICAgICBjb21tYW5kOiAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzIC1vIHRlc3QgLi4vLi4vdGVzdC9JbnQ2NFRlc3QudGhyaWZ0JworICAgICAgfSwKKyAgICAgIFRocmlmdEdlbkRvdWJsZUNvbnN0YW50czogeworICAgICAgICBjb21tYW5kOiAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzIC1vIHRlc3QgLi4vLi4vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCcKKyAgICAgIH0sCiAgICAgICBUaHJpZnRUZXN0U2VydmVyOiB7CiAgICAgICAgIG9wdGlvbnM6IHsKLSAgICAgICAgICBzdGFydENoZWNrOiBmdW5jdGlvbihzdGRvdXQsIHN0ZGVycikgewotICAgICAgICAgICAgcmV0dXJuICgvVGhyaWZ0IFNlcnZlciBydW5uaW5nIG9uIHBvcnQvKS50ZXN0KHN0ZG91dCk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBub2RlU3Bhd25PcHRpb25zOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q6ICJ0ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudjoge05PREVfUEFUSDogIi4uLy4uL25vZGVqcy9saWI6Li4vLi4vbm9kZWpzL25vZGVfbW9kdWxlcyJ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KICAgICAgICAgfSwKLSAgICAgICAgY21kOiAibm9kZSIsCi0gICAgICAgIGFyZ3M6IFsic2VydmVyX2h0dHAuanMiXQorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cC5qcyIsCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlckVTNjogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgYXN5bmM6IHRydWUsCisgICAgICAgICAgZXhlY09wdGlvbnM6IHsKKyAgICAgICAgICAgIGN3ZDogIi4vdGVzdCIsCisgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cC5qcyAtLWVzNiIsCiAgICAgICB9LAogICAgICAgVGhyaWZ0VGVzdFNlcnZlcl9UTFM6IHsKICAgICAgICAgb3B0aW9uczogewotICAgICAgICAgIHN0YXJ0Q2hlY2s6IGZ1bmN0aW9uKHN0ZG91dCwgc3RkZXJyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydC8pLnRlc3Qoc3Rkb3V0KTsKLSAgICAgICAgICB9LAotICAgICAgICAgIG5vZGVTcGF3bk9wdGlvbnM6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZDogInRlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi9ub2RlanMvbm9kZV9tb2R1bGVzIn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgYXN5bmM6IHRydWUsCisgICAgICAgICAgZXhlY09wdGlvbnM6IHsKKyAgICAgICAgICAgIGN3ZDogIi4vdGVzdCIsCisgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9CisgICAgICAgICAgfQogICAgICAgICB9LAotICAgICAgICBjbWQ6ICJub2RlIiwKLSAgICAgICAgYXJnczogWyJzZXJ2ZXJfaHR0cHMuanMiXQotICAgICAgfQorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cHMuanMiLAorICAgICAgfSwKKyAgICAgIFRocmlmdFRlc3RTZXJ2ZXJFUzZfVExTOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBhc3luYzogdHJ1ZSwKKyAgICAgICAgICBleGVjT3B0aW9uczogeworICAgICAgICAgICAgY3dkOiAiLi90ZXN0IiwKKyAgICAgICAgICAgIGVudjoge05PREVfUEFUSDogIi4uLy4uL25vZGVqcy9saWI6Li4vLi4vLi4vbm9kZV9tb2R1bGVzIn0KKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIGNvbW1hbmQ6ICJub2RlIHNlcnZlcl9odHRwcy5qcyAtLWVzNiIsCisgICAgICB9LAogICAgIH0sCiAgICAgcXVuaXQ6IHsKICAgICAgIFRocmlmdEpTOiB7CiAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICB1cmxzOiBbCi0gICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg4L3Rlc3Qtbm9qcS5odG1sJwotICAgICAgICAgIF0KKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1ub2pxLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAogICAgICAgICB9CiAgICAgICB9LAogICAgICAgVGhyaWZ0SlNKUTogewogICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgdXJsczogWwotICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OC90ZXN0Lmh0bWwnCi0gICAgICAgICAgXQorICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNfRG91YmxlUmVuZGVyaW5nOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNfSW50NjQ6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1pbnQ2NC5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAogICAgICAgICB9CiAgICAgICB9LAogICAgICAgVGhyaWZ0V1M6IHsKICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgIHVybHM6IFsKLSAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODgvdGVzdHdzLmh0bWwnCi0gICAgICAgICAgXQorICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0d3MuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCiAgICAgICAgIH0KICAgICAgIH0sCiAgICAgICBUaHJpZnRKU19UTFM6IHsKICAgICAgICAgb3B0aW9uczogewotICAgICAgICAgICctLWlnbm9yZS1zc2wtZXJyb3JzJzogdHJ1ZSwKICAgICAgICAgICB1cmxzOiBbCi0gICAgICAgICAgICAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0LW5vanEuaHRtbCcKLSAgICAgICAgICBdCisgICAgICAgICAgICAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODA5MS90ZXN0LW5vanEuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsCisgICAgICAgICAgfSwKICAgICAgICAgfQogICAgICAgfSwKICAgICAgIFRocmlmdEpTSlFfVExTOiB7CiAgICAgICAgIG9wdGlvbnM6IHsKLSAgICAgICAgICAnLS1pZ25vcmUtc3NsLWVycm9ycyc6IHRydWUsCiAgICAgICAgICAgdXJsczogWwotICAgICAgICAgICAgJ2h0dHBzOi8vbG9jYWxob3N0OjgwODkvdGVzdC5odG1sJwotICAgICAgICAgIF0KKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3QuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsCisgICAgICAgICAgfSwKICAgICAgICAgfQogICAgICAgfSwKICAgICAgIFRocmlmdFdTX1RMUzogewogICAgICAgICBvcHRpb25zOiB7Ci0gICAgICAgICAgJy0taWdub3JlLXNzbC1lcnJvcnMnOiB0cnVlLAogICAgICAgICAgIHVybHM6IFsKLSAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDg5L3Rlc3R3cy5odG1sJwotICAgICAgICAgIF0KKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3R3cy5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAogICAgICAgICB9CiAgICAgICB9LAogICAgICAgVGhyaWZ0RGVlcENvbnN0cnVjdG9yOiB7CiAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICB1cmxzOiBbCi0gICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg4L3Rlc3QtZGVlcC1jb25zdHJ1Y3Rvci5odG1sJwotICAgICAgICAgIF0KKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0V1NFUzY6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODgvdGVzdC1lczYuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCiAgICAgICAgIH0KICAgICAgIH0KICAgICB9LAogICAgIGpzaGludDogewotICAgICAgZmlsZXM6IFsnR3J1bnRmaWxlLmpzJywgJ3NyYy8qKi8qLmpzJywgJ3Rlc3QvKi5qcyddLAotICAgICAgb3B0aW9uczogewotICAgICAgICAvLyBvcHRpb25zIGhlcmUgdG8gb3ZlcnJpZGUgSlNIaW50IGRlZmF1bHRzCi0gICAgICAgIGdsb2JhbHM6IHsKLSAgICAgICAgICBqUXVlcnk6IHRydWUsCi0gICAgICAgICAgY29uc29sZTogdHJ1ZSwKLSAgICAgICAgICBtb2R1bGU6IHRydWUsCi0gICAgICAgICAgZG9jdW1lbnQ6IHRydWUKKyAgICAgIC8vIFRoZSBtYWluIFRocmlmdCBsaWJyYXJ5IGZpbGUuIG5vdCBlczYgeWV0IDooCisgICAgICBsaWI6IHsKKyAgICAgICAgc3JjOiBbJ3NyYy8qKi8qLmpzJ10sCisgICAgICB9LAorICAgICAgLy8gVGhlIHRlc3QgZmlsZXMgdXNlIGVzNgorICAgICAgdGVzdDogeworICAgICAgICBzcmM6IFsnR3J1bnRmaWxlLmpzJywgJ3Rlc3QvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgZXN2ZXJzaW9uOiA2LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgZ2VuX2pzX2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLWpzLyouanMnLCAndGVzdC9nZW4tanMtanF1ZXJ5LyouanMnXSwKKyAgICAgIH0sCisgICAgICBnZW5fZXM2X2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLWpzLWVzNi8qLmpzJ10sCisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBlc3ZlcnNpb246IDYsCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBnZW5fbm9kZV9jb2RlOiB7CisgICAgICAgIHNyYzogWyd0ZXN0L2dlbi1ub2RlanMvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgbm9kZTogdHJ1ZSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIGdlbl9ub2RlX2VzNl9jb2RlOiB7CisgICAgICAgIHNyYzogWyd0ZXN0L2dlbi1ub2RlanMtZXM2LyouanMnXSwKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIG5vZGU6IHRydWUsCisgICAgICAgICAgZXN2ZXJzaW9uOiA2LAogICAgICAgICB9CiAgICAgICB9CiAgICAgfSwKQEAgLTE1NCwxOSArMjgxLDQ3IEBACiAgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtY29udHJpYi1xdW5pdCcpOwogICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWNvbnRyaWItY29uY2F0Jyk7CiAgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtanNkb2MnKTsKLSAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1leHRlcm5hbC1kYWVtb24nKTsKLSAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1zaGVsbCcpOworICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LXNoZWxsLXNwYXduJyk7CiAKLSAgZ3J1bnQucmVnaXN0ZXJUYXNrKCd0ZXN0JywgWydqc2hpbnQnLCAnc2hlbGw6SW5zdGFsbFRocmlmdEpTJywgJ3NoZWxsOkluc3RhbGxUaHJpZnROb2RlSlNEZXAnLCAnc2hlbGw6VGhyaWZ0R2VuJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHRlcm5hbF9kYWVtb246VGhyaWZ0VGVzdFNlcnZlcicsICdleHRlcm5hbF9kYWVtb246VGhyaWZ0VGVzdFNlcnZlcl9UTFMnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoZWxsOlRocmlmdEdlbkRlZXBDb25zdHJ1Y3RvcicsICdxdW5pdDpUaHJpZnREZWVwQ29uc3RydWN0b3InLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1bml0OlRocmlmdEpTJywgJ3F1bml0OlRocmlmdEpTX1RMUycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hlbGw6VGhyaWZ0R2VuSlEnLCAncXVuaXQ6VGhyaWZ0SlNKUScsICdxdW5pdDpUaHJpZnRKU0pRX1RMUycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7Ci0gIGdydW50LnJlZ2lzdGVyVGFzaygnZGVmYXVsdCcsIFsnanNoaW50JywgJ3NoZWxsOkluc3RhbGxUaHJpZnRKUycsICdzaGVsbDpJbnN0YWxsVGhyaWZ0Tm9kZUpTRGVwJywgJ3NoZWxsOlRocmlmdEdlbicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXh0ZXJuYWxfZGFlbW9uOlRocmlmdFRlc3RTZXJ2ZXInLCAnZXh0ZXJuYWxfZGFlbW9uOlRocmlmdFRlc3RTZXJ2ZXJfVExTJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdW5pdDpUaHJpZnRKUycsICdxdW5pdDpUaHJpZnRKU19UTFMnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoZWxsOlRocmlmdEdlbkpRJywgJ3F1bml0OlRocmlmdEpTSlEnLCAncXVuaXQ6VGhyaWZ0SlNKUV9UTFMnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmNhdCcsICd1Z2xpZnknLCAnanNkb2MnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOworICBncnVudC5yZWdpc3RlclRhc2soJ3dhaXQnLCAnV2FpdCBqdXN0IG9uZSBzZWNvbmQgZm9yIHRoZSBzZXJ2ZXIgdG8gc3RhcnQnLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGRvbmUgPSB0aGlzLmFzeW5jKCk7CisgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgICAgIGRvbmUodHJ1ZSk7CisgICAgfSwgMTAwMCk7CisgIH0pOworCisgIGdydW50LnJlZ2lzdGVyVGFzaygnaW5zdGFsbEFuZEdlbmVyYXRlJywgWworICAgICdzaGVsbDpJbnN0YWxsVGhyaWZ0SlMnLAorICAgICdzaGVsbDpJbnN0YWxsVGhyaWZ0Tm9kZUpTRGVwJywKKyAgICAnc2hlbGw6VGhyaWZ0R2VuJywKKyAgICAnc2hlbGw6VGhyaWZ0R2VuRGVlcENvbnN0cnVjdG9yJywKKyAgICAnc2hlbGw6VGhyaWZ0R2VuRG91YmxlQ29uc3RhbnRzJywKKyAgICAnc2hlbGw6SW5zdGFsbFRlc3RMaWJzJywKKyAgICAnc2hlbGw6VGhyaWZ0QnJvd3NlcmlmeU5vZGVJbnQ2NCcsCisgICAgJ3NoZWxsOlRocmlmdEdlbkludDY0JworICBdKTsKKworICBncnVudC5yZWdpc3RlclRhc2soJ3Rlc3QnLCBbCisgICAgJ2luc3RhbGxBbmRHZW5lcmF0ZScsCisgICAgJ2pzaGludCcsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXInLAorICAgICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyX1RMUycsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzYnLAorICAgICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyRVM2X1RMUycsCisgICAgJ3dhaXQnLAorICAgICdxdW5pdDpUaHJpZnREZWVwQ29uc3RydWN0b3InLAorICAgICdxdW5pdDpUaHJpZnRKUycsCisgICAgJ3F1bml0OlRocmlmdEpTX1RMUycsCisgICAgJ3F1bml0OlRocmlmdEpTX0RvdWJsZVJlbmRlcmluZycsCisgICAgJ3F1bml0OlRocmlmdFdTJywKKyAgICAncXVuaXQ6VGhyaWZ0SlNKUScsCisgICAgJ3F1bml0OlRocmlmdEpTSlFfVExTJywKKyAgICAncXVuaXQ6VGhyaWZ0V1NFUzYnLAorICAgICdxdW5pdDpUaHJpZnRKU19JbnQ2NCcsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXI6a2lsbCcsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJfVExTOmtpbGwnLAorICAgICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyRVM2OmtpbGwnLAorICAgICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyRVM2X1RMUzpraWxsJywKKyAgXSk7CisgIGdydW50LnJlZ2lzdGVyVGFzaygnZGVmYXVsdCcsIFsndGVzdCcsICdjb25jYXQnLCAndWdsaWZ5JywgJ2pzZG9jJ10pOwogfTsKZGlmZiAtLWdpdCBhL2xpYi9qcy9NYWtlZmlsZS5hbSBiL2xpYi9qcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTM0MDQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNjIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCisjIFdlIGNhbGwgbnBtIGluc3RhbGwgdHdpY2UgdG8gd29yayBhcm91bmQgb2xkZXIgbnBtIGlzc3VlcworIyAobm90ZSB0aGVzZSBpc3N1ZXMgbWF5IG5vIGxvbmdlciBiZSBwcmVzZW50LCBidXQgaXQgaXMgb2spCisjCisKK2lmIEhBVkVfTlBNCisKK1NVQkRJUlMgPSB0ZXN0CisKK3ByZXJlcToKKwkkKE5QTSkgaW5zdGFsbCB8fCAkKE5QTSkgaW5zdGFsbAorCSQoTlBNKSBsaXN0CisKK2NoZWNrLWxvY2FsOiBwcmVyZXEgYWxsCisJLi9ub2RlX21vZHVsZXMvLmJpbi9ncnVudAorCitkb2M6IHByZXJlcQorCS4vbm9kZV9tb2R1bGVzLy5iaW4vZ3J1bnQganNkb2MKKworZW5kaWYKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZGlzdAorCSQoUk0pIC1yIGRvYworCSQoUk0pIC1yIG5vZGVfbW9kdWxlcworCSQoUk0pIC1yIHRlc3QvYnVpbGQvCisJJChSTSkgLXIgdGVzdC9nZW4tKi8KKworZGlzdC1ob29rOgorCSQoUk0pIC1yICQoZGlzdGRpcikvZGlzdC8KKwkkKFJNKSAtciAkKGRpc3RkaXIpL2RvYy8KKwkkKFJNKSAtciAkKGRpc3RkaXIpL25vZGVfbW9kdWxlcy8KKwkkKFJNKSAtciAkKGRpc3RkaXIpL3Rlc3QvYnVpbGQvCisJJChSTSkgLXIgJChkaXN0ZGlyKS90ZXN0L2dlbi0qLworCitFWFRSQV9ESVNUID0gXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCUdydW50ZmlsZS5qcyBcCisJcGFja2FnZS5qc29uIFwKKwlwYWNrYWdlLWxvY2suanNvbiBcCisJUkVBRE1FLm1kIFwKKwlzcmMgXAorCXRlc3QKZGlmZiAtLWdpdCBhL2xpYi9qcy9SRUFETUUubWQgYi9saWIvanMvUkVBRE1FLm1kCmluZGV4IGRmYTZlODIuLjVjN2ExYzIgMTAwNjQ0Ci0tLSBhL2xpYi9qcy9SRUFETUUubWQKKysrIGIvbGliL2pzL1JFQURNRS5tZApAQCAtMzgsMTkgKzM4LDEyIEBACiBzb3VyY2VzIGZyb20gdGhlIGludGVybmV0LiBUbyBidWlsZCB0aGUgSmF2YVNjcmlwdCBicmFuY2gKIG9mIEFwYWNoZSBUaHJpZnQgZXhlY3V0ZSB0aGUgY29tbWFuZDoKIAotICAgIGdydW50CisgICAgbnB4IGdydW50CiAgICAgCi1UaGlzIHJ1bnMgdGhlIGdydW50IGJ1aWxkIHRvb2wsIGxpbnRpbmcgYWxsIG9mIHRoZSBzb3VyY2UKLWZpbGVzLCBzZXR0aW5nIHVwIGFuZCBydW5uaW5nIHRoZSB0ZXN0cywgY29uY2F0ZW5hdGluZyBhbmQKLW1pbmlmeWluZyB0aGUgbWFpbiBsaWJyYXJpZXMgYW5kIGdlbmVyYXRpbmcgdGhlIGh0bWwgCi1kb2N1bWVudGF0aW9uLgotCi1JZiBncnVudCBpcyBub3QgaW5zdGFsbGVkIHlvdSBjYW4gaW5zdGFsbCBpdCB3aXRoIG5wbQotbGlrZSB0aGlzOgotCi0gICBzdWRvIG5wbSBpbnN0YWxsIC1nIGdydW50LWNsaQotICAgbnBtIGluc3RhbGwgZ3J1bnQgLS1zYXZlLWRldgotCitUaGlzIHJ1bnMgdGhlIGdydW50IGJ1aWxkIHRvb2wgKGZyb20gd2l0aGluIGAuL25vZGVfbW9kdWxlcy8uYmluL2ApLAorbGludGluZyBhbGwgb2YgdGhlIHNvdXJjZSBmaWxlcywgc2V0dGluZyB1cCBhbmQgcnVubmluZyB0aGUKK3Rlc3RzLCBjb25jYXRlbmF0aW5nIGFuZCBtaW5pZnlpbmcgdGhlIG1haW4gbGlicmFyaWVzIGFuZAorZ2VuZXJhdGluZyB0aGUgaHRtbCBkb2N1bWVudGF0aW9uLgogCiBUcmVlCiAtLS0tCkBAIC0xNDUsMyArMTM4LDggQEAKIAogICAgIHRocmlmdCAtLWdlbiBqczp0cyBmaWxlLnRocmlmdAogCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMy4wCisKKzEuIDY0LWJpdCBpbnRlZ2VyIGNvbnN0YW50cyBhcmUgbm93IGdlbmVyYXRkIHVzaW5nIG5vZGUtaW50NjQgZS5nLjogdmFyIHggPSBuZXcgSW50NjQoIjdmZmZmZmZmZmZmZmZmZmYiKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy9wYWNrYWdlLWxvY2suanNvbiBiL2xpYi9qcy9wYWNrYWdlLWxvY2suanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTEwODE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3BhY2thZ2UtbG9jay5qc29uCkBAIC0wLDAgKzEsNTA2MyBAQAoreworICAibmFtZSI6ICJ0aHJpZnQiLAorICAidmVyc2lvbiI6ICIwLjEzLjAiLAorICAibG9ja2ZpbGVWZXJzaW9uIjogMSwKKyAgInJlcXVpcmVzIjogdHJ1ZSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiSlNPTlN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9KU09OU3RyZWFtLy0vSlNPTlN0cmVhbS0xLjMuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRStpcnVOT1k4VlY5czRKRWJlMWFORW02TWlzelBSci9VZmNITXowVFFoMUJYU3hISytBU1YxUjZXNEhwakJoU2VTKzU0UElzQU1DQm13RDA2TExzcVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImpzb25wYXJzZSI6ICJeMS4yLjAiLAorICAgICAgICAidGhyb3VnaCI6ICI+PTIuMi43IDwzIgorICAgICAgfQorICAgIH0sCisgICAgImFiYnJldiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hYmJyZXYvLS9hYmJyZXYtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW5uZTkvSWlRL2h6SWhZNnBkRG5iQnR6N0RqUFRLclkwMFAvenZQU201cE9Ga2w2eHVHckduWG4vVnRUTk5mTnRBZlo5LzFSdGVoa3N6VTlxY1RpaTBRPT0iCisgICAgfSwKKyAgICAiYWNvcm4iOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWNvcm4vLS9hY29ybi02LjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVlk0aTVFS1NLa29mWTJJKzZRTFRiVFROL1V2RVFQQ282ZWl3enpTYVNXZnBhRGhPbVN0TUNNb2Q2d211UGNpTnErWFMwZmFDZ2xGdTJsSFpwZEhVdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFjb3JuLWR5bmFtaWMtaW1wb3J0IjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fjb3JuLWR5bmFtaWMtaW1wb3J0Ly0vYWNvcm4tZHluYW1pYy1pbXBvcnQtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWQzT0VqUVY0Uk9wb2Zsc25VQThIb3pvSVI1MDRURnhOaXZZRVVpNnV3ejBJWWhCa1REWEd1V2xOZE10eWJSdDNucVZ4L0w2WHFNdDBGeGtYdVdLWmh3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhY29ybi1ub2RlIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fjb3JuLW5vZGUvLS9hY29ybi1ub2RlLTEuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ySWhORVp1Tkk4aWJRY0w3QU5tL21HeVB1a0lhWnNSTlg5cHNGTlFVUnlKVzBudTZrOHdqU0RsZDIwejZ2Mm1EQldxWDEzcElFbms5Z0daSkhJbEVYZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWNvcm4iOiAiXjYuMC4yIiwKKyAgICAgICAgImFjb3JuLWR5bmFtaWMtaW1wb3J0IjogIl40LjAuMCIsCisgICAgICAgICJhY29ybi13YWxrIjogIl42LjEuMCIsCisgICAgICAgICJ4dGVuZCI6ICJeNC4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYWNvcm4td2FsayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hY29ybi13YWxrLy0vYWNvcm4td2Fsay02LjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItT3RVdzZKVVRneEEyUW9xcW1ybVE3RjJOWXFpQlBpL0wyanFIeUZ0bGxoT1V2WFlRWGYwWjFDWVVpbklmeVQ0YlRDR21yQTdnWDlGdkhBODF1ekNvVnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFnZW50LWJhc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWdlbnQtYmFzZS8tL2FnZW50LWJhc2UtNC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUpWd1hNcjluSFlUVVhzQkZLVXFoSnd2bGNZVS9ibHJlT0VVa2hOUjJlWFpJdndkK2MrbzVWNE1nRFBLV25NUy81NmF3TjNUUnpJUCtLb1BuK3JvUXRnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlczYtcHJvbWlzaWZ5IjogIl41LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhanYiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWp2Ly0vYWp2LTUuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYzdYdXlqK3JaVDQ5UDVRaXMwR3RRaUJkeVdVPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjbyI6ICJeNC42LjAiLAorICAgICAgICAiZmFzdC1kZWVwLWVxdWFsIjogIl4xLjAuMCIsCisgICAgICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6ICJeMi4wLjAiLAorICAgICAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiAiXjAuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImFsaWduLXRleHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWxpZ24tdGV4dC8tL2FsaWduLXRleHQtMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ETmtLVmhDVDgxMEttU1ZzSXJjR2xEUDYwUmM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiLAorICAgICAgICAibG9uZ2VzdCI6ICJeMS4wLjEiLAorICAgICAgICAicmVwZWF0LXN0cmluZyI6ICJeMS41LjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJhbnNpLXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktcmVnZXgvLS9hbnNpLXJlZ2V4LTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzdNNnRlNDJEWWJnNWlqd1Jvcm43eWZXVk44PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFuc2ktc3R5bGVzIjogeworICAgICAgInZlcnNpb24iOiAiMy4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMy4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVZUMFpJNmtaUmRUaDhZeUp3M1NNYlltL3UrTnFmc0F4RXBXTzBQZjlzcTgvZTk0V3h4T3BQS3g5RlIxRmx5Q3RPVkROT1ErOG50bHFGeGlSYytyNXFBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xvci1jb252ZXJ0IjogIl4xLjkuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhcmdwYXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJncGFyc2UvLS9hcmdwYXJzZS0xLjAuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW81Um95NnRORzRTTC9GT2tDQU42UnpqaWFrWlMyNVJMWUZyY010dEpxYmRkOEJXcm5BK2ZHejU3aU41UGIwNnB2Qkd2bDVnUTBCNDhkSmxzbFh2b1RnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcHJpbnRmLWpzIjogIn4xLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAic3ByaW50Zi1qcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwcmludGYtanMvLS9zcHJpbnRmLWpzLTEuMC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUJPYVNiMllvbFRWUFBkQVZJRFl6dUZjcGZpdz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJhcnItZGlmZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnItZGlmZi8tL2Fyci1kaWZmLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMWtZUWRQNi83SEhuNFZJMWRob3ltbDNIeFNBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFyci1mbGF0dGVuIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fyci1mbGF0dGVuLy0vYXJyLWZsYXR0ZW4tMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUwzaEtWNVIvcDVvODFSN08wMklHbndwRG1rcDZFOTgyWGh0YnV3U2UzTzRxT3RNTU10b2RpY0FTQTFDbnkyVSthQ1hjTnBtbCttNGRQc3ZzSjNqYXRnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnItdW5pb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyLXVuaW9uLy0vYXJyLXVuaW9uLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNDVzSnJxbmUrR2FvOGdiaWlLOWprWnV1T2NRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LWVhY2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktZWFjaC8tL2FycmF5LWVhY2gtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wNVN2REFXckYxS0VidWRUb2ZJUm9GdWd4RTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktZmlsdGVyIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LWZpbHRlci8tL2FycmF5LWZpbHRlci0wLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZhalBMaVppanRjeWdEV0IvU0gyZkt6Uzd1dz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS1maW5kLWluZGV4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LWZpbmQtaW5kZXgvLS9hcnJheS1maW5kLWluZGV4LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM3dFS29TaCtGa3U5cHZseU93cVdvZXhCaDZFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS1tYXAvLS9hcnJheS1tYXAtMC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pS0s2dHowYzk3elZ3YkVZb0FQMmIyWmZwbUk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktcmVkdWNlIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXJlZHVjZS8tL2FycmF5LXJlZHVjZS0wLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUZ6aVowLy9SeDlrNFBrUjVVbDIrSjR5clh5cz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS1zbGljZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS1zbGljZS8tL2FycmF5LXNsaWNlLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1CMXFNRDNSQlA3TzhvMEgyS2JyWER5QjBJY2Nlak1GMTUrODdMdmxvcjEyT05QUkhQNmdUalhNTmt0L2QzWnVPR2JBZTY2aEZtYUNmRUNJMjRVZnA2dz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktdW5pcXVlIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXVuaXF1ZS8tL2FycmF5LXVuaXF1ZS0wLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFKUzNYVXZFOXMxbm52TWtTcC9ZOUdyaTFDZz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc24xIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzbjEvLS9hc24xLTAuMi40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qeHd6UXBMUWpTbVdYZ3dhQ1pFOU56K2dsQUcwMXlGMVFuV2diaEd3SEk1QTZGUklFWTZJVnF0SGhJZXBIcUk3L2t5RXlRRWFnQkM1bUJFRmxJWXZkZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmVyLWJ1ZmZlciI6ICJ+Mi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYXNuMS5qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMTAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXNuMS5qcy8tL2FzbjEuanMtNC4xMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1wMzJjT0Y1cTBacXM5dUJpT05LWUxtNkJDbENvQkNNNU85SmZlVVNsblFMQlR4WWRUSytwVytuWGZsbThVa0tkMlVZbEViWXo1cUVpMEp1WlI5Y2tTdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYm4uanMiOiAiXjQuMC4wIiwKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJtaW5pbWFsaXN0aWMtYXNzZXJ0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhc3NlcnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXNzZXJ0Ly0vYXNzZXJ0LTEuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbVpFdFdSZzJ0YWIxczBYQThIN3Z3SS9HWFpFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInV0aWwiOiAiMC4xMC4zIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJpbmhlcml0cyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luaGVyaXRzLy0vaW5oZXJpdHMtMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtc1gwSTB5YTBRajVXanY5eG41R3dzY3ZmYWZFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInV0aWwiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4xMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dGlsLy0vdXRpbC0wLjEwLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZXZzYS9sQ0FVa1pJbmoyMy9nN1RlVE5xd1BrPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImluaGVyaXRzIjogIjIuMC4xIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImFzc2VydC1wbHVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fzc2VydC1wbHVzLy0vYXNzZXJ0LXBsdXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04UzRQUEYxM3NMSE4yUlJwUXVUcGJCNU4xU1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXNzaWduLXN5bWJvbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXNzaWduLXN5bWJvbHMvLS9hc3NpZ24tc3ltYm9scy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdXWi9RZnJkVHlETXZDdTVhNDFQZjNqc0EyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMS41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03R3BocmxaSURBdzhza0hKVmhqaUNKTDVaeW89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMtbGltaXRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy1saW1pdGVyLy0vYXN5bmMtbGltaXRlci0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanAvdUZub29PaU8rTDIxMWVaT29TeXpwT0lUTVh4MXJCSVRhdVl5a0czQlJZUHU4aDBVY3hzUE5CMDRSUjV2bzRUeXozK2F5MTd0UjZKVmY5cXpZV2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5ja2l0IjogeworICAgICAgInZlcnNpb24iOiAiMC40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5ja2l0Ly0vYXN5bmNraXQtMC40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS14NTdaZjM4MHk0OHJvYnlYa0x6RFprZExTM2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImF0b2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXRvYi8tL2F0b2ItMi4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVdtNnVrb2FPR0ppLzczcC9jbDJHdkxqVEk1Sk0xay9PMTRpc0Q3M1lNTDhTdHJILzcvbFJGZ21nOG5JQ1pnRDNiWlp2andDR3h0TU9EM3dXTkF1OGNnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhd3Mtc2lnbjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXdzLXNpZ24yLy0vYXdzLXNpZ24yLTAuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdEc2SkNUU3BXUjh0TDIrRzErYXA4YlArZHFnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJhd3M0IjogeworICAgICAgInZlcnNpb24iOiAiMS44LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F3czQvLS9hd3M0LTEuOC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SZVp4dk5ISU92ODhGbFQ3cnhjWElJQzBmUHQ0S1pxWmJPbGl2eVd0WEx0OEVTeDg0emQza01DNmlLNWpWZVMycXQrZzdmdFM3eWU0ZmkwNlg1cnRSUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImJhYnlsb24iOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWJ5bG9uLy0vYmFieWxvbi03LjAuMC1iZXRhLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WZzBDOXMvUkVYNi9XSVhOMzdVS3B2NVpoUmk2QTRwakhscGtFMzQrOC9hNmMyVzFRNjkybjNobWMrU1pHNWxLUm5hRXhMVWJ4dEoxU1ZUK0thQ1EvQT09IgorICAgIH0sCisgICAgImJhbGFuY2VkLW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JhbGFuY2VkLW1hdGNoLy0vYmFsYW5jZWQtbWF0Y2gtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pYlRSbWFzcjdrbmVGazZnSzRuT1JpMXh0MmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFzZS8tL2Jhc2UtMC4xMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi01VDZQNHhQZ3BwMFlERnZTV3dFWjROb0UzYU00UUJRWER6bVZicmFDa0ZqOHpITSttYmE4U3lxQjVEYlpXeVI3bVlIbzZZN0JkUW8zTW9BNG0wVGVRZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FjaGUtYmFzZSI6ICJeMS4wLjEiLAorICAgICAgICAiY2xhc3MtdXRpbHMiOiAiXjAuMy41IiwKKyAgICAgICAgImNvbXBvbmVudC1lbWl0dGVyIjogIl4xLjIuMSIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIsCisgICAgICAgICJtaXhpbi1kZWVwIjogIl4xLjIuMCIsCisgICAgICAgICJwYXNjYWxjYXNlIjogIl4wLjEuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWRwNjZyejlLWTZyVHI1Nk5NRXlidm5tL3NPWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tNWhuSFRrY1ZzUGZxeDNBS2x5dHRJUGI3SitYeWtIdkpQMkI5YlpEamxoTElvRXE0WG9LNjRWZzdib1psVldZSzZMVVk5NGRZUEVFN0xoMFprWktjUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItamJSWHkxRm10QW9DalFrVm1JVll3dXVxREZVYmFPZURqbWVkMXRPR1Byc01odEpBNHJEOXRrZ0EwRjFxSjNnUkZSWGNIWVZrZGVhUDUwUTVyRS9qTFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJlaXM1V3FRR1Y3cGVvb0R5TG1ORVBVcnBzOStTWFg1YzlwTDN4RUIrNGU5SG5HdURhN21CN2tIeEh3NENicVM5azFUMmhPSDNtaUw4bjhXdGlZVnRnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYmFzZTY0LWpzIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Jhc2U2NC1qcy8tL2Jhc2U2NC1qcy0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItY2Nhdi95R3ZvYTgwQlFEbGpDeHNtbVEzWHZ4NjAvVXBCSWlqNVFOMjFXM3dCaS9oaElDOU9vTytLTHB1OUlKVFM5ajREUlZKM2FEREY5Y01Tb2EybHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJjcnlwdC1wYmtkZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iY3J5cHQtcGJrZGYvLS9iY3J5cHQtcGJrZGYtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wREFkT0p0cVEvbTJmL1BLRWFQMlkzNDJEcDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInR3ZWV0bmFjbCI6ICJeMC4xNC4zIgorICAgICAgfQorICAgIH0sCisgICAgImJsdWViaXJkIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JsdWViaXJkLy0vYmx1ZWJpcmQtMy41LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLS9xS1BVUWxhVzFPeVI1MVdlQ1BCdlJuQWxuWkZVSmtDU0c1SHpHbnVJcWhneUp0RitUOTRsRm5uMzNlaWF6alJtMkxBSFZ5Mmd1Tm5hcTQ4WDlTSnV3PT0iCisgICAgfSwKKyAgICAiYm4uanMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjExLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JuLmpzLy0vYm4uanMtNC4xMS44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1JdGZZZlBMa1dIVWpja1FDazh4QytMd3hnSzhOWWNYeXdHaWdKZ1N3T1A4WTJpeVdUNGYydnNabm9PWFRUYm8rbzV5WG1JVUo0Z241NTM4U081UzNnQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnJhY2UtZXhwYW5zaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icmFjZS1leHBhbnNpb24vLS9icmFjZS1leHBhbnNpb24tMS4xLjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pQ3VQSERGZ3JIWDdIMnZFSS81eHB6MDd6U0hCMDBUcHVncWhtWXRWbU1PNjUxOG1DdVJNb09ZRmxkRUJsMGcxODd1Zm96ZGFIZ1dLY1lGYjYxcUdpQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFsYW5jZWQtbWF0Y2giOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbmNhdC1tYXAiOiAiMC4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYnJhY2VzIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JyYWNlcy8tL2JyYWNlcy0yLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYU5kYm5qOVA4UGpkWFU0eWJhV0xLMklGM2pjL0VvRFliQzdBYXpXNnRvM1RSc2ZYeHNjQzlVWE9CNWlEaUVRcmt5SWJXcDJTTFFkYTQrUUFhN25jM3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci1mbGF0dGVuIjogIl4xLjEuMCIsCisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICJmaWxsLXJhbmdlIjogIl40LjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiLAorICAgICAgICAicmVwZWF0LWVsZW1lbnQiOiAiXjEuMS4yIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInNuYXBkcmFnb24tbm9kZSI6ICJeMi4wLjEiLAorICAgICAgICAic3BsaXQtc3RyaW5nIjogIl4zLjAuMiIsCisgICAgICAgICJ0by1yZWdleCI6ICJeMy4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYnJvcmFuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icm9yYW5kLy0vYnJvcmFuZC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUVzSmUva0NrWGp3eVByaG5XZ29NNVhzaU54OD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJicm93c2VyLXBhY2siOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJvd3Nlci1wYWNrLy0vYnJvd3Nlci1wYWNrLTYuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lcll1ZzhYb3F6VTNJZmNVOGZVZ3lIcXlPWHFJRTR0VVRUUSs3bXFValFsdm5Ya09PNk9sVDljL1pvSlZIWW9BYXFHeHIwOUNONTNHN1hJc080S3RXQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiSlNPTlN0cmVhbSI6ICJeMS4wLjMiLAorICAgICAgICAiY29tYmluZS1zb3VyY2UtbWFwIjogIn4wLjguMCIsCisgICAgICAgICJkZWZpbmVkIjogIl4xLjAuMCIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4xLjEiLAorICAgICAgICAidGhyb3VnaDIiOiAiXjIuMC4wIiwKKyAgICAgICAgInVtZCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYnJvd3Nlci1yZXNvbHZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icm93c2VyLXJlc29sdmUvLS9icm93c2VyLXJlc29sdmUtMS4xMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1leERpMUJZV0IvNnJhS0htRFRDaWNRZlRrcXdONWZpb01GVjRqOEJzZk1VNFIyREsvUWZaZks3a09Wa21XQ05BTmYwc25rQnpxR3FBSkJhbzlnWk1kUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVzb2x2ZSI6ICIxLjEuNyIKKyAgICAgIH0KKyAgICB9LAorICAgICJicm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMTYuMi4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icm93c2VyaWZ5Ly0vYnJvd3NlcmlmeS0xNi4yLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXpRdC9HZDErVytJWStoL3hYMk5ZTVc0b3JRV2hxU3d5Vit4c2JseWNUdHBPdUIyN2gxZlpoaE5RdWlwSjR0NzlvaHc0UDRtTWVtMGpwL1prSVNRdGpRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJKU09OU3RyZWFtIjogIl4xLjAuMyIsCisgICAgICAgICJhc3NlcnQiOiAiXjEuNC4wIiwKKyAgICAgICAgImJyb3dzZXItcGFjayI6ICJeNi4wLjEiLAorICAgICAgICAiYnJvd3Nlci1yZXNvbHZlIjogIl4xLjExLjAiLAorICAgICAgICAiYnJvd3NlcmlmeS16bGliIjogIn4wLjIuMCIsCisgICAgICAgICJidWZmZXIiOiAiXjUuMC4yIiwKKyAgICAgICAgImNhY2hlZC1wYXRoLXJlbGF0aXZlIjogIl4xLjAuMCIsCisgICAgICAgICJjb25jYXQtc3RyZWFtIjogIl4xLjYuMCIsCisgICAgICAgICJjb25zb2xlLWJyb3dzZXJpZnkiOiAiXjEuMS4wIiwKKyAgICAgICAgImNvbnN0YW50cy1icm93c2VyaWZ5IjogIn4xLjAuMCIsCisgICAgICAgICJjcnlwdG8tYnJvd3NlcmlmeSI6ICJeMy4wLjAiLAorICAgICAgICAiZGVmaW5lZCI6ICJeMS4wLjAiLAorICAgICAgICAiZGVwcy1zb3J0IjogIl4yLjAuMCIsCisgICAgICAgICJkb21haW4tYnJvd3NlciI6ICJeMS4yLjAiLAorICAgICAgICAiZHVwbGV4ZXIyIjogIn4wLjEuMiIsCisgICAgICAgICJldmVudHMiOiAiXjIuMC4wIiwKKyAgICAgICAgImdsb2IiOiAiXjcuMS4wIiwKKyAgICAgICAgImhhcyI6ICJeMS4wLjAiLAorICAgICAgICAiaHRtbGVzY2FwZSI6ICJeMS4xLjAiLAorICAgICAgICAiaHR0cHMtYnJvd3NlcmlmeSI6ICJeMS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4xIiwKKyAgICAgICAgImluc2VydC1tb2R1bGUtZ2xvYmFscyI6ICJeNy4wLjAiLAorICAgICAgICAibGFiZWxlZC1zdHJlYW0tc3BsaWNlciI6ICJeMi4wLjAiLAorICAgICAgICAibWtkaXJwIjogIl4wLjUuMCIsCisgICAgICAgICJtb2R1bGUtZGVwcyI6ICJeNi4wLjAiLAorICAgICAgICAib3MtYnJvd3NlcmlmeSI6ICJ+MC4zLjAiLAorICAgICAgICAicGFyZW50cyI6ICJeMS4wLjEiLAorICAgICAgICAicGF0aC1icm93c2VyaWZ5IjogIn4wLjAuMCIsCisgICAgICAgICJwcm9jZXNzIjogIn4wLjExLjAiLAorICAgICAgICAicHVueWNvZGUiOiAiXjEuMy4yIiwKKyAgICAgICAgInF1ZXJ5c3RyaW5nLWVzMyI6ICJ+MC4yLjAiLAorICAgICAgICAicmVhZC1vbmx5LXN0cmVhbSI6ICJeMi4wLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjAuMiIsCisgICAgICAgICJyZXNvbHZlIjogIl4xLjEuNCIsCisgICAgICAgICJzaGFzdW0iOiAiXjEuMC4wIiwKKyAgICAgICAgInNoZWxsLXF1b3RlIjogIl4xLjYuMSIsCisgICAgICAgICJzdHJlYW0tYnJvd3NlcmlmeSI6ICJeMi4wLjAiLAorICAgICAgICAic3RyZWFtLWh0dHAiOiAiXjIuMC4wIiwKKyAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIl4xLjEuMSIsCisgICAgICAgICJzdWJhcmciOiAiXjEuMC4wIiwKKyAgICAgICAgInN5bnRheC1lcnJvciI6ICJeMS4xLjEiLAorICAgICAgICAidGhyb3VnaDIiOiAiXjIuMC4wIiwKKyAgICAgICAgInRpbWVycy1icm93c2VyaWZ5IjogIl4xLjAuMSIsCisgICAgICAgICJ0dHktYnJvd3NlcmlmeSI6ICIwLjAuMSIsCisgICAgICAgICJ1cmwiOiAifjAuMTEuMCIsCisgICAgICAgICJ1dGlsIjogIn4wLjEwLjEiLAorICAgICAgICAidm0tYnJvd3NlcmlmeSI6ICJeMS4wLjAiLAorICAgICAgICAieHRlbmQiOiAiXjQuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJicm93c2VyaWZ5LXpsaWIiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icm93c2VyaWZ5LXpsaWIvLS9icm93c2VyaWZ5LXpsaWItMC4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1aOTQyUnlzSFhtSnJocWs4OEZtS0JWcS92NXRxbVNrRHo3cDU0Ry9NR3lqTW5DRkZuQzc5WFdOYmcrVnRhOFc2V2IycXRTWlRTeElHa0pyUnBDRkVpQT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAicGFrbyI6ICJ+MS4wLjUiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdmNmdWlJeG9nTFY0RGxHQkhJVU93STBJYnJKOEhXUGM0TVU3SHp2aUdlTmhvL1VKRGZpNkI1cDNzSGVXSVEwS0dJVTBKcHhpNVpIeGVtUWZMa2tBd1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAicGFrbyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuNyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bha28vLS9wYWtvLTEuMC43LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItM0hOSzV0VzR4OG81bU84UnVIWnAzWWR3OWljWlh4MFJBTkFPTXpsTXp4N0xWWGhNSjRtbzNNT0JwenlkN3IvK1JVdThCbW5kUDQ3TFhUK3Z6anRXY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjMuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMy42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdFF0S0E5V0lBaEJGMytWTEFzZXlNcVplQmpXMEFISm94T3RZcVNVWk5KeGF1RXJtTGJWbTJGVzF5K0ovWUE5ZFVyQUMzOUlUZWpsWldoVkl3YXdrS3c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICAgICAiaXNhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4yLjAuMCIsCisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4xIiwKKyAgICAgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MS4xLjEiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9LAorICAgICAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0xLjEuMS50Z3oiLAorICAgICAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uL1NobnZEaTZGSGJiVmZ2aXJvK1dvamlGenYrczhNUE1IQmN6VmVQZlVwREpMd29MVDBodDFsNFl3QkNiaThwSkF2ZUVFZG5rSHlQeVRQL216UmZ3Zz09IiwKKyAgICAgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4wIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmdfZGVjb2Rlci8tL3N0cmluZ19kZWNvZGVyLTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItNllxeVg2WldFWWd1QXhnWnpIR0w3U3NDZUd4M1YyVHRPVHFaejF4U1RTV25xc2JXd2JwdGFmTnl2Zi9BQ3F1WlVYVjNEQU5yNUJESXdOWWUxbU40Mnc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgInNhZmUtYnVmZmVyIjogIn41LjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJicm93c2VyaWZ5LWFlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXJpZnktYWVzLy0vYnJvd3NlcmlmeS1hZXMtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLSs3Q0hYcUd1c3BVbi9TbDVhTzdFYTB4V0dBdEVUUFhOU0FqSG80OEpmTGRQV2NNbmczM1hlNHpuRnZRd2VxYy91ems1elNPSTNINTJDWW5qQ2ZiNWhBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWZmZXIteG9yIjogIl4xLjAuMyIsCisgICAgICAgICJjaXBoZXItYmFzZSI6ICJeMS4wLjAiLAorICAgICAgICAiY3JlYXRlLWhhc2giOiAiXjEuMS4wIiwKKyAgICAgICAgImV2cF9ieXRlc3Rva2V5IjogIl4xLjAuMyIsCisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjEiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImJyb3dzZXJpZnktY2lwaGVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXJpZnktY2lwaGVyLy0vYnJvd3NlcmlmeS1jaXBoZXItMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXNQaGt6MEFSS2JmNHJSUXQyaFRwQUhxbjQ3WDNsbExrVUduK3hFSnpMandZOExSczJwMHY3bGp2STVFeW9STy9tZXhyTnVuTkVDaXNacytndzJ6ejF3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJicm93c2VyaWZ5LWFlcyI6ICJeMS4wLjQiLAorICAgICAgICAiYnJvd3NlcmlmeS1kZXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImV2cF9ieXRlc3Rva2V5IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJicm93c2VyaWZ5LWRlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icm93c2VyaWZ5LWRlcy8tL2Jyb3dzZXJpZnktZGVzLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1CaW9PMXhmM2hGd3o0a2M2aUJoSTNpZURGb21wTWhyTWxuREZDNC8wL3ZkNU1va3B1QWMzUitMWWJ3VEE5QTVZYzlwcTlVWVBxZmZLcFcyT2J1d1g1QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2lwaGVyLWJhc2UiOiAiXjEuMC4xIiwKKyAgICAgICAgImRlcy5qcyI6ICJeMS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4xIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjEuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJicm93c2VyaWZ5LXJzYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXJpZnktcnNhLy0vYnJvd3NlcmlmeS1yc2EtNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JZUNyK3ZieUFwenkrdnNUTldlbkFkUVRWU1E9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYm4uanMiOiAiXjQuMS4wIiwKKyAgICAgICAgInJhbmRvbWJ5dGVzIjogIl4yLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJicm93c2VyaWZ5LXNpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJvd3NlcmlmeS1zaWduLy0vYnJvd3NlcmlmeS1zaWduLTQuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcWs2MmpsMTdaWXVxYS9hbGZtTU12WHFUMHBnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJuLmpzIjogIl40LjEuMSIsCisgICAgICAgICJicm93c2VyaWZ5LXJzYSI6ICJeNC4wLjAiLAorICAgICAgICAiY3JlYXRlLWhhc2giOiAiXjEuMS4wIiwKKyAgICAgICAgImNyZWF0ZS1obWFjIjogIl4xLjEuMiIsCisgICAgICAgICJlbGxpcHRpYyI6ICJeNi4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4xIiwKKyAgICAgICAgInBhcnNlLWFzbjEiOiAiXjUuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImJyb3dzZXJpZnktemxpYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icm93c2VyaWZ5LXpsaWIvLS9icm93c2VyaWZ5LXpsaWItMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11elg0cFJuMkFPRDZhNFNGSkJ5WG5RRkIreTA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGFrbyI6ICJ+MC4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiNS4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci8tL2J1ZmZlci01LjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYytLbzBsb0RhRmZ1UFdpTDAybHM5WGQzR08zY1BWbVVvYlE2dDNyWE5VazMwNHU2aEdxKzhOL2tGaStRRUlLaHpLM3V3b2xWaEx6c3ptZkxtTUxucWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhc2U2NC1qcyI6ICJeMS4wLjIiLAorICAgICAgICAiaWVlZTc1NCI6ICJeMS4xLjQiCisgICAgICB9CisgICAgfSwKKyAgICAiYnVmZmVyLWZyb20iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLWZyb20vLS9idWZmZXItZnJvbS0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTVFjWEVVYkNLdEVvN2JocUVzNjU2MEh5ZDRYYW92WmxPL2s5VjNoalZVRi96d1c3S0JWZFNLNGdJdC9iendTOU1iUjVxb2IrRjVqdXNac2IwWVFLMkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1ZmZlci1zaGltcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItc2hpbXMvLS9idWZmZXItc2hpbXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tWGpPTVhPSXhrbXRoNU1DakRSMzd3UktpMUU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnVmZmVyLXhvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXIteG9yLy0vYnVmZmVyLXhvci0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUp1WWUwVUl2dHczVUxtNDJjcDdWSFlWZjZOaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWlsdGluLW1vZHVsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVpbHRpbi1tb2R1bGVzLy0vYnVpbHRpbi1tb2R1bGVzLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSnc4SGJGcHl3QzliWmFSOStVeGY0Nko0aVM4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1aWx0aW4tc3RhdHVzLWNvZGVzIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1aWx0aW4tc3RhdHVzLWNvZGVzLy0vYnVpbHRpbi1zdGF0dXMtY29kZXMtMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oWmdvZU9JYm1PSEdaQ1hnUFFGMGVJOVdudWc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FjaGUtYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYWNoZS1iYXNlLy0vY2FjaGUtYmFzZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQUtjZFRuRlNXQVRkNS9HQ1BSeHIyQ2h3SUo4NUNleXJFeWpSSGxLeFE1NmQ0WEpNR3ltMHVBaUtuMHhiTE9HT2wzK3lScE9UaTQ4NGRWQ0VjNUFVelE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbGxlY3Rpb24tdmlzaXQiOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbXBvbmVudC1lbWl0dGVyIjogIl4xLjIuMSIsCisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImhhcy12YWx1ZSI6ICJeMS4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIiwKKyAgICAgICAgInNldC12YWx1ZSI6ICJeMi4wLjAiLAorICAgICAgICAidG8tb2JqZWN0LXBhdGgiOiAiXjAuMy4wIiwKKyAgICAgICAgInVuaW9uLXZhbHVlIjogIl4xLjAuMCIsCisgICAgICAgICJ1bnNldC12YWx1ZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FjaGVkLXBhdGgtcmVsYXRpdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FjaGVkLXBhdGgtcmVsYXRpdmUvLS9jYWNoZWQtcGF0aC1yZWxhdGl2ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNXIyR3Fzb0ViNHFNVFROOUorV3pYZmpvditoanhUK2ozdTVLK2tJVk5Jd0FkOTlETENKRTlwQklNUDFxVmV5YlY2SmlpakwzODVPejBEY1l4ZmJPSWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhbWVsY2FzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2UvLS9jYW1lbGNhc2UtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mQjBXMW5taHUrV2NvQ3lzN1BzQkhpQWZXaDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FtZWxjYXNlLWtleXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2Uta2V5cy8tL2NhbWVsY2FzZS1rZXlzLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUl2dXIvM3lnUmtGSHZvZGt5SVR5UnVQa3VjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6ICJeMi4wLjAiLAorICAgICAgICAibWFwLW9iaiI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FzZWxlc3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEyLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nhc2VsZXNzLy0vY2FzZWxlc3MtMC4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJnY0lmK0VBenlDWlVNSkJvbENEUmh4VWR3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJjYXRoYXJzaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjguOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2F0aGFyc2lzLy0vY2F0aGFyc2lzLTAuOC45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbU15SkRLWlMzUzd3NXdzM2tsTVEvNTZRL0lzPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiAifjAuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNlbnRlci1hbGlnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jZW50ZXItYWxpZ24vLS9jZW50ZXItYWxpZ24tMC4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xZzB5WXB0dTZYSWdCQkhMMUVZY2tIdkN0NjA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWxpZ24tdGV4dCI6ICJeMC4xLjMiLAorICAgICAgICAibGF6eS1jYWNoZSI6ICJeMS4wLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY2hhbGsiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0yLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItT2JONmgxdjJmVEpTbVVYb1Mzbk1ROTJMYkRLOWJlNFRWKzZHK29tUWxHSkZkY1VYNWhlS2kxTFoxWW5STUlnd1RMRWozRTI0YlQ2dFluaTUwcmxDZlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogIl4zLjIuMSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjUiLAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjUuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNpcGhlci1iYXNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NpcGhlci1iYXNlLy0vY2lwaGVyLWJhc2UtMS4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUtraHQ1eWU2Wkdtd3Y0MHVVRFp6dGF5VDJUaExRR2Zuai9UNzFOL1h6ZVplbzNuZjhmb3lXN3pHVHNQWWtFeWEzbTVmM2NBeXBIK3FlN1lPck0xVTJRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjEiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImNsYXNzLXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsYXNzLXV0aWxzLy0vY2xhc3MtdXRpbHMtMC4zLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFPaFBhL0ZqN3M2VFk4SDhlc0d1NVFOcE1NUXh6NzloK3VyenJOWU42bW4rOUJueGxER2Y1UVorWGVDRHN4U2pQcXNTUjU2WE9aT0ptcGV1cm5MTWVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItdW5pb24iOiAiXjMuMS4wIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIiwKKyAgICAgICAgInN0YXRpYy1leHRlbmQiOiAiXjAuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImNsaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGkvLS9jbGktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Jb0YxTlBKTCtrbFF3MDFUTFVqc3ZHSWJqQlE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhpdCI6ICIwLjEuMiIsCisgICAgICAgICJnbG9iIjogIl43LjEuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdmNmdWlJeG9nTFY0RGxHQkhJVU93STBJYnJKOEhXUGM0TVU3SHp2aUdlTmhvL1VKRGZpNkI1cDNzSGVXSVEwS0dJVTBKcHhpNVpIeGVtUWZMa2tBd1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY2xpdWkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xpdWkvLS9jbGl1aS0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVMwZFhZUCtBSmt4MkxEb1hHUU11a2NmK29ORT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjZW50ZXItYWxpZ24iOiAiXjAuMS4xIiwKKyAgICAgICAgInJpZ2h0LWFsaWduIjogIl4wLjEuMSIsCisgICAgICAgICJ3b3Jkd3JhcCI6ICIwLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJjbyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jby8tL2NvLTQuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYnFhOTg5aFRybFRNdU9SNytndnorUU1mc1lRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJjb2ZmZWVzY3JpcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEwLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvZmZlZXNjcmlwdC8tL2NvZmZlZXNjcmlwdC0xLjEwLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS01NnFEQVpGKzlpR3pYWW81ODBqYzNSMjM0ejQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29sbGVjdGlvbi12aXNpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xsZWN0aW9uLXZpc2l0Ly0vY29sbGVjdGlvbi12aXNpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVM4QTNQQlpMd3lrYlRUYU1ncHp4cUFwWjNLQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtYXAtdmlzaXQiOiAiXjEuMC4wIiwKKyAgICAgICAgIm9iamVjdC12aXNpdCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY29sb3ItY29udmVydCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1jb252ZXJ0Ly0vY29sb3ItY29udmVydC0xLjkuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUWZBVXRkK3ZGZEF0RlFjQzhDQ3lZdDFmWVd4U3FBaUsyY1NENnpEQjhOM2Nwc0VCQXZSeHA5ek9HZzZHL1NISEpZQVQ4OC9hei9JdURHQUxzTlZiR2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLW5hbWUiOiAiMS4xLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY29sb3ItbmFtZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1uYW1lLy0vY29sb3ItbmFtZS0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXA5QlZpOWljUXZlVjNVSXlqM1FJTWNwVHZDVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2xvcnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3JzLy0vY29sb3JzLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRm9wSEFYVnJhbjlSb1N6Z3lYdjZLTUNFN1dNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbWJpbmUtc291cmNlLW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21iaW5lLXNvdXJjZS1tYXAvLS9jb21iaW5lLXNvdXJjZS1tYXAtMC44LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wWTBOOEVMQmh2ejRJcWpvQVY5VVVOTFhtb3M9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29udmVydC1zb3VyY2UtbWFwIjogIn4xLjEuMCIsCisgICAgICAgICJpbmxpbmUtc291cmNlLW1hcCI6ICJ+MC42LjAiLAorICAgICAgICAibG9kYXNoLm1lbW9pemUiOiAifjMuMC4zIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAifjAuNS4zIgorICAgICAgfQorICAgIH0sCisgICAgImNvbWJpbmVkLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21iaW5lZC1zdHJlYW0vLS9jb21iaW5lZC1zdHJlYW0tMS4wLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJyV2w5eTZ2T0IxeFlQWmNwWmRlM045ekRCeVhUb3NBZU1EbzRwMXd6bzZVTU9YNHZ1bUIrVFAxUlo3NnNmRTZNZDY4UTBOSlNyRS9nYmV6ZDRVbCt3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWxheWVkLXN0cmVhbSI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY29tcG9uZW50LWVtaXR0ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29tcG9uZW50LWVtaXR0ZXIvLS9jb21wb25lbnQtZW1pdHRlci0xLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUUza1kxdGVDZy9mZmVtdDhXbVBoUU9hVUplWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb25jYXQtbWFwIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbmNhdC1tYXAvLS9jb25jYXQtbWFwLTAuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMktscjEzL1dqZmQ1T25NRGFqdWcxVUJkUjNzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbmNhdC1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uY2F0LXN0cmVhbS8tL2NvbmNhdC1zdHJlYW0tMS42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTI3SEJnaEp4amladElrM1ljdm4vNGtiSmsvMXVadUpGZnVQRW5zNkxhRXZwdkcxZjBoVGVhOGxpbHJvdXlvOW1WYzJHV2RjRVo4T0xvR21TQURsckN3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWZmZXItZnJvbSI6ICJeMS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4zIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4yLjIiLAorICAgICAgICAidHlwZWRhcnJheSI6ICJeMC4wLjYiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjMuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMy42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdFF0S0E5V0lBaEJGMytWTEFzZXlNcVplQmpXMEFISm94T3RZcVNVWk5KeGF1RXJtTGJWbTJGVzF5K0ovWUE5ZFVyQUMzOUlUZWpsWldoVkl3YXdrS3c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICAgICAiaXNhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4yLjAuMCIsCisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4xIiwKKyAgICAgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MS4xLjEiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZ19kZWNvZGVyLy0vc3RyaW5nX2RlY29kZXItMS4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uL1NobnZEaTZGSGJiVmZ2aXJvK1dvamlGenYrczhNUE1IQmN6VmVQZlVwREpMd29MVDBodDFsNFl3QkNiaThwSkF2ZUVFZG5rSHlQeVRQL216UmZ3Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImNvbnNvbGUtYnJvd3NlcmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25zb2xlLWJyb3dzZXJpZnkvLS9jb25zb2xlLWJyb3dzZXJpZnktMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04Q1FjUlhNS244WXlPeUJ0dnpqdHgwSFF1eEE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGF0ZS1ub3ciOiAiXjAuMS40IgorICAgICAgfQorICAgIH0sCisgICAgImNvbnN0YW50cy1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbnN0YW50cy1icm93c2VyaWZ5Ly0vY29uc3RhbnRzLWJyb3dzZXJpZnktMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13Z3VXMk1ZWGRJcXZIQllDRjJETkoveTR5M1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29udmVydC1zb3VyY2UtbWFwIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29udmVydC1zb3VyY2UtbWFwLy0vY29udmVydC1zb3VyY2UtbWFwLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtU0NuSWQrbitTYk1XSHp2elp6aUk0Z1JwbUdBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvcHktZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb3B5LWRlc2NyaXB0b3IvLS9jb3B5LWRlc2NyaXB0b3ItMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1aMjl1czhPWmw4THVHc09wSlAxaEpIU1BWNDA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29yZS11dGlsLWlzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvcmUtdXRpbC1pcy8tL2NvcmUtdXRpbC1pcy0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRmMVVJZ3FpdkZxMWVxdHhRTWxBZFVVRHdhYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjcmVhdGUtZWNkaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jcmVhdGUtZWNkaC8tL2NyZWF0ZS1lY2RoLTQuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HYkVIUVBNT3N3R3BLWE05a0NXVnJyZW1VY0JtanRlVWFRMDFUOXJrS0NQRFhmVUhYMElvUDlMcEhZbzJOUEZhbXBhNGUrL3BGRGMzalFkeHJ4UUxhdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYm4uanMiOiAiXjQuMS4wIiwKKyAgICAgICAgImVsbGlwdGljIjogIl42LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjcmVhdGUtaGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NyZWF0ZS1oYXNoLy0vY3JlYXRlLWhhc2gtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXowMGJDR05IREc4bUhBa1A3Q3RUMXFWdStiRlFVUGpZcS80SXYzQzNrV2pURlYxMHpJamZTb2VxWG85QXN3czhnd1NIREdqL2hsMnU0T0dJamFwZUNnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaXBoZXItYmFzZSI6ICJeMS4wLjEiLAorICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4xIiwKKyAgICAgICAgIm1kNS5qcyI6ICJeMS4zLjQiLAorICAgICAgICAicmlwZW1kMTYwIjogIl4yLjAuMSIsCisgICAgICAgICJzaGEuanMiOiAiXjIuNC4wIgorICAgICAgfQorICAgIH0sCisgICAgImNyZWF0ZS1obWFjIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY3JlYXRlLWhtYWMvLS9jcmVhdGUtaG1hYy0xLjEuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTUpHOWxpaVorb2djNFR6VXd1dmJFUjFKUmRndlVGU0I1K1ZSL2c1aDgyZkdhSVJXTVdkZHRLQkhpNy9zVmhmalFaNlNlaGx5aHZRWXJjWWthVUlwTGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNpcGhlci1iYXNlIjogIl4xLjAuMyIsCisgICAgICAgICJjcmVhdGUtaGFzaCI6ICJeMS4xLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4xIiwKKyAgICAgICAgInJpcGVtZDE2MCI6ICJeMi4wLjAiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMC4xIiwKKyAgICAgICAgInNoYS5qcyI6ICJeMi40LjgiCisgICAgICB9CisgICAgfSwKKyAgICAiY3Jvc3Mtc3Bhd24iOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY3Jvc3Mtc3Bhd24vLS9jcm9zcy1zcGF3bi02LjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZVRWTHJCU3Q3ZmpiRHlnejgwNXBNbnN0SXMyVlRCTmtSbTBxeFpkK003QTVYRGR4VlJXTzVNeEdCWFpoalk0Y3FMWUxkdHJHcVJmOG1CUG16d1NwV1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm5pY2UtdHJ5IjogIl4xLjAuNCIsCisgICAgICAgICJwYXRoLWtleSI6ICJeMi4wLjEiLAorICAgICAgICAic2VtdmVyIjogIl41LjUuMCIsCisgICAgICAgICJzaGViYW5nLWNvbW1hbmQiOiAiXjEuMi4wIiwKKyAgICAgICAgIndoaWNoIjogIl4xLjIuOSIKKyAgICAgIH0KKyAgICB9LAorICAgICJjcnlwdG8tYnJvd3NlcmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY3J5cHRvLWJyb3dzZXJpZnkvLS9jcnlwdG8tYnJvd3NlcmlmeS0zLjEyLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWZ6NHNwSWgrem5qTzJWakwrSWRoRXBSSjNZTjZzTXpJVFNCaWprNkZLMlV2VHFydVNRVysvY0NaVFNOc01pWk52VWVxMENxdXJGK2RBYnlpR09ZNldnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJicm93c2VyaWZ5LWNpcGhlciI6ICJeMS4wLjAiLAorICAgICAgICAiYnJvd3NlcmlmeS1zaWduIjogIl40LjAuMCIsCisgICAgICAgICJjcmVhdGUtZWNkaCI6ICJeNC4wLjAiLAorICAgICAgICAiY3JlYXRlLWhhc2giOiAiXjEuMS4wIiwKKyAgICAgICAgImNyZWF0ZS1obWFjIjogIl4xLjEuMCIsCisgICAgICAgICJkaWZmaWUtaGVsbG1hbiI6ICJeNS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4xIiwKKyAgICAgICAgInBia2RmMiI6ICJeMy4wLjMiLAorICAgICAgICAicHVibGljLWVuY3J5cHQiOiAiXjQuMC4wIiwKKyAgICAgICAgInJhbmRvbWJ5dGVzIjogIl4yLjAuMCIsCisgICAgICAgICJyYW5kb21maWxsIjogIl4xLjAuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJjdXJyZW50bHktdW5oYW5kbGVkIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2N1cnJlbnRseS11bmhhbmRsZWQvLS9jdXJyZW50bHktdW5oYW5kbGVkLTAuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbUkzelArcXhrZTk1bW1FMm5kZHNGNjM1VitvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFycmF5LWZpbmQtaW5kZXgiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImN5Y2xlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2N5Y2xlLy0vY3ljbGUtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JZWdMSytoWUQ1aTBhUE41UXdaaXNFYkRTdEk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImRhc2hkYXNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4xNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kYXNoZGFzaC8tL2Rhc2hkYXNoLTEuMTQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWhUejZEM3krTCsxZDRnTW11TjFZRURYMjR2QT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImRhdGUtbm93IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RhdGUtbm93Ly0vZGF0ZS1ub3ctMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02dlE1L1UxSVNLMTA1Y3g5dnZJQVp5dWVORnM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGF0ZWZvcm1hdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGF0ZWZvcm1hdC8tL2RhdGVmb3JtYXQtMS4wLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbnhKTFoxbE1rMy8zQnBNdVNtUXN5bzI3L3VrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdldC1zdGRpbiI6ICJeNC4wLjEiLAorICAgICAgICAibWVvdyI6ICJeMy4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVidWciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy0yLjYuOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYkM3RWxyZEphSm5QYkFQKzFFb3RZdnFac2IzZWNsNXdpNkJmaTZCSlRVY05vd3A2Y3ZzcGcwalh6blJUS0RqbS9FN0FkZ0ZCVmVBUFZNTmNLR3NITUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1zIjogIjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImRlY2FtZWxpemUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVjYW1lbGl6ZS8tL2RlY2FtZWxpemUtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05bE5ORlJTQ2FiSURVdWUrNG05UUg1b1pFcEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVjb2RlLXVyaS1jb21wb25lbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVjb2RlLXVyaS1jb21wb25lbnQvLS9kZWNvZGUtdXJpLWNvbXBvbmVudC0wLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZ6a1RNelJZZDF5NFROR2grdUJpRUd1NGRVVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTIuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qd0syVVY0Y25QcGJjRzcrVlJBUktUWlBVV293d1hBOGJ6SDVOUDZ1ZDBvZUF4eVlQdUdaVUFDN2hNdWdwQ2R6NEJlU1psMkRsOWs2NkNISi80NlpZUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMS4wLjIiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tNWhuSFRrY1ZzUGZxeDNBS2x5dHRJUGI3SitYeWtIdkpQMkI5YlpEamxoTElvRXE0WG9LNjRWZzdib1psVldZSzZMVVk5NGRZUEVFN0xoMFprWktjUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItamJSWHkxRm10QW9DalFrVm1JVll3dXVxREZVYmFPZURqbWVkMXRPR1Byc01odEpBNHJEOXRrZ0EwRjFxSjNnUkZSWGNIWVZrZGVhUDUwUTVyRS9qTFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJlaXM1V3FRR1Y3cGVvb0R5TG1ORVBVcnBzOStTWFg1YzlwTDN4RUIrNGU5SG5HdURhN21CN2tIeEh3NENicVM5azFUMmhPSDNtaUw4bjhXdGlZVnRnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZGVmaW5lZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmVkLy0vZGVmaW5lZC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXlZMmJ6dmRXZEJpT0VRbHBGUkdaNDVzZnBwTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWxheWVkLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWxheWVkLXN0cmVhbS8tL2RlbGF5ZWQtc3RyZWFtLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM3pyaG1heXQrMzFFQ3FyZ3NwNGljckpPeGhrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlcHMtc29ydCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZXBzLXNvcnQvLS9kZXBzLXNvcnQtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DUmNra0M2RVpZSmc2NUVIU016Tkd2YmlIN1U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiSlNPTlN0cmVhbSI6ICJeMS4wLjMiLAorICAgICAgICAic2hhc3VtIjogIl4xLjAuMCIsCisgICAgICAgICJzdWJhcmciOiAiXjEuMC4wIiwKKyAgICAgICAgInRocm91Z2gyIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZXMuanMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVzLmpzLy0vZGVzLmpzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtd0hUUzRxcHFpcG9IMjlZZm1oWEN6WVBzanN3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJtaW5pbWFsaXN0aWMtYXNzZXJ0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZXRlY3QtZmlsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZXRlY3QtZmlsZS8tL2RldGVjdC1maWxlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOE5adEEyY3FnbHl4dHp2YlArWWpFTWpsVXJjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRldGVjdGl2ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZXRlY3RpdmUvLS9kZXRlY3RpdmUtNS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRGSE1xZk92eGxncmZWelRFa05CU2g5U3ZTTlgvSGZGNE9GSTJRRkdDeVBtMDJFc3lJTHFuVWViNVA2cTdKWjNTRk5UQkw1dDJzZVBSZ3JONGVwVVdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhY29ybi1ub2RlIjogIl4xLjMuMCIsCisgICAgICAgICJkZWZpbmVkIjogIl4xLjAuMCIsCisgICAgICAgICJtaW5pbWlzdCI6ICJeMS4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJkaWZmaWUtaGVsbG1hbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2RpZmZpZS1oZWxsbWFuLy0vZGlmZmllLWhlbGxtYW4tNS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWtxYWcvTmwrZjNHd3lLMjVmaFVNWWo4MUJVT3JaOUl1SnNqSWNERTVpY05NOUZKSEFWbTNWY1VEeGRMUG9RdFR1VXlsV202WklrbllKd3dhUHhzVXpnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJibi5qcyI6ICJeNC4xLjAiLAorICAgICAgICAibWlsbGVyLXJhYmluIjogIl40LjAuMCIsCisgICAgICAgICJyYW5kb21ieXRlcyI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZG9tLXNlcmlhbGl6ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tLXNlcmlhbGl6ZXIvLS9kb20tc2VyaWFsaXplci0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJ6eHBkVWJPQjRET0k3NUtLT0tUNUF2RERJST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICJ+MS4xLjEiLAorICAgICAgICAiZW50aXRpZXMiOiAifjEuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvbWVsZW1lbnR0eXBlLy0vZG9tZWxlbWVudHR5cGUtMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdlNoM1BpWkNpQnJzVVZSSkpDbWNYTmdpR0ZzPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImVudGl0aWVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZW50aXRpZXMvLS9lbnRpdGllcy0xLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ibHd0Q2xZaHRkcmE3TytBdVE3ZnRjMTNjdkE9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZG9tYWluLWJyb3dzZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tYWluLWJyb3dzZXIvLS9kb21haW4tYnJvd3Nlci0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItam5qeWlNNmVSeVpsMkgrVzhRL3pMTUE0ODFoemkwZXN6QWFCVXpJVm5tWVZEQmJuTHhWTm5mdTFIZ0VCdkNiTCs3MUZyeE1sM0U2bHBLSDdHZTNPWEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRvbWVsZW1lbnR0eXBlIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvbWVsZW1lbnR0eXBlLy0vZG9tZWxlbWVudHR5cGUtMS4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zWHJ0Z3VpcldlVXQyY0diRjFiZy9CaHlCTUk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZG9taGFuZGxlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb21oYW5kbGVyLy0vZG9taGFuZGxlci0yLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUxlV2FDQ0xWQW4rci8yOERMQ3Nsb3FpcjV6Zz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgImRvbXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvbXV0aWxzLy0vZG9tdXRpbHMtMS41LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zTmhJaWliMVk5WVFlZVNNbjN0K01qYzJnczg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZG9tLXNlcmlhbGl6ZXIiOiAiMCIsCisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgImR1cGxleGVyMiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kdXBsZXhlcjIvLS9kdXBsZXhlcjItMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peExhdUhqQTFwNCtlSkVGRm1Lakw4YTkzTUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMy42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMi4zLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10UXRLQTlXSUFoQkYzK1ZMQXNleU1xWmVCalcwQUhKb3hPdFlxU1VaTkp4YXVFcm1MYlZtMkZXMXkrSi9ZQTlkVXJBQzM5SVRlamxaV2hWSXdhd2tLdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4zIiwKKyAgICAgICAgICAgICJpc2FycmF5IjogIn4xLjAuMCIsCisgICAgICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiAifjIuMC4wIiwKKyAgICAgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjEiLAorICAgICAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4xLjEuMSIsCisgICAgICAgICAgICAidXRpbC1kZXByZWNhdGUiOiAifjEuMC4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN0cmluZ19kZWNvZGVyIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmdfZGVjb2Rlci8tL3N0cmluZ19kZWNvZGVyLTEuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbi9TaG52RGk2RkhiYlZmdmlybytXb2ppRnp2K3M4TVBNSEJjelZlUGZVcERKTHdvTFQwaHQxbDRZd0JDYmk4cEpBdmVFRWRua0h5UHlUUC9telJmd2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgInNhZmUtYnVmZmVyIjogIn41LjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJlY2MtanNibiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lY2MtanNibi8tL2VjYy1qc2JuLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT29PcEJPVkRVeWg0ZE1Wa3QxU1Rob1NhbU1rPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJqc2JuIjogIn4wLjEuMCIsCisgICAgICAgICJzYWZlci1idWZmZXIiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImVsbGlwdGljIjogeworICAgICAgInZlcnNpb24iOiAiNi40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VsbGlwdGljLy0vZWxsaXB0aWMtNi40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUJzWEx6NXNxWDhPSGNzaDdDcUJNenR5WEFSbUdRM0xXUHRHakppNkRpSkhxNUMvcXZpOVAzT3Fnc3dLU0RmdGJ1OCtJb0kvUURUQW0yZkZuUTlTWlNRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJibi5qcyI6ICJeNC40LjAiLAorICAgICAgICAiYnJvcmFuZCI6ICJeMS4wLjEiLAorICAgICAgICAiaGFzaC5qcyI6ICJeMS4wLjAiLAorICAgICAgICAiaG1hYy1kcmJnIjogIl4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjEiLAorICAgICAgICAibWluaW1hbGlzdGljLWFzc2VydCI6ICJeMS4wLjAiLAorICAgICAgICAibWluaW1hbGlzdGljLWNyeXB0by11dGlscyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZW50aXRpZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZW50aXRpZXMvLS9lbnRpdGllcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXNwaDZvNElUUi96ZVpDc2svZnllVDdjU3Z5WT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlcnJvci1leCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lcnJvci1leC8tL2Vycm9yLWV4LTEuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi03ZEZITm1xZUZTRXQyWkJzQ3Jpb3JLbm4zWjJwaitmZDlrbUk2UW9XdzQvL0RMK2ljRUJmYzBVN3FKQ2lzcXJUc0tUanc0Zk5GeTJwVzlPcVN0RDg0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtYXJyYXlpc2giOiAiXjAuMi4xIgorICAgICAgfQorICAgIH0sCisgICAgImVzNi1wcm9taXNlIjogeworICAgICAgInZlcnNpb24iOiAiNC4yLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzNi1wcm9taXNlLy0vZXM2LXByb21pc2UtNC4yLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW42d3ZwZEU0M1ZGdEpxK2xVRFlEQkZVd1Y4VFpidUdYTFY0RDZ3S2FmZzEzbGR6bktzeUV2YXR1Ym5tVWUzMXpjdmVsU3pPSEYrWGJhVCtCbDlPYkRnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlczYtcHJvbWlzaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiNS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzNi1wcm9taXNpZnkvLS9lczYtcHJvbWlzaWZ5LTUuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVVFuV0x6NVc2cFo4UzJOUVd1OElLUnlLVWdNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNlIjogIl40LjAuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC8tL2VzY2FwZS1zdHJpbmctcmVnZXhwLTEuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJIQVZpR1FxTi8ycmp1eXp3SUF5aE1MaHRRPSIKKyAgICB9LAorICAgICJlc3ByaW1hIjogeworICAgICAgInZlcnNpb24iOiAiMi43LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJpbWEvLS9lc3ByaW1hLTIuNy4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbHVPM0RWZDU5cTFKelFNbWM5SERFblo3cFlFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV2ZW50ZW1pdHRlcjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMTQiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXZlbnRlbWl0dGVyMi8tL2V2ZW50ZW1pdHRlcjItMC40LjE0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtajJHM1hONEJLeTZlc29UVVZGV0R0V1E3WWFzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV2ZW50cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ldmVudHMvLS9ldmVudHMtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTNabWlvYmVuZDhQOURqbUtBdHkwRXJhNGpWOG9KMHlHWWUybkpKQXhneW1GOStOOEYybTBoaFppTW9XdGNmZXBFeHpOS1p1bUZVM2tzZFFiSW5HV0NnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJldnBfYnl0ZXN0b2tleSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ldnBfYnl0ZXN0b2tleS8tL2V2cF9ieXRlc3Rva2V5LTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0vZjJHbzRUb2duSC9LdkNJU1A3T1VzSG44NWhUOW5Va3h4QTlCRVd4Rm4rT2o5bzhaTkxtLzQwaGRsZ1NMeXVPaW1zclRLTFVNRW9yUWV4cC9hUFFlQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWQ1LmpzIjogIl4xLjMuNCIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXhpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leGl0Ly0vZXhpdC0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJqSmpqNDJIZk1naEI5TUtELzhhRjh1aHpRdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleHBhbmQtYnJhY2tldHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXhwYW5kLWJyYWNrZXRzLy0vZXhwYW5kLWJyYWNrZXRzLTIuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdDNjMTR4WE9NUGEyNy9ENE93UVZHaUpFbGlJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlYnVnIjogIl4yLjMuMyIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjAuMi41IiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICJwb3NpeC1jaGFyYWN0ZXItY2xhc3NlcyI6ICJeMC4xLjAiLAorICAgICAgICAicmVnZXgtbm90IjogIl4xLjAuMCIsCisgICAgICAgICJzbmFwZHJhZ29uIjogIl4wLjguMSIsCisgICAgICAgICJ0by1yZWdleCI6ICJeMy4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJleHBhbmQtdGlsZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXhwYW5kLXRpbGRlLy0vZXhwYW5kLXRpbGRlLTIuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbCtnQnFnVXQ4Q1JVM2thd0svWWhaQ3pjaFFJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhvbWVkaXItcG9seWZpbGwiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImV4dGVuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQvLS9leHRlbmQtMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWZqcXVDNTljRDdDeVc2dXJOWEswRkJ1ZmtaY29pR0c4MHdUdVB1alg1OTBjQjVUdGxuMjBFMlVCNFMvV0FSVnFoWGZmWmwyTE5nUytnUWRQSUlpbS9nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSnFjYXJ3YzdPZnNoSnhjblJoTWNKd1FDamJnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzc2lnbi1zeW1ib2xzIjogIl4xLjAuMCIsCisgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4xLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWV4dGVuZGFibGUvLS9pcy1leHRlbmRhYmxlLTEuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItYXJuWE14VDFoaG9LbzlrMUxaZG1sTnlKZEREZnkydjBmWGpGbG1vazQraTh1bC82V2xiVmdlOWJoTTc0T3BOUFFQTUdVVG9EdHorS1hhMVBuZUp4T0E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjQiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZXh0Z2xvYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRnbG9iLy0vZXh0Z2xvYi0yLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTm1iNlFYa0VMc3VCcjI0Q0pTa2lsbzZVSEhnYmVrSzVVaVpnZkU2VUhEM0ViMjdZQzZvRCtiaGNUK3RKNmNsOGRtc2dkUXhuV2xjcnk4a3NCSUJMcHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFycmF5LXVuaXF1ZSI6ICJeMC4zLjIiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4xLjAuMCIsCisgICAgICAgICJleHBhbmQtYnJhY2tldHMiOiAiXjIuMS40IiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICJmcmFnbWVudC1jYWNoZSI6ICJeMC4yLjEiLAorICAgICAgICAicmVnZXgtbm90IjogIl4xLjAuMCIsCisgICAgICAgICJzbmFwZHJhZ29uIjogIl4wLjguMSIsCisgICAgICAgICJ0by1yZWdleCI6ICJeMy4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1kcDY2cno5S1k2clRyNTZOTUV5YnZubS9zT1k9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tNWhuSFRrY1ZzUGZxeDNBS2x5dHRJUGI3SitYeWtIdkpQMkI5YlpEamxoTElvRXE0WG9LNjRWZzdib1psVldZSzZMVVk5NGRZUEVFN0xoMFprWktjUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItamJSWHkxRm10QW9DalFrVm1JVll3dXVxREZVYmFPZURqbWVkMXRPR1Byc01odEpBNHJEOXRrZ0EwRjFxSjNnUkZSWGNIWVZrZGVhUDUwUTVyRS9qTFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJlaXM1V3FRR1Y3cGVvb0R5TG1ORVBVcnBzOStTWFg1YzlwTDN4RUIrNGU5SG5HdURhN21CN2tIeEh3NENicVM5azFUMmhPSDNtaUw4bjhXdGlZVnRnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZXh0cmFjdC16aXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuNyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0cmFjdC16aXAvLS9leHRyYWN0LXppcC0xLjYuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFFQzB1SzlrQXlaTWpiVi9UeHAwTXo3NEgraz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb25jYXQtc3RyZWFtIjogIjEuNi4yIiwKKyAgICAgICAgImRlYnVnIjogIjIuNi45IiwKKyAgICAgICAgIm1rZGlycCI6ICIwLjUuMSIsCisgICAgICAgICJ5YXV6bCI6ICIyLjQuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJleHRzcHJpbnRmIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dHNwcmludGYvLS9leHRzcHJpbnRmLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbHBHRVFPTUVHbnBCVDR4UzQ4VjA2encrSGdVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV5ZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuOCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXllcy8tL2V5ZXMtMC4xLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZczhTQWpUR2czaGRrQ05JcUFEdlBnekNDOEE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImZhc3QtZGVlcC1lcXVhbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWRlZXAtZXF1YWwvLS9mYXN0LWRlZXAtZXF1YWwtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13Rk5IZUJmSWExSGFxRlBJSGdXYmN6MENOaFE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImZhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5Ly0vZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnktMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0xUlFzREs3bXNSaWZoOU9uWVJFR1Q0Ykl1L0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImZkLXNsaWNlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mZC1zbGljZXIvLS9mZC1zbGljZXItMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pMXZMMmV3eWZGQkJ2NXF3SS8xblVQRVhmbVU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGVuZCI6ICJ+MS4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZmlndXJlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maWd1cmVzLy0vZmlndXJlcy0xLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXkrSGpyL3p4elVTNERLMyswbzNIazZsd0hTND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjUiLAorICAgICAgICAib2JqZWN0LWFzc2lnbiI6ICJeNC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZmlsbC1yYW5nZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maWxsLXJhbmdlLy0vZmlsbC1yYW5nZS00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTFVU0JIVUtQbU9zR3BqM0VBdEpBUERLTU9QYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAiaXMtbnVtYmVyIjogIl4zLjAuMCIsCisgICAgICAgICJyZXBlYXQtc3RyaW5nIjogIl4xLjYuMSIsCisgICAgICAgICJ0by1yZWdleC1yYW5nZSI6ICJeMi4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZmluZC11cCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5kLXVwLy0vZmluZC11cC0xLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWF5NllJckdpemdwZ3EyVFdFT3pLMVR5eVRROD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYXRoLWV4aXN0cyI6ICJeMi4wLjAiLAorICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImZpbmR1cC1zeW5jIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbmR1cC1zeW5jLy0vZmluZHVwLXN5bmMtMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ONU1LcGRnV3QzZkFORVhobG16R2VRcE1DeFk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYiI6ICJ+NS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImdsb2IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNS4wLjE1IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNS4wLjE1LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUc4azJ1ZUF2U21BL3pDSXV6M1l6MHd1TGs3RT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpbmZsaWdodCI6ICJeMS4wLjQiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAgICAgIm1pbmltYXRjaCI6ICIyIHx8IDMiLAorICAgICAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJmaW5lZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5lZC8tL2ZpbmVkLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qUXA5NDlabUViaVlIazNna2JkdHBKMEcxK2tndExRQk5kUDVlZEZQN0ZoK1dBWWNlTFF6NnlPMVNCajcyWGtnOEdWeVRCM2JCekFZckhKVmg1WGQ1Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMiIsCisgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC4zIiwKKyAgICAgICAgIm9iamVjdC5kZWZhdWx0cyI6ICJeMS4xLjAiLAorICAgICAgICAib2JqZWN0LnBpY2siOiAiXjEuMi4wIiwKKyAgICAgICAgInBhcnNlLWZpbGVwYXRoIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmbGFnZ2VkLXJlc3Bhd24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmxhZ2dlZC1yZXNwYXduLy0vZmxhZ2dlZC1yZXNwYXduLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1sTmFITlZ5bWFqbWswT0pNQm44ZlZVQVUxQnREZUtJcUtvVmhrNHhBQUxCNTdhQUxnNmI0VzBNZkovY1VFMGc5WUJYeTVYaFNsUElwWUlKN0hhWS8zUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZm9yLWluIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvci1pbi8tL2Zvci1pbi0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWdRYU5LVnFCUXV3S3h5Ykc0aUFNTVB0dFhvQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmb3Itb3duIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvci1vd24vLS9mb3Itb3duLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteGpNeTlCWE8zRXNFMi81d3o0TmtsTVU4dEVzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1pbiI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZm9yZXZlci1hZ2VudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3JldmVyLWFnZW50Ly0vZm9yZXZlci1hZ2VudC0wLjYuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSs4Y2ZERUd0NnpmNWJGZDYwZTFDMlAyc3lwRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZm9ybS1kYXRhIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvcm0tZGF0YS8tL2Zvcm0tZGF0YS0yLjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMWxMS0IyTXUzYUdQMVEvMmVDT3gwZk5iUk1lN1hkd2t0d09ydWhmcXFkMHJJSld3TjREaCtFM2hyUFNsRENYblNSN1V0WjFOMzhyVlhtKzYrTUVoSlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luY2tpdCI6ICJeMC40LjAiLAorICAgICAgICAiY29tYmluZWQtc3RyZWFtIjogIl4xLjAuNiIsCisgICAgICAgICJtaW1lLXR5cGVzIjogIl4yLjEuMTIiCisgICAgICB9CisgICAgfSwKKyAgICAiZnJhZ21lbnQtY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnJhZ21lbnQtY2FjaGUvLS9mcmFnbWVudC1jYWNoZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFwRDYwbjhUNkp2bjh6ZVp4cnhhQ3IvL0RSaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtYXAtY2FjaGUiOiAiXjAuMi4yIgorICAgICAgfQorICAgIH0sCisgICAgImZzLWV4dHJhIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzLWV4dHJhLy0vZnMtZXh0cmEtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16VHpsOStmTFlVV0lQOHJqR1I2WWQvaFllVkE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJqc29uZmlsZSI6ICJeMi4xLjAiLAorICAgICAgICAia2xhdyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtsYXciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rbGF3Ly0va2xhdy0xLjMuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RSWhETzBhenNib2xuWGg0WFk2Vzl6dWdKRGs9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjkiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZnMucmVhbHBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMucmVhbHBhdGgvLS9mcy5yZWFscGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUZRU3RKU01WaktwQTIwb25oOHNCUVJtVTZrOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmdW5jdGlvbi1iaW5kIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Z1bmN0aW9uLWJpbmQvLS9mdW5jdGlvbi1iaW5kLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15SW92QXpNWDQ5c0Y4WWw1OGZTQ1dKNXN2U0x1YWliUHhYUUpGTG1CT2JUdUNyME1mMUtpUG9wR005TmlGamlZQkNiZmFhMkZoNmJyZVE2QU5WVEkwQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0LWFzc2lnbmVkLWlkZW50aWZpZXJzIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldC1hc3NpZ25lZC1pZGVudGlmaWVycy8tL2dldC1hc3NpZ25lZC1pZGVudGlmaWVycy0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbUJCd21lR1RyeEVNTzRwTWFhZi91VUVGSG5ZdHdyOEZUZThZL21lcjRyY1YvYnllMHFHbTZwdzFiR1pGR1N0eEM1Tzc2YzVaQVZCR25xSG1PYUpwZFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdldC1zdGRpbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXQtc3RkaW4vLS9nZXQtc3RkaW4tNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11V2pHc0tCRGhESkpBdWkvR2wzekpYbWtVUDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0LXZhbHVlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldC12YWx1ZS8tL2dldC12YWx1ZS0yLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTNCWEtIR2NqaDhwMnZUZXNDamxib2dRcUxDZz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXRvYmplY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2V0b2JqZWN0Ly0vZ2V0b2JqZWN0LTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQkhwRWw0bjZGZzBCajFTRzdaRXlDMjdIaUZ3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdldHBhc3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2V0cGFzcy8tL2dldHBhc3MtMC4xLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1YditPUG1oTlZwcmt5eXNTZ21CT2k2WWhTZm89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzc2VydC1wbHVzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnbG9iIjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVJ1dnIwbmxKYmpOa3lZTkZLc1RZVkt6OVhvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICJpbmZsaWdodCI6ICJeMS4wLjQiLAorICAgICAgICAiaW5oZXJpdHMiOiAiMiIsCisgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC4yIiwKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdsb2JhbC1tb2R1bGVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2JhbC1tb2R1bGVzLy0vZ2xvYmFsLW1vZHVsZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXNLenBFa2YxMUdwT0Z1dzBaemp6bXQ0QjRVWndqT2NHNzU3UFB2cmZoeGNMRmJxMHdwc2dwT3F4cHh0eEZpQ0c0RHRHOTNNNlhSVmJGMm9HZGV2N2JnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iYWwtcHJlZml4IjogIl4xLjAuMSIsCisgICAgICAgICJpcy13aW5kb3dzIjogIl4xLjAuMSIsCisgICAgICAgICJyZXNvbHZlLWRpciI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ2xvYmFsLXByZWZpeCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iYWwtcHJlZml4Ly0vZ2xvYmFsLXByZWZpeC0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTIvZER4c0ZKa2xrOFpWVm95MmJ0TXNBU0xyND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHBhbmQtdGlsZGUiOiAiXjIuMC4yIiwKKyAgICAgICAgImhvbWVkaXItcG9seWZpbGwiOiAiXjEuMC4xIiwKKyAgICAgICAgImluaSI6ICJeMS4zLjQiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjEiLAorICAgICAgICAid2hpY2giOiAiXjEuMi4xNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJncmFjZWZ1bC1mcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3JhY2VmdWwtZnMvLS9ncmFjZWZ1bC1mcy00LjEuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Eb3ZmNU5IZHVJVk5aT0JPcDhBT0tnSnVWbGc9IgorICAgIH0sCisgICAgImdydW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50Ly0vZ3J1bnQtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLS9Kem1aTlBmS29ybENycm14V3FRTzRKVm9kTytEVmQ1WFg0RGtvY0wvMVdsTGxLVkxFOStTZEVJZW1wT0F4RGhXUHlzTGxlNmFmdm4vaGc3Q2syazlnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2ZmZWVzY3JpcHQiOiAifjEuMTAuMCIsCisgICAgICAgICJkYXRlZm9ybWF0IjogIn4xLjAuMTIiLAorICAgICAgICAiZXZlbnRlbWl0dGVyMiI6ICJ+MC40LjEzIiwKKyAgICAgICAgImV4aXQiOiAifjAuMS4xIiwKKyAgICAgICAgImZpbmR1cC1zeW5jIjogIn4wLjMuMCIsCisgICAgICAgICJnbG9iIjogIn43LjAuMCIsCisgICAgICAgICJncnVudC1jbGkiOiAifjEuMi4wIiwKKyAgICAgICAgImdydW50LWtub3duLW9wdGlvbnMiOiAifjEuMS4wIiwKKyAgICAgICAgImdydW50LWxlZ2FjeS1sb2ciOiAifjIuMC4wIiwKKyAgICAgICAgImdydW50LWxlZ2FjeS11dGlsIjogIn4xLjEuMSIsCisgICAgICAgICJpY29udi1saXRlIjogIn4wLjQuMTMiLAorICAgICAgICAianMteWFtbCI6ICJ+My41LjIiLAorICAgICAgICAibWluaW1hdGNoIjogIn4zLjAuMiIsCisgICAgICAgICJta2RpcnAiOiAifjAuNS4xIiwKKyAgICAgICAgIm5vcHQiOiAifjMuMC42IiwKKyAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAifjEuMC4wIiwKKyAgICAgICAgInJpbXJhZiI6ICJ+Mi42LjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImdydW50LWNsaSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNsaS8tL2dydW50LWNsaS0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WaXNSbnJzR25kdEdTczRvUlZBYjZYczF0cWc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZmluZHVwLXN5bmMiOiAifjAuMy4wIiwKKyAgICAgICAgICAgICJncnVudC1rbm93bi1vcHRpb25zIjogIn4xLjEuMCIsCisgICAgICAgICAgICAibm9wdCI6ICJ+My4wLjYiLAorICAgICAgICAgICAgInJlc29sdmUiOiAifjEuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm5vcHQiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4wLjYiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub3B0Ly0vbm9wdC0zLjAuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS14a1pkdndpcnpVMnpXVEYvZWF4b3BrYXlqL2s9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYWJicmV2IjogIjEiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtY2xpIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNsaS8tL2dydW50LWNsaS0xLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItOE9IRGlaWmtjcHR4Vlh0TWZEeEp2bU43TVZKTkU4TC95SWNQYjRIQjdUbHlGRDFrRHZqSHJiNjJ1aHlTc1UxNHdKeDlPUk1uVHVoUk1RNDBsSC9vclE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdydW50LWtub3duLW9wdGlvbnMiOiAifjEuMS4wIiwKKyAgICAgICAgImludGVycHJldCI6ICJ+MS4xLjAiLAorICAgICAgICAibGlmdG9mZiI6ICJ+Mi41LjAiLAorICAgICAgICAibm9wdCI6ICJ+NC4wLjEiLAorICAgICAgICAidjhmbGFncyI6ICJ+My4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtY29udHJpYi1jb25jYXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY29udHJpYi1jb25jYXQvLS9ncnVudC1jb250cmliLWNvbmNhdC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVlWQ1lZd2hPaHgxK2h0NUl3QlVsbnRsM1JiMD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJeMS4wLjAiLAorICAgICAgICAic291cmNlLW1hcCI6ICJeMC41LjMiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0yLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10RExkTTFpMk5NOTE0ZVJtUTJna0JUUEIzYjQ9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY2hhbGsiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYWxrLy0vY2hhbGstMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUJGY1ZlU25BdjVORlFxOU9IS0NLbjRKL0pnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktc3R5bGVzIjogIl4yLjIuMSIsCisgICAgICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC4yIiwKKyAgICAgICAgICAgICJoYXMtYW5zaSI6ICJeMi4wLjAiLAorICAgICAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4wIiwKKyAgICAgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeMi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVUxMEVYT2EyTmora0FSY0lSaW1aWHAzekpNYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jb250cmliLWpzaGludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItanNoaW50Ly0vZ3J1bnQtY29udHJpYi1qc2hpbnQtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1OcDJRbXlXVHhBNkw1NWxBc2hOQWhReDVPYXc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMS4xIiwKKyAgICAgICAgImhvb2tlciI6ICJeMC4yLjMiLAorICAgICAgICAianNoaW50IjogIn4yLjkuNCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNvbnRyaWItcXVuaXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY29udHJpYi1xdW5pdC8tL2dydW50LWNvbnRyaWItcXVuaXQtMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1kazhVbHRINm14Q0Q2M0UwaFRYTUF0czQyRE9pNHo0YkJCclk3cW51SGlTaGZsTUY3SXVlU01ZZTB6V2FaMmRPOG1ndWpoNTdaZm55MkViaWdKaFJnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJldmVudGVtaXR0ZXIyIjogIl41LjAuMSIsCisgICAgICAgICJwLWVhY2gtc2VyaWVzIjogIl4xLjAuMCIsCisgICAgICAgICJwdXBwZXRlZXIiOiAiXjEuMTEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXZlbnRlbWl0dGVyMiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V2ZW50ZW1pdHRlcjIvLS9ldmVudGVtaXR0ZXIyLTUuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVlaZWdsZFg3YTFmb2xDOXYxK3F0WTZDY2xGST0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jb250cmliLXVnbGlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItdWdsaWZ5Ly0vZ3J1bnQtY29udHJpYi11Z2xpZnktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ybWVrYjVGVDdkVExFWUU2VmV0cHh3MTlzdnM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgImxvZGFzaCI6ICJeNC4wLjEiLAorICAgICAgICAibWF4bWluIjogIl4xLjEuMCIsCisgICAgICAgICJ1Z2xpZnktanMiOiAifjIuNi4yIiwKKyAgICAgICAgInVyaS1wYXRoIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWpzZG9jIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWpzZG9jLy0vZ3J1bnQtanNkb2MtMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWdDNjZUQ1JYZVFNajNISXlxVlNCSm04emRVejQzZTV2YUcvUExPLzYyN0ExZWRiSm56eGhKVjduRjBLcUx3TU0wUkROdTFpc3RDNmZ2Zm5ZcUZLaTN3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjcm9zcy1zcGF3biI6ICJeNi4wLjUiLAorICAgICAgICAianNkb2MiOiAifjMuNS41IiwKKyAgICAgICAgIm1hcmtlZCI6ICJeMC41LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1hcmtlZCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjUuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcmtlZC8tL21hcmtlZC0wLjUuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlVa0JaZWdDWm91NEFkd2JLVHdTVy9sTkRjejVPdVJTbDNxZGNsMzFJYTBCMlFQRzBKbit0S2JsaC85L2VQOS82KzRoMjd2cG9oOHdlbC92UU9WMHZ3PT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1rbm93bi1vcHRpb25zIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWtub3duLW9wdGlvbnMvLS9ncnVudC1rbm93bi1vcHRpb25zLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jSHdzTHFvaWdocHU3VHVZajVSb25uRXV4R1ZGbnp0Y1VxVHFwNXJYRkdZTDRPdVBGb2Z3QzRZY2c3bjlmWXd2SzZGNVdiWWdlVk93cGg5Q3JzMmZzUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ3J1bnQtbGVnYWN5LWxvZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1sZWdhY3ktbG9nLy0vZ3J1bnQtbGVnYWN5LWxvZy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMW0zKzVRdkRZZlIxbHRyOGhqaWFpTmpkZHhHZFFXY0gwcncxaUtLaVFuRjAreHRnVGF6aXJTVEd1NjhSY2hQeWgxT0JuZzFiQlVqTG1YOHE5TnBvQ3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9ycyI6ICJ+MS4xLjIiLAorICAgICAgICAiZ3J1bnQtbGVnYWN5LWxvZy11dGlscyI6ICJ+Mi4wLjAiLAorICAgICAgICAiaG9va2VyIjogIn4wLjIuMyIsCisgICAgICAgICJsb2Rhc2giOiAifjQuMTcuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1sZWdhY3ktbG9nLXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWxlZ2FjeS1sb2ctdXRpbHMvLS9ncnVudC1sZWdhY3ktbG9nLXV0aWxzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1vN3VIeU8vSitpMnRYRzhyMmJaTmxWazIwdmxJRko5SUVZeUhNQ1FHZldZcnU4SnYzd1RxS1p6dlYzMFlXOXJXRWpxMGVQM2NmbFExcVdvakllOVZGQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAifjIuNC4xIiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy4xMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1sZWdhY3ktdXRpbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1sZWdhY3ktdXRpbC8tL2dydW50LWxlZ2FjeS11dGlsLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi05enlBMjl3L2ZCZTZCSWZqR0VObmR3b2UxVXkzMUJJWHhUSDNzOG1nYTBaNUJ6MlNwNFVDamtleXYydEk0NDl5bWt4M3gyNkIrNDZGVjRmWEVkZGw1QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMiOiAifjEuNS4yIiwKKyAgICAgICAgImV4aXQiOiAifjAuMS4xIiwKKyAgICAgICAgImdldG9iamVjdCI6ICJ+MC4xLjAiLAorICAgICAgICAiaG9va2VyIjogIn4wLjIuMyIsCisgICAgICAgICJsb2Rhc2giOiAifjQuMTcuMTAiLAorICAgICAgICAidW5kZXJzY29yZS5zdHJpbmciOiAifjMuMy40IiwKKyAgICAgICAgIndoaWNoIjogIn4xLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1zaGVsbC1zcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1zaGVsbC1zcGF3bi8tL2dydW50LXNoZWxsLXNwYXduLTAuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1sZll2RVFqYk8xV3YrMUZrM2QzWGxjRXB1UWp5WGlFclpNa2l6L2kvdERRZU1ISEdGMUx6aXFBNFpjaWV0QkFvL2JNMlJIZEVFVUpmbk5XdDFWUk13UT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3J1bnQiOiAiPj0wLjQueCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnemlwLXNpemUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3ppcC1zaXplLy0vZ3ppcC1zaXplLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWnMrTEVCQkhJbnVWdXM1dW9kb01GMzdWd2k4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJyb3dzZXJpZnktemxpYiI6ICJeMC4xLjQiLAorICAgICAgICAiY29uY2F0LXN0cmVhbSI6ICJeMS40LjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaGFyLXNjaGVtYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXItc2NoZW1hLy0vaGFyLXNjaGVtYS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFVd2lKT3ZLd0VlQ29Oa0RWU0h5UnpXMzdKST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiaGFyLXZhbGlkYXRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXItdmFsaWRhdG9yLy0vaGFyLXZhbGlkYXRvci01LjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItK3FubU5qSTRPZkgyaXBROVZRT3cyM2JCZC9pYnRmYlZkSzJmWWJZNGFjVERxS1RXL1lEcDlNY2ltWmREYkc4aVY5ZlppelVxUU1ENXh2cmlCMTQ2VEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhanYiOiAiXjUuMy4wIiwKKyAgICAgICAgImhhci1zY2hlbWEiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImhhcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMvLS9oYXMtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWYyZHZPMFZVNk9lajdSa1dKR3JlaGpiek1BakZwNS9WS1BwNXRUcFdJVjRKSEhaSzEvQnhiRlJ0Zi9zaUEyU1dUZTA5Y2FEbVZ0WVl6V0VJYkJTNHp3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmdW5jdGlvbi1iaW5kIjogIl4xLjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtYW5zaS8tL2hhcy1hbnNpLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTlBVRW5PSHMzeXNHU2E4KzhrNUY3VFZCYlpFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImhhcy1mbGFnIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1mbGFnLy0vaGFzLWZsYWctMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZFJVM0NHWnJpSldtZk5HZmxvSDg3bFZ1djA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFzLXZhbHVlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy12YWx1ZS8tL2hhcy12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUdMS0IybGhiSEZ4UjN2Sk1rdzdTbWd2bXNYYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImhhcy12YWx1ZXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtdmFsdWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy12YWx1ZXMvLS9oYXMtdmFsdWVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbGJDMlArd2hSbUdhYitWLzUxWW8xYU9lL2s4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAia2luZC1vZiI6ICJeNC4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi00LjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JSUU5ODljU2tvc2djM2hwR2tVR2I2NXkzVmM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJoYXNoLWJhc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzaC1iYXNlLy0vaGFzaC1iYXNlLTMuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWDhob2FFZnMxelNaUURNWnByQ2o4L2F1U1JnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaGFzaC5qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXNoLmpzLy0vaGFzaC5qcy0xLjEuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGFPYXNrR3Q0ejRTT0FOTnNlT3ZpWUR2akVKaW5Ja1JnbXA3TGJLUDJZVFRtVnhXQmw4N3MvdXpLOXIrNDRCY2xCU3AyWDdLMWhxZU5mejlKYkJlWEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMyIsCisgICAgICAgICJtaW5pbWFsaXN0aWMtYXNzZXJ0IjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXNoYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXNoYS8tL2hhc2hhLTIuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZU5mTC9CNXRaakEvNTVnM05sbUVVWHN2YnVFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1zdHJlYW0iOiAiXjEuMC4xIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJobWFjLWRyYmciOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaG1hYy1kcmJnLy0vaG1hYy1kcmJnLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMG5SWEFRSmFiSGRhYkZSWGsrMVFMOERHU2FFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhc2guanMiOiAiXjEuMC4zIiwKKyAgICAgICAgIm1pbmltYWxpc3RpYy1hc3NlcnQiOiAiXjEuMC4wIiwKKyAgICAgICAgIm1pbmltYWxpc3RpYy1jcnlwdG8tdXRpbHMiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImhvbWVkaXItcG9seWZpbGwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaG9tZWRpci1wb2x5ZmlsbC8tL2hvbWVkaXItcG9seWZpbGwtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1UQ3U4aW5XSm1QN3I5ZTFvV0E5MjFHZG90THc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGFyc2UtcGFzc3dkIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJob29rZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaG9va2VyLy0vaG9va2VyLTAuMi4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdURUM0k4eEtKQ3FtV1dORm5mYlpoTVhUMlZrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImhvc3RlZC1naXQtaW5mbyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ob3N0ZWQtZ2l0LWluZm8vLS9ob3N0ZWQtZ2l0LWluZm8tMi43LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTdUL0J4SDE5emJjQ1RhOFhrTWxiSzVsVG8xV3Rna0ZpM0d2ZFdFeU51YzRWZXg3LzlEcWJucHNmNEpNeWRjZmo5SENnNHpVV0ZUTDNaYTZsYXBnNS93PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJodG1sZXNjYXBlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHRtbGVzY2FwZS8tL2h0bWxlc2NhcGUtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1PZ1B0d2lGTHlqdG1Ra28rZVZrMGxRbkxBMUU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaHRtbHBhcnNlcjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjguMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHRtbHBhcnNlcjIvLS9odG1scGFyc2VyMi0zLjguMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1Xd29zWkZSYW92b1pRR24xNWRYNWNjTUVHZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICIxIiwKKyAgICAgICAgImRvbWhhbmRsZXIiOiAiMi4zIiwKKyAgICAgICAgImRvbXV0aWxzIjogIjEuNSIsCisgICAgICAgICJlbnRpdGllcyI6ICIxLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJodHRwLXNpZ25hdHVyZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9odHRwLXNpZ25hdHVyZS8tL2h0dHAtc2lnbmF0dXJlLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbXV6WkpSRkhjdlBaVzJXbUNydVBmQmo3ck9FPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAianNwcmltIjogIl4xLjIuMiIsCisgICAgICAgICJzc2hwayI6ICJeMS43LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaHR0cHMtYnJvd3NlcmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9odHRwcy1icm93c2VyaWZ5Ly0vaHR0cHMtYnJvd3NlcmlmeS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTdBYkJEZ28wd1BMNjhabjMvWC9Iai8vUVBITT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJodHRwcy1wcm94eS1hZ2VudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9odHRwcy1wcm94eS1hZ2VudC8tL2h0dHBzLXByb3h5LWFnZW50LTIuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1IUENUUzFMVzUxYmN5TVlieFVJT080SEVPbFExLzFxUmFGV2N5eHZ3YXFVUzlUWTg4YW9FdUhVWTMza3VBaDFZaFZWYURRaExac25QZCtYTkFSV1psUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWdlbnQtYmFzZSI6ICJeNC4xLjAiLAorICAgICAgICAiZGVidWciOiAiXjMuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctMy4yLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tZWwramY3bnJ0RWw1UG4xUXg0NnpBUlhLRHBCYnZ6ZXpzZTdwN0xxSU5tZG9JazhQWVA1U3lTYXhFbVl2NlRaMEp5RUtBMWhzQ0lkNkRJaGdJVHRXUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAibXMiOiAiXjIuMS4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm1zIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRncCtkbDVjR2syOHV0WWt0QnNyRnFBN0hLZ3JoZ1BzZzZaL0VmaFdJNGdsMUh3cThCL0dtWS8wb1haNm5GOGhEVmVzUy9GcG5ZYUQva09XaFlRdnlnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpY29udi1saXRlIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjI0IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pY29udi1saXRlLy0vaWNvbnYtbGl0ZS0wLjQuMjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXYzTVhuWkFjdm55d2tUVUVab21JQWN0bGU3UlhYZWVkT1IzMXd3bDdWbHlvWE80UWk5YXJ2U2VuTlFXbmUxVGNSd2hDTDFId0xJMjFiRXFkcGo4L3JBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlci1idWZmZXIiOiAiPj0gMi4xLjIgPCAzIgorICAgICAgfQorICAgIH0sCisgICAgImllZWU3NTQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMTIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2llZWU3NTQvLS9pZWVlNzU0LTEuMS4xMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR2d1UCtEUlkrcEozc295SWlHUFR2ZGlWWGpaK0RiWE94R3BYbjNlTXZOVzR4NGlyanFYbTR3SEtzY0MrVGZ4U0oweXcvUzFGMjR0cWRNTnNNWlRpTEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImluZGVudC1zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5kZW50LXN0cmluZy8tL2luZGVudC1zdHJpbmctMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1qaTFJTklkQ0VodEtnaGkzb1RmcHBTQkozSUE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVwZWF0aW5nIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbmZsaWdodCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmZsaWdodC8tL2luZmxpZ2h0LTEuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtU2Ixak1kZlFMUXdKdkpFS0VIVzZnV1cxYmZrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgIndyYXBweSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgImluaGVyaXRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luaGVyaXRzLy0vaW5oZXJpdHMtMi4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZendzZytQYVFxVUM5U1JtQWlTQTlDQ0NZZDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW5pIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luaS8tL2luaS0xLjMuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUlpZNWh1SUtDTVJXRFVxWmxFaTcyZi9sbVhLTXZ1c3pjTUJkdWxpUTNubldieDlYL1pCUU83RGlqTUVZUzlFaEhCYjJxYWNSVU10Qzdzdkx3ZTBsY3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlubGluZS1zb3VyY2UtbWFwIjogeworICAgICAgInZlcnNpb24iOiAiMC42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lubGluZS1zb3VyY2UtbWFwLy0vaW5saW5lLXNvdXJjZS1tYXAtMC42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rVGswY2NHS2VkRnlUNFkvbzR0WVkzQ3Q0cVU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic291cmNlLW1hcCI6ICJ+MC41LjMiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5zZXJ0LW1vZHVsZS1nbG9iYWxzIjogeworICAgICAgInZlcnNpb24iOiAiNy4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luc2VydC1tb2R1bGUtZ2xvYmFscy8tL2luc2VydC1tb2R1bGUtZ2xvYmFscy03LjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVkU2TmxXK1dHbjIvQWVPTWQ0OTZBSEZZbUU3ZUxLa1VZNlR5MzFrNG9nNXZtQTNGanV3ZTl2NmlmSDZYeC9IejI3UXZkb01vdml3MS9wcVdSQjA5U3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIkpTT05TdHJlYW0iOiAiXjEuMC4zIiwKKyAgICAgICAgImFjb3JuLW5vZGUiOiAiXjEuNS4yIiwKKyAgICAgICAgImNvbWJpbmUtc291cmNlLW1hcCI6ICJeMC44LjAiLAorICAgICAgICAiY29uY2F0LXN0cmVhbSI6ICJeMS42LjEiLAorICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuMCIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMSIsCisgICAgICAgICJwcm9jZXNzIjogIn4wLjExLjAiLAorICAgICAgICAidGhyb3VnaDIiOiAiXjIuMC4wIiwKKyAgICAgICAgInVuZGVjbGFyZWQtaWRlbnRpZmllcnMiOiAiXjEuMS4yIiwKKyAgICAgICAgInh0ZW5kIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbnRlcnByZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW50ZXJwcmV0Ly0vaW50ZXJwcmV0LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZnRHeFFReHFEZzk0ejVYVHVFUU1ZL2VMaGhRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWFic29sdXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFic29sdXRlLy0vaXMtYWJzb2x1dGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRPV29xZmx2Y3lkQVJhMzYwR3Z2MThEWi9nUnVIS2kyTlUvd1U1WDFaRnpkWWZIMjlua2lOWnNGM21wNE9KM0g0eW85TXg4QS91QUdOenB6UE4zeUJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1yZWxhdGl2ZSI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0wLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFlRXNzNjZOaDJjbjd1ODRRL2lnaVh0Y21OWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLWFycmF5aXNoIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFycmF5aXNoLy0vaXMtYXJyYXlpc2gtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1kOG1ZUUZKNnFPeXhxTHBwZTRCa1ducVNhcDA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWJ1ZmZlci8tL2lzLWJ1ZmZlci0xLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTmNkQUx3cFhrVG01WnZ2Yms3b3dPVVN2VnZCS0RnS1A1L2V3ZlhFem5tUUZmczRaUm1hbk9lS0JUalJWamthM1FGb042WEorOUYzVVNxZkhxVGFVNXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWJ1aWx0aW4tbW9kdWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYnVpbHRpbi1tb2R1bGUvLS9pcy1idWlsdGluLW1vZHVsZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZBVnkwMDk2d3hHZmozYkRETHdiSGdONi83ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWlsdGluLW1vZHVsZXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DMTdtU0RpT0xJWUNndWVUOFlWdjdEOHdHMVk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTAuMS42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hdkRZcjBTQjNEd085enNNb3YwZ0tDRVNGWXFDbkU0aHEvNHozVGRVbHVrRXk1dDlDMFlScTdITHJzTjUyTkFjcVhLYWVwZUNEMG4rQjBhcm5WRzNIZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMC4xLjYiLAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4wLjEuNCIsCisgICAgICAgICJraW5kLW9mIjogIl41LjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjEuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTUuMS4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkdFRXJuSDZGMnZVdVhEaCtPbGJjS1c3L3dPY2ZkUkhhWjdWV3RxQ3p0ZkhyaS8rK1lLbVA1MU9kV2VHUHVxQ09iYTZrazJPVGU1ZDAyVm1UQjgwUHc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZXh0ZW5kYWJsZS8tL2lzLWV4dGVuZGFibGUtMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZckVRNG9ta2NVR09Qc05xWVgxSExqQWQvSWs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZXh0Z2xvYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRnbG9iLy0vaXMtZXh0Z2xvYi0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFJd0NVMWVSOEM3VGZIYWh1ZXFYYzhneitNST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1maW5pdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZmluaXRlLy0vaXMtZmluaXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtekdaM2FWWUN2bFVPOFI2TFNxWXdVMEsyMEtvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm51bWJlci1pcy1uYW4iOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZ2xvYi8tL2lzLWdsb2ItMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lNld1SkNGNEJLeHdjSHVXa2lWblNHekQ2RW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZXh0Z2xvYiI6ICJeMi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtbnVtYmVyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLW51bWJlci8tL2lzLW51bWJlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUpQMWlBYVI0TFBVRlljZ1FKMnI4ZlJMWEVaVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLXBsYWluLW9iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wbGFpbi1vYmplY3QvLS9pcy1wbGFpbi1vYmplY3QtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWg1UHBnWGtXaXRjMzhCQk1ZYXdUWU1XSkhGWkpWbkJxdUZFNTd4RnBqQjhwSkZpRjZnWitiVStXeUkveXFYaUZSNW1kTHNnWU5hUGU4dWFvNlV2OU9nPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcmVsYXRpdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcmVsYXRpdmUvLS9pcy1yZWxhdGl2ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS3cvUmVLMGlxd0tldTBNSVRMRnVqMGpiUEFtRWlPc0l3eUlYdnZiZmE2UWZtTjlwa0QxTSs4cGRrN1JsL2RUS2JIMzQvWEJGTWJnRDRpTUpoTFFiR0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXVuYy1wYXRoIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtc3RyZWFtLy0vaXMtc3RyZWFtLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRXRTajNVNW80TGVjNjQyOGhCYzY2QTJSeWtRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJpcy10eXBlZGFycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXR5cGVkYXJyYXkvLS9pcy10eXBlZGFycmF5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNUhuSUNGamZEQnNSM2RwcFFQbGdFZnphU3BvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJpcy11bmMtcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy11bmMtcGF0aC8tL2lzLXVuYy1wYXRoLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tckdwVmQwZnM3V1dMZlZzU3R2Z0Y2aUVKbmJqREZaaDkvZW1oUkRjR1dUZHVUZk5IZDlDSGVVd0gzZ1lJamRid280T242aHVua3p0d09hQXcweWxsUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5jLXBhdGgtcmVnZXgiOiAiXjAuMS4yIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXV0ZjgiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtdXRmOC8tL2lzLXV0ZjgtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TdzJoUkNFRTBiTTJOQTZBZVg2R1hQT2ZmWEk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtd2luZG93cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy13aW5kb3dzLy0vaXMtd2luZG93cy0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZVhLMVVJbnEyYlBtanlYNmUzVkhJek1Mb2JjNEo5NGk0QVduK0hwcTNPVTVLa3JSQzk2T0FjUjNQUkovcEd1Nm04VFJuQkhQOWRrWFFWc1QvQ09WSUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzYXJyYXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNhcnJheS8tL2lzYXJyYXktMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11NU5kU0Znc3VoYU1Cb05KVjZWS1BnY1NUeEU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXNleGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNleGUvLS9pc2V4ZS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZQdnpkTnhWYi9pVWVoRGNzRmN0WXo4cytoQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc29iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc29iamVjdC8tL2lzb2JqZWN0LTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVGtNZWtyRWFsekZqYXFINXlOSE12UDJyZU44PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzc3RyZWFtLy0vaXNzdHJlYW0tMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SK1kvZXZWYSttK1M0VkFPYVE2NHVGS2NDWm89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianMteWFtbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qcy15YW1sLy0vanMteWFtbC0zLjUuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUEzZkRnQmZLdkhNaXNOSDd6U1dra1dRZkw3ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcmdwYXJzZSI6ICJeMS4wLjIiLAorICAgICAgICAiZXNwcmltYSI6ICJeMi42LjAiCisgICAgICB9CisgICAgfSwKKyAgICAianMyeG1scGFyc2VyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzMnhtbHBhcnNlci8tL2pzMnhtbHBhcnNlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVA3WU9xZ2ljVkVENU1aOVJkZ3pOQitKSmx6TT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAieG1sY3JlYXRlIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc2JuIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzYm4vLS9qc2JuLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcGVaVXd1V2kzclh5QWRsczc3eW9EQTd5OVJNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzZG9jIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzZG9jLy0vanNkb2MtMy41LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZQeEI2NVRBVTRXTzBXenlyLzQvWWhsR292WGwwRVZZZnBLYnBTcm9TajBxQnhUNC94b2QvbDQwT3BrbTM4ZFJIUmRRZ2RlWTgzNk0wdVZuSlFHN2tnPT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFieWxvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICAgImJsdWViaXJkIjogIn4zLjUuMCIsCisgICAgICAgICJjYXRoYXJzaXMiOiAifjAuOC45IiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIn4xLjAuNSIsCisgICAgICAgICJqczJ4bWxwYXJzZXIiOiAifjMuMC4wIiwKKyAgICAgICAgImtsYXciOiAifjIuMC4wIiwKKyAgICAgICAgIm1hcmtlZCI6ICJ+MC4zLjYiLAorICAgICAgICAibWtkaXJwIjogIn4wLjUuMSIsCisgICAgICAgICJyZXF1aXp6bGUiOiAifjAuMi4xIiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAifjIuMC4xIiwKKyAgICAgICAgInRhZmZ5ZGIiOiAiMi42LjIiLAorICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS44LjMiCisgICAgICB9CisgICAgfSwKKyAgICAianNoaW50IjogeworICAgICAgInZlcnNpb24iOiAiMi45LjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzaGludC8tL2pzaGludC0yLjkuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS085U0lBS1RsSlFPTTRsRTY0R1FVdEdCUnBUT3V2YnJSclNadzNBaFV4TU5HMjY2blg5aEsyY0tBNFNCaFhPajBpckpHeU55R1NMVDYySEdPVkRFT0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNsaSI6ICJ+MS4wLjAiLAorICAgICAgICAiY29uc29sZS1icm93c2VyaWZ5IjogIjEuMS54IiwKKyAgICAgICAgImV4aXQiOiAiMC4xLngiLAorICAgICAgICAiaHRtbHBhcnNlcjIiOiAiMy44LngiLAorICAgICAgICAibG9kYXNoIjogIn40LjE3LjEwIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJ+My4wLjIiLAorICAgICAgICAicGhhbnRvbSI6ICJ+NC4wLjEiLAorICAgICAgICAicGhhbnRvbWpzLXByZWJ1aWx0IjogIn4yLjEuNyIsCisgICAgICAgICJzaGVsbGpzIjogIjAuMy54IiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAiMS4wLngiLAorICAgICAgICAidW5pY29kZS01LjIuMCI6ICJeMC43LjUiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1qc29uLWNvbW1lbnRzLy0vc3RyaXAtanNvbi1jb21tZW50cy0xLjAuNC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1IaFg3eXNsOVB1bWI4dGM3VEdWckNDdTYrNUU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAianNsaW50IjogeworICAgICAgInZlcnNpb24iOiAiMC4xMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2xpbnQvLS9qc2xpbnQtMC4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Sb0NzeUlDY0tBKzZURnNieXM5RHBLVGZQVmFDNzFNbTVRU2p2cldBMGxEVk4rTEl2eDZhcGE0MkZGaXNNcW1DVHZKOER4a2NvUUdKMGo3bTNrVFZvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhpdCI6ICJ+MC4xLjIiLAorICAgICAgICAiZ2xvYiI6ICJ+Ny4xLjIiLAorICAgICAgICAibm9wdCI6ICJ+My4wLjEiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIn4yLjEuNSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdmNmdWlJeG9nTFY0RGxHQkhJVU93STBJYnJKOEhXUGM0TVU3SHp2aUdlTmhvL1VKRGZpNkI1cDNzSGVXSVEwS0dJVTBKcHhpNVpIeGVtUWZMa2tBd1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibm9wdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjAuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcHQvLS9ub3B0LTMuMC42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXhrWmR2d2lyelUyeldURi9lYXhvcGtheWovaz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhYmJyZXYiOiAiMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuNyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MtbmV4dGljay1hcmdzLy0vcHJvY2Vzcy1uZXh0aWNrLWFyZ3MtMS4wLjcudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRlE0Z3QxWlpDdFA1RUpQeVdrOHEyTC96QzZNPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMS41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVp2cUxjZzRVT0xOa2FCOHEwYVk4WVlSSXlkQT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJidWZmZXItc2hpbXMiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJjb3JlLXV0aWwtaXMiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjEiLAorICAgICAgICAgICAgImlzYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6ICJ+MS4wLjYiLAorICAgICAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4wLjEwLngiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJqc29uLWludDY0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24taW50NjQvLS9qc29uLWludDY0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15clRnOXN3VG9FbGhFUEVUTE1kWmtFekRoYlhMcytjeGt3L2IycmdsTVBPQmxNMURFMHV0SDFFUmVTTUxjbnBZSms1aVV2RDEycjBmUDIveEhpdEY1UT09IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm5vZGUtaW50NjQiOiAiMC40LjAiCisgICAgICB9CisgICAgfSwKKyAgICAianNvbi1zY2hlbWEiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zY2hlbWEvLS9qc29uLXNjaGVtYS0wLjIuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRJRElrdVdhTHdXVlRPY252VDhxVG9ndm5oTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zY2hlbWEtdHJhdmVyc2UvLS9qc29uLXNjaGVtYS10cmF2ZXJzZS0wLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5KcHRSTVU2VWQ2SnRBZ0Z4ZFhsbTBGOU0wQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAianNvbi1zdGFibGUtc3RyaW5naWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24tc3RhYmxlLXN0cmluZ2lmeS8tL2pzb24tc3RhYmxlLXN0cmluZ2lmeS0wLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVlSd2o2QlRiTjFVbjM0VVJrOXRaM1NyeWYwVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJqc29uaWZ5IjogIn4wLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc29uLXN0cmluZ2lmeS1zYWZlIjogeworICAgICAgInZlcnNpb24iOiAiNS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24tc3RyaW5naWZ5LXNhZmUvLS9qc29uLXN0cmluZ2lmeS1zYWZlLTUuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRXBhaTFZL1VYeG1nOXM0QjFsY0I0c2MxdHVzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJqc29uZmlsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb25maWxlLy0vanNvbmZpbGUtMi40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1OemFpdENpNGU3Mmd6SU8xUDZQV002TmNLdWc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuNiIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc29uaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb25pZnkvLS9qc29uaWZ5LTAuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTEhTMjdrSFpQS1ViZTFxdTZQVURZeDBsS25NPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzb25wYXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29ucGFyc2UvLS9qc29ucGFyc2UtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QMDJ1U3BINnd4WDNFR0w0VWh6Q09mRTJZb0E9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianNwcmltIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzcHJpbS8tL2pzcHJpbS0xLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1UNW12QjVjd0c1RGk4RzNTWnd1WEZhc3RxST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiMS4wLjAiLAorICAgICAgICAiZXh0c3ByaW50ZiI6ICIxLjMuMCIsCisgICAgICAgICJqc29uLXNjaGVtYSI6ICIwLjIuMyIsCisgICAgICAgICJ2ZXJyb3IiOiAiMS4xMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImtldyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rZXcvLS9rZXctMC43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lZGs5TFRNMlBXL2RLWEN6TmRrVUd0V1IxNXM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImtpbmQtb2YiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtNi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXM1a0xPY25IMFhxRE8rRnZ1YUxYOEREaloxOENHRms3VnlnSDQwUW9LUFVRaFc0ZTJydk0wcndVcTB0OElRRE93WVNlTEswMVU5ME9qekJUbWUyUXFBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJrbGF3IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tsYXcvLS9rbGF3LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2NFbzROeGM1QkFnRVZFWlR1dWN2NFdHVVBZPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjkiCisgICAgICB9CisgICAgfSwKKyAgICAibGFiZWxlZC1zdHJlYW0tc3BsaWNlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sYWJlbGVkLXN0cmVhbS1zcGxpY2VyLy0vbGFiZWxlZC1zdHJlYW0tc3BsaWNlci0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTUM5NG1IWlJ2SjNMZnlrSmxUVWlwQnFlblp6MXBhY09aRU1oaFE4ZE1HY0RIczBTQkU1R2JzYXZVWFY3WXRQM2ljQlcxN1cwWnkxSTBsZkFTbW85UGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJpc2FycmF5IjogIl4yLjAuNCIsCisgICAgICAgICJzdHJlYW0tc3BsaWNlciI6ICJeMi4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzYXJyYXkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjQiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc2FycmF5Ly0vaXNhcnJheS0yLjAuNC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdNeFhPaVVpcldnMXhUS1JpcE0wRWswN3JYK3VieDRuTlZFbFRKZE5MWW1OTy8yWXJEa2dKR3c5Q2xqWG4rcjRFV2lEUWcvOGxzUmRIeWcyUEp1VWFBPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJsYXp5LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xhenktY2FjaGUvLS9sYXp5LWNhY2hlLTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtb2RlUHc2VUVkTXVBaEYwN08yNGRwSnBFYm80PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImxpZnRvZmYiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjUuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbGlmdG9mZi8tL2xpZnRvZmYtMi41LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JQWtwRzdNYzZvWWJ2eENud1Zvb3l2ZGNNZXc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kIjogIl4zLjAuMCIsCisgICAgICAgICJmaW5kdXAtc3luYyI6ICJeMi4wLjAiLAorICAgICAgICAiZmluZWQiOiAiXjEuMC4xIiwKKyAgICAgICAgImZsYWdnZWQtcmVzcGF3biI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuNCIsCisgICAgICAgICJvYmplY3QubWFwIjogIl4xLjAuMCIsCisgICAgICAgICJyZWNob2lyIjogIl4wLjYuMiIsCisgICAgICAgICJyZXNvbHZlIjogIl4xLjEuNyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZmluZHVwLXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5kdXAtc3luYy8tL2ZpbmR1cC1zeW5jLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWt5YXhTSXdpMGFZSWhsQ29hUUd5MmFrS0xMdz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJkZXRlY3QtZmlsZSI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWdsb2IiOiAiXjMuMS4wIiwKKyAgICAgICAgICAgICJtaWNyb21hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICAgICAicmVzb2x2ZS1kaXIiOiAiXjEuMC4xIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImxvYWQtanNvbi1maWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9hZC1qc29uLWZpbGUvLS9sb2FkLWpzb24tZmlsZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxXa0ZjSTFZdExxMHdpWWJCUFdmTWNtVGRNQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjIiLAorICAgICAgICAicGFyc2UtanNvbiI6ICJeMi4yLjAiLAorICAgICAgICAicGlmeSI6ICJeMi4wLjAiLAorICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIiwKKyAgICAgICAgInN0cmlwLWJvbSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAibG9kYXNoIjogeworICAgICAgInZlcnNpb24iOiAiNC4xNy4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9kYXNoLy0vbG9kYXNoLTQuMTcuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNRS2g4aWdvNVFVaFo3bGczOERZV0F4TXZqU0FLRzBBOHdHU1ZpbVAwN1NJVUVLMlVPK2FyU1JLYlJaV3RlbE10TjVWMEhrd2g1cnlPdG8vU3NoWUlnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJsb2Rhc2gubWVtb2l6ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sb2Rhc2gubWVtb2l6ZS8tL2xvZGFzaC5tZW1vaXplLTMuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTGN2U3dvZkx3S1ZjeENNb3ZReHpZVkRWUGo4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImxvbmdlc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9uZ2VzdC8tL2xvbmdlc3QtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NS0N5MmpqM04zRG9LVW9OSXVaaVh0ZDlBSmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibG91ZC1yZWplY3Rpb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG91ZC1yZWplY3Rpb24vLS9sb3VkLXJlamVjdGlvbi0xLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVcwYjRBVWZ0N2xlSWNQQ0cwRWdoejVtT1ZSOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjdXJyZW50bHktdW5oYW5kbGVkIjogIl4wLjQuMSIsCisgICAgICAgICJzaWduYWwtZXhpdCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAibWFrZS1pdGVyYXRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYWtlLWl0ZXJhdG9yLy0vbWFrZS1pdGVyYXRvci0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcHhpdVhoMGlWRXE3Vk03S01JaHM1Z3hzZnhDdXgyVVJwdFVRYVhvNGlaWkp4QkF6VFBPTEUyQnVtTzVkYmZWWXEvaEJKRkJSL2ExbUZEbU94NUFHbXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgIm1hcC1jYWNoZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXAtY2FjaGUvLS9tYXAtY2FjaGUtMC4yLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13eXE5QzlaU1hac0ZGa1c3VHlhc1hjbUtEYjg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWFwLW9iaiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXAtb2JqLy0vbWFwLW9iai0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJUUE91U0JkZ3IzUFNJYjJkQ3ZjSzAzcUZHMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtYXAtdmlzaXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFwLXZpc2l0Ly0vbWFwLXZpc2l0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN055bzhURkU1bUR4dGIxQjhTODBlZG1OKzQ4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9iamVjdC12aXNpdCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAibWFya2VkIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjE5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXJrZWQvLS9tYXJrZWQtMC4zLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lYTJlR1dPcU54UGNYdjhkeUVSZFNyLzZGbXp2V3d6ak14cGZHQi9zYk1jY1hvY3QreFkrWXVrUEQrUVRVWnd5dks3Qlp3Y3I0bTIxV0JPVzQxcEFrZz09IgorICAgIH0sCisgICAgIm1heG1pbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXhtaW4vLS9tYXhtaW4tMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jVFplaEttZDJQaXo5OVg5NHZBTkhuOXp2bUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgImZpZ3VyZXMiOiAiXjEuMC4xIiwKKyAgICAgICAgImd6aXAtc2l6ZSI6ICJeMS4wLjAiLAorICAgICAgICAicHJldHR5LWJ5dGVzIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1kNS5qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tZDUuanMvLS9tZDUuanMtMS4zLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXhpdFArV3hOUGNUVE9nblRKY3JoTTB4dmRQZXBpcFBTZjNJOEVJcEdLZUZManQzUGxKTElERzN1OEVYNTNaSXVia2IrNVUyKzNyRUxZcEVoSGh6ZGtnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXNoLWJhc2UiOiAiXjMuMC4wIiwKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4xLjIiCisgICAgICB9CisgICAgfSwKKyAgICAibWVvdyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21lb3cvLS9tZW93LTMuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtY3N0bWkwSlNLQ2tLdS9xRmFKSlljd2lvQWZzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZS1rZXlzIjogIl4yLjAuMCIsCisgICAgICAgICJkZWNhbWVsaXplIjogIl4xLjEuMiIsCisgICAgICAgICJsb3VkLXJlamVjdGlvbiI6ICJeMS4wLjAiLAorICAgICAgICAibWFwLW9iaiI6ICJeMS4wLjEiLAorICAgICAgICAibWluaW1pc3QiOiAiXjEuMS4zIiwKKyAgICAgICAgIm5vcm1hbGl6ZS1wYWNrYWdlLWRhdGEiOiAiXjIuMy40IiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMC4xIiwKKyAgICAgICAgInJlYWQtcGtnLXVwIjogIl4xLjAuMSIsCisgICAgICAgICJyZWRlbnQiOiAiXjEuMC4wIiwKKyAgICAgICAgInRyaW0tbmV3bGluZXMiOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vMUFJc2c5Qk9EN3NIN2tVOU0xZDk1b21Rb1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAibWljcm9tYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4xMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWljcm9tYXRjaC8tL21pY3JvbWF0Y2gtMy4xLjEwLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NV2lrZ2w5bjlNM3crYnBzWTNIZThMK3c5ZUY5MzM4eFJsOElBTzV2aURpendTenppRkV5VXpvMnhycmxvQjY0QURiVGY4dUE4dlJxcXR0RFRPbWNjZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyLWRpZmYiOiAiXjQuMC4wIiwKKyAgICAgICAgImFycmF5LXVuaXF1ZSI6ICJeMC4zLjIiLAorICAgICAgICAiYnJhY2VzIjogIl4yLjMuMSIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjIuMC4yIiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4zLjAuMiIsCisgICAgICAgICJleHRnbG9iIjogIl4yLjAuNCIsCisgICAgICAgICJmcmFnbWVudC1jYWNoZSI6ICJeMC4yLjEiLAorICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiLAorICAgICAgICAibmFub21hdGNoIjogIl4xLjIuOSIsCisgICAgICAgICJvYmplY3QucGljayI6ICJeMS4zLjAiLAorICAgICAgICAicmVnZXgtbm90IjogIl4xLjAuMCIsCisgICAgICAgICJzbmFwZHJhZ29uIjogIl4wLjguMSIsCisgICAgICAgICJ0by1yZWdleCI6ICJeMy4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAibWlsbGVyLXJhYmluIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbGxlci1yYWJpbi8tL21pbGxlci1yYWJpbi00LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMTE1ZkxodlpWcVd3SFBiQ2x5bnR4RVZmVkRmbDlETExUdUp2cTNnMk8vT3hpOEFpTm91QUh2RFN6SFMwdmlVSmMrVjV2bTNlcTkxWHdxbjlkcDRqUkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJuLmpzIjogIl40LjAuMCIsCisgICAgICAgICJicm9yYW5kIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJtaW1lIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbWUvLS9taW1lLTIuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pa0JjV3d5cVhRU0hLdGNpQ2NjdHU5WWZQYkZZWjQrZ2JIRW1FMFE4anpjVFlRZzVkSENyM2cyd3dBWmpQb0pmUVZYWnE2S1hBanBYT1RmNS9jalQ3dz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltZS1kYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMzcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS1kYi8tL21pbWUtZGItMS4zNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SM0M0ZGI2YmdRaGxJaFBVNDhmVXRkVm1LbmZscStoUmRhZDdJeUtodEZqMDZWUE5WZGsyUmhpWUwzVWpRSWxzbzhMK1l4QXRGa29iVDBWSytTL3liZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltZS10eXBlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4yMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS10eXBlcy8tL21pbWUtdHlwZXMtMi4xLjIxLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0zaUw2RGJ3cHlMempSM3hIU0ZORmViOU56L004V0RrWDMzdDFHRlFuRk9sbFdrOHBPcmgvTFNyQjVPWGxubFc1UDlMSDczWDZsb1cvZW9nYytGNWxKZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWltZS1kYiI6ICJ+MS4zNy4wIgorICAgICAgfQorICAgIH0sCisgICAgIm1pbmltYWxpc3RpYy1hc3NlcnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1hbGlzdGljLWFzc2VydC8tL21pbmltYWxpc3RpYy1hc3NlcnQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVV0SmNBRDR5RWFHdGpQZXpXdU85d0M0bndVblZILzgvSW0zeUVIUVA0YjY3Y1hsRC9RcjloZElUQ1UxeERiU0VYZzJYS05hUDhqc1JlVjd2UWQwMC9BPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltYWxpc3RpYy1jcnlwdG8tdXRpbHMvLS9taW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOXNBTUhBc0lJa2JseE5tZCs0eDhDRHNyV0NvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1pbmltYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWF0Y2gvLS9taW5pbWF0Y2gtMy4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlKSFZRRWh5cVBMVVRndDlCODNQWHU2VzNyeDRNdnZIdlNVdlRvb2dwd29HRE9VUSt5RHJSMEhSb3QreU9DZENPN3U0aFgzcFdmdDZrV0JCY3FoMFVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJicmFjZS1leHBhbnNpb24iOiAiXjEuMS43IgorICAgICAgfQorICAgIH0sCisgICAgIm1pbmltaXN0IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0wLjAuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWhYL0t2OE01ZlNZbHVDS0NZdWhxcDZBUnNGMD0iCisgICAgfSwKKyAgICAibWl4aW4tZGVlcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taXhpbi1kZWVwLy0vbWl4aW4tZGVlcC0xLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItOFpJdExIZUVnYXFFdmQ1bFlCWGZtNEVaU0ZDWDI5SmI5SytsQUhoREt6UmVLQlFLajNSKzdOT0Y2dGpxWWk5dDRvSThWVWZhV0lUSlFtODZ3blhHTlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1pbiI6ICJeMS4wLjIiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMS4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRlbmRhYmxlLy0vaXMtZXh0ZW5kYWJsZS0xLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFyblhNeFQxaGhvS285azFMWmRtbE55SmRERGZ5MnYwZlhqRmxtb2s0K2k4dWwvNldsYlZnZTliaE03NE9wTlBRUE1HVVRvRHR6K0tYYTFQbmVKeE9BPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC40IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1rZGlycCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21rZGlycC8tL21rZGlycC0wLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1BVjBPT3JHejMrTVIyZnpoa2pXYVgxMXlRTT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWluaW1pc3QiOiAiMC4wLjgiCisgICAgICB9CisgICAgfSwKKyAgICAibW9kdWxlLWRlcHMiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbW9kdWxlLWRlcHMvLS9tb2R1bGUtZGVwcy02LjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItaEtQbU8wNnNvNmJML1p2cVZOVnFkVFZPOFVBWXNpM3RRV2xDYSt6OUt1V2hvTjRLRFF0YjVoY3FRUXY1OHFZaURFMjF3SXZudHRaRVBpRGdFYnB3YkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIkpTT05TdHJlYW0iOiAiXjEuMC4zIiwKKyAgICAgICAgImJyb3dzZXItcmVzb2x2ZSI6ICJeMS43LjAiLAorICAgICAgICAiY2FjaGVkLXBhdGgtcmVsYXRpdmUiOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbmNhdC1zdHJlYW0iOiAifjEuNi4wIiwKKyAgICAgICAgImRlZmluZWQiOiAiXjEuMC4wIiwKKyAgICAgICAgImRldGVjdGl2ZSI6ICJeNS4wLjIiLAorICAgICAgICAiZHVwbGV4ZXIyIjogIl4wLjEuMiIsCisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjEiLAorICAgICAgICAicGFyZW50cyI6ICJeMS4wLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjAuMiIsCisgICAgICAgICJyZXNvbHZlIjogIl4xLjQuMCIsCisgICAgICAgICJzdHJlYW0tY29tYmluZXIyIjogIl4xLjEuMSIsCisgICAgICAgICJzdWJhcmciOiAiXjEuMC4wIiwKKyAgICAgICAgInRocm91Z2gyIjogIl4yLjAuMCIsCisgICAgICAgICJ4dGVuZCI6ICJeNC4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjMuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMy42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdFF0S0E5V0lBaEJGMytWTEFzZXlNcVplQmpXMEFISm94T3RZcVNVWk5KeGF1RXJtTGJWbTJGVzF5K0ovWUE5ZFVyQUMzOUlUZWpsWldoVkl3YXdrS3c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICAgICAiaXNhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4yLjAuMCIsCisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4xIiwKKyAgICAgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MS4xLjEiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJyZXNvbHZlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuOC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS8tL3Jlc29sdmUtMS44LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1BaWNQckFDN1F1MUp4UENaOVpnQ1psWTM1UWdGbk5xYyswTHRiUk54blZ3NFRYdmpRNzJ3bnVMOUpRY0VCZ1hrSTlKTThNc1Q5a2FRb0hjcENSSk9ZQT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAicGF0aC1wYXJzZSI6ICJeMS4wLjUiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZ19kZWNvZGVyLy0vc3RyaW5nX2RlY29kZXItMS4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uL1NobnZEaTZGSGJiVmZ2aXJvK1dvamlGenYrczhNUE1IQmN6VmVQZlVwREpMd29MVDBodDFsNFl3QkNiaThwSkF2ZUVFZG5rSHlQeVRQL216UmZ3Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1zIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21zLy0vbXMtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WZ2l1cmZ3QXZtd3BBZDlmbUdGNGplRFZsOGc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibmFub21hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjEzIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9uYW5vbWF0Y2gvLS9uYW5vbWF0Y2gtMS4yLjEzLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mcG9lMlQwUmJId0JUQlVPZnRBZkJQYURFaTA2dWZhVWFpMG1FNlluMWthY2MzU25URXJmYi9oK1g5NFZYekk2NHJLRkhZSW1YU3Zkd0dHQ213T3FDQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyLWRpZmYiOiAiXjQuMC4wIiwKKyAgICAgICAgImFycmF5LXVuaXF1ZSI6ICJeMC4zLjIiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4yLjAuMiIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAiZnJhZ21lbnQtY2FjaGUiOiAiXjAuMi4xIiwKKyAgICAgICAgImlzLXdpbmRvd3MiOiAiXjEuMC4yIiwKKyAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIiwKKyAgICAgICAgIm9iamVjdC5waWNrIjogIl4xLjMuMCIsCisgICAgICAgICJyZWdleC1ub3QiOiAiXjEuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJuaWNlLXRyeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9uaWNlLXRyeS8tL25pY2UtdHJ5LTEuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0xbmg0NWRlZWI1b2xOWTdlWDgyQmtQTzdTU3hSNVNTWUppUFRyVGRGVVZZd0FsOENLTUE1TjlQalRZa0hpUmppc1ZjeGNRMUhYZExoeDJxeHhKekxOUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibm9kZS1pbnQ2NCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub2RlLWludDY0Ly0vbm9kZS1pbnQ2NC0wLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWg2a0dYTnMxWFRHQzJQbE00UkdJdUNYR2lqcz0iCisgICAgfSwKKyAgICAibm9wdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub3B0Ly0vbm9wdC00LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTBOUm9XdjFVRlJrOGpIVUZZQzBORjgxa1IwMD0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWJicmV2IjogIjEiLAorICAgICAgICAib3NlbnYiOiAiXjAuMS40IgorICAgICAgfQorICAgIH0sCisgICAgIm5vcm1hbGl6ZS1wYWNrYWdlLWRhdGEiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9ybWFsaXplLXBhY2thZ2UtZGF0YS8tL25vcm1hbGl6ZS1wYWNrYWdlLWRhdGEtMi40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTlqalVGYlRQZkV5M1IvYWQvMm9OYkt0VzlIZ292bDVPMUZ2RldLa0tibE5Yb04vT291Nis5K0tLb2hQSzEzWWMzL1R5dW55V2hKcDZndlJOUi9QUEF3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJob3N0ZWQtZ2l0LWluZm8iOiAiXjIuMS40IiwKKyAgICAgICAgImlzLWJ1aWx0aW4tbW9kdWxlIjogIl4xLjAuMCIsCisgICAgICAgICJzZW12ZXIiOiAiMiB8fCAzIHx8IDQgfHwgNSIsCisgICAgICAgICJ2YWxpZGF0ZS1ucG0tcGFja2FnZS1saWNlbnNlIjogIl4zLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJudW1iZXItaXMtbmFuIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL251bWJlci1pcy1uYW4vLS9udW1iZXItaXMtbmFuLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ1h0Z0sxTkNLbElzR3Z1SGtER0ROcFFhQVIwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9hdXRoLXNpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjkuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2F1dGgtc2lnbi8tL29hdXRoLXNpZ24tMC45LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWZleGhVRkZQVEdWOHliQXRTSUdiVjZnT2tTdjhVdFJiREJuQXlMUXc0UVBLa2dObHNIMkJ5UEd0TVVxZFdrb3M2WUNSbUFxVml3Z1pySmMvbVJEelpRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWFzc2lnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtYXNzaWduLy0vb2JqZWN0LWFzc2lnbi00LjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlRbXR4NVpZaDgvQVhMdlVRc3JJdjdzMkNHTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYmplY3QtY29weSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtY29weS8tL29iamVjdC1jb3B5LTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZm4yRmkzZ2IxOG1ScEJ1cGRlMDRFblZPbVl3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvcHktZGVzY3JpcHRvciI6ICJeMC4xLjAiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMi41IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTAuMi41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXcxc2UrUmpzUEprUG1sdkZlK0JLck94Y2dSWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAib2JqZWN0LXZpc2l0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC12aXNpdC8tL29iamVjdC12aXNpdC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTk1eEVrNjhNVTNlMW4rT2RPVjVCQkMzUVJicz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAib2JqZWN0LmRlZmF1bHRzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC5kZWZhdWx0cy8tL29iamVjdC5kZWZhdWx0cy0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9uK0dnelMwQjk2Z2JhRnRpTlhOS2VRMS9zOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS1lYWNoIjogIl4xLjAuMSIsCisgICAgICAgICJhcnJheS1zbGljZSI6ICJeMS4wLjAiLAorICAgICAgICAiZm9yLW93biI6ICJeMS4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC5tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0Lm1hcC8tL29iamVjdC5tYXAtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16NFBsbmNqOHdLMWZRbERoOTRzN2diMkFIVGM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZm9yLW93biI6ICJeMS4wLjAiLAorICAgICAgICAibWFrZS1pdGVyYXRvciI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAib2JqZWN0LnBpY2siOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LnBpY2svLS9vYmplY3QucGljay0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWg2RUt4TUZwUzlMaHkvVTFrYVpoUWZ0ZDEwYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAib25jZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vbmNlLy0vb25jZS0xLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdEc2FwM1dXSFVzUk9zRjluRkM2NzUzWGE5RT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ3cmFwcHkiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJvcy1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zLWJyb3dzZXJpZnkvLS9vcy1icm93c2VyaWZ5LTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFVOengvWENNVmtVL0p2OGE5Z2pqOTJoN0NjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9zLWhvbWVkaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3MtaG9tZWRpci8tL29zLWhvbWVkaXItMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0vN3hKaUROdURvTTk0TUZveCs4VklTR3FmN009IgorICAgIH0sCisgICAgIm9zLXRtcGRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy10bXBkaXIvLS9vcy10bXBkaXItMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11K1owQnNlYXFGeGMvc2RtL2xjMFZWMzZFblE9IgorICAgIH0sCisgICAgIm9zZW52IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zZW52Ly0vb3NlbnYtMC4xLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTBDV2NDRUNkTVZjMlJ3M1U1dzlaanFYNmdhNnViazF4RFZLeHRCUVBLN3dpcy8wRjJyOVQ2azR5ZEdZaGVjbDdZVUJ4QlZ4aEw1b2lzUHNOeEFQZTJnPT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib3MtaG9tZWRpciI6ICJeMS4wLjAiLAorICAgICAgICAib3MtdG1wZGlyIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwLWVhY2gtc2VyaWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3AtZWFjaC1zZXJpZXMvLS9wLWVhY2gtc2VyaWVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEta3c4OUV0MGZVT2REUkZlaUxOYndTc2F0ZjNFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInAtcmVkdWNlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwLXJlZHVjZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wLXJlZHVjZS8tL3AtcmVkdWNlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtR01LdzNaTnFScENsS2ZnakgxaWcvYmFrZmZvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBha28iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFrby8tL3Bha28tMC4yLjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04L2RTTDA3M2dqU05xQlliclo3UDFSdjRPblU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFyZW50cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJlbnRzLy0vcGFyZW50cy0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS90MU5LL0dUcDNkRi9uSGpjZGM4TXdmWngxRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYXRoLXBsYXRmb3JtIjogIn4wLjExLjE1IgorICAgICAgfQorICAgIH0sCisgICAgInBhcnNlLWFzbjEiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZS1hc24xLy0vcGFyc2UtYXNuMS01LjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS1B4N2ZsS1hnNzc1elpwbnA5U3hKbHowMGdUZDRCbUoyeUp1ZlNjNDRnTUNSclJRN05TekFjU0pRZmlmdU9MZ1c2YkVpK2Z0ckFMdHNnQUxlQjJBZHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzbjEuanMiOiAiXjQuMC4wIiwKKyAgICAgICAgImJyb3dzZXJpZnktYWVzIjogIl4xLjAuMCIsCisgICAgICAgICJjcmVhdGUtaGFzaCI6ICJeMS4xLjAiLAorICAgICAgICAiZXZwX2J5dGVzdG9rZXkiOiAiXjEuMC4wIiwKKyAgICAgICAgInBia2RmMiI6ICJeMy4wLjMiCisgICAgICB9CisgICAgfSwKKyAgICAicGFyc2UtZmlsZXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyc2UtZmlsZXBhdGgvLS9wYXJzZS1maWxlcGF0aC0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBqSVNmMU9xODlGWWR2V0hMei82eDJQV3lKRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1hYnNvbHV0ZSI6ICJeMS4wLjAiLAorICAgICAgICAibWFwLWNhY2hlIjogIl4wLjIuMCIsCisgICAgICAgICJwYXRoLXJvb3QiOiAiXjAuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInBhcnNlLWpzb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyc2UtanNvbi8tL3BhcnNlLWpzb24tMi4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05SUQwQkRUdmdIUWZoR2tKbjQzcUdQVmFUY2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXJyb3ItZXgiOiAiXjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgInBhcnNlLXBhc3N3ZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZS1wYXNzd2QvLS9wYXJzZS1wYXNzd2QtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iVnVUU2tWcGs3STlOL1FLT0MxdkZtYW81Y1k9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFzY2FsY2FzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXNjYWxjYXNlLy0vcGFzY2FsY2FzZS0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMyUGxYb0FHeW0vaUY0VFMyeUs5RmRlUmZ4UT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWJyb3dzZXJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1icm93c2VyaWZ5Ly0vcGF0aC1icm93c2VyaWZ5LTAuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1CYXBBNDBOSElDT1MrVVNYOVNONHR5aHErQTJSck4vV3M1RjBaNWFNSERwOThGbDg2bFg4T3RpOEI3dU45M0w0SWZ2NGZIT0VBK3BRdzg3Z21NTy9sUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1leGlzdHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1leGlzdHMvLS9wYXRoLWV4aXN0cy0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUQrdHNaUEQ4VVkyYWRVM1Y3N1lzY0NKMkgwcz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGF0aC1pcy1hYnNvbHV0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWlzLWFic29sdXRlLy0vcGF0aC1pcy1hYnNvbHV0ZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUYwdVNhSE5WTlArOGVzNXI5VHBhbmh0Y1gxOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWtleSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWtleS8tL3BhdGgta2V5LTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUVJ5dHRYVEZvVURUcExHUkRVRFlETW4wQzBBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtcGFyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1wYXJzZS8tL3BhdGgtcGFyc2UtMS4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdTbU9UMkViSHJJTkJmOVNSN0NERUx3bEo4QUVOazNRbjdPaWtLNG5GWUF1M090ZTIrSllOVnZrcEFFUW0zL1RMTkVKRkQveFpKanp5eGczS0JXT3p3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXBsYXRmb3JtIjogeworICAgICAgInZlcnNpb24iOiAiMC4xMS4xNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1wbGF0Zm9ybS8tL3BhdGgtcGxhdGZvcm0tMC4xMS4xNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZHUWhmM1REYUZEd2hTdDQzSHYzMUtWeUcvST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXJvb3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1yb290Ly0vcGF0aC1yb290LTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbWtwb0ZNckJ3TTF6TmdxVjh5Q0R5T3BIUmJjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtcm9vdC1yZWdleCI6ICJeMC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGF0aC1yb290LXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtcm9vdC1yZWdleC8tL3BhdGgtcm9vdC1yZWdleC0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXY4emNqZld4TGNVc2kwUHNPTkdOY3NCTHFXMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXR5cGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC10eXBlLy0vcGF0aC10eXBlLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2NSUGZ1U1IybkJOcEJYYVdrQnd1aytQNUVFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJwaWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGJrZGYyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjE3IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYmtkZjIvLS9wYmtkZjItMy4wLjE3LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VL2lsNU1zclpwN21HZzNtU1Fmbjc0Mm5hMlQrMS92SERDRzUvaVRJM1g5TUtVdVlVWlZMUWh5UnNnMDZtQ2dEQlRkNTdUeHpnWnQ3UCtmWWZqUkx0QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY3JlYXRlLWhhc2giOiAiXjEuMS4yIiwKKyAgICAgICAgImNyZWF0ZS1obWFjIjogIl4xLjEuNCIsCisgICAgICAgICJyaXBlbWQxNjAiOiAiXjIuMC4xIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjAuMSIsCisgICAgICAgICJzaGEuanMiOiAiXjIuNC44IgorICAgICAgfQorICAgIH0sCisgICAgInBlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGVuZC8tL3BlbmQtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lbGZyVlFwbmcva1JVekg4OUdZOVhJNEFlbEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGVyZm9ybWFuY2Utbm93IjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BlcmZvcm1hbmNlLW5vdy8tL3BlcmZvcm1hbmNlLW5vdy0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVl3bjA0T1g2a1Q3QnhwTUhyalpMU3pkOG5ucz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicGhhbnRvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGhhbnRvbS8tL3BoYW50b20tNC4wLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1UejgyWGh0UG13Q2sxRkZQbWVjeTd5UkdaRzJidHB6WTJLSTlmY29QVDd6VDlkZXQwQ2NNeWZCRlBwMVM4RHF6c25Rbm04WllFZmR5NTI4bXdWdGtzQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBoYW50b21qcy1wcmVidWlsdCI6ICJeMi4xLjE2IiwKKyAgICAgICAgInNwbGl0IjogIl4xLjAuMSIsCisgICAgICAgICJ3aW5zdG9uIjogIl4yLjQuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwaGFudG9tanMtcHJlYnVpbHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMTYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BoYW50b21qcy1wcmVidWlsdC8tL3BoYW50b21qcy1wcmVidWlsdC0yLjEuMTYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03OUlTcEtPV2JUWkhhRTZvdW5pRlNiNHE3Kzg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNlIjogIl40LjAuMyIsCisgICAgICAgICJleHRyYWN0LXppcCI6ICJeMS42LjUiLAorICAgICAgICAiZnMtZXh0cmEiOiAiXjEuMC4wIiwKKyAgICAgICAgImhhc2hhIjogIl4yLjIuMCIsCisgICAgICAgICJrZXciOiAiXjAuNy4wIiwKKyAgICAgICAgInByb2dyZXNzIjogIl4xLjEuOCIsCisgICAgICAgICJyZXF1ZXN0IjogIl4yLjgxLjAiLAorICAgICAgICAicmVxdWVzdC1wcm9ncmVzcyI6ICJeMi4wLjEiLAorICAgICAgICAid2hpY2giOiAiXjEuMi4xMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpZnkvLS9waWZ5LTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN1JRYWFzQkRxRW5xV0lTWTU5eW9zVk13NlF3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBpbmtpZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUvLS9waW5raWUtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jbFZyZ00rZzFJcVhUb0RuY2tqb0R0VDMrSEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llLXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlua2llLXByb21pc2UvLS9waW5raWUtcHJvbWlzZS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlUWFczNmVqV01CcHJKc1hoM1lvZ2loRkQvbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwaW5raWUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBvc2l4LWNoYXJhY3Rlci1jbGFzc2VzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bvc2l4LWNoYXJhY3Rlci1jbGFzc2VzLy0vcG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMtMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BZXJBL2p0YTl4b3FiQUwrcTdqQi92ZmdEcXM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJldHR5LWJ5dGVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZXR0eS1ieXRlcy8tL3ByZXR0eS1ieXRlcy0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNpTG9JUVlKclRWVUw0eU5YU0Zaci9CMUhJUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIiwKKyAgICAgICAgIm1lb3ciOiAiXjMuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInByb2Nlc3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjExLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcm9jZXNzLy0vcHJvY2Vzcy0wLjExLjEwLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtY3pJd0RvUUJZYjJqNXBvZEhaR24xTHdXOFlJPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MtbmV4dGljay1hcmdzLy0vcHJvY2Vzcy1uZXh0aWNrLWFyZ3MtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU10RUMxVHFOMEVVNW5lcGhhSjRyQXRUaEh0Qzg2ZE5OOXFDdUVodHNodnBWQmtBVzVaTzdCQVNOOVJFbkY5ZW9YR2NSdWIrcEZ1S0VwT0hFK0hiRU13PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcm9ncmVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2dyZXNzLy0vcHJvZ3Jlc3MtMS4xLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS00bURIajJGaHpkbXc1V3pENEtoZDRYeDZWNzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInByb3h5LWZyb20tZW52IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb3h5LWZyb20tZW52Ly0vcHJveHktZnJvbS1lbnYtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NOFVEbVBjT3ArdVcwaDk3Z1hZd3BWZVJ4KzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHNsIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjI5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wc2wvLS9wc2wtMS4xLjI5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1BZVVtUTBvTE4wMmZsVkhYV2g5c1NKRjdtY2RGcTBwcGlkL0prRXJ1ZmMzaEdJVi9BTWE4Rm85VmdEby9jVDJqRmRPV29GdkhwOTBxcUJINTRXK2dqUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInB1YmxpYy1lbmNyeXB0IjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1YmxpYy1lbmNyeXB0Ly0vcHVibGljLWVuY3J5cHQtNC4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXpWcGE4b0taU3o1YlRNVEZDbGMxZlFPbnl5RXpwbDVvenBpMUI1WWN2QnJkb2hNakgycmZzQnR5WGN1TnV3anNESVhtQllsRjJONUZsSlloUjI5dDhRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJibi5qcyI6ICJeNC4xLjAiLAorICAgICAgICAiYnJvd3NlcmlmeS1yc2EiOiAiXjQuMC4wIiwKKyAgICAgICAgImNyZWF0ZS1oYXNoIjogIl4xLjEuMCIsCisgICAgICAgICJwYXJzZS1hc24xIjogIl41LjAuMCIsCisgICAgICAgICJyYW5kb21ieXRlcyI6ICJeMi4wLjEiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMS4yIgorICAgICAgfQorICAgIH0sCisgICAgInB1bnljb2RlIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1bnljb2RlLy0vcHVueWNvZGUtMS40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13TldtT3ljWWdBclk0ZXNQcFNhY2hOMUJoRjQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHVwcGV0ZWVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdXBwZXRlZXIvLS9wdXBwZXRlZXItMS4xMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pRzRpTU9IaXhjMkVwenFSVitwdjdvM0dnbVUyZE5ZRU1rdkt3U2FRTy92TVpVUmFrd1NPbi9FWUo2T0lSRllPcXVlMXFvcnpJQnZyeXRQSVFCM1l6UT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVidWciOiAiXjQuMS4wIiwKKyAgICAgICAgImV4dHJhY3QtemlwIjogIl4xLjYuNiIsCisgICAgICAgICJodHRwcy1wcm94eS1hZ2VudCI6ICJeMi4yLjEiLAorICAgICAgICAibWltZSI6ICJeMi4wLjMiLAorICAgICAgICAicHJvZ3Jlc3MiOiAiXjIuMC4xIiwKKyAgICAgICAgInByb3h5LWZyb20tZW52IjogIl4xLjAuMCIsCisgICAgICAgICJyaW1yYWYiOiAiXjIuNi4xIiwKKyAgICAgICAgIndzIjogIl42LjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVidWciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNC4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTQuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItcFlBSXplUm84SjZLUEVhSjBWV09oNVB6a2J3L1JldHV6ZWhHTTdRUlJYNWhlNGZQSHgycmRLTUIyNTZlaEpDa1grWFJRbTE2ZVpMcUxOUzhSU1pYWnc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgIm1zIjogIl4yLjEuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJtcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21zLy0vbXMtMi4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10Z3ArZGw1Y0drMjh1dFlrdEJzckZxQTdIS2dyaGdQc2c2Wi9FZmhXSTRnbDFId3E4Qi9HbVkvMG9YWjZuRjhoRFZlc1MvRnBuWWFEL2tPV2hZUXZ5Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAicHJvZ3Jlc3MiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcm9ncmVzcy8tL3Byb2dyZXNzLTIuMC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItN1BpSHRMbGw1TGRuS0lNdzEwMEkrOHhKWFI1Z1cyUXdXWWtUNmlKdmEwYlhpdFpLYS9YTXJTYmRtZzNyMlhuYWlkejlRdW1kMFZQYU1yWmxGOVY5c0E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInFzIjogeworICAgICAgInZlcnNpb24iOiAiNi41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3FzLy0vcXMtNi41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU41WkFYNC9MeEptRis3d043NHBVRDZxQWg5L3dudmRRY2pxOVRaamV2dlh6U1VvN2JmbXc5MXNhcU1qekdTMnhxOTEvb2ROMmRXL1dPbDdxUUhOREdBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicXVlcnlzdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcXVlcnlzdHJpbmcvLS9xdWVyeXN0cmluZy0wLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXNnbUVrZ083SmQrQ0RhZFc1MGNBV0hoU0ZpQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJxdWVyeXN0cmluZy1lczMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcXVlcnlzdHJpbmctZXMzLy0vcXVlcnlzdHJpbmctZXMzLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbnNZZmVRU1lkWEI5YVVGRmx2MlFlazF4SG5NPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJhbmRvbWJ5dGVzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JhbmRvbWJ5dGVzLy0vcmFuZG9tYnl0ZXMtMi4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUNJUTVPRnhmNEpvdTZ1T0tlOXQxQU9ncXBlVTVmZDcwQThOUGRIU0dlWVhxWHNQZTZwZU93STBjVWw4OFJXWjZzUDF2UE1WM2F2ZC9SNmNaNS9zUDFBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmFuZG9tZmlsbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yYW5kb21maWxsLy0vcmFuZG9tZmlsbC0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItODdsY2JSOCtNaGNXY1VpUSs5ZStSd3g4TXlSMlA3cW50MTV5blVsYm0zVFUvZmpiZ3o0R3N2ZlNVRFRlbXRDQ3RWQ3FiNFpjRUZseVBOVGg5YkJUTHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJhbmRvbWJ5dGVzIjogIl4yLjAuNSIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVhZC1vbmx5LXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkLW9ubHktc3RyZWFtLy0vcmVhZC1vbmx5LXN0cmVhbS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUp5VDlhb0VUMXpka3JDaU5RNFluREIyL0YvQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAiXjIuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4zLjYiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0yLjMuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRRdEtBOVdJQWhCRjMrVkxBc2V5TXFaZUJqVzBBSEpveE90WXFTVVpOSnhhdUVybUxiVm0yRlcxeStKL1lBOWRVckFDMzlJVGVqbFpXaFZJd2F3a0t3PT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJjb3JlLXV0aWwtaXMiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjMiLAorICAgICAgICAgICAgImlzYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6ICJ+Mi4wLjAiLAorICAgICAgICAgICAgInNhZmUtYnVmZmVyIjogIn41LjEuMSIsCisgICAgICAgICAgICAic3RyaW5nX2RlY29kZXIiOiAifjEuMS4xIiwKKyAgICAgICAgICAgICJ1dGlsLWRlcHJlY2F0ZSI6ICJ+MS4wLjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZ19kZWNvZGVyLy0vc3RyaW5nX2RlY29kZXItMS4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uL1NobnZEaTZGSGJiVmZ2aXJvK1dvamlGenYrczhNUE1IQmN6VmVQZlVwREpMd29MVDBodDFsNFl3QkNiaThwSkF2ZUVFZG5rSHlQeVRQL216UmZ3Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInJlYWQtcGtnIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWQtcGtnLy0vcmVhZC1wa2ctMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05ZitxWHMwcHl6SEFSMHZLZlhWcmE3S2VQeWc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibG9hZC1qc29uLWZpbGUiOiAiXjEuMC4wIiwKKyAgICAgICAgIm5vcm1hbGl6ZS1wYWNrYWdlLWRhdGEiOiAiXjIuMy4yIiwKKyAgICAgICAgInBhdGgtdHlwZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVhZC1wa2ctdXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZC1wa2ctdXAvLS9yZWFkLXBrZy11cC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW5XUEJNbmJBWlpHTlYvQUNwWDlBb2JaRCt3ST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmaW5kLXVwIjogIl4xLjAuMCIsCisgICAgICAgICJyZWFkLXBrZyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjE0IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0xLjEuMTQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mUFRGVHZaSTQ0RXdoTVkyM1NCNTRXYkFnZGs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjEiLAorICAgICAgICAiaXNhcnJheSI6ICIwLjAuMSIsCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MC4xMC54IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJpc2FycmF5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNhcnJheS8tL2lzYXJyYXktMC4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaWhpcy9LbW85QmQrQ2F2OFlEaVRtd1hSN3Q4PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInJlY2hvaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVjaG9pci8tL3JlY2hvaXItMC42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oU0JMVk51b0xWZEM0b3lXZFc3ME92VU9NNFE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVzb2x2ZSI6ICJeMS4xLjYiCisgICAgICB9CisgICAgfSwKKyAgICAicmVkZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlZGVudC8tL3JlZGVudC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXo1RnFzZjFmSHhiZnNnZ2kzVzdIOXpEQ3I5ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpbmRlbnQtc3RyaW5nIjogIl4yLjEuMCIsCisgICAgICAgICJzdHJpcC1pbmRlbnQiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInJlZ2V4LW5vdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWdleC1ub3QvLS9yZWdleC1ub3QtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUo2U0RqVWdEeFFqNU51c25PdGRGeER3Ti8rSFd5a1I4R0VMd2N0SjdtZHFoY3l5MXhFYzRTUkZIVVh2eFRwNjYxWWFWS0FqZlJMWjljQ3FTNnRuMzJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAic2FmZS1yZWdleCI6ICJeMS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVwZWF0LWVsZW1lbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVwZWF0LWVsZW1lbnQvLS9yZXBlYXQtZWxlbWVudC0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYWhHcTBablY1bTVYdFpMTWIrdlA3NmtjQU01bmtMcWswbHBxQXVvalNLR2dRdG40ZVJpNFpaR20yb2xvMnpLRkgrc01zV2FxT0NXMWRxQW5PcnU3Mmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlcGVhdC1zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVwZWF0LXN0cmluZy8tL3JlcGVhdC1zdHJpbmctMS42LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1qY3JrY09ISWlyd3RZQS8vU25kaWh0cDE1amM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVwZWF0aW5nIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcGVhdGluZy8tL3JlcGVhdGluZy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVVoVEZPcEp0TlZKd2RTZjdxMEZkdkFqUWJkbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1maW5pdGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlcXVlc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjg4LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVlc3QvLS9yZXF1ZXN0LTIuODguMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkFxQlNyaWpHTFpkTTBXWk5zSW5MSnBrSm9rTDcyWFlqVXBuQjBpd3NSZ3hoN2RCNkNPckhuVEJOd04wRStsSERBSnp1N2tMQWtEZVkwOHoyL0EwaGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhd3Mtc2lnbjIiOiAifjAuNy4wIiwKKyAgICAgICAgImF3czQiOiAiXjEuOC4wIiwKKyAgICAgICAgImNhc2VsZXNzIjogIn4wLjEyLjAiLAorICAgICAgICAiY29tYmluZWQtc3RyZWFtIjogIn4xLjAuNiIsCisgICAgICAgICJleHRlbmQiOiAifjMuMC4yIiwKKyAgICAgICAgImZvcmV2ZXItYWdlbnQiOiAifjAuNi4xIiwKKyAgICAgICAgImZvcm0tZGF0YSI6ICJ+Mi4zLjIiLAorICAgICAgICAiaGFyLXZhbGlkYXRvciI6ICJ+NS4xLjAiLAorICAgICAgICAiaHR0cC1zaWduYXR1cmUiOiAifjEuMi4wIiwKKyAgICAgICAgImlzLXR5cGVkYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgImlzc3RyZWFtIjogIn4wLjEuMiIsCisgICAgICAgICJqc29uLXN0cmluZ2lmeS1zYWZlIjogIn41LjAuMSIsCisgICAgICAgICJtaW1lLXR5cGVzIjogIn4yLjEuMTkiLAorICAgICAgICAib2F1dGgtc2lnbiI6ICJ+MC45LjAiLAorICAgICAgICAicGVyZm9ybWFuY2Utbm93IjogIl4yLjEuMCIsCisgICAgICAgICJxcyI6ICJ+Ni41LjIiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMS4yIiwKKyAgICAgICAgInRvdWdoLWNvb2tpZSI6ICJ+Mi40LjMiLAorICAgICAgICAidHVubmVsLWFnZW50IjogIl4wLjYuMCIsCisgICAgICAgICJ1dWlkIjogIl4zLjMuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1ZXN0LXByb2dyZXNzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVlc3QtcHJvZ3Jlc3MvLS9yZXF1ZXN0LXByb2dyZXNzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWFRhN1Y1WWNaenFsdDRqYnlCUWYzeU8wVGdnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ0aHJvdHRsZWl0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1aXp6bGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVxdWl6emxlLy0vcmVxdWl6emxlLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYVVQRFV3eE5tbjVHOGMzZFVjRlkvR2NNMjk0PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogIn4xLjYuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuNi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWl6aXhES3plOWpNM3VMSk9UL2h0UmE2bEthZz0iCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZXNvbHZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUvLS9yZXNvbHZlLTEuMS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSURFVTJDclN4ZTJlamdRUnM1TW9kZWlKNlhzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlc29sdmUtZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUtZGlyLy0vcmVzb2x2ZS1kaXItMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lYVFHUk1OaXZvTHlidi9uT2NtN1U0SUViME09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMCIsCisgICAgICAgICJnbG9iYWwtbW9kdWxlcyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVzb2x2ZS11cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS11cmwvLS9yZXNvbHZlLXVybC0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUxHTi81M3lKT3YwcVpqL2lHcWtJQUdqaUJTbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMTUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JldC8tL3JldC0wLjEuMTUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRUbFlwYStPTCt2TU1ORzI0eFNsUUdFSjNCL1J6RWZVbExjdDdiNUcveXRhdit3UHJwbENwVk1GdXd6WGJrZWNKcmI2SVlvMWlGYjBTOXYzNzc1NG1nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyaWdodC1hbGlnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaWdodC1hbGlnbi8tL3JpZ2h0LWFsaWduLTAuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWVRPYmNpL21vMUZXaVNFTkpPRk1saFNHRSs4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFsaWduLXRleHQiOiAiXjAuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInJpbXJhZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaW1yYWYvLS9yaW1yYWYtMi42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxyZWV3TEsvQmxnaG14dGZIMzZZWVZnMWk4SUFjZTRUSTdvYW83NUkxZzI0NSs2QmN0cVRWUWlCUDNZVUo5QzZEUU9YSm1rWVI5WDlmQ0x0Q09KYzV3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iIjogIl43LjAuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJyaXBlbWQxNjAiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmlwZW1kMTYwLy0vcmlwZW1kMTYwLTIuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1paTRpYWdpMjVXdXNWb2lDNEI0bHE3cGJYZkFwM0Q5djVDd2ZrWTMzdmZmdzIrcGtEalkxRDhHYU43c3BzeHZDU3g4ZGtQcU9aQ0VaeWZ4Y21KRzJJQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaGFzaC1iYXNlIjogIl4zLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAic2FmZS1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZS1idWZmZXIvLS9zYWZlLWJ1ZmZlci01LjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR2QyVVpCSkRrWGxZN0diSnhmc0U4L252S2tVRVUxRzM4YzFzaU42UVA2YTlQVDlNbUhCOEducHNjU21NSlNvRjhMT0lydDh1ZC93UHRvanlzNEc2K2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNhZmUtcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZS1yZWdleC8tL3NhZmUtcmVnZXgtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RS05tbnpzSGZSNlVQVVJpbmhWOTFJQWp2eTQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmV0IjogIn4wLjEuMTAiCisgICAgICB9CisgICAgfSwKKyAgICAic2FmZXItYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NhZmVyLWJ1ZmZlci8tL3NhZmVyLWJ1ZmZlci0yLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWVpvM0s4MlNEN1JpeWkwRTFFUVBvakx6N2twZXBuU1FJOUl5UGJISGcxWFhYZXZiNWRKSTd0cHlOMkFEeEdjUWJIRzd2Y3lSSGswY2J3cWNRcmlVdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNlbXZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZW12ZXIvLS9zZW12ZXItNS42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJTOVI2UjM1TllnUW4rK2ZrRFdhT21xR29qNEVrOWdHcytEUHhOVVpLdXdFMTgzeGpKcm9LdnlvMUl6VkZlWHZVcnZtQUx5NkZXRDV4cmRKVDI1Z01nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzZXQtdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2V0LXZhbHVlLy0vc2V0LXZhbHVlLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1odzB5eGs5R1QvSHI1eUpFWW5ITktZWGtJQThtVkpnZDlkaXRZWkNlMTZaY3pjYUVMWVljZnZhWGVzTkFDazJPOE8wblRpUFFjUWhHVVFqOEpMemVlZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4xIiwKKyAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjMiLAorICAgICAgICAic3BsaXQtc3RyaW5nIjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzaGEuanMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hhLmpzLy0vc2hhLmpzLTIuNC4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUU1FcDVCN2NmdEU3QVBPams1WTZ4Z3JiV3UrV2tMVlF3azhKTmpaOG5LUmNpWmFCeUVXNk11YmllQWlUb1M3K2R3dnJqR2hIOGpSWHozTVZkMEFZcVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAic2hhc3VtIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hhc3VtLy0vc2hhc3VtLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNXdFakVOajBGL1RldFhFaFVPVm5pNGV1Vmw4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImpzb24tc3RhYmxlLXN0cmluZ2lmeSI6ICJ+MC4wLjAiLAorICAgICAgICAic2hhLmpzIjogIn4yLjQuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzaGViYW5nLWNvbW1hbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1jb21tYW5kLy0vc2hlYmFuZy1jb21tYW5kLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUktyR1cybGJBem1KYU1PZk5qL3VYZXI5OGVvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNoZWJhbmctcmVnZXgiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNoZWJhbmctcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1yZWdleC8tL3NoZWJhbmctcmVnZXgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0ya0wwbDBEQXRDMnl5cGNvVnh5eGtNbU8vcU09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2hlbGwtcXVvdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlbGwtcXVvdGUvLS9zaGVsbC1xdW90ZS0xLjYuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTlIZ1pTY3prQW1seEowTU9vN1BGUjI5SUYyYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS1maWx0ZXIiOiAifjAuMC4wIiwKKyAgICAgICAgImFycmF5LW1hcCI6ICJ+MC4wLjAiLAorICAgICAgICAiYXJyYXktcmVkdWNlIjogIn4wLjAuMCIsCisgICAgICAgICJqc29uaWZ5IjogIn4wLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzaGVsbGpzIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NoZWxsanMvLS9zaGVsbGpzLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTlpibU1IcDRGVVQxa2ZOOXBoZzJEekhiVjdFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpZ25hbC1leGl0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NpZ25hbC1leGl0Ly0vc2lnbmFsLWV4aXQtMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZjNBanhLSDZoRjRZbzVCWGlVVEszTmtiRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2ltcGxlLWNvbmNhdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaW1wbGUtY29uY2F0Ly0vc2ltcGxlLWNvbmNhdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWMwVEx1TGJpYjdKOVpyTDhodm4yMVpsMUljWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzbmFwZHJhZ29uIjogeworICAgICAgInZlcnNpb24iOiAiMC44LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NuYXBkcmFnb24vLS9zbmFwZHJhZ29uLTAuOC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GdHlPbldOL3dDSFRWWE9Nd3ZTdjI2ZCtrbzV2V2xJREQ2em9VSjdMVzh2aCtaQkM4UWRsanZlUlArY3JOcnRCd2lvRVVXeS80ZE10YkJqQTRpb05sZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFzZSI6ICJeMC4xMS4xIiwKKyAgICAgICAgImRlYnVnIjogIl4yLjIuMCIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjAuMi41IiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICJtYXAtY2FjaGUiOiAiXjAuMi4yIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAiXjAuNS42IiwKKyAgICAgICAgInNvdXJjZS1tYXAtcmVzb2x2ZSI6ICJeMC41LjAiLAorICAgICAgICAidXNlIjogIl4zLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMi41IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTAuMi41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXcxc2UrUmpzUEprUG1sdkZlK0JLck94Y2dSWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInNuYXBkcmFnb24tbm9kZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zbmFwZHJhZ29uLW5vZGUvLS9zbmFwZHJhZ29uLW5vZGUtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU8yN2w0eGFNWXQvUlNRNVRSM3ZwV0NBQjVLYi9jekljcVVGT00vQzRmWWNMbmJaVWMxUGtqVEFNam9mMnBCV2FTVHdPVWQ2cVVIY0ZHVkdqN2FJd253PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIsCisgICAgICAgICJzbmFwZHJhZ29uLXV0aWwiOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZHA2NnJ6OUtZNnJUcjU2Tk1FeWJ2bm0vc09ZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW01aG5IVGtjVnNQZnF4M0FLbHl0dElQYjdKK1h5a0h2SlAyQjliWkRqbGhMSW9FcTRYb0s2NFZnN2JvWmxWV1lLNkxVWTk0ZFlQRUU3TGgwWmtaS2NRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYlJYeTFGbXRBb0NqUWtWbUlWWXd1dXFERlViYU9lRGptZWQxdE9HUHJzTWh0SkE0ckQ5dGtnQTBGMXFKM2dSRlJYY0hZVmtkZWFQNTBRNXJFL2pMUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTEuMC4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItMmVpczVXcVFHVjdwZW9vRHlMbU5FUFVycHM5K1NYWDVjOXBMM3hFQis0ZTlIbkd1RGE3bUI3a0h4SHc0Q2JxUzlrMVQyaE9IM21pTDhuOFd0aVlWdGc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzbmFwZHJhZ29uLXV0aWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc25hcGRyYWdvbi11dGlsLy0vc25hcGRyYWdvbi11dGlsLTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tYktrTWRRS3NqWDRCQUw0YlJZVGoyMWVkT2Y4Y043WEhkWVVKRWUrWm45OWhWRVljTXZLUGN0MUlxTmU3K0FaUGlybjhCQ0RPUUJIUVprbnFtS2xaUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4yLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzb3VyY2UtbWFwIjogeworICAgICAgInZlcnNpb24iOiAiMC41LjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAvLS9zb3VyY2UtbWFwLTAuNS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaWdPZExSQWgwaTBlb1V5QTJPcEdpNkx2UDh3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNvdXJjZS1tYXAtcmVzb2x2ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLXJlc29sdmUvLS9zb3VyY2UtbWFwLXJlc29sdmUtMC41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU1qcXN2Tnd5ejFzMGs4MUdvei85dlJCZTlTWmRCMDlCZHcrL3pZeU8rM0N1UGs2Zm91VGF4c2NIa2d0RThqS3ZmMDFrVmZsOHJpSHpFUlEva2VmYVNBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhdG9iIjogIl4yLjEuMSIsCisgICAgICAgICJkZWNvZGUtdXJpLWNvbXBvbmVudCI6ICJeMC4yLjAiLAorICAgICAgICAicmVzb2x2ZS11cmwiOiAiXjAuMi4xIiwKKyAgICAgICAgInNvdXJjZS1tYXAtdXJsIjogIl4wLjQuMCIsCisgICAgICAgICJ1cml4IjogIl4wLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzb3VyY2UtbWFwLXVybCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLXVybC8tL3NvdXJjZS1tYXAtdXJsLTAuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUHBOZGZkMXpZeHVYWlpsVzFWRW82SHRRaEtNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNwZHgtY29ycmVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGR4LWNvcnJlY3QvLS9zcGR4LWNvcnJlY3QtMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXE5aGVkdHp5WEhyNVMwQTF2RVBvSy83bDhOcGZrRllUcTZpQ1krUG5vMlpiZFpSNldleFpGdHFlVkdrR3hXM1RFSk1OOTE0WjU1RW5BR01tZW5sSVFRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcGR4LWV4cHJlc3Npb24tcGFyc2UiOiAiXjMuMC4wIiwKKyAgICAgICAgInNwZHgtbGljZW5zZS1pZHMiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNwZHgtZXhjZXB0aW9ucyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGR4LWV4Y2VwdGlvbnMvLS9zcGR4LWV4Y2VwdGlvbnMtMi4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJYUUFDZkVsS2k5U2xWYjFDWWFkS0RYdm9halBnQlZQbi9nT1FMclR2SGRFbGFWaHI3WkVicUphUm5KTFZOZWFJNGNNRUFnVkNlQk1LRjZNV1JEQ1JBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzcGR4LWV4cHJlc3Npb24tcGFyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BkeC1leHByZXNzaW9uLXBhcnNlLy0vc3BkeC1leHByZXNzaW9uLXBhcnNlLTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZZzZEM1hwUkQ0a2tPbVRwZGdiVWlFSkZLZ2hKSDAzZmlDMU9QbGw1aC8wc082bmVoMmpxUkRWSE9RNG8vTE1lYTB0Z0NrYk1nZWE1aXAvZStNa1d5Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3BkeC1leGNlcHRpb25zIjogIl4yLjEuMCIsCisgICAgICAgICJzcGR4LWxpY2Vuc2UtaWRzIjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcGR4LWxpY2Vuc2UtaWRzIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwZHgtbGljZW5zZS1pZHMvLS9zcGR4LWxpY2Vuc2UtaWRzLTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1UZk9mUGNZR0JCNXNEdVBuM2RlQnl4UGhtZmVnQWhwRFlLU09YWlFOODFPeXJyaWY4WkNvZE9MekszQWVzRUxuQ3gwM2tpa2h5RHdoMHBmdnZRdkY4dz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3BsaXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BsaXQvLS9zcGxpdC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbVR5T29QYnJpdnRYbnduSXhaUkZZUnJQTnRFRktscEIyZnZqU25DUVVpQUE2cUFaenF3bmE1ZW52SzR1azZPSWVQMTdDc2RGM3JTQkdZVkJzVTBUa2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ0aHJvdWdoIjogIjIiCisgICAgICB9CisgICAgfSwKKyAgICAic3BsaXQtc3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwbGl0LXN0cmluZy8tL3NwbGl0LXN0cmluZy0zLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTnpOVmhKRFlwd2NlVlZpaTgvSHU2REtmRDJHK05yUUhsUy9WL3Fndjc2M0VZdWRWd0VjTVFOeGQybGgrMFZyVUJ5WE4vb0prbDVnck9oWVd2UVVZaXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcHJpbnRmLWpzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwcmludGYtanMvLS9zcHJpbnRmLWpzLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTnI1NE1ncitXQUgyenFQdWVMYmxxcmxBNmd3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNzaHBrIjogeworICAgICAgInZlcnNpb24iOiAiMS4xNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zc2hway8tL3NzaHBrLTEuMTUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbVNkZ05VYWlkaytkUlU1TWhZdE45emViZHpGMmlHMGNOUFd5OEhHK1c4eStmVDFKblNraDBmenpwak9hMEw3UDhpMVJzY3ozOHQwaDRnUGNLejQzeEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc24xIjogIn4wLjIuMyIsCisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAiYmNyeXB0LXBia2RmIjogIl4xLjAuMCIsCisgICAgICAgICJkYXNoZGFzaCI6ICJeMS4xMi4wIiwKKyAgICAgICAgImVjYy1qc2JuIjogIn4wLjEuMSIsCisgICAgICAgICJnZXRwYXNzIjogIl4wLjEuMSIsCisgICAgICAgICJqc2JuIjogIn4wLjEuMCIsCisgICAgICAgICJzYWZlci1idWZmZXIiOiAiXjIuMC4yIiwKKyAgICAgICAgInR3ZWV0bmFjbCI6ICJ+MC4xNC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0YWNrLXRyYWNlIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdGFjay10cmFjZS8tL3N0YWNrLXRyYWNlLTAuMC4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZIeHdzMGZvMHl0T0VJNmhvcUZaNWYzZUdjQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAic3RhdGljLWV4dGVuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdGF0aWMtZXh0ZW5kLy0vc3RhdGljLWV4dGVuZC0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVlJQ2NPY3YvVlROeUp2MWVDMUlQTkI4ZnRjWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjAuMi41IiwKKyAgICAgICAgIm9iamVjdC1jb3B5IjogIl4wLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMi41IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTAuMi41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXcxc2UrUmpzUEprUG1sdkZlK0JLck94Y2dSWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJlYW0tYnJvd3NlcmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmVhbS1icm93c2VyaWZ5Ly0vc3RyZWFtLWJyb3dzZXJpZnktMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1aaVp1NWZtOXVaUUtUa1VVeXZ0RHUzSGx5ZHM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4xIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjMuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMy42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdFF0S0E5V0lBaEJGMytWTEFzZXlNcVplQmpXMEFISm94T3RZcVNVWk5KeGF1RXJtTGJWbTJGVzF5K0ovWUE5ZFVyQUMzOUlUZWpsWldoVkl3YXdrS3c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICAgICAiaXNhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4yLjAuMCIsCisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4xIiwKKyAgICAgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MS4xLjEiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0xLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW4vU2hudkRpNkZIYmJWZnZpcm8rV29qaUZ6ditzOE1QTUhCY3pWZVBmVXBESkx3b0xUMGh0MWw0WXdCQ2JpOHBKQXZlRUVkbmtIeVB5VFAvbXpSZndnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic3RyZWFtLWNvbWJpbmVyMiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJlYW0tY29tYmluZXIyLy0vc3RyZWFtLWNvbWJpbmVyMi0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSswMktGQ0RxTmlkazRoclVlQU9YdnJ5MEhMND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkdXBsZXhlcjIiOiAifjAuMS4wIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjMuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMy42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdFF0S0E5V0lBaEJGMytWTEFzZXlNcVplQmpXMEFISm94T3RZcVNVWk5KeGF1RXJtTGJWbTJGVzF5K0ovWUE5ZFVyQUMzOUlUZWpsWldoVkl3YXdrS3c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICAgICAiaXNhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4yLjAuMCIsCisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4xIiwKKyAgICAgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MS4xLjEiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0xLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW4vU2hudkRpNkZIYmJWZnZpcm8rV29qaUZ6ditzOE1QTUhCY3pWZVBmVXBESkx3b0xUMGh0MWw0WXdCQ2JpOHBKQXZlRUVkbmtIeVB5VFAvbXpSZndnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic3RyZWFtLWh0dHAiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjguMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyZWFtLWh0dHAvLS9zdHJlYW0taHR0cC0yLjguMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItK1RTa2ZJTkhEbzRKK1pvYlFMV2lNb3VRWUIrVVZZRnR0UkE5NEZwRXp6SjdaZHFjTDR1VVVRN1drZGtJNERTb3pHbWdCVUUvYTQ3TCszOFBlblhoVXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJ1aWx0aW4tc3RhdHVzLWNvZGVzIjogIl4zLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjEiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjMuNiIsCisgICAgICAgICJ0by1hcnJheWJ1ZmZlciI6ICJeMS4wLjAiLAorICAgICAgICAieHRlbmQiOiAiXjQuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4zLjYiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0yLjMuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRRdEtBOVdJQWhCRjMrVkxBc2V5TXFaZUJqVzBBSEpveE90WXFTVVpOSnhhdUVybUxiVm0yRlcxeStKL1lBOWRVckFDMzlJVGVqbFpXaFZJd2F3a0t3PT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJjb3JlLXV0aWwtaXMiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjMiLAorICAgICAgICAgICAgImlzYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6ICJ+Mi4wLjAiLAorICAgICAgICAgICAgInNhZmUtYnVmZmVyIjogIn41LjEuMSIsCisgICAgICAgICAgICAic3RyaW5nX2RlY29kZXIiOiAifjEuMS4xIiwKKyAgICAgICAgICAgICJ1dGlsLWRlcHJlY2F0ZSI6ICJ+MS4wLjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZ19kZWNvZGVyLy0vc3RyaW5nX2RlY29kZXItMS4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uL1NobnZEaTZGSGJiVmZ2aXJvK1dvamlGenYrczhNUE1IQmN6VmVQZlVwREpMd29MVDBodDFsNFl3QkNiaThwSkF2ZUVFZG5rSHlQeVRQL216UmZ3Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInN0cmVhbS1zcGxpY2VyIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmVhbS1zcGxpY2VyLy0vc3RyZWFtLXNwbGljZXItMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HMk8rUTRvVFBrdG5ITUdUVVpkZ0FYV1JEWU09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4xIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjMuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMy42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdFF0S0E5V0lBaEJGMytWTEFzZXlNcVplQmpXMEFISm94T3RZcVNVWk5KeGF1RXJtTGJWbTJGVzF5K0ovWUE5ZFVyQUMzOUlUZWpsWldoVkl3YXdrS3c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICAgICAiaXNhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4yLjAuMCIsCisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4xIiwKKyAgICAgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MS4xLjEiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0xLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW4vU2hudkRpNkZIYmJWZnZpcm8rV29qaUZ6ditzOE1QTUhCY3pWZVBmVXBESkx3b0xUMGh0MWw0WXdCQ2JpOHBKQXZlRUVkbmtIeVB5VFAvbXpSZndnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEwLjMxIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmdfZGVjb2Rlci8tL3N0cmluZ19kZWNvZGVyLTAuMTAuMzEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZdUlEdkVGMmJHd295ZnlFTUIyckhGTVErcFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3RyaXAtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWFuc2kvLS9zdHJpcC1hbnNpLTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYWpoZnVJVTlsUzFmOEYwT2lxK1VKNDNHUGM4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWJvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1ib20vLS9zdHJpcC1ib20tMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZaG1vVmhaU0JKSHpWNGk5dnhSSHFaeCthdzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtdXRmOCI6ICJeMC4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaXAtaW5kZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWluZGVudC8tL3N0cmlwLWluZGVudC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURIbGlwcTN2cDd2VXJEWmtZS1k0VlNyaG9LST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtanNvbi1jb21tZW50cy8tL3N0cmlwLWpzb24tY29tbWVudHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QRk1aUXVrSXdtbDhEc05FaFl3b2JIeWdwZ289IgorICAgIH0sCisgICAgInN1YmFyZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdWJhcmcvLS9zdWJhcmctMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05aXp4ZFlIcGxyU1B5V1ZwbjFUQWF1Sm91Tkk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWluaW1pc3QiOiAiXjEuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vMUFJc2c5Qk9EN3NIN2tVOU0xZDk1b21Rb1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjUuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci01LjUuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUWpWandkWEl0NDA4TUlpQXFDWDRvVUtzZ1UyRXFBR3pzMlBwa200YVFZYmptK1pFV0VjVzRTZkZOVHI0dU1OWm1hMGV5NGY1bGdMcmtCMGFYMFFNb3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy1mbGFnIjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzeW50YXgtZXJyb3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3ludGF4LWVycm9yLy0vc3ludGF4LWVycm9yLTEuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZUFBsdTY3bWRuSEdUdXAyQThmZjdCQzJQanEwZTBZcC9JeVRGTjAzeldPMFJjSzA3dUxjYmk3QzJLcEdSMkZ2V2JhQjArYmZFMjdhK3NCS2ViU283dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWNvcm4tbm9kZSI6ICJeMS4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidGFmZnlkYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YWZmeWRiLy0vdGFmZnlkYi0yLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZMeTJTMW9VRzJvdS9DeGRMR2UwNFZDeW9tZz0iCisgICAgfSwKKyAgICAidGhyb3R0bGVpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90aHJvdHRsZWl0Ly0vdGhyb3R0bGVpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW5uaFlOdHIwWjBNVVdsbUV0aWFOZ29Vb3JHdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAidGhyb3VnaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3Rocm91Z2gvLS90aHJvdWdoLTIuMy44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRGRUSi82cThOWGxnc2Jja0VWMStEb2FpNGZVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInRocm91Z2gyIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rocm91Z2gyLy0vdGhyb3VnaDItMi4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLS9tclJvZDh4cXBBK0lIU0x5R0NRMnM4U1BIaUNERWVRSlNlcDFqcUxZZUVVQ2xPRkcyUXNoKzRGVTZHOVZlcXBabkdXL1N1OExRR2M0WUtuaTVyWVNRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAifjIuMy42IiwKKyAgICAgICAgInh0ZW5kIjogIn40LjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMy42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMi4zLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10UXRLQTlXSUFoQkYzK1ZMQXNleU1xWmVCalcwQUhKb3hPdFlxU1VaTkp4YXVFcm1MYlZtMkZXMXkrSi9ZQTlkVXJBQzM5SVRlamxaV2hWSXdhd2tLdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4zIiwKKyAgICAgICAgICAgICJpc2FycmF5IjogIn4xLjAuMCIsCisgICAgICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiAifjIuMC4wIiwKKyAgICAgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjEiLAorICAgICAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4xLjEuMSIsCisgICAgICAgICAgICAidXRpbC1kZXByZWNhdGUiOiAifjEuMC4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN0cmluZ19kZWNvZGVyIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmdfZGVjb2Rlci8tL3N0cmluZ19kZWNvZGVyLTEuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbi9TaG52RGk2RkhiYlZmdmlybytXb2ppRnp2K3M4TVBNSEJjelZlUGZVcERKTHdvTFQwaHQxbDRZd0JDYmk4cEpBdmVFRWRua0h5UHlUUC9telJmd2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgInNhZmUtYnVmZmVyIjogIn41LjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ0aW1lcnMtYnJvd3NlcmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90aW1lcnMtYnJvd3NlcmlmeS8tL3RpbWVycy1icm93c2VyaWZ5LTEuNC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteWNXTFYxdm9RSE4xeTE0a1l0ck81ME5aOUIwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInByb2Nlc3MiOiAifjAuMTEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1hcnJheWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1hcnJheWJ1ZmZlci8tL3RvLWFycmF5YnVmZmVyLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZlNLYkg4eGpma1pzb0lFWUNEYW5xci80UDBNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInRvLW9iamVjdC1wYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RvLW9iamVjdC1wYXRoLy0vdG8tb2JqZWN0LXBhdGgtMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1LWFdJdDdEbjRLd0k0RTVuTDRYQjlKbWVGNjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1yZWdleC8tL3RvLXJlZ2V4LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GV3RsZU5BdFovS2kycXRxZWoyQ1hUT2F5T0g5YkhEUUYrUTQ4VnBXeURYamJZeEE0WXo4aURCMzF6WE9CVWxPSEhLaWREYnFHVnJUVXZRTVBtQkdCdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4yLjAuMiIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAicmVnZXgtbm90IjogIl4xLjAuMiIsCisgICAgICAgICJzYWZlLXJlZ2V4IjogIl4xLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1yZWdleC1yYW5nZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1yZWdleC1yYW5nZS8tL3RvLXJlZ2V4LXJhbmdlLTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZklEQmU1Myt2bG1lSnpaK0RVM1ZXUUZCMnpnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAicmVwZWF0LXN0cmluZyI6ICJeMS42LjEiCisgICAgICB9CisgICAgfSwKKyAgICAidG91Z2gtY29va2llIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RvdWdoLWNvb2tpZS8tL3RvdWdoLWNvb2tpZS0yLjQuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUTVzcmsvNHZETTU0V0pzSmlvM1hObjZLMnNDRytDUThHNVd6NmJaaFJab0FlLytUeGpXQi9HbEZBbllFYmtZVmxPTjlGTWsvZkUzaDJSTHBQWG80bFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwc2wiOiAiXjEuMS4yNCIsCisgICAgICAgICJwdW55Y29kZSI6ICJeMS40LjEiCisgICAgICB9CisgICAgfSwKKyAgICAidHJpbS1uZXdsaW5lcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90cmltLW5ld2xpbmVzLy0vdHJpbS1uZXdsaW5lcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdJZVdhN1dDcEZBNlFldFNUMzAxQVJnVnBoTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0dHktYnJvd3NlcmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90dHktYnJvd3NlcmlmeS8tL3R0eS1icm93c2VyaWZ5LTAuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1DM1RhTzdLODFZdmpDZ1FIOVExUzNSM1AzQnROM1JJTThuK092WDRpbDFLMXpnRThaaEkwb3A3a0NsZ2t4dHV0SUU4aFFyY3JIQlh2SWhlcUtVVUN4dz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidHVubmVsLWFnZW50IjogeworICAgICAgInZlcnNpb24iOiAiMC42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R1bm5lbC1hZ2VudC8tL3R1bm5lbC1hZ2VudC0wLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUo2WGVvR3Myc0VvS21XWjNTeWtJYVBEOFFQMD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInR3ZWV0bmFjbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTQuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHdlZXRuYWNsLy0vdHdlZXRuYWNsLTAuMTQuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVd1YUJkL0dTMUVWaWFkRUlyNmsvK0hRL1QyUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0eXBlZGFycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R5cGVkYXJyYXkvLS90eXBlZGFycmF5LTAuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaG5ySFRqaGtHSHNkUFVmWmxxZU94Y2lEQjNjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVnbGlmeS1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3VnbGlmeS1qcy8tL3VnbGlmeS1qcy0yLjYuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVplb3Zzd1djazVScEx4WCsySHdyTnNGcm10OD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYyI6ICJ+MC4yLjYiLAorICAgICAgICAic291cmNlLW1hcCI6ICJ+MC41LjEiLAorICAgICAgICAidWdsaWZ5LXRvLWJyb3dzZXJpZnkiOiAifjEuMC4wIiwKKyAgICAgICAgInlhcmdzIjogIn4zLjEwLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFzeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMi4xMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMvLS9hc3luYy0wLjIuMTAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdHJ2Z3NHZExuWEdYQ01vNDNvd2pmTFVtdzlFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVnbGlmeS10by1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VnbGlmeS10by1icm93c2VyaWZ5Ly0vdWdsaWZ5LXRvLWJyb3dzZXJpZnktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iZ2trMXIybXRhL2pTZU9hYldNb1VLRDRncmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidW1kIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VtZC8tL3VtZC0zLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNEljR1N1ZmhGc2h2TE5jTUNWODBVblFWbFo1cE1PQzhtdk5QRm9ycXdBNCtsellRdWV0VEVTTERRa2VMbWlocThiUmNucGJRYTQ4V2I4TGgxNi94b3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVuYy1wYXRoLXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuYy1wYXRoLXJlZ2V4Ly0vdW5jLXBhdGgtcmVnZXgtMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS01ejNUMTdEWHhlMkcrNnhyQ3VmWXhxYWRVUG89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidW5kZWNsYXJlZC1pZGVudGlmaWVycyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlY2xhcmVkLWlkZW50aWZpZXJzLy0vdW5kZWNsYXJlZC1pZGVudGlmaWVycy0xLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMTNFYWVvY080ZWRGLzNKS2ltZTlyRDdvQjZRSThsbEFHaGduNWZLT1B5ZmtKYlJiNk5GdjlwWVY2ZEZFbXBhNHVSaktlQnFMWlA4R3B1enFIbEtETVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFjb3JuLW5vZGUiOiAiXjEuMy4wIiwKKyAgICAgICAgImdldC1hc3NpZ25lZC1pZGVudGlmaWVycyI6ICJeMS4yLjAiLAorICAgICAgICAic2ltcGxlLWNvbmNhdCI6ICJeMS4wLjAiLAorICAgICAgICAieHRlbmQiOiAiXjQuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjguMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS44LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1UeisxT3hCdVlKZjgrY3RCQ2ZLbDZiMzZVQ0k9IgorICAgIH0sCisgICAgInVuZGVyc2NvcmUtY29udHJpYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLWNvbnRyaWIvLS91bmRlcnNjb3JlLWNvbnRyaWItMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1abHRtd2tlRCtQb3JHTW40eTdEaXg5U01Kc2M9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiAiMS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IgorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5kZXJzY29yZS5zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjMuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS5zdHJpbmcvLS91bmRlcnNjb3JlLnN0cmluZy0zLjMuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZytkcG1nbitYQm5lTG1YWG8rc0dsVzV4UUV0NEVya1MzbWdlTjJHRmJyZW1ZZU1CU0pLcjlXZjJLSnBsUVZhaVBZL2Y3Rk42YXRvc1dZTm05b3ZyWWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiAiXjEuMC4zIiwKKyAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIl4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJ1bmljb2RlLTUuMi4wIjogeworICAgICAgInZlcnNpb24iOiAiMC43LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuaWNvZGUtNS4yLjAvLS91bmljb2RlLTUuMi4wLTAuNy41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1LVkdMVzFCcmkzMHgwMHl2NEhOTThrQnhvcUZYcjBTYm81NTczNW52cmxzeDRQWUJab2wzVXRvV2dPNDkyZlN3bXNldHpQRVp6eTczcmJVOE9HWEpjQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidW5pb24tdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5pb24tdmFsdWUvLS91bmlvbi12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVhISERUTFc2MWR6cjQrb00wSUlIdWxxaHJxUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItdW5pb24iOiAiXjMuMS4wIiwKKyAgICAgICAgImdldC12YWx1ZSI6ICJeMi4wLjYiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAic2V0LXZhbHVlIjogIl4wLjQuMyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzZXQtdmFsdWUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC40LjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtdmFsdWUvLS9zZXQtdmFsdWUtMC40LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZmJDUG5UMGkzSDk0NVRyenc3OUdadXpmelBFPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjEiLAorICAgICAgICAgICAgInRvLW9iamVjdC1wYXRoIjogIl4wLjMuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ1bnNldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bnNldC12YWx1ZS8tL3Vuc2V0LXZhbHVlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZzNhSFAzMGpOUmVmK3g1dnc2anREZnlLdFZrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy12YWx1ZSI6ICJeMC4zLjEiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJoYXMtdmFsdWUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4zLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWUvLS9oYXMtdmFsdWUtMC4zLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZXg5WXV0cGl5b0ord0tJSGdDVmxTRVdaWGg4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImdldC12YWx1ZSI6ICJeMi4wLjMiLAorICAgICAgICAgICAgImhhcy12YWx1ZXMiOiAiXjAuMS40IiwKKyAgICAgICAgICAgICJpc29iamVjdCI6ICJeMi4wLjAiCisgICAgICAgICAgfSwKKyAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAgICAgImlzb2JqZWN0IjogeworICAgICAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc29iamVjdC8tL2lzb2JqZWN0LTIuMS4wLnRneiIsCisgICAgICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04R1ZXRUphajhkb3U5R0p5K0JYSVFOaCtESWs9IiwKKyAgICAgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICAgICAiaXNhcnJheSI6ICIxLjAuMCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImhhcy12YWx1ZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWVzLy0vaGFzLXZhbHVlcy0wLjEuNC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iV0hlbGRrZC9LbTVvQ0NKclRoTC80OWl0M0U9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidXJpLXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXJpLXBhdGgvLS91cmktcGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWwwZndHRFdKTThNZDRQelAyQzBUam1jbUxqST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1cml4IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VyaXgvLS91cml4LTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMnBOL2VtTGlIK3dmMFkxSnMxd3BOUVo2YkhJPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVybCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXJsLy0vdXJsLTAuMTEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9EanBmUHhnVWg2M1BGSmFqbFcvM1o0dUtQRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwdW55Y29kZSI6ICIxLjMuMiIsCisgICAgICAgICJxdWVyeXN0cmluZyI6ICIwLjIuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAicHVueWNvZGUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4zLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdW55Y29kZS8tL3B1bnljb2RlLTEuMy4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWxsT2dOdnQ4SHVRalF2SXlYTTd2NmprbXhJMD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ1c2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXNlLy0vdXNlLTMuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jd0VTVlhsTzN1cmw5WVdsRlcvVEE5Y3NoQ0VodHU3SUtKL3A1c29KL2dHcGo3dmJ2RnJBWS9lSWlvUTZEdzIzS2paaFlnaUlvOEhPczFuUTJ2ci9vUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidXRpbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXRpbC8tL3V0aWwtMC4xMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0wUG05aFRRM3NlNWxsMVhpaFJpYzNGRElrdTcwQytpSFVkVC9XOTI2clNnSFY1UWdYc1liS1pOOE1TQzN0SnRTa2h1Uk96dnNRakFhRkVOUlhyKzE5QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaW5oZXJpdHMiOiAiMi4wLjMiCisgICAgICB9CisgICAgfSwKKyAgICAidXRpbC1kZXByZWNhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXRpbC1kZXByZWNhdGUvLS91dGlsLWRlcHJlY2F0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVJRMU55ZnB3M25Nbll2dlMxS0tKZ1VHYURNOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1dWlkIjogeworICAgICAgInZlcnNpb24iOiAiMy4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V1aWQvLS91dWlkLTMuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15WEptZU5hdzNEbm5LQU9LSkU1MXNML1phWWZXSlJsMXBLOWRyMTlZRkN1ME9iUzIzMUFCMS9MYnFUS1JBUTVrdzhBOTByQTZmcjRyaU9VcFRadlFaQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInY4ZmxhZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdjhmbGFncy8tL3Y4ZmxhZ3MtMy4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU10aXZBN0dGMjR5TVB0ZTlScC9CV0dDWVFOYVVqODZ6ZVl4Vi94MlJSSk1LYWdJbWJidjN1OGlKQzU3bE5oV0xQY0dMSm1IY0htRldrTnNwbGJiTFd3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJ2YWxpZGF0ZS1ucG0tcGFja2FnZS1saWNlbnNlIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UvLS92YWxpZGF0ZS1ucG0tcGFja2FnZS1saWNlbnNlLTMuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1EcEttMlVpL3hONy9IUUtDdHBaeG9SV0JoWjlaMGtxdHlnRzhYQ2dOUThabERueHVRbVdoajU2Nmo4Zk40Q3UzL0ptYmhzRG83ZmNBSnE0czloMjdFdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3BkeC1jb3JyZWN0IjogIl4zLjAuMCIsCisgICAgICAgICJzcGR4LWV4cHJlc3Npb24tcGFyc2UiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInZlcnJvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdmVycm9yLy0vdmVycm9yLTEuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9oQmNvWEJUcjFYVzRuREIrQ2lHZ3VHTnBBQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImNvcmUtdXRpbC1pcyI6ICIxLjAuMiIsCisgICAgICAgICJleHRzcHJpbnRmIjogIl4xLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ2bS1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ZtLWJyb3dzZXJpZnkvLS92bS1icm93c2VyaWZ5LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pcStTN3ZaSkU2MHllakRZTTBlazZ6ZzMwOCtVWnNkdFBFeFdQOVZab0NGQ3oxemtKb1hGbkFYN2FaZmQvWndya2lkemRVWkwwQy9yeVcrSndBaUlHdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid2hpY2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2hpY2gvLS93aGljaC0xLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSHhKZFlXcTFNVElRYkozbncwY3Fzc0hvVE5VMjY3S2xyRHVHWjFXWWx4RFN0VXRLVWhPYUptaDExMi9UWm1IeHhVZnVKcVBYU09tN3REeWFzME9TSVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzZXhlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ3aW5kb3ctc2l6ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aW5kb3ctc2l6ZS8tL3dpbmRvdy1zaXplLTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVkRqTkxxazdJQzc2T2huK2lJZXU1OGxQbkowPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndpbnN0b24iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2luc3Rvbi8tL3dpbnN0b24tMi40LjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5CbzJQZXBuNGhLNFYwMVVmY1djRGxtaVZUczdWVEIxaDdiZ25CMHJnUDE0NmJZaE14WDB5cEN6M2xCT2ZOeENPNFp1ZWs3eWVUK3kvek0xT2ZNdzRRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMiOiAifjEuMC4wIiwKKyAgICAgICAgImNvbG9ycyI6ICIxLjAueCIsCisgICAgICAgICJjeWNsZSI6ICIxLjAueCIsCisgICAgICAgICJleWVzIjogIjAuMS54IiwKKyAgICAgICAgImlzc3RyZWFtIjogIjAuMS54IiwKKyAgICAgICAgInN0YWNrLXRyYWNlIjogIjAuMC54IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhc3luYyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMvLS9hc3luYy0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rUHdFeWpvVGVFcmVuaFpCcjVoWGpQdldSNms9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjb2xvcnMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvcnMvLS9jb2xvcnMtMS4wLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQkRQMFRZQ1dnUDNyWU8wbUR4c01KaTZDcEFzPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAid29yZHdyYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd29yZHdyYXAvLS93b3Jkd3JhcC0wLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXQ1WnB1MExzdEFuNFBWZzhyVkxLRitxaFpEOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3cmFwcHkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd3JhcHB5Ly0vd3JhcHB5LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdFNROWp6N0Jxalh4TmtZRnZBMFFOdU1LdHA4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndzIjogeworICAgICAgInZlcnNpb24iOiAiNi4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dzLy0vd3MtNi4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRiU3hpVCtxSkkyMjNBUDRpTGZRYmtieGt3ZEZjbmVZaW5NMit4NDZHeDJ3Z3ZiYU9NTzM2Y3pmZGZWVUJSVEh2ekFNUmhEZDk4c0E1ZC9CdVdiUWRnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYy1saW1pdGVyIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ4bWxjcmVhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveG1sY3JlYXRlLy0veG1sY3JlYXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK212M1lxWUtRVCt6M1k5TEE4V3lhU09OTUk4PSIKKyAgICB9LAorICAgICJ4dGVuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy94dGVuZC8tL3h0ZW5kLTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcGNiVk1yNWxiaVBiZ2c3N2xEb2ZCSm1OWTY4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInlhcmdzIjogeworICAgICAgInZlcnNpb24iOiAiMy4xMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3lhcmdzLy0veWFyZ3MtMy4xMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOSs1NzJGZmRmQjB0T01EblR2dldnZEZESDlFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6ICJeMS4wLjIiLAorICAgICAgICAiY2xpdWkiOiAiXjIuMS4wIiwKKyAgICAgICAgImRlY2FtZWxpemUiOiAiXjEuMC4wIiwKKyAgICAgICAgIndpbmRvdy1zaXplIjogIjAuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJjYW1lbGNhc2UiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2UvLS9jYW1lbGNhc2UtMS4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbTdVd1RTNExWbW1MTEhXTENLUHFxZHFsaWprPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInlhdXpsIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3lhdXpsLy0veWF1emwtMi40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sU2owUXRxeHNpaE9XTFEzbTdHVTRpNE1RQVU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmQtc2xpY2VyIjogIn4xLjAuMSIKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qcy9wYWNrYWdlLmpzb24gYi9saWIvanMvcGFja2FnZS5qc29uCmluZGV4IGY0MGU4YjMuLmExMGFhZjEgMTAwNjQ0Ci0tLSBhL2xpYi9qcy9wYWNrYWdlLmpzb24KKysrIGIvbGliL2pzL3BhY2thZ2UuanNvbgpAQCAtMSwxNCArMSwzMSBAQAogewogICAibmFtZSI6ICJ0aHJpZnQiLAotICAidmVyc2lvbiI6ICIwLjkuMyIsCisgICJ2ZXJzaW9uIjogIjAuMTMuMCIsCisgICJkZXNjcmlwdGlvbiI6ICJUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LiIsCisgICJhdXRob3IiOiB7CisgICAgIm5hbWUiOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiwKKyAgICAiZW1haWwiOiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIgorICB9LAorICAiYnVncyI6ICJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvcHJvamVjdHMvVEhSSUZUL3N1bW1hcnkiLAorICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiwKKyAgInJlcG9zaXRvcnkiOiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiLAorICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKICAgImRldkRlcGVuZGVuY2llcyI6IHsKLSAgICAiZ3J1bnQiOiAifjAuNC41IiwKLSAgICAiZ3J1bnQtY29udHJpYi11Z2xpZnkiOiAifjAuMi4yIiwKLSAgICAiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiAifjAuNi4zIiwKLSAgICAiZ3J1bnQtY29udHJpYi1xdW5pdCI6ICJ+MC4yLjIiLAotICAgICJncnVudC1jb250cmliLWNvbmNhdCI6ICJ+MC4zLjAiLAotICAgICJncnVudC1qc2RvYyI6ICJeMC42LjAiLAotICAgICJncnVudC1leHRlcm5hbC1kYWVtb24iOiAifjEuMS4wIiwKLSAgICAiZ3J1bnQtc2hlbGwiOiAifjAuNi40IgorICAgICJicm93c2VyaWZ5IjogIl4xNi4yLjMiLAorICAgICJncnVudCI6ICJeMS4wLjMiLAorICAgICJncnVudC1jbGkiOiAiXjEuMy4yIiwKKyAgICAiZ3J1bnQtY29udHJpYi1jb25jYXQiOiAiXjEuMC4xIiwKKyAgICAiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiAiXjEuMC4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1xdW5pdCI6ICJeMy4xLjAiLAorICAgICJncnVudC1jb250cmliLXVnbGlmeSI6ICJeMS4wLjEiLAorICAgICJncnVudC1qc2RvYyI6ICJeMi4yLjEiLAorICAgICJncnVudC1zaGVsbC1zcGF3biI6ICJeMC40LjAiLAorICAgICJqc2xpbnQiOiAiXjAuMTIuMCIsCisgICAgIm5vZGUtaW50NjQiOiAiXjAuNC4wIgorICB9LAorICAiZGVwZW5kZW5jaWVzIjogeworICAgICJqc2RvYyI6ICJeMy41LjUiLAorICAgICJqc29uLWludDY0IjogIl4xLjAuMCIsCisgICAgIm5vcHQiOiAiXjQuMC4xIgogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvanMvc3JjL3RocmlmdC5qcyBiL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCmluZGV4IDk1NWMyZGUuLjIxYTNkNjUgMTAwNjQ0Ci0tLSBhL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCisrKyBiL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCkBAIC0yMCwyMSArMjAsMjEgQEAKIC8qanNoaW50IGV2aWw6dHJ1ZSovCiAKIC8qKgotICogVGhlIFRocmlmdCBuYW1lc3BhY2UgaG91c2VzIHRoZSBBcGFjaGUgVGhyaWZ0IEphdmFTY3JpcHQgbGlicmFyeSAKLSAqIGVsZW1lbnRzIHByb3ZpZGluZyBKYXZhU2NyaXB0IGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgCi0gKiBzeXN0ZW0uIEVuZCB1c2VycyB3aWxsIHR5cGljYWxseSBvbmx5IGRpcmVjdGx5IG1ha2UgdXNlIG9mIHRoZSAKLSAqIFRyYW5zcG9ydCAoVFhIUlRyYW5zcG9ydC9UV2ViU29ja2V0VHJhbnNwb3J0KSBhbmQgUHJvdG9jb2wgCisgKiBUaGUgVGhyaWZ0IG5hbWVzcGFjZSBob3VzZXMgdGhlIEFwYWNoZSBUaHJpZnQgSmF2YVNjcmlwdCBsaWJyYXJ5CisgKiBlbGVtZW50cyBwcm92aWRpbmcgSmF2YVNjcmlwdCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDCisgKiBzeXN0ZW0uIEVuZCB1c2VycyB3aWxsIHR5cGljYWxseSBvbmx5IGRpcmVjdGx5IG1ha2UgdXNlIG9mIHRoZQorICogVHJhbnNwb3J0IChUWEhSVHJhbnNwb3J0L1RXZWJTb2NrZXRUcmFuc3BvcnQpIGFuZCBQcm90b2NvbAogICogKFRKU09OUFJvdG9jb2wvVEJpbmFyeVByb3RvY29sKSBjb25zdHJ1Y3RvcnMuCi0gKiAKLSAqIE9iamVjdCBtZXRob2RzIGJlZ2lubmluZyB3aXRoIGEgX18gKGUuZy4gX19vbk9wZW4oKSkgYXJlIGludGVybmFsIAorICoKKyAqIE9iamVjdCBtZXRob2RzIGJlZ2lubmluZyB3aXRoIGEgX18gKGUuZy4gX19vbk9wZW4oKSkgYXJlIGludGVybmFsCiAgKiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb3V0c2lkZSBvZiB0aGUgb2JqZWN0J3Mgb3duIG1ldGhvZHMuCi0gKiAKKyAqCiAgKiBUaGlzIGxpYnJhcnkgY3JlYXRlcyBvbmUgZ2xvYmFsIG9iamVjdDogVGhyaWZ0CiAgKiBDb2RlIGluIHRoaXMgbGlicmFyeSBtdXN0IG5ldmVyIGNyZWF0ZSBhZGRpdGlvbmFsIGdsb2JhbCBpZGVudGlmaWVycywKICAqIGFsbCBmZWF0dXJlcyBtdXN0IGJlIHNjb3BlZCB3aXRoaW4gdGhlIFRocmlmdCBuYW1lc3BhY2UuCiAgKiBAbmFtZXNwYWNlCiAgKiBAZXhhbXBsZQotICogICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgiaHR0cDovL2xvY2FsaG9zdDo4NTg1Iik7CisgKiAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCdodHRwOi8vbG9jYWxob3N0Ojg1ODUnKTsKICAqICAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOwogICogICAgIHZhciBjbGllbnQgPSBuZXcgTXlUaHJpZnRTdmNDbGllbnQocHJvdG9jb2wpOwogICogICAgIHZhciByZXN1bHQgPSBjbGllbnQuTXlNZXRob2QoKTsKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICAgKiBAY29uc3Qge3N0cmluZ30gVmVyc2lvbgogICAgICAqIEBtZW1iZXJvZiBUaHJpZnQKICAgICAgKi8KLSAgICBWZXJzaW9uOiAnMC45LjMnLAorICAgIFZlcnNpb246ICcwLjEzLjAnLAogCiAgICAgLyoqCiAgICAgICogVGhyaWZ0IElETCB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgpAQCAtNTUsNyArNTUsNyBAQAogICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVk9JRCAgIC0gTm8gdmFsdWUgKG9ubHkgbGVnYWwgZm9yIHJldHVybiB0eXBlcykuCiAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBCT09MICAgLSBUcnVlL0ZhbHNlIGludGVnZXIuCiAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBCWVRFICAgLSBTaWduZWQgOCBiaXQgaW50ZWdlci4KLSAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEkwOCAgICAtIFNpZ25lZCA4IGJpdCBpbnRlZ2VyLiAgICAgCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJMDggICAgLSBTaWduZWQgOCBiaXQgaW50ZWdlci4KICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIERPVUJMRSAtIDY0IGJpdCBJRUVFIDg1NCBmbG9hdGluZyBwb2ludC4KICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEkxNiAgICAtIFNpZ25lZCAxNiBiaXQgaW50ZWdlci4KICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEkzMiAgICAtIFNpZ25lZCAzMiBiaXQgaW50ZWdlci4KQEAgLTcwLDIzICs3MCwyMyBAQAogICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVVRGMTYgIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIFVURjE2IGVuY29kZWQgY2hhcmFjdGVycy4KICAgICAgKi8KICAgICBUeXBlOiB7Ci0gICAgICAgICdTVE9QJyA6IDAsCi0gICAgICAgICdWT0lEJyA6IDEsCi0gICAgICAgICdCT09MJyA6IDIsCi0gICAgICAgICdCWVRFJyA6IDMsCi0gICAgICAgICdJMDgnIDogMywKLSAgICAgICAgJ0RPVUJMRScgOiA0LAotICAgICAgICAnSTE2JyA6IDYsCi0gICAgICAgICdJMzInIDogOCwKLSAgICAgICAgJ0k2NCcgOiAxMCwKLSAgICAgICAgJ1NUUklORycgOiAxMSwKLSAgICAgICAgJ1VURjcnIDogMTEsCi0gICAgICAgICdTVFJVQ1QnIDogMTIsCi0gICAgICAgICdNQVAnIDogMTMsCi0gICAgICAgICdTRVQnIDogMTQsCi0gICAgICAgICdMSVNUJyA6IDE1LAotICAgICAgICAnVVRGOCcgOiAxNiwKLSAgICAgICAgJ1VURjE2JyA6IDE3CisgICAgICAgIFNUT1A6IDAsCisgICAgICAgIFZPSUQ6IDEsCisgICAgICAgIEJPT0w6IDIsCisgICAgICAgIEJZVEU6IDMsCisgICAgICAgIEkwODogMywKKyAgICAgICAgRE9VQkxFOiA0LAorICAgICAgICBJMTY6IDYsCisgICAgICAgIEkzMjogOCwKKyAgICAgICAgSTY0OiAxMCwKKyAgICAgICAgU1RSSU5HOiAxMSwKKyAgICAgICAgVVRGNzogMTEsCisgICAgICAgIFNUUlVDVDogMTIsCisgICAgICAgIE1BUDogMTMsCisgICAgICAgIFNFVDogMTQsCisgICAgICAgIExJU1Q6IDE1LAorICAgICAgICBVVEY4OiAxNiwKKyAgICAgICAgVVRGMTY6IDE3CiAgICAgfSwKIAogICAgIC8qKgpAQCAtOTgsMTAgKzk4LDEwIEBACiAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBPTkVXQVkgICAgLSBPbmV3YXkgUlBDIGNhbGwgZnJvbSBjbGllbnQgdG8gc2VydmVyIHdpdGggbm8gcmVzcG9uc2UuCiAgICAgICovCiAgICAgTWVzc2FnZVR5cGU6IHsKLSAgICAgICAgJ0NBTEwnIDogMSwKLSAgICAgICAgJ1JFUExZJyA6IDIsCi0gICAgICAgICdFWENFUFRJT04nIDogMywKLSAgICAgICAgJ09ORVdBWScgOiA0CisgICAgICAgIENBTEw6IDEsCisgICAgICAgIFJFUExZOiAyLAorICAgICAgICBFWENFUFRJT046IDMsCisgICAgICAgIE9ORVdBWTogNAogICAgIH0sCiAKICAgICAvKioKQEAgLTEzMCw3ICsxMzAsNyBAQAogICAgICAgZnVuY3Rpb24gRigpIHt9CiAgICAgICBGLnByb3RvdHlwZSA9IHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlOwogICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IEYoKTsKLSAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5uYW1lID0gbmFtZSB8fCAiIjsKKyAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5uYW1lID0gbmFtZSB8fCAnJzsKICAgICB9CiB9OwogCkBAIC0xNzEsMTcgKzE3MSwxNyBAQAogICogQHByb3BlcnR5IHtudW1iZXJ9ICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSAtIFVudXNlZC4KICAqLwogVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgPSB7Ci0gICAgJ1VOS05PV04nIDogMCwKLSAgICAnVU5LTk9XTl9NRVRIT0QnIDogMSwKLSAgICAnSU5WQUxJRF9NRVNTQUdFX1RZUEUnIDogMiwKLSAgICAnV1JPTkdfTUVUSE9EX05BTUUnIDogMywKLSAgICAnQkFEX1NFUVVFTkNFX0lEJyA6IDQsCi0gICAgJ01JU1NJTkdfUkVTVUxUJyA6IDUsCi0gICAgJ0lOVEVSTkFMX0VSUk9SJyA6IDYsCi0gICAgJ1BST1RPQ09MX0VSUk9SJyA6IDcsCi0gICAgJ0lOVkFMSURfVFJBTlNGT1JNJyA6IDgsCi0gICAgJ0lOVkFMSURfUFJPVE9DT0wnIDogOSwKLSAgICAnVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUnIDogMTAKKyAgICBVTktOT1dOOiAwLAorICAgIFVOS05PV05fTUVUSE9EOiAxLAorICAgIElOVkFMSURfTUVTU0FHRV9UWVBFOiAyLAorICAgIFdST05HX01FVEhPRF9OQU1FOiAzLAorICAgIEJBRF9TRVFVRU5DRV9JRDogNCwKKyAgICBNSVNTSU5HX1JFU1VMVDogNSwKKyAgICBJTlRFUk5BTF9FUlJPUjogNiwKKyAgICBQUk9UT0NPTF9FUlJPUjogNywKKyAgICBJTlZBTElEX1RSQU5TRk9STTogOCwKKyAgICBJTlZBTElEX1BST1RPQ09MOiA5LAorICAgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFOiAxMAogfTsKIAogLyoqCkBAIC0xOTQsNyArMTk0LDcgQEAKICovCiBUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgY29kZSkgewogICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgdGhpcy5jb2RlID0gdHlwZW9mIGNvZGUgPT09ICJudW1iZXIiID8gY29kZSA6IDA7CisgICAgdGhpcy5jb2RlID0gdHlwZW9mIGNvZGUgPT09ICdudW1iZXInID8gY29kZSA6IDA7CiB9OwogVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24sIFRocmlmdC5URXhjZXB0aW9uLCAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CiAKQEAgLTI3Miw2ICsyNzIsMjUgQEAKICAgICByZXR1cm4gdGhpcy5jb2RlOwogfTsKIAorVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUgPSB7CisgICAgVU5LTk9XTjogMCwKKyAgICBJTlZBTElEX0RBVEE6IDEsCisgICAgTkVHQVRJVkVfU0laRTogMiwKKyAgICBTSVpFX0xJTUlUOiAzLAorICAgIEJBRF9WRVJTSU9OOiA0LAorICAgIE5PVF9JTVBMRU1FTlRFRDogNSwKKyAgICBERVBUSF9MSU1JVDogNgorfTsKKworVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbiA9IGZ1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKSB7CisgICAgRXJyb3IuY2FsbCh0aGlzKTsKKyAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKKyAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfTsKK1RocmlmdC5pbmhlcml0cyhUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uLCBUaHJpZnQuVEV4Y2VwdGlvbiwgJ1RQcm90b2NvbEV4Y2VwdGlvbicpOworCiAvKioKICAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgWEhSIHRyYW5zcG9ydC4KICAqIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHVybCB0aGVuIHlvdSBtdXN0IGhhbmRsZSBYSFIgb3BlcmF0aW9ucyBvbgpAQCAtMjc5LDggKzI5OCw4IEBACiAgKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICAqIEBjb25zdHJ1Y3RvcgogICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgotICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08gCi0gKiBiZXR3ZWVuIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLiBUaGUgSmF2YVNjcmlwdCBUWEhSVHJhbnNwb3J0IG9iamVjdCAKKyAqIEBjbGFzc2Rlc2MgVGhlIEFwYWNoZSBUaHJpZnQgVHJhbnNwb3J0IGxheWVyIHBlcmZvcm1zIGJ5dGUgbGV2ZWwgSS9PCisgKiBiZXR3ZWVuIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLiBUaGUgSmF2YVNjcmlwdCBUWEhSVHJhbnNwb3J0IG9iamVjdAogICogdXNlcyBIdHRwW3NdL1hIUi4gVGFyZ2V0IHNlcnZlcnMgbXVzdCBpbXBsZW1lbnQgdGhlIGh0dHBbc10gdHJhbnNwb3J0CiAgKiAoc2VlOiBub2RlLmpzIGV4YW1wbGUgc2VydmVyX2h0dHAuanMpLgogICogQGV4YW1wbGUKQEAgLTI5MSw2ICszMTAsNyBAQAogICAgIHRoaXMud3BvcyA9IDA7CiAgICAgdGhpcy5ycG9zID0gMDsKICAgICB0aGlzLnVzZUNPUlMgPSAob3B0aW9ucyAmJiBvcHRpb25zLnVzZUNPUlMpOworICAgIHRoaXMuY3VzdG9tSGVhZGVycyA9IG9wdGlvbnMgPyAob3B0aW9ucy5jdXN0b21IZWFkZXJzID8gb3B0aW9ucy5jdXN0b21IZWFkZXJzIDoge30pOiB7fTsKICAgICB0aGlzLnNlbmRfYnVmID0gJyc7CiAgICAgdGhpcy5yZWN2X2J1ZiA9ICcnOwogfTsKQEAgLTMwOSwxMiArMzI5LDEyIEBACiAgICAgfSwKIAogICAgIC8qKgotICAgICAqIFNlbmRzIHRoZSBjdXJyZW50IFhSSCByZXF1ZXN0IGlmIHRoZSB0cmFuc3BvcnQgd2FzIGNyZWF0ZWQgd2l0aCBhIFVSTCAKKyAgICAgKiBTZW5kcyB0aGUgY3VycmVudCBYUkggcmVxdWVzdCBpZiB0aGUgdHJhbnNwb3J0IHdhcyBjcmVhdGVkIHdpdGggYSBVUkwKICAgICAgKiBhbmQgdGhlIGFzeW5jIHBhcmFtZXRlciBpcyBmYWxzZS4gSWYgdGhlIHRyYW5zcG9ydCB3YXMgbm90IGNyZWF0ZWQgd2l0aAotICAgICAqIGEgVVJMLCBvciB0aGUgYXN5bmMgcGFyYW1ldGVyIGlzIFRydWUgYW5kIG5vIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCBvciAKKyAgICAgKiBhIFVSTCwgb3IgdGhlIGFzeW5jIHBhcmFtZXRlciBpcyBUcnVlIGFuZCBubyBjYWxsYmFjayBpcyBwcm92aWRlZCwgb3IKICAgICAgKiB0aGUgVVJMIGlzIGFuIGVtcHR5IHN0cmluZywgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIgaXMgcmV0dXJuZWQuCiAgICAgICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWYgdHJ1ZSB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KLSAgICAgKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2sgLSBPcHRpb25hbCBhc3luYyBjb21wbGV0aW9uIGNhbGxiYWNrIAorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFjayAtIE9wdGlvbmFsIGFzeW5jIGNvbXBsZXRpb24gY2FsbGJhY2sKICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfHN0cmluZ30gTm90aGluZyBvciB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlci4KICAgICAgKiBAdGhyb3dzIHtzdHJpbmd9IElmIFhIUiBmYWlscy4KICAgICAgKi8KQEAgLTMzMyw5ICszNTMsOSBAQAogICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgIC8vSWdub3JlIFhIUiBjYWxsYmFja3MgdW50aWwgdGhlIGRhdGEgYXJyaXZlcywgdGhlbiBjYWxsIHRoZQogICAgICAgICAgICAgLy8gIGNsaWVudCdzIGNhbGxiYWNrCi0gICAgICAgICAgICB4cmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IAorICAgICAgICAgICAgeHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPQogICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2FsbGJhY2s7ICAgIAorICAgICAgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gNCAmJiB0aGlzLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRSZWN2QnVmZmVyKHRoaXMucmVzcG9uc2VUZXh0KTsKQEAgLTM0MywxMCArMzYzLDI1IEBACiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgfSgpKTsKKworICAgICAgICAgICAgLy8gZGV0ZWN0IG5ldDo6RVJSX0NPTk5FQ1RJT05fUkVGVVNFRCBhbmQgY2FsbCB0aGUgY2FsbGJhY2suCisgICAgICAgICAgICB4cmVxLm9uZXJyb3IgPQorICAgICAgICAgICAgICAgIChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKCk7CisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH0oKSk7CisKICAgICAgICAgfQogCiAgICAgICAgIHhyZXEub3BlbignUE9TVCcsIHRoaXMudXJsLCAhIWFzeW5jKTsKIAorICAgICAgICAvLyBhZGQgY3VzdG9tIGhlYWRlcnMKKyAgICAgICAgT2JqZWN0LmtleXMoc2VsZi5jdXN0b21IZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHsKKyAgICAgICAgICAgIHhyZXEuc2V0UmVxdWVzdEhlYWRlcihwcm9wLCBzZWxmLmN1c3RvbUhlYWRlcnNbcHJvcF0pOworICAgICAgICB9KTsKKwogICAgICAgICBpZiAoeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKSB7CiAgICAgICAgICAgICB4cmVxLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi92bmQuYXBhY2hlLnRocmlmdC5qc29uOyBjaGFyc2V0PXV0Zi04Jyk7CiAgICAgICAgICAgICB4cmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi92bmQuYXBhY2hlLnRocmlmdC5qc29uOyBjaGFyc2V0PXV0Zi04Jyk7CkBAIC00MDMsNyArNDM4LDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIGNvbnRleHQ6IGNsaWVudCwKLSAgICAgICAgICAgIHN1Y2Nlc3M6IGpRdWVyeS5tYWtlQXJyYXkoYXJncykucG9wKCkKKyAgICAgICAgICAgIHN1Y2Nlc3M6IGpRdWVyeS5tYWtlQXJyYXkoYXJncykucG9wKCksCisgICAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoeHJlcSkgeworICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRocmlmdFRyYW5zcG9ydC5jdXN0b21IZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7CisgICAgICAgICAgICAgICAgICAgIHhyZXEuc2V0UmVxdWVzdEhlYWRlcihwcm9wLCB0aHJpZnRUcmFuc3BvcnQuY3VzdG9tSGVhZGVyc1twcm9wXSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogCiAgICAgICAgIHJldHVybiBqcVhIUjsKQEAgLTQyNCwxOSArNDY0LDE5IEBACiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbiwgWEhSIGFsd2F5cyByZXR1cm5zIHRydWUuCiAgICAgICogQHJlYWRvbmx5CiAgICAgICogQHJldHVybnMge2Jvb2xlYW59IEFsd2F5cyBUcnVlLgotICAgICAqLyAgICAKKyAgICAgKi8KICAgICBpc09wZW46IGZ1bmN0aW9uKCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9LAogCiAgICAgLyoqCiAgICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgotICAgICAqLyAgICAKKyAgICAgKi8KICAgICBvcGVuOiBmdW5jdGlvbigpIHt9LAogCiAgICAgLyoqCiAgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbiwgd2l0aCBYSFIgdGhpcyBpcyBhIG5vcC4KLSAgICAgKi8gICAgCisgICAgICovCiAgICAgY2xvc2U6IGZ1bmN0aW9uKCkge30sCiAKICAgICAvKioKQEAgLTQ3Niw3ICs1MTYsNyBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgotICAgICAqLyAgICAKKyAgICAgKi8KICAgICB3cml0ZTogZnVuY3Rpb24oYnVmKSB7CiAgICAgICAgIHRoaXMuc2VuZF9idWYgPSBidWY7CiAgICAgfSwKQEAgLTQ4NSw3ICs1MjUsNyBAQAogICAgICAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgogICAgICAqIEByZWFkb25seQogICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzZW5kIGJ1ZmZlci4KLSAgICAgKi8gCisgICAgICovCiAgICAgZ2V0U2VuZEJ1ZmZlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnNlbmRfYnVmOwogICAgIH0KQEAgLTQ5Nyw4ICs1MzcsOCBAQAogICogQ29uc3RydWN0b3IgRnVuY3Rpb24gZm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LgogICogQGNvbnN0cnVjdG9yCiAgKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgVVJMIHRvIGNvbm5lY3QgdG8uCi0gKiBAY2xhc3NkZXNjIFRoZSBBcGFjaGUgVGhyaWZ0IFRyYW5zcG9ydCBsYXllciBwZXJmb3JtcyBieXRlIGxldmVsIEkvTyAKLSAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRXZWJTb2NrZXRUcmFuc3BvcnQgb2JqZWN0IAorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08KKyAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRXZWJTb2NrZXRUcmFuc3BvcnQgb2JqZWN0CiAgKiB1c2VzIHRoZSBXZWJTb2NrZXQgcHJvdG9jb2wuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IFdlYlNvY2tldC4KICAqIChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXJfaHR0cC5qcykuCiAgKiBAZXhhbXBsZQpAQCAtNTIxLDQzICs1NjEsNDUgQEAKICAgICB9LAogCiAgICAgLyoqCi0gICAgICogU2VuZHMgdGhlIGN1cnJlbnQgV1MgcmVxdWVzdCBhbmQgcmVnaXN0ZXJzIGNhbGxiYWNrLiBUaGUgYXN5bmMgCi0gICAgICogcGFyYW1ldGVyIGlzIGlnbm9yZWQgKFdTIGZsdXNoIGlzIGFsd2F5cyBhc3luYykgYW5kIHRoZSBjYWxsYmFjayAKKyAgICAgKiBTZW5kcyB0aGUgY3VycmVudCBXUyByZXF1ZXN0IGFuZCByZWdpc3RlcnMgY2FsbGJhY2suIFRoZSBhc3luYworICAgICAqIHBhcmFtZXRlciBpcyBpZ25vcmVkIChXUyBmbHVzaCBpcyBhbHdheXMgYXN5bmMpIGFuZCB0aGUgY2FsbGJhY2sKICAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCiAgICAgICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWdub3JlZC4KICAgICAgKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2sgLSBUaGUgY2xpZW50IGNvbXBsZXRpb24gY2FsbGJhY2suCi0gICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkgCisgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkKICAgICAgKi8KICAgICBmbHVzaDogZnVuY3Rpb24oYXN5bmMsIGNhbGxiYWNrKSB7CiAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICBpZiAodGhpcy5pc09wZW4oKSkgewogICAgICAgICAvL1NlbmQgZGF0YSBhbmQgcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBpbnZva2UgdGhlIGNsaWVudCBjYWxsYmFjawotICAgICAgICB0aGlzLnNvY2tldC5zZW5kKHRoaXMuc2VuZF9idWYpOyAKKyAgICAgICAgdGhpcy5zb2NrZXQuc2VuZCh0aGlzLnNlbmRfYnVmKTsKICAgICAgICAgdGhpcy5jYWxsYmFja3MucHVzaCgoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2FsbGJhY2s7ICAgIAorICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtc2cpIHsKICAgICAgICAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcihtc2cpOwotICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfTsKICAgICAgICAgfSgpKSk7CiAgICAgICB9IGVsc2UgewogICAgICAgICAvL1F1ZXVlIHRoZSBzZW5kIHRvIGdvIG91dCBfX29uT3BlbgogICAgICAgICB0aGlzLnNlbmRfcGVuZGluZy5wdXNoKHsKICAgICAgICAgICBidWY6IHRoaXMuc2VuZF9idWYsCi0gICAgICAgICAgY2I6ICBjYWxsYmFjaworICAgICAgICAgIGNiOiBjYWxsYmFjawogICAgICAgICB9KTsKICAgICAgIH0KICAgICB9LAogCi0gICAgX19vbk9wZW46IGZ1bmN0aW9uKCkgeyAKKyAgICBfX29uT3BlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgIGlmICh0aGlzLnNlbmRfcGVuZGluZy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgLy9JZiB0aGUgdXNlciBtYWRlIGNhbGxzIGJlZm9yZSB0aGUgY29ubmVjdGlvbiB3YXMgZnVsbHkgCisgICAgICAgICAgLy9JZiB0aGUgdXNlciBtYWRlIGNhbGxzIGJlZm9yZSB0aGUgY29ubmVjdGlvbiB3YXMgZnVsbHkKICAgICAgICAgICAvL29wZW4sIHNlbmQgdGhlbSBub3cKICAgICAgICAgICB0aGlzLnNlbmRfcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHsKLSAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGVsZW0uYnVmKTsKLSAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGVsZW0uY2I7ICAgIAorICAgICAgICAgICAgIHNlbGYuc29ja2V0LnNlbmQoZWxlbS5idWYpOworICAgICAgICAgICAgIHNlbGYuY2FsbGJhY2tzLnB1c2goKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gZWxlbS5jYjsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtc2cpIHsKICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcihtc2cpOwogICAgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKQEAgLTU2NywxOSArNjA5LDE5IEBACiAgICAgICAgICAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsKICAgICAgICB9CiAgICAgfSwKLSAgICAKLSAgICBfX29uQ2xvc2U6IGZ1bmN0aW9uKGV2dCkgeyAKKworICAgIF9fb25DbG9zZTogZnVuY3Rpb24oZXZ0KSB7CiAgICAgICB0aGlzLl9fcmVzZXQodGhpcy51cmwpOwogICAgIH0sCi0gICAgIAorCiAgICAgX19vbk1lc3NhZ2U6IGZ1bmN0aW9uKGV2dCkgewogICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzLmxlbmd0aCkgewogICAgICAgICB0aGlzLmNhbGxiYWNrcy5zaGlmdCgpKGV2dC5kYXRhKTsKICAgICAgIH0KICAgICB9LAotICAgICAKLSAgICBfX29uRXJyb3I6IGZ1bmN0aW9uKGV2dCkgeyAKLSAgICAgIGNvbnNvbGUubG9nKCJUaHJpZnQgV2ViU29ja2V0IEVycm9yOiAiICsgZXZ0LnRvU3RyaW5nKCkpOworCisgICAgX19vbkVycm9yOiBmdW5jdGlvbihldnQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCdUaHJpZnQgV2ViU29ja2V0IEVycm9yOiAnICsgZXZ0LnRvU3RyaW5nKCkpOwogICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKICAgICB9LAogCkBAIC01OTcsMTUgKzYzOSwxNSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KICAgICAgKiBAcmVhZG9ubHkKLSAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gCi0gICAgICovICAgIAorICAgICAqIEByZXR1cm5zIHtib29sZWFufQorICAgICAqLwogICAgIGlzT3BlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09IHRoaXMuc29ja2V0Lk9QRU47CiAgICAgfSwKIAogICAgIC8qKgogICAgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgotICAgICAqLyAgICAKKyAgICAgKi8KICAgICBvcGVuOiBmdW5jdGlvbigpIHsKICAgICAgIC8vSWYgT1BFTi9DT05ORUNUSU5HL0NMT1NJTkcgaWdub3JlIGFkZGl0aW9uYWwgb3BlbnMKICAgICAgIGlmICh0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9IHRoaXMuc29ja2V0LkNMT1NFRCkgewpAQCAtNjEzLDE1ICs2NTUsMTUgQEAKICAgICAgIH0KICAgICAgIC8vSWYgdGhlcmUgaXMgbm8gc29ja2V0IG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkOgogICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRoaXMudXJsKTsKLSAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKTsgCi0gICAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLl9fb25NZXNzYWdlLmJpbmQodGhpcyk7IAotICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IHRoaXMuX19vbkVycm9yLmJpbmQodGhpcyk7IAotICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcyk7IAorICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gdGhpcy5fX29uT3Blbi5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fX29uTWVzc2FnZS5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IHRoaXMuX19vbkVycm9yLmJpbmQodGhpcyk7CisgICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5fX29uQ2xvc2UuYmluZCh0aGlzKTsKICAgICB9LAogCiAgICAgLyoqCiAgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgotICAgICAqLyAgICAKKyAgICAgKi8KICAgICBjbG9zZTogZnVuY3Rpb24oKSB7CiAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpOwogICAgIH0sCkBAIC02NjMsNyArNzA1LDcgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1ZiAtIFRoZSBidWZmZXIgdG8gc2VuZC4KLSAgICAgKi8gICAgCisgICAgICovCiAgICAgd3JpdGU6IGZ1bmN0aW9uKGJ1ZikgewogICAgICAgICB0aGlzLnNlbmRfYnVmID0gYnVmOwogICAgIH0sCkBAIC02NzIsNyArNzE0LDcgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBzZW5kIGJ1ZmZlci4KICAgICAgKiBAcmVhZG9ubHkKICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VuZCBidWZmZXIuCi0gICAgICovIAorICAgICAqLwogICAgIGdldFNlbmRCdWZmZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKICAgICB9CkBAIC02ODMsOCArNzI1LDggQEAKICAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IEpTT04gcHJvdG9jb2wgaW5zdGFuY2UuCiAgKiBAY29uc3RydWN0b3IKICAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCB0byBzZXJpYWxpemUgdG8vZnJvbS4KLSAqIEBjbGFzc2Rlc2MgQXBhY2hlIFRocmlmdCBQcm90b2NvbHMgcGVyZm9ybSBzZXJpYWxpemF0aW9uIHdoaWNoIGVuYWJsZXMgY3Jvc3MgCi0gKiBsYW5ndWFnZSBSUEMuIFRoZSBQcm90b2NvbCB0eXBlIGlzIHRoZSBKYXZhU2NyaXB0IGJyb3dzZXIgaW1wbGVtZW50YXRpb24gCisgKiBAY2xhc3NkZXNjIEFwYWNoZSBUaHJpZnQgUHJvdG9jb2xzIHBlcmZvcm0gc2VyaWFsaXphdGlvbiB3aGljaCBlbmFibGVzIGNyb3NzCisgKiBsYW5ndWFnZSBSUEMuIFRoZSBQcm90b2NvbCB0eXBlIGlzIHRoZSBKYXZhU2NyaXB0IGJyb3dzZXIgaW1wbGVtZW50YXRpb24KICAqIG9mIHRoZSBBcGFjaGUgVGhyaWZ0IFRKU09OUHJvdG9jb2wuCiAgKiBAZXhhbXBsZQogICogICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CkBAIC03NDQsNyArNzg2LDcgQEAKICAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KICAgICAgKiBAcmVhZG9ubHkKICAgICAgKiBAcmV0dXJucyB7VGhyaWZ0LlRyYW5zcG9ydH0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotICAgICAqLyAKKyAgICAgKi8KICAgICBnZXRUcmFuc3BvcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQ7CiAgICAgfSwKQEAgLTk2NSw3ICsxMDA3LDExIEBACiAKICAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLwogICAgIHdyaXRlSTY0OiBmdW5jdGlvbihpNjQpIHsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChpNjQpOworICAgICAgICBpZiAodHlwZW9mIGk2NCA9PT0gJ251bWJlcicpIHsKKyAgICAgICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTY0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMudHN0YWNrLnB1c2goSW50NjRVdGlsLnRvRGVjaW1hbFN0cmluZyhpNjQpKTsKKyAgICAgICAgfQogICAgIH0sCiAKICAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLwpAQCAtOTg2LDcgKzEwMzIsNyBAQAogICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1wiJykgewogICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXFwiJzsgLy8gd3JpdGUgb3V0IGFzOiBcIgogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcXCcpIHsgICAgLy8gYSBzaW5nbGUgYmFja3NsYXNoCi0gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcXFwnOyAvLyB3cml0ZSBvdXQgYXMgZG91YmxlIGJhY2tzbGFzaCAKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcXCc7IC8vIHdyaXRlIG91dCBhcyBkb3VibGUgYmFja3NsYXNoCiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xiJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc3BhY2U6IGludmlzaWJsZQogICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXGInOyAgLy8gd3JpdGUgb3V0IGFzOiBcYiIKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXGYnKSB7ICAgIC8vIGEgc2luZ2xlIGZvcm1mZWVkOiBpbnZpc2libGUKQEAgLTEwMDYsOCArMTA1MiwxOSBAQAogICAgIH0sCiAKICAgICAvKiogU2VyaWFsaXplcyBhIHN0cmluZyAqLwotICAgIHdyaXRlQmluYXJ5OiBmdW5jdGlvbihzdHIpIHsKLSAgICAgICAgdGhpcy53cml0ZVN0cmluZyhzdHIpOworICAgIHdyaXRlQmluYXJ5OiBmdW5jdGlvbihiaW5hcnkpIHsKKyAgICAgICAgdmFyIHN0ciA9ICcnOworICAgICAgICBpZiAodHlwZW9mIGJpbmFyeSA9PSAnc3RyaW5nJykgeworICAgICAgICAgICAgc3RyID0gYmluYXJ5OworICAgICAgICB9IGVsc2UgaWYgKGJpbmFyeSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKKyAgICAgICAgICAgIHZhciBhcnIgPSBiaW5hcnk7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd3cml0ZUJpbmFyeSBvbmx5IGFjY2VwdHMgU3RyaW5nIG9yIFVpbnQ4QXJyYXkuJyk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy50c3RhY2sucHVzaCgnIicgKyBidG9hKHN0cikgKyAnIicpOwogICAgIH0sCiAKICAgICAvKioKQEAgLTEwMTcsMjAgKzEwNzQsMjQgQEAKICAgICAgICBAcHJvcGVydHkge1RocmlmdC5NZXNzYWdlVHlwZX0gbXR5cGUgLSBUaGUgdHlwZSBvZiBtZXNzYWdlIGNhbGwuCiAgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IHJzZXFpZCAtIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG1lc3NhZ2UgKDAgaW4gVGhyaWZ0IFJQQykuCiAgICAgICovCi0gICAgLyoqIAotICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZS4gCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtZXNzYWdlLgogICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZE1lc3NhZ2VCZWdpblJldHVybn0KICAgICAgKi8KICAgICByZWFkTWVzc2FnZUJlZ2luOiBmdW5jdGlvbigpIHsKICAgICAgICAgdGhpcy5yc3RhY2sgPSBbXTsKICAgICAgICAgdGhpcy5ycG9zID0gW107CiAKLSAgICAgICAgaWYgKHR5cGVvZiBKU09OICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgSlNPTi5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykgewotICAgICAgICAgICAgdGhpcy5yb2JqID0gSlNPTi5wYXJzZSh0aGlzLnRyYW5zcG9ydC5yZWFkQWxsKCkpOworICAgICAgICByZWNlaXZlZCA9IHRoaXMudHJhbnNwb3J0LnJlYWRBbGwoKTsKKworICAgICAgICBpZiAodHlwZW9mIEpTT05JbnQ2NCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEpTT05JbnQ2NC5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAgICAgdGhpcy5yb2JqID0gSlNPTkludDY0LnBhcnNlKHJlY2VpdmVkKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgSlNPTiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEpTT04ucGFyc2UgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgICAgIHRoaXMucm9iaiA9IEpTT04ucGFyc2UocmVjZWl2ZWQpOwogICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBqUXVlcnkgIT09ICd1bmRlZmluZWQnKSB7Ci0gICAgICAgICAgICB0aGlzLnJvYmogPSBqUXVlcnkucGFyc2VKU09OKHRoaXMudHJhbnNwb3J0LnJlYWRBbGwoKSk7CisgICAgICAgICAgICB0aGlzLnJvYmogPSBqUXVlcnkucGFyc2VKU09OKHJlY2VpdmVkKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucm9iaiA9IGV2YWwodGhpcy50cmFuc3BvcnQucmVhZEFsbCgpKTsKKyAgICAgICAgICAgIHRoaXMucm9iaiA9IGV2YWwocmVjZWl2ZWQpOwogICAgICAgICB9CiAKICAgICAgICAgdmFyIHIgPSB7fTsKQEAgLTEwNTUsMTEgKzExMTYsMTEgQEAKICAgICByZWFkTWVzc2FnZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgfSwKIAotICAgIC8qKiAKLSAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdC4gCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgKGlnbm9yZWQpCiAgICAgICogQHJldHVybnMge29iamVjdH0gLSBBbiBvYmplY3Qgd2l0aCBhbiBlbXB0eSBzdHJpbmcgZm5hbWUgcHJvcGVydHkKLSAgICAgKi8gICAgCisgICAgICovCiAgICAgcmVhZFN0cnVjdEJlZ2luOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgIHZhciByID0ge307CiAgICAgICAgIHIuZm5hbWUgPSAnJzsKQEAgLTEwODYsOCArMTE0Nyw4IEBACiAgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gZnR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBmaWVsZC4KICAgICAgICBAcHJvcGVydHkge251bWJlcn0gZmlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmaWVsZC4KICAgICAgKi8KLSAgICAvKiogCi0gICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBmaWVsZC4gCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBmaWVsZC4KICAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRGaWVsZEJlZ2luUmV0dXJufQogICAgICAqLwogICAgIHJlYWRGaWVsZEJlZ2luOiBmdW5jdGlvbigpIHsKQEAgLTExNTUsOCArMTIxNiw4IEBACiAgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gdnR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS4KICAgICAgICBAcHJvcGVydHkge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hcC4KICAgICAgKi8KLSAgICAvKiogCi0gICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuIAorICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLgogICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZE1hcEJlZ2luUmV0dXJufQogICAgICAqLwogICAgIHJlYWRNYXBCZWdpbjogZnVuY3Rpb24oKSB7CkBAIC0xMTczLDcgKzEyMzQsNiBAQAogICAgICAgICByLnZ0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW21hcC5zaGlmdCgpXTsKICAgICAgICAgci5zaXplID0gbWFwLnNoaWZ0KCk7CiAKLQogICAgICAgICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOwogICAgICAgICB0aGlzLnJzdGFjay5wdXNoKG1hcC5zaGlmdCgpKTsKIApAQCAtMTE5MSw4ICsxMjUxLDggQEAKICAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBldHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnQuCiAgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgogICAgICAqLwotICAgIC8qKiAKLSAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QuIAorICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdC4KICAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRDb2xCZWdpblJldHVybn0KICAgICAgKi8KICAgICByZWFkTGlzdEJlZ2luOiBmdW5jdGlvbigpIHsKQEAgLTEyMTAsMTEgKzEyNzAsMTYgQEAKIAogICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGxpc3QuICovCiAgICAgcmVhZExpc3RFbmQ6IGZ1bmN0aW9uKCkgewotICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICAgICAgICB2YXIgcG9zID0gdGhpcy5ycG9zLnBvcCgpIC0gMjsKKyAgICAgICAgdmFyIHN0ID0gdGhpcy5yc3RhY2s7CisgICAgICAgIHN0LnBvcCgpOworICAgICAgICBpZiAoc3QgaW5zdGFuY2VvZiBBcnJheSAmJiBzdC5sZW5ndGggPiBwb3MgJiYgc3RbcG9zXS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgc3QucHVzaChzdFtwb3NdLnNoaWZ0KCkpOworICAgICAgICB9CiAgICAgfSwKIAotICAgIC8qKiAKLSAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHNldC4gCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuCiAgICAgICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CiAgICAgICovCiAgICAgcmVhZFNldEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgewpAQCAtMTIyNiw4ICsxMjkxLDggQEAKICAgICAgICAgcmV0dXJuIHRoaXMucmVhZExpc3RFbmQoKTsKICAgICB9LAogCi0gICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gCi0gICAgICogIEZhbHNlIHVubGVzcyB0aGUgbmV4dCBudW1iZXIgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0bworICAgICAqICBGYWxzZSB1bmxlc3MgdGhlIG5leHQgbnVtYmVyIGluIHRoZSBwcm90b2NvbCBidWZmZXIKICAgICAgKiAgaXMgMSwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgcHJvcGVydHkgaXMgVHJ1ZSAqLwogICAgIHJlYWRCb29sOiBmdW5jdGlvbigpIHsKICAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKTsKQEAgLTEyNDEsMTkgKzEzMDYsMTkgQEAKICAgICAgICAgcmV0dXJuIHI7CiAgICAgfSwKIAotICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQogICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KICAgICByZWFkQnl0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKICAgICB9LAogCi0gICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCiAgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLwogICAgIHJlYWRJMTY6IGZ1bmN0aW9uKCkgewogICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7CiAgICAgfSwKIAotICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQogICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KICAgICByZWFkSTMyOiBmdW5jdGlvbihmKSB7CiAgICAgICAgIGlmIChmID09PSB1bmRlZmluZWQpIHsKQEAgLTEyNjYsNyArMTMzMSwxMSBAQAogICAgICAgICAgICAgaWYgKGYubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgci52YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgci52YWx1ZSA9IGYuc2hpZnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWYuaXNSZXZlcnNlZCkgeworICAgICAgICAgICAgICAgICAgICBmLnJldmVyc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZi5pc1JldmVyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgci52YWx1ZSA9IGYucG9wKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoZiBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgICAgICBmb3IgKHZhciBpIGluIGYpIHsKQEAgLTEyODcsMzkgKzEzNTYsODQgQEAKICAgICAgICAgcmV0dXJuIHI7CiAgICAgfSwKIAotICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQogICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KLSAgICByZWFkSTY0OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworICAgIHJlYWRJNjQ6IGZ1bmN0aW9uKGYpIHsKKyAgICAgICAgaWYgKGYgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgZiA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHIgPSB7fTsKKworICAgICAgICBpZiAoZiBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgICAgICAgICBpZiAoZi5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICByLnZhbHVlID0gdW5kZWZpbmVkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIWYuaXNSZXZlcnNlZCkgeworICAgICAgICAgICAgICAgICAgICBmLnJldmVyc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZi5pc1JldmVyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgci52YWx1ZSA9IGYucG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZiBpbnN0YW5jZW9mIE9iamVjdCkgeworICAgICAgICAgICAgdmFyIGludDY0T2JqZWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMoZikuc29ydCgpOworICAgICAgICAgICAgdmFyIGludDY0S2V5cyA9IFsnYnVmZmVyJywgJ29mZnNldCddOworICAgICAgICAgICAgaWYgKG9iamVjdEtleXMubGVuZ3RoICE9PSBpbnQ2NEtleXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaW50NjRPYmplY3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAodmFyIGl0PTA7IGludDY0T2JqZWN0ICYmIGl0IDwgb2JqZWN0S2V5cy5sZW5ndGg7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBpZiAob2JqZWN0S2V5c1tpdF0gIT09IGludDY0S2V5c1tpdF0pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRPYmplY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW50NjRPYmplY3QpIHsKKyAgICAgICAgICAgICAgICByLnZhbHVlID0gZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRoaXMucnN0YWNrLnB1c2goZltpXSk7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBmW2ldOworCisgICAgICAgICAgICAgICAgICAgIHIudmFsdWUgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByLnZhbHVlID0gZjsKKyAgICAgICAgICAgIHRoaXMucnN0YWNrLnBvcCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByOwogICAgIH0sCiAKLSAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIAorICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKICAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCiAgICAgcmVhZERvdWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKICAgICB9LAogCi0gICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCiAgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLwogICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICB2YXIgciA9IHRoaXMucmVhZEkzMigpOwogICAgICAgICByZXR1cm4gcjsKICAgICB9LAogCi0gICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCiAgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLwogICAgIHJlYWRCaW5hcnk6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkU3RyaW5nKCk7CisgICAgICAgIHZhciByID0gdGhpcy5yZWFkSTMyKCk7CisgICAgICAgIHIudmFsdWUgPSBhdG9iKHIudmFsdWUpOworICAgICAgICByZXR1cm4gcjsKICAgICB9LAogCi0gICAgLyoqIAorICAgIC8qKgogICAgICAqIE1ldGhvZCB0byBhcmJpdHJhcmlseSBza2lwIG92ZXIgZGF0YSAqLwogICAgIHNraXA6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgdmFyIHJldCwgaTsKICAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLlNUT1A6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KICAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuQk9PTDoKICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkQm9vbCgpOwogCkBAIC0xMzgzLDYgKzE0OTcsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuSU5WQUxJRF9EQVRBKTsKICAgICAgICAgfQogICAgIH0KIH07CkBAIC0xMzkyLDIzICsxNTA5LDIzIEBACiAgKiBJbml0aWFsaXplcyBhIE11dGlscGxleFByb3RvY29sIEltcGxlbWVudGF0aW9uIGFzIGEgV3JhcHBlciBmb3IgVGhyaWZ0LlByb3RvY29sCiAgKiBAY29uc3RydWN0b3IKICAqLwotVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sID0gZnVuY3Rpb24gKHNydk5hbWUsIHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSkgeworVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sID0gZnVuY3Rpb24oc3J2TmFtZSwgdHJhbnMsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKSB7CiAgICAgVGhyaWZ0LlByb3RvY29sLmNhbGwodGhpcywgdHJhbnMsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKTsKICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc3J2TmFtZTsKIH07CiBUaHJpZnQuaW5oZXJpdHMoVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sLCBUaHJpZnQuUHJvdG9jb2wsICdtdWx0aXBsZXhQcm90b2NvbCcpOwogCiAvKiogT3ZlcnJpZGUgd3JpdGVNZXNzYWdlQmVnaW4gbWV0aG9kIG9mIHByb3RvdHlwZSovCi1UaHJpZnQuTXVsdGlwbGV4UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24gKG5hbWUsIHR5cGUsIHNlcWlkKSB7CitUaHJpZnQuTXVsdGlwbGV4UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgc2VxaWQpIHsKIAogICAgIGlmICh0eXBlID09PSBUaHJpZnQuTWVzc2FnZVR5cGUuQ0FMTCB8fCB0eXBlID09PSBUaHJpZnQuTWVzc2FnZVR5cGUuT05FV0FZKSB7Ci0gICAgICAgIFRocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4uY2FsbCh0aGlzLCB0aGlzLnNlcnZpY2VOYW1lICsgIjoiICsgbmFtZSwgdHlwZSwgc2VxaWQpOworICAgICAgICBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgdGhpcy5zZXJ2aWNlTmFtZSArICc6JyArIG5hbWUsIHR5cGUsIHNlcWlkKTsKICAgICB9IGVsc2UgewogICAgICAgICBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgbmFtZSwgdHlwZSwgc2VxaWQpOwogICAgIH0KIH07CiAKLVRocmlmdC5NdWx0aXBsZXhlciA9IGZ1bmN0aW9uICgpIHsKK1RocmlmdC5NdWx0aXBsZXhlciA9IGZ1bmN0aW9uKCkgewogICAgIHRoaXMuc2VxaWQgPSAwOwogfTsKIApAQCAtMTQyMywxMiArMTU0MCwxMiBAQAogICogICAgdmFyIHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOwogICogICAgdmFyIGNsaWVudCA9IG1wLmNyZWF0ZUNsaWVudCgnQXV0aFNlcnZpY2UnLCBBdXRoU2VydmljZUNsaWVudCwgdHJhbnNwb3J0KTsKICovCi1UaHJpZnQuTXVsdGlwbGV4ZXIucHJvdG90eXBlLmNyZWF0ZUNsaWVudCA9IGZ1bmN0aW9uIChzZXJ2aWNlTmFtZSwgU0NsLCB0cmFuc3BvcnQpIHsKK1RocmlmdC5NdWx0aXBsZXhlci5wcm90b3R5cGUuY3JlYXRlQ2xpZW50ID0gZnVuY3Rpb24oc2VydmljZU5hbWUsIFNDbCwgdHJhbnNwb3J0KSB7CiAgICAgaWYgKFNDbC5DbGllbnQpIHsKICAgICAgICAgU0NsID0gU0NsLkNsaWVudDsKICAgICB9CiAgICAgdmFyIHNlbGYgPSB0aGlzOwotICAgIFNDbC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24gKCkgeworICAgIFNDbC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgIHNlbGYuc2VxaWQgKz0gMTsKICAgICAgICAgcmV0dXJuIHNlbGYuc2VxaWQ7CiAgICAgfTsKQEAgLTE0NzEsNyArMTU4OCw3IEBACiAgIHJldHVybiByZXN1bHQ7CiB9OwogCi1jb3B5TWFwID0gZnVuY3Rpb24ob2JqLCB0eXBlcyl7Citjb3B5TWFwID0gZnVuY3Rpb24ob2JqLCB0eXBlcykgewogCiAgIGlmICghb2JqKSB7cmV0dXJuIG9iajsgfQogCkBAIC0xNDg2LDggKzE2MDMsOCBAQAogICB2YXIgVHlwZSA9IHR5cGU7CiAKICAgdmFyIHJlc3VsdCA9IHt9LCB2YWw7Ci0gIGZvcih2YXIgcHJvcCBpbiBvYmopIHsKLSAgICBpZihvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHsKKyAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7CiAgICAgICB2YWwgPSBvYmpbcHJvcF07CiAgICAgICBpZiAodHlwZSA9PT0gbnVsbCkgewogICAgICAgICByZXN1bHRbcHJvcF0gPSB2YWw7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9idWlsZC5wcm9wZXJ0aWVzIGIvbGliL2pzL3Rlc3QvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDYzNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKKyMgTWF2ZW4gQW50IHRhc2tzIEphciBkZXRhaWxzCittdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvYnVpbGQueG1sIGIvbGliL2pzL3Rlc3QvYnVpbGQueG1sCmluZGV4IDliZTczY2YuLmQ4OTFiNDMgMTAwNzU1Ci0tLSBhL2xpYi9qcy90ZXN0L2J1aWxkLnhtbAorKysgYi9saWIvanMvdGVzdC9idWlsZC54bWwKQEAgLTI4LDIwICsyOCwyNCBAQAogICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIgLz4KICAgPHByb3BlcnR5IG5hbWU9Imphci5maWxlIiBsb2NhdGlvbj0iJHtidWlsZH0vanN0ZXN0LmphciIgLz4KIAotICA8IS0tIHRoZSByb290IGRpcmVjdG9yeSwgd2hlcmUgeW91IHVucGFjayB0aHJpZnQgZGlzdGlidXRpb24gKGUuZy4gdGhyaWZ0LTAueC54LnRhci5neikgLS0+CisgIDwhLS0gdGhlIHJvb3QgZGlyZWN0b3J5LCB3aGVyZSB5b3UgdW5wYWNrIHRocmlmdCBkaXN0aWJ1dGlvbiAoZS5nLjogdGhyaWZ0LTAueC54LnRhci5neikgLS0+CiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuZGlyIiBsb2NhdGlvbj0iLi4vLi4vLi4vIiAvPgogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS9saWIvamF2YSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIvPgogCi0gIDwhLS0gSW5jbHVkZSB0aGUgYmFzZSBqYXZhIHByb3BlcnRpZXMgZmlsZSAtLT4KLSAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgorICA8IS0tIEluY2x1ZGUgdGhlIGJhc2UgSmF2YSBwcm9wZXJ0aWVzIGZpbGUgLS0+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vZ3JhZGxlLnByb3BlcnRpZXMiIC8+CiAKICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5jb21waWxlciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vY29tcGlsZXIvY3BwL3RocmlmdCIgLz4KIAogICA8cGF0aCBpZD0ibGlicy5jbGFzc3BhdGgiPgotICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkLyI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnNvdXJjZXMuamFyIiAvPgogICAgIDwvZmlsZXNldD4KLSAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWIiPgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2RlcHMiPgogICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CiAgICAgPC9maWxlc2V0PgogICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZH0vbGliIj4KQEAgLTU5LDE2ICs2MywxNyBAQAogICAgICAgPGNvbmRpdGlvbj4KICAgICAgICAgPG5vdD4KICAgICAgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMiI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBpZD0iZnMiIGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGlkPSJmcyIgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlicyI+CiAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgogICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KICAgICAgICAgICAgIDwvZmlsZXNldD4KICAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CiAgICAgICAgIDwvbm90PgogICAgICAgPC9jb25kaXRpb24+CiAgICAgICBZb3UgbmVlZCBsaWJ0aHJpZnQqLmphciBhbmQgbGlidGhyaWZ0KnRlc3QuamFyIGxvY2F0ZWQgYXQKLSAgICAgICR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZAotICAgICAgRGlkIHlvdSBjb21waWxlIFRocmlmdCBKYXZhIGxpYnJhcnkgYW5kIGl0cyB0ZXN0IHN1aXRlIGJ5ICJhbnQgY29tcGlsZS10ZXN0Ij8KKyAgICAgICR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzCisgICAgICBEaWQgeW91IGNvbXBpbGUgVGhyaWZ0IEphdmEgbGlicmFyeSBhbmQgaXRzIHRlc3Qgc3VpdGUgYnkgIm1ha2UgY2hlY2siPwogICAgIDwvZmFpbD4KICAgICA8ZmFpbD4KICAgICAgIDxjb25kaXRpb24+CkBAIC04NCw2ICs4OSw3IEBACiAKICAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJkZXBlbmRlbmNpZXMiPgogICAgIDx0c3RhbXAgLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRvb2xzLmRpcn0iLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfSIvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L2pzL2xpYiIvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L2xpYiIvPgpAQCAtOTIsMjEgKzk4LDE5IEBACiAgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0vdGVzdC9sb2ciLz4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJqc2xpYnMiIGRlcGVuZHM9ImluaXQsIHByb3h5Ij4KKyAgPHRhcmdldCBuYW1lPSJkb3dubG9hZF9qc2xpYnMiPgogICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjExLjMubWluLmpzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvanF1ZXJ5LmpzIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KLSAgICA8Z2V0IHNyYz0iaHR0cDovL2pzLXRlc3QtZHJpdmVyLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay9Kc1Rlc3REcml2ZXIvY29udHJpYi9xdW5pdC9zcmMvZXF1aXYuanMiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9lcXVpdi5qcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gICAgPGdldCBzcmM9Imh0dHA6Ly9qcy10ZXN0LWRyaXZlci5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvSnNUZXN0RHJpdmVyL2NvbnRyaWIvcXVuaXQvc3JjL1FVbml0QWRhcHRlci5qcyIgZGVzdD0iJHtidWlsZH0vanMvbGliL1FVbml0QWRhcHRlci5qcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgICAgPGdldCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMi42LjIuanMiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9xdW5pdC5qcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgICAgPGdldCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMi42LjIuY3NzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvcXVuaXQuY3NzIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgPC90YXJnZXQ+CiAKLSAgICA8Z2V0IHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0xLjE4LjAuanMiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9xdW5pdC5qcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gICAgPGdldCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMS4xOC4wLmNzcyIgZGVzdD0iJHtidWlsZH0vanMvbGliL3F1bml0LmNzcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gICAgPCEtLSBqcy10ZXN0LWRyaXZlciBoYXMgaXNzdWVzIHdpdGggcmVsYXRpdmUgcGF0aC4uLnNvIHdlIG5lZWQgYSBjb3B5IC0tPgotICAgIDxjb3B5IGZpbGU9Ii4uL3NyYy90aHJpZnQuanMiIHRvZGlyPSIke2J1aWxkfS9qcyIvPgorICA8dGFyZ2V0IG5hbWU9ImpzbGlicyIgZGVwZW5kcz0iaW5pdCwgcHJveHksIGRvd25sb2FkX2pzbGlicyI+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249ImNvbXBpbGUgdGhlIHRlc3Qgc3VpdGUiIGRlcGVuZHM9ImluaXQsIGdlbmVyYXRlLCByZXNvbHZlIj4KICAgICA8IS0tIC8vVE9ETyBlbmFibGUgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQiLz4tLT4KLSAgICA8amF2YWMgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VuamF2YX0iIGRlc3RkaXI9IiR7YnVpbGR9L3Rlc3QiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiLz4KLSAgICA8amF2YWMgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0vdGVzdCIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIvPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtnZW5qYXZhfSIgZGVzdGRpcj0iJHtidWlsZH0vdGVzdCIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIvPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfS90ZXN0IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIi8+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0ianN0ZXN0IiBkZXNjcmlwdGlvbj0iY3JlYXRlIHRoZSB0ZXN0IHN1aXRlIGphciBmaWxlIiBkZXBlbmRzPSJjb21waWxlIj4KQEAgLTE1OSw0NCArMTYzLDYgQEAKICAgICA8L3BhcmFsbGVsPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9ImpzdGVzdGRyaXZlci1zZXJ2ZXIiIGRlc2NyaXB0aW9uPSJzdGFydCB0aGUganMtdGVzdC1kcml2ZXIgc2VydmVyIiBkZXBlbmRzPSJpbml0LCByZXNvbHZlIj4KLSAgICA8ZWNobz5TdGFydGluZyBqcy10ZXN0LWRyaXZlciBTZXJ2ZXIuLi48L2VjaG8+Ci0gICAgPGphdmEgamFyPSIke2J1aWxkfS9saWIvanN0ZXN0ZHJpdmVyLTEuMy41LmphciIgZGlyPSIuIiBmb3JrPSJ0cnVlIgotICAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiIG91dHB1dD0iJHtidWlsZH0vbG9nL2pzdGVzdGRyaXZlci1zZXJ2ZXIubG9nIj4KLSAgICAgIDxhcmcgbGluZT0iLS1wb3J0IDk4NzYiLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ianN0ZXN0ZHJpdmVyIiBkZXNjcmlwdGlvbj0iZG8gdW5pdCB0ZXN0cyB3aXRoIGpzLXRlc3QtZHJpdmVyIiBkZXBlbmRzPSJpbml0LCBqc3Rlc3QsIGpzbGlicyI+Ci0gICAgPHBhcmFsbGVsPgotICAgICAgPGphdmEgY2xhc3NuYW1lPSJ0ZXN0Lkh0dHBkIiBmb3JrPSJ0cnVlIiB0aW1lb3V0PSIxMDAwMCIKLSAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy91bml0dGVzdC5sb2ciPgotICAgICAgICA8YXJnIHZhbHVlPSIuLi8iIC8+Ci0gICAgICA8L2phdmE+Ci0gICAgICA8c2VxdWVudGlhbD4KLSAgICAgICAgPHNsZWVwIHNlY29uZHM9IjIiLz4KLSAgICAgICAgPGVjaG8+UnVubmluZyBVbml0IFRlc3RzIHdpdGgganMtdGVzdC1kcml2ZXI8L2VjaG8+Ci0gICAgICAgICAgPGphdmEgamFyPSIke2J1aWxkfS9saWIvanN0ZXN0ZHJpdmVyLTEuMy41LmphciIgZGlyPSIuIiBmb3JrPSJ0cnVlIgotICAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiIG91dHB1dD0iJHtidWlsZH0vbG9nL2pzdGVzdGRyaXZlci5sb2ciPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1jb25maWciIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSJqc1Rlc3REcml2ZXIuY29uZiIgLz4KLQotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1yZXNldCIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tdmVyYm9zZSIgLz4KLQotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1ydW5uZXJNb2RlIiAvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iREVCVUciIC8+Ci0KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tdGVzdHMiIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSJhbGwiIC8+Ci0KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tdGVzdE91dHB1dCIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7YnVpbGR9L3Rlc3QvbG9nLyIgLz4KLSAgICAgICAgPC9qYXZhPgotICAgICAgPC9zZXF1ZW50aWFsPgotICAgIDwvcGFyYWxsZWw+Ci0gIDwvdGFyZ2V0PgotCiAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiPgogICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgogICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhICR7dGhyaWZ0LmRpcn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KQEAgLTIwNCw2ICsxNzAsOSBAQAogICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgogICAgICAgPGFyZyBsaW5lPSItLWdlbiBqczpqcXVlcnkgJHt0aHJpZnQuZGlyfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgogICAgIDwvZXhlYz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4ganM6anF1ZXJ5ICR7dGhyaWZ0LmRpcn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCIgLz4KKyAgICA8L2V4ZWM+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249InJ1biB0ZXN0IHN1aXRlIChsaW50LCB1bml0dGVzdCkiIGRlcGVuZHM9ImxpbnQsIHVuaXR0ZXN0Ii8+CkBAIC0yMTgsNyArMTg3LDYgQEAKICAgICAtLT4KICAgICA8anNsOmpzbGludCBvcHRpb25zPSJldmlsLGZvcmluLGJyb3dzZXIsYml0d2lzZSxyZWdleHAsbmV3Y2FwLGltbWVkIiBlbmNvZGluZz0iVVRGLTgiPgogICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtnZW5qc30iIGluY2x1ZGVzPSIqKi8qLmpzIiAvPgogICAgICAgPGZpbGVzZXQgZGlyPSIuLi9zcmMiIGluY2x1ZGVzPSJ0aHJpZnQuanMiIC8+CiAKICAgICAgIDwhLS0gaXNzdWVzIHdpdGggdW5zYWZlIGNoYXJhY3RlciAtLT4KQEAgLTI1MCwxNiArMjE4LDIzIEBACiAgICAgPGRlbGV0ZSBkaXI9IiR7Z2VuanN9IiAvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9InJlc29sdmUiIHVubGVzcz0ibXZuLmZpbmlzaGVkIj4KKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiBkZXBlbmRzPSJpbml0LG12bi5hbnQudGFza3MuY2hlY2siIHVubGVzcz0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgPGdldCBzcmM9IiR7bXZuLmFudC50YXNrLnVybH0vJHttdm4uYW50LnRhc2suamFyfSIgZGVzdD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuY2hlY2siPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgICAgPHR5cGVmb3VuZCB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgbmFtZT0iYXJ0aWZhY3QiLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZXNvbHZlIiBkZXBlbmRzPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+CiAgICAgPHR5cGVkZWYgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIGNsYXNzcGF0aD0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL3Rvb2xzLyR7bXZuLmFudC50YXNrLmphcn0iLz4KIAogICAgIDxhcnRpZmFjdDpkZXBlbmRlbmNpZXMgZmlsZXNldElkPSJqcy50ZXN0LmRlcGVuZGVuY3kuamFycyI+CiAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzIiBhcnRpZmFjdElkPSJodHRwY2xpZW50IiB2ZXJzaW9uPSI0LjAuMSIvPgogICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZWNvZGUuanNsaW50NGphdmEiIGFydGlmYWN0SWQ9ImpzbGludDRqYXZhLWFudCIgdmVyc2lvbj0iMS40LjYiLz4KICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImV1Lm1lZHNlYS5taW1ldXRpbCIgYXJ0aWZhY3RJZD0ibWltZS11dGlsIiB2ZXJzaW9uPSIyLjEuMyIvPgotCi0gICAgICA8IS0tIGdldCBqc3Rlc3Rkcml2ZXIuamFyIHZpYSBtYXZlbi0tPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZWNvZGUuanN0ZC1tYXZlbi1wbHVnaW4iIGFydGlmYWN0SWQ9ImpzdGQtbWF2ZW4tcGx1Z2luIiB2ZXJzaW9uPSIxLjMuNS4xIi8+CiAgICAgPC9hcnRpZmFjdDpkZXBlbmRlbmNpZXM+CiAKICAgICA8IS0tIENvcHkgdGhlIGRlcGVuZGVuY2llcyB0byB0aGUgYnVpbGQvbGliIGRpciAtLT4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcyBiL2xpYi9qcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcwppbmRleCA5YTE5ODA5Li44MmQzYTFlIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKKysrIGIvbGliL2pzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzCkBAIC0xLDE4ICsxLDE4IEBACiBmdW5jdGlvbiBzZXJpYWxpemUoZGF0YSkgewotICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoIi9zZXJ2aWNlIik7Ci0gIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Ci0gIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKCIiLCAwLCAwKTsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJy9zZXJ2aWNlJyk7CisgIGNvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbignJywgMCwgMCk7CiAgIGRhdGEud3JpdGUocHJvdG9jb2wpOwogICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKICAgcmV0dXJuIHRyYW5zcG9ydC5zZW5kX2J1ZjsKIH0KIAogZnVuY3Rpb24gZGVzZXJpYWxpemUoc2VyaWFsaXplZCwgdHlwZSkgewotICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoIi9zZXJ2aWNlIik7CisgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCcvc2VydmljZScpOwogICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlcihzZXJpYWxpemVkKTsKLSAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CiAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKLSAgdmFyIGRhdGEgPSBuZXcgdHlwZSgpOworICBjb25zdCBkYXRhID0gbmV3IHR5cGUoKTsKICAgZGF0YS5yZWFkKHByb3RvY29sKTsKICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKTsKICAgcmV0dXJuIGRhdGE7CkBAIC0yNywxMiArMjcsMTIgQEAKIAogICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBbCiAgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2InfSksCi0gICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2MnfSksCisgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2MnfSkKICAgICBdLAogCiAgICAgc3RydWN0X3NldF9maWVsZDogWwogICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdkJ30pLAotICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdlJ30pLAorICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdlJ30pCiAgICAgXSwKIAogICAgIHN0cnVjdF9tYXBfZmllbGQ6IHsKQEAgLTYxLDcgKzYxLDEzIEBACiAgICAgICAgICAgREI6IG5ldyBTaW1wbGUoe3ZhbHVlOiAnayd9KQogICAgICAgICB9CiAgICAgICBdCi0gICAgfQorICAgIH0sCisKKyAgICBsaXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgICBbJ29uZScsICd0d28nXSwKKyAgICAgICBbJ3RocmVlJywgJ2ZvdXInXSwKKyAgICAgICBbJ2ZpdmUnLCAnc2l4J10KKyAgICBdCiAgIH0KICAgKTsKIH0KQEAgLTc1LDEyICs4MSwxMiBAQAogCiAgICAgc3RydWN0X2xpc3RfZmllbGQ6IFsKICAgICAgIHt2YWx1ZTogJ2InfSwKLSAgICAgIHt2YWx1ZTogJ2MnfSwKKyAgICAgIHt2YWx1ZTogJ2MnfQogICAgIF0sCiAKICAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBbCiAgICAgICB7dmFsdWU6ICdkJ30sCi0gICAgICB7dmFsdWU6ICdlJ30sCisgICAgICB7dmFsdWU6ICdlJ30KICAgICBdLAogCiAgICAgc3RydWN0X21hcF9maWVsZDogewpAQCAtMTA4LDcgKzExNCwxMyBAQAogICAgICAgICAgIERCOiB7dmFsdWU6ICdrJ30KICAgICAgICAgfQogICAgICAgXQotICAgIH0KKyAgICB9LAorCisgICAgbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICBbJ29uZScsICd0d28nXSwKKyAgICAgIFsndGhyZWUnLCAnZm91ciddLAorICAgICAgWydmaXZlJywgJ3NpeCddCisgICBdCiAgIH07CiB9CiAKQEAgLTEyNSwzOCArMTM3LDQ0IEBACiAgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXS52YWx1ZSwgJ2knKTsKICAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQS52YWx1ZSwgJ2onKTsKICAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFsxXS5EQi52YWx1ZSwgJ2snKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVswXSwgJ29uZScpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzFdLCAndHdvJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMF0sICd0aHJlZScpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdLCAnZm91cicpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdLCAnZml2ZScpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzFdLCAnc2l4Jyk7CiB9CiAKLXZhciBjYXNlcyA9IHsKK2NvbnN0IGNhc2VzID0gewogCi0gICJTZXJpYWxpemUvZGVzZXJpYWxpemUgc2ltcGxlIHN0cnVjdCBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCI6IGZ1bmN0aW9uKGFzc2VydCl7Ci0gICAgdmFyIHRPYmogPSBuZXcgU2ltcGxlKHt2YWx1ZTogJ2EnfSk7Ci0gICAgdmFyIHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCBTaW1wbGUpOworICAnU2VyaWFsaXplL2Rlc2VyaWFsaXplIHNpbXBsZSBzdHJ1Y3Qgc2hvdWxkIHJldHVybiBlcXVhbCBvYmplY3QnOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqID0gbmV3IFNpbXBsZSh7dmFsdWU6ICdhJ30pOworICAgIGNvbnN0IHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCBTaW1wbGUpOwogICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCk7CiAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZWNlaXZlZCwgdE9iaik7CiAgIH0sCiAKIAotICAiU2VyaWFsaXplL2Rlc2VyaWFsaXplIHNob3VsZCByZXR1cm4gZXF1YWwgb2JqZWN0IjogZnVuY3Rpb24oYXNzZXJ0KXsKLSAgICB2YXIgdE9iaiA9IGNyZWF0ZVRocmlmdE9iaigpOwotICAgIHZhciByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgQ29tcGxleCk7CisgICdTZXJpYWxpemUvZGVzZXJpYWxpemUgc2hvdWxkIHJldHVybiBlcXVhbCBvYmplY3QnOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqID0gY3JlYXRlVGhyaWZ0T2JqKCk7CisgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIENvbXBsZXgpOwogICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCk7CiAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZWNlaXZlZCwgdE9iaik7CiAgIH0sCiAKLSAgIk5lc3RlZCBzdHJ1Y3RzIGFuZCBjb250YWluZXJzIGluaXRpYWxpemVkIGZyb20gcGxhaW4ganMgb2JqZWN0cyBzaG91bGQgc2VyaWFsaXplIHNhbWUgYXMgaWYgaW5pdGlhbGl6ZWQgZnJvbSB0aHJpZnQgb2JqZWN0cyI6IGZ1bmN0aW9uKGFzc2VydCkgewotICAgIHZhciB0T2JqMSA9IGNyZWF0ZVRocmlmdE9iaigpOwotICAgIHZhciB0T2JqMiA9IG5ldyBDb21wbGV4KGNyZWF0ZUpzT2JqKCkpOworICAnTmVzdGVkIHN0cnVjdHMgYW5kIGNvbnRhaW5lcnMgaW5pdGlhbGl6ZWQgZnJvbSBwbGFpbiBqcyBvYmplY3RzIHNob3VsZCBzZXJpYWxpemUgc2FtZSBhcyBpZiBpbml0aWFsaXplZCBmcm9tIHRocmlmdCBvYmplY3RzJzogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgdE9iajEgPSBjcmVhdGVUaHJpZnRPYmooKTsKKyAgICBjb25zdCB0T2JqMiA9IG5ldyBDb21wbGV4KGNyZWF0ZUpzT2JqKCkpOwogICAgIGFzc2VydFZhbHVlcyh0T2JqMiwgYXNzZXJ0KTsKICAgICBhc3NlcnQuZXF1YWwoc2VyaWFsaXplKHRPYmoyKSwgc2VyaWFsaXplKHRPYmoxKSk7CiAgIH0sCiAKLSAgIk1vZGlmaWNhdGlvbnMgdG8gYXJncyBvYmplY3Qgc2hvdWxkIG5vdCBhZmZlY3QgY29uc3RydWN0ZWQgVGhyaWZ0IG9iamVjdCI6IGZ1bmN0aW9uIChhc3NlcnQpIHsKKyAgJ01vZGlmaWNhdGlvbnMgdG8gYXJncyBvYmplY3Qgc2hvdWxkIG5vdCBhZmZlY3QgY29uc3RydWN0ZWQgVGhyaWZ0IG9iamVjdCc6IGZ1bmN0aW9uKGFzc2VydCkgewogCi0gICAgdmFyIGFyZ3MgPSBjcmVhdGVKc09iaigpOworICAgIGNvbnN0IGFyZ3MgPSBjcmVhdGVKc09iaigpOwogICAgIGFzc2VydFZhbHVlcyhhcmdzLCBhc3NlcnQpOwogCi0gICAgdmFyIHRPYmogPSBuZXcgQ29tcGxleChhcmdzKTsKKyAgICBjb25zdCB0T2JqID0gbmV3IENvbXBsZXgoYXJncyk7CiAgICAgYXNzZXJ0VmFsdWVzKHRPYmosIGFzc2VydCk7CiAKICAgICBhcmdzLnN0cnVjdF9maWVsZC52YWx1ZSA9ICdaWlonOwpAQCAtMTc0LDggKzE5Miw4IEBACiAgICAgYXNzZXJ0VmFsdWVzKHRPYmosIGFzc2VydCk7CiAgIH0sCiAKLSAgIm51bGxzIGFyZSBvayI6IGZ1bmN0aW9uKGFzc2VydCkgewotICAgIHZhciB0T2JqID0gbmV3IENvbXBsZXgoeworICAnbnVsbHMgYXJlIG9rJzogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgdE9iaiA9IG5ldyBDb21wbGV4KHsKICAgICAgIHN0cnVjdF9maWVsZDogbnVsbCwKICAgICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBudWxsLAogICAgICAgc3RydWN0X3NldF9maWVsZDogbnVsbCwKQEAgLTE4Myw3ICsyMDEsNyBAQAogICAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBudWxsLAogICAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogbnVsbAogICAgIH0pOwotICAgIHZhciByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgQ29tcGxleCk7CisgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIENvbXBsZXgpOwogICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCk7CiAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0T2JqLCByZWNlaXZlZCk7CiAgIH0KQEAgLTE5MSw1ICsyMDksNSBAQAogfTsKIAogT2JqZWN0LmtleXMoY2FzZXMpLmZvckVhY2goZnVuY3Rpb24oY2FzZU5hbWUpIHsKLSAgdGVzdChjYXNlTmFtZSwgY2FzZXNbY2FzZU5hbWVdKTsKKyAgUVVuaXQudGVzdChjYXNlTmFtZSwgY2FzZXNbY2FzZU5hbWVdKTsKIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvanNUZXN0RHJpdmVyLmNvbmYgYi9saWIvanMvdGVzdC9qc1Rlc3REcml2ZXIuY29uZgppbmRleCBiOTcwMmNkLi5lYjE1ODhjIDEwMDc1NQotLS0gYS9saWIvanMvdGVzdC9qc1Rlc3REcml2ZXIuY29uZgorKysgYi9saWIvanMvdGVzdC9qc1Rlc3REcml2ZXIuY29uZgpAQCAtNyw2ICs3LDcgQEAKICMgZGVwZW5kZW5jaWVzCiAgIC0gYnVpbGQvanMvbGliL2pxdWVyeS5qcwogICAtIGJ1aWxkL2pzL3RocmlmdC5qcworICAtIGdlbi1qcy9Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5qcwogICAtIGdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzCiAgIC0gZ2VuLWpzL1RocmlmdFRlc3QuanMKICMgdGhlIHRlc3Qgc3VpdGUKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3BoYW50b20tY2xpZW50LmpzIGIvbGliL2pzL3Rlc3QvcGhhbnRvbS1jbGllbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxN2U3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3BoYW50b20tY2xpZW50LmpzCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLyoganNoaW50IC1XMTAwICovCisKKyhmdW5jdGlvbigpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8vIFJ1ZGltZW50YXJ5IHRlc3QgaGVscGVyIGZ1bmN0aW9ucworICAvLyBUT0RPOiBSZXR1cm4gZXJyb3IgY29kZSBiYXNlZCBvbiBraW5kIG9mIGVycm9ycyByYXRoZXIgdGhhbiB0aHJvdworICB2YXIgb2sgPSBmdW5jdGlvbih0LCBtc2cpIHsKKyAgICBpZiAoIXQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCcqKiogRkFJTEVEICoqKicpOworICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CisgICAgfQorICB9OworICB2YXIgZXF1YWwgPSBmdW5jdGlvbihhLCBiKSB7CisgICAgaWYgKGEgIT09IGIpIHsKKyAgICAgIGNvbnNvbGUubG9nKCcqKiogRkFJTEVEICoqKicpOworICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CisgICAgfQorICB9OworICB2YXIgdGVzdCA9IGZ1bmN0aW9uKG5hbWUsIGYpIHsKKyAgICBjb25zb2xlLmxvZygnVEVTVCA6ICcgKyBuYW1lKTsKKyAgICBmKCk7CisgICAgY29uc29sZS5sb2coJ09LXG4nKTsKKyAgfTsKKworICB2YXIgcGFyc2VBcmdzID0gZnVuY3Rpb24oYXJncykgeworICAgIHZhciBza2lwcyA9IFsKKyAgICAgICctLXRyYW5zcG9ydD1odHRwJywKKyAgICAgICctLXByb3RvY29sPWpzb24nCisgICAgXTsKKyAgICB2YXIgb3B0cyA9IHsKKyAgICAgIHBvcnQ6ICc5MDkwJworICAgICAgLy8gcHJvdG9jb2w6ICdqc29uJywKKyAgICB9OworICAgIHZhciBrZXlzID0ge307CisgICAgZm9yICh2YXIga2V5IGluIG9wdHMpIHsKKyAgICAgIGtleXNbJy0tJyArIGtleSArICc9J10gPSBrZXk7CisgICAgfQorICAgIGZvciAodmFyIGkgaW4gYXJncykgeworICAgICAgdmFyIGFyZyA9IGFyZ3NbaV07CisgICAgICBpZiAoc2tpcHMuaW5kZXhPZihhcmcpICE9IC0xKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdmFyIGhpdCA9IGZhbHNlOworICAgICAgZm9yICh2YXIgayBpbiBrZXlzKSB7CisgICAgICAgIGlmIChhcmcuc2xpY2UoMCwgay5sZW5ndGgpID09PSBrKSB7CisgICAgICAgICAgb3B0c1trZXlzW2tdXSA9IGFyZy5zbGljZShrLmxlbmd0aCk7CisgICAgICAgICAgaGl0ID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFoaXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3B0cy5wb3J0ID0gcGFyc2VJbnQob3B0cy5wb3J0LCAxMCk7CisgICAgaWYgKCFvcHRzLnBvcnQgfHwgb3B0cy5wb3J0IDwgMSB8fCBvcHRzLnBvcnQgPiA2NTUzNSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBvcnQgbnVtYmVyJyk7CisgICAgfQorICAgIHJldHVybiBvcHRzOworICB9OworCisgIHZhciBleGVjdXRlID0gZnVuY3Rpb24oKSB7CisgICAgY29uc29sZS5sb2coJyMjIyBBcGFjaGUgVGhyaWZ0IEphdmFzY3JpcHQgc3RhbmRhbG9uZSB0ZXN0IGNsaWVudCcpOworICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKKworICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygnc3JjL3RocmlmdC5qcycpOworICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygndGVzdC9nZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcycpOworICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygndGVzdC9nZW4tanMvVGhyaWZ0VGVzdC5qcycpOworCisgICAgdmFyIHN5c3RlbSA9IHJlcXVpcmUoJ3N5c3RlbScpOworICAgIHZhciBvcHRzID0gcGFyc2VBcmdzKHN5c3RlbS5hcmdzLnNsaWNlKDEpKTsKKyAgICB2YXIgcG9ydCA9IG9wdHMucG9ydDsKKyAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJ2h0dHA6Ly9sb2NhbGhvc3Q6JyArIHBvcnQgKyAnL3NlcnZpY2UnKTsKKyAgICB2YXIgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgdmFyIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisKKyAgICAvLyBUT0RPOiBSZW1vdmUgZHVwbGljYXRlIGNvZGUgd2l0aCB0ZXN0LmpzLgorICAgIC8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKKyAgICB2YXIgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKworICAgIGZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgeworICAgICAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gJ29iamVjdCcpIHsKKyAgICAgICAgICBlcXVhbChtYXAxLCBtYXAyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgeworICAgICAgICAgICAgY2hlY2tSZWN1cnNpdmVseShtYXAxW2tleV0sIG1hcDJba2V5XSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdGVzdCgnVm9pZCcsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RWb2lkKCksIHVuZGVmaW5lZCk7CisgICAgfSk7CisgICAgdGVzdCgnQmluYXJ5IChTdHJpbmcpJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgYmluYXJ5ID0gJyc7CisgICAgICBmb3IgKHZhciB2ID0gMjU1OyB2ID49IDA7IC0tdikgeworICAgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICAgIH0KKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGJpbmFyeSksIGJpbmFyeSk7CisgICAgfSk7CisgICAgdGVzdCgnQmluYXJ5IChVaW50OEFycmF5KScsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGJpbmFyeSA9ICcnOworICAgICAgZm9yICh2YXIgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodik7CisgICAgICB9CisgICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aCk7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7ICsraSkgeworICAgICAgICBhcnJbaV0gPSBiaW5hcnlbaV0uY2hhckNvZGVBdCgpOworICAgICAgfQorICAgICAgZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYXJyKSwgYmluYXJ5KTsKKyAgICB9KTsKKyAgICB0ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCksIHN0cmluZ1Rlc3QpOworCisgICAgICB2YXIgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOworICAgICAgICAgICAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycyksIHNwZWNpYWxDaGFyYWN0ZXJzKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdEb3VibGUnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDApLCAwKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKC0xKSwgLTEpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMy4xNCksIDMuMTQpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApKSwgTWF0aC5wb3coMiwgNjApKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdCb29sJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEJvb2wodHJ1ZSksIHRydWUpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RCb29sKGZhbHNlKSwgZmFsc2UpOworICAgIH0pOworICAgIHRlc3QoJ0k4JywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEJ5dGUoMCksIDApOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RCeXRlKDB4MDEpLCAweDAxKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdJMzInLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKDApLCAwKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSksIE1hdGgucG93KDIsIDMwKSk7CisgICAgICBlcXVhbChjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApKSwgLU1hdGgucG93KDIsIDMwKSk7CisgICAgfSk7CisgICAgdGVzdCgnSTY0JywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEk2NCgwKSwgMCk7CisgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgICBlcXVhbChjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MikpLCBNYXRoLnBvdygyLCA1MikpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoLU1hdGgucG93KDIsIDUyKSksIC1NYXRoLnBvdygyLCA1MikpOworICAgIH0pOworCisgICAgdGVzdCgnU3RydWN0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworCisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKworICAgICAgZXF1YWwoSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgIH0pOworCisgICAgdGVzdCgnTmVzdCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgeHRyVGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgICAgeHRyVGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICAgIHZhciBuZXN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpOworICAgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICAgIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nID0geHRyVGVzdElucHV0OworICAgICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAxNSk7CisKKyAgICAgIHZhciBuZXN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KTsKKworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworCisgICAgICBlcXVhbChKU09OLnN0cmluZ2lmeShuZXN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ01hcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKKworICAgICAgdmFyIG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQpOworCisgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgICAnbG9uZ1ZhbHVlJzogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogJ2xvbmcga2V5JworICAgICAgfTsKKworICAgICAgdmFyIG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cmluZ01hcChtYXBUZXN0SW5wdXQpOworCisgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ1NldCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHNldFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICAgIG9rKGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCksIHNldFRlc3RJbnB1dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdMaXN0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICAgIG9rKGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KSwgbGlzdFRlc3RJbnB1dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdFbnVtJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgIH0pOworCisgICAgdGVzdCgnVHlwZURlZicsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RUeXBlZGVmKDY5KSwgNjkpOworICAgIH0pOworCisgICAgdGVzdCgnU2tpcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgdmFyIG1vZGlmaWVkQ2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKKyAgICAgIG1vZGlmaWVkQ2xpZW50LnJlY3ZfdGVzdFN0cnVjdCA9IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgaW5wdXQgPSBtb2RpZmllZENsaWVudC5pbnB1dDsKKyAgICAgICAgdmFyIHh0cnVjdDMgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QzKCk7CisKKyAgICAgICAgaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICBpbnB1dC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgICAvLyByZWFkIFh0cnVjdCBkYXRhIHdpdGggWHRydWN0MworICAgICAgICBpbnB1dC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICB4dHJ1Y3QzLnJlYWQoaW5wdXQpOworICAgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgLy8gcmVhZCBUaHJpZnQuVHlwZS5TVE9QIG1lc3NhZ2UKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7CisKKyAgICAgICAgaW5wdXQucmVhZFN0cnVjdEVuZCgpOworICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOworCisgICAgICAgIHJldHVybiB4dHJ1Y3QzOworICAgICAgfTsKKworICAgICAgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICAgIHZhciBzdHJ1Y3RUZXN0T3V0cHV0ID0gbW9kaWZpZWRDbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworCisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0IGluc3RhbmNlb2YgVGhyaWZ0VGVzdC5YdHJ1Y3QzLCB0cnVlKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuY2hhbmdlZCwgbnVsbCk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdNYXBNYXAnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7CisgICAgICAgICc0JzogeycxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNH0sCisgICAgICAgICctNCc6IHsnLTQnOiAtNCwgJy0zJzogLTMsICctMic6IC0yLCAnLTEnOiAtMX0KKyAgICAgIH07CisKKyAgICAgIHZhciBtYXBNYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisKKworICAgICAgZm9yICh2YXIga2V5IGluIG1hcE1hcFRlc3RPdXRwdXQpIHsKKyAgICAgICAgZm9yICh2YXIga2V5MiBpbiBtYXBNYXBUZXN0T3V0cHV0W2tleV0pIHsKKyAgICAgICAgICBlcXVhbChtYXBNYXBUZXN0T3V0cHV0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcE1hcFRlc3RPdXRwdXQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CisgICAgICAgIG9rKGZhbHNlKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOworICAgICAgICBlcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgfQorICAgIH0pOworCisgICAgdGVzdCgnbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oKSB7CisgICAgICB0cnkgeworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJyk7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIG9rKGZhbHNlKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ1RFeGNlcHRpb24nLCBmdW5jdGlvbigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJyk7CisgICAgICAgIG9rKGZhbHNlKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgb2sob2spOworICAgICAgfQorICAgIH0pOworCisgICAgdmFyIGNyYXp5ID0geworICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgfV0KKyAgICB9OworICAgIHRlc3QoJ0luc2FuaXR5JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgaW5zYW5pdHkgPSB7CisgICAgICAgICcxJzogeworICAgICAgICAgICcyJzogY3JhenksCisgICAgICAgICAgJzMnOiBjcmF6eQorICAgICAgICB9LAorICAgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQorICAgICAgfTsKKyAgICAgIHZhciByZXMgPSBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KGNyYXp5KSk7CisgICAgICBvayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOworICAgICAgb2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CisKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkocmVzLCBpbnNhbml0eSk7CisgICAgfSk7CisKKyAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CisgICAgY29uc29sZS5sb2coJyMjIyBBbGwgdGVzdHMgc3VjY2VlZGVkLicpOworICAgIHJldHVybiAwOworICB9OworCisgIHRyeSB7CisgICAgdmFyIHJldCA9IGV4ZWN1dGUoKTsKKyAgICBwaGFudG9tLmV4aXQocmV0KTsKKyAgfSBjYXRjaCAoZXJyKSB7CisgICAgLy8gQ2F0Y2ggYWxsIGFuZCBleGl0IHRvIGF2b2lkIGhhbmcuCisgICAgY29uc29sZS5lcnJvcihlcnIpOworICAgIHBoYW50b20uZXhpdCgxKTsKKyAgfQorfSkoKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3BoYW50b21qcy1xdW5pdC5qcyBiL2xpYi9qcy90ZXN0L3BoYW50b21qcy1xdW5pdC5qcwppbmRleCBhODQwZGI2Li5jMWQ3YTViIDEwMDc1NQotLS0gYS9saWIvanMvdGVzdC9waGFudG9tanMtcXVuaXQuanMKKysrIGIvbGliL2pzL3Rlc3QvcGhhbnRvbWpzLXF1bml0LmpzCkBAIC0yOCwxOCArMjgsMTggQEAKICAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgY29uZGl0aW9uID0gZmFsc2UsCiAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBpZiAoIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0IDwgbWF4dGltZU91dE1pbGxpcykgJiYgIWNvbmRpdGlvbiApIHsKKyAgICAgICAgICAgIGlmICgobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydCA8IG1heHRpbWVPdXRNaWxsaXMpICYmICFjb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICAvLyBJZiBub3QgdGltZS1vdXQgeWV0IGFuZCBjb25kaXRpb24gbm90IHlldCBmdWxmaWxsZWQKLSAgICAgICAgICAgICAgICBjb25kaXRpb24gPSAodHlwZW9mKHRlc3RGeCkgPT09ICJzdHJpbmciID8gZXZhbCh0ZXN0RngpIDogdGVzdEZ4KCkpOyAvLzwgZGVmZW5zaXZlIGNvZGUKKyAgICAgICAgICAgICAgICBjb25kaXRpb24gPSAodHlwZW9mKHRlc3RGeCkgPT09ICdzdHJpbmcnID8gZXZhbCh0ZXN0RngpIDogdGVzdEZ4KCkpOyAvLzwgZGVmZW5zaXZlIGNvZGUKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYoIWNvbmRpdGlvbikgeworICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIElmIGNvbmRpdGlvbiBzdGlsbCBub3QgZnVsZmlsbGVkICh0aW1lb3V0IGJ1dCBjb25kaXRpb24gaXMgJ2ZhbHNlJykKICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIid3YWl0Rm9yKCknIHRpbWVvdXQiKTsKICAgICAgICAgICAgICAgICAgICAgcGhhbnRvbS5leGl0KDEpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIENvbmRpdGlvbiBmdWxmaWxsZWQgKHRpbWVvdXQgYW5kL29yIGNvbmRpdGlvbiBpcyAndHJ1ZScpCi0gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCInd2FpdEZvcigpJyBmaW5pc2hlZCBpbiAiICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQpICsgIm1zLiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG9uUmVhZHkpID09PSAic3RyaW5nIikgeworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiJ3dhaXRGb3IoKScgZmluaXNoZWQgaW4gIiArIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0KSArICdtcy4nKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihvblJlYWR5KSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwob25SZWFkeSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBvblJlYWR5KCk7IC8vPCBEbyB3aGF0IGl0J3Mgc3VwcG9zZWQgdG8gZG8gb25jZSB0aGUgY29uZGl0aW9uIGlzIGZ1bGZpbGxlZApAQCAtNjMsMjEgKzYzLDIxIEBACiAgICAgY29uc29sZS5sb2cobXNnKTsKIH07CiAKLXBhZ2Uub3BlbihzeXN0ZW0uYXJnc1sxXSwgZnVuY3Rpb24oc3RhdHVzKXsKLSAgICBpZiAoc3RhdHVzICE9PSAic3VjY2VzcyIpIHsKLSAgICAgICAgY29uc29sZS5sb2coIlVuYWJsZSB0byBhY2Nlc3MgbmV0d29yayIpOworcGFnZS5vcGVuKHN5c3RlbS5hcmdzWzFdLCBmdW5jdGlvbihzdGF0dXMpIHsKKyAgICBpZiAoc3RhdHVzICE9PSAnc3VjY2VzcycpIHsKKyAgICAgICAgY29uc29sZS5sb2coJ1VuYWJsZSB0byBhY2Nlc3MgbmV0d29yaycpOwogICAgICAgICBwaGFudG9tLmV4aXQoMSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgd2FpdEZvcihmdW5jdGlvbigpewotICAgICAgICAgICAgcmV0dXJuIHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24oKXsKKyAgICAgICAgd2FpdEZvcihmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBwYWdlLmV2YWx1YXRlKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdW5pdC10ZXN0cmVzdWx0Jyk7CiAgICAgICAgICAgICAgICAgaWYgKGVsICYmIGVsLmlubmVyVGV4dC5tYXRjaCgnY29tcGxldGVkJykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0pOwotICAgICAgICB9LCBmdW5jdGlvbigpewotICAgICAgICAgICAgdmFyIGZhaWxlZE51bSA9IHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24oKXsKKyAgICAgICAgfSwgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB2YXIgZmFpbGVkTnVtID0gcGFnZS5ldmFsdWF0ZShmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVuaXQtdGVzdHJlc3VsdCcpOwogICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVsLmlubmVyVGV4dCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwLmpzIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMKaW5kZXggZTE5NWU4MC4uODM4MGMzYSAxMDA2NDQKLS0tIGEvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMKKysrIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMKQEAgLTE3LDMzICsxNywzOSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLy9UaGlzIEhUVFAgc2VydmVyIGlzIGRlc2lnbmVkIHRvIHNlcnZlIHRoZSB0ZXN0Lmh0bWwgYnJvd3NlcgotLy8gIGJhc2VkIEphdmFTY3JpcHQgdGVzdCBwYWdlICh3aGljaCBtdXN0IGJlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSkuIAorLy8gIFRoaXMgSFRUUCBzZXJ2ZXIgaXMgZGVzaWduZWQgdG8gc2VydmUgdGhlIHRlc3QuaHRtbCBicm93c2VyCisvLyAgYmFzZWQgSmF2YVNjcmlwdCB0ZXN0IHBhZ2UgKHdoaWNoIG11c3QgYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KS4KIC8vICBUaGlzIHNlcnZlciBhbHNvIHN1cHBsaWVzIHRoZSBUaHJpZnQgYmFzZWQgdGVzdCBzZXJ2aWNlLCB3aGljaCBkZXBlbmRzCiAvLyAgb24gdGhlIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IElETCBzZXJ2aWNlICh3aGljaCBtdXN0IGJlIGNvbXBpbGVkCiAvLyAgZm9yIE5vZGUgYW5kIGJyb3dzZXIgYmFzZWQgSmF2YVNjcmlwdCBpbiAuL2dlbi1ub2RlanMgYW5kIC4vZ2VuLWpzCi0vLyAgcmVzcGVjdGl2ZWx5KS4gCisvLyAgcmVzcGVjdGl2ZWx5KS4KKy8vCisvLyAgVXNpbmcgdGhlIGNvbW1hbmQgZmxhZyAtLWVzNiwgdGhpcyBzZXJ2ZXIgY2FuIGJlIHJ1biB1c2luZyBub2RlanMgY29kZSBidWlsdAorLy8gIGZvciB0aGUgZXM2IGVudmlyb25tZW50IG9yIGZvciBwcmUtZXM2IGVudmlyb25tZW50LgorLy8KIAotdmFyIHRocmlmdCA9IHJlcXVpcmUoJy4uLy4uL25vZGVqcy9saWIvdGhyaWZ0Jyk7Ci12YXIgVGhyaWZ0VGVzdFN2YyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0LmpzJyk7Ci12YXIgVGhyaWZ0VGVzdEhhbmRsZXIgPSByZXF1aXJlKCcuL3Rlc3RfaGFuZGxlcicpLlRocmlmdFRlc3RIYW5kbGVyOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKTsKK2NvbnN0IGVzNk1vZGUgPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZXM2Jyk7Citjb25zdCBnZW5Gb2xkZXIgPSBlczZNb2RlID8gJ2dlbi1ub2RlanMtZXM2JyA6ICdnZW4tbm9kZWpzJzsKK2NvbnN0IFRocmlmdFRlc3RTdmMgPSByZXF1aXJlKGAuLyR7Z2VuRm9sZGVyfS9UaHJpZnRUZXN0LmpzYCk7Citjb25zdCBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuVGhyaWZ0VGVzdEhhbmRsZXI7CiAKLXZhciBUaHJpZnRUZXN0U3ZjT3B0ID0geworY29uc3QgVGhyaWZ0VGVzdFN2Y09wdCA9IHsKIAl0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCiAJcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLAogCXByb2Nlc3NvcjogVGhyaWZ0VGVzdFN2YywKIAloYW5kbGVyOiBUaHJpZnRUZXN0SGFuZGxlcgogfTsKIAotdmFyIFRocmlmdFdlYlNlcnZlck9wdGlvbnMgPSB7Ci0JZmlsZXM6ICIuIiwKK2NvbnN0IFRocmlmdFdlYlNlcnZlck9wdGlvbnMgPSB7CisJZmlsZXM6IF9fZGlybmFtZSwKIAlzZXJ2aWNlczogewotCQkiL3NlcnZpY2UiOiBUaHJpZnRUZXN0U3ZjT3B0CisJCScvc2VydmljZSc6IFRocmlmdFRlc3RTdmNPcHQKIAl9CiB9OwogCi12YXIgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zKTsKLXZhciBwb3J0ID0gODA4ODsKK2NvbnN0IHNlcnZlciA9IHRocmlmdC5jcmVhdGVXZWJTZXJ2ZXIoVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyk7Citjb25zdCBwb3J0ID0gZXM2TW9kZSA/IDgwODggOiA4MDg5Owogc2VydmVyLmxpc3Rlbihwb3J0KTsKLWNvbnNvbGUubG9nKCJTZXJ2aW5nIGZpbGVzIGZyb206ICIgKyBfX2Rpcm5hbWUpOwotY29uc29sZS5sb2coIkh0dHAvVGhyaWZ0IFNlcnZlciBydW5uaW5nIG9uIHBvcnQ6ICIgKyBwb3J0KTsKK2NvbnNvbGUubG9nKGBTZXJ2aW5nIGZpbGVzIGZyb206ICR7X19kaXJuYW1lfWApOworY29uc29sZS5sb2coYEh0dHAvVGhyaWZ0IFNlcnZlciAoRVM2IG1vZGUgJHtlczZNb2RlfSkgcnVubmluZyBvbiBwb3J0OiAke3BvcnR9YCk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cHMuanMgYi9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cHMuanMKaW5kZXggYWYxNzQ1Yi4uMWExNzFkZCAxMDA2NDQKLS0tIGEvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHBzLmpzCisrKyBiL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwcy5qcwpAQCAtMTgsNyArMTgsNyBAQAogICovCiAKIC8vVGhpcyBIVFRQIHNlcnZlciBpcyBkZXNpZ25lZCB0byBzZXJ2ZXIgdGhlIHRlc3QuaHRtbCBicm93c2VyCi0vLyAgYmFzZWQgSmF2YVNjcmlwdCB0ZXN0IHBhZ2UgKHdoaWNoIG11c3QgYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KS4gCisvLyAgYmFzZWQgSmF2YVNjcmlwdCB0ZXN0IHBhZ2UgKHdoaWNoIG11c3QgYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KS4KIC8vICBUaGlzIHNlcnZlciBhbHNvIHN1cHBsaWVzIHRoZSBUaHJpZnQgYmFzZWQgdGVzdCBzZXJ2aWNlLCB3aGljaCBkZXBlbmRzCiAvLyAgb24gdGhlIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IElETCBzZXJ2aWNlICh3aGljaCBtdXN0IGJlIGNvbXBpbGVkCiAvLyAgZm9yIE5vZGUgYW5kIGJyb3dzZXIgYmFzZWQgSmF2YVNjcmlwdCBpbiAuL2dlbi1ub2RlanMgYW5kIC4vZ2VuLWpzCkBAIC0yNiwzMiArMjYsMzQgQEAKIC8vICBzdXBwb3J0IGxpYnJhcmllcyBmb3IgdGVzdC5odG1sIChqcXVlcnkuanMsIHF1bml0LmpzIGFuZCBxdW5pdC5jc3MKIC8vICBpbiAuL2J1aWxkL2pzL2xpYikuCiAKLXZhciBmcyA9IHJlcXVpcmUoImZzIik7Ci12YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKTsKLXZhciBUaHJpZnRUZXN0U3ZjID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QuanMnKTsKLXZhciBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuVGhyaWZ0VGVzdEhhbmRsZXI7Citjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpOworY29uc3QgZXM2TW9kZSA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1lczYnKTsKK2NvbnN0IGdlbkZvbGRlciA9IGVzNk1vZGUgPyAnZ2VuLW5vZGVqcy1lczYnIDogJ2dlbi1ub2RlanMnOworY29uc3QgVGhyaWZ0VGVzdFN2YyA9IHJlcXVpcmUoYC4vJHtnZW5Gb2xkZXJ9L1RocmlmdFRlc3QuanNgKTsKK2NvbnN0IFRocmlmdFRlc3RIYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKS5UaHJpZnRUZXN0SGFuZGxlcjsKIAogLy9TZXR1cCB0aGUgSS9PIHN0YWNrIG9wdGlvbnMgZm9yIHRoZSBUaHJpZnRUZXN0IHNlcnZpY2UKLXZhciBUaHJpZnRUZXN0U3ZjT3B0ID0geworY29uc3QgVGhyaWZ0VGVzdFN2Y09wdCA9IHsKICAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAogICBwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCiAgIHByb2Nlc3NvcjogVGhyaWZ0VGVzdFN2YywKICAgaGFuZGxlcjogVGhyaWZ0VGVzdEhhbmRsZXIKIH07CiAKLXZhciBUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zID0gewotICBmaWxlczogIi4iLAorY29uc3QgVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyA9IHsKKyAgZmlsZXM6IF9fZGlybmFtZSwKICAgdGxzOiB7Ci0gICAgIGtleTogZnMucmVhZEZpbGVTeW5jKCIuLi8uLi8uLi90ZXN0L2tleXMvc2VydmVyLmtleSIpLAotICAgICBjZXJ0OiBmcy5yZWFkRmlsZVN5bmMoIi4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0IikKLSAgfSwJCisgICAgIGtleTogZnMucmVhZEZpbGVTeW5jKCcuLi8uLi8uLi90ZXN0L2tleXMvc2VydmVyLmtleScpLAorICAgICBjZXJ0OiBmcy5yZWFkRmlsZVN5bmMoJy4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0JykKKyAgfSwKICAgc2VydmljZXM6IHsKLSAgICAiL3NlcnZpY2UiOiBUaHJpZnRUZXN0U3ZjT3B0CisgICAgJy9zZXJ2aWNlJzogVGhyaWZ0VGVzdFN2Y09wdAogICB9CiB9OwogCi12YXIgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zKTsKLXZhciBwb3J0ID0gODA4OTsKK2NvbnN0IHNlcnZlciA9IHRocmlmdC5jcmVhdGVXZWJTZXJ2ZXIoVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyk7Citjb25zdCBwb3J0ID0gZXM2TW9kZSA/IDgwOTAgOiA4MDkxOwogc2VydmVyLmxpc3Rlbihwb3J0KTsKLWNvbnNvbGUubG9nKCJTZXJ2aW5nIGZpbGVzIGZyb206ICIgKyBfX2Rpcm5hbWUpOwotY29uc29sZS5sb2coIkh0dHAvVGhyaWZ0IFNlcnZlciBydW5uaW5nIG9uIHBvcnQ6ICIgKyBwb3J0KTsKK2NvbnNvbGUubG9nKGBTZXJ2aW5nIGZpbGVzIGZyb206ICR7X19kaXJuYW1lfWApOworY29uc29sZS5sb2coYEh0dHAvVGhyaWZ0IFNlcnZlciAoRVM2IG1vZGUgJHtlczZNb2RlfSkgcnVubmluZyBvbiBwb3J0OiAke3BvcnR9YCk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWFzeW5jLmpzIGIvbGliL2pzL3Rlc3QvdGVzdC1hc3luYy5qcwppbmRleCAzMzZlMmJjLi44YzZiMTNlIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC90ZXN0LWFzeW5jLmpzCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtYXN5bmMuanMKQEAgLTE3LDkgKzE3LDkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAgLyoganNoaW50IC1XMTAwICovCi0gCisKIC8qCi0gKiBGdWxseSBBc3luYyBKYXZhU2NyaXB0IHRlc3Qgc3VpdGUgZm9yIFRocmlmdFRlc3QudGhyaWZ0LiAKKyAqIEZ1bGx5IEFzeW5jIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuCiAgKiBUaGVzZSB0ZXN0cyBhcmUgZGVzaWduZWQgdG8gZXhlcmNpc2UgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQKICAqICh3aGljaCBpcyBleGNsdXNpdmVseSBhc3luYykuCiAgKgpAQCAtMzAsMzE5ICszMCwzNDEgQEAKIAogCiAvLyBhbGwgTGFuZ3VhZ2VzIGluIFVURi04Ci12YXIgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKLSAgCi1mdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpIHsKK2NvbnN0IHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7CisKK2Z1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxLCBtYXAyKSB7CiAgIGlmICh0eXBlb2YgbWFwMSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWFwMiAhPT0gJ2Z1bmN0aW9uJykgewogICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gJ29iamVjdCcpIHsKLSAgICAgICAgZXF1YWwobWFwMSwgbWFwMik7CisgICAgICAgIGFzc2VydC5lcXVhbChtYXAxLCBtYXAyKTsKICAgICB9IGVsc2UgewotICAgICAgZm9yICh2YXIga2V5IGluIG1hcDEpIHsKLSAgICAgICAgY2hlY2tSZWN1cnNpdmVseShtYXAxW2tleV0sIG1hcDJba2V5XSk7CisgICAgICBmb3IgKGxldCBrZXkgaW4gbWFwMSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMVtrZXldLCBtYXAyW2tleV0pOwogICAgICAgfQogICAgIH0KICAgfQogfQogCi1tb2R1bGUoIkJhc2UgVHlwZXMiKTsKK1FVbml0Lm1vZHVsZSgnQmFzZSBUeXBlcycpOwogCi0gIGFzeW5jVGVzdCgiVm9pZCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMSApOworICBRVW5pdC50ZXN0KCdWb2lkJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CiAgICAgY2xpZW50LnRlc3RWb2lkKGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwotICAKLSAgCi0gIGFzeW5jVGVzdCgiU3RyaW5nIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAzICk7Ci0gICAgUVVuaXQuc3RvcCgyKTsKLSAgICBjbGllbnQudGVzdFN0cmluZygnJywgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsICcnKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworCisKKyAgUVVuaXQudGVzdCgnU3RyaW5nJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0U3RyaW5nKCcnLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAnJyk7CisgICAgICAgZG9uZSgpOwogICAgIH0pOwotICAgIGNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCBzdHJpbmdUZXN0KTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHN0cmluZ1Rlc3QpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKIAotICAgIHZhciBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgIGNvbnN0IHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCiAgICAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCiAgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCiAgICAgICAgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKICAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOwotICAgIGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgc3BlY2lhbENoYXJhY3RlcnMpOwotICAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoc3BlY2lhbENoYXJhY3RlcnMsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHNwZWNpYWxDaGFyYWN0ZXJzKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwotICBhc3luY1Rlc3QoIkRvdWJsZSIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggNCApOwotICAgIFFVbml0LnN0b3AoMyk7Ci0gICAgY2xpZW50LnRlc3REb3VibGUoMCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIDApOwotICAgICAgIFFVbml0LnN0YXJ0KCk7CisgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYyg0KTsKKyAgICBjbGllbnQudGVzdERvdWJsZSgwLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7Ci0gICAgY2xpZW50LnRlc3REb3VibGUoLTEsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCAtMSk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdERvdWJsZSgtMSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgLTEpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKLSAgICBjbGllbnQudGVzdERvdWJsZSgzLjE0LCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgMy4xNCk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdERvdWJsZSgzLjE0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAzLjE0KTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7Ci0gICAgY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiw2MCksIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDYwKSk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLCA2MCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDYwKSk7CisgICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKLSAgLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKSAKLSAgYXN5bmNUZXN0KCJCeXRlIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyICk7Ci0gICAgUVVuaXQuc3RvcCgpOworICAvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpCisgIFFVbml0LnRlc3QoJ0J5dGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CiAgICAgY2xpZW50LnRlc3RCeXRlKDAsIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgIGVxdWFsKHJlc3VsdCwgMCk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7CiAgICAgY2xpZW50LnRlc3RCeXRlKDB4MDEsIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgIGVxdWFsKHJlc3VsdCwgMHgwMSk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAweDAxKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwotICBhc3luY1Rlc3QoIkkzMiIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMyApOwotICAgIFFVbml0LnN0b3AoMik7Ci0gICAgY2xpZW50LnRlc3RJMzIoMCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIDApOwotICAgICAgIFFVbml0LnN0YXJ0KCk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdEkzMigwLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7Ci0gICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwzMCksIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDMwKSk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDMwKSk7CisgICAgICAgZG9uZSgpOwogICAgIH0pOwotICAgIGNsaWVudC50ZXN0STMyKC1NYXRoLnBvdygyLDMwKSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLDMwKSk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwotICBhc3luY1Rlc3QoIkk2NCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMyApOwotICAgIFFVbml0LnN0b3AoMik7Ci0gICAgY2xpZW50LnRlc3RJNjQoMCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIDApOwotICAgICAgIFFVbml0LnN0YXJ0KCk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdEk2NCgwLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7CiAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsNTIpLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiw1MikpOwotICAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA1MikpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKLSAgICBjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiw1MikpOwotICAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY2xpZW50LnRlc3RJNjQoLU1hdGgucG93KDIsIDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgLU1hdGgucG93KDIsIDUyKSk7CisgICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKLSAgCiAKLSAgCiAKLW1vZHVsZSgiU3RydWN0dXJlZCBUeXBlcyIpOwogCi0gIGFzeW5jVGVzdCgiU3RydWN0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCA1ICk7Ci0gICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworCitRVW5pdC5tb2R1bGUoJ1N0cnVjdHVyZWQgVHlwZXMnKTsKKworICBRVW5pdC50ZXN0KCdTdHJ1Y3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDUpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKICAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CiAgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOwotICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLDMwKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOwogICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiw1Mik7CisgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKIAotICAgIGNsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgIGVxdWFsKHJlc3VsdC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOwotICAgICAgZXF1YWwocmVzdWx0LmJ5dGVfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKLSAgICAgIGVxdWFsKHJlc3VsdC5pMzJfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcpOwotICAgICAgZXF1YWwocmVzdWx0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7Ci0gICAgICBlcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7ICAgICAgCisgICAgY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pMzJfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICBhc3luY1Rlc3QoIk5lc3QiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDcgKTsKLSAgICB2YXIgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgIFFVbml0LnRlc3QoJ05lc3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDcpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCB4dHJUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKICAgICB4dHJUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CiAgICAgeHRyVGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOwotICAgIHh0clRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLDMwKTsKKyAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOwogICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiw1Mik7Ci0gICAgCi0gICAgdmFyIG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CisgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNvbnN0IG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CiAgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKICAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKLSAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMTUpOwotICAgIAotICAgIGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgZXF1YWwocmVzdWx0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7Ci0gICAgICBlcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKLSAgICAgIGVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7Ci0gICAgICBlcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKLSAgICAgIGVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcpOwotICAgICAgZXF1YWwocmVzdWx0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOyAgCi0gICAgICBlcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOyAgICAgIAorICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMTUpOworCisgICAgY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgYXN5bmNUZXN0KCJNYXAiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDMgKTsKLSAgICB2YXIgbWFwVGVzdElucHV0ID0gezc6NzcsIDg6ODgsIDk6OTl9OworICBRVW5pdC50ZXN0KCdNYXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBtYXBUZXN0SW5wdXQgPSB7NzogNzcsIDg6IDg4LCA5OiA5OX07CiAKLSAgICBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBmb3IgKHZhciBrZXkgaW4gcmVzdWx0KSB7Ci0gICAgICAgIGVxdWFsKHJlc3VsdFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAobGV0IGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CiAgICAgICB9Ci0gICAgICBRVW5pdC5zdGFydCgpOyAgCisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCi0gIGFzeW5jVGVzdCgiU3RyaW5nTWFwIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCA2ICk7Ci0gICAgdmFyIG1hcFRlc3RJbnB1dCA9IHsKLSAgICAgICJhIjoiMTIzIiwgImEgYiI6IndpdGggc3BhY2VzICIsICJzYW1lIjoic2FtZSIsICIwIjoibnVtZXJpYyBrZXkiLAotICAgICAgImxvbmdWYWx1ZSI6c3RyaW5nVGVzdCwgc3RyaW5nVGVzdDoibG9uZyBrZXkiCisgIFFVbml0LnRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICdhJzogJzEyMycsICdhIGInOiAnd2l0aCBzcGFjZXMgJywgJ3NhbWUnOiAnc2FtZScsICcwJzogJ251bWVyaWMga2V5JywKKyAgICAgICdsb25nVmFsdWUnOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAnbG9uZyBrZXknCiAgICAgfTsKIAotICAgIGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQpIHsKLSAgICAgICAgZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICBjbGllbnQudGVzdFN0cmluZ01hcChtYXBUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yIChsZXQga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKICAgICAgIH0KLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCi0gIGFzeW5jVGVzdCgiU2V0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxICk7Ci0gICAgdmFyIHNldFRlc3RJbnB1dCA9IFsxLDIsM107Ci0gICAgY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgb2socmVzdWx0LCBzZXRUZXN0SW5wdXQpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnU2V0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3Qgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2socmVzdWx0LCBzZXRUZXN0SW5wdXQpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICBhc3luY1Rlc3QoIkxpc3QiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDEgKTsKLSAgICB2YXIgbGlzdFRlc3RJbnB1dCA9IFsxLDIsM107Ci0gICAgY2xpZW50LnRlc3RMaXN0KGxpc3RUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBvayhyZXN1bHQsIGxpc3RUZXN0SW5wdXQpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnTGlzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IGxpc3RUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgY2xpZW50LnRlc3RMaXN0KGxpc3RUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0Lm9rKHJlc3VsdCwgbGlzdFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCi0gIGFzeW5jVGVzdCgiRW51bSIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMSApOwotICAgIGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgZXF1YWwocmVzdWx0LCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgIFFVbml0LnRlc3QoJ0VudW0nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgYXN5bmNUZXN0KCJUeXBlRGVmIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxICk7Ci0gICAgY2xpZW50LnRlc3RUeXBlZGVmKDY5LCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgZXF1YWwocmVzdWx0LCA2OSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICBRVW5pdC50ZXN0KCdUeXBlRGVmJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RUeXBlZGVmKDY5LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDY5KTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKIAotbW9kdWxlKCJkZWVwZXIhIik7CitRVW5pdC5tb2R1bGUoJ2RlZXBlciEnKTsKIAotICBhc3luY1Rlc3QoIk1hcE1hcCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMTYgKTsKLSAgICB2YXIgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0ID0gewotICAgICAgIjQiOnsiMSI6MSwiMiI6MiwiMyI6MywiNCI6NH0sCi0gICAgICAiLTQiOnsiLTQiOi00LCAiLTMiOi0zLCAiLTIiOi0yLCAiLTEiOi0xfQorICBRVW5pdC50ZXN0KCdNYXBNYXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDE2KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0ID0geworICAgICAgJzQnOiB7JzEnOiAxLCAnMic6IDIsICczJzogMywgJzQnOiA0fSwKKyAgICAgICctNCc6IHsnLTQnOiAtNCwgJy0zJzogLTMsICctMic6IC0yLCAnLTEnOiAtMX0KICAgICB9OwogCi0gICAgY2xpZW50LnRlc3RNYXBNYXAoMSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQpIHsKLSAgICAgICAgZm9yICh2YXIga2V5MiBpbiByZXN1bHRba2V5XSkgewotICAgICAgICAgIGVxdWFsKHJlc3VsdFtrZXldW2tleTJdLCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHRba2V5XVtrZXkyXSk7CisgICAgY2xpZW50LnRlc3RNYXBNYXAoMSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKGxldCBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGZvciAobGV0IGtleTIgaW4gcmVzdWx0W2tleV0pIHsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgY2hlY2tSZWN1cnNpdmVseShyZXN1bHQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIHJlc3VsdCwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0KTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKIAotbW9kdWxlKCJFeGNlcHRpb24iKTsKK1FVbml0Lm1vZHVsZSgnRXhjZXB0aW9uJyk7CiAKLSAgYXN5bmNUZXN0KCJYY2VwdGlvbiIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCgyKTsKLSAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iLCBmdW5jdGlvbihlKXsKLSAgICAgIGVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKLSAgICAgIGVxdWFsKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICBRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicsIGZ1bmN0aW9uKGUpIHsKKyAgICAgIGFzc2VydC5lcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgYXN5bmNUZXN0KCJubyBFeGNlcHRpb24iLCAwLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDEgKTsKLSAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIiwgZnVuY3Rpb24oZSl7Ci0gICAgICBvayghZSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICBRVW5pdC50ZXN0KCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oZSkgeworICAgICAgYXNzZXJ0Lm9rKCFlKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLW1vZHVsZSgiSW5zYW5pdHkiKTsKK1FVbml0Lm1vZHVsZSgnSW5zYW5pdHknKTsKIAotICBhc3luY1Rlc3QoInRlc3RJbnNhbml0eSIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMjQgKTsKLSAgICB2YXIgaW5zYW5pdHkgPSB7Ci0gICAgICAiMSI6ewotICAgICAgICAiMiI6ewotICAgICAgICAgICJ1c2VyTWFwIjp7ICI1Ijo1LCAiOCI6OCB9LAotICAgICAgICAgICJ4dHJ1Y3RzIjpbewotICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIjoiR29vZGJ5ZTQiLAotICAgICAgICAgICAgICAiYnl0ZV90aGluZyI6NCwKLSAgICAgICAgICAgICAgImkzMl90aGluZyI6NCwKLSAgICAgICAgICAgICAgImk2NF90aGluZyI6NAorICBRVW5pdC50ZXN0KCd0ZXN0SW5zYW5pdHknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDI0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgaW5zYW5pdHkgPSB7CisgICAgICAnMSc6IHsKKyAgICAgICAgJzInOiB7CisgICAgICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgICAgICAgJ3h0cnVjdHMnOiBbeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDQKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciOiJIZWxsbzIiLAotICAgICAgICAgICAgICAiYnl0ZV90aGluZyI6MiwKLSAgICAgICAgICAgICAgImkzMl90aGluZyI6MiwKLSAgICAgICAgICAgICAgImk2NF90aGluZyI6MgorICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiAyCiAgICAgICAgICAgICB9CiAgICAgICAgICAgXQogICAgICAgICB9LAotICAgICAgICAiMyI6ewotICAgICAgICAgICJ1c2VyTWFwIjp7ICI1Ijo1LCAiOCI6OCB9LAotICAgICAgICAgICJ4dHJ1Y3RzIjpbewotICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIjoiR29vZGJ5ZTQiLAotICAgICAgICAgICAgICAiYnl0ZV90aGluZyI6NCwKLSAgICAgICAgICAgICAgImkzMl90aGluZyI6NCwKLSAgICAgICAgICAgICAgImk2NF90aGluZyI6NAorICAgICAgICAnMyc6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjoyCisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDIKICAgICAgICAgICAgIH0KICAgICAgICAgICBdCiAgICAgICAgIH0KICAgICAgIH0sCi0gICAgICAiMiI6eyAiNiI6eyAidXNlck1hcCI6bnVsbCwgInh0cnVjdHMiOm51bGwgfSB9CisgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQogICAgIH07Ci0gICAgY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eSgpLCBmdW5jdGlvbihyZXMpewotICAgICAgb2socmVzLCBKU09OLnN0cmluZ2lmeShyZXMpKTsKLSAgICAgIG9rKGluc2FuaXR5LCBKU09OLnN0cmluZ2lmeShpbnNhbml0eSkpOwotICAgICAgY2hlY2tSZWN1cnNpdmVseShyZXMsIGluc2FuaXR5KTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eSgpLCBmdW5jdGlvbihyZXMpIHsKKyAgICAgIGFzc2VydC5vayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOworICAgICAgYXNzZXJ0Lm9rKGluc2FuaXR5LCBKU09OLnN0cmluZ2lmeShpbnNhbml0eSkpOworICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIHJlcywgaW5zYW5pdHkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAorUVVuaXQubW9kdWxlKCdPbmV3YXknKTsKIAorICBRVW5pdC50ZXN0KCd0ZXN0T25ld2F5JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RPbmV3YXkoMSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtZGVlcC1jb25zdHJ1Y3Rvci5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwKaW5kZXggNTgzNWRjOC4uNDYyNDgxYSAxMDA3NTUKLS0tIGEvbGliL2pzL3Rlc3QvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwKQEAgLTIyLDIwICsyMiwyMSBAQAogICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KICAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3Q8L3RpdGxlPgogCisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy9saWIvSlNPTkludDY0LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KICAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9Kc0RlZXBDb25zdHJ1Y3RvclRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogICA8IS0tIGpRdWVyeSAtLT4KLSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMS43LjIuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL2pxdWVyeS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogCiAgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KLSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0xLjE0LjAuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTEuMTQuMC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgorCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+CiAKICAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJkZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KIDwvaGVhZD4KIDxib2R5PgotICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IERlZXAgQ29uc3RydWN0b3IgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdDthPWJsb2I7Zj10ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQ7aGI9SEVBRCI+SnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdDwvYT4pPC9oMT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBEZWVwIENvbnN0cnVjdG9yIFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdCI+SnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdDwvYT4pPC9oMT4KICAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CiAgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CiAgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQzMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmh0bWwKQEAgLTAsMCArMSw1NSBAQAorKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgICAgIDx0aXRsZT5SZW5kZXJpbmcgRG91YmxlIENvbnN0YW50cyBpbiBKUzogVW5pdCBUZXN0PC90aXRsZT4KKworICAgICAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgICAgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgICAgPCEtLSBkb3VibGUgY29uc3RhbnRzIHRvIGNoZWNrIC0tPgorICAgICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9Eb3VibGVDb25zdGFudHNUZXN0X3R5cGVzLmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgICAgICA8IS0tIGpRdWVyeSAtLT4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9qcXVlcnkuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICAgICAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgorCisgICAgICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LWRvdWJsZS1yZW5kZXJpbmcuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgICA8L2hlYWQ+Cis8Ym9keT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlJlbmRlcmluZyBEb3VibGUgQ29uc3RhbnRzIGluIEpTOiBVbml0IFRlc3Q8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorICAtLT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5qcyBiL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzkwYzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmpzCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLyoganNoaW50IC1XMTAwICovCisKKy8qCisgKiBKYXZhU2NyaXB0IHRlc3Qgc3VpdGUgZm9yIGRvdWJsZSBjb25zdGFudHMgaW5zaWRlCisgKiBEb3VibGVDb25zdGFudHNUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMgd2lsbCBydW4gYWdhaW5zdCBOb3JtYWwgKC1nZW4ganMpCisgKiBBcGFjaGUgVGhyaWZ0IGludGVyZmFjZXMuCisgKgorICogVG8gY29tcGlsZSBjbGllbnQgY29kZSBmb3IgdGhpcyB0ZXN0IHVzZToKKyAqICAgICAgJCB0aHJpZnQgLWdlbiBqcyBEb3VibGVDb25zdGFudHNUZXN0LnRocmlmdAorICovCisKKy8vIGRvdWJsZSBhc3NlcnRpb24gdGhyZXNob2xkCitjb25zdCBFUFNJTE9OID0gMC4wMDAwMDAxOworCisvLyBXb3JrIGFyb3VuZCBmb3Igb2xkIEFQSSB1c2VkIGJ5IFFVbml0QWRhcHRlciBvZiBqc1Rlc3REcml2ZXIKK2lmICh0eXBlb2YgUVVuaXQubG9nID09ICdmdW5jdGlvbicpIHsKKyAgLy8gV2hlbiB1c2luZyByZWFsIFFVbml0IChmcm9uIFBoYW50b21KUykgbG9nIGZhaWx1cmVzIHRvIGNvbnNvbGUKKyAgUVVuaXQubG9nKGZ1bmN0aW9uKGRldGFpbHMpIHsKKyAgICBpZiAoIWRldGFpbHMucmVzdWx0KSB7CisgICAgICBjb25zb2xlLmxvZygnPT09PT09PT0gRkFJTCA9PT09PT09PScpOworICAgICAgY29uc29sZS5sb2coJ1Rlc3ROYW1lOiAnICsgZGV0YWlscy5uYW1lKTsKKyAgICAgIGlmIChkZXRhaWxzLm1lc3NhZ2UpIGNvbnNvbGUubG9nKGRldGFpbHMubWVzc2FnZSk7CisgICAgICBjb25zb2xlLmxvZygnRXhwZWN0ZWQ6ICcgKyBkZXRhaWxzLmV4cGVjdGVkKTsKKyAgICAgIGNvbnNvbGUubG9nKCdBY3R1YWwgIDogJyArIGRldGFpbHMuYWN0dWFsKTsKKyAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09Jyk7CisgICAgfQorICB9KTsKK30KKworUVVuaXQubW9kdWxlKCdEb3VibGUgcmVuZGVyaW5nJyk7CisKKyAgUVVuaXQudGVzdCgnRG91YmxlIChyZW5kZXJpbmcpJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc29sZS5sb2coJ0RvdWJsZSByZW5kZXJpbmcgdGVzdCAtLSBzdGFydHMnKTsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UID0gMTsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UID0gLTEwMDsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3OworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNzsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUyA9IDMuMTQxNTkyNjUzNTk7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSA9IC0xMDAwMDAwLjE7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSA9IDEuN2UrMzA4OworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSA9IC0xLjdlKzMwODsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicyhFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UIC0gRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfTElTVCA9CisgICAgICAgIFsxLC0xMDAsMTAwLDkyMjMzNzIwMzY4NTQ3NzU4MDcsLTkyMjMzNzIwMzY4NTQ3NzU4MDcsMy4xNDE1OTI2NTM1OSwxMDAwMDAwLjEsLTEwMDAwMDAuMSwxLjdlKzMwOCwtMS43ZSszMDgsCisgICAgICAgICAgICA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzXTsKKyAgICBhc3NlcnQuZXF1YWwoRE9VQkxFX0xJU1RfVEVTVC5sZW5ndGgsIEVYUEVDVEVEX0RPVUJMRV9MSVNULmxlbmd0aCk7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9ET1VCTEVfTElTVC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICBhc3NlcnQub2soTWF0aC5hYnMoRVhQRUNURURfRE9VQkxFX0xJU1RbaV0gLSBET1VCTEVfTElTVF9URVNUW2ldKSA8PSBFUFNJTE9OKTsKKyAgICB9CisgICAgY29uc29sZS5sb2coJ0RvdWJsZSByZW5kZXJpbmcgdGVzdCAtLSBlbmRzJyk7CisgIH0pOworCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWVzNi5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdC1lczYuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI4ZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1lczYuaHRtbApAQCAtMCwwICsxLDY1IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3Q8L3RpdGxlPgorCisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy9saWIvSW50NjQuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvbGliL0ludDY0VXRpbC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy9saWIvSlNPTkludDY0LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy1lczYvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+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+PD48JzsKKyAgICBjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycykudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBzcGVjaWFsQ2hhcmFjdGVycyk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdEb3VibGUnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoNCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYyg0KTsKKyAgICBjbGllbnQudGVzdERvdWJsZSgwKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdERvdWJsZSgtMSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtMSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMy4xNCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKE1hdGgucG93KDIsIDYwKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA2MCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkKKyAgUVVuaXQudGVzdCgnQnl0ZScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworICAgIGNsaWVudC50ZXN0Qnl0ZSgwKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEJ5dGUoMHgwMSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAweDAxKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdEkzMigwKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCkpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsIDMwKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdJNjQnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdEk2NCgwKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiwgNTIpKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDUyKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLCA1MikpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgLU1hdGgucG93KDIsIDUyKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ1N0cnVjdHVyZWQgVHlwZXMnKTsKKworICBRVW5pdC50ZXN0KCdTdHJ1Y3QnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoNSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmJ5dGVfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTmVzdCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg3KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIHZhciBuZXN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpOworICAgIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDI7CisgICAgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcgPSB4dHJUZXN0SW5wdXQ7CisgICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAxNSk7CisKKyAgICBjbGllbnQudGVzdE5lc3QobmVzdFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKKworICAgIGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgICB9CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg2KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICdhJzogJzEyMycsICdhIGInOiAnd2l0aCBzcGFjZXMgJywgJ3NhbWUnOiAnc2FtZScsICcwJzogJ251bWVyaWMga2V5JywKKyAgICAgICdsb25nVmFsdWUnOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAnbG9uZyBrZXknCisgICAgfTsKKworICAgIGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgICB9CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1NldCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIHNldFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2socmVzdWx0LCBzZXRUZXN0SW5wdXQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdMaXN0JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhyZXN1bHQsIGxpc3RUZXN0SW5wdXQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdFbnVtJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdUeXBlRGVmJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdFR5cGVkZWYoNjkpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCA2OSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnZGVlcGVyIScpOworCisgIFFVbml0LnRlc3QoJ01hcE1hcCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxNik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7CisgICAgICAnNCc6IHsnMSc6IDEsICcyJzogMiwgJzMnOiAzLCAnNCc6IDR9LAorICAgICAgJy00JzogeyctNCc6IC00LCAnLTMnOiAtMywgJy0yJzogLTIsICctMSc6IC0xfQorICAgIH07CisKKyAgICBjbGllbnQudGVzdE1hcE1hcCgxKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgeworICAgICAgICBmb3IgKHZhciBrZXkyIGluIHJlc3VsdFtrZXldKSB7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldW2tleTJdLCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHRba2V5XVtrZXkyXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXN1bHQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnRXhjZXB0aW9uJyk7CisKKyAgUVVuaXQudGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpLnRoZW4oZnVuY3Rpb24ocmVzKSB7CisgICAgICBhc3NlcnQub2soZmFsc2UpOworICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGUpIHsKKworICAgICAgY29uc29sZS5sb2coYEV4Y2VwdGlvbiBleGNlcHRpb24gZWApOworICAgICAgY29uc29sZS5sb2coZSk7CisgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShlLCBudWxsLCAyKSk7CisKKyAgICAgIGFzc2VydC5lcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJykudGhlbihmdW5jdGlvbihlKSB7CisgICAgICBhc3NlcnQub2soIWUpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworUVVuaXQubW9kdWxlKCdJbnNhbml0eScpOworCisgIFFVbml0LnRlc3QoJ3Rlc3RJbnNhbml0eScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyNCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBpbnNhbml0eSA9IHsKKyAgICAgICcxJzogeworICAgICAgICAnMic6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgICAgICAgfQorICAgICAgICAgIF0KKyAgICAgICAgfSwKKyAgICAgICAgJzMnOiB7CisgICAgICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgICAgICAgJ3h0cnVjdHMnOiBbeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDQKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBdCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQorICAgIH07CisgICAgY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eSgpKS50aGVuKGZ1bmN0aW9uKHJlcykgeworICAgICAgYXNzZXJ0Lm9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7CisgICAgICBhc3NlcnQub2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzLCBpbnNhbml0eSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCitRVW5pdC5tb2R1bGUoJ09uZXdheScpOworICBRVW5pdC50ZXN0KCd0ZXN0T25ld2F5JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdE9uZXdheSgxKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgdW5kZWZpbmVkKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWludDY0Lmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LWludDY0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiMDVmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtaW50NjQuaHRtbApAQCAtMCwwICsxLDU2IEBACisrPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgICAgPHRpdGxlPkludDY0IENvbnN0YW50cyBpbiBKUzogVW5pdCBUZXN0PC90aXRsZT4KKworICAgICAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgICA8IS0tIGJyb3dzZXJpZmllZCBub2RlLWludDY0IC0tPgorICAgICAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL2xpYi9JbnQ2NC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvbGliL0pTT05JbnQ2NC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgICA8IS0tIGludDY0IGNvbnN0YW50cyB0byBjaGVjayAtLT4KKyAgICAgIDxzY3JpcHQgc3JjPSJnZW4tanMvSW50NjRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICAgICAgPCEtLSBqUXVlcnkgLS0+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgICAgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKworICAgICAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1pbnQ2NC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgIDwvaGVhZD4KKzxib2R5PgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+SW50NjQgQ29uc3RhbnRzIGluIEpTOiBVbml0IFRlc3Q8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorICAtLT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtaW50NjQuanMgYi9saWIvanMvdGVzdC90ZXN0LWludDY0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmN2U4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LWludDY0LmpzCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAvKiBqc2hpbnQgLVcxMDAgKi8KKworLy8gV29yayBhcm91bmQgZm9yIG9sZCBBUEkgdXNlZCBieSBRVW5pdEFkYXB0ZXIgb2YganNUZXN0RHJpdmVyCitpZiAodHlwZW9mIFFVbml0LmxvZyA9PSAnZnVuY3Rpb24nKSB7CisgIC8vIFdoZW4gdXNpbmcgcmVhbCBRVW5pdCAoZnJvbiBQaGFudG9tSlMpIGxvZyBmYWlsdXJlcyB0byBjb25zb2xlCisgIFFVbml0LmxvZyhmdW5jdGlvbihkZXRhaWxzKSB7CisgICAgaWYgKCFkZXRhaWxzLnJlc3VsdCkgeworICAgICAgY29uc29sZS5sb2coJz09PT09PT09IEZBSUwgPT09PT09PT0nKTsKKyAgICAgIGNvbnNvbGUubG9nKCdUZXN0TmFtZTogJyArIGRldGFpbHMubmFtZSk7CisgICAgICBpZiAoZGV0YWlscy5tZXNzYWdlKSBjb25zb2xlLmxvZyhkZXRhaWxzLm1lc3NhZ2UpOworICAgICAgY29uc29sZS5sb2coJ0V4cGVjdGVkOiAnICsgZGV0YWlscy5leHBlY3RlZCk7CisgICAgICBjb25zb2xlLmxvZygnQWN0dWFsICA6ICcgKyBkZXRhaWxzLmFjdHVhbCk7CisgICAgICBjb25zb2xlLmxvZygnPT09PT09PT09PT09PT09PT09PT09PScpOworICAgIH0KKyAgfSk7Cit9CisKK1FVbml0Lm1vZHVsZSgnSW50NjQnKTsKKworICBRVW5pdC50ZXN0KCdJbnQ2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnNvbGUubG9nKCdJbnQ2NCB0ZXN0IC0tIHN0YXJ0cycpOworICAgIGNvbnN0IEVYUEVDVEVEX1NNQUxMX0lOVDY0X0FTX05VTUJFUiA9IDQyOworICAgIGNvbnN0IEVYUEVDVEVEX1NNQUxMX0lOVDY0ID0gbmV3IEludDY0KDQyKTsKKyAgICBjb25zdCBFWFBFQ1RFRF9NQVhfSlNfU0FGRV9JTlQ2NCA9IG5ldyBJbnQ2NChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7CisgICAgY29uc3QgRVhQRUNURURfTUlOX0pTX1NBRkVfSU5UNjQgPSBuZXcgSW50NjQoTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIpOworICAgIGNvbnN0IEVYUEVDVEVEX01BWF9KU19TQUZFX1BMVVNfT05FX0lOVDY0ID0gbmV3IEludDY0KCIwMDIwMDAwMDAwMDAwMDAwIik7IC8vIGhleC1lbmNvZGVkCisgICAgY29uc3QgRVhQRUNURURfTUlOX0pTX1NBRkVfTUlOVVNfT05FX0lOVDY0ID0gbmV3IEludDY0KCJmZmUwMDAwMDAwMDAwMDAwIik7IC8vIGhleC1lbmNvZGVkIDIncyBjb21wbGVtZW50CisgICAgY29uc3QgRVhQRUNURURfTUFYX1NJR05FRF9JTlQ2NCA9IG5ldyBJbnQ2NCgiN2ZmZmZmZmZmZmZmZmZmZiIpOyAvLyBoZXgtZW5jb2RlZAorICAgIGNvbnN0IEVYUEVDVEVEX01JTl9TSUdORURfSU5UNjQgPSBuZXcgSW50NjQoIjgwMDAwMDAwMDAwMDAwMDAiKTsgLy8gaGV4LWVuY29kZWQgMidzIGNvbXBsZW1lbnQKKyAgICBjb25zdCBFWFBFQ1RFRF9JTlQ2NF9MSVNUID0gWworICAgICAgRVhQRUNURURfU01BTExfSU5UNjQsCisgICAgICBFWFBFQ1RFRF9NQVhfSlNfU0FGRV9JTlQ2NCwKKyAgICAgIEVYUEVDVEVEX01JTl9KU19TQUZFX0lOVDY0LAorICAgICAgRVhQRUNURURfTUFYX0pTX1NBRkVfUExVU19PTkVfSU5UNjQsCisgICAgICBFWFBFQ1RFRF9NSU5fSlNfU0FGRV9NSU5VU19PTkVfSU5UNjQsCisgICAgICBFWFBFQ1RFRF9NQVhfU0lHTkVEX0lOVDY0LAorICAgICAgRVhQRUNURURfTUlOX1NJR05FRF9JTlQ2NAorICAgIF07CisKKyAgICBhc3NlcnQub2soRVhQRUNURURfU01BTExfSU5UNjQuZXF1YWxzKEludDY0VGVzdC5TTUFMTF9JTlQ2NCkpOworICAgIGFzc2VydC5vayhFWFBFQ1RFRF9NQVhfSlNfU0FGRV9JTlQ2NC5lcXVhbHMoSW50NjRUZXN0Lk1BWF9KU19TQUZFX0lOVDY0KSk7CisgICAgYXNzZXJ0Lm9rKEVYUEVDVEVEX01JTl9KU19TQUZFX0lOVDY0LmVxdWFscyhJbnQ2NFRlc3QuTUlOX0pTX1NBRkVfSU5UNjQpKTsKKyAgICBhc3NlcnQub2soCisgICAgICBFWFBFQ1RFRF9NQVhfSlNfU0FGRV9QTFVTX09ORV9JTlQ2NC5lcXVhbHMoCisgICAgICAgIEludDY0VGVzdC5NQVhfSlNfU0FGRV9QTFVTX09ORV9JTlQ2NAorICAgICAgKQorICAgICk7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgRVhQRUNURURfTUlOX0pTX1NBRkVfTUlOVVNfT05FX0lOVDY0LmVxdWFscygKKyAgICAgICAgSW50NjRUZXN0Lk1JTl9KU19TQUZFX01JTlVTX09ORV9JTlQ2NAorICAgICAgKQorICAgICk7CisgICAgYXNzZXJ0Lm9rKEVYUEVDVEVEX01BWF9TSUdORURfSU5UNjQuZXF1YWxzKEludDY0VGVzdC5NQVhfU0lHTkVEX0lOVDY0KSk7CisgICAgYXNzZXJ0Lm9rKEVYUEVDVEVEX01JTl9TSUdORURfSU5UNjQuZXF1YWxzKEludDY0VGVzdC5NSU5fU0lHTkVEX0lOVDY0KSk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgRVhQRUNURURfU01BTExfSU5UNjRfQVNfTlVNQkVSLAorICAgICAgSW50NjRUZXN0LlNNQUxMX0lOVDY0LnRvTnVtYmVyKCkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLAorICAgICAgSW50NjRUZXN0Lk1BWF9KU19TQUZFX0lOVDY0LnRvTnVtYmVyKCkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLAorICAgICAgSW50NjRUZXN0Lk1JTl9KU19TQUZFX0lOVDY0LnRvTnVtYmVyKCkKKyAgICApOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9JTlQ2NF9MSVNULmxlbmd0aDsgKytpKSB7CisgICAgICBhc3NlcnQub2soRVhQRUNURURfSU5UNjRfTElTVFtpXS5lcXVhbHMoSW50NjRUZXN0LklOVDY0X0xJU1RbaV0pKTsKKyAgICB9CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IEVYUEVDVEVEX0lOVDY0X0xJU1QubGVuZ3RoOyArK2kpeworICAgICAgbGV0IGludDY0T2JqZWN0ID0gRVhQRUNURURfSU5UNjRfTElTVFtpXTsKKyAgICAgIGFzc2VydC5vayhJbnQ2NFRlc3QuSU5UNjRfMl9JTlQ2NF9NQVBbSlNPTkludDY0LnRvRGVjaW1hbFN0cmluZyhpbnQ2NE9iamVjdCldLmVxdWFscyhpbnQ2NE9iamVjdCkpOworICAgIH0KKworICAgIGNvbnNvbGUubG9nKCdJbnQ2NCB0ZXN0IC0tIGVuZHMnKTsKKyAgfSk7CisKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtanEuanMgYi9saWIvanMvdGVzdC90ZXN0LWpxLmpzCmluZGV4IDIzZWQ2MGYuLmY2MmJiOTUgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3QtanEuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1qcS5qcwpAQCAtMzMsMTI2ICszMywxMjcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8valF1ZXJ5IGFzeW5jaHJvbm91cyB0ZXN0cwogalF1ZXJ5LmFqYXhTZXR1cCh7IHRpbWVvdXQ6IDAgfSk7Ci0kKGRvY3VtZW50KS5hamF4RXJyb3IoIGZ1bmN0aW9uKCkgeyBRVW5pdC5zdGFydCgpOyB9ICk7CiAKLW1vZHVsZSgialEgQXN5bmMgTWFudWFsIik7CitRVW5pdC5tb2R1bGUoJ2pRIEFzeW5jIE1hbnVhbCcpOwogCi0gIHRlc3QoInRlc3RJMzIiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKLSAgICBRVW5pdC5zdG9wKCk7CisgIFFVbml0LnRlc3QoJ3Rlc3RJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CiAKLSAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKTsKLSAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOwotICAgIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKyAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgpOworICAgIGNvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIGNvbnN0IGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOwogCi0gICAgdmFyIGpxeGhyID0galF1ZXJ5LmFqYXgoewotICAgICAgdXJsOiAiL3NlcnZpY2UiLAotICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEkzMihNYXRoLnBvdygtMiwzMSkpLAotICAgICAgdHlwZTogIlBPU1QiLAorICAgIGNvbnN0IGpxeGhyID0galF1ZXJ5LmFqYXgoeworICAgICAgdXJsOiAnL3NlcnZpY2UnLAorICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEkzMihNYXRoLnBvdygtMiwgMzEpKSwKKyAgICAgIHR5cGU6ICdQT1NUJywKICAgICAgIGNhY2hlOiBmYWxzZSwKLSAgICAgIGRhdGFUeXBlOiAidGV4dCIsCi0gICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpewotICAgICAgICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlciggcmVzICk7Ci0gICAgICAgIGVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJMzIoKSwgTWF0aC5wb3coLTIsMzEpKTsKKyAgICAgIGRhdGFUeXBlOiAndGV4dCcsCisgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHsKKyAgICAgICAgdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIocmVzKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJMzIoKSwgTWF0aC5wb3coLTIsIDMxKSk7CisgICAgICAgIGRvbmUoKTsKICAgICAgIH0sCi0gICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IG9rKGZhbHNlKTsgfSwKKyAgICAgIGVycm9yOiBmdW5jdGlvbigpIHsgYXNzZXJ0Lm9rKGZhbHNlKTsgfSwKICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgb2sodHJ1ZSk7Ci0gICAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICAgICAgZG9uZSgpOwogICAgICAgfQogICAgIH0pOwogICB9KTsKIAotICB0ZXN0KCJ0ZXN0STY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyICk7Ci0gICAgUVVuaXQuc3RvcCgpOworICBRVW5pdC50ZXN0KCd0ZXN0STY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOwogCi0gICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCk7Ci0gICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKLSAgICB2YXIgY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKTsKKyAgICBjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKIAogICAgIGpRdWVyeS5hamF4KHsKLSAgICAgIHVybDogIi9zZXJ2aWNlIiwKKyAgICAgIHVybDogJy9zZXJ2aWNlJywKICAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjEgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJNjQoTWF0aC5wb3coLTIsNTIpKSwKLSAgICAgIHR5cGU6ICJQT1NUIiwKKyAgICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJNjQoTWF0aC5wb3coLTIsIDUyKSksCisgICAgICB0eXBlOiAnUE9TVCcsCiAgICAgICBjYWNoZTogZmFsc2UsCi0gICAgICBkYXRhVHlwZTogInRleHQiLAotICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKXsKLSAgICAgICAgdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIoIHJlcyApOworICAgICAgZGF0YVR5cGU6ICd0ZXh0JywKKyAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykgeworICAgICAgICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlcihyZXMpOwogICAgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYxIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5Ci0gICAgICAgIGVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJNjQoKSwgTWF0aC5wb3coLTIsNTIpKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJNjQoKSwgTWF0aC5wb3coLTIsIDUyKSk7CisgICAgICAgIGRvbmUoKTsKICAgICAgIH0sCi0gICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IG9rKGZhbHNlKTsgfSwKKyAgICAgIGVycm9yOiBmdW5jdGlvbigpIHsgYXNzZXJ0Lm9rKGZhbHNlKTsgfSwKICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgb2sodHJ1ZSk7Ci0gICAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICAgICAgZG9uZSgpOwogICAgICAgfQogICAgIH0pOwogICB9KTsKIAogCi1tb2R1bGUoImpRIEFzeW5jIik7Ci0gIHRlc3QoIkkzMiIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMyApOworUVVuaXQubW9kdWxlKCdqUSBBc3luYycpOworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOwogCi0gICAgUVVuaXQuc3RvcCgpOwotICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwzMCkpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogCi0gICAgUVVuaXQuc3RvcCgpOwotICAgIHZhciBqcXhociA9IGNsaWVudC50ZXN0STMyKE1hdGgucG93KC0yLDMxKSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLDMxKSk7CisgICAgY29uc3QganF4aHIgPSBjbGllbnQudGVzdEkzMihNYXRoLnBvdygtMiwgMzEpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCAzMSkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogCiAgICAganF4aHIuc3VjY2VzcyhmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsMzEpKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwgMzEpKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgdGVzdCgiSTY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCA0ICk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNCk7CiAKLSAgICBRVW5pdC5zdG9wKCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYyg0KTsKICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5Ci0gICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDUyKSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA1MikpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogCi0gICAgUVVuaXQuc3RvcCgpOwogICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygtMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiw1MikpOworICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KC0yLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDUyKSk7CisgICAgICBkb25lKCk7CiAgICAgfSkKLSAgICAuZXJyb3IoIGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlKSB7ICBvayhmYWxzZSwgZS5tZXNzYWdlKTsgfSApCisgICAgLmVycm9yKGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlKSB7IGFzc2VydC5vayhmYWxzZSwgZS5tZXNzYWdlKTsgfSkKICAgICAuc3VjY2VzcyhmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsNTIpKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCA1MikpOworICAgICAgZG9uZSgpOwogICAgIH0pCiAgICAgLmNvbXBsZXRlKGZ1bmN0aW9uKCkgewotICAgICAgb2sodHJ1ZSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICB0ZXN0KCJYY2VwdGlvbiIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMiApOworICBRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CiAKLSAgICBRVW5pdC5zdG9wKCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKIAotICAgIHZhciBkZmQgPSBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIG9rKGZhbHNlKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY29uc3QgZGZkID0gY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2soZmFsc2UpOworICAgICAgZG9uZSgpOwogICAgIH0pCi0gICAgLmVycm9yKGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlKXsKLSAgICAgIGVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKLSAgICAgIGVxdWFsKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7Ci0gICAgICAvL1FVbml0LnN0YXJ0KCk7Ci0gICAgICAvL05vdGUgc3RhcnQgaXMgbm90IHJlcXVpcmVkIGhlcmUgYmVjYXVzZToKLSAgICAgIC8vJChkb2N1bWVudCkuYWpheEVycm9yKCBmdW5jdGlvbigpIHsgUVVuaXQuc3RhcnQoKTsgfSApOworICAgIC5lcnJvcihmdW5jdGlvbih4aHIsIHN0YXR1cywgZSkgeworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOworICAgICAgJChkb2N1bWVudCkuYWpheEVycm9yKCBmdW5jdGlvbigpIHsgZG9uZSgpOyB9ICk7CiAgICAgfSk7CiAgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbAppbmRleCA1NDFiZmZlLi4zN2IzZWI4IDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbAorKysgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbApAQCAtMjIsNiArMjIsOSBAQAogICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KICAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3Q8L3RpdGxlPgogCisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy9saWIvSW50NjQuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvbGliL0ludDY0VXRpbC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy9saWIvSlNPTkludDY0LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KICAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KQEAgLTI5LDE1ICszMiwxNSBAQAogICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+CiAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgotICAKKwogICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CiAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1ub2pxLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiA8L2hlYWQ+CiA8Ym9keT4KLSAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQ7YT1ibG9iO2Y9dGVzdC9UaHJpZnRUZXN0LnRocmlmdDtoYj1IRUFEIj5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgogICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KLSAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4gCisgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CiAgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgogICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPgogICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGNoZWNrIHRoZSB2YWxpZGl0eS4gVGhpcyBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24gdGhlIHRlc3QuCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LW5vanEuanMgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuanMKaW5kZXggMTlmOWU2MS4uMmI4MDFkMiAxMDA2NDQKLS0tIGEvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmpzCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5qcwpAQCAtMTcsNyArMTcsNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KICAvKiBqc2hpbnQgLVcxMDAgKi8KLSAKKwogLyoKICAqIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuIFRoZXNlIHRlc3RzCiAgKiB3aWxsIHJ1biBvbmx5IHdpdGggbm9ybWFsICItZ2VuIGpzIiBBcGFjaGUgVGhyaWZ0IGludGVyZmFjZXMuCkBAIC0yNSw3ICsyNSw3IEBACiAgKiAgICAgICQgdGhyaWZ0IC1nZW4ganMgVGhyaWZ0VGVzdC50aHJpZnQKICAqCiAgKiBTZWUgYWxzbzoKLSAqICsrIHRlc3QuanMgZm9yIGdlbmVyaWMgdGVzdHMgIAorICogKysgdGVzdC5qcyBmb3IgZ2VuZXJpYyB0ZXN0cwogICogKysgdGVzdC1qcS5qcyBmb3IgIi1nZW4ganM6anF1ZXJ5IiBvbmx5IHRlc3RzCiAgKi8KIApAQCAtMzMsMTcgKzMzLDE2IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvL0FzeW5jIGV4Y2VwdGlvbiB0ZXN0cwogCi1tb2R1bGUoIk5valEgQXN5bmMiKTsKK1FVbml0Lm1vZHVsZSgnTm9qUSBBc3luYycpOwogCi0gIHRlc3QoIlhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyICk7CitRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOwogCi0gICAgUVVuaXQuc3RvcCgpOwotCi0gICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIiwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQuZXJyb3JDb2RlLCAxMDAxKTsKLSAgICAgIGVxdWFsKHJlc3VsdC5tZXNzYWdlLCAiWGNlcHRpb24iKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmVycm9yQ29kZSwgMTAwMSk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0Lm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIApkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdC5odG1sCmluZGV4IGVkZWMzYTMuLjg1YzgzOTUgMTAwNzU1Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbAorKysgYi9saWIvanMvdGVzdC90ZXN0Lmh0bWwKQEAgLTIyLDkgKzIyLDEyIEBACiAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgogICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CiAKKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL2xpYi9JbnQ2NC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy9saWIvSW50NjRVdGlsLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL2xpYi9KU09OSW50NjQuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvdGhyaWZ0LmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgotICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgotICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzLWpxdWVyeS9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy1qcXVlcnkvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiAKICAgPCEtLSBqUXVlcnkgLS0+CiAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9qcXVlcnkuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KQEAgLTM0LDE2ICszNywxMSBAQAogICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgogCiAgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KLSAgPHNjcmlwdD4KLSAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoIi9zZXJ2aWNlIik7Ci0gICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKLSAgICB2YXIgY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7Ci0gIDwvc2NyaXB0PgogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QtanEuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KIDwvaGVhZD4KIDxib2R5PgotICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdDthPWJsb2I7Zj10ZXN0L1RocmlmdFRlc3QudGhyaWZ0O2hiPUhFQUQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CiAgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgogICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgogICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QuanMgYi9saWIvanMvdGVzdC90ZXN0LmpzCmluZGV4IGVlMTQ2MTIuLjM1ZWQ2ZmYgMTAwNzU1Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3QuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC5qcwpAQCAtMjMsNyArMjMsNyBAQAogICogd2lsbCBydW4gYWdhaW5zdCBOb3JtYWwgKC1nZW4ganMpIGFuZCBqUXVlcnkgKC1nZW4ganM6anF1ZXJ5KQogICogQXBhY2hlIFRocmlmdCBpbnRlcmZhY2VzLgogICoKLSAqIFN5bmNocm9ub3VzIGJsb2NraW5nIGNhbGxzIHNob3VsZCBiZSBpZGVudGljYWwgaW4gYm90aCAKKyAqIFN5bmNocm9ub3VzIGJsb2NraW5nIGNhbGxzIHNob3VsZCBiZSBpZGVudGljYWwgaW4gYm90aAogICogTm9ybWFsIGFuZCBqUXVlcnkgaW50ZXJmYWNlcy4gQWxsIHN5bmNocm9ub3VzIHRlc3RzIGJlbG9uZwogICogaGVyZS4KICAqCkBAIC00Nyw5ICs0NywxMiBAQAogICogKysgdGVzdC1qcS5qcyBmb3IgIi1nZW4ganM6anF1ZXJ5IiBvbmx5IHRlc3RzCiAgKi8KIAotdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCIvc2VydmljZSIpOwotdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKLXZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKK2NvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCcvc2VydmljZScpOworY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Citjb25zdCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworY29uc3QgaW50NjRfMl9wb3dfNjAgPSBuZXcgSW50NjQoJzEwMDAwMDAwMDAwMDAwMDAnKTsKK2NvbnN0IGludDY0X21pbnVzXzJfcG93XzYwID0gbmV3IEludDY0KCdmMDAwMDAwMDAwMDAwMDAwJyk7CiAKIC8vIFdvcmsgYXJvdW5kIGZvciBvbGQgQVBJIHVzZWQgYnkgUVVuaXRBZGFwdGVyIG9mIGpzVGVzdERyaXZlcgogaWYgKHR5cGVvZiBRVW5pdC5sb2cgPT0gJ2Z1bmN0aW9uJykgewpAQCAtNTgsNyArNjEsNyBAQAogICAgIGlmICghZGV0YWlscy5yZXN1bHQpIHsKICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PSBGQUlMID09PT09PT09Jyk7CiAgICAgICBjb25zb2xlLmxvZygnVGVzdE5hbWU6ICcgKyBkZXRhaWxzLm5hbWUpOwotICAgICAgZGV0YWlscy5tZXNzYWdlICYmIGNvbnNvbGUubG9nKGRldGFpbHMubWVzc2FnZSk7CisgICAgICBpZiAoZGV0YWlscy5tZXNzYWdlKSBjb25zb2xlLmxvZyhkZXRhaWxzLm1lc3NhZ2UpOwogICAgICAgY29uc29sZS5sb2coJ0V4cGVjdGVkOiAnICsgZGV0YWlscy5leHBlY3RlZCk7CiAgICAgICBjb25zb2xlLmxvZygnQWN0dWFsICA6ICcgKyBkZXRhaWxzLmFjdHVhbCk7CiAgICAgICBjb25zb2xlLmxvZygnPT09PT09PT09PT09PT09PT09PT09PScpOwpAQCAtNjcsMTUyICs3MCwxNzEgQEAKIH0KIAogLy8gYWxsIExhbmd1YWdlcyBpbiBVVEYtOAotdmFyIHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7Citjb25zdCBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOwogCi1mdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpIHsKK2Z1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxLCBtYXAyKSB7CiAgIGlmICh0eXBlb2YgbWFwMSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWFwMiAhPT0gJ2Z1bmN0aW9uJykgewogICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gJ29iamVjdCcpIHsKLSAgICAgICAgZXF1YWwobWFwMSwgbWFwMik7CisgICAgICAgIGFzc2VydC5lcXVhbChtYXAxLCBtYXAyKTsKICAgICB9IGVsc2UgewotICAgICAgZm9yICh2YXIga2V5IGluIG1hcDEpIHsKLSAgICAgICAgY2hlY2tSZWN1cnNpdmVseShtYXAxW2tleV0sIG1hcDJba2V5XSk7CisgICAgICBmb3IgKGxldCBrZXkgaW4gbWFwMSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMVtrZXldLCBtYXAyW2tleV0pOwogICAgICAgfQogICAgIH0KICAgfQogfQogCi1tb2R1bGUoIkJhc2UgVHlwZXMiKTsKK1FVbml0Lm1vZHVsZSgnQmFzZSBUeXBlcycpOwogCi0gIHRlc3QoIlZvaWQiLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbChjbGllbnQudGVzdFZvaWQoKSwgdW5kZWZpbmVkKTsKKyAgUVVuaXQudGVzdCgnVm9pZCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFZvaWQoKSwgdW5kZWZpbmVkKTsKICAgfSk7Ci0gIHRlc3QoIlN0cmluZyIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpOwotICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QpLCBzdHJpbmdUZXN0KTsKKyAgUVVuaXQudGVzdCgnQmluYXJ5IChTdHJpbmcpJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgbGV0IGJpbmFyeSA9ICcnOworICAgIGZvciAobGV0IHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICB9CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGJpbmFyeSksIGJpbmFyeSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdCaW5hcnkgKFVpbnQ4QXJyYXkpJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgbGV0IGJpbmFyeSA9ICcnOworICAgIGZvciAobGV0IHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICB9CisgICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aCk7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnkubGVuZ3RoOyArK2kpIHsKKyAgICAgIGFycltpXSA9IGJpbmFyeVtpXS5jaGFyQ29kZUF0KCk7CisgICAgfQorICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEJpbmFyeShhcnIpLCBiaW5hcnkpOworICB9KTsKKyAgUVVuaXQudGVzdCgnU3RyaW5nJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFN0cmluZyhzdHJpbmdUZXN0KSwgc3RyaW5nVGVzdCk7CiAKLSAgICB2YXIgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICBjb25zdCBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKwogICAgICAgICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKwogICAgICAgICAgICcgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICcgKwogICAgICAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCiAgICAgICAgICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JzsKLSAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycyksc3BlY2lhbENoYXJhY3RlcnMpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycyksIHNwZWNpYWxDaGFyYWN0ZXJzKTsKICAgfSk7Ci0gIHRlc3QoIkRvdWJsZSIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDApLCAwKTsKLSAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZSgtMSksIC0xKTsKLSAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZSgzLjE0KSwgMy4xNCk7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiw2MCkpLCBNYXRoLnBvdygyLDYwKSk7CisgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdERvdWJsZSgwKSwgMCk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKC0xKSwgLTEpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdERvdWJsZSgzLjE0KSwgMy4xNCk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKE1hdGgucG93KDIsIDYwKSksIE1hdGgucG93KDIsIDYwKSk7CiAgIH0pOwotICB0ZXN0KCJCeXRlIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RCeXRlKDApLCAwKTsKLSAgICBlcXVhbChjbGllbnQudGVzdEJ5dGUoMHgwMSksIDB4MDEpOworICBRVW5pdC50ZXN0KCdCeXRlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgwKSwgMCk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgweDAxKSwgMHgwMSk7CiAgIH0pOwotICB0ZXN0KCJJMzIiLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbChjbGllbnQudGVzdEkzMigwKSwgMCk7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwzMCkpLCBNYXRoLnBvdygyLDMwKSk7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsMzApKSwgLU1hdGgucG93KDIsMzApKTsKKyAgUVVuaXQudGVzdCgnSTMyJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STMyKDApLCAwKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApKSwgTWF0aC5wb3coMiwgMzApKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsIDMwKSksIC1NYXRoLnBvdygyLCAzMCkpOwogICB9KTsKLSAgdGVzdCgiSTY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoMCksIDApOwotICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICBlcXVhbChjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLDUyKSksIE1hdGgucG93KDIsNTIpKTsKLSAgICBlcXVhbChjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiw1MikpLCAtTWF0aC5wb3coMiw1MikpOworICBRVW5pdC50ZXN0KCdJNjQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RJNjQoMCksIDApOworCisgICAgbGV0IGludDY0XzJfcG93XzYwX3Jlc3VsdCA9IGNsaWVudC50ZXN0STY0KGludDY0XzJfcG93XzYwKTsKKyAgICBhc3NlcnQub2soaW50NjRfMl9wb3dfNjAuZXF1YWxzKGludDY0XzJfcG93XzYwX3Jlc3VsdCkpOworCisgICAgbGV0IGludDY0X21pbnVzXzJfcG93XzYwX3Jlc3VsdCA9IGNsaWVudC50ZXN0STY0KGludDY0X21pbnVzXzJfcG93XzYwKTsKKyAgICBhc3NlcnQub2soaW50NjRfbWludXNfMl9wb3dfNjAuZXF1YWxzKGludDY0X21pbnVzXzJfcG93XzYwX3Jlc3VsdCkpOwogICB9KTsKIAogCi1tb2R1bGUoIlN0cnVjdHVyZWQgVHlwZXMiKTsKK1FVbml0Lm1vZHVsZSgnU3RydWN0dXJlZCBUeXBlcycpOwogCi0gIHRlc3QoIlN0cnVjdCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgUVVuaXQudGVzdCgnU3RydWN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3Qgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CiAgICAgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOwogICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKLSAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwzMCk7Ci0gICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDUyKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBpbnQ2NF8yX3Bvd182MDsKIAotICAgIHZhciBzdHJ1Y3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKKyAgICBjb25zdCBzdHJ1Y3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKIAotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7Ci0gICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgYXNzZXJ0Lm9rKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLmVxdWFscyhzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKSk7CiAKLSAgICBlcXVhbChKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSk7CisgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKICAgfSk7CiAKLSAgdGVzdCgiTmVzdCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciB4dHJUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgUVVuaXQudGVzdCgnTmVzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKICAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7Ci0gICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApOwotICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiw1Mik7CisgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gaW50NjRfMl9wb3dfNjA7CiAKLSAgICB2YXIgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKKyAgICBjb25zdCBuZXN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpOwogICAgIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDI7CiAgICAgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcgPSB4dHJUZXN0SW5wdXQ7Ci0gICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLDE1KTsKKyAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKIAotICAgIHZhciBuZXN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KTsKKyAgICBjb25zdCBuZXN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KTsKIAotICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7Ci0gICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKLSAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7Ci0gICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKLSAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcpOwotICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChuZXN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZyk7CisgICAgYXNzZXJ0Lm9rKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcuZXF1YWxzKG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZykpOworICAgIGFzc2VydC5lcXVhbChuZXN0VGVzdE91dHB1dC5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKIAotICAgIGVxdWFsKEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RJbnB1dCkpOworICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShuZXN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKICAgfSk7CiAKLSAgdGVzdCgiTWFwIiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1hcFRlc3RJbnB1dCA9IHs3Ojc3LCA4Ojg4LCA5Ojk5fTsKKyAgUVVuaXQudGVzdCgnTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgbWFwVGVzdElucHV0ID0gezc6IDc3LCA4OiA4OCwgOTogOTl9OwogCi0gICAgdmFyIG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQpOworICAgIGNvbnN0IG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQpOwogCi0gICAgZm9yICh2YXIga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKLSAgICAgIGVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgIGZvciAobGV0IGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7CisgICAgICBhc3NlcnQuZXF1YWwobWFwVGVzdE91dHB1dFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CiAgICAgfQogICB9KTsKIAotICB0ZXN0KCJTdHJpbmdNYXAiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgbWFwVGVzdElucHV0ID0gewotICAgICAgImEiOiIxMjMiLCAiYSBiIjoid2l0aCBzcGFjZXMgIiwgInNhbWUiOiJzYW1lIiwgIjAiOiJudW1lcmljIGtleSIsCi0gICAgICAibG9uZ1ZhbHVlIjpzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiJsb25nIGtleSIKKyAgUVVuaXQudGVzdCgnU3RyaW5nTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgbWFwVGVzdElucHV0ID0geworICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgJ2xvbmdWYWx1ZSc6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICdsb25nIGtleScKICAgICB9OwogCi0gICAgdmFyIG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cmluZ01hcChtYXBUZXN0SW5wdXQpOworICAgIGNvbnN0IG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cmluZ01hcChtYXBUZXN0SW5wdXQpOwogCi0gICAgZm9yICh2YXIga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKLSAgICAgIGVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgIGZvciAobGV0IGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7CisgICAgICBhc3NlcnQuZXF1YWwobWFwVGVzdE91dHB1dFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CiAgICAgfQogICB9KTsKIAotICB0ZXN0KCJTZXQiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgc2V0VGVzdElucHV0ID0gWzEsMiwzXTsKLSAgICBvayhjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQpLCBzZXRUZXN0SW5wdXQpOworICBRVW5pdC50ZXN0KCdTZXQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBzZXRUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgYXNzZXJ0Lm9rKGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCksIHNldFRlc3RJbnB1dCk7CiAgIH0pOwogCi0gIHRlc3QoIkxpc3QiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgbGlzdFRlc3RJbnB1dCA9IFsxLDIsM107Ci0gICAgb2soY2xpZW50LnRlc3RMaXN0KGxpc3RUZXN0SW5wdXQpLCBsaXN0VGVzdElucHV0KTsKKyAgUVVuaXQudGVzdCgnTGlzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IGxpc3RUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgYXNzZXJ0Lm9rKGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KSwgbGlzdFRlc3RJbnB1dCk7CiAgIH0pOwogCi0gIHRlc3QoIkVudW0iLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbChjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICBRVW5pdC50ZXN0KCdFbnVtJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FKSwgVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSk7CiAgIH0pOwogCi0gIHRlc3QoIlR5cGVEZWYiLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbChjbGllbnQudGVzdFR5cGVkZWYoNjkpLCA2OSk7CisgIFFVbml0LnRlc3QoJ1R5cGVEZWYnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RUeXBlZGVmKDY5KSwgNjkpOwogICB9KTsKIAotICB0ZXN0KCJTa2lwIiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwotICAgIHZhciBtb2RpZmllZENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworICBRVW5pdC50ZXN0KCdTa2lwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3Qgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgY29uc3QgbW9kaWZpZWRDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKIAogICAgIG1vZGlmaWVkQ2xpZW50LnJlY3ZfdGVzdFN0cnVjdCA9IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIGlucHV0ICA9IG1vZGlmaWVkQ2xpZW50LmlucHV0OwotICAgICAgdmFyIHh0cnVjdDMgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QzKCk7CisgICAgICBjb25zdCBpbnB1dCA9IG1vZGlmaWVkQ2xpZW50LmlucHV0OworICAgICAgY29uc3QgeHRydWN0MyA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDMoKTsKIAogICAgICAgaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOwogICAgICAgaW5wdXQucmVhZFN0cnVjdEJlZ2luKCk7CkBAIC0yMzIsMTc4ICsyNTQsMTY0IEBACiAgICAgfTsKIAogICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKLSAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyAgID0gMHgwMTsKLSAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nICAgID0gTWF0aC5wb3coMiwzMCk7Ci0gICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyAgICA9IE1hdGgucG93KDIsNTIpOworICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBpbnQ2NF8yX3Bvd182MDsKIAotICAgIHZhciBzdHJ1Y3RUZXN0T3V0cHV0ID0gbW9kaWZpZWRDbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworICAgIGNvbnN0IHN0cnVjdFRlc3RPdXRwdXQgPSBtb2RpZmllZENsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCk7CiAKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0IGluc3RhbmNlb2YgVGhyaWZ0VGVzdC5YdHJ1Y3QzLCB0cnVlKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7Ci0gICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5jaGFuZ2VkLCBudWxsKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7Ci0gICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0IGluc3RhbmNlb2YgVGhyaWZ0VGVzdC5YdHJ1Y3QzLCB0cnVlKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmNoYW5nZWQsIG51bGwpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgYXNzZXJ0Lm9rKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLmVxdWFscyhzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKSk7CiAgIH0pOwogCiAKLW1vZHVsZSgiZGVlcGVyISIpOworUVVuaXQubW9kdWxlKCdkZWVwZXIhJyk7CiAKLSAgdGVzdCgiTWFwTWFwIiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCA9IHsKLSAgICAgICI0Ijp7IjEiOjEsIjIiOjIsIjMiOjMsIjQiOjR9LAotICAgICAgIi00Ijp7Ii00IjotNCwgIi0zIjotMywgIi0yIjotMiwgIi0xIjotMX0KKyAgUVVuaXQudGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0ID0geworICAgICAgJzQnOiB7JzEnOiAxLCAnMic6IDIsICczJzogMywgJzQnOiA0fSwKKyAgICAgICctNCc6IHsnLTQnOiAtNCwgJy0zJzogLTMsICctMic6IC0yLCAnLTEnOiAtMX0KICAgICB9OwogCi0gICAgdmFyIG1hcE1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcE1hcCgxKTsKKyAgICBjb25zdCBtYXBNYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CiAKIAotICAgIGZvciAodmFyIGtleSBpbiBtYXBNYXBUZXN0T3V0cHV0KSB7Ci0gICAgICBmb3IgKHZhciBrZXkyIGluIG1hcE1hcFRlc3RPdXRwdXRba2V5XSkgewotICAgICAgICBlcXVhbChtYXBNYXBUZXN0T3V0cHV0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKKyAgICBmb3IgKGxldCBrZXkgaW4gbWFwTWFwVGVzdE91dHB1dCkgeworICAgICAgZm9yIChsZXQga2V5MiBpbiBtYXBNYXBUZXN0T3V0cHV0W2tleV0pIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcE1hcFRlc3RPdXRwdXRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOwogICAgICAgfQogICAgIH0KIAotICAgIGNoZWNrUmVjdXJzaXZlbHkobWFwTWFwVGVzdE91dHB1dCwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0KTsKKyAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwTWFwVGVzdE91dHB1dCwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0KTsKICAgfSk7CiAKIAotbW9kdWxlKCJFeGNlcHRpb24iKTsKK1FVbml0Lm1vZHVsZSgnRXhjZXB0aW9uJyk7CiAKLSAgdGVzdCgiWGNlcHRpb24iLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoMik7Ci0gICAgdHJ5ewotICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7Ci0gICAgfWNhdGNoKGUpewotICAgICAgZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOwotICAgICAgZXF1YWwoZS5tZXNzYWdlLCAiWGNlcHRpb24iKTsKKyAgUVVuaXQudGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB0cnkgeworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CisgICAgICBhc3NlcnQub2soZmFsc2UpOworICAgIH1jYXRjaCAoZSkgeworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOwogICAgIH0KICAgfSk7CiAKLSAgdGVzdCgibm8gRXhjZXB0aW9uIiwgMCwgZnVuY3Rpb24oKSB7Ci0gICAgdHJ5ewotICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIpOwotICAgIH1jYXRjaChlKXsKLSAgICAgIG9rKGZhbHNlKTsKKyAgUVVuaXQudGVzdCgnbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICB0cnkgeworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ25vIEV4Y2VwdGlvbicpOworICAgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgIH1jYXRjaCAoZSkgeworICAgICAgYXNzZXJ0Lm9rKGZhbHNlKTsKICAgICB9CiAgIH0pOwogCi0gIHRlc3QoIlRFeGNlcHRpb24iLCBmdW5jdGlvbigpIHsKKyAgUVVuaXQudGVzdCgnVEV4Y2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgewogICAgIC8vVGhyaWZ0VGVzdCBkb2VzIG5vdCBsaXN0IFRFeGNlcHRpb24gYXMgYSBsZWdhbCBleGNlcHRpb24gc28gaXQgd2lsbAogICAgIC8vIGdlbmVyYXRlIGFuIGV4Y2VwdGlvbiBvbiB0aGUgc2VydmVyIHRoYXQgZG9lcyBub3QgcHJvcGFnYXRlIGJhY2sgdG8KICAgICAvLyB0aGUgY2xpZW50LiBUaGlzIHRlc3QgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXF1YXRlIHRvICJubyBleGNlcHRpb24iCi0gICAgZXhwZWN0KDEpOwotICAgIHRyeXsKLSAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7Ci0gICAgfSBjYXRjaChlKSB7Ci0gICAgICAvL29rKGZhbHNlKTsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIHRyeSB7CisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignVEV4Y2VwdGlvbicpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIC8vYXNzZXJ0Lm9rKGZhbHNlKTsKICAgICB9Ci0gICAgb2sodHJ1ZSk7CisgICAgYXNzZXJ0Lm9rKHRydWUpOwogICB9KTsKIAogCi1tb2R1bGUoIkluc2FuaXR5Iik7CitRVW5pdC5tb2R1bGUoJ0luc2FuaXR5Jyk7CiAKLSAgdGVzdCgidGVzdEluc2FuaXR5IiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGluc2FuaXR5ID0gewotICAgICAgIjEiOnsKLSAgICAgICAgIjIiOnsKLSAgICAgICAgICAidXNlck1hcCI6eyAiNSI6NSwgIjgiOjggfSwKLSAgICAgICAgICAieHRydWN0cyI6W3sKLSAgICAgICAgICAgICAgInN0cmluZ190aGluZyI6Ikdvb2RieWU0IiwKLSAgICAgICAgICAgICAgImJ5dGVfdGhpbmciOjQsCi0gICAgICAgICAgICAgICJpMzJfdGhpbmciOjQsCi0gICAgICAgICAgICAgICJpNjRfdGhpbmciOjQKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciOiJIZWxsbzIiLAotICAgICAgICAgICAgICAiYnl0ZV90aGluZyI6MiwKLSAgICAgICAgICAgICAgImkzMl90aGluZyI6MiwKLSAgICAgICAgICAgICAgImk2NF90aGluZyI6MgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKLSAgICAgICAgIjMiOnsKLSAgICAgICAgICAidXNlck1hcCI6eyAiNSI6NSwgIjgiOjggfSwKLSAgICAgICAgICAieHRydWN0cyI6W3sKLSAgICAgICAgICAgICAgInN0cmluZ190aGluZyI6Ikdvb2RieWU0IiwKLSAgICAgICAgICAgICAgImJ5dGVfdGhpbmciOjQsCi0gICAgICAgICAgICAgICJpMzJfdGhpbmciOjQsCi0gICAgICAgICAgICAgICJpNjRfdGhpbmciOjQKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciOiJIZWxsbzIiLAotICAgICAgICAgICAgICAiYnl0ZV90aGluZyI6MiwKLSAgICAgICAgICAgICAgImkzMl90aGluZyI6MiwKLSAgICAgICAgICAgICAgImk2NF90aGluZyI6MgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfQorICBjb25zdCBjcmF6eSA9IHsKKyAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAneHRydWN0cyc6IFt7CisgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgJ2k2NF90aGluZyc6IG5ldyBJbnQ2NCg0KQorICAgIH0sCisgICAgeworICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAnaTY0X3RoaW5nJzogbmV3IEludDY0KDIpCisgICAgfV0KKyAgfTsKKyAgUVVuaXQudGVzdCgndGVzdEluc2FuaXR5JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgaW5zYW5pdHkgPSB7CisgICAgICAnMSc6IHsKKyAgICAgICAgJzInOiBjcmF6eSwKKyAgICAgICAgJzMnOiBjcmF6eQogICAgICAgfSwKLSAgICAgICIyIjp7ICI2Ijp7ICJ1c2VyTWFwIjpudWxsLCAieHRydWN0cyI6bnVsbCB9IH0KKyAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CiAgICAgfTsKLSAgICB2YXIgcmVzID0gY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eSgpKTsKLSAgICBvayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOwotICAgIG9rKGluc2FuaXR5LCBKU09OLnN0cmluZ2lmeShpbnNhbml0eSkpOworICAgIGNvbnN0IHJlcyA9IGNsaWVudC50ZXN0SW5zYW5pdHkobmV3IFRocmlmdFRlc3QuSW5zYW5pdHkoY3JhenkpKTsKKyAgICBhc3NlcnQub2socmVzLCBKU09OLnN0cmluZ2lmeShyZXMpKTsKKyAgICBhc3NlcnQub2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CiAKLSAgICBjaGVja1JlY3Vyc2l2ZWx5KHJlcywgaW5zYW5pdHkpOworICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXMsIGluc2FuaXR5KTsKICAgfSk7CiAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy9SdW4gc2FtZSB0ZXN0cyBhc3luY2hyb25vdXNseQogCi1tb2R1bGUoIkFzeW5jIik7CitRVW5pdC5tb2R1bGUoJ0FzeW5jJyk7CiAKLSAgdGVzdCgiRG91YmxlIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxICk7CisgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CiAKLSAgICBRVW5pdC5zdG9wKCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOwogICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQxNTkyNjUsIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCAzLjE0MTU5MjY1KTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAzLjE0MTU5MjY1KTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgdGVzdCgiQnl0ZSIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMSApOworICBRVW5pdC50ZXN0KCdCeXRlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKIAotICAgIFFVbml0LnN0b3AoKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CiAgICAgY2xpZW50LnRlc3RCeXRlKDB4MDEsIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCAweDAxKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAweDAxKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgdGVzdCgiSTMyIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyICk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CiAKLSAgICBRVW5pdC5zdG9wKCk7Ci0gICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwzMCksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDMwKSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisgICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDMwKSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAKLSAgICBRVW5pdC5zdG9wKCk7Ci0gICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coLTIsMzEpLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsMzEpKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coLTIsIDMxKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwgMzEpKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgdGVzdCgiSTY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyICk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CiAKLSAgICBRVW5pdC5zdG9wKCk7Ci0gICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiw1MikpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworICAgIGNsaWVudC50ZXN0STY0KGludDY0XzJfcG93XzYwLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhpbnQ2NF8yX3Bvd182MC5lcXVhbHMocmVzdWx0KSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAKLSAgICBRVW5pdC5zdG9wKCk7Ci0gICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KC0yLDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLDUyKSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0STY0KGludDY0X21pbnVzXzJfcG93XzYwLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhpbnQ2NF9taW51c18yX3Bvd182MC5lcXVhbHMocmVzdWx0KSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzIGIvbGliL2pzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCmluZGV4IGUxZmE3NGYuLjhiYTI5NmIgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3RfaGFuZGxlci5qcworKysgYi9saWIvanMvdGVzdC90ZXN0X2hhbmRsZXIuanMKQEAgLTE3LDEzICsxNywxNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLy9UaGlzIGlzIHRoZSBzZXJ2ZXIgc2lkZSBOb2RlIHRlc3QgaGFuZGxlciBmb3IgdGhlIHN0YW5kYXJkIAorLy9UaGlzIGlzIHRoZSBzZXJ2ZXIgc2lkZSBOb2RlIHRlc3QgaGFuZGxlciBmb3IgdGhlIHN0YW5kYXJkCiAvLyAgQXBhY2hlIFRocmlmdCB0ZXN0IHNlcnZpY2UuCiAKLXZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOwotdmFyIFRFeGNlcHRpb24gPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpLlRFeGNlcHRpb247Citjb25zdCBlczZNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWVzNicpOworY29uc3QgZ2VuRm9sZGVyID0gZXM2TW9kZSA/ICdnZW4tbm9kZWpzLWVzNicgOiAnZ2VuLW5vZGVqcyc7Citjb25zdCB0dHlwZXMgPSByZXF1aXJlKGAuLyR7Z2VuRm9sZGVyfS9UaHJpZnRUZXN0X3R5cGVzYCk7Citjb25zdCBURXhjZXB0aW9uID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKS5URXhjZXB0aW9uOworY29uc3QgSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7CiAKLXZhciBUaHJpZnRUZXN0SGFuZGxlciA9IGV4cG9ydHMuVGhyaWZ0VGVzdEhhbmRsZXIgPSB7CitleHBvcnRzLlRocmlmdFRlc3RIYW5kbGVyID0gewogICB0ZXN0Vm9pZDogZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgY29uc29sZS5sb2coJ3Rlc3RWb2lkKCknKTsKICAgICByZXN1bHQobnVsbCk7CkBAIC05OSwxMCArMTAyLDEwIEBACiAgIHRlc3RNYXBNYXA6IGZ1bmN0aW9uKGhlbGxvLCByZXN1bHQpIHsKICAgICBjb25zb2xlLmxvZygndGVzdE1hcE1hcCgnICsgaGVsbG8gKyAnKScpOwogCi0gICAgdmFyIG1hcG1hcCA9IFtdOwotICAgIHZhciBwb3MgPSBbXTsKLSAgICB2YXIgbmVnID0gW107Ci0gICAgZm9yICh2YXIgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICBjb25zdCBtYXBtYXAgPSBbXTsKKyAgICBjb25zdCBwb3MgPSBbXTsKKyAgICBjb25zdCBuZWcgPSBbXTsKKyAgICBmb3IgKGxldCBpID0gMTsgaSA8IDU7IGkrKykgewogICAgICAgcG9zW2ldID0gaTsKICAgICAgIG5lZ1staV0gPSAtaTsKICAgICB9CkBAIC0xMTYsMzQgKzExOSwzNCBAQAogICAgIGNvbnNvbGUubG9nKGFyZ3VtZW50KTsKICAgICBjb25zb2xlLmxvZygnKScpOwogCi0gICAgdmFyIGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CiAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7CiAgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7CiAgICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKLSAgICBoZWxsby5pNjRfdGhpbmcgPSAyOworICAgIGhlbGxvLmk2NF90aGluZyA9IG5ldyBJbnQ2NCgyKTsKIAotICAgIHZhciBnb29kYnllID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBjb25zdCBnb29kYnllID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKICAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICdHb29kYnllNCc7CiAgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKICAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7Ci0gICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSA0OworICAgIGdvb2RieWUuaTY0X3RoaW5nID0gbmV3IEludDY0KDQpOwogCi0gICAgdmFyIGNyYXp5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICAgIGNvbnN0IGNyYXp5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOwogICAgIGNyYXp5LnVzZXJNYXAgPSBbXTsKICAgICBjcmF6eS51c2VyTWFwW3R0eXBlcy5OdW1iZXJ6LkVJR0hUXSA9IDg7CiAgICAgY3JhenkudXNlck1hcFt0dHlwZXMuTnVtYmVyei5GSVZFXSA9IDU7CiAgICAgY3JhenkueHRydWN0cyA9IFtnb29kYnllLCBoZWxsb107CiAKLSAgICB2YXIgZmlyc3RfbWFwID0gW107Ci0gICAgdmFyIHNlY29uZF9tYXAgPSBbXTsKKyAgICBjb25zdCBmaXJzdF9tYXAgPSBbXTsKKyAgICBjb25zdCBzZWNvbmRfbWFwID0gW107CiAKICAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVFdPXSA9IGNyYXp5OwogICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5USFJFRV0gPSBjcmF6eTsKIAotICAgIHZhciBsb29uZXkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CisgICAgY29uc3QgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOwogICAgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsKIAotICAgIHZhciBpbnNhbmUgPSBbXTsKKyAgICBjb25zdCBpbnNhbmUgPSBbXTsKICAgICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CiAgICAgaW5zYW5lWzJdID0gc2Vjb25kX21hcDsKIApAQCAtMTU0LDcgKzE1Nyw3IEBACiAgIHRlc3RNdWx0aTogZnVuY3Rpb24oYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgcmVzdWx0KSB7CiAgICAgY29uc29sZS5sb2coJ3Rlc3RNdWx0aSgpJyk7CiAKLSAgICB2YXIgaGVsbG8gPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIGNvbnN0IGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKICAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKICAgICBoZWxsby5pMzJfdGhpbmcgPSBhcmcxOwpAQCAtMTYyLDkgKzE2NSw5IEBACiAgICAgcmVzdWx0KG51bGwsIGhlbGxvKTsKICAgfSwKICAgdGVzdEV4Y2VwdGlvbjogZnVuY3Rpb24oYXJnLCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdEV4Y2VwdGlvbignK2FyZysnKScpOworICAgIGNvbnNvbGUubG9nKCd0ZXN0RXhjZXB0aW9uKCcgKyBhcmcgKyAnKScpOwogICAgIGlmIChhcmcgPT09ICdYY2VwdGlvbicpIHsKLSAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgY29uc3QgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKICAgICAgIHgubWVzc2FnZSA9IGFyZzsKICAgICAgIHJlc3VsdCh4KTsKQEAgLTE3NywxOSArMTgwLDE5IEBACiAgIHRlc3RNdWx0aUV4Y2VwdGlvbjogZnVuY3Rpb24oYXJnMCwgYXJnMSwgcmVzdWx0KSB7CiAgICAgY29uc29sZS5sb2coJ3Rlc3RNdWx0aUV4Y2VwdGlvbignICsgYXJnMCArICcsICcgKyBhcmcxICsgJyknKTsKICAgICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7Ci0gICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CiAgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CiAgICAgICB4Lm1lc3NhZ2UgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbic7CiAgICAgICByZXN1bHQoeCk7CiAgICAgfSBlbHNlIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uMicpKSB7Ci0gICAgICB2YXIgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICAgICAgY29uc3QgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOwogICAgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKICAgICAgIHgyLnN0cnVjdF90aGluZyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CiAgICAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJzsKICAgICAgIHJlc3VsdCh4Mik7CiAgICAgfQogCi0gICAgdmFyIHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgY29uc3QgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKICAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKICAgICByZXN1bHQobnVsbCwgcmVzKTsKICAgfSwKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3R3cy5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdHdzLmh0bWwKaW5kZXggZjk5YTE0Ni4uNWZmOWYyMiAxMDA2NDQKLS0tIGEvbGliL2pzL3Rlc3QvdGVzdHdzLmh0bWwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdHdzLmh0bWwKQEAgLTIyLDYgKzIyLDkgQEAKICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CiAgIDx0aXRsZT5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0PC90aXRsZT4KIAorICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvbGliL0ludDY0LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL2xpYi9JbnQ2NFV0aWwuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvbGliL0pTT05JbnQ2NC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiAgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy90aHJpZnQuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiAgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiAgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CkBAIC0zNSwxOCArMzgsMTggQEAKIAogICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CiAgIDxzY3JpcHQ+Ci0gICAgdmFyIGxvYyA9IHdpbmRvdy5sb2NhdGlvbjsKLSAgICB2YXIgd3NfdXJpID0gKChsb2MucHJvdG9jb2wgPT09ICJodHRwczoiKSA/ICJ3c3M6Ly8iIDogIndzOi8vIikgKworICAgIGNvbnN0IGxvYyA9IHdpbmRvdy5sb2NhdGlvbjsKKyAgICBjb25zdCB3c191cmkgPSAoKGxvYy5wcm90b2NvbCA9PT0gImh0dHBzOiIpID8gIndzczovLyIgOiAid3M6Ly8iKSArCiAgICAgICAgICAgICAgICAgICAgbG9jLmhvc3RuYW1lICsgIjoiICsgbG9jLnBvcnQgKyBsb2MucGF0aG5hbWU7Ci0gICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCh3c191cmkpOwotICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgdmFyIGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCh3c191cmkpOworICAgIGNvbnN0IHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKICAgICB0cmFuc3BvcnQub3BlbigpOwogICA8L3NjcmlwdD4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1hc3luYy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogPC9oZWFkPgogPGJvZHk+Ci0gIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD10aHJpZnQuZ2l0O2E9YmxvYjtmPXRlc3QvVGhyaWZ0VGVzdC50aHJpZnQ7aGI9SEVBRCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ij5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KICAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CiAgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CiAgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgpkaWZmIC0tZ2l0IGEvbGliL2pzb24vTWFrZWZpbGUuYW0gYi9saWIvanNvbi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzhjMGNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzb24vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmIFdJVEhfSkFWQQorIyBTY2hlbWEgdmFsaWRhdGlvbiB0ZXN0IGRlcGVuZHMgb24gamF2YQorU1VCRElSUyA9IHRlc3QKK2VuZGlmCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIHRlc3QvYnVpbGQvCisKK2Rpc3QtaG9vazoKKwkkKFJNKSAtciAkKGRpc3RkaXIpL3Rlc3QvYnVpbGQvCisKK0VYVFJBX0RJU1QgPSBcCisgICAgc2NoZW1hLmpzb24gXAorICAgIHRlc3QKZGlmZiAtLWdpdCBhL2xpYi9qc29uL3NjaGVtYS5qc29uIGIvbGliL2pzb24vc2NoZW1hLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1OGE3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc29uL3NjaGVtYS5qc29uCkBAIC0wLDAgKzEsMzQ0IEBACit7CisgICIkc2NoZW1hIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCisKKyAgImlkIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9zY2hlbWEuanNvbiMiLAorICAiZGVzY3JpcHRpb24iOiAiU2NoZW1hIGZvciBBcGFjaGUgVGhyaWZ0IHByb3RvY29sIGRlc2NyaXB0b3JzIiwKKworICAiZGVmaW5pdGlvbnMiOiB7CisgICAgInR5cGUtaWQiOiB7CisgICAgICAidGl0bGUiOiAiQW55IHR5cGUgaWQgKG5hbWUpIiwKKyAgICAgICJlbnVtIjogWworICAgICAgICAidm9pZCIsCisgICAgICAgICJzdHJpbmciLAorICAgICAgICAiYm9vbCIsCisgICAgICAgICJieXRlIiwKKyAgICAgICAgImk4IiwKKyAgICAgICAgImkxNiIsCisgICAgICAgICJpMzIiLAorICAgICAgICAiaTY0IiwKKyAgICAgICAgImRvdWJsZSIsCisgICAgICAgICJsaXN0IiwKKyAgICAgICAgInNldCIsCisgICAgICAgICJtYXAiLAorICAgICAgICAidW5pb24iLAorICAgICAgICAic3RydWN0IiwKKyAgICAgICAgImJpbmFyeSIKKyAgICAgIF0KKyAgICB9LAorICAgICJiYXNlLXR5cGUiOiB7CisgICAgICAidGl0bGUiOiAiQmFzZSB0eXBlIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlSWQiOiB7CisgICAgICAgICAgImVudW0iOiBbInZvaWQiLCAic3RyaW5nIiwgImJvb2wiLCAiYnl0ZSIsICJpOCIsICJpMTYiLCAiaTMyIiwgImk2NCIsICJkb3VibGUiLCAiYmluYXJ5IiBdCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiIF0KKyAgICB9LAorICAgICJsaXN0LXR5cGUiOiB7CisgICAgICAidGl0bGUiOiAiTGlzdCBhbmQgc2V0IHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlSWQiOiB7CisgICAgICAgICAgImVudW0iOiBbICJsaXN0IiwgInNldCIgXQorICAgICAgICB9LAorICAgICAgICAiZWxlbVR5cGVJZCI6ICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKKyAgICAgICAgImVsZW1UeXBlIjogICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJlbGVtVHlwZUlkIiBdCisgICAgfSwKKyAgICAibWFwLXR5cGUiOiB7CisgICAgICAidGl0bGUiOiAiTWFwIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlSWQiOiB7CisgICAgICAgICAgImVudW0iOiBbICJtYXAiIF0KKyAgICAgICAgfSwKKyAgICAgICAgImtleVR5cGVJZCI6ICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtaWQiIH0sCisgICAgICAgICJrZXlUeXBlIjogICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0sCisgICAgICAgICJ2YWx1ZVR5cGVJZCI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAidmFsdWVUeXBlIjogICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiwgImtleVR5cGVJZCIsICJ2YWx1ZVR5cGVJZCIgXQorICAgIH0sCisgICAgInN0cnVjdC10eXBlIjogeworICAgICAgInRpdGxlIjogIlN0cnVjdCwgdW5pb24gYW5kIGV4Y2VwdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyAidW5pb24iLCAic3RydWN0IiwgImV4Y2VwdGlvbiIgXQorICAgICAgICB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiwgImNsYXNzIiBdCisgICAgfSwKKyAgICAidHlwZS1kZXNjIjogeworICAgICAgInRpdGxlIjogIlR5cGUgZGVzY3JpcHRvciBzY2hlbWEiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7CisgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAgICAgInR5cGVJZCI6ICAgICAgeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgImNsYXNzIjogICAgICAgeyAidHlwZSI6ICJzdHJpbmciIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJvbmVPZiI6CisgICAgICAgICAgWworICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Jhc2UtdHlwZSIgfSwKKyAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9saXN0LXR5cGUiIH0sCisgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbWFwLXR5cGUiIH0sCisgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc3RydWN0LXR5cGUiIH0KKyAgICAgICAgICBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJuYW1lLWFuZC1kb2MiOiB7CisgICAgICAidGl0bGUiOiAiTmFtZSBhbmQgZG9jdW1lbnRhdGlvbiBzdWItc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgImRvYyI6IHsgInR5cGUiOiAic3RyaW5nIiB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAibmFtZSIgXQorICAgIH0sCisgICAgImVudW0iOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0ICdlbnVtJyBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7CisgICAgICAgICAgInJlcXVpcmVkIjogWyAibWVtYmVycyIgXSwKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJtZW1iZXJzIjogeworICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsgInR5cGUiOiAiaW50ZWdlciIgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyAibmFtZSIsICJ2YWx1ZSIgXQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidHlwZWRlZiI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgdHlwZWRlZiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAidHlwZUlkIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtaWQiIH0sCisgICAgICAgICAgICAidHlwZSI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiY29uc3RhbnQiOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IGNvbnN0YW50IGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJ2YWx1ZSI6IHsKKyAgICAgICAgICAgICAgIm9uZU9mIjogWworICAgICAgICAgICAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAibnVtYmVyIiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAiYXJyYXkiIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJvYmplY3QiIH0KKyAgICAgICAgICAgICAgXQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAidmFsdWUiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgImZpZWxkIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBzdHJ1Y3QgZmllbGQgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgImtleSI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCisgICAgICAgICAgICAgICJtaW5pbXVtIjogMSwKKyAgICAgICAgICAgICAgIm1heGltdW0iOiA2NTUzNQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXF1aXJlZCI6IHsKKyAgICAgICAgICAgICAgImVudW0iOiBbICJyZXF1aXJlZCIsICJvcHRpb25hbCIsICJyZXFfb3V0IiBdCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInR5cGVJZCI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAgICAgInR5cGUiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9LAorICAgICAgICAgICAgImRlZmF1bHQiOiB7CisgICAgICAgICAgICAgICJvbmVPZiI6IFsKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm51bWJlciIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogImFycmF5IiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAib2JqZWN0IiB9CisgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgImtleSIsICJyZXF1aXJlZCIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAic3RydWN0IjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBzdHJ1Y3QgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgImlzRXhjZXB0aW9uIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAorICAgICAgICAgICAgImlzVW5pb24iOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCisgICAgICAgICAgICAiZmllbGRzIjogeworICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2ZpZWxkIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJpc0V4Y2VwdGlvbiIsICJpc1VuaW9uIiwgImZpZWxkcyIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidW5pb24iOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IHVuaW9uIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc3RydWN0IgorICAgIH0sCisgICAgImV4Y2VwdGlvbiI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgZXhjZXB0aW9uIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgImtleSI6IHsKKyAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKKyAgICAgICAgICAibWluaW11bSI6IDEsCisgICAgICAgICAgIm1heGltdW0iOiA2NTUzNQorICAgICAgICB9LAorICAgICAgICAibmFtZSI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAidHlwZUlkIjogeyAiZW51bSI6IFsgImV4Y2VwdGlvbiIgXSB9LAorICAgICAgICAidHlwZSI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJ1Y3QtdHlwZSIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgImtleSIsICJuYW1lIiwgInR5cGVJZCIgXQorICAgIH0sCisgICAgImZ1bmN0aW9uIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBzZXJ2aWNlIGZ1bmN0aW9uIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJvbmV3YXkiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJldHVyblR5cGUiOiB7CisgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJhcmd1bWVudHMiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgIml0ZW1zIjogeworICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZmllbGQiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZXhjZXB0aW9ucyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhjZXB0aW9uIiB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJvbmV3YXkiLCAiYXJndW1lbnRzIiwgImV4Y2VwdGlvbnMiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInNlcnZpY2UiOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IHNlcnZpY2UgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgImZ1bmN0aW9ucyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7CisgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9mdW5jdGlvbiIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAiZnVuY3Rpb25zIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJhbm5vdGF0aW9ucyI6IHsKKyAgICAgICJ0aXRsZSI6ICJNYXAgb2YgYW5ub3RhdGlvbiBuYW1lcyB0byB2YWx1ZXMiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKKyAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgfQorICAgIH0KKyAgfSwKKworICAidHlwZSI6ICJvYmplY3QiLAorICAicmVxdWlyZWQiOiBbCisgICAgIm5hbWUiLAorICAgICJlbnVtcyIsCisgICAgInR5cGVkZWZzIiwKKyAgICAic3RydWN0cyIsCisgICAgImNvbnN0YW50cyIsCisgICAgInNlcnZpY2VzIgorICBdLAorICAicHJvcGVydGllcyI6IHsKKyAgICAibmFtZSI6IHsKKyAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICB9LAorICAgICJpbmNsdWRlcyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgfSwKKyAgICAgICJ1bmlxdWVJdGVtcyI6IHRydWUKKyAgICB9LAorICAgICJuYW1lc3BhY2VzIjogeworICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKKyAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgfQorICAgIH0sCisgICAgImVudW1zIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2VudW0iCisgICAgICB9CisgICAgfSwKKyAgICAidHlwZWRlZnMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZWRlZiIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJ1Y3RzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb25zdGFudHMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29uc3RhbnQiCisgICAgICB9CisgICAgfSwKKyAgICAic2VydmljZXMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc2VydmljZSIKKyAgICAgIH0KKyAgICB9CisgIH0sCisgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCit9CmRpZmYgLS1naXQgYS9saWIvanNvbi90ZXN0L01ha2VmaWxlLmFtIGIvbGliL2pzb24vdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjg3YTUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzb24vdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworY2hlY2s6CisJJChBTlQpICQoQU5UX0ZMQUdTKSB0ZXN0CisKKyMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIGFudCBpcyBub3QgY29uZmlndXJlZC4KK2NsZWFuLWxvY2FsOgorCUFOVD0kKEFOVCkgOyBpZiB0ZXN0IC16ICIkJEFOVCIgOyB0aGVuIEFOVD06IDsgZmkgOyBcCisJJCRBTlQgJChBTlRfRkxBR1MpIGNsZWFuCmRpZmYgLS1naXQgYS9saWIvanNvbi90ZXN0L2J1aWxkLnByb3BlcnRpZXMgYi9saWIvanNvbi90ZXN0L2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1ZjY0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc29uL3Rlc3QvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDEwIEBACisjIEphciB2ZXJzaW9ucworbXZuLmFudC50YXNrLnZlcnNpb249Mi4xLjMKKworIyBEZXBlbmRlbmN5IHZlcnNpb25zCitqc29uLXNjaGVtYS12YWxpZGF0b3IudmVyc2lvbj0yLjIuNgorCisjIE1hdmVuIGRlcGVuZGVuY3kgZG93bmxvYWQgbG9jYXRpb25zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQorbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCmRpZmYgLS1naXQgYS9saWIvanNvbi90ZXN0L2J1aWxkLnhtbCBiL2xpYi9qc29uL3Rlc3QvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NmEyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi90ZXN0L2J1aWxkLnhtbApAQCAtMCwwICsxLDE0NCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9IkpTT04gU2NoZW1hIFRlc3QiIGRlZmF1bHQ9InRlc3QiIGJhc2VkaXI9Ii4iCisgIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiPgorCisgIDxkZXNjcmlwdGlvbj5KU09OIFNjaGVtYSBWYWxpZGF0aW9uIFRlc3Q8L2Rlc2NyaXB0aW9uPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L2J1aWxkIiAvPgorICA8cHJvcGVydHkgbmFtZT0ianNvbi5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uIiAvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuLmpzb24uZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2dlbi1qc29uIiAvPgorICA8cHJvcGVydHkgbmFtZT0ianNvbi5zY2hlbWEiIGxvY2F0aW9uPSIke2pzb24uZGlyfS9zY2hlbWEuanNvbiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS90b29scyIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQubGliLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9saWIiLz4KKworICA8IS0tIHRoZSByb290IGRpcmVjdG9yeSwgd2hlcmUgeW91IHVucGFjayB0aHJpZnQgZGlzdGlidXRpb24gKGUuZy4gdGhyaWZ0LTAueC54LnRhci5neikgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuZGlyIiBsb2NhdGlvbj0iLi4vLi4vLi4vIiAvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnRlc3QuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS90ZXN0IiAvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmNvbXBpbGVyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS9jb21waWxlci9jcHAvdGhyaWZ0IiAvPgorCisgIDwhLS0gR2V0IG1hdmVuIGRlcGVuZGVuY3kgdmVyc2lvbnMgZnJvbSBoZXJlIC0tPgorICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgorCisgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+CisgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ij4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorICAgIDwvZmlsZXNldD4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZXIuY2hlY2siPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMSI+CisgICAgICAgICAgICA8ZmlsZXNldCBpZD0iZnMiIGZpbGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIvPgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIFRocmlmdCBjb21waWxlciBpcyBtaXNzaW5nICEKKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iY29tcGlsZXIuY2hlY2ssIG1rZGlycywgbXZuLmluaXQiPgorICAgIDx0c3RhbXAgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJta2RpcnMiPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGliLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRvb2xzLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2dlbi5qc29uLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzb24iLz4KKyAgICAgIDxhcmcgbGluZT0iLW91dCAke2dlbi5qc29uLmRpcn0iLz4KKyAgICAgIDxhcmcgbGluZT0iJHt0aHJpZnQudGVzdC5kaXJ9L1RocmlmdFRlc3QudGhyaWZ0Ii8+CisgICAgPC9leGVjPgorICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBqc29uOm1lcmdlIi8+CisgICAgICA8YXJnIGxpbmU9Ii1vdXQgJHtnZW4uanNvbi5kaXJ9Ii8+CisgICAgICA8YXJnIGxpbmU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9JbmNsdWRlLnRocmlmdCIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0icnVuIHNjaGVtYSB2YWxpZGF0aW9uIgorICAgICAgICAgIGRlcGVuZHM9InZhbGlkYXRlLXNjaGVtYSwgdmFsaWRhdGUtZ2VuZXJhdGVkLWpzb24iLz4KKworICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlLXNjaGVtYSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uZ2l0aHViLmZnZS5qc29uc2NoZW1hLm1haW4uY2xpLk1haW4iCisgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyB2YWx1ZT0iLS1zeW50YXgiLz4KKyAgICAgIDxhcmcgdmFsdWU9IiR7anNvbi5zY2hlbWF9Ii8+CisgICAgPC9qYXZhPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlLWdlbmVyYXRlZC1qc29uIiBkZXBlbmRzPSJpbml0LCBnZW5lcmF0ZSI+CisgICAgPHZhbGlkYXRlLWpzb24gZmlsZT0iJHtnZW4uanNvbi5kaXJ9L1RocmlmdFRlc3QuanNvbiIvPgorICAgIDx2YWxpZGF0ZS1qc29uIGZpbGU9IiR7Z2VuLmpzb24uZGlyfS9JbmNsdWRlLmpzb24iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtnZW4uanNvbi5kaXJ9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9Im1rZGlycyxtdm4uYW50LnRhc2tzLmNoZWNrIiB1bmxlc3M9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgIDxnZXQgc3JjPSIke212bi5hbnQudGFzay51cmx9LyR7bXZuLmFudC50YXNrLmphcn0iIGRlc3Q9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9IiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmNoZWNrIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICAgIDx0eXBlZm91bmQgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIG5hbWU9ImFydGlmYWN0Ii8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmluaXQiIGRlcGVuZHM9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIHVubGVzcz0ibXZuLmZpbmlzaGVkIj4KKyAgICA8dHlwZWRlZiB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgY2xhc3NwYXRoPSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIvPgorCisgICAgPGFydGlmYWN0OmRlcGVuZGVuY2llcyBmaWxlc2V0SWQ9InRlc3QuZGVwZW5kZW5jeS5qYXJzIj4KKyAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5naXRodWIuZmdlIiBhcnRpZmFjdElkPSJqc29uLXNjaGVtYS12YWxpZGF0b3IiIHZlcnNpb249IiR7anNvbi1zY2hlbWEtdmFsaWRhdG9yLnZlcnNpb259Ii8+CisgICAgPC9hcnRpZmFjdDpkZXBlbmRlbmNpZXM+CisKKyAgICA8IS0tIENvcHkgdGhlIGRlcGVuZGVuY2llcyB0byB0aGUgYnVpbGQvbGliIGRpciAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5saWIuZGlyfSI+CisgICAgICA8ZmlsZXNldCByZWZpZD0idGVzdC5kZXBlbmRlbmN5LmphcnMiLz4KKyAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgorICAgIDwvY29weT4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJtdm4uZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDxtYWNyb2RlZiBuYW1lPSJ2YWxpZGF0ZS1qc29uIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIGRlZmF1bHQ9IiIvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGphdmEgZmFpbG9uZXJyb3I9InRydWUiCisgICAgICAgICAgICBmb3JrPSJ0cnVlIgorICAgICAgICAgICAgZGlyPSIke2pzb24uZGlyfSIKKyAgICAgICAgICAgIGNsYXNzbmFtZT0iY29tLmdpdGh1Yi5mZ2UuanNvbnNjaGVtYS5tYWluLmNsaS5NYWluIgorICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCI+CisgICAgICAgIDxhcmcgbGluZT0iLS1mYWtlcm9vdCBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvIi8+CisgICAgICAgIDxhcmcgdmFsdWU9IiR7anNvbi5zY2hlbWF9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9IkB7ZmlsZX0iLz4KKyAgICAgIDwvamF2YT4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9sdWEvTWFrZWZpbGUuYW0gYi9saWIvbHVhL01ha2VmaWxlLmFtCmluZGV4IDRlN2Y0NzIuLjViMGYxN2EgMTAwNjQ0Ci0tLSBhL2xpYi9sdWEvTWFrZWZpbGUuYW0KKysrIGIvbGliL2x1YS9NYWtlZmlsZS5hbQpAQCAtMjMsOSArMjMsOSBAQAogCiBsaWJfTFRMSUJSQVJJRVMgPSBcCiAJCQlsaWJsdWFzb2NrZXQubGEgXAorCQkJbGlibHVhbG9uZ251bWJlci5sYSBcCiAJCQlsaWJsdWFicGFjay5sYSBcCi0JCQlsaWJsdWFiaXR3aXNlLmxhIFwKLQkJCWxpYmx1YWxvbmdudW1iZXIubGEKKwkJCWxpYmx1YWJpdHdpc2UubGEKIAogbGlibHVhc29ja2V0X2xhX1NPVVJDRVMgPSBcCiAJCQlzcmMvbHVhc29ja2V0LmMgXApAQCAtMzMsMzMgKzMzLDM5IEBACiAKIG5vYmFzZV9pbmNsdWRlX0hFQURFUlMgPSBzcmMvc29ja2V0LmgKIAotbGlibHVhc29ja2V0X2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgLUkvdXNyL2luY2x1ZGUvbHVhNS4yIC1ETFVBX0NPTVBBVF9NT0RVTEUKLWxpYmx1YXNvY2tldF9sYV9MREZMQUdTID0gJChBTV9MREZMQUdTKSAkKExVQV9MSUIpIC1sbQorbGlibHVhc29ja2V0X2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMVUFfSU5DTFVERSkgLURMVUFfQ09NUEFUX01PRFVMRQorbGlibHVhc29ja2V0X2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpCitsaWJsdWFzb2NrZXRfbGFfTElCQUREID0gJChMVUFfTElCKSAtbG0KIAogbGlibHVhYnBhY2tfbGFfU09VUkNFUyA9IHNyYy9sdWFicGFjay5jCiAKLWxpYmx1YWJwYWNrX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgLUkvdXNyL2luY2x1ZGUvbHVhNS4yIC1ETFVBX0NPTVBBVF9NT0RVTEUKLWxpYmx1YWJwYWNrX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpICQoTFVBX0xJQikgLWxtCi1saWJsdWFicGFja19sYV9MSUJBREQgPSBsaWJsdWFsb25nbnVtYmVyLmxhCitsaWJsdWFicGFja19sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoTFVBX0lOQ0xVREUpIC1ETFVBX0NPTVBBVF9NT0RVTEUKK2xpYmx1YWJwYWNrX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpCitsaWJsdWFicGFja19sYV9MSUJBREQgPSBsaWJsdWFsb25nbnVtYmVyLmxhICQoTFVBX0xJQikgLWxtCiAKIGxpYmx1YWJpdHdpc2VfbGFfU09VUkNFUyA9IHNyYy9sdWFiaXR3aXNlLmMKIAotbGlibHVhYml0d2lzZV9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpIC1JL3Vzci9pbmNsdWRlL2x1YTUuMiAtRExVQV9DT01QQVRfTU9EVUxFCi1saWJsdWFiaXR3aXNlX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpICQoTFVBX0xJQikgLWxtCitsaWJsdWFiaXR3aXNlX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMVUFfSU5DTFVERSkgLURMVUFfQ09NUEFUX01PRFVMRQorbGlibHVhYml0d2lzZV9sYV9MREZMQUdTID0gJChBTV9MREZMQUdTKQorbGlibHVhYml0d2lzZV9sYV9MSUJBREQgPSAkKExVQV9MSUIpIC1sbQogCiBsaWJsdWFsb25nbnVtYmVyX2xhX1NPVVJDRVMgPSBcCiAJCXNyYy9sdWFsb25nbnVtYmVyLmMgXAogCQlzcmMvbG9uZ251bWJlcnV0aWxzLmMKIAotbGlibHVhbG9uZ251bWJlcl9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpIC1JL3Vzci9pbmNsdWRlL2x1YTUuMiAtRExVQV9DT01QQVRfTU9EVUxFCi1saWJsdWFsb25nbnVtYmVyX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpICQoTFVBX0xJQikgLWxtCitsaWJsdWFsb25nbnVtYmVyX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMVUFfSU5DTFVERSkgLURMVUFfQ09NUEFUX01PRFVMRQorbGlibHVhbG9uZ251bWJlcl9sYV9MREZMQUdTID0gJChBTV9MREZMQUdTKQorbGlibHVhbG9uZ251bWJlcl9sYV9MSUJBREQgPSAkKExVQV9MSUIpIC1sbQogCiBFWFRSQV9ESVNUID0gXAogCQljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKIAkJVEJpbmFyeVByb3RvY29sLmx1YSBcCiAJCVRCdWZmZXJlZFRyYW5zcG9ydC5sdWEgXAorCQlUQ29tcGFjdFByb3RvY29sLmx1YSBcCiAJCVRGcmFtZWRUcmFuc3BvcnQubHVhIFwKIAkJVGhyaWZ0Lmx1YSBcCisJCVRIdHRwVHJhbnNwb3J0Lmx1YSBcCisJCVRKc29uUHJvdG9jb2wubHVhIFwKIAkJVE1lbW9yeUJ1ZmZlci5sdWEgXAogCQlUUHJvdG9jb2wubHVhIFwKIAkJVFNlcnZlci5sdWEgXApkaWZmIC0tZ2l0IGEvbGliL2x1YS9UQnVmZmVyZWRUcmFuc3BvcnQubHVhIGIvbGliL2x1YS9UQnVmZmVyZWRUcmFuc3BvcnQubHVhCmluZGV4IDJiMGI5NDYuLjQ1ZWY0YjEgMTAwNjQ0Ci0tLSBhL2xpYi9sdWEvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmx1YQorKysgYi9saWIvbHVhL1RCdWZmZXJlZFRyYW5zcG9ydC5sdWEKQEAgLTM3LDcgKzM3LDcgQEAKICAgICBlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIHRyYW5zJykKICAgZW5kCiAKLSAgcmV0dXJuIFRUcmFuc3BvcnRCYXNlOm5ldyhvYmopCisgIHJldHVybiBUVHJhbnNwb3J0QmFzZS5uZXcoc2VsZiwgb2JqKQogZW5kCiAKIGZ1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydDppc09wZW4oKQpkaWZmIC0tZ2l0IGEvbGliL2x1YS9UQ29tcGFjdFByb3RvY29sLmx1YSBiL2xpYi9sdWEvVENvbXBhY3RQcm90b2NvbC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3NTk1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVENvbXBhY3RQcm90b2NvbC5sdWEKQEAgLTAsMCArMSw0NTcgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUUHJvdG9jb2wnCityZXF1aXJlICdsaWJsdWFicGFjaycKK3JlcXVpcmUgJ2xpYmx1YWJpdHdpc2UnCityZXF1aXJlICdsaWJsdWFsb25nbnVtYmVyJworCitUQ29tcGFjdFByb3RvY29sID0gX19UT2JqZWN0Lm5ldyhUUHJvdG9jb2xCYXNlLCB7CisgIF9fdHlwZSA9ICdUQ29tcGFjdFByb3RvY29sJywKKyAgQ09NUEFDVF9QUk9UT0NPTF9JRCAgICAgICA9IDB4ODIsCisgIENPTVBBQ1RfVkVSU0lPTiAgICAgICAgICAgPSAxLAorICBDT01QQUNUX1ZFUlNJT05fTUFTSyAgICAgID0gMHgxZiwKKyAgQ09NUEFDVF9UWVBFX01BU0sgICAgICAgICA9IDB4RTAsCisgIENPTVBBQ1RfVFlQRV9CSVRTICAgICAgICAgPSAweDA3LAorICBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UID0gNSwKKworICAtLSBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAtLSBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICBsYXN0RmllbGQgPSB7fSwKKyAgbGFzdEZpZWxkSWQgPSAwLAorICBsYXN0RmllbGRJbmRleCA9IDEsCisKKyAgLS0gSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisgIC0tIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgYm9vbGVhbkZpZWxkTmFtZSAgICA9ICIiLAorICBib29sZWFuRmllbGRJZCAgICAgID0gMCwKKyAgYm9vbGVhbkZpZWxkUGVuZGluZyA9IGZhbHNlLAorCisgIC0tIElmIHdlIHJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbgorICAtLSB2YWx1ZSBoZXJlIHNvIHRoYXQgcmVhZEJvb2wgY2FuIHVzZSBpdC4KKyAgYm9vbFZhbHVlICAgICAgICAgID0gZmFsc2UsCisgIGJvb2xWYWx1ZUlzTm90TnVsbCA9IGZhbHNlLAorfSkKKworVENvbXBhY3RUeXBlID0geworICBDT01QQUNUX0JPT0xFQU5fVFJVRSAgPSAweDAxLAorICBDT01QQUNUX0JPT0xFQU5fRkFMU0UgPSAweDAyLAorICBDT01QQUNUX0JZVEUgICAgICAgICAgPSAweDAzLAorICBDT01QQUNUX0kxNiAgICAgICAgICAgPSAweDA0LAorICBDT01QQUNUX0kzMiAgICAgICAgICAgPSAweDA1LAorICBDT01QQUNUX0k2NCAgICAgICAgICAgPSAweDA2LAorICBDT01QQUNUX0RPVUJMRSAgICAgICAgPSAweDA3LAorICBDT01QQUNUX0JJTkFSWSAgICAgICAgPSAweDA4LAorICBDT01QQUNUX0xJU1QgICAgICAgICAgPSAweDA5LAorICBDT01QQUNUX1NFVCAgICAgICAgICAgPSAweDBBLAorICBDT01QQUNUX01BUCAgICAgICAgICAgPSAweDBCLAorICBDT01QQUNUX1NUUlVDVCAgICAgICAgPSAweDBDCit9CisKK1RUeXBlVG9Db21wYWN0VHlwZSA9IHt9CitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuU1RPUF0gICA9IFRUeXBlLlNUT1AKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5CT09MXSAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9UUlVFCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuQllURV0gICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0JZVEUKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5JMTZdICAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTE2CitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuSTMyXSAgICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0kzMgorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkk2NF0gICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9JNjQKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5ET1VCTEVdID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfRE9VQkxFCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuU1RSSU5HXSA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0JJTkFSWQorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkxJU1RdICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9MSVNUCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuU0VUXSAgICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX1NFVAorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLk1BUF0gICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9NQVAKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5TVFJVQ1RdID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfU1RSVUNUCisKK0NvbXBhY3RUeXBlVG9UVHlwZSA9IHt9CitDb21wYWN0VHlwZVRvVFR5cGVbVFR5cGUuU1RPUF0gICAgICAgICAgICAgICAgICAgICAgICA9IFRUeXBlLlNUT1AKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX1RSVUVdID0gVFR5cGUuQk9PTAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fRkFMU0VdID0gVFR5cGUuQk9PTAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0JZVEVdICAgICAgICAgPSBUVHlwZS5CWVRFCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTE2XSAgICAgICAgICA9IFRUeXBlLkkxNgorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0kzMl0gICAgICAgICAgPSBUVHlwZS5JMzIKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9JNjRdICAgICAgICAgID0gVFR5cGUuSTY0CitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfRE9VQkxFXSAgICAgICA9IFRUeXBlLkRPVUJMRQorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0JJTkFSWV0gICAgICAgPSBUVHlwZS5TVFJJTkcKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9MSVNUXSAgICAgICAgID0gVFR5cGUuTElTVAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX1NFVF0gICAgICAgICAgPSBUVHlwZS5TRVQKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9NQVBdICAgICAgICAgID0gVFR5cGUuTUFQCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfU1RSVUNUXSAgICAgICA9IFRUeXBlLlNUUlVDVAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlc2V0TGFzdEZpZWxkKCkKKyAgc2VsZi5sYXN0RmllbGQgPSB7fQorICBzZWxmLmxhc3RGaWVsZElkID0gMAorICBzZWxmLmxhc3RGaWVsZEluZGV4ID0gMQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cGFja0NvbXBhY3RUeXBlKGt0eXBlLCB2dHlwZSkKKyAgcmV0dXJuIGxpYmx1YWJpdHdpc2UuYm9yKGxpYmx1YWJpdHdpc2Uuc2hpZnRsKGt0eXBlLCA0KSwgdnR5cGUpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0dHlwZSwgc2VxaWQpCisgIHNlbGY6d3JpdGVCeXRlKFRDb21wYWN0UHJvdG9jb2wuQ09NUEFDVF9QUk9UT0NPTF9JRCkKKyAgc2VsZjp3cml0ZUJ5dGUobGlibHVhYnBhY2sucGFja01lc2dUeXBlKFRDb21wYWN0UHJvdG9jb2wuQ09NUEFDVF9WRVJTSU9OLAorICAgIFRDb21wYWN0UHJvdG9jb2wuQ09NUEFDVF9WRVJTSU9OX01BU0ssdHR5cGUsCisgICAgVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5ULAorICAgIFRDb21wYWN0UHJvdG9jb2wuQ09NUEFDVF9UWVBFX01BU0spKQorICBzZWxmOndyaXRlVmFyaW50MzIoc2VxaWQpCisgIHNlbGY6d3JpdGVTdHJpbmcobmFtZSkKKyAgc2VsZjpyZXNldExhc3RGaWVsZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZU1lc3NhZ2VFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVTdHJ1Y3RCZWdpbihuYW1lKQorICBzZWxmLmxhc3RGaWVsZEluZGV4ID0gc2VsZi5sYXN0RmllbGRJbmRleCArIDEKKyAgc2VsZi5sYXN0RmllbGRbc2VsZi5sYXN0RmllbGRJbmRleF0gPSBzZWxmLmxhc3RGaWVsZElkCisgIHNlbGYubGFzdEZpZWxkSWQgPSAwCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVN0cnVjdEVuZCgpCisgIHNlbGYubGFzdEZpZWxkSW5kZXggPSBzZWxmLmxhc3RGaWVsZEluZGV4IC0gMQorICBzZWxmLmxhc3RGaWVsZElkID0gc2VsZi5sYXN0RmllbGRbc2VsZi5sYXN0RmllbGRJbmRleF0KK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlRmllbGRCZWdpbihuYW1lLCB0dHlwZSwgaWQpCisgIGlmIHR0eXBlID09IFRUeXBlLkJPT0wgdGhlbgorICAgIHNlbGYuYm9vbGVhbkZpZWxkTmFtZSA9IG5hbWUKKyAgICBzZWxmLmJvb2xlYW5GaWVsZElkICAgPSBpZAorICAgIHNlbGYuYm9vbGVhbkZpZWxkUGVuZGluZyA9IHRydWUKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZSwgdHR5cGUsIGlkLCAtMSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUZpZWxkRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlRmllbGRTdG9wKCkKKyAgc2VsZjp3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKyAgaWYgc2l6ZSA9PSAwIHRoZW4KKyAgICBzZWxmOndyaXRlQnl0ZSgwKQorICBlbHNlCisgICAgc2VsZjp3cml0ZVZhcmludDMyKHNpemUpCisgICAgc2VsZjp3cml0ZUJ5dGUoc2VsZjpwYWNrQ29tcGFjdFR5cGUoVFR5cGVUb0NvbXBhY3RUeXBlW2t0eXBlXSwgVFR5cGVUb0NvbXBhY3RUeXBlW3Z0eXBlXSkpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVNYXBFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVMaXN0QmVnaW4oZXR5cGUsIHNpemUpCisgIHNlbGY6d3JpdGVDb2xsZWN0aW9uQmVnaW4oZXR5cGUsIHNpemUpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUxpc3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVTZXRCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUNvbGxlY3Rpb25CZWdpbihldHlwZSwgc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlU2V0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlQm9vbChib29sKQorICBsb2NhbCB2YWx1ZSA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fRkFMU0UKKyAgaWYgYm9vbCB0aGVuCisgICAgdmFsdWUgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX1RSVUUKKyAgZW5kCisgIHByaW50KHZhbHVlLHNlbGYuYm9vbGVhbkZpZWxkUGVuZGluZyxzZWxmLmJvb2xlYW5GaWVsZElkKQorICBpZiBzZWxmLmJvb2xlYW5GaWVsZFBlbmRpbmcgdGhlbgorICAgIHNlbGY6d3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoc2VsZi5ib29sZWFuRmllbGROYW1lLCBUVHlwZS5CT09MLCBzZWxmLmJvb2xlYW5GaWVsZElkLCB2YWx1ZSkKKyAgICBzZWxmLmJvb2xlYW5GaWVsZFBlbmRpbmcgPSBmYWxzZQorICBlbHNlCisgICAgc2VsZjp3cml0ZUJ5dGUodmFsdWUpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVCeXRlKGJ5dGUpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIGJ5dGUpCisgIHNlbGYudHJhbnM6d3JpdGUoYnVmZikKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlSTE2KGkxNikKKyAgc2VsZjp3cml0ZVZhcmludDMyKGxpYmx1YWJwYWNrLmkzMlRvWmlnemFnKGkxNikpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUkzMihpMzIpCisgIHNlbGY6d3JpdGVWYXJpbnQzMihsaWJsdWFicGFjay5pMzJUb1ppZ3phZyhpMzIpKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVJNjQoaTY0KQorICBzZWxmOndyaXRlVmFyaW50NjQobGlibHVhYnBhY2suaTY0VG9aaWd6YWcoaTY0KSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlRG91YmxlKGR1YikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdkJywgZHViKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVN0cmluZyhzdHIpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBzZWxmOndyaXRlQmluYXJ5KHN0cikKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlQmluYXJ5KHN0cikKKyAgLS0gU2hvdWxkIGJlIHV0Zi04CisgIHNlbGY6d3JpdGVWYXJpbnQzMihzdHJpbmcubGVuKHN0cikpCisgIHNlbGYudHJhbnM6d3JpdGUoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZSwgdHR5cGUsIGlkLCB0eXBlT3ZlcnJpZGUpCisgIGlmIHR5cGVPdmVycmlkZSA9PSAtMSB0aGVuCisgICAgdHlwZU92ZXJyaWRlID0gVFR5cGVUb0NvbXBhY3RUeXBlW3R0eXBlXQorICBlbmQKKyAgbG9jYWwgb2Zmc2V0ID0gaWQgLSBzZWxmLmxhc3RGaWVsZElkCisgIGlmIGlkID4gc2VsZi5sYXN0RmllbGRJZCBhbmQgb2Zmc2V0IDw9IDE1IHRoZW4KKyAgICBzZWxmOndyaXRlQnl0ZShsaWJsdWFiaXR3aXNlLmJvcihsaWJsdWFiaXR3aXNlLnNoaWZ0bChvZmZzZXQsIDQpLCB0eXBlT3ZlcnJpZGUpKQorICBlbHNlCisgICAgc2VsZjp3cml0ZUJ5dGUodHlwZU92ZXJyaWRlKQorICAgIHNlbGY6d3JpdGVJMTYoaWQpCisgIGVuZAorICBzZWxmLmxhc3RGaWVsZElkID0gaWQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlQ29sbGVjdGlvbkJlZ2luKGV0eXBlLCBzaXplKQorICBpZiBzaXplIDw9IDE0IHRoZW4KKyAgICBzZWxmOndyaXRlQnl0ZShsaWJsdWFiaXR3aXNlLmJvcihsaWJsdWFiaXR3aXNlLnNoaWZ0bChzaXplLCA0KSwgVFR5cGVUb0NvbXBhY3RUeXBlW2V0eXBlXSkpCisgIGVsc2UKKyAgICBzZWxmOndyaXRlQnl0ZShsaWJsdWFiaXR3aXNlLmJvcigweGYwLCBUVHlwZVRvQ29tcGFjdFR5cGVbZXR5cGVdKSkKKyAgICBzZWxmOndyaXRlVmFyaW50MzIoc2l6ZSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVZhcmludDMyKGkzMikKKyAgLS0gU2hvdWxkIGJlIHV0Zi04CisgIGxvY2FsIHN0ciA9IGxpYmx1YWJwYWNrLnRvVmFyaW50MzIoaTMyKQorICBzZWxmLnRyYW5zOndyaXRlKHN0cikKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlVmFyaW50NjQoaTY0KQorICAtLSBTaG91bGQgYmUgdXRmLTgKKyAgbG9jYWwgc3RyID0gbGlibHVhYnBhY2sudG9WYXJpbnQ2NChpNjQpCisgIHNlbGYudHJhbnM6d3JpdGUoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZE1lc3NhZ2VCZWdpbigpCisgIGxvY2FsIHByb3RvY29sSWQgPSBzZWxmOnJlYWRTaWduQnl0ZSgpCisgIGlmIHByb3RvY29sSWQgfj0gc2VsZi5DT01QQUNUX1BST1RPQ09MX0lEIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAiRXhwZWN0ZWQgcHJvdG9jb2wgaWQgIiAuLiBzZWxmLkNPTVBBQ1RfUFJPVE9DT0xfSUQgLi4gIiBidXQgZ290ICIgLi4gcHJvdG9jb2xJZH0pCisgIGVuZAorICBsb2NhbCB2ZXJzaW9uQW5kVHlwZSA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgbG9jYWwgdmVyc2lvbiA9IGxpYmx1YWJpdHdpc2UuYmFuZCh2ZXJzaW9uQW5kVHlwZSwgc2VsZi5DT01QQUNUX1ZFUlNJT05fTUFTSykKKyAgbG9jYWwgdHR5cGUgPSBsaWJsdWFiaXR3aXNlLmJhbmQobGlibHVhYml0d2lzZS5zaGlmdHIodmVyc2lvbkFuZFR5cGUsCisgICAgc2VsZi5DT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSwgc2VsZi5DT01QQUNUX1RZUEVfQklUUykKKyAgaWYgdmVyc2lvbiB+PSBzZWxmLkNPTVBBQ1RfVkVSU0lPTiB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gIkV4cGVjdGVkIHZlcnNpb24gIiAuLiBzZWxmLkNPTVBBQ1RfVkVSU0lPTiAuLiAiIGJ1dCBnb3QgIiAuLiB2ZXJzaW9ufSkKKyAgZW5kCisgIGxvY2FsIHNlcWlkID0gc2VsZjpyZWFkVmFyaW50MzIoKQorICBsb2NhbCBuYW1lID0gc2VsZjpyZWFkU3RyaW5nKCkKKyAgcmV0dXJuIG5hbWUsIHR0eXBlLCBzZXFpZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZE1lc3NhZ2VFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFN0cnVjdEJlZ2luKCkKKyAgc2VsZi5sYXN0RmllbGRbc2VsZi5sYXN0RmllbGRJbmRleF0gPSBzZWxmLmxhc3RGaWVsZElkCisgIHNlbGYubGFzdEZpZWxkSW5kZXggPSBzZWxmLmxhc3RGaWVsZEluZGV4ICsgMQorICBzZWxmLmxhc3RGaWVsZElkID0gMAorICByZXR1cm4gbmlsCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU3RydWN0RW5kKCkKKyAgc2VsZi5sYXN0RmllbGRJbmRleCA9IHNlbGYubGFzdEZpZWxkSW5kZXggLSAxCisgIHNlbGYubGFzdEZpZWxkSWQgPSBzZWxmLmxhc3RGaWVsZFtzZWxmLmxhc3RGaWVsZEluZGV4XQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEZpZWxkQmVnaW4oKQorICBsb2NhbCBmaWVsZF9hbmRfdHR5cGUgPSBzZWxmOnJlYWRTaWduQnl0ZSgpCisgIGxvY2FsIHR0eXBlID0gc2VsZjpnZXRUVHlwZShmaWVsZF9hbmRfdHR5cGUpCisgIGlmIHR0eXBlID09IFRUeXBlLlNUT1AgdGhlbgorICAgIHJldHVybiBuaWwsIHR0eXBlLCAwCisgIGVuZAorICAtLSBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgIGxvY2FsIG1vZGlmaWVyID0gbGlibHVhYml0d2lzZS5zaGlmdHIobGlibHVhYml0d2lzZS5iYW5kKGZpZWxkX2FuZF90dHlwZSwgMHhmMCksIDQpCisgIGxvY2FsIGlkID0gMAorICBpZiBtb2RpZmllciA9PSAwIHRoZW4KKyAgICBpZCA9IHNlbGY6cmVhZEkxNigpCisgIGVsc2UKKyAgICBpZCA9IHNlbGYubGFzdEZpZWxkSWQgKyBtb2RpZmllcgorICBlbmQKKyAgaWYgdHR5cGUgPT0gVFR5cGUuQk9PTCB0aGVuCisgICAgYm9vbFZhbHVlID0gbGlibHVhYml0d2lzZS5iYW5kKGZpZWxkX2FuZF90dHlwZSwgMHgwZikgPT0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9UUlVFCisgICAgYm9vbFZhbHVlSXNOb3ROdWxsID0gdHJ1ZQorICBlbmQKKyAgc2VsZi5sYXN0RmllbGRJZCA9IGlkCisgIHJldHVybiBuaWwsIHR0eXBlLCBpZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEZpZWxkRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRNYXBCZWdpbigpCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRWYXJpbnQzMigpCisgIGlmIHNpemUgPCAwIHRoZW4KKyAgICByZXR1cm4gbmlsLG5pbCxuaWwKKyAgZW5kCisgIGxvY2FsIGt2dHlwZSA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgbG9jYWwga3R5cGUgPSBzZWxmOmdldFRUeXBlKGxpYmx1YWJpdHdpc2Uuc2hpZnRyKGt2dHlwZSwgNCkpCisgIGxvY2FsIHZ0eXBlID0gc2VsZjpnZXRUVHlwZShrdnR5cGUpCisgIHJldHVybiBrdHlwZSwgdnR5cGUsIHNpemUKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRNYXBFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZExpc3RCZWdpbigpCisgIGxvY2FsIHNpemVfYW5kX3R5cGUgPSBzZWxmOnJlYWRTaWduQnl0ZSgpCisgIGxvY2FsIHNpemUgPSBsaWJsdWFiaXR3aXNlLmJhbmQobGlibHVhYml0d2lzZS5zaGlmdHIoc2l6ZV9hbmRfdHlwZSwgNCksIDB4MGYpCisgIGlmIHNpemUgPT0gMTUgdGhlbgorICAgIHNpemUgPSBzZWxmOnJlYWRWYXJpbnQzMigpCisgIGVuZAorICBpZiBzaXplIDwgMCB0aGVuCisgICAgcmV0dXJuIG5pbCxuaWwKKyAgZW5kCisgIGxvY2FsIGV0eXBlID0gc2VsZjpnZXRUVHlwZShsaWJsdWFiaXR3aXNlLmJhbmQoc2l6ZV9hbmRfdHlwZSwgMHgwZikpCisgIHJldHVybiBldHlwZSwgc2l6ZQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZExpc3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFNldEJlZ2luKCkKKyAgcmV0dXJuIHNlbGY6cmVhZExpc3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU2V0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRCb29sKCkKKyAgaWYgYm9vbFZhbHVlSXNOb3ROdWxsIHRoZW4KKyAgICBib29sVmFsdWVJc05vdE51bGwgPSB0cnVlCisgICAgcmV0dXJuIGJvb2xWYWx1ZQorICBlbmQKKyAgbG9jYWwgdmFsID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBpZiB2YWwgPT0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9UUlVFIHRoZW4KKyAgICByZXR1cm4gdHJ1ZQorICBlbmQKKyAgcmV0dXJuIGZhbHNlCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkQnl0ZSgpCisgIGxvY2FsIGJ1ZmYgPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgbG9jYWwgdmFsID0gbGlibHVhYnBhY2suYnVucGFjaygnYycsIGJ1ZmYpCisgIHJldHVybiB2YWwKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTaWduQnl0ZSgpCisgIGxvY2FsIGJ1ZmYgPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgbG9jYWwgdmFsID0gbGlibHVhYnBhY2suYnVucGFjaygnQycsIGJ1ZmYpCisgIHJldHVybiB2YWwKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRJMTYoKQorICByZXR1cm4gc2VsZjpyZWFkSTMyKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRJMzIoKQorICBsb2NhbCB2ID0gc2VsZjpyZWFkVmFyaW50MzIoKQorICBsb2NhbCB2YWx1ZSA9IGxpYmx1YWJwYWNrLnppZ3phZ1RvSTMyKHYpCisgIHJldHVybiB2YWx1ZQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEk2NCgpCisgIGxvY2FsIHZhbHVlID0gc2VsZjpyZWFkVmFyaW50NjQoKQorICByZXR1cm4gdmFsdWUKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWREb3VibGUoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDgpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2QnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU3RyaW5nKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEJpbmFyeSgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkQmluYXJ5KCkKKyAgbG9jYWwgc2l6ZSA9IHNlbGY6cmVhZFZhcmludDMyKCkKKyAgaWYgc2l6ZSA8PSAwIHRoZW4KKyAgICByZXR1cm4gIiIKKyAgZW5kCisgIHJldHVybiBzZWxmLnRyYW5zOnJlYWRBbGwoc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRWYXJpbnQzMigpCisgIGxvY2FsIHNoaWZ0bCA9IDAKKyAgbG9jYWwgcmVzdWx0ID0gMAorICB3aGlsZSB0cnVlIGRvCisgICAgYiA9IHNlbGY6cmVhZEJ5dGUoKQorICAgIHJlc3VsdCA9IGxpYmx1YWJpdHdpc2UuYm9yKHJlc3VsdCwKKyAgICAgICAgICAgICBsaWJsdWFiaXR3aXNlLnNoaWZ0bChsaWJsdWFiaXR3aXNlLmJhbmQoYiwgMHg3ZiksIHNoaWZ0bCkpCisgICAgaWYgbGlibHVhYml0d2lzZS5iYW5kKGIsIDB4ODApIH49IDB4ODAgdGhlbgorICAgICAgYnJlYWsKKyAgICBlbmQKKyAgICBzaGlmdGwgPSBzaGlmdGwgKyA3CisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkVmFyaW50NjQoKQorICBsb2NhbCByZXN1bHQgPSBsaWJsdWFsb25nbnVtYmVyLm5ldworICBsb2NhbCBkYXRhID0gcmVzdWx0KDApCisgIGxvY2FsIHNoaWZ0bCA9IDAKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGIgPSBzZWxmOnJlYWRCeXRlKCkKKyAgICBlbmRGbGFnLCBkYXRhID0gbGlibHVhYnBhY2suZnJvbVZhcmludDY0KGIsIHNoaWZ0bCwgZGF0YSkKKyAgICBzaGlmdGwgPSBzaGlmdGwgKyA3CisgICAgaWYgZW5kRmxhZyA9PSAwIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZW5kCisgIGVuZAorICByZXR1cm4gZGF0YQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6Z2V0VFR5cGUoY3R5cGUpCisgIHJldHVybiBDb21wYWN0VHlwZVRvVFR5cGVbbGlibHVhYml0d2lzZS5iYW5kKGN0eXBlLCAweDBmKV0KK2VuZAorCitUQ29tcGFjdFByb3RvY29sRmFjdG9yeSA9IFRQcm90b2NvbEZhY3Rvcnk6bmV3eworICBfX3R5cGUgPSAnVENvbXBhY3RQcm90b2NvbEZhY3RvcnknLAorfQorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbCh0cmFucykKKyAgLS0gVE9ETyBFbmZvcmNlIHRoYXQgdGhpcyBtdXN0IGJlIGEgdHJhbnNwb3J0IGNsYXNzIChpZSBub3QgYSBib29sKQorICBpZiBub3QgdHJhbnMgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICdNdXN0IHN1cHBseSBhIHRyYW5zcG9ydCB0byAnIC4uIHR0eXBlKHNlbGYpCisgICAgfSkKKyAgZW5kCisgIHJldHVybiBUQ29tcGFjdFByb3RvY29sOm5ld3sKKyAgICB0cmFucyA9IHRyYW5zCisgIH0KK2VuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9URnJhbWVkVHJhbnNwb3J0Lmx1YSBiL2xpYi9sdWEvVEZyYW1lZFRyYW5zcG9ydC5sdWEKaW5kZXggNDM3YjcwMS4uNzY4ZTJkOSAxMDA2NDQKLS0tIGEvbGliL2x1YS9URnJhbWVkVHJhbnNwb3J0Lmx1YQorKysgYi9saWIvbHVhL1RGcmFtZWRUcmFuc3BvcnQubHVhCkBAIC0xMDAsNyArMTAwLDcgQEAKICAgbG9jYWwgdG1wID0gc2VsZi53QnVmCiAgIHNlbGYud0J1ZiA9ICcnCiAgIGxvY2FsIGZyYW1lX2xlbl9idWYgPSBsaWJsdWFicGFjay5icGFjaygiaSIsIHN0cmluZy5sZW4odG1wKSkKLSAgc2VsZi50cmFuczp3cml0ZShmcmFtZV9sZW5fYnVmKQorICB0bXAgPSBmcmFtZV9sZW5fYnVmIC4uIHRtcAogICBzZWxmLnRyYW5zOndyaXRlKHRtcCkKICAgc2VsZi50cmFuczpmbHVzaCgpCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVEh0dHBUcmFuc3BvcnQubHVhIGIvbGliL2x1YS9USHR0cFRyYW5zcG9ydC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1MWRiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVEh0dHBUcmFuc3BvcnQubHVhCkBAIC0wLDAgKzEsMTgyIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFRyYW5zcG9ydCcKKworVEh0dHBUcmFuc3BvcnQgPSBUVHJhbnNwb3J0QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdUSHR0cFRyYW5zcG9ydCcsCisgIHBhdGggPSAnLycsCisgIHdCdWYgPSAnJywKKyAgckJ1ZiA9ICcnLAorICBDUkxGID0gJ1xyXG4nLAorICBWRVJTSU9OID0gdmVyc2lvbiwKKyAgaXNTZXJ2ZXIgPSB0cnVlCit9CisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0Om5ldyhvYmopCisgIGlmIHR0eXBlKG9iaikgfj0gJ3RhYmxlJyB0aGVuCisgICAgZXJyb3IodHR5cGUoc2VsZikgLi4gJ211c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHRhYmxlJykKKyAgZW5kCisKKyAgLS0gRW5zdXJlIGEgdHJhbnNwb3J0IGlzIHByb3ZpZGVkCisgIGlmIG5vdCBvYmoudHJhbnMgdGhlbgorICAgIGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGEgdHJhbnMnKQorICBlbmQKKworICByZXR1cm4gVFRyYW5zcG9ydEJhc2UubmV3KHNlbGYsIG9iaikKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDppc09wZW4oKQorICByZXR1cm4gc2VsZi50cmFuczppc09wZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0Om9wZW4oKQorICByZXR1cm4gc2VsZi50cmFuczpvcGVuKCkKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpjbG9zZSgpCisgIHJldHVybiBzZWxmLnRyYW5zOmNsb3NlKCkKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpyZWFkQWxsKGxlbikKKyAgcmV0dXJuIHNlbGY6cmVhZChsZW4pCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6cmVhZChsZW4pCisgIGlmIHN0cmluZy5sZW4oc2VsZi5yQnVmKSA9PSAwIHRoZW4KKyAgICBzZWxmOl9yZWFkTXNnKCkKKyAgZW5kCisgIGlmIGxlbiA+IHN0cmluZy5sZW4oc2VsZi5yQnVmKSB0aGVuCisgICAgbG9jYWwgdmFsID0gc2VsZi5yQnVmCisgICAgc2VsZi5yQnVmID0gJycKKyAgICByZXR1cm4gdmFsCisgIGVuZAorCisgIGxvY2FsIHZhbCA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCAwLCBsZW4pCisgIHNlbGYuckJ1ZiA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCBsZW4rMSkKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0Ol9yZWFkTXNnKCkKKyAgd2hpbGUgdHJ1ZSBkbworICAgIHNlbGYuckJ1ZiA9IHNlbGYuckJ1ZiAuLiBzZWxmLnRyYW5zOnJlYWQoNCkKKyAgICBpZiBzdHJpbmcuZmluZChzZWxmLnJCdWYsIHNlbGYuQ1JMRiAuLiBzZWxmLkNSTEYpIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZW5kCisgIGVuZAorICBpZiBub3Qgc2VsZi5yQnVmIHRoZW4KKyAgICBzZWxmLnJCdWYgPSAiIgorICAgIHJldHVybgorICBlbmQKKyAgc2VsZjpnZXRMaW5lKCkKKyAgbG9jYWwgaGVhZGVycyA9IHNlbGY6X3BhcnNlSGVhZGVycygpCisgIGlmIG5vdCBoZWFkZXJzIHRoZW4KKyAgICBzZWxmLnJCdWYgPSAiIgorICAgIHJldHVybgorICBlbmQKKworICBsb2NhbCBsZW5ndGggPSB0b251bWJlcihoZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdKQorICBpZiBsZW5ndGggdGhlbgorICAgIGxlbmd0aCA9IGxlbmd0aCAtIHN0cmluZy5sZW4oc2VsZi5yQnVmKQorICAgIHNlbGYuckJ1ZiA9IHNlbGYuckJ1ZiAuLiBzZWxmLnRyYW5zOnJlYWRBbGwobGVuZ3RoKQorICBlbmQKKyAgaWYgc2VsZi5yQnVmID09IG5pbCB0aGVuCisgICAgc2VsZi5yQnVmID0gIiIKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6Z2V0TGluZSgpCisgIGxvY2FsIGEsYiA9IHN0cmluZy5maW5kKHNlbGYuckJ1Ziwgc2VsZi5DUkxGKQorICBsb2NhbCBsaW5lID0gIiIKKyAgaWYgYSBhbmQgYiB0aGVuCisgICAgbGluZSA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCAwLCBhLTEpCisgICAgc2VsZi5yQnVmID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIGIrMSkKKyAgZW5kCisgIHJldHVybiBsaW5lCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6X3BhcnNlSGVhZGVycygpCisgIGxvY2FsIGhlYWRlcnMgPSB7fQorCisgIHJlcGVhdAorICAgIGxvY2FsIGxpbmUgPSBzZWxmOmdldExpbmUoKQorICAgIGZvciBrZXksIHZhbCBpbiBzdHJpbmcuZ21hdGNoKGxpbmUsICIoWyV3JS1dKyklcyo6JXMqKC4rKSIpIGRvCisgICAgICBpZiBoZWFkZXJzW2tleV0gdGhlbgorICAgICAgICBsb2NhbCBkZWxpbWl0ZXIgPSAiLCAiCisgICAgICAgIGlmIGtleSA9PSAiU2V0LUNvb2tpZSIgdGhlbgorICAgICAgICAgIGRlbGltaXRlciA9ICI7ICIKKyAgICAgICAgZW5kCisgICAgICAgIGhlYWRlcnNba2V5XSA9IGhlYWRlcnNba2V5XSAuLiBkZWxpbWl0ZXIgLi4gdG9zdHJpbmcodmFsKQorICAgICAgZWxzZQorICAgICAgICBoZWFkZXJzW2tleV0gPSB0b3N0cmluZyh2YWwpCisgICAgICBlbmQKKyAgICBlbmQKKyAgdW50aWwgc3RyaW5nLmZpbmQobGluZSwgIl4lcyokIikKKworICByZXR1cm4gaGVhZGVycworZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OndyaXRlKGJ1ZiwgbGVuKQorICBpZiBsZW4gYW5kIGxlbiA8IHN0cmluZy5sZW4oYnVmKSB0aGVuCisgICAgYnVmID0gc3RyaW5nLnN1YihidWYsIDAsIGxlbikKKyAgZW5kCisgIHNlbGYud0J1ZiA9IHNlbGYud0J1ZiAuLiBidWYKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDp3cml0ZUh0dHBIZWFkZXIoY29udGVudF9sZW4pCisgIGlmIHNlbGYuaXNTZXJ2ZXIgdGhlbgorICAgIGxvY2FsIGhlYWRlciA9ICAiSFRUUC8xLjEgMjAwIE9LIiAuLiBzZWxmLkNSTEYKKyAgICAgIC4uICJTZXJ2ZXI6IFRocmlmdC8iIC4uIHNlbGYuVkVSU0lPTiAuLiBzZWxmLkNSTEYKKyAgICAgIC4uICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbnRlbnQtTGVuZ3RoOiAiIC4uIGNvbnRlbnRfbGVuIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbm5lY3Rpb246IEtlZXAtQWxpdmUiIC4uIHNlbGYuQ1JMRiAuLiBzZWxmLkNSTEYKKyAgICBzZWxmLnRyYW5zOndyaXRlKGhlYWRlcikKKyAgZWxzZQorICAgIGxvY2FsIGhlYWRlciA9ICJQT1NUICIgLi4gc2VsZi5wYXRoIC4uICIgSFRUUC8xLjEiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkhvc3Q6ICIgLi4gc2VsZi50cmFucy5ob3N0IC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbnRlbnQtTGVuZ3RoOiAiIC4uIGNvbnRlbnRfbGVuIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkFjY2VwdDogYXBwbGljYXRpb24veC10aHJpZnQgIiAuLiBzZWxmLkNSTEYKKyAgICAgIC4uICJVc2VyLUFnZW50OiBUaHJpZnQvIiAuLiBzZWxmLlZFUlNJT04gLi4gIiAoTHVhL1RIdHRwQ2xpZW50KSIKKyAgICAgIC4uIHNlbGYuQ1JMRiAuLiBzZWxmLkNSTEYKKyAgICBzZWxmLnRyYW5zOndyaXRlKGhlYWRlcikKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6Zmx1c2goKQorICAtLSBJZiB0aGUgd3JpdGUgZmFpbHMgd2Ugc3RpbGwgd2FudCB3QnVmIHRvIGJlIGNsZWFyCisgIGxvY2FsIHRtcCA9IHNlbGYud0J1ZgorICBzZWxmLndCdWYgPSAnJworICBzZWxmOndyaXRlSHR0cEhlYWRlcihzdHJpbmcubGVuKHRtcCkpCisgIHNlbGYudHJhbnM6d3JpdGUodG1wKQorICBzZWxmLnRyYW5zOmZsdXNoKCkKK2VuZAorCitUSHR0cFRyYW5zcG9ydEZhY3RvcnkgPSBUVHJhbnNwb3J0RmFjdG9yeUJhc2U6bmV3eworICBfX3R5cGUgPSAnVEh0dHBUcmFuc3BvcnRGYWN0b3J5JworfQorZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydCh0cmFucykKKyAgaWYgbm90IHRyYW5zIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAnTXVzdCBzdXBwbHkgYSB0cmFuc3BvcnQgdG8gJyAuLiB0dHlwZShzZWxmKQorICAgIH0pCisgIGVuZAorICByZXR1cm4gVEh0dHBUcmFuc3BvcnQ6bmV3e3RyYW5zID0gdHJhbnN9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVEpzb25Qcm90b2NvbC5sdWEgYi9saWIvbHVhL1RKc29uUHJvdG9jb2wubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDhlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RKc29uUHJvdG9jb2wubHVhCkBAIC0wLDAgKzEsNzI3IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIiksIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFByb3RvY29sJworcmVxdWlyZSAnbGlibHVhYnBhY2snCityZXF1aXJlICdsaWJsdWFiaXR3aXNlJworCitUSlNPTlByb3RvY29sID0gX19UT2JqZWN0Lm5ldyhUUHJvdG9jb2xCYXNlLCB7CisgIF9fdHlwZSA9ICdUSlNPTlByb3RvY29sJywKKyAgVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTiA9IDEsCisgIGpzb25Db250ZXh0ID0ge30sCisgIGpzb25Db250ZXh0VmFsID0ge2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDIsIG51bGwgPSB0cnVlfSwKKyAganNvbkNvbnRleHRJbmRleCA9IDEsCisgIGhhc1JlYWRCeXRlID0gIiIKK30pCisKK1RUeXBlVG9TdHJpbmcgPSB7fQorVFR5cGVUb1N0cmluZ1tUVHlwZS5CT09MXSAgID0gInRmIgorVFR5cGVUb1N0cmluZ1tUVHlwZS5CWVRFXSAgID0gImk4IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5JMTZdICAgID0gImkxNiIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuSTMyXSAgICA9ICJpMzIiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkk2NF0gICAgPSAiaTY0IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5ET1VCTEVdID0gImRibCIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuU1RSSU5HXSA9ICJzdHIiCitUVHlwZVRvU3RyaW5nW1RUeXBlLlNUUlVDVF0gPSAicmVjIgorVFR5cGVUb1N0cmluZ1tUVHlwZS5MSVNUXSAgID0gImxzdCIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuU0VUXSAgICA9ICJzZXQiCitUVHlwZVRvU3RyaW5nW1RUeXBlLk1BUF0gICAgPSAibWFwIgorCitTdHJpbmdUb1RUeXBlID0geworICB0ZiAgPSBUVHlwZS5CT09MLAorICBpOCAgPSBUVHlwZS5CWVRFLAorICBpMTYgPSBUVHlwZS5JMTYsCisgIGkzMiA9IFRUeXBlLkkzMiwKKyAgaTY0ID0gVFR5cGUuSTY0LAorICBkYmwgPSBUVHlwZS5ET1VCTEUsCisgIHN0ciA9IFRUeXBlLlNUUklORywKKyAgcmVjID0gVFR5cGUuU1RSVUNULAorICBtYXAgPSBUVHlwZS5NQVAsCisgIHNldCA9IFRUeXBlLlNFVCwKKyAgbHN0ID0gVFR5cGUuTElTVAorfQorCitKU09OTm9kZSA9IHsKKyAgT2JqZWN0QmVnaW4gPSAneycsCisgIE9iamVjdEVuZCA9ICd9JywKKyAgQXJyYXlCZWdpbiA9ICdbJywKKyAgQXJyYXlFbmQgPSAnXScsCisgIFBhaXJTZXBhcmF0b3IgPSAnOicsCisgIEVsZW1TZXBhcmF0b3IgPSAnLCcsCisgIEJhY2tzbGFzaCA9ICdcXCcsCisgIFN0cmluZ0RlbGltaXRlciA9ICciJywKKyAgWmVyb0NoYXIgPSAnMCcsCisgIEVzY2FwZUNoYXIgPSAndScsCisgIE5hbiA9ICdOYU4nLAorICBJbmZpbml0eSA9ICdJbmZpbml0eScsCisgIE5lZ2F0aXZlSW5maW5pdHkgPSAnLUluZmluaXR5JywKKyAgRXNjYXBlQ2hhcnMgPSAiXCJcXGJmbnJ0IiwKKyAgRXNjYXBlUHJlZml4ID0gIlxcdTAwIgorfQorCitFc2NhcGVDaGFyVmFscyA9IHsKKyAgJyInLCAnXFwnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnCit9CisKK0pTT05DaGFyVGFibGUgPSB7CisgIC0tMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRgorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCA5OCwxMTYsMTEwLCAgMCwxMDIsMTE0LCAgMCwgIDAsCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAxLCAgMSwzNCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCit9CisKKy0tIGNoYXJhY3RlciB0YWJsZSBzdHJpbmcKK2xvY2FsIGI9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nCisKKy0tIGVuY29kaW5nCitmdW5jdGlvbiBiYXNlNjRfZW5jb2RlKGRhdGEpCisgICAgcmV0dXJuICgoZGF0YTpnc3ViKCcuJywgZnVuY3Rpb24oeCkgCisgICAgICAgIGxvY2FsIHIsYj0nJyx4OmJ5dGUoKQorICAgICAgICBmb3IgaT04LDEsLTEgZG8gcj1yLi4oYiUyXmktYiUyXihpLTEpPjAgYW5kICcxJyBvciAnMCcpIGVuZAorICAgICAgICByZXR1cm4gcjsKKyAgICBlbmQpLi4nMDAwMCcpOmdzdWIoJyVkJWQlZD8lZD8lZD8lZD8nLCBmdW5jdGlvbih4KQorICAgICAgICBpZiAoI3ggPCA2KSB0aGVuIHJldHVybiAnJyBlbmQKKyAgICAgICAgbG9jYWwgYz0wCisgICAgICAgIGZvciBpPTEsNiBkbyBjPWMrKHg6c3ViKGksaSk9PScxJyBhbmQgMl4oNi1pKSBvciAwKSBlbmQKKyAgICAgICAgcmV0dXJuIGI6c3ViKGMrMSxjKzEpCisgICAgZW5kKS4uKHsgJycsICc9PScsICc9JyB9KVsjZGF0YSUzKzFdKQorZW5kCisKKy0tIGRlY29kaW5nCitmdW5jdGlvbiBiYXNlNjRfZGVjb2RlKGRhdGEpCisgICAgZGF0YSA9IHN0cmluZy5nc3ViKGRhdGEsICdbXicuLmIuLic9XScsICcnKQorICAgIHJldHVybiAoZGF0YTpnc3ViKCcuJywgZnVuY3Rpb24oeCkKKyAgICAgICAgaWYgKHggPT0gJz0nKSB0aGVuIHJldHVybiAnJyBlbmQKKyAgICAgICAgbG9jYWwgcixmPScnLChiOmZpbmQoeCktMSkKKyAgICAgICAgZm9yIGk9NiwxLC0xIGRvIHI9ci4uKGYlMl5pLWYlMl4oaS0xKT4wIGFuZCAnMScgb3IgJzAnKSBlbmQKKyAgICAgICAgcmV0dXJuIHI7CisgICAgZW5kKTpnc3ViKCclZCVkJWQ/JWQ/JWQ/JWQ/JWQ/JWQ/JywgZnVuY3Rpb24oeCkKKyAgICAgICAgaWYgKCN4IH49IDgpIHRoZW4gcmV0dXJuICcnIGVuZAorICAgICAgICBsb2NhbCBjPTAKKyAgICAgICAgZm9yIGk9MSw4IGRvIGM9YysoeDpzdWIoaSxpKT09JzEnIGFuZCAyXig4LWkpIG9yIDApIGVuZAorICAgICAgICByZXR1cm4gc3RyaW5nLmNoYXIoYykKKyAgICBlbmQpKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVzZXRDb250ZXh0KCkKKyAgc2VsZi5qc29uQ29udGV4dCA9IHt9CisgIHNlbGYuanNvbkNvbnRleHRWYWwgPSB7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMiwgbnVsbCA9IHRydWV9CisgIHNlbGYuanNvbkNvbnRleHRJbmRleCA9IDEKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOmNvbnRleHRQdXNoKGNvbnRleHQpCisgIHNlbGYuanNvbkNvbnRleHRJbmRleCA9IHNlbGYuanNvbkNvbnRleHRJbmRleCArIDEKKyAgc2VsZi5qc29uQ29udGV4dFtzZWxmLmpzb25Db250ZXh0SW5kZXhdID0gc2VsZi5qc29uQ29udGV4dFZhbAorICBzZWxmLmpzb25Db250ZXh0VmFsID0gY29udGV4dAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6Y29udGV4dFBvcCgpCisgIHNlbGYuanNvbkNvbnRleHRWYWwgPSBzZWxmLmpzb25Db250ZXh0W3NlbGYuanNvbkNvbnRleHRJbmRleF0KKyAgc2VsZi5qc29uQ29udGV4dEluZGV4ID0gc2VsZi5qc29uQ29udGV4dEluZGV4IC0gMQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6ZXNjYXBlTnVtKCkKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC50dHlwZSA9PSAxIHRoZW4KKyAgICByZXR1cm4gc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbgorICBlbHNlCisgICAgcmV0dXJuIGZhbHNlCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5udWxsIHRoZW4KKyAgICByZXR1cm4KKyAgZW5kCisgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgdGhlbgorICAgIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgPSBmYWxzZQorICBlbHNlCisgICAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC50dHlwZSA9PSAxIHRoZW4KKyAgICAgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gdGhlbgorICAgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlBhaXJTZXBhcmF0b3IpCisgICAgICAgIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gPSBmYWxzZQorICAgICAgZWxzZQorICAgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkVsZW1TZXBhcmF0b3IpCisgICAgICAgIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gPSB0cnVlCisgICAgICBlbmQKKyAgICBlbHNlCisgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkVsZW1TZXBhcmF0b3IpCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6aGV4Q2hhcih2YWwpCisgIHZhbCA9IGxpYmx1YWJpdHdpc2UuYmFuZCh2YWwsIDB4MGYpCisgIGlmIHZhbCA8IDEwIHRoZW4KKyAgICByZXR1cm4gdmFsICsgNDgKKyAgZWxzZQorICAgIHJldHVybiB2YWwgKyA4NworICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkVzY2FwZUNoYXIoY2gpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuRXNjYXBlUHJlZml4KQorICBsb2NhbCBvdXRDaCA9IGhleENoYXIobGlibHVhYml0d2lzZS5zaGlmdHIoY2gsIDQpKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2MnLCBvdXRDaCkKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorICBvdXRDaCA9IGhleENoYXIoY2gpCisgIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIG91dENoKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05DaGFyKGJ5dGUpCisgIGNoID0gc3RyaW5nLmJ5dGUoYnl0ZSkKKyAgaWYgY2ggPj0gMHgzMCB0aGVuCisgICAgaWYgY2ggPT0gSlNPTk5vZGUuQmFja3NsYXNoIHRoZW4KKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuQmFja3NsYXNoKQorICAgICAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5CYWNrc2xhc2gpCisgICAgZWxzZQorICAgICAgc2VsZi50cmFuczp3cml0ZShieXRlKQorICAgIGVuZAorICBlbHNlCisgICAgbG9jYWwgb3V0Q2ggPSBKU09OQ2hhclRhYmxlW2NoKzFdCisgICAgaWYgb3V0Q2ggPT0gMSB0aGVuCisgICAgICBzZWxmLnRyYW5zOndyaXRlKGJ5dGUpCisgICAgZWxzZWlmIG91dENoID4gMSB0aGVuCisgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkJhY2tzbGFzaCkKKyAgICAgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIG91dENoKQorICAgICAgc2VsZi50cmFuczp3cml0ZShidWZmKQorICAgIGVsc2UKKyAgICAgIHNlbGY6d3JpdGVKU09ORXNjYXBlQ2hhcihjaCkKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05TdHJpbmcoc3RyKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICAtLSBUT0RPIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgbG9jYWwgbGVuZ3RoID0gc3RyaW5nLmxlbihzdHIpCisgIGxvY2FsIGlpID0gMQorICB3aGlsZSBpaSA8PSBsZW5ndGggZG8KKyAgICBzZWxmOndyaXRlSlNPTkNoYXIoc3RyaW5nLnN1YihzdHIsIGlpLCBpaSkpCisgICAgaWkgPSBpaSArIDEKKyAgZW5kCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09OQmFzZTY0KHN0cikKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgbG9jYWwgbGVuZ3RoID0gc3RyaW5nLmxlbihzdHIpCisgIGxvY2FsIG9mZnNldCA9IDEKKyAgd2hpbGUgbGVuZ3RoID49IDMgZG8KKyAgICAtLSBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKKyAgICBsb2NhbCBieXRlcyA9IGJhc2U2NF9lbmNvZGUoc3RyaW5nLnN1YihzdHIsIG9mZnNldCwgb2Zmc2V0KzMpKQorICAgIHNlbGYudHJhbnM6d3JpdGUoYnl0ZXMpCisgICAgbGVuZ3RoID0gbGVuZ3RoIC0gMworICAgIG9mZnNldCA9IG9mZnNldCArIDMKKyAgZW5kCisgIGlmIGxlbmd0aCA+IDAgdGhlbgorICAgIGxvY2FsIGJ5dGVzID0gYmFzZTY0X2VuY29kZShzdHJpbmcuc3ViKHN0ciwgb2Zmc2V0LCBvZmZzZXQrbGVuZ3RoKSkKKyAgICBzZWxmLnRyYW5zOndyaXRlKGJ5dGVzKQorICBlbmQKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05JbnRlZ2VyKG51bSkKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBpZiBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCisgIGxvY2FsIG51bXN0ciA9ICIiIC4uIG51bQorICBudW1zdHIgPSBzdHJpbmcuc3ViKG51bXN0ciwgc3RyaW5nLmZpbmQobnVtc3RyLCAiXlsrLV0/JWQrIikpCisgIHNlbGYudHJhbnM6d3JpdGUobnVtc3RyKQorICBpZiBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05Eb3VibGUoZHViKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIGxvY2FsIHZhbCA9ICIiIC4uIGR1YgorICBsb2NhbCBwcmVmaXggPSBzdHJpbmcuc3ViKHZhbCwgMSwgMSkKKyAgbG9jYWwgc3BlY2lhbCA9IGZhbHNlCisgIGlmIHByZWZpeCA9PSAnTicgb3IgcHJlZml4ID09ICduJyB0aGVuCisgICAgdmFsID0gSlNPTk5vZGUuTmFuCisgICAgc3BlY2lhbCA9IHRydWUKKyAgZWxzZWlmIHByZWZpeCA9PSAnSScgb3IgcHJlZml4ID09ICdpJyB0aGVuCisgICAgdmFsID0gSlNPTk5vZGUuSW5maW5pdHkKKyAgICBzcGVjaWFsID0gdHJ1ZQorICBlbHNlaWYgcHJlZml4ID09ICctJyB0aGVuCisgICAgbG9jYWwgc2Vjb25kQnl0ZSA9IHN0cmluZy5zdWIodmFsLCAyLCAyKQorICAgIGlmIHNlY29uZEJ5dGUgPT0gJ0knIG9yIHNlY29uZEJ5dGUgPT0gJ2knIHRoZW4KKyAgICAgIHZhbCA9IEpTT05Ob2RlLk5lZ2F0aXZlSW5maW5pdHkKKyAgICAgIHNwZWNpYWwgPSB0cnVlCisgICAgZW5kCisgIGVuZAorCisgIGlmIHNwZWNpYWwgb3Igc2VsZjplc2NhcGVOdW0oKSB0aGVuCisgICAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIGVuZAorICBzZWxmLnRyYW5zOndyaXRlKHZhbCkKKyAgaWYgc3BlY2lhbCBvciBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05PYmplY3RCZWdpbigpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5PYmplY3RCZWdpbikKKyAgc2VsZjpjb250ZXh0UHVzaCh7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMSwgbnVsbCA9IGZhbHNlfSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTk9iamVjdEVuZCgpCisgIHNlbGY6Y29udGV4dFBvcCgpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuT2JqZWN0RW5kKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09OQXJyYXlCZWdpbigpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5BcnJheUJlZ2luKQorICBzZWxmOmNvbnRleHRQdXNoKHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAyLCBudWxsID0gZmFsc2V9KQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09OQXJyYXlFbmQoKQorICBzZWxmOmNvbnRleHRQb3AoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkFycmF5RW5kKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHR5cGUsIHNlcWlkKQorICBzZWxmOnJlc2V0Q29udGV4dCgpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlCZWdpbigpCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihUSlNPTlByb3RvY29sLlRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04pCisgIHNlbGY6d3JpdGVKU09OU3RyaW5nKG5hbWUpCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcih0dHlwZSkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHNlcWlkKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVNZXNzYWdlRW5kKCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVN0cnVjdEJlZ2luKG5hbWUpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0QmVnaW4oKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVTdHJ1Y3RFbmQoKQorICBzZWxmOndyaXRlSlNPTk9iamVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUZpZWxkQmVnaW4obmFtZSwgdHR5cGUsIGlkKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIoaWQpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0QmVnaW4oKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhUVHlwZVRvU3RyaW5nW3R0eXBlXSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRmllbGRFbmQoKQorICBzZWxmOndyaXRlSlNPTk9iamVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUZpZWxkU3RvcCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1trdHlwZV0pCisgIHNlbGY6d3JpdGVKU09OU3RyaW5nKFRUeXBlVG9TdHJpbmdbdnR5cGVdKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIoc2l6ZSkKKyAgcmV0dXJuIHNlbGY6d3JpdGVKU09OT2JqZWN0QmVnaW4oKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVNYXBFbmQoKQorICBzZWxmOndyaXRlSlNPTk9iamVjdEVuZCgpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVMaXN0QmVnaW4oZXR5cGUsIHNpemUpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlCZWdpbigpCisgIHNlbGY6d3JpdGVKU09OU3RyaW5nKFRUeXBlVG9TdHJpbmdbZXR5cGVdKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIoc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlTGlzdEVuZCgpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVTZXRCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1tldHlwZV0pCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVTZXRFbmQoKQorICBzZWxmOndyaXRlSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlQm9vbChib29sKQorICBpZiBib29sIHRoZW4KKyAgICBzZWxmOndyaXRlSlNPTkludGVnZXIoMSkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVKU09OSW50ZWdlcigwKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlQnl0ZShieXRlKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2MnLCBieXRlKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdjJywgYnVmZikKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHZhbCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSTE2KGkxNikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdzJywgaTE2KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdzJywgYnVmZikKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHZhbCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSTMyKGkzMikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdpJywgaTMyKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdpJywgYnVmZikKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHZhbCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSTY0KGk2NCkKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdsJywgaTY0KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdsJywgYnVmZikKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHRvc3RyaW5nKHZhbCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZURvdWJsZShkdWIpCisgIHNlbGY6d3JpdGVKU09ORG91YmxlKHN0cmluZy5mb3JtYXQoIiUuMTZmIiwgZHViKSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlU3RyaW5nKHN0cikKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVCaW5hcnkoc3RyKQorICAtLSBTaG91bGQgYmUgdXRmLTgKKyAgc2VsZjp3cml0ZUpTT05CYXNlNjQoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05TeW50YXhDaGFyKGNoKQorICBsb2NhbCBjaDIgPSAiIgorICBpZiBzZWxmLmhhc1JlYWRCeXRlIH49ICIiIHRoZW4KKyAgICBjaDIgPSBzZWxmLmhhc1JlYWRCeXRlCisgICAgc2VsZi5oYXNSZWFkQnl0ZSA9ICIiCisgIGVsc2UKKyAgICBjaDIgPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgZW5kCisgIGlmIGNoMiB+PSBjaCB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJFeHBlY3RlZCAiLi4gY2ggLi4gIiwgZ290ICIgLi4gY2gyfSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRWxlbVNlcGFyYXRvcigpCisgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwubnVsbCB0aGVuCisgICAgcmV0dXJuCisgIGVuZAorICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLmZpcnN0IHRoZW4KKyAgICBzZWxmLmpzb25Db250ZXh0VmFsLmZpcnN0ID0gZmFsc2UKKyAgZWxzZQorICAgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwudHR5cGUgPT0gMSB0aGVuCisgICAgICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLmNvbG9uIHRoZW4KKyAgICAgICAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuUGFpclNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IGZhbHNlCisgICAgICBlbHNlCisgICAgICAgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkVsZW1TZXBhcmF0b3IpCisgICAgICAgIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gPSB0cnVlCisgICAgICBlbmQKKyAgICBlbHNlCisgICAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5FbGVtU2VwYXJhdG9yKQorICAgIGVuZAorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOmhleFZhbChjaCkKKyAgbG9jYWwgdmFsID0gc3RyaW5nLmJ5dGUoY2gpCisgIGlmIHZhbCA+PSA0OCBhbmQgdmFsIDw9IDU3IHRoZW4KKyAgICByZXR1cm4gdmFsIC0gNDgKKyAgZWxzZWlmIHZhbCA+PSA5NyBhbmQgdmFsIDw9IDEwMiB0aGVuCisgICAgcmV0dXJuIHZhbCAtIDg3CisgIGVsc2UKKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gIkV4cGVjdGVkIGhleCB2YWwgKFswLTlhLWZdKTsgZ290ICIgLi4gY2h9KQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09ORXNjYXBlQ2hhcihjaCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuWmVyb0NoYXIpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLlplcm9DaGFyKQorICBsb2NhbCBiMSA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBsb2NhbCBiMiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICByZXR1cm4gbGlibHVhYml0d2lzZS5zaGlmdGwoc2VsZjpoZXhWYWwoYjEpLCA0KSArIHNlbGY6aGV4VmFsKGIyKQorZW5kCisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTlN0cmluZygpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIGxvY2FsIHJlc3VsdCA9ICIiCisgIHdoaWxlIHRydWUgZG8KKyAgICBsb2NhbCBjaCA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICAgIGlmIGNoID09IEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlciB0aGVuCisgICAgICBicmVhaworICAgIGVuZAorICAgIGlmIGNoID09IEpTT05Ob2RlLkJhY2tzbGFzaCB0aGVuCisgICAgICBjaCA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICAgICAgaWYgY2ggPT0gSlNPTk5vZGUuRXNjYXBlQ2hhciB0aGVuCisgICAgICAgIHNlbGY6cmVhZEpTT05Fc2NhcGVDaGFyKGNoKQorICAgICAgZWxzZQorICAgICAgICBsb2NhbCBwb3MsIF8gPSBzdHJpbmcuZmluZChKU09OTm9kZS5Fc2NhcGVDaGFycywgY2gpCisgICAgICAgIGlmIHBvcyA9PSBuaWwgdGhlbgorICAgICAgICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3e21lc3NhZ2UgPSAiRXhwZWN0ZWQgY29udHJvbCBjaGFyLCBnb3QgIiAuLiBjaH0pCisgICAgICAgIGVuZAorICAgICAgICBjaCA9IEVzY2FwZUNoYXJWYWxzW3Bvc10KKyAgICAgIGVuZAorICAgIGVuZAorICAgIHJlc3VsdCA9IHJlc3VsdCAuLiBjaAorICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05CYXNlNjQoKQorICBsb2NhbCByZXN1bHQgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgbG9jYWwgbGVuZ3RoID0gc3RyaW5nLmxlbihyZXN1bHQpCisgIGxvY2FsIHN0ciA9ICIiCisgIGxvY2FsIG9mZnNldCA9IDEKKyAgd2hpbGUgbGVuZ3RoID49IDQgZG8KKyAgICBsb2NhbCBieXRlcyA9IHN0cmluZy5zdWIocmVzdWx0LCBvZmZzZXQsIG9mZnNldCs0KQorICAgIHN0ciA9IHN0ciAuLiBiYXNlNjRfZGVjb2RlKGJ5dGVzKQorICAgIG9mZnNldCA9IG9mZnNldCArIDQKKyAgICBsZW5ndGggPSBsZW5ndGggLSA0CisgIGVuZAorICBpZiBsZW5ndGggPj0gMCB0aGVuCisgICAgc3RyID0gc3RyIC4uIGJhc2U2NF9kZWNvZGUoc3RyaW5nLnN1YihyZXN1bHQsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSkKKyAgZW5kCisgIHJldHVybiBzdHIKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OTnVtZXJpY0NoYXJzKCkKKyAgbG9jYWwgcmVzdWx0ID0gIiIKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGxvY2FsIGNoID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgICAgaWYgc3RyaW5nLmZpbmQoY2gsICdbLSswLTkuRWVdJykgdGhlbgorICAgICAgcmVzdWx0ID0gcmVzdWx0IC4uIGNoCisgICAgZWxzZQorICAgICAgc2VsZi5oYXNSZWFkQnl0ZSA9IGNoCisgICAgICBicmVhaworICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05Mb25nSW50ZWdlcigpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBpZiBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIGVuZAorICBsb2NhbCByZXN1bHQgPSBzZWxmOnJlYWRKU09OTnVtZXJpY0NoYXJzKCkKKyAgaWYgc2VsZjplc2NhcGVOdW0oKSB0aGVuCisgICAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05JbnRlZ2VyKCkKKyAgcmV0dXJuIHRvbnVtYmVyKHNlbGY6cmVhZEpTT05Mb25nSW50ZWdlcigpKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05Eb3VibGUoKQorICBzZWxmOnJlYWRFbGVtU2VwYXJhdG9yKCkKKyAgbG9jYWwgZGVsaW1pdGVyID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIGxvY2FsIG51bSA9IDAuMAorICBpZiBkZWxpbWl0ZXIgPT0gSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyIHRoZW4KKyAgICBsb2NhbCBzdHIgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgICBpZiBzdHIgPT0gSlNPTk5vZGUuTmFuIHRoZW4KKyAgICAgIG51bSA9IDEuMAorICAgIGVsc2VpZiBzdHIgPT0gSlNPTk5vZGUuSW5maW5pdHkgdGhlbgorICAgICAgbnVtID0gbWF0aC5tYXhpbnRlZ2VyCisgICAgZWxzZWlmIHN0ciA9PSBKU09OTm9kZS5OZWdhdGl2ZUluZmluaXR5IHRoZW4KKyAgICAgIG51bSA9IG1hdGgubWluaW50ZWdlcgorICAgIGVsc2UKKyAgICAgIG51bSA9IHRvbnVtYmVyKHN0cikKKyAgICBlbmQKKyAgZWxzZQorICAgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgICAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICAgIGVuZAorICAgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgIG51bSA9IHRvbnVtYmVyKGRlbGltaXRlci4uIHJlc3VsdCkKKyAgZW5kCisgIHJldHVybiBudW0KK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OT2JqZWN0QmVnaW4oKQorICBzZWxmOnJlYWRFbGVtU2VwYXJhdG9yKCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuT2JqZWN0QmVnaW4pCisgIHNlbGY6Y29udGV4dFB1c2goe2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDEsIG51bGwgPSBmYWxzZX0pCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTk9iamVjdEVuZCgpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLk9iamVjdEVuZCkKKyAgc2VsZjpjb250ZXh0UG9wKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5BcnJheUJlZ2luKQorICBzZWxmOmNvbnRleHRQdXNoKHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAyLCBudWxsID0gZmFsc2V9KQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05BcnJheUVuZCgpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkFycmF5RW5kKQorICBzZWxmOmNvbnRleHRQb3AoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZE1lc3NhZ2VCZWdpbigpCisgIHNlbGY6cmVzZXRDb250ZXh0KCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5QmVnaW4oKQorICBsb2NhbCB2ZXJzaW9uID0gc2VsZjpyZWFkSlNPTkludGVnZXIoKQorICBpZiB2ZXJzaW9uIH49IHNlbGYuVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTiB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4ifSkKKyAgZW5kCisgIGxvY2FsIG5hbWUgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgbG9jYWwgdHR5cGUgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIGxvY2FsIHNlcWlkID0gc2VsZjpyZWFkSlNPTkludGVnZXIoKQorICByZXR1cm4gbmFtZSwgdHR5cGUsIHNlcWlkCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTWVzc2FnZUVuZCgpCisgIHNlbGY6cmVhZEpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkU3RydWN0QmVnaW4oKQorICBzZWxmOnJlYWRKU09OT2JqZWN0QmVnaW4oKQorICByZXR1cm4gbmlsCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkU3RydWN0RW5kKCkKKyAgc2VsZjpyZWFkSlNPTk9iamVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRmllbGRCZWdpbigpCisgIGxvY2FsIHR0eXBlID0gVFR5cGUuU1RPUAorICBsb2NhbCBpZCA9IDAKKyAgbG9jYWwgY2ggPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgc2VsZi5oYXNSZWFkQnl0ZSA9IGNoCisgIGlmIGNoIH49IEpTT05Ob2RlLk9iamVjdEVuZCB0aGVuCisgICAgaWQgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgICAgc2VsZjpyZWFkSlNPTk9iamVjdEJlZ2luKCkKKyAgICBsb2NhbCB0eXBlTmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICAgIHR0eXBlID0gU3RyaW5nVG9UVHlwZVt0eXBlTmFtZV0KKyAgZW5kCisgIHJldHVybiBuaWwsIHR0eXBlLCBpZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEZpZWxkRW5kKCkKKyAgc2VsZjpyZWFkSlNPTk9iamVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTWFwQmVnaW4oKQorICBzZWxmOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIGxvY2FsIHR5cGVOYW1lID0gc2VsZjpyZWFkSlNPTlN0cmluZygpCisgIGxvY2FsIGt0eXBlID0gU3RyaW5nVG9UVHlwZVt0eXBlTmFtZV0KKyAgdHlwZU5hbWUgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgbG9jYWwgdnR5cGUgPSBTdHJpbmdUb1RUeXBlW3R5cGVOYW1lXQorICBsb2NhbCBzaXplID0gc2VsZjpyZWFkSlNPTkludGVnZXIoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0QmVnaW4oKQorICByZXR1cm4ga3R5cGUsIHZ0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTWFwRW5kKCkKKyAgc2VsZjpyZWFkSlNPTk9iamVjdEVuZCgpCisgIHNlbGY6cmVhZEpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTGlzdEJlZ2luKCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5QmVnaW4oKQorICBsb2NhbCB0eXBlTmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCBldHlwZSA9IFN0cmluZ1RvVFR5cGVbdHlwZU5hbWVdCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIHJldHVybiBldHlwZSwgc2l6ZQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZExpc3RFbmQoKQorICByZXR1cm4gc2VsZjpyZWFkSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTZXRCZWdpbigpCisgIHJldHVybiBzZWxmOnJlYWRMaXN0QmVnaW4oKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZFNldEVuZCgpCisgIHJldHVybiBzZWxmOnJlYWRKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEJvb2woKQorICBsb2NhbCByZXN1bHQgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIGlmIHJlc3VsdCA9PSAxIHRoZW4KKyAgICByZXR1cm4gdHJ1ZQorICBlbHNlCisgICAgcmV0dXJuIGZhbHNlCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEJ5dGUoKQorICBsb2NhbCByZXN1bHQgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIGlmIHJlc3VsdCA+PSAyNTYgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3e21lc3NhZ2UgPSAiVW5FeHBlY3RlZCBCeXRlICIgLi4gcmVzdWx0fSkKKyAgZW5kCisgIHJldHVybiByZXN1bHQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRJMTYoKQorICByZXR1cm4gc2VsZjpyZWFkSlNPTkludGVnZXIoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEkzMigpCisgIHJldHVybiBzZWxmOnJlYWRKU09OSW50ZWdlcigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSTY0KCkKKyAgbG9jYWwgbG9uZyA9IGxpYmx1YWxvbmdudW1iZXIubmV3CisgIHJldHVybiBsb25nKHNlbGY6cmVhZEpTT05Mb25nSW50ZWdlcigpKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZERvdWJsZSgpCisgIHJldHVybiBzZWxmOnJlYWRKU09ORG91YmxlKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTdHJpbmcoKQorICByZXR1cm4gc2VsZjpyZWFkSlNPTlN0cmluZygpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkQmluYXJ5KCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05CYXNlNjQoKQorZW5kCisKK1RKU09OUHJvdG9jb2xGYWN0b3J5ID0gVFByb3RvY29sRmFjdG9yeTpuZXd7CisgIF9fdHlwZSA9ICdUSlNPTlByb3RvY29sRmFjdG9yeScsCit9CisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKHRyYW5zKQorICAtLSBUT0RPIEVuZm9yY2UgdGhhdCB0aGlzIG11c3QgYmUgYSB0cmFuc3BvcnQgY2xhc3MgKGllIG5vdCBhIGJvb2wpCisgIGlmIG5vdCB0cmFucyB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ011c3Qgc3VwcGx5IGEgdHJhbnNwb3J0IHRvICcgLi4gdHR5cGUoc2VsZikKKyAgICB9KQorICBlbmQKKyAgcmV0dXJuIFRKU09OUHJvdG9jb2w6bmV3eworICAgIHRyYW5zID0gdHJhbnMKKyAgfQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RQcm90b2NvbC5sdWEgYi9saWIvbHVhL1RQcm90b2NvbC5sdWEKaW5kZXggNjE2ZTE2Ny4uMTMwNmZiMyAxMDA2NDQKLS0tIGEvbGliL2x1YS9UUHJvdG9jb2wubHVhCisrKyBiL2xpYi9sdWEvVFByb3RvY29sLmx1YQpAQCAtMTA3LDkgKzEwNyw3IEBACiBmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRTdHJpbmcoKSBlbmQKIAogZnVuY3Rpb24gVFByb3RvY29sQmFzZTpza2lwKHR0eXBlKQotICBpZiB0eXBlID09IFRUeXBlLlNUT1AgdGhlbgotICAgIHJldHVybgotICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuQk9PTCB0aGVuCisgIGlmIHR0eXBlID09IFRUeXBlLkJPT0wgdGhlbgogICAgIHNlbGY6cmVhZEJvb2woKQogICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuQllURSB0aGVuCiAgICAgc2VsZjpyZWFkQnl0ZSgpCkBAIC0xNTMsNiArMTUxLDEwIEBACiAgICAgICBzZWxmOnNraXAoZXR0eXBlKQogICAgIGVuZAogICAgIHNlbGY6cmVhZExpc3RFbmQoKQorICBlbHNlCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ0ludmFsaWQgZGF0YScKKyAgICB9KQogICBlbmQKIGVuZAogCmRpZmYgLS1naXQgYS9saWIvbHVhL1RTZXJ2ZXIubHVhIGIvbGliL2x1YS9UU2VydmVyLmx1YQppbmRleCBkNmI5Y2QwLi40ZTM3ZDU4IDEwMDY0NAotLS0gYS9saWIvbHVhL1RTZXJ2ZXIubHVhCisrKyBiL2xpYi9sdWEvVFNlcnZlci5sdWEKQEAgLTkzLDE1ICs5MywxNiBAQAogCiBmdW5jdGlvbiBUU2VydmVyOnNlcnZlKCkgZW5kCiBmdW5jdGlvbiBUU2VydmVyOmhhbmRsZShjbGllbnQpCi0gIGxvY2FsIGl0cmFucywgb3RyYW5zLCBpcHJvdCwgb3Byb3QsIHJldCwgZXJyID0KKyAgbG9jYWwgaXRyYW5zLCBvdHJhbnMgPQogICAgIHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydChjbGllbnQpLAotICAgIHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeTpnZXRUcmFuc3BvcnQoY2xpZW50KSwKLSAgICBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKGNsaWVudCksCi0gICAgc2VsZi5vdXRwdXRQcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2woY2xpZW50KQorICAgIHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeTpnZXRUcmFuc3BvcnQoY2xpZW50KQorICBsb2NhbCBpcHJvdCwgb3Byb3QgPQorICAgIHNlbGYuaW5wdXRQcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2woaXRyYW5zKSwKKyAgICBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbChvdHJhbnMpCiAKICAgc2VsZjpfY2xpZW50QmVnaW4oaXByb3QsIG9wcm90KQogICB3aGlsZSB0cnVlIGRvCi0gICAgcmV0LCBlcnIgPSBwY2FsbChzZWxmLnByb2Nlc3Nvci5wcm9jZXNzLCBzZWxmLnByb2Nlc3NvciwgaXByb3QsIG9wcm90KQorICAgIGxvY2FsIHJldCwgZXJyID0gcGNhbGwoc2VsZi5wcm9jZXNzb3IucHJvY2Vzcywgc2VsZi5wcm9jZXNzb3IsIGlwcm90LCBvcHJvdCkKICAgICBpZiByZXQgPT0gZmFsc2UgYW5kIGVyciB0aGVuCiAgICAgICBpZiBub3Qgc3RyaW5nLmZpbmQoZXJyLCAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIpIHRoZW4KICAgICAgICAgc2VsZjpfaGFuZGxlRXhjZXB0aW9uKGVycikKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVGhyaWZ0Lmx1YSBiL2xpYi9sdWEvVGhyaWZ0Lmx1YQppbmRleCA5YjhlYjJmLi5hOTQ4YjNkIDEwMDY0NAotLS0gYS9saWIvbHVhL1RocmlmdC5sdWEKKysrIGIvbGliL2x1YS9UaHJpZnQubHVhCkBAIC00OCw3ICs0OCw3IEBACiAgIHJldHVybiBjb3VudAogZW5kCiAKLXZlcnNpb24gPSAwLjkuMwordmVyc2lvbiA9ICcwLjEzLjAnCiAKIFRUeXBlID0gewogICBTVE9QICAgPSAwLApkaWZmIC0tZ2l0IGEvbGliL2x1YS9zcmMvbHVhYnBhY2suYyBiL2xpYi9sdWEvc3JjL2x1YWJwYWNrLmMKaW5kZXggYzkzNjQyOC4uMDc3YjZhYSAxMDA2NDQKLS0tIGEvbGliL2x1YS9zcmMvbHVhYnBhY2suYworKysgYi9saWIvbHVhL3NyYy9sdWFicGFjay5jCkBAIC05NCw2ICs5NCw3IEBACiAvKioKICAqIGJ1bnBhY2sodHlwZSwgZGF0YSkKICAqICBjIC0gU2lnbmVkIEJ5dGUKKyAqICBDIC0gVW5zaWduZWQgQnl0ZQogICogIHMgLSBTaWduZWQgU2hvcnQKICAqICBpIC0gU2lnbmVkIEludAogICogIGwgLSBTaWduZWQgTG9uZwpAQCAtMTAzLDcgKzEwNCwxMSBAQAogICBjb25zdCBjaGFyICpjb2RlID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKICAgbHVhTF9hcmdjaGVjayhMLCBjb2RlWzFdID09ICdcMCcsIDAsICJGb3JtYXQgY29kZSBtdXN0IGJlIG9uZSBjaGFyYWN0ZXIuIik7CiAgIGNvbnN0IGNoYXIgKmRhdGEgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOworI2lmIExVQV9WRVJTSU9OX05VTSA+PSA1MDIKICAgc2l6ZV90IGxlbiA9IGx1YV9yYXdsZW4oTCwgMik7CisjZWxzZQorICBzaXplX3QgbGVuID0gbHVhX29iamxlbihMLCAyKTsKKyNlbmRpZgogCiAgIHN3aXRjaCAoY29kZVswXSkgewogICAgIGNhc2UgJ2MnOiB7CkBAIC0xMTMsNiArMTE4LDE2IEBACiAgICAgICBsdWFfcHVzaG51bWJlcihMLCB2YWwpOwogICAgICAgYnJlYWs7CiAgICAgfQorICAgIC8qKgorICAgICAqIHVucGFjayB1bnNpZ25lZCBCeXRlLgorICAgICAqLworICAgIGNhc2UgJ0MnOiB7CisgICAgICB1aW50OF90IHZhbDsKKyAgICAgIGx1YUxfYXJnY2hlY2soTCwgbGVuID09IHNpemVvZih2YWwpLCAxLCAiSW52YWxpZCBpbnB1dCBzdHJpbmcgc2l6ZS4iKTsKKyAgICAgIG1lbWNweSgmdmFsLCBkYXRhLCBzaXplb2YodmFsKSk7CisgICAgICBsdWFfcHVzaG51bWJlcihMLCB2YWwpOworICAgICAgYnJlYWs7CisgICAgfQogICAgIGNhc2UgJ3MnOiB7CiAgICAgICBpbnQxNl90IHZhbDsKICAgICAgIGx1YUxfYXJnY2hlY2soTCwgbGVuID09IHNpemVvZih2YWwpLCAxLCAiSW52YWxpZCBpbnB1dCBzdHJpbmcgc2l6ZS4iKTsKQEAgLTE1MCw5ICsxNjUsMTQwIEBACiAgIHJldHVybiAxOwogfQogCisvKioKKyAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworc3RhdGljIGludCBsX2k2NFRvWmlnemFnKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IG4gPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgaW50NjRfdCByZXN1bHQgPSAobiA8PCAxKSBeIChuID4+IDYzKTsKKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAmcmVzdWx0KTsKKyAgcmV0dXJuIDE7Cit9CisvKioKKyAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICovCitzdGF0aWMgaW50IGxfaTMyVG9aaWd6YWcobHVhX1N0YXRlICpMKSB7CisgIGludDMyX3QgbiA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICB1aW50MzJfdCByZXN1bHQgPSAodWludDMyX3QpKG4gPDwgMSkgXiAobiA+PiAzMSk7CisgIGx1YV9wdXNobnVtYmVyKEwsIHJlc3VsdCk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAqLworc3RhdGljIGludCBsX3ppZ3phZ1RvSTMyKGx1YV9TdGF0ZSAqTCkgeworICB1aW50MzJfdCBuID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGludDMyX3QgcmVzdWx0ID0gKGludDMyX3QpKG4gPj4gMSkgXiAodWludDMyX3QpKC0oaW50MzJfdCkobiAmIDEpKTsKKyAgbHVhX3B1c2hudW1iZXIoTCwgcmVzdWx0KTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgKi8KK3N0YXRpYyBpbnQgbF96aWd6YWdUb0k2NChsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBuID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIGludDY0X3QgcmVzdWx0ID0gKGludDY0X3QpKG4gPj4gMSkgXiAodWludDY0X3QpKC0oaW50NjRfdCkobiAmIDEpKTsKKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAmcmVzdWx0KTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogQ29udmVydCBhbiBpMzIgdG8gYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgbF90b1ZhcmludDMyKGx1YV9TdGF0ZSAqTCkgeworICB1aW50OF90IGJ1Zls1XTsKKyAgdWludDMyX3QgbiA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCluOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisgIGx1YV9wdXNobHN0cmluZyhMLCBidWYsIHdzaXplKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogQ29udmVydCBhbiBpNjQgdG8gYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgaW50IGxfdG9WYXJpbnQ2NChsdWFfU3RhdGUgKkwpIHsKKyAgdWludDhfdCBkYXRhWzEwXTsKKyAgdWludDY0X3QgbiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisgIGx1YUxfQnVmZmVyIGJ1ZjsKKyAgbHVhTF9idWZmaW5pdChMLCAmYnVmKTsKKworICB3aGlsZSAoMSkgeworICAgIGlmICgobiAmIH4weDdGTCkgPT0gMCkgeworICAgICAgZGF0YVt3c2l6ZSsrXSA9IChpbnQ4X3QpbjsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBkYXRhW3dzaXplKytdID0gKGludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA+Pj0gNzsKKyAgICB9CisgIH0KKworICBsdWFMX2FkZGxzdHJpbmcoJmJ1ZiwgKHZvaWQqKSZkYXRhLCB3c2l6ZSk7CisgIGx1YUxfcHVzaHJlc3VsdCgmYnVmKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogQ29udmVydCBhIHZhcmludCB0byBpNjQuCisgKi8KK3N0YXRpYyBpbnQgbF9mcm9tVmFyaW50NjQobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgcmVzdWx0OworICB1aW50OF90IGJ5dGUgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDEpOworICBpbnQzMl90IHNoaWZ0ID0gbHVhTF9jaGVja251bWJlcihMLCAyKTsKKyAgdWludDY0X3QgbiA9ICh1aW50NjRfdClsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAzKTsKKyAgbiB8PSAodWludDY0X3QpKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKKworICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICByZXN1bHQgPSAoaW50NjRfdCkobiA+PiAxKSBeICh1aW50NjRfdCkoLShpbnQ2NF90KShuICYgMSkpOworICAgIGx1YV9wdXNobnVtYmVyKEwsIDApOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IG47CisgICAgbHVhX3B1c2hudW1iZXIoTCwgMSk7CisgIH0KKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAmcmVzdWx0KTsKKyAgcmV0dXJuIDI7Cit9CisKKy8qKgorICogVG8gcGFjayBtZXNzYWdlIHR5cGUgb2YgY29tcGFjdCBwcm90b2NvbC4KKyAqLworc3RhdGljIGludCBsX3BhY2tNZXNnVHlwZShsdWFfU3RhdGUgKkwpIHsKKyAgaW50MzJfdCB2ZXJzaW9uX24gPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgaW50MzJfdCB2ZXJzaW9uX21hc2sgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAyKTsKKyAgaW50MzJfdCBtZXNzYWdldHlwZSA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDMpOworICBpbnQzMl90IHR5cGVfc2hpZnRfYW1vdW50ID0gbHVhTF9jaGVja2ludGVnZXIoTCwgNCk7CisgIGludDMyX3QgdHlwZV9tYXNrID0gbHVhTF9jaGVja2ludGVnZXIoTCwgNSk7CisgIGludDMyX3QgdG9fbWVzZ190eXBlID0gKHZlcnNpb25fbiAmIHZlcnNpb25fbWFzaykgfAorICAgICgoKGludDMyX3QpbWVzc2FnZXR5cGUgPDwgdHlwZV9zaGlmdF9hbW91bnQpICYgdHlwZV9tYXNrKTsKKyAgbHVhX3B1c2hudW1iZXIoTCwgdG9fbWVzZ190eXBlKTsKKyAgcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbHVhTF9SZWcgbHVhX2JwYWNrW10gPSB7CiAgIHsiYnBhY2siLCBsX2JwYWNrfSwKICAgeyJidW5wYWNrIiwgbF9idW5wYWNrfSwKKyAgeyJpMzJUb1ppZ3phZyIsIGxfaTMyVG9aaWd6YWd9LAorICB7Imk2NFRvWmlnemFnIiwgbF9pNjRUb1ppZ3phZ30sCisgIHsiemlnemFnVG9JMzIiLCBsX3ppZ3phZ1RvSTMyfSwKKyAgeyJ6aWd6YWdUb0k2NCIsIGxfemlnemFnVG9JNjR9LAorICB7InRvVmFyaW50MzIiLCBsX3RvVmFyaW50MzJ9LAorICB7InRvVmFyaW50NjQiLCBsX3RvVmFyaW50NjR9LAorICB7ImZyb21WYXJpbnQ2NCIsIGxfZnJvbVZhcmludDY0fSwKKyAgeyJwYWNrTWVzZ1R5cGUiLCBsX3BhY2tNZXNnVHlwZX0sCiAgIHtOVUxMLCBOVUxMfQogfTsKIApkaWZmIC0tZ2l0IGEvbGliL2x1YS9zcmMvc29ja2V0LmggYi9saWIvbHVhL3NyYy9zb2NrZXQuaAppbmRleCA4MDE5ZmZlLi5hZmI4MjdlIDEwMDY0NAotLS0gYS9saWIvbHVhL3NyYy9zb2NrZXQuaAorKysgYi9saWIvbHVhL3NyYy9zb2NrZXQuaApAQCAtNTEsOCArNTEsOCBAQAogVF9FUlJDT0RFIHNvY2tldF9yZWN2KHBfc29ja2V0IHNvY2ssIGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGludCB0aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgIGludCAqcmVjZWl2ZWQpOwogCi12b2lkIHNvY2tldF9zZXRibG9ja2luZyhwX3NvY2tldCBzb2NrKTsKLXZvaWQgc29ja2V0X3NldG5vbmJsb2NraW5nKHBfc29ja2V0IHNvY2spOworVF9FUlJDT0RFIHNvY2tldF9zZXRibG9ja2luZyhwX3NvY2tldCBzb2NrKTsKK1RfRVJSQ09ERSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcocF9zb2NrZXQgc29jayk7CiAKIFRfRVJSQ09ERSBzb2NrZXRfYWNjZXB0KHBfc29ja2V0IHNvY2ssIHBfc29ja2V0IHNpYmxpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICBwX3NhIGFkZHIsIHNvY2tsZW5fdCAqYWRkcl9sZW4sIGludCB0aW1lb3V0KTsKZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL3Vzb2NrZXQuYyBiL2xpYi9sdWEvc3JjL3Vzb2NrZXQuYwppbmRleCBiZTY5NmUwLi4xYTFiNTQ5IDEwMDY0NAotLS0gYS9saWIvbHVhL3NyYy91c29ja2V0LmMKKysrIGIvbGliL2x1YS9zcmMvdXNvY2tldC5jCkBAIC01OCwxMyArNTgsMTQgQEAKIAogICBlbmQgPSBfX2dldHRpbWUoKSArIHRpbWVvdXQvMTAwMDsKICAgZG8geworICAgIEZEX1pFUk8oJnJmZHMpOworICAgIEZEX1pFUk8oJndmZHMpOworCiAgICAgLy8gU3BlY2lmeSB3aGF0IEkvTyBvcGVyYXRpb25zIHdlIGNhcmUgYWJvdXQKICAgICBpZiAobW9kZSAmIFdBSVRfTU9ERV9SKSB7Ci0gICAgICBGRF9aRVJPKCZyZmRzKTsKICAgICAgIEZEX1NFVCgqc29jaywgJnJmZHMpOwogICAgIH0KICAgICBpZiAobW9kZSAmIFdBSVRfTU9ERV9XKSB7Ci0gICAgICBGRF9aRVJPKCZ3ZmRzKTsKICAgICAgIEZEX1NFVCgqc29jaywgJndmZHMpOwogICAgIH0KIApAQCAtMTEyLDcgKzExMyw3IEBACiBUX0VSUkNPREUgc29ja2V0X2Rlc3Ryb3kocF9zb2NrZXQgc29jaykgewogICAvLyBUT0RPIEZpZ3VyZSBvdXQgaWYgSSBzaG91bGQgYmUgZnJlZS1pbmcgdGhpcwogICBpZiAoKnNvY2sgPiAwKSB7Ci0gICAgc29ja2V0X3NldGJsb2NraW5nKHNvY2spOworICAgICh2b2lkKXNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKICAgICBjbG9zZSgqc29jayk7CiAgICAgKnNvY2sgPSAtMTsKICAgfQpAQCAtMTIwLDMwICsxMjEsMzkgQEAKIH0KIAogVF9FUlJDT0RFIHNvY2tldF9iaW5kKHBfc29ja2V0IHNvY2ssIHBfc2EgYWRkciwgaW50IGFkZHJfbGVuKSB7Ci0gIGludCByZXQgPSBTVUNDRVNTOwotICBzb2NrZXRfc2V0YmxvY2tpbmcoc29jayk7CisgIGludCByZXQgPSBzb2NrZXRfc2V0YmxvY2tpbmcoc29jayk7CisgIGlmIChyZXQgIT0gU1VDQ0VTUykgeworICAgIHJldHVybiByZXQ7CisgIH0KICAgaWYgKGJpbmQoKnNvY2ssIGFkZHIsIGFkZHJfbGVuKSkgewogICAgIHJldCA9IGVycm5vOwogICB9Ci0gIHNvY2tldF9zZXRub25ibG9ja2luZyhzb2NrKTsKLSAgcmV0dXJuIHJldDsKKyAgaW50IHJldDIgPSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoc29jayk7CisgIHJldHVybiByZXQgPT0gU1VDQ0VTUyA/IHJldDIgOiByZXQ7CiB9CiAKIFRfRVJSQ09ERSBzb2NrZXRfZ2V0X2luZm8ocF9zb2NrZXQgc29jaywgc2hvcnQgKnBvcnQsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgewotICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7Ci0gIHNvY2tsZW5fdCBhZGRybGVuOworICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYTsKICAgbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisgIHNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKHNhKTsKICAgaW50IHJjID0gZ2V0c29ja25hbWUoKnNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZzYSwgJmFkZHJsZW4pOwogICBpZiAoIXJjKSB7Ci0gICAgY2hhciAqYWRkciA9IGluZXRfbnRvYShzYS5zaW5fYWRkcik7Ci0gICAgKnBvcnQgPSBudG9ocyhzYS5zaW5fcG9ydCk7Ci0gICAgaWYgKHN0cmxlbihhZGRyKSA8IGxlbikgewotICAgICAgbGVuID0gc3RybGVuKGFkZHIpOworICAgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYqIHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42KikoJnNhKTsKKyAgICAgIGlmICghaW5ldF9udG9wKEFGX0lORVQ2LCAmc2luLT5zaW42X2FkZHIsIGJ1ZiwgbGVuKSkgeworICAgICAgICByZXR1cm4gZXJybm87CisgICAgICB9CisgICAgICAqcG9ydCA9IG50b2hzKHNpbi0+c2luNl9wb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgc3RydWN0IHNvY2thZGRyX2luKiBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luKikoJnNhKTsKKyAgICAgIGlmICghaW5ldF9udG9wKEFGX0lORVQsICZzaW4tPnNpbl9hZGRyLCBidWYsIGxlbikpIHsKKyAgICAgICAgcmV0dXJuIGVycm5vOworICAgICAgfQorICAgICAgKnBvcnQgPSBudG9ocyhzaW4tPnNpbl9wb3J0KTsKICAgICB9Ci0gICAgbWVtY3B5KGJ1ZiwgYWRkciwgbGVuKTsKICAgICByZXR1cm4gU1VDQ0VTUzsKICAgfQotICByZXR1cm4gcmM7CisgIHJldHVybiBlcnJubzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTE2MCwyMiArMTcwLDI1IEBACiAgICAgaWYgKCpjbGllbnQgPiAwKSB7CiAgICAgICByZXR1cm4gU1VDQ0VTUzsKICAgICB9Ci0gICAgZXJyID0gZXJybm87Ci0gIH0gd2hpbGUgKGVyciAhPSBFSU5UUik7CisgIH0gd2hpbGUgKChlcnIgPSBlcnJubykgPT0gRUlOVFIpOworCiAgIGlmIChlcnIgPT0gRUFHQUlOIHx8IGVyciA9PSBFQ09OTkFCT1JURUQpIHsKICAgICByZXR1cm4gc29ja2V0X3dhaXQoc29jaywgV0FJVF9NT0RFX1IsIHRpbWVvdXQpOwogICB9CisKICAgcmV0dXJuIGVycjsKIH0KIAogVF9FUlJDT0RFIHNvY2tldF9saXN0ZW4ocF9zb2NrZXQgc29jaywgaW50IGJhY2tsb2cpIHsKLSAgaW50IHJldCA9IFNVQ0NFU1M7Ci0gIHNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKKyAgaW50IHJldCA9IHNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKKyAgaWYgKHJldCAhPSBTVUNDRVNTKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQogICBpZiAobGlzdGVuKCpzb2NrLCBiYWNrbG9nKSkgewogICAgIHJldCA9IGVycm5vOwogICB9Ci0gIHNvY2tldF9zZXRub25ibG9ja2luZyhzb2NrKTsKLSAgcmV0dXJuIHJldDsKKyAgaW50IHJldDIgPSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoc29jayk7CisgIHJldHVybiByZXQgPT0gU1VDQ0VTUyA/IHJldDIgOiByZXQ7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0yMDksMTIgKzIyMiwxMiBAQAogICAgIGlmIChwdXQgPiAwKSB7CiAgICAgICByZXR1cm4gU1VDQ0VTUzsKICAgICB9Ci0gICAgZXJyID0gZXJybm87Ci0gIH0gd2hpbGUgKGVyciAhPSBFSU5UUik7CisgIH0gd2hpbGUgKChlcnIgPSBlcnJubykgPT0gRUlOVFIpOwogCiAgIGlmIChlcnIgPT0gRUFHQUlOKSB7CiAgICAgcmV0dXJuIHNvY2tldF93YWl0KHNvY2ssIFdBSVRfTU9ERV9XLCB0aW1lb3V0KTsKICAgfQorCiAgIHJldHVybiBlcnI7CiB9CiAKQEAgLTIyNCw4ICsyMzcsOCBAQAogICBpZiAoKnNvY2sgPCAwKSB7CiAgICAgcmV0dXJuIENMT1NFRDsKICAgfQorICAqcmVjZWl2ZWQgPSAwOwogCi0gIGludCBmbGFncyA9IGZjbnRsKCpzb2NrLCBGX0dFVEZMLCAwKTsKICAgZG8gewogICAgIGdvdCA9IHJlY3YoKnNvY2ssIGRhdGEsIGxlbiwgMCk7CiAgICAgaWYgKGdvdCA+IDApIHsKQEAgLTIzOCwyNyArMjUxLDI4IEBACiAgICAgaWYgKGdvdCA9PSAwKSB7CiAgICAgICByZXR1cm4gQ0xPU0VEOwogICAgIH0KLSAgfSB3aGlsZSAoZXJyICE9IEVJTlRSKTsKKyAgfSB3aGlsZSAoZXJyID09IEVJTlRSKTsKIAogICBpZiAoZXJyID09IEVBR0FJTikgewogICAgIHJldHVybiBzb2NrZXRfd2FpdChzb2NrLCBXQUlUX01PREVfUiwgdGltZW91dCk7CiAgIH0KKwogICByZXR1cm4gZXJyOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gVXRpbAogCi12b2lkIHNvY2tldF9zZXRub25ibG9ja2luZyhwX3NvY2tldCBzb2NrKSB7CitUX0VSUkNPREUgc29ja2V0X3NldG5vbmJsb2NraW5nKHBfc29ja2V0IHNvY2spIHsKICAgaW50IGZsYWdzID0gZmNudGwoKnNvY2ssIEZfR0VURkwsIDApOwogICBmbGFncyB8PSBPX05PTkJMT0NLOwotICBmY250bCgqc29jaywgRl9TRVRGTCwgZmxhZ3MpOworICByZXR1cm4gZmNudGwoKnNvY2ssIEZfU0VURkwsIGZsYWdzKSAhPSAtMSA/IFNVQ0NFU1MgOiBlcnJubzsKIH0KIAotdm9pZCBzb2NrZXRfc2V0YmxvY2tpbmcocF9zb2NrZXQgc29jaykgeworVF9FUlJDT0RFIHNvY2tldF9zZXRibG9ja2luZyhwX3NvY2tldCBzb2NrKSB7CiAgIGludCBmbGFncyA9IGZjbnRsKCpzb2NrLCBGX0dFVEZMLCAwKTsKICAgZmxhZ3MgJj0gKH4oT19OT05CTE9DSykpOwotICBmY250bCgqc29jaywgRl9TRVRGTCwgZmxhZ3MpOworICByZXR1cm4gZmNudGwoKnNvY2ssIEZfU0VURkwsIGZsYWdzKSAhPSAtMSA/IFNVQ0NFU1MgOiBlcnJubzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL01ha2VmaWxlLmFtIGIvbGliL25ldGNvcmUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyZDZhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCithbGwtbG9jYWw6CisJJChET1RORVRDT1JFKSBidWlsZAorCitjaGVjay1sb2NhbDoKKwkkKERPVE5FVENPUkUpIHRlc3QgVGVzdHMvVGhyaWZ0LlRlc3RzL1RocmlmdC5UZXN0cy5jc3Byb2oKKwkkKERPVE5FVENPUkUpIHRlc3QgVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIFRocmlmdC9iaW4KKwkkKFJNKSAtciBUaHJpZnQvb2JqCisJJChSTSkgLXIgVGVzdHMvVGhyaWZ0LlRlc3RzL2JpbgorCSQoUk0pIC1yIFRlc3RzL1RocmlmdC5UZXN0cy9vYmoKKwkkKFJNKSAtciBUZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9iaW4KKwkkKFJNKSAtciBUZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9vYmoKKwkkKFJNKSAtciBUZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL2JpbgorCSQoUk0pIC1yIFRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvb2JqCisKK2Rpc3QtaG9vazoKKwkkKFJNKSAtciAkKGRpc3RkaXIpL1RocmlmdC9iaW4KKwkkKFJNKSAtciAkKGRpc3RkaXIpL1RocmlmdC9vYmoKKwkkKFJNKSAtciAkKGRpc3RkaXIpL1Rlc3RzL1RocmlmdC5UZXN0cy9iaW4KKwkkKFJNKSAtciAkKGRpc3RkaXIpL1Rlc3RzL1RocmlmdC5UZXN0cy9vYmoKKwkkKFJNKSAtciAkKGRpc3RkaXIpL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL2JpbgorCSQoUk0pIC1yICQoZGlzdGRpcikvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvb2JqCisJJChSTSkgLXIgJChkaXN0ZGlyKS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL2JpbgorCSQoUk0pIC1yICQoZGlzdGRpcikvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9vYmoKKworRElTVENMRUFORklMRVMgPSBcCisJTWFrZWZpbGUuaW4KKworRVhUUkFfRElTVCA9IFwKKwlSRUFETUUubWQgXAorCVRlc3RzIFwKKwlUaHJpZnQgXAorCVRocmlmdC5zbG4gXAorCWJ1aWxkLmNtZCBcCisJYnVpbGQuc2ggXAorCXJ1bnRlc3RzLmNtZCBcCisJcnVudGVzdHMuc2gKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1JFQURNRS5tZCBiL2xpYi9uZXRjb3JlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2QyNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjkgQEAKKyMgQXBhY2hlIFRocmlmdCBuZXRjb3JlCisKK1RocmlmdCBjbGllbnQgbGlicmFyeSBwb3J0ZWQgdG8gTWljcm9zb2Z0IC5OZXQgQ29yZSAKKworIyBEZXByZWNhdGlvbiBub3RpY2UKKworUGVyIFtUSFJJRlQtNDcyM10oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDcyMyksIGJvdGggQ1NoYXJwIGFuZCBOZXRjb3JlIHRhcmdldHMgYXJlIGRlcHJlY2F0ZWQgCithbmQgd2lsbCBiZSByZW1vdmVkIHdpdGggdGhlIG5leHQgcmVsZWFzZS4gTWlncmF0ZSB0byB0aGUgW05ldFN0ZCBsYW5ndWFnZSB0YXJnZXRdKC4uL25ldHN0ZC9SRUFETUUubWQpIGluc3RlYWQuCisKKyMgQ29udGVudAorLSBUZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzIC0gcHJvamVjdCBmb3IgY2hlY2tpbmcgcHVibGljIGludGVyZmFjZXMgZHVyaW5nIGFkZGluZyBjaGFuZ2VzIHRvIFRocmlmdCBsaWJyYXJ5CistIFRocmlmdCAtIFRocmlmdCBsaWJyYXJ5IAorCisjIFJldXNlZCBjb21wb25lbnRzIAorLSAuTkVUIFN0YW5kYXJkIDEuNiAoU0RLIDIuMC4wKQorCisjIEhvdyB0byBidWlsZCBvbiBXaW5kb3dzCistIEdldCBUaHJpZnQgSURMIGNvbXBpbGVyIGV4ZWN1dGFibGUsIGFkZCB0byBzb21lIGZvbGRlciBhbmQgYWRkIHBhdGggdG8gdGhpcyBmb2xkZXIgaW50byBQQVRIIHZhcmlhYmxlCistIE9wZW4gdGhlIFRocmlmdC5zbG4gcHJvamVjdCB3aXRoIFZpc3VhbCBTdHVkaW8gYW5kIGJ1aWxkLgorb3IgCistIEJ1aWxkIHdpdGggc2NyaXB0cworCisjIEhvdyB0byBidWlsZCBvbiBVbml4CistIEVuc3VyZSB5b3UgaGF2ZSAuTkVUIENvcmUgMi4wLjAgU0RLIGluc3RhbGxlZCBvciB1c2UgdGhlIFVidW50dSBYZW5pYWwgZG9ja2VyIGltYWdlCistIEZvbGxvdyBjb21tb24gYnVpbGQgcHJhY3RpY2UgZm9yIFRocmlmdDogYm9vdHN0cmFwLCBjb25maWd1cmUsIGFuZCBtYWtlCisKKyMgS25vd24gaXNzdWVzCistIEluIHRyYWNlIGxvZ2dpbmcgbW9kZSB5b3UgY2FuIHNlZSBzb21lIG5vdCBpbXBvcnRhbnQgaW50ZXJuYWwgZXhjZXB0aW9ucworCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy8uZ2l0aWdub3JlIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjU0YzMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKKyMgaWdub3JlIGZvciBhdXRvZ2VuZXJhdGVkIGZpbGVzCisvQXBhY2hlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9Qcm90b2NvbHMvUHJvdG9jb2xzT3BlcmF0aW9uc1Rlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvUHJvdG9jb2xzL1Byb3RvY29sc09wZXJhdGlvbnNUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzRhZmExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvUHJvdG9jb2xzL1Byb3RvY29sc09wZXJhdGlvbnNUZXN0cy5jcwpAQCAtMCwwICsxLDUwMiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgS2VsbGVybWFuU29mdHdhcmUuQ29tcGFyZU5ldE9iamVjdHM7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuUHJvdG9jb2xzCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgUHJvdG9jb2xzT3BlcmF0aW9uc1Rlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IENvbXBhcmVMb2dpYyBfY29tcGFyZUxvZ2ljID0gbmV3IENvbXBhcmVMb2dpYygpOworCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5DYWxsKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLk9uZXdheSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuUmVwbHkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5DYWxsKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuT25ld2F5KV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuUmVwbHkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5DYWxsKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuT25ld2F5KV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuUmVwbHkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRNZXNzYWdlX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUsIFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRNZXNzYWdlKG5hbWVvZihUTWVzc2FnZSksIG1lc3NhZ2VUeXBlLCAxKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVNZXNzYWdlRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsTWVzc2FnZSA9IGF3YWl0IHByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW5Bc3luYygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTWVzc2FnZUVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZFN0cnVjdF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVFN0cnVjdChuYW1lb2YoVFN0cnVjdCkpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU3RydWN0QmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU3RydWN0RW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRTdHJ1Y3RCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRTdHJ1Y3RFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkRmllbGRfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRGaWVsZChuYW1lb2YoVEZpZWxkKSwgVFR5cGUuU3RyaW5nLCAxKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUZpZWxkQmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlRmllbGRFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEZpZWxkQmVnaW5Bc3luYygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkRmllbGRFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZE1hcF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVE1hcChUVHlwZS5TdHJpbmcsIFRUeXBlLlN0cmluZywgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVNYXBCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVNYXBFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZE1hcEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZE1hcEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRMaXN0X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUTGlzdChUVHlwZS5TdHJpbmcsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTGlzdEJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUxpc3RFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRMaXN0RW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRTZXRfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRTZXQoVFR5cGUuU3RyaW5nLCAxKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZVNldEJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZVNldEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkU2V0QmVnaW5Bc3luYygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU2V0RW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRCb29sX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IHRydWU7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVCb29sQXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEJvb2xBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEJ5dGVfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gc2J5dGUuTWF4VmFsdWU7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVCeXRlQXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEJ5dGVBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEkxNl9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBzaG9ydC5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUkxNkFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRJMTZBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEkzMl9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBpbnQuTWF4VmFsdWU7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVJMzJBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkSTMyQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRJNjRfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbG9uZy5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUk2NEFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRJNjRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZERvdWJsZV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBkb3VibGUuTWF4VmFsdWU7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVEb3VibGVBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkRG91YmxlQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRTdHJpbmdfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmFtZW9mKFN0cmluZyk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTdHJpbmdBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkU3RyaW5nQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRCaW5hcnlfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhuYW1lb2YoU3RyaW5nKSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVCaW5hcnlBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkQmluYXJ5QXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFR1cGxlPFN0cmVhbSwgVFByb3RvY29sPiBHZXRQcm90b2NvbEluc3RhbmNlKFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbWVtb3J5U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdmFyIHN0cmVhbUNsaWVudFRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0KG1lbW9yeVN0cmVhbSwgbWVtb3J5U3RyZWFtKTsKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IChUUHJvdG9jb2wpIEFjdGl2YXRvci5DcmVhdGVJbnN0YW5jZShwcm90b2NvbFR5cGUsIHN0cmVhbUNsaWVudFRyYW5zcG9ydCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFN0cmVhbSwgVFByb3RvY29sPihtZW1vcnlTdHJlYW0sIHByb3RvY29sKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvaiBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjVkYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCkBAIC0wLDAgKzEsMjkgQEAKK++7vzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdC5JbnRlZ3JhdGlvblRlc3RzPC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5UaHJpZnQuSW50ZWdyYXRpb25UZXN0czwvUGFja2FnZUlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJDb21wYXJlTkVUT2JqZWN0cyIgVmVyc2lvbj0iNC4zLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5FVC5UZXN0LlNkayIgVmVyc2lvbj0iMTUuNS4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1TVGVzdC5UZXN0QWRhcHRlciIgVmVyc2lvbj0iMS4yLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTVNUZXN0LlRlc3RGcmFtZXdvcmsiIFZlcnNpb249IjEuMi4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZXJ2aWNlTW9kZWwuUHJpbWl0aXZlcyIgVmVyc2lvbj0iNC40LjAiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8U2VydmljZSBJbmNsdWRlPSJ7ODJhN2Y0OGQtM2I1MC00YjFlLWI4MmUtM2FkYTgyMTBjMzU4fSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLy5naXRpZ25vcmUgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5MjlhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDQgQEAKKyMgaWdub3JlIGZvciBhdXRvZ2VuZXJhdGVkIGZpbGVzCisvVGhyaWZ0VGVzdAorL0FwYWNoZQorL0ZhY2Vib29rCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL0Nhc3NhbmRyYVRlc3QudGhyaWZ0IGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9DYXNzYW5kcmFUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjkyNzIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9DYXNzYW5kcmFUZXN0LnRocmlmdApAQCAtMCwwICsxLDcwNSBAQAorIyEvdXNyL2xvY2FsL2Jpbi90aHJpZnQgLS1qYXZhIC0tcGhwIC0tcHkKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisjICoqKiBQTEVBU0UgUkVNRU1CRVIgVE8gRURJVCBUSEUgVkVSU0lPTiBDT05TVEFOVCBXSEVOIE1BS0lORyBDSEFOR0VTICoqKgorIyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworIworIyBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgQ2Fzc2FuZHJhIFNlcnZpY2UKKyMKKworbmFtZXNwYWNlIG5ldGNvcmUgQXBhY2hlLkNhc3NhbmRyYS5UZXN0CisKKyMgVGhyaWZ0LnJiIGhhcyBhIGJ1ZyB3aGVyZSB0b3AtbGV2ZWwgbW9kdWxlcyB0aGF0IGluY2x1ZGUgbW9kdWxlcyAKKyMgd2l0aCB0aGUgc2FtZSBuYW1lIGFyZSBub3QgcHJvcGVybHkgcmVmZXJlbmNlZCwgc28gd2UgY2FuJ3QgZG8KKyMgQ2Fzc2FuZHJhOjpDYXNzYW5kcmE6OkNsaWVudC4KK25hbWVzcGFjZSByYiBDYXNzYW5kcmFUaHJpZnQKKworIyBUaGUgQVBJIHZlcnNpb24gKE5PVCB0aGUgcHJvZHVjdCB2ZXJzaW9uKSwgY29tcG9zZWQgYXMgYSBkb3QgZGVsaW1pdGVkCisjIHN0cmluZyB3aXRoIG1ham9yLCBtaW5vciwgYW5kIHBhdGNoIGxldmVsIGNvbXBvbmVudHMuCisjCisjICAtIE1ham9yOiBJbmNyZW1lbnRlZCBmb3IgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZXMuIEFuIGV4YW1wbGUgd291bGQKKyMgICAgICAgICAgIGJlIGNoYW5nZXMgdG8gdGhlIG51bWJlciBvciBkaXNwb3NpdGlvbiBvZiBtZXRob2QgYXJndW1lbnRzLgorIyAgLSBNaW5vcjogSW5jcmVtZW50ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgY2hhbmdlcy4gQW4gZXhhbXBsZSB3b3VsZAorIyAgICAgICAgICAgYmUgdGhlIGFkZGl0aW9uIG9mIGEgbmV3IChvcHRpb25hbCkgbWV0aG9kLgorIyAgLSBQYXRjaDogSW5jcmVtZW50ZWQgZm9yIGJ1ZyBmaXhlcy4gVGhlIHBhdGNoIGxldmVsIHNob3VsZCBiZSBpbmNyZWFzZWQKKyMgICAgICAgICAgIGZvciBldmVyeSBlZGl0IHRoYXQgZG9lc24ndCByZXN1bHQgaW4gYSBjaGFuZ2UgdG8gbWFqb3IvbWlub3IuCisjCisjIFNlZSB0aGUgU2VtYW50aWMgVmVyc2lvbmluZyBTcGVjaWZpY2F0aW9uIChTZW1WZXIpIGh0dHA6Ly9zZW12ZXIub3JnLgorY29uc3Qgc3RyaW5nIFZFUlNJT04gPSAiMTkuMjQuMCIKKworCisjCisjIGRhdGEgc3RydWN0dXJlcworIworCisvKiogQmFzaWMgdW5pdCBvZiBkYXRhIHdpdGhpbiBhIENvbHVtbkZhbWlseS4KKyAqIEBwYXJhbSBuYW1lLCB0aGUgbmFtZSBieSB3aGljaCB0aGlzIGNvbHVtbiBpcyBzZXQgYW5kIHJldHJpZXZlZC4gIE1heGltdW0gNjRLQiBsb25nLgorICogQHBhcmFtIHZhbHVlLiBUaGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUuICBNYXhpbXVtIDJHQiBsb25nLCBidXQgaW4gcHJhY3RpY2UgeW91IHNob3VsZCBsaW1pdCBpdCB0byBzbWFsbCBudW1iZXJzIG9mIE1CIChzaW5jZSBUaHJpZnQgbXVzdCByZWFkIHRoZSBmdWxsIHZhbHVlIGludG8gbWVtb3J5IHRvIG9wZXJhdGUgb24gaXQpLgorICogQHBhcmFtIHRpbWVzdGFtcC4gVGhlIHRpbWVzdGFtcCBpcyB1c2VkIGZvciBjb25mbGljdCBkZXRlY3Rpb24vcmVzb2x1dGlvbiB3aGVuIHR3byBjb2x1bW5zIHdpdGggc2FtZSBuYW1lIG5lZWQgdG8gYmUgY29tcGFyZWQuCisgKiBAcGFyYW0gdHRsLiBBbiBvcHRpb25hbCwgcG9zaXRpdmUgZGVsYXkgKGluIHNlY29uZHMpIGFmdGVyIHdoaWNoIHRoZSBjb2x1bW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuIAorICovCitzdHJ1Y3QgQ29sdW1uIHsKKyAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgMjogb3B0aW9uYWwgYmluYXJ5IHZhbHVlLAorICAgMzogb3B0aW9uYWwgaTY0IHRpbWVzdGFtcCwKKyAgIDQ6IG9wdGlvbmFsIGkzMiB0dGwsCit9CisKKy8qKiBBIG5hbWVkIGxpc3Qgb2YgY29sdW1ucy4KKyAqIEBwYXJhbSBuYW1lLiBzZWUgQ29sdW1uLm5hbWUuCisgKiBAcGFyYW0gY29sdW1ucy4gQSBjb2xsZWN0aW9uIG9mIHN0YW5kYXJkIENvbHVtbnMuICBUaGUgY29sdW1ucyB3aXRoaW4gYSBzdXBlciBjb2x1bW4gYXJlIGRlZmluZWQgaW4gYW4gYWRob2MgbWFubmVyLgorICogICAgICAgICAgICAgICAgIENvbHVtbnMgd2l0aGluIGEgc3VwZXIgY29sdW1uIGRvIG5vdCBoYXZlIHRvIGhhdmUgbWF0Y2hpbmcgc3RydWN0dXJlcyAoc2ltaWxhcmx5IG5hbWVkIGNoaWxkIGNvbHVtbnMpLgorICovCitzdHJ1Y3QgU3VwZXJDb2x1bW4geworICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAyOiByZXF1aXJlZCBsaXN0PENvbHVtbj4gY29sdW1ucywKK30KKworc3RydWN0IENvdW50ZXJDb2x1bW4geworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgIDI6IHJlcXVpcmVkIGk2NCB2YWx1ZQorfQorCitzdHJ1Y3QgQ291bnRlclN1cGVyQ29sdW1uIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkgbmFtZSwKKyAgICAyOiByZXF1aXJlZCBsaXN0PENvdW50ZXJDb2x1bW4+IGNvbHVtbnMKK30KKworLyoqCisgICAgTWV0aG9kcyBmb3IgZmV0Y2hpbmcgcm93cy9yZWNvcmRzIGZyb20gQ2Fzc2FuZHJhIHdpbGwgcmV0dXJuIGVpdGhlciBhIHNpbmdsZSBpbnN0YW5jZSBvZiBDb2x1bW5PclN1cGVyQ29sdW1uIG9yIGEgbGlzdAorICAgIG9mIENvbHVtbk9yU3VwZXJDb2x1bW5zIChnZXRfc2xpY2UoKSkuIElmIHlvdSdyZSBsb29raW5nIHVwIGEgU3VwZXJDb2x1bW4gKG9yIGxpc3Qgb2YgU3VwZXJDb2x1bW5zKSB0aGVuIHRoZSByZXN1bHRpbmcKKyAgICBpbnN0YW5jZXMgb2YgQ29sdW1uT3JTdXBlckNvbHVtbiB3aWxsIGhhdmUgdGhlIHJlcXVlc3RlZCBTdXBlckNvbHVtbiBpbiB0aGUgYXR0cmlidXRlIHN1cGVyX2NvbHVtbi4gRm9yIHF1ZXJpZXMgcmVzdWx0aW5nCisgICAgaW4gQ29sdW1ucywgdGhvc2UgdmFsdWVzIHdpbGwgYmUgaW4gdGhlIGF0dHJpYnV0ZSBjb2x1bW4uIFRoaXMgY2hhbmdlIHdhcyBtYWRlIGJldHdlZW4gMC4zIGFuZCAwLjQgdG8gc3RhbmRhcmRpemUgb24KKyAgICBzaW5nbGUgcXVlcnkgbWV0aG9kcyB0aGF0IG1heSByZXR1cm4gZWl0aGVyIGEgU3VwZXJDb2x1bW4gb3IgQ29sdW1uLgorCisgICAgSWYgdGhlIHF1ZXJ5IHdhcyBvbiBhIGNvdW50ZXIgY29sdW1uIGZhbWlseSwgeW91IHdpbGwgZWl0aGVyIGdldCBhIGNvdW50ZXJfY29sdW1uIChpbnN0ZWFkIG9mIGEgY29sdW1uKSBvciBhIAorICAgIGNvdW50ZXJfc3VwZXJfY29sdW1uIChpbnN0ZWFkIG9mIGEgc3VwZXJfY29sdW1uKQorCisgICAgQHBhcmFtIGNvbHVtbi4gVGhlIENvbHVtbiByZXR1cm5lZCBieSBnZXQoKSBvciBnZXRfc2xpY2UoKS4KKyAgICBAcGFyYW0gc3VwZXJfY29sdW1uLiBUaGUgU3VwZXJDb2x1bW4gcmV0dXJuZWQgYnkgZ2V0KCkgb3IgZ2V0X3NsaWNlKCkuCisgICAgQHBhcmFtIGNvdW50ZXJfY29sdW1uLiBUaGUgQ291bnRlcm9sdW1uIHJldHVybmVkIGJ5IGdldCgpIG9yIGdldF9zbGljZSgpLgorICAgIEBwYXJhbSBjb3VudGVyX3N1cGVyX2NvbHVtbi4gVGhlIENvdW50ZXJTdXBlckNvbHVtbiByZXR1cm5lZCBieSBnZXQoKSBvciBnZXRfc2xpY2UoKS4KKyAqLworc3RydWN0IENvbHVtbk9yU3VwZXJDb2x1bW4geworICAgIDE6IG9wdGlvbmFsIENvbHVtbiBjb2x1bW4sCisgICAgMjogb3B0aW9uYWwgU3VwZXJDb2x1bW4gc3VwZXJfY29sdW1uLAorICAgIDM6IG9wdGlvbmFsIENvdW50ZXJDb2x1bW4gY291bnRlcl9jb2x1bW4sCisgICAgNDogb3B0aW9uYWwgQ291bnRlclN1cGVyQ29sdW1uIGNvdW50ZXJfc3VwZXJfY29sdW1uCit9CisKKworIworIyBFeGNlcHRpb25zCisjIChub3RlIHRoYXQgaW50ZXJuYWwgc2VydmVyIGVycm9ycyB3aWxsIHJhaXNlIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBjb3VydGVzeSBvZiBUaHJpZnQpCisjCisKKy8qKiBBIHNwZWNpZmljIGNvbHVtbiB3YXMgcmVxdWVzdGVkIHRoYXQgZG9lcyBub3QgZXhpc3QuICovCitleGNlcHRpb24gTm90Rm91bmRFeGNlcHRpb24geworfQorCisvKiogSW52YWxpZCByZXF1ZXN0IGNvdWxkIG1lYW4ga2V5c3BhY2Ugb3IgY29sdW1uIGZhbWlseSBkb2VzIG5vdCBleGlzdCwgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgbWlzc2luZywgb3IgYSBwYXJhbWV0ZXIgaXMgbWFsZm9ybWVkLiAKKyAgICB3aHkgY29udGFpbnMgYW4gYXNzb2NpYXRlZCBlcnJvciBtZXNzYWdlLgorKi8KK2V4Y2VwdGlvbiBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIHdoeQorfQorCisvKiogTm90IGFsbCB0aGUgcmVwbGljYXMgcmVxdWlyZWQgY291bGQgYmUgY3JlYXRlZCBhbmQvb3IgcmVhZC4gKi8KK2V4Y2VwdGlvbiBVbmF2YWlsYWJsZUV4Y2VwdGlvbiB7Cit9CisKKy8qKiBSUEMgdGltZW91dCB3YXMgZXhjZWVkZWQuICBlaXRoZXIgYSBub2RlIGZhaWxlZCBtaWQtb3BlcmF0aW9uLCBvciBsb2FkIHdhcyB0b28gaGlnaCwgb3IgdGhlIHJlcXVlc3RlZCBvcCB3YXMgdG9vIGxhcmdlLiAqLworZXhjZXB0aW9uIFRpbWVkT3V0RXhjZXB0aW9uIHsKK30KKworLyoqIGludmFsaWQgYXV0aGVudGljYXRpb24gcmVxdWVzdCAoaW52YWxpZCBrZXlzcGFjZSwgdXNlciBkb2VzIG5vdCBleGlzdCwgb3IgY3JlZGVudGlhbHMgaW52YWxpZCkgKi8KK2V4Y2VwdGlvbiBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIHdoeQorfQorCisvKiogaW52YWxpZCBhdXRob3JpemF0aW9uIHJlcXVlc3QgKHVzZXIgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8ga2V5c3BhY2UpICovCitleGNlcHRpb24gQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIHdoeQorfQorCisvKiogc2NoZW1hcyBhcmUgbm90IGluIGFncmVlbWVudCBhY3Jvc3MgYWxsIG5vZGVzICovCitleGNlcHRpb24gU2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHsKK30KKworCisjCisjIHNlcnZpY2UgYXBpCisjCisvKiogCisgKiBUaGUgQ29uc2lzdGVuY3lMZXZlbCBpcyBhbiBlbnVtIHRoYXQgY29udHJvbHMgYm90aCByZWFkIGFuZCB3cml0ZQorICogYmVoYXZpb3IgYmFzZWQgb24gdGhlIFJlcGxpY2F0aW9uRmFjdG9yIG9mIHRoZSBrZXlzcGFjZS4gIFRoZQorICogZGlmZmVyZW50IGNvbnNpc3RlbmN5IGxldmVscyBoYXZlIGRpZmZlcmVudCBtZWFuaW5ncywgZGVwZW5kaW5nIG9uCisgKiBpZiB5b3UncmUgZG9pbmcgYSB3cml0ZSBvciByZWFkIG9wZXJhdGlvbi4gCisgKgorICogSWYgVyArIFIgPiBSZXBsaWNhdGlvbkZhY3Rvciwgd2hlcmUgVyBpcyB0aGUgbnVtYmVyIG9mIG5vZGVzIHRvCisgKiBibG9jayBmb3Igb24gd3JpdGUsIGFuZCBSIHRoZSBudW1iZXIgdG8gYmxvY2sgZm9yIG9uIHJlYWRzLCB5b3UKKyAqIHdpbGwgaGF2ZSBzdHJvbmdseSBjb25zaXN0ZW50IGJlaGF2aW9yOyB0aGF0IGlzLCByZWFkZXJzIHdpbGwKKyAqIGFsd2F5cyBzZWUgdGhlIG1vc3QgcmVjZW50IHdyaXRlLiBPZiB0aGVzZSwgdGhlIG1vc3QgaW50ZXJlc3RpbmcgaXMKKyAqIHRvIGRvIFFVT1JVTSByZWFkcyBhbmQgd3JpdGVzLCB3aGljaCBnaXZlcyB5b3UgY29uc2lzdGVuY3kgd2hpbGUKKyAqIHN0aWxsIGFsbG93aW5nIGF2YWlsYWJpbGl0eSBpbiB0aGUgZmFjZSBvZiBub2RlIGZhaWx1cmVzIHVwIHRvIGhhbGYKKyAqIG9mIDxSZXBsaWNhdGlvbkZhY3Rvcj4uIE9mIGNvdXJzZSBpZiBsYXRlbmN5IGlzIG1vcmUgaW1wb3J0YW50IHRoYW4KKyAqIGNvbnNpc3RlbmN5IHRoZW4geW91IGNhbiB1c2UgbG93ZXIgdmFsdWVzIGZvciBlaXRoZXIgb3IgYm90aC4KKyAqIAorICogU29tZSBDb25zaXN0ZW5jeUxldmVscyAoT05FLCBUV08sIFRIUkVFKSByZWZlciB0byBhIHNwZWNpZmljIG51bWJlcgorICogb2YgcmVwbGljYXMgcmF0aGVyIHRoYW4gYSBsb2dpY2FsIGNvbmNlcHQgdGhhdCBhZGp1c3RzCisgKiBhdXRvbWF0aWNhbGx5IHdpdGggdGhlIHJlcGxpY2F0aW9uIGZhY3Rvci4gIE9mIHRoZXNlLCBvbmx5IE9ORSBpcworICogY29tbW9ubHkgdXNlZDsgVFdPIGFuZCAoZXZlbiBtb3JlIHJhcmVseSkgVEhSRUUgYXJlIG9ubHkgdXNlZnVsCisgKiB3aGVuIHlvdSBjYXJlIG1vcmUgYWJvdXQgZ3VhcmFudGVlaW5nIGEgY2VydGFpbiBsZXZlbCBvZgorICogZHVyYWJpbGl0eSwgdGhhbiBjb25zaXN0ZW5jeS4KKyAqIAorICogV3JpdGUgY29uc2lzdGVuY3kgbGV2ZWxzIG1ha2UgdGhlIGZvbGxvd2luZyBndWFyYW50ZWVzIGJlZm9yZSByZXBvcnRpbmcgc3VjY2VzcyB0byB0aGUgY2xpZW50OgorICogICBBTlkgICAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gb25jZSBzb21ld2hlcmUsIGluY2x1ZGluZyBwb3NzaWJseSBiZWluZyBoaW50ZWQgaW4gYSBub24tdGFyZ2V0IG5vZGUuCisgKiAgIE9ORSAgICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byBhdCBsZWFzdCAxIG5vZGUncyBjb21taXQgbG9nIGFuZCBtZW1vcnkgdGFibGUKKyAqICAgVFdPICAgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIGF0IGxlYXN0IDIgbm9kZSdzIGNvbW1pdCBsb2cgYW5kIG1lbW9yeSB0YWJsZQorICogICBUSFJFRSAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gYXQgbGVhc3QgMyBub2RlJ3MgY29tbWl0IGxvZyBhbmQgbWVtb3J5IHRhYmxlCisgKiAgIFFVT1JVTSAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byA8UmVwbGljYXRpb25GYWN0b3I+IC8gMiArIDEgbm9kZXMKKyAqICAgTE9DQUxfUVVPUlVNIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIDxSZXBsaWNhdGlvbkZhY3Rvcj4gLyAyICsgMSBub2Rlcywgd2l0aGluIHRoZSBsb2NhbCBkYXRhY2VudGVyIChyZXF1aXJlcyBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneSkKKyAqICAgRUFDSF9RVU9SVU0gIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIDxSZXBsaWNhdGlvbkZhY3Rvcj4gLyAyICsgMSBub2RlcyBpbiBlYWNoIGRhdGFjZW50ZXIgKHJlcXVpcmVzIE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5KQorICogICBBTEwgICAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGlzIHdyaXR0ZW4gdG8gPGNvZGU+Jmx0O1JlcGxpY2F0aW9uRmFjdG9yJmd0OzwvY29kZT4gbm9kZXMgYmVmb3JlIHJlc3BvbmRpbmcgdG8gdGhlIGNsaWVudC4KKyAqIAorICogUmVhZCBjb25zaXN0ZW5jeSBsZXZlbHMgbWFrZSB0aGUgZm9sbG93aW5nIGd1YXJhbnRlZXMgYmVmb3JlIHJldHVybmluZyBzdWNjZXNzZnVsIHJlc3VsdHMgdG8gdGhlIGNsaWVudDoKKyAqICAgQU5ZICAgICAgICAgIE5vdCBzdXBwb3J0ZWQuIFlvdSBwcm9iYWJseSB3YW50IE9ORSBpbnN0ZWFkLgorICogICBPTkUgICAgICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIG9idGFpbmVkIGZyb20gYSBzaW5nbGUgcmVwbGljYS4KKyAqICAgVFdPICAgICAgICAgIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSB0d28gcmVwbGljYXMgaGF2ZSByZXBsaWVkLgorICogICBUSFJFRSAgICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIHRocmVlIHJlcGxpY2FzIGhhdmUgcmVwbGllZC4KKyAqICAgUVVPUlVNICAgICAgIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSBhIG1ham9yaXR5IG9mIHJlcGxpY2FzIGhhdmUgcmVwbGllZC4KKyAqICAgTE9DQUxfUVVPUlVNIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSBhIG1ham9yaXR5IG9mIHJlcGxpY2FzIHdpdGhpbiB0aGUgbG9jYWwgZGF0YWNlbnRlciBoYXZlIHJlcGxpZWQuCisgKiAgIEVBQ0hfUVVPUlVNICBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgYSBtYWpvcml0eSBvZiByZXBsaWNhcyB3aXRoaW4gZWFjaCBkYXRhY2VudGVyIGhhdmUgcmVwbGllZC4KKyAqICAgQUxMICAgICAgICAgIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSBhbGwgcmVwbGljYXMgaGF2ZSByZXBsaWVkIChpbXBsaWVzIG5vIHJlcGxpY2EgbWF5IGJlIGRvd24pLi4KKyovCitlbnVtIENvbnNpc3RlbmN5TGV2ZWwgeworICAgIE9ORSA9IDEsCisgICAgUVVPUlVNID0gMiwKKyAgICBMT0NBTF9RVU9SVU0gPSAzLAorICAgIEVBQ0hfUVVPUlVNID0gNCwKKyAgICBBTEwgPSA1LAorICAgIEFOWSA9IDYsCisgICAgVFdPID0gNywKKyAgICBUSFJFRSA9IDgsCit9CisKKy8qKgorICAgIENvbHVtblBhcmVudCBpcyB1c2VkIHdoZW4gc2VsZWN0aW5nIGdyb3VwcyBvZiBjb2x1bW5zIGZyb20gdGhlIHNhbWUgQ29sdW1uRmFtaWx5LiBJbiBkaXJlY3Rvcnkgc3RydWN0dXJlIHRlcm1zLCBpbWFnaW5lCisgICAgQ29sdW1uUGFyZW50IGFzIENvbHVtblBhdGggKyAnLy4uLycuCisKKyAgICBTZWUgYWxzbyA8YSBocmVmPSJjYXNzYW5kcmEuaHRtbCNTdHJ1Y3RfQ29sdW1uUGF0aCI+Q29sdW1uUGF0aDwvYT4KKyAqLworc3RydWN0IENvbHVtblBhcmVudCB7CisgICAgMzogcmVxdWlyZWQgc3RyaW5nIGNvbHVtbl9mYW1pbHksCisgICAgNDogb3B0aW9uYWwgYmluYXJ5IHN1cGVyX2NvbHVtbiwKK30KKworLyoqIFRoZSBDb2x1bW5QYXRoIGlzIHRoZSBwYXRoIHRvIGEgc2luZ2xlIGNvbHVtbiBpbiBDYXNzYW5kcmEuIEl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gdGhpbmsgb2YgQ29sdW1uUGF0aCBhbmQKKyAqIENvbHVtblBhcmVudCBpbiB0ZXJtcyBvZiBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCisgKgorICogQ29sdW1uUGF0aCBpcyB1c2VkIHRvIGxvb2tpbmcgdXAgYSBzaW5nbGUgY29sdW1uLgorICoKKyAqIEBwYXJhbSBjb2x1bW5fZmFtaWx5LiBUaGUgbmFtZSBvZiB0aGUgQ0Ygb2YgdGhlIGNvbHVtbiBiZWluZyBsb29rZWQgdXAuCisgKiBAcGFyYW0gc3VwZXJfY29sdW1uLiBUaGUgc3VwZXIgY29sdW1uIG5hbWUuCisgKiBAcGFyYW0gY29sdW1uLiBUaGUgY29sdW1uIG5hbWUuCisgKi8KK3N0cnVjdCBDb2x1bW5QYXRoIHsKKyAgICAzOiByZXF1aXJlZCBzdHJpbmcgY29sdW1uX2ZhbWlseSwKKyAgICA0OiBvcHRpb25hbCBiaW5hcnkgc3VwZXJfY29sdW1uLAorICAgIDU6IG9wdGlvbmFsIGJpbmFyeSBjb2x1bW4sCit9CisKKy8qKgorICAgIEEgc2xpY2UgcmFuZ2UgaXMgYSBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgYmFzaWMgcmFuZ2UsIG9yZGVyaW5nIGFuZCBsaW1pdCBpbmZvcm1hdGlvbiBmb3IgYSBxdWVyeSB0aGF0IHdpbGwgcmV0dXJuCisgICAgbXVsdGlwbGUgY29sdW1ucy4gSXQgY291bGQgYmUgdGhvdWdodCBvZiBhcyBDYXNzYW5kcmEncyB2ZXJzaW9uIG9mIExJTUlUIGFuZCBPUkRFUiBCWQorCisgICAgQHBhcmFtIHN0YXJ0LiBUaGUgY29sdW1uIG5hbWUgdG8gc3RhcnQgdGhlIHNsaWNlIHdpdGguIFRoaXMgYXR0cmlidXRlIGlzIG5vdCByZXF1aXJlZCwgdGhvdWdoIHRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUsCisgICAgICAgICAgICAgICAgICBhbmQgY2FuIGJlIHNhZmVseSBzZXQgdG8gJycsIGkuZS4sIGFuIGVtcHR5IGJ5dGUgYXJyYXksIHRvIHN0YXJ0IHdpdGggdGhlIGZpcnN0IGNvbHVtbiBuYW1lLiBPdGhlcndpc2UsIGl0CisgICAgICAgICAgICAgICAgICBtdXN0IGEgdmFsaWQgdmFsdWUgdW5kZXIgdGhlIHJ1bGVzIG9mIHRoZSBDb21wYXJhdG9yIGRlZmluZWQgZm9yIHRoZSBnaXZlbiBDb2x1bW5GYW1pbHkuCisgICAgQHBhcmFtIGZpbmlzaC4gVGhlIGNvbHVtbiBuYW1lIHRvIHN0b3AgdGhlIHNsaWNlIGF0LiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgcmVxdWlyZWQsIHRob3VnaCB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgIGFuZCBjYW4gYmUgc2FmZWx5IHNldCB0byBhbiBlbXB0eSBieXRlIGFycmF5IHRvIG5vdCBzdG9wIHVudGlsICdjb3VudCcgcmVzdWx0cyBhcmUgc2Vlbi4gT3RoZXJ3aXNlLCBpdAorICAgICAgICAgICAgICAgICAgIG11c3QgYWxzbyBiZSBhIHZhbGlkIHZhbHVlIHRvIHRoZSBDb2x1bW5GYW1pbHkgQ29tcGFyYXRvci4KKyAgICBAcGFyYW0gcmV2ZXJzZWQuIFdoZXRoZXIgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIG9yZGVyZWQgaW4gcmV2ZXJzZWQgb3JkZXIuIFNpbWlsYXIgdG8gT1JERVIgQlkgYmxhaCBERVNDIGluIFNRTC4KKyAgICBAcGFyYW0gY291bnQuIEhvdyBtYW55IGNvbHVtbnMgdG8gcmV0dXJuLiBTaW1pbGFyIHRvIExJTUlUIGluIFNRTC4gTWF5IGJlIGFyYml0cmFyaWx5IGxhcmdlLCBidXQgVGhyaWZ0IHdpbGwKKyAgICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplIHRoZSB3aG9sZSByZXN1bHQgaW50byBtZW1vcnkgYmVmb3JlIHJldHVybmluZyBpdCB0byB0aGUgY2xpZW50LCBzbyBiZSBhd2FyZSB0aGF0IHlvdSBtYXkKKyAgICAgICAgICAgICAgICAgIGJlIGJldHRlciBzZXJ2ZWQgYnkgaXRlcmF0aW5nIHRocm91Z2ggc2xpY2VzIGJ5IHBhc3NpbmcgdGhlIGxhc3QgdmFsdWUgb2Ygb25lIGNhbGwgaW4gYXMgdGhlICdzdGFydCcKKyAgICAgICAgICAgICAgICAgIG9mIHRoZSBuZXh0IGluc3RlYWQgb2YgaW5jcmVhc2luZyAnY291bnQnIGFyYml0cmFyaWx5IGxhcmdlLgorICovCitzdHJ1Y3QgU2xpY2VSYW5nZSB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IHN0YXJ0LAorICAgIDI6IHJlcXVpcmVkIGJpbmFyeSBmaW5pc2gsCisgICAgMzogcmVxdWlyZWQgYm9vbCByZXZlcnNlZD0wLAorICAgIDQ6IHJlcXVpcmVkIGkzMiBjb3VudD0xMDAsCit9CisKKy8qKgorICAgIEEgU2xpY2VQcmVkaWNhdGUgaXMgc2ltaWxhciB0byBhIG1hdGhlbWF0aWMgcHJlZGljYXRlIChzZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QcmVkaWNhdGVfKG1hdGhlbWF0aWNhbF9sb2dpYykpLAorICAgIHdoaWNoIGlzIGRlc2NyaWJlZCBhcyAiYSBwcm9wZXJ0eSB0aGF0IHRoZSBlbGVtZW50cyBvZiBhIHNldCBoYXZlIGluIGNvbW1vbi4iCisKKyAgICBTbGljZVByZWRpY2F0ZSdzIGluIENhc3NhbmRyYSBhcmUgZGVzY3JpYmVkIHdpdGggZWl0aGVyIGEgbGlzdCBvZiBjb2x1bW5fbmFtZXMgb3IgYSBTbGljZVJhbmdlLiAgSWYgY29sdW1uX25hbWVzIGlzCisgICAgc3BlY2lmaWVkLCBzbGljZV9yYW5nZSBpcyBpZ25vcmVkLgorCisgICAgQHBhcmFtIGNvbHVtbl9uYW1lLiBBIGxpc3Qgb2YgY29sdW1uIG5hbWVzIHRvIHJldHJpZXZlLiBUaGlzIGNhbiBiZSB1c2VkIHNpbWlsYXIgdG8gTWVtY2FjaGVkJ3MgIm11bHRpLWdldCIgZmVhdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgdG8gZmV0Y2ggTiBrbm93biBjb2x1bW4gbmFtZXMuIEZvciBpbnN0YW5jZSwgaWYgeW91IGtub3cgeW91IHdpc2ggdG8gZmV0Y2ggY29sdW1ucyAnSm9lJywgJ0phY2snLAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kICdKaW0nIHlvdSBjYW4gcGFzcyB0aG9zZSBjb2x1bW4gbmFtZXMgYXMgYSBsaXN0IHRvIGZldGNoIGFsbCB0aHJlZSBhdCBvbmNlLgorICAgIEBwYXJhbSBzbGljZV9yYW5nZS4gQSBTbGljZVJhbmdlIGRlc2NyaWJpbmcgaG93IHRvIHJhbmdlLCBvcmRlciwgYW5kL29yIGxpbWl0IHRoZSBzbGljZS4KKyAqLworc3RydWN0IFNsaWNlUHJlZGljYXRlIHsKKyAgICAxOiBvcHRpb25hbCBsaXN0PGJpbmFyeT4gY29sdW1uX25hbWVzLAorICAgIDI6IG9wdGlvbmFsIFNsaWNlUmFuZ2UgICBzbGljZV9yYW5nZSwKK30KKworZW51bSBJbmRleE9wZXJhdG9yIHsKKyAgICBFUSwKKyAgICBHVEUsCisgICAgR1QsCisgICAgTFRFLAorICAgIExUCit9CisKK3N0cnVjdCBJbmRleEV4cHJlc3Npb24geworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBjb2x1bW5fbmFtZSwKKyAgICAyOiByZXF1aXJlZCBJbmRleE9wZXJhdG9yIG9wLAorICAgIDM6IHJlcXVpcmVkIGJpbmFyeSB2YWx1ZSwKK30KKworc3RydWN0IEluZGV4Q2xhdXNlIHsKKyAgICAxOiByZXF1aXJlZCBsaXN0PEluZGV4RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMKKyAgICAyOiByZXF1aXJlZCBiaW5hcnkgc3RhcnRfa2V5LAorICAgIDM6IHJlcXVpcmVkIGkzMiBjb3VudD0xMDAsCit9CisKKy8qKgorVGhlIHNlbWFudGljcyBvZiBzdGFydCBrZXlzIGFuZCB0b2tlbnMgYXJlIHNsaWdodGx5IGRpZmZlcmVudC4KK0tleXMgYXJlIHN0YXJ0LWluY2x1c2l2ZTsgdG9rZW5zIGFyZSBzdGFydC1leGNsdXNpdmUuICBUb2tlbgorcmFuZ2VzIG1heSBhbHNvIHdyYXAgLS0gdGhhdCBpcywgdGhlIGVuZCB0b2tlbiBtYXkgYmUgbGVzcwordGhhbiB0aGUgc3RhcnQgb25lLiAgVGh1cywgYSByYW5nZSBmcm9tIGtleVggdG8ga2V5WCBpcyBhCitvbmUtZWxlbWVudCByYW5nZSwgYnV0IGEgcmFuZ2UgZnJvbSB0b2tlblkgdG8gdG9rZW5ZIGlzIHRoZQorZnVsbCByaW5nLgorKi8KK3N0cnVjdCBLZXlSYW5nZSB7CisgICAgMTogb3B0aW9uYWwgYmluYXJ5IHN0YXJ0X2tleSwKKyAgICAyOiBvcHRpb25hbCBiaW5hcnkgZW5kX2tleSwKKyAgICAzOiBvcHRpb25hbCBzdHJpbmcgc3RhcnRfdG9rZW4sCisgICAgNDogb3B0aW9uYWwgc3RyaW5nIGVuZF90b2tlbiwKKyAgICA1OiByZXF1aXJlZCBpMzIgY291bnQ9MTAwCit9CisKKy8qKgorICAgIEEgS2V5U2xpY2UgaXMga2V5IGZvbGxvd2VkIGJ5IHRoZSBkYXRhIGl0IG1hcHMgdG8uIEEgY29sbGVjdGlvbiBvZiBLZXlTbGljZSBpcyByZXR1cm5lZCBieSB0aGUgZ2V0X3JhbmdlX3NsaWNlIG9wZXJhdGlvbi4KKworICAgIEBwYXJhbSBrZXkuIGEgcm93IGtleQorICAgIEBwYXJhbSBjb2x1bW5zLiBMaXN0IG9mIGRhdGEgcmVwcmVzZW50ZWQgYnkgdGhlIGtleS4gVHlwaWNhbGx5LCB0aGUgbGlzdCBpcyBwYXJlZCBkb3duIHRvIG9ubHkgdGhlIGNvbHVtbnMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgIGEgU2xpY2VQcmVkaWNhdGUuCisgKi8KK3N0cnVjdCBLZXlTbGljZSB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAyOiByZXF1aXJlZCBsaXN0PENvbHVtbk9yU3VwZXJDb2x1bW4+IGNvbHVtbnMsCit9CisKK3N0cnVjdCBLZXlDb3VudCB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAyOiByZXF1aXJlZCBpMzIgY291bnQKK30KKworLyoqCisgKiBOb3RlIHRoYXQgdGhlIHRpbWVzdGFtcCBpcyBvbmx5IG9wdGlvbmFsIGluIGNhc2Ugb2YgY291bnRlciBkZWxldGlvbi4KKyAqLworc3RydWN0IERlbGV0aW9uIHsKKyAgICAxOiBvcHRpb25hbCBpNjQgdGltZXN0YW1wLAorICAgIDI6IG9wdGlvbmFsIGJpbmFyeSBzdXBlcl9jb2x1bW4sCisgICAgMzogb3B0aW9uYWwgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLAorfQorCisvKioKKyAgICBBIE11dGF0aW9uIGlzIGVpdGhlciBhbiBpbnNlcnQgKHJlcHJlc2VudGVkIGJ5IGZpbGxpbmcgY29sdW1uX29yX3N1cGVyY29sdW1uKSBvciBhIGRlbGV0aW9uIChyZXByZXNlbnRlZCBieSBmaWxsaW5nIHRoZSBkZWxldGlvbiBhdHRyaWJ1dGUpLgorICAgIEBwYXJhbSBjb2x1bW5fb3Jfc3VwZXJjb2x1bW4uIEFuIGluc2VydCB0byBhIGNvbHVtbiBvciBzdXBlcmNvbHVtbiAocG9zc2libHkgY291bnRlciBjb2x1bW4gb3Igc3VwZXJjb2x1bW4pCisgICAgQHBhcmFtIGRlbGV0aW9uLiBBIGRlbGV0aW9uIG9mIGEgY29sdW1uIG9yIHN1cGVyY29sdW1uCisqLworc3RydWN0IE11dGF0aW9uIHsKKyAgICAxOiBvcHRpb25hbCBDb2x1bW5PclN1cGVyQ29sdW1uIGNvbHVtbl9vcl9zdXBlcmNvbHVtbiwKKyAgICAyOiBvcHRpb25hbCBEZWxldGlvbiBkZWxldGlvbiwKK30KKworc3RydWN0IEVuZHBvaW50RGV0YWlscyB7CisgICAgMTogc3RyaW5nIGhvc3QsCisgICAgMjogc3RyaW5nIGRhdGFjZW50ZXIsCisgICAgMzogb3B0aW9uYWwgc3RyaW5nIHJhY2sKK30KKworLyoqCisgICAgQSBUb2tlblJhbmdlIGRlc2NyaWJlcyBwYXJ0IG9mIHRoZSBDYXNzYW5kcmEgcmluZywgaXQgaXMgYSBtYXBwaW5nIGZyb20gYSByYW5nZSB0bworICAgIGVuZHBvaW50cyByZXNwb25zaWJsZSBmb3IgdGhhdCByYW5nZS4KKyAgICBAcGFyYW0gc3RhcnRfdG9rZW4gVGhlIGZpcnN0IHRva2VuIGluIHRoZSByYW5nZQorICAgIEBwYXJhbSBlbmRfdG9rZW4gVGhlIGxhc3QgdG9rZW4gaW4gdGhlIHJhbmdlCisgICAgQHBhcmFtIGVuZHBvaW50cyBUaGUgZW5kcG9pbnRzIHJlc3BvbnNpYmxlIGZvciB0aGUgcmFuZ2UgKGxpc3RlZCBieSB0aGVpciBjb25maWd1cmVkIGxpc3Rlbl9hZGRyZXNzKQorICAgIEBwYXJhbSBycGNfZW5kcG9pbnRzIFRoZSBlbmRwb2ludHMgcmVzcG9uc2libGUgZm9yIHRoZSByYW5nZSAobGlzdGVkIGJ5IHRoZWlyIGNvbmZpZ3VyZWQgcnBjX2FkZHJlc3MpCisqLworc3RydWN0IFRva2VuUmFuZ2UgeworICAgIDE6IHJlcXVpcmVkIHN0cmluZyBzdGFydF90b2tlbiwKKyAgICAyOiByZXF1aXJlZCBzdHJpbmcgZW5kX3Rva2VuLAorICAgIDM6IHJlcXVpcmVkIGxpc3Q8c3RyaW5nPiBlbmRwb2ludHMsCisgICAgNDogb3B0aW9uYWwgbGlzdDxzdHJpbmc+IHJwY19lbmRwb2ludHMKKyAgICA1OiBvcHRpb25hbCBsaXN0PEVuZHBvaW50RGV0YWlscz4gZW5kcG9pbnRfZGV0YWlscywKK30KKworLyoqCisgICAgQXV0aGVudGljYXRpb24gcmVxdWVzdHMgY2FuIGNvbnRhaW4gYW55IGRhdGEsIGRlcGVuZGVudCBvbiB0aGUgSUF1dGhlbnRpY2F0b3IgdXNlZAorKi8KK3N0cnVjdCBBdXRoZW50aWNhdGlvblJlcXVlc3QgeworICAgIDE6IHJlcXVpcmVkIG1hcDxzdHJpbmcsIHN0cmluZz4gY3JlZGVudGlhbHMKK30KKworZW51bSBJbmRleFR5cGUgeworICAgIEtFWVMsCisgICAgQ1VTVE9NCit9CisKKy8qIGRlc2NyaWJlcyBhIGNvbHVtbiBpbiBhIGNvbHVtbiBmYW1pbHkuICovCitzdHJ1Y3QgQ29sdW1uRGVmIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkgbmFtZSwKKyAgICAyOiByZXF1aXJlZCBzdHJpbmcgdmFsaWRhdGlvbl9jbGFzcywKKyAgICAzOiBvcHRpb25hbCBJbmRleFR5cGUgaW5kZXhfdHlwZSwKKyAgICA0OiBvcHRpb25hbCBzdHJpbmcgaW5kZXhfbmFtZSwKKyAgICA1OiBvcHRpb25hbCBtYXA8c3RyaW5nLHN0cmluZz4gaW5kZXhfb3B0aW9ucworfQorCisKKy8qIGRlc2NyaWJlcyBhIGNvbHVtbiBmYW1pbHkuICovCitzdHJ1Y3QgQ2ZEZWYgeworICAgIDE6IHJlcXVpcmVkIHN0cmluZyBrZXlzcGFjZSwKKyAgICAyOiByZXF1aXJlZCBzdHJpbmcgbmFtZSwKKyAgICAzOiBvcHRpb25hbCBzdHJpbmcgY29sdW1uX3R5cGU9IlN0YW5kYXJkIiwKKyAgICA1OiBvcHRpb25hbCBzdHJpbmcgY29tcGFyYXRvcl90eXBlPSJCeXRlc1R5cGUiLAorICAgIDY6IG9wdGlvbmFsIHN0cmluZyBzdWJjb21wYXJhdG9yX3R5cGUsCisgICAgODogb3B0aW9uYWwgc3RyaW5nIGNvbW1lbnQsCisgICAgMTI6IG9wdGlvbmFsIGRvdWJsZSByZWFkX3JlcGFpcl9jaGFuY2U9MS4wLAorICAgIDEzOiBvcHRpb25hbCBsaXN0PENvbHVtbkRlZj4gY29sdW1uX21ldGFkYXRhLAorICAgIDE0OiBvcHRpb25hbCBpMzIgZ2NfZ3JhY2Vfc2Vjb25kcywKKyAgICAxNTogb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsaWRhdGlvbl9jbGFzcywKKyAgICAxNjogb3B0aW9uYWwgaTMyIGlkLAorICAgIDE3OiBvcHRpb25hbCBpMzIgbWluX2NvbXBhY3Rpb25fdGhyZXNob2xkLAorICAgIDE4OiBvcHRpb25hbCBpMzIgbWF4X2NvbXBhY3Rpb25fdGhyZXNob2xkLAorICAgIDI0OiBvcHRpb25hbCBib29sIHJlcGxpY2F0ZV9vbl93cml0ZSwKKyAgICAyNTogb3B0aW9uYWwgZG91YmxlIG1lcmdlX3NoYXJkc19jaGFuY2UsCisgICAgMjY6IG9wdGlvbmFsIHN0cmluZyBrZXlfdmFsaWRhdGlvbl9jbGFzcywKKyAgICAyODogb3B0aW9uYWwgYmluYXJ5IGtleV9hbGlhcywKKyAgICAyOTogb3B0aW9uYWwgc3RyaW5nIGNvbXBhY3Rpb25fc3RyYXRlZ3ksCisgICAgMzA6IG9wdGlvbmFsIG1hcDxzdHJpbmcsc3RyaW5nPiBjb21wYWN0aW9uX3N0cmF0ZWd5X29wdGlvbnMsCisgICAgMzI6IG9wdGlvbmFsIG1hcDxzdHJpbmcsc3RyaW5nPiBjb21wcmVzc2lvbl9vcHRpb25zLAorICAgIDMzOiBvcHRpb25hbCBkb3VibGUgYmxvb21fZmlsdGVyX2ZwX2NoYW5jZSwKK30KKworLyogZGVzY3JpYmVzIGEga2V5c3BhY2UuICovCitzdHJ1Y3QgS3NEZWYgeworICAgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyBzdHJhdGVneV9jbGFzcywKKyAgICAzOiBvcHRpb25hbCBtYXA8c3RyaW5nLHN0cmluZz4gc3RyYXRlZ3lfb3B0aW9ucywKKworICAgIC8qKiBAZGVwcmVjYXRlZCAqLworICAgIDQ6IG9wdGlvbmFsIGkzMiByZXBsaWNhdGlvbl9mYWN0b3IsIAorCisgICAgNTogcmVxdWlyZWQgbGlzdDxDZkRlZj4gY2ZfZGVmcywKKyAgICA2OiBvcHRpb25hbCBib29sIGR1cmFibGVfd3JpdGVzPTEsCit9CisKKy8qKiBDUUwgcXVlcnkgY29tcHJlc3Npb24gKi8KK2VudW0gQ29tcHJlc3Npb24geworICAgIEdaSVAgPSAxLAorICAgIE5PTkUgPSAyCit9CisKK2VudW0gQ3FsUmVzdWx0VHlwZSB7CisgICAgUk9XUyA9IDEsCisgICAgVk9JRCA9IDIsCisgICAgSU5UID0gMworfQorCisvKiogUm93IHJldHVybmVkIGZyb20gYSBDUUwgcXVlcnkgKi8KK3N0cnVjdCBDcWxSb3cgeworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgMjogcmVxdWlyZWQgbGlzdDxDb2x1bW4+IGNvbHVtbnMKK30KKworc3RydWN0IENxbE1ldGFkYXRhIHsKKyAgICAxOiByZXF1aXJlZCBtYXA8YmluYXJ5LHN0cmluZz4gbmFtZV90eXBlcywKKyAgICAyOiByZXF1aXJlZCBtYXA8YmluYXJ5LHN0cmluZz4gdmFsdWVfdHlwZXMsCisgICAgMzogcmVxdWlyZWQgc3RyaW5nIGRlZmF1bHRfbmFtZV90eXBlLAorICAgIDQ6IHJlcXVpcmVkIHN0cmluZyBkZWZhdWx0X3ZhbHVlX3R5cGUKK30KKworc3RydWN0IENxbFJlc3VsdCB7CisgICAgMTogcmVxdWlyZWQgQ3FsUmVzdWx0VHlwZSB0eXBlLAorICAgIDI6IG9wdGlvbmFsIGxpc3Q8Q3FsUm93PiByb3dzLAorICAgIDM6IG9wdGlvbmFsIGkzMiBudW0sCisgICAgNDogb3B0aW9uYWwgQ3FsTWV0YWRhdGEgc2NoZW1hCit9CisKK3N0cnVjdCBDcWxQcmVwYXJlZFJlc3VsdCB7CisgICAgMTogcmVxdWlyZWQgaTMyIGl0ZW1JZCwKKyAgICAyOiByZXF1aXJlZCBpMzIgY291bnQKK30KKworCitzZXJ2aWNlIENhc3NhbmRyYSB7CisgICMgYXV0aCBtZXRob2RzCisgIHZvaWQgbG9naW4oMTogcmVxdWlyZWQgQXV0aGVudGljYXRpb25SZXF1ZXN0IGF1dGhfcmVxdWVzdCkgdGhyb3dzICgxOkF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIGF1dGhueCwgMjpBdXRob3JpemF0aW9uRXhjZXB0aW9uIGF1dGh6eCksCisgCisgICMgc2V0IGtleXNwYWNlCisgIHZvaWQgc2V0X2tleXNwYWNlKDE6IHJlcXVpcmVkIHN0cmluZyBrZXlzcGFjZSkgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisgIAorICAjIHJldHJpZXZhbCBtZXRob2RzCisKKyAgLyoqCisgICAgR2V0IHRoZSBDb2x1bW4gb3IgU3VwZXJDb2x1bW4gYXQgdGhlIGdpdmVuIGNvbHVtbl9wYXRoLiBJZiBubyB2YWx1ZSBpcyBwcmVzZW50LCBOb3RGb3VuZEV4Y2VwdGlvbiBpcyB0aHJvd24uIChUaGlzIGlzCisgICAgdGhlIG9ubHkgbWV0aG9kIHRoYXQgY2FuIHRocm93IGFuIGV4Y2VwdGlvbiB1bmRlciBub24tZmFpbHVyZSBjb25kaXRpb25zLikKKyAgICovCisgIENvbHVtbk9yU3VwZXJDb2x1bW4gZ2V0KDE6cmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXRoIGNvbHVtbl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpOb3RGb3VuZEV4Y2VwdGlvbiBuZmUsIDM6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDQ6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgIEdldCB0aGUgZ3JvdXAgb2YgY29sdW1ucyBjb250YWluZWQgYnkgY29sdW1uX3BhcmVudCAoZWl0aGVyIGEgQ29sdW1uRmFtaWx5IG5hbWUgb3IgYSBDb2x1bW5GYW1pbHkvU3VwZXJDb2x1bW4gbmFtZQorICAgIHBhaXIpIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gU2xpY2VQcmVkaWNhdGUuIElmIG5vIG1hdGNoaW5nIHZhbHVlcyBhcmUgZm91bmQsIGFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQuCisgICAqLworICBsaXN0PENvbHVtbk9yU3VwZXJDb2x1bW4+IGdldF9zbGljZSgxOnJlcXVpcmVkIGJpbmFyeSBrZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgbWF0Y2hpbmcgPGNvZGU+cHJlZGljYXRlPC9jb2RlPiBmb3IgYSBwYXJ0aWN1bGFyIDxjb2RlPmtleTwvY29kZT4sIAorICAgIDxjb2RlPkNvbHVtbkZhbWlseTwvY29kZT4gYW5kIG9wdGlvbmFsbHkgPGNvZGU+U3VwZXJDb2x1bW48L2NvZGU+LgorICAqLworICBpMzIgZ2V0X2NvdW50KDE6cmVxdWlyZWQgYmluYXJ5IGtleSwgCisgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwgCisgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgUGVyZm9ybXMgYSBnZXRfc2xpY2UgZm9yIGNvbHVtbl9wYXJlbnQgYW5kIHByZWRpY2F0ZSBmb3IgdGhlIGdpdmVuIGtleXMgaW4gcGFyYWxsZWwuCisgICovCisgIG1hcDxiaW5hcnksbGlzdDxDb2x1bW5PclN1cGVyQ29sdW1uPj4gbXVsdGlnZXRfc2xpY2UoMTpyZXF1aXJlZCBsaXN0PGJpbmFyeT4ga2V5cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICBQZXJmb3JtIGEgZ2V0X2NvdW50IGluIHBhcmFsbGVsIG9uIHRoZSBnaXZlbiBsaXN0PGJpbmFyeT4ga2V5cy4gVGhlIHJldHVybiB2YWx1ZSBtYXBzIGtleXMgdG8gdGhlIGNvdW50IGZvdW5kLgorICAqLworICBtYXA8YmluYXJ5LCBpMzI+IG11bHRpZ2V0X2NvdW50KDE6cmVxdWlyZWQgbGlzdDxiaW5hcnk+IGtleXMsCisgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwKKyAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgIHJldHVybnMgYSBzdWJzZXQgb2YgY29sdW1ucyBmb3IgYSBjb250aWd1b3VzIHJhbmdlIG9mIGtleXMuCisgICovCisgIGxpc3Q8S2V5U2xpY2U+IGdldF9yYW5nZV9zbGljZXMoMTpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBLZXlSYW5nZSByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKiBSZXR1cm5zIHRoZSBzdWJzZXQgb2YgY29sdW1ucyBzcGVjaWZpZWQgaW4gU2xpY2VQcmVkaWNhdGUgZm9yIHRoZSByb3dzIG1hdGNoaW5nIHRoZSBJbmRleENsYXVzZSAqLworICBsaXN0PEtleVNsaWNlPiBnZXRfaW5kZXhlZF9zbGljZXMoMTpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgSW5kZXhDbGF1c2UgaW5kZXhfY2xhdXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBTbGljZVByZWRpY2F0ZSBjb2x1bW5fcHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAjIG1vZGlmaWNhdGlvbiBtZXRob2RzCisKKyAgLyoqCisgICAqIEluc2VydCBhIENvbHVtbiBhdCB0aGUgZ2l2ZW4gY29sdW1uX3BhcmVudC5jb2x1bW5fZmFtaWx5IGFuZCBvcHRpb25hbCBjb2x1bW5fcGFyZW50LnN1cGVyX2NvbHVtbi4KKyAgICovCisgIHZvaWQgaW5zZXJ0KDE6cmVxdWlyZWQgYmluYXJ5IGtleSwgCisgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsCisgICAgICAgICAgICAgIDM6cmVxdWlyZWQgQ29sdW1uIGNvbHVtbiwKKyAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgKiBJbmNyZW1lbnQgb3IgZGVjcmVtZW50IGEgY291bnRlci4KKyAgICovCisgIHZvaWQgYWRkKDE6cmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwKKyAgICAgICAgICAgMzpyZXF1aXJlZCBDb3VudGVyQ29sdW1uIGNvbHVtbiwKKyAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgIFJlbW92ZSBkYXRhIGZyb20gdGhlIHJvdyBzcGVjaWZpZWQgYnkga2V5IGF0IHRoZSBncmFudWxhcml0eSBzcGVjaWZpZWQgYnkgY29sdW1uX3BhdGgsIGFuZCB0aGUgZ2l2ZW4gdGltZXN0YW1wLiBOb3RlCisgICAgdGhhdCBhbGwgdGhlIHZhbHVlcyBpbiBjb2x1bW5fcGF0aCBiZXNpZGVzIGNvbHVtbl9wYXRoLmNvbHVtbl9mYW1pbHkgYXJlIHRydWx5IG9wdGlvbmFsOiB5b3UgY2FuIHJlbW92ZSB0aGUgZW50aXJlCisgICAgcm93IGJ5IGp1c3Qgc3BlY2lmeWluZyB0aGUgQ29sdW1uRmFtaWx5LCBvciB5b3UgY2FuIHJlbW92ZSBhIFN1cGVyQ29sdW1uIG9yIGEgc2luZ2xlIENvbHVtbiBieSBzcGVjaWZ5aW5nIHRob3NlIGxldmVscyB0b28uCisgICAqLworICB2b2lkIHJlbW92ZSgxOnJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGF0aCBjb2x1bW5fcGF0aCwKKyAgICAgICAgICAgICAgMzpyZXF1aXJlZCBpNjQgdGltZXN0YW1wLAorICAgICAgICAgICAgICA0OkNvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAqIFJlbW92ZSBhIGNvdW50ZXIgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KKyAgICogTm90ZSB0aGF0IGNvdW50ZXJzIGhhdmUgbGltaXRlZCBzdXBwb3J0IGZvciBkZWxldGVzOiBpZiB5b3UgcmVtb3ZlIGEgY291bnRlciwgeW91IG11c3Qgd2FpdCB0byBpc3N1ZSBhbnkgZm9sbG93aW5nIHVwZGF0ZQorICAgKiB1bnRpbCB0aGUgZGVsZXRlIGhhcyByZWFjaGVkIGFsbCB0aGUgbm9kZXMgYW5kIGFsbCBvZiB0aGVtIGhhdmUgYmVlbiBmdWxseSBjb21wYWN0ZWQuCisgICAqLworICB2b2lkIHJlbW92ZV9jb3VudGVyKDE6cmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhdGggcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworCisgIC8qKgorICAgIE11dGF0ZSBtYW55IGNvbHVtbnMgb3Igc3VwZXIgY29sdW1ucyBmb3IgbWFueSByb3cga2V5cy4gU2VlIGFsc286IE11dGF0aW9uLgorCisgICAgbXV0YXRpb25fbWFwIG1hcHMga2V5IHRvIGNvbHVtbiBmYW1pbHkgdG8gYSBsaXN0IG9mIE11dGF0aW9uIG9iamVjdHMgdG8gdGFrZSBwbGFjZSBhdCB0aGF0IHNjb3BlLgorICAqKi8KKyAgdm9pZCBiYXRjaF9tdXRhdGUoMTpyZXF1aXJlZCBtYXA8YmluYXJ5LCBtYXA8c3RyaW5nLCBsaXN0PE11dGF0aW9uPj4+IG11dGF0aW9uX21hcCwKKyAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorICAgICAgIAorICAvKioKKyAgIFRydW5jYXRlIHdpbGwgbWFyayBhbmQgZW50aXJlIGNvbHVtbiBmYW1pbHkgYXMgZGVsZXRlZC4KKyAgIEZyb20gdGhlIHVzZXIncyBwZXJzcGVjdGl2ZSBhIHN1Y2Nlc3NmdWwgY2FsbCB0byB0cnVuY2F0ZSB3aWxsIHJlc3VsdCBjb21wbGV0ZSBkYXRhIGRlbGV0aW9uIGZyb20gY2ZuYW1lLgorICAgSW50ZXJuYWxseSwgaG93ZXZlciwgZGlzayBzcGFjZSB3aWxsIG5vdCBiZSBpbW1lZGlhdGlseSByZWxlYXNlZCwgYXMgd2l0aCBhbGwgZGVsZXRlcyBpbiBjYXNzYW5kcmEsIHRoaXMgb25lCisgICBvbmx5IG1hcmtzIHRoZSBkYXRhIGFzIGRlbGV0ZWQuCisgICBUaGUgb3BlcmF0aW9uIHN1Y2NlZWRzIG9ubHkgaWYgYWxsIGhvc3RzIGluIHRoZSBjbHVzdGVyIGF0IGF2YWlsYWJsZSBhbmQgd2lsbCB0aHJvdyBhbiBVbmF2YWlsYWJsZUV4Y2VwdGlvbiBpZiAKKyAgIHNvbWUgaG9zdHMgYXJlIGRvd24uCisgICovCisgIHZvaWQgdHJ1bmNhdGUoMTpyZXF1aXJlZCBzdHJpbmcgY2ZuYW1lKQorICAgICAgIHRocm93cyAoMTogSW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOiBVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzogVGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisKKyAgICAKKyAgLy8gTWV0YS1BUElzIC0tIEFQSXMgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBub2RlIG9yIGNsdXN0ZXIsCisgIC8vIHJhdGhlciB0aGFuIHVzZXIgZGF0YS4gIFRoZSBub2RlcHJvYmUgcHJvZ3JhbSBwcm92aWRlcyB1c2FnZSBleGFtcGxlcy4KKyAgCisgIC8qKiAKKyAgICogZm9yIGVhY2ggc2NoZW1hIHZlcnNpb24gcHJlc2VudCBpbiB0aGUgY2x1c3RlciwgcmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgYXQgdGhhdCB2ZXJzaW9uLgorICAgKiBob3N0cyB0aGF0IGRvIG5vdCByZXNwb25kIHdpbGwgYmUgdW5kZXIgdGhlIGtleSBEYXRhYmFzZURlc2NyaXB0b3IuSU5JVElBTF9WRVJTSU9OLiAKKyAgICogdGhlIGNsdXN0ZXIgaXMgYWxsIG9uIHRoZSBzYW1lIHZlcnNpb24gaWYgdGhlIHNpemUgb2YgdGhlIG1hcCBpcyAxLiAKKyAgICovCisgIG1hcDxzdHJpbmcsIGxpc3Q8c3RyaW5nPj4gZGVzY3JpYmVfc2NoZW1hX3ZlcnNpb25zKCkKKyAgICAgICB0aHJvd3MgKDE6IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIGxpc3QgdGhlIGRlZmluZWQga2V5c3BhY2VzIGluIHRoaXMgY2x1c3RlciAqLworICBsaXN0PEtzRGVmPiBkZXNjcmliZV9rZXlzcGFjZXMoKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiBnZXQgdGhlIGNsdXN0ZXIgbmFtZSAqLworICBzdHJpbmcgZGVzY3JpYmVfY2x1c3Rlcl9uYW1lKCksCisKKyAgLyoqIGdldCB0aGUgdGhyaWZ0IGFwaSB2ZXJzaW9uICovCisgIHN0cmluZyBkZXNjcmliZV92ZXJzaW9uKCksCisKKyAgLyoqIGdldCB0aGUgdG9rZW4gcmluZzogYSBtYXAgb2YgcmFuZ2VzIHRvIGhvc3QgYWRkcmVzc2VzLAorICAgICAgcmVwcmVzZW50ZWQgYXMgYSBzZXQgb2YgVG9rZW5SYW5nZSBpbnN0ZWFkIG9mIGEgbWFwIGZyb20gcmFuZ2UKKyAgICAgIHRvIGxpc3Qgb2YgZW5kcG9pbnRzLCBiZWNhdXNlIHlvdSBjYW4ndCB1c2UgVGhyaWZ0IHN0cnVjdHMgYXMKKyAgICAgIG1hcCBrZXlzOgorICAgICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTYyIAorCisgICAgICBmb3IgdGhlIHNhbWUgcmVhc29uLCB3ZSBjYW4ndCByZXR1cm4gYSBzZXQgaGVyZSwgZXZlbiB0aG91Z2gKKyAgICAgIG9yZGVyIGlzIG5laXRoZXIgaW1wb3J0YW50IG5vciBwcmVkaWN0YWJsZS4gKi8KKyAgbGlzdDxUb2tlblJhbmdlPiBkZXNjcmliZV9yaW5nKDE6cmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlKQorICAgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiByZXR1cm5zIHRoZSBwYXJ0aXRpb25lciB1c2VkIGJ5IHRoaXMgY2x1c3RlciAqLworICBzdHJpbmcgZGVzY3JpYmVfcGFydGl0aW9uZXIoKSwKKworICAvKiogcmV0dXJucyB0aGUgc25pdGNoIHVzZWQgYnkgdGhpcyBjbHVzdGVyICovCisgIHN0cmluZyBkZXNjcmliZV9zbml0Y2goKSwKKworICAvKiogZGVzY3JpYmUgc3BlY2lmaWVkIGtleXNwYWNlICovCisgIEtzRGVmIGRlc2NyaWJlX2tleXNwYWNlKDE6cmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlKQorICAgIHRocm93cyAoMTpOb3RGb3VuZEV4Y2VwdGlvbiBuZmUsIDI6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKworICAvKiogZXhwZXJpbWVudGFsIEFQSSBmb3IgaGFkb29wL3BhcmFsbGVsIHF1ZXJ5IHN1cHBvcnQuICAKKyAgICAgIG1heSBjaGFuZ2UgdmlvbGVudGx5IGFuZCB3aXRob3V0IHdhcm5pbmcuIAorCisgICAgICByZXR1cm5zIGxpc3Qgb2YgdG9rZW4gc3RyaW5ncyBzdWNoIHRoYXQgZmlyc3Qgc3VicmFuZ2UgaXMgKGxpc3RbMF0sIGxpc3RbMV1dLAorICAgICAgbmV4dCBpcyAobGlzdFsxXSwgbGlzdFsyXV0sIGV0Yy4gKi8KKyAgbGlzdDxzdHJpbmc+IGRlc2NyaWJlX3NwbGl0cygxOnJlcXVpcmVkIHN0cmluZyBjZk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBzdHJpbmcgc3RhcnRfdG9rZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgc3RyaW5nIGVuZF90b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIGkzMiBrZXlzX3Blcl9zcGxpdCkKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKworICAvKiogYWRkcyBhIGNvbHVtbiBmYW1pbHkuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fYWRkX2NvbHVtbl9mYW1pbHkoMTpyZXF1aXJlZCBDZkRlZiBjZl9kZWYpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKSwKKyAgICAKKyAgLyoqIGRyb3BzIGEgY29sdW1uIGZhbWlseS4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV9kcm9wX2NvbHVtbl9mYW1pbHkoMTpyZXF1aXJlZCBzdHJpbmcgY29sdW1uX2ZhbWlseSkKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLCAKKyAgCisgIC8qKiBhZGRzIGEga2V5c3BhY2UgYW5kIGFueSBjb2x1bW4gZmFtaWxpZXMgdGhhdCBhcmUgcGFydCBvZiBpdC4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV9hZGRfa2V5c3BhY2UoMTpyZXF1aXJlZCBLc0RlZiBrc19kZWYpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKSwKKyAgCisgIC8qKiBkcm9wcyBhIGtleXNwYWNlIGFuZCBhbnkgY29sdW1uIGZhbWlsaWVzIHRoYXQgYXJlIHBhcnQgb2YgaXQuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fZHJvcF9rZXlzcGFjZSgxOnJlcXVpcmVkIHN0cmluZyBrZXlzcGFjZSkKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAKKyAgLyoqIHVwZGF0ZXMgcHJvcGVydGllcyBvZiBhIGtleXNwYWNlLiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX3VwZGF0ZV9rZXlzcGFjZSgxOnJlcXVpcmVkIEtzRGVmIGtzX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAgICAgICAKKyAgLyoqIHVwZGF0ZXMgcHJvcGVydGllcyBvZiBhIGNvbHVtbiBmYW1pbHkuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fdXBkYXRlX2NvbHVtbl9mYW1pbHkoMTpyZXF1aXJlZCBDZkRlZiBjZl9kZWYpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKSwKKyAgCisgIC8qKgorICAgKiBFeGVjdXRlcyBhIENRTCAoQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlKSBzdGF0ZW1lbnQgYW5kIHJldHVybnMgYQorICAgKiBDcWxSZXN1bHQgY29udGFpbmluZyB0aGUgcmVzdWx0cy4KKyAgICovCisgIENxbFJlc3VsdCBleGVjdXRlX2NxbF9xdWVyeSgxOnJlcXVpcmVkIGJpbmFyeSBxdWVyeSwgMjpyZXF1aXJlZCBDb21wcmVzc2lvbiBjb21wcmVzc2lvbikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLAorICAgICAgICAgICAgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwKKyAgICAgICAgICAgIDM6VGltZWRPdXRFeGNlcHRpb24gdGUsCisgICAgICAgICAgICA0OlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAvKioKKyAgICogUHJlcGFyZSBhIENRTCAoQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlKSBzdGF0ZW1lbnQgYnkgY29tcGlsaW5nIGFuZCByZXR1cm5pbmcKKyAgICogLSB0aGUgdHlwZSBvZiBDUUwgc3RhdGVtZW50CisgICAqIC0gYW4gaWQgdG9rZW4gb2YgdGhlIGNvbXBpbGVkIENRTCBzdG9yZWQgb24gdGhlIHNlcnZlciBzaWRlLgorICAgKiAtIGEgY291bnQgb2YgdGhlIGRpc2NvdmVyZWQgYm91bmQgbWFya2VycyBpbiB0aGUgc3RhdGVtZW50IAorICAgKi8KKyAgQ3FsUHJlcGFyZWRSZXN1bHQgcHJlcGFyZV9jcWxfcXVlcnkoMTpyZXF1aXJlZCBiaW5hcnkgcXVlcnksIDI6cmVxdWlyZWQgQ29tcHJlc3Npb24gY29tcHJlc3Npb24pCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSkKKworICAgICAgICAgICAgIAorICAvKioKKyAgICogRXhlY3V0ZXMgYSBwcmVwYXJlZCBDUUwgKENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSkgc3RhdGVtZW50IGJ5IHBhc3NpbmcgYW4gaWQgdG9rZW4gYW5kICBhIGxpc3Qgb2YgdmFyaWFibGVzCisgICAqIHRvIGJpbmQgYW5kIHJldHVybnMgYSBDcWxSZXN1bHQgY29udGFpbmluZyB0aGUgcmVzdWx0cy4KKyAgICovCisgIENxbFJlc3VsdCBleGVjdXRlX3ByZXBhcmVkX2NxbF9xdWVyeSgxOnJlcXVpcmVkIGkzMiBpdGVtSWQsIDI6cmVxdWlyZWQgbGlzdDxzdHJpbmc+IHZhbHVlcykKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLAorICAgICAgICAgICAgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwKKyAgICAgICAgICAgIDM6VGltZWRPdXRFeGNlcHRpb24gdGUsCisgICAgICAgICAgICA0OlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpCisgICAgICAgICAgIAorCit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI0NjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQwIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisKK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJkMGQzNzA2Yi1mZWQ1LTRjZjUtYjk4NC0wNGY0NDhkZTlkN2IiKV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMuY3Nwcm9qIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE4NGEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLmNzcHJvagpAQCAtMCwwICsxLDM2IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKworICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHM8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPlRocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHM8L1BhY2thZ2VJZD4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi4vLi4vVGhyaWZ0L1RocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbC5QcmltaXRpdmVzIiBWZXJzaW9uPSJbNC4xLjAsKSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPFRhcmdldCBOYW1lPSJQcmVCdWlsZCIgQmVmb3JlVGFyZ2V0cz0iX0dlbmVyYXRlUmVzdG9yZVByb2plY3RTcGVjO1Jlc3RvcmU7Q29tcGlsZSI+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSInJChPUyknID09ICdXaW5kb3dzX05UJyIgQ29tbWFuZD0id2hlcmUgdGhyaWZ0IiBDb25zb2xlVG9NU0J1aWxkPSJ0cnVlIj4KKyAgICAgIDxPdXRwdXQgVGFza1BhcmFtZXRlcj0iQ29uc29sZU91dHB1dCIgUHJvcGVydHlOYW1lPSJQYXRoVG9UaHJpZnQiIC8+CisgICAgPC9FeGVjPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFBhdGhUb1RocmlmdCknKSIgQ29tbWFuZD0iJChQYXRoVG9UaHJpZnQpIC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuL0Nhc3NhbmRyYVRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuL0Nhc3NhbmRyYVRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuL0Nhc3NhbmRyYVRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFBhdGhUb1RocmlmdCknKSIgQ29tbWFuZD0iJChQYXRoVG9UaHJpZnQpIC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0JykiIENvbW1hbmQ9IiQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFBhdGhUb1RocmlmdCknKSIgQ29tbWFuZD0iJChQYXRoVG9UaHJpZnQpIC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uLy4uLy4uL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uLy4uLy4uL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uLy4uLy4uL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0IiAvPgorICA8L1RhcmdldD4KKworPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9uc1Rlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9uc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTk5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zVGVzdHMuY3MKQEAgLTAsMCArMSw4MyBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLkNvbGxlY3Rpb25zCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBUQ29sbGVjdGlvbnNUZXN0cworICAgIHsKKyAgICAgICAgLy9UT0RPOiBBZGQgdGVzdHMgZm9yIElFbnVtZXJhYmxlIHdpdGggb2JqZWN0cyBhbmQgcHJpbWl0aXZlIHZhbHVlcyBpbnNpZGUKKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVENvbGxlY3Rpb25fRXF1YWxzX1ByaW1pdGl2ZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24xID0gbmV3IExpc3Q8aW50PiB7MSwyLDN9OworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24yID0gbmV3IExpc3Q8aW50PiB7MSwyLDN9OworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVENvbGxlY3Rpb25zLkVxdWFscyhjb2xsZWN0aW9uMSwgY29sbGVjdGlvbjIpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVENvbGxlY3Rpb25fRXF1YWxzX1ByaW1pdGl2ZV9EaWZmZXJlbnRfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMSA9IG5ldyBMaXN0PGludD4geyAxLCAyLCAzIH07CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjIgPSBuZXcgTGlzdDxpbnQ+IHsgMSwgMiB9OworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVENvbGxlY3Rpb25zLkVxdWFscyhjb2xsZWN0aW9uMSwgY29sbGVjdGlvbjIpOworCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRDb2xsZWN0aW9uX0VxdWFsc19PYmplY3RzX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjEgPSBuZXcgTGlzdDxFeGFtcGxlQ2xhc3M+IHsgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAxIH0sIG5ldyBFeGFtcGxlQ2xhc3MgeyBYID0gMiB9IH07CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjIgPSBuZXcgTGlzdDxFeGFtcGxlQ2xhc3M+IHsgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAxIH0sIG5ldyBFeGFtcGxlQ2xhc3MgeyBYID0gMiB9IH07CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUQ29sbGVjdGlvbnMuRXF1YWxzKGNvbGxlY3Rpb24xLCBjb2xsZWN0aW9uMik7CisKKyAgICAgICAgICAgIC8vIHJlZmVyZW5jZXMgdG8gZGlmZmVyZW50IGNvbGxlY3Rpb25zCisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRDb2xsZWN0aW9uX0VxdWFsc19PbmVBbmRUaGVTYW1lT2JqZWN0X1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjEgPSBuZXcgTGlzdDxFeGFtcGxlQ2xhc3M+IHsgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAxIH0sIG5ldyBFeGFtcGxlQ2xhc3MgeyBYID0gMiB9IH07CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjIgPSBjb2xsZWN0aW9uMTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRDb2xsZWN0aW9ucy5FcXVhbHMoY29sbGVjdGlvbjEsIGNvbGxlY3Rpb24yKTsKKworICAgICAgICAgICAgLy8gcmVmZXJlbmNlcyB0byBvbmUgYW5kIHRoZSBzYW1lIGNvbGxlY3Rpb24KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgRXhhbXBsZUNsYXNzCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgWCB7IGdldDsgc2V0OyB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvQ29sbGVjdGlvbnMvVEhhc2hTZXRUZXN0cy5jcyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9USGFzaFNldFRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZTU3M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvQ29sbGVjdGlvbnMvVEhhc2hTZXRUZXN0cy5jcwpAQCAtMCwwICsxLDcxIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKKworbmFtZXNwYWNlIFRocmlmdC5UZXN0cy5Db2xsZWN0aW9ucworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgVEhhc2hTZXRUZXN0cworICAgIHsKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRIYXNoU2V0X0VxdWFsc19QcmltaXRpdmVfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB2YWx1ZSA9IDE7CisKKyAgICAgICAgICAgIHZhciBoYXNoU2V0ID0gbmV3IFRIYXNoU2V0PGludD4ge3ZhbHVlfTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShoYXNoU2V0LkNvbnRhaW5zKHZhbHVlKSk7CisKKyAgICAgICAgICAgIGhhc2hTZXQuUmVtb3ZlKHZhbHVlKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShoYXNoU2V0LkNvdW50ID09IDApOworCisgICAgICAgICAgICBoYXNoU2V0LkFkZCh2YWx1ZSk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaGFzaFNldC5Db250YWlucyh2YWx1ZSkpOworCisgICAgICAgICAgICBoYXNoU2V0LkNsZWFyKCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaGFzaFNldC5Db3VudCA9PSAwKTsKKworICAgICAgICAgICAgdmFyIG5ld0FyciA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICBoYXNoU2V0LkFkZCh2YWx1ZSk7CisgICAgICAgICAgICBoYXNoU2V0LkNvcHlUbyhuZXdBcnIsIDApOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG5ld0Fyci5Db250YWlucyh2YWx1ZSkpOworCisgICAgICAgICAgICB2YXIgZW4gPSBoYXNoU2V0LkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgICAgIGVuLk1vdmVOZXh0KCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGludCllbi5DdXJyZW50ID09IHZhbHVlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdXNpbmcgKHZhciBpZW4gPSAoKElFbnVtZXJhYmxlPGludD4paGFzaFNldCkuR2V0RW51bWVyYXRvcigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGllbi5Nb3ZlTmV4dCgpOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShpZW4uQ3VycmVudCA9PSB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvUHJvdG9jb2xzL1RKc29uUHJvdG9jb2xIZWxwZXJUZXN0cy5jcyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbEhlbHBlclRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzgzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvUHJvdG9jb2xzL1RKc29uUHJvdG9jb2xIZWxwZXJUZXN0cy5jcwpAQCAtMCwwICsxLDE3MiBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllczsKKworbmFtZXNwYWNlIFRocmlmdC5UZXN0cy5Qcm90b2NvbHMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBUSlNPTlByb3RvY29sSGVscGVyVGVzdHMKKyAgICB7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlTmFtZUZvclR5cGVJZF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0CisgICAgICAgICAgICB2YXIgc2V0cyA9IG5ldyBMaXN0PFR1cGxlPFRUeXBlLCBieXRlW10+PgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5Cb29sLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lQm9vbCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkJ5dGUsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCeXRlKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuSTE2LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lSTE2KSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuSTMyLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lSTMyKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuSTY0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lSTY0KSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuRG91YmxlLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lRG91YmxlKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuU3RyaW5nLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lU3RyaW5nKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuU3RydWN0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lU3RydWN0KSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuTWFwLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTWFwKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuU2V0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lU2V0KSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuTGlzdCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUxpc3QpLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gc2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQodC5JdGVtMSkgPT0gdC5JdGVtMiwgJCJXcm9uZyBtYXBwaW5nIG9mIFR5cGVOYW1lIHt0Lkl0ZW0yfSB0byBUVHlwZToge3QuSXRlbTF9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZU5hbWVGb3JUeXBlSWRfVFN0b3BfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQoVFR5cGUuU3RvcCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZU5hbWVGb3JUeXBlSWRfTm9uRXhpc3RpbmdUVHlwZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZCgoVFR5cGUpMTAwKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlSWRGb3JUeXBlTmFtZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0CisgICAgICAgICAgICB2YXIgc2V0cyA9IG5ldyBMaXN0PFR1cGxlPFRUeXBlLCBieXRlW10+PgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5Cb29sLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lQm9vbCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkJ5dGUsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCeXRlKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuSTE2LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lSTE2KSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuSTMyLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lSTMyKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuSTY0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lSTY0KSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuRG91YmxlLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lRG91YmxlKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuU3RyaW5nLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lU3RyaW5nKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuU3RydWN0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lU3RydWN0KSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuTWFwLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTWFwKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuU2V0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lU2V0KSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuTGlzdCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUxpc3QpLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gc2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZUlkRm9yVHlwZU5hbWUodC5JdGVtMikgPT0gdC5JdGVtMSwgJCJXcm9uZyBtYXBwaW5nIG9mIFR5cGVOYW1lIHt0Lkl0ZW0yfSB0byBUVHlwZToge3QuSXRlbTF9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZUlkRm9yVHlwZU5hbWVfVFN0b3BUeXBlTmFtZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShuZXcgW117KGJ5dGUpVFR5cGUuU3RvcCwgKGJ5dGUpVFR5cGUuU3RvcH0pOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVFByb3RvY29sRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVJZEZvclR5cGVOYW1lX05vbkV4aXN0aW5nVHlwZU5hbWVfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZUlkRm9yVHlwZU5hbWUobmV3IGJ5dGVbXXsxMDB9KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlSWRGb3JUeXBlTmFtZV9FbXB0eU5hbWVfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZUlkRm9yVHlwZU5hbWUobmV3IGJ5dGVbXSB7fSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNKc29uTnVtZXJpY19UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0CisgICAgICAgICAgICB2YXIgY29ycmVjdEpzb25OdW1lcmljID0gIistLjAxMjM0NTY3ODlFZSI7CisgICAgICAgICAgICB2YXIgaW5jb3JyZWN0SnNvbk51bWVyaWMgPSAiQWFCY0RkLypcXCI7CisKKyAgICAgICAgICAgIHZhciBzZXRzID0gY29ycmVjdEpzb25OdW1lcmljLlNlbGVjdChjaCA9PiBuZXcgVHVwbGU8Ynl0ZSwgYm9vbD4oKGJ5dGUpIGNoLCB0cnVlKSkuVG9MaXN0KCk7CisgICAgICAgICAgICBzZXRzLkFkZFJhbmdlKGluY29ycmVjdEpzb25OdW1lcmljLlNlbGVjdChjaCA9PiBuZXcgVHVwbGU8Ynl0ZSwgYm9vbD4oKGJ5dGUpIGNoLCBmYWxzZSkpKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gc2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKFRKU09OUHJvdG9jb2xIZWxwZXIuSXNKc29uTnVtZXJpYyh0Lkl0ZW0xKSA9PSB0Lkl0ZW0yLCAkIldyb25nIG1hcHBpbmcgb2YgQ2hhciB7dC5JdGVtMX0gdG8gYm9vbDoge3QuSXRlbTJ9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVG9IZXhWYWxfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0L291dHB1dAorICAgICAgICAgICAgdmFyIGNoYXJzID0gIjAxMjM0NTY3ODlhYmNkZWYiOworICAgICAgICAgICAgdmFyIGV4cGVjdGVkSGV4VmFsdWVzID0gbmV3IGJ5dGVbXSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNX07CisKKyAgICAgICAgICAgIHZhciBzZXRzID0gY2hhcnMuU2VsZWN0KChjaCwgaSkgPT4gbmV3IFR1cGxlPGNoYXIsIGJ5dGU+KGNoLCBleHBlY3RlZEhleFZhbHVlc1tpXSkpLlRvTGlzdCgpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBhY3R1YWxSZXN1bHQgPSBUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKChieXRlKXQuSXRlbTEpOworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYWN0dWFsUmVzdWx0ID09IHQuSXRlbTIsICQiV3JvbmcgbWFwcGluZyBvZiBjaGFyIGJ5dGUge3QuSXRlbTF9IHRvIGl0IGV4cGVjdGVkIGhleCB2YWx1ZToge3QuSXRlbTJ9LiBBY3R1YWwgaGV4IHZhbHVlOiB7YWN0dWFsUmVzdWx0fSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVFByb3RvY29sRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFRvSGV4VmFsX1dyb25nSW5wdXRDaGFyX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKChieXRlKSdzJyk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVG9IZXhDaGFyX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBoZXhWYWx1ZXMgPSBuZXcgYnl0ZVtdIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSB9OworICAgICAgICAgICAgdmFyIGV4cGVjdGVkQ2hhcnMgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgICAgICAgICAgICAKKworICAgICAgICAgICAgdmFyIHNldHMgPSBoZXhWYWx1ZXMuU2VsZWN0KChodiwgaSkgPT4gbmV3IFR1cGxlPGJ5dGUsIGNoYXI+KGh2LCBleHBlY3RlZENoYXJzW2ldKSkuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHNldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFjdHVhbFJlc3VsdCA9IFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhDaGFyKHQuSXRlbTEpOworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYWN0dWFsUmVzdWx0ID09IHQuSXRlbTIsICQiV3JvbmcgbWFwcGluZyBvZiBoZXggdmFsdWUge3QuSXRlbTF9IHRvIGl0IGV4cGVjdGVkIGNoYXI6IHt0Lkl0ZW0yfS4gQWN0dWFsIGhleCB2YWx1ZToge2FjdHVhbFJlc3VsdH0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvUHJvdG9jb2xzL1RKc29uUHJvdG9jb2xUZXN0cy5jcyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbFRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzczNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvUHJvdG9jb2xzL1RKc29uUHJvdG9jb2xUZXN0cy5jcwpAQCAtMCwwICsxLDY3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE5TdWJzdGl0dXRlOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5UZXN0cy5Qcm90b2NvbHMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRKU09OUHJvdG9jb2xUZXN0cworICAgIHsKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRKU09OUHJvdG9jb2xfQ2FuX0NyZWF0ZV9JbnN0YW5jZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGh0dHBDbGllbnRUcmFuc3BvcnQgPSBTdWJzdGl0dXRlLkZvcjxUSHR0cENsaWVudFRyYW5zcG9ydD4obmV3IFVyaSgiaHR0cDovL2xvY2FsaG9zdCIpLCBudWxsKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBUSlNPTlByb3RvY29sV3JhcHBlcihodHRwQ2xpZW50VHJhbnNwb3J0KTsKKworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChyZXN1bHQpOworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChyZXN1bHQuV3JhcHBlZENvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChyZXN1bHQuV3JhcHBlZFJlYWRlcik7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdC5UcmFuc3BvcnQpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuV3JhcHBlZFJlY3Vyc2lvbkRlcHRoID09IDApOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuV3JhcHBlZFJlY3Vyc2lvbkxpbWl0ID09IFRQcm90b2NvbC5EZWZhdWx0UmVjdXJzaW9uRGVwdGgpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5UcmFuc3BvcnQuRXF1YWxzKGh0dHBDbGllbnRUcmFuc3BvcnQpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LldyYXBwZWRDb250ZXh0LkdldFR5cGUoKS5OYW1lLkVxdWFscygiSlNPTkJhc2VDb250ZXh0IiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuV3JhcHBlZFJlYWRlci5HZXRUeXBlKCkuTmFtZS5FcXVhbHMoIkxvb2thaGVhZFJlYWRlciIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgVEpTT05Qcm90b2NvbFdyYXBwZXIgOiBUSnNvblByb3RvY29sCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUSlNPTlByb3RvY29sV3JhcHBlcihUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKSA6IGJhc2UodHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgV3JhcHBlZENvbnRleHQgPT4gQ29udGV4dDsKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgV3JhcHBlZFJlYWRlciA9PiBSZWFkZXI7CisgICAgICAgICAgICBwdWJsaWMgaW50IFdyYXBwZWRSZWN1cnNpb25EZXB0aCA9PiBSZWN1cnNpb25EZXB0aDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgV3JhcHBlZFJlY3Vyc2lvbkxpbWl0ID0+IFJlY3Vyc2lvbkxpbWl0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1RocmlmdC5UZXN0cy5jc3Byb2ogYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvVGhyaWZ0LlRlc3RzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDZmMTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1RocmlmdC5UZXN0cy5jc3Byb2oKQEAgLTAsMCArMSwxOCBAQAor77u/PFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iQ29tcGFyZU5FVE9iamVjdHMiIFZlcnNpb249IjQuMy4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5ORVQuVGVzdC5TZGsiIFZlcnNpb249IjE1LjUuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNU1Rlc3QuVGVzdEFkYXB0ZXIiIFZlcnNpb249IjEuMi4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1TVGVzdC5UZXN0RnJhbWV3b3JrIiBWZXJzaW9uPSIxLjIuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJOU3Vic3RpdHV0ZSIgVmVyc2lvbj0iMy4xLjAiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8U2VydmljZSBJbmNsdWRlPSJ7ODJhN2Y0OGQtM2I1MC00YjFlLWI4MmUtM2FkYTgyMTBjMzU4fSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0LnNsbiBiL2xpYi9uZXRjb3JlL1RocmlmdC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzMGFhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC5zbG4KQEAgLTAsMCArMSw4NSBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTIuMDAKKyMgVmlzdWFsIFN0dWRpbyAxNQorVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDE1LjAuMjY3MzAuMTIKK01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xCitQcm9qZWN0KCJ7MjE1MEUzMzMtOEZEQy00MkEzLTk0NzQtMUEzOTU2RDQ2REU4fSIpID0gIlRlc3RzIiwgIlRlc3RzIiwgIntGNTFGQzREQS1DQUMwLTQ4QjEtQTA2OS1CMTcxMkJDQUE1QkV9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQiLCAiVGhyaWZ0XFRocmlmdC5jc3Byb2oiLCAie0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdC5JbnRlZ3JhdGlvblRlc3RzIiwgIlRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvaiIsICJ7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0LlRlc3RzIiwgIlRlc3RzXFRocmlmdC5UZXN0c1xUaHJpZnQuVGVzdHMuY3Nwcm9qIiwgIns3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzIiwgIlRlc3RzXFRocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHNcVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy5jc3Byb2oiLCAie0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlEZWJ1Z3x4NjQgPSBEZWJ1Z3x4NjQKKwkJRGVidWd8eDg2ID0gRGVidWd8eDg2CisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQorCQlSZWxlYXNlfHg2NCA9IFJlbGVhc2V8eDY0CisJCVJlbGVhc2V8eDg2ID0gUmVsZWFzZXx4ODYKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKE5lc3RlZFByb2plY3RzKSA9IHByZVNvbHV0aW9uCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9ID0ge0Y1MUZDNERBLUNBQzAtNDhCMS1BMDY5LUIxNzEyQkNBQTVCRX0KKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0gPSB7RjUxRkM0REEtQ0FDMC00OEIxLUEwNjktQjE3MTJCQ0FBNUJFfQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fSA9IHtGNTFGQzREQS1DQUMwLTQ4QjEtQTA2OS1CMTcxMkJDQUE1QkV9CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUdsb2JhbHMpID0gcG9zdFNvbHV0aW9uCisJCVNvbHV0aW9uR3VpZCA9IHtGRDIwQkM0QS0wMTA5LTQxRDgtOEMwQy04OTNFNzg0RDdFRjl9CisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDdiZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcwpAQCAtMCwwICsxLDEwMSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOworCituYW1lc3BhY2UgVGhyaWZ0LkNvbGxlY3Rpb25zCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVENvbGxlY3Rpb25zCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgVGhpcyB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIHZhbHVlLXdpc2UgdGhlIHNhbWUuCisgICAgICAgIC8vLyAgICAgSWYgdGhlIGNvbGxlY3Rpb24gY29udGFpbnMgYSBjb2xsZWN0aW9uLCB0aGUgY29sbGVjdGlvbnMgd2lsbCBiZSBjb21wYXJlZCB1c2luZyB0aGlzIG1ldGhvZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEVxdWFscyhJRW51bWVyYWJsZSBmaXJzdCwgSUVudW1lcmFibGUgc2Vjb25kKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCAmJiBzZWNvbmQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwgfHwgc2Vjb25kID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZml0ZXIgPSBmaXJzdC5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgICAgICB2YXIgc2l0ZXIgPSBzZWNvbmQuR2V0RW51bWVyYXRvcigpOworCisgICAgICAgICAgICB2YXIgZm5leHQgPSBmaXRlci5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgdmFyIHNuZXh0ID0gc2l0ZXIuTW92ZU5leHQoKTsKKworICAgICAgICAgICAgd2hpbGUgKGZuZXh0ICYmIHNuZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmZW51bSA9IGZpdGVyLkN1cnJlbnQgYXMgSUVudW1lcmFibGU7CisgICAgICAgICAgICAgICAgdmFyIHNlbnVtID0gc2l0ZXIuQ3VycmVudCBhcyBJRW51bWVyYWJsZTsKKworICAgICAgICAgICAgICAgIGlmIChmZW51bSAhPSBudWxsICYmIHNlbnVtICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIUVxdWFscyhmZW51bSwgc2VudW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZmVudW0gPT0gbnVsbCBeIHNlbnVtID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFFcXVhbHMoZml0ZXIuQ3VycmVudCwgc2l0ZXIuQ3VycmVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm5leHQgPSBmaXRlci5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgICAgIHNuZXh0ID0gc2l0ZXIuTW92ZU5leHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZuZXh0ID09IHNuZXh0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFRoaXMgcmV0dXJucyBhIGhhc2hjb2RlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZW51bWVyYWJsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgR2V0SGFzaENvZGUoSUVudW1lcmFibGUgZW51bWVyYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVudW1lcmFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGhhc2hjb2RlID0gMDsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIG9iaiBpbiBlbnVtZXJhYmxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBlbnVtMiA9IG9iaiBhcyBJRW51bWVyYWJsZTsKKyAgICAgICAgICAgICAgICB2YXIgb2JqSGFzaCA9IGVudW0yID09IG51bGwgPyBvYmouR2V0SGFzaENvZGUoKSA6IEdldEhhc2hDb2RlKGVudW0yKTsKKworICAgICAgICAgICAgICAgIHVuY2hlY2tlZAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzaGNvZGUgPSAoaGFzaGNvZGUqMzk3KSBeIChvYmpIYXNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBoYXNoY29kZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExZjBhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9USGFzaFNldC5jcwpAQCAtMCwwICsxLDY3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIFRocmlmdC5Db2xsZWN0aW9ucworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRIYXNoU2V0PFQ+IDogSUNvbGxlY3Rpb248VD4KKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSGFzaFNldDxUPiBfc2V0ID0gbmV3IEhhc2hTZXQ8VD4oKTsKKworICAgICAgICBwdWJsaWMgaW50IENvdW50ID0+IF9zZXQuQ291bnQ7CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNSZWFkT25seSA9PiBmYWxzZTsKKworICAgICAgICBwdWJsaWMgdm9pZCBBZGQoVCBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBfc2V0LkFkZChpdGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3NldC5DbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgQ29udGFpbnMoVCBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NldC5Db250YWlucyhpdGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIENvcHlUbyhUW10gYXJyYXksIGludCBhcnJheUluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBfc2V0LkNvcHlUbyhhcnJheSwgYXJyYXlJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3IgR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2V0LkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIElFbnVtZXJhdG9yPFQ+IElFbnVtZXJhYmxlPFQ+LkdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKChJRW51bWVyYWJsZTxUPikgX3NldCkuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgUmVtb3ZlKFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zZXQuUmVtb3ZlKGl0ZW0pOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9JVEFzeW5jUHJvY2Vzc29yLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L0lUQXN5bmNQcm9jZXNzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI4ZTQwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9JVEFzeW5jUHJvY2Vzc29yLmNzCkBAIC0wLDAgKzEsMjkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRBc3luY1Byb2Nlc3NvcgorICAgIHsKKyAgICAgICAgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOworICAgICAgICBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvSVRQcm9jZXNzb3JGYWN0b3J5LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L0lUUHJvY2Vzc29yRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTMzZTVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L0lUUHJvY2Vzc29yRmFjdG9yeS5jcwpAQCAtMCwwICsxLDI4IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRQcm9jZXNzb3JGYWN0b3J5CisgICAgeworICAgICAgICBJVEFzeW5jUHJvY2Vzc29yIEdldEFzeW5jUHJvY2Vzc29yKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMsIFRCYXNlU2VydmVyIGJhc2VTZXJ2ZXIgPSBudWxsKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNDMzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1NiBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisKK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIkMjIC5ORVQgQ29yZSBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKy8vQFRPRE8gd2hlcmUgdG8gcHV0IExpY2Vuc2UgaW5mb3JtYXRpb24/CisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSBleFR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IGV4VHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiZGYzZjhlZjAtZTBhMy00Yzg2LWE2NWItOGVjODRlMDE2YjFkIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisKK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjEzLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIwLjEzLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9URmllbGQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RGaWVsZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzExNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9URmllbGQuY3MKQEAgLTAsMCArMSwzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVEZpZWxkCisgICAgeworICAgICAgICBwdWJsaWMgVEZpZWxkKHN0cmluZyBuYW1lLCBUVHlwZSB0eXBlLCBzaG9ydCBpZCkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIElEID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZyAtIGRvIG5vdCByZW5hbWUgLSBpdCB1c2VkIGZvciBnZW5lcmF0aW9uIAorICAgICAgICBwdWJsaWMgc2hvcnQgSUQgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RMaXN0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTGlzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTIzMjIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTGlzdC5jcwpAQCAtMCwwICsxLDMzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0cnVjdCBUTGlzdAorICAgIHsKKyAgICAgICAgcHVibGljIFRMaXN0KFRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgICAgICBDb3VudCA9IGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWFwLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWFwLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTU1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RNYXAuY3MKQEAgLTAsMCArMSwzNiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVE1hcAorICAgIHsKKyAgICAgICAgcHVibGljIFRNYXAoVFR5cGUga2V5VHlwZSwgVFR5cGUgdmFsdWVUeXBlLCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEtleVR5cGUgPSBrZXlUeXBlOworICAgICAgICAgICAgVmFsdWVUeXBlID0gdmFsdWVUeXBlOworICAgICAgICAgICAgQ291bnQgPSBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBLZXlUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgVFR5cGUgVmFsdWVUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZS5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmNDkyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2UuY3MKQEAgLTAsMCArMSwzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVE1lc3NhZ2UKKyAgICB7CisgICAgICAgIHB1YmxpYyBUTWVzc2FnZShzdHJpbmcgbmFtZSwgVE1lc3NhZ2VUeXBlIHR5cGUsIGludCBzZXFpZCkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIFNlcUlEID0gc2VxaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUTWVzc2FnZVR5cGUgVHlwZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcgLSBkbyBub3QgcmVuYW1lIC0gaXQgdXNlZCBmb3IgZ2VuZXJhdGlvbiAKKyAgICAgICAgcHVibGljIGludCBTZXFJRCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2VUeXBlLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZVR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiOWEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2VUeXBlLmNzCkBAIC0wLDAgKzEsMjggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgZW51bSBUTWVzc2FnZVR5cGUKKyAgICB7CisgICAgICAgIENhbGwgPSAxLAorICAgICAgICBSZXBseSA9IDIsCisgICAgICAgIEV4Y2VwdGlvbiA9IDMsCisgICAgICAgIE9uZXdheSA9IDQKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU2V0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODNiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RTZXQuY3MKQEAgLTAsMCArMSwzOCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVFNldAorICAgIHsKKyAgICAgICAgcHVibGljIFRTZXQoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgICAgIENvdW50ID0gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNldChUTGlzdCBsaXN0KQorICAgICAgICAgICAgOiB0aGlzKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBFbGVtZW50VHlwZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIGludCBDb3VudCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFN0cnVjdC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFN0cnVjdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhkY2MzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU3RydWN0LmNzCkBAIC0wLDAgKzEsMzAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RydWN0IFRTdHJ1Y3QKKyAgICB7CisgICAgICAgIHB1YmxpYyBUU3RydWN0KHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFR5cGUuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RUeXBlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZTc4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RUeXBlLmNzCkBAIC0wLDAgKzEsMzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgZW51bSBUVHlwZSA6IGJ5dGUKKyAgICB7CisgICAgICAgIFN0b3AgPSAwLAorICAgICAgICBWb2lkID0gMSwKKyAgICAgICAgQm9vbCA9IDIsCisgICAgICAgIEJ5dGUgPSAzLAorICAgICAgICBEb3VibGUgPSA0LAorICAgICAgICBJMTYgPSA2LAorICAgICAgICBJMzIgPSA4LAorICAgICAgICBJNjQgPSAxMCwKKyAgICAgICAgU3RyaW5nID0gMTEsCisgICAgICAgIFN0cnVjdCA9IDEyLAorICAgICAgICBNYXAgPSAxMywKKyAgICAgICAgU2V0ID0gMTQsCisgICAgICAgIExpc3QgPSAxNQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0lUUHJvdG9jb2xGYWN0b3J5LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9JVFByb3RvY29sRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2M1Y2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9JVFByb3RvY29sRmFjdG9yeS5jcwpAQCAtMCwwICsxLDI3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRQcm90b2NvbEZhY3RvcnkKKyAgICB7CisgICAgICAgIFRQcm90b2NvbCBHZXRQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQWJzdHJhY3RCYXNlLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQWJzdHJhY3RCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTg2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RBYnN0cmFjdEJhc2UuY3MKQEAgLTAsMCArMSwyOCBAQAor77u/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/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RIdHRwQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RIdHRwQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OWJlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwyMjYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTmV0Lkh0dHA7Cit1c2luZyBTeXN0ZW0uTmV0Lkh0dHAuSGVhZGVyczsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEh0dHBDbGllbnRUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFg1MDlDZXJ0aWZpY2F0ZVtdIF9jZXJ0aWZpY2F0ZXM7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVXJpIF91cmk7CisKKyAgICAgICAgLy8gVGltZW91dHMgaW4gbWlsbGlzZWNvbmRzCisgICAgICAgIHByaXZhdGUgaW50IF9jb25uZWN0VGltZW91dCA9IDMwMDAwOworICAgICAgICBwcml2YXRlIEh0dHBDbGllbnQgX2h0dHBDbGllbnQ7CisgICAgICAgIHByaXZhdGUgU3RyZWFtIF9pbnB1dFN0cmVhbTsKKworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByaXZhdGUgTWVtb3J5U3RyZWFtIF9vdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisKKyAgICAgICAgcHVibGljIFRIdHRwQ2xpZW50VHJhbnNwb3J0KFVyaSB1LCBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gY3VzdG9tSGVhZGVycykKKyAgICAgICAgICAgIDogdGhpcyh1LCBFbnVtZXJhYmxlLkVtcHR5PFg1MDlDZXJ0aWZpY2F0ZT4oKSwgY3VzdG9tSGVhZGVycykKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRIdHRwQ2xpZW50VHJhbnNwb3J0KFVyaSB1LCBJRW51bWVyYWJsZTxYNTA5Q2VydGlmaWNhdGU+IGNlcnRpZmljYXRlcywKKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBjdXN0b21IZWFkZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBfdXJpID0gdTsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZXMgPSAoY2VydGlmaWNhdGVzID8/IEVudW1lcmFibGUuRW1wdHk8WDUwOUNlcnRpZmljYXRlPigpKS5Ub0FycmF5KCk7CisgICAgICAgICAgICBDdXN0b21IZWFkZXJzID0gY3VzdG9tSGVhZGVyczsKKworICAgICAgICAgICAgLy8gZHVlIHRvIGN1cnJlbnQgYnVnIHdpdGggcGVyZm9ybWFuY2Ugb2YgRGlzcG9zZSBpbiBuZXRjb3JlIGh0dHBzOi8vZ2l0aHViLmNvbS9kb3RuZXQvY29yZWZ4L2lzc3Vlcy84ODA5CisgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSBzd2l0Y2hlZCB0byBkZWZhdWx0IHdheSAoY3JlYXRlIGNsaWVudC0+dXNlLT5kaXNwb3NlIHBlciBmbHVzaCkgbGF0ZXIKKyAgICAgICAgICAgIF9odHRwQ2xpZW50ID0gQ3JlYXRlQ2xpZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IEN1c3RvbUhlYWRlcnMgeyBnZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvbm5lY3RUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldCB7IF9jb25uZWN0VGltZW91dCA9IHZhbHVlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfb3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaHR0cENsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9odHRwQ2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfaHR0cENsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHJlcXVlc3QgaGFzIGJlZW4gc2VudCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmV0ID0gYXdhaXQgX2lucHV0U3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwgIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX291dHB1dFN0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSHR0cENsaWVudCBDcmVhdGVDbGllbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaGFuZGxlciA9IG5ldyBIdHRwQ2xpZW50SGFuZGxlcigpOworICAgICAgICAgICAgaGFuZGxlci5DbGllbnRDZXJ0aWZpY2F0ZXMuQWRkUmFuZ2UoX2NlcnRpZmljYXRlcyk7CisKKyAgICAgICAgICAgIHZhciBodHRwQ2xpZW50ID0gbmV3IEh0dHBDbGllbnQoaGFuZGxlcik7CisKKyAgICAgICAgICAgIGlmIChfY29ubmVjdFRpbWVvdXQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGh0dHBDbGllbnQuVGltZW91dCA9IFRpbWVTcGFuLkZyb21TZWNvbmRzKF9jb25uZWN0VGltZW91dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh0dHBDbGllbnQuRGVmYXVsdFJlcXVlc3RIZWFkZXJzLkFjY2VwdC5BZGQobmV3IE1lZGlhVHlwZVdpdGhRdWFsaXR5SGVhZGVyVmFsdWUoImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikpOworICAgICAgICAgICAgaHR0cENsaWVudC5EZWZhdWx0UmVxdWVzdEhlYWRlcnMuVXNlckFnZW50LkFkZChuZXcgUHJvZHVjdEluZm9IZWFkZXJWYWx1ZSgiVEh0dHBDbGllbnRUcmFuc3BvcnQiLCAiMC4xMy4wIikpOworCisgICAgICAgICAgICBpZiAoQ3VzdG9tSGVhZGVycyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIEN1c3RvbUhlYWRlcnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBodHRwQ2xpZW50LkRlZmF1bHRSZXF1ZXN0SGVhZGVycy5BZGQoaXRlbS5LZXksIGl0ZW0uVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGh0dHBDbGllbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfb3V0cHV0U3RyZWFtLkNhblNlZWspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9vdXRwdXRTdHJlYW0uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgb3V0U3RyZWFtID0gbmV3IFN0cmVhbUNvbnRlbnQoX291dHB1dFN0cmVhbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtc2cgPSBhd2FpdCBfaHR0cENsaWVudC5Qb3N0QXN5bmMoX3VyaSwgb3V0U3RyZWFtLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5FbnN1cmVTdWNjZXNzU3RhdHVzQ29kZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2lucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0gPSBhd2FpdCBtc2cuQ29udGVudC5SZWFkQXNTdHJlYW1Bc3luYygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pbnB1dFN0cmVhbS5DYW5TZWVrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSHR0cFJlcXVlc3RFeGNlcHRpb24gd3gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBjb25uZWN0IHRvIHNlcnZlcjogIiArIHd4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbT8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF9odHRwQ2xpZW50Py5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RNZW1vcnlCdWZmZXJDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmE1NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RNZW1vcnlCdWZmZXJDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSw5NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gX2J5dGVTdHJlYW07CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKworICAgICAgICBwdWJsaWMgVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ieXRlU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXJDbGllbnRUcmFuc3BvcnQoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgX2J5dGVTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKiBkbyBub3RoaW5nICoqLworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX2J5dGVTdHJlYW0uUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF9ieXRlU3RyZWFtLldyaXRlQXN5bmMoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfYnl0ZVN0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZVtdIEdldEJ1ZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfYnl0ZVN0cmVhbS5Ub0FycmF5KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfYnl0ZVN0cmVhbT8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTRiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDk1IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uSU8uUGlwZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIE5hbWVkUGlwZUNsaWVudFN0cmVhbSBfY2xpZW50OworCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBwaXBlKSA6IHRoaXMoIi4iLCBwaXBlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChzdHJpbmcgc2VydmVyLCBzdHJpbmcgcGlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNlcnZlck5hbWUgPSBzdHJpbmcuSXNOdWxsT3JXaGl0ZVNwYWNlKHNlcnZlcikgPyBzZXJ2ZXIgOiAiLiI7CisKKyAgICAgICAgICAgIF9jbGllbnQgPSBuZXcgTmFtZWRQaXBlQ2xpZW50U3RyZWFtKHNlcnZlck5hbWUsIHBpcGUsIFBpcGVEaXJlY3Rpb24uSW5PdXQsIFBpcGVPcHRpb25zLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+IF9jbGllbnQgIT0gbnVsbCAmJiBfY2xpZW50LklzQ29ubmVjdGVkOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBfY2xpZW50LkNvbm5lY3RBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NsaWVudC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX2NsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX2NsaWVudC5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IF9jbGllbnQuV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgX2NsaWVudC5EaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RTb2NrZXRDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFNvY2tldENsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzY5ZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RTb2NrZXRDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxMzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRTb2NrZXRDbGllbnRUcmFuc3BvcnQgOiBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisKKyAgICAgICAgcHVibGljIFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoVGNwQ2xpZW50IGNsaWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgVGNwQ2xpZW50ID0gY2xpZW50ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGNsaWVudCkpOworCisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICBIb3N0ID0gaG9zdDsKKyAgICAgICAgICAgIFBvcnQgPSBwb3J0OworCisgICAgICAgICAgICBUY3BDbGllbnQgPSBuZXcgVGNwQ2xpZW50KCk7CisgICAgICAgICAgICBUY3BDbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBUY3BDbGllbnQuU2VuZFRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgICAgVGNwQ2xpZW50LkNsaWVudC5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUY3BDbGllbnQgVGNwQ2xpZW50IHsgZ2V0OyBwcml2YXRlIHNldDsgfQorICAgICAgICBwdWJsaWMgSVBBZGRyZXNzIEhvc3QgeyBnZXQ7IH0KKyAgICAgICAgcHVibGljIGludCBQb3J0IHsgZ2V0OyB9CisKKyAgICAgICAgcHVibGljIGludCBUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChUY3BDbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRjcENsaWVudC5SZWNlaXZlVGltZW91dCA9IFRjcENsaWVudC5TZW5kVGltZW91dCA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoVGNwQ2xpZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIFRjcENsaWVudC5Db25uZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChQb3J0IDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFRjcENsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIG9yIG5vdCBpbml0aWFsaXplZCB0Y3AgY2xpZW50Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFRjcENsaWVudC5Db25uZWN0QXN5bmMoSG9zdCwgUG9ydCk7CisKKyAgICAgICAgICAgIElucHV0U3RyZWFtID0gVGNwQ2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gVGNwQ2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLkNsb3NlKCk7CisKKyAgICAgICAgICAgIGlmIChUY3BDbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUY3BDbGllbnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIFRjcENsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUY3BDbGllbnQ/LkRpc3Bvc2UoKTsKKworICAgICAgICAgICAgICAgICAgICBiYXNlLkRpc3Bvc2UoZGlzcG9zaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RTdHJlYW1DbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFN0cmVhbUNsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTIwMTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RTdHJlYW1DbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxMTAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFN0cmVhbUNsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKworICAgICAgICBwcm90ZWN0ZWQgVFN0cmVhbUNsaWVudFRyYW5zcG9ydCgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0KFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyZWFtIG91dHB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJlYW0gT3V0cHV0U3RyZWFtIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyZWFtIElucHV0U3RyZWFtIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJbnB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgZnJvbSBudWxsIGlucHV0c3RyZWFtIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBJbnB1dFN0cmVhbS5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKE91dHB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHdyaXRlIHRvIG51bGwgb3V0cHV0c3RyZWFtIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IE91dHB1dFN0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IE91dHB1dFN0cmVhbS5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbT8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YmU0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDIzNyBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vVE9ETzogY2hlY2sgZm9yIGNvcnJlY3Qgd29yaworCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydCA6IFRTdHJlYW1DbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWDUwOUNlcnRpZmljYXRlMiBfY2VydGlmaWNhdGU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgX2NlcnRWYWxpZGF0b3I7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSVBBZGRyZXNzIF9ob3N0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX2lzU2VydmVyOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfcG9ydDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTc2xQcm90b2NvbHMgX3NzbFByb3RvY29sczsKKyAgICAgICAgcHJpdmF0ZSBUY3BDbGllbnQgX2NsaWVudDsKKyAgICAgICAgcHJpdmF0ZSBTc2xTdHJlYW0gX3NlY3VyZVN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX3RpbWVvdXQ7CisKKyAgICAgICAgcHVibGljIFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQoVGNwQ2xpZW50IGNsaWVudCwgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSwgYm9vbCBpc1NlcnZlciA9IGZhbHNlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICBfY2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZTsKKyAgICAgICAgICAgIF9jZXJ0VmFsaWRhdG9yID0gY2VydFZhbGlkYXRvcjsKKyAgICAgICAgICAgIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICBfc3NsUHJvdG9jb2xzID0gc3NsUHJvdG9jb2xzOworICAgICAgICAgICAgX2lzU2VydmVyID0gaXNTZXJ2ZXI7CisKKyAgICAgICAgICAgIGlmIChpc1NlcnZlciAmJiBjZXJ0aWZpY2F0ZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydCBuZWVkcyBjZXJ0aWZpY2F0ZSB0byBiZSB1c2VkIGZvciBzZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICBuYW1lb2YoY2VydGlmaWNhdGUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MgaG9zdCwgaW50IHBvcnQsIHN0cmluZyBjZXJ0aWZpY2F0ZVBhdGgsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwLAorICAgICAgICAgICAgICAgIG5ldyBYNTA5Q2VydGlmaWNhdGUyKGNlcnRpZmljYXRlUGF0aCksCisgICAgICAgICAgICAgICAgY2VydFZhbGlkYXRvciwKKyAgICAgICAgICAgICAgICBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgc3NsUHJvdG9jb2xzKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MgaG9zdCwgaW50IHBvcnQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlID0gbnVsbCwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDAsCisgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgY2VydFZhbGlkYXRvciwKKyAgICAgICAgICAgICAgICBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgc3NsUHJvdG9jb2xzKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0LAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKQorICAgICAgICB7CisgICAgICAgICAgICBfaG9zdCA9IGhvc3Q7CisgICAgICAgICAgICBfcG9ydCA9IHBvcnQ7CisgICAgICAgICAgICBfdGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICBfY2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZTsKKyAgICAgICAgICAgIF9jZXJ0VmFsaWRhdG9yID0gY2VydFZhbGlkYXRvcjsKKyAgICAgICAgICAgIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICBfc3NsUHJvdG9jb2xzID0gc3NsUHJvdG9jb2xzOworCisgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0IHsgX2NsaWVudC5SZWNlaXZlVGltZW91dCA9IF9jbGllbnQuU2VuZFRpbWVvdXQgPSBfdGltZW91dCA9IHZhbHVlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGNwQ2xpZW50IFRjcENsaWVudCA9PiBfY2xpZW50OworCisgICAgICAgIHB1YmxpYyBJUEFkZHJlc3MgSG9zdCA9PiBfaG9zdDsKKworICAgICAgICBwdWJsaWMgaW50IFBvcnQgPT4gX3BvcnQ7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jbGllbnQuQ29ubmVjdGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTb2NrZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBfY2xpZW50ID0gbmV3IFRjcENsaWVudCgpOworICAgICAgICAgICAgX2NsaWVudC5SZWNlaXZlVGltZW91dCA9IF9jbGllbnQuU2VuZFRpbWVvdXQgPSBfdGltZW91dDsKKyAgICAgICAgICAgIF9jbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIERlZmF1bHRDZXJ0aWZpY2F0ZVZhbGlkYXRvcihvYmplY3Qgc2VuZGVyLCBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsIFg1MDlDaGFpbiBjaGFpbiwKKyAgICAgICAgICAgIFNzbFBvbGljeUVycm9ycyBzc2xWYWxpZGF0aW9uRXJyb3JzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3NsVmFsaWRhdGlvbkVycm9ycyA9PSBTc2xQb2xpY3lFcnJvcnMuTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9ob3N0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9wb3J0IDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9jbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgX2NsaWVudC5Db25uZWN0QXN5bmMoX2hvc3QsIF9wb3J0KTsKKyAgICAgICAgICAgICAgICBhd2FpdCBTZXR1cFRsc0FzeW5jKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBTZXR1cFRsc0FzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHZhbGlkYXRvciA9IF9jZXJ0VmFsaWRhdG9yID8/IERlZmF1bHRDZXJ0aWZpY2F0ZVZhbGlkYXRvcjsKKworICAgICAgICAgICAgaWYgKF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VjdXJlU3RyZWFtID0gbmV3IFNzbFN0cmVhbShfY2xpZW50LkdldFN0cmVhbSgpLCBmYWxzZSwgdmFsaWRhdG9yLCBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VjdXJlU3RyZWFtID0gbmV3IFNzbFN0cmVhbShfY2xpZW50LkdldFN0cmVhbSgpLCBmYWxzZSwgdmFsaWRhdG9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9pc1NlcnZlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNlcnZlciBhdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgICBhd2FpdAorICAgICAgICAgICAgICAgICAgICAgICAgX3NlY3VyZVN0cmVhbS5BdXRoZW50aWNhdGVBc1NlcnZlckFzeW5jKF9jZXJ0aWZpY2F0ZSwgX2NlcnRWYWxpZGF0b3IgIT0gbnVsbCwgX3NzbFByb3RvY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xpZW50IGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIHZhciBjZXJ0cyA9IF9jZXJ0aWZpY2F0ZSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBYNTA5Q2VydGlmaWNhdGVDb2xsZWN0aW9uIHtfY2VydGlmaWNhdGV9CisgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBYNTA5Q2VydGlmaWNhdGVDb2xsZWN0aW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldEhvc3QgPSBfaG9zdC5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBfc2VjdXJlU3RyZWFtLkF1dGhlbnRpY2F0ZUFzQ2xpZW50QXN5bmModGFyZ2V0SG9zdCwgY2VydHMsIF9zc2xQcm90b2NvbHMsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBfc2VjdXJlU3RyZWFtOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gX3NlY3VyZVN0cmVhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZS5DbG9zZSgpOworICAgICAgICAgICAgaWYgKF9jbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9zZWN1cmVTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VjdXJlU3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfc2VjdXJlU3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVEh0dHBTZXJ2ZXJUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVEh0dHBTZXJ2ZXJUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyMDYzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9USHR0cFNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDk4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkFzcE5ldENvcmUuSHR0cDsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmc7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuU2VydmVyCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEh0dHBTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBjb25zdCBzdHJpbmcgQ29udGVudFR5cGUgPSAiYXBwbGljYXRpb24veC10aHJpZnQiOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElMb2dnZXIgX2xvZ2dlcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSZXF1ZXN0RGVsZWdhdGUgX25leHQ7CisgICAgICAgIHByb3RlY3RlZCBFbmNvZGluZyBFbmNvZGluZyA9IEVuY29kaW5nLlVURjg7CisKKyAgICAgICAgcHJvdGVjdGVkIElUUHJvdG9jb2xGYWN0b3J5IElucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgSVRQcm90b2NvbEZhY3RvcnkgT3V0cHV0UHJvdG9jb2xGYWN0b3J5OworCisgICAgICAgIHByb3RlY3RlZCBJVEFzeW5jUHJvY2Vzc29yIFByb2Nlc3NvcjsKKworICAgICAgICBwdWJsaWMgVEh0dHBTZXJ2ZXJUcmFuc3BvcnQoSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFJlcXVlc3REZWxlZ2F0ZSBuZXh0LCBJTG9nZ2VyRmFjdG9yeSBsb2dnZXJGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5leHQsIGxvZ2dlckZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUSHR0cFNlcnZlclRyYW5zcG9ydChJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciwgSVRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LCBSZXF1ZXN0RGVsZWdhdGUgbmV4dCwKKyAgICAgICAgICAgIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgbmV4dCwgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRIdHRwU2VydmVyVHJhbnNwb3J0KElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBJVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwgUmVxdWVzdERlbGVnYXRlIG5leHQsIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsb2dnZXJGYWN0b3J5ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YobG9nZ2VyRmFjdG9yeSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQcm9jZXNzb3IgPSBwcm9jZXNzb3IgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YocHJvY2Vzc29yKSk7CisgICAgICAgICAgICBJbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlucHV0UHJvdG9jb2xGYWN0b3J5KSk7CisgICAgICAgICAgICBPdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSk7CisKKyAgICAgICAgICAgIF9uZXh0ID0gbmV4dDsKKyAgICAgICAgICAgIF9sb2dnZXIgPSBsb2dnZXJGYWN0b3J5LkNyZWF0ZUxvZ2dlcjxUSHR0cFNlcnZlclRyYW5zcG9ydD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIEludm9rZShIdHRwQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlc3BvbnNlLkNvbnRlbnRUeXBlID0gQ29udGVudFR5cGU7CisgICAgICAgICAgICBhd2FpdCBQcm9jZXNzUmVxdWVzdEFzeW5jKGNvbnRleHQsIGNvbnRleHQuUmVxdWVzdEFib3J0ZWQpOyAvL1RPRE86IGNoZWNrIGZvciBjb3JyZWN0IGxvZ2ljCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBQcm9jZXNzUmVxdWVzdEFzeW5jKEh0dHBDb250ZXh0IGNvbnRleHQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRTdHJlYW1DbGllbnRUcmFuc3BvcnQoY29udGV4dC5SZXF1ZXN0LkJvZHksIGNvbnRleHQuUmVzcG9uc2UuQm9keSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IElucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgdmFyIG91dHB1dCA9IE91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGF3YWl0IFByb2Nlc3Nvci5Qcm9jZXNzQXN5bmMoaW5wdXQsIG91dHB1dCwgY2FuY2VsbGF0aW9uVG9rZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDbGllbnQgZGllZCwganVzdCBtb3ZlIG9uCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODY3ODZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxOTEgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTy5QaXBlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuU2VydmVyCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBUaGlzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBQaXBlIG9uIHRoZSBsb2NhbGhvc3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9waXBlQWRkcmVzczsKKworICAgICAgICBwcml2YXRlIGJvb2wgX2FzeW5jTW9kZSA9IHRydWU7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbCBfaXNQZW5kaW5nID0gdHJ1ZTsKKworICAgICAgICBwcml2YXRlIE5hbWVkUGlwZVNlcnZlclN0cmVhbSBfc3RyZWFtID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydChzdHJpbmcgcGlwZUFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9waXBlQWRkcmVzcyA9IHBpcGVBZGRyZXNzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTGlzdGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGNoZWNrIGZvciBkaXNjb25lY3Rpb24gCisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0uRGlzY29ubmVjdCgpOworICAgICAgICAgICAgICAgICAgICBfc3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3N0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIF9pc1BlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0NsaWVudFBlbmRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2lzUGVuZGluZzsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBFbnN1cmVQaXBlSW5zdGFuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3N0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBkaXJlY3Rpb24gPSBQaXBlRGlyZWN0aW9uLkluT3V0OworICAgICAgICAgICAgICAgIHZhciBtYXhjb25uID0gMjU0OworICAgICAgICAgICAgICAgIHZhciBtb2RlID0gUGlwZVRyYW5zbWlzc2lvbk1vZGUuQnl0ZTsKKyAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IF9hc3luY01vZGUgPyBQaXBlT3B0aW9ucy5Bc3luY2hyb25vdXMgOiBQaXBlT3B0aW9ucy5Ob25lOworICAgICAgICAgICAgICAgIHZhciBpbmJ1ZiA9IDQwOTY7CisgICAgICAgICAgICAgICAgdmFyIG91dGJ1ZiA9IDQwOTY7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogc2VjdXJpdHkKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3N0cmVhbSA9IG5ldyBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0oX3BpcGVBZGRyZXNzLCBkaXJlY3Rpb24sIG1heGNvbm4sIG1vZGUsIG9wdGlvbnMsIGluYnVmLCBvdXRidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoTm90SW1wbGVtZW50ZWRFeGNlcHRpb24pIC8vIE1vbm8gc3RpbGwgZG9lcyBub3Qgc3VwcG9ydCBhc3luYywgZmFsbGJhY2sgdG8gc3luYworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9hc3luY01vZGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgJj0gKH5QaXBlT3B0aW9ucy5Bc3luY2hyb25vdXMpOworICAgICAgICAgICAgICAgICAgICAgICAgX3N0cmVhbSA9IG5ldyBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0oX3BpcGVBZGRyZXNzLCBkaXJlY3Rpb24sIG1heGNvbm4sIG1vZGUsIG9wdGlvbnMsIGluYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBfYXN5bmNNb2RlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVuc3VyZVBpcGVJbnN0YW5jZSgpOworCisgICAgICAgICAgICAgICAgYXdhaXQgX3N0cmVhbS5XYWl0Rm9yQ29ubmVjdGlvbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIHZhciB0cmFucyA9IG5ldyBTZXJ2ZXJUcmFuc3BvcnQoX3N0cmVhbSk7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA9IG51bGw7IC8vIHBhc3Mgb3duZXJzaGlwIHRvIFNlcnZlclRyYW5zcG9ydAorCisgICAgICAgICAgICAgICAgLy9faXNQZW5kaW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sIGUuTWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIFNlcnZlclRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0gX3N0cmVhbTsKKworICAgICAgICAgICAgcHVibGljIFNlcnZlclRyYW5zcG9ydChOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0gc3RyZWFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBzdHJlYW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiBfc3RyZWFtICE9IG51bGwgJiYgX3N0cmVhbS5Jc0Nvbm5lY3RlZDsKKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9zdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3N0cmVhbS5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9zdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhd2FpdCBfc3RyZWFtLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3N0cmVhbT8uRGlzcG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UU2VydmVyRnJhbWVkVHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4NmU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UU2VydmVyRnJhbWVkVHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTUwIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NsaWVudFRpbWVvdXQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wb3J0OworICAgICAgICBwcml2YXRlIFRjcExpc3RlbmVyIF9zZXJ2ZXI7CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQoVGNwTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgICAgICAgICA6IHRoaXMobGlzdGVuZXIsIDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KFRjcExpc3RlbmVyIGxpc3RlbmVyLCBpbnQgY2xpZW50VGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgX3NlcnZlciA9IGxpc3RlbmVyOworICAgICAgICAgICAgX2NsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQoaW50IHBvcnQpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICBfcG9ydCA9IHBvcnQ7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHNlcnZlciBzb2NrZXQKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbmV3IFRjcExpc3RlbmVyKElQQWRkcmVzcy5BbnksIF9wb3J0KTsKKyAgICAgICAgICAgICAgICBfc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQgIiArIHBvcnQgKyAiLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTGlzdGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG5vdCB0byBibG9jayBvbiBhY2NlcHQKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2VydmVyLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAiICsgc3guTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNDbGllbnRQZW5kaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zZXJ2ZXIuUGVuZGluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUQ2xpZW50VHJhbnNwb3J0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfc2VydmVyID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRGcmFtZWRDbGllbnRUcmFuc3BvcnQgdFNvY2tldFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgdmFyIHRjcENsaWVudCA9IGF3YWl0IF9zZXJ2ZXIuQWNjZXB0VGNwQ2xpZW50QXN5bmMoKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydCA9IG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KHRjcENsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCA9IF9jbGllbnRUaW1lb3V0CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0U29ja2V0VHJhbnNwb3J0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRTb2NrZXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvLyAgT3RoZXJ3aXNlLCBjbGVhbiBpdCB1cCBvdXJzZWx2ZXMuCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpIHRjcENsaWVudCkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFNlcnZlclNvY2tldFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOWQ4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFNlcnZlclNvY2tldFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDE3NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuU2VydmVyCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFNlcnZlclNvY2tldFRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9jbGllbnRUaW1lb3V0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfcG9ydDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF91c2VCdWZmZXJlZFNvY2tldHM7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfdXNlRnJhbWVkVHJhbnNwb3J0OworICAgICAgICBwcml2YXRlIFRjcExpc3RlbmVyIF9zZXJ2ZXI7CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoVGNwTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgICAgICAgICA6IHRoaXMobGlzdGVuZXIsIDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KFRjcExpc3RlbmVyIGxpc3RlbmVyLCBpbnQgY2xpZW50VGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgX3NlcnZlciA9IGxpc3RlbmVyOworICAgICAgICAgICAgX2NsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoaW50IHBvcnQpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0KQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIGNsaWVudFRpbWVvdXQsIGZhbHNlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQsIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzKToKKyAgICAgICAgICAgIHRoaXMocG9ydCwgY2xpZW50VGltZW91dCwgdXNlQnVmZmVyZWRTb2NrZXRzLCBmYWxzZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQsIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzLCBib29sIHVzZUZyYW1lZFRyYW5zcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BvcnQgPSBwb3J0OworICAgICAgICAgICAgX2NsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICAgICAgX3VzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgICAgIF91c2VGcmFtZWRUcmFuc3BvcnQgPSB1c2VGcmFtZWRUcmFuc3BvcnQ7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHNlcnZlciBzb2NrZXQKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbmV3IFRjcExpc3RlbmVyKElQQWRkcmVzcy5BbnksIF9wb3J0KTsKKyAgICAgICAgICAgICAgICBfc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQgIiArIHBvcnQgKyAiLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTGlzdGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG5vdCB0byBibG9jayBvbiBhY2NlcHQKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2VydmVyLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAiICsgc3guTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNDbGllbnRQZW5kaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zZXJ2ZXIuUGVuZGluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUQ2xpZW50VHJhbnNwb3J0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfc2VydmVyID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRDbGllbnRUcmFuc3BvcnQgdFNvY2tldFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgdmFyIHRjcENsaWVudCA9IGF3YWl0IF9zZXJ2ZXIuQWNjZXB0VGNwQ2xpZW50QXN5bmMoKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydCA9IG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KHRjcENsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCA9IF9jbGllbnRUaW1lb3V0CisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKF91c2VCdWZmZXJlZFNvY2tldHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRUcmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0KHRTb2NrZXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKF91c2VGcmFtZWRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRUcmFuc3BvcnQgPSBuZXcgVEZyYW1lZENsaWVudFRyYW5zcG9ydCh0U29ja2V0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0U29ja2V0VHJhbnNwb3J0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRTb2NrZXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvLyAgT3RoZXJ3aXNlLCBjbGVhbiBpdCB1cCBvdXJzZWx2ZXMuCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpIHRjcENsaWVudCkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OWZlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDE3NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIF9jbGllbnRDZXJ0VmFsaWRhdG9yOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfY2xpZW50VGltZW91dCA9IDA7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFg1MDlDZXJ0aWZpY2F0ZTIgX3NlcnZlckNlcnRpZmljYXRlOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNzbFByb3RvY29scyBfc3NsUHJvdG9jb2xzOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX3VzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF91c2VGcmFtZWRUcmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgX3NlcnZlcjsKKworICAgICAgICBwdWJsaWMgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCwgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCBmYWxzZSwgY2VydGlmaWNhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0KAorICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cywKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjbGllbnRDZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikgCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgdXNlQnVmZmVyZWRTb2NrZXRzLCBmYWxzZSwgY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgY2xpZW50Q2VydFZhbGlkYXRvciwgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLCBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzLAorICAgICAgICAgICAgYm9vbCB1c2VGcmFtZWRUcmFuc3BvcnQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2xpZW50Q2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghY2VydGlmaWNhdGUuSGFzUHJpdmF0ZUtleSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgIllvdXIgc2VydmVyLWNlcnRpZmljYXRlIG5lZWRzIHRvIGhhdmUgYSBwcml2YXRlIGtleSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfcG9ydCA9IHBvcnQ7CisgICAgICAgICAgICBfc2VydmVyQ2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZTsKKyAgICAgICAgICAgIF91c2VCdWZmZXJlZFNvY2tldHMgPSB1c2VCdWZmZXJlZFNvY2tldHM7CisgICAgICAgICAgICBfdXNlRnJhbWVkVHJhbnNwb3J0ID0gdXNlRnJhbWVkVHJhbnNwb3J0OworICAgICAgICAgICAgX2NsaWVudENlcnRWYWxpZGF0b3IgPSBjbGllbnRDZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIF9zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBzZXJ2ZXIgc29ja2V0CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG5ldyBUY3BMaXN0ZW5lcihJUEFkZHJlc3MuQW55LCBfcG9ydCk7CisgICAgICAgICAgICAgICAgX3NlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCQiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCB7cG9ydH0uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgYWNjZXB0IGlzIG5vdCBibG9ja2luZworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCQiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiB7c3guTWVzc2FnZX0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0NsaWVudFBlbmRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NlcnZlci5QZW5kaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRDbGllbnRUcmFuc3BvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNsaWVudCA9IGF3YWl0IF9zZXJ2ZXIuQWNjZXB0VGNwQ2xpZW50QXN5bmMoKTsKKyAgICAgICAgICAgICAgICBjbGllbnQuU2VuZFRpbWVvdXQgPSBjbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBfY2xpZW50VGltZW91dDsKKworICAgICAgICAgICAgICAgIC8vd3JhcCB0aGUgY2xpZW50IGluIGFuIFNTTCBTb2NrZXQgcGFzc2luZyBpbiB0aGUgU1NMIGNlcnQKKyAgICAgICAgICAgICAgICB2YXIgdFRsc1NvY2tldCA9IG5ldyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KGNsaWVudCwgX3NlcnZlckNlcnRpZmljYXRlLCB0cnVlLCBfY2xpZW50Q2VydFZhbGlkYXRvciwKKyAgICAgICAgICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywgX3NzbFByb3RvY29scyk7CisKKyAgICAgICAgICAgICAgICBhd2FpdCB0VGxzU29ja2V0LlNldHVwVGxzQXN5bmMoKTsKKworICAgICAgICAgICAgICAgIFRDbGllbnRUcmFuc3BvcnQgdHJhbnMgPSB0VGxzU29ja2V0OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChfdXNlQnVmZmVyZWRTb2NrZXRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoX3VzZUZyYW1lZFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRGcmFtZWRDbGllbnRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiB7ZXh9Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVENsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkOTZjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxNzkgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMKK3sKKyAgICAvL1RPRE86IHRoaW5rIGFib3V0IGNsaWVudCBpbmZvIAorICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRDbGllbnRUcmFuc3BvcnQgOiBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgLy9UT0RPOiB0aGluayBob3cgdG8gYXZvaWQgcGVlayBieXRlCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIF9wZWVrQnVmZmVyID0gbmV3IGJ5dGVbMV07CisgICAgICAgIHByaXZhdGUgYm9vbCBfaGFzUGVla0J5dGU7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIElzT3BlbiB7IGdldDsgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBEaXNwb3NlKHRydWUpOworICAgICAgICAgICAgR0MuU3VwcHJlc3NGaW5hbGl6ZSh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFBlZWtBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgLy9JZiB3ZSBhbHJlYWR5IGhhdmUgYSBieXRlIHJlYWQgYnV0IG5vdCBjb25zdW1lZCwgZG8gbm90aGluZy4KKyAgICAgICAgICAgIGlmIChfaGFzUGVla0J5dGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vSWYgdHJhbnNwb3J0IGNsb3NlZCB3ZSBjYW4ndCBwZWVrLgorICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL1RyeSB0byByZWFkIG9uZSBieXRlLiBJZiBzdWNjZWVkcyB3ZSB3aWxsIG5lZWQgdG8gc3RvcmUgaXQgZm9yIHRoZSBuZXh0IHJlYWQuCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYnl0ZXMgPSBhd2FpdCBSZWFkQXN5bmMoX3BlZWtCdWZmZXIsIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXMgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfaGFzUGVla0J5dGUgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIE9wZW5Bc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgQ2xvc2UoKTsKKworICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgVmFsaWRhdGVCdWZmZXJBcmdzKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2Yob2Zmc2V0KSwgIkJ1ZmZlciBvZmZzZXQgaXMgc21hbGxlciB0aGFuIHplcm8uIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZW5ndGggPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKGxlbmd0aCksICJCdWZmZXIgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiB6ZXJvLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gYnVmZmVyLkxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKG5hbWVvZihidWZmZXIpLCAiTm90IGVub3VnaCBkYXRhLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8aW50PiBSZWFkQWxsQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRBbGxBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8aW50PiBSZWFkQWxsQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZXRyaWV2ZWQgPSAwOworCisgICAgICAgICAgICAvL0lmIHdlIHByZXZpb3VzbHkgcGVla2VkIGEgYnl0ZSwgd2UgbmVlZCB0byB1c2UgdGhhdCBmaXJzdC4KKyAgICAgICAgICAgIGlmIChfaGFzUGVla0J5dGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCArIHJldHJpZXZlZCsrXSA9IF9wZWVrQnVmZmVyWzBdOworICAgICAgICAgICAgICAgIF9oYXNQZWVrQnl0ZSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAocmV0cmlldmVkIDwgbGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZWRDb3VudCA9IGF3YWl0IFJlYWRBc3luYyhidWZmZXIsIG9mZnNldCArIHJldHJpZXZlZCwgbGVuZ3RoIC0gcmV0cmlldmVkLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgaWYgKHJldHVybmVkQ291bnQgPD0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5FbmRPZkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQsIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0cmlldmVkICs9IHJldHVybmVkQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0cmlldmVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQXN5bmMoYnVmZmVyLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVBc3luYyhidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIEZsdXNoQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZyk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RTZXJ2ZXJUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UU2VydmVyVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNDVhNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UU2VydmVyVHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsNTQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBMaXN0ZW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgQ2xvc2UoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2wgSXNDbGllbnRQZW5kaW5nKCk7CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBBY2NlcHRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gYXdhaXQgQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkIntuYW1lb2YoQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyl9IHNob3VsZCBub3QgcmV0dXJuIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydDsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2M0MmUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDU4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIDogVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBVbmtub3duLAorICAgICAgICAgICAgTm90T3BlbiwKKyAgICAgICAgICAgIEFscmVhZHlPcGVuLAorICAgICAgICAgICAgVGltZWRPdXQsCisgICAgICAgICAgICBFbmRPZkZpbGUsCisgICAgICAgICAgICBJbnRlcnJ1cHRlZAorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgRXhUeXBlOworCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oRXhjZXB0aW9uVHlwZSBleFR5cGUpCisgICAgICAgICAgICA6IHRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICBFeFR5cGUgPSBleFR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIGV4VHlwZSwgc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgRXhUeXBlID0gZXhUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEV4Y2VwdGlvblR5cGUgVHlwZSA9PiBFeFR5cGU7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RUcmFuc3BvcnRGYWN0b3J5LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjM2NjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RUcmFuc3BvcnRGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMzUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICAgIEZyb20gTWFyayBTbGVlICYgQWRpdHlhIEFnYXJ3YWwgb2YgRmFjZWJvb2s6CisgICAgLy8vICAgICBGYWN0b3J5IGNsYXNzIHVzZWQgdG8gY3JlYXRlIHdyYXBwZWQgaW5zdGFuY2Ugb2YgVHJhbnNwb3J0cy4KKyAgICAvLy8gICAgIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgaW4gc2VydmVycywgd2hpY2ggZ2V0IFRyYW5zcG9ydHMgZnJvbQorICAgIC8vLyAgICAgYSBTZXJ2ZXJUcmFuc3BvcnQgYW5kIHRoZW4gbWF5IHdhbnQgdG8gbXV0YXRlIHRoZW0gKGkuZS4gY3JlYXRlCisgICAgLy8vICAgICBhIEJ1ZmZlcmVkVHJhbnNwb3J0IGZyb20gdGhlIHVuZGVybHlpbmcgYmFzZSB0cmFuc3BvcnQpCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeQorICAgIHsKKyAgICAgICAgcHVibGljIHZpcnR1YWwgVENsaWVudFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL2J1aWxkLmNtZCBiL2xpYi9uZXRjb3JlL2J1aWxkLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjNjNGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvYnVpbGQuY21kCkBAIC0wLDAgKzEsMjcgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworCitzZXRsb2NhbAorCit0aHJpZnQgLXZlcnNpb24KK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZCAKKworOmVvZgpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvYnVpbGQuc2ggYi9saWIvbmV0Y29yZS9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTE4YmNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvYnVpbGQuc2gKQEAgLTAsMCArMSwzMiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworI2V4aXQgaWYgYW55IGNvbW1hbmQgZmFpbHMKKyNzZXQgLWUKKwordGhyaWZ0IC0tdmVyc2lvbgorZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkIAorCisjcmV2aXNpb249JHtUUkFWSVNfSk9CX0lEOj0xfSAgCisjcmV2aXNpb249JChwcmludGYgIiUwNGQiICRyZXZpc2lvbikgCisKKyNkb3RuZXQgcGFjayAuL3NyYy9QUk9KRUNUX05BTUUgLWMgUmVsZWFzZSAtbyAuL2FydGlmYWN0cyAtLXZlcnNpb24tc3VmZml4PSRyZXZpc2lvbiAgCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9ydW50ZXN0cy5jbWQgYi9saWIvbmV0Y29yZS9ydW50ZXN0cy5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExNGJjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL3J1bnRlc3RzLmNtZApAQCAtMCwwICsxLDI4IEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KK3NldGxvY2FsCisKK3RocmlmdCAtdmVyc2lvbgorZG90bmV0IC0taW5mbworCitkb3RuZXQgdGVzdCBUZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5UZXN0c1xUaHJpZnQuVGVzdHMuY3Nwcm9qCisKKzplb2YKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL3J1bnRlc3RzLnNoIGIvbGliL25ldGNvcmUvcnVudGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2Y2MzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL3J1bnRlc3RzLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3RocmlmdCAtdmVyc2lvbgorZG90bmV0IC0taW5mbworCitkb3RuZXQgdGVzdCBUZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5UZXN0c1xUaHJpZnQuVGVzdHMuY3Nwcm9qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9NYWtlZmlsZS5hbSBiL2xpYi9uZXRzdGQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmYWFjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1OCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPSAuIAorCithbGwtbG9jYWw6CisJJChET1RORVRDT1JFKSBidWlsZAorCitjaGVjay1sb2NhbDoKKwkkKERPVE5FVENPUkUpIHRlc3QgVGVzdHMvVGhyaWZ0LlRlc3RzL1RocmlmdC5UZXN0cy5jc3Byb2oKKwkke0RPVE5FVENPUkV9IHRlc3QgVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIFRocmlmdC9iaW4KKwkkKFJNKSAtciBUaHJpZnQvb2JqCisKK0VYVFJBX0RJU1QgPSBcCisJUkVBRE1FLm1kIFwKKwlUZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9Qcm90b2NvbHMgXAorCVRlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvaiBcCisJVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLmNzcHJvaiBcCisJVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBcCisJVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9DYXNzYW5kcmFUZXN0LnRocmlmdCBcCisJVGVzdHMvVGhyaWZ0LlRlc3RzL1RocmlmdC5UZXN0cy5jc3Byb2ogXAorCVRlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMgXAorCVRlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucyBcCisJVGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyBcCisJVGhyaWZ0L1RCYXNlQ2xpZW50LmNzIFwKKwlUaHJpZnQvVEV4Y2VwdGlvbi5jcyBcCisJVGhyaWZ0L1RocmlmdC5jc3Byb2ogXAorCVRocmlmdC9Db2xsZWN0aW9ucyBcCisJVGhyaWZ0L1Byb2Nlc3NvciBcCisJVGhyaWZ0L1Byb3BlcnRpZXMgXAorCVRocmlmdC9Qcm90b2NvbCBcCisJVGhyaWZ0L1NlcnZlciBcCisJVGhyaWZ0L1RyYW5zcG9ydCBcCisJVGhyaWZ0LnNsbiBcCisJYnVpbGQuY21kIFwKKwlidWlsZC5zaCBcCisJcnVudGVzdHMuY21kIFwKKwlydW50ZXN0cy5zaAorCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvUkVBRE1FLm1kIGIvbGliL25ldHN0ZC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiYTczYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTQgQEAKKyMgQXBhY2hlIFRocmlmdCBuZXRzdGQKKworVGhyaWZ0IGNsaWVudCBsaWJyYXJ5IGZvciBNaWNyb3NvZnQgLk5FVCBTdGFuZGFyZCAKKworIyBCdWlsZCB0aGUgbGlicmFyeQorCisjIyBIb3cgdG8gYnVpbGQgb24gV2luZG93cworLSBHZXQgVGhyaWZ0IElETCBjb21waWxlciBleGVjdXRhYmxlLCBhZGQgdG8gc29tZSBmb2xkZXIgYW5kIGFkZCBwYXRoIHRvIHRoaXMgZm9sZGVyIGludG8gUEFUSCB2YXJpYWJsZQorLSBPcGVuIHRoZSBUaHJpZnQuc2xuIHByb2plY3Qgd2l0aCBWaXN1YWwgU3R1ZGlvIGFuZCBidWlsZC4KK29yIAorLSBCdWlsZCB3aXRoIHNjcmlwdHMKKworIyMgSG93IHRvIGJ1aWxkIG9uIFVuaXgvTGludXgKKy0gRW5zdXJlIHlvdSBoYXZlIC5ORVQgU0RLID49IDIuMCBpbnN0YWxsZWQsIG9yIHVzZSB0aGUgW1VidW50dSBkb2NrZXIgaW1hZ2VdKC4uLy4uL2J1aWxkL2RvY2tlci9SRUFETUUubWQpCistIEZvbGxvdyBjb21tb24gYXV0b21ha2UgYnVpbGQgcHJhY3RpY2U6IGAuLyBib290c3RyYXAgJiYgLi8gY29uZmlndXJlICYmIG1ha2VgCisKKyMjIEtub3duIGlzc3VlcworLSBJbiB0cmFjZSBsb2dnaW5nIG1vZGUgeW91IGNhbiBzZWUgc29tZSBub3QgaW1wb3J0YW50IGludGVybmFsIGV4Y2VwdGlvbnMKKworIyBNaWdyYXRpb24gdG8gbmV0c3RkCisKKyMjIC4uLiBmcm9tIG5ldGNvcmUKKworSWYgeW91IGFyZSBtaWdyYXRpbmcgeW91ciBjb2RlIGZyb20gbmV0Y29yZSBsaWJyYXJ5LCB5b3Ugd2lsbCBoYXZlIHRvOgorCistIFN3aXRjaCB0byBgdGhyaWZ0IC1nZW4gbmV0c3RkYAorLSB0aGUgZm9sbG93aW5nIGNvbXBpbGVyIGZsYWdzIGFyZSBubyBsb25nZXIgbmVlZGVkIG9yIHN1cHBvcnRlZDogYGhhc2hjb2RlYCBpcyBub3cgc3RhbmRhcmQsIHdoaWxlIGBudWxsYWJsZWAgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KKy0gdGhlIGBUaHJpZnQuVHJhbnNwb3J0YCBhbmQgYFRocmlmdC5Qcm90b2NvbGAgbmFtZXNwYWNlcyBub3cgdXNlIHRoZSBzaW5ndWxhciBmb3JtCistIGFkZCBgdXNpbmcgVGhyaWZ0LlByb2Nlc3NvcjtgIGluIHRoZSBzZXJ2ZXIgY29kZSB3aGVyZSBhcHByb3ByaWF0ZQorLSByZW5hbWUgYWxsIGBUKkNsaWVudFRyYW5zcG9ydGAgdG8gYFQqVHJhbnNwb3J0YCAKKy0gcmVuYW1lIGFsbCBgVEJhc2VTZXJ2ZXJgIG9jY3VycmVuY2VzIGluIHlvdXIgY29kZSB0byBgVFNlcnZlcmAKKy0gdGhlIGBTaW5nbGV0b25UUHJvY2Vzc29yRmFjdG9yeWAgaXMgbm93IGNhbGxlZCBgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnlgCistIGFuZCB0aGUgYEFzeW5jQmFzZVNlcnZlcmAgaXMgbm93IHRoZSBgVFNpbXBsZUFzeW5jU2VydmVyYAorCitZb3UgbWF5IHdvbmRlciB3aHkgd2UgY2hhbmdlZCBzbyBtYW55IG5hbWVzLiBUaGUgbmFtaW5nIHNjaGVtZSBoYXMgYmVlbiByZXZpc2VkIGZvciB0d28gcmVhc29uczogRmlyc3QsIHdlIHdhbnQgdG8gZ2V0IGJhY2sgdGhlIGVzdGFibGlzaGVkLCB3ZWxsLWtub3duIG5hbWluZyBjb25zaXN0ZW5jeSBhY3Jvc3MgdGhlIFRocmlmdCBsaWJyYXJpZXMgd2hpY2ggdGhlIG5ldGNvcmUgbGlicmFyeSBkaWQgbm90IGZ1bGx5IHJlc3BlY3QuIFNlY29uZCwgYnkgYWNoaWV2aW5nIHRoYXQgZmlyc3Qgb2JqZWN0aXZlLCB3ZSBnZXQgdGhlIGFkZGl0aW9uYWwgYmVuZWZpdCBvZiBtYWtpbmcgbWlncmF0aW9uIGF0IGxlYXN0IGEgYml0IGVhc2llciBmb3IgQyMgcHJvamVjdHMuCisKKyMjIC4uLiBmcm9tIGNzaGFycAorCitCZWNhdXNlIG9mIHRoZSBkaWZmZXJlbnQgZW52aXJvbm1lbnQgcmVxdWlyZW1lbnRzLCBtaWdyYXRpb24gZnJvbSBDIyB0YWtlcyBzbGlnaHRseSBtb3JlIGVmZm9ydHMuIFdoaWxlIHRoZSBjb2RlIGNoYW5nZXMgcmVsYXRlZCB0byBUaHJpZnQgaXRzZWxmIGFyZSBtb2RlcmF0ZSwgeW91IG1heSBuZWVkIHRvIHVwZ3JhZGUgY2VydGFpbiBkZXBlbmRlbmNpZXMsIGNvbXBvbmVudHMgb3IgZXZlbiBtb2R1bGVzIHRvIG1vcmUgcmVjZW50IHZlcnNpb25zLiAKKworMS4gQ2xpZW50IGFuZCBzZXJ2ZXIgYXBwbGljYXRpb25zIG11c3QgdXNlIGF0IGxlYXN0IGZyYW1ld29yayA0LjYuMSwgYW55IHZlcnNpb24gYmVsb3cgd2lsbCBub3Qgd29yay4gCisxLiBTd2l0Y2ggdG8gYHRocmlmdCAtZ2VuIG5ldHN0ZGAuIFRoZSBmb2xsb3dpbmcgY29tcGlsZXIgZmxhZ3MgYXJlIG5vIGxvbmdlciBuZWVkZWQgb3Igc3VwcG9ydGVkOiBgaGFzaGNvZGVgIGFuZCBgYXN5bmNgIGFyZSBub3cgc3RhbmRhcmQsIHdoaWxlIGBudWxsYWJsZWAgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KKzEuIFtGYW1pbGlhcml6ZSB5b3Vyc2VsZiB3aXRoIHRoZSBgYXN5bmMvYXdhaXRgIG1vZGVsXShodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9tYWdhemluZS9qajk5MTk3Ny5hc3B4KSwgaWYgeW91IGhhdmUgbm90IGFscmVhZHkgZG9uZSBzby4gQXMgbmV0c3RkIGRvZXMgbm90IHN1cHBvcnQgYElTeW5jYCBhbnltb3JlLCBhc3luYyBpcyBtYW5kYXRvcnkuIFRoZSBzeW5jaHJvbm91cyBtb2RlbCBpcyBzaW1wbHkgbm8gbG9uZ2VyIGF2YWlsYWJsZSAodGhhdCdzIGFsc28gdGhlIHJlYXNvbiB3aHkgd2UgZG9uJ3QgbmVlZCB0aGUgYGFzeW5jYCBmbGFnIGFueW1vcmUpLiAKKzEuIENvbnNpZGVyIHByb3BlciB1c2Ugb2YgYGNhbmNlbGxhdGlvblRva2VuYCBwYXJhbWV0ZXJzLiBUaGV5IGFyZSBvcHRpb25hbCBidXQgbWF5IGJlIHF1aXRlIGhlbHBmdWwuCisxLiBBcyB5b3UgcHJvYmFibHkgYWxyZWFkeSBndWVzc2VkLCB0aGVyZSBhcmUgYSBmZXcgbmFtZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZDoKKy0gYWRkIGB1c2luZyBUaHJpZnQuUHJvY2Vzc29yO2AgaW4gdGhlIHNlcnZlciBjb2RlIHdoZXJlIGFwcHJvcHJpYXRlCistIHRoZSBgVFNlcnZlclNvY2tldGAgaXMgbm93IGNhbGxlZCBgVFNlcnZlclNvY2tldFRyYW5zcG9ydGAKKy0gY2hhbmdlIGBJUHJvdG9jb2xGYWN0b3J5YCBpbnRvIGBJVFByb3RvY29sRmFjdG9yeWAKKy0gaWYgeW91IGFyZSBsb29raW5nIGZvciBgVFNpbXBsZVNlcnZlcmAsIHRyeSBgVFNpbXBsZUFzeW5jU2VydmVyYCBpbnN0ZWFkCistIHNpbWlsYXJseSwgdGhlIGBUVGhyZWFkUG9vbFNlcnZlcmAgaXMgbm93IGEgYFRUaHJlYWRQb29sQXN5bmNTZXJ2ZXJgIAorLSB0aGUgc2VydmVyJ3MgYFNlcnZlKClgIG1ldGhvZCBkb2VzIG5vdyBgU2VydmVBc3luYygpYAorLSBJbiBjYXNlIHlvdSBhcmUgdXNpbmcgVGhyaWZ0IHNlcnZlciBldmVudCBoYW5kbGVyczogdGhlIGBTZXRFdmVudEhhbmRsZXJgIG1ldGhvZCBub3cgc3RhcnRzIHdpdGggYW4gdXBwZXJjYXNlIGxldHRlcgorLSBhbmQgeW91IHdpbGwgYWxzbyBoYXZlIHRvIHJldmlzZSB0aGUgbWV0aG9kIG5hbWVzIG9mIGFsbCBgVFNlcnZlckV2ZW50SGFuZGxlcmAgZGVzY2VuZGFudHMgeW91IGhhdmUgaW4geW91ciBjb2RlCisKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvUHJvdG9jb2xzL1Byb3RvY29sc09wZXJhdGlvbnNUZXN0cy5jcyBiL2xpYi9uZXRzdGQvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvUHJvdG9jb2xzL1Byb3RvY29sc09wZXJhdGlvbnNUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWY4NDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9Qcm90b2NvbHMvUHJvdG9jb2xzT3BlcmF0aW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsNTAyIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBLZWxsZXJtYW5Tb2Z0d2FyZS5Db21wYXJlTmV0T2JqZWN0czsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlByb3RvY29sLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydC5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5Qcm90b2NvbHMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBQcm90b2NvbHNPcGVyYXRpb25zVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQ29tcGFyZUxvZ2ljIF9jb21wYXJlTG9naWMgPSBuZXcgQ29tcGFyZUxvZ2ljKCk7CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbildCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuT25ld2F5KV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5PbmV3YXkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5PbmV3YXkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZE1lc3NhZ2VfVGVzdChUeXBlIHByb3RvY29sVHlwZSwgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVE1lc3NhZ2UobmFtZW9mKFRNZXNzYWdlKSwgbWVzc2FnZVR5cGUsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1lc3NhZ2VFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWxNZXNzYWdlID0gYXdhaXQgcHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWxNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkU3RydWN0X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUU3RydWN0KG5hbWVvZihUU3RydWN0KSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRGaWVsZF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVEZpZWxkKG5hbWVvZihURmllbGQpLCBUVHlwZS5TdHJpbmcsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlRmllbGRCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkRmllbGRCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkTWFwX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUTWFwKFRUeXBlLlN0cmluZywgVFR5cGUuU3RyaW5nLCAxKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1hcEJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1hcEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkTWFwQmVnaW5Bc3luYygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTWFwRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZExpc3RfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRMaXN0KFRUeXBlLlN0cmluZywgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVMaXN0QmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTGlzdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkTGlzdEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZFNldF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVFNldChUVHlwZS5TdHJpbmcsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU2V0QmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU2V0RW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRTZXRCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRTZXRFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEJvb2xfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJvb2xBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkQm9vbEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkQnl0ZV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBzYnl0ZS5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJ5dGVBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkQnl0ZUFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkSTE2X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IHNob3J0Lk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlSTE2QXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEkxNkFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkSTMyX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IGludC5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUkzMkFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRJMzJBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEk2NF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBsb25nLk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlSTY0QXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEk2NEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkRG91YmxlX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IGRvdWJsZS5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZURvdWJsZUFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWREb3VibGVBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZFN0cmluZ19UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuYW1lb2YoU3RyaW5nKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZVN0cmluZ0FzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRTdHJpbmdBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEJpbmFyeV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBFbmNvZGluZy5VVEY4LkdldEJ5dGVzKG5hbWVvZihTdHJpbmcpKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJpbmFyeUFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRCaW5hcnlBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHVwbGU8U3RyZWFtLCBUUHJvdG9jb2w+IEdldFByb3RvY29sSW5zdGFuY2UoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtZW1vcnlTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB2YXIgc3RyZWFtQ2xpZW50VHJhbnNwb3J0ID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQobWVtb3J5U3RyZWFtLCBtZW1vcnlTdHJlYW0pOworICAgICAgICAgICAgdmFyIHByb3RvY29sID0gKFRQcm90b2NvbCkgQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHByb3RvY29sVHlwZSwgc3RyZWFtQ2xpZW50VHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8U3RyZWFtLCBUUHJvdG9jb2w+KG1lbW9yeVN0cmVhbSwgcHJvdG9jb2wpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2ogYi9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODFkOGFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKQEAgLTAsMCArMSw0OCBAQAor77u/PFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDwhLS0KKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKyAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgICAgCisgIAkgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIAorICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICAgIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdC5JbnRlZ3JhdGlvblRlc3RzPC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5UaHJpZnQuSW50ZWdyYXRpb25UZXN0czwvUGFja2FnZUlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJDb21wYXJlTkVUT2JqZWN0cyIgVmVyc2lvbj0iNC41OC4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5ORVQuVGVzdC5TZGsiIFZlcnNpb249IjE1LjkuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNU1Rlc3QuVGVzdEFkYXB0ZXIiIFZlcnNpb249IjEuNC4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1TVGVzdC5UZXN0RnJhbWV3b3JrIiBWZXJzaW9uPSIxLjQuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249IjQuNS4zIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFNlcnZpY2UgSW5jbHVkZT0iezgyYTdmNDhkLTNiNTAtNGIxZS1iODJlLTNhZGE4MjEwYzM1OH0iIC8+CisgIDwvSXRlbUdyb3VwPgorCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL0Nhc3NhbmRyYVRlc3QudGhyaWZ0IGIvbGliL25ldHN0ZC9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL0Nhc3NhbmRyYVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Y2IzODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvQ2Fzc2FuZHJhVGVzdC50aHJpZnQKQEAgLTAsMCArMSw3MDUgQEAKKyMhL3Vzci9sb2NhbC9iaW4vdGhyaWZ0IC0tamF2YSAtLXBocCAtLXB5CisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorIyAqKiogUExFQVNFIFJFTUVNQkVSIFRPIEVESVQgVEhFIFZFUlNJT04gQ09OU1RBTlQgV0hFTiBNQUtJTkcgQ0hBTkdFUyAqKioKKyMgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKyMKKyMgSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIENhc3NhbmRyYSBTZXJ2aWNlCisjCisKK25hbWVzcGFjZSBuZXRzdGQgQXBhY2hlLkNhc3NhbmRyYS5UZXN0CisKKyMgVGhyaWZ0LnJiIGhhcyBhIGJ1ZyB3aGVyZSB0b3AtbGV2ZWwgbW9kdWxlcyB0aGF0IGluY2x1ZGUgbW9kdWxlcyAKKyMgd2l0aCB0aGUgc2FtZSBuYW1lIGFyZSBub3QgcHJvcGVybHkgcmVmZXJlbmNlZCwgc28gd2UgY2FuJ3QgZG8KKyMgQ2Fzc2FuZHJhOjpDYXNzYW5kcmE6OkNsaWVudC4KK25hbWVzcGFjZSByYiBDYXNzYW5kcmFUaHJpZnQKKworIyBUaGUgQVBJIHZlcnNpb24gKE5PVCB0aGUgcHJvZHVjdCB2ZXJzaW9uKSwgY29tcG9zZWQgYXMgYSBkb3QgZGVsaW1pdGVkCisjIHN0cmluZyB3aXRoIG1ham9yLCBtaW5vciwgYW5kIHBhdGNoIGxldmVsIGNvbXBvbmVudHMuCisjCisjICAtIE1ham9yOiBJbmNyZW1lbnRlZCBmb3IgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZXMuIEFuIGV4YW1wbGUgd291bGQKKyMgICAgICAgICAgIGJlIGNoYW5nZXMgdG8gdGhlIG51bWJlciBvciBkaXNwb3NpdGlvbiBvZiBtZXRob2QgYXJndW1lbnRzLgorIyAgLSBNaW5vcjogSW5jcmVtZW50ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgY2hhbmdlcy4gQW4gZXhhbXBsZSB3b3VsZAorIyAgICAgICAgICAgYmUgdGhlIGFkZGl0aW9uIG9mIGEgbmV3IChvcHRpb25hbCkgbWV0aG9kLgorIyAgLSBQYXRjaDogSW5jcmVtZW50ZWQgZm9yIGJ1ZyBmaXhlcy4gVGhlIHBhdGNoIGxldmVsIHNob3VsZCBiZSBpbmNyZWFzZWQKKyMgICAgICAgICAgIGZvciBldmVyeSBlZGl0IHRoYXQgZG9lc24ndCByZXN1bHQgaW4gYSBjaGFuZ2UgdG8gbWFqb3IvbWlub3IuCisjCisjIFNlZSB0aGUgU2VtYW50aWMgVmVyc2lvbmluZyBTcGVjaWZpY2F0aW9uIChTZW1WZXIpIGh0dHA6Ly9zZW12ZXIub3JnLgorY29uc3Qgc3RyaW5nIFZFUlNJT04gPSAiMTkuMjQuMCIKKworCisjCisjIGRhdGEgc3RydWN0dXJlcworIworCisvKiogQmFzaWMgdW5pdCBvZiBkYXRhIHdpdGhpbiBhIENvbHVtbkZhbWlseS4KKyAqIEBwYXJhbSBuYW1lLCB0aGUgbmFtZSBieSB3aGljaCB0aGlzIGNvbHVtbiBpcyBzZXQgYW5kIHJldHJpZXZlZC4gIE1heGltdW0gNjRLQiBsb25nLgorICogQHBhcmFtIHZhbHVlLiBUaGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUuICBNYXhpbXVtIDJHQiBsb25nLCBidXQgaW4gcHJhY3RpY2UgeW91IHNob3VsZCBsaW1pdCBpdCB0byBzbWFsbCBudW1iZXJzIG9mIE1CIChzaW5jZSBUaHJpZnQgbXVzdCByZWFkIHRoZSBmdWxsIHZhbHVlIGludG8gbWVtb3J5IHRvIG9wZXJhdGUgb24gaXQpLgorICogQHBhcmFtIHRpbWVzdGFtcC4gVGhlIHRpbWVzdGFtcCBpcyB1c2VkIGZvciBjb25mbGljdCBkZXRlY3Rpb24vcmVzb2x1dGlvbiB3aGVuIHR3byBjb2x1bW5zIHdpdGggc2FtZSBuYW1lIG5lZWQgdG8gYmUgY29tcGFyZWQuCisgKiBAcGFyYW0gdHRsLiBBbiBvcHRpb25hbCwgcG9zaXRpdmUgZGVsYXkgKGluIHNlY29uZHMpIGFmdGVyIHdoaWNoIHRoZSBjb2x1bW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuIAorICovCitzdHJ1Y3QgQ29sdW1uIHsKKyAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgMjogb3B0aW9uYWwgYmluYXJ5IHZhbHVlLAorICAgMzogb3B0aW9uYWwgaTY0IHRpbWVzdGFtcCwKKyAgIDQ6IG9wdGlvbmFsIGkzMiB0dGwsCit9CisKKy8qKiBBIG5hbWVkIGxpc3Qgb2YgY29sdW1ucy4KKyAqIEBwYXJhbSBuYW1lLiBzZWUgQ29sdW1uLm5hbWUuCisgKiBAcGFyYW0gY29sdW1ucy4gQSBjb2xsZWN0aW9uIG9mIHN0YW5kYXJkIENvbHVtbnMuICBUaGUgY29sdW1ucyB3aXRoaW4gYSBzdXBlciBjb2x1bW4gYXJlIGRlZmluZWQgaW4gYW4gYWRob2MgbWFubmVyLgorICogICAgICAgICAgICAgICAgIENvbHVtbnMgd2l0aGluIGEgc3VwZXIgY29sdW1uIGRvIG5vdCBoYXZlIHRvIGhhdmUgbWF0Y2hpbmcgc3RydWN0dXJlcyAoc2ltaWxhcmx5IG5hbWVkIGNoaWxkIGNvbHVtbnMpLgorICovCitzdHJ1Y3QgU3VwZXJDb2x1bW4geworICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAyOiByZXF1aXJlZCBsaXN0PENvbHVtbj4gY29sdW1ucywKK30KKworc3RydWN0IENvdW50ZXJDb2x1bW4geworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgIDI6IHJlcXVpcmVkIGk2NCB2YWx1ZQorfQorCitzdHJ1Y3QgQ291bnRlclN1cGVyQ29sdW1uIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkgbmFtZSwKKyAgICAyOiByZXF1aXJlZCBsaXN0PENvdW50ZXJDb2x1bW4+IGNvbHVtbnMKK30KKworLyoqCisgICAgTWV0aG9kcyBmb3IgZmV0Y2hpbmcgcm93cy9yZWNvcmRzIGZyb20gQ2Fzc2FuZHJhIHdpbGwgcmV0dXJuIGVpdGhlciBhIHNpbmdsZSBpbnN0YW5jZSBvZiBDb2x1bW5PclN1cGVyQ29sdW1uIG9yIGEgbGlzdAorICAgIG9mIENvbHVtbk9yU3VwZXJDb2x1bW5zIChnZXRfc2xpY2UoKSkuIElmIHlvdSdyZSBsb29raW5nIHVwIGEgU3VwZXJDb2x1bW4gKG9yIGxpc3Qgb2YgU3VwZXJDb2x1bW5zKSB0aGVuIHRoZSByZXN1bHRpbmcKKyAgICBpbnN0YW5jZXMgb2YgQ29sdW1uT3JTdXBlckNvbHVtbiB3aWxsIGhhdmUgdGhlIHJlcXVlc3RlZCBTdXBlckNvbHVtbiBpbiB0aGUgYXR0cmlidXRlIHN1cGVyX2NvbHVtbi4gRm9yIHF1ZXJpZXMgcmVzdWx0aW5nCisgICAgaW4gQ29sdW1ucywgdGhvc2UgdmFsdWVzIHdpbGwgYmUgaW4gdGhlIGF0dHJpYnV0ZSBjb2x1bW4uIFRoaXMgY2hhbmdlIHdhcyBtYWRlIGJldHdlZW4gMC4zIGFuZCAwLjQgdG8gc3RhbmRhcmRpemUgb24KKyAgICBzaW5nbGUgcXVlcnkgbWV0aG9kcyB0aGF0IG1heSByZXR1cm4gZWl0aGVyIGEgU3VwZXJDb2x1bW4gb3IgQ29sdW1uLgorCisgICAgSWYgdGhlIHF1ZXJ5IHdhcyBvbiBhIGNvdW50ZXIgY29sdW1uIGZhbWlseSwgeW91IHdpbGwgZWl0aGVyIGdldCBhIGNvdW50ZXJfY29sdW1uIChpbnN0ZWFkIG9mIGEgY29sdW1uKSBvciBhIAorICAgIGNvdW50ZXJfc3VwZXJfY29sdW1uIChpbnN0ZWFkIG9mIGEgc3VwZXJfY29sdW1uKQorCisgICAgQHBhcmFtIGNvbHVtbi4gVGhlIENvbHVtbiByZXR1cm5lZCBieSBnZXQoKSBvciBnZXRfc2xpY2UoKS4KKyAgICBAcGFyYW0gc3VwZXJfY29sdW1uLiBUaGUgU3VwZXJDb2x1bW4gcmV0dXJuZWQgYnkgZ2V0KCkgb3IgZ2V0X3NsaWNlKCkuCisgICAgQHBhcmFtIGNvdW50ZXJfY29sdW1uLiBUaGUgQ291bnRlcm9sdW1uIHJldHVybmVkIGJ5IGdldCgpIG9yIGdldF9zbGljZSgpLgorICAgIEBwYXJhbSBjb3VudGVyX3N1cGVyX2NvbHVtbi4gVGhlIENvdW50ZXJTdXBlckNvbHVtbiByZXR1cm5lZCBieSBnZXQoKSBvciBnZXRfc2xpY2UoKS4KKyAqLworc3RydWN0IENvbHVtbk9yU3VwZXJDb2x1bW4geworICAgIDE6IG9wdGlvbmFsIENvbHVtbiBjb2x1bW4sCisgICAgMjogb3B0aW9uYWwgU3VwZXJDb2x1bW4gc3VwZXJfY29sdW1uLAorICAgIDM6IG9wdGlvbmFsIENvdW50ZXJDb2x1bW4gY291bnRlcl9jb2x1bW4sCisgICAgNDogb3B0aW9uYWwgQ291bnRlclN1cGVyQ29sdW1uIGNvdW50ZXJfc3VwZXJfY29sdW1uCit9CisKKworIworIyBFeGNlcHRpb25zCisjIChub3RlIHRoYXQgaW50ZXJuYWwgc2VydmVyIGVycm9ycyB3aWxsIHJhaXNlIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBjb3VydGVzeSBvZiBUaHJpZnQpCisjCisKKy8qKiBBIHNwZWNpZmljIGNvbHVtbiB3YXMgcmVxdWVzdGVkIHRoYXQgZG9lcyBub3QgZXhpc3QuICovCitleGNlcHRpb24gTm90Rm91bmRFeGNlcHRpb24geworfQorCisvKiogSW52YWxpZCByZXF1ZXN0IGNvdWxkIG1lYW4ga2V5c3BhY2Ugb3IgY29sdW1uIGZhbWlseSBkb2VzIG5vdCBleGlzdCwgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgbWlzc2luZywgb3IgYSBwYXJhbWV0ZXIgaXMgbWFsZm9ybWVkLiAKKyAgICB3aHkgY29udGFpbnMgYW4gYXNzb2NpYXRlZCBlcnJvciBtZXNzYWdlLgorKi8KK2V4Y2VwdGlvbiBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIHdoeQorfQorCisvKiogTm90IGFsbCB0aGUgcmVwbGljYXMgcmVxdWlyZWQgY291bGQgYmUgY3JlYXRlZCBhbmQvb3IgcmVhZC4gKi8KK2V4Y2VwdGlvbiBVbmF2YWlsYWJsZUV4Y2VwdGlvbiB7Cit9CisKKy8qKiBSUEMgdGltZW91dCB3YXMgZXhjZWVkZWQuICBlaXRoZXIgYSBub2RlIGZhaWxlZCBtaWQtb3BlcmF0aW9uLCBvciBsb2FkIHdhcyB0b28gaGlnaCwgb3IgdGhlIHJlcXVlc3RlZCBvcCB3YXMgdG9vIGxhcmdlLiAqLworZXhjZXB0aW9uIFRpbWVkT3V0RXhjZXB0aW9uIHsKK30KKworLyoqIGludmFsaWQgYXV0aGVudGljYXRpb24gcmVxdWVzdCAoaW52YWxpZCBrZXlzcGFjZSwgdXNlciBkb2VzIG5vdCBleGlzdCwgb3IgY3JlZGVudGlhbHMgaW52YWxpZCkgKi8KK2V4Y2VwdGlvbiBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIHdoeQorfQorCisvKiogaW52YWxpZCBhdXRob3JpemF0aW9uIHJlcXVlc3QgKHVzZXIgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8ga2V5c3BhY2UpICovCitleGNlcHRpb24gQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIHdoeQorfQorCisvKiogc2NoZW1hcyBhcmUgbm90IGluIGFncmVlbWVudCBhY3Jvc3MgYWxsIG5vZGVzICovCitleGNlcHRpb24gU2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHsKK30KKworCisjCisjIHNlcnZpY2UgYXBpCisjCisvKiogCisgKiBUaGUgQ29uc2lzdGVuY3lMZXZlbCBpcyBhbiBlbnVtIHRoYXQgY29udHJvbHMgYm90aCByZWFkIGFuZCB3cml0ZQorICogYmVoYXZpb3IgYmFzZWQgb24gdGhlIFJlcGxpY2F0aW9uRmFjdG9yIG9mIHRoZSBrZXlzcGFjZS4gIFRoZQorICogZGlmZmVyZW50IGNvbnNpc3RlbmN5IGxldmVscyBoYXZlIGRpZmZlcmVudCBtZWFuaW5ncywgZGVwZW5kaW5nIG9uCisgKiBpZiB5b3UncmUgZG9pbmcgYSB3cml0ZSBvciByZWFkIG9wZXJhdGlvbi4gCisgKgorICogSWYgVyArIFIgPiBSZXBsaWNhdGlvbkZhY3Rvciwgd2hlcmUgVyBpcyB0aGUgbnVtYmVyIG9mIG5vZGVzIHRvCisgKiBibG9jayBmb3Igb24gd3JpdGUsIGFuZCBSIHRoZSBudW1iZXIgdG8gYmxvY2sgZm9yIG9uIHJlYWRzLCB5b3UKKyAqIHdpbGwgaGF2ZSBzdHJvbmdseSBjb25zaXN0ZW50IGJlaGF2aW9yOyB0aGF0IGlzLCByZWFkZXJzIHdpbGwKKyAqIGFsd2F5cyBzZWUgdGhlIG1vc3QgcmVjZW50IHdyaXRlLiBPZiB0aGVzZSwgdGhlIG1vc3QgaW50ZXJlc3RpbmcgaXMKKyAqIHRvIGRvIFFVT1JVTSByZWFkcyBhbmQgd3JpdGVzLCB3aGljaCBnaXZlcyB5b3UgY29uc2lzdGVuY3kgd2hpbGUKKyAqIHN0aWxsIGFsbG93aW5nIGF2YWlsYWJpbGl0eSBpbiB0aGUgZmFjZSBvZiBub2RlIGZhaWx1cmVzIHVwIHRvIGhhbGYKKyAqIG9mIDxSZXBsaWNhdGlvbkZhY3Rvcj4uIE9mIGNvdXJzZSBpZiBsYXRlbmN5IGlzIG1vcmUgaW1wb3J0YW50IHRoYW4KKyAqIGNvbnNpc3RlbmN5IHRoZW4geW91IGNhbiB1c2UgbG93ZXIgdmFsdWVzIGZvciBlaXRoZXIgb3IgYm90aC4KKyAqIAorICogU29tZSBDb25zaXN0ZW5jeUxldmVscyAoT05FLCBUV08sIFRIUkVFKSByZWZlciB0byBhIHNwZWNpZmljIG51bWJlcgorICogb2YgcmVwbGljYXMgcmF0aGVyIHRoYW4gYSBsb2dpY2FsIGNvbmNlcHQgdGhhdCBhZGp1c3RzCisgKiBhdXRvbWF0aWNhbGx5IHdpdGggdGhlIHJlcGxpY2F0aW9uIGZhY3Rvci4gIE9mIHRoZXNlLCBvbmx5IE9ORSBpcworICogY29tbW9ubHkgdXNlZDsgVFdPIGFuZCAoZXZlbiBtb3JlIHJhcmVseSkgVEhSRUUgYXJlIG9ubHkgdXNlZnVsCisgKiB3aGVuIHlvdSBjYXJlIG1vcmUgYWJvdXQgZ3VhcmFudGVlaW5nIGEgY2VydGFpbiBsZXZlbCBvZgorICogZHVyYWJpbGl0eSwgdGhhbiBjb25zaXN0ZW5jeS4KKyAqIAorICogV3JpdGUgY29uc2lzdGVuY3kgbGV2ZWxzIG1ha2UgdGhlIGZvbGxvd2luZyBndWFyYW50ZWVzIGJlZm9yZSByZXBvcnRpbmcgc3VjY2VzcyB0byB0aGUgY2xpZW50OgorICogICBBTlkgICAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gb25jZSBzb21ld2hlcmUsIGluY2x1ZGluZyBwb3NzaWJseSBiZWluZyBoaW50ZWQgaW4gYSBub24tdGFyZ2V0IG5vZGUuCisgKiAgIE9ORSAgICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byBhdCBsZWFzdCAxIG5vZGUncyBjb21taXQgbG9nIGFuZCBtZW1vcnkgdGFibGUKKyAqICAgVFdPICAgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIGF0IGxlYXN0IDIgbm9kZSdzIGNvbW1pdCBsb2cgYW5kIG1lbW9yeSB0YWJsZQorICogICBUSFJFRSAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gYXQgbGVhc3QgMyBub2RlJ3MgY29tbWl0IGxvZyBhbmQgbWVtb3J5IHRhYmxlCisgKiAgIFFVT1JVTSAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byA8UmVwbGljYXRpb25GYWN0b3I+IC8gMiArIDEgbm9kZXMKKyAqICAgTE9DQUxfUVVPUlVNIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIDxSZXBsaWNhdGlvbkZhY3Rvcj4gLyAyICsgMSBub2Rlcywgd2l0aGluIHRoZSBsb2NhbCBkYXRhY2VudGVyIChyZXF1aXJlcyBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneSkKKyAqICAgRUFDSF9RVU9SVU0gIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIDxSZXBsaWNhdGlvbkZhY3Rvcj4gLyAyICsgMSBub2RlcyBpbiBlYWNoIGRhdGFjZW50ZXIgKHJlcXVpcmVzIE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5KQorICogICBBTEwgICAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGlzIHdyaXR0ZW4gdG8gPGNvZGU+Jmx0O1JlcGxpY2F0aW9uRmFjdG9yJmd0OzwvY29kZT4gbm9kZXMgYmVmb3JlIHJlc3BvbmRpbmcgdG8gdGhlIGNsaWVudC4KKyAqIAorICogUmVhZCBjb25zaXN0ZW5jeSBsZXZlbHMgbWFrZSB0aGUgZm9sbG93aW5nIGd1YXJhbnRlZXMgYmVmb3JlIHJldHVybmluZyBzdWNjZXNzZnVsIHJlc3VsdHMgdG8gdGhlIGNsaWVudDoKKyAqICAgQU5ZICAgICAgICAgIE5vdCBzdXBwb3J0ZWQuIFlvdSBwcm9iYWJseSB3YW50IE9ORSBpbnN0ZWFkLgorICogICBPTkUgICAgICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIG9idGFpbmVkIGZyb20gYSBzaW5nbGUgcmVwbGljYS4KKyAqICAgVFdPICAgICAgICAgIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSB0d28gcmVwbGljYXMgaGF2ZSByZXBsaWVkLgorICogICBUSFJFRSAgICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIHRocmVlIHJlcGxpY2FzIGhhdmUgcmVwbGllZC4KKyAqICAgUVVPUlVNICAgICAgIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSBhIG1ham9yaXR5IG9mIHJlcGxpY2FzIGhhdmUgcmVwbGllZC4KKyAqICAgTE9DQUxfUVVPUlVNIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSBhIG1ham9yaXR5IG9mIHJlcGxpY2FzIHdpdGhpbiB0aGUgbG9jYWwgZGF0YWNlbnRlciBoYXZlIHJlcGxpZWQuCisgKiAgIEVBQ0hfUVVPUlVNICBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgYSBtYWpvcml0eSBvZiByZXBsaWNhcyB3aXRoaW4gZWFjaCBkYXRhY2VudGVyIGhhdmUgcmVwbGllZC4KKyAqICAgQUxMICAgICAgICAgIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSBhbGwgcmVwbGljYXMgaGF2ZSByZXBsaWVkIChpbXBsaWVzIG5vIHJlcGxpY2EgbWF5IGJlIGRvd24pLi4KKyovCitlbnVtIENvbnNpc3RlbmN5TGV2ZWwgeworICAgIE9ORSA9IDEsCisgICAgUVVPUlVNID0gMiwKKyAgICBMT0NBTF9RVU9SVU0gPSAzLAorICAgIEVBQ0hfUVVPUlVNID0gNCwKKyAgICBBTEwgPSA1LAorICAgIEFOWSA9IDYsCisgICAgVFdPID0gNywKKyAgICBUSFJFRSA9IDgsCit9CisKKy8qKgorICAgIENvbHVtblBhcmVudCBpcyB1c2VkIHdoZW4gc2VsZWN0aW5nIGdyb3VwcyBvZiBjb2x1bW5zIGZyb20gdGhlIHNhbWUgQ29sdW1uRmFtaWx5LiBJbiBkaXJlY3Rvcnkgc3RydWN0dXJlIHRlcm1zLCBpbWFnaW5lCisgICAgQ29sdW1uUGFyZW50IGFzIENvbHVtblBhdGggKyAnLy4uLycuCisKKyAgICBTZWUgYWxzbyA8YSBocmVmPSJjYXNzYW5kcmEuaHRtbCNTdHJ1Y3RfQ29sdW1uUGF0aCI+Q29sdW1uUGF0aDwvYT4KKyAqLworc3RydWN0IENvbHVtblBhcmVudCB7CisgICAgMzogcmVxdWlyZWQgc3RyaW5nIGNvbHVtbl9mYW1pbHksCisgICAgNDogb3B0aW9uYWwgYmluYXJ5IHN1cGVyX2NvbHVtbiwKK30KKworLyoqIFRoZSBDb2x1bW5QYXRoIGlzIHRoZSBwYXRoIHRvIGEgc2luZ2xlIGNvbHVtbiBpbiBDYXNzYW5kcmEuIEl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gdGhpbmsgb2YgQ29sdW1uUGF0aCBhbmQKKyAqIENvbHVtblBhcmVudCBpbiB0ZXJtcyBvZiBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCisgKgorICogQ29sdW1uUGF0aCBpcyB1c2VkIHRvIGxvb2tpbmcgdXAgYSBzaW5nbGUgY29sdW1uLgorICoKKyAqIEBwYXJhbSBjb2x1bW5fZmFtaWx5LiBUaGUgbmFtZSBvZiB0aGUgQ0Ygb2YgdGhlIGNvbHVtbiBiZWluZyBsb29rZWQgdXAuCisgKiBAcGFyYW0gc3VwZXJfY29sdW1uLiBUaGUgc3VwZXIgY29sdW1uIG5hbWUuCisgKiBAcGFyYW0gY29sdW1uLiBUaGUgY29sdW1uIG5hbWUuCisgKi8KK3N0cnVjdCBDb2x1bW5QYXRoIHsKKyAgICAzOiByZXF1aXJlZCBzdHJpbmcgY29sdW1uX2ZhbWlseSwKKyAgICA0OiBvcHRpb25hbCBiaW5hcnkgc3VwZXJfY29sdW1uLAorICAgIDU6IG9wdGlvbmFsIGJpbmFyeSBjb2x1bW4sCit9CisKKy8qKgorICAgIEEgc2xpY2UgcmFuZ2UgaXMgYSBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgYmFzaWMgcmFuZ2UsIG9yZGVyaW5nIGFuZCBsaW1pdCBpbmZvcm1hdGlvbiBmb3IgYSBxdWVyeSB0aGF0IHdpbGwgcmV0dXJuCisgICAgbXVsdGlwbGUgY29sdW1ucy4gSXQgY291bGQgYmUgdGhvdWdodCBvZiBhcyBDYXNzYW5kcmEncyB2ZXJzaW9uIG9mIExJTUlUIGFuZCBPUkRFUiBCWQorCisgICAgQHBhcmFtIHN0YXJ0LiBUaGUgY29sdW1uIG5hbWUgdG8gc3RhcnQgdGhlIHNsaWNlIHdpdGguIFRoaXMgYXR0cmlidXRlIGlzIG5vdCByZXF1aXJlZCwgdGhvdWdoIHRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUsCisgICAgICAgICAgICAgICAgICBhbmQgY2FuIGJlIHNhZmVseSBzZXQgdG8gJycsIGkuZS4sIGFuIGVtcHR5IGJ5dGUgYXJyYXksIHRvIHN0YXJ0IHdpdGggdGhlIGZpcnN0IGNvbHVtbiBuYW1lLiBPdGhlcndpc2UsIGl0CisgICAgICAgICAgICAgICAgICBtdXN0IGEgdmFsaWQgdmFsdWUgdW5kZXIgdGhlIHJ1bGVzIG9mIHRoZSBDb21wYXJhdG9yIGRlZmluZWQgZm9yIHRoZSBnaXZlbiBDb2x1bW5GYW1pbHkuCisgICAgQHBhcmFtIGZpbmlzaC4gVGhlIGNvbHVtbiBuYW1lIHRvIHN0b3AgdGhlIHNsaWNlIGF0LiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgcmVxdWlyZWQsIHRob3VnaCB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgIGFuZCBjYW4gYmUgc2FmZWx5IHNldCB0byBhbiBlbXB0eSBieXRlIGFycmF5IHRvIG5vdCBzdG9wIHVudGlsICdjb3VudCcgcmVzdWx0cyBhcmUgc2Vlbi4gT3RoZXJ3aXNlLCBpdAorICAgICAgICAgICAgICAgICAgIG11c3QgYWxzbyBiZSBhIHZhbGlkIHZhbHVlIHRvIHRoZSBDb2x1bW5GYW1pbHkgQ29tcGFyYXRvci4KKyAgICBAcGFyYW0gcmV2ZXJzZWQuIFdoZXRoZXIgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIG9yZGVyZWQgaW4gcmV2ZXJzZWQgb3JkZXIuIFNpbWlsYXIgdG8gT1JERVIgQlkgYmxhaCBERVNDIGluIFNRTC4KKyAgICBAcGFyYW0gY291bnQuIEhvdyBtYW55IGNvbHVtbnMgdG8gcmV0dXJuLiBTaW1pbGFyIHRvIExJTUlUIGluIFNRTC4gTWF5IGJlIGFyYml0cmFyaWx5IGxhcmdlLCBidXQgVGhyaWZ0IHdpbGwKKyAgICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplIHRoZSB3aG9sZSByZXN1bHQgaW50byBtZW1vcnkgYmVmb3JlIHJldHVybmluZyBpdCB0byB0aGUgY2xpZW50LCBzbyBiZSBhd2FyZSB0aGF0IHlvdSBtYXkKKyAgICAgICAgICAgICAgICAgIGJlIGJldHRlciBzZXJ2ZWQgYnkgaXRlcmF0aW5nIHRocm91Z2ggc2xpY2VzIGJ5IHBhc3NpbmcgdGhlIGxhc3QgdmFsdWUgb2Ygb25lIGNhbGwgaW4gYXMgdGhlICdzdGFydCcKKyAgICAgICAgICAgICAgICAgIG9mIHRoZSBuZXh0IGluc3RlYWQgb2YgaW5jcmVhc2luZyAnY291bnQnIGFyYml0cmFyaWx5IGxhcmdlLgorICovCitzdHJ1Y3QgU2xpY2VSYW5nZSB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IHN0YXJ0LAorICAgIDI6IHJlcXVpcmVkIGJpbmFyeSBmaW5pc2gsCisgICAgMzogcmVxdWlyZWQgYm9vbCByZXZlcnNlZD0wLAorICAgIDQ6IHJlcXVpcmVkIGkzMiBjb3VudD0xMDAsCit9CisKKy8qKgorICAgIEEgU2xpY2VQcmVkaWNhdGUgaXMgc2ltaWxhciB0byBhIG1hdGhlbWF0aWMgcHJlZGljYXRlIChzZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QcmVkaWNhdGVfKG1hdGhlbWF0aWNhbF9sb2dpYykpLAorICAgIHdoaWNoIGlzIGRlc2NyaWJlZCBhcyAiYSBwcm9wZXJ0eSB0aGF0IHRoZSBlbGVtZW50cyBvZiBhIHNldCBoYXZlIGluIGNvbW1vbi4iCisKKyAgICBTbGljZVByZWRpY2F0ZSdzIGluIENhc3NhbmRyYSBhcmUgZGVzY3JpYmVkIHdpdGggZWl0aGVyIGEgbGlzdCBvZiBjb2x1bW5fbmFtZXMgb3IgYSBTbGljZVJhbmdlLiAgSWYgY29sdW1uX25hbWVzIGlzCisgICAgc3BlY2lmaWVkLCBzbGljZV9yYW5nZSBpcyBpZ25vcmVkLgorCisgICAgQHBhcmFtIGNvbHVtbl9uYW1lLiBBIGxpc3Qgb2YgY29sdW1uIG5hbWVzIHRvIHJldHJpZXZlLiBUaGlzIGNhbiBiZSB1c2VkIHNpbWlsYXIgdG8gTWVtY2FjaGVkJ3MgIm11bHRpLWdldCIgZmVhdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgdG8gZmV0Y2ggTiBrbm93biBjb2x1bW4gbmFtZXMuIEZvciBpbnN0YW5jZSwgaWYgeW91IGtub3cgeW91IHdpc2ggdG8gZmV0Y2ggY29sdW1ucyAnSm9lJywgJ0phY2snLAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kICdKaW0nIHlvdSBjYW4gcGFzcyB0aG9zZSBjb2x1bW4gbmFtZXMgYXMgYSBsaXN0IHRvIGZldGNoIGFsbCB0aHJlZSBhdCBvbmNlLgorICAgIEBwYXJhbSBzbGljZV9yYW5nZS4gQSBTbGljZVJhbmdlIGRlc2NyaWJpbmcgaG93IHRvIHJhbmdlLCBvcmRlciwgYW5kL29yIGxpbWl0IHRoZSBzbGljZS4KKyAqLworc3RydWN0IFNsaWNlUHJlZGljYXRlIHsKKyAgICAxOiBvcHRpb25hbCBsaXN0PGJpbmFyeT4gY29sdW1uX25hbWVzLAorICAgIDI6IG9wdGlvbmFsIFNsaWNlUmFuZ2UgICBzbGljZV9yYW5nZSwKK30KKworZW51bSBJbmRleE9wZXJhdG9yIHsKKyAgICBFUSwKKyAgICBHVEUsCisgICAgR1QsCisgICAgTFRFLAorICAgIExUCit9CisKK3N0cnVjdCBJbmRleEV4cHJlc3Npb24geworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBjb2x1bW5fbmFtZSwKKyAgICAyOiByZXF1aXJlZCBJbmRleE9wZXJhdG9yIG9wLAorICAgIDM6IHJlcXVpcmVkIGJpbmFyeSB2YWx1ZSwKK30KKworc3RydWN0IEluZGV4Q2xhdXNlIHsKKyAgICAxOiByZXF1aXJlZCBsaXN0PEluZGV4RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMKKyAgICAyOiByZXF1aXJlZCBiaW5hcnkgc3RhcnRfa2V5LAorICAgIDM6IHJlcXVpcmVkIGkzMiBjb3VudD0xMDAsCit9CisKKy8qKgorVGhlIHNlbWFudGljcyBvZiBzdGFydCBrZXlzIGFuZCB0b2tlbnMgYXJlIHNsaWdodGx5IGRpZmZlcmVudC4KK0tleXMgYXJlIHN0YXJ0LWluY2x1c2l2ZTsgdG9rZW5zIGFyZSBzdGFydC1leGNsdXNpdmUuICBUb2tlbgorcmFuZ2VzIG1heSBhbHNvIHdyYXAgLS0gdGhhdCBpcywgdGhlIGVuZCB0b2tlbiBtYXkgYmUgbGVzcwordGhhbiB0aGUgc3RhcnQgb25lLiAgVGh1cywgYSByYW5nZSBmcm9tIGtleVggdG8ga2V5WCBpcyBhCitvbmUtZWxlbWVudCByYW5nZSwgYnV0IGEgcmFuZ2UgZnJvbSB0b2tlblkgdG8gdG9rZW5ZIGlzIHRoZQorZnVsbCByaW5nLgorKi8KK3N0cnVjdCBLZXlSYW5nZSB7CisgICAgMTogb3B0aW9uYWwgYmluYXJ5IHN0YXJ0X2tleSwKKyAgICAyOiBvcHRpb25hbCBiaW5hcnkgZW5kX2tleSwKKyAgICAzOiBvcHRpb25hbCBzdHJpbmcgc3RhcnRfdG9rZW4sCisgICAgNDogb3B0aW9uYWwgc3RyaW5nIGVuZF90b2tlbiwKKyAgICA1OiByZXF1aXJlZCBpMzIgY291bnQ9MTAwCit9CisKKy8qKgorICAgIEEgS2V5U2xpY2UgaXMga2V5IGZvbGxvd2VkIGJ5IHRoZSBkYXRhIGl0IG1hcHMgdG8uIEEgY29sbGVjdGlvbiBvZiBLZXlTbGljZSBpcyByZXR1cm5lZCBieSB0aGUgZ2V0X3JhbmdlX3NsaWNlIG9wZXJhdGlvbi4KKworICAgIEBwYXJhbSBrZXkuIGEgcm93IGtleQorICAgIEBwYXJhbSBjb2x1bW5zLiBMaXN0IG9mIGRhdGEgcmVwcmVzZW50ZWQgYnkgdGhlIGtleS4gVHlwaWNhbGx5LCB0aGUgbGlzdCBpcyBwYXJlZCBkb3duIHRvIG9ubHkgdGhlIGNvbHVtbnMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgIGEgU2xpY2VQcmVkaWNhdGUuCisgKi8KK3N0cnVjdCBLZXlTbGljZSB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAyOiByZXF1aXJlZCBsaXN0PENvbHVtbk9yU3VwZXJDb2x1bW4+IGNvbHVtbnMsCit9CisKK3N0cnVjdCBLZXlDb3VudCB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAyOiByZXF1aXJlZCBpMzIgY291bnQKK30KKworLyoqCisgKiBOb3RlIHRoYXQgdGhlIHRpbWVzdGFtcCBpcyBvbmx5IG9wdGlvbmFsIGluIGNhc2Ugb2YgY291bnRlciBkZWxldGlvbi4KKyAqLworc3RydWN0IERlbGV0aW9uIHsKKyAgICAxOiBvcHRpb25hbCBpNjQgdGltZXN0YW1wLAorICAgIDI6IG9wdGlvbmFsIGJpbmFyeSBzdXBlcl9jb2x1bW4sCisgICAgMzogb3B0aW9uYWwgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLAorfQorCisvKioKKyAgICBBIE11dGF0aW9uIGlzIGVpdGhlciBhbiBpbnNlcnQgKHJlcHJlc2VudGVkIGJ5IGZpbGxpbmcgY29sdW1uX29yX3N1cGVyY29sdW1uKSBvciBhIGRlbGV0aW9uIChyZXByZXNlbnRlZCBieSBmaWxsaW5nIHRoZSBkZWxldGlvbiBhdHRyaWJ1dGUpLgorICAgIEBwYXJhbSBjb2x1bW5fb3Jfc3VwZXJjb2x1bW4uIEFuIGluc2VydCB0byBhIGNvbHVtbiBvciBzdXBlcmNvbHVtbiAocG9zc2libHkgY291bnRlciBjb2x1bW4gb3Igc3VwZXJjb2x1bW4pCisgICAgQHBhcmFtIGRlbGV0aW9uLiBBIGRlbGV0aW9uIG9mIGEgY29sdW1uIG9yIHN1cGVyY29sdW1uCisqLworc3RydWN0IE11dGF0aW9uIHsKKyAgICAxOiBvcHRpb25hbCBDb2x1bW5PclN1cGVyQ29sdW1uIGNvbHVtbl9vcl9zdXBlcmNvbHVtbiwKKyAgICAyOiBvcHRpb25hbCBEZWxldGlvbiBkZWxldGlvbiwKK30KKworc3RydWN0IEVuZHBvaW50RGV0YWlscyB7CisgICAgMTogc3RyaW5nIGhvc3QsCisgICAgMjogc3RyaW5nIGRhdGFjZW50ZXIsCisgICAgMzogb3B0aW9uYWwgc3RyaW5nIHJhY2sKK30KKworLyoqCisgICAgQSBUb2tlblJhbmdlIGRlc2NyaWJlcyBwYXJ0IG9mIHRoZSBDYXNzYW5kcmEgcmluZywgaXQgaXMgYSBtYXBwaW5nIGZyb20gYSByYW5nZSB0bworICAgIGVuZHBvaW50cyByZXNwb25zaWJsZSBmb3IgdGhhdCByYW5nZS4KKyAgICBAcGFyYW0gc3RhcnRfdG9rZW4gVGhlIGZpcnN0IHRva2VuIGluIHRoZSByYW5nZQorICAgIEBwYXJhbSBlbmRfdG9rZW4gVGhlIGxhc3QgdG9rZW4gaW4gdGhlIHJhbmdlCisgICAgQHBhcmFtIGVuZHBvaW50cyBUaGUgZW5kcG9pbnRzIHJlc3BvbnNpYmxlIGZvciB0aGUgcmFuZ2UgKGxpc3RlZCBieSB0aGVpciBjb25maWd1cmVkIGxpc3Rlbl9hZGRyZXNzKQorICAgIEBwYXJhbSBycGNfZW5kcG9pbnRzIFRoZSBlbmRwb2ludHMgcmVzcG9uc2libGUgZm9yIHRoZSByYW5nZSAobGlzdGVkIGJ5IHRoZWlyIGNvbmZpZ3VyZWQgcnBjX2FkZHJlc3MpCisqLworc3RydWN0IFRva2VuUmFuZ2UgeworICAgIDE6IHJlcXVpcmVkIHN0cmluZyBzdGFydF90b2tlbiwKKyAgICAyOiByZXF1aXJlZCBzdHJpbmcgZW5kX3Rva2VuLAorICAgIDM6IHJlcXVpcmVkIGxpc3Q8c3RyaW5nPiBlbmRwb2ludHMsCisgICAgNDogb3B0aW9uYWwgbGlzdDxzdHJpbmc+IHJwY19lbmRwb2ludHMKKyAgICA1OiBvcHRpb25hbCBsaXN0PEVuZHBvaW50RGV0YWlscz4gZW5kcG9pbnRfZGV0YWlscywKK30KKworLyoqCisgICAgQXV0aGVudGljYXRpb24gcmVxdWVzdHMgY2FuIGNvbnRhaW4gYW55IGRhdGEsIGRlcGVuZGVudCBvbiB0aGUgSUF1dGhlbnRpY2F0b3IgdXNlZAorKi8KK3N0cnVjdCBBdXRoZW50aWNhdGlvblJlcXVlc3QgeworICAgIDE6IHJlcXVpcmVkIG1hcDxzdHJpbmcsIHN0cmluZz4gY3JlZGVudGlhbHMKK30KKworZW51bSBJbmRleFR5cGUgeworICAgIEtFWVMsCisgICAgQ1VTVE9NCit9CisKKy8qIGRlc2NyaWJlcyBhIGNvbHVtbiBpbiBhIGNvbHVtbiBmYW1pbHkuICovCitzdHJ1Y3QgQ29sdW1uRGVmIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkgbmFtZSwKKyAgICAyOiByZXF1aXJlZCBzdHJpbmcgdmFsaWRhdGlvbl9jbGFzcywKKyAgICAzOiBvcHRpb25hbCBJbmRleFR5cGUgaW5kZXhfdHlwZSwKKyAgICA0OiBvcHRpb25hbCBzdHJpbmcgaW5kZXhfbmFtZSwKKyAgICA1OiBvcHRpb25hbCBtYXA8c3RyaW5nLHN0cmluZz4gaW5kZXhfb3B0aW9ucworfQorCisKKy8qIGRlc2NyaWJlcyBhIGNvbHVtbiBmYW1pbHkuICovCitzdHJ1Y3QgQ2ZEZWYgeworICAgIDE6IHJlcXVpcmVkIHN0cmluZyBrZXlzcGFjZSwKKyAgICAyOiByZXF1aXJlZCBzdHJpbmcgbmFtZSwKKyAgICAzOiBvcHRpb25hbCBzdHJpbmcgY29sdW1uX3R5cGU9IlN0YW5kYXJkIiwKKyAgICA1OiBvcHRpb25hbCBzdHJpbmcgY29tcGFyYXRvcl90eXBlPSJCeXRlc1R5cGUiLAorICAgIDY6IG9wdGlvbmFsIHN0cmluZyBzdWJjb21wYXJhdG9yX3R5cGUsCisgICAgODogb3B0aW9uYWwgc3RyaW5nIGNvbW1lbnQsCisgICAgMTI6IG9wdGlvbmFsIGRvdWJsZSByZWFkX3JlcGFpcl9jaGFuY2U9MS4wLAorICAgIDEzOiBvcHRpb25hbCBsaXN0PENvbHVtbkRlZj4gY29sdW1uX21ldGFkYXRhLAorICAgIDE0OiBvcHRpb25hbCBpMzIgZ2NfZ3JhY2Vfc2Vjb25kcywKKyAgICAxNTogb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsaWRhdGlvbl9jbGFzcywKKyAgICAxNjogb3B0aW9uYWwgaTMyIGlkLAorICAgIDE3OiBvcHRpb25hbCBpMzIgbWluX2NvbXBhY3Rpb25fdGhyZXNob2xkLAorICAgIDE4OiBvcHRpb25hbCBpMzIgbWF4X2NvbXBhY3Rpb25fdGhyZXNob2xkLAorICAgIDI0OiBvcHRpb25hbCBib29sIHJlcGxpY2F0ZV9vbl93cml0ZSwKKyAgICAyNTogb3B0aW9uYWwgZG91YmxlIG1lcmdlX3NoYXJkc19jaGFuY2UsCisgICAgMjY6IG9wdGlvbmFsIHN0cmluZyBrZXlfdmFsaWRhdGlvbl9jbGFzcywKKyAgICAyODogb3B0aW9uYWwgYmluYXJ5IGtleV9hbGlhcywKKyAgICAyOTogb3B0aW9uYWwgc3RyaW5nIGNvbXBhY3Rpb25fc3RyYXRlZ3ksCisgICAgMzA6IG9wdGlvbmFsIG1hcDxzdHJpbmcsc3RyaW5nPiBjb21wYWN0aW9uX3N0cmF0ZWd5X29wdGlvbnMsCisgICAgMzI6IG9wdGlvbmFsIG1hcDxzdHJpbmcsc3RyaW5nPiBjb21wcmVzc2lvbl9vcHRpb25zLAorICAgIDMzOiBvcHRpb25hbCBkb3VibGUgYmxvb21fZmlsdGVyX2ZwX2NoYW5jZSwKK30KKworLyogZGVzY3JpYmVzIGEga2V5c3BhY2UuICovCitzdHJ1Y3QgS3NEZWYgeworICAgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyBzdHJhdGVneV9jbGFzcywKKyAgICAzOiBvcHRpb25hbCBtYXA8c3RyaW5nLHN0cmluZz4gc3RyYXRlZ3lfb3B0aW9ucywKKworICAgIC8qKiBAZGVwcmVjYXRlZCAqLworICAgIDQ6IG9wdGlvbmFsIGkzMiByZXBsaWNhdGlvbl9mYWN0b3IsIAorCisgICAgNTogcmVxdWlyZWQgbGlzdDxDZkRlZj4gY2ZfZGVmcywKKyAgICA2OiBvcHRpb25hbCBib29sIGR1cmFibGVfd3JpdGVzPTEsCit9CisKKy8qKiBDUUwgcXVlcnkgY29tcHJlc3Npb24gKi8KK2VudW0gQ29tcHJlc3Npb24geworICAgIEdaSVAgPSAxLAorICAgIE5PTkUgPSAyCit9CisKK2VudW0gQ3FsUmVzdWx0VHlwZSB7CisgICAgUk9XUyA9IDEsCisgICAgVk9JRCA9IDIsCisgICAgSU5UID0gMworfQorCisvKiogUm93IHJldHVybmVkIGZyb20gYSBDUUwgcXVlcnkgKi8KK3N0cnVjdCBDcWxSb3cgeworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgMjogcmVxdWlyZWQgbGlzdDxDb2x1bW4+IGNvbHVtbnMKK30KKworc3RydWN0IENxbE1ldGFkYXRhIHsKKyAgICAxOiByZXF1aXJlZCBtYXA8YmluYXJ5LHN0cmluZz4gbmFtZV90eXBlcywKKyAgICAyOiByZXF1aXJlZCBtYXA8YmluYXJ5LHN0cmluZz4gdmFsdWVfdHlwZXMsCisgICAgMzogcmVxdWlyZWQgc3RyaW5nIGRlZmF1bHRfbmFtZV90eXBlLAorICAgIDQ6IHJlcXVpcmVkIHN0cmluZyBkZWZhdWx0X3ZhbHVlX3R5cGUKK30KKworc3RydWN0IENxbFJlc3VsdCB7CisgICAgMTogcmVxdWlyZWQgQ3FsUmVzdWx0VHlwZSB0eXBlLAorICAgIDI6IG9wdGlvbmFsIGxpc3Q8Q3FsUm93PiByb3dzLAorICAgIDM6IG9wdGlvbmFsIGkzMiBudW0sCisgICAgNDogb3B0aW9uYWwgQ3FsTWV0YWRhdGEgc2NoZW1hCit9CisKK3N0cnVjdCBDcWxQcmVwYXJlZFJlc3VsdCB7CisgICAgMTogcmVxdWlyZWQgaTMyIGl0ZW1JZCwKKyAgICAyOiByZXF1aXJlZCBpMzIgY291bnQKK30KKworCitzZXJ2aWNlIENhc3NhbmRyYSB7CisgICMgYXV0aCBtZXRob2RzCisgIHZvaWQgbG9naW4oMTogcmVxdWlyZWQgQXV0aGVudGljYXRpb25SZXF1ZXN0IGF1dGhfcmVxdWVzdCkgdGhyb3dzICgxOkF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIGF1dGhueCwgMjpBdXRob3JpemF0aW9uRXhjZXB0aW9uIGF1dGh6eCksCisgCisgICMgc2V0IGtleXNwYWNlCisgIHZvaWQgc2V0X2tleXNwYWNlKDE6IHJlcXVpcmVkIHN0cmluZyBrZXlzcGFjZSkgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisgIAorICAjIHJldHJpZXZhbCBtZXRob2RzCisKKyAgLyoqCisgICAgR2V0IHRoZSBDb2x1bW4gb3IgU3VwZXJDb2x1bW4gYXQgdGhlIGdpdmVuIGNvbHVtbl9wYXRoLiBJZiBubyB2YWx1ZSBpcyBwcmVzZW50LCBOb3RGb3VuZEV4Y2VwdGlvbiBpcyB0aHJvd24uIChUaGlzIGlzCisgICAgdGhlIG9ubHkgbWV0aG9kIHRoYXQgY2FuIHRocm93IGFuIGV4Y2VwdGlvbiB1bmRlciBub24tZmFpbHVyZSBjb25kaXRpb25zLikKKyAgICovCisgIENvbHVtbk9yU3VwZXJDb2x1bW4gZ2V0KDE6cmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXRoIGNvbHVtbl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpOb3RGb3VuZEV4Y2VwdGlvbiBuZmUsIDM6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDQ6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgIEdldCB0aGUgZ3JvdXAgb2YgY29sdW1ucyBjb250YWluZWQgYnkgY29sdW1uX3BhcmVudCAoZWl0aGVyIGEgQ29sdW1uRmFtaWx5IG5hbWUgb3IgYSBDb2x1bW5GYW1pbHkvU3VwZXJDb2x1bW4gbmFtZQorICAgIHBhaXIpIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gU2xpY2VQcmVkaWNhdGUuIElmIG5vIG1hdGNoaW5nIHZhbHVlcyBhcmUgZm91bmQsIGFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQuCisgICAqLworICBsaXN0PENvbHVtbk9yU3VwZXJDb2x1bW4+IGdldF9zbGljZSgxOnJlcXVpcmVkIGJpbmFyeSBrZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgbWF0Y2hpbmcgPGNvZGU+cHJlZGljYXRlPC9jb2RlPiBmb3IgYSBwYXJ0aWN1bGFyIDxjb2RlPmtleTwvY29kZT4sIAorICAgIDxjb2RlPkNvbHVtbkZhbWlseTwvY29kZT4gYW5kIG9wdGlvbmFsbHkgPGNvZGU+U3VwZXJDb2x1bW48L2NvZGU+LgorICAqLworICBpMzIgZ2V0X2NvdW50KDE6cmVxdWlyZWQgYmluYXJ5IGtleSwgCisgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwgCisgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgUGVyZm9ybXMgYSBnZXRfc2xpY2UgZm9yIGNvbHVtbl9wYXJlbnQgYW5kIHByZWRpY2F0ZSBmb3IgdGhlIGdpdmVuIGtleXMgaW4gcGFyYWxsZWwuCisgICovCisgIG1hcDxiaW5hcnksbGlzdDxDb2x1bW5PclN1cGVyQ29sdW1uPj4gbXVsdGlnZXRfc2xpY2UoMTpyZXF1aXJlZCBsaXN0PGJpbmFyeT4ga2V5cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICBQZXJmb3JtIGEgZ2V0X2NvdW50IGluIHBhcmFsbGVsIG9uIHRoZSBnaXZlbiBsaXN0PGJpbmFyeT4ga2V5cy4gVGhlIHJldHVybiB2YWx1ZSBtYXBzIGtleXMgdG8gdGhlIGNvdW50IGZvdW5kLgorICAqLworICBtYXA8YmluYXJ5LCBpMzI+IG11bHRpZ2V0X2NvdW50KDE6cmVxdWlyZWQgbGlzdDxiaW5hcnk+IGtleXMsCisgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwKKyAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgIHJldHVybnMgYSBzdWJzZXQgb2YgY29sdW1ucyBmb3IgYSBjb250aWd1b3VzIHJhbmdlIG9mIGtleXMuCisgICovCisgIGxpc3Q8S2V5U2xpY2U+IGdldF9yYW5nZV9zbGljZXMoMTpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBLZXlSYW5nZSByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKiBSZXR1cm5zIHRoZSBzdWJzZXQgb2YgY29sdW1ucyBzcGVjaWZpZWQgaW4gU2xpY2VQcmVkaWNhdGUgZm9yIHRoZSByb3dzIG1hdGNoaW5nIHRoZSBJbmRleENsYXVzZSAqLworICBsaXN0PEtleVNsaWNlPiBnZXRfaW5kZXhlZF9zbGljZXMoMTpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgSW5kZXhDbGF1c2UgaW5kZXhfY2xhdXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBTbGljZVByZWRpY2F0ZSBjb2x1bW5fcHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAjIG1vZGlmaWNhdGlvbiBtZXRob2RzCisKKyAgLyoqCisgICAqIEluc2VydCBhIENvbHVtbiBhdCB0aGUgZ2l2ZW4gY29sdW1uX3BhcmVudC5jb2x1bW5fZmFtaWx5IGFuZCBvcHRpb25hbCBjb2x1bW5fcGFyZW50LnN1cGVyX2NvbHVtbi4KKyAgICovCisgIHZvaWQgaW5zZXJ0KDE6cmVxdWlyZWQgYmluYXJ5IGtleSwgCisgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsCisgICAgICAgICAgICAgIDM6cmVxdWlyZWQgQ29sdW1uIGNvbHVtbiwKKyAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgKiBJbmNyZW1lbnQgb3IgZGVjcmVtZW50IGEgY291bnRlci4KKyAgICovCisgIHZvaWQgYWRkKDE6cmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwKKyAgICAgICAgICAgMzpyZXF1aXJlZCBDb3VudGVyQ29sdW1uIGNvbHVtbiwKKyAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgIFJlbW92ZSBkYXRhIGZyb20gdGhlIHJvdyBzcGVjaWZpZWQgYnkga2V5IGF0IHRoZSBncmFudWxhcml0eSBzcGVjaWZpZWQgYnkgY29sdW1uX3BhdGgsIGFuZCB0aGUgZ2l2ZW4gdGltZXN0YW1wLiBOb3RlCisgICAgdGhhdCBhbGwgdGhlIHZhbHVlcyBpbiBjb2x1bW5fcGF0aCBiZXNpZGVzIGNvbHVtbl9wYXRoLmNvbHVtbl9mYW1pbHkgYXJlIHRydWx5IG9wdGlvbmFsOiB5b3UgY2FuIHJlbW92ZSB0aGUgZW50aXJlCisgICAgcm93IGJ5IGp1c3Qgc3BlY2lmeWluZyB0aGUgQ29sdW1uRmFtaWx5LCBvciB5b3UgY2FuIHJlbW92ZSBhIFN1cGVyQ29sdW1uIG9yIGEgc2luZ2xlIENvbHVtbiBieSBzcGVjaWZ5aW5nIHRob3NlIGxldmVscyB0b28uCisgICAqLworICB2b2lkIHJlbW92ZSgxOnJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGF0aCBjb2x1bW5fcGF0aCwKKyAgICAgICAgICAgICAgMzpyZXF1aXJlZCBpNjQgdGltZXN0YW1wLAorICAgICAgICAgICAgICA0OkNvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAqIFJlbW92ZSBhIGNvdW50ZXIgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KKyAgICogTm90ZSB0aGF0IGNvdW50ZXJzIGhhdmUgbGltaXRlZCBzdXBwb3J0IGZvciBkZWxldGVzOiBpZiB5b3UgcmVtb3ZlIGEgY291bnRlciwgeW91IG11c3Qgd2FpdCB0byBpc3N1ZSBhbnkgZm9sbG93aW5nIHVwZGF0ZQorICAgKiB1bnRpbCB0aGUgZGVsZXRlIGhhcyByZWFjaGVkIGFsbCB0aGUgbm9kZXMgYW5kIGFsbCBvZiB0aGVtIGhhdmUgYmVlbiBmdWxseSBjb21wYWN0ZWQuCisgICAqLworICB2b2lkIHJlbW92ZV9jb3VudGVyKDE6cmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhdGggcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworCisgIC8qKgorICAgIE11dGF0ZSBtYW55IGNvbHVtbnMgb3Igc3VwZXIgY29sdW1ucyBmb3IgbWFueSByb3cga2V5cy4gU2VlIGFsc286IE11dGF0aW9uLgorCisgICAgbXV0YXRpb25fbWFwIG1hcHMga2V5IHRvIGNvbHVtbiBmYW1pbHkgdG8gYSBsaXN0IG9mIE11dGF0aW9uIG9iamVjdHMgdG8gdGFrZSBwbGFjZSBhdCB0aGF0IHNjb3BlLgorICAqKi8KKyAgdm9pZCBiYXRjaF9tdXRhdGUoMTpyZXF1aXJlZCBtYXA8YmluYXJ5LCBtYXA8c3RyaW5nLCBsaXN0PE11dGF0aW9uPj4+IG11dGF0aW9uX21hcCwKKyAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorICAgICAgIAorICAvKioKKyAgIFRydW5jYXRlIHdpbGwgbWFyayBhbmQgZW50aXJlIGNvbHVtbiBmYW1pbHkgYXMgZGVsZXRlZC4KKyAgIEZyb20gdGhlIHVzZXIncyBwZXJzcGVjdGl2ZSBhIHN1Y2Nlc3NmdWwgY2FsbCB0byB0cnVuY2F0ZSB3aWxsIHJlc3VsdCBjb21wbGV0ZSBkYXRhIGRlbGV0aW9uIGZyb20gY2ZuYW1lLgorICAgSW50ZXJuYWxseSwgaG93ZXZlciwgZGlzayBzcGFjZSB3aWxsIG5vdCBiZSBpbW1lZGlhdGlseSByZWxlYXNlZCwgYXMgd2l0aCBhbGwgZGVsZXRlcyBpbiBjYXNzYW5kcmEsIHRoaXMgb25lCisgICBvbmx5IG1hcmtzIHRoZSBkYXRhIGFzIGRlbGV0ZWQuCisgICBUaGUgb3BlcmF0aW9uIHN1Y2NlZWRzIG9ubHkgaWYgYWxsIGhvc3RzIGluIHRoZSBjbHVzdGVyIGF0IGF2YWlsYWJsZSBhbmQgd2lsbCB0aHJvdyBhbiBVbmF2YWlsYWJsZUV4Y2VwdGlvbiBpZiAKKyAgIHNvbWUgaG9zdHMgYXJlIGRvd24uCisgICovCisgIHZvaWQgdHJ1bmNhdGUoMTpyZXF1aXJlZCBzdHJpbmcgY2ZuYW1lKQorICAgICAgIHRocm93cyAoMTogSW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOiBVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzogVGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisKKyAgICAKKyAgLy8gTWV0YS1BUElzIC0tIEFQSXMgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBub2RlIG9yIGNsdXN0ZXIsCisgIC8vIHJhdGhlciB0aGFuIHVzZXIgZGF0YS4gIFRoZSBub2RlcHJvYmUgcHJvZ3JhbSBwcm92aWRlcyB1c2FnZSBleGFtcGxlcy4KKyAgCisgIC8qKiAKKyAgICogZm9yIGVhY2ggc2NoZW1hIHZlcnNpb24gcHJlc2VudCBpbiB0aGUgY2x1c3RlciwgcmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgYXQgdGhhdCB2ZXJzaW9uLgorICAgKiBob3N0cyB0aGF0IGRvIG5vdCByZXNwb25kIHdpbGwgYmUgdW5kZXIgdGhlIGtleSBEYXRhYmFzZURlc2NyaXB0b3IuSU5JVElBTF9WRVJTSU9OLiAKKyAgICogdGhlIGNsdXN0ZXIgaXMgYWxsIG9uIHRoZSBzYW1lIHZlcnNpb24gaWYgdGhlIHNpemUgb2YgdGhlIG1hcCBpcyAxLiAKKyAgICovCisgIG1hcDxzdHJpbmcsIGxpc3Q8c3RyaW5nPj4gZGVzY3JpYmVfc2NoZW1hX3ZlcnNpb25zKCkKKyAgICAgICB0aHJvd3MgKDE6IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIGxpc3QgdGhlIGRlZmluZWQga2V5c3BhY2VzIGluIHRoaXMgY2x1c3RlciAqLworICBsaXN0PEtzRGVmPiBkZXNjcmliZV9rZXlzcGFjZXMoKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiBnZXQgdGhlIGNsdXN0ZXIgbmFtZSAqLworICBzdHJpbmcgZGVzY3JpYmVfY2x1c3Rlcl9uYW1lKCksCisKKyAgLyoqIGdldCB0aGUgdGhyaWZ0IGFwaSB2ZXJzaW9uICovCisgIHN0cmluZyBkZXNjcmliZV92ZXJzaW9uKCksCisKKyAgLyoqIGdldCB0aGUgdG9rZW4gcmluZzogYSBtYXAgb2YgcmFuZ2VzIHRvIGhvc3QgYWRkcmVzc2VzLAorICAgICAgcmVwcmVzZW50ZWQgYXMgYSBzZXQgb2YgVG9rZW5SYW5nZSBpbnN0ZWFkIG9mIGEgbWFwIGZyb20gcmFuZ2UKKyAgICAgIHRvIGxpc3Qgb2YgZW5kcG9pbnRzLCBiZWNhdXNlIHlvdSBjYW4ndCB1c2UgVGhyaWZ0IHN0cnVjdHMgYXMKKyAgICAgIG1hcCBrZXlzOgorICAgICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTYyIAorCisgICAgICBmb3IgdGhlIHNhbWUgcmVhc29uLCB3ZSBjYW4ndCByZXR1cm4gYSBzZXQgaGVyZSwgZXZlbiB0aG91Z2gKKyAgICAgIG9yZGVyIGlzIG5laXRoZXIgaW1wb3J0YW50IG5vciBwcmVkaWN0YWJsZS4gKi8KKyAgbGlzdDxUb2tlblJhbmdlPiBkZXNjcmliZV9yaW5nKDE6cmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlKQorICAgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiByZXR1cm5zIHRoZSBwYXJ0aXRpb25lciB1c2VkIGJ5IHRoaXMgY2x1c3RlciAqLworICBzdHJpbmcgZGVzY3JpYmVfcGFydGl0aW9uZXIoKSwKKworICAvKiogcmV0dXJucyB0aGUgc25pdGNoIHVzZWQgYnkgdGhpcyBjbHVzdGVyICovCisgIHN0cmluZyBkZXNjcmliZV9zbml0Y2goKSwKKworICAvKiogZGVzY3JpYmUgc3BlY2lmaWVkIGtleXNwYWNlICovCisgIEtzRGVmIGRlc2NyaWJlX2tleXNwYWNlKDE6cmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlKQorICAgIHRocm93cyAoMTpOb3RGb3VuZEV4Y2VwdGlvbiBuZmUsIDI6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKworICAvKiogZXhwZXJpbWVudGFsIEFQSSBmb3IgaGFkb29wL3BhcmFsbGVsIHF1ZXJ5IHN1cHBvcnQuICAKKyAgICAgIG1heSBjaGFuZ2UgdmlvbGVudGx5IGFuZCB3aXRob3V0IHdhcm5pbmcuIAorCisgICAgICByZXR1cm5zIGxpc3Qgb2YgdG9rZW4gc3RyaW5ncyBzdWNoIHRoYXQgZmlyc3Qgc3VicmFuZ2UgaXMgKGxpc3RbMF0sIGxpc3RbMV1dLAorICAgICAgbmV4dCBpcyAobGlzdFsxXSwgbGlzdFsyXV0sIGV0Yy4gKi8KKyAgbGlzdDxzdHJpbmc+IGRlc2NyaWJlX3NwbGl0cygxOnJlcXVpcmVkIHN0cmluZyBjZk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBzdHJpbmcgc3RhcnRfdG9rZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgc3RyaW5nIGVuZF90b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIGkzMiBrZXlzX3Blcl9zcGxpdCkKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKworICAvKiogYWRkcyBhIGNvbHVtbiBmYW1pbHkuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fYWRkX2NvbHVtbl9mYW1pbHkoMTpyZXF1aXJlZCBDZkRlZiBjZl9kZWYpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKSwKKyAgICAKKyAgLyoqIGRyb3BzIGEgY29sdW1uIGZhbWlseS4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV9kcm9wX2NvbHVtbl9mYW1pbHkoMTpyZXF1aXJlZCBzdHJpbmcgY29sdW1uX2ZhbWlseSkKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLCAKKyAgCisgIC8qKiBhZGRzIGEga2V5c3BhY2UgYW5kIGFueSBjb2x1bW4gZmFtaWxpZXMgdGhhdCBhcmUgcGFydCBvZiBpdC4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV9hZGRfa2V5c3BhY2UoMTpyZXF1aXJlZCBLc0RlZiBrc19kZWYpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKSwKKyAgCisgIC8qKiBkcm9wcyBhIGtleXNwYWNlIGFuZCBhbnkgY29sdW1uIGZhbWlsaWVzIHRoYXQgYXJlIHBhcnQgb2YgaXQuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fZHJvcF9rZXlzcGFjZSgxOnJlcXVpcmVkIHN0cmluZyBrZXlzcGFjZSkKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAKKyAgLyoqIHVwZGF0ZXMgcHJvcGVydGllcyBvZiBhIGtleXNwYWNlLiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX3VwZGF0ZV9rZXlzcGFjZSgxOnJlcXVpcmVkIEtzRGVmIGtzX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAgICAgICAKKyAgLyoqIHVwZGF0ZXMgcHJvcGVydGllcyBvZiBhIGNvbHVtbiBmYW1pbHkuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fdXBkYXRlX2NvbHVtbl9mYW1pbHkoMTpyZXF1aXJlZCBDZkRlZiBjZl9kZWYpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKSwKKyAgCisgIC8qKgorICAgKiBFeGVjdXRlcyBhIENRTCAoQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlKSBzdGF0ZW1lbnQgYW5kIHJldHVybnMgYQorICAgKiBDcWxSZXN1bHQgY29udGFpbmluZyB0aGUgcmVzdWx0cy4KKyAgICovCisgIENxbFJlc3VsdCBleGVjdXRlX2NxbF9xdWVyeSgxOnJlcXVpcmVkIGJpbmFyeSBxdWVyeSwgMjpyZXF1aXJlZCBDb21wcmVzc2lvbiBjb21wcmVzc2lvbikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLAorICAgICAgICAgICAgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwKKyAgICAgICAgICAgIDM6VGltZWRPdXRFeGNlcHRpb24gdGUsCisgICAgICAgICAgICA0OlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAvKioKKyAgICogUHJlcGFyZSBhIENRTCAoQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlKSBzdGF0ZW1lbnQgYnkgY29tcGlsaW5nIGFuZCByZXR1cm5pbmcKKyAgICogLSB0aGUgdHlwZSBvZiBDUUwgc3RhdGVtZW50CisgICAqIC0gYW4gaWQgdG9rZW4gb2YgdGhlIGNvbXBpbGVkIENRTCBzdG9yZWQgb24gdGhlIHNlcnZlciBzaWRlLgorICAgKiAtIGEgY291bnQgb2YgdGhlIGRpc2NvdmVyZWQgYm91bmQgbWFya2VycyBpbiB0aGUgc3RhdGVtZW50IAorICAgKi8KKyAgQ3FsUHJlcGFyZWRSZXN1bHQgcHJlcGFyZV9jcWxfcXVlcnkoMTpyZXF1aXJlZCBiaW5hcnkgcXVlcnksIDI6cmVxdWlyZWQgQ29tcHJlc3Npb24gY29tcHJlc3Npb24pCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSkKKworICAgICAgICAgICAgIAorICAvKioKKyAgICogRXhlY3V0ZXMgYSBwcmVwYXJlZCBDUUwgKENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSkgc3RhdGVtZW50IGJ5IHBhc3NpbmcgYW4gaWQgdG9rZW4gYW5kICBhIGxpc3Qgb2YgdmFyaWFibGVzCisgICAqIHRvIGJpbmQgYW5kIHJldHVybnMgYSBDcWxSZXN1bHQgY29udGFpbmluZyB0aGUgcmVzdWx0cy4KKyAgICovCisgIENxbFJlc3VsdCBleGVjdXRlX3ByZXBhcmVkX2NxbF9xdWVyeSgxOnJlcXVpcmVkIGkzMiBpdGVtSWQsIDI6cmVxdWlyZWQgbGlzdDxzdHJpbmc+IHZhbHVlcykKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLAorICAgICAgICAgICAgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwKKyAgICAgICAgICAgIDM6VGltZWRPdXRFeGNlcHRpb24gdGUsCisgICAgICAgICAgICA0OlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpCisgICAgICAgICAgIAorCit9CmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiNDYwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQwIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisKK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJkMGQzNzA2Yi1mZWQ1LTRjZjUtYjk4NC0wNGY0NDhkZTlkN2IiKV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy5jc3Byb2ogYi9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThmNjFhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLmNzcHJvagpAQCAtMCwwICsxLDU0IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPCEtLQorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAKKyAgCSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0czwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+VGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0czwvUGFja2FnZUlkPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLi8uLi9UaHJpZnQvVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249IjQuNS4zIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8VGFyZ2V0IE5hbWU9IlByZUJ1aWxkIiBCZWZvcmVUYXJnZXRzPSJfR2VuZXJhdGVSZXN0b3JlUHJvamVjdFNwZWM7UmVzdG9yZTtDb21waWxlIj4KKyAgICA8RXhlYyBDb25kaXRpb249IickKE9TKScgPT0gJ1dpbmRvd3NfTlQnIiBDb21tYW5kPSJ3aGVyZSB0aHJpZnQiIENvbnNvbGVUb01TQnVpbGQ9InRydWUiPgorICAgICAgPE91dHB1dCBUYXNrUGFyYW1ldGVyPSJDb25zb2xlT3V0cHV0IiBQcm9wZXJ0eU5hbWU9IlBhdGhUb1RocmlmdCIgLz4KKyAgICA8L0V4ZWM+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLWdlbiBuZXRzdGQ6d2NmLHVuaW9uLHNlcmlhbCAtciAuL0Nhc3NhbmRyYVRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1nZW4gbmV0c3RkOndjZix1bmlvbixzZXJpYWwgLXIgLi9DYXNzYW5kcmFUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0JykiIENvbW1hbmQ9IiQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIG5ldHN0ZDp3Y2YsdW5pb24sc2VyaWFsIC1yIC4vQ2Fzc2FuZHJhVGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLWdlbiBuZXRzdGQ6d2NmLHVuaW9uLHNlcmlhbCAtciAuLy4uLy4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLWdlbiBuZXRzdGQ6d2NmLHVuaW9uLHNlcmlhbCAtciAuLy4uLy4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBuZXRzdGQ6d2NmLHVuaW9uLHNlcmlhbCAtciAuLy4uLy4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLWdlbiBuZXRzdGQ6d2NmLHVuaW9uLHNlcmlhbCAtciAuLy4uLy4uLy4uLy4uL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1nZW4gbmV0c3RkOndjZix1bmlvbixzZXJpYWwgLXIgLi8uLi8uLi8uLi8uLi9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0JykiIENvbW1hbmQ9IiQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIG5ldHN0ZDp3Y2YsdW5pb24sc2VyaWFsIC1yIC4vLi4vLi4vLi4vLi4vY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQiIC8+CisgIDwvVGFyZ2V0PgorCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnNUZXN0cy5jcyBiL2xpYi9uZXRzdGQvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9uc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTk5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnNUZXN0cy5jcwpAQCAtMCwwICsxLDgzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBUaHJpZnQuVGVzdHMuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRDb2xsZWN0aW9uc1Rlc3RzCisgICAgeworICAgICAgICAvL1RPRE86IEFkZCB0ZXN0cyBmb3IgSUVudW1lcmFibGUgd2l0aCBvYmplY3RzIGFuZCBwcmltaXRpdmUgdmFsdWVzIGluc2lkZQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfUHJpbWl0aXZlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjEgPSBuZXcgTGlzdDxpbnQ+IHsxLDIsM307CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjIgPSBuZXcgTGlzdDxpbnQ+IHsxLDIsM307CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUQ29sbGVjdGlvbnMuRXF1YWxzKGNvbGxlY3Rpb24xLCBjb2xsZWN0aW9uMik7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfUHJpbWl0aXZlX0RpZmZlcmVudF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24xID0gbmV3IExpc3Q8aW50PiB7IDEsIDIsIDMgfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IG5ldyBMaXN0PGludD4geyAxLCAyIH07CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUQ29sbGVjdGlvbnMuRXF1YWxzKGNvbGxlY3Rpb24xLCBjb2xsZWN0aW9uMik7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVENvbGxlY3Rpb25fRXF1YWxzX09iamVjdHNfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMSA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRDb2xsZWN0aW9ucy5FcXVhbHMoY29sbGVjdGlvbjEsIGNvbGxlY3Rpb24yKTsKKworICAgICAgICAgICAgLy8gcmVmZXJlbmNlcyB0byBkaWZmZXJlbnQgY29sbGVjdGlvbnMKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVENvbGxlY3Rpb25fRXF1YWxzX09uZUFuZFRoZVNhbWVPYmplY3RfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMSA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IGNvbGxlY3Rpb24xOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVENvbGxlY3Rpb25zLkVxdWFscyhjb2xsZWN0aW9uMSwgY29sbGVjdGlvbjIpOworCisgICAgICAgICAgICAvLyByZWZlcmVuY2VzIHRvIG9uZSBhbmQgdGhlIHNhbWUgY29sbGVjdGlvbgorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBFeGFtcGxlQ2xhc3MKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBYIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RIYXNoU2V0VGVzdHMuY3MgYi9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9USGFzaFNldFRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZTU3M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9USGFzaFNldFRlc3RzLmNzCkBAIC0wLDAgKzEsNzEgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLkNvbGxlY3Rpb25zCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBUSGFzaFNldFRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVEhhc2hTZXRfRXF1YWxzX1ByaW1pdGl2ZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50IHZhbHVlID0gMTsKKworICAgICAgICAgICAgdmFyIGhhc2hTZXQgPSBuZXcgVEhhc2hTZXQ8aW50PiB7dmFsdWV9OworICAgICAgICAgICAgCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ29udGFpbnModmFsdWUpKTsKKworICAgICAgICAgICAgaGFzaFNldC5SZW1vdmUodmFsdWUpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ291bnQgPT0gMCk7CisKKyAgICAgICAgICAgIGhhc2hTZXQuQWRkKHZhbHVlKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShoYXNoU2V0LkNvbnRhaW5zKHZhbHVlKSk7CisKKyAgICAgICAgICAgIGhhc2hTZXQuQ2xlYXIoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShoYXNoU2V0LkNvdW50ID09IDApOworCisgICAgICAgICAgICB2YXIgbmV3QXJyID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgIGhhc2hTZXQuQWRkKHZhbHVlKTsKKyAgICAgICAgICAgIGhhc2hTZXQuQ29weVRvKG5ld0FyciwgMCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobmV3QXJyLkNvbnRhaW5zKHZhbHVlKSk7CisKKyAgICAgICAgICAgIHZhciBlbiA9IGhhc2hTZXQuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgZW4uTW92ZU5leHQoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoaW50KWVuLkN1cnJlbnQgPT0gdmFsdWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICB1c2luZyAodmFyIGllbiA9ICgoSUVudW1lcmFibGU8aW50PiloYXNoU2V0KS5HZXRFbnVtZXJhdG9yKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWVuLk1vdmVOZXh0KCk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGllbi5DdXJyZW50ID09IHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sSGVscGVyVGVzdHMuY3MgYi9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbEhlbHBlclRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMzkxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbEhlbHBlclRlc3RzLmNzCkBAIC0wLDAgKzEsMTcyIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2wuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2wuVXRpbGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLlByb3RvY29scworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRKU09OUHJvdG9jb2xIZWxwZXJUZXN0cworICAgIHsKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVOYW1lRm9yVHlwZUlkX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBzZXRzID0gbmV3IExpc3Q8VHVwbGU8VFR5cGUsIGJ5dGVbXT4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkJvb2wsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQnl0ZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJ5dGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMTYsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMTYpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMzIsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzIpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JNjQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJNjQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5Eb3VibGUsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVEb3VibGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJpbmcsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmcpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJ1Y3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJ1Y3QpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5NYXAsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVNYXApLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TZXQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5MaXN0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTGlzdCksCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZCh0Lkl0ZW0xKSA9PSB0Lkl0ZW0yLCAkIldyb25nIG1hcHBpbmcgb2YgVHlwZU5hbWUge3QuSXRlbTJ9IHRvIFRUeXBlOiB7dC5JdGVtMX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlTmFtZUZvclR5cGVJZF9UU3RvcF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChUVHlwZS5TdG9wKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlTmFtZUZvclR5cGVJZF9Ob25FeGlzdGluZ1RUeXBlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKChUVHlwZSkxMDApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVJZEZvclR5cGVOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBzZXRzID0gbmV3IExpc3Q8VHVwbGU8VFR5cGUsIGJ5dGVbXT4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkJvb2wsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQnl0ZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJ5dGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMTYsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMTYpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMzIsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzIpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JNjQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJNjQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5Eb3VibGUsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVEb3VibGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJpbmcsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmcpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJ1Y3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJ1Y3QpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5NYXAsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVNYXApLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TZXQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5MaXN0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTGlzdCksCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZSh0Lkl0ZW0yKSA9PSB0Lkl0ZW0xLCAkIldyb25nIG1hcHBpbmcgb2YgVHlwZU5hbWUge3QuSXRlbTJ9IHRvIFRUeXBlOiB7dC5JdGVtMX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlSWRGb3JUeXBlTmFtZV9UU3RvcFR5cGVOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKG5ldyBbXXsoYnl0ZSlUVHlwZS5TdG9wLCAoYnl0ZSlUVHlwZS5TdG9wfSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZUlkRm9yVHlwZU5hbWVfTm9uRXhpc3RpbmdUeXBlTmFtZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShuZXcgYnl0ZVtdezEwMH0pOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVFByb3RvY29sRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVJZEZvclR5cGVOYW1lX0VtcHR5TmFtZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShuZXcgYnl0ZVtdIHt9KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc0pzb25OdW1lcmljX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBjb3JyZWN0SnNvbk51bWVyaWMgPSAiKy0uMDEyMzQ1Njc4OUVlIjsKKyAgICAgICAgICAgIHZhciBpbmNvcnJlY3RKc29uTnVtZXJpYyA9ICJBYUJjRGQvKlxcIjsKKworICAgICAgICAgICAgdmFyIHNldHMgPSBjb3JyZWN0SnNvbk51bWVyaWMuU2VsZWN0KGNoID0+IG5ldyBUdXBsZTxieXRlLCBib29sPigoYnl0ZSkgY2gsIHRydWUpKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIHNldHMuQWRkUmFuZ2UoaW5jb3JyZWN0SnNvbk51bWVyaWMuU2VsZWN0KGNoID0+IG5ldyBUdXBsZTxieXRlLCBib29sPigoYnl0ZSkgY2gsIGZhbHNlKSkpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5Jc0pzb25OdW1lcmljKHQuSXRlbTEpID09IHQuSXRlbTIsICQiV3JvbmcgbWFwcGluZyBvZiBDaGFyIHt0Lkl0ZW0xfSB0byBib29sOiB7dC5JdGVtMn0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUb0hleFZhbF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0CisgICAgICAgICAgICB2YXIgY2hhcnMgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRIZXhWYWx1ZXMgPSBuZXcgYnl0ZVtdIHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1fTsKKworICAgICAgICAgICAgdmFyIHNldHMgPSBjaGFycy5TZWxlY3QoKGNoLCBpKSA9PiBuZXcgVHVwbGU8Y2hhciwgYnl0ZT4oY2gsIGV4cGVjdGVkSGV4VmFsdWVzW2ldKSkuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHNldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFjdHVhbFJlc3VsdCA9IFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoKGJ5dGUpdC5JdGVtMSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhY3R1YWxSZXN1bHQgPT0gdC5JdGVtMiwgJCJXcm9uZyBtYXBwaW5nIG9mIGNoYXIgYnl0ZSB7dC5JdGVtMX0gdG8gaXQgZXhwZWN0ZWQgaGV4IHZhbHVlOiB7dC5JdGVtMn0uIEFjdHVhbCBoZXggdmFsdWU6IHthY3R1YWxSZXN1bHR9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgVG9IZXhWYWxfV3JvbmdJbnB1dENoYXJfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoKGJ5dGUpJ3MnKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUb0hleENoYXJfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0L291dHB1dAorICAgICAgICAgICAgdmFyIGhleFZhbHVlcyA9IG5ldyBieXRlW10geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IH07CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRDaGFycyA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgICAgICAgICAgIAorCisgICAgICAgICAgICB2YXIgc2V0cyA9IGhleFZhbHVlcy5TZWxlY3QoKGh2LCBpKSA9PiBuZXcgVHVwbGU8Ynl0ZSwgY2hhcj4oaHYsIGV4cGVjdGVkQ2hhcnNbaV0pKS5Ub0xpc3QoKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gc2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYWN0dWFsUmVzdWx0ID0gVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleENoYXIodC5JdGVtMSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhY3R1YWxSZXN1bHQgPT0gdC5JdGVtMiwgJCJXcm9uZyBtYXBwaW5nIG9mIGhleCB2YWx1ZSB7dC5JdGVtMX0gdG8gaXQgZXhwZWN0ZWQgY2hhcjoge3QuSXRlbTJ9LiBBY3R1YWwgaGV4IHZhbHVlOiB7YWN0dWFsUmVzdWx0fSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sVGVzdHMuY3MgYi9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbFRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NGY0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbFRlc3RzLmNzCkBAIC0wLDAgKzEsNjcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgTlN1YnN0aXR1dGU7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2wuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydC5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVGVzdHMuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBUSlNPTlByb3RvY29sVGVzdHMKKyAgICB7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUSlNPTlByb3RvY29sX0Nhbl9DcmVhdGVfSW5zdGFuY2VfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBodHRwQ2xpZW50VHJhbnNwb3J0ID0gU3Vic3RpdHV0ZS5Gb3I8VEh0dHBUcmFuc3BvcnQ+KG5ldyBVcmkoImh0dHA6Ly9sb2NhbGhvc3QiKSwgbnVsbCk7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgVEpTT05Qcm90b2NvbFdyYXBwZXIoaHR0cENsaWVudFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzdWx0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzdWx0LldyYXBwZWRDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzdWx0LldyYXBwZWRSZWFkZXIpOworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChyZXN1bHQuVHJhbnNwb3J0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LldyYXBwZWRSZWN1cnNpb25EZXB0aCA9PSAwKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LldyYXBwZWRSZWN1cnNpb25MaW1pdCA9PSBUUHJvdG9jb2wuRGVmYXVsdFJlY3Vyc2lvbkRlcHRoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuVHJhbnNwb3J0LkVxdWFscyhodHRwQ2xpZW50VHJhbnNwb3J0KSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkQ29udGV4dC5HZXRUeXBlKCkuTmFtZS5FcXVhbHMoIkpTT05CYXNlQ29udGV4dCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LldyYXBwZWRSZWFkZXIuR2V0VHlwZSgpLk5hbWUuRXF1YWxzKCJMb29rYWhlYWRSZWFkZXIiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIFRKU09OUHJvdG9jb2xXcmFwcGVyIDogVEpzb25Qcm90b2NvbAorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVEpTT05Qcm90b2NvbFdyYXBwZXIoVFRyYW5zcG9ydCB0cmFucykgOiBiYXNlKHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IFdyYXBwZWRDb250ZXh0ID0+IENvbnRleHQ7CisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IFdyYXBwZWRSZWFkZXIgPT4gUmVhZGVyOworICAgICAgICAgICAgcHVibGljIGludCBXcmFwcGVkUmVjdXJzaW9uRGVwdGggPT4gUmVjdXJzaW9uRGVwdGg7CisgICAgICAgICAgICBwdWJsaWMgaW50IFdyYXBwZWRSZWN1cnNpb25MaW1pdCA9PiBSZWN1cnNpb25MaW1pdDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGVzdHMvVGhyaWZ0LlRlc3RzL1RocmlmdC5UZXN0cy5jc3Byb2ogYi9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5UZXN0cy9UaHJpZnQuVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNDQyNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1Rlc3RzL1RocmlmdC5UZXN0cy9UaHJpZnQuVGVzdHMuY3Nwcm9qCkBAIC0wLDAgKzEsMzYgQEAKK++7vzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8IS0tCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAgIAorICAJICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iQ29tcGFyZU5FVE9iamVjdHMiIFZlcnNpb249IjQuNTguMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuTkVULlRlc3QuU2RrIiBWZXJzaW9uPSIxNS45LjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTVNUZXN0LlRlc3RBZGFwdGVyIiBWZXJzaW9uPSIxLjQuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNU1Rlc3QuVGVzdEZyYW1ld29yayIgVmVyc2lvbj0iMS40LjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTlN1YnN0aXR1dGUiIFZlcnNpb249IjQuMC4wIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFNlcnZpY2UgSW5jbHVkZT0iezgyYTdmNDhkLTNiNTAtNGIxZS1iODJlLTNhZGE4MjEwYzM1OH0iIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0LnNsbiBiL2xpYi9uZXRzdGQvVGhyaWZ0LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUyZWIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQuc2xuCkBAIC0wLDAgKzEsODUgQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwCisjIFZpc3VhbCBTdHVkaW8gMTUKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxNS4wLjI2NzMwLjEyCitNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEwLjAuNDAyMTkuMQorUHJvamVjdCgiezIxNTBFMzMzLThGREMtNDJBMy05NDc0LTFBMzk1NkQ0NkRFOH0iKSA9ICJUZXN0cyIsICJUZXN0cyIsICJ7RUQ1QTQ1QjAtMDdEMS00NTA3LTk2QjctODNGQkQzRDAzMUNBfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0IiwgIlRocmlmdFxUaHJpZnQuY3Nwcm9qIiwgIns1QjUwMUQyMS1ENDI4LTQwOEQtQUI1Qy0zMkQ2RjUzNTUyOTR9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQuSW50ZWdyYXRpb25UZXN0cyIsICJUZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oiLCAiezgzN0Y0MDg0LUFBRDctNDVGNS1CQzk2LTEwRTA1QTY2OURCNH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdC5UZXN0cyIsICJUZXN0c1xUaHJpZnQuVGVzdHNcVGhyaWZ0LlRlc3RzLmNzcHJvaiIsICJ7MDc5MEQzODgtMUEzQy00NDIzLThDRjItQzk3MDc0QThCNjhCfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cyIsICJUZXN0c1xUaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzXFRocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMuY3Nwcm9qIiwgIntBNkFFMDIxRC02MUNCLTREODQtQTEwMy0wQjY2M0M2MkFFMkN9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJRGVidWd8eDY0ID0gRGVidWd8eDY0CisJCURlYnVnfHg4NiA9IERlYnVnfHg4NgorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NAorCQlSZWxlYXNlfHg4NiA9IFJlbGVhc2V8eDg2CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXs1QjUwMUQyMS1ENDI4LTQwOEQtQUI1Qy0zMkQ2RjUzNTUyOTR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NUI1MDFEMjEtRDQyOC00MDhELUFCNUMtMzJENkY1MzU1Mjk0fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs1QjUwMUQyMS1ENDI4LTQwOEQtQUI1Qy0zMkQ2RjUzNTUyOTR9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs1QjUwMUQyMS1ENDI4LTQwOEQtQUI1Qy0zMkQ2RjUzNTUyOTR9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NUI1MDFEMjEtRDQyOC00MDhELUFCNUMtMzJENkY1MzU1Mjk0fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NUI1MDFEMjEtRDQyOC00MDhELUFCNUMtMzJENkY1MzU1Mjk0fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezVCNTAxRDIxLUQ0MjgtNDA4RC1BQjVDLTMyRDZGNTM1NTI5NH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NUI1MDFEMjEtRDQyOC00MDhELUFCNUMtMzJENkY1MzU1Mjk0fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NUI1MDFEMjEtRDQyOC00MDhELUFCNUMtMzJENkY1MzU1Mjk0fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezVCNTAxRDIxLUQ0MjgtNDA4RC1BQjVDLTMyRDZGNTM1NTI5NH0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NUI1MDFEMjEtRDQyOC00MDhELUFCNUMtMzJENkY1MzU1Mjk0fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezVCNTAxRDIxLUQ0MjgtNDA4RC1BQjVDLTMyRDZGNTM1NTI5NH0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7ODM3RjQwODQtQUFENy00NUY1LUJDOTYtMTBFMDVBNjY5REI0fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezgzN0Y0MDg0LUFBRDctNDVGNS1CQzk2LTEwRTA1QTY2OURCNH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7ODM3RjQwODQtQUFENy00NUY1LUJDOTYtMTBFMDVBNjY5REI0fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7ODM3RjQwODQtQUFENy00NUY1LUJDOTYtMTBFMDVBNjY5REI0fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezgzN0Y0MDg0LUFBRDctNDVGNS1CQzk2LTEwRTA1QTY2OURCNH0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezgzN0Y0MDg0LUFBRDctNDVGNS1CQzk2LTEwRTA1QTY2OURCNH0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs4MzdGNDA4NC1BQUQ3LTQ1RjUtQkM5Ni0xMEUwNUE2NjlEQjR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezgzN0Y0MDg0LUFBRDctNDVGNS1CQzk2LTEwRTA1QTY2OURCNH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezgzN0Y0MDg0LUFBRDctNDVGNS1CQzk2LTEwRTA1QTY2OURCNH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs4MzdGNDA4NC1BQUQ3LTQ1RjUtQkM5Ni0xMEUwNUE2NjlEQjR9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezgzN0Y0MDg0LUFBRDctNDVGNS1CQzk2LTEwRTA1QTY2OURCNH0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs4MzdGNDA4NC1BQUQ3LTQ1RjUtQkM5Ni0xMEUwNUE2NjlEQjR9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezA3OTBEMzg4LTFBM0MtNDQyMy04Q0YyLUM5NzA3NEE4QjY4Qn0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswNzkwRDM4OC0xQTNDLTQ0MjMtOENGMi1DOTcwNzRBOEI2OEJ9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezA3OTBEMzg4LTFBM0MtNDQyMy04Q0YyLUM5NzA3NEE4QjY4Qn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezA3OTBEMzg4LTFBM0MtNDQyMy04Q0YyLUM5NzA3NEE4QjY4Qn0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswNzkwRDM4OC0xQTNDLTQ0MjMtOENGMi1DOTcwNzRBOEI2OEJ9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswNzkwRDM4OC0xQTNDLTQ0MjMtOENGMi1DOTcwNzRBOEI2OEJ9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MDc5MEQzODgtMUEzQy00NDIzLThDRjItQzk3MDc0QThCNjhCfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswNzkwRDM4OC0xQTNDLTQ0MjMtOENGMi1DOTcwNzRBOEI2OEJ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswNzkwRDM4OC0xQTNDLTQ0MjMtOENGMi1DOTcwNzRBOEI2OEJ9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MDc5MEQzODgtMUEzQy00NDIzLThDRjItQzk3MDc0QThCNjhCfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswNzkwRDM4OC0xQTNDLTQ0MjMtOENGMi1DOTcwNzRBOEI2OEJ9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MDc5MEQzODgtMUEzQy00NDIzLThDRjItQzk3MDc0QThCNjhCfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNkFFMDIxRC02MUNCLTREODQtQTEwMy0wQjY2M0M2MkFFMkN9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QTZBRTAyMUQtNjFDQi00RDg0LUExMDMtMEI2NjNDNjJBRTJDfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNkFFMDIxRC02MUNCLTREODQtQTEwMy0wQjY2M0M2MkFFMkN9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNkFFMDIxRC02MUNCLTREODQtQTEwMy0wQjY2M0M2MkFFMkN9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QTZBRTAyMUQtNjFDQi00RDg0LUExMDMtMEI2NjNDNjJBRTJDfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QTZBRTAyMUQtNjFDQi00RDg0LUExMDMtMEI2NjNDNjJBRTJDfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0E2QUUwMjFELTYxQ0ItNEQ4NC1BMTAzLTBCNjYzQzYyQUUyQ30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QTZBRTAyMUQtNjFDQi00RDg0LUExMDMtMEI2NjNDNjJBRTJDfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QTZBRTAyMUQtNjFDQi00RDg0LUExMDMtMEI2NjNDNjJBRTJDfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E2QUUwMjFELTYxQ0ItNEQ4NC1BMTAzLTBCNjYzQzYyQUUyQ30uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QTZBRTAyMUQtNjFDQi00RDg0LUExMDMtMEI2NjNDNjJBRTJDfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E2QUUwMjFELTYxQ0ItNEQ4NC1BMTAzLTBCNjYzQzYyQUUyQ30uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihOZXN0ZWRQcm9qZWN0cykgPSBwcmVTb2x1dGlvbgorCQl7ODM3RjQwODQtQUFENy00NUY1LUJDOTYtMTBFMDVBNjY5REI0fSA9IHtFRDVBNDVCMC0wN0QxLTQ1MDctOTZCNy04M0ZCRDNEMDMxQ0F9CisJCXswNzkwRDM4OC0xQTNDLTQ0MjMtOENGMi1DOTcwNzRBOEI2OEJ9ID0ge0VENUE0NUIwLTA3RDEtNDUwNy05NkI3LTgzRkJEM0QwMzFDQX0KKwkJe0E2QUUwMjFELTYxQ0ItNEQ4NC1BMTAzLTBCNjYzQzYyQUUyQ30gPSB7RUQ1QTQ1QjAtMDdEMS00NTA3LTk2QjctODNGQkQzRDAzMUNBfQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbgorCQlTb2x1dGlvbkd1aWQgPSB7RkQyMEJDNEEtMDEwOS00MUQ4LThDMEMtODkzRTc4NEQ3RUY5fQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2JmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MKQEAgLTAsMCArMSwxMDEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKKworbmFtZXNwYWNlIFRocmlmdC5Db2xsZWN0aW9ucworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRDb2xsZWN0aW9ucworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFRoaXMgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIGNvbGxlY3Rpb25zIGFyZSB2YWx1ZS13aXNlIHRoZSBzYW1lLgorICAgICAgICAvLy8gICAgIElmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIGEgY29sbGVjdGlvbiwgdGhlIGNvbGxlY3Rpb25zIHdpbGwgYmUgY29tcGFyZWQgdXNpbmcgdGhpcyBtZXRob2QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBFcXVhbHMoSUVudW1lcmFibGUgZmlyc3QsIElFbnVtZXJhYmxlIHNlY29uZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwgJiYgc2Vjb25kID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsIHx8IHNlY29uZCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGZpdGVyID0gZmlyc3QuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgdmFyIHNpdGVyID0gc2Vjb25kLkdldEVudW1lcmF0b3IoKTsKKworICAgICAgICAgICAgdmFyIGZuZXh0ID0gZml0ZXIuTW92ZU5leHQoKTsKKyAgICAgICAgICAgIHZhciBzbmV4dCA9IHNpdGVyLk1vdmVOZXh0KCk7CisKKyAgICAgICAgICAgIHdoaWxlIChmbmV4dCAmJiBzbmV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmVudW0gPSBmaXRlci5DdXJyZW50IGFzIElFbnVtZXJhYmxlOworICAgICAgICAgICAgICAgIHZhciBzZW51bSA9IHNpdGVyLkN1cnJlbnQgYXMgSUVudW1lcmFibGU7CisKKyAgICAgICAgICAgICAgICBpZiAoZmVudW0gIT0gbnVsbCAmJiBzZW51bSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFFcXVhbHMoZmVudW0sIHNlbnVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZlbnVtID09IG51bGwgXiBzZW51bSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICghRXF1YWxzKGZpdGVyLkN1cnJlbnQsIHNpdGVyLkN1cnJlbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZuZXh0ID0gZml0ZXIuTW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgICBzbmV4dCA9IHNpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmbmV4dCA9PSBzbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBUaGlzIHJldHVybnMgYSBoYXNoY29kZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIGVudW1lcmFibGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEdldEhhc2hDb2RlKElFbnVtZXJhYmxlIGVudW1lcmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbnVtZXJhYmxlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBoYXNoY29kZSA9IDA7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBvYmogaW4gZW51bWVyYWJsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZW51bTIgPSBvYmogYXMgSUVudW1lcmFibGU7CisgICAgICAgICAgICAgICAgdmFyIG9iakhhc2ggPSBlbnVtMiA9PSBudWxsID8gb2JqLkdldEhhc2hDb2RlKCkgOiBHZXRIYXNoQ29kZShlbnVtMik7CisKKyAgICAgICAgICAgICAgICB1bmNoZWNrZWQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhhc2hjb2RlID0gKGhhc2hjb2RlKjM5NykgXiAob2JqSGFzaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaGFzaGNvZGU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9Db2xsZWN0aW9ucy9USGFzaFNldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFmMGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MKQEAgLTAsMCArMSw2NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBUaHJpZnQuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUSGFzaFNldDxUPiA6IElDb2xsZWN0aW9uPFQ+CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEhhc2hTZXQ8VD4gX3NldCA9IG5ldyBIYXNoU2V0PFQ+KCk7CisKKyAgICAgICAgcHVibGljIGludCBDb3VudCA9PiBfc2V0LkNvdW50OworCisgICAgICAgIHB1YmxpYyBib29sIElzUmVhZE9ubHkgPT4gZmFsc2U7CisKKyAgICAgICAgcHVibGljIHZvaWQgQWRkKFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgX3NldC5BZGQoaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBDbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXQuQ2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIENvbnRhaW5zKFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zZXQuQ29udGFpbnMoaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oVFtdIGFycmF5LCBpbnQgYXJyYXlJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgX3NldC5Db3B5VG8oYXJyYXksIGFycmF5SW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElFbnVtZXJhdG9yIEdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NldC5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBJRW51bWVyYXRvcjxUPiBJRW51bWVyYWJsZTxUPi5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgoSUVudW1lcmFibGU8VD4pIF9zZXQpLkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZShUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2V0LlJlbW92ZShpdGVtKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9Qcm9jZXNzb3IvSVRBc3luY1Byb2Nlc3Nvci5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb2Nlc3Nvci9JVEFzeW5jUHJvY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YzFiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm9jZXNzb3IvSVRBc3luY1Byb2Nlc3Nvci5jcwpAQCAtMCwwICsxLDI4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm9jZXNzb3IKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUQXN5bmNQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbiA9IGRlZmF1bHQoQ2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvUHJvY2Vzc29yL0lUUHJvY2Vzc29yRmFjdG9yeS5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb2Nlc3Nvci9JVFByb2Nlc3NvckZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmZTNkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb2Nlc3Nvci9JVFByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSwyOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvY2Vzc29yCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUUHJvY2Vzc29yRmFjdG9yeQorICAgIHsKKyAgICAgICAgSVRBc3luY1Byb2Nlc3NvciBHZXRBc3luY1Byb2Nlc3NvcihUVHJhbnNwb3J0IHRyYW5zLCBUU2VydmVyIGJhc2VTZXJ2ZXIgPSBudWxsKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvUHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyNzRiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MKQEAgLTAsMCArMSwxNDMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2wuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvY2Vzc29yCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yIDogSVRBc3luY1Byb2Nlc3NvcgorICAgIHsKKyAgICAgICAgLy9UT0RPOiBMb2NhbGl6YXRpb24KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8c3RyaW5nLCBJVEFzeW5jUHJvY2Vzc29yPiBfc2VydmljZVByb2Nlc3Nvck1hcCA9CisgICAgICAgICAgICBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIElUQXN5bmNQcm9jZXNzb3I+KCk7CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUHJvY2Vzc0FzeW5jKGlwcm90LCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJvb2w+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBhd2FpdCBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgaWYgKChtZXNzYWdlLlR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNhbGwpICYmIChtZXNzYWdlLlR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9uZXdheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBGYWlsQXN5bmMob3Byb3QsIG1lc3NhZ2UsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGV4VHlwZSBDQUxMIG9yIE9ORVdBWSBleHBlY3RlZCIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IG1lc3NhZ2UuTmFtZS5JbmRleE9mKFRNdWx0aXBsZXhlZFByb3RvY29sLlNlcGFyYXRvciwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgRmFpbEFzeW5jKG9wcm90LCBtZXNzYWdlLCBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnZhbGlkUHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAkIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiB7bWVzc2FnZS5OYW1lfS4gRGlkIHlvdSBmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSBhbnkgVFByb3RvY29sCisgICAgICAgICAgICAgICAgdmFyIHNlcnZpY2VOYW1lID0gbWVzc2FnZS5OYW1lLlN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICAgICAgSVRBc3luY1Byb2Nlc3NvciBhY3R1YWxQcm9jZXNzb3I7CisgICAgICAgICAgICAgICAgaWYgKCFfc2VydmljZVByb2Nlc3Nvck1hcC5UcnlHZXRWYWx1ZShzZXJ2aWNlTmFtZSwgb3V0IGFjdHVhbFByb2Nlc3NvcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBGYWlsQXN5bmMob3Byb3QsIG1lc3NhZ2UsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAkIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6IHtzZXJ2aWNlTmFtZX0uIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgUmVnaXN0ZXJQcm9jZXNzb3IoKT8iLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCByZW1vdmluZyB0aGUgc2VydmljZSBuYW1lCisgICAgICAgICAgICAgICAgdmFyIG5ld01lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuTmFtZS5TdWJzdHJpbmcoc2VydmljZU5hbWUuTGVuZ3RoICsgVE11bHRpcGxleGVkUHJvdG9jb2wuU2VwYXJhdG9yLkxlbmd0aCksCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCk7CisKKyAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIGF3YWl0CisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxQcm9jZXNzb3IuUHJvY2Vzc0FzeW5jKG5ldyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIG5ld01lc3NhZ2UpLCBvcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBzaW1pbGFyIHRvIGFsbCBvdGhlciBwcm9jZXNzb3JzCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZWdpc3RlclByb2Nlc3NvcihzdHJpbmcgc2VydmljZU5hbWUsIElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3NlcnZpY2VQcm9jZXNzb3JNYXAuQ29udGFpbnNLZXkoc2VydmljZU5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAkIlByb2Nlc3NvciBtYXAgYWxyZWFkeSBjb250YWlucyBwcm9jZXNzb3Igd2l0aCBuYW1lOiAne3NlcnZpY2VOYW1lfSciKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX3NlcnZpY2VQcm9jZXNzb3JNYXAuQWRkKHNlcnZpY2VOYW1lLCBwcm9jZXNzb3IpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIEZhaWxBc3luYyhUUHJvdG9jb2wgb3Byb3QsIFRNZXNzYWdlIG1lc3NhZ2UsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlIGV4dHlwZSwKKyAgICAgICAgICAgIHN0cmluZyBldHh0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGFwcGV4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihleHR5cGUsIGV0eHQpOworCisgICAgICAgICAgICB2YXIgbmV3TWVzc2FnZSA9IG5ldyBUTWVzc2FnZShtZXNzYWdlLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1lc3NhZ2UuU2VxSUQpOworCisgICAgICAgICAgICBhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ld01lc3NhZ2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IGFwcGV4LldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IG9wcm90LlRyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIDogVFByb3RvY29sRGVjb3JhdG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlYWRvbmx5IFRNZXNzYWdlIF9tc2dCZWdpbjsKKworICAgICAgICAgICAgcHVibGljIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIFRNZXNzYWdlIG1lc3NhZ2VCZWdpbikKKyAgICAgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX21zZ0JlZ2luID0gbWVzc2FnZUJlZ2luOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTWVzc2FnZT4gUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTWVzc2FnZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfbXNnQmVnaW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvUHJvY2Vzc29yL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvY2Vzc29yL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWNmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm9jZXNzb3IvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSwzOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvY2Vzc29yCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkgOiBJVFByb2Nlc3NvckZhY3RvcnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSVRBc3luY1Byb2Nlc3NvciBfYXN5bmNQcm9jZXNzb3I7CisKKyAgICAgICAgcHVibGljIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KElUQXN5bmNQcm9jZXNzb3IgYXN5bmNQcm9jZXNzb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9hc3luY1Byb2Nlc3NvciA9IGFzeW5jUHJvY2Vzc29yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElUQXN5bmNQcm9jZXNzb3IgR2V0QXN5bmNQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBiYXNlU2VydmVyID0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9hc3luY1Byb2Nlc3NvcjsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMTE4YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU2IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiQyMgLk5FVCBDb3JlIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorLy9AVE9ETyB3aGVyZSB0byBwdXQgTGljZW5zZSBpbmZvcm1hdGlvbj8KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIGV4VHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgZXhUeXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJkZjNmOGVmMC1lMGEzLTRjODYtYTY1Yi04ZWM4NGUwMTZiMWQiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKKworW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjEiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMSIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL0VudGl0aWVzL1RGaWVsZC5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL0VudGl0aWVzL1RGaWVsZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI5YmI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvRW50aXRpZXMvVEZpZWxkLmNzCkBAIC0wLDAgKzEsMzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVEZpZWxkCisgICAgeworICAgICAgICBwdWJsaWMgVEZpZWxkKHN0cmluZyBuYW1lLCBUVHlwZSB0eXBlLCBzaG9ydCBpZCkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIElEID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZyAtIGRvIG5vdCByZW5hbWUgLSBpdCB1c2VkIGZvciBnZW5lcmF0aW9uIAorICAgICAgICBwdWJsaWMgc2hvcnQgSUQgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9FbnRpdGllcy9UTGlzdC5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL0VudGl0aWVzL1RMaXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OTkyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9FbnRpdGllcy9UTGlzdC5jcwpAQCAtMCwwICsxLDMzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RydWN0IFRMaXN0CisgICAgeworICAgICAgICBwdWJsaWMgVExpc3QoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgICAgIENvdW50ID0gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFR5cGUgRWxlbWVudFR5cGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9FbnRpdGllcy9UTWFwLmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvRW50aXRpZXMvVE1hcC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWZlYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvRW50aXRpZXMvVE1hcC5jcwpAQCAtMCwwICsxLDM2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RydWN0IFRNYXAKKyAgICB7CisgICAgICAgIHB1YmxpYyBUTWFwKFRUeXBlIGtleVR5cGUsIFRUeXBlIHZhbHVlVHlwZSwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBLZXlUeXBlID0ga2V5VHlwZTsKKyAgICAgICAgICAgIFZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKKyAgICAgICAgICAgIENvdW50ID0gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFR5cGUgS2V5VHlwZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIFRUeXBlIFZhbHVlVHlwZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIGludCBDb3VudCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL0VudGl0aWVzL1RNZXNzYWdlLmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvRW50aXRpZXMvVE1lc3NhZ2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkNzQxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL0VudGl0aWVzL1RNZXNzYWdlLmNzCkBAIC0wLDAgKzEsMzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVE1lc3NhZ2UKKyAgICB7CisgICAgICAgIHB1YmxpYyBUTWVzc2FnZShzdHJpbmcgbmFtZSwgVE1lc3NhZ2VUeXBlIHR5cGUsIGludCBzZXFpZCkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIFNlcUlEID0gc2VxaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUTWVzc2FnZVR5cGUgVHlwZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcgLSBkbyBub3QgcmVuYW1lIC0gaXQgdXNlZCBmb3IgZ2VuZXJhdGlvbiAKKyAgICAgICAgcHVibGljIGludCBTZXFJRCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL0VudGl0aWVzL1RNZXNzYWdlVHlwZS5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL0VudGl0aWVzL1RNZXNzYWdlVHlwZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGQ2NjNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvRW50aXRpZXMvVE1lc3NhZ2VUeXBlLmNzCkBAIC0wLDAgKzEsMjggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBlbnVtIFRNZXNzYWdlVHlwZQorICAgIHsKKyAgICAgICAgQ2FsbCA9IDEsCisgICAgICAgIFJlcGx5ID0gMiwKKyAgICAgICAgRXhjZXB0aW9uID0gMywKKyAgICAgICAgT25ld2F5ID0gNAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9FbnRpdGllcy9UU2V0LmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvRW50aXRpZXMvVFNldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTJkNTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvRW50aXRpZXMvVFNldC5jcwpAQCAtMCwwICsxLDM4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RydWN0IFRTZXQKKyAgICB7CisgICAgICAgIHB1YmxpYyBUU2V0KFRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgICAgICBDb3VudCA9IGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXQoVExpc3QgbGlzdCkKKyAgICAgICAgICAgIDogdGhpcyhsaXN0LkVsZW1lbnRUeXBlLCBsaXN0LkNvdW50KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFR5cGUgRWxlbWVudFR5cGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9FbnRpdGllcy9UU3RydWN0LmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvRW50aXRpZXMvVFN0cnVjdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQxNjdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvRW50aXRpZXMvVFN0cnVjdC5jcwpAQCAtMCwwICsxLDMwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RydWN0IFRTdHJ1Y3QKKyAgICB7CisgICAgICAgIHB1YmxpYyBUU3RydWN0KHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL0VudGl0aWVzL1RUeXBlLmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvRW50aXRpZXMvVFR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5MjJhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL0VudGl0aWVzL1RUeXBlLmNzCkBAIC0wLDAgKzEsMzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBlbnVtIFRUeXBlIDogYnl0ZQorICAgIHsKKyAgICAgICAgU3RvcCA9IDAsCisgICAgICAgIFZvaWQgPSAxLAorICAgICAgICBCb29sID0gMiwKKyAgICAgICAgQnl0ZSA9IDMsCisgICAgICAgIERvdWJsZSA9IDQsCisgICAgICAgIEkxNiA9IDYsCisgICAgICAgIEkzMiA9IDgsCisgICAgICAgIEk2NCA9IDEwLAorICAgICAgICBTdHJpbmcgPSAxMSwKKyAgICAgICAgU3RydWN0ID0gMTIsCisgICAgICAgIE1hcCA9IDEzLAorICAgICAgICBTZXQgPSAxNCwKKyAgICAgICAgTGlzdCA9IDE1CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL0lUUHJvdG9jb2xGYWN0b3J5LmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvSVRQcm90b2NvbEZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiY2JiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL0lUUHJvdG9jb2xGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMjcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRQcm90b2NvbEZhY3RvcnkKKyAgICB7CisgICAgICAgIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvVEJhc2UuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9UQmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWVmMmFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvVEJhc2UuY3MKQEAgLTAsMCArMSwzMyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRVbmlvbkJhc2UKKyAgICB7CisgICAgICAgIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgdFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbiA9IGRlZmF1bHQoQ2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICB9CisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBpbnRlcmZhY2UgVEJhc2UgOiBUVW5pb25CYXNlCisgICAgeworICAgICAgICBUYXNrIFJlYWRBc3luYyhUUHJvdG9jb2wgdFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbiA9IGRlZmF1bHQoQ2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiY2E4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcwpAQCAtMCwwICsxLDYxMyBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbC5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUQmluYXJ5UHJvdG9jb2wgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIC8vVE9ETzogVW5pdCB0ZXN0cworICAgICAgICAvL1RPRE86IExvY2FsaXphdGlvbgorICAgICAgICAvL1RPRE86IHByYWdtYQorCisgICAgICAgIHByb3RlY3RlZCBjb25zdCB1aW50IFZlcnNpb25NYXNrID0gMHhmZmZmMDAwMDsKKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IHVpbnQgVmVyc2lvbjEgPSAweDgwMDEwMDAwOworCisgICAgICAgIHByb3RlY3RlZCBib29sIFN0cmljdFJlYWQ7CisgICAgICAgIHByb3RlY3RlZCBib29sIFN0cmljdFdyaXRlOworCisgICAgICAgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIDogdGhpcyh0cmFucywgZmFsc2UsIHRydWUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucywgYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpY3RSZWFkID0gc3RyaWN0UmVhZDsKKyAgICAgICAgICAgIFN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoU3RyaWN0V3JpdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBWZXJzaW9uMSB8ICh1aW50KSBtZXNzYWdlLlR5cGU7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYygoaW50KSB2ZXJzaW9uLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVTdHJpbmdBc3luYyhtZXNzYWdlLk5hbWUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKG1lc3NhZ2UuU2VxSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cmluZ0FzeW5jKG1lc3NhZ2UuTmFtZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgbWVzc2FnZS5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhtZXNzYWdlLlNlcUlELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0QmVnaW5Bc3luYyhUU3RydWN0IEBzdHJ1Y3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkFzeW5jKFRGaWVsZCBmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVJMTZBc3luYyhmaWVsZC5JRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBUVHlwZS5TdG9wLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEJlZ2luQXN5bmMoVE1hcCBtYXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIG1hcC5LZXlUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIG1hcC5WYWx1ZVR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMobWFwLkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0QmVnaW5Bc3luYyhUTGlzdCBsaXN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBsaXN0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKGxpc3QuQ291bnQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBzZXQuRWxlbWVudFR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMoc2V0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoYiA/IChzYnl0ZSkgMSA6IChzYnl0ZSkgMCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIHN0YXRpYyBieXRlW10gQ3JlYXRlV3JpdGVCeXRlKHNieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBib3V0ID0gbmV3IGJ5dGVbMV07CisKKyAgICAgICAgICAgIGJvdXRbMF0gPSAoYnl0ZSkgYjsKKworICAgICAgICAgICAgcmV0dXJuIGJvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJvdXQgPSBDcmVhdGVXcml0ZUJ5dGUoYik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJvdXQsIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlSTE2KHNob3J0IHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpMTZPdXQgPSBuZXcgYnl0ZVsyXTsKKworICAgICAgICAgICAgaTE2T3V0WzBdID0gKGJ5dGUpICgweGZmICYgKHMgPj4gOCkpOworICAgICAgICAgICAgaTE2T3V0WzFdID0gKGJ5dGUpICgweGZmICYgcyk7CisKKyAgICAgICAgICAgIHJldHVybiBpMTZPdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpMTZPdXQgPSBDcmVhdGVXcml0ZUkxNihpMTYpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhpMTZPdXQsIDAsIDIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlSTMyKGludCBpMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpMzJPdXQgPSBuZXcgYnl0ZVs0XTsKKworICAgICAgICAgICAgaTMyT3V0WzBdID0gKGJ5dGUpICgweGZmICYgKGkzMiA+PiAyNCkpOworICAgICAgICAgICAgaTMyT3V0WzFdID0gKGJ5dGUpICgweGZmICYgKGkzMiA+PiAxNikpOworICAgICAgICAgICAgaTMyT3V0WzJdID0gKGJ5dGUpICgweGZmICYgKGkzMiA+PiA4KSk7CisgICAgICAgICAgICBpMzJPdXRbM10gPSAoYnl0ZSkgKDB4ZmYgJiBpMzIpOworCisgICAgICAgICAgICByZXR1cm4gaTMyT3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGkzMk91dCA9IENyZWF0ZVdyaXRlSTMyKGkzMik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGkzMk91dCwgMCwgNCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIHN0YXRpYyBieXRlW10gQ3JlYXRlV3JpdGVJNjQobG9uZyBpNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpNjRPdXQgPSBuZXcgYnl0ZVs4XTsKKworICAgICAgICAgICAgaTY0T3V0WzBdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiA1NikpOworICAgICAgICAgICAgaTY0T3V0WzFdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiA0OCkpOworICAgICAgICAgICAgaTY0T3V0WzJdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiA0MCkpOworICAgICAgICAgICAgaTY0T3V0WzNdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiAzMikpOworICAgICAgICAgICAgaTY0T3V0WzRdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiAyNCkpOworICAgICAgICAgICAgaTY0T3V0WzVdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiAxNikpOworICAgICAgICAgICAgaTY0T3V0WzZdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiA4KSk7CisgICAgICAgICAgICBpNjRPdXRbN10gPSAoYnl0ZSkgKDB4ZmYgJiBpNjQpOworCisgICAgICAgICAgICByZXR1cm4gaTY0T3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpNjRPdXQgPSBDcmVhdGVXcml0ZUk2NChpNjQpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhpNjRPdXQsIDAsIDgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUk2NEFzeW5jKEJpdENvbnZlcnRlci5Eb3VibGVUb0ludDY0Qml0cyhkKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgMCwgYnl0ZXMuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTWVzc2FnZT4gUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNZXNzYWdlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgICAgICB2YXIgc2l6ZSA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSAodWludCkgc2l6ZSAmIFZlcnNpb25NYXNrOworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZlcnNpb24xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAkIkJhZCB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW46IHt2ZXJzaW9ufSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKSAoc2l6ZSAmIDB4MDAwMDAwZmYpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IGF3YWl0IFJlYWRTdHJpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFN0cmljdFJlYWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lID0gYXdhaXQgUmVhZFN0cmluZ0JvZHlBc3luYyhzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9UT0RPOiBubyByZWFkIGZyb20gaW50ZXJuYWwgdHJhbnNwb3J0PworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxURmllbGQ+IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VEZpZWxkPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBURmllbGQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUeXBlID0gKFRUeXBlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgIT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5JRCA9IGF3YWl0IFJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VE1hcD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbWFwID0gbmV3IFRNYXAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLZXlUeXBlID0gKFRUeXBlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwKKyAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgPSAoVFR5cGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pLAorICAgICAgICAgICAgICAgIENvdW50ID0gYXdhaXQgUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VExpc3Q+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgVExpc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50VHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbiksCisgICAgICAgICAgICAgICAgQ291bnQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU2V0PiBSZWFkU2V0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUU2V0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgVFNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVsZW1lbnRUeXBlID0gKFRUeXBlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwKKyAgICAgICAgICAgICAgICBDb3VudCA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJvb2w+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pID09IDE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzYnl0ZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYmluID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYmluLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7IC8vVE9ETzogd2h5IHJlYWRhbGwgPworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSkgYmluWzBdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c2hvcnQ+IFJlYWRJMTZBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzaG9ydD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTE2SW4gPSBuZXcgYnl0ZVsyXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhpMTZJbiwgMCwgMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IChzaG9ydCkgKCgoaTE2SW5bMF0gJiAweGZmKSA8PCA4KSB8IGkxNkluWzFdICYgMHhmZik7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpMzJJbiA9IG5ldyBieXRlWzRdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGkzMkluLCAwLCA0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSAKKyAgICAgICAgICAgICAgICAoKGkzMkluWzBdICYgMHhmZikgPDwgMjQpIHwgCisgICAgICAgICAgICAgICAgKChpMzJJblsxXSAmIDB4ZmYpIDw8IDE2KSB8IAorICAgICAgICAgICAgICAgICgoaTMySW5bMl0gJiAweGZmKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgaTMySW5bM10gJiAweGZmOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDY3NQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBsb25nIENyZWF0ZVJlYWRJNjQoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzBdICYgMHhmZikgPDwgNTYpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbMV0gJiAweGZmKSA8PCA0OCkgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1ZlsyXSAmIDB4ZmYpIDw8IDQwKSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzNdICYgMHhmZikgPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbNF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1Zls1XSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzZdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgIGJ1Zls3XSAmIDB4ZmY7CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworI3ByYWdtYSB3YXJuaW5nIHJlc3RvcmUgNjc1CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8bG9uZz4gUmVhZEk2NEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGxvbmc+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGk2NEluID0gbmV3IGJ5dGVbOF07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoaTY0SW4sIDAsIDgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZWFkSTY0KGk2NEluKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGRvdWJsZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZCA9IGF3YWl0IFJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKGQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ynl0ZVtdPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBzaXplID0gYXdhaXQgUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhidWYsIDAsIHNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQm9keUFzeW5jKGludCBzaXplLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHN0cmluZz4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCBzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogSVRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgU3RyaWN0UmVhZDsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIFN0cmljdFdyaXRlOworCisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgOiB0aGlzKGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeShib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7CisgICAgICAgICAgICAgICAgU3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBTdHJpY3RSZWFkLCBTdHJpY3RXcml0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmNjQwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MKQEAgLTAsMCArMSw5MjIgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbC5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICAvL1RPRE86IGltcGxlbWVudGF0aW9uIG9mIFRQcm90b2NvbAorCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVENvbXBhY3RQcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFByb3RvY29sSWQgPSAweDgyOworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVmVyc2lvbiA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBWZXJzaW9uTWFzayA9IDB4MWY7IC8vIDAwMDEgMTExMQorICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVHlwZU1hc2sgPSAweEUwOyAvLyAxMTEwIDAwMDAKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFR5cGVCaXRzID0gMHgwNzsgLy8gMDAwMCAwMTExCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFR5cGVTaGlmdEFtb3VudCA9IDU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRTdHJ1Y3QgQW5vbnltb3VzU3RydWN0ID0gbmV3IFRTdHJ1Y3Qoc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEZpZWxkIFRzdG9wID0gbmV3IFRGaWVsZChzdHJpbmcuRW1wdHksIFRUeXBlLlN0b3AsIDApOworCisgICAgICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBUVHlwZVRvQ29tcGFjdFR5cGUgPSBuZXcgYnl0ZVsxNl07CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3RhY2s8c2hvcnQ+IF9sYXN0RmllbGQgPSBuZXcgU3RhY2s8c2hvcnQ+KDE1KTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBURmllbGQ/IF9ib29sZWFuRmllbGQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIElmIHdlIFJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBoZXJlIHNvIHRoYXQgUmVhZEJvb2wgY2FuIHVzZSBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBib29sPyBfYm9vbFZhbHVlOworCisgICAgICAgIHByaXZhdGUgc2hvcnQgX2xhc3RGaWVsZElkOworCisgICAgICAgIHB1YmxpYyBUQ29tcGFjdFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IGJhc2UodHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5TdG9wXSA9IFR5cGVzLlN0b3A7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuQm9vbF0gPSBUeXBlcy5Cb29sZWFuVHJ1ZTsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5CeXRlXSA9IFR5cGVzLkJ5dGU7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuSTE2XSA9IFR5cGVzLkkxNjsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5JMzJdID0gVHlwZXMuSTMyOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkk2NF0gPSBUeXBlcy5JNjQ7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuRG91YmxlXSA9IFR5cGVzLkRvdWJsZTsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5TdHJpbmddID0gVHlwZXMuQmluYXJ5OworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkxpc3RdID0gVHlwZXMuTGlzdDsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5TZXRdID0gVHlwZXMuU2V0OworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLk1hcF0gPSBUeXBlcy5NYXA7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU3RydWN0XSA9IFR5cGVzLlN0cnVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2xhc3RGaWVsZC5DbGVhcigpOworICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge1Byb3RvY29sSWR9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdAorICAgICAgICAgICAgICAgIFRyYW5zLldyaXRlQXN5bmMoCisgICAgICAgICAgICAgICAgICAgIG5ld1tdIHsoYnl0ZSkgKChWZXJzaW9uICYgVmVyc2lvbk1hc2spIHwgKCgodWludCkgbWVzc2FnZS5UeXBlIDw8IFR5cGVTaGlmdEFtb3VudCkgJiBUeXBlTWFzaykpfSwKKyAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKCh1aW50KSBtZXNzYWdlLlNlcUlEKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlU3RyaW5nQXN5bmMobWVzc2FnZS5OYW1lLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKKyAgICAgICAgLy8vICAgICB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKKyAgICAgICAgLy8vICAgICBzdGFjayBzbyB3ZSBjYW4gZ2V0IHRoZSBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKFRTdHJ1Y3QgQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9sYXN0RmllbGQuUHVzaChfbGFzdEZpZWxkSWQpOworICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IF9sYXN0RmllbGQuUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxBc3luYyhURmllbGQgZmllbGQsIGJ5dGUgdHlwZU92ZXJyaWRlLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3MgYSBleFR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorICAgICAgICAgICAgdmFyIHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlID09IDB4RkYgPyBHZXRDb21wYWN0VHlwZShmaWVsZC5UeXBlKSA6IHR5cGVPdmVycmlkZTsKKworICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgICAgICAgICAgICBpZiAoKGZpZWxkLklEID4gX2xhc3RGaWVsZElkKSAmJiAoZmllbGQuSUQgLSBfbGFzdEZpZWxkSWQgPD0gMTUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBiID0gKGJ5dGUpICgoKGZpZWxkLklEIC0gX2xhc3RGaWVsZElkKSA8PCA0KSB8IHR5cGVUb1dyaXRlKTsKKyAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7Yn0sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7dHlwZVRvV3JpdGV9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVJMTZBc3luYyhmaWVsZC5JRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbGFzdEZpZWxkSWQgPSBmaWVsZC5JRDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkFzeW5jKFRGaWVsZCBmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLkJvb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2Jvb2xlYW5GaWVsZCA9IGZpZWxkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlRmllbGRCZWdpbkludGVybmFsQXN5bmMoZmllbGQsIDB4RkYsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge1R5cGVzLlN0b3B9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYXN5bmMgVGFzayBXcml0ZUNvbGxlY3Rpb25CZWdpbkFzeW5jKFRUeXBlIGVsZW1UeXBlLCBpbnQgc2l6ZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisgICAgICAgICAgICAgdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIGV4VHlwZSBpbmRpY2F0b3IuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICBpZiAoc2l6ZSA8PSAxNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHsoYnl0ZSkgKChzaXplIDw8IDQpIHwgR2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKX0sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHsoYnl0ZSkgKDB4ZjAgfCBHZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMigodWludCkgc2l6ZSk7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQ29sbGVjdGlvbkJlZ2luQXN5bmMobGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUNvbGxlY3Rpb25CZWdpbkFzeW5jKHNldC5FbGVtZW50VHlwZSwgc2V0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4gUG90ZW50aWFsbHksIHRoaXMgY291bGQgYmUgYSBib29sZWFuIGZpZWxkLCBpbgorICAgICAgICAgICAgd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKKyAgICAgICAgICAgIHJpZ2h0IGV4VHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorICAgICAgICAgICAgT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKF9ib29sZWFuRmllbGQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICAgICAgICAgICAgICBhd2FpdAorICAgICAgICAgICAgICAgICAgICBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbEFzeW5jKF9ib29sZWFuRmllbGQuVmFsdWUsIGIgPyBUeXBlcy5Cb29sZWFuVHJ1ZSA6IFR5cGVzLkJvb2xlYW5GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBfYm9vbGVhbkZpZWxkID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IFdyaXRlIHRoZSB2YWx1ZS4KKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHtiID8gVHlwZXMuQm9vbGVhblRydWUgOiBUeXBlcy5Cb29sZWFuRmFsc2V9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpIGJ9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoSW50VG9aaWd6YWcoaTE2KSk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIFR1cGxlPGJ5dGVbXSwgaW50PiBDcmVhdGVXcml0ZVZhckludDMyKHVpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LlJlc3VsdHMgaW4gMSAtIDUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgaTMyQnVmID0gbmV3IGJ5dGVbNV07CisgICAgICAgICAgICB2YXIgaWR4ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChuICYgfjB4N0YpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpMzJCdWZbaWR4KytdID0gKGJ5dGUpIG47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGkzMkJ1ZltpZHgrK10gPSAoYnl0ZSkgKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgICAgICAgICBuID4+PSA3OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPGJ5dGVbXSwgaW50PihpMzJCdWYsIGlkeCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkzMkFzeW5jKGludCBpMzIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKEludFRvWmlnemFnKGkzMikpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBUdXBsZTxieXRlW10sIGludD4gQ3JlYXRlV3JpdGVWYXJJbnQ2NCh1bG9uZyBuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgICAgICB2YXIgaWR4ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChuICYgfih1bG9uZykgMHg3RkwpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBidWZbaWR4KytdID0gKGJ5dGUpIG47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZbaWR4KytdID0gKGJ5dGUpICgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxieXRlW10sIGludD4oYnVmLCBpZHgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50NjQoTG9uZ1RvWmlnemFnKGk2NCkpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZGF0YSA9IG5ldyBieXRlWzhdOworICAgICAgICAgICAgRml4ZWRMb25nVG9CeXRlcyhCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZCksIGRhdGEsIDApOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhkYXRhLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzdHIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnl0ZXMgPSBFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHN0cik7CisKKyAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIGJ5dGVzLkxlbmd0aCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgMCwgYnl0ZXMuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIGJ5dGVzLkxlbmd0aCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgMCwgYnl0ZXMuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEJlZ2luQXN5bmMoVE1hcCBtYXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWFwLkNvdW50ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpIDB9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMigodWludCkgbWFwLkNvdW50KTsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0CisgICAgICAgICAgICAgICAgICAgIFRyYW5zLldyaXRlQXN5bmMoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdbXSB7KGJ5dGUpICgoR2V0Q29tcGFjdFR5cGUobWFwLktleVR5cGUpIDw8IDQpIHwgR2V0Q29tcGFjdFR5cGUobWFwLlZhbHVlVHlwZSkpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTWVzc2FnZT4gUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNZXNzYWdlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBwcm90b2NvbElkID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKHByb3RvY29sSWQgIT0gUHJvdG9jb2xJZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCQiRXhwZWN0ZWQgcHJvdG9jb2wgaWQge1Byb3RvY29sSWQ6WH0gYnV0IGdvdCB7cHJvdG9jb2xJZDpYfSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdmVyc2lvbkFuZFR5cGUgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgdmVyc2lvbiA9IChieXRlKSAodmVyc2lvbkFuZFR5cGUgJiBWZXJzaW9uTWFzayk7CisKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZlcnNpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigkIkV4cGVjdGVkIHZlcnNpb24ge1ZlcnNpb259IGJ1dCBnb3Qge3ZlcnNpb259Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciB0eXBlID0gKGJ5dGUpICgodmVyc2lvbkFuZFR5cGUgPj4gVHlwZVNoaWZ0QW1vdW50KSAmIFR5cGVCaXRzKTsKKyAgICAgICAgICAgIHZhciBzZXFpZCA9IChpbnQpIGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBtZXNzYWdlTmFtZSA9IGF3YWl0IFJlYWRTdHJpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobWVzc2FnZU5hbWUsIChUTWVzc2FnZVR5cGUpIHR5cGUsIHNlcWlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUU3RydWN0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNvbWUgbWFnaWMgaXMgaGVyZSApCisKKyAgICAgICAgICAgIF9sYXN0RmllbGQuUHVzaChfbGFzdEZpZWxkSWQpOworICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gMDsKKworICAgICAgICAgICAgcmV0dXJuIEFub255bW91c1N0cnVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yCisgICAgICAgICAgICB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgUmVhZCBvZmYgdGhlIHdpcmUuCisgICAgICAgICAgICBfbGFzdEZpZWxkSWQgPSBfbGFzdEZpZWxkLlBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgICAgIHZhciB0eXBlID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLgorICAgICAgICAgICAgaWYgKHR5cGUgPT0gVHlwZXMuU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVHN0b3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNob3J0IGZpZWxkSWQ7CisgICAgICAgICAgICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIGV4VHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgICAgICAgICAgIHZhciBtb2RpZmllciA9IChzaG9ydCkgKCh0eXBlICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICBpZiAobW9kaWZpZXIgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZElkID0gYXdhaXQgUmVhZEkxNkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZElkID0gKHNob3J0KSAoX2xhc3RGaWVsZElkICsgbW9kaWZpZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgVEZpZWxkKHN0cmluZy5FbXB0eSwgR2V0VFR5cGUoKGJ5dGUpICh0eXBlICYgMHgwZikpLCBmaWVsZElkKTsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSBleFR5cGUKKyAgICAgICAgICAgIGlmIChJc0Jvb2xUeXBlKHR5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9ib29sVmFsdWUgPSAoYnl0ZSkgKHR5cGUgJiAweDBmKSA9PSBUeXBlcy5Cb29sZWFuVHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCisgICAgICAgICAgICBfbGFzdEZpZWxkSWQgPSBmaWVsZC5JRDsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTWFwPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgUmVhZGluZyB0aGUga2V5CisgICAgICAgICAgICBhbmQgdmFsdWUgZXhUeXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCisgICAgICAgICAgICAiY29ycmVjdCIgdHlwZXMuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICB2YXIgc2l6ZSA9IChpbnQpIGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBrZXlBbmRWYWx1ZVR5cGUgPSBzaXplID09IDAgPyAoYnl0ZSkgMCA6IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVE1hcChHZXRUVHlwZSgoYnl0ZSkgKGtleUFuZFZhbHVlVHlwZSA+PiA0KSksIEdldFRUeXBlKChieXRlKSAoa2V5QW5kVmFsdWVUeXBlICYgMHhmKSksIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZE1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICAgICAgICBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCBleFR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisgICAgICAgICAgICBvZiB0aGUgZWxlbWVudCBleFR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKyAgICAgICAgICAgIHRydWUgc2l6ZS4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFNldChhd2FpdCBSZWFkTGlzdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGJvb2w+IFJlYWRCb29sQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ym9vbD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorICAgICAgICAgICAgYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKyAgICAgICAgICAgIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICBpZiAoX2Jvb2xWYWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfYm9vbFZhbHVlLlZhbHVlOworICAgICAgICAgICAgICAgIF9ib29sVmFsdWUgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSA9PSBUeXBlcy5Cb29sZWFuVHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNieXRlPiBSZWFkQnl0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHNieXRlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhidWYsIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiAoc2J5dGUpIGJ1ZlswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNob3J0PiBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8c2hvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkgWmlnemFnVG9JbnQoYXdhaXQgUmVhZFZhckludDMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEkzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gWmlnemFnVG9JbnQoYXdhaXQgUmVhZFZhckludDMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxsb25nPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBaaWd6YWdUb0xvbmcoYXdhaXQgUmVhZFZhckludDY0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGRvdWJsZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbG9uZ0JpdHMgPSBuZXcgYnl0ZVs4XTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhsb25nQml0cywgMCwgOCwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKEJ5dGVzVG9Mb25nKGxvbmdCaXRzKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRTdHJpbmdBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHN0cmluZz4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkcyBhIGJ5dGVbXSAodmlhIFJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgorICAgICAgICAgICAgdmFyIGxlbmd0aCA9IChpbnQpIGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGJ1ZiwgMCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhidWYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ynl0ZVtdPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KKyAgICAgICAgICAgIHZhciBsZW5ndGggPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhidWYsIDAsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTGlzdD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICAgICAgICBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCBleFR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorICAgICAgICAgICAgb2YgdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgICAgICB0cnVlIHNpemUuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICB2YXIgc2l6ZUFuZFR5cGUgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgc2l6ZSA9IChzaXplQW5kVHlwZSA+PiA0KSAmIDB4MGY7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplID0gKGludCkgYXdhaXQgUmVhZFZhckludDMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdHlwZSA9IEdldFRUeXBlKHNpemVBbmRUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVExpc3QodHlwZSwgc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZSBHZXRDb21wYWN0VHlwZShUVHlwZSB0dHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudC4KKyAgICAgICAgICAgIHJldHVybiBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgdHR5cGVdOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8dWludD4gUmVhZFZhckludDMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8dWludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDUgYnl0ZXMuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICB1aW50IHJlc3VsdCA9IDA7CisgICAgICAgICAgICB2YXIgc2hpZnQgPSAwOworCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYiA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHVpbnQpIChiICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaGlmdCArPSA3OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHVsb25nPiBSZWFkVmFySW50NjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDx1aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdmFyIHNoaWZ0ID0gMDsKKyAgICAgICAgICAgIHVsb25nIHJlc3VsdCA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYiA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHVsb25nKSAoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBaaWd6YWdUb0ludCh1aW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSAobiA+PiAxKSBeIC0oaW50KSAobiAmIDEpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBaaWd6YWdUb0xvbmcodWxvbmcgbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChsb25nKSAobiA+PiAxKSBeIC0obG9uZykgKG4gJiAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgQnl0ZXNUb0xvbmcoYnl0ZVtdIGJ5dGVzKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCisgICAgICAgICAgICBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorICAgICAgICAgICAgeW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICgoYnl0ZXNbN10gJiAweGZmTCkgPDwgNTYpIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzZdICYgMHhmZkwpIDw8IDQ4KSB8CisgICAgICAgICAgICAgICAgKChieXRlc1s1XSAmIDB4ZmZMKSA8PCA0MCkgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbNF0gJiAweGZmTCkgPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzNdICYgMHhmZkwpIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgKChieXRlc1syXSAmIDB4ZmZMKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbMV0gJiAweGZmTCkgPDwgOCkgfAorICAgICAgICAgICAgICAgIChieXRlc1swXSAmIDB4ZmZMKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgSXNCb29sVHlwZShieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsb3dlck5pYmJsZSA9IGIgJiAweDBmOworICAgICAgICAgICAgcmV0dXJuIChsb3dlck5pYmJsZSA9PSBUeXBlcy5Cb29sZWFuVHJ1ZSkgfHwgKGxvd2VyTmliYmxlID09IFR5cGVzLkJvb2xlYW5GYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUVHlwZSBHZXRUVHlwZShieXRlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyBUVHlwZSB2YWx1ZS4KKyAgICAgICAgICAgIHN3aXRjaCAoKGJ5dGUpICh0eXBlICYgMHgwZikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5TdG9wOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RvcDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJvb2xlYW5GYWxzZToKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJvb2xlYW5UcnVlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuQm9vbDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJ5dGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5CeXRlOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSTE2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuSTE2OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSTMyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuSTMyOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSTY0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuSTY0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuRG91YmxlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuRG91YmxlOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQmluYXJ5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RyaW5nOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkxpc3Q7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5TZXQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TZXQ7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5NYXA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5NYXA7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5TdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TdHJ1Y3Q7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigkIkRvbid0IGtub3cgd2hhdCBleFR5cGU6IHsoYnl0ZSkgKHR5cGUgJiAweDBmKX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHVsb25nIExvbmdUb1ppZ3phZyhsb25nIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUgcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50CisgICAgICAgICAgICByZXR1cm4gKHVsb25nKSAobiA8PCAxKSBeICh1bG9uZykgKG4gPj4gNjMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdWludCBJbnRUb1ppZ3phZyhpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludAorICAgICAgICAgICAgcmV0dXJuICh1aW50KSAobiA8PCAxKSBeICh1aW50KSAobiA+PiAzMSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEZpeGVkTG9uZ1RvQnl0ZXMobG9uZyBuLCBieXRlW10gYnVmLCBpbnQgb2ZmKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcgdW50aWwgb2ZmKzcuCisgICAgICAgICAgICBidWZbb2ZmICsgMF0gPSAoYnl0ZSkgKG4gJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAxXSA9IChieXRlKSAoKG4gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAyXSA9IChieXRlKSAoKG4gPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgM10gPSAoYnl0ZSkgKChuID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDRdID0gKGJ5dGUpICgobiA+PiAzMikgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA1XSA9IChieXRlKSAoKG4gPj4gNDApICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgNl0gPSAoYnl0ZSkgKChuID4+IDQ4KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDddID0gKGJ5dGUpICgobiA+PiA1NikgJiAweGZmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogSVRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQWxsIG9mIHRoZSBvbi13aXJlIGV4VHlwZSBjb2Rlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU3RvcCA9IDB4MDA7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCb29sZWFuVHJ1ZSA9IDB4MDE7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCb29sZWFuRmFsc2UgPSAweDAyOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQnl0ZSA9IDB4MDM7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBJMTYgPSAweDA0OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgSTMyID0gMHgwNTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEk2NCA9IDB4MDY7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBEb3VibGUgPSAweDA3OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQmluYXJ5ID0gMHgwODsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIExpc3QgPSAweDA5OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU2V0ID0gMHgwQTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIE1hcCA9IDB4MEI7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBTdHJ1Y3QgPSAweDBDOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9USlNPTlByb3RvY29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjEzODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9USlNPTlByb3RvY29sLmNzCkBAIC0wLDAgKzEsOTgxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sLlV0aWxpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgICBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisgICAgLy8vICAgICBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIFdyaXRlIGFuZCBSZWFkLgorICAgIC8vLyAgICAgUGxlYXNlIHNlZSB0aGUgQysrIGNsYXNzIGhlYWRlciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUKKyAgICAvLy8gICAgIHByb3RvY29sJ3Mgd2lyZSBmb3JtYXQuCisgICAgLy8vICAgICBBZGFwdGVkIGZyb20gdGhlIEphdmEgdmVyc2lvbi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRKc29uUHJvdG9jb2wgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgbG9uZyBWZXJzaW9uID0gMTsKKworICAgICAgICAvLyBUZW1wb3JhcnkgYnVmZmVyIHVzZWQgYnkgc2V2ZXJhbCBtZXRob2RzCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIF90ZW1wQnVmZmVyID0gbmV3IGJ5dGVbNF07CisKKyAgICAgICAgLy8gQ3VycmVudCBjb250ZXh0IHRoYXQgd2UgYXJlIGluCisgICAgICAgIHByb3RlY3RlZCBKU09OQmFzZUNvbnRleHQgQ29udGV4dDsKKworICAgICAgICAvLyBTdGFjayBvZiBuZXN0ZWQgY29udGV4dHMgdGhhdCB3ZSBtYXkgYmUgaW4KKyAgICAgICAgcHJvdGVjdGVkIFN0YWNrPEpTT05CYXNlQ29udGV4dD4gQ29udGV4dFN0YWNrID0gbmV3IFN0YWNrPEpTT05CYXNlQ29udGV4dD4oKTsKKworICAgICAgICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgorICAgICAgICBwcm90ZWN0ZWQgTG9va2FoZWFkUmVhZGVyIFJlYWRlcjsKKworICAgICAgICAvLyBEZWZhdWx0IGVuY29kaW5nCisgICAgICAgIHByb3RlY3RlZCBFbmNvZGluZyBVdGY4RW5jb2RpbmcgPSBFbmNvZGluZy5VVEY4OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBUSnNvblByb3RvY29sIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUSnNvblByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IGJhc2UodHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnRleHQgPSBuZXcgSlNPTkJhc2VDb250ZXh0KHRoaXMpOworICAgICAgICAgICAgUmVhZGVyID0gbmV3IExvb2thaGVhZFJlYWRlcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBQdXNoIGEgbmV3IEpTT04gY29udGV4dCBvbnRvIHRoZSBzdGFjay4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUHVzaENvbnRleHQoSlNPTkJhc2VDb250ZXh0IGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnRleHRTdGFjay5QdXNoKENvbnRleHQpOworICAgICAgICAgICAgQ29udGV4dCA9IGM7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUG9wIHRoZSBsYXN0IEpTT04gY29udGV4dCBvZmYgdGhlIHN0YWNrCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCB2b2lkIFBvcENvbnRleHQoKQorICAgICAgICB7CisgICAgICAgICAgICBDb250ZXh0ID0gQ29udGV4dFN0YWNrLlBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBiWzBdOyBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgLy8vICAgICBNYXJrZWQgcHJvdGVjdGVkIHRvIGF2b2lkIHN5bnRoZXRpYyBhY2Nlc3NvciBpbiBKU09OTGlzdENvbnRleHQuUmVhZAorICAgICAgICAvLy8gICAgIGFuZCBKU09OUGFpckNvbnRleHQuUmVhZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgYXN5bmMgVGFzayBSZWFkSnNvblN5bnRheENoYXJBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2ggPSBhd2FpdCBSZWFkZXIuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGlmIChjaCAhPSBieXRlc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICQiVW5leHBlY3RlZCBjaGFyYWN0ZXI6IHsoY2hhcikgY2h9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgV3JpdGUgdGhlIGJ5dGVzIGluIGFycmF5IGJ1ZiBhcyBhIEpTT04gY2hhcmFjdGVycywgZXNjYXBpbmcgYXMgbmVlZGVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBXcml0ZUpzb25TdHJpbmdBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LldyaXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHZhciBsZW4gPSBieXRlcy5MZW5ndGg7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYnl0ZXNbaV0gJiAweDAwRkYpID49IDB4MzApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNbaV0gPT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5CYWNrc2xhc2hbMF0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5CYWNrc2xhc2gsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5CYWNrc2xhc2gsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMuVG9BcnJheSgpLCBpLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3RlbXBCdWZmZXJbMF0gPSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkpzb25DaGFyVGFibGVbYnl0ZXNbaV1dOworICAgICAgICAgICAgICAgICAgICBpZiAoX3RlbXBCdWZmZXJbMF0gPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgaSwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90ZW1wQnVmZmVyWzBdID4gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkJhY2tzbGFzaCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhfdGVtcEJ1ZmZlciwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkVzY1NlcXVlbmNlcywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgX3RlbXBCdWZmZXJbMF0gPSBUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4Q2hhcigoYnl0ZSkgKGJ5dGVzW2ldID4+IDQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF90ZW1wQnVmZmVyWzFdID0gVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleENoYXIoYnl0ZXNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhfdGVtcEJ1ZmZlciwgMCwgMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLCBpdCB3aWxsIGJlCisgICAgICAgIC8vLyAgICAgd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBXcml0ZUpzb25JbnRlZ2VyQXN5bmMobG9uZyBudW0sIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LldyaXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHN0ciA9IG51bS5Ub1N0cmluZygpOworCisgICAgICAgICAgICB2YXIgZXNjYXBlTnVtID0gQ29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnl0ZXMgPSBVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBXcml0ZSBvdXQgYSBkb3VibGUgYXMgYSBKU09OIHZhbHVlLiBJZiBpdCBpcyBOYU4gb3IgaW5maW5pdHkgb3IgaWYgdGhlCisgICAgICAgIC8vLyAgICAgY29udGV4dCBkaWN0YXRlcyBlc2NhcGluZywgV3JpdGUgb3V0IGFzIEpTT04gc3RyaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uRG91YmxlQXN5bmMoZG91YmxlIG51bSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuV3JpdGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgc3RyID0gbnVtLlRvU3RyaW5nKCJHMTciLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIHZhciBzcGVjaWFsID0gZmFsc2U7CisKKyAgICAgICAgICAgIHN3aXRjaCAoc3RyWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJ04nOiAvLyBOYU4KKyAgICAgICAgICAgICAgICBjYXNlICdJJzogLy8gSW5maW5pdHkKKyAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyWzFdID09ICdJJykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gLUluZmluaXR5CisgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGVzY2FwZU51bSA9IHNwZWNpYWwgfHwgQ29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVXRmOEVuY29kaW5nLkdldEJ5dGVzKHN0ciksIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBXcml0ZSBvdXQgY29udGVudHMgb2YgYnl0ZSBhcnJheSBiIGFzIGEgSlNPTiBzdHJpbmcgd2l0aCBiYXNlLTY0IGVuY29kZWQKKyAgICAgICAgLy8vICAgICBkYXRhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBXcml0ZUpzb25CYXNlNjRBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LldyaXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHZhciBsZW4gPSBieXRlcy5MZW5ndGg7CisgICAgICAgICAgICB2YXIgb2ZmID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKGxlbiA+PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEVuY29kZSAzIGJ5dGVzIGF0IGEgdGltZQorICAgICAgICAgICAgICAgIFRCYXNlNjRVdGlscy5FbmNvZGUoYnl0ZXMsIG9mZiwgMywgX3RlbXBCdWZmZXIsIDApOworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoX3RlbXBCdWZmZXIsIDAsIDQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBvZmYgKz0gMzsKKyAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxlbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRW5jb2RlIHJlbWFpbmRlcgorICAgICAgICAgICAgICAgIFRCYXNlNjRVdGlscy5FbmNvZGUoYnl0ZXMsIG9mZiwgbGVuLCBfdGVtcEJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhfdGVtcEJ1ZmZlciwgMCwgbGVuICsgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBXcml0ZUpzb25PYmplY3RTdGFydEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LldyaXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkxlZnRCcmFjZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uT2JqZWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LldyaXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkxlZnRCcmFja2V0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBXcml0ZUpzb25BcnJheUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUmlnaHRCcmFja2V0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25BcnJheVN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKFZlcnNpb24sIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGIgPSBVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMobWVzc2FnZS5OYW1lKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKChsb25nKSBtZXNzYWdlLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhtZXNzYWdlLlNlcUlELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoZmllbGQuSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbk9iamVjdFN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uU3RyaW5nQXN5bmMoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChmaWVsZC5UeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkU3RvcEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQobWFwLktleVR5cGUpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKG1hcC5WYWx1ZVR5cGUpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMobWFwLkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbk9iamVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0QmVnaW5Bc3luYyhUTGlzdCBsaXN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQobGlzdC5FbGVtZW50VHlwZSksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhsaXN0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25BcnJheVN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uU3RyaW5nQXN5bmMoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChzZXQuRWxlbWVudFR5cGUpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoc2V0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhiID8gMSA6IDAsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQnl0ZUFzeW5jKHNieXRlIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoYiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoaTE2LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkzMkFzeW5jKGludCBpMzIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoaTMyLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUk2NEFzeW5jKGxvbmcgaTY0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGk2NCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVEb3VibGVBc3luYyhkb3VibGUgZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkRvdWJsZUFzeW5jKGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RyaW5nQXN5bmMoc3RyaW5nIHMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYiA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQmluYXJ5QXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQmFzZTY0QXN5bmMoYnl0ZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZWFkIGluIGEgSlNPTiBzdHJpbmcsIHVuZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUuLiBTa2lwIFJlYWRpbmcgZnJvbSB0aGUKKyAgICAgICAgLy8vICAgICBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxieXRlW10+IFJlYWRKc29uU3RyaW5nQXN5bmMoYm9vbCBza2lwQ29udGV4dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgYnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjb2RldW5pdHMgPSBuZXcgTGlzdDxjaGFyPigpOworCisKKyAgICAgICAgICAgICAgICBpZiAoIXNraXBDb250ZXh0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gYXdhaXQgUmVhZGVyLlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlWzBdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGVzY2FwZWQ/CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkVzY1NlcXVlbmNlc1swXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVmZmVyLldyaXRlQXN5bmMobmV3W10ge2NofSwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIFx1WFhYWCBhbmQgXD8KKyAgICAgICAgICAgICAgICAgICAgY2ggPSBhd2FpdCBSZWFkZXIuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjU2VxdWVuY2VzWzFdKSAvLyBjb250cm9sIGNoYXJzIGxpa2UgXG4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9mZiA9IEFycmF5LkluZGV4T2YoVEpTT05Qcm90b2NvbENvbnN0YW50cy5Fc2NhcGVDaGFycywgKGNoYXIpIGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmYgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgY29udHJvbCBjaGFyIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjYXBlQ2hhclZhbHVlc1tvZmZdOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVmZmVyLldyaXRlQXN5bmMobmV3W10ge2NofSwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIFx1WFhYWAorICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoX3RlbXBCdWZmZXIsIDAsIDQsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgd2NoID0gKHNob3J0KSAoKFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoX3RlbXBCdWZmZXJbMF0pIDw8IDEyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleFZhbChfdGVtcEJ1ZmZlclsxXSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoX3RlbXBCdWZmZXJbMl0pIDw8IDQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoX3RlbXBCdWZmZXJbM10pKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2hhci5Jc0hpZ2hTdXJyb2dhdGUoKGNoYXIpIHdjaCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkFkZCgoY2hhcikgd2NoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGFyLklzTG93U3Vycm9nYXRlKChjaGFyKSB3Y2gpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQWRkKChjaGFyKSB3Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhjb2RldW5pdHMuVG9BcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1ZmZlci5Xcml0ZUFzeW5jKHRtcCwgMCwgdG1wLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG1wID0gVXRmOEVuY29kaW5nLkdldEJ5dGVzKG5ld1tdIHsoY2hhcikgd2NofSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBidWZmZXIuV3JpdGVBc3luYyh0bXAsIDAsIHRtcC5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5Ub0FycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBpbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsIHZhbGlkIGluIEpTT04gbnVtYmVycy4gRG9lcworICAgICAgICAvLy8gICAgIG5vdCBkbyBhIGNvbXBsZXRlIHJlZ2V4IGNoZWNrIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhIG51bWJlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHN0cmluZz4gUmVhZEpzb25OdW1lcmljQ2hhcnNBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0cmJsZCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1RPRE86IHdvcmthcm91bmQgZm9yIHByaW1pdGl2ZSB0eXBlcyB3aXRoIFRKc29uUHJvdG9jb2wsIHRoaW5rIC0gaG93IHRvIHJld3JpdGUgaW50byBtb3JlIGVhc3kgZm9ybSB3aXRob3V0IGV4Y2VwdGlvbnMKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IGF3YWl0IFJlYWRlci5QZWVrQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoIVRKU09OUHJvdG9jb2xIZWxwZXIuSXNKc29uTnVtZXJpYyhjaCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhciBjID0gKGNoYXIpYXdhaXQgUmVhZGVyLlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIHN0cmJsZC5BcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0cmJsZC5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBKU09OIG51bWJlci4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMsIFJlYWQgaW4gZW5jbG9zaW5nIHF1b3Rlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRKc29uSW50ZWdlckFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoQ29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc3RyID0gYXdhaXQgUmVhZEpzb25OdW1lcmljQ2hhcnNBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoQ29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9uZy5QYXJzZShzdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBpbiBhIEpTT04gZG91YmxlIHZhbHVlLiBUaHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHdyYXBwZWQgaW4gcXVvdGVzCisgICAgICAgIC8vLyAgICAgd2hlbiBleHBlY3RlZCBvciBpZiB3cmFwcGVkIGluIHF1b3RlcyB3aGVuIG5vdCBleHBlY3RlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZEpzb25Eb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGF3YWl0IFJlYWRlci5QZWVrQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pID09IFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGVbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFyciA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmModHJ1ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIHZhciBkdWIgPSBkb3VibGUuUGFyc2UoVXRmOEVuY29kaW5nLkdldFN0cmluZyhhcnIsIDAsIGFyci5MZW5ndGgpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKworICAgICAgICAgICAgICAgIGlmICghQ29udGV4dC5Fc2NhcGVOdW1iZXJzKCkgJiYgIWRvdWJsZS5Jc05hTihkdWIpICYmICFkb3VibGUuSXNJbmZpbml0eShkdWIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGR1YjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKENvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlLlBhcnNlKGF3YWl0IFJlYWRKc29uTnVtZXJpY0NoYXJzQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBKU09OIHN0cmluZyBjb250YWluaW5nIGJhc2UtNjQgZW5jb2RlZCBkYXRhIGFuZCBkZWNvZGUgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxieXRlW10+IFJlYWRKc29uQmFzZTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBiID0gYXdhaXQgUmVhZEpzb25TdHJpbmdBc3luYyhmYWxzZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIGxlbiA9IGIuTGVuZ3RoOworICAgICAgICAgICAgdmFyIG9mZiA9IDA7CisgICAgICAgICAgICB2YXIgc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIC8vIHJlZHVjZSBsZW4gdG8gaWdub3JlIGZpbGwgYnl0ZXMKKyAgICAgICAgICAgIHdoaWxlICgobGVuID4gMCkgJiYgKGJbbGVuIC0gMV0gPT0gJz0nKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAtLWxlbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmVhZCAmIGRlY29kZSBmdWxsIGJ5dGUgdHJpcGxldHMgPSA0IHNvdXJjZSBieXRlcworICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRGVjb2RlIDQgYnl0ZXMgYXQgYSB0aW1lCisgICAgICAgICAgICAgICAgVEJhc2U2NFV0aWxzLkRlY29kZShiLCBvZmYsIDQsIGIsIHNpemUpOyAvLyBOQjogZGVjb2RlZCBpbiBwbGFjZQorICAgICAgICAgICAgICAgIG9mZiArPSA0OworICAgICAgICAgICAgICAgIGxlbiAtPSA0OworICAgICAgICAgICAgICAgIHNpemUgKz0gMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRG9uJ3QgZGVjb2RlIGlmIHdlIGhpdCB0aGUgZW5kIG9yIGdvdCBhIHNpbmdsZSBsZWZ0b3ZlciBieXRlIChpbnZhbGlkCisgICAgICAgICAgICAvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIGV4VHlwZSkKKyAgICAgICAgICAgIGlmIChsZW4gPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIERlY29kZSByZW1haW5kZXIKKyAgICAgICAgICAgICAgICBUQmFzZTY0VXRpbHMuRGVjb2RlKGIsIG9mZiwgbGVuLCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKKyAgICAgICAgICAgICAgICBzaXplICs9IGxlbiAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNhZGx5IHdlIG11c3QgY29weSB0aGUgYnl0ZVtdIChhbnkgd2F5IGFyb3VuZCB0aGlzPykKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoYiwgMCwgcmVzdWx0LCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkxlZnRCcmFjZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25PYmplY3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25BcnJheVN0YXJ0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuTGVmdEJyYWNrZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OTGlzdENvbnRleHQodGhpcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFJlYWRKc29uQXJyYXlFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNrZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pICE9IFZlcnNpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IFV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSAoaW50KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbk9iamVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRGaWVsZD4gUmVhZEZpZWxkQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgICAgICAgICAgdmFyIGNoID0gYXdhaXQgUmVhZGVyLlBlZWtBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoY2ggPT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNlWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5TdG9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLklEID0gKHNob3J0KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBmaWVsZC5UeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgVE1hcCgpOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheVN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgbWFwLktleVR5cGUgPSBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgICAgICBtYXAuVmFsdWVUeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgbWFwLkNvdW50ID0gKGludCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFRMaXN0KCk7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBsaXN0LkVsZW1lbnRUeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgbGlzdC5Db3VudCA9IChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRTZXQ+IFJlYWRTZXRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2V0ID0gbmV3IFRTZXQoKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHNldC5FbGVtZW50VHlwZSA9IFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZUlkRm9yVHlwZU5hbWUoYXdhaXQgUmVhZEpzb25TdHJpbmdBc3luYyhmYWxzZSwgY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgICAgIHNldC5Db3VudCA9IChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pICE9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c2hvcnQ+IFJlYWRJMTZBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRKc29uRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gVXRmOEVuY29kaW5nLkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSnNvbkJhc2U2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBJVFByb3RvY29sRmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIEdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSnNvblByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUKKyAgICAgICAgLy8vICAgICBpbnNlcnRpbmcvUmVhZGluZyBhZGRpdGlvbmFsIEpTT04gc3ludGF4IGNoYXJhY3RlcnMKKyAgICAgICAgLy8vICAgICBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIFRKc29uUHJvdG9jb2wgUHJvdG87CisKKyAgICAgICAgICAgIHB1YmxpYyBKU09OQmFzZUNvbnRleHQoVEpzb25Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQcm90byA9IHByb3RvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBFc2NhcGVOdW1iZXJzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ29udGV4dCBmb3IgSlNPTiBsaXN0cy4gV2lsbCBpbnNlcnQvUmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQKKyAgICAgICAgLy8vICAgICBmb3IgdGhlIGZpcnN0IG9uZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkxpc3RDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfZmlyc3QgPSB0cnVlOworCisgICAgICAgICAgICBwdWJsaWMgSlNPTkxpc3RDb250ZXh0KFRKc29uUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9maXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm90by5SZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENvbnRleHQgZm9yIEpTT04gcmVjb3Jkcy4gV2lsbCBpbnNlcnQvUmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uCisgICAgICAgIC8vLyAgICAgb2YgZWFjaCByZWNvcmQgcGFpciwgYW5kIGNvbW1hcyBiZWZvcmUgZWFjaCBrZXkgZXhjZXB0IHRoZSBmaXJzdC4gSW4KKyAgICAgICAgLy8vICAgICBhZGRpdGlvbiwgd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMgaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlCisgICAgICAgIC8vLyAgICAgZXNjYXBlZCBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfY29sb24gPSB0cnVlOworCisgICAgICAgICAgICBwcml2YXRlIGJvb2wgX2ZpcnN0ID0gdHJ1ZTsKKworICAgICAgICAgICAgcHVibGljIEpTT05QYWlyQ29udGV4dChUSnNvblByb3RvY29sIHByb3RvKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb3RvLlRyYW5zLldyaXRlQXN5bmMoX2NvbG9uID8gVEpTT05Qcm90b2NvbENvbnN0YW50cy5Db2xvbiA6IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29tbWEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbG9uID0gIV9jb2xvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb3RvLlJlYWRKc29uU3ludGF4Q2hhckFzeW5jKF9jb2xvbiA/IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29sb24gOiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9ICFfY29sb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFc2NhcGVOdW1iZXJzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbG9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIF9kYXRhID0gbmV3IGJ5dGVbMV07CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfaGFzRGF0YTsKKyAgICAgICAgICAgIHByb3RlY3RlZCBUSnNvblByb3RvY29sIFByb3RvOworCisgICAgICAgICAgICBwdWJsaWMgTG9va2FoZWFkUmVhZGVyKFRKc29uUHJvdG9jb2wgcHJvdG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUHJvdG8gPSBwcm90bzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vICAgICBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgICAgICAgICAvLy8gICAgIGRhdGEgYnVmZmVyIGlmIHByZXNlbnQgb3IgZ2V0dGluZyBpdCBmcm9tIHRoZSB0cmFuc3BvcnQgb3RoZXJ3aXNlLgorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGJ5dGU+IFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ynl0ZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChfaGFzRGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9oYXNEYXRhID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbW9yZSBlYXN5IHdheSB0byBhdm9pZCBleGNlcHRpb24gb24gcmVhZGluZyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuUmVhZEFsbEFzeW5jKF9kYXRhLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZGF0YVswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vICAgICBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCisgICAgICAgICAgICAvLy8gICAgIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFsUmVhZHkuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ynl0ZT4gUGVla0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxieXRlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFfaGFzRGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbW9yZSBlYXN5IHdheSB0byBhdm9pZCBleGNlcHRpb24gb24gcmVhZGluZyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuUmVhZEFsbEFzeW5jKF9kYXRhLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9oYXNEYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RhdGFbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzhjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcwpAQCAtMCwwICsxLDkxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbC5FbnRpdGllczsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAoreworICAgIC8qKgorICAgICogVE11bHRpcGxleGVkUHJvdG9jb2wgaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IgdGhhdCBhbGxvd3MgYSBUaHJpZnQKKyAgICAqIGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsIGJ5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgICogdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorICAgICoKKyAgICAqIE5PVEU6IFRISVMgSVMgTk9UIFRPIEJFIFVTRUQgQlkgU0VSVkVSUy4KKyAgICAqIE9uIHRoZSBzZXJ2ZXIsIHVzZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgdG8gaGFuZGxlIHJlcXVlc3RzIGZyb20gYSBtdWx0aXBsZXhpbmcgY2xpZW50LgorICAgICoKKyAgICAqIFRoaXMgZXhhbXBsZSB1c2VzIGEgc2luZ2xlIHNvY2tldCB0cmFuc3BvcnQgdG8gaW52b2tlIHR3byBzZXJ2aWNlczoKKyAgICAqCisgICAgKiAgICAgVFNvY2tldFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldFRyYW5zcG9ydCgibG9jYWxob3N0IiwgOTA5MCk7CisgICAgKiAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAqCisgICAgKiAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICoKKyAgICAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIkNhbGN1bGF0b3IiKTsKKyAgICAqICAgICBDYWxjdWxhdG9yLkNsaWVudCBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG1wKTsKKyAgICAqCisgICAgKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAyID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiV2VhdGhlclJlcG9ydCIpOworICAgICogICAgIFdlYXRoZXJSZXBvcnQuQ2xpZW50IHNlcnZpY2UyID0gbmV3IFdlYXRoZXJSZXBvcnQuQ2xpZW50KG1wMik7CisgICAgKgorICAgICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlLmFkZCgyLDIpKTsKKyAgICAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZTIuZ2V0VGVtcGVyYXR1cmUoKSk7CisgICAgKgorICAgICovCisKKyAgICAvL1RPRE86IGltcGxlbWVudGF0aW9uIG9mIFRQcm90b2NvbAorCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKKyAgICB7CisgICAgICAgIC8qKiBVc2VkIHRvIGRlbGltaXQgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBmdW5jdGlvbiBuYW1lICovCisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgU2VwYXJhdG9yID0gIjoiOworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9zZXJ2aWNlTmFtZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQorICAgICAgICAgKiBtdWx0aXBsZXhpbmcgc2VydmVyLiAgVGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgICAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZGVyIHNvIHRoYXQgdGhlIG11bHRpcGxleGluZyBzZXJ2ZXIgY2FuIGJyb2tlcgorICAgICAgICAgKiB0aGUgZnVuY3Rpb24gY2FsbCB0byB0aGUgcHJvcGVyIHNlcnZpY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEFyZ3M6CisgICAgICAgICAqICBwcm90b2NvbCAgICAgICAgWW91ciBjb21tdW5pY2F0aW9uIHByb3RvY29sIG9mIGNob2ljZSwgZS5nLiBUQmluYXJ5UHJvdG9jb2wKKyAgICAgICAgICogIHNlcnZpY2VOYW1lICAgICBUaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuCisgICAgICAgICAqLworCisgICAgICAgIHB1YmxpYyBUTXVsdGlwbGV4ZWRQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIHN0cmluZyBzZXJ2aWNlTmFtZSkKKyAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgX3NlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UuVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5DYWxsOgorICAgICAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLk9uZXdheToKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgYmFzZS5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZSgkIntfc2VydmljZU5hbWV9e1NlcGFyYXRvcn17bWVzc2FnZS5OYW1lfSIsIG1lc3NhZ2UuVHlwZSwgbWVzc2FnZS5TZXFJRCksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgYmFzZS5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG1lc3NhZ2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2wuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjOTFlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL1RQcm90b2NvbC5jcwpAQCAtMCwwICsxLDM3NiBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbC5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wgOiBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0UmVjdXJzaW9uRGVwdGggPSA2NDsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworICAgICAgICBwcm90ZWN0ZWQgaW50IFJlY3Vyc2lvbkRlcHRoOworCisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0IFRyYW5zOworCisgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnMgPSB0cmFuczsKKyAgICAgICAgICAgIFJlY3Vyc2lvbkxpbWl0ID0gRGVmYXVsdFJlY3Vyc2lvbkRlcHRoOworICAgICAgICAgICAgUmVjdXJzaW9uRGVwdGggPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgVHJhbnNwb3J0ID0+IFRyYW5zOworCisgICAgICAgIHByb3RlY3RlZCBpbnQgUmVjdXJzaW9uTGltaXQgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBEaXNwb3NlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUmVjdXJzaW9uRGVwdGggPCBSZWN1cnNpb25MaW1pdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK1JlY3Vyc2lvbkRlcHRoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkRFUFRIX0xJTUlULCAiRGVwdGggbGltaXQgZXhjZWVkZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkKKyAgICAgICAgeworICAgICAgICAgICAgLS1SZWN1cnNpb25EZXB0aDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKFRyYW5zIGFzIElEaXNwb3NhYmxlKT8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhUTWVzc2FnZSBtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhUTWVzc2FnZSBtZXNzYWdlLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKFRTdHJ1Y3QgQHN0cnVjdCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKEBzdHJ1Y3QsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKFRTdHJ1Y3QgQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZVN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkFzeW5jKFRGaWVsZCBmaWVsZCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVGaWVsZEJlZ2luQXN5bmMoVEZpZWxkIGZpZWxkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUZpZWxkRW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVGaWVsZFN0b3BBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUZpZWxkU3RvcEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlTWFwQmVnaW5Bc3luYyhUTWFwIG1hcCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVNYXBCZWdpbkFzeW5jKG1hcCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZU1hcEJlZ2luQXN5bmMoVE1hcCBtYXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlTWFwRW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUxpc3RCZWdpbkFzeW5jKFRMaXN0IGxpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTGlzdEJlZ2luQXN5bmMobGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUxpc3RCZWdpbkFzeW5jKFRMaXN0IGxpc3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlTGlzdEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlU2V0QmVnaW5Bc3luYyhzZXQsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUJvb2xBc3luYyhiLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVCeXRlQXN5bmMoc2J5dGUgYikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoYiwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVJMTZBc3luYyhpMTYsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlSTMyQXN5bmMoaW50IGkzMikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhpMzIsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUk2NEFzeW5jKGxvbmcgaTY0KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUk2NEFzeW5jKGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUk2NEFzeW5jKGxvbmcgaTY0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZURvdWJsZUFzeW5jKGQsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVEb3VibGVBc3luYyhkb3VibGUgZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVTdHJpbmdBc3luYyhzdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVTdHJpbmdBc3luYyhzLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVTdHJpbmdBc3luYyhzdHJpbmcgcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBieXRlcyA9IEVuY29kaW5nLlVURjguR2V0Qnl0ZXMocyk7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQmluYXJ5QXN5bmMoYnl0ZVtdIGJ5dGVzKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQmluYXJ5QXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxUTWVzc2FnZT4gUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgUmVhZE1lc3NhZ2VFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRTdHJ1Y3Q+IFJlYWRTdHJ1Y3RCZWdpbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRTdHJ1Y3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRGaWVsZD4gUmVhZEZpZWxkQmVnaW5Bc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxUTWFwPiBSZWFkTWFwQmVnaW5Bc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkTWFwQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFJlYWRNYXBFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxUTGlzdD4gUmVhZExpc3RCZWdpbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRMaXN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgUmVhZExpc3RFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRTZXQ+IFJlYWRTZXRCZWdpbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRTZXRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgUmVhZFNldEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZFNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgUmVhZFNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGJvb2w+IFJlYWRCb29sQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEJvb2xBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPGJvb2w+IFJlYWRCb29sQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8c2J5dGU+IFJlYWRCeXRlQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPHNieXRlPiBSZWFkQnl0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPHNob3J0PiBSZWFkSTE2QXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8c2hvcnQ+IFJlYWRJMTZBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxpbnQ+IFJlYWRJMzJBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxpbnQ+IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEk2NEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8bG9uZz4gUmVhZEk2NEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZERvdWJsZUFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPGRvdWJsZT4gUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPHN0cmluZz4gUmVhZFN0cmluZ0FzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRTdHJpbmdBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBhd2FpdCBSZWFkQmluYXJ5QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGJ5dGVbXT4gUmVhZEJpbmFyeUFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRCaW5hcnlBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPGJ5dGVbXT4gUmVhZEJpbmFyeUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YTQzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuY3MKQEAgLTAsMCArMSwyNDcgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sLkVudGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgICBUUHJvdG9jb2xEZWNvcmF0b3IgZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkIFRQcm90b2NvbCBpbnN0YW5jZSwKKyAgICAvLy8gICAgIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZSBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy5XaGlsZSBpdCBoYXMKKyAgICAvLy8gICAgIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0IGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLAorICAgIC8vLyAgICAgaXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIFRQcm90b2NvbC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFByb3RvY29sIF93cmFwcGVkUHJvdG9jb2w7CisKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbERlY29yYXRvcihUUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wuVHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBfd3JhcHBlZFByb3RvY29sID0gcHJvdG9jb2wgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YocHJvdG9jb2wpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhtZXNzYWdlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoQHN0cnVjdCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkFzeW5jKFRGaWVsZCBmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkU3RvcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwQmVnaW5Bc3luYyhUTWFwIG1hcCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBCZWdpbkFzeW5jKG1hcCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZU1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0QmVnaW5Bc3luYyhsaXN0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUxpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlU2V0QmVnaW5Bc3luYyhzZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJvb2xBc3luYyhib29sIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlQm9vbEFzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQnl0ZUFzeW5jKHNieXRlIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlQnl0ZUFzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTE2QXN5bmMoc2hvcnQgaTE2LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUkxNkFzeW5jKGkxNiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUkzMkFzeW5jKGkzMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVJNjRBc3luYyhpNjQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlRG91YmxlQXN5bmMoZCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJpbmdBc3luYyhzdHJpbmcgcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJpbmdBc3luYyhzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVCaW5hcnlBc3luYyhieXRlcywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxURmllbGQ+IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRNYXBCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkTWFwRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VExpc3Q+IFJlYWRMaXN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZExpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU2V0PiBSZWFkU2V0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZFNldEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkQm9vbEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNieXRlPiBSZWFkQnl0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNob3J0PiBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEk2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTdHJpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxieXRlW10+IFJlYWRCaW5hcnlBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEJpbmFyeUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI4YmFiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDYyIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBSZVNoYXJwZXIgZGlzYWJsZSBJbmNvbnNpc3RlbnROYW1pbmcKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAoreworICAgIHB1YmxpYyBjbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBkbyBub3QgcmVuYW1lIHB1YmxpYyBjb25zdGFudHMgLSB0aGV5IHVzZWQgaW4gZ2VuZXJhdGVkIGZpbGVzCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBORUdBVElWRV9TSVpFID0gMjsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBTSVpFX0xJTUlUID0gMzsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTk9UX0lNUExFTUVOVEVEID0gNTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBERVBUSF9MSU1JVCA9IDY7CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBUeXBlID0gVU5LTk9XTjsKKworICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSwgRXhjZXB0aW9uIGlubmVyID0gbnVsbCkKKyAgICAgICAgICAgIDogYmFzZShzdHJpbmcuRW1wdHksIGlubmVyKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUsIHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgR2V0RXhjZXB0aW9uVHlwZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUeXBlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL1V0aWxpdGllcy9UQmFzZTY0VXRpbHMuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9VdGlsaXRpZXMvVEJhc2U2NFV0aWxzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjhmODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9VdGlsaXRpZXMvVEJhc2U2NFV0aWxzLmNzCkBAIC0wLDAgKzEsMTAxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wuVXRpbGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgVEJhc2U2NFV0aWxzCisgICAgeworICAgICAgICAvL1RPRE86IENvbnN0YW50cworICAgICAgICAvL1RPRE86IENoZWNrIGZvciBhcmdzCisgICAgICAgIC8vVE9ETzogVW5pdGVzdHMKKworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRW5jb2RlVGFibGUgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50W10gRGVjb2RlVGFibGUgPQorICAgICAgICB7CisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA2MiwgLTEsIC0xLCAtMSwgNjMsCisgICAgICAgICAgICA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsCisgICAgICAgICAgICAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLAorICAgICAgICAgICAgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xCisgICAgICAgIH07CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgRW5jb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sIGJ5dGVbXSBkc3QsIGludCBkc3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzcmMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihzcmMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0W2RzdE9mZl0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKHNyY1tzcmNPZmZdID4+IDIpICYgMHgzRl07CisKKyAgICAgICAgICAgIGlmIChsZW4gPT0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmICsgMV0gPj4gNCkgJiAweDBGKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzQykgfCAoKHNyY1tzcmNPZmYgKyAyXSA+PiA2KSAmIDB4MDMpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgM10gPSAoYnl0ZSkgRW5jb2RlVGFibGVbc3JjW3NyY09mZiArIDJdICYgMHgzRl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZW4gPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmICsgMV0gPj4gNCkgJiAweDBGKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0gKGJ5dGUpIEVuY29kZVRhYmxlWyhzcmNbc3JjT2ZmICsgMV0gPDwgMikgJiAweDNDXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBsZW4gPT0gMQorICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIERlY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCBieXRlW10gZHN0LCBpbnQgZHN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yoc3JjKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpICgoRGVjb2RlVGFibGVbc3JjW3NyY09mZl0gJiAweDBGRl0gPDwgMikgfCAoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDFdICYgMHgwRkZdID4+IDQpKTsKKworICAgICAgICAgICAgaWYgKGxlbiA+IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICgoKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA8PCA0KSAmIDB4RjApIHwgKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAyXSAmIDB4MEZGXSA+PiAyKSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAoKChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPDwgNikgJiAweEMwKSB8IERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAzXSAmIDB4MEZGXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL1V0aWxpdGllcy9USnNvblByb3RvY29sQ29uc3RhbnRzLmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xDb25zdGFudHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjMTMwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1Byb3RvY29sL1V0aWxpdGllcy9USnNvblByb3RvY29sQ29uc3RhbnRzLmNzCkBAIC0wLDAgKzEsNjEgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wuVXRpbGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRKU09OUHJvdG9jb2xDb25zdGFudHMKKyAgICB7CisgICAgICAgIC8vVE9ETyBDaGVjayBmb3IgcGVyZm9ybWFuY2UgZm9yIHJldXNpbmcgSW1tdXRhYmxlQXJyYXkgZnJvbSBTeXN0ZW0uQ29sbGVjdGlvbnMuSW1tdXRhYmxlIChodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS9kb3RuZXQvMjAxMy8wNi8yNC9wbGVhc2Utd2VsY29tZS1pbW11dGFibGVhcnJheXQvKQorICAgICAgICAvLyBjYW4gYmUgcG9zc2libGUgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZSBhbmQgYWxzbyBiZXR0ZXIgR0MKKworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBDb21tYSA9IHsoYnl0ZSkgJywnfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gQ29sb24gPSB7KGJ5dGUpICc6J307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIExlZnRCcmFjZSA9IHsoYnl0ZSkgJ3snfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gUmlnaHRCcmFjZSA9IHsoYnl0ZSkgJ30nfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTGVmdEJyYWNrZXQgPSB7KGJ5dGUpICdbJ307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIFJpZ2h0QnJhY2tldCA9IHsoYnl0ZSkgJ10nfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gUXVvdGUgPSB7KGJ5dGUpICciJ307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEJhY2tzbGFzaCA9IHsoYnl0ZSkgJ1xcJ307CisKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gSnNvbkNoYXJUYWJsZSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIChieXRlKSAnYicsIChieXRlKSAndCcsIChieXRlKSAnbicsIDAsIChieXRlKSAnZicsIChieXRlKSAncicsIDAsIDAsCisgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgMSwgMSwgKGJ5dGUpICciJywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY2hhcltdIEVzY2FwZUNoYXJzID0gIlwiXFwvYmZucnQiLlRvQ2hhckFycmF5KCk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEVzY2FwZUNoYXJWYWx1ZXMgPSB7KGJ5dGUpICciJywgKGJ5dGUpICdcXCcsIChieXRlKSAnLycsIChieXRlKSAnXGInLCAoYnl0ZSkgJ1xmJywgKGJ5dGUpICdcbicsIChieXRlKSAnXHInLCAoYnl0ZSkgJ1x0J307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEVzY1NlcXVlbmNlcyA9IHsoYnl0ZSkgJ1xcJywgKGJ5dGUpICd1JywgKGJ5dGUpICcwJywgKGJ5dGUpICcwJ307CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlTmFtZXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZUJvb2wgPSB7IChieXRlKSd0JywgKGJ5dGUpJ2YnIH07CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBOYW1lQnl0ZSA9IHsgKGJ5dGUpJ2knLCAoYnl0ZSknOCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJMTYgPSB7IChieXRlKSdpJywgKGJ5dGUpJzEnLCAoYnl0ZSknNicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJMzIgPSB7IChieXRlKSdpJywgKGJ5dGUpJzMnLCAoYnl0ZSknMicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJNjQgPSB7IChieXRlKSdpJywgKGJ5dGUpJzYnLCAoYnl0ZSknNCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVEb3VibGUgPSB7IChieXRlKSdkJywgKGJ5dGUpJ2InLCAoYnl0ZSknbCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVTdHJ1Y3QgPSB7IChieXRlKSdyJywgKGJ5dGUpJ2UnLCAoYnl0ZSknYycgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVTdHJpbmcgPSB7IChieXRlKSdzJywgKGJ5dGUpJ3QnLCAoYnl0ZSkncicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVNYXAgPSB7IChieXRlKSdtJywgKGJ5dGUpJ2EnLCAoYnl0ZSkncCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVMaXN0ID0geyAoYnl0ZSknbCcsIChieXRlKSdzJywgKGJ5dGUpJ3QnIH07CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBOYW1lU2V0ID0geyAoYnl0ZSkncycsIChieXRlKSdlJywgKGJ5dGUpJ3QnIH07CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xIZWxwZXIuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbEhlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQ5ZWJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xIZWxwZXIuY3MKQEAgLTAsMCArMSwxNzYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFRocmlmdC5Qcm90b2NvbC5FbnRpdGllczsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbC5VdGlsaXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVEpTT05Qcm90b2NvbEhlbHBlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gR2V0VHlwZU5hbWVGb3JUeXBlSWQoVFR5cGUgdHlwZUlkKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGVJZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJvb2w6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lQm9vbDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJ5dGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lQnl0ZTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMTY7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lSTMyOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUk2NDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVEb3VibGU7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJpbmc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lU3RyaW5nOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RydWN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVN0cnVjdDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLk1hcDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVNYXA7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TZXQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lU2V0OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVMaXN0OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwgIlVucmVjb2duaXplZCBleFR5cGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVFR5cGUgR2V0VHlwZUlkRm9yVHlwZU5hbWUoYnl0ZVtdIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUVHlwZS5TdG9wOworICAgICAgICAgICAgaWYgKG5hbWUuTGVuZ3RoID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWVbMF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnZCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5Eb3VibGU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ2knOgorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICc4JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQnl0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJzEnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICczJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnNic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkk2NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ2wnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuTGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnbSc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5NYXA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ3InOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU3RydWN0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdzJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lWzFdID09IChieXRlKSAndCcpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZVsxXSA9PSAoYnl0ZSkgJ2UnKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAndCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5Cb29sOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBUVHlwZS5TdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwgIlVucmVjb2duaXplZCBleFR5cGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGJ5dGUgY291bGQgYmUgYSB2YWxpZCBwYXJ0IG9mIGEgSlNPTiBudW1iZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBJc0pzb25OdW1lcmljKGJ5dGUgYikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJysnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJy0nOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJy4nOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzAnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzEnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzInOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzMnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzQnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzUnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzYnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzcnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzgnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzknOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ0UnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ2UnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCBjaGFyICgnMCctJzknIG9yICdhJy0nZicpIGludG8gaXRzCisgICAgICAgIC8vLyAgICAgY29ycmVzcG9uZGluZyBoZXggdmFsdWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlIFRvSGV4VmFsKGJ5dGUgY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnMCcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaCArPSAxMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJ2EnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciIpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggdmFsdWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgaGV4IGNoYXJhY3RlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGUgVG9IZXhDaGFyKGJ5dGUgdmFsKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwgJj0gMHgwRjsKKyAgICAgICAgICAgIGlmICh2YWwgPCAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKXZhbCArICcwJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWwgLT0gMTA7CisgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKXZhbCArICdhJyk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvVXRpbGl0aWVzL1RQcm90b2NvbFV0aWwuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9Qcm90b2NvbC9VdGlsaXRpZXMvVFByb3RvY29sVXRpbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGY5MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvUHJvdG9jb2wvVXRpbGl0aWVzL1RQcm90b2NvbFV0aWwuY3MKQEAgLTAsMCArMSwxMTAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sLkVudGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sLlV0aWxpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUUHJvdG9jb2xVdGlsCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIFRhc2sgU2tpcEFzeW5jKFRQcm90b2NvbCBwcm90b2NvbCwgVFR5cGUgdHlwZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3RvY29sLkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJvb2w6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkQm9vbEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJ5dGU6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEk2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWREb3VibGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cnkgdG8gZGVjb2RlIHRoZSBzdHJpbmcsIGp1c3Qgc2tpcCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBhd2FpdCBwcm90b2NvbC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5NYXA6CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFwID0gYXdhaXQgcHJvdG9jb2wuUmVhZE1hcEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXAuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBTa2lwQXN5bmMocHJvdG9jb2wsIG1hcC5LZXlUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2tpcEFzeW5jKHByb3RvY29sLCBtYXAuVmFsdWVUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTWFwRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNldCA9IGF3YWl0IHByb3RvY29sLlJlYWRTZXRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0LkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2tpcEFzeW5jKHByb3RvY29sLCBzZXQuRWxlbWVudFR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5MaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBhd2FpdCBwcm90b2NvbC5SZWFkTGlzdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0LkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2tpcEFzeW5jKHByb3RvY29sLCBsaXN0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTGlzdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiVW5rbm93biBkYXRhIHR5cGUgIiArIHR5cGUuVG9TdHJpbmcoImQiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb3RvY29sLkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9TZXJ2ZXIvVFNlcnZlci5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1NlcnZlci9UU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNTE5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9TZXJ2ZXIvVFNlcnZlci5jcwpAQCAtMCwwICsxLDg3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmc7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlByb2Nlc3NvcjsKKworbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgSUxvZ2dlciBMb2dnZXI7CisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBJbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IElucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIElUUHJvY2Vzc29yRmFjdG9yeSBQcm9jZXNzb3JGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgSVRQcm90b2NvbEZhY3RvcnkgT3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFRyYW5zcG9ydEZhY3RvcnkgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlckV2ZW50SGFuZGxlciBTZXJ2ZXJFdmVudEhhbmRsZXI7CisgICAgICAgIHByb3RlY3RlZCBUU2VydmVyVHJhbnNwb3J0IFNlcnZlclRyYW5zcG9ydDsKKworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlcihJVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwgSVRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgSUxvZ2dlciBsb2dnZXIgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBQcm9jZXNzb3JGYWN0b3J5ID0gcHJvY2Vzc29yRmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihwcm9jZXNzb3JGYWN0b3J5KSk7CisgICAgICAgICAgICBTZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgICAgICBJbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgPz8gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7CisgICAgICAgICAgICBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA/PyBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsKKyAgICAgICAgICAgIElucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaW5wdXRQcm90b2NvbEZhY3RvcnkpKTsKKyAgICAgICAgICAgIE91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihvdXRwdXRQcm90b2NvbEZhY3RvcnkpKTsKKyAgICAgICAgICAgIExvZ2dlciA9IGxvZ2dlcjsgLy8gbnVsbCBpcyBhYnNvbHV0ZWx5IGxlZ2FsCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXRFdmVudEhhbmRsZXIoVFNlcnZlckV2ZW50SGFuZGxlciBzZWgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcnZlckV2ZW50SGFuZGxlciA9IHNlaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIEdldEV2ZW50SGFuZGxlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTZXJ2ZXJFdmVudEhhbmRsZXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2cgZGVsZWdhdGlvbj8gZGVwcmVjYXRlZCwgdXNlIElMb2dnZXIgCisgICAgICAgIHByb3RlY3RlZCB2b2lkIExvZ0Vycm9yKCBzdHJpbmcgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoTG9nZ2VyICE9IG51bGwpCisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKG1zZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTdG9wKCk7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTdGFydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzMWJmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzCkBAIC0wLDAgKzEsNTQgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKK3sKKyAgICAvL1RPRE86IHJlcGxhY2VtZW50IGJ5IGV2ZW50PworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHNlcnZlciB1c2VycyB0byBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlcgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zICovCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRhc2sgUHJlU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nICovCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRhc2s8b2JqZWN0PiBDcmVhdGVDb250ZXh0QXN5bmMoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGRlbGV0ZSBzZXJ2ZXIgY29udGV4dCAqLworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUYXNrIERlbGV0ZUNvbnRleHRBc3luYyhvYmplY3Qgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IgKi8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVGFzayBQcm9jZXNzQ29udGV4dEFzeW5jKG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUVHJhbnNwb3J0IHRyYW5zcG9ydCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9TZXJ2ZXIvVFNpbXBsZUFzeW5jU2VydmVyLmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvU2VydmVyL1RTaW1wbGVBc3luY1NlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGEzZTRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvU2VydmVyL1RTaW1wbGVBc3luY1NlcnZlci5jcwpAQCAtMCwwICsxLDE5NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlByb2Nlc3NvcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuU2VydmVyCit7CisgICAgLy9UT0RPOiB1bmhhbmRsZWQgZXhjZXB0aW9ucywgZXRjLgorCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFNpbXBsZUFzeW5jU2VydmVyIDogVFNlcnZlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NsaWVudFdhaXRpbmdEZWxheTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBUYXNrIF9zZXJ2ZXJUYXNrOworCisgICAgICAgIHB1YmxpYyBUU2ltcGxlQXN5bmNTZXJ2ZXIoSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnksIGludCBjbGllbnRXYWl0aW5nRGVsYXkgPSAxMCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgIGxvZ2dlckZhY3RvcnkuQ3JlYXRlTG9nZ2VyKG5hbWVvZihUU2ltcGxlQXN5bmNTZXJ2ZXIpKSwgY2xpZW50V2FpdGluZ0RlbGF5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNpbXBsZUFzeW5jU2VydmVyKElUUHJvY2Vzc29yRmFjdG9yeSBpdFByb2Nlc3NvckZhY3RvcnksIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIElMb2dnZXIgbG9nZ2VyLCBpbnQgY2xpZW50V2FpdGluZ0RlbGF5ID0gMTApCisgICAgICAgICAgICA6IGJhc2UoaXRQcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dnZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jbGllbnRXYWl0aW5nRGVsYXkgPSBjbGllbnRXYWl0aW5nRGVsYXk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBTZXJ2ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBjYW5jZWxhdGlvbiB0b2tlbgorICAgICAgICAgICAgICAgIF9zZXJ2ZXJUYXNrID0gVGFzay5GYWN0b3J5LlN0YXJ0TmV3KCgpID0+IFN0YXJ0TGlzdGVuaW5nKGNhbmNlbGxhdGlvblRva2VuKSwgVGFza0NyZWF0aW9uT3B0aW9ucy5Mb25nUnVubmluZyk7CisgICAgICAgICAgICAgICAgYXdhaXQgX3NlcnZlclRhc2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dFcnJvcihleC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBTdGFydExpc3RlbmluZyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgU2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIlN0YXJ0ZWQgbGlzdGVuaW5nIGF0IHNlcnZlciIpOworCisgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgU2VydmVyRXZlbnRIYW5kbGVyLlByZVNlcnZlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoIWNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJUcmFuc3BvcnQuSXNDbGllbnRQZW5kaW5nKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIldhaXRpbmcgZm9yIGNsaWVudCBjb25uZWN0aW9uIik7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGllbnQgPSBhd2FpdCBTZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5GYWN0b3J5LlN0YXJ0TmV3KCgpID0+IEV4ZWN1dGUoY2xpZW50LCBjYW5jZWxsYXRpb25Ub2tlbiksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgkIlRyYW5zcG9ydCBleGNlcHRpb246IHt0dHh9Iik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5EZWxheShUaW1lU3Bhbi5Gcm9tTWlsbGlzZWNvbmRzKF9jbGllbnRXYWl0aW5nRGVsYXkpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRhc2tDYW5jZWxlZEV4Y2VwdGlvbikgeyB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ1RyYWNlKCJDb21wbGV0ZWQgbGlzdGVuaW5nIGF0IHNlcnZlciIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBFeGVjdXRlKFRUcmFuc3BvcnQgY2xpZW50LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgTG9nZ2VyLkxvZ1RyYWNlKCJTdGFydGVkIGNsaWVudCByZXF1ZXN0IHByb2Nlc3NpbmciKTsKKworICAgICAgICAgICAgdmFyIHByb2Nlc3NvciA9IFByb2Nlc3NvckZhY3RvcnkuR2V0QXN5bmNQcm9jZXNzb3IoY2xpZW50LCB0aGlzKTsKKworICAgICAgICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgb2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IElucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gT3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IElucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBPdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gYXdhaXQgU2VydmVyRXZlbnRIYW5kbGVyLkNyZWF0ZUNvbnRleHRBc3luYyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhd2FpdCBpbnB1dFRyYW5zcG9ydC5QZWVrQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2VydmVyRXZlbnRIYW5kbGVyLlByb2Nlc3NDb250ZXh0QXN5bmMoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXdhaXQgcHJvY2Vzc29yLlByb2Nlc3NBc3luYyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgkIlRyYW5zcG9ydCBleGNlcHRpb246IHt0dHh9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dFcnJvcigkIkVycm9yOiB7eH0iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBTZXJ2ZXJFdmVudEhhbmRsZXIuRGVsZXRlQ29udGV4dEFzeW5jKGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vQ2xvc2UgdHJhbnNwb3J0cworICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0Py5DbG9zZSgpOworICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydD8uQ2xvc2UoKTsKKworICAgICAgICAgICAgICAgIC8vIGRpc3Bvc2FibGUgc3R1ZmYgc2hvdWxkIGJlIGRpc3Bvc2VkCisgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQ/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQ/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ1RyYWNlKCJDb21wbGV0ZWQgY2xpZW50IHJlcXVlc3QgcHJvY2Vzc2luZyIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvU2VydmVyL1RUaHJlYWRQb29sQXN5bmNTZXJ2ZXIuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9TZXJ2ZXIvVFRocmVhZFBvb2xBc3luY1NlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWM1NjYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvU2VydmVyL1RUaHJlYWRQb29sQXN5bmNTZXJ2ZXIuY3MKQEAgLTAsMCArMSwyOTcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5Qcm9jZXNzb3I7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKKworbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNlcnZlciB0aGF0IHVzZXMgQyMgYnVpbHQtaW4gVGhyZWFkUG9vbCB0byBzcGF3biB0aHJlYWRzIHdoZW4gaGFuZGxpbmcgcmVxdWVzdHMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFRocmVhZFBvb2xBc3luY1NlcnZlciA6IFRTZXJ2ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUlOX1RIUkVBRFMgPSAtMTsgIC8vIHVzZSAuTkVUIFRocmVhZFBvb2wgZGVmYXVsdHMKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NQVhfVEhSRUFEUyA9IC0xOyAgLy8gdXNlIC5ORVQgVGhyZWFkUG9vbCBkZWZhdWx0cworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2wgc3RvcCA9IGZhbHNlOworCisgICAgICAgIHByaXZhdGUgQ2FuY2VsbGF0aW9uVG9rZW4gU2VydmVyQ2FuY2VsbGF0aW9uVG9rZW47CisKKyAgICAgICAgcHVibGljIHN0cnVjdCBDb25maWd1cmF0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWluV29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWF4V29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWluSU9UaHJlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBNYXhJT1RocmVhZHM7CisKKyAgICAgICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uKGludCBtaW4gPSBERUZBVUxUX01JTl9USFJFQURTLCBpbnQgbWF4ID0gREVGQVVMVF9NQVhfVEhSRUFEUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaW5Xb3JrZXJUaHJlYWRzID0gbWluOworICAgICAgICAgICAgICAgIE1heFdvcmtlclRocmVhZHMgPSBtYXg7CisgICAgICAgICAgICAgICAgTWluSU9UaHJlYWRzID0gbWluOworICAgICAgICAgICAgICAgIE1heElPVGhyZWFkcyA9IG1heDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIENvbmZpZ3VyYXRpb24oaW50IG1pbldvcmssIGludCBtYXhXb3JrLCBpbnQgbWluSU8sIGludCBtYXhJTykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaW5Xb3JrZXJUaHJlYWRzID0gbWluV29yazsKKyAgICAgICAgICAgICAgICBNYXhXb3JrZXJUaHJlYWRzID0gbWF4V29yazsKKyAgICAgICAgICAgICAgICBNaW5JT1RocmVhZHMgPSBtaW5JTzsKKyAgICAgICAgICAgICAgICBNYXhJT1RocmVhZHMgPSBtYXhJTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbEFzeW5jU2VydmVyKElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgSUxvZ2dlciBsb2dnZXIgPSBudWxsKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBsb2dnZXIpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbEFzeW5jU2VydmVyKElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xBc3luY1NlcnZlcihJVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xBc3luY1NlcnZlcihJVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgSVRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW50IG1pblRocmVhZFBvb2xUaHJlYWRzLCBpbnQgbWF4VGhyZWFkUG9vbFRocmVhZHMsIElMb2dnZXIgbG9nZ2VyPSBudWxsKQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24obWluVGhyZWFkUG9vbFRocmVhZHMsIG1heFRocmVhZFBvb2xUaHJlYWRzKSwKKyAgICAgICAgICAgICBsb2dnZXIpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbEFzeW5jU2VydmVyKElUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIHRocmVhZENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgIElMb2dnZXIgbG9nZ2VyID0gbnVsbCkKKyAgICAgICAgICAgIDogYmFzZShwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ2dlcikKKyAgICAgICAgeworICAgICAgICAgICAgbG9jayAodHlwZW9mKFRUaHJlYWRQb29sQXN5bmNTZXJ2ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhyZWFkQ29uZmlnLk1heFdvcmtlclRocmVhZHMgPiAwKSB8fCAodGhyZWFkQ29uZmlnLk1heElPVGhyZWFkcyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHdvcmssIGNvbW07CisgICAgICAgICAgICAgICAgICAgIFRocmVhZFBvb2wuR2V0TWF4VGhyZWFkcyhvdXQgd29yaywgb3V0IGNvbW0pOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkQ29uZmlnLk1heFdvcmtlclRocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgd29yayA9IHRocmVhZENvbmZpZy5NYXhXb3JrZXJUaHJlYWRzOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkQ29uZmlnLk1heElPVGhyZWFkcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tID0gdGhyZWFkQ29uZmlnLk1heElPVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUaHJlYWRQb29sLlNldE1heFRocmVhZHMod29yaywgY29tbSkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFcnJvcjogY291bGQgbm90IFNldE1heFRocmVhZHMgaW4gVGhyZWFkUG9vbCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhyZWFkQ29uZmlnLk1pbldvcmtlclRocmVhZHMgPiAwKSB8fCAodGhyZWFkQ29uZmlnLk1pbklPVGhyZWFkcyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHdvcmssIGNvbW07CisgICAgICAgICAgICAgICAgICAgIFRocmVhZFBvb2wuR2V0TWluVGhyZWFkcyhvdXQgd29yaywgb3V0IGNvbW0pOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkQ29uZmlnLk1pbldvcmtlclRocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgd29yayA9IHRocmVhZENvbmZpZy5NaW5Xb3JrZXJUaHJlYWRzOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkQ29uZmlnLk1pbklPVGhyZWFkcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tID0gdGhyZWFkQ29uZmlnLk1pbklPVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUaHJlYWRQb29sLlNldE1pblRocmVhZHMod29yaywgY29tbSkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFcnJvcjogY291bGQgbm90IFNldE1pblRocmVhZHMgaW4gVGhyZWFkUG9vbCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlIG5ldyBUaHJlYWRQb29sIHRocmVhZCBmb3IgZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcnZlckNhbmNlbGxhdGlvblRva2VuID0gY2FuY2VsbGF0aW9uVG9rZW47CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nRXJyb3IoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNlcnZlckV2ZW50SGFuZGxlci5QcmVTZXJ2ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBmYWlsdXJlQ291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBhd2FpdCBTZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkUG9vbC5RdWV1ZVVzZXJXb3JrSXRlbSh0aGlzLkV4ZWN1dGUsIGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrZmFpbHVyZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ0Vycm9yKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0b3ApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2dFcnJvcigiVFNlcnZlclRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RvcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNlcnZlckNhbmNlbGxhdGlvblRva2VuID0gZGVmYXVsdChDYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMb29wcyBvbiBwcm9jZXNzaW5nIGEgY2xpZW50IGZvcmV2ZXIKKyAgICAgICAgLy8vIHRocmVhZENvbnRleHQgd2lsbCBiZSBhIFRUcmFuc3BvcnQgaW5zdGFuY2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0aHJlYWRDb250ZXh0Ij48L3BhcmFtPgorICAgICAgICBwcml2YXRlIHZvaWQgRXhlY3V0ZShvYmplY3QgdGhyZWFkQ29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNhbmNlbGxhdGlvblRva2VuID0gU2VydmVyQ2FuY2VsbGF0aW9uVG9rZW47CisKKyAgICAgICAgICAgIHVzaW5nIChUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KXRocmVhZENvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IgPSBQcm9jZXNzb3JGYWN0b3J5LkdldEFzeW5jUHJvY2Vzc29yKGNsaWVudCwgdGhpcyk7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBJbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IElucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gT3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IFNlcnZlckV2ZW50SGFuZGxlci5DcmVhdGVDb250ZXh0QXN5bmMoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKS5SZXN1bHQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgaW5wdXRUcmFuc3BvcnQuUGVla0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKS5SZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlckV2ZW50SGFuZGxlci5Qcm9jZXNzQ29udGV4dEFzeW5jKGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCwgY2FuY2VsbGF0aW9uVG9rZW4pLldhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3QgKGJsb2NrcyB1bnRpbCB0cmFuc3BvcnQgaXMgcmVhZGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2Vzc0FzeW5jKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbikuUmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9Vc3VhbGx5IGEgY2xpZW50IGRpc2Nvbm5lY3QsIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1VuZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZ0Vycm9yKCJFcnJvcjogIiArIHgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJFdmVudEhhbmRsZXIuRGVsZXRlQ29udGV4dEFzeW5jKGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pLldhaXQoKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0Nsb3NlIHRyYW5zcG9ydHMKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQ/LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydD8uQ2xvc2UoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkaXNwb3NhYmxlIHN0dWZmIHNob3VsZCBiZSBkaXNwb3NlZAorICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0Py5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBzdG9wID0gdHJ1ZTsKKyAgICAgICAgICAgIFNlcnZlclRyYW5zcG9ydD8uQ2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzg2ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMTUwIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbC5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbC5VdGlsaXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgZW51bSBFeGNlcHRpb25UeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFVua25vd24sCisgICAgICAgICAgICBVbmtub3duTWV0aG9kLAorICAgICAgICAgICAgSW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgV3JvbmdNZXRob2ROYW1lLAorICAgICAgICAgICAgQmFkU2VxdWVuY2VJZCwKKyAgICAgICAgICAgIE1pc3NpbmdSZXN1bHQsCisgICAgICAgICAgICBJbnRlcm5hbEVycm9yLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvciwKKyAgICAgICAgICAgIEludmFsaWRUcmFuc2Zvcm0sCisgICAgICAgICAgICBJbnZhbGlkUHJvdG9jb2wsCisgICAgICAgICAgICBVbnN1cHBvcnRlZENsaWVudFR5cGUKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IE1lc3NhZ2VUeXBlRmllbGRJZCA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEV4VHlwZUZpZWxkSWQgPSAyOworCisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25UeXBlIFR5cGUgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICAgICAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBudWxsKSAvLyBUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgc2VyaWFsaXphYmxlLCBidXQgd2UgbmV2ZXIgc2VyaWFsaXplIElubmVyRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGUgPSB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrPFRBcHBsaWNhdGlvbkV4Y2VwdGlvbj4gUmVhZEFzeW5jKFRQcm90b2NvbCBpbnB1dFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIG1lc3NhZ2UgPSBudWxsOworICAgICAgICAgICAgdmFyIHR5cGUgPSBFeGNlcHRpb25UeXBlLlVua25vd247CisKKyAgICAgICAgICAgIGF3YWl0IGlucHV0UHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5JRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVzc2FnZVR5cGVGaWVsZElkOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCBpbnB1dFByb3RvY29sLlJlYWRTdHJpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaW5wdXRQcm90b2NvbCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRXhUeXBlRmllbGRJZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLkkzMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gKEV4Y2VwdGlvblR5cGUpIGF3YWl0IGlucHV0UHJvdG9jb2wuUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpbnB1dFByb3RvY29sLCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlucHV0UHJvdG9jb2wsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF3YWl0IGlucHV0UHJvdG9jb2wuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBpbnB1dFByb3RvY29sLlJlYWRTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBzdHJpbmcgbWVzc2FnZVR5cGVGaWVsZE5hbWUgPSAibWVzc2FnZSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZXhUeXBlRmllbGROYW1lID0gImV4VHlwZSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgc3RydWN0QXBwbGljYXRpb25FeGNlcHRpb25OYW1lID0gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiI7CisKKyAgICAgICAgICAgIHZhciBzdHJ1YyA9IG5ldyBUU3RydWN0KHN0cnVjdEFwcGxpY2F0aW9uRXhjZXB0aW9uTmFtZSk7CisgICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7CisKKyAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlU3RydWN0QmVnaW5Bc3luYyhzdHJ1YywgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KE1lc3NhZ2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLk5hbWUgPSBtZXNzYWdlVHlwZUZpZWxkTmFtZTsKKyAgICAgICAgICAgICAgICBmaWVsZC5UeXBlID0gVFR5cGUuU3RyaW5nOworICAgICAgICAgICAgICAgIGZpZWxkLklEID0gTWVzc2FnZVR5cGVGaWVsZElkOworICAgICAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVTdHJpbmdBc3luYyhNZXNzYWdlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmllbGQuTmFtZSA9IGV4VHlwZUZpZWxkTmFtZTsKKyAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5JMzI7CisgICAgICAgICAgICBmaWVsZC5JRCA9IEV4VHlwZUZpZWxkSWQ7CisKKyAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZUkzMkFzeW5jKChpbnQpIFR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZUZpZWxkU3RvcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1RCYXNlQ2xpZW50LmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvVEJhc2VDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkYWMwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RCYXNlQ2xpZW50LmNzCkBAIC0wLDAgKzEsOTEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgICBUQmFzZUNsaWVudC4KKyAgICAvLy8gICAgIEJhc2UgY2xpZW50IGZvciBnZW5lcmF0ZWQgY2xpZW50cy4KKyAgICAvLy8gICAgIERvIG5vdCBjaGFuZ2UgdGhpcyBjbGFzcyB3aXRob3V0IGNoZWNraW5nIGdlbmVyYXRlZCBjb2RlIChuYW1pbmdzLCBldGMuKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRCYXNlQ2xpZW50CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbCBfaW5wdXRQcm90b2NvbDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvdG9jb2wgX291dHB1dFByb3RvY29sOworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByaXZhdGUgaW50IF9zZXFJZDsKKyAgICAgICAgcHVibGljIHJlYWRvbmx5IEd1aWQgQ2xpZW50SWQgPSBHdWlkLk5ld0d1aWQoKTsKKworICAgICAgICBwcm90ZWN0ZWQgVEJhc2VDbGllbnQoVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgX2lucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlucHV0UHJvdG9jb2wpKTsKKyAgICAgICAgICAgIF9vdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKG91dHB1dFByb3RvY29sKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvY29sIElucHV0UHJvdG9jb2wgPT4gX2lucHV0UHJvdG9jb2w7CisKKyAgICAgICAgcHVibGljIFRQcm90b2NvbCBPdXRwdXRQcm90b2NvbCA9PiBfb3V0cHV0UHJvdG9jb2w7CisKKyAgICAgICAgcHVibGljIGludCBTZXFJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gKytfc2VxSWQ7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgT3BlblRyYW5zcG9ydEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3BlblRyYW5zcG9ydEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBPcGVuVHJhbnNwb3J0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lucHV0UHJvdG9jb2wuVHJhbnNwb3J0LklzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBfaW5wdXRQcm90b2NvbC5UcmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFfaW5wdXRQcm90b2NvbC5UcmFuc3BvcnQuSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF9vdXRwdXRQcm90b2NvbC5UcmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBEaXNwb3NlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaW5wdXRQcm90b2NvbD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0UHJvdG9jb2w/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1RFeGNlcHRpb24uY3MgYi9saWIvbmV0c3RkL1RocmlmdC9URXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZTcwNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9URXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRFeGNlcHRpb24gOiBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBURXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lcikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1RocmlmdC5jc3Byb2ogYi9saWIvbmV0c3RkL1RocmlmdC9UaHJpZnQuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZGUxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9UaHJpZnQuY3Nwcm9qCkBAIC0wLDAgKzEsNTUgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8IS0tCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAgIAorICAJICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+CisKKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRzdGFuZGFyZDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0PC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5UaHJpZnQ8L1BhY2thZ2VJZD4KKyAgICA8QXV0b0dlbmVyYXRlQmluZGluZ1JlZGlyZWN0cz50cnVlPC9BdXRvR2VuZXJhdGVCaW5kaW5nUmVkaXJlY3RzPgorICAgIDxHZW5lcmF0ZUJpbmRpbmdSZWRpcmVjdHNPdXRwdXRUeXBlPnRydWU8L0dlbmVyYXRlQmluZGluZ1JlZGlyZWN0c091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVZlcnNpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlWZXJzaW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5RmlsZVZlcnNpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlGaWxlVmVyc2lvbkF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxBbGxvd1Vuc2FmZUJsb2Nrcz50cnVlPC9BbGxvd1Vuc2FmZUJsb2Nrcz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkFzcE5ldENvcmUiIFZlcnNpb249IjIuMi4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5Bc3BOZXRDb3JlLkh0dHAuQWJzdHJhY3Rpb25zIiBWZXJzaW9uPSIyLjIuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nIiBWZXJzaW9uPSIyLjIuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nLkNvbnNvbGUiIFZlcnNpb249IjIuMi4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmcuRGVidWciIFZlcnNpb249IjIuMi4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5JTy5QaXBlcyIgVmVyc2lvbj0iWzQuMywpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5JTy5QaXBlcy5BY2Nlc3NDb250cm9sIiBWZXJzaW9uPSI0LjUuMSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2luSHR0cEhhbmRsZXIiIFZlcnNpb249IjQuNS4yIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuTmFtZVJlc29sdXRpb24iIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0LlJlcXVlc3RzIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5TZWN1cml0eSIgVmVyc2lvbj0iNC4zLjIiIC8+CisgIDwvSXRlbUdyb3VwPgorCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvQ2xpZW50L1RIdHRwVHJhbnNwb3J0LmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L0NsaWVudC9USHR0cFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQ1NDkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L0NsaWVudC9USHR0cFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDIyNiBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQuSHR0cDsKK3VzaW5nIFN5c3RlbS5OZXQuSHR0cC5IZWFkZXJzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0LkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRIdHRwVHJhbnNwb3J0IDogVFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBYNTA5Q2VydGlmaWNhdGVbXSBfY2VydGlmaWNhdGVzOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFVyaSBfdXJpOworCisgICAgICAgIC8vIFRpbWVvdXRzIGluIG1pbGxpc2Vjb25kcworICAgICAgICBwcml2YXRlIGludCBfY29ubmVjdFRpbWVvdXQgPSAzMDAwMDsKKyAgICAgICAgcHJpdmF0ZSBIdHRwQ2xpZW50IF9odHRwQ2xpZW50OworICAgICAgICBwcml2YXRlIFN0cmVhbSBfaW5wdXRTdHJlYW07CisKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworICAgICAgICBwcml2YXRlIE1lbW9yeVN0cmVhbSBfb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworCisgICAgICAgIHB1YmxpYyBUSHR0cFRyYW5zcG9ydChVcmkgdSwgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IGN1c3RvbUhlYWRlcnMgPSBudWxsKQorICAgICAgICAgICAgOiB0aGlzKHUsIEVudW1lcmFibGUuRW1wdHk8WDUwOUNlcnRpZmljYXRlPigpLCBjdXN0b21IZWFkZXJzKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEh0dHBUcmFuc3BvcnQoVXJpIHUsIElFbnVtZXJhYmxlPFg1MDlDZXJ0aWZpY2F0ZT4gY2VydGlmaWNhdGVzLAorICAgICAgICAgICAgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IGN1c3RvbUhlYWRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF91cmkgPSB1OworICAgICAgICAgICAgX2NlcnRpZmljYXRlcyA9IChjZXJ0aWZpY2F0ZXMgPz8gRW51bWVyYWJsZS5FbXB0eTxYNTA5Q2VydGlmaWNhdGU+KCkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIEN1c3RvbUhlYWRlcnMgPSBjdXN0b21IZWFkZXJzOworCisgICAgICAgICAgICAvLyBkdWUgdG8gY3VycmVudCBidWcgd2l0aCBwZXJmb3JtYW5jZSBvZiBEaXNwb3NlIGluIG5ldGNvcmUgaHR0cHM6Ly9naXRodWIuY29tL2RvdG5ldC9jb3JlZngvaXNzdWVzLzg4MDkKKyAgICAgICAgICAgIC8vIHRoaXMgY2FuIGJlIHN3aXRjaGVkIHRvIGRlZmF1bHQgd2F5IChjcmVhdGUgY2xpZW50LT51c2UtPmRpc3Bvc2UgcGVyIGZsdXNoKSBsYXRlcgorICAgICAgICAgICAgX2h0dHBDbGllbnQgPSBDcmVhdGVDbGllbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gQ3VzdG9tSGVhZGVycyB7IGdldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ29ubmVjdFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0IHsgX2Nvbm5lY3RUaW1lb3V0ID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiB0cnVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9pbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9vdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9odHRwQ2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2h0dHBDbGllbnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9odHRwQ2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9pbnB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gcmVxdWVzdCBoYXMgYmVlbiBzZW50Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByZXQgPSBhd2FpdCBfaW5wdXRTdHJlYW0uUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBfb3V0cHV0U3RyZWFtLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBIdHRwQ2xpZW50IENyZWF0ZUNsaWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBoYW5kbGVyID0gbmV3IEh0dHBDbGllbnRIYW5kbGVyKCk7CisgICAgICAgICAgICBoYW5kbGVyLkNsaWVudENlcnRpZmljYXRlcy5BZGRSYW5nZShfY2VydGlmaWNhdGVzKTsKKworICAgICAgICAgICAgdmFyIGh0dHBDbGllbnQgPSBuZXcgSHR0cENsaWVudChoYW5kbGVyKTsKKworICAgICAgICAgICAgaWYgKF9jb25uZWN0VGltZW91dCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHR0cENsaWVudC5UaW1lb3V0ID0gVGltZVNwYW4uRnJvbVNlY29uZHMoX2Nvbm5lY3RUaW1lb3V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaHR0cENsaWVudC5EZWZhdWx0UmVxdWVzdEhlYWRlcnMuQWNjZXB0LkFkZChuZXcgTWVkaWFUeXBlV2l0aFF1YWxpdHlIZWFkZXJWYWx1ZSgiYXBwbGljYXRpb24veC10aHJpZnQiKSk7CisgICAgICAgICAgICBodHRwQ2xpZW50LkRlZmF1bHRSZXF1ZXN0SGVhZGVycy5Vc2VyQWdlbnQuQWRkKG5ldyBQcm9kdWN0SW5mb0hlYWRlclZhbHVlKCJUSHR0cFRyYW5zcG9ydCIsICIxLjAuMCIpKTsKKworICAgICAgICAgICAgaWYgKEN1c3RvbUhlYWRlcnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBDdXN0b21IZWFkZXJzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHR0cENsaWVudC5EZWZhdWx0UmVxdWVzdEhlYWRlcnMuQWRkKGl0ZW0uS2V5LCBpdGVtLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBodHRwQ2xpZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX291dHB1dFN0cmVhbS5DYW5TZWVrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1c2luZyAodmFyIG91dFN0cmVhbSA9IG5ldyBTdHJlYW1Db250ZW50KF9vdXRwdXRTdHJlYW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXNnID0gYXdhaXQgX2h0dHBDbGllbnQuUG9zdEFzeW5jKF91cmksIG91dFN0cmVhbSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cuRW5zdXJlU3VjY2Vzc1N0YXR1c0NvZGUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtID0gYXdhaXQgbXNnLkNvbnRlbnQuUmVhZEFzU3RyZWFtQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0uQ2FuU2VlaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEh0dHBSZXF1ZXN0RXhjZXB0aW9uIHd4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgY29ubmVjdCB0byBzZXJ2ZXI6ICIgKyB3eCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9vdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbT8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfaHR0cENsaWVudD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvQ2xpZW50L1RNZW1vcnlCdWZmZXJUcmFuc3BvcnQuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvQ2xpZW50L1RNZW1vcnlCdWZmZXJUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1MjlkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9DbGllbnQvVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDk3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCA6IFRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF9ieXRlU3RyZWFtOworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisKKyAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQoKQorICAgICAgICB7CisgICAgICAgICAgICBfYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0KGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ieXRlU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbShidWYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+IHRydWU7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICAvKiogZG8gbm90aGluZyAqKi8KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9ieXRlU3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfYnl0ZVN0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX2J5dGVTdHJlYW0uV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBHZXRCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2J5dGVTdHJlYW0uVG9BcnJheSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2J5dGVTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L0NsaWVudC9UTmFtZWRQaXBlVHJhbnNwb3J0LmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L0NsaWVudC9UTmFtZWRQaXBlVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OGM3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvQ2xpZW50L1ROYW1lZFBpcGVUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSw5OCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLklPLlBpcGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0LkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFROYW1lZFBpcGVUcmFuc3BvcnQgOiBUVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIE5hbWVkUGlwZUNsaWVudFN0cmVhbSBfY2xpZW50OworICAgICAgICBwcml2YXRlIGludCBDb25uZWN0VGltZW91dDsKKworICAgICAgICBwdWJsaWMgVE5hbWVkUGlwZVRyYW5zcG9ydChzdHJpbmcgcGlwZSwgaW50IHRpbWVvdXQgPSBUaW1lb3V0LkluZmluaXRlKSAKKyAgICAgICAgICAgIDogdGhpcygiLiIsIHBpcGUsIHRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlVHJhbnNwb3J0KHN0cmluZyBzZXJ2ZXIsIHN0cmluZyBwaXBlLCBpbnQgdGltZW91dCA9IFRpbWVvdXQuSW5maW5pdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZXJ2ZXJOYW1lID0gc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShzZXJ2ZXIpID8gc2VydmVyIDogIi4iOworICAgICAgICAgICAgQ29ubmVjdFRpbWVvdXQgPSAodGltZW91dCA+IDApID8gdGltZW91dCA6IFRpbWVvdXQuSW5maW5pdGU7CisKKyAgICAgICAgICAgIF9jbGllbnQgPSBuZXcgTmFtZWRQaXBlQ2xpZW50U3RyZWFtKHNlcnZlck5hbWUsIHBpcGUsIFBpcGVEaXJlY3Rpb24uSW5PdXQsIFBpcGVPcHRpb25zLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+IF9jbGllbnQgIT0gbnVsbCAmJiBfY2xpZW50LklzQ29ubmVjdGVkOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBfY2xpZW50LkNvbm5lY3RBc3luYyggQ29ubmVjdFRpbWVvdXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfY2xpZW50LlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX2NsaWVudC5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBfY2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvQ2xpZW50L1RTb2NrZXRUcmFuc3BvcnQuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvQ2xpZW50L1RTb2NrZXRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkYTA0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9DbGllbnQvVFNvY2tldFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDE2MiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0LkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRTb2NrZXRUcmFuc3BvcnQgOiBUU3RyZWFtVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisKKworICAgICAgICBwdWJsaWMgVFNvY2tldFRyYW5zcG9ydChUY3BDbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICBUY3BDbGllbnQgPSBjbGllbnQgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoY2xpZW50KSk7CisgICAgICAgICAgICBTZXRJbnB1dE91dHB1dFN0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTb2NrZXRUcmFuc3BvcnQoSVBBZGRyZXNzIGhvc3QsIGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU29ja2V0VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEhvc3QgPSBob3N0OworICAgICAgICAgICAgUG9ydCA9IHBvcnQ7CisKKyAgICAgICAgICAgIFRjcENsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIFRjcENsaWVudC5SZWNlaXZlVGltZW91dCA9IFRjcENsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICBUY3BDbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgU2V0SW5wdXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU29ja2V0VHJhbnNwb3J0KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQgPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBEbnMuR2V0SG9zdEVudHJ5KGhvc3QpOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5BZGRyZXNzTGlzdC5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sICJ1bmFibGUgdG8gcmVzb2x2ZSBob3N0IG5hbWUiKTsKKworICAgICAgICAgICAgICAgIHZhciBhZGRyID0gZW50cnkuQWRkcmVzc0xpc3RbMF07CisgICAgICAgICAgICAgICAgSG9zdCA9IG5ldyBJUEFkZHJlc3MoYWRkci5HZXRBZGRyZXNzQnl0ZXMoKSwgYWRkci5TY29wZUlkKTsKKyAgICAgICAgICAgICAgICBQb3J0ID0gcG9ydDsKKworICAgICAgICAgICAgICAgIFRjcENsaWVudCA9IG5ldyBUY3BDbGllbnQoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICAgICAgVGNwQ2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gVGNwQ2xpZW50LlNlbmRUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgICAgICBUY3BDbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgICAgIFNldElucHV0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGUuTWVzc2FnZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgU2V0SW5wdXRPdXRwdXRTdHJlYW0oKQorICAgICAgICB7IAorICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IFRjcENsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBUY3BDbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHB1YmxpYyBUY3BDbGllbnQgVGNwQ2xpZW50IHsgZ2V0OyBwcml2YXRlIHNldDsgfQorICAgICAgICBwdWJsaWMgSVBBZGRyZXNzIEhvc3QgeyBnZXQ7IH0KKyAgICAgICAgcHVibGljIGludCBQb3J0IHsgZ2V0OyB9CisKKyAgICAgICAgcHVibGljIGludCBUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChUY3BDbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRjcENsaWVudC5SZWNlaXZlVGltZW91dCA9IFRjcENsaWVudC5TZW5kVGltZW91dCA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFRjcENsaWVudCAhPSBudWxsKSAmJiBUY3BDbGllbnQuQ29ubmVjdGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoUG9ydCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChUY3BDbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiSW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQgdGNwIGNsaWVudCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUY3BDbGllbnQuQ29ubmVjdEFzeW5jKEhvc3QsIFBvcnQpOworICAgICAgICAgICAgU2V0SW5wdXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZS5DbG9zZSgpOworCisgICAgICAgICAgICBpZiAoVGNwQ2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGNwQ2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBUY3BDbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGNwQ2xpZW50Py5EaXNwb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5EaXNwb3NlKGRpc3Bvc2luZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9DbGllbnQvVFN0cmVhbVRyYW5zcG9ydC5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9DbGllbnQvVFN0cmVhbVRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjAzNTMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L0NsaWVudC9UU3RyZWFtVHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTEwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFN0cmVhbVRyYW5zcG9ydCA6IFRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKworICAgICAgICBwcm90ZWN0ZWQgVFN0cmVhbVRyYW5zcG9ydCgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU3RyZWFtVHJhbnNwb3J0KFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyZWFtIG91dHB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJlYW0gT3V0cHV0U3RyZWFtIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyZWFtIElucHV0U3RyZWFtIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJbnB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgZnJvbSBudWxsIGlucHV0c3RyZWFtIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBJbnB1dFN0cmVhbS5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKE91dHB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHdyaXRlIHRvIG51bGwgb3V0cHV0c3RyZWFtIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IE91dHB1dFN0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IE91dHB1dFN0cmVhbS5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbT8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvQ2xpZW50L1RUbHNTb2NrZXRUcmFuc3BvcnQuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvQ2xpZW50L1RUbHNTb2NrZXRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmYjk4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9DbGllbnQvVFRsc1NvY2tldFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDI2NyBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQuQ2xpZW50Cit7CisgICAgLy9UT0RPOiBjaGVjayBmb3IgY29ycmVjdCB3b3JrCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUVGxzU29ja2V0VHJhbnNwb3J0IDogVFN0cmVhbVRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBYNTA5Q2VydGlmaWNhdGUyIF9jZXJ0aWZpY2F0ZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBfY2VydFZhbGlkYXRvcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJUEFkZHJlc3MgX2hvc3Q7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfaXNTZXJ2ZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNzbFByb3RvY29scyBfc3NsUHJvdG9jb2xzOworICAgICAgICBwcml2YXRlIFRjcENsaWVudCBfY2xpZW50OworICAgICAgICBwcml2YXRlIFNzbFN0cmVhbSBfc2VjdXJlU3RyZWFtOworICAgICAgICBwcml2YXRlIGludCBfdGltZW91dDsKKworICAgICAgICBwdWJsaWMgVFRsc1NvY2tldFRyYW5zcG9ydChUY3BDbGllbnQgY2xpZW50LCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLCBib29sIGlzU2VydmVyID0gZmFsc2UsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgeworICAgICAgICAgICAgX2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX2NlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIF9zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisgICAgICAgICAgICBfaXNTZXJ2ZXIgPSBpc1NlcnZlcjsKKworICAgICAgICAgICAgaWYgKGlzU2VydmVyICYmIGNlcnRpZmljYXRlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUVGxzU29ja2V0VHJhbnNwb3J0IG5lZWRzIGNlcnRpZmljYXRlIHRvIGJlIHVzZWQgZm9yIHNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgIG5hbWVvZihjZXJ0aWZpY2F0ZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgc3RyaW5nIGNlcnRpZmljYXRlUGF0aCwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDAsCisgICAgICAgICAgICAgICAgbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydGlmaWNhdGVQYXRoKSwKKyAgICAgICAgICAgICAgICBjZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUgPSBudWxsLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwKKyAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICBjZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ob3N0ID0gaG9zdDsKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF90aW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX2NlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIF9zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisKKyAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0VHJhbnNwb3J0KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IERucy5HZXRIb3N0RW50cnkoaG9zdCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LkFkZHJlc3NMaXN0Lkxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgInVuYWJsZSB0byByZXNvbHZlIGhvc3QgbmFtZSIpOworCisgICAgICAgICAgICAgICAgdmFyIGFkZHIgPSBlbnRyeS5BZGRyZXNzTGlzdFswXTsKKworICAgICAgICAgICAgICAgIF9ob3N0ID0gbmV3IElQQWRkcmVzcyhhZGRyLkdldEFkZHJlc3NCeXRlcygpLCBhZGRyLlNjb3BlSWQpOyA7CisgICAgICAgICAgICAgICAgX3BvcnQgPSBwb3J0OworICAgICAgICAgICAgICAgIF90aW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgICAgICBfY2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZTsKKyAgICAgICAgICAgICAgICBfY2VydFZhbGlkYXRvciA9IGNlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgICAgICBfc3NsUHJvdG9jb2xzID0gc3NsUHJvdG9jb2xzOworCisgICAgICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBlLk1lc3NhZ2UsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldCB7IF9jbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBfY2xpZW50LlNlbmRUaW1lb3V0ID0gX3RpbWVvdXQgPSB2YWx1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRjcENsaWVudCBUY3BDbGllbnQgPT4gX2NsaWVudDsKKworICAgICAgICBwdWJsaWMgSVBBZGRyZXNzIEhvc3QgPT4gX2hvc3Q7CisKKyAgICAgICAgcHVibGljIGludCBQb3J0ID0+IF9wb3J0OworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY2xpZW50LkNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0U29ja2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2NsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIF9jbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBfY2xpZW50LlNlbmRUaW1lb3V0ID0gX3RpbWVvdXQ7CisgICAgICAgICAgICBfY2xpZW50LkNsaWVudC5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBEZWZhdWx0Q2VydGlmaWNhdGVWYWxpZGF0b3Iob2JqZWN0IHNlbmRlciwgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLCBYNTA5Q2hhaW4gY2hhaW4sCisgICAgICAgICAgICBTc2xQb2xpY3lFcnJvcnMgc3NsVmFsaWRhdGlvbkVycm9ycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNzbFZhbGlkYXRpb25FcnJvcnMgPT0gU3NsUG9saWN5RXJyb3JzLk5vbmU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaG9zdCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gbnVsbCBob3N0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfcG9ydCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2NsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF9jbGllbnQuQ29ubmVjdEFzeW5jKF9ob3N0LCBfcG9ydCk7CisgICAgICAgICAgICAgICAgYXdhaXQgU2V0dXBUbHNBc3luYygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgU2V0dXBUbHNBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2YWxpZGF0b3IgPSBfY2VydFZhbGlkYXRvciA/PyBEZWZhdWx0Q2VydGlmaWNhdGVWYWxpZGF0b3I7CisKKyAgICAgICAgICAgIGlmIChfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlY3VyZVN0cmVhbSA9IG5ldyBTc2xTdHJlYW0oX2NsaWVudC5HZXRTdHJlYW0oKSwgZmFsc2UsIHZhbGlkYXRvciwgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlY3VyZVN0cmVhbSA9IG5ldyBTc2xTdHJlYW0oX2NsaWVudC5HZXRTdHJlYW0oKSwgZmFsc2UsIHZhbGlkYXRvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfaXNTZXJ2ZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTZXJ2ZXIgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNTZXJ2ZXJBc3luYyhfY2VydGlmaWNhdGUsIF9jZXJ0VmFsaWRhdG9yICE9IG51bGwsIF9zc2xQcm90b2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENsaWVudCBhdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgICB2YXIgY2VydHMgPSBfY2VydGlmaWNhdGUgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiB7X2NlcnRpZmljYXRlfQorICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRIb3N0ID0gX2hvc3QuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgX3NlY3VyZVN0cmVhbS5BdXRoZW50aWNhdGVBc0NsaWVudEFzeW5jKHRhcmdldEhvc3QsIGNlcnRzLCBfc3NsUHJvdG9jb2xzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElucHV0U3RyZWFtID0gX3NlY3VyZVN0cmVhbTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IF9zZWN1cmVTdHJlYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuQ2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChfY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NsaWVudC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX2NsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfc2VjdXJlU3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlY3VyZVN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX3NlY3VyZVN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1NlcnZlci9OdWxsTG9nZ2VyLmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1NlcnZlci9OdWxsTG9nZ2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMWY1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvU2VydmVyL051bGxMb2dnZXIuY3MKQEAgLTAsMCArMSw1NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFN5c3RlbTsKKworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydC5TZXJ2ZXIKK3sKKyAgICAvLyBzb21ldGltZXMgd2UganVzdCBkb24ndCB3YW50IHRvIGxvZyBhbnl0aGluZworICAgIGludGVybmFsIGNsYXNzIE51bGxMb2dnZXI8VD4gOiBJRGlzcG9zYWJsZSwgSUxvZ2dlciwgSUxvZ2dlcjxUPgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgY2xhc3MgTnVsbFNjb3BlIDogSURpc3Bvc2FibGUKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElEaXNwb3NhYmxlIEJlZ2luU2NvcGU8VFN0YXRlPihUU3RhdGUgc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTnVsbFNjb3BlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNFbmFibGVkKExvZ0xldmVsIGxvZ0xldmVsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBubworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgTG9nPFRTdGF0ZT4oTG9nTGV2ZWwgbG9nTGV2ZWwsIEV2ZW50SWQgZXZlbnRJZCwgVFN0YXRlIHN0YXRlLCBFeGNlcHRpb24gZXhjZXB0aW9uLCBGdW5jPFRTdGF0ZSwgRXhjZXB0aW9uLCBzdHJpbmc+IGZvcm1hdHRlcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvU2VydmVyL1RIdHRwU2VydmVyVHJhbnNwb3J0LmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1NlcnZlci9USHR0cFNlcnZlclRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWI5ZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1NlcnZlci9USHR0cFNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDk2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkFzcE5ldENvcmUuSHR0cDsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmc7Cit1c2luZyBUaHJpZnQuUHJvY2Vzc29yOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydC5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0LlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRIdHRwU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcm90ZWN0ZWQgY29uc3Qgc3RyaW5nIENvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTG9nZ2VyIF9sb2dnZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmVxdWVzdERlbGVnYXRlIF9uZXh0OworICAgICAgICBwcm90ZWN0ZWQgRW5jb2RpbmcgRW5jb2RpbmcgPSBFbmNvZGluZy5VVEY4OworCisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBJbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIElUUHJvdG9jb2xGYWN0b3J5IE91dHB1dFByb3RvY29sRmFjdG9yeTsKKworICAgICAgICBwcm90ZWN0ZWQgSVRBc3luY1Byb2Nlc3NvciBQcm9jZXNzb3I7CisKKyAgICAgICAgcHVibGljIFRIdHRwU2VydmVyVHJhbnNwb3J0KElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBSZXF1ZXN0RGVsZWdhdGUgbmV4dCA9IG51bGwsIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnkgPSBudWxsKQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5leHQsIGxvZ2dlckZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUSHR0cFNlcnZlclRyYW5zcG9ydChJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciwgSVRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LCBSZXF1ZXN0RGVsZWdhdGUgbmV4dCA9IG51bGwsCisgICAgICAgICAgICBJTG9nZ2VyRmFjdG9yeSBsb2dnZXJGYWN0b3J5ID0gbnVsbCkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBuZXh0LCBsb2dnZXJGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEh0dHBTZXJ2ZXJUcmFuc3BvcnQoSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIElUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBSZXF1ZXN0RGVsZWdhdGUgbmV4dCA9IG51bGwsIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnkgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBsb2dnZXJGYWN0b3J5ID09IG51bGwgaXMgbm90IGlsbGVnYWwgYW55bW9yZQorCisgICAgICAgICAgICBQcm9jZXNzb3IgPSBwcm9jZXNzb3IgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YocHJvY2Vzc29yKSk7CisgICAgICAgICAgICBJbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlucHV0UHJvdG9jb2xGYWN0b3J5KSk7CisgICAgICAgICAgICBPdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSk7CisKKyAgICAgICAgICAgIF9uZXh0ID0gbmV4dDsKKyAgICAgICAgICAgIF9sb2dnZXIgPSAobG9nZ2VyRmFjdG9yeSAhPSBudWxsKSA/IGxvZ2dlckZhY3RvcnkuQ3JlYXRlTG9nZ2VyPFRIdHRwU2VydmVyVHJhbnNwb3J0PigpIDogbmV3IE51bGxMb2dnZXI8VEh0dHBTZXJ2ZXJUcmFuc3BvcnQ+KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBJbnZva2UoSHR0cENvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZXNwb25zZS5Db250ZW50VHlwZSA9IENvbnRlbnRUeXBlOworICAgICAgICAgICAgYXdhaXQgUHJvY2Vzc1JlcXVlc3RBc3luYyhjb250ZXh0LCBjb250ZXh0LlJlcXVlc3RBYm9ydGVkKTsgLy9UT0RPOiBjaGVjayBmb3IgY29ycmVjdCBsb2dpYworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgUHJvY2Vzc1JlcXVlc3RBc3luYyhIdHRwQ29udGV4dCBjb250ZXh0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KGNvbnRleHQuUmVxdWVzdC5Cb2R5LCBjb250ZXh0LlJlc3BvbnNlLkJvZHkpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSBJbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSBPdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChhd2FpdCBQcm9jZXNzb3IuUHJvY2Vzc0FzeW5jKGlucHV0LCBvdXRwdXQsIGNhbmNlbGxhdGlvblRva2VuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2xpZW50IGRpZWQsIGp1c3QgbW92ZSBvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9TZXJ2ZXIvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9TZXJ2ZXIvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDU2ODNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1NlcnZlci9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMzAyIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgTWljcm9zb2Z0LldpbjMyLlNhZmVIYW5kbGVzOwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPLlBpcGVzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uQ29tcG9uZW50TW9kZWw7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbDsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWw7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0LlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgVGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgUGlwZSBvbiB0aGUgbG9jYWxob3N0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfcGlwZUFkZHJlc3M7CisKKyAgICAgICAgcHJpdmF0ZSBib29sIF9hc3luY01vZGUgPSB0cnVlOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2wgX2lzUGVuZGluZyA9IHRydWU7CisKKyAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0gX3N0cmVhbSA9IG51bGw7CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQoc3RyaW5nIHBpcGVBZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBfcGlwZUFkZHJlc3MgPSBwaXBlQWRkcmVzczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3N0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9zdHJlYW0uSXNDb25uZWN0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBfc3RyZWFtLkRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgX3N0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBfaXNQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNDbGllbnRQZW5kaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9pc1BlbmRpbmc7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRW5zdXJlUGlwZUluc3RhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBQaXBlRGlyZWN0aW9uIGRpcmVjdGlvbiA9IFBpcGVEaXJlY3Rpb24uSW5PdXQ7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IG1heGNvbm4gPSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0uTWF4QWxsb3dlZFNlcnZlckluc3RhbmNlczsKKyAgICAgICAgICAgICAgICBjb25zdCBQaXBlVHJhbnNtaXNzaW9uTW9kZSBtb2RlID0gUGlwZVRyYW5zbWlzc2lvbk1vZGUuQnl0ZTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5idWYgPSA0MDk2OworICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdXRidWYgPSA0MDk2OworICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gX2FzeW5jTW9kZSA/IFBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyA6IFBpcGVPcHRpb25zLk5vbmU7CisKKworICAgICAgICAgICAgICAgIC8vIFRPRE86ICJDcmVhdGVQaXBlTmF0aXZlIiBpc3Qgb25seSBhIHdvcmthcm91bmQsIGFuZCB0aGVyZSBhcmUgaGF2ZSBiYXNpY2FsbHkgdHdvIHBvc3NpYmxlIG91dGNvbWVzOgorICAgICAgICAgICAgICAgIC8vIC0gb25jZSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0oKSBnZXRzIGEgQ1RPUiB0aGF0IHN1cHBvcnRzIHBpcGVzZWMsIHJlbW92ZSBDcmVhdGVQaXBlTmF0aXZlKCkKKyAgICAgICAgICAgICAgICAvLyAtIGlmIDMxMTkwIGdldHMgcmVzb2x2ZWQgYmVmb3JlLCB1c2UgX3N0cmVhbS5TZXRBY2Nlc3NDb250cm9sKHBpcGVzZWMpIGluc3RlYWQgb2YgQ3JlYXRlUGlwZU5hdGl2ZSgpCisgICAgICAgICAgICAgICAgLy8gRUlUSEVSIFdBWSwKKyAgICAgICAgICAgICAgICAvLyAtIGlmIENyZWF0ZVBpcGVOYXRpdmUoKSBmaW5hbGx5IGdldHMgcmVtb3ZlZCwgYWxzbyByZW1vdmUgImFsbG93IHVuc2FmZSBjb2RlIiBmcm9tIHRoZSBwcm9qZWN0IHNldHRpbmdzCisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBDcmVhdGVQaXBlTmF0aXZlKF9waXBlQWRkcmVzcywgaW5idWYsIG91dGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGlmKCAoaGFuZGxlICE9IG51bGwpICYmICghaGFuZGxlLklzSW52YWxpZCkpCisgICAgICAgICAgICAgICAgICAgICAgICBfc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShQaXBlRGlyZWN0aW9uLkluT3V0LCBfYXN5bmNNb2RlLCBmYWxzZSwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgX3N0cmVhbSA9IG5ldyBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0oX3BpcGVBZGRyZXNzLCBkaXJlY3Rpb24sIG1heGNvbm4sIG1vZGUsIG9wdGlvbnMsIGluYnVmLCBvdXRidWYvKiwgcGlwZXNlYyovKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKSAvLyBNb25vIHN0aWxsIGRvZXMgbm90IHN1cHBvcnQgYXN5bmMsIGZhbGxiYWNrIHRvIHN5bmMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfYXN5bmNNb2RlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zICY9ICh+UGlwZU9wdGlvbnMuQXN5bmNocm9ub3VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKF9waXBlQWRkcmVzcywgZGlyZWN0aW9uLCBtYXhjb25uLCBtb2RlLCBvcHRpb25zLCBpbmJ1Ziwgb3V0YnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hc3luY01vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAjcmVnaW9uIENyZWF0ZVBpcGVOYXRpdmUgd29ya2Fyb3VuZAorCisKKyAgICAgICAgW1N0cnVjdExheW91dChMYXlvdXRLaW5kLlNlcXVlbnRpYWwpXQorICAgICAgICBpbnRlcm5hbCBjbGFzcyBTRUNVUklUWV9BVFRSSUJVVEVTCisgICAgICAgIHsKKyAgICAgICAgICAgIGludGVybmFsIGludCBuTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGludGVybmFsIEludFB0ciBscFNlY3VyaXR5RGVzY3JpcHRvciA9IEludFB0ci5aZXJvOworICAgICAgICAgICAgaW50ZXJuYWwgaW50IGJJbmhlcml0SGFuZGxlID0gMDsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgS2VybmVsMzIgPSAia2VybmVsMzIuZGxsIjsKKworICAgICAgICBbRGxsSW1wb3J0KEtlcm5lbDMyLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGV4dGVybiBJbnRQdHIgQ3JlYXRlTmFtZWRQaXBlKAorICAgICAgICAgICAgc3RyaW5nIGxwTmFtZSwgdWludCBkd09wZW5Nb2RlLCB1aW50IGR3UGlwZU1vZGUsCisgICAgICAgICAgICB1aW50IG5NYXhJbnN0YW5jZXMsIHVpbnQgbk91dEJ1ZmZlclNpemUsIHVpbnQgbkluQnVmZmVyU2l6ZSwgdWludCBuRGVmYXVsdFRpbWVPdXQsCisgICAgICAgICAgICBTRUNVUklUWV9BVFRSSUJVVEVTIHBpcGVTZWN1cml0eURlc2NyaXB0b3IKKyAgICAgICAgICAgICk7CisKKworCisgICAgICAgIC8vIFdvcmthcm91bmQ6IGNyZWF0ZSB0aGUgcGlwZSB2aWEgQVBJIGNhbGwKKyAgICAgICAgLy8gd2UgaGF2ZSB0byBkbyBpdCB0aGlzIHdheSwgc2luY2UgTmFtZWRQaXBlU2VydmVyU3RyZWFtKCkgZm9yIG5ldHN0ZCBzdGlsbCBsYWNrcyBhIGZldyBDVE9ScworICAgICAgICAvLyBhbmQgX3N0cmVhbS5TZXRBY2Nlc3NDb250cm9sKHBpcGVzZWMpOyBvbmx5IGtlZXBzIHRocm93aW5nIEFDQ0VTU19ERU5JRUQgZXJyb3JzIGF0IHVzCisgICAgICAgIC8vIFJlZmVyZW5jZXM6CisgICAgICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2RvdG5ldC9jb3JlZngvaXNzdWVzLzMwMTcwIChjbG9zZWQsIGNvbnRpbnVlZCBpbiAzMTE5MCkKKyAgICAgICAgLy8gLSBodHRwczovL2dpdGh1Yi5jb20vZG90bmV0L2NvcmVmeC9pc3N1ZXMvMzExOTAgU3lzdGVtLklPLlBpcGVzLkFjY2Vzc0NvbnRyb2wgcGFja2FnZSBkb2VzIG5vdCB3b3JrCisgICAgICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2RvdG5ldC9jb3JlZngvaXNzdWVzLzI0MDQwIE5hbWVkUGlwZVNlcnZlclN0cmVhbTogUHJvdmlkZSBzdXBwb3J0IGZvciBXUklURV9EQUMKKyAgICAgICAgLy8gLSBodHRwczovL2dpdGh1Yi5jb20vZG90bmV0L2NvcmVmeC9pc3N1ZXMvMzQ0MDAgSGF2ZSBhIG1lY2hhbmlzbSBmb3IgbG93ZXIgcHJpdmlsZWdlZCB1c2VyIHRvIGNvbm5lY3QgdG8gYSBwcml2aWxlZ2VkIHVzZXIncyBwaXBlCisgICAgICAgIHByaXZhdGUgU2FmZVBpcGVIYW5kbGUgQ3JlYXRlUGlwZU5hdGl2ZShzdHJpbmcgbmFtZSwgaW50IGluYnVmLCBpbnQgb3V0YnVmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoRW52aXJvbm1lbnQuT1NWZXJzaW9uLlBsYXRmb3JtICE9IFBsYXRmb3JtSUQuV2luMzJOVCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gV2luZG93cyBvbmx5CisKKyAgICAgICAgICAgIHZhciBwaW5uaW5nSGFuZGxlID0gbmV3IEdDSGFuZGxlKCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBvd25lciBnZXRzIGZ1bGwgYWNjZXNzLCBldmVyeW9uZSBlbHNlIHJlYWQvd3JpdGUKKyAgICAgICAgICAgICAgICB2YXIgcGlwZXNlYyA9IG5ldyBQaXBlU2VjdXJpdHkoKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIGN1cnJlbnRJZGVudGl0eSA9IFdpbmRvd3NJZGVudGl0eS5HZXRDdXJyZW50KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgc2lkT3duZXIgPSBjdXJyZW50SWRlbnRpdHkuT3duZXI7CisgICAgICAgICAgICAgICAgICAgIHZhciBzaWRXb3JsZCA9IG5ldyBTZWN1cml0eUlkZW50aWZpZXIoV2VsbEtub3duU2lkVHlwZS5Xb3JsZFNpZCwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgcGlwZXNlYy5TZXRPd25lcihzaWRPd25lcik7CisgICAgICAgICAgICAgICAgICAgIHBpcGVzZWMuQWRkQWNjZXNzUnVsZShuZXcgUGlwZUFjY2Vzc1J1bGUoc2lkT3duZXIsIFBpcGVBY2Nlc3NSaWdodHMuRnVsbENvbnRyb2wsIEFjY2Vzc0NvbnRyb2xUeXBlLkFsbG93KSk7CisgICAgICAgICAgICAgICAgICAgIHBpcGVzZWMuQWRkQWNjZXNzUnVsZShuZXcgUGlwZUFjY2Vzc1J1bGUoc2lkV29ybGQsIFBpcGVBY2Nlc3NSaWdodHMuUmVhZFdyaXRlLCBBY2Nlc3NDb250cm9sVHlwZS5BbGxvdykpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHNlY3VyaXR5IGRlc2NyaXB0b3IgYW5kIGFzc2lnbiBpdCB0byB0aGUgc2VjdXJpdHkgYXR0cmlicworICAgICAgICAgICAgICAgIHZhciBzZWNBdHRycyA9IG5ldyBTRUNVUklUWV9BVFRSSUJVVEVTKCk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIHNkQnl0ZXMgPSBwaXBlc2VjLkdldFNlY3VyaXR5RGVzY3JpcHRvckJpbmFyeUZvcm0oKTsKKyAgICAgICAgICAgICAgICBwaW5uaW5nSGFuZGxlID0gR0NIYW5kbGUuQWxsb2Moc2RCeXRlcywgR0NIYW5kbGVUeXBlLlBpbm5lZCk7CisgICAgICAgICAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgICAgICAgICAgZml4ZWQgKGJ5dGUqIHBTRCA9IHNkQnl0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY0F0dHJzLmxwU2VjdXJpdHlEZXNjcmlwdG9yID0gKEludFB0cilwU0Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBhIGJ1bmNoIG9mIGNvbnN0YW50cyB3ZSB3aWxsIG5lZWQgc2hvcnRseQorICAgICAgICAgICAgICAgIGNvbnN0IGludCBQSVBFX0FDQ0VTU19EVVBMRVggPSAweDAwMDAwMDAzOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBGSUxFX0ZMQUdfT1ZFUkxBUFBFRCA9IDB4NDAwMDAwMDA7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IFdSSVRFX0RBQyA9IDB4MDAwNDAwMDA7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IFBJUEVfVFlQRV9CWVRFID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgUElQRV9SRUFETU9ERV9CWVRFID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTID0gMjU1OworCisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBwaXBlIHZpYSBBUEkgY2FsbAorICAgICAgICAgICAgICAgIHZhciByYXdIYW5kbGUgPSBDcmVhdGVOYW1lZFBpcGUoCisgICAgICAgICAgICAgICAgICAgIEAiXFwuXHBpcGVcIiArIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIFBJUEVfQUNDRVNTX0RVUExFWCB8IEZJTEVfRkxBR19PVkVSTEFQUEVEIHwgV1JJVEVfREFDLAorICAgICAgICAgICAgICAgICAgICBQSVBFX1RZUEVfQllURSB8IFBJUEVfUkVBRE1PREVfQllURSwKKyAgICAgICAgICAgICAgICAgICAgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTLCAodWludClpbmJ1ZiwgKHVpbnQpb3V0YnVmLAorICAgICAgICAgICAgICAgICAgICA1ICogMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgc2VjQXR0cnMKKyAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIC8vIG1ha2UgYSBTYWZlUGlwZUhhbmRsZSgpIGZyb20gaXQKKyAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gbmV3IFNhZmVQaXBlSGFuZGxlKHJhd0hhbmRsZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS5Jc0ludmFsaWQpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXaW4zMkV4Y2VwdGlvbihNYXJzaGFsLkdldExhc3RXaW4zMkVycm9yKCkpOworCisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGl0ICh0byBiZSBwYWNrYWdlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwaW5uaW5nSGFuZGxlLklzQWxsb2NhdGVkKQorICAgICAgICAgICAgICAgICAgICBwaW5uaW5nSGFuZGxlLkZyZWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUVHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbnN1cmVQaXBlSW5zdGFuY2UoKTsKKworICAgICAgICAgICAgICAgIGF3YWl0IF9zdHJlYW0uV2FpdEZvckNvbm5lY3Rpb25Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICB2YXIgdHJhbnMgPSBuZXcgU2VydmVyVHJhbnNwb3J0KF9zdHJlYW0pOworICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBudWxsOyAvLyBwYXNzIG93bmVyc2hpcCB0byBTZXJ2ZXJUcmFuc3BvcnQKKworICAgICAgICAgICAgICAgIC8vX2lzUGVuZGluZyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCBlLk1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBTZXJ2ZXJUcmFuc3BvcnQgOiBUVHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTmFtZWRQaXBlU2VydmVyU3RyZWFtIF9zdHJlYW07CisKKyAgICAgICAgICAgIHB1YmxpYyBTZXJ2ZXJUcmFuc3BvcnQoTmFtZWRQaXBlU2VydmVyU3RyZWFtIHN0cmVhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3RyZWFtID0gc3RyZWFtOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gX3N0cmVhbSAhPSBudWxsICYmIF9zdHJlYW0uSXNDb25uZWN0ZWQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3N0cmVhbT8uRGlzcG9zZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9zdHJlYW0uUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXdhaXQgX3N0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9TZXJ2ZXIvVFNlcnZlckZyYW1lZFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9TZXJ2ZXIvVFNlcnZlckZyYW1lZFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2IzODAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1NlcnZlci9UU2VydmVyRnJhbWVkVHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTUwIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0LkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQuU2VydmVyCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFNlcnZlckZyYW1lZFRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9jbGllbnRUaW1lb3V0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfcG9ydDsKKyAgICAgICAgcHJpdmF0ZSBUY3BMaXN0ZW5lciBfc2VydmVyOworCisgICAgICAgIHB1YmxpYyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KFRjcExpc3RlbmVyIGxpc3RlbmVyKQorICAgICAgICAgICAgOiB0aGlzKGxpc3RlbmVyLCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXJ2ZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIF9jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BvcnQgPSBwb3J0OworICAgICAgICAgICAgX2NsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzZXJ2ZXIgc29ja2V0CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG5ldyBUY3BMaXN0ZW5lcihJUEFkZHJlc3MuQW55LCBfcG9ydCk7CisgICAgICAgICAgICAgICAgX3NlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyBwb3J0ICsgIi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gYmxvY2sgb24gYWNjZXB0CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzQ2xpZW50UGVuZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2VydmVyLlBlbmRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBUYXNrPFRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VFRyYW5zcG9ydD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3NlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBURnJhbWVkVHJhbnNwb3J0IHRTb2NrZXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIHZhciB0Y3BDbGllbnQgPSBhd2FpdCBfc2VydmVyLkFjY2VwdFRjcENsaWVudEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRUcmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydChuZXcgVFNvY2tldFRyYW5zcG9ydCh0Y3BDbGllbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgPSBfY2xpZW50VGltZW91dAorICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFNvY2tldFRyYW5zcG9ydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0U29ja2V0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRUcmFuc3BvcnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy8gIE90aGVyd2lzZSwgY2xlYW4gaXQgdXAgb3Vyc2VsdmVzLgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKSB0Y3BDbGllbnQpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1NlcnZlci9UU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzIGIvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1NlcnZlci9UU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGRlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvU2VydmVyL1RTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxNzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydC5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUU2VydmVyU29ja2V0VHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NsaWVudFRpbWVvdXQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX3VzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF91c2VGcmFtZWRUcmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgX3NlcnZlcjsKKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICAgICAgICAgIDogdGhpcyhsaXN0ZW5lciwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoVGNwTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjbGllbnRUaW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICBfc2VydmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgY2xpZW50VGltZW91dCwgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMpOgorICAgICAgICAgICAgdGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCB1c2VCdWZmZXJlZFNvY2tldHMsIGZhbHNlKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsIGJvb2wgdXNlRnJhbWVkVHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBfcG9ydCA9IHBvcnQ7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgICAgICBfdXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICAgICAgX3VzZUZyYW1lZFRyYW5zcG9ydCA9IHVzZUZyYW1lZFRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoSVBBZGRyZXNzLkFueSwgX3BvcnQpOworICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0NsaWVudFBlbmRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NlcnZlci5QZW5kaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUVHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRUcmFuc3BvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCB0U29ja2V0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB2YXIgdGNwQ2xpZW50ID0gYXdhaXQgX3NlcnZlci5BY2NlcHRUY3BDbGllbnRBc3luYygpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0ID0gbmV3IFRTb2NrZXRUcmFuc3BvcnQodGNwQ2xpZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ID0gX2NsaWVudFRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX3VzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodFNvY2tldFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoX3VzZUZyYW1lZFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRTb2NrZXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRTb2NrZXRUcmFuc3BvcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodFNvY2tldFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vICBPdGhlcndpc2UsIGNsZWFuIGl0IHVwIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSkgdGNwQ2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9TZXJ2ZXIvVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9TZXJ2ZXIvVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGQ3ZmYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1NlcnZlci9UVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTc3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydC5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0LlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIF9jbGllbnRDZXJ0VmFsaWRhdG9yOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfY2xpZW50VGltZW91dCA9IDA7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFg1MDlDZXJ0aWZpY2F0ZTIgX3NlcnZlckNlcnRpZmljYXRlOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNzbFByb3RvY29scyBfc3NsUHJvdG9jb2xzOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX3VzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF91c2VGcmFtZWRUcmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgX3NlcnZlcjsKKworICAgICAgICBwdWJsaWMgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCwgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCBmYWxzZSwgY2VydGlmaWNhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0KAorICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cywKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjbGllbnRDZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikgCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgdXNlQnVmZmVyZWRTb2NrZXRzLCBmYWxzZSwgY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgY2xpZW50Q2VydFZhbGlkYXRvciwgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLCBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzLAorICAgICAgICAgICAgYm9vbCB1c2VGcmFtZWRUcmFuc3BvcnQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2xpZW50Q2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghY2VydGlmaWNhdGUuSGFzUHJpdmF0ZUtleSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgIllvdXIgc2VydmVyLWNlcnRpZmljYXRlIG5lZWRzIHRvIGhhdmUgYSBwcml2YXRlIGtleSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfcG9ydCA9IHBvcnQ7CisgICAgICAgICAgICBfc2VydmVyQ2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZTsKKyAgICAgICAgICAgIF91c2VCdWZmZXJlZFNvY2tldHMgPSB1c2VCdWZmZXJlZFNvY2tldHM7CisgICAgICAgICAgICBfdXNlRnJhbWVkVHJhbnNwb3J0ID0gdXNlRnJhbWVkVHJhbnNwb3J0OworICAgICAgICAgICAgX2NsaWVudENlcnRWYWxpZGF0b3IgPSBjbGllbnRDZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIF9zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBzZXJ2ZXIgc29ja2V0CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG5ldyBUY3BMaXN0ZW5lcihJUEFkZHJlc3MuQW55LCBfcG9ydCk7CisgICAgICAgICAgICAgICAgX3NlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCQiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCB7cG9ydH0uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgYWNjZXB0IGlzIG5vdCBibG9ja2luZworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCQiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiB7c3guTWVzc2FnZX0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0NsaWVudFBlbmRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NlcnZlci5QZW5kaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUVHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRUcmFuc3BvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNsaWVudCA9IGF3YWl0IF9zZXJ2ZXIuQWNjZXB0VGNwQ2xpZW50QXN5bmMoKTsKKyAgICAgICAgICAgICAgICBjbGllbnQuU2VuZFRpbWVvdXQgPSBjbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBfY2xpZW50VGltZW91dDsKKworICAgICAgICAgICAgICAgIC8vd3JhcCB0aGUgY2xpZW50IGluIGFuIFNTTCBTb2NrZXQgcGFzc2luZyBpbiB0aGUgU1NMIGNlcnQKKyAgICAgICAgICAgICAgICB2YXIgdFRsc1NvY2tldCA9IG5ldyBUVGxzU29ja2V0VHJhbnNwb3J0KGNsaWVudCwgX3NlcnZlckNlcnRpZmljYXRlLCB0cnVlLCBfY2xpZW50Q2VydFZhbGlkYXRvciwKKyAgICAgICAgICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywgX3NzbFByb3RvY29scyk7CisKKyAgICAgICAgICAgICAgICBhd2FpdCB0VGxzU29ja2V0LlNldHVwVGxzQXN5bmMoKTsKKworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnMgPSB0VGxzU29ja2V0OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChfdXNlQnVmZmVyZWRTb2NrZXRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoX3VzZUZyYW1lZFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiB7ZXh9Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0OGY1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwyMTMgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9idWZTaXplOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfaW5wdXRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDApOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfb3V0cHV0QnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgwKTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUVHJhbnNwb3J0IF90cmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKworICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUVHJhbnNwb3J0IEdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vVE9ETzogc2hvdWxkIHN1cHBvcnQgb25seSBzcGVjaWZpZWQgaW5wdXQgdHJhbnNwb3J0PworICAgICAgICBwdWJsaWMgVEJ1ZmZlcmVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBpbnQgYnVmU2l6ZSA9IDEwMjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChidWZTaXplIDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YoYnVmU2l6ZSksICJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfdHJhbnNwb3J0ID0gdHJhbnNwb3J0ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgX2J1ZlNpemUgPSBidWZTaXplOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgVW5kZXJseWluZ1RyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX3RyYW5zcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiAhX2lzRGlzcG9zZWQgJiYgX3RyYW5zcG9ydC5Jc09wZW47CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBfdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vVE9ETzogaW52ZXN0aWdhdGUgaG93IGl0IHNob3VsZCB3b3JrIGNvcnJlY3RseQorICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9pbnB1dEJ1ZmZlci5DYXBhY2l0eSA8IF9idWZTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pbnB1dEJ1ZmZlci5DYXBhY2l0eSA9IF9idWZTaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZ290ID0gYXdhaXQgX2lucHV0QnVmZmVyLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoZ290ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfaW5wdXRCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgIF9pbnB1dEJ1ZmZlci5TZXRMZW5ndGgoX2lucHV0QnVmZmVyLkNhcGFjaXR5KTsKKworICAgICAgICAgICAgQXJyYXlTZWdtZW50PGJ5dGU+IGJ1ZlNlZ21lbnQ7CisgICAgICAgICAgICBfaW5wdXRCdWZmZXIuVHJ5R2V0QnVmZmVyKG91dCBidWZTZWdtZW50KTsKKworICAgICAgICAgICAgLy8gaW52ZXN0aWdhdGUKKyAgICAgICAgICAgIHZhciBmaWxsZWQgPSBhd2FpdCBfdHJhbnNwb3J0LlJlYWRBc3luYyhidWZTZWdtZW50LkFycmF5LCAwLCAoaW50KSBfaW5wdXRCdWZmZXIuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBfaW5wdXRCdWZmZXIuU2V0TGVuZ3RoKGZpbGxlZCk7CisKKyAgICAgICAgICAgIGlmIChmaWxsZWQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWxhdGl2ZSBvZmZzZXQgZnJvbSAib2ZmIiBhcmd1bWVudAorICAgICAgICAgICAgdmFyIHdyaXR0ZW5Db3VudCA9IDA7CisgICAgICAgICAgICBpZiAoX291dHB1dEJ1ZmZlci5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjYXBhID0gKGludCkgKF9vdXRwdXRCdWZmZXIuQ2FwYWNpdHkgLSBfb3V0cHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdmFyIHdyaXRlU2l6ZSA9IGNhcGEgPD0gbGVuZ3RoID8gY2FwYSA6IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBhd2FpdCBfb3V0cHV0QnVmZmVyLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIHdyaXRlU2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgd3JpdHRlbkNvdW50ICs9IHdyaXRlU2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAod3JpdGVTaXplID09IGNhcGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0FycmF5U2VnbWVudDxieXRlPiBidWZTZWdtZW50OworICAgICAgICAgICAgICAgICAgICAvL19vdXRwdXRCdWZmZXIuVHJ5R2V0QnVmZmVyKG91dCBidWZTZWdtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBfb3V0cHV0QnVmZmVyLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgLy9hd2FpdCBfdHJhbnNwb3J0LldyaXRlQXN5bmMoYnVmU2VnbWVudC5BcnJheSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LldyaXRlQXN5bmMoZGF0YSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0QnVmZmVyLlNldExlbmd0aCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChsZW5ndGggLSB3cml0dGVuQ291bnQgPj0gX2J1ZlNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0ICsgd3JpdHRlbkNvdW50LCBfYnVmU2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIHdyaXR0ZW5Db3VudCArPSBfYnVmU2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJlbWFpbiA9IGxlbmd0aCAtIHdyaXR0ZW5Db3VudDsKKyAgICAgICAgICAgIGlmIChyZW1haW4gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfb3V0cHV0QnVmZmVyLkNhcGFjaXR5IDwgX2J1ZlNpemUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0QnVmZmVyLkNhcGFjaXR5ID0gX2J1ZlNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF3YWl0IF9vdXRwdXRCdWZmZXIuV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCArIHdyaXR0ZW5Db3VudCwgcmVtYWluLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9vdXRwdXRCdWZmZXIuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IF9vdXRwdXRCdWZmZXIuVG9BcnJheSgpOyAKKworICAgICAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuV3JpdGVBc3luYyhkYXRhIC8qYnVmU2VnbWVudC5BcnJheSovLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgX291dHB1dEJ1ZmZlci5TZXRMZW5ndGgoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgQ2hlY2tOb3REaXNwb3NlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24obmFtZW9mKF90cmFuc3BvcnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9pbnB1dEJ1ZmZlcj8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0QnVmZmVyPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF90cmFuc3BvcnQ/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1RDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvVENsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWM4MTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1RDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxNzkgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgY2xpZW50IGluZm8gCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFRyYW5zcG9ydCA6IElEaXNwb3NhYmxlCisgICAgeworICAgICAgICAvL1RPRE86IHRoaW5rIGhvdyB0byBhdm9pZCBwZWVrIGJ5dGUKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX3BlZWtCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9oYXNQZWVrQnl0ZTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2wgSXNPcGVuIHsgZ2V0OyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgICAgICBHQy5TdXBwcmVzc0ZpbmFsaXplKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUGVla0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvL0lmIHdlIGFscmVhZHkgaGF2ZSBhIGJ5dGUgcmVhZCBidXQgbm90IGNvbnN1bWVkLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9JZiB0cmFuc3BvcnQgY2xvc2VkIHdlIGNhbid0IHBlZWsuCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vVHJ5IHRvIHJlYWQgb25lIGJ5dGUuIElmIHN1Y2NlZWRzIHdlIHdpbGwgbmVlZCB0byBzdG9yZSBpdCBmb3IgdGhlIG5leHQgcmVhZC4KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBieXRlcyA9IGF3YWl0IFJlYWRBc3luYyhfcGVla0J1ZmZlciwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9oYXNQZWVrQnl0ZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgT3BlbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOworCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKG5hbWVvZihvZmZzZXQpLCAiQnVmZmVyIG9mZnNldCBpcyBzbWFsbGVyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YobGVuZ3RoKSwgIkJ1ZmZlciBsZW5ndGggaXMgc21hbGxlciB0aGFuIHplcm8uIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBidWZmZXIuTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKGJ1ZmZlciksICJOb3QgZW5vdWdoIGRhdGEuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxpbnQ+IFJlYWRBbGxBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEFsbEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxpbnQ+IFJlYWRBbGxBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJldHJpZXZlZCA9IDA7CisKKyAgICAgICAgICAgIC8vSWYgd2UgcHJldmlvdXNseSBwZWVrZWQgYSBieXRlLCB3ZSBuZWVkIHRvIHVzZSB0aGF0IGZpcnN0LgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgcmV0cmlldmVkKytdID0gX3BlZWtCdWZmZXJbMF07CisgICAgICAgICAgICAgICAgX2hhc1BlZWtCeXRlID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChyZXRyaWV2ZWQgPCBsZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvdW50ID0gYXdhaXQgUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0ICsgcmV0cmlldmVkLCBsZW5ndGggLSByZXRyaWV2ZWQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWRDb3VudCA8PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCwgUmVtb3RlIHNpZGUgaGFzIGNsb3NlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXRyaWV2ZWQgKz0gcmV0dXJuZWRDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXRyaWV2ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVBc3luYyhidWZmZXIsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUFzeW5jKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgRmx1c2hBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTk2M2YxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldHN0ZC9UaHJpZnQvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwyMDkgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIC8vVE9ETzogY2hlY2sgZm9yIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBURnJhbWVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgSGVhZGVyU2l6ZSA9IDQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIF9oZWFkZXJCdWYgPSBuZXcgYnl0ZVtIZWFkZXJTaXplXTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gX3JlYWRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDEwMjQpOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRUcmFuc3BvcnQgX3RyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gX3dyaXRlQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKKworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisKKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF90cmFuc3BvcnQgPSB0cmFuc3BvcnQgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YodHJhbnNwb3J0KSk7CisKKyAgICAgICAgICAgIEluaXRXcml0ZUJ1ZmZlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+ICFfaXNEaXNwb3NlZCAmJiBfdHJhbnNwb3J0LklzT3BlbjsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5PcGVuQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIF90cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGdvdCA9IGF3YWl0IF9yZWFkQnVmZmVyLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoZ290ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGFub3RoZXIgZnJhbWUgb2YgZGF0YQorICAgICAgICAgICAgYXdhaXQgUmVhZEZyYW1lQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlYWRCdWZmZXIuUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBSZWFkRnJhbWVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5SZWFkQWxsQXN5bmMoX2hlYWRlckJ1ZiwgMCwgSGVhZGVyU2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgc2l6ZSA9IERlY29kZUZyYW1lU2l6ZShfaGVhZGVyQnVmKTsKKworICAgICAgICAgICAgX3JlYWRCdWZmZXIuU2V0TGVuZ3RoKHNpemUpOworICAgICAgICAgICAgX3JlYWRCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgQXJyYXlTZWdtZW50PGJ5dGU+IGJ1ZlNlZ21lbnQ7CisgICAgICAgICAgICBfcmVhZEJ1ZmZlci5UcnlHZXRCdWZmZXIob3V0IGJ1ZlNlZ21lbnQpOworCisgICAgICAgICAgICB2YXIgYnVmZiA9IGJ1ZlNlZ21lbnQuQXJyYXk7CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuUmVhZEFsbEFzeW5jKGJ1ZmYsIDAsIHNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfd3JpdGVCdWZmZXIuTGVuZ3RoICsgbGVuZ3RoID4gaW50Lk1heFZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IEZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBfd3JpdGVCdWZmZXIuV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9BcnJheVNlZ21lbnQ8Ynl0ZT4gYnVmU2VnbWVudDsKKyAgICAgICAgICAgIC8vX3dyaXRlQnVmZmVyLlRyeUdldEJ1ZmZlcihvdXQgYnVmU2VnbWVudCk7CisgICAgICAgICAgICAvL3ZhciBidWYgPSBidWZTZWdtZW50LkFycmF5OworICAgICAgICAgICAgdmFyIGJ1ZiA9IF93cml0ZUJ1ZmZlci5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIC8vdmFyIGxlbiA9IChpbnQpX3dyaXRlQnVmZmVyLkxlbmd0aDsKKyAgICAgICAgICAgIHZhciBkYXRhTGVuID0gKGludCkgX3dyaXRlQnVmZmVyLkxlbmd0aCAtIEhlYWRlclNpemU7CisgICAgICAgICAgICBpZiAoZGF0YUxlbiA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsgLy8gbG9naWMgZXJyb3IgYWN0dWFsbHkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW5qZWN0IG1lc3NhZ2UgaGVhZGVyIGludG8gdGhlIHJlc2VydmVkIGJ1ZmZlciBzcGFjZQorICAgICAgICAgICAgRW5jb2RlRnJhbWVTaXplKGRhdGFMZW4sIGJ1Zik7CisKKyAgICAgICAgICAgIC8vIFNlbmQgdGhlIGVudGlyZSBtZXNzYWdlIGF0IG9uY2UKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuV3JpdGVBc3luYyhidWYsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFdyaXRlQnVmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgbWVzc2FnZSBoZWFkZXIgdG8gYmUgcHV0IHJpZ2h0IGJlZm9yZSBzZW5kaW5nIGl0IG91dAorICAgICAgICAgICAgX3dyaXRlQnVmZmVyLlNldExlbmd0aChIZWFkZXJTaXplKTsKKyAgICAgICAgICAgIF93cml0ZUJ1ZmZlci5TZWVrKDAsIFNlZWtPcmlnaW4uRW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRW5jb2RlRnJhbWVTaXplKGludCBmcmFtZVNpemUsIGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZlswXSA9IChieXRlKSAoMHhmZiAmIChmcmFtZVNpemUgPj4gMjQpKTsKKyAgICAgICAgICAgIGJ1ZlsxXSA9IChieXRlKSAoMHhmZiAmIChmcmFtZVNpemUgPj4gMTYpKTsKKyAgICAgICAgICAgIGJ1ZlsyXSA9IChieXRlKSAoMHhmZiAmIChmcmFtZVNpemUgPj4gOCkpOworICAgICAgICAgICAgYnVmWzNdID0gKGJ5dGUpICgweGZmICYgKGZyYW1lU2l6ZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IERlY29kZUZyYW1lU2l6ZShieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAoKGJ1ZlswXSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgKChidWZbMV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICgoYnVmWzJdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgIChidWZbM10gJiAweGZmKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENoZWNrTm90RGlzcG9zZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJURnJhbWVkVHJhbnNwb3J0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcmVhZEJ1ZmZlcj8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfd3JpdGVCdWZmZXI/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX3RyYW5zcG9ydD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNWMwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDU0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBMaXN0ZW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgQ2xvc2UoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2wgSXNDbGllbnRQZW5kaW5nKCk7CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgYXN5bmMgVGFzazxUVHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVGFzazxUVHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxUVHJhbnNwb3J0PiBBY2NlcHRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBBY2NlcHRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPFRUcmFuc3BvcnQ+IEFjY2VwdEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gYXdhaXQgQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkIntuYW1lb2YoQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyl9IHNob3VsZCBub3QgcmV0dXJuIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydDsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MGExNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDYwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBlbnVtIEV4Y2VwdGlvblR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgVW5rbm93biwKKyAgICAgICAgICAgIE5vdE9wZW4sCisgICAgICAgICAgICBBbHJlYWR5T3BlbiwKKyAgICAgICAgICAgIFRpbWVkT3V0LAorICAgICAgICAgICAgRW5kT2ZGaWxlLAorICAgICAgICAgICAgSW50ZXJydXB0ZWQKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25UeXBlIEV4VHlwZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgZXhUeXBlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKHN0cmluZy5FbXB0eSwgaW5uZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4VHlwZSA9IGV4VHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgZXhUeXBlLCBzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyID0gbnVsbCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKKyAgICAgICAgeworICAgICAgICAgICAgRXhUeXBlID0gZXhUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25UeXBlIFR5cGUgPT4gRXhUeXBlOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MgYi9saWIvbmV0c3RkL1RocmlmdC9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2NjJmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvVGhyaWZ0L1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcwpAQCAtMCwwICsxLDM1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICAgIEZyb20gTWFyayBTbGVlICYgQWRpdHlhIEFnYXJ3YWwgb2YgRmFjZWJvb2s6CisgICAgLy8vICAgICBGYWN0b3J5IGNsYXNzIHVzZWQgdG8gY3JlYXRlIHdyYXBwZWQgaW5zdGFuY2Ugb2YgVHJhbnNwb3J0cy4KKyAgICAvLy8gICAgIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgaW4gc2VydmVycywgd2hpY2ggZ2V0IFRyYW5zcG9ydHMgZnJvbQorICAgIC8vLyAgICAgYSBTZXJ2ZXJUcmFuc3BvcnQgYW5kIHRoZW4gbWF5IHdhbnQgdG8gbXV0YXRlIHRoZW0gKGkuZS4gY3JlYXRlCisgICAgLy8vICAgICBhIEJ1ZmZlcmVkVHJhbnNwb3J0IGZyb20gdGhlIHVuZGVybHlpbmcgYmFzZSB0cmFuc3BvcnQpCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeQorICAgIHsKKyAgICAgICAgcHVibGljIHZpcnR1YWwgVFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvYnVpbGQuY21kIGIvbGliL25ldHN0ZC9idWlsZC5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzYzRiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvYnVpbGQuY21kCkBAIC0wLDAgKzEsMjcgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworCitzZXRsb2NhbAorCit0aHJpZnQgLXZlcnNpb24KK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZCAKKworOmVvZgpkaWZmIC0tZ2l0IGEvbGliL25ldHN0ZC9idWlsZC5zaCBiL2xpYi9uZXRzdGQvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxOGJjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRzdGQvYnVpbGQuc2gKQEAgLTAsMCArMSwzMiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworI2V4aXQgaWYgYW55IGNvbW1hbmQgZmFpbHMKKyNzZXQgLWUKKwordGhyaWZ0IC0tdmVyc2lvbgorZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkIAorCisjcmV2aXNpb249JHtUUkFWSVNfSk9CX0lEOj0xfSAgCisjcmV2aXNpb249JChwcmludGYgIiUwNGQiICRyZXZpc2lvbikgCisKKyNkb3RuZXQgcGFjayAuL3NyYy9QUk9KRUNUX05BTUUgLWMgUmVsZWFzZSAtbyAuL2FydGlmYWN0cyAtLXZlcnNpb24tc3VmZml4PSRyZXZpc2lvbiAgCmRpZmYgLS1naXQgYS9saWIvbmV0c3RkL3J1bnRlc3RzLmNtZCBiL2xpYi9uZXRzdGQvcnVudGVzdHMuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMTRiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL3J1bnRlc3RzLmNtZApAQCAtMCwwICsxLDI4IEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KK3NldGxvY2FsCisKK3RocmlmdCAtdmVyc2lvbgorZG90bmV0IC0taW5mbworCitkb3RuZXQgdGVzdCBUZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5UZXN0c1xUaHJpZnQuVGVzdHMuY3Nwcm9qCisKKzplb2YKZGlmZiAtLWdpdCBhL2xpYi9uZXRzdGQvcnVudGVzdHMuc2ggYi9saWIvbmV0c3RkL3J1bnRlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNmNjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0c3RkL3J1bnRlc3RzLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3RocmlmdCAtdmVyc2lvbgorZG90bmV0IC0taW5mbworCitkb3RuZXQgdGVzdCBUZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5UZXN0c1xUaHJpZnQuVGVzdHMuY3Nwcm9qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9NYWtlZmlsZS5hbSBiL2xpYi9ub2RlanMvTWFrZWZpbGUuYW0KaW5kZXggNmQ3ODViZS4uMDkxZjc2OCAxMDA3NTUKLS0tIGEvbGliL25vZGVqcy9NYWtlZmlsZS5hbQorKysgYi9saWIvbm9kZWpzL01ha2VmaWxlLmFtCkBAIC0xNSwyNCArMTUsMjQgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KIAotCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorIyBXZSBjYWxsIG5wbSB0d2ljZSB0byB3b3JrIGFyb3VuZCBucG0gaXNzdWVzCiAKIHN0dWJzOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4ganM6bm9kZSAtbyB0ZXN0LyAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAogZGVwczogJCh0b3Bfc3JjZGlyKS9wYWNrYWdlLmpzb24KLQkkKE5QTSkgaW5zdGFsbCAtLW5vLWJpbi1saW5rcyAkKHRvcF9zcmNkaXIpLworCSQoTlBNKSBpbnN0YWxsICQodG9wX3NyY2RpcikvIHx8ICQoTlBNKSBpbnN0YWxsICQodG9wX3NyY2RpcikvCiAKIGFsbC1sb2NhbDogZGVwcwogCiBwcmVjcm9zczogZGVwcyBzdHVicwogCisjIFRPRE86IExpbnQgbm9kZWpzIGxpYiBhbmQgZ2VuLWNvZGUgYXMgcGFydCBvZiBidWlsZAogY2hlY2s6IGRlcHMKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoTlBNKSB0ZXN0ICYmIGNkIGxpYi9ub2RlanMKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoTlBNKSB0ZXN0ICYmICQoTlBNKSBydW4gbGludC10ZXN0cyAmJiBjZCBsaWIvbm9kZWpzCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIHRlc3QvZ2VuLW5vZGVqcworCSQoUk0pIC1yIHRlc3QvZ2VuLSoKIAkkKFJNKSAtciAkKHRvcF9zcmNkaXIpL25vZGVfbW9kdWxlcwogCiBFWFRSQV9ESVNUID0gXApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9SRUFETUUubWQgYi9saWIvbm9kZWpzL1JFQURNRS5tZAppbmRleCA4ODQ5OWY3Li41MGFjZmJkIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL1JFQURNRS5tZAorKysgYi9saWIvbm9kZWpzL1JFQURNRS5tZApAQCAtMjAsNiArMjAsOSBAQAogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogdW5kZXIgdGhlIExpY2Vuc2UuCiAKKyMjIENvbXBhdGliaWxpdHkKKworbm9kZSB2ZXJzaW9uIDYgb3IgbGF0ZXIgaXMgcmVxdWlyZWQKIAogIyMgSW5zdGFsbAogCkBAIC0zNSwzMCArMzgsMzIgQEAKIAogSGVyZSBpcyBhIENhc3NhbmRyYSBleGFtcGxlOgogCi0gICAgdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpLAotICAgICAgICBDYXNzYW5kcmEgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvQ2Fzc2FuZHJhJykKLSAgICAgICAgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL2Nhc3NhbmRyYV90eXBlcycpOworYGBganMKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKSwKKyAgICBDYXNzYW5kcmEgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvQ2Fzc2FuZHJhJykKKyAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvY2Fzc2FuZHJhX3R5cGVzJyk7CiAKLSAgICB2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MTYwKSwKLSAgICAgICAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChDYXNzYW5kcmEsIGNvbm5lY3Rpb24pOwordmFyIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbigibG9jYWxob3N0IiwgOTE2MCksCisgICAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChDYXNzYW5kcmEsIGNvbm5lY3Rpb24pOwogCi0gICAgY29ubmVjdGlvbi5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKLSAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKLSAgICB9KTsKK2Nvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7CisgIGNvbnNvbGUuZXJyb3IoZXJyKTsKK30pOwogCi0gICAgY2xpZW50LmdldF9zbGljZSgiS2V5c3BhY2UiLCAia2V5IiwgbmV3IHR0eXBlcy5Db2x1bW5QYXJlbnQoe2NvbHVtbl9mYW1pbHk6ICJFeGFtcGxlQ0YifSksIG5ldyB0dHlwZXMuU2xpY2VQcmVkaWNhdGUoe3NsaWNlX3JhbmdlOiBuZXcgdHR5cGVzLlNsaWNlUmFuZ2Uoe3N0YXJ0OiAnJywgZmluaXNoOiAnJ30pfSksIHR0eXBlcy5Db25zaXN0ZW5jeUxldmVsLk9ORSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7Ci0gICAgICBpZiAoZXJyKSB7Ci0gICAgICAgIC8vIGhhbmRsZSBlcnIKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGRhdGEgPT0gW3R0eXBlcy5Db2x1bW5PclN1cGVyQ29sdW1uLCAuLi5dCi0gICAgICB9Ci0gICAgICBjb25uZWN0aW9uLmVuZCgpOwotICAgIH0pOworY2xpZW50LmdldF9zbGljZSgiS2V5c3BhY2UiLCAia2V5IiwgbmV3IHR0eXBlcy5Db2x1bW5QYXJlbnQoe2NvbHVtbl9mYW1pbHk6ICJFeGFtcGxlQ0YifSksIG5ldyB0dHlwZXMuU2xpY2VQcmVkaWNhdGUoe3NsaWNlX3JhbmdlOiBuZXcgdHR5cGVzLlNsaWNlUmFuZ2Uoe3N0YXJ0OiAnJywgZmluaXNoOiAnJ30pfSksIHR0eXBlcy5Db25zaXN0ZW5jeUxldmVsLk9ORSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7CisgIGlmIChlcnIpIHsKKyAgICAvLyBoYW5kbGUgZXJyCisgIH0gZWxzZSB7CisgICAgLy8gZGF0YSA9PSBbdHR5cGVzLkNvbHVtbk9yU3VwZXJDb2x1bW4sIC4uLl0KKyAgfQorICBjb25uZWN0aW9uLmVuZCgpOworfSk7CitgYGAKIAogPGEgbmFtZT0iaW50NjQiPjwvYT4KICMjIEludDY0CiAKLVNpbmNlIEphdmFTY3JpcHQgcmVwcmVzZW50cyBhbGwgbnVtYmVycyBhcyBkb3VibGVzLCBpbnQ2NCB2YWx1ZXMgY2Fubm90IGJlIGFjY3VyYXRlbHkgcmVwcmVzZW50ZWQgbmF0dXJhbGx5LiBUbyBzb2x2ZSB0aGlzLCBpbnQ2NCB2YWx1ZXMgaW4gcmVzcG9uc2VzIHdpbGwgYmUgd3JhcHBlZCB3aXRoIFRoaXJmdC5JbnQ2NCBvYmplY3RzLiBUaGUgSW50NjQgaW1wbGVtZW50YXRpb24gdXNlZCBpcyBbYnJvb2ZhL25vZGUtaW50NjRdKGh0dHBzOi8vZ2l0aHViLmNvbS9icm9vZmEvbm9kZS1pbnQ2NCkuCitTaW5jZSBKYXZhU2NyaXB0IHJlcHJlc2VudHMgYWxsIG51bWJlcnMgYXMgZG91YmxlcywgaW50NjQgdmFsdWVzIGNhbm5vdCBiZSBhY2N1cmF0ZWx5IHJlcHJlc2VudGVkIG5hdHVyYWxseS4gVG8gc29sdmUgdGhpcywgaW50NjQgdmFsdWVzIGluIHJlc3BvbnNlcyB3aWxsIGJlIHdyYXBwZWQgd2l0aCBUaHJpZnQuSW50NjQgb2JqZWN0cy4gVGhlIEludDY0IGltcGxlbWVudGF0aW9uIHVzZWQgaXMgW2Jyb29mYS9ub2RlLWludDY0XShodHRwczovL2dpdGh1Yi5jb20vYnJvb2ZhL25vZGUtaW50NjQpLgogCiAjIyBDbGllbnQgYW5kIHNlcnZlciBleGFtcGxlcwogCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIucHkgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIucHkKaW5kZXggYjhiYTU4Ni4uNzZlOWY0YSAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9leGFtcGxlcy9odHRwU2VydmVyLnB5CisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5weQpAQCAtNSwxMCArNSwxMiBAQAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVEh0dHBTZXJ2ZXIKIAorCiBjbGFzcyBIZWxsb1N2Y0hhbmRsZXI6Ci0gIGRlZiBoZWxsb19mdW5jKHNlbGYpOgotICAgIHByaW50ICJIZWxsbyBDYWxsZWQiCi0gICAgcmV0dXJuICJoZWxsbyBmcm9tIFB5dGhvbiIKKyAgICBkZWYgaGVsbG9fZnVuYyhzZWxmKToKKyAgICAgICAgcHJpbnQoIkhlbGxvIENhbGxlZCIpCisgICAgICAgIHJldHVybiAiaGVsbG8gZnJvbSBQeXRob24iCisKIAogcHJvY2Vzc29yID0gSGVsbG9TdmMuUHJvY2Vzc29yKEhlbGxvU3ZjSGFuZGxlcigpKQogcHJvdG9GYWN0b3J5ID0gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpCkBAIC0xNiw0ICsxOCwzIEBACiBzZXJ2ZXIgPSBUSHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgibG9jYWxob3N0IiwgcG9ydCksIHByb3RvRmFjdG9yeSkKIHByaW50ICJQeXRob24gc2VydmVyIHJ1bm5pbmcgb24gcG9ydCAiICsgc3RyKHBvcnQpCiBzZXJ2ZXIuc2VydmUoKQotCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcwppbmRleCBhMjMwMjkxLi5hZjg4MzZjIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuanMKQEAgLTMzLDEwICszMywxNSBAQAogICAgIFZFUlNJT05fMSA9IC0yMTQ3NDE4MTEyLCAvLyAweDgwMDEwMDAwCiAgICAgVFlQRV9NQVNLID0gMHgwMDAwMDBmZjsKIAorVEJpbmFyeVByb3RvY29sLlZFUlNJT05fTUFTSyA9IFZFUlNJT05fTUFTSzsKK1RCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzEgPSBWRVJTSU9OXzE7CitUQmluYXJ5UHJvdG9jb2wuVFlQRV9NQVNLID0gVFlQRV9NQVNLCisKIGZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKICAgdGhpcy50cmFucyA9IHRyYW5zOwogICB0aGlzLnN0cmljdFJlYWQgPSAoc3RyaWN0UmVhZCAhPT0gdW5kZWZpbmVkID8gc3RyaWN0UmVhZCA6IGZhbHNlKTsKICAgdGhpcy5zdHJpY3RXcml0ZSA9IChzdHJpY3RXcml0ZSAhPT0gdW5kZWZpbmVkID8gc3RyaWN0V3JpdGUgOiB0cnVlKTsKKyAgdGhpcy5fc2VxaWQgPSBudWxsOwogfTsKIAogVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgewpAQCAtNTQsOCArNTksNyBAQAogICAgICAgdGhpcy53cml0ZUkzMihzZXFpZCk7CiAgICAgfQogICAgIC8vIFJlY29yZCBjbGllbnQgc2VxaWQgdG8gZmluZCBjYWxsYmFjayBhZ2FpbgotICAgIGlmICh0aGlzLl9zZXFpZCkgewotICAgICAgLy8gVE9ETyBiZXR0ZXIgbG9nZ2luZyBsb2cgd2FybmluZworICAgIGlmICh0aGlzLl9zZXFpZCAhPT0gbnVsbCkgewogICAgICAgbG9nLndhcm5pbmcoJ1NlcUlkIGFscmVhZHkgc2V0JywgeyAnbmFtZSc6IG5hbWUgfSk7CiAgICAgfSBlbHNlIHsKICAgICAgIHRoaXMuX3NlcWlkID0gc2VxaWQ7CkBAIC02NCw3ICs2OCw3IEBACiB9OwogCiBUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUVuZCA9IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLl9zZXFpZCkgeworICAgIGlmICh0aGlzLl9zZXFpZCAhPT0gbnVsbCkgewogICAgICAgICB0aGlzLl9zZXFpZCA9IG51bGw7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbG9nLndhcm5pbmcoJ05vIHNlcWlkIHRvIHVuc2V0Jyk7CkBAIC0xNDYsMjIgKzE1MCwxMCBAQAogICB0aGlzLnRyYW5zLndyaXRlKGJpbmFyeS53cml0ZURvdWJsZShuZXcgQnVmZmVyKDgpLCBkdWIpKTsKIH07CiAKLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbihhcmcpIHsKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmdPckJpbmFyeSA9IGZ1bmN0aW9uKG5hbWUsIGVuY29kaW5nLCBhcmcpIHsKICAgaWYgKHR5cGVvZihhcmcpID09PSAnc3RyaW5nJykgewotICAgIHRoaXMud3JpdGVJMzIoQnVmZmVyLmJ5dGVMZW5ndGgoYXJnLCAndXRmOCcpKTsKLSAgICB0aGlzLnRyYW5zLndyaXRlKGFyZywgJ3V0ZjgnKTsKLSAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBCdWZmZXIpIHsKLSAgICB0aGlzLndyaXRlSTMyKGFyZy5sZW5ndGgpOwotICAgIHRoaXMudHJhbnMud3JpdGUoYXJnKTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlU3RyaW5nIGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7Ci0gIH0KLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCaW5hcnkgPSBmdW5jdGlvbihhcmcpIHsKLSAgaWYgKHR5cGVvZihhcmcpID09PSAnc3RyaW5nJykgewotICAgIHRoaXMud3JpdGVJMzIoQnVmZmVyLmJ5dGVMZW5ndGgoYXJnLCAndXRmOCcpKTsKLSAgICB0aGlzLnRyYW5zLndyaXRlKGFyZywgJ3V0ZjgnKTsKKyAgICB0aGlzLndyaXRlSTMyKEJ1ZmZlci5ieXRlTGVuZ3RoKGFyZywgZW5jb2RpbmcpKTsKKyAgICB0aGlzLnRyYW5zLndyaXRlKG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZykpOwogICB9IGVsc2UgaWYgKChhcmcgaW5zdGFuY2VvZiBCdWZmZXIpIHx8CiAgICAgICAgICAgICAgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykpIHsKICAgICAvLyBCdWZmZXJzIGluIE5vZGUuanMgdW5kZXIgQnJvd3NlcmlmeSBtYXkgZXh0ZW5kIFVJbnQ4QXJyYXkgaW5zdGVhZCBvZgpAQCAtMTcwLDEwICsxNjIsMTggQEAKICAgICB0aGlzLndyaXRlSTMyKGFyZy5sZW5ndGgpOwogICAgIHRoaXMudHJhbnMud3JpdGUoYXJnKTsKICAgfSBlbHNlIHsKLSAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlQmluYXJ5IGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7CisgICAgdGhyb3cgbmV3IEVycm9yKG5hbWUgKyAnIGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7CiAgIH0KIH07CiAKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbihhcmcpIHsKKyAgdGhpcy53cml0ZVN0cmluZ09yQmluYXJ5KCd3cml0ZVN0cmluZycsICd1dGY4JywgYXJnKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCaW5hcnkgPSBmdW5jdGlvbihhcmcpIHsKKyAgdGhpcy53cml0ZVN0cmluZ09yQmluYXJ5KCd3cml0ZUJpbmFyeScsICdiaW5hcnknLCBhcmcpOworfTsKKwogVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24oKSB7CiAgIHZhciBzeiA9IHRoaXMucmVhZEkzMigpOwogICB2YXIgdHlwZSwgbmFtZSwgc2VxaWQ7CkBAIC0xODEsNyArMTgxLDYgQEAKICAgaWYgKHN6IDwgMCkgewogICAgIHZhciB2ZXJzaW9uID0gc3ogJiBWRVJTSU9OX01BU0s7CiAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKSB7Ci0gICAgICBjb25zb2xlLmxvZygiQkFEOiAiICsgdmVyc2lvbik7CiAgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5CQURfVkVSU0lPTiwgIkJhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW46ICIgKyBzeik7CiAgICAgfQogICAgIHR5cGUgPSBzeiAmIFRZUEVfTUFTSzsKQEAgLTI3OSwxMSArMjc4LDI1IEBACiAKIFRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgewogICB2YXIgbGVuID0gdGhpcy5yZWFkSTMyKCk7CisgIGlmIChsZW4gPT09IDApIHsKKyAgICByZXR1cm4gbmV3IEJ1ZmZlcigwKTsKKyAgfQorCisgIGlmIChsZW4gPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIGJpbmFyeSBzaXplIik7CisgIH0KICAgcmV0dXJuIHRoaXMudHJhbnMucmVhZChsZW4pOwogfTsKIAogVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgIHZhciBsZW4gPSB0aGlzLnJlYWRJMzIoKTsKKyAgaWYgKGxlbiA9PT0gMCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIGlmIChsZW4gPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIHN0cmluZyBzaXplIik7CisgIH0KICAgcmV0dXJuIHRoaXMudHJhbnMucmVhZFN0cmluZyhsZW4pOwogfTsKIApAQCAtMjkzLDggKzMwNiw2IEBACiAKIFRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKHR5cGUpIHsKICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBUeXBlLlNUT1A6Ci0gICAgICByZXR1cm47CiAgICAgY2FzZSBUeXBlLkJPT0w6CiAgICAgICB0aGlzLnJlYWRCb29sKCk7CiAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9icm93c2VyLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Jyb3dzZXIuanMKaW5kZXggNDU5M2E4Zi4uNjdjZTg1MyAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Jyb3dzZXIuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Jyb3dzZXIuanMKQEAgLTMyLDMgKzMyLDUgQEAKIGV4cG9ydHMuUHJvdG9jb2wgPSBleHBvcnRzLlRKU09OUHJvdG9jb2wgPSByZXF1aXJlKCcuL2pzb25fcHJvdG9jb2wnKTsKIGV4cG9ydHMuVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKIGV4cG9ydHMuVENvbXBhY3RQcm90b2NvbCA9IHJlcXVpcmUoJy4vY29tcGFjdF9wcm90b2NvbCcpOworCitleHBvcnRzLkludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuanMKaW5kZXggMTM2MzZiNS4uMTEzZTIxNiAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmpzCkBAIC0xOSw2ICsxOSw3IEBACiAKIHZhciBiaW5hcnkgPSByZXF1aXJlKCcuL2JpbmFyeScpOwogdmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7Cit2YXIgVEhlYWRlclRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vaGVhZGVyX3RyYW5zcG9ydCcpOwogCiBtb2R1bGUuZXhwb3J0cyA9IFRCdWZmZXJlZFRyYW5zcG9ydDsKIApAQCAtMzMsNiArMzQsMTYgQEAKICAgdGhpcy5vbkZsdXNoID0gY2FsbGJhY2s7CiB9OwogCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlID0gbmV3IFRIZWFkZXJUcmFuc3BvcnQoKTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmluQnVmID0gbmV3IEJ1ZmZlcih0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSk7CisgIHRoaXMucmVhZEN1cnNvciA9IDA7CisgIHRoaXMud3JpdGVDdXJzb3IgPSAwOworICB0aGlzLm91dEJ1ZmZlcnMgPSBbXTsKKyAgdGhpcy5vdXRDb3VudCA9IDA7Cit9CisKIFRCdWZmZXJlZFRyYW5zcG9ydC5yZWNlaXZlciA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBzZXFpZCkgewogICB2YXIgcmVhZGVyID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpOwogCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmpzCmluZGV4IDhhZWU4MDguLjMwMmE4OGQgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmpzCkBAIC0yNDksNyArMjQ5LDYgQEAKIAogICAvLyBSZWNvcmQgY2xpZW50IHNlcWlkIHRvIGZpbmQgY2FsbGJhY2sgYWdhaW4KICAgaWYgKHRoaXMuX3NlcWlkKSB7Ci0gICAgLy8gVE9ETyBiZXR0ZXIgbG9nZ2luZyBsb2cgd2FybmluZwogICAgIGxvZy53YXJuaW5nKCdTZXFJZCBhbHJlYWR5IHNldCcsIHsgJ25hbWUnOiBuYW1lIH0pOwogICB9IGVsc2UgewogICAgIHRoaXMuX3NlcWlkID0gc2VxaWQ7CkBAIC00MjksMjIgKzQyOCwzMCBAQAogICB0aGlzLnRyYW5zLndyaXRlKGJ1ZmYpOwogfTsKIAotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbihhcmcpIHsKLSAgdGhpcy53cml0ZUJpbmFyeShhcmcpOwotfTsKLQotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCaW5hcnkgPSBmdW5jdGlvbihhcmcpIHsKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nT3JCaW5hcnkgPSBmdW5jdGlvbihuYW1lLCBlbmNvZGluZywgYXJnKSB7CiAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykgewotICAgIHRoaXMud3JpdGVWYXJpbnQzMihCdWZmZXIuYnl0ZUxlbmd0aChhcmcsICd1dGY4JykpIDsKLSAgICB0aGlzLnRyYW5zLndyaXRlKGFyZywgJ3V0ZjgnKTsKLSAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBCdWZmZXIpIHsKKyAgICB0aGlzLndyaXRlVmFyaW50MzIoQnVmZmVyLmJ5dGVMZW5ndGgoYXJnLCBlbmNvZGluZykpIDsKKyAgICB0aGlzLnRyYW5zLndyaXRlKG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZykpOworICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEJ1ZmZlciB8fAorICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykgeworICAgIC8vIEJ1ZmZlcnMgaW4gTm9kZS5qcyB1bmRlciBCcm93c2VyaWZ5IG1heSBleHRlbmQgVUludDhBcnJheSBpbnN0ZWFkIG9mCisgICAgLy8gZGVmaW5pbmcgYSBuZXcgb2JqZWN0LiBXZSBkZXRlY3QgdGhlbSBoZXJlIHNvIHdlIGNhbiB3cml0ZSB0aGVtCisgICAgLy8gY29ycmVjdGx5CiAgICAgdGhpcy53cml0ZVZhcmludDMyKGFyZy5sZW5ndGgpOwogICAgIHRoaXMudHJhbnMud3JpdGUoYXJnKTsKICAgfSBlbHNlIHsKLSAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlU3RyaW5nL3dyaXRlQmluYXJ5IGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7CisgICAgdGhyb3cgbmV3IEVycm9yKG5hbWUgKyAnIGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7CiAgIH0KIH07CiAKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nID0gZnVuY3Rpb24oYXJnKSB7CisgIHRoaXMud3JpdGVTdHJpbmdPckJpbmFyeSgnd3JpdGVTdHJpbmcnLCAndXRmOCcsIGFyZyk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUJpbmFyeSA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlQmluYXJ5JywgJ2JpbmFyeScsIGFyZyk7Cit9OworCiAKIC8vCiAvLyBDb21wYWN0IFByb3RvY29sIGludGVybmFsIHdyaXRlIG1ldGhvZHMKQEAgLTc1Miw2ICs3NTksMTggQEAKIAogVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgewogICB2YXIgc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIGlmIChzaXplID09PSAwKSB7CisgICAgcmV0dXJuIG5ldyBCdWZmZXIoMCk7CisgIH0KKworICBpZiAoc2l6ZSA8IDApIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgYmluYXJ5IHNpemUiKTsKKyAgfQorICByZXR1cm4gdGhpcy50cmFucy5yZWFkKHNpemUpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CiAgIC8vIENhdGNoIGVtcHR5IHN0cmluZyBjYXNlCiAgIGlmIChzaXplID09PSAwKSB7CiAgICAgcmV0dXJuICIiOwpAQCAtNzU5LDE1ICs3NzgsOSBAQAogCiAgIC8vIENhdGNoIGVycm9yIGNhc2VzCiAgIGlmIChzaXplIDwgMCkgewotICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLk5FR0FUSVZFX1NJWkUsICJOZWdhdGl2ZSBiaW5hcnkvc3RyaW5nIHNpemUiKTsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgc3RyaW5nIHNpemUiKTsKICAgfQotICB2YXIgdmFsdWUgPSB0aGlzLnRyYW5zLnJlYWRTdHJpbmcoc2l6ZSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfTsKLQotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkQmluYXJ5KCk7CisgIHJldHVybiB0aGlzLnRyYW5zLnJlYWRTdHJpbmcoc2l6ZSk7CiB9OwogCiAKQEAgLTg0MSw4ICs4NTQsNiBAQAogCiBUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24odHlwZSkgewogICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFR5cGUuU1RPUDoKLSAgICAgIHJldHVybjsKICAgICBjYXNlIFR5cGUuQk9PTDoKICAgICAgIHRoaXMucmVhZEJvb2woKTsKICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29ubmVjdGlvbi5qcwppbmRleCA0Yjg0Yjc2Li45ZTVjMDYzIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29ubmVjdGlvbi5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29ubmVjdGlvbi5qcwpAQCAtMTcsMTAgKzE3LDEyIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogdmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7Ci12YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiZXZlbnRzIikuRXZlbnRFbWl0dGVyOwordmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjsKK3ZhciBjb25zdGFudHMgPSByZXF1aXJlKCdjb25zdGFudHMnKTsKIHZhciBuZXQgPSByZXF1aXJlKCduZXQnKTsKIHZhciB0bHMgPSByZXF1aXJlKCd0bHMnKTsKIHZhciB0aHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwordmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7CiAKIHZhciBUQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOwogdmFyIFRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7CkBAIC0zNiw2ICszOCw3IEBACiAKICAgdGhpcy5zZXFJZDJTZXJ2aWNlID0ge307CiAgIHRoaXMuY29ubmVjdGlvbiA9IHN0cmVhbTsKKyAgdGhpcy5zc2wgPSAoc3RyZWFtLmVuY3J5cHRlZCk7CiAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgIHRoaXMudHJhbnNwb3J0ID0gdGhpcy5vcHRpb25zLnRyYW5zcG9ydCB8fCBUQnVmZmVyZWRUcmFuc3BvcnQ7CiAgIHRoaXMucHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMucHJvdG9jb2wgfHwgVEJpbmFyeVByb3RvY29sOwpAQCAtNjEsNyArNjQsOCBAQAogICAgICAgdGhpcy5vcHRpb25zLmNvbm5lY3RfdGltZW91dCA+IDApIHsKICAgICAgdGhpcy5jb25uZWN0X3RpbWVvdXQgPSArdGhpcy5vcHRpb25zLmNvbm5lY3RfdGltZW91dDsKICAgfQotICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImNvbm5lY3QiLCBmdW5jdGlvbigpIHsKKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIodGhpcy5zc2wgPyAic2VjdXJlQ29ubmVjdCIgOiAiY29ubmVjdCIsIGZ1bmN0aW9uKCkgewogICAgIHNlbGYuY29ubmVjdGVkID0gdHJ1ZTsKIAogICAgIHRoaXMuc2V0VGltZW91dChzZWxmLm9wdGlvbnMudGltZW91dCB8fCAwKTsKQEAgLTc4LDM0ICs4MiwxNCBAQAogICAgIHNlbGYuZW1pdCgiY29ubmVjdCIpOwogICB9KTsKIAotICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoInNlY3VyZUNvbm5lY3QiLCBmdW5jdGlvbigpIHsKLSAgICBzZWxmLmNvbm5lY3RlZCA9IHRydWU7Ci0KLSAgICB0aGlzLnNldFRpbWVvdXQoc2VsZi5vcHRpb25zLnRpbWVvdXQgfHwgMCk7Ci0gICAgdGhpcy5zZXROb0RlbGF5KCk7Ci0gICAgdGhpcy5mcmFtZUxlZnQgPSAwOwotICAgIHRoaXMuZnJhbWVQb3MgPSAwOwotICAgIHRoaXMuZnJhbWUgPSBudWxsOwotICAgIHNlbGYuaW5pdGlhbGl6ZV9yZXRyeV92YXJzKCk7Ci0KLSAgICBzZWxmLm9mZmxpbmVfcXVldWUuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7Ci0gICAgICBzZWxmLmNvbm5lY3Rpb24ud3JpdGUoZGF0YSk7Ci0gICAgfSk7Ci0KLSAgICBzZWxmLmVtaXQoImNvbm5lY3QiKTsKLSAgfSk7Ci0KLQogICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImVycm9yIiwgZnVuY3Rpb24oZXJyKSB7CiAgICAgLy8gT25seSBlbWl0IHRoZSBlcnJvciBpZiBuby1vbmUgZWxzZSBpcyBsaXN0ZW5pbmcgb24gdGhlIGNvbm5lY3Rpb24KLSAgICAvLyBvciBpZiBzb21lb25lIGlzIGxpc3RlbmluZyBvbiB1cworICAgIC8vIG9yIGlmIHNvbWVvbmUgaXMgbGlzdGVuaW5nIG9uIHVzLCBiZWNhdXNlIE5vZGUgdHVybnMgdW5oYW5kbGVkCisgICAgLy8gJ2Vycm9yJyBldmVudHMgaW50byBleGNlcHRpb25zLgogICAgIGlmIChzZWxmLmNvbm5lY3Rpb24ubGlzdGVuZXJzKCdlcnJvcicpLmxlbmd0aCA9PT0gMSB8fAogICAgICAgICBzZWxmLmxpc3RlbmVycygnZXJyb3InKS5sZW5ndGggPiAwKSB7CiAgICAgICBzZWxmLmVtaXQoImVycm9yIiwgZXJyKTsKICAgICB9Ci0gICAgLy8gImVycm9yIiBldmVudHMgZ2V0IHR1cm5lZCBpbnRvIGV4Y2VwdGlvbnMgaWYgdGhleSBhcmVuJ3QgbGlzdGVuZWQgZm9yLiAgSWYgdGhlIHVzZXIgaGFuZGxlZCB0aGlzIGVycm9yCi0gICAgLy8gdGhlbiB3ZSBzaG91bGQgdHJ5IHRvIHJlY29ubmVjdC4KLSAgICBzZWxmLmNvbm5lY3Rpb25fZ29uZSgpOwogICB9KTsKIAogICAvLyBBZGQgYSBjbG9zZSBsaXN0ZW5lcgpAQCAtMTM5LDcgKzEyMyw2IEBACiAgICAgICAgIHZhciBzZXJ2aWNlX25hbWUgPSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CiAgICAgICAgIGlmIChzZXJ2aWNlX25hbWUpIHsKICAgICAgICAgICBjbGllbnQgPSBzZWxmLmNsaWVudFtzZXJ2aWNlX25hbWVdOwotICAgICAgICAgIGRlbGV0ZSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CiAgICAgICAgIH0KICAgICAgICAgLypqc2hpbnQgLVcwODMgKi8KICAgICAgICAgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXSA9IGZ1bmN0aW9uKGVyciwgc3VjY2Vzcyl7CkBAIC0xNDcsNiArMTMwLDkgQEAKIAogICAgICAgICAgIHZhciBjYWxsYmFjayA9IGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKICAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICAgIGlmIChzZXJ2aWNlX25hbWUpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICAgICAgfQogICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBzdWNjZXNzKTsKICAgICAgICAgICB9CkBAIC0xNjgsNyArMTU0LDcgQEAKICAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CiAgICAgICB9CiAgICAgICBlbHNlIHsKLSAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGUpOwogICAgICAgfQogICAgIH0KICAgfSkpOwpAQCAtMTc5LDYgKzE2NSwxMCBAQAogICB0aGlzLmNvbm5lY3Rpb24uZW5kKCk7CiB9OwogCitDb25uZWN0aW9uLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuY29ubmVjdGlvbi5kZXN0cm95KCk7Cit9OworCiBDb25uZWN0aW9uLnByb3RvdHlwZS5pbml0aWFsaXplX3JldHJ5X3ZhcnMgPSBmdW5jdGlvbiAoKSB7CiAgIHRoaXMucmV0cnlfdGltZXIgPSBudWxsOwogICB0aGlzLnJldHJ5X3RvdGFsdGltZSA9IDA7CkBAIC0xOTcsMjggKzE4NywyNSBAQAogCiBDb25uZWN0aW9uLnByb3RvdHlwZS5jb25uZWN0aW9uX2dvbmUgPSBmdW5jdGlvbiAoKSB7CiAgIHZhciBzZWxmID0gdGhpczsKKyAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTsKIAogICAvLyBJZiBhIHJldHJ5IGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIGp1c3QgbGV0IHRoYXQgaGFwcGVuCiAgIGlmICh0aGlzLnJldHJ5X3RpbWVyKSB7CiAgICAgcmV0dXJuOwogICB9Ci0gIGlmICghdGhpcy5tYXhfYXR0ZW1wdHMpIHsKKyAgLy8gV2UgY2Fubm90IHJlY29ubmVjdCBhIHNlY3VyZSBzb2NrZXQuCisgIGlmICghdGhpcy5tYXhfYXR0ZW1wdHMgfHwgdGhpcy5zc2wpIHsKICAgICBzZWxmLmVtaXQoImNsb3NlIik7CiAgICAgcmV0dXJuOwogICB9CiAKLSAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTsKLSAgdGhpcy5yZWFkeSA9IGZhbHNlOwotCiAgIGlmICh0aGlzLnJldHJ5X21heF9kZWxheSAhPT0gbnVsbCAmJiB0aGlzLnJldHJ5X2RlbGF5ID49IHRoaXMucmV0cnlfbWF4X2RlbGF5KSB7CiAgICAgdGhpcy5yZXRyeV9kZWxheSA9IHRoaXMucmV0cnlfbWF4X2RlbGF5OwogICB9IGVsc2UgewogICAgIHRoaXMucmV0cnlfZGVsYXkgPSBNYXRoLmZsb29yKHRoaXMucmV0cnlfZGVsYXkgKiB0aGlzLnJldHJ5X2JhY2tvZmYpOwogICB9CiAKLSAgaWYgKHNlbGYuX2RlYnVnKSB7Ci0gICAgY29uc29sZS5sb2coIlJldHJ5IGNvbm5lY3Rpb24gaW4gIiArIHRoaXMucmV0cnlfZGVsYXkgKyAiIG1zIik7Ci0gIH0KKyAgbG9nLmRlYnVnKCJSZXRyeSBjb25uZWN0aW9uIGluICIgKyB0aGlzLnJldHJ5X2RlbGF5ICsgIiBtcyIpOwogCiAgIGlmICh0aGlzLm1heF9hdHRlbXB0cyAmJiB0aGlzLmF0dGVtcHRzID49IHRoaXMubWF4X2F0dGVtcHRzKSB7CiAgICAgdGhpcy5yZXRyeV90aW1lciA9IG51bGw7CkBAIC0yMzQsOSArMjIxLDEyIEBACiAgIH0pOwogCiAgIHRoaXMucmV0cnlfdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKLSAgICBpZiAoc2VsZi5fZGVidWcpIHsKLSAgICAgICBjb25zb2xlLmxvZygiUmV0cnlpbmcgY29ubmVjdGlvbi4uLiIpOwotCX0KKyAgICBpZiAoc2VsZi5jb25uZWN0aW9uLmRlc3Ryb3llZCkgeworICAgICAgc2VsZi5yZXRyeV90aW1lciA9IG51bGw7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbG9nLmRlYnVnKCJSZXRyeWluZyBjb25uZWN0aW9uLi4uIik7CiAKICAgICBzZWxmLnJldHJ5X3RvdGFsdGltZSArPSBzZWxmLnJldHJ5X2RlbGF5OwogCkBAIC0yNDcsNyArMjM3LDExIEBACiAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNlbGYuY29ubmVjdGlvbi5jb25uZWN0KHNlbGYucG9ydCwgc2VsZi5ob3N0KTsKKyAgICBpZiAoc2VsZi5wYXRoICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHNlbGYuY29ubmVjdGlvbi5jb25uZWN0KHNlbGYucGF0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNlbGYuY29ubmVjdGlvbi5jb25uZWN0KHNlbGYucG9ydCwgc2VsZi5ob3N0KTsKKyAgICB9CiAgICAgc2VsZi5yZXRyeV90aW1lciA9IG51bGw7CiAgIH0sIHRoaXMucmV0cnlfZGVsYXkpOwogfTsKQEAgLTI2MSw3ICsyNTUsMjAgQEAKICAgcmV0dXJuIGNvbm5lY3Rpb247CiB9OwogCitleHBvcnRzLmNyZWF0ZVVEU0Nvbm5lY3Rpb24gPSBmdW5jdGlvbihwYXRoLCBvcHRpb25zKSB7CisgIHZhciBzdHJlYW0gPSBuZXQuY3JlYXRlQ29ubmVjdGlvbihwYXRoKTsKKyAgdmFyIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihzdHJlYW0sIG9wdGlvbnMpOworICBjb25uZWN0aW9uLnBhdGggPSBwYXRoOworCisgIHJldHVybiBjb25uZWN0aW9uOworfTsKKwogZXhwb3J0cy5jcmVhdGVTU0xDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICBpZiAoISgnc2VjdXJlUHJvdG9jb2wnIGluIG9wdGlvbnMpICYmICEoJ3NlY3VyZU9wdGlvbnMnIGluIG9wdGlvbnMpKSB7CisgICAgb3B0aW9ucy5zZWN1cmVQcm90b2NvbCA9ICJTU0x2MjNfbWV0aG9kIjsKKyAgICBvcHRpb25zLnNlY3VyZU9wdGlvbnMgPSBjb25zdGFudHMuU1NMX09QX05PX1NTTHYyIHwgY29uc3RhbnRzLlNTTF9PUF9OT19TU0x2MzsKKyAgfQorCiAgIHZhciBzdHJlYW0gPSB0bHMuY29ubmVjdChwb3J0LCBob3N0LCBvcHRpb25zKTsKICAgdmFyIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihzdHJlYW0sIG9wdGlvbnMpOwogICBjb25uZWN0aW9uLmhvc3QgPSBob3N0OwpAQCAtMjgzLDIwICsyOTAsMTkgQEAKICAgdmFyIHNlbGYgPSB0aGlzOwogICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTsKIAotICB0aGlzLl9kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgfHwgZmFsc2U7CiAgIHRoaXMuY29ubmVjdGlvbiA9IGNoaWxkLnN0ZGluOwogICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OwogICB0aGlzLnByb3RvY29sID0gdGhpcy5vcHRpb25zLnByb3RvY29sIHx8IFRCaW5hcnlQcm90b2NvbDsKICAgdGhpcy5vZmZsaW5lX3F1ZXVlID0gW107CiAKLSAgaWYodGhpcy5fZGVidWcgPT09IHRydWUpewotICAgIHRoaXMuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJyxmdW5jdGlvbihlcnIpewotICAgICAgY29uc29sZS5sb2coZXJyLnRvU3RyaW5nKCksJ0NISUxEIEVSUk9SJyk7CisgIGlmIChsb2cuZ2V0TG9nTGV2ZWwoKSA9PT0gJ2RlYnVnJykgeworICAgIHRoaXMuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGVycikgeworICAgICAgbG9nLmRlYnVnKGVyci50b1N0cmluZygpLCAnQ0hJTEQgRVJST1InKTsKICAgICB9KTsKIAotICAgIHRoaXMuY2hpbGQub24oJ2V4aXQnLGZ1bmN0aW9uKGNvZGUsc2lnbmFsKXsKLSAgICAgIGNvbnNvbGUubG9nKGNvZGUrJzonK3NpZ25hbCwnQ0hJTEQgRVhJVEVEJyk7CisgICAgdGhpcy5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlLHNpZ25hbCkgeworICAgICAgbG9nLmRlYnVnKGNvZGUgKyAnOicgKyBzaWduYWwsICdDSElMRCBFWElURUQnKTsKICAgICB9KTsKICAgfQogCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmpzCmluZGV4IDY5NDc5MjUuLmY3ZGFhM2YgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmpzCkBAIC0xOSw2ICsxOSw3IEBACiAKIHZhciBiaW5hcnkgPSByZXF1aXJlKCcuL2JpbmFyeScpOwogdmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7Cit2YXIgVEhlYWRlclRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vaGVhZGVyX3RyYW5zcG9ydCcpOwogCiBtb2R1bGUuZXhwb3J0cyA9IFRGcmFtZWRUcmFuc3BvcnQ7CiAKQEAgLTMwLDYgKzMxLDggQEAKICAgdGhpcy5vbkZsdXNoID0gY2FsbGJhY2s7CiB9OwogCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZSA9IG5ldyBUSGVhZGVyVHJhbnNwb3J0KCk7CisKIFRGcmFtZWRUcmFuc3BvcnQucmVjZWl2ZXIgPSBmdW5jdGlvbihjYWxsYmFjaywgc2VxaWQpIHsKICAgdmFyIHJlc2lkdWFsID0gbnVsbDsKIApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2hlYWRlcl9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9oZWFkZXJfcHJvdG9jb2wuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzYjBkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9oZWFkZXJfcHJvdG9jb2wuanMKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpOwordmFyIFRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7Cit2YXIgVENvbXBhY3RQcm90b2NvbCA9IHJlcXVpcmUoJy4vY29tcGFjdF9wcm90b2NvbCcpOwordmFyIFRIZWFkZXJUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2hlYWRlcl90cmFuc3BvcnQnKTsKKwordmFyIFByb3RvY29sTWFwID0ge307CitQcm90b2NvbE1hcFtUSGVhZGVyVHJhbnNwb3J0LlN1YnByb3RvY29sSWQuQklOQVJZXSA9IFRCaW5hcnlQcm90b2NvbDsKK1Byb3RvY29sTWFwW1RIZWFkZXJUcmFuc3BvcnQuU3VicHJvdG9jb2xJZC5DT01QQUNUXSA9IFRDb21wYWN0UHJvdG9jb2w7CisKK21vZHVsZS5leHBvcnRzID0gVEhlYWRlclByb3RvY29sOworCitmdW5jdGlvbiBUSGVhZGVyUHJvdG9jb2xFcnJvcihtZXNzYWdlKSB7CisgIEVycm9yLmNhbGwodGhpcyk7CisgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Cit9CisKK3V0aWwuaW5oZXJpdHMoVEhlYWRlclByb3RvY29sRXJyb3IsIEVycm9yKTsKKworLyoqCisgKiBBIGZyYW1lZCBwcm90b2NvbCB3aXRoIGhlYWRlcnMuCisgKgorICogVEhlYWRlclByb3RvY29sIGZyYW1lcyBvdGhlciBUaHJpZnQgcHJvdG9jb2xzIGFuZCBhZGRzIHN1cHBvcnQgZm9yCisgKiBvcHRpb25hbCBvdXQtb2YtYmFuZCBoZWFkZXJzLiBUaGUgY3VycmVudGx5IHN1cHBvcnRlZCBzdWJwcm90b2NvbHMgYXJlCisgKiBUQmluYXJ5UHJvdG9jb2wgYW5kIFRDb21wYWN0UHJvdG9jb2wuIEl0IGNhbiBjdXJyZW50bHkgb25seSBiZSB1c2VkIHdpdGgKKyAqIHRyYW5zcG9ydHMgdGhhdCBpbmhlcml0IFRIZWFkZXJUcmFuc3BvcnQuCisgKgorICogVEhlYWRlclByb3RvY29sIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IFRIVFRQU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsCisgKiBvciBUUHJvY2Vzc1Bvb2xTZXJ2ZXIuCisgKgorICogU2VlIGRvYy9zcGVjcy9IZWFkZXJGb3JtYXQubWQgZm9yIGRldGFpbHMgb2YgdGhlIHdpcmUgZm9ybWF0LgorICovCitmdW5jdGlvbiBUSGVhZGVyUHJvdG9jb2wodHJhbnMpIHsKKyAgaWYgKCEodHJhbnMgaW5zdGFuY2VvZiBUSGVhZGVyVHJhbnNwb3J0KSkgeworICAgIHRocm93IG5ldyBUSGVhZGVyUHJvdG9jb2xFcnJvcigKKyAgICAgICdPbmx5IHRyYW5zcG9ydHMgdGhhdCBpbmhlcml0IFRIZWFkZXJUcmFuc3BvcnQgY2FuIGJlJyArCisgICAgICAnIHVzZWQgd2l0aCBUSGVhZGVyUHJvdG9jb2wnCisgICAgKTsKKyAgfQorICB0aGlzLnRyYW5zID0gdHJhbnM7CisgIHRoaXMuc2V0UHJvdG9jb2woKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKKyAgIC8vIEhlYWRlcnMgbXVzdCBiZSB3cml0dGVuIHByaW9yIHRvIGZsdXNoaW5nIGJlY2F1c2UgYmVjYXVzZQorICAgLy8geW91IG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHBheWxvYWQgZm9yIHRoZSBsZW5ndGgKKyAgIC8vIGZpZWxkIG9mIHRoZSBoZWFkZXIKKyAgdGhpcy50cmFucy53cml0ZUhlYWRlcnMoKTsKKyAgcmV0dXJuIHRoaXMudHJhbnMuZmx1c2goKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBzZXFpZCkgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlLCBzZXFpZCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUVuZCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKG5hbWUpIHsKKyAgcmV0dXJuIHRoaXMucHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbihuYW1lKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJ1Y3RFbmQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucHJvdG9jb2wud3JpdGVTdHJ1Y3RFbmQoKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgaWQpIHsKKyAgcmV0dXJuIHRoaXMucHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKG5hbWUsIHR5cGUsIGlkKTsKK30KKworVEhlYWRlclByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkRW5kID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnByb3RvY29sLndyaXRlRmllbGRFbmQoKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZFN0b3AgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNYXBCZWdpbiA9IGZ1bmN0aW9uKGt0eXBlLCB2dHlwZSwgc2l6ZSkgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC53cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwRW5kID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnByb3RvY29sLndyaXRlTWFwRW5kKCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEJlZ2luID0gZnVuY3Rpb24oZXR5cGUsIHNpemUpIHsKKyAgcmV0dXJuIHRoaXMucHJvdG9jb2wud3JpdGVMaXN0QmVnaW4oZXR5cGUsIHNpemUpOworfTsKKworVEhlYWRlclByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RFbmQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0QmVnaW4gPSBmdW5jdGlvbihldHlwZSwgc2l6ZSkgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC53cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTZXRFbmQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucHJvdG9jb2wud3JpdGVTZXRFbmQoKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCb29sID0gZnVuY3Rpb24oYikgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC53cml0ZUJvb2woYik7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLndyaXRlQnl0ZSA9IGZ1bmN0aW9uKGIpIHsKKyAgcmV0dXJuIHRoaXMucHJvdG9jb2wud3JpdGVCeXRlKGIpOworfTsKKworVEhlYWRlclByb3RvY29sLnByb3RvdHlwZS53cml0ZUkxNiA9IGZ1bmN0aW9uKGkxNikgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC53cml0ZUkxNihpMTYpOworfTsKKworVEhlYWRlclByb3RvY29sLnByb3RvdHlwZS53cml0ZUkzMiA9IGZ1bmN0aW9uKGkzMikgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC53cml0ZUkzMihpMzIpOworfTsKKworVEhlYWRlclByb3RvY29sLnByb3RvdHlwZS53cml0ZUk2NCA9IGZ1bmN0aW9uKGk2NCkgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC53cml0ZUk2NChpNjQpOworfTsKKworVEhlYWRlclByb3RvY29sLnByb3RvdHlwZS53cml0ZURvdWJsZSA9IGZ1bmN0aW9uKGR1YikgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC53cml0ZURvdWJsZShkdWIpOworfTsKKworVEhlYWRlclByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZ09yQmluYXJ5ID0gZnVuY3Rpb24obmFtZSwgZW5jb2RpbmcsIGFyZykgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC53cml0ZVN0cmluZ09yQmluYXJ5KG5hbWUsIGVuY29kaW5nLCBhcmcpOworfTsKKworVEhlYWRlclByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKGFyZykgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC53cml0ZVN0cmluZyhhcmcpOworfTsKKworVEhlYWRlclByb3RvY29sLnByb3RvdHlwZS53cml0ZUJpbmFyeSA9IGZ1bmN0aW9uKGFyZykgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC53cml0ZUJpbmFyeShhcmcpOworfTsKKworVEhlYWRlclByb3RvY29sLnByb3RvdHlwZS5yZWFkTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHRoaXMudHJhbnMucmVhZEhlYWRlcnMoKTsKKyAgdGhpcy5zZXRQcm90b2NvbCgpOworICByZXR1cm4gdGhpcy5wcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlRW5kID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC5yZWFkU3RydWN0RW5kKCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnByb3RvY29sLnJlYWRGaWVsZEJlZ2luKCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC5yZWFkRmllbGRFbmQoKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnByb3RvY29sLnJlYWRNYXBCZWdpbigpOworfTsKKworVEhlYWRlclByb3RvY29sLnByb3RvdHlwZS5yZWFkTWFwRW5kID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnByb3RvY29sLnJlYWRNYXBFbmQoKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC5yZWFkTGlzdEJlZ2luKCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0RW5kID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnByb3RvY29sLnJlYWRMaXN0RW5kKCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRCZWdpbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC5yZWFkU2V0QmVnaW4oKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEVuZCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC5yZWFkU2V0RW5kKCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnByb3RvY29sLnJlYWRCb29sKCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnByb3RvY29sLnJlYWRCeXRlKCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucHJvdG9jb2wucmVhZEkxNigpOworfTsKKworVEhlYWRlclByb3RvY29sLnByb3RvdHlwZS5yZWFkSTMyID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnByb3RvY29sLnJlYWRJMzIoKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUucmVhZEk2NCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC5yZWFkSTY0KCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucHJvdG9jb2wucmVhZERvdWJsZSgpOworfTsKKworVEhlYWRlclByb3RvY29sLnByb3RvdHlwZS5yZWFkQmluYXJ5ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnByb3RvY29sLnJlYWRCaW5hcnkoKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5wcm90b2NvbC5yZWFkU3RyaW5nKCk7Cit9OworCitUSGVhZGVyUHJvdG9jb2wucHJvdG90eXBlLmdldFRyYW5zcG9ydCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFuczsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgcmV0dXJuIHRoaXMucHJvdG9jb2wuc2tpcCh0eXBlKTsKK307CisKK1RIZWFkZXJQcm90b2NvbC5wcm90b3R5cGUuc2V0UHJvdG9jb2wgPSBmdW5jdGlvbihzdWJQcm90b2NvbElkKSB7CisgIHZhciBzdWJQcm90b2NvbElkID0gdGhpcy50cmFucy5nZXRQcm90b2NvbElkKCk7CisgIGlmICghUHJvdG9jb2xNYXBbc3ViUHJvdG9jb2xJZF0pIHsKKyAgICB0aHJvdyBuZXcgVEhlYWRlclByb3RvY29sRXJyb3IoJ0hlYWRlcnMgbm90IHN1cHBvcnRlZCBmb3IgcHJvdG9jb2wgJyArIHN1YlByb3RvY29sSWQpOworICB9CisKKyAgdGhpcy5wcm90b2NvbCA9IG5ldyBQcm90b2NvbE1hcFtzdWJQcm90b2NvbElkXSh0aGlzLnRyYW5zKTsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaGVhZGVyX3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9oZWFkZXJfdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjEzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaGVhZGVyX3RyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBUQ29tcGFjdFByb3RvY29sID0gcmVxdWlyZSgnLi9jb21wYWN0X3Byb3RvY29sJyk7Cit2YXIgVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCitmdW5jdGlvbiBUSGVhZGVyVHJhbnNwb3J0RXJyb3IobWVzc2FnZSkgeworICBFcnJvci5jYWxsKHRoaXMpOworICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKKyAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfQorCit1dGlsLmluaGVyaXRzKFRIZWFkZXJUcmFuc3BvcnRFcnJvciwgRXJyb3IpOworCittb2R1bGUuZXhwb3J0cyA9IFRIZWFkZXJUcmFuc3BvcnQ7CisKKy8vIGZyb20gSGVhZGVyRm9ybWF0Lm1kCit2YXIgQ09NUEFDVF9QUk9UT0NPTF9PRkZTRVQgPSAwOwordmFyIENPTVBBQ1RfUFJPVE9DT0xfVkVSU0lPTl9PRkZTRVQgPSAxOwordmFyIEZSQU1FX1NJWkVfT0ZGU0VUID0gMDsKK3ZhciBIRUFERVJfTUFHSUNfT0ZGU0VUID0gMzIgLyA4OwordmFyIEZMQUdTX09GRlNFVCA9IDQ4IC8gODsKK3ZhciBTRVFJRF9PRkZTRVQgPSA2NCAvIDg7Cit2YXIgSEVBREVSX1NJWkVfT0ZGU0VUID0gOTYgLyA4OwordmFyIEhFQURFUl9TVEFSVF9PRkZTRVQgPSAxMTIgLyA4OworCit2YXIgSEVBREVSX01BR0lDID0gMHgwRkZGOworCit2YXIgVElORk9fSEVBREVSX0tFWV9WQUxVRV9UWVBFID0gMHgwMTsKK3ZhciBNQVhfRlJBTUVfU0laRSA9IDB4M0ZGRkZGRkY7CisKKyAvLyBBIGhlbHBlciBjbGFzcyBmb3IgcmVhZGluZy93cml0aW5nIHZhcmludHMuIFVzZXMKKyAvLyBUQ29tcGFjdFByb3RvY29sIHVuZGVyIHRoZSBob29kCitmdW5jdGlvbiBWYXJpbnRIZWxwZXIocmVhZEJ1ZmZlcikgeworICB2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKKyAgdGhpcy5vdXRwdXRCdWZmZXIgPSBudWxsOworICB2YXIgX3RoaXMgPSB0aGlzOworICB0aGlzLnRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQobnVsbCwgZnVuY3Rpb24ob3V0cHV0KSB7CisgICAgX3RoaXMub3V0cHV0QnVmZmVyID0gb3V0cHV0OworICB9KTsKKworICB0aGlzLnRyYW5zcG9ydC5pbkJ1ZiA9IHJlYWRCdWZmZXIgfHwgQnVmZmVyLmFsbG9jKDApOworICB0aGlzLnRyYW5zcG9ydC53cml0ZUN1cnNvciA9IHRoaXMudHJhbnNwb3J0LmluQnVmLmxlbmd0aDsKKyAgdGhpcy5wcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKHRoaXMudHJhbnNwb3J0KTsKK307CisKK1ZhcmludEhlbHBlci5wcm90b3R5cGUucmVhZFZhcmludDMyID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnByb3RvY29sLnJlYWRWYXJpbnQzMigpOworfTsKKworVmFyaW50SGVscGVyLnByb3RvdHlwZS53cml0ZVZhcmludDMyID0gZnVuY3Rpb24oaSkgeworICB0aGlzLnByb3RvY29sLndyaXRlVmFyaW50MzIoaSk7Cit9OworCitWYXJpbnRIZWxwZXIucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucHJvdG9jb2wucmVhZFN0cmluZygpOworfTsKKworVmFyaW50SGVscGVyLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKHN0cikgeworICB0aGlzLnByb3RvY29sLndyaXRlU3RyaW5nKHN0cik7Cit9CisKK1ZhcmludEhlbHBlci5wcm90b3R5cGUuZ2V0T3V0Q291bnQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnNwb3J0Lm91dENvdW50OworfTsKKworVmFyaW50SGVscGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cikgeworICB0aGlzLnRyYW5zcG9ydC53cml0ZShzdHIpOworfTsKKworVmFyaW50SGVscGVyLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnRyYW5zcG9ydC5mbHVzaCgpOworICByZXR1cm4gdGhpcy5vdXRwdXRCdWZmZXI7Cit9OworCisvLyBmcm9tIGxpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oCitUSGVhZGVyVHJhbnNwb3J0LlN1YnByb3RvY29sSWQgPSB7CisgIEJJTkFSWTogMCwKKyAgSlNPTjogMSwKKyAgQ09NUEFDVDogMiwKK307CisKKy8qKgorICBBbiBhYnN0cmFjdCB0cmFuc3BvcnQgdXNlZCBhcyBhIHByb3RvdHlwZSBmb3Igb3RoZXIgdHJhbnNwb3J0cworICB0byBlbmFibGUgcmVhZGluZy93cml0aW5nIHRoZWFkZXJzLiBUaGlzIHNob3VsZCBOT1QgYmUgdXNlZCBhcyBhIHN0YW5kYWxvbmUgdHJhbnNwb3J0CisgIFRoZSBtZXRob2RzIGluIHRoaXMgdHJhbnNwb3J0IGFyZSBjYWxsZWQgYnkgVEhlYWRlclByb3RvY29sLCB3aGljaCB3aWxsIGNhbGwgcmVhZEhlYWRlcnMvd3JpdGVIZWFkZXJzCisgIGluIHRoZSByZWFkL3dyaXRlTWVzc2FnZUJlZ2luIG1ldGhvZHMgYW5kIHBhcnNlL3dyaXRlIGhlYWRlcnMgdG8vZnJvbSBhIHJlcXVlc3QKKyAgcHJpb3IgdG8gcmVhZGluZy93cml0aW5nLgorCisgIFRoZSByZWFzb24gdGhpcyBpcyBub3QgYSBzdGFuZGFsb25lIHRyYW5zcG9ydCB0eXBlIGlzIGJlY2F1c2UgZGlmZmVyZW50IHRyYW5zcG9ydCB0eXBlcworICBoYXZlIHRoZWlyIG93biBpbmRpdmlkdWFsIHN0YXRpYyByZWNlaXZlciBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCBwcmlvciB0byBpbnN0YW50aWF0aW9uLgorICBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSB3YXkgZm9yIFRIZWFkZXJUcmFuc3BvcnQgdG8ga25vdyB3aGljaCByZWNlaXZlciBtZXRob2QgdG8gdXNlCisgIHdpdGhvdXQgcmV3b3JraW5nIHRoZSBzZXJ2ZXIgQVBJLgorCisgIEZvciByZWFkaW5nIGhlYWRlcnMgZnJvbSBhIHJlcXVlc3QsIHRoZSBwYXJzZWQgaGVhZGVycyBjYW4gYmUgcmV0cmlldmVkIHZpYQorICBnZXRSZWFkSGVhZGVyLiBTaW1pbGFybHksIHlvdSBjYW4gc2V0IGhlYWRlcnMgdG8gYmUgd3JpdHRlbiBvbiB0aGUgY2xpZW50IHZpYQorICBzZXRXcml0ZUhlYWRlci4KKyAqLworZnVuY3Rpb24gVEhlYWRlclRyYW5zcG9ydCgpIHsKKyAgdGhpcy5tYXhGcmFtZVNpemUgPSBNQVhfRlJBTUVfU0laRTsKKyAgdGhpcy5wcm90b2NvbElkID0gVEhlYWRlclRyYW5zcG9ydC5TdWJwcm90b2NvbElkLkJJTkFSWTsKKyAgdGhpcy5yaGVhZGVycyA9IHt9OworICB0aGlzLndoZWFkZXJzID0ge307CisgIHRoaXMuaW5CdWYgPSBCdWZmZXIuYWxsb2MoMCk7CisgIHRoaXMub3V0Q291bnQgPSAwOworICB0aGlzLmZsYWdzID0gbnVsbDsKKyAgdGhpcy5zZXFpZCA9IDA7CisgIHRoaXMuc2hvdWxkV3JpdGVIZWFkZXJzID0gdHJ1ZTsKK307CisKK3ZhciB2YWxpZGF0ZUhlYWRlcnMgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7CisgICAgdGhyb3cgbmV3IFRIZWFkZXJUcmFuc3BvcnRFcnJvcignSGVhZGVyIGtleSBhbmQgdmFsdWVzIG11c3QgYmUgc3RyaW5ncycpOworICB9Cit9OworCit2YXIgdmFsaWRhdGVQcm90b2NvbElkID0gZnVuY3Rpb24ocHJvdG9jb2xJZCkgeworICB2YXIgcHJvdG9jb2xzID0gT2JqZWN0LmtleXMoVEhlYWRlclRyYW5zcG9ydC5TdWJwcm90b2NvbElkKTsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm90b2NvbHMubGVuZ3RoOyBpKyspIHsKKyAgICBpZiAocHJvdG9jb2xJZCA9PT0gVEhlYWRlclRyYW5zcG9ydC5TdWJwcm90b2NvbElkW3Byb3RvY29sc1tpXV0pIHJldHVybiB0cnVlOworICB9CisKKyAgdGhyb3cgbmV3IEVycm9yKHByb3RvY29sSWQgKyAnIGlzIG5vdCBhIHZhbGlkIHByb3RvY29sIGlkJyk7Cit9OworCitUSGVhZGVyVHJhbnNwb3J0LnByb3RvdHlwZS5zZXRTZXFJZCA9IGZ1bmN0aW9uKHNlcWlkKSB7CisgIHRoaXMuc2VxaWQgPSBzZXFpZDsKK307CisKK1RIZWFkZXJUcmFuc3BvcnQucHJvdG90eXBlLmdldFNlcUlkID0gZnVuY3Rpb24oc2VxaWQpIHsKKyAgcmV0dXJuIHRoaXMuc2VxaWQ7Cit9OworCitUSGVhZGVyVHJhbnNwb3J0LnByb3RvdHlwZS5zZXRGbGFncyA9IGZ1bmN0aW9uKGZsYWdzKSB7CisgIHRoaXMuZmxhZ3MgPSBmbGFnczsKK307CisKK1RIZWFkZXJUcmFuc3BvcnQucHJvdG90eXBlLmdldFJlYWRIZWFkZXJzID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJoZWFkZXJzOworfTsKKworVEhlYWRlclRyYW5zcG9ydC5wcm90b3R5cGUuc2V0UmVhZEhlYWRlciA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgdmFsaWRhdGVIZWFkZXJzKGtleSwgdmFsdWUpOworICB0aGlzLnJoZWFkZXJzW2tleV0gPSB2YWx1ZTsKK307CisKK1RIZWFkZXJUcmFuc3BvcnQucHJvdG90eXBlLmNsZWFyUmVhZEhlYWRlcnMgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5yaGVhZGVycyA9IHt9OworfTsKKworVEhlYWRlclRyYW5zcG9ydC5wcm90b3R5cGUuZ2V0V3JpdGVIZWFkZXJzID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLndoZWFkZXJzOworfTsKKworVEhlYWRlclRyYW5zcG9ydC5wcm90b3R5cGUuc2V0V3JpdGVIZWFkZXIgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgIHZhbGlkYXRlSGVhZGVycyhrZXksIHZhbHVlKTsKKyAgdGhpcy53aGVhZGVyc1trZXldID0gdmFsdWU7Cit9OworCitUSGVhZGVyVHJhbnNwb3J0LnByb3RvdHlwZS5jbGVhcldyaXRlSGVhZGVycyA9IGZ1bmN0aW9uKCkgeworICB0aGlzLndoZWFkZXJzID0ge307Cit9OworCitUSGVhZGVyVHJhbnNwb3J0LnByb3RvdHlwZS5zZXRNYXhGcmFtZVNpemUgPSBmdW5jdGlvbihmcmFtZVNpemUpIHsKKyAgdGhpcy5tYXhGcmFtZVNpemUgPSBmcmFtZVNpemU7Cit9OworCitUSGVhZGVyVHJhbnNwb3J0LnByb3RvdHlwZS5zZXRQcm90b2NvbElkID0gZnVuY3Rpb24ocHJvdG9jb2xJZCkgeworICB2YWxpZGF0ZVByb3RvY29sSWQocHJvdG9jb2xJZCk7CisgIHRoaXMucHJvdG9jb2xJZCA9IHByb3RvY29sSWQ7Cit9OworCitUSGVhZGVyVHJhbnNwb3J0LnByb3RvdHlwZS5nZXRQcm90b2NvbElkID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnByb3RvY29sSWQ7Cit9OworCit2YXIgaXNVbmZyYW1lZEJpbmFyeSA9IGZ1bmN0aW9uKHJlYWRCdWZmZXIpIHsKKyAgdmFyIHZlcnNpb24gPSByZWFkQnVmZmVyLnJlYWRJbnQzMkJFKCk7CisgIHJldHVybiAodmVyc2lvbiAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0spID09PSBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xOworfQorCit2YXIgaXNVbmZyYW1lZENvbXBhY3QgPSBmdW5jdGlvbihyZWFkQnVmZmVyKSB7CisgIHZhciBwcm90b2NvbElkID0gcmVhZEJ1ZmZlci5yZWFkSW50OChDT01QQUNUX1BST1RPQ09MX09GRlNFVCk7CisgIHZhciB2ZXJzaW9uID0gcmVhZEJ1ZmZlci5yZWFkSW50OChDT01QQUNUX1BST1RPQ09MX1ZFUlNJT05fT0ZGU0VUKTsKKyAgcmV0dXJuIHByb3RvY29sSWQgPT09IFRDb21wYWN0UHJvdG9jb2wuUFJPVE9DT0xfSUQgJiYKKyAgICAodmVyc2lvbiAmIFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9NQVNLKSA9PT0gVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX047Cit9CisKK1RIZWFkZXJUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRIZWFkZXJzID0gZnVuY3Rpb24oKSB7CisgIHZhciByZWFkQnVmZmVyID0gdGhpcy5pbkJ1ZjsKKworICB2YXIgaXNVbmZyYW1lZCA9IGZhbHNlOworICBpZiAoaXNVbmZyYW1lZEJpbmFyeShyZWFkQnVmZmVyKSkgeworICAgIHRoaXMuc2V0UHJvdG9jb2xJZChUSGVhZGVyVHJhbnNwb3J0LlN1YnByb3RvY29sSWQuQklOQVJZKTsKKyAgICBpc1VuZnJhbWVkID0gdHJ1ZTsKKyAgfQorCisgIGlmIChpc1VuZnJhbWVkQ29tcGFjdChyZWFkQnVmZmVyKSkgeworICAgIHRoaXMuc2V0UHJvdG9jb2xJZChUSGVhZGVyVHJhbnNwb3J0LlN1YnByb3RvY29sSWQuQ09NUEFDVCk7CisgICAgaXNVbmZyYW1lZCA9IHRydWU7CisgIH0KKworICBpZiAoaXNVbmZyYW1lZCkgeworICAgIHRoaXMuc2hvdWxkV3JpdGVIZWFkZXJzID0gZmFsc2U7CisgICAgcmV0dXJuOworICB9CisKKyAgdmFyIGZyYW1lU2l6ZSA9IHJlYWRCdWZmZXIucmVhZEludDMyQkUoRlJBTUVfU0laRV9PRkZTRVQpOworICBpZiAoZnJhbWVTaXplID4gdGhpcy5tYXhGcmFtZVNpemUpIHsKKyAgICB0aHJvdyBuZXcgVEhlYWRlclRyYW5zcG9ydEVycm9yKCdGcmFtZSBleGNlZWRzIG1heGltdW0gZnJhbWUgc2l6ZScpOworICB9CisKKyAgdmFyIGhlYWRlck1hZ2ljID0gcmVhZEJ1ZmZlci5yZWFkSW50MTZCRShIRUFERVJfTUFHSUNfT0ZGU0VUKTsKKyAgdGhpcy5zaG91bGRXcml0ZUhlYWRlcnMgPSBoZWFkZXJNYWdpYyA9PT0gSEVBREVSX01BR0lDOworICBpZiAoIXRoaXMuc2hvdWxkV3JpdGVIZWFkZXJzKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdGhpcy5zZXRGbGFncyhyZWFkQnVmZmVyLnJlYWRJbnQxNkJFKEZMQUdTX09GRlNFVCkpOworICB0aGlzLnNldFNlcUlkKHJlYWRCdWZmZXIucmVhZEludDMyQkUoU0VRSURfT0ZGU0VUKSk7CisgIHZhciBoZWFkZXJTaXplID0gcmVhZEJ1ZmZlci5yZWFkSW50MTZCRShIRUFERVJfU0laRV9PRkZTRVQpICogNDsKKyAgdmFyIGVuZE9mSGVhZGVycyA9IEhFQURFUl9TVEFSVF9PRkZTRVQgKyBoZWFkZXJTaXplOworICBpZiAoZW5kT2ZIZWFkZXJzID4gcmVhZEJ1ZmZlci5sZW5ndGgpIHsKKyAgICB0aHJvdyBuZXcgVEhlYWRlclRyYW5zcG9ydEVycm9yKCdIZWFkZXIgc2l6ZSBpcyBncmVhdGVyIHRoYW4gZnJhbWUgc2l6ZScpOworICB9CisKKyAgdmFyIGhlYWRlckJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhoZWFkZXJTaXplKTsKKyAgcmVhZEJ1ZmZlci5jb3B5KGhlYWRlckJ1ZmZlciwgMCwgSEVBREVSX1NUQVJUX09GRlNFVCwgZW5kT2ZIZWFkZXJzKTsKKworICB2YXIgdmFyaW50SGVscGVyID0gbmV3IFZhcmludEhlbHBlcihoZWFkZXJCdWZmZXIpOworICB0aGlzLnNldFByb3RvY29sSWQodmFyaW50SGVscGVyLnJlYWRWYXJpbnQzMigpKTsKKyAgdmFyIHRyYW5zZm9ybUNvdW50ID0gdmFyaW50SGVscGVyLnJlYWRWYXJpbnQzMigpOworICBpZiAodHJhbnNmb3JtQ291bnQgPiAwKSB7CisgICAgdGhyb3cgbmV3IFRIZWFkZXJUcmFuc3BvcnRFcnJvcignVHJhbnNmb3JtcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQnKTsKKyAgfQorCisgIHdoaWxlICh0cnVlKSB7CisgICAgdHJ5IHsKKyAgICAgIHZhciBoZWFkZXJUeXBlID0gdmFyaW50SGVscGVyLnJlYWRWYXJpbnQzMigpOworICAgICAgaWYgKGhlYWRlclR5cGUgIT09IFRJTkZPX0hFQURFUl9LRVlfVkFMVUVfVFlQRSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdmFyIG51bWJlck9mSGVhZGVycyA9IHZhcmludEhlbHBlci5yZWFkVmFyaW50MzIoKTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtYmVyT2ZIZWFkZXJzOyBpKyspIHsKKyAgICAgICAgdmFyIGtleSA9IHZhcmludEhlbHBlci5yZWFkU3RyaW5nKCk7CisgICAgICAgIHZhciB2YWx1ZSA9IHZhcmludEhlbHBlci5yZWFkU3RyaW5nKCk7CisgICAgICAgIHRoaXMuc2V0UmVhZEhlYWRlcihrZXksIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChlKSB7CisgICAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHRocm93IGU7CisgICAgfQorICB9CisKKyAgLy8gbW92ZXMgdGhlIHJlYWQgY3Vyc29yIHBhc3QgdGhlIGhlYWRlcnMKKyAgdGhpcy5yZWFkKGVuZE9mSGVhZGVycyk7CisgIHJldHVybiB0aGlzLmdldFJlYWRIZWFkZXJzKCk7Cit9OworCitUSGVhZGVyVHJhbnNwb3J0LnByb3RvdHlwZS53cml0ZUhlYWRlcnMgPSBmdW5jdGlvbigpIHsKKyAgLy8gb25seSB3cml0ZSBoZWFkZXJzIG9uIHRoZSBzZXJ2ZXIgaWYgdGhlIGNsaWVudCBjb250YWluZWQgaGVhZGVycworICBpZiAoIXRoaXMuc2hvdWxkV3JpdGVIZWFkZXJzKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhciBoZWFkZXJzID0gdGhpcy5nZXRXcml0ZUhlYWRlcnMoKTsKKworICB2YXIgdmFyaW50V3JpdGVyID0gbmV3IFZhcmludEhlbHBlcigpOworICB2YXJpbnRXcml0ZXIud3JpdGVWYXJpbnQzMih0aGlzLnByb3RvY29sSWQpOworICB2YXJpbnRXcml0ZXIud3JpdGVWYXJpbnQzMigwKTsgLy8gdHJhbnNmb3JtcyBub3Qgc3VwcG9ydGVkCisKKyAgLy8gd3JpdGluZyBpbmZvIGhlYWRlciBrZXkgdmFsdWVzCisgIHZhciBoZWFkZXJLZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycyk7CisgIGlmIChoZWFkZXJLZXlzLmxlbmd0aCA+IDApIHsKKyAgICB2YXJpbnRXcml0ZXIud3JpdGVWYXJpbnQzMihUSU5GT19IRUFERVJfS0VZX1ZBTFVFX1RZUEUpOworICAgIHZhcmludFdyaXRlci53cml0ZVZhcmludDMyKGhlYWRlcktleXMubGVuZ3RoKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcktleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBrZXkgPSBoZWFkZXJLZXlzW2ldOworICAgICAgdmFyIHZhbHVlID0gaGVhZGVyc1trZXldOworCisgICAgICB2YXJpbnRXcml0ZXIud3JpdGVTdHJpbmcoa2V5KTsKKyAgICAgIHZhcmludFdyaXRlci53cml0ZVN0cmluZyh2YWx1ZSk7CisgICAgfQorICB9CisgdmFyIGhlYWRlclNpemVXaXRob3V0UGFkZGluZyA9IHZhcmludFdyaXRlci5nZXRPdXRDb3VudCgpOworICB2YXIgcGFkZGluZ05lZWRlZCA9ICg0IC0gKGhlYWRlclNpemVXaXRob3V0UGFkZGluZyAlIDQpKSAlIDQ7CisKKyAgdmFyIGhlYWRlclNpemUgPSBCdWZmZXIuYWxsb2MoMik7CisgIGhlYWRlclNpemUud3JpdGVJbnQxNkJFKE1hdGguZmxvb3IoKGhlYWRlclNpemVXaXRob3V0UGFkZGluZyArIHBhZGRpbmdOZWVkZWQpIC8gNCkpOworCisgIHZhciBwYWRkaW5nQnVmZmVyID0gQnVmZmVyLmFsbG9jKHBhZGRpbmdOZWVkZWQpOworICBwYWRkaW5nQnVmZmVyLmZpbGwoMHgwMCk7CisgIHZhcmludFdyaXRlci53cml0ZShwYWRkaW5nQnVmZmVyKTsKKyAgdmFyIGhlYWRlckNvbnRlbnRCdWZmZXIgPSB2YXJpbnRXcml0ZXIudG9CdWZmZXIoKTsKKyAgdmFyIGZyYW1lU2l6ZSA9IEJ1ZmZlci5hbGxvYyg0KTsKKyAgZnJhbWVTaXplLndyaXRlSW50MzJCRSgxMCArIHRoaXMub3V0Q291bnQgKyBoZWFkZXJDb250ZW50QnVmZmVyLmxlbmd0aCk7CisgIHZhciBoZWFkZXJNYWdpYyA9IEJ1ZmZlci5hbGxvYygyKTsKKyAgaGVhZGVyTWFnaWMud3JpdGVJbnQxNkJFKEhFQURFUl9NQUdJQyk7CisKKyAgLy8gZmxhZ3MgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLCBzbyB3cml0ZSBhIHplcm8KKyAgdmFyIGZsYWdzID0gQnVmZmVyLmFsbG9jKDIpOworICBmbGFncy53cml0ZUludDE2QkUoMCk7CisKKyAgdmFyIHNlcWlkID0gQnVmZmVyLmFsbG9jKDQpOworICBzZXFpZC53cml0ZUludDMyQkUodGhpcy5nZXRTZXFJZCgpKTsKKworICB2YXIgaGVhZGVyQnVmZmVyID0gQnVmZmVyLmNvbmNhdChbCisgICAgZnJhbWVTaXplLAorICAgIGhlYWRlck1hZ2ljLAorICAgIGZsYWdzLAorICAgIHNlcWlkLAorICAgIGhlYWRlclNpemUsCisgICAgaGVhZGVyQ29udGVudEJ1ZmZlciwKKyAgXSk7CisKKyAgdGhpcy5vdXRCdWZmZXJzLnVuc2hpZnQoaGVhZGVyQnVmZmVyKTsKKyAgdGhpcy5vdXRDb3VudCArPSBoZWFkZXJCdWZmZXIubGVuZ3RoOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9odHRwX2Nvbm5lY3Rpb24uanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaHR0cF9jb25uZWN0aW9uLmpzCmluZGV4IGYzZmNkNzQuLjNjMmFiMGYgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9odHRwX2Nvbm5lY3Rpb24uanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcwpAQCAtNTksOCArNTksNiBAQAogICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSHR0cENvbm5lY3Rpb24gaW5zdGFuY2UgKHVzZSBjcmVhdGVIdHRwQ29ubmVjdGlvbigpIHJhdGhlciB0aGFuCiAgKiAgICBpbnN0YW50aWF0aW5nIGRpcmVjdGx5KS4KICAqIEBjb25zdHJ1Y3RvcgotICogQHBhcmFtIHtzdHJpbmd9IGhvc3QgLSBUaGUgaG9zdCBuYW1lIG9yIElQIHRvIGNvbm5lY3QgdG8uCi0gKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFRoZSBUQ1AgcG9ydCB0byBjb25uZWN0IHRvLgogICogQHBhcmFtIHtDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgogICogQHRocm93cyB7ZXJyb3J9IEV4Y2VwdGlvbnMgb3RoZXIgdGhhbiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgYXJlIHJldGhyb3duCiAgKiBAZXZlbnQge2Vycm9yfSBUaGUgImVycm9yIiBldmVudCBpcyBmaXJlZCB3aGVuIGEgTm9kZS5qcyBlcnJvciBldmVudCBvY2N1cnMgZHVyaW5nCkBAIC03MSwxNSArNjksMTYgQEAKICAqICAgICBzZW1hbnRpY3MgaW1wbGVtZW50ZWQgb3ZlciB0aGUgTm9kZS5qcyBodHRwLnJlcXVlc3QoKSBtZXRob2QuCiAgKiBAc2VlIHtAbGluayBjcmVhdGVIdHRwQ29ubmVjdGlvbn0KICAqLwotdmFyIEh0dHBDb25uZWN0aW9uID0gZXhwb3J0cy5IdHRwQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKK3ZhciBIdHRwQ29ubmVjdGlvbiA9IGV4cG9ydHMuSHR0cENvbm5lY3Rpb24gPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgIC8vSW5pdGlhbGl6ZSB0aGUgZW1pdHRlciBiYXNlIG9iamVjdAogICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTsKIAogICAvL1NldCBjb25maWd1cmF0aW9uCiAgIHZhciBzZWxmID0gdGhpczsKICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLSAgdGhpcy5ob3N0ID0gaG9zdDsKLSAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgdGhpcy5ob3N0ID0gdGhpcy5vcHRpb25zLmhvc3Q7CisgIHRoaXMucG9ydCA9IHRoaXMub3B0aW9ucy5wb3J0OworICB0aGlzLnNvY2tldFBhdGggPSB0aGlzLm9wdGlvbnMuc29ja2V0UGF0aDsKICAgdGhpcy5odHRwcyA9IHRoaXMub3B0aW9ucy5odHRwcyB8fCBmYWxzZTsKICAgdGhpcy50cmFuc3BvcnQgPSB0aGlzLm9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKICAgdGhpcy5wcm90b2NvbCA9IHRoaXMub3B0aW9ucy5wcm90b2NvbCB8fCBUQmluYXJ5UHJvdG9jb2w7CkBAIC04Nyw3ICs4Niw4IEBACiAgIC8vUHJlcGFyZSBOb2RlLmpzIG9wdGlvbnMKICAgdGhpcy5ub2RlT3B0aW9ucyA9IHsKICAgICBob3N0OiB0aGlzLmhvc3QsCi0gICAgcG9ydDogdGhpcy5wb3J0IHx8IDgwLAorICAgIHBvcnQ6IHRoaXMucG9ydCwKKyAgICBzb2NrZXRQYXRoOiB0aGlzLnNvY2tldFBhdGgsCiAgICAgcGF0aDogdGhpcy5vcHRpb25zLnBhdGggfHwgJy8nLAogICAgIG1ldGhvZDogJ1BPU1QnLAogICAgIGhlYWRlcnM6IHRoaXMub3B0aW9ucy5oZWFkZXJzIHx8IHt9LApAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgewogICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IGU7CisgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTE2OSw2ICsxNjksMTAgQEAKICAgICB2YXIgZGF0YSA9IFtdOwogICAgIHZhciBkYXRhTGVuID0gMDsKIAorICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHsKKyAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLCBuZXcgVEhUVFBFeGNlcHRpb24ocmVzcG9uc2UpKTsKKyAgICB9CisKICAgICByZXNwb25zZS5vbignZXJyb3InLCBmdW5jdGlvbiAoZSkgewogICAgICAgc2VsZi5lbWl0KCJlcnJvciIsIGUpOwogICAgIH0pOwpAQCAtMjEwLDEwICsyMTQsMTMgQEAKICAqLwogSHR0cENvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkgewogICB2YXIgc2VsZiA9IHRoaXM7Ci0gIHNlbGYubm9kZU9wdGlvbnMuaGVhZGVyc1siQ29udGVudC1sZW5ndGgiXSA9IGRhdGEubGVuZ3RoOworICB2YXIgb3B0cyA9IHNlbGYubm9kZU9wdGlvbnM7CisgIG9wdHMuaGVhZGVyc1siQ29udGVudC1sZW5ndGgiXSA9IGRhdGEubGVuZ3RoOworICBpZiAoIW9wdHMuaGVhZGVyc1siQ29udGVudC1UeXBlIl0pCisgICAgb3B0cy5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7ICAKICAgdmFyIHJlcSA9IChzZWxmLmh0dHBzKSA/Ci0gICAgICBodHRwcy5yZXF1ZXN0KHNlbGYubm9kZU9wdGlvbnMsIHNlbGYucmVzcG9uc2VDYWxsYmFjaykgOgotICAgICAgaHR0cC5yZXF1ZXN0KHNlbGYubm9kZU9wdGlvbnMsIHNlbGYucmVzcG9uc2VDYWxsYmFjayk7CisgICAgICBodHRwcy5yZXF1ZXN0KG9wdHMsIHNlbGYucmVzcG9uc2VDYWxsYmFjaykgOgorICAgICAgaHR0cC5yZXF1ZXN0KG9wdHMsIHNlbGYucmVzcG9uc2VDYWxsYmFjayk7CiAgIHJlcS5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKICAgICBzZWxmLmVtaXQoImVycm9yIiwgZXJyKTsKICAgfSk7CkBAIC0yMzEsOCArMjM4LDI2IEBACiAgKiBAc2VlIHtAbGluayBDb25uZWN0T3B0aW9uc30KICAqLwogZXhwb3J0cy5jcmVhdGVIdHRwQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKLSAgcmV0dXJuIG5ldyBIdHRwQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKKyAgb3B0aW9ucy5ob3N0ID0gaG9zdDsKKyAgb3B0aW9ucy5wb3J0ID0gcG9ydCB8fCA4MDsKKyAgcmV0dXJuIG5ldyBIdHRwQ29ubmVjdGlvbihvcHRpb25zKTsKK307CisKK2V4cG9ydHMuY3JlYXRlSHR0cFVEU0Nvbm5lY3Rpb24gPSBmdW5jdGlvbihwYXRoLCBvcHRpb25zKSB7CisgIG9wdGlvbnMuc29ja2V0UGF0aCA9IHBhdGg7CisgIHJldHVybiBuZXcgSHR0cENvbm5lY3Rpb24ob3B0aW9ucyk7CiB9OwogCiBleHBvcnRzLmNyZWF0ZUh0dHBDbGllbnQgPSBjcmVhdGVDbGllbnQKIAorCitmdW5jdGlvbiBUSFRUUEV4Y2VwdGlvbihyZXNwb25zZSkgeworICB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNhbGwodGhpcyk7CisgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgIHRoaXMuc3RhdHVzQ29kZSA9IHJlc3BvbnNlLnN0YXR1c0NvZGU7CisgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKyAgdGhpcy50eXBlID0gdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuUFJPVE9DT0xfRVJST1I7CisgIHRoaXMubWVzc2FnZSA9ICJSZWNlaXZlZCBhIHJlc3BvbnNlIHdpdGggYSBiYWQgSFRUUCBzdGF0dXMgY29kZTogIiArIHJlc3BvbnNlLnN0YXR1c0NvZGU7Cit9Cit1dGlsLmluaGVyaXRzKFRIVFRQRXhjZXB0aW9uLCB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbmRleC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbmRleC5qcwppbmRleCA2MWU1Y2JkLi4wYTJkMDJiIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5kZXguanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2luZGV4LmpzCkBAIC0xOCwxMCArMTgsMTYgQEAKICAqLwogZXhwb3J0cy5UaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwogCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKK2V4cG9ydHMuc2V0TG9nRnVuYyA9IGxvZy5zZXRMb2dGdW5jOworZXhwb3J0cy5zZXRMb2dMZXZlbCA9IGxvZy5zZXRMb2dMZXZlbDsKK2V4cG9ydHMuZ2V0TG9nTGV2ZWwgPSBsb2cuZ2V0TG9nTGV2ZWw7CisKIHZhciBjb25uZWN0aW9uID0gcmVxdWlyZSgnLi9jb25uZWN0aW9uJyk7CiBleHBvcnRzLkNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLkNvbm5lY3Rpb247CiBleHBvcnRzLmNyZWF0ZUNsaWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlQ2xpZW50OwogZXhwb3J0cy5jcmVhdGVDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVVRFNDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVVRFNDb25uZWN0aW9uOwogZXhwb3J0cy5jcmVhdGVTU0xDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVTU0xDb25uZWN0aW9uOwogZXhwb3J0cy5jcmVhdGVTdGRJT0NsaWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlU3RkSU9DbGllbnQ7CiBleHBvcnRzLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlU3RkSU9Db25uZWN0aW9uOwpAQCAtMjksNiArMzUsNyBAQAogdmFyIGh0dHBDb25uZWN0aW9uID0gcmVxdWlyZSgnLi9odHRwX2Nvbm5lY3Rpb24nKTsKIGV4cG9ydHMuSHR0cENvbm5lY3Rpb24gPSBodHRwQ29ubmVjdGlvbi5IdHRwQ29ubmVjdGlvbjsKIGV4cG9ydHMuY3JlYXRlSHR0cENvbm5lY3Rpb24gPSBodHRwQ29ubmVjdGlvbi5jcmVhdGVIdHRwQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlSHR0cFVEU0Nvbm5lY3Rpb24gPSBodHRwQ29ubmVjdGlvbi5jcmVhdGVIdHRwVURTQ29ubmVjdGlvbjsKIGV4cG9ydHMuY3JlYXRlSHR0cENsaWVudCA9IGh0dHBDb25uZWN0aW9uLmNyZWF0ZUh0dHBDbGllbnQ7CiAKIHZhciB3c0Nvbm5lY3Rpb24gPSByZXF1aXJlKCcuL3dzX2Nvbm5lY3Rpb24nKTsKQEAgLTY1LDMgKzcyLDQgQEAKIGV4cG9ydHMuVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKIGV4cG9ydHMuVEpTT05Qcm90b2NvbCA9IHJlcXVpcmUoJy4vanNvbl9wcm90b2NvbCcpOwogZXhwb3J0cy5UQ29tcGFjdFByb3RvY29sID0gcmVxdWlyZSgnLi9jb21wYWN0X3Byb3RvY29sJyk7CitleHBvcnRzLlRIZWFkZXJQcm90b2NvbCA9IHJlcXVpcmUoJy4vaGVhZGVyX3Byb3RvY29sJyk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW50NjRfdXRpbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnQ2NF91dGlsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDcwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW50NjRfdXRpbC5qcwpAQCAtMCwwICsxLDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKKwordmFyIEludDY0VXRpbCA9IG1vZHVsZS5leHBvcnRzID0ge307CisKK3ZhciBQT1cyXzI0ID0gTWF0aC5wb3coMiwgMjQpOwordmFyIFBPVzJfMzEgPSBNYXRoLnBvdygyLCAzMSk7Cit2YXIgUE9XMl8zMiA9IE1hdGgucG93KDIsIDMyKTsKK3ZhciBQT1cxMF8xMSA9IE1hdGgucG93KDEwLCAxMSk7CisKK0ludDY0VXRpbC50b0RlY2ltYWxTdHJpbmcgPSBmdW5jdGlvbihpNjQpIHsKKyAgdmFyIGIgPSBpNjQuYnVmZmVyOworICB2YXIgbyA9IGk2NC5vZmZzZXQ7CisgIGlmICgoIWJbb10gJiYgIShiW28gKyAxXSAmIDB4ZTApKSB8fAorICAgICAgKCF+YltvXSAmJiAhfihiW28gKyAxXSAmIDB4ZTApKSkgeworICAgIC8vIFRoZSBtYWduaXR1ZGUgaXMgc21hbGwgZW5vdWdoLgorICAgIHJldHVybiBpNjQudG9TdHJpbmcoKTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgbmVnYXRpdmUgPSBiW29dICYgMHg4MDsKKyAgICBpZiAobmVnYXRpdmUpIHsKKyAgICAgIC8vIDIncyBjb21wbGVtZW50CisgICAgICB2YXIgaW5jcmVtZW50ZWQgPSBmYWxzZTsKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgQnVmZmVyKDgpOworICAgICAgZm9yICh2YXIgaSA9IDc7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIGJ1ZmZlcltpXSA9ICh+YltvICsgaV0gKyAoaW5jcmVtZW50ZWQgPyAwIDogMSkpICYgMHhmZjsKKyAgICAgICAgaW5jcmVtZW50ZWQgfD0gYltvICsgaV07CisgICAgICB9CisgICAgICBiID0gYnVmZmVyOworICAgIH0KKyAgICB2YXIgaGlnaDIgPSBiW28gKyAxXSArIChiW29dIDw8IDgpOworICAgIC8vIExlc3NlciAxMSBkaWdpdHMgd2l0aCBleGNlZWRpbmcgdmFsdWVzIGJ1dCBpcyB1bmRlciA1MyBiaXRzIGNhcGFjaXR5LgorICAgIHZhciBsb3cgPSBiW28gKyA3XSArIChiW28gKyA2XSA8PCA4KSArIChiW28gKyA1XSA8PCAxNikKKyAgICAgICAgKyBiW28gKyA0XSAqIFBPVzJfMjQgIC8vIEJpdCBzaGlmdCByZW5kZXJzIDMydGggYml0IGFzIHNpZ24sIHNvIHVzZSBtdWx0aXBsaWNhdGlvbgorICAgICAgICArIChiW28gKyAzXSArIChiW28gKyAyXSA8PCA4KSkgKiBQT1cyXzMyICsgaGlnaDIgKiA3NDk3NjcxMDY1NjsgIC8vIFRoZSBsaXRlcmFsIGlzIDJeNDggJSAxMF4xMQorICAgIC8vIDEydGggZGlnaXQgYW5kIGdyZWF0ZXIuCisgICAgdmFyIGhpZ2ggPSBNYXRoLmZsb29yKGxvdyAvIFBPVzEwXzExKSArIGhpZ2gyICogMjgxNDsgIC8vIFRoZSBsaXRlcmFsIGlzIDJeNDggLyAxMF4xMQorICAgIC8vIE1ha2UgaXQgZXhhY3RseSAxMSB3aXRoIGxlYWRpbmcgemVyb3MuCisgICAgbG93ID0gKCcwMDAwMDAwMDAwMCcgKyBTdHJpbmcobG93ICUgUE9XMTBfMTEpKS5zbGljZSgtMTEpOworICAgIHJldHVybiAobmVnYXRpdmUgPyAnLScgOiAnJykgKyBTdHJpbmcoaGlnaCkgKyBsb3c7CisgIH0KK307CisKK0ludDY0VXRpbC5mcm9tRGVjaW1hbFN0cmluZyA9IGZ1bmN0aW9uKHRleHQpIHsKKyAgdmFyIG5lZ2F0aXZlID0gdGV4dC5jaGFyQXQoMCkgPT09ICctJzsKKyAgaWYgKHRleHQubGVuZ3RoIDwgKG5lZ2F0aXZlID8gMTcgOiAxNikpIHsKKyAgICAvLyBUaGUgbWFnbml0dWRlIGlzIHNtYWxsZXIgdGhhbiAyXjUzLgorICAgIHJldHVybiBuZXcgSW50NjQoK3RleHQpOworICB9IGVsc2UgaWYgKHRleHQubGVuZ3RoID4gKG5lZ2F0aXZlID8gMjAgOiAxOSkpIHsKKyAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVG9vIG1hbnkgZGlnaXRzIGZvciBJbnQ2NDogJyArIHRleHQpOworICB9IGVsc2UgeworICAgIC8vIE1vc3Qgc2lnbmlmaWNhbnQgKHVwIHRvIDUpIGRpZ2l0cworICAgIHZhciBoaWdoNSA9ICt0ZXh0LnNsaWNlKG5lZ2F0aXZlID8gMSA6IDAsIC0xNSk7CisgICAgdmFyIGxvdyA9ICt0ZXh0LnNsaWNlKC0xNSkgKyBoaWdoNSAqIDI3NjQ0NzIzMjA7ICAvLyBUaGUgbGl0ZXJhbCBpcyAxMF4xNSAlIDJeMzIKKyAgICB2YXIgaGlnaCA9IE1hdGguZmxvb3IobG93IC8gUE9XMl8zMikgKyBoaWdoNSAqIDIzMjgzMDsgIC8vIFRoZSBsaXRlcmFsIGlzIDEwXjE1IC8gMl4mMzIKKyAgICBsb3cgPSBsb3cgJSBQT1cyXzMyOworICAgIGlmIChoaWdoID49IFBPVzJfMzEgJiYKKyAgICAgICAgIShuZWdhdGl2ZSAmJiBoaWdoID09IFBPVzJfMzEgJiYgbG93ID09IDApICAvLyBBbGxvdyBtaW5pbXVtIEludDY0CisgICAgICAgKSB7CisgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIG1hZ25pdHVkZSBpcyB0b28gbGFyZ2UgZm9yIEludDY0LicpOworICAgIH0KKyAgICBpZiAobmVnYXRpdmUpIHsKKyAgICAgIC8vIDIncyBjb21wbGVtZW50CisgICAgICBoaWdoID0gfmhpZ2g7CisgICAgICBpZiAobG93ID09PSAwKSB7CisgICAgICAgIGhpZ2ggPSAoaGlnaCArIDEpICYgMHhmZmZmZmZmZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvdyA9IH5sb3cgKyAxOworICAgICAgfQorICAgICAgaGlnaCA9IDB4ODAwMDAwMDAgfCBoaWdoOworICAgIH0KKyAgICByZXR1cm4gbmV3IEludDY0KGhpZ2gsIGxvdyk7CisgIH0KK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wYXJzZS5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYjBiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wYXJzZS5qcwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIEltcG9ydGVkIGZyb20gRG91Z2xhcyBDcm9ja2ZvcmQncyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gd2l0aCBtaW5pbXVtIG1vZGlmaWNhdGlvbgorICogdG8gaGFuZGxlIEludDY0LgorICoKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kb3VnbGFzY3JvY2tmb3JkL0pTT04tanMvYmxvYi9jOTg5NDhhZTE5NDRhMjhlMmU4ZWJjMzcxNzg5NGU1ODBhZWFhYTA1L2pzb25fcGFyc2UuanMKKyAqCisgKiBPcmlnaW5hbCBsaWNlbnNlIGhlYWRlcjoKKyAqCisgKiBqc29uX3BhcnNlLmpzCisgKiAyMDE1LTA1LTAyCisgKiBQdWJsaWMgRG9tYWluLgorICogTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLgorICovCisKKworLypqc2xpbnQgZm9yICovCisKKy8qcHJvcGVydHkKKyAgICBhdCwgYiwgY2FsbCwgY2hhckF0LCBmLCBmcm9tQ2hhckNvZGUsIGhhc093blByb3BlcnR5LCBtZXNzYWdlLCBuLCBuYW1lLAorICAgIHByb3RvdHlwZSwgcHVzaCwgciwgdCwgdGV4dAorKi8KKwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwordmFyIEludDY0VXRpbCA9IHJlcXVpcmUoJy4vaW50NjRfdXRpbCcpOworCit2YXIganNvbl9wYXJzZSA9IG1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHsKKyAgICAidXNlIHN0cmljdCI7CisKKy8vIFRoaXMgaXMgYSBmdW5jdGlvbiB0aGF0IGNhbiBwYXJzZSBhIEpTT04gdGV4dCwgcHJvZHVjaW5nIGEgSmF2YVNjcmlwdAorLy8gZGF0YSBzdHJ1Y3R1cmUuIEl0IGlzIGEgc2ltcGxlLCByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIuIEl0IGRvZXMgbm90IHVzZQorLy8gZXZhbCBvciByZWd1bGFyIGV4cHJlc3Npb25zLCBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhIG1vZGVsIGZvciBpbXBsZW1lbnRpbmcKKy8vIGEgSlNPTiBwYXJzZXIgaW4gb3RoZXIgbGFuZ3VhZ2VzLgorCisvLyBXZSBhcmUgZGVmaW5pbmcgdGhlIGZ1bmN0aW9uIGluc2lkZSBvZiBhbm90aGVyIGZ1bmN0aW9uIHRvIGF2b2lkIGNyZWF0aW5nCisvLyBnbG9iYWwgdmFyaWFibGVzLgorCisgICAgdmFyIGF0LCAgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNoYXJhY3RlcgorICAgICAgICBjaCwgICAgIC8vIFRoZSBjdXJyZW50IGNoYXJhY3RlcgorICAgICAgICBlc2NhcGVlID0geworICAgICAgICAgICAgJyInOiAnIicsCisgICAgICAgICAgICAnXFwnOiAnXFwnLAorICAgICAgICAgICAgJy8nOiAnLycsCisgICAgICAgICAgICBiOiAnXGInLAorICAgICAgICAgICAgZjogJ1xmJywKKyAgICAgICAgICAgIG46ICdcbicsCisgICAgICAgICAgICByOiAnXHInLAorICAgICAgICAgICAgdDogJ1x0JworICAgICAgICB9LAorICAgICAgICB0ZXh0LAorCisgICAgICAgIGVycm9yID0gZnVuY3Rpb24gKG0pIHsKKworLy8gQ2FsbCBlcnJvciB3aGVuIHNvbWV0aGluZyBpcyB3cm9uZy4KKworICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKG0pOworICAgICAgICB9LAorCisgICAgICAgIG5leHQgPSBmdW5jdGlvbiAoYykgeworCisvLyBJZiBhIGMgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB2ZXJpZnkgdGhhdCBpdCBtYXRjaGVzIHRoZSBjdXJyZW50IGNoYXJhY3Rlci4KKworICAgICAgICAgICAgaWYgKGMgJiYgYyAhPT0gY2gpIHsKKyAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgJyIgKyBjICsgIicgaW5zdGVhZCBvZiAnIiArIGNoICsgIiciKTsKKyAgICAgICAgICAgIH0KKworLy8gR2V0IHRoZSBuZXh0IGNoYXJhY3Rlci4gV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBjaGFyYWN0ZXJzLAorLy8gcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuCisKKyAgICAgICAgICAgIGNoID0gdGV4dC5jaGFyQXQoYXQpOworICAgICAgICAgICAgYXQgKz0gMTsKKyAgICAgICAgICAgIHJldHVybiBjaDsKKyAgICAgICAgfSwKKworICAgICAgICBudW1iZXIgPSBmdW5jdGlvbiAoKSB7CisKKy8vIFBhcnNlIGEgbnVtYmVyIHZhbHVlLgorCisgICAgICAgICAgICB2YXIgbnVtYmVyLAorICAgICAgICAgICAgICAgIHN0cmluZyA9ICcnOworCisgICAgICAgICAgICBpZiAoY2ggPT09ICctJykgeworICAgICAgICAgICAgICAgIHN0cmluZyA9ICctJzsKKyAgICAgICAgICAgICAgICBuZXh0KCctJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2ggPT09ICcuJykgeworICAgICAgICAgICAgICAgIHN0cmluZyArPSAnLic7CisgICAgICAgICAgICAgICAgd2hpbGUgKG5leHQoKSAmJiBjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2ggPT09ICdlJyB8fCBjaCA9PT0gJ0UnKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CisgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1iZXIgPSArc3RyaW5nOworICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShudW1iZXIpKSB7CisgICAgICAgICAgICAgICAgZXJyb3IoIkJhZCBudW1iZXIiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID49IEludDY0Lk1BWF9JTlQgfHwgbnVtYmVyIDw9IEludDY0Lk1JTl9JTlQpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gcmF3IHN0cmluZyBmb3IgZnVydGhlciBwcm9jZXNzIGluIFRKU09OUHJvdG9jb2wKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIHN0cmluZyA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYSBzdHJpbmcgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBoZXgsCisgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICBzdHJpbmcgPSAnJywKKyAgICAgICAgICAgICAgICB1ZmZmZjsKKworLy8gV2hlbiBwYXJzaW5nIGZvciBzdHJpbmcgdmFsdWVzLCB3ZSBtdXN0IGxvb2sgZm9yICIgYW5kIFwgY2hhcmFjdGVycy4KKworICAgICAgICAgICAgaWYgKGNoID09PSAnIicpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyInKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAndScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkgKz0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXggPSBwYXJzZUludChuZXh0KCksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShoZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IHVmZmZmICogMTYgKyBoZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVmZmZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVzY2FwZWVbY2hdID09PSAnc3RyaW5nJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBlc2NhcGVlW2NoXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvcigiQmFkIHN0cmluZyIpOworICAgICAgICB9LAorCisgICAgICAgIHdoaXRlID0gZnVuY3Rpb24gKCkgeworCisvLyBTa2lwIHdoaXRlc3BhY2UuCisKKyAgICAgICAgICAgIHdoaWxlIChjaCAmJiBjaCA8PSAnICcpIHsKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgd29yZCA9IGZ1bmN0aW9uICgpIHsKKworLy8gdHJ1ZSwgZmFsc2UsIG9yIG51bGwuCisKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgIG5leHQoJ3QnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdyJyk7CisgICAgICAgICAgICAgICAgbmV4dCgndScpOworICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgIG5leHQoJ2YnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdhJyk7CisgICAgICAgICAgICAgICAgbmV4dCgnbCcpOworICAgICAgICAgICAgICAgIG5leHQoJ3MnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdlJyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgbmV4dCgnbicpOworICAgICAgICAgICAgICAgIG5leHQoJ3UnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CisgICAgICAgICAgICAgICAgbmV4dCgnbCcpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgJyIgKyBjaCArICInIik7CisgICAgICAgIH0sCisKKyAgICAgICAgdmFsdWUsICAvLyBQbGFjZSBob2xkZXIgZm9yIHRoZSB2YWx1ZSBmdW5jdGlvbi4KKworICAgICAgICBhcnJheSA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYW4gYXJyYXkgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOworCisgICAgICAgICAgICBpZiAoY2ggPT09ICdbJykgeworICAgICAgICAgICAgICAgIG5leHQoJ1snKTsKKyAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ10nKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQoJ10nKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5OyAgIC8vIGVtcHR5IGFycmF5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgeworICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgnXScpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5leHQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvcigiQmFkIGFycmF5Iik7CisgICAgICAgIH0sCisKKyAgICAgICAgb2JqZWN0ID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhbiBvYmplY3QgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBrZXksCisgICAgICAgICAgICAgICAgb2JqZWN0ID0ge307CisKKyAgICAgICAgICAgIGlmIChjaCA9PT0gJ3snKSB7CisgICAgICAgICAgICAgICAgbmV4dCgneycpOworICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnfScpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OyAgIC8vIGVtcHR5IG9iamVjdAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoY2gpIHsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgICAgIG5leHQoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0R1cGxpY2F0ZSBrZXkgIicgKyBrZXkgKyAnIicpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0gdmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoJ30nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnLCcpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yKCJCYWQgb2JqZWN0Iik7CisgICAgICAgIH07CisKKyAgICB2YWx1ZSA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYSBKU09OIHZhbHVlLiBJdCBjb3VsZCBiZSBhbiBvYmplY3QsIGFuIGFycmF5LCBhIHN0cmluZywgYSBudW1iZXIsCisvLyBvciBhIHdvcmQuCisKKyAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QoKTsKKyAgICAgICAgY2FzZSAnWyc6CisgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKKyAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nKCk7CisgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgcmV0dXJuIG51bWJlcigpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnOScKKyAgICAgICAgICAgICAgICA/IG51bWJlcigpCisgICAgICAgICAgICAgICAgOiB3b3JkKCk7CisgICAgICAgIH0KKyAgICB9OworCisvLyBSZXR1cm4gdGhlIGpzb25fcGFyc2UgZnVuY3Rpb24uIEl0IHdpbGwgaGF2ZSBhY2Nlc3MgdG8gYWxsIG9mIHRoZSBhYm92ZQorLy8gZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuCisKKyAgICByZXR1cm4gZnVuY3Rpb24gKHNvdXJjZSkgeworICAgICAgICB2YXIgcmVzdWx0OworCisgICAgICAgIHRleHQgPSBzb3VyY2U7CisgICAgICAgIGF0ID0gMDsKKyAgICAgICAgY2ggPSAnICc7CisgICAgICAgIHJlc3VsdCA9IHZhbHVlKCk7CisgICAgICAgIHdoaXRlKCk7CisgICAgICAgIGlmIChjaCkgeworICAgICAgICAgICAgZXJyb3IoIlN5bnRheCBlcnJvciIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9OworfSgpKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMKaW5kZXggZTk4NjUwYy4uN2UyYjdjOSAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMKQEAgLTE3LDEzICsxNywxNCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotdmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7CiB2YXIgSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7Ci12YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi90cmFuc3BvcnQnKS5JbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3I7CiB2YXIgVGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKIHZhciBUeXBlID0gVGhyaWZ0LlR5cGU7CiB2YXIgdXRpbCA9IHJlcXVpcmUoInV0aWwiKTsKIAordmFyIEludDY0VXRpbCA9IHJlcXVpcmUoJy4vaW50NjRfdXRpbCcpOwordmFyIGpzb25fcGFyc2UgPSByZXF1aXJlKCcuL2pzb25fcGFyc2UnKTsKKwogdmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CiAKIG1vZHVsZS5leHBvcnRzID0gVEpTT05Qcm90b2NvbDsKQEAgLTg5LDkgKzkwLDE2IEBACiBUSlNPTlByb3RvY29sLlZlcnNpb24gPSAxOwogCiBUSlNPTlByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKICAgcmV0dXJuIHRoaXMudHJhbnMuZmx1c2goKTsKIH07CiAKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUgPSBmdW5jdGlvbigpIHsKKyAgaWYgKHRoaXMudHN0YWNrLmxlbmd0aCA9PT0gMSkgeworICAgIHRoaXMudHJhbnMud3JpdGUodGhpcy50c3RhY2sucG9wKCkpOworICB9Cit9OworCiAvKioKICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuCkBAIC05OSw5ICsxMDcsNiBAQAogICogQHBhcmFtIHtudW1iZXJ9IHNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIGNhbGwgKGFsd2F5cyAwIGluIEFwYWNoZSBUaHJpZnQpLgogICovCiBUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCkgewotICB0aGlzLnRzdGFjayA9IFtdOwotICB0aGlzLnRwb3MgPSBbXTsKLQogICB0aGlzLnRzdGFjay5wdXNoKFtUSlNPTlByb3RvY29sLlZlcnNpb24sICciJyArIG5hbWUgKyAnIicsIG1lc3NhZ2VUeXBlLCBzZXFpZF0pOwogfTsKIApAQCAtMTE2LDYgKzEyMSw3IEBACiAKICAgdGhpcy53YnVmID0gJ1snICsgdGhpcy53b2JqLmpvaW4oJywnKSArICddJzsKIAorICAvLyB3ZSBhc3N1bWUgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvIGNvbWUgc28gd2Ugd3JpdGUKICAgdGhpcy50cmFucy53cml0ZSh0aGlzLndidWYpOwogfTsKIApAQCAtMTQ4LDYgKzE1NCw4IEBACiAKICAgc3RyICs9ICd9JzsKICAgdGhpcy50c3RhY2tbcF0gPSBzdHI7CisKKyAgdGhpcy53cml0ZVRvVHJhbnNwb3J0SWZTdGFja0lzRmx1c2hhYmxlKCk7CiB9OwogCiAvKioKQEAgLTE3OCw2ICsxODYsOCBAQAogICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZSArICc6JyArIHZhbHVlICsgJ30nOwogICB9CiAgIHRoaXMudHBvcy5wb3AoKTsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKIH07CiAKIC8qKgpAQCAtMjM0LDYgKzI0NCw4IEBACiAKICAgdGhpcy50c3RhY2tbcF0ucHVzaChtYXApOwogICB0aGlzLnRzdGFja1twXSA9ICdbJyArIHRoaXMudHN0YWNrW3BdLmpvaW4oJywnKSArICddJzsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKIH07CiAKIC8qKgpAQCAtMjU5LDYgKzI3MSw4IEBACiAgIH0KIAogICB0aGlzLnRzdGFja1twXSA9ICdbJyArIHRoaXMudHN0YWNrW3BdLmpvaW4oJywnKSArICddJzsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKIH07CiAKIC8qKgpAQCAtMjg0LDYgKzI5OCw4IEBACiAgIH0KIAogICB0aGlzLnRzdGFja1twXSA9ICdbJyArIHRoaXMudHN0YWNrW3BdLmpvaW4oJywnKSArICddJzsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKIH07CiAKIC8qKiBTZXJpYWxpemVzIGEgYm9vbGVhbiAqLwpAQCAtMzA4LDcgKzMyNCwxMSBAQAogCiAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLwogVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKLSAgdGhpcy50c3RhY2sucHVzaChpNjQpOworICBpZiAoaTY0IGluc3RhbmNlb2YgSW50NjQpIHsKKyAgICB0aGlzLnRzdGFjay5wdXNoKEludDY0VXRpbC50b0RlY2ltYWxTdHJpbmcoaTY0KSk7CisgIH0gZWxzZSB7CisgICAgdGhpcy50c3RhY2sucHVzaChpNjQpOworICB9CiB9OwogCiAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLwpAQCAtMzE3LDExICszMzcsMTkgQEAKIH07CiAKIC8qKiBTZXJpYWxpemVzIGEgc3RyaW5nICovCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKHN0cikgeworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbihhcmcpIHsKICAgLy8gV2UgZG8gbm90IGVuY29kZSB1cmkgY29tcG9uZW50cyBmb3Igd2lyZSB0cmFuc2ZlcjoKLSAgaWYgKHN0ciA9PT0gbnVsbCkgeworICBpZiAoYXJnID09PSBudWxsKSB7CiAgICAgICB0aGlzLnRzdGFjay5wdXNoKG51bGwpOwogICB9IGVsc2UgeworICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIHZhciBzdHIgPSBhcmc7CisgICAgICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEJ1ZmZlcikgeworICAgICAgICB2YXIgc3RyID0gYXJnLnRvU3RyaW5nKCd1dGY4Jyk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlU3RyaW5nIGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7CisgICAgICB9CisKICAgICAgIC8vIGNvbmNhdCBtYXkgYmUgc2xvd2VyIHRoYW4gYnVpbGRpbmcgYSBieXRlIGJ1ZmZlcgogICAgICAgdmFyIGVzY2FwZWRTdHJpbmcgPSAnJzsKICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CkBAIC0zNTgsNyArMzg2LDE1IEBACiAKIC8qKiBTZXJpYWxpemVzIGEgc3RyaW5nICovCiBUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUJpbmFyeSA9IGZ1bmN0aW9uKGFyZykgewotICB0aGlzLndyaXRlU3RyaW5nKGFyZyk7CisgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykgeworICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKGFyZywgJ2JpbmFyeScpOworICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEJ1ZmZlciB8fAorICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykgIHsKKyAgICB2YXIgYnVmID0gYXJnOworICB9IGVsc2UgeworICAgIHRocm93IG5ldyBFcnJvcignd3JpdGVCaW5hcnkgY2FsbGVkIHdpdGhvdXQgYSBzdHJpbmcvQnVmZmVyIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgfQorICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGJ1Zi50b1N0cmluZygnYmFzZTY0JykgKyAnIicpOwogfTsKIAogLyoqCkBAIC00MTgsMTcgKzQ1NCwxOCBAQAogICB9CiAKICAgaWYgKG9wZW5CcmFja2V0Q291bnQgIT09IDApIHsKLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1hbGZvcm1lZCBKU09OIGlucHV0LCBtaXNtYXRjaGVkIGJhY2tldHMiKTsKKyAgICAvLyBNaXNzaW5nIGNsb3NpbmcgYnJhY2tldC4gQ2FuIGJlIGJ1ZmZlciB1bmRlcnJ1bi4KKyAgICB0aHJvdyBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCk7CiAgIH0KIAogICAvL1JlY29uc3RpdHV0ZSB0aGUgSlNPTiBvYmplY3QgYW5kIGNvbnVtZSB0aGUgbmVjZXNzYXJ5IGJ5dGVzCi0gIHRoaXMucm9iaiA9IEpTT04ucGFyc2UodHJhbnNCdWYuYnVmLnNsaWNlKHRyYW5zQnVmLnJlYWRJbmRleCwgY3Vyc29yKzEpKTsKKyAgdGhpcy5yb2JqID0ganNvbl9wYXJzZSh0cmFuc0J1Zi5idWYuc2xpY2UodHJhbnNCdWYucmVhZEluZGV4LCBjdXJzb3IrMSkudG9TdHJpbmcoKSk7CiAgIHRoaXMudHJhbnMuY29uc3VtZShjdXJzb3IgKyAxIC0gdHJhbnNCdWYucmVhZEluZGV4KTsKIAogICAvL1ZlcmlmeSB0aGUgcHJvdG9jb2wgdmVyc2lvbgogICB2YXIgdmVyc2lvbiA9IHRoaXMucm9iai5zaGlmdCgpOwogICBpZiAodmVyc2lvbiAhPSBUSlNPTlByb3RvY29sLlZlcnNpb24pIHsKLSAgICB0aHJvdyAnV3JvbmcgdGhyaWZ0IHByb3RvY29sIHZlcnNpb246ICcgKyB2ZXJzaW9uOworICAgIHRocm93IG5ldyBFcnJvcignV3JvbmcgdGhyaWZ0IHByb3RvY29sIHZlcnNpb246ICcgKyB2ZXJzaW9uKTsKICAgfQogCiAgIC8vT2JqZWN0aWZ5IHRoZSB0aHJpZnQgbWVzc2FnZSB7bmFtZS90eXBlL3NlcXVlbmNlLW51bWJlcn0gZm9yIHJldHVybgpAQCAtNTk1LDcgKzYzMiwxMiBAQAogCiAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBsaXN0LiAqLwogVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RFbmQgPSBmdW5jdGlvbigpIHsKLSAgdGhpcy5yZWFkRmllbGRFbmQoKTsKKyAgdmFyIHBvcyA9IHRoaXMucnBvcy5wb3AoKSAtIDI7CisgIHZhciBzdCA9IHRoaXMucnN0YWNrOworICBzdC5wb3AoKTsKKyAgaWYgKHN0IGluc3RhbmNlb2YgQXJyYXkgJiYgc3QubGVuZ3RoID4gcG9zICYmIHN0W3Bvc10ubGVuZ3RoID4gMCkgeworICAgIHN0LnB1c2goc3RbcG9zXS5zaGlmdCgpKTsKKyAgfQogfTsKIAogLyoqCkBAIC02MTEsMjggKzY1MywyNCBAQAogICByZXR1cm4gdGhpcy5yZWFkTGlzdEVuZCgpOwogfTsKIAotLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8KLSAqICBGYWxzZSB1bmxlc3MgdGhlIG5leHQgbnVtYmVyIGluIHRoZSBwcm90b2NvbCBidWZmZXIKLSAqICBpcyAxLCBpbiB3aGljaCBjYXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyBUcnVlICovCiBUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkQm9vbCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkSTMyKCkgPT0gJzEnOworICByZXR1cm4gdGhpcy5yZWFkVmFsdWUoKSA9PSAnMSc7CiB9OwogCi0vKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCi0gICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCiBUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkQnl0ZSA9IGZ1bmN0aW9uKCkgewogICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7CiB9OwogCi0vKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCi0gICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCiBUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7CiAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKIH07CiAKLS8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKLSAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KIFRKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbihmKSB7CisgIHJldHVybiArdGhpcy5yZWFkVmFsdWUoKTsKK30KKworLyoqIFJldHVybnMgdGhlIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFZhbHVlID0gZnVuY3Rpb24oZikgewogICBpZiAoZiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgZiA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOwogICB9CkBAIC02NDUsNyArNjgzLDcgQEAKICAgICB9IGVsc2UgewogICAgICAgci52YWx1ZSA9IGYuc2hpZnQoKTsKICAgICB9Ci0gIH0gZWxzZSBpZiAoZiBpbnN0YW5jZW9mIE9iamVjdCkgeworICB9IGVsc2UgaWYgKCEoZiBpbnN0YW5jZW9mIEludDY0KSAmJiBmIGluc3RhbmNlb2YgT2JqZWN0KSB7CiAgICAgZm9yICh2YXIgaSBpbiBmKSB7CiAgICAgICBpZiAoaSA9PT0gbnVsbCkgewogICAgICAgICBjb250aW51ZTsKQEAgLTY2NCwyOCArNzAyLDI2IEBACiAgIHJldHVybiByLnZhbHVlOwogfTsKIAotLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQotICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLwogVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEk2NCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gbmV3IEludDY0KHRoaXMucmVhZEkzMigpKTsKKyAgdmFyIG4gPSB0aGlzLnJlYWRWYWx1ZSgpCisgIGlmICh0eXBlb2YgbiA9PT0gJ3N0cmluZycpIHsKKyAgICAvLyBBc3N1bWluZyBubyBvbmUgaXMgc2VuZGluZyBpbiAxLjExMTExZSszMyBmb3JtYXQKKyAgICByZXR1cm4gSW50NjRVdGlsLmZyb21EZWNpbWFsU3RyaW5nKG4pOworICB9IGVsc2UgeworICAgIHJldHVybiBuZXcgSW50NjQobik7CisgIH0KIH07CiAKLS8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKLSAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KIFRKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOwogfTsKIAotLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQotICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLwogVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkU3RyaW5nKCk7CisgIHJldHVybiBuZXcgQnVmZmVyKHRoaXMucmVhZFZhbHVlKCksICdiYXNlNjQnKTsKIH07CiAKLS8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKLSAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KIFRKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworICByZXR1cm4gdGhpcy5yZWFkVmFsdWUoKTsKIH07CiAKIC8qKgpAQCAtNzAxLDUgKzczNyw2MyBAQAogICogTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhCiAgKi8KIFRKU09OUHJvdG9jb2wucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbih0eXBlKSB7Ci0gIHRocm93ICdza2lwIG5vdCBzdXBwb3J0ZWQgeWV0JzsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFR5cGUuQk9PTDoKKyAgICAgIHRoaXMucmVhZEJvb2woKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5CWVRFOgorICAgICAgdGhpcy5yZWFkQnl0ZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkkxNjoKKyAgICAgIHRoaXMucmVhZEkxNigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkkzMjoKKyAgICAgIHRoaXMucmVhZEkzMigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkk2NDoKKyAgICAgIHRoaXMucmVhZEk2NCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkRPVUJMRToKKyAgICAgIHRoaXMucmVhZERvdWJsZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNUUklORzoKKyAgICAgIHRoaXMucmVhZFN0cmluZygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNUUlVDVDoKKyAgICAgIHRoaXMucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICB2YXIgciA9IHRoaXMucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKHIuZnR5cGUgPT09IFR5cGUuU1RPUCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRoaXMuc2tpcChyLmZ0eXBlKTsKKyAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZFN0cnVjdEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLk1BUDoKKyAgICAgIHZhciBtYXBCZWdpbiA9IHRoaXMucmVhZE1hcEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcEJlZ2luLnNpemU7ICsraSkgeworICAgICAgICB0aGlzLnNraXAobWFwQmVnaW4ua3R5cGUpOworICAgICAgICB0aGlzLnNraXAobWFwQmVnaW4udnR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkTWFwRW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU0VUOgorICAgICAgdmFyIHNldEJlZ2luID0gdGhpcy5yZWFkU2V0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBzZXRCZWdpbi5zaXplOyArK2kyKSB7CisgICAgICAgIHRoaXMuc2tpcChzZXRCZWdpbi5ldHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTZXRFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5MSVNUOgorICAgICAgdmFyIGxpc3RCZWdpbiA9IHRoaXMucmVhZExpc3RCZWdpbigpOworICAgICAgZm9yICh2YXIgaTMgPSAwOyBpMyA8IGxpc3RCZWdpbi5zaXplOyArK2kzKSB7CisgICAgICAgIHRoaXMuc2tpcChsaXN0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkTGlzdEVuZCgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IG5ldyAgRXJyb3IoIkludmFsaWQgdHlwZTogIiArIHR5cGUpOworICB9CiB9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2xvZy5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9sb2cuanMKaW5kZXggMGUxM2VhOC4uMDUzZTgxMyAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2xvZy5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbG9nLmpzCkBAIC0xNywxMCArMTcsNzEgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLW1vZHVsZS5leHBvcnRzID0gewotICAnaW5mbycgOiBmdW5jdGlvbiBsb2dJbmZvKCkge30sCi0gICd3YXJuaW5nJyA6IGZ1bmN0aW9uIGxvZ1dhcm5pbmcoKSB7fSwKLSAgJ2Vycm9yJyA6IGZ1bmN0aW9uIGxvZ0Vycm9yKCkge30sCi0gICdkZWJ1ZycgOiBmdW5jdGlvbiBsb2dEZWJ1ZygpIHt9LAotICAndHJhY2UnIDogZnVuY3Rpb24gbG9nVHJhY2UoKSB7fQordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7CisKK3ZhciBkaXNhYmxlZCA9IGZ1bmN0aW9uICgpIHt9OwordmFyIGxvZ0Z1bmMgPSBjb25zb2xlLmxvZzsKK3ZhciBsb2dMZXZlbCA9ICdlcnJvcic7IC8vIGRlZmF1bHQgbGV2ZWwKKworZnVuY3Rpb24gZmFjdG9yeShsZXZlbCkgeworICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgIC8vIGJldHRlciB1c2Ugc3ByZWFkIHN5bnRheCwgYnV0IGR1ZSB0byBjb21wYXRpYmlsaXR5LAorICAgIC8vIHVzZSBsZWdhY3kgbWV0aG9kIGhlcmUuCisgICAgdmFyIGFyZ3MgPSBbJ3RocmlmdDogWycgKyBsZXZlbCArICddICddLmNvbmNhdChBcnJheS5mcm9tKGFyZ3VtZW50cykpOworICAgIHJldHVybiBsb2dGdW5jKHV0aWwuZm9ybWF0LmFwcGx5KG51bGwsIGFyZ3MpKTsKKyAgfTsKK30KKwordmFyIHRyYWNlID0gZGlzYWJsZWQ7Cit2YXIgZGVidWcgPSBkaXNhYmxlZDsKK3ZhciBlcnJvciA9IGRpc2FibGVkOwordmFyIHdhcm5pbmcgPSBkaXNhYmxlZDsKK3ZhciBpbmZvID0gZGlzYWJsZWQ7CisKK2V4cG9ydHMuc2V0TG9nRnVuYyA9IGZ1bmN0aW9uIChmdW5jKSB7CisgIGxvZ0Z1bmMgPSBmdW5jOworfTsKKwordmFyIHNldExvZ0xldmVsID0gZXhwb3J0cy5zZXRMb2dMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkgeworICB0cmFjZSA9IGRlYnVnID0gZXJyb3IgPSB3YXJuaW5nID0gaW5mbyA9IGRpc2FibGVkOworICBsb2dMZXZlbCA9IGxldmVsOworICBzd2l0Y2ggKGxvZ0xldmVsKSB7CisgIGNhc2UgJ3RyYWNlJzoKKyAgICB0cmFjZSA9IGZhY3RvcnkoJ1RSQUNFJyk7CisgIGNhc2UgJ2RlYnVnJzoKKyAgICBkZWJ1ZyA9IGZhY3RvcnkoJ0RFQlVHJyk7CisgIGNhc2UgJ2Vycm9yJzoKKyAgICBlcnJvciA9IGZhY3RvcnkoJ0VSUk9SJyk7CisgIGNhc2UgJ3dhcm5pbmcnOgorICAgIHdhcm5pbmcgPSBmYWN0b3J5KCdXQVJOJyk7CisgIGNhc2UgJ2luZm8nOgorICAgIGluZm8gPSBmYWN0b3J5KCdJTkZPJyk7CisgIH0KK307CisKKy8vIHNldCBkZWZhdWx0CitzZXRMb2dMZXZlbChsb2dMZXZlbCk7CisKK2V4cG9ydHMuZ2V0TG9nTGV2ZWwgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiBsb2dMZXZlbDsKK307CisKK2V4cG9ydHMudHJhY2UgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiB0cmFjZS5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy5kZWJ1ZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGRlYnVnLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Cit9OworCitleHBvcnRzLmVycm9yID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gZXJyb3IuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CisKK2V4cG9ydHMud2FybmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIHdhcm5pbmcuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CisKK2V4cG9ydHMuaW5mbyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGluZm8uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKIH07CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuanMKaW5kZXggOWNhZjZhYi4uZDA3OGFhMiAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcwpAQCAtNTIsMTcgKzUyLDE3IEBACiAgIGlmIChTZXJ2aWNlQ2xpZW50LkNsaWVudCkgewogICAgIFNlcnZpY2VDbGllbnQgPSBTZXJ2aWNlQ2xpZW50LkNsaWVudDsKICAgfQotICB2YXIgc2VsZiA9IHRoaXM7Ci0gIFNlcnZpY2VDbGllbnQucHJvdG90eXBlLm5ld19zZXFpZCA9IGZ1bmN0aW9uKCkgewotICAgIHNlbGYuc2VxaWQgKz0gMTsKLSAgICByZXR1cm4gc2VsZi5zZXFpZDsKLSAgfTsKICAgdmFyIHdyaXRlQ2IgPSBmdW5jdGlvbihidWYsIHNlcWlkKSB7CiAgICAgY29ubmVjdGlvbi53cml0ZShidWYsc2VxaWQpOwogICB9OwogICB2YXIgdHJhbnNwb3J0ID0gbmV3IGNvbm5lY3Rpb24udHJhbnNwb3J0KHVuZGVmaW5lZCwgd3JpdGVDYik7CiAgIHZhciBwcm90b2NvbFdyYXBwZXIgPSBuZXcgV3JhcHBlcihzZXJ2aWNlTmFtZSwgY29ubmVjdGlvbi5wcm90b2NvbCwgY29ubmVjdGlvbik7CiAgIHZhciBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCh0cmFuc3BvcnQsIHByb3RvY29sV3JhcHBlcik7CisgIHZhciBzZWxmID0gdGhpczsKKyAgY2xpZW50Lm5ld19zZXFpZCA9IGZ1bmN0aW9uKCkgeworICAgIHNlbGYuc2VxaWQgKz0gMTsKKyAgICByZXR1cm4gc2VsZi5zZXFpZDsKKyAgfTsKIAogICBpZiAodHlwZW9mIGNvbm5lY3Rpb24uY2xpZW50ICE9PSAnb2JqZWN0JykgewogICAgIGNvbm5lY3Rpb24uY2xpZW50ID0ge307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvc2VydmVyLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3NlcnZlci5qcwppbmRleCA5MjFiYjg2Li4xNmI3NGVhIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvc2VydmVyLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9zZXJ2ZXIuanMKQEAgLTE2LDExICsxNiwxNCBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwordmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJ2NvbnN0YW50cycpOwogdmFyIG5ldCA9IHJlcXVpcmUoJ25ldCcpOwogdmFyIHRscyA9IHJlcXVpcmUoJ3RscycpOwogCiB2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKIHZhciBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOwordmFyIFRIZWFkZXJQcm90b2NvbCA9IHJlcXVpcmUoJy4vaGVhZGVyX3Byb3RvY29sJyk7CiB2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKIAogLyoqCkBAIC00MSwxNCArNDQsMjMgQEAKICAgICB9KTsKICAgICBzdHJlYW0ub24oJ2RhdGEnLCB0cmFuc3BvcnQucmVjZWl2ZXIoZnVuY3Rpb24odHJhbnNwb3J0V2l0aERhdGEpIHsKICAgICAgIHZhciBpbnB1dCA9IG5ldyBwcm90b2NvbCh0cmFuc3BvcnRXaXRoRGF0YSk7Ci0gICAgICB2YXIgb3V0cHV0ID0gbmV3IHByb3RvY29sKG5ldyB0cmFuc3BvcnQodW5kZWZpbmVkLCBmdW5jdGlvbihidWYpIHsKKyAgICAgIHZhciBvdXRwdXRDYiA9IGZ1bmN0aW9uKGJ1ZikgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgc3RyZWFtLndyaXRlKGJ1Zik7CiAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7CiAgICAgICAgICAgICBzdHJlYW0uZW5kKCk7CiAgICAgICAgIH0KLSAgICAgIH0pKTsKKyAgICAgIH07CisKKyAgICAgIHZhciBvdXRwdXQgPSBuZXcgcHJvdG9jb2wobmV3IHRyYW5zcG9ydCh1bmRlZmluZWQsIG91dHB1dENiKSk7CisgICAgICAvLyBSZWFkIGFuZCB3cml0ZSBuZWVkIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGUgc2FtZSB0cmFuc3BvcnQKKyAgICAgIC8vIGZvciBUSGVhZGVyUHJvdG9jb2wgYmVjYXVzZSB3ZSBzaG91bGQgb25seSByZXNwb25kIHdpdGgKKyAgICAgIC8vIGhlYWRlcnMgaWYgdGhlIHJlcXVlc3QgY29udGFpbnMgaGVhZGVycworICAgICAgaWYgKHByb3RvY29sID09PSBUSGVhZGVyUHJvdG9jb2wpIHsKKyAgICAgICAgb3V0cHV0ID0gaW5wdXQ7CisgICAgICAgIG91dHB1dC50cmFucy5vbkZsdXNoID0gb3V0cHV0Q2I7CisgICAgICB9CiAKICAgICAgIHRyeSB7CiAgICAgICAgIGRvIHsKQEAgLTg3LDYgKzk5LDEwIEBACiAgIH0KIAogICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRscykgeworICAgIGlmICghKCdzZWN1cmVQcm90b2NvbCcgaW4gb3B0aW9ucy50bHMpICYmICEoJ3NlY3VyZU9wdGlvbnMnIGluIG9wdGlvbnMudGxzKSkgeworICAgICAgb3B0aW9ucy50bHMuc2VjdXJlUHJvdG9jb2wgPSAiU1NMdjIzX21ldGhvZCI7CisgICAgICBvcHRpb25zLnRscy5zZWN1cmVPcHRpb25zID0gY29uc3RhbnRzLlNTTF9PUF9OT19TU0x2MiB8IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjM7CisgICAgfQogICAgIHJldHVybiB0bHMuY3JlYXRlU2VydmVyKG9wdGlvbnMudGxzLCBzZXJ2ZXJJbXBsKTsKICAgfSBlbHNlIHsKICAgICByZXR1cm4gbmV0LmNyZWF0ZVNlcnZlcihzZXJ2ZXJJbXBsKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dlYl9zZXJ2ZXIuanMKaW5kZXggMzcxNTllYS4uYTMzZjQ3YSAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dlYl9zZXJ2ZXIuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dlYl9zZXJ2ZXIuanMKQEAgLTIyLDYgKzIyLDcgQEAKIHZhciBwYXRoID0gcmVxdWlyZSgicGF0aCIpOwogdmFyIGZzID0gcmVxdWlyZSgiZnMiKTsKIHZhciBjcnlwdG8gPSByZXF1aXJlKCJjcnlwdG8iKTsKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOwogCiB2YXIgTXVsdGlwbGV4ZWRQcm9jZXNzb3IgPSByZXF1aXJlKCcuL211bHRpcGxleGVkX3Byb2Nlc3NvcicpLk11bHRpcGxleGVkUHJvY2Vzc29yOwogCkBAIC0yODQsNyArMjg1LDcgQEAKICAgICAnLmpwZWcnOiAnaW1hZ2UvanBlZycsCiAgICAgJy5naWYnOiAnaW1hZ2UvZ2lmJywKICAgICAnLnBuZyc6ICdpbWFnZS9wbmcnLAotICDCoCAnLnN2Zyc6ICdpbWFnZS9zdmcreG1sJworICAgICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnCiAgIH07CiAKICAgLy9TZXR1cCBhbGwgb2YgdGhlIHNlcnZpY2VzCkBAIC00MTQsNyArNDE1LDE1IEBACiAKICAgICAvL0xvY2F0ZSB0aGUgZmlsZSByZXF1ZXN0ZWQgYW5kIHNlbmQgaXQKICAgICB2YXIgdXJpID0gdXJsLnBhcnNlKHJlcXVlc3QudXJsKS5wYXRobmFtZTsKLSAgICB2YXIgZmlsZW5hbWUgPSBwYXRoLmpvaW4oYmFzZURpciwgdXJpKTsKKyAgICB2YXIgZmlsZW5hbWUgPSBwYXRoLnJlc29sdmUocGF0aC5qb2luKGJhc2VEaXIsIHVyaSkpOworCisgICAgLy9FbnN1cmUgdGhlIGJhc2VkaXIgcGF0aCBpcyBub3QgYWJsZSB0byBiZSBlc2NhcGVkCisgICAgaWYgKGZpbGVuYW1lLmluZGV4T2YoYmFzZURpcikgIT0gMCkgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwMCwgIkludmFsaWQgcmVxdWVzdCBwYXRoIiwge30pOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICByZXR1cm47CisgICAgfQorCiAgICAgZnMuZXhpc3RzKGZpbGVuYW1lLCBmdW5jdGlvbihleGlzdHMpIHsKICAgICAgIGlmKCFleGlzdHMpIHsKICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwNCk7CkBAIC01NDcsNyArNTU2LDcgQEAKICAgICAgICAgICBmcmFtZSA9IHJlc3VsdC5uZXh0RnJhbWU7CiAgICAgICAgIH0KICAgICAgIH0gY2F0Y2goZSkgewotICAgICAgICBjb25zb2xlLmxvZygiVFdlYlNvY2tldFRyYW5zcG9ydCBFeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgbG9nLmVycm9yKCdUV2ViU29ja2V0VHJhbnNwb3J0IEV4Y2VwdGlvbjogJyArIGUpOwogICAgICAgICBzb2NrZXQuZGVzdHJveSgpOwogICAgICAgfQogICAgIH0pOwpAQCAtNTU2LDkgKzU2NSwzIEBACiAgIC8vUmV0dXJuIHRoZSBzZXJ2ZXIKICAgcmV0dXJuIHNlcnZlcjsKIH07Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfdHJhbnNwb3J0LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX3RyYW5zcG9ydC5qcwppbmRleCA4ZTc1MGUyLi4zNTEzYjg0IDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfdHJhbnNwb3J0LmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93c190cmFuc3BvcnQuanMKQEAgLTE3LDYgKzE3LDggQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOworCiBtb2R1bGUuZXhwb3J0cyA9IFRXZWJTb2NrZXRUcmFuc3BvcnQ7CiAKIC8qKgpAQCAtMTA1LDcgKzEwNyw3IEBACiB9OwogCiBUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5fX29uRXJyb3IgPSBmdW5jdGlvbihldnQpIHsKLSAgY29uc29sZS5sb2coIlRocmlmdCBXZWJTb2NrZXQgRXJyb3I6ICIgKyBldnQudG9TdHJpbmcoKSk7CisgIGxvZy5lcnJvcignd2Vic29ja2V0OiAnICsgZXZ0LnRvU3RyaW5nKCkpOwogICB0aGlzLnNvY2tldC5jbG9zZSgpOwogfTsKIApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2JpbmFyeS50ZXN0LmpzIGIvbGliL25vZGVqcy90ZXN0L2JpbmFyeS50ZXN0LmpzCmluZGV4IDM4YmE2MzQuLjE4N2NkMTggMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcworKysgYi9saWIvbm9kZWpzL3Rlc3QvYmluYXJ5LnRlc3QuanMKQEAgLTE3LDE5ICsxNywxOSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotdmFyIHRlc3QgPSByZXF1aXJlKCd0YXBlJyk7Ci12YXIgYmluYXJ5ID0gcmVxdWlyZSgndGhyaWZ0L2JpbmFyeScpOworY29uc3QgdGVzdCA9IHJlcXVpcmUoInRhcGUiKTsKK2NvbnN0IGJpbmFyeSA9IHJlcXVpcmUoInRocmlmdC9iaW5hcnkiKTsKIAotdmFyIGNhc2VzID0gewotICAiU2hvdWxkIHJlYWQgc2lnbmVkIGJ5dGUiOiBmdW5jdGlvbihhc3NlcnQpeworY29uc3QgY2FzZXMgPSB7CisgICJTaG91bGQgcmVhZCBzaWduZWQgYnl0ZSI6IGZ1bmN0aW9uKGFzc2VydCkgewogICAgIGFzc2VydC5lcXVhbCgxLCBiaW5hcnkucmVhZEJ5dGUoMHgwMSkpOwotICAgIGFzc2VydC5lcXVhbCgtMSwgYmluYXJ5LnJlYWRCeXRlKDB4RkYpKTsKKyAgICBhc3NlcnQuZXF1YWwoLTEsIGJpbmFyeS5yZWFkQnl0ZSgweGZmKSk7CiAKLSAgICBhc3NlcnQuZXF1YWwoMTI3LCBiaW5hcnkucmVhZEJ5dGUoMHg3RikpOworICAgIGFzc2VydC5lcXVhbCgxMjcsIGJpbmFyeS5yZWFkQnl0ZSgweDdmKSk7CiAgICAgYXNzZXJ0LmVxdWFsKC0xMjgsIGJpbmFyeS5yZWFkQnl0ZSgweDgwKSk7CiAgICAgYXNzZXJ0LmVuZCgpOwogICB9LAotICAiU2hvdWxkIHdyaXRlIGJ5dGUiOiBmdW5jdGlvbihhc3NlcnQpeworICAiU2hvdWxkIHdyaXRlIGJ5dGUiOiBmdW5jdGlvbihhc3NlcnQpIHsKICAgICAvL1Byb3RvY29sIHNpbXBseSB3cml0ZXMgdG8gdGhlIGJ1ZmZlci4gTm90aGluZyB0byB0ZXN0Li4geWV0LgogICAgIGFzc2VydC5vayh0cnVlKTsKICAgICBhc3NlcnQuZW5kKCk7CkBAIC03Niw1OCArNzYsMTM1IEBACiAgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0sIGJpbmFyeS53cml0ZUkzMihbXSwgLTEpKTsKIAogICAgIC8vIE1pbiBJMzIKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDgwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAtMjE0NzQ4MzY0OCkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVJMzIoW10sIC0yMTQ3NDgzNjQ4KQorICAgICk7CiAgICAgLy8gTWF4IEkzMgogICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmZdLCBiaW5hcnkud3JpdGVJMzIoW10sIDIxNDc0ODM2NDcpKTsKICAgICBhc3NlcnQuZW5kKCk7CiAgIH0sCiAKICAgIlNob3VsZCByZWFkIGRvdWJsZXMiOiBmdW5jdGlvbihhc3NlcnQpIHsKLSAgICBhc3NlcnQuZXF1YWwoMCwgYmluYXJ5LnJlYWREb3VibGUoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkKLSAgICBhc3NlcnQuZXF1YWwoMCwgYmluYXJ5LnJlYWREb3VibGUoWzB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkKLSAgICBhc3NlcnQuZXF1YWwoMSwgYmluYXJ5LnJlYWREb3VibGUoWzB4M2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkKLSAgICBhc3NlcnQuZXF1YWwoMiwgYmluYXJ5LnJlYWREb3VibGUoWzB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkKLSAgICBhc3NlcnQuZXF1YWwoLTIsIGJpbmFyeS5yZWFkRG91YmxlKFsweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDAsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4M2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMiwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIC0yLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CiAKLSAgICBhc3NlcnQuZXF1YWwoTWF0aC5QSSwgYmluYXJ5LnJlYWREb3VibGUoWzB4NDAsIDB4OSwgMHgyMSwgMHhmYiwgMHg1NCwgMHg0NCwgMHgyZCwgMHgxOF0pKQorICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIE1hdGguUEksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg0MCwgMHg5LCAweDIxLCAweGZiLCAweDU0LCAweDQ0LCAweDJkLCAweDE4XSkKKyAgICApOwogCi0gICAgYXNzZXJ0LmVxdWFsKEluZmluaXR5LCBiaW5hcnkucmVhZERvdWJsZShbMHg3ZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKQotICAgIGFzc2VydC5lcXVhbCgtSW5maW5pdHksIGJpbmFyeS5yZWFkRG91YmxlKFsweGZmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgSW5maW5pdHksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg3ZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAtSW5maW5pdHksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHhmZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKIAotICAgIGFzc2VydC5vayhpc05hTihiaW5hcnkucmVhZERvdWJsZShbMHg3ZiwgMHhmOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKSkKKyAgICBhc3NlcnQub2soCisgICAgICBpc05hTihiaW5hcnkucmVhZERvdWJsZShbMHg3ZiwgMHhmOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKQorICAgICk7CiAKLSAgICBhc3NlcnQuZXF1YWwoMS8zLCBiaW5hcnkucmVhZERvdWJsZShbMHgzZiwgMHhkNSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NV0pKQorICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDEgLyAzLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4M2YsIDB4ZDUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTVdKQorICAgICk7CiAKICAgICAvLyBNaW4gc3Vibm9ybWFsIHBvc2l0aXZlIGRvdWJsZQotICAgIGFzc2VydC5lcXVhbCg0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCwgYmluYXJ5LnJlYWREb3VibGUoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdKSkKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxXSkKKyAgICApOwogICAgIC8vIE1pbiBub3JtYWwgcG9zaXRpdmUgZG91YmxlCi0gICAgYXNzZXJ0LmVxdWFsKDIuMjI1MDczODU4NTA3MjAxNGUtMzA4LCBiaW5hcnkucmVhZERvdWJsZShbMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKQorICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDIuMjI1MDczODU4NTA3MjAxNGUtMzA4LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CiAgICAgLy8gTWF4IHBvc2l0aXZlIGRvdWJsZQotICAgIGFzc2VydC5lcXVhbCgxLjc5NzY5MzEzNDg2MjMxNTdlMzA4LCBiaW5hcnkucmVhZERvdWJsZShbMHg3ZiwgMHhlZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0pKQorICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDEuNzk3NjkzMTM0ODYyMzE1N2UzMDgsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg3ZiwgMHhlZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0pCisgICAgKTsKICAgICBhc3NlcnQuZW5kKCk7CiAgIH0sCiAKICAgIlNob3VsZCB3cml0ZSBkb3VibGVzIjogZnVuY3Rpb24oYXNzZXJ0KSB7Ci0gICAgYXNzZXJ0LmRlZXBFcXVhbChbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMCkpOwotICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4M2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEpKTsKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAyKSk7Ci0gICAgYXNzZXJ0LmRlZXBFcXVhbChbMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZURvdWJsZShbXSwgLTIpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAwKQorICAgICk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDNmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMSkKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDIpCisgICAgKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAtMikKKyAgICApOwogCi0gICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg0MCwgMHg5LCAweDIxLCAweGZiLCAweDU0LCAweDQ0LCAweDJkLCAweDE4XSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBNYXRoLlBJKSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDQwLCAweDksIDB4MjEsIDB4ZmIsIDB4NTQsIDB4NDQsIDB4MmQsIDB4MThdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBNYXRoLlBJKQorICAgICk7CiAKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDdmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBJbmZpbml0eSkpOwotICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4ZmYsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIC1JbmZpbml0eSkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg3ZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIEluZmluaXR5KQorICAgICk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweGZmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgLUluZmluaXR5KQorICAgICk7CiAKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDdmLCAweGY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBOYU4pKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBOYU4pCisgICAgKTsKIAotICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4M2YsIDB4ZDUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTVdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEvMykpOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgzZiwgMHhkNSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NV0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEgLyAzKQorICAgICk7CiAKICAgICAvLyBNaW4gc3Vibm9ybWFsIHBvc2l0aXZlIGRvdWJsZQotICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0KSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjQpCisgICAgKTsKICAgICAvLyBNaW4gbm9ybWFsIHBvc2l0aXZlIGRvdWJsZQotICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIDIuMjI1MDczODU4NTA3MjAxNGUtMzA4KSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgpCisgICAgKTsKICAgICAvLyBNYXggcG9zaXRpdmUgZG91YmxlCi0gICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg3ZiwgMHhlZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0sIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg3ZiwgMHhlZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEuNzk3NjkzMTM0ODYyMzE1N2UzMDgpCisgICAgKTsKICAgICBhc3NlcnQuZW5kKCk7CiAgIH0KIH07CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvYnJvd3Nlcl9jbGllbnQuanMgYi9saWIvbm9kZWpzL3Rlc3QvYnJvd3Nlcl9jbGllbnQuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZGI1NDMuLjAwMDAwMDAKLS0tIGEvbGliL25vZGVqcy90ZXN0L2Jyb3dzZXJfY2xpZW50LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCi12YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7Ci12YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Ci12YXIgaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpOwotdmFyIFRocmlmdFRlc3QgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdCcpOwotdmFyIFRocmlmdFRlc3REcml2ZXIgPSByZXF1aXJlKCcuL3Rlc3RfZHJpdmVyJykuVGhyaWZ0VGVzdERyaXZlcjsKLQotLy8gY3JlYXRlWEhSQ29ubmVjdGlvbiBjcmVhdGVXU0Nvbm5lY3Rpb24KLXZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZVhIUkNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkwOTAsIHsKLSAgICB0cmFuc3BvcnQ6IGhlbHBlcnMudHJhbnNwb3J0c1snYnVmZmVyZWQnXSwKLSAgICBwcm90b2NvbDogaGVscGVycy5wcm90b2NvbHNbJ2pzb24nXSwKLSAgICBwYXRoOiAnL3Rlc3QnCi19KTsKLQotY29ubmVjdGlvbi5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKLSAgICBhc3NlcnQoZmFsc2UsIGVycik7Ci19KTsKLQotLy8gVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBzdGFydCBhIHdlYnNvY2tldHMgY29ubmVjdGlvbgotLy8gY29ubmVjdGlvbi5vcGVuKCk7Ci0KLS8vIGNyZWF0ZVdTQ2xpZW50IGNyZWF0ZVhIUkNsaWVudAotdmFyIGNsaWVudCA9IHRocmlmdC5jcmVhdGVYSFJDbGllbnQoVGhyaWZ0VGVzdCwgY29ubmVjdGlvbik7Ci0KLVRocmlmdFRlc3REcml2ZXIoY2xpZW50LCBmdW5jdGlvbiAoc3RhdHVzKSB7Ci0gICAgY29uc29sZS5sb2coJ0Jyb3dzZXI6Jywgc3RhdHVzKTsKLX0pOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2NsaWVudC5qcyBiL2xpYi9ub2RlanMvdGVzdC9jbGllbnQuanMKaW5kZXggOTEzNjVmYy4uNDllM2E1ZSAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy90ZXN0L2NsaWVudC5qcworKysgYi9saWIvbm9kZWpzL3Rlc3QvY2xpZW50LmpzCkBAIC0xOSwxMTAgKzE5LDE1MSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotdmFyIGZzID0gcmVxdWlyZSgnZnMnKTsKLXZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKLXZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKLXZhciBoZWxwZXJzID0gcmVxdWlyZSgnLi9oZWxwZXJzJyk7Ci12YXIgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0Jyk7Ci12YXIgVGhyaWZ0VGVzdERyaXZlciA9IHJlcXVpcmUoJy4vdGVzdF9kcml2ZXInKS5UaHJpZnRUZXN0RHJpdmVyOwotdmFyIFRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gcmVxdWlyZSgnLi90ZXN0X2RyaXZlcicpLlRocmlmdFRlc3REcml2ZXJQcm9taXNlOwotdmFyIFNlY29uZFNlcnZpY2UgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvU2Vjb25kU2VydmljZScpOwotdmFyIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzJyk7Citjb25zdCBhc3NlcnQgPSByZXF1aXJlKCJhc3NlcnQiKTsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOworY29uc3QgaGVscGVycyA9IHJlcXVpcmUoIi4vaGVscGVycyIpOwogCi12YXIgcHJvZ3JhbSA9IHJlcXVpcmUoJ2NvbW1hbmRlcicpOworY29uc3QgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RgKTsKK2NvbnN0IFRocmlmdFRlc3REcml2ZXIgPSByZXF1aXJlKCIuL3Rlc3RfZHJpdmVyIikuVGhyaWZ0VGVzdERyaXZlcjsKK2NvbnN0IFRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gcmVxdWlyZSgiLi90ZXN0X2RyaXZlciIpCisgIC5UaHJpZnRUZXN0RHJpdmVyUHJvbWlzZTsKK2NvbnN0IFNlY29uZFNlcnZpY2UgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9TZWNvbmRTZXJ2aWNlYCk7CisKK2NvbnN0IHByb2dyYW0gPSByZXF1aXJlKCJjb21tYW5kZXIiKTsKIAogcHJvZ3JhbQotICAub3B0aW9uKCctcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+JywgJ1NldCB0aHJpZnQgcHJvdG9jb2wgKGJpbmFyeXxqc29uKSBbcHJvdG9jb2xdJykKLSAgLm9wdGlvbignLXQsIC0tdHJhbnNwb3J0IDx0cmFuc3BvcnQ+JywgJ1NldCB0aHJpZnQgdHJhbnNwb3J0IChidWZmZXJlZHxmcmFtZWQpIFt0cmFuc3BvcnRdJykKLSAgLm9wdGlvbignLS1wb3J0IDxwb3J0PicsICdTZXQgdGhyaWZ0IHNlcnZlciBwb3J0IG51bWJlciB0byBjb25uZWN0JywgOTA5MCkKLSAgLm9wdGlvbignLS1ob3N0IDxob3N0PicsICdTZXQgdGhyaWZ0IHNlcnZlciBob3N0IHRvIGNvbm5lY3QnLCAnbG9jYWxob3N0JykKLSAgLm9wdGlvbignLS1zc2wnLCAndXNlIFNTTCB0cmFuc3BvcnQnKQotICAub3B0aW9uKCctLXByb21pc2UnLCAndGVzdCB3aXRoIHByb21pc2Ugc3R5bGUgZnVuY3Rpb25zJykKLSAgLm9wdGlvbignLXQsIC0tdHlwZSA8dHlwZT4nLCAnU2VsZWN0IHNlcnZlciB0eXBlICh0Y3B8bXVsdGlwbGV4fGh0dHApJywgJ3RjcCcpCisgIC5vcHRpb24oCisgICAgIi1wLCAtLXByb3RvY29sIDxwcm90b2NvbD4iLAorICAgICJTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnl8Y29tcGFjdHxqc29uKSBbcHJvdG9jb2xdIgorICApCisgIC5vcHRpb24oCisgICAgIi10LCAtLXRyYW5zcG9ydCA8dHJhbnNwb3J0PiIsCisgICAgIlNldCB0aHJpZnQgdHJhbnNwb3J0IChidWZmZXJlZHxmcmFtZWR8aHR0cCkgW3RyYW5zcG9ydF0iCisgICkKKyAgLm9wdGlvbigiLS1wb3J0IDxwb3J0PiIsICJTZXQgdGhyaWZ0IHNlcnZlciBwb3J0IG51bWJlciB0byBjb25uZWN0IiwgOTA5MCkKKyAgLm9wdGlvbigiLS1ob3N0IDxob3N0PiIsICJTZXQgdGhyaWZ0IHNlcnZlciBob3N0IHRvIGNvbm5lY3QiLCAibG9jYWxob3N0IikKKyAgLm9wdGlvbigKKyAgICAiLS1kb21haW4tc29ja2V0IDxwYXRoPiIsCisgICAgIlNldCB0aHJpZnQgc2VydmVyIHVuaXggZG9tYWluIHNvY2tldCB0byBjb25uZWN0IgorICApCisgIC5vcHRpb24oIi0tc3NsIiwgInVzZSBTU0wgdHJhbnNwb3J0IikKKyAgLm9wdGlvbigiLS1jYWxsYmFjayIsICJ0ZXN0IHdpdGggY2FsbGJhY2sgc3R5bGUgZnVuY3Rpb25zIikKKyAgLm9wdGlvbigKKyAgICAiLXQsIC0tdHlwZSA8dHlwZT4iLAorICAgICJTZWxlY3Qgc2VydmVyIHR5cGUgKGh0dHB8bXVsdGlwbGV4fHRjcHx3ZWJzb2NrZXQpIiwKKyAgICAidGNwIgorICApCisgIC5vcHRpb24oIi0tZXM2IiwgIlVzZSBlczYgY29kZSIpCisgIC5vcHRpb24oIi0tZXM1IiwgIlVzZSBlczUgY29kZSIpCiAgIC5wYXJzZShwcm9jZXNzLmFyZ3YpOwogCi12YXIgaG9zdCA9IHByb2dyYW0uaG9zdDsKLXZhciBwb3J0ID0gcHJvZ3JhbS5wb3J0OwotdmFyIHR5cGUgPSBwcm9ncmFtLnR5cGU7Ci12YXIgc3NsID0gcHJvZ3JhbS5zc2w7Ci12YXIgcHJvbWlzZSA9IHByb2dyYW0ucHJvbWlzZTsKK2NvbnN0IGhvc3QgPSBwcm9ncmFtLmhvc3Q7Citjb25zdCBwb3J0ID0gcHJvZ3JhbS5wb3J0OworY29uc3QgZG9tYWluU29ja2V0ID0gcHJvZ3JhbS5kb21haW5Tb2NrZXQ7Citjb25zdCBzc2wgPSBwcm9ncmFtLnNzbDsKK2xldCB0eXBlID0gcHJvZ3JhbS50eXBlOwogCi12YXIgb3B0aW9ucyA9IHsKKy8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY3Jvc3MgdGVzdCBpbnZvY2F0aW9uIGZvciBodHRwIHRyYW5zcG9ydCB0ZXN0aW5nICovCitpZiAocHJvZ3JhbS50cmFuc3BvcnQgPT09ICJodHRwIikgeworICBwcm9ncmFtLnRyYW5zcG9ydCA9ICJidWZmZXJlZCI7CisgIHR5cGUgPSAiaHR0cCI7Cit9CisKK2NvbnN0IG9wdGlvbnMgPSB7CiAgIHRyYW5zcG9ydDogaGVscGVycy50cmFuc3BvcnRzW3Byb2dyYW0udHJhbnNwb3J0XSwKICAgcHJvdG9jb2w6IGhlbHBlcnMucHJvdG9jb2xzW3Byb2dyYW0ucHJvdG9jb2xdCiB9OwogCi1pZiAodHlwZSA9PT0gJ2h0dHAnIHx8IHR5cGUgPT09ICd3ZWJzb2NrZXQnKSB7Ci0gIG9wdGlvbnMucGF0aCA9ICcvdGVzdCc7CitpZiAodHlwZSA9PT0gImh0dHAiIHx8IHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgIG9wdGlvbnMucGF0aCA9ICIvdGVzdCI7CiB9CiAKLWlmICh0eXBlID09PSAnaHR0cCcpIHsKLSAgb3B0aW9ucy5oZWFkZXJzID0geyJDb25uZWN0aW9uIjogImNsb3NlIn07CitpZiAodHlwZSA9PT0gImh0dHAiKSB7CisgIG9wdGlvbnMuaGVhZGVycyA9IHsgQ29ubmVjdGlvbjogImNsb3NlIiB9OwogfQogCiBpZiAoc3NsKSB7Ci0gIGlmICh0eXBlID09PSAndGNwJyB8fCB0eXBlID09PSAnbXVsdGlwbGV4JykgeworICBpZiAodHlwZSA9PT0gInRjcCIgfHwgdHlwZSA9PT0gIm11bHRpcGxleCIpIHsKICAgICBvcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZCA9IGZhbHNlOwotICB9IGVsc2UgaWYgKHR5cGUgPT09ICdodHRwJykgeworICB9IGVsc2UgaWYgKHR5cGUgPT09ICJodHRwIikgewogICAgIG9wdGlvbnMubm9kZU9wdGlvbnMgPSB7IHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UgfTsKICAgICBvcHRpb25zLmh0dHBzID0gdHJ1ZTsKLSAgfSBlbHNlIGlmICh0eXBlID09PSAnd2Vic29ja2V0JykgeworICB9IGVsc2UgaWYgKHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CiAgICAgb3B0aW9ucy53c09wdGlvbnMgPSB7IHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UgfTsKICAgICBvcHRpb25zLnNlY3VyZSA9IHRydWU7CiAgIH0KIH0KIAotdmFyIGNvbm5lY3Rpb247Ci12YXIgY2xpZW50OwotdmFyIHRlc3REcml2ZXIgPSBwcm9taXNlID8gVGhyaWZ0VGVzdERyaXZlclByb21pc2UgOiBUaHJpZnRUZXN0RHJpdmVyOworbGV0IGNvbm5lY3Rpb247CitsZXQgY2xpZW50OworY29uc3QgdGVzdERyaXZlciA9IHByb2dyYW0uY2FsbGJhY2sKKyAgPyBUaHJpZnRUZXN0RHJpdmVyCisgIDogVGhyaWZ0VGVzdERyaXZlclByb21pc2U7CitpZiAoaGVscGVycy5lY21hTW9kZSA9PT0gImVzNiIgJiYgcHJvZ3JhbS5jYWxsYmFjaykgeworICBjb25zb2xlLmxvZygiRVM2IGRvZXMgbm90IHN1cHBvcnQgY2FsbGJhY2sgc3R5bGUiKTsKKyAgcHJvY2Vzcy5leGl0KDApOworfQogCi1pZiAodHlwZSA9PT0gJ3RjcCcgfHwgdHlwZSA9PT0gJ211bHRpcGxleCcpIHsKLSAgY29ubmVjdGlvbiA9IHNzbCA/Ci0gICAgdGhyaWZ0LmNyZWF0ZVNTTENvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgOgotICAgIHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpOwotfSBlbHNlIGlmICh0eXBlID09PSAnaHR0cCcpIHsKLSAgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVIdHRwQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKLX0gZWxzZSBpZiAodHlwZSA9PT0gJ3dlYnNvY2tldCcpIHsKK2lmICh0eXBlID09PSAidGNwIiB8fCB0eXBlID09PSAibXVsdGlwbGV4IikgeworICBpZiAoZG9tYWluU29ja2V0KSB7CisgICAgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVVRFNDb25uZWN0aW9uKGRvbWFpblNvY2tldCwgb3B0aW9ucyk7CisgIH0gZWxzZSB7CisgICAgY29ubmVjdGlvbiA9IHNzbAorICAgICAgPyB0aHJpZnQuY3JlYXRlU1NMQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKQorICAgICAgOiB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKKyAgfQorfSBlbHNlIGlmICh0eXBlID09PSAiaHR0cCIpIHsKKyAgaWYgKGRvbWFpblNvY2tldCkgeworICAgIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlSHR0cFVEU0Nvbm5lY3Rpb24oZG9tYWluU29ja2V0LCBvcHRpb25zKTsKKyAgfSBlbHNlIHsKKyAgICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUh0dHBDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpOworICB9Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CiAgIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlV1NDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpOwogICBjb25uZWN0aW9uLm9wZW4oKTsKIH0KIAotY29ubmVjdGlvbi5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKLSAgICBhc3NlcnQoZmFsc2UsIGVycik7Citjb25uZWN0aW9uLm9uKCJlcnJvciIsIGZ1bmN0aW9uKGVycikgeworICBhc3NlcnQoZmFsc2UsIGVycik7CiB9KTsKIAotaWYgKHR5cGUgPT09ICd0Y3AnKSB7CitpZiAodHlwZSA9PT0gInRjcCIpIHsKICAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChUaHJpZnRUZXN0LCBjb25uZWN0aW9uKTsKICAgcnVuVGVzdHMoKTsKLX0gZWxzZSBpZiAodHlwZSA9PT0gJ211bHRpcGxleCcpIHsKLSAgdmFyIG1wID0gbmV3IHRocmlmdC5NdWx0aXBsZXhlcigpOworfSBlbHNlIGlmICh0eXBlID09PSAibXVsdGlwbGV4IikgeworICBjb25zdCBtcCA9IG5ldyB0aHJpZnQuTXVsdGlwbGV4ZXIoKTsKICAgY2xpZW50ID0gbXAuY3JlYXRlQ2xpZW50KCJUaHJpZnRUZXN0IiwgVGhyaWZ0VGVzdCwgY29ubmVjdGlvbik7Ci0gIHNlY29uZGNsaWVudCA9IG1wLmNyZWF0ZUNsaWVudCgiU2Vjb25kU2VydmljZSIsIFNlY29uZFNlcnZpY2UsIGNvbm5lY3Rpb24pOworICBjb25zdCBzZWNvbmRjbGllbnQgPSBtcC5jcmVhdGVDbGllbnQoCisgICAgIlNlY29uZFNlcnZpY2UiLAorICAgIFNlY29uZFNlcnZpY2UsCisgICAgY29ubmVjdGlvbgorICApOwogCi0gIGNvbm5lY3Rpb24ub24oJ2Nvbm5lY3QnLCBmdW5jdGlvbigpIHsKKyAgY29ubmVjdGlvbi5vbigiY29ubmVjdCIsIGZ1bmN0aW9uKCkgewogICAgIHNlY29uZGNsaWVudC5zZWNvbmR0ZXN0U3RyaW5nKCJUZXN0IiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewogICAgICAgYXNzZXJ0KCFlcnIpOwotICAgICAgYXNzZXJ0LmVxdWFsKCJUZXN0IiwgcmVzcG9uc2UpOworICAgICAgYXNzZXJ0LmVxdWFsKCd0ZXN0U3RyaW5nKCJUZXN0IiknLCByZXNwb25zZSk7CiAgICAgfSk7CiAKICAgICBydW5UZXN0cygpOwogICB9KTsKLX0gZWxzZSBpZiAodHlwZSA9PT0gJ2h0dHAnKSB7Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJodHRwIikgewogICBjbGllbnQgPSB0aHJpZnQuY3JlYXRlSHR0cENsaWVudChUaHJpZnRUZXN0LCBjb25uZWN0aW9uKTsKICAgcnVuVGVzdHMoKTsKLX0gZWxzZSBpZiAodHlwZSA9PT0gJ3dlYnNvY2tldCcpIHsKK30gZWxzZSBpZiAodHlwZSA9PT0gIndlYnNvY2tldCIpIHsKICAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZVdTQ2xpZW50KFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOwogICBydW5UZXN0cygpOwogfQogCiBmdW5jdGlvbiBydW5UZXN0cygpIHsKLSAgdGVzdERyaXZlcihjbGllbnQsIGZ1bmN0aW9uIChzdGF0dXMpIHsKKyAgdGVzdERyaXZlcihjbGllbnQsIGZ1bmN0aW9uKHN0YXR1cykgewogICAgIGNvbnNvbGUubG9nKHN0YXR1cyk7Ci0gICAgaWYgKHR5cGUgPT09ICdodHRwJyB8fCB0eXBlID09PSAnd2Vic29ja2V0JykgewotICAgICAgcHJvY2Vzcy5leGl0KDApOwotICAgIH0gZWxzZSB7CisgICAgaWYgKHR5cGUgIT09ICJodHRwIiAmJiB0eXBlICE9PSAid2Vic29ja2V0IikgewogICAgICAgY29ubmVjdGlvbi5lbmQoKTsKICAgICB9CisgICAgaWYgKHR5cGUgIT09ICJtdWx0aXBsZXgiKSB7CisgICAgICBwcm9jZXNzLmV4aXQoMCk7CisgICAgfQogICB9KTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcyBiL2xpYi9ub2RlanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKaW5kZXggOGRkMjllZS4uNTA0ZGFjZiAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcworKysgYi9saWIvbm9kZWpzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzCkBAIC0xLDM2ICsxLDUyIEBACi12YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0pzRGVlcENvbnN0cnVjdG9yVGVzdF90eXBlcycpOwotdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOwotdmFyIHRlc3QgPSByZXF1aXJlKCd0YXBlJyk7Ci12YXIgYnVmZmVyRXF1YWxzID0gcmVxdWlyZSgnYnVmZmVyLWVxdWFscycpOworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjb25zdCB0dHlwZXMgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvSnNEZWVwQ29uc3RydWN0b3JUZXN0X3R5cGVzIik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7Citjb25zdCBidWZmZXJFcXVhbHMgPSByZXF1aXJlKCJidWZmZXItZXF1YWxzIik7CiAKIGZ1bmN0aW9uIHNlcmlhbGl6ZUJpbmFyeShkYXRhKSB7Ci0gIHZhciBidWZmOwotICB2YXIgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQobnVsbCwgZnVuY3Rpb24obXNnKXsKKyAgbGV0IGJ1ZmY7CisgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KG51bGwsIGZ1bmN0aW9uKG1zZykgewogICAgIGJ1ZmYgPSBtc2c7CiAgIH0pOwotICB2YXIgcHJvdCA9IG5ldyB0aHJpZnQuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgIGNvbnN0IHByb3QgPSBuZXcgdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwogICBkYXRhLndyaXRlKHByb3QpOwogICBwcm90LmZsdXNoKCk7CiAgIHJldHVybiBidWZmOwotCiB9CiAKLQogZnVuY3Rpb24gZGVzZXJpYWxpemVCaW5hcnkoc2VyaWFsaXplZCwgdHlwZSkgewotICB2YXIgdCA9IG5ldyB0aHJpZnQuVEZyYW1lZFRyYW5zcG9ydChzZXJpYWxpemVkKTsKLSAgdmFyIHAgPSBuZXcgdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCh0KTsKLSAgdmFyIGRhdGEgPSBuZXcgdHlwZSgpOworICBjb25zdCB0ID0gbmV3IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0KHNlcmlhbGl6ZWQpOworICBjb25zdCBwID0gbmV3IHRocmlmdC5UQmluYXJ5UHJvdG9jb2wodCk7CisgIGNvbnN0IGRhdGEgPSBuZXcgdHlwZSgpOwogICBkYXRhLnJlYWQocCk7CiAgIHJldHVybiBkYXRhOwogfQogCi0KIGZ1bmN0aW9uIHNlcmlhbGl6ZUpTT04oZGF0YSkgewotICB2YXIgYnVmZjsKLSAgdmFyIHRyYW5zcG9ydCA9IG5ldyB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KG51bGwsIGZ1bmN0aW9uKG1zZyl7CisgIGxldCBidWZmOworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydChudWxsLCBmdW5jdGlvbihtc2cpIHsKICAgICBidWZmID0gbXNnOwogICB9KTsKLSAgdmFyIHByb3RvY29sICA9IG5ldyB0aHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICBjb25zdCBwcm90b2NvbCA9IG5ldyB0aHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOwogICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbigiIiwgMCwgMCk7CiAgIGRhdGEud3JpdGUocHJvdG9jb2wpOwogICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKQEAgLTM4LDQ1ICs1NCw0MSBAQAogICByZXR1cm4gYnVmZjsKIH0KIAotCiBmdW5jdGlvbiBkZXNlcmlhbGl6ZUpTT04oc2VyaWFsaXplZCwgdHlwZSkgewotICB2YXIgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0KHNlcmlhbGl6ZWQpOwotICB2YXIgcHJvdG9jb2wgID0gbmV3IHRocmlmdC5USlNPTlByb3RvY29sKHRyYW5zcG9ydCk7CisgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyB0aHJpZnQuVEZyYW1lZFRyYW5zcG9ydChzZXJpYWxpemVkKTsKKyAgY29uc3QgcHJvdG9jb2wgPSBuZXcgdGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOwotICB2YXIgZGF0YSA9IG5ldyB0eXBlKCk7CisgIGNvbnN0IGRhdGEgPSBuZXcgdHlwZSgpOwogICBkYXRhLnJlYWQocHJvdG9jb2wpOwogICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOwogICByZXR1cm4gZGF0YTsKIH0KIAotCiBmdW5jdGlvbiBjcmVhdGVUaHJpZnRPYmooKSB7Ci0KICAgcmV0dXJuIG5ldyB0dHlwZXMuQ29tcGxleCh7Ci0KLSAgICBzdHJ1Y3RfZmllbGQ6IG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2EnfSksCisgICAgc3RydWN0X2ZpZWxkOiBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiYSIgfSksCiAKICAgICBzdHJ1Y3RfbGlzdF9maWVsZDogWwotICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoe3ZhbHVlOiAnYid9KSwKLSAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2MnfSksCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiYiIgfSksCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiYyIgfSkKICAgICBdLAogCiAgICAgc3RydWN0X3NldF9maWVsZDogWwotICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoe3ZhbHVlOiAnZCd9KSwKLSAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2UnfSksCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiZCIgfSksCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiZSIgfSkKICAgICBdLAogCiAgICAgc3RydWN0X21hcF9maWVsZDogewotICAgICAgQTogbmV3IHR0eXBlcy5TaW1wbGUoe3ZhbHVlOiAnZid9KSwKLSAgICAgIEI6IG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2cnfSkKKyAgICAgIEE6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJmIiB9KSwKKyAgICAgIEI6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJnIiB9KQogICAgIH0sCiAKICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IFsKICAgICAgIFsKICAgICAgICAgewogICAgICAgICAgIEM6IFsKLSAgICAgICAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2gnfSksCi0gICAgICAgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7dmFsdWU6ICdpJ30pCisgICAgICAgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiaCIgfSksCisgICAgICAgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiaSIgfSkKICAgICAgICAgICBdCiAgICAgICAgIH0KICAgICAgIF0KQEAgLTg1LDQ2ICs5Nyw1NyBAQAogICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IHsKICAgICAgIEQ6IFsKICAgICAgICAgewotICAgICAgICAgIERBOiBuZXcgdHR5cGVzLlNpbXBsZSh7dmFsdWU6ICdqJ30pCisgICAgICAgICAgREE6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJqIiB9KQogICAgICAgICB9LAogICAgICAgICB7Ci0gICAgICAgICAgREI6IG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2snfSkKKyAgICAgICAgICBEQjogbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImsiIH0pCiAgICAgICAgIH0KICAgICAgIF0KLSAgICB9Ci0gIH0KLSAgKTsKKyAgICB9LAorCisgICAgbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICBbImwwMCIsICJsMDEiLCAibDAyIl0sCisgICAgICBbImwxMCIsICJsMTEiLCAibDEyIl0sCisgICAgICBbImwyMCIsICJsMjEiLCAibDIyIl0KKyAgICBdLAorCisgICAgbGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsKKyAgICAgICAgWyJtMDAwIiwgIm0wMDEiLCAibTAwMiJdLAorICAgICAgICBbIm0wMTAiLCAibTAxMSIsICJtMDEyIl0sCisgICAgICAgIFsibTAyMCIsICJtMDIxIiwgIm0wMjIiXQorICAgICAgXSwKKyAgICAgIFsKKyAgICAgICAgWyJtMTAwIiwgIm0xMDEiLCAibTEwMiJdLAorICAgICAgICBbIm0xMTAiLCAibTExMSIsICJtMTEyIl0sCisgICAgICAgIFsibTEyMCIsICJtMTIxIiwgIm0xMjIiXQorICAgICAgXSwKKyAgICAgIFsKKyAgICAgICAgWyJtMjAwIiwgIm0yMDEiLCAibTIwMiJdLAorICAgICAgICBbIm0yMTAiLCAibTIxMSIsICJtMjEyIl0sCisgICAgICAgIFsibTIyMCIsICJtMjIxIiwgIm0yMjIiXQorICAgICAgXQorICAgIF0KKyAgfSk7CiB9CiAKLQogZnVuY3Rpb24gY3JlYXRlSnNPYmooKSB7Ci0KICAgcmV0dXJuIHsKKyAgICBzdHJ1Y3RfZmllbGQ6IHsgdmFsdWU6ICJhIiB9LAogCi0gICAgc3RydWN0X2ZpZWxkOiB7dmFsdWU6ICdhJ30sCisgICAgc3RydWN0X2xpc3RfZmllbGQ6IFt7IHZhbHVlOiAiYiIgfSwgeyB2YWx1ZTogImMiIH1dLAogCi0gICAgc3RydWN0X2xpc3RfZmllbGQ6IFsKLSAgICAgIHt2YWx1ZTogJ2InfSwKLSAgICAgIHt2YWx1ZTogJ2MnfSwKLSAgICBdLAotCi0gICAgc3RydWN0X3NldF9maWVsZDogWwotICAgICAge3ZhbHVlOiAnZCd9LAotICAgICAge3ZhbHVlOiAnZSd9LAotICAgIF0sCisgICAgc3RydWN0X3NldF9maWVsZDogW3sgdmFsdWU6ICJkIiB9LCB7IHZhbHVlOiAiZSIgfV0sCiAKICAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiB7Ci0gICAgICBBOiB7dmFsdWU6ICdmJ30sCi0gICAgICBCOiB7dmFsdWU6ICdnJ30KKyAgICAgIEE6IHsgdmFsdWU6ICJmIiB9LAorICAgICAgQjogeyB2YWx1ZTogImciIH0KICAgICB9LAogCiAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBbCiAgICAgICBbCiAgICAgICAgIHsKLSAgICAgICAgICBDOiBbCi0gICAgICAgICAgICB7dmFsdWU6ICdoJ30sCi0gICAgICAgICAgICB7dmFsdWU6ICdpJ30KLSAgICAgICAgICBdCisgICAgICAgICAgQzogW3sgdmFsdWU6ICJoIiB9LCB7IHZhbHVlOiAiaSIgfV0KICAgICAgICAgfQogICAgICAgXQogICAgIF0sCkBAIC0xMzIsNzkgKzE1NSwxNDIgQEAKICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiB7CiAgICAgICBEOiBbCiAgICAgICAgIHsKLSAgICAgICAgICBEQToge3ZhbHVlOiAnaid9CisgICAgICAgICAgREE6IHsgdmFsdWU6ICJqIiB9CiAgICAgICAgIH0sCiAgICAgICAgIHsKLSAgICAgICAgICBEQjoge3ZhbHVlOiAnayd9CisgICAgICAgICAgREI6IHsgdmFsdWU6ICJrIiB9CiAgICAgICAgIH0KICAgICAgIF0KLSAgICB9CisgICAgfSwKKworICAgIGxpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgWyJsMDAiLCAibDAxIiwgImwwMiJdLAorICAgICAgWyJsMTAiLCAibDExIiwgImwxMiJdLAorICAgICAgWyJsMjAiLCAibDIxIiwgImwyMiJdCisgICAgXSwKKworICAgIGxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICBbCisgICAgICAgIFsibTAwMCIsICJtMDAxIiwgIm0wMDIiXSwKKyAgICAgICAgWyJtMDEwIiwgIm0wMTEiLCAibTAxMiJdLAorICAgICAgICBbIm0wMjAiLCAibTAyMSIsICJtMDIyIl0KKyAgICAgIF0sCisgICAgICBbCisgICAgICAgIFsibTEwMCIsICJtMTAxIiwgIm0xMDIiXSwKKyAgICAgICAgWyJtMTEwIiwgIm0xMTEiLCAibTExMiJdLAorICAgICAgICBbIm0xMjAiLCAibTEyMSIsICJtMTIyIl0KKyAgICAgIF0sCisgICAgICBbCisgICAgICAgIFsibTIwMCIsICJtMjAxIiwgIm0yMDIiXSwKKyAgICAgICAgWyJtMjEwIiwgIm0yMTEiLCAibTIxMiJdLAorICAgICAgICBbIm0yMjAiLCAibTIyMSIsICJtMjIyIl0KKyAgICAgIF0KKyAgICBdCiAgIH07CiB9CiAKLQogZnVuY3Rpb24gYXNzZXJ0VmFsdWVzKG9iaiwgYXNzZXJ0KSB7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X2ZpZWxkLnZhbHVlLCAnYScpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9saXN0X2ZpZWxkWzBdLnZhbHVlLCAnYicpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9saXN0X2ZpZWxkWzFdLnZhbHVlLCAnYycpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9zZXRfZmllbGRbMF0udmFsdWUsICdkJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X3NldF9maWVsZFsxXS52YWx1ZSwgJ2UnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbWFwX2ZpZWxkLkEudmFsdWUsICdmJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X21hcF9maWVsZC5CLnZhbHVlLCAnZycpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzBdLnZhbHVlLCAnaCcpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdLnZhbHVlLCAnaScpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQS52YWx1ZSwgJ2onKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMV0uREIudmFsdWUsICdrJyk7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9maWVsZC52YWx1ZSwgImEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X2xpc3RfZmllbGRbMF0udmFsdWUsICJiIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9saXN0X2ZpZWxkWzFdLnZhbHVlLCAiYyIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlLCAiZCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3Rfc2V0X2ZpZWxkWzFdLnZhbHVlLCAiZSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbWFwX2ZpZWxkLkEudmFsdWUsICJmIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSwgImciKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMF0udmFsdWUsICJoIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdLnZhbHVlLCAiaSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEudmFsdWUsICJqIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFsxXS5EQi52YWx1ZSwgImsiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdLCAibDAwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXSwgImwwMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMl0sICJsMDIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdLCAibDEwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXSwgImwxMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMl0sICJsMTIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdLCAibDIwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXSwgImwyMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMl0sICJsMjIiKTsKKworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVswXVswXSwgIm0wMDAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMF1bMV0sICJtMDAxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdWzJdLCAibTAwMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXVswXSwgIm0wMTAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMV1bMV0sICJtMDExIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzFdWzJdLCAibTAxMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXVswXSwgIm0wMjAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMl1bMV0sICJtMDIxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzJdWzJdLCAibTAyMiIpOworCisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdWzBdLCAibTEwMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXVsxXSwgIm0xMDEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMF1bMl0sICJtMTAyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdWzBdLCAibTExMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXVsxXSwgIm0xMTEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMV1bMl0sICJtMTEyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdWzBdLCAibTEyMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsyXVsxXSwgIm0xMjEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMl1bMl0sICJtMTIyIik7CisKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMF1bMF0sICJtMjAwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdWzFdLCAibTIwMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXVsyXSwgIm0yMDIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMV1bMF0sICJtMjEwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzFdWzFdLCAibTIxMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXVsyXSwgIm0yMTIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMl1bMF0sICJtMjIwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzJdWzFdLCAibTIyMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsyXVsyXSwgIm0yMjIiKTsKIH0KIAogZnVuY3Rpb24gY3JlYXRlVGVzdENhc2VzKHNlcmlhbGl6ZSwgZGVzZXJpYWxpemUpIHsKLQotICB2YXIgY2FzZXMgPSB7Ci0KLSAgICAiU2VyaWFsaXplL2Rlc2VyaWFsaXplIHNob3VsZCByZXR1cm4gZXF1YWwgb2JqZWN0IjogZnVuY3Rpb24oYXNzZXJ0KXsKLSAgICAgIHZhciB0T2JqID0gY3JlYXRlVGhyaWZ0T2JqKCk7Ci0gICAgICB2YXIgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIHR0eXBlcy5Db21wbGV4KTsKLSAgICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCwgJ25vdCB0aGUgc2FtZSBvYmplY3QnKTsKKyAgY29uc3QgY2FzZXMgPSB7CisgICAgIlNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgY29uc3QgdE9iaiA9IGNyZWF0ZVRocmlmdE9iaigpOworICAgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIHR0eXBlcy5Db21wbGV4KTsKKyAgICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCwgIm5vdCB0aGUgc2FtZSBvYmplY3QiKTsKICAgICAgIGFzc2VydC5kZWVwRXF1YWwodE9iaiwgcmVjZWl2ZWQpOwogICAgICAgYXNzZXJ0LmVuZCgpOwogICAgIH0sCiAKLSAgICAiTmVzdGVkIHN0cnVjdHMgYW5kIGNvbnRhaW5lcnMgaW5pdGlhbGl6ZWQgZnJvbSBwbGFpbiBqcyBvYmplY3RzIHNob3VsZCBzZXJpYWxpemUgc2FtZSBhcyBpZiBpbml0aWFsaXplZCBmcm9tIHRocmlmdCBvYmplY3RzIjogZnVuY3Rpb24oYXNzZXJ0KSB7Ci0gICAgICB2YXIgdE9iajEgPSBjcmVhdGVUaHJpZnRPYmooKTsKLSAgICAgIHZhciB0T2JqMiA9IG5ldyB0dHlwZXMuQ29tcGxleChjcmVhdGVKc09iaigpKTsKKyAgICAiTmVzdGVkIHN0cnVjdHMgYW5kIGNvbnRhaW5lcnMgaW5pdGlhbGl6ZWQgZnJvbSBwbGFpbiBqcyBvYmplY3RzIHNob3VsZCBzZXJpYWxpemUgc2FtZSBhcyBpZiBpbml0aWFsaXplZCBmcm9tIHRocmlmdCBvYmplY3RzIjogZnVuY3Rpb24oCisgICAgICBhc3NlcnQKKyAgICApIHsKKyAgICAgIGNvbnN0IHRPYmoxID0gY3JlYXRlVGhyaWZ0T2JqKCk7CisgICAgICBjb25zdCB0T2JqMiA9IG5ldyB0dHlwZXMuQ29tcGxleChjcmVhdGVKc09iaigpKTsKICAgICAgIGFzc2VydFZhbHVlcyh0T2JqMiwgYXNzZXJ0KTsKLSAgICAgIHZhciBzMSA9IHNlcmlhbGl6ZSh0T2JqMSk7Ci0gICAgICB2YXIgczIgPSBzZXJpYWxpemUodE9iajIpOworICAgICAgY29uc3QgczEgPSBzZXJpYWxpemUodE9iajEpOworICAgICAgY29uc3QgczIgPSBzZXJpYWxpemUodE9iajIpOwogICAgICAgYXNzZXJ0Lm9rKGJ1ZmZlckVxdWFscyhzMSwgczIpKTsKICAgICAgIGFzc2VydC5lbmQoKTsKICAgICB9LAogCi0gICAgIk1vZGlmaWNhdGlvbnMgdG8gYXJncyBvYmplY3Qgc2hvdWxkIG5vdCBhZmZlY3QgY29uc3RydWN0ZWQgVGhyaWZ0IG9iamVjdCI6IGZ1bmN0aW9uIChhc3NlcnQpIHsKLQotICAgICAgdmFyIGFyZ3MgPSBjcmVhdGVKc09iaigpOworICAgICJNb2RpZmljYXRpb25zIHRvIGFyZ3Mgb2JqZWN0IHNob3VsZCBub3QgYWZmZWN0IGNvbnN0cnVjdGVkIFRocmlmdCBvYmplY3QiOiBmdW5jdGlvbigKKyAgICAgIGFzc2VydAorICAgICkgeworICAgICAgY29uc3QgYXJncyA9IGNyZWF0ZUpzT2JqKCk7CiAgICAgICBhc3NlcnRWYWx1ZXMoYXJncywgYXNzZXJ0KTsKIAotICAgICAgdmFyIHRPYmogPSBuZXcgdHR5cGVzLkNvbXBsZXgoYXJncyk7CisgICAgICBjb25zdCB0T2JqID0gbmV3IHR0eXBlcy5Db21wbGV4KGFyZ3MpOwogICAgICAgYXNzZXJ0VmFsdWVzKHRPYmosIGFzc2VydCk7CiAKLSAgICAgIGFyZ3Muc3RydWN0X2ZpZWxkLnZhbHVlID0gJ1paWic7Ci0gICAgICBhcmdzLnN0cnVjdF9saXN0X2ZpZWxkWzBdLnZhbHVlID0gJ1paWic7Ci0gICAgICBhcmdzLnN0cnVjdF9saXN0X2ZpZWxkWzFdLnZhbHVlID0gJ1paWic7Ci0gICAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMF0udmFsdWUgPSAnWlpaJzsKLSAgICAgIGFyZ3Muc3RydWN0X3NldF9maWVsZFsxXS52YWx1ZSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3RfbWFwX2ZpZWxkLkEudmFsdWUgPSAnWlpaJzsKLSAgICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5CLnZhbHVlID0gJ1paWic7Ci0gICAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzBdID0gJ1paWic7Ci0gICAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdID0gJ1paWic7Ci0gICAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREIgPSAnWlpaJzsKKyAgICAgIGFyZ3Muc3RydWN0X2ZpZWxkLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9saXN0X2ZpZWxkWzBdLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9saXN0X2ZpZWxkWzFdLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMF0udmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X3NldF9maWVsZFsxXS52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbWFwX2ZpZWxkLkEudmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5CLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzBdID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREIgPSAiWlpaIjsKIAogICAgICAgYXNzZXJ0VmFsdWVzKHRPYmosIGFzc2VydCk7CiAgICAgICBhc3NlcnQuZW5kKCk7CiAgICAgfSwKIAogICAgICJudWxscyBhcmUgb2siOiBmdW5jdGlvbihhc3NlcnQpIHsKLSAgICAgIHZhciB0T2JqID0gbmV3IHR0eXBlcy5Db21wbGV4KHsKKyAgICAgIGNvbnN0IHRPYmogPSBuZXcgdHR5cGVzLkNvbXBsZXgoewogICAgICAgICBzdHJ1Y3RfZmllbGQ6IG51bGwsCiAgICAgICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBudWxsLAogICAgICAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBudWxsLApAQCAtMjEyLDcgKzI5OCw3IEBACiAgICAgICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDogbnVsbCwKICAgICAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogbnVsbAogICAgICAgfSk7Ci0gICAgICB2YXIgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIHR0eXBlcy5Db21wbGV4KTsKKyAgICAgIGNvbnN0IHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCB0dHlwZXMuQ29tcGxleCk7CiAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodE9iai5zdHJ1Y3RfZmllbGQsIG51bGwpOwogICAgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKICAgICAgIGFzc2VydC5kZWVwRXF1YWwodE9iaiwgcmVjZWl2ZWQpOwpAQCAtMjIwLDExICszMDYsMTEgQEAKICAgICB9LAogCiAgICAgIkNhbiBtYWtlIGxpc3Qgd2l0aCBvYmplY3RzIjogZnVuY3Rpb24oYXNzZXJ0KSB7Ci0gICAgICB2YXIgdE9iaiA9IG5ldyB0dHlwZXMuQ29tcGxleExpc3QoewotCSAgICAgICJzdHJ1Y3RfbGlzdF9maWVsZCI6IFtuZXcgdHR5cGVzLkNvbXBsZXgoe30pXQorICAgICAgY29uc3QgdE9iaiA9IG5ldyB0dHlwZXMuQ29tcGxleExpc3QoeworICAgICAgICBzdHJ1Y3RfbGlzdF9maWVsZDogW25ldyB0dHlwZXMuQ29tcGxleCh7fSldCiAgICAgICB9KTsKLSAgICAgIHZhciBpbm5lck9iaiA9IHRPYmouc3RydWN0X2xpc3RfZmllbGRbMF07Ci0gICAgICBhc3NlcnQub2soaW5uZXJPYmogaW5zdGFuY2VvZiB0dHlwZXMuQ29tcGxleCkKKyAgICAgIGNvbnN0IGlubmVyT2JqID0gdE9iai5zdHJ1Y3RfbGlzdF9maWVsZFswXTsKKyAgICAgIGFzc2VydC5vayhpbm5lck9iaiBpbnN0YW5jZW9mIHR0eXBlcy5Db21wbGV4KTsKICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3RfZmllbGQsIG51bGwpOwogICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlubmVyT2JqLnN0cnVjdF9saXN0X2ZpZWxkLCBudWxsKTsKICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3Rfc2V0X2ZpZWxkLCBudWxsKTsKQEAgLTIzMywxNyArMzE5LDE1IEBACiAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMiwgbnVsbCk7CiAgICAgICBhc3NlcnQuZW5kKCk7CiAgICAgfQotCiAgIH07CiAgIHJldHVybiBjYXNlczsKIH0KIAotCi1mdW5jdGlvbiBydW4obmFtZSwgY2FzZXMpeworZnVuY3Rpb24gcnVuKG5hbWUsIGNhc2VzKSB7CiAgIE9iamVjdC5rZXlzKGNhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uKGNhc2VOYW1lKSB7Ci0gICAgdGVzdChuYW1lICsgJzogJyArIGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOworICAgIHRlc3QobmFtZSArICI6ICIgKyBjYXNlTmFtZSwgY2FzZXNbY2FzZU5hbWVdKTsKICAgfSk7CiB9CiAKLXJ1bignYmluYXJ5JywgY3JlYXRlVGVzdENhc2VzKHNlcmlhbGl6ZUJpbmFyeSwgZGVzZXJpYWxpemVCaW5hcnkpKTsKLXJ1bignanNvbicsIGNyZWF0ZVRlc3RDYXNlcyhzZXJpYWxpemVKU09OLCBkZXNlcmlhbGl6ZUpTT04pKTsKK3J1bigiYmluYXJ5IiwgY3JlYXRlVGVzdENhc2VzKHNlcmlhbGl6ZUJpbmFyeSwgZGVzZXJpYWxpemVCaW5hcnkpKTsKK3J1bigianNvbiIsIGNyZWF0ZVRlc3RDYXNlcyhzZXJpYWxpemVKU09OLCBkZXNlcmlhbGl6ZUpTT04pKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9leGNlcHRpb25zLmpzIGIvbGliL25vZGVqcy90ZXN0L2V4Y2VwdGlvbnMuanMKaW5kZXggYzZmMmU0ZC4uYWIyNzk4YSAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy90ZXN0L2V4Y2VwdGlvbnMuanMKKysrIGIvbGliL25vZGVqcy90ZXN0L2V4Y2VwdGlvbnMuanMKQEAgLTEsNTUgKzEsMTQ2IEBACi0ndXNlIHN0cmljdCc7Ci12YXIgdGVzdCA9IHJlcXVpcmUoJ3RhcGUnKTsKLXZhciB0aHJpZnQgPSByZXF1aXJlKCcuLi9saWIvdGhyaWZ0L3RocmlmdC5qcycpOwotdmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4uL2xpYi90aHJpZnQvaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiAKLXRlc3QoJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7Ci0gIHZhciBlID0gbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oMSwgJ2ZvbycpOwotICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24sICdpcyBpbnN0YW5jZW9mIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOwotICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIHRocmlmdC5URXhjZXB0aW9uLCAnaXMgaW5zdGFuY2VvZiBURXhjZXB0aW9uJyk7Ci0gIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICdpcyBpbnN0YW5jZW9mIEVycm9yJyk7Ci0gIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgJ3N0cmluZycsICdoYXMgc3RhY2sgdHJhY2UnKTsKLSAgYXNzZXJ0Lm9rKC9eVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBmb28vLnRlc3QoZS5zdGFjayksICdTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlJyk7Ci0gIGFzc2VydC5vayhlLnN0YWNrLmluZGV4T2YoJ3Rlc3QvZXhjZXB0aW9ucy5qczo3OjExJykgIT09IC0xLCAnc3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uJyk7Ci0gIGFzc2VydC5lcXVhbChlLm5hbWUsICdUQXBwbGljYXRpb25FeGNlcHRpb24nLCAnaGFzIGZ1bmN0aW9uIG5hbWUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7Ci0gIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdmb28nLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKLSAgYXNzZXJ0LmVxdWFsKGUudHlwZSwgMSwgJ2hhcyB0eXBlIDEnKTsKKyJ1c2Ugc3RyaWN0IjsKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCIuLi9saWIvdGhyaWZ0L3RocmlmdC5qcyIpOworY29uc3QgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgiLi4vbGliL3RocmlmdC9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3IiKTsKKwordGVzdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgZnVuY3Rpb24gdChhc3NlcnQpIHsKKyAgY29uc3QgZSA9IG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKDEsICJmb28iKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUgaW5zdGFuY2VvZiB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLAorICAgICJpcyBpbnN0YW5jZW9mIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVEV4Y2VwdGlvbiwgImlzIGluc3RhbmNlb2YgVEV4Y2VwdGlvbiIpOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogZm9vLy50ZXN0KGUuc3RhY2spLAorICAgICJTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIgorICApOworICBhc3NlcnQub2soCisgICAgZS5zdGFjay5pbmRleE9mKCJ0ZXN0L2V4Y2VwdGlvbnMuanM6NzoxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoCisgICAgZS5uYW1lLAorICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24iLAorICAgICJoYXMgZnVuY3Rpb24gbmFtZSBUQXBwbGljYXRpb25FeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICJmb28iLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKKyAgYXNzZXJ0LmVxdWFsKGUudHlwZSwgMSwgImhhcyB0eXBlIDEiKTsKICAgYXNzZXJ0LmVuZCgpOwogfSk7CiAKLXRlc3QoJ1RFeGNlcHRpb24nLCBmdW5jdGlvbiB0KGFzc2VydCkgewotICB2YXIgZSA9IG5ldyB0aHJpZnQuVEV4Y2VwdGlvbignZm9vJyk7Ci0gIGFzc2VydC5vayhlIGluc3RhbmNlb2YgdGhyaWZ0LlRFeGNlcHRpb24sICdpcyBpbnN0YW5jZW9mIFRFeGNlcHRpb24nKTsKLSAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgJ2lzIGluc3RhbmNlb2YgRXJyb3InKTsKLSAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAnc3RyaW5nJywgJ2hhcyBzdGFjayB0cmFjZScpOwotICBhc3NlcnQub2soL15URXhjZXB0aW9uOiBmb28vLnRlc3QoZS5zdGFjayksICdTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlJyk7Ci0gIGFzc2VydC5vayhlLnN0YWNrLmluZGV4T2YoJ3Rlc3QvZXhjZXB0aW9ucy5qczoyMToxMScpICE9PSAtMSwgJ3N0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbicpOwotICBhc3NlcnQuZXF1YWwoZS5uYW1lLCAnVEV4Y2VwdGlvbicsICdoYXMgZnVuY3Rpb24gbmFtZSBURXhjZXB0aW9uJyk7Ci0gIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdmb28nLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKK3Rlc3QoInVuZXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigxLCAxMDApOworICBhc3NlcnQub2soCisgICAgZSBpbnN0YW5jZW9mIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24sCisgICAgImlzIGluc3RhbmNlb2YgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgorICApOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIHRocmlmdC5URXhjZXB0aW9uLCAiaXMgaW5zdGFuY2VvZiBURXhjZXB0aW9uIik7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICJpcyBpbnN0YW5jZW9mIEVycm9yIik7CisgIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgInN0cmluZyIsICJoYXMgc3RhY2sgdHJhY2UiKTsKKyAgYXNzZXJ0Lm9rKAorICAgIC9eVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiAxMDAvLnRlc3QoZS5zdGFjayksCisgICAgIlN0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UiCisgICk7CisgIGFzc2VydC5vaygKKyAgICBlLnN0YWNrLmluZGV4T2YoInRlc3QvZXhjZXB0aW9ucy5qczo3OjExIikgIT09IC0xLAorICAgICJzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4iCisgICk7CisgIGFzc2VydC5lcXVhbCgKKyAgICBlLm5hbWUsCisgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsCisgICAgImhhcyBmdW5jdGlvbiBuYW1lIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgMTAwLCAiaGFzIGVycm9yIG1lc3NhZ2UgMTAwIik7CisgIGFzc2VydC5lcXVhbChlLnR5cGUsIDEsICJoYXMgdHlwZSAxIik7CiAgIGFzc2VydC5lbmQoKTsKIH0pOwogCi10ZXN0KCdUUHJvdG9jb2xFeGNlcHRpb24nLCBmdW5jdGlvbiB0KGFzc2VydCkgewotICB2YXIgZSA9IG5ldyB0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKDEsICdmb28nKTsKLSAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uLCAnaXMgaW5zdGFuY2VvZiBUUHJvdG9jb2xFeGNlcHRpb24nKTsKLSAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgJ2lzIGluc3RhbmNlb2YgRXJyb3InKTsKLSAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAnc3RyaW5nJywgJ2hhcyBzdGFjayB0cmFjZScpOwotICBhc3NlcnQub2soL15UUHJvdG9jb2xFeGNlcHRpb246IGZvby8udGVzdChlLnN0YWNrKSwgJ1N0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UnKTsKLSAgYXNzZXJ0Lm9rKGUuc3RhY2suaW5kZXhPZigndGVzdC9leGNlcHRpb25zLmpzOjMzOjExJykgIT09IC0xLCAnc3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uJyk7Ci0gIGFzc2VydC5lcXVhbChlLm5hbWUsICdUUHJvdG9jb2xFeGNlcHRpb24nLCAnaGFzIGZ1bmN0aW9uIG5hbWUgVFByb3RvY29sRXhjZXB0aW9uJyk7Ci0gIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdmb28nLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKLSAgYXNzZXJ0LmVxdWFsKGUudHlwZSwgMSwgJ2hhcyB0eXBlIDEnKTsKK3Rlc3QoIlRFeGNlcHRpb24iLCBmdW5jdGlvbiB0KGFzc2VydCkgeworICBjb25zdCBlID0gbmV3IHRocmlmdC5URXhjZXB0aW9uKCJmb28iKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVEV4Y2VwdGlvbiwgImlzIGluc3RhbmNlb2YgVEV4Y2VwdGlvbiIpOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXlRFeGNlcHRpb246IGZvby8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjIxOjExIikgIT09IC0xLAorICAgICJzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4iCisgICk7CisgIGFzc2VydC5lcXVhbChlLm5hbWUsICJURXhjZXB0aW9uIiwgImhhcyBmdW5jdGlvbiBuYW1lIFRFeGNlcHRpb24iKTsKKyAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgImZvbyIsICdoYXMgZXJyb3IgbWVzc2FnZSAiZm9vIicpOwogICBhc3NlcnQuZW5kKCk7CiB9KTsKIAotdGVzdCgnSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yJywgZnVuY3Rpb24gdChhc3NlcnQpIHsKLSAgdmFyIGUgPSBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCdmb28nKTsKLSAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IsICdpcyBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcicpOwotICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAnaXMgaW5zdGFuY2VvZiBFcnJvcicpOwotICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICdzdHJpbmcnLCAnaGFzIHN0YWNrIHRyYWNlJyk7Ci0gIGFzc2VydC5vaygvXklucHV0QnVmZmVyVW5kZXJydW5FcnJvcjogZm9vLy50ZXN0KGUuc3RhY2spLCAnU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZScpOwotICBhc3NlcnQub2soZS5zdGFjay5pbmRleE9mKCd0ZXN0L2V4Y2VwdGlvbnMuanM6NDY6MTEnKSAhPT0gLTEsICdzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4nKTsKLSAgYXNzZXJ0LmVxdWFsKGUubmFtZSwgJ0lucHV0QnVmZmVyVW5kZXJydW5FcnJvcicsICdoYXMgZnVuY3Rpb24gbmFtZSBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3InKTsKLSAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgJ2ZvbycsICdoYXMgZXJyb3IgbWVzc2FnZSAiZm9vIicpOwordGVzdCgiVFByb3RvY29sRXhjZXB0aW9uIiwgZnVuY3Rpb24gdChhc3NlcnQpIHsKKyAgY29uc3QgZSA9IG5ldyB0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKDEsICJmb28iKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUgaW5zdGFuY2VvZiB0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uLAorICAgICJpcyBpbnN0YW5jZW9mIFRQcm90b2NvbEV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15UUHJvdG9jb2xFeGNlcHRpb246IGZvby8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjMzOjExIikgIT09IC0xLAorICAgICJzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4iCisgICk7CisgIGFzc2VydC5lcXVhbCgKKyAgICBlLm5hbWUsCisgICAgIlRQcm90b2NvbEV4Y2VwdGlvbiIsCisgICAgImhhcyBmdW5jdGlvbiBuYW1lIFRQcm90b2NvbEV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgImZvbyIsICdoYXMgZXJyb3IgbWVzc2FnZSAiZm9vIicpOworICBhc3NlcnQuZXF1YWwoZS50eXBlLCAxLCAiaGFzIHR5cGUgMSIpOworICBhc3NlcnQuZW5kKCk7Cit9KTsKKwordGVzdCgiSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIiwgZnVuY3Rpb24gdChhc3NlcnQpIHsKKyAgY29uc3QgZSA9IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoImZvbyIpOworICBhc3NlcnQub2soCisgICAgZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciwKKyAgICAiaXMgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IiCisgICk7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICJpcyBpbnN0YW5jZW9mIEVycm9yIik7CisgIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgInN0cmluZyIsICJoYXMgc3RhY2sgdHJhY2UiKTsKKyAgYXNzZXJ0Lm9rKAorICAgIC9eSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yOiBmb28vLnRlc3QoZS5zdGFjayksCisgICAgIlN0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UiCisgICk7CisgIGFzc2VydC5vaygKKyAgICBlLnN0YWNrLmluZGV4T2YoInRlc3QvZXhjZXB0aW9ucy5qczo0NjoxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoCisgICAgZS5uYW1lLAorICAgICJJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IiLAorICAgICJoYXMgZnVuY3Rpb24gbmFtZSBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IiCisgICk7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICJmb28iLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKICAgYXNzZXJ0LmVuZCgpOwogfSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvaGVhZGVyLnRlc3QuanMgYi9saWIvbm9kZWpzL3Rlc3QvaGVhZGVyLnRlc3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZkN2Y4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC9oZWFkZXIudGVzdC5qcwpAQCAtMCwwICsxLDc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NvbnN0IFRGcmFtZWRUcmFuc3BvcnQgPSByZXF1aXJlKCIuLi9saWIvdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnQiKTsKK2NvbnN0IFRIZWFkZXJUcmFuc3BvcnQgPSByZXF1aXJlKCIuLi9saWIvdGhyaWZ0L2hlYWRlcl90cmFuc3BvcnQiKTsKK2NvbnN0IFRIZWFkZXJQcm90b2NvbCA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQvaGVhZGVyX3Byb3RvY29sIik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCIuLi9saWIvdGhyaWZ0Iik7Citjb25zdCBmcyA9IHJlcXVpcmUoImZzIik7Citjb25zdCB0ZXN0ID0gcmVxdWlyZSgidGFwZSIpOworY29uc3QgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKKworY29uc3QgaGVhZGVyUGF5bG9hZCA9IGZzLnJlYWRGaWxlU3luYygKKyAgcGF0aC5qb2luKF9fZGlybmFtZSwgInRlc3RfaGVhZGVyX3BheWxvYWQiKQorKTsKKworY29uc3QgY2FzZXMgPSB7CisgICJTaG91bGQgcmVhZCBoZWFkZXJzIGZyb20gcGF5bG9hZCI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KCk7CisgICAgdHJhbnNwb3J0LmluQnVmID0gQnVmZmVyLmZyb20oaGVhZGVyUGF5bG9hZCk7CisKKyAgICBjb25zdCBoZWFkZXJzID0gdHJhbnNwb3J0LnJlYWRIZWFkZXJzKCk7CisgICAgYXNzZXJ0LmVxdWFscyhoZWFkZXJzLlBhcmVudCwgInNob29iYXIiKTsKKyAgICBhc3NlcnQuZXF1YWxzKGhlYWRlcnMuVHJhY2UsICJhYmNkZSIpOworICAgIGFzc2VydC5lbmQoKTsKKyAgfSwKKyAgIlNob3VsZCByZWFkIGhlYWRlcnMgd2hlbiByZWFkaW5nIG1lc3NhZ2UgYmVnaW4iOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCgpOworICAgIHRyYW5zcG9ydC5pbkJ1ZiA9IEJ1ZmZlci5mcm9tKGhlYWRlclBheWxvYWQpOworICAgIGNvbnN0IHByb3RvY29sID0gbmV3IFRIZWFkZXJQcm90b2NvbCh0cmFuc3BvcnQpOworICAgIGNvbnN0IHJlc3VsdCA9IHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKworICAgIGNvbnN0IGhlYWRlcnMgPSB0cmFuc3BvcnQuZ2V0UmVhZEhlYWRlcnMoKTsKKyAgICBhc3NlcnQuZXF1YWxzKGhlYWRlcnMuUGFyZW50LCAic2hvb2JhciIpOworICAgIGFzc2VydC5lcXVhbHMoaGVhZGVycy5UcmFjZSwgImFiY2RlIik7CisgICAgYXNzZXJ0LmVxdWFscyhyZXN1bHQuZm5hbWUsICJhZGQiKTsKKyAgICBhc3NlcnQuZXF1YWxzKHJlc3VsdC5tdHlwZSwgdGhyaWZ0LlRocmlmdC5NZXNzYWdlVHlwZS5DQUxMKTsKKyAgICBhc3NlcnQuZW5kKCk7CisgIH0sCisgICJTaG91bGQgYmUgYWJsZSB0byB3cml0ZSBoZWFkZXJzIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3Qgd3JpdGVUcmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCgpOworICAgIHdyaXRlVHJhbnNwb3J0LnNldFByb3RvY29sSWQoVEhlYWRlclRyYW5zcG9ydC5TdWJwcm90b2NvbElkLkJJTkFSWSk7CisgICAgd3JpdGVUcmFuc3BvcnQuc2V0V3JpdGVIZWFkZXIoIkhpaGloaWhpIiwgImhvaG9ob2hvIik7CisgICAgd3JpdGVUcmFuc3BvcnQuc2V0V3JpdGVIZWFkZXIoImJvb2Jvb2JvbyIsICJmb29zaG9vcG9vIik7CisgICAgd3JpdGVUcmFuc3BvcnQuc2V0V3JpdGVIZWFkZXIoImEiLCAieiIpOworICAgIHdyaXRlVHJhbnNwb3J0LndyaXRlSGVhZGVycygpOworICAgIGNvbnN0IHdyaXRlQnVmZmVyID0gd3JpdGVUcmFuc3BvcnQub3V0QnVmZmVyc1swXTsKKworICAgIGNvbnN0IHJlYWRUcmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCgpOworICAgIHJlYWRUcmFuc3BvcnQuaW5CdWYgPSB3cml0ZUJ1ZmZlcjsKKyAgICByZWFkVHJhbnNwb3J0LnJlYWRIZWFkZXJzKCk7CisKKyAgICBjb25zdCBoZWFkZXJzID0gcmVhZFRyYW5zcG9ydC5nZXRSZWFkSGVhZGVycygpOworICAgIGFzc2VydC5lcXVhbHMoaGVhZGVycy5IaWhpaGloaSwgImhvaG9ob2hvIik7CisgICAgYXNzZXJ0LmVxdWFscyhoZWFkZXJzLmJvb2Jvb2JvbywgImZvb3Nob29wb28iKTsKKyAgICBhc3NlcnQuZXF1YWxzKGhlYWRlcnMuYSwgInoiKTsKKyAgICBhc3NlcnQuZW5kKCk7CisgIH0KK307CisKK09iamVjdC5rZXlzKGNhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uKGNhc2VOYW1lKSB7CisgIHRlc3QoY2FzZU5hbWUsIGNhc2VzW2Nhc2VOYW1lXSk7Cit9KTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9oZWxwZXJzLmpzIGIvbGliL25vZGVqcy90ZXN0L2hlbHBlcnMuanMKaW5kZXggYzg1MGM0Ni4uZjNjMjdiMyAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy90ZXN0L2hlbHBlcnMuanMKKysrIGIvbGliL25vZGVqcy90ZXN0L2hlbHBlcnMuanMKQEAgLTEsMTMgKzEsMzggQEAKLSd1c2Ugc3RyaWN0JzsKLXZhciB0aHJpZnQgPSByZXF1aXJlKCcuLi9saWIvdGhyaWZ0Jyk7CisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyJ1c2Ugc3RyaWN0IjsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQiKTsKIAogbW9kdWxlLmV4cG9ydHMudHJhbnNwb3J0cyA9IHsKLSAgJ2J1ZmZlcmVkJzogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKLSAgJ2ZyYW1lZCc6IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0CisgIGJ1ZmZlcmVkOiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICBmcmFtZWQ6IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0CiB9OwogCiBtb2R1bGUuZXhwb3J0cy5wcm90b2NvbHMgPSB7Ci0gICdqc29uJzogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCi0gICdiaW5hcnknOiB0aHJpZnQuVEJpbmFyeVByb3RvY29sLAotICAnY29tcGFjdCc6IHRocmlmdC5UQ29tcGFjdFByb3RvY29sCisgIGpzb246IHRocmlmdC5USlNPTlByb3RvY29sLAorICBiaW5hcnk6IHRocmlmdC5UQmluYXJ5UHJvdG9jb2wsCisgIGNvbXBhY3Q6IHRocmlmdC5UQ29tcGFjdFByb3RvY29sLAorICBoZWFkZXI6IHRocmlmdC5USGVhZGVyUHJvdG9jb2wKIH07CisKK21vZHVsZS5leHBvcnRzLmVjbWFNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCItLWVzNiIpID8gImVzNiIgOiAiZXM1IjsKK21vZHVsZS5leHBvcnRzLmdlblBhdGggPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoIi0tZXM2IikKKyAgPyAiZ2VuLW5vZGVqcy1lczYiCisgIDogImdlbi1ub2RlanMiOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2ludDY0LnRlc3QuanMgYi9saWIvbm9kZWpzL3Rlc3QvaW50NjQudGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FkMjhjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L2ludDY0LnRlc3QuanMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjb25zdCBJbnQ2NCA9IHJlcXVpcmUoIm5vZGUtaW50NjQiKTsKK2NvbnN0IEpTT05JbnQ2NCA9IHJlcXVpcmUoImpzb24taW50NjQiKTsKK2NvbnN0IGk2NHR5cGVzID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzLWVzNi9JbnQ2NFRlc3RfdHlwZXMuanMiKTsKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7CisKK2NvbnN0IGNhc2VzID0geworICAic2hvdWxkIGNvcnJlY3RseSBnZW5lcmF0ZSBJbnQ2NCBjb25zdGFudHMiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBFWFBFQ1RFRF9TTUFMTF9JTlQ2NF9BU19OVU1CRVIgPSA0MjsKKyAgICBjb25zdCBFWFBFQ1RFRF9TTUFMTF9JTlQ2NCA9IG5ldyBJbnQ2NCg0Mik7CisgICAgY29uc3QgRVhQRUNURURfTUFYX0pTX1NBRkVfSU5UNjQgPSBuZXcgSW50NjQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpOworICAgIGNvbnN0IEVYUEVDVEVEX01JTl9KU19TQUZFX0lOVDY0ID0gbmV3IEludDY0KE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKTsKKyAgICBjb25zdCBFWFBFQ1RFRF9NQVhfSlNfU0FGRV9QTFVTX09ORV9JTlQ2NCA9IG5ldyBJbnQ2NCgiMDAyMDAwMDAwMDAwMDAwMCIpOyAvLyBoZXgtZW5jb2RlZAorICAgIGNvbnN0IEVYUEVDVEVEX01JTl9KU19TQUZFX01JTlVTX09ORV9JTlQ2NCA9IG5ldyBJbnQ2NCgiZmZlMDAwMDAwMDAwMDAwMCIpOyAvLyBoZXgtZW5jb2RlZCAyJ3MgY29tcGxlbWVudAorICAgIGNvbnN0IEVYUEVDVEVEX01BWF9TSUdORURfSU5UNjQgPSBuZXcgSW50NjQoIjdmZmZmZmZmZmZmZmZmZmYiKTsgLy8gaGV4LWVuY29kZWQKKyAgICBjb25zdCBFWFBFQ1RFRF9NSU5fU0lHTkVEX0lOVDY0ID0gbmV3IEludDY0KCI4MDAwMDAwMDAwMDAwMDAwIik7IC8vIGhleC1lbmNvZGVkIDIncyBjb21wbGVtZW50CisgICAgY29uc3QgRVhQRUNURURfSU5UNjRfTElTVCA9IFsKKyAgICAgIEVYUEVDVEVEX1NNQUxMX0lOVDY0LAorICAgICAgRVhQRUNURURfTUFYX0pTX1NBRkVfSU5UNjQsCisgICAgICBFWFBFQ1RFRF9NSU5fSlNfU0FGRV9JTlQ2NCwKKyAgICAgIEVYUEVDVEVEX01BWF9KU19TQUZFX1BMVVNfT05FX0lOVDY0LAorICAgICAgRVhQRUNURURfTUlOX0pTX1NBRkVfTUlOVVNfT05FX0lOVDY0LAorICAgICAgRVhQRUNURURfTUFYX1NJR05FRF9JTlQ2NCwKKyAgICAgIEVYUEVDVEVEX01JTl9TSUdORURfSU5UNjQKKyAgICBdOworCisgICAgYXNzZXJ0Lm9rKEVYUEVDVEVEX1NNQUxMX0lOVDY0LmVxdWFscyhpNjR0eXBlcy5TTUFMTF9JTlQ2NCkpOworICAgIGFzc2VydC5vayhFWFBFQ1RFRF9NQVhfSlNfU0FGRV9JTlQ2NC5lcXVhbHMoaTY0dHlwZXMuTUFYX0pTX1NBRkVfSU5UNjQpKTsKKyAgICBhc3NlcnQub2soRVhQRUNURURfTUlOX0pTX1NBRkVfSU5UNjQuZXF1YWxzKGk2NHR5cGVzLk1JTl9KU19TQUZFX0lOVDY0KSk7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgRVhQRUNURURfTUFYX0pTX1NBRkVfUExVU19PTkVfSU5UNjQuZXF1YWxzKAorICAgICAgICBpNjR0eXBlcy5NQVhfSlNfU0FGRV9QTFVTX09ORV9JTlQ2NAorICAgICAgKQorICAgICk7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgRVhQRUNURURfTUlOX0pTX1NBRkVfTUlOVVNfT05FX0lOVDY0LmVxdWFscygKKyAgICAgICAgaTY0dHlwZXMuTUlOX0pTX1NBRkVfTUlOVVNfT05FX0lOVDY0CisgICAgICApCisgICAgKTsKKyAgICBhc3NlcnQub2soRVhQRUNURURfTUFYX1NJR05FRF9JTlQ2NC5lcXVhbHMoaTY0dHlwZXMuTUFYX1NJR05FRF9JTlQ2NCkpOworICAgIGFzc2VydC5vayhFWFBFQ1RFRF9NSU5fU0lHTkVEX0lOVDY0LmVxdWFscyhpNjR0eXBlcy5NSU5fU0lHTkVEX0lOVDY0KSk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgRVhQRUNURURfU01BTExfSU5UNjRfQVNfTlVNQkVSLAorICAgICAgaTY0dHlwZXMuU01BTExfSU5UNjQudG9OdW1iZXIoKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsCisgICAgICBpNjR0eXBlcy5NQVhfSlNfU0FGRV9JTlQ2NC50b051bWJlcigpCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiwKKyAgICAgIGk2NHR5cGVzLk1JTl9KU19TQUZFX0lOVDY0LnRvTnVtYmVyKCkKKyAgICApOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9JTlQ2NF9MSVNULmxlbmd0aDsgKytpKSB7CisgICAgICBhc3NlcnQub2soRVhQRUNURURfSU5UNjRfTElTVFtpXS5lcXVhbHMoaTY0dHlwZXMuSU5UNjRfTElTVFtpXSkpOworICAgIH0KKworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRVhQRUNURURfSU5UNjRfTElTVC5sZW5ndGg7ICsraSkgeworICAgICAgY29uc3QgaW50NjRPYmplY3QgPSBFWFBFQ1RFRF9JTlQ2NF9MSVNUW2ldOworICAgICAgYXNzZXJ0Lm9rKAorICAgICAgICBpNjR0eXBlcy5JTlQ2NF8yX0lOVDY0X01BUFsKKyAgICAgICAgICBKU09OSW50NjQudG9EZWNpbWFsU3RyaW5nKGludDY0T2JqZWN0KQorICAgICAgICBdLmVxdWFscyhpbnQ2NE9iamVjdCkKKyAgICAgICk7CisgICAgfQorCisgICAgYXNzZXJ0LmVuZCgpOworICB9Cit9OworCitPYmplY3Qua2V5cyhjYXNlcykuZm9yRWFjaChmdW5jdGlvbihjYXNlTmFtZSkgeworICB0ZXN0KGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOworfSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmpzIGIvbGliL25vZGVqcy90ZXN0L3NlcnZlci5qcwppbmRleCA2ZTVjZGZhLi43NDAyMDk0IDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmpzCisrKyBiL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIuanMKQEAgLTE5LDgzICsxOSwxMTkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7Ci12YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTsKLXZhciB0aHJpZnQgPSByZXF1aXJlKCcuLi9saWIvdGhyaWZ0Jyk7Ci12YXIgcHJvZ3JhbSA9IHJlcXVpcmUoJ2NvbW1hbmRlcicpOwotdmFyIGhlbHBlcnMgPSByZXF1aXJlKCcuL2hlbHBlcnMnKTsKLQotdmFyIFRocmlmdFRlc3QgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdCcpOwotdmFyIFNlY29uZFNlcnZpY2UgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvU2Vjb25kU2VydmljZScpOwotdmFyIFRocmlmdFRlc3RIYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKS5Bc3luY1RocmlmdFRlc3RIYW5kbGVyOwotdmFyIFRocmlmdFRlc3RIYW5kbGVyUHJvbWlzZSA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuU3luY1RocmlmdFRlc3RIYW5kbGVyOwotdmFyIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzJyk7Citjb25zdCBmcyA9IHJlcXVpcmUoImZzIik7Citjb25zdCBwYXRoID0gcmVxdWlyZSgicGF0aCIpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgiLi4vbGliL3RocmlmdCIpOworY29uc3QgcHJvZ3JhbSA9IHJlcXVpcmUoImNvbW1hbmRlciIpOworY29uc3QgaGVscGVycyA9IHJlcXVpcmUoIi4vaGVscGVycyIpOwogCiBwcm9ncmFtCi0gIC5vcHRpb24oJy1wLCAtLXByb3RvY29sIDxwcm90b2NvbD4nLCAnU2V0IHRocmlmdCBwcm90b2NvbCAoYmluYXJ5fGpzb258Y29tcGFjdCknLCAnYmluYXJ5JykKLSAgLm9wdGlvbignLXQsIC0tdHJhbnNwb3J0IDx0cmFuc3BvcnQ+JywgJ1NldCB0aHJpZnQgdHJhbnNwb3J0IChidWZmZXJlZHxmcmFtZWQpJywgJ2J1ZmZlcmVkJykKLSAgLm9wdGlvbignLS1zc2wnLCAndXNlIHNzbCB0cmFuc3BvcnQnKQotICAub3B0aW9uKCctLXBvcnQgPHBvcnQ+JywgJ1NldCB0aHJpZnQgc2VydmVyIHBvcnQnLCA5MDkwKQotICAub3B0aW9uKCctLXByb21pc2UnLCAndGVzdCB3aXRoIHByb21pc2Ugc3R5bGUgZnVuY3Rpb25zJykKLSAgLm9wdGlvbignLXQsIC0tdHlwZSA8dHlwZT4nLCAnU2VsZWN0IHNlcnZlciB0eXBlICh0Y3B8bXVsdGlwbGV4fGh0dHApJywgJ3RjcCcpCisgIC5vcHRpb24oCisgICAgIi1wLCAtLXByb3RvY29sIDxwcm90b2NvbD4iLAorICAgICJTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnl8Y29tcGFjdHxqc29uKSIsCisgICAgImJpbmFyeSIKKyAgKQorICAub3B0aW9uKAorICAgICItdCwgLS10cmFuc3BvcnQgPHRyYW5zcG9ydD4iLAorICAgICJTZXQgdGhyaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkfGh0dHApIiwKKyAgICAiYnVmZmVyZWQiCisgICkKKyAgLm9wdGlvbigiLS1zc2wiLCAidXNlIHNzbCB0cmFuc3BvcnQiKQorICAub3B0aW9uKCItLXBvcnQgPHBvcnQ+IiwgIlNldCB0aHJpZnQgc2VydmVyIHBvcnQiLCA5MDkwKQorICAub3B0aW9uKCItLWRvbWFpbi1zb2NrZXQgPHBhdGg+IiwgIlNldCB0aGlmdCBzZXJ2ZXIgdW5peCBkb21haW4gc29ja2V0IikKKyAgLm9wdGlvbigKKyAgICAiLXQsIC0tdHlwZSA8dHlwZT4iLAorICAgICJTZWxlY3Qgc2VydmVyIHR5cGUgKGh0dHB8bXVsdGlwbGV4fHRjcHx3ZWJzb2NrZXQpIiwKKyAgICAidGNwIgorICApCisgIC5vcHRpb24oIi0tY2FsbGJhY2siLCAidGVzdCB3aXRoIGNhbGxiYWNrIHN0eWxlIGZ1bmN0aW9ucyIpCisgIC5vcHRpb24oIi0tZXM2IiwgIlVzZSBlczYgY29kZSIpCisgIC5vcHRpb24oIi0tZXM1IiwgIlVzZSBlczUgY29kZSIpCiAgIC5wYXJzZShwcm9jZXNzLmFyZ3YpOwogCi12YXIgcG9ydCA9IHByb2dyYW0ucG9ydDsKLXZhciB0eXBlID0gcHJvZ3JhbS50eXBlOwotdmFyIHNzbCA9IHByb2dyYW0uc3NsOwotdmFyIHByb21pc2UgPSBwcm9ncmFtLnByb21pc2U7Citjb25zdCBUaHJpZnRUZXN0ID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vVGhyaWZ0VGVzdGApOworY29uc3QgU2Vjb25kU2VydmljZSA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1NlY29uZFNlcnZpY2VgKTsKK2NvbnN0IHsgVGhyaWZ0VGVzdEhhbmRsZXIgfSA9IHJlcXVpcmUoIi4vdGVzdF9oYW5kbGVyIik7CiAKLXZhciBoYW5kbGVyID0gcHJvZ3JhbS5wcm9taXNlID8gVGhyaWZ0VGVzdEhhbmRsZXIgOiBUaHJpZnRUZXN0SGFuZGxlclByb21pc2U7Citjb25zdCBwb3J0ID0gcHJvZ3JhbS5wb3J0OworY29uc3QgZG9tYWluU29ja2V0ID0gcHJvZ3JhbS5kb21haW5Tb2NrZXQ7Citjb25zdCBzc2wgPSBwcm9ncmFtLnNzbDsKIAotdmFyIG9wdGlvbnMgPSB7CitsZXQgdHlwZSA9IHByb2dyYW0udHlwZTsKK2lmIChwcm9ncmFtLnRyYW5zcG9ydCA9PT0gImh0dHAiKSB7CisgIHByb2dyYW0udHJhbnNwb3J0ID0gImJ1ZmZlcmVkIjsKKyAgdHlwZSA9ICJodHRwIjsKK30KKworbGV0IG9wdGlvbnMgPSB7CiAgIHRyYW5zcG9ydDogaGVscGVycy50cmFuc3BvcnRzW3Byb2dyYW0udHJhbnNwb3J0XSwKICAgcHJvdG9jb2w6IGhlbHBlcnMucHJvdG9jb2xzW3Byb2dyYW0ucHJvdG9jb2xdCiB9OwogCi1pZiAodHlwZSA9PT0gJ2h0dHAnIHx8IHR5cGUgPT09J3dlYnNvY2tldCcpIHsKLSAgb3B0aW9ucy5oYW5kbGVyID0gaGFuZGxlcjsKK2lmICh0eXBlID09PSAiaHR0cCIgfHwgdHlwZSA9PT0gIndlYnNvY2tldCIpIHsKKyAgb3B0aW9ucy5oYW5kbGVyID0gVGhyaWZ0VGVzdEhhbmRsZXI7CiAgIG9wdGlvbnMucHJvY2Vzc29yID0gVGhyaWZ0VGVzdDsKIAogICBvcHRpb25zID0gewogICAgIHNlcnZpY2VzOiB7ICIvdGVzdCI6IG9wdGlvbnMgfSwKICAgICBjb3JzOiB7Ci0gICAgICAnKic6IHRydWUKKyAgICAgICIqIjogdHJ1ZQogICAgIH0KLSAgfQorICB9OwogfQogCi1pZiAodHlwZSA9PT0gJ211bHRpcGxleCcpIHsKLSAgdmFyIFNlY29uZFNlcnZpY2VIYW5kbGVyID0geworbGV0IHByb2Nlc3NvcjsKK2lmICh0eXBlID09PSAibXVsdGlwbGV4IikgeworICBjb25zdCBTZWNvbmRTZXJ2aWNlSGFuZGxlciA9IHsKICAgICBzZWNvbmR0ZXN0U3RyaW5nOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7Ci0gICAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZyhcJycgKyB0aGluZyArICdcJyknKTsKLSAgICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgICAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZygiJyArIHRoaW5nICsgJyIpJyk7CisgICAgICByZXN1bHQobnVsbCwgJ3Rlc3RTdHJpbmcoIicgKyB0aGluZyArICciKScpOwogICAgIH0KICAgfTsKIAotICB2YXIgcHJvY2Vzc29yID0gbmV3IHRocmlmdC5NdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICBwcm9jZXNzb3IgPSBuZXcgdGhyaWZ0Lk11bHRpcGxleGVkUHJvY2Vzc29yKCk7CiAKLSAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKCJUaHJpZnRUZXN0IiwKLSAgICBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoVGhyaWZ0VGVzdEhhbmRsZXIpKTsKKyAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgICJUaHJpZnRUZXN0IiwKKyAgICBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoVGhyaWZ0VGVzdEhhbmRsZXIpCisgICk7CiAKLSAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwKLSAgICBuZXcgU2Vjb25kU2VydmljZS5Qcm9jZXNzb3IoU2Vjb25kU2VydmljZUhhbmRsZXIpKTsKLQorICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgIlNlY29uZFNlcnZpY2UiLAorICAgIG5ldyBTZWNvbmRTZXJ2aWNlLlByb2Nlc3NvcihTZWNvbmRTZXJ2aWNlSGFuZGxlcikKKyAgKTsKIH0KIAogaWYgKHNzbCkgewotICBvcHRpb25zLnRscyA9IHsKLSAgICBrZXk6IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnc2VydmVyLmtleScpKSwKLSAgICBjZXJ0OiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3NlcnZlci5jcnQnKSkKLSAgfTsKKyAgaWYgKAorICAgIHR5cGUgPT09ICJ0Y3AiIHx8CisgICAgdHlwZSA9PT0gIm11bHRpcGxleCIgfHwKKyAgICB0eXBlID09PSAiaHR0cCIgfHwKKyAgICB0eXBlID09PSAid2Vic29ja2V0IgorICApIHsKKyAgICBvcHRpb25zLnRscyA9IHsKKyAgICAgIGtleTogZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICJzZXJ2ZXIua2V5IikpLAorICAgICAgY2VydDogZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICJzZXJ2ZXIuY3J0IikpCisgICAgfTsKKyAgfQogfQogCi12YXIgc2VydmVyOwotaWYgKHR5cGUgPT09ICd0Y3AnKSB7Ci0gIHNlcnZlciA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoVGhyaWZ0VGVzdCwgaGFuZGxlciwgb3B0aW9ucyk7Ci19IGVsc2UgaWYgKHR5cGUgPT09ICdtdWx0aXBsZXgnKSB7CitsZXQgc2VydmVyOworaWYgKHR5cGUgPT09ICJ0Y3AiKSB7CisgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoVGhyaWZ0VGVzdCwgVGhyaWZ0VGVzdEhhbmRsZXIsIG9wdGlvbnMpOworfSBlbHNlIGlmICh0eXBlID09PSAibXVsdGlwbGV4IikgewogICBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlTXVsdGlwbGV4U2VydmVyKHByb2Nlc3Nvciwgb3B0aW9ucyk7Ci19IGVsc2UgaWYgKHR5cGUgPT09ICdodHRwJyB8fCB0eXBlID09PSAnd2Vic29ja2V0JykgeworfSBlbHNlIGlmICh0eXBlID09PSAiaHR0cCIgfHwgdHlwZSA9PT0gIndlYnNvY2tldCIpIHsKICAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihvcHRpb25zKTsKIH0KIAotc2VydmVyLmxpc3Rlbihwb3J0KTsKK2lmIChkb21haW5Tb2NrZXQpIHsKKyAgc2VydmVyLmxpc3Rlbihkb21haW5Tb2NrZXQpOworfSBlbHNlIGlmICgKKyAgdHlwZSA9PT0gInRjcCIgfHwKKyAgdHlwZSA9PT0gIm11bHRpcGxleCIgfHwKKyAgdHlwZSA9PT0gImh0dHAiIHx8CisgIHR5cGUgPT09ICJ3ZWJzb2NrZXQiCispIHsKKyAgc2VydmVyLmxpc3Rlbihwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90ZXN0LWNhc2VzLmpzIGIvbGliL25vZGVqcy90ZXN0L3Rlc3QtY2FzZXMuanMKaW5kZXggMjM4NDIyMS4uMDJjNTY2ZiAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy90ZXN0L3Rlc3QtY2FzZXMuanMKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3QtY2FzZXMuanMKQEAgLTEsMTM4ICsxLDE3NyBAQAotJ3VzZSBzdHJpY3QnOworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCi12YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3RfdHlwZXMnKTsKKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgaGVscGVycyA9IHJlcXVpcmUoIi4vaGVscGVycyIpOworY29uc3QgdHR5cGVzID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vVGhyaWZ0VGVzdF90eXBlc2ApOworY29uc3QgSW50NjQgPSByZXF1aXJlKCJub2RlLWludDY0Iik7CiAKIC8vYWxsIExhbmd1YWdlcyBpbiBVVEYtOAogLypqc2hpbnQgLVcxMDAgKi8KLXZhciBzdHJpbmdUZXN0ID0gbW9kdWxlLmV4cG9ydHMuc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIiArCi0gICAgIkFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCAiICsKLSAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKLSAgICAi4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiICsKLSAgICAiQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCAiICsKLSAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKLSAgICAiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiICsKLSAgICAiRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCAiICsKLSAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCi0gICAgIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIgKwotICAgICJJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsICIgKwotICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKwotICAgICJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIgKwotICAgICJMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSAiICsKLSAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKwotICAgICJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiICsKLSAgICAiTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCAiICsKLSAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKwotICAgICJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIiArCi0gICAgItCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgIiArCi0gICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCi0gICAgIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIiArCi0gICAgIlTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssICIgKwotICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKLSAgICAiQsOibi1sw6JtLWfDuiwg57K16KqeIjsKK2NvbnN0IHN0cmluZ1Rlc3QgPSAobW9kdWxlLmV4cG9ydHMuc3RyaW5nVGVzdCA9CisgICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIiArCisgICJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIiArCisgICLQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sICIgKworICAi4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiICsKKyAgIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIiArCisgICJEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsICIgKworICAiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiICsKKyAgIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIiArCisgICJBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCAiICsKKyAgIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIgKworICAiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiICsKKyAgIuGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgIiArCisgICJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIgKworICAiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIiArCisgICJCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCDZhdin2LLZkNix2YjZhtuMLCBCYWhhc2EgIiArCisgICJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiICsKKyAgIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIiArCisgICJPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgIiArCisgICJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIiArCisgICLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIgKworICAiRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCAiICsKKyAgIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIiArCisgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiICsKKyAgIldhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsICIgKworICAiQsOibi1sw6JtLWfDuiwg57K16KqeIik7CiAvKmpzaGludCArVzEwMCAqLwogCi12YXIgc3BlY2lhbENoYXJhY3RlcnMgPSBtb2R1bGUuZXhwb3J0cy5zcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKwotICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKwotICAgICcgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICcgKwotICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCi0gICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JyArCi0gICAgJyBjaGFyLXRvLXRlc3QtanNvbi1wYXJzaW5nOiBdXSBcIl1dIFxcIiB9fX17IFtbWyAnOworY29uc3Qgc3BlY2lhbENoYXJhY3RlcnMgPSAobW9kdWxlLmV4cG9ydHMuc3BlY2lhbENoYXJhY3RlcnMgPQorICAncXVvdGU6ICIgYmFja3NsYXNoOicgKworICAiIGZvcndhcmRzbGFzaC1lc2NhcGVkOiAvICIgKworICAiIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAiICsKKyAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXC9cYlxuXHJcdCcgKworICAiIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwiICsKKyAgJyBjaGFyLXRvLXRlc3QtanNvbi1wYXJzaW5nOiBdXSAiXV0gXFwiIH19fXsgW1tbICcpOwogCi12YXIgbWFwVGVzdElucHV0ID0gbW9kdWxlLmV4cG9ydHMubWFwVGVzdElucHV0ID0gewotICAiYSI6IjEyMyIsICJhIGIiOiJ3aXRoIHNwYWNlcyAiLCAic2FtZSI6InNhbWUiLCAiMCI6Im51bWVyaWMga2V5IiwKLSAgImxvbmdWYWx1ZSI6c3RyaW5nVGVzdCwgc3RyaW5nVGVzdDoibG9uZyBrZXkiCi19OworY29uc3QgbWFwVGVzdElucHV0ID0gKG1vZHVsZS5leHBvcnRzLm1hcFRlc3RJbnB1dCA9IHsKKyAgYTogIjEyMyIsCisgICJhIGIiOiAid2l0aCBzcGFjZXMgIiwKKyAgc2FtZTogInNhbWUiLAorICAiMCI6ICJudW1lcmljIGtleSIsCisgIGxvbmdWYWx1ZTogc3RyaW5nVGVzdCwKKyAgc3RyaW5nVGVzdDogImxvbmcga2V5IgorfSk7CiAKLXZhciBzaW1wbGUgPSBbCi0gIFsndGVzdFZvaWQnLCB1bmRlZmluZWRdLAotICBbJ3Rlc3RTdHJpbmcnLCAnVGVzdCddLAotICBbJ3Rlc3RTdHJpbmcnLCAnJ10sCi0gIFsndGVzdFN0cmluZycsIHN0cmluZ1Rlc3RdLAotICBbJ3Rlc3RTdHJpbmcnLCBzcGVjaWFsQ2hhcmFjdGVyc10sCi0gIFsndGVzdEJvb2wnLCB0cnVlXSwKLSAgWyd0ZXN0Qm9vbCcsIGZhbHNlXSwKLSAgWyd0ZXN0Qnl0ZScsIDFdLAotICBbJ3Rlc3RCeXRlJywgMF0sCi0gIFsndGVzdEJ5dGUnLCAtMV0sCi0gIFsndGVzdEJ5dGUnLCAtMTI3XSwKLSAgWyd0ZXN0STMyJywgLTFdLAotICBbJ3Rlc3REb3VibGUnLCAtNS4yMDk4NTIzXSwKLSAgWyd0ZXN0RG91YmxlJywgNy4wMTIwNTIxNzUyMTUwNDRdLAotICBbJ3Rlc3RFbnVtJywgdHR5cGVzLk51bWJlcnouT05FXQorY29uc3Qgc2ltcGxlID0gWworICBbInRlc3RWb2lkIiwgdW5kZWZpbmVkXSwKKyAgWyJ0ZXN0U3RyaW5nIiwgIlRlc3QiXSwKKyAgWyJ0ZXN0U3RyaW5nIiwgIiJdLAorICBbInRlc3RTdHJpbmciLCBzdHJpbmdUZXN0XSwKKyAgWyJ0ZXN0U3RyaW5nIiwgc3BlY2lhbENoYXJhY3RlcnNdLAorICBbInRlc3RCb29sIiwgdHJ1ZV0sCisgIFsidGVzdEJvb2wiLCBmYWxzZV0sCisgIFsidGVzdEJ5dGUiLCAxXSwKKyAgWyJ0ZXN0Qnl0ZSIsIDBdLAorICBbInRlc3RCeXRlIiwgLTFdLAorICBbInRlc3RCeXRlIiwgLTEyN10sCisgIFsidGVzdEkzMiIsIC0xXSwKKyAgWyJ0ZXN0RG91YmxlIiwgLTUuMjA5ODUyM10sCisgIFsidGVzdERvdWJsZSIsIDcuMDEyMDUyMTc1MjE1MDQ0XSwKKyAgWyJ0ZXN0RW51bSIsIHR0eXBlcy5OdW1iZXJ6Lk9ORV0sCisgIFsidGVzdEk2NCIsIDVdLAorICBbInRlc3RJNjQiLCAtNV0sCisgIFsidGVzdEk2NCIsIDczNDM1OTczODM2OF0sCisgIFsidGVzdEk2NCIsIC03MzQzNTk3MzgzNjhdLAorICBbInRlc3RJNjQiLCBuZXcgSW50NjQobmV3IEJ1ZmZlcihbMCwgMHgyMCwgMCwgMCwgMCwgMCwgMCwgMV0pKV0sIC8vIDJeNTMrMQorICBbCisgICAgInRlc3RJNjQiLAorICAgIG5ldyBJbnQ2NChuZXcgQnVmZmVyKFsweGZmLCAweGRmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSkpCisgIF0sIC8vIC0yXjUzLTEKKyAgWyJ0ZXN0VHlwZWRlZiIsIDY5XQogXTsKIAotdmFyIHNpbXBsZUxvb3NlID0gWwotICBbJ3Rlc3RJNjQnLCA1XSwKLSAgWyd0ZXN0STY0JywgLTVdLAotICBbJ3Rlc3RJNjQnLCA3MzQzNTk3MzgzNjhdLAotICBbJ3Rlc3RJNjQnLCAtMzQzNTk3MzgzNjhdLAotICBbJ3Rlc3RJNjQnLCAtNzM0MzU5NzM4MzY4XSwKLSAgWyd0ZXN0VHlwZWRlZicsIDY5XQotXQotCi12YXIgbWFwb3V0ID0ge307Ci1mb3IgKHZhciBpID0gMDsgaSA8IDU7ICsraSkgewotICBtYXBvdXRbaV0gPSBpLTEwOworY29uc3QgbWFwb3V0ID0ge307Citmb3IgKGxldCBpID0gMDsgaSA8IDU7ICsraSkgeworICBtYXBvdXRbaV0gPSBpIC0gMTA7CiB9CiAKLXZhciBkZWVwID0gWwotICBbJ3Rlc3RNYXAnLCBtYXBvdXRdLAotICBbJ3Rlc3RTZXQnLCBbMSwyLDNdXSwKLSAgWyd0ZXN0TGlzdCcsIFsxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMF1dLAotICBbJ3Rlc3RTdHJpbmdNYXAnLCBtYXBUZXN0SW5wdXRdCitjb25zdCBkZWVwID0gWworICBbCisgICAgInRlc3RMaXN0IiwKKyAgICBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwXQorICBdCiBdOwogCi12YXIgb3V0ID0gbmV3IHR0eXBlcy5YdHJ1Y3QoewotICBzdHJpbmdfdGhpbmc6ICdaZXJvJywKK2NvbnN0IGRlZXBVbm9yZGVyZWQgPSBbCisgIFsidGVzdE1hcCIsIG1hcG91dF0sCisgIFsidGVzdFNldCIsIFsxLCAyLCAzXV0sCisgIFsidGVzdFN0cmluZ01hcCIsIG1hcFRlc3RJbnB1dF0KK107CisKK2NvbnN0IG91dCA9IG5ldyB0dHlwZXMuWHRydWN0KHsKKyAgc3RyaW5nX3RoaW5nOiAiWmVybyIsCiAgIGJ5dGVfdGhpbmc6IDEsCiAgIGkzMl90aGluZzogLTMsCiAgIGk2NF90aGluZzogMTAwMDAwMAogfSk7CiAKLXZhciBvdXQyID0gbmV3IHR0eXBlcy5YdHJ1Y3QyKCk7Citjb25zdCBvdXQyID0gbmV3IHR0eXBlcy5YdHJ1Y3QyKCk7CiBvdXQyLmJ5dGVfdGhpbmcgPSAxOwogb3V0Mi5zdHJ1Y3RfdGhpbmcgPSBvdXQ7CiBvdXQyLmkzMl90aGluZyA9IDU7CiAKLXZhciBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoewotICAidXNlck1hcCI6eyAiNSI6NSwgIjgiOjggfSwKLSAgInh0cnVjdHMiOltuZXcgdHR5cGVzLlh0cnVjdCh7Ci0gICAgICAic3RyaW5nX3RoaW5nIjoiR29vZGJ5ZTQiLAotICAgICAgImJ5dGVfdGhpbmciOjQsCi0gICAgICAiaTMyX3RoaW5nIjo0LAotICAgICAgImk2NF90aGluZyI6NAotICAgIH0pLCBuZXcgdHR5cGVzLlh0cnVjdCh7Ci0gICAgICAic3RyaW5nX3RoaW5nIjoiSGVsbG8yIiwKLSAgICAgICJieXRlX3RoaW5nIjoyLAotICAgICAgImkzMl90aGluZyI6MiwKLSAgICAgICJpNjRfdGhpbmciOjIKLSAgICB9KV0KK2NvbnN0IGNyYXp5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSh7CisgIHVzZXJNYXA6IHsgIjUiOiA1LCAiOCI6IDggfSwKKyAgeHRydWN0czogWworICAgIG5ldyB0dHlwZXMuWHRydWN0KHsKKyAgICAgIHN0cmluZ190aGluZzogIkdvb2RieWU0IiwKKyAgICAgIGJ5dGVfdGhpbmc6IDQsCisgICAgICBpMzJfdGhpbmc6IDQsCisgICAgICBpNjRfdGhpbmc6IDQKKyAgICB9KSwKKyAgICBuZXcgdHR5cGVzLlh0cnVjdCh7CisgICAgICBzdHJpbmdfdGhpbmc6ICJIZWxsbzIiLAorICAgICAgYnl0ZV90aGluZzogMiwKKyAgICAgIGkzMl90aGluZzogMiwKKyAgICAgIGk2NF90aGluZzogMgorICAgIH0pCisgIF0KIH0pOwogCi12YXIgY3JhenkyID0gbmV3IHR0eXBlcy5JbnNhbml0eSh7Ci0gICJ1c2VyTWFwIjp7ICI1Ijo1LCAiOCI6OCB9LAotICAieHRydWN0cyI6W3sKLSAgICAgICJzdHJpbmdfdGhpbmciOiJHb29kYnllNCIsCi0gICAgICAiYnl0ZV90aGluZyI6NCwKLSAgICAgICJpMzJfdGhpbmciOjQsCi0gICAgICAiaTY0X3RoaW5nIjo0Ci0gICAgfSwgewotICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCi0gICAgICAiYnl0ZV90aGluZyI6MiwKLSAgICAgICJpMzJfdGhpbmciOjIsCi0gICAgICAiaTY0X3RoaW5nIjoyCi0gICAgfV0KK2NvbnN0IGNyYXp5MiA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoeworICB1c2VyTWFwOiB7ICI1IjogNSwgIjgiOiA4IH0sCisgIHh0cnVjdHM6IFsKKyAgICB7CisgICAgICBzdHJpbmdfdGhpbmc6ICJHb29kYnllNCIsCisgICAgICBieXRlX3RoaW5nOiA0LAorICAgICAgaTMyX3RoaW5nOiA0LAorICAgICAgaTY0X3RoaW5nOiA0CisgICAgfSwKKyAgICB7CisgICAgICBzdHJpbmdfdGhpbmc6ICJIZWxsbzIiLAorICAgICAgYnl0ZV90aGluZzogMiwKKyAgICAgIGkzMl90aGluZzogMiwKKyAgICAgIGk2NF90aGluZzogMgorICAgIH0KKyAgXQogfSk7CiAKLQotdmFyIGluc2FuaXR5ID0gewotICAiMSI6eyAiMiI6IGNyYXp5LCAiMyI6IGNyYXp5IH0sCi0gICIyIjp7ICI2Ijp7ICJ1c2VyTWFwIjp7fSwgInh0cnVjdHMiOltdIH0gfQorY29uc3QgaW5zYW5pdHkgPSB7CisgICIxIjogeyAiMiI6IGNyYXp5LCAiMyI6IGNyYXp5IH0sCisgICIyIjogeyAiNiI6IHsgdXNlck1hcDoge30sIHh0cnVjdHM6IFtdIH0gfQogfTsKIAogbW9kdWxlLmV4cG9ydHMuc2ltcGxlID0gc2ltcGxlOwotbW9kdWxlLmV4cG9ydHMuc2ltcGxlTG9vc2UgPSBzaW1wbGVMb29zZTsKIG1vZHVsZS5leHBvcnRzLmRlZXAgPSBkZWVwOworbW9kdWxlLmV4cG9ydHMuZGVlcFVub3JkZXJlZCA9IGRlZXBVbm9yZGVyZWQ7CiAKIG1vZHVsZS5leHBvcnRzLm91dCA9IG91dDsKIG1vZHVsZS5leHBvcnRzLm91dDIgPSBvdXQyOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2ggYi9saWIvbm9kZWpzL3Rlc3QvdGVzdEFsbC5zaAppbmRleCAzOGIyODRhLi5lOThiMTk4IDEwMDc1NQotLS0gYS9saWIvbm9kZWpzL3Rlc3QvdGVzdEFsbC5zaAorKysgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdEFsbC5zaApAQCAtMjQsNyArMjQsNiBAQAogRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApIgogCiBJU1RBTkJVTD0iJERJUi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXN0YW5idWwvbGliL2NsaS5qcyIKLVJVTkJST1dTRVI9IiRESVIvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3J1bi1icm93c2VyL2Jpbi9jbGkuanMiCiAKIFJFUE9SVF9QUkVGSVg9IiR7RElSfS8uLi9jb3ZlcmFnZS9yZXBvcnQiCiAKQEAgLTM0LDM3ICszMywyNyBAQAogCiB0ZXN0U2VydmVyKCkKIHsKLSAgZWNobyAiICAgVGVzdGluZyAkMSBDbGllbnQvU2VydmVyIHdpdGggcHJvdG9jb2wgJDIgYW5kIHRyYW5zcG9ydCAkMyAkNCI7CisgIGVjaG8gIiAgW0VDTUEgJDFdIFRlc3RpbmcgJDIgQ2xpZW50L1NlcnZlciB3aXRoIHByb3RvY29sICQzIGFuZCB0cmFuc3BvcnQgJDQgJDUiOwogICBSRVQ9MAogICBpZiBbIC1uICIke0NPVkVSfSIgXTsgdGhlbgotICAgICR7SVNUQU5CVUx9IGNvdmVyICR7RElSfS9zZXJ2ZXIuanMgLS1kaXIgJHtSRVBPUlRfUFJFRklYfSR7Q09VTlR9IC0taGFuZGxlLXNpZ2ludCAtLSAtLXR5cGUgJDEgLXAgJDIgLXQgJDMgJDQgJgorICAgICR7SVNUQU5CVUx9IGNvdmVyICR7RElSfS9zZXJ2ZXIuanMgLS1kaXIgJHtSRVBPUlRfUFJFRklYfSR7Q09VTlR9IC0taGFuZGxlLXNpZ2ludCAtLSAtLXR5cGUgJDIgLXAgJDMgLXQgJDQgJDUgJgogICAgIENPVU5UPSQoKENPVU5UKzEpKQogICBlbHNlCi0gICAgbm9kZSAke0RJUn0vc2VydmVyLmpzIC0tdHlwZSAkMSAtcCAkMiAtdCAkMyAkNCAmCisgICAgbm9kZSAke0RJUn0vc2VydmVyLmpzIC0tJHsxfSAtLXR5cGUgJDIgLXAgJDMgLXQgJDQgJDUgJgogICBmaQogICBTRVJWRVJQSUQ9JCEKLSAgc2xlZXAgMQorICBzbGVlcCAwLjEKICAgaWYgWyAtbiAiJHtDT1ZFUn0iIF07IHRoZW4KLSAgICAke0lTVEFOQlVMfSBjb3ZlciAke0RJUn0vY2xpZW50LmpzIC0tZGlyICR7UkVQT1JUX1BSRUZJWH0ke0NPVU5UfSAtLSAtLXR5cGUgJDEgLXAgJDIgLXQgJDMgJDQgfHwgUkVUPTEKKyAgICAke0lTVEFOQlVMfSBjb3ZlciAke0RJUn0vY2xpZW50LmpzIC0tZGlyICR7UkVQT1JUX1BSRUZJWH0ke0NPVU5UfSAtLSAtLSR7MX0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1IHx8IFJFVD0xCiAgICAgQ09VTlQ9JCgoQ09VTlQrMSkpCiAgIGVsc2UKLSAgICBub2RlICR7RElSfS9jbGllbnQuanMgLS10eXBlICQxIC1wICQyIC10ICQzICQ0IHx8IFJFVD0xCisgICAgbm9kZSAke0RJUn0vY2xpZW50LmpzIC0tJHsxfSAtLXR5cGUgJDIgLXAgJDMgLXQgJDQgJDUgfHwgUkVUPTEKICAgZmkKICAga2lsbCAtMiAkU0VSVkVSUElEIHx8IFJFVD0xCisgIHdhaXQgJFNFUlZFUlBJRAogICByZXR1cm4gJFJFVAogfQogCi10ZXN0QnJvd3NlcigpCi17Ci0gIGVjaG8gIiAgIFRlc3RpbmcgYnJvd3NlciBjbGllbnQgd2l0aCBodHRwIHNlcnZlciB3aXRoIGpzb24gcHJvdG9jb2wgYW5kIGJ1ZmZlcmVkIHRyYW5zcG9ydCI7Ci0gIFJFVD0wCi0gIG5vZGUgJHtESVJ9L3NlcnZlci5qcyAtLXR5cGUgaHR0cCAtcCBqc29uIC10IGJ1ZmZlcmVkICYKLSAgU0VSVkVSUElEPSQhCi0gIHNsZWVwIDEKLSAgJHtSVU5CUk9XU0VSfSAke0RJUn0vYnJvd3Nlcl9jbGllbnQuanMgLS1waGFudG9tIHx8IFJFVD0xCi0gIGtpbGwgLTIgJFNFUlZFUlBJRCB8fCBSRVQ9MQotICByZXR1cm4gJFJFVAotfQogCiBURVNUT0s9MAogCkBAIC03MiwzMSArNjEsMzYgQEAKIAogJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtESVJ9IC0tZ2VuIGpzOm5vZGUgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlICR7RElSfS8uLi8uLi8uLi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQKKyR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlICR7RElSfS8uLi8uLi8uLi90ZXN0L0ludDY0VGVzdC50aHJpZnQKK21rZGlyICR7RElSfS9nZW4tbm9kZWpzLWVzNgorJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAke0RJUn0vZ2VuLW5vZGVqcy1lczYgLS1nZW4ganM6bm9kZSxlczYgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJHtESVJ9L2dlbi1ub2RlanMtZXM2IC0tZ2VuIGpzOm5vZGUsZXM2ICR7RElSfS8uLi8uLi8uLi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQKKyR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJHtESVJ9L2dlbi1ub2RlanMtZXM2IC0tZ2VuIGpzOm5vZGUsZXM2ICR7RElSfS8uLi8uLi8uLi90ZXN0L0ludDY0VGVzdC50aHJpZnQKIAogI3VuaXQgdGVzdHMKIAogbm9kZSAke0RJUn0vYmluYXJ5LnRlc3QuanMgfHwgVEVTVE9LPTEKK25vZGUgJHtESVJ9L2ludDY0LnRlc3QuanMgfHwgVEVTVE9LPTEKIG5vZGUgJHtESVJ9L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcyB8fCBURVNUT0s9MQogCiAjaW50ZWdyYXRpb24gdGVzdHMKIAogZm9yIHR5cGUgaW4gdGNwIG11bHRpcGxleCB3ZWJzb2NrZXQgaHR0cAogZG8KLQogICBmb3IgcHJvdG9jb2wgaW4gY29tcGFjdCBiaW5hcnkganNvbgogICBkbwotCiAgICAgZm9yIHRyYW5zcG9ydCBpbiBidWZmZXJlZCBmcmFtZWQKICAgICBkbwotICAgICAgdGVzdFNlcnZlciAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCB8fCBURVNUT0s9MQotICAgICAgdGVzdFNlcnZlciAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLXNzbCB8fCBURVNUT0s9MQotICAgICAgdGVzdFNlcnZlciAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLXByb21pc2UgfHwgVEVTVE9LPTEKKyAgICAgIGZvciBlY21hX3ZlcnNpb24gaW4gZXM1IGVzNgorICAgICAgZG8KKyAgICAgICAgdGVzdFNlcnZlciAkZWNtYV92ZXJzaW9uICR0eXBlICRwcm90b2NvbCAkdHJhbnNwb3J0IHx8IFRFU1RPSz0xCisgICAgICAgIHRlc3RTZXJ2ZXIgJGVjbWFfdmVyc2lvbiAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLXNzbCB8fCBURVNUT0s9MQorICAgICAgICB0ZXN0U2VydmVyICRlY21hX3ZlcnNpb24gJHR5cGUgJHByb3RvY29sICR0cmFuc3BvcnQgLS1jYWxsYmFjayB8fCBURVNUT0s9MQorICAgICAgZG9uZQogICAgIGRvbmUKICAgZG9uZQogZG9uZQogCi0jIFhIUiBvbmx5IHVudGlsIHBoYW50b21qcyAyIGlzIHJlbGVhc2VkLgotdGVzdEJyb3dzZXIKIAogaWYgWyAtbiAiJHtDT1ZFUn0iIF07IHRoZW4KICAgJHtJU1RBTkJVTH0gcmVwb3J0IC0tZGlyICIke0RJUn0vLi4vY292ZXJhZ2UiIC0taW5jbHVkZSAiJHtESVJ9Ly4uL2NvdmVyYWdlL3JlcG9ydCovY292ZXJhZ2UuanNvbiIgbGNvdiBjb2JlcnR1cmEgaHRtbApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3Rlc3RfZHJpdmVyLmpzIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RfZHJpdmVyLmpzCmluZGV4IDI3ZmZkNjMuLjdjOWE5MTkgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC90ZXN0X2RyaXZlci5qcworKysgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9kcml2ZXIuanMKQEAgLTE3LDIyMCArMTcsMjc5IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0gLy8gVGhpcyBpcyB0aGUgTm9kZS5qcyB0ZXN0IGRyaXZlciBmb3IgdGhlIHN0YW5kYXJkIEFwYWNoZSBUaHJpZnQKLSAvLyB0ZXN0IHNlcnZpY2UuIFRoZSBkcml2ZXIgaW52b2tlcyBldmVyeSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZQotIC8vIFRocmlmdCBUZXN0IHNlcnZpY2Ugd2l0aCBhIHJlcHJlc2VudGF0aXZlIHJhbmdlIG9mIHBhcmFtZXRlcnMuCi0gLy8KLSAvLyBUaGUgVGhyaWZ0VGVzdERyaXZlciBmdW5jdGlvbiByZXF1aXJlcyBhIGNsaWVudCBvYmplY3QKLSAvLyBjb25uZWN0ZWQgdG8gYSBzZXJ2ZXIgaG9zdGluZyB0aGUgVGhyaWZ0IFRlc3Qgc2VydmljZSBhbmQKLSAvLyBzdXBwb3J0cyBhbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2l0aAotIC8vIGEgc3RhdHVzIG1lc3NhZ2Ugd2hlbiB0aGUgdGVzdCBpcyBjb21wbGV0ZS4KKy8vIFRoaXMgaXMgdGhlIE5vZGUuanMgdGVzdCBkcml2ZXIgZm9yIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0CisvLyB0ZXN0IHNlcnZpY2UuIFRoZSBkcml2ZXIgaW52b2tlcyBldmVyeSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZQorLy8gVGhyaWZ0IFRlc3Qgc2VydmljZSB3aXRoIGEgcmVwcmVzZW50YXRpdmUgcmFuZ2Ugb2YgcGFyYW1ldGVycy4KKy8vCisvLyBUaGUgVGhyaWZ0VGVzdERyaXZlciBmdW5jdGlvbiByZXF1aXJlcyBhIGNsaWVudCBvYmplY3QKKy8vIGNvbm5lY3RlZCB0byBhIHNlcnZlciBob3N0aW5nIHRoZSBUaHJpZnQgVGVzdCBzZXJ2aWNlIGFuZAorLy8gc3VwcG9ydHMgYW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdpdGgKKy8vIGEgc3RhdHVzIG1lc3NhZ2Ugd2hlbiB0aGUgdGVzdCBpcyBjb21wbGV0ZS4KIAotdmFyIHRlc3QgPSByZXF1aXJlKCd0YXBlJyk7Ci0vL3ZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKLXZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOwotdmFyIFRFeGNlcHRpb24gPSByZXF1aXJlKCd0aHJpZnQnKS5UaHJpZnQuVEV4Y2VwdGlvbjsKLXZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKLXZhciB0ZXN0Q2FzZXMgPSByZXF1aXJlKCcuL3Rlc3QtY2FzZXMnKTsKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7CisKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IFRFeGNlcHRpb24gPSByZXF1aXJlKCJ0aHJpZnQiKS5UaHJpZnQuVEV4Y2VwdGlvbjsKK2NvbnN0IEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOworY29uc3QgdGVzdENhc2VzID0gcmVxdWlyZSgiLi90ZXN0LWNhc2VzIik7CiAKIGV4cG9ydHMuVGhyaWZ0VGVzdERyaXZlciA9IGZ1bmN0aW9uKGNsaWVudCwgY2FsbGJhY2spIHsKKyAgdGVzdCgKKyAgICAiTm9kZUpTIFN0eWxlIENhbGxiYWNrIENsaWVudCBUZXN0cyIsCisgICAgeyBza2lwOiBoZWxwZXJzLmVjbWFNb2RlID09PSAiZXM2IiB9LAorICAgIGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseSA9IG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpOwogCi0gIHRlc3QoJ05vZGVKUyBTdHlsZSBDYWxsYmFjayBDbGllbnQgVGVzdHMnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbikgeworICAgICAgICByZXR1cm4gZnVuY3Rpb24oYykgeworICAgICAgICAgIGNvbnN0IGZuTmFtZSA9IGNbMF07CisgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICAgIGNsaWVudFtmbk5hbWVdKGV4cGVjdGVkLCBmdW5jdGlvbihlcnIsIGFjdHVhbCkgeworICAgICAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgZm5OYW1lICsgIjogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH07CisgICAgICB9CiAKLSAgICB2YXIgY2hlY2tSZWN1cnNpdmVseSA9IG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpOwotCi0gICAgZnVuY3Rpb24gbWFrZUFzc2VydGVyKGFzc2VydGlvbkZuKSB7Ci0gICAgICByZXR1cm4gZnVuY3Rpb24oYykgewotICAgICAgICB2YXIgZm5OYW1lID0gY1swXTsKLSAgICAgICAgdmFyIGV4cGVjdGVkID0gY1sxXTsKLSAgICAgICAgY2xpZW50W2ZuTmFtZV0oZXhwZWN0ZWQsIGZ1bmN0aW9uKGVyciwgYWN0dWFsKSB7Ci0gICAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgZm5OYW1lICsgJzogbm8gY2FsbGJhY2sgZXJyb3InKTsKLSAgICAgICAgICBhc3NlcnRpb25GbihhY3R1YWwsIGV4cGVjdGVkLCBmbk5hbWUpOworICAgICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKAorICAgICAgICBtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSkgeworICAgICAgICAgIGlmIChhIGluc3RhbmNlb2YgSW50NjQpIHsKKyAgICAgICAgICAgIGNvbnN0IGU2NCA9IGUgaW5zdGFuY2VvZiBJbnQ2NCA/IGUgOiBuZXcgSW50NjQoZSk7CisgICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKGEuYnVmZmVyLCBlNjQuYnVmZmVyLCBtKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0LmVxdWFsKGEsIGUsIG0pOworICAgICAgICAgIH0KICAgICAgICAgfSkKLSAgICAgIH07Ci0gICAgfQorICAgICAgKTsKKyAgICAgIHRlc3RDYXNlcy5kZWVwLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5kZWVwRXF1YWwpKTsKKyAgICAgIHRlc3RDYXNlcy5kZWVwVW5vcmRlcmVkLmZvckVhY2goCisgICAgICAgIG1ha2VBc3NlcnRlcihtYWtlVW5vcmRlcmVkRGVlcEVxdWFsKGFzc2VydCkpCisgICAgICApOwogCi0gICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZXF1YWwpKTsKLSAgICB0ZXN0Q2FzZXMuc2ltcGxlTG9vc2UuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSl7Ci0gICAgICBhc3NlcnQub2soYSA9PSBlLCBtKTsKLSAgICB9KSk7Ci0gICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOwotCi0gICAgY2xpZW50LnRlc3RNYXBNYXAoNDIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKLSAgICAgIHZhciBleHBlY3RlZCA9IHsKLSAgICAgICAgIjQiOiB7IjEiOjEsICIyIjoyLCAiMyI6MywgIjQiOjR9LAotICAgICAgICAiLTQiOiB7Ii00IjotNCwgIi0zIjotMywgIi0yIjotMiwgIi0xIjotMX0KLSAgICAgIH07Ci0gICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdE1hcE1hcDogbm8gY2FsbGJhY2sgZXJyb3InKTsKLSAgICAgIGFzc2VydC5kZWVwRXF1YWwoZXhwZWN0ZWQsIHJlc3BvbnNlLCAndGVzdE1hcE1hcCcpOwotICAgIH0pOwotCi0gICAgY2xpZW50LnRlc3RTdHJ1Y3QodGVzdENhc2VzLm91dCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RTdHJ1Y3Q6IG5vIGNhbGxiYWNrIGVycm9yJyk7Ci0gICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAndGVzdFN0cnVjdCcpOwotICAgIH0pOwotCi0gICAgY2xpZW50LnRlc3ROZXN0KHRlc3RDYXNlcy5vdXQyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdE5lc3Q6IG5vIGNhbGxiYWNrIGVycm9yJyk7Ci0gICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQyLCByZXNwb25zZSwgJ3Rlc3ROZXN0Jyk7Ci0gICAgfSk7Ci0KLSAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RJbnNhbml0eTogbm8gY2FsbGJhY2sgZXJyb3InKTsKLSAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgJ3Rlc3RJbnNhbml0eScpOwotICAgIH0pOwotCi0gICAgY2xpZW50LnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenkyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdEluc2FuaXR5Mjogbm8gY2FsbGJhY2sgZXJyb3InKTsKLSAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgJ3Rlc3RJbnNhbml0eTInKTsKLSAgICB9KTsKLQotICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24sICd0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUnKTsKLSAgICAgIGFzc2VydC5vayghcmVzcG9uc2UsICd0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZScpOwotICAgIH0pOwotCi0gICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIHR0eXBlcy5YY2VwdGlvbiwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgdHlwZScpOwotICAgICAgYXNzZXJ0Lm9rKCFyZXNwb25zZSwgJ3Rlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlJyk7Ci0gICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgY29kZScpOwotICAgICAgYXNzZXJ0LmVxdWFsKCdYY2VwdGlvbicsIGVyci5tZXNzYWdlLCAndGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciBtZXNzYWdlJyk7Ci0gICAgfSk7Ci0KLSAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RFeGNlcHRpb246IG5vIGNhbGxiYWNrIGVycm9yJyk7Ci0gICAgICBhc3NlcnQub2soIXJlc3BvbnNlLCAndGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UnKTsKLSAgICB9KTsKLQotICAgIGNsaWVudC50ZXN0T25ld2F5KDAsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKLSAgICAgIGFzc2VydC5mYWlsKCd0ZXN0T25ld2F5IHNob3VsZCBub3QgYW5zd2VyJyk7Ci0gICAgfSk7Ci0KLSAgICBjaGVja09mZkJ5T25lKGZ1bmN0aW9uKGRvbmUpIHsKLSAgICAgIGNsaWVudC50ZXN0STMyKC0xLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gICAgICAgIGFzc2VydC5lcnJvcihlcnIsICdjaGVja09mZkJ5T25lOiBubyBjYWxsYmFjayBlcnJvcicpOwotICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKLSAgICAgICAgYXNzZXJ0LmVuZCgpOwotICAgICAgICBkb25lKCk7CisgICAgICBjb25zdCBhcnIgPSBbXTsKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgYXJyW2ldID0gMjU1IC0gaTsKKyAgICAgIH0KKyAgICAgIGxldCBidWYgPSBuZXcgQnVmZmVyKGFycik7CisgICAgICBjbGllbnQudGVzdEJpbmFyeShidWYsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RCaW5hcnk6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXNwb25zZS5sZW5ndGgsIDI1NiwgInRlc3RCaW5hcnkiKTsKKyAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgYnVmLCAidGVzdEJpbmFyeShCdWZmZXIpIik7CiAgICAgICB9KTsKLSAgICB9LCBjYWxsYmFjayk7CisgICAgICBidWYgPSBuZXcgQnVmZmVyKGFycik7CisgICAgICBjbGllbnQudGVzdEJpbmFyeShidWYudG9TdHJpbmcoImJpbmFyeSIpLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0QmluYXJ5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuZXF1YWwocmVzcG9uc2UubGVuZ3RoLCAyNTYsICJ0ZXN0QmluYXJ5Iik7CisgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UsIGJ1ZiwgInRlc3RCaW5hcnkoc3RyaW5nKSIpOworICAgICAgfSk7CiAKLSAgfSk7CisgICAgICBjbGllbnQudGVzdE1hcE1hcCg0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBjb25zdCBleHBlY3RlZCA9IHsKKyAgICAgICAgICAiNCI6IHsgIjEiOiAxLCAiMiI6IDIsICIzIjogMywgIjQiOiA0IH0sCisgICAgICAgICAgIi00IjogeyAiLTQiOiAtNCwgIi0zIjogLTMsICItMiI6IC0yLCAiLTEiOiAtMSB9CisgICAgICAgIH07CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0TWFwTWFwOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKGV4cGVjdGVkLCByZXNwb25zZSwgInRlc3RNYXBNYXAiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0U3RydWN0OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAidGVzdFN0cnVjdCIpOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdE5lc3Q6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAidGVzdE5lc3QiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEluc2FuaXR5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eTIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RJbnNhbml0eTI6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eTIiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKAorICAgICAgICAgIGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24sCisgICAgICAgICAgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgdHlwZSIKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0Lm9rKCFyZXNwb25zZSwgInRlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQub2soCisgICAgICAgICAgZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uLAorICAgICAgICAgICJ0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUiCisgICAgICAgICk7CisgICAgICAgIGFzc2VydC5vayghcmVzcG9uc2UsICJ0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZSIpOworICAgICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSwgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgY29kZSIpOworICAgICAgICBhc3NlcnQuZXF1YWwoCisgICAgICAgICAgIlhjZXB0aW9uIiwKKyAgICAgICAgICBlcnIubWVzc2FnZSwKKyAgICAgICAgICAidGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciBtZXNzYWdlIgorICAgICAgICApOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0RXhjZXB0aW9uOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQub2soIXJlc3BvbnNlLCAidGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdE9uZXdheSgwLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0T25ld2F5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzcG9uc2UsIHVuZGVmaW5lZCwgInRlc3RPbmV3YXk6IHZvaWQgcmVzcG9uc2UiKTsKKyAgICAgIH0pOworCisgICAgICBjaGVja09mZkJ5T25lKGZ1bmN0aW9uKGRvbmUpIHsKKyAgICAgICAgY2xpZW50LnRlc3RJMzIoLTEsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAiY2hlY2tPZmZCeU9uZTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKKyAgICAgICAgICBhc3NlcnQuZW5kKCk7CisgICAgICAgICAgZG9uZSgpOworICAgICAgICB9KTsKKyAgICAgIH0sIGNhbGxiYWNrKTsKKyAgICB9CisgICk7CisKKyAgLy8gRVM2IGRvZXMgbm90IHN1cHBvcnQgY2FsbGJhY2sgc3R5bGUKKyAgaWYgKGhlbHBlcnMuZWNtYU1vZGUgPT09ICJlczYiKSB7CisgICAgY2hlY2tPZmZCeU9uZShkb25lID0+IGRvbmUoKSwgY2FsbGJhY2spOworICB9CiB9OwogCiBleHBvcnRzLlRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gZnVuY3Rpb24oY2xpZW50LCBjYWxsYmFjaykgewotCi0gIHRlc3QoJ1EgUHJvbWlzZSBDbGllbnQgVGVzdHMnLCBmdW5jdGlvbihhc3NlcnQpIHsKLQotICAgIHZhciBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7Ci0KLSAgICBmdW5jdGlvbiBmYWlsKG1zZykgewotICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewotICAgICAgICBhc3NlcnQuZmFpbChtc2cpOwotICAgICAgfQotICAgIH0KKyAgdGVzdCgiUHJvbWlzZSBDbGllbnQgVGVzdHMiLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7CiAKICAgICBmdW5jdGlvbiBtYWtlQXNzZXJ0ZXIoYXNzZXJ0aW9uRm4pIHsKICAgICAgIHJldHVybiBmdW5jdGlvbihjKSB7Ci0gICAgICAgIHZhciBmbk5hbWUgPSBjWzBdOwotICAgICAgICB2YXIgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICBjb25zdCBmbk5hbWUgPSBjWzBdOworICAgICAgICBjb25zdCBleHBlY3RlZCA9IGNbMV07CiAgICAgICAgIGNsaWVudFtmbk5hbWVdKGV4cGVjdGVkKQogICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGFjdHVhbCkgewogICAgICAgICAgICAgYXNzZXJ0aW9uRm4oYWN0dWFsLCBleHBlY3RlZCwgZm5OYW1lKTsKICAgICAgICAgICB9KQotICAgICAgICAgIC5mYWlsKGZhaWwoJ2ZuTmFtZScpKTsKKyAgICAgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoImZuTmFtZSIpKTsKICAgICAgIH07CiAgICAgfQogCi0gICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZXF1YWwpKTsKLSAgICB0ZXN0Q2FzZXMuc2ltcGxlTG9vc2UuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSl7Ci0gICAgICBhc3NlcnQub2soYSA9PSBlLCBtKTsKLSAgICB9KSk7CisgICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKAorICAgICAgbWFrZUFzc2VydGVyKGZ1bmN0aW9uKGEsIGUsIG0pIHsKKyAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBJbnQ2NCkgeworICAgICAgICAgIGNvbnN0IGU2NCA9IGUgaW5zdGFuY2VvZiBJbnQ2NCA/IGUgOiBuZXcgSW50NjQoZSk7CisgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChhLmJ1ZmZlciwgZTY0LmJ1ZmZlciwgbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKGEsIGUsIG0pOworICAgICAgICB9CisgICAgICB9KQorICAgICk7CiAgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworICAgIHRlc3RDYXNlcy5kZWVwVW5vcmRlcmVkLmZvckVhY2goCisgICAgICBtYWtlQXNzZXJ0ZXIobWFrZVVub3JkZXJlZERlZXBFcXVhbChhc3NlcnQpKQorICAgICk7CiAKLSAgICBjbGllbnQudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0KQorICAgIGNsaWVudAorICAgICAgLnRlc3RTdHJ1Y3QodGVzdENhc2VzLm91dCkKICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7Ci0gICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dCwgcmVzcG9uc2UsICd0ZXN0U3RydWN0Jyk7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dCwgcmVzcG9uc2UsICJ0ZXN0U3RydWN0Iik7CiAgICAgICB9KQotICAgICAgLmZhaWwoZmFpbCgndGVzdFN0cnVjdCcpKTsKKyAgICAgIC5jYXRjaCgoKSA9PiBhc3NlcnQuZmFpbCgidGVzdFN0cnVjdCIpKTsKIAotICAgIGNsaWVudC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MikKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MikKICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7Ci0gICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAndGVzdE5lc3QnKTsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0MiwgcmVzcG9uc2UsICJ0ZXN0TmVzdCIpOwogICAgICAgfSkKLSAgICAgIC5mYWlsKGZhaWwoJ3Rlc3ROZXN0JykpOworICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0TmVzdCIpKTsKIAotICAgIGNsaWVudC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5KQorICAgIGNsaWVudAorICAgICAgLnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenkpCiAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewotICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICd0ZXN0SW5zYW5pdHknKTsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5Iik7CiAgICAgICB9KQotICAgICAgLmZhaWwoZmFpbCgndGVzdEluc2FuaXR5JykpOworICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0SW5zYW5pdHkiKSk7CiAKLSAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eTIpCisgICAgY2xpZW50CisgICAgICAudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eTIpCiAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewotICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICd0ZXN0SW5zYW5pdHkyJyk7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eTIiKTsKICAgICAgIH0pCi0gICAgICAuZmFpbChmYWlsKCd0ZXN0SW5zYW5pdHkyJykpOworICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0SW5zYW5pdHkyIikpOwogCi0gICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1RFeGNlcHRpb24nKQotICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKLSAgICAgICAgZmFpbCgndGVzdEV4Y2VwdGlvbjogVEV4Y2VwdGlvbicpOworICAgIGNsaWVudAorICAgICAgLnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKQorICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7CisgICAgICAgIGFzc2VydC5mYWlsKCJ0ZXN0RXhjZXB0aW9uOiBURXhjZXB0aW9uIik7CiAgICAgICB9KQotICAgICAgLmZhaWwoZnVuY3Rpb24oZXJyKSB7CisgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiBURXhjZXB0aW9uKTsKICAgICAgIH0pOwogCi0gICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykKLSAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7Ci0gICAgICAgIGZhaWwoJ3Rlc3RFeGNlcHRpb246IFhjZXB0aW9uJyk7CisgICAgY2xpZW50CisgICAgICAudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKQorICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7CisgICAgICAgIGFzc2VydC5mYWlsKCJ0ZXN0RXhjZXB0aW9uOiBYY2VwdGlvbiIpOwogICAgICAgfSkKLSAgICAgIC5mYWlsKGZ1bmN0aW9uKGVycikgeworICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikgewogICAgICAgICBhc3NlcnQub2soZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uKTsKICAgICAgICAgYXNzZXJ0LmVxdWFsKGVyci5lcnJvckNvZGUsIDEwMDEpOwotICAgICAgICBhc3NlcnQuZXF1YWwoJ1hjZXB0aW9uJywgZXJyLm1lc3NhZ2UpOworICAgICAgICBhc3NlcnQuZXF1YWwoIlhjZXB0aW9uIiwgZXJyLm1lc3NhZ2UpOwogICAgICAgfSk7CiAKLSAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJykKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKQogICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgYXNzZXJ0LmVxdWFsKHVuZGVmaW5lZCwgcmVzcG9uc2UpOyAvL3ZvaWQKICAgICAgIH0pCi0gICAgICAuZmFpbChmYWlsKCd0ZXN0RXhjZXB0aW9uJykpOworICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0RXhjZXB0aW9uIikpOwogCi0gICAgY2xpZW50LnRlc3RPbmV3YXkoMCwgZmFpbCgndGVzdE9uZXdheTogc2hvdWxkIG5vdCBhbnN3ZXInKSk7CisgICAgY2xpZW50CisgICAgICAudGVzdE9uZXdheSgwKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3BvbnNlLCB1bmRlZmluZWQsICJ0ZXN0T25ld2F5OiB2b2lkIHJlc3BvbnNlIik7CisgICAgICB9KQorICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0T25ld2F5OiBzaG91bGQgbm90IHJlamVjdCIpKTsKIAogICAgIGNoZWNrT2ZmQnlPbmUoZnVuY3Rpb24oZG9uZSkgewotICAgICAgY2xpZW50LnRlc3RJMzIoLTEpCisgICAgICBjbGllbnQKKyAgICAgICAgLnRlc3RJMzIoLTEpCiAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7Ci0gICAgICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgIGFzc2VydC5lbmQoKTsKLSAgICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKKyAgICAgICAgICBhc3NlcnQuZW5kKCk7CisgICAgICAgICAgZG9uZSgpOwogICAgICAgICB9KQotICAgICAgICAuZmFpbChmYWlsKCdjaGVja09mZkJ5T25lJykpOworICAgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoImNoZWNrT2ZmQnlPbmUiKSk7CiAgICAgfSwgY2FsbGJhY2spOwogICB9KTsKIH07CiAKLQogLy8gSGVscGVyIEZ1bmN0aW9ucwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIGZ1bmN0aW9uIG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpIHsKLQotICByZXR1cm4gZnVuY3Rpb24gKG1hcDEsIG1hcDIsIG1zZykgewotICAgIHZhciBlcXVhbCA9IHRydWU7Ci0KLSAgICB2YXIgZXF1YWwgPSBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpOworICByZXR1cm4gZnVuY3Rpb24obWFwMSwgbWFwMiwgbXNnKSB7CisgICAgY29uc3QgZXF1YWwgPSBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpOwogCiAgICAgYXNzZXJ0Lm9rKGVxdWFsLCBtc2cpOwogCiAgICAgLy8gZGVlcEVxdWFsIGRvZXNuJ3Qgd29yayB3aXRoIGZpZWxkcyB1c2luZyBub2RlLWludDY0CiAgICAgZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShtYXAxLCBtYXAyKSB7Ci0gICAgICBpZiAodHlwZW9mIG1hcDEgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1hcDIgIT09ICdmdW5jdGlvbicpIHsKLSAgICAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgeworICAgICAgaWYgKHR5cGVvZiBtYXAxICE9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBtYXAyICE9PSAiZnVuY3Rpb24iKSB7CisgICAgICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAvL0hhbmRsZSBpbnQ2NCB0eXBlcyAod2hpY2ggdXNlIG5vZGUtaW50NjQgaW4gTm9kZS5qcyBKYXZhU2NyaXB0KQotICAgICAgICAgIGlmICgodHlwZW9mIG1hcDEgPT09ICJudW1iZXIiKSAmJiAodHlwZW9mIG1hcDIgPT09ICJvYmplY3QiKSAmJgotICAgICAgICAgICAgICAobWFwMi5idWZmZXIpICYmIChtYXAyLmJ1ZmZlciBpbnN0YW5jZW9mIEJ1ZmZlcikgJiYgKG1hcDIuYnVmZmVyLmxlbmd0aCA9PT0gOCkpIHsKLSAgICAgICAgICAgIHZhciBuID0gbmV3IEludDY0KG1hcDIuYnVmZmVyKTsKKyAgICAgICAgICBpZiAoCisgICAgICAgICAgICB0eXBlb2YgbWFwMSA9PT0gIm51bWJlciIgJiYKKyAgICAgICAgICAgIHR5cGVvZiBtYXAyID09PSAib2JqZWN0IiAmJgorICAgICAgICAgICAgbWFwMi5idWZmZXIgJiYKKyAgICAgICAgICAgIG1hcDIuYnVmZmVyIGluc3RhbmNlb2YgQnVmZmVyICYmCisgICAgICAgICAgICBtYXAyLmJ1ZmZlci5sZW5ndGggPT09IDgKKyAgICAgICAgICApIHsKKyAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgSW50NjQobWFwMi5idWZmZXIpOwogICAgICAgICAgICAgcmV0dXJuIG1hcDEgPT09IG4udG9OdW1iZXIoKTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIG1hcDEgPT0gbWFwMjsKQEAgLTI0MiwxNSArMzAxLDE0IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gIH0KKyAgfTsKIH0KIAogZnVuY3Rpb24gY2hlY2tPZmZCeU9uZShkb25lLCBjYWxsYmFjaykgewotCi0gIHZhciByZXRyeV9saW1pdCA9IDMwOwotICB2YXIgcmV0cnlfaW50ZXJ2YWwgPSAxMDA7Ci0gIHZhciB0ZXN0X2NvbXBsZXRlID0gZmFsc2U7Ci0gIHZhciByZXRyeXMgPSAwOworICBjb25zdCByZXRyeV9saW1pdCA9IDMwOworICBjb25zdCByZXRyeV9pbnRlcnZhbCA9IDEwMDsKKyAgbGV0IHRlc3RfY29tcGxldGUgPSBmYWxzZTsKKyAgbGV0IHJldHJ5cyA9IDA7CiAKICAgLyoqCiAgICAqIHJlZG8gYSBzaW1wbGUgdGVzdCBhZnRlciB0aGUgb25ld2F5IHRvIG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgIm9mZiBieSBvbmUiIC0tCkBAIC0yNjcsMTcgKzMyNSwzNyBAQAogCiAgIC8vV2Ugd2FpdCB1cCB0byByZXRyeV9saW1pdCAqIHJldHJ5X2ludGVydmFsIGZvciB0aGUgdGVzdCBzdWl0ZSB0byBjb21wbGV0ZQogICBmdW5jdGlvbiBUZXN0Rm9yQ29tcGxldGlvbigpIHsKLSAgICBpZih0ZXN0X2NvbXBsZXRlICYmIGNhbGxiYWNrKSB7CisgICAgaWYgKHRlc3RfY29tcGxldGUgJiYgY2FsbGJhY2spIHsKICAgICAgIGNhbGxiYWNrKCJTZXJ2ZXIgc3VjY2Vzc2Z1bGx5IHRlc3RlZCEiKTsKICAgICB9IGVsc2UgewogICAgICAgaWYgKCsrcmV0cnlzIDwgcmV0cnlfbGltaXQpIHsKICAgICAgICAgc2V0VGltZW91dChUZXN0Rm9yQ29tcGxldGlvbiwgcmV0cnlfaW50ZXJ2YWwpOwogICAgICAgfSBlbHNlIGlmIChjYWxsYmFjaykgewotICAgICAgICBjYWxsYmFjaygiU2VydmVyIHRlc3QgZmFpbGVkIHRvIGNvbXBsZXRlIGFmdGVyICIgKwotICAgICAgICAgICAgICAgICAocmV0cnlfbGltaXQgKiByZXRyeV9pbnRlcnZhbCAvIDEwMDApICsgIiBzZWNvbmRzIik7CisgICAgICAgIGNhbGxiYWNrKAorICAgICAgICAgICJTZXJ2ZXIgdGVzdCBmYWlsZWQgdG8gY29tcGxldGUgYWZ0ZXIgIiArCisgICAgICAgICAgICAocmV0cnlfbGltaXQgKiByZXRyeV9pbnRlcnZhbCkgLyAxMDAwICsKKyAgICAgICAgICAgICIgc2Vjb25kcyIKKyAgICAgICAgKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAogICBzZXRUaW1lb3V0KFRlc3RGb3JDb21wbGV0aW9uLCByZXRyeV9pbnRlcnZhbCk7CiB9CisKK2Z1bmN0aW9uIG1ha2VVbm9yZGVyZWREZWVwRXF1YWwoYXNzZXJ0KSB7CisgIHJldHVybiBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkLCBuYW1lKSB7CisgICAgYXNzZXJ0LmVxdWFsKGFjdHVhbC5sZW5ndGgsIGV4cGVjdGVkLmxlbmd0aCwgbmFtZSk7CisgICAgZm9yIChjb25zdCBrIGluIGFjdHVhbCkgeworICAgICAgbGV0IGZvdW5kID0gZmFsc2U7CisgICAgICBmb3IgKGNvbnN0IGsyIGluIGV4cGVjdGVkKSB7CisgICAgICAgIGlmIChhY3R1YWxba10gPT09IGV4cGVjdGVkW2syXSkgeworICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBhc3NlcnQuZmFpbCgiVW5leHBlY3RlZCB2YWx1ZSAiICsgYWN0dWFsW2tdICsgIiB3aXRoIGtleSAiICsgayk7CisgICAgICB9CisgICAgfQorICB9OworfQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3Rlc3RfaGFuZGxlci5qcyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0X2hhbmRsZXIuanMKaW5kZXggMjExMzI1My4uMzE3YTdjOCAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy90ZXN0L3Rlc3RfaGFuZGxlci5qcworKysgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCkBAIC0xOSwxOCArMTksMTcgQEAKIAogLy9UaGlzIGlzIHRoZSBzZXJ2ZXIgc2lkZSBOb2RlIHRlc3QgaGFuZGxlciBmb3IgdGhlIHN0YW5kYXJkCiAvLyAgQXBhY2hlIFRocmlmdCB0ZXN0IHNlcnZpY2UuCitjb25zdCBoZWxwZXJzID0gcmVxdWlyZSgiLi9oZWxwZXJzIik7Citjb25zdCB0dHlwZXMgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9UaHJpZnRUZXN0X3R5cGVzYCk7Citjb25zdCBURXhjZXB0aW9uID0gcmVxdWlyZSgidGhyaWZ0IikuVGhyaWZ0LlRFeGNlcHRpb247CiAKLXZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOwotdmFyIFRFeGNlcHRpb24gPSByZXF1aXJlKCd0aHJpZnQnKS5UaHJpZnQuVEV4Y2VwdGlvbjsKLQotZnVuY3Rpb24gbWFrZVN5bmNIYW5kbGVyKGxhYmVsKSB7CitmdW5jdGlvbiBtYWtlU3luY0hhbmRsZXIoKSB7CiAgIHJldHVybiBmdW5jdGlvbih0aGluZykgewotICAgIC8vY29uc29sZS5sb2cobGFiZWwgKyAnKFwnJyArIHRoaW5nICsgJ1wnKScpOwogICAgIHJldHVybiB0aGluZzsKLSAgfQorICB9OwogfQogCi12YXIgc3luY0hhbmRsZXJzID0geworY29uc3Qgc3luY0hhbmRsZXJzID0gewogICB0ZXN0Vm9pZDogdGVzdFZvaWQsCiAgIHRlc3RNYXBNYXA6IHRlc3RNYXBNYXAsCiAgIHRlc3RJbnNhbml0eTogdGVzdEluc2FuaXR5LApAQCAtNDQsMTAgKzQzLDEwIEBACiAgIHJldHVybiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CiAgICAgdGhpbmcgPSBzeW5jSGFuZGxlcnNbbGFiZWxdKHRoaW5nKTsKICAgICByZXN1bHQobnVsbCwgdGhpbmcpOwotICB9CisgIH07CiB9CiAKLXZhciBhc3luY0hhbmRsZXJzID0geworY29uc3QgYXN5bmNIYW5kbGVycyA9IHsKICAgdGVzdFZvaWQ6IHRlc3RWb2lkQXN5bmMsCiAgIHRlc3RNdWx0aTogdGVzdE11bHRpQXN5bmMsCiAgIHRlc3RFeGNlcHRpb246IHRlc3RFeGNlcHRpb25Bc3luYywKQEAgLTU1LDIxICs1NCwyMiBAQAogICB0ZXN0T25ld2F5OiB0ZXN0T25ld2F5QXN5bmMKIH07CiAKLXZhciBpZGVudGl0eUhhbmRsZXJzID0gWwotICAndGVzdFN0cmluZycsCi0gICd0ZXN0Qm9vbCcsCi0gICd0ZXN0Qnl0ZScsCi0gICd0ZXN0STMyJywKLSAgJ3Rlc3RJNjQnLAotICAndGVzdERvdWJsZScsCi0gICd0ZXN0U3RydWN0JywKLSAgJ3Rlc3ROZXN0JywKLSAgJ3Rlc3RNYXAnLAotICAndGVzdFN0cmluZ01hcCcsCi0gICd0ZXN0U2V0JywKLSAgJ3Rlc3RMaXN0JywKLSAgJ3Rlc3RFbnVtJywKLSAgJ3Rlc3RUeXBlZGVmJworY29uc3QgaWRlbnRpdHlIYW5kbGVycyA9IFsKKyAgInRlc3RTdHJpbmciLAorICAidGVzdEJvb2wiLAorICAidGVzdEJ5dGUiLAorICAidGVzdEkzMiIsCisgICJ0ZXN0STY0IiwKKyAgInRlc3REb3VibGUiLAorICAidGVzdEJpbmFyeSIsCisgICJ0ZXN0U3RydWN0IiwKKyAgInRlc3ROZXN0IiwKKyAgInRlc3RNYXAiLAorICAidGVzdFN0cmluZ01hcCIsCisgICJ0ZXN0U2V0IiwKKyAgInRlc3RMaXN0IiwKKyAgInRlc3RFbnVtIiwKKyAgInRlc3RUeXBlZGVmIgogXTsKIAogZnVuY3Rpb24gdGVzdFZvaWQoKSB7CkBAIC04MCwxMyArODAsMTEgQEAKICAgcmVzdWx0KHRlc3RWb2lkKCkpOwogfQogCi1mdW5jdGlvbiB0ZXN0TWFwTWFwKGhlbGxvKSB7Ci0gIC8vY29uc29sZS5sb2coJ3Rlc3RNYXBNYXAoJyArIGhlbGxvICsgJyknKTsKLQotICB2YXIgbWFwbWFwID0gW107Ci0gIHZhciBwb3MgPSBbXTsKLSAgdmFyIG5lZyA9IFtdOwotICBmb3IgKHZhciBpID0gMTsgaSA8IDU7IGkrKykgeworZnVuY3Rpb24gdGVzdE1hcE1hcCgpIHsKKyAgY29uc3QgbWFwbWFwID0gW107CisgIGNvbnN0IHBvcyA9IFtdOworICBjb25zdCBuZWcgPSBbXTsKKyAgZm9yIChsZXQgaSA9IDE7IGkgPCA1OyBpKyspIHsKICAgICBwb3NbaV0gPSBpOwogICAgIG5lZ1staV0gPSAtaTsKICAgfQpAQCAtMTAxLDI4ICs5OSwxNiBAQAogICAvL2NvbnNvbGUubG9nKGFyZ3VtZW50KTsKICAgLy9jb25zb2xlLmxvZygnKScpOwogCi0gIHZhciBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7Ci0gIGhlbGxvLnN0cmluZ190aGluZyA9ICdIZWxsbzInOwotICBoZWxsby5ieXRlX3RoaW5nID0gMjsKLSAgaGVsbG8uaTMyX3RoaW5nID0gMjsKLSAgaGVsbG8uaTY0X3RoaW5nID0gMjsKLQotICB2YXIgZ29vZGJ5ZSA9IG5ldyB0dHlwZXMuWHRydWN0KCk7Ci0gIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gJ0dvb2RieWU0JzsKLSAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKLSAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OwotICBnb29kYnllLmk2NF90aGluZyA9IDQ7Ci0KLSAgdmFyIGZpcnN0X21hcCA9IFtdOwotICB2YXIgc2Vjb25kX21hcCA9IFtdOworICBjb25zdCBmaXJzdF9tYXAgPSBbXTsKKyAgY29uc3Qgc2Vjb25kX21hcCA9IFtdOwogCiAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5UV09dID0gYXJndW1lbnQ7CiAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKIAotICB2YXIgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICBjb25zdCBsb29uZXkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CiAgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsKIAotICB2YXIgaW5zYW5lID0gW107CisgIGNvbnN0IGluc2FuZSA9IFtdOwogICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CiAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CiAKQEAgLTEzMSwxMSArMTE3LDExIEBACiAgIHJldHVybiBpbnNhbmU7CiB9CiAKLWZ1bmN0aW9uIHRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KSB7CitmdW5jdGlvbiB0ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMikgewogICAvL2NvbnNvbGUubG9nKCd0ZXN0TXVsdGkoKScpOwogCi0gIHZhciBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7Ci0gIGhlbGxvLnN0cmluZ190aGluZyA9ICdIZWxsbzInOworICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOwogICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKICAgaGVsbG8uaTY0X3RoaW5nID0gYXJnMjsKQEAgLTE0MywxOCArMTI5LDE4IEBACiB9CiAKIGZ1bmN0aW9uIHRlc3RNdWx0aUFzeW5jKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIHJlc3VsdCkgewotICB2YXIgaGVsbG8gPSB0ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CisgIGNvbnN0IGhlbGxvID0gdGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICByZXN1bHQobnVsbCwgaGVsbG8pOwogfQogCiBmdW5jdGlvbiB0ZXN0RXhjZXB0aW9uKGFyZykgewogICAvL2NvbnNvbGUubG9nKCd0ZXN0RXhjZXB0aW9uKCcrYXJnKycpJyk7Ci0gIGlmIChhcmcgPT09ICdYY2VwdGlvbicpIHsKLSAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgaWYgKGFyZyA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CiAgICAgeC5lcnJvckNvZGUgPSAxMDAxOwogICAgIHgubWVzc2FnZSA9IGFyZzsKICAgICB0aHJvdyB4OwotICB9IGVsc2UgaWYgKGFyZyA9PT0gJ1RFeGNlcHRpb24nKSB7CisgIH0gZWxzZSBpZiAoYXJnID09PSAiVEV4Y2VwdGlvbiIpIHsKICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbihhcmcpOwogICB9IGVsc2UgewogICAgIHJldHVybjsKQEAgLTE2MywxMiArMTQ5LDEyIEBACiAKIGZ1bmN0aW9uIHRlc3RFeGNlcHRpb25Bc3luYyhhcmcsIHJlc3VsdCkgewogICAvL2NvbnNvbGUubG9nKCd0ZXN0RXhjZXB0aW9uKCcrYXJnKycpJyk7Ci0gIGlmIChhcmcgPT09ICdYY2VwdGlvbicpIHsKLSAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgaWYgKGFyZyA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CiAgICAgeC5lcnJvckNvZGUgPSAxMDAxOwogICAgIHgubWVzc2FnZSA9IGFyZzsKICAgICByZXN1bHQoeCk7Ci0gIH0gZWxzZSBpZiAoYXJnID09PSAnVEV4Y2VwdGlvbicpIHsKKyAgfSBlbHNlIGlmIChhcmcgPT09ICJURXhjZXB0aW9uIikgewogICAgIHJlc3VsdChuZXcgVEV4Y2VwdGlvbihhcmcpKTsKICAgfSBlbHNlIHsKICAgICByZXN1bHQobnVsbCk7CkBAIC0xNzcsNDkgKzE2Myw0OCBAQAogCiBmdW5jdGlvbiB0ZXN0TXVsdGlFeGNlcHRpb24oYXJnMCwgYXJnMSkgewogICAvL2NvbnNvbGUubG9nKCd0ZXN0TXVsdGlFeGNlcHRpb24oJyArIGFyZzAgKyAnLCAnICsgYXJnMSArICcpJyk7Ci0gIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uJykpIHsKLSAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgaWYgKGFyZzAgPT09ICJYY2VwdGlvbiIpIHsKKyAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOwogICAgIHguZXJyb3JDb2RlID0gMTAwMTsKLSAgICB4Lm1lc3NhZ2UgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbic7CisgICAgeC5tZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOwogICAgIHRocm93IHg7Ci0gIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgewotICAgIHZhciB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CisgIH0gZWxzZSBpZiAoYXJnMCA9PT0gIlhjZXB0aW9uMiIpIHsKKyAgICBjb25zdCB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CiAgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOwotICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInOworICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOwogICAgIHRocm93IHgyOwogICB9CiAKLSAgdmFyIHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgIGNvbnN0IHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CiAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOwogICByZXR1cm4gcmVzOwogfQogCiBmdW5jdGlvbiB0ZXN0TXVsdGlFeGNlcHRpb25Bc3luYyhhcmcwLCBhcmcxLCByZXN1bHQpIHsKICAgLy9jb25zb2xlLmxvZygndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOwotICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7Ci0gICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgIGlmIChhcmcwID09PSAiWGNlcHRpb24iKSB7CisgICAgY29uc3QgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKICAgICB4LmVycm9yQ29kZSA9IDEwMDE7Ci0gICAgeC5tZXNzYWdlID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nOworICAgIHgubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKICAgICByZXN1bHQoeCk7Ci0gIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgewotICAgIHZhciB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CisgIH0gZWxzZSBpZiAoYXJnMCA9PT0gIlhjZXB0aW9uMiIpIHsKKyAgICBjb25zdCB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CiAgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOwotICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInOworICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOwogICAgIHJlc3VsdCh4Mik7CiAgIH0gZWxzZSB7Ci0gICAgdmFyIHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgY29uc3QgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKICAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKICAgICByZXN1bHQobnVsbCwgcmVzKTsKICAgfQogfQogCi1mdW5jdGlvbiB0ZXN0T25ld2F5KHNsZWVwRm9yKSB7Ci0gIC8vY29uc29sZS5sb2coJ3Rlc3RPbmV3YXkoJyArIHNsZWVwRm9yICsgJykgPT4gSmF2YVNjcmlwdCAobGlrZSBSdXN0KSBuZXZlciBzbGVlcHMhJyk7Ci19CisvL2NvbnNvbGUubG9nKCd0ZXN0T25ld2F5KCcgKyBzbGVlcEZvciArICcpID0+IEphdmFTY3JpcHQgKGxpa2UgUnVzdCkgbmV2ZXIgc2xlZXBzIScpOworZnVuY3Rpb24gdGVzdE9uZXdheSgpIHt9CiAKLWZ1bmN0aW9uIHRlc3RPbmV3YXlBc3luYyhzbGVlcEZvciwgcmVzdWx0KSB7CitmdW5jdGlvbiB0ZXN0T25ld2F5QXN5bmMoc2xlZXBGb3IpIHsKICAgdGVzdE9uZXdheShzbGVlcEZvcik7CiB9CiAKQEAgLTIyOCwxMSArMjEzLDggQEAKICAgYXN5bmNIYW5kbGVyc1tsYWJlbF0gPSBtYWtlQXN5bmNIYW5kbGVyKGxhYmVsKTsKIH0pOwogCi1bJ3Rlc3RNYXBNYXAnLCAndGVzdEluc2FuaXR5J10uZm9yRWFjaChmdW5jdGlvbihsYWJlbCkgeworWyJ0ZXN0TWFwTWFwIiwgInRlc3RJbnNhbml0eSJdLmZvckVhY2goZnVuY3Rpb24obGFiZWwpIHsKICAgYXN5bmNIYW5kbGVyc1tsYWJlbF0gPSBtYWtlQXN5bmNIYW5kbGVyKGxhYmVsKTsKIH0pOwogCiBleHBvcnRzLlRocmlmdFRlc3RIYW5kbGVyID0gYXN5bmNIYW5kbGVyczsKLQotZXhwb3J0cy5Bc3luY1RocmlmdFRlc3RIYW5kbGVyID0gYXN5bmNIYW5kbGVyczsKLWV4cG9ydHMuU3luY1RocmlmdFRlc3RIYW5kbGVyID0gYXN5bmNIYW5kbGVyczsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90ZXN0X2hlYWRlcl9wYXlsb2FkIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RfaGVhZGVyX3BheWxvYWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkNWVmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0X2hlYWRlcl9wYXlsb2FkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvLmdpdGlnbm9yZSBiL2xpYi9ub2RldHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2FiYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK3Rlc3QtY29tcGlsZWQvCmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL01ha2VmaWxlLmFtIGIvbGliL25vZGV0cy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MzlkZmYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ2IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBXZSBjYWxsIG5wbSB0d2ljZSB0byB3b3JrIGFyb3VuZCBucG0gaXNzdWVzCisKK3N0dWJzOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwlta2RpciAtcCB0ZXN0LWNvbXBpbGVkCisJJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUsdHMgLW8gdGVzdC8gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICYmICQoVEhSSUZUKSAtLWdlbiBqczpub2RlLHRzIC1vIHRlc3QtY29tcGlsZWQgJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUsdHMgLW8gdGVzdC8gJCh0b3Bfc3JjZGlyKS90ZXN0L0ludDY0VGVzdC50aHJpZnQgJiYgJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUsdHMgLW8gdGVzdC1jb21waWxlZCAkKHRvcF9zcmNkaXIpL3Rlc3QvSW50NjRUZXN0LnRocmlmdAorCit0cy1jb21waWxlOiBzdHVicworCW1rZGlyIC1wIHRlc3QtY29tcGlsZWQKKwkuLi8uLi9ub2RlX21vZHVsZXMvdHlwZXNjcmlwdC9iaW4vdHNjIC0tb3V0RGlyIHRlc3QtY29tcGlsZWQvIC0tcHJvamVjdCB0ZXN0L3RzY29uZmlnLmpzb24KKworZGVwczogJCh0b3Bfc3JjZGlyKS9wYWNrYWdlLmpzb24KKwkkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLyB8fCAkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLworCithbGwtbG9jYWw6IGRlcHMgdHMtY29tcGlsZQorCitwcmVjcm9zczogZGVwcyBzdHVicyB0cy1jb21waWxlCisKK2NoZWNrOiBkZXBzIHRzLWNvbXBpbGUKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoTlBNKSBydW4gdGVzdC10cyAmJiBjZCBsaWIvbm9kZXRzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIHRlc3QvZ2VuLW5vZGVqcworCSQoUk0pIC1yICQodG9wX3NyY2Rpcikvbm9kZV9tb2R1bGVzCisJJChSTSkgLXIgdGVzdC1jb21waWxlZAorCitFWFRSQV9ESVNUID0gXAorCXRlc3QgXAorCWNvZGluZ19zdGFuZGFyZHMubWQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL25vZGV0cy9jb2Rpbmdfc3RhbmRhcmRzLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvY29jb2EvY29kaW5nX3N0YW5kYXJkcy5tZApyZW5hbWUgdG8gbGliL25vZGV0cy9jb2Rpbmdfc3RhbmRhcmRzLm1kCmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvY2xpZW50LnRzIGIvbGliL25vZGV0cy90ZXN0L2NsaWVudC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmEzYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L2NsaWVudC50cwpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBhc3NlcnQgPSByZXF1aXJlKCJhc3NlcnQiKTsKK2ltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2ltcG9ydCBUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0OworaW1wb3J0IFRocmlmdFRlc3QgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdCIpOworaW1wb3J0IHRlc3RfZHJpdmVyID0gcmVxdWlyZSgiLi90ZXN0X2RyaXZlciIpOworaW1wb3J0IFRocmlmdFRlc3REcml2ZXIgPSB0ZXN0X2RyaXZlci5UaHJpZnRUZXN0RHJpdmVyOworaW1wb3J0IFRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gdGVzdF9kcml2ZXIuVGhyaWZ0VGVzdERyaXZlclByb21pc2U7CisKKy8vIHZhciBwcm9ncmFtID0gcmVxdWlyZSgiY29tbWFuZGVyIik7CitpbXBvcnQgKiBhcyBwcm9ncmFtIGZyb20gImNvbW1hbmRlciI7CisKK3Byb2dyYW0KKyAgLm9wdGlvbigiLS1wb3J0IDxwb3J0PiIsICJTZXQgdGhyaWZ0IHNlcnZlciBwb3J0IG51bWJlciB0byBjb25uZWN0IiwgOTA5MCkKKyAgLm9wdGlvbigiLS1wcm9taXNlIiwgInRlc3Qgd2l0aCBwcm9taXNlIHN0eWxlIGZ1bmN0aW9ucyIpCisgIC5vcHRpb24oIi0tcHJvdG9jb2wiLCAiU2V0IHRocmlmdCBwcm90b2NvbCAoYmluYXJ5KSBbcHJvdG9jb2xdIikKKyAgLnBhcnNlKHByb2Nlc3MuYXJndik7CisKK3ZhciBwb3J0OiBudW1iZXIgPSBwcm9ncmFtLnBvcnQ7Cit2YXIgcHJvbWlzZSA9IHByb2dyYW0ucHJvbWlzZTsKKwordmFyIG9wdGlvbnMgPSB7CisgIHRyYW5zcG9ydDogVGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKyAgcHJvdG9jb2w6IFRocmlmdC5UQmluYXJ5UHJvdG9jb2wKK307CisKK3ZhciB0ZXN0RHJpdmVyID0gcHJvbWlzZSA/IFRocmlmdFRlc3REcml2ZXJQcm9taXNlIDogVGhyaWZ0VGVzdERyaXZlcjsKKwordmFyIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbigibG9jYWxob3N0IiwgcG9ydCwgb3B0aW9ucyk7CisKK2Nvbm5lY3Rpb24ub24oImVycm9yIiwgZnVuY3Rpb24oZXJyOiBzdHJpbmcpIHsKKyAgICBhc3NlcnQoZmFsc2UsIGVycik7Cit9KTsKKwordmFyIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoVGhyaWZ0VGVzdC5DbGllbnQsIGNvbm5lY3Rpb24pOworcnVuVGVzdHMoKTsKKworZnVuY3Rpb24gcnVuVGVzdHMoKSB7CisgIHRlc3REcml2ZXIoY2xpZW50LCBmdW5jdGlvbiAoc3RhdHVzOiBzdHJpbmcpIHsKKyAgICBjb25zb2xlLmxvZyhzdGF0dXMpOworICAgIHByb2Nlc3MuZXhpdCgwKTsKKyAgfSk7Cit9CisKK2V4cG9ydHMuZXhwcmVzc29UZXN0ID0gZnVuY3Rpb24oKSB7fTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC9pbnQ2NC50ZXN0LnRzIGIvbGliL25vZGV0cy90ZXN0L2ludDY0LnRlc3QudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwOTIzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC9pbnQ2NC50ZXN0LnRzCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOworaW1wb3J0IEpTT05JbnQ2NCA9IHJlcXVpcmUoJ2pzb24taW50NjQnKTsKK2ltcG9ydCBpNjR0eXBlcyA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9JbnQ2NFRlc3RfdHlwZXMiKTsKK2ltcG9ydCB0ZXN0ID0gcmVxdWlyZSgidGFwZSIpOworCitjb25zdCBjYXNlcyA9IHsKKyAgInNob3VsZCBjb3JyZWN0bHkgZ2VuZXJhdGUgSW50NjQgY29uc3RhbnRzIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgRVhQRUNURURfU01BTExfSU5UNjRfQVNfTlVNQkVSOiBudW1iZXIgPSA0MjsKKyAgICBjb25zdCBFWFBFQ1RFRF9TTUFMTF9JTlQ2NDogSW50NjQgPSBuZXcgSW50NjQoNDIpOworICAgIGNvbnN0IEVYUEVDVEVEX01BWF9KU19TQUZFX0lOVDY0OiBJbnQ2NCA9IG5ldyBJbnQ2NChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7CisgICAgY29uc3QgRVhQRUNURURfTUlOX0pTX1NBRkVfSU5UNjQ6IEludDY0ID0gbmV3IEludDY0KE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKTsKKyAgICBjb25zdCBFWFBFQ1RFRF9NQVhfSlNfU0FGRV9QTFVTX09ORV9JTlQ2NDogSW50NjQgPSBuZXcgSW50NjQoIjAwMjAwMDAwMDAwMDAwMDAiKTsgLy8gaGV4LWVuY29kZWQKKyAgICBjb25zdCBFWFBFQ1RFRF9NSU5fSlNfU0FGRV9NSU5VU19PTkVfSU5UNjQ6IEludDY0ID0gbmV3IEludDY0KCJmZmUwMDAwMDAwMDAwMDAwIik7IC8vIGhleC1lbmNvZGVkIDIncyBjb21wbGVtZW50CisgICAgY29uc3QgRVhQRUNURURfTUFYX1NJR05FRF9JTlQ2NDogSW50NjQgPSBuZXcgSW50NjQoIjdmZmZmZmZmZmZmZmZmZmYiKTsgLy8gaGV4LWVuY29kZWQKKyAgICBjb25zdCBFWFBFQ1RFRF9NSU5fU0lHTkVEX0lOVDY0OiBJbnQ2NCA9IG5ldyBJbnQ2NCgiODAwMDAwMDAwMDAwMDAwMCIpOyAvLyBoZXgtZW5jb2RlZCAyJ3MgY29tcGxlbWVudAorICAgIGNvbnN0IEVYUEVDVEVEX0lOVDY0X0xJU1Q6IEludDY0W10gPSBbCisgICAgICBFWFBFQ1RFRF9TTUFMTF9JTlQ2NCwKKyAgICAgIEVYUEVDVEVEX01BWF9KU19TQUZFX0lOVDY0LAorICAgICAgRVhQRUNURURfTUlOX0pTX1NBRkVfSU5UNjQsCisgICAgICBFWFBFQ1RFRF9NQVhfSlNfU0FGRV9QTFVTX09ORV9JTlQ2NCwKKyAgICAgIEVYUEVDVEVEX01JTl9KU19TQUZFX01JTlVTX09ORV9JTlQ2NCwKKyAgICAgIEVYUEVDVEVEX01BWF9TSUdORURfSU5UNjQsCisgICAgICBFWFBFQ1RFRF9NSU5fU0lHTkVEX0lOVDY0CisgICAgXTsKKworICAgIGFzc2VydC5vayhFWFBFQ1RFRF9TTUFMTF9JTlQ2NC5lcXVhbHMoaTY0dHlwZXMuU01BTExfSU5UNjQpKTsKKyAgICBhc3NlcnQub2soRVhQRUNURURfTUFYX0pTX1NBRkVfSU5UNjQuZXF1YWxzKGk2NHR5cGVzLk1BWF9KU19TQUZFX0lOVDY0KSk7CisgICAgYXNzZXJ0Lm9rKEVYUEVDVEVEX01JTl9KU19TQUZFX0lOVDY0LmVxdWFscyhpNjR0eXBlcy5NSU5fSlNfU0FGRV9JTlQ2NCkpOworICAgIGFzc2VydC5vaygKKyAgICAgIEVYUEVDVEVEX01BWF9KU19TQUZFX1BMVVNfT05FX0lOVDY0LmVxdWFscygKKyAgICAgICAgaTY0dHlwZXMuTUFYX0pTX1NBRkVfUExVU19PTkVfSU5UNjQKKyAgICAgICkKKyAgICApOworICAgIGFzc2VydC5vaygKKyAgICAgIEVYUEVDVEVEX01JTl9KU19TQUZFX01JTlVTX09ORV9JTlQ2NC5lcXVhbHMoCisgICAgICAgIGk2NHR5cGVzLk1JTl9KU19TQUZFX01JTlVTX09ORV9JTlQ2NAorICAgICAgKQorICAgICk7CisgICAgYXNzZXJ0Lm9rKEVYUEVDVEVEX01BWF9TSUdORURfSU5UNjQuZXF1YWxzKGk2NHR5cGVzLk1BWF9TSUdORURfSU5UNjQpKTsKKyAgICBhc3NlcnQub2soRVhQRUNURURfTUlOX1NJR05FRF9JTlQ2NC5lcXVhbHMoaTY0dHlwZXMuTUlOX1NJR05FRF9JTlQ2NCkpOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIEVYUEVDVEVEX1NNQUxMX0lOVDY0X0FTX05VTUJFUiwKKyAgICAgIGk2NHR5cGVzLlNNQUxMX0lOVDY0LnRvTnVtYmVyKCkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLAorICAgICAgaTY0dHlwZXMuTUFYX0pTX1NBRkVfSU5UNjQudG9OdW1iZXIoKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsCisgICAgICBpNjR0eXBlcy5NSU5fSlNfU0FGRV9JTlQ2NC50b051bWJlcigpCisgICAgKTsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRVhQRUNURURfSU5UNjRfTElTVC5sZW5ndGg7ICsraSkgeworICAgICAgYXNzZXJ0Lm9rKEVYUEVDVEVEX0lOVDY0X0xJU1RbaV0uZXF1YWxzKGk2NHR5cGVzLklOVDY0X0xJU1RbaV0pKTsKKyAgICB9CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IEVYUEVDVEVEX0lOVDY0X0xJU1QubGVuZ3RoOyArK2kpeworICAgICAgbGV0IGludDY0T2JqZWN0ID0gRVhQRUNURURfSU5UNjRfTElTVFtpXTsKKyAgICAgIGFzc2VydC5vayhpNjR0eXBlcy5JTlQ2NF8yX0lOVDY0X01BUFtKU09OSW50NjQudG9EZWNpbWFsU3RyaW5nKGludDY0T2JqZWN0KV0uZXF1YWxzKGludDY0T2JqZWN0KSk7CisgICAgfQorCisgICAgYXNzZXJ0LmVuZCgpOworICB9Cit9OworCitPYmplY3Qua2V5cyhjYXNlcykuZm9yRWFjaChmdW5jdGlvbihjYXNlTmFtZSkgeworICB0ZXN0KGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOworfSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvcnVuQ2xpZW50LnNoIGIvbGliL25vZGV0cy90ZXN0L3J1bkNsaWVudC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZDVlOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3J1bkNsaWVudC5zaApAQCAtMCwwICsxLDE4IEBACisjISAvYmluL3NoCisKK0RJUj0iJCggY2QgIiQoIGRpcm5hbWUgIiQwIiApIiAmJiBwd2QgKSIKKworbWtkaXIgLXAgJERJUi8uLi90ZXN0LWNvbXBpbGVkCisKK0NPTVBJTEVERElSPSIkKGNkICRESVIgJiYgY2QgLi4vdGVzdC1jb21waWxlZCAmJiBwd2QpIgorZXhwb3J0IE5PREVfUEFUSD0iJHtESVJ9OiR7RElSfS8uLi8uLi9ub2RlanMvbGliOiR7Tk9ERV9QQVRIfSIKKworY29tcGlsZSgpCit7CisgICNnZW5lcmF0aW5nIHRocmlmdCBjb2RlCisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7Q09NUElMRURESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK30KK2NvbXBpbGUKKworbm9kZSAke0NPTVBJTEVERElSfS9jbGllbnQuanMgJCoKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC9ydW5TZXJ2ZXIuc2ggYi9saWIvbm9kZXRzL3Rlc3QvcnVuU2VydmVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlZWU5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvcnVuU2VydmVyLnNoCkBAIC0wLDAgKzEsMjAgQEAKKyMhIC9iaW4vc2gKKworRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApIgorCitta2RpciAtcCAkRElSLy4uL3Rlc3QtY29tcGlsZWQKKworQ09NUElMRURESVI9IiQoY2QgJERJUiAmJiBjZCAuLi90ZXN0LWNvbXBpbGVkICYmIHB3ZCkiCitleHBvcnQgTk9ERV9QQVRIPSIke0RJUn06JHtESVJ9Ly4uLy4uL25vZGVqcy9saWI6JHtOT0RFX1BBVEh9IgorCitjb21waWxlKCkKK3sKKyAgI2dlbmVyYXRpbmcgdGhyaWZ0IGNvZGUKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtDT01QSUxFRERJUn0gLS1nZW4ganM6bm9kZSx0cyAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorfQorY29tcGlsZQorCitub2RlICR7Q09NUElMRURESVJ9L3NlcnZlci5qcyAkKgorCisKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC9zZXJ2ZXIudHMgYi9saWIvbm9kZXRzL3Rlc3Qvc2VydmVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTUzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3Qvc2VydmVyLnRzCkBAIC0wLDAgKzEsMjYgQEAKK2ltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK3ZhciBwcm9ncmFtID0gcmVxdWlyZSgnY29tbWFuZGVyJyk7CitpbXBvcnQgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0Jyk7CitpbXBvcnQgdGVzdF9oYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKTsKKworCitwcm9ncmFtCisgIC5vcHRpb24oJy0tcG9ydCA8cG9ydD4nLCAnU2V0IHRocmlmdCBzZXJ2ZXIgcG9ydCcsIDkwOTApCisgIC5vcHRpb24oJy0tcHJvbWlzZScsICd0ZXN0IHdpdGggcHJvbWlzZSBzdHlsZSBmdW5jdGlvbnMnKQorICAub3B0aW9uKCctLXByb3RvY29sJywgJyJTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnkpIFtwcm90b2NvbF0iJykKKyAgLnBhcnNlKHByb2Nlc3MuYXJndik7CisKK3ZhciBwb3J0OiBudW1iZXIgPSBwcm9ncmFtLnBvcnQ7CisKK3ZhciBvcHRpb25zOiB0aHJpZnQuU2VydmVyT3B0aW9ucyA9IHsKKyAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICBwcm90b2NvbDogdGhyaWZ0LlRCaW5hcnlQcm90b2NvbAorfTsKKwordmFyIHNlcnZlcjogdGhyaWZ0LlNlcnZlcjsKK2lmIChwcm9ncmFtLnByb21pc2UpIHsKKyAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihUaHJpZnRUZXN0LlByb2Nlc3NvciwgbmV3IHRlc3RfaGFuZGxlci5Bc3luY1RocmlmdFRlc3RIYW5kbGVyKCksIG9wdGlvbnMpOworfSBlbHNlIHsKKyAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihUaHJpZnRUZXN0LlByb2Nlc3NvciwgbmV3IHRlc3RfaGFuZGxlci5TeW5jVGhyaWZ0VGVzdEhhbmRsZXIoKSwgb3B0aW9ucyk7Cit9CitzZXJ2ZXIubGlzdGVuKHBvcnQpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3Rlc3QtY2FzZXMudHMgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdC1jYXNlcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGYyNTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3Rlc3QtY2FzZXMudHMKQEAgLTAsMCArMSwxMTQgQEAKKyd1c2Ugc3RyaWN0JzsKKworaW1wb3J0IHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzJyk7CitpbXBvcnQgSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7CisKKy8vYWxsIExhbmd1YWdlcyBpbiBVVEYtOAorLypqc2hpbnQgLVcxMDAgKi8KK2V4cG9ydCB2YXIgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIiArCisgICAgIkFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCAiICsKKyAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKyAgICAi4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiICsKKyAgICAiQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCAiICsKKyAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKyAgICAiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiICsKKyAgICAiRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCAiICsKKyAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisgICAgIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIgKworICAgICJJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsICIgKworICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworICAgICJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIgKworICAgICJMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSAiICsKKyAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworICAgICJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiICsKKyAgICAiTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCAiICsKKyAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworICAgICJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIiArCisgICAgItCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgIiArCisgICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisgICAgIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIiArCisgICAgIlTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssICIgKworICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKyAgICAiQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKy8qanNoaW50ICtXMTAwICovCisKK2V4cG9ydCB2YXIgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKKyAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCcgKworICAgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXCIgfX19eyBbW1sgJzsKKworZXhwb3J0IHZhciBtYXBUZXN0SW5wdXQgPSB7CisgICJhIjoiMTIzIiwgImEgYiI6IndpdGggc3BhY2VzICIsICJzYW1lIjoic2FtZSIsICIwIjoibnVtZXJpYyBrZXkiLAorICAibG9uZ1ZhbHVlIjpzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiJsb25nIGtleSIKK307CisKK2V4cG9ydCB2YXIgc2ltcGxlID0gWworICBbJ3Rlc3RWb2lkJywgdW5kZWZpbmVkXSwKKyAgWyd0ZXN0U3RyaW5nJywgJ1Rlc3QnXSwKKyAgWyd0ZXN0U3RyaW5nJywgJyddLAorICBbJ3Rlc3RTdHJpbmcnLCBzdHJpbmdUZXN0XSwKKyAgWyd0ZXN0U3RyaW5nJywgc3BlY2lhbENoYXJhY3RlcnNdLAorICBbJ3Rlc3RCeXRlJywgMV0sCisgIFsndGVzdEJ5dGUnLCAwXSwKKyAgWyd0ZXN0Qnl0ZScsIC0xXSwKKyAgWyd0ZXN0Qnl0ZScsIC0xMjddLAorICBbJ3Rlc3RJMzInLCAtMV0sCisgIFsndGVzdERvdWJsZScsIC01LjIwOTg1MjNdLAorICBbJ3Rlc3REb3VibGUnLCA3LjAxMjA1MjE3NTIxNTA0NF0sCisgIFsndGVzdEVudW0nLCB0dHlwZXMuTnVtYmVyei5PTkVdCitdOworCitleHBvcnQgdmFyIHNpbXBsZUxvb3NlID0gWworICBbJ3Rlc3RJNjQnLCA1XSwKKyAgWyd0ZXN0STY0JywgLTVdLAorICBbJ3Rlc3RJNjQnLCA3MzQzNTk3MzgzNjhdLAorICBbJ3Rlc3RJNjQnLCAtMzQzNTk3MzgzNjhdLAorICBbJ3Rlc3RJNjQnLCAtNzM0MzU5NzM4MzY4XSwKKyAgWyd0ZXN0VHlwZWRlZicsIDY5XQorXQorCit2YXIgbWFwb3V0OiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0ge307Citmb3IgKHZhciBpID0gMDsgaSA8IDU7ICsraSkgeworICBtYXBvdXRbaV0gPSBpLTEwOworfQorCitleHBvcnQgdmFyIGRlZXAgPSBbCisgIFsndGVzdE1hcCcsIG1hcG91dF0sCisgIFsndGVzdFNldCcsIFsxLDIsM11dLAorICBbJ3Rlc3RMaXN0JywgWzEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwXV0sCisgIFsndGVzdFN0cmluZ01hcCcsIG1hcFRlc3RJbnB1dF0KK107CisKK2V4cG9ydCB2YXIgb3V0ID0gbmV3IHR0eXBlcy5YdHJ1Y3QoeworICBzdHJpbmdfdGhpbmc6ICdaZXJvJywKKyAgYnl0ZV90aGluZzogMSwKKyAgaTMyX3RoaW5nOiAtMywKKyAgaTY0X3RoaW5nOiBuZXcgSW50NjQoMTAwMDAwMCkKK30pOworCitleHBvcnQgdmFyIG91dDIgPSBuZXcgdHR5cGVzLlh0cnVjdDIoKTsKK291dDIuYnl0ZV90aGluZyA9IDE7CitvdXQyLnN0cnVjdF90aGluZyA9IG91dDsKK291dDIuaTMyX3RoaW5nID0gNTsKKworZXhwb3J0IHZhciBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoeworICAidXNlck1hcCI6eyAiNSI6bmV3IEludDY0KDUpLCAiOCI6bmV3IEludDY0KDgpIH0sCisgICJ4dHJ1Y3RzIjpbbmV3IHR0eXBlcy5YdHJ1Y3QoeworICAgICAgInN0cmluZ190aGluZyI6Ikdvb2RieWU0IiwKKyAgICAgICJieXRlX3RoaW5nIjo0LAorICAgICAgImkzMl90aGluZyI6NCwKKyAgICAgICJpNjRfdGhpbmciOm5ldyBJbnQ2NCg0KQorICAgIH0pLCBuZXcgdHR5cGVzLlh0cnVjdCh7CisgICAgICAic3RyaW5nX3RoaW5nIjoiSGVsbG8yIiwKKyAgICAgICJieXRlX3RoaW5nIjoyLAorICAgICAgImkzMl90aGluZyI6MiwKKyAgICAgICJpNjRfdGhpbmciOm5ldyBJbnQ2NCgyKQorICAgIH0pXQorfSk7CisKK2V4cG9ydCB2YXIgaW5zYW5pdHk6IGFueSA9IHsKKyAgIjEiOnsgIjIiOiBjcmF6eSwgIjMiOiBjcmF6eSB9LAorICAiMiI6eyAiNiI6eyAidXNlck1hcCI6e30sICJ4dHJ1Y3RzIjpbXSB9IH0KK307CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvdGVzdEFsbC5zaCBiL2xpYi9ub2RldHMvdGVzdC90ZXN0QWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiZTEyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdEFsbC5zaApAQCAtMCwwICsxLDQyIEBACisjISAvYmluL3NoCisKK0RJUj0iJCggY2QgIiQoIGRpcm5hbWUgIiQwIiApIiAmJiBwd2QgKSIKKworbWtkaXIgLXAgJERJUi8uLi90ZXN0LWNvbXBpbGVkCisKK0NPTVBJTEVERElSPSIkKGNkICRESVIgJiYgY2QgLi4vdGVzdC1jb21waWxlZCAmJiBwd2QpIgorZXhwb3J0IE5PREVfUEFUSD0iJHtESVJ9OiR7RElSfS8uLi8uLi9ub2RlanMvbGliOiR7Tk9ERV9QQVRIfSIKKworY29tcGlsZSgpCit7CisgICNnZW5lcmF0aW5nIHRocmlmdCBjb2RlCisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L0ludDY0VGVzdC50aHJpZnQKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtDT01QSUxFRERJUn0gLS1nZW4ganM6bm9kZSx0cyAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAke0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0NPTVBJTEVERElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L0ludDY0VGVzdC50aHJpZnQKKworICB0c2MgLS1vdXREaXIgJENPTVBJTEVERElSIC0tcHJvamVjdCAkRElSL3RzY29uZmlnLmpzb24KK30KK2NvbXBpbGUKKwordGVzdFNlcnZlcigpCit7CisgIGVjaG8gInN0YXJ0IHNlcnZlciAkMSIKKyAgUkVUPTAKKyAgbm9kZSAke0NPTVBJTEVERElSfS9zZXJ2ZXIuanMgJDEgJgorICBTRVJWRVJQSUQ9JCEKKyAgc2xlZXAgMQorICBlY2hvICJzdGFydCBjbGllbnQgJDEiCisgIG5vZGUgJHtDT01QSUxFRERJUn0vY2xpZW50LmpzICQxIHx8IFJFVD0xCisgIGtpbGwgLTIgJFNFUlZFUlBJRCB8fCBSRVQ9MQorICByZXR1cm4gJFJFVAorfQorCitub2RlICR7Q09NUElMRURESVJ9L2ludDY0LnRlc3QuanMgfHwgVEVTVE9LPTEKKworI2ludGVncmF0aW9uIHRlc3RzCisKK3Rlc3RTZXJ2ZXIgfHwgVEVTVE9LPTEKK3Rlc3RTZXJ2ZXIgLS1wcm9taXNlIHx8IFRFU1RPSz0xCisKK2V4aXQgJFRFU1RPSwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3Rlc3RfZHJpdmVyLnRzIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RfZHJpdmVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNDE1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdF9kcml2ZXIudHMKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworIC8vIFRoaXMgaXMgdGhlIE5vZGUuanMgdGVzdCBkcml2ZXIgZm9yIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0CisgLy8gdGVzdCBzZXJ2aWNlLiBUaGUgZHJpdmVyIGludm9rZXMgZXZlcnkgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGUKKyAvLyBUaHJpZnQgVGVzdCBzZXJ2aWNlIHdpdGggYSByZXByZXNlbnRhdGl2ZSByYW5nZSBvZiBwYXJhbWV0ZXJzLgorIC8vCisgLy8gVGhlIFRocmlmdFRlc3REcml2ZXIgZnVuY3Rpb24gcmVxdWlyZXMgYSBjbGllbnQgb2JqZWN0CisgLy8gY29ubmVjdGVkIHRvIGEgc2VydmVyIGhvc3RpbmcgdGhlIFRocmlmdCBUZXN0IHNlcnZpY2UgYW5kCisgLy8gc3VwcG9ydHMgYW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdpdGgKKyAvLyBhIHN0YXR1cyBtZXNzYWdlIHdoZW4gdGhlIHRlc3QgaXMgY29tcGxldGUuCisKK2ltcG9ydCB0ZXN0ID0gcmVxdWlyZSgidGFwZSIpOworaW1wb3J0IHR0eXBlcyA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzIik7CitpbXBvcnQgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0Iik7CitpbXBvcnQgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7CitpbXBvcnQgUSA9IHRocmlmdC5ROworaW1wb3J0IFRFeGNlcHRpb24gPSB0aHJpZnQuVGhyaWZ0LlRFeGNlcHRpb247Cit2YXIgSW50NjQgPSByZXF1aXJlKCJub2RlLWludDY0Iik7CitpbXBvcnQgdGVzdENhc2VzID0gcmVxdWlyZSgiLi90ZXN0LWNhc2VzIik7CisKK2V4cG9ydCBmdW5jdGlvbiBUaHJpZnRUZXN0RHJpdmVyKGNsaWVudDogVGhyaWZ0VGVzdC5DbGllbnQsIGNhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcpID0+IHZvaWQpIHsKKworICB0ZXN0KCJOb2RlSlMgU3R5bGUgQ2FsbGJhY2sgQ2xpZW50IFRlc3RzIiwgZnVuY3Rpb24oYXNzZXJ0KSB7CisKKyAgICB2YXIgY2hlY2tSZWN1cnNpdmVseSA9IG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpOworCisgICAgZnVuY3Rpb24gbWFrZUFzc2VydGVyKGFzc2VydGlvbkZuOiAoYTogYW55LCBiOiBhbnksIG1zZz86IHN0cmluZykgPT4gdm9pZCkgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKGM6IChzdHJpbmcgfCBhbnkpW10pIHsKKyAgICAgICAgdmFyIGZuTmFtZSA9IGNbMF07CisgICAgICAgIHZhciBleHBlY3RlZCA9IGNbMV07CisgICAgICAgICg8YW55PmNsaWVudClbZm5OYW1lXShleHBlY3RlZCwgZnVuY3Rpb24oZXJyOiBhbnksIGFjdHVhbDogYW55KSB7CisgICAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgZm5OYW1lICsgIjogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICBhc3NlcnRpb25GbihhY3R1YWwsIGV4cGVjdGVkLCBmbk5hbWUpOworICAgICAgICB9KQorICAgICAgfTsKKyAgICB9CisKKyAgICB0ZXN0Q2FzZXMuc2ltcGxlLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5lcXVhbCkpOworICAgIHRlc3RDYXNlcy5zaW1wbGVMb29zZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihmdW5jdGlvbihhLCBlLCBtKXsKKyAgICAgIGFzc2VydC5vayhhID09IGUsIG0pOworICAgIH0pKTsKKyAgICB0ZXN0Q2FzZXMuZGVlcC5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZGVlcEVxdWFsKSk7CisKKyAgICBjbGllbnQudGVzdE1hcE1hcCg0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgdmFyIGV4cGVjdGVkOiB0eXBlb2YgcmVzcG9uc2UgPSB7CisgICAgICAgICI0IjogeyIxIjoxLCAiMiI6MiwgIjMiOjMsICI0Ijo0fSwKKyAgICAgICAgIi00IjogeyItNCI6LTQsICItMyI6LTMsICItMiI6LTIsICItMSI6LTF9CisgICAgICB9OworICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RNYXBNYXA6IG5vIGNhbGxiYWNrIGVycm9yJyk7CisgICAgICBhc3NlcnQuZGVlcEVxdWFsKGV4cGVjdGVkLCByZXNwb25zZSwgInRlc3RNYXBNYXAiKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0U3RydWN0KHRlc3RDYXNlcy5vdXQsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0U3RydWN0OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0LCByZXNwb25zZSwgInRlc3RTdHJ1Y3QiKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3ROZXN0OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0MiwgcmVzcG9uc2UsICJ0ZXN0TmVzdCIpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenksIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0SW5zYW5pdHk6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkiKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24sICd0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUnKTsKKyAgICAgIGFzc2VydC5vayghQm9vbGVhbihyZXNwb25zZSksICd0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZScpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIHR0eXBlcy5YY2VwdGlvbiwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgdHlwZScpOworICAgICAgYXNzZXJ0Lm9rKCFCb29sZWFuKHJlc3BvbnNlKSwgJ3Rlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlJyk7CisgICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgY29kZScpOworICAgICAgYXNzZXJ0LmVxdWFsKCdYY2VwdGlvbicsIGVyci5tZXNzYWdlLCAndGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciBtZXNzYWdlJyk7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RFeGNlcHRpb246IG5vIGNhbGxiYWNrIGVycm9yJyk7CisgICAgICBhc3NlcnQub2soIUJvb2xlYW4ocmVzcG9uc2UpLCAndGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UnKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0T25ld2F5KDAsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICd0ZXN0T25ld2F5OiBubyBjYWxsYmFjayBlcnJvcicpOworICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3BvbnNlLCB1bmRlZmluZWQsICd0ZXN0T25ld2F5OiB2b2lkIHJlc3BvbnNlJyk7CisgICAgfSk7CisKKyAgICBjaGVja09mZkJ5T25lKGZ1bmN0aW9uKGRvbmUpIHsKKyAgICAgIGNsaWVudC50ZXN0STMyKC0xLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJjaGVja09mZkJ5T25lOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0LmVuZCgpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9LCBjYWxsYmFjayk7CisKKyAgfSk7Cit9OworCitleHBvcnQgZnVuY3Rpb24gVGhyaWZ0VGVzdERyaXZlclByb21pc2UoY2xpZW50OiBUaHJpZnRUZXN0LkNsaWVudCwgY2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZykgPT4gdm9pZCkgeworCisgIHRlc3QoIlEgUHJvbWlzZSBDbGllbnQgVGVzdHMiLCBmdW5jdGlvbihhc3NlcnQpIHsKKworICAgIHZhciBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7CisKKyAgICBmdW5jdGlvbiBmYWlsKG1zZzogc3RyaW5nKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24oZXJyb3IsIHJlc3BvbnNlKSB7CisgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkgeworICAgICAgICAgIGFzc2VydC5mYWlsKG1zZyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBtYWtlQXNzZXJ0ZXIoYXNzZXJ0aW9uRm46IChhOiBhbnksIGI6IGFueSwgbXNnPzogc3RyaW5nKSA9PiB2b2lkKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24oYzogKHN0cmluZyB8IGFueSlbXSkgeworICAgICAgICB2YXIgZm5OYW1lID0gY1swXTsKKyAgICAgICAgdmFyIGV4cGVjdGVkID0gY1sxXTsKKyAgICAgICAgKDxhbnk+Y2xpZW50KVtmbk5hbWVdKGV4cGVjdGVkKQorICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGFjdHVhbDogYW55KSB7CisgICAgICAgICAgICBhc3NlcnRpb25GbihhY3R1YWwsIGV4cGVjdGVkLCBmbk5hbWUpOworICAgICAgICAgIH0pCisgICAgICAgICAgLmZhaWwoZmFpbCgiZm5OYW1lIikpOworICAgICAgfTsKKyAgICB9CisKKyAgICB0ZXN0Q2FzZXMuc2ltcGxlLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5lcXVhbCkpOworICAgIHRlc3RDYXNlcy5zaW1wbGVMb29zZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihmdW5jdGlvbihhLCBlLCBtKXsKKyAgICAgIGFzc2VydC5vayhhID09IGUsIG0pOworICAgIH0pKTsKKyAgICB0ZXN0Q2FzZXMuZGVlcC5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZGVlcEVxdWFsKSk7CisKKyAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RTdHJ1Y3QodGVzdENhc2VzLm91dCkpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAidGVzdFN0cnVjdCIpOworICAgICAgfSkKKyAgICAgIC5mYWlsKGZhaWwoInRlc3RTdHJ1Y3QiKSk7CisKKyAgICBRLnJlc29sdmUoY2xpZW50LnRlc3ROZXN0KHRlc3RDYXNlcy5vdXQyKSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAidGVzdE5lc3QiKTsKKyAgICAgIH0pCisgICAgICAuZmFpbChmYWlsKCJ0ZXN0TmVzdCIpKTsKKworICAgIFEucmVzb2x2ZShjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSkpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkiKTsKKyAgICAgIH0pCisgICAgICAuZmFpbChmYWlsKCJ0ZXN0SW5zYW5pdHkiKSk7CisKKyAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGZhaWwoInRlc3RFeGNlcHRpb246IFRFeGNlcHRpb24iKTsKKyAgICAgIH0pCisgICAgICAuZmFpbChmdW5jdGlvbihlcnIpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24pOworICAgICAgfSk7CisKKyAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIikpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBmYWlsKCJ0ZXN0RXhjZXB0aW9uOiBYY2VwdGlvbiIpOworICAgICAgfSkKKyAgICAgIC5mYWlsKGZ1bmN0aW9uKGVycikgeworICAgICAgICBhc3NlcnQub2soZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGVyci5lcnJvckNvZGUsIDEwMDEpOworICAgICAgICBhc3NlcnQuZXF1YWwoIlhjZXB0aW9uIiwgZXJyLm1lc3NhZ2UpOworICAgICAgfSk7CisKKyAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHVuZGVmaW5lZCwgcmVzcG9uc2UpOyAvL3ZvaWQKKyAgICAgIH0pCisgICAgICAuZmFpbChmYWlsKCJ0ZXN0RXhjZXB0aW9uIikpOworCisgICAgY2xpZW50LnRlc3RPbmV3YXkoMCwgZmFpbCgidGVzdE9uZXdheTogc2hvdWxkIG5vdCBhbnN3ZXIiKSk7CisKKyAgICBjaGVja09mZkJ5T25lKGZ1bmN0aW9uKGRvbmUpIHsKKyAgICAgIFEucmVzb2x2ZShjbGllbnQudGVzdEkzMigtMSkpCisgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIGFzc2VydC5lbmQoKTsKKyAgICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgfSkKKyAgICAgICAgLmZhaWwoZmFpbCgiY2hlY2tPZmZCeU9uZSIpKTsKKyAgICB9LCBjYWxsYmFjayk7CisgIH0pOworfTsKKworCisvLyBIZWxwZXIgRnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZnVuY3Rpb24gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydDogdGVzdC5UZXN0KSB7CisKKyAgcmV0dXJuIGZ1bmN0aW9uIChtYXAxOiBhbnksIG1hcDI6IGFueSwgbXNnOiBzdHJpbmcpIHsKKyAgICB2YXIgZXF1YWwgPSB0cnVlOworCisgICAgdmFyIGVxdWFsID0gY2hlY2tSZWN1cnNpdmVseShtYXAxLCBtYXAyKTsKKworICAgIGFzc2VydC5vayhlcXVhbCwgbXNnKTsKKworICAgIC8vIGRlZXBFcXVhbCBkb2Vzbid0IHdvcmsgd2l0aCBmaWVsZHMgdXNpbmcgbm9kZS1pbnQ2NAorICAgIGZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMTogYW55LCBtYXAyOiBhbnkpIDogYm9vbGVhbiB7CisgICAgICBpZiAoISh0eXBlb2YgbWFwMSAhPT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgbWFwMiAhPT0gImZ1bmN0aW9uIikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAib2JqZWN0IikgeworICAgICAgICAvL0hhbmRsZSBpbnQ2NCB0eXBlcyAod2hpY2ggdXNlIG5vZGUtaW50NjQgaW4gTm9kZS5qcyBKYXZhU2NyaXB0KQorICAgICAgICBpZiAoKHR5cGVvZiBtYXAxID09PSAibnVtYmVyIikgJiYgKHR5cGVvZiBtYXAyID09PSAib2JqZWN0IikgJiYKKyAgICAgICAgICAgIChtYXAyLmJ1ZmZlcikgJiYgKG1hcDIuYnVmZmVyIGluc3RhbmNlb2YgQnVmZmVyKSAmJiAobWFwMi5idWZmZXIubGVuZ3RoID09PSA4KSkgeworICAgICAgICAgIHZhciBuID0gbmV3IEludDY0KG1hcDIuYnVmZmVyKTsKKyAgICAgICAgICByZXR1cm4gbWFwMSA9PT0gbi50b051bWJlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBtYXAxID09IG1hcDI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhtYXAxKS5ldmVyeShmdW5jdGlvbihrZXkpIHsKKyAgICAgICAgICByZXR1cm4gY2hlY2tSZWN1cnNpdmVseShtYXAxW2tleV0sIG1hcDJba2V5XSk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitmdW5jdGlvbiBjaGVja09mZkJ5T25lKGRvbmU6IChjYWxsYmFjazogKCkgPT4gdm9pZCkgPT4gdm9pZCwgY2FsbGJhY2s6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQpIHsKKworICB2YXIgcmV0cnlfbGltaXQgPSAzMDsKKyAgdmFyIHJldHJ5X2ludGVydmFsID0gMTAwOworICB2YXIgdGVzdF9jb21wbGV0ZSA9IGZhbHNlOworICB2YXIgcmV0cnlzID0gMDsKKworICAvKioKKyAgICogcmVkbyBhIHNpbXBsZSB0ZXN0IGFmdGVyIHRoZSBvbmV3YXkgdG8gbWFrZSBzdXJlIHdlIGFyZW4ndCAib2ZmIGJ5IG9uZSIgLS0KKyAgICogaWYgdGhlIHNlcnZlciB0cmVhdGVkIG9uZXdheSB2b2lkIGxpa2Ugbm9ybWFsIHZvaWQsIHRoaXMgbmV4dCB0ZXN0IHdpbGwKKyAgICogZmFpbCBzaW5jZSBpdCB3aWxsIGdldCB0aGUgdm9pZCBjb25maXJtYXRpb24gcmF0aGVyIHRoYW4gdGhlIGNvcnJlY3QKKyAgICogcmVzdWx0LiBJbiB0aGlzIGNpcmN1bXN0YW5jZSwgdGhlIGNsaWVudCB3aWxsIHRocm93IHRoZSBleGNlcHRpb246CisgICAqCisgICAqIEJlY2F1c2UgdGhpcyBpcyB0aGUgbGFzdCB0ZXN0IGFnYWluc3QgdGhlIHNlcnZlciwgd2hlbiBpdCBjb21wbGV0ZXMKKyAgICogdGhlIGVudGlyZSBzdWl0ZSBpcyBjb21wbGV0ZSBieSBkZWZpbml0aW9uICh0aGUgdGVzdHMgcnVuIHNlcmlhbGx5KS4KKyAgICovCisgIGRvbmUoZnVuY3Rpb24oKSB7CisgICAgdGVzdF9jb21wbGV0ZSA9IHRydWU7CisgIH0pOworCisgIC8vV2Ugd2FpdCB1cCB0byByZXRyeV9saW1pdCAqIHJldHJ5X2ludGVydmFsIGZvciB0aGUgdGVzdCBzdWl0ZSB0byBjb21wbGV0ZQorICBmdW5jdGlvbiBUZXN0Rm9yQ29tcGxldGlvbigpIHsKKyAgICBpZih0ZXN0X2NvbXBsZXRlICYmIGNhbGxiYWNrKSB7CisgICAgICBjYWxsYmFjaygiU2VydmVyIHN1Y2Nlc3NmdWxseSB0ZXN0ZWQhIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICgrK3JldHJ5cyA8IHJldHJ5X2xpbWl0KSB7CisgICAgICAgIHNldFRpbWVvdXQoVGVzdEZvckNvbXBsZXRpb24sIHJldHJ5X2ludGVydmFsKTsKKyAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgY2FsbGJhY2soIlNlcnZlciB0ZXN0IGZhaWxlZCB0byBjb21wbGV0ZSBhZnRlciAiICsKKyAgICAgICAgICAgICAgICAgKHJldHJ5X2xpbWl0ICogcmV0cnlfaW50ZXJ2YWwgLyAxMDAwKSArICIgc2Vjb25kcyIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHNldFRpbWVvdXQoVGVzdEZvckNvbXBsZXRpb24sIHJldHJ5X2ludGVydmFsKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC90ZXN0X2hhbmRsZXIudHMgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdF9oYW5kbGVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NmMzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdF9oYW5kbGVyLnRzCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZAorLy8gIEFwYWNoZSBUaHJpZnQgdGVzdCBzZXJ2aWNlLgorCitpbXBvcnQgdHR5cGVzID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL1RocmlmdFRlc3RfdHlwZXMiKTsKK2ltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2ltcG9ydCBUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0OworaW1wb3J0IFEgPSByZXF1aXJlKCJxIik7CitpbXBvcnQgSW50NjQgPSByZXF1aXJlKCJub2RlLWludDY0Iik7CisKKworZXhwb3J0IGNsYXNzIFN5bmNUaHJpZnRUZXN0SGFuZGxlciB7CisgIHRlc3RWb2lkKCk6IFEuSVByb21pc2U8dm9pZD4geworICAgIC8vY29uc29sZS5sb2coJ3Rlc3RWb2lkKCknKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlPHZvaWQ+KHVuZGVmaW5lZCk7CisgIH0KKyAgdGVzdE1hcE1hcChoZWxsbzogbnVtYmVyKSB7CisgICAgLy9jb25zb2xlLmxvZygndGVzdE1hcE1hcCgnICsgaGVsbG8gKyAnKScpOworCisgICAgdmFyIG1hcG1hcDoge1trZXk6IG51bWJlcl06IHtba2V5OiBudW1iZXJdOiBudW1iZXI7IH19ID0gW107CisgICAgdmFyIHBvczoge1trZXk6IG51bWJlcl06IG51bWJlcjsgfSA9IFtdOworICAgIHZhciBuZWc6IHtba2V5OiBudW1iZXJdOiBudW1iZXI7IH0gPSBbXTsKKyAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgcG9zW2ldID0gaTsKKyAgICAgIG5lZ1staV0gPSAtaTsKKyAgICB9CisgICAgbWFwbWFwWzRdID0gcG9zOworICAgIG1hcG1hcFstNF0gPSBuZWc7CisKKyAgICByZXR1cm4gUS5yZXNvbHZlKG1hcG1hcCk7CisgIH0KKyAgdGVzdEluc2FuaXR5KGFyZ3VtZW50OiB0dHlwZXMuSW5zYW5pdHkpOiBRLklQcm9taXNlPHsgW2s6IG51bWJlcl06IGFueTsgfT4geworICAgIGNvbnN0IGZpcnN0X21hcDogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgICAgY29uc3Qgc2Vjb25kX21hcDogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgIAorICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5UV09dID0gYXJndW1lbnQ7CisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworICAKKyAgICBjb25zdCBsb29uZXkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CisgICAgc2Vjb25kX21hcFt0dHlwZXMuTnVtYmVyei5TSVhdID0gbG9vbmV5OworICAKKyAgICBjb25zdCBpbnNhbmU6IHsgW2s6IG51bWJlcl06IGFueTsgfSA9IFtdOworICAgIGluc2FuZVsxXSA9IGZpcnN0X21hcDsKKyAgICBpbnNhbmVbMl0gPSBzZWNvbmRfbWFwOworCisgICAgcmV0dXJuIFEucmVzb2x2ZShpbnNhbmUpOworICB9CisgIHRlc3RNdWx0aShhcmcwOiBhbnksIGFyZzE6IG51bWJlciwgYXJnMjogSW50NjQsIGFyZzM6IHsgW2s6IG51bWJlcl06IHN0cmluZzsgfSwgYXJnNDogdHR5cGVzLk51bWJlcnosIGFyZzU6IG51bWJlcikgeworICAgIHZhciBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7CisgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CisgICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKKyAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOworICAgIHJldHVybiBRLnJlc29sdmUoaGVsbG8pOworICB9CisgIHRlc3RFeGNlcHRpb24oYXJnOiBzdHJpbmcpOiBRLklQcm9taXNlPHZvaWQ+IHsKKyAgICBpZiAoYXJnID09PSAnWGNlcHRpb24nKSB7CisgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICAgIHRocm93IHg7CisgICAgfSBlbHNlIGlmIChhcmcgPT09ICdURXhjZXB0aW9uJykgeworICAgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKGFyZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgICB9CisgIH0KKyAgdGVzdE11bHRpRXhjZXB0aW9uKGFyZzA6IHN0cmluZywgYXJnMTogc3RyaW5nKSB7CisgICAgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24nKSkgeworICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICB4Lm1lc3NhZ2UgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbic7CisgICAgICB0aHJvdyB4OworICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgeworICAgICAgdmFyIHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKKyAgICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMic7CisgICAgICB0aHJvdyB4MjsKKyAgICB9CisKKyAgICB2YXIgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHJlcyk7CisgIH0KKyAgdGVzdE9uZXdheShzbGVlcEZvcjogbnVtYmVyKSB7CisgIH0KKworICB0ZXN0U3RyaW5nKHRoaW5nOiBzdHJpbmcpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0Qm9vbCh0aGluZzogYm9vbGVhbikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RCeXRlKHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0STMyKHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0STY0KHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0RG91YmxlKHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0QmluYXJ5KHRoaW5nOiBCdWZmZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0U3RydWN0KHRoaW5nOiB0dHlwZXMuWHRydWN0KSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdE5lc3QodGhpbmc6IHR0eXBlcy5YdHJ1Y3QyKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdE1hcCh0aGluZzogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9KSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdFN0cmluZ01hcCh0aGluZzogeyBbazogc3RyaW5nXTogc3RyaW5nOyB9KSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdFNldCh0aGluZzogbnVtYmVyW10pIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0TGlzdCh0aGluZzogbnVtYmVyW10pIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0RW51bSh0aGluZzogdHR5cGVzLk51bWJlcnopIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0VHlwZWRlZih0aGluZzogbnVtYmVyKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KK30KKworZXhwb3J0IGNsYXNzIEFzeW5jVGhyaWZ0VGVzdEhhbmRsZXIgeworICBwcml2YXRlIHN5bmNIYW5kbGVyOiBTeW5jVGhyaWZ0VGVzdEhhbmRsZXI7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMuc3luY0hhbmRsZXIgPSBuZXcgU3luY1RocmlmdFRlc3RIYW5kbGVyKCk7CisgIH0KKworICB0ZXN0Vm9pZChjYWxsYmFjazogKHJlc3VsdDogdm9pZCkgPT4gdm9pZCk6IFEuSVByb21pc2U8dm9pZD4geworICAgIGNhbGxiYWNrKHVuZGVmaW5lZCk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RNYXBNYXAoaGVsbG86IG51bWJlciwKKyAgICBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IHsgW2s6IG51bWJlcl06IHsgW2s6IG51bWJlcl06IG51bWJlcjsgfTsgfSkgPT4gdm9pZCk6CisgICAgIFEuSVByb21pc2U8eyBbazogbnVtYmVyXTogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9OyB9PiB7CisKKyAgICB2YXIgbWFwbWFwOiB7W2tleTogbnVtYmVyXToge1trZXk6IG51bWJlcl06IG51bWJlcjsgfX0gPSBbXTsKKyAgICB2YXIgcG9zOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0gW107CisgICAgdmFyIG5lZzoge1trZXk6IG51bWJlcl06IG51bWJlcjsgfSA9IFtdOworICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICBwb3NbaV0gPSBpOworICAgICAgbmVnWy1pXSA9IC1pOworICAgIH0KKyAgICBtYXBtYXBbNF0gPSBwb3M7CisgICAgbWFwbWFwWy00XSA9IG5lZzsKKworICAgIGNhbGxiYWNrKG51bGwsIG1hcG1hcCk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RJbnNhbml0eShhcmd1bWVudDogdHR5cGVzLkluc2FuaXR5LCBjYWxsYmFjaz86IChlcnI6IGFueSwgcmVzdWx0OiB7IFtrOiBudW1iZXJdOiBhbnk7IH0pID0+IHZvaWQpOiBRLklQcm9taXNlPHsgW2s6IG51bWJlcl06IGFueTsgfT4geworICAgIGNvbnN0IGZpcnN0X21hcDogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgICAgY29uc3Qgc2Vjb25kX21hcDogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgIAorICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5UV09dID0gYXJndW1lbnQ7CisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworICAKKyAgICBjb25zdCBsb29uZXkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CisgICAgc2Vjb25kX21hcFt0dHlwZXMuTnVtYmVyei5TSVhdID0gbG9vbmV5OworICAKKyAgICBjb25zdCBpbnNhbmU6IHsgW2s6IG51bWJlcl06IGFueTsgfSA9IFtdOworICAgIGluc2FuZVsxXSA9IGZpcnN0X21hcDsKKyAgICBpbnNhbmVbMl0gPSBzZWNvbmRfbWFwOworCisgICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQpeworICAgICAgY2FsbGJhY2sobnVsbCwgaW5zYW5lKTsKKyAgICB9CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RNdWx0aShhcmcwOiBhbnksIGFyZzE6IG51bWJlciwgYXJnMjogSW50NjQsIGFyZzM6IHsgW2s6IG51bWJlcl06IHN0cmluZzsgfSwgYXJnNDogdHR5cGVzLk51bWJlcnosIGFyZzU6IG51bWJlciwgcmVzdWx0OiBGdW5jdGlvbik6IFEuSVByb21pc2U8dHR5cGVzLlh0cnVjdD4geworICAgIHZhciBoZWxsbyA9IHRoaXMuc3luY0hhbmRsZXIudGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOworICAgIGhlbGxvLnRoZW4oaGVsbG8gPT4gcmVzdWx0KG51bGwsIGhlbGxvKSk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RFeGNlcHRpb24oYXJnOiBzdHJpbmcsIHJlc3VsdDogKGVycjogYW55KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx2b2lkPiB7CisgICAgaWYgKGFyZyA9PT0gJ1hjZXB0aW9uJykgeworICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CisgICAgICByZXN1bHQoeCk7CisgICAgfSBlbHNlIGlmIChhcmcgPT09ICdURXhjZXB0aW9uJykgeworICAgICAgcmVzdWx0KG5ldyBUaHJpZnQuVEV4Y2VwdGlvbihhcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0KG51bGwpOworICAgIH0KKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE11bHRpRXhjZXB0aW9uKGFyZzA6IHN0cmluZywgYXJnMTogc3RyaW5nLCByZXN1bHQ6IChlcnI6IGFueSwgcmVzPzogdHR5cGVzLlh0cnVjdCkgPT4gdm9pZCk6IFEuSVByb21pc2U8dHR5cGVzLlh0cnVjdD4geworICAgIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uJykpIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nOworICAgICAgcmVzdWx0KHgpOworICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgeworICAgICAgdmFyIHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKKyAgICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMic7CisgICAgICByZXN1bHQoeDIpOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOworICAgICAgcmVzdWx0KG51bGwsIHJlcyk7CisgICAgfQorICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0T25ld2F5KHNsZWVwRm9yOiBudW1iZXIsIHJlc3VsdDogRnVuY3Rpb24pIHsKKyAgICB0aGlzLnN5bmNIYW5kbGVyLnRlc3RPbmV3YXkoc2xlZXBGb3IpOworICB9CisgIHRlc3RTdHJpbmcodGhpbmc6IHN0cmluZywgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBzdHJpbmcpID0+IHZvaWQpOiBRLklQcm9taXNlPHN0cmluZz4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEJ5dGUodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEJvb2wodGhpbmc6IGJvb2xlYW4sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZCApOiBRLklQcm9taXNlPGJvb2xlYW4+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RJMzIodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4gIHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RJNjQodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4gIHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3REb3VibGUodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4gIHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RCaW5hcnkodGhpbmc6IEJ1ZmZlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBCdWZmZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPEJ1ZmZlcj4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdFN0cnVjdCh0aGluZzogdHR5cGVzLlh0cnVjdCwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiB0dHlwZXMuWHRydWN0KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx0dHlwZXMuWHRydWN0PiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TmVzdCh0aGluZzogdHR5cGVzLlh0cnVjdDIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogdHR5cGVzLlh0cnVjdDIpID0+IHZvaWQpOiBRLklQcm9taXNlPHR0eXBlcy5YdHJ1Y3QyPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TWFwKHRoaW5nOiB7IFtrOiBudW1iZXJdOiBudW1iZXI7IH0sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx7IFtrOiBudW1iZXJdOiBudW1iZXI7IH0+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RTdHJpbmdNYXAodGhpbmc6IHsgW2s6IHN0cmluZ106IHN0cmluZzsgfSwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiB7IFtrOiBzdHJpbmddOiBzdHJpbmc7IH0pID0+IHZvaWQpOiBRLklQcm9taXNlPHsgW2s6IHN0cmluZ106IHN0cmluZzsgfT4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdFNldCh0aGluZzogbnVtYmVyW10sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyW10pID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcltdPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TGlzdCh0aGluZzogbnVtYmVyW10sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyW10pID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcltdPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0RW51bSh0aGluZzogdHR5cGVzLk51bWJlcnosIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogdHR5cGVzLk51bWJlcnopID0+IHZvaWQpOiBRLklQcm9taXNlPHR0eXBlcy5OdW1iZXJ6PiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0VHlwZWRlZih0aGluZzogbnVtYmVyLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IG51bWJlcikgPT4gdm9pZCk6IFEuSVByb21pc2U8bnVtYmVyPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3RzY29uZmlnLmpzb24gYi9saWIvbm9kZXRzL3Rlc3QvdHNjb25maWcuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjlkMDZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3RzY29uZmlnLmpzb24KQEAgLTAsMCArMSwyMiBAQAoreworICAgICJjb21waWxlck9wdGlvbnMiOiB7CisgICAgICAgICJhbGxvd0pzIjogZmFsc2UsCisgICAgICAgICJhbHdheXNTdHJpY3QiOiB0cnVlLAorICAgICAgICAiYmFzZVVybCI6ICIuIiwKKyAgICAgICAgImRlY2xhcmF0aW9uIjogdHJ1ZSwKKyAgICAgICAgImVtaXREZWNvcmF0b3JNZXRhZGF0YSI6IHRydWUsCisgICAgICAgICJleHBlcmltZW50YWxEZWNvcmF0b3JzIjogdHJ1ZSwKKyAgICAgICAgIm1vZHVsZSI6ICJjb21tb25qcyIsCisgICAgICAgICJtb2R1bGVSZXNvbHV0aW9uIjogIm5vZGUiLAorICAgICAgICAibm9JbXBsaWNpdFRoaXMiOiB0cnVlLAorICAgICAgICAibm9VbnVzZWRMb2NhbHMiOiB0cnVlLAorICAgICAgICAicHJlc2VydmVDb25zdEVudW1zIjogdHJ1ZSwKKyAgICAgICAgInJlbW92ZUNvbW1lbnRzIjogdHJ1ZSwKKyAgICAgICAgInN0cmljdEZ1bmN0aW9uVHlwZXMiOiB0cnVlLAorICAgICAgICAic3RyaWN0TnVsbENoZWNrcyI6IHRydWUsCisgICAgICAgICJ0YXJnZXQiOiAiZXM2IiwKKyAgICAgICAgInBhdGhzIjogeworICAgICAgICAgICAgInRocmlmdCI6IFsiLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQiXQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sLy5naXRpZ25vcmUgYi9saWIvb2NhbWwvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDlhNmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxMSBAQAorX2J1aWxkLworX3RhZ3MKK2NvbmZpZ3VyZQorc2V0dXAuZGF0YQorc2V0dXAubWwKK215b2NhbWxidWlsZC5tbAorKi9NRVRBCisqLyoubWxsaWIKKyovKi5tbGR5bGliCitNYWtlZmlsZQorT0NhbWxNYWtlZmlsZQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL0RFVkVMT1BNRU5UIGIvbGliL29jYW1sL0RFVkVMT1BNRU5UCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNWEwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvREVWRUxPUE1FTlQKQEAgLTAsMCArMSw3NiBAQAorVGhyaWZ0IE9DYW1sIERldmVsb3BtZW50Cis9PT09PT09PT09PT09PT09PT09PT09PT0KKworUHJlcmVxdWlzaXRlcworLS0tLS0tLS0tLS0tLQorCitJbiBvcmRlciB0byBidWlsZCB0aGlzIGxpYnJhcnksIHlvdSBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBpbnN0YWxsZWQ6CisKKyAgKiBUaGUgT0NhbWwgY29tcGlsZXIsIHByZWZlcmFibHkgPjQuMDAKKyAgKiBUaGUgT2FzaXMgYnVpbGQgdG9vbAorCitJbiBhZGRpdGlvbiB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBPUEFNLCB3aGljaCB3aWxsIGFsbG93IHlvdSB0byBzZXR1cCBhbgorT0NhbWwgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgdGhhdCdzIGlzb2xhdGVkIGZyb20geW91ciBzeXN0ZW0gaW5zdGFsbGF0aW9uLAorbXVjaCBsaWtlIHZpcnV0YWxlbnYgZm9yIFB5dGhvbiBvciB0aGUgbXlyaWFkIHN5c3RlbXMgYXZhaWxhYmxlIGZvciBSdWJ5LiBJZgoreW91IGhhdmUgT1BBTSBpbnN0YWxsZWQsIHRoZW4gaW5zdGFsbGluZyBPYXNpcyBpcyBhcyBzaW1wbGUgYXMgcnVubmluZzoKKworICAkIG9wYW0gaW5zdGFsbCBvYXNpcworCitCdWlsZGluZworLS0tLS0tLS0KKworT25jZSBhbGwgdGhlIHByZXJlcXVpc2l0ZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKyAgJCBvYXNpcyBzZXR1cAorICAkIC4vY29uZmlndXJlCisgICQgbWFrZQorCitUaGUgYG9hc2lzIHNldHVwYCBjb21tYW5kIHdpbGwgZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIE1ha2VmaWxlLAorYWxvbmcgd2l0aCBvdGhlciBmaWxlcyB0aGF0IG9wYW0gd2lsbCB1c2UgdG8gY3JlYXRlIGFuIGluc3RhbGxhYmxlIGxpYnJhcnkuCitUaGUgY29maWd1cmUgc2NyaXB0IHdpbGwgZW5zdXJlIHRoYXQgYWxsIGJ1aWxkIGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbGVkLCBhbmQKK21ha2Ugd2lsbCBhY3R1YWxseSBidWlsZCB0aGUgbGlicmFyeS4KKworVG8gcmVtb3ZlIGZpbGVzIHRoYXQgdGhlIGNvbXBpbGVyIGdlbmVhdGVzLCBydW46CisKKyAgJCBtYWtlIGNsZWFuCisKK1RvIHJlbW92ZSB0aG9zZSBmaWxlcyBfYXMgd2VsbCBhc18gZmlsZXMgdGhhdCB0aGUgc2V0dXAgYW5kIGNvbmZpZ3VyZSBwcm9jZXNzCitnZW5lcmF0ZXMsIHJ1bjoKKworICAkIHJtIGBjYXQgLmdpdGlnbm9yZWAKKworSW5zdGFsbGluZworLS0tLS0tLS0tLQorCitJZiB5b3UncmUgdXNpbmcgb3BhbSwgc2ltcGx5IHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgJCBtYWtlIGluc3RhbGwKKworV2hpbGUgZGV2ZWxvcG1lbnQsIHlvdSBtYXkgd2FudCB0byBpbnN0YWxsIHlvdXIgbGF0ZXN0IGJ1aWxkIG9uIHRoZSBzeXN0ZW0gdG8KK3Rlc3QgYWdhaW5zdCBvdGhlciBsaWJyYXJpZXMgb3IgcHJvZ3JhbXMuIFRvIGRvIHRoaXMsIHVzZToKKworICAkIG1ha2UgcmVpbnN0YWxsCisKK0Rpc3RyaWJ1dGlvbgorLS0tLS0tLS0tLS0tCisKK1RoZSBkZSBmYWN0byBwcmVmZXJyZWQgbWV0aG9kIGZvciBkaXN0cmlidXRpbmcgT0NhbWwgbGlicmFyaWVzIGlzIHRocm91Z2ggdGhlCitPUEFNIHBhY2thZ2UgcmVwb3NpdG9yeS4gVG8gcHVibGlzaCB0aGUgbGF0ZXN0IHBhY2thZ2UsIGlzc3VlIGEgcHVsbCByZXF1ZXN0CithZ2FpbnN0IHRoZSBmb2xsb3dpbmcgZ2l0aHViIHJlcG9zaXRvcnk6CisKKyAgaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeQorCitUaGUgcHVsbCByZXF1ZXN0aW9uIHNob3VsZCBhZGQgdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlIGFuZCBmaWxlczoKKworICBwYWNrYWdlCisgICAgfF9fdGhyaWZ0CisgICAgICAgfF9fdGhyaWZ0LjxWRVJTSU9OPgorICAgICAgICAgIHxfXyBkZXNjcgorICAgICAgICAgIHxfXyBvcGFtCisgICAgICAgICAgfF9fIHVybAorCitUZW1wbGF0ZXMgZm9yIHRoZSBmb2xsb3dpbmcgZmlsZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBvcGFtLyBzdWJkaXJlY3Rvcnkgb2YKK3RoaXMgbGlicmFyeSdzIHJvb3QsIHdpdGggWFhYKC4uLikgaW5kaWNhdGluZyBmaWVsZHMgdGhhdCBuZWVkIHRvIGJlIGZpbGxlZAorb3V0LiBZb3UgY2FuIGZpbmQgZnVydGhlciBkb2N1bWVudGF0aW9uIGhlcmU6CisKKyAgaHR0cDovL29wYW0ub2NhbWwub3JnL2RvYy9QYWNrYWdpbmcuaHRtbApkaWZmIC0tZ2l0IGEvbGliL29jYW1sL01ha2VmaWxlIGIvbGliL29jYW1sL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWJlZWU3Li4wMDAwMDAwCi0tLSBhL2xpYi9vY2FtbC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1hbGw6Ci0JY2Qgc3JjOyBtYWtlOyBjZCAuLgotY2xlYW46Ci0JY2Qgc3JjOyBtYWtlIGNsZWFuOyBjZCAuLgpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL09DYW1sTWFrZWZpbGUgYi9saWIvb2NhbWwvT0NhbWxNYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiOTI1Mi4uMDAwMDAwMAotLS0gYS9saWIvb2NhbWwvT0NhbWxNYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEyMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWxNYWtlZmlsZQotIyAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBNYXJrdXMgTW90dGwKLSMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB1cGRhdGVzIHNlZToKLSMgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5vY2FtbC5pbmZvL2hvbWUvb2NhbWxfc291cmNlcy5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBNb2RpZmllZCBieSBkYW1pZW4gZm9yIC5nbGFkZS5tbCBjb21waWxhdGlvbgotCi0jIFNldCB0aGVzZSB2YXJpYWJsZXMgdG8gdGhlIG5hbWVzIG9mIHRoZSBzb3VyY2VzIHRvIGJlIHByb2Nlc3NlZCBhbmQKLSMgdGhlIHJlc3VsdCB2YXJpYWJsZS4gT3JkZXIgbWF0dGVycyBkdXJpbmcgbGlua2FnZSEKLQotaWZuZGVmIFNPVVJDRVMKLSAgU09VUkNFUyA6PSBmb28ubWwKLWVuZGlmCi1leHBvcnQgU09VUkNFUwotCi1pZm5kZWYgUkVTX0NMSUJfU1VGCi0gIFJFU19DTElCX1NVRiA6PSBfc3R1YnMKLWVuZGlmCi1leHBvcnQgUkVTX0NMSUJfU1VGCi0KLWlmbmRlZiBSRVNVTFQKLSAgUkVTVUxUIDo9IGZvbwotZW5kaWYKLWV4cG9ydCBSRVNVTFQgOj0gJChzdHJpcCAkKFJFU1VMVCkpCi0KLWV4cG9ydCBMSUJfUEFDS19OQU1FCi0KLWlmbmRlZiBET0NfRklMRVMKLSAgRE9DX0ZJTEVTIDo9ICQoZmlsdGVyICUubWxpLCAkKFNPVVJDRVMpKQotZW5kaWYKLWV4cG9ydCBET0NfRklMRVMKLUZJUlNUX0RPQ19GSUxFIDo9ICQoZmlyc3R3b3JkICQoRE9DX0ZJTEVTKSkKLQotZXhwb3J0IEJDU1VGRklYCi1leHBvcnQgTkNTVUZGSVgKLQotaWZuZGVmIFRPUFNVRkZJWAotICBUT1BTVUZGSVggOj0gLnRvcAotZW5kaWYKLWV4cG9ydCBUT1BTVUZGSVgKLQotIyBFdmVudHVhbGx5IHNldCBpbmNsdWRlLSBhbmQgbGlicmFyeS1wYXRocywgbGlicmFyaWVzIHRvIGxpbmssCi0jIGFkZGl0aW9uYWwgY29tcGlsYXRpb24tLCBsaW5rLSBhbmQgb2NhbWx5YWNjLWZsYWdzCi0jIFBhdGgtIGFuZCBsaWJyYXJ5IGluZm9ybWF0aW9uIG5lZWRzIG5vdCBiZSB3cml0dGVuIHdpdGggIi1JIiBhbmQgc3VjaC4uLgotIyBEZWZpbmUgVEhSRUFEUyBpZiB5b3UgbmVlZCBpdCwgb3RoZXJ3aXNlIGxlYXZlIGl0IHVuc2V0IChzYW1lIGZvcgotIyBVU0VfQ0FNTFA0KSEKLQotZXhwb3J0IFRIUkVBRFMKLWV4cG9ydCBWTVRIUkVBRFMKLWV4cG9ydCBBTk5PVEFURQotZXhwb3J0IFVTRV9DQU1MUDQKLQotZXhwb3J0IElOQ0RJUlMKLWV4cG9ydCBMSUJESVJTCi1leHBvcnQgRVhUTElCRElSUwotZXhwb3J0IFJFU1VMVERFUFMKLWV4cG9ydCBPQ0FNTF9ERUZBVUxUX0RJUlMKLQotZXhwb3J0IExJQlMKLWV4cG9ydCBDTElCUwotZXhwb3J0IENGUkFNRVdPUktTCi0KLWV4cG9ydCBPQ0FNTEZMQUdTCi1leHBvcnQgT0NBTUxOQ0ZMQUdTCi1leHBvcnQgT0NBTUxCQ0ZMQUdTCi0KLWV4cG9ydCBPQ0FNTExERkxBR1MKLWV4cG9ydCBPQ0FNTE5MREZMQUdTCi1leHBvcnQgT0NBTUxCTERGTEFHUwotCi1leHBvcnQgT0NBTUxNS0xJQl9GTEFHUwotCi1pZm5kZWYgT0NBTUxDUEZMQUdTCi0gIE9DQU1MQ1BGTEFHUyA6PSBhCi1lbmRpZgotZXhwb3J0IE9DQU1MQ1BGTEFHUwotCi1pZm5kZWYgRE9DX0RJUgotICBET0NfRElSIDo9IGRvYwotZW5kaWYKLWV4cG9ydCBET0NfRElSCi0KLWV4cG9ydCBQUEZMQUdTCi0KLWV4cG9ydCBMRkxBR1MKLWV4cG9ydCBZRkxBR1MKLWV4cG9ydCBJRExGTEFHUwotCi1leHBvcnQgT0NBTUxET0NGTEFHUwotCi1leHBvcnQgT0NBTUxGSU5EX0lOU1RGTEFHUwotCi1leHBvcnQgRFZJUFNGTEFHUwotCi1leHBvcnQgU1RBVElDCi0KLSMgQWRkIGEgbGlzdCBvZiBvcHRpb25hbCB0cmFzaCBmaWxlcyB0aGF0IHNob3VsZCBiZSBkZWxldGVkIGJ5ICJtYWtlIGNsZWFuIgotZXhwb3J0IFRSQVNICi0KLUVDSE8gOj0gZWNobwotCi1pZmRlZiBSRUFMTFlfUVVJRVQKLSAgZXhwb3J0IFJFQUxMWV9RVUlFVAotICBFQ0hPIDo9IHRydWUKLSAgTEZMQUdTIDo9ICQoTEZMQUdTKSAtcQotICBZRkxBR1MgOj0gJChZRkxBR1MpIC1xCi1lbmRpZgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyAgdmFyaWFibGVzIGRlcGVuZGluZyBvbiB5b3VyIE9DYW1sLWluc3RhbGxhdGlvbgotCi1pZmRlZiBNSU5HVwotICBleHBvcnQgTUlOR1cKLSAgV0lOMzIgICA6PSAxCi0gIENGTEFHU19XSU4zMiA6PSAtbW5vLWN5Z3dpbgotZW5kaWYKLWlmZGVmIE1TVkMKLSAgZXhwb3J0IE1TVkMKLSAgV0lOMzIgICA6PSAxCi0gIGlmbmRlZiBTVEFUSUMKLSAgICBDUFBGTEFHU19XSU4zMiA6PSAtRENBTUxfRExMCi0gIGVuZGlmCi0gIENGTEFHU19XSU4zMiArPSAtbm9sb2dvCi0gIEVYVF9PQkogOj0gb2JqCi0gIEVYVF9MSUIgOj0gbGliCi0gIGlmZXEgKCQoQ0MpLGdjYykKLSAgICAjIHdvcmsgYXJvdW5kIEdOVSBNYWtlIGRlZmF1bHQgdmFsdWUKLSAgICBpZmRlZiBUSFJFQURTCi0gICAgICBDQyA6PSBjbCAtTVQKLSAgICBlbHNlCi0gICAgICBDQyA6PSBjbAotICAgIGVuZGlmCi0gIGVuZGlmCi0gIGlmZXEgKCQoQ1hYKSxnKyspCi0gICAgIyB3b3JrIGFyb3VuZCBHTlUgTWFrZSBkZWZhdWx0IHZhbHVlCi0gICAgQ1hYIDo9ICQoQ0MpCi0gIGVuZGlmCi0gIENGTEFHX08gOj0gLUZvCi1lbmRpZgotaWZkZWYgV0lOMzIKLSAgRVhUX0NYWCA6PSBjcHAKLSAgRVhFICAgICA6PSAuZXhlCi1lbmRpZgotCi1pZm5kZWYgRVhUX09CSgotICBFWFRfT0JKIDo9IG8KLWVuZGlmCi1pZm5kZWYgRVhUX0xJQgotICBFWFRfTElCIDo9IGEKLWVuZGlmCi1pZm5kZWYgRVhUX0NYWAotICBFWFRfQ1hYIDo9IGNjCi1lbmRpZgotaWZuZGVmIEVYRQotICBFWEUgOj0gIyBlbXB0eQotZW5kaWYKLWlmbmRlZiBDRkxBR19PCi0gIENGTEFHX08gOj0gLW8gIyBkbyBub3QgZGVsZXRlIHRoaXMgY29tbWVudCAocHJlc2VydmVzIHRyYWlsaW5nIHdoaXRlc3BhY2UpIQotZW5kaWYKLQotZXhwb3J0IENDCi1leHBvcnQgQ1hYCi1leHBvcnQgQ0ZMQUdTCi1leHBvcnQgQ1hYRkxBR1MKLWV4cG9ydCBMREZMQUdTCi1leHBvcnQgQ1BQRkxBR1MKLQotaWZuZGVmIFJQQVRIX0ZMQUcKLSAgaWZkZWYgRUxGX1JQQVRIX0ZMQUcKLSAgICBSUEFUSF9GTEFHIDo9ICQoRUxGX1JQQVRIX0ZMQUcpCi0gIGVsc2UKLSAgICBSUEFUSF9GTEFHIDo9IC1SCi0gIGVuZGlmCi1lbmRpZgotZXhwb3J0IFJQQVRIX0ZMQUcKLQotaWZuZGVmIE1TVkMKLWlmbmRlZiBQSUNfQ0ZMQUdTCi0gIFBJQ19DRkxBR1MgOj0gLWZQSUMKLWVuZGlmCi1pZm5kZWYgUElDX0NQUEZMQUdTCi0gIFBJQ19DUFBGTEFHUyA6PSAtRFBJQwotZW5kaWYKLWVuZGlmCi0KLWV4cG9ydCBQSUNfQ0ZMQUdTCi1leHBvcnQgUElDX0NQUEZMQUdTCi0KLUJDUkVTVUxUICA6PSAkKGFkZHN1ZmZpeCAkKEJDU1VGRklYKSwgJChSRVNVTFQpKQotTkNSRVNVTFQgIDo9ICQoYWRkc3VmZml4ICQoTkNTVUZGSVgpLCAkKFJFU1VMVCkpCi1UT1BSRVNVTFQgOj0gJChhZGRzdWZmaXggJChUT1BTVUZGSVgpLCAkKFJFU1VMVCkpCi0KLWlmbmRlZiBPQ0FNTEZJTkQKLSAgT0NBTUxGSU5EIDo9IG9jYW1sZmluZAotZW5kaWYKLWV4cG9ydCBPQ0FNTEZJTkQKLQotaWZuZGVmIE9DQU1MQwotICBPQ0FNTEMgOj0gb2NhbWxjCi1lbmRpZgotZXhwb3J0IE9DQU1MQwotCi1pZm5kZWYgT0NBTUxPUFQKLSAgT0NBTUxPUFQgOj0gb2NhbWxvcHQKLWVuZGlmCi1leHBvcnQgT0NBTUxPUFQKLQotaWZuZGVmIE9DQU1MTUtUT1AKLSAgT0NBTUxNS1RPUCA6PSBvY2FtbG1rdG9wCi1lbmRpZgotZXhwb3J0IE9DQU1MTUtUT1AKLQotaWZuZGVmIE9DQU1MQ1AKLSAgT0NBTUxDUCA6PSBvY2FtbGNwCi1lbmRpZgotZXhwb3J0IE9DQU1MQ1AKLQotaWZuZGVmIE9DQU1MREVQCi0gIE9DQU1MREVQIDo9IG9jYW1sZGVwCi1lbmRpZgotZXhwb3J0IE9DQU1MREVQCi0KLWlmbmRlZiBPQ0FNTExFWAotICBPQ0FNTExFWCA6PSBvY2FtbGxleAotZW5kaWYKLWV4cG9ydCBPQ0FNTExFWAotCi1pZm5kZWYgT0NBTUxZQUNDCi0gIE9DQU1MWUFDQyA6PSBvY2FtbHlhY2MKLWVuZGlmCi1leHBvcnQgT0NBTUxZQUNDCi0KLWlmbmRlZiBPQ0FNTE1LTElCCi0gIE9DQU1MTUtMSUIgOj0gb2NhbWxta2xpYgotZW5kaWYKLWV4cG9ydCBPQ0FNTE1LTElCCi0KLWlmbmRlZiBPQ0FNTF9HTEFERUNDCi0gIE9DQU1MX0dMQURFQ0MgOj0gbGFibGdsYWRlY2MyCi1lbmRpZgotZXhwb3J0IE9DQU1MX0dMQURFQ0MKLQotaWZuZGVmIE9DQU1MX0dMQURFQ0NfRkxBR1MKLSAgT0NBTUxfR0xBREVDQ19GTEFHUyA6PQotZW5kaWYKLWV4cG9ydCBPQ0FNTF9HTEFERUNDX0ZMQUdTCi0KLWlmbmRlZiBDQU1FTEVPTl9SRVBPUlQKLSAgQ0FNRUxFT05fUkVQT1JUIDo9IHJlcG9ydAotZW5kaWYKLWV4cG9ydCBDQU1FTEVPTl9SRVBPUlQKLQotaWZuZGVmIENBTUVMRU9OX1JFUE9SVF9GTEFHUwotICBDQU1FTEVPTl9SRVBPUlRfRkxBR1MgOj0KLWVuZGlmCi1leHBvcnQgQ0FNRUxFT05fUkVQT1JUX0ZMQUdTCi0KLWlmbmRlZiBDQU1FTEVPTl9aT0dHWQotICBDQU1FTEVPTl9aT0dHWSA6PSBjYW1scDRvIHBhX3pvZy5jbWEgcHJfby5jbW8KLWVuZGlmCi1leHBvcnQgQ0FNRUxFT05fWk9HR1kKLQotaWZuZGVmIENBTUVMRU9OX1pPR0dZX0ZMQUdTCi0gIENBTUVMRU9OX1pPR0dZX0ZMQUdTIDo9Ci1lbmRpZgotZXhwb3J0IENBTUVMRU9OX1pPR0dZX0ZMQUdTCi0KLWlmbmRlZiBPWFJJREwKLSAgT1hSSURMIDo9IG94cmlkbAotZW5kaWYKLWV4cG9ydCBPWFJJREwKLQotaWZuZGVmIENBTUxJREwKLSAgQ0FNTElETCA6PSBjYW1saWRsCi1lbmRpZgotZXhwb3J0IENBTUxJREwKLQotaWZuZGVmIENBTUxJRExETEwKLSAgQ0FNTElETERMTCA6PSBjYW1saWRsZGxsCi1lbmRpZgotZXhwb3J0IENBTUxJRExETEwKLQotaWZuZGVmIE5PSURMSEVBREVSCi0gIE1BWUJFX0lETF9IRUFERVIgOj0gLWhlYWRlcgotZW5kaWYKLWV4cG9ydCBOT0lETEhFQURFUgotCi1leHBvcnQgTk9fQ1VTVE9NCi0KLWlmbmRlZiBDQU1MUDQKLSAgQ0FNTFA0IDo9IGNhbWxwNAotZW5kaWYKLWV4cG9ydCBDQU1MUDQKLQotaWZuZGVmIFJFQUxfT0NBTUxGSU5ECi0gIGlmZGVmIFBBQ0tTCi0gICAgaWZuZGVmIENSRUFURV9MSUIKLSAgICAgIGlmZGVmIFRIUkVBRFMKLQlQQUNLUyArPSB0aHJlYWRzCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gICAgZW1wdHkgOj0KLSAgICBzcGFjZSA6PSAkKGVtcHR5KSAkKGVtcHR5KQotICAgIGNvbW1hIDo9ICwKLSAgICBpZmRlZiBQUkVEUwotICAgICAgUFJFX09DQU1MX0ZJTkRfUFJFRElDQVRFUyA6PSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoUFJFRFMpKQotICAgICAgUFJFX09DQU1MX0ZJTkRfUEFDS0FHRVMgOj0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKFBBQ0tTKSkKLSAgICAgIE9DQU1MX0ZJTkRfUFJFRElDQVRFUyA6PSAtcHJlZGljYXRlcyAkKFBSRV9PQ0FNTF9GSU5EX1BSRURJQ0FURVMpCi0gICMgICAgT0NBTUxfREVQX1BSRURJQ0FURVMgOj0gLXN5bnRheCAkKFBSRV9PQ0FNTF9GSU5EX1BSRURJQ0FURVMpCi0gICAgICBPQ0FNTF9GSU5EX1BBQ0tBR0VTIDo9ICQoT0NBTUxfRklORF9QUkVESUNBVEVTKSAtcGFja2FnZSAkKFBSRV9PQ0FNTF9GSU5EX1BBQ0tBR0VTKQotICAgICAgT0NBTUxfREVQX1BBQ0tBR0VTIDo9ICQoT0NBTUxfREVQX1BSRURJQ0FURVMpIC1wYWNrYWdlICQoUFJFX09DQU1MX0ZJTkRfUEFDS0FHRVMpCi0gICAgZWxzZQotICAgICAgT0NBTUxfRklORF9QQUNLQUdFUyA6PSAtcGFja2FnZSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoUEFDS1MpKQotICAgICAgT0NBTUxfREVQX1BBQ0tBR0VTIDo9Ci0gICAgZW5kaWYKLSAgICBPQ0FNTF9GSU5EX0xJTktQS0cgOj0gLWxpbmtwa2cKLSAgICBSRUFMX09DQU1MRklORCA6PSAkKE9DQU1MRklORCkKLSAgZW5kaWYKLWVuZGlmCi0KLWV4cG9ydCBPQ0FNTF9GSU5EX1BBQ0tBR0VTCi1leHBvcnQgT0NBTUxfREVQX1BBQ0tBR0VTCi1leHBvcnQgT0NBTUxfRklORF9MSU5LUEtHCi1leHBvcnQgUkVBTF9PQ0FNTEZJTkQKLQotaWZuZGVmIE9DQU1MRE9DCi0gIE9DQU1MRE9DIDo9IG9jYW1sZG9jCi1lbmRpZgotZXhwb3J0IE9DQU1MRE9DCi0KLWlmbmRlZiBMQVRFWAotICBMQVRFWCA6PSBsYXRleAotZW5kaWYKLWV4cG9ydCBMQVRFWAotCi1pZm5kZWYgRFZJUFMKLSAgRFZJUFMgOj0gZHZpcHMKLWVuZGlmCi1leHBvcnQgRFZJUFMKLQotaWZuZGVmIFBTMlBERgotICBQUzJQREYgOj0gcHMycGRmCi1lbmRpZgotZXhwb3J0IFBTMlBERgotCi1pZm5kZWYgT0NBTUxNQUtFRklMRQotICBPQ0FNTE1BS0VGSUxFIDo9IE9DYW1sTWFrZWZpbGUKLWVuZGlmCi1leHBvcnQgT0NBTUxNQUtFRklMRQotCi1pZm5kZWYgT0NBTUxMSUJQQVRICi0gIE9DQU1MTElCUEFUSCA6PSBcCi0gICAgJChzaGVsbCAkKE9DQU1MQykgMj4vZGV2L251bGwgLXdoZXJlIHx8IGVjaG8gL3Vzci9sb2NhbC9saWIvb2NhbWwpCi1lbmRpZgotZXhwb3J0IE9DQU1MTElCUEFUSAotCi1pZm5kZWYgT0NBTUxfTElCX0lOU1RBTEwKLSAgT0NBTUxfTElCX0lOU1RBTEwgOj0gJChPQ0FNTExJQlBBVEgpL2NvbnRyaWIKLWVuZGlmCi1leHBvcnQgT0NBTUxfTElCX0lOU1RBTEwKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjICBjaGFuZ2UgZm9sbG93aW5nIHNlY3Rpb25zIG9ubHkgaWYKLSMjIyMjIyMjIyMjIyMjIyMjIyMjICAgIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKLQotIyBkZWxldGUgdGFyZ2V0IGZpbGVzIHdoZW4gYSBidWlsZCBjb21tYW5kIGZhaWxzCi0uUEhPTlk6IC5ERUxFVEVfT05fRVJST1IKLS5ERUxFVEVfT05fRVJST1I6Ci0KLSMgZm9yIHBlZGFudHMgdXNpbmcgIi0td2Fybi11bmRlZmluZWQtdmFyaWFibGVzIgotZXhwb3J0IE1BWUJFX0lETAotZXhwb3J0IFJFQUxfUkVTVUxUCi1leHBvcnQgQ0FNTElETEZMQUdTCi1leHBvcnQgVEhSRUFEX0ZMQUcKLWV4cG9ydCBSRVNfQ0xJQgotZXhwb3J0IE1BS0VETEwKLWV4cG9ydCBBTk5PVF9GTEFHCi1leHBvcnQgQ19PWFJJREwKLWV4cG9ydCBTVUJQUk9KUwotZXhwb3J0IENGTEFHU19XSU4zMgotZXhwb3J0IENQUEZMQUdTX1dJTjMyCi0KLUlOQ0ZMQUdTIDo9Ci0KLVNIRUxMIDo9IC9iaW4vc2gKLQotTUxERVBESVIgOj0gLl9kCi1CQ0RJRElSICA6PSAuX2JjZGkKLU5DRElESVIgIDo9IC5fbmNkaQotCi1GSUxURVJfRVhUTlMgOj0gJS5tbGkgJS5tbCAlLm1sbCAlLm1seSAlLmlkbCAlLm94cmlkbCAlLmMgJS5tICUuJChFWFRfQ1hYKSAlLnJlcCAlLnpvZyAlLmdsYWRlCi0KLUZJTFRFUkVEICAgICA6PSAkKGZpbHRlciAkKEZJTFRFUl9FWFROUyksICQoU09VUkNFUykpCi1TT1VSQ0VfRElSUyAgOj0gJChmaWx0ZXItb3V0IC4vLCAkKHNvcnQgJChkaXIgJChGSUxURVJFRCkpKSkKLQotRklMVEVSRURfUkVQIDo9ICQoZmlsdGVyICUucmVwLCAkKEZJTFRFUkVEKSkKLURFUF9SRVAgICAgICA6PSAkKEZJTFRFUkVEX1JFUDolLnJlcD0kKE1MREVQRElSKS8lLmQpCi1BVVRPX1JFUCAgICAgOj0gJChGSUxURVJFRF9SRVA6LnJlcD0ubWwpCi0KLUZJTFRFUkVEX1pPRyA6PSAkKGZpbHRlciAlLnpvZywgJChGSUxURVJFRCkpCi1ERVBfWk9HICAgICAgOj0gJChGSUxURVJFRF9aT0c6JS56b2c9JChNTERFUERJUikvJS5kKQotQVVUT19aT0cgICAgIDo9ICQoRklMVEVSRURfWk9HOi56b2c9Lm1sKQotCi1GSUxURVJFRF9HTEFERSA6PSAkKGZpbHRlciAlLmdsYWRlLCAkKEZJTFRFUkVEKSkKLURFUF9HTEFERSAgICAgIDo9ICQoRklMVEVSRURfR0xBREU6JS5nbGFkZT0kKE1MREVQRElSKS8lLmQpCi1BVVRPX0dMQURFICAgICA6PSAkKEZJTFRFUkVEX0dMQURFOi5nbGFkZT0ubWwpCi0KLUZJTFRFUkVEX01MICA6PSAkKGZpbHRlciAlLm1sLCAkKEZJTFRFUkVEKSkKLURFUF9NTCAgICAgICA6PSAkKEZJTFRFUkVEX01MOiUubWw9JChNTERFUERJUikvJS5kKQotCi1GSUxURVJFRF9NTEkgOj0gJChmaWx0ZXIgJS5tbGksICQoRklMVEVSRUQpKQotREVQX01MSSAgICAgIDo9ICQoRklMVEVSRURfTUxJOi5tbGk9LmRpKQotCi1GSUxURVJFRF9NTEwgOj0gJChmaWx0ZXIgJS5tbGwsICQoRklMVEVSRUQpKQotREVQX01MTCAgICAgIDo9ICQoRklMVEVSRURfTUxMOiUubWxsPSQoTUxERVBESVIpLyUuZCkKLUFVVE9fTUxMICAgICA6PSAkKEZJTFRFUkVEX01MTDoubWxsPS5tbCkKLQotRklMVEVSRURfTUxZIDo9ICQoZmlsdGVyICUubWx5LCAkKEZJTFRFUkVEKSkKLURFUF9NTFkgICAgICA6PSAkKEZJTFRFUkVEX01MWTolLm1seT0kKE1MREVQRElSKS8lLmQpICQoRklMVEVSRURfTUxZOi5tbHk9LmRpKQotQVVUT19NTFkgICAgIDo9ICQoRklMVEVSRURfTUxZOi5tbHk9Lm1saSkgJChGSUxURVJFRF9NTFk6Lm1seT0ubWwpCi0KLUZJTFRFUkVEX0lETCA6PSAkKGZpbHRlciAlLmlkbCwgJChGSUxURVJFRCkpCi1ERVBfSURMICAgICAgOj0gJChGSUxURVJFRF9JREw6JS5pZGw9JChNTERFUERJUikvJS5kKSAkKEZJTFRFUkVEX0lETDouaWRsPS5kaSkKLUNfSURMICAgICAgICA6PSAkKEZJTFRFUkVEX0lETDolLmlkbD0lX3N0dWJzLmMpCi1pZm5kZWYgTk9JRExIRUFERVIKLSBDX0lETCArPSAkKEZJTFRFUkVEX0lETDouaWRsPS5oKQotZW5kaWYKLU9CSl9DX0lETCAgICA6PSAkKEZJTFRFUkVEX0lETDolLmlkbD0lX3N0dWJzLiQoRVhUX09CSikpCi1BVVRPX0lETCAgICAgOj0gJChGSUxURVJFRF9JREw6LmlkbD0ubWxpKSAkKEZJTFRFUkVEX0lETDouaWRsPS5tbCkgJChDX0lETCkKLQotRklMVEVSRURfT1hSSURMIDo9ICQoZmlsdGVyICUub3hyaWRsLCAkKEZJTFRFUkVEKSkKLURFUF9PWFJJREwgICAgICA6PSAkKEZJTFRFUkVEX09YUklETDolLm94cmlkbD0kKE1MREVQRElSKS8lLmQpICQoRklMVEVSRURfT1hSSURMOi5veHJpZGw9LmRpKQotQVVUT19PWFJJREwgICAgIDo9ICQoRklMVEVSRURfT1hSSURMOi5veHJpZGw9Lm1saSkgJChGSUxURVJFRF9PWFJJREw6Lm94cmlkbD0ubWwpICQoQ19PWFJJREwpCi0KLUZJTFRFUkVEX0NfQ1hYIDo9ICQoZmlsdGVyICUuYyAlLm0gJS4kKEVYVF9DWFgpLCAkKEZJTFRFUkVEKSkKLU9CSl9DX0NYWCAgICAgIDo9ICQoRklMVEVSRURfQ19DWFg6LmM9LiQoRVhUX09CSikpCi1PQkpfQ19DWFggICAgICA6PSAkKE9CSl9DX0NYWDoubT0uJChFWFRfT0JKKSkKLU9CSl9DX0NYWCAgICAgIDo9ICQoT0JKX0NfQ1hYOi4kKEVYVF9DWFgpPS4kKEVYVF9PQkopKQotCi1QUkVfVEFSR0VUUyAgKz0gJChBVVRPX01MTCkgJChBVVRPX01MWSkgJChBVVRPX0lETCkgJChBVVRPX09YUklETCkgJChBVVRPX1pPRykgJChBVVRPX1JFUCkgJChBVVRPX0dMQURFKQotCi1BTExfREVQUyAgICAgOj0gJChERVBfTUwpICQoREVQX01MSSkgJChERVBfTUxMKSAkKERFUF9NTFkpICQoREVQX0lETCkgJChERVBfT1hSSURMKSAkKERFUF9aT0cpICQoREVQX1JFUCkgJChERVBfR0xBREUpCi0KLU1MREVQUyAgICAgICA6PSAkKGZpbHRlciAlLmQsICQoQUxMX0RFUFMpKQotTUxJREVQUyAgICAgIDo9ICQoZmlsdGVyICUuZGksICQoQUxMX0RFUFMpKQotQkNERVBJUyAgICAgIDo9ICQoTUxJREVQUzolLmRpPSQoQkNESURJUikvJS5kaSkKLU5DREVQSVMgICAgICA6PSAkKE1MSURFUFM6JS5kaT0kKE5DRElESVIpLyUuZGkpCi0KLUFMTE1MICAgICAgICA6PSAkKGZpbHRlciAlLm1saSAlLm1sICUubWxsICUubWx5ICUuaWRsICUub3hyaWRsICUucmVwICUuem9nICUuZ2xhZGUsICQoRklMVEVSRUQpKQotCi1JTVBMT19JTlRGICAgOj0gJChBTExNTDolLm1saT0lLm1saS5fXykKLUlNUExPX0lOVEYgICA6PSAkKGZvcmVhY2ggZmlsZSwgJChJTVBMT19JTlRGKSwgXAotICAgICAgICAgICAgICAgICAgJChiYXNlbmFtZSAkKGZpbGUpKS5jbWkgJChiYXNlbmFtZSAkKGZpbGUpKS5jbW8pCi1JTVBMT19JTlRGICAgOj0gJChmaWx0ZXItb3V0ICUubWxpLmNtbywgJChJTVBMT19JTlRGKSkKLUlNUExPX0lOVEYgICA6PSAkKElNUExPX0lOVEY6JS5tbGkuY21pPSUuY21pKQotCi1JTVBMWF9JTlRGICAgOj0gJChJTVBMT19JTlRGOi5jbW89LmNteCkKLQotSU5URiAgICAgICAgIDo9ICQoZmlsdGVyICUuY21pLCAkKElNUExPX0lOVEYpKQotSU1QTF9DTU8gICAgIDo9ICQoZmlsdGVyICUuY21vLCAkKElNUExPX0lOVEYpKQotSU1QTF9DTVggICAgIDo9ICQoSU1QTF9DTU86LmNtbz0uY214KQotSU1QTF9BU00gICAgIDo9ICQoSU1QTF9DTU86LmNtbz0uYXNtKQotSU1QTF9TICAgICAgIDo9ICQoSU1QTF9DTU86LmNtbz0ucykKLQotT0JKX0xJTksgICAgIDo9ICQoT0JKX0NfSURMKSAkKE9CSl9DX0NYWCkKLU9CSl9GSUxFUyAgICA6PSAkKElNUExfQ01POi5jbW89LiQoRVhUX09CSikpICQoT0JKX0xJTkspCi0KLUVYRUNTICAgICAgICA6PSAkKGFkZHN1ZmZpeCAkKEVYRSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNvcnQgJChUT1BSRVNVTFQpICQoQkNSRVNVTFQpICQoTkNSRVNVTFQpKSkKLWlmZGVmIFdJTjMyCi0gIEVYRUNTICAgICAgKz0gJChCQ1JFU1VMVCkuZGxsICQoTkNSRVNVTFQpLmRsbAotZW5kaWYKLQotQ0xJQl9CQVNFICAgIDo9ICQoUkVTVUxUKSQoUkVTX0NMSUJfU1VGKQotaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLSAgUkVTX0NMSUIgICAgIDo9IGxpYiQoQ0xJQl9CQVNFKS4kKEVYVF9MSUIpCi1lbmRpZgotCi1pZmRlZiBXSU4zMgotRExMU09OQU1FIDo9ICQoQ0xJQl9CQVNFKS5kbGwKLWVsc2UKLURMTFNPTkFNRSA6PSBkbGwkKENMSUJfQkFTRSkuc28KLWVuZGlmCi0KLU5PTkVYRUNTICAgICA6PSAkKElOVEYpICQoSU1QTF9DTU8pICQoSU1QTF9DTVgpICQoSU1QTF9BU00pICQoSU1QTF9TKSBcCi0JCSQoT0JKX0ZJTEVTKSAkKFBSRV9UQVJHRVRTKSAkKEJDUkVTVUxUKS5jbWEgJChOQ1JFU1VMVCkuY214YSBcCi0JCSQoTkNSRVNVTFQpLiQoRVhUX0xJQikgJChCQ1JFU1VMVCkuY21pICQoQkNSRVNVTFQpLmNtbyBcCi0JCSQoTkNSRVNVTFQpLmNtaSAkKE5DUkVTVUxUKS5jbXggJChOQ1JFU1VMVCkubyBcCi0JCSQoUkVTX0NMSUIpICQoSU1QTF9DTU86LmNtbz0uYW5ub3QpIFwKLQkJJChMSUJfUEFDS19OQU1FKS5jbWkgJChMSUJfUEFDS19OQU1FKS5jbW8gJChMSUJfUEFDS19OQU1FKS5jbXggJChMSUJfUEFDS19OQU1FKS5vCi0KLWlmbmRlZiBTVEFUSUMKLSAgTk9ORVhFQ1MgKz0gJChETExTT05BTUUpCi1lbmRpZgotCi1pZm5kZWYgTElCSU5TVEFMTF9GSUxFUwotICBMSUJJTlNUQUxMX0ZJTEVTIDo9ICQoUkVTVUxUKS5tbGkgJChSRVNVTFQpLmNtaSAkKFJFU1VMVCkuY21hIFwKLQkJICAgICAgJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLiQoRVhUX0xJQikgJChSRVNfQ0xJQikKLSAgaWZuZGVmIFNUQVRJQwotICAgIGlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0gICAgICBMSUJJTlNUQUxMX0ZJTEVTICs9ICQoRExMU09OQU1FKQotICAgIGVuZGlmCi0gIGVuZGlmCi1lbmRpZgotCi1leHBvcnQgTElCSU5TVEFMTF9GSUxFUwotCi1pZmRlZiBXSU4zMgotICAjIHNvbWUgZXh0cmEgc3R1ZmYgaXMgY3JlYXRlZCB3aGlsZSBsaW5raW5nIERMTHMKLSAgTk9ORVhFQ1MgICArPSAkKEJDUkVTVUxUKS4kKEVYVF9MSUIpICQoQkNSRVNVTFQpLmV4cCAkKE5DUkVTVUxUKS5leHAgJChDTElCX0JBU0UpLmV4cCAkKENMSUJfQkFTRSkubGliCi1lbmRpZgotCi1UQVJHRVRTICAgICAgOj0gJChFWEVDUykgJChOT05FWEVDUykKLQotIyBJZiB0aGVyZSBhcmUgSURMLWZpbGVzCi1pZm5lcSAoJChzdHJpcCAkKEZJTFRFUkVEX0lETCkpLCkKLSAgTUFZQkVfSURMIDo9IC1jY2xpYiAtbGNhbWxpZGwKLWVuZGlmCi0KLWlmZGVmIFVTRV9DQU1MUDQKLSAgQ0FNTFA0UEFUSCA6PSBcCi0gICAgJChzaGVsbCAkKENBTUxQNCkgLXdoZXJlIDI+L2Rldi9udWxsIHx8IGVjaG8gL3Vzci9sb2NhbC9saWIvY2FtbHA0KQotICBJTkNGTEFHUyA6PSAtSSAkKENBTUxQNFBBVEgpCi0gIENJTkNGTEFHUyA6PSAtSSQoQ0FNTFA0UEFUSCkKLWVuZGlmCi0KLURJTkNGTEFHUyA6PSAkKElOQ0ZMQUdTKSAkKFNPVVJDRV9ESVJTOiU9LUkgJSkgJChPQ0FNTF9ERUZBVUxUX0RJUlM6JT0tSSAlKQotSU5DRkxBR1MgOj0gJChESU5DRkxBR1MpICQoSU5DRElSUzolPS1JICUpCi1DSU5DRkxBR1MgKz0gJChTT1VSQ0VfRElSUzolPS1JJSkgJChJTkNESVJTOiU9LUklKSAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1JJSkKLQotaWZuZGVmIE1TVkMKLSAgQ0xJQkZMQUdTICs9ICQoU09VUkNFX0RJUlM6JT0tTCUpICQoTElCRElSUzolPS1MJSkgXAotICAgICAgICAgICAgICAgJChFWFRMSUJESVJTOiU9LUwlKSAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1MJSkKLQotICBpZmVxICgkKEVMRl9SUEFUSCksIHllcykKLSAgICBDTElCRkxBR1MgKz0gJChFWFRMSUJESVJTOiU9LVdsLCQoUlBBVEhfRkxBRyklKQotICBlbmRpZgotZW5kaWYKLQotaWZuZGVmIFBST0ZJTElORwotICBJTlRGX09DQU1MQyA6PSAkKE9DQU1MQykKLWVsc2UKLSAgaWZuZGVmIFRIUkVBRFMKLSAgICBJTlRGX09DQU1MQyA6PSAkKE9DQU1MQ1ApIC1wICQoT0NBTUxDUEZMQUdTKQotICBlbHNlCi0gICAgIyBPQ2FtbCBkb2VzIG5vdCBzdXBwb3J0IHByb2ZpbGluZyBieXRlIGNvZGUKLSAgICAjIHdpdGggdGhyZWFkcyAoeWV0KSwgdGhlcmVmb3JlIHdlIGZvcmNlIGFuIGVycm9yLgotICAgIGlmbmRlZiBSRUFMX09DQU1MQwotICAgICAgJChlcnJvciBQcm9maWxpbmcgb2YgbXVsdGl0aHJlYWRlZCBieXRlIGNvZGUgbm90IHlldCBzdXBwb3J0ZWQgYnkgT0NhbWwpCi0gICAgZW5kaWYKLSAgICBJTlRGX09DQU1MQyA6PSAkKE9DQU1MQykKLSAgZW5kaWYKLWVuZGlmCi0KLWlmbmRlZiBNU1ZDCi0gIENPTU1PTl9MREZMQUdTIDo9ICQoTERGTEFHUzolPS1jY29wdCAlKSAkKFNPVVJDRV9ESVJTOiU9LWNjb3B0IC1MJSkgXAotCQkgICAgJChMSUJESVJTOiU9LWNjb3B0IC1MJSkgJChFWFRMSUJESVJTOiU9LWNjb3B0IC1MJSkgXAotCQkgICAgJChFWFRMSUJESVJTOiU9LWNjb3B0IC1XbCAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1jY29wdCAtTCUpKQotCi0gIGlmZXEgKCQoRUxGX1JQQVRIKSx5ZXMpCi0gICAgQ09NTU9OX0xERkxBR1MgKz0gJChFWFRMSUJESVJTOiU9LWNjb3B0IC1XbCwkKFJQQVRIX0ZMQUcpJSkKLSAgZW5kaWYKLWVsc2UKLSAgQ09NTU9OX0xERkxBR1MgOj0gLWNjb3B0ICIvbGluayAtTk9ERUZBVUxUTElCOkxJQkMgJChMREZMQUdTOiU9JSkgJChTT1VSQ0VfRElSUzolPS1MSUJQQVRIOiUpIFwKLQkJICAgICQoTElCRElSUzolPS1MSUJQQVRIOiUpICQoRVhUTElCRElSUzolPS1MSUJQQVRIOiUpIFwKLQkJICAgICQoT0NBTUxfREVGQVVMVF9ESVJTOiU9LUxJQlBBVEg6JSkgIgotZW5kaWYKLQotQ0xJQlNfT1BUUyA6PSAkKENMSUJTOiU9LWNjbGliIC1sJSkgJChDRlJBTUVXT1JLUzolPS1jY2xpYiAnLWZyYW1ld29yayAlJykKLWlmZGVmIE1TVkMKLSAgaWZuZGVmIFNUQVRJQwotICAjIE1TVkMgbGlicmFyaWVzIGRvIG5vdCBoYXZlICdsaWInIHByZWZpeAotICBDTElCU19PUFRTIDo9ICQoQ0xJQlM6JT0tY2NsaWIgJS5saWIpCi0gIGVuZGlmCi1lbmRpZgotCi1pZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotICBpZmRlZiBDUkVBVEVfTElCCi0gICAgT0JKU19MSUJTIDo9IC1jY2xpYiAtbCQoQ0xJQl9CQVNFKSAkKENMSUJTX09QVFMpICQoTUFZQkVfSURMKQotICBlbHNlCi0gICAgT0JKU19MSUJTIDo9ICQoT0JKX0xJTkspICQoQ0xJQlNfT1BUUykgJChNQVlCRV9JREwpCi0gIGVuZGlmCi1lbHNlCi0gIE9CSlNfTElCUyA6PSAkKENMSUJTX09QVFMpICQoTUFZQkVfSURMKQotZW5kaWYKLQotIyBJZiB3ZSBoYXZlIHRvIG1ha2UgYnl0ZS1jb2RlCi1pZm5kZWYgUkVBTF9PQ0FNTEMKLSAgQllURV9PQ0FNTCA6PSB5Ci0KLSAgIyBFWFRSQURFUFMgaXMgYWRkZWQgZGVwZW5kZW5jaWVzIHdlIGhhdmUgdG8gaW5zZXJ0IGZvciBhbGwKLSAgIyBleGVjdXRhYmxlIGZpbGVzIHdlIGdlbmVyYXRlLiAgSWRlYWxseSBpdCBzaG91bGQgYmUgYWxsIG9mIHRoZQotICAjIGxpYnJhcmllcyB3ZSB1c2UsIGJ1dCBpdCdzIGhhcmQgdG8gZmluZCB0aGUgb25lcyB0aGF0IGdldCBzZWFyY2hlZCBvbgotICAjIHRoZSBwYXRoIHNpbmNlIEkgZG9uJ3Qga25vdyB0aGUgcGF0aHMgYnVpbHQgaW50byB0aGUgY29tcGlsZXIsIHNvCi0gICMganVzdCBpbmNsdWRlIHRoZSBvbmVzIHdpdGggc2xhc2hlcyBpbiB0aGVpciBuYW1lcy4KLSAgRVhUUkFERVBTIDo9ICQoYWRkc3VmZml4IC5jbWEsJChmb3JlYWNoIGksJChMSUJTKSwkKGlmICQoZmluZHN0cmluZyAvLCQoaSkpLCQoaSkpKSkKLSAgU1BFQ0lBTF9PQ0FNTEZMQUdTIDo9ICQoT0NBTUxCQ0ZMQUdTKQotCi0gIFJFQUxfT0NBTUxDIDo9ICQoSU5URl9PQ0FNTEMpCi0KLSAgUkVBTF9JTVBMIDo9ICQoSU1QTF9DTU8pCi0gIFJFQUxfSU1QTF9JTlRGIDo9ICQoSU1QTE9fSU5URikKLSAgSU1QTF9TVUYgOj0gLmNtbwotCi0gIERFUEZMQUdTICA6PQotICBNQUtFX0RFUFMgOj0gJChNTERFUFMpICQoQkNERVBJUykKLQotICBpZmRlZiBDUkVBVEVfTElCCi0gICAgb3ZlcnJpZGUgQ0ZMQUdTIDo9ICQoUElDX0NGTEFHUykgJChDRkxBR1MpCi0gICAgb3ZlcnJpZGUgQ1BQRkxBR1MgOj0gJChQSUNfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpCi0gICAgaWZuZGVmIFNUQVRJQwotICAgICAgaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLQlNQUtFRExMIDo9ICQoRExMU09OQU1FKQotCUFMTF9MREZMQUdTIDo9IC1kbGxpYiAkKERMTFNPTkFNRSkKLSAgICAgIGVuZGlmCi0gICAgZW5kaWYKLSAgZW5kaWYKLQotICBpZm5kZWYgTk9fQ1VTVE9NCi0gICAgaWZuZXEgIiQoc3RyaXAgJChPQkpfTElOSykgJChUSFJFQURTKSAkKE1BWUJFX0lETCkgJChDTElCUykgJChDRlJBTUVXT1JLUykpIiAiIgotICAgICAgQUxMX0xERkxBR1MgKz0gLWN1c3RvbQotICAgIGVuZGlmCi0gIGVuZGlmCi0KLSAgQUxMX0xERkxBR1MgKz0gJChJTkNGTEFHUykgJChPQ0FNTExERkxBR1MpICQoT0NBTUxCTERGTEFHUykgXAotICAgICAgICAgICAgICAgICAkKENPTU1PTl9MREZMQUdTKSAkKExJQlM6JT0lLmNtYSkKLSAgQ0FNTElETERMTEZMQUdTIDo9Ci0KLSAgaWZkZWYgVEhSRUFEUwotICAgIGlmZGVmIFZNVEhSRUFEUwotICAgICAgVEhSRUFEX0ZMQUcgOj0gLXZtdGhyZWFkCi0gICAgZWxzZQotICAgICAgVEhSRUFEX0ZMQUcgOj0gLXRocmVhZAotICAgIGVuZGlmCi0gICAgQUxMX0xERkxBR1MgOj0gJChUSFJFQURfRkxBRykgJChBTExfTERGTEFHUykKLSAgICBpZm5kZWYgQ1JFQVRFX0xJQgotICAgICAgaWZuZGVmIFJFQUxfT0NBTUxGSU5ECi0gICAgICAgIEFMTF9MREZMQUdTIDo9IHVuaXguY21hIHRocmVhZHMuY21hICQoQUxMX0xERkxBR1MpCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gIGVuZGlmCi0KLSMgd2UgaGF2ZSB0byBtYWtlIG5hdGl2ZS1jb2RlCi1lbHNlCi0gIEVYVFJBREVQUyA6PSAkKGFkZHN1ZmZpeCAuY214YSwkKGZvcmVhY2ggaSwkKExJQlMpLCQoaWYgJChmaW5kc3RyaW5nIC8sJChpKSksJChpKSkpKQotICBpZm5kZWYgUFJPRklMSU5HCi0gICAgU1BFQ0lBTF9PQ0FNTEZMQUdTIDo9ICQoT0NBTUxOQ0ZMQUdTKQotICAgIFBMREZMQUdTIDo9Ci0gIGVsc2UKLSAgICBTUEVDSUFMX09DQU1MRkxBR1MgOj0gLXAgJChPQ0FNTE5DRkxBR1MpCi0gICAgUExERkxBR1MgOj0gLXAKLSAgZW5kaWYKLQotICBSRUFMX0lNUEwgOj0gJChJTVBMX0NNWCkKLSAgUkVBTF9JTVBMX0lOVEYgOj0gJChJTVBMWF9JTlRGKQotICBJTVBMX1NVRiA6PSAuY214Ci0KLSAgb3ZlcnJpZGUgQ1BQRkxBR1MgOj0gLUROQVRJVkVfQ09ERSAkKENQUEZMQUdTKQotCi0gIERFUEZMQUdTICA6PSAtbmF0aXZlCi0gIE1BS0VfREVQUyA6PSAkKE1MREVQUykgJChOQ0RFUElTKQotCi0gIEFMTF9MREZMQUdTIDo9ICQoUExERkxBR1MpICQoSU5DRkxBR1MpICQoT0NBTUxMREZMQUdTKSBcCi0gICAgICAgICAgICAgICAgICQoT0NBTUxOTERGTEFHUykgJChDT01NT05fTERGTEFHUykKLSAgQ0FNTElETERMTEZMQUdTIDo9IC1vcHQKLQotICBpZm5kZWYgQ1JFQVRFX0xJQgotICAgIEFMTF9MREZMQUdTICs9ICQoTElCUzolPSUuY214YSkKLSAgZWxzZQotICAgIG92ZXJyaWRlIENGTEFHUyA6PSAkKFBJQ19DRkxBR1MpICQoQ0ZMQUdTKQotICAgIG92ZXJyaWRlIENQUEZMQUdTIDo9ICQoUElDX0NQUEZMQUdTKSAkKENQUEZMQUdTKQotICBlbmRpZgotCi0gIGlmZGVmIFRIUkVBRFMKLSAgICBUSFJFQURfRkxBRyA6PSAtdGhyZWFkCi0gICAgQUxMX0xERkxBR1MgOj0gJChUSFJFQURfRkxBRykgJChBTExfTERGTEFHUykKLSAgICBpZm5kZWYgQ1JFQVRFX0xJQgotICAgICAgaWZuZGVmIFJFQUxfT0NBTUxGSU5ECi0gICAgICAgIEFMTF9MREZMQUdTIDo9IHVuaXguY214YSB0aHJlYWRzLmNteGEgJChBTExfTERGTEFHUykKLSAgICAgIGVuZGlmCi0gICAgZW5kaWYKLSAgZW5kaWYKLWVuZGlmCi0KLWV4cG9ydCBNQUtFX0RFUFMKLQotaWZkZWYgQU5OT1RBVEUKLSAgQU5OT1RfRkxBRyA6PSAtZHR5cGVzCi1lbHNlCi1lbmRpZgotCi1BTExfT0NBTUxDRkxBR1MgOj0gJChUSFJFQURfRkxBRykgJChBTk5PVF9GTEFHKSAkKE9DQU1MRkxBR1MpIFwKLSAgICAgICAgICAgICAgICAgICAkKElOQ0ZMQUdTKSAkKFNQRUNJQUxfT0NBTUxGTEFHUykKLQotaWZkZWYgbWFrZV9kZXBzCi0gIC1pbmNsdWRlICQoTUFLRV9ERVBTKQotICBQUkVfVEFSR0VUUyA6PQotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFVTRVIgUlVMRVMKLQotIyBDYWxsICJPQ2FtbE1ha2VmaWxlIFFVSUVUPSIgdG8gZ2V0IHJpZCBvZiBhbGwgb2YgdGhlIEAncy4KLVFVSUVUPUAKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIChkZWZhdWx0KQotYnl0ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoQkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMKLWJjOglieXRlLWNvZGUKLQotYnl0ZS1jb2RlLW5vbGluazoJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIG5vbGluayBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzCi1iY25sOglieXRlLWNvZGUtbm9saW5rCi0KLXRvcDoJCQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChUT1BSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMKLQotIyBnZW5lcmF0ZXMgbmF0aXZlLWNvZGUKLQotbmF0aXZlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChOQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jOgluYXRpdmUtY29kZQotCi1uYXRpdmUtY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jbmw6CW5hdGl2ZS1jb2RlLW5vbGluawotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzCi1ieXRlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKEJDUkVTVUxUKS5jbWEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1iY2w6CWJ5dGUtY29kZS1saWJyYXJ5Ci0KLSMgZ2VuZXJhdGVzIG5hdGl2ZS1jb2RlIGxpYnJhcmllcwotbmF0aXZlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKE5DUkVTVUxUKS5jbXhhIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlDUkVBVEVfTElCPXllcyBcCi0JCQkJbWFrZV9kZXBzPXllcwotbmNsOgluYXRpdmUtY29kZS1saWJyYXJ5Ci0KLWlmZGVmIFdJTjMyCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgZGxsCi1ieXRlLWNvZGUtZGxsOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKEJDUkVTVUxUKS5kbGwgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLWJjZDoJYnl0ZS1jb2RlLWRsbAotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZSBkbGwKLW5hdGl2ZS1jb2RlLWRsbDoJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKE5DUkVTVUxUKS5kbGwgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jZDoJbmF0aXZlLWNvZGUtZGxsCi1lbmRpZgotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLWRlYnVnLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChCQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZGM6CWRlYnVnLWNvZGUKLQotZGVidWctY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZGNubDoJZGVidWctY29kZS1ub2xpbmsKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uIChuYXRpdmUgY29kZSkKLWRlYnVnLW5hdGl2ZS1jb2RlOgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChOQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZG5jOglkZWJ1Zy1uYXRpdmUtY29kZQotCi1kZWJ1Zy1uYXRpdmUtY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZG5jbmw6CWRlYnVnLW5hdGl2ZS1jb2RlLW5vbGluawotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uCi1kZWJ1Zy1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChCQ1JFU1VMVCkuY21hIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQlPQ0FNTEZMQUdTPSItZyAkKE9DQU1MRkxBR1MpIiBcCi0JCQkJT0NBTUxMREZMQUdTPSItZyAkKE9DQU1MTERGTEFHUykiCi1kY2w6CWRlYnVnLWNvZGUtbGlicmFyeQotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uIChuYXRpdmUgY29kZSkKLWRlYnVnLW5hdGl2ZS1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChOQ1JFU1VMVCkuY21hIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQlPQ0FNTEZMQUdTPSItZyAkKE9DQU1MRkxBR1MpIiBcCi0JCQkJT0NBTUxMREZMQUdTPSItZyAkKE9DQU1MTERGTEFHUykiCi1kbmNsOglkZWJ1Zy1uYXRpdmUtY29kZS1saWJyYXJ5Ci0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSBmb3IgcHJvZmlsaW5nCi1wcm9maWxpbmctYnl0ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoQkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIFBST0ZJTElORz0ieSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBiYzoJcHJvZmlsaW5nLWJ5dGUtY29kZQotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZQotCi1wcm9maWxpbmctbmF0aXZlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChOQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCVBST0ZJTElORz0ieSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBuYzoJcHJvZmlsaW5nLW5hdGl2ZS1jb2RlCi0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSBsaWJyYXJpZXMKLXByb2ZpbGluZy1ieXRlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKEJDUkVTVUxUKS5jbWEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgUFJPRklMSU5HPSJ5IiBcCi0JCQkJQ1JFQVRFX0xJQj15ZXMgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBiY2w6CXByb2ZpbGluZy1ieXRlLWNvZGUtbGlicmFyeQotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZSBsaWJyYXJpZXMKLXByb2ZpbGluZy1uYXRpdmUtY29kZS1saWJyYXJ5OgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoUkVTX0NMSUIpICQoTkNSRVNVTFQpLmNteGEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgUFJPRklMSU5HPSJ5IiBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJQ1JFQVRFX0xJQj15ZXMgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBuY2w6CXByb2ZpbGluZy1uYXRpdmUtY29kZS1saWJyYXJ5Ci0KLSMgcGFja3MgYnl0ZS1jb2RlIG9iamVjdHMKLXBhY2stYnl0ZS1jb2RlOgkJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKEJDUkVTVUxUKS5jbW8gXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgXAotCQkJCVBBQ0tfTElCPXllcyBtYWtlX2RlcHM9eWVzCi1wYWJjOglwYWNrLWJ5dGUtY29kZQotCi0jIHBhY2tzIG5hdGl2ZS1jb2RlIG9iamVjdHMKLXBhY2stbmF0aXZlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoTkNSRVNVTFQpLmNteCAkKE5DUkVTVUxUKS5vIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlQQUNLX0xJQj15ZXMgbWFrZV9kZXBzPXllcwotcGFuYzoJcGFjay1uYXRpdmUtY29kZQotCi0jIGdlbmVyYXRlcyBIVE1MLWRvY3VtZW50YXRpb24KLWh0ZG9jOgkkKERPQ19ESVIpLyQoUkVTVUxUKS9odG1sL2luZGV4Lmh0bWwKLQotIyBnZW5lcmF0ZXMgTGF0ZXgtZG9jdW1lbnRhdGlvbgotbGFkb2M6CSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy50ZXgKLQotIyBnZW5lcmF0ZXMgUG9zdFNjcmlwdC1kb2N1bWVudGF0aW9uCi1wc2RvYzoJJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBzCi0KLSMgZ2VuZXJhdGVzIFBERi1kb2N1bWVudGF0aW9uCi1wZGZkb2M6CSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wZGYKLQotIyBnZW5lcmF0ZXMgYWxsIHN1cHBvcnRlZCBmb3JtcyBvZiBkb2N1bWVudGF0aW9uCi1kb2M6IGh0ZG9jIGxhZG9jIHBzZG9jIHBkZmRvYwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTE9XIExFVkVMIFJVTEVTCi0KLSQoUkVBTF9SRVNVTFQpOgkJJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykgJChFWFRSQURFUFMpICQoUkVTVUxUREVQUykKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIFwKLQkJCQkkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpICQoT0NBTUxfRklORF9MSU5LUEtHKSBcCi0JCQkJJChBTExfTERGTEFHUykgJChPQkpTX0xJQlMpIC1vICRAJChFWEUpIFwKLQkJCQkkKFJFQUxfSU1QTCkKLQotbm9saW5rOgkJCSQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspCi0KLWlmZGVmIFdJTjMyCi0kKFJFQUxfUkVTVUxUKS5kbGw6CSQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspCi0JCQkkKENBTUxJRExETEwpICQoQ0FNTElETERMTEZMQUdTKSAkKE9CSl9MSU5LKSAkKENMSUJTKSBcCi0JCQkJLW8gJEAgJChSRUFMX0lNUEwpCi1lbmRpZgotCi0lJChUT1BTVUZGSVgpOgkJJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykgJChFWFRSQURFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MTUtUT1ApIFwKLQkJCQkkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpICQoT0NBTUxfRklORF9MSU5LUEtHKSBcCi0JCQkJJChBTExfTERGTEFHUykgJChPQkpTX0xJQlMpIC1vICRAJChFWEUpIFwKLQkJCQkkKFJFQUxfSU1QTCkKLQotLlNVRkZJWEVTOgkJLm1saSAubWwgLmNtaSAuY21vIC5jbXggLmNtYSAuY214YSAuJChFWFRfT0JKKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAubWx5IC5kaSAuZCAuJChFWFRfTElCKSAuaWRsICUub3hyaWRsIC5jIC5tIC4kKEVYVF9DWFgpIC5oIC5zbyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAucmVwIC56b2cgLmdsYWRlCi0KLWlmbmRlZiBTVEFUSUMKLWlmZGVmIE1JTkdXCi0kKERMTFNPTkFNRSk6CQkkKE9CSl9MSU5LKQotCQkJJChDQykgJChDRkxBR1MpICQoQ0ZMQUdTX1dJTjMyKSAkKE9CSl9MSU5LKSAtc2hhcmVkIC1vICRAIFwKLQkJCS1XbCwtLXdob2xlLWFyY2hpdmUgJCh3aWxkY2FyZCAkKGZvcmVhY2ggZGlyLCQoTElCRElSUyksJChDTElCUzolPSQoZGlyKS9saWIlLmEpKSkgXAotCQkJICQoT0NBTUxMSUJQQVRIKS9vY2FtbHJ1bi5hIFwKLQkJCS1XbCwtLWV4cG9ydC1hbGwtc3ltYm9scyBcCi0JCQktV2wsLS1uby13aG9sZS1hcmNoaXZlCi1lbHNlCi1pZmRlZiBNU1ZDCi0kKERMTFNPTkFNRSk6CQkkKE9CSl9MSU5LKQotCQkJbGluayAvTk9MT0dPIC9ETEwgL09VVDokQCAkKE9CSl9MSU5LKSBcCi0JCQkgJCh3aWxkY2FyZCAkKGZvcmVhY2ggZGlyLCQoTElCRElSUyksJChDTElCUzolPSQoZGlyKS8lLmxpYikpKSBcCi0JCQkgJChPQ0FNTExJQlBBVEgpL29jYW1scnVuLmxpYgotCi1lbHNlCi0kKERMTFNPTkFNRSk6CQkkKE9CSl9MSU5LKQotCQkJJChPQ0FNTE1LTElCKSAkKElOQ0ZMQUdTKSAkKENMSUJGTEFHUykgXAotCQkJCS1vICQoQ0xJQl9CQVNFKSAkKE9CSl9MSU5LKSAkKENMSUJTOiU9LWwlKSAkKENGUkFNRVdPUktTOiU9LWZyYW1ld29yayAlKSBcCi0JCQkJJChPQ0FNTE1LTElCX0ZMQUdTKQotZW5kaWYKLWVuZGlmCi1lbmRpZgotCi1pZm5kZWYgTElCX1BBQ0tfTkFNRQotJChSRVNVTFQpLmNtYToJCSQoUkVBTF9JTVBMX0lOVEYpICQoTUFLRURMTCkgJChFWFRSQURFUFMpICQoUkVTVUxUREVQUykKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIC1hICQoQUxMX0xERkxBR1MpICQoT0JKU19MSUJTKSAtbyAkQCAkKFJFQUxfSU1QTCkKLQotJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLiQoRVhUX0xJQik6CSQoUkVBTF9JTVBMX0lOVEYpICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MT1BUKSAtYSAkKEFMTF9MREZMQUdTKSAkKE9CSlNfTElCUykgLW8gJEAgJChSRUFMX0lNUEwpCi1lbHNlCi1pZmRlZiBCWVRFX09DQU1MCi0kKExJQl9QQUNLX05BTUUpLmNtaSAkKExJQl9QQUNLX05BTUUpLmNtbzogJChSRUFMX0lNUExfSU5URikKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIC1wYWNrIC1vICQoTElCX1BBQ0tfTkFNRSkuY21vICQoT0NBTUxMREZMQUdTKSAkKFJFQUxfSU1QTCkKLWVsc2UKLSQoTElCX1BBQ0tfTkFNRSkuY21pICQoTElCX1BBQ0tfTkFNRSkuY214OiAkKFJFQUxfSU1QTF9JTlRGKQotCQkJJChSRUFMX09DQU1MRklORCkgJChPQ0FNTE9QVCkgLXBhY2sgLW8gJChMSUJfUEFDS19OQU1FKS5jbXggICQoT0NBTUxMREZMQUdTKSAkKFJFQUxfSU1QTCkKLWVuZGlmCi0KLSQoUkVTVUxUKS5jbWE6CQkkKExJQl9QQUNLX05BTUUpLmNtaSAkKExJQl9QQUNLX05BTUUpLmNtbyAkKE1BS0VETEwpICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAtYSAkKEFMTF9MREZMQUdTKSAkKE9CSlNfTElCUykgLW8gJEAgJChMSUJfUEFDS19OQU1FKS5jbW8KLQotJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLiQoRVhUX0xJQik6CSQoTElCX1BBQ0tfTkFNRSkuY21pICQoTElCX1BBQ0tfTkFNRSkuY214ICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MT1BUKSAtYSAkKGZpbHRlci1vdXQgLWN1c3RvbSwgJChBTExfTERGTEFHUykpICQoT0JKU19MSUJTKSAtbyAkQCAkKExJQl9QQUNLX05BTUUpLmNteAotZW5kaWYKLQotJChSRVNfQ0xJQik6IAkJJChPQkpfTElOSykKLWlmbmRlZiBNU1ZDCi0gIGlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0JCSAgICAgICQoQVIpIHJjcyAkQCAkKE9CSl9MSU5LKQotICBlbmRpZgotZWxzZQotICBpZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotCQkJbGliIC1ub2xvZ28gLWRlYnVndHlwZTpjdiAtb3V0OiQoUkVTX0NMSUIpICQoT0JKX0xJTkspCi0gIGVuZGlmCi1lbmRpZgotCi0ubWxpLmNtaTogJChFWFRSQURFUFMpCi0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKElOVEZfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAkKFRIUkVBRF9GTEFHKSAkKEFOTk9UX0ZMQUcpIFwKLQkJCQkkKE9DQU1MRkxBR1MpICQoSU5DRkxBR1MpICQ8OyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoSU5URl9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jICQoVEhSRUFEX0ZMQUcpICQoQU5OT1RfRkxBRykgXAotCQkJCSQoT0NBTUxGTEFHUykgJChJTkNGTEFHUykgJDw7IFwKLQkJCWVsc2UgXAotCQkJICAgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChJTlRGX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgJChUSFJFQURfRkxBRykgJChBTk5PVF9GTEFHKSBcCi0JCQkJJChPQ0FNTEZMQUdTKSAkKElOQ0ZMQUdTKSAkPDsgXAotCQkJICAgICQoUkVBTF9PQ0FNTEZJTkQpICQoSU5URl9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jIC1wcCAiJCRwcCAkKFBQRkxBR1MpIiAkKFRIUkVBRF9GTEFHKSAkKEFOTk9UX0ZMQUcpIFwKLQkJCQkkKE9DQU1MRkxBR1MpICQoSU5DRkxBR1MpICQ8OyBcCi0JCQlmaQotCi0ubWwuY21pIC5tbC4kKEVYVF9PQkopIC5tbC5jbXggLm1sLmNtbzogJChFWFRSQURFUFMpCi0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAkKEFMTF9PQ0FNTENGTEFHUykgJDw7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgJChBTExfT0NBTUxDRkxBR1MpICQ8OyBcCi0JCQllbHNlIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAtcHAgXCIkJHBwICQoUFBGTEFHUylcIiAkKEFMTF9PQ0FNTENGTEFHUykgJDw7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgLXBwICIkJHBwICQoUFBGTEFHUykiICQoQUxMX09DQU1MQ0ZMQUdTKSAkPDsgXAotCQkJZmkKLQotaWZkZWYgUEFDS19MSUIKLSQoUkVBTF9SRVNVTFQpLmNtbyAkKFJFQUxfUkVTVUxUKS5jbXggJChSRUFMX1JFU1VMVCkubzogJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykgJChFWFRSQURFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAtcGFjayAkKEFMTF9MREZMQUdTKSBcCi0JCQkJJChPQkpTX0xJQlMpIC1vICRAICQoUkVBTF9JTVBMKQotZW5kaWYKLQotLlBSRUNJT1VTOgkJJS5tbAotJS5tbDoJCQklLm1sbAotCQkJJChPQ0FNTExFWCkgJChMRkxBR1MpICQ8Ci0KLS5QUkVDSU9VUzogICAgICAgICAgICAgICUubWwgJS5tbGkKLSUubWwgJS5tbGk6ICAgICAgICAgICAgICUubWx5Ci0JCQkkKE9DQU1MWUFDQykgJChZRkxBR1MpICQ8Ci0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJ3MvLiooXCpwcCBcKFteKl0qXCkgXCopLiovXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgISAteiAiJCRwcCIgXTsgdGhlbiBcCi0JCQkgIG12ICQqLm1sICQqLm1sLnRlbXBvcmFyeTsgXAotCQkJICBlY2hvICIoKnBwICQkcHAgJChQUEZMQUdTKSopIiA+ICQqLm1sOyBcCi0JCQkgIGNhdCAkKi5tbC50ZW1wb3JhcnkgPj4gJCoubWw7IFwKLQkJCSAgcm0gJCoubWwudGVtcG9yYXJ5OyBcCi0JCQkgIG12ICQqLm1saSAkKi5tbGkudGVtcG9yYXJ5OyBcCi0JCQkgIGVjaG8gIigqcHAgJCRwcCAkKFBQRkxBR1MpKikiID4gJCoubWxpOyBcCi0JCQkgIGNhdCAkKi5tbGkudGVtcG9yYXJ5ID4+ICQqLm1saTsgXAotCQkJICBybSAkKi5tbGkudGVtcG9yYXJ5OyBcCi0JCQlmaQotCi0KLS5QUkVDSU9VUzoJCSUubWwKLSUubWw6CQkJJS5yZXAKLQkJCSQoQ0FNRUxFT05fUkVQT1JUKSAkKENBTUVMRU9OX1JFUE9SVF9GTEFHUykgLWdlbiAkPAotCi0uUFJFQ0lPVVM6CQklLm1sCi0lLm1sOgkJCSUuem9nCi0JCQkkKENBTUVMRU9OX1pPR0dZKSAgJChDQU1FTEVPTl9aT0dHWV9GTEFHUykgLWltcGwgJDwgPiAkQAotCi0uUFJFQ0lPVVM6CQklLm1sCi0lLm1sOgkJCSUuZ2xhZGUKLQkJCSQoT0NBTUxfR0xBREVDQykgICQoT0NBTUxfR0xBREVDQ19GTEFHUykgJDwgPiAkQAotCi0uUFJFQ0lPVVM6CQklLm1sICUubWxpCi0lLm1sICUubWxpOgkJJS5veHJpZGwKLQkJCSQoT1hSSURMKSAkPAotCi0uUFJFQ0lPVVM6CQklLm1sICUubWxpICVfc3R1YnMuYyAlLmgKLSUubWwgJS5tbGkgJV9zdHVicy5jICUuaDoJCSUuaWRsCi0JCQkkKENBTUxJREwpICQoTUFZQkVfSURMX0hFQURFUikgJChJRExGTEFHUykgXAotCQkJCSQoQ0FNTElETEZMQUdTKSAkPAotCQkJJChRVUlFVClpZiBbICQoTk9JRExIRUFERVIpIF07IHRoZW4gdG91Y2ggJCouaDsgZmkKLQotLmMuJChFWFRfT0JKKToKLQkJCSQoT0NBTUxDKSAtYyAtY2MgIiQoQ0MpIiAtY2NvcHQgIiQoQ0ZMQUdTKSBcCi0JCQkJJChDUFBGTEFHUykgJChDUFBGTEFHU19XSU4zMikgXAotCQkJCSQoQ0ZMQUdTX1dJTjMyKSAkKENJTkNGTEFHUykgJChDRkxBR19PKSRAICIgJDwKLQotLm0uJChFWFRfT0JKKToKLQkJCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKENJTkNGTEFHUykgJChDUFBGTEFHUykgXAotCQkJCS1JJyQoT0NBTUxMSUJQQVRIKScgXAotCQkJCSQ8ICQoQ0ZMQUdfTykkQAotCi0uJChFWFRfQ1hYKS4kKEVYVF9PQkopOgotCQkJJChDWFgpIC1jICQoQ1hYRkxBR1MpICQoQ0lOQ0ZMQUdTKSAkKENQUEZMQUdTKSBcCi0JCQkJLUknJChPQ0FNTExJQlBBVEgpJyBcCi0JCQkJJDwgJChDRkxBR19PKSRACi0KLSQoTUxERVBESVIpLyUuZDoJJS5tbAotCQkJJChRVUlFVClpZiBbICEgLWQgJChARCkgXTsgdGhlbiBta2RpciAtcCAkKEBEKTsgZmkKLQkJCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgLXogIiQkcHAiIF07IHRoZW4gXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJJChESU5DRkxBR1MpICQ8IFw+ICRAOyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJJChESU5DRkxBR1MpICQ8ID4gJEA7IFwKLQkJCWVsc2UgXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgJChESU5DRkxBR1MpICQ8IFw+ICRAOyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJLXBwICIkJHBwICQoUFBGTEFHUykiICQoRElOQ0ZMQUdTKSAkPCA+ICRAOyBcCi0JCQlmaQotCi0kKEJDRElESVIpLyUuZGkgJChOQ0RJRElSKS8lLmRpOgklLm1saQotCQkJJChRVUlFVClpZiBbICEgLWQgJChARCkgXTsgdGhlbiBta2RpciAtcCAkKEBEKTsgZmkKLQkJCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgLXogIiQkcHAiIF07IHRoZW4gXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoREVQRkxBR1MpICQoRElOQ0ZMQUdTKSAkPCBcPiAkQDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKERFUEZMQUdTKSAkKERJTkNGTEFHUykgJDwgPiAkQDsgXAotCQkJZWxzZSBcCi0JCQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERFUCkgJChERVBGTEFHUykgXAotCQkJICAgIC1wcCBcIiQkcHAgJChQUEZMQUdTKVwiICQoRElOQ0ZMQUdTKSAkPCBcPiAkQDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKERFUEZMQUdTKSBcCi0JCQkgICAgLXBwICIkJHBwICQoUFBGTEFHUykiICQoRElOQ0ZMQUdTKSAkPCA+ICRAOyBcCi0JCQlmaQotCi0kKERPQ19ESVIpLyQoUkVTVUxUKS9odG1sOgotCW1rZGlyIC1wICRACi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2h0bWwvaW5kZXguaHRtbDogJChET0NfRElSKS8kKFJFU1VMVCkvaHRtbCAkKERPQ19GSUxFUykKLQlybSAtcmYgJDwvKgotCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkKEZJUlNUX0RPQ19GSUxFKWA7IFwKLQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtaHRtbCAtZCAkPCAkKE9DQU1MRE9DRkxBR1MpICQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtaHRtbCAtZCAkPCAkKE9DQU1MRE9DRkxBR1MpICQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCWVsc2UgXAotCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MRE9DKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIC1wcCBcIiQkcHAgJChQUEZMQUdTKVwiIC1odG1sIC1kICQ8ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtcHAgIiQkcHAgJChQUEZMQUdTKSIgLWh0bWwgLWQgJDwgJChPQ0FNTERPQ0ZMQUdTKSBcCi0JICAJJChJTkNGTEFHUykgJChET0NfRklMRVMpOyBcCi0JZmkKLQotJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXg6Ci0JbWtkaXIgLXAgJEAKLQotJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnRleDogJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXggJChET0NfRklMRVMpCi0Jcm0gLXJmICQ8LyoKLQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJChGSVJTVF9ET0NfRklMRSlgOyBcCi0JaWYgWyAteiAiJCRwcCIgXTsgdGhlbiBcCi0JICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgJChJTkNGTEFHUykgXAotCSAgCSQoRE9DX0ZJTEVTKSAtbyAkQDsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtbGF0ZXggJChPQ0FNTERPQ0ZMQUdTKSAkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUykgXAotCSAgCS1vICRAOyBcCi0JZWxzZSBcCi0JICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKSAtbyAkQDsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtcHAgIiQkcHAgJChQUEZMQUdTKSIgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKSAtbyAkQDsgXAotCWZpCi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wczogJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnRleAotCWNkICQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4ICYmIFwKLQkgICQoTEFURVgpIGRvYy50ZXggJiYgXAotCSAgJChMQVRFWCkgZG9jLnRleCAmJiBcCi0JICAkKERWSVBTKSAkKERWSVBTRkxBR1MpIGRvYy5kdmkgLW8gJChARikKLQotJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBkZjogJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBzCi0JY2QgJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXggJiYgJChQUzJQREYpICQoPEYpCi0KLWRlZmluZSBtYWtlX3N1YnByb2oKLS5QSE9OWToKLXN1YnByb2pfJCgxKToKLQkkJChldmFsICQkKGNhbGwgUFJPSl8kKDEpKSkKLQkkKFFVSUVUKWlmIFsgIiQoU1VCVEFSR0VUKSIgIT0gImFsbCIgXTsgdGhlbiBcCi0JICAkKE1BS0UpIC1mICQoT0NBTUxNQUtFRklMRSkgJChTVUJUQVJHRVQpOyBcCi0JZmkKLWVuZGVmCi0KLSQoZm9yZWFjaCBzdWJwcm9qLCQoU1VCUFJPSlMpLCQoZXZhbCAkKGNhbGwgbWFrZV9zdWJwcm9qLCQoc3VicHJvaikpKSkKLQotLlBIT05ZOgotc3VicHJvanM6ICQoU1VCUFJPSlM6JT1zdWJwcm9qXyUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAoVU4pSU5TVEFMTCBSVUxFUyBGT1IgTElCUkFSSUVTCi0KLS5QSE9OWTogbGliaW5zdGFsbAotbGliaW5zdGFsbDoJYWxsCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGluZyBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIGluc3RhbGwgJChPQ0FNTEZJTkRfSU5TVEZMQUdTKSAkKFJFU1VMVCkgTUVUQSAkKExJQklOU1RBTExfRklMRVMpCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogbGliaW5zdGFsbC1ieXRlLWNvZGUKLWxpYmluc3RhbGwtYnl0ZS1jb2RlOglhbGwKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsaW5nIGJ5dGUtY29kZSBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIGluc3RhbGwgJChPQ0FNTEZJTkRfSU5TVEZMQUdTKSAkKFJFU1VMVCkgTUVUQSBcCi0JICAkKGZpbHRlci1vdXQgJChSRVNVTFQpLiQoRVhUX0xJQikgJChSRVNVTFQpLmNteGEsICQoTElCSU5TVEFMTF9GSUxFUykpCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogbGliaW5zdGFsbC1uYXRpdmUtY29kZQotbGliaW5zdGFsbC1uYXRpdmUtY29kZToJYWxsCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGluZyBuYXRpdmUtY29kZSBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIGluc3RhbGwgJChPQ0FNTEZJTkRfSU5TVEZMQUdTKSAkKFJFU1VMVCkgTUVUQSBcCi0JICAkKGZpbHRlci1vdXQgJChETExTT05BTUUpICQoUkVTVUxUKS5jbWEsICQoTElCSU5TVEFMTF9GSUxFUykpCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogbGlidW5pbnN0YWxsCi1saWJ1bmluc3RhbGw6Ci0JJChRVUlFVClwcmludGYgIlxuVW5pbnN0YWxsaW5nIGxpYnJhcnkgd2l0aCBvY2FtbGZpbmRcbiIKLQkkKE9DQU1MRklORCkgcmVtb3ZlICQoT0NBTUxGSU5EX0lOU1RGTEFHUykgJChSRVNVTFQpCi0JJChRVUlFVClwcmludGYgIlxuVW5pbnN0YWxsYXRpb24gc3VjY2Vzc2Z1bC5cbiIKLQotLlBIT05ZOiByYXdpbnN0YWxsCi1yYXdpbnN0YWxsOglhbGwKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsaW5nIGxpYnJhcnkgdG86ICQoT0NBTUxfTElCX0lOU1RBTEwpXG4iCi0JLWluc3RhbGwgLWQgJChPQ0FNTF9MSUJfSU5TVEFMTCkKLQlmb3IgaSBpbiAkKExJQklOU1RBTExfRklMRVMpOyBkbyBcCi0JICBpZiBbIC1mICQkaSBdOyB0aGVuIFwKLQkgICAgaW5zdGFsbCAtYyAtbSAwNjQ0ICQkaSAkKE9DQU1MX0xJQl9JTlNUQUxMKTsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogcmF3dW5pbnN0YWxsCi1yYXd1bmluc3RhbGw6Ci0JJChRVUlFVClwcmludGYgIlxuVW5pbnN0YWxsaW5nIGxpYnJhcnkgZnJvbTogJChPQ0FNTF9MSUJfSU5TVEFMTClcbiIKLQljZCAkKE9DQU1MX0xJQl9JTlNUQUxMKSAmJiBybSAkKG5vdGRpciAkKExJQklOU1RBTExfRklMRVMpKQotCSQoUVVJRVQpcHJpbnRmICJcblVuaW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBNQUlOVEVOQU5DRSBSVUxFUwotCi0uUEhPTlk6CWNsZWFuCi1jbGVhbjo6Ci0Jcm0gLWYgJChUQVJHRVRTKSAkKFRSQVNIKQotCXJtIC1yZiAkKEJDRElESVIpICQoTkNESURJUikgJChNTERFUERJUikKLQotLlBIT05ZOgljbGVhbnVwCi1jbGVhbnVwOjoKLQlybSAtZiAkKE5PTkVYRUNTKSAkKFRSQVNIKQotCXJtIC1yZiAkKEJDRElESVIpICQoTkNESURJUikgJChNTERFUERJUikKLQotLlBIT05ZOiBjbGVhbi1kb2MKLWNsZWFuLWRvYzo6Ci0Jcm0gLXJmICQoRE9DX0RJUikvJChSRVNVTFQpCi0KLS5QSE9OWTogY2xlYW4tYWxsCi1jbGVhbi1hbGw6OiBjbGVhbiBjbGVhbi1kb2MKLQotLlBIT05ZOiBub2JhY2t1cAotbm9iYWNrdXA6Ci0Jcm0gLWYgKi5iYWsgKn4gKi5kdXAKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9SRUFETUUtT0NhbWxNYWtlZmlsZSBiL2xpYi9vY2FtbC9SRUFETUUtT0NhbWxNYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlZjAxOS4uMDAwMDAwMAotLS0gYS9saWIvb2NhbWwvUkVBRE1FLU9DYW1sTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2NDMgKzAsMCBAQAotTk9URSAoYnJ5YW5kdXhidXJ5KTogT0NhbWxNYWtlZmlsZSBpcyBzYWZlIHRvIGluY2x1ZGUgaW4gdGhlIHByb2plY3QgYWZ0ZXIKLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTEVHQUwtNTguCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBEaXN0cmlidXRpb24gb2YgIm9jYW1sX21ha2UiCi0gICAgIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDYgIE1hcmt1cyBNb3R0bCAtIGZyZWUgdG8gY29weSBhbmQgbW9kaWZ5IQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFIEFUIFlPVVIgT1dOIFJJU0shCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFUkVRVUlTSVRFUwotCi0gICAgICAgICAgICAgKioqIFlPVSBXSUxMIE5FRUQgR05VLU1BS0UgVkVSU0lPTiA+My44MCAqKioKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgQ29udGVudHMgb2YgdGhpcyBkaXN0cmlidXRpb24KLQotQ2hhbmdlcyAgICAgICAgLSBndWVzcyB3aGF0PyA7LSkKLQotT0NhbWxNYWtlZmlsZSAgLSBNYWtlZmlsZSBmb3IgZWFzeSBoYW5kbGluZyBvZiBjb21waWxhdGlvbiBvZiBub3Qgc28gZWFzeQotICAgICAgICAgICAgICAgICBPQ2FtbC1wcm9qZWN0cy4gIEl0IGdlbmVyYXRlcyBkZXBlbmRlbmNpZXMgb2YgT0NhbWwtZmlsZXMKLSAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSwgaXMgYWJsZSB0byBoYW5kbGUgIm9jYW1sbGV4Ii0sCi0gICAgICAgICAgICAgICAgICJvY2FtbHlhY2MiLSwgSURMLSBhbmQgQy1maWxlcywga25vd3MgaG93IHRvIHJ1bgotICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzb3JzIGFuZCBnZW5lcmF0ZXMgbmF0aXZlLSBvciBieXRlLWNvZGUsIGFzCi0gICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgb3IgYXMgbGlicmFyeSAtIHdpdGggdGhyZWFkLXN1cHBvcnQgaWYgeW91Ci0gICAgICAgICAgICAgICAgIHdhbnQhIFByb2ZpbGluZyBhbmQgZGVidWdnaW5nIHN1cHBvcnQgY2FuIGJlIGFkZGVkIG9uCi0gICAgICAgICAgICAgICAgIHRoZSBmbHkhICBUaGVyZSBpcyBhbHNvIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgbGlicmFyaWVzLgotICAgICAgICAgICAgICAgICBBaCwgeWVzLCBhbmQgeW91IGNhbiBhbHNvIGNyZWF0ZSB0b3BsZXZlbHMgZnJvbSBhbnkKLSAgICAgICAgICAgICAgICAgc291cmNlczogdGhpcyBhbGxvd3MgeW91IGltbWVkaWF0ZSBpbnRlcmFjdGl2ZSB0ZXN0aW5nLgotICAgICAgICAgICAgICAgICBBdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZiBkb2N1bWVudGF0aW9uIGlzIGVhc3kgZHVlIHRvCi0gICAgICAgICAgICAgICAgIGludGVncmF0aW9uIG9mIHN1cHBvcnQgZm9yIE9DYW1sZG9jLgotCi1SRUFETUUgICAgICAgICAtIHRoaXMgZmlsZQotCi1jYWxjLyAgICAgICAgICAtIERpcmVjdG9yeSBjb250YWluaW5nIGEgcXVpdGUgZnVsbHktZmVhdHVyZWQgZXhhbXBsZQotICAgICAgICAgICAgICAgICBvZiB3aGF0ICJPQ2FtbE1ha2VmaWxlIiBjYW4gZG8gZm9yIHlvdS4gVGhpcyBleGFtcGxlCi0gICAgICAgICAgICAgICAgIG1ha2VzIHVzZSBvZiAib2NhbWxsZXgiLCAib2NhbWx5YWNjIiwgSURMICsgQyBhbmQKLSAgICAgICAgICAgICAgICAgdGhyZWFkcy4KLQotY2FtbHA0LyAgICAgICAgLSBUaGlzIHNpbXBsZSBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gYXV0b21hdGljYWxseQotICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzIGZpbGVzIHdpdGggdGhlIGNhbWxwNC1wcmVwcm9jZXNzb3IuCi0KLWd0ay8gICAgICAgICAgIC0gRGVtb25zdHJhdGlvbiBvZiBob3cgdG8gdXNlIE9DYW1sTWFrZWZpbGUgd2l0aCBHVEsKLSAgICAgICAgICAgICAgICAgYW5kIHRocmVhZHMuIENvdXJ0ZXN5IG9mIFRpbSBGcmVlbWFuIDx0aW1AZnVuZ2libGUuY29tPi4KLQotaWRsLyAgICAgICAgICAgLSBDb250YWlucyBhIHZlcnkgc21hbGwgZXhhbXBsZSBvZiBob3cgdG8gdXNlCi0gICAgICAgICAgICAgICAgICJjYW1saWRsIiB0b2dldGhlciB3aXRoICJPQ2FtbE1ha2VmaWxlIi4gQWxzbyBpbnRlbmRlZAotICAgICAgICAgICAgICAgICB0byBzaG93LCBob3cgZWFzeSBpdCBpcyB0byBpbnRlcmZhY2UgT0NhbWwgYW5kIEMuCi0KLXRocmVhZHMvICAgICAgIC0gVHdvIGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgdGhyZWFkcyAob3JpZ2luYWxseQotICAgICAgICAgICAgICAgICBwb3N0ZWQgYnkgWGF2aWVyIExlcm95IHNvbWUgdGltZSBhZ28pLiBTaG93cyB0aGUgdXNlIG9mCi0gICAgICAgICAgICAgICAgICJPQ2FtbE1ha2VmaWxlIiBpbiBhbiBlbnZpcm9ubWVudCBvZiBtdWx0aXBsZSBjb21waWxhdGlvbgotICAgICAgICAgICAgICAgICB0YXJnZXRzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgIFdoeSBzaG91bGQgeW91IHVzZSBpdD8KLQotRm9yIHNldmVyYWwgcmVhc29uczoKLQotICAqIEl0IGlzIHdlbGwtdGVzdGVkIChJIHVzZSBpdCBpbiBhbGwgb2YgbXkgcHJvamVjdHMpLgotCi0gICogSW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBhcHByb2FjaGVzIGl0IGdlbmVyYXRlcyBkZXBlbmRlbmNpZXMKLSAgICBjb3JyZWN0bHkgYnkgZW5zdXJpbmcgdGhhdCBhbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgT0NhbWwtZmlsZXMKLSAgICBleGlzdCBiZWZvcmUgZGVwZW5kZW5jeSBjYWxjdWxhdGlvbi4gIFRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvCi0gICAgZ3VhcmFudGVlIHRoYXQgIm9jYW1sZGVwIiB3b3JrcyBjb3JyZWN0bHkuCi0KLSAgKiBJdCBpcyBleHRyZW1lbHkgY29udmVuaWVudCAoYXQgbGVhc3QgSSB0aGluayBzbyA7LSkuCi0gICAgRXZlbiBxdWl0ZSBjb21wbGV4IGNvbXBpbGF0aW9uIHByb2Nlc3NlcyAoc2VlIGV4YW1wbGUgImNhbGMubWwiKQotICAgIG5lZWQgdmVyeSBsaXR0bGUgaW5mb3JtYXRpb24gdG8gd29yayBjb3JyZWN0bHkgLSBhY3R1YWxseSBqdXN0IGFib3V0Ci0gICAgdGhlIG1pbmltdW0gKGZpbGUgbmFtZXMgb2Ygc291cmNlcykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICBXaGVuIHlvdSBzaG91bGRuJ3QgdXNlIGl0Li4uCi0KLUluIHByb2plY3RzIHdoZXJlIGV2ZXJ5IGNvbXBpbGF0aW9uIHVuaXQgbmVlZHMgZGlmZmVyZW50IGZsYWdzIC0gYnV0Ci1pbiBzdWNoIGNvbXBsaWNhdGVkIGNhc2VzIHlvdSB3aWxsIGJlIG9uIHlvdXIgb3duIGFueXdheS4gTHVja2lseSwKLXRoaXMgZG9lc24ndCBoYXBwZW4gdG9vIGZyZXF1ZW50bHkuLi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICBIb3cgdG8gdXNlICJPQ2FtbE1ha2VmaWxlIiBpbiB5b3VyIG93biBwcm9qZWN0Ci0gICAgICAgICAoVGFrZSBhIGxvb2sgYXQgdGhlIGV4YW1wbGVzIGZvciBhIHF1aWNrIGludHJvZHVjdGlvbiEpCi0KLUNyZWF0ZSB5b3VyIHByb2plY3Qtc3BlY2lmaWMgIk1ha2VmaWxlIiBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5LgotCi1Ob3cgdGhlcmUgYXJlIHR3byB3YXlzIG9mIG1ha2luZyB1c2Ugb2YgIk9DYW1sTWFrZWZpbGUiOgotCi0gIDEpIEhhdmUgYSBsb29rIGF0IHRoZSBkZWZhdWx0IHNldHRpbmdzIGluICJPQ2FtbE1ha2VmaWxlIiBhbmQgc2V0Ci0gICAgIHRoZW0gdG8gdGhlIHZhbHVlcyB0aGF0IGFyZSB2YWlsZCBvbiB5b3VyIHN5c3RlbSAtIHdoZXRoZXIgdGhlCi0gICAgIHBhdGggdG8gdGhlIHN0YW5kYXJkIGxpYnJhcmllcyBpcyBvaywgd2hhdCBleGVjdXRhYmxlcyBzaGFsbCBiZQotICAgICB1c2VkLCBldGMuLi4KLQotICAyKSBDb3B5IGl0IGludG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCB0byBiZSBjb21waWxlZC4KLSAgICAgQWRkICItaW5jbHVkZSBPQ2FtbE1ha2VmaWxlIiBhcyBhIGxhc3QgbGluZSBvZiB5b3VyICJNYWtlZmlsZSIuCi0KLSAgMykgUHV0IGl0IHNvbWV3aGVyZSBlbHNlIG9uIHRoZSBzeXN0ZW0uIEluIHRoaXMgY2FzZSB5b3Ugd2lsbCBoYXZlIHRvCi0gICAgIHNldCBhIHZhcmlhYmxlICJPQ0FNTE1BS0VGSUxFIiBpbiB5b3VyIHByb2plY3Qtc3BlY2lmaWMgIk1ha2VmaWxlIi4KLSAgICAgVGhpcyBpcyB0aGUgd2F5IGluIHdoaWNoIHRoZSBleGFtcGxlcyBhcmUgd3JpdHRlbjogc28geW91IG5lZWQKLSAgICAgb25seSBvbmUgdmVyc2lvbiBvZiAiT0NhbWxNYWtlZmlsZSIgdG8gbWFuYWdlIGFsbCB5b3VyIHByb2plY3RzIQotICAgICBTZWUgdGhlIGV4YW1wbGVzIGZvciBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIHVzdWFsbHkgc3BlY2lmeSB0d28gZnVydGhlciB2YXJpYWJsZXMgZm9yIHlvdXIgcHJvamVjdDoKLQotICAqIFNPVVJDRVMgIChkZWZhdWx0OiBmb28ubWwpCi0gICogUkVTVUxUICAgKGRlZmF1bHQ6IGZvbykKLQotUHV0IGFsbCB0aGUgc291cmNlcyBuZWNlc3NhcnkgZm9yIGEgdGFyZ2V0IGludG8gdmFyaWFibGUgIlNPVVJDRVMiLgotVGhlbiBzZXQgIlJFU1VMVCIgdG8gdGhlIG5hbWUgb2YgdGhlIHRhcmdldC4gSWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUKLWxpYnJhcmllcywgeW91IHNob3VsZCAqbm90KiBzcGVjaWZ5IHRoZSBzdWZmaXggKCIuY21hIiwgIi5jbXhhIiwgIi5hIikKLS0gaXQgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5IGlmIHlvdSBzcGVjaWZ5IHRoYXQgeW91IHdhbnQgdG8gYnVpbGQKLWEgbGlicmFyeS4KLQotICAgICAgKiogICAgICBEb24ndCBmb3JnZXQgdG8gYWRkIHRoZSAiLm1saSItZmlsZXMsIHRvbyEgICAgICAgICoqCi0gICAgICAqKiAgRG9uJ3QgZm9yZ2V0IHRoYXQgb3JkZXIgb2YgdGhlIHNvdXJjZSBmaWxlcyBtYXR0ZXJzISAgKioKLQotVGhlIG9yZGVyIGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdCBtYXR0ZXJzIGR1cmluZyBsaW5raW5nIGFueXdheQotZHVlIHRvIHBvdGVudGlhbCBzaWRlIGVmZmVjdHMgY2F1c2VkIGF0IHByb2dyYW0gc3RhcnR1cC4gVGhpcyBpcwotd2h5IE9DYW1sTWFrZWZpbGUgZG9lcyBub3QgYXR0ZW1wdCB0byBwYXJ0aWFsbHkgb3JkZXIgZGVwZW5kZW5jaWVzIGJ5Ci1pdHNlbGYsIHdoaWNoIG1pZ2h0IGNvbmZ1c2UgdXNlcnMgZXZlbiBtb3JlLiBJdCBqdXN0IGNvbXBpbGVzIGFuZCBsaW5rcwotT0NhbWwtc291cmNlcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCBldmVuIGlmIGl0IGNvdWxkCi1kZXRlcm1pbmUgYXV0b21hdGljYWxseSB0aGF0IHRoZSBvcmRlciBjYW5ub3QgYmUgY29ycmVjdC4KLQotVGhlIG1pbmltdW0gb2YgeW91ciAiTWFrZWZpbGUiIGxvb2tzIGxpa2UgdGhpcyAoYXNzdW1pbmcgdGhhdAotIk9DYW1sTWFrZWZpbGUiIGlzIGluIHRoZSBzZWFyY2ggcGF0aCBvZiAibWFrZSIpOgotCi0gIC1pbmNsdWRlIE9DYW1sTWFrZWZpbGUKLQotVGhpcyB3aWxsIGFzc3VtZSB0aGF0IHlvdSB3YW50IHRvIGNvbXBpbGUgYSBmaWxlICJmb28ubWwiIHRvIGEgYmluYXJ5Ci0iZm9vIi4KLQotT3RoZXJ3aXNlLCB5b3VyIE1ha2VmaWxlIHdpbGwgcHJvYmFibHkgY29udGFpbiBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gIFNPVVJDRVMgPSBmb28ubWwKLSAgUkVTVUxUICA9IGZvbwotICAtaW5jbHVkZSBPQ2FtbE1ha2VmaWxlCi0KLUJlIGNhcmVmdWwgd2l0aCB0aGUgbmFtZXMgeW91IHB1dCBpbnRvIHRoZXNlIHZhcmlhYmxlczogaWYgdGhleSBhcmUgd3JvbmcsCi1hICJtYWtlIGNsZWFuIiBtaWdodCBlcmFzZSB0aGUgd3JvbmcgZmlsZXMgLSBidXQgSSBrbm93IHlvdSB3aWxsIG5vdCBkbwotdGhhdCA7LSkKLQotQSBzaW1wbGUgIm1ha2UiIHdpbGwgZ2VuZXJhdGUgYSBieXRlLWNvZGUgZXhlY3V0YWJsZS4gSWYgeW91IHdhbnQgdG8KLWNoYW5nZSB0aGlzLCB5b3UgbWF5IGFkZCBhbiAiYWxsIi1ydWxlIHRoYXQgZ2VuZXJhdGVzIHNvbWV0aGluZyBlbHNlLgotCi1FLmcuOgotCi0gIFNPVVJDRVMgPSBmb28ubWwKLSAgUkVTVUxUICA9IGZvbwotICBhbGw6IG5hdGl2ZS1jb2RlLWxpYnJhcnkKLSAgLWluY2x1ZGUgT0NhbWxNYWtlZmlsZQotCi1UaGlzIHdpbGwgYnVpbGQgYSBuYXRpdmUtY29kZSBsaWJyYXJ5ICJmb28uY214YSIgKCsgImZvby5hIikgZnJvbSBmaWxlCi0iZm9vLm1sIi4KLQotWW91IG1heSBldmVuIGJ1aWxkIHNldmVyYWwgdGFyZ2V0cyBhdCBvbmNlLiBUbyBwcm9kdWNlIGJ5dGUtIGFuZCBuYXRpdmUtY29kZQotZXhlY3V0YWJsZXMgd2l0aCBvbmUgIm1ha2UiLCBhZGQgdGhlIGZvbGxvd2luZyBydWxlOgotCi0gICAgYWxsOiBieXRlLWNvZGUgbmF0aXZlLWNvZGUKLQotWW91IHdpbGwgcHJvYmFibHkgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgc3VmZml4IGZvciBlYWNoIG9mIHRoZXNlIHRhcmdldHMKLXNvIHRoYXQgdGhlIHJlc3VsdCB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbiAoc2VlIG9wdGlvbmFsIHZhcmlhYmxlcyBiZWxvdwotZm9yIGRldGFpbHMpLgotCi1Zb3UgbWF5IGFsc28gdGVsbCAibWFrZSIgYXQgdGhlIGNvbW1hbmQtbGluZSB3aGF0IGtpbmQgb2YgdGFyZ2V0IHRvCi1wcm9kdWNlIChlLmcuICJtYWtlIG5jIikuICBIZXJlIGFsbCB0aGUgcG9zc2liaWxpdGllcyB3aXRoIHNob3J0Y3V0cwotYmV0d2VlbiBwYXJlbnRoZXNpczoKLQotICAgKiBieXRlLWNvZGUgICAgICAgICAgICAgICAgICAgICAoYmMpCi0gICAqIGJ5dGUtY29kZS1ub2xpbmsgICAgICAgICAgICAgIChiY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBieXRlLWNvZGUtbGlicmFyeSAgICAgICAgICAgICAoYmNsKQotICAgKiBuYXRpdmUtY29kZSAgICAgICAgICAgICAgICAgICAobmMpCi0gICAqIG5hdGl2ZS1jb2RlLW5vbGluayAgICAgICAgICAgIChuY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBuYXRpdmUtY29kZS1saWJyYXJ5ICAgICAgICAgICAobmNsKQotICAgKiBkZWJ1Zy1jb2RlICAgICAgICAgICAgICAgICAgICAoZGMpCi0gICAqIGRlYnVnLWNvZGUtbm9saW5rICAgICAgICAgICAgIChkY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBkZWJ1Zy1jb2RlLWxpYnJhcnkgICAgICAgICAgICAoZGNsKQotICAgKiBwcm9maWxpbmctYnl0ZS1jb2RlICAgICAgICAgICAocGJjKQotICAgKiBwcm9maWxpbmctYnl0ZS1jb2RlLWxpYnJhcnkgICAocGJjbCkKLSAgICogcHJvZmlsaW5nLW5hdGl2ZS1jb2RlICAgICAgICAgKHBuYykKLSAgICogcHJvZmlsaW5nLW5hdGl2ZS1jb2RlLWxpYnJhcnkgKHBuY2wpCi0gICAqIGJ5dGUtY29kZS1kbGwgICAgICAgICAgICAgICAgIChiY2QpCi0gICAqIG5hdGl2ZS1jb2RlLWRsbCAgICAgICAgICAgICAgIChuY2QpCi0gICAqIHBhY2stYnl0ZS1jb2RlICAgICAgICAgICAgICAgIChwYWJjKQotICAgKiBwYWNrLW5hdGl2ZS1jb2RlICAgICAgICAgICAgICAocGFuYykKLSAgICogdG9wbGV2ZWwgaW50ZXJwcmV0ZXIgICAgICAgICAgKHRvcCkKLSAgICogc3VicHJvanMKLQotSGVyZSBhIHNob3J0IG5vdGUgY29uY2VybmluZyBidWlsZGluZyBhbmQgbGlua2luZyBieXRlIGNvZGUgbGlicmFyaWVzCi13aXRoIEMtZmlsZXM6Ci0KLSAgT0NhbWwgbGlua3MgQy1vYmplY3QgZmlsZXMgb25seSB3aGVuIHRoZXkgYXJlIHVzZWQgaW4gYW4gZXhlY3V0YWJsZS4KLSAgQWZ0ZXIgY29tcGlsYXRpb24gdGhleSBzaG91bGQgYmUgcGxhY2VkIGluIHNvbWUgZGlyZWN0b3J5IHRoYXQgaXMgaW4KLSAgeW91ciBpbmNsdWRlIHBhdGggaWYgeW91IGxpbmsgeW91ciBsaWJyYXJ5IGFnYWluc3QgYW4gZXhlY3V0YWJsZS4KLQotICBJdCBpcyBzb21ldGltZXMgbW9yZSBjb252ZW5pZW50IHRvIGxpbmsgYWxsIEMtb2JqZWN0IGZpbGVzIGludG8gYQotICBzaW5nbGUgQy1saWJyYXJ5LiBUaGVuIHlvdSBoYXZlIHRvIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWMgbGluayBmbGFncwotICBvZiB5b3VyIGxpYnJhcnkgdXNpbmcgIi1ub2F1dG9saW5rIiBhbmQgYWRkIGFub3RoZXIgbGlua2ZsYWcgdGhhdAotICBsaW5rcyBpbiB5b3VyIEMtbGlicmFyeSBleHBsaWNpdGx5LgotCi1XaGF0IGNvbmNlcm5zIG1haW50ZW5hbmNlOgotCi0gICJtYWtlIGNsZWFuIiByZW1vdmVzIGFsbCAoYWxsISkgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZXMgLSBzbwotICBhZ2FpbjogbWFrZSBzdXJlIHlvdXIgdmFyaWFibGVzIGFyZSBvayEKLQotICAibWFrZSBjbGVhbnVwIiBpcyBzaW1pbGFyIHRvICJtYWtlIGNsZWFuIiBidXQgbGVhdmVzIGV4ZWN1dGFibGVzLgotCi1Bbm90aGVyIHdheSB0byBkZXN0cm95IHNvbWUgaW1wb3J0YW50IGZpbGVzIGlzIGJ5IGhhdmluZyAiT0NhbWxNYWtlZmlsZSIKLWF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lLiBSZWFkIHRoZSBkb2N1bWVudGF0aW9uCi1hYm91dCB0aGUgdG9vbHMgaW4gdGhlIE9DYW1sLWRpc3RyaWJ1dGlvbiB0byBzZWUgd2hhdCBraW5kIG9mIGZpbGVzIGFyZQotZ2VuZXJhdGVkLiAiT0NhbWxNYWtlZmlsZSIgYWRkaXRpb25hbGx5IGdlbmVyYXRlcyAoJyUnIGlzIGJhc2VuYW1lIG9mCi1zb3VyY2UgZmlsZSk6Ci0KLSAgJV9pZGwuYyAgLSAiY2FtbGlkbCIgZ2VuZXJhdGVzIGEgZmlsZSAiJS5jIiBmcm9tICIlLmlkbCIsIGJ1dCB0aGlzIGlzCi0gICAgICAgICAgICAgbm90IHN1Y2ggYSBnb29kIGlkZWEsIGJlY2F1c2Ugd2hlbiBnZW5lcmF0aW5nIG5hdGl2ZS1jb2RlLAotICAgICAgICAgICAgIGJvdGggdGhlIGZpbGUgIiUuYyIgYW5kICIlLm1sIiB3b3VsZCBnZW5lcmF0ZSBmaWxlcyAiJS5vIgotICAgICAgICAgICAgIHdoaWNoIHdvdWxkIG92ZXJ3cml0ZSBlYWNoIG90aGVyLiBUaHVzLCAiT0NhbWxNYWtlZmlsZSIKLSAgICAgICAgICAgICByZW5hbWVzICIlLmMiIHRvICIlX2lkbC5jIiB0byB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0uCi0KLVRoZSBkZXBlbmRlbmNpZXMgYXJlIHN0b3JlZCBpbiB0aHJlZSBkaWZmZXJlbnQgc3ViZGlyZWN0b3JpZXMgKGRvdCBkaXJzKToKLQotICAuX2QgICAgLSBjb250YWlucyBkZXBlbmRlbmNpZXMgZm9yIC5tbC1maWxlcwotICAuX2JjZGkgLSBjb250YWlucyBieXRlIGNvZGUgZGVwZW5kZW5jaWVzIGZvciAubWxpLWZpbGVzCi0gIC5fbmNkaSAtIGNvbnRhaW5zIG5hdGl2ZSBjb2RlIGRlcGVuZGVuY2llcyBmb3IgLm1saS1maWxlcwotCi1UaGUgZW5kaW5ncyBvZiB0aGUgZGVwZW5kZW5jeSBmaWxlcyBhcmU6ICIlLmQiIGZvciB0aG9zZSBnZW5lcmF0ZWQgZnJvbQotIiUubWwiLWZpbGVzLCAiJS5kaSIgZm9yIG9uZXMgZGVyaXZlZCBmcm9tICIlLm1saSItZmlsZXMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z2dpbmcKLQotICBUaGlzIGlzIGVhc3k6IGlmIHlvdSBkaXNjb3ZlciBhIGJ1ZywganVzdCBkbyBhICJtYWtlIGNsZWFuOyBtYWtlIGRjIgotICB0byByZWNvbXBpbGUgeW91ciBwcm9qZWN0IHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uLiBUaGVuIHlvdSBjYW4KLSAgaW1tZWRpYXRlbHkgYXBwbHkgIm9jYW1sZGVidWciIHRvIHRoZSBleGVjdXRhYmxlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsaW5nCi0KLSAgRm9yIGdlbmVyYXRpbmcgY29kZSB0aGF0IGNhbiBiZSBwcm9maWxlZCB3aXRoICJvY2FtbHByb2YiIChieXRlIGNvZGUpCi0gIG9yICJncHJvZiIgKG5hdGl2ZSBjb2RlKSwgY29tcGlsZSB5b3VyIHByb2plY3Qgd2l0aCBvbmUgb2YgdGhlIHByb2ZpbGluZwotICB0YXJnZXRzIChzZWUgdGFyZ2V0cyBhYm92ZSkuIEUuZy46Ci0KLSAgICAqICJtYWtlIHBiYyIgd2lsbCBidWlsZCBieXRlIGNvZGUgdGhhdCBjYW4gYmUgcHJvZmlsZWQgd2l0aAotICAgICAgIm9jYW1scHJvZiIuCi0KLSAgICAqICJtYWtlIHBuYyIgd2lsbCBidWlsZCBuYXRpdmUgY29kZSB0aGF0IGNhbiBiZSBwcm9maWxlZCB3aXRoCi0gICAgICAiZ3Byb2YiLgotCi0gIFBsZWFzZSBub3RlIHRoYXQgaXQgaXMgbm90IGN1cnJlbnRseSBwb3NzaWJsZSB0byBwcm9maWxlIGJ5dGUgY29kZSB3aXRoCi0gIHRocmVhZHMuIE9DYW1sTWFrZWZpbGUgd2lsbCBmb3JjZSBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIGRvIHRoaXMuCi0KLSAgQSBzaG9ydCBoaW50IGZvciBERUMgQWxwaGEtdXNlcnMgKHVuZGVyIERpZ2l0YWwgVW5peCk6IHlvdSBtYXkgYWxzbwotICBjb21waWxlIHlvdXIgc291cmNlcyB0byBuYXRpdmUgY29kZSB3aXRob3V0IGFueSBmdXJ0aGVyIHByb2ZpbGluZwotICBvcHRpb25zL3RhcmdldHMuIFRoZW4gY2FsbCAicGl4aWUgbXlfZXhlYyIsICJteV9leGVjIiBiZWluZyB5b3VyCi0gIGV4ZWN1dGFibGUuIFRoaXMgd2lsbCBwcm9kdWNlIChhbW9uZyBvdGhlciBmaWxlcykgYW4gZXhlY3V0YWJsZQotICAibXlfZXhlYy5waXhpZSIuIENhbGwgaXQgYW5kIGl0IHdpbGwgcHJvZHVjZSBwcm9maWxpbmcgaW5mb3JtYXRpb24gd2hpY2gKLSAgY2FuIGJlIGFuYWx5c2VkIHVzaW5nICJwcm9mIC1waXhpZSBteV9leGVjIi4gVGhlIHJlc3VsdGluZyBpbmZvcm1hdGlvbgotICBpcyBleHRyZW1lbHkgZGV0YWlsZWQgYW5kIGFsbG93cyBhbmFseXNpcyB1cCB0byB0aGUgY2xvY2sgY3ljbGUgbGV2ZWwuLi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNpbmcgUHJlcHJvY2Vzc29ycwotCi0gIEJlY2F1c2Ugb25lIGNvdWxkIGVtcGxveSBhbnkga2luZCBvZiBwcm9ncmFtIHRoYXQgcmVhZHMgZnJvbSBzdGFuZGFyZAotICBpbnB1dCBhbmQgcHJpbnRzIHRvIHN0YW5kYXJkIG91dHB1dCBhcyBwcmVwcm9jZXNzb3IsIHRoZXJlIGNhbm5vdCBiZSBhbnkKLSAgZGVmYXVsdCB3YXkgdG8gaGFuZGxlIGFsbCBvZiB0aGVtIGNvcnJlY3RseSB3aXRob3V0IGZ1cnRoZXIga25vd2xlZGdlLgotCi0gIFRoZXJlZm9yZSB5b3UgaGF2ZSB0byBjb29wZXJhdGUgYSBiaXQgd2l0aCBPQ2FtbE1ha2VmaWxlIHRvIGxldAotICBwcmVwcm9jZXNzaW5nIGhhcHBlbiBhdXRvbWF0aWNhbGx5LiBCYXNpY2FsbHksIHRoaXMgb25seSByZXF1aXJlcwotICB0aGF0IHlvdSBwdXQgYSBjb21tZW50IGludG8gdGhlIGZpcnN0IGxpbmUgb2YgZmlsZXMgdGhhdCBzaG91bGQgYmUKLSAgcHJlcHJvY2Vzc2VkLCBlLmcuOgotCi0gICAgKCpwcCBjYXQgKikKLSAgICAuLi4gcmVzdCBvZiBwcm9ncmFtIC4uLgotCi0gIE9DYW1sTWFrZWZpbGUgbG9va3MgYXQgdGhlIGZpcnN0IGxpbmUgb2YgeW91ciBmaWxlcywgYW5kIGlmIGl0IGZpbmRzCi0gIGEgY29tbWVudCB0aGF0IHN0YXJ0cyB3aXRoICIoKnBwIiwgdGhlbiBpdCB3aWxsIGFzc3VtZSB0aGF0IHRoZQotICByZXN0IG9mIHRoZSBjb21tZW50IHRlbGxzIGl0IGhvdyB0byBjb3JyZWN0bHkgY2FsbCB0aGUgYXBwcm9wcmlhdGUKLSAgcHJlcHJvY2Vzc29yLiBJbiB0aGlzIGNhc2UgdGhlIHByb2dyYW0gImNhdCIgd2lsbCBiZSBjYWxsZWQsIHdoaWNoIHdpbGwsCi0gIG9mIGNvdXJzZSwganVzdCBvdXRwdXQgdGhlIHNvdXJjZSB0ZXh0IGFnYWluIHdpdGhvdXQgY2hhbmdpbmcgaXQuCi0KLSAgSWYgeW91IGFyZSwgZm9yIGV4YW1wbGUsIGFuIGFkdm9jYXRlIG9mIHRoZSBuZXcgInJldmlzZWQgc3ludGF4IiwKLSAgd2hpY2ggaXMgc3VwcG9ydGVkIGJ5IHRoZSBjYW1scDQgcHJlcHJvY2Vzc29yLCB5b3UgY291bGQgc2ltcGx5IHdyaXRlOgotCi0gICAgKCpwcCBjYW1scDRyICopCi0gICAgLi4uIHJlc3Qgb2YgcHJvZ3JhbSBpbiByZXZpc2VkIHN5bnRheCAuLi4KLQotICBTaW1wbGUsIGlzbid0IGl0PwotCi0gIElmIHlvdSB3YW50IHRvIHdyaXRlIHlvdXIgb3duIHN5bnRheCBleHRlbnNpb25zLCBqdXN0IHRha2UgYSBsb29rIGF0IHRoZQotICBleGFtcGxlIGluIHRoZSBkaXJlY3RvcnkgImNhbWxwNCI6IGl0IGltcGxlbWVudHMgdGhlICJyZXBlYXQgLi4uIHVudGlsIgotICBleHRlbnNpb24gYXMgZGVzY3JpYmVkIGluIHRoZSBjYW1scDQtdHV0b3JpYWwuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICBMaWJyYXJ5IChVbi0pSW5zdGFsbGF0aW9uIFN1cHBvcnQKLQotICBPQ2FtbE1ha2VmaWxlIGNvbnRhaW5zIHR3byB0YXJnZXRzIHVzaW5nICJvY2FtbGZpbmQiIGZvciB0aGlzIHB1cnBvc2U6Ci0KLSAgICAqIGxpYmluc3RhbGwKLSAgICAqIGxpYnVuaW5zdGFsbAotCi0gIFRoZXNlIHR3byB0YXJnZXRzIHJlcXVpcmUgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdmFyaWFibGUKLSAgIkxJQklOU1RBTExfRklMRVMiLCB3aGljaCBzaG91bGQgYmUgc2V0IHRvIGFsbCB0aGUgZmlsZXMgdGhhdCB5b3UKLSAgd2FudCB0byBpbnN0YWxsIGluIHRoZSBsaWJyYXJ5IGRpcmVjdG9yeSAodXN1YWxseSAlLm1saSwgJS5jbWksICUuY21hLAotICAlLmNteGEsICUuYSBhbmQgcG9zc2libHkgZnVydGhlciBDLWxpYnJhcmllcykuIFRoZSB0YXJnZXQgImxpYmluc3RhbGwiCi0gIGhhcyB0aGUgZGVwZW5kZW5jeSAiYWxsIiB0byBmb3JjZSBjb21waWxhdGlvbiBvZiB0aGUgbGlicmFyeSBzbyBtYWtlCi0gIHN1cmUgeW91IGRlZmluZSB0YXJnZXQgImFsbCIgaW4geW91ciBNYWtlZmlsZSBhcHByb3ByaWF0ZWx5LgotCi0gIFRoZSB0YXJnZXRzIGluZm9ybSB0aGUgdXNlciBhYm91dCB0aGUgY29uZmlndXJlZCBpbnN0YWxsIHBhdGggYW5kIGFzawotICBmb3IgY29uZmlybWF0aW9uIHRvICh1bilpbnN0YWxsIHRoZXJlLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlbSwgaXQKLSAgaXMgb2Z0ZW4gYSBnb29kIGlkZWEgdG8ganVzdCBhbGlhcyB0aGVtIGluIHlvdXIgTWFrZWZpbGUgdG8gImluc3RhbGwiCi0gIGFuZCAidW5pbnN0YWxsIiByZXNwZWN0aXZlbHkuCi0KLSAgVHdvIG90aGVyIHRhcmdldHMgYWxsb3cgaW5zdGFsbGF0aW9uIG9mIGZpbGVzIGludG8gYSBwYXJ0aWN1bGFyCi0gIGRpcmVjdG9yeSAod2l0aG91dCB1c2luZyBvY2FtbGZpbmQpOgotCi0gICAgKiByYXdpbnN0YWxsCi0gICAgKiByYXd1bmluc3RhbGwKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGluZyB0b3BsZXZlbHMKLQotICBUaGVyZSBpcyBqdXN0IG9uZSB0YXJnZXQgZm9yIHRoaXM6Ci0KLSAgICAqIHRvcAotCi0gIFRoZSBnZW5lcmF0ZWQgZmlsZSBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseSBmb3IgaW50ZXJhY3RpdmUgc2Vzc2lvbnMgLQotICBldmVuIHdpdGggc2Nhbm5lcnMsIHBhcnNlcnMsIEMtZmlsZXMsIGV0Yy4hCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGluZyBkb2N1bWVudGF0aW9uCi0KLSAgVGhlIGZvbGxvd2luZyB0YXJnZXRzIGFyZSBzdXBwb3J0ZWQ6Ci0KLSAgICogaHRkb2MgICAgICAtIGdlbmVyYXRlcyBIVE1MLWRvY3VtZW50YXRpb24KLSAgICogbGFkb2MgICAgICAtIGdlbmVyYXRlcyBMYXRleC1kb2N1bWVudGF0aW9uCi0gICAqIHBzZG9jICAgICAgLSBnZW5lcmF0ZXMgUG9zdFNjcmlwdC1kb2N1bWVudGF0aW9uCi0gICAqIHBkZmRvYyAgICAgLSBnZW5lcmF0ZXMgUERGLWRvY3VtZW50YXRpb24KLSAgICogZG9jICAgICAgICAtIGdlbmVyYXRlcyBhbGwgc3VwcG9ydGVkIGZvcm1zIG9mIGRvY3VtZW50YXRpb24KLSAgICogY2xlYW4tZG9jICAtIGdlbmVyYXRlcyBhbGwgc3VwcG9ydGVkIGZvcm1zIG9mIGRvY3VtZW50YXRpb24KLQotICBBbGwgb2YgdGhlbSBnZW5lcmF0ZSBhIHN1Yi1kaXJlY3RvcnkgImRvYyIuIE1vcmUgcHJlY2lzZWx5LCBmb3IgSFRNTCBpdAotICBpcyAiZG9jLyQoUkVTVUxUKS9odG1sIiBhbmQgZm9yIExhdGV4LCBQb3N0U2NyaXB0IGFuZCBQREYgdGhlIGRpcmVjdG9yeQotICAiZG9jLyQoUkVTVUxUKS9sYXRleCIuIFNlZSB0aGUgT0NhbWxkb2MtbWFudWFsIGZvciBkZXRhaWxzIGFuZCB0aGUKLSAgb3B0aW9uYWwgdmFyaWFibGVzIGJlbG93IGZvciBzZXR0aW5ncyB5b3UgY2FuIGNvbnRyb2wuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGluZyBzdWJwcm9qZWN0cwotCi0gIFlvdSBjYW4gaGF2ZSBzZXZlcmFsIHRhcmdldHMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFuZCBtYW5hZ2UgdGhlbQotICBmcm9tIHdpdGhpbiBhbiBzaW5nbGUgTWFrZWZpbGUuCi0KLSAgR2l2ZSBlYWNoIHN1YnByb2plY3QgYSBuYW1lLCBlLmcuICJwMSIsICJwMiIsIGV0Yy4gVGhlbiB5b3UgZXhwb3J0Ci0gIHNldHRpbmdzIHNwZWNpZmljIHRvIGVhY2ggcHJvamVjdCBieSB1c2luZyB2YXJpYWJsZXMgb2YgdGhlIGZvcm0KLSAgIlBST0pfcDEiLCAiUFJPSl9wMiIsIGV0Yy4gIEUuZy46Ci0KLSAgICBkZWZpbmUgUFJPSl9wMQotICAgICAgU09VUkNFUz0iZm9vLm1sIG1haW4ubWwiCi0gICAgICBSRVNVTFQ9InAxIgotICAgICAgT0NBTUxGTEFHUz0iLXVuc2FmZSIKLSAgICBlbmRlZgotICAgIGV4cG9ydCBQUk9KX3AxCi0KLSAgICBkZWZpbmUgUFJPSl9wMgotICAgICAgLi4uCi0gICAgZW5kZWYKLSAgICBleHBvcnQgUFJPSl9wMgotCi0gIFlvdSBtYXkgYWxzbyBleHBvcnQgY29tbW9uIHNldHRpbmdzIHVzZWQgYnkgYWxsIHByb2plY3RzIGRpcmVjdGx5LCBlLmcuCi0gICJleHBvcnQgVEhSRUFEUyA9IHkiLgotCi0gIE5vdyBpdCBpcyBhIGdvb2QgaWRlYSB0byBkZWZpbmUsIHdoaWNoIHByb2plY3RzIHNob3VsZCBiZSBhZmZlY3RlZCBieQotICBjb21tYW5kcyBieSBkZWZhdWx0LiAgRS5nLjoKLQotICAgIGlmbmRlZiBTVUJQUk9KUwotICAgICAgZXhwb3J0IFNVQlBST0pTID0gcDEgcDIKLSAgICBlbmRpZgotCi0gIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGEgZ2l2ZW4gdGFyZ2V0IGZvciBhbGwgdGhvc2UKLSAgc3VicHJvamVjdHMgaWYgdGhpcyB2YXJpYWJsZSBoYXMgbm90IGJlZW4gZGVmaW5lZCBpbiB0aGUgc2hlbGwKLSAgZW52aXJvbm1lbnQgb3IgaW4gdGhlIGNvbW1hbmQgbGluZSBvZiB0aGUgbWFrZS1pbnZvY2F0aW9uIGJ5IHRoZSB1c2VyLgotICBFLmcuLCAibWFrZSBkYyIgd2lsbCBnZW5lcmF0ZSBkZWJ1ZyBjb2RlIGZvciBhbGwgc3VicHJvamVjdHMuCi0KLSAgVGhlbiB5b3UgbmVlZCB0byBkZWZpbmUgYSBkZWZhdWx0IGFjdGlvbiBmb3IgeW91ciBzdWJwcm9qZWN0cyBpZiAibWFrZSIKLSAgaGFzIGJlZW4gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzOgotCi0gICAgYWxsOiBiYwotCi0gIFRoaXMgd2lsbCBidWlsZCBieXRlIGNvZGUgYnkgZGVmYXVsdCBmb3IgYWxsIHN1YnByb2plY3RzLgotCi0gIEZpbmFsbHksIHlvdSdsbCBoYXZlIHRvIGRlZmluZSBhIGNhdGNoLWFsbCB0YXJnZXQgdGhhdCB1c2VzIHRoZSB0YXJnZXQKLSAgcHJvdmlkZWQgYnkgdGhlIHVzZXIgZm9yIGFsbCBzdWJwcm9qZWN0cy4gSnVzdCBhZGQgKGFzc3VtaW5nIHRoYXQKLSAgT0NBTUxNQUtFRklMRSBoYXMgYmVlbiBkZWZpbmVkIGFwcHJvcHJpYXRlbHkpOgotCi0gICAgJToKLSAgICAgICAgICAgIEBtYWtlIC1mICQoT0NBTUxNQUtFRklMRSkgc3VicHJvanMgU1VCVEFSR0VUPSRACi0KLSAgU2VlIHRoZSAidGhyZWFkcyItZGlyZWN0b3J5IGluIHRoZSBkaXN0cmlidXRpb24gZm9yIGEgc2hvcnQgZXhhbXBsZSEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE9wdGlvbmFsIHZhcmlhYmxlcyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gIk9DYW1sTWFrZWZpbGUiCi0KLSAgKiBMSUJfUEFDS19OQU1FIC0gcGFja3MgYWxsIG1vZHVsZXMgb2YgYSBsaWJyYXJ5IGludG8gYSBtb2R1bGUgd2hvc2UKLSAgICAgICAgICAgICAgICAgICAgbmFtZSBpcyBnaXZlbiBpbiB2YXJpYWJsZSAiTElCX1BBQ0tfTkFNRSIuCi0KLSAgKiBSRVNfQ0xJQl9TVUYgIC0gd2hlbiBidWlsZGluZyBhIGxpYnJhcnkgdGhhdCBjb250YWlucyBDLXN0dWJzLCB0aGlzCi0gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIGNvbnRyb2xzIHRoZSBzdWZmaXggYXBwZW5kZWQgdG8gdGhlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgb2YgdGhlIEMtbGlicmFyeSAoZGVmYXVsdDogIl9zdHVicyIpLgotCi0gICogVEhSRUFEUyAgICAgICAtIHNheSAiVEhSRUFEUyA9IHllcyIgaWYgeW91IG5lZWQgdGhyZWFkIHN1cHBvcnQgY29tcGlsZWQgaW4sCi0gICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBsZWF2ZSBpdCBhd2F5LgotCi0gICogVk1USFJFQURTICAgICAtIHNheSAiVk1USFJFQURTID0geWVzIiBpZiB5b3Ugd2FudCB0byBmb3JjZSBWTS1sZXZlbAotICAgICAgICAgICAgICAgICAgICBzY2hlZHVsaW5nIG9mIHRocmVhZHMgKGJ5dGUtY29kZSBvbmx5KS4KLQotICAqIEFOTk9UQVRFICAgICAgLSBzYXkgIkFOTk9UQVRFID0geWVzIiB0byBnZW5lcmF0ZSB0eXBlIGFubm90YXRpb24gZmlsZXMKLSAgICAgICAgICAgICAgICAgICAgKC5hbm5vdCkgdG8gc3VwcG9ydCBkaXNwbGF5aW5nIG9mIHR5cGUgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgaW4gZWRpdG9ycy4KLQotICAqIFVTRV9DQU1MUDQgICAgLSBzYXkgIlVTRV9DQU1MUDQgPSB5ZXMiIGluIHlvdXIgIk1ha2VmaWxlIiBpZiB5b3UKLSAgICAgICAgICAgICAgICAgICAgd2FudCB0byBpbmNsdWRlIHRoZSBjYW1scDQgZGlyZWN0b3J5IGR1cmluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgYnVpbGQgcHJvY2Vzcywgb3RoZXJ3aXNlIGxlYXZlIGl0IGF3YXkuCi0KLSAgKiBJTkNESVJTICAgICAgIC0gZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUgc2VhcmNoZWQgZm9yICIuY21pIi0gYW5kCi0gICAgICAgICAgICAgICAgICAgICIuY21vIi1maWxlcy4gIFlvdSBuZWVkIG5vdCB3cml0ZSAiLUkgLi4uIiAtIGp1c3QgdGhlCi0gICAgICAgICAgICAgICAgICAgIHBsYWluIG5hbWVzLgotICAqIExJQkRJUlMgICAgICAgLSBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgICAgIEFsc28ganVzdCBwdXQgdGhlIHBsYWluIHBhdGhzIGludG8gdGhpcyB2YXJpYWJsZQotICAqIEVYVExJQkRJUlMgICAgLSBTYW1lIGFzICJMSUJESVJTIiwgYnV0IHBhdGhzIGluIHRoaXMgdmFyaWFibGUgYXJlCi0gICAgICAgICAgICAgICAgICAgIGFsc28gYWRkZWQgdG8gdGhlIGJpbmFyeSB2aWEgdGhlICItUiItZmxhZyBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlicmFyaWVzIGluIG5vbi1zdGFuZGFyZCBwbGFjZXMgY2FuIGJlIGZvdW5kLgotICAqIFJFU1VMVERFUFMgICAgLSBUYXJnZXRzIG9uIHdoaWNoIHJlc3VsdHMgKGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcykKLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGFkZGl0aW9uYWxseSBkZXBlbmQuCi0KLSAgKiBQQUNLUyAgICAgICAgIC0gYWRkcyBwYWNrYWdlcyB1bmRlciBjb250cm9sIG9mICJmaW5kbGliIi4KLQotICAqIFBSRURTICAgICAgICAgLSBzcGVjaWZpZXMgImZpbmRsaWIiLXByZWRpY2F0ZXMuCi0KLSAgKiBMSUJTICAgICAgICAgIC0gT0NhbWwtbGlicmFyaWVzIHRoYXQgc2hvdWxkIGJlIGxpbmtlZCAoanVzdCBwbGFpbiBuYW1lcykuCi0gICAgICAgICAgICAgICAgICAgIEUuZy4gaWYgeW91IHdhbnQgdG8gbGluayB0aGUgU3RyLWxpYnJhcnksIGp1c3Qgd3JpdGUKLSAgICAgICAgICAgICAgICAgICAgInN0ciIgKHdpdGhvdXQgcXVvdGVzKS4KLSAgICAgICAgICAgICAgICAgICAgVGhlIG5ldyBPQ2FtbC1jb21waWxlciBoYW5kbGVzIGxpYnJhcmllcyBpbiBzdWNoCi0gICAgICAgICAgICAgICAgICAgIGEgd2F5IHRoYXQgdGhleSAicmVtZW1iZXIiIHdoZXRoZXIgdGhleSBoYXZlIHRvCi0gICAgICAgICAgICAgICAgICAgIGJlIGxpbmtlZCBhZ2FpbnN0IGEgQy1saWJyYXJ5IGFuZCBpdCBnZXRzIGxpbmtlZAotICAgICAgICAgICAgICAgICAgICBpbiBhdXRvbWF0aWNhbGx5LgotICAgICAgICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhIHNsYXNoIGluIHRoZSBsaWJyYXJ5IG5hbWUgKHN1Y2ggYXMKLSAgICAgICAgICAgICAgICAgICAgIi4vc3RyIiBvciAibGliL2ZvbyIpIHRoZW4gbWFrZSBpcyB0b2xkIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZCBmaWxlcyBkZXBlbmQgb24gdGhlIGxpYnJhcnkuICBUaGlzCi0gICAgICAgICAgICAgICAgICAgIGhlbHBzIHRvIGVuc3VyZSB0aGF0IGNoYW5nZXMgdG8geW91ciBsaWJyYXJpZXMgYXJlCi0gICAgICAgICAgICAgICAgICAgIHRha2VuIGludG8gYWNjb3VudCwgd2hpY2ggaXMgaW1wb3J0YW50IGlmIHlvdSBhcmUKLSAgICAgICAgICAgICAgICAgICAgcmVnZW5lcmF0aW5nIHlvdXIgbGlicmFyaWVzIGZyZXF1ZW50bHkuCi0gICogQ0xJQlMgICAgICAgICAtIEMtbGlicmFyaWVzIHRoYXQgc2hvdWxkIGJlIGxpbmtlZCAoanVzdCBwbGFpbiBuYW1lcykuCi0KLSAgKiBQUkVfVEFSR0VUUyAgIC0gc2V0IHRoaXMgdG8gYSBsaXN0IG9mIHRhcmdldCBmaWxlcyB0aGF0IHlvdSB3YW50Ci0gICAgICAgICAgICAgICAgICAgIHRvIGhhdmUgYnVpbGR0IGJlZm9yZSBkZXBlbmRlbmN5IGNhbGN1bGF0aW9uIGFjdHVhbGx5Ci0gICAgICAgICAgICAgICAgICAgIHRha2VzIHBsYWNlLiBFLmcuIHVzZSB0aGlzIHRvIGF1dG9tYXRpY2FsbHkgY29tcGlsZQotICAgICAgICAgICAgICAgICAgICBtb2R1bGVzIG5lZWRlZCBieSBjYW1scDQsIHdoaWNoIGhhdmUgdG8gYmUgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgIGJlZm9yZSBvdGhlciBtb2R1bGVzIGNhbiBiZSBwYXJzZWQgYXQgYWxsLgotCi0gICAgICAgICAgICAgICAgICAgICoqIFdBUk5JTkcgKio6IHRoZSBmaWxlcyBtZW50aW9uZWQgaW4gdGhpcyB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHJlbW92ZWQgd2hlbiAibWFrZSBjbGVhbiIgaXMgZXhlY3V0ZWQhCi0KLSAgKiBMSUJJTlNUQUxMX0ZJTEVTIC0gdGhlIGZpbGVzIG9mIGEgbGlicmFyeSB0aGF0IHNob3VsZCBiZSBpbnN0YWxsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgImZpbmRsaWIiLiBEZWZhdWx0OgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgJChSRVNVTFQpLm1saSAkKFJFU1VMVCkuY21pICQoUkVTVUxUKS5jbWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAkKFJFU1VMVCkuY214YSAkKFJFU1VMVCkuYSBsaWIkKFJFU1VMVCkuYQotCi0gICogT0NBTUxfTElCX0lOU1RBTEwgLSB0YXJnZXQgZGlyZWN0b3J5IGZvciAicmF3aW5zdGFsbC9yYXd1bmluc3RhbGwiLgotICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICQoT0NBTUxMSUJQQVRIKS9jb250cmliKQotCi0gICogRE9DX0ZJTEVTICAgICAtIG5hbWVzIG9mIGZpbGVzIGZyb20gd2hpY2ggZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQuCi0gICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBhbGwgLm1saS1maWxlcyBpbiB5b3VyICQoU09VUkNFUykpLgotCi0gICogRE9DX0RJUiAgICAgICAtIG5hbWUgb2YgZGlyZWN0b3J5IHdoZXJlIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIHN0b3JlZC4KLQotICAqIE9DQU1MRkxBR1MgICAgLSBmbGFncyBwYXNzZWQgdG8gdGhlIGNvbXBpbGVycwotICAqIE9DQU1MQkNGTEFHUyAgLSBmbGFncyBwYXNzZWQgdG8gdGhlIGJ5dGUgY29kZSBjb21waWxlciBvbmx5Ci0gICogT0NBTUxOQ0ZMQUdTICAtIGZsYWdzIHBhc3NlZCB0byB0aGUgbmF0aXZlIGNvZGUgY29tcGlsZXIgb25seQotCi0gICogT0NBTUxMREZMQUdTICAtIGZsYWdzIHBhc3NlZCB0byB0aGUgT0NhbWwtbGlua2VyCi0gICogT0NBTUxCTERGTEFHUyAtIGZsYWdzIHBhc3NlZCB0byB0aGUgT0NhbWwtbGlua2VyIHdoZW4gbGlua2luZyBieXRlIGNvZGUKLSAgKiBPQ0FNTE5MREZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBPQ2FtbC1saW5rZXIgd2hlbiBsaW5raW5nCi0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZSBjb2RlCi0KLSAgKiBPQ0FNTE1LTElCX0ZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBPQ2FtbCBsaWJyYXJ5IHRvb2wKLQotICAqIE9DQU1MQ1BGTEFHUyAgLSBwcm9maWxpbmcgZmxhZ3MgcGFzc2VkIHRvICJvY2FtbGNwIiAoZGVmYXVsdDogImEiKQotCi0gICogUFBGTEFHUyAgICAgICAtIGFkZGl0aW9uYWwgZmxhZ3MgcGFzc2VkIHRvIHRoZSBwcmVwcm9jZXNzb3IgKGRlZmF1bHQ6IG5vbmUpCi0KLSAgKiBMRkxBR1MgICAgICAgIC0gZmxhZ3MgcGFzc2VkIHRvICJvY2FtbGxleCIKLSAgKiBZRkxBR1MgICAgICAgIC0gZmxhZ3MgcGFzc2VkIHRvICJvY2FtbHlhY2MiCi0gICogSURMRkxBR1MgICAgICAtIGZsYWdzIHBhc3NlZCB0byAiY2FtbGlkbCIKLQotICAqIE9DQU1MRE9DRkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gIm9jYW1sZG9jIgotCi0gICogT0NBTUxGSU5EX0lOU1RGTEFHUyAtIGZsYWdzIHBhc3NlZCB0byAib2NhbWxmaW5kIiBkdXJpbmcgaW5zdGFsbGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBub25lKQotCi0gICogRFZJUFNGTEFHUyAgICAtIGZsYWdzIHBhc3NlZCB0byBkdmlwcwotICAgICAgICAgICAgICAgICAgICAod2hlbiBnZW5lcmF0aW5nIGRvY3VtZW50YXRpb24gaW4gUG9zdFNjcmlwdCkuCi0KLSAgKiBTVEFUSUMgICAgICAgIC0gc2V0IHRoaXMgdmFyaWFibGUgaWYgeW91IHdhbnQgdG8gZm9yY2UgY3JlYXRpb24KLSAgICAgICAgICAgICAgICAgICAgb2Ygc3RhdGljIGxpYnJhcmllcwotCi0gICogQ0MgICAgICAgICAgICAtIHRoZSBDLWNvbXBpbGVyIHRvIGJlIHVzZWQKLSAgKiBDWFggICAgICAgICAgIC0gdGhlIEMrKy1jb21waWxlciB0byBiZSB1c2VkCi0KLSAgKiBDRkxBR1MgICAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIEMtY29tcGlsZXIuCi0gICAgICAgICAgICAgICAgICAgIFRoZSBmbGFnICItRE5BVElWRV9DT0RFIiB3aWxsIGJlIHBhc3NlZCBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAgICAgICAgIGlmIHlvdSBjaG9vc2UgdG8gYnVpbGQgbmF0aXZlIGNvZGUuIFRoaXMgYWxsb3dzIHlvdQotICAgICAgICAgICAgICAgICAgICB0byBjb21waWxlIHlvdXIgQy1maWxlcyBjb25kaXRpb25hbGx5LiBCdXQgcGxlYXNlCi0gICAgICAgICAgICAgICAgICAgIG5vdGU6IFlvdSBzaG91bGQgZG8gYSAibWFrZSBjbGVhbiIgb3IgcmVtb3ZlIHRoZQotICAgICAgICAgICAgICAgICAgICBvYmplY3QgZmlsZXMgbWFudWFsbHkgb3IgdG91Y2ggdGhlICUuYy1maWxlczoKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCB0aGV5IG1heSBub3QgYmUgY29ycmVjdGx5IHJlY29tcGlsZWQKLSAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBkaWZmZXJlbnQgYnVpbGRzLgotCi0gICogQ1hYRkxBR1MgICAgICAtIGFkZGl0aW9uYWwgZmxhZ3MgcGFzc2VkIHRvIHRoZSBDKystY29tcGlsZXIuCi0KLSAgKiBDUFBGTEFHUyAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIEMtcHJlcHJvY2Vzc29yLgotCi0gICogQ0ZSQU1FV09SS1MgICAtIE9iamVjdGl2ZS1DIGZyYW1ld29yayB0byBwYXNzIHRvIGxpbmtlciBvbiBNYWNPUyBYLgotCi0gICogTERGTEFHUyAgICAgICAtIGFkZGl0aW9uYWwgZmxhZ3MgcGFzc2VkIHRvIHRoZSBDLWxpbmtlcgotCi0gICogUlBBVEhfRkxBRyAgICAtIGZsYWcgcGFzc2VkIHRocm91Z2ggdG8gdGhlIEMtbGlua2VyIHRvIHNldCBhIHBhdGggZm9yCi0gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlicmFyaWVzLiAgTWF5IG5lZWQgdG8gYmUgc2V0IGJ5IHVzZXIgb24KLSAgICAgICAgICAgICAgICAgICAgZXhvdGljIHBsYXRmb3Jtcy4gIChkZWZhdWx0OiAiLVIiKS4KLQotICAqIEVMRl9SUEFUSF9GTEFHIC0gdGhpcyBmbGFnIGlzIHVzZWQgdG8gc2V0IHRoZSBycGF0aCBvbiBFTEYtcGxhdGZvcm1zLgotICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICItUiIpCi0KLSAgKiBFTEZfUlBBVEggICAgIC0gaWYgdGhpcyBmbGFnIGlzICJ5ZXMiLCB0aGVuIHRoZSBSUEFUSF9GTEFHIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgcGFzc2VkIGJ5ICItV2wiIHRvIHRoZSBsaW5rZXIgYXMgbm9ybWFsIG9uCi0gICAgICAgICAgICAgICAgICAgIEVMRi1wbGF0Zm9ybXMuCi0KLSAgKiBPQ0FNTExJQlBBVEggIC0gcGF0aCB0byB0aGUgT0NhbWwtc3RhbmRhcmQtbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgICAgIChmaXJzdCBkZWZhdWx0OiBgJChPQ0FNTEMpIC13aGVyZWApCi0gICAgICAgICAgICAgICAgICAgIChzZWNvbmQgZGVmYXVsdDogIi91c3IvbG9jYWwvbGliL29jYW1sIikKLQotICAqIE9DQU1MX0RFRkFVTFRfRElSUyAtIGFkZGl0aW9uYWwgcGF0aCBpbiB3aGljaCB0aGUgdXNlciBjYW4gc3VwcGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBkaXJlY3RvcmllcyB0byBoaXMgb3duIGNvbGxlY3Rpb24gb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMuICBUaGUgaWRlYSBpcyB0byBwYXNzIHRoaXMgYXMgYW4gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBzbyB0aGF0IHRoZSBNYWtlZmlsZXMgZG8gbm90IGhhdmUgdG8gY29udGFpbgotICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcGF0aCBhbGwgdGhlIHRpbWUuCi0KLSAgKiBPQ0FNTEZJTkQgICAgIC0gb2NhbWxmaW5kIGZyb20gZmluZGxpYiAgICAgICAoZGVmYXVsdDogIm9jYW1sZmluZCIpCi0gICogT0NBTUxDICAgICAgICAtIGJ5dGUtY29kZSBjb21waWxlciAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGMiKQotICAqIE9DQU1MT1BUICAgICAgLSBuYXRpdmUtY29kZSBjb21waWxlciAgICAgICAgIChkZWZhdWx0OiAib2NhbWxvcHQiKQotICAqIE9DQU1MTUtUT1AgICAgLSB0b3AtbGV2ZWwgY29tcGlsZXIgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWxta3RvcCIpCi0gICogT0NBTUxDUCAgICAgICAtIHByb2ZpbGluZyBieXRlLWNvZGUgY29tcGlsZXIgKGRlZmF1bHQ6ICJvY2FtbGNwIikKLSAgKiBPQ0FNTERFUCAgICAgIC0gZGVwZW5kZW5jeSBnZW5lcmF0b3IgICAgICAgICAoZGVmYXVsdDogIm9jYW1sZGVwIikKLSAgKiBPQ0FNTExFWCAgICAgIC0gc2Nhbm5lciBnZW5lcmF0b3IgICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1sbGV4IikKLSAgKiBPQ0FNTFlBQ0MgICAgIC0gcGFyc2VyIGdlbmVyYXRvciAgICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1seWFjYyIpCi0gICogT0NBTUxNS0xJQiAgICAtIHRvb2wgdG8gY3JlYXRlIGxpYnJhcmllcyAgICAgKGRlZmF1bHQ6ICJvY2FtbG1rbGliIikKLSAgKiBDQU1MSURMICAgICAgIC0gSURMLWNvZGUgZ2VuZXJhdG9yICAgICAgICAgICAoZGVmYXVsdDogImNhbWxpZGwiKQotICAqIENBTUxJRExETEwgICAgLSBJREwtdXRpbGl0eSAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAiY2FtbGlkbGRsbCIpCi0gICogQ0FNTFA0ICAgICAgICAtIGNhbWxwNCBwcmVwcm9jZXNzb3IgICAgICAgICAgKGRlZmF1bHQ6ICJjYW1scDQiKQotICAqIE9DQU1MRE9DICAgICAgLSBPQ2FtbGRvYy1jb21tYW5kICAgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWxkb2MiKQotCi0gICogTEFURVggICAgICAgICAtIExhdGV4LXByb2Nlc3NvciAgICAgICAgICAgICAgKGRlZmF1bHQ6ICJsYXRleCIpCi0gICogRFZJUFMgICAgICAgICAtIGR2aXBzLWNvbW1hbmQgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICJkdmlwcyIpCi0gICogUFMyUERGICAgICAgICAtIFBvc3RTY3JpcHQtdG8tUERGIGNvbnZlcnRlciAgKGRlZmF1bHQ6ICJwczJwZGYiKQotCi0gICogQ0FNRUxFT05fUkVQT1JUIC0gcmVwb3J0IHRvb2wgb2YgQ2FtZWxlb24gIChkZWZhdWx0OiAicmVwb3J0IikKLSAgKiBDQU1FTEVPTl9SRVBPUlRfRkxBR1MgLSBmbGFncyBmb3IgdGhlIHJlcG9ydCB0b29sIG9mIENhbWVsZW9uCi0KLSAgKiBDQU1FTEVPTl9aT0dHWSAtIHpvZ2d5IHRvb2wgb2YgQ2FtZWxlb24KLSAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAiY2FtbHA0byBwYV96b2cuY21hIHByX28uY21vIikKLSAgKiBDQU1FTEVPTl9aT0dHWV9GTEFHUyAtIGZsYWdzIGZvciB0aGUgem9nZ3kgdG9vbCBvZiBDYW1lbGVvbgotCi0gICogT0NBTUxfR0xBREVDQyAtIEdsYWRlIGNvbXBpbGVyIGZvciBPQ2FtbCAgICAgKGRlZmF1bHQ6ICJsYWJsZ2xhZGVjYzIiKQotICAqIE9DQU1MX0dMQURFQ0NfRkxBR1MgLSBmbGFncyBmb3IgdGhlIEdsYWRlIGNvbXBpbGVyCi0KLSAgKiBPWFJJREwgICAgICAgIC0gT1hSSURMLWdlbmVyYXRvciAgKGRlZmF1bHQ6ICJveHJpZGwiKQotCi0gICogTk9JRExIRUFERVIgICAtIHNldCB0byAieWVzIiB0byBwcm9oaWJpdCAiT0NhbWxNYWtlZmlsZSIgZnJvbSB1c2luZwotICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBjYW1saWRsLWZsYWcgIi1oZWFkZXIiLgotCi0gICogTk9fQ1VTVE9NICAgICAtIFByZXZlbnQgbGlua2luZyBpbiBjdXN0b20gbW9kZS4KLQotICAqIFFVSUVUICAgICAgICAgLSB1bnNldHRpbmcgdGhpcyB2YXJpYWJsZSAoZS5nLiAibWFrZSBRVUlFVD0iKQotICAgICAgICAgICAgICAgICAgICB3aWxsIHByaW50IGFsbCBleGVjdXRlZCBjb21tYW5kcywgaW5jbHVkaW5nCi0gICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZSBvbmVzLiBUaGlzIGFsbG93cyBtb3JlIGNvbWZvcnRhYmxlCi0gICAgICAgICAgICAgICAgICAgIGRlYnVnZ2luZyB3aGVuIHRoaW5ncyBnbyB3cm9uZyBkdXJpbmcgYSBidWlsZC4KLQotICAqIFJFQUxMWV9RVUlFVCAgLSB3aGVuIHNldCB0aGlzIGZsYWcgdHVybnMgb2ZmIG91dHB1dCBmcm9tIHNvbWUgY29tbWFuZHMuCi0KLSAgKiBPQ0FNTE1BS0VGSUxFIC0gbG9jYXRpb24gb2YgKD1wYXRoIHRvKSB0aGlzICJPQ2FtbE1ha2VmaWxlIi4KLSAgICAgICAgICAgICAgICAgICAgQmVjYXVzZSBpdCBjYWxsZXMgaXRzZWxmIHJlY3Vyc2l2ZWx5LCBpdCBoYXMgdG8KLSAgICAgICAgICAgICAgICAgICAga25vdyB3aGVyZSBpdCBpcy4gKGRlZmF1bHQ6ICJPQ2FtbE1ha2VmaWxlIiA9Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsIGRpcmVjdG9yeSkKLQotICAqIEJDU1VGRklYICAgICAgLSBTdWZmaXggZm9yIGFsbCBieXRlLWNvZGUgZmlsZXMuIEUuZy46Ci0KLSAgICAgICAgICAgICAgICAgICAgICBSRVNVTFQgICA9IGZvbwotICAgICAgICAgICAgICAgICAgICAgIEJDU1VGRklYID0gX2JjCi0KLSAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIHByb2R1Y2UgYnl0ZS1jb2RlIGV4ZWN1dGFibGVzL2xpYnJhcmllcwotICAgICAgICAgICAgICAgICAgICB3aXRoIGJhc2VuYW1lICJmb29fYmMiLgotCi0gICogTkNTVUZGSVggICAgICAtIFNpbWlsYXIgdG8gIkJDU1VGRklYIiwgYnV0IGZvciBuYXRpdmUtY29kZSBmaWxlcy4KLSAgKiBUT1BTVUZGSVggICAgIC0gU3VmZml4IGFkZGVkIHRvIHRvcGxldmVsIGludGVycHJldGVycyAoZGVmYXVsdDogIi50b3AiKQotCi0gICogU1VCUFJPSlMgICAgICAtIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHN1YnByb2plY3RzIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkLgotCi0gICogU1VCVEFSR0VUICAgICAtIHRhcmdldCB0byBiZSBidWlsdCBmb3IgYWxsIHByb2plY3RzIGluIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgIFNVQlBST0pTLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCB2YXJpYWJsZXMgZm9yIFdpbmRvd3MgdXNlcnMKLQotICAqIE1JTkdXICAgICAgICAgLSB2YXJpYWJsZSB0byBkZXRlY3QgdGhlIE1JTkdXLWVudmlyb25tZW50Ci0gICogTVNWQyAgICAgICAgICAtIHZhcmlhYmxlIHRvIGRldGVjdCB0aGUgTVNWQy1jb21waWxlcgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVXAtdG8tZGF0ZSBpbmZvcm1hdGlvbiAobmV3ZXN0IHJlbGVhc2Ugb2YgZGlzdHJpYnV0aW9uKSBjYW4gYWx3YXlzIGJlCi1mb3VuZCBhdDoKLQotICBodHRwOi8vd3d3Lm9jYW1sLmluZm8vaG9tZS9vY2FtbF9zb3VyY2VzLmh0bWwKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVuam95IQotCi1OZXcgWW9yaywgMjAwNy0wNC0yMgotTWFya3VzIE1vdHRsCi0KLWUtbWFpbDogbWFya3VzLm1vdHRsQGdtYWlsLmNvbQotV1dXOiAgICBodHRwOi8vd3d3Lm9jYW1sLmluZm8KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9fb2FzaXMgYi9saWIvb2NhbWwvX29hc2lzCmluZGV4IGNiZmE3ZDEuLjgzNTY2YWEgMTAwNjQ0Ci0tLSBhL2xpYi9vY2FtbC9fb2FzaXMKKysrIGIvbGliL29jYW1sL19vYXNpcwpAQCAtMSw1ICsxLDUgQEAKIE5hbWU6IGxpYnRocmlmdC1vY2FtbAotVmVyc2lvbjogMC45LjMKK1ZlcnNpb246IDAuMTMuMAogT0FTSVNGb3JtYXQ6IDAuMwogU3lub3BzaXM6IE9DYW1sIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCiBBdXRob3JzOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9kZXNjciBiL2xpYi9vY2FtbC9kZXNjcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDE3NDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sL2Rlc2NyCkBAIC0wLDAgKzEgQEAKK09DYW1sIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvb3BhbSBiL2xpYi9vY2FtbC9vcGFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmMzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvb3BhbQpAQCAtMCwwICsxLDggQEAKK29wYW0tdmVyc2lvbjogIjEiCittYWludGFpbmVyOiAiWFhYKEZJTEwgTUUgSU4gV0lUSCBFTUFJTCkiCitidWlsZDogWworICBbbWFrZV0KKyAgW21ha2UgImluc3RhbGwiXQorXQorcmVtb3ZlOiBbWyJvY2FtbGZpbmQiICJyZW1vdmUiICJ0aHJpZnQiXV0KK2RlcGVuZHM6IFsib2NhbWxmaW5kIl0KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9zcmMvVGhyaWZ0Lm1sIGIvbGliL29jYW1sL3NyYy9UaHJpZnQubWwKaW5kZXggZjBkN2E0Mi4uMDYzNDU5YiAxMDA2NDQKLS0tIGEvbGliL29jYW1sL3NyYy9UaHJpZnQubWwKKysrIGIvbGliL29jYW1sL3NyYy9UaHJpZnQubWwKQEAgLTIwNiw4ICsyMDYsNiBAQAogICAgICAgICAoKiBza2lwcGFnZSAqKQogICAgIG1ldGhvZCBza2lwIHR5cCA9CiAgICAgICBtYXRjaCB0eXAgd2l0aAotICAgICAgICB8IFRfU1RPUCAtPiAoKQotICAgICAgICB8IFRfVk9JRCAtPiAoKQogICAgICAgICB8IFRfQk9PTCAtPiBpZ25vcmUgc2VsZiNyZWFkQm9vbAogICAgICAgICB8IFRfQllURQogICAgICAgICB8IFRfSTA4IC0+IGlnbm9yZSBzZWxmI3JlYWRCeXRlCkBAIC0yNDgsNiArMjQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYjcmVhZExpc3RFbmQpCiAgICAgICAgIHwgVF9VVEY4IC0+ICgpCiAgICAgICAgIHwgVF9VVEYxNiAtPiAoKQorICAgICAgICB8IF8gLT4gcmFpc2UgKFByb3RvY29sLkUgKFByb3RvY29sLklOVkFMSURfREFUQSwgIkludmFsaWQgZGF0YSIpKQogICBlbmQKIAogICBjbGFzcyB2aXJ0dWFsIGZhY3RvcnkgPQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL3VybCBiL2xpYi9vY2FtbC91cmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0ZDYwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC91cmwKQEAgLTAsMCArMSwyIEBACithcmNoaXZlOiAiWFhYKEZJTEwgTUUgSU4gV0lUSCBVUkwpIgorY2hlY2tzdW06ICJYWFgoRklMTCBNRSBJTiBXSVRIIE1ENSkiCmRpZmYgLS1naXQgYS9saWIvcGVybC9NQU5JRkVTVC5TS0lQIGIvbGliL3BlcmwvTUFOSUZFU1QuU0tJUApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjA0NDUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvTUFOSUZFU1QuU0tJUApAQCAtMCwwICsxLDE0IEBACitibGliLy4qJAorYnVpbGQtY3Bhbi1kaXN0LnNoCitGaXh1cERpc3QucGwKK01BTklGRVNULmJhaworTUFOSUZFU1QuU0tJUAorTVlNRVRBLmpzb24KK01ha2VmaWxlCitNYWtlZmlsZS5hbQorTWFrZWZpbGUuaW4KK3BtX3RvX2JsaWIKK3QvTWFrZWZpbGUKK3QvTWFrZWZpbGUuYW0KK3QvTWFrZWZpbGUuaW4KK3Rvb2xzL0ZpeHVwRGlzdC5wbApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvTWFrZWZpbGUuUEwgYi9saWIvcGVybC9NYWtlZmlsZS5QTAppbmRleCBjZWNhODZmLi41ZTYwYWI0IDEwMDY0NAotLS0gYS9saWIvcGVybC9NYWtlZmlsZS5QTAorKysgYi9saWIvcGVybC9NYWtlZmlsZS5QTApAQCAtMTcsMTMgKzE3LDMzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwogdXNlIEV4dFV0aWxzOjpNYWtlTWFrZXI7Ci1Xcml0ZU1ha2VmaWxlKCAnTkFNRScgPT4gJ1RocmlmdCcsCi0gICAgICAgICAgICAgICAnVkVSU0lPTl9GUk9NJyA9PiAnbGliL1RocmlmdC5wbScsCi0gICAgICAgICAgICAgICAnUFJFUkVRX1BNJyAgICAgICAgICAgICAgPT4gewotICAgICAgICAgICAgICAgICAgICdCaXQ6OlZlY3RvcicgPT4gMCwKKworV3JpdGVNYWtlZmlsZSggQUJTVFJBQ1QgPT4gJ0FwYWNoZSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LicsCisgICAgICAgICAgICAgICBBVVRIT1IgPT4gJ0FwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4nLAorICAgICAgICAgICAgICAgTElDRU5TRSA9PiAnYXBhY2hlXzJfMCcsCisgICAgICAgICAgICAgICBNSU5fUEVSTF9WRVJTSU9OID0+ICc1LjAxMDAwMCcsCisgICAgICAgICAgICAgICBOQU1FID0+ICdUaHJpZnQnLAorICAgICAgICAgICAgICAgTkVFRFNfTElOS0lORyA9PiAwLAorICAgICAgICAgICAgICAgUFJFUkVRX1BNID0+IHsKKyAgICAgICAgICAgICAgICAgICAnQml0OjpWZWN0b3InICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICdDbGFzczo6QWNjZXNzb3InID0+IDAKICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAoJF0gPj0gNS4wMDUgPwotICggICAgICAgICAgICAgICAgQVVUSE9SICAgICA9PiAnQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPicpIDogKCkpLAotICAgICAgICAgICAgICAgKTsKKyMgICAgICAgICAgICAgIFNJR04gPT4gMSwKKyAgICAgICAgICAgICAgIFZFUlNJT05fRlJPTSA9PiAnbGliL1RocmlmdC5wbScgKTsKKworIyBUSFJJRlQtNDY5MQorcGFja2FnZSBNWTsgIyBzbyB0aGF0ICJTVVBFUiIgd29ya3MgcmlnaHQKK3N1YiB0ZXN0IHsKKyAgICAjIEFkZHMgZ2VuLXBlcmwgYW5kIGdlbi1wZXJsMiB0byB0aGUgdGVzdCBleGVjdXRpb24gYXMgaW5jbHVkZSBwYXRocworICAgICMgQ291bGQgbm90IGZpbmQgYW55dGhpbmcgaW4gTWFrZU1ha2VyIHRoYXQgd291bGQgZG8gdGhpcy4uLgorICAgIG15IEByZXN1bHQ7CisgICAgZm9yIChAcmVzdWx0ID0gc2hpZnQtPlNVUEVSOjp0ZXN0KEBfKSkgeworICAgICAgICBzL1wkXChURVNUX0ZJTEVTXCkvLUlnZW4tcGVybCAtSWdlbi1wZXJsMiBcJChURVNUX0ZJTEVTKS9pZzsKKyAgICB9CisgICAgQHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYi9wZXJsL01ha2VmaWxlLmFtIGIvbGliL3BlcmwvTWFrZWZpbGUuYW0KaW5kZXggNmIwZjlkZC4uYWJhZTFlNyAxMDA2NDQKLS0tIGEvbGliL3BlcmwvTWFrZWZpbGUuYW0KKysrIGIvbGliL3BlcmwvTWFrZWZpbGUuYW0KQEAgLTE3LDM4ICsxNywzNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotU1VCRElSUyA9IHRlc3QKK1NVQkRJUlMgPSB0CiAKIE1ha2VmaWxlLXBlcmwubWsgOiBNYWtlZmlsZS5QTAogCSQoUEVSTCkgTWFrZWZpbGUuUEwgTUFLRUZJTEU9TWFrZWZpbGUtcGVybC5tayBJTlNUQUxMRElSUz0kKElOU1RBTExESVJTKSBJTlNUQUxMX0JBU0U9JChQRVJMX1BSRUZJWCkKIAogYWxsLWxvY2FsOiBNYWtlZmlsZS1wZXJsLm1rCi0JJChNQUtFKSAtZiBNYWtlZmlsZS1wZXJsLm1rCisJJChNQUtFKSAtZiAkPAogCWZpbmQgYmxpYiAtbmFtZSAnTWFrZWZpbGUqJyAtZXhlYyBybSAtZiB7fSBcOwogCi1jaGVjay1sb2NhbDoKLQkkKFBFUkwpIC1JYmxpYi9saWIgLUlAYWJzX3NyY2RpckAgLUlAYnVpbGRkaXJAL3Rlc3QvZ2VuLXBlcmwgXAotCQktSUBidWlsZGRpckAvdGVzdC9nZW4tcGVybC9CZW5jaG1hcmtUZXN0IFwKLQkJLUlAYnVpbGRkaXJAL3Rlc3QvZ2VuLXBlcmwvQWdnciBcCi0JCUBhYnNfc3JjZGlyQC90ZXN0LnBsIEBhYnNfc3JjZGlyQC90ZXN0LyoudAotCiBpbnN0YWxsLWV4ZWMtbG9jYWw6IE1ha2VmaWxlLXBlcmwubWsKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLXBlcmwubWsgaW5zdGFsbCBERVNURElSPSQoREVTVERJUikvCisJJChNQUtFKSAtZiAkPCBpbnN0YWxsIERFU1RESVI9JChERVNURElSKS8KIAogY2xlYW4tbG9jYWw6CiAJaWYgdGVzdCAtZiBNYWtlZmlsZS1wZXJsLm1rIDsgdGhlbiBcCiAJCSQoTUFLRSkgLWYgTWFrZWZpbGUtcGVybC5tayBjbGVhbiA7IFwKIAlmaQotCXJtIC1mIE1ha2VmaWxlLXBlcmwubWsub2xkCisJJChSTSkgTWFrZWZpbGUtcGVybC5tay5vbGQKKwkkKFJNKSAtciBnZW4tcGVybCBnZW4tcGVybDIKIAogRVhUUkFfRElTVCA9IFwKIAljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlidWlsZC1jcGFuLWRpc3Quc2ggXAogCU1ha2VmaWxlLlBMIFwKIAl0ZXN0LnBsIFwKIAlsaWIvVGhyaWZ0LnBtIFwKIAlsaWIvVGhyaWZ0LnBtIFwKIAlsaWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtIFwKIAlsaWIvVGhyaWZ0L0J1ZmZlcmVkVHJhbnNwb3J0LnBtIFwKKwlsaWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbSBcCiAJbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0gXAogCWxpYi9UaHJpZnQvSHR0cENsaWVudC5wbSBcCiAJbGliL1RocmlmdC9NZW1vcnlCdWZmZXIucG0gXApAQCAtNjIsNSArNTksNTAgQEAKIAlsaWIvVGhyaWZ0L1NvY2tldC5wbSBcCiAJbGliL1RocmlmdC9TU0xTb2NrZXQucG0gXAogCWxpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtIFwKKwlsaWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0gXAorCWxpYi9UaHJpZnQvVW5peFNvY2tldC5wbSBcCisJbGliL1RocmlmdC9UeXBlLnBtIFwKIAlsaWIvVGhyaWZ0L1RyYW5zcG9ydC5wbSBcCiAJUkVBRE1FLm1kCisKK1RIUklGVCA9IEB0b3BfYnVpbGRkaXJAL2NvbXBpbGVyL2NwcC90aHJpZnQKK1RIUklGVF9JRiA9IEB0b3Bfc3JjZGlyQC90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitOQU1FX0JFTkNITUFSS1NFUlZJQ0UgPSAgQHRvcF9zcmNkaXJAL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAorTkFNRV9BR0dSID0gQHRvcF9zcmNkaXJAL2NvbnRyaWIvYXN5bmMtdGVzdC9hZ2dyLnRocmlmdAorCitUSFJJRlRURVNUX0dFTiA9IFwKKwlnZW4tcGVybC9UaHJpZnRUZXN0L0NvbnN0YW50cy5wbSBcCisJZ2VuLXBlcmwvVGhyaWZ0VGVzdC9TZWNvbmRTZXJ2aWNlLnBtIFwKKwlnZW4tcGVybC9UaHJpZnRUZXN0L1RocmlmdFRlc3QucG0gXAorCWdlbi1wZXJsL1RocmlmdFRlc3QvVHlwZXMucG0KKworQkVOQ0hNQVJLX0dFTiA9IFwKKwlnZW4tcGVybC9CZW5jaG1hcmtTZXJ2aWNlLnBtIFwKKwlnZW4tcGVybC9Db25zdGFudHMucG0gXAorCWdlbi1wZXJsL1R5cGVzLnBtCisKK0FHR1JfR0VOID0gXAorCWdlbi1wZXJsMi9BZ2dyLnBtIFwKKwlnZW4tcGVybDIvQ29uc3RhbnRzLnBtIFwKKwlnZW4tcGVybDIvVHlwZXMucG0KKworUEVSTF9HRU4gPSBcCisJJChUSFJJRlRURVNUX0dFTikgXAorCSQoQkVOQ0hNQVJLX0dFTikgXAorCSQoQUdHUl9HRU4pCisKK0JVSUxUX1NPVVJDRVMgPSAkKFBFUkxfR0VOKQorCitjaGVjay1sb2NhbDogJChQRVJMX0dFTikKKwkkKFBFUkwpIC1JYmxpYi9saWIgLUlAYWJzX3NyY2RpckAgLUlAYnVpbGRkaXJAL2dlbi1wZXJsMiAtSUBidWlsZGRpckAvZ2VuLXBlcmwgXAorCQlAYWJzX3NyY2RpckAvdGVzdC5wbCBAYWJzX3NyY2RpckAvdC8qLnQKKworJChUSFJJRlRURVNUX0dFTik6ICQoVEhSSUZUX0lGKSAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gcGVybCAkPAorCiskKEJFTkNITUFSS19HRU4pOiAkKE5BTUVfQkVOQ0hNQVJLU0VSVklDRSkgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIHBlcmwgJDwKKworJChBR0dSX0dFTik6ICQoTkFNRV9BR0dSKSAkKFRIUklGVCkKKwkkKE1LRElSX1ApIGdlbi1wZXJsMgorCSQoVEhSSUZUKSAtb3V0IGdlbi1wZXJsMiAtLWdlbiBwZXJsICQ8CmRpZmYgLS1naXQgYS9saWIvcGVybC9SRUFETUUubWQgYi9saWIvcGVybC9SRUFETUUubWQKaW5kZXggNTEyNDdlMC4uYmQxZTViMiAxMDA2NDQKLS0tIGEvbGliL3BlcmwvUkVBRE1FLm1kCisrKyBiL2xpYi9wZXJsL1JFQURNRS5tZApAQCAtMSw3ICsxLDEzIEBACiBUaHJpZnQgUGVybCBTb2Z0d2FyZSBMaWJyYXJ5CiAKLUxpY2Vuc2UKLT09PT09PT0KKyMgU3VtbWFyeQorCitBcGFjaGUgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4KK0l0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrCitlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseSBiZXR3ZWVuIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiAgQSBsYW5ndWFnZS1uZXV0cmFsIElETAoraXMgdXNlZCB0byBnZW5lcmF0ZSBmdW5jdGlvbmluZyBjbGllbnQgbGlicmFyaWVzIGFuZCBzZXJ2ZXItc2lkZSBoYW5kbGluZyBmcmFtZXdvcmtzLgorCisjIExpY2Vuc2UKIAogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTIwLDEwICsyNiwxMyBAQAogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogdW5kZXIgdGhlIExpY2Vuc2UuCiAKLVVzaW5nIFRocmlmdCB3aXRoIFBlcmwKLT09PT09PT09PT09PT09PT09PT09PQorIyBGb3IgTW9yZSBJbmZvcm1hdGlvbgogCi1UaHJpZnQgcmVxdWlyZXMgUGVybCA+PSA1LjYuMAorU2VlIHRoZSBbQXBhY2hlIFRocmlmdCBXZWIgU2l0ZV0oaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLykgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyMgVXNpbmcgVGhyaWZ0IHdpdGggUGVybAorCitUaHJpZnQgcmVxdWlyZXMgUGVybCA+PSA1LjEwLjAKIAogVW5leHBlY3RlZCBleGNlcHRpb25zIGluIGEgc2VydmljZSBoYW5kbGVyIGFyZSBjb252ZXJ0ZWQgdG8KIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB3aXRoIHR5cGUgSU5URVJOQUwgRVJST1IgYW5kIHRoZSBzdHJpbmcKQEAgLTM0LDEyICs0Myw4MiBAQAogCiBQbGVhc2Ugc2VlIHR1dG9yYWwgYW5kIHRlc3QgZGlycyBmb3IgZXhhbXBsZXMuCiAKLURlcGVuZGVuY2llcwotPT09PT09PT09PT09CitUaGUgUGVybCBGb3JraW5nU2VydmVyIGlnbm9yZXMgU0lHQ0hMRCBhbGxvd2luZyB0aGUgZm9ya3MgdG8gYmUKK3JlYXBlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYXR1cmFsbHkgd2hlbiB0aGV5IGV4aXQuICBUaGlzIG1lYW5zCitvbmUgY2Fubm90IHVzZSBhIGN1c3RvbSBTSUdDSExEIGhhbmRsZXIgaW4gdGhlIGNvbnN1bWluZyBwZXJsCitpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbGxzIHNlcnZlKCkuICBJdCBpcyBhY2NlcHRhYmxlIHRvIHVzZQorYSBjdXN0b20gU0lHQ0hMRCBoYW5kbGVyIHdpdGhpbiBhIHRocmlmdCBoYW5kbGVyIGltcGxlbWVudGF0aW9uCithcyB0aGUgRm9ya2luZ1NlcnZlciByZXNldHMgdGhlIGZvcmtlZCBjaGlsZCBwcm9jZXNzIHRvIHVzZQorZGVmYXVsdCBzaWduYWwgaGFuZGxpbmcuCiAKLUJpdDo6VmVjdG9yICAgICAgIC0gY29tZXMgd2l0aCBtb2Rlcm4gcGVybCBpbnN0YWxsYXRpb25zLgotQ2xhc3M6OkFjY2Vzc29yCi1JTzo6U29ja2V0OjpJTkVUICAtIGNvbWVzIHdpdGggbW9kZXJuIHBlcmwgaW5zdGFsbGF0aW9ucy4KLUlPOjpTb2NrZXQ6OlNTTCAgIC0gcmVxdWlyZWQgaWYgdXNpbmcgU1NML1RMUy4KLU5FVDo6U1NMZWF5Ci1DcnlwdDo6U1NMZWF5ICAgICAtIGZvciBtYWtlIGNyb3NzCisjIERlcGVuZGVuY2llcworCitUaGUgZm9sbG93aW5nIG1vZHVsZXMgYXJlIG5vdCBwcm92aWRlZCBieSBQZXJsIDUuMTAuMCBidXQgYXJlIHJlcXVpcmVkCit0byB1c2UgVGhyaWZ0LgorCisjIyBSdW50aW1lCisKKyAgKiBCaXQ6OlZlY3RvcgorICAqIENsYXNzOjpBY2Nlc3NvcgorCisjIyMgSHR0cENsaWVudCBUcmFuc3BvcnQKKworVGhlc2UgYXJlIG9ubHkgcmVxdWlyZWQgaWYgdXNpbmcgVGhyaWZ0OjpIdHRwQ2xpZW50OgorCisgICogSFRUUDo6UmVxdWVzdAorICAqIElPOjpTdHJpbmcKKyAgKiBMV1A6OlVzZXJBZ2VudAorCisjIyMgU1NML1RMUworCitUaGVzZSBhcmUgb25seSByZXF1aXJlZCBpZiB1c2luZyBUaHJpZnQ6OlNTTFNvY2tldCBvciBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldDoKKworICAqIElPOjpTb2NrZXQ6OlNTTAorCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMC4wCisKK1RoZSBzb2NrZXQgY2xhc3NlcyB3ZXJlIHJlZmFjdG9yZWQgaW4gMC4xMC4wIHNvIHRoYXQgdGhlcmUgaXMgb25lIHBhY2thZ2UgcGVyCitmaWxlLiAgVGhpcyBtZWFucyBgdXNlIFNvY2tldDtgIG5vIGxvbmdlciBkZWZpbmVzIFNTTFNvY2tldC4gIFlvdSBjYW4gdXNlIHRoaXMKK3RlY2huaXF1ZSB0byBtYWtlIHlvdXIgYXBwbGljYXRpb24gcnVuIGFnYWluc3QgMC4xMC4wIGFzIHdlbGwgYXMgZWFybGllciB2ZXJzaW9uczoKKworYGV2YWwgeyByZXF1aXJlIFRocmlmdDo6U1NMU29ja2V0OyB9IG9yIGRvIHsgcmVxdWlyZSBUaHJpZnQ6OlNvY2tldDsgfWAKKworIyMgMC4xMS4wCisKKyAgKiBOYW1lc3BhY2VzIG9mIHBhY2thZ2VzIHRoYXQgd2VyZSBub3Qgc2NvcGVkIHdpdGhpbiBUaHJpZnQgaGF2ZSBiZWVuIGZpeGVkLgorICAqKiBUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgbm93IFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICoqIFRFeGNlcHRpb24gaXMgbm93IFRocmlmdDo6VEV4Y2VwdGlvbgorICAqKiBUTWVzc2FnZVR5cGUgaXMgbm93IFRocmlmdDo6VE1lc3NhZ2VUeXBlCisgICoqIFRQcm90b2NvbEV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24KKyAgKiogVFByb3RvY29sRmFjdG9yeSBpcyBub3cgVGhyaWZ0OjpUUHJvdG9jb2xGYWN0b3J5CisgICoqIFRUcmFuc3BvcnRFeGNlcHRpb24gaXMgbm93IFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbgorICAqKiBUVHlwZSBpcyBub3cgVGhyaWZ0OjpUVHlwZQorCitJZiB5b3UgbmVlZCBhIHNpbmdsZSB2ZXJzaW9uIG9mIHlvdXIgY29kZSB0byB3b3JrIHdpdGggYm90aCBvbGRlciBhbmQgbmV3ZXIgdGhyaWZ0CituYW1lc3BhY2UgY2hhbmdlcywgeW91IGNhbiBtYWtlIHRoZSBuZXcsIGNvcnJlY3QgbmFtZXNwYWNlcyBiZWhhdmUgbGlrZSB0aGUgb2xkIG9uZXMKK2luIHlvdXIgZmlsZXMgd2l0aCB0aGlzIHRlY2huaXF1ZSB0byBjcmVhdGUgYW4gYWxpYXMsIHdoaWNoIHdpbGwgYWxsb3cgeW91IGNvZGUgdG8KK3J1biBhZ2FpbnN0IGVpdGhlciB2ZXJzaW9uIG9mIHRoZSBwZXJsIHJ1bnRpbWUgZm9yIHRocmlmdDoKKworYEJFR0lOIHsqVFR5cGU6OiA9ICpUaHJpZnQ6OlRUeXBlOjp9YAorCisgICogUGFja2FnZXMgZm91bmQgaW4gVGhyaWZ0LnBtIHdlcmUgbW92ZWQgaW50byB0aGUgVGhyaWZ0LyBkaXJlY3RvcnkgaW4gc2VwYXJhdGUgZmlsZXM6CisgICoqIFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIGlzIG5vdyBpbiBUaHJpZnQvRXhjZXB0aW9uLnBtCisgICoqIFRocmlmdDo6VEV4Y2VwdGlvbiBpcyBub3cgaW4gVGhyaWZ0L0V4Y2VwdGlvbi5wbQorICAqKiBUaHJpZnQ6OlRNZXNzYWdlVHlwZSBpcyBub3cgaW4gVGhyaWZ0L01lc3NhZ2VUeXBlLnBtCisgICoqIFRocmlmdDo6VFR5cGUgaXMgbm93IGluIFRocmlmdC9UeXBlLnBtCisKK0lmIHlvdSBuZWVkIHRvIG1vZGlmeSB5b3VyIGNvZGUgdG8gd29yayBhZ2FpbnN0IGJvdGggb2xkZXIgb3IgbmV3ZXIgdGhyaWZ0IHZlcnNpb25zLAoreW91IGNhbiBkZWFsIHdpdGggdGhlc2UgY2hhbmdlcyBpbiBhIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdheSBpbiB5b3VyIHByb2plY3RzIHVzaW5nIGV2YWw6CisKK2BldmFsICB7IHJlcXVpcmUgVGhyaWZ0OjpFeGNlcHRpb247IHJlcXVpcmUgVGhyaWZ0OjpNZXNzYWdlVHlwZTsgcmVxdWlyZSBUaHJpZnQ6OlR5cGU7IH0KKyBvciBkbyB7IHJlcXVpcmUgVGhyaWZ0OyB9YAorCisjIERlcHJlY2F0aW9ucworCisjIyAwLjExLjAKKworVGhyaWZ0OjpIdHRwQ2xpZW50IHNldFJlY3ZUaW1lb3V0KCkgYW5kIHNldFNlbmRUaW1lb3V0KCkgYXJlIGRlcHJlY2F0ZWQuIAorVXNlIHNldFRpbWVvdXQgaW5zdGVhZC4KKwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvYnVpbGQtY3Bhbi1kaXN0LnNoIGIvbGliL3BlcmwvYnVpbGQtY3Bhbi1kaXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjMGZmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9idWlsZC1jcGFuLWRpc3Quc2gKQEAgLTAsMCArMSw1NiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVGhpcyBzY3JpcHQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhZnRlciB0YWdnaW5nIHRoZSByZXBvc2l0b3J5IGFuZCB1cGRhdGluZworIyB0aGUgdmVyc2lvbiBmaWxlcyBmb3IgYSByZWxlYXNlLiAgSXQgd2lsbCBjcmVhdGUgYSBDUEFOIGFyY2hpdmUuICBSdW4gdGhpcworIyBmcm9tIGluc2lkZSBhIGRvY2tlciBpbWFnZSBsaWtlIHVidW50dS14ZW5pYWwuCisjCisKK3NldCAtZQorCitybSAtZiBNQU5JRkVTVAorcm0gLXJmIFRocmlmdC0qCisKKyMgc2V0dXAgY3BhbiB3aXRob3V0IGEgcHJvbXB0CitlY2hvIHwgY3BhbgorY3BhbiBpbnN0YWxsIEhUVFA6OkRhdGUgTG9nOjpMb2c0cGVybAorY3BhbiBpbnN0YWxsIENQQU4KK2NwYW4gaW5zdGFsbCBDUEFOOjpNZXRhIEV4dFV0aWxzOjpNYWtlTWFrZXIgSlNPTjo6UFAKKyMgY3BhbiBpbnN0YWxsIE1vZHVsZTo6U2lnbmF0dXJlCisKK3BlcmwgTWFrZWZpbGUuUEwKK3JtIE1ZTUVUQS55bWwKK21ha2UgbWFuaWZlc3QKK21ha2UgZGlzdAorCisjCisjIFdlIHVucGFjayB0aGUgYXJjaGl2ZSBzbyB3ZSBjYW4gYWRkIHZlcnNpb24gbWV0YWRhdGEgZm9yIENQQU4KKyMgc28gdGhhdCBpdCBwcm9wZXJseSBpbmRleGVzIFRocmlmdCBhbmQgcmVtb3ZlIHVubmVjZXNzYXJ5IGZpbGVzLgorIworCitlY2hvICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKK3NldCAteAorCitESVNURklMRT0kKGxzIFRocmlmdCouZ3opCitORVdGSUxFPSR7RElTVEZJTEUvdC12L3QtfQoraWYgW1sgIiRESVNURklMRSIgIT0gIiRORVdGSUxFIiBdXTsgdGhlbgorICAgIG12ICRESVNURklMRSAkTkVXRklMRQorICAgIERJU1RGSUxFPSIkTkVXRklMRSIKK2ZpCit0YXIgeHpmICRESVNURklMRQorcm0gJERJU1RGSUxFCitESVNURElSPSQobHMgLWQgVGhyaWZ0KikKKyMgY3BhbiBkb2Vzbid0IGxpa2UgIlRocmlmdC12MC5ubi4wIGFzIGEgZGlyZWN0b3J5IG5hbWUKKyMgbmVlZHMgdG8gYmUgVGhyaWZ0LTAubm4uMAorTkVXRElSPSR7RElTVERJUi90LXYvdC19CitpZiBbWyAiJERJU1RESVIiICE9ICIkTkVXRElSIiBdXTsgdGhlbgorICAgIG12ICRESVNURElSICRORVdESVIKKyAgICBESVNURElSPSIkTkVXRElSIgorZmkKK2NkICRESVNURElSCitjcCAtcCAuLi9NYWtlZmlsZS5QTCAuCitjcCAtcHIgLi4vZ2VuLXBlcmwgLgorY3AgLXByIC4uL2dlbi1wZXJsMiAuCitwZXJsIC4uL3Rvb2xzL0ZpeHVwRGlzdC5wbAorY2QgLi4KK3RhciBjdnpmICRESVNURklMRSAkRElTVERJUgorcm0gLXIgJERJU1RESVIKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvcGVybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCmluZGV4IGZhMDM5MGIuLmU0ZTgyNTUgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKKysrIGIvbGliL3BlcmwvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMSArMSwyIEBACi1QbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKS4KK0FkZGl0aW9uYWwgcGVybCBjb2Rpbmcgc3RhbmRhcmRzIGNhbiBiZSBmb3VuZCBpbiBbcGVybHN0eWxlXShodHRwOi8vcGVybGRvYy5wZXJsLm9yZy9wZXJsc3R5bGUuaHRtbCkuCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC5wbQppbmRleCAyZTcwZGNkLi4wMTk4NWVhIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQucG0KQEAgLTE3LDE2NiArMTcsMjAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLW91ciAkVkVSU0lPTiA9ICcwLjkuMyc7Ci0KLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogIwotIyBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAorIyBWZXJzaW9uaW5nCiAjCi1wYWNrYWdlIFRUeXBlOwotdXNlIGNvbnN0YW50IFNUT1AgICA9PiAwOwotdXNlIGNvbnN0YW50IFZPSUQgICA9PiAxOwotdXNlIGNvbnN0YW50IEJPT0wgICA9PiAyOwotdXNlIGNvbnN0YW50IEJZVEUgICA9PiAzOwotdXNlIGNvbnN0YW50IEkwOCAgICA9PiAzOwotdXNlIGNvbnN0YW50IERPVUJMRSA9PiA0OwotdXNlIGNvbnN0YW50IEkxNiAgICA9PiA2OwotdXNlIGNvbnN0YW50IEkzMiAgICA9PiA4OwotdXNlIGNvbnN0YW50IEk2NCAgICA9PiAxMDsKLXVzZSBjb25zdGFudCBTVFJJTkcgPT4gMTE7Ci11c2UgY29uc3RhbnQgVVRGNyAgID0+IDExOwotdXNlIGNvbnN0YW50IFNUUlVDVCA9PiAxMjsKLXVzZSBjb25zdGFudCBNQVAgICAgPT4gMTM7Ci11c2UgY29uc3RhbnQgU0VUICAgID0+IDE0OwotdXNlIGNvbnN0YW50IExJU1QgICA9PiAxNTsKLXVzZSBjb25zdGFudCBVVEY4ICAgPT4gMTY7Ci11c2UgY29uc3RhbnQgVVRGMTYgID0+IDE3OwotMTsKLQorIyBFdmVyeSBwZXJsIG1vZHVsZSBmb3IgVGhyaWZ0IHdpbGwgaGF2ZSB0aGUgc2FtZSB2ZXJzaW9uCisjIGRlY2xhcmF0aW9uLiAgRm9yIGEgcHJvZHVjdGlvbiBidWlsZCwgY2hhbmdlIGl0IGJlbG93IHRvCisjIHNvbWV0aGluZyBsaWtlICJ2MC4xMS4wIiBhbmQgYWxsIG9mIHRoZSBwYWNrYWdlcyBpbiBhbGwKKyMgb2YgdGhlIGZpbGVzIHdpbGwgcGljayBpdCB1cCBmcm9tIGhlcmUuCiAjCi0jIE1lc3NhZ2UgdHlwZXMgZm9yIFJQQwotIwotcGFja2FnZSBUTWVzc2FnZVR5cGU7Ci11c2UgY29uc3RhbnQgQ0FMTCAgICAgID0+IDE7Ci11c2UgY29uc3RhbnQgUkVQTFkgICAgID0+IDI7Ci11c2UgY29uc3RhbnQgRVhDRVBUSU9OID0+IDM7Ci11c2UgY29uc3RhbnQgT05FV0FZICAgID0+IDQ7Ci0xOwogCi1wYWNrYWdlIFRocmlmdDo6VEV4Y2VwdGlvbjsKLQotc3ViIG5ldyB7Ci0gICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwotICAgIG15ICRzZWxmID0ge21lc3NhZ2UgPT4gc2hpZnQsIGNvZGUgPT4gc2hpZnQgfHwgMH07Ci0KLSAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ci19Ci0xOwotCi1wYWNrYWdlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKLXVzZSBiYXNlKCdUaHJpZnQ6OlRFeGNlcHRpb24nKTsKLQotdXNlIGNvbnN0YW50IFVOS05PV04gICAgICAgICAgICAgICAgID0+IDA7Ci11c2UgY29uc3RhbnQgVU5LTk9XTl9NRVRIT0QgICAgICAgICAgPT4gMTsKLXVzZSBjb25zdGFudCBJTlZBTElEX01FU1NBR0VfVFlQRSAgICA9PiAyOwotdXNlIGNvbnN0YW50IFdST05HX01FVEhPRF9OQU1FICAgICAgID0+IDM7Ci11c2UgY29uc3RhbnQgQkFEX1NFUVVFTkNFX0lEICAgICAgICAgPT4gNDsKLXVzZSBjb25zdGFudCBNSVNTSU5HX1JFU1VMVCAgICAgICAgICA9PiA1OwotdXNlIGNvbnN0YW50IElOVEVSTkFMX0VSUk9SICAgICAgICAgID0+IDY7Ci11c2UgY29uc3RhbnQgUFJPVE9DT0xfRVJST1IgICAgICAgICAgPT4gNzsKLXVzZSBjb25zdGFudCBJTlZBTElEX1RSQU5TRk9STSAgICAgICA9PiA4OwotdXNlIGNvbnN0YW50IElOVkFMSURfUFJPVE9DT0wgICAgICAgID0+IDk7Ci11c2UgY29uc3RhbnQgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPT4gMTA7Ci0KLXN1YiBuZXcgewotICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKLQotICAgIG15ICRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyhAXyk7Ci0KLSAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ci19Ci0KLXN1YiByZWFkIHsKLSAgICBteSAkc2VsZiAgPSBzaGlmdDsKLSAgICBteSAkaW5wdXQgPSBzaGlmdDsKLQotICAgIG15ICR4ZmVyICA9IDA7Ci0gICAgbXkgJGZuYW1lID0gdW5kZWY7Ci0gICAgbXkgJGZ0eXBlID0gMDsKLSAgICBteSAkZmlkICAgPSAwOwotCi0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oXCRmbmFtZSk7Ci0KLSAgICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oXCRmbmFtZSwgXCRmdHlwZSwgXCRmaWQpOwotICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBsYXN0OyBuZXh0OwotICAgICAgICB9Ci0KLSAgICAgIFNXSVRDSDogZm9yKCRmaWQpCi0gICAgICB7Ci0gICAgICAgICAgLzEvICYmIGRvewotCi0gICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUUklORykgewotICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RyaW5nKFwkc2VsZi0+e21lc3NhZ2V9KTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgICB9OwotCi0gICAgICAgICAgLzIvICYmIGRvewotICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpJMzIpIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEkzMihcJHNlbGYtPntjb2RlfSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBsYXN0OwotICAgICAgICAgIH07Ci0KLSAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgIH0KLQotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKLSAgICB9Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci19Ci0KLXN1YiB3cml0ZSB7Ci0gICAgbXkgJHNlbGYgICA9IHNoaWZ0OwotICAgIG15ICRvdXRwdXQgPSBzaGlmdDsKLQotICAgIG15ICR4ZmVyICAgPSAwOwotCi0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7Ci0KLSAgICBpZiAoJHNlbGYtPmdldE1lc3NhZ2UoKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZTo6U1RSSU5HLCAxKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJpbmcoJHNlbGYtPmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKLSAgICB9Ci0KLSAgICBpZiAoJHNlbGYtPmdldENvZGUoKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZTo6STMyLCAyKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJHNlbGYtPmdldENvZGUoKSk7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKLSAgICB9Ci0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci19Ci0KLXN1YiBnZXRNZXNzYWdlCi17Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgIHJldHVybiAkc2VsZi0+e21lc3NhZ2V9OwotfQotCi1zdWIgZ2V0Q29kZQotewotICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICByZXR1cm4gJHNlbGYtPntjb2RlfTsKLX0KK3BhY2thZ2UgVGhyaWZ0OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgidjAuMTMuMCIpOwogCiAxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0KaW5kZXggYzYzOGVhZC4uZDYyNTA5YSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtCkBAIC0xNywyOCArMTcsMjkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Ci0KK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCi11c2UgdXRmODsKLXVzZSBFbmNvZGU7Ci0KLXVzZSBUaHJpZnQ7Ci11c2UgVGhyaWZ0OjpQcm90b2NvbDsKLQogdXNlIEJpdDo6VmVjdG9yOwordXNlIEVuY29kZTsKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ6OlByb3RvY29sOwordXNlIFRocmlmdDo6VHlwZTsKK3VzZSB1dGY4OwogCiAjCiAjIEJpbmFyeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sLgogIwogcGFja2FnZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwogdXNlIGJhc2UoJ1RocmlmdDo6UHJvdG9jb2wnKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogdXNlIGNvbnN0YW50IFZFUlNJT05fTUFTSyAgID0+IDB4ZmZmZjAwMDA7CiB1c2UgY29uc3RhbnQgVkVSU0lPTl8xICAgICAgPT4gMHg4MDAxMDAwMDsKLXVzZSBjb25zdGFudCBJU19CSUdfRU5ESUFOICA9PiB1bnBhY2soImgqIiwgcGFjaygicyIsIDEpKSA9fiAvMDEvOwordXNlIGNvbnN0YW50IElTX0JJR19FTkRJQU4gID0+IHVucGFjaygnaConLCBwYWNrKCdzJywgMSkpID1+IG0vMDEvOwogCiBzdWIgbmV3CiB7CkBAIC02Niw3ICs2Nyw4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN1YiB3cml0ZVN0cnVjdEJlZ2lueworc3ViIHdyaXRlU3RydWN0QmVnaW4KK3sKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICRuYW1lID0gc2hpZnQ7CiAgICAgcmV0dXJuIDA7CkBAIC05Nyw3ICs5OSw3IEBACiBzdWIgd3JpdGVGaWVsZFN0b3AKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgIHJldHVybiAkc2VsZi0+d3JpdGVCeXRlKFRUeXBlOjpTVE9QKTsKKyAgICByZXR1cm4gJHNlbGYtPndyaXRlQnl0ZShUaHJpZnQ6OlRUeXBlOjpTVE9QKTsKIH0KIAogc3ViIHdyaXRlTWFwQmVnaW4KQEAgLTI1MiwxNCArMjU0LDE2IEBACiAgICAgbXkgJHJlc3VsdCA9ICRzZWxmLT5yZWFkSTMyKFwkdmVyc2lvbik7CiAgICAgaWYgKCgkdmVyc2lvbiAmIFZFUlNJT05fTUFTSykgPiAwKSB7CiAgICAgICBpZiAoKCR2ZXJzaW9uICYgVkVSU0lPTl9NQVNLKSAhPSBWRVJTSU9OXzEpIHsKLSAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ01pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyJykKKyAgICAgICAgZGllIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uLT5uZXcoJ01pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOwogICAgICAgfQogICAgICAgJCR0eXBlID0gJHZlcnNpb24gJiAweDAwMDAwMGZmOwogICAgICAgcmV0dXJuCiAgICAgICAgICAgJHJlc3VsdCArCiAgICAgICAgICAgJHNlbGYtPnJlYWRTdHJpbmcoJG5hbWUpICsKICAgICAgICAgICAkc2VsZi0+cmVhZEkzMigkc2VxaWQpOwotICAgIH0gZWxzZSB7ICMgb2xkIGNsaWVudCBzdXBwb3J0IGNvZGUKKyAgICB9CisgICAgZWxzZSB7ICMgb2xkIGNsaWVudCBzdXBwb3J0IGNvZGUKICAgICAgIHJldHVybgogICAgICAgICAkcmVzdWx0ICsKICAgICAgICAgJHNlbGYtPnJlYWRTdHJpbmdCb2R5KCRuYW1lLCAkdmVyc2lvbikgKyAjIHZlcnNpb24gaGVyZSBob2xkcyB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nCkBAIC0yOTcsNyArMzAxLDcgQEAKIAogICAgIG15ICRyZXN1bHQgPSAkc2VsZi0+cmVhZEJ5dGUoJGZpZWxkVHlwZSk7CiAKLSAgICBpZiAoJCRmaWVsZFR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICBpZiAoJCRmaWVsZFR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgewogICAgICAgJCRmaWVsZElkID0gMDsKICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KQEAgLTQyNSw3ICs0MjksNyBAQAogCiAgICAgbXkgKCRoaSwkbG8pPXVucGFjaygnTk4nLCRkYXRhKTsKIAotICAgIG15ICR2ZWMgPSBuZXcgQml0OjpWZWN0b3IoNjQpOworICAgIG15ICR2ZWMgPSBCaXQ6OlZlY3Rvci0+bmV3KDY0KTsKIAogICAgICR2ZWMtPkNodW5rX1N0b3JlKDMyLDMyLCRoaSk7CiAgICAgJHZlYy0+Q2h1bmtfU3RvcmUoMzIsMCwkbG8pOwpAQCAtNDQ3LDcgKzQ1MSw3IEBACiAgICAgZWxzZSB7CiAgICAgICAkZGF0YSA9IHNjYWxhciByZXZlcnNlKCRzZWxmLT57dHJhbnN9LT5yZWFkQWxsKDgpKTsKICAgICB9Ci0gICAgCisKICAgICBteSBAYXJyID0gdW5wYWNrKCdkJywgJGRhdGEpOwogCiAgICAgJCR2YWx1ZSA9ICRhcnJbMF07CkBAIC00NjUsNyArNDY5LDggQEAKIAogICAgIGlmICgkbGVuKSB7CiAgICAgICAkJHZhbHVlID0gJHNlbGYtPnt0cmFuc30tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAkJHZhbHVlID0gJyc7CiAgICAgfQogCkBAIC00ODAsNyArNDg1LDggQEAKIAogICAgIGlmICgkbGVuKSB7CiAgICAgICAkJHZhbHVlID0gJHNlbGYtPnt0cmFuc30tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAkJHZhbHVlID0gJyc7CiAgICAgfQogCkBAIC00OTEsNyArNDk3LDggQEAKICMgQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKICMKIHBhY2thZ2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Ci11c2UgYmFzZSgnVFByb3RvY29sRmFjdG9yeScpOwordXNlIGJhc2UoJ1RocmlmdDo6VFByb3RvY29sRmFjdG9yeScpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC01MDUsNyArNTEyLDcgQEAKICAgICBteSAkc2VsZiAgPSBzaGlmdDsKICAgICBteSAkdHJhbnMgPSBzaGlmdDsKIAotICAgIHJldHVybiBuZXcgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbCgkdHJhbnMpOworICAgIHJldHVybiBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJHRyYW5zKTsKIH0KIAogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0J1ZmZlcmVkVHJhbnNwb3J0LnBtCmluZGV4IDM4NjhjYTIuLjZiNWJmN2EgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbQpAQCAtMTcsMTUgKzE3LDE3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiB1c2UgVGhyaWZ0OjpUcmFuc3BvcnQ7CiAKIHBhY2thZ2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC0xMTAsNiArMTEyLDcgQEAKICMgQnVmZmVyZWRUcmFuc3BvcnQgZmFjdG9yeSBjcmVhdGVzIGJ1ZmZlcmVkIHRyYW5zcG9ydCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwogIwogcGFja2FnZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9FeGNlcHRpb24ucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDA0MDY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9FeGNlcHRpb24ucG0KQEAgLTAsMCArMSwxNjEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlR5cGU7CisKK3BhY2thZ2UgVGhyaWZ0OjpURXhjZXB0aW9uOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2Ugb3ZlcmxvYWQgJyIiJyA9PiBzdWIgeworICAgIHJldHVybgorICAgICAgICBzcHJpbnRmICclcyBlcnJvcjogJXMgKGNvZGUgJXMpJywKKyAgICAgICAgICByZWYoICRfWzBdICksCisgICAgICAgICAgKCAkX1swXS0+e21lc3NhZ2V9IHx8ICdlbXB0eSBtZXNzYWdlJyApLAorICAgICAgICAgICggZGVmaW5lZCAkX1swXS0+e2NvZGV9ID8gJF9bMF0tPntjb2RlfSA6ICd1bmRlZmluZWQnICk7CisgICAgfTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmID0ge21lc3NhZ2UgPT4gc2hpZnQsIGNvZGUgPT4gc2hpZnQgfHwgMH07CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKK3BhY2thZ2UgVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb247Cit1c2UgcGFyZW50IC1ub3JlcXVpcmUsICdUaHJpZnQ6OlRFeGNlcHRpb24nOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICAgICAgICAgICAgPT4gMDsKK3VzZSBjb25zdGFudCBVTktOT1dOX01FVEhPRCAgICAgICAgICA9PiAxOwordXNlIGNvbnN0YW50IElOVkFMSURfTUVTU0FHRV9UWVBFICAgID0+IDI7Cit1c2UgY29uc3RhbnQgV1JPTkdfTUVUSE9EX05BTUUgICAgICAgPT4gMzsKK3VzZSBjb25zdGFudCBCQURfU0VRVUVOQ0VfSUQgICAgICAgICA9PiA0OwordXNlIGNvbnN0YW50IE1JU1NJTkdfUkVTVUxUICAgICAgICAgID0+IDU7Cit1c2UgY29uc3RhbnQgSU5URVJOQUxfRVJST1IgICAgICAgICAgPT4gNjsKK3VzZSBjb25zdGFudCBQUk9UT0NPTF9FUlJPUiAgICAgICAgICA9PiA3OwordXNlIGNvbnN0YW50IElOVkFMSURfVFJBTlNGT1JNICAgICAgID0+IDg7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9QUk9UT0NPTCAgICAgICAgPT4gOTsKK3VzZSBjb25zdGFudCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9PiAxMDsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworCisgICAgbXkgJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworc3ViIHJlYWQgeworICAgIG15ICRzZWxmICA9IHNoaWZ0OworICAgIG15ICRpbnB1dCA9IHNoaWZ0OworCisgICAgbXkgJHhmZXIgID0gMDsKKyAgICBteSAkZm5hbWUgPSB1bmRlZjsKKyAgICBteSAkZnR5cGUgPSAwOworICAgIG15ICRmaWQgICA9IDA7CisKKyAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbihcJGZuYW1lKTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbihcJGZuYW1lLCBcJGZ0eXBlLCBcJGZpZCk7CisgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgbGFzdDsgbmV4dDsKKyAgICAgICAgfQorCisgICAgICBTV0lUQ0g6IGZvcigkZmlkKQorICAgICAgeworICAgICAgICAgIC8xLyAmJiBkb3sKKworICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUklORykgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RyaW5nKFwkc2VsZi0+e21lc3NhZ2V9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICB9OworCisgICAgICAgICAgLzIvICYmIGRveworICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OkkzMikgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkSTMyKFwkc2VsZi0+e2NvZGV9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgfTsKKworICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgfQorCisgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOworICAgIH0KKyAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgIHJldHVybiAkeGZlcjsKK30KKworc3ViIHdyaXRlIHsKKyAgICBteSAkc2VsZiAgID0gc2hpZnQ7CisgICAgbXkgJG91dHB1dCA9IHNoaWZ0OworCisgICAgbXkgJHhmZXIgICA9IDA7CisKKyAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKKworICAgIGlmICgkc2VsZi0+Z2V0TWVzc2FnZSgpKSB7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRocmlmdDo6VFR5cGU6OlNUUklORywgMSk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RyaW5nKCRzZWxmLT5nZXRNZXNzYWdlKCkpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgaWYgKCRzZWxmLT5nZXRDb2RlKCkpIHsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVGhyaWZ0OjpUVHlwZTo6STMyLCAyKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJHNlbGYtPmdldENvZGUoKSk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKKyAgICByZXR1cm4gJHhmZXI7Cit9CisKK3N1YiBnZXRNZXNzYWdlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e21lc3NhZ2V9OworfQorCitzdWIgZ2V0Q29kZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb2RlfTsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvRnJhbWVkVHJhbnNwb3J0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0KaW5kZXggNmYyZDJjZi4uYmE4OWJhMyAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0KQEAgLTE3LDYgKzE3LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCkBAIC0zMCw4ICszMSw4IEBACiAjIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKICMKIHBhY2thZ2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQ7Ci0KIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC02OSw3ICs3MCw3IEBACiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAogICAgIGlmIChkZWZpbmVkICRzZWxmLT57dHJhbnNwb3J0fSkgewotICAgICAgJHNlbGYtPnt0cmFuc3BvcnR9LT5jbG9zZSgpOworICAgICAgICAkc2VsZi0+e3RyYW5zcG9ydH0tPmNsb3NlKCk7CiAgICAgfQogfQogCkBAIC0xNjcsNiArMTY4LDcgQEAKICMgRnJhbWVkVHJhbnNwb3J0IGZhY3RvcnkgY3JlYXRlcyBmcmFtZWQgdHJhbnNwb3J0IG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCiAjCiBwYWNrYWdlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtMTg5LDUgKzE5MSw0IEBACiAgICAgcmV0dXJuICRidWZmZXJlZDsKIH0KIAotCiAxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtCmluZGV4IGQ2ZmM4YmUuLjQwZWM5Y2UgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvSHR0cENsaWVudC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0h0dHBDbGllbnQucG0KQEAgLTE3LDI2ICsxNywyNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCit1c2UgSFRUUDo6UmVxdWVzdDsKK3VzZSBJTzo6U3RyaW5nOwordXNlIExXUDo6VXNlckFnZW50OwogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIHVzZSBUaHJpZnQ6OlRyYW5zcG9ydDsKIAotdXNlIEhUVFA6OlJlcXVlc3Q7Ci11c2UgTFdQOjpVc2VyQWdlbnQ7Ci11c2UgSU86OlN0cmluZzsKLQogcGFja2FnZSBUaHJpZnQ6Okh0dHBDbGllbnQ7Ci0KIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwogICAgIG15ICR1cmwgICAgICAgPSBzaGlmdCB8fCAnaHR0cDovL2xvY2FsaG9zdDo5MDkwJzsKLSAgICBteSAkZGVidWdIYW5kbGVyID0gc2hpZnQ7CiAKICAgICBteSAkb3V0ID0gSU86OlN0cmluZy0+bmV3OwogICAgIGJpbm1vZGUoJG91dCk7CkBAIC00NCw0NCArNDMsNDQgQEAKICAgICBteSAkc2VsZiA9IHsKICAgICAgICAgdXJsICAgICAgICAgID0+ICR1cmwsCiAgICAgICAgIG91dCAgICAgICAgICA9PiAkb3V0LAotICAgICAgICBkZWJ1Z0hhbmRsZXIgPT4gJGRlYnVnSGFuZGxlciwKLSAgICAgICAgZGVidWcgICAgICAgID0+IDAsCi0gICAgICAgIHNlbmRUaW1lb3V0ICA9PiAxMDAsCi0gICAgICAgIHJlY3ZUaW1lb3V0ICA9PiA3NTAsCisgICAgICAgIHRpbWVvdXQgICAgICA9PiAxMDAsCiAgICAgICAgIGhhbmRsZSAgICAgICA9PiB1bmRlZiwKKyAgICAgICAgaGVhZGVycyAgICAgID0+IHt9LAogICAgIH07CiAKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CiB9CiAKK3N1YiBzZXRUaW1lb3V0Cit7CisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKyAgICBteSAkdGltZW91dCA9IHNoaWZ0OworCisgICAgJHNlbGYtPnt0aW1lb3V0fSA9ICR0aW1lb3V0OworfQorCitzdWIgc2V0UmVjdlRpbWVvdXQKK3sKKyAgICB3YXJuICdzZXRSZWN2VGltZW91dCBpcyBkZXByZWNhdGVkIC0gdXNlIHNldFRpbWVvdXQgaW5zdGVhZCc7CisgICAgIyBub3RlOiByZWN2VGltZW91dCB3YXMgbmV2ZXIgdXNlZCBzbyB3ZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlCit9CisKIHN1YiBzZXRTZW5kVGltZW91dAogewogICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CiAgICAgbXkgJHRpbWVvdXQgPSBzaGlmdDsKIAotICAgICRzZWxmLT57c2VuZFRpbWVvdXR9ID0gJHRpbWVvdXQ7CisgICAgd2FybiAnc2V0U2VuZFRpbWVvdXQgaXMgZGVwcmVjYXRlZCAtIHVzZSBzZXRUaW1lb3V0IGluc3RlYWQnOworCisgICAgJHNlbGYtPnNldFRpbWVvdXQoJHRpbWVvdXQpOwogfQogCi1zdWIgc2V0UmVjdlRpbWVvdXQKK3N1YiBzZXRIZWFkZXIKIHsKLSAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwotICAgIG15ICR0aW1lb3V0ID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJG5hbWUsICR2YWx1ZSkgPSBAXzsKIAotICAgICRzZWxmLT57cmVjdlRpbWVvdXR9ID0gJHRpbWVvdXQ7Ci19Ci0KLQotIwotI1NldHMgZGVidWdnaW5nIG91dHB1dCBvbiBvciBvZmYKLSMKLSMgQHBhcmFtIGJvb2wgJGRlYnVnCi0jCi1zdWIgc2V0RGVidWcKLXsKLSAgICBteSAkc2VsZiAgPSBzaGlmdDsKLSAgICBteSAkZGVidWcgPSBzaGlmdDsKLQotICAgICRzZWxmLT57ZGVidWd9ID0gJGRlYnVnOworICAgICRzZWxmLT57aGVhZGVyc30tPnskbmFtZX0gPSAkdmFsdWU7CiB9CiAKICMKQEAgLTEwMyw4ICsxMDIsOCBAQAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgaWYgKGRlZmluZWQoJHNlbGYtPntpb30pKSB7Ci0gICAgICBjbG9zZSgkc2VsZi0+e2lvfSk7Ci0gICAgICAkc2VsZi0+e2lvfSA9IHVuZGVmOworICAgICAgICBjbG9zZSgkc2VsZi0+e2lvfSk7CisgICAgICAgICRzZWxmLT57aW99ID0gdW5kZWY7CiAgICAgfQogfQogCkBAIC0xMjIsNyArMTIxLDggQEAKICAgICBteSAkYnVmID0gJHNlbGYtPnJlYWQoJGxlbik7CiAKICAgICBpZiAoIWRlZmluZWQoJGJ1ZikpIHsKLSAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tIGlucHV0IGJ1ZmZlcicpOworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoIlRTb2NrZXQ6IENvdWxkIG5vdCByZWFkICRsZW4gYnl0ZXMgZnJvbSBpbnB1dCBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAgICAgfQogICAgIHJldHVybiAkYnVmOwogfQpAQCAtMTQwLDE1ICsxNDAsMTggQEAKICAgICBteSAkaW4gPSAkc2VsZi0+e2lufTsKIAogICAgIGlmICghZGVmaW5lZCgkaW4pKSB7Ci0gICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigiUmVzcG9uc2UgYnVmZmVyIGlzIGVtcHR5LCBubyByZXF1ZXN0LiIpOworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJ1Jlc3BvbnNlIGJ1ZmZlciBpcyBlbXB0eSwgbm8gcmVxdWVzdC4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAgICAgfQogICAgIGV2YWwgewotICAgICAgbXkgJHJldCA9IHN5c3JlYWQoJGluLCAkYnVmLCAkbGVuKTsKLSAgICAgIGlmICghIGRlZmluZWQoJHJldCkpIHsKLSAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUuIik7Ci0gICAgICB9Ci0gICAgfTsgaWYoJEApewotICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJEApOworICAgICAgICBteSAkcmV0ID0gc3lzcmVhZCgkaW4sICRidWYsICRsZW4pOworICAgICAgICBpZiAoISBkZWZpbmVkKCRyZXQpKSB7CisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJ05vIG1vcmUgZGF0YSBhdmFpbGFibGUuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpOworICAgICAgICB9CisgICAgfTsKKyAgICBpZigkQCl7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygiJEAiLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwogICAgIH0KIAogICAgIHJldHVybiAkYnVmOwpAQCAtMTcxLDggKzE3NCw5IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAotICAgIG15ICR1YSA9IExXUDo6VXNlckFnZW50LT5uZXcoJ3RpbWVvdXQnID0+ICgkc2VsZi0+e3NlbmRUaW1lb3V0fSAvIDEwMDApLAotICAgICAgJ2FnZW50JyA9PiAnUGVybC9USHR0cENsaWVudCcKKyAgICBteSAkdWEgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KAorICAgICAgICAndGltZW91dCcgPT4gKCRzZWxmLT57dGltZW91dH0gLyAxMDAwKSwKKyAgICAgICAgJ2FnZW50JyAgID0+ICdQZXJsL1RIdHRwQ2xpZW50JwogICAgICApOwogICAgICR1YS0+ZGVmYXVsdF9oZWFkZXIoJ0FjY2VwdCcgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CiAgICAgJHVhLT5kZWZhdWx0X2hlYWRlcignQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnKTsKQEAgLTE4Miw3ICsxODYsNyBAQAogICAgICRvdXQtPnNldHBvcygwKTsgIyByZXdpbmQKICAgICBteSAkYnVmID0gam9pbignJywgPCRvdXQ+KTsKIAotICAgIG15ICRyZXF1ZXN0ID0gbmV3IEhUVFA6OlJlcXVlc3QoUE9TVCA9PiAkc2VsZi0+e3VybH0sIHVuZGVmLCAkYnVmKTsKKyAgICBteSAkcmVxdWVzdCA9IEhUVFA6OlJlcXVlc3QtPm5ldyhQT1NUID0+ICRzZWxmLT57dXJsfSwgKCRzZWxmLT57aGVhZGVyc30gfHwgdW5kZWYpLCAkYnVmKTsKICAgICBteSAkcmVzcG9uc2UgPSAkdWEtPnJlcXVlc3QoJHJlcXVlc3QpOwogICAgIG15ICRjb250ZW50X3JlZiA9ICRyZXNwb25zZS0+Y29udGVudF9yZWY7CiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9NZW1vcnlCdWZmZXIucG0KaW5kZXggMGIyODY4Ny4uYmU5N2NlNCAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9NZW1vcnlCdWZmZXIucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NZW1vcnlCdWZmZXIucG0KQEAgLTE3LDcgKzE3LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIApAQCAtMjYsNiArMjYsNyBAQAogCiBwYWNrYWdlIFRocmlmdDo6TWVtb3J5QnVmZmVyOwogdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTM0LDEwICszNSwxMCBAQAogICAgIG15ICRidWZmZXJTaXplPSBzaGlmdCB8fCAxMDI0OwogCiAgICAgbXkgJHNlbGYgPSB7Ci0gICAgICAgIGJ1ZmZlciAgICA9PiAnJywKLSAgICAgICAgYnVmZmVyU2l6ZT0+ICRidWZmZXJTaXplLAotICAgICAgICB3UG9zICAgICAgPT4gMCwKLSAgICAgICAgclBvcyAgICAgID0+IDAsCisgICAgICAgIGJ1ZmZlciAgICAgPT4gJycsCisgICAgICAgIGJ1ZmZlclNpemUgPT4gJGJ1ZmZlclNpemUsCisgICAgICAgIHdQb3MgICAgICAgPT4gMCwKKyAgICAgICAgclBvcyAgICAgICA9PiAwLAogICAgIH07CiAKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CkBAIC0xMTYsNyArMTE3LDggQEAKIAogICAgIG15ICRhdmFpbCA9ICgkc2VsZi0+e3dQb3N9IC0gJHNlbGYtPntyUG9zfSk7CiAgICAgaWYgKCRhdmFpbCA8ICRsZW4pIHsKLSAgICAgICAgZGllIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJBdHRlbXB0IHRvIHJlYWRBbGwoJGxlbikgZm91bmQgb25seSAkYXZhaWwgYXZhaWxhYmxlIik7CisgICAgICAgIGRpZSBUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoIkF0dGVtcHQgdG8gcmVhZEFsbCgkbGVuKSBmb3VuZCBvbmx5ICRhdmFpbCBhdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAgICAgfQogCiAgICAgbXkgJGRhdGEgPSAnJzsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVzc2FnZVR5cGUucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L01lc3NhZ2VUeXBlLnBtCmluZGV4IGM4OTAyY2MuLmQyNWMyZjcgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVzc2FnZVR5cGUucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbQpAQCAtMTcsMTYgKzE3LDIxIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAotcGFja2FnZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwordXNlIFRocmlmdDsKIAotdXNlIHN0cmljdDsKKyMKKyMgTWVzc2FnZSB0eXBlcyBmb3IgUlBDCisjCitwYWNrYWdlIFRocmlmdDo6VE1lc3NhZ2VUeXBlOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCi11c2UgY29uc3RhbnQgQ0FMTCAJPT4gMTsKLXVzZSBjb25zdGFudCBSRVBMWQk9PiAyOwotdXNlIGNvbnN0YW50IEVYQ0VQVElPTgk9PiAzOwotdXNlIGNvbnN0YW50IE9ORVdBWSAJPT4gNDsKK3VzZSBjb25zdGFudCBDQUxMICAgICAgPT4gMTsKK3VzZSBjb25zdGFudCBSRVBMWSAgICAgPT4gMjsKK3VzZSBjb25zdGFudCBFWENFUFRJT04gPT4gMzsKK3VzZSBjb25zdGFudCBPTkVXQVkgICAgPT4gNDsKIAotMTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm9jZXNzb3IucG0KaW5kZXggNDIxYmY3My4uYWU5MjVkNyAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvY2Vzc29yLnBtCkBAIC0xNywxOSArMTcsMTkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwotdXNlIFRocmlmdDo6UHJvdG9jb2w7Ci11c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOwotdXNlIFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3I7CiB1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yOwogCiBwYWNrYWdlIFRocmlmdDo6U3RvcmVkTWVzc2FnZVByb3RvY29sOwogdXNlIGJhc2UgcXcoVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcik7Ci0KLXVzZSBzdHJpY3Q7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CiB9CiAKLXN1YiByZWFkTWVzc2FnZUJlZ2luIAorc3ViIHJlYWRNZXNzYWdlQmVnaW4KIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICRuYW1lID0gc2hpZnQ7CkBAIC01OSwyNyArNTksMzQgQEAKIH0KIAogcGFja2FnZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwotCi11c2Ugc3RyaWN0OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CiAgICAgbXkgJHNlbGYgICAgICA9IHt9OwotICAgIAorCiAgICAgJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfSA9IHt9OworICAgICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0gPSB1bmRlZjsKIAogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKIH0KIAorc3ViIGRlZmF1bHRQcm9jZXNzb3IgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHByb2Nlc3NvciA9IHNoaWZ0OworCisgICAgJHNlbGYtPntkZWZhdWx0UHJvY2Vzc29yfSA9ICRwcm9jZXNzb3I7Cit9CisKIHN1YiByZWdpc3RlclByb2Nlc3NvciB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAkc2VydmljZU5hbWUgPSBzaGlmdDsKICAgICBteSAkcHJvY2Vzc29yID0gc2hpZnQ7Ci0gIAorCiAgICAgICRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0tPnskc2VydmljZU5hbWV9ID0gJHByb2Nlc3NvcjsKIH0KIAotc3ViIHByb2Nlc3N7CitzdWIgcHJvY2VzcyB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAkaW5wdXQgPSBzaGlmdDsKICAgICBteSAkb3V0cHV0ID0gc2hpZnQ7CkBAIC05MiwzMCArOTksMzUgQEAKIAogICAgIG15ICgkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7CiAgICAgJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKFwkZm5hbWUsIFwkbXR5cGUsIFwkcnNlcWlkKTsKLSAgIAkKIAotICAgIGlmICgkbXR5cGUgbmUgVGhyaWZ0OjpNZXNzYWdlVHlwZTo6Q0FMTCAmJiAkbXR5cGUgbmUgVGhyaWZ0OjpNZXNzYWdlVHlwZTo6T05FV0FZKSB7Ci0gIAkgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oIlRoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8iKTsKKyAgICBpZiAoJG10eXBlIG5lIFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpDQUxMICYmICRtdHlwZSBuZSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6T05FV0FZKSB7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygnVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPycpOwogICAgIH0KLSAgCisKICAgICAjIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBhbmQgdGhlIG5ldyBNZXNzYWdlIG5hbWUuCiAgICAgaWYgKGluZGV4KCRmbmFtZSwgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IpID09IC0xKSB7Ci0gIAkgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiB7JGZuYW1lfS4gRGlkIHlvdSAiIC4KLSAgICAgICAgICAgICJmb3JnZXQgdG8gdXNlIGEgTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Iik7CisgICAgICAgIGlmIChkZWZpbmVkICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0pIHsKKyAgICAgICAgICAgIHJldHVybiAkc2VsZi0+e2RlZmF1bHRQcm9jZXNzb3J9LT5wcm9jZXNzKAorICAgICAgICAgICAgICAgIFRocmlmdDo6U3RvcmVkTWVzc2FnZVByb3RvY29sLT5uZXcoJGlucHV0LCAkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCksICRvdXRwdXQKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpURXhjZXB0aW9uLT5uZXcoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiB7JGZuYW1lfSBhbmQgbm8gZGVmYXVsdCBwcm9jZXNzb3IgZGVmaW5lZC4gRGlkIHlvdSAiIC4KKyAgICAgICAgICAgICAgICAnZm9yZ2V0IHRvIHVzZSBhIE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PycpOworICAgICAgICB9CiAgICAgfQotICAKKwogICAgIChteSAkc2VydmljZU5hbWUsIG15ICRtZXNzYWdlTmFtZSkgPSBzcGxpdCgnOicsICRmbmFtZSwgMik7Ci0gIAorCiAgICAgaWYgKCFleGlzdHMoJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfS0+eyRzZXJ2aWNlTmFtZX0pKSB7Ci0gIAkgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6IHskc2VydmljZU5hbWV9LiAgRGlkIHlvdSBmb3JnZXQgIiAuCi0gICAgICAgICAgICAidG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICBkaWUgVGhyaWZ0OjpURXhjZXB0aW9uLT5uZXcoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6IHskc2VydmljZU5hbWV9LiAgRGlkIHlvdSBmb3JnZXQgIiAuCisgICAgICAgICAgICAndG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPycpOwogICAgIH0KLSAgCi0gICAgICNEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCi0gICAgIG15ICRwcm9jZXNzb3IgPSAkc2VsZi0+e3NlcnZpY2VQcm9jZXNzb3JNYXB9LT57JHNlcnZpY2VOYW1lfTsKLSAgICAgcmV0dXJuICRwcm9jZXNzb3ItPnByb2Nlc3MoCi0gICAgICAgIG5ldyBUaHJpZnQ6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbCgkaW5wdXQsICRtZXNzYWdlTmFtZSwgJG10eXBlLCAkcnNlcWlkKSwgJG91dHB1dAotICAgICApOworCisgICAgIyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgICAgbXkgJHByb2Nlc3NvciA9ICRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0tPnskc2VydmljZU5hbWV9OworICAgIHJldHVybiAkcHJvY2Vzc29yLT5wcm9jZXNzKAorICAgICAgICBUaHJpZnQ6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbC0+bmV3KCRpbnB1dCwgJG1lc3NhZ2VOYW1lLCAkbXR5cGUsICRyc2VxaWQpLCAkb3V0cHV0CisgICAgKTsKIH0KIAotMTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb3RvY29sLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb3RvY29sLnBtCmluZGV4IDgzYTRlYWYuLjViNWI2MGIgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm90b2NvbC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvdG9jb2wucG0KQEAgLTE3LDI2ICsxNywyNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKIHVzZSBUaHJpZnQ6OlByb3RvY29sOwogdXNlIFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3I7Ci11c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKIAogcGFja2FnZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w7CiB1c2UgYmFzZSBxdyhUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAotdXNlIHN0cmljdDsKLQotdXNlIGNvbnN0YW50IFNFUEFSQVRPUiAJPT4gJzonOwordXNlIGNvbnN0YW50IFNFUEFSQVRPUiAgPT4gJzonOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CiAgICAgbXkgJHByb3RvY29sICA9IHNoaWZ0OwogICAgIG15ICRzZXJ2aWNlTmFtZSAgPSBzaGlmdDsKICAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkcHJvdG9jb2wpOwotICAgIAorCiAgICAgJHNlbGYtPntzZXJ2aWNlTmFtZX0gPSAkc2VydmljZU5hbWU7CiAKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CkBAIC01MCwxOCArNTEsMTggQEAKICMgQHBhcmFtIGludCAgICAkdHlwZSAgTWVzc2FnZSB0eXBlLgogIyBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlLgogIwotc3ViIHdyaXRlTWVzc2FnZUJlZ2luIAorc3ViIHdyaXRlTWVzc2FnZUJlZ2luCiB7Ci0JbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICgkbmFtZSwgJHR5cGUsICRzZXFpZCkgPSBAXzsKIAotICAgIGlmICgkdHlwZSA9PSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOjpDQUxMIHx8ICR0eXBlID09IFRocmlmdDo6TWVzc2FnZVR5cGU6Ok9ORVdBWSkgeworICAgIGlmICgkdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6Q0FMTCB8fCAkdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6T05FV0FZKSB7CiAgICAgICAgIG15ICRuYW1lV2l0aFNlcnZpY2UgPSAkc2VsZi0+e3NlcnZpY2VOYW1lfS5TRVBBUkFUT1IuJG5hbWU7CiAgICAgICAgICRzZWxmLT5TVVBFUjo6d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWVXaXRoU2VydmljZSwgJHR5cGUsICRzZXFpZCk7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICAkc2VsZi0+U1VQRVI6OndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsJCisgICAgICAgICRzZWxmLT5TVVBFUjo6d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOwogICAgIH0KIH0KIAotMTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2wucG0KaW5kZXggM2U5ZjBkZC4uMjZlZjQ2YSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sLnBtCkBAIC0xNywyNiArMTcsMjggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKK3VzZSBUaHJpZnQ6OlR5cGU7CiAKICMKICMgUHJvdG9jb2wgZXhjZXB0aW9ucwogIwotcGFja2FnZSBUUHJvdG9jb2xFeGNlcHRpb247CitwYWNrYWdlIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOwogdXNlIGJhc2UoJ1RocmlmdDo6VEV4Y2VwdGlvbicpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCi11c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICA9PiAwOwotdXNlIGNvbnN0YW50IElOVkFMSURfREFUQSAgPT4gMTsKLXVzZSBjb25zdGFudCBORUdBVElWRV9TSVpFID0+IDI7Ci11c2UgY29uc3RhbnQgU0laRV9MSU1JVCAgICA9PiAzOwotdXNlIGNvbnN0YW50IEJBRF9WRVJTSU9OICAgPT4gNDsKK3VzZSBjb25zdGFudCBVTktOT1dOICAgICAgICAgPT4gMDsKK3VzZSBjb25zdGFudCBJTlZBTElEX0RBVEEgICAgPT4gMTsKK3VzZSBjb25zdGFudCBORUdBVElWRV9TSVpFICAgPT4gMjsKK3VzZSBjb25zdGFudCBTSVpFX0xJTUlUICAgICAgPT4gMzsKK3VzZSBjb25zdGFudCBCQURfVkVSU0lPTiAgICAgPT4gNDsKIHVzZSBjb25zdGFudCBOT1RfSU1QTEVNRU5URUQgPT4gNTsKLXVzZSBjb25zdGFudCBERVBUSF9MSU1JVCAgID0+IDY7Ci0KK3VzZSBjb25zdGFudCBERVBUSF9MSU1JVCAgICAgPT4gNjsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtNTAsNiArNTIsNyBAQAogIyBQcm90b2NvbCBiYXNlIGNsYXNzIG1vZHVsZS4KICMKIHBhY2thZ2UgVGhyaWZ0OjpQcm90b2NvbDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtNzgsMzcgKzgxLDM3IEBACiBzdWIgd3JpdGVNZXNzYWdlQmVnaW4KIHsKICAgICBteSAoJG5hbWUsICR0eXBlLCAkc2VxaWQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCiAjIENsb3NlIHRoZSBtZXNzYWdlCiAjCiBzdWIgd3JpdGVNZXNzYWdlRW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwogIyBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgogIwogIyBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQotIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHRocm93cyBUUHJvdG9jb2xFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKICMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgogIwogc3ViIHdyaXRlU3RydWN0QmVnaW4gewogICAgIG15ICgkbmFtZSk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwogIyBDbG9zZSBhIHN0cnVjdC4KICMKLSMgQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisjIEB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCiAjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KICMKIHN1YiB3cml0ZVN0cnVjdEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTExNyw4NSArMTIwLDg1IEBACiAjIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIEZpZWxkIG5hbWUKICMgQHBhcmFtIGludCAgICAgICAgJHR5cGUgRmllbGQgdHlwZQogIyBAcGFyYW0gaW50ICAgICAgICAkZmlkICBGaWVsZCBpZAotIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHRocm93cyBUUHJvdG9jb2xFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKICMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgogIwogc3ViIHdyaXRlRmllbGRCZWdpbiB7CiAgICAgbXkgKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKIAotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVGaWVsZEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUZpZWxkU3RvcCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZU1hcEJlZ2luIHsKICAgICBteSAoJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlTWFwRW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlTGlzdEJlZ2luIHsKICAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUxpc3RFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVTZXRCZWdpbiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVTZXRFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVCb29sIHsKICAgICBteSAoJGJvb2wpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVCeXRlIHsKICAgICBteSAoJGJ5dGUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVJMTYgewogICAgIG15ICgkaTE2KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlSTMyIHsKICAgICBteSAoJGkzMik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUk2NCB7CiAgICAgbXkgKCRpNjQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVEb3VibGUgewogICAgIG15ICgkZHViKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlU3RyaW5nCiB7CiAgICAgbXkgKCRzdHIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0yMDgsNyArMjExLDcgQEAKIHN1YiByZWFkTWVzc2FnZUJlZ2luCiB7CiAgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMjE2LDEwNSArMjE5LDEwNSBAQAogIwogc3ViIHJlYWRNZXNzYWdlRW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU3RydWN0QmVnaW4KIHsKICAgICBteSgkbmFtZSk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTdHJ1Y3RFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRGaWVsZEJlZ2luCiB7CiAgICAgbXkgKCRuYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkRmllbGRFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRNYXBCZWdpbgogewogICAgIG15ICgka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRNYXBFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRMaXN0QmVnaW4KIHsKICAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkTGlzdEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFNldEJlZ2luCiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFNldEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEJvb2wKIHsKICAgICBteSAoJGJvb2wpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEJ5dGUKIHsKICAgICBteSAoJGJ5dGUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEkxNgogewogICAgIG15ICgkaTE2KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRJMzIKIHsKICAgICBteSAoJGkzMik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkSTY0CiB7CiAgICAgbXkgKCRpNjQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZERvdWJsZQogewogICAgIG15ICgkZHViKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTdHJpbmcKIHsKICAgICBteSAoJHN0cik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTMzMiwzNiArMzM1LDM2IEBACiAgICAgbXkgJHJlc3VsdDsKICAgICBteSAkaTsKIAotICAgIGlmKCR0eXBlID09IFRUeXBlOjpCT09MKQorICAgIGlmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJPT0wpCiAgICAgewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRCb29sKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkJZVEUpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJZVEUpewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRCeXRlKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkkxNil7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STE2KXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkSTE2KFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkkzMil7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STMyKXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkSTMyKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6Okk2NCl7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STY0KXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkSTY0KFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkRPVUJMRSl7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6RE9VQkxFKXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkRG91YmxlKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNUUklORykKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJJTkcpCiAgICAgewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRTdHJpbmcoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6U1RSVUNUKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUlVDVCkKICAgICB7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZFN0cnVjdEJlZ2luKFwkcmVmKTsKICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgIG15ICgkZnR5cGUsJGZpZCk7CiAgICAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkRmllbGRCZWdpbihcJHJlZiwgXCRmdHlwZSwgXCRmaWQpOwotICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CiAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnNraXAoJGZ0eXBlKTsKQEAgLTM3MCw3ICszNzMsNyBAQAogICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkU3RydWN0RW5kKCk7CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6TUFQKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6Ok1BUCkKICAgICB7CiAgICAgICAgIG15KCRrZXlUeXBlLCR2YWxUeXBlLCRzaXplKTsKICAgICAgICAgJHJlc3VsdCA9ICRzZWxmLT5yZWFkTWFwQmVnaW4oXCRrZXlUeXBlLCBcJHZhbFR5cGUsIFwkc2l6ZSk7CkBAIC0zODEsNyArMzg0LDcgQEAKICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+cmVhZE1hcEVuZCgpOwogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNFVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTRVQpCiAgICAgewogICAgICAgICBteSAoJGVsZW1UeXBlLCRzaXplKTsKICAgICAgICAgJHJlc3VsdCA9ICRzZWxmLT5yZWFkU2V0QmVnaW4oXCRlbGVtVHlwZSwgXCRzaXplKTsKQEAgLTM5MSw3ICszOTQsNyBAQAogICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkU2V0RW5kKCk7CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6TElTVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpMSVNUKQogICAgIHsKICAgICAgICAgbXkgKCRlbGVtVHlwZSwkc2l6ZSk7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZExpc3RCZWdpbihcJGVsZW1UeXBlLCBcJHNpemUpOwpAQCAtNDAyLDcgKzQwNSw4IEBACiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KIAotICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJUeXBlICR0eXBlIG5vdCByZWNvZ25pc2VkIC0tLSBjb3JydXB0IGRhdGE/Iik7CisgICAgZGllIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uLT5uZXcoIlR5cGUgJHR5cGUgbm90IHJlY29nbml6ZWQgLS0tIGNvcnJ1cHQgZGF0YT8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CiAKICAgfQogCkBAIC00MTgsMzEgKzQyMiwzMSBAQAogICAgIG15ICRpdHJhbnMgPSBzaGlmdDsKICAgICBteSAkdHlwZSAgID0gc2hpZnQ7CiAKLSAgICBpZigkdHlwZSA9PSBUVHlwZTo6Qk9PTCkKLSAgICB7Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkJZVEUpCisgICAgaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6Qk9PTCkKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STE2KQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJZVEUpCisgICAgeworICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICB9CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STE2KQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJMzIpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STMyKQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoNCk7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJNjQpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STY0KQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpET1VCTEUpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6RE9VQkxFKQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CiAgICAgfQotICAgIGVsc2lmKCAkdHlwZSA9PSBUVHlwZTo6U1RSSU5HICkKKyAgICBlbHNpZiggJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSSU5HICkKICAgICB7CiAgICAgICAgIG15IEBsZW4gPSB1bnBhY2soJ04nLCAkaXRyYW5zLT5yZWFkQWxsKDQpKTsKICAgICAgICAgbXkgJGxlbiA9ICRsZW5bMF07CkBAIC00NTEsMjUgKzQ1NSwyNSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiA0ICsgJGl0cmFucy0+cmVhZEFsbCgkbGVuKTsKICAgICB9Ci0gICAgZWxzaWYoICR0eXBlID09IFRUeXBlOjpTVFJVQ1QgKQorICAgIGVsc2lmKCAkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QgKQogICAgIHsKICAgICAgICAgbXkgJHJlc3VsdCA9IDA7CiAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgbXkgJGZ0eXBlID0gMDsKLSAgICAgICAgICBteSAkZmlkID0gMDsKLSAgICAgICAgICBteSAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgICAgICAgbXkgQGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAgICAgICAkZnR5cGUgPSAkYXJyWzBdOwotICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICAgICAgIGxhc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgICMgSTE2IGZpZWxkIGlkCi0gICAgICAgICAgJHJlc3VsdCArPSAkaXRyYW5zLT5yZWFkQWxsKDIpOwotICAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnNraXBCaW5hcnkoJGl0cmFucywgJGZ0eXBlKTsKKyAgICAgICAgICAgIG15ICRmdHlwZSA9IDA7CisgICAgICAgICAgICBteSAkZmlkID0gMDsKKyAgICAgICAgICAgIG15ICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgIG15IEBhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAkZnR5cGUgPSAkYXJyWzBdOworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICMgSTE2IGZpZWxkIGlkCisgICAgICAgICAgICAkcmVzdWx0ICs9ICRpdHJhbnMtPnJlYWRBbGwoMik7CisgICAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5za2lwQmluYXJ5KCRpdHJhbnMsICRmdHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpNQVApCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6TUFQKQogICAgIHsKICAgICAgICAgIyBLdHlwZQogICAgICAgICBteSAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CkBAIC00OTMsNyArNDk3LDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNFVCB8fCAkdHlwZSA9PSBUVHlwZTo6TElTVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTRVQgfHwgJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6TElTVCkKICAgICB7CiAgICAgICAgICMgVnR5cGUKICAgICAgICAgbXkgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwpAQCAtNTEzLDE0ICs1MTcsMTUgQEAKICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQogCi0gICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oIlR5cGUgJHR5cGUgbm90IHJlY29nbmlzZWQgLS0tIGNvcnJ1cHQgZGF0YT8iKTsKKyAgICBkaWUgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24tPm5ldygiVHlwZSAkdHlwZSBub3QgcmVjb2duaXplZCAtLS0gY29ycnVwdCBkYXRhPyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKIH0KIAogIwogIyBQcm90b2NvbCBmYWN0b3J5IGNyZWF0ZXMgcHJvdG9jb2wgb2JqZWN0cyBmcm9tIHRyYW5zcG9ydHMKICMKLXBhY2thZ2UgVFByb3RvY29sRmFjdG9yeTsKLQorcGFja2FnZSBUaHJpZnQ6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTUzNyw3ICs1NDIsNyBAQAogc3ViIGdldFByb3RvY29sCiB7CiAgICAgbXkgKCR0cmFucyk7Ci0gICAgZGllICJpbnRlcmZhY2UiOworICAgIGRpZSAnaW50ZXJmYWNlJzsKIH0KIAogCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sRGVjb3JhdG9yLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbERlY29yYXRvci5wbQppbmRleCA4MTIwMjAwLi5jYzVjOWRhIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sRGVjb3JhdG9yLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2xEZWNvcmF0b3IucG0KQEAgLTE3LDE5ICsxNywyMiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKK3VzZSBUaHJpZnQ7CiB1c2UgVGhyaWZ0OjpQcm90b2NvbDsKIAogcGFja2FnZSBUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yOwogdXNlIGJhc2UgcXcoVGhyaWZ0OjpQcm90b2NvbCk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKICAgICBteSAkcHJvdG9jb2wgID0gc2hpZnQ7CiAgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoJHByb3RvY29sLT5nZXRUcmFuc3BvcnQoKSk7Ci0gICAgCisKICAgICAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9ID0gJHByb3RvY29sOwogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwpAQCAtNDUsNyArNDgsNyBAQAogc3ViIHdyaXRlTWVzc2FnZUJlZ2luIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICgkbmFtZSwgJHR5cGUsICRzZXFpZCkgPSBAXzsKLSAgICAgCisKICAgICAgIHJldHVybiAgJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOwogfQogCkBAIC01NCw3ICs1Nyw3IEBACiAjCiBzdWIgd3JpdGVNZXNzYWdlRW5kIHsKICAgICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgICAgCisKICAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTWVzc2FnZUVuZCgpOwogfQogCkBAIC03OSw3ICs4Miw3IEBACiAjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KICMKIHN1YiB3cml0ZVN0cnVjdEVuZCB7Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsgICAgCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAogICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZVN0cnVjdEVuZCgpOwogfQpAQCAtMTAxLDEzICsxMDQsMTMgQEAKIH0KIAogc3ViIHdyaXRlRmllbGRFbmQgewotICAgIG15ICRzZWxmID0gc2hpZnQ7ICAgIAorICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVGaWVsZEVuZCgpOwogfQogCiBzdWIgd3JpdGVGaWVsZFN0b3AgewotICAgIG15ICRzZWxmID0gc2hpZnQ7ICAgIAorICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVGaWVsZFN0b3AoKTsKIH0KQEAgLTEyMSw3ICsxMjQsNyBAQAogCiBzdWIgd3JpdGVNYXBFbmQgewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgCisKICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVNYXBFbmQoKTsKIH0KIApAQCAtMTM0LDcgKzEzNyw3IEBACiAKIHN1YiB3cml0ZUxpc3RFbmQgewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgCisKICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVMaXN0RW5kKCk7CiB9CiAKQEAgLTE0Nyw3ICsxNTAsNyBAQAogCiBzdWIgd3JpdGVTZXRFbmQgewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgCisKICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVMaXN0RW5kKCk7CiB9CiAKQEAgLTE3Nyw3ICsxODAsNyBAQAogICAgIG15ICgkaTMyKSA9IEBfOwogCiAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlSTMyKCRpMzIpOwotIAorCiB9CiAKIHN1YiB3cml0ZUk2NCB7CkBAIC0yMjEsNyArMjI0LDcgQEAKICMKIHN1YiByZWFkTWVzc2FnZUVuZAogewotICAgIG15ICRzZWxmID0gc2hpZnQ7ICAgIAorICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZE1lc3NhZ2VFbmQoKTsKIH0KQEAgLTIzNiw3ICsyMzksNyBAQAogCiBzdWIgcmVhZFN0cnVjdEVuZAogewotICAgIG15ICRzZWxmID0gc2hpZnQ7ICAgIAorICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFN0cnVjdEVuZCgpOwogfQpAQCAtMjUxLDcgKzI1NCw3IEBACiAKIHN1YiByZWFkRmllbGRFbmQKIHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OyAgICAKKyAgICBteSAkc2VsZiA9IHNoaWZ0OwogCiAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRGaWVsZEVuZCgpOwogfQpAQCAtMjY2LDcgKzI2OSw3IEBACiAKIHN1YiByZWFkTWFwRW5kCiB7Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsgICAgCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAogICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkTWFwRW5kKCk7CiB9CkBAIC0yODEsNyArMjg0LDcgQEAKIAogc3ViIHJlYWRMaXN0RW5kCiB7Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsgICAgCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAogICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkTGlzdEVuZCgpOwogfQpAQCAtMjk2LDcgKzI5OSw3IEBACiAKIHN1YiByZWFkU2V0RW5kCiB7Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsgICAgCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAogICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkU2V0RW5kKCk7CiB9CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNlcnZlclNvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtCmluZGV4IDJlZmRmZmYuLjdiMDY0MzEgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtCkBAIC0xNywyNCArMTcsMjQgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKIHVzZSBUaHJpZnQ6OlNTTFNvY2tldDsKK3VzZSBUaHJpZnQ6OlNlcnZlclNvY2tldDsKIAogdXNlIElPOjpTb2NrZXQ6OlNTTDsKLXVzZSBJTzo6U2VsZWN0OwogCiBwYWNrYWdlIFRocmlmdDo6U1NMU2VydmVyU29ja2V0OwotCiB1c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogIwogIyBDb25zdHJ1Y3Rvci4KICMgVGFrZXMgYSBoYXNoOgotIyBTZWUgVGhpcmZ0OjpTb2NrZXQgZm9yIGJhc2UgY2xhc3MgcGFyYW1ldGVycy4KKyMgU2VlIFRocmlmdDo6U29ja2V0IGZvciBiYXNlIGNsYXNzIHBhcmFtZXRlcnMuCiAjIEBwYXJhbVtpbl0gIGNhICAgICBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgZmlsZW5hbWUgLSBub3QgcmVxdWlyZWQKICMgQHBhcmFtW2luXSAgY2VydCAgIGNlcnRpZmljYXRlIGZpbGVuYW1lOyBtYXkgY29udGFpbiBrZXkgaW4gd2hpY2ggY2FzZSBrZXkgaXMgbm90IHJlcXVpcmVkCiAjIEBwYXJhbVtpbl0gIGtleSAgICBwcml2YXRlIGtleSBmaWxlbmFtZSBmb3IgdGhlIGNlcnRpZmljYXRlIGlmIGl0IGlzIG5vdCBpbnNpZGUgdGhlIGNlcnQgZmlsZQpAQCAtNDgsMjEgKzQ4LDI5IEBACiAKIHN1YiBfX2NsaWVudAogewotCXJldHVybiBuZXcgVGhyaWZ0OjpTU0xTb2NrZXQoKTsKKyAgcmV0dXJuIFRocmlmdDo6U1NMU29ja2V0LT5uZXcoKTsKIH0KIAogc3ViIF9fbGlzdGVuCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgICByZXR1cm4gSU86OlNvY2tldDo6U1NMLT5uZXcoTG9jYWxBZGRyICAgICA9PiAkc2VsZi0+e2hvc3R9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbFBvcnQgICAgID0+ICRzZWxmLT57cG9ydH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvICAgICAgICAgPT4gJ3RjcCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RlbiAgICAgICAgPT4gJHNlbGYtPntxdWV1ZX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldXNlQWRkciAgICAgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX2NlcnRfZmlsZSA9PiAkc2VsZi0+e2NlcnR9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfa2V5X2ZpbGUgID0+ICRzZWxmLT57a2V5fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX2NhX2ZpbGUgICA9PiAkc2VsZi0+e2NhfSk7Ci19CisgICAgbXkgJG9wdHMgPSB7TGlzdGVuICAgICAgICA9PiAkc2VsZi0+e3F1ZXVlfSwKKyAgICAgICAgICAgICAgICBMb2NhbEFkZHIgICAgID0+ICRzZWxmLT57aG9zdH0sCisgICAgICAgICAgICAgICAgTG9jYWxQb3J0ICAgICA9PiAkc2VsZi0+e3BvcnR9LAorICAgICAgICAgICAgICAgIFByb3RvICAgICAgICAgPT4gJ3RjcCcsCisgICAgICAgICAgICAgICAgUmV1c2VBZGRyICAgICA9PiAxfTsKIAorICAgIG15ICR2ZXJpZnkgPSBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfUEVFUiB8IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCB8IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9DTElFTlRfT05DRTsKKworICAgICRvcHRzLT57U1NMX2NhX2ZpbGV9ICAgICAgPSAkc2VsZi0+e2NhfSAgICAgIGlmIGRlZmluZWQgJHNlbGYtPntjYX07CisgICAgJG9wdHMtPntTU0xfY2VydF9maWxlfSAgICA9ICRzZWxmLT57Y2VydH0gICAgaWYgZGVmaW5lZCAkc2VsZi0+e2NlcnR9OworICAgICRvcHRzLT57U1NMX2NpcGhlcl9saXN0fSAgPSAkc2VsZi0+e2NpcGhlcnN9IGlmIGRlZmluZWQgJHNlbGYtPntjaXBoZXJzfTsKKyAgICAkb3B0cy0+e1NTTF9rZXlfZmlsZX0gICAgID0gJHNlbGYtPntrZXl9ICAgICBpZiBkZWZpbmVkICRzZWxmLT57a2V5fTsKKyAgICAkb3B0cy0+e1NTTF91c2VfY2VydH0gICAgID0gKGRlZmluZWQgJHNlbGYtPntjZXJ0fSkgPyAxIDogMDsKKyAgICAkb3B0cy0+e1NTTF92ZXJpZnlfbW9kZX0gID0gKGRlZmluZWQgJHNlbGYtPntjYX0pID8gJHZlcmlmeSA6IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9OT05FOworICAgICRvcHRzLT57U1NMX3ZlcnNpb259ICAgICAgPSAoZGVmaW5lZCAkc2VsZi0+e3ZlcnNpb259KSA/ICRzZWxmLT57dmVyc2lvbn0gOiAnU1NMdjIzOiFTU0x2MzohU1NMdjInOworCisgICAgcmV0dXJuIElPOjpTb2NrZXQ6OlNTTC0+bmV3KCUkb3B0cyk7Cit9CiAKIDE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU29ja2V0LnBtCmluZGV4IGI3MGQ0NmYuLmUzNDkyNGQgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU29ja2V0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU29ja2V0LnBtCkBAIC0xNywyMSArMTcsNDIgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKLXVzZSBUaHJpZnQ6OlRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6OlNvY2tldDsKIAogdXNlIElPOjpTb2NrZXQ6OlNTTDsKLXVzZSBJTzo6U2VsZWN0OwogCiBwYWNrYWdlIFRocmlmdDo6U1NMU29ja2V0OwotCi0jIFRPRE86IERvZXMgbm90IHByb3ZpZGUgY2lwaGVyIHNlbGVjdGlvbiBvciBhdXRoZW50aWNhdGlvbiBob29rcyB5ZXQuCi0KIHVzZSBiYXNlIHF3KCBUaHJpZnQ6OlNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdGlvbiBhbmQgdXNhZ2UKKyMKKyMgbXkgJG9wdHMgPSB7fQorIyBteSAkc29ja2V0ID0gVGhyaWZ0OjpTU0xTb2NrZXQtPm5ldyhcJW9wdHMpOworIworIyBvcHRpb25zOgorIworIyBBbnkgb3B0aW9uIGZyb20gU29ja2V0LnBtIGlzIHZhbGlkLCBhbmQgdGhlbjoKKyMKKyMgY2EgICAgICAgICAgPT4gY2VydGlmaWNhdGUgYXV0aG9yaXR5IGZpbGUgKFBFTSBmaWxlKSB0byBhdXRoZW50aWNhdGUgdGhlCisjICAgICAgICAgICAgICAgIHNlcnZlciBhZ2FpbnN0OyBpZiBub3Qgc3BlY2lmaWVkIHRoZW4gdGhlIHNlcnZlciBpcyBub3QKKyMgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZAorIyBjZXJ0ICAgICAgICA9PiBjZXJ0aWZpY2F0ZSB0byB1c2UgYXMgdGhlIGNsaWVudDsgaWYgbm90IHNwZWNpZmllZCB0aGVuCisjICAgICAgICAgICAgICAgIHRoZSBjbGllbnQgZG9lcyBub3QgcHJlc2VudCBvbmUgYnV0IHN0aWxsIGNvbm5lY3RzIHVzaW5nCisjICAgICAgICAgICAgICAgIHNlY3VyZSBwcm90b2NvbAorIyBjaXBoZXJzICAgICA9PiBhbGxvd2VkIGNpcGhlciBsaXN0CisjICAgICAgICAgICAgICAgIChzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9kb2NzL2FwcHMvY2lwaGVycy5odG1sI0NJUEhFUl9TVFJJTkdTKQorIyBrZXkgICAgICAgICA9PiBjZXJ0aWZpY2F0ZSBrZXkgZm9yICJjZXJ0IiBvcHRpb24KKyMgdmVyc2lvbiAgICAgPT4gYWNjZXB0YWJsZSBTU0wvVExTIHZlcnNpb25zIC0gaWYgbm90IHNwZWNpZmllZCB0aGVuIHRoZQorIyAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIHRvIHVzZSBTU0x2MjMgaGFuZHNoYWtlIGJ1dCBvbmx5IG5lZ290aWF0ZQorIyAgICAgICAgICAgICAgICBhdCBUTFN2MS4wIG9yIGxhdGVyCisjCiAKIHN1YiBuZXcKIHsKQEAgLTQ0LDI3ICs2NSw0MyBAQAogc3ViIF9fb3BlbgogewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgcmV0dXJuIElPOjpTb2NrZXQ6OlNTTC0+bmV3KFBlZXJBZGRyID0+ICRzZWxmLT57aG9zdH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlZXJQb3J0ID0+ICRzZWxmLT57cG9ydH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvICAgID0+ICd0Y3AnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ICA9PiAkc2VsZi0+e3NlbmRUaW1lb3V0fSAvIDEwMDApOworICAgIG15ICRvcHRzID0ge1BlZXJBZGRyICAgICAgPT4gJHNlbGYtPntob3N0fSwKKyAgICAgICAgICAgICAgICBQZWVyUG9ydCAgICAgID0+ICRzZWxmLT57cG9ydH0sCisgICAgICAgICAgICAgICAgUHJvdG8gICAgICAgICA9PiAndGNwJywKKyAgICAgICAgICAgICAgICBUaW1lb3V0ICAgICAgID0+ICRzZWxmLT57c2VuZFRpbWVvdXR9IC8gMTAwMH07CisKKyAgICBteSAkdmVyaWZ5ID0gSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX1BFRVIgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfQ0xJRU5UX09OQ0U7CisKKyAgICAkb3B0cy0+e1NTTF9jYV9maWxlfSAgICAgID0gJHNlbGYtPntjYX0gICAgICBpZiBkZWZpbmVkICRzZWxmLT57Y2F9OworICAgICRvcHRzLT57U1NMX2NlcnRfZmlsZX0gICAgPSAkc2VsZi0+e2NlcnR9ICAgIGlmIGRlZmluZWQgJHNlbGYtPntjZXJ0fTsKKyAgICAkb3B0cy0+e1NTTF9jaXBoZXJfbGlzdH0gID0gJHNlbGYtPntjaXBoZXJzfSBpZiBkZWZpbmVkICRzZWxmLT57Y2lwaGVyc307CisgICAgJG9wdHMtPntTU0xfa2V5X2ZpbGV9ICAgICA9ICRzZWxmLT57a2V5fSAgICAgaWYgZGVmaW5lZCAkc2VsZi0+e2tleX07CisgICAgJG9wdHMtPntTU0xfdXNlX2NlcnR9ICAgICA9IChkZWZpbmVkICRzZWxmLT57Y2VydH0pID8gMSA6IDA7CisgICAgJG9wdHMtPntTU0xfdmVyaWZ5X21vZGV9ICA9IChkZWZpbmVkICRzZWxmLT57Y2F9KSA/ICR2ZXJpZnkgOiBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfTk9ORTsKKyAgICAkb3B0cy0+e1NTTF92ZXJzaW9ufSAgICAgID0gKGRlZmluZWQgJHNlbGYtPnt2ZXJzaW9ufSkgPyAkc2VsZi0+e3ZlcnNpb259IDogJ1NTTHYyMzohU1NMdjM6IVNTTHYyJzsKKworICAgIHJldHVybiBJTzo6U29ja2V0OjpTU0wtPm5ldyglJG9wdHMpOwogfQogCiBzdWIgX19jbG9zZQogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJHNvY2sgPSAoJHNlbGYtPntoYW5kbGV9LT5oYW5kbGVzKCkpWzBdOwotICAgICRzb2NrLT5jbG9zZShTU0xfbm9fc2h1dGRvd24gPT4gMSk7CisgICAgaWYgKCRzb2NrKSB7CisgICAgICAkc29jay0+Y2xvc2UoU1NMX25vX3NodXRkb3duID0+IDEpOworICAgIH0KIH0KIAogc3ViIF9fcmVjdgogewotCW15ICRzZWxmID0gc2hpZnQ7Ci0JbXkgJHNvY2sgPSBzaGlmdDsKLQlteSAkbGVuID0gc2hpZnQ7Ci0JbXkgJGJ1ZiA9IHVuZGVmOworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkc29jayA9IHNoaWZ0OworICBteSAkbGVuID0gc2hpZnQ7CisgIG15ICRidWYgPSB1bmRlZjsKKyAgaWYgKCRzb2NrKSB7CiAgICAgc3lzcmVhZCgkc29jaywgJGJ1ZiwgJGxlbik7Ci0gICAgcmV0dXJuICRidWY7CisgIH0KKyAgcmV0dXJuICRidWY7CiB9CiAKIHN1YiBfX3NlbmQKQEAgLTc5LDcgKzExNiw3IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAkc29jayA9ICgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF07Ci0gICAgaWYgKCRzb2NrLT5wZW5kaW5nKCkgZXEgMCkgeworICAgIGlmICgkc29jayBhbmQgJHNvY2stPnBlbmRpbmcoKSBlcSAwKSB7CiAgICAgICAgIHJldHVybiAkc2VsZi0+U1VQRVI6Ol9fd2FpdCgpOwogICAgIH0KICAgICByZXR1cm4gJHNvY2s7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtCmluZGV4IDk3ZTY2MjAuLjI4ODIyZTggMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtCkBAIC0xNywyNSArMTcsMzEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKLXVzZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OwogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIAogIwogIyBTZXJ2ZXIgYmFzZSBjbGFzcyBtb2R1bGUKICMKIHBhY2thZ2UgVGhyaWZ0OjpTZXJ2ZXI7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKKyMKICMgMyBwb3NzaWJsZSBjb25zdHJ1Y3RvcnM6CiAjICAgMS4gIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKKyMgICAgICAgVXNlcyBhIEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBhbmQgYSBCaW5hcnlQcm90b2NvbEZhY3RvcnkuCiAjICAgMi4gIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorIyAgICAgICBVc2VzIHRoZSBzYW1lIGZhY3RvcnkgZm9yIGlucHV0IGFuZCBvdXRwdXQgb2YgZWFjaCB0eXBlLgogIyAgIDMuICAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCiAjICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCiAjICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorIwogc3ViIG5ldwogewogICAgIG15ICRjbGFzc25hbWUgICAgPSBzaGlmdDsKQEAgLTQ1LDcgKzUxLDcgQEAKIAogICAgIGlmIChzY2FsYXIgQGFyZ3MgPT0gMikKICAgICB7Ci0gICAgICAkc2VsZiA9IF9pbml0KCRhcmdzWzBdLCAkYXJnc1sxXSwKKyAgICAgICAgJHNlbGYgPSBfaW5pdCgkYXJnc1swXSwgJGFyZ3NbMV0sCiAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKSwKICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnktPm5ldygpLAogICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS0+bmV3KCksCkBAIC02MSw3ICs2Nyw3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBkaWUgIlRocmlmdDo6U2VydmVyIGV4cGVjdHMgZXhhY3RseSAyLCA0LCBvciA2IGFyZ3MiOworICAgICAgZGllIFRocmlmdDo6VEV4Y2VwdGlvbi0+bmV3KCdUaHJpZnQ6OlNlcnZlciBleHBlY3RzIGV4YWN0bHkgMiwgNCwgb3IgNiBhcmdzJyk7CiAgICAgfQogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwpAQCAtODgsNyArOTQsNyBAQAogCiBzdWIgc2VydmUKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIF9jbGllbnRCZWdpbgpAQCAtMTA5LDcgKzExNSw3IEBACiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAkZSAgICA9IHNoaWZ0OwogCi0gICAgaWYgKCRlID1+IG0vVEV4Y2VwdGlvbi8gYW5kIGV4aXN0cyAkZS0+e21lc3NhZ2V9KSB7CisgICAgaWYgKCRlLT5pc2EoJ1RocmlmdDo6VEV4Y2VwdGlvbicpIGFuZCBleGlzdHMgJGUtPnttZXNzYWdlfSkgewogICAgICAgICBteSAkbWVzc2FnZSA9ICRlLT57bWVzc2FnZX07CiAgICAgICAgIG15ICRjb2RlICAgID0gJGUtPntjb2RlfTsKICAgICAgICAgbXkgJG91dCAgICAgPSAkY29kZSAuICc6JyAuICRtZXNzYWdlOwpAQCAtMTE3LDU0ICsxMjMsNjAgQEAKICAgICAgICAgJG1lc3NhZ2UgPX4gbS9UVHJhbnNwb3J0RXhjZXB0aW9uLyBhbmQgZGllICRvdXQ7CiAgICAgICAgIGlmICgkbWVzc2FnZSA9fiBtL1NvY2tldC8pIHsKICAgICAgICAgICAgICMgc3VwcHJlc3MgU29ja2V0IG1lc3NhZ2VzCi0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICB3YXJuICRvdXQ7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBlbHNlIHsKICAgICAgICAgd2FybiAkZTsKICAgICB9CiB9CiAKLQogIwogIyBTaW1wbGVTZXJ2ZXIgZnJvbSB0aGUgU2VydmVyIGJhc2UgY2xhc3MgdGhhdCBoYW5kbGVzIG9uZSBjb25uZWN0aW9uIGF0IGEgdGltZQogIwogcGFja2FnZSBUaHJpZnQ6OlNpbXBsZVNlcnZlcjsKLXVzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlciApOwordXNlIHBhcmVudCAtbm9yZXF1aXJlLCAnVGhyaWZ0OjpTZXJ2ZXInOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwotICAgIG15IEBhcmdzICAgICAgPSBAXzsKIAotICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBhcmdzKTsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyhAXyk7CisKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CiB9CiAKIHN1YiBzZXJ2ZQogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHN0b3AgPSAwOwogCiAgICAgJHNlbGYtPntzZXJ2ZXJUcmFuc3BvcnR9LT5saXN0ZW4oKTsKLSAgICB3aGlsZSAoMSkKLSAgICB7CisgICAgd2hpbGUgKCEkc3RvcCkgewogICAgICAgICBteSAkY2xpZW50ID0gJHNlbGYtPntzZXJ2ZXJUcmFuc3BvcnR9LT5hY2NlcHQoKTsKLSAgICAgICAgbXkgJGl0cmFucyA9ICRzZWxmLT57aW5wdXRUcmFuc3BvcnRGYWN0b3J5fS0+Z2V0VHJhbnNwb3J0KCRjbGllbnQpOwotICAgICAgICBteSAkb3RyYW5zID0gJHNlbGYtPntvdXRwdXRUcmFuc3BvcnRGYWN0b3J5fS0+Z2V0VHJhbnNwb3J0KCRjbGllbnQpOwotICAgICAgICBteSAkaXByb3QgID0gJHNlbGYtPntpbnB1dFByb3RvY29sRmFjdG9yeX0tPmdldFByb3RvY29sKCRpdHJhbnMpOwotICAgICAgICBteSAkb3Byb3QgID0gJHNlbGYtPntvdXRwdXRQcm90b2NvbEZhY3Rvcnl9LT5nZXRQcm90b2NvbCgkb3RyYW5zKTsKLSAgICAgICAgZXZhbCB7Ci0gICAgICAgICAgICAkc2VsZi0+X2NsaWVudEJlZ2luKCRpcHJvdCwgJG9wcm90KTsKLSAgICAgICAgICAgIHdoaWxlICgxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRzZWxmLT57cHJvY2Vzc29yfS0+cHJvY2VzcygkaXByb3QsICRvcHJvdCk7CisgICAgICAgIGlmIChkZWZpbmVkICRjbGllbnQpIHsKKyAgICAgICAgICAgIG15ICRpdHJhbnMgPSAkc2VsZi0+e2lucHV0VHJhbnNwb3J0RmFjdG9yeX0tPmdldFRyYW5zcG9ydCgkY2xpZW50KTsKKyAgICAgICAgICAgIG15ICRvdHJhbnMgPSAkc2VsZi0+e291dHB1dFRyYW5zcG9ydEZhY3Rvcnl9LT5nZXRUcmFuc3BvcnQoJGNsaWVudCk7CisgICAgICAgICAgICBteSAkaXByb3QgID0gJHNlbGYtPntpbnB1dFByb3RvY29sRmFjdG9yeX0tPmdldFByb3RvY29sKCRpdHJhbnMpOworICAgICAgICAgICAgbXkgJG9wcm90ICA9ICRzZWxmLT57b3V0cHV0UHJvdG9jb2xGYWN0b3J5fS0+Z2V0UHJvdG9jb2woJG90cmFucyk7CisgICAgICAgICAgICBldmFsIHsKKyAgICAgICAgICAgICAgICAkc2VsZi0+X2NsaWVudEJlZ2luKCRpcHJvdCwgJG9wcm90KTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICRzZWxmLT57cHJvY2Vzc29yfS0+cHJvY2VzcygkaXByb3QsICRvcHJvdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGlmKCRAKSB7CisgICAgICAgICAgICAgICAgJHNlbGYtPl9oYW5kbGVFeGNlcHRpb24oJEApOwogICAgICAgICAgICAgfQotICAgICAgICB9OyBpZigkQCkgewotICAgICAgICAgICAgJHNlbGYtPl9oYW5kbGVFeGNlcHRpb24oJEApOworICAgICAgICAgICAgJGl0cmFucy0+Y2xvc2UoKTsKKyAgICAgICAgICAgICRvdHJhbnMtPmNsb3NlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkc3RvcCA9IDE7CiAgICAgICAgIH0KLQotICAgICAgICAkaXRyYW5zLT5jbG9zZSgpOwotICAgICAgICAkb3RyYW5zLT5jbG9zZSgpOwogICAgIH0KIH0KIApAQCAtMTczLDkgKzE4NSw5IEBACiAjIEZvcmtpbmdTZXJ2ZXIgdGhhdCBmb3JrcyBhIG5ldyBwcm9jZXNzIGZvciBlYWNoIHJlcXVlc3QKICMKIHBhY2thZ2UgVGhyaWZ0OjpGb3JraW5nU2VydmVyOwotdXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyICk7Ci0KLXVzZSBQT1NJWCAiOnN5c193YWl0X2giOwordXNlIHBhcmVudCAtbm9yZXF1aXJlLCAnVGhyaWZ0OjpTZXJ2ZXInOwordXNlIFBPU0lYICc6c3lzX3dhaXRfaCc7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTE5MSw2ICsyMDMsOSBAQAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKKyAgICAjIFRIUklGVC0zODQ4OiB3aXRob3V0IGlnbm9yaW5nIFNJR0NITEQsIHBlcmwgRm9ya2luZ1NlcnZlciBnb2VzIGludG8gYSB0aWdodCBsb29wCisgICAgJFNJR3tDSExEfSA9ICdJR05PUkUnOworCiAgICAgJHNlbGYtPntzZXJ2ZXJUcmFuc3BvcnR9LT5saXN0ZW4oKTsKICAgICB3aGlsZSAoMSkKICAgICB7CkBAIC0yMTUsMTMgKzIzMCwxNSBAQAogCiAgICAgICAgIG15ICRwaWQgPSBmb3JrKCk7CiAKLSAgICAgICAgaWYgKCRwaWQpICNwYXJlbnQKKyAgICAgICAgaWYgKCRwaWQpCiAgICAgICAgIHsKICAgICAgICAgICAgICRzZWxmLT5fcGFyZW50KCRwaWQsICRpdHJhbnMsICRvdHJhbnMpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgJHNlbGYtPl9jaGlsZCgkaXRyYW5zLCAkb3RyYW5zLCAkaXByb3QsICRvcHJvdCk7CiAgICAgICAgIH0KLSAgICB9OyBpZigkQCkgeworICAgIH07CisgICAgaWYoJEApIHsKICAgICAgICAgJHNlbGYtPl9oYW5kbGVFeGNlcHRpb24oJEApOwogICAgIH0KIH0KQEAgLTIzMywxMCArMjUwLDYgQEAKICAgICBteSAkaXRyYW5zID0gc2hpZnQ7CiAgICAgbXkgJG90cmFucyA9IHNoaWZ0OwogCi0gICAgIyBhZGQgYmVmb3JlIGNvbGxlY3QsIG90aGVyd2lzZSB5b3UgcmFjZSB3LyB3YWl0cGlkCi0gICAgJHNlbGYtPntjaGlsZHJlbn0tPnskcGlkfSA9IDE7Ci0gICAgJHNlbGYtPl9jb2xsZWN0Q2hpbGRyZW4oKTsKLQogICAgICMgUGFyZW50IG11c3QgY2xvc2Ugc29ja2V0IG9yIHRoZSBjb25uZWN0aW9uIG1heSBub3QgZ2V0IGNsb3NlZCBwcm9tcHRseQogICAgICRzZWxmLT50cnlDbG9zZSgkaXRyYW5zKTsKICAgICAkc2VsZi0+dHJ5Q2xvc2UoJG90cmFucyk7CkBAIC0yNTIsMTEgKzI2NSwxNCBAQAogCiAgICAgbXkgJGVjb2RlID0gMDsKICAgICBldmFsIHsKKyAgICAgICAgIyBUSFJJRlQtNDA2NSBlbnN1cmUgY2hpbGQgcHJvY2VzcyBoYXMgbm9ybWFsIHNpZ25hbCBoYW5kbGluZyBpbiBjYXNlIHRocmlmdCBoYW5kbGVyIHVzZXMgaXQKKyAgICAgICAgJFNJR3tDSExEfSA9ICdERUZBVUxUJzsKICAgICAgICAgd2hpbGUgKDEpCiAgICAgICAgIHsKICAgICAgICAgICAgICRzZWxmLT57cHJvY2Vzc29yfS0+cHJvY2VzcygkaXByb3QsICRvcHJvdCk7CiAgICAgICAgIH0KLSAgICB9OyBpZigkQCkgeworICAgIH07CisgICAgaWYoJEApIHsKICAgICAgICAgJGVjb2RlID0gMTsKICAgICAgICAgJHNlbGYtPl9oYW5kbGVFeGNlcHRpb24oJEApOwogICAgIH0KQEAgLTI3NywzNyArMjkzLDE5IEBACiAgICAgICAgIHsKICAgICAgICAgICAkZmlsZS0+Y2xvc2UoKTsKICAgICAgICAgfQotICAgIH07IGlmKCRAKSB7Ci0gICAgICAgIGlmICgkQCA9fiBtL1RFeGNlcHRpb24vIGFuZCBleGlzdHMgJEAtPnttZXNzYWdlfSkgeworICAgIH07CisgICAgaWYoJEApIHsKKyAgICAgICAgaWYgKCRALT5pc2EoJ1RocmlmdDo6VEV4Y2VwdGlvbicpIGFuZCBleGlzdHMgJEAtPnttZXNzYWdlfSkgewogICAgICAgICAgICAgbXkgJG1lc3NhZ2UgPSAkQC0+e21lc3NhZ2V9OwogICAgICAgICAgICAgbXkgJGNvZGUgICAgPSAkQC0+e2NvZGV9OwogICAgICAgICAgICAgbXkgJG91dCAgICAgPSAkY29kZSAuICc6JyAuICRtZXNzYWdlOwogCiAgICAgICAgICAgICB3YXJuICRvdXQ7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICB3YXJuICRAOwogICAgICAgICB9CiAgICAgfQogfQogCi1zdWIgX2NvbGxlY3RDaGlsZHJlbgotewotICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICB3aGlsZSAoc2NhbGFyIGtleXMgJXskc2VsZi0+e2NoaWxkcmVufX0pCi0gICAgewotICAgICAgICBteSAkcGlkICAgID0gd2FpdHBpZCgtMSwgV05PSEFORyk7Ci0KLSAgICAgICAgaWYgKCRwaWQ+MCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZXRlICRzZWxmLT57Y2hpbGRyZW59LT57JHBpZH07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBsYXN0OwotICAgICAgICB9Ci0gICAgfQotfQotCi0KIDE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyU29ja2V0LnBtCmluZGV4IGE0MWIzMTkuLjM5NzI2NDMgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyU29ja2V0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyU29ja2V0LnBtCkBAIC0xNywxOCArMTcsMTkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIElPOjpTb2NrZXQ6OklORVQ7CiB1c2UgSU86OlNlbGVjdDsKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpUcmFuc3BvcnQ7CiB1c2UgVGhyaWZ0OjpTb2NrZXQ7CiAKIHBhY2thZ2UgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7Ci0KIHVzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlclRyYW5zcG9ydCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiAjCiAjIENvbnN0cnVjdG9yLgpAQCAtMzcsMjggKzM4LDI2IEBACiAjIEBwYXJhbVtpbl0gIGhvc3QgICBob3N0IGludGVyZmFjZSB0byBsaXN0ZW4gb24gKHVuZGVmID0gYWxsIGludGVyZmFjZXMpCiAjIEBwYXJhbVtpbl0gIHBvcnQgICBwb3J0IG51bWJlciB0byBsaXN0ZW4gb24gKHJlcXVpcmVkKQogIyBAcGFyYW1baW5dICBxdWV1ZSAgdGhlIGxpc3RlbiBxdWV1ZSBzaXplIChkZWZhdWx0IGlmIG5vdCBzcGVjaWZpZWQgaXMgMTI4KQotIyBAZXhhbXBsZSAgICBteSAkc2VydmVyc29jayA9IG5ldyBUaHJpZnQ6OlNlcnZlclNvY2tldChob3N0ID0+IHVuZGVmLCBwb3J0ID0+IHBvcnQpCisjIEBleGFtcGxlICAgIG15ICRzZXJ2ZXJzb2NrID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQtPm5ldyhob3N0ID0+IHVuZGVmLCBwb3J0ID0+IHBvcnQpCiAjCiBzdWIgbmV3CiB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwogICAgIG15ICRhcmdzICAgICAgPSBzaGlmdDsKICAgICBteSAkc2VsZjsKLSAgICAKKwogICAgICMgU3VwcG9ydCBib3RoIG9sZC1zdHlsZSAicG9ydCBudW1iZXIiIGNvbnN0cnVjdGlvbiBhbmQgbmV3ZXIuLi4KICAgICBpZiAocmVmKCRhcmdzKSBlcSAnSEFTSCcpIHsKICAgICAgICAgJHNlbGYgPSAkYXJnczsKLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBlbHNlIHsKICAgICAgICAgJHNlbGYgPSB7IHBvcnQgPT4gJGFyZ3MgfTsKICAgICB9CiAKLSAgICBpZiAobm90IGRlZmluZWQgJHNlbGYtPntwb3J0fSkgewotICAgICAgICBkaWUoInBvcnQgbnVtYmVyIG5vdCBzcGVjaWZpZWQiKTsKLSAgICB9CiAgICAgaWYgKG5vdCBkZWZpbmVkICRzZWxmLT57cXVldWV9KSB7CiAgICAgICAgICRzZWxmLT57cXVldWV9ID0gMTI4OwogICAgIH0KLSAgICAKKwogICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7CiB9CiAKQEAgLTczLDcgKzcyLDcgQEAKICAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7CiAgICAgICAgIH0KIAotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigkZXJyb3IpOworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJGVycm9yLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKICAgICB9OwogCiAgICAgJHNlbGYtPntoYW5kbGV9ID0gJHNvY2s7CkBAIC04MywxNSArODIsMjQgQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCi0gICAgaWYgKCBleGlzdHMgJHNlbGYtPntoYW5kbGV9IGFuZCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApCi0gICAgeworICAgIGlmICggZXhpc3RzICRzZWxmLT57aGFuZGxlfSBhbmQgZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKSB7CiAgICAgICAgIG15ICRjbGllbnQgICAgICAgID0gJHNlbGYtPntoYW5kbGV9LT5hY2NlcHQoKTsKICAgICAgICAgbXkgJHJlc3VsdCAgICAgICAgPSAkc2VsZi0+X19jbGllbnQoKTsKLSAgICAgICAgJHJlc3VsdC0+e2hhbmRsZX0gPSBuZXcgSU86OlNlbGVjdCgkY2xpZW50KTsKKyAgICAgICAgJHJlc3VsdC0+e2hhbmRsZX0gPSBJTzo6U2VsZWN0LT5uZXcoJGNsaWVudCk7CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KIAotICAgIHJldHVybiAwOworICAgIHJldHVybiB1bmRlZjsKK30KKworc3ViIGNsb3NlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGlmICggZXhpc3RzICRzZWxmLT57aGFuZGxlfSBhbmQgZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKQorICAgIHsKKyAgICAgICAgJHNlbGYtPntoYW5kbGV9LT5jbG9zZSgpOworICAgIH0KIH0KIAogIyMjCkBAIC0xMDAsNyArMTA4LDcgQEAKIAogc3ViIF9fY2xpZW50CiB7Ci0JcmV0dXJuIG5ldyBUaHJpZnQ6OlNvY2tldCgpOworICByZXR1cm4gVGhyaWZ0OjpTb2NrZXQtPm5ldygpOwogfQogCiBzdWIgX19saXN0ZW4KZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0KaW5kZXggZWFmOGI5ZS4uYmEwZGI1ZSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0KQEAgLTE3LDM3ICsxNyw2MyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogdXNlIFRocmlmdDo6VHJhbnNwb3J0OwogCiB1c2UgSU86OlNvY2tldDo6SU5FVDsKIHVzZSBJTzo6U2VsZWN0OwogCiBwYWNrYWdlIFRocmlmdDo6U29ja2V0OwotCiB1c2UgYmFzZSBxdyggVGhyaWZ0OjpUcmFuc3BvcnQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rpb24gYW5kIHVzYWdlCisjCisjIG15ICRvcHRzID0ge30KKyMgbXkgJHNvY2tldCA9IFRocmlmdDo6U29ja2V0LT5uZXcoXCVvcHRzKTsKKyMKKyMgb3B0aW9uczoKKyMKKyMgaG9zdCAgICAgICAgPT4gaG9zdCB0byBjb25uZWN0IHRvCisjIHBvcnQgICAgICAgID0+IHBvcnQgdG8gY29ubmVjdCB0bworIyBzZW5kVGltZW91dCA9PiB0aW1lb3V0IHVzZWQgZm9yIHNlbmQgYW5kIGZvciBjb25uZWN0CisjIHJlY3ZUaW1lb3V0ID0+IHRpbWVvdXQgdXNlZCBmb3IgcmVjdgorIwogCiBzdWIgbmV3CiB7Ci0gICAgbXkgJGNsYXNzbmFtZSAgICA9IHNoaWZ0OwotICAgIG15ICRob3N0ICAgICAgICAgPSBzaGlmdCB8fCAibG9jYWxob3N0IjsKLSAgICBteSAkcG9ydCAgICAgICAgID0gc2hpZnQgfHwgOTA5MDsKLSAgICBteSAkZGVidWdIYW5kbGVyID0gc2hpZnQ7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRvcHRzICAgICAgPSBzaGlmdDsKIAorICAgICMgZGVmYXVsdCBzZXR0aW5nczoKICAgICBteSAkc2VsZiA9IHsKLSAgICAgICAgaG9zdCAgICAgICAgID0+ICRob3N0LAotICAgICAgICBwb3J0ICAgICAgICAgPT4gJHBvcnQsCi0gICAgICAgIGRlYnVnSGFuZGxlciA9PiAkZGVidWdIYW5kbGVyLAotICAgICAgICBkZWJ1ZyAgICAgICAgPT4gMCwKLSAgICAgICAgc2VuZFRpbWVvdXQgID0+IDEwMDAwLAorICAgICAgICBob3N0ICAgICAgICAgPT4gJ2xvY2FsaG9zdCcsCisgICAgICAgIHBvcnQgICAgICAgICA9PiA5MDkwLAogICAgICAgICByZWN2VGltZW91dCAgPT4gMTAwMDAsCi0gICAgICAgIGhhbmRsZSAgICAgICA9PiB1bmRlZiwKKyAgICAgICAgc2VuZFRpbWVvdXQgID0+IDEwMDAwLAorCisgICAgICAgIGhhbmRsZSAgICAgICA9PiB1bmRlZgogICAgIH07CiAKKyAgICBpZiAoZGVmaW5lZCAkb3B0cyBhbmQgcmVmICRvcHRzIGVxIHJlZiB7fSkgeworCisgICAgICAjIGFyZ3VtZW50IGlzIGEgaGFzaCBvZiBvcHRpb25zIHNvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cworICAgICAgJHNlbGYtPnskX30gPSAkb3B0cy0+eyRffSBmb3Iga2V5cyAlJG9wdHM7CisKKyAgICB9IGVsc2UgeworCisgICAgICAjIG9sZGVyIHN0eWxlIGNvbnN0cnVjdG9yIHRha2VzIDMgYXJndW1lbnRzLCBub25lIG9mIHdoaWNoIGFyZSByZXF1aXJlZAorICAgICAgJHNlbGYtPntob3N0fSA9ICRvcHRzIHx8ICdsb2NhbGhvc3QnOworICAgICAgJHNlbGYtPntwb3J0fSA9IHNoaWZ0IHx8IDkwOTA7CisKKyAgICB9CisKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CiB9CiAKQEAgLTcwLDE5ICs5Niw2IEBACiAKIAogIwotI1NldHMgZGVidWdnaW5nIG91dHB1dCBvbiBvciBvZmYKLSMKLSMgQHBhcmFtIGJvb2wgJGRlYnVnCi0jCi1zdWIgc2V0RGVidWcKLXsKLSAgICBteSAkc2VsZiAgPSBzaGlmdDsKLSAgICBteSAkZGVidWcgPSBzaGlmdDsKLQotICAgICRzZWxmLT57ZGVidWd9ID0gJGRlYnVnOwotfQotCi0jCiAjIFRlc3RzIHdoZXRoZXIgdGhpcyBpcyBvcGVuCiAjCiAjIEByZXR1cm4gYm9vbCB0cnVlIGlmIHRoZSBzb2NrZXQgaXMgb3BlbgpAQCAtMTA3LDE1ICsxMjAsMTAgQEAKIAogICAgIG15ICRzb2NrID0gJHNlbGYtPl9fb3BlbigpIHx8IGRvIHsKICAgICAgICAgbXkgJGVycm9yID0gcmVmKCRzZWxmKS4nOiBDb3VsZCBub3QgY29ubmVjdCB0byAnLiRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0uJyAoJy4kIS4nKSc7Ci0KLSAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7Ci0gICAgICAgICAgICAkc2VsZi0+e2RlYnVnSGFuZGxlcn0tPigkZXJyb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJGVycm9yKTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCRlcnJvciwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CiAgICAgfTsKIAotICAgICRzZWxmLT57aGFuZGxlfSA9IG5ldyBJTzo6U2VsZWN0KCAkc29jayApOworICAgICRzZWxmLT57aGFuZGxlfSA9IElPOjpTZWxlY3QtPm5ldyggJHNvY2sgKTsKIH0KIAogIwpAQCAtMTI1LDcgKzEzMyw3IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBpZiggZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKSB7Ci0gICAgCSRzZWxmLT5fX2Nsb3NlKCk7CisgICAgICAkc2VsZi0+X19jbG9zZSgpOwogICAgIH0KIH0KIApAQCAtMTUxLDE1ICsxNTksMTcgQEAKIAogICAgICAgICBpZiAoIWRlZmluZWQgJGJ1ZiB8fCAkYnVmIGVxICcnKSB7CiAKLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKHJlZigkc2VsZikuJzogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0pOworICAgICAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogCi0gICAgICAgIH0gZWxzaWYgKChteSAkc3ogPSBsZW5ndGgoJGJ1ZikpIDwgJGxlbikgeworICAgICAgICB9CisgICAgICAgIGVsc2lmICgobXkgJHN6ID0gbGVuZ3RoKCRidWYpKSA8ICRsZW4pIHsKIAogICAgICAgICAgICAgJHByZSAuPSAkYnVmOwogICAgICAgICAgICAgJGxlbiAtPSAkc3o7CiAKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiAkcHJlLiRidWY7CiAgICAgICAgIH0KICAgICB9CkBAIC0xODMsOCArMTkzLDggQEAKIAogICAgIGlmICghZGVmaW5lZCAkYnVmIHx8ICRidWYgZXEgJycpIHsKIAotICAgICAgICBkaWUgbmV3IFRFeGNlcHRpb24ocmVmKCRzZWxmKS4nOiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAKICAgICB9CiAKQEAgLTIwOSwxNiArMjE5LDE2IEBACiAgICAgICAgIG15IEBzb2NrZXRzID0gJHNlbGYtPntoYW5kbGV9LT5jYW5fd3JpdGUoICRzZWxmLT57c2VuZFRpbWVvdXR9IC8gMTAwMCApOwogCiAgICAgICAgIGlmKEBzb2NrZXRzID09IDApewotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24ocmVmKCRzZWxmKS4nOiB0aW1lZCBvdXQgd3JpdGluZyB0byBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IHRpbWVkIG91dCB3cml0aW5nIHRvIGJ5dGVzIGZyb20gJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKTsKICAgICAgICAgfQogCiAgICAgICAgIG15ICRzZW50ID0gJHNlbGYtPl9fc2VuZCgkc29ja2V0c1swXSwgJGJ1Zik7CiAKICAgICAgICAgaWYgKCFkZWZpbmVkICRzZW50IHx8ICRzZW50ID09IDAgKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKHJlZigkc2VsZikuJzogQ291bGQgbm90IHdyaXRlICcubGVuZ3RoKCRidWYpLicgYnl0ZXMgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57aG9zdH0pOworCisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcocmVmKCRzZWxmKS4nOiBDb3VsZCBub3Qgd3JpdGUgJy5sZW5ndGgoJGJ1ZikuJyBieXRlcyAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntob3N0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAKICAgICAgICAgfQogCkBAIC0yNTksNyArMjY5LDcgQEAKICMKIHN1YiBfX2Nsb3NlCiB7Ci0JbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBDT1JFOjpjbG9zZSgoJHNlbGYtPntoYW5kbGV9LT5oYW5kbGVzKCkpWzBdKTsKIH0KIApAQCAtMjcyLDEyICsyODIsMTIgQEAKICMKIHN1YiBfX3JlY3YKIHsKLQlteSAkc2VsZiA9IHNoaWZ0OwotCW15ICRzb2NrID0gc2hpZnQ7Ci0JbXkgJGxlbiA9IHNoaWZ0OwotCW15ICRidWYgPSB1bmRlZjsKLQkkc29jay0+cmVjdigkYnVmLCAkbGVuKTsKLQlyZXR1cm4gJGJ1ZjsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHNvY2sgPSBzaGlmdDsKKyAgbXkgJGxlbiA9IHNoaWZ0OworICBteSAkYnVmID0gdW5kZWY7CisgICRzb2NrLT5yZWN2KCRidWYsICRsZW4pOworICByZXR1cm4gJGJ1ZjsKIH0KIAogIwpAQCAtMzA2LDggKzMxNiw4IEBACiAgICAgbXkgQHNvY2tldHMgPSAkc2VsZi0+e2hhbmRsZX0tPmNhbl9yZWFkKCAkc2VsZi0+e3JlY3ZUaW1lb3V0fSAvIDEwMDAgKTsKIAogICAgIGlmIChAc29ja2V0cyA9PSAwKSB7Ci0gICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKHJlZigkc2VsZikuJzogdGltZWQgb3V0IHJlYWRpbmcgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogdGltZWQgb3V0IHJlYWRpbmcgZnJvbSAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7CiAgICAgfQogCiAgICAgcmV0dXJuICRzb2NrZXRzWzBdOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1RyYW5zcG9ydC5wbQppbmRleCA1ZWM2ZmVlLi40MWI3ZTE1IDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1RyYW5zcG9ydC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1RyYW5zcG9ydC5wbQpAQCAtMTcsMTcgKzE3LDE5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiAKICMKICMgVHJhbnNwb3J0IGV4Y2VwdGlvbnMKICMKLXBhY2thZ2UgVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3BhY2thZ2UgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNlIGJhc2UoJ1RocmlmdDo6VEV4Y2VwdGlvbicpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiB1c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgID0+IDA7CiB1c2UgY29uc3RhbnQgTk9UX09QRU4gICAgID0+IDE7CkBAIC0zNSw3ICszNyw3IEBACiB1c2UgY29uc3RhbnQgVElNRURfT1VUICAgID0+IDM7CiB1c2UgY29uc3RhbnQgRU5EX09GX0ZJTEUgID0+IDQ7CiAKLXN1YiBuZXd7CitzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CiAgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOwogCkBAIC00Myw2ICs0NSw3IEBACiB9CiAKIHBhY2thZ2UgVGhyaWZ0OjpUcmFuc3BvcnQ7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKICMKICMgV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgpAQCAtNTEsNyArNTQsNyBAQAogIwogc3ViIGlzT3BlbgogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC02MSw3ICs2NCw3IEBACiAjCiBzdWIgb3BlbgogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC02OSw3ICs3Miw3IEBACiAjCiBzdWIgY2xvc2UKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtODEsOCArODQsNyBAQAogIwogc3ViIHJlYWQKIHsKLSAgICBteSAoJGxlbik7Ci0gICAgZGllKCJhYnN0cmFjdCIpOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0xMTQsOCArMTE2LDcgQEAKICMKIHN1YiB3cml0ZQogewotICAgIG15ICgkYnVmKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMTMwLDYgKzEzMSw3IEBACiAjIFRyYW5zcG9ydEZhY3RvcnkgY3JlYXRlcyB0cmFuc3BvcnQgb2JqZWN0cyBmcm9tIHRyYW5zcG9ydHMKICMKIHBhY2thZ2UgVGhyaWZ0OjpUcmFuc3BvcnRGYWN0b3J5OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CkBAIC0xNTYsMjAgKzE1OCwyMSBAQAogIyAgU2VydmVyVHJhbnNwb3J0IGJhc2UgY2xhc3MgbW9kdWxlCiAjCiBwYWNrYWdlIFRocmlmdDo6U2VydmVyVHJhbnNwb3J0OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbGlzdGVuCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiBhY2NlcHQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIGNsb3NlCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9UeXBlLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9UeXBlLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOGRhM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1R5cGUucG0KQEAgLTAsMCArMSw1MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OworCisjCisjIERhdGEgdHlwZXMgdGhhdCBjYW4gYmUgc2VudCB2aWEgVGhyaWZ0CisjCitwYWNrYWdlIFRocmlmdDo6VFR5cGU7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3VzZSBjb25zdGFudCBTVE9QICAgPT4gMDsKK3VzZSBjb25zdGFudCBWT0lEICAgPT4gMTsKK3VzZSBjb25zdGFudCBCT09MICAgPT4gMjsKK3VzZSBjb25zdGFudCBCWVRFICAgPT4gMzsKK3VzZSBjb25zdGFudCBJMDggICAgPT4gMzsKK3VzZSBjb25zdGFudCBET1VCTEUgPT4gNDsKK3VzZSBjb25zdGFudCBJMTYgICAgPT4gNjsKK3VzZSBjb25zdGFudCBJMzIgICAgPT4gODsKK3VzZSBjb25zdGFudCBJNjQgICAgPT4gMTA7Cit1c2UgY29uc3RhbnQgU1RSSU5HID0+IDExOwordXNlIGNvbnN0YW50IFVURjcgICA9PiAxMTsKK3VzZSBjb25zdGFudCBTVFJVQ1QgPT4gMTI7Cit1c2UgY29uc3RhbnQgTUFQICAgID0+IDEzOwordXNlIGNvbnN0YW50IFNFVCAgICA9PiAxNDsKK3VzZSBjb25zdGFudCBMSVNUICAgPT4gMTU7Cit1c2UgY29uc3RhbnQgVVRGOCAgID0+IDE2OwordXNlIGNvbnN0YW50IFVURjE2ICA9PiAxNzsKKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNlcnZlclNvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNlcnZlclNvY2tldC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzVlODA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U2VydmVyU29ja2V0LnBtCkBAIC0wLDAgKzEsODQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlNlcnZlclNvY2tldDsKK3VzZSBUaHJpZnQ6OlVuaXhTb2NrZXQ7CisKK3VzZSBJTzo6U29ja2V0OjpVTklYOworCitwYWNrYWdlIFRocmlmdDo6VW5peFNlcnZlclNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlclNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdG9yLgorIyBJZiBhIHNpbmdsZSBhcmd1bWVudCBpcyBnaXZlbiB0aGF0IGlzIG5vdCBhIGhhc2gsIHRoYXQgaXMgdGhlIHVuaXggZG9tYWluIHNvY2tldCBwYXRoLgorIyBJZiBhIHNpbmdsZSBhcmd1bWVudCBpcyBnaXZlbiB0aGF0IGlzIGEgaGFzaDoKKyMgQHBhcmFtW2luXSAgcGF0aCAgIHVuaXggZG9tYWluIHNvY2tldCBmaWxlIG5hbWUKKyMgQHBhcmFtW2luXSAgcXVldWUgIHRoZSBsaXN0ZW4gcXVldWUgc2l6ZSAoZGVmYXVsdCBpcyBub3Qgc3BlY2lmaWVkIGlzIHN1cHBsaWVkIGJ5IFNlcnZlclNvY2tldCkKKyMgQGV4YW1wbGUgICAgbXkgJHNlcnZlcnNvY2sgPSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQtPm5ldygkcGF0aCk7CisjIEBleGFtcGxlICAgIG15ICRzZXJ2ZXJzb2NrID0gVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0LT5uZXcocGF0aCA9PiAic29tZXBhdGgiLCBxdWV1ZSA9PiA2NCk7CisjCitzdWIgbmV3Cit7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRhcmdzICAgICAgPSBzaGlmdDsKKyAgICBteSAkc2VsZjsKKworICAgIGlmIChyZWYoJGFyZ3MpIGVxICdIQVNIJykgeworICAgICAgICAkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoJGFyZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgICRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygpOworICAgICAgICAkc2VsZi0+e3BhdGh9ID0gJGFyZ3M7CisgICAgfQorCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworc3ViIF9fY2xpZW50Cit7CisgIHJldHVybiBUaHJpZnQ6OlVuaXhTb2NrZXQtPm5ldygpOworfQorCitzdWIgX19saXN0ZW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpVTklYLT5uZXcoCisgICAgICAgIFR5cGUgICAgICA9PiBJTzo6U29ja2V0OjpTT0NLX1NUUkVBTSwKKyAgICAgICAgTG9jYWwgICAgID0+ICRzZWxmLT57cGF0aH0sCisgICAgICAgIExpc3RlbiAgICA9PiAkc2VsZi0+e3F1ZXVlfSkKKyAgICB8fCBkbyB7CisgICAgICAgIG15ICRlcnJvciA9ICdVbml4U2VydmVyU29ja2V0OiBDb3VsZCBub3QgYmluZCB0byAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntwYXRofSAuICcgKCcgLiAkISAuICcpJzsKKyAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7CisgICAgICAgICAgICAkc2VsZi0+e2RlYnVnSGFuZGxlcn0tPigkZXJyb3IpOworICAgICAgICB9CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygkZXJyb3IsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgIH07CisKKyAgICByZXR1cm4gJHNvY2s7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzODZkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNvY2tldC5wbQpAQCAtMCwwICsxLDY3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpTb2NrZXQ7CisKK3VzZSBJTzo6U29ja2V0OjpVTklYOworCitwYWNrYWdlIFRocmlmdDo6VW5peFNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdG9yLgorIyBUYWtlcyBhIHVuaXggZG9tYWluIHNvY2tldCBmaWxlbmFtZS4KKyMgU2VlIFRocmlmdDo6U29ja2V0IGZvciBiYXNlIGNsYXNzIHBhcmFtZXRlcnMuCisjIEBwYXJhbVtpbl0gIHBhdGggICBwYXRoIHRvIHVuaXggc29ja2V0IGZpbGUKKyMgQGV4YW1wbGUgICAgbXkgJHNvY2sgPSBUaHJpZnQ6OlVuaXhTb2NrZXQtPm5ldygkcGF0aCk7CisjCitzdWIgbmV3Cit7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCk7CisgICAgJHNlbGYtPntwYXRofSA9IHNoaWZ0OworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBfX29wZW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpVTklYLT5uZXcoCisgICAgICAgIFR5cGUgICAgICA9PiBJTzo6U29ja2V0OjpTT0NLX1NUUkVBTSwKKyAgICAgICAgUGVlciAgICAgID0+ICRzZWxmLT57cGF0aH0pCisgICAgfHwgZG8geworICAgICAgICBteSAkZXJyb3IgPSAnVW5peFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuCisgICAgICAgICAgICAkc2VsZi0+e3BhdGh9IC4gJyAoJyAuICQhIC4gJyknOworICAgICAgICBpZiAoJHNlbGYtPntkZWJ1Z30pIHsKKyAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCRlcnJvciwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgICAgfTsKKworICAgIHJldHVybiAkc29jazsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL3QvTWFrZWZpbGUuYW0gYi9saWIvcGVybC90L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMDM5NzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC90L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitFWFRSQV9ESVNUID0gbWVtb3J5X2J1ZmZlci50IHByb2Nlc3Nvci50IG11bHRpcGxleC50CmRpZmYgLS1naXQgYS9saWIvcGVybC90ZXN0L21lbW9yeV9idWZmZXIudCBiL2xpYi9wZXJsL3QvbWVtb3J5X2J1ZmZlci50CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvcGVybC90ZXN0L21lbW9yeV9idWZmZXIudApyZW5hbWUgdG8gbGliL3BlcmwvdC9tZW1vcnlfYnVmZmVyLnQKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL3QvbXVsdGlwbGV4LnQgYi9saWIvcGVybC90L211bHRpcGxleC50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTliNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC90L211bHRpcGxleC50CkBAIC0wLDAgKzEsMjAxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIFRlc3Q6Ok1vcmUgdGVzdHMgPT4gNjsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpNZW1vcnlCdWZmZXI7Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwordXNlIFRocmlmdDo6U2VydmVyOwordXNlIFRocmlmdDo6U29ja2V0OworCit1c2UgQmVuY2htYXJrU2VydmljZTsKK3VzZSBBZ2dyOworCit1c2UgY29uc3RhbnQgTkFNRV9CRU5DSE1BUktTRVJWSUNFID0+ICdCZW5jaG1hcmtTZXJ2aWNlJzsKK3VzZSBjb25zdGFudCBOQU1FX0FHR1IgID0+ICAnQWdncic7CisKK215ICRidWZmZXIgICAgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlci0+bmV3KDEwMjQpOworbXkgJGFnZ3JfcHJvdG9jb2wgID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCRidWZmZXIpLCBOQU1FX0FHR1IpOworbXkgJGFnZ3JfY2xpZW50ICAgID0gQWdnckNsaWVudC0+bmV3KCRhZ2dyX3Byb3RvY29sKTsKK215ICRiZW5jaG1hcmtfcHJvdG9jb2wgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2wtPm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJGJ1ZmZlciksIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSk7CitteSAkYmVuY2htYXJrX2NsaWVudCA9IEJlbmNobWFya1NlcnZpY2VDbGllbnQtPm5ldygkYmVuY2htYXJrX3Byb3RvY29sKTsgCisKKyRidWZmZXItPm9wZW4oKTsKKworZm9yKG15ICRpID0gMTsgJGkgPD0gNTsgJGkrKykgeworICAgICRhZ2dyX2NsaWVudC0+c2VuZF9hZGRWYWx1ZSgkaSk7CisgICAgJGFnZ3JfY2xpZW50LT57c2VxaWR9Kys7Cit9CisKKyRhZ2dyX2NsaWVudC0+c2VuZF9nZXRWYWx1ZXMoKTsKKworZm9yKG15ICRpID0gMTsgJGkgPD0gNTsgJGkrKykgeworICAgICRiZW5jaG1hcmtfY2xpZW50LT5zZW5kX2ZpYm9uYWNjaSgkaSk7CisgICAgJGJlbmNobWFya19jbGllbnQtPntzZXFpZH0rKzsKK30KKyRiZW5jaG1hcmtfY2xpZW50LT57c2VxaWR9LS07CisKK215ICRjbGllbnRfY29tbWFuZF9iaW5hcnkgPSAkYnVmZmVyLT5nZXRCdWZmZXI7CiskYnVmZmVyLT5yZXNldEJ1ZmZlcjsKKworCisjIFByb2Nlc3MgYnkgc2VydmVyCitteSAkc2VydmVyX291dHB1dF9iaW5hcnk7Cit7CisgICAgbXkgJGJlbmNobWFya19oYW5kbGVyID0gTXk6OkJlbmNobWFya1NlcnZpY2UtPm5ldygpOworICAgIG15ICRiZW5jaG1hcmtfcHJvY2Vzc29yID0gQmVuY2htYXJrU2VydmljZVByb2Nlc3Nvci0+bmV3KCRiZW5jaG1hcmtfaGFuZGxlcik7CisgICAgbXkgJGFnZ3JfaGFuZGxlciA9IE15OjpBZ2dyLT5uZXcoKTsgCisgICAgbXkgJGFnZ3JfcHJvY2Vzc29yID0gQWdnclByb2Nlc3Nvci0+bmV3KCRhZ2dyX2hhbmRsZXIpOworICAgIAorICAgIG15ICRwcm90b2NvbF9mYWN0b3J5ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnktPm5ldygpOworCisgICAgbXkgJGlucHV0X2J1ZmZlciAgICA9IFRocmlmdDo6TWVtb3J5QnVmZmVyLT5uZXcoKTsKKyAgICAkaW5wdXRfYnVmZmVyLT53cml0ZSgkY2xpZW50X2NvbW1hbmRfYmluYXJ5KTsKKworICAgIG15ICRpbnB1dF9wcm90b2NvbCAgPSAkcHJvdG9jb2xfZmFjdG9yeS0+Z2V0UHJvdG9jb2woJGlucHV0X2J1ZmZlcik7CisKKyAgICBteSAkb3V0cHV0X2J1ZmZlciAgID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXItPm5ldygpOworICAgIG15ICRvdXRwdXRfcHJvdG9jb2wgPSAkcHJvdG9jb2xfZmFjdG9yeS0+Z2V0UHJvdG9jb2woJG91dHB1dF9idWZmZXIpOworCisgICAgbXkgJHByb2Nlc3NvciA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3ItPm5ldygpOworCisgICAgJHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoTkFNRV9CRU5DSE1BUktTRVJWSUNFLCAkYmVuY2htYXJrX3Byb2Nlc3Nvcik7CisgICAgJHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoTkFNRV9BR0dSLCAkYWdncl9wcm9jZXNzb3IpOworICAgIG15ICRyZXN1bHQ7CisgICAgZm9yKG15ICRpID0gMTsgJGkgPD0gMTE7ICRpKyspIHsKKyAgICAgICAgJHJlc3VsdCA9ICRwcm9jZXNzb3ItPnByb2Nlc3MoJGlucHV0X3Byb3RvY29sLCAkb3V0cHV0X3Byb3RvY29sKTsKKyAgICAgICAgcHJpbnQgInByb2Nlc3MgcmVzdWx0ZWQgaW4gJHJlc3VsdFxuIjsKKyAgICB9CisKKyAgICAkc2VydmVyX291dHB1dF9iaW5hcnkgPSAkb3V0cHV0X2J1ZmZlci0+Z2V0QnVmZmVyKCk7Cit9CisKKyRidWZmZXItPndyaXRlKCRzZXJ2ZXJfb3V0cHV0X2JpbmFyeSk7CisKKworCitmb3IobXkgJGkgPSAxOyAkaSA8PSA1OyAkaSsrKSB7CisgICAgbXkgKCRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWQpOworCisgICAgJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oXCRmdW5jdGlvbl9uYW1lLCBcJG1lc3NhZ2VfdHlwZSwgXCRzZXF1ZW5jZV9pZCk7CisKKyAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CisgICAgICAgZGllOworICAgIH0KKyAgICAKKyAgICBteSAkYWdncl9yZXN1bHQgPSBBZ2dyX2FkZFZhbHVlX3Jlc3VsdC0+bmV3KCk7CisgICAgJGFnZ3JfcmVzdWx0LT5yZWFkKCRhZ2dyX3Byb3RvY29sKTsKKyAgICAkYWdncl9wcm90b2NvbC0+cmVhZE1lc3NhZ2VFbmQoKTsKK30KKworbXkgKCRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWQpOworCiskYWdncl9wcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZ1bmN0aW9uX25hbWUsIFwkbWVzc2FnZV90eXBlLCBcJHNlcXVlbmNlX2lkKTsKKworaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgIGRpZTsKK30KKyAgICAKK215ICRhZ2dyX3Jlc3VsdCA9IEFnZ3JfZ2V0VmFsdWVzX3Jlc3VsdC0+bmV3KCk7CiskYWdncl9yZXN1bHQtPnJlYWQoJGFnZ3JfcHJvdG9jb2wpOworJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlRW5kKCk7CisKK2lzX2RlZXBseSgkYWdncl9yZXN1bHQtPnN1Y2Nlc3MoKSwgWzEsMiwzLDQsNV0pOworIAorCitmb3JlYWNoIG15ICR2YWwoKDEsMiwzLDUsOCkpIHsKKyAgICBteSAoJGZ1bmN0aW9uX25hbWUsICRtZXNzYWdlX3R5cGUsICRzZXF1ZW5jZV9pZCk7CisKKyAgICAkYmVuY2htYXJrX3Byb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOworCisgICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgICAgICBkaWU7CisgICAgfQorICAgIG15ICRiZW5jaG1hcmtfcmVzdWx0ID0gQmVuY2htYXJrU2VydmljZV9maWJvbmFjY2lfcmVzdWx0LT5uZXcoKTsKKyAgICAkYmVuY2htYXJrX3Jlc3VsdC0+cmVhZCgkYmVuY2htYXJrX3Byb3RvY29sKTsKKyAgICAkYmVuY2htYXJrX3Byb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOworICAgIAorICAgIGlzKCRiZW5jaG1hcmtfcmVzdWx0LT5zdWNjZXNzKCksICR2YWwpOworfQorCisKK3BhY2thZ2UgTXk6OkFnZ3I7Cit1c2UgYmFzZSBxdyhBZ2dySWYpOyAKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsgCisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0ge307CisgICAgCisgICAgJHNlbGYtPnt2YWx1ZXN9ID0gKCk7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBhZGRWYWx1ZXsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICR2YWx1ZSA9IHNoaWZ0OworCisgICAgcHVzaCAoQHskc2VsZi0+e3ZhbHVlc319LCAkdmFsdWUpOyAgCit9CisKK3N1YiBnZXRWYWx1ZXN7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICAKKyAgIHJldHVybiAkc2VsZi0+e3ZhbHVlc307Cit9CisKKworCitwYWNrYWdlIE15OjpCZW5jaG1hcmtTZXJ2aWNlOwordXNlIGJhc2UgcXcoQmVuY2htYXJrU2VydmljZUlmKTsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgcmV0dXJuIGJsZXNzIHt9LCAkY2xhc3M7Cit9CisKK3N1YiBmaWJvbmFjY2kgeworICAgIG15ICgkc2VsZiwgJG4pID0gQF87CisgICAgCisgICAgbXkgJHByZXYgPSAwOworICAgIG15ICRuZXh0OworICAgIG15ICRyZXN1bHQgPSAxOworICAgIAorICAgIHdoaWxlICgkbiA+IDApIHsKKyAgICAgICAgJG5leHQgPSAkcmVzdWx0ICsgJHByZXY7CisgICAgICAgICRwcmV2ID0gJHJlc3VsdDsKKyAgICAgICAgJHJlc3VsdCA9ICRuZXh0OworICAgICAgICAtLSRuOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gJHJlc3VsdDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdC9wcm9jZXNzb3IudCBiL2xpYi9wZXJsL3QvcHJvY2Vzc29yLnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzMzAzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL3QvcHJvY2Vzc29yLnQKQEAgLTAsMCArMSwxMDQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgVGVzdDo6TW9yZSB0ZXN0cyA9PiAyOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlcjsKK3VzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOworCit1c2UgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdDsKK3VzZSBUaHJpZnRUZXN0OjpUeXBlczsKKwordXNlIERhdGE6OkR1bXBlcjsKKworbXkgJGJ1ZmZlciAgICA9IFRocmlmdDo6TWVtb3J5QnVmZmVyLT5uZXcoMTAyNCk7CitteSAkcHJvdG9jb2wgID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCRidWZmZXIpOworbXkgJGNsaWVudCAgICA9IFRocmlmdFRlc3Q6OlRocmlmdFRlc3RDbGllbnQtPm5ldygkcHJvdG9jb2wpOworCiskYnVmZmVyLT5vcGVuKCk7CiskY2xpZW50LT5zZW5kX3Rlc3RTdHJpbmcoImZvbyIpOworJGNsaWVudC0+e3NlcWlkfSsrOworJGNsaWVudC0+c2VuZF90ZXN0U3RyaW5nKCJiYXIiKTsKKworbXkgJGNsaWVudF9jb21tYW5kX2JpbmFyeSA9ICRidWZmZXItPmdldEJ1ZmZlcjsKKyRidWZmZXItPnJlc2V0QnVmZmVyOworCisjIFByb2Nlc3MgYnkgc2VydmVyCisKK215ICRzZXJ2ZXJfb3V0cHV0X2JpbmFyeTsKK3sKKyAgICBteSAkcHJvdG9jb2xfZmFjdG9yeSA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5uZXcoKTsKKworICAgIG15ICRpbnB1dF9idWZmZXIgICAgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlci0+bmV3KCk7CisgICAgJGlucHV0X2J1ZmZlci0+d3JpdGUoJGNsaWVudF9jb21tYW5kX2JpbmFyeSk7CisgICAgbXkgJGlucHV0X3Byb3RvY29sICA9ICRwcm90b2NvbF9mYWN0b3J5LT5nZXRQcm90b2NvbCgkaW5wdXRfYnVmZmVyKTsKKworICAgIG15ICRvdXRwdXRfYnVmZmVyICAgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlci0+bmV3KCk7CisgICAgbXkgJG91dHB1dF9wcm90b2NvbCA9ICRwcm90b2NvbF9mYWN0b3J5LT5nZXRQcm90b2NvbCgkb3V0cHV0X2J1ZmZlcik7CisKKyAgICBteSAkcHJvY2Vzc29yID0gVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdFByb2Nlc3Nvci0+bmV3KCBNeTo6VGhyaWZ0VGVzdC0+bmV3KCkgKTsKKyAgICBteSAkcmVzdWx0ID0gJHByb2Nlc3Nvci0+cHJvY2VzcygkaW5wdXRfcHJvdG9jb2wsICRvdXRwdXRfcHJvdG9jb2wpOworICAgIHByaW50ICJwcm9jZXNzIHJlc3VsdGVkIGluICRyZXN1bHRcbiI7CisgICAgJHJlc3VsdCA9ICRwcm9jZXNzb3ItPnByb2Nlc3MoJGlucHV0X3Byb3RvY29sLCAkb3V0cHV0X3Byb3RvY29sKTsKKyAgICBwcmludCAicHJvY2VzcyByZXN1bHRlZCBpbiAkcmVzdWx0XG4iOworICAgICRzZXJ2ZXJfb3V0cHV0X2JpbmFyeSA9ICRvdXRwdXRfYnVmZmVyLT5nZXRCdWZmZXIoKTsKK30KKworJGJ1ZmZlci0+d3JpdGUoJHNlcnZlcl9vdXRwdXRfYmluYXJ5KTsKKworZm9yZWFjaCBteSAkdmFsICgoImdvdCBmb28iLCJnb3QgYmFyIikpeworICAgIG15ICgkZnVuY3Rpb25fbmFtZSwgJG1lc3NhZ2VfdHlwZSwgJHNlcXVlbmNlX2lkKTsKKworICAgICRwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZ1bmN0aW9uX25hbWUsIFwkbWVzc2FnZV90eXBlLCBcJHNlcXVlbmNlX2lkKTsKKyAgICBwcmludCAiICAkZnVuY3Rpb25fbmFtZSwgJG1lc3NhZ2VfdHlwZSwgJHNlcXVlbmNlX2lkXG4iOworCisgICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgICAgICBkaWU7CisgICAgfQorCisgICAgbXkgJHJlc3VsdCA9IFRocmlmdFRlc3Q6OlRocmlmdFRlc3RfdGVzdFN0cmluZ19yZXN1bHQtPm5ldygpOworICAgICRyZXN1bHQtPnJlYWQoJHByb3RvY29sKTsKKyAgICAkcHJvdG9jb2wtPnJlYWRNZXNzYWdlRW5kKCk7CisKKyAgICBpcygkcmVzdWx0LT5zdWNjZXNzKCksJHZhbCk7Cit9CisKKworcGFja2FnZSBNeTo6VGhyaWZ0VGVzdDsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBEYXRhOjpEdW1wZXI7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIHJldHVybiBibGVzcyB7fSwgJGNsYXNzOworfQorCitzdWIgdGVzdFN0cmluZyB7CisgICAgbXkgKCRzZWxmLCAkc3RyaW5nKSA9IEBfOworCisgICAgcHJpbnQgX19QQUNLQUdFX18gLiAiLT50ZXN0U3RyaW5nKClcbiI7CisKKyAgICByZXR1cm4gImdvdCAiLiRzdHJpbmc7Cit9CmRpZmYgLS1naXQgYS9saWIvcGVybC90ZXN0L01ha2VmaWxlLmFtIGIvbGliL3BlcmwvdGVzdC9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5Y2UyYS4uMDAwMDAwMAotLS0gYS9saWIvcGVybC90ZXN0L01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLVRIUklGVCA9IEB0b3BfYnVpbGRkaXJAL2NvbXBpbGVyL2NwcC90aHJpZnQKLVRIUklGVF9JRiA9IEB0b3Bfc3JjZGlyQC90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ci1OQU1FX0JFTkNITUFSS1NFUlZJQ0UgPSAgQHRvcF9zcmNkaXJAL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAotTkFNRV9BR0dSID0gQHRvcF9zcmNkaXJAL2NvbnRyaWIvYXN5bmMtdGVzdC9hZ2dyLnRocmlmdAotCi1jaGVjay1sb2NhbDogXAotCWdlbi1wZXJsL1RocmlmdFRlc3QvVHlwZXMucG0gXAotCWdlbi1wZXJsL0JlbmNobWFya1Rlc3QvQmVuY2htYXJrU2VydmljZS5wbSBcCi0JZ2VuLXBlcmwvQWdnci9BZ2dyLnBtCi0KLWdlbi1wZXJsL1RocmlmdFRlc3QvVHlwZXMucG06ICQoVEhSSUZUX0lGKQotCSQoVEhSSUZUKSAtLWdlbiBwZXJsICQoVEhSSUZUX0lGKQotCi1jbGVhbi1sb2NhbDoKLQlybSAtcmYgZ2VuLXBlcmwKLQkKLWdlbi1wZXJsL0JlbmNobWFya1Rlc3QvQmVuY2htYXJrU2VydmljZS5wbTogJChOQU1FX0JFTkNITUFSS1NFUlZJQ0UpCi0JJChUSFJJRlQpIC0tZ2VuIHBlcmwgJChOQU1FX0JFTkNITUFSS1NFUlZJQ0UpCi0JCi1nZW4tcGVybC9BZ2dyL0FnZ3IucG06ICQoTkFNRV9BR0dSKQotCSQoVEhSSUZUKSAtLWdlbiBwZXJsICQoTkFNRV9BR0dSKQotCi1FWFRSQV9ESVNUID0gbWVtb3J5X2J1ZmZlci50IHByb2Nlc3Nvci50IG11bHRpcGxleC50CmRpZmYgLS1naXQgYS9saWIvcGVybC90ZXN0L211bHRpcGxleC50IGIvbGliL3BlcmwvdGVzdC9tdWx0aXBsZXgudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmMjcwNi4uMDAwMDAwMAotLS0gYS9saWIvcGVybC90ZXN0L211bHRpcGxleC50CisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi11c2UgVGVzdDo6TW9yZSB0ZXN0cyA9PiA2OwotCi11c2Ugc3RyaWN0OwotdXNlIHdhcm5pbmdzOwotCi11c2UgVGhyaWZ0OwotdXNlIFRocmlmdDo6U29ja2V0OwotdXNlIFRocmlmdDo6U2VydmVyOwotdXNlIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3I7Ci11c2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbDsKLXVzZSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlcjsKLXVzZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKLXVzZSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlcjsKLQotCi11c2UgQmVuY2htYXJrU2VydmljZTsKLXVzZSBBZ2dyOwotCi11c2UgY29uc3RhbnQgTkFNRV9CRU5DSE1BUktTRVJWSUNFID0+ICdCZW5jaG1hcmtTZXJ2aWNlJzsKLXVzZSBjb25zdGFudCBOQU1FX0FHR1IgID0+ICAnQWdncic7Ci0KLW15ICRidWZmZXIgICAgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlci0+bmV3KDEwMjQpOwotbXkgJGFnZ3JfcHJvdG9jb2wgID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCRidWZmZXIpLCBOQU1FX0FHR1IpOwotbXkgJGFnZ3JfY2xpZW50ICAgID0gQWdnckNsaWVudC0+bmV3KCRhZ2dyX3Byb3RvY29sKTsKLW15ICRiZW5jaG1hcmtfcHJvdG9jb2wgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2wtPm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJGJ1ZmZlciksIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSk7Ci1teSAkYmVuY2htYXJrX2NsaWVudCA9IEJlbmNobWFya1NlcnZpY2VDbGllbnQtPm5ldygkYmVuY2htYXJrX3Byb3RvY29sKTsgCi0KLSRidWZmZXItPm9wZW4oKTsKLQotZm9yKG15ICRpID0gMTsgJGkgPD0gNTsgJGkrKykgewotICAgICRhZ2dyX2NsaWVudC0+c2VuZF9hZGRWYWx1ZSgkaSk7Ci0gICAgJGFnZ3JfY2xpZW50LT57c2VxaWR9Kys7Ci19Ci0KLSRhZ2dyX2NsaWVudC0+c2VuZF9nZXRWYWx1ZXMoKTsKLQotZm9yKG15ICRpID0gMTsgJGkgPD0gNTsgJGkrKykgewotICAgICRiZW5jaG1hcmtfY2xpZW50LT5zZW5kX2ZpYm9uYWNjaSgkaSk7Ci0gICAgJGJlbmNobWFya19jbGllbnQtPntzZXFpZH0rKzsKLX0KLSRiZW5jaG1hcmtfY2xpZW50LT57c2VxaWR9LS07Ci0KLW15ICRjbGllbnRfY29tbWFuZF9iaW5hcnkgPSAkYnVmZmVyLT5nZXRCdWZmZXI7Ci0kYnVmZmVyLT5yZXNldEJ1ZmZlcjsKLQotCi0jIFByb2Nlc3MgYnkgc2VydmVyCi1teSAkc2VydmVyX291dHB1dF9iaW5hcnk7Ci17Ci0gICAgbXkgJGJlbmNobWFya19oYW5kbGVyID0gTXk6OkJlbmNobWFya1NlcnZpY2UtPm5ldygpOwotICAgIG15ICRiZW5jaG1hcmtfcHJvY2Vzc29yID0gQmVuY2htYXJrU2VydmljZVByb2Nlc3Nvci0+bmV3KCRiZW5jaG1hcmtfaGFuZGxlcik7Ci0gICAgbXkgJGFnZ3JfaGFuZGxlciA9IE15OjpBZ2dyLT5uZXcoKTsgCi0gICAgbXkgJGFnZ3JfcHJvY2Vzc29yID0gQWdnclByb2Nlc3Nvci0+bmV3KCRhZ2dyX2hhbmRsZXIpOwotICAgIAotICAgIG15ICRwcm90b2NvbF9mYWN0b3J5ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnktPm5ldygpOwotCi0gICAgbXkgJGlucHV0X2J1ZmZlciAgICA9IFRocmlmdDo6TWVtb3J5QnVmZmVyLT5uZXcoKTsKLSAgICAkaW5wdXRfYnVmZmVyLT53cml0ZSgkY2xpZW50X2NvbW1hbmRfYmluYXJ5KTsKLQotICAgIG15ICRpbnB1dF9wcm90b2NvbCAgPSAkcHJvdG9jb2xfZmFjdG9yeS0+Z2V0UHJvdG9jb2woJGlucHV0X2J1ZmZlcik7Ci0KLSAgICBteSAkb3V0cHV0X2J1ZmZlciAgID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXItPm5ldygpOwotICAgIG15ICRvdXRwdXRfcHJvdG9jb2wgPSAkcHJvdG9jb2xfZmFjdG9yeS0+Z2V0UHJvdG9jb2woJG91dHB1dF9idWZmZXIpOwotCi0gICAgbXkgJHByb2Nlc3NvciA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3ItPm5ldygpOwotCi0gICAgJHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoTkFNRV9CRU5DSE1BUktTRVJWSUNFLCAkYmVuY2htYXJrX3Byb2Nlc3Nvcik7Ci0gICAgJHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoTkFNRV9BR0dSLCAkYWdncl9wcm9jZXNzb3IpOwotICAgIG15ICRyZXN1bHQ7Ci0gICAgZm9yKG15ICRpID0gMTsgJGkgPD0gMTE7ICRpKyspIHsKLSAgICAgICAgJHJlc3VsdCA9ICRwcm9jZXNzb3ItPnByb2Nlc3MoJGlucHV0X3Byb3RvY29sLCAkb3V0cHV0X3Byb3RvY29sKTsKLSAgICAgICAgcHJpbnQgInByb2Nlc3MgcmVzdWx0ZWQgaW4gJHJlc3VsdFxuIjsKLSAgICB9Ci0KLSAgICAkc2VydmVyX291dHB1dF9iaW5hcnkgPSAkb3V0cHV0X2J1ZmZlci0+Z2V0QnVmZmVyKCk7Ci19Ci0KLSRidWZmZXItPndyaXRlKCRzZXJ2ZXJfb3V0cHV0X2JpbmFyeSk7Ci0KLQotCi1mb3IobXkgJGkgPSAxOyAkaSA8PSA1OyAkaSsrKSB7Ci0gICAgbXkgKCRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWQpOwotCi0gICAgJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oXCRmdW5jdGlvbl9uYW1lLCBcJG1lc3NhZ2VfdHlwZSwgXCRzZXF1ZW5jZV9pZCk7Ci0KLSAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgewotICAgICAgIGRpZTsKLSAgICB9Ci0gICAgCi0gICAgbXkgJGFnZ3JfcmVzdWx0ID0gQWdncl9hZGRWYWx1ZV9yZXN1bHQtPm5ldygpOwotICAgICRhZ2dyX3Jlc3VsdC0+cmVhZCgkYWdncl9wcm90b2NvbCk7Ci0gICAgJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlRW5kKCk7Ci19Ci0KLW15ICgkZnVuY3Rpb25fbmFtZSwgJG1lc3NhZ2VfdHlwZSwgJHNlcXVlbmNlX2lkKTsKLQotJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oXCRmdW5jdGlvbl9uYW1lLCBcJG1lc3NhZ2VfdHlwZSwgXCRzZXF1ZW5jZV9pZCk7Ci0KLWlmICgkbWVzc2FnZV90eXBlID09IFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7Ci0gICAgZGllOwotfQotICAgIAotbXkgJGFnZ3JfcmVzdWx0ID0gQWdncl9nZXRWYWx1ZXNfcmVzdWx0LT5uZXcoKTsKLSRhZ2dyX3Jlc3VsdC0+cmVhZCgkYWdncl9wcm90b2NvbCk7Ci0kYWdncl9wcm90b2NvbC0+cmVhZE1lc3NhZ2VFbmQoKTsKLQotaXNfZGVlcGx5KCRhZ2dyX3Jlc3VsdC0+c3VjY2VzcygpLCBbMSwyLDMsNCw1XSk7Ci0gCi0KLWZvcmVhY2ggbXkgJHZhbCgoMSwyLDMsNSw4KSkgewotICAgIG15ICgkZnVuY3Rpb25fbmFtZSwgJG1lc3NhZ2VfdHlwZSwgJHNlcXVlbmNlX2lkKTsKLQotICAgICRiZW5jaG1hcmtfcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oXCRmdW5jdGlvbl9uYW1lLCBcJG1lc3NhZ2VfdHlwZSwgXCRzZXF1ZW5jZV9pZCk7Ci0KLSAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgewotICAgICAgICBkaWU7Ci0gICAgfQotICAgIG15ICRiZW5jaG1hcmtfcmVzdWx0ID0gQmVuY2htYXJrU2VydmljZV9maWJvbmFjY2lfcmVzdWx0LT5uZXcoKTsKLSAgICAkYmVuY2htYXJrX3Jlc3VsdC0+cmVhZCgkYmVuY2htYXJrX3Byb3RvY29sKTsKLSAgICAkYmVuY2htYXJrX3Byb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOwotICAgIAotICAgIGlzKCRiZW5jaG1hcmtfcmVzdWx0LT5zdWNjZXNzKCksICR2YWwpOwotfQotCi0KLXBhY2thZ2UgTXk6OkFnZ3I7Ci11c2UgYmFzZSBxdyhBZ2dySWYpOyAKLQotdXNlIHN0cmljdDsKLXVzZSB3YXJuaW5nczsgCi0KLXN1YiBuZXcgewotICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKLSAgICBteSAkc2VsZiAgICAgID0ge307Ci0gICAgCi0gICAgJHNlbGYtPnt2YWx1ZXN9ID0gKCk7Ci0KLSAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ci19Ci0KLXN1YiBhZGRWYWx1ZXsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgIG15ICR2YWx1ZSA9IHNoaWZ0OwotCi0gICAgcHVzaCAoQHskc2VsZi0+e3ZhbHVlc319LCAkdmFsdWUpOyAgCi19Ci0KLXN1YiBnZXRWYWx1ZXN7Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgICAKLSAgIHJldHVybiAkc2VsZi0+e3ZhbHVlc307Ci19Ci0KLQotCi1wYWNrYWdlIE15OjpCZW5jaG1hcmtTZXJ2aWNlOwotdXNlIGJhc2UgcXcoQmVuY2htYXJrU2VydmljZUlmKTsKLQotdXNlIHN0cmljdDsKLXVzZSB3YXJuaW5nczsKLQotc3ViIG5ldyB7Ci0gICAgbXkgJGNsYXNzID0gc2hpZnQ7Ci0gICAgcmV0dXJuIGJsZXNzIHt9LCAkY2xhc3M7Ci19Ci0KLXN1YiBmaWJvbmFjY2kgewotICAgIG15ICgkc2VsZiwgJG4pID0gQF87Ci0gICAgCi0gICAgbXkgJHByZXYgPSAwOwotICAgIG15ICRuZXh0OwotICAgIG15ICRyZXN1bHQgPSAxOwotICAgIAotICAgIHdoaWxlICgkbiA+IDApIHsKLSAgICAgICAgJG5leHQgPSAkcmVzdWx0ICsgJHByZXY7Ci0gICAgICAgICRwcmV2ID0gJHJlc3VsdDsKLSAgICAgICAgJHJlc3VsdCA9ICRuZXh0OwotICAgICAgICAtLSRuOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gJHJlc3VsdDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudCBiL2xpYi9wZXJsL3Rlc3QvcHJvY2Vzc29yLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOGJlNzMuLjAwMDAwMDAKLS0tIGEvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotdXNlIFRlc3Q6Ok1vcmUgdGVzdHMgPT4gMjsKLQotdXNlIHN0cmljdDsKLXVzZSB3YXJuaW5nczsKLQotdXNlIFRocmlmdDsKLXVzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwotdXNlIFRocmlmdDo6TWVtb3J5QnVmZmVyOwotCi11c2UgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdDsKLXVzZSBUaHJpZnRUZXN0OjpUeXBlczsKLQotdXNlIERhdGE6OkR1bXBlcjsKLQotbXkgJGJ1ZmZlciAgICA9IFRocmlmdDo6TWVtb3J5QnVmZmVyLT5uZXcoMTAyNCk7Ci1teSAkcHJvdG9jb2wgID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCRidWZmZXIpOwotbXkgJGNsaWVudCAgICA9IFRocmlmdFRlc3Q6OlRocmlmdFRlc3RDbGllbnQtPm5ldygkcHJvdG9jb2wpOwotCi0kYnVmZmVyLT5vcGVuKCk7Ci0kY2xpZW50LT5zZW5kX3Rlc3RTdHJpbmcoImZvbyIpOwotJGNsaWVudC0+e3NlcWlkfSsrOwotJGNsaWVudC0+c2VuZF90ZXN0U3RyaW5nKCJiYXIiKTsKLQotbXkgJGNsaWVudF9jb21tYW5kX2JpbmFyeSA9ICRidWZmZXItPmdldEJ1ZmZlcjsKLSRidWZmZXItPnJlc2V0QnVmZmVyOwotCi0jIFByb2Nlc3MgYnkgc2VydmVyCi0KLW15ICRzZXJ2ZXJfb3V0cHV0X2JpbmFyeTsKLXsKLSAgICBteSAkcHJvdG9jb2xfZmFjdG9yeSA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5uZXcoKTsKLQotICAgIG15ICRpbnB1dF9idWZmZXIgICAgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlci0+bmV3KCk7Ci0gICAgJGlucHV0X2J1ZmZlci0+d3JpdGUoJGNsaWVudF9jb21tYW5kX2JpbmFyeSk7Ci0gICAgbXkgJGlucHV0X3Byb3RvY29sICA9ICRwcm90b2NvbF9mYWN0b3J5LT5nZXRQcm90b2NvbCgkaW5wdXRfYnVmZmVyKTsKLQotICAgIG15ICRvdXRwdXRfYnVmZmVyICAgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlci0+bmV3KCk7Ci0gICAgbXkgJG91dHB1dF9wcm90b2NvbCA9ICRwcm90b2NvbF9mYWN0b3J5LT5nZXRQcm90b2NvbCgkb3V0cHV0X2J1ZmZlcik7Ci0KLSAgICBteSAkcHJvY2Vzc29yID0gVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdFByb2Nlc3Nvci0+bmV3KCBNeTo6VGhyaWZ0VGVzdC0+bmV3KCkgKTsKLSAgICBteSAkcmVzdWx0ID0gJHByb2Nlc3Nvci0+cHJvY2VzcygkaW5wdXRfcHJvdG9jb2wsICRvdXRwdXRfcHJvdG9jb2wpOwotICAgIHByaW50ICJwcm9jZXNzIHJlc3VsdGVkIGluICRyZXN1bHRcbiI7Ci0gICAgJHJlc3VsdCA9ICRwcm9jZXNzb3ItPnByb2Nlc3MoJGlucHV0X3Byb3RvY29sLCAkb3V0cHV0X3Byb3RvY29sKTsKLSAgICBwcmludCAicHJvY2VzcyByZXN1bHRlZCBpbiAkcmVzdWx0XG4iOwotICAgICRzZXJ2ZXJfb3V0cHV0X2JpbmFyeSA9ICRvdXRwdXRfYnVmZmVyLT5nZXRCdWZmZXIoKTsKLX0KLQotJGJ1ZmZlci0+d3JpdGUoJHNlcnZlcl9vdXRwdXRfYmluYXJ5KTsKLQotZm9yZWFjaCBteSAkdmFsICgoImdvdCBmb28iLCJnb3QgYmFyIikpewotICAgIG15ICgkZnVuY3Rpb25fbmFtZSwgJG1lc3NhZ2VfdHlwZSwgJHNlcXVlbmNlX2lkKTsKLQotICAgICRwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZ1bmN0aW9uX25hbWUsIFwkbWVzc2FnZV90eXBlLCBcJHNlcXVlbmNlX2lkKTsKLSAgICBwcmludCAiICAkZnVuY3Rpb25fbmFtZSwgJG1lc3NhZ2VfdHlwZSwgJHNlcXVlbmNlX2lkXG4iOwotCi0gICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKLSAgICAgICAgZGllOwotICAgIH0KLQotICAgIG15ICRyZXN1bHQgPSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfcmVzdWx0LT5uZXcoKTsKLSAgICAkcmVzdWx0LT5yZWFkKCRwcm90b2NvbCk7Ci0gICAgJHByb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOwotCi0gICAgaXMoJHJlc3VsdC0+c3VjY2VzcygpLCR2YWwpOwotfQotCi0KLXBhY2thZ2UgTXk6OlRocmlmdFRlc3Q7Ci0KLXVzZSBzdHJpY3Q7Ci11c2Ugd2FybmluZ3M7Ci11c2UgRGF0YTo6RHVtcGVyOwotCi1zdWIgbmV3IHsKLSAgICBteSAkY2xhc3MgPSBzaGlmdDsKLSAgICByZXR1cm4gYmxlc3Mge30sICRjbGFzczsKLX0KLQotc3ViIHRlc3RTdHJpbmcgewotICAgIG15ICgkc2VsZiwgJHN0cmluZykgPSBAXzsKLQotICAgIHByaW50IF9fUEFDS0FHRV9fIC4gIi0+dGVzdFN0cmluZygpXG4iOwotCi0gICAgcmV0dXJuICJnb3QgIi4kc3RyaW5nOwotfQpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsIGIvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTJiMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC90b29scy9GaXh1cERpc3QucGwKQEAgLTAsMCArMSwzNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgVGhpcyB3aWxsIGZpeCB1cCB0aGUgZGlzdHJpYnV0aW9uIHNvIHRoYXQgQ1BBTiBwcm9wZXJseQorIyBpbmRleGVzIFRocmlmdC4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgdXRmODsKKwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBDUEFOOjpNZXRhOworCitteSAkbWV0YSA9IENQQU46Ok1ldGEtPmxvYWRfZmlsZSgnTUVUQS5qc29uJyk7CiskbWV0YS0+eydwcm92aWRlcyd9ID0geyAnVGhyaWZ0JyA9PiB7ICdmaWxlJyA9PiAnbGliL1RocmlmdC5wbScsICd2ZXJzaW9uJyA9PiAkbWV0YS0+dmVyc2lvbigpIH0gfTsKKyRtZXRhLT5zYXZlKCdNRVRBLmpzb24nKTsKZGlmZiAtLWdpdCBhL2xpYi9waHAvTWFrZWZpbGUuYW0gYi9saWIvcGhwL01ha2VmaWxlLmFtCmluZGV4IGZiZjcwZjkuLjdmZGViZTEgMTAwNzU1Ci0tLSBhL2xpYi9waHAvTWFrZWZpbGUuYW0KKysrIGIvbGliL3BocC9NYWtlZmlsZS5hbQpAQCAtMzMsOTAgKzMzLDExMCBAQAogcGhwbW9kdWxlX1NDUklQVFMgPSBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9tb2R1bGVzL3RocmlmdF9wcm90b2NvbC5zbwogCiBkaXN0Y2xlYW4tbG9jYWw6CisJaWYgWyAtZiBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9NYWtlZmlsZSBdOyB0aGVuIGNkIHNyYy9leHQvdGhyaWZ0X3Byb3RvY29sLyAmJiAkKE1BS0UpIGRpc3RjbGVhbjsgZmkKIAljZCAkKHBocG1vZHVsZV9TQ1JJUFRTKSAmJiAkKFBIUElaRSkgLS1jbGVhbgogCiBlbmRpZgogCi1waHBkaXIgPSAkKFBIUF9QUkVGSVgpL1RocmlmdAorcGhwZGlyID0gJChQSFBfUFJFRklYKS8KK3BocF9EQVRBID0gXAorICBsaWIvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocAogCiBwaHBiYXNlZGlyID0gJChwaHBkaXIpL0Jhc2UKIHBocGJhc2VfREFUQSA9IFwKLSAgbGliL1RocmlmdC9CYXNlL1RCYXNlLnBocAorICBsaWIvQmFzZS9UQmFzZS5waHAKIAogcGhwY2xhc3Nsb2FkZXJkaXIgPSAkKHBocGRpcikvQ2xhc3NMb2FkZXIKIHBocGNsYXNzbG9hZGVyX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwCisgIGxpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKIAogcGhwZXhjZXB0aW9uZGlyID0gJChwaHBkaXIpL0V4Y2VwdGlvbgogcGhwZXhjZXB0aW9uX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAgXAotICBsaWIvVGhyaWZ0L0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocCBcCi0gIGxpYi9UaHJpZnQvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAgXAotICBsaWIvVGhyaWZ0L0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocAorICBsaWIvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAgXAorICBsaWIvRXhjZXB0aW9uL1RFeGNlcHRpb24ucGhwIFwKKyAgbGliL0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwIFwKKyAgbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocAogCiBwaHBmYWN0b3J5ZGlyID0gJChwaHBkaXIpL0ZhY3RvcnkKIHBocGZhY3RvcnlfREFUQSA9IFwKLSAgbGliL1RocmlmdC9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwIFwKLSAgbGliL1RocmlmdC9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocCBcCi0gIGxpYi9UaHJpZnQvRmFjdG9yeS9USlNPTlByb3RvY29sRmFjdG9yeS5waHAgXAotICBsaWIvVGhyaWZ0L0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAgXAotICBsaWIvVGhyaWZ0L0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocCBcCi0gIGxpYi9UaHJpZnQvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKKyAgbGliL0ZhY3RvcnkvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9USlNPTlByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocCBcCisgIGxpYi9GYWN0b3J5L1RTdHJpbmdGdW5jRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKIAogcGhwcHJvdG9jb2xkaXIgPSAkKHBocGRpcikvUHJvdG9jb2wKIHBocHByb3RvY29sX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocCBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAgXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL1RQcm90b2NvbC5waHAKKyAgbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UUHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAgXAorICBsaWIvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKIAogcGhwcHJvdG9jb2xqc29uZGlyID0gJChwaHBwcm90b2NvbGRpcikvSlNPTgogcGhwcHJvdG9jb2xqc29uX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAgXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vTGlzdENvbnRleHQucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAgXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCisgIGxpYi9Qcm90b2NvbC9KU09OL0Jhc2VDb250ZXh0LnBocCBcCisgIGxpYi9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocCBcCisgIGxpYi9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAgXAorICBsaWIvUHJvdG9jb2wvSlNPTi9QYWlyQ29udGV4dC5waHAKKworcGhwcHJvdG9jb2xzaW1wbGVqc29uZGlyID0gJChwaHBwcm90b2NvbGRpcikvU2ltcGxlSlNPTgorcGhwcHJvdG9jb2xzaW1wbGVqc29uX0RBVEEgPSBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwIFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9MaXN0Q29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9NYXBDb250ZXh0LnBocCBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL1N0cnVjdENvbnRleHQucGhwCiAKIHBocHNlcmlhbGl6ZXJkaXIgPSAkKHBocGRpcikvU2VyaWFsaXplcgogcGhwc2VyaWFsaXplcl9EQVRBID0gXAotICBsaWIvVGhyaWZ0L1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwCisgIGxpYi9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocAogCiBwaHBzZXJ2ZXJkaXIgPSAkKHBocGRpcikvU2VydmVyCiBwaHBzZXJ2ZXJfREFUQSA9IFwKLSAgbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAgXAotICBsaWIvVGhyaWZ0L1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAgXAotICBsaWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyLnBocCBcCi0gIGxpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwIFwKLSAgbGliL1RocmlmdC9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAKKyAgbGliL1NlcnZlci9UU2VydmVyU29ja2V0LnBocCBcCisgIGxpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwIFwKKyAgbGliL1NlcnZlci9UU2VydmVyLnBocCBcCisgIGxpYi9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAgXAorICBsaWIvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCiAKIHBocHN0cmluZ2Z1bmNkaXIgPSAkKHBocGRpcikvU3RyaW5nRnVuYwogcGhwc3RyaW5nZnVuY19EQVRBID0gXAotICBsaWIvVGhyaWZ0L1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwIFwKLSAgbGliL1RocmlmdC9TdHJpbmdGdW5jL0NvcmUucGhwIFwKLSAgbGliL1RocmlmdC9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocAorICBsaWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAgXAorICBsaWIvU3RyaW5nRnVuYy9Db3JlLnBocCBcCisgIGxpYi9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocAogCiBwaHB0cmFuc3BvcnRkaXIgPSAkKHBocGRpcikvVHJhbnNwb3J0CiBwaHB0cmFuc3BvcnRfREFUQSA9IFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAgXAotICBsaWIvVGhyaWZ0L1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAgXAotICBsaWIvVGhyaWZ0L1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXQucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKKyAgbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UQ3VybENsaWVudC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9USHR0cENsaWVudC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UU29ja2V0LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocAogCiBwaHB0eXBlZGlyID0gJChwaHBkaXIpL1R5cGUKIHBocHR5cGVfREFUQSA9IFwKLSAgbGliL1RocmlmdC9UeXBlL1RNZXNzYWdlVHlwZS5waHAgXAotICBsaWIvVGhyaWZ0L1R5cGUvVFR5cGUucGhwCisgIGxpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAgXAorICBsaWIvVHlwZS9UVHlwZS5waHAgXAorICBsaWIvVHlwZS9UQ29uc3RhbnQucGhwCisKK2NsZWFuLWxvY2FsOgorCWlmIFsgLWYgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvTWFrZWZpbGUgXTsgdGhlbiBjZCBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC8gJiYgJChNQUtFKSBjbGVhbjsgZmkKKwogCiBFWFRSQV9ESVNUID0gXAogICBsaWIgXAogICBzcmMvYXV0b2xvYWQucGhwIFwKKyAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLm00IFwKICAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLnczMiBcCiAgIHNyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwIFwKICAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oIFwKQEAgLTEyOSw2ICsxNDksNSBAQAogICBSRUFETUUubWQKIAogTUFJTlRBSU5FUkNMRUFORklMRVMgPSBcCi0gIE1ha2VmaWxlIFwKICAgTWFrZWZpbGUuaW4KIApkaWZmIC0tZ2l0IGEvbGliL3BocC9SRUFETUUubWQgYi9saWIvcGhwL1JFQURNRS5tZAppbmRleCBjMjRlZTJjLi43MTcwMTA0IDEwMDY0NAotLS0gYS9saWIvcGhwL1JFQURNRS5tZAorKysgYi9saWIvcGhwL1JFQURNRS5tZApAQCAtMSw3ICsxLDYgQEAKIFRocmlmdCBQSFAgU29mdHdhcmUgTGlicmFyeQogCi1MaWNlbnNlCi09PT09PT09CisjIExpY2Vuc2UKIAogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTIwLDggKzE5LDcgQEAKIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1Vc2luZyBUaHJpZnQgd2l0aCBQSFAKLT09PT09PT09PT09PT09PT09PT09PQorIyBVc2luZyBUaHJpZnQgd2l0aCBQSFAKIAogVGhyaWZ0IHJlcXVpcmVzIFBIUCA1LiBUaHJpZnQgbWFrZXMgYXMgZmV3IGFzc3VtcHRpb25zIGFib3V0IHlvdXIgUEhQCiBlbnZpcm9ubWVudCBhcyBwb3NzaWJsZSB3aGlsZSB0cnlpbmcgdG8gbWFrZSBzb21lIG1vcmUgYWR2YW5jZWQgUEhQCkBAIC0yOSwyNSArMjcsMzQgQEAKIAogVG8gdXNlIFRocmlmdCBpbiB5b3VyIFBIUCBjb2RlYmFzZSwgdGFrZSB0aGUgZm9sbG93aW5nIHN0ZXBzOgogCi0jMSkgQ29weSBhbGwgb2YgdGhyaWZ0L2xpYi9waHAvbGliIGludG8geW91ciBQSFAgY29kZWJhc2UKLSMyKSBDb25maWd1cmUgU3ltZm9ueSBBdXRvbG9hZGVyIChvciB3aGF0ZXZlciB5b3UgdXN1YWxseSB1c2UpCisxLiBDb3B5IGFsbCBvZiB0aHJpZnQvbGliL3BocC9saWIgaW50byB5b3VyIFBIUCBjb2RlYmFzZQorMi4gQ29uZmlndXJlIFN5bWZvbnkgQXV0b2xvYWRlciAob3Igd2hhdGV2ZXIgeW91IHVzdWFsbHkgdXNlKQogCiBBZnRlciB0aGF0LCB5b3UgaGF2ZSB0byBtYW51YWxseSBpbmNsdWRlIHRoZSBUaHJpZnQgcGFja2FnZQogY3JlYXRlZCBieSB0aGUgY29tcGlsZXI6CiAKK2BgYAogcmVxdWlyZV9vbmNlICdwYWNrYWdlcy9TZXJ2aWNlL1NlcnZpY2UucGhwJzsKIHJlcXVpcmVfb25jZSAncGFja2FnZXMvU2VydmljZS9UeXBlcy5waHAnOworYGBgCiAKLURlcGVuZGVuY2llcwotPT09PT09PT09PT09CisjIERlcGVuZGVuY2llcwogCiBQSFBfSU5UX1NJWkUKIAotICBUaGlzIGJ1aWx0LWluIHNpZ25hbHMgd2hldGhlciB5b3VyIGFyY2hpdGVjdHVyZSBpcyAzMiBvciA2NCBiaXQgYW5kIGlzCi0gIHVzZWQgYnkgdGhlIFRCaW5hcnlQcm90b2NvbCB0byBwcm9wZXJseSB1c2UgcGFjaygpIGFuZCB1bnBhY2soKSB0bwotICBzZXJpYWxpemUgZGF0YS4KKyAgICBUaGlzIGJ1aWx0LWluIHNpZ25hbHMgd2hldGhlciB5b3VyIGFyY2hpdGVjdHVyZSBpcyAzMiBvciA2NCBiaXQgYW5kIGlzCisgICAgdXNlZCBieSB0aGUgVEJpbmFyeVByb3RvY29sIHRvIHByb3Blcmx5IHVzZSBwYWNrKCkgYW5kIHVucGFjaygpIHRvCisgICAgc2VyaWFsaXplIGRhdGEuCiAKIGFwY19mZXRjaCgpLCBhcGNfc3RvcmUoKQogCi0gIEFQQyBjYWNoZSBpcyB1c2VkIGJ5IHRoZSBUU29ja2V0UG9vbCBjbGFzcy4gSWYgeW91IGRvIG5vdCBoYXZlIEFQQyBpbnN0YWxsZWQsCi0gIFRocmlmdCB3aWxsIGZpbGwgaW4gbnVsbCBzdHViIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorICAgIEFQQyBjYWNoZSBpcyB1c2VkIGJ5IHRoZSBUU29ja2V0UG9vbCBjbGFzcy4gSWYgeW91IGRvIG5vdCBoYXZlIEFQQyBpbnN0YWxsZWQsCisgICAgVGhyaWZ0IHdpbGwgZmlsbCBpbiBudWxsIHN0dWIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEyLjAKKworMS4gW1BTUi00XShodHRwczovL3d3dy5waHAtZmlnLm9yZy9wc3IvcHNyLTQvKSBsb2FkZXIgaXMgbm93IHRoZSBkZWZhdWx0LiBJZiB5b3Ugd2FudCB0byB1c2UgY2xhc3MgbWFwcyBpbnN0ZWFkLCB1c2UgYC1nZW4gcGhwOmNsYXNzbWFwYC4KKworMi4gSWYgdXNpbmcgUFNSLTQsIHVzZSBgJHRocmlmdENsYXNzTG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnbmFtZXNwYWNlJywgJzxwYXRoPicpYCBpbnN0ZWFkIG9mIGAkdGhyaWZ0Q2xhc3NMb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignbmFtZXNwYWNlJywgJzxwYXRoPicpYC4KZGlmZiAtLWdpdCBhL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZAppbmRleCBmYTAzOTBiLi5lMjE3NTM5IDEwMDY0NAotLS0gYS9saWIvcGhwL2NvZGluZ19zdGFuZGFyZHMubWQKKysrIGIvbGliL3BocC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0xICsxLDUgQEAKLVBsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorIyMgUEhQIENvZGluZyBTdGFuZGFyZHMKKworUGxlYXNlIGZvbGxvdzoKKyAqIFtUaHJpZnQgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisgKiBbUFNSLTJdKGh0dHA6Ly93d3cucGhwLWZpZy5vcmcvcHNyL3Bzci0yLykKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwIGIvbGliL3BocC9saWIvQmFzZS9UQmFzZS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxYjYzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwCkBAIC0wLDAgKzEsMzgyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEJhc2U7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZyb20gd2hpY2ggb3RoZXIgVGhyaWZ0IHN0cnVjdHMgZXh0ZW5kLiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuCisgKiBjdXQgYmFjayBvbiB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUgd2hpY2ggaXMgdHVybmluZyBvdXQgdG8gaGF2ZSBhCisgKiBub250cml2aWFsIGNvc3QganVzdCB0byBsb2FkIHRoYW5rcyB0byB0aGUgd29uZHJvdXNseSBhYnlzbWFsIGltcGxlbWVudGF0aW9uCisgKiBvZiBQSFAuIE5vdGUgdGhhdCBjb2RlIGlzIGludGVudGlvbmFsbHkgZHVwbGljYXRlZCBpbiBoZXJlIHRvIGF2b2lkIG1ha2luZworICogZnVuY3Rpb24gY2FsbHMgZm9yIGV2ZXJ5IGZpZWxkIG9yIG1lbWJlciBvZiBhIGNvbnRhaW5lci4uCisgKi8KK2Fic3RyYWN0IGNsYXNzIFRCYXNlCit7CisgICAgcHVibGljIHN0YXRpYyAkdG1ldGhvZCA9IGFycmF5KAorICAgICAgICBUVHlwZTo6Qk9PTCA9PiAnQm9vbCcsCisgICAgICAgIFRUeXBlOjpCWVRFID0+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+c3RyaWN0V3JpdGVfKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZmI4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocApAQCAtMCwwICsxLDQwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVENvbXBhY3RQcm90b2NvbDsKKworLyoqCisgKiBDb21wYWN0IFByb3RvY29sIEZhY3RvcnkKKyAqLworY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCgkdHJhbnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RKU09OUHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9USlNPTlByb3RvY29sRmFjdG9yeS5waHAKcmVuYW1lIHRvIGxpYi9waHAvbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzA2NmM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocApAQCAtMCwwICsxLDM2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKKy8qKgorICogUHJvdG9jb2wgZmFjdG9yeSBjcmVhdGVzIHByb3RvY29sIG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCisgKi8KK2ludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5Cit7CisgICAgLyoqCisgICAgICogQnVpbGQgYSBwcm90b2NvbCBmcm9tIHRoZSBiYXNlIHRyYW5zcG9ydAorICAgICAqCisgICAgICogQHJldHVybiBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sIHByb3RvY29sCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucyk7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RTdHJpbmdGdW5jRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RTdHJpbmdGdW5jRmFjdG9yeS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkZTRkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocApAQCAtMCwwICsxLDY2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OworCit1c2UgVGhyaWZ0XFN0cmluZ0Z1bmNcQ29yZTsKK3VzZSBUaHJpZnRcU3RyaW5nRnVuY1xNYnN0cmluZzsKK3VzZSBUaHJpZnRcU3RyaW5nRnVuY1xUU3RyaW5nRnVuYzsKKworY2xhc3MgVFN0cmluZ0Z1bmNGYWN0b3J5Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgJF9pbnN0YW5jZTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgU2luZ2xldG9uIGluc3RhbmNlIG9mIFRTdHJpbmdGdW5jIGltcGxlbWVudGF0aW9uIHRoYXQgaXMKKyAgICAgKiBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgc3lzdGVtJ3MgbWJzdHJpbmcuZnVuY19vdmVybG9hZCBzZXR0aW5ncy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVFN0cmluZ0Z1bmMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgpCisgICAgeworICAgICAgICBpZiAoIXNlbGY6OiRfaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIHNlbGY6Ol9zZXRJbnN0YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNlbGY6OiRfaW5zdGFuY2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3NldEluc3RhbmNlKCkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYW5ub3QgdXNlIHN0ciogZnVuY3Rpb25zIGZvciBieXRlIGNvdW50aW5nIGJlY2F1c2UgbXVsdGlieXRlCisgICAgICAgICAqIGNoYXJhY3RlcnMgd2lsbCBiZSByZWFkIGEgc2luZ2xlIGJ5dGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBTZWU6IGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9tYnN0cmluZy5vdmVybG9hZC5waHAKKyAgICAgICAgICovCisgICAgICAgIGlmIChpbmlfZ2V0KCdtYnN0cmluZy5mdW5jX292ZXJsb2FkJykgJiAyKSB7CisgICAgICAgICAgICBzZWxmOjokX2luc3RhbmNlID0gbmV3IE1ic3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIG1ic3RyaW5nIGlzIG5vdCBpbnN0YWxsZWQgb3IgZG9lcyBub3QgaGF2ZSBmdW5jdGlvbiBvdmVybG9hZGluZworICAgICAgICAgICAgICogb2YgdGhlIHN0ciogZnVuY3Rpb25zIGVuYWJsZWQgc28gdXNlIFBIUCBjb3JlIHN0ciogZnVuY3Rpb25zIGZvcgorICAgICAgICAgICAgICogYnl0ZSBjb3VudGluZy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc2VsZjo6JF9pbnN0YW5jZSA9IG5ldyBDb3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjJlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocApAQCAtMCwwICsxLDE4IEBACis8P3BocAorCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7CisKK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5Cit7CisgICAgLyoqCisgICAgICogQHN0YXRpYworICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQKKyAgICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydChUVHJhbnNwb3J0ICR0cmFuc3BvcnQpCisgICAgeworICAgICAgICByZXR1cm4gJHRyYW5zcG9ydDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0Jhc2VDb250ZXh0LnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwCnJlbmFtZSB0byBsaWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0Jhc2VDb250ZXh0LnBocApkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vTGlzdENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocApyZW5hbWUgdG8gbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAKcmVuYW1lIHRvIGxpYi9waHAvbGliL1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocApkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9QYWlyQ29udGV4dC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocApyZW5hbWUgdG8gbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9QYWlyQ29udGV4dC5waHAKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMmI4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsMzMgQEAKKzw/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+cmVhZEpTT05TdHJpbmcoZmFsc2UpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAKcmVuYW1lIHRvIGxpYi9waHAvbGliL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocApkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiNTgxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbC5waHAKQEAgLTAsMCArMSwzNTIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OwordXNlIFRocmlmdFxUeXBlXFRUeXBlOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOworCisvKioKKyAqIFByb3RvY29sIGJhc2UgY2xhc3MgbW9kdWxlLgorICovCithYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wKK3sKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0cmFuc187CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zXyA9ICR0cmFuczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3NvciBmb3IgdHJhbnNwb3J0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNfOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFN0cnVjdCBuYW1lCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIGEgc3RydWN0LgorICAgICAqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpOworCisgICAgLyoKKyAgICAgKiBTdGFydHMgYSBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIEZpZWxkIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICAgICAgICAkdHlwZSBGaWVsZCB0eXBlCisgICAgICogQHBhcmFtIGludCAgICAgICAgJGZpZCAgRmllbGQgaWQKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkYnl0ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1Yik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cik7CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmVtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKTsKKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGNsb3NlIG9mIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1Yik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cik7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2tpcCBmdW5jdGlvbiBpcyBhIHV0aWxpdHkgdG8gcGFyc2Ugb3ZlciB1bnJlY29nbml6ZWQgZGF0ZSB3aXRob3V0CisgICAgICogY2F1c2luZyBjb3JydXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIFRUeXBlICR0eXBlIFdoYXQgdHlwZSBpcyBpdAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBza2lwKCR0eXBlKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkdHlwZSkgeworICAgICAgICAgICAgY2FzZSBUVHlwZTo6Qk9PTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRCb29sKCRib29sKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJZVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQnl0ZSgkYnl0ZSk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMTY6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTE2KCRpMTYpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STMyOgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZEkzMigkaTMyKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Okk2NDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRJNjQoJGk2NCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkRG91YmxlKCRkdWIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZFN0cmluZygkc3RyKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRTdHJ1Y3RCZWdpbigkbmFtZSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmdHlwZSwgJGZpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgka2V5VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJHZhbFR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTWFwRW5kKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFNldEVuZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZWxlbVR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTGlzdEVuZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24gZmllbGQgdHlwZTogJyAuICR0eXBlLAorICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZvciBza2lwcGluZyBiaW5hcnkgZGF0YQorICAgICAqCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJGl0cmFucyBUVHJhbnNwb3J0IG9iamVjdAorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgRmllbGQgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2tpcEJpbmFyeSgkaXRyYW5zLCAkdHlwZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoJHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJPT0w6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STE2OgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STMyOgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDQpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STY0OgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6RE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSSU5HOgorICAgICAgICAgICAgICAgICRsZW4gPSB1bnBhY2soJ04nLCAkaXRyYW5zLT5yZWFkQWxsKDQpKTsKKyAgICAgICAgICAgICAgICAkbGVuID0gJGxlblsxXTsKKyAgICAgICAgICAgICAgICBpZiAoJGxlbiA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGxlbiA9IDAgLSAoKCRsZW4gLSAxKSBeIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiA0ICsgJGl0cmFucy0+cmVhZEFsbCgkbGVuKTsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICRmdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICRmaWQgPSAwOworICAgICAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICRmdHlwZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEkxNiBmaWVsZCBpZAorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICRpdHJhbnMtPnJlYWRBbGwoMik7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkZnR5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgLy8gS3R5cGUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAka3R5cGUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIC8vIFZ0eXBlCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHZ0eXBlID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICAvLyBTaXplCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDQpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHNpemUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIGlmICgkc2l6ZSA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgPSA2OworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAka3R5cGUpOworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJHZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgIC8vIFZ0eXBlCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHZ0eXBlID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICAvLyBTaXplCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDQpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHNpemUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIGlmICgkc2l6ZSA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgPSA1OworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkdnR5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdVbmtub3duIGZpZWxkIHR5cGU6ICcgLiAkdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEKKyAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1ZTBiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAKQEAgLTAsMCArMSwyODUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247CisKKy8qKgorICogPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQKKyAqIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UsIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZQorICogY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuIFdoaWxlIGl0IGhhcyBubyBhYnN0cmFjdCBtZXRob2RzLCBpdAorICogaXMgbWFya2VkIGFic3RyYWN0IGFzIGEgcmVtaW5kZXIgdGhhdCBieSBpdHNlbGYsIGl0IGRvZXMgbm90IG1vZGlmeQorICogdGhlIGJlaGF2aW91ciBvZiB0aGUgZW5jbG9zZWQgPGNvZGU+VFByb3RvY29sPC9jb2RlPi4KKyAqCisgKiBAcGFja2FnZSBUaHJpZnRcUHJvdG9jb2wKKyAqLworYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgLyoqCisgICAgICogSW5zdGFuY2Ugb2YgcHJvdG9jb2wsIHRvIHdoaWNoIGFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLgorICAgICAqCisgICAgICogQHZhciBUUHJvdG9jb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRjb25jcmV0ZVByb3RvY29sXzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIG9mIDxjb2RlPlRQcm90b2NvbERlY29yYXRvcjwvY29kZT4gY2xhc3MuCisgICAgICogRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBUUHJvdG9jb2wgJHByb3RvY29sIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIGluc3RhbmNlLiBNdXN0IGJlIG5vbi1udWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpKTsKKyAgICAgICAgJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfID0gJHByb3RvY29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAgICAkdHlwZSAgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBTdHJ1Y3QgbmFtZQorICAgICAqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgICAgICAgIEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU3RydWN0QmVnaW4oJG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIGEgc3RydWN0LgorICAgICAqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgICAgICAgIEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRmllbGRTdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWFwRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTGlzdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUJvb2woJGJvb2wpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUJ5dGUoJGJ5dGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVJMTYoJGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUkzMigkaTMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlSTY0KCRpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVEb3VibGUoJGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVN0cmluZygkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNZXNzYWdlRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RydWN0QmVnaW4oJG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRGaWVsZEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkQm9vbCgkYm9vbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRCeXRlKCRieXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRJMTYoJGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiRpMzIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkSTMyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEk2NCgkaTY0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1YikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWREb3VibGUoJGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RyaW5nKCRzdHIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmMWY2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsMzc0IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cQ29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxMaXN0Q29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxTdHJ1Y3RDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXE1hcENvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGVKU09OIGltcGxlbWVudGF0aW9uIG9mIHRocmlmdCBwcm90b2NvbCwgcG9ydGVkIGZyb20gSmF2YS4KKyAqLworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbAoreworICAgIGNvbnN0IENPTU1BID0gJywnOworICAgIGNvbnN0IENPTE9OID0gJzonOworICAgIGNvbnN0IExCUkFDRSA9ICd7JzsKKyAgICBjb25zdCBSQlJBQ0UgPSAnfSc7CisgICAgY29uc3QgTEJSQUNLRVQgPSAnWyc7CisgICAgY29uc3QgUkJSQUNLRVQgPSAnXSc7CisgICAgY29uc3QgUVVPVEUgPSAnIic7CisKKyAgICBjb25zdCBOQU1FX01BUCA9ICJtYXAiOworICAgIGNvbnN0IE5BTUVfTElTVCA9ICJsc3QiOworICAgIGNvbnN0IE5BTUVfU0VUID0gInNldCI7CisKKyAgICBwcm90ZWN0ZWQgJHdyaXRlQ29udGV4dF8gPSBudWxsOworICAgIHByb3RlY3RlZCAkd3JpdGVDb250ZXh0U3RhY2tfID0gW107CisKKyAgICAvKioKKyAgICAgKiBQdXNoIGEgbmV3IHdyaXRlIGNvbnRleHQgb250byB0aGUgc3RhY2suCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHB1c2hXcml0ZUNvbnRleHQoQ29udGV4dCAkYykKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRTdGFja19bXSA9ICR0aGlzLT53cml0ZUNvbnRleHRfOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0XyA9ICRjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcCB0aGUgbGFzdCB3cml0ZSBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcG9wV3JpdGVDb250ZXh0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfID0gYXJyYXlfcG9wKCR0aGlzLT53cml0ZUNvbnRleHRTdGFja18pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5vdCBlbmNvdW50ZXJpbmcgYSBtYXAgd2hvc2Uga2V5cyBhcmUgY29udGFpbmVycworICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoJGludmFsaWRLZXlUeXBlKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT53cml0ZUNvbnRleHRfLT5pc01hcEtleSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBhIG1hcCB3aXRoIGtleXMgdGhhdCBhcmUgb2YgdHlwZSAiIC4KKyAgICAgICAgICAgICAgICAkaW52YWxpZEtleVR5cGUKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTlN0cmluZygkYikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKChzdHJpbmcpJGIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkludGVnZXIoJG51bSkKKyAgICB7CisgICAgICAgICRpc01hcEtleSA9ICR0aGlzLT53cml0ZUNvbnRleHRfLT5pc01hcEtleSgpOworCisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmICgkaXNNYXBLZXkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKChpbnQpJG51bSk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05Eb3VibGUoJG51bSkKKyAgICB7CisgICAgICAgICRpc01hcEtleSA9ICR0aGlzLT53cml0ZUNvbnRleHRfLT5pc01hcEtleSgpOworCisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmICgkaXNNYXBLZXkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKChmbG9hdCkkbnVtKSk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0XyA9IG5ldyBDb250ZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorICAgICAqIEBwYXJhbSBpbnQgICAgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRuYW1lKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHR5cGUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2VxaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtICBzdHJpbmcgICAgICRuYW1lIFN0cnVjdCBuYW1lCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNFKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IFN0cnVjdENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhIHN0cnVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRmaWVsZE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoc2VsZjo6TkFNRV9NQVApOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNFKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IE1hcENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydENvbnRleHRJc05vdE1hcEtleShzZWxmOjpOQU1FX0xJU1QpOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNLRVQpOworICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKKyAgICAgICAgLy8gTm8gbWV0YWRhdGEhCisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydENvbnRleHRJc05vdE1hcEtleShzZWxmOjpOQU1FX1NFVCk7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgICAgICAvLyBObyBtZXRhZGF0YSEKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0tFVCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRib29sID8gMSA6IDApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYnl0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09ORG91YmxlKCRkdWIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBzaW1wbGVqc29uIGlzIG5vdCBtZWFudCB0byBiZSByZWFkIGJhY2sgaW50byB0aHJpZnQKKyAgICAgKiAtIHNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRVc2FnZUphdmEKKyAgICAgKiAtIHVzZSBKU09OIGluc3RlYWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkc3RyKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwIGIvbGliL3BocC9saWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyYjE0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwCkBAIC0wLDAgKzEsODcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICogQGF1dGhvcjogcm1hcmluIChtYXJpbi5yYWR1QGZhY2Vib29rLmNvbSkKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFNlcmlhbGl6ZXI7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkOwordXNlIFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBzZXJpYWxpemluZyBhbmQgZGVzZXJpYWxpemluZworICogYSB0aHJpZnQgb2JqZWN0IHVzaW5nIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLgorICovCitjbGFzcyBUQmluYXJ5U2VyaWFsaXplcgoreworICAgIC8vIE5PVEUocm1hcmluKTogQmVjYXVzZSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5CisgICAgLy8gYWRkcyBhIGJlZ2luIG1lc3NhZ2UgcHJlZml4LCB5b3UgY2Fubm90IHNwZWNpZnkKKyAgICAvLyBhIHRyYW5zcG9ydCBpbiB3aGljaCB0byBzZXJpYWxpemUgYW4gb2JqZWN0LiBJdCBoYXMgdG8KKyAgICAvLyBiZSBhIHN0cmluZy4gT3RoZXJ3aXNlIHdlIHdpbGwgYnJlYWsgdGhlIGNvbXBhdGliaWxpdHkgd2l0aAorICAgIC8vIG5vcm1hbCBkZXNlcmlhbGl6YXRpb24uCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXJpYWxpemUoJG9iamVjdCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoJHRyYW5zcG9ydCk7CisgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKSkgeworICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgKKyAgICAgICAgICAgICAgICAkcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgJG9iamVjdC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UkVQTFksCisgICAgICAgICAgICAgICAgJG9iamVjdCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICRwcm90b2NvbC0+aXNTdHJpY3RXcml0ZSgpCisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oJHVudXNlZF9uYW1lLCAkdW51c2VkX3R5cGUsICR1bnVzZWRfc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJG9iamVjdC0+d3JpdGUoJHByb3RvY29sKTsKKyAgICAgICAgfQorICAgICAgICAkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOworCisgICAgICAgIHJldHVybiAkdHJhbnNwb3J0LT5nZXRCdWZmZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlc2VyaWFsaXplKCRzdHJpbmdfb2JqZWN0LCAkY2xhc3NfbmFtZSwgJGJ1ZmZlcl9zaXplID0gODE5MikKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoJHRyYW5zcG9ydCk7CisgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeScpKSB7CisgICAgICAgICAgICAvLyBOT1RFICh0LmhlaW50eikgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgaW50ZXJuYWxseSB3cmFwcyBvdXIgVE1lbW9yeUJ1ZmZlciBpbiBhCisgICAgICAgICAgICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQsIHNvIHdlIGhhdmUgdG8gcmV0cmlldmUgaXQgYWdhaW4gb3IgcmlzayBsb3NpbmcgZGF0YSB3aGVuIHdyaXRpbmcKKyAgICAgICAgICAgIC8vIGxlc3MgdGhhbiA1MTIgYnl0ZXMgdG8gdGhlIHRyYW5zcG9ydCAoc2VlIHRoZSBjb21tZW50IHRoZXJlIGFzIHdlbGwpLgorICAgICAgICAgICAgLy8gQHNlZSBUSFJJRlQtMTU3OQorICAgICAgICAgICAgJHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbignJywgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgMCk7CisgICAgICAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQgPSAkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpOworICAgICAgICAgICAgJHByb3RvY29sVHJhbnNwb3J0LT53cml0ZSgkc3RyaW5nX29iamVjdCk7CisgICAgICAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQtPmZsdXNoKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkoJHByb3RvY29sLCAkY2xhc3NfbmFtZSwgJHByb3RvY29sLT5pc1N0cmljdFJlYWQoKSwgJGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0cmFuc3BvcnQtPndyaXRlKCRzdHJpbmdfb2JqZWN0KTsKKyAgICAgICAgICAgICRvYmplY3QgPSBuZXcgJGNsYXNzX25hbWUoKTsKKyAgICAgICAgICAgICRvYmplY3QtPnJlYWQoJHByb3RvY29sKTsKKworICAgICAgICAgICAgcmV0dXJuICRvYmplY3Q7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI2ZTkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocApAQCAtMCwwICsxLDEyNSBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIGZvcmtpbmcgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgc2VydmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKKyAqLworY2xhc3MgVEZvcmtpbmdTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyCit7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgdGhlIG1haW4gc2VydmluZyBsb29wCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRzdG9wXyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiBjaGlsZHJlbi4KKyAgICAgKgorICAgICAqIEB2YXIgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGNoaWxkcmVuXyA9IGFycmF5KCk7CisKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5zIGZvciBuZXcgY2xpZW50IHVzaW5nIHRoZSBzdXBwbGllZAorICAgICAqIHRyYW5zcG9ydC4gV2UgZm9yayB3aGVuIGEgbmV3IGNvbm5lY3Rpb24KKyAgICAgKiBhcnJpdmVzLgorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5saXN0ZW4oKTsKKworICAgICAgICB3aGlsZSAoISR0aGlzLT5zdG9wXykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPnRyYW5zcG9ydF8tPmFjY2VwdCgpOworCisgICAgICAgICAgICAgICAgaWYgKCR0cmFuc3BvcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAkcGlkID0gcGNudGxfZm9yaygpOworCisgICAgICAgICAgICAgICAgICAgIGlmICgkcGlkID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhhbmRsZVBhcmVudCgkdHJhbnNwb3J0LCAkcGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRwaWQgPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5oYW5kbGVDaGlsZCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdGYWlsZWQgdG8gZm9yaycpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkdGhpcy0+Y29sbGVjdENoaWxkcmVuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2RlIHJ1biBieSB0aGUgcGFyZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHBhcmFtIGludCAkcGlkCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVQYXJlbnQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0LCAkcGlkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNoaWxkcmVuX1skcGlkXSA9ICR0cmFuc3BvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29kZSBydW4gYnkgdGhlIGNoaWxkLgorICAgICAqCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlQ2hpbGQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0KQorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICRpbnB1dFRyYW5zcG9ydCA9ICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7CisgICAgICAgICAgICAkb3V0cHV0VHJhbnNwb3J0ID0gJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7CisgICAgICAgICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAkb3V0cHV0UHJvdG9jb2wgPSAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJG91dHB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICB3aGlsZSAoJHRoaXMtPnByb2Nlc3Nvcl8tPnByb2Nlc3MoJGlucHV0UHJvdG9jb2wsICRvdXRwdXRQcm90b2NvbCkpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEAkdHJhbnNwb3J0LT5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CisgICAgICAgIH0KKworICAgICAgICBleGl0KDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbGxlY3RzIGFueSBjaGlsZHJlbiB3ZSBtYXkgaGF2ZQorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBjb2xsZWN0Q2hpbGRyZW4oKQorICAgIHsKKyAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmNoaWxkcmVuXyBhcyAkcGlkID0+ICR0cmFuc3BvcnQpIHsKKyAgICAgICAgICAgIGlmIChwY250bF93YWl0cGlkKCRwaWQsICRzdGF0dXMsIFdOT0hBTkcpID4gMCkgeworICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5jaGlsZHJlbl9bJHBpZF0pOworICAgICAgICAgICAgICAgIGlmICgkdHJhbnNwb3J0KSB7CisgICAgICAgICAgICAgICAgICAgIEAkdHJhbnNwb3J0LT5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBzZXJ2ZXIgcnVubmluZy4gS2lsbHMgdGhlIHRyYW5zcG9ydAorICAgICAqIGFuZCB0aGVuIHN0b3BzIHRoZSBtYWluIHNlcnZpbmcgbG9vcAorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7CisgICAgICAgICR0aGlzLT5zdG9wXyA9IHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTU0xTZXJ2ZXJTb2NrZXQucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTU0xTZXJ2ZXJTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTg5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNTTFNlcnZlclNvY2tldC5waHAKQEAgLTAsMCArMSw5NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU1NMU29ja2V0OworCisvKioKKyAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZlciBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyU29ja2V0Cit7CisgICAgLyoqCisgICAgICogUmVtb3RlIHBvcnQKKyAgICAgKgorICAgICAqIEB2YXIgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGNvbnRleHRfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNlcnZlclNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBIb3N0IHRvIGxpc3RlbiBvbgorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgUG9ydCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJGNvbnRleHQgU3RyZWFtIGNvbnRleHQKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QgPSAnbG9jYWxob3N0JywgJHBvcnQgPSA5MDkwLCAkY29udGV4dCA9IG51bGwpCisgICAgeworICAgICAgICAkc3NsX2hvc3QgPSAkdGhpcy0+Z2V0U1NMSG9zdCgkaG9zdCk7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHNzbF9ob3N0LCAkcG9ydCk7CisgICAgICAgICR0aGlzLT5jb250ZXh0XyA9ICRjb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTU0xIb3N0KCRob3N0KQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPSBzdHJwb3MoJGhvc3QsICI6Ly8iKTsKKyAgICAgICAgaWYgKCR0cmFuc3BvcnRfcHJvdG9jb2xfbG9jID09PSBmYWxzZSkgeworICAgICAgICAgICAgJGhvc3QgPSAnc3NsOi8vJyAuICRob3N0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAkaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyBhIG5ldyBzb2NrZXQgc2VydmVyIGhhbmRsZQorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpCisgICAgeworICAgICAgICAkdGhpcy0+bGlzdGVuZXJfID0gQHN0cmVhbV9zb2NrZXRfc2VydmVyKAorICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgJGVycm5vLAorICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgIFNUUkVBTV9TRVJWRVJfQklORCB8IFNUUkVBTV9TRVJWRVJfTElTVEVOLAorICAgICAgICAgICAgJHRoaXMtPmNvbnRleHRfCisgICAgICAgICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWNjZXB0LiBJZiBub3QgY2xpZW50IGlzIGFjY2VwdGVkIGluIHRoZSBnaXZlbiB0aW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRTb2NrZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpCisgICAgeworICAgICAgICAkaGFuZGxlID0gQHN0cmVhbV9zb2NrZXRfYWNjZXB0KCR0aGlzLT5saXN0ZW5lcl8sICR0aGlzLT5hY2NlcHRUaW1lb3V0XyAvIDEwMDAuMCk7CisgICAgICAgIGlmICghJGhhbmRsZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAkc29ja2V0ID0gbmV3IFRTU0xTb2NrZXQoKTsKKyAgICAgICAgJHNvY2tldC0+c2V0SGFuZGxlKCRoYW5kbGUpOworCisgICAgICAgIHJldHVybiAkc29ja2V0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyLnBocCBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjhjMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXIucGhwCkBAIC0wLDAgKzEsMTAyIEBACis8P3BocAorCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxGYWN0b3J5XFRUcmFuc3BvcnRGYWN0b3J5OwordXNlIFRocmlmdFxGYWN0b3J5XFRQcm90b2NvbEZhY3Rvcnk7CisKKy8qKgorICogR2VuZXJpYyBjbGFzcyBmb3IgYSBUaHJpZnQgc2VydmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKKyAqLworYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgoreworICAgIC8qKgorICAgICAqIFByb2Nlc3NvciB0byBoYW5kbGUgbmV3IGNsaWVudHMKKyAgICAgKgorICAgICAqIEB2YXIgVFByb2Nlc3NvcgorICAgICAqLworICAgIHByb3RlY3RlZCAkcHJvY2Vzc29yXzsKKworICAgIC8qKgorICAgICAqIFNlcnZlciB0cmFuc3BvcnQgdG8gYmUgdXNlZCBmb3IgbGlzdGVuaW5nCisgICAgICogYW5kIGFjY2VwdGluZyBuZXcgY2xpZW50cworICAgICAqCisgICAgICogQHZhciBUU2VydmVyVHJhbnNwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0cmFuc3BvcnRfOworCisgICAgLyoqCisgICAgICogSW5wdXQgdHJhbnNwb3J0IGZhY3RvcnkKKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGlucHV0VHJhbnNwb3J0RmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgdHJhbnNwb3J0IGZhY3RvcnkKKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOworCisgICAgLyoqCisgICAgICogSW5wdXQgcHJvdG9jb2wgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUUHJvdG9jb2xGYWN0b3J5CisgICAgICovCisgICAgcHJvdGVjdGVkICRpbnB1dFByb3RvY29sRmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgcHJvdG9jb2wgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUUHJvdG9jb2xGYWN0b3J5CisgICAgICovCisgICAgcHJvdGVjdGVkICRvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworCisgICAgLyoqCisgICAgICogU2V0cyB1cCBhbGwgdGhlIGZhY3RvcmllcywgZXRjCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0ICRwcm9jZXNzb3IKKyAgICAgKiBAcGFyYW0gVFNlcnZlclRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHBhcmFtIFRUcmFuc3BvcnRGYWN0b3J5ICRpbnB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydEZhY3RvcnkgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkaW5wdXRQcm90b2NvbEZhY3RvcnkKKyAgICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkcHJvY2Vzc29yLAorICAgICAgICBUU2VydmVyVHJhbnNwb3J0ICR0cmFuc3BvcnQsCisgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5ICRpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICBUUHJvdG9jb2xGYWN0b3J5ICRpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgVFByb3RvY29sRmFjdG9yeSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICAgKSB7CisgICAgICAgICR0aGlzLT5wcm9jZXNzb3JfID0gJHByb2Nlc3NvcjsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OworICAgICAgICAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9ICRpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICR0aGlzLT5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAkdGhpcy0+aW5wdXRQcm90b2NvbEZhY3RvcnlfID0gJGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9ICRvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VydmVzIHRoZSBzZXJ2ZXIuIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybgorICAgICAqIHVubGVzcyBhIHByb2JsZW0gcGVybWl0cyBpdCB0byBkbyBzbyBvciBpdAorICAgICAqIGlzIGludGVycnVwdGVkIGludGVudGlvbmFsbHkKKyAgICAgKgorICAgICAqIEBhYnN0cmFjdAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpOworCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIHNlcnZlciBzZXJ2aW5nCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpOworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzhmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAKQEAgLTAsMCArMSwxMjQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFNvY2tldDsKKworLyoqCisgKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2ZXIgYWdlbnQuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUU2VydmVyU29ja2V0IGV4dGVuZHMgVFNlcnZlclRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIEhhbmRsZSBmb3IgdGhlIGxpc3RlbmVyIHNvY2tldAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkbGlzdGVuZXJfOworCisgICAgLyoqCisgICAgICogUG9ydCBmb3IgdGhlIGxpc3RlbmVyIHRvIGxpc3RlbiBvbgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHBvcnRfOworCisgICAgLyoqCisgICAgICogVGltZW91dCB3aGVuIGxpc3RlbmluZyBmb3IgYSBuZXcgY2xpZW50CisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkYWNjZXB0VGltZW91dF8gPSAzMDAwMDsKKworICAgIC8qKgorICAgICAqIEhvc3QgdG8gbGlzdGVuIG9uCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkaG9zdF87CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXJTb2NrZXQgY29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgSG9zdCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IFBvcnQgdG8gbGlzdGVuIG9uCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0ID0gJ2xvY2FsaG9zdCcsICRwb3J0ID0gOTA5MCkKKyAgICB7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhY2NlcHQgdGltZW91dAorICAgICAqCisgICAgICogQHBhcmFtIGludCAkYWNjZXB0VGltZW91dAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRBY2NlcHRUaW1lb3V0KCRhY2NlcHRUaW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFjY2VwdFRpbWVvdXRfID0gJGFjY2VwdFRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYSBuZXcgc29ja2V0IHNlcnZlciBoYW5kbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBsaXN0ZW4oKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmxpc3RlbmVyXyA9IHN0cmVhbV9zb2NrZXRfc2VydmVyKCd0Y3A6Ly8nIC4gJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNvY2tldCBzZXJ2ZXIgaGFuZGxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgQGZjbG9zZSgkdGhpcy0+bGlzdGVuZXJfKTsKKyAgICAgICAgJHRoaXMtPmxpc3RlbmVyXyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWNjZXB0LiBJZiBub3QgY2xpZW50IGlzIGFjY2VwdGVkIGluIHRoZSBnaXZlbiB0aW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRTb2NrZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpCisgICAgeworICAgICAgICAkaGFuZGxlID0gQHN0cmVhbV9zb2NrZXRfYWNjZXB0KCR0aGlzLT5saXN0ZW5lcl8sICR0aGlzLT5hY2NlcHRUaW1lb3V0XyAvIDEwMDAuMCk7CisgICAgICAgIGlmICghJGhhbmRsZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAkc29ja2V0ID0gbmV3IFRTb2NrZXQoKTsKKyAgICAgICAgJHNvY2tldC0+c2V0SGFuZGxlKCRoYW5kbGUpOworCisgICAgICAgIHJldHVybiAkc29ja2V0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWEyN2FmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwCkBAIC0wLDAgKzEsNTYgQEAKKzw/cGhwCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOworCisvKioKKyAqIEdlbmVyaWMgY2xhc3MgZm9yIFNlcnZlciBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2Fic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBMaXN0IGZvciBuZXcgY2xpZW50cworICAgICAqCisgICAgICogQGFic3RyYWN0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHNlcnZlcgorICAgICAqCisgICAgICogQGFic3RyYWN0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCk7CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCB1c2UgdGhpcyB0byBpbXBsZW1lbnQKKyAgICAgKiBhY2NlcHQuCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpOworCisgICAgLyoqCisgICAgICogVXNlcyB0aGUgYWNjZXB0IGltcGxlbXRhdGlvbi4gSWYgbnVsbCBpcyByZXR1cm5lZCwgYW4KKyAgICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICogQHJldHVybiBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPmFjY2VwdEltcGwoKTsKKworICAgICAgICBpZiAoJHRyYW5zcG9ydCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICR0cmFuc3BvcnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWRkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAKQEAgLTAsMCArMSw2MCBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247CisKKy8qKgorICogU2ltcGxlIGltcGxlbXRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgorICovCitjbGFzcyBUU2ltcGxlU2VydmVyIGV4dGVuZHMgVFNlcnZlcgoreworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHRoZSBtYWluIHNlcnZpbmcgbG9vcAorICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJpdmF0ZSAkc3RvcF8gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIExpc3RlbnMgZm9yIG5ldyBjbGllbnQgdXNpbmcgdGhlIHN1cHBsaWVkCisgICAgICogdHJhbnNwb3J0LiBJdCBoYW5kbGVzIFRUcmFuc3BvcnRFeGNlcHRpb25zCisgICAgICogdG8gYXZvaWQgdGltZW91dHMgZXRjIGtpbGxpbmcgaXQKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+bGlzdGVuKCk7CisKKyAgICAgICAgd2hpbGUgKCEkdGhpcy0+c3RvcF8pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgJHRyYW5zcG9ydCA9ICR0aGlzLT50cmFuc3BvcnRfLT5hY2NlcHQoKTsKKworICAgICAgICAgICAgICAgIGlmICgkdHJhbnNwb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgJGlucHV0VHJhbnNwb3J0ID0gJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgJG91dHB1dFRyYW5zcG9ydCA9ICR0aGlzLT5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICRvdXRwdXRQcm90b2NvbCA9ICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCR0aGlzLT5wcm9jZXNzb3JfLT5wcm9jZXNzKCRpbnB1dFByb3RvY29sLCAkb3V0cHV0UHJvdG9jb2wpKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgc2VydmVyIHJ1bm5pbmcuIEtpbGxzIHRoZSB0cmFuc3BvcnQKKyAgICAgKiBhbmQgdGhlbiBzdG9wcyB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzdG9wKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOworICAgICAgICAkdGhpcy0+c3RvcF8gPSB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1N0b3JlZE1lc3NhZ2VQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9TdG9yZWRNZXNzYWdlUHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YWFhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TdG9yZWRNZXNzYWdlUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsNTMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm9jZXNzb3IKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0OworCit1c2UgVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sRGVjb3JhdG9yOworCisvKioKKyAqICBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCisgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IHRoZSBNZXNzYWdlIGluIGV4YWN0bHkKKyAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIHRoZSBNZXNzYWdlIG5hbWUuCisgKi8KK2NsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvcgoreworICAgIHByaXZhdGUgJGZuYW1lXzsKKyAgICBwcml2YXRlICRtdHlwZV87CisgICAgcHJpdmF0ZSAkcnNlcWlkXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sLCAkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHByb3RvY29sKTsKKyAgICAgICAgJHRoaXMtPmZuYW1lXyAgPSAkZm5hbWU7CisgICAgICAgICR0aGlzLT5tdHlwZV8gID0gJG10eXBlOworICAgICAgICAkdGhpcy0+cnNlcWlkXyA9ICRyc2VxaWQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICAkbmFtZSAgPSAkdGhpcy0+Zm5hbWVfOworICAgICAgICAkdHlwZSAgPSAkdGhpcy0+bXR5cGVfOworICAgICAgICAkc2VxaWQgPSAkdGhpcy0+cnNlcWlkXzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU3RyaW5nRnVuYy9Db3JlLnBocCBiL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvQ29yZS5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9TdHJpbmdGdW5jL0NvcmUucGhwCnJlbmFtZSB0byBsaWIvcGhwL2xpYi9TdHJpbmdGdW5jL0NvcmUucGhwCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL01ic3RyaW5nLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL3BocC9saWIvVGhyaWZ0L1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwCnJlbmFtZSB0byBsaWIvcGhwL2xpYi9TdHJpbmdGdW5jL01ic3RyaW5nLnBocApkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocApyZW5hbWUgdG8gbGliL3BocC9saWIvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5waHAgYi9saWIvcGhwL2xpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NGE5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwCkBAIC0wLDAgKzEsMTE4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvY2Vzc29yCisgKi8KKworbmFtZXNwYWNlIFRocmlmdDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwordXNlIFRocmlmdFxQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbDsKK3VzZSBUaHJpZnRcVHlwZVxUTWVzc2FnZVR5cGU7CisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPiBpcyBhIFByb2Nlc3NvciBhbGxvd2luZworICogYSBzaW5nbGUgPGNvZGU+VFNlcnZlcjwvY29kZT4gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAqCisgKiA8cD5UbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbAorICogcHJvY2Vzc29ycyB3aXRoIGl0LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PC9wPgorICoKKyAqIDxibG9ja3F1b3RlPjxjb2RlPgorICogICAgICRwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAqICAgICAgICAgbmV3IFx0dXRvcmlhbFxDYWxjdWxhdG9yUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAqICAgICAgICAgbmV3IFx0dXRvcmlhbFxXZWF0aGVyUmVwb3J0UHJvY2Vzc29yKG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSk7CisgKgorICogICAgICRwcm9jZXNzb3ItPnByb2Nlc3MoJHByb3RvY29sLCAkcHJvdG9jb2wpOworICogPC9jb2RlPjwvYmxvY2txdW90ZT4KKyAqLworCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IKK3sKKyAgICBwcml2YXRlICRzZXJ2aWNlUHJvY2Vzc29yTWFwXzsKKworICAgIC8qKgorICAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+LiAgVGhpcworICAgICAqIGFsbG93cyB1cyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZQorICAgICAqIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgICogZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgorICAgICAqIEBwYXJhbSBwcm9jZXNzb3IgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLCB1c3VhbGx5IHJlZmVycmVkIHRvCisgICAgICogYXMgImhhbmRsZXJzIiwgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJQcm9jZXNzb3IoJHNlcnZpY2VOYW1lLCAkcHJvY2Vzc29yKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfWyRzZXJ2aWNlTmFtZV0gPSAkcHJvY2Vzc29yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+cHJvY2VzczwvY29kZT4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgKgorICAgICAqIDxvbD4KKyAgICAgKiAgICAgPGxpPlJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS48L2xpPgorICAgICAqICAgICA8bGk+RXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuPC9saT4KKyAgICAgKiAgICAgPGxpPlVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuPC9saT4KKyAgICAgKiAgICAgPGxpPkRpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAgICogICAgICAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBNZXNzYWdlLjwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBJZiB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWSwgaWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvciBpZiB0aGUgc2VydmljZQorICAgICAqICAgICAgICAgICAgICAgICAgICBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIHNlcnZpY2UgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKFRQcm90b2NvbCAkaW5wdXQsIFRQcm90b2NvbCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgICAgICAgICAgbWVzc2FnZSBoZWFkZXIuIFRoaXMgcHVsbHMgdGhlIG1lc3NhZ2UgIm9mZiB0aGUgd2lyZSIsIHdoaWNoIHdlJ2xsCisgICAgICAgICAgICBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgKi8KKyAgICAgICAgJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsKKworICAgICAgICBpZiAoJG10eXBlICE9PSBUTWVzc2FnZVR5cGU6OkNBTEwgJiYgJG10eXBlICE9IFRNZXNzYWdlVHlwZTo6T05FV0FZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGFuZCB0aGUgbmV3IE1lc3NhZ2UgbmFtZS4KKyAgICAgICAgaWYgKHN0cnBvcygkZm5hbWUsIFRNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IpID09PSBmYWxzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiB7JGZuYW1lfS4gRGlkIHlvdSAiIC4KKyAgICAgICAgICAgICAgICAiZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iKTsKKyAgICAgICAgfQorICAgICAgICBsaXN0KCRzZXJ2aWNlTmFtZSwgJG1lc3NhZ2VOYW1lKSA9IGV4cGxvZGUoJzonLCAkZm5hbWUsIDIpOworICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJHNlcnZpY2VOYW1lLCAkdGhpcy0+c2VydmljZVByb2Nlc3Nvck1hcF8pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogeyRzZXJ2aWNlTmFtZX0uICBEaWQgeW91IGZvcmdldCAiIC4KKyAgICAgICAgICAgICAgICAidG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICAkcHJvY2Vzc29yID0gJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfWyRzZXJ2aWNlTmFtZV07CisKKyAgICAgICAgcmV0dXJuICRwcm9jZXNzb3ItPnByb2Nlc3MoCisgICAgICAgICAgICBuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKCRpbnB1dCwgJG1lc3NhZ2VOYW1lLCAkbXR5cGUsICRyc2VxaWQpLAorICAgICAgICAgICAgJG91dHB1dAorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9CYXNlL1RCYXNlLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9CYXNlL1RCYXNlLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5NWY3NS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvQmFzZS9UQmFzZS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxCYXNlOwotCi11c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmcm9tIHdoaWNoIG90aGVyIFRocmlmdCBzdHJ1Y3RzIGV4dGVuZC4gVGhpcyBpcyBzbyB0aGF0IHdlIGNhbgotICogY3V0IGJhY2sgb24gdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIHdoaWNoIGlzIHR1cm5pbmcgb3V0IHRvIGhhdmUgYQotICogbm9udHJpdmlhbCBjb3N0IGp1c3QgdG8gbG9hZCB0aGFua3MgdG8gdGhlIHdvbmRyb3VzbHkgYWJ5c21hbCBpbXBsZW1lbnRhdGlvbgotICogb2YgUEhQLiBOb3RlIHRoYXQgY29kZSBpcyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZWQgaW4gaGVyZSB0byBhdm9pZCBtYWtpbmcKLSAqIGZ1bmN0aW9uIGNhbGxzIGZvciBldmVyeSBmaWVsZCBvciBtZW1iZXIgb2YgYSBjb250YWluZXIuLgotICovCi1hYnN0cmFjdCBjbGFzcyBUQmFzZQotewotICBzdGF0aWMgJHRtZXRob2QgPSBhcnJheShUVHlwZTo6Qk9PTCAgID0+ICdCb29sJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkJZVEUgICA9PiAnQnl0ZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpJMTYgICAgPT4gJ0kxNicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpJMzIgICAgPT4gJ0kzMicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpJNjQgICAgPT4gJ0k2NCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gJ0RvdWJsZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gJ1N0cmluZycpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkKCRpbnB1dCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3BlYz1udWxsLCAkdmFscz1udWxsKQotICB7Ci0gICAgaWYgKGlzX2FycmF5KCRzcGVjKSAmJiBpc19hcnJheSgkdmFscykpIHsKLSAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7Ci0gICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOwotICAgICAgICBpZiAoaXNzZXQoJHZhbHNbJHZhcl0pKSB7Ci0gICAgICAgICAgJHRoaXMtPiR2YXIgPSAkdmFsc1skdmFyXTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX3dha2V1cCgpCi0gIHsKLSAgICAkdGhpcy0+X19jb25zdHJ1Y3QoZ2V0X29iamVjdF92YXJzKCR0aGlzKSk7Ci0gIH0KLQotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTWFwKCYkdmFyLCAkc3BlYywgJGlucHV0KQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwotICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwotICAgICRrcmVhZCA9ICR2cmVhZCA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgewotICAgICAgJGtyZWFkID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFska3R5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107Ci0gICAgfQotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKLSAgICAgICR2cmVhZCA9ICdyZWFkJy5UQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKLSAgICB9IGVsc2UgewotICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOwotICAgIH0KLSAgICAkdmFyID0gYXJyYXkoKTsKLSAgICAkX2t0eXBlID0gJF92dHlwZSA9ICRzaXplID0gMDsKLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigkX2t0eXBlLCAkX3Z0eXBlLCAkc2l6ZSk7Ci0gICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKLSAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKLSAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4ka3JlYWQoJGtleSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCRrdHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOwotICAgICAgICAgICRrZXkgPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgJHhmZXIgKz0gJGtleS0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRrZXksICRrc3BlYywgJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoJHZyZWFkICE9PSBudWxsKSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JHZyZWFkKCR2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICR2c3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAkdmFsID0gbmV3ICRjbGFzcygpOwotICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkdmFsLCAkdnNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJHZhclska2V5XSA9ICR2YWw7Ci0gICAgfQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQ9ZmFsc2UpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107Ci0gICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7Ci0gICAgICAkZXJlYWQgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgfQotICAgICR2YXIgPSBhcnJheSgpOwotICAgICRfZXR5cGUgPSAkc2l6ZSA9IDA7Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCRfZXR5cGUsICRzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKLSAgICB9Ci0gICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKLSAgICAgICRlbGVtID0gbnVsbDsKLSAgICAgIGlmICgkZXJlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZXJlYWQoJGVsZW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKLSAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICRlc3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAkeGZlciArPSAkZWxlbS0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoJHNldCkgewotICAgICAgICAkdmFyWyRlbGVtXSA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkdmFyIFtdPSAkZWxlbTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKLSAgewotICAgICR4ZmVyID0gMDsKLSAgICAkZm5hbWUgPSBudWxsOwotICAgICRmdHlwZSA9IDA7Ci0gICAgJGZpZCA9IDA7Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbigkZm5hbWUsICRmdHlwZSwgJGZpZCk7Ci0gICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGlzc2V0KCRzcGVjWyRmaWRdKSkgewotICAgICAgICAkZnNwZWMgPSAkc3BlY1skZmlkXTsKLSAgICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107Ci0gICAgICAgIGlmICgkZnR5cGUgPT0gJGZzcGVjWyd0eXBlJ10pIHsKLSAgICAgICAgICAkeGZlciA9IDA7Ci0gICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgewotICAgICAgICAgICAgJGZ1bmMgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV07Ci0gICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAgICAgJGNsYXNzID0gJGZzcGVjWydjbGFzcyddOwotICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgIH0KLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7Ci0gICAgfQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107Ci0gICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107Ci0gICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOwotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGt0eXBlXSkpIHsKLSAgICAgICRrd3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFska3R5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107Ci0gICAgfQotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKLSAgICAgICR2d3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskdnR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwQmVnaW4oJGt0eXBlLCAkdnR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgewotICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRrd3JpdGUoJGtleSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCRrdHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCRrZXksICRrc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChpc3NldCgkdndyaXRlKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICR2YWwtPndyaXRlKCRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdmFsLCAkdnNwZWMsICRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdmFsLCAkdnNwZWMsICRvdXRwdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLQotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107Ci0gICAgJGV3cml0ZSA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgewotICAgICAgJGV3cml0ZSA9ICd3cml0ZScuVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgfQotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICB9Ci0gICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKLSAgICAgICRlbGVtID0gJHNldCA/ICRrZXkgOiAkdmFsOwotICAgICAgaWYgKGlzc2V0KCRld3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGVsZW0sICRlc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoJHNldCkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKLSAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewotICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107Ci0gICAgICBpZiAoJHRoaXMtPiR2YXIgIT09IG51bGwpIHsKLSAgICAgICAgJGZ0eXBlID0gJGZzcGVjWyd0eXBlJ107Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigkdmFyLCAkZnR5cGUsICRmaWQpOwotICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7Ci0gICAgICAgICAgJGZ1bmMgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskZnR5cGVdOwotICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgewotICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgICB9Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTc1Y2UuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDbGFzc0xvYWRlciB0byBsb2FkIFRocmlmdCBsaWJyYXJ5IGFuZCBkZWZpbml0aW9ucwotICogSW5zcGlyZWQgZnJvbSBVbml2ZXJzYWxDbGFzc0xvYWRlciBmcm9tIFN5bWZvbnkgMgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5jbGFzc2xvYWRlcgotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcQ2xhc3NMb2FkZXI7Ci0KLWNsYXNzIFRocmlmdENsYXNzTG9hZGVyCi17Ci0gICAgLyoqCi0gICAgICogTmFtZXNwYWNlcyBwYXRoCi0gICAgICogQHZhciBhcnJheQotICAgICAqLwotICAgIHByb3RlY3RlZCAkbmFtZXNwYWNlcyA9IGFycmF5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaHJpZnQgZGVmaW5pdGlvbiBwYXRocwotICAgICAqIEB2YXIgdHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCAkZGVmaW5pdGlvbnMgPSBhcnJheSgpOwotCi0gICAgLyoqCi0gICAgICogRG8gd2UgdXNlIEFQQyBjYWNoZSA/Ci0gICAgICogQHZhciBib29sZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkICRhcGMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEFQQyBDYWNoZSBwcmVmaXgKLSAgICAgKiBAdmFyIHN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCAkYXBjX3ByZWZpeDsKLQotICAgIC8qKgotICAgICAqIFNldCBhdXRvbG9hZGVyIHRvIHVzZSBBUEMgY2FjaGUKLSAgICAgKiBAcGFyYW0gYm9vbGVhbiAkYXBjCi0gICAgICogQHBhcmFtIHN0cmluZyAgJGFwY19wcmVmaXgKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGFwYyA9IGZhbHNlLCAkYXBjX3ByZWZpeCA9IG51bGwpCi0gICAgewotICAgICAgICAkdGhpcy0+YXBjID0gJGFwYzsKLSAgICAgICAgJHRoaXMtPmFwY19wcmVmaXggPSAkYXBjX3ByZWZpeDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBuYW1lc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICRuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHBhdGhzICAgICBUaGUgbG9jYXRpb24ocykgb2YgdGhlIG5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3Rlck5hbWVzcGFjZSgkbmFtZXNwYWNlLCAkcGF0aHMpCi0gICAgewotICAgICAgICAkdGhpcy0+bmFtZXNwYWNlc1skbmFtZXNwYWNlXSA9IChhcnJheSkgJHBhdGhzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIFRocmlmdCBkZWZpbml0aW9uIG5hbWVzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgJG5hbWVzcGFjZSBUaGUgZGVmaW5pdGlvbiBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gYXJyYXl8c3RyaW5nICRwYXRocyAgICAgVGhlIGxvY2F0aW9uKHMpIG9mIHRoZSBkZWZpbml0aW9uIG5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlckRlZmluaXRpb24oJG5hbWVzcGFjZSwgJHBhdGhzKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmRlZmluaXRpb25zWyRuYW1lc3BhY2VdID0gKGFycmF5KSAkcGF0aHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIHRoaXMgaW5zdGFuY2UgYXMgYW4gYXV0b2xvYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBCb29sZWFuICRwcmVwZW5kIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgYXV0b2xvYWRlciBvciBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXIoJHByZXBlbmQgPSBmYWxzZSkKLSAgICB7Ci0gICAgICAgIHNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgkdGhpcywgJ2xvYWRDbGFzcycpLCB0cnVlLCAkcHJlcGVuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGdpdmVuIGNsYXNzLCBkZWZpbml0aW9uIG9yIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgJGNsYXNzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiBsb2FkQ2xhc3MoJGNsYXNzKQotICAgIHsKLSAgICAgICAgaWYgKAotICAgICAgICAgICAgKHRydWUgPT09ICR0aGlzLT5hcGMgJiYgKCRmaWxlID0gJHRoaXMtPmZpbmRGaWxlSW5BcGMoJGNsYXNzKSkpIG9yCi0gICAgICAgICAgICAoJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSkKLSAgICAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXF1aXJlX29uY2UgJGZpbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3Mgb3IgaW50ZXJmYWNlIGluIEFQQy4KLSAgICAgKiBAcGFyYW0gIHN0cmluZyAkY2xhc3MgVGhlIG5hbWUgb2YgdGhlIGNsYXNzCi0gICAgICogQHJldHVybiBzdHJpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZmluZEZpbGVJbkFwYygkY2xhc3MpCi0gICAgewotICAgICAgICBpZiAoZmFsc2UgPT09ICRmaWxlID0gYXBjX2ZldGNoKCR0aGlzLT5hcGNfcHJlZml4LiRjbGFzcykpIHsKLSAgICAgICAgICAgIGFwY19zdG9yZSgkdGhpcy0+YXBjX3ByZWZpeC4kY2xhc3MsICRmaWxlID0gJHRoaXMtPmZpbmRGaWxlKCRjbGFzcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICRmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgY2xhc3MgaW4gbmFtZXNwYWNlcyBvciBkZWZpbml0aW9ucyBkaXJlY3RvcmllcwotICAgICAqIEBwYXJhbSAgc3RyaW5nICRjbGFzcwotICAgICAqIEByZXR1cm4gc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIGZpbmRGaWxlKCRjbGFzcykKLSAgICB7Ci0gICAgICAgIC8vIFJlbW92ZSBmaXJzdCBiYWNrc2xhc2gKLSAgICAgICAgaWYgKCdcXCcgPT0gJGNsYXNzWzBdKSB7Ci0gICAgICAgICAgICAkY2xhc3MgPSBzdWJzdHIoJGNsYXNzLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmYWxzZSAhPT0gJHBvcyA9IHN0cnJwb3MoJGNsYXNzLCAnXFwnKSkgewotICAgICAgICAgICAgLy8gTmFtZXNwYWNlZCBjbGFzcyBuYW1lCi0gICAgICAgICAgICAkbmFtZXNwYWNlID0gc3Vic3RyKCRjbGFzcywgMCwgJHBvcyk7Ci0KLSAgICAgICAgICAgIC8vIEl0ZXJhdGUgaW4gbm9ybWFsIG5hbWVzcGFjZXMKLSAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5uYW1lc3BhY2VzIGFzICRucyA9PiAkZGlycykgewotICAgICAgICAgICAgICAgIC8vRG9uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgYXV0b2xvYWRlcnMKLSAgICAgICAgICAgICAgICBpZiAoMCAhPT0gc3RycG9zKCRuYW1lc3BhY2UsICRucykpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgewotICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lID0gc3Vic3RyKCRjbGFzcywgJHBvcyArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgICRmaWxlID0gJGRpci5ESVJFQ1RPUllfU0VQQVJBVE9SLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoJ1xcJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJG5hbWVzcGFjZSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVJFQ1RPUllfU0VQQVJBVE9SLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZS4nLnBocCc7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJdGVyYXRlIGluIFRocmlmdCBuYW1lc3BhY2VzCi0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBmaXJzdCBwYXJ0IG9mIG5hbWVzcGFjZQotICAgICAgICAgICAgJG0gPSBleHBsb2RlKCdcXCcsICRjbGFzcyk7Ci0KLSAgICAgICAgICAgIC8vIElnbm9yZSB3cm9uZyBjYWxsCi0gICAgICAgICAgICBpZiAoY291bnQoJG0pIDw9IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICRjbGFzcyA9IGFycmF5X3BvcCgkbSk7Ci0gICAgICAgICAgICAkbmFtZXNwYWNlID0gaW1wbG9kZSgnXFwnLCAkbSk7Ci0KLSAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5kZWZpbml0aW9ucyBhcyAkbnMgPT4gJGRpcnMpIHsKLSAgICAgICAgICAgICAgICAvL0Rvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIGF1dG9sb2FkZXJzCi0gICAgICAgICAgICAgICAgaWYgKDAgIT09IHN0cnBvcygkbmFtZXNwYWNlLCAkbnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIEF2YWlsYWJsZSBpbiBzZXJ2aWNlOiBJbnRlcmZhY2UsIENsaWVudCwgUHJvY2Vzc29yLCBSZXN0Ci0gICAgICAgICAgICAgICAgICAgICAqIEFuZCBldmVyeSBzZXJ2aWNlIG1ldGhvZHMgKF8uKykKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmKAotICAgICAgICAgICAgICAgICAgICAgICAgMCA9PT0gcHJlZ19tYXRjaCgnIyguKykoaWZ8Y2xpZW50fHByb2Nlc3NvcnxyZXN0KSQjaScsICRjbGFzcywgJG4pIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgMCA9PT0gcHJlZ19tYXRjaCgnIyguKylfW2EtejAtOV0rXyhhcmdzfHJlc3VsdCkkI2knLCAkY2xhc3MsICRuKQotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgPSAnVHlwZXMnOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSA9ICRuWzFdOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgJGZpbGUgPSAkZGlyLkRJUkVDVE9SWV9TRVBBUkFUT1IgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoJ1xcJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJG5hbWVzcGFjZSkgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSRUNUT1JZX1NFUEFSQVRPUiAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lIC4gJy5waHAnOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2ODlmYy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKLQotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotCi1jbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uCi17Ci0gIHN0YXRpYyAkX1RTUEVDID0KLSAgICBhcnJheSgxID0+IGFycmF5KCd2YXInID0+ICdtZXNzYWdlJywKLSAgICAgICAgICAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6U1RSSU5HKSwKLSAgICAgICAgICAyID0+IGFycmF5KCd2YXInID0+ICdjb2RlJywKLSAgICAgICAgICAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6STMyKSk7Ci0KLSAgY29uc3QgVU5LTk9XTiA9IDA7Ci0gIGNvbnN0IFVOS05PV05fTUVUSE9EID0gMTsKLSAgY29uc3QgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyOwotICBjb25zdCBXUk9OR19NRVRIT0RfTkFNRSA9IDM7Ci0gIGNvbnN0IEJBRF9TRVFVRU5DRV9JRCA9IDQ7Ci0gIGNvbnN0IE1JU1NJTkdfUkVTVUxUID0gNTsKLSAgY29uc3QgSU5URVJOQUxfRVJST1IgPSA2OwotICBjb25zdCBQUk9UT0NPTF9FUlJPUiA9IDc7Ci0gIGNvbnN0IElOVkFMSURfVFJBTlNGT1JNID0gODsKLSAgY29uc3QgSU5WQUxJRF9QUk9UT0NPTCA9IDk7Ci0gIGNvbnN0IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTA7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlPW51bGwsICRjb2RlPTApCi0gIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkb3V0cHV0KQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5fcmVhZCgnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJywgc2VsZjo6JF9UU1BFQywgJG91dHB1dCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkKLSAgewotICAgICR4ZmVyID0gMDsKLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKLSAgICBpZiAoJG1lc3NhZ2UgPSAkdGhpcy0+Z2V0TWVzc2FnZSgpKSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZTo6U1RSSU5HLCAxKTsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RyaW5nKCRtZXNzYWdlKTsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKLSAgICB9Ci0gICAgaWYgKCRjb2RlID0gJHRoaXMtPmdldENvZGUoKSkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVFR5cGU6OkkzMiwgMik7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUkzMigkY29kZSk7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDY4NDMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKLQotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotdXNlIFRocmlmdFxCYXNlXFRCYXNlOwotCi0vKioKLSAqIE5PVEUobWNzbGVlKTogVGhpcyBjdXJyZW50bHkgY29udGFpbnMgYSB0b24gb2YgZHVwbGljYXRlZCBjb2RlIGZyb20gVEJhc2UKLSAqIGJlY2F1c2Ugd2UgbmVlZCB0byBzYXZlIENQVSBjeWNsZXMgYW5kIHRoaXMgaXMgbm90IHlldCBpbiBhbiBleHRlbnNpb24uCi0gKiBJZGVhbGx5IHdlJ2QgbXVsdGlwbHktaW5oZXJpdCBURXhjZXB0aW9uIGZyb20gYm90aCBFeGNlcHRpb24gYW5kIEJhc2UsIGJ1dAotICogdGhhdCdzIG5vdCBwb3NzaWJsZSBpbiBQSFAgYW5kIHRoZXJlIGFyZSBubyBtb2R1bGVzIGVpdGhlciwgc28gZm9yIG5vdyB3ZQotICogYXBvbG9nZXRpY2FsbHkgdGFrZSBhIHRyaXAgdG8gSGFja1Rvd24uCi0gKgotICogQ2FuIGJlIGNhbGxlZCB3aXRoIHN0YW5kYXJkIEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciAobWVzc2FnZSwgY29kZSkgb3Igd2l0aAotICogVGhyaWZ0IEJhc2Ugb2JqZWN0IGNvbnN0cnVjdG9yIChzcGVjLCB2YWxzKS4KLSAqCi0gKiBAcGFyYW0gbWl4ZWQgJHAxIE1lc3NhZ2UgKHN0cmluZykgb3IgdHlwZS1zcGVjIChhcnJheSkKLSAqIEBwYXJhbSBtaXhlZCAkcDIgQ29kZSAoaW50ZWdlcikgb3IgdmFsdWVzIChhcnJheSkKLSAqLwotY2xhc3MgVEV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KLXsKLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwMT1udWxsLCAkcDI9MCkKLSAgewotICAgIGlmIChpc19hcnJheSgkcDEpICYmIGlzX2FycmF5KCRwMikpIHsKLSAgICAgICRzcGVjID0gJHAxOwotICAgICAgJHZhbHMgPSAkcDI7Ci0gICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewotICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKLSAgICAgICAgaWYgKGlzc2V0KCR2YWxzWyR2YXJdKSkgewotICAgICAgICAgICR0aGlzLT4kdmFyID0gJHZhbHNbJHZhcl07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcDEsICRwMik7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljICR0bWV0aG9kID0gYXJyYXkoVFR5cGU6OkJPT0wgICA9PiAnQm9vbCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpCWVRFICAgPT4gJ0J5dGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STE2ICAgID0+ICdJMTYnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STMyICAgID0+ICdJMzInLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STY0ICAgID0+ICdJNjQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6RE9VQkxFID0+ICdEb3VibGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6U1RSSU5HID0+ICdTdHJpbmcnKTsKLQotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTWFwKCYkdmFyLCAkc3BlYywgJGlucHV0KQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwotICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwotICAgICRrcmVhZCA9ICR2cmVhZCA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgewotICAgICAgJGtyZWFkID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFska3R5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107Ci0gICAgfQotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKLSAgICAgICR2cmVhZCA9ICdyZWFkJy5UQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKLSAgICB9IGVsc2UgewotICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOwotICAgIH0KLSAgICAkdmFyID0gYXJyYXkoKTsKLSAgICAkX2t0eXBlID0gJF92dHlwZSA9ICRzaXplID0gMDsKLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigkX2t0eXBlLCAkX3Z0eXBlLCAkc2l6ZSk7Ci0gICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKLSAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKLSAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4ka3JlYWQoJGtleSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCRrdHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOwotICAgICAgICAgICRrZXkgPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgJHhmZXIgKz0gJGtleS0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRrZXksICRrc3BlYywgJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoJHZyZWFkICE9PSBudWxsKSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JHZyZWFkKCR2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICR2c3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAkdmFsID0gbmV3ICRjbGFzcygpOwotICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkdmFsLCAkdnNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJHZhclska2V5XSA9ICR2YWw7Ci0gICAgfQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQ9ZmFsc2UpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107Ci0gICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7Ci0gICAgICAkZXJlYWQgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgfQotICAgICR2YXIgPSBhcnJheSgpOwotICAgICRfZXR5cGUgPSAkc2l6ZSA9IDA7Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCRfZXR5cGUsICRzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKLSAgICB9Ci0gICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKLSAgICAgICRlbGVtID0gbnVsbDsKLSAgICAgIGlmICgkZXJlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZXJlYWQoJGVsZW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKLSAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICRlc3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAkeGZlciArPSAkZWxlbS0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoJHNldCkgewotICAgICAgICAkdmFyWyRlbGVtXSA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkdmFyIFtdPSAkZWxlbTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKLSAgewotICAgICR4ZmVyID0gMDsKLSAgICAkZm5hbWUgPSBudWxsOwotICAgICRmdHlwZSA9IDA7Ci0gICAgJGZpZCA9IDA7Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbigkZm5hbWUsICRmdHlwZSwgJGZpZCk7Ci0gICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGlzc2V0KCRzcGVjWyRmaWRdKSkgewotICAgICAgICAkZnNwZWMgPSAkc3BlY1skZmlkXTsKLSAgICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107Ci0gICAgICAgIGlmICgkZnR5cGUgPT0gJGZzcGVjWyd0eXBlJ10pIHsKLSAgICAgICAgICAkeGZlciA9IDA7Ci0gICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgewotICAgICAgICAgICAgJGZ1bmMgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV07Ci0gICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAgICAgJGNsYXNzID0gJGZzcGVjWydjbGFzcyddOwotICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgIH0KLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7Ci0gICAgfQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107Ci0gICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107Ci0gICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOwotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGt0eXBlXSkpIHsKLSAgICAgICRrd3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFska3R5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107Ci0gICAgfQotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKLSAgICAgICR2d3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskdnR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwQmVnaW4oJGt0eXBlLCAkdnR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgewotICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRrd3JpdGUoJGtleSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCRrdHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCRrZXksICRrc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChpc3NldCgkdndyaXRlKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICR2YWwtPndyaXRlKCRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdmFsLCAkdnNwZWMsICRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdmFsLCAkdnNwZWMsICRvdXRwdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLQotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107Ci0gICAgJGV3cml0ZSA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgewotICAgICAgJGV3cml0ZSA9ICd3cml0ZScuVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgfQotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICB9Ci0gICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKLSAgICAgICRlbGVtID0gJHNldCA/ICRrZXkgOiAkdmFsOwotICAgICAgaWYgKGlzc2V0KCRld3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGVsZW0sICRlc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoJHNldCkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKLSAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewotICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107Ci0gICAgICBpZiAoJHRoaXMtPiR2YXIgIT09IG51bGwpIHsKLSAgICAgICAgJGZ0eXBlID0gJGZzcGVjWyd0eXBlJ107Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigkdmFyLCAkZnR5cGUsICRmaWQpOwotICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7Ci0gICAgICAgICAgJGZ1bmMgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskZnR5cGVdOwotICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgewotICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgICB9Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzEzNWMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKiBAYXV0aG9yOiBybWFyaW4gKG1hcmluLnJhZHVAZmFjZWJvb2suY29tKQotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOwotCi0vKioKLSAqIFByb3RvY29sIG1vZHVsZS4gQ29udGFpbnMgYWxsIHRoZSB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAotICogYSBwcm90b2NvbCBlbmNvZGVyL2RlY29kZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotLyoqCi0gKiBQcm90b2NvbCBleGNlcHRpb25zCi0gKi8KLWNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KLXsKLSAgY29uc3QgVU5LTk9XTiA9IDA7Ci0gIGNvbnN0IElOVkFMSURfREFUQSA9IDE7Ci0gIGNvbnN0IE5FR0FUSVZFX1NJWkUgPSAyOwotICBjb25zdCBTSVpFX0xJTUlUID0gMzsKLSAgY29uc3QgQkFEX1ZFUlNJT04gPSA0OwotICBjb25zdCBOT1RfSU1QTEVNRU5URUQgPSA1OwotICBjb25zdCBERVBUSF9MSU1JVCA9IDY7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlPW51bGwsICRjb2RlPTApCi0gIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDc0NDY3Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247Ci0KLS8qKgotICogVHJhbnNwb3J0IGV4Y2VwdGlvbnMKLSAqLwotY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KLXsKLSAgY29uc3QgVU5LTk9XTiA9IDA7Ci0gIGNvbnN0IE5PVF9PUEVOID0gMTsKLSAgY29uc3QgQUxSRUFEWV9PUEVOID0gMjsKLSAgY29uc3QgVElNRURfT1VUID0gMzsKLSAgY29uc3QgRU5EX09GX0ZJTEUgPSA0OwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKQotICB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzFjNGE3Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OwotCi11c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbDsKLQotLyoqCi0gKiBCaW5hcnkgUHJvdG9jb2wgRmFjdG9yeQotICovCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeQotewotICBwcml2YXRlICRzdHJpY3RSZWFkXyA9IGZhbHNlOwotICBwcml2YXRlICRzdHJpY3RXcml0ZV8gPSBmYWxzZTsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHN0cmljdFJlYWQ9ZmFsc2UsICRzdHJpY3RXcml0ZT1mYWxzZSkKLSAgewotICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOwotICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woJHRyYW5zKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zLCAkdGhpcy0+c3RyaWN0UmVhZF8sICR0aGlzLT5zdHJpY3RXcml0ZV8pOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YjRmZTMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OwotCi11c2UgVGhyaWZ0XFByb3RvY29sXFRDb21wYWN0UHJvdG9jb2w7Ci0KLS8qKgotICogQ29tcGFjdCBQcm90b2NvbCBGYWN0b3J5Ci0gKi8KLWNsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeQotewotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woJHRyYW5zKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKCR0cmFucyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTU2MmQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7Ci0KLS8qKgotICogUHJvdG9jb2wgZmFjdG9yeSBjcmVhdGVzIHByb3RvY29sIG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCi0gKi8KLWludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5Ci17Ci0gIC8qKgotICAgKiBCdWlsZCBhIHByb3RvY29sIGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEByZXR1cm4gVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbCBwcm90b2NvbAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucyk7Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkNjgzOS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKLQotdXNlIFRocmlmdFxTdHJpbmdGdW5jXE1ic3RyaW5nOwotdXNlIFRocmlmdFxTdHJpbmdGdW5jXENvcmU7Ci0KLWNsYXNzIFRTdHJpbmdGdW5jRmFjdG9yeQotewotICAgIHByaXZhdGUgc3RhdGljICRfaW5zdGFuY2U7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiBUU3RyaW5nRnVuYyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzCi0gICAgICogY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHN5c3RlbSdzIG1ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQgc2V0dGluZ3MuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRTdHJpbmdGdW5jCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoKQotICAgIHsKLSAgICAgICAgaWYgKCFzZWxmOjokX2luc3RhbmNlKSB7Ci0gICAgICAgICAgICBzZWxmOjpfc2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZWxmOjokX2luc3RhbmNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9zZXRJbnN0YW5jZSgpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2Fubm90IHVzZSBzdHIqIGZ1bmN0aW9ucyBmb3IgYnl0ZSBjb3VudGluZyBiZWNhdXNlIG11bHRpYnl0ZQotICAgICAgICAgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVhZCBhIHNpbmdsZSBieXRlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogU2VlOiBodHRwOi8vdXMucGhwLm5ldC9tYW51YWwvZW4vbWJzdHJpbmcub3ZlcmxvYWQucGhwCi0gICAgICAgICAqLwotICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMikgewotICAgICAgICAgICAgc2VsZjo6JF9pbnN0YW5jZSA9IG5ldyBNYnN0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBtYnN0cmluZyBpcyBub3QgaW5zdGFsbGVkIG9yIGRvZXMgbm90IGhhdmUgZnVuY3Rpb24gb3ZlcmxvYWRpbmcKLSAgICAgICAgICogb2YgdGhlIHN0ciogZnVuY3Rpb25zIGVuYWJsZWQgc28gdXNlIFBIUCBjb3JlIHN0ciogZnVuY3Rpb25zIGZvcgotICAgICAgICAgKiBieXRlIGNvdW50aW5nLgotICAgICAgICAgKi8KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzZWxmOjokX2luc3RhbmNlID0gbmV3IENvcmUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyYjVmNC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3BocAotCi1uYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7Ci0KLWNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5Ci17Ci0gIC8qKgotICAgKiBAc3RhdGljCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQKLSAgICogQHJldHVybiBUVHJhbnNwb3J0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydChUVHJhbnNwb3J0ICR0cmFuc3BvcnQpCi0gIHsKLSAgICByZXR1cm4gJHRyYW5zcG9ydDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2YTEwMy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOwotCi11c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIEJpbmFyeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sLgotICoKLSAqLwotY2xhc3MgVEJpbmFyeVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCi17Ci0gIGNvbnN0IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7Ci0gIGNvbnN0IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7Ci0KLSAgcHJvdGVjdGVkICRzdHJpY3RSZWFkXyA9IGZhbHNlOwotICBwcm90ZWN0ZWQgJHN0cmljdFdyaXRlXyA9IHRydWU7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQ9ZmFsc2UsICRzdHJpY3RXcml0ZT10cnVlKQotICB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOwotICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOwotICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpCi0gIHsKLSAgICBpZiAoJHRoaXMtPnN0cmljdFdyaXRlXykgewotICAgICAgJHZlcnNpb24gPSBzZWxmOjpWRVJTSU9OXzEgfCAkdHlwZTsKLQotICAgICAgcmV0dXJuCi0gICAgICAgICR0aGlzLT53cml0ZUkzMigkdmVyc2lvbikgKwotICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzZXFpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybgotICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNlcWlkKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpCi0gIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGZpZWxkVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTE2KCRmaWVsZElkKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKLSAgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPndyaXRlQnl0ZShUVHlwZTo6U1RPUCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKQotICB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRrZXlUeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCR2YWxUeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCi0gIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCi0gIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUgPyAxIDogMCk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOwotCi0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCR2YWx1ZSkKLSAgewotICAgICRkYXRhID0gcGFjaygnYycsICR2YWx1ZSk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOwotCi0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSBwYWNrKCduJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMik7Ci0KLSAgICByZXR1cm4gMjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9IHBhY2soJ04nLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA0KTsKLQotICAgIHJldHVybiA0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCR2YWx1ZSkKLSAgewotICAgIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCi0gICAgLy8gNjQtYml0IHR3b3MtY29tcGxlbWVudCBhcml0aG1ldGljIHNpbmNlIFBIUCB3YW50cyB0byB0cmVhdCBhbGwgaW50cwotICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKLSAgICBpZiAoUEhQX0lOVF9TSVpFID09IDQpIHsKLSAgICAgICRuZWcgPSAkdmFsdWUgPCAwOwotCi0gICAgICBpZiAoJG5lZykgewotICAgICAgICAkdmFsdWUgKj0gLTE7Ci0gICAgICB9Ci0KLSAgICAgICRoaSA9IChpbnQpICgkdmFsdWUgLyA0Mjk0OTY3Mjk2KTsKLSAgICAgICRsbyA9IChpbnQpICR2YWx1ZTsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJGhpID0gfiRoaTsKLSAgICAgICAgJGxvID0gfiRsbzsKLSAgICAgICAgaWYgKCgkbG8gJiAoaW50KSAweGZmZmZmZmZmKSA9PSAoaW50KSAweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgJGxvID0gMDsKLSAgICAgICAgICAkaGkrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkbG8rKzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAkaGkgPSAkdmFsdWUgPj4gMzI7Ci0gICAgICAkbG8gPSAkdmFsdWUgJiAweEZGRkZGRkZGOwotICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKLSAgICB9Ci0KLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgOCk7Ci0KLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9IHBhY2soJ2QnLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKHN0cnJldigkZGF0YSksIDgpOwotCi0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHZhbHVlKQotICB7Ci0gICAgJGxlbiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdmFsdWUpOwotICAgICRyZXN1bHQgPSAkdGhpcy0+d3JpdGVJMzIoJGxlbik7Ci0gICAgaWYgKCRsZW4pIHsKLSAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCR2YWx1ZSwgJGxlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCi0gIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJHN6KTsKLSAgICBpZiAoJHN6IDwgMCkgewotICAgICAgJHZlcnNpb24gPSAoaW50KSAoJHN6ICYgc2VsZjo6VkVSU0lPTl9NQVNLKTsKLSAgICAgIGlmICgkdmVyc2lvbiAhPSAoaW50KSBzZWxmOjpWRVJTSU9OXzEpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJy4kc3osIFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOwotICAgICAgfQotICAgICAgJHR5cGUgPSAkc3ogJiAweDAwMDAwMGZmOwotICAgICAgJHJlc3VsdCArPQotICAgICAgICAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSkgKwotICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoJHRoaXMtPnN0cmljdFJlYWRfKSB7Ci0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ05vIHZlcnNpb24gaWRlbnRpZmllciwgb2xkIHByb3RvY29sIGNsaWVudD8nLCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEhhbmRsZSBwcmUtdmVyc2lvbmVkIGlucHV0Ci0gICAgICAgICRuYW1lID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkc3opOwotICAgICAgICAkcmVzdWx0ICs9Ci0gICAgICAgICAgJHN6ICsKLSAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJHR5cGUpICsKLSAgICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCi0gIHsKLSAgICAkbmFtZSA9ICcnOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCi0gIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRCeXRlKCRmaWVsZFR5cGUpOwotICAgIGlmICgkZmllbGRUeXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAkZmllbGRJZCA9IDA7Ci0KLSAgICAgIHJldHVybiAkcmVzdWx0OwotICAgIH0KLSAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkSTE2KCRmaWVsZElkKTsKLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKLSAgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPnJlYWRCeXRlKCRrZXlUeXBlKSArCi0gICAgICAkdGhpcy0+cmVhZEJ5dGUoJHZhbFR5cGUpICsKLSAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQotICB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+cmVhZEJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+cmVhZEkzMigkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQotICB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKLSAgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQotICB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiR2YWx1ZSkKLSAgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV0gPT0gMTsKLQotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotCi0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDIpOwotICAgICRhcnIgPSB1bnBhY2soJ24nLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLSAgICBpZiAoJHZhbHVlID4gMHg3ZmZmKSB7Ci0gICAgICAkdmFsdWUgPSAwIC0gKCgkdmFsdWUgLSAxKSBeIDB4ZmZmZik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDI7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDQpOwotICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLSAgICBpZiAoJHZhbHVlID4gMHg3ZmZmZmZmZikgewotICAgICAgJHZhbHVlID0gMCAtICgoJHZhbHVlIC0gMSkgXiAweGZmZmZmZmZmKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gNDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCk7Ci0KLSAgICAkYXJyID0gdW5wYWNrKCdOMicsICRkYXRhKTsKLQotICAgIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCi0gICAgLy8gNjQtYml0IHR3b3MtY29tcGxlbWVudCBhcml0aG1ldGljIHNpbmNlIFBIUCB3YW50cyB0byB0cmVhdCBhbGwgaW50cwotICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKLSAgICBpZiAoUEhQX0lOVF9TSVpFID09IDQpIHsKLQotICAgICAgJGhpID0gJGFyclsxXTsKLSAgICAgICRsbyA9ICRhcnJbMl07Ci0gICAgICAkaXNOZWcgPSAkaGkgIDwgMDsKLQotICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKLSAgICAgIGlmICgkaXNOZWcpIHsKLSAgICAgICAgJGhpID0gfiRoaSAmIChpbnQpIDB4ZmZmZmZmZmY7Ci0gICAgICAgICRsbyA9IH4kbG8gJiAoaW50KSAweGZmZmZmZmZmOwotCi0gICAgICAgIGlmICgkbG8gPT0gKGludCkgMHhmZmZmZmZmZikgewotICAgICAgICAgICRoaSsrOwotICAgICAgICAgICRsbyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJGxvKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gRm9yY2UgMzJiaXQgd29yZHMgaW4gZXhjZXNzIG9mIDJHIHRvIHBlIHBvc2l0aXZlIC0gd2UgZGVhbCB3aWdoIHNpZ24KLSAgICAgIC8vIGV4cGxpY2l0bHkgYmVsb3cKLQotICAgICAgaWYgKCRoaSAmIChpbnQpIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGhpICY9IChpbnQpIDB4N2ZmZmZmZmY7Ci0gICAgICAgICRoaSArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICBpZiAoJGxvICYgKGludCkgMHg4MDAwMDAwMCkgewotICAgICAgICAkbG8gJj0gKGludCkgMHg3ZmZmZmZmZjsKLSAgICAgICAgJGxvICs9IDB4ODAwMDAwMDA7Ci0gICAgICB9Ci0KLSAgICAgICR2YWx1ZSA9ICRoaSAqIDQyOTQ5NjcyOTYgKyAkbG87Ci0KLSAgICAgIGlmICgkaXNOZWcpIHsKLSAgICAgICAgJHZhbHVlID0gMCAtICR2YWx1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotCi0gICAgICAvLyBVcGNhc3QgbmVnYXRpdmVzIGluIExTQiBiaXQKLSAgICAgIGlmICgkYXJyWzJdICYgMHg4MDAwMDAwMCkgewotICAgICAgICAkYXJyWzJdID0gJGFyclsyXSAmIDB4ZmZmZmZmZmY7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCi0gICAgICBpZiAoJGFyclsxXSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gJiAweGZmZmZmZmZmOwotICAgICAgICAkYXJyWzFdID0gJGFyclsxXSBeIDB4ZmZmZmZmZmY7Ci0gICAgICAgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhmZmZmZmZmZjsKLSAgICAgICAgJHZhbHVlID0gMCAtICRhcnJbMV0qNDI5NDk2NzI5NiAtICRhcnJbMl0gLSAxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJHZhbHVlID0gJGFyclsxXSo0Mjk0OTY3Mjk2ICsgJGFyclsyXTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9IHN0cnJldigkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDgpKTsKLSAgICAkYXJyID0gdW5wYWNrKCdkJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0KLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkdmFsdWUpCi0gIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJGxlbik7Ci0gICAgaWYgKCRsZW4pIHsKLSAgICAgICR2YWx1ZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR2YWx1ZSA9ICcnOwotICAgIH0KLQotICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTBiYjkuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydDsKLQotLyoqCi0gKiBBY2NlbGVyYXRlZCBiaW5hcnkgcHJvdG9jb2w6IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgdGhyaWZ0X3Byb3RvY29sCi0gKiBleHRlbnNpb24gZm9yIGZhc3RlciBkZXNlcmlhbGl6YXRpb24KLSAqLwotY2xhc3MgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgZXh0ZW5kcyBUQmluYXJ5UHJvdG9jb2wKLXsKLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQ9ZmFsc2UsICRzdHJpY3RXcml0ZT10cnVlKQotICB7Ci0gICAgLy8gSWYgdGhlIHRyYW5zcG9ydCBkb2Vzbid0IGltcGxlbWVudCBwdXRCYWNrLCB3cmFwIGl0IGluIGEKLSAgICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQgKHdoaWNoIGRvZXMpCi0KLSAgICAvLyBOT1RFICh0LmhlaW50eik6IFRoaXMgaXMgdmVyeSBldmlsIHRvIGRvLCBiZWNhdXNlIHRoZSBUQnVmZmVyZWRUcmFuc3BvcnQgbWF5IHN3YWxsb3cgYnl0ZXMsIHdoaWNoCi0gICAgLy8gYXJlIHRoZW4gbmV2ZXIgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuIFRoaXMgaGFwcGVucyBwcmVjaXNlbHkgd2hlbiBhIG51bWJlciBvZiBieXRlcwotICAgIC8vIGxlc3MgdGhhbiB0aGUgbWF4IGJ1ZmZlciBzaXplICg1MTIgYnkgZGVmYXVsdCkgaXMgd3JpdHRlbiB0byB0aGUgdHJhbnNwb3J0IGFuZCB0aGVuIGZsdXNoKCkgaXMgTk9UCi0gICAgLy8gY2FsbGVkLiBJbiB0aGF0IGNhc2UgdGhlIGRhdGEgc3RheXMgaW4gdGhlIHdyaXRlQnVmZmVyIG9mIHRoZSB0cmFuc3BvcnQsIGZyb20gd2hlcmUgaXQgY2FuIG5ldmVyIGJlCi0gICAgLy8gYWNjZXNzZWQgYWdhaW4gKGZvciBleGFtcGxlIHRocm91Z2ggcmVhZCgpKS4KLSAgICAvLwotICAgIC8vIFNpbmNlIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgZG9lcyBub3Qga25vdyBhYm91dCB0aGUgd3JhcHBpbmcgdHJhbnNwb3J0LCB0aGlzIGNyZWF0ZXMgYnVncyB3aGljaAotICAgIC8vIGFyZSB2ZXJ5IGRpZmZpY3VsdCB0byBmaW5kLiBIZW5jZSB0aGUgd3JhcHBpbmcgb2YgYSB0cmFuc3BvcnQgaW4gYSBidWZmZXIgc2hvdWxkIGJlIGxlZnQgdG8gdGhlCi0gICAgLy8gY2FsbGluZyBjb2RlLiBBbiBpbnRlcmZhY2UgY291bGQgdXNlZCB0byBtYW5kYXRlIHRoZSBwcmVzZW5jZSBvZiB0aGUgcHV0QmFjaygpIG1ldGhvZCBpbiB0aGUgdHJhbnNwb3J0LgotICAgIC8vCi0gICAgLy8gSSBhbSBsZWF2aW5nIHRoaXMgY29kZSBpbiBub25ldGhlbGVzcywgYmVjYXVzZSB0aGVyZSBtYXkgYmUgYXBwbGljYXRpb25zIGRlcGVuZGluZyBvbiB0aGlzIGJlaGF2aW9yLgotICAgIC8vCi0gICAgLy8gQHNlZSBUSFJJRlQtMTU3OQotCi0gICAgaWYgKCFtZXRob2RfZXhpc3RzKCR0cmFucywgJ3B1dEJhY2snKSkgewotICAgICAgJHRyYW5zID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgkdHJhbnMpOwotICAgIH0KLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQsICRzdHJpY3RXcml0ZSk7Ci0gIH0KLSAgcHVibGljIGZ1bmN0aW9uIGlzU3RyaWN0UmVhZCgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnN0cmljdFJlYWRfOwotICB9Ci0gIHB1YmxpYyBmdW5jdGlvbiBpc1N0cmljdFdyaXRlKCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+c3RyaWN0V3JpdGVfOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NzAzNTEuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNzUzICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcVHlwZVxUVHlwZTsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogQ29tcGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sLgotICoKLSAqLwotY2xhc3MgVENvbXBhY3RQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbAotewotICBjb25zdCBDT01QQUNUX1NUT1AgPSAweDAwOwotICBjb25zdCBDT01QQUNUX1RSVUUgPSAweDAxOwotICBjb25zdCBDT01QQUNUX0ZBTFNFID0gMHgwMjsKLSAgY29uc3QgQ09NUEFDVF9CWVRFID0gMHgwMzsKLSAgY29uc3QgQ09NUEFDVF9JMTYgPSAweDA0OwotICBjb25zdCBDT01QQUNUX0kzMiA9IDB4MDU7Ci0gIGNvbnN0IENPTVBBQ1RfSTY0ID0gMHgwNjsKLSAgY29uc3QgQ09NUEFDVF9ET1VCTEUgPSAweDA3OwotICBjb25zdCBDT01QQUNUX0JJTkFSWSA9IDB4MDg7Ci0gIGNvbnN0IENPTVBBQ1RfTElTVCA9IDB4MDk7Ci0gIGNvbnN0IENPTVBBQ1RfU0VUID0gMHgwQTsKLSAgY29uc3QgQ09NUEFDVF9NQVAgPSAweDBCOwotICBjb25zdCBDT01QQUNUX1NUUlVDVCA9IDB4MEM7Ci0KLSAgY29uc3QgU1RBVEVfQ0xFQVIgPSAwOwotICBjb25zdCBTVEFURV9GSUVMRF9XUklURSA9IDE7Ci0gIGNvbnN0IFNUQVRFX1ZBTFVFX1dSSVRFID0gMjsKLSAgY29uc3QgU1RBVEVfQ09OVEFJTkVSX1dSSVRFID0gMzsKLSAgY29uc3QgU1RBVEVfQk9PTF9XUklURSA9IDQ7Ci0gIGNvbnN0IFNUQVRFX0ZJRUxEX1JFQUQgPSA1OwotICBjb25zdCBTVEFURV9DT05UQUlORVJfUkVBRCA9IDY7Ci0gIGNvbnN0IFNUQVRFX1ZBTFVFX1JFQUQgPSA3OwotICBjb25zdCBTVEFURV9CT09MX1JFQUQgPSA4OwotCi0gIGNvbnN0IFZFUlNJT05fTUFTSyA9IDB4MWY7Ci0gIGNvbnN0IFZFUlNJT04gPSAxOwotICBjb25zdCBQUk9UT0NPTF9JRCA9IDB4ODI7Ci0gIGNvbnN0IFRZUEVfTUFTSyA9IDB4ZTA7Ci0gIGNvbnN0IFRZUEVfQklUUyA9IDB4MDc7Ci0gIGNvbnN0IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKLQotICBwcm90ZWN0ZWQgc3RhdGljICRjdHlwZXMgPSBhcnJheSgKLSAgICBUVHlwZTo6U1RPUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUT1AsCi0gICAgVFR5cGU6OkJPT0wgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFLCAvLyB1c2VkIGZvciBjb2xsZWN0aW9uCi0gICAgVFR5cGU6OkJZVEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFLAotICAgIFRUeXBlOjpJMTYgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMTYsCi0gICAgVFR5cGU6OkkzMiA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kzMiwKLSAgICBUVHlwZTo6STY0ID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTY0LAotICAgIFRUeXBlOjpET1VCTEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9ET1VCTEUsCi0gICAgVFR5cGU6OlNUUklORyA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JJTkFSWSwKLSAgICBUVHlwZTo6U1RSVUNUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU1RSVUNULAotICAgIFRUeXBlOjpMU1QgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9MSVNULAotICAgIFRUeXBlOjpTRVQgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TRVQsCi0gICAgVFR5cGU6Ok1BUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX01BUCwKLSAgKTsKLQotICBwcm90ZWN0ZWQgc3RhdGljICR0dHlwZXMgPSBhcnJheSgKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUT1AgPT4gVFR5cGU6OlNUT1AgLAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfVFJVRSA9PiBUVHlwZTo6Qk9PTCwgLy8gdXNlZCBmb3IgY29sbGVjdGlvbgotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRkFMU0UgPT4gVFR5cGU6OkJPT0wsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFID0+IFRUeXBlOjpCWVRFLAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTE2ID0+IFRUeXBlOjpJMTYsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMzIgPT4gVFR5cGU6OkkzMiwKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0k2NCA9PiBUVHlwZTo6STY0LAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRE9VQkxFID0+IFRUeXBlOjpET1VCTEUsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CSU5BUlkgPT4gVFR5cGU6OlNUUklORywKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUUlVDVCA9PiBUVHlwZTo6U1RSVUNULAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTElTVCA9PiBUVHlwZTo6TFNULAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU0VUID0+IFRUeXBlOjpTRVQsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9NQVAgPT4gVFR5cGU6Ok1BUCwKLSAgKTsKLQotICBwcm90ZWN0ZWQgJHN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ0xFQVI7Ci0gIHByb3RlY3RlZCAkbGFzdEZpZCA9IDA7Ci0gIHByb3RlY3RlZCAkYm9vbEZpZCA9IG51bGw7Ci0gIHByb3RlY3RlZCAkYm9vbFZhbHVlID0gbnVsbDsKLSAgcHJvdGVjdGVkICRzdHJ1Y3RzID0gYXJyYXkoKTsKLSAgcHJvdGVjdGVkICRjb250YWluZXJzID0gYXJyYXkoKTsKLQotICAvLyBTb21lIHZhcmludCAvIHppZ3phZyBoZWxwZXIgbWV0aG9kcwotICBwdWJsaWMgZnVuY3Rpb24gdG9aaWdaYWcoJG4sICRiaXRzKQotICB7Ci0gICAgcmV0dXJuICgkbiA8PCAxKSBeICgkbiA+PiAoJGJpdHMgLSAxKSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZnJvbVppZ1phZygkbikKLSAgewotICAgIHJldHVybiAoJG4gPj4gMSkgXiAtKCRuICYgMSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFyaW50KCRkYXRhKQotICB7Ci0gICAgJG91dCA9ICIiOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpZiAoKCRkYXRhICYgfjB4N2YpID09PSAwKSB7Ci0gICAgICAgICRvdXQgLj0gY2hyKCRkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkb3V0IC49IGNocigoJGRhdGEgJiAweGZmKSB8IDB4ODApOwotICAgICAgICAkZGF0YSA9ICRkYXRhID4+IDc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICRvdXQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVWYXJpbnQoJGRhdGEpCi0gIHsKLSAgICAkb3V0ID0gJHRoaXMtPmdldFZhcmludCgkZGF0YSk7Ci0gICAgJHJlc3VsdCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkb3V0KTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkb3V0LCAkcmVzdWx0KTsKLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRWYXJpbnQoJiRyZXN1bHQpCi0gIHsKLSAgICAkaWR4ID0gMDsKLSAgICAkc2hpZnQgPSAwOwotICAgICRyZXN1bHQgPSAwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAkeCA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgICAkYXJyID0gdW5wYWNrKCdDJywgJHgpOwotICAgICAgJGJ5dGUgPSAkYXJyWzFdOwotICAgICAgJGlkeCArPSAxOwotICAgICAgJHJlc3VsdCB8PSAoJGJ5dGUgJiAweDdmKSA8PCAkc2hpZnQ7Ci0gICAgICBpZiAoKCRieXRlID4+IDcpID09PSAwKSB7Ci0gICAgICAgIHJldHVybiAkaWR4OwotICAgICAgfQotICAgICAgJHNoaWZ0ICs9IDc7Ci0gICAgfQotCi0gICAgcmV0dXJuICRpZHg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQotICB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQotICB7Ci0gICAgJHdyaXR0ZW4gPQotICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQpICsKLSAgICAgICR0aGlzLT53cml0ZVVCeXRlKFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT04gfAotICAgICAgICAgICAgICAgICAgICAgICAgKCR0eXBlIDw8IFRDb21wYWN0UHJvdG9jb2w6OlRZUEVfU0hJRlRfQU1PVU5UKSkgKwotICAgICAgJHRoaXMtPndyaXRlVmFyaW50KCRzZXFpZCkgKwotICAgICAgJHRoaXMtPndyaXRlU3RyaW5nKCRuYW1lKTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9XUklURTsKLQotICAgIHJldHVybiAkd3JpdHRlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKQotICB7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ0xFQVI7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQotICB7Ci0gICAgJHRoaXMtPnN0cnVjdHNbXSA9IGFycmF5KCR0aGlzLT5zdGF0ZSwgJHRoaXMtPmxhc3RGaWQpOwotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1dSSVRFOwotICAgICR0aGlzLT5sYXN0RmlkID0gMDsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkKLSAgewotICAgICRvbGRfdmFsdWVzID0gYXJyYXlfcG9wKCR0aGlzLT5zdHJ1Y3RzKTsKLSAgICAkdGhpcy0+c3RhdGUgPSAkb2xkX3ZhbHVlc1swXTsKLSAgICAkdGhpcy0+bGFzdEZpZCA9ICRvbGRfdmFsdWVzWzFdOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZUJ5dGUoMCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEhlYWRlcigkdHlwZSwgJGZpZCkKLSAgewotICAgICR3cml0dGVuID0gMDsKLSAgICAkZGVsdGEgPSAkZmlkIC0gJHRoaXMtPmxhc3RGaWQ7Ci0gICAgaWYgKDAgPCAkZGVsdGEgJiYgJGRlbHRhIDw9IDE1KSB7Ci0gICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVVCeXRlKCgkZGVsdGEgPDwgNCkgfCAkdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVJMTYoJGZpZCk7Ci0gICAgfQotICAgICR0aGlzLT5sYXN0RmlkID0gJGZpZDsKLQotICAgIHJldHVybiAkd3JpdHRlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkX25hbWUsICRmaWVsZF90eXBlLCAkZmllbGRfaWQpCi0gIHsKLSAgICBpZiAoJGZpZWxkX3R5cGUgPT0gVFRZUEU6OkJPT0wpIHsKLSAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfV1JJVEU7Ci0gICAgICAkdGhpcy0+Ym9vbEZpZCA9ICRmaWVsZF9pZDsKLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX1ZBTFVFX1dSSVRFOwotCi0gICAgICByZXR1cm4gJHRoaXMtPndyaXRlRmllbGRIZWFkZXIoc2VsZjo6JGN0eXBlc1skZmllbGRfdHlwZV0sICRmaWVsZF9pZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQotICB7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfV1JJVEU7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25CZWdpbigkZXR5cGUsICRzaXplKQotICB7Ci0gICAgJHdyaXR0ZW4gPSAwOwotICAgIGlmICgkc2l6ZSA8PSAxNCkgewotICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVVQnl0ZSgkc2l6ZSA8PCA0IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRjdHlwZXNbJGV0eXBlXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoMHhmMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRjdHlwZXNbJGV0eXBlXSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVWYXJpbnQoJHNpemUpOwotICAgIH0KLSAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOwotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9XUklURTsKLQotICAgIHJldHVybiAkd3JpdHRlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlfdHlwZSwgJHZhbF90eXBlLCAkc2l6ZSkKLSAgewotICAgICR3cml0dGVuID0gMDsKLSAgICBpZiAoJHNpemUgPT0gMCkgewotICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVCeXRlKDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVZhcmludCgkc2l6ZSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVVQnl0ZShzZWxmOjokY3R5cGVzWyRrZXlfdHlwZV0gPDwgNCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRjdHlwZXNbJHZhbF90eXBlXSk7Ci0gICAgfQotICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7Ci0KLSAgICByZXR1cm4gJHdyaXR0ZW47Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uRW5kKCkKLSAgewotICAgICR0aGlzLT5zdGF0ZSA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGFpbmVycyk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkVuZCgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtX3R5cGUsICRzaXplKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbV90eXBlLCAkc2l6ZSkKLSAgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uQmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCR2YWx1ZSkKLSAgewotICAgIGlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9XUklURSkgewotICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRTsKLSAgICAgIGlmICgkdmFsdWUpIHsKLSAgICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFOwotICAgICAgfQotCi0gICAgICByZXR1cm4gJHRoaXMtPndyaXRlRmllbGRIZWFkZXIoJGN0eXBlLCAkdGhpcy0+Ym9vbEZpZCk7Ci0gICAgfSBlbHNlaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfV1JJVEUpIHsKLSAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVCeXRlKCR2YWx1ZSA/IDEgOiAwKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sJyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAxKTsKLQotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlVUJ5dGUoJGJ5dGUpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShwYWNrKCdDJywgJGJ5dGUpLCAxKTsKLQotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCR2YWx1ZSkKLSAgewotICAgICR0aGluZyA9ICR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDE2KTsKLQotICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaW5nKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkdmFsdWUpCi0gIHsKLSAgICAkdGhpbmcgPSAkdGhpcy0+dG9aaWdaYWcoJHZhbHVlLCAzMik7Ci0KLSAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGluZyk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgOCk7Ci0KLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkdmFsdWUpCi0gIHsKLSAgICAkbGVuID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR2YWx1ZSk7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT53cml0ZVZhcmludCgkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gJHJlc3VsdCArICRsZW47Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkX3R5cGUsICYkZmllbGRfaWQpCi0gIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkZmllbGRfdHlwZSk7Ci0KLSAgICBpZiAoKCRmaWVsZF90eXBlICYgMHgwZikgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICRmaWVsZF9pZCA9IDA7Ci0KLSAgICAgIHJldHVybiAkcmVzdWx0OwotICAgIH0KLSAgICAkZGVsdGEgPSAkZmllbGRfdHlwZSA+PiA0OwotICAgIGlmICgkZGVsdGEgPT0gMCkgewotICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEkxNigkZmllbGRfaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkZmllbGRfaWQgPSAkdGhpcy0+bGFzdEZpZCArICRkZWx0YTsKLSAgICB9Ci0gICAgJHRoaXMtPmxhc3RGaWQgPSAkZmllbGRfaWQ7Ci0gICAgJGZpZWxkX3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJGZpZWxkX3R5cGUgJiAweDBmKTsKLSAgICBpZiAoJGZpZWxkX3R5cGUgPT0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFKSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQ7Ci0gICAgICAkdGhpcy0+Ym9vbFZhbHVlID0gdHJ1ZTsKLSAgICB9IGVsc2VpZiAoJGZpZWxkX3R5cGUgPT0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRSkgewotICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9SRUFEOwotICAgICAgJHRoaXMtPmJvb2xWYWx1ZSA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9SRUFEOwotICAgIH0KLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCi0gIHsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9SRUFEOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFVCeXRlKCYkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgJGFyciA9IHVucGFjaygnQycsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotCi0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiR2YWx1ZSkKLSAgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0KLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkWmlnWmFnKCYkdmFsdWUpCi0gIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRWYXJpbnQoJHZhbHVlKTsKLSAgICAkdmFsdWUgPSAkdGhpcy0+ZnJvbVppZ1phZygkdmFsdWUpOwotCi0gICAgcmV0dXJuICRyZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKLSAgewotICAgICRwcm90b0lkID0gMDsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkcHJvdG9JZCk7Ci0gICAgaWYgKCRwcm90b0lkICE9IFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lEKSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgcHJvdG9jb2wgaWQgaW4gVENvbXBhY3QgbWVzc2FnZScpOwotICAgIH0KLSAgICAkdmVyVHlwZSA9IDA7Ci0gICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR2ZXJUeXBlKTsKLSAgICAkdHlwZSA9ICgkdmVyVHlwZSA+PiBUQ29tcGFjdFByb3RvY29sOjpUWVBFX1NISUZUX0FNT1VOVCkgJiBUQ29tcGFjdFByb3RvY29sOjpUWVBFX0JJVFM7Ci0gICAgJHZlcnNpb24gPSAkdmVyVHlwZSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSzsKLSAgICBpZiAoJHZlcnNpb24gIT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTikgewotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaW4gVENvbXBhY3QgbWVzc2FnZScpOwotICAgIH0KLSAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVmFyaW50KCRzZXFpZCk7Ci0gICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSk7Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQotICB7Ci0gICAgJG5hbWUgPSAnJzsgLy8gdW51c2VkCi0gICAgJHRoaXMtPnN0cnVjdHNbXSA9IGFycmF5KCR0aGlzLT5zdGF0ZSwgJHRoaXMtPmxhc3RGaWQpOwotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1JFQUQ7Ci0gICAgJHRoaXMtPmxhc3RGaWQgPSAwOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCi0gIHsKLSAgICAkbGFzdCA9IGFycmF5X3BvcCgkdGhpcy0+c3RydWN0cyk7Ci0gICAgJHRoaXMtPnN0YXRlID0gJGxhc3RbMF07Ci0gICAgJHRoaXMtPmxhc3RGaWQgPSAkbGFzdFsxXTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRDb2xsZWN0aW9uQmVnaW4oJiR0eXBlLCAmJHNpemUpCi0gIHsKLSAgICAkc2l6ZVR5cGUgPSAwOwotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRzaXplVHlwZSk7Ci0gICAgJHNpemUgPSAkc2l6ZVR5cGUgPj4gNDsKLSAgICAkdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkc2l6ZVR5cGUpOwotICAgIGlmICgkc2l6ZSA9PSAxNSkgewotICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFZhcmludCgkc2l6ZSk7Ci0gICAgfQotICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1JFQUQ7Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlfdHlwZSwgJiR2YWxfdHlwZSwgJiRzaXplKQotICB7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCRzaXplKTsKLSAgICAkdHlwZXMgPSAwOwotICAgIGlmICgkc2l6ZSA+IDApIHsKLSAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRVQnl0ZSgkdHlwZXMpOwotICAgIH0KLSAgICAkdmFsX3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJHR5cGVzKTsKLSAgICAka2V5X3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJHR5cGVzID4+IDQpOwotICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1JFQUQ7Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQ29sbGVjdGlvbkVuZCgpCi0gIHsKLSAgICAkdGhpcy0+c3RhdGUgPSBhcnJheV9wb3AoJHRoaXMtPmNvbnRhaW5lcnMpOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1fdHlwZSwgJiRzaXplKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbV90eXBlLCAmJHNpemUpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uQmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkdmFsdWUpCi0gIHsKLSAgICBpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfUkVBRCkgewotICAgICAgJHZhbHVlID0gJHRoaXMtPmJvb2xWYWx1ZTsKLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRCkgewotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQnl0ZSgkdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wnKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJHZhbHVlKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkWmlnWmFnKCR2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJHZhbHVlKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkWmlnWmFnKCR2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDgpOwotICAgICRhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLQotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkKLSAgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHZhbHVlID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgJHZhbHVlID0gJyc7Ci0gICAgfQotCi0gICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGdldFRUeXBlKCRieXRlKQotICB7Ci0gICAgcmV0dXJuIHNlbGY6OiR0dHlwZXNbJGJ5dGUgJiAweDBmXTsKLSAgfQotCi0gIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCi0gIC8vIDY0LWJpdCB0d29zLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBzaW5jZSBQSFAgd2FudHMgdG8gdHJlYXQgYWxsIGludHMKLSAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAotCi0gIC8vIFJlYWQgYW5kIHdyaXRlIEk2NCBhcyB0d28gMzIgYml0IG51bWJlcnMgJGhpIGFuZCAkbG8KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJHZhbHVlKQotICB7Ci0gICAgLy8gUmVhZCB2YXJpbnQgZnJvbSB3aXJlCi0gICAgJGhpID0gMDsKLSAgICAkbG8gPSAwOwotCi0gICAgJGlkeCA9IDA7Ci0gICAgJHNoaWZ0ID0gMDsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAkeCA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgICAkYXJyID0gdW5wYWNrKCdDJywgJHgpOwotICAgICAgJGJ5dGUgPSAkYXJyWzFdOwotICAgICAgJGlkeCArPSAxOwotICAgICAgaWYgKCRzaGlmdCA8IDMyKSB7Ci0gICAgICAgICRsbyB8PSAoKCRieXRlICYgMHg3ZikgPDwgJHNoaWZ0KSAmCi0gICAgICAgICAgMHgwMDAwMDAwMGZmZmZmZmZmOwotICAgICAgfQotICAgICAgLy8gU2hpZnQgaGkgYW5kIGxvIHRvZ2V0aGVyLgotICAgICAgaWYgKCRzaGlmdCA+PSAzMikgewotICAgICAgICAkaGkgfD0gKCgkYnl0ZSAmIDB4N2YpIDw8ICgkc2hpZnQgLSAzMikpOwotICAgICAgfSBlbHNlaWYgKCRzaGlmdCA+IDI1KSB7Ci0gICAgICAgICRoaSB8PSAoKCRieXRlICYgMHg3ZikgPj4gKCRzaGlmdCAtIDI1KSk7Ci0gICAgICB9Ci0gICAgICBpZiAoKCRieXRlID4+IDcpID09PSAwKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgJHNoaWZ0ICs9IDc7Ci0gICAgfQotCi0gICAgLy8gTm93LCB1bnppZyBpdC4KLSAgICAkeG9yZXIgPSAwOwotICAgIGlmICgkbG8gJiAxKSB7Ci0gICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOwotICAgIH0KLSAgICAkbG8gPSAoJGxvID4+IDEpICYgMHg3ZmZmZmZmZjsKLSAgICAkbG8gPSAkbG8gfCAoKCRoaSAmIDEpIDw8IDMxKTsKLSAgICAkaGkgPSAoJGhpID4+IDEpIF4gJHhvcmVyOwotICAgICRsbyA9ICRsbyBeICR4b3JlcjsKLQotICAgIC8vIE5vdyBwdXQgJGhpIGFuZCAkbG8gYmFjayB0b2dldGhlcgotICAgIGlmICh0cnVlKSB7Ci0gICAgICAkaXNOZWcgPSAkaGkgIDwgMDsKLQotICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKLSAgICAgIGlmICgkaXNOZWcpIHsKLSAgICAgICAgJGhpID0gfiRoaSAmIChpbnQpIDB4ZmZmZmZmZmY7Ci0gICAgICAgICRsbyA9IH4kbG8gJiAoaW50KSAweGZmZmZmZmZmOwotCi0gICAgICAgIGlmICgkbG8gPT0gKGludCkgMHhmZmZmZmZmZikgewotICAgICAgICAgICRoaSsrOwotICAgICAgICAgICRsbyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJGxvKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gRm9yY2UgMzJiaXQgd29yZHMgaW4gZXhjZXNzIG9mIDJHIHRvIGJlIHBvc2l0aXZlIC0gd2UgZGVhbCB3aXRoIHNpZ24KLSAgICAgIC8vIGV4cGxpY2l0bHkgYmVsb3cKLQotICAgICAgaWYgKCRoaSAmIChpbnQpIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGhpICY9IChpbnQpIDB4N2ZmZmZmZmY7Ci0gICAgICAgICRoaSArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICBpZiAoJGxvICYgKGludCkgMHg4MDAwMDAwMCkgewotICAgICAgICAkbG8gJj0gKGludCkgMHg3ZmZmZmZmZjsKLSAgICAgICAgJGxvICs9IDB4ODAwMDAwMDA7Ci0gICAgICB9Ci0KLSAgICAgICR2YWx1ZSA9ICRoaSAqIDQyOTQ5NjcyOTYgKyAkbG87Ci0KLSAgICAgIGlmICgkaXNOZWcpIHsKLSAgICAgICAgJHZhbHVlID0gMCAtICR2YWx1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotCi0gICAgICAvLyBVcGNhc3QgbmVnYXRpdmVzIGluIExTQiBiaXQKLSAgICAgIGlmICgkYXJyWzJdICYgMHg4MDAwMDAwMCkgewotICAgICAgICAkYXJyWzJdID0gJGFyclsyXSAmIDB4ZmZmZmZmZmY7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCi0gICAgICBpZiAoJGFyclsxXSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gJiAweGZmZmZmZmZmOwotICAgICAgICAkYXJyWzFdID0gJGFyclsxXSBeIDB4ZmZmZmZmZmY7Ci0gICAgICAgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhmZmZmZmZmZjsKLSAgICAgICAgJHZhbHVlID0gMCAtICRhcnJbMV0gKiA0Mjk0OTY3Mjk2IC0gJGFyclsyXSAtIDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkdmFsdWUgPSAkYXJyWzFdICogNDI5NDk2NzI5NiArICRhcnJbMl07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICRpZHg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJHZhbHVlKQotICB7Ci0gICAgLy8gSWYgd2UgYXJlIGluIGFuIEkzMiByYW5nZSwgdXNlIHRoZSBlYXN5IG1ldGhvZCBiZWxvdy4KLSAgICBpZiAoKCR2YWx1ZSA+IDQyOTQ5NjcyOTYpIHx8ICgkdmFsdWUgPCAtNDI5NDk2NzI5NikpIHsKLSAgICAgIC8vIENvbnZlcnQgJHZhbHVlIHRvICRoaSBhbmQgJGxvCi0gICAgICAkbmVnID0gJHZhbHVlIDwgMDsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJHZhbHVlICo9IC0xOwotICAgICAgfQotCi0gICAgICAkaGkgPSAoaW50KSAkdmFsdWUgPj4gMzI7Ci0gICAgICAkbG8gPSAoaW50KSAkdmFsdWUgJiAweGZmZmZmZmZmOwotCi0gICAgICBpZiAoJG5lZykgewotICAgICAgICAkaGkgPSB+JGhpOwotICAgICAgICAkbG8gPSB+JGxvOwotICAgICAgICBpZiAoKCRsbyAmIChpbnQpIDB4ZmZmZmZmZmYpID09IChpbnQpIDB4ZmZmZmZmZmYpIHsKLSAgICAgICAgICAkbG8gPSAwOwotICAgICAgICAgICRoaSsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICRsbysrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIE5vdyBkbyB0aGUgemlnZ2luZyBhbmQgemFnZ2luZy4KLSAgICAgICR4b3JlciA9IDA7Ci0gICAgICBpZiAoJG5lZykgewotICAgICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOwotICAgICAgfQotICAgICAgJGxvd2JpdCA9ICgkbG8gPj4gMzEpICYgMTsKLSAgICAgICRoaSA9ICgkaGkgPDwgMSkgfCAkbG93Yml0OwotICAgICAgJGxvID0gKCRsbyA8PCAxKTsKLSAgICAgICRsbyA9ICgkbG8gXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKLSAgICAgICRoaSA9ICgkaGkgXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKLQotICAgICAgLy8gbm93IHdyaXRlIG91dCB0aGUgdmFyaW50LCBlbnN1cmluZyB3ZSBzaGlmdCBib3RoIGhpIGFuZCBsbwotICAgICAgJG91dCA9ICIiOwotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaWYgKCgkbG8gJiB+MHg3ZikgPT09IDAgJiYKLSAgICAgICAgICAgJGhpID09PSAwKSB7Ci0gICAgICAgICAgJG91dCAuPSBjaHIoJGxvKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkb3V0IC49IGNocigoJGxvICYgMHhmZikgfCAweDgwKTsKLSAgICAgICAgICAkbG8gPSAkbG8gPj4gNzsKLSAgICAgICAgICAkbG8gPSAkbG8gfCAoJGhpIDw8IDI1KTsKLSAgICAgICAgICAkaGkgPSAkaGkgPj4gNzsKLSAgICAgICAgICAvLyBSaWdodCBzaGlmdCBjYXJyaWVzIHNpZ24sIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvLgotICAgICAgICAgICRoaSA9ICRoaSAmICgxMjcgPDwgMjUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJG91dCk7Ci0gICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkb3V0LCAkcmV0KTsKLQotICAgICAgcmV0dXJuICRyZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgNjQpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5M2IwOS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NjkgKzAsMCBAQAotPD9waHAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOwotCi11c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Ci11c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cQmFzZUNvbnRleHQ7Ci11c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cTG9va2FoZWFkUmVhZGVyOwotdXNlIFRocmlmdFxQcm90b2NvbFxKU09OXFBhaXJDb250ZXh0OwotdXNlIFRocmlmdFxQcm90b2NvbFxKU09OXExpc3RDb250ZXh0OwotCi0vKioKLSAqIEpTT04gaW1wbGVtZW50YXRpb24gb2YgdGhyaWZ0IHByb3RvY29sLCBwb3J0ZWQgZnJvbSBKYXZhLgotICovCi1jbGFzcyBUSlNPTlByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCi17Ci0gICAgY29uc3QgQ09NTUEgPSAnLCc7Ci0gICAgY29uc3QgQ09MT04gPSAnOic7Ci0gICAgY29uc3QgTEJSQUNFID0gJ3snOwotICAgIGNvbnN0IFJCUkFDRSA9ICd9JzsKLSAgICBjb25zdCBMQlJBQ0tFVCA9ICdbJzsKLSAgICBjb25zdCBSQlJBQ0tFVCA9ICddJzsKLSAgICBjb25zdCBRVU9URSA9ICciJzsKLSAgICBjb25zdCBCQUNLU0xBU0ggPSAnXFwnOwotICAgIGNvbnN0IFpFUk8gPSAnMCc7Ci0gICAgY29uc3QgRVNDU0VRID0gJ1xcJzsKLSAgICBjb25zdCBET1VCTEVFU0MgPSAnX19ET1VCTEVfRVNDQVBFX1NFUVVFTkNFX18nOwotCi0gICAgY29uc3QgVkVSU0lPTiA9IDE7Ci0KLSAgICBwdWJsaWMgc3RhdGljICRKU09OX0NIQVJfVEFCTEUgPSBhcnJheSgKLSAgICAgICAgLyogIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICBBICAgQiAgIEMgICBEICAgRSAgIEYgKi8KLSAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgJ2InLCAndCcsICduJywgMCwgJ2YnLCAncicsIDAsIDAsIC8vIDAKLSAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gMQotICAgICAgICAxLCAxLCAnIicsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vIDIKLSAgICApOwotCi0gICAgcHVibGljIHN0YXRpYyAkRVNDQVBFX0NIQVJTID0gYXJyYXkoJyInLCAnXFwnLCAnLycsICJiIiwgImYiLCAibiIsICJyIiwgInQiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgJEVTQ0FQRV9DSEFSX1ZBTFMgPSBhcnJheSgKLSAgICAgICAgJyInLCAnXFwnLCAnLycsICJceDA4IiwgIlxmIiwgIlxuIiwgIlxyIiwgIlx0IiwKLSAgICApOwotCi0gICAgY29uc3QgTkFNRV9CT09MID0gInRmIjsKLSAgICBjb25zdCBOQU1FX0JZVEUgPSAiaTgiOwotICAgIGNvbnN0IE5BTUVfSTE2ID0gImkxNiI7Ci0gICAgY29uc3QgTkFNRV9JMzIgPSAiaTMyIjsKLSAgICBjb25zdCBOQU1FX0k2NCA9ICJpNjQiOwotICAgIGNvbnN0IE5BTUVfRE9VQkxFID0gImRibCI7Ci0gICAgY29uc3QgTkFNRV9TVFJVQ1QgPSAicmVjIjsKLSAgICBjb25zdCBOQU1FX1NUUklORyA9ICJzdHIiOwotICAgIGNvbnN0IE5BTUVfTUFQID0gIm1hcCI7Ci0gICAgY29uc3QgTkFNRV9MSVNUID0gImxzdCI7Ci0gICAgY29uc3QgTkFNRV9TRVQgPSAic2V0IjsKLQotICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0VHlwZU5hbWVGb3JUeXBlSUQoJHR5cGVJRCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoJHR5cGVJRCkgewotICAgICAgICAgICAgY2FzZSBUVHlwZTo6Qk9PTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9CT09MOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6QllURToKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9CWVRFOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6STE2OgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0kxNjsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OkkzMjoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9JMzI7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpJNjQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfSTY0OwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6RE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0RPVUJMRTsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TVFJJTkc7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfU1RSVUNUOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX01BUDsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TRVQ7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfTElTVDsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHR5cGUiLCBUUHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRUeXBlSURGb3JUeXBlTmFtZSgkbmFtZSkKLSAgICB7Ci0gICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U1RPUDsKLQotICAgICAgICBpZiAoc3RybGVuKCRuYW1lKSA+IDEpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoc3Vic3RyKCRuYW1lLCAwLCAxKSkgewotICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkRPVUJMRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3Vic3RyKCRuYW1lLCAxLCAxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpCWVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpJMTY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICczJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkkzMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzYnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6STY0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ2wnOgotICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkxTVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6TUFQOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVFJVQ1Q7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic3RyKCRuYW1lLCAxLCAxKSA9PSAndCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U1RSSU5HOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCRuYW1lLCAxLCAxKSA9PSAnZScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U0VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkJPT0w7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgkcmVzdWx0ID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdHlwZSIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyAkY29udGV4dFN0YWNrXyA9IGFycmF5KCk7Ci0gICAgcHVibGljICRjb250ZXh0XzsKLSAgICBwdWJsaWMgJHJlYWRlcl87Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHB1c2hDb250ZXh0KCRjKQotICAgIHsKLSAgICAgICAgYXJyYXlfcHVzaCgkdGhpcy0+Y29udGV4dFN0YWNrXywgJHRoaXMtPmNvbnRleHRfKTsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBwb3BDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0XyA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGV4dFN0YWNrXyk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucykKLSAgICB7Ci0gICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gbmV3IEJhc2VDb250ZXh0KCk7Ci0gICAgICAgICR0aGlzLT5yZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigkdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlc2V0KCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0U3RhY2tfID0gYXJyYXkoKTsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gbmV3IEJhc2VDb250ZXh0KCk7Ci0gICAgICAgICR0aGlzLT5yZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigkdGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSAkdG1wYnVmXyA9IGFycmF5KDQpOwotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRKU09OU3ludGF4Q2hhcigkYikKLSAgICB7Ci0gICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7Ci0KLSAgICAgICAgaWYgKHN1YnN0cigkY2gsIDAsIDEpICE9ICRiKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogIiAuICRjaCwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBoZXhWYWwoJHMpCi0gICAgewotICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBzdHJsZW4oJHMpOyAkaSsrKSB7Ci0gICAgICAgICAgICAkY2ggPSBzdWJzdHIoJHMsICRpLCAxKTsKLQotICAgICAgICAgICAgaWYgKCEoJGNoID49ICJhIiAmJiAkY2ggPD0gImYiKSAmJiAhKCRjaCA+PSAiMCIgJiYgJGNoIDw9ICI5IikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJFeHBlY3RlZCBoZXggY2hhcmFjdGVyICIgLiAkY2gsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBoZXhkZWMoJHMpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gaGV4Q2hhcigkdmFsKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlY2hleCgkdmFsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTlN0cmluZygkYikKLSAgICB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKLQotICAgICAgICBpZiAoaXNfbnVtZXJpYygkYikgJiYgJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoJGIpKTsKLQotICAgICAgICBpZiAoaXNfbnVtZXJpYygkYikgJiYgJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05JbnRlZ2VyKCRudW0pCi0gICAgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotCi0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRudW0pOwotCi0gICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkRvdWJsZSgkbnVtKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOwotCi0gICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShqc29uX2VuY29kZSgkbnVtKSk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQmFzZTY0KCRkYXRhKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOwotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKGJhc2U2NF9lbmNvZGUoJGRhdGEpKSk7Ci0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCkKLSAgICB7Ci0gICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7Ci0gICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0UpOwotICAgICAgJHRoaXMtPnB1c2hDb250ZXh0KG5ldyBQYWlyQ29udGV4dCgkdGhpcykpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OT2JqZWN0RW5kKCkKLSAgICB7Ci0gICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOwotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkFycmF5U3RhcnQoKQotICAgIHsKLSAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKLSAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKLSAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkFycmF5RW5kKCkKLSAgICB7Ci0gICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOwotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05TdHJpbmcoJHNraXBDb250ZXh0KQotICAgIHsKLSAgICAgIGlmICghJHNraXBDb250ZXh0KSB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOwotICAgICAgfQotCi0gICAgICAkanNvblN0cmluZyA9ICcnOwotICAgICAgJGxhc3RDaGFyID0gbnVsbDsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7Ci0gICAgICAgICRqc29uU3RyaW5nIC49ICRjaDsKLSAgICAgICAgaWYgKCRjaCA9PSBzZWxmOjpRVU9URSAmJgotICAgICAgICAgICRsYXN0Q2hhciAhPT0gTlVMTCAmJgotICAgICAgICAgICAgJGxhc3RDaGFyICE9PSBzZWxmOjpFU0NTRVEpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoJGNoID09IHNlbGY6OkVTQ1NFUSAmJiAkbGFzdENoYXIgPT0gc2VsZjo6RVNDU0VRKSB7Ci0gICAgICAgICAgJGxhc3RDaGFyID0gc2VsZjo6RE9VQkxFRVNDOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICRsYXN0Q2hhciA9ICRjaDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4ganNvbl9kZWNvZGUoJGpzb25TdHJpbmcpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gaXNKU09OTnVtZXJpYygkYikKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoJGIpIHsKLSAgICAgICAgICAgIGNhc2UgJysnOgotICAgICAgICAgICAgY2FzZSAnLSc6Ci0gICAgICAgICAgICBjYXNlICcuJzoKLSAgICAgICAgICAgIGNhc2UgJzAnOgotICAgICAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgICAgIGNhc2UgJzMnOgotICAgICAgICAgICAgY2FzZSAnNCc6Ci0gICAgICAgICAgICBjYXNlICc1JzoKLSAgICAgICAgICAgIGNhc2UgJzYnOgotICAgICAgICAgICAgY2FzZSAnNyc6Ci0gICAgICAgICAgICBjYXNlICc4JzoKLSAgICAgICAgICAgIGNhc2UgJzknOgotICAgICAgICAgICAgY2FzZSAnRSc6Ci0gICAgICAgICAgICBjYXNlICdlJzoKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05OdW1lcmljQ2hhcnMoKQotICAgIHsKLSAgICAgICAgJHN0cmJsZCA9IGFycmF5KCk7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5wZWVrKCk7Ci0KLSAgICAgICAgICAgIGlmICghJHRoaXMtPmlzSlNPTk51bWVyaWMoJGNoKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAkc3RyYmxkW10gPSAkdGhpcy0+cmVhZGVyXy0+cmVhZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGltcGxvZGUoIiIsICRzdHJibGQpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05JbnRlZ2VyKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOwotCi0gICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotCi0gICAgICAgICRzdHIgPSAkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKLQotICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzX251bWVyaWMoJHN0cikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkludmFsaWQgZGF0YSBpbiBudW1lcmljOiAiIC4gJHN0ciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGludHZhbCgkc3RyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZGVudGljYWwgdG8gcmVhZEpTT05JbnRlZ2VyIGJ1dCB3aXRob3V0IHRoZSBmaW5hbCBjYXN0LgotICAgICAqIE5lZWRlZCBmb3IgcHJvcGVyIGhhbmRsaW5nIG9mIGk2NCBvbiAzMiBiaXQgbWFjaGluZXMuICBXaHkgYQotICAgICAqIHNlcGFyYXRlIGZ1bmN0aW9uPyAgU28gd2UgZG9uJ3QgaGF2ZSB0byBmb3JjZSB0aGUgcmVzdCBvZiB0aGUKLSAgICAgKiB1c2UgY2FzZXMgdGhyb3VnaCB0aGUgZXh0cmEgY29uZGl0aW9uYWwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkludGVnZXJBc1N0cmluZygpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKLQotICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OTnVtZXJpY0NoYXJzKCk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc19udW1lcmljKCRzdHIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgaW4gbnVtZXJpYzogIiAuICRzdHIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAkc3RyOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05Eb3VibGUoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7Ci0KLSAgICAgICAgaWYgKHN1YnN0cigkdGhpcy0+cmVhZGVyXy0+cGVlaygpLCAwLCAxKSA9PSBzZWxmOjpRVU9URSkgewotICAgICAgICAgICAgJGFyciA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyh0cnVlKTsKLQotICAgICAgICAgICAgaWYgKCRhcnIgPT0gIk5hTiIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkFOOwotICAgICAgICAgICAgfSBlbHNlaWYgKCRhcnIgPT0gIkluZmluaXR5IikgewotICAgICAgICAgICAgICAgIHJldHVybiBJTkY7Ci0gICAgICAgICAgICB9IGVsc2VpZiAoISR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCAiIC4gJGFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmbG9hdHZhbCgkYXJyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmbG9hdHZhbCgkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQmFzZTY0KCkKLSAgICB7Ci0gICAgICAgICRhcnIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpOwotICAgICAgICAkZGF0YSA9IGJhc2U2NF9kZWNvZGUoJGFyciwgdHJ1ZSk7Ci0KLSAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiSW52YWxpZCBiYXNlNjQgZGF0YSAiIC4gJGFyciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICRkYXRhOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05PYmplY3RTdGFydCgpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpMQlJBQ0UpOwotICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IFBhaXJDb250ZXh0KCR0aGlzKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTk9iamVjdEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlJCUkFDRSk7Ci0gICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkFycmF5U3RhcnQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6TEJSQUNLRVQpOwotICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkFycmF5RW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UkJSQUNLRVQpOwotICAgICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKLSAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoc2VsZjo6VkVSU0lPTik7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJG5hbWUpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkdHlwZSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzZXFpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIHN0cmluZyAgICAgJG5hbWUgU3RydWN0IG5hbWUKLSAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2UgYSBzdHJ1Y3QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRmaWVsZElkKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRmaWVsZFR5cGUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKc29uT2JqZWN0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRrZXlUeXBlKSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCR2YWxUeXBlKSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzaXplKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05PYmplY3RFbmQoKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlTdGFydCgpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCR0aGlzLT5nZXRUeXBlTmFtZUZvclR5cGVJRCgkZWxlbVR5cGUpKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRlbGVtVHlwZSkpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYm9vbCA/IDEgOiAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGJ5dGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGkxNik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTMyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpNjQpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkRvdWJsZSgkZHViKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cikKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHN0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgICAqIEBwYXJlbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5U3RhcnQoKTsKLQotICAgICAgICBpZiAoJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpICE9IHNlbGY6OlZFUlNJT04pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uIiwgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7Ci0gICAgICAgIH0KLQotICAgICAgICAkbmFtZSA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSk7Ci0gICAgICAgICR0eXBlID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotICAgICAgICAkc2VxaWQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQotICAgIHsKLSAgICAgICAgJGNoID0gJHRoaXMtPnJlYWRlcl8tPnBlZWsoKTsKLSAgICAgICAgJG5hbWUgPSAiIjsKLQotICAgICAgICBpZiAoc3Vic3RyKCRjaCwgMCwgMSkgPT0gc2VsZjo6UkJSQUNFKSB7Ci0gICAgICAgICAgICAkZmllbGRUeXBlID0gVFR5cGU6OlNUT1A7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAkZmllbGRJZCA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLSAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgICAgICAgICAkZmllbGRUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICRrZXlUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotICAgICAgICAkdmFsVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLSAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0RW5kKCk7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOwotICAgICAgICAkZWxlbVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0gICAgICAgICRzaXplID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOwotICAgICAgICAkZWxlbVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0gICAgICAgICRzaXplID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCkKLSAgICB7Ci0gICAgICAgICRib29sID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpID09IDAgPyBmYWxzZSA6IHRydWU7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkKLSAgICB7Ci0gICAgICAgICRieXRlID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KQotICAgIHsKLSAgICAgICAgJGkxNiA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMikKLSAgICB7Ci0gICAgICAgICRpMzIgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpCi0gICAgewotICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09PSA0KSB7Ci0gICAgICAgICAgICAkaTY0ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlckFzU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAkaTY0ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpCi0gICAgewotICAgICAgICAkZHViID0gJHRoaXMtPnJlYWRKU09ORG91YmxlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCi0gICAgewotICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTNiYzBkLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcVHlwZVxUVHlwZTsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQcm90b2NvbCBiYXNlIGNsYXNzIG1vZHVsZS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sCi17Ci0gIC8qKgotICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydAotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnQKLSAgICovCi0gIHByb3RlY3RlZCAkdHJhbnNfOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucykKLSAgewotICAgICR0aGlzLT50cmFuc18gPSAkdHJhbnM7Ci0gIH0KLQotICAvKioKLSAgICogQWNjZXNzb3IgZm9yIHRyYW5zcG9ydAotICAgKgotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT50cmFuc187Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKLSAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKLSAgICogQHBhcmFtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKLQotICAvKioKLSAgICogQ2xvc2UgdGhlIG1lc3NhZ2UKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKTsKLQotICAvKioKLSAgICogV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgU3RydWN0IG5hbWUKLSAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKTsKLQotICAvKioKLSAgICogQ2xvc2UgYSBzdHJ1Y3QuCi0gICAqCi0gICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKTsKLQotICAvKgotICAgKiBTdGFydHMgYSBmaWVsZC4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgRmllbGQgbmFtZQotICAgKiBAcGFyYW0gaW50ICAgICAgICAkdHlwZSBGaWVsZCB0eXBlCi0gICAqIEBwYXJhbSBpbnQgICAgICAgICRmaWQgIEZpZWxkIGlkCi0gICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkYnl0ZSk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkaTMyKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKTsKLQotICAvKioKLSAgICogUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQotICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgKiBAcGFyZW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCk7Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGNsb3NlIG9mIG1lc3NhZ2UKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNik7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiRpMzIpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1Yik7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpOwotCi0gIC8qKgotICAgKiBUaGUgc2tpcCBmdW5jdGlvbiBpcyBhIHV0aWxpdHkgdG8gcGFyc2Ugb3ZlciB1bnJlY29nbml6ZWQgZGF0ZSB3aXRob3V0Ci0gICAqIGNhdXNpbmcgY29ycnVwdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIFRUeXBlICR0eXBlIFdoYXQgdHlwZSBpcyBpdAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNraXAoJHR5cGUpCi0gIHsKLSAgICBzd2l0Y2ggKCR0eXBlKSB7Ci0gICAgY2FzZSBUVHlwZTo6Qk9PTDoKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEJvb2woJGJvb2wpOwotICAgIGNhc2UgVFR5cGU6OkJZVEU6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRCeXRlKCRieXRlKTsKLSAgICBjYXNlIFRUeXBlOjpJMTY6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRJMTYoJGkxNik7Ci0gICAgY2FzZSBUVHlwZTo6STMyOgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTMyKCRpMzIpOwotICAgIGNhc2UgVFR5cGU6Okk2NDoKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEk2NCgkaTY0KTsKLSAgICBjYXNlIFRUeXBlOjpET1VCTEU6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWREb3VibGUoJGR1Yik7Ci0gICAgY2FzZSBUVHlwZTo6U1RSSU5HOgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkU3RyaW5nKCRzdHIpOwotICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkU3RydWN0QmVnaW4oJG5hbWUpOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRGaWVsZEJlZ2luKCRuYW1lLCAkZnR5cGUsICRmaWQpOwotICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRmdHlwZSk7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkRW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFN0cnVjdEVuZCgpOwotCi0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgka2V5VHlwZSk7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkdmFsVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZE1hcEVuZCgpOwotCi0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZWxlbVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTZXRFbmQoKTsKLQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICB7Ci0gICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZExpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLSAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRlbGVtVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZExpc3RFbmQoKTsKLQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignVW5rbm93biBmaWVsZCB0eXBlOiAnLiR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFV0aWxpdHkgZm9yIHNraXBwaW5nIGJpbmFyeSBkYXRhCi0gICAqCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICRpdHJhbnMgVFRyYW5zcG9ydCBvYmplY3QKLSAgICogQHBhcmFtIGludCAgICAgICAgJHR5cGUgICBGaWVsZCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNraXBCaW5hcnkoJGl0cmFucywgJHR5cGUpCi0gIHsKLSAgICBzd2l0Y2ggKCR0eXBlKSB7Ci0gICAgY2FzZSBUVHlwZTo6Qk9PTDoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgIGNhc2UgVFR5cGU6OkJZVEU6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICBjYXNlIFRUeXBlOjpJMTY6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgyKTsKLSAgICBjYXNlIFRUeXBlOjpJMzI6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICBjYXNlIFRUeXBlOjpJNjQ6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKLSAgICBjYXNlIFRUeXBlOjpET1VCTEU6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKLSAgICBjYXNlIFRUeXBlOjpTVFJJTkc6Ci0gICAgICAkbGVuID0gdW5wYWNrKCdOJywgJGl0cmFucy0+cmVhZEFsbCg0KSk7Ci0gICAgICAkbGVuID0gJGxlblsxXTsKLSAgICAgIGlmICgkbGVuID4gMHg3ZmZmZmZmZikgewotICAgICAgICAkbGVuID0gMCAtICgoJGxlbiAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiA0ICsgJGl0cmFucy0+cmVhZEFsbCgkbGVuKTsKLSAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICB7Ci0gICAgICAgICRyZXN1bHQgPSAwOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICRmdHlwZSA9IDA7Ci0gICAgICAgICAgJGZpZCA9IDA7Ci0gICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICAgJGZ0eXBlID0gJGFyclsxXTsKLSAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gSTE2IGZpZWxkIGlkCi0gICAgICAgICAgJHJlc3VsdCArPSAkaXRyYW5zLT5yZWFkQWxsKDIpOwotICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkZnR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgewotICAgICAgICAvLyBLdHlwZQotICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICRrdHlwZSA9ICRhcnJbMV07Ci0gICAgICAgIC8vIFZ0eXBlCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAgICAgJHZ0eXBlID0gJGFyclsxXTsKLSAgICAgICAgLy8gU2l6ZQotICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoNCk7Ci0gICAgICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7Ci0gICAgICAgICRzaXplID0gJGFyclsxXTsKLSAgICAgICAgaWYgKCRzaXplID4gMHg3ZmZmZmZmZikgewotICAgICAgICAgICRzaXplID0gMCAtICgoJHNpemUgLSAxKSBeIDB4ZmZmZmZmZmYpOwotICAgICAgICB9Ci0gICAgICAgICRyZXN1bHQgPSA2OwotICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgewotICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAka3R5cGUpOwotICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkdnR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6U0VUOgotICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgIHsKLSAgICAgICAgLy8gVnR5cGUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOwotICAgICAgICAvLyBTaXplCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKLSAgICAgICAgJHNpemUgPSAkYXJyWzFdOwotICAgICAgICBpZiAoJHNpemUgPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCA9IDU7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignVW5rbm93biBmaWVsZCB0eXBlOiAnLiR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDhjNGQ1Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwotCi0vKioKLSAqIDxjb2RlPlRQcm90b2NvbERlY29yYXRvcjwvY29kZT4gZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkCi0gKiA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+IGluc3RhbmNlLCBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UKLSAqIGNvbmNyZXRlIGRlY29yYXRvciBzdWJjbGFzc2VzLiBXaGlsZSBpdCBoYXMgbm8gYWJzdHJhY3QgbWV0aG9kcywgaXQKLSAqIGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLCBpdCBkb2VzIG5vdCBtb2RpZnkKLSAqIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIDxjb2RlPlRQcm90b2NvbDwvY29kZT4uCi0gKgotICogQHBhY2thZ2UgVGhyaWZ0XFByb3RvY29sCi0gKi8KLWFic3RyYWN0IGNsYXNzIFRQcm90b2NvbERlY29yYXRvciBleHRlbmRzIFRQcm90b2NvbAotewotICAgIC8qKgotICAgICAqIEluc3RhbmNlIG9mIHByb3RvY29sLCB0byB3aGljaCBhbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmRlZC4KLSAgICAgKgotICAgICAqIEB2YXIgVFByb3RvY29sCi0gICAgICovCi0gICAgcHJpdmF0ZSAkY29uY3JldGVQcm90b2NvbF87Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBvZiA8Y29kZT5UUHJvdG9jb2xEZWNvcmF0b3I8L2NvZGU+IGNsYXNzLgotICAgICAqIEVuY2xvc2VzIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gVFByb3RvY29sICRwcm90b2NvbCBBbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmQgdG8gdGhpcyBpbnN0YW5jZS4gTXVzdCBiZSBub24tbnVsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoVFByb3RvY29sICRwcm90b2NvbCkKLSAgICB7Ci0gICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHByb3RvY29sLT5nZXRUcmFuc3BvcnQoKSk7Ci0gICAgICAgICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXyA9ICRwcm90b2NvbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZQotICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgICAqIEBwYXJhbSBpbnQgICAgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVNZXNzYWdlRW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgU3RydWN0IG5hbWUKLSAgICAgKgotICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVN0cnVjdEJlZ2luKCRuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSBhIHN0cnVjdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU3RydWN0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVGaWVsZEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUZpZWxkU3RvcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1hcEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUxpc3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTZXRFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCRib29sKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVCb29sKCRib29sKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVCeXRlKCRieXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNikKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlSTE2KCRpMTYpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkaTMyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVJMzIoJGkzMik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCRpNjQpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUk2NCgkaTY0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1YikKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRG91YmxlKCRkdWIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTdHJpbmcoJHN0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lCi0gICAgICogQHBhcmFtIGludCAgICAkdHlwZSAgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCi0gICAgICogQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWVzc2FnZUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFN0cnVjdEJlZ2luKCRuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RydWN0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRGaWVsZEJlZ2luKCRuYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkRmllbGRFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWFwRW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTGlzdEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTZXRFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEJvb2woJGJvb2wpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJGJ5dGUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkQnl0ZSgkYnl0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkSTE2KCRpMTYpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEkzMigkaTMyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRJNjQoJGk2NCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkRG91YmxlKCRkdWIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkc3RyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFN0cmluZygkc3RyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMGNmOGIuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKiBAYXV0aG9yOiBybWFyaW4gKG1hcmluLnJhZHVAZmFjZWJvb2suY29tKQotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcU2VyaWFsaXplcjsKLQotdXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQ7Ci11c2UgVGhyaWZ0XFR5cGVcVE1lc3NhZ2VUeXBlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHNlcmlhbGl6aW5nIGFuZCBkZXNlcmlhbGl6aW5nCi0gKiBhIHRocmlmdCBvYmplY3QgdXNpbmcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQuCi0gKi8KLWNsYXNzIFRCaW5hcnlTZXJpYWxpemVyCi17Ci0gIC8vIE5PVEUocm1hcmluKTogQmVjYXVzZSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Ci0gIC8vIGFkZHMgYSBiZWdpbiBtZXNzYWdlIHByZWZpeCwgeW91IGNhbm5vdCBzcGVjaWZ5Ci0gIC8vIGEgdHJhbnNwb3J0IGluIHdoaWNoIHRvIHNlcmlhbGl6ZSBhbiBvYmplY3QuIEl0IGhhcyB0bwotICAvLyBiZSBhIHN0cmluZy4gT3RoZXJ3aXNlIHdlIHdpbGwgYnJlYWsgdGhlIGNvbXBhdGliaWxpdHkgd2l0aAotICAvLyBub3JtYWwgZGVzZXJpYWxpemF0aW9uLgotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlcmlhbGl6ZSgkb2JqZWN0KQotICB7Ci0gICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7Ci0gICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOwotICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKSkgewotICAgICAgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkcHJvdG9jb2wsICRvYmplY3QtPmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgJG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJHByb3RvY29sLT5pc1N0cmljdFdyaXRlKCkpOwotCi0gICAgICAkcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oJHVudXNlZF9uYW1lLCAkdW51c2VkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVudXNlZF9zZXFpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICRvYmplY3QtPndyaXRlKCRwcm90b2NvbCk7Ci0gICAgfQotICAgICRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7Ci0KLSAgICByZXR1cm4gJHRyYW5zcG9ydC0+Z2V0QnVmZmVyKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlc2VyaWFsaXplKCRzdHJpbmdfb2JqZWN0LCAkY2xhc3NfbmFtZSkKLSAgewotICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKLSAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOwotICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnknKSkgewotICAgICAgIC8vIE5PVEUgKHQuaGVpbnR6KSBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBpbnRlcm5hbGx5IHdyYXBzIG91ciBUTWVtb3J5QnVmZmVyIGluIGEKLSAgICAgICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQsIHNvIHdlIGhhdmUgdG8gcmV0cmlldmUgaXQgYWdhaW4gb3IgcmlzayBsb3NpbmcgZGF0YSB3aGVuIHdyaXRpbmcKLSAgICAgICAvLyBsZXNzIHRoYW4gNTEyIGJ5dGVzIHRvIHRoZSB0cmFuc3BvcnQgKHNlZSB0aGUgY29tbWVudCB0aGVyZSBhcyB3ZWxsKS4KLSAgICAgICAvLyBAc2VlIFRIUklGVC0xNTc5Ci0gICAgICAgJHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbignJywgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgMCk7Ci0gICAgICAgJHByb3RvY29sVHJhbnNwb3J0ID0gJHByb3RvY29sLT5nZXRUcmFuc3BvcnQoKTsKLSAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQtPndyaXRlKCRzdHJpbmdfb2JqZWN0KTsKLSAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQtPmZsdXNoKCk7Ci0KLSAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KCRwcm90b2NvbCwgJGNsYXNzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvdG9jb2wtPmlzU3RyaWN0UmVhZCgpKTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAkdHJhbnNwb3J0LT53cml0ZSgkc3RyaW5nX29iamVjdCk7Ci0gICAgICAgJG9iamVjdCA9IG5ldyAkY2xhc3NfbmFtZSgpOwotICAgICAgICRvYmplY3QtPnJlYWQoJHByb3RvY29sKTsKLQotICAgICAgIHJldHVybiAkb2JqZWN0OwotICAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNmU1NDEuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD9waHAKLQotbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGZvcmtpbmcgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgc2VydmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKLSAqLwotY2xhc3MgVEZvcmtpbmdTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyCi17Ci0gIC8qKgotICAgKiBGbGFnIGZvciB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRzdG9wXyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBMaXN0IG9mIGNoaWxkcmVuLgotICAgKgotICAgKiBAdmFyIGFycmF5Ci0gICAqLwotICBwcm90ZWN0ZWQgJGNoaWxkcmVuXyA9IGFycmF5KCk7Ci0KLSAgLyoqCi0gICAqIExpc3RlbnMgZm9yIG5ldyBjbGllbnQgdXNpbmcgdGhlIHN1cHBsaWVkCi0gICAqIHRyYW5zcG9ydC4gV2UgZm9yayB3aGVuIGEgbmV3IGNvbm5lY3Rpb24KLSAgICogYXJyaXZlcy4KLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2VydmUoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmxpc3RlbigpOwotCi0gICAgd2hpbGUgKCEkdGhpcy0+c3RvcF8pIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+YWNjZXB0KCk7Ci0KLSAgICAgICAgaWYgKCR0cmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICAgICRwaWQgPSBwY250bF9mb3JrKCk7Ci0KLSAgICAgICAgICBpZiAoJHBpZCA+IDApIHsKLSAgICAgICAgICAgICR0aGlzLT5oYW5kbGVQYXJlbnQoJHRyYW5zcG9ydCwgJHBpZCk7Ci0gICAgICAgICAgfSBlbHNlaWYgKCRwaWQgPT09IDApIHsKLSAgICAgICAgICAgICR0aGlzLT5oYW5kbGVDaGlsZCgkdHJhbnNwb3J0KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ0ZhaWxlZCB0byBmb3JrJyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7IH0KLQotICAgICAgJHRoaXMtPmNvbGxlY3RDaGlsZHJlbigpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb2RlIHJ1biBieSB0aGUgcGFyZW50Ci0gICAqCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQKLSAgICogQHBhcmFtIGludCAkcGlkCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVQYXJlbnQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0LCAkcGlkKQotICB7Ci0gICAgJHRoaXMtPmNoaWxkcmVuX1skcGlkXSA9ICR0cmFuc3BvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogQ29kZSBydW4gYnkgdGhlIGNoaWxkLgotICAgKgotICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVDaGlsZChUVHJhbnNwb3J0ICR0cmFuc3BvcnQpCi0gIHsKLSAgICB0cnkgewotICAgICAgJGlucHV0VHJhbnNwb3J0ID0gJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKLSAgICAgICRvdXRwdXRUcmFuc3BvcnQgPSAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKLSAgICAgICRpbnB1dFByb3RvY29sID0gJHRoaXMtPmlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICRvdXRwdXRQcm90b2NvbCA9ICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkb3V0cHV0VHJhbnNwb3J0KTsKLSAgICAgIHdoaWxlICgkdGhpcy0+cHJvY2Vzc29yXy0+cHJvY2VzcygkaW5wdXRQcm90b2NvbCwgJG91dHB1dFByb3RvY29sKSkgeyB9Ci0gICAgICBAJHRyYW5zcG9ydC0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7IH0KLQotICAgIGV4aXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdHMgYW55IGNoaWxkcmVuIHdlIG1heSBoYXZlCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHJpdmF0ZSBmdW5jdGlvbiBjb2xsZWN0Q2hpbGRyZW4oKQotICB7Ci0gICAgZm9yZWFjaCAoJHRoaXMtPmNoaWxkcmVuXyBhcyAkcGlkID0+ICR0cmFuc3BvcnQpIHsKLSAgICAgIGlmIChwY250bF93YWl0cGlkKCRwaWQsICRzdGF0dXMsIFdOT0hBTkcpID4gMCkgewotICAgICAgICB1bnNldCgkdGhpcy0+Y2hpbGRyZW5fWyRwaWRdKTsKLSAgICAgICAgaWYgKCR0cmFuc3BvcnQpIEAkdHJhbnNwb3J0LT5jbG9zZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgc2VydmVyIHJ1bm5pbmcuIEtpbGxzIHRoZSB0cmFuc3BvcnQKLSAgICogYW5kIHRoZW4gc3RvcHMgdGhlIG1haW4gc2VydmluZyBsb29wCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgJHRoaXMtPnN0b3BfID0gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZDc2Y2MuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3BocAotCi1uYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKLQotdXNlIFRocmlmdFxGYWN0b3J5XFRUcmFuc3BvcnRGYWN0b3J5OwotdXNlIFRocmlmdFxGYWN0b3J5XFRQcm90b2NvbEZhY3Rvcnk7Ci0KLS8qKgotICogR2VuZXJpYyBjbGFzcyBmb3IgYSBUaHJpZnQgc2VydmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKLSAqLwotYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgotewotICAvKioKLSAgICogUHJvY2Vzc29yIHRvIGhhbmRsZSBuZXcgY2xpZW50cwotICAgKgotICAgKiBAdmFyIFRQcm9jZXNzb3IKLSAgICovCi0gIHByb3RlY3RlZCAkcHJvY2Vzc29yXzsKLQotICAvKioKLSAgICogU2VydmVyIHRyYW5zcG9ydCB0byBiZSB1c2VkIGZvciBsaXN0ZW5pbmcKLSAgICogYW5kIGFjY2VwdGluZyBuZXcgY2xpZW50cwotICAgKgotICAgKiBAdmFyIFRTZXJ2ZXJUcmFuc3BvcnQKLSAgICovCi0gIHByb3RlY3RlZCAkdHJhbnNwb3J0XzsKLQotICAvKioKLSAgICogSW5wdXQgdHJhbnNwb3J0IGZhY3RvcnkKLSAgICoKLSAgICogQHZhciBUVHJhbnNwb3J0RmFjdG9yeQotICAgKi8KLSAgcHJvdGVjdGVkICRpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOwotCi0gIC8qKgotICAgKiBPdXRwdXQgdHJhbnNwb3J0IGZhY3RvcnkKLSAgICoKLSAgICogQHZhciBUVHJhbnNwb3J0RmFjdG9yeQotICAgKi8KLSAgcHJvdGVjdGVkICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKLQotICAvKioKLSAgICogSW5wdXQgcHJvdG9jb2wgZmFjdG9yeQotICAgKgotICAgKiBAdmFyIFRQcm90b2NvbEZhY3RvcnkKLSAgICovCi0gIHByb3RlY3RlZCAkaW5wdXRQcm90b2NvbEZhY3RvcnlfOwotCi0gIC8qKgotICAgKiBPdXRwdXQgcHJvdG9jb2wgZmFjdG9yeQotICAgKgotICAgKiBAdmFyIFRQcm90b2NvbEZhY3RvcnkKLSAgICovCi0gIHByb3RlY3RlZCAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKLQotICAvKioKLSAgICogU2V0cyB1cCBhbGwgdGhlIGZhY3RvcmllcywgZXRjCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgJHByb2Nlc3NvcgotICAgKiBAcGFyYW0gVFNlcnZlclRyYW5zcG9ydCAkdHJhbnNwb3J0Ci0gICAqIEBwYXJhbSBUVHJhbnNwb3J0RmFjdG9yeSAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5Ci0gICAqIEBwYXJhbSBUVHJhbnNwb3J0RmFjdG9yeSAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeQotICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkaW5wdXRQcm90b2NvbEZhY3RvcnkKLSAgICogQHBhcmFtIFRQcm90b2NvbEZhY3RvcnkgJG91dHB1dFByb3RvY29sRmFjdG9yeQotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCAkdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgJGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSAkaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5ICRvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKLSAgICAkdGhpcy0+cHJvY2Vzc29yXyA9ICRwcm9jZXNzb3I7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OwotICAgICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfID0gJGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8gPSAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICAkdGhpcy0+aW5wdXRQcm90b2NvbEZhY3RvcnlfID0gJGlucHV0UHJvdG9jb2xGYWN0b3J5OwotICAgICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gJG91dHB1dFByb3RvY29sRmFjdG9yeTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXJ2ZXMgdGhlIHNlcnZlci4gVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuCi0gICAqIHVubGVzcyBhIHByb2JsZW0gcGVybWl0cyBpdCB0byBkbyBzbyBvciBpdAotICAgKiBpcyBpbnRlcnJ1cHRlZCBpbnRlbnRpb25hbGx5Ci0gICAqCi0gICAqIEBhYnN0cmFjdAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpOwotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgc2VydmVyIHNlcnZpbmcKLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHN0b3AoKTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWZmMjljLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD9waHAKLQotbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRTb2NrZXQ7Ci0KLS8qKgotICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgc2VydmVyIGFnZW50LgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVFNlcnZlclNvY2tldCBleHRlbmRzIFRTZXJ2ZXJUcmFuc3BvcnQKLXsKLSAgLyoqCi0gICAqIEhhbmRsZSBmb3IgdGhlIGxpc3RlbmVyIHNvY2tldAotICAgKgotICAgKiBAdmFyIHJlc291cmNlCi0gICAqLwotICBwcml2YXRlICRsaXN0ZW5lcl87Ci0KLSAgLyoqCi0gICAqIFBvcnQgZm9yIHRoZSBsaXN0ZW5lciB0byBsaXN0ZW4gb24KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHBvcnRfOwotCi0gIC8qKgotICAgKiBUaW1lb3V0IHdoZW4gbGlzdGVuaW5nIGZvciBhIG5ldyBjbGllbnQKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJGFjY2VwdFRpbWVvdXRfID0gMzAwMDA7Ci0KLSAgLyoqCi0gICAqIEhvc3QgdG8gbGlzdGVuIG9uCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcml2YXRlICRob3N0XzsKLQotICAvKioKLSAgICogU2VydmVyU29ja2V0IGNvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgICAgICAgIEhvc3QgdG8gbGlzdGVuIG9uCi0gICAqIEBwYXJhbSBpbnQgJHBvcnQgICAgICAgICAgIFBvcnQgdG8gbGlzdGVuIG9uCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0ID0gJ2xvY2FsaG9zdCcsICRwb3J0ID0gOTA5MCkKLSAgewotICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OwotICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGFjY2VwdCB0aW1lb3V0Ci0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGFjY2VwdFRpbWVvdXQKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0QWNjZXB0VGltZW91dCgkYWNjZXB0VGltZW91dCkKLSAgewotICAgICR0aGlzLT5hY2NlcHRUaW1lb3V0XyA9ICRhY2NlcHRUaW1lb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW5zIGEgbmV3IHNvY2tldCBzZXJ2ZXIgaGFuZGxlCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpCi0gIHsKLSAgICAkdGhpcy0+bGlzdGVuZXJfID0gc3RyZWFtX3NvY2tldF9zZXJ2ZXIoJ3RjcDovLycgLiAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgc29ja2V0IHNlcnZlciBoYW5kbGUKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQotICB7Ci0gICAgQGZjbG9zZSgkdGhpcy0+bGlzdGVuZXJfKTsKLSAgICAkdGhpcy0+bGlzdGVuZXJfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhY2NlcHQuIElmIG5vdCBjbGllbnQgaXMgYWNjZXB0ZWQgaW4gdGhlIGdpdmVuIHRpbWUKLSAgICoKLSAgICogQHJldHVybiBUU29ja2V0Ci0gICAqLwotICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpCi0gIHsKLSAgICAkaGFuZGxlID0gQHN0cmVhbV9zb2NrZXRfYWNjZXB0KCR0aGlzLT5saXN0ZW5lcl8sICR0aGlzLT5hY2NlcHRUaW1lb3V0XyAvIDEwMDAuMCk7Ci0gICAgaWYoISRoYW5kbGUpIHJldHVybiBudWxsOwotCi0gICAgJHNvY2tldCA9IG5ldyBUU29ja2V0KCk7Ci0gICAgJHNvY2tldC0+c2V0SGFuZGxlKCRoYW5kbGUpOwotCi0gICAgcmV0dXJuICRzb2NrZXQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODJkMDZkLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3BocAotCi1uYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBHZW5lcmljIGNsYXNzIGZvciBTZXJ2ZXIgYWdlbnQuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1hYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0Ci17Ci0gIC8qKgotICAgKiBMaXN0IGZvciBuZXcgY2xpZW50cwotICAgKgotICAgKiBAYWJzdHJhY3QKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbGlzdGVuKCk7Ci0KLSAgLyoqCi0gICAqIENsb3NlIHRoZSBzZXJ2ZXIKLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCk7Ci0KLSAgLyoqCi0gICAqIFN1YmNsYXNzZXMgc2hvdWxkIHVzZSB0aGlzIHRvIGltcGxlbWVudAotICAgKiBhY2NlcHQuCi0gICAqCi0gICAqIEBhYnN0cmFjdAotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKLSAgICovCi0gIGFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCk7Ci0KLSAgLyoqCi0gICAqIFVzZXMgdGhlIGFjY2VwdCBpbXBsZW10YXRpb24uIElmIG51bGwgaXMgcmV0dXJuZWQsIGFuCi0gICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQotICB7Ci0gICAgJHRyYW5zcG9ydCA9ICR0aGlzLT5hY2NlcHRJbXBsKCk7Ci0KLSAgICBpZiAoJHRyYW5zcG9ydCA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOwotICAgIH0KLQotICAgIHJldHVybiAkdHJhbnNwb3J0OwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2ltcGxlU2VydmVyLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3NzcwMC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD9waHAKLQotbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7Ci0KLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Ci0KLS8qKgotICogU2ltcGxlIGltcGxlbXRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgotICovCi1jbGFzcyBUU2ltcGxlU2VydmVyIGV4dGVuZHMgVFNlcnZlcgotewotICAvKioKLSAgICogRmxhZyBmb3IgdGhlIG1haW4gc2VydmluZyBsb29wCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkc3RvcF8gPSBmYWxzZTsKLQotICAvKioKLSAgICogTGlzdGVucyBmb3IgbmV3IGNsaWVudCB1c2luZyB0aGUgc3VwcGxpZWQKLSAgICogdHJhbnNwb3J0LiBJdCBoYW5kbGVzIFRUcmFuc3BvcnRFeGNlcHRpb25zCi0gICAqIHRvIGF2b2lkIHRpbWVvdXRzIGV0YyBraWxsaW5nIGl0Ci0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5saXN0ZW4oKTsKLQotICAgIHdoaWxlICghJHRoaXMtPnN0b3BfKSB7Ci0gICAgICB0cnkgewotICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPnRyYW5zcG9ydF8tPmFjY2VwdCgpOwotCi0gICAgICAgIGlmICgkdHJhbnNwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAkaW5wdXRUcmFuc3BvcnQgPSAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOwotICAgICAgICAgICRvdXRwdXRUcmFuc3BvcnQgPSAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKLSAgICAgICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAgICAgJG91dHB1dFByb3RvY29sID0gJHRoaXMtPm91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRvdXRwdXRUcmFuc3BvcnQpOwotICAgICAgICAgIHdoaWxlICgkdGhpcy0+cHJvY2Vzc29yXy0+cHJvY2VzcygkaW5wdXRQcm90b2NvbCwgJG91dHB1dFByb3RvY29sKSkgeyB9Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgc2VydmVyIHJ1bm5pbmcuIEtpbGxzIHRoZSB0cmFuc3BvcnQKLSAgICogYW5kIHRoZW4gc3RvcHMgdGhlIG1haW4gc2VydmluZyBsb29wCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgJHRoaXMtPnN0b3BfID0gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4Zjk1Yi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvY2Vzc29yCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwotdXNlIFRocmlmdFxQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbDsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sRGVjb3JhdG9yOwotdXNlIFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTsKLQotLyoqCi0gKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+IGlzIGEgUHJvY2Vzc29yIGFsbG93aW5nCi0gKiBhIHNpbmdsZSA8Y29kZT5UU2VydmVyPC9jb2RlPiB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgotICoKLSAqIDxwPlRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsCi0gKiBwcm9jZXNzb3JzIHdpdGggaXQsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8L3A+Ci0gKgotICogPGJsb2NrcXVvdGU+PGNvZGU+Ci0gKiAgICAgJHByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKLSAqCi0gKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKLSAqICAgICAgICAgIkNhbGN1bGF0b3IiLAotICogICAgICAgICBuZXcgXHR1dG9yaWFsXENhbGN1bGF0b3JQcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKLSAqCi0gKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKLSAqICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAotICogICAgICAgICBuZXcgXHR1dG9yaWFsXFdlYXRoZXJSZXBvcnRQcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKLSAqCi0gKiAgICAgJHByb2Nlc3Nvci0+cHJvY2VzcygkcHJvdG9jb2wsICRwcm90b2NvbCk7Ci0gKiA8L2NvZGU+PC9ibG9ja3F1b3RlPgotICovCi0KLWNsYXNzIFRNdWx0aXBsZXhlZFByb2Nlc3NvcgotewotICAgIHByaXZhdGUgJHNlcnZpY2VQcm9jZXNzb3JNYXBfOwotCi0gICAgLyoqCi0gICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4uICBUaGlzCi0gICAgICogYWxsb3dzIHVzIHRvIGJyb2tlciByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlCi0gICAgICogbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKLSAgICAgKiBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCi0gICAgICogQHBhcmFtIHByb2Nlc3NvciBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8KLSAgICAgKiBhcyAiaGFuZGxlcnMiLCBlLmcuIFdlYXRoZXJSZXBvcnRIYW5kbGVyIGltcGxlbWVudGluZyBXZWF0aGVyUmVwb3J0LklmYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlclByb2Nlc3Nvcigkc2VydmljZU5hbWUsICRwcm9jZXNzb3IpCi0gICAgewotICAgICAgICAkdGhpcy0+c2VydmljZVByb2Nlc3Nvck1hcF9bJHNlcnZpY2VOYW1lXSA9ICRwcm9jZXNzb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgotICAgICAqCi0gICAgICogPG9sPgotICAgICAqICAgICA8bGk+UmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLjwvbGk+Ci0gICAgICogICAgIDxsaT5FeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS48L2xpPgotICAgICAqICAgICA8bGk+VXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3Nvci48L2xpPgotICAgICAqICAgICA8bGk+RGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKLSAgICAgKiAgICAgICAgIHRoYXQgYWxsb3dzIHJlYWRNZXNzYWdlQmVnaW4oKSB0byByZXR1cm4gdGhlIG9yaWdpbmFsIE1lc3NhZ2UuPC9saT4KLSAgICAgKiA8L29sPgotICAgICAqCi0gICAgICogQHRocm93cyBURXhjZXB0aW9uIElmIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLCBpZgotICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yIGlmIHRoZSBzZXJ2aWNlCi0gICAgICogICAgICAgICAgICAgICAgICAgIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VydmljZSBtYXAuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoVFByb3RvY29sICRpbnB1dCwgVFByb3RvY29sICRvdXRwdXQpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgICAgVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCi0gICAgICAgICAgICBtZXNzYWdlIGhlYWRlci4gVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKLSAgICAgICAgICAgIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLgotICAgICAgICAqLwotICAgICAgICAkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOwotCi0gICAgICAgIGlmICgkbXR5cGUgIT09IFRNZXNzYWdlVHlwZTo6Q0FMTCAmJiAkbXR5cGUgIT0gVE1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJUaGlzIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCE/Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgYW5kIHRoZSBuZXcgTWVzc2FnZSBuYW1lLgotICAgICAgICBpZiAoc3RycG9zKCRmbmFtZSwgVE11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUikgPT09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6IHskZm5hbWV9LiBEaWQgeW91ICIgLgotICAgICAgICAgICAgICAgICJmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpOwotICAgICAgICB9Ci0gICAgICAgIGxpc3QoJHNlcnZpY2VOYW1lLCAkbWVzc2FnZU5hbWUpID0gZXhwbG9kZSgnOicsICRmbmFtZSwgMik7Ci0gICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygkc2VydmljZU5hbWUsICR0aGlzLT5zZXJ2aWNlUHJvY2Vzc29yTWFwXykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiB7JHNlcnZpY2VOYW1lfS4gIERpZCB5b3UgZm9yZ2V0ICIgLgotICAgICAgICAgICAgICAgICJ0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCi0gICAgICAgICRwcm9jZXNzb3IgPSAkdGhpcy0+c2VydmljZVByb2Nlc3Nvck1hcF9bJHNlcnZpY2VOYW1lXTsKLQotICAgICAgICByZXR1cm4gJHByb2Nlc3Nvci0+cHJvY2VzcygKLSAgICAgICAgICAgIG5ldyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woJGlucHV0LCAkbWVzc2FnZU5hbWUsICRtdHlwZSwgJHJzZXFpZCksICRvdXRwdXQKLSAgICAgICAgKTsKLSAgICB9Ci19Ci0KLS8qKgotICogIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKLSAqICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgdGhlIE1lc3NhZ2UgaW4gZXhhY3RseQotICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gdGhlIE1lc3NhZ2UgbmFtZS4KLSAqLwotY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yCi17Ci0gICAgcHJpdmF0ZSAkZm5hbWVfLCAkbXR5cGVfLCAkcnNlcWlkXzsKLQotICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sLCAkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCkKLSAgICB7Ci0gICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHByb3RvY29sKTsKLSAgICAgICAgJHRoaXMtPmZuYW1lXyAgPSAkZm5hbWU7Ci0gICAgICAgICR0aGlzLT5tdHlwZV8gID0gJG10eXBlOwotICAgICAgICAkdGhpcy0+cnNlcWlkXyA9ICRyc2VxaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCi0gICAgewotICAgICAgICAkbmFtZSAgPSAkdGhpcy0+Zm5hbWVfOwotICAgICAgICAkdHlwZSAgPSAkdGhpcy0+bXR5cGVfOwotICAgICAgICAkc2VxaWQgPSAkdGhpcy0+cnNlcWlkXzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NTRhZDMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBCdWZmZXJlZCB0cmFuc3BvcnQuIFN0b3JlcyBkYXRhIHRvIGFuIGludGVybmFsIGJ1ZmZlciB0aGF0IGl0IGRvZXNuJ3QKLSAqIGFjdHVhbGx5IHdyaXRlIG91dCB1bnRpbCBmbHVzaCBpcyBjYWxsZWQuIEZvciByZWFkaW5nLCB3ZSBkbyBhIGdyZWVkeQotICogcmVhZCBhbmQgdGhlbiBzZXJ2ZSBkYXRhIG91dCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAotewotICAvKioKLSAgICogQ29uc3RydWN0b3IuIENyZWF0ZXMgYSBidWZmZXJlZCB0cmFuc3BvcnQgYXJvdW5kIGFuIHVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zcG9ydD1udWxsLCAkckJ1ZlNpemU9NTEyLCAkd0J1ZlNpemU9NTEyKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OwotICAgICR0aGlzLT5yQnVmU2l6ZV8gPSAkckJ1ZlNpemU7Ci0gICAgJHRoaXMtPndCdWZTaXplXyA9ICR3QnVmU2l6ZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQKLSAgICoKLSAgICogQHZhciBUVHJhbnNwb3J0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRyYW5zcG9ydF8gPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgcmVjZWl2ZSBidWZmZXIgc2l6ZQotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRyQnVmU2l6ZV8gPSA1MTI7Ci0KLSAgLyoqCi0gICAqIFRoZSB3cml0ZSBidWZmZXIgc2l6ZQotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICR3QnVmU2l6ZV8gPSA1MTI7Ci0KLSAgLyoqCi0gICAqIFRoZSB3cml0ZSBidWZmZXIuCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHdCdWZfID0gJyc7Ci0KLSAgLyoqCi0gICAqIFRoZSByZWFkIGJ1ZmZlci4KLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkckJ1Zl8gPSAnJzsKLQotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+b3BlbigpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpCi0gIHsKLSAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICRkYXRhOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAoJGRhdGEgLiAkdGhpcy0+ckJ1Zl8pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgcmVhc29uIHRoYXQgd2UgY3VzdG9taXplIHJlYWRBbGwgaGVyZSBpcyB0aGF0IHRoZSBtYWpvcml0eSBvZiBQSFAKLSAgICogc3RyZWFtcyBhcmUgYWxyZWFkeSBpbnRlcm5hbGx5IGJ1ZmZlcmVkIGJ5IFBIUC4gVGhlIHNvY2tldCBzdHJlYW0sIGZvcgotICAgKiBleGFtcGxlLCBidWZmZXJzIGludGVybmFsbHkgYW5kIGJsb2NrcyBpZiB5b3UgY2FsbCByZWFkIHdpdGggJGxlbiBncmVhdGVyCi0gICAqIHRoYW4gdGhlIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZSwgdW5saWtlIHJlY3YoKSBpbiBDLgotICAgKgotICAgKiBUaGVyZWZvcmUsIHVzZSB0aGUgcmVhZEFsbCBtZXRob2Qgb2YgdGhlIHdyYXBwZWQgdHJhbnNwb3J0IGluc2lkZQotICAgKiB0aGUgYnVmZmVyZWQgcmVhZEFsbC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCi0gIHsKLSAgICAkaGF2ZSA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pOwotICAgIGlmICgkaGF2ZSA9PSAwKSB7Ci0gICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRsZW4pOwotICAgIH0gZWxzZWlmICgkaGF2ZSA8ICRsZW4pIHsKLSAgICAgICRkYXRhID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gJyc7Ci0gICAgICAkZGF0YSAuPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuIC0gJGhhdmUpOwotICAgIH0gZWxzZWlmICgkaGF2ZSA9PSAkbGVuKSB7Ci0gICAgICAkZGF0YSA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICcnOwotICAgIH0gZWxzZWlmICgkaGF2ZSA+ICRsZW4pIHsKLSAgICAgICRkYXRhID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQotICB7Ci0gICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkdGhpcy0+ckJ1ZlNpemVfKTsKLSAgICB9Ci0KLSAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPD0gJGxlbikgewotICAgICAgJHJldCA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICcnOwotCi0gICAgICByZXR1cm4gJHJldDsKLSAgICB9Ci0KLSAgICAkcmV0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7Ci0gICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7Ci0KLSAgICByZXR1cm4gJHJldDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQotICB7Ci0gICAgJHRoaXMtPndCdWZfIC49ICRidWY7Ci0gICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID49ICR0aGlzLT53QnVmU2l6ZV8pIHsKLSAgICAgICRvdXQgPSAkdGhpcy0+d0J1Zl87Ci0KLSAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKLSAgICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCi0gICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCi0gICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKLSAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQotICB7Ci0gICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID4gMCkgewotICAgICAgJG91dCA9ICR0aGlzLT53QnVmXzsKLQotICAgICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQotICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKLSAgICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KLSAgICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOwotICAgIH0KLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjNlNjk0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogSFRUUCBjbGllbnQgZm9yIFRocmlmdAotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEN1cmxDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0Ci17Ci0gIHByaXZhdGUgc3RhdGljICRjdXJsSGFuZGxlOwotCi0gIC8qKgotICAgKiBUaGUgaG9zdCB0byBjb25uZWN0IHRvCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJGhvc3RfOwotCi0gIC8qKgotICAgKiBUaGUgcG9ydCB0byBjb25uZWN0IG9uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHBvcnRfOwotCi0gIC8qKgotICAgKiBUaGUgVVJJIHRvIHJlcXVlc3QKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkdXJpXzsKLQotICAvKioKLSAgICogVGhlIHNjaGVtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LCBpLmUuIGh0dHAsIGh0dHBzCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHNjaGVtZV87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVxdWVzdCBkYXRhCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHJlcXVlc3RfOwotCi0gIC8qKgotICAgKiBCdWZmZXIgZm9yIHRoZSBIVFRQIHJlc3BvbnNlIGRhdGEuCi0gICAqCi0gICAqIEB2YXIgYmluYXJ5IHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRyZXNwb25zZV87Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGltZW91dAotICAgKgotICAgKiBAdmFyIGZsb2F0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRpbWVvdXRfOwotCi0gIC8qKgotICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0Ci0gICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKLSAgICogQHBhcmFtIHN0cmluZyAkdXJpCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0PTgwLCAkdXJpPScnLCAkc2NoZW1lID0gJ2h0dHAnKQotICB7Ci0gICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7Ci0gICAgICAkdXJpID0gJy8nLiR1cmk7Ci0gICAgfQotICAgICR0aGlzLT5zY2hlbWVfID0gJHNjaGVtZTsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+dXJpXyA9ICR1cmk7Ci0gICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7Ci0gICAgJHRoaXMtPnJlc3BvbnNlXyA9IG51bGw7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgcmVhZCB0aW1lb3V0Ci0gICAqCi0gICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXRTZWNzKCR0aW1lb3V0KQotICB7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gJHRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgotICAgKgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCi0gIHsKLSAgICAkdGhpcy0+cmVxdWVzdF8gPSAnJzsKLSAgICAkdGhpcy0+cmVzcG9uc2VfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KLSAgICoKLSAgICogQHBhcmFtIGludCAgICAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQotICB7Ci0gICAgaWYgKCRsZW4gPj0gc3RybGVuKCR0aGlzLT5yZXNwb25zZV8pKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlc3BvbnNlXzsKLSAgICB9IGVsc2UgewotICAgICAgJHJldCA9IHN1YnN0cigkdGhpcy0+cmVzcG9uc2VfLCAwLCAkbGVuKTsKLSAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBzdWJzdHIoJHRoaXMtPnJlc3BvbnNlXywgJGxlbik7Ci0KLSAgICAgIHJldHVybiAkcmV0OwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgc29tZSBkYXRhIGludG8gdGhlIHBlbmRpbmcgYnVmZmVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiAgVGhlIGRhdGEgdG8gd3JpdGUKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQotICB7Ci0gICAgJHRoaXMtPnJlcXVlc3RfIC49ICRidWY7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbnMgYW5kIHNlbmRzIHRoZSBhY3R1YWwgcmVxdWVzdCBvdmVyIHRoZSBIVFRQIGNvbm5lY3Rpb24KLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGEgd3JpdGluZyBlcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCi0gIHsKLSAgICBpZiAoIXNlbGY6OiRjdXJsSGFuZGxlKSB7Ci0gICAgICByZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihhcnJheSgnVGhyaWZ0XFxUcmFuc3BvcnRcXFRDdXJsQ2xpZW50JywgJ2Nsb3NlQ3VybEhhbmRsZScpKTsKLSAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gY3VybF9pbml0KCk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9CSU5BUllUUkFOU0ZFUiwgdHJ1ZSk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9VU0VSQUdFTlQsICdQSFAvVEN1cmxDbGllbnQnKTsKLSAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsICdQT1NUJyk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgdHJ1ZSk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9NQVhSRURJUlMsIDEpOwotICAgIH0KLSAgICAvLyBHb2QsIFBIUCByZWFsbHkgaGFzIHNvbWUgZXNvdGVyaWMgd2F5cyBvZiBkb2luZyBzaW1wbGUgdGhpbmdzLgotICAgICRob3N0ID0gJHRoaXMtPmhvc3RfLigkdGhpcy0+cG9ydF8gIT0gODAgPyAnOicuJHRoaXMtPnBvcnRfIDogJycpOwotICAgICRmdWxsVXJsID0gJHRoaXMtPnNjaGVtZV8uIjovLyIuJGhvc3QuJHRoaXMtPnVyaV87Ci0KLSAgICAkaGVhZGVycyA9IGFycmF5KCdBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LUxlbmd0aDogJy5UU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJlcXVlc3RfKSk7Ci0gICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfSFRUUEhFQURFUiwgJGhlYWRlcnMpOwotCi0gICAgaWYgKCR0aGlzLT50aW1lb3V0XyA+IDApIHsKLSAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1RJTUVPVVQsICR0aGlzLT50aW1lb3V0Xyk7Ci0gICAgfQotICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1BPU1RGSUVMRFMsICR0aGlzLT5yZXF1ZXN0Xyk7Ci0gICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7Ci0KLSAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9VUkwsICRmdWxsVXJsKTsKLSAgICAkdGhpcy0+cmVzcG9uc2VfID0gY3VybF9leGVjKHNlbGY6OiRjdXJsSGFuZGxlKTsKLQotICAgIC8vIENvbm5lY3QgZmFpbGVkPwotICAgIGlmICghJHRoaXMtPnJlc3BvbnNlXykgewotICAgICAgY3VybF9jbG9zZShzZWxmOjokY3VybEhhbmRsZSk7Ci0gICAgICBzZWxmOjokY3VybEhhbmRsZSA9IG51bGw7Ci0gICAgICAkZXJyb3IgPSAnVEN1cmxDbGllbnQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJGZ1bGxVcmw7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsb3NlQ3VybEhhbmRsZSgpCi0gIHsKLSAgICB0cnkgewotICAgICAgaWYgKHNlbGY6OiRjdXJsSGFuZGxlKSB7Ci0gICAgICAgIGN1cmxfY2xvc2Uoc2VsZjo6JGN1cmxIYW5kbGUpOwotICAgICAgICBzZWxmOjokY3VybEhhbmRsZSA9IG51bGw7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkeCkgewotICAgICAgZXJyb3JfbG9nKCdUaGVyZSB3YXMgYW4gZXJyb3IgY2xvc2luZyB0aGUgY3VybCBoYW5kbGU6ICcgLiAkeC0+Z2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTY0YTkuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7Ci0KLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogRnJhbWVkIHRyYW5zcG9ydC4gV3JpdGVzIGFuZCByZWFkcyBkYXRhIGluIGNodW5rcyB0aGF0IGFyZSBzdGFtcGVkIHdpdGgKLSAqIHRoZWlyIGxlbmd0aC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Ci17Ci0gIC8qKgotICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydCBvYmplY3QuCi0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydAotICAgKi8KLSAgcHJpdmF0ZSAkdHJhbnNwb3J0XzsKLQotICAvKioKLSAgICogQnVmZmVyIGZvciByZWFkIGRhdGEuCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcml2YXRlICRyQnVmXzsKLQotICAvKioKLSAgICogQnVmZmVyIGZvciBxdWV1ZWQgb3V0cHV0IGRhdGEKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByaXZhdGUgJHdCdWZfOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGZyYW1lIHJlYWRzCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkcmVhZF87Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gZnJhbWUgd3JpdGVzCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkd3JpdGVfOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydCBVbmRlcmx5aW5nIHRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFuc3BvcnQ9bnVsbCwgJHJlYWQ9dHJ1ZSwgJHdyaXRlPXRydWUpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7Ci0gICAgJHRoaXMtPnJlYWRfID0gJHJlYWQ7Ci0gICAgJHRoaXMtPndyaXRlXyA9ICR3cml0ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgZnJvbSB0aGUgYnVmZmVyLiBXaGVuIG1vcmUgZGF0YSBpcyByZXF1aXJlZCByZWFkcyBhbm90aGVyIGVudGlyZQotICAgKiBjaHVuayBhbmQgc2VydmVzIGZ1dHVyZSByZWFkcyBvdXQgb2YgdGhhdC4KLSAgICoKLSAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCi0gIHsKLSAgICBpZiAoISR0aGlzLT5yZWFkXykgewotICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkKCRsZW4pOwotICAgIH0KLQotICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJlYWRGcmFtZSgpOwotICAgIH0KLQotICAgIC8vIEp1c3QgcmV0dXJuIGZ1bGwgYnVmZgotICAgIGlmICgkbGVuID49IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pKSB7Ci0gICAgICAkb3V0ID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gbnVsbDsKLQotICAgICAgcmV0dXJuICRvdXQ7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cgotICAgICRvdXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKLSAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKLQotICAgIHJldHVybiAkb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dCBwcmV2aW91c2x5IHJlYWQgZGF0YSBiYWNrIGludG8gdGhlIGJ1ZmZlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRkYXRhIGRhdGEgdG8gcmV0dXJuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkKLSAgewotICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJCdWZfID0gJGRhdGE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGEgY2h1bmsgb2YgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gcmVhZEZyYW1lKCkKLSAgewotICAgICRidWYgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCg0KTsKLSAgICAkdmFsID0gdW5wYWNrKCdOJywgJGJ1Zik7Ci0gICAgJHN6ID0gJHZhbFsxXTsKLQotICAgICR0aGlzLT5yQnVmXyA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRzeik7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHNvbWUgZGF0YSB0byB0aGUgcGVuZGluZyBvdXRwdXQgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEKLSAgICogQHBhcmFtIGludCAgICAkbGVuIExpbWl0IG9mIGJ5dGVzIHRvIHdyaXRlCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZiwgJGxlbj1udWxsKQotICB7Ci0gICAgaWYgKCEkdGhpcy0+d3JpdGVfKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRidWYsICRsZW4pOwotICAgIH0KLQotICAgIGlmICgkbGVuICE9PSBudWxsICYmICRsZW4gPCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikpIHsKLSAgICAgICRidWYgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJGJ1ZiwgMCwgJGxlbik7Ci0gICAgfQotICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgc3RyZWFtIGluIHRoZSBmb3JtYXQgb2YgYSA0LWJ5dGUgbGVuZ3RoCi0gICAqIGZvbGxvd2VkIGJ5IHRoZSBhY3R1YWwgZGF0YS4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCi0gIHsKLSAgICBpZiAoISR0aGlzLT53cml0ZV8gfHwgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT53QnVmXykgPT0gMCkgewotICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOwotICAgIH0KLQotICAgICRvdXQgPSBwYWNrKCdOJywgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT53QnVmXykpOwotICAgICRvdXQgLj0gJHRoaXMtPndCdWZfOwotCi0gICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQotICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCi0gICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgotICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzcyYWI3Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogSFRUUCBjbGllbnQgZm9yIFRocmlmdAotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEh0dHBDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0Ci17Ci0gIC8qKgotICAgKiBUaGUgaG9zdCB0byBjb25uZWN0IHRvCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJGhvc3RfOwotCi0gIC8qKgotICAgKiBUaGUgcG9ydCB0byBjb25uZWN0IG9uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHBvcnRfOwotCi0gIC8qKgotICAgKiBUaGUgVVJJIHRvIHJlcXVlc3QKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkdXJpXzsKLQotICAvKioKLSAgICogVGhlIHNjaGVtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LCBpLmUuIGh0dHAsIGh0dHBzCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHNjaGVtZV87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVxdWVzdCBkYXRhCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJGJ1Zl87Ci0KLSAgLyoqCi0gICAqIElucHV0IHNvY2tldCBzdHJlYW0uCi0gICAqCi0gICAqIEB2YXIgcmVzb3VyY2UKLSAgICovCi0gIHByb3RlY3RlZCAkaGFuZGxlXzsKLQotICAvKioKLSAgICogUmVhZCB0aW1lb3V0Ci0gICAqCi0gICAqIEB2YXIgZmxvYXQKLSAgICovCi0gIHByb3RlY3RlZCAkdGltZW91dF87Ci0KLSAgLyoqCi0gICAqIGh0dHAgaGVhZGVycwotICAgKgotICAgKiBAdmFyIGFycmF5Ci0gICAqLwotICBwcm90ZWN0ZWQgJGhlYWRlcnNfOwotCi0gIC8qKgotICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0Ci0gICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKLSAgICogQHBhcmFtIHN0cmluZyAkdXJpCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0PTgwLCAkdXJpPScnLCAkc2NoZW1lID0gJ2h0dHAnKQotICB7Ci0gICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7Ci0gICAgICAkdXJpID0gJy8nLiR1cmk7Ci0gICAgfQotICAgICR0aGlzLT5zY2hlbWVfID0gJHNjaGVtZTsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+dXJpXyA9ICR1cmk7Ci0gICAgJHRoaXMtPmJ1Zl8gPSAnJzsKLSAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gbnVsbDsKLSAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCByZWFkIHRpbWVvdXQKLSAgICoKLSAgICogQHBhcmFtIGZsb2F0ICR0aW1lb3V0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0VGltZW91dFNlY3MoJHRpbWVvdXQpCi0gIHsKLSAgICAkdGhpcy0+dGltZW91dF8gPSAkdGltZW91dDsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCi0gICAqCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcKLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgLyoqCi0gICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQotICB7Ci0gICAgaWYgKCR0aGlzLT5oYW5kbGVfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgICAgJGxlbiBIb3cgbXVjaCB0byByZWFkCi0gICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKLSAgewotICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKLSAgICBpZiAoJGRhdGEgPT09IEZBTFNFIHx8ICRkYXRhID09PSAnJykgewotICAgICAgJG1kID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJHRoaXMtPmhhbmRsZV8pOwotICAgICAgaWYgKCRtZFsndGltZWRfb3V0J10pIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RIdHRwQ2xpZW50OiB0aW1lZCBvdXQgcmVhZGluZyAnLiRsZW4uJyBieXRlcyBmcm9tICcuJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8uJHRoaXMtPnVyaV8sIFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVEh0dHBDbGllbnQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4kdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xy4kdGhpcy0+dXJpXywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICRkYXRhOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyBzb21lIGRhdGEgaW50byB0aGUgcGVuZGluZyBidWZmZXIKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkYnVmICBUaGUgZGF0YSB0byB3cml0ZQotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd3JpdGluZyBmYWlscwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCi0gIHsKLSAgICAkdGhpcy0+YnVmXyAuPSAkYnVmOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW5zIGFuZCBzZW5kcyB0aGUgYWN0dWFsIHJlcXVlc3Qgb3ZlciB0aGUgSFRUUCBjb25uZWN0aW9uCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQotICB7Ci0gICAgLy8gR29kLCBQSFAgcmVhbGx5IGhhcyBzb21lIGVzb3RlcmljIHdheXMgb2YgZG9pbmcgc2ltcGxlIHRoaW5ncy4KLSAgICAkaG9zdCA9ICR0aGlzLT5ob3N0Xy4oJHRoaXMtPnBvcnRfICE9IDgwID8gJzonLiR0aGlzLT5wb3J0XyA6ICcnKTsKLQotICAgICRoZWFkZXJzID0gYXJyYXkoKTsKLSAgICAkZGVmYXVsdEhlYWRlcnMgPSBhcnJheSgnSG9zdCcgPT4gJGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjY2VwdCcgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCcgPT4gJ1BIUC9USHR0cENsaWVudCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1MZW5ndGgnID0+IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXykpOwotICAgIGZvcmVhY2ggKGFycmF5X21lcmdlKCRkZWZhdWx0SGVhZGVycywgJHRoaXMtPmhlYWRlcnNfKSBhcyAka2V5ID0+ICR2YWx1ZSkgewotICAgICAgICAkaGVhZGVyc1tdID0gIiRrZXk6ICR2YWx1ZSI7Ci0gICAgfQotCi0gICAgJG9wdGlvbnMgPSBhcnJheSgnbWV0aG9kJyA9PiAnUE9TVCcsCi0gICAgICAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBpbXBsb2RlKCJcclxuIiwgJGhlYWRlcnMpLAotICAgICAgICAgICAgICAgICAgICAgJ21heF9yZWRpcmVjdHMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAnY29udGVudCcgPT4gJHRoaXMtPmJ1Zl8pOwotICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7Ci0gICAgICAkb3B0aW9uc1sndGltZW91dCddID0gJHRoaXMtPnRpbWVvdXRfOwotICAgIH0KLSAgICAkdGhpcy0+YnVmXyA9ICcnOwotCi0gICAgJGNvbnRleHRpZCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZShhcnJheSgnaHR0cCcgPT4gJG9wdGlvbnMpKTsKLSAgICAkdGhpcy0+aGFuZGxlXyA9IEBmb3BlbigkdGhpcy0+c2NoZW1lXy4nOi8vJy4kaG9zdC4kdGhpcy0+dXJpXywgJ3InLCBmYWxzZSwgJGNvbnRleHRpZCk7Ci0KLSAgICAvLyBDb25uZWN0IGZhaWxlZD8KLSAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IEZBTFNFKSB7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgICAkZXJyb3IgPSAnVEh0dHBDbGllbnQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJGhvc3QuJHRoaXMtPnVyaV87Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gYWRkSGVhZGVycygkaGVhZGVycykKLSAgewotICAgICR0aGlzLT5oZWFkZXJzXyA9IGFycmF5X21lcmdlKCR0aGlzLT5oZWFkZXJzXywgJGhlYWRlcnMpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmMyNmJmLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7Ci0KLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIEEgbWVtb3J5IGJ1ZmZlciBpcyBhIHRyYW5wc29ydCB0aGF0IHNpbXBseSByZWFkcyBmcm9tIGFuZCB3cml0ZXMgdG8gYW4KLSAqIGluLW1lbW9yeSBzdHJpbmcgYnVmZmVyLiBBbnl0aW1lIHlvdSBjYWxsIHdyaXRlIG9uIGl0LCB0aGUgZGF0YSBpcyBzaW1wbHkKLSAqIHBsYWNlZCBpbnRvIGEgYnVmZmVyLCBhbmQgYW55dGltZSB5b3UgY2FsbCByZWFkLCBkYXRhIGlzIHJlYWQgZnJvbSB0aGF0Ci0gKiBidWZmZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUTWVtb3J5QnVmZmVyIGV4dGVuZHMgVFRyYW5zcG9ydAotewotICAvKioKLSAgICogQ29uc3RydWN0b3IuIE9wdGlvbmFsbHkgcGFzcyBhbiBpbml0aWFsIHZhbHVlCi0gICAqIGZvciB0aGUgYnVmZmVyLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRidWYgPSAnJykKLSAgewotICAgICR0aGlzLT5idWZfID0gJGJ1ZjsKLSAgfQotCi0gIHByb3RlY3RlZCAkYnVmXyA9ICcnOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKLSAgewotICAgICR0aGlzLT5idWZfIC49ICRidWY7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQotICB7Ci0gICAgJGJ1Zkxlbmd0aCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXyk7Ci0KLSAgICBpZiAoJGJ1Zkxlbmd0aCA9PT0gMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RNZW1vcnlCdWZmZXI6IENvdWxkIG5vdCByZWFkICcgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiAuICcgYnl0ZXMgZnJvbSBidWZmZXIuJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwotICAgIH0KLQotICAgIGlmICgkYnVmTGVuZ3RoIDw9ICRsZW4pIHsKLSAgICAgICRyZXQgPSAkdGhpcy0+YnVmXzsKLSAgICAgICR0aGlzLT5idWZfID0gJyc7Ci0KLSAgICAgIHJldHVybiAkcmV0OwotICAgIH0KLQotICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPmJ1Zl8sIDAsICRsZW4pOwotICAgICR0aGlzLT5idWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5idWZfLCAkbGVuKTsKLQotICAgIHJldHVybiAkcmV0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGdldEJ1ZmZlcigpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPmJ1Zl87Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gYXZhaWxhYmxlKCkKLSAgewotICAgIHJldHVybiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWViN2E0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwotCi0vKioKLSAqIFRyYW5zcG9ydCB0aGF0IG9ubHkgYWNjZXB0cyB3cml0ZXMgYW5kIGlnbm9yZXMgdGhlbS4KLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBtZWFzdXJpbmcgdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiBzdHJ1Y3R1cmVzLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVE51bGxUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Ci17Ci0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQotICB7Ci0gICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbid0IHJlYWQgZnJvbSBUTnVsbFRyYW5zcG9ydC4iKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7fQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxNGNkZi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogUGhwIHN0cmVhbSB0cmFuc3BvcnQuIFJlYWRzIHRvIGFuZCB3cml0ZXMgZnJvbSB0aGUgcGhwIHN0YW5kYXJkIHN0cmVhbXMKLSAqIHBocDovL2lucHV0IGFuZCBwaHA6Ly9vdXRwdXQKLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRQaHBTdHJlYW0gZXh0ZW5kcyBUVHJhbnNwb3J0Ci17Ci0gIGNvbnN0IE1PREVfUiA9IDE7Ci0gIGNvbnN0IE1PREVfVyA9IDI7Ci0KLSAgcHJpdmF0ZSAkaW5TdHJlYW1fID0gbnVsbDsKLQotICBwcml2YXRlICRvdXRTdHJlYW1fID0gbnVsbDsKLQotICBwcml2YXRlICRyZWFkXyA9IGZhbHNlOwotCi0gIHByaXZhdGUgJHdyaXRlXyA9IGZhbHNlOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kZSkKLSAgewotICAgICR0aGlzLT5yZWFkXyA9ICRtb2RlICYgc2VsZjo6TU9ERV9SOwotICAgICR0aGlzLT53cml0ZV8gPSAkbW9kZSAmIHNlbGY6Ok1PREVfVzsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKLSAgewotICAgIGlmICgkdGhpcy0+cmVhZF8pIHsKLSAgICAgICR0aGlzLT5pblN0cmVhbV8gPSBAZm9wZW4oc2VsZjo6aW5TdHJlYW1OYW1lKCksICdyJyk7Ci0gICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5pblN0cmVhbV8pKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgb3BlbiBwaHA6Ly9pbnB1dCcpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoJHRoaXMtPndyaXRlXykgewotICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBAZm9wZW4oJ3BocDovL291dHB1dCcsICd3Jyk7Ci0gICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5vdXRTdHJlYW1fKSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vb3V0cHV0Jyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKLSAgewotICAgIGlmICgkdGhpcy0+cmVhZF8pIHsKLSAgICAgIEBmY2xvc2UoJHRoaXMtPmluU3RyZWFtXyk7Ci0gICAgICAkdGhpcy0+aW5TdHJlYW1fID0gbnVsbDsKLSAgICB9Ci0gICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKLSAgICAgIEBmY2xvc2UoJHRoaXMtPm91dFN0cmVhbV8pOwotICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBudWxsOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQotICB7Ci0gICAgcmV0dXJuCi0gICAgICAoISR0aGlzLT5yZWFkXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+aW5TdHJlYW1fKSkgJiYKLSAgICAgICghJHRoaXMtPndyaXRlXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKLSAgewotICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5pblN0cmVhbV8sICRsZW4pOwotICAgIGlmICgkZGF0YSA9PT0gRkFMU0UgfHwgJGRhdGEgPT09ICcnKSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMnKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKLSAgewotICAgIHdoaWxlIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgPiAwKSB7Ci0gICAgICAkZ290ID0gQGZ3cml0ZSgkdGhpcy0+b3V0U3RyZWFtXywgJGJ1Zik7Ci0gICAgICBpZiAoJGdvdCA9PT0gMCB8fCAkZ290ID09PSBGQUxTRSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IHdyaXRlICcuVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpLicgYnl0ZXMnKTsKLSAgICAgIH0KLSAgICAgICRidWYgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJGJ1ZiwgJGdvdCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKLSAgewotICAgIEBmZmx1c2goJHRoaXMtPm91dFN0cmVhbV8pOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5TdHJlYW1OYW1lKCkKLSAgewotICAgIGlmIChwaHBfc2FwaV9uYW1lKCkgPT0gJ2NsaScpIHsKLSAgICAgIHJldHVybiAncGhwOi8vc3RkaW4nOwotICAgIH0KLQotICAgIHJldHVybiAncGhwOi8vaW5wdXQnOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjkzNWQ0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUU29ja2V0IGV4dGVuZHMgVFRyYW5zcG9ydAotewotICAvKioKLSAgICogSGFuZGxlIHRvIFBIUCBzb2NrZXQKLSAgICoKLSAgICogQHZhciByZXNvdXJjZQotICAgKi8KLSAgcHJpdmF0ZSAkaGFuZGxlXyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFJlbW90ZSBob3N0bmFtZQotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRob3N0XyA9ICdsb2NhbGhvc3QnOwotCi0gIC8qKgotICAgKiBSZW1vdGUgcG9ydAotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRwb3J0XyA9ICc5MDkwJzsKLQotICAvKioKLSAgICogU2VuZCB0aW1lb3V0IGluIHNlY29uZHMuCi0gICAqCi0gICAqIENvbWJpbmVkIHdpdGggc2VuZFRpbWVvdXRVc2VjIHRoaXMgaXMgdXNlZCBmb3Igc2VuZCB0aW1lb3V0cy4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHNlbmRUaW1lb3V0U2VjXyA9IDA7Ci0KLSAgLyoqCi0gICAqIFNlbmQgdGltZW91dCBpbiBtaWNyb3NlY29uZHMuCi0gICAqCi0gICAqIENvbWJpbmVkIHdpdGggc2VuZFRpbWVvdXRTZWMgdGhpcyBpcyB1c2VkIGZvciBzZW5kIHRpbWVvdXRzLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkc2VuZFRpbWVvdXRVc2VjXyA9IDEwMDAwMDsKLQotICAvKioKLSAgICogUmVjdiB0aW1lb3V0IGluIHNlY29uZHMKLSAgICoKLSAgICogQ29tYmluZWQgd2l0aCByZWN2VGltZW91dFVzZWMgdGhpcyBpcyB1c2VkIGZvciByZWN2IHRpbWVvdXRzLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkcmVjdlRpbWVvdXRTZWNfID0gMDsKLQotICAvKioKLSAgICogUmVjdiB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcwotICAgKgotICAgKiBDb21iaW5lZCB3aXRoIHJlY3ZUaW1lb3V0U2VjIHRoaXMgaXMgdXNlZCBmb3IgcmVjdiB0aW1lb3V0cy4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHJlY3ZUaW1lb3V0VXNlY18gPSA3NTAwMDA7Ci0KLSAgLyoqCi0gICAqIFBlcnNpc3RlbnQgc29ja2V0IG9yIHBsYWluPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByb3RlY3RlZCAkcGVyc2lzdF8gPSBmYWxzZTsKLQotICAvKioKLSAgICogRGVidWdnaW5nIG9uPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByb3RlY3RlZCAkZGVidWdfID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIERlYnVnIGhhbmRsZXIKLSAgICoKLSAgICogQHZhciBtaXhlZAotICAgKi8KLSAgcHJvdGVjdGVkICRkZWJ1Z0hhbmRsZXJfID0gbnVsbDsKLQotICAvKioKLSAgICogU29ja2V0IGNvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgICAgICAgICBSZW1vdGUgaG9zdG5hbWUKLSAgICogQHBhcmFtIGludCAgICAkcG9ydCAgICAgICAgIFJlbW90ZSBwb3J0Ci0gICAqIEBwYXJhbSBib29sICAgJHBlcnNpc3QgICAgICBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0Ci0gICAqIEBwYXJhbSBzdHJpbmcgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGZvciBlcnJvciBsb2dnaW5nCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3Q9J2xvY2FsaG9zdCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcG9ydD05MDkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBlcnNpc3Q9ZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVidWdIYW5kbGVyPW51bGwpIHsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+cGVyc2lzdF8gPSAkcGVyc2lzdDsKLSAgICAkdGhpcy0+ZGVidWdIYW5kbGVyXyA9ICRkZWJ1Z0hhbmRsZXIgPyAkZGVidWdIYW5kbGVyIDogJ2Vycm9yX2xvZyc7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHJlc291cmNlICRoYW5kbGUKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0SGFuZGxlKCRoYW5kbGUpCi0gIHsKLSAgICAkdGhpcy0+aGFuZGxlXyA9ICRoYW5kbGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2VuZCB0aW1lb3V0LgotICAgKgotICAgKiBAcGFyYW0gaW50ICR0aW1lb3V0ICBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRTZW5kVGltZW91dCgkdGltZW91dCkKLSAgewotICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gPSBmbG9vcigkdGltZW91dCAvIDEwMDApOwotICAgICR0aGlzLT5zZW5kVGltZW91dFVzZWNfID0KLSAgICAgICAgICAgICgkdGltZW91dCAtICgkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICogMTAwMCkpICogMTAwMDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZWNlaXZlIHRpbWVvdXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFJlY3ZUaW1lb3V0KCR0aW1lb3V0KQotICB7Ci0gICAgJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXyA9IGZsb29yKCR0aW1lb3V0IC8gMTAwMCk7Ci0gICAgJHRoaXMtPnJlY3ZUaW1lb3V0VXNlY18gPQotICAgICAgICAgICAgKCR0aW1lb3V0IC0gKCR0aGlzLT5yZWN2VGltZW91dFNlY18gKiAxMDAwKSkgKiAxMDAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgZGVidWdnaW5nIG91dHB1dCBvbiBvciBvZmYKLSAgICoKLSAgICogQHBhcmFtIGJvb2wgJGRlYnVnCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0RGVidWcoJGRlYnVnKQotICB7Ci0gICAgJHRoaXMtPmRlYnVnXyA9ICRkZWJ1ZzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGhvc3QgdGhhdCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KLSAgICoKLSAgICogQHJldHVybiBzdHJpbmcgaG9zdAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldEhvc3QoKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5ob3N0XzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHJlbW90ZSBwb3J0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCi0gICAqCi0gICAqIEByZXR1cm4gaW50IHBvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRQb3J0KCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+cG9ydF87Ci0gIH0KLQotICAvKioKLSAgICogVGVzdHMgd2hldGhlciB0aGlzIGlzIG9wZW4KLSAgICoKLSAgICogQHJldHVybiBib29sIHRydWUgaWYgdGhlIHNvY2tldCBpcyBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKLSAgewotICAgIHJldHVybiBpc19yZXNvdXJjZSgkdGhpcy0+aGFuZGxlXyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29ubmVjdHMgdGhlIHNvY2tldC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKLSAgewotICAgIGlmICgkdGhpcy0+aXNPcGVuKCkpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4pOwotICAgIH0KLQotICAgIGlmIChlbXB0eSgkdGhpcy0+aG9zdF8pKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gbnVsbCBob3N0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotICAgIH0KLQotICAgIGlmICgkdGhpcy0+cG9ydF8gPD0gMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0KLSAgICBpZiAoJHRoaXMtPnBlcnNpc3RfKSB7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IEBwZnNvY2tvcGVuKCR0aGlzLT5ob3N0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gQGZzb2Nrb3BlbigkdGhpcy0+aG9zdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKSk7Ci0gICAgfQotCi0gICAgLy8gQ29ubmVjdCBmYWlsZWQ/Ci0gICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBGQUxTRSkgewotICAgICAgJGVycm9yID0gJ1RTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8uJyAoJy4kZXJyc3RyLicgWycuJGVycm5vLiddKSc7Ci0gICAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKLSAgICAgIH0KLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgc29ja2V0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKLSAgewotICAgIGlmICghJHRoaXMtPnBlcnNpc3RfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBmcm9tIHRoZSBzb2NrZXQgYXQgbW9zdCAkbGVuIGJ5dGVzLgotICAgKgotICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCB3YWl0IGZvciBhbGwgdGhlIHJlcXVlc3RlZCBkYXRhLCBpdCB3aWxsIHJldHVybiBhcwotICAgKiBzb29uIGFzIGFueSBkYXRhIGlzIHJlY2VpdmVkLgotICAgKgotICAgKiBAcGFyYW0gaW50ICRsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KLSAgICogQHJldHVybiBzdHJpbmcgQmluYXJ5IGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCi0gIHsKLSAgICAkbnVsbCA9IG51bGw7Ci0gICAgJHJlYWQgPSBhcnJheSgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgJHJlYWRhYmxlID0gQHN0cmVhbV9zZWxlY3QoJHJlYWQsICRudWxsLCAkbnVsbCwgJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXywgJHRoaXMtPnJlY3ZUaW1lb3V0VXNlY18pOwotCi0gICAgaWYgKCRyZWFkYWJsZSA+IDApIHsKLSAgICAgICRkYXRhID0gQHN0cmVhbV9zb2NrZXRfcmVjdmZyb20oJHRoaXMtPmhhbmRsZV8sICRsZW4pOwotICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSkgewotICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfSBlbHNlaWYgKCRkYXRhID09ICcnICYmIGZlb2YoJHRoaXMtPmhhbmRsZV8pKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQgcmVhZCAwIGJ5dGVzJyk7Ci0gICAgICAgIH0KLQotICAgICAgcmV0dXJuICRkYXRhOwotICAgIH0gZWxzZWlmICgkcmVhZGFibGUgPT09IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfQotICAgIH0KLQotICAvKioKLSAgICogV3JpdGUgdG8gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKLSAgewotICAgICRudWxsID0gbnVsbDsKLSAgICAkd3JpdGUgPSBhcnJheSgkdGhpcy0+aGFuZGxlXyk7Ci0KLSAgICAvLyBrZWVwIHdyaXRpbmcgdW50aWwgYWxsIHRoZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4KLSAgICB3aGlsZSAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpID4gMCkgewotICAgICAgLy8gd2FpdCBmb3Igc3RyZWFtIHRvIGJlY29tZSBhdmFpbGFibGUgZm9yIHdyaXRpbmcKLSAgICAgICR3cml0YWJsZSA9IEBzdHJlYW1fc2VsZWN0KCRudWxsLCAkd3JpdGUsICRudWxsLCAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfLCAkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyk7Ci0gICAgICBpZiAoJHdyaXRhYmxlID4gMCkgewotICAgICAgICAvLyB3cml0ZSBidWZmZXIgdG8gc3RyZWFtCi0gICAgICAgICR3cml0dGVuID0gQHN0cmVhbV9zb2NrZXRfc2VuZHRvKCR0aGlzLT5oYW5kbGVfLCAkYnVmKTsKLSAgICAgICAgaWYgKCR3cml0dGVuID09PSAtMSB8fCAkd3JpdHRlbiA9PT0gZmFsc2UpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcuVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpLicgYnl0ZXMgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgICB9Ci0gICAgICAgIC8vIGRldGVybWluZSBob3cgbXVjaCBvZiB0aGUgYnVmZmVyIGlzIGxlZnQgdG8gd3JpdGUKLSAgICAgICAgJGJ1ZiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkYnVmLCAkd3JpdHRlbik7Ci0gICAgICB9IGVsc2VpZiAoJHdyaXRhYmxlID09PSAwKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCB3cml0aW5nICcuVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3Qgd3JpdGUgJy5UU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikuJyBieXRlcyAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIC8qKgotICAgKiBGbHVzaCBvdXRwdXQgdG8gdGhlIHNvY2tldC4KLSAgICoKLSAgICogU2luY2UgcmVhZCgpLCByZWFkQWxsKCkgYW5kIHdyaXRlKCkgb3BlcmF0ZSBvbiB0aGUgc29ja2V0cyBkaXJlY3RseSwKLSAgICogdGhpcyBpcyBhIG5vLW9wCi0gICAqCi0gICAqIElmIHlvdSB3aXNoIHRvIGhhdmUgZmx1c2hhYmxlIGJ1ZmZlcmluZyBiZWhhdmlvdXIsIHdyYXAgdGhpcyBUU29ja2V0Ci0gICAqIGluIGEgVEJ1ZmZlcmVkVHJhbnNwb3J0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKLSAgewotICAgIC8vIG5vLW9wCi0gICAgfQotICB9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGZmZDhkLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGxpYnJhcnkgbWFrZXMgdXNlIG9mIEFQQyBjYWNoZSB0byBtYWtlIGhvc3RzIGFzIGRvd24gaW4gYSB3ZWIKLSAqIGVudmlyb25tZW50LiBJZiB5b3UgYXJlIHJ1bm5pbmcgZnJvbSB0aGUgQ0xJIG9yIG9uIGEgc3lzdGVtIHdpdGhvdXQgQVBDCi0gKiBpbnN0YWxsZWQsIHRoZW4gdGhlc2UgbnVsbCBmdW5jdGlvbnMgd2lsbCBzdGVwIGluIGFuZCBhY3QgbGlrZSBjYWNoZQotICogbWlzc2VzLgotICovCi1pZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXBjX2ZldGNoJykpIHsKLSAgZnVuY3Rpb24gYXBjX2ZldGNoKCRrZXkpIHsgcmV0dXJuIEZBTFNFOyB9Ci0gIGZ1bmN0aW9uIGFwY19zdG9yZSgka2V5LCAkdmFyLCAkdHRsPTApIHsgcmV0dXJuIEZBTFNFOyB9Ci19Ci0KLS8qKgotICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgY29ubmVjdGlvbgotICogdG8gYSBwb29sIG9mIHNlcnZlcnMuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUU29ja2V0UG9vbCBleHRlbmRzIFRTb2NrZXQKLXsKLSAgLyoqCi0gICAqIFJlbW90ZSBzZXJ2ZXJzLiBBcnJheSBvZiBhc3NvY2lhdGl2ZSBhcnJheXMgd2l0aCAnaG9zdCcgYW5kICdwb3J0JyBrZXlzCi0gICAqLwotICBwcml2YXRlICRzZXJ2ZXJzXyA9IGFycmF5KCk7Ci0KLSAgLyoqCi0gICAqIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGVhY2ggaG9zdCBpbiBjb25uZWN0Ci0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRudW1SZXRyaWVzXyA9IDE7Ci0KLSAgLyoqCi0gICAqIFJldHJ5IGludGVydmFsIGluIHNlY29uZHMsIGhvdyBsb25nIHRvIG5vdCB0cnkgYSBob3N0IGlmIGl0IGhhcyBiZWVuCi0gICAqIG1hcmtlZCBhcyBkb3duLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkcmV0cnlJbnRlcnZhbF8gPSA2MDsKLQotICAvKioKLSAgICogTWF4IGNvbnNlY3V0aXZlIGZhaWx1cmVzIGJlZm9yZSBtYXJraW5nIGEgaG9zdCBkb3duLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18gPSAxOwotCi0gIC8qKgotICAgKiBUcnkgaG9zdHMgaW4gb3JkZXI/IG9yIFJhbmRvbWl6ZWQ/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkcmFuZG9taXplXyA9IHRydWU7Ci0KLSAgLyoqCi0gICAqIEFsd2F5cyB0cnkgbGFzdCBob3N0LCBldmVuIGlmIG1hcmtlZCBkb3duPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJGFsd2F5c1RyeUxhc3RfID0gdHJ1ZTsKLQotICAvKioKLSAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIGFycmF5ICAkaG9zdHMgICAgICAgIExpc3Qgb2YgcmVtb3RlIGhvc3RuYW1lcwotICAgKiBAcGFyYW0gbWl4ZWQgICRwb3J0cyAgICAgICAgQXJyYXkgb2YgcmVtb3RlIHBvcnRzLCBvciBhIHNpbmdsZSBjb21tb24gcG9ydAotICAgKiBAcGFyYW0gYm9vbCAgICRwZXJzaXN0ICAgICAgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAotICAgKiBAcGFyYW0gbWl4ZWQgICRkZWJ1Z0hhbmRsZXIgRnVuY3Rpb24gZm9yIGVycm9yIGxvZ2dpbmcKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdHM9YXJyYXkoJ2xvY2FsaG9zdCcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBvcnRzPWFycmF5KDkwOTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBlcnNpc3Q9ZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVidWdIYW5kbGVyPW51bGwpIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KG51bGwsIDAsICRwZXJzaXN0LCAkZGVidWdIYW5kbGVyKTsKLQotICAgIGlmICghaXNfYXJyYXkoJHBvcnRzKSkgewotICAgICAgJHBvcnQgPSAkcG9ydHM7Ci0gICAgICAkcG9ydHMgPSBhcnJheSgpOwotICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRrZXkgPT4gJHZhbCkgewotICAgICAgICAkcG9ydHNbJGtleV0gPSAkcG9ydDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3JlYWNoICgkaG9zdHMgYXMgJGtleSA9PiAkaG9zdCkgewotICAgICAgJHRoaXMtPnNlcnZlcnNfIFtdPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3J0JyA9PiAkcG9ydHNbJGtleV0pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKLSAgICoKLSAgICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwcmV2ZW50IHlvdSBmcm9tIGFkZGluZyBhIGR1cGxpY2F0ZSBzZXJ2ZXIgZW50cnkuCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgaG9zdG5hbWUgb3IgSVAKLSAgICogQHBhcmFtIGludCAkcG9ydCBwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gYWRkU2VydmVyKCRob3N0LCAkcG9ydCkKLSAgewotICAgICR0aGlzLT5zZXJ2ZXJzX1tdID0gYXJyYXkoJ2hvc3QnID0+ICRob3N0LCAncG9ydCcgPT4gJHBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgaG93IG1hbnkgdGltZSB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBpbiB0aGUgY29ubmVjdCBmdW5jdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldE51bVJldHJpZXMoJG51bVJldHJpZXMpCi0gIHsKLSAgICAkdGhpcy0+bnVtUmV0cmllc18gPSAkbnVtUmV0cmllczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgcmV0cnlpbmcgYSBob3N0IGlmIGl0IHdhcyBtYXJrZWQgZG93bgotICAgKgotICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0UmV0cnlJbnRlcnZhbCgkcmV0cnlJbnRlcnZhbCkKLSAgewotICAgICR0aGlzLT5yZXRyeUludGVydmFsXyA9ICRyZXRyeUludGVydmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgaG93IG1hbnkgdGltZSB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBiZWZvcmUgbWFya2luZyBpdCBhcyBkb3duLgotICAgKgotICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0TWF4Q29uc2VjdXRpdmVGYWlsdXJlcygkbWF4Q29uc2VjdXRpdmVGYWlsdXJlcykKLSAgewotICAgICR0aGlzLT5tYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9ICRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFR1cm5zIHJhbmRvbWl6YXRpb24gaW4gY29ubmVjdCBvcmRlciBvbiBvciBvZmYuCi0gICAqCi0gICAqIEBwYXJhbSBib29sICRyYW5kb21pemUKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRSYW5kb21pemUoJHJhbmRvbWl6ZSkKLSAgewotICAgICR0aGlzLT5yYW5kb21pemVfID0gJHJhbmRvbWl6ZTsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGFsd2F5cyB0cnkgdGhlIGxhc3Qgc2VydmVyLgotICAgKgotICAgKiBAcGFyYW0gYm9vbCAkYWx3YXlzVHJ5TGFzdAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldEFsd2F5c1RyeUxhc3QoJGFsd2F5c1RyeUxhc3QpCi0gIHsKLSAgICAkdGhpcy0+YWx3YXlzVHJ5TGFzdF8gPSAkYWx3YXlzVHJ5TGFzdDsKLSAgfQotCi0gIC8qKgotICAgKiBDb25uZWN0cyB0aGUgc29ja2V0IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGFsbCB0aGUgc2VydmVycyBpbiB0aGUgcG9vbAotICAgKiBhbmQgdHJ5aW5nIHRvIGZpbmQgb25lIHRoYXQgd29ya3MuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCi0gIHsKLSAgICAvLyBDaGVjayBpZiB3ZSB3YW50IG9yZGVyIHJhbmRvbWl6YXRpb24KLSAgICBpZiAoJHRoaXMtPnJhbmRvbWl6ZV8pIHsKLSAgICAgIHNodWZmbGUoJHRoaXMtPnNlcnZlcnNfKTsKLSAgICB9Ci0KLSAgICAvLyBDb3VudCBzZXJ2ZXJzIHRvIGlkZW50aWZ5IHRoZSAibGFzdCIgb25lCi0gICAgJG51bVNlcnZlcnMgPSBjb3VudCgkdGhpcy0+c2VydmVyc18pOwotCi0gICAgZm9yICgkaSA9IDA7ICRpIDwgJG51bVNlcnZlcnM7ICsrJGkpIHsKLQotICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgJGhvc3QgYW5kICRwb3J0IHZhcmlhYmxlcwotICAgICAgZXh0cmFjdCgkdGhpcy0+c2VydmVyc19bJGldKTsKLQotICAgICAgLy8gQ2hlY2sgQVBDIGNhY2hlIGZvciBhIHJlY29yZCBvZiB0aGlzIHNlcnZlciBiZWluZyBkb3duCi0gICAgICAkZmFpbHRpbWVLZXkgPSAndGhyaWZ0X2ZhaWx0aW1lOicuJGhvc3QuJzonLiRwb3J0Lid+JzsKLQotICAgICAgLy8gQ2FjaGUgbWlzcz8gQXNzdW1lIGl0J3MgT0sKLSAgICAgICRsYXN0RmFpbHRpbWUgPSBhcGNfZmV0Y2goJGZhaWx0aW1lS2V5KTsKLSAgICAgIGlmICgkbGFzdEZhaWx0aW1lID09PSBGQUxTRSkgewotICAgICAgICAkbGFzdEZhaWx0aW1lID0gMDsKLSAgICAgIH0KLQotICAgICAgJHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSBmYWxzZTsKLQotICAgICAgLy8gQ2FjaGUgaGl0Li4ubWFrZSBzdXJlIGVub3VnaCB0aGUgcmV0cnkgaW50ZXJ2YWwgaGFzIGVsYXBzZWQKLSAgICAgIGlmICgkbGFzdEZhaWx0aW1lID4gMCkgewotICAgICAgICAkZWxhcHNlZCA9IHRpbWUoKSAtICRsYXN0RmFpbHRpbWU7Ci0gICAgICAgIGlmICgkZWxhcHNlZCA+ICR0aGlzLT5yZXRyeUludGVydmFsXykgewotICAgICAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNvY2tldFBvb2w6IHJldHJ5SW50ZXJ2YWwgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJy4kdGhpcy0+cmV0cnlJbnRlcnZhbF8uJykgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYXMgcGFzc2VkIGZvciBob3N0ICcuJGhvc3QuJzonLiRwb3J0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gT25seSBjb25uZWN0IGlmIG5vdCBpbiB0aGUgbWlkZGxlIG9mIGEgZmFpbCBpbnRlcnZhbCwgT1IgaWYgdGhpcwotICAgICAgLy8gaXMgdGhlIExBU1Qgc2VydmVyIHdlIGFyZSB0cnlpbmcsIGp1c3QgaGFtbWVyIGF3YXkgb24gaXQKLSAgICAgICRpc0xhc3RTZXJ2ZXIgPSBmYWxzZTsKLSAgICAgIGlmICgkdGhpcy0+YWx3YXlzVHJ5TGFzdF8pIHsKLSAgICAgICAgJGlzTGFzdFNlcnZlciA9ICgkaSA9PSAoJG51bVNlcnZlcnMgLSAxKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoJGxhc3RGYWlsdGltZSA9PT0gMCkgfHwKLSAgICAgICAgICAoJGlzTGFzdFNlcnZlcikgfHwKLSAgICAgICAgICAoJGxhc3RGYWlsdGltZSA+IDAgJiYgJHJldHJ5SW50ZXJ2YWxQYXNzZWQpKSB7Ci0KLSAgICAgICAgLy8gU2V0IHVuZGVybHlpbmcgVFNvY2tldCBwYXJhbXMgdG8gdGhpcyBvbmUKLSAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7Ci0gICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OwotCi0gICAgICAgIC8vIFRyeSB1cCB0byBudW1SZXRyaWVzXyBjb25uZWN0aW9ucyBwZXIgc2VydmVyCi0gICAgICAgIGZvciAoJGF0dGVtcHQgPSAwOyAkYXR0ZW1wdCA8ICR0aGlzLT5udW1SZXRyaWVzXzsgJGF0dGVtcHQrKykgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBVc2UgdGhlIHVuZGVybHlpbmcgVFNvY2tldCBvcGVuIGZ1bmN0aW9uCi0gICAgICAgICAgICBwYXJlbnQ6Om9wZW4oKTsKLQotICAgICAgICAgICAgLy8gT25seSBjbGVhciB0aGUgZmFpbHVyZSBjb3VudHMgaWYgcmVxdWlyZWQgdG8gZG8gc28KLSAgICAgICAgICAgIGlmICgkbGFzdEZhaWx0aW1lID4gMCkgewotICAgICAgICAgICAgICBhcGNfc3RvcmUoJGZhaWx0aW1lS2V5LCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bCBjb25uZWN0aW9uLCByZXR1cm4gbm93Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uICR0eCkgewotICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiBmYWlsZWQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYXJrIGZhaWx1cmUgb2YgdGhpcyBob3N0IGluIHRoZSBjYWNoZQotICAgICAgICAkY29uc2VjZmFpbHNLZXkgPSAndGhyaWZ0X2NvbnNlY2ZhaWxzOicuJGhvc3QuJzonLiRwb3J0Lid+JzsKLQotICAgICAgICAvLyBJZ25vcmUgY2FjaGUgbWlzc2VzCi0gICAgICAgICRjb25zZWNmYWlscyA9IGFwY19mZXRjaCgkY29uc2VjZmFpbHNLZXkpOwotICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID09PSBGQUxTRSkgewotICAgICAgICAgICRjb25zZWNmYWlscyA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbmNyZW1lbnQgYnkgb25lCi0gICAgICAgICRjb25zZWNmYWlscysrOwotCi0gICAgICAgIC8vIExvZyBhbmQgY2FjaGUgdGhpcyBmYWlsdXJlCi0gICAgICAgIGlmICgkY29uc2VjZmFpbHMgPj0gJHRoaXMtPm1heENvbnNlY3V0aXZlRmFpbHVyZXNfKSB7Ci0gICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKLSAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXRQb29sOiBtYXJraW5nICcuJGhvc3QuJzonLiRwb3J0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBhcyBkb3duIGZvciAnLiR0aGlzLT5yZXRyeUludGVydmFsXy4nIHNlY3MgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZnRlciAnLiRjb25zZWNmYWlscy4nIGZhaWxlZCBhdHRlbXB0cy4nKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gU3RvcmUgdGhlIGZhaWx1cmUgdGltZQotICAgICAgICAgIGFwY19zdG9yZSgkZmFpbHRpbWVLZXksIHRpbWUoKSk7Ci0KLSAgICAgICAgICAvLyBDbGVhciB0aGUgY291bnQgb2YgY29uc2VjdXRpdmUgZmFpbHVyZXMKLSAgICAgICAgICBhcGNfc3RvcmUoJGNvbnNlY2ZhaWxzS2V5LCAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBhcGNfc3RvcmUoJGNvbnNlY2ZhaWxzS2V5LCAkY29uc2VjZmFpbHMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gT2ggbm87IHdlIGZhaWxlZCB0aGVtIGFsbC4gVGhlIHN5c3RlbSBpcyB0b3RhbGx5IGlsbCEKLSAgICAkZXJyb3IgPSAnVFNvY2tldFBvb2w6IEFsbCBob3N0cyBpbiBwb29sIGFyZSBkb3duLiAnOwotICAgICRob3N0cyA9IGFycmF5KCk7Ci0gICAgZm9yZWFjaCAoJHRoaXMtPnNlcnZlcnNfIGFzICRzZXJ2ZXIpIHsKLSAgICAgICRob3N0cyBbXT0gJHNlcnZlclsnaG9zdCddLic6Jy4kc2VydmVyWydwb3J0J107Ci0gICAgfQotICAgICRob3N0bGlzdCA9IGltcGxvZGUoJywnLCAkaG9zdHMpOwotICAgICRlcnJvciAuPSAnKCcuJGhvc3RsaXN0LicpJzsKLSAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7Ci0gICAgfQotICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWMzOWZmLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7Ci0KLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogQmFzZSBpbnRlcmZhY2UgZm9yIGEgdHJhbnNwb3J0IGFnZW50LgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotYWJzdHJhY3QgY2xhc3MgVFRyYW5zcG9ydAotewotICAvKioKLSAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgotICAgKgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCk7Ci0KLSAgLyoqCi0gICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIG9wZW4oKTsKLQotICAvKioKLSAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpOwotCi0gIC8qKgotICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KLSAgICoKLSAgICogQHBhcmFtIGludCAgICAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKTsKLQotICAvKioKLSAgICogR3VhcmFudGVlcyB0aGF0IHRoZSBmdWxsIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQuCi0gICAqCi0gICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhLCBvZiBleGFjdCBsZW5ndGgKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCi0gIHsKLSAgICAvLyByZXR1cm4gJHRoaXMtPnJlYWQoJGxlbik7Ci0KLSAgICAkZGF0YSA9ICcnOwotICAgICRnb3QgPSAwOwotICAgIHdoaWxlICgoJGdvdCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkZGF0YSkpIDwgJGxlbikgewotICAgICAgJGRhdGEgLj0gJHRoaXMtPnJlYWQoJGxlbiAtICRnb3QpOwotICAgIH0KLQotICAgIHJldHVybiAkZGF0YTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIGdpdmVuIGRhdGEgb3V0LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgIFRoZSBkYXRhIHRvIHdyaXRlCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3cml0aW5nIGZhaWxzCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1Zik7Ci0KLSAgLyoqCi0gICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSBvdXQgb2YgYSBidWZmZXIKLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGEgd3JpdGluZyBlcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHt9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UQ29uc3RhbnQucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1R5cGUvVENvbnN0YW50LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4ZWNlYi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UQ29uc3RhbnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGNvbnN0YW50IE1hbmFnZW1lbnQKLSAqLwotYWJzdHJhY3QgY2xhc3MgVENvbnN0YW50Ci17Ci0gICAgLyoqCi0gICAgICogRG9uJ3QgaW5zdGFuY2lhdGUgdGhpcyBjbGFzcwotICAgICAqLwotICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBjb25zdGFudCB2YWx1ZQotICAgICAqIEBwYXJhbSAgc3RyaW5nICRjb25zdGFudAotICAgICAqIEByZXR1cm4gbWl4ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldCgkY29uc3RhbnQpCi0gICAgewotICAgICAgICBpZiAoaXNfbnVsbChzdGF0aWM6OiQkY29uc3RhbnQpKSB7Ci0gICAgICAgICAgICBzdGF0aWM6OiQkY29uc3RhbnQgPSBjYWxsX3VzZXJfZnVuYygKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50Zignc3RhdGljOjppbml0XyVzJywgJGNvbnN0YW50KQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdGljOjokJGNvbnN0YW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RNZXNzYWdlVHlwZS5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UTWVzc2FnZVR5cGUucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmYyMjRmLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RNZXNzYWdlVHlwZS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFR5cGU7Ci0KLS8qKgotICogTWVzc2FnZSB0eXBlcyBmb3IgUlBDCi0gKi8KLWNsYXNzIFRNZXNzYWdlVHlwZQotewotICBjb25zdCBDQUxMICA9IDE7Ci0gIGNvbnN0IFJFUExZID0gMjsKLSAgY29uc3QgRVhDRVBUSU9OID0gMzsKLSAgY29uc3QgT05FV0FZID0gNDsKLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RUeXBlLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RUeXBlLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyMTljMi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UVHlwZS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFR5cGU7Ci0KLS8qKgotICogRGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IHZpYSBUaHJpZnQKLSAqLwotY2xhc3MgVFR5cGUKLXsKLSAgY29uc3QgU1RPUCAgID0gMDsKLSAgY29uc3QgVk9JRCAgID0gMTsKLSAgY29uc3QgQk9PTCAgID0gMjsKLSAgY29uc3QgQllURSAgID0gMzsKLSAgY29uc3QgSTA4ICAgID0gMzsKLSAgY29uc3QgRE9VQkxFID0gNDsKLSAgY29uc3QgSTE2ICAgID0gNjsKLSAgY29uc3QgSTMyICAgID0gODsKLSAgY29uc3QgSTY0ICAgID0gMTA7Ci0gIGNvbnN0IFNUUklORyA9IDExOwotICBjb25zdCBVVEY3ICAgPSAxMTsKLSAgY29uc3QgU1RSVUNUID0gMTI7Ci0gIGNvbnN0IE1BUCAgICA9IDEzOwotICBjb25zdCBTRVQgICAgPSAxNDsKLSAgY29uc3QgTFNUICAgID0gMTU7ICAgIC8vIE4uQi4gY2Fubm90IHVzZSBMSVNUIGtleXdvcmQgaW4gUEhQIQotICBjb25zdCBVVEY4ICAgPSAxNjsKLSAgY29uc3QgVVRGMTYgID0gMTc7Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1M2M1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDIwNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBCdWZmZXJlZCB0cmFuc3BvcnQuIFN0b3JlcyBkYXRhIHRvIGFuIGludGVybmFsIGJ1ZmZlciB0aGF0IGl0IGRvZXNuJ3QKKyAqIGFjdHVhbGx5IHdyaXRlIG91dCB1bnRpbCBmbHVzaCBpcyBjYWxsZWQuIEZvciByZWFkaW5nLCB3ZSBkbyBhIGdyZWVkeQorICogcmVhZCBhbmQgdGhlbiBzZXJ2ZSBkYXRhIG91dCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0cmFuc3BvcnRfOworCisgICAgLyoqCisgICAgICogVGhlIHJlY2VpdmUgYnVmZmVyIHNpemUKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRyQnVmU2l6ZV8gPSA1MTI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgd3JpdGUgYnVmZmVyIHNpemUKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICR3QnVmU2l6ZV8gPSA1MTI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgd3JpdGUgYnVmZmVyLgorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHdCdWZfID0gJyc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVhZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkckJ1Zl8gPSAnJzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBDcmVhdGVzIGEgYnVmZmVyZWQgdHJhbnNwb3J0IGFyb3VuZCBhbiB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnNwb3J0LCAkckJ1ZlNpemUgPSA1MTIsICR3QnVmU2l6ZSA9IDUxMikKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKKyAgICAgICAgJHRoaXMtPnJCdWZTaXplXyA9ICRyQnVmU2l6ZTsKKyAgICAgICAgJHRoaXMtPndCdWZTaXplXyA9ICR3QnVmU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+aXNPcGVuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXRkb2MKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkZGF0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVhc29uIHRoYXQgd2UgY3VzdG9taXplIHJlYWRBbGwgaGVyZSBpcyB0aGF0IHRoZSBtYWpvcml0eSBvZiBQSFAKKyAgICAgKiBzdHJlYW1zIGFyZSBhbHJlYWR5IGludGVybmFsbHkgYnVmZmVyZWQgYnkgUEhQLiBUaGUgc29ja2V0IHN0cmVhbSwgZm9yCisgICAgICogZXhhbXBsZSwgYnVmZmVycyBpbnRlcm5hbGx5IGFuZCBibG9ja3MgaWYgeW91IGNhbGwgcmVhZCB3aXRoICRsZW4gZ3JlYXRlcgorICAgICAqIHRoYW4gdGhlIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZSwgdW5saWtlIHJlY3YoKSBpbiBDLgorICAgICAqCisgICAgICogVGhlcmVmb3JlLCB1c2UgdGhlIHJlYWRBbGwgbWV0aG9kIG9mIHRoZSB3cmFwcGVkIHRyYW5zcG9ydCBpbnNpZGUKKyAgICAgKiB0aGUgYnVmZmVyZWQgcmVhZEFsbC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCisgICAgeworICAgICAgICAkaGF2ZSA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pOworICAgICAgICBpZiAoJGhhdmUgPT0gMCkgeworICAgICAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuKTsKKyAgICAgICAgfSBlbHNlaWYgKCRoYXZlIDwgJGxlbikgeworICAgICAgICAgICAgJGRhdGEgPSAkdGhpcy0+ckJ1Zl87CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAnJzsKKyAgICAgICAgICAgICRkYXRhIC49ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRsZW4gLSAkaGF2ZSk7CisgICAgICAgIH0gZWxzZWlmICgkaGF2ZSA9PSAkbGVuKSB7CisgICAgICAgICAgICAkZGF0YSA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICcnOworICAgICAgICB9IGVsc2VpZiAoJGhhdmUgPiAkbGVuKSB7CisgICAgICAgICAgICAkZGF0YSA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXRkb2MKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbgorICAgICAqIEByZXR1cm4gc3RyaW5nCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgeworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWQoJHRoaXMtPnJCdWZTaXplXyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPD0gJGxlbikgeworICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICcnOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfQorCisgICAgICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKKyAgICAgICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7CisKKyAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXRkb2MKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndCdWZfIC49ICRidWY7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA+PSAkdGhpcy0+d0J1ZlNpemVfKSB7CisgICAgICAgICAgICAkb3V0ID0gJHRoaXMtPndCdWZfOworCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2xlYXIgdGhlIGludGVybmFsIHdCdWZfIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlCisgICAgICAgICAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAgICAgICAgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgJHRoaXMtPndCdWZfID0gJyc7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdGRvYworICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA+IDApIHsKKyAgICAgICAgICAgICRvdXQgPSAkdGhpcy0+d0J1Zl87CisKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgICAgICAgICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCisgICAgICAgICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJiNDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocApAQCAtMCwwICsxLDI3NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBIVFRQIGNsaWVudCBmb3IgVGhyaWZ0CisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUQ3VybENsaWVudCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICBwcml2YXRlIHN0YXRpYyAkY3VybEhhbmRsZTsKKworICAgIC8qKgorICAgICAqIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRwb3J0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBVUkkgdG8gcmVxdWVzdAorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHVyaV87CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2NoZW1lIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QsIGkuZS4gaHR0cCwgaHR0cHMKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRzY2hlbWVfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciB0aGUgSFRUUCByZXF1ZXN0IGRhdGEKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRyZXF1ZXN0XzsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVzcG9uc2UgZGF0YS4KKyAgICAgKgorICAgICAqIEB2YXIgYmluYXJ5IHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkcmVzcG9uc2VfOworCisgICAgLyoqCisgICAgICogUmVhZCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAdmFyIGZsb2F0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0aW1lb3V0XzsKKworICAgIC8qKgorICAgICAqIGh0dHAgaGVhZGVycworICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkaGVhZGVyc187CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdAorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQKKyAgICAgKiBAcGFyYW0gc3RyaW5nICR1cmkKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0ID0gODAsICR1cmkgPSAnJywgJHNjaGVtZSA9ICdodHRwJykKKyAgICB7CisgICAgICAgIGlmICgoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR1cmkpID4gMCkgJiYgKCR1cml7MH0gIT0gJy8nKSkgeworICAgICAgICAgICAgJHVyaSA9ICcvJyAuICR1cmk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPnNjaGVtZV8gPSAkc2NoZW1lOworICAgICAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKKyAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisgICAgICAgICR0aGlzLT51cmlfID0gJHVyaTsKKyAgICAgICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7CisgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBudWxsOworICAgICAgICAkdGhpcy0+dGltZW91dF8gPSBudWxsOworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCByZWFkIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0U2VjcygkdGltZW91dCkKKyAgICB7CisgICAgICAgICR0aGlzLT50aW1lb3V0XyA9ICR0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZXF1ZXN0XyA9ICcnOworICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCB0byByZWFkCisgICAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGFueSBtb3JlIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgaWYgKCRsZW4gPj0gc3RybGVuKCR0aGlzLT5yZXNwb25zZV8pKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlc3BvbnNlXzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRyZXQgPSBzdWJzdHIoJHRoaXMtPnJlc3BvbnNlXywgMCwgJGxlbik7CisgICAgICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gc3Vic3RyKCR0aGlzLT5yZXNwb25zZV8sICRsZW4pOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEd1YXJhbnRlZXMgdGhhdCB0aGUgZnVsbCBhbW91bnQgb2YgZGF0YSBpcyByZWFkLiBTaW5jZSBUQ3VybENsaWVudCBnZXRzIGVudGlyZSBwYXlsb2FkIGF0CisgICAgICogb25jZSwgcGFyZW50IHJlYWRBbGwgY2Fubm90IGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSwgb2YgZXhhY3QgbGVuZ3RoCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+cmVhZCgkbGVuKTsKKworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRkYXRhKSAhPT0gJGxlbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RDdXJsQ2xpZW50IGNvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzJyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHNvbWUgZGF0YSBpbnRvIHRoZSBwZW5kaW5nIGJ1ZmZlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICR0aGlzLT5yZXF1ZXN0XyAuPSAkYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGFuZCBzZW5kcyB0aGUgYWN0dWFsIHJlcXVlc3Qgb3ZlciB0aGUgSFRUUCBjb25uZWN0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICBpZiAoIXNlbGY6OiRjdXJsSGFuZGxlKSB7CisgICAgICAgICAgICByZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihhcnJheSgnVGhyaWZ0XFxUcmFuc3BvcnRcXFRDdXJsQ2xpZW50JywgJ2Nsb3NlQ3VybEhhbmRsZScpKTsKKyAgICAgICAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gY3VybF9pbml0KCk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9CSU5BUllUUkFOU0ZFUiwgdHJ1ZSk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9VU0VSQUdFTlQsICdQSFAvVEN1cmxDbGllbnQnKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsICdQT1NUJyk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgdHJ1ZSk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9NQVhSRURJUlMsIDEpOworICAgICAgICB9CisgICAgICAgIC8vIEdvZCwgUEhQIHJlYWxseSBoYXMgc29tZSBlc290ZXJpYyB3YXlzIG9mIGRvaW5nIHNpbXBsZSB0aGluZ3MuCisgICAgICAgICRob3N0ID0gJHRoaXMtPmhvc3RfIC4gKCR0aGlzLT5wb3J0XyAhPSA4MCA/ICc6JyAuICR0aGlzLT5wb3J0XyA6ICcnKTsKKyAgICAgICAgJGZ1bGxVcmwgPSAkdGhpcy0+c2NoZW1lXyAuICI6Ly8iIC4gJGhvc3QgLiAkdGhpcy0+dXJpXzsKKworICAgICAgICAkaGVhZGVycyA9IGFycmF5KCk7CisgICAgICAgICRkZWZhdWx0SGVhZGVycyA9IGFycmF5KCdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcsCisgICAgICAgICAgICAnQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnLAorICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoJyA9PiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJlcXVlc3RfKSk7CisgICAgICAgIGZvcmVhY2ggKGFycmF5X21lcmdlKCRkZWZhdWx0SGVhZGVycywgJHRoaXMtPmhlYWRlcnNfKSBhcyAka2V5ID0+ICR2YWx1ZSkgeworICAgICAgICAgICAgJGhlYWRlcnNbXSA9ICIka2V5OiAkdmFsdWUiOworICAgICAgICB9CisKKyAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfSFRUUEhFQURFUiwgJGhlYWRlcnMpOworCisgICAgICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9USU1FT1VULCAkdGhpcy0+dGltZW91dF8pOworICAgICAgICB9CisgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1BPU1RGSUVMRFMsICR0aGlzLT5yZXF1ZXN0Xyk7CisgICAgICAgICR0aGlzLT5yZXF1ZXN0XyA9ICcnOworCisgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1VSTCwgJGZ1bGxVcmwpOworICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gY3VybF9leGVjKHNlbGY6OiRjdXJsSGFuZGxlKTsKKyAgICAgICAgJHJlc3BvbnNlRXJyb3IgPSBjdXJsX2Vycm9yKHNlbGY6OiRjdXJsSGFuZGxlKTsKKworICAgICAgICAkY29kZSA9IGN1cmxfZ2V0aW5mbyhzZWxmOjokY3VybEhhbmRsZSwgQ1VSTElORk9fSFRUUF9DT0RFKTsKKworICAgICAgICAvLyBIYW5kbGUgbm9uIDIwMCBzdGF0dXMgY29kZSAvIGNvbm5lY3QgZmFpbHVyZQorICAgICAgICBpZiAoJHRoaXMtPnJlc3BvbnNlXyA9PT0gZmFsc2UgfHwgJGNvZGUgIT09IDIwMCkgeworICAgICAgICAgICAgY3VybF9jbG9zZShzZWxmOjokY3VybEhhbmRsZSk7CisgICAgICAgICAgICBzZWxmOjokY3VybEhhbmRsZSA9IG51bGw7CisgICAgICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gbnVsbDsKKyAgICAgICAgICAgICRlcnJvciA9ICdUQ3VybENsaWVudDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuICRmdWxsVXJsOworICAgICAgICAgICAgaWYgKCRyZXNwb25zZUVycm9yKSB7CisgICAgICAgICAgICAgICAgJGVycm9yIC49ICcsICcgLiAkcmVzcG9uc2VFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkY29kZSkgeworICAgICAgICAgICAgICAgICRlcnJvciAuPSAnLCBIVFRQIHN0YXR1cyBjb2RlOiAnIC4gJGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjbG9zZUN1cmxIYW5kbGUoKQorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzZWxmOjokY3VybEhhbmRsZSkgeworICAgICAgICAgICAgICAgIGN1cmxfY2xvc2Uoc2VsZjo6JGN1cmxIYW5kbGUpOworICAgICAgICAgICAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkeCkgeworICAgICAgICAgICAgZXJyb3JfbG9nKCdUaGVyZSB3YXMgYW4gZXJyb3IgY2xvc2luZyB0aGUgY3VybCBoYW5kbGU6ICcgLiAkeC0+Z2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRIZWFkZXJzKCRoZWFkZXJzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhlYWRlcnNfID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmhlYWRlcnNfLCAkaGVhZGVycyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDE4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSwxOTIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBGcmFtZWQgdHJhbnNwb3J0LiBXcml0ZXMgYW5kIHJlYWRzIGRhdGEgaW4gY2h1bmtzIHRoYXQgYXJlIHN0YW1wZWQgd2l0aAorICogdGhlaXIgbGVuZ3RoLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAdmFyIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwcml2YXRlICR0cmFuc3BvcnRfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciByZWFkIGRhdGEuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByaXZhdGUgJHJCdWZfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciBxdWV1ZWQgb3V0cHV0IGRhdGEKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSAkd0J1Zl87CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGZyYW1lIHJlYWRzCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRyZWFkXzsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZnJhbWUgd3JpdGVzCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICR3cml0ZV87CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQgVW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zcG9ydCA9IG51bGwsICRyZWFkID0gdHJ1ZSwgJHdyaXRlID0gdHJ1ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKKyAgICAgICAgJHRoaXMtPnJlYWRfID0gJHJlYWQ7CisgICAgICAgICR0aGlzLT53cml0ZV8gPSAkd3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPmlzT3BlbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGZyb20gdGhlIGJ1ZmZlci4gV2hlbiBtb3JlIGRhdGEgaXMgcmVxdWlyZWQgcmVhZHMgYW5vdGhlciBlbnRpcmUKKyAgICAgKiBjaHVuayBhbmQgc2VydmVzIGZ1dHVyZSByZWFkcyBvdXQgb2YgdGhhdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgIGlmICghJHRoaXMtPnJlYWRfKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWQoJGxlbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkRnJhbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEp1c3QgcmV0dXJuIGZ1bGwgYnVmZgorICAgICAgICBpZiAoJGxlbiA+PSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSkgeworICAgICAgICAgICAgJG91dCA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9IG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiAkb3V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cgorICAgICAgICAkb3V0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7CisgICAgICAgICR0aGlzLT5yQnVmXyA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOworCisgICAgICAgIHJldHVybiAkb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dCBwcmV2aW91c2x5IHJlYWQgZGF0YSBiYWNrIGludG8gdGhlIGJ1ZmZlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkZGF0YSBkYXRhIHRvIHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkZGF0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIGNodW5rIG9mIGRhdGEgaW50byB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkRnJhbWUoKQorICAgIHsKKyAgICAgICAgJGJ1ZiA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKDQpOworICAgICAgICAkdmFsID0gdW5wYWNrKCdOJywgJGJ1Zik7CisgICAgICAgICRzeiA9ICR2YWxbMV07CisKKyAgICAgICAgJHRoaXMtPnJCdWZfID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoJHN6KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgc29tZSBkYXRhIHRvIHRoZSBwZW5kaW5nIG91dHB1dCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gTGltaXQgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZiwgJGxlbiA9IG51bGwpCisgICAgeworICAgICAgICBpZiAoISR0aGlzLT53cml0ZV8pIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJGJ1ZiwgJGxlbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJGxlbiAhPT0gbnVsbCAmJiAkbGVuIDwgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpKSB7CisgICAgICAgICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsIDAsICRsZW4pOworICAgICAgICB9CisgICAgICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgc3RyZWFtIGluIHRoZSBmb3JtYXQgb2YgYSA0LWJ5dGUgbGVuZ3RoCisgICAgICogZm9sbG93ZWQgYnkgdGhlIGFjdHVhbCBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICBpZiAoISR0aGlzLT53cml0ZV8gfHwgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT53QnVmXykgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgJG91dCA9IHBhY2soJ04nLCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSk7CisgICAgICAgICRvdXQgLj0gJHRoaXMtPndCdWZfOworCisgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKKyAgICAgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgorICAgICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTU4ODA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocApAQCAtMCwwICsxLDI1OCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBIVFRQIGNsaWVudCBmb3IgVGhyaWZ0CisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUSHR0cENsaWVudCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgaG9zdCB0byBjb25uZWN0IHRvCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkaG9zdF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9ydCB0byBjb25uZWN0IG9uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJJIHRvIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICR1cmlfOworCisgICAgLyoqCisgICAgICogVGhlIHNjaGVtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LCBpLmUuIGh0dHAsIGh0dHBzCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkc2NoZW1lXzsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVxdWVzdCBkYXRhCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkYnVmXzsKKworICAgIC8qKgorICAgICAqIElucHV0IHNvY2tldCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAdmFyIHJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkICRoYW5kbGVfOworCisgICAgLyoqCisgICAgICogUmVhZCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAdmFyIGZsb2F0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0aW1lb3V0XzsKKworICAgIC8qKgorICAgICAqIGh0dHAgaGVhZGVycworICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkaGVhZGVyc187CisKKyAgICAvKioKKyAgICAgKiBDb250ZXh0IGFkZGl0aW9uYWwgb3B0aW9ucworICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkY29udGV4dF87CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdAorICAgICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKKyAgICAgKiBAcGFyYW0gc3RyaW5nICR1cmkKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRzY2hlbWUKKyAgICAgKiBAcGFyYW0gYXJyYXkgICRjb250ZXh0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0LCAkcG9ydCA9IDgwLCAkdXJpID0gJycsICRzY2hlbWUgPSAnaHR0cCcsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKKyAgICB7CisgICAgICAgIGlmICgoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR1cmkpID4gMCkgJiYgKCR1cml7MH0gIT0gJy8nKSkgeworICAgICAgICAgICAgJHVyaSA9ICcvJyAuICR1cmk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPnNjaGVtZV8gPSAkc2NoZW1lOworICAgICAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKKyAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisgICAgICAgICR0aGlzLT51cmlfID0gJHVyaTsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gPSAnJzsKKyAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOworICAgICAgICAkdGhpcy0+dGltZW91dF8gPSBudWxsOworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheSgpOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSAkY29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgcmVhZCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxvYXQgJHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VGltZW91dFNlY3MoJHRpbWVvdXQpCisgICAgeworICAgICAgICAkdGhpcy0+dGltZW91dF8gPSAkdGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZworICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmhhbmRsZV8pIHsKKyAgICAgICAgICAgIEBmY2xvc2UoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gSG93IG11Y2ggdG8gcmVhZAorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKKyAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSB8fCAkZGF0YSA9PT0gJycpIHsKKyAgICAgICAgICAgICRtZCA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCR0aGlzLT5oYW5kbGVfKTsKKyAgICAgICAgICAgIGlmICgkbWRbJ3RpbWVkX291dCddKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdUSHR0cENsaWVudDogdGltZWQgb3V0IHJlYWRpbmcgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XyAuICR0aGlzLT51cmlfLAorICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RIdHRwQ2xpZW50OiBDb3VsZCBub3QgcmVhZCAnIC4gJGxlbiAuICcgYnl0ZXMgZnJvbSAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJHRoaXMtPnVyaV8sCisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBzb21lIGRhdGEgaW50byB0aGUgcGVuZGluZyBidWZmZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YSB0byB3cml0ZQorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3cml0aW5nIGZhaWxzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgICAgICAkdGhpcy0+YnVmXyAuPSAkYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGFuZCBzZW5kcyB0aGUgYWN0dWFsIHJlcXVlc3Qgb3ZlciB0aGUgSFRUUCBjb25uZWN0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICAvLyBHb2QsIFBIUCByZWFsbHkgaGFzIHNvbWUgZXNvdGVyaWMgd2F5cyBvZiBkb2luZyBzaW1wbGUgdGhpbmdzLgorICAgICAgICAkaG9zdCA9ICR0aGlzLT5ob3N0XyAuICgkdGhpcy0+cG9ydF8gIT0gODAgPyAnOicgLiAkdGhpcy0+cG9ydF8gOiAnJyk7CisKKyAgICAgICAgJGhlYWRlcnMgPSBhcnJheSgpOworICAgICAgICAkZGVmYXVsdEhlYWRlcnMgPSBhcnJheSgnSG9zdCcgPT4gJGhvc3QsCisgICAgICAgICAgICAnQWNjZXB0JyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnLAorICAgICAgICAgICAgJ1VzZXItQWdlbnQnID0+ICdQSFAvVEh0dHBDbGllbnQnLAorICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKKyAgICAgICAgICAgICdDb250ZW50LUxlbmd0aCcgPT4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5idWZfKSk7CisgICAgICAgIGZvcmVhY2ggKGFycmF5X21lcmdlKCRkZWZhdWx0SGVhZGVycywgJHRoaXMtPmhlYWRlcnNfKSBhcyAka2V5ID0+ICR2YWx1ZSkgeworICAgICAgICAgICAgJGhlYWRlcnNbXSA9ICIka2V5OiAkdmFsdWUiOworICAgICAgICB9CisKKyAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+Y29udGV4dF87CisKKyAgICAgICAgJGJhc2VIdHRwT3B0aW9ucyA9IGlzc2V0KCRvcHRpb25zWyJodHRwIl0pID8gJG9wdGlvbnNbImh0dHAiXSA6IGFycmF5KCk7CisKKyAgICAgICAgJGh0dHBPcHRpb25zID0gJGJhc2VIdHRwT3B0aW9ucyArIGFycmF5KCdtZXRob2QnID0+ICdQT1NUJywKKyAgICAgICAgICAgICdoZWFkZXInID0+IGltcGxvZGUoIlxyXG4iLCAkaGVhZGVycyksCisgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMSwKKyAgICAgICAgICAgICdjb250ZW50JyA9PiAkdGhpcy0+YnVmXyk7CisgICAgICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7CisgICAgICAgICAgICAkaHR0cE9wdGlvbnNbJ3RpbWVvdXQnXSA9ICR0aGlzLT50aW1lb3V0XzsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+YnVmXyA9ICcnOworCisgICAgICAgICRvcHRpb25zWyJodHRwIl0gPSAkaHR0cE9wdGlvbnM7CisgICAgICAgICRjb250ZXh0aWQgPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoJG9wdGlvbnMpOworICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IEBmb3BlbigKKyAgICAgICAgICAgICR0aGlzLT5zY2hlbWVfIC4gJzovLycgLiAkaG9zdCAuICR0aGlzLT51cmlfLAorICAgICAgICAgICAgJ3InLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAkY29udGV4dGlkCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQ29ubmVjdCBmYWlsZWQ/CisgICAgICAgIGlmICgkdGhpcy0+aGFuZGxlXyA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKKyAgICAgICAgICAgICRlcnJvciA9ICdUSHR0cENsaWVudDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuICRob3N0IC4gJHRoaXMtPnVyaV87CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRIZWFkZXJzKCRoZWFkZXJzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhlYWRlcnNfID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmhlYWRlcnNfLCAkaGVhZGVycyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTAzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAKQEAgLTAsMCArMSwxMDYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogQSBtZW1vcnkgYnVmZmVyIGlzIGEgdHJhbnBzb3J0IHRoYXQgc2ltcGx5IHJlYWRzIGZyb20gYW5kIHdyaXRlcyB0byBhbgorICogaW4tbWVtb3J5IHN0cmluZyBidWZmZXIuIEFueXRpbWUgeW91IGNhbGwgd3JpdGUgb24gaXQsIHRoZSBkYXRhIGlzIHNpbXBseQorICogcGxhY2VkIGludG8gYSBidWZmZXIsIGFuZCBhbnl0aW1lIHlvdSBjYWxsIHJlYWQsIGRhdGEgaXMgcmVhZCBmcm9tIHRoYXQKKyAqIGJ1ZmZlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRNZW1vcnlCdWZmZXIgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIE9wdGlvbmFsbHkgcGFzcyBhbiBpbml0aWFsIHZhbHVlCisgICAgICogZm9yIHRoZSBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRidWYgPSAnJykKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfID0gJGJ1ZjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgJGJ1Zl8gPSAnJzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfIC49ICRidWY7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgICRidWZMZW5ndGggPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pOworCisgICAgICAgIGlmICgkYnVmTGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAnVE1lbW9yeUJ1ZmZlcjogQ291bGQgbm90IHJlYWQgJyAuCisgICAgICAgICAgICAgICAgJGxlbiAuICcgYnl0ZXMgZnJvbSBidWZmZXIuJywKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRidWZMZW5ndGggPD0gJGxlbikgeworICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5idWZfOworICAgICAgICAgICAgJHRoaXMtPmJ1Zl8gPSAnJzsKKworICAgICAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgICAgIH0KKworICAgICAgICAkcmV0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5idWZfLCAwLCAkbGVuKTsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPmJ1Zl8sICRsZW4pOworCisgICAgICAgIHJldHVybiAkcmV0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRCdWZmZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5idWZfOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhdmFpbGFibGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpCisgICAgeworICAgICAgICAkdGhpcy0+YnVmXyA9ICRkYXRhIC4gJHRoaXMtPmJ1Zl87CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwODZiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSw1NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOworCisvKioKKyAqIFRyYW5zcG9ydCB0aGF0IG9ubHkgYWNjZXB0cyB3cml0ZXMgYW5kIGlnbm9yZXMgdGhlbS4KKyAqIFRoaXMgaXMgdXNlZnVsIGZvciBtZWFzdXJpbmcgdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiBzdHJ1Y3R1cmVzLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVE51bGxUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2FuJ3QgcmVhZCBmcm9tIFROdWxsVHJhbnNwb3J0LiIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4MjNmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocApAQCAtMCwwICsxLDEyNCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBQaHAgc3RyZWFtIHRyYW5zcG9ydC4gUmVhZHMgdG8gYW5kIHdyaXRlcyBmcm9tIHRoZSBwaHAgc3RhbmRhcmQgc3RyZWFtcworICogcGhwOi8vaW5wdXQgYW5kIHBocDovL291dHB1dAorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFBocFN0cmVhbSBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICBjb25zdCBNT0RFX1IgPSAxOworICAgIGNvbnN0IE1PREVfVyA9IDI7CisKKyAgICBwcml2YXRlICRpblN0cmVhbV8gPSBudWxsOworCisgICAgcHJpdmF0ZSAkb3V0U3RyZWFtXyA9IG51bGw7CisKKyAgICBwcml2YXRlICRyZWFkXyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSAkd3JpdGVfID0gZmFsc2U7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1vZGUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZF8gPSAkbW9kZSAmIHNlbGY6Ok1PREVfUjsKKyAgICAgICAgJHRoaXMtPndyaXRlXyA9ICRtb2RlICYgc2VsZjo6TU9ERV9XOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+cmVhZF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5pblN0cmVhbV8gPSBAZm9wZW4oc2VsZjo6aW5TdHJlYW1OYW1lKCksICdyJyk7CisgICAgICAgICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5pblN0cmVhbV8pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCBvcGVuIHBocDovL2lucHV0Jyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKKyAgICAgICAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gQGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpOworICAgICAgICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vb3V0cHV0Jyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5yZWFkXykgeworICAgICAgICAgICAgQGZjbG9zZSgkdGhpcy0+aW5TdHJlYW1fKTsKKyAgICAgICAgICAgICR0aGlzLT5pblN0cmVhbV8gPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICgkdGhpcy0+d3JpdGVfKSB7CisgICAgICAgICAgICBAZmNsb3NlKCR0aGlzLT5vdXRTdHJlYW1fKTsKKyAgICAgICAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAoISR0aGlzLT5yZWFkXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+aW5TdHJlYW1fKSkgJiYKKyAgICAgICAgICAgICghJHRoaXMtPndyaXRlXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICAkZGF0YSA9IEBmcmVhZCgkdGhpcy0+aW5TdHJlYW1fLCAkbGVuKTsKKyAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSB8fCAkZGF0YSA9PT0gJycpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3QgcmVhZCAnIC4gJGxlbiAuICcgYnl0ZXMnKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgIHdoaWxlIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgPiAwKSB7CisgICAgICAgICAgICAkZ290ID0gQGZ3cml0ZSgkdGhpcy0+b3V0U3RyZWFtXywgJGJ1Zik7CisgICAgICAgICAgICBpZiAoJGdvdCA9PT0gMCB8fCAkZ290ID09PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVFBocFN0cmVhbTogQ291bGQgbm90IHdyaXRlICcgLiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgLiAnIGJ5dGVzJworICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsICRnb3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIEBmZmx1c2goJHRoaXMtPm91dFN0cmVhbV8pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluU3RyZWFtTmFtZSgpCisgICAgeworICAgICAgICBpZiAocGhwX3NhcGlfbmFtZSgpID09ICdjbGknKSB7CisgICAgICAgICAgICByZXR1cm4gJ3BocDovL3N0ZGluJzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAncGhwOi8vaW5wdXQnOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU1NMU29ja2V0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU1NMU29ja2V0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGEwYWRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTU0xTb2NrZXQucGhwCkBAIC0wLDAgKzEsMTE3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBTb2NrZXRzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRTU0xTb2NrZXQgZXh0ZW5kcyBUU29ja2V0Cit7CisgICAgLyoqCisgICAgICogUmVtb3RlIHBvcnQKKyAgICAgKgorICAgICAqIEB2YXIgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGNvbnRleHRfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBSZW1vdGUgaG9zdG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IFJlbW90ZSBwb3J0CisgICAgICogQHBhcmFtIHJlc291cmNlICRjb250ZXh0IFN0cmVhbSBjb250ZXh0CisgICAgICogQHBhcmFtIGJvb2wgJHBlcnNpc3QgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAorICAgICAqIEBwYXJhbSBzdHJpbmcgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGZvciBlcnJvciBsb2dnaW5nCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkaG9zdCA9ICdsb2NhbGhvc3QnLAorICAgICAgICAkcG9ydCA9IDkwOTAsCisgICAgICAgICRjb250ZXh0ID0gbnVsbCwKKyAgICAgICAgJGRlYnVnSGFuZGxlciA9IG51bGwKKyAgICApIHsKKyAgICAgICAgJHRoaXMtPmhvc3RfID0gJHRoaXMtPmdldFNTTEhvc3QoJGhvc3QpOworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGNvbnRleHQ7CisgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfID0gJGRlYnVnSGFuZGxlciA/ICRkZWJ1Z0hhbmRsZXIgOiAnZXJyb3JfbG9nJzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgaG9zdCBuYW1lIHdpdGggU1NMIHRyYW5zcG9ydCBwcm90b2NvbAorICAgICAqIGlmIG5vIHRyYW5zcG9ydCBwcm90b2NvbCBhbHJlYWR5IHNwZWNpZmllZCBpbgorICAgICAqIHRoZSBob3N0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IEhvc3QgdG8gbGlzdGVuIG9uCisgICAgICogQHJldHVybiBzdHJpbmcgJGhvc3QgICBIb3N0IG5hbWUgd2l0aCB0cmFuc3BvcnQgcHJvdG9jb2wKKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFNTTEhvc3QoJGhvc3QpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0X3Byb3RvY29sX2xvYyA9IHN0cnBvcygkaG9zdCwgIjovLyIpOworICAgICAgICBpZiAoJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkaG9zdCA9ICdzc2w6Ly8nIC4gJGhvc3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICRob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5pc09wZW4oKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcsIFRUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPmhvc3RfKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIG51bGwgaG9zdCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdGhpcy0+cG9ydF8gPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQHN0cmVhbV9zb2NrZXRfY2xpZW50KAorICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgJGVycm5vLAorICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKSwKKyAgICAgICAgICAgIFNUUkVBTV9DTElFTlRfQ09OTkVDVCwKKyAgICAgICAgICAgICR0aGlzLT5jb250ZXh0XworICAgICAgICApOworCisgICAgICAgIC8vIENvbm5lY3QgZmFpbGVkPworICAgICAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkZXJyb3IgPSAnVFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJyAoJyAuICRlcnJzdHIgLiAnIFsnIC4gJGVycm5vIC4gJ10pJzsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7CisgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigkZXJyb3IpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDdlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAKQEAgLTAsMCArMSwzNjYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNvY2tldCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgdG8gUEhQIHNvY2tldAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkaGFuZGxlXyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgaG9zdG5hbWUKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XyA9ICdsb2NhbGhvc3QnOworCisgICAgLyoqCisgICAgICogUmVtb3RlIHBvcnQKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRwb3J0XyA9ICc5MDkwJzsKKworICAgIC8qKgorICAgICAqIFNlbmQgdGltZW91dCBpbiBzZWNvbmRzLgorICAgICAqCisgICAgICogQ29tYmluZWQgd2l0aCBzZW5kVGltZW91dFVzZWMgdGhpcyBpcyB1c2VkIGZvciBzZW5kIHRpbWVvdXRzLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHNlbmRUaW1lb3V0U2VjXyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRpbWVvdXQgaW4gbWljcm9zZWNvbmRzLgorICAgICAqCisgICAgICogQ29tYmluZWQgd2l0aCBzZW5kVGltZW91dFNlYyB0aGlzIGlzIHVzZWQgZm9yIHNlbmQgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkc2VuZFRpbWVvdXRVc2VjXyA9IDEwMDAwMDsKKworICAgIC8qKgorICAgICAqIFJlY3YgdGltZW91dCBpbiBzZWNvbmRzCisgICAgICoKKyAgICAgKiBDb21iaW5lZCB3aXRoIHJlY3ZUaW1lb3V0VXNlYyB0aGlzIGlzIHVzZWQgZm9yIHJlY3YgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcmVjdlRpbWVvdXRTZWNfID0gMDsKKworICAgIC8qKgorICAgICAqIFJlY3YgdGltZW91dCBpbiBtaWNyb3NlY29uZHMKKyAgICAgKgorICAgICAqIENvbWJpbmVkIHdpdGggcmVjdlRpbWVvdXRTZWMgdGhpcyBpcyB1c2VkIGZvciByZWN2IHRpbWVvdXRzLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJlY3ZUaW1lb3V0VXNlY18gPSA3NTAwMDA7CisKKyAgICAvKioKKyAgICAgKiBQZXJzaXN0ZW50IHNvY2tldCBvciBwbGFpbj8KKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByb3RlY3RlZCAkcGVyc2lzdF8gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIERlYnVnZ2luZyBvbj8KKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByb3RlY3RlZCAkZGVidWdfID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBEZWJ1ZyBoYW5kbGVyCisgICAgICoKKyAgICAgKiBAdmFyIG1peGVkCisgICAgICovCisgICAgcHJvdGVjdGVkICRkZWJ1Z0hhbmRsZXJfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBSZW1vdGUgaG9zdG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IFJlbW90ZSBwb3J0CisgICAgICogQHBhcmFtIGJvb2wgJHBlcnNpc3QgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAorICAgICAqIEBwYXJhbSBzdHJpbmcgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGZvciBlcnJvciBsb2dnaW5nCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkaG9zdCA9ICdsb2NhbGhvc3QnLAorICAgICAgICAkcG9ydCA9IDkwOTAsCisgICAgICAgICRwZXJzaXN0ID0gZmFsc2UsCisgICAgICAgICRkZWJ1Z0hhbmRsZXIgPSBudWxsCisgICAgKSB7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPnBlcnNpc3RfID0gJHBlcnNpc3Q7CisgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfID0gJGRlYnVnSGFuZGxlciA/ICRkZWJ1Z0hhbmRsZXIgOiAnZXJyb3JfbG9nJzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJGhhbmRsZQorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRIYW5kbGUoJGhhbmRsZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gJGhhbmRsZTsKKyAgICAgICAgc3RyZWFtX3NldF9ibG9ja2luZygkdGhpcy0+aGFuZGxlXywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlbmQgdGltZW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgVGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFNlbmRUaW1lb3V0KCR0aW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyA9IGZsb29yKCR0aW1lb3V0IC8gMTAwMCk7CisgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFVzZWNfID0KKyAgICAgICAgICAgICgkdGltZW91dCAtICgkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICogMTAwMCkpICogMTAwMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSByZWNlaXZlIHRpbWVvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICR0aW1lb3V0IFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSZWN2VGltZW91dCgkdGltZW91dCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWN2VGltZW91dFNlY18gPSBmbG9vcigkdGltZW91dCAvIDEwMDApOworICAgICAgICAkdGhpcy0+cmVjdlRpbWVvdXRVc2VjXyA9CisgICAgICAgICAgICAoJHRpbWVvdXQgLSAoJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXyAqIDEwMDApKSAqIDEwMDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBkZWJ1Z2dpbmcgb3V0cHV0IG9uIG9yIG9mZgorICAgICAqCisgICAgICogQHBhcmFtIGJvb2wgJGRlYnVnCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldERlYnVnKCRkZWJ1ZykKKyAgICB7CisgICAgICAgICR0aGlzLT5kZWJ1Z18gPSAkZGVidWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBob3N0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBob3N0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldEhvc3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5ob3N0XzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlbW90ZSBwb3J0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGludCBwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFBvcnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5wb3J0XzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMgaXMgb3BlbgorICAgICAqCisgICAgICogQHJldHVybiBib29sIHRydWUgaWYgdGhlIHNvY2tldCBpcyBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gaXNfcmVzb3VyY2UoJHRoaXMtPmhhbmRsZV8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5pc09wZW4oKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcsIFRUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPmhvc3RfKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIG51bGwgaG9zdCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdGhpcy0+cG9ydF8gPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdGhpcy0+cGVyc2lzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQHBmc29ja29wZW4oCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLAorICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XywKKyAgICAgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICsgKCR0aGlzLT5zZW5kVGltZW91dFVzZWNfIC8gMTAwMDAwMCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IEBmc29ja29wZW4oCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLAorICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XywKKyAgICAgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICsgKCR0aGlzLT5zZW5kVGltZW91dFVzZWNfIC8gMTAwMDAwMCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb25uZWN0IGZhaWxlZD8KKyAgICAgICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBmYWxzZSkgeworICAgICAgICAgICAgJGVycm9yID0gJ1RTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcgLgorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XyAuICcgKCcgLiAkZXJyc3RyIC4gJyBbJyAuICRlcnJubyAuICddKSc7CisgICAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJGVycm9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3NvY2tldF9pbXBvcnRfc3RyZWFtJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdzb2NrZXRfc2V0X29wdGlvbicpKSB7CisgICAgICAgICAgICAkc29ja2V0ID0gc29ja2V0X2ltcG9ydF9zdHJlYW0oJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAgICAgc29ja2V0X3NldF9vcHRpb24oJHNvY2tldCwgU09MX1RDUCwgVENQX05PREVMQVksIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzb2NrZXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgIEBmY2xvc2UoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBmcm9tIHRoZSBzb2NrZXQgYXQgbW9zdCAkbGVuIGJ5dGVzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBub3Qgd2FpdCBmb3IgYWxsIHRoZSByZXF1ZXN0ZWQgZGF0YSwgaXQgd2lsbCByZXR1cm4gYXMKKyAgICAgKiBzb29uIGFzIGFueSBkYXRhIGlzIHJlY2VpdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICogQHJldHVybiBzdHJpbmcgQmluYXJ5IGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgJG51bGwgPSBudWxsOworICAgICAgICAkcmVhZCA9IGFycmF5KCR0aGlzLT5oYW5kbGVfKTsKKyAgICAgICAgJHJlYWRhYmxlID0gQHN0cmVhbV9zZWxlY3QoCisgICAgICAgICAgICAkcmVhZCwKKyAgICAgICAgICAgICRudWxsLAorICAgICAgICAgICAgJG51bGwsCisgICAgICAgICAgICAkdGhpcy0+cmVjdlRpbWVvdXRTZWNfLAorICAgICAgICAgICAgJHRoaXMtPnJlY3ZUaW1lb3V0VXNlY18KKyAgICAgICAgKTsKKworICAgICAgICBpZiAoJHJlYWRhYmxlID4gMCkgeworICAgICAgICAgICAgJGRhdGEgPSBmcmVhZCgkdGhpcy0+aGFuZGxlXywgJGxlbik7CisgICAgICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcgLiAkbGVuIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOworICAgICAgICAgICAgfSBlbHNlaWYgKCRkYXRhID09ICcnICYmIGZlb2YoJHRoaXMtPmhhbmRsZV8pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQgcmVhZCAwIGJ5dGVzJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICAgICAgfSBlbHNlaWYgKCRyZWFkYWJsZSA9PT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcgLiAkbGVuIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0Xyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRvIHRoZSBzb2NrZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEgdG8gd3JpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICRudWxsID0gbnVsbDsKKyAgICAgICAgJHdyaXRlID0gYXJyYXkoJHRoaXMtPmhhbmRsZV8pOworCisgICAgICAgIC8vIGtlZXAgd3JpdGluZyB1bnRpbCBhbGwgdGhlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbgorICAgICAgICB3aGlsZSAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpID4gMCkgeworICAgICAgICAgICAgLy8gd2FpdCBmb3Igc3RyZWFtIHRvIGJlY29tZSBhdmFpbGFibGUgZm9yIHdyaXRpbmcKKyAgICAgICAgICAgICR3cml0YWJsZSA9IEBzdHJlYW1fc2VsZWN0KAorICAgICAgICAgICAgICAgICRudWxsLAorICAgICAgICAgICAgICAgICR3cml0ZSwKKyAgICAgICAgICAgICAgICAkbnVsbCwKKyAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfLAorICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFVzZWNfCisgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKCR3cml0YWJsZSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyB3cml0ZSBidWZmZXIgdG8gc3RyZWFtCisgICAgICAgICAgICAgICAgJHdyaXR0ZW4gPSBmd3JpdGUoJHRoaXMtPmhhbmRsZV8sICRidWYpOworICAgICAgICAgICAgICAgIGlmICgkd3JpdHRlbiA9PT0gLTEgfHwgJHdyaXR0ZW4gPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXQ6IENvdWxkIG5vdCB3cml0ZSAnIC4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpIC4gJyBieXRlcyAnIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XworICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgaG93IG11Y2ggb2YgdGhlIGJ1ZmZlciBpcyBsZWZ0IHRvIHdyaXRlCisgICAgICAgICAgICAgICAgJGJ1ZiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkYnVmLCAkd3JpdHRlbik7CisgICAgICAgICAgICB9IGVsc2VpZiAoJHdyaXRhYmxlID09PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdUU29ja2V0OiB0aW1lZCBvdXQgd3JpdGluZyAnIC4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXQ6IENvdWxkIG5vdCB3cml0ZSAnIC4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpIC4gJyBieXRlcyAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoIG91dHB1dCB0byB0aGUgc29ja2V0LgorICAgICAqCisgICAgICogU2luY2UgcmVhZCgpLCByZWFkQWxsKCkgYW5kIHdyaXRlKCkgb3BlcmF0ZSBvbiB0aGUgc29ja2V0cyBkaXJlY3RseSwKKyAgICAgKiB0aGlzIGlzIGEgbm8tb3AKKyAgICAgKgorICAgICAqIElmIHlvdSB3aXNoIHRvIGhhdmUgZmx1c2hhYmxlIGJ1ZmZlcmluZyBiZWhhdmlvdXIsIHdyYXAgdGhpcyBUU29ja2V0CisgICAgICogaW4gYSBUQnVmZmVyZWRUcmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5ZThkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAKQEAgLTAsMCArMSwzMTAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGxpYnJhcnkgbWFrZXMgdXNlIG9mIEFQQyBjYWNoZSB0byBtYWtlIGhvc3RzIGFzIGRvd24gaW4gYSB3ZWIKKyAqIGVudmlyb25tZW50LiBJZiB5b3UgYXJlIHJ1bm5pbmcgZnJvbSB0aGUgQ0xJIG9yIG9uIGEgc3lzdGVtIHdpdGhvdXQgQVBDCisgKiBpbnN0YWxsZWQsIHRoZW4gdGhlc2UgbnVsbCBmdW5jdGlvbnMgd2lsbCBzdGVwIGluIGFuZCBhY3QgbGlrZSBjYWNoZQorICogbWlzc2VzLgorICovCitpZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXBjX2ZldGNoJykpIHsKKyAgICBmdW5jdGlvbiBhcGNfZmV0Y2goJGtleSkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBhcGNfc3RvcmUoJGtleSwgJHZhciwgJHR0bCA9IDApCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvKioKKyAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIGNvbm5lY3Rpb24KKyAqIHRvIGEgcG9vbCBvZiBzZXJ2ZXJzLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNvY2tldFBvb2wgZXh0ZW5kcyBUU29ja2V0Cit7CisgICAgLyoqCisgICAgICogUmVtb3RlIHNlcnZlcnMuIEFycmF5IG9mIGFzc29jaWF0aXZlIGFycmF5cyB3aXRoICdob3N0JyBhbmQgJ3BvcnQnIGtleXMKKyAgICAgKi8KKyAgICBwcml2YXRlICRzZXJ2ZXJzXyA9IGFycmF5KCk7CisKKyAgICAvKioKKyAgICAgKiBIb3cgbWFueSB0aW1lcyB0byByZXRyeSBlYWNoIGhvc3QgaW4gY29ubmVjdAorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcml2YXRlICRudW1SZXRyaWVzXyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBSZXRyeSBpbnRlcnZhbCBpbiBzZWNvbmRzLCBob3cgbG9uZyB0byBub3QgdHJ5IGEgaG9zdCBpZiBpdCBoYXMgYmVlbgorICAgICAqIG1hcmtlZCBhcyBkb3duLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcml2YXRlICRyZXRyeUludGVydmFsXyA9IDYwOworCisgICAgLyoqCisgICAgICogTWF4IGNvbnNlY3V0aXZlIGZhaWx1cmVzIGJlZm9yZSBtYXJraW5nIGEgaG9zdCBkb3duLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcml2YXRlICRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUcnkgaG9zdHMgaW4gb3JkZXI/IG9yIFJhbmRvbWl6ZWQ/CisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRyYW5kb21pemVfID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEFsd2F5cyB0cnkgbGFzdCBob3N0LCBldmVuIGlmIG1hcmtlZCBkb3duPworICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJpdmF0ZSAkYWx3YXlzVHJ5TGFzdF8gPSB0cnVlOworCisgICAgLyoqCisgICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSAkaG9zdHMgTGlzdCBvZiByZW1vdGUgaG9zdG5hbWVzCisgICAgICogQHBhcmFtIG1peGVkICRwb3J0cyBBcnJheSBvZiByZW1vdGUgcG9ydHMsIG9yIGEgc2luZ2xlIGNvbW1vbiBwb3J0CisgICAgICogQHBhcmFtIGJvb2wgJHBlcnNpc3QgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAorICAgICAqIEBwYXJhbSBtaXhlZCAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIGZvciBlcnJvciBsb2dnaW5nCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkaG9zdHMgPSBhcnJheSgnbG9jYWxob3N0JyksCisgICAgICAgICRwb3J0cyA9IGFycmF5KDkwOTApLAorICAgICAgICAkcGVyc2lzdCA9IGZhbHNlLAorICAgICAgICAkZGVidWdIYW5kbGVyID0gbnVsbAorICAgICkgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KG51bGwsIDAsICRwZXJzaXN0LCAkZGVidWdIYW5kbGVyKTsKKworICAgICAgICBpZiAoIWlzX2FycmF5KCRwb3J0cykpIHsKKyAgICAgICAgICAgICRwb3J0ID0gJHBvcnRzOworICAgICAgICAgICAgJHBvcnRzID0gYXJyYXkoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICR2YWwpIHsKKyAgICAgICAgICAgICAgICAkcG9ydHNbJGtleV0gPSAkcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICRob3N0KSB7CisgICAgICAgICAgICAkdGhpcy0+c2VydmVyc18gW10gPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsCisgICAgICAgICAgICAgICAgJ3BvcnQnID0+ICRwb3J0c1ska2V5XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcHJldmVudCB5b3UgZnJvbSBhZGRpbmcgYSBkdXBsaWNhdGUgc2VydmVyIGVudHJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBob3N0bmFtZSBvciBJUAorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTZXJ2ZXIoJGhvc3QsICRwb3J0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnNlcnZlcnNfW10gPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsICdwb3J0JyA9PiAkcG9ydCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGluIHRoZSBjb25uZWN0IGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXROdW1SZXRyaWVzKCRudW1SZXRyaWVzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPm51bVJldHJpZXNfID0gJG51bVJldHJpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgbG9uZyB0byB3YWl0IHVudGlsIHJldHJ5aW5nIGEgaG9zdCBpZiBpdCB3YXMgbWFya2VkIGRvd24KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmV0cnlJbnRlcnZhbCgkcmV0cnlJbnRlcnZhbCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZXRyeUludGVydmFsXyA9ICRyZXRyeUludGVydmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaG93IG1hbnkgdGltZSB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBiZWZvcmUgbWFya2luZyBpdCBhcyBkb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKCRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPm1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gJG1heENvbnNlY3V0aXZlRmFpbHVyZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHVybnMgcmFuZG9taXphdGlvbiBpbiBjb25uZWN0IG9yZGVyIG9uIG9yIG9mZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib29sICRyYW5kb21pemUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmFuZG9taXplKCRyYW5kb21pemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmFuZG9taXplXyA9ICRyYW5kb21pemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhbHdheXMgdHJ5IHRoZSBsYXN0IHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib29sICRhbHdheXNUcnlMYXN0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldEFsd2F5c1RyeUxhc3QoJGFsd2F5c1RyeUxhc3QpCisgICAgeworICAgICAgICAkdGhpcy0+YWx3YXlzVHJ5TGFzdF8gPSAkYWx3YXlzVHJ5TGFzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0aGUgc29ja2V0IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGFsbCB0aGUgc2VydmVycyBpbiB0aGUgcG9vbAorICAgICAqIGFuZCB0cnlpbmcgdG8gZmluZCBvbmUgdGhhdCB3b3Jrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgICAgICAvLyBDaGVjayBpZiB3ZSB3YW50IG9yZGVyIHJhbmRvbWl6YXRpb24KKyAgICAgICAgaWYgKCR0aGlzLT5yYW5kb21pemVfKSB7CisgICAgICAgICAgICBzaHVmZmxlKCR0aGlzLT5zZXJ2ZXJzXyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3VudCBzZXJ2ZXJzIHRvIGlkZW50aWZ5IHRoZSAibGFzdCIgb25lCisgICAgICAgICRudW1TZXJ2ZXJzID0gY291bnQoJHRoaXMtPnNlcnZlcnNfKTsKKworICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbnVtU2VydmVyczsgKyskaSkgeworICAgICAgICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgJGhvc3QgYW5kICRwb3J0IHZhcmlhYmxlcworICAgICAgICAgICAgZXh0cmFjdCgkdGhpcy0+c2VydmVyc19bJGldKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgQVBDIGNhY2hlIGZvciBhIHJlY29yZCBvZiB0aGlzIHNlcnZlciBiZWluZyBkb3duCisgICAgICAgICAgICAkZmFpbHRpbWVLZXkgPSAndGhyaWZ0X2ZhaWx0aW1lOicgLiAkaG9zdCAuICc6JyAuICRwb3J0IC4gJ34nOworCisgICAgICAgICAgICAvLyBDYWNoZSBtaXNzPyBBc3N1bWUgaXQncyBPSworICAgICAgICAgICAgJGxhc3RGYWlsdGltZSA9IGFwY19mZXRjaCgkZmFpbHRpbWVLZXkpOworICAgICAgICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgJGxhc3RGYWlsdGltZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIENhY2hlIGhpdC4uLm1ha2Ugc3VyZSBlbm91Z2ggdGhlIHJldHJ5IGludGVydmFsIGhhcyBlbGFwc2VkCisgICAgICAgICAgICBpZiAoJGxhc3RGYWlsdGltZSA+IDApIHsKKyAgICAgICAgICAgICAgICAkZWxhcHNlZCA9IHRpbWUoKSAtICRsYXN0RmFpbHRpbWU7CisgICAgICAgICAgICAgICAgaWYgKCRlbGFwc2VkID4gJHRoaXMtPnJldHJ5SW50ZXJ2YWxfKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0UG9vbDogcmV0cnlJbnRlcnZhbCAnIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKCcgLiAkdGhpcy0+cmV0cnlJbnRlcnZhbF8gLiAnKSAnIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFzIHBhc3NlZCBmb3IgaG9zdCAnIC4gJGhvc3QgLiAnOicgLiAkcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT25seSBjb25uZWN0IGlmIG5vdCBpbiB0aGUgbWlkZGxlIG9mIGEgZmFpbCBpbnRlcnZhbCwgT1IgaWYgdGhpcworICAgICAgICAgICAgLy8gaXMgdGhlIExBU1Qgc2VydmVyIHdlIGFyZSB0cnlpbmcsIGp1c3QgaGFtbWVyIGF3YXkgb24gaXQKKyAgICAgICAgICAgICRpc0xhc3RTZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+YWx3YXlzVHJ5TGFzdF8pIHsKKyAgICAgICAgICAgICAgICAkaXNMYXN0U2VydmVyID0gKCRpID09ICgkbnVtU2VydmVycyAtIDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgkbGFzdEZhaWx0aW1lID09PSAwKSB8fAorICAgICAgICAgICAgICAgICgkaXNMYXN0U2VydmVyKSB8fAorICAgICAgICAgICAgICAgICgkbGFzdEZhaWx0aW1lID4gMCAmJiAkcmV0cnlJbnRlcnZhbFBhc3NlZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgdW5kZXJseWluZyBUU29ja2V0IHBhcmFtcyB0byB0aGlzIG9uZQorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworCisgICAgICAgICAgICAgICAgLy8gVHJ5IHVwIHRvIG51bVJldHJpZXNfIGNvbm5lY3Rpb25zIHBlciBzZXJ2ZXIKKyAgICAgICAgICAgICAgICBmb3IgKCRhdHRlbXB0ID0gMDsgJGF0dGVtcHQgPCAkdGhpcy0+bnVtUmV0cmllc187ICRhdHRlbXB0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgdW5kZXJseWluZyBUU29ja2V0IG9wZW4gZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDo6b3BlbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHRoZSBmYWlsdXJlIGNvdW50cyBpZiByZXF1aXJlZCB0byBkbyBzbworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBjX3N0b3JlKCRmYWlsdGltZUtleSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3NmdWwgY29ubmVjdGlvbiwgcmV0dXJuIG5vdworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uICR0eCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE1hcmsgZmFpbHVyZSBvZiB0aGlzIGhvc3QgaW4gdGhlIGNhY2hlCisgICAgICAgICAgICAgICAgJGNvbnNlY2ZhaWxzS2V5ID0gJ3RocmlmdF9jb25zZWNmYWlsczonIC4gJGhvc3QgLiAnOicgLiAkcG9ydCAuICd+JzsKKworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjYWNoZSBtaXNzZXMKKyAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHMgPSBhcGNfZmV0Y2goJGNvbnNlY2ZhaWxzS2V5KTsKKyAgICAgICAgICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID09PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHMgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBieSBvbmUKKyAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHMrKzsKKworICAgICAgICAgICAgICAgIC8vIExvZyBhbmQgY2FjaGUgdGhpcyBmYWlsdXJlCisgICAgICAgICAgICAgICAgaWYgKCRjb25zZWNmYWlscyA+PSAkdGhpcy0+bWF4Q29uc2VjdXRpdmVGYWlsdXJlc18pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0UG9vbDogbWFya2luZyAnIC4gJGhvc3QgLiAnOicgLiAkcG9ydCAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBhcyBkb3duIGZvciAnIC4gJHRoaXMtPnJldHJ5SW50ZXJ2YWxfIC4gJyBzZWNzICcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZnRlciAnIC4gJGNvbnNlY2ZhaWxzIC4gJyBmYWlsZWQgYXR0ZW1wdHMuJworICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgZmFpbHVyZSB0aW1lCisgICAgICAgICAgICAgICAgICAgIGFwY19zdG9yZSgkZmFpbHRpbWVLZXksIHRpbWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGNvdW50IG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzCisgICAgICAgICAgICAgICAgICAgIGFwY19zdG9yZSgkY29uc2VjZmFpbHNLZXksIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFwY19zdG9yZSgkY29uc2VjZmFpbHNLZXksICRjb25zZWNmYWlscyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT2ggbm87IHdlIGZhaWxlZCB0aGVtIGFsbC4gVGhlIHN5c3RlbSBpcyB0b3RhbGx5IGlsbCEKKyAgICAgICAgJGVycm9yID0gJ1RTb2NrZXRQb29sOiBBbGwgaG9zdHMgaW4gcG9vbCBhcmUgZG93bi4gJzsKKyAgICAgICAgJGhvc3RzID0gYXJyYXkoKTsKKyAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnNlcnZlcnNfIGFzICRzZXJ2ZXIpIHsKKyAgICAgICAgICAgICRob3N0cyBbXSA9ICRzZXJ2ZXJbJ2hvc3QnXSAuICc6JyAuICRzZXJ2ZXJbJ3BvcnQnXTsKKyAgICAgICAgfQorICAgICAgICAkaG9zdGxpc3QgPSBpbXBsb2RlKCcsJywgJGhvc3RzKTsKKyAgICAgICAgJGVycm9yIC49ICcoJyAuICRob3N0bGlzdCAuICcpJzsKKyAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTIxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSw5OCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBCYXNlIGludGVyZmFjZSBmb3IgYSB0cmFuc3BvcnQgYWdlbnQuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCithYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgb3BlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKTsKKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gb3BlbigpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKTsKKworICAgIC8qKgorICAgICAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pOworCisgICAgLyoqCisgICAgICogR3VhcmFudGVlcyB0aGF0IHRoZSBmdWxsIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSwgb2YgZXhhY3QgbGVuZ3RoCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKQorICAgIHsKKyAgICAgICAgLy8gcmV0dXJuICR0aGlzLT5yZWFkKCRsZW4pOworCisgICAgICAgICRkYXRhID0gJyc7CisgICAgICAgICRnb3QgPSAwOworICAgICAgICB3aGlsZSAoKCRnb3QgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGRhdGEpKSA8ICRsZW4pIHsKKyAgICAgICAgICAgICRkYXRhIC49ICR0aGlzLT5yZWFkKCRsZW4gLSAkZ290KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGRhdGEgb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1Zik7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgYnVmZmVyCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1R5cGUvVENvbnN0YW50LnBocCBiL2xpYi9waHAvbGliL1R5cGUvVENvbnN0YW50LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTVkYTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHlwZS9UQ29uc3RhbnQucGhwCkBAIC0wLDAgKzEsNTIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHlwZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBjb25zdGFudCBNYW5hZ2VtZW50CisgKi8KK2Fic3RyYWN0IGNsYXNzIFRDb25zdGFudAoreworICAgIC8qKgorICAgICAqIERvbid0IGluc3RhbmNpYXRlIHRoaXMgY2xhc3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjb25zdGFudCB2YWx1ZQorICAgICAqIEBwYXJhbSAgc3RyaW5nICRjb25zdGFudAorICAgICAqIEByZXR1cm4gbWl4ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldCgkY29uc3RhbnQpCisgICAgeworICAgICAgICBpZiAoaXNfbnVsbChzdGF0aWM6OiQkY29uc3RhbnQpKSB7CisgICAgICAgICAgICBzdGF0aWM6OiQkY29uc3RhbnQgPSBjYWxsX3VzZXJfZnVuYygKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCdzdGF0aWM6OmluaXRfJXMnLCAkY29uc3RhbnQpCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0YXRpYzo6JCRjb25zdGFudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAgYi9saWIvcGhwL2xpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5YWU2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1R5cGUvVE1lc3NhZ2VUeXBlLnBocApAQCAtMCwwICsxLDM0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFR5cGU7CisKKy8qKgorICogTWVzc2FnZSB0eXBlcyBmb3IgUlBDCisgKi8KK2NsYXNzIFRNZXNzYWdlVHlwZQoreworICAgIGNvbnN0IENBTEwgID0gMTsKKyAgICBjb25zdCBSRVBMWSA9IDI7CisgICAgY29uc3QgRVhDRVBUSU9OID0gMzsKKyAgICBjb25zdCBPTkVXQVkgPSA0OworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHlwZS9UVHlwZS5waHAgYi9saWIvcGhwL2xpYi9UeXBlL1RUeXBlLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmRiMTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHlwZS9UVHlwZS5waHAKQEAgLTAsMCArMSw0NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUeXBlOworCisvKioKKyAqIERhdGEgdHlwZXMgdGhhdCBjYW4gYmUgc2VudCB2aWEgVGhyaWZ0CisgKi8KK2NsYXNzIFRUeXBlCit7CisgICAgY29uc3QgU1RPUCAgID0gMDsKKyAgICBjb25zdCBWT0lEICAgPSAxOworICAgIGNvbnN0IEJPT0wgICA9IDI7CisgICAgY29uc3QgQllURSAgID0gMzsKKyAgICBjb25zdCBJMDggICAgPSAzOworICAgIGNvbnN0IERPVUJMRSA9IDQ7CisgICAgY29uc3QgSTE2ICAgID0gNjsKKyAgICBjb25zdCBJMzIgICAgPSA4OworICAgIGNvbnN0IEk2NCAgICA9IDEwOworICAgIGNvbnN0IFNUUklORyA9IDExOworICAgIGNvbnN0IFVURjcgICA9IDExOworICAgIGNvbnN0IFNUUlVDVCA9IDEyOworICAgIGNvbnN0IE1BUCAgICA9IDEzOworICAgIGNvbnN0IFNFVCAgICA9IDE0OworICAgIGNvbnN0IExTVCAgICA9IDE1OyAgICAvLyBOLkIuIGNhbm5vdCB1c2UgTElTVCBrZXl3b3JkIGluIFBIUCEKKyAgICBjb25zdCBVVEY4ICAgPSAxNjsKKyAgICBjb25zdCBVVEYxNiAgPSAxNzsKK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLm00IGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKaW5kZXggMmMzMzhhMC4uZTIxMzhjOCAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKKysrIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKQEAgLTIsMTQgKzIsMzMgQEAKIGRubCBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAogZG5sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAogZG5sIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KK2RubAorZG5sIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK2RubCBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZG5sIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCitkbmwgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCitkbmwgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorZG5sICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK2RubCB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2RubAorZG5sICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK2RubAorZG5sIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK2RubCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorZG5sICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorZG5sIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitkbmwgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworZG5sIHVuZGVyIHRoZSBMaWNlbnNlLgogCiBQSFBfQVJHX0VOQUJMRSh0aHJpZnRfcHJvdG9jb2wsIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSB0aHJpZnRfcHJvdG9jb2wgZXh0ZW5zaW9uLAotWyAgLS1lbmFibGUtdGhyaWZ0X3Byb3RvY29sCUVuYWJsZSB0aGUgZmJ0aHJpZnRfcHJvdG9jb2wgZXh0ZW5zaW9uXSkKK1sgIC0tZW5hYmxlLXRocmlmdF9wcm90b2NvbAlFbmFibGUgdGhlIHRocmlmdF9wcm90b2NvbCBleHRlbnNpb25dKQogCiBpZiB0ZXN0ICIkUEhQX1RIUklGVF9QUk9UT0NPTCIgIT0gIm5vIjsgdGhlbgogICBQSFBfUkVRVUlSRV9DWFgoKQogICBQSFBfQUREX0xJQlJBUllfV0lUSF9QQVRIKHN0ZGMrKywgIiIsIFRIUklGVF9QUk9UT0NPTF9TSEFSRURfTElCQUREKQogICBQSFBfU1VCU1QoVEhSSUZUX1BST1RPQ09MX1NIQVJFRF9MSUJBREQpCisgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLXN0ZD1jKysxMSIKKwogICBQSFBfTkVXX0VYVEVOU0lPTih0aHJpZnRfcHJvdG9jb2wsIHBocF90aHJpZnRfcHJvdG9jb2wuY3BwLCAkZXh0X3NoYXJlZCkKIGZpCiAKZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwCmluZGV4IDE3YTczMjQuLmUxNTJkMDggMTAwNjQ0Ci0tLSBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAKKysrIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmNwcApAQCAtMTYsMjUgKzE2LDIzIEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2VuZGlmCiAKKyNpbmNsdWRlICJwaHAuaCIKKyNpbmNsdWRlICJ6ZW5kX2ludGVyZmFjZXMuaCIKKyNpbmNsdWRlICJ6ZW5kX2V4Y2VwdGlvbnMuaCIKKyNpbmNsdWRlICJwaHBfdGhyaWZ0X3Byb3RvY29sLmgiCisKKyNpZiBQSFBfVkVSU0lPTl9JRCA+PSA3MDAwMAorCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgZGVmaW5lZCggV0lOMzIgKSB8fCBkZWZpbmVkKCBfV0lONjQgKQotdHlwZWRlZiBpbnQgIGludDMyX3Q7IAotdHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIGxvbmcgbG9uZyAgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgICB1aW50MzJfdDsgCi10eXBlZGVmIHNob3J0ICBpbnQxNl90OyAKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICAgdWludDY0X3Q7Ci0jZWxzZQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPiAKLSNlbmRpZgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiAjaWZuZGVmIGJzd2FwXzY0CiAjZGVmaW5lCWJzd2FwXzY0KHgpICAgICAoKCh1aW50NjRfdCkoeCkgPDwgNTYpIHwgXApAQCAtODcsMjYgKzg1LDIyIEBACiBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7CiAKLSNpbmNsdWRlICJwaHAuaCIKLSNpbmNsdWRlICJ6ZW5kX2ludGVyZmFjZXMuaCIKLSNpbmNsdWRlICJ6ZW5kX2V4Y2VwdGlvbnMuaCIKLSNpbmNsdWRlICJwaHBfdGhyaWZ0X3Byb3RvY29sLmgiCi0KIHN0YXRpYyB6ZW5kX2Z1bmN0aW9uX2VudHJ5IHRocmlmdF9wcm90b2NvbF9mdW5jdGlvbnNbXSA9IHsKLSAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnksIE5VTEwpCi0gIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnksIE5VTEwpCi0gIHtOVUxMLCBOVUxMLCBOVUxMfQotfSA7CisgIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5LCBudWxscHRyKQorICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5LCBudWxscHRyKQorICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4sIG51bGxwdHIpCisgIHtudWxscHRyLCBudWxscHRyLCBudWxscHRyfQorfTsKIAogemVuZF9tb2R1bGVfZW50cnkgdGhyaWZ0X3Byb3RvY29sX21vZHVsZV9lbnRyeSA9IHsKICAgU1RBTkRBUkRfTU9EVUxFX0hFQURFUiwKICAgInRocmlmdF9wcm90b2NvbCIsCiAgIHRocmlmdF9wcm90b2NvbF9mdW5jdGlvbnMsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCisgIG51bGxwdHIsCisgIG51bGxwdHIsCisgIG51bGxwdHIsCisgIG51bGxwdHIsCisgIG51bGxwdHIsCiAgICIxLjAiLAogICBTVEFOREFSRF9NT0RVTEVfUFJPUEVSVElFUwogfTsKQEAgLTExNyw0MiArMTExLDYxIEBACiAKIGNsYXNzIFBIUEV4Y2VwdGlvbldyYXBwZXIgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24gewogcHVibGljOgotICBQSFBFeGNlcHRpb25XcmFwcGVyKHp2YWwqIF9leCkgdGhyb3coKSA6IGV4KF9leCkgewotICAgIHNucHJpbnRmKF93aGF0LCA0MCwgIlBIUCBleGNlcHRpb24genZhbD0lcCIsIGV4KTsKKyAgUEhQRXhjZXB0aW9uV3JhcHBlcih6dmFsKiBfZXgpIHRocm93KCkgeworICAgIFpWQUxfQ09QWSgmZXgsIF9leCk7CisgICAgc25wcmludGYoX3doYXQsIDQwLCAiUEhQIGV4Y2VwdGlvbiB6dmFsPSVwIiwgX2V4KTsKICAgfQotICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7IHJldHVybiBfd2hhdDsgfQotICB+UEhQRXhjZXB0aW9uV3JhcHBlcigpIHRocm93KCkge30KLSAgb3BlcmF0b3IgenZhbCooKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8enZhbCo+KGV4KTsgfSAvLyBaZW5kIEFQSSBkb2Vzbid0IGRvICdjb25zdCcuLi4KKworICBQSFBFeGNlcHRpb25XcmFwcGVyKHplbmRfb2JqZWN0KiBfZXhvYmopIHRocm93KCkgeworICAgIFpWQUxfT0JKKCZleCwgX2V4b2JqKTsKKyAgICBzbnByaW50Zihfd2hhdCwgNDAsICJQSFAgZXhjZXB0aW9uIHp2YWw9JXAiLCBfZXhvYmopOworICB9CisgIH5QSFBFeGNlcHRpb25XcmFwcGVyKCkgdGhyb3coKSB7CisgICAgenZhbF9kdG9yKCZleCk7CisgIH0KKworICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7CisgICAgcmV0dXJuIF93aGF0OworICB9CisgIG9wZXJhdG9yIHp2YWwqKCkgY29uc3QgdGhyb3coKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8enZhbCo+KCZleCk7CisgIH0gLy8gWmVuZCBBUEkgZG9lc24ndCBkbyAnY29uc3QnLi4uCiBwcm90ZWN0ZWQ6Ci0gIHp2YWwqIGV4OworICB6dmFsIGV4OwogICBjaGFyIF93aGF0WzQwXTsKIH0gOwogCiBjbGFzcyBQSFBUcmFuc3BvcnQgewotcHVibGljOgotICB6dmFsKiBwcm90b2NvbCgpIHsgcmV0dXJuIHA7IH0KLSAgenZhbCogdHJhbnNwb3J0KCkgeyByZXR1cm4gdDsgfQogcHJvdGVjdGVkOgotICBQSFBUcmFuc3BvcnQoKSB7fQorICBQSFBUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUpIHsKKyAgICBhc3NlcnQoWl9UWVBFX1AoX3ApID09IElTX09CSkVDVCk7CiAKLSAgdm9pZCBjb25zdHJ1Y3Rfd2l0aF96dmFsKHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplKSB7CisgICAgWlZBTF9VTkRFRigmdCk7CisKICAgICBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihlbWFsbG9jKF9idWZmZXJfc2l6ZSkpOwogICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CiAgICAgYnVmZmVyX3VzZWQgPSAwOwogICAgIGJ1ZmZlcl9zaXplID0gX2J1ZmZlcl9zaXplOwotICAgIHAgPSBfcDsKIAogICAgIC8vIEdldCB0aGUgdHJhbnNwb3J0IGZvciB0aGUgcGFzc2VkIHByb3RvY29sCiAgICAgenZhbCBnZXR0cmFuc3BvcnQ7Ci0gICAgWlZBTF9TVFJJTkcoJmdldHRyYW5zcG9ydCwgImdldFRyYW5zcG9ydCIsIDApOwotICAgIE1BS0VfU1REX1pWQUwodCk7Ci0gICAgWlZBTF9OVUxMKHQpOwotICAgIFRTUk1MU19GRVRDSCgpOwotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZwLCAmZ2V0dHJhbnNwb3J0LCB0LCAwLCBOVUxMIFRTUk1MU19DQyk7CisgICAgWlZBTF9TVFJJTkcoJmdldHRyYW5zcG9ydCwgImdldFRyYW5zcG9ydCIpOworICAgIGNhbGxfdXNlcl9mdW5jdGlvbihudWxscHRyLCBfcCwgJmdldHRyYW5zcG9ydCwgJnQsIDAsIG51bGxwdHIpOworCisgICAgenZhbF9kdG9yKCZnZXR0cmFuc3BvcnQpOworCisgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgIH0KKworICAgIGFzc2VydChaX1RZUEUodCkgPT0gSVNfT0JKRUNUKTsKICAgfQorCiAgIH5QSFBUcmFuc3BvcnQoKSB7CiAgICAgZWZyZWUoYnVmZmVyKTsKLSAgICB6dmFsX3B0cl9kdG9yKCZ0KTsKKyAgICB6dmFsX2R0b3IoJnQpOwogICB9CiAKICAgY2hhciogYnVmZmVyOwpAQCAtMTYwLDIwICsxNzMsMTQgQEAKICAgc2l6ZV90IGJ1ZmZlcl91c2VkOwogICBzaXplX3QgYnVmZmVyX3NpemU7CiAKLSAgenZhbCogcDsKLSAgenZhbCogdDsKKyAgenZhbCB0OwogfTsKIAogCiBjbGFzcyBQSFBPdXRwdXRUcmFuc3BvcnQgOiBwdWJsaWMgUEhQVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgUEhQT3V0cHV0VHJhbnNwb3J0KHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplID0gODE5MikgewotICAgIGNvbnN0cnVjdF93aXRoX3p2YWwoX3AsIF9idWZmZXJfc2l6ZSk7Ci0gIH0KLQotICB+UEhQT3V0cHV0VHJhbnNwb3J0KCkgewotICAgIC8vZmx1c2goKTsKLSAgfQorICBQSFBPdXRwdXRUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUgPSA4MTkyKSA6IFBIUFRyYW5zcG9ydChfcCwgX2J1ZmZlcl9zaXplKSB7IH0KKyAgflBIUE91dHB1dFRyYW5zcG9ydCgpIHsgfQogCiAgIHZvaWQgd3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgewogICAgIGlmICgobGVuICsgYnVmZmVyX3VzZWQpID4gYnVmZmVyX3NpemUpIHsKQEAgLTIzMSwzMiArMjM4LDM1IEBACiAgICAgfQogICB9CiAgIHZvaWQgZGlyZWN0Rmx1c2goKSB7Ci0gICAgenZhbCByZXQ7CisgICAgenZhbCByZXQsIGZsdXNoZm47CiAgICAgWlZBTF9OVUxMKCZyZXQpOwotICAgIHp2YWwgZmx1c2hmbjsKLSAgICBaVkFMX1NUUklORygmZmx1c2hmbiwgImZsdXNoIiwgMCk7Ci0gICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnQsICZmbHVzaGZuLCAmcmV0LCAwLCBOVUxMIFRTUk1MU19DQyk7Ci0gICAgenZhbF9kdG9yKCZyZXQpOwotICB9Ci0gIHZvaWQgZGlyZWN0V3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgewotICAgIHp2YWwgd3JpdGVmbjsKLSAgICBaVkFMX1NUUklORygmd3JpdGVmbiwgIndyaXRlIiwgMCk7Ci0gICAgY2hhciogbmV3YnVmID0gKGNoYXIqKWVtYWxsb2MobGVuICsgMSk7Ci0gICAgbWVtY3B5KG5ld2J1ZiwgZGF0YSwgbGVuKTsKLSAgICBuZXdidWZbbGVuXSA9ICdcMCc7Ci0gICAgenZhbCAqYXJnc1sxXTsKLSAgICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICAgIFpWQUxfU1RSSU5HTChhcmdzWzBdLCBuZXdidWYsIGxlbiwgMCk7Ci0gICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgenZhbCByZXQ7Ci0gICAgWlZBTF9OVUxMKCZyZXQpOwotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmd3JpdGVmbiwgJnJldCwgMSwgYXJncyBUU1JNTFNfQ0MpOwotICAgIHp2YWxfcHRyX2R0b3IoYXJncyk7CisgICAgWlZBTF9TVFJJTkcoJmZsdXNoZm4sICJmbHVzaCIpOworCisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJmZsdXNoZm4sICZyZXQsIDAsIG51bGxwdHIpOworICAgIHp2YWxfZHRvcigmZmx1c2hmbik7CiAgICAgenZhbF9kdG9yKCZyZXQpOwogICAgIGlmIChFRyhleGNlcHRpb24pKSB7Ci0gICAgICB6dmFsKiBleCA9IEVHKGV4Y2VwdGlvbik7Ci0gICAgICBFRyhleGNlcHRpb24pID0gTlVMTDsKKyAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgIH0KKyAgfQorICB2b2lkIGRpcmVjdFdyaXRlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW4pIHsKKyAgICB6dmFsIGFyZ3NbMV0sIHJldCwgd3JpdGVmbjsKKworICAgIFpWQUxfU1RSSU5HKCZ3cml0ZWZuLCAid3JpdGUiKTsKKyAgICBaVkFMX1NUUklOR0woJmFyZ3NbMF0sIGRhdGEsIGxlbik7CisKKyAgICBaVkFMX05VTEwoJnJldCk7CisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJndyaXRlZm4sICZyZXQsIDEsIGFyZ3MpOworCisgICAgenZhbF9kdG9yKCZ3cml0ZWZuKTsKKyAgICB6dmFsX2R0b3IoJnJldCk7CisgICAgenZhbF9kdG9yKCZhcmdzWzBdKTsKKworICAgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CiAgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKICAgICB9CiAgIH0KQEAgLTI2NCw4ICsyNzQsNyBAQAogCiBjbGFzcyBQSFBJbnB1dFRyYW5zcG9ydCA6IHB1YmxpYyBQSFBUcmFuc3BvcnQgewogcHVibGljOgotICBQSFBJbnB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIHsKLSAgICBjb25zdHJ1Y3Rfd2l0aF96dmFsKF9wLCBfYnVmZmVyX3NpemUpOworICBQSFBJbnB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIDogUEhQVHJhbnNwb3J0KF9wLCBfYnVmZmVyX3NpemUpIHsKICAgfQogCiAgIH5QSFBJbnB1dFRyYW5zcG9ydCgpIHsKQEAgLTI3NCwyNCArMjgzLDIxIEBACiAKICAgdm9pZCBwdXRfYmFjaygpIHsKICAgICBpZiAoYnVmZmVyX3VzZWQpIHsKLSAgICAgIHp2YWwgcHV0YmFja2ZuOwotICAgICAgWlZBTF9TVFJJTkcoJnB1dGJhY2tmbiwgInB1dEJhY2siLCAwKTsKLQotICAgICAgY2hhciogbmV3YnVmID0gKGNoYXIqKWVtYWxsb2MoYnVmZmVyX3VzZWQgKyAxKTsKLSAgICAgIG1lbWNweShuZXdidWYsIGJ1ZmZlcl9wdHIsIGJ1ZmZlcl91c2VkKTsKLSAgICAgIG5ld2J1ZltidWZmZXJfdXNlZF0gPSAnXDAnOwotCi0gICAgICB6dmFsICphcmdzWzFdOwotICAgICAgTUFLRV9TVERfWlZBTChhcmdzWzBdKTsKLSAgICAgIFpWQUxfU1RSSU5HTChhcmdzWzBdLCBuZXdidWYsIGJ1ZmZlcl91c2VkLCAwKTsKLQotICAgICAgVFNSTUxTX0ZFVENIKCk7Ci0KLSAgICAgIHp2YWwgcmV0OworICAgICAgenZhbCBhcmdzWzFdLCByZXQsIHB1dGJhY2tmbjsKKyAgICAgIFpWQUxfU1RSSU5HTCgmYXJnc1swXSwgYnVmZmVyX3B0ciwgYnVmZmVyX3VzZWQpOworICAgICAgWlZBTF9TVFJJTkcoJnB1dGJhY2tmbiwgInB1dEJhY2siKTsKICAgICAgIFpWQUxfTlVMTCgmcmV0KTsKLSAgICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmcHV0YmFja2ZuLCAmcmV0LCAxLCBhcmdzIFRTUk1MU19DQyk7Ci0gICAgICB6dmFsX3B0cl9kdG9yKGFyZ3MpOworCisgICAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmcHV0YmFja2ZuLCAmcmV0LCAxLCBhcmdzKTsKKworICAgICAgenZhbF9kdG9yKCZwdXRiYWNrZm4pOwogICAgICAgenZhbF9kdG9yKCZyZXQpOworICAgICAgenZhbF9kdG9yKCZhcmdzWzBdKTsKKyAgICAgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgICAgIH0KICAgICB9CiAgICAgYnVmZmVyX3VzZWQgPSAwOwogICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CkBAIC0yOTksNyArMzA1LDcgQEAKIAogICB2b2lkIHNraXAoc2l6ZV90IGxlbikgewogICAgIHdoaWxlIChsZW4pIHsKLSAgICAgIHNpemVfdCBjaHVua19zaXplID0gTUlOKGxlbiwgYnVmZmVyX3VzZWQpOworICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSAoc3RkOjptaW4pKGxlbiwgYnVmZmVyX3VzZWQpOwogICAgICAgaWYgKGNodW5rX3NpemUpIHsKICAgICAgICAgYnVmZmVyX3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlcl9wdHIpICsgY2h1bmtfc2l6ZTsKICAgICAgICAgYnVmZmVyX3VzZWQgLT0gY2h1bmtfc2l6ZTsKQEAgLTMxMiw3ICszMTgsNyBAQAogCiAgIHZvaWQgcmVhZEJ5dGVzKHZvaWQqIGJ1Ziwgc2l6ZV90IGxlbikgewogICAgIHdoaWxlIChsZW4pIHsKLSAgICAgIHNpemVfdCBjaHVua19zaXplID0gTUlOKGxlbiwgYnVmZmVyX3VzZWQpOworICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSAoc3RkOjptaW4pKGxlbiwgYnVmZmVyX3VzZWQpOwogICAgICAgaWYgKGNodW5rX3NpemUpIHsKICAgICAgICAgbWVtY3B5KGJ1ZiwgYnVmZmVyX3B0ciwgY2h1bmtfc2l6ZSk7CiAgICAgICAgIGJ1ZmZlcl9wdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihidWZmZXJfcHRyKSArIGNodW5rX3NpemU7CkBAIC0zNTMsMjkgKzM1OSwyOSBAQAogICB2b2lkIHJlZmlsbCgpIHsKICAgICBhc3NlcnQoYnVmZmVyX3VzZWQgPT0gMCk7CiAgICAgenZhbCByZXR2YWw7Ci0gICAgWlZBTF9OVUxMKCZyZXR2YWwpOwotCi0gICAgenZhbCAqYXJnc1sxXTsKLSAgICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICAgIFpWQUxfTE9ORyhhcmdzWzBdLCBidWZmZXJfc2l6ZSk7Ci0KLSAgICBUU1JNTFNfRkVUQ0goKTsKLQorICAgIHp2YWwgYXJnc1sxXTsKICAgICB6dmFsIGZ1bmNuYW1lOwotICAgIFpWQUxfU1RSSU5HKCZmdW5jbmFtZSwgInJlYWQiLCAwKTsKIAotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmZnVuY25hbWUsICZyZXR2YWwsIDEsIGFyZ3MgVFNSTUxTX0NDKTsKLSAgICB6dmFsX3B0cl9kdG9yKGFyZ3MpOworICAgIFpWQUxfTlVMTCgmcmV0dmFsKTsKKyAgICBaVkFMX0xPTkcoJmFyZ3NbMF0sIGJ1ZmZlcl9zaXplKTsKKworICAgIFpWQUxfU1RSSU5HKCZmdW5jbmFtZSwgInJlYWQiKTsKKworICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICYodGhpcy0+dCksICZmdW5jbmFtZSwgJnJldHZhbCwgMSwgYXJncyk7CisgICAgenZhbF9kdG9yKCZhcmdzWzBdKTsKKyAgICB6dmFsX2R0b3IoJmZ1bmNuYW1lKTsKIAogICAgIGlmIChFRyhleGNlcHRpb24pKSB7CiAgICAgICB6dmFsX2R0b3IoJnJldHZhbCk7Ci0gICAgICB6dmFsKiBleCA9IEVHKGV4Y2VwdGlvbik7Ci0gICAgICBFRyhleGNlcHRpb24pID0gTlVMTDsKKworICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOwogICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CiAgICAgfQogCiAgICAgYnVmZmVyX3VzZWQgPSBaX1NUUkxFTihyZXR2YWwpOwogICAgIG1lbWNweShidWZmZXIsIFpfU1RSVkFMKHJldHZhbCksIGJ1ZmZlcl91c2VkKTsKKwogICAgIHp2YWxfZHRvcigmcmV0dmFsKTsKIAogICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CkBAIC0zODMsMjIyICszODksNjMgQEAKIAogfTsKIAorc3RhdGljCiB2b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpOworc3RhdGljCiB2b2lkIGJpbmFyeV9zZXJpYWxpemVfc3BlYyh6dmFsKiB6dGhpcywgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIEhhc2hUYWJsZSogc3BlYyk7Ci12b2lkIGJpbmFyeV9zZXJpYWxpemUoaW50OF90IHRocmlmdF90eXBlSUQsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCB6dmFsKiogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKTsKLXZvaWQgc2tpcF9lbGVtZW50KGxvbmcgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCk7Ci12b2lkIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHp2YWwgKnRyYW5zcG9ydCwgY29uc3QgY2hhciogbWV0aG9kX25hbWUsIGludDMyX3QgbXNndHlwZSwgaW50MzJfdCBzZXFJRCk7Ci0KK3N0YXRpYwordm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKTsKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfc2NhbGFyKGludDhfdCB0KTsKIAogLy8gQ3JlYXRlIGEgUEhQIG9iamVjdCBnaXZlbiBhIHR5cGVuYW1lIGFuZCBjYWxsIHRoZSBjdG9yLCBvcHRpb25hbGx5IHBhc3NpbmcgdXAgdG8gMiBhcmd1bWVudHMKLXZvaWQgY3JlYXRlT2JqZWN0KGNoYXIqIG9ial90eXBlbmFtZSwgenZhbCogcmV0dXJuX3ZhbHVlLCBpbnQgbmFyZ3MgPSAwLCB6dmFsKiBhcmcxID0gTlVMTCwgenZhbCogYXJnMiA9IE5VTEwpIHsKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHNpemVfdCBvYmpfdHlwZW5hbWVfbGVuID0gc3RybGVuKG9ial90eXBlbmFtZSk7Ci0gIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9mZXRjaF9jbGFzcyhvYmpfdHlwZW5hbWUsIG9ial90eXBlbmFtZV9sZW4sIFpFTkRfRkVUQ0hfQ0xBU1NfREVGQVVMVCBUU1JNTFNfQ0MpOworc3RhdGljCit2b2lkIGNyZWF0ZU9iamVjdChjb25zdCBjaGFyKiBvYmpfdHlwZW5hbWUsIHp2YWwqIHJldHVybl92YWx1ZSwgaW50IG5hcmdzID0gMCwgenZhbCogYXJnMSA9IG51bGxwdHIsIHp2YWwqIGFyZzIgPSBudWxscHRyKSB7CisgIC8qIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGF0IG9uIHRoZSBzdGFjayA/ICovCisgIHplbmRfc3RyaW5nICpvYmpfbmFtZSA9IHplbmRfc3RyaW5nX2luaXQob2JqX3R5cGVuYW1lLCBzdHJsZW4ob2JqX3R5cGVuYW1lKSwgMCk7CisgIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9mZXRjaF9jbGFzcyhvYmpfbmFtZSwgWkVORF9GRVRDSF9DTEFTU19ERUZBVUxUKTsKKyAgemVuZF9zdHJpbmdfcmVsZWFzZShvYmpfbmFtZSk7CisKICAgaWYgKCEgY2UpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiQ2xhc3MgJXMgZG9lcyBub3QgZXhpc3QiLCBvYmpfdHlwZW5hbWUpOworICAgIHBocF9lcnJvcl9kb2NyZWYobnVsbHB0ciwgRV9FUlJPUiwgIkNsYXNzICVzIGRvZXMgbm90IGV4aXN0Iiwgb2JqX3R5cGVuYW1lKTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9CiAKLSAgb2JqZWN0X2FuZF9wcm9wZXJ0aWVzX2luaXQocmV0dXJuX3ZhbHVlLCBjZSwgTlVMTCk7Ci0gIHplbmRfZnVuY3Rpb24qIGNvbnN0cnVjdG9yID0gemVuZF9zdGRfZ2V0X2NvbnN0cnVjdG9yKHJldHVybl92YWx1ZSBUU1JNTFNfQ0MpOwotICB6dmFsKiBjdG9yX3J2ID0gTlVMTDsKLSAgemVuZF9jYWxsX21ldGhvZCgmcmV0dXJuX3ZhbHVlLCBjZSwgJmNvbnN0cnVjdG9yLCBOVUxMLCAwLCAmY3Rvcl9ydiwgbmFyZ3MsIGFyZzEsIGFyZzIgVFNSTUxTX0NDKTsKLSAgenZhbF9wdHJfZHRvcigmY3Rvcl9ydik7CisgIG9iamVjdF9hbmRfcHJvcGVydGllc19pbml0KHJldHVybl92YWx1ZSwgY2UsIG51bGxwdHIpOworICB6ZW5kX2Z1bmN0aW9uKiBjb25zdHJ1Y3RvciA9IHplbmRfc3RkX2dldF9jb25zdHJ1Y3RvcihaX09CSl9QKHJldHVybl92YWx1ZSkpOworICB6dmFsIGN0b3JfcnY7CisgIHplbmRfY2FsbF9tZXRob2QocmV0dXJuX3ZhbHVlLCBjZSwgJmNvbnN0cnVjdG9yLCBOVUxMLCAwLCAmY3Rvcl9ydiwgbmFyZ3MsIGFyZzEsIGFyZzIpOworICB6dmFsX2R0b3IoJmN0b3JfcnYpOworICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgIH0KIH0KIAotdm9pZCB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oY2hhciogd2hhdCwgbG9uZyBlcnJvcmNvZGUpIHsKLSAgVFNSTUxTX0ZFVENIKCk7CitzdGF0aWMKK3ZvaWQgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGNvbnN0IGNoYXIqIHdoYXQsIGxvbmcgZXJyb3Jjb2RlKSB7CisgIHp2YWwgendoYXQsIHplcnJvcmNvZGU7CiAKLSAgenZhbCAqendoYXQsICp6ZXJyb3Jjb2RlOwotICBNQUtFX1NURF9aVkFMKHp3aGF0KTsKLSAgTUFLRV9TVERfWlZBTCh6ZXJyb3Jjb2RlKTsKKyAgWlZBTF9TVFJJTkcoJnp3aGF0LCB3aGF0KTsKKyAgWlZBTF9MT05HKCZ6ZXJyb3Jjb2RlLCBlcnJvcmNvZGUpOwogCi0gIFpWQUxfU1RSSU5HKHp3aGF0LCB3aGF0LCAxKTsKLSAgWlZBTF9MT05HKHplcnJvcmNvZGUsIGVycm9yY29kZSk7CisgIHp2YWwgZXg7CisgIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVFByb3RvY29sRXhjZXB0aW9uIiwgJmV4LCAyLCAmendoYXQsICZ6ZXJyb3Jjb2RlKTsKIAotICB6dmFsKiBleDsKLSAgTUFLRV9TVERfWlZBTChleCk7Ci0gIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVFByb3RvY29sRXhjZXB0aW9uIiwgZXgsIDIsIHp3aGF0LCB6ZXJyb3Jjb2RlKTsKLSAgenZhbF9wdHJfZHRvcigmendoYXQpOwotICB6dmFsX3B0cl9kdG9yKCZ6ZXJyb3Jjb2RlKTsKLSAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgIHp2YWxfZHRvcigmendoYXQpOworICB6dmFsX2R0b3IoJnplcnJvcmNvZGUpOworCisgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoJmV4KTsKIH0KIAogLy8gU2V0cyBFRyhleGNlcHRpb24pLCBjYWxsIHRoaXMgYW5kIHRoZW4gUkVUVVJOX05VTEwoKTsKLXZvaWQgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCBUU1JNTFNfREMpIHsKLSAgemVuZF90aHJvd19leGNlcHRpb24oemVuZF9leGNlcHRpb25fZ2V0X2RlZmF1bHQoVFNSTUxTX0MpLCBjb25zdF9jYXN0PGNoYXIqPihleC53aGF0KCkpLCAwIFRTUk1MU19DQyk7CitzdGF0aWMKK3ZvaWQgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCkgeworICB6ZW5kX3Rocm93X2V4Y2VwdGlvbih6ZW5kX2V4Y2VwdGlvbl9nZXRfZGVmYXVsdCgpLCBjb25zdF9jYXN0PGNoYXIqPihleC53aGF0KCkpLCAwKTsKIH0KIAotCi12b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogcmV0dXJuX3ZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgewotICB6dmFsKiogdmFsX3B0cjsKLSAgWl9UWVBFX1AocmV0dXJuX3ZhbHVlKSA9IElTX05VTEw7IC8vIGp1c3QgaW4gY2FzZQotCi0gIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgewotICAgIGNhc2UgVF9TVE9QOgotICAgIGNhc2UgVF9WT0lEOgotICAgICAgUkVUVVJOX05VTEwoKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgICBpZiAoemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiY2xhc3MiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKSAhPSBTVUNDRVNTKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigibm8gY2xhc3MgdHlwZSBpbiBzcGVjIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgICAgc2tpcF9lbGVtZW50KFRfU1RSVUNULCB0cmFuc3BvcnQpOwotICAgICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgfQotICAgICAgY2hhciogc3RydWN0VHlwZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOwotICAgICAgY3JlYXRlT2JqZWN0KHN0cnVjdFR5cGUsIHJldHVybl92YWx1ZSk7Ci0gICAgICBpZiAoWl9UWVBFX1AocmV0dXJuX3ZhbHVlKSA9PSBJU19OVUxMKSB7Ci0gICAgICAgIC8vIHVuYWJsZSB0byBjcmVhdGUgY2xhc3MgZW50cnkKLSAgICAgICAgc2tpcF9lbGVtZW50KFRfU1RSVUNULCB0cmFuc3BvcnQpOwotICAgICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgfQotICAgICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeShyZXR1cm5fdmFsdWUgVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7Ci0gICAgICBpZiAoWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKLSAgICAgICAgc25wcmludGYoZXJyYnVmLCAxMjgsICJzcGVjIGZvciAlcyBpcyB3cm9uZyB0eXBlOiAlZFxuIiwgc3RydWN0VHlwZSwgWl9UWVBFX1Aoc3BlYykpOwotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotICAgICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgfQotICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwotICAgICAgcmV0dXJuOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBUX0JPT0w6IHsKLSAgICAgIHVpbnQ4X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDEpOwotICAgICAgUkVUVVJOX0JPT0woYyAhPSAwKTsKLSAgICB9Ci0gIC8vY2FzZSBUX0kwODogLy8gc2FtZSBudW1lcmljIHZhbHVlIGFzIFRfQllURQotICAgIGNhc2UgVF9CWVRFOiB7Ci0gICAgICB1aW50OF90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKLSAgICAgIFJFVFVSTl9MT05HKChpbnQ4X3QpYyk7Ci0gICAgfQotICAgIGNhc2UgVF9JMTY6IHsKLSAgICAgIHVpbnQxNl90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAyKTsKLSAgICAgIFJFVFVSTl9MT05HKChpbnQxNl90KW50b2hzKGMpKTsKLSAgICB9Ci0gICAgY2FzZSBUX0kzMjogewotICAgICAgdWludDMyX3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDQpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDMyX3QpbnRvaGwoYykpOwotICAgIH0KLSAgICBjYXNlIFRfVTY0OgotICAgIGNhc2UgVF9JNjQ6IHsKLSAgICAgIHVpbnQ2NF90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA4KTsKLSAgICAgIFJFVFVSTl9MT05HKChpbnQ2NF90KW50b2hsbChjKSk7Ci0gICAgfQotICAgIGNhc2UgVF9ET1VCTEU6IHsKLSAgICAgIHVuaW9uIHsKLSAgICAgICAgdWludDY0X3QgYzsKLSAgICAgICAgZG91YmxlIGQ7Ci0gICAgICB9IGE7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCYoYS5jKSwgOCk7Ci0gICAgICBhLmMgPSBudG9obGwoYS5jKTsKLSAgICAgIFJFVFVSTl9ET1VCTEUoYS5kKTsKLSAgICB9Ci0gICAgLy9jYXNlIFRfVVRGNzogLy8gYWxpYXNlcyBUX1NUUklORwotICAgIGNhc2UgVF9VVEY4OgotICAgIGNhc2UgVF9VVEYxNjoKLSAgICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKLSAgICAgIGlmIChzaXplKSB7Ci0gICAgICAgIGNoYXIqIHN0cmJ1ZiA9IChjaGFyKikgZW1hbGxvYyhzaXplICsgMSk7Ci0gICAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoc3RyYnVmLCBzaXplKTsKLSAgICAgICAgc3RyYnVmW3NpemVdID0gJ1wwJzsKLSAgICAgICAgWlZBTF9TVFJJTkdMKHJldHVybl92YWx1ZSwgc3RyYnVmLCBzaXplLCAwKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFpWQUxfRU1QVFlfU1RSSU5HKHJldHVybl92YWx1ZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgVF9NQVA6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IHZhbHVlCi0gICAgICB1aW50OF90IHR5cGVzWzJdOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcyh0eXBlcywgMik7Ci0gICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKLSAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAia2V5IiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZhbCIsIDQsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7Ci0KLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCAqdmFsdWU7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwodmFsdWUpOwotCi0gICAgICAgIHp2YWwqIGtleTsKLSAgICAgICAgTUFLRV9TVERfWlZBTChrZXkpOwotCi0gICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlc1swXSwgdHJhbnNwb3J0LCBrZXksIGtleXNwZWMpOwotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMV0sIHRyYW5zcG9ydCwgdmFsdWUsIHZhbHNwZWMpOwotICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSA9PSBJU19MT05HKSB7Ci0gICAgICAgICAgemVuZF9oYXNoX2luZGV4X3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX0xWQUxfUChrZXkpLCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKGtleSk7Ci0gICAgICAgICAgemVuZF9oYXNoX3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX1NUUlZBTF9QKGtleSksIFpfU1RSTEVOX1Aoa2V5KSArIDEsICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIHp2YWxfcHRyX2R0b3IoJmtleSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47IC8vIHJldHVybl92YWx1ZSBhbHJlYWR5IHBvcHVsYXRlZAotICAgIH0KLSAgICBjYXNlIFRfTElTVDogeyAvLyBhcnJheSB3aXRoIGF1dG9nZW5lcmF0ZWQgbnVtZXJpYyBrZXlzCi0gICAgICBpbnQ4X3QgdHlwZSA9IHRyYW5zcG9ydC5yZWFkSTgoKTsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotCi0gICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7Ci0gICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7Ci0gICAgICAgIHp2YWwgKnZhbHVlOwotICAgICAgICBNQUtFX1NURF9aVkFMKHZhbHVlKTsKLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwgdmFsdWUsIGVsZW1zcGVjKTsKLSAgICAgICAgemVuZF9oYXNoX25leHRfaW5kZXhfaW5zZXJ0KHJldHVybl92YWx1ZS0+dmFsdWUuaHQsICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIFRfU0VUOiB7IC8vIGFycmF5IG9mIGtleSAtPiBUUlVFCi0gICAgICB1aW50OF90IHR5cGU7Ci0gICAgICB1aW50MzJfdCBzaXplOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmdHlwZSwgMSk7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZzaXplLCA0KTsKLSAgICAgIHNpemUgPSBudG9obChzaXplKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImVsZW0iLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSogZWxlbXNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOwotCi0gICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7Ci0gICAgICAgIHp2YWwqIGtleTsKLSAgICAgICAgenZhbCogdmFsdWU7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwoa2V5KTsKLSAgICAgICAgTUFLRV9TVERfWlZBTCh2YWx1ZSk7Ci0gICAgICAgIFpWQUxfVFJVRSh2YWx1ZSk7Ci0KLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwga2V5LCBlbGVtc3BlYyk7Ci0KLSAgICAgICAgaWYgKFpfVFlQRV9QKGtleSkgPT0gSVNfTE9ORykgewotICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgWl9MVkFMX1Aoa2V5KSwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKFpfVFlQRV9QKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZyhrZXkpOwotICAgICAgICAgIHplbmRfaGFzaF91cGRhdGUocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgWl9TVFJWQUxfUChrZXkpLCBaX1NUUkxFTl9QKGtleSkgKyAxLCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICB6dmFsX3B0cl9kdG9yKCZrZXkpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfTsKLQotICBjaGFyIGVycmJ1ZlsxMjhdOwotICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOwotICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotfQotCitzdGF0aWMKIHZvaWQgc2tpcF9lbGVtZW50KGxvbmcgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCkgewogICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKICAgICBjYXNlIFRfU1RPUDoKQEAgLTY1OCwxMDEgKzUwNSw0NzIgQEAKICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKIH0KIAotdm9pZCBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbih6dmFsKiB0cmFuc3BvcnQsIGNvbnN0IGNoYXIqIG1ldGhvZF9uYW1lLCBpbnQzMl90IG1zZ3R5cGUsIGludDMyX3Qgc2VxSUQpIHsKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHp2YWwgKmFyZ3NbM107Ci0KLSAgTUFLRV9TVERfWlZBTChhcmdzWzBdKTsKLSAgWlZBTF9TVFJJTkdMKGFyZ3NbMF0sIChjaGFyKiltZXRob2RfbmFtZSwgc3RybGVuKG1ldGhvZF9uYW1lKSwgMSk7Ci0KLSAgTUFLRV9TVERfWlZBTChhcmdzWzFdKTsKLSAgWlZBTF9MT05HKGFyZ3NbMV0sIG1zZ3R5cGUpOwotCi0gIE1BS0VfU1REX1pWQUwoYXJnc1syXSk7Ci0gIFpWQUxfTE9ORyhhcmdzWzJdLCBzZXFJRCk7Ci0KLSAgenZhbCByZXQ7Ci0gIFpWQUxfTlVMTCgmcmV0KTsKLQotICB6dmFsIHdyaXRlTWVzc2FnZWZuOwotICBaVkFMX1NUUklORygmd3JpdGVNZXNzYWdlZm4sICJ3cml0ZU1lc3NhZ2VCZWdpbiIsIDApOwotCi0gIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0cmFuc3BvcnQsICZ3cml0ZU1lc3NhZ2VmbiwgJnJldCwgMywgYXJncyBUU1JNTFNfQ0MpOwotCi0gIHp2YWxfcHRyX2R0b3IoJmFyZ3NbMF0pOwotICB6dmFsX3B0cl9kdG9yKCZhcmdzWzFdKTsKLSAgenZhbF9wdHJfZHRvcigmYXJnc1syXSk7Ci0gIHp2YWxfZHRvcigmcmV0KTsKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgenZhbF9pc19ib29sKHp2YWwqIHYpIHsKKyAgcmV0dXJuIFpfVFlQRV9QKHYpID09IElTX1RSVUUgfHwgWl9UWVBFX1AodikgPT0gSVNfRkFMU0U7CiB9CiAKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGludDhfdCBrZXl0eXBlLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBodCwgSGFzaFBvc2l0aW9uJiBodF9wb3MpIHsKK3N0YXRpYwordm9pZCBiaW5hcnlfZGVzZXJpYWxpemUoaW50OF90IHRocmlmdF90eXBlSUQsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHJldHVybl92YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpIHsKKyAgWlZBTF9OVUxMKHJldHVybl92YWx1ZSk7CisKKyAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7CisgICAgY2FzZSBUX1NUT1A6CisgICAgY2FzZSBUX1ZPSUQ6CisgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9TVFJVQ1Q6IHsKKyAgICAgIHp2YWwqIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiY2xhc3MiLCBzaXplb2YoImNsYXNzIiktMSk7CisgICAgICBpZiAodmFsX3B0ciA9PSBudWxscHRyKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigibm8gY2xhc3MgdHlwZSBpbiBzcGVjIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgc2tpcF9lbGVtZW50KFRfU1RSVUNULCB0cmFuc3BvcnQpOworICAgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgfQorCisgICAgICBjaGFyKiBzdHJ1Y3RUeXBlID0gWl9TVFJWQUxfUCh2YWxfcHRyKTsKKyAgICAgIC8vIENyZWF0ZSBhbiBvYmplY3QgaW4gUEhQIHVzZXJsYW5kIGJhc2VkIG9uIG91ciBzcGVjCisgICAgICBjcmVhdGVPYmplY3Qoc3RydWN0VHlwZSwgcmV0dXJuX3ZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUChyZXR1cm5fdmFsdWUpID09IElTX05VTEwpIHsKKyAgICAgICAgLy8gdW5hYmxlIHRvIGNyZWF0ZSBjbGFzcyBlbnRyeQorICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7CisgICAgICAgIFJFVFVSTl9OVUxMKCk7CisgICAgICB9CisKKyAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXR1cm5fdmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCBmYWxzZSk7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgfQorICAgICAgaWYgKFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICAgIGNoYXIgZXJyYnVmWzEyOF07CisgICAgICAgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAic3BlYyBmb3IgJXMgaXMgd3JvbmcgdHlwZTogJWRcbiIsIHN0cnVjdFR5cGUsIFpfVFlQRV9QKHNwZWMpKTsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgUkVUVVJOX05VTEwoKTsKKyAgICAgIH0KKyAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHJldHVybl92YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgVF9CT09MOiB7CisgICAgICB1aW50OF90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKKyAgICAgIFJFVFVSTl9CT09MKGMgIT0gMCk7CisgICAgfQorICAvL2Nhc2UgVF9JMDg6IC8vIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyBUX0JZVEUKKyAgICBjYXNlIFRfQllURTogeworICAgICAgdWludDhfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMSk7CisgICAgICBSRVRVUk5fTE9ORygoaW50OF90KWMpOworICAgIH0KKyAgICBjYXNlIFRfSTE2OiB7CisgICAgICB1aW50MTZfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMik7CisgICAgICBSRVRVUk5fTE9ORygoaW50MTZfdCludG9ocyhjKSk7CisgICAgfQorICAgIGNhc2UgVF9JMzI6IHsKKyAgICAgIHVpbnQzMl90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA0KTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQzMl90KW50b2hsKGMpKTsKKyAgICB9CisgICAgY2FzZSBUX1U2NDoKKyAgICBjYXNlIFRfSTY0OiB7CisgICAgICB1aW50NjRfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgOCk7CisgICAgICBSRVRVUk5fTE9ORygoaW50NjRfdCludG9obGwoYykpOworICAgIH0KKyAgICBjYXNlIFRfRE9VQkxFOiB7CisgICAgICB1bmlvbiB7CisgICAgICAgIHVpbnQ2NF90IGM7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgfSBhOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmKGEuYyksIDgpOworICAgICAgYS5jID0gbnRvaGxsKGEuYyk7CisgICAgICBSRVRVUk5fRE9VQkxFKGEuZCk7CisgICAgfQorICAgIC8vY2FzZSBUX1VURjc6IC8vIGFsaWFzZXMgVF9TVFJJTkcKKyAgICBjYXNlIFRfVVRGODoKKyAgICBjYXNlIFRfVVRGMTY6CisgICAgY2FzZSBUX1NUUklORzogeworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICBpZiAoc2l6ZSkgeworICAgICAgICBjaGFyIHN0cmJ1ZltzaXplKzFdOworICAgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKHN0cmJ1Ziwgc2l6ZSk7CisgICAgICAgIHN0cmJ1ZltzaXplXSA9ICdcMCc7CisgICAgICAgIFpWQUxfU1RSSU5HTChyZXR1cm5fdmFsdWUsIHN0cmJ1Ziwgc2l6ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBaVkFMX0VNUFRZX1NUUklORyhyZXR1cm5fdmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIFRfTUFQOiB7IC8vIGFycmF5IG9mIGtleSAtPiB2YWx1ZQorICAgICAgdWludDhfdCB0eXBlc1syXTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXModHlwZXMsIDIpOworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7CisKKyAgICAgIHp2YWwgKnZhbF9wdHI7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImtleSIsIHNpemVvZigia2V5IiktMSk7CisgICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YWwiLCBzaXplb2YoInZhbCIpLTEpOworICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKworICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgeworICAgICAgICB6dmFsIGtleSwgdmFsdWU7CisKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGVzWzBdLCB0cmFuc3BvcnQsICZrZXksIGtleXNwZWMpOworICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMV0sIHRyYW5zcG9ydCwgJnZhbHVlLCB2YWxzcGVjKTsKKyAgICAgICAgaWYgKFpfVFlQRShrZXkpID09IElTX0xPTkcpIHsKKyAgICAgICAgICB6ZW5kX2hhc2hfaW5kZXhfdXBkYXRlKFpfQVJSX1AocmV0dXJuX3ZhbHVlKSwgWl9MVkFMKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKFpfVFlQRShrZXkpICE9IElTX1NUUklORykgY29udmVydF90b19zdHJpbmcoJmtleSk7CisgICAgICAgICAgemVuZF9zeW10YWJsZV91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX1NUUihrZXkpLCAmdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHp2YWxfZHRvcigma2V5KTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsgLy8gcmV0dXJuX3ZhbHVlIGFscmVhZHkgcG9wdWxhdGVkCisgICAgfQorICAgIGNhc2UgVF9MSVNUOiB7IC8vIGFycmF5IHdpdGggYXV0b2dlbmVyYXRlZCBudW1lcmljIGtleXMKKyAgICAgIGludDhfdCB0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICB6dmFsICp2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImVsZW0iLCBzaXplb2YoImVsZW0iKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogZWxlbXNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7CisgICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7CisgICAgICAgIHp2YWwgdmFsdWU7CisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlLCB0cmFuc3BvcnQsICZ2YWx1ZSwgZWxlbXNwZWMpOworICAgICAgICB6ZW5kX2hhc2hfbmV4dF9pbmRleF9pbnNlcnQoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCAmdmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIFRfU0VUOiB7IC8vIGFycmF5IG9mIGtleSAtPiBUUlVFCisgICAgICB1aW50OF90IHR5cGU7CisgICAgICB1aW50MzJfdCBzaXplOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmdHlwZSwgMSk7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZzaXplLCA0KTsKKyAgICAgIHNpemUgPSBudG9obChzaXplKTsKKyAgICAgIHp2YWwgKnZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKKworICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgeworICAgICAgICB6dmFsIGtleSwgdmFsdWU7CisgICAgICAgIFpWQUxfVFJVRSgmdmFsdWUpOworCisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlLCB0cmFuc3BvcnQsICZrZXksIGVsZW1zcGVjKTsKKworICAgICAgICBpZiAoWl9UWVBFKGtleSkgPT0gSVNfTE9ORykgeworICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX0xWQUwoa2V5KSwgJnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoWl9UWVBFKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygma2V5KTsKKyAgICAgICAgICB6ZW5kX3N5bXRhYmxlX3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfU1RSKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgenZhbF9kdG9yKCZrZXkpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfTsKKworICBjaGFyIGVycmJ1ZlsxMjhdOworICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOworICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworfQorCitzdGF0aWMKK3ZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGludDhfdCBrZXl0eXBlLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBodCwgSGFzaFBvc2l0aW9uJiBodF9wb3MsIEhhc2hUYWJsZSogc3BlYykgewogICBib29sIGtleXR5cGVfaXNfbnVtZXJpYyA9ICghKChrZXl0eXBlID09IFRfU1RSSU5HKSB8fCAoa2V5dHlwZSA9PSBUX1VURjgpIHx8IChrZXl0eXBlID09IFRfVVRGMTYpKSk7CiAKLSAgY2hhcioga2V5OworICB6ZW5kX3N0cmluZyoga2V5OwogICB1aW50IGtleV9sZW47CiAgIGxvbmcgaW5kZXggPSAwOwogCi0gIHp2YWwqIHo7Ci0gIE1BS0VfU1REX1pWQUwoeik7CisgIHp2YWwgejsKIAotICBpbnQgcmVzID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChodCwgJmtleSwgJmtleV9sZW4sICh1bG9uZyopJmluZGV4LCAwLCAmaHRfcG9zKTsKLSAgaWYgKGtleXR5cGVfaXNfbnVtZXJpYykgewotICAgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7Ci0gICAgICBpbmRleCA9IHN0cnRvbChrZXksIE5VTEwsIDEwKTsKLSAgICB9Ci0gICAgWlZBTF9MT05HKHosIGluZGV4KTsKKyAgaW50IHJlcyA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoaHQsICZrZXksICh6ZW5kX3Vsb25nKikmaW5kZXgsICZodF9wb3MpOworICBpZiAocmVzID09IEhBU0hfS0VZX0lTX1NUUklORykgeworICAgIFpWQUxfU1RSX0NPUFkoJnosIGtleSk7CiAgIH0gZWxzZSB7Ci0gICAgY2hhciBidWZbNjRdOwotICAgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7Ci0gICAgICBrZXlfbGVuIC09IDE7IC8vIHNraXAgdGhlIG51bGwgdGVybWluYXRvcgotICAgIH0gZWxzZSB7Ci0gICAgICBzcHJpbnRmKGJ1ZiwgIiVsZCIsIGluZGV4KTsKLSAgICAgIGtleSA9IGJ1Zjsga2V5X2xlbiA9IHN0cmxlbihidWYpOwotICAgIH0KLSAgICBaVkFMX1NUUklOR0woeiwga2V5LCBrZXlfbGVuLCAxKTsKKyAgICBaVkFMX0xPTkcoJnosIGluZGV4KTsKICAgfQotICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgJnosIE5VTEwpOwotICB6dmFsX3B0cl9kdG9yKCZ6KTsKKyAgYmluYXJ5X3NlcmlhbGl6ZShrZXl0eXBlLCB0cmFuc3BvcnQsICZ6LCBzcGVjKTsKKyAgenZhbF9kdG9yKCZ6KTsKIH0KIAotaW5saW5lIGJvb2wgdHR5cGVfaXNfaW50KGludDhfdCB0KSB7CitzdGF0aWMKK3ZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgeworICBpZiAodmFsdWUpIHsKKyAgICBaVkFMX0RFUkVGKHZhbHVlKTsKKyAgfQorICAvLyBBdCB0aGlzIHBvaW50IHRoZSB0eXBlSUQgKGFuZCBmaWVsZCBudW0sIGlmIGFwcGxpY2FibGUpIHNob3VsZCd2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHNvIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHdyaXRlIHRoZSBwYXlsb2FkLgorICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfU1RSVUNUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX09CSkVDVCkgeworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tb2JqZWN0IHR5cGUgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFX1AodmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICAgIGlmIChzcGVjICYmIFpfVFlQRV9QKHNwZWMpID09IElTX1JFRkVSRU5DRSkgeworICAgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgfQorICAgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1UaHJpZnQgb2JqZWN0IGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOworICAgICAgfQorICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9CT09MOgorICAgICAgaWYgKCF6dmFsX2lzX2Jvb2wodmFsdWUpKSBjb252ZXJ0X3RvX2Jvb2xlYW4odmFsdWUpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9UWVBFX0lORk9fUCh2YWx1ZSkgPT0gSVNfVFJVRSA/IDEgOiAwKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfQllURToKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KFpfTFZBTF9QKHZhbHVlKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBUX0kxNjoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkxNihaX0xWQUxfUCh2YWx1ZSkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9JMzI6CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoWl9MVkFMX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfSTY0OgorICAgIGNhc2UgVF9VNjQ6IHsKKyAgICAgIGludDY0X3QgbF9kYXRhOworI2lmIGRlZmluZWQoX0xQNjQpIHx8IGRlZmluZWQoX1dJTjY0KQorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOworICAgICAgbF9kYXRhID0gWl9MVkFMX1AodmFsdWUpOworI2Vsc2UKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfRE9VQkxFKSBjb252ZXJ0X3RvX2RvdWJsZSh2YWx1ZSk7CisgICAgICBsX2RhdGEgPSAoaW50NjRfdClaX0RWQUxfUCh2YWx1ZSk7CisjZW5kaWYKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChsX2RhdGEpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICAgIHVuaW9uIHsKKyAgICAgICAgaW50NjRfdCBjOworICAgICAgICBkb3VibGUgZDsKKyAgICAgIH0gYTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfRE9VQkxFKSBjb252ZXJ0X3RvX2RvdWJsZSh2YWx1ZSk7CisgICAgICBhLmQgPSBaX0RWQUxfUCh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJNjQoYS5jKTsKKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfVVRGODoKKyAgICBjYXNlIFRfVVRGMTY6CisgICAgY2FzZSBUX1NUUklORzoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZyh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVTdHJpbmcoWl9TVFJWQUxfUCh2YWx1ZSksIFpfU1RSTEVOX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfTUFQOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTUFQKSIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUCh2YWx1ZSk7CisgICAgICB6dmFsKiB2YWxfcHRyOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImt0eXBlIiwgc2l6ZW9mKCJrdHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3Qga2V5dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZ0eXBlIiwgc2l6ZW9mKCJ2dHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3QgdmFsdHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgodmFsdHlwZSk7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgc2l6ZW9mKCJ2YWwiKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisgICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QKHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJrZXkiLCBzaXplb2YoImtleSIpLTEpKTsKKworICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKKyAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOworICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOworICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0ciwga2V5c3BlYyk7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfTElTVDogeworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSh2YWx1ZSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX0xJU1QpIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKKyAgICAgIHp2YWwqIHZhbF9wdHI7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCBzaXplb2YoImV0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgdWludDhfdCB2YWx0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKKworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSk7CisgICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfU0VUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfU0VUKSIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUCh2YWx1ZSk7CisgICAgICB6dmFsKiB2YWxfcHRyOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImV0eXBlIiwgc2l6ZW9mKCJldHlwZSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBzcGVjID0gWl9BUlJWQUxfUCh6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7CisgICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KGtleXR5cGUpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBpZih0dHlwZV9pc19zY2FsYXIoa2V5dHlwZSkpeworICAgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICAgIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShrZXl0eXBlLCB0cmFuc3BvcnQsIGh0LCBrZXlfcHRyLCBzcGVjKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOworICAgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKKyAgICAgICAgICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgdmFsX3B0ciwgc3BlYyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgfTsKKworICBjaGFyIGVycmJ1ZlsxMjhdOworICBzbnByaW50ZihlcnJidWYsIDEyOCwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOworICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworfQorCitzdGF0aWMKK3ZvaWQgcHJvdG9jb2xfd3JpdGVNZXNzYWdlQmVnaW4oenZhbCogdHJhbnNwb3J0LCB6ZW5kX3N0cmluZyogbWV0aG9kX25hbWUsIGludDMyX3QgbXNndHlwZSwgaW50MzJfdCBzZXFJRCkgeworICB6dmFsIGFyZ3NbM107CisgIHp2YWwgcmV0OworICB6dmFsIHdyaXRlTWVzc2FnZWZuOworCisgIFpWQUxfU1RSX0NPUFkoJmFyZ3NbMF0sIG1ldGhvZF9uYW1lKTsKKyAgWlZBTF9MT05HKCZhcmdzWzFdLCBtc2d0eXBlKTsKKyAgWlZBTF9MT05HKCZhcmdzWzJdLCBzZXFJRCk7CisgIFpWQUxfTlVMTCgmcmV0KTsKKyAgWlZBTF9TVFJJTkcoJndyaXRlTWVzc2FnZWZuLCAid3JpdGVNZXNzYWdlQmVnaW4iKTsKKworICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCB0cmFuc3BvcnQsICZ3cml0ZU1lc3NhZ2VmbiwgJnJldCwgMywgYXJncyk7CisKKyAgenZhbF9kdG9yKCZ3cml0ZU1lc3NhZ2Vmbik7CisgIHp2YWxfZHRvcigmYXJnc1syXSk7IHp2YWxfZHRvcigmYXJnc1sxXSk7IHp2YWxfZHRvcigmYXJnc1swXSk7CisgIHp2YWxfZHRvcigmcmV0KTsKKyAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfaW50KGludDhfdCB0KSB7CiAgIHJldHVybiAoKHQgPT0gVF9CWVRFKSB8fCAoKHQgPj0gVF9JMTYpICAmJiAodCA8PSBUX0k2NCkpKTsKIH0KK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfc2NhbGFyKGludDhfdCB0KSB7CisgIHJldHVybiAhKCh0ID09IFRfU1RSVUNUKSB8fCAoIHQ9PSBUX01BUCkgIHx8ICh0ID09IFRfU0VUKSB8fCAodCA9PSBUX0xJU1QpKTsKK30KIAotaW5saW5lIGJvb2wgdHR5cGVzX2FyZV9jb21wYXRpYmxlKGludDhfdCB0MSwgaW50OF90IHQyKSB7CitzdGF0aWMgaW5saW5lCitib29sIHR0eXBlc19hcmVfY29tcGF0aWJsZShpbnQ4X3QgdDEsIGludDhfdCB0MikgewogICAvLyBJbnRlZ2VyIHR5cGVzIG9mIGRpZmZlcmVudCB3aWR0aHMgYXJlIGNvbnNpZGVyZWQgY29tcGF0aWJsZTsKICAgLy8gb3RoZXJ3aXNlIHRoZSB0eXBlSUQgbXVzdCBtYXRjaC4KICAgcmV0dXJuICgodDEgPT0gdDIpIHx8ICh0dHlwZV9pc19pbnQodDEpICYmIHR0eXBlX2lzX2ludCh0MikpKTsKIH0KIAorLy9pcyB1c2VkIHRvIHZhbGlkYXRlIG9iamVjdHMgYmVmb3JlIHNlcmlhbGl6YXRpb24gYW5kIGFmdGVyIGRlc2VyaWFsaXphdGlvbi4gRm9yIG5vdywgb25seSByZXF1aXJlZCBmaWVsZHMgYXJlIHZhbGlkYXRlZC4KK3N0YXRpYwordm9pZCB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp2YWwqIG9iamVjdCkgeworICAgIHplbmRfY2xhc3NfZW50cnkqIG9iamVjdF9jbGFzc19lbnRyeSA9IFpfT0JKQ0VfUChvYmplY3QpOworICAgIHp2YWwqIGlzX3ZhbGlkYXRlID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShvYmplY3RfY2xhc3NfZW50cnksICJpc1ZhbGlkYXRlIiwgc2l6ZW9mKCJpc1ZhbGlkYXRlIiktMSwgdHJ1ZSk7CisgICAgaWYgKGlzX3ZhbGlkYXRlKSB7CisgICAgICBaVkFMX0RFUkVGKGlzX3ZhbGlkYXRlKTsKKyAgICB9CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkob2JqZWN0X2NsYXNzX2VudHJ5LCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICBpZiAoc3BlYykgeworICAgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICB9CisgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgenZhbCogdmFsX3B0cjsKKworICAgIGlmIChpc192YWxpZGF0ZSAmJiBaX1RZUEVfSU5GT19QKGlzX3ZhbGlkYXRlKSA9PSBJU19UUlVFKSB7CisgICAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoWl9BUlJWQUxfUChzcGVjKSwgJmtleV9wdHIpOworICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KFpfQVJSVkFMX1Aoc3BlYyksICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChaX0FSUlZBTF9QKHNwZWMpLCAma2V5X3B0cikpIHsKKworICAgICAgICAgICAgemVuZF91bG9uZyBmaWVsZG5vOworICAgICAgICAgICAgaWYgKHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoWl9BUlJWQUxfUChzcGVjKSwgbnVsbHB0ciwgJmZpZWxkbm8sICZrZXlfcHRyKSAhPSBIQVNIX0tFWV9JU19MT05HKSB7CisgICAgICAgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQmFkIGtleXR5cGUgaW4gVFNQRUMgKGV4cGVjdGVkICdsb25nJykiLCBJTlZBTElEX0RBVEEpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgICAgICAgIC8vIGZpZWxkIG5hbWUKKyAgICAgICAgICAgIHp2YWwqIHp2YXJuYW1lID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZhciIsIHNpemVvZigidmFyIiktMSk7CisgICAgICAgICAgICBjaGFyKiB2YXJuYW1lID0gWl9TVFJWQUxfUCh6dmFybmFtZSk7CisKKyAgICAgICAgICAgIHp2YWwqIGlzX3JlcXVpcmVkID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImlzUmVxdWlyZWQiLCBzaXplb2YoImlzUmVxdWlyZWQiKS0xKTsKKyAgICAgICAgICAgIHp2YWwgcnY7CisgICAgICAgICAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KG9iamVjdF9jbGFzc19lbnRyeSwgb2JqZWN0LCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlLCAmcnYpOworCisgICAgICAgICAgICBpZiAoWl9UWVBFX0lORk9fUChpc19yZXF1aXJlZCkgPT0gSVNfVFJVRSAmJiBaX1RZUEVfUChwcm9wKSA9PSBJU19OVUxMKSB7CisgICAgICAgICAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihlcnJidWYsIDEyOCwgIlJlcXVpcmVkIGZpZWxkICVzLiVzIGlzIHVuc2V0ISIsIFpTVFJfVkFMKG9iamVjdF9jbGFzc19lbnRyeS0+bmFtZSksIHZhcm5hbWUpOworICAgICAgICAgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYwogdm9pZCBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyh6dmFsKiB6dGhpcywgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBzcGVjKSB7CiAgIC8vIFNFVCBhbmQgTElTVCBoYXZlICdlbGVtJyA9PiBhcnJheSgndHlwZScsIFtvcHRpb25hbF0gJ2NsYXNzJykKICAgLy8gTUFQIGhhcyAndmFsJyA9PiBhcnJheSgndHlwZScsIFtvcHRpb25hXSAnY2xhc3MnKQotICBUU1JNTFNfRkVUQ0goKTsKLSAgemVuZF9jbGFzc19lbnRyeSogY2UgPSB6ZW5kX2dldF9jbGFzc19lbnRyeSh6dGhpcyBUU1JNTFNfQ0MpOworICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IFpfT0JKQ0VfUCh6dGhpcyk7CiAgIHdoaWxlICh0cnVlKSB7Ci0gICAgenZhbCoqIHZhbF9wdHIgPSBOVUxMOwotCiAgICAgaW50OF90IHR0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOwotICAgIGlmICh0dHlwZSA9PSBUX1NUT1ApIHJldHVybjsKKyAgICBpZiAodHR5cGUgPT0gVF9TVE9QKSB7CisgICAgICB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp0aGlzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpbnQxNl90IGZpZWxkbm8gPSB0cmFuc3BvcnQucmVhZEkxNigpOwotICAgIGlmICh6ZW5kX2hhc2hfaW5kZXhfZmluZChzcGVjLCBmaWVsZG5vLCAodm9pZCoqKSZ2YWxfcHRyKSA9PSBTVUNDRVNTKSB7Ci0gICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOworICAgIHp2YWwqIHZhbF9wdHIgPSB6ZW5kX2hhc2hfaW5kZXhfZmluZChzcGVjLCBmaWVsZG5vKTsKKyAgICBpZiAodmFsX3B0ciAhPSBudWxscHRyKSB7CisgICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CiAgICAgICAvLyBwdWxsIHRoZSBmaWVsZCBuYW1lCi0gICAgICAvLyB6ZW5kIGhhc2ggdGFibGVzIHVzZSB0aGUgbnVsbCBhdCB0aGUgZW5kIGluIHRoZSBsZW5ndGguLi4gc28gc3RybGVuKGhhc2gga2V5KSArIDEuCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJ2YXIiLCA0LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QUCh2YWxfcHRyKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QKHZhbF9wdHIpOwogCiAgICAgICAvLyBhbmQgdGhlIHR5cGUKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInR5cGUiLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIGludDhfdCBleHBlY3RlZF90dHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIHNpemVvZigidHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIGludDhfdCBleHBlY3RlZF90dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOwogCiAgICAgICBpZiAodHR5cGVzX2FyZV9jb21wYXRpYmxlKHR0eXBlLCBleHBlY3RlZF90dHlwZSkpIHsKLSAgICAgICAgenZhbCogcnYgPSBOVUxMOwotICAgICAgICBNQUtFX1NURF9aVkFMKHJ2KTsKLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsIHJ2LCBmaWVsZHNwZWMpOwotICAgICAgICB6ZW5kX3VwZGF0ZV9wcm9wZXJ0eShjZSwgenRoaXMsIHZhcm5hbWUsIHN0cmxlbih2YXJuYW1lKSwgcnYgVFNSTUxTX0NDKTsKKyAgICAgICAgenZhbCBydjsKKyAgICAgICAgWlZBTF9VTkRFRigmcnYpOworCisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0dHlwZSwgdHJhbnNwb3J0LCAmcnYsIGZpZWxkc3BlYyk7CisgICAgICAgIHplbmRfdXBkYXRlX3Byb3BlcnR5KGNlLCB6dGhpcywgdmFybmFtZSwgc3RybGVuKHZhcm5hbWUpLCAmcnYpOworCiAgICAgICAgIHp2YWxfcHRyX2R0b3IoJnJ2KTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNraXBfZWxlbWVudCh0dHlwZSwgdHJhbnNwb3J0KTsKQEAgLTc2MywxNzEgKzk4MSw0NCBAQAogICB9CiB9CiAKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqKiB2YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpIHsKLSAgLy8gQXQgdGhpcyBwb2ludCB0aGUgdHlwZUlEIChhbmQgZmllbGQgbnVtLCBpZiBhcHBsaWNhYmxlKSBzaG91bGQndmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzbyBhbGwgd2UgbmVlZCB0byBkbyBpcyB3cml0ZSB0aGUgcGF5bG9hZC4KLSAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7Ci0gICAgY2FzZSBUX1NUT1A6Ci0gICAgY2FzZSBUX1ZPSUQ6Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX1NUUlVDVDogewotICAgICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19PQkpFQ1QpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLW9iamVjdCB0eXBlIGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkoKnZhbHVlIFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgICAgaWYgKFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1UaHJpZnQgb2JqZWN0IGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKCp2YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfQk9PTDoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0JPT0wpIGNvbnZlcnRfdG9fYm9vbGVhbigqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9CVkFMX1BQKHZhbHVlKSA/IDEgOiAwKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfQllURToKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9MVkFMX1BQKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX0kxNjoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KFpfTFZBTF9QUCh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9JMzI6Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbHVlKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMihaX0xWQUxfUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfSTY0OgotICAgIGNhc2UgVF9VNjQ6IHsKLSAgICAgIGludDY0X3QgbF9kYXRhOwotI2lmIGRlZmluZWQoX0xQNjQpIHx8IGRlZmluZWQoX1dJTjY0KQotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWx1ZSk7Ci0gICAgICBsX2RhdGEgPSBaX0xWQUxfUFAodmFsdWUpOwotI2Vsc2UKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0RPVUJMRSkgY29udmVydF90b19kb3VibGUoKnZhbHVlKTsKLSAgICAgIGxfZGF0YSA9IChpbnQ2NF90KVpfRFZBTF9QUCh2YWx1ZSk7Ci0jZW5kaWYKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChsX2RhdGEpOwotICAgIH0gcmV0dXJuOwotICAgIGNhc2UgVF9ET1VCTEU6IHsKLSAgICAgIHVuaW9uIHsKLSAgICAgICAgaW50NjRfdCBjOwotICAgICAgICBkb3VibGUgZDsKLSAgICAgIH0gYTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0RPVUJMRSkgY29udmVydF90b19kb3VibGUoKnZhbHVlKTsKLSAgICAgIGEuZCA9IFpfRFZBTF9QUCh2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJNjQoYS5jKTsKLSAgICB9IHJldHVybjsKLSAgICAvL2Nhc2UgVF9VVEY3OgotICAgIGNhc2UgVF9VVEY4OgotICAgIGNhc2UgVF9VVEYxNjoKLSAgICBjYXNlIFRfU1RSSU5HOgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlU3RyaW5nKFpfU1RSVkFMX1BQKHZhbHVlKSwgWl9TVFJMRU5fUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfTUFQOiB7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSgqdmFsdWUpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTUFQKSIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUFAodmFsdWUpOwotICAgICAgenZhbCoqIHZhbF9wdHI7Ci0KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImt0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChrZXl0eXBlKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZ0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IHZhbHR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0cik7Ci0gICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKLSAgICAgIH0KLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfTElTVDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX0xJU1QpIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QUCh2YWx1ZSk7Ci0gICAgICB6dmFsKiogdmFsX3B0cjsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIHVpbnQ4X3QgdmFsdHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgNSwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplKHZhbHR5cGUsIHRyYW5zcG9ydCwgdmFsX3B0ciwgdmFsc3BlYyk7Ci0gICAgICB9Ci0gICAgfSByZXR1cm47Ci0gICAgY2FzZSBUX1NFVDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX1NFVCkiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1BQKHZhbHVlKTsKLSAgICAgIHp2YWwqKiB2YWxfcHRyOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJldHlwZSIsIDYsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgdWludDhfdCBrZXl0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7Ci0KLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7Ci0gICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICh2b2lkKiopJnZhbF9wdHIsICZrZXlfcHRyKSA9PSBTVUNDRVNTOyB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKLSAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGtleXR5cGUsIHRyYW5zcG9ydCwgaHQsIGtleV9wdHIpOwotICAgICAgfQotICAgIH0gcmV0dXJuOwotICB9OwotICBjaGFyIGVycmJ1ZlsxMjhdOwotICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOwotICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotfQotCi0KK3N0YXRpYwogdm9pZCBiaW5hcnlfc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpIHsKKworICB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp0aGlzKTsKKwogICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgenZhbCoqIHZhbF9wdHI7CisgIHp2YWwqIHZhbF9wdHI7CiAKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9nZXRfY2xhc3NfZW50cnkoenRoaXMgVFNSTUxTX0NDKTsKKyAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChzcGVjLCAma2V5X3B0cik7CisgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChzcGVjLCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChzcGVjLCAma2V5X3B0cikpIHsKIAotICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KHNwZWMsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoc3BlYywgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoc3BlYywgJmtleV9wdHIpKSB7Ci0gICAgdWxvbmcgZmllbGRubzsKLSAgICBpZiAoemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChzcGVjLCBOVUxMLCBOVUxMLCAmZmllbGRubywgMCwgJmtleV9wdHIpICE9IEhBU0hfS0VZX0lTX0xPTkcpIHsKKyAgICB6ZW5kX3Vsb25nIGZpZWxkbm87CisgICAgaWYgKHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoc3BlYywgbnVsbHB0ciwgJmZpZWxkbm8sICZrZXlfcHRyKSAhPSBIQVNIX0tFWV9JU19MT05HKSB7CiAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkJhZCBrZXl0eXBlIGluIFRTUEVDIChleHBlY3RlZCAnbG9uZycpIiwgSU5WQUxJRF9EQVRBKTsKICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgSGFzaFRhYmxlKiBmaWVsZHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKKyAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CiAKICAgICAvLyBmaWVsZCBuYW1lCi0gICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOworICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICBjaGFyKiB2YXJuYW1lID0gWl9TVFJWQUxfUCh2YWxfcHRyKTsKIAogICAgIC8vIHRocmlmdCB0eXBlCi0gICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICBpbnQ4X3QgdHR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7CisgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ0eXBlIiwgc2l6ZW9mKCJ0eXBlIiktMSk7CisgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICBpbnQ4X3QgdHR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKIAotICAgIHp2YWwqIHByb3AgPSB6ZW5kX3JlYWRfcHJvcGVydHkoY2UsIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlIFRTUk1MU19DQyk7CisgICAgenZhbCBydjsKKyAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KFpfT0JKQ0VfUCh6dGhpcyksIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlLCAmcnYpOworCisgICAgaWYgKFpfVFlQRV9QKHByb3ApID09IElTX1JFRkVSRU5DRSl7CisgICAgICBaVkFMX0RFUkVGKHByb3ApOworICAgIH0KICAgICBpZiAoWl9UWVBFX1AocHJvcCkgIT0gSVNfTlVMTCkgewogICAgICAgdHJhbnNwb3J0LndyaXRlSTgodHR5cGUpOwogICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KGZpZWxkbm8pOwotICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh0dHlwZSwgdHJhbnNwb3J0LCAmcHJvcCwgZmllbGRzcGVjKTsKKyAgICAgIGJpbmFyeV9zZXJpYWxpemUodHR5cGUsIHRyYW5zcG9ydCwgcHJvcCwgZmllbGRzcGVjKTsKICAgICB9CiAgIH0KICAgdHJhbnNwb3J0LndyaXRlSTgoVF9TVE9QKTsgLy8gc3RydWN0IGVuZApAQCAtOTM1LDkzICsxMDI2LDU5IEBACiAKIC8vIDYgcGFyYW1zOiAkdHJhbnNwb3J0ICRtZXRob2RfbmFtZSAkdHR5cGUgJHJlcXVlc3Rfc3RydWN0ICRzZXFJRCAkc3RyaWN0X3dyaXRlCiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSkgewotICBpbnQgYXJnYyA9IFpFTkRfTlVNX0FSR1MoKTsKLSAgaWYgKGFyZ2MgPCA2KSB7Ci0gICAgV1JPTkdfUEFSQU1fQ09VTlQ7CisgIHp2YWwgKnByb3RvY29sOworICB6dmFsICpyZXF1ZXN0X3N0cnVjdDsKKyAgemVuZF9zdHJpbmcgKm1ldGhvZF9uYW1lOworICBsb25nIG1zZ3R5cGUsIHNlcUlEOworICB6ZW5kX2Jvb2wgc3RyaWN0X3dyaXRlOworCisgIGlmICh6ZW5kX3BhcnNlX3BhcmFtZXRlcnNfZXgoWkVORF9QQVJTRV9QQVJBTVNfUVVJRVQsIFpFTkRfTlVNX0FSR1MoKSwgIm9TbG9sYiIsCisgICAgJnByb3RvY29sLCAmbWV0aG9kX25hbWUsICZtc2d0eXBlLAorICAgICZyZXF1ZXN0X3N0cnVjdCwgJnNlcUlELCAmc3RyaWN0X3dyaXRlKSA9PSBGQUlMVVJFKSB7CisgICAgICByZXR1cm47CiAgIH0KIAotICB6dmFsICoqKmFyZ3MgPSAoenZhbCoqKikgZW1hbGxvYyhhcmdjICogc2l6ZW9mKHp2YWwqKikpOwotICB6ZW5kX2dldF9wYXJhbWV0ZXJzX2FycmF5X2V4KGFyZ2MsIGFyZ3MpOwotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1swXSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjFzdCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCAodHJhbnNwb3J0KSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotICBpZiAoWl9UWVBFX1BQKGFyZ3NbMV0pICE9IElTX1NUUklORykgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICIybmQgcGFyYW1ldGVyIGlzIG5vdCBhIHN0cmluZyAobWV0aG9kIG5hbWUpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1szXSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjR0aCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCAocmVxdWVzdCBzdHJ1Y3QpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0KICAgdHJ5IHsKLSAgICBQSFBPdXRwdXRUcmFuc3BvcnQgdHJhbnNwb3J0KCphcmdzWzBdKTsKLSAgICB6dmFsICpwcm90b2NvbCA9ICphcmdzWzBdOwotICAgIGNvbnN0IGNoYXIqIG1ldGhvZF9uYW1lID0gWl9TVFJWQUxfUFAoYXJnc1sxXSk7Ci0gICAgY29udmVydF90b19sb25nKCphcmdzWzJdKTsKLSAgICBpbnQzMl90IG1zZ3R5cGUgPSBaX0xWQUxfUFAoYXJnc1syXSk7Ci0gICAgenZhbCogcmVxdWVzdF9zdHJ1Y3QgPSAqYXJnc1szXTsKLSAgICBjb252ZXJ0X3RvX2xvbmcoKmFyZ3NbNF0pOwotICAgIGludDMyX3Qgc2VxSUQgPSBaX0xWQUxfUFAoYXJnc1s0XSk7Ci0gICAgY29udmVydF90b19ib29sZWFuKCphcmdzWzVdKTsKLSAgICBib29sIHN0cmljdFdyaXRlID0gWl9CVkFMX1BQKGFyZ3NbNV0pOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIGFyZ3MgPSBOVUxMOwotICAgIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHByb3RvY29sLCBtZXRob2RfbmFtZSwgbXNndHlwZSwgc2VxSUQpOwotICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KHJlcXVlc3Rfc3RydWN0IFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgIGlmIChaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tVGhyaWZ0IG9iamVjdCIsIElOVkFMSURfREFUQSk7CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJlcXVlc3Rfc3RydWN0KSwgIl9UU1BFQyIsIHNpemVvZigiX1RTUEVDIiktMSwgdHJ1ZSk7CisgICAgaWYgKHNwZWMpIHsKKyAgICAgIFpWQUxfREVSRUYoc3BlYyk7CiAgICAgfQorCisgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgc2VyaWFsaXplIGZyb20gbm9uLVRocmlmdCBvYmplY3QiLCBJTlZBTElEX0RBVEEpOworICAgIH0KKworICAgIFBIUE91dHB1dFRyYW5zcG9ydCB0cmFuc3BvcnQocHJvdG9jb2wpOworICAgIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHByb3RvY29sLCBtZXRob2RfbmFtZSwgKGludDMyX3QpIG1zZ3R5cGUsIChpbnQzMl90KSBzZXFJRCk7CiAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHJlcXVlc3Rfc3RydWN0LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwogICAgIHRyYW5zcG9ydC5mbHVzaCgpOworCiAgIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7Ci0gICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KGV4IFRTUk1MU19DQyk7CisgICAgLy8gZXggd2lsbCBiZSBkZXN0cnVjdGVkLCBzbyBjb3B5IHRvIGEgenZhbCB0aGF0IHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCBjYW4gdGFrZSBvd25lcnNoaXAgb2YKKyAgICB6dmFsIG15ZXg7CisgICAgWlZBTF9DT1BZKCZteWV4LCBleCk7CisgICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KCZteWV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKLSAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXggVFNSTUxTX0NDKTsKKyAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOwogICAgIFJFVFVSTl9OVUxMKCk7CiAgIH0KIH0KIAotLy8gMyBwYXJhbXM6ICR0cmFuc3BvcnQgJHJlc3BvbnNlX1R5cGVuYW1lICRzdHJpY3RfcmVhZAorCisvLyA0IHBhcmFtczogJHRyYW5zcG9ydCAkcmVzcG9uc2VfVHlwZW5hbWUgJHN0cmljdF9yZWFkICRidWZmZXJfc2l6ZQogUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSkgewotICBpbnQgYXJnYyA9IFpFTkRfTlVNX0FSR1MoKTsKKyAgenZhbCAqcHJvdG9jb2w7CisgIHplbmRfc3RyaW5nICpvYmpfdHlwZW5hbWU7CisgIHplbmRfYm9vbCBzdHJpY3RfcmVhZDsKKyAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gODE5MjsKIAotICBpZiAoYXJnYyA8IDMpIHsKLSAgICBXUk9OR19QQVJBTV9DT1VOVDsKLSAgfQotCi0gIHp2YWwgKioqYXJncyA9ICh6dmFsKioqKSBlbWFsbG9jKGFyZ2MgKiBzaXplb2YoenZhbCoqKSk7Ci0gIHplbmRfZ2V0X3BhcmFtZXRlcnNfYXJyYXlfZXgoYXJnYywgYXJncyk7Ci0KLSAgaWYgKFpfVFlQRV9QUChhcmdzWzBdKSAhPSBJU19PQkpFQ1QpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiMXN0IHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0ICh0cmFuc3BvcnQpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1sxXSkgIT0gSVNfU1RSSU5HKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjJuZCBwYXJhbWV0ZXIgaXMgbm90IGEgc3RyaW5nICh0eXBlbmFtZSBvZiBleHBlY3RlZCByZXNwb25zZSBzdHJ1Y3QpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKKyAgaWYgKHplbmRfcGFyc2VfcGFyYW1ldGVycyhaRU5EX05VTV9BUkdTKCksICJvU2J8bCIsICZwcm90b2NvbCwgJm9ial90eXBlbmFtZSwgJnN0cmljdF9yZWFkLCAmYnVmZmVyX3NpemUpID09IEZBSUxVUkUpIHsKKyAgICByZXR1cm47CiAgIH0KIAogICB0cnkgewotICAgIFBIUElucHV0VHJhbnNwb3J0IHRyYW5zcG9ydCgqYXJnc1swXSk7Ci0gICAgY2hhciogb2JqX3R5cGVuYW1lID0gWl9TVFJWQUxfUFAoYXJnc1sxXSk7Ci0gICAgY29udmVydF90b19ib29sZWFuKCphcmdzWzJdKTsKLSAgICBib29sIHN0cmljdF9yZWFkID0gWl9CVkFMX1BQKGFyZ3NbMl0pOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIGFyZ3MgPSBOVUxMOwotCisgICAgUEhQSW5wdXRUcmFuc3BvcnQgdHJhbnNwb3J0KHByb3RvY29sLCBidWZmZXJfc2l6ZSk7CiAgICAgaW50OF90IG1lc3NhZ2VUeXBlID0gMDsKICAgICBpbnQzMl90IHN6ID0gdHJhbnNwb3J0LnJlYWRJMzIoKTsKIApAQCAtMTA0NywyMyArMTEwNCw2OSBAQAogICAgIH0KIAogICAgIGlmIChtZXNzYWdlVHlwZSA9PSBUX0VYQ0VQVElPTikgewotICAgICAgenZhbCogZXg7Ci0gICAgICBNQUtFX1NURF9aVkFMKGV4KTsKLSAgICAgIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgZXgpOwotICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkoZXggVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7Ci0gICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhleCwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKLSAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgenZhbCBleDsKKyAgICAgIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgJmV4KTsKKyAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0UoZXgpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFBTRUMiKS0xLCBmYWxzZSk7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgfQorICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMoJmV4LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcigmZXgpOwogICAgIH0KIAotICAgIGNyZWF0ZU9iamVjdChvYmpfdHlwZW5hbWUsIHJldHVybl92YWx1ZSk7Ci0gICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkocmV0dXJuX3ZhbHVlIFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOworICAgIGNyZWF0ZU9iamVjdChaU1RSX1ZBTChvYmpfdHlwZW5hbWUpLCByZXR1cm5fdmFsdWUpOworICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXR1cm5fdmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICBpZiAoc3BlYykgeworICAgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICB9CisgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgZGVzZXJpYWxpemUgdG8gbm9uLVRocmlmdCBvYmplY3QiLCBJTlZBTElEX0RBVEEpOworICAgIH0KICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhyZXR1cm5fdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CiAgIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7Ci0gICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KGV4IFRTUk1MU19DQyk7CisgICAgLy8gZXggd2lsbCBiZSBkZXN0cnVjdGVkLCBzbyBjb3B5IHRvIGEgenZhbCB0aGF0IHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCBjYW4gb3duZXJzaGlwIG9mCisgICAgenZhbCBteWV4OworICAgIFpWQUxfQ09QWSgmbXlleCwgZXgpOworICAgIHp2YWxfZHRvcihyZXR1cm5fdmFsdWUpOworICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCgmbXlleCk7CiAgICAgUkVUVVJOX05VTEwoKTsKICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4KSB7Ci0gICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4IFRTUk1MU19DQyk7CisgICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9CiB9CiAKKy8vIDQgcGFyYW1zOiAkdHJhbnNwb3J0ICRyZXNwb25zZV9UeXBlbmFtZSAkc3RyaWN0X3JlYWQgJGJ1ZmZlcl9zaXplCitQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4pIHsKKyAgenZhbCAqcHJvdG9jb2w7CisgIHplbmRfc3RyaW5nICpvYmpfdHlwZW5hbWU7CisgIHplbmRfYm9vbCBzdHJpY3RfcmVhZDsKKyAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gODE5MjsKKworICBpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJzKFpFTkRfTlVNX0FSR1MoKSwgIm9TYnxsIiwgJnByb3RvY29sLCAmb2JqX3R5cGVuYW1lLCAmc3RyaWN0X3JlYWQsICZidWZmZXJfc2l6ZSkgPT0gRkFJTFVSRSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRyeSB7CisgICAgUEhQSW5wdXRUcmFuc3BvcnQgdHJhbnNwb3J0KHByb3RvY29sLCBidWZmZXJfc2l6ZSk7CisKKyAgICBjcmVhdGVPYmplY3QoWlNUUl9WQUwob2JqX3R5cGVuYW1lKSwgcmV0dXJuX3ZhbHVlKTsKKyAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFX1AocmV0dXJuX3ZhbHVlKSwgIl9UU1BFQyIsIHNpemVvZigiX1RTUEVDIiktMSwgZmFsc2UpOworICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICB9IGNhdGNoIChjb25zdCBQSFBFeGNlcHRpb25XcmFwcGVyJiBleCkgeworICAgIC8vIGV4IHdpbGwgYmUgZGVzdHJ1Y3RlZCwgc28gY29weSB0byBhIHp2YWwgdGhhdCB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QgY2FuIHRha2Ugb3duZXJzaGlwIG9mCisgICAgenZhbCBteWV4OworICAgIFpWQUxfQ09QWSgmbXlleCwgZXgpOworICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCgmbXlleCk7CisgICAgUkVUVVJOX05VTEwoKTsKKyAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4KSB7CisgICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4KTsKKyAgICBSRVRVUk5fTlVMTCgpOworICB9Cit9CisKKyNlbmRpZiAvKiBQSFBfVkVSU0lPTl9JRCA+PSA3MDAwMCAqLwpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmggYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaAppbmRleCA0NGQwM2NjLi4wNDIwOTk3IDEwMDY0NAotLS0gYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaAorKysgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaApAQCAtMjEsNiArMjEsNyBAQAogCiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSk7CiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KTsKK1BIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbik7CiAKIGV4dGVybiB6ZW5kX21vZHVsZV9lbnRyeSB0aHJpZnRfcHJvdG9jb2xfbW9kdWxlX2VudHJ5OwogI2RlZmluZSBwaHBleHRfdGhyaWZ0X3Byb3RvY29sX3B0ciAmdGhyaWZ0X3Byb3RvY29sX21vZHVsZV9lbnRyeQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L0ZpeHR1cmVzLnBocCBiL2xpYi9waHAvdGVzdC9GaXh0dXJlcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1N2Q4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9GaXh0dXJlcy5waHAKQEAgLTAsMCArMSwxOTQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnQ7CisKK3VzZSBUaHJpZnRUZXN0XFh0cnVjdDsKK3VzZSBUaHJpZnRUZXN0XFh0cnVjdDI7Cit1c2UgVGhyaWZ0VGVzdFxOdW1iZXJ6OwordXNlIFRocmlmdFRlc3RcSW5zYW5pdHk7CisKK2NsYXNzIEZpeHR1cmVzCit7CisgICAgcHVibGljIHN0YXRpYyAkYnVmc2l6ZSA9IDgxOTI7IC8vYmlnIGVub3VnaCB0byByZWFkIGJpZ2dlc3Qgc2VyaWFsaXplZCBGaXh0dXJlIGFyZy4KKyAgICBwdWJsaWMgc3RhdGljICR0ZXN0QXJncyA9IGFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3MoKQorICAgIHsKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXSA9CisgICAgICAgICAgICAicXVvdGU6IFxcXCIgYmFja3NsYXNoOiIgLgorICAgICAgICAgICAgIiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXFwvICIgLgorICAgICAgICAgICAgIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIiAuCisgICAgICAgICAgICAiIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFwvXGJcblxyXHQiIC4KKyAgICAgICAgICAgICIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjXCQlJigpKCYlJCN7fXt9PD48PjwiOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzMnXSA9CisgICAgICAgICAgICAic3RyaW5nIHRoYXQgZW5kcyBpbiBkb3VibGUtYmFja3NsYXNoIFxcXFwiOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ10gPQorICAgICAgICAgICAgIuC4quC4p+C4seC4quC4lOC4tS/wnZKvIjsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXSA9IDMuMTQxNTkyNjUzNTg5ODsKKworICAgICAgICAvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ10gPSAweDAxOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEkzMiddID0gcG93KDIsIDMwKTsKKworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gcG93KDIsIDYwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gIjExNTI5MjE1MDQ2MDY4NDcwMDAiOworICAgICAgICB9CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J10gPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ3dvcmtlZCcsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coMiwgMzApLAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdE5lc3RlZCddID0KKyAgICAgICAgICAgIG5ldyBYdHJ1Y3QoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICd3b3JrZWQnLAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMHgwMSwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KDIsIDMwKSwKKyAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXSA9CisgICAgICAgICAgICBuZXcgWHRydWN0MigKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCisgICAgICAgICAgICAgICAgICAgICdzdHJ1Y3RfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3ROZXN0ZWQnXSwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KDIsIDE1KQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TWFwJ10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgNyA9PiA3NywKKyAgICAgICAgICAgICAgICA4ID0+IDg4LAorICAgICAgICAgICAgICAgIDkgPT4gOTkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgImEiID0+ICIxMjMiLAorICAgICAgICAgICAgICAgICJhIGIiID0+ICJ3aXRoIHNwYWNlcyAiLAorICAgICAgICAgICAgICAgICJzYW1lIiA9PiAic2FtZSIsCisgICAgICAgICAgICAgICAgIjAiID0+ICJudW1lcmljIGtleSIsCisgICAgICAgICAgICAgICAgImxvbmdWYWx1ZSIgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddLAorICAgICAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXSA9PiAibG9uZyBrZXkiCisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFNldCddID0gYXJyYXkoMSA9PiB0cnVlLCA1ID0+IHRydWUsIDYgPT4gdHJ1ZSk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddID0gYXJyYXkoMSwgMiwgMyk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0RW51bSddID0gTnVtYmVyejo6T05FOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXSA9IDY5OworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE1hcE1hcEV4cGVjdGVkUmVzdWx0J10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgNCA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgMSA9PiAxLAorICAgICAgICAgICAgICAgICAgICAyID0+IDIsCisgICAgICAgICAgICAgICAgICAgIDMgPT4gMywKKyAgICAgICAgICAgICAgICAgICAgNCA9PiA0LAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgLTQgPT4gYXJyYXkoCisgICAgICAgICAgICAgICAgICAgIC00ID0+IC00LAorICAgICAgICAgICAgICAgICAgICAtMyA9PiAtMywKKyAgICAgICAgICAgICAgICAgICAgLTIgPT4gLTIsCisgICAgICAgICAgICAgICAgICAgIC0xID0+IC0xCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAvLyB0ZXN0SW5zYW5pdHkgLi4uIHRha2VzIGEgZmV3IHN0ZXBzIHRvIHNldCB1cCEKKworICAgICAgICAkeHRydWN0MSA9CisgICAgICAgICAgICBuZXcgWHRydWN0KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gNAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgJHh0cnVjdDIgPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ0hlbGxvMicsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAyLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAyLAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiAyCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAkdXNlck1hcCA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICBOdW1iZXJ6OjpGSVZFID0+IDUsCisgICAgICAgICAgICAgICAgTnVtYmVyejo6RUlHSFQgPT4gOAorICAgICAgICAgICAgKTsKKworICAgICAgICAkaW5zYW5pdHkyID0KKyAgICAgICAgICAgIG5ldyBJbnNhbml0eSgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3VzZXJNYXAnID0+ICR1c2VyTWFwLAorICAgICAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gYXJyYXkoJHh0cnVjdDEsICR4dHJ1Y3QyKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgJGluc2FuaXR5MyA9ICRpbnNhbml0eTI7CisKKyAgICAgICAgJGluc2FuaXR5NiA9CisgICAgICAgICAgICBuZXcgSW5zYW5pdHkoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICd1c2VyTWFwJyA9PiBudWxsLAorICAgICAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gbnVsbAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0SW5zYW5pdHlFeHBlY3RlZFJlc3VsdCddID0KKyAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICIxIiA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VFdPID0+ICRpbnNhbml0eTIsCisgICAgICAgICAgICAgICAgICAgIE51bWJlcno6OlRIUkVFID0+ICRpbnNhbml0eTMKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICIyIiA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6U0lYID0+ICRpbnNhbml0eTYKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjY4NjUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwCkBAIC0wLDAgKzEsMTE2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcSnNvblNlcmlhbGl6ZTsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIHN0ZENsYXNzOworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCisvKioKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgSnNvblNlcmlhbGl6ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICBpZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oKSwgJzUuNCcsICc8JykpIHsKKyAgICAgICAgICAgICR0aGlzLT5tYXJrVGVzdFNraXBwZWQoJ1JlcXVpcmVzIFBIUCA1LjQgb3IgbmV3ZXIhJyk7CisgICAgICAgIH0KKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocGpzJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbXB0eVN0cnVjdCgpCisgICAgeworICAgICAgICAkZW1wdHkgPSBuZXcgXFRocmlmdFRlc3RcRW1wdHlTdHJ1Y3QoYXJyYXkoJ25vbl9leGlzdGluZ19rZXknID0+ICdiYXInKSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMobmV3IHN0ZENsYXNzKCksIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRlbXB0eSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ3NBbmRJbnRzKCkKKyAgICB7CisgICAgICAgICRpbnB1dCA9IGFycmF5KAorICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ2ZvbycsCisgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiAxMjM0NTY3ODkwLAorICAgICAgICApOworICAgICAgICAkeHRydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgkaW5wdXQpOworCisgICAgICAgIC8vIFh0cnVjdCdzICdpMzJfdGhpbmcnIGFuZCAnYnl0ZV90aGluZycgZmllbGRzIHNob3VsZCBub3QgYmUgcHJlc2VudCBoZXJlIQorICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT5zdHJpbmdfdGhpbmcgPSAkaW5wdXRbJ3N0cmluZ190aGluZyddOworICAgICAgICAkZXhwZWN0ZWQtPmk2NF90aGluZyA9ICRpbnB1dFsnaTY0X3RoaW5nJ107CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkeHRydWN0KSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdGVkU3RydWN0cygpCisgICAgeworICAgICAgICAkeHRydWN0MiA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QyKGFycmF5KAorICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDQyLAorICAgICAgICAgICAgJ3N0cnVjdF90aGluZycgPT4gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdChhcnJheSgKKyAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAxMjM0NTYsCisgICAgICAgICAgICApKSwKKyAgICAgICAgKSk7CisKKyAgICAgICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+Ynl0ZV90aGluZyA9ICR4dHJ1Y3QyLT5ieXRlX3RoaW5nOworICAgICAgICAkZXhwZWN0ZWQtPnN0cnVjdF90aGluZyA9IG5ldyBzdGRDbGFzcygpOworICAgICAgICAkZXhwZWN0ZWQtPnN0cnVjdF90aGluZy0+aTMyX3RoaW5nID0gJHh0cnVjdDItPnN0cnVjdF90aGluZy0+aTMyX3RoaW5nOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJHh0cnVjdDIpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJbnNhbml0eSgpCisgICAgeworICAgICAgICAkeGlucHV0ID0gYXJyYXkoJ3N0cmluZ190aGluZycgPT4gJ2ZvbycpOworICAgICAgICAkeHRydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgkeGlucHV0KTsKKyAgICAgICAgJGluc2FuaXR5ID0gbmV3IFxUaHJpZnRUZXN0XEluc2FuaXR5KGFycmF5KAorICAgICAgICAgICAgJ3h0cnVjdHMnID0+IGFycmF5KCR4dHJ1Y3QsICR4dHJ1Y3QsICR4dHJ1Y3QpCisgICAgICAgICkpOworICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT54dHJ1Y3RzID0gYXJyYXkoKG9iamVjdCkkeGlucHV0LCAob2JqZWN0KSR4aW5wdXQsIChvYmplY3QpJHhpbnB1dCk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkaW5zYW5pdHkpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0ZWRMaXN0cygpCisgICAgeworICAgICAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKGFycmF5KCdtZXNzYWdlJyA9PiAnZm9vJykpOworICAgICAgICAkbmVzdGVkID0gbmV3IFxUaHJpZnRUZXN0XE5lc3RlZExpc3RzQm9uayhhcnJheSgnYm9uaycgPT4gYXJyYXkoYXJyYXkoYXJyYXkoJGJvbmspKSkpKTsKKyAgICAgICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+Ym9uayA9IGFycmF5KGFycmF5KGFycmF5KChvYmplY3QpYXJyYXkoJ21lc3NhZ2UnID0+ICdmb28nKSkpKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRuZXN0ZWQpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBzKCkKKyAgICB7CisgICAgICAgICRpbnRtYXAgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoWyd0aGluZycgPT4gWzAgPT4gJ3plcm8nXV0pOworICAgICAgICAkZW1wdHltYXAgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoW10pOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7InRoaW5nIjp7IjAiOiJ6ZXJvIn19JywganNvbl9lbmNvZGUoJGludG1hcCkpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7fScsIGpzb25fZW5jb2RlKCRlbXB0eW1hcCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2NhbGFyVHlwZXMoKQorICAgIHsKKyAgICAgICAgJGIgPSBuZXcgXFRocmlmdFRlc3RcQm9vbHMoWydpbV90cnVlJyA9PiAnMScsICdpbV9mYWxzZScgPT4gJzAnXSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3siaW1fdHJ1ZSI6dHJ1ZSwiaW1fZmFsc2UiOmZhbHNlfScsIGpzb25fZW5jb2RlKCRiKSk7CisgICAgICAgICRzID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoWydzJyA9PiA0Ml0pOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7InMiOiI0MiJ9JywganNvbl9lbmNvZGUoJHMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggNmU5YTI3Yy4uNmY0ZTUwYSAxMDA3NTUKLS0tIGEvbGliL3BocC90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9waHAvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTcsMTEgKzE3LDExIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorUEhQVU5JVD1waHAgJCh0b3Bfc3JjZGlyKS92ZW5kb3IvYmluL3BocHVuaXQKIAogc3R1YnM6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgIFRlc3RWYWxpZGF0b3JzLnRocmlmdAotCW1rZGlyIC1wIC4vcGFja2FnZXMKLQkkKFRIUklGVCkgLS1nZW4gcGhwIC1yIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCW1rZGlyIC1wIC4vcGFja2FnZXMvcGhwCisJJChUSFJJRlQpIC0tZ2VuIHBocCAtciAtLW91dCAuL3BhY2thZ2VzL3BocCAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiAJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHB2CiAJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHB2bwogCW1rZGlyIC1wIC4vcGFja2FnZXMvcGhwanMKQEAgLTI5LDMyICsyOSwyNyBAQAogCSQoVEhSSUZUKSAtLWdlbiBwaHA6dmFsaWRhdGUsb29wIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwdm8gIFRlc3RWYWxpZGF0b3JzLnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBwaHA6anNvbiAgICAgICAgIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwanMgIFRlc3RWYWxpZGF0b3JzLnRocmlmdAogCi1jaGVjay1qc29uLXNlcmlhbGl6ZXI6IHN0dWJzCi1pZiBIQVZFX1BIUFVOSVQKLQkkKFBIUFVOSVQpIC0tbG9nLWp1bml0PVRFU1QtanNvbi1zZXJpYWxpemVyLnhtbCBUZXN0L1RocmlmdC9Kc29uU2VyaWFsaXplLwotZW5kaWYKK2RlcHM6ICQodG9wX3NyY2RpcikvY29tcG9zZXIuanNvbgorCWNvbXBvc2VyIGluc3RhbGwgLS13b3JraW5nLWRpcj0kKHRvcF9zcmNkaXIpCiAKLWNoZWNrLXZhbGlkYXRvcjogc3R1YnMKLQlwaHAgVGVzdC9UaHJpZnQvVGVzdFZhbGlkYXRvcnMucGhwCi0JcGhwIFRlc3QvVGhyaWZ0L1Rlc3RWYWxpZGF0b3JzLnBocCAtb29wCithbGwtbG9jYWw6IGRlcHMKIAotY2hlY2stcHJvdG9jb2w6CXN0dWJzCi1pZiBIQVZFX1BIUFVOSVQKLQkkKFBIUFVOSVQpIC0tbG9nLWp1bml0PVRFU1QtbG9nLWpzb24tcHJvdG9jb2wueG1sIFRlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLnBocAotCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1iaW5hcnktc2VyaWFsaXplci54bWwgVGVzdC9UaHJpZnQvUHJvdG9jb2wvVGVzdEJpbmFyeVNlcmlhbGl6ZXIucGhwCi1lbmRpZgorY2hlY2stanNvbi1zZXJpYWxpemVyOiBkZXBzIHN0dWJzCisJJChQSFBVTklUKSAtLWxvZy1qdW5pdD1URVNULWxvZy1qc29uLXNlcmlhbGl6ZXIueG1sIEpzb25TZXJpYWxpemUvCiAKLWNoZWNrOiBzdHVicyBcCitjaGVjay12YWxpZGF0b3I6IGRlcHMgc3R1YnMKKwkkKFBIUFVOSVQpIC0tbG9nLWp1bml0PVRFU1QtbG9nLXZhbGlkYXRvci54bWwgVmFsaWRhdG9yLworCitjaGVjay1wcm90b2NvbDoJZGVwcyBzdHVicworCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctcHJvdG9jb2wueG1sIFByb3RvY29sLworCitjaGVjazogZGVwcyBzdHVicyBcCiAgIGNoZWNrLXByb3RvY29sIFwKICAgY2hlY2stdmFsaWRhdG9yIFwKICAgY2hlY2stanNvbi1zZXJpYWxpemVyCiAKK2Rpc3RjbGVhbi1sb2NhbDoKKwogY2xlYW4tbG9jYWw6CiAJJChSTSkgLXIgLi9wYWNrYWdlcwogCSQoUk0pIFRFU1QtKi54bWwKLQotRVhUUkFfRElTVCA9IFwKLQlUZXN0IFwKLQlUZXN0VmFsaWRhdG9ycy50aHJpZnQKLQotCmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvQmluYXJ5U2VyaWFsaXplclRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL0JpbmFyeVNlcmlhbGl6ZXJUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWIwYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL0JpbmFyeVNlcmlhbGl6ZXJUZXN0LnBocApAQCAtMCwwICsxLDYwIEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0XFByb3RvY29sOworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2UgVGhyaWZ0XFNlcmlhbGl6ZXJcVEJpbmFyeVNlcmlhbGl6ZXI7CisKK3JlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKKy8qKioKKyAqIFRoaXMgdGVzdCBzdWl0ZSBkZXBlbmRzIG9uIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIGFnYWluc3QgdGhlCisgKiBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBmaWxlOgorICoKKyAqIGxpYi9waHAvdGVzdCQgLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBwaHAgLXIgXAorICogICAtLW91dCAuL3BhY2thZ2VzIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIEJpbmFyeVNlcmlhbGl6ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VXAoKQorICAgIHsKKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocCcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdlIHRyeSB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIGEgcmFuZG9tIG9iamVjdCB0byBtYWtlIHN1cmUgbm8gZXhjZXB0aW9ucyBhcmUgdGhyb3duLgorICAgICAqIEBzZWUgVEhSSUZULTE1NzkKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJpbmFyeVNlcmlhbGl6ZXIoKQorICAgIHsKKyAgICAgICAgJHN0cnVjdCA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoYXJyYXkoJ3N0cmluZ190aGluZycgPT4gJ2FiYycpKTsKKyAgICAgICAgJHNlcmlhbGl6ZWQgPSBUQmluYXJ5U2VyaWFsaXplcjo6c2VyaWFsaXplKCRzdHJ1Y3QsICdUaHJpZnRUZXN0XFxYdHJ1Y3QnKTsKKyAgICAgICAgJGRlc2VyaWFsaXplZCA9IFRCaW5hcnlTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZSgkc2VyaWFsaXplZCwgJ1RocmlmdFRlc3RcXFh0cnVjdCcpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRzdHJ1Y3QsICRkZXNlcmlhbGl6ZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sRml4dHVyZXMucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5MDM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sRml4dHVyZXMucGhwCkBAIC0wLDAgKzEsNzQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK2NsYXNzIFRKU09OUHJvdG9jb2xGaXh0dXJlcworeworICAgIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzSlNPTiA9IGFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3NKU09OKCkKKyAgICB7CisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10gPSAne30nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10gPSAneyIxIjp7InN0ciI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIFwvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZVwn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwXC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXSA9ICd7IjEiOnsic3RyIjoicXVvdGU6IFxcXFxcIiBiYWNrc2xhc2g6IGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXFxcXC8gIGJhY2tzcGFjZTogXFxcXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXFxcXFxcXC9cXFxcYlxuXHJcdCBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48In19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMyddID0gJ3siMSI6eyJzdHIiOiJzdHJpbmcgdGhhdCBlbmRzIGluIGRvdWJsZS1iYWNrc2xhc2ggXFxcXFxcXFwifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddID0gJ3siMSI6eyJzdHIiOiLguKrguKfguLHguKrguJTguLVcL/Cdkq8ifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXSA9ICd7IjEiOnsiZGJsIjozLjE0MTU5MjY1MzU4OTh9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXSA9ICd7IjEiOnsiaTgiOjF9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddID0gJ3siMSI6eyJpMzIiOjEwNzM3NDE4MjR9fSc7CisKKyAgICAgICAgaWYgKFBIUF9JTlRfU0laRSA9PSA4KSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyIxIjp7Imk2NCI6JyAuIHBvdygyLCA2MCkgLiAnfX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3siMSI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjonIC4gcG93KDIsIDYwKSAuICd9fX19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7Imk4IjoxfSwiMiI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjonIC4gcG93KDIsIDYwKSAuICd9fX0sIjMiOnsiaTMyIjozMjc2OH19fX0nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3siMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fX19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7Imk4IjoxfSwiMiI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjoxMTUyOTIxNTA0NjA2ODQ3MDAwfX19LCIzIjp7ImkzMiI6MzI3Njh9fX19JzsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXSA9ICd7IjEiOnsibWFwIjpbImkzMiIsImkzMiIsMyx7IjciOjc3LCI4Ijo4OCwiOSI6OTl9XX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ10gPSAneyIxIjp7Im1hcCI6WyJzdHIiLCJzdHIiLDYseyJhIjoiMTIzIiwiYSBiIjoid2l0aCBzcGFjZXMgIiwic2FtZSI6InNhbWUiLCIwIjoibnVtZXJpYyBrZXkiLCJsb25nVmFsdWUiOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIiwiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSI6Imxvbmcga2V5In1dfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXSA9ICd7IjEiOnsic2V0IjpbImkzMiIsMywxLDUsNl19fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXSA9ICd7IjEiOnsibHN0IjpbImkzMiIsMywxLDIsM119fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXSA9ICd7IjEiOnsiaTMyIjoxfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10gPSAneyIxIjp7Imk2NCI6Njl9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddID0gJ3siMCI6eyJtYXAiOlsiaTMyIiwibWFwIiwyLHsiNCI6WyJpMzIiLCJpMzIiLDQseyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fV0sIi00IjpbImkzMiIsImkzMiIsNCx7Ii00IjotNCwiLTMiOi0zLCItMiI6LTIsIi0xIjotMX1dfV19fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEluc2FuaXR5J10gPSAneyIwIjp7Im1hcCI6WyJpNjQiLCJtYXAiLDIseyIxIjpbImkzMiIsInJlYyIsMix7IjIiOnsiMSI6eyJtYXAiOlsiaTMyIiwiaTY0IiwyLHsiNSI6NSwiOCI6OH1dfSwiMiI6eyJsc3QiOlsicmVjIiwyLHsiMSI6eyJzdHIiOiJHb29kYnllNCJ9LCI0Ijp7Imk4Ijo0fSwiOSI6eyJpMzIiOjR9LCIxMSI6eyJpNjQiOjR9fSx7IjEiOnsic3RyIjoiSGVsbG8yIn0sIjQiOnsiaTgiOjJ9LCI5Ijp7ImkzMiI6Mn0sIjExIjp7Imk2NCI6Mn19XX19LCIzIjp7IjEiOnsibWFwIjpbImkzMiIsImk2NCIsMix7IjUiOjUsIjgiOjh9XX0sIjIiOnsibHN0IjpbInJlYyIsMix7IjEiOnsic3RyIjoiR29vZGJ5ZTQifSwiNCI6eyJpOCI6NH0sIjkiOnsiaTMyIjo0fSwiMTEiOnsiaTY0Ijo0fX0seyIxIjp7InN0ciI6IkhlbGxvMiJ9LCI0Ijp7Imk4IjoyfSwiOSI6eyJpMzIiOjJ9LCIxMSI6eyJpNjQiOjJ9fV19fX1dLCIyIjpbImkzMiIsInJlYyIsMSx7IjYiOnt9fV19XX19JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbFRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBlY2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xUZXN0LnBocApAQCAtMCwwICsxLDUxOCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRlc3RcVGhyaWZ0XEZpeHR1cmVzOwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKworLyoqKgorICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKKyAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6CisgKgorICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCisgKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVEpTT05Qcm90b2NvbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHByaXZhdGUgJHRyYW5zcG9ydDsKKyAgICBwcml2YXRlICRwcm90b2NvbDsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VXBCZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwJyk7CisKKyAgICAgICAgRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3MoKTsKKyAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjpwb3B1bGF0ZVRlc3RBcmdzSlNPTigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHRoaXMtPnByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2woJHRoaXMtPnRyYW5zcG9ydCk7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPm9wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXUklURSBURVNUUworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFZvaWRfYXJncygpOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qnl0ZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STMyX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXBXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlICRhY3R1YWwgcmV0dXJucyB1bmVzY2FwZWQgc3RyaW5nLgorICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0byB0byBkZWNvZGUgdGhlbiBlbmNvZGUgaXQgYWdhaW4KKyAgICAgICAgICogdG8gZ2V0IHRoZSBleHBlY3RlZCBlc2NhcGVkIHVuaWNvZGUuCisgICAgICAgICAqLworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9lbmNvZGUoanNvbl9kZWNvZGUoJGFjdHVhbCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNldFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFNldF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RMaXN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TGlzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVudW1Xcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RFbnVtX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEVudW0nXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZldyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFR5cGVkZWZfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUkVBRCBURVNUUworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMlJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzNXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMyddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmczJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nNFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZVJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3REb3VibGVfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RCeXRlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEkzMlJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJMzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STY0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE5lc3RfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXRSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U2V0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TGlzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdExpc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RFbnVtX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RW51bSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWZSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFR5cGVkZWZfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwTWFwUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddCisgICAgICAgICk7CisgICAgICAgICRyZXN1bHQgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwTWFwX3Jlc3VsdCgpOworICAgICAgICAkcmVzdWx0LT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRyZXN1bHQtPnN1Y2Nlc3M7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXBNYXBFeHBlY3RlZFJlc3VsdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEluc2FuaXR5UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEluc2FuaXR5J10KKyAgICAgICAgKTsKKyAgICAgICAgJHJlc3VsdCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJbnNhbml0eV9yZXN1bHQoKTsKKyAgICAgICAgJHJlc3VsdC0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkcmVzdWx0LT5zdWNjZXNzOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0SW5zYW5pdHlFeHBlY3RlZFJlc3VsdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzLnBocCBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0N2ZkODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzLnBocApAQCAtMCwwICsxLDY3IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIHRlc3RcVGhyaWZ0XFByb3RvY29sOworCitjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMKK3sKKyAgICBwdWJsaWMgc3RhdGljICR0ZXN0QXJnc0pTT04gPSBhcnJheSgpOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwb3B1bGF0ZVRlc3RBcmdzU2ltcGxlSlNPTigpCisgICAgeworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Vm9pZCddID0gJ3t9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddID0gJ3sidGhpbmciOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIn0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ10gPSAneyJ0aGluZyI6InF1b3RlOiBcXFxcXCIgYmFja3NsYXNoOiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXFxcXFwvICBiYWNrc3BhY2U6IFxcXFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFxcXFxcXFwvXFxcXGJcblxyXHQgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCJ9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ10gPSAneyJ0aGluZyI6My4xNDE1OTI2NTM1ODk4fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXSA9ICd7InRoaW5nIjoxfSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddID0gJ3sidGhpbmciOjEwNzM3NDE4MjR9JzsKKworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXSA9ICd7InRoaW5nIjonIC4gcG93KDIsIDYwKSAuICd9JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7InRoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjonIC4gcG93KDIsIDYwKSAuICd9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3sidGhpbmciOnsiYnl0ZV90aGluZyI6MSwic3RydWN0X3RoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjonIC4gcG93KDIsIDYwKSAuICd9LCJpMzJfdGhpbmciOjMyNzY4fX0nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3sidGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9JzsKKworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3sidGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3sidGhpbmciOnsiYnl0ZV90aGluZyI6MSwic3RydWN0X3RoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjoxMTUyOTIxNTA0NjA2ODQ3MDAwfSwiaTMyX3RoaW5nIjozMjc2OH19JzsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXSA9ICd7InRoaW5nIjp7IjciOjc3LCI4Ijo4OCwiOSI6OTl9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddID0gJ3sidGhpbmciOnsiYSI6IjEyMyIsImEgYiI6IndpdGggc3BhY2VzICIsInNhbWUiOiJzYW1lIiwiMCI6Im51bWVyaWMga2V5IiwibG9uZ1ZhbHVlIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSIsIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiOiJsb25nIGtleSJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddID0gJ3sidGhpbmciOlsxLDUsNl19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddID0gJ3sidGhpbmciOlsxLDIsM119JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddID0gJ3sidGhpbmciOjF9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddID0gJ3sidGhpbmciOjY5fSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhMTM3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5waHAKQEAgLTAsMCArMSwyNTQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZTsKK3VzZSBUZXN0XFRocmlmdFxGaXh0dXJlczsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFNpbXBsZUpTT05Qcm90b2NvbDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7CisKK3JlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKKy8qKioKKyAqIFRoaXMgdGVzdCBzdWl0ZSBkZXBlbmRzIG9uIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIGFnYWluc3QgdGhlCisgKiBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBmaWxlOgorICoKKyAqIGxpYi9waHAvdGVzdCQgLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBwaHAgLXIgXAorICogICAtLW91dCAuL3BhY2thZ2VzIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIFRTaW1wbGVKU09OUHJvdG9jb2xUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwcml2YXRlICR0cmFuc3BvcnQ7CisgICAgcHJpdmF0ZSAkcHJvdG9jb2w7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFVwQmVmb3JlQ2xhc3MoKQorICAgIHsKKworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwJyk7CisKKyAgICAgICAgRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3MoKTsKKyAgICAgICAgVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjpwb3B1bGF0ZVRlc3RBcmdzU2ltcGxlSlNPTigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHRoaXMtPnByb3RvY29sID0gbmV3IFRTaW1wbGVKU09OUHJvdG9jb2woJHRoaXMtPnRyYW5zcG9ydCk7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPm9wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXUklURSBURVNUUworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFZvaWRfYXJncygpOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qnl0ZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STMyX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXBXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2V0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFNldCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdExpc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RW51bSddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RUeXBlZGVmV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvRml4dHVyZXMucGhwIGIvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L0ZpeHR1cmVzLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkNDg3Zi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvRml4dHVyZXMucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/cGhwCi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKLSAqLwotCi1uYW1lc3BhY2UgVGVzdFxUaHJpZnQ7Ci0KLXVzZSBUaHJpZnRUZXN0XFh0cnVjdDsKLXVzZSBUaHJpZnRUZXN0XFh0cnVjdDI7Ci11c2UgVGhyaWZ0VGVzdFxOdW1iZXJ6OwotdXNlIFRocmlmdFRlc3RcSW5zYW5pdHk7Ci0KLWNsYXNzIEZpeHR1cmVzCi17Ci0gIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzID0gYXJyYXkoKTsKLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3MoKQotICB7Ci0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddID0KLSAgICAgICJxdW90ZTogXFxcIiBiYWNrc2xhc2g6IiAuCi0gICAgICAiIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXC8gIiAuCi0gICAgICAiIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAiIC4KLSAgICAgICIgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXC9cYlxuXHJcdCIgLgotICAgICAgIiBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCNcJCUmKCkoJiUkI3t9e308Pjw+PCI7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmczJ10gPQotICAgICAgInN0cmluZyB0aGF0IGVuZHMgaW4gZG91YmxlLWJhY2tzbGFzaCBcXFxcIjsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddID0gMy4xNDE1OTI2NTM1ODk4OwotCi0JLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKSBjYWxsCi0JCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddID0gMHgwMTsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEkzMiddID0gcG93KCAyLCAzMCApOwotCi0gICAgaWYgKFBIUF9JTlRfU0laRSA9PSA4KSB7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXSA9IHBvdyggMiwgNjAgKTsKLSAgICB9IGVsc2UgewotICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10gPSAiMTE1MjkyMTUwNDYwNjg0NzAwMCI7Ci0gICAgfQotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J10gPQotICAgICAgbmV3IFh0cnVjdCgKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnd29ya2VkJywKLSAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCi0gICAgICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IHBvdyggMiwgMzAgKSwKLSAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10KLSAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3ROZXN0ZWQnXSA9Ci0gICAgICBuZXcgWHRydWN0KAotICAgICAgICAgICAgYXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICd3b3JrZWQnLAotICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMHgwMSwKLSAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KCAyLCAzMCApLAotICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXQotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdCddID0KLSAgICAgIG5ldyBYdHJ1Y3QyKAotICAgICAgICAgICAgYXJyYXkoCi0gICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCi0gICAgICAgICAgICAgICAgJ3N0cnVjdF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdE5lc3RlZCddLAotICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IHBvdyggMiwgMTUgKQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXSA9Ci0gICAgICBhcnJheSgKLSAgICAgICAgICAgIDcgPT4gNzcsCi0gICAgICAgICAgICA4ID0+IDg4LAotICAgICAgICAgICAgOSA9PiA5OQotICAgICAgICAgICAgKTsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZ01hcCddID0KLSAgICAgIGFycmF5KAotICAgICAgICAgICAgImEiID0+ICIxMjMiLAotICAgICAgICAgICAgImEgYiIgPT4gIndpdGggc3BhY2VzICIsCi0gICAgICAgICAgICAic2FtZSIgPT4gInNhbWUiLAotICAgICAgICAgICAgIjAiID0+ICJudW1lcmljIGtleSIsCi0gICAgICAgICAgICAibG9uZ1ZhbHVlIiA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ10sCi0gICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ10gPT4gImxvbmcga2V5IgotICAgICAgICAgICAgKTsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFNldCddID0gYXJyYXkoIDEgPT4gdHJ1ZSwgNSA9PiB0cnVlLCA2ID0+IHRydWUgKTsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdExpc3QnXSA9IGFycmF5KCAxLCAyLCAzICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ10gPSBOdW1iZXJ6OjpPTkU7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ10gPSA2OTsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE1hcE1hcEV4cGVjdGVkUmVzdWx0J10gPQotICAgICAgYXJyYXkoCi0gICAgICAgICAgICA0ID0+IGFycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAxID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgIDIgPT4gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgMyA9PiAzLAotICAgICAgICAgICAgICAgICAgICAgICA0ID0+IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICksCi0gICAgICAgICAgICAtNCA9PiBhcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgIC00ID0+IC00LAotICAgICAgICAgICAgICAgICAgICAgICAgLTMgPT4gLTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAtMiA9PiAtMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0xID0+IC0xCi0gICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApOwotCi0gICAgLy8gdGVzdEluc2FuaXR5IC4uLiB0YWtlcyBhIGZldyBzdGVwcyB0byBzZXQgdXAhCi0KLSAgICAkeHRydWN0MSA9Ci0gICAgICBuZXcgWHRydWN0KAotICAgICAgICAgICAgYXJyYXkoCi0gICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ0dvb2RieWU0JywKLSAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gNCwKLSAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiA0LAotICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IDQKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApOwotCi0gICAgJHh0cnVjdDIgPQotICAgICAgbmV3IFh0cnVjdCgKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdIZWxsbzInLAotICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PjIsCi0gICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gMiwKLSAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiAyCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgICR1c2VyTWFwID0KLSAgICAgIGFycmF5KAotICAgICAgICAgICAgTnVtYmVyejo6RklWRSA9PiA1LAotICAgICAgICAgICAgTnVtYmVyejo6RUlHSFQgPT4gOAotICAgICAgICAgICAgKTsKLQotICAgICRpbnNhbml0eTIgPQotICAgICAgbmV3IEluc2FuaXR5KAotICAgICAgICAgICAgYXJyYXkoCi0gICAgICAgICAgICAgICAgJ3VzZXJNYXAnID0+ICR1c2VyTWFwLAotICAgICAgICAgICAgICAgICd4dHJ1Y3RzJyA9PiBhcnJheSgkeHRydWN0MSwkeHRydWN0MikKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApOwotCi0gICAgJGluc2FuaXR5MyA9ICRpbnNhbml0eTI7Ci0KLSAgICAkaW5zYW5pdHk2ID0KLSAgICAgIG5ldyBJbnNhbml0eSgKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICd1c2VyTWFwJyA9PiBudWxsLAotICAgICAgICAgICAgICAgICd4dHJ1Y3RzJyA9PiBudWxsCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEluc2FuaXR5RXhwZWN0ZWRSZXN1bHQnXSA9Ci0gICAgICBhcnJheSgKLSAgICAgICAgICAgICIxIiA9PiBhcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJ6OjpUV08gPT4gJGluc2FuaXR5MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJ6OjpUSFJFRSA9PiAkaW5zYW5pdHkzCi0gICAgICAgICAgICAgICAgICAgICksCi0gICAgICAgICAgICAiMiIgPT4gYXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6U0lYID0+ICRpbnNhbml0eTYKLSAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvSnNvblNlcmlhbGl6ZS9Kc29uU2VyaWFsaXplVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvSnNvblNlcmlhbGl6ZS9Kc29uU2VyaWFsaXplVGVzdC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMDAzZWQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLW5hbWVzcGFjZSBUZXN0XFRocmlmdFxKc29uU2VyaWFsaXplOwotCi11c2Ugc3RkQ2xhc3M7Ci11c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwotCi1yZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uLy4uLy4uL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKLQotJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1RocmlmdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL2xpYicpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1Rlc3QnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLicpOwotJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnRUZXN0JywgX19ESVJfXyAuICcvLi4vLi4vLi4vcGFja2FnZXMvcGhwanMnKTsKLSRsb2FkZXItPnJlZ2lzdGVyKCk7Ci0KLWNsYXNzIEpzb25TZXJpYWxpemVUZXN0IGV4dGVuZHMgXFBIUFVuaXRfRnJhbWV3b3JrX1Rlc3RDYXNlCi17Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbXB0eVN0cnVjdCgpCi0gIHsKLSAgICAkZW1wdHkgPSBuZXcgXFRocmlmdFRlc3RcRW1wdHlTdHJ1Y3QoYXJyYXkoJ25vbl9leGlzdGluZ19rZXknID0+ICdiYXInKSk7Ci0gICAgJHRoaXMtPmFzc2VydEVxdWFscyhuZXcgc3RkQ2xhc3MoKSwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJGVtcHR5KSkpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdzQW5kSW50cygpCi0gIHsKLSAgICAkaW5wdXQgPSBhcnJheSgKLSAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdmb28nLAotICAgICAgJ2k2NF90aGluZycgPT4gMTIzNDU2Nzg5MCwKLSAgICApOwotICAgICR4dHJ1Y3QgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCRpbnB1dCk7Ci0KLSAgICAvLyBYdHJ1Y3QncyAnaTMyX3RoaW5nJyBhbmQgJ2J5dGVfdGhpbmcnIGZpZWxkcyBzaG91bGQgbm90IGJlIHByZXNlbnQgaGVyZSEKLSAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKLSAgICAkZXhwZWN0ZWQtPnN0cmluZ190aGluZyA9ICRpbnB1dFsnc3RyaW5nX3RoaW5nJ107Ci0gICAgJGV4cGVjdGVkLT5pNjRfdGhpbmcgPSAkaW5wdXRbJ2k2NF90aGluZyddOwotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkeHRydWN0KSkpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0ZWRTdHJ1Y3RzKCkKLSAgewotICAgICR4dHJ1Y3QyID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdDIoYXJyYXkoCi0gICAgICAnYnl0ZV90aGluZycgPT4gNDIsCi0gICAgICAnc3RydWN0X3RoaW5nJyA9PiBuZXcgXFRocmlmdFRlc3RcWHRydWN0KGFycmF5KAotICAgICAgICAnaTMyX3RoaW5nJyA9PiAxMjM0NTYsCi0gICAgICApKSwKLSAgICApKTsKLQotICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzcygpOwotICAgICRleHBlY3RlZC0+Ynl0ZV90aGluZyA9ICR4dHJ1Y3QyLT5ieXRlX3RoaW5nOwotICAgICRleHBlY3RlZC0+c3RydWN0X3RoaW5nID0gbmV3IHN0ZENsYXNzKCk7Ci0gICAgJGV4cGVjdGVkLT5zdHJ1Y3RfdGhpbmctPmkzMl90aGluZyA9ICR4dHJ1Y3QyLT5zdHJ1Y3RfdGhpbmctPmkzMl90aGluZzsKLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJHh0cnVjdDIpKSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEluc2FuaXR5KCkKLSAgewotICAgICR4aW5wdXQgPSBhcnJheSgnc3RyaW5nX3RoaW5nJyA9PiAnZm9vJyk7Ci0gICAgJHh0cnVjdCA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoJHhpbnB1dCk7Ci0gICAgJGluc2FuaXR5ID0gbmV3IFxUaHJpZnRUZXN0XEluc2FuaXR5KGFycmF5KAotICAgICAgJ3h0cnVjdHMnID0+IGFycmF5KCR4dHJ1Y3QsICR4dHJ1Y3QsICR4dHJ1Y3QpCi0gICAgKSk7Ci0gICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7Ci0gICAgJGV4cGVjdGVkLT54dHJ1Y3RzID0gYXJyYXkoKG9iamVjdCkgJHhpbnB1dCwgKG9iamVjdCkgJHhpbnB1dCwgKG9iamVjdCkgJHhpbnB1dCk7Ci0gICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRpbnNhbml0eSkpKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdGVkTGlzdHMoKQotICB7Ci0gICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uayhhcnJheSgnbWVzc2FnZScgPT4gJ2ZvbycpKTsKLSAgICAkbmVzdGVkID0gbmV3IFxUaHJpZnRUZXN0XE5lc3RlZExpc3RzQm9uayhhcnJheSgnYm9uaycgPT4gYXJyYXkoYXJyYXkoYXJyYXkoJGJvbmspKSkpKTsKLSAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKLSAgICAkZXhwZWN0ZWQtPmJvbmsgPSBhcnJheShhcnJheShhcnJheSgob2JqZWN0KSBhcnJheSgnbWVzc2FnZScgPT4gJ2ZvbycpKSkpOwotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkbmVzdGVkKSkpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBzKCkKLSAgewotICAgICRpbnRtYXAgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoWyd0aGluZycgPT4gWzAgPT4gJ3plcm8nXV0pOwotICAgICRlbXB0eW1hcCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBfYXJncyhbXSk7Ci0gICAgJHRoaXMtPmFzc2VydEVxdWFscygneyJ0aGluZyI6eyIwIjoiemVybyJ9fScsIGpzb25fZW5jb2RlKCRpbnRtYXApKTsKLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7fScsIGpzb25fZW5jb2RlKCRlbXB0eW1hcCkpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0QmluYXJ5U2VyaWFsaXplci5waHAgYi9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvUHJvdG9jb2wvVGVzdEJpbmFyeVNlcmlhbGl6ZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTgzMjE2Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0QmluYXJ5U2VyaWFsaXplci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3BocAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50ZXN0Ci0gKi8KLQotbmFtZXNwYWNlIFRlc3RcVGhyaWZ0XFByb3RvY29sOwotCi11c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwotdXNlIFRocmlmdFxTZXJpYWxpemVyXFRCaW5hcnlTZXJpYWxpemVyOwotCi1yZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uLy4uLy4uL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKLQotJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1RocmlmdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL2xpYicpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1Rlc3QnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLicpOwotJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnRUZXN0JywgX19ESVJfXyAuICcvLi4vLi4vLi4vcGFja2FnZXMnKTsKLSRsb2FkZXItPnJlZ2lzdGVyKCk7Ci0KLS8qKioKLSAqIFRoaXMgdGVzdCBzdWl0ZSBkZXBlbmRzIG9uIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIGFnYWluc3QgdGhlCi0gKiBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBmaWxlOgotICoKLSAqIGxpYi9waHAvdGVzdCQgLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBwaHAgLXIgXAotICogICAtLW91dCAuL3BhY2thZ2VzIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLSAqLwotCi1jbGFzcyBUZXN0QmluYXJ5U2VyaWFsaXplciBleHRlbmRzIFxQSFBVbml0X0ZyYW1ld29ya19UZXN0Q2FzZQotewotCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgICogV2UgdHJ5IHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgYSByYW5kb20gb2JqZWN0IHRvIG1ha2Ugc3VyZSBubyBleGNlcHRpb25zIGFyZSB0aHJvd24uCi0gICAgKiBAc2VlIFRIUklGVC0xNTc5Ci0gICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RCaW5hcnlTZXJpYWxpemVyKCkKLSAgewotICAgICRzdHJ1Y3QgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KGFycmF5KCdzdHJpbmdfdGhpbmcnID0+ICdhYmMnKSk7Ci0gICAgJHNlcmlhbGl6ZWQgPSBUQmluYXJ5U2VyaWFsaXplcjo6c2VyaWFsaXplKCRzdHJ1Y3QsICdUaHJpZnRUZXN0XFxYdHJ1Y3QnKTsKLSAgICAkZGVzZXJpYWxpemVkID0gVEJpbmFyeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKCRzZXJpYWxpemVkLCAnVGhyaWZ0VGVzdFxcWHRydWN0Jyk7Ci0gICAgJHRoaXMtPmFzc2VydEVxdWFscygkc3RydWN0LCAkZGVzZXJpYWxpemVkKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvUHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wucGhwIGIvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2JhMzQ0MS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvUHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTY0ICswLDAgQEAKLTw/cGhwCi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKLSAqLwotCi1uYW1lc3BhY2UgdGVzdFxUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7Ci11c2UgVGVzdFxUaHJpZnRcRml4dHVyZXM7Ci11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOwotdXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOwotCi1kZWZpbmUoICdCVUZTSVonLCA4MTkyICk7IC8vYmlnIGVub3VnaCB0byByZWFkIGJpZ2dlc3Qgc2VyaWFsaXplZCBGaXh0dXJlIGFyZy4KLQotcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi8uLi8uLi9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7Ci0KLSRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKLSRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUaHJpZnQnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi9saWInKTsKLSRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUZXN0JywgX19ESVJfXyAuICcvLi4vLi4vLi4nKTsKLSRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignVGhyaWZ0VGVzdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uL3BhY2thZ2VzJyk7Ci0kbG9hZGVyLT5yZWdpc3RlcigpOwotCi0vKioqCi0gKiBUaGlzIHRlc3Qgc3VpdGUgZGVwZW5kcyBvbiBydW5uaW5nIHRoZSBjb21waWxlciBhZ2FpbnN0IHRoZQotICogc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgZmlsZToKLSAqCi0gKiBsaWIvcGhwL3Rlc3QkIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcGhwIC1yIFwKLSAqICAgLS1vdXQgLi9wYWNrYWdlcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ci0gKi8KLQotY2xhc3MgVGVzdFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBcUEhQVW5pdF9GcmFtZXdvcmtfVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSAkdHJhbnNwb3J0OwotICBwcml2YXRlICRwcm90b2NvbDsKLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFVwQmVmb3JlQ2xhc3MoKQotICB7Ci0gICAgRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3MoKTsKLSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJnc0pTT04oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCi0gIHsKLSAgICAkdGhpcy0+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+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nM19Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmczJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzMnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3REb3VibGVfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3REb3VibGVfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJ5dGVfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEkzMl9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEkzMl9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STY0X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STY0X2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdF9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE5lc3RfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcF9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TWFwJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXBfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZ01hcCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2V0X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3RfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TGlzdF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bV9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RFbnVtX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RUeXBlZGVmX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFR5cGVkZWZfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBNYXBfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkcmVzdWx0ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcE1hcF9yZXN1bHQoKTsKLSAgICAkcmVzdWx0LT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkcmVzdWx0LT5zdWNjZXNzOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXBNYXBFeHBlY3RlZFJlc3VsdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEluc2FuaXR5X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJbnNhbml0eSddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkcmVzdWx0ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEluc2FuaXR5X3Jlc3VsdCgpOwotICAgICRyZXN1bHQtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRyZXN1bHQtPnN1Y2Nlc3M7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEluc2FuaXR5RXhwZWN0ZWRSZXN1bHQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLX0KLQotY2xhc3MgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXMKLXsKLSAgcHVibGljIHN0YXRpYyAkdGVzdEFyZ3NKU09OID0gYXJyYXkoKTsKLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3NKU09OKCkKLSAgewotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10gPSAne30nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXSA9ICd7IjEiOnsic3RyIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSJ9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddID0gJ3siMSI6eyJzdHIiOiJxdW90ZTogXFxcXFwiIGJhY2tzbGFzaDogZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcXFxcLyAgYmFja3NwYWNlOiBcXFxcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6IFwiXFxcXFxcXFxcL1xcXFxiXG5cclx0IG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwifX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzMnXSA9ICd7IjEiOnsic3RyIjoic3RyaW5nIHRoYXQgZW5kcyBpbiBkb3VibGUtYmFja3NsYXNoIFxcXFxcXFxcIn19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXSA9ICd7IjEiOnsiZGJsIjozLjE0MTU5MjY1MzU4OTh9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddID0gJ3siMSI6eyJpOCI6MX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXSA9ICd7IjEiOnsiaTMyIjoxMDczNzQxODI0fX0nOwotCi0gICAgaWYgKFBIUF9JTlRfU0laRSA9PSA4KSB7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyIxIjp7Imk2NCI6Jy5wb3coIDIsIDYwICkuJ319JzsKLSAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6Jy5wb3coIDIsIDYwICkuJ319fX0nOwotICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsiaTgiOjF9LCIyIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOicucG93KCAyLCA2MCApLid9fX0sIjMiOnsiaTMyIjozMjc2OH19fX0nOwotICAgIH0gZWxzZSB7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyIxIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19JzsKLSAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19fX0nOwotICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsiaTgiOjF9LCIyIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fX0sIjMiOnsiaTMyIjozMjc2OH19fX0nOwotICAgIH0KLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXSA9ICd7IjEiOnsibWFwIjpbImkzMiIsImkzMiIsMyx7IjciOjc3LCI4Ijo4OCwiOSI6OTl9XX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXSA9ICd7IjEiOnsibWFwIjpbInN0ciIsInN0ciIsNix7ImEiOiIxMjMiLCJhIGIiOiJ3aXRoIHNwYWNlcyAiLCJzYW1lIjoic2FtZSIsIjAiOiJudW1lcmljIGtleSIsImxvbmdWYWx1ZSI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiLCJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIjoibG9uZyBrZXkifV19fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10gPSAneyIxIjp7InNldCI6WyJpMzIiLDMsMSw1LDZdfX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXSA9ICd7IjEiOnsibHN0IjpbImkzMiIsMywxLDIsM119fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddID0gJ3siMSI6eyJpMzIiOjF9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddID0gJ3siMSI6eyJpNjQiOjY5fX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddID0gJ3siMCI6eyJtYXAiOlsiaTMyIiwibWFwIiwyLHsiNCI6WyJpMzIiLCJpMzIiLDQseyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fV0sIi00IjpbImkzMiIsImkzMiIsNCx7Ii00IjotNCwiLTMiOi0zLCItMiI6LTIsIi0xIjotMX1dfV19fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0SW5zYW5pdHknXSA9ICd7IjAiOnsibWFwIjpbImk2NCIsIm1hcCIsMix7IjEiOlsiaTMyIiwicmVjIiwyLHsiMiI6eyIxIjp7Im1hcCI6WyJpMzIiLCJpNjQiLDIseyI1Ijo1LCI4Ijo4fV19LCIyIjp7ImxzdCI6WyJyZWMiLDIseyIxIjp7InN0ciI6Ikdvb2RieWU0In0sIjQiOnsiaTgiOjR9LCI5Ijp7ImkzMiI6NH0sIjExIjp7Imk2NCI6NH19LHsiMSI6eyJzdHIiOiJIZWxsbzIifSwiNCI6eyJpOCI6Mn0sIjkiOnsiaTMyIjoyfSwiMTEiOnsiaTY0IjoyfX1dfX0sIjMiOnsiMSI6eyJtYXAiOlsiaTMyIiwiaTY0IiwyLHsiNSI6NSwiOCI6OH1dfSwiMiI6eyJsc3QiOlsicmVjIiwyLHsiMSI6eyJzdHIiOiJHb29kYnllNCJ9LCI0Ijp7Imk4Ijo0fSwiOSI6eyJpMzIiOjR9LCIxMSI6eyJpNjQiOjR9fSx7IjEiOnsic3RyIjoiSGVsbG8yIn0sIjQiOnsiaTgiOjJ9LCI5Ijp7ImkzMiI6Mn0sIjExIjp7Imk2NCI6Mn19XX19fV0sIjIiOlsiaTMyIiwicmVjIiwxLHsiNiI6e319XX1dfX0nOwotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9UZXN0VmFsaWRhdG9ycy5waHAgYi9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvVGVzdFZhbGlkYXRvcnMucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmNmMDAwLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9UZXN0VmFsaWRhdG9ycy5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotbmFtZXNwYWNlIHRlc3RccGhwOwotCi1yZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uLy4uL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKLQotdXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sOwotdXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKLQotJG9vcF9tb2RlID0gKGlzc2V0KCRhcmd2WzFdKSAmJiAkYXJndlsxXSA9PT0gJy1vb3AnKTsKLSRHRU5fRElSID0gJG9vcF9tb2RlID8gJ3BocHZvJyA6ICdwaHB2JzsKLQotJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1RocmlmdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uL2xpYicpOwotJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnRUZXN0JywgX19ESVJfXyAuICcvLi4vLi4vcGFja2FnZXMvJyAuICRHRU5fRElSKTsKLSRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignVGVzdFZhbGlkYXRvcnMnLCBfX0RJUl9fIC4gJy8uLi8uLi9wYWNrYWdlcy8nIC4gJEdFTl9ESVIpOwotJGxvYWRlci0+cmVnaXN0ZXIoKTsKLQotLy8gV291bGQgYmUgbmljZSB0byBoYXZlIFBIUFVuaXQgaGVyZSwgYnV0IGZvciBub3cganVzdCBoYWNrIGl0LgotCi1zZXRfZXhjZXB0aW9uX2hhbmRsZXIoZnVuY3Rpb24gKCRlKSB7Ci0gICAgbXlfYXNzZXJ0KGZhbHNlLCAiVW5leHBlY3RlZCBleGNlcHRpb24gY2F1Z2h0OiAiIC4gJGUtPmdldE1lc3NhZ2UoKSk7Ci19KTsKLQotc2V0X2Vycm9yX2hhbmRsZXIoZnVuY3Rpb24gKCRlcnJubywgJGVycm1zZykgewotICAgIG15X2Fzc2VydChmYWxzZSwgIlVuZXhwZWN0ZWQgUEhQIGVycm9yOiAiIC4gJGVycm1zZyk7Ci19KTsKLQotLy8gRW1wdHkgc3RydWN0cyBzaG91bGQgbm90IGhhdmUgdmFsaWRhdG9ycwotYXNzZXJ0X2hhc19ub19yZWFkX3ZhbGlkYXRvcignVGhyaWZ0VGVzdFxFbXB0eVN0cnVjdCcpOwotYXNzZXJ0X2hhc19ub193cml0ZV92YWxpZGF0b3IoJ1RocmlmdFRlc3RcRW1wdHlTdHJ1Y3QnKTsKLQotLy8gQm9uayBoYXMgb25seSBvcHRfaW5fcmVxX291dCBmaWVsZHMKLXsKLSAgICBhc3NlcnRfaGFzX25vX3JlYWRfdmFsaWRhdG9yKCdUaHJpZnRUZXN0XEJvbmsnKTsKLSAgICBhc3NlcnRfaGFzX2Ffd3JpdGVfdmFsaWRhdG9yKCdUaHJpZnRUZXN0XEJvbmsnKTsKLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgY2FuIHJlYWQgYW4gZW1wdHkgb2JqZWN0Ci0gICAgICAgICRib25rID0gbmV3IFxUaHJpZnRUZXN0XEJvbmsoKTsKLSAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCJcMDAwIik7Ci0gICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci0gICAgICAgICRib25rLT5yZWFkKCRwcm90b2NvbCk7Ci0gICAgfQotICAgIHsKLSAgICAgICAgLy8gLi4uYnV0IG5vdCB3cml0ZSBhbiBlbXB0eSBvYmplY3QKLSAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOwotICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKLSAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLSAgICAgICAgYXNzZXJ0X3Byb3RvY29sX2V4Y2VwdGlvbl90aHJvd24oZnVuY3Rpb24gKCkgdXNlICgkYm9uaywgJHByb3RvY29sKSB7ICRib25rLT53cml0ZSgkcHJvdG9jb2wpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQm9uayB3YXMgYWJsZSB0byB3cml0ZSBhbiBlbXB0eSBvYmplY3QnKTsKLSAgICB9Ci19Ci0KLS8vIFN0cnVjdEEgaGFzIGEgc2luZ2xlIHJlcXVpcmVkIGZpZWxkCi17Ci0gICAgYXNzZXJ0X2hhc19hX3JlYWRfdmFsaWRhdG9yKCdUaHJpZnRUZXN0XFN0cnVjdEEnKTsKLSAgICBhc3NlcnRfaGFzX2Ffd3JpdGVfdmFsaWRhdG9yKCdUaHJpZnRUZXN0XFN0cnVjdEEnKTsKLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIG5vdCBhYmxlIHRvIHdyaXRlIFN0cnVjdEEgd2l0aCBhIG1pc3NpbmcgcmVxdWlyZWQgZmllbGQKLSAgICAgICAgJHN0cnVjdGEgPSBuZXcgXFRocmlmdFRlc3RcU3RydWN0QSgpOwotICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKLSAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLSAgICAgICAgYXNzZXJ0X3Byb3RvY29sX2V4Y2VwdGlvbl90aHJvd24oZnVuY3Rpb24gKCkgdXNlICgkc3RydWN0YSwgJHByb3RvY29sKSB7ICRzdHJ1Y3RhLT53cml0ZSgkcHJvdG9jb2wpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU3RydWN0QSB3YXMgYWJsZSB0byB3cml0ZSBhbiBlbXB0eSBvYmplY3QnKTsKLSAgICB9Ci0gICAgewotICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGFyZSBhYmxlIHRvIHJlYWQgYW5kIHdyaXRlIGEgbWVzc2FnZSB3aXRoIGEgZ29vZCBTdHJ1Y3RBCi0gICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcihiYXNlNjRfZGVjb2RlKCdDd0FCQUFBQUEyRmlZd0E9JykpOwotICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7Ci0gICAgICAgICRzdHJ1Y3RhLT5yZWFkKCRwcm90b2NvbCk7Ci0gICAgICAgICRzdHJ1Y3RhLT53cml0ZSgkcHJvdG9jb2wpOwotICAgIH0KLX0KLQotLy8gVW5pb25zIHNob3VsZCBub3QgZ2V0IHdyaXRlIHZhbGlkYXRvcnMKLWFzc2VydF9oYXNfbm9fd3JpdGVfdmFsaWRhdG9yKCdUZXN0VmFsaWRhdG9yc1xVbmlvbk9mU3RyaW5ncycpOwotCi0vLyBTZXJ2aWNlIF9yZXN1bHQgY2xhc3NlcyBzaG91bGQgbm90IGdldCBhbnkgdmFsaWRhdG9ycwotYXNzZXJ0X2hhc19ub19yZWFkX3ZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVGVzdFNlcnZpY2VfdGVzdF9yZXN1bHQnKTsKLWFzc2VydF9oYXNfbm9fd3JpdGVfdmFsaWRhdG9yKCdUZXN0VmFsaWRhdG9yc1xUZXN0U2VydmljZV90ZXN0X3Jlc3VsdCcpOwotCi1mdW5jdGlvbiBhc3NlcnRfaGFzX2FfcmVhZF92YWxpZGF0b3IoJGNsYXNzKQotewotICAgIG15X2Fzc2VydChoYXNfcmVhZF92YWxpZGF0b3JfbWV0aG9kKCRjbGFzcyksCi0gICAgICAgICAgICAgICRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIGhhdmUgYSByZWFkIHZhbGlkYXRvcicpOwotfQotCi1mdW5jdGlvbiBhc3NlcnRfaGFzX25vX3JlYWRfdmFsaWRhdG9yKCRjbGFzcykKLXsKLSAgICBteV9hc3NlcnQoIWhhc19yZWFkX3ZhbGlkYXRvcl9tZXRob2QoJGNsYXNzKSwKLSAgICAgICAgICAgICAgJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgbm90IGhhdmUgYSByZWFkIHZhbGlkYXRvcicpOwotfQotCi1mdW5jdGlvbiBhc3NlcnRfaGFzX2Ffd3JpdGVfdmFsaWRhdG9yKCRjbGFzcykKLXsKLSAgICBteV9hc3NlcnQoaGFzX3dyaXRlX3ZhbGlkYXRvcl9tZXRob2QoJGNsYXNzKSwKLSAgICAgICAgICAgICAgJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOwotfQotCi1mdW5jdGlvbiBhc3NlcnRfaGFzX25vX3dyaXRlX3ZhbGlkYXRvcigkY2xhc3MpCi17Ci0gICAgbXlfYXNzZXJ0KCFoYXNfd3JpdGVfdmFsaWRhdG9yX21ldGhvZCgkY2xhc3MpLAotICAgICAgICAgICAgICAkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBub3QgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOwotfQotCi1mdW5jdGlvbiBhc3NlcnRfcHJvdG9jb2xfZXhjZXB0aW9uX3Rocm93bigkY2FsbGFibGUsICRtZXNzYWdlKQotewotICAgIHRyeSB7Ci0gICAgICAgIGNhbGxfdXNlcl9mdW5jKCRjYWxsYWJsZSk7Ci0gICAgICAgIG15X2Fzc2VydChmYWxzZSwgJG1lc3NhZ2UpOwotICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiAkZSkgewotICAgIH0KLX0KLQotZnVuY3Rpb24gaGFzX3dyaXRlX3ZhbGlkYXRvcl9tZXRob2QoJGNsYXNzKQotewotICAgICRyYyA9IG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7Ci0KLSAgICByZXR1cm4gJHJjLT5oYXNNZXRob2QoJ192YWxpZGF0ZUZvcldyaXRlJyk7Ci19Ci0KLWZ1bmN0aW9uIGhhc19yZWFkX3ZhbGlkYXRvcl9tZXRob2QoJGNsYXNzKQotewotICAgICRyYyA9IG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7Ci0KLSAgICByZXR1cm4gJHJjLT5oYXNNZXRob2QoJ192YWxpZGF0ZUZvclJlYWQnKTsKLX0KLQotZnVuY3Rpb24gbXlfYXNzZXJ0KCRzb21ldGhpbmcsICRtZXNzYWdlKQotewotICAgIGlmICghJHNvbWV0aGluZykgewotICAgICAgICBmd3JpdGUoU1RERVJSLCBiYXNlbmFtZShfX0ZJTEVfXykgLiAiIEZBSUxFRDogJG1lc3NhZ2VcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvQmFzZVZhbGlkYXRvclRlc3QucGhwIGIvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yVGVzdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyOTA4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvQmFzZVZhbGlkYXRvclRlc3QucGhwCkBAIC0wLDAgKzEsMTU0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnQ7CisKK3VzZSBQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZTsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKKworYWJzdHJhY3QgY2xhc3MgQmFzZVZhbGlkYXRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW1wdHlTdHJ1Y3RWYWxpZGF0b3IoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vUmVhZFZhbGlkYXRvcignVGhyaWZ0VGVzdFxFbXB0eVN0cnVjdCcpOworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9Xcml0ZVZhbGlkYXRvcignVGhyaWZ0VGVzdFxFbXB0eVN0cnVjdCcpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qm9ua1ZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCdUaHJpZnRUZXN0XEJvbmsnKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEhhc1dyaXRlVmFsaWRhdG9yKCdUaHJpZnRUZXN0XEJvbmsnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdEFWYWxpZGF0b3IoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydEhhc1JlYWRWYWxpZGF0b3IoJ1RocmlmdFRlc3RcU3RydWN0QScpOworICAgICAgICAkdGhpcy0+YXNzZXJ0SGFzV3JpdGVWYWxpZGF0b3IoJ1RocmlmdFRlc3RcU3RydWN0QScpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VW5pb25PZlN0cmluZ3NWYWxpZGF0b3IoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vV3JpdGVWYWxpZGF0b3IoJ1Rlc3RWYWxpZGF0b3JzXFVuaW9uT2ZTdHJpbmdzJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXJ2aWNlUmVzdWx0VmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1JlYWRWYWxpZGF0b3IoJ1Rlc3RWYWxpZGF0b3JzXFRlc3RTZXJ2aWNlX3Rlc3RfcmVzdWx0Jyk7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1dyaXRlVmFsaWRhdG9yKCdUZXN0VmFsaWRhdG9yc1xUZXN0U2VydmljZV90ZXN0X3Jlc3VsdCcpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0UmVhZEVtcHR5KCkKKyAgICB7CisgICAgICAgICRib25rID0gbmV3IFxUaHJpZnRUZXN0XEJvbmsoKTsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCJcMDAwIik7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgICAgICAgICRib25rLT5yZWFkKCRwcm90b2NvbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RXcml0ZUVtcHR5KCkKKyAgICB7CisgICAgICAgICRib25rID0gbmV3IFxUaHJpZnRUZXN0XEJvbmsoKTsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAkYm9uay0+d3JpdGUoJHByb3RvY29sKTsKKyAgICAgICAgICAgICR0aGlzLT5mYWlsKCdCb25rIHdhcyBhYmxlIHRvIHdyaXRlIGFuIGVtcHR5IG9iamVjdCcpOworICAgICAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gJGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0V3JpdGVXaXRoTWlzc2luZ1JlcXVpcmVkKCkKKyAgICB7CisgICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIG5vdCBhYmxlIHRvIHdyaXRlIFN0cnVjdEEgd2l0aCBhIG1pc3NpbmcgcmVxdWlyZWQgZmllbGQKKyAgICAgICAgJHN0cnVjdGEgPSBuZXcgXFRocmlmdFRlc3RcU3RydWN0QSgpOworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgJHN0cnVjdGEtPndyaXRlKCRwcm90b2NvbCk7CisgICAgICAgICAgICAkdGhpcy0+ZmFpbCgnU3RydWN0QSB3YXMgYWJsZSB0byB3cml0ZSBhbiBlbXB0eSBvYmplY3QnKTsKKyAgICAgICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uICRlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFJlYWRTdHJ1Y3RBKCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcihiYXNlNjRfZGVjb2RlKCdDd0FCQUFBQUEyRmlZd0E9JykpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7CisgICAgICAgICRzdHJ1Y3RhLT5yZWFkKCRwcm90b2NvbCk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoImFiYyIsICRzdHJ1Y3RhLT5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFdyaXRlU3RydWN0QSgpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgJHN0cnVjdGEgPSBuZXcgXFRocmlmdFRlc3RcU3RydWN0QSgpOworICAgICAgICAkc3RydWN0YS0+cyA9ICJhYmMiOworICAgICAgICAkc3RydWN0YS0+d3JpdGUoJHByb3RvY29sKTsKKyAgICAgICAgJHdyaXRlUmVzdWx0ID0gYmFzZTY0X2VuY29kZSgkdHJhbnNwb3J0LT5nZXRCdWZmZXIoKSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ0N3QUJBQUFBQTJGaVl3QT0nLCAkd3JpdGVSZXN1bHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gYXNzZXJ0SGFzUmVhZFZhbGlkYXRvcigkY2xhc3MpCisgICAgeworICAgICAgICBpZiAoIXN0YXRpYzo6aGFzUmVhZFZhbGlkYXRvcigkY2xhc3MpKSB7CisgICAgICAgICAgICBzdGF0aWM6OmZhaWwoJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgaGF2ZSBhIHJlYWQgdmFsaWRhdG9yJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGFzc2VydE5vUmVhZFZhbGlkYXRvcigkY2xhc3MpCisgICAgeworICAgICAgICBpZiAoc3RhdGljOjpoYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBub3QgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnRIYXNXcml0ZVZhbGlkYXRvcigkY2xhc3MpCisgICAgeworICAgICAgICBpZiAoIXN0YXRpYzo6aGFzV3JpdGVWYWxpZGF0b3IoJGNsYXNzKSkgeworICAgICAgICAgICAgc3RhdGljOjpmYWlsKCRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIGhhdmUgYSB3cml0ZSB2YWxpZGF0b3InKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gYXNzZXJ0Tm9Xcml0ZVZhbGlkYXRvcigkY2xhc3MpCisgICAgeworICAgICAgICBpZiAoc3RhdGljOjpoYXNXcml0ZVZhbGlkYXRvcigkY2xhc3MpKSB7CisgICAgICAgICAgICBzdGF0aWM6OmZhaWwoJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgbm90IGhhdmUgYSB3cml0ZSB2YWxpZGF0b3InKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhc1JlYWRWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgJHJjID0gbmV3IFxSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKTsKKworICAgICAgICByZXR1cm4gJHJjLT5oYXNNZXRob2QoJ192YWxpZGF0ZUZvclJlYWQnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoYXNXcml0ZVZhbGlkYXRvcigkY2xhc3MpCisgICAgeworICAgICAgICAkcmMgPSBuZXcgXFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpOworCisgICAgICAgIHJldHVybiAkcmMtPmhhc01ldGhvZCgnX3ZhbGlkYXRlRm9yV3JpdGUnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3QucGhwIGIvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9WYWxpZGF0b3JUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTZjN2E5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9WYWxpZGF0b3JUZXN0LnBocApAQCAtMCwwICsxLDQxIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnQ7CisKK3JlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKK3VzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7CisKKy8qKgorICogQ2xhc3MgVGVzdFZhbGlkYXRvcnMKKyAqIEBwYWNrYWdlIFRlc3RcVGhyaWZ0CisgKgorICogQHJ1blRlc3RzSW5TZXBhcmF0ZVByb2Nlc3NlcworICovCitjbGFzcyBWYWxpZGF0b3JUZXN0IGV4dGVuZHMgQmFzZVZhbGlkYXRvclRlc3QKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VXAoKQorICAgIHsKKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocHYnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3RPb3AucGhwIGIvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9WYWxpZGF0b3JUZXN0T29wLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2JjYTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9WYWxpZGF0b3JUZXN0T29wLnBocApAQCAtMCwwICsxLDQxIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnQ7CisKK3JlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKwordXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKKworLyoqCisgKiBDbGFzcyBUZXN0VmFsaWRhdG9yc09vcAorICogQHBhY2thZ2UgVGVzdFxUaHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIFZhbGlkYXRvclRlc3RPb3AgZXh0ZW5kcyBCYXNlVmFsaWRhdG9yVGVzdAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwdm8nKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcHkvQ01ha2VMaXN0cy50eHQgYi9saWIvcHkvQ01ha2VMaXN0cy50eHQKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBlZjk4N2I2Li43YmI5MWZlCi0tLSBhL2xpYi9weS9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvcHkvQ01ha2VMaXN0cy50eHQKQEAgLTI0LDMgKzI0LDggQEAKICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KICAgICBDT01NRU5UICJCdWlsZGluZyBQeXRob24gbGlicmFyeSIKICkKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfdGVzdChQeXRob25UZXN0U1NMU29ja2V0ICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5KQorICAgIGFkZF90ZXN0KFB5dGhvblRocmlmdEpzb24gJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvdGhyaWZ0X2pzb24ucHkpCitlbmRpZigpCmRpZmYgLS1naXQgYS9saWIvcHkvTUFOSUZFU1QuaW4gYi9saWIvcHkvTUFOSUZFU1QuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1NGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9NQU5JRkVTVC5pbgpAQCAtMCwwICsxIEBACitpbmNsdWRlIHNyYy9leHQvKgpkaWZmIC0tZ2l0IGEvbGliL3B5L01ha2VmaWxlLmFtIGIvbGliL3B5L01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMmNkYmIyNC4uNDZlNDQwNQotLS0gYS9saWIvcHkvTWFrZWZpbGUuYW0KKysrIGIvbGliL3B5L01ha2VmaWxlLmFtCkBAIC0xOSw3ICsxOSwxOCBAQAogQVVUT01BS0VfT1BUSU9OUyA9IHNlcmlhbC10ZXN0cwogREVTVERJUiA/PSAvCiAKLWFsbC1sb2NhbDoKK2lmIFdJVEhfUFkzCitweTMtYnVpbGQ6CisJJChQWVRIT04zKSBzZXR1cC5weSBidWlsZAorcHkzLXRlc3Q6IHB5My1idWlsZAorCSQoUFlUSE9OMykgdGVzdC90aHJpZnRfanNvbi5weQorCSQoUFlUSE9OMykgdGVzdC90ZXN0X3NzbHNvY2tldC5weQorZWxzZQorcHkzLWJ1aWxkOgorcHkzLXRlc3Q6CitlbmRpZgorCithbGwtbG9jYWw6IHB5My1idWlsZAogCSQoUFlUSE9OKSBzZXR1cC5weSBidWlsZAogCiAjIFdlJ3JlIGlnbm9yaW5nIHByZWZpeCBoZXJlIGJlY2F1c2Ugc2l0ZS1wYWNrYWdlcyBzZWVtcyB0byBiZQpAQCAtMjksMTYgKzQwLDI2IEBACiBpbnN0YWxsLWV4ZWMtaG9vazoKIAkkKFBZVEhPTikgc2V0dXAucHkgaW5zdGFsbCAtLXJvb3Q9JChERVNURElSKSAtLXByZWZpeD0kKFBZX1BSRUZJWCkgJChQWVRIT05fU0VUVVBVVElMX0FSR1MpCiAKK2NoZWNrLWxvY2FsOiBhbGwgcHkzLXRlc3QKKwkkKFBZVEhPTikgdGVzdC90aHJpZnRfanNvbi5weQorCSQoUFlUSE9OKSB0ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5CisKIGNsZWFuLWxvY2FsOgogCSQoUk0pIC1yIGJ1aWxkCisJZmluZCAuIC10eXBlIGYgXCggLWluYW1lICIqLnB5YyIgXCkgfCB4YXJncyBybSAtZgorCWZpbmQgLiAtdHlwZSBkIFwoIC1pbmFtZSAiX19weWNhY2hlX18iIC1vciAtaW5hbWUgIl90cmlhbF90ZW1wIiBcKSB8IHhhcmdzIHJtIC1yZgogCi1jaGVjay1sb2NhbDogYWxsCitkaXN0LWhvb2s6CisJZmluZCAkKGRpc3RkaXIpIC10eXBlIGYgXCggLWluYW1lICIqLnB5YyIgXCkgfCB4YXJncyBybSAtZgorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIFwoIC1pbmFtZSAiX19weWNhY2hlX18iIC1vciAtaW5hbWUgIl90cmlhbF90ZW1wIiBcKSB8IHhhcmdzIHJtIC1yZgogCiBFWFRSQV9ESVNUID0gXAogCUNNYWtlTGlzdHMudHh0IFwKKwlNQU5JRkVTVC5pbiBcCiAJY29kaW5nX3N0YW5kYXJkcy5tZCBcCiAJY29tcGF0IFwKIAlzZXR1cC5weSBcCiAJc2V0dXAuY2ZnIFwKIAlzcmMgXAorCXRlc3QgXAogCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3B5L3NldHVwLmNmZyBiL2xpYi9weS9zZXR1cC5jZmcKaW5kZXggYzZkYWI0MC4uYzllZDBhZSAxMDA2NDQKLS0tIGEvbGliL3B5L3NldHVwLmNmZworKysgYi9saWIvcHkvc2V0dXAuY2ZnCkBAIC0yLDMgKzIsNSBAQAogb3B0aW1pemUgPSAxCiBbbWV0YWRhdGFdCiBkZXNjcmlwdGlvbi1maWxlID0gUkVBRE1FLm1kCitbZmxha2U4XQorbWF4LWxpbmUtbGVuZ3RoID0gMTAwCmRpZmYgLS1naXQgYS9saWIvcHkvc2V0dXAucHkgYi9saWIvcHkvc2V0dXAucHkKaW5kZXggODM2Y2Y3MS4uMmJhMjY5MSAxMDA2NDQKLS0tIGEvbGliL3B5L3NldHVwLnB5CisrKyBiL2xpYi9weS9zZXR1cC5weQpAQCAtOSw3ICs5LDcgQEAKICMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KQEAgLTIyLDggKzIyLDggQEAKIGltcG9ydCBzeXMKIHRyeToKICAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KLWV4Y2VwdDoKLSAgICBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uLCBDb21tYW5kCitleGNlcHQgRXhjZXB0aW9uOgorICAgIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KIAogZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dAogZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBDQ29tcGlsZXJFcnJvciwgRGlzdHV0aWxzRXhlY0Vycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yCkBAIC0zMSw3NCArMzEsMTAzIEBACiAjIEZpeCB0byBidWlsZCBzZGlzdCB1bmRlciB2YWdyYW50CiBpbXBvcnQgb3MKIGlmICd2YWdyYW50JyBpbiBzdHIob3MuZW52aXJvbik6Ci0gICAgZGVsIG9zLmxpbmsKKyAgICB0cnk6CisgICAgICAgIGRlbCBvcy5saW5rCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBwYXNzCiAKLWluY2x1ZGVfZGlycyA9IFtdCitpbmNsdWRlX2RpcnMgPSBbJ3NyYyddCiBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKICAgICBpbmNsdWRlX2RpcnMuYXBwZW5kKCdjb21wYXQvd2luMzInKQogICAgIGV4dF9lcnJvcnMgPSAoQ0NvbXBpbGVyRXJyb3IsIERpc3R1dGlsc0V4ZWNFcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgSU9FcnJvcikKIGVsc2U6CiAgICAgZXh0X2Vycm9ycyA9IChDQ29tcGlsZXJFcnJvciwgRGlzdHV0aWxzRXhlY0Vycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKQogCisKIGNsYXNzIEJ1aWxkRmFpbGVkKEV4Y2VwdGlvbik6CiAgICAgcGFzcwogCisKIGNsYXNzIHZlX2J1aWxkX2V4dChidWlsZF9leHQpOgogICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGJ1aWxkX2V4dC5ydW4oc2VsZikKLSAgICAgICAgZXhjZXB0IERpc3R1dGlsc1BsYXRmb3JtRXJyb3IgYXMgeDoKKyAgICAgICAgZXhjZXB0IERpc3R1dGlsc1BsYXRmb3JtRXJyb3I6CiAgICAgICAgICAgICByYWlzZSBCdWlsZEZhaWxlZCgpCiAKICAgICBkZWYgYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGJ1aWxkX2V4dC5idWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KQotICAgICAgICBleGNlcHQgZXh0X2Vycm9ycyBhcyB4OgorICAgICAgICBleGNlcHQgZXh0X2Vycm9yczoKICAgICAgICAgICAgIHJhaXNlIEJ1aWxkRmFpbGVkKCkKIAorCiBkZWYgcnVuX3NldHVwKHdpdGhfYmluYXJ5KToKICAgICBpZiB3aXRoX2JpbmFyeToKICAgICAgICAgZXh0ZW5zaW9ucyA9IGRpY3QoCi0gICAgICAgICAgICBleHRfbW9kdWxlcyA9IFsKLSAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uKCd0aHJpZnQucHJvdG9jb2wuZmFzdGJpbmFyeScsCi0gICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMgPSBbJ3NyYy9wcm90b2NvbC9mYXN0YmluYXJ5LmMnXSwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzID0gaW5jbHVkZV9kaXJzLAotICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGV4dF9tb2R1bGVzPVsKKyAgICAgICAgICAgICAgICBFeHRlbnNpb24oJ3RocmlmdC5wcm90b2NvbC5mYXN0YmluYXJ5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz1bCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2V4dC9tb2R1bGUuY3BwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvZXh0L3R5cGVzLmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2V4dC9iaW5hcnkuY3BwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvZXh0L2NvbXBhY3QuY3BwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPWluY2x1ZGVfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgXSwKICAgICAgICAgICAgIGNtZGNsYXNzPWRpY3QoYnVpbGRfZXh0PXZlX2J1aWxkX2V4dCkKICAgICAgICAgKQogICAgIGVsc2U6CiAgICAgICAgIGV4dGVuc2lvbnMgPSBkaWN0KCkKLSAgICAgICAgCi0gICAgc2V0dXAobmFtZSA9ICd0aHJpZnQnLAotICAgICAgICB2ZXJzaW9uID0gJzAuOS4zJywKLSAgICAgICAgZGVzY3JpcHRpb24gPSAnUHl0aG9uIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtJywKLSAgICAgICAgYXV0aG9yID0gJ1RocmlmdCBEZXZlbG9wZXJzJywKLSAgICAgICAgYXV0aG9yX2VtYWlsID0gJ2RldkB0aHJpZnQuYXBhY2hlLm9yZycsCi0gICAgICAgIHVybCA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnLAotICAgICAgICBsaWNlbnNlID0gJ0FwYWNoZSBMaWNlbnNlIDIuMCcsCi0gICAgICAgIHBhY2thZ2VzID0gWwotICAgICAgICAgICAgJ3RocmlmdCcsCi0gICAgICAgICAgICAndGhyaWZ0LnByb3RvY29sJywKLSAgICAgICAgICAgICd0aHJpZnQudHJhbnNwb3J0JywKLSAgICAgICAgICAgICd0aHJpZnQuc2VydmVyJywKLSAgICAgICAgXSwKLSAgICAgICAgcGFja2FnZV9kaXIgPSB7J3RocmlmdCcgOiAnc3JjJ30sCi0gICAgICAgIGNsYXNzaWZpZXJzID0gWwotICAgICAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUnLAotICAgICAgICAgICAgJ0Vudmlyb25tZW50IDo6IENvbnNvbGUnLAotICAgICAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnLAotICAgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbicsCi0gICAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDInLAotICAgICAgICAgICAgJ1RvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcycsCi0gICAgICAgICAgICAnVG9waWMgOjogU3lzdGVtIDo6IE5ldHdvcmtpbmcnCi0gICAgICAgIF0sCi0gICAgICAgIHVzZV8ydG8zID0gVHJ1ZSwKLSAgICAgICAgKipleHRlbnNpb25zCi0gICAgKQorCisgICAgc3NsX2RlcHMgPSBbXQorICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgc3NsX2RlcHMuYXBwZW5kKCdpcGFkZHJlc3MnKQorICAgIGlmIHN5cy5oZXh2ZXJzaW9uIDwgMHgwMzA1MDAwMDoKKyAgICAgICAgc3NsX2RlcHMuYXBwZW5kKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lPj0zLjUnKQorICAgIHRvcm5hZG9fZGVwcyA9IFsndG9ybmFkbz49NC4wJ10KKyAgICB0d2lzdGVkX2RlcHMgPSBbJ3R3aXN0ZWQnXQorCisgICAgc2V0dXAobmFtZT0ndGhyaWZ0JywKKyAgICAgICAgICB2ZXJzaW9uPScwLjEzLjAnLAorICAgICAgICAgIGRlc2NyaXB0aW9uPSdQeXRob24gYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0nLAorICAgICAgICAgIGF1dGhvcj0nQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzJywKKyAgICAgICAgICBhdXRob3JfZW1haWw9J2RldkB0aHJpZnQuYXBhY2hlLm9yZycsCisgICAgICAgICAgdXJsPSdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnLAorICAgICAgICAgIGxpY2Vuc2U9J0FwYWNoZSBMaWNlbnNlIDIuMCcsCisgICAgICAgICAgaW5zdGFsbF9yZXF1aXJlcz1bJ3NpeD49MS43LjInXSwKKyAgICAgICAgICBleHRyYXNfcmVxdWlyZT17CisgICAgICAgICAgICAgICdzc2wnOiBzc2xfZGVwcywKKyAgICAgICAgICAgICAgJ3Rvcm5hZG8nOiB0b3JuYWRvX2RlcHMsCisgICAgICAgICAgICAgICd0d2lzdGVkJzogdHdpc3RlZF9kZXBzLAorICAgICAgICAgICAgICAnYWxsJzogc3NsX2RlcHMgKyB0b3JuYWRvX2RlcHMgKyB0d2lzdGVkX2RlcHMsCisgICAgICAgICAgfSwKKyAgICAgICAgICBwYWNrYWdlcz1bCisgICAgICAgICAgICAgICd0aHJpZnQnLAorICAgICAgICAgICAgICAndGhyaWZ0LnByb3RvY29sJywKKyAgICAgICAgICAgICAgJ3RocmlmdC50cmFuc3BvcnQnLAorICAgICAgICAgICAgICAndGhyaWZ0LnNlcnZlcicsCisgICAgICAgICAgXSwKKyAgICAgICAgICBwYWNrYWdlX2Rpcj17J3RocmlmdCc6ICdzcmMnfSwKKyAgICAgICAgICBjbGFzc2lmaWVycz1bCisgICAgICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlJywKKyAgICAgICAgICAgICAgJ0Vudmlyb25tZW50IDo6IENvbnNvbGUnLAorICAgICAgICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsCisgICAgICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24nLAorICAgICAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDInLAorICAgICAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMnLAorICAgICAgICAgICAgICAnVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzJywKKyAgICAgICAgICAgICAgJ1RvcGljIDo6IFN5c3RlbSA6OiBOZXR3b3JraW5nJworICAgICAgICAgIF0sCisgICAgICAgICAgemlwX3NhZmU9RmFsc2UsCisgICAgICAgICAgKipleHRlbnNpb25zCisgICAgICAgICAgKQorCiAKIHRyeToKLSAgICBydW5fc2V0dXAoVHJ1ZSkKKyAgICB3aXRoX2JpbmFyeSA9IFRydWUKKyAgICBydW5fc2V0dXAod2l0aF9iaW5hcnkpCiBleGNlcHQgQnVpbGRGYWlsZWQ6CiAgICAgcHJpbnQoKQogICAgIHByaW50KCcqJyAqIDgwKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHkgYi9saWIvcHkvc3JjL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5weQppbmRleCBhOGQ1NTY1Li5mZjg4NDMwIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5weQorKysgYi9saWIvcHkvc3JjL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5weQpAQCAtMTcsNDIgKzE3LDY2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IsIFRNZXNzYWdlVHlwZSwgVEV4Y2VwdGlvbgorZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUUHJvY2Vzc29yLCBUTWVzc2FnZVR5cGUKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xEZWNvcmF0b3IsIFRNdWx0aXBsZXhlZFByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaW1wb3J0IFRQcm90b2NvbEV4Y2VwdGlvbgorCiAKIGNsYXNzIFRNdWx0aXBsZXhlZFByb2Nlc3NvcihUUHJvY2Vzc29yKToKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYuc2VydmljZXMgPSB7fQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZhdWx0UHJvY2Vzc29yID0gTm9uZQorICAgICAgICBzZWxmLnNlcnZpY2VzID0ge30KIAotICBkZWYgcmVnaXN0ZXJQcm9jZXNzb3Ioc2VsZiwgc2VydmljZU5hbWUsIHByb2Nlc3Nvcik6Ci0gICAgc2VsZi5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBwcm9jZXNzb3IKKyAgICBkZWYgcmVnaXN0ZXJEZWZhdWx0KHNlbGYsIHByb2Nlc3Nvcik6CisgICAgICAgICIiIgorICAgICAgICBJZiBhIG5vbi1tdWx0aXBsZXhlZCBwcm9jZXNzb3IgY29ubmVjdHMgdG8gdGhlIHNlcnZlciBhbmQgd2FudHMgdG8KKyAgICAgICAgY29tbXVuaWNhdGUsIHVzZSB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRvIGhhbmRsZSBpdC4gIFRoaXMgbWVjaGFuaXNtCisgICAgICAgIGFsbG93cyBzZXJ2ZXJzIHRvIHVwZ3JhZGUgZnJvbSBub24tbXVsdGlwbGV4ZWQgdG8gbXVsdGlwbGV4ZWQgaW4gYQorICAgICAgICBiYWNrd2FyZHMtY29tcGF0aWJsZSB3YXkgYW5kIHN0aWxsIGhhbmRsZSBvbGQgY2xpZW50cy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZGVmYXVsdFByb2Nlc3NvciA9IHByb2Nlc3NvcgogCi0gIGRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6Ci0gICAgKG5hbWUsIHR5cGUsIHNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsKLSAgICBpZiB0eXBlICE9IFRNZXNzYWdlVHlwZS5DQUxMICYgdHlwZSAhPSBUTWVzc2FnZVR5cGUuT05FV0FZOgotICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiVE11bHRpcGxleCBwcm90b2NvbCBvbmx5IHN1cHBvcnRzIENBTEwgJiBPTkVXQVkiKQorICAgIGRlZiByZWdpc3RlclByb2Nlc3NvcihzZWxmLCBzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKToKKyAgICAgICAgc2VsZi5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBwcm9jZXNzb3IKIAotICAgIGluZGV4ID0gbmFtZS5maW5kKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUikKLSAgICBpZiBpbmRleCA8IDA6Ci0gICAgICByYWlzZSBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG5hbWUgKyAiLiBEaWQgeW91IGZvcmdldCB0byB1c2UgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpCisgICAgZGVmIG9uX21lc3NhZ2VfYmVnaW4oc2VsZiwgZnVuYyk6CisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5zZXJ2aWNlcy5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLnNlcnZpY2VzW2tleV0ub25fbWVzc2FnZV9iZWdpbihmdW5jKQogCi0gICAgc2VydmljZU5hbWUgPSBuYW1lWzA6aW5kZXhdCi0gICAgY2FsbCA9IG5hbWVbaW5kZXgrbGVuKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUik6XQotICAgIGlmIG5vdCBzZXJ2aWNlTmFtZSBpbiBzZWxmLnNlcnZpY2VzOgotICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogIiArIHNlcnZpY2VOYW1lICsgIi4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpCisgICAgZGVmIHByb2Nlc3Moc2VsZiwgaXByb3QsIG9wcm90KToKKyAgICAgICAgKG5hbWUsIHR5cGUsIHNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKQorICAgICAgICBpZiB0eXBlICE9IFRNZXNzYWdlVHlwZS5DQUxMIGFuZCB0eXBlICE9IFRNZXNzYWdlVHlwZS5PTkVXQVk6CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAiVE11bHRpcGxleGVkUHJvdG9jb2wgb25seSBzdXBwb3J0cyBDQUxMICYgT05FV0FZIikKIAotICAgIHN0YW5kYXJkTWVzc2FnZSA9ICgKLSAgICAgIGNhbGwsCi0gICAgICB0eXBlLAotICAgICAgc2VxaWQKLSAgICApCi0gICAgcmV0dXJuIHNlbGYuc2VydmljZXNbc2VydmljZU5hbWVdLnByb2Nlc3MoU3RvcmVkTWVzc2FnZVByb3RvY29sKGlwcm90LCBzdGFuZGFyZE1lc3NhZ2UpLCBvcHJvdCkKKyAgICAgICAgaW5kZXggPSBuYW1lLmZpbmQoVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKQorICAgICAgICBpZiBpbmRleCA8IDA6CisgICAgICAgICAgICBpZiBzZWxmLmRlZmF1bHRQcm9jZXNzb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVmYXVsdFByb2Nlc3Nvci5wcm9jZXNzKAorICAgICAgICAgICAgICAgICAgICBTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIChuYW1lLCB0eXBlLCBzZXFpZCkpLCBvcHJvdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICIgKyBuYW1lICsgIi4gICIgKworICAgICAgICAgICAgICAgICAgICAiRGlkIHlvdSBmb3JnZXQgdG8gdXNlIFRNdWx0aXBsZXhlZFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpCisKKyAgICAgICAgc2VydmljZU5hbWUgPSBuYW1lWzA6aW5kZXhdCisgICAgICAgIGNhbGwgPSBuYW1lW2luZGV4ICsgbGVuKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUik6XQorICAgICAgICBpZiBzZXJ2aWNlTmFtZSBub3QgaW4gc2VsZi5zZXJ2aWNlczoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiAiICsgc2VydmljZU5hbWUgKyAiLiAgIiArCisgICAgICAgICAgICAgICAgIkRpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKQorCisgICAgICAgIHN0YW5kYXJkTWVzc2FnZSA9IChjYWxsLCB0eXBlLCBzZXFpZCkKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VydmljZXNbc2VydmljZU5hbWVdLnByb2Nlc3MoCisgICAgICAgICAgICBTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIHN0YW5kYXJkTWVzc2FnZSksIG9wcm90KQogCiAKIGNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChUUHJvdG9jb2xEZWNvcmF0b3IuVFByb3RvY29sRGVjb3JhdG9yKToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sLCBtZXNzYWdlQmVnaW4pOgotICAgIFRQcm90b2NvbERlY29yYXRvci5UUHJvdG9jb2xEZWNvcmF0b3IuX19pbml0X18oc2VsZiwgcHJvdG9jb2wpCi0gICAgc2VsZi5tZXNzYWdlQmVnaW4gPSBtZXNzYWdlQmVnaW4KKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wsIG1lc3NhZ2VCZWdpbik6CisgICAgICAgIHNlbGYubWVzc2FnZUJlZ2luID0gbWVzc2FnZUJlZ2luCiAKLSAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYubWVzc2FnZUJlZ2luCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1lc3NhZ2VCZWdpbgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9UUmVjdXJzaXZlLnB5IGIvbGliL3B5L3NyYy9UUmVjdXJzaXZlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjIwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL1RSZWN1cnNpdmUucHkKQEAgLTAsMCArMSw4MyBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscworCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRUeXBlCisKK1RZUEVfSURYID0gMQorU1BFQ19BUkdTX0lEWCA9IDMKK1NQRUNfQVJHU19DTEFTU19SRUZfSURYID0gMAorU1BFQ19BUkdTX1RIUklGVF9TUEVDX0lEWCA9IDEKKworCitkZWYgZml4X3NwZWMoYWxsX3N0cnVjdHMpOgorICAgICIiIldpcmUgdXAgcmVjdXJzaXZlIHJlZmVyZW5jZXMgZm9yIGFsbCBUU3RydWN0IGRlZmluaXRpb25zIGluc2lkZSBvZiBlYWNoIHRocmlmdF9zcGVjLiIiIgorICAgIGZvciBzdHJ1YyBpbiBhbGxfc3RydWN0czoKKyAgICAgICAgc3BlYyA9IHN0cnVjLnRocmlmdF9zcGVjCisgICAgICAgIGZvciB0aHJpZnRfc3BlYyBpbiBzcGVjOgorICAgICAgICAgICAgaWYgdGhyaWZ0X3NwZWMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiB0aHJpZnRfc3BlY1tUWVBFX0lEWF0gPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICAgICAgICAgIG90aGVyID0gdGhyaWZ0X3NwZWNbU1BFQ19BUkdTX0lEWF1bU1BFQ19BUkdTX0NMQVNTX1JFRl9JRFhdLnRocmlmdF9zcGVjCisgICAgICAgICAgICAgICAgdGhyaWZ0X3NwZWNbU1BFQ19BUkdTX0lEWF1bU1BFQ19BUkdTX1RIUklGVF9TUEVDX0lEWF0gPSBvdGhlcgorICAgICAgICAgICAgZWxpZiB0aHJpZnRfc3BlY1tUWVBFX0lEWF0gaW4gKFRUeXBlLkxJU1QsIFRUeXBlLlNFVCk6CisgICAgICAgICAgICAgICAgX2ZpeF9saXN0X29yX3NldCh0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXSkKKyAgICAgICAgICAgIGVsaWYgdGhyaWZ0X3NwZWNbVFlQRV9JRFhdID09IFRUeXBlLk1BUDoKKyAgICAgICAgICAgICAgICBfZml4X21hcCh0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXSkKKworCitkZWYgX2ZpeF9saXN0X29yX3NldChlbGVtZW50X3R5cGUpOgorICAgICMgRm9yIGEgbGlzdCBvciBzZXQsIHRoZSB0aHJpZnRfc3BlYyBlbnRyeSBsb29rcyBsaWtlLAorICAgICMgKDEsIFRUeXBlLkxJU1QsICdsaXN0ZXInLCAoVFR5cGUuU1RSVUNULCBbUmVjTGlzdCwgTm9uZV0sIEZhbHNlKSwgTm9uZSwgKSwgICMgMQorICAgICMgc28gYGBlbGVtZW50X3R5cGVgYCB3aWxsIGJlLAorICAgICMgKFRUeXBlLlNUUlVDVCwgW1JlY0xpc3QsIE5vbmVdLCBGYWxzZSkKKyAgICBpZiBlbGVtZW50X3R5cGVbMF0gPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICBlbGVtZW50X3R5cGVbMV1bMV0gPSBlbGVtZW50X3R5cGVbMV1bMF0udGhyaWZ0X3NwZWMKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVswXSBpbiAoVFR5cGUuTElTVCwgVFR5cGUuU0VUKToKKyAgICAgICAgX2ZpeF9saXN0X29yX3NldChlbGVtZW50X3R5cGVbMV0pCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMF0gPT0gVFR5cGUuTUFQOgorICAgICAgICBfZml4X21hcChlbGVtZW50X3R5cGVbMV0pCisKKworZGVmIF9maXhfbWFwKGVsZW1lbnRfdHlwZSk6CisgICAgIyBGb3IgYSBtYXAgb2Yga2V5IC0+IHZhbHVlIHR5cGUsIGBgZWxlbWVudF90eXBlYGAgd2lsbCBiZSwKKyAgICAjIChUVHlwZS5JMTYsIE5vbmUsIFRUeXBlLlNUUlVDVCwgW1JlY01hcEJhc2ljLCBOb25lXSwgRmFsc2UpLCBOb25lLCApCisgICAgIyB3aGljaCBpcyBqdXN0IGEgbm9ybWFsIHN0cnVjdCBkZWZpbml0aW9uLgorICAgICMKKyAgICAjIEZvciBhIG1hcCBvZiBrZXkgLT4gbGlzdCAvIHNldCwgYGBlbGVtZW50X3R5cGVgYCB3aWxsIGJlLAorICAgICMgKFRUeXBlLkkxNiwgTm9uZSwgVFR5cGUuTElTVCwgKFRUeXBlLlNUUlVDVCwgW1JlY01hcExpc3QsIE5vbmVdLCBGYWxzZSksIEZhbHNlKQorICAgICMgYW5kIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgM3JkIGVsZW1lbnQgYXMgYSBsaXN0LgorICAgICMKKyAgICAjIEZvciBhIG1hcCBvZiBrZXkgLT4gbWFwLCBgYGVsZW1lbnRfdHlwZWBgIHdpbGwgYmUsCisgICAgIyAoVFR5cGUuSTE2LCBOb25lLCBUVHlwZS5NQVAsIChUVHlwZS5JMTYsIE5vbmUsIFRUeXBlLlNUUlVDVCwKKyAgICAjICBbUmVjTWFwTWFwLCBOb25lXSwgRmFsc2UpLCBGYWxzZSkKKyAgICAjIGFuZCBuZWVkIHRvIHByb2Nlc3MgM3JkIGVsZW1lbnQgYXMgYSBtYXAuCisKKyAgICAjIElzIHRoZSBtYXAga2V5IGEgc3RydWN0PworICAgIGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIGVsZW1lbnRfdHlwZVsxXVsxXSA9IGVsZW1lbnRfdHlwZVsxXVswXS50aHJpZnRfc3BlYworICAgIGVsaWYgZWxlbWVudF90eXBlWzBdIGluIChUVHlwZS5MSVNULCBUVHlwZS5TRVQpOgorICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZVsxXSkKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5NQVA6CisgICAgICAgIF9maXhfbWFwKGVsZW1lbnRfdHlwZVsxXSkKKworICAgICMgSXMgdGhlIG1hcCB2YWx1ZSBhIHN0cnVjdD8KKyAgICBpZiBlbGVtZW50X3R5cGVbMl0gPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICBlbGVtZW50X3R5cGVbM11bMV0gPSBlbGVtZW50X3R5cGVbM11bMF0udGhyaWZ0X3NwZWMKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVsyXSBpbiAoVFR5cGUuTElTVCwgVFR5cGUuU0VUKToKKyAgICAgICAgX2ZpeF9saXN0X29yX3NldChlbGVtZW50X3R5cGVbM10pCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMl0gPT0gVFR5cGUuTUFQOgorICAgICAgICBfZml4X21hcChlbGVtZW50X3R5cGVbM10pCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RTQ29ucy5weSBiL2xpYi9weS9zcmMvVFNDb25zLnB5CmluZGV4IGRhOGQyODMuLmJjNjdkNzAgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvVFNDb25zLnB5CisrKyBiL2xpYi9weS9zcmMvVFNDb25zLnB5CkBAIC0xOSwxNyArMTksMTggQEAKIAogZnJvbSBvcyBpbXBvcnQgcGF0aAogZnJvbSBTQ29ucy5CdWlsZGVyIGltcG9ydCBCdWlsZGVyCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgbWFwCiAKIAogZGVmIHNjb25zX2VudihlbnYsIGFkZD0nJyk6Ci0gIG9wYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguYWJzcGF0aCgnJFRBUkdFVCcpKQotICBsc3RyID0gJ3RocmlmdCAtLWdlbiBjcHAgLW8gJyArIG9wYXRoICsgJyAnICsgYWRkICsgJyAkU09VUkNFJwotICBjcHBidWlsZCA9IEJ1aWxkZXIoYWN0aW9uPWxzdHIpCi0gIGVudi5BcHBlbmQoQlVJTERFUlM9eydUaHJpZnRDcHAnOiBjcHBidWlsZH0pCisgICAgb3BhdGggPSBwYXRoLmRpcm5hbWUocGF0aC5hYnNwYXRoKCckVEFSR0VUJykpCisgICAgbHN0ciA9ICd0aHJpZnQgLS1nZW4gY3BwIC1vICcgKyBvcGF0aCArICcgJyArIGFkZCArICcgJFNPVVJDRScKKyAgICBjcHBidWlsZCA9IEJ1aWxkZXIoYWN0aW9uPWxzdHIpCisgICAgZW52LkFwcGVuZChCVUlMREVSUz17J1RocmlmdENwcCc6IGNwcGJ1aWxkfSkKIAogCiBkZWYgZ2VuX2NwcChlbnYsIGRpciwgZmlsZSk6Ci0gIHNjb25zX2VudihlbnYpCi0gIHN1ZmZpeGVzID0gWydfdHlwZXMuaCcsICdfdHlwZXMuY3BwJ10KLSAgdGFyZ2V0cyA9IG1hcChsYW1iZGEgczogJ2dlbi1jcHAvJyArIGZpbGUgKyBzLCBzdWZmaXhlcykKLSAgcmV0dXJuIGVudi5UaHJpZnRDcHAodGFyZ2V0cywgZGlyICsgZmlsZSArICcudGhyaWZ0JykKKyAgICBzY29uc19lbnYoZW52KQorICAgIHN1ZmZpeGVzID0gWydfdHlwZXMuaCcsICdfdHlwZXMuY3BwJ10KKyAgICB0YXJnZXRzID0gbWFwKGxhbWJkYSBzOiAnZ2VuLWNwcC8nICsgZmlsZSArIHMsIHN1ZmZpeGVzKQorICAgIHJldHVybiBlbnYuVGhyaWZ0Q3BwKHRhcmdldHMsIGRpciArIGZpbGUgKyAnLnRocmlmdCcpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RTZXJpYWxpemF0aW9uLnB5IGIvbGliL3B5L3NyYy9UU2VyaWFsaXphdGlvbi5weQppbmRleCA4YTU4ZDg5Li5mYmJlNzY4IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL1RTZXJpYWxpemF0aW9uLnB5CisrKyBiL2xpYi9weS9zcmMvVFNlcmlhbGl6YXRpb24ucHkKQEAgLTE3LDggKzE3LDggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gcHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotZnJvbSB0cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gLnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gLnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCiAKIGRlZiBzZXJpYWxpemUodGhyaWZ0X29iamVjdCwKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVFRvcm5hZG8ucHkgYi9saWIvcHkvc3JjL1RUb3JuYWRvLnB5CmluZGV4IGVmM2UwZjIuLjVlZmYxMWQgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvVFRvcm5hZG8ucHkKKysrIGIvbGliL3B5L3NyYy9UVG9ybmFkby5weQpAQCAtMTgsMTMgKzE4LDExIEBACiAjCiAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CitpbXBvcnQgbG9nZ2luZwogaW1wb3J0IHNvY2tldAogaW1wb3J0IHN0cnVjdAogCi1pbXBvcnQgbG9nZ2luZwotbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCi0KLWZyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uLCBUVHJhbnNwb3J0QmFzZSwgVE1lbW9yeUJ1ZmZlcgorZnJvbSAudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24sIFRUcmFuc3BvcnRCYXNlLCBUTWVtb3J5QnVmZmVyCiAKIGZyb20gaW8gaW1wb3J0IEJ5dGVzSU8KIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCkBAIC0zMyw2ICszMSw4IEBACiAKIF9fYWxsX18gPSBbJ1RUb3JuYWRvU2VydmVyJywgJ1RUb3JuYWRvU3RyZWFtVHJhbnNwb3J0J10KIAorbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKIAogY2xhc3MgX0xvY2sob2JqZWN0KToKICAgICBkZWYgX19pbml0X18oc2VsZik6CkBAIC0xNjQsMTQgKzE2NCwyMCBAQAogCiAgICAgQGdlbi5jb3JvdXRpbmUKICAgICBkZWYgaGFuZGxlX3N0cmVhbShzZWxmLCBzdHJlYW0sIGFkZHJlc3MpOgotICAgICAgICBob3N0LCBwb3J0ID0gYWRkcmVzcworICAgICAgICBob3N0LCBwb3J0ID0gYWRkcmVzc1s6Ml0KICAgICAgICAgdHJhbnMgPSBUVG9ybmFkb1N0cmVhbVRyYW5zcG9ydChob3N0PWhvc3QsIHBvcnQ9cG9ydCwgc3RyZWFtPXN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb19sb29wPXNlbGYuaW9fbG9vcCkKICAgICAgICAgb3Byb3QgPSBzZWxmLl9vcHJvdF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdoaWxlIG5vdCB0cmFucy5zdHJlYW0uY2xvc2VkKCk6Ci0gICAgICAgICAgICAgICAgZnJhbWUgPSB5aWVsZCB0cmFucy5yZWFkRnJhbWUoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB5aWVsZCB0cmFucy5yZWFkRnJhbWUoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0RXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUudHlwZSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICAgdHIgPSBUTWVtb3J5QnVmZmVyKGZyYW1lKQogICAgICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5faXByb3RfZmFjdG9yeS5nZXRQcm90b2NvbCh0cikKICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLl9wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RocmlmdC5weSBiL2xpYi9weS9zcmMvVGhyaWZ0LnB5CmluZGV4IDk4OTBhZjcuLmMzOTBjYmIgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvVGhyaWZ0LnB5CisrKyBiL2xpYi9weS9zcmMvVGhyaWZ0LnB5CkBAIC0yMCwxNTEgKzIwLDE4NSBAQAogaW1wb3J0IHN5cwogCiAKLWNsYXNzIFRUeXBlOgotICBTVE9QICAgPSAwCi0gIFZPSUQgICA9IDEKLSAgQk9PTCAgID0gMgotICBCWVRFICAgPSAzCi0gIEkwOCAgICA9IDMKLSAgRE9VQkxFID0gNAotICBJMTYgICAgPSA2Ci0gIEkzMiAgICA9IDgKLSAgSTY0ICAgID0gMTAKLSAgU1RSSU5HID0gMTEKLSAgVVRGNyAgID0gMTEKLSAgU1RSVUNUID0gMTIKLSAgTUFQICAgID0gMTMKLSAgU0VUICAgID0gMTQKLSAgTElTVCAgID0gMTUKLSAgVVRGOCAgID0gMTYKLSAgVVRGMTYgID0gMTcKK2NsYXNzIFRUeXBlKG9iamVjdCk6CisgICAgU1RPUCA9IDAKKyAgICBWT0lEID0gMQorICAgIEJPT0wgPSAyCisgICAgQllURSA9IDMKKyAgICBJMDggPSAzCisgICAgRE9VQkxFID0gNAorICAgIEkxNiA9IDYKKyAgICBJMzIgPSA4CisgICAgSTY0ID0gMTAKKyAgICBTVFJJTkcgPSAxMQorICAgIFVURjcgPSAxMQorICAgIFNUUlVDVCA9IDEyCisgICAgTUFQID0gMTMKKyAgICBTRVQgPSAxNAorICAgIExJU1QgPSAxNQorICAgIFVURjggPSAxNgorICAgIFVURjE2ID0gMTcKIAotICBfVkFMVUVTX1RPX05BTUVTID0gKCdTVE9QJywKLSAgICAgICAgICAgICAgICAgICAgICAnVk9JRCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ0JPT0wnLAotICAgICAgICAgICAgICAgICAgICAgICdCWVRFJywKLSAgICAgICAgICAgICAgICAgICAgICAnRE9VQkxFJywKLSAgICAgICAgICAgICAgICAgICAgICBOb25lLAotICAgICAgICAgICAgICAgICAgICAgICdJMTYnLAotICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgJ0kzMicsCi0gICAgICAgICAgICAgICAgICAgICAgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICdJNjQnLAotICAgICAgICAgICAgICAgICAgICAgJ1NUUklORycsCi0gICAgICAgICAgICAgICAgICAgICAnU1RSVUNUJywKLSAgICAgICAgICAgICAgICAgICAgICdNQVAnLAotICAgICAgICAgICAgICAgICAgICAgJ1NFVCcsCi0gICAgICAgICAgICAgICAgICAgICAnTElTVCcsCi0gICAgICAgICAgICAgICAgICAgICAnVVRGOCcsCi0gICAgICAgICAgICAgICAgICAgICAnVVRGMTYnKQorICAgIF9WQUxVRVNfVE9fTkFNRVMgPSAoCisgICAgICAgICdTVE9QJywKKyAgICAgICAgJ1ZPSUQnLAorICAgICAgICAnQk9PTCcsCisgICAgICAgICdCWVRFJywKKyAgICAgICAgJ0RPVUJMRScsCisgICAgICAgIE5vbmUsCisgICAgICAgICdJMTYnLAorICAgICAgICBOb25lLAorICAgICAgICAnSTMyJywKKyAgICAgICAgTm9uZSwKKyAgICAgICAgJ0k2NCcsCisgICAgICAgICdTVFJJTkcnLAorICAgICAgICAnU1RSVUNUJywKKyAgICAgICAgJ01BUCcsCisgICAgICAgICdTRVQnLAorICAgICAgICAnTElTVCcsCisgICAgICAgICdVVEY4JywKKyAgICAgICAgJ1VURjE2JywKKyAgICApCiAKIAotY2xhc3MgVE1lc3NhZ2VUeXBlOgotICBDQUxMID0gMQotICBSRVBMWSA9IDIKLSAgRVhDRVBUSU9OID0gMwotICBPTkVXQVkgPSA0CitjbGFzcyBUTWVzc2FnZVR5cGUob2JqZWN0KToKKyAgICBDQUxMID0gMQorICAgIFJFUExZID0gMgorICAgIEVYQ0VQVElPTiA9IDMKKyAgICBPTkVXQVkgPSA0CiAKIAotY2xhc3MgVFByb2Nlc3NvcjoKLSAgIiIiQmFzZSBjbGFzcyBmb3IgcHJvY3Nlc3Nvciwgd2hpY2ggd29ya3Mgb24gdHdvIHN0cmVhbXMuIiIiCitjbGFzcyBUUHJvY2Vzc29yKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgcHJvY2Vzc29yLCB3aGljaCB3b3JrcyBvbiB0d28gc3RyZWFtcy4iIiIKIAotICBkZWYgcHJvY2VzcyhpcHJvdCwgb3Byb3QpOgotICAgIHBhc3MKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOgorICAgICAgICAiIiIKKyAgICAgICAgUHJvY2VzcyBhIHJlcXVlc3QuICBUaGUgbm9ybWFsIGJlaHZhaW9yIGlzIHRvIGhhdmUgdGhlCisgICAgICAgIHByb2Nlc3NvciBpbnZva2UgdGhlIGNvcnJlY3QgaGFuZGxlciBhbmQgdGhlbiBpdCBpcyB0aGUKKyAgICAgICAgc2VydmVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gd3JpdGUgdGhlIHJlc3BvbnNlIHRvIG9wcm90LgorICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIG9uX21lc3NhZ2VfYmVnaW4oc2VsZiwgZnVuYyk6CisgICAgICAgICIiIgorICAgICAgICBJbnN0YWxsIGEgY2FsbGJhY2sgdGhhdCByZWNlaXZlcyAobmFtZSwgdHlwZSwgc2VxaWQpCisgICAgICAgIGFmdGVyIHRoZSBtZXNzYWdlIGhlYWRlciBpcyByZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgcGFzcwogCiAKIGNsYXNzIFRFeGNlcHRpb24oRXhjZXB0aW9uKToKLSAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIHRocmlmdCBleGNlcHRpb25zLiIiIgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGFsbCB0aHJpZnQgZXhjZXB0aW9ucy4iIiIKIAotICAjIEJhc2VFeGNlcHRpb24ubWVzc2FnZSBpcyBkZXByZWNhdGVkIGluIFB5dGhvbiB2WzIuNiwzLjApCi0gIGlmICgyLCA2LCAwKSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDApOgotICAgIGRlZiBfZ2V0X21lc3NhZ2Uoc2VsZik6Ci0gICAgICByZXR1cm4gc2VsZi5fbWVzc2FnZQorICAgICMgQmFzZUV4Y2VwdGlvbi5tZXNzYWdlIGlzIGRlcHJlY2F0ZWQgaW4gUHl0aG9uIHZbMi42LDMuMCkKKyAgICBpZiAoMiwgNiwgMCkgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKToKKyAgICAgICAgZGVmIF9nZXRfbWVzc2FnZShzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9tZXNzYWdlCiAKLSAgICBkZWYgX3NldF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgotICAgICAgc2VsZi5fbWVzc2FnZSA9IG1lc3NhZ2UKLSAgICBtZXNzYWdlID0gcHJvcGVydHkoX2dldF9tZXNzYWdlLCBfc2V0X21lc3NhZ2UpCisgICAgICAgIGRlZiBfc2V0X21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLl9tZXNzYWdlID0gbWVzc2FnZQorICAgICAgICBtZXNzYWdlID0gcHJvcGVydHkoX2dldF9tZXNzYWdlLCBfc2V0X21lc3NhZ2UpCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCi0gICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQogCiAKIGNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihURXhjZXB0aW9uKToKLSAgIiIiQXBwbGljYXRpb24gbGV2ZWwgdGhyaWZ0IGV4Y2VwdGlvbnMuIiIiCisgICAgIiIiQXBwbGljYXRpb24gbGV2ZWwgdGhyaWZ0IGV4Y2VwdGlvbnMuIiIiCiAKLSAgVU5LTk9XTiA9IDAKLSAgVU5LTk9XTl9NRVRIT0QgPSAxCi0gIElOVkFMSURfTUVTU0FHRV9UWVBFID0gMgotICBXUk9OR19NRVRIT0RfTkFNRSA9IDMKLSAgQkFEX1NFUVVFTkNFX0lEID0gNAotICBNSVNTSU5HX1JFU1VMVCA9IDUKLSAgSU5URVJOQUxfRVJST1IgPSA2Ci0gIFBST1RPQ09MX0VSUk9SID0gNwotICBJTlZBTElEX1RSQU5TRk9STSA9IDgKLSAgSU5WQUxJRF9QUk9UT0NPTCA9IDkKLSAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAorICAgIFVOS05PV04gPSAwCisgICAgVU5LTk9XTl9NRVRIT0QgPSAxCisgICAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyCisgICAgV1JPTkdfTUVUSE9EX05BTUUgPSAzCisgICAgQkFEX1NFUVVFTkNFX0lEID0gNAorICAgIE1JU1NJTkdfUkVTVUxUID0gNQorICAgIElOVEVSTkFMX0VSUk9SID0gNgorICAgIFBST1RPQ09MX0VSUk9SID0gNworICAgIElOVkFMSURfVFJBTlNGT1JNID0gOAorICAgIElOVkFMSURfUFJPVE9DT0wgPSA5CisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQotICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKIAotICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICBpZiBzZWxmLm1lc3NhZ2U6Ci0gICAgICByZXR1cm4gc2VsZi5tZXNzYWdlCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5VTktOT1dOX01FVEhPRDoKLSAgICAgIHJldHVybiAnVW5rbm93biBtZXRob2QnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlZBTElEX01FU1NBR0VfVFlQRToKLSAgICAgIHJldHVybiAnSW52YWxpZCBtZXNzYWdlIHR5cGUnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5XUk9OR19NRVRIT0RfTkFNRToKLSAgICAgIHJldHVybiAnV3JvbmcgbWV0aG9kIG5hbWUnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5CQURfU0VRVUVOQ0VfSUQ6Ci0gICAgICByZXR1cm4gJ0JhZCBzZXF1ZW5jZSBJRCcKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLk1JU1NJTkdfUkVTVUxUOgotICAgICAgcmV0dXJuICdNaXNzaW5nIHJlc3VsdCcKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVEVSTkFMX0VSUk9SOgotICAgICAgcmV0dXJuICdJbnRlcm5hbCBlcnJvcicKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLlBST1RPQ09MX0VSUk9SOgotICAgICAgcmV0dXJuICdQcm90b2NvbCBlcnJvcicKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfVFJBTlNGT1JNOgotICAgICAgcmV0dXJuICdJbnZhbGlkIHRyYW5zZm9ybScKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfUFJPVE9DT0w6Ci0gICAgICByZXR1cm4gJ0ludmFsaWQgcHJvdG9jb2wnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5VTlNVUFBPUlRFRF9DTElFTlRfVFlQRToKLSAgICAgIHJldHVybiAnVW5zdXBwb3J0ZWQgY2xpZW50IHR5cGUnCi0gICAgZWxzZToKLSAgICAgIHJldHVybiAnRGVmYXVsdCAodW5rbm93bikgVEFwcGxpY2F0aW9uRXhjZXB0aW9uJwotCi0gIGRlZiByZWFkKHNlbGYsIGlwcm90KToKLSAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQotICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKLSAgICAgICAgYnJlYWsKLSAgICAgIGlmIGZpZCA9PSAxOgotICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6Ci0gICAgICAgICAgc2VsZi5tZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYubWVzc2FnZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm1lc3NhZ2UKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5VTktOT1dOX01FVEhPRDoKKyAgICAgICAgICAgIHJldHVybiAnVW5rbm93biBtZXRob2QnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuSU5WQUxJRF9NRVNTQUdFX1RZUEU6CisgICAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgbWVzc2FnZSB0eXBlJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLldST05HX01FVEhPRF9OQU1FOgorICAgICAgICAgICAgcmV0dXJuICdXcm9uZyBtZXRob2QgbmFtZScKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5CQURfU0VRVUVOQ0VfSUQ6CisgICAgICAgICAgICByZXR1cm4gJ0JhZCBzZXF1ZW5jZSBJRCcKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5NSVNTSU5HX1JFU1VMVDoKKyAgICAgICAgICAgIHJldHVybiAnTWlzc2luZyByZXN1bHQnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuSU5URVJOQUxfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gJ0ludGVybmFsIGVycm9yJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLlBST1RPQ09MX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuICdQcm90b2NvbCBlcnJvcicKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlZBTElEX1RSQU5TRk9STToKKyAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCB0cmFuc2Zvcm0nCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuSU5WQUxJRF9QUk9UT0NPTDoKKyAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCBwcm90b2NvbCcKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5VTlNVUFBPUlRFRF9DTElFTlRfVFlQRToKKyAgICAgICAgICAgIHJldHVybiAnVW5zdXBwb3J0ZWQgY2xpZW50IHR5cGUnCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKLSAgICAgIGVsaWYgZmlkID09IDI6Ci0gICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgICAgICBzZWxmLnR5cGUgPSBpcHJvdC5yZWFkSTMyKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQotICAgICAgZWxzZToKLSAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKLSAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCi0gICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisgICAgICAgICAgICByZXR1cm4gJ0RlZmF1bHQgKHVua25vd24pIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbicKIAotICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgotICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpCi0gICAgaWYgc2VsZi5tZXNzYWdlIGlzIG5vdCBOb25lOgotICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVFR5cGUuU1RSSU5HLCAxKQotICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi5tZXNzYWdlKQotICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCi0gICAgaWYgc2VsZi50eXBlIGlzIG5vdCBOb25lOgotICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVFR5cGUuSTMyLCAyKQotICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi50eXBlKQotICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCi0gICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQotICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKyAgICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgZmlkID09IDE6CisgICAgICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgICAgICAgZWxpZiBmaWQgPT0gMjoKKyAgICAgICAgICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZSA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQorICAgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICAgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpCisgICAgICAgIGlmIHNlbGYubWVzc2FnZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlLlNUUklORywgMSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYubWVzc2FnZSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgICAgICBpZiBzZWxmLnR5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZS5JMzIsIDIpCisgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihzZWxmLnR5cGUpCisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKworY2xhc3MgVEZyb3plbkRpY3QoZGljdCk6CisgICAgIiIiQSBkaWN0aW9uYXJ5IHRoYXQgaXMgImZyb3plbiIgbGlrZSBhIGZyb3plbnNldCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKFRGcm96ZW5EaWN0LCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgICMgU29ydCB0aGUgaXRlbXMgc28gdGhleSB3aWxsIGJlIGluIGEgY29uc2lzdGVudCBvcmRlci4KKyAgICAgICAgIyBYT1IgaW4gdGhlIGhhc2ggb2YgdGhlIGNsYXNzIHNvIHdlIGRvbid0IGNvbGxpZGUgd2l0aAorICAgICAgICAjIHRoZSBoYXNoIG9mIGEgbGlzdCBvZiB0dXBsZXMuCisgICAgICAgIHNlbGYuX19oYXNodmFsID0gaGFzaChURnJvemVuRGljdCkgXiBoYXNoKHR1cGxlKHNvcnRlZChzZWxmLml0ZW1zKCkpKSkKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuJ3QgbW9kaWZ5IGZyb3plbiBURnJlZXphYmxlRGljdCIpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gVEZyZWV6YWJsZURpY3QiKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2hhc2h2YWwKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvY29tcGF0LnB5IGIvbGliL3B5L3NyYy9jb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4MjcxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvY29tcGF0LnB5CkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgc3lzCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKworICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTyBhcyBCdWZmZXJJTworCisgICAgZGVmIGJpbmFyeV90b19zdHIoYmluX3ZhbCk6CisgICAgICAgIHJldHVybiBiaW5fdmFsCisKKyAgICBkZWYgc3RyX3RvX2JpbmFyeShzdHJfdmFsKToKKyAgICAgICAgcmV0dXJuIHN0cl92YWwKKworICAgIGRlZiBieXRlX2luZGV4KGJ5dGVzX3ZhbCwgaSk6CisgICAgICAgIHJldHVybiBvcmQoYnl0ZXNfdmFsW2ldKQorCitlbHNlOgorCisgICAgZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTyBhcyBCdWZmZXJJTyAgIyBub3FhCisKKyAgICBkZWYgYmluYXJ5X3RvX3N0cihiaW5fdmFsKToKKyAgICAgICAgcmV0dXJuIGJpbl92YWwuZGVjb2RlKCd1dGY4JykKKworICAgIGRlZiBzdHJfdG9fYmluYXJ5KHN0cl92YWwpOgorICAgICAgICByZXR1cm4gYnl0ZXMoc3RyX3ZhbCwgJ3V0ZjgnKQorCisgICAgZGVmIGJ5dGVfaW5kZXgoYnl0ZXNfdmFsLCBpKToKKyAgICAgICAgcmV0dXJuIGJ5dGVzX3ZhbFtpXQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvYmluYXJ5LmNwcCBiL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkOGQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5jcHAKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZXh0L2JpbmFyeS5oIgorbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK2Jvb2wgQmluYXJ5UHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKFRUeXBlJiB0eXBlLCBpbnQxNl90JiB0YWcpIHsKKyAgdWludDhfdCBiID0gMDsKKyAgaWYgKCFyZWFkQnl0ZShiKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB0eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KGIpOworICBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gcmVhZEkxNih0YWcpOworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvYmluYXJ5LmggYi9saWIvcHkvc3JjL2V4dC9iaW5hcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjBiMGQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvYmluYXJ5LmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFlfQklOQVJZX0gKKyNkZWZpbmUgVEhSSUZUX1BZX0JJTkFSWV9ICisKKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlICJleHQvcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJleHQvZW5kaWFuLmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCitjbGFzcyBCaW5hcnlQcm90b2NvbCA6IHB1YmxpYyBQcm90b2NvbEJhc2U8QmluYXJ5UHJvdG9jb2w+IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+QmluYXJ5UHJvdG9jb2woKSB7fQorCisgIHZvaWQgd3JpdGVJOChpbnQ4X3QgdmFsKSB7IHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ2YWwpLCBzaXplb2YoaW50OF90KSk7IH0KKworICB2b2lkIHdyaXRlSTE2KGludDE2X3QgdmFsKSB7CisgICAgaW50MTZfdCBuZXQgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihodG9ucyh2YWwpKTsKKyAgICB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmbmV0KSwgc2l6ZW9mKGludDE2X3QpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMzIoaW50MzJfdCB2YWwpIHsKKyAgICBpbnQzMl90IG5ldCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGh0b25sKHZhbCkpOworICAgIHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZuZXQpLCBzaXplb2YoaW50MzJfdCkpOworICB9CisKKyAgdm9pZCB3cml0ZUk2NChpbnQ2NF90IHZhbCkgeworICAgIGludDY0X3QgbmV0ID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oaHRvbmxsKHZhbCkpOworICAgIHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZuZXQpLCBzaXplb2YoaW50NjRfdCkpOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB7CisgICAgLy8gVW5mb3J0dW5hdGVseSwgYml0d2lzZV9jYXN0IGRvZXNuJ3Qgd29yayBpbiBDLiAgQmFkIEMhCisgICAgdW5pb24geworICAgICAgZG91YmxlIGY7CisgICAgICBpbnQ2NF90IHQ7CisgICAgfSB0cmFuc2ZlcjsKKyAgICB0cmFuc2Zlci5mID0gZHViOworICAgIHdyaXRlSTY0KHRyYW5zZmVyLnQpOworICB9CisKKyAgdm9pZCB3cml0ZUJvb2woaW50IHYpIHsgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHYpKTsgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoUHlPYmplY3QqIHZhbHVlLCBpbnQzMl90IGxlbikgeworICAgIHdyaXRlSTMyKGxlbik7CisgICAgd3JpdGVCdWZmZXIoUHlCeXRlc19BU19TVFJJTkcodmFsdWUpLCBsZW4pOworICB9CisKKyAgYm9vbCB3cml0ZUxpc3RCZWdpbihQeU9iamVjdCogdmFsdWUsIGNvbnN0IFNldExpc3RUeXBlQXJncyYgcGFyc2VkYXJncywgaW50MzJfdCBsZW4pIHsKKyAgICB3cml0ZUJ5dGUocGFyc2VkYXJncy5lbGVtZW50X3R5cGUpOworICAgIHdyaXRlSTMyKGxlbik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHdyaXRlTWFwQmVnaW4oUHlPYmplY3QqIHZhbHVlLCBjb25zdCBNYXBUeXBlQXJncyYgcGFyc2VkYXJncywgaW50MzJfdCBsZW4pIHsKKyAgICB3cml0ZUJ5dGUocGFyc2VkYXJncy5rdGFnKTsKKyAgICB3cml0ZUJ5dGUocGFyc2VkYXJncy52dGFnKTsKKyAgICB3cml0ZUkzMihsZW4pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZVN0cnVjdEJlZ2luKCkgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHdyaXRlU3RydWN0RW5kKCkgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHdyaXRlRmllbGQoUHlPYmplY3QqIHZhbHVlLCBjb25zdCBTdHJ1Y3RJdGVtU3BlYyYgcGFyc2Vkc3BlYykgeworICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihwYXJzZWRzcGVjLnR5cGUpKTsKKyAgICB3cml0ZUkxNihwYXJzZWRzcGVjLnRhZyk7CisgICAgcmV0dXJuIGVuY29kZVZhbHVlKHZhbHVlLCBwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KFRfU1RPUCkpOyB9CisKKyAgYm9vbCByZWFkQm9vbChib29sJiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1ZiwgMSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gYnVmWzBdID09IDE7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWRJOChpbnQ4X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBidWZbMF07CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWRJMTYoaW50MTZfdCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIHNpemVvZihpbnQxNl90KSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KCZ2YWwsIGJ1Ziwgc2l6ZW9mKGludDE2X3QpKTsKKyAgICB2YWwgPSBudG9ocyh2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkSTMyKGludDMyX3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCBzaXplb2YoaW50MzJfdCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweSgmdmFsLCBidWYsIHNpemVvZihpbnQzMl90KSk7CisgICAgdmFsID0gbnRvaGwodmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZEk2NChpbnQ2NF90JiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1Ziwgc2l6ZW9mKGludDY0X3QpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoJnZhbCwgYnVmLCBzaXplb2YoaW50NjRfdCkpOworICAgIHZhbCA9IG50b2hsbCh2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkRG91YmxlKGRvdWJsZSYgdmFsKSB7CisgICAgdW5pb24geworICAgICAgaW50NjRfdCBmOworICAgICAgZG91YmxlIHQ7CisgICAgfSB0cmFuc2ZlcjsKKworICAgIGlmICghcmVhZEk2NCh0cmFuc2Zlci5mKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSB0cmFuc2Zlci50OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaW50MzJfdCByZWFkU3RyaW5nKGNoYXIqKiBidWYpIHsKKyAgICBpbnQzMl90IGxlbiA9IDA7CisgICAgaWYgKCFyZWFkSTMyKGxlbikgfHwgIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBzdHJpbmdMaW1pdCgpKSB8fCAhcmVhZEJ5dGVzKGJ1ZiwgbGVuKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgaW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBldHlwZSkgeworICAgIGludDMyX3QgbGVuOworICAgIHVpbnQ4X3QgYiA9IDA7CisgICAgaWYgKCFyZWFkQnl0ZShiKSB8fCAhcmVhZEkzMihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgY29udGFpbmVyTGltaXQoKSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZXR5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4oYik7CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrdHlwZSwgVFR5cGUmIHZ0eXBlKSB7CisgICAgaW50MzJfdCBsZW47CisgICAgdWludDhfdCBrLCB2OworICAgIGlmICghcmVhZEJ5dGUoaykgfHwgIXJlYWRCeXRlKHYpIHx8ICFyZWFkSTMyKGxlbikgfHwgIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBjb250YWluZXJMaW1pdCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBrdHlwZSA9IHN0YXRpY19jYXN0PFRUeXBlPihrKTsKKyAgICB2dHlwZSA9IHN0YXRpY19jYXN0PFRUeXBlPih2KTsKKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgYm9vbCByZWFkU3RydWN0QmVnaW4oKSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgcmVhZFN0cnVjdEVuZCgpIHsgcmV0dXJuIHRydWU7IH0KKworICBib29sIHJlYWRGaWVsZEJlZ2luKFRUeXBlJiB0eXBlLCBpbnQxNl90JiB0YWcpOworCisjZGVmaW5lIFNLSVBCWVRFUyhuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFyZWFkQnl0ZXMoJmR1bW15X2J1Zl8sIChuKSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyAgYm9vbCBza2lwQm9vbCgpIHsgU0tJUEJZVEVTKDEpOyB9CisgIGJvb2wgc2tpcEJ5dGUoKSB7IFNLSVBCWVRFUygxKTsgfQorICBib29sIHNraXBJMTYoKSB7IFNLSVBCWVRFUygyKTsgfQorICBib29sIHNraXBJMzIoKSB7IFNLSVBCWVRFUyg0KTsgfQorICBib29sIHNraXBJNjQoKSB7IFNLSVBCWVRFUyg4KTsgfQorICBib29sIHNraXBEb3VibGUoKSB7IFNLSVBCWVRFUyg4KTsgfQorICBib29sIHNraXBTdHJpbmcoKSB7CisgICAgaW50MzJfdCBsZW47CisgICAgaWYgKCFyZWFkSTMyKGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU0tJUEJZVEVTKGxlbik7CisgIH0KKyN1bmRlZiBTS0lQQllURVMKKworcHJpdmF0ZToKKyAgY2hhciogZHVtbXlfYnVmXzsKK307Cit9Cit9Cit9CisjZW5kaWYgLy8gVEhSSUZUX1BZX0JJTkFSWV9ICmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmNwcCBiL2xpYi9weS9zcmMvZXh0L2NvbXBhY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTk5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmNwcApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZXh0L2NvbXBhY3QuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK2NvbnN0IHVpbnQ4X3QgQ29tcGFjdFByb3RvY29sOjpUVHlwZVRvQ1R5cGVbXSA9IHsKKyAgICBDVF9TVE9QLCAgICAgICAgIC8vIFRfU1RPUAorICAgIDAsICAgICAgICAgICAgICAgLy8gdW51c2VkCisgICAgQ1RfQk9PTEVBTl9UUlVFLCAvLyBUX0JPT0wKKyAgICBDVF9CWVRFLCAgICAgICAgIC8vIFRfQllURQorICAgIENUX0RPVUJMRSwgICAgICAgLy8gVF9ET1VCTEUKKyAgICAwLCAgICAgICAgICAgICAgIC8vIHVudXNlZAorICAgIENUX0kxNiwgICAgICAgICAgLy8gVF9JMTYKKyAgICAwLCAgICAgICAgICAgICAgIC8vIHVudXNlZAorICAgIENUX0kzMiwgICAgICAgICAgLy8gVF9JMzIKKyAgICAwLCAgICAgICAgICAgICAgIC8vIHVudXNlZAorICAgIENUX0k2NCwgICAgICAgICAgLy8gVF9JNjQKKyAgICBDVF9CSU5BUlksICAgICAgIC8vIFRfU1RSSU5HCisgICAgQ1RfU1RSVUNULCAgICAgICAvLyBUX1NUUlVDVAorICAgIENUX01BUCwgICAgICAgICAgLy8gVF9NQVAKKyAgICBDVF9TRVQsICAgICAgICAgIC8vIFRfU0VUCisgICAgQ1RfTElTVCwgICAgICAgICAvLyBUX0xJU1QKK307CisKK2Jvb2wgQ29tcGFjdFByb3RvY29sOjpyZWFkRmllbGRCZWdpbihUVHlwZSYgdHlwZSwgaW50MTZfdCYgdGFnKSB7CisgIHVpbnQ4X3QgYjsKKyAgaWYgKCFyZWFkQnl0ZShiKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB1aW50OF90IGN0eXBlID0gYiAmIDB4ZjsKKyAgdHlwZSA9IGdldFRUeXBlKGN0eXBlKTsKKyAgaWYgKHR5cGUgPT0gLTEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICB0YWcgPSAwOworICAgIHJldHVybiB0cnVlOworICB9CisgIHVpbnQ4X3QgZGlmZiA9IChiICYgMHhmMCkgPj4gNDsKKyAgaWYgKGRpZmYpIHsKKyAgICB0YWcgPSByZWFkVGFnc18udG9wKCkgKyBkaWZmOworICB9IGVsc2UgaWYgKCFyZWFkSTE2KHRhZykpIHsKKyAgICByZWFkVGFnc18udG9wKCkgPSAtMTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGN0eXBlID09IENUX0JPT0xFQU5fRkFMU0UgfHwgY3R5cGUgPT0gQ1RfQk9PTEVBTl9UUlVFKSB7CisgICAgcmVhZEJvb2xfLmV4aXN0cyA9IHRydWU7CisgICAgcmVhZEJvb2xfLnZhbHVlID0gY3R5cGUgPT0gQ1RfQk9PTEVBTl9UUlVFOworICB9CisgIHJlYWRUYWdzXy50b3AoKSA9IHRhZzsKKyAgcmV0dXJuIHRydWU7Cit9CisKK1RUeXBlIENvbXBhY3RQcm90b2NvbDo6Z2V0VFR5cGUodWludDhfdCB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIFRfU1RPUDoKKyAgICByZXR1cm4gVF9TVE9QOworICBjYXNlIENUX0JPT0xFQU5fRkFMU0U6CisgIGNhc2UgQ1RfQk9PTEVBTl9UUlVFOgorICAgIHJldHVybiBUX0JPT0w7CisgIGNhc2UgQ1RfQllURToKKyAgICByZXR1cm4gVF9CWVRFOworICBjYXNlIENUX0kxNjoKKyAgICByZXR1cm4gVF9JMTY7CisgIGNhc2UgQ1RfSTMyOgorICAgIHJldHVybiBUX0kzMjsKKyAgY2FzZSBDVF9JNjQ6CisgICAgcmV0dXJuIFRfSTY0OworICBjYXNlIENUX0RPVUJMRToKKyAgICByZXR1cm4gVF9ET1VCTEU7CisgIGNhc2UgQ1RfQklOQVJZOgorICAgIHJldHVybiBUX1NUUklORzsKKyAgY2FzZSBDVF9MSVNUOgorICAgIHJldHVybiBUX0xJU1Q7CisgIGNhc2UgQ1RfU0VUOgorICAgIHJldHVybiBUX1NFVDsKKyAgY2FzZSBDVF9NQVA6CisgICAgcmV0dXJuIFRfTUFQOworICBjYXNlIENUX1NUUlVDVDoKKyAgICByZXR1cm4gVF9TVFJVQ1Q7CisgIGRlZmF1bHQ6CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImRvbid0IGtub3cgd2hhdCB0eXBlOiAlZCIsIHR5cGUpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUVHlwZT4oLTEpOworICB9Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmggYi9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4ZDdhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L2NvbXBhY3QuaApAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9DT01QQUNUX0gKKyNkZWZpbmUgVEhSSUZUX1BZX0NPTVBBQ1RfSAorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSAiZXh0L3Byb3RvY29sLmgiCisjaW5jbHVkZSAiZXh0L2VuZGlhbi5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0YWNrPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworY2xhc3MgQ29tcGFjdFByb3RvY29sIDogcHVibGljIFByb3RvY29sQmFzZTxDb21wYWN0UHJvdG9jb2w+IHsKK3B1YmxpYzoKKyAgQ29tcGFjdFByb3RvY29sKCkgeyByZWFkQm9vbF8uZXhpc3RzID0gZmFsc2U7IH0KKworICB2aXJ0dWFsIH5Db21wYWN0UHJvdG9jb2woKSB7fQorCisgIHZvaWQgd3JpdGVJOChpbnQ4X3QgdmFsKSB7IHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ2YWwpLCAxKTsgfQorCisgIHZvaWQgd3JpdGVJMTYoaW50MTZfdCB2YWwpIHsgd3JpdGVWYXJpbnQodG9aaWdaYWcodmFsKSk7IH0KKworICBpbnQgd3JpdGVJMzIoaW50MzJfdCB2YWwpIHsgcmV0dXJuIHdyaXRlVmFyaW50KHRvWmlnWmFnKHZhbCkpOyB9CisKKyAgdm9pZCB3cml0ZUk2NChpbnQ2NF90IHZhbCkgeyB3cml0ZVZhcmludDY0KHRvWmlnWmFnNjQodmFsKSk7IH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHsKKyAgICB1bmlvbiB7CisgICAgICBkb3VibGUgZjsKKyAgICAgIGludDY0X3QgdDsKKyAgICB9IHRyYW5zZmVyOworICAgIHRyYW5zZmVyLmYgPSBodG9sZWxsKGR1Yik7CisgICAgd3JpdGVCdWZmZXIocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJnRyYW5zZmVyLnQpLCBzaXplb2YoaW50NjRfdCkpOworICB9CisKKyAgdm9pZCB3cml0ZUJvb2woaW50IHYpIHsgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHYgPyBDVF9CT09MRUFOX1RSVUUgOiBDVF9CT09MRUFOX0ZBTFNFKSk7IH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFB5T2JqZWN0KiB2YWx1ZSwgaW50MzJfdCBsZW4pIHsKKyAgICB3cml0ZVZhcmludChsZW4pOworICAgIHdyaXRlQnVmZmVyKFB5Qnl0ZXNfQVNfU1RSSU5HKHZhbHVlKSwgbGVuKTsKKyAgfQorCisgIGJvb2wgd3JpdGVMaXN0QmVnaW4oUHlPYmplY3QqIHZhbHVlLCBjb25zdCBTZXRMaXN0VHlwZUFyZ3MmIGFyZ3MsIGludDMyX3QgbGVuKSB7CisgICAgaW50IGN0eXBlID0gdG9Db21wYWN0VHlwZShhcmdzLmVsZW1lbnRfdHlwZSk7CisgICAgaWYgKGxlbiA8PSAxNCkgeworICAgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGxlbiA8PCA0IHwgY3R5cGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKDB4ZjAgfCBjdHlwZSk7CisgICAgICB3cml0ZVZhcmludChsZW4pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVNYXBCZWdpbihQeU9iamVjdCogdmFsdWUsIGNvbnN0IE1hcFR5cGVBcmdzJiBhcmdzLCBpbnQzMl90IGxlbikgeworICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgd3JpdGVCeXRlKDApOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGludCBjdHlwZSA9IHRvQ29tcGFjdFR5cGUoYXJncy5rdGFnKSA8PCA0IHwgdG9Db21wYWN0VHlwZShhcmdzLnZ0YWcpOworICAgIHdyaXRlVmFyaW50KGxlbik7CisgICAgd3JpdGVCeXRlKGN0eXBlKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVTdHJ1Y3RCZWdpbigpIHsKKyAgICB3cml0ZVRhZ3NfLnB1c2goMCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgYm9vbCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICB3cml0ZVRhZ3NfLnBvcCgpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZUZpZWxkKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgU3RydWN0SXRlbVNwZWMmIHNwZWMpIHsKKyAgICBpZiAoc3BlYy50eXBlID09IFRfQk9PTCkgeworICAgICAgZG9Xcml0ZUZpZWxkQmVnaW4oc3BlYywgUHlPYmplY3RfSXNUcnVlKHZhbHVlKSA/IENUX0JPT0xFQU5fVFJVRSA6IENUX0JPT0xFQU5fRkFMU0UpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGRvV3JpdGVGaWVsZEJlZ2luKHNwZWMsIHRvQ29tcGFjdFR5cGUoc3BlYy50eXBlKSk7CisgICAgICByZXR1cm4gZW5jb2RlVmFsdWUodmFsdWUsIHNwZWMudHlwZSwgc3BlYy50eXBlYXJncyk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsgd3JpdGVCeXRlKDApOyB9CisKKyAgYm9vbCByZWFkQm9vbChib29sJiB2YWwpIHsKKyAgICBpZiAocmVhZEJvb2xfLmV4aXN0cykgeworICAgICAgcmVhZEJvb2xfLmV4aXN0cyA9IGZhbHNlOworICAgICAgdmFsID0gcmVhZEJvb2xfLnZhbHVlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBidWZbMF0gPT0gQ1RfQk9PTEVBTl9UUlVFOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgcmVhZEk4KGludDhfdCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIDEpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhbCA9IGJ1ZlswXTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZEkxNihpbnQxNl90JiB2YWwpIHsKKyAgICB1aW50MTZfdCB1dmFsOworICAgIGlmIChyZWFkVmFyaW50PHVpbnQxNl90LCAzPih1dmFsKSkgeworICAgICAgdmFsID0gZnJvbVppZ1phZzxpbnQxNl90LCB1aW50MTZfdD4odXZhbCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCByZWFkSTMyKGludDMyX3QmIHZhbCkgeworICAgIHVpbnQzMl90IHV2YWw7CisgICAgaWYgKHJlYWRWYXJpbnQ8dWludDMyX3QsIDU+KHV2YWwpKSB7CisgICAgICB2YWwgPSBmcm9tWmlnWmFnPGludDMyX3QsIHVpbnQzMl90Pih1dmFsKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIHJlYWRJNjQoaW50NjRfdCYgdmFsKSB7CisgICAgdWludDY0X3QgdXZhbDsKKyAgICBpZiAocmVhZFZhcmludDx1aW50NjRfdCwgMTA+KHV2YWwpKSB7CisgICAgICB2YWwgPSBmcm9tWmlnWmFnPGludDY0X3QsIHVpbnQ2NF90Pih1dmFsKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIHJlYWREb3VibGUoZG91YmxlJiB2YWwpIHsKKyAgICB1bmlvbiB7CisgICAgICBpbnQ2NF90IGY7CisgICAgICBkb3VibGUgdDsKKyAgICB9IHRyYW5zZmVyOworCisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIDgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweSgmdHJhbnNmZXIuZiwgYnVmLCBzaXplb2YoaW50NjRfdCkpOworICAgIHRyYW5zZmVyLmYgPSBsZXRvaGxsKHRyYW5zZmVyLmYpOworICAgIHZhbCA9IHRyYW5zZmVyLnQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpbnQzMl90IHJlYWRTdHJpbmcoY2hhcioqIGJ1ZikgeworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIXJlYWRWYXJpbnQ8dWludDMyX3QsIDU+KGxlbikgfHwgIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBzdHJpbmdMaW1pdCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIXJlYWRCeXRlcyhidWYsIGxlbikpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZXR5cGUpIHsKKyAgICB1aW50OF90IGI7CisgICAgaWYgKCFyZWFkQnl0ZShiKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBldHlwZSA9IGdldFRUeXBlKGIgJiAweGYpOworICAgIGlmIChldHlwZSA9PSAtMSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB1aW50MzJfdCBsZW4gPSAoYiA+PiA0KSAmIDB4ZjsKKyAgICBpZiAobGVuID09IDE1ICYmICFyZWFkVmFyaW50PHVpbnQzMl90LCA1PihsZW4pKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghY2hlY2tMZW5ndGhMaW1pdChsZW4sIGNvbnRhaW5lckxpbWl0KCkpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBsZW47CisgIH0KKworICBpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga3R5cGUsIFRUeXBlJiB2dHlwZSkgeworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIXJlYWRWYXJpbnQ8dWludDMyX3QsIDU+KGxlbikgfHwgIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBjb250YWluZXJMaW1pdCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobGVuICE9IDApIHsKKyAgICAgIHVpbnQ4X3Qga3ZUeXBlOworICAgICAgaWYgKCFyZWFkQnl0ZShrdlR5cGUpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGt0eXBlID0gZ2V0VFR5cGUoa3ZUeXBlID4+IDQpOworICAgICAgdnR5cGUgPSBnZXRUVHlwZShrdlR5cGUgJiAweGYpOworICAgICAgaWYgKGt0eXBlID09IC0xIHx8IHZ0eXBlID09IC0xKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGJvb2wgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIHJlYWRUYWdzXy5wdXNoKDApOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICByZWFkVGFnc18ucG9wKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgYm9vbCByZWFkRmllbGRCZWdpbihUVHlwZSYgdHlwZSwgaW50MTZfdCYgdGFnKTsKKworICBib29sIHNraXBCb29sKCkgeworICAgIGJvb2wgdmFsOworICAgIHJldHVybiByZWFkQm9vbCh2YWwpOworICB9CisjZGVmaW5lIFNLSVBCWVRFUyhuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFyZWFkQnl0ZXMoJmR1bW15X2J1Zl8sIChuKSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisgIGJvb2wgc2tpcEJ5dGUoKSB7IFNLSVBCWVRFUygxKTsgfQorICBib29sIHNraXBEb3VibGUoKSB7IFNLSVBCWVRFUyg4KTsgfQorICBib29sIHNraXBJMTYoKSB7CisgICAgaW50MTZfdCB2YWw7CisgICAgcmV0dXJuIHJlYWRJMTYodmFsKTsKKyAgfQorICBib29sIHNraXBJMzIoKSB7CisgICAgaW50MzJfdCB2YWw7CisgICAgcmV0dXJuIHJlYWRJMzIodmFsKTsKKyAgfQorICBib29sIHNraXBJNjQoKSB7CisgICAgaW50NjRfdCB2YWw7CisgICAgcmV0dXJuIHJlYWRJNjQodmFsKTsKKyAgfQorICBib29sIHNraXBTdHJpbmcoKSB7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghcmVhZFZhcmludDx1aW50MzJfdCwgNT4obGVuKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTS0lQQllURVMobGVuKTsKKyAgfQorI3VuZGVmIFNLSVBCWVRFUworCitwcml2YXRlOgorICBlbnVtIFR5cGVzIHsKKyAgICBDVF9TVE9QID0gMHgwMCwKKyAgICBDVF9CT09MRUFOX1RSVUUgPSAweDAxLAorICAgIENUX0JPT0xFQU5fRkFMU0UgPSAweDAyLAorICAgIENUX0JZVEUgPSAweDAzLAorICAgIENUX0kxNiA9IDB4MDQsCisgICAgQ1RfSTMyID0gMHgwNSwKKyAgICBDVF9JNjQgPSAweDA2LAorICAgIENUX0RPVUJMRSA9IDB4MDcsCisgICAgQ1RfQklOQVJZID0gMHgwOCwKKyAgICBDVF9MSVNUID0gMHgwOSwKKyAgICBDVF9TRVQgPSAweDBBLAorICAgIENUX01BUCA9IDB4MEIsCisgICAgQ1RfU1RSVUNUID0gMHgwQworICB9OworCisgIHN0YXRpYyBjb25zdCB1aW50OF90IFRUeXBlVG9DVHlwZVtdOworCisgIFRUeXBlIGdldFRUeXBlKHVpbnQ4X3QgdHlwZSk7CisKKyAgaW50IHRvQ29tcGFjdFR5cGUoVFR5cGUgdHlwZSkgeworICAgIGludCBpID0gc3RhdGljX2Nhc3Q8aW50Pih0eXBlKTsKKyAgICByZXR1cm4gaSA8IDE2ID8gVFR5cGVUb0NUeXBlW2ldIDogLTE7CisgIH0KKworICB1aW50MzJfdCB0b1ppZ1phZyhpbnQzMl90IHZhbCkgeyByZXR1cm4gKHZhbCA+PiAzMSkgXiAodmFsIDw8IDEpOyB9CisKKyAgdWludDY0X3QgdG9aaWdaYWc2NChpbnQ2NF90IHZhbCkgeyByZXR1cm4gKHZhbCA+PiA2MykgXiAodmFsIDw8IDEpOyB9CisKKyAgaW50IHdyaXRlVmFyaW50KHVpbnQzMl90IHZhbCkgeworICAgIGludCBjbnQgPSAxOworICAgIHdoaWxlICh2YWwgJiB+MHg3ZlUpIHsKKyAgICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDxjaGFyPigodmFsICYgMHg3ZlUpIHwgMHg4MFUpKTsKKyAgICAgIHZhbCA+Pj0gNzsKKyAgICAgICsrY250OworICAgIH0KKyAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8Y2hhcj4odmFsKSk7CisgICAgcmV0dXJuIGNudDsKKyAgfQorCisgIGludCB3cml0ZVZhcmludDY0KHVpbnQ2NF90IHZhbCkgeworICAgIGludCBjbnQgPSAxOworICAgIHdoaWxlICh2YWwgJiB+MHg3ZlVMTCkgeworICAgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PGNoYXI+KCh2YWwgJiAweDdmVUxMKSB8IDB4ODBVTEwpKTsKKyAgICAgIHZhbCA+Pj0gNzsKKyAgICAgICsrY250OworICAgIH0KKyAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8Y2hhcj4odmFsKSk7CisgICAgcmV0dXJuIGNudDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTWF4PgorICBib29sIHJlYWRWYXJpbnQoVCYgcmVzdWx0KSB7CisgICAgdWludDhfdCBiOworICAgIFQgdmFsID0gMDsKKyAgICBpbnQgc2hpZnQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTWF4OyArK2kpIHsKKyAgICAgIGlmICghcmVhZEJ5dGUoYikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKGIgJiAweDgwKSB7CisgICAgICAgIHZhbCB8PSBzdGF0aWNfY2FzdDxUPihiICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YWwgfD0gc3RhdGljX2Nhc3Q8VD4oYikgPDwgc2hpZnQ7CisgICAgICAgIHJlc3VsdCA9IHZhbDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBzaGlmdCArPSA3OworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInZhcmludCBleGNlZWRlZCAlZCBieXRlcyIsIE1heCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFU+CisgIFMgZnJvbVppZ1phZyhVIHZhbCkgeworICAgIHJldHVybiAodmFsID4+IDEpIF4gc3RhdGljX2Nhc3Q8VT4oLXN0YXRpY19jYXN0PFM+KHZhbCAmIDEpKTsKKyAgfQorCisgIHZvaWQgZG9Xcml0ZUZpZWxkQmVnaW4oY29uc3QgU3RydWN0SXRlbVNwZWMmIHNwZWMsIGludCBjdHlwZSkgeworICAgIGludCBkaWZmID0gc3BlYy50YWcgLSB3cml0ZVRhZ3NfLnRvcCgpOworICAgIGlmIChkaWZmID4gMCAmJiBkaWZmIDw9IDE1KSB7CisgICAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4oZGlmZiA8PCA0IHwgY3R5cGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGN0eXBlKSk7CisgICAgICB3cml0ZUkxNihzcGVjLnRhZyk7CisgICAgfQorICAgIHdyaXRlVGFnc18udG9wKCkgPSBzcGVjLnRhZzsKKyAgfQorCisgIHN0ZDo6c3RhY2s8aW50PiB3cml0ZVRhZ3NfOworICBzdGQ6OnN0YWNrPGludD4gcmVhZFRhZ3NfOworICBzdHJ1Y3QgeworICAgIGJvb2wgZXhpc3RzOworICAgIGJvb2wgdmFsdWU7CisgIH0gcmVhZEJvb2xfOworICBjaGFyKiBkdW1teV9idWZfOworfTsKK30KK30KK30KKyNlbmRpZiAvLyBUSFJJRlRfUFlfQ09NUEFDVF9ICmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9lbmRpYW4uaCBiL2xpYi9weS9zcmMvZXh0L2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NjBjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9lbmRpYW4uaApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BZX0VORElBTl9ICisjZGVmaW5lIFRIUklGVF9QWV9FTkRJQU5fSAorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxXaW5Tb2NrMi5oPgorI3ByYWdtYSBjb21tZW50KGxpYiwgIndzMl8zMi5saWIiKQorI2RlZmluZSBCSUdfRU5ESUFOICg0MzIxKQorI2RlZmluZSBMSVRUTEVfRU5ESUFOICgxMjM0KQorI2RlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZW5kaWYKKworLyogRml4IGVuZGlhbm5lc3MgaXNzdWVzIG9uIFNvbGFyaXMgKi8KKyNpZiBkZWZpbmVkKF9fU1ZSNCkgJiYgZGVmaW5lZChfX3N1bikKKyNpZiBkZWZpbmVkKF9faTM4NikgJiYgIWRlZmluZWQoX19pMzg2X18pCisjZGVmaW5lIF9faTM4Nl9fCisjZW5kaWYKKworI2lmbmRlZiBCSUdfRU5ESUFOCisjZGVmaW5lIEJJR19FTkRJQU4gKDQzMjEpCisjZW5kaWYKKyNpZm5kZWYgTElUVExFX0VORElBTgorI2RlZmluZSBMSVRUTEVfRU5ESUFOICgxMjM0KQorI2VuZGlmCisKKy8qIEkzODYgaXMgTEUsIGV2ZW4gb24gU29sYXJpcyAqLworI2lmICFkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoX19pMzg2X18pCisjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX0JZVEVfT1JERVIKKyNpZiBkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoTElUVExFX0VORElBTikgJiYgZGVmaW5lZChCSUdfRU5ESUFOKQorI2RlZmluZSBfX0JZVEVfT1JERVIgQllURV9PUkRFUgorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4gTElUVExFX0VORElBTgorI2RlZmluZSBfX0JJR19FTkRJQU4gQklHX0VORElBTgorI2Vsc2UKKyNlcnJvciAiQ2Fubm90IGRldGVybWluZSBlbmRpYW5uZXNzIgorI2VuZGlmCisjZW5kaWYKKworLy8gU2FtZSBjb21tZW50IGFzIHRoZSBlbnVtLiAgU29ycnkuCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorI2RlZmluZSBudG9obGwobikgKG4pCisjZGVmaW5lIGh0b25sbChuKSAobikKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2RlZmluZSBsZXRvaGxsKG4pIGJzd2FwXzY0KG4pCisjZGVmaW5lIGh0b2xlbGwobikgYnN3YXBfNjQobikKKyNlbHNlIC8qIEdOVUMgJiBHTElCQyAqLworI2RlZmluZSBsZXRvaGxsKG4pICgoKCh1bnNpZ25lZCBsb25nIGxvbmcpbnRvaGwobikpIDw8IDMyKSArIG50b2hsKG4gPj4gMzIpKQorI2RlZmluZSBodG9sZWxsKG4pICgoKCh1bnNpZ25lZCBsb25nIGxvbmcpaHRvbmwobikpIDw8IDMyKSArIGh0b25sKG4gPj4gMzIpKQorI2VuZGlmCisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNkZWZpbmUgbnRvaGxsKG4pIGJzd2FwXzY0KG4pCisjZGVmaW5lIGh0b25sbChuKSBic3dhcF82NChuKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgbnRvaGxsKG4pIF9ieXRlc3dhcF91aW50NjQobikKKyNkZWZpbmUgaHRvbmxsKG4pIF9ieXRlc3dhcF91aW50NjQobikKKyNlbHNlIC8qIEdOVUMgJiBHTElCQyAqLworI2RlZmluZSBudG9obGwobikgKCgoKHVuc2lnbmVkIGxvbmcgbG9uZyludG9obChuKSkgPDwgMzIpICsgbnRvaGwobiA+PiAzMikpCisjZGVmaW5lIGh0b25sbChuKSAoKCgodW5zaWduZWQgbG9uZyBsb25nKWh0b25sKG4pKSA8PCAzMikgKyBodG9ubChuID4+IDMyKSkKKyNlbmRpZiAvKiBHTlVDICYgR0xJQkMgKi8KKyNkZWZpbmUgbGV0b2hsbChuKSAobikKKyNkZWZpbmUgaHRvbGVsbChuKSAobikKKyNlbHNlIC8qIF9fQllURV9PUkRFUiAqLworI2Vycm9yICJDYW4ndCBkZWZpbmUgaHRvbmxsIG9yIG50b2hsbCEiCisjZW5kaWYKKworI2VuZGlmIC8vIFRIUklGVF9QWV9FTkRJQU5fSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvbW9kdWxlLmNwcCBiL2xpYi9weS9zcmMvZXh0L21vZHVsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1OGI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L21vZHVsZS5jcHAKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiYmluYXJ5LmgiCisjaW5jbHVkZSAiY29tcGFjdC5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gVE9ETyhkcmVpc3MpOiBkZWZ2YWwgYXBwZWFycyB0byBiZSB1bnVzZWQuICBMb29rIGludG8gcmVtb3ZpbmcgaXQuCisvLyBUT0RPKGRyZWlzcyk6IE1ha2UgcGFyc2Vfc3BlY19hcmdzIHJlY3Vyc2l2ZSwgYW5kIGNhY2hlIHRoZSBvdXRwdXQKKy8vICAgICAgICAgICAgICAgcGVybWFuZW50bHkgaW4gdGhlIG9iamVjdC4gIChNYWxsb2MgYW5kIG9ycGhhbi4pCisvLyBUT0RPKGRyZWlzcyk6IFdoeSBkbyB3ZSBuZWVkIGNTdHJpbmdJTyBmb3IgcmVhZGluZywgd2h5IG5vdCBqdXN0IGNoYXIqPworLy8gICAgICAgICAgICAgICBDYW4gY1N0cmluZ0lPIGxldCB1cyB3b3JrIHdpdGggYSBCdWZmZXJlZFRyYW5zcG9ydD8KKy8vIFRPRE8oZHJlaXNzKTogRG9uJ3QgaWdub3JlIHRoZSBydiBmcm9tIGN3cml0ZSAobWF5YmUpLgorCisvLyBEb2luZyBhIGJlbmNobWFyayBzaG93cyB0aGF0IGludGVybmluZyBhY3R1YWxseSBtYWtlcyBhIGRpZmZlcmVuY2UsIGFtYXppbmdseS4KKworLyoqIFBvaW50ZXIgdG8gaW50ZXJuZWQgc3RyaW5nIHRvIHNwZWVkIHVwIGF0dHJpYnV0ZSBsb29rdXAuICovCitQeU9iamVjdCogSU5URVJOX1NUUklORyhURnJvemVuRGljdCk7CitQeU9iamVjdCogSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKTsKK1B5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOworc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKHN0cmluZ19sZW5ndGhfbGltaXQpOworc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNvbnRhaW5lcl9sZW5ndGhfbGltaXQpOworc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKHRyYW5zKTsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIFB5T2JqZWN0KiBlbmNvZGVfaW1wbChQeU9iamVjdCogYXJncykgeworICBpZiAoIWFyZ3MpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgUHlPYmplY3QqIGVuY19vYmogPSBOVUxMOworICBQeU9iamVjdCogdHlwZV9hcmdzID0gTlVMTDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyIsICZlbmNfb2JqLCAmdHlwZV9hcmdzKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghZW5jX29iaiB8fCAhdHlwZV9hcmdzKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBUIHByb3RvY29sOworICBpZiAoIXByb3RvY29sLnByZXBhcmVFbmNvZGVCdWZmZXIoKSB8fCAhcHJvdG9jb2wuZW5jb2RlVmFsdWUoZW5jX29iaiwgVF9TVFJVQ1QsIHR5cGVfYXJncykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBwcm90b2NvbC5nZXRFbmNvZGVkVmFsdWUoKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIGFzX2xvbmdfdGhlbl9kZWxldGUoUHlPYmplY3QqIHZhbHVlLCBsb25nIGRlZmF1bHRfdmFsdWUpIHsKKyAgU2NvcGVkUHlPYmplY3Qgc2NvcGUodmFsdWUpOworICBsb25nIHYgPSBQeUludF9Bc0xvbmcodmFsdWUpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikpIHsKKyAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisgIHJldHVybiB2OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBQeU9iamVjdCogZGVjb2RlX2ltcGwoUHlPYmplY3QqIGFyZ3MpIHsKKyAgUHlPYmplY3QqIG91dHB1dF9vYmogPSBOVUxMOworICBQeU9iamVjdCogb3Byb3QgPSBOVUxMOworICBQeU9iamVjdCogdHlwZWFyZ3MgPSBOVUxMOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PTyIsICZvdXRwdXRfb2JqLCAmb3Byb3QsICZ0eXBlYXJncykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFQgcHJvdG9jb2w7CisgIGludDMyX3QgZGVmYXVsdF9saW1pdCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCk7CisgIHByb3RvY29sLnNldFN0cmluZ0xlbmd0aExpbWl0KAorICAgICAgYXNfbG9uZ190aGVuX2RlbGV0ZShQeU9iamVjdF9HZXRBdHRyKG9wcm90LCBJTlRFUk5fU1RSSU5HKHN0cmluZ19sZW5ndGhfbGltaXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9saW1pdCkpOworICBwcm90b2NvbC5zZXRDb250YWluZXJMZW5ndGhMaW1pdCgKKyAgICAgIGFzX2xvbmdfdGhlbl9kZWxldGUoUHlPYmplY3RfR2V0QXR0cihvcHJvdCwgSU5URVJOX1NUUklORyhjb250YWluZXJfbGVuZ3RoX2xpbWl0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfbGltaXQpKTsKKyAgU2NvcGVkUHlPYmplY3QgdHJhbnNwb3J0KFB5T2JqZWN0X0dldEF0dHIob3Byb3QsIElOVEVSTl9TVFJJTkcodHJhbnMpKSk7CisgIGlmICghdHJhbnNwb3J0KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBTdHJ1Y3RUeXBlQXJncyBwYXJzZWRhcmdzOworICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmICghcHJvdG9jb2wucHJlcGFyZURlY29kZUJ1ZmZlckZyb21UcmFuc3BvcnQodHJhbnNwb3J0LmdldCgpKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIHByb3RvY29sLnJlYWRTdHJ1Y3Qob3V0cHV0X29iaiwgcGFyc2VkYXJncy5rbGFzcywgcGFyc2VkYXJncy5zcGVjKTsKK30KK30KK30KK30KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpweTsKKworLyogLS0gUFlUSE9OIE1PRFVMRSBTRVRVUCBTVFVGRiAtLS0gKi8KKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBQeU9iamVjdCogZW5jb2RlX2JpbmFyeShQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBlbmNvZGVfaW1wbDxCaW5hcnlQcm90b2NvbD4oYXJncyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogZGVjb2RlX2JpbmFyeShQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBkZWNvZGVfaW1wbDxCaW5hcnlQcm90b2NvbD4oYXJncyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogZW5jb2RlX2NvbXBhY3QoUHlPYmplY3QqLCBQeU9iamVjdCogYXJncykgeworICByZXR1cm4gZW5jb2RlX2ltcGw8Q29tcGFjdFByb3RvY29sPihhcmdzKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBkZWNvZGVfY29tcGFjdChQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBkZWNvZGVfaW1wbDxDb21wYWN0UHJvdG9jb2w+KGFyZ3MpOworfQorCitzdGF0aWMgUHlNZXRob2REZWYgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHNbXSA9IHsKKyAgICB7ImVuY29kZV9iaW5hcnkiLCBlbmNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKKyAgICB7ImRlY29kZV9iaW5hcnkiLCBkZWNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKKyAgICB7ImVuY29kZV9jb21wYWN0IiwgZW5jb2RlX2NvbXBhY3QsIE1FVEhfVkFSQVJHUywgIiJ9LAorICAgIHsiZGVjb2RlX2NvbXBhY3QiLCBkZWNvZGVfY29tcGFjdCwgTUVUSF9WQVJBUkdTLCAiIn0sCisgICAge05VTEwsIE5VTEwsIDAsIE5VTEx9IC8qIFNlbnRpbmVsICovCit9OworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisKK3N0YXRpYyBzdHJ1Y3QgUHlNb2R1bGVEZWYgVGhyaWZ0RmFzdEJpbmFyeURlZiA9IHtQeU1vZHVsZURlZl9IRUFEX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmlmdC5wcm90b2NvbC5mYXN0YmluYXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTH07CisKKyNkZWZpbmUgSU5JVEVSUk9SIHJldHVybiBOVUxMOworCitQeU9iamVjdCogUHlJbml0X2Zhc3RiaW5hcnkoKSB7CisKKyNlbHNlCisKKyNkZWZpbmUgSU5JVEVSUk9SIHJldHVybjsKKwordm9pZCBpbml0ZmFzdGJpbmFyeSgpIHsKKworICBQeWNTdHJpbmdfSU1QT1JUOworICBpZiAoUHljU3RyaW5nSU8gPT0gTlVMTCkKKyAgICBJTklURVJST1IKKworI2VuZGlmCisKKyNkZWZpbmUgSU5JVF9JTlRFUk5fU1RSSU5HKHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJTlRFUk5fU1RSSU5HKHZhbHVlKSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoI3ZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIUlOVEVSTl9TVFJJTkcodmFsdWUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIElOSVRFUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworICBJTklUX0lOVEVSTl9TVFJJTkcoVEZyb3plbkRpY3QpOworICBJTklUX0lOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1Zik7CisgIElOSVRfSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKTsKKyAgSU5JVF9JTlRFUk5fU1RSSU5HKHN0cmluZ19sZW5ndGhfbGltaXQpOworICBJTklUX0lOVEVSTl9TVFJJTkcoY29udGFpbmVyX2xlbmd0aF9saW1pdCk7CisgIElOSVRfSU5URVJOX1NUUklORyh0cmFucyk7CisjdW5kZWYgSU5JVF9JTlRFUk5fU1RSSU5HCisKKyAgUHlPYmplY3QqIG1vZHVsZSA9CisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisgICAgICBQeU1vZHVsZV9DcmVhdGUoJlRocmlmdEZhc3RCaW5hcnlEZWYpOworI2Vsc2UKKyAgICAgIFB5X0luaXRNb2R1bGUoInRocmlmdC5wcm90b2NvbC5mYXN0YmluYXJ5IiwgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHMpOworI2VuZGlmCisgIGlmIChtb2R1bGUgPT0gTlVMTCkKKyAgICBJTklURVJST1I7CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAgcmV0dXJuIG1vZHVsZTsKKyNlbmRpZgorfQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wuaCBiL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxYjdlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9QUk9UT0NPTF9ICisjZGVmaW5lIFRIUklGVF9QWV9QUk9UT0NPTF9ICisKKyNpbmNsdWRlICJleHQvdHlwZXMuaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2NsYXNzIFByb3RvY29sQmFzZSB7CisKK3B1YmxpYzoKKyAgUHJvdG9jb2xCYXNlKCkKKyAgICA6IHN0cmluZ0xpbWl0Xygoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSwKKyAgICAgIGNvbnRhaW5lckxpbWl0Xygoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSwKKyAgICAgIG91dHB1dF8oTlVMTCkge30KKyAgaW5saW5lIHZpcnR1YWwgflByb3RvY29sQmFzZSgpOworCisgIGJvb2wgcHJlcGFyZURlY29kZUJ1ZmZlckZyb21UcmFuc3BvcnQoUHlPYmplY3QqIHRyYW5zKTsKKworICBQeU9iamVjdCogcmVhZFN0cnVjdChQeU9iamVjdCogb3V0cHV0LCBQeU9iamVjdCoga2xhc3MsIFB5T2JqZWN0KiBzcGVjX3NlcSk7CisKKyAgYm9vbCBwcmVwYXJlRW5jb2RlQnVmZmVyKCk7CisKKyAgYm9vbCBlbmNvZGVWYWx1ZShQeU9iamVjdCogdmFsdWUsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKKyAgUHlPYmplY3QqIGdldEVuY29kZWRWYWx1ZSgpOworCisgIGxvbmcgc3RyaW5nTGltaXQoKSBjb25zdCB7IHJldHVybiBzdHJpbmdMaW1pdF87IH0KKyAgdm9pZCBzZXRTdHJpbmdMZW5ndGhMaW1pdChsb25nIGxpbWl0KSB7IHN0cmluZ0xpbWl0XyA9IGxpbWl0OyB9CisKKyAgbG9uZyBjb250YWluZXJMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGNvbnRhaW5lckxpbWl0XzsgfQorICB2b2lkIHNldENvbnRhaW5lckxlbmd0aExpbWl0KGxvbmcgbGltaXQpIHsgY29udGFpbmVyTGltaXRfID0gbGltaXQ7IH0KKworcHJvdGVjdGVkOgorICBib29sIHJlYWRCeXRlcyhjaGFyKiogb3V0cHV0LCBpbnQgbGVuKTsKKworICBib29sIHJlYWRCeXRlKHVpbnQ4X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBzdGF0aWNfY2FzdDx1aW50OF90PihidWZbMF0pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZUJ1ZmZlcihjaGFyKiBkYXRhLCBzaXplX3QgbGVuKTsKKworICB2b2lkIHdyaXRlQnl0ZSh1aW50OF90IHZhbCkgeyB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmdmFsKSwgMSk7IH0KKworICBQeU9iamVjdCogZGVjb2RlVmFsdWUoVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworICBib29sIHNraXAoVFR5cGUgdHlwZSk7CisKKyAgaW5saW5lIGJvb2wgY2hlY2tUeXBlKFRUeXBlIGdvdCwgVFR5cGUgZXhwZWN0ZWQpOworICBpbmxpbmUgYm9vbCBjaGVja0xlbmd0aExpbWl0KGludDMyX3QgbGVuLCBsb25nIGxpbWl0KTsKKworICBpbmxpbmUgYm9vbCBpc1V0ZjgoUHlPYmplY3QqIHR5cGVhcmdzKTsKKworcHJpdmF0ZToKKyAgSW1wbCogaW1wbCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PEltcGwqPih0aGlzKTsgfQorCisgIGxvbmcgc3RyaW5nTGltaXRfOworICBsb25nIGNvbnRhaW5lckxpbWl0XzsKKyAgRW5jb2RlQnVmZmVyKiBvdXRwdXRfOworICBEZWNvZGVCdWZmZXIgaW5wdXRfOworfTsKK30KK30KK30KKworI2luY2x1ZGUgImV4dC9wcm90b2NvbC50Y2MiCisKKyNlbmRpZiAvLyBUSFJJRlRfUFlfUFJPVE9DT0xfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wudGNjIGIvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNWRmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC50Y2MKQEAgLTAsMCArMSw5MTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFlfUFJPVE9DT0xfVENDCisjZGVmaW5lIFRIUklGVF9QWV9QUk9UT0NPTF9UQ0MKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorCisjZGVmaW5lIENIRUNLX1JBTkdFKHYsIG1pbiwgbWF4KSAoKCh2KSA8PSAobWF4KSkgJiYgKCh2KSA+PSAobWluKSkpCisjZGVmaW5lIElOSVRfT1VUQlVGX1NJWkUgMTI4CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworI2luY2x1ZGUgPGNTdHJpbmdJTy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworCituYW1lc3BhY2UgZGV0YWlsIHsKKworaW5saW5lIGJvb2wgaW5wdXRfY2hlY2soUHlPYmplY3QqIGlucHV0KSB7CisgIHJldHVybiBQeWNTdHJpbmdJT19JbnB1dENoZWNrKGlucHV0KTsKK30KKworaW5saW5lIEVuY29kZUJ1ZmZlciogbmV3X2VuY29kZV9idWZmZXIoc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBQeWNTdHJpbmdJTy0+TmV3T3V0cHV0KHNpemUpOworfQorCitpbmxpbmUgaW50IHJlYWRfYnVmZmVyKFB5T2JqZWN0KiBidWYsIGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgImZhaWxlZCB0byBpbXBvcnQgbmF0aXZlIGNTdHJpbmdJTyIpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gUHljU3RyaW5nSU8tPmNyZWFkKGJ1Ziwgb3V0cHV0LCBsZW4pOworfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBQcm90b2NvbEJhc2U8SW1wbD46On5Qcm90b2NvbEJhc2UoKSB7CisgIGlmIChvdXRwdXRfKSB7CisgICAgUHlfQ0xFQVIob3V0cHV0Xyk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OmlzVXRmOChQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgcmV0dXJuIFB5U3RyaW5nX0NoZWNrKHR5cGVhcmdzKSAmJiAhc3RybmNtcChQeVN0cmluZ19BU19TVFJJTkcodHlwZWFyZ3MpLCAiVVRGOCIsIDQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK1B5T2JqZWN0KiBQcm90b2NvbEJhc2U8SW1wbD46OmdldEVuY29kZWRWYWx1ZSgpIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBQeWNTdHJpbmdJTy0+Y2dldHZhbHVlKG91dHB1dF8pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBib29sIFByb3RvY29sQmFzZTxJbXBsPjo6d3JpdGVCdWZmZXIoY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgImZhaWxlZCB0byBpbXBvcnQgbmF0aXZlIGNTdHJpbmdJTyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbnQgbGVuID0gUHljU3RyaW5nSU8tPmN3cml0ZShvdXRwdXRfLCBkYXRhLCBzaXplKTsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImZhaWxlZCB0byB3cml0ZSB0byBjU3RyaW5nSU8gb2JqZWN0Iik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGxlbikgIT0gc2l6ZSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19FT0ZFcnJvciwgIndyaXRlIGxlbmd0aCBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1IGdvdCAlZCIsIHNpemUsIGxlbik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisjZWxzZQorCituYW1lc3BhY2UgZGV0YWlsIHsKKworaW5saW5lIGJvb2wgaW5wdXRfY2hlY2soUHlPYmplY3QqIGlucHV0KSB7CisgIC8vIFRPRE86IENoZWNrIGZvciBCeXRlc0lPIHR5cGUKKyAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBFbmNvZGVCdWZmZXIqIG5ld19lbmNvZGVfYnVmZmVyKHNpemVfdCBzaXplKSB7CisgIEVuY29kZUJ1ZmZlciogYnVmZmVyID0gbmV3IEVuY29kZUJ1ZmZlcjsKKyAgYnVmZmVyLT5idWYucmVzZXJ2ZShzaXplKTsKKyAgYnVmZmVyLT5wb3MgPSAwOworICByZXR1cm4gYnVmZmVyOworfQorCitzdHJ1Y3QgYnl0ZXNpbyB7CisgIFB5T2JqZWN0X0hFQUQKKyNpZiBQWV9NSU5PUl9WRVJTSU9OIDwgNQorICAgICAgY2hhciogYnVmOworI2Vsc2UKKyAgICAgIFB5T2JqZWN0KiBidWY7CisjZW5kaWYKKyAgUHlfc3NpemVfdCBwb3M7CisgIFB5X3NzaXplX3Qgc3RyaW5nX3NpemU7Cit9OworCitpbmxpbmUgaW50IHJlYWRfYnVmZmVyKFB5T2JqZWN0KiBidWYsIGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKKyAgYnl0ZXNpbyogYnVmMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Ynl0ZXNpbyo+KGJ1Zik7CisjaWYgUFlfTUlOT1JfVkVSU0lPTiA8IDUKKyAgKm91dHB1dCA9IGJ1ZjItPmJ1ZiArIGJ1ZjItPnBvczsKKyNlbHNlCisgICpvdXRwdXQgPSBQeUJ5dGVzX0FTX1NUUklORyhidWYyLT5idWYpICsgYnVmMi0+cG9zOworI2VuZGlmCisgIFB5X3NzaXplX3QgcG9zMCA9IGJ1ZjItPnBvczsKKyAgYnVmMi0+cG9zID0gKHN0ZDo6bWluKShidWYyLT5wb3MgKyBzdGF0aWNfY2FzdDxQeV9zc2l6ZV90PihsZW4pLCBidWYyLT5zdHJpbmdfc2l6ZSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGJ1ZjItPnBvcyAtIHBvczApOworfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBQcm90b2NvbEJhc2U8SW1wbD46On5Qcm90b2NvbEJhc2UoKSB7CisgIGlmIChvdXRwdXRfKSB7CisgICAgZGVsZXRlIG91dHB1dF87CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OmlzVXRmOChQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgLy8gd2hpbGUgY29uZGl0aW9uIGZvciBweTIgaXMgImFyZyA9PSAnVVRGOCciLCBpdCBzaG91bGQgYmUgImFyZyAhPSAnQklOQVJZJyIgZm9yIHB5My4KKyAgLy8gSEFDSzogY2hlY2sgdGhlIGxlbmd0aCBhbmQgZG9uJ3QgYm90aGVyIHJlYWRpbmcgdGhlIHZhbHVlCisgIHJldHVybiAhUHlVbmljb2RlX0NoZWNrKHR5cGVhcmdzKSB8fCBQeVVuaWNvZGVfR0VUX0xFTkdUSCh0eXBlYXJncykgIT0gNjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitQeU9iamVjdCogUHJvdG9jb2xCYXNlPEltcGw+OjpnZXRFbmNvZGVkVmFsdWUoKSB7CisgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKG91dHB1dF8tPmJ1Zi5kYXRhKCksIG91dHB1dF8tPmJ1Zi5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBib29sIFByb3RvY29sQmFzZTxJbXBsPjo6d3JpdGVCdWZmZXIoY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgc2l6ZV90IG5lZWQgPSBzaXplICsgb3V0cHV0Xy0+cG9zOworICBpZiAob3V0cHV0Xy0+YnVmLmNhcGFjaXR5KCkgPCBuZWVkKSB7CisgICAgdHJ5IHsKKyAgICAgIG91dHB1dF8tPmJ1Zi5yZXNlcnZlKG5lZWQpOworICAgIH0gY2F0Y2ggKHN0ZDo6YmFkX2FsbG9jJiBleCkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHdyaXRlIGJ1ZmZlciIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICBzdGQ6OmNvcHkoZGF0YSwgZGF0YSArIHNpemUsIHN0ZDo6YmFja19pbnNlcnRlcihvdXRwdXRfLT5idWYpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZgorCituYW1lc3BhY2UgZGV0YWlsIHsKKworI2RlZmluZSBERUNMQVJFX09QX1NDT1BFKG5hbWUsIG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgbmFtZSMjU2NvcGUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEltcGwqIGltcGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgdmFsaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5hbWUjI1Njb3BlKEltcGwqIHRoaXopIDogaW1wbCh0aGl6KSwgdmFsaWQoaW1wbC0+b3AjI0JlZ2luKCkpIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH5uYW1lIyNTY29wZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKHZhbGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbXBsLT5vcCMjRW5kKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9wZXJhdG9yIGJvb2woKSB7IHJldHVybiB2YWxpZDsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbCwgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lIyNTY29wZTxJbXBsPiBvcCMjU2NvcGUoVDxJbXBsPiogdGhpeikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuYW1lIyNTY29wZTxJbXBsPihzdGF0aWNfY2FzdDxJbXBsKj4odGhpeikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CitERUNMQVJFX09QX1NDT1BFKFdyaXRlU3RydWN0LCB3cml0ZVN0cnVjdCkKK0RFQ0xBUkVfT1BfU0NPUEUoUmVhZFN0cnVjdCwgcmVhZFN0cnVjdCkKKyN1bmRlZiBERUNMQVJFX09QX1NDT1BFCisKK2lubGluZSBib29sIGNoZWNrX3NzaXplX3RfMzIoUHlfc3NpemVfdCBsZW4pIHsKKyAgLy8gZXJyb3IgZnJvbSBnZXR0aW5nIHRoZSBpbnQKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGxlbikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFDSEVDS19SQU5HRShsZW4sIDAsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzaXplIG91dCBvZiByYW5nZTogZXhjZWVkZWQgSU5UMzJfTUFYIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgcGFyc2VfcHlpbnQoUHlPYmplY3QqIG8sIFQqIHJldCwgaW50MzJfdCBtaW4sIGludDMyX3QgbWF4KSB7CisgIGxvbmcgdmFsID0gUHlJbnRfQXNMb25nKG8pOworCisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2YWwpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghQ0hFQ0tfUkFOR0UodmFsLCBtaW4sIG1heCkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImludCBvdXQgb2YgcmFuZ2UiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqcmV0ID0gc3RhdGljX2Nhc3Q8VD4odmFsKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIGJvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpjaGVja1R5cGUoVFR5cGUgZ290LCBUVHlwZSBleHBlY3RlZCkgeworICBpZiAoZXhwZWN0ZWQgIT0gZ290KSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdvdCB3cm9uZyB0dHlwZSB3aGlsZSByZWFkaW5nIGZpZWxkIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpjaGVja0xlbmd0aExpbWl0KGludDMyX3QgbGVuLCBsb25nIGxpbWl0KSB7CisgIGlmIChsZW4gPCAwKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsICJuZWdhdGl2ZSBsZW5ndGg6ICVsZCIsIGxpbWl0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGxlbiA+IGxpbWl0KSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsICJzaXplIGV4Y2VlZGVkIHNwZWNpZmllZCBsaW1pdDogJWxkIiwgbGltaXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Citib29sIFByb3RvY29sQmFzZTxJbXBsPjo6cmVhZEJ5dGVzKGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgImF0dGVtcHRlZCB0byByZWFkIG5lZ2F0aXZlIGxlbmd0aDogJWQiLCBsZW4pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBUT0RPKGRyZWlzcyk6IERvbid0IGZlYXIgdGhlIG1hbGxvYy4gIFRoaW5rIGFib3V0IHRha2luZyBhIGNvcHkgb2YKKyAgLy8gICAgICAgICAgICAgICB0aGUgcGFydGlhbCByZWFkIGluc3RlYWQgb2YgZm9yY2luZyB0aGUgdHJhbnNwb3J0CisgIC8vICAgICAgICAgICAgICAgdG8gcHJlcGVuZCBpdCB0byBpdHMgYnVmZmVyLgorCisgIGludCBybGVuID0gZGV0YWlsOjpyZWFkX2J1ZmZlcihpbnB1dF8uc3RyaW5naW9idWYuZ2V0KCksIG91dHB1dCwgbGVuKTsKKworICBpZiAocmxlbiA9PSBsZW4pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChybGVuID09IC0xKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIC8vIHVzaW5nIGJ1aWxkaW5nIGZ1bmN0aW9ucyBhcyB0aGlzIGlzIGEgcmFyZSBjb2RlcGF0aAorICAgIFNjb3BlZFB5T2JqZWN0IG5ld2lvYnVmKFB5T2JqZWN0X0NhbGxGdW5jdGlvbihpbnB1dF8ucmVmaWxsX2NhbGxhYmxlLmdldCgpLCByZWZpbGxfc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCBybGVuLCBsZW4sIE5VTEwpKTsKKyAgICBpZiAoIW5ld2lvYnVmKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gbXVzdCBkbyB0aGlzICpBRlRFUiogdGhlIGNhbGwgc28gdGhhdCB3ZSBkb24ndCBkZXJlZiB0aGUgaW8gYnVmZmVyCisgICAgaW5wdXRfLnN0cmluZ2lvYnVmLnJlc2V0KG5ld2lvYnVmLnJlbGVhc2UoKSk7CisKKyAgICBybGVuID0gZGV0YWlsOjpyZWFkX2J1ZmZlcihpbnB1dF8uc3RyaW5naW9idWYuZ2V0KCksIG91dHB1dCwgbGVuKTsKKworICAgIGlmIChybGVuID09IGxlbikgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChybGVuID09IC0xKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRPRE8oZHJlaXNzKTogVGhpcyBjb3VsZCBiZSBhIHZhbGlkIGNvZGUgcGF0aCBmb3IgYmlnIGJpbmFyeSBibG9icy4KKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZWZpbGwgY2xhaW1lZCB0byBoYXZlIHJlZmlsbGVkIHRoZSBidWZmZXIsIGJ1dCBkaWRuJ3QhISIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpwcmVwYXJlRGVjb2RlQnVmZmVyRnJvbVRyYW5zcG9ydChQeU9iamVjdCogdHJhbnMpIHsKKyAgaWYgKGlucHV0Xy5zdHJpbmdpb2J1ZikgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGVjb2RlIGJ1ZmZlciBpcyBhbHJlYWR5IGluaXRpYWxpemVkIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU2NvcGVkUHlPYmplY3Qgc3RyaW5naW9idWYoUHlPYmplY3RfR2V0QXR0cih0cmFucywgSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKSkpOworICBpZiAoIXN0cmluZ2lvYnVmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghZGV0YWlsOjppbnB1dF9jaGVjayhzdHJpbmdpb2J1Zi5nZXQoKSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIHN0cmluZ2lvIGlucHV0XyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFNjb3BlZFB5T2JqZWN0IHJlZmlsbF9jYWxsYWJsZShQeU9iamVjdF9HZXRBdHRyKHRyYW5zLCBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpKSk7CisgIGlmICghcmVmaWxsX2NhbGxhYmxlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghUHlDYWxsYWJsZV9DaGVjayhyZWZpbGxfY2FsbGFibGUuZ2V0KCkpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyBjYWxsYWJsZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlucHV0Xy5zdHJpbmdpb2J1Zi5zd2FwKHN0cmluZ2lvYnVmKTsKKyAgaW5wdXRfLnJlZmlsbF9jYWxsYWJsZS5zd2FwKHJlZmlsbF9jYWxsYWJsZSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpwcmVwYXJlRW5jb2RlQnVmZmVyKCkgeworICBvdXRwdXRfID0gZGV0YWlsOjpuZXdfZW5jb2RlX2J1ZmZlcihJTklUX09VVEJVRl9TSVpFKTsKKyAgcmV0dXJuIG91dHB1dF8gIT0gTlVMTDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Citib29sIFByb3RvY29sQmFzZTxJbXBsPjo6ZW5jb2RlVmFsdWUoUHlPYmplY3QqIHZhbHVlLCBUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgLyoKKyAgICogUmVmY291bnRpbmcgU3RyYXRlZ3k6CisgICAqCisgICAqIFdlIGFzc3VtZSB0aGF0IGVsZW1lbnRzIG9mIHRoZSB0aHJpZnRfc3BlYyB0dXBsZSBhcmUgbm90IGdvaW5nIHRvIGJlCisgICAqIG11dGF0ZWQsIHNvIHdlIGRvbid0IHJlZiBjb3VudCB0aG9zZSBhdCBhbGwuIE90aGVyIHRoYW4gdGhhdCwgd2UgdHJ5IHRvCisgICAqIGtlZXAgYSByZWZlcmVuY2UgdG8gYWxsIHRoZSB1c2VyLWNyZWF0ZWQgb2JqZWN0cyB3aGlsZSB3ZSB3b3JrIHdpdGggdGhlbS4KKyAgICogZW5jb2RlVmFsdWUgYXNzdW1lcyB0aGF0IGEgcmVmZXJlbmNlIGlzIGFscmVhZHkgaGVsZC4gVGhlICpjYWxsZXIqIGlzCisgICAqIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyByZWZlcmVuY2VzCisgICAqLworCisgIHN3aXRjaCAodHlwZSkgeworCisgIGNhc2UgVF9CT09MOiB7CisgICAgaW50IHYgPSBQeU9iamVjdF9Jc1RydWUodmFsdWUpOworICAgIGlmICh2ID09IC0xKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGltcGwoKS0+d3JpdGVCb29sKHYpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhc2UgVF9JMDg6IHsKKyAgICBpbnQ4X3QgdmFsOworCisgICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWluKSgpLAorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWF4KSgpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVJOCh2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhc2UgVF9JMTY6IHsKKyAgICBpbnQxNl90IHZhbDsKKworICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4pKCksCisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KSgpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVJMTYodmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBjYXNlIFRfSTMyOiB7CisgICAgaW50MzJfdCB2YWw7CisKKyAgICBpZiAoIXBhcnNlX3B5aW50KHZhbHVlLCAmdmFsLCAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpLAorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlSTMyKHZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY2FzZSBUX0k2NDogeworICAgIGludDY0X3QgbnZhbCA9IFB5TG9uZ19Bc0xvbmdMb25nKHZhbHVlKTsKKworICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChudmFsKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghQ0hFQ0tfUkFOR0UobnZhbCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbikoKSwKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgpKCkpKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImludCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlSTY0KG52YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX0RPVUJMRTogeworICAgIGRvdWJsZSBudmFsID0gUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7CisgICAgaWYgKG52YWwgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW1wbCgpLT53cml0ZURvdWJsZShudmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9TVFJJTkc6IHsKKyAgICBTY29wZWRQeU9iamVjdCBudmFsOworCisgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgIG52YWwucmVzZXQoUHlVbmljb2RlX0FzVVRGOFN0cmluZyh2YWx1ZSkpOworICAgICAgaWYgKCFudmFsKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgIG52YWwucmVzZXQodmFsdWUpOworICAgIH0KKworICAgIFB5X3NzaXplX3QgbGVuID0gUHlCeXRlc19TaXplKG52YWwuZ2V0KCkpOworICAgIGlmICghZGV0YWlsOjpjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlU3RyaW5nKG52YWwuZ2V0KCksIHN0YXRpY19jYXN0PGludDMyX3Q+KGxlbikpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX0xJU1Q6CisgIGNhc2UgVF9TRVQ6IHsKKyAgICBTZXRMaXN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgICBpZiAoIXBhcnNlX3NldF9saXN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFB5X3NzaXplX3QgbGVuID0gUHlPYmplY3RfTGVuZ3RoKHZhbHVlKTsKKyAgICBpZiAoIWRldGFpbDo6Y2hlY2tfc3NpemVfdF8zMihsZW4pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFpbXBsKCktPndyaXRlTGlzdEJlZ2luKHZhbHVlLCBwYXJzZWRhcmdzLCBzdGF0aWNfY2FzdDxpbnQzMl90PihsZW4pKSB8fCBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFNjb3BlZFB5T2JqZWN0IGl0ZXJhdG9yKFB5T2JqZWN0X0dldEl0ZXIodmFsdWUpKTsKKyAgICBpZiAoIWl0ZXJhdG9yKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgd2hpbGUgKFB5T2JqZWN0KiByYXdJdGVtID0gUHlJdGVyX05leHQoaXRlcmF0b3IuZ2V0KCkpKSB7CisgICAgICBTY29wZWRQeU9iamVjdCBpdGVtKHJhd0l0ZW0pOworICAgICAgaWYgKCFlbmNvZGVWYWx1ZShpdGVtLmdldCgpLCBwYXJzZWRhcmdzLmVsZW1lbnRfdHlwZSwgcGFyc2VkYXJncy50eXBlYXJncykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX01BUDogeworICAgIFB5X3NzaXplX3QgbGVuID0gUHlEaWN0X1NpemUodmFsdWUpOworICAgIGlmICghZGV0YWlsOjpjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBNYXBUeXBlQXJncyBwYXJzZWRhcmdzOworICAgIGlmICghcGFyc2VfbWFwX2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghaW1wbCgpLT53cml0ZU1hcEJlZ2luKHZhbHVlLCBwYXJzZWRhcmdzLCBzdGF0aWNfY2FzdDxpbnQzMl90PihsZW4pKSB8fCBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBQeU9iamVjdCogayA9IE5VTEw7CisgICAgUHlPYmplY3QqIHYgPSBOVUxMOworICAgIC8vIFRPRE8oYm1hdXJlcik6IHNob3VsZCBzdXBwb3J0IGFueSBtYXBwaW5nLCBub3QganVzdCBkaWN0cworICAgIHdoaWxlIChQeURpY3RfTmV4dCh2YWx1ZSwgJnBvcywgJmssICZ2KSkgeworICAgICAgaWYgKCFlbmNvZGVWYWx1ZShrLCBwYXJzZWRhcmdzLmt0YWcsIHBhcnNlZGFyZ3Mua3R5cGVhcmdzKQorICAgICAgICAgIHx8ICFlbmNvZGVWYWx1ZSh2LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX1NUUlVDVDogeworICAgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHlfc3NpemVfdCBuc3BlYyA9IFB5VHVwbGVfU2l6ZShwYXJzZWRhcmdzLnNwZWMpOworICAgIGlmIChuc3BlYyA9PSAtMSkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInNwZWMgaXMgbm90IGEgdHVwbGUiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZXRhaWw6OldyaXRlU3RydWN0U2NvcGU8SW1wbD4gc2NvcGUgPSBkZXRhaWw6OndyaXRlU3RydWN0U2NvcGUodGhpcyk7CisgICAgaWYgKCFzY29wZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKFB5X3NzaXplX3QgaSA9IDA7IGkgPCBuc3BlYzsgaSsrKSB7CisgICAgICBQeU9iamVjdCogc3BlY190dXBsZSA9IFB5VHVwbGVfR0VUX0lURU0ocGFyc2VkYXJncy5zcGVjLCBpKTsKKyAgICAgIGlmIChzcGVjX3R1cGxlID09IFB5X05vbmUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIFN0cnVjdEl0ZW1TcGVjIHBhcnNlZHNwZWM7CisgICAgICBpZiAoIXBhcnNlX3N0cnVjdF9pdGVtX3NwZWMoJnBhcnNlZHNwZWMsIHNwZWNfdHVwbGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgU2NvcGVkUHlPYmplY3QgaW5zdHZhbChQeU9iamVjdF9HZXRBdHRyKHZhbHVlLCBwYXJzZWRzcGVjLmF0dHJuYW1lKSk7CisKKyAgICAgIGlmICghaW5zdHZhbCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0dmFsLmdldCgpID09IFB5X05vbmUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGJvb2wgcmVzID0gaW1wbCgpLT53cml0ZUZpZWxkKGluc3R2YWwuZ2V0KCksIHBhcnNlZHNwZWMpOworICAgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBpbXBsKCktPndyaXRlRmllbGRTdG9wKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfU1RPUDoKKyAgY2FzZSBUX1ZPSUQ6CisgIGNhc2UgVF9VVEYxNjoKKyAgY2FzZSBUX1VURjg6CisgIGNhc2UgVF9VNjQ6CisgIGRlZmF1bHQ6CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUgZm9yIGVuY29kZVZhbHVlOiAlZCIsIHR5cGUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+Ojpza2lwKFRUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgVF9CT09MOgorICAgIHJldHVybiBpbXBsKCktPnNraXBCb29sKCk7CisgIGNhc2UgVF9JMDg6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcEJ5dGUoKTsKKyAgY2FzZSBUX0kxNjoKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwSTE2KCk7CisgIGNhc2UgVF9JMzI6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcEkzMigpOworICBjYXNlIFRfSTY0OgorICAgIHJldHVybiBpbXBsKCktPnNraXBJNjQoKTsKKyAgY2FzZSBUX0RPVUJMRToKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwRG91YmxlKCk7CisKKyAgY2FzZSBUX1NUUklORzogeworICAgIHJldHVybiBpbXBsKCktPnNraXBTdHJpbmcoKTsKKyAgfQorCisgIGNhc2UgVF9MSVNUOgorICBjYXNlIFRfU0VUOiB7CisgICAgVFR5cGUgZXR5cGUgPSBUX1NUT1A7CisgICAgaW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRMaXN0QmVnaW4oZXR5cGUpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpZiAoIXNraXAoZXR5cGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfTUFQOiB7CisgICAgVFR5cGUga3R5cGUgPSBUX1NUT1A7CisgICAgVFR5cGUgdnR5cGUgPSBUX1NUT1A7CisgICAgaW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRNYXBCZWdpbihrdHlwZSwgdnR5cGUpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpZiAoIXNraXAoa3R5cGUpIHx8ICFza2lwKHZ0eXBlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX1NUUlVDVDogeworICAgIGRldGFpbDo6UmVhZFN0cnVjdFNjb3BlPEltcGw+IHNjb3BlID0gZGV0YWlsOjpyZWFkU3RydWN0U2NvcGUodGhpcyk7CisgICAgaWYgKCFzY29wZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgVFR5cGUgdHlwZSA9IFRfU1RPUDsKKyAgICAgIGludDE2X3QgdGFnOworICAgICAgaWYgKCFpbXBsKCktPnJlYWRGaWVsZEJlZ2luKHR5cGUsIHRhZykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKCFza2lwKHR5cGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfU1RPUDoKKyAgY2FzZSBUX1ZPSUQ6CisgIGNhc2UgVF9VVEYxNjoKKyAgY2FzZSBUX1VURjg6CisgIGNhc2UgVF9VNjQ6CisgIGRlZmF1bHQ6CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUgZm9yIHNraXA6ICVkIiwgdHlwZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlLgordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitQeU9iamVjdCogUHJvdG9jb2xCYXNlPEltcGw+OjpkZWNvZGVWYWx1ZShUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisKKyAgY2FzZSBUX0JPT0w6IHsKKyAgICBib29sIHYgPSAwOworICAgIGlmICghaW1wbCgpLT5yZWFkQm9vbCh2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh2KSB7CisgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIH0KKyAgfQorICBjYXNlIFRfSTA4OiB7CisgICAgaW50OF90IHYgPSAwOworICAgIGlmICghaW1wbCgpLT5yZWFkSTgodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7CisgIH0KKyAgY2FzZSBUX0kxNjogeworICAgIGludDE2X3QgdiA9IDA7CisgICAgaWYgKCFpbXBsKCktPnJlYWRJMTYodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7CisgIH0KKyAgY2FzZSBUX0kzMjogeworICAgIGludDMyX3QgdiA9IDA7CisgICAgaWYgKCFpbXBsKCktPnJlYWRJMzIodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7CisgIH0KKworICBjYXNlIFRfSTY0OiB7CisgICAgaW50NjRfdCB2ID0gMDsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEk2NCh2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8vIFRPRE8oZHJlaXNzKTogRmluZCBvdXQgaWYgd2UgY2FuIHRha2UgdGhpcyBmYXN0cGF0aCBhbHdheXMgd2hlbgorICAgIC8vICAgICAgICAgICAgICAgc2l6ZW9mKGxvbmcpID09IHNpemVvZihsb25nIGxvbmcpLgorICAgIGlmIChDSEVDS19SQU5HRSh2LCBMT05HX01JTiwgTE9OR19NQVgpKSB7CisgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpdik7CisgICAgfQorICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHYpOworICB9CisKKyAgY2FzZSBUX0RPVUJMRTogeworICAgIGRvdWJsZSB2ID0gMC4wOworICAgIGlmICghaW1wbCgpLT5yZWFkRG91YmxlKHYpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2KTsKKyAgfQorCisgIGNhc2UgVF9TVFJJTkc6IHsKKyAgICBjaGFyKiBidWYgPSBOVUxMOworICAgIGludCBsZW4gPSBpbXBsKCktPnJlYWRTdHJpbmcoJmJ1Zik7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaXNVdGY4KHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4KGJ1ZiwgbGVuLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBsZW4pOworICAgIH0KKyAgfQorCisgIGNhc2UgVF9MSVNUOgorICBjYXNlIFRfU0VUOiB7CisgICAgU2V0TGlzdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFRUeXBlIGV0eXBlID0gVF9TVE9QOworICAgIGludDMyX3QgbGVuID0gaW1wbCgpLT5yZWFkTGlzdEJlZ2luKGV0eXBlKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChsZW4gPiAwICYmICFjaGVja1R5cGUoZXR5cGUsIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYm9vbCB1c2VfdHVwbGUgPSB0eXBlID09IFRfTElTVCAmJiBwYXJzZWRhcmdzLmltbXV0YWJsZTsKKyAgICBTY29wZWRQeU9iamVjdCByZXQodXNlX3R1cGxlID8gUHlUdXBsZV9OZXcobGVuKSA6IFB5TGlzdF9OZXcobGVuKSk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIFB5T2JqZWN0KiBpdGVtID0gZGVjb2RlVmFsdWUoZXR5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpOworICAgICAgaWYgKCFpdGVtKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgaWYgKHVzZV90dXBsZSkgeworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJldC5nZXQoKSwgaSwgaXRlbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBQeUxpc3RfU0VUX0lURU0ocmV0LmdldCgpLCBpLCBpdGVtKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIGJpdGluZyB0aGUgYnVsbGV0IGFuZCBtYWtpbmcgdHdvIHNlcGFyYXRlIGNhc2VzCisgICAgLy8gICAgICAgICAgICAgICBmb3IgbGlzdCBhbmQgc2V0LCBhdm9pZGluZyB0aGlzIHBvc3QgZmFjdG8gY29udmVyc2lvbi4KKyAgICBpZiAodHlwZSA9PSBUX1NFVCkgeworICAgICAgUHlPYmplY3QqIHNldHJldDsKKyAgICAgIHNldHJldCA9IHBhcnNlZGFyZ3MuaW1tdXRhYmxlID8gUHlGcm96ZW5TZXRfTmV3KHJldC5nZXQoKSkgOiBQeVNldF9OZXcocmV0LmdldCgpKTsKKyAgICAgIHJldHVybiBzZXRyZXQ7CisgICAgfQorICAgIHJldHVybiByZXQucmVsZWFzZSgpOworICB9CisKKyAgY2FzZSBUX01BUDogeworICAgIE1hcFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBUVHlwZSBrdHlwZSA9IFRfU1RPUDsKKyAgICBUVHlwZSB2dHlwZSA9IFRfU1RPUDsKKyAgICB1aW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRNYXBCZWdpbihrdHlwZSwgdnR5cGUpOworICAgIGlmIChsZW4gPiAwICYmICghY2hlY2tUeXBlKGt0eXBlLCBwYXJzZWRhcmdzLmt0YWcpIHx8ICFjaGVja1R5cGUodnR5cGUsIHBhcnNlZGFyZ3MudnRhZykpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTY29wZWRQeU9iamVjdCByZXQoUHlEaWN0X05ldygpKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBTY29wZWRQeU9iamVjdCBrKGRlY29kZVZhbHVlKGt0eXBlLCBwYXJzZWRhcmdzLmt0eXBlYXJncykpOworICAgICAgaWYgKCFrKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgU2NvcGVkUHlPYmplY3QgdihkZWNvZGVWYWx1ZSh2dHlwZSwgcGFyc2VkYXJncy52dHlwZWFyZ3MpKTsKKyAgICAgIGlmICghdikgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmIChQeURpY3RfU2V0SXRlbShyZXQuZ2V0KCksIGsuZ2V0KCksIHYuZ2V0KCkpID09IC0xKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKworICAgIGlmIChwYXJzZWRhcmdzLmltbXV0YWJsZSkgeworICAgICAgaWYgKCFUaHJpZnRNb2R1bGUpIHsKKyAgICAgICAgVGhyaWZ0TW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJ0aHJpZnQuVGhyaWZ0Iik7CisgICAgICB9CisgICAgICBpZiAoIVRocmlmdE1vZHVsZSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgICAgU2NvcGVkUHlPYmplY3QgY2xzKFB5T2JqZWN0X0dldEF0dHIoVGhyaWZ0TW9kdWxlLCBJTlRFUk5fU1RSSU5HKFRGcm96ZW5EaWN0KSkpOworICAgICAgaWYgKCFjbHMpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIFNjb3BlZFB5T2JqZWN0IGFyZyhQeVR1cGxlX05ldygxKSk7CisgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZy5nZXQoKSwgMCwgcmV0LnJlbGVhc2UoKSk7CisgICAgICByZXQucmVzZXQoUHlPYmplY3RfQ2FsbE9iamVjdChjbHMuZ2V0KCksIGFyZy5nZXQoKSkpOworICAgIH0KKworICAgIHJldHVybiByZXQucmVsZWFzZSgpOworICB9CisKKyAgY2FzZSBUX1NUUlVDVDogeworICAgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRTdHJ1Y3QoUHlfTm9uZSwgcGFyc2VkYXJncy5rbGFzcywgcGFyc2VkYXJncy5zcGVjKTsKKyAgfQorCisgIGNhc2UgVF9TVE9QOgorICBjYXNlIFRfVk9JRDoKKyAgY2FzZSBUX1VURjE2OgorICBjYXNlIFRfVVRGODoKKyAgY2FzZSBUX1U2NDoKKyAgZGVmYXVsdDoKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSBmb3IgZGVjb2RlVmFsdWU6ICVkIiwgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitQeU9iamVjdCogUHJvdG9jb2xCYXNlPEltcGw+OjpyZWFkU3RydWN0KFB5T2JqZWN0KiBvdXRwdXQsIFB5T2JqZWN0KiBrbGFzcywgUHlPYmplY3QqIHNwZWNfc2VxKSB7CisgIGludCBzcGVjX3NlcV9sZW4gPSBQeVR1cGxlX1NpemUoc3BlY19zZXEpOworICBib29sIGltbXV0YWJsZSA9IG91dHB1dCA9PSBQeV9Ob25lOworICBTY29wZWRQeU9iamVjdCBrd2FyZ3M7CisgIGlmIChzcGVjX3NlcV9sZW4gPT0gLTEpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChpbW11dGFibGUpIHsKKyAgICBrd2FyZ3MucmVzZXQoUHlEaWN0X05ldygpKTsKKyAgICBpZiAoIWt3YXJncykgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImZhaWxlZCB0byBwcmVwYXJlIGt3YXJndW1lbnQgc3RvcmFnZSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyAgZGV0YWlsOjpSZWFkU3RydWN0U2NvcGU8SW1wbD4gc2NvcGUgPSBkZXRhaWw6OnJlYWRTdHJ1Y3RTY29wZSh0aGlzKTsKKyAgaWYgKCFzY29wZSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHdoaWxlICh0cnVlKSB7CisgICAgVFR5cGUgdHlwZSA9IFRfU1RPUDsKKyAgICBpbnQxNl90IHRhZzsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEZpZWxkQmVnaW4odHlwZSwgdGFnKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh0eXBlID09IFRfU1RPUCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh0YWcgPCAwIHx8IHRhZyA+PSBzcGVjX3NlcV9sZW4pIHsKKyAgICAgIGlmICghc2tpcCh0eXBlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXJyb3Igd2hpbGUgc2tpcHBpbmcgdW5rbm93biBmaWVsZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFB5T2JqZWN0KiBpdGVtX3NwZWMgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfc2VxLCB0YWcpOworICAgIGlmIChpdGVtX3NwZWMgPT0gUHlfTm9uZSkgeworICAgICAgaWYgKCFza2lwKHR5cGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFcnJvciB3aGlsZSBza2lwcGluZyB1bmtub3duIGZpZWxkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIFN0cnVjdEl0ZW1TcGVjIHBhcnNlZHNwZWM7CisgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKCZwYXJzZWRzcGVjLCBpdGVtX3NwZWMpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHBhcnNlZHNwZWMudHlwZSAhPSB0eXBlKSB7CisgICAgICBpZiAoIXNraXAodHlwZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0cnVjdCBmaWVsZCBoYWQgd3JvbmcgdHlwZTogZXhwZWN0ZWQgJWQgYnV0IGdvdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICBwYXJzZWRzcGVjLnR5cGUsIHR5cGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFNjb3BlZFB5T2JqZWN0IGZpZWxkdmFsKGRlY29kZVZhbHVlKHBhcnNlZHNwZWMudHlwZSwgcGFyc2Vkc3BlYy50eXBlYXJncykpOworICAgIGlmICghZmllbGR2YWwpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICgoaW1tdXRhYmxlICYmIFB5RGljdF9TZXRJdGVtKGt3YXJncy5nZXQoKSwgcGFyc2Vkc3BlYy5hdHRybmFtZSwgZmllbGR2YWwuZ2V0KCkpID09IC0xKQorICAgICAgICB8fCAoIWltbXV0YWJsZSAmJiBQeU9iamVjdF9TZXRBdHRyKG91dHB1dCwgcGFyc2Vkc3BlYy5hdHRybmFtZSwgZmllbGR2YWwuZ2V0KCkpID09IC0xKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIGlmIChpbW11dGFibGUpIHsKKyAgICBTY29wZWRQeU9iamVjdCBhcmdzKFB5VHVwbGVfTmV3KDApKTsKKyAgICBpZiAoIWFyZ3MpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJmYWlsZWQgdG8gcHJlcGFyZSBhcmd1bWVudCBzdG9yYWdlIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGwoa2xhc3MsIGFyZ3MuZ2V0KCksIGt3YXJncy5nZXQoKSk7CisgIH0KKyAgUHlfSU5DUkVGKG91dHB1dCk7CisgIHJldHVybiBvdXRwdXQ7Cit9Cit9Cit9Cit9CisjZW5kaWYgLy8gVEhSSUZUX1BZX1BST1RPQ09MX0gKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L3R5cGVzLmNwcCBiL2xpYi9weS9zcmMvZXh0L3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ0M2ZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuY3BwCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJleHQvdHlwZXMuaCIKKyNpbmNsdWRlICJleHQvcHJvdG9jb2wuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK1B5T2JqZWN0KiBUaHJpZnRNb2R1bGUgPSBOVUxMOworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKK2NoYXIgcmVmaWxsX3NpZ25hdHVyZVtdID0geydzJywgJyMnLCAnaSd9OworI2Vsc2UKK2NvbnN0IGNoYXIqIHJlZmlsbF9zaWduYXR1cmUgPSAieSNpIjsKKyNlbmRpZgorCitib29sIHBhcnNlX3N0cnVjdF9pdGVtX3NwZWMoU3RydWN0SXRlbVNwZWMqIGRlc3QsIFB5T2JqZWN0KiBzcGVjX3R1cGxlKSB7CisgIC8vIGknZCBsaWtlIHRvIHVzZSBQYXJzZUFyZ3MgaGVyZSwgYnV0IGl0IHNlZW1zIHRvIGJlIGEgYm90dGxlbmVjay4KKyAgaWYgKFB5VHVwbGVfU2l6ZShzcGVjX3R1cGxlKSAhPSA1KSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyA1IGFyZ3VtZW50cyBmb3Igc3BlYyB0dXBsZSBidXQgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihQeVR1cGxlX1NpemUoc3BlY190dXBsZSkpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT50YWcgPSBzdGF0aWNfY2FzdDxUVHlwZT4oUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMCkpKTsKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnRhZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT50eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDEpKSk7CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT50eXBlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmF0dHJuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAyKTsKKyAgZGVzdC0+dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDMpOworICBkZXN0LT5kZWZ2YWwgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDQpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBwYXJzZV9zZXRfbGlzdF9hcmdzKFNldExpc3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIGlmIChQeVR1cGxlX1NpemUodHlwZWFyZ3MpICE9IDMpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIHR1cGxlIG9mIHNpemUgMyBmb3IgbGlzdC9zZXQgdHlwZSBhcmdzIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+ZWxlbWVudF90eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+ZWxlbWVudF90eXBlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7CisKKyAgZGVzdC0+aW1tdXRhYmxlID0gUHlfVHJ1ZSA9PSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAyKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBwYXJzZV9tYXBfYXJncyhNYXBUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIGlmIChQeVR1cGxlX1NpemUodHlwZWFyZ3MpICE9IDUpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIDUgYXJndW1lbnRzIGZvciB0eXBlYXJncyB0byBtYXAiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT5rdGFnID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+a3RhZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT52dGFnID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAyKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dnRhZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT5rdHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKKyAgZGVzdC0+dnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMyk7CisgIGRlc3QtPmltbXV0YWJsZSA9IFB5X1RydWUgPT0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgNCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgcGFyc2Vfc3RydWN0X2FyZ3MoU3RydWN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgeworICBpZiAoUHlMaXN0X1NpemUodHlwZWFyZ3MpICE9IDIpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIGxpc3Qgb2Ygc2l6ZSAyIGZvciBzdHJ1Y3QgYXJncyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmtsYXNzID0gUHlMaXN0X0dFVF9JVEVNKHR5cGVhcmdzLCAwKTsKKyAgZGVzdC0+c3BlYyA9IFB5TGlzdF9HRVRfSVRFTSh0eXBlYXJncywgMSk7CisKKyAgcmV0dXJuIHRydWU7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC90eXBlcy5oIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2Q4ZGRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9UWVBFU19ICisjZGVmaW5lIFRIUklGVF9QWV9UWVBFU19ICisKKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIFRPRE86IGJldHRlciBtYWNyb3MKKyNkZWZpbmUgUHlJbnRfQXNMb25nKHYpIFB5TG9uZ19Bc0xvbmcodikKKyNkZWZpbmUgUHlJbnRfRnJvbUxvbmcodikgUHlMb25nX0Zyb21Mb25nKHYpCisKKyNkZWZpbmUgUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyh2KSBQeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZyh2KQorCisjZW5kaWYKKworI2RlZmluZSBJTlRFUk5fU1RSSU5HKHZhbHVlKSBfaW50ZXJuXyMjdmFsdWUKKworI2RlZmluZSBJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSAoKCh2KSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKworZXh0ZXJuICJDIiB7CitleHRlcm4gUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoVEZyb3plbkRpY3QpOworZXh0ZXJuIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOworZXh0ZXJuIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOworfQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworZXh0ZXJuIFB5T2JqZWN0KiBUaHJpZnRNb2R1bGU7CisKKy8vIFN0b2xlbiBvdXQgb2YgVFByb3RvY29sLmguCisvLyBJdCB3b3VsZCBiZSBhIGh1Z2UgcGFpbiB0byBoYXZlIGJvdGggZ2V0IHRoaXMgZnJvbSBvbmUgcGxhY2UuCitlbnVtIFRUeXBlIHsKKyAgVF9JTlZBTElEID0gLTEsCisgIFRfU1RPUCA9IDAsCisgIFRfVk9JRCA9IDEsCisgIFRfQk9PTCA9IDIsCisgIFRfQllURSA9IDMsCisgIFRfSTA4ID0gMywKKyAgVF9JMTYgPSA2LAorICBUX0kzMiA9IDgsCisgIFRfVTY0ID0gOSwKKyAgVF9JNjQgPSAxMCwKKyAgVF9ET1VCTEUgPSA0LAorICBUX1NUUklORyA9IDExLAorICBUX1VURjcgPSAxMSwKKyAgVF9TVFJVQ1QgPSAxMiwKKyAgVF9NQVAgPSAxMywKKyAgVF9TRVQgPSAxNCwKKyAgVF9MSVNUID0gMTUsCisgIFRfVVRGOCA9IDE2LAorICBUX1VURjE2ID0gMTcKK307CisKKy8vIHJlcGxhY2Ugd2l0aCB1bmlxdWVfcHRyIHdoZW4gd2UncmUgT0sgd2l0aCBDKysxMQorY2xhc3MgU2NvcGVkUHlPYmplY3QgeworcHVibGljOgorICBTY29wZWRQeU9iamVjdCgpIDogb2JqXyhOVUxMKSB7fQorICBleHBsaWNpdCBTY29wZWRQeU9iamVjdChQeU9iamVjdCogcHlfb2JqZWN0KSA6IG9ial8ocHlfb2JqZWN0KSB7fQorICB+U2NvcGVkUHlPYmplY3QoKSB7CisgICAgaWYgKG9ial8pCisgICAgICBQeV9ERUNSRUYob2JqXyk7CisgIH0KKyAgUHlPYmplY3QqIGdldCgpIHRocm93KCkgeyByZXR1cm4gb2JqXzsgfQorICBvcGVyYXRvciBib29sKCkgeyByZXR1cm4gb2JqXzsgfQorICB2b2lkIHJlc2V0KFB5T2JqZWN0KiBweV9vYmplY3QpIHRocm93KCkgeworICAgIGlmIChvYmpfKQorICAgICAgUHlfREVDUkVGKG9ial8pOworICAgIG9ial8gPSBweV9vYmplY3Q7CisgIH0KKyAgUHlPYmplY3QqIHJlbGVhc2UoKSB0aHJvdygpIHsKKyAgICBQeU9iamVjdCogdG1wID0gb2JqXzsKKyAgICBvYmpfID0gTlVMTDsKKyAgICByZXR1cm4gdG1wOworICB9CisgIHZvaWQgc3dhcChTY29wZWRQeU9iamVjdCYgb3RoZXIpIHRocm93KCkgeworICAgIFNjb3BlZFB5T2JqZWN0IHRtcChvdGhlci5yZWxlYXNlKCkpOworICAgIG90aGVyLnJlc2V0KHJlbGVhc2UoKSk7CisgICAgcmVzZXQodG1wLnJlbGVhc2UoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgU2NvcGVkUHlPYmplY3QoY29uc3QgU2NvcGVkUHlPYmplY3QmKSB7fQorICBTY29wZWRQeU9iamVjdCYgb3BlcmF0b3I9KGNvbnN0IFNjb3BlZFB5T2JqZWN0JikgeyByZXR1cm4gKnRoaXM7IH0KKworICBQeU9iamVjdCogb2JqXzsKK307CisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgdHdvIGtleSBhdHRyaWJ1dGVzIG9mIGEgQ1JlYWRhYmxlVHJhbnNwb3J0LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlPYmplY3RfR2V0QXR0ci4KKyAqLworc3RydWN0IERlY29kZUJ1ZmZlciB7CisgIFNjb3BlZFB5T2JqZWN0IHN0cmluZ2lvYnVmOworICBTY29wZWRQeU9iamVjdCByZWZpbGxfY2FsbGFibGU7Cit9OworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKK2V4dGVybiBjaGFyIHJlZmlsbF9zaWduYXR1cmVbM107Cit0eXBlZGVmIFB5T2JqZWN0IEVuY29kZUJ1ZmZlcjsKKyNlbHNlCitleHRlcm4gY29uc3QgY2hhciogcmVmaWxsX3NpZ25hdHVyZTsKK3N0cnVjdCBFbmNvZGVCdWZmZXIgeworICBzdGQ6OnZlY3RvcjxjaGFyPiBidWY7CisgIHNpemVfdCBwb3M7Cit9OworI2VuZGlmCisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIHNldCBvciBsaXN0LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KKyAqLworc3RydWN0IFNldExpc3RUeXBlQXJncyB7CisgIFRUeXBlIGVsZW1lbnRfdHlwZTsKKyAgUHlPYmplY3QqIHR5cGVhcmdzOworICBib29sIGltbXV0YWJsZTsKK307CisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIG1hcCwKKyAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCisgKi8KK3N0cnVjdCBNYXBUeXBlQXJncyB7CisgIFRUeXBlIGt0YWc7CisgIFRUeXBlIHZ0YWc7CisgIFB5T2JqZWN0KiBrdHlwZWFyZ3M7CisgIFB5T2JqZWN0KiB2dHlwZWFyZ3M7CisgIGJvb2wgaW1tdXRhYmxlOworfTsKKworLyoqCisgKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgc3RydWN0LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KKyAqLworc3RydWN0IFN0cnVjdFR5cGVBcmdzIHsKKyAgUHlPYmplY3QqIGtsYXNzOworICBQeU9iamVjdCogc3BlYzsKKyAgYm9vbCBpbW11dGFibGU7Cit9OworCisvKioKKyAqIEEgY2FjaGUgb2YgdGhlIGl0ZW0gc3BlYyBmcm9tIGEgc3RydWN0IHNwZWNpZmljYXRpb24sCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgorICovCitzdHJ1Y3QgU3RydWN0SXRlbVNwZWMgeworICBpbnQgdGFnOworICBUVHlwZSB0eXBlOworICBQeU9iamVjdCogYXR0cm5hbWU7CisgIFB5T2JqZWN0KiB0eXBlYXJnczsKKyAgUHlPYmplY3QqIGRlZnZhbDsKK307CisKK2Jvb2wgcGFyc2Vfc2V0X2xpc3RfYXJncyhTZXRMaXN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKK2Jvb2wgcGFyc2VfbWFwX2FyZ3MoTWFwVHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKK2Jvb2wgcGFyc2Vfc3RydWN0X2FyZ3MoU3RydWN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKK2Jvb2wgcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYyhTdHJ1Y3RJdGVtU3BlYyogZGVzdCwgUHlPYmplY3QqIHNwZWNfdHVwbGUpOworfQorfQorfQorCisjZW5kaWYgLy8gVEhSSUZUX1BZX1RZUEVTX0gKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJhc2UucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCYXNlLnB5CmluZGV4IDZjYmQ1ZjMuLjlhZTFiMTEgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJhc2UucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UQmFzZS5weQpAQCAtMTcsNjUgKzE3LDY2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCi10cnk6Ci0gIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBmYXN0YmluYXJ5Ci1leGNlcHQ6Ci0gIGZhc3RiaW5hcnkgPSBOb25lCi0KIAogY2xhc3MgVEJhc2Uob2JqZWN0KToKLSAgX19zbG90c19fID0gW10KKyAgICBfX3Nsb3RzX18gPSAoKQogCi0gIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICBMID0gWyclcz0lcicgJSAoa2V5LCBnZXRhdHRyKHNlbGYsIGtleSkpCi0gICAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fX3Nsb3RzX19dCi0gICAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBMID0gWyclcz0lcicgJSAoa2V5LCBnZXRhdHRyKHNlbGYsIGtleSkpIGZvciBrZXkgaW4gc2VsZi5fX3Nsb3RzX19dCisgICAgICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQogCi0gIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgotICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6Ci0gICAgICByZXR1cm4gRmFsc2UKLSAgICBmb3IgYXR0ciBpbiBzZWxmLl9fc2xvdHNfXzoKLSAgICAgIG15X3ZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKLSAgICAgIG90aGVyX3ZhbCA9IGdldGF0dHIob3RoZXIsIGF0dHIpCi0gICAgICBpZiBteV92YWwgIT0gb3RoZXJfdmFsOgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gVHJ1ZQorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZvciBhdHRyIGluIHNlbGYuX19zbG90c19fOgorICAgICAgICAgICAgbXlfdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKQorICAgICAgICAgICAgb3RoZXJfdmFsID0gZ2V0YXR0cihvdGhlciwgYXR0cikKKyAgICAgICAgICAgIGlmIG15X3ZhbCAhPSBvdGhlcl92YWw6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCiAKLSAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6Ci0gICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKIAotICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6Ci0gICAgaWYgKGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kCi0gICAgICAgIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQKLSAgICAgICAgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQKLSAgICAgICAgZmFzdGJpbmFyeSBpcyBub3QgTm9uZSk6Ci0gICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcHJvdC50cmFucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKQotICAgICAgcmV0dXJuCi0gICAgaXByb3QucmVhZFN0cnVjdChzZWxmLCBzZWxmLnRocmlmdF9zcGVjKQorICAgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICAgICAgaWYgKGlwcm90Ll9mYXN0X2RlY29kZSBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICBpcHJvdC5fZmFzdF9kZWNvZGUoc2VsZiwgaXByb3QsIFtzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlY10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpcHJvdC5yZWFkU3RydWN0KHNlbGYsIHNlbGYudGhyaWZ0X3NwZWMpCiAKLSAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKLSAgICBpZiAob3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQKLSAgICAgICAgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQKLSAgICAgICAgZmFzdGJpbmFyeSBpcyBub3QgTm9uZSk6Ci0gICAgICBvcHJvdC50cmFucy53cml0ZSgKLSAgICAgICAgZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQotICAgICAgcmV0dXJuCi0gICAgb3Byb3Qud3JpdGVTdHJ1Y3Qoc2VsZiwgc2VsZi50aHJpZnRfc3BlYykKKyAgICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgICAgICBpZiAob3Byb3QuX2Zhc3RfZW5jb2RlIGlzIG5vdCBOb25lIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgIG9wcm90LnRyYW5zLndyaXRlKAorICAgICAgICAgICAgICAgIG9wcm90Ll9mYXN0X2VuY29kZShzZWxmLCBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RydWN0KHNlbGYsIHNlbGYudGhyaWZ0X3NwZWMpCiAKIAotY2xhc3MgVEV4Y2VwdGlvbkJhc2UoRXhjZXB0aW9uKToKLSAgIyBvbGQgc3R5bGUgY2xhc3Mgc28gcHl0aG9uMi40IGNhbiByYWlzZSBleGNlcHRpb25zIGRlcml2ZWQgZnJvbSB0aGlzCi0gICMgIFRoaXMgY2FuJ3QgaW5oZXJpdCBmcm9tIFRCYXNlIGJlY2F1c2Ugb2YgdGhhdCBsaW1pdGF0aW9uLgotICBfX3Nsb3RzX18gPSBbXQorY2xhc3MgVEV4Y2VwdGlvbkJhc2UoVEJhc2UsIEV4Y2VwdGlvbik6CisgICAgcGFzcwogCi0gIF9fcmVwcl9fID0gVEJhc2UuX19yZXByX18uaW1fZnVuYwotICBfX2VxX18gPSBUQmFzZS5fX2VxX18uaW1fZnVuYwotICBfX25lX18gPSBUQmFzZS5fX25lX18uaW1fZnVuYwotICByZWFkID0gVEJhc2UucmVhZC5pbV9mdW5jCi0gIHdyaXRlID0gVEJhc2Uud3JpdGUuaW1fZnVuYworCitjbGFzcyBURnJvemVuQmFzZShUQmFzZSk6CisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBtb2RpZnkgZnJvemVuIHN0cnVjdCIpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gc3RydWN0IikKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBoYXNoKHNlbGYuX19jbGFzc19fKSBeIGhhc2goc2VsZi5fX3Nsb3RzX18pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgcmVhZChjbHMsIGlwcm90KToKKyAgICAgICAgaWYgKGlwcm90Ll9mYXN0X2RlY29kZSBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kCisgICAgICAgICAgICAgICAgY2xzLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgIHNlbGYgPSBjbHMoKQorICAgICAgICAgICAgcmV0dXJuIGlwcm90Ll9mYXN0X2RlY29kZShOb25lLCBpcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBpcHJvdC5yZWFkU3RydWN0KGNscywgY2xzLnRocmlmdF9zcGVjLCBUcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weQppbmRleCA2ZmRkMDhjLi42YjJmYWNjIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weQpAQCAtMTcsMjQ0ICsxNywyODUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gVFByb3RvY29sIGltcG9ydCAqCitmcm9tIC5UUHJvdG9jb2wgaW1wb3J0IFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sIFRQcm90b2NvbEZhY3RvcnkKIGZyb20gc3RydWN0IGltcG9ydCBwYWNrLCB1bnBhY2sKIAogCiBjbGFzcyBUQmluYXJ5UHJvdG9jb2woVFByb3RvY29sQmFzZSk6Ci0gICIiIkJpbmFyeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKKyAgICAiIiJCaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCiAKLSAgIyBOYXN0eUhheHguIFB5dGhvbiAyLjQrIG9uIDMyLWJpdCBtYWNoaW5lcyBmb3JjZXMgaGV4IGNvbnN0YW50cyB0byBiZQotICAjIHBvc2l0aXZlLCBjb252ZXJ0aW5nIHRoaXMgaW50byBhIGxvbmcuIElmIHdlIGhhcmRjb2RlIHRoZSBpbnQgdmFsdWUKLSAgIyBpbnN0ZWFkIGl0J2xsIHN0YXkgaW4gMzIgYml0LWxhbmQuCisgICAgIyBOYXN0eUhheHguIFB5dGhvbiAyLjQrIG9uIDMyLWJpdCBtYWNoaW5lcyBmb3JjZXMgaGV4IGNvbnN0YW50cyB0byBiZQorICAgICMgcG9zaXRpdmUsIGNvbnZlcnRpbmcgdGhpcyBpbnRvIGEgbG9uZy4gSWYgd2UgaGFyZGNvZGUgdGhlIGludCB2YWx1ZQorICAgICMgaW5zdGVhZCBpdCdsbCBzdGF5IGluIDMyIGJpdC1sYW5kLgogCi0gICMgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMAotICBWRVJTSU9OX01BU0sgPSAtNjU1MzYKKyAgICAjIFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDAKKyAgICBWRVJTSU9OX01BU0sgPSAtNjU1MzYKIAotICAjIFZFUlNJT05fMSA9IDB4ODAwMTAwMDAKLSAgVkVSU0lPTl8xID0gLTIxNDc0MTgxMTIKKyAgICAjIFZFUlNJT05fMSA9IDB4ODAwMTAwMDAKKyAgICBWRVJTSU9OXzEgPSAtMjE0NzQxODExMgogCi0gIFRZUEVfTUFTSyA9IDB4MDAwMDAwZmYKKyAgICBUWVBFX01BU0sgPSAweDAwMDAwMGZmCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCBzdHJpY3RSZWFkPUZhbHNlLCBzdHJpY3RXcml0ZT1UcnVlKToKLSAgICBUUHJvdG9jb2xCYXNlLl9faW5pdF9fKHNlbGYsIHRyYW5zKQotICAgIHNlbGYuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQKLSAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIHN0cmljdFJlYWQ9RmFsc2UsIHN0cmljdFdyaXRlPVRydWUsICoqa3dhcmdzKToKKyAgICAgICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKKyAgICAgICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAorICAgICAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0ga3dhcmdzLmdldCgnc3RyaW5nX2xlbmd0aF9saW1pdCcsIE5vbmUpCisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGt3YXJncy5nZXQoJ2NvbnRhaW5lcl9sZW5ndGhfbGltaXQnLCBOb25lKQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6Ci0gICAgaWYgc2VsZi5zdHJpY3RXcml0ZToKLSAgICAgIHNlbGYud3JpdGVJMzIoVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMSB8IHR5cGUpCi0gICAgICBzZWxmLndyaXRlU3RyaW5nKG5hbWUpCi0gICAgICBzZWxmLndyaXRlSTMyKHNlcWlkKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLndyaXRlU3RyaW5nKG5hbWUpCi0gICAgICBzZWxmLndyaXRlQnl0ZSh0eXBlKQotICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKKyAgICBkZWYgX2NoZWNrX3N0cmluZ19sZW5ndGgoc2VsZiwgbGVuZ3RoKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbGVuZ3RoKHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwgbGVuZ3RoKQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBfY2hlY2tfY29udGFpbmVyX2xlbmd0aChzZWxmLCBsZW5ndGgpOgorICAgICAgICBzZWxmLl9jaGVja19sZW5ndGgoc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LCBsZW5ndGgpCiAKLSAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6CisgICAgICAgIGlmIHNlbGYuc3RyaWN0V3JpdGU6CisgICAgICAgICAgICBzZWxmLndyaXRlSTMyKFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzEgfCB0eXBlKQorICAgICAgICAgICAgc2VsZi53cml0ZVN0cmluZyhuYW1lKQorICAgICAgICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGVTdHJpbmcobmFtZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVCeXRlKHR5cGUpCisgICAgICAgICAgICBzZWxmLndyaXRlSTMyKHNlcWlkKQogCi0gIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgaWQpOgotICAgIHNlbGYud3JpdGVCeXRlKHR5cGUpCi0gICAgc2VsZi53cml0ZUkxNihpZCkKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6Ci0gICAgc2VsZi53cml0ZUJ5dGUoVFR5cGUuU1RPUCkKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIGlkKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUodHlwZSkKKyAgICAgICAgc2VsZi53cml0ZUkxNihpZCkKIAotICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgotICAgIHNlbGYud3JpdGVCeXRlKGt0eXBlKQotICAgIHNlbGYud3JpdGVCeXRlKHZ0eXBlKQotICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKKyAgICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlQnl0ZShUVHlwZS5TVE9QKQogCi0gIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCi0gICAgc2VsZi53cml0ZUkzMihzaXplKQorICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKGt0eXBlKQorICAgICAgICBzZWxmLndyaXRlQnl0ZSh2dHlwZSkKKyAgICAgICAgc2VsZi53cml0ZUkzMihzaXplKQogCi0gIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVNldEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKLSAgICBzZWxmLndyaXRlQnl0ZShldHlwZSkKLSAgICBzZWxmLndyaXRlSTMyKHNpemUpCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCisgICAgICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKIAotICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2wpOgotICAgIGlmIGJvb2w6Ci0gICAgICBzZWxmLndyaXRlQnl0ZSgxKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLndyaXRlQnl0ZSgwKQorICAgIGRlZiB3cml0ZVNldEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCisgICAgICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKIAotICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgotICAgIGJ1ZmYgPSBwYWNrKCIhYiIsIGJ5dGUpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZVNldEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgotICAgIGJ1ZmYgPSBwYWNrKCIhaCIsIGkxNikKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sKToKKyAgICAgICAgaWYgYm9vbDoKKyAgICAgICAgICAgIHNlbGYud3JpdGVCeXRlKDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlQnl0ZSgwKQogCi0gIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgotICAgIGJ1ZmYgPSBwYWNrKCIhaSIsIGkzMikKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgYnVmZiA9IHBhY2soIiFiIiwgYnl0ZSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgotICAgIGJ1ZmYgPSBwYWNrKCIhcSIsIGk2NCkKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhaCIsIGkxNikKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgotICAgIGJ1ZmYgPSBwYWNrKCIhZCIsIGR1YikKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhaSIsIGkzMikKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZVN0cmluZyhzZWxmLCBzdHIpOgotICAgIHNlbGYud3JpdGVJMzIobGVuKHN0cikpCi0gICAgc2VsZi50cmFucy53cml0ZShzdHIpCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhcSIsIGk2NCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgotICAgIHN6ID0gc2VsZi5yZWFkSTMyKCkKLSAgICBpZiBzeiA8IDA6Ci0gICAgICB2ZXJzaW9uID0gc3ogJiBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLCi0gICAgICBpZiB2ZXJzaW9uICE9IFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzE6Ci0gICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKLSAgICAgICAgICB0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKLSAgICAgICAgICBtZXNzYWdlPSdCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAlZCcgJSAoc3opKQotICAgICAgdHlwZSA9IHN6ICYgVEJpbmFyeVByb3RvY29sLlRZUEVfTUFTSwotICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cmluZygpCi0gICAgICBzZXFpZCA9IHNlbGYucmVhZEkzMigpCi0gICAgZWxzZToKLSAgICAgIGlmIHNlbGYuc3RyaWN0UmVhZDoKLSAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXInKQotICAgICAgbmFtZSA9IHNlbGYudHJhbnMucmVhZEFsbChzeikKLSAgICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICAgIHNlcWlkID0gc2VsZi5yZWFkSTMyKCkKLSAgICByZXR1cm4gKG5hbWUsIHR5cGUsIHNlcWlkKQorICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgorICAgICAgICBidWZmID0gcGFjaygiIWQiLCBkdWIpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBzdHIpOgorICAgICAgICBzZWxmLndyaXRlSTMyKGxlbihzdHIpKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHN0cikKIAotICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgc3ogPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBpZiBzeiA8IDA6CisgICAgICAgICAgICB2ZXJzaW9uID0gc3ogJiBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLCisgICAgICAgICAgICBpZiB2ZXJzaW9uICE9IFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzE6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICB0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogJWQnICUgKHN6KSkKKyAgICAgICAgICAgIHR5cGUgPSBzeiAmIFRCaW5hcnlQcm90b2NvbC5UWVBFX01BU0sKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLnJlYWRTdHJpbmcoKQorICAgICAgICAgICAgc2VxaWQgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5zdHJpY3RSZWFkOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXInKQorICAgICAgICAgICAgbmFtZSA9IHNlbGYudHJhbnMucmVhZEFsbChzeikKKyAgICAgICAgICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgICAgIHNlcWlkID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgcmV0dXJuIChuYW1lLCB0eXBlLCBzZXFpZCkKIAotICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgotICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBpZiB0eXBlID09IFRUeXBlLlNUT1A6Ci0gICAgICByZXR1cm4gKE5vbmUsIHR5cGUsIDApCi0gICAgaWQgPSBzZWxmLnJlYWRJMTYoKQotICAgIHJldHVybiAoTm9uZSwgdHlwZSwgaWQpCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRmllbGRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKLSAgICBrdHlwZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIHZ0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCi0gICAgcmV0dXJuIChrdHlwZSwgdnR5cGUsIHNpemUpCisgICAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgorICAgICAgICB0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIGlmIHR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgIHJldHVybiAoTm9uZSwgdHlwZSwgMCkKKyAgICAgICAgaWQgPSBzZWxmLnJlYWRJMTYoKQorICAgICAgICByZXR1cm4gKE5vbmUsIHR5cGUsIGlkKQogCi0gIGRlZiByZWFkTWFwRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRMaXN0QmVnaW4oc2VsZik6Ci0gICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKLSAgICByZXR1cm4gKGV0eXBlLCBzaXplKQorICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIGt0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIHZ0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBzZWxmLl9jaGVja19jb250YWluZXJfbGVuZ3RoKHNpemUpCisgICAgICAgIHJldHVybiAoa3R5cGUsIHZ0eXBlLCBzaXplKQogCi0gIGRlZiByZWFkTGlzdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgotICAgIGV0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCi0gICAgcmV0dXJuIChldHlwZSwgc2l6ZSkKKyAgICBkZWYgcmVhZExpc3RCZWdpbihzZWxmKToKKyAgICAgICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgcmV0dXJuIChldHlwZSwgc2l6ZSkKIAotICBkZWYgcmVhZFNldEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRMaXN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRCb29sKHNlbGYpOgotICAgIGJ5dGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBpZiBieXRlID09IDA6Ci0gICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gVHJ1ZQorICAgIGRlZiByZWFkU2V0QmVnaW4oc2VsZik6CisgICAgICAgIGV0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBzZWxmLl9jaGVja19jb250YWluZXJfbGVuZ3RoKHNpemUpCisgICAgICAgIHJldHVybiAoZXR5cGUsIHNpemUpCiAKLSAgZGVmIHJlYWRCeXRlKHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoMSkKLSAgICB2YWwsID0gdW5wYWNrKCchYicsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkU2V0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRJMTYoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgyKQotICAgIHZhbCwgPSB1bnBhY2soJyFoJywgYnVmZikKLSAgICByZXR1cm4gdmFsCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICBieXRlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIGlmIGJ5dGUgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQogCi0gIGRlZiByZWFkSTMyKHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoNCkKLSAgICB2YWwsID0gdW5wYWNrKCchaScsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkQnl0ZShzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgxKQorICAgICAgICB2YWwsID0gdW5wYWNrKCchYicsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZEk2NChzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCi0gICAgdmFsLCA9IHVucGFjaygnIXEnLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEkxNihzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgyKQorICAgICAgICB2YWwsID0gdW5wYWNrKCchaCcsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZERvdWJsZShzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCi0gICAgdmFsLCA9IHVucGFjaygnIWQnLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEkzMihzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg0KQorICAgICAgICB2YWwsID0gdW5wYWNrKCchaScsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZFN0cmluZyhzZWxmKToKLSAgICBsZW4gPSBzZWxmLnJlYWRJMzIoKQotICAgIHN0ciA9IHNlbGYudHJhbnMucmVhZEFsbChsZW4pCi0gICAgcmV0dXJuIHN0cgorICAgIGRlZiByZWFkSTY0KHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFxJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIHJlYWREb3VibGUoc2VsZik6CisgICAgICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKKyAgICAgICAgdmFsLCA9IHVucGFjaygnIWQnLCBidWZmKQorICAgICAgICByZXR1cm4gdmFsCisKKyAgICBkZWYgcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX3N0cmluZ19sZW5ndGgoc2l6ZSkKKyAgICAgICAgcyA9IHNlbGYudHJhbnMucmVhZEFsbChzaXplKQorICAgICAgICByZXR1cm4gcwogCiAKLWNsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJpY3RSZWFkPUZhbHNlLCBzdHJpY3RXcml0ZT1UcnVlKToKLSAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCi0gICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KFRQcm90b2NvbEZhY3RvcnkpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJpY3RSZWFkPUZhbHNlLCBzdHJpY3RXcml0ZT1UcnVlLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQKKyAgICAgICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IGt3YXJncy5nZXQoJ3N0cmluZ19sZW5ndGhfbGltaXQnLCBOb25lKQorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBrd2FyZ3MuZ2V0KCdjb250YWluZXJfbGVuZ3RoX2xpbWl0JywgTm9uZSkKIAotICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgotICAgIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHNlbGYuc3RyaWN0UmVhZCwgc2VsZi5zdHJpY3RXcml0ZSkKLSAgICByZXR1cm4gcHJvdAorICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHNlbGYuc3RyaWN0UmVhZCwgc2VsZi5zdHJpY3RXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PXNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PXNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCkKKyAgICAgICAgcmV0dXJuIHByb3QKIAogCiBjbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZChUQmluYXJ5UHJvdG9jb2wpOgotICAiIiJDLUFjY2VsZXJhdGVkIHZlcnNpb24gb2YgVEJpbmFyeVByb3RvY29sLgorICAgICIiIkMtQWNjZWxlcmF0ZWQgdmVyc2lvbiBvZiBUQmluYXJ5UHJvdG9jb2wuCiAKLSAgVGhpcyBjbGFzcyBkb2VzIG5vdCBvdmVycmlkZSBhbnkgb2YgVEJpbmFyeVByb3RvY29sJ3MgbWV0aG9kcywKLSAgYnV0IHRoZSBnZW5lcmF0ZWQgY29kZSByZWNvZ25pemVzIGl0IGRpcmVjdGx5IGFuZCB3aWxsIGNhbGwgaW50bwotICBvdXIgQyBtb2R1bGUgdG8gZG8gdGhlIGVuY29kaW5nLCBieXBhc3NpbmcgdGhpcyBvYmplY3QgZW50aXJlbHkuCi0gIFdlIGluaGVyaXQgZnJvbSBUQmluYXJ5UHJvdG9jb2wgc28gdGhhdCB0aGUgbm9ybWFsIFRCaW5hcnlQcm90b2NvbAotICBlbmNvZGluZyBjYW4gaGFwcGVuIGlmIHRoZSBmYXN0YmluYXJ5IG1vZHVsZSBkb2Vzbid0IHdvcmsgZm9yIHNvbWUKLSAgcmVhc29uLiAgKFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIGhhcHBlbiBzYW5lbHkgaW4gbW9yZSBjYXNlcy4pCisgICAgVGhpcyBjbGFzcyBkb2VzIG5vdCBvdmVycmlkZSBhbnkgb2YgVEJpbmFyeVByb3RvY29sJ3MgbWV0aG9kcywKKyAgICBidXQgdGhlIGdlbmVyYXRlZCBjb2RlIHJlY29nbml6ZXMgaXQgZGlyZWN0bHkgYW5kIHdpbGwgY2FsbCBpbnRvCisgICAgb3VyIEMgbW9kdWxlIHRvIGRvIHRoZSBlbmNvZGluZywgYnlwYXNzaW5nIHRoaXMgb2JqZWN0IGVudGlyZWx5LgorICAgIFdlIGluaGVyaXQgZnJvbSBUQmluYXJ5UHJvdG9jb2wgc28gdGhhdCB0aGUgbm9ybWFsIFRCaW5hcnlQcm90b2NvbAorICAgIGVuY29kaW5nIGNhbiBoYXBwZW4gaWYgdGhlIGZhc3RiaW5hcnkgbW9kdWxlIGRvZXNuJ3Qgd29yayBmb3Igc29tZQorICAgIHJlYXNvbi4gIChUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyBoYXBwZW4gc2FuZWx5IGluIG1vcmUgY2FzZXMuKQorICAgIFRvIGRpc2FibGUgdGhpcyBiZWhhdmlvciwgcGFzcyBmYWxsYmFjaz1GYWxzZSBjb25zdHJ1Y3RvciBhcmd1bWVudC4KIAotICBJbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQyBtb2R1bGUsIGp1c3QgdXNlCi0gIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGluc3RlYWQgb2YgVEJpbmFyeVByb3RvY29sLgorICAgIEluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBDIG1vZHVsZSwganVzdCB1c2UKKyAgICBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBpbnN0ZWFkIG9mIFRCaW5hcnlQcm90b2NvbC4KIAotICBOT1RFOiAgVGhpcyBjb2RlIHdhcyBjb250cmlidXRlZCBieSBhbiBleHRlcm5hbCBkZXZlbG9wZXIuCi0gICAgICAgICBUaGUgaW50ZXJuYWwgVGhyaWZ0IHRlYW0gaGFzIHJldmlld2VkIGFuZCB0ZXN0ZWQgaXQsCi0gICAgICAgICBidXQgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGl0IGlzIHByb2R1Y3Rpb24tcmVhZHkuCi0gICAgICAgICBQbGVhc2UgZmVlbCBmcmVlIHRvIHJlcG9ydCBidWdzIGFuZC9vciBzdWNjZXNzIHN0b3JpZXMKLSAgICAgICAgIHRvIHRoZSBwdWJsaWMgbWFpbGluZyBsaXN0LgotICAiIiIKLSAgcGFzcworICAgIE5PVEU6ICBUaGlzIGNvZGUgd2FzIGNvbnRyaWJ1dGVkIGJ5IGFuIGV4dGVybmFsIGRldmVsb3Blci4KKyAgICAgICAgICAgVGhlIGludGVybmFsIFRocmlmdCB0ZWFtIGhhcyByZXZpZXdlZCBhbmQgdGVzdGVkIGl0LAorICAgICAgICAgICBidXQgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGl0IGlzIHByb2R1Y3Rpb24tcmVhZHkuCisgICAgICAgICAgIFBsZWFzZSBmZWVsIGZyZWUgdG8gcmVwb3J0IGJ1Z3MgYW5kL29yIHN1Y2Nlc3Mgc3RvcmllcworICAgICAgICAgICB0byB0aGUgcHVibGljIG1haWxpbmcgbGlzdC4KKyAgICAiIiIKKyAgICBwYXNzCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgZmFsbGJhY2sgPSBrd2FyZ3MucG9wKCdmYWxsYmFjaycsIFRydWUpCisgICAgICAgIHN1cGVyKFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBmYXN0YmluYXJ5CisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGlmIG5vdCBmYWxsYmFjazoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZmFzdF9kZWNvZGUgPSBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkKKyAgICAgICAgICAgIHNlbGYuX2Zhc3RfZW5jb2RlID0gZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5CiAKIAotY2xhc3MgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5OgotICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgotICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCh0cmFucykKK2NsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShUUHJvdG9jb2xGYWN0b3J5KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGZhbGxiYWNrPVRydWUpOgorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBzdHJpbmdfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGNvbnRhaW5lcl9sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5fZmFsbGJhY2sgPSBmYWxsYmFjaworCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKAorICAgICAgICAgICAgdHJhbnMsCisgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PXNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9c2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgZmFsbGJhY2s9c2VsZi5fZmFsbGJhY2spCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucHkKaW5kZXggNzA1NGFiMC4uNzAwZTc5MiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnB5CisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5weQpAQCAtMTcsOSArMTcsMTEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gVFByb3RvY29sIGltcG9ydCAqCitmcm9tIC5UUHJvdG9jb2wgaW1wb3J0IFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sIFRQcm90b2NvbEZhY3RvcnksIGNoZWNrSW50ZWdlckxpbWl0cwogZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssIHVucGFjawogCitmcm9tIC4uY29tcGF0IGltcG9ydCBiaW5hcnlfdG9fc3RyLCBzdHJfdG9fYmluYXJ5CisKIF9fYWxsX18gPSBbJ1RDb21wYWN0UHJvdG9jb2wnLCAnVENvbXBhY3RQcm90b2NvbEZhY3RvcnknXQogCiBDTEVBUiA9IDAKQEAgLTM0LDM3MiArMzYsNDUyIEBACiAKIAogZGVmIG1ha2VfaGVscGVyKHZfZnJvbSwgY29udGFpbmVyKToKLSAgZGVmIGhlbHBlcihmdW5jKToKLSAgICBkZWYgbmVzdGVkKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAodl9mcm9tLCBjb250YWluZXIpLCAoc2VsZi5zdGF0ZSwgdl9mcm9tLCBjb250YWluZXIpCi0gICAgICByZXR1cm4gZnVuYyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCi0gICAgcmV0dXJuIG5lc3RlZAotICByZXR1cm4gaGVscGVyCisgICAgZGVmIGhlbHBlcihmdW5jKToKKyAgICAgICAgZGVmIG5lc3RlZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKHZfZnJvbSwgY29udGFpbmVyKSwgKHNlbGYuc3RhdGUsIHZfZnJvbSwgY29udGFpbmVyKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICByZXR1cm4gbmVzdGVkCisgICAgcmV0dXJuIGhlbHBlcgorCisKIHdyaXRlciA9IG1ha2VfaGVscGVyKFZBTFVFX1dSSVRFLCBDT05UQUlORVJfV1JJVEUpCiByZWFkZXIgPSBtYWtlX2hlbHBlcihWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCkKIAogCiBkZWYgbWFrZVppZ1phZyhuLCBiaXRzKToKLSAgY2hlY2tJbnRlZ2VyTGltaXRzKG4sIGJpdHMpCi0gIHJldHVybiAobiA8PCAxKSBeIChuID4+IChiaXRzIC0gMSkpCisgICAgY2hlY2tJbnRlZ2VyTGltaXRzKG4sIGJpdHMpCisgICAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gKGJpdHMgLSAxKSkKIAogCiBkZWYgZnJvbVppZ1phZyhuKToKLSAgcmV0dXJuIChuID4+IDEpIF4gLShuICYgMSkKKyAgICByZXR1cm4gKG4gPj4gMSkgXiAtKG4gJiAxKQogCiAKIGRlZiB3cml0ZVZhcmludCh0cmFucywgbik6Ci0gIG91dCA9IFtdCi0gIHdoaWxlIFRydWU6Ci0gICAgaWYgbiAmIH4weDdmID09IDA6Ci0gICAgICBvdXQuYXBwZW5kKG4pCi0gICAgICBicmVhawotICAgIGVsc2U6Ci0gICAgICBvdXQuYXBwZW5kKChuICYgMHhmZikgfCAweDgwKQotICAgICAgbiA9IG4gPj4gNwotICB0cmFucy53cml0ZSgnJy5qb2luKG1hcChjaHIsIG91dCkpKQorICAgIGFzc2VydCBuID49IDAsICJJbnB1dCB0byBUQ29tcGFjdFByb3RvY29sIHdyaXRlVmFyaW50IGNhbm5vdCBiZSBuZWdhdGl2ZSEiCisgICAgb3V0ID0gYnl0ZWFycmF5KCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBpZiBuICYgfjB4N2YgPT0gMDoKKyAgICAgICAgICAgIG91dC5hcHBlbmQobikKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdXQuYXBwZW5kKChuICYgMHhmZikgfCAweDgwKQorICAgICAgICAgICAgbiA9IG4gPj4gNworICAgIHRyYW5zLndyaXRlKGJ5dGVzKG91dCkpCiAKIAogZGVmIHJlYWRWYXJpbnQodHJhbnMpOgotICByZXN1bHQgPSAwCi0gIHNoaWZ0ID0gMAotICB3aGlsZSBUcnVlOgotICAgIHggPSB0cmFucy5yZWFkQWxsKDEpCi0gICAgYnl0ZSA9IG9yZCh4KQotICAgIHJlc3VsdCB8PSAoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0Ci0gICAgaWYgYnl0ZSA+PiA3ID09IDA6Ci0gICAgICByZXR1cm4gcmVzdWx0Ci0gICAgc2hpZnQgKz0gNworICAgIHJlc3VsdCA9IDAKKyAgICBzaGlmdCA9IDAKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB4ID0gdHJhbnMucmVhZEFsbCgxKQorICAgICAgICBieXRlID0gb3JkKHgpCisgICAgICAgIHJlc3VsdCB8PSAoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0CisgICAgICAgIGlmIGJ5dGUgPj4gNyA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBzaGlmdCArPSA3CiAKIAotY2xhc3MgQ29tcGFjdFR5cGU6Ci0gIFNUT1AgPSAweDAwCi0gIFRSVUUgPSAweDAxCi0gIEZBTFNFID0gMHgwMgotICBCWVRFID0gMHgwMwotICBJMTYgPSAweDA0Ci0gIEkzMiA9IDB4MDUKLSAgSTY0ID0gMHgwNgotICBET1VCTEUgPSAweDA3Ci0gIEJJTkFSWSA9IDB4MDgKLSAgTElTVCA9IDB4MDkKLSAgU0VUID0gMHgwQQotICBNQVAgPSAweDBCCi0gIFNUUlVDVCA9IDB4MEMKK2NsYXNzIENvbXBhY3RUeXBlKG9iamVjdCk6CisgICAgU1RPUCA9IDB4MDAKKyAgICBUUlVFID0gMHgwMQorICAgIEZBTFNFID0gMHgwMgorICAgIEJZVEUgPSAweDAzCisgICAgSTE2ID0gMHgwNAorICAgIEkzMiA9IDB4MDUKKyAgICBJNjQgPSAweDA2CisgICAgRE9VQkxFID0gMHgwNworICAgIEJJTkFSWSA9IDB4MDgKKyAgICBMSVNUID0gMHgwOQorICAgIFNFVCA9IDB4MEEKKyAgICBNQVAgPSAweDBCCisgICAgU1RSVUNUID0gMHgwQwogCi1DVFlQRVMgPSB7VFR5cGUuU1RPUDogQ29tcGFjdFR5cGUuU1RPUCwKLSAgICAgICAgICBUVHlwZS5CT09MOiBDb21wYWN0VHlwZS5UUlVFLCAgIyB1c2VkIGZvciBjb2xsZWN0aW9uCi0gICAgICAgICAgVFR5cGUuQllURTogQ29tcGFjdFR5cGUuQllURSwKLSAgICAgICAgICBUVHlwZS5JMTY6IENvbXBhY3RUeXBlLkkxNiwKLSAgICAgICAgICBUVHlwZS5JMzI6IENvbXBhY3RUeXBlLkkzMiwKLSAgICAgICAgICBUVHlwZS5JNjQ6IENvbXBhY3RUeXBlLkk2NCwKLSAgICAgICAgICBUVHlwZS5ET1VCTEU6IENvbXBhY3RUeXBlLkRPVUJMRSwKLSAgICAgICAgICBUVHlwZS5TVFJJTkc6IENvbXBhY3RUeXBlLkJJTkFSWSwKLSAgICAgICAgICBUVHlwZS5TVFJVQ1Q6IENvbXBhY3RUeXBlLlNUUlVDVCwKLSAgICAgICAgICBUVHlwZS5MSVNUOiBDb21wYWN0VHlwZS5MSVNULAotICAgICAgICAgIFRUeXBlLlNFVDogQ29tcGFjdFR5cGUuU0VULAotICAgICAgICAgIFRUeXBlLk1BUDogQ29tcGFjdFR5cGUuTUFQCi0gICAgICAgICAgfQorCitDVFlQRVMgPSB7CisgICAgVFR5cGUuU1RPUDogQ29tcGFjdFR5cGUuU1RPUCwKKyAgICBUVHlwZS5CT09MOiBDb21wYWN0VHlwZS5UUlVFLCAgIyB1c2VkIGZvciBjb2xsZWN0aW9uCisgICAgVFR5cGUuQllURTogQ29tcGFjdFR5cGUuQllURSwKKyAgICBUVHlwZS5JMTY6IENvbXBhY3RUeXBlLkkxNiwKKyAgICBUVHlwZS5JMzI6IENvbXBhY3RUeXBlLkkzMiwKKyAgICBUVHlwZS5JNjQ6IENvbXBhY3RUeXBlLkk2NCwKKyAgICBUVHlwZS5ET1VCTEU6IENvbXBhY3RUeXBlLkRPVUJMRSwKKyAgICBUVHlwZS5TVFJJTkc6IENvbXBhY3RUeXBlLkJJTkFSWSwKKyAgICBUVHlwZS5TVFJVQ1Q6IENvbXBhY3RUeXBlLlNUUlVDVCwKKyAgICBUVHlwZS5MSVNUOiBDb21wYWN0VHlwZS5MSVNULAorICAgIFRUeXBlLlNFVDogQ29tcGFjdFR5cGUuU0VULAorICAgIFRUeXBlLk1BUDogQ29tcGFjdFR5cGUuTUFQLAorfQogCiBUVFlQRVMgPSB7fQogZm9yIGssIHYgaW4gQ1RZUEVTLml0ZW1zKCk6Ci0gIFRUWVBFU1t2XSA9IGsKKyAgICBUVFlQRVNbdl0gPSBrCiBUVFlQRVNbQ29tcGFjdFR5cGUuRkFMU0VdID0gVFR5cGUuQk9PTAogZGVsIGsKIGRlbCB2CiAKIAogY2xhc3MgVENvbXBhY3RQcm90b2NvbChUUHJvdG9jb2xCYXNlKToKLSAgIiIiQ29tcGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKKyAgICAiIiJDb21wYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wgZHJpdmVyLiIiIgogCi0gIFBST1RPQ09MX0lEID0gMHg4MgotICBWRVJTSU9OID0gMQotICBWRVJTSU9OX01BU0sgPSAweDFmCi0gIFRZUEVfTUFTSyA9IDB4ZTAKLSAgVFlQRV9CSVRTID0gMHgwNwotICBUWVBFX1NISUZUX0FNT1VOVCA9IDUKKyAgICBQUk9UT0NPTF9JRCA9IDB4ODIKKyAgICBWRVJTSU9OID0gMQorICAgIFZFUlNJT05fTUFTSyA9IDB4MWYKKyAgICBUWVBFX01BU0sgPSAweGUwCisgICAgVFlQRV9CSVRTID0gMHgwNworICAgIFRZUEVfU0hJRlRfQU1PVU5UID0gNQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucyk6Ci0gICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKLSAgICBzZWxmLnN0YXRlID0gQ0xFQVIKLSAgICBzZWxmLl9fbGFzdF9maWQgPSAwCi0gICAgc2VsZi5fX2Jvb2xfZmlkID0gTm9uZQotICAgIHNlbGYuX19ib29sX3ZhbHVlID0gTm9uZQotICAgIHNlbGYuX19zdHJ1Y3RzID0gW10KLSAgICBzZWxmLl9fY29udGFpbmVycyA9IFtdCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLAorICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9Tm9uZSk6CisgICAgICAgIFRQcm90b2NvbEJhc2UuX19pbml0X18oc2VsZiwgdHJhbnMpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDTEVBUgorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSAwCisgICAgICAgIHNlbGYuX19ib29sX2ZpZCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBOb25lCisgICAgICAgIHNlbGYuX19zdHJ1Y3RzID0gW10KKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMgPSBbXQorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBzdHJpbmdfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGNvbnRhaW5lcl9sZW5ndGhfbGltaXQKIAotICBkZWYgX193cml0ZVZhcmludChzZWxmLCBuKToKLSAgICB3cml0ZVZhcmludChzZWxmLnRyYW5zLCBuKQorICAgIGRlZiBfY2hlY2tfc3RyaW5nX2xlbmd0aChzZWxmLCBsZW5ndGgpOgorICAgICAgICBzZWxmLl9jaGVja19sZW5ndGgoc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0LCBsZW5ndGgpCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDTEVBUgotICAgIHNlbGYuX193cml0ZVVCeXRlKHNlbGYuUFJPVE9DT0xfSUQpCi0gICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2VsZi5WRVJTSU9OIHwgKHR5cGUgPDwgc2VsZi5UWVBFX1NISUZUX0FNT1VOVCkpCi0gICAgc2VsZi5fX3dyaXRlVmFyaW50KHNlcWlkKQotICAgIHNlbGYuX193cml0ZVN0cmluZyhuYW1lKQotICAgIHNlbGYuc3RhdGUgPSBWQUxVRV9XUklURQorICAgIGRlZiBfY2hlY2tfY29udGFpbmVyX2xlbmd0aChzZWxmLCBsZW5ndGgpOgorICAgICAgICBzZWxmLl9jaGVja19sZW5ndGgoc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LCBsZW5ndGgpCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBWQUxVRV9XUklURQotICAgIHNlbGYuc3RhdGUgPSBDTEVBUgorICAgIGRlZiBfX3dyaXRlVmFyaW50KHNlbGYsIG4pOgorICAgICAgICB3cml0ZVZhcmludChzZWxmLnRyYW5zLCBuKQogCi0gIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChDTEVBUiwgQ09OVEFJTkVSX1dSSVRFLCBWQUxVRV9XUklURSksIHNlbGYuc3RhdGUKLSAgICBzZWxmLl9fc3RydWN0cy5hcHBlbmQoKHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCkpCi0gICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1dSSVRFCi0gICAgc2VsZi5fX2xhc3RfZmlkID0gMAorICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCisgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKHNlbGYuUFJPVE9DT0xfSUQpCisgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKHNlbGYuVkVSU0lPTiB8ICh0eXBlIDw8IHNlbGYuVFlQRV9TSElGVF9BTU9VTlQpKQorICAgICAgICAjIFRoZSBzZXF1ZW5jZSBpZCBpcyBhIHNpZ25lZCAzMi1iaXQgaW50ZWdlciBidXQgdGhlIGNvbXBhY3QgcHJvdG9jb2wKKyAgICAgICAgIyB3cml0ZXMgdGhpcyBvdXQgYXMgYSAidmFyIGludCIgd2hpY2ggaXMgYWx3YXlzIHBvc2l0aXZlLCBhbmQgYXR0ZW1wdGluZworICAgICAgICAjIHRvIHdyaXRlIGEgbmVnYXRpdmUgbnVtYmVyIHJlc3VsdHMgaW4gYW4gaW5maW5pdGUgbG9vcCwgc28gd2UgbWF5CisgICAgICAgICMgbmVlZCB0byBkbyBzb21lIGNvbnZlcnNpb24gaGVyZS4uLgorICAgICAgICB0c2VxaWQgPSBzZXFpZAorICAgICAgICBpZiB0c2VxaWQgPCAwOgorICAgICAgICAgICAgdHNlcWlkID0gMjE0NzQ4MzY0OCArICgyMTQ3NDgzNjQ4ICsgdHNlcWlkKQorICAgICAgICBzZWxmLl9fd3JpdGVWYXJpbnQodHNlcWlkKQorICAgICAgICBzZWxmLl9fd3JpdGVCaW5hcnkoc3RyX3RvX2JpbmFyeShuYW1lKSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1dSSVRFCiAKLSAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1dSSVRFCi0gICAgc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkID0gc2VsZi5fX3N0cnVjdHMucG9wKCkKKyAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBWQUxVRV9XUklURQorICAgICAgICBzZWxmLnN0YXRlID0gQ0xFQVIKIAotICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6Ci0gICAgc2VsZi5fX3dyaXRlQnl0ZSgwKQorICAgIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoQ0xFQVIsIENPTlRBSU5FUl9XUklURSwgVkFMVUVfV1JJVEUpLCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuX19zdHJ1Y3RzLmFwcGVuZCgoc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkKSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1dSSVRFCisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKIAotICBkZWYgX193cml0ZUZpZWxkSGVhZGVyKHNlbGYsIHR5cGUsIGZpZCk6Ci0gICAgZGVsdGEgPSBmaWQgLSBzZWxmLl9fbGFzdF9maWQKLSAgICBpZiAwIDwgZGVsdGEgPD0gMTU6Ci0gICAgICBzZWxmLl9fd3JpdGVVQnl0ZShkZWx0YSA8PCA0IHwgdHlwZSkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fX3dyaXRlQnl0ZSh0eXBlKQotICAgICAgc2VsZi5fX3dyaXRlSTE2KGZpZCkKLSAgICBzZWxmLl9fbGFzdF9maWQgPSBmaWQKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1dSSVRFCisgICAgICAgIHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCA9IHNlbGYuX19zdHJ1Y3RzLnBvcCgpCiAKLSAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBmaWQpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1dSSVRFLCBzZWxmLnN0YXRlCi0gICAgaWYgdHlwZSA9PSBUVHlwZS5CT09MOgotICAgICAgc2VsZi5zdGF0ZSA9IEJPT0xfV1JJVEUKLSAgICAgIHNlbGYuX19ib29sX2ZpZCA9IGZpZAotICAgIGVsc2U6Ci0gICAgICBzZWxmLnN0YXRlID0gVkFMVUVfV1JJVEUKLSAgICAgIHNlbGYuX193cml0ZUZpZWxkSGVhZGVyKENUWVBFU1t0eXBlXSwgZmlkKQorICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZSgwKQogCi0gIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQk9PTF9XUklURSksIHNlbGYuc3RhdGUKLSAgICBzZWxmLnN0YXRlID0gRklFTERfV1JJVEUKKyAgICBkZWYgX193cml0ZUZpZWxkSGVhZGVyKHNlbGYsIHR5cGUsIGZpZCk6CisgICAgICAgIGRlbHRhID0gZmlkIC0gc2VsZi5fX2xhc3RfZmlkCisgICAgICAgIGlmIDAgPCBkZWx0YSA8PSAxNToKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKGRlbHRhIDw8IDQgfCB0eXBlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZSh0eXBlKQorICAgICAgICAgICAgc2VsZi5fX3dyaXRlSTE2KGZpZCkKKyAgICAgICAgc2VsZi5fX2xhc3RfZmlkID0gZmlkCiAKLSAgZGVmIF9fd3JpdGVVQnl0ZShzZWxmLCBieXRlKToKLSAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFCJywgYnl0ZSkpCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBmaWQpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURSwgc2VsZi5zdGF0ZQorICAgICAgICBpZiB0eXBlID09IFRUeXBlLkJPT0w6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gQk9PTF9XUklURQorICAgICAgICAgICAgc2VsZi5fX2Jvb2xfZmlkID0gZmlkCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gVkFMVUVfV1JJVEUKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUZpZWxkSGVhZGVyKENUWVBFU1t0eXBlXSwgZmlkKQogCi0gIGRlZiBfX3dyaXRlQnl0ZShzZWxmLCBieXRlKToKLSAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFiJywgYnl0ZSkpCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQk9PTF9XUklURSksIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1dSSVRFCiAKLSAgZGVmIF9fd3JpdGVJMTYoc2VsZiwgaTE2KToKLSAgICBzZWxmLl9fd3JpdGVWYXJpbnQobWFrZVppZ1phZyhpMTYsIDE2KSkKKyAgICBkZWYgX193cml0ZVVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFCJywgYnl0ZSkpCiAKLSAgZGVmIF9fd3JpdGVTaXplKHNlbGYsIGkzMik6Ci0gICAgc2VsZi5fX3dyaXRlVmFyaW50KGkzMikKKyAgICBkZWYgX193cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIHNlbGYudHJhbnMud3JpdGUocGFjaygnIWInLCBieXRlKSkKIAotICBkZWYgd3JpdGVDb2xsZWN0aW9uQmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQ09OVEFJTkVSX1dSSVRFKSwgc2VsZi5zdGF0ZQotICAgIGlmIHNpemUgPD0gMTQ6Ci0gICAgICBzZWxmLl9fd3JpdGVVQnl0ZShzaXplIDw8IDQgfCBDVFlQRVNbZXR5cGVdKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9fd3JpdGVVQnl0ZSgweGYwIHwgQ1RZUEVTW2V0eXBlXSkKLSAgICAgIHNlbGYuX193cml0ZVNpemUoc2l6ZSkKLSAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKLSAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1dSSVRFCi0gIHdyaXRlU2V0QmVnaW4gPSB3cml0ZUNvbGxlY3Rpb25CZWdpbgotICB3cml0ZUxpc3RCZWdpbiA9IHdyaXRlQ29sbGVjdGlvbkJlZ2luCisgICAgZGVmIF9fd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTE2LCAxNikpCiAKLSAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIENPTlRBSU5FUl9XUklURSksIHNlbGYuc3RhdGUKLSAgICBpZiBzaXplID09IDA6Ci0gICAgICBzZWxmLl9fd3JpdGVCeXRlKDApCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX193cml0ZVNpemUoc2l6ZSkKLSAgICAgIHNlbGYuX193cml0ZVVCeXRlKENUWVBFU1trdHlwZV0gPDwgNCB8IENUWVBFU1t2dHlwZV0pCi0gICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCi0gICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9XUklURQorICAgIGRlZiBfX3dyaXRlU2l6ZShzZWxmLCBpMzIpOgorICAgICAgICBzZWxmLl9fd3JpdGVWYXJpbnQoaTMyKQogCi0gIGRlZiB3cml0ZUNvbGxlY3Rpb25FbmQoc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1dSSVRFLCBzZWxmLnN0YXRlCi0gICAgc2VsZi5zdGF0ZSA9IHNlbGYuX19jb250YWluZXJzLnBvcCgpCi0gIHdyaXRlTWFwRW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCi0gIHdyaXRlU2V0RW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCi0gIHdyaXRlTGlzdEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAorICAgIGRlZiB3cml0ZUNvbGxlY3Rpb25CZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQ09OVEFJTkVSX1dSSVRFKSwgc2VsZi5zdGF0ZQorICAgICAgICBpZiBzaXplIDw9IDE0OgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2l6ZSA8PCA0IHwgQ1RZUEVTW2V0eXBlXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKDB4ZjAgfCBDVFlQRVNbZXR5cGVdKQorICAgICAgICAgICAgc2VsZi5fX3dyaXRlU2l6ZShzaXplKQorICAgICAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9XUklURQorICAgIHdyaXRlU2V0QmVnaW4gPSB3cml0ZUNvbGxlY3Rpb25CZWdpbgorICAgIHdyaXRlTGlzdEJlZ2luID0gd3JpdGVDb2xsZWN0aW9uQmVnaW4KIAotICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2wpOgotICAgIGlmIHNlbGYuc3RhdGUgPT0gQk9PTF9XUklURToKLSAgICAgIGlmIGJvb2w6Ci0gICAgICAgIGN0eXBlID0gQ29tcGFjdFR5cGUuVFJVRQotICAgICAgZWxzZToKLSAgICAgICAgY3R5cGUgPSBDb21wYWN0VHlwZS5GQUxTRQotICAgICAgc2VsZi5fX3dyaXRlRmllbGRIZWFkZXIoY3R5cGUsIHNlbGYuX19ib29sX2ZpZCkKLSAgICBlbGlmIHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1dSSVRFOgotICAgICAgaWYgYm9vbDoKLSAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZShDb21wYWN0VHlwZS5UUlVFKQotICAgICAgZWxzZToKLSAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZShDb21wYWN0VHlwZS5GQUxTRSkKLSAgICBlbHNlOgotICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIkludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbCIpCisgICAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1dSSVRFLCBDT05UQUlORVJfV1JJVEUpLCBzZWxmLnN0YXRlCisgICAgICAgIGlmIHNpemUgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUJ5dGUoMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVNpemUoc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKENUWVBFU1trdHlwZV0gPDwgNCB8IENUWVBFU1t2dHlwZV0pCisgICAgICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQorICAgICAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1dSSVRFCiAKLSAgd3JpdGVCeXRlID0gd3JpdGVyKF9fd3JpdGVCeXRlKQotICB3cml0ZUkxNiA9IHdyaXRlcihfX3dyaXRlSTE2KQorICAgIGRlZiB3cml0ZUNvbGxlY3Rpb25FbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9XUklURSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5fX2NvbnRhaW5lcnMucG9wKCkKKyAgICB3cml0ZU1hcEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAorICAgIHdyaXRlU2V0RW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCisgICAgd3JpdGVMaXN0RW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCiAKLSAgQHdyaXRlcgotICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKLSAgICBzZWxmLl9fd3JpdGVWYXJpbnQobWFrZVppZ1phZyhpMzIsIDMyKSkKKyAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2wpOgorICAgICAgICBpZiBzZWxmLnN0YXRlID09IEJPT0xfV1JJVEU6CisgICAgICAgICAgICBpZiBib29sOgorICAgICAgICAgICAgICAgIGN0eXBlID0gQ29tcGFjdFR5cGUuVFJVRQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjdHlwZSA9IENvbXBhY3RUeXBlLkZBTFNFCisgICAgICAgICAgICBzZWxmLl9fd3JpdGVGaWVsZEhlYWRlcihjdHlwZSwgc2VsZi5fX2Jvb2xfZmlkKQorICAgICAgICBlbGlmIHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1dSSVRFOgorICAgICAgICAgICAgaWYgYm9vbDoKKyAgICAgICAgICAgICAgICBzZWxmLl9fd3JpdGVCeXRlKENvbXBhY3RUeXBlLlRSVUUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX193cml0ZUJ5dGUoQ29tcGFjdFR5cGUuRkFMU0UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sIikKIAotICBAd3JpdGVyCi0gIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgotICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGk2NCwgNjQpKQorICAgIHdyaXRlQnl0ZSA9IHdyaXRlcihfX3dyaXRlQnl0ZSkKKyAgICB3cml0ZUkxNiA9IHdyaXRlcihfX3dyaXRlSTE2KQogCi0gIEB3cml0ZXIKLSAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6Ci0gICAgc2VsZi50cmFucy53cml0ZShwYWNrKCc8ZCcsIGR1YikpCisgICAgQHdyaXRlcgorICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICBzZWxmLl9fd3JpdGVWYXJpbnQobWFrZVppZ1phZyhpMzIsIDMyKSkKIAotICBkZWYgX193cml0ZVN0cmluZyhzZWxmLCBzKToKLSAgICBzZWxmLl9fd3JpdGVTaXplKGxlbihzKSkKLSAgICBzZWxmLnRyYW5zLndyaXRlKHMpCi0gIHdyaXRlU3RyaW5nID0gd3JpdGVyKF9fd3JpdGVTdHJpbmcpCisgICAgQHdyaXRlcgorICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICBzZWxmLl9fd3JpdGVWYXJpbnQobWFrZVppZ1phZyhpNjQsIDY0KSkKIAotICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfUkVBRCwgc2VsZi5zdGF0ZQotICAgIHR5cGUgPSBzZWxmLl9fcmVhZFVCeXRlKCkKLSAgICBpZiB0eXBlICYgMHgwZiA9PSBUVHlwZS5TVE9QOgotICAgICAgcmV0dXJuIChOb25lLCAwLCAwKQotICAgIGRlbHRhID0gdHlwZSA+PiA0Ci0gICAgaWYgZGVsdGEgPT0gMDoKLSAgICAgIGZpZCA9IHNlbGYuX19yZWFkSTE2KCkKLSAgICBlbHNlOgotICAgICAgZmlkID0gc2VsZi5fX2xhc3RfZmlkICsgZGVsdGEKLSAgICBzZWxmLl9fbGFzdF9maWQgPSBmaWQKLSAgICB0eXBlID0gdHlwZSAmIDB4MGYKLSAgICBpZiB0eXBlID09IENvbXBhY3RUeXBlLlRSVUU6Ci0gICAgICBzZWxmLnN0YXRlID0gQk9PTF9SRUFECi0gICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IFRydWUKLSAgICBlbGlmIHR5cGUgPT0gQ29tcGFjdFR5cGUuRkFMU0U6Ci0gICAgICBzZWxmLnN0YXRlID0gQk9PTF9SRUFECi0gICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IEZhbHNlCi0gICAgZWxzZToKLSAgICAgIHNlbGYuc3RhdGUgPSBWQUxVRV9SRUFECi0gICAgcmV0dXJuIChOb25lLCBzZWxmLl9fZ2V0VFR5cGUodHlwZSksIGZpZCkKKyAgICBAd3JpdGVyCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIHNlbGYudHJhbnMud3JpdGUocGFjaygnPGQnLCBkdWIpKQogCi0gIGRlZiByZWFkRmllbGRFbmQoc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIEJPT0xfUkVBRCksIHNlbGYuc3RhdGUKLSAgICBzZWxmLnN0YXRlID0gRklFTERfUkVBRAorICAgIGRlZiBfX3dyaXRlQmluYXJ5KHNlbGYsIHMpOgorICAgICAgICBzZWxmLl9fd3JpdGVTaXplKGxlbihzKSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShzKQorICAgIHdyaXRlQmluYXJ5ID0gd3JpdGVyKF9fd3JpdGVCaW5hcnkpCiAKLSAgZGVmIF9fcmVhZFVCeXRlKHNlbGYpOgotICAgIHJlc3VsdCwgPSB1bnBhY2soJyFCJywgc2VsZi50cmFucy5yZWFkQWxsKDEpKQotICAgIHJldHVybiByZXN1bHQKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1JFQUQsIHNlbGYuc3RhdGUKKyAgICAgICAgdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQorICAgICAgICBpZiB0eXBlICYgMHgwZiA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgcmV0dXJuIChOb25lLCAwLCAwKQorICAgICAgICBkZWx0YSA9IHR5cGUgPj4gNAorICAgICAgICBpZiBkZWx0YSA9PSAwOgorICAgICAgICAgICAgZmlkID0gc2VsZi5fX3JlYWRJMTYoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmlkID0gc2VsZi5fX2xhc3RfZmlkICsgZGVsdGEKKyAgICAgICAgc2VsZi5fX2xhc3RfZmlkID0gZmlkCisgICAgICAgIHR5cGUgPSB0eXBlICYgMHgwZgorICAgICAgICBpZiB0eXBlID09IENvbXBhY3RUeXBlLlRSVUU6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gQk9PTF9SRUFECisgICAgICAgICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IFRydWUKKyAgICAgICAgZWxpZiB0eXBlID09IENvbXBhY3RUeXBlLkZBTFNFOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IEJPT0xfUkVBRAorICAgICAgICAgICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1JFQUQKKyAgICAgICAgcmV0dXJuIChOb25lLCBzZWxmLl9fZ2V0VFR5cGUodHlwZSksIGZpZCkKIAotICBkZWYgX19yZWFkQnl0ZShzZWxmKToKLSAgICByZXN1bHQsID0gdW5wYWNrKCchYicsIHNlbGYudHJhbnMucmVhZEFsbCgxKSkKLSAgICByZXR1cm4gcmVzdWx0CisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIEJPT0xfUkVBRCksIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1JFQUQKIAotICBkZWYgX19yZWFkVmFyaW50KHNlbGYpOgotICAgIHJldHVybiByZWFkVmFyaW50KHNlbGYudHJhbnMpCisgICAgZGVmIF9fcmVhZFVCeXRlKHNlbGYpOgorICAgICAgICByZXN1bHQsID0gdW5wYWNrKCchQicsIHNlbGYudHJhbnMucmVhZEFsbCgxKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAogCi0gIGRlZiBfX3JlYWRaaWdaYWcoc2VsZik6Ci0gICAgcmV0dXJuIGZyb21aaWdaYWcoc2VsZi5fX3JlYWRWYXJpbnQoKSkKKyAgICBkZWYgX19yZWFkQnl0ZShzZWxmKToKKyAgICAgICAgcmVzdWx0LCA9IHVucGFjaygnIWInLCBzZWxmLnRyYW5zLnJlYWRBbGwoMSkpCisgICAgICAgIHJldHVybiByZXN1bHQKIAotICBkZWYgX19yZWFkU2l6ZShzZWxmKToKLSAgICByZXN1bHQgPSBzZWxmLl9fcmVhZFZhcmludCgpCi0gICAgaWYgcmVzdWx0IDwgMDoKLSAgICAgIHJhaXNlIFRFeGNlcHRpb24oIkxlbmd0aCA8IDAiKQotICAgIHJldHVybiByZXN1bHQKKyAgICBkZWYgX19yZWFkVmFyaW50KHNlbGYpOgorICAgICAgICByZXR1cm4gcmVhZFZhcmludChzZWxmLnRyYW5zKQogCi0gIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCi0gICAgcHJvdG9faWQgPSBzZWxmLl9fcmVhZFVCeXRlKCkKLSAgICBpZiBwcm90b19pZCAhPSBzZWxmLlBST1RPQ09MX0lEOgotICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKLSAgICAgICAgICAnQmFkIHByb3RvY29sIGlkIGluIHRoZSBtZXNzYWdlOiAlZCcgJSBwcm90b19pZCkKLSAgICB2ZXJfdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQotICAgIHR5cGUgPSAodmVyX3R5cGUgPj4gc2VsZi5UWVBFX1NISUZUX0FNT1VOVCkgJiBzZWxmLlRZUEVfQklUUwotICAgIHZlcnNpb24gPSB2ZXJfdHlwZSAmIHNlbGYuVkVSU0lPTl9NQVNLCi0gICAgaWYgdmVyc2lvbiAhPSBzZWxmLlZFUlNJT046Ci0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAotICAgICAgICAgICdCYWQgdmVyc2lvbjogJWQgKGV4cGVjdCAlZCknICUgKHZlcnNpb24sIHNlbGYuVkVSU0lPTikpCi0gICAgc2VxaWQgPSBzZWxmLl9fcmVhZFZhcmludCgpCi0gICAgbmFtZSA9IHNlbGYuX19yZWFkU3RyaW5nKCkKLSAgICByZXR1cm4gKG5hbWUsIHR5cGUsIHNlcWlkKQorICAgIGRlZiBfX3JlYWRaaWdaYWcoc2VsZik6CisgICAgICAgIHJldHVybiBmcm9tWmlnWmFnKHNlbGYuX19yZWFkVmFyaW50KCkpCiAKLSAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCi0gICAgYXNzZXJ0IGxlbihzZWxmLl9fc3RydWN0cykgPT0gMAorICAgIGRlZiBfX3JlYWRTaXplKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLl9fcmVhZFZhcmludCgpCisgICAgICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oIkxlbmd0aCA8IDAiKQorICAgICAgICByZXR1cm4gcmVzdWx0CiAKLSAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoQ0xFQVIsIENPTlRBSU5FUl9SRUFELCBWQUxVRV9SRUFEKSwgc2VsZi5zdGF0ZQotICAgIHNlbGYuX19zdHJ1Y3RzLmFwcGVuZCgoc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkKSkKLSAgICBzZWxmLnN0YXRlID0gRklFTERfUkVBRAotICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ0xFQVIKKyAgICAgICAgcHJvdG9faWQgPSBzZWxmLl9fcmVhZFVCeXRlKCkKKyAgICAgICAgaWYgcHJvdG9faWQgIT0gc2VsZi5QUk9UT0NPTF9JRDoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhZCBwcm90b2NvbCBpZCBpbiB0aGUgbWVzc2FnZTogJWQnICUgcHJvdG9faWQpCisgICAgICAgIHZlcl90eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIHR5cGUgPSAodmVyX3R5cGUgPj4gc2VsZi5UWVBFX1NISUZUX0FNT1VOVCkgJiBzZWxmLlRZUEVfQklUUworICAgICAgICB2ZXJzaW9uID0gdmVyX3R5cGUgJiBzZWxmLlZFUlNJT05fTUFTSworICAgICAgICBpZiB2ZXJzaW9uICE9IHNlbGYuVkVSU0lPTjoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhZCB2ZXJzaW9uOiAlZCAoZXhwZWN0ICVkKScgJSAodmVyc2lvbiwgc2VsZi5WRVJTSU9OKSkKKyAgICAgICAgc2VxaWQgPSBzZWxmLl9fcmVhZFZhcmludCgpCisgICAgICAgICMgdGhlIHNlcXVlbmNlIGlzIGEgY29tcGFjdCAidmFyIGludCIgd2hpY2ggaXMgdHJlYWRlZCBhcyB1bnNpZ25lZCwKKyAgICAgICAgIyBob3dldmVyIHRoZSBzZXF1ZW5jZSBpcyBhY3R1YWxseSBzaWduZWQuLi4KKyAgICAgICAgaWYgc2VxaWQgPiAyMTQ3NDgzNjQ3OgorICAgICAgICAgICAgc2VxaWQgPSAtMjE0NzQ4MzY0OCAtICgyMTQ3NDgzNjQ4IC0gc2VxaWQpCisgICAgICAgIG5hbWUgPSBiaW5hcnlfdG9fc3RyKHNlbGYuX19yZWFkQmluYXJ5KCkpCisgICAgICAgIHJldHVybiAobmFtZSwgdHlwZSwgc2VxaWQpCiAKLSAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfUkVBRAotICAgIHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCA9IHNlbGYuX19zdHJ1Y3RzLnBvcCgpCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDTEVBUgorICAgICAgICBhc3NlcnQgbGVuKHNlbGYuX19zdHJ1Y3RzKSA9PSAwCiAKLSAgZGVmIHJlYWRDb2xsZWN0aW9uQmVnaW4oc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIENPTlRBSU5FUl9SRUFEKSwgc2VsZi5zdGF0ZQotICAgIHNpemVfdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQotICAgIHNpemUgPSBzaXplX3R5cGUgPj4gNAotICAgIHR5cGUgPSBzZWxmLl9fZ2V0VFR5cGUoc2l6ZV90eXBlKQotICAgIGlmIHNpemUgPT0gMTU6Ci0gICAgICBzaXplID0gc2VsZi5fX3JlYWRTaXplKCkKLSAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKLSAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1JFQUQKLSAgICByZXR1cm4gdHlwZSwgc2l6ZQotICByZWFkU2V0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCi0gIHJlYWRMaXN0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKENMRUFSLCBDT05UQUlORVJfUkVBRCwgVkFMVUVfUkVBRCksIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5fX3N0cnVjdHMuYXBwZW5kKChzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQpKQorICAgICAgICBzZWxmLnN0YXRlID0gRklFTERfUkVBRAorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSAwCiAKLSAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQ09OVEFJTkVSX1JFQUQpLCBzZWxmLnN0YXRlCi0gICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCi0gICAgdHlwZXMgPSAwCi0gICAgaWYgc2l6ZSA+IDA6Ci0gICAgICB0eXBlcyA9IHNlbGYuX19yZWFkVUJ5dGUoKQotICAgIHZ0eXBlID0gc2VsZi5fX2dldFRUeXBlKHR5cGVzKQotICAgIGt0eXBlID0gc2VsZi5fX2dldFRUeXBlKHR5cGVzID4+IDQpCi0gICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCi0gICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9SRUFECi0gICAgcmV0dXJuIChrdHlwZSwgdnR5cGUsIHNpemUpCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1JFQUQKKyAgICAgICAgc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkID0gc2VsZi5fX3N0cnVjdHMucG9wKCkKIAotICBkZWYgcmVhZENvbGxlY3Rpb25FbmQoc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1JFQUQsIHNlbGYuc3RhdGUKLSAgICBzZWxmLnN0YXRlID0gc2VsZi5fX2NvbnRhaW5lcnMucG9wKCkKLSAgcmVhZFNldEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCi0gIHJlYWRMaXN0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKLSAgcmVhZE1hcEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uQmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCksIHNlbGYuc3RhdGUKKyAgICAgICAgc2l6ZV90eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIHNpemUgPSBzaXplX3R5cGUgPj4gNAorICAgICAgICB0eXBlID0gc2VsZi5fX2dldFRUeXBlKHNpemVfdHlwZSkKKyAgICAgICAgaWYgc2l6ZSA9PSAxNToKKyAgICAgICAgICAgIHNpemUgPSBzZWxmLl9fcmVhZFNpemUoKQorICAgICAgICBzZWxmLl9jaGVja19jb250YWluZXJfbGVuZ3RoKHNpemUpCisgICAgICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQorICAgICAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1JFQUQKKyAgICAgICAgcmV0dXJuIHR5cGUsIHNpemUKKyAgICByZWFkU2V0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisgICAgcmVhZExpc3RCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KIAotICBkZWYgcmVhZEJvb2woc2VsZik6Ci0gICAgaWYgc2VsZi5zdGF0ZSA9PSBCT09MX1JFQUQ6Ci0gICAgICByZXR1cm4gc2VsZi5fX2Jvb2xfdmFsdWUgPT0gQ29tcGFjdFR5cGUuVFJVRQotICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfUkVBRDoKLSAgICAgIHJldHVybiBzZWxmLl9fcmVhZEJ5dGUoKSA9PSBDb21wYWN0VHlwZS5UUlVFCi0gICAgZWxzZToKLSAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2w6ICVkIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlKQorICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCksIHNlbGYuc3RhdGUKKyAgICAgICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgdHlwZXMgPSAwCisgICAgICAgIGlmIHNpemUgPiAwOgorICAgICAgICAgICAgdHlwZXMgPSBzZWxmLl9fcmVhZFVCeXRlKCkKKyAgICAgICAgdnR5cGUgPSBzZWxmLl9fZ2V0VFR5cGUodHlwZXMpCisgICAgICAgIGt0eXBlID0gc2VsZi5fX2dldFRUeXBlKHR5cGVzID4+IDQpCisgICAgICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQorICAgICAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1JFQUQKKyAgICAgICAgcmV0dXJuIChrdHlwZSwgdnR5cGUsIHNpemUpCiAKLSAgcmVhZEJ5dGUgPSByZWFkZXIoX19yZWFkQnl0ZSkKLSAgX19yZWFkSTE2ID0gX19yZWFkWmlnWmFnCi0gIHJlYWRJMTYgPSByZWFkZXIoX19yZWFkWmlnWmFnKQotICByZWFkSTMyID0gcmVhZGVyKF9fcmVhZFppZ1phZykKLSAgcmVhZEk2NCA9IHJlYWRlcihfX3JlYWRaaWdaYWcpCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfUkVBRCwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5fX2NvbnRhaW5lcnMucG9wKCkKKyAgICByZWFkU2V0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKKyAgICByZWFkTGlzdEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisgICAgcmVhZE1hcEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCiAKLSAgQHJlYWRlcgotICBkZWYgcmVhZERvdWJsZShzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCi0gICAgdmFsLCA9IHVucGFjaygnPGQnLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gQk9PTF9SRUFEOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19ib29sX3ZhbHVlID09IENvbXBhY3RUeXBlLlRSVUUKKyAgICAgICAgZWxpZiBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9SRUFEOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19yZWFkQnl0ZSgpID09IENvbXBhY3RUeXBlLlRSVUUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2w6ICVkIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlKQogCi0gIGRlZiBfX3JlYWRTdHJpbmcoc2VsZik6Ci0gICAgbGVuID0gc2VsZi5fX3JlYWRTaXplKCkKLSAgICByZXR1cm4gc2VsZi50cmFucy5yZWFkQWxsKGxlbikKLSAgcmVhZFN0cmluZyA9IHJlYWRlcihfX3JlYWRTdHJpbmcpCisgICAgcmVhZEJ5dGUgPSByZWFkZXIoX19yZWFkQnl0ZSkKKyAgICBfX3JlYWRJMTYgPSBfX3JlYWRaaWdaYWcKKyAgICByZWFkSTE2ID0gcmVhZGVyKF9fcmVhZFppZ1phZykKKyAgICByZWFkSTMyID0gcmVhZGVyKF9fcmVhZFppZ1phZykKKyAgICByZWFkSTY0ID0gcmVhZGVyKF9fcmVhZFppZ1phZykKIAotICBkZWYgX19nZXRUVHlwZShzZWxmLCBieXRlKToKLSAgICByZXR1cm4gVFRZUEVTW2J5dGUgJiAweDBmXQorICAgIEByZWFkZXIKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg4KQorICAgICAgICB2YWwsID0gdW5wYWNrKCc8ZCcsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKKworICAgIGRlZiBfX3JlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHNpemUgPSBzZWxmLl9fcmVhZFNpemUoKQorICAgICAgICBzZWxmLl9jaGVja19zdHJpbmdfbGVuZ3RoKHNpemUpCisgICAgICAgIHJldHVybiBzZWxmLnRyYW5zLnJlYWRBbGwoc2l6ZSkKKyAgICByZWFkQmluYXJ5ID0gcmVhZGVyKF9fcmVhZEJpbmFyeSkKKworICAgIGRlZiBfX2dldFRUeXBlKHNlbGYsIGJ5dGUpOgorICAgICAgICByZXR1cm4gVFRZUEVTW2J5dGUgJiAweDBmXQogCiAKLWNsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5OgotICBkZWYgX19pbml0X18oc2VsZik6CitjbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeShUUHJvdG9jb2xGYWN0b3J5KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PU5vbmUpOgorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBzdHJpbmdfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGNvbnRhaW5lcl9sZW5ndGhfbGltaXQKKworICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sKHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCkKKworCitjbGFzcyBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQoVENvbXBhY3RQcm90b2NvbCk6CisgICAgIiIiQy1BY2NlbGVyYXRlZCB2ZXJzaW9uIG9mIFRDb21wYWN0UHJvdG9jb2wuCisKKyAgICBUaGlzIGNsYXNzIGRvZXMgbm90IG92ZXJyaWRlIGFueSBvZiBUQ29tcGFjdFByb3RvY29sJ3MgbWV0aG9kcywKKyAgICBidXQgdGhlIGdlbmVyYXRlZCBjb2RlIHJlY29nbml6ZXMgaXQgZGlyZWN0bHkgYW5kIHdpbGwgY2FsbCBpbnRvCisgICAgb3VyIEMgbW9kdWxlIHRvIGRvIHRoZSBlbmNvZGluZywgYnlwYXNzaW5nIHRoaXMgb2JqZWN0IGVudGlyZWx5LgorICAgIFdlIGluaGVyaXQgZnJvbSBUQ29tcGFjdFByb3RvY29sIHNvIHRoYXQgdGhlIG5vcm1hbCBUQ29tcGFjdFByb3RvY29sCisgICAgZW5jb2RpbmcgY2FuIGhhcHBlbiBpZiB0aGUgZmFzdGJpbmFyeSBtb2R1bGUgZG9lc24ndCB3b3JrIGZvciBzb21lCisgICAgcmVhc29uLgorICAgIFRvIGRpc2FibGUgdGhpcyBiZWhhdmlvciwgcGFzcyBmYWxsYmFjaz1GYWxzZSBjb25zdHJ1Y3RvciBhcmd1bWVudC4KKworICAgIEluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBDIG1vZHVsZSwganVzdCB1c2UKKyAgICBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQgaW5zdGVhZCBvZiBUQ29tcGFjdFByb3RvY29sLgorICAgICIiIgogICAgIHBhc3MKIAotICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgotICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBmYWxsYmFjayA9IGt3YXJncy5wb3AoJ2ZhbGxiYWNrJywgVHJ1ZSkKKyAgICAgICAgc3VwZXIoVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBmYXN0YmluYXJ5CisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGlmIG5vdCBmYWxsYmFjazoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZmFzdF9kZWNvZGUgPSBmYXN0YmluYXJ5LmRlY29kZV9jb21wYWN0CisgICAgICAgICAgICBzZWxmLl9mYXN0X2VuY29kZSA9IGZhc3RiaW5hcnkuZW5jb2RlX2NvbXBhY3QKKworCitjbGFzcyBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KFRQcm90b2NvbEZhY3RvcnkpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZmFsbGJhY2s9VHJ1ZSk6CisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IHN0cmluZ19sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gY29udGFpbmVyX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLl9mYWxsYmFjayA9IGZhbGxiYWNrCisKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkKAorICAgICAgICAgICAgdHJhbnMsCisgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PXNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9c2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgZmFsbGJhY2s9c2VsZi5fZmFsbGJhY2spCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOTgyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5weQpAQCAtMCwwICsxLDIyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sIFRQcm90b2NvbEZhY3RvcnkKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBUTWVzc2FnZVR5cGUKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5USGVhZGVyVHJhbnNwb3J0IGltcG9ydCBUSGVhZGVyVHJhbnNwb3J0LCBUSGVhZGVyU3VicHJvdG9jb2xJRCwgVEhlYWRlckNsaWVudFR5cGUKKworCitQUk9UT0NPTFNfQllfSUQgPSB7CisgICAgVEhlYWRlclN1YnByb3RvY29sSUQuQklOQVJZOiBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwKKyAgICBUSGVhZGVyU3VicHJvdG9jb2xJRC5DT01QQUNUOiBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQsCit9CisKKworY2xhc3MgVEhlYWRlclByb3RvY29sKFRQcm90b2NvbEJhc2UpOgorICAgICIiIkEgZnJhbWVkIHByb3RvY29sIHdpdGggaGVhZGVycyBhbmQgcGF5bG9hZCB0cmFuc2Zvcm1zLgorCisgICAgVEhlYWRlclByb3RvY29sIGZyYW1lcyBvdGhlciBUaHJpZnQgcHJvdG9jb2xzIGFuZCBhZGRzIHN1cHBvcnQgZm9yIG9wdGlvbmFsCisgICAgb3V0LW9mLWJhbmQgaGVhZGVycy4gVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgc3VicHJvdG9jb2xzIGFyZQorICAgIFRCaW5hcnlQcm90b2NvbCBhbmQgVENvbXBhY3RQcm90b2NvbC4KKworICAgIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBhcHBseSB0cmFuc2Zvcm1zIHRvIHRoZSBlbmNvZGVkIG1lc3NhZ2UgcGF5bG9hZC4gVGhlCisgICAgb25seSB0cmFuc2Zvcm0gY3VycmVudGx5IHN1cHBvcnRlZCBpcyB0byBnemlwLgorCisgICAgV2hlbiB1c2VkIGluIGEgc2VydmVyLCBUSGVhZGVyUHJvdG9jb2wgY2FuIGFjY2VwdCBtZXNzYWdlcyBmcm9tCisgICAgbm9uLVRIZWFkZXJQcm90b2NvbCBjbGllbnRzIGlmIGFsbG93ZWQgKHNlZSBgYWxsb3dlZF9jbGllbnRfdHlwZXNgKS4gVGhpcworICAgIGluY2x1ZGVzIGZyYW1lZCBhbmQgdW5mcmFtZWQgdHJhbnNwb3J0cyBhbmQgYm90aCBUQmluYXJ5UHJvdG9jb2wgYW5kCisgICAgVENvbXBhY3RQcm90b2NvbC4gVGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgaW4gdGhlIGFwcHJvcHJpYXRlIGRpYWxlY3QgZm9yCisgICAgdGhlIGNvbm5lY3RlZCBjbGllbnQuIEhUVFAgY2xpZW50cyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisKKyAgICBUSGVhZGVyUHJvdG9jb2wgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgVEhUVFBTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwKKyAgICBvciBUUHJvY2Vzc1Bvb2xTZXJ2ZXIuCisKKyAgICBTZWUgZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZCBmb3IgZGV0YWlscyBvZiB0aGUgd2lyZSBmb3JtYXQuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGFsbG93ZWRfY2xpZW50X3R5cGVzKToKKyAgICAgICAgIyBtdWNoIG9mIHRoZSBhY3R1YWwgd29yayBmb3IgVEhlYWRlclByb3RvY29sIGhhcHBlbnMgZG93biBpbgorICAgICAgICAjIFRIZWFkZXJUcmFuc3BvcnQgc2luY2Ugd2UgbmVlZCB0byBkbyBsb3ctbGV2ZWwgc2hlbmFuaWdhbnMgdG8gZGV0ZWN0CisgICAgICAgICMgaWYgdGhlIGNsaWVudCBpcyBzZW5kaW5nIHVzIGhlYWRlcnMgb3Igb25lIG9mIHRoZSBoZWFkZXJsZXNzIGZvcm1hdHMKKyAgICAgICAgIyB3ZSBzdXBwb3J0LiB0aGlzIHdyYXBzIHRoZSByZWFsIHRyYW5zcG9ydCB3aXRoIHRoZSBvbmUgdGhhdCBkb2VzIGFsbAorICAgICAgICAjIHRoZSBtYWdpYy4KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodHJhbnNwb3J0LCBUSGVhZGVyVHJhbnNwb3J0KToKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IFRIZWFkZXJUcmFuc3BvcnQodHJhbnNwb3J0LCBhbGxvd2VkX2NsaWVudF90eXBlcykKKyAgICAgICAgc3VwZXIoVEhlYWRlclByb3RvY29sLCBzZWxmKS5fX2luaXRfXyh0cmFuc3BvcnQpCisgICAgICAgIHNlbGYuX3NldF9wcm90b2NvbCgpCisKKyAgICBkZWYgZ2V0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRyYW5zLmdldF9oZWFkZXJzKCkKKworICAgIGRlZiBzZXRfaGVhZGVyKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBzZWxmLnRyYW5zLnNldF9oZWFkZXIoa2V5LCB2YWx1ZSkKKworICAgIGRlZiBjbGVhcl9oZWFkZXJzKHNlbGYpOgorICAgICAgICBzZWxmLnRyYW5zLmNsZWFyX2hlYWRlcnMoKQorCisgICAgZGVmIGFkZF90cmFuc2Zvcm0oc2VsZiwgdHJhbnNmb3JtX2lkKToKKyAgICAgICAgc2VsZi50cmFucy5hZGRfdHJhbnNmb3JtKHRyYW5zZm9ybV9pZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgc2VxaWQpOgorICAgICAgICBzZWxmLnRyYW5zLnNlcXVlbmNlX2lkID0gc2VxaWQKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR0eXBlLCBzZXFpZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKG5hbWUpCisKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBmaWQpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKG5hbWUsIHR0eXBlLCBmaWQpCisKKyAgICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRmllbGRFbmQoKQorCisgICAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKQorCisgICAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVNYXBFbmQoKQorCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTGlzdEJlZ2luKGV0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTGlzdEVuZCgpCisKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVTZXRFbmQoKQorCisgICAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sX3ZhbCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUJvb2woYm9vbF92YWwpCisKKyAgICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVCeXRlKGJ5dGUpCisKKyAgICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlSTE2KGkxNikKKworICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVJMzIoaTMyKQorCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUk2NChpNjQpCisKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRG91YmxlKGR1YikKKworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBzdHJfdmFsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlQmluYXJ5KHN0cl92YWwpCisKKyAgICBkZWYgX3NldF9wcm90b2NvbChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJvdG9jb2xfY2xzID0gUFJPVE9DT0xTX0JZX0lEW3NlbGYudHJhbnMucHJvdG9jb2xfaWRdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAiVW5rbm93biBwcm90b2NvbCByZXF1ZXN0ZWQuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLl9wcm90b2NvbCA9IHByb3RvY29sX2NscyhzZWxmLnRyYW5zKQorICAgICAgICBzZWxmLl9mYXN0X2VuY29kZSA9IHNlbGYuX3Byb3RvY29sLl9mYXN0X2VuY29kZQorICAgICAgICBzZWxmLl9mYXN0X2RlY29kZSA9IHNlbGYuX3Byb3RvY29sLl9mYXN0X2RlY29kZQorCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudHJhbnMucmVhZEZyYW1lKDApCisgICAgICAgICAgICBzZWxmLl9zZXRfcHJvdG9jb2woKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKGIiIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgMCkKKyAgICAgICAgICAgIGV4Yy53cml0ZShzZWxmLl9wcm90b2NvbCkKKyAgICAgICAgICAgIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpCisgICAgICAgICAgICBzZWxmLnRyYW5zLmZsdXNoKCkKKworICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpCisKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCkKKworICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFN0cnVjdEVuZCgpCisKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkRmllbGRCZWdpbigpCisKKyAgICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEZpZWxkRW5kKCkKKworICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWFwQmVnaW4oKQorCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWFwRW5kKCkKKworICAgIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZExpc3RCZWdpbigpCisKKyAgICBkZWYgcmVhZExpc3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTGlzdEVuZCgpCisKKyAgICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFNldEJlZ2luKCkKKworICAgIGRlZiByZWFkU2V0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFNldEVuZCgpCisKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQm9vbCgpCisKKyAgICBkZWYgcmVhZEJ5dGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQnl0ZSgpCisKKyAgICBkZWYgcmVhZEkxNihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRJMTYoKQorCisgICAgZGVmIHJlYWRJMzIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkSTMyKCkKKworICAgIGRlZiByZWFkSTY0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEk2NCgpCisKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWREb3VibGUoKQorCisgICAgZGVmIHJlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQmluYXJ5KCkKKworCitjbGFzcyBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KFRQcm90b2NvbEZhY3RvcnkpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhbGxvd2VkX2NsaWVudF90eXBlcz0oVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUywpKToKKyAgICAgICAgc2VsZi5hbGxvd2VkX2NsaWVudF90eXBlcyA9IGFsbG93ZWRfY2xpZW50X3R5cGVzCisKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVEhlYWRlclByb3RvY29sKHRyYW5zLCBzZWxmLmFsbG93ZWRfY2xpZW50X3R5cGVzKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLnB5CmluZGV4IDljMTg3N2IuLjE3NDE3MDIgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wucHkKQEAgLTE3LDExICsxNywxNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBUUHJvdG9jb2wgaW1wb3J0IFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sIFwKLSAgICBjaGVja0ludGVnZXJMaW1pdHMKK2Zyb20gLlRQcm90b2NvbCBpbXBvcnQgKFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5LCBjaGVja0ludGVnZXJMaW1pdHMpCiBpbXBvcnQgYmFzZTY0Ci1pbXBvcnQganNvbgogaW1wb3J0IG1hdGgKK2ltcG9ydCBzeXMKKworZnJvbSAuLmNvbXBhdCBpbXBvcnQgc3RyX3RvX2JpbmFyeQorCiAKIF9fYWxsX18gPSBbJ1RKU09OUHJvdG9jb2wnLAogICAgICAgICAgICAnVEpTT05Qcm90b2NvbEZhY3RvcnknLApAQCAtMzAsNTAzICszMyw2MDggQEAKIAogVkVSU0lPTiA9IDEKIAotQ09NTUEgPSAnLCcKLUNPTE9OID0gJzonCi1MQlJBQ0UgPSAneycKLVJCUkFDRSA9ICd9JwotTEJSQUNLRVQgPSAnWycKLVJCUkFDS0VUID0gJ10nCi1RVU9URSA9ICciJwotQkFDS1NMQVNIID0gJ1xcJwotWkVSTyA9ICcwJworQ09NTUEgPSBiJywnCitDT0xPTiA9IGInOicKK0xCUkFDRSA9IGIneycKK1JCUkFDRSA9IGInfScKK0xCUkFDS0VUID0gYidbJworUkJSQUNLRVQgPSBiJ10nCitRVU9URSA9IGInIicKK0JBQ0tTTEFTSCA9IGInXFwnCitaRVJPID0gYicwJwogCi1FU0NTRVEgPSAnXFx1MDAnCi1FU0NBUEVfQ0hBUiA9ICciXFxiZm5ydCcKLUVTQ0FQRV9DSEFSX1ZBTFMgPSBbJyInLCAnXFwnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnXQotTlVNRVJJQ19DSEFSID0gJystLjAxMjM0NTY3ODlFZScKK0VTQ1NFUTAgPSBvcmQoJ1xcJykKK0VTQ1NFUTEgPSBvcmQoJ3UnKQorRVNDQVBFX0NIQVJfVkFMUyA9IHsKKyAgICAnIic6ICdcXCInLAorICAgICdcXCc6ICdcXFxcJywKKyAgICAnXGInOiAnXFxiJywKKyAgICAnXGYnOiAnXFxmJywKKyAgICAnXG4nOiAnXFxuJywKKyAgICAnXHInOiAnXFxyJywKKyAgICAnXHQnOiAnXFx0JywKKyAgICAjICcvJzogJ1xcLycsCit9CitFU0NBUEVfQ0hBUlMgPSB7CisgICAgYiciJzogJyInLAorICAgIGInXFwnOiAnXFwnLAorICAgIGInYic6ICdcYicsCisgICAgYidmJzogJ1xmJywKKyAgICBiJ24nOiAnXG4nLAorICAgIGIncic6ICdccicsCisgICAgYid0JzogJ1x0JywKKyAgICBiJy8nOiAnLycsCit9CitOVU1FUklDX0NIQVIgPSBiJystLjAxMjM0NTY3ODlFZScKIAotQ1RZUEVTID0ge1RUeXBlLkJPT0w6ICAgICAgICd0ZicsCi0gICAgICAgICAgVFR5cGUuQllURTogICAgICAgJ2k4JywKLSAgICAgICAgICBUVHlwZS5JMTY6ICAgICAgICAnaTE2JywKLSAgICAgICAgICBUVHlwZS5JMzI6ICAgICAgICAnaTMyJywKLSAgICAgICAgICBUVHlwZS5JNjQ6ICAgICAgICAnaTY0JywKLSAgICAgICAgICBUVHlwZS5ET1VCTEU6ICAgICAnZGJsJywKLSAgICAgICAgICBUVHlwZS5TVFJJTkc6ICAgICAnc3RyJywKLSAgICAgICAgICBUVHlwZS5TVFJVQ1Q6ICAgICAncmVjJywKLSAgICAgICAgICBUVHlwZS5MSVNUOiAgICAgICAnbHN0JywKLSAgICAgICAgICBUVHlwZS5TRVQ6ICAgICAgICAnc2V0JywKLSAgICAgICAgICBUVHlwZS5NQVA6ICAgICAgICAnbWFwJ30KK0NUWVBFUyA9IHsKKyAgICBUVHlwZS5CT09MOiAndGYnLAorICAgIFRUeXBlLkJZVEU6ICdpOCcsCisgICAgVFR5cGUuSTE2OiAnaTE2JywKKyAgICBUVHlwZS5JMzI6ICdpMzInLAorICAgIFRUeXBlLkk2NDogJ2k2NCcsCisgICAgVFR5cGUuRE9VQkxFOiAnZGJsJywKKyAgICBUVHlwZS5TVFJJTkc6ICdzdHInLAorICAgIFRUeXBlLlNUUlVDVDogJ3JlYycsCisgICAgVFR5cGUuTElTVDogJ2xzdCcsCisgICAgVFR5cGUuU0VUOiAnc2V0JywKKyAgICBUVHlwZS5NQVA6ICdtYXAnLAorfQogCiBKVFlQRVMgPSB7fQogZm9yIGtleSBpbiBDVFlQRVMua2V5cygpOgotICBKVFlQRVNbQ1RZUEVTW2tleV1dID0ga2V5CisgICAgSlRZUEVTW0NUWVBFU1trZXldXSA9IGtleQogCiAKIGNsYXNzIEpTT05CYXNlQ29udGV4dChvYmplY3QpOgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6Ci0gICAgc2VsZi5wcm90b2NvbCA9IHByb3RvY29sCi0gICAgc2VsZi5maXJzdCA9IFRydWUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wpOgorICAgICAgICBzZWxmLnByb3RvY29sID0gcHJvdG9jb2wKKyAgICAgICAgc2VsZi5maXJzdCA9IFRydWUKIAotICBkZWYgZG9JTyhzZWxmLCBmdW5jdGlvbik6Ci0gICAgcGFzcwotICAKLSAgZGVmIHdyaXRlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgZG9JTyhzZWxmLCBmdW5jdGlvbik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGVzY2FwZU51bShzZWxmKToKLSAgICByZXR1cm4gRmFsc2UKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworICAgIGRlZiBlc2NhcGVOdW0oc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXwogCiAKIGNsYXNzIEpTT05MaXN0Q29udGV4dChKU09OQmFzZUNvbnRleHQpOgotICAgIAotICBkZWYgZG9JTyhzZWxmLCBmdW5jdGlvbik6Ci0gICAgaWYgc2VsZi5maXJzdCBpcyBUcnVlOgotICAgICAgc2VsZi5maXJzdCA9IEZhbHNlCi0gICAgZWxzZToKLSAgICAgIGZ1bmN0aW9uKENPTU1BKQogCi0gIGRlZiB3cml0ZShzZWxmKToKLSAgICBzZWxmLmRvSU8oc2VsZi5wcm90b2NvbC50cmFucy53cml0ZSkKKyAgICBkZWYgZG9JTyhzZWxmLCBmdW5jdGlvbik6CisgICAgICAgIGlmIHNlbGYuZmlyc3QgaXMgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuZmlyc3QgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnVuY3Rpb24oQ09NTUEpCiAKLSAgZGVmIHJlYWQoc2VsZik6Ci0gICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wucmVhZEpTT05TeW50YXhDaGFyKQorICAgIGRlZiB3cml0ZShzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wudHJhbnMud3JpdGUpCisKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wucmVhZEpTT05TeW50YXhDaGFyKQogCiAKIGNsYXNzIEpTT05QYWlyQ29udGV4dChKU09OQmFzZUNvbnRleHQpOgotICAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKLSAgICBzdXBlcihKU09OUGFpckNvbnRleHQsIHNlbGYpLl9faW5pdF9fKHByb3RvY29sKQotICAgIHNlbGYuY29sb24gPSBUcnVlCiAKLSAgZGVmIGRvSU8oc2VsZiwgZnVuY3Rpb24pOgotICAgIGlmIHNlbGYuZmlyc3Q6Ci0gICAgICBzZWxmLmZpcnN0ID0gRmFsc2UKLSAgICAgIHNlbGYuY29sb24gPSBUcnVlCi0gICAgZWxzZToKLSAgICAgIGZ1bmN0aW9uKENPTE9OIGlmIHNlbGYuY29sb24gZWxzZSBDT01NQSkKLSAgICAgIHNlbGYuY29sb24gPSBub3Qgc2VsZi5jb2xvbgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHN1cGVyKEpTT05QYWlyQ29udGV4dCwgc2VsZikuX19pbml0X18ocHJvdG9jb2wpCisgICAgICAgIHNlbGYuY29sb24gPSBUcnVlCiAKLSAgZGVmIHdyaXRlKHNlbGYpOgotICAgIHNlbGYuZG9JTyhzZWxmLnByb3RvY29sLnRyYW5zLndyaXRlKQorICAgIGRlZiBkb0lPKHNlbGYsIGZ1bmN0aW9uKToKKyAgICAgICAgaWYgc2VsZi5maXJzdDoKKyAgICAgICAgICAgIHNlbGYuZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5jb2xvbiA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZ1bmN0aW9uKENPTE9OIGlmIHNlbGYuY29sb24gZWxzZSBDT01NQSkKKyAgICAgICAgICAgIHNlbGYuY29sb24gPSBub3Qgc2VsZi5jb2xvbgogCi0gIGRlZiByZWFkKHNlbGYpOgotICAgIHNlbGYuZG9JTyhzZWxmLnByb3RvY29sLnJlYWRKU09OU3ludGF4Q2hhcikKKyAgICBkZWYgd3JpdGUoc2VsZik6CisgICAgICAgIHNlbGYuZG9JTyhzZWxmLnByb3RvY29sLnRyYW5zLndyaXRlKQogCi0gIGRlZiBlc2NhcGVOdW0oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuY29sb24KKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wucmVhZEpTT05TeW50YXhDaGFyKQogCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIHJldHVybiAnJXMsIGNvbG9uPSVzJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5jb2xvbikKKyAgICBkZWYgZXNjYXBlTnVtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb2xvbgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAnJXMsIGNvbG9uPSVzJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5jb2xvbikKIAogCiBjbGFzcyBMb29rYWhlYWRSZWFkZXIoKToKLSAgaGFzRGF0YSA9IEZhbHNlCi0gIGRhdGEgPSAnJworICAgIGhhc0RhdGEgPSBGYWxzZQorICAgIGRhdGEgPSAnJwogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6Ci0gICAgc2VsZi5wcm90b2NvbCA9IHByb3RvY29sCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKKyAgICAgICAgc2VsZi5wcm90b2NvbCA9IHByb3RvY29sCiAKLSAgZGVmIHJlYWQoc2VsZik6Ci0gICAgaWYgc2VsZi5oYXNEYXRhIGlzIFRydWU6Ci0gICAgICBzZWxmLmhhc0RhdGEgPSBGYWxzZQotICAgIGVsc2U6Ci0gICAgICBzZWxmLmRhdGEgPSBzZWxmLnByb3RvY29sLnRyYW5zLnJlYWQoMSkKLSAgICByZXR1cm4gc2VsZi5kYXRhCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFzRGF0YSBpcyBUcnVlOgorICAgICAgICAgICAgc2VsZi5oYXNEYXRhID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYucHJvdG9jb2wudHJhbnMucmVhZCgxKQorICAgICAgICByZXR1cm4gc2VsZi5kYXRhCiAKLSAgZGVmIHBlZWsoc2VsZik6Ci0gICAgaWYgc2VsZi5oYXNEYXRhIGlzIEZhbHNlOgotICAgICAgc2VsZi5kYXRhID0gc2VsZi5wcm90b2NvbC50cmFucy5yZWFkKDEpCi0gICAgc2VsZi5oYXNEYXRhID0gVHJ1ZQotICAgIHJldHVybiBzZWxmLmRhdGEKKyAgICBkZWYgcGVlayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYXNEYXRhIGlzIEZhbHNlOgorICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5wcm90b2NvbC50cmFucy5yZWFkKDEpCisgICAgICAgIHNlbGYuaGFzRGF0YSA9IFRydWUKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQorCiAKIGNsYXNzIFRKU09OUHJvdG9jb2xCYXNlKFRQcm90b2NvbEJhc2UpOgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucyk6Ci0gICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKLSAgICBzZWxmLnJlc2V0V3JpdGVDb250ZXh0KCkKLSAgICBzZWxmLnJlc2V0UmVhZENvbnRleHQoKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucyk6CisgICAgICAgIFRQcm90b2NvbEJhc2UuX19pbml0X18oc2VsZiwgdHJhbnMpCisgICAgICAgIHNlbGYucmVzZXRXcml0ZUNvbnRleHQoKQorICAgICAgICBzZWxmLnJlc2V0UmVhZENvbnRleHQoKQogCi0gIGRlZiByZXNldFdyaXRlQ29udGV4dChzZWxmKToKLSAgICBzZWxmLmNvbnRleHQgPSBKU09OQmFzZUNvbnRleHQoc2VsZikKLSAgICBzZWxmLmNvbnRleHRTdGFjayA9IFtzZWxmLmNvbnRleHRdCisgICAgIyBXZSBkb24ndCBoYXZlIGxlbmd0aCBsaW1pdCBpbXBsZW1lbnRhdGlvbiBmb3IgSlNPTiBwcm90b2NvbHMKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3RyaW5nX2xlbmd0aF9saW1pdChzZW5mKToKKyAgICAgICAgcmV0dXJuIE5vbmUKIAotICBkZWYgcmVzZXRSZWFkQ29udGV4dChzZWxmKToKLSAgICBzZWxmLnJlc2V0V3JpdGVDb250ZXh0KCkKLSAgICBzZWxmLnJlYWRlciA9IExvb2thaGVhZFJlYWRlcihzZWxmKQorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjb250YWluZXJfbGVuZ3RoX2xpbWl0KHNlbmYpOgorICAgICAgICByZXR1cm4gTm9uZQogCi0gIGRlZiBwdXNoQ29udGV4dChzZWxmLCBjdHgpOgotICAgIHNlbGYuY29udGV4dFN0YWNrLmFwcGVuZChjdHgpCi0gICAgc2VsZi5jb250ZXh0ID0gY3R4CisgICAgZGVmIHJlc2V0V3JpdGVDb250ZXh0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRleHQgPSBKU09OQmFzZUNvbnRleHQoc2VsZikKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2sgPSBbc2VsZi5jb250ZXh0XQogCi0gIGRlZiBwb3BDb250ZXh0KHNlbGYpOgotICAgIHNlbGYuY29udGV4dFN0YWNrLnBvcCgpCi0gICAgaWYgc2VsZi5jb250ZXh0U3RhY2s6Ci0gICAgICBzZWxmLmNvbnRleHQgPSBzZWxmLmNvbnRleHRTdGFja1stMV0KLSAgICBlbHNlOgotICAgICAgc2VsZi5jb250ZXh0ID0gSlNPTkJhc2VDb250ZXh0KHNlbGYpCisgICAgZGVmIHJlc2V0UmVhZENvbnRleHQoc2VsZik6CisgICAgICAgIHNlbGYucmVzZXRXcml0ZUNvbnRleHQoKQorICAgICAgICBzZWxmLnJlYWRlciA9IExvb2thaGVhZFJlYWRlcihzZWxmKQogCi0gIGRlZiB3cml0ZUpTT05TdHJpbmcoc2VsZiwgc3RyaW5nKToKLSAgICBzZWxmLmNvbnRleHQud3JpdGUoKQotICAgIHNlbGYudHJhbnMud3JpdGUoanNvbi5kdW1wcyhzdHJpbmcpKQorICAgIGRlZiBwdXNoQ29udGV4dChzZWxmLCBjdHgpOgorICAgICAgICBzZWxmLmNvbnRleHRTdGFjay5hcHBlbmQoY3R4KQorICAgICAgICBzZWxmLmNvbnRleHQgPSBjdHgKIAotICBkZWYgd3JpdGVKU09OTnVtYmVyKHNlbGYsIG51bWJlcik6Ci0gICAgc2VsZi5jb250ZXh0LndyaXRlKCkKLSAgICBqc051bWJlciA9IHN0cihudW1iZXIpCi0gICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpOgotICAgICAganNOdW1iZXIgPSAiJXMlcyVzIiAlIChRVU9URSwganNOdW1iZXIsICBRVU9URSkKLSAgICBzZWxmLnRyYW5zLndyaXRlKGpzTnVtYmVyKQotCi0gIGRlZiB3cml0ZUpTT05CYXNlNjQoc2VsZiwgYmluYXJ5KToKLSAgICBzZWxmLmNvbnRleHQud3JpdGUoKQotICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCi0gICAgc2VsZi50cmFucy53cml0ZShiYXNlNjQuYjY0ZW5jb2RlKGJpbmFyeSkpCi0gICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKLQotICBkZWYgd3JpdGVKU09OT2JqZWN0U3RhcnQoc2VsZik6Ci0gICAgc2VsZi5jb250ZXh0LndyaXRlKCkKLSAgICBzZWxmLnRyYW5zLndyaXRlKExCUkFDRSkKLSAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05QYWlyQ29udGV4dChzZWxmKSkKLQotICBkZWYgd3JpdGVKU09OT2JqZWN0RW5kKHNlbGYpOgotICAgIHNlbGYucG9wQ29udGV4dCgpCi0gICAgc2VsZi50cmFucy53cml0ZShSQlJBQ0UpCi0KLSAgZGVmIHdyaXRlSlNPTkFycmF5U3RhcnQoc2VsZik6Ci0gICAgc2VsZi5jb250ZXh0LndyaXRlKCkKLSAgICBzZWxmLnRyYW5zLndyaXRlKExCUkFDS0VUKQotICAgIHNlbGYucHVzaENvbnRleHQoSlNPTkxpc3RDb250ZXh0KHNlbGYpKQotCi0gIGRlZiB3cml0ZUpTT05BcnJheUVuZChzZWxmKToKLSAgICBzZWxmLnBvcENvbnRleHQoKQotICAgIHNlbGYudHJhbnMud3JpdGUoUkJSQUNLRVQpCi0KLSAgZGVmIHJlYWRKU09OU3ludGF4Q2hhcihzZWxmLCBjaGFyYWN0ZXIpOgotICAgIGN1cnJlbnQgPSBzZWxmLnJlYWRlci5yZWFkKCkKLSAgICBpZiBjaGFyYWN0ZXIgIT0gY3VycmVudDoKLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlcjogJXMiICUgY3VycmVudCkKLQotICBkZWYgcmVhZEpTT05TdHJpbmcoc2VsZiwgc2tpcENvbnRleHQpOgotICAgIHN0cmluZyA9IFtdCi0gICAgaWYgc2tpcENvbnRleHQgaXMgRmFsc2U6Ci0gICAgICBzZWxmLmNvbnRleHQucmVhZCgpCi0gICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnJlYWQoKQotICAgICAgaWYgY2hhcmFjdGVyID09IFFVT1RFOgotICAgICAgICBicmVhawotICAgICAgaWYgY2hhcmFjdGVyID09IEVTQ1NFUVswXToKLSAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5yZWFkZXIucmVhZCgpCi0gICAgICAgIGlmIGNoYXJhY3RlciA9PSBFU0NTRVFbMV06Ci0gICAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoWkVSTykKLSAgICAgICAgICBzZWxmLnJlYWRKU09OU3ludGF4Q2hhcihaRVJPKQotICAgICAgICAgIGNoYXJhY3RlciA9IGpzb24uSlNPTkRlY29kZXIoKS5kZWNvZGUoJyJcdTAwJXMiJyAlIHNlbGYudHJhbnMucmVhZCgyKSkKKyAgICBkZWYgcG9wQ29udGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2sucG9wKCkKKyAgICAgICAgaWYgc2VsZi5jb250ZXh0U3RhY2s6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBzZWxmLmNvbnRleHRTdGFja1stMV0KICAgICAgICAgZWxzZToKLSAgICAgICAgICBvZmYgPSBFU0NBUEVfQ0hBUi5maW5kKGNoYXJhY3RlcikKLSAgICAgICAgICBpZiBvZmYgPT0gLTE6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBKU09OQmFzZUNvbnRleHQoc2VsZikKKworICAgIGRlZiB3cml0ZUpTT05TdHJpbmcoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi5jb250ZXh0LndyaXRlKCkKKyAgICAgICAganNvbl9zdHIgPSBbJyInXQorICAgICAgICBmb3IgcyBpbiBzdHJpbmc6CisgICAgICAgICAgICBlc2NhcGVkID0gRVNDQVBFX0NIQVJfVkFMUy5nZXQocywgcykKKyAgICAgICAgICAgIGpzb25fc3RyLmFwcGVuZChlc2NhcGVkKQorICAgICAgICBqc29uX3N0ci5hcHBlbmQoJyInKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHN0cl90b19iaW5hcnkoJycuam9pbihqc29uX3N0cikpKQorCisgICAgZGVmIHdyaXRlSlNPTk51bWJlcihzZWxmLCBudW1iZXIsIGZvcm1hdHRlcj0nezB9Jyk6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIGpzTnVtYmVyID0gc3RyKGZvcm1hdHRlci5mb3JtYXQobnVtYmVyKSkuZW5jb2RlKCdhc2NpaScpCisgICAgICAgIGlmIHNlbGYuY29udGV4dC5lc2NhcGVOdW0oKToKKyAgICAgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCisgICAgICAgICAgICBzZWxmLnRyYW5zLndyaXRlKGpzTnVtYmVyKQorICAgICAgICAgICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudHJhbnMud3JpdGUoanNOdW1iZXIpCisKKyAgICBkZWYgd3JpdGVKU09OQmFzZTY0KHNlbGYsIGJpbmFyeSk6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYmFzZTY0LmI2NGVuY29kZShiaW5hcnkpKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFFVT1RFKQorCisgICAgZGVmIHdyaXRlSlNPTk9iamVjdFN0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRleHQud3JpdGUoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKExCUkFDRSkKKyAgICAgICAgc2VsZi5wdXNoQ29udGV4dChKU09OUGFpckNvbnRleHQoc2VsZikpCisKKyAgICBkZWYgd3JpdGVKU09OT2JqZWN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFJCUkFDRSkKKworICAgIGRlZiB3cml0ZUpTT05BcnJheVN0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRleHQud3JpdGUoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKExCUkFDS0VUKQorICAgICAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05MaXN0Q29udGV4dChzZWxmKSkKKworICAgIGRlZiB3cml0ZUpTT05BcnJheUVuZChzZWxmKToKKyAgICAgICAgc2VsZi5wb3BDb250ZXh0KCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShSQlJBQ0tFVCkKKworICAgIGRlZiByZWFkSlNPTlN5bnRheENoYXIoc2VsZiwgY2hhcmFjdGVyKToKKyAgICAgICAgY3VycmVudCA9IHNlbGYucmVhZGVyLnJlYWQoKQorICAgICAgICBpZiBjaGFyYWN0ZXIgIT0gY3VycmVudDoKICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKQotICAgICAgICAgIGNoYXJhY3RlciA9IEVTQ0FQRV9DSEFSX1ZBTFNbb2ZmXQotICAgICAgc3RyaW5nLmFwcGVuZChjaGFyYWN0ZXIpCi0gICAgcmV0dXJuICcnLmpvaW4oc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlcjogJXMiICUgY3VycmVudCkKIAotICBkZWYgaXNKU09OTnVtZXJpYyhzZWxmLCBjaGFyYWN0ZXIpOgotICAgIHJldHVybiAoVHJ1ZSBpZiBOVU1FUklDX0NIQVIuZmluZChjaGFyYWN0ZXIpICE9IC0gMSBlbHNlIEZhbHNlKQorICAgIGRlZiBfaXNIaWdoU3Vycm9nYXRlKHNlbGYsIGNvZGV1bml0KToKKyAgICAgICAgcmV0dXJuIGNvZGV1bml0ID49IDB4ZDgwMCBhbmQgY29kZXVuaXQgPD0gMHhkYmZmCiAKLSAgZGVmIHJlYWRKU09OUXVvdGVzKHNlbGYpOgotICAgIGlmIChzZWxmLmNvbnRleHQuZXNjYXBlTnVtKCkpOgotICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCisgICAgZGVmIF9pc0xvd1N1cnJvZ2F0ZShzZWxmLCBjb2RldW5pdCk6CisgICAgICAgIHJldHVybiBjb2RldW5pdCA+PSAweGRjMDAgYW5kIGNvZGV1bml0IDw9IDB4ZGZmZgogCi0gIGRlZiByZWFkSlNPTk51bWVyaWNDaGFycyhzZWxmKToKLSAgICBudW1lcmljID0gW10KLSAgICB3aGlsZSBUcnVlOgotICAgICAgY2hhcmFjdGVyID0gc2VsZi5yZWFkZXIucGVlaygpCi0gICAgICBpZiBzZWxmLmlzSlNPTk51bWVyaWMoY2hhcmFjdGVyKSBpcyBGYWxzZToKLSAgICAgICAgYnJlYWsKLSAgICAgIG51bWVyaWMuYXBwZW5kKHNlbGYucmVhZGVyLnJlYWQoKSkKLSAgICByZXR1cm4gJycuam9pbihudW1lcmljKQorICAgIGRlZiBfdG9DaGFyKHNlbGYsIGhpZ2gsIGxvdz1Ob25lKToKKyAgICAgICAgaWYgbm90IGxvdzoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJcXHUlMDR4IiAlIGhpZ2gpLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNocihoaWdoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29kZXBvaW50ID0gKDEgPDwgMTYpICsgKChoaWdoICYgMHgzZmYpIDw8IDEwKQorICAgICAgICAgICAgY29kZXBvaW50ICs9IGxvdyAmIDB4M2ZmCisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgICAgICAgICAgICAgcyA9ICJcXFUlMDh4IiAlIGNvZGVwb2ludAorICAgICAgICAgICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNocihjb2RlcG9pbnQpCiAKLSAgZGVmIHJlYWRKU09OSW50ZWdlcihzZWxmKToKLSAgICBzZWxmLmNvbnRleHQucmVhZCgpCi0gICAgc2VsZi5yZWFkSlNPTlF1b3RlcygpCi0gICAgbnVtZXJpYyA9IHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKQotICAgIHNlbGYucmVhZEpTT05RdW90ZXMoKQotICAgIHRyeToKLSAgICAgIHJldHVybiBpbnQobnVtZXJpYykKLSAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIikKLQotICBkZWYgcmVhZEpTT05Eb3VibGUoc2VsZik6Ci0gICAgc2VsZi5jb250ZXh0LnJlYWQoKQotICAgIGlmIHNlbGYucmVhZGVyLnBlZWsoKSA9PSBRVU9URToKLSAgICAgIHN0cmluZyAgPSBzZWxmLnJlYWRKU09OU3RyaW5nKFRydWUpCi0gICAgICB0cnk6Ci0gICAgICAgIGRvdWJsZSA9IGZsb2F0KHN0cmluZykKLSAgICAgICAgaWYgKHNlbGYuY29udGV4dC5lc2NhcGVOdW0gaXMgRmFsc2UgYW5kCi0gICAgICAgICAgICBub3QgbWF0aC5pc2luZihkb3VibGUpIGFuZAotICAgICAgICAgICAgbm90IG1hdGguaXNuYW4oZG91YmxlKSk6Ci0gICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpCi0gICAgICAgIHJldHVybiBkb3VibGUKLSAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIikKLSAgICBlbHNlOgotICAgICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpIGlzIFRydWU6CisgICAgZGVmIHJlYWRKU09OU3RyaW5nKHNlbGYsIHNraXBDb250ZXh0KToKKyAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IE5vbmUKKyAgICAgICAgc3RyaW5nID0gW10KKyAgICAgICAgaWYgc2tpcENvbnRleHQgaXMgRmFsc2U6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQucmVhZCgpCiAgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKQotICAgICAgdHJ5OgotICAgICAgICByZXR1cm4gZmxvYXQoc2VsZi5yZWFkSlNPTk51bWVyaWNDaGFycygpKQotICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5yZWFkZXIucmVhZCgpCisgICAgICAgICAgICBpZiBjaGFyYWN0ZXIgPT0gUVVPVEU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG9yZChjaGFyYWN0ZXIpID09IEVTQ1NFUTA6CisgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5yZWFkZXIucmVhZCgpCisgICAgICAgICAgICAgICAgaWYgb3JkKGNoYXJhY3RlcikgPT0gRVNDU0VRMToKKyAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi50cmFucy5yZWFkKDQpLmRlY29kZSgnYXNjaWknKQorICAgICAgICAgICAgICAgICAgICBjb2RldW5pdCA9IGludChjaGFyYWN0ZXIsIDE2KQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9pc0hpZ2hTdXJyb2dhdGUoY29kZXVuaXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGlnaFN1cnJvZ2F0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IGNvZGV1bml0CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYuX2lzTG93U3Vycm9nYXRlKGNvZGV1bml0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBoaWdoU3Vycm9nYXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5fdG9DaGFyKGhpZ2hTdXJyb2dhdGUsIGNvZGV1bml0KQorICAgICAgICAgICAgICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHNlbGYuX3RvQ2hhcihjb2RldW5pdCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBjaGFyYWN0ZXIgbm90IGluIEVTQ0FQRV9DSEFSUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKQorICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBFU0NBUEVfQ0hBUlNbY2hhcmFjdGVyXQorICAgICAgICAgICAgZWxpZiBjaGFyYWN0ZXIgaW4gRVNDQVBFX0NIQVJfVkFMUzoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXNjYXBlZCBjb250cm9sIGNoYXIiKQorICAgICAgICAgICAgZWxpZiBzeXMudmVyc2lvbl9pbmZvWzBdID4gMjoKKyAgICAgICAgICAgICAgICB1dGY4X2J5dGVzID0gYnl0ZWFycmF5KFtvcmQoY2hhcmFjdGVyKV0pCisgICAgICAgICAgICAgICAgd2hpbGUgb3JkKHNlbGYucmVhZGVyLnBlZWsoKSkgPj0gMHg4MDoKKyAgICAgICAgICAgICAgICAgICAgdXRmOF9ieXRlcy5hcHBlbmQob3JkKHNlbGYucmVhZGVyLnJlYWQoKSkpCisgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gdXRmOF9ieXRlcy5kZWNvZGUoJ3V0ZjgnKQorICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChjaGFyYWN0ZXIpCiAKLSAgZGVmIHJlYWRKU09OQmFzZTY0KHNlbGYpOgotICAgIHN0cmluZyA9IHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCi0gICAgcmV0dXJuIGJhc2U2NC5iNjRkZWNvZGUoc3RyaW5nKQorICAgICAgICAgICAgaWYgaGlnaFN1cnJvZ2F0ZToKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgIHJldHVybiAnJy5qb2luKHN0cmluZykKIAotICBkZWYgcmVhZEpTT05PYmplY3RTdGFydChzZWxmKToKLSAgICBzZWxmLmNvbnRleHQucmVhZCgpCi0gICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKQotICAgIHNlbGYucHVzaENvbnRleHQoSlNPTlBhaXJDb250ZXh0KHNlbGYpKQorICAgIGRlZiBpc0pTT05OdW1lcmljKHNlbGYsIGNoYXJhY3Rlcik6CisgICAgICAgIHJldHVybiAoVHJ1ZSBpZiBOVU1FUklDX0NIQVIuZmluZChjaGFyYWN0ZXIpICE9IC0gMSBlbHNlIEZhbHNlKQogCi0gIGRlZiByZWFkSlNPTk9iamVjdEVuZChzZWxmKToKLSAgICBzZWxmLnJlYWRKU09OU3ludGF4Q2hhcihSQlJBQ0UpCi0gICAgc2VsZi5wb3BDb250ZXh0KCkKKyAgICBkZWYgcmVhZEpTT05RdW90ZXMoc2VsZik6CisgICAgICAgIGlmIChzZWxmLmNvbnRleHQuZXNjYXBlTnVtKCkpOgorICAgICAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCiAKLSAgZGVmIHJlYWRKU09OQXJyYXlTdGFydChzZWxmKToKLSAgICBzZWxmLmNvbnRleHQucmVhZCgpCi0gICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoTEJSQUNLRVQpCi0gICAgc2VsZi5wdXNoQ29udGV4dChKU09OTGlzdENvbnRleHQoc2VsZikpCisgICAgZGVmIHJlYWRKU09OTnVtZXJpY0NoYXJzKHNlbGYpOgorICAgICAgICBudW1lcmljID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnBlZWsoKQorICAgICAgICAgICAgaWYgc2VsZi5pc0pTT05OdW1lcmljKGNoYXJhY3RlcikgaXMgRmFsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG51bWVyaWMuYXBwZW5kKHNlbGYucmVhZGVyLnJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGInJy5qb2luKG51bWVyaWMpLmRlY29kZSgnYXNjaWknKQogCi0gIGRlZiByZWFkSlNPTkFycmF5RW5kKHNlbGYpOgotICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFJCUkFDS0VUKQotICAgIHNlbGYucG9wQ29udGV4dCgpCisgICAgZGVmIHJlYWRKU09OSW50ZWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBzZWxmLnJlYWRKU09OUXVvdGVzKCkKKyAgICAgICAgbnVtZXJpYyA9IHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgICAgICBzZWxmLnJlYWRKU09OUXVvdGVzKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGludChudW1lcmljKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIikKKworICAgIGRlZiByZWFkSlNPTkRvdWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBpZiBzZWxmLnJlYWRlci5wZWVrKCkgPT0gUVVPVEU6CisgICAgICAgICAgICBzdHJpbmcgPSBzZWxmLnJlYWRKU09OU3RyaW5nKFRydWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZG91YmxlID0gZmxvYXQoc3RyaW5nKQorICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRleHQuZXNjYXBlTnVtIGlzIEZhbHNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1hdGguaXNpbmYoZG91YmxlKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtYXRoLmlzbmFuKGRvdWJsZSkpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpIGlzIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpCisKKyAgICBkZWYgcmVhZEpTT05CYXNlNjQoc2VsZik6CisgICAgICAgIHN0cmluZyA9IHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCisgICAgICAgIHNpemUgPSBsZW4oc3RyaW5nKQorICAgICAgICBtID0gc2l6ZSAlIDQKKyAgICAgICAgIyBGb3JjZSBwYWRkaW5nIHNpbmNlIGI2NGVuY29kZSBtZXRob2QgZG9lcyBub3QgYWxsb3cgaXQKKyAgICAgICAgaWYgbSAhPSAwOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNCAtIG0pOgorICAgICAgICAgICAgICAgIHN0cmluZyArPSAnPScKKyAgICAgICAgcmV0dXJuIGJhc2U2NC5iNjRkZWNvZGUoc3RyaW5nKQorCisgICAgZGVmIHJlYWRKU09OT2JqZWN0U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKQorICAgICAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05QYWlyQ29udGV4dChzZWxmKSkKKworICAgIGRlZiByZWFkSlNPTk9iamVjdEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUkJSQUNFKQorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorCisgICAgZGVmIHJlYWRKU09OQXJyYXlTdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBzZWxmLnJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0tFVCkKKyAgICAgICAgc2VsZi5wdXNoQ29udGV4dChKU09OTGlzdENvbnRleHQoc2VsZikpCisKKyAgICBkZWYgcmVhZEpTT05BcnJheUVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUkJSQUNLRVQpCisgICAgICAgIHNlbGYucG9wQ29udGV4dCgpCiAKIAogY2xhc3MgVEpTT05Qcm90b2NvbChUSlNPTlByb3RvY29sQmFzZSk6CiAKLSAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6Ci0gICAgc2VsZi5yZXNldFJlYWRDb250ZXh0KCkKLSAgICBzZWxmLnJlYWRKU09OQXJyYXlTdGFydCgpCi0gICAgaWYgc2VsZi5yZWFkSlNPTkludGVnZXIoKSAhPSBWRVJTSU9OOgotICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIikKLSAgICBuYW1lID0gc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSkKLSAgICB0eXBlbiA9IHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKLSAgICBzZXFpZCA9IHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKLSAgICByZXR1cm4gKG5hbWUsIHR5cGVuLCBzZXFpZCkKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldFJlYWRDb250ZXh0KCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBpZiBzZWxmLnJlYWRKU09OSW50ZWdlcigpICE9IFZFUlNJT046CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKQorICAgICAgICBuYW1lID0gc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSkKKyAgICAgICAgdHlwZW4gPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHNlcWlkID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICByZXR1cm4gKG5hbWUsIHR5cGVuLCBzZXFpZCkKIAotICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgc2VsZi5yZWFkSlNPTkFycmF5RW5kKCkKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheUVuZCgpCiAKLSAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKLSAgICBzZWxmLnJlYWRKU09OT2JqZWN0U3RhcnQoKQorICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RTdGFydCgpCiAKLSAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6Ci0gICAgc2VsZi5yZWFkSlNPTk9iamVjdEVuZCgpCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQogCi0gIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKLSAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5wZWVrKCkKLSAgICB0dHlwZSA9IDAKLSAgICBpZCA9IDAKLSAgICBpZiBjaGFyYWN0ZXIgPT0gUkJSQUNFOgotICAgICAgdHR5cGUgPSBUVHlwZS5TVE9QCi0gICAgZWxzZToKLSAgICAgIGlkID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQotICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdFN0YXJ0KCkKLSAgICAgIHR0eXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQotICAgIHJldHVybiAoTm9uZSwgdHR5cGUsIGlkKQorICAgIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKKyAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5yZWFkZXIucGVlaygpCisgICAgICAgIHR0eXBlID0gMAorICAgICAgICBpZCA9IDAKKyAgICAgICAgaWYgY2hhcmFjdGVyID09IFJCUkFDRToKKyAgICAgICAgICAgIHR0eXBlID0gVFR5cGUuU1RPUAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWQgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgICAgICBzZWxmLnJlYWRKU09OT2JqZWN0U3RhcnQoKQorICAgICAgICAgICAgdHR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCisgICAgICAgIHJldHVybiAoTm9uZSwgdHR5cGUsIGlkKQogCi0gIGRlZiByZWFkRmllbGRFbmQoc2VsZik6Ci0gICAgc2VsZi5yZWFkSlNPTk9iamVjdEVuZCgpCisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdEVuZCgpCiAKLSAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKLSAgICBzZWxmLnJlYWRKU09OQXJyYXlTdGFydCgpCi0gICAga2V5VHlwZSA9IEpUWVBFU1tzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKV0KLSAgICB2YWx1ZVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCi0gICAgc2l6ZSA9IHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKLSAgICBzZWxmLnJlYWRKU09OT2JqZWN0U3RhcnQoKQotICAgIHJldHVybiAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKQorICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAga2V5VHlwZSA9IEpUWVBFU1tzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKV0KKyAgICAgICAgdmFsdWVUeXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICBzZWxmLnJlYWRKU09OT2JqZWN0U3RhcnQoKQorICAgICAgICByZXR1cm4gKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkKIAotICBkZWYgcmVhZE1hcEVuZChzZWxmKToKLSAgICBzZWxmLnJlYWRKU09OT2JqZWN0RW5kKCkKLSAgICBzZWxmLnJlYWRKU09OQXJyYXlFbmQoKQorICAgIGRlZiByZWFkTWFwRW5kKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OT2JqZWN0RW5kKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5RW5kKCkKIAotICBkZWYgcmVhZENvbGxlY3Rpb25CZWdpbihzZWxmKToKLSAgICBzZWxmLnJlYWRKU09OQXJyYXlTdGFydCgpCi0gICAgZWxlbVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCi0gICAgc2l6ZSA9IHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKLSAgICByZXR1cm4gKGVsZW1UeXBlLCBzaXplKQotICByZWFkTGlzdEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgotICByZWFkU2V0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uQmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgZWxlbVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHJldHVybiAoZWxlbVR5cGUsIHNpemUpCisgICAgcmVhZExpc3RCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KKyAgICByZWFkU2V0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCiAKLSAgZGVmIHJlYWRDb2xsZWN0aW9uRW5kKHNlbGYpOgotICAgIHNlbGYucmVhZEpTT05BcnJheUVuZCgpCi0gIHJlYWRTZXRFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAotICByZWFkTGlzdEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uRW5kKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OQXJyYXlFbmQoKQorICAgIHJlYWRTZXRFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorICAgIHJlYWRMaXN0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKIAotICBkZWYgcmVhZEJvb2woc2VsZik6Ci0gICAgcmV0dXJuIChGYWxzZSBpZiBzZWxmLnJlYWRKU09OSW50ZWdlcigpID09IDAgZWxzZSBUcnVlKQorICAgIGRlZiByZWFkQm9vbChzZWxmKToKKyAgICAgICAgcmV0dXJuIChGYWxzZSBpZiBzZWxmLnJlYWRKU09OSW50ZWdlcigpID09IDAgZWxzZSBUcnVlKQogCi0gIGRlZiByZWFkTnVtYmVyKHNlbGYpOgotICAgIHJldHVybiBzZWxmLnJlYWRKU09OSW50ZWdlcigpCi0gIHJlYWRCeXRlID0gcmVhZE51bWJlcgotICByZWFkSTE2ID0gcmVhZE51bWJlcgotICByZWFkSTMyID0gcmVhZE51bWJlcgotICByZWFkSTY0ID0gcmVhZE51bWJlcgorICAgIGRlZiByZWFkTnVtYmVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgIHJlYWRCeXRlID0gcmVhZE51bWJlcgorICAgIHJlYWRJMTYgPSByZWFkTnVtYmVyCisgICAgcmVhZEkzMiA9IHJlYWROdW1iZXIKKyAgICByZWFkSTY0ID0gcmVhZE51bWJlcgogCi0gIGRlZiByZWFkRG91YmxlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLnJlYWRKU09ORG91YmxlKCkKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05Eb3VibGUoKQogCi0gIGRlZiByZWFkU3RyaW5nKHNlbGYpOgotICAgIHJldHVybiBzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKQorICAgIGRlZiByZWFkU3RyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSkKIAotICBkZWYgcmVhZEJpbmFyeShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5yZWFkSlNPTkJhc2U2NCgpCisgICAgZGVmIHJlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWRKU09OQmFzZTY0KCkKIAotICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgcmVxdWVzdF90eXBlLCBzZXFpZCk6Ci0gICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCi0gICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKLSAgICBzZWxmLndyaXRlSlNPTk51bWJlcihWRVJTSU9OKQotICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKG5hbWUpCi0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIocmVxdWVzdF90eXBlKQotICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHNlcWlkKQorICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCByZXF1ZXN0X3R5cGUsIHNlcWlkKToKKyAgICAgICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKFZFUlNJT04pCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKG5hbWUpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHJlcXVlc3RfdHlwZSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoc2VxaWQpCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKLSAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKyAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKIAotICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKLSAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RTdGFydCgpCiAKLSAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgotICAgIHNlbGYud3JpdGVKU09OT2JqZWN0RW5kKCkKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0RW5kKCkKIAotICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBpZCk6Ci0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaWQpCi0gICAgc2VsZi53cml0ZUpTT05PYmplY3RTdGFydCgpCi0gICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW3R0eXBlXSkKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBpZCk6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGlkKQorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW3R0eXBlXSkKIAotICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKLSAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0RW5kKCkKIAotICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKLSAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNba3R5cGVdKQotICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1t2dHlwZV0pCi0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoc2l6ZSkKLSAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKyAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNba3R5cGVdKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNbdnR5cGVdKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzaXplKQorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKIAotICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6Ci0gICAgc2VsZi53cml0ZUpTT05PYmplY3RFbmQoKQotICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQotICAgIAotICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCi0gICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW2V0eXBlXSkKLSAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzaXplKQotICAgIAotICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgotICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RFbmQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKIAotICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKLSAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNbZXR5cGVdKQotICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHNpemUpCi0gICAgCi0gIGRlZiB3cml0ZVNldEVuZChzZWxmKToKLSAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKyAgICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNbZXR5cGVdKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzaXplKQogCi0gIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbGVhbik6Ci0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoMSBpZiBib29sZWFuIGlzIFRydWUgZWxzZSAwKQorICAgIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQogCi0gIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgY2hlY2tJbnRlZ2VyTGltaXRzKGJ5dGUsIDgpCi0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoYnl0ZSkKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1tldHlwZV0pCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHNpemUpCiAKLSAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6Ci0gICAgY2hlY2tJbnRlZ2VyTGltaXRzKGkxNiwgMTYpCi0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTE2KQorICAgIGRlZiB3cml0ZVNldEVuZChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheUVuZCgpCiAKLSAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6Ci0gICAgY2hlY2tJbnRlZ2VyTGltaXRzKGkzMiwgMzIpCi0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTMyKQorICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKDEgaWYgYm9vbGVhbiBpcyBUcnVlIGVsc2UgMCkKIAotICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKLSAgICBjaGVja0ludGVnZXJMaW1pdHMoaTY0LCA2NCkKLSAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpNjQpCisgICAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGJ5dGUsIDgpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGJ5dGUpCiAKLSAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGRibCk6Ci0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoZGJsKQorICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTE2LCAxNikKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTE2KQogCi0gIGRlZiB3cml0ZVN0cmluZyhzZWxmLCBzdHJpbmcpOgotICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKHN0cmluZykKLSAgICAKLSAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIGJpbmFyeSk6Ci0gICAgc2VsZi53cml0ZUpTT05CYXNlNjQoYmluYXJ5KQorICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTMyLCAzMikKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTMyKQorCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpNjQsIDY0KQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpNjQpCisKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZGJsKToKKyAgICAgICAgIyAxNyBzaWduaWZpY2FudCBkaWdpdHMgc2hvdWxkIGJlIGp1c3QgZW5vdWdoIGZvciBhbnkgZG91YmxlIHByZWNpc2lvbgorICAgICAgICAjIHZhbHVlLgorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihkYmwsICd7MDouMTdnfScpCisKKyAgICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoc3RyaW5nKQorCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIGJpbmFyeSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQmFzZTY0KGJpbmFyeSkKIAogCi1jbGFzcyBUSlNPTlByb3RvY29sRmFjdG9yeToKK2NsYXNzIFRKU09OUHJvdG9jb2xGYWN0b3J5KFRQcm90b2NvbEZhY3RvcnkpOgorICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sKHRyYW5zKQogCi0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcmV0dXJuIFRKU09OUHJvdG9jb2wodHJhbnMpCisgICAgQHByb3BlcnR5CisgICAgZGVmIHN0cmluZ19sZW5ndGhfbGltaXQoc2VuZik6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY29udGFpbmVyX2xlbmd0aF9saW1pdChzZW5mKToKKyAgICAgICAgcmV0dXJuIE5vbmUKIAogCiBjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sKFRKU09OUHJvdG9jb2xCYXNlKToKICAgICAiIiJTaW1wbGUsIHJlYWRhYmxlLCB3cml0ZS1vbmx5IEpTT04gcHJvdG9jb2wuCi0gICAgCisKICAgICBVc2VmdWwgZm9yIGludGVyYWN0aW5nIHdpdGggc2NyaXB0aW5nIGxhbmd1YWdlcy4KICAgICAiIiIKIAogICAgIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKLSAgICAKKwogICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCi0gICAgCisKICAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKLSAgICAKKwogICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKLSAgICAKKwogICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCByZXF1ZXN0X3R5cGUsIHNlcWlkKToKICAgICAgICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCi0gICAgCisKICAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgogICAgICAgICBwYXNzCi0gICAgCisKICAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKICAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RTdGFydCgpCi0gICAgCisKICAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CiAgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0RW5kKCkKLSAgICAgIAorCiAgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgZmlkKToKICAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcobmFtZSkKLSAgICAKKwogICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgogICAgICAgICBwYXNzCi0gICAgCisKICAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgogICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKLSAgICAKKwogICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKICAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RFbmQoKQotICAgIAorCiAgICAgZGVmIF93cml0ZUNvbGxlY3Rpb25CZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CiAgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCi0gICAgCisKICAgICBkZWYgX3dyaXRlQ29sbGVjdGlvbkVuZChzZWxmKToKICAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheUVuZCgpCiAgICAgd3JpdGVMaXN0QmVnaW4gPSBfd3JpdGVDb2xsZWN0aW9uQmVnaW4KQEAgLTU0OSwyMSArNjU3LDIxIEBACiAgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CiAgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpNjQsIDY0KQogICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpNjQpCi0gICAgCisKICAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2xlYW4pOgogICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcigxIGlmIGJvb2xlYW4gaXMgVHJ1ZSBlbHNlIDApCiAKICAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZGJsKToKICAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoZGJsKQotICAgIAorCiAgICAgZGVmIHdyaXRlU3RyaW5nKHNlbGYsIHN0cmluZyk6CiAgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKHN0cmluZykKLSAgICAgIAorCiAgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIGJpbmFyeSk6CiAgICAgICAgIHNlbGYud3JpdGVKU09OQmFzZTY0KGJpbmFyeSkKIAogCi1jbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeShvYmplY3QpOgorY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoVFByb3RvY29sRmFjdG9yeSk6CiAKICAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgogICAgICAgICByZXR1cm4gVFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnB5CmluZGV4IGQyNWYzNjcuLjBmODM5MGYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weQpAQCAtMjIsMTggKzIyLDE4IEBACiAKIFNFUEFSQVRPUiA9ICI6IgogCi1jbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbChUUHJvdG9jb2xEZWNvcmF0b3IuVFByb3RvY29sRGVjb3JhdG9yKToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sLCBzZXJ2aWNlTmFtZSk6Ci0gICAgVFByb3RvY29sRGVjb3JhdG9yLlRQcm90b2NvbERlY29yYXRvci5fX2luaXRfXyhzZWxmLCBwcm90b2NvbCkKLSAgICBzZWxmLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWUKIAotICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgotICAgIGlmICh0eXBlID09IFRNZXNzYWdlVHlwZS5DQUxMIG9yCi0gICAgICAgIHR5cGUgPT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSk6Ci0gICAgICBzZWxmLnByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKAotICAgICAgICBzZWxmLnNlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbmFtZSwKLSAgICAgICAgdHlwZSwKLSAgICAgICAgc2VxaWQKLSAgICAgICkKLSAgICBlbHNlOgotICAgICAgc2VsZi5wcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKK2NsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbERlY29yYXRvci5UUHJvdG9jb2xEZWNvcmF0b3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCwgc2VydmljZU5hbWUpOgorICAgICAgICBzZWxmLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWUKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6CisgICAgICAgIGlmICh0eXBlID09IFRNZXNzYWdlVHlwZS5DQUxMIG9yCisgICAgICAgICAgICAgICAgdHlwZSA9PSBUTWVzc2FnZVR5cGUuT05FV0FZKToKKyAgICAgICAgICAgIHN1cGVyKFRNdWx0aXBsZXhlZFByb3RvY29sLCBzZWxmKS53cml0ZU1lc3NhZ2VCZWdpbigKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbmFtZSwKKyAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgIHNlcWlkCisgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdXBlcihUTXVsdGlwbGV4ZWRQcm90b2NvbCwgc2VsZikud3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnB5CmluZGV4IDMxMWE2MzUuLjM0NTZlOGYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnB5CisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnB5CkBAIC0xNywzOTAgKzE3LDM5MCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCAqCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24sIFRUeXBlLCBURnJvemVuRGljdAorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KK2Zyb20gLi5jb21wYXQgaW1wb3J0IGJpbmFyeV90b19zdHIsIHN0cl90b19iaW5hcnkKKworaW1wb3J0IHNpeAoraW1wb3J0IHN5cworZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlzbGljZQorZnJvbSBzaXgubW92ZXMgaW1wb3J0IHppcAogCiAKIGNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbihURXhjZXB0aW9uKToKLSAgIiIiQ3VzdG9tIFByb3RvY29sIEV4Y2VwdGlvbiBjbGFzcyIiIgorICAgICIiIkN1c3RvbSBQcm90b2NvbCBFeGNlcHRpb24gY2xhc3MiIiIKIAotICBVTktOT1dOID0gMAotICBJTlZBTElEX0RBVEEgPSAxCi0gIE5FR0FUSVZFX1NJWkUgPSAyCi0gIFNJWkVfTElNSVQgPSAzCi0gIEJBRF9WRVJTSU9OID0gNAotICBOT1RfSU1QTEVNRU5URUQgPSA1Ci0gIERFUFRIX0xJTUlUID0gNgorICAgIFVOS05PV04gPSAwCisgICAgSU5WQUxJRF9EQVRBID0gMQorICAgIE5FR0FUSVZFX1NJWkUgPSAyCisgICAgU0laRV9MSU1JVCA9IDMKKyAgICBCQURfVkVSU0lPTiA9IDQKKyAgICBOT1RfSU1QTEVNRU5URUQgPSA1CisgICAgREVQVEhfTElNSVQgPSA2CisgICAgSU5WQUxJRF9QUk9UT0NPTCA9IDcKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgotICAgIFRFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKLSAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCiAKIAotY2xhc3MgVFByb3RvY29sQmFzZToKLSAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKK2NsYXNzIFRQcm90b2NvbEJhc2Uob2JqZWN0KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBUaHJpZnQgcHJvdG9jb2wgZHJpdmVyLiIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucyk6Ci0gICAgc2VsZi50cmFucyA9IHRyYW5zCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zKToKKyAgICAgICAgc2VsZi50cmFucyA9IHRyYW5zCisgICAgICAgIHNlbGYuX2Zhc3RfZGVjb2RlID0gTm9uZQorICAgICAgICBzZWxmLl9mYXN0X2VuY29kZSA9IE5vbmUKIAotICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHR5cGUsIHNlcWlkKToKLSAgICBwYXNzCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfY2hlY2tfbGVuZ3RoKGxpbWl0LCBsZW5ndGgpOgorICAgICAgICBpZiBsZW5ndGggPCAwOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOZWdhdGl2ZSBsZW5ndGg6ICVkJyAlIGxlbmd0aCkKKyAgICAgICAgaWYgbGltaXQgaXMgbm90IE5vbmUgYW5kIGxlbmd0aCA+IGxpbWl0OgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMZW5ndGggZXhjZWVkZWQgbWF4IGFsbG93ZWQ6ICVkJyAlIGxpbWl0KQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgc2VxaWQpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgZmlkKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHR5cGUsIGZpZCk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVNldEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVNldEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sX3ZhbCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVNldEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbF92YWwpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyX3ZhbCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVN0cmluZyhzZWxmLCBzdHJfdmFsKToKKyAgICAgICAgc2VsZi53cml0ZUJpbmFyeShzdHJfdG9fYmluYXJ5KHN0cl92YWwpKQogCi0gIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIHN0cl92YWwpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlVXRmOChzZWxmLCBzdHJfdmFsKToKKyAgICAgICAgc2VsZi53cml0ZVN0cmluZyhzdHJfdmFsLmVuY29kZSgndXRmOCcpKQogCi0gIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRNYXBFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRTZXRCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFNldEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRMaXN0QmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEJvb2woc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTGlzdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQnl0ZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTZXRCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkSTE2KHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFNldEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkSTMyKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEk2NChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRCeXRlKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWREb3VibGUoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkSTE2KHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRTdHJpbmcoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkSTMyKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHNraXAoc2VsZiwgdHR5cGUpOgotICAgIGlmIHR0eXBlID09IFRUeXBlLlNUT1A6Ci0gICAgICByZXR1cm4KLSAgICBlbGlmIHR0eXBlID09IFRUeXBlLkJPT0w6Ci0gICAgICBzZWxmLnJlYWRCb29sKCkKLSAgICBlbGlmIHR0eXBlID09IFRUeXBlLkJZVEU6Ci0gICAgICBzZWxmLnJlYWRCeXRlKCkKLSAgICBlbGlmIHR0eXBlID09IFRUeXBlLkkxNjoKLSAgICAgIHNlbGYucmVhZEkxNigpCi0gICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5JMzI6Ci0gICAgICBzZWxmLnJlYWRJMzIoKQotICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuSTY0OgotICAgICAgc2VsZi5yZWFkSTY0KCkKLSAgICBlbGlmIHR0eXBlID09IFRUeXBlLkRPVUJMRToKLSAgICAgIHNlbGYucmVhZERvdWJsZSgpCi0gICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5TVFJJTkc6Ci0gICAgICBzZWxmLnJlYWRTdHJpbmcoKQotICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuU1RSVUNUOgotICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cnVjdEJlZ2luKCkKLSAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgIChuYW1lLCB0dHlwZSwgaWQpID0gc2VsZi5yZWFkRmllbGRCZWdpbigpCi0gICAgICAgIGlmIHR0eXBlID09IFRUeXBlLlNUT1A6Ci0gICAgICAgICAgYnJlYWsKLSAgICAgICAgc2VsZi5za2lwKHR0eXBlKQotICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCi0gICAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQotICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuTUFQOgotICAgICAgKGt0eXBlLCB2dHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRNYXBCZWdpbigpCi0gICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2l6ZSk6Ci0gICAgICAgIHNlbGYuc2tpcChrdHlwZSkKLSAgICAgICAgc2VsZi5za2lwKHZ0eXBlKQotICAgICAgc2VsZi5yZWFkTWFwRW5kKCkKLSAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNFVDoKLSAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRTZXRCZWdpbigpCi0gICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2l6ZSk6Ci0gICAgICAgIHNlbGYuc2tpcChldHlwZSkKLSAgICAgIHNlbGYucmVhZFNldEVuZCgpCi0gICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5MSVNUOgotICAgICAgKGV0eXBlLCBzaXplKSA9IHNlbGYucmVhZExpc3RCZWdpbigpCi0gICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2l6ZSk6Ci0gICAgICAgIHNlbGYuc2tpcChldHlwZSkKLSAgICAgIHNlbGYucmVhZExpc3RFbmQoKQorICAgIGRlZiByZWFkSTY0KHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgIyB0dXBsZSBvZjogKCAncmVhZGVyIG1ldGhvZCcgbmFtZSwgaXNfY29udGFpbmVyIGJvb2wsICd3cml0ZXJfbWV0aG9kJyBuYW1lICkKLSAgX1RUWVBFX0hBTkRMRVJTID0gKAotICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDAgVFR5cGUuU1RPUAotICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDEgVFR5cGUuVk9JRCAjIFRPRE86IGhhbmRsZSB2b2lkPwotICAgICAgICgncmVhZEJvb2wnLCAnd3JpdGVCb29sJywgRmFsc2UpLCAgIyAyIFRUeXBlLkJPT0wKLSAgICAgICAoJ3JlYWRCeXRlJywgICd3cml0ZUJ5dGUnLCBGYWxzZSksICAjIDMgVFR5cGUuQllURSBhbmQgSTA4Ci0gICAgICAgKCdyZWFkRG91YmxlJywgJ3dyaXRlRG91YmxlJywgRmFsc2UpLCAgIyA0IFRUeXBlLkRPVUJMRQotICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDUgdW5kZWZpbmVkCi0gICAgICAgKCdyZWFkSTE2JywgJ3dyaXRlSTE2JywgRmFsc2UpLCAgIyA2IFRUeXBlLkkxNgotICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDcgdW5kZWZpbmVkCi0gICAgICAgKCdyZWFkSTMyJywgJ3dyaXRlSTMyJywgRmFsc2UpLCAgIyA4IFRUeXBlLkkzMgotICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDkgdW5kZWZpbmVkCi0gICAgICAgKCdyZWFkSTY0JywgJ3dyaXRlSTY0JywgRmFsc2UpLCAgIyAxMCBUVHlwZS5JNjQKLSAgICAgICAoJ3JlYWRTdHJpbmcnLCAnd3JpdGVTdHJpbmcnLCBGYWxzZSksICAjIDExIFRUeXBlLlNUUklORyBhbmQgVVRGNwotICAgICAgICgncmVhZENvbnRhaW5lclN0cnVjdCcsICd3cml0ZUNvbnRhaW5lclN0cnVjdCcsIFRydWUpLCAgIyAxMiAqLlNUUlVDVAotICAgICAgICgncmVhZENvbnRhaW5lck1hcCcsICd3cml0ZUNvbnRhaW5lck1hcCcsIFRydWUpLCAgIyAxMyBUVHlwZS5NQVAKLSAgICAgICAoJ3JlYWRDb250YWluZXJTZXQnLCAnd3JpdGVDb250YWluZXJTZXQnLCBUcnVlKSwgICMgMTQgVFR5cGUuU0VUCi0gICAgICAgKCdyZWFkQ29udGFpbmVyTGlzdCcsICd3cml0ZUNvbnRhaW5lckxpc3QnLCBUcnVlKSwgICMgMTUgVFR5cGUuTElTVAotICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDE2IFRUeXBlLlVURjggIyBUT0RPOiBoYW5kbGUgdXRmOCB0eXBlcz8KLSAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpICAjIDE3IFRUeXBlLlVURjE2ICMgVE9ETzogaGFuZGxlIHV0ZjE2IHR5cGVzPwotICAgICAgKQorICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEJ5VFR5cGUoc2VsZiwgdHR5cGUsIHNwZWMpOgotICAgIHRyeToKLSAgICAgIChyX2hhbmRsZXIsIHdfaGFuZGxlciwgaXNfY29udGFpbmVyKSA9IHNlbGYuX1RUWVBFX0hBTkRMRVJTW3R0eXBlXQotICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdJbnZhbGlkIGZpZWxkIHR5cGUgJWQnICUgKHR0eXBlKSkKLSAgICBpZiByX2hhbmRsZXIgaXMgTm9uZToKLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nSW52YWxpZCBmaWVsZCB0eXBlICVkJyAlICh0dHlwZSkpCi0gICAgcmVhZGVyID0gZ2V0YXR0cihzZWxmLCByX2hhbmRsZXIpCi0gICAgaWYgbm90IGlzX2NvbnRhaW5lcjoKLSAgICAgIHJldHVybiByZWFkZXIoKQotICAgIHJldHVybiByZWFkZXIoc3BlYykKKyAgICBkZWYgcmVhZFN0cmluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGJpbmFyeV90b19zdHIoc2VsZi5yZWFkQmluYXJ5KCkpCiAKLSAgZGVmIHJlYWRDb250YWluZXJMaXN0KHNlbGYsIHNwZWMpOgotICAgIHJlc3VsdHMgPSBbXQotICAgIHR0eXBlLCB0c3BlYyA9IHNwZWNbMF0sIHNwZWNbMV0KLSAgICByX2hhbmRsZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1t0dHlwZV1bMF0KLSAgICByZWFkZXIgPSBnZXRhdHRyKHNlbGYsIHJfaGFuZGxlcikKLSAgICAobGlzdF90eXBlLCBsaXN0X2xlbikgPSBzZWxmLnJlYWRMaXN0QmVnaW4oKQotICAgIGlmIHRzcGVjIGlzIE5vbmU6Ci0gICAgICAjIGxpc3QgdmFsdWVzIGFyZSBzaW1wbGUgdHlwZXMKLSAgICAgIGZvciBpZHggaW4geHJhbmdlKGxpc3RfbGVuKToKLSAgICAgICAgcmVzdWx0cy5hcHBlbmQocmVhZGVyKCkpCi0gICAgZWxzZToKLSAgICAgICMgdGhpcyBpcyBsaWtlIGFuIGlubGluZWQgcmVhZEZpZWxkQnlUVHlwZQotICAgICAgY29udGFpbmVyX3JlYWRlciA9IHNlbGYuX1RUWVBFX0hBTkRMRVJTW2xpc3RfdHlwZV1bMF0KLSAgICAgIHZhbF9yZWFkZXIgPSBnZXRhdHRyKHNlbGYsIGNvbnRhaW5lcl9yZWFkZXIpCi0gICAgICBmb3IgaWR4IGluIHhyYW5nZShsaXN0X2xlbik6Ci0gICAgICAgIHZhbCA9IHZhbF9yZWFkZXIodHNwZWMpCi0gICAgICAgIHJlc3VsdHMuYXBwZW5kKHZhbCkKLSAgICBzZWxmLnJlYWRMaXN0RW5kKCkKLSAgICByZXR1cm4gcmVzdWx0cworICAgIGRlZiByZWFkQmluYXJ5KHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRDb250YWluZXJTZXQoc2VsZiwgc3BlYyk6Ci0gICAgcmVzdWx0cyA9IHNldCgpCi0gICAgdHR5cGUsIHRzcGVjID0gc3BlY1swXSwgc3BlY1sxXQotICAgIHJfaGFuZGxlciA9IHNlbGYuX1RUWVBFX0hBTkRMRVJTW3R0eXBlXVswXQotICAgIHJlYWRlciA9IGdldGF0dHIoc2VsZiwgcl9oYW5kbGVyKQotICAgIChzZXRfdHlwZSwgc2V0X2xlbikgPSBzZWxmLnJlYWRTZXRCZWdpbigpCi0gICAgaWYgdHNwZWMgaXMgTm9uZToKLSAgICAgICMgc2V0IG1lbWJlcnMgYXJlIHNpbXBsZSB0eXBlcwotICAgICAgZm9yIGlkeCBpbiB4cmFuZ2Uoc2V0X2xlbik6Ci0gICAgICAgIHJlc3VsdHMuYWRkKHJlYWRlcigpKQotICAgIGVsc2U6Ci0gICAgICBjb250YWluZXJfcmVhZGVyID0gc2VsZi5fVFRZUEVfSEFORExFUlNbc2V0X3R5cGVdWzBdCi0gICAgICB2YWxfcmVhZGVyID0gZ2V0YXR0cihzZWxmLCBjb250YWluZXJfcmVhZGVyKQotICAgICAgZm9yIGlkeCBpbiB4cmFuZ2Uoc2V0X2xlbik6Ci0gICAgICAgIHJlc3VsdHMuYWRkKHZhbF9yZWFkZXIodHNwZWMpKQotICAgIHNlbGYucmVhZFNldEVuZCgpCi0gICAgcmV0dXJuIHJlc3VsdHMKKyAgICBkZWYgcmVhZFV0Zjgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0ZjgnKQogCi0gIGRlZiByZWFkQ29udGFpbmVyU3RydWN0KHNlbGYsIHNwZWMpOgotICAgIChvYmpfY2xhc3MsIG9ial9zcGVjKSA9IHNwZWMKLSAgICBvYmogPSBvYmpfY2xhc3MoKQotICAgIG9iai5yZWFkKHNlbGYpCi0gICAgcmV0dXJuIG9iagotCi0gIGRlZiByZWFkQ29udGFpbmVyTWFwKHNlbGYsIHNwZWMpOgotICAgIHJlc3VsdHMgPSBkaWN0KCkKLSAgICBrZXlfdHR5cGUsIGtleV9zcGVjID0gc3BlY1swXSwgc3BlY1sxXQotICAgIHZhbF90dHlwZSwgdmFsX3NwZWMgPSBzcGVjWzJdLCBzcGVjWzNdCi0gICAgKG1hcF9rdHlwZSwgbWFwX3Z0eXBlLCBtYXBfbGVuKSA9IHNlbGYucmVhZE1hcEJlZ2luKCkKLSAgICAjIFRPRE86IGNvbXBhcmUgdHlwZXMgd2UganVzdCBkZWNvZGVkIHdpdGggdGhyaWZ0X3NwZWMgYW5kCi0gICAgIyBhYm9ydC9za2lwIGlmIHR5cGVzIGRpc2FncmVlCi0gICAga2V5X3JlYWRlciA9IGdldGF0dHIoc2VsZiwgc2VsZi5fVFRZUEVfSEFORExFUlNba2V5X3R0eXBlXVswXSkKLSAgICB2YWxfcmVhZGVyID0gZ2V0YXR0cihzZWxmLCBzZWxmLl9UVFlQRV9IQU5ETEVSU1t2YWxfdHR5cGVdWzBdKQotICAgICMgbGlzdCB2YWx1ZXMgYXJlIHNpbXBsZSB0eXBlcwotICAgIGZvciBpZHggaW4geHJhbmdlKG1hcF9sZW4pOgotICAgICAgaWYga2V5X3NwZWMgaXMgTm9uZToKLSAgICAgICAga192YWwgPSBrZXlfcmVhZGVyKCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGtfdmFsID0gc2VsZi5yZWFkRmllbGRCeVRUeXBlKGtleV90dHlwZSwga2V5X3NwZWMpCi0gICAgICBpZiB2YWxfc3BlYyBpcyBOb25lOgotICAgICAgICB2X3ZhbCA9IHZhbF9yZWFkZXIoKQotICAgICAgZWxzZToKLSAgICAgICAgdl92YWwgPSBzZWxmLnJlYWRGaWVsZEJ5VFR5cGUodmFsX3R0eXBlLCB2YWxfc3BlYykKLSAgICAgICMgdGhpcyByYWlzZXMgYSBUeXBlRXJyb3Igd2l0aCB1bmhhc2hhYmxlIGtleXMgdHlwZXMKLSAgICAgICMgaS5lLiB0aGlzIGZhaWxzOiBkPWRpY3QoKTsgZFtbMCwxXV0gPSAyCi0gICAgICByZXN1bHRzW2tfdmFsXSA9IHZfdmFsCi0gICAgc2VsZi5yZWFkTWFwRW5kKCkKLSAgICByZXR1cm4gcmVzdWx0cwotCi0gIGRlZiByZWFkU3RydWN0KHNlbGYsIG9iaiwgdGhyaWZ0X3NwZWMpOgotICAgIHNlbGYucmVhZFN0cnVjdEJlZ2luKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IHNlbGYucmVhZEZpZWxkQmVnaW4oKQotICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKLSAgICAgICAgYnJlYWsKLSAgICAgIHRyeToKLSAgICAgICAgZmllbGQgPSB0aHJpZnRfc3BlY1tmaWRdCi0gICAgICBleGNlcHQgSW5kZXhFcnJvcjoKLSAgICAgICAgc2VsZi5za2lwKGZ0eXBlKQotICAgICAgZWxzZToKLSAgICAgICAgaWYgZmllbGQgaXMgbm90IE5vbmUgYW5kIGZ0eXBlID09IGZpZWxkWzFdOgotICAgICAgICAgIGZuYW1lID0gZmllbGRbMl0KLSAgICAgICAgICBmc3BlYyA9IGZpZWxkWzNdCi0gICAgICAgICAgdmFsID0gc2VsZi5yZWFkRmllbGRCeVRUeXBlKGZ0eXBlLCBmc3BlYykKLSAgICAgICAgICBzZXRhdHRyKG9iaiwgZm5hbWUsIHZhbCkKKyAgICBkZWYgc2tpcChzZWxmLCB0dHlwZSk6CisgICAgICAgIGlmIHR0eXBlID09IFRUeXBlLkJPT0w6CisgICAgICAgICAgICBzZWxmLnJlYWRCb29sKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5CWVRFOgorICAgICAgICAgICAgc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuSTE2OgorICAgICAgICAgICAgc2VsZi5yZWFkSTE2KCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgICBzZWxmLnJlYWRJMzIoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkk2NDoKKyAgICAgICAgICAgIHNlbGYucmVhZEk2NCgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuRE9VQkxFOgorICAgICAgICAgICAgc2VsZi5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgICBzZWxmLnJlYWRTdHJpbmcoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIChuYW1lLCB0dHlwZSwgaWQpID0gc2VsZi5yZWFkRmllbGRCZWdpbigpCisgICAgICAgICAgICAgICAgaWYgdHR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBzZWxmLnNraXAodHR5cGUpCisgICAgICAgICAgICAgICAgc2VsZi5yZWFkRmllbGRFbmQoKQorICAgICAgICAgICAgc2VsZi5yZWFkU3RydWN0RW5kKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5NQVA6CisgICAgICAgICAgICAoa3R5cGUsIHZ0eXBlLCBzaXplKSA9IHNlbGYucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcChrdHlwZSkKKyAgICAgICAgICAgICAgICBzZWxmLnNraXAodnR5cGUpCisgICAgICAgICAgICBzZWxmLnJlYWRNYXBFbmQoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNFVDoKKyAgICAgICAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRTZXRCZWdpbigpCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzaXplKToKKyAgICAgICAgICAgICAgICBzZWxmLnNraXAoZXR5cGUpCisgICAgICAgICAgICBzZWxmLnJlYWRTZXRFbmQoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkxJU1Q6CisgICAgICAgICAgICAoZXR5cGUsIHNpemUpID0gc2VsZi5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcChldHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZExpc3RFbmQoKQogICAgICAgICBlbHNlOgotICAgICAgICAgIHNlbGYuc2tpcChmdHlwZSkKLSAgICAgIHNlbGYucmVhZEZpZWxkRW5kKCkKLSAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgImludmFsaWQgVFR5cGUiKQogCi0gIGRlZiB3cml0ZUNvbnRhaW5lclN0cnVjdChzZWxmLCB2YWwsIHNwZWMpOgotICAgIHZhbC53cml0ZShzZWxmKQorICAgICMgdHVwbGUgb2Y6ICggJ3JlYWRlciBtZXRob2QnIG5hbWUsIGlzX2NvbnRhaW5lciBib29sLCAnd3JpdGVyX21ldGhvZCcgbmFtZSApCisgICAgX1RUWVBFX0hBTkRMRVJTID0gKAorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyAwIFRUeXBlLlNUT1AKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgMSBUVHlwZS5WT0lEICMgVE9ETzogaGFuZGxlIHZvaWQ/CisgICAgICAgICgncmVhZEJvb2wnLCAnd3JpdGVCb29sJywgRmFsc2UpLCAgIyAyIFRUeXBlLkJPT0wKKyAgICAgICAgKCdyZWFkQnl0ZScsICd3cml0ZUJ5dGUnLCBGYWxzZSksICAjIDMgVFR5cGUuQllURSBhbmQgSTA4CisgICAgICAgICgncmVhZERvdWJsZScsICd3cml0ZURvdWJsZScsIEZhbHNlKSwgICMgNCBUVHlwZS5ET1VCTEUKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgNSB1bmRlZmluZWQKKyAgICAgICAgKCdyZWFkSTE2JywgJ3dyaXRlSTE2JywgRmFsc2UpLCAgIyA2IFRUeXBlLkkxNgorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyA3IHVuZGVmaW5lZAorICAgICAgICAoJ3JlYWRJMzInLCAnd3JpdGVJMzInLCBGYWxzZSksICAjIDggVFR5cGUuSTMyCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDkgdW5kZWZpbmVkCisgICAgICAgICgncmVhZEk2NCcsICd3cml0ZUk2NCcsIEZhbHNlKSwgICMgMTAgVFR5cGUuSTY0CisgICAgICAgICgncmVhZFN0cmluZycsICd3cml0ZVN0cmluZycsIEZhbHNlKSwgICMgMTEgVFR5cGUuU1RSSU5HIGFuZCBVVEY3CisgICAgICAgICgncmVhZENvbnRhaW5lclN0cnVjdCcsICd3cml0ZUNvbnRhaW5lclN0cnVjdCcsIFRydWUpLCAgIyAxMiAqLlNUUlVDVAorICAgICAgICAoJ3JlYWRDb250YWluZXJNYXAnLCAnd3JpdGVDb250YWluZXJNYXAnLCBUcnVlKSwgICMgMTMgVFR5cGUuTUFQCisgICAgICAgICgncmVhZENvbnRhaW5lclNldCcsICd3cml0ZUNvbnRhaW5lclNldCcsIFRydWUpLCAgIyAxNCBUVHlwZS5TRVQKKyAgICAgICAgKCdyZWFkQ29udGFpbmVyTGlzdCcsICd3cml0ZUNvbnRhaW5lckxpc3QnLCBUcnVlKSwgICMgMTUgVFR5cGUuTElTVAorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyAxNiBUVHlwZS5VVEY4ICMgVE9ETzogaGFuZGxlIHV0ZjggdHlwZXM/CisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSkgICMgMTcgVFR5cGUuVVRGMTYgIyBUT0RPOiBoYW5kbGUgdXRmMTYgdHlwZXM/CisgICAgKQogCi0gIGRlZiB3cml0ZUNvbnRhaW5lckxpc3Qoc2VsZiwgdmFsLCBzcGVjKToKLSAgICBzZWxmLndyaXRlTGlzdEJlZ2luKHNwZWNbMF0sIGxlbih2YWwpKQotICAgIHJfaGFuZGxlciwgd19oYW5kbGVyLCBpc19jb250YWluZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1tzcGVjWzBdXQotICAgIGVfd3JpdGVyID0gZ2V0YXR0cihzZWxmLCB3X2hhbmRsZXIpCi0gICAgaWYgbm90IGlzX2NvbnRhaW5lcjoKLSAgICAgIGZvciBlbGVtIGluIHZhbDoKLSAgICAgICAgZV93cml0ZXIoZWxlbSkKLSAgICBlbHNlOgotICAgICAgZm9yIGVsZW0gaW4gdmFsOgotICAgICAgICBlX3dyaXRlcihlbGVtLCBzcGVjWzFdKQotICAgIHNlbGYud3JpdGVMaXN0RW5kKCkKKyAgICBkZWYgX3R0eXBlX2hhbmRsZXJzKHNlbGYsIHR0eXBlLCBzcGVjKToKKyAgICAgICAgaWYgc3BlYyA9PSAnQklOQVJZJzoKKyAgICAgICAgICAgIGlmIHR0eXBlICE9IFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdJbnZhbGlkIGJpbmFyeSBmaWVsZCB0eXBlICVkJyAlIHR0eXBlKQorICAgICAgICAgICAgcmV0dXJuICgncmVhZEJpbmFyeScsICd3cml0ZUJpbmFyeScsIEZhbHNlKQorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgYW5kIHNwZWMgPT0gJ1VURjgnOgorICAgICAgICAgICAgaWYgdHR5cGUgIT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0ludmFsaWQgc3RyaW5nIGZpZWxkIHR5cGUgJWQnICUgdHR5cGUpCisgICAgICAgICAgICByZXR1cm4gKCdyZWFkVXRmOCcsICd3cml0ZVV0ZjgnLCBGYWxzZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX1RUWVBFX0hBTkRMRVJTW3R0eXBlXSBpZiB0dHlwZSA8IGxlbihzZWxmLl9UVFlQRV9IQU5ETEVSUykgZWxzZSAoTm9uZSwgTm9uZSwgRmFsc2UpCiAKLSAgZGVmIHdyaXRlQ29udGFpbmVyU2V0KHNlbGYsIHZhbCwgc3BlYyk6Ci0gICAgc2VsZi53cml0ZVNldEJlZ2luKHNwZWNbMF0sIGxlbih2YWwpKQotICAgIHJfaGFuZGxlciwgd19oYW5kbGVyLCBpc19jb250YWluZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1tzcGVjWzBdXQotICAgIGVfd3JpdGVyID0gZ2V0YXR0cihzZWxmLCB3X2hhbmRsZXIpCi0gICAgaWYgbm90IGlzX2NvbnRhaW5lcjoKLSAgICAgIGZvciBlbGVtIGluIHZhbDoKLSAgICAgICAgZV93cml0ZXIoZWxlbSkKLSAgICBlbHNlOgotICAgICAgZm9yIGVsZW0gaW4gdmFsOgotICAgICAgICBlX3dyaXRlcihlbGVtLCBzcGVjWzFdKQotICAgIHNlbGYud3JpdGVTZXRFbmQoKQorICAgIGRlZiBfcmVhZF9ieV90dHlwZShzZWxmLCB0dHlwZSwgc3BlYywgZXNwZWMpOgorICAgICAgICByZWFkZXJfbmFtZSwgXywgaXNfY29udGFpbmVyID0gc2VsZi5fdHR5cGVfaGFuZGxlcnModHR5cGUsIGVzcGVjKQorICAgICAgICBpZiByZWFkZXJfbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdJbnZhbGlkIHR5cGUgJWQnICUgKHR0eXBlKSkKKyAgICAgICAgcmVhZGVyX2Z1bmMgPSBnZXRhdHRyKHNlbGYsIHJlYWRlcl9uYW1lKQorICAgICAgICByZWFkID0gKGxhbWJkYTogcmVhZGVyX2Z1bmMoZXNwZWMpKSBpZiBpc19jb250YWluZXIgZWxzZSByZWFkZXJfZnVuYworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgeWllbGQgcmVhZCgpCiAKLSAgZGVmIHdyaXRlQ29udGFpbmVyTWFwKHNlbGYsIHZhbCwgc3BlYyk6Ci0gICAga190eXBlID0gc3BlY1swXQotICAgIHZfdHlwZSA9IHNwZWNbMl0KLSAgICBpZ25vcmUsIGt0eXBlX25hbWUsIGtfaXNfY29udGFpbmVyID0gc2VsZi5fVFRZUEVfSEFORExFUlNba190eXBlXQotICAgIGlnbm9yZSwgdnR5cGVfbmFtZSwgdl9pc19jb250YWluZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1t2X3R5cGVdCi0gICAga193cml0ZXIgPSBnZXRhdHRyKHNlbGYsIGt0eXBlX25hbWUpCi0gICAgdl93cml0ZXIgPSBnZXRhdHRyKHNlbGYsIHZ0eXBlX25hbWUpCi0gICAgc2VsZi53cml0ZU1hcEJlZ2luKGtfdHlwZSwgdl90eXBlLCBsZW4odmFsKSkKLSAgICBmb3IgbV9rZXksIG1fdmFsIGluIHZhbC5pdGVyaXRlbXMoKToKLSAgICAgIGlmIG5vdCBrX2lzX2NvbnRhaW5lcjoKLSAgICAgICAga193cml0ZXIobV9rZXkpCi0gICAgICBlbHNlOgotICAgICAgICBrX3dyaXRlcihtX2tleSwgc3BlY1sxXSkKLSAgICAgIGlmIG5vdCB2X2lzX2NvbnRhaW5lcjoKLSAgICAgICAgdl93cml0ZXIobV92YWwpCi0gICAgICBlbHNlOgotICAgICAgICB2X3dyaXRlcihtX3ZhbCwgc3BlY1szXSkKLSAgICBzZWxmLndyaXRlTWFwRW5kKCkKKyAgICBkZWYgcmVhZEZpZWxkQnlUVHlwZShzZWxmLCB0dHlwZSwgc3BlYyk6CisgICAgICAgIHJldHVybiBuZXh0KHNlbGYuX3JlYWRfYnlfdHR5cGUodHR5cGUsIHNwZWMsIHNwZWMpKQogCi0gIGRlZiB3cml0ZVN0cnVjdChzZWxmLCBvYmosIHRocmlmdF9zcGVjKToKLSAgICBzZWxmLndyaXRlU3RydWN0QmVnaW4ob2JqLl9fY2xhc3NfXy5fX25hbWVfXykKLSAgICBmb3IgZmllbGQgaW4gdGhyaWZ0X3NwZWM6Ci0gICAgICBpZiBmaWVsZCBpcyBOb25lOgotICAgICAgICBjb250aW51ZQotICAgICAgZm5hbWUgPSBmaWVsZFsyXQotICAgICAgdmFsID0gZ2V0YXR0cihvYmosIGZuYW1lKQotICAgICAgaWYgdmFsIGlzIE5vbmU6Ci0gICAgICAgICMgc2tpcCB3cml0aW5nIG91dCB1bnNldCBmaWVsZHMKLSAgICAgICAgY29udGludWUKLSAgICAgIGZpZCA9IGZpZWxkWzBdCi0gICAgICBmdHlwZSA9IGZpZWxkWzFdCi0gICAgICBmc3BlYyA9IGZpZWxkWzNdCi0gICAgICAjIGdldCB0aGUgd3JpdGVyIG1ldGhvZCBmb3IgdGhpcyB2YWx1ZQotICAgICAgc2VsZi53cml0ZUZpZWxkQmVnaW4oZm5hbWUsIGZ0eXBlLCBmaWQpCi0gICAgICBzZWxmLndyaXRlRmllbGRCeVRUeXBlKGZ0eXBlLCB2YWwsIGZzcGVjKQotICAgICAgc2VsZi53cml0ZUZpZWxkRW5kKCkKLSAgICBzZWxmLndyaXRlRmllbGRTdG9wKCkKLSAgICBzZWxmLndyaXRlU3RydWN0RW5kKCkKKyAgICBkZWYgcmVhZENvbnRhaW5lckxpc3Qoc2VsZiwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgaXNfaW1tdXRhYmxlID0gc3BlYworICAgICAgICAobGlzdF90eXBlLCBsaXN0X2xlbikgPSBzZWxmLnJlYWRMaXN0QmVnaW4oKQorICAgICAgICAjIFRPRE86IGNvbXBhcmUgdHlwZXMgd2UganVzdCBkZWNvZGVkIHdpdGggdGhyaWZ0X3NwZWMKKyAgICAgICAgZWxlbXMgPSBpc2xpY2Uoc2VsZi5fcmVhZF9ieV90dHlwZSh0dHlwZSwgc3BlYywgdHNwZWMpLCBsaXN0X2xlbikKKyAgICAgICAgcmVzdWx0cyA9ICh0dXBsZSBpZiBpc19pbW11dGFibGUgZWxzZSBsaXN0KShlbGVtcykKKyAgICAgICAgc2VsZi5yZWFkTGlzdEVuZCgpCisgICAgICAgIHJldHVybiByZXN1bHRzCiAKLSAgZGVmIHdyaXRlRmllbGRCeVRUeXBlKHNlbGYsIHR0eXBlLCB2YWwsIHNwZWMpOgotICAgIHJfaGFuZGxlciwgd19oYW5kbGVyLCBpc19jb250YWluZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1t0dHlwZV0KLSAgICB3cml0ZXIgPSBnZXRhdHRyKHNlbGYsIHdfaGFuZGxlcikKLSAgICBpZiBpc19jb250YWluZXI6Ci0gICAgICB3cml0ZXIodmFsLCBzcGVjKQotICAgIGVsc2U6Ci0gICAgICB3cml0ZXIodmFsKQorICAgIGRlZiByZWFkQ29udGFpbmVyU2V0KHNlbGYsIHNwZWMpOgorICAgICAgICB0dHlwZSwgdHNwZWMsIGlzX2ltbXV0YWJsZSA9IHNwZWMKKyAgICAgICAgKHNldF90eXBlLCBzZXRfbGVuKSA9IHNlbGYucmVhZFNldEJlZ2luKCkKKyAgICAgICAgIyBUT0RPOiBjb21wYXJlIHR5cGVzIHdlIGp1c3QgZGVjb2RlZCB3aXRoIHRocmlmdF9zcGVjCisgICAgICAgIGVsZW1zID0gaXNsaWNlKHNlbGYuX3JlYWRfYnlfdHR5cGUodHR5cGUsIHNwZWMsIHRzcGVjKSwgc2V0X2xlbikKKyAgICAgICAgcmVzdWx0cyA9IChmcm96ZW5zZXQgaWYgaXNfaW1tdXRhYmxlIGVsc2Ugc2V0KShlbGVtcykKKyAgICAgICAgc2VsZi5yZWFkU2V0RW5kKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMKKworICAgIGRlZiByZWFkQ29udGFpbmVyU3RydWN0KHNlbGYsIHNwZWMpOgorICAgICAgICAob2JqX2NsYXNzLCBvYmpfc3BlYykgPSBzcGVjCisgICAgICAgIG9iaiA9IG9ial9jbGFzcygpCisgICAgICAgIG9iai5yZWFkKHNlbGYpCisgICAgICAgIHJldHVybiBvYmoKKworICAgIGRlZiByZWFkQ29udGFpbmVyTWFwKHNlbGYsIHNwZWMpOgorICAgICAgICBrdHlwZSwga3NwZWMsIHZ0eXBlLCB2c3BlYywgaXNfaW1tdXRhYmxlID0gc3BlYworICAgICAgICAobWFwX2t0eXBlLCBtYXBfdnR5cGUsIG1hcF9sZW4pID0gc2VsZi5yZWFkTWFwQmVnaW4oKQorICAgICAgICAjIFRPRE86IGNvbXBhcmUgdHlwZXMgd2UganVzdCBkZWNvZGVkIHdpdGggdGhyaWZ0X3NwZWMgYW5kCisgICAgICAgICMgYWJvcnQvc2tpcCBpZiB0eXBlcyBkaXNhZ3JlZQorICAgICAgICBrZXlzID0gc2VsZi5fcmVhZF9ieV90dHlwZShrdHlwZSwgc3BlYywga3NwZWMpCisgICAgICAgIHZhbHMgPSBzZWxmLl9yZWFkX2J5X3R0eXBlKHZ0eXBlLCBzcGVjLCB2c3BlYykKKyAgICAgICAga2V5dmFscyA9IGlzbGljZSh6aXAoa2V5cywgdmFscyksIG1hcF9sZW4pCisgICAgICAgIHJlc3VsdHMgPSAoVEZyb3plbkRpY3QgaWYgaXNfaW1tdXRhYmxlIGVsc2UgZGljdCkoa2V5dmFscykKKyAgICAgICAgc2VsZi5yZWFkTWFwRW5kKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMKKworICAgIGRlZiByZWFkU3RydWN0KHNlbGYsIG9iaiwgdGhyaWZ0X3NwZWMsIGlzX2ltbXV0YWJsZT1GYWxzZSk6CisgICAgICAgIGlmIGlzX2ltbXV0YWJsZToKKyAgICAgICAgICAgIGZpZWxkcyA9IHt9CisgICAgICAgIHNlbGYucmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBzZWxmLnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmaWVsZCA9IHRocmlmdF9zcGVjW2ZpZF0KKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcChmdHlwZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgZmllbGQgaXMgbm90IE5vbmUgYW5kIGZ0eXBlID09IGZpZWxkWzFdOgorICAgICAgICAgICAgICAgICAgICBmbmFtZSA9IGZpZWxkWzJdCisgICAgICAgICAgICAgICAgICAgIGZzcGVjID0gZmllbGRbM10KKyAgICAgICAgICAgICAgICAgICAgdmFsID0gc2VsZi5yZWFkRmllbGRCeVRUeXBlKGZ0eXBlLCBmc3BlYykKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNfaW1tdXRhYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzW2ZuYW1lXSA9IHZhbAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihvYmosIGZuYW1lLCB2YWwpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwKGZ0eXBlKQorICAgICAgICAgICAgc2VsZi5yZWFkRmllbGRFbmQoKQorICAgICAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICBpZiBpc19pbW11dGFibGU6CisgICAgICAgICAgICByZXR1cm4gb2JqKCoqZmllbGRzKQorCisgICAgZGVmIHdyaXRlQ29udGFpbmVyU3RydWN0KHNlbGYsIHZhbCwgc3BlYyk6CisgICAgICAgIHZhbC53cml0ZShzZWxmKQorCisgICAgZGVmIHdyaXRlQ29udGFpbmVyTGlzdChzZWxmLCB2YWwsIHNwZWMpOgorICAgICAgICB0dHlwZSwgdHNwZWMsIF8gPSBzcGVjCisgICAgICAgIHNlbGYud3JpdGVMaXN0QmVnaW4odHR5cGUsIGxlbih2YWwpKQorICAgICAgICBmb3IgXyBpbiBzZWxmLl93cml0ZV9ieV90dHlwZSh0dHlwZSwgdmFsLCBzcGVjLCB0c3BlYyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYud3JpdGVMaXN0RW5kKCkKKworICAgIGRlZiB3cml0ZUNvbnRhaW5lclNldChzZWxmLCB2YWwsIHNwZWMpOgorICAgICAgICB0dHlwZSwgdHNwZWMsIF8gPSBzcGVjCisgICAgICAgIHNlbGYud3JpdGVTZXRCZWdpbih0dHlwZSwgbGVuKHZhbCkpCisgICAgICAgIGZvciBfIGluIHNlbGYuX3dyaXRlX2J5X3R0eXBlKHR0eXBlLCB2YWwsIHNwZWMsIHRzcGVjKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi53cml0ZVNldEVuZCgpCisKKyAgICBkZWYgd3JpdGVDb250YWluZXJNYXAoc2VsZiwgdmFsLCBzcGVjKToKKyAgICAgICAga3R5cGUsIGtzcGVjLCB2dHlwZSwgdnNwZWMsIF8gPSBzcGVjCisgICAgICAgIHNlbGYud3JpdGVNYXBCZWdpbihrdHlwZSwgdnR5cGUsIGxlbih2YWwpKQorICAgICAgICBmb3IgXyBpbiB6aXAoc2VsZi5fd3JpdGVfYnlfdHR5cGUoa3R5cGUsIHNpeC5pdGVya2V5cyh2YWwpLCBzcGVjLCBrc3BlYyksCisgICAgICAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9ieV90dHlwZSh2dHlwZSwgc2l4Lml0ZXJ2YWx1ZXModmFsKSwgc3BlYywgdnNwZWMpKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi53cml0ZU1hcEVuZCgpCisKKyAgICBkZWYgd3JpdGVTdHJ1Y3Qoc2VsZiwgb2JqLCB0aHJpZnRfc3BlYyk6CisgICAgICAgIHNlbGYud3JpdGVTdHJ1Y3RCZWdpbihvYmouX19jbGFzc19fLl9fbmFtZV9fKQorICAgICAgICBmb3IgZmllbGQgaW4gdGhyaWZ0X3NwZWM6CisgICAgICAgICAgICBpZiBmaWVsZCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmbmFtZSA9IGZpZWxkWzJdCisgICAgICAgICAgICB2YWwgPSBnZXRhdHRyKG9iaiwgZm5hbWUpCisgICAgICAgICAgICBpZiB2YWwgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIHNraXAgd3JpdGluZyBvdXQgdW5zZXQgZmllbGRzCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZpZCA9IGZpZWxkWzBdCisgICAgICAgICAgICBmdHlwZSA9IGZpZWxkWzFdCisgICAgICAgICAgICBmc3BlYyA9IGZpZWxkWzNdCisgICAgICAgICAgICBzZWxmLndyaXRlRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCkKKyAgICAgICAgICAgIHNlbGYud3JpdGVGaWVsZEJ5VFR5cGUoZnR5cGUsIHZhbCwgZnNwZWMpCisgICAgICAgICAgICBzZWxmLndyaXRlRmllbGRFbmQoKQorICAgICAgICBzZWxmLndyaXRlRmllbGRTdG9wKCkKKyAgICAgICAgc2VsZi53cml0ZVN0cnVjdEVuZCgpCisKKyAgICBkZWYgX3dyaXRlX2J5X3R0eXBlKHNlbGYsIHR0eXBlLCB2YWxzLCBzcGVjLCBlc3BlYyk6CisgICAgICAgIF8sIHdyaXRlcl9uYW1lLCBpc19jb250YWluZXIgPSBzZWxmLl90dHlwZV9oYW5kbGVycyh0dHlwZSwgZXNwZWMpCisgICAgICAgIHdyaXRlcl9mdW5jID0gZ2V0YXR0cihzZWxmLCB3cml0ZXJfbmFtZSkKKyAgICAgICAgd3JpdGUgPSAobGFtYmRhIHY6IHdyaXRlcl9mdW5jKHYsIGVzcGVjKSkgaWYgaXNfY29udGFpbmVyIGVsc2Ugd3JpdGVyX2Z1bmMKKyAgICAgICAgZm9yIHYgaW4gdmFsczoKKyAgICAgICAgICAgIHlpZWxkIHdyaXRlKHYpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJ5VFR5cGUoc2VsZiwgdHR5cGUsIHZhbCwgc3BlYyk6CisgICAgICAgIG5leHQoc2VsZi5fd3JpdGVfYnlfdHR5cGUodHR5cGUsIFt2YWxdLCBzcGVjLCBzcGVjKSkKKwogCiBkZWYgY2hlY2tJbnRlZ2VyTGltaXRzKGksIGJpdHMpOgogICAgIGlmIGJpdHMgPT0gOCBhbmQgKGkgPCAtMTI4IG9yIGkgPiAxMjcpOgpAQCAtNDEzLDkgKzQxMywxMCBAQAogICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzIgcmVxdWlyZXMgLTIxNDc0ODM2NDggPD0gbnVtYmVyIDw9IDIxNDc0ODM2NDciKQogICAgIGVsaWYgYml0cyA9PSA2NCBhbmQgKGkgPCAtOTIyMzM3MjAzNjg1NDc3NTgwOCBvciBpID4gOTIyMzM3MjAzNjg1NDc3NTgwNyk6Ci0gICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0IHJlcXVpcmVzIC05MjIzMzcyMDM2ODU0Nzc1ODA4IDw9IG51bWJlciA8PSA5MjIzMzcyMDM2ODU0Nzc1ODA3IikKKyAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0IHJlcXVpcmVzIC05MjIzMzcyMDM2ODU0Nzc1ODA4IDw9IG51bWJlciA8PSA5MjIzMzcyMDM2ODU0Nzc1ODA3IikKIAotY2xhc3MgVFByb3RvY29sRmFjdG9yeToKLSAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKLSAgICBwYXNzCisKK2NsYXNzIFRQcm90b2NvbEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnB5CmluZGV4IDNlOWU1MDAuLmY1NTQ2YzcgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnB5CisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnB5CkBAIC0xNywyNiArMTcsMTAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gdGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpbXBvcnQgVFByb3RvY29sQmFzZQotZnJvbSB0eXBlcyBpbXBvcnQgKgogCi1jbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IoKToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKLSAgICBUUHJvdG9jb2xCYXNlKHByb3RvY29sKQotICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAotCi0gIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKLSAgICBpZiBoYXNhdHRyKHNlbGYucHJvdG9jb2wsIG5hbWUpOgotICAgICAgbWVtYmVyID0gZ2V0YXR0cihzZWxmLnByb3RvY29sLCBuYW1lKQotICAgICAgaWYgdHlwZShtZW1iZXIpIGluIFtNZXRob2RUeXBlLCBVbmJvdW5kTWV0aG9kVHlwZSwgRnVuY3Rpb25UeXBlLCBMYW1iZGFUeXBlLCBCdWlsdGluRnVuY3Rpb25UeXBlLCBCdWlsdGluTWV0aG9kVHlwZV06Ci0gICAgICAgIHJldHVybiBsYW1iZGEgKmFyZ3MsICoqa3dhcmdzOiBzZWxmLl93cmFwKG1lbWJlciwgYXJncywga3dhcmdzKQotICAgICAgZWxzZToKLSAgICAgICAgcmV0dXJuIG1lbWJlcgotICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpCi0KLSAgZGVmIF93cmFwKHNlbGYsIGZ1bmMsIGFyZ3MsIGt3YXJncyk6Ci0gICAgaWYgdHlwZShmdW5jKSA9PSBNZXRob2RUeXBlOgotICAgICAgcmVzdWx0ID0gZnVuYygqYXJncywgKiprd2FyZ3MpCi0gICAgZWxzZToKLSAgICAgIHJlc3VsdCA9IGZ1bmMoc2VsZi5wcm90b2NvbCwgKmFyZ3MsICoqa3dhcmdzKQotICAgIHJldHVybiByZXN1bHQKK2NsYXNzIFRQcm90b2NvbERlY29yYXRvcihvYmplY3QpOgorICAgIGRlZiBfX25ld19fKGNscywgcHJvdG9jb2wsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGRlY29yYXRlZF9jbHMgPSB0eXBlKCcnLmpvaW4oWydEZWNvcmF0ZWQnLCBwcm90b2NvbC5fX2NsYXNzX18uX19uYW1lX19dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNscywgcHJvdG9jb2wuX19jbGFzc19fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wuX19kaWN0X18pCisgICAgICAgIHJldHVybiBvYmplY3QuX19uZXdfXyhkZWNvcmF0ZWRfY2xzKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9fX2luaXRfXy5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvX19pbml0X18ucHkKaW5kZXggN2VlZmI0NS4uMDY2NDdhMiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9fX2luaXRfXy5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL19faW5pdF9fLnB5CkBAIC0xNyw0ICsxNyw1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1fX2FsbF9fID0gWydmYXN0YmluYXJ5JywgJ1RCYXNlJywgJ1RCaW5hcnlQcm90b2NvbCcsICdUQ29tcGFjdFByb3RvY29sJywgJ1RKU09OUHJvdG9jb2wnLCAnVFByb3RvY29sJ10KK19fYWxsX18gPSBbJ2Zhc3RiaW5hcnknLCAnVEJhc2UnLCAnVEJpbmFyeVByb3RvY29sJywgJ1RDb21wYWN0UHJvdG9jb2wnLAorICAgICAgICAgICAnVEpTT05Qcm90b2NvbCcsICdUUHJvdG9jb2wnLCAnVFByb3RvY29sRGVjb3JhdG9yJ10KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvZmFzdGJpbmFyeS5jIGIvbGliL3B5L3NyYy9wcm90b2NvbC9mYXN0YmluYXJ5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYzQ5MTEuLjAwMDAwMDAKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9mYXN0YmluYXJ5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPFB5dGhvbi5oPgotI2luY2x1ZGUgImNTdHJpbmdJTy5oIgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2lmbmRlZiBfV0lOMzIKLSMgaW5jbHVkZSA8c3RkYm9vbC5oPgotIyBpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxXaW5Tb2NrMi5oPgotIyBwcmFnbWEgY29tbWVudCAobGliLCAid3MyXzMyLmxpYiIpCi0jIGRlZmluZSBCSUdfRU5ESUFOICg0MzIxKQotIyBkZWZpbmUgTElUVExFX0VORElBTiAoMTIzNCkKLSMgZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgotIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE2MDAKLSAgIHR5cGVkZWYgaW50IF9Cb29sOwotIyAgZGVmaW5lIGJvb2wgX0Jvb2wKLSMgIGRlZmluZSBmYWxzZSAwCi0jICBkZWZpbmUgdHJ1ZSAxCi0jIGVuZGlmCi0jIGRlZmluZSBpbmxpbmUgX19pbmxpbmUKLSNlbmRpZgotCi0vKiBGaXggZW5kaWFubmVzcyBpc3N1ZXMgb24gU29sYXJpcyAqLwotI2lmIGRlZmluZWQgKF9fU1ZSNCkgJiYgZGVmaW5lZCAoX19zdW4pCi0gI2lmIGRlZmluZWQoX19pMzg2KSAmJiAhZGVmaW5lZChfX2kzODZfXykKLSAgI2RlZmluZSBfX2kzODZfXwotICNlbmRpZgotCi0gI2lmbmRlZiBCSUdfRU5ESUFOCi0gICNkZWZpbmUgQklHX0VORElBTiAoNDMyMSkKLSAjZW5kaWYKLSAjaWZuZGVmIExJVFRMRV9FTkRJQU4KLSAgI2RlZmluZSBMSVRUTEVfRU5ESUFOICgxMjM0KQotICNlbmRpZgotCi0gLyogSTM4NiBpcyBMRSwgZXZlbiBvbiBTb2xhcmlzICovCi0gI2lmICFkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoX19pMzg2X18pCi0gICNkZWZpbmUgQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCi0gI2VuZGlmCi0jZW5kaWYKLQotLy8gVE9ETyhkcmVpc3MpOiBkZWZ2YWwgYXBwZWFycyB0byBiZSB1bnVzZWQuICBMb29rIGludG8gcmVtb3ZpbmcgaXQuCi0vLyBUT0RPKGRyZWlzcyk6IE1ha2UgcGFyc2Vfc3BlY19hcmdzIHJlY3Vyc2l2ZSwgYW5kIGNhY2hlIHRoZSBvdXRwdXQKLS8vICAgICAgICAgICAgICAgcGVybWFuZW50bHkgaW4gdGhlIG9iamVjdC4gIChNYWxsb2MgYW5kIG9ycGhhbi4pCi0vLyBUT0RPKGRyZWlzcyk6IFdoeSBkbyB3ZSBuZWVkIGNTdHJpbmdJTyBmb3IgcmVhZGluZywgd2h5IG5vdCBqdXN0IGNoYXIqPwotLy8gICAgICAgICAgICAgICBDYW4gY1N0cmluZ0lPIGxldCB1cyB3b3JrIHdpdGggYSBCdWZmZXJlZFRyYW5zcG9ydD8KLS8vIFRPRE8oZHJlaXNzKTogRG9uJ3QgaWdub3JlIHRoZSBydiBmcm9tIGN3cml0ZSAobWF5YmUpLgotCi0vKiA9PT09PT0gQkVHSU4gVVRJTElUSUVTID09PT09PSAqLwotCi0jZGVmaW5lIElOSVRfT1VUQlVGX1NJWkUgMTI4Ci0KLS8vIFN0b2xlbiBvdXQgb2YgVFByb3RvY29sLmguCi0vLyBJdCB3b3VsZCBiZSBhIGh1Z2UgcGFpbiB0byBoYXZlIGJvdGggZ2V0IHRoaXMgZnJvbSBvbmUgcGxhY2UuCi10eXBlZGVmIGVudW0gVFR5cGUgewotICBUX1NUT1AgICAgICAgPSAwLAotICBUX1ZPSUQgICAgICAgPSAxLAotICBUX0JPT0wgICAgICAgPSAyLAotICBUX0JZVEUgICAgICAgPSAzLAotICBUX0kwOCAgICAgICAgPSAzLAotICBUX0kxNiAgICAgICAgPSA2LAotICBUX0kzMiAgICAgICAgPSA4LAotICBUX1U2NCAgICAgICAgPSA5LAotICBUX0k2NCAgICAgICAgPSAxMCwKLSAgVF9ET1VCTEUgICAgID0gNCwKLSAgVF9TVFJJTkcgICAgID0gMTEsCi0gIFRfVVRGNyAgICAgICA9IDExLAotICBUX1NUUlVDVCAgICAgPSAxMiwKLSAgVF9NQVAgICAgICAgID0gMTMsCi0gIFRfU0VUICAgICAgICA9IDE0LAotICBUX0xJU1QgICAgICAgPSAxNSwKLSAgVF9VVEY4ICAgICAgID0gMTYsCi0gIFRfVVRGMTYgICAgICA9IDE3Ci19IFRUeXBlOwotCi0jaWZuZGVmIF9fQllURV9PUkRFUgotIyBpZiBkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoTElUVExFX0VORElBTikgJiYgZGVmaW5lZChCSUdfRU5ESUFOKQotIyAgZGVmaW5lIF9fQllURV9PUkRFUiBCWVRFX09SREVSCi0jICBkZWZpbmUgX19MSVRUTEVfRU5ESUFOIExJVFRMRV9FTkRJQU4KLSMgIGRlZmluZSBfX0JJR19FTkRJQU4gQklHX0VORElBTgotIyBlbHNlCi0jICBlcnJvciAiQ2Fubm90IGRldGVybWluZSBlbmRpYW5uZXNzIgotIyBlbmRpZgotI2VuZGlmCi0KLS8vIFNhbWUgY29tbWVudCBhcyB0aGUgZW51bS4gIFNvcnJ5LgotI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KLSMgZGVmaW5lIG50b2hsbChuKSAobikKLSMgZGVmaW5lIGh0b25sbChuKSAobikKLSNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KLSMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCi0jICBpbmNsdWRlIDxieXRlc3dhcC5oPgotIyAgZGVmaW5lIG50b2hsbChuKSBic3dhcF82NChuKQotIyAgZGVmaW5lIGh0b25sbChuKSBic3dhcF82NChuKQotIyBlbHNlIC8qIEdOVUMgJiBHTElCQyAqLwotIyAgZGVmaW5lIG50b2hsbChuKSAoICgoKHVuc2lnbmVkIGxvbmcgbG9uZyludG9obChuKSkgPDwgMzIpICsgbnRvaGwobiA+PiAzMikgKQotIyAgZGVmaW5lIGh0b25sbChuKSAoICgoKHVuc2lnbmVkIGxvbmcgbG9uZylodG9ubChuKSkgPDwgMzIpICsgaHRvbmwobiA+PiAzMikgKQotIyBlbmRpZiAvKiBHTlVDICYgR0xJQkMgKi8KLSNlbHNlIC8qIF9fQllURV9PUkRFUiAqLwotIyBlcnJvciAiQ2FuJ3QgZGVmaW5lIGh0b25sbCBvciBudG9obGwhIgotI2VuZGlmCi0KLS8vIERvaW5nIGEgYmVuY2htYXJrIHNob3dzIHRoYXQgaW50ZXJuaW5nIGFjdHVhbGx5IG1ha2VzIGEgZGlmZmVyZW5jZSwgYW1hemluZ2x5LgotI2RlZmluZSBJTlRFUk5fU1RSSU5HKHZhbHVlKSBfaW50ZXJuXyAjIyB2YWx1ZQotCi0jZGVmaW5lIElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpICggKCh2KSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSApCi0jZGVmaW5lIENIRUNLX1JBTkdFKHYsIG1pbiwgbWF4KSAoICgodikgPD0gKG1heCkpICYmICgodikgPj0gKG1pbikpICkKLQotLy8gUHlfc3NpemVfdCB3YXMgbm90IGRlZmluZWQgYmVmb3JlIFB5dGhvbiAyLjUKLSNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotdHlwZWRlZiBpbnQgUHlfc3NpemVfdDsKLSNlbmRpZgotCi0vKioKLSAqIEEgY2FjaGUgb2YgdGhlIHNwZWNfYXJncyBmb3IgYSBzZXQgb3IgbGlzdCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgVFR5cGUgZWxlbWVudF90eXBlOwotICBQeU9iamVjdCogdHlwZWFyZ3M7Ci19IFNldExpc3RUeXBlQXJnczsKLQotLyoqCi0gKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgbWFwLAotICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBUVHlwZSBrdGFnOwotICBUVHlwZSB2dGFnOwotICBQeU9iamVjdCoga3R5cGVhcmdzOwotICBQeU9iamVjdCogdnR5cGVhcmdzOwotfSBNYXBUeXBlQXJnczsKLQotLyoqCi0gKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgc3RydWN0LAotICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBQeU9iamVjdCoga2xhc3M7Ci0gIFB5T2JqZWN0KiBzcGVjOwotfSBTdHJ1Y3RUeXBlQXJnczsKLQotLyoqCi0gKiBBIGNhY2hlIG9mIHRoZSBpdGVtIHNwZWMgZnJvbSBhIHN0cnVjdCBzcGVjaWZpY2F0aW9uLAotICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgdGFnOwotICBUVHlwZSB0eXBlOwotICBQeU9iamVjdCogYXR0cm5hbWU7Ci0gIFB5T2JqZWN0KiB0eXBlYXJnczsKLSAgUHlPYmplY3QqIGRlZnZhbDsKLX0gU3RydWN0SXRlbVNwZWM7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgdHdvIGtleSBhdHRyaWJ1dGVzIG9mIGEgQ1JlYWRhYmxlVHJhbnNwb3J0LAotICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlPYmplY3RfR2V0QXR0ci4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBQeU9iamVjdCogc3RyaW5naW9idWY7Ci0gIFB5T2JqZWN0KiByZWZpbGxfY2FsbGFibGU7Ci19IERlY29kZUJ1ZmZlcjsKLQotLyoqIFBvaW50ZXIgdG8gaW50ZXJuZWQgc3RyaW5nIHRvIHNwZWVkIHVwIGF0dHJpYnV0ZSBsb29rdXAuICovCi1zdGF0aWMgUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1Zik7Ci0vKiogUG9pbnRlciB0byBpbnRlcm5lZCBzdHJpbmcgdG8gc3BlZWQgdXAgYXR0cmlidXRlIGxvb2t1cC4gKi8KLXN0YXRpYyBQeU9iamVjdCogSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKTsKLQotc3RhdGljIGlubGluZSBib29sCi1jaGVja19zc2l6ZV90XzMyKFB5X3NzaXplX3QgbGVuKSB7Ci0gIC8vIGVycm9yIGZyb20gZ2V0dGluZyB0aGUgaW50Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChsZW4pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghQ0hFQ0tfUkFOR0UobGVuLCAwLCBJTlQzMl9NQVgpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzdHJpbmcgc2l6ZSBvdXQgb2YgcmFuZ2UiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTUFYX0xJU1RfU0laRSAoMTAwMDApCi0KLXN0YXRpYyBpbmxpbmUgYm9vbAotY2hlY2tfbGlzdF9sZW5ndGgoUHlfc3NpemVfdCBsZW4pIHsKLSAgLy8gZXJyb3IgZnJvbSBnZXR0aW5nIHRoZSBpbnQKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGxlbikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFDSEVDS19SQU5HRShsZW4sIDAsIE1BWF9MSVNUX1NJWkUpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsaXN0IHNpemUgb3V0IG9mIHRoZSBzYW5pdHkgbGltaXQgKDEwMDAwIGl0ZW1zIG1heCkiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotcGFyc2VfcHlpbnQoUHlPYmplY3QqIG8sIGludDMyX3QqIHJldCwgaW50MzJfdCBtaW4sIGludDMyX3QgbWF4KSB7Ci0gIGxvbmcgdmFsID0gUHlJbnRfQXNMb25nKG8pOwotCi0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2YWwpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghQ0hFQ0tfUkFOR0UodmFsLCBtaW4sIG1heCkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImludCBvdXQgb2YgcmFuZ2UiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqcmV0ID0gKGludDMyX3QpIHZhbDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogLS0tIEZVTkNUSU9OUyBUTyBQQVJTRSBTVFJVQ1QgU1BFQ0lGSUNBVE9JTlMgLS0tICovCi0KLXN0YXRpYyBib29sCi1wYXJzZV9zZXRfbGlzdF9hcmdzKFNldExpc3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7Ci0gIGlmIChQeVR1cGxlX1NpemUodHlwZWFyZ3MpICE9IDIpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIHR1cGxlIG9mIHNpemUgMiBmb3IgbGlzdC9zZXQgdHlwZSBhcmdzIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+ZWxlbWVudF90eXBlID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDApKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPmVsZW1lbnRfdHlwZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT50eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotcGFyc2VfbWFwX2FyZ3MoTWFwVHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICBpZiAoUHlUdXBsZV9TaXplKHR5cGVhcmdzKSAhPSA0KSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyA0IGFyZ3VtZW50cyBmb3IgdHlwZWFyZ3MgdG8gbWFwIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+a3RhZyA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSk7Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT5rdGFnKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPnZ0YWcgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMikpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dnRhZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5rdHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKLSAgZGVzdC0+dnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sCi1wYXJzZV9zdHJ1Y3RfYXJncyhTdHJ1Y3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7Ci0gIGlmIChQeVR1cGxlX1NpemUodHlwZWFyZ3MpICE9IDIpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIHR1cGxlIG9mIHNpemUgMiBmb3Igc3RydWN0IGFyZ3MiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5rbGFzcyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDApOwotICBkZXN0LT5zcGVjID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX3N0cnVjdF9pdGVtX3NwZWMoU3RydWN0SXRlbVNwZWMqIGRlc3QsIFB5T2JqZWN0KiBzcGVjX3R1cGxlKSB7Ci0KLSAgLy8gaSdkIGxpa2UgdG8gdXNlIFBhcnNlQXJncyBoZXJlLCBidXQgaXQgc2VlbXMgdG8gYmUgYSBib3R0bGVuZWNrLgotICBpZiAoUHlUdXBsZV9TaXplKHNwZWNfdHVwbGUpICE9IDUpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIDUgYXJndW1lbnRzIGZvciBzcGVjIHR1cGxlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+dGFnID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMCkpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dGFnKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPnR5cGUgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAxKSk7Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT50eXBlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmF0dHJuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAyKTsKLSAgZGVzdC0+dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDMpOwotICBkZXN0LT5kZWZ2YWwgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogPT09PT09IEVORCBVVElMSVRJRVMgPT09PT09ICovCi0KLQotLyogPT09PT09IEJFR0lOIFdSSVRJTkcgRlVOQ1RJT05TID09PT09PSAqLwotCi0vKiAtLS0gTE9XLUxFVkVMIFdSSVRJTkcgRlVOQ1RJT05TIC0tLSAqLwotCi1zdGF0aWMgdm9pZCB3cml0ZUJ5dGUoUHlPYmplY3QqIG91dGJ1ZiwgaW50OF90IHZhbCkgewotICBpbnQ4X3QgbmV0ID0gdmFsOwotICBQeWNTdHJpbmdJTy0+Y3dyaXRlKG91dGJ1ZiwgKGNoYXIqKSZuZXQsIHNpemVvZihpbnQ4X3QpKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVJMTYoUHlPYmplY3QqIG91dGJ1ZiwgaW50MTZfdCB2YWwpIHsKLSAgaW50MTZfdCBuZXQgPSAoaW50MTZfdClodG9ucyh2YWwpOwotICBQeWNTdHJpbmdJTy0+Y3dyaXRlKG91dGJ1ZiwgKGNoYXIqKSZuZXQsIHNpemVvZihpbnQxNl90KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlSTMyKFB5T2JqZWN0KiBvdXRidWYsIGludDMyX3QgdmFsKSB7Ci0gIGludDMyX3QgbmV0ID0gKGludDMyX3QpaHRvbmwodmFsKTsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50MzJfdCkpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZUk2NChQeU9iamVjdCogb3V0YnVmLCBpbnQ2NF90IHZhbCkgewotICBpbnQ2NF90IG5ldCA9IChpbnQ2NF90KWh0b25sbCh2YWwpOwotICBQeWNTdHJpbmdJTy0+Y3dyaXRlKG91dGJ1ZiwgKGNoYXIqKSZuZXQsIHNpemVvZihpbnQ2NF90KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlRG91YmxlKFB5T2JqZWN0KiBvdXRidWYsIGRvdWJsZSBkdWIpIHsKLSAgLy8gVW5mb3J0dW5hdGVseSwgYml0d2lzZV9jYXN0IGRvZXNuJ3Qgd29yayBpbiBDLiAgQmFkIEMhCi0gIHVuaW9uIHsKLSAgICBkb3VibGUgZjsKLSAgICBpbnQ2NF90IHQ7Ci0gIH0gdHJhbnNmZXI7Ci0gIHRyYW5zZmVyLmYgPSBkdWI7Ci0gIHdyaXRlSTY0KG91dGJ1ZiwgdHJhbnNmZXIudCk7Ci19Ci0KLQotLyogLS0tIE1BSU4gUkVDVVJTSVZFIE9VVFBVVCBGVU5DVElPTiAtLSAqLwotCi1zdGF0aWMgaW50Ci1vdXRwdXRfdmFsKFB5T2JqZWN0KiBvdXRwdXQsIFB5T2JqZWN0KiB2YWx1ZSwgVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKSB7Ci0gIC8qCi0gICAqIFJlZmNvdW50aW5nIFN0cmF0ZWd5OgotICAgKgotICAgKiBXZSBhc3N1bWUgdGhhdCBlbGVtZW50cyBvZiB0aGUgdGhyaWZ0X3NwZWMgdHVwbGUgYXJlIG5vdCBnb2luZyB0byBiZQotICAgKiBtdXRhdGVkLCBzbyB3ZSBkb24ndCByZWYgY291bnQgdGhvc2UgYXQgYWxsLiBPdGhlciB0aGFuIHRoYXQsIHdlIHRyeSB0bwotICAgKiBrZWVwIGEgcmVmZXJlbmNlIHRvIGFsbCB0aGUgdXNlci1jcmVhdGVkIG9iamVjdHMgd2hpbGUgd2Ugd29yayB3aXRoIHRoZW0uCi0gICAqIG91dHB1dF92YWwgYXNzdW1lcyB0aGF0IGEgcmVmZXJlbmNlIGlzIGFscmVhZHkgaGVsZC4gVGhlICpjYWxsZXIqIGlzCi0gICAqIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyByZWZlcmVuY2VzCi0gICAqLwotCi0gIHN3aXRjaCAodHlwZSkgewotCi0gIGNhc2UgVF9CT09MOiB7Ci0gICAgaW50IHYgPSBQeU9iamVjdF9Jc1RydWUodmFsdWUpOwotICAgIGlmICh2ID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgKGludDhfdCkgdik7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgY2FzZSBUX0kwODogewotICAgIGludDMyX3QgdmFsOwotCi0gICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgSU5UOF9NSU4sIElOVDhfTUFYKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlQnl0ZShvdXRwdXQsIChpbnQ4X3QpIHZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgY2FzZSBUX0kxNjogewotICAgIGludDMyX3QgdmFsOwotCi0gICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgSU5UMTZfTUlOLCBJTlQxNl9NQVgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJMTYob3V0cHV0LCAoaW50MTZfdCkgdmFsKTsKLSAgICBicmVhazsKLSAgfQotICBjYXNlIFRfSTMyOiB7Ci0gICAgaW50MzJfdCB2YWw7Ci0KLSAgICBpZiAoIXBhcnNlX3B5aW50KHZhbHVlLCAmdmFsLCBJTlQzMl9NSU4sIElOVDMyX01BWCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUkzMihvdXRwdXQsIHZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgY2FzZSBUX0k2NDogewotICAgIGludDY0X3QgbnZhbCA9IFB5TG9uZ19Bc0xvbmdMb25nKHZhbHVlKTsKLQotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChudmFsKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghQ0hFQ0tfUkFOR0UobnZhbCwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgpKSB7Ci0gICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImludCBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUk2NChvdXRwdXQsIG52YWwpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX0RPVUJMRTogewotICAgIGRvdWJsZSBudmFsID0gUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7Ci0gICAgaWYgKG52YWwgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVEb3VibGUob3V0cHV0LCBudmFsKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9TVFJJTkc6IHsKLSAgICBQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX1NpemUodmFsdWUpOwotCi0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUkzMihvdXRwdXQsIChpbnQzMl90KSBsZW4pOwotICAgIFB5Y1N0cmluZ0lPLT5jd3JpdGUob3V0cHV0LCBQeVN0cmluZ19Bc1N0cmluZyh2YWx1ZSksIChpbnQzMl90KSBsZW4pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX0xJU1Q6Ci0gIGNhc2UgVF9TRVQ6IHsKLSAgICBQeV9zc2l6ZV90IGxlbjsKLSAgICBTZXRMaXN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLSAgICBQeU9iamVjdCAqaXRlbTsKLSAgICBQeU9iamVjdCAqaXRlcmF0b3I7Ci0KLSAgICBpZiAoIXBhcnNlX3NldF9saXN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGxlbiA9IFB5T2JqZWN0X0xlbmd0aCh2YWx1ZSk7Ci0KLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlQnl0ZShvdXRwdXQsIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlKTsKLSAgICB3cml0ZUkzMihvdXRwdXQsIChpbnQzMl90KSBsZW4pOwotCi0gICAgaXRlcmF0b3IgPSAgUHlPYmplY3RfR2V0SXRlcih2YWx1ZSk7Ci0gICAgaWYgKGl0ZXJhdG9yID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyYXRvcikpKSB7Ci0gICAgICBpZiAoIW91dHB1dF92YWwob3V0cHV0LCBpdGVtLCBwYXJzZWRhcmdzLmVsZW1lbnRfdHlwZSwgcGFyc2VkYXJncy50eXBlYXJncykpIHsKLSAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwotICAgICAgICBQeV9ERUNSRUYoaXRlcmF0b3IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgfQotCi0gICAgUHlfREVDUkVGKGl0ZXJhdG9yKTsKLQotICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfTUFQOiB7Ci0gICAgUHlPYmplY3QgKmssICp2OwotICAgIFB5X3NzaXplX3QgcG9zID0gMDsKLSAgICBQeV9zc2l6ZV90IGxlbjsKLQotICAgIE1hcFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0KLSAgICBsZW4gPSBQeURpY3RfU2l6ZSh2YWx1ZSk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIXBhcnNlX21hcF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCBwYXJzZWRhcmdzLmt0YWcpOwotICAgIHdyaXRlQnl0ZShvdXRwdXQsIHBhcnNlZGFyZ3MudnRhZyk7Ci0gICAgd3JpdGVJMzIob3V0cHV0LCBsZW4pOwotCi0gICAgLy8gVE9ETyhibWF1cmVyKTogc2hvdWxkIHN1cHBvcnQgYW55IG1hcHBpbmcsIG5vdCBqdXN0IGRpY3RzCi0gICAgd2hpbGUgKFB5RGljdF9OZXh0KHZhbHVlLCAmcG9zLCAmaywgJnYpKSB7Ci0gICAgICAvLyBUT0RPKGRyZWlzcyk6IFRoaW5rIGhhcmQgYWJvdXQgd2hldGhlciB0aGVzZSBJTkNSRUZzIGFjdHVhbGx5Ci0gICAgICAvLyAgICAgICAgICAgICAgIHR1cm4gYW55IHVuc2FmZSBzY2VuYXJpb3MgaW50byBzYWZlIHNjZW5hcmlvcy4KLSAgICAgIFB5X0lOQ1JFRihrKTsKLSAgICAgIFB5X0lOQ1JFRih2KTsKLQotICAgICAgaWYgKCFvdXRwdXRfdmFsKG91dHB1dCwgaywgcGFyc2VkYXJncy5rdGFnLCBwYXJzZWRhcmdzLmt0eXBlYXJncykKLSAgICAgICAgICB8fCAhb3V0cHV0X3ZhbChvdXRwdXQsIHYsIHBhcnNlZGFyZ3MudnRhZywgcGFyc2VkYXJncy52dHlwZWFyZ3MpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihrKTsKLSAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBQeV9ERUNSRUYoayk7Ci0gICAgICBQeV9ERUNSRUYodik7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBDb25zaWRlciBicmVha2luZyB0aGlzIG91dCBhcyBhIGZ1bmN0aW9uCi0gIC8vICAgICAgICAgICAgICAgdGhlIHdheSB3ZSBkaWQgZm9yIGRlY29kZV9zdHJ1Y3QuCi0gIGNhc2UgVF9TVFJVQ1Q6IHsKLSAgICBTdHJ1Y3RUeXBlQXJncyBwYXJzZWRhcmdzOwotICAgIFB5X3NzaXplX3QgbnNwZWM7Ci0gICAgUHlfc3NpemVfdCBpOwotCi0gICAgaWYgKCFwYXJzZV9zdHJ1Y3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbnNwZWMgPSBQeVR1cGxlX1NpemUocGFyc2VkYXJncy5zcGVjKTsKLQotICAgIGlmIChuc3BlYyA9PSAtMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBuc3BlYzsgaSsrKSB7Ci0gICAgICBTdHJ1Y3RJdGVtU3BlYyBwYXJzZWRzcGVjOwotICAgICAgUHlPYmplY3QqIHNwZWNfdHVwbGU7Ci0gICAgICBQeU9iamVjdCogaW5zdHZhbCA9IE5VTEw7Ci0KLSAgICAgIHNwZWNfdHVwbGUgPSBQeVR1cGxlX0dFVF9JVEVNKHBhcnNlZGFyZ3Muc3BlYywgaSk7Ci0gICAgICBpZiAoc3BlY190dXBsZSA9PSBQeV9Ob25lKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIXBhcnNlX3N0cnVjdF9pdGVtX3NwZWMgKCZwYXJzZWRzcGVjLCBzcGVjX3R1cGxlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGluc3R2YWwgPSBQeU9iamVjdF9HZXRBdHRyKHZhbHVlLCBwYXJzZWRzcGVjLmF0dHJuYW1lKTsKLQotICAgICAgaWYgKCFpbnN0dmFsKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGluc3R2YWwgPT0gUHlfTm9uZSkgewotICAgICAgICBQeV9ERUNSRUYoaW5zdHZhbCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICB3cml0ZUJ5dGUob3V0cHV0LCAoaW50OF90KSBwYXJzZWRzcGVjLnR5cGUpOwotICAgICAgd3JpdGVJMTYob3V0cHV0LCBwYXJzZWRzcGVjLnRhZyk7Ci0KLSAgICAgIGlmICghb3V0cHV0X3ZhbChvdXRwdXQsIGluc3R2YWwsIHBhcnNlZHNwZWMudHlwZSwgcGFyc2Vkc3BlYy50eXBlYXJncykpIHsKLSAgICAgICAgUHlfREVDUkVGKGluc3R2YWwpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIFB5X0RFQ1JFRihpbnN0dmFsKTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCAoaW50OF90KVRfU1RPUCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfU1RPUDoKLSAgY2FzZSBUX1ZPSUQ6Ci0gIGNhc2UgVF9VVEYxNjoKLSAgY2FzZSBUX1VURjg6Ci0gIGNhc2UgVF9VNjQ6Ci0gIGRlZmF1bHQ6Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIC0tLSBUT1AtTEVWRUwgV1JBUFBFUiBGT1IgT1VUUFVUIC0tICovCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1lbmNvZGVfYmluYXJ5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgewotICBQeU9iamVjdCogZW5jX29iajsKLSAgUHlPYmplY3QqIHR5cGVfYXJnczsKLSAgUHlPYmplY3QqIGJ1ZjsKLSAgUHlPYmplY3QqIHJldCA9IE5VTEw7Ci0KLSAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyIsICZlbmNfb2JqLCAmdHlwZV9hcmdzKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgYnVmID0gUHljU3RyaW5nSU8tPk5ld091dHB1dChJTklUX09VVEJVRl9TSVpFKTsKLSAgaWYgKG91dHB1dF92YWwoYnVmLCBlbmNfb2JqLCBUX1NUUlVDVCwgdHlwZV9hcmdzKSkgewotICAgIHJldCA9IFB5Y1N0cmluZ0lPLT5jZ2V0dmFsdWUoYnVmKTsKLSAgfQotCi0gIFB5X0RFQ1JFRihidWYpOwotICByZXR1cm4gcmV0OwotfQotCi0vKiA9PT09PT0gRU5EIFdSSVRJTkcgRlVOQ1RJT05TID09PT09PSAqLwotCi0KLS8qID09PT09PSBCRUdJTiBSRUFESU5HIEZVTkNUSU9OUyA9PT09PT0gKi8KLQotLyogLS0tIExPVy1MRVZFTCBSRUFESU5HIEZVTkNUSU9OUyAtLS0gKi8KLQotc3RhdGljIHZvaWQKLWZyZWVfZGVjb2RlYnVmKERlY29kZUJ1ZmZlciogZCkgewotICBQeV9YREVDUkVGKGQtPnN0cmluZ2lvYnVmKTsKLSAgUHlfWERFQ1JFRihkLT5yZWZpbGxfY2FsbGFibGUpOwotfQotCi1zdGF0aWMgYm9vbAotZGVjb2RlX2J1ZmZlcl9mcm9tX29iaihEZWNvZGVCdWZmZXIqIGRlc3QsIFB5T2JqZWN0KiBvYmopIHsKLSAgZGVzdC0+c3RyaW5naW9idWYgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKSk7Ci0gIGlmICghZGVzdC0+c3RyaW5naW9idWYpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIVB5Y1N0cmluZ0lPX0lucHV0Q2hlY2soZGVzdC0+c3RyaW5naW9idWYpKSB7Ci0gICAgZnJlZV9kZWNvZGVidWYoZGVzdCk7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyBzdHJpbmdpbyBpbnB1dCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPnJlZmlsbF9jYWxsYWJsZSA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpKTsKLQotICBpZighZGVzdC0+cmVmaWxsX2NhbGxhYmxlKSB7Ci0gICAgZnJlZV9kZWNvZGVidWYoZGVzdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGRlc3QtPnJlZmlsbF9jYWxsYWJsZSkpIHsKLSAgICBmcmVlX2RlY29kZWJ1ZihkZXN0KTsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIGNhbGxhYmxlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIHJlYWRCeXRlcyhEZWNvZGVCdWZmZXIqIGlucHV0LCBjaGFyKiogb3V0cHV0LCBpbnQgbGVuKSB7Ci0gIGludCByZWFkOwotCi0gIC8vIFRPRE8oZHJlaXNzKTogRG9uJ3QgZmVhciB0aGUgbWFsbG9jLiAgVGhpbmsgYWJvdXQgdGFraW5nIGEgY29weSBvZgotICAvLyAgICAgICAgICAgICAgIHRoZSBwYXJ0aWFsIHJlYWQgaW5zdGVhZCBvZiBmb3JjaW5nIHRoZSB0cmFuc3BvcnQKLSAgLy8gICAgICAgICAgICAgICB0byBwcmVwZW5kIGl0IHRvIGl0cyBidWZmZXIuCi0KLSAgcmVhZCA9IFB5Y1N0cmluZ0lPLT5jcmVhZChpbnB1dC0+c3RyaW5naW9idWYsIG91dHB1dCwgbGVuKTsKLQotICBpZiAocmVhZCA9PSBsZW4pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmIChyZWFkID09IC0xKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIFB5T2JqZWN0KiBuZXdpb2J1ZjsKLQotICAgIC8vIHVzaW5nIGJ1aWxkaW5nIGZ1bmN0aW9ucyBhcyB0aGlzIGlzIGEgcmFyZSBjb2RlcGF0aAotICAgIG5ld2lvYnVmID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKAotICAgICAgICBpbnB1dC0+cmVmaWxsX2NhbGxhYmxlLCAicyNpIiwgKm91dHB1dCwgcmVhZCwgbGVuLCBOVUxMKTsKLSAgICBpZiAobmV3aW9idWYgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIG11c3QgZG8gdGhpcyAqQUZURVIqIHRoZSBjYWxsIHNvIHRoYXQgd2UgZG9uJ3QgZGVyZWYgdGhlIGlvIGJ1ZmZlcgotICAgIFB5X0NMRUFSKGlucHV0LT5zdHJpbmdpb2J1Zik7Ci0gICAgaW5wdXQtPnN0cmluZ2lvYnVmID0gbmV3aW9idWY7Ci0KLSAgICByZWFkID0gUHljU3RyaW5nSU8tPmNyZWFkKGlucHV0LT5zdHJpbmdpb2J1Ziwgb3V0cHV0LCBsZW4pOwotCi0gICAgaWYgKHJlYWQgPT0gbGVuKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHJlYWQgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gVE9ETyhkcmVpc3MpOiBUaGlzIGNvdWxkIGJlIGEgdmFsaWQgY29kZSBwYXRoIGZvciBiaWcgYmluYXJ5IGJsb2JzLgotICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAicmVmaWxsIGNsYWltZWQgdG8gaGF2ZSByZWZpbGxlZCB0aGUgYnVmZmVyLCBidXQgZGlkbid0ISEiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGludDhfdCByZWFkQnl0ZShEZWNvZGVCdWZmZXIqIGlucHV0KSB7Ci0gIGNoYXIqIGJ1ZjsKLSAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIHNpemVvZihpbnQ4X3QpKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiAqKGludDhfdCopIGJ1ZjsKLX0KLQotc3RhdGljIGludDE2X3QgcmVhZEkxNihEZWNvZGVCdWZmZXIqIGlucHV0KSB7Ci0gIGNoYXIqIGJ1ZjsKLSAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIHNpemVvZihpbnQxNl90KSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gKGludDE2X3QpIG50b2hzKCooaW50MTZfdCopIGJ1Zik7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHJlYWRJMzIoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICBjaGFyKiBidWY7Ci0gIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBzaXplb2YoaW50MzJfdCkpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAoaW50MzJfdCkgbnRvaGwoKihpbnQzMl90KikgYnVmKTsKLX0KLQotCi1zdGF0aWMgaW50NjRfdCByZWFkSTY0KERlY29kZUJ1ZmZlciogaW5wdXQpIHsKLSAgY2hhciogYnVmOwotICBpZiAoIXJlYWRCeXRlcyhpbnB1dCwgJmJ1Ziwgc2l6ZW9mKGludDY0X3QpKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiAoaW50NjRfdCkgbnRvaGxsKCooaW50NjRfdCopIGJ1Zik7Ci19Ci0KLXN0YXRpYyBkb3VibGUgcmVhZERvdWJsZShEZWNvZGVCdWZmZXIqIGlucHV0KSB7Ci0gIHVuaW9uIHsKLSAgICBpbnQ2NF90IGY7Ci0gICAgZG91YmxlIHQ7Ci0gIH0gdHJhbnNmZXI7Ci0KLSAgdHJhbnNmZXIuZiA9IHJlYWRJNjQoaW5wdXQpOwotICBpZiAodHJhbnNmZXIuZiA9PSAtMSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gdHJhbnNmZXIudDsKLX0KLQotc3RhdGljIGJvb2wKLWNoZWNrVHlwZUJ5dGUoRGVjb2RlQnVmZmVyKiBpbnB1dCwgVFR5cGUgZXhwZWN0ZWQpIHsKLSAgVFR5cGUgZ290ID0gcmVhZEJ5dGUoaW5wdXQpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZ290KSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChleHBlY3RlZCAhPSBnb3QpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZ290IHdyb25nIHR0eXBlIHdoaWxlIHJlYWRpbmcgZmllbGQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sCi1za2lwKERlY29kZUJ1ZmZlciogaW5wdXQsIFRUeXBlIHR5cGUpIHsKLSNkZWZpbmUgU0tJUEJZVEVTKG4pIFwKLSAgZG8geyBcCi0gICAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZkdW1teV9idWYsIChuKSkpIHsgXAotICAgICAgcmV0dXJuIGZhbHNlOyBcCi0gICAgfSBcCi0gIH0gd2hpbGUoMCkKLQotICBjaGFyKiBkdW1teV9idWY7Ci0KLSAgc3dpdGNoICh0eXBlKSB7Ci0KLSAgY2FzZSBUX0JPT0w6Ci0gIGNhc2UgVF9JMDg6IFNLSVBCWVRFUygxKTsgYnJlYWs7Ci0gIGNhc2UgVF9JMTY6IFNLSVBCWVRFUygyKTsgYnJlYWs7Ci0gIGNhc2UgVF9JMzI6IFNLSVBCWVRFUyg0KTsgYnJlYWs7Ci0gIGNhc2UgVF9JNjQ6Ci0gIGNhc2UgVF9ET1VCTEU6IFNLSVBCWVRFUyg4KTsgYnJlYWs7Ci0KLSAgY2FzZSBUX1NUUklORzogewotICAgIC8vIFRPRE8oZHJlaXNzKTogRmluZCBvdXQgaWYgdGhlc2UgY2hlY2tfc3NpemVfdDMycyBhcmUgcmVhbGx5IG5lY2Vzc2FyeS4KLSAgICBpbnQgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgU0tJUEJZVEVTKGxlbik7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfTElTVDoKLSAgY2FzZSBUX1NFVDogewotICAgIFRUeXBlIGV0eXBlOwotICAgIGludCBsZW4sIGk7Ci0KLSAgICBldHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAoZXR5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgaWYgKCFza2lwKGlucHV0LCBldHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9NQVA6IHsKLSAgICBUVHlwZSBrdHlwZSwgdnR5cGU7Ci0gICAgaW50IGxlbiwgaTsKLQotICAgIGt0eXBlID0gcmVhZEJ5dGUoaW5wdXQpOwotICAgIGlmIChrdHlwZSA9PSAtMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZ0eXBlID0gcmVhZEJ5dGUoaW5wdXQpOwotICAgIGlmICh2dHlwZSA9PSAtMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGxlbiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBpZiAoIShza2lwKGlucHV0LCBrdHlwZSkgJiYgc2tpcChpbnB1dCwgdnR5cGUpKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX1NUUlVDVDogewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBUVHlwZSB0eXBlOwotCi0gICAgICB0eXBlID0gcmVhZEJ5dGUoaW5wdXQpOwotICAgICAgaWYgKHR5cGUgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBpZiAodHlwZSA9PSBUX1NUT1ApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBTS0lQQllURVMoMik7IC8vIHRhZwotICAgICAgaWYgKCFza2lwKGlucHV0LCB0eXBlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX1NUT1A6Ci0gIGNhc2UgVF9WT0lEOgotICBjYXNlIFRfVVRGMTY6Ci0gIGNhc2UgVF9VVEY4OgotICBjYXNlIFRfVTY0OgotICBkZWZhdWx0OgotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJVbmV4cGVjdGVkIFRUeXBlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotCi0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotI3VuZGVmIFNLSVBCWVRFUwotfQotCi0KLS8qIC0tLSBIRUxQRVIgRlVOQ1RJT04gRk9SIERFQ09ERV9WQUwgLS0tICovCi0KLXN0YXRpYyBQeU9iamVjdCoKLWRlY29kZV92YWwoRGVjb2RlQnVmZmVyKiBpbnB1dCwgVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKTsKLQotc3RhdGljIGJvb2wKLWRlY29kZV9zdHJ1Y3QoRGVjb2RlQnVmZmVyKiBpbnB1dCwgUHlPYmplY3QqIG91dHB1dCwgUHlPYmplY3QqIHNwZWNfc2VxKSB7Ci0gIGludCBzcGVjX3NlcV9sZW4gPSBQeVR1cGxlX1NpemUoc3BlY19zZXEpOwotICBpZiAoc3BlY19zZXFfbGVuID09IC0xKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBUVHlwZSB0eXBlOwotICAgIGludDE2X3QgdGFnOwotICAgIFB5T2JqZWN0KiBpdGVtX3NwZWM7Ci0gICAgUHlPYmplY3QqIGZpZWxkdmFsID0gTlVMTDsKLSAgICBTdHJ1Y3RJdGVtU3BlYyBwYXJzZWRzcGVjOwotCi0gICAgdHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAodHlwZSA9PSAtMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAodHlwZSA9PSBUX1NUT1ApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICB0YWcgPSByZWFkSTE2KGlucHV0KTsKLSAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodGFnKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAodGFnID49IDAgJiYgdGFnIDwgc3BlY19zZXFfbGVuKSB7Ci0gICAgICBpdGVtX3NwZWMgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfc2VxLCB0YWcpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpdGVtX3NwZWMgPSBQeV9Ob25lOwotICAgIH0KLQotICAgIGlmIChpdGVtX3NwZWMgPT0gUHlfTm9uZSkgewotICAgICAgaWYgKCFza2lwKGlucHV0LCB0eXBlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXBhcnNlX3N0cnVjdF9pdGVtX3NwZWMoJnBhcnNlZHNwZWMsIGl0ZW1fc3BlYykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHBhcnNlZHNwZWMudHlwZSAhPSB0eXBlKSB7Ci0gICAgICBpZiAoIXNraXAoaW5wdXQsIHR5cGUpKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJzdHJ1Y3QgZmllbGQgaGFkIHdyb25nIHR5cGUgd2hpbGUgcmVhZGluZyBhbmQgY2FuJ3QgYmUgc2tpcHBlZCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmaWVsZHZhbCA9IGRlY29kZV92YWwoaW5wdXQsIHBhcnNlZHNwZWMudHlwZSwgcGFyc2Vkc3BlYy50eXBlYXJncyk7Ci0gICAgaWYgKGZpZWxkdmFsID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoUHlPYmplY3RfU2V0QXR0cihvdXRwdXQsIHBhcnNlZHNwZWMuYXR0cm5hbWUsIGZpZWxkdmFsKSA9PSAtMSkgewotICAgICAgUHlfREVDUkVGKGZpZWxkdmFsKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgUHlfREVDUkVGKGZpZWxkdmFsKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiAtLS0gTUFJTiBSRUNVUlNJVkUgSU5QVVQgRlVOQ1RJT04gLS0tICovCi0KLS8vIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlLgotc3RhdGljIFB5T2JqZWN0KgotZGVjb2RlX3ZhbChEZWNvZGVCdWZmZXIqIGlucHV0LCBUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0KLSAgY2FzZSBUX0JPT0w6IHsKLSAgICBpbnQ4X3QgdiA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHN3aXRjaCAodikgewotICAgIGNhc2UgMDogUHlfUkVUVVJOX0ZBTFNFOwotICAgIGNhc2UgMTogUHlfUkVUVVJOX1RSVUU7Ci0gICAgLy8gRG9uJ3QgbGF1Z2guICBUaGlzIGlzIGEgcG90ZW50aWFsbHkgc2VyaW91cyBpc3N1ZS4KLSAgICBkZWZhdWx0OiBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYm9vbGVhbiBvdXQgb2YgcmFuZ2UiKTsgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JMDg6IHsKLSAgICBpbnQ4X3QgdiA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKLSAgfQotICBjYXNlIFRfSTE2OiB7Ci0gICAgaW50MTZfdCB2ID0gcmVhZEkxNihpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHYpOwotICB9Ci0gIGNhc2UgVF9JMzI6IHsKLSAgICBpbnQzMl90IHYgPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7Ci0gIH0KLQotICBjYXNlIFRfSTY0OiB7Ci0gICAgaW50NjRfdCB2ID0gcmVhZEk2NChpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBGaW5kIG91dCBpZiB3ZSBjYW4gdGFrZSB0aGlzIGZhc3RwYXRoIGFsd2F5cyB3aGVuCi0gICAgLy8gICAgICAgICAgICAgICBzaXplb2YobG9uZykgPT0gc2l6ZW9mKGxvbmcgbG9uZykuCi0gICAgaWYgKENIRUNLX1JBTkdFKHYsIExPTkdfTUlOLCBMT05HX01BWCkpIHsKLSAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgdik7Ci0gICAgfQotCi0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodik7Ci0gIH0KLQotICBjYXNlIFRfRE9VQkxFOiB7Ci0gICAgZG91YmxlIHYgPSByZWFkRG91YmxlKGlucHV0KTsKLSAgICBpZiAodiA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2KTsKLSAgfQotCi0gIGNhc2UgVF9TVFJJTkc6IHsKLSAgICBQeV9zc2l6ZV90IGxlbiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGNoYXIqIGJ1ZjsKLSAgICBpZiAoIXJlYWRCeXRlcyhpbnB1dCwgJmJ1ZiwgbGVuKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgbGVuKTsKLSAgfQotCi0gIGNhc2UgVF9MSVNUOgotICBjYXNlIFRfU0VUOiB7Ci0gICAgU2V0TGlzdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgaW50MzJfdCBsZW47Ci0gICAgUHlPYmplY3QqIHJldCA9IE5VTEw7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoIXBhcnNlX3NldF9saXN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCFjaGVja1R5cGVCeXRlKGlucHV0LCBwYXJzZWRhcmdzLmVsZW1lbnRfdHlwZSkpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGxlbiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmICghY2hlY2tfbGlzdF9sZW5ndGgobGVuKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0ID0gUHlMaXN0X05ldyhsZW4pOwotICAgIGlmICghcmV0KSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIFB5T2JqZWN0KiBpdGVtID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpOwotICAgICAgaWYgKCFpdGVtKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihyZXQpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAgIFB5TGlzdF9TRVRfSVRFTShyZXQsIGksIGl0ZW0pOwotICAgIH0KLQotICAgIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgYml0aW5nIHRoZSBidWxsZXQgYW5kIG1ha2luZyB0d28gc2VwYXJhdGUgY2FzZXMKLSAgICAvLyAgICAgICAgICAgICAgIGZvciBsaXN0IGFuZCBzZXQsIGF2b2lkaW5nIHRoaXMgcG9zdCBmYWN0byBjb252ZXJzaW9uLgotICAgIGlmICh0eXBlID09IFRfU0VUKSB7Ci0gICAgICBQeU9iamVjdCogc2V0cmV0OwotI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0gICAgICAvLyBoYWNrIG5lZWRlZCBmb3Igb2xkZXIgdmVyc2lvbnMKLSAgICAgIHNldHJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0KikmUHlTZXRfVHlwZSwgcmV0LCBOVUxMKTsKLSNlbHNlCi0gICAgICAvLyBvZmZpY2lhbCB2ZXJzaW9uCi0gICAgICBzZXRyZXQgPSBQeVNldF9OZXcocmV0KTsKLSNlbmRpZgotICAgICAgUHlfREVDUkVGKHJldCk7Ci0gICAgICByZXR1cm4gc2V0cmV0OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgY2FzZSBUX01BUDogewotICAgIGludDMyX3QgbGVuOwotICAgIGludCBpOwotICAgIE1hcFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgUHlPYmplY3QqIHJldCA9IE5VTEw7Ci0KLSAgICBpZiAoIXBhcnNlX21hcF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy5rdGFnKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy52dGFnKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXQgPSBQeURpY3RfTmV3KCk7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBQeU9iamVjdCogayA9IE5VTEw7Ci0gICAgICBQeU9iamVjdCogdiA9IE5VTEw7Ci0gICAgICBrID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2VkYXJncy5rdGFnLCBwYXJzZWRhcmdzLmt0eXBlYXJncyk7Ci0gICAgICBpZiAoayA9PSBOVUxMKSB7Ci0gICAgICAgIGdvdG8gbG9vcF9lcnJvcjsKLSAgICAgIH0KLSAgICAgIHYgPSBkZWNvZGVfdmFsKGlucHV0LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKTsKLSAgICAgIGlmICh2ID09IE5VTEwpIHsKLSAgICAgICAgZ290byBsb29wX2Vycm9yOwotICAgICAgfQotICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHJldCwgaywgdikgPT0gLTEpIHsKLSAgICAgICAgZ290byBsb29wX2Vycm9yOwotICAgICAgfQotCi0gICAgICBQeV9ERUNSRUYoayk7Ci0gICAgICBQeV9ERUNSRUYodik7Ci0gICAgICBjb250aW51ZTsKLQotICAgICAgLy8gWXVjayEgIERlc3RydWN0b3JzLCBhbnlvbmU/Ci0gICAgICBsb29wX2Vycm9yOgotICAgICAgUHlfWERFQ1JFRihrKTsKLSAgICAgIFB5X1hERUNSRUYodik7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0KLSAgICBlcnJvcjoKLSAgICBQeV9YREVDUkVGKHJldCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLQlQeU9iamVjdCogcmV0OwotICAgIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChwYXJzZWRhcmdzLmtsYXNzLCBOVUxMKTsKLSAgICBpZiAoIXJldCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCFkZWNvZGVfc3RydWN0KGlucHV0LCByZXQsIHBhcnNlZGFyZ3Muc3BlYykpIHsKLSAgICAgIFB5X0RFQ1JFRihyZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIGNhc2UgVF9TVE9QOgotICBjYXNlIFRfVk9JRDoKLSAgY2FzZSBUX1VURjE2OgotICBjYXNlIFRfVVRGODoKLSAgY2FzZSBUX1U2NDoKLSAgZGVmYXVsdDoKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLQotLyogLS0tIFRPUC1MRVZFTCBXUkFQUEVSIEZPUiBJTlBVVCAtLSAqLwotCi1zdGF0aWMgUHlPYmplY3QqCi1kZWNvZGVfYmluYXJ5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgewotICBQeU9iamVjdCogb3V0cHV0X29iaiA9IE5VTEw7Ci0gIFB5T2JqZWN0KiB0cmFuc3BvcnQgPSBOVUxMOwotICBQeU9iamVjdCogdHlwZWFyZ3MgPSBOVUxMOwotICBTdHJ1Y3RUeXBlQXJncyBwYXJzZWRhcmdzOwotICBEZWNvZGVCdWZmZXIgaW5wdXQgPSB7MCwgMH07Ci0KLSAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT08iLCAmb3V0cHV0X29iaiwgJnRyYW5zcG9ydCwgJnR5cGVhcmdzKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKCFwYXJzZV9zdHJ1Y3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAoIWRlY29kZV9idWZmZXJfZnJvbV9vYmooJmlucHV0LCB0cmFuc3BvcnQpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAoIWRlY29kZV9zdHJ1Y3QoJmlucHV0LCBvdXRwdXRfb2JqLCBwYXJzZWRhcmdzLnNwZWMpKSB7Ci0gICAgZnJlZV9kZWNvZGVidWYoJmlucHV0KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGZyZWVfZGVjb2RlYnVmKCZpbnB1dCk7Ci0KLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLS8qID09PT09PSBFTkQgUkVBRElORyBGVU5DVElPTlMgPT09PT09ICovCi0KLQotLyogLS0gUFlUSE9OIE1PRFVMRSBTRVRVUCBTVFVGRiAtLS0gKi8KLQotc3RhdGljIFB5TWV0aG9kRGVmIFRocmlmdEZhc3RCaW5hcnlNZXRob2RzW10gPSB7Ci0KLSAgeyJlbmNvZGVfYmluYXJ5IiwgIGVuY29kZV9iaW5hcnksIE1FVEhfVkFSQVJHUywgIiJ9LAotICB7ImRlY29kZV9iaW5hcnkiLCAgZGVjb2RlX2JpbmFyeSwgTUVUSF9WQVJBUkdTLCAiIn0sCi0KLSAge05VTEwsIE5VTEwsIDAsIE5VTEx9ICAgICAgICAvKiBTZW50aW5lbCAqLwotfTsKLQotUHlNT0RJTklUX0ZVTkMKLWluaXRmYXN0YmluYXJ5KHZvaWQpIHsKLSNkZWZpbmUgSU5JVF9JTlRFUk5fU1RSSU5HKHZhbHVlKSBcCi0gIGRvIHsgXAotICAgIElOVEVSTl9TVFJJTkcodmFsdWUpID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygjdmFsdWUpOyBcCi0gICAgaWYoIUlOVEVSTl9TVFJJTkcodmFsdWUpKSByZXR1cm47IFwKLSAgfSB3aGlsZSgwKQotCi0gIElOSVRfSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKTsKLSAgSU5JVF9JTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOwotI3VuZGVmIElOSVRfSU5URVJOX1NUUklORwotCi0gIFB5Y1N0cmluZ19JTVBPUlQ7Ci0gIGlmIChQeWNTdHJpbmdJTyA9PSBOVUxMKSByZXR1cm47Ci0KLSAgKHZvaWQpIFB5X0luaXRNb2R1bGUoInRocmlmdC5wcm90b2NvbC5mYXN0YmluYXJ5IiwgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHMpOwotfQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkgYi9saWIvcHkvc3JjL3NlcnZlci9USHR0cFNlcnZlci5weQppbmRleCA2ZjkyMTczLi40N2U4MTdkIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3NlcnZlci9USHR0cFNlcnZlci5weQorKysgYi9saWIvcHkvc3JjL3NlcnZlci9USHR0cFNlcnZlci5weQpAQCAtMTcsNzEgKzE3LDExNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IEJhc2VIVFRQU2VydmVyCitpbXBvcnQgc3NsCiAKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBCYXNlSFRUUFNlcnZlcgorCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRNZXNzYWdlVHlwZQogZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIAogCiBjbGFzcyBSZXNwb25zZUV4Y2VwdGlvbihFeGNlcHRpb24pOgotICAiIiJBbGxvd3MgaGFuZGxlcnMgdG8gb3ZlcnJpZGUgdGhlIEhUVFAgcmVzcG9uc2UKKyAgICAiIiJBbGxvd3MgaGFuZGxlcnMgdG8gb3ZlcnJpZGUgdGhlIEhUVFAgcmVzcG9uc2UKIAotICBOb3JtYWxseSwgVEh0dHBTZXJ2ZXIgYWx3YXlzIHNlbmRzIGEgMjAwIHJlc3BvbnNlLiAgSWYgYSBoYW5kbGVyIHdhbnRzCi0gIHRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgKGUuZy4sIHRvIHNpbXVsYXRlIGEgbWlzY29uZmlndXJlZCBvcgotICBvdmVybG9hZGVkIHdlYiBzZXJ2ZXIgZHVyaW5nIHRlc3RpbmcpLCBpdCBjYW4gcmFpc2UgYSBSZXNwb25zZUV4Y2VwdGlvbi4KLSAgVGhlIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKLSAgUmVxdWVzdEhhbmRsZXIgYXMgaXRzIG9ubHkgYXJndW1lbnQuCi0gICIiIgotICBkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlcik6Ci0gICAgc2VsZi5oYW5kbGVyID0gaGFuZGxlcgorICAgIE5vcm1hbGx5LCBUSHR0cFNlcnZlciBhbHdheXMgc2VuZHMgYSAyMDAgcmVzcG9uc2UuICBJZiBhIGhhbmRsZXIgd2FudHMKKyAgICB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIChlLmcuLCB0byBzaW11bGF0ZSBhIG1pc2NvbmZpZ3VyZWQgb3IKKyAgICBvdmVybG9hZGVkIHdlYiBzZXJ2ZXIgZHVyaW5nIHRlc3RpbmcpLCBpdCBjYW4gcmFpc2UgYSBSZXNwb25zZUV4Y2VwdGlvbi4KKyAgICBUaGUgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZQorICAgIFJlcXVlc3RIYW5kbGVyIGFzIGl0cyBvbmx5IGFyZ3VtZW50LiAgTm90ZSB0aGF0IHRoaXMgaXMgaXJyZWxldmFudAorICAgIGZvciBPTkVXQVkgcmVxdWVzdHMsIGFzIHRoZSBIVFRQIHJlc3BvbnNlIG11c3QgYmUgc2VudCBiZWZvcmUgdGhlCisgICAgUlBDIGlzIHByb2Nlc3NlZC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlcik6CisgICAgICAgIHNlbGYuaGFuZGxlciA9IGhhbmRsZXIKIAogCiBjbGFzcyBUSHR0cFNlcnZlcihUU2VydmVyLlRTZXJ2ZXIpOgotICAiIiJBIHNpbXBsZSBIVFRQLWJhc2VkIFRocmlmdCBzZXJ2ZXIKKyAgICAiIiJBIHNpbXBsZSBIVFRQLWJhc2VkIFRocmlmdCBzZXJ2ZXIKIAotICBUaGlzIGNsYXNzIGlzIG5vdCB2ZXJ5IHBlcmZvcm1hbnQsIGJ1dCBpdCBpcyB1c2VmdWwgKGZvciBleGFtcGxlKSBmb3IKLSAgYWN0aW5nIGFzIGEgbW9jayB2ZXJzaW9uIG9mIGFuIEFwYWNoZS1iYXNlZCBQSFAgVGhyaWZ0IGVuZHBvaW50LgotICAiIiIKLSAgZGVmIF9faW5pdF9fKHNlbGYsCi0gICAgICAgICAgICAgICBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICBzZXJ2ZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUsCi0gICAgICAgICAgICAgICBzZXJ2ZXJfY2xhc3M9QmFzZUhUVFBTZXJ2ZXIuSFRUUFNlcnZlcik6Ci0gICAgIiIiU2V0IHVwIHByb3RvY29sIGZhY3RvcmllcyBhbmQgSFRUUCBzZXJ2ZXIuCi0KLSAgICBTZWUgQmFzZUhUVFBTZXJ2ZXIgZm9yIHNlcnZlcl9hZGRyZXNzLgotICAgIFNlZSBUU2VydmVyIGZvciBwcm90b2NvbCBmYWN0b3JpZXMuCisgICAgVGhpcyBjbGFzcyBpcyBub3QgdmVyeSBwZXJmb3JtYW50LCBidXQgaXQgaXMgdXNlZnVsIChmb3IgZXhhbXBsZSkgZm9yCisgICAgYWN0aW5nIGFzIGEgbW9jayB2ZXJzaW9uIG9mIGFuIEFwYWNoZS1iYXNlZCBQSFAgVGhyaWZ0IGVuZHBvaW50LgorICAgIEFsc28gaW1wb3J0YW50IHRvIG5vdGUgdGhlIEhUVFAgaW1wbGVtZW50YXRpb24gcHJldHR5IG11Y2ggdmlvbGF0ZXMgdGhlCisgICAgdHJhbnNwb3J0L3Byb3RvY29sL3Byb2Nlc3Nvci9zZXJ2ZXIgbGF5ZXJpbmcsIGJ5IHBlcmZvcm1pbmcgdGhlIHRyYW5zcG9ydAorICAgIGZ1bmN0aW9ucyBoZXJlLiAgVGhpcyBtZWFucyB0aGluZ3MgbGlrZSBvbmV3YXkgaGFuZGxpbmcgYXJlIG9kZGx5IGV4cG9zZWQuCiAgICAgIiIiCi0gICAgaWYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IGlzIE5vbmU6Ci0gICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeQorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHNlcnZlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUsCisgICAgICAgICAgICAgICAgIHNlcnZlcl9jbGFzcz1CYXNlSFRUUFNlcnZlci5IVFRQU2VydmVyLAorICAgICAgICAgICAgICAgICAqKmt3YXJncyk6CisgICAgICAgICIiIlNldCB1cCBwcm90b2NvbCBmYWN0b3JpZXMgYW5kIEhUVFAgKG9yIEhUVFBTKSBzZXJ2ZXIuCiAKLSAgICBUU2VydmVyLlRTZXJ2ZXIuX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBOb25lLCBOb25lLCBOb25lLAotICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgICAgICBTZWUgQmFzZUhUVFBTZXJ2ZXIgZm9yIHNlcnZlcl9hZGRyZXNzLgorICAgICAgICBTZWUgVFNlcnZlciBmb3IgcHJvdG9jb2wgZmFjdG9yaWVzLgogCi0gICAgdGh0dHBzZXJ2ZXIgPSBzZWxmCisgICAgICAgIFRvIG1ha2UgYSBzZWN1cmUgc2VydmVyLCBwcm92aWRlIHRoZSBuYW1lZCBhcmd1bWVudHM6CisgICAgICAgICogY2FmaWxlICAgIC0gdG8gdmFsaWRhdGUgY2xpZW50cyBbb3B0aW9uYWxdCisgICAgICAgICogY2VydF9maWxlIC0gdGhlIHNlcnZlciBjZXJ0CisgICAgICAgICoga2V5X2ZpbGUgIC0gdGhlIHNlcnZlcidzIGtleQorICAgICAgICAiIiIKKyAgICAgICAgaWYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IGlzIE5vbmU6CisgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeQogCi0gICAgY2xhc3MgUmVxdWVzdEhhbmRlcihCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKLSAgICAgIGRlZiBkb19QT1NUKHNlbGYpOgotICAgICAgICAjIERvbid0IGNhcmUgYWJvdXQgdGhlIHJlcXVlc3QgcGF0aC4KLSAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLnJmaWxlKQotICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRGaWxlT2JqZWN0VHJhbnNwb3J0KHNlbGYud2ZpbGUpCi0gICAgICAgIGl0cmFucyA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAotICAgICAgICAgIGl0cmFucywgaW50KHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSkpCi0gICAgICAgIG90cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgICAgIGlwcm90ID0gdGh0dHBzZXJ2ZXIuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgICBvcHJvdCA9IHRodHRwc2VydmVyLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgICAgIHRyeToKLSAgICAgICAgICB0aHR0cHNlcnZlci5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgICAgIGV4Y2VwdCBSZXNwb25zZUV4Y2VwdGlvbiBhcyBleG46Ci0gICAgICAgICAgZXhuLmhhbmRsZXIoc2VsZikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQotICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoImNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCi0gICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCi0gICAgICAgICAgc2VsZi53ZmlsZS53cml0ZShvdHJhbnMuZ2V0dmFsdWUoKSkKKyAgICAgICAgVFNlcnZlci5UU2VydmVyLl9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgTm9uZSwgTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCiAKLSAgICBzZWxmLmh0dHBkID0gc2VydmVyX2NsYXNzKHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGVyKQorICAgICAgICB0aHR0cHNlcnZlciA9IHNlbGYKKyAgICAgICAgc2VsZi5fcmVwbGllZCA9IE5vbmUKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgc2VsZi5odHRwZC5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICAgY2xhc3MgUmVxdWVzdEhhbmRlcihCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKKyAgICAgICAgICAgIGRlZiBkb19QT1NUKHNlbGYpOgorICAgICAgICAgICAgICAgICMgRG9uJ3QgY2FyZSBhYm91dCB0aGUgcmVxdWVzdCBwYXRoLgorICAgICAgICAgICAgICAgIHRodHRwc2VydmVyLl9yZXBsaWVkID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZnRyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLnJmaWxlKQorICAgICAgICAgICAgICAgIGl0cmFucyA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgICAgICBpZnRyYW5zLCBpbnQoc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddKSkKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICAgICAgICAgIGlwcm90ID0gdGh0dHBzZXJ2ZXIuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQorICAgICAgICAgICAgICAgIG9wcm90ID0gdGh0dHBzZXJ2ZXIub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRodHRwc2VydmVyLnByb2Nlc3Nvci5vbl9tZXNzYWdlX2JlZ2luKHNlbGYub25fYmVnaW4pCisgICAgICAgICAgICAgICAgICAgIHRodHRwc2VydmVyLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgICAgICAgICBleGNlcHQgUmVzcG9uc2VFeGNlcHRpb24gYXMgZXhuOgorICAgICAgICAgICAgICAgICAgICBleG4uaGFuZGxlcihzZWxmKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCB0aHR0cHNlcnZlci5fcmVwbGllZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgdGhlIHJlcXVlc3Qgd2FzIE9ORVdBWSB3ZSB3b3VsZCBoYXZlIHJlcGxpZWQgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG90cmFucy5nZXR2YWx1ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBsZW4oZGF0YSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKGRhdGEpCisKKyAgICAgICAgICAgIGRlZiBvbl9iZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6CisgICAgICAgICAgICAgICAgIiIiCisgICAgICAgICAgICAgICAgSW5zcGVjdCB0aGUgbWVzc2FnZSBoZWFkZXIuCisKKyAgICAgICAgICAgICAgICBUaGlzIGFsbG93cyB1cyB0byBwb3N0IGFuIGltbWVkaWF0ZSB0cmFuc3BvcnQgcmVzcG9uc2UKKyAgICAgICAgICAgICAgICBpZiB0aGUgcmVxdWVzdCBpcyBhIE9ORVdBWSBtZXNzYWdlIHR5cGUuCisgICAgICAgICAgICAgICAgIiIiCisgICAgICAgICAgICAgICAgaWYgdHlwZSA9PSBUTWVzc2FnZVR5cGUuT05FV0FZOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKyAgICAgICAgICAgICAgICAgICAgdGh0dHBzZXJ2ZXIuX3JlcGxpZWQgPSBUcnVlCisKKyAgICAgICAgc2VsZi5odHRwZCA9IHNlcnZlcl9jbGFzcyhzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRlcikKKworICAgICAgICBpZiAoa3dhcmdzLmdldCgnY2FmaWxlJykgb3Iga3dhcmdzLmdldCgnY2VydF9maWxlJykgb3Iga3dhcmdzLmdldCgna2V5X2ZpbGUnKSk6CisgICAgICAgICAgICBjb250ZXh0ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoY2FmaWxlPWt3YXJncy5nZXQoJ2NhZmlsZScpKQorICAgICAgICAgICAgY29udGV4dC5jaGVja19ob3N0bmFtZSA9IEZhbHNlCisgICAgICAgICAgICBjb250ZXh0LmxvYWRfY2VydF9jaGFpbihrd2FyZ3MuZ2V0KCdjZXJ0X2ZpbGUnKSwga3dhcmdzLmdldCgna2V5X2ZpbGUnKSkKKyAgICAgICAgICAgIGNvbnRleHQudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRCBpZiBrd2FyZ3MuZ2V0KCdjYWZpbGUnKSBlbHNlIHNzbC5DRVJUX05PTkUKKyAgICAgICAgICAgIHNlbGYuaHR0cGQuc29ja2V0ID0gY29udGV4dC53cmFwX3NvY2tldChzZWxmLmh0dHBkLnNvY2tldCwgc2VydmVyX3NpZGU9VHJ1ZSkKKworICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgc2VsZi5odHRwZC5zZXJ2ZV9mb3JldmVyKCkKKworICAgIGRlZiBzaHV0ZG93bihzZWxmKToKKyAgICAgICAgc2VsZi5odHRwZC5zb2NrZXQuY2xvc2UoKQorICAgICAgICAjIHNlbGYuaHR0cGQuc2h1dGRvd24oKSAjIGhhbmdzIGZvcmV2ZXIsIHB5dGhvbiBkb2Vzbid0IGhhbmRsZSBQT0xMTlZBTCBwcm9wZXJseSEKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5weSBiL2xpYi9weS9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5weQppbmRleCAzOTQ4NmNkLi5mNjJkNDg2IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIucHkKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLnB5CkBAIC0yNCwyMCArMjQsMjMgQEAKIFRoZSB0aHJlYWQgcG9vb2wgc2hvdWxkIGJlIHNpemVkIGZvciBjb25jdXJyZW50IHRhc2tzLCBub3QKIG1heGltdW0gY29ubmVjdGlvbnMKICIiIgotaW1wb3J0IHRocmVhZGluZwotaW1wb3J0IHNvY2tldAotaW1wb3J0IFF1ZXVlCi1pbXBvcnQgc2VsZWN0Ci1pbXBvcnQgc3RydWN0CiAKIGltcG9ydCBsb2dnaW5nCi1sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKK2ltcG9ydCBzZWxlY3QKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB0aHJlYWRpbmcKKworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBxdWV1ZQogCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sRmFjdG9yeQogCiBfX2FsbF9fID0gWydUTm9uYmxvY2tpbmdTZXJ2ZXInXQogCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKwogCiBjbGFzcyBXb3JrZXIodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgIiIiV29ya2VyIGlzIGEgc21hbGwgaGVscGVyIHRvIHByb2Nlc3MgaW5jb21pbmcgY29ubmVjdGlvbi4iIiIKQEAgLTU2LDggKzU5LDkgQEAKICAgICAgICAgICAgICAgICBwcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCiAgICAgICAgICAgICAgICAgY2FsbGJhY2soVHJ1ZSwgb3RyYW5zLmdldHZhbHVlKCkpCiAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgotICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QiKQotICAgICAgICAgICAgICAgIGNhbGxiYWNrKEZhbHNlLCAnJykKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0IiwgZXhjX2luZm89VHJ1ZSkKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhGYWxzZSwgYicnKQorCiAKIFdBSVRfTEVOID0gMAogV0FJVF9NRVNTQUdFID0gMQpAQCAtODMsMTEgKzg3LDI0IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJldHVybiBmdW5jKHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnaWdub3Jpbmcgc29ja2V0IGV4Y2VwdGlvbicsIGV4Y19pbmZvPVRydWUpCiAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICByZXR1cm4gcmVhZAogCiAKLWNsYXNzIENvbm5lY3Rpb246CitjbGFzcyBNZXNzYWdlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9mZnNldCwgbGVuXywgaGVhZGVyKToKKyAgICAgICAgc2VsZi5vZmZzZXQgPSBvZmZzZXQKKyAgICAgICAgc2VsZi5sZW4gPSBsZW5fCisgICAgICAgIHNlbGYuYnVmZmVyID0gTm9uZQorICAgICAgICBzZWxmLmlzX2hlYWRlciA9IGhlYWRlcgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYub2Zmc2V0ICsgc2VsZi5sZW4KKworCitjbGFzcyBDb25uZWN0aW9uKG9iamVjdCk6CiAgICAgIiIiQmFzaWMgY2xhc3MgaXMgcmVwcmVzZW50ZWQgY29ubmVjdGlvbi4KIAogICAgIEl0IGNhbiBiZSBpbiBzdGF0ZToKQEAgLTEwNCw2OCArMTIxLDYwIEBACiAgICAgICAgIHNlbGYuc29ja2V0LnNldGJsb2NraW5nKEZhbHNlKQogICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfTEVOCiAgICAgICAgIHNlbGYubGVuID0gMAotICAgICAgICBzZWxmLm1lc3NhZ2UgPSAnJworICAgICAgICBzZWxmLnJlY2VpdmVkID0gZGVxdWUoKQorICAgICAgICBzZWxmLl9yZWFkaW5nID0gTWVzc2FnZSgwLCA0LCBUcnVlKQorICAgICAgICBzZWxmLl9yYnVmID0gYicnCisgICAgICAgIHNlbGYuX3didWYgPSBiJycKICAgICAgICAgc2VsZi5sb2NrID0gdGhyZWFkaW5nLkxvY2soKQogICAgICAgICBzZWxmLndha2VfdXAgPSB3YWtlX3VwCi0KLSAgICBkZWYgX3JlYWRfbGVuKHNlbGYpOgotICAgICAgICAiIiJSZWFkcyBsZW5ndGggb2YgcmVxdWVzdC4KLQotICAgICAgICBJdCdzIGEgc2FmZXIgYWx0ZXJuYXRpdmUgdG8gc2VsZi5zb2NrZXQucmVjdig0KQotICAgICAgICAiIiIKLSAgICAgICAgcmVhZCA9IHNlbGYuc29ja2V0LnJlY3YoNCAtIGxlbihzZWxmLm1lc3NhZ2UpKQotICAgICAgICBpZiBsZW4ocmVhZCkgPT0gMDoKLSAgICAgICAgICAgICMgaWYgd2UgcmVhZCAwIGJ5dGVzIGFuZCBzZWxmLm1lc3NhZ2UgaXMgZW1wdHksIHRoZW4KLSAgICAgICAgICAgICMgdGhlIGNsaWVudCBjbG9zZWQgdGhlIGNvbm5lY3Rpb24KLSAgICAgICAgICAgIGlmIGxlbihzZWxmLm1lc3NhZ2UpICE9IDA6Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJjYW4ndCByZWFkIGZyYW1lIHNpemUgZnJvbSBzb2NrZXQiKQotICAgICAgICAgICAgc2VsZi5jbG9zZSgpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5tZXNzYWdlICs9IHJlYWQKLSAgICAgICAgaWYgbGVuKHNlbGYubWVzc2FnZSkgPT0gNDoKLSAgICAgICAgICAgIHNlbGYubGVuLCA9IHN0cnVjdC51bnBhY2soJyFpJywgc2VsZi5tZXNzYWdlKQotICAgICAgICAgICAgaWYgc2VsZi5sZW4gPCAwOgotICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigibmVnYXRpdmUgZnJhbWUgc2l6ZSwgaXQgc2VlbXMgY2xpZW50ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb2Vzbid0IHVzZSBGcmFtZWRUcmFuc3BvcnQiKQotICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAgICAgZWxpZiBzZWxmLmxlbiA9PSAwOgotICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiZW1wdHkgZnJhbWUsIGl0J3MgcmVhbGx5IHN0cmFuZ2UiKQotICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSAnJwotICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9NRVNTQUdFCisgICAgICAgIHNlbGYucmVtYWluaW5nID0gRmFsc2UKIAogICAgIEBzb2NrZXRfZXhjZXB0aW9uCiAgICAgZGVmIHJlYWQoc2VsZik6CiAgICAgICAgICIiIlJlYWRzIGRhdGEgZnJvbSBzdHJlYW0gYW5kIHN3aXRjaCBzdGF0ZS4iIiIKICAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdHVzIGluIChXQUlUX0xFTiwgV0FJVF9NRVNTQUdFKQotICAgICAgICBpZiBzZWxmLnN0YXR1cyA9PSBXQUlUX0xFTjoKLSAgICAgICAgICAgIHNlbGYuX3JlYWRfbGVuKCkKLSAgICAgICAgICAgICMgZ28gYmFjayB0byB0aGUgbWFpbiBsb29wIGhlcmUgZm9yIHNpbXBsaWNpdHkgaW5zdGVhZCBvZgotICAgICAgICAgICAgIyBmYWxsaW5nIHRocm91Z2gsIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIGEgZ29vZCBjaGFuY2UgdGhhdAotICAgICAgICAgICAgIyB0aGUgbWVzc2FnZSBpcyBhbHJlYWR5IGF2YWlsYWJsZQotICAgICAgICBlbGlmIHNlbGYuc3RhdHVzID09IFdBSVRfTUVTU0FHRToKLSAgICAgICAgICAgIHJlYWQgPSBzZWxmLnNvY2tldC5yZWN2KHNlbGYubGVuIC0gbGVuKHNlbGYubWVzc2FnZSkpCi0gICAgICAgICAgICBpZiBsZW4ocmVhZCkgPT0gMDoKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoImNhbid0IHJlYWQgZnJhbWUgZnJvbSBzb2NrZXQgKGdldCAlZCBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgYnl0ZXMpIiAlIChsZW4oc2VsZi5tZXNzYWdlKSwgc2VsZi5sZW4pKQorICAgICAgICBhc3NlcnQgbm90IHNlbGYucmVjZWl2ZWQKKyAgICAgICAgYnVmX3NpemUgPSA4MTkyCisgICAgICAgIGZpcnN0ID0gVHJ1ZQorICAgICAgICBkb25lID0gRmFsc2UKKyAgICAgICAgd2hpbGUgbm90IGRvbmU6CisgICAgICAgICAgICByZWFkID0gc2VsZi5zb2NrZXQucmVjdihidWZfc2l6ZSkKKyAgICAgICAgICAgIHJsZW4gPSBsZW4ocmVhZCkKKyAgICAgICAgICAgIGRvbmUgPSBybGVuIDwgYnVmX3NpemUKKyAgICAgICAgICAgIHNlbGYuX3JidWYgKz0gcmVhZAorICAgICAgICAgICAgaWYgZmlyc3QgYW5kIHJsZW4gPT0gMDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0YXR1cyAhPSBXQUlUX0xFTiBvciBzZWxmLl9yYnVmOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ2NvdWxkIG5vdCByZWFkIGZyYW1lIGZyb20gc29ja2V0JykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ3JlYWQgemVybyBsZW5ndGguIGNsaWVudCBtaWdodCBoYXZlIGRpc2Nvbm5lY3RlZCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBzZWxmLm1lc3NhZ2UgKz0gcmVhZAotICAgICAgICAgICAgaWYgbGVuKHNlbGYubWVzc2FnZSkgPT0gc2VsZi5sZW46CisgICAgICAgICAgICB3aGlsZSBsZW4oc2VsZi5fcmJ1ZikgPj0gc2VsZi5fcmVhZGluZy5lbmQ6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fcmVhZGluZy5pc19oZWFkZXI6CisgICAgICAgICAgICAgICAgICAgIG1sZW4sID0gc3RydWN0LnVucGFjaygnIWknLCBzZWxmLl9yYnVmWzo0XSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVhZGluZyA9IE1lc3NhZ2Uoc2VsZi5fcmVhZGluZy5lbmQsIG1sZW4sIEZhbHNlKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfTUVTU0FHRQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRpbmcuYnVmZmVyID0gc2VsZi5fcmJ1ZgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY2VpdmVkLmFwcGVuZChzZWxmLl9yZWFkaW5nKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yYnVmID0gc2VsZi5fcmJ1ZltzZWxmLl9yZWFkaW5nLmVuZDpdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRpbmcgPSBNZXNzYWdlKDAsIDQsIFRydWUpCisgICAgICAgICAgICBmaXJzdCA9IEZhbHNlCisgICAgICAgICAgICBpZiBzZWxmLnJlY2VpdmVkOgogICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9QUk9DRVNTCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5yZW1haW5pbmcgPSBub3QgZG9uZQogCiAgICAgQHNvY2tldF9leGNlcHRpb24KICAgICBkZWYgd3JpdGUoc2VsZik6CiAgICAgICAgICIiIldyaXRlcyBkYXRhIGZyb20gc29ja2V0IGFuZCBzd2l0Y2ggc3RhdGUuIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBTRU5EX0FOU1dFUgotICAgICAgICBzZW50ID0gc2VsZi5zb2NrZXQuc2VuZChzZWxmLm1lc3NhZ2UpCi0gICAgICAgIGlmIHNlbnQgPT0gbGVuKHNlbGYubWVzc2FnZSk6CisgICAgICAgIHNlbnQgPSBzZWxmLnNvY2tldC5zZW5kKHNlbGYuX3didWYpCisgICAgICAgIGlmIHNlbnQgPT0gbGVuKHNlbGYuX3didWYpOgogICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX0xFTgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBiJycKICAgICAgICAgICAgIHNlbGYubGVuID0gMAogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gc2VsZi5tZXNzYWdlW3NlbnQ6XQorICAgICAgICAgICAgc2VsZi5fd2J1ZiA9IHNlbGYuX3didWZbc2VudDpdCiAKICAgICBAbG9ja2VkCiAgICAgZGVmIHJlYWR5KHNlbGYsIGFsbF9vaywgbWVzc2FnZSk6CkBAIC0xODUsMTMgKzE5NCwxMyBAQAogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLndha2VfdXAoKQogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYubGVuID0gJycKKyAgICAgICAgc2VsZi5sZW4gPSAwCiAgICAgICAgIGlmIGxlbihtZXNzYWdlKSA9PSAwOgogICAgICAgICAgICAgIyBpdCB3YXMgYSBvbmV3YXkgcmVxdWVzdCwgZG8gbm90IHdyaXRlIGFuc3dlcgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBiJycKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9MRU4KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IHN0cnVjdC5wYWNrKCchaScsIGxlbihtZXNzYWdlKSkgKyBtZXNzYWdlCisgICAgICAgICAgICBzZWxmLl93YnVmID0gc3RydWN0LnBhY2soJyFpJywgbGVuKG1lc3NhZ2UpKSArIG1lc3NhZ2UKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gU0VORF9BTlNXRVIKICAgICAgICAgc2VsZi53YWtlX3VwKCkKIApAQCAtMjIxLDcgKzIzMCw3IEBACiAgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKIAogCi1jbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXI6CitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXIob2JqZWN0KToKICAgICAiIiJOb24tYmxvY2tpbmcgc2VydmVyLiIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsCkBAIC0yMzYsNyArMjQ1LDcgQEAKICAgICAgICAgc2VsZi5vdXRfcHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnkgb3Igc2VsZi5pbl9wcm90b2NvbAogICAgICAgICBzZWxmLnRocmVhZHMgPSBpbnQodGhyZWFkcykKICAgICAgICAgc2VsZi5jbGllbnRzID0ge30KLSAgICAgICAgc2VsZi50YXNrcyA9IFF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi50YXNrcyA9IHF1ZXVlLlF1ZXVlKCkKICAgICAgICAgc2VsZi5fcmVhZCwgc2VsZi5fd3JpdGUgPSBzb2NrZXQuc29ja2V0cGFpcigpCiAgICAgICAgIHNlbGYucHJlcGFyZWQgPSBGYWxzZQogICAgICAgICBzZWxmLl9zdG9wID0gRmFsc2UKQEAgLTI1Miw3ICsyNjEsNyBAQAogICAgICAgICBpZiBzZWxmLnByZXBhcmVkOgogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHNlbGYuc29ja2V0Lmxpc3RlbigpCi0gICAgICAgIGZvciBfIGluIHhyYW5nZShzZWxmLnRocmVhZHMpOgorICAgICAgICBmb3IgXyBpbiByYW5nZShzZWxmLnRocmVhZHMpOgogICAgICAgICAgICAgdGhyZWFkID0gV29ya2VyKHNlbGYudGFza3MpCiAgICAgICAgICAgICB0aHJlYWQuc2V0RGFlbW9uKFRydWUpCiAgICAgICAgICAgICB0aHJlYWQuc3RhcnQoKQpAQCAtMjY5LDcgKzI3OCw3IEBACiAgICAgICAgIEluIHRoaXMgY2FzZSwgd2UgY2FuIGp1c3Qgd3JpdGUgYW55dGhpbmcgdG8gdGhlIHNlY29uZCBzb2NrZXQgZnJvbQogICAgICAgICBzb2NrZXRwYWlyLgogICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fd3JpdGUuc2VuZCgnMScpCisgICAgICAgIHNlbGYuX3dyaXRlLnNlbmQoYicxJykKIAogICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICAiIiJTdG9wIHRoZSBzZXJ2ZXIuCkBAIC0yOTAsMTQgKzI5OSwyMCBAQAogICAgICAgICAiIiJEb2VzIHNlbGVjdCBvbiBvcGVuIGNvbm5lY3Rpb25zLiIiIgogICAgICAgICByZWFkYWJsZSA9IFtzZWxmLnNvY2tldC5oYW5kbGUuZmlsZW5vKCksIHNlbGYuX3JlYWQuZmlsZW5vKCldCiAgICAgICAgIHdyaXRhYmxlID0gW10KLSAgICAgICAgZm9yIGksIGNvbm5lY3Rpb24gaW4gc2VsZi5jbGllbnRzLml0ZW1zKCk6CisgICAgICAgIHJlbWFpbmluZyA9IFtdCisgICAgICAgIGZvciBpLCBjb25uZWN0aW9uIGluIGxpc3Qoc2VsZi5jbGllbnRzLml0ZW1zKCkpOgogICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5pc19yZWFkYWJsZSgpOgogICAgICAgICAgICAgICAgIHJlYWRhYmxlLmFwcGVuZChjb25uZWN0aW9uLmZpbGVubygpKQorICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24ucmVtYWluaW5nIG9yIGNvbm5lY3Rpb24ucmVjZWl2ZWQ6CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy5hcHBlbmQoY29ubmVjdGlvbi5maWxlbm8oKSkKICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24uaXNfd3JpdGVhYmxlKCk6CiAgICAgICAgICAgICAgICAgd3JpdGFibGUuYXBwZW5kKGNvbm5lY3Rpb24uZmlsZW5vKCkpCiAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLmlzX2Nsb3NlZCgpOgogICAgICAgICAgICAgICAgIGRlbCBzZWxmLmNsaWVudHNbaV0KLSAgICAgICAgcmV0dXJuIHNlbGVjdC5zZWxlY3QocmVhZGFibGUsIHdyaXRhYmxlLCByZWFkYWJsZSkKKyAgICAgICAgaWYgcmVtYWluaW5nOgorICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZywgW10sIFtdLCBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGVjdC5zZWxlY3QocmVhZGFibGUsIHdyaXRhYmxlLCByZWFkYWJsZSkgKyAoVHJ1ZSwpCiAKICAgICBkZWYgaGFuZGxlKHNlbGYpOgogICAgICAgICAiIiJIYW5kbGUgcmVxdWVzdHMuCkBAIC0zMDUsMjAgKzMyMCwyNyBAQAogICAgICAgICBXQVJOSU5HISBZb3UgbXVzdCBjYWxsIHByZXBhcmUoKSBCRUZPUkUgY2FsbGluZyBoYW5kbGUoKQogICAgICAgICAiIiIKICAgICAgICAgYXNzZXJ0IHNlbGYucHJlcGFyZWQsICJZb3UgaGF2ZSB0byBjYWxsIHByZXBhcmUgYmVmb3JlIGhhbmRsZSIKLSAgICAgICAgcnNldCwgd3NldCwgeHNldCA9IHNlbGYuX3NlbGVjdCgpCisgICAgICAgIHJzZXQsIHdzZXQsIHhzZXQsIHNlbGVjdGVkID0gc2VsZi5fc2VsZWN0KCkKICAgICAgICAgZm9yIHJlYWRhYmxlIGluIHJzZXQ6CiAgICAgICAgICAgICBpZiByZWFkYWJsZSA9PSBzZWxmLl9yZWFkLmZpbGVubygpOgogICAgICAgICAgICAgICAgICMgZG9uJ3QgY2FyZSBpIGp1c3QgbmVlZCB0byBjbGVhbiByZWFkYWJsZSBmbGFnCiAgICAgICAgICAgICAgICAgc2VsZi5fcmVhZC5yZWN2KDEwMjQpCiAgICAgICAgICAgICBlbGlmIHJlYWRhYmxlID09IHNlbGYuc29ja2V0LmhhbmRsZS5maWxlbm8oKToKLSAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNvY2tldC5hY2NlcHQoKS5oYW5kbGUKLSAgICAgICAgICAgICAgICBzZWxmLmNsaWVudHNbY2xpZW50LmZpbGVubygpXSA9IENvbm5lY3Rpb24oY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndha2VfdXApCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNvY2tldC5hY2NlcHQoKQorICAgICAgICAgICAgICAgICAgICBpZiBjbGllbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudHNbY2xpZW50LmhhbmRsZS5maWxlbm8oKV0gPSBDb25uZWN0aW9uKGNsaWVudC5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2FrZV91cCkKKyAgICAgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2Vycm9yIHdoaWxlIGFjY2VwdGluZycsIGV4Y19pbmZvPVRydWUpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBzZWxmLmNsaWVudHNbcmVhZGFibGVdCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWFkKCkKLSAgICAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLnN0YXR1cyA9PSBXQUlUX1BST0NFU1M6Ci0gICAgICAgICAgICAgICAgICAgIGl0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoY29ubmVjdGlvbi5tZXNzYWdlKQorICAgICAgICAgICAgICAgIGlmIHNlbGVjdGVkOgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlYWQoKQorICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24ucmVjZWl2ZWQ6CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc3RhdHVzID0gV0FJVF9QUk9DRVNTCisgICAgICAgICAgICAgICAgICAgIG1zZyA9IGNvbm5lY3Rpb24ucmVjZWl2ZWQucG9wbGVmdCgpCisgICAgICAgICAgICAgICAgICAgIGl0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIobXNnLmJ1ZmZlciwgbXNnLm9mZnNldCkKICAgICAgICAgICAgICAgICAgICAgb3RyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCiAgICAgICAgICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbl9wcm90b2NvbC5nZXRQcm90b2NvbChpdHJhbnNwb3J0KQogICAgICAgICAgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0X3Byb3RvY29sLmdldFByb3RvY29sKG90cmFuc3BvcnQpCkBAIC0zMzIsNyArMzU0LDcgQEAKIAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgIiIiQ2xvc2VzIHRoZSBzZXJ2ZXIuIiIiCi0gICAgICAgIGZvciBfIGluIHhyYW5nZShzZWxmLnRocmVhZHMpOgorICAgICAgICBmb3IgXyBpbiByYW5nZShzZWxmLnRocmVhZHMpOgogICAgICAgICAgICAgc2VsZi50YXNrcy5wdXQoW05vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmVdKQogICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCiAgICAgICAgIHNlbGYucHJlcGFyZWQgPSBGYWxzZQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9zZXJ2ZXIvVFByb2Nlc3NQb29sU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFByb2Nlc3NQb29sU2VydmVyLnB5CmluZGV4IGFlN2ZlMWMuLmZlNmRjODEgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvc2VydmVyL1RQcm9jZXNzUG9vbFNlcnZlci5weQorKysgYi9saWIvcHkvc3JjL3NlcnZlci9UUHJvY2Vzc1Bvb2xTZXJ2ZXIucHkKQEAgLTE5LDEzICsxOSwxNCBAQAogCiAKIGltcG9ydCBsb2dnaW5nCi1sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKIAotZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0ICBQcm9jZXNzLCBWYWx1ZSwgQ29uZGl0aW9uLCByZWR1Y3Rpb24KK2Zyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBQcm9jZXNzLCBWYWx1ZSwgQ29uZGl0aW9uCiAKLWZyb20gVFNlcnZlciBpbXBvcnQgVFNlcnZlcgorZnJvbSAuVFNlcnZlciBpbXBvcnQgVFNlcnZlcgogZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KIAorbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKIAogY2xhc3MgVFByb2Nlc3NQb29sU2VydmVyKFRTZXJ2ZXIpOgogICAgICIiIlNlcnZlciB3aXRoIGEgZml4ZWQgc2l6ZSBwb29sIG9mIHdvcmtlciBzdWJwcm9jZXNzZXMgdG8gc2VydmljZSByZXF1ZXN0cwpAQCAtNTksNyArNjAsNyBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCiAgICAgICAgICAgICAgICAgaWYgbm90IGNsaWVudDoKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZUNsaWVudChjbGllbnQpCiAgICAgICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKICAgICAgICAgICAgICAgICByZXR1cm4gMApAQCAtNzYsNyArNzcsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgICAgICBleGNlcHQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyB0eDoKKyAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnRFeGNlcHRpb246CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1RTZXJ2ZXIucHkgYi9saWIvcHkvc3JjL3NlcnZlci9UU2VydmVyLnB5CmluZGV4IDhjNThlMzkuLmRmMmE3YmIgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvc2VydmVyL1RTZXJ2ZXIucHkKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFNlcnZlci5weQpAQCAtMTcsMjYzICsxNywzMDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBRdWV1ZQotaW1wb3J0IG9zCi1pbXBvcnQgc3lzCi1pbXBvcnQgdGhyZWFkaW5nCi1pbXBvcnQgdHJhY2ViYWNrCi0KK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBxdWV1ZQogaW1wb3J0IGxvZ2dpbmcKLWxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoraW1wb3J0IG9zCitpbXBvcnQgdGhyZWFkaW5nCiAKLWZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFByb2Nlc3NvcgogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEhlYWRlclByb3RvY29sIGltcG9ydCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIAorbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAKLWNsYXNzIFRTZXJ2ZXI6Ci0gICIiIkJhc2UgaW50ZXJmYWNlIGZvciBhIHNlcnZlciwgd2hpY2ggbXVzdCBoYXZlIGEgc2VydmUoKSBtZXRob2QuCiAKLSAgVGhyZWUgY29uc3RydWN0b3JzIGZvciBhbGwgc2VydmVyczoKLSAgMSkgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KQotICAyKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKLSAgMykgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSkKLSAgIiIiCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0gICAgaWYgKGxlbihhcmdzKSA9PSAyKToKLSAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5QmFzZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeUJhc2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQotICAgIGVsaWYgKGxlbihhcmdzKSA9PSA0KToKLSAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbM10pCi0gICAgZWxpZiAobGVuKGFyZ3MpID09IDYpOgotICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSkKK2NsYXNzIFRTZXJ2ZXIob2JqZWN0KToKKyAgICAiIiJCYXNlIGludGVyZmFjZSBmb3IgYSBzZXJ2ZXIsIHdoaWNoIG11c3QgaGF2ZSBhIHNlcnZlKCkgbWV0aG9kLgogCi0gIGRlZiBfX2luaXRBcmdzX18oc2VsZiwgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOgotICAgIHNlbGYucHJvY2Vzc29yID0gcHJvY2Vzc29yCi0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQKLSAgICBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeQotICAgIHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkKLSAgICBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKLSAgICBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeQorICAgIFRocmVlIGNvbnN0cnVjdG9ycyBmb3IgYWxsIHNlcnZlcnM6CisgICAgMSkgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KQorICAgIDIpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorICAgIDMpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIChsZW4oYXJncykgPT0gMik6CisgICAgICAgICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeUJhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEZhY3RvcnlCYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKyAgICAgICAgZWxpZiAobGVuKGFyZ3MpID09IDQpOgorICAgICAgICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1szXSkKKyAgICAgICAgZWxpZiAobGVuKGFyZ3MpID09IDYpOgorICAgICAgICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSkKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBfX2luaXRBcmdzX18oc2VsZiwgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgc2VsZi5wcm9jZXNzb3IgPSBwcm9jZXNzb3IKKyAgICAgICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQKKyAgICAgICAgc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeQorICAgICAgICBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKworICAgICAgICBpbnB1dF9pc19oZWFkZXIgPSBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpCisgICAgICAgIG91dHB1dF9pc19oZWFkZXIgPSBpc2luc3RhbmNlKHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KQorICAgICAgICBpZiBhbnkoKGlucHV0X2lzX2hlYWRlciwgb3V0cHV0X2lzX2hlYWRlcikpIGFuZCBpbnB1dF9pc19oZWFkZXIgIT0gb3V0cHV0X2lzX2hlYWRlcjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRIZWFkZXJQcm90b2NvbCBzZXJ2ZXJzIHJlcXVpcmUgdGhhdCBib3RoIHRoZSBpbnB1dCBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IHByb3RvY29scyBhcmUgVEhlYWRlclByb3RvY29sLiIpCisKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHBhc3MKIAogCiBjbGFzcyBUU2ltcGxlU2VydmVyKFRTZXJ2ZXIpOgotICAiIiJTaW1wbGUgc2luZ2xlLXRocmVhZGVkIHNlcnZlciB0aGF0IGp1c3QgcHVtcHMgYXJvdW5kIG9uZSB0cmFuc3BvcnQuIiIiCisgICAgIiIiU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgdGhhdCBqdXN0IHB1bXBzIGFyb3VuZCBvbmUgdHJhbnNwb3J0LiIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0gICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQogCi0gIGRlZiBzZXJ2ZShzZWxmKToKLSAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQotICAgICAgaWYgbm90IGNsaWVudDoKLSAgICAgICAgY29udGludWUKLSAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCi0gICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKLSAgICAgIHRyeToKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCiAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGFzIHR4OgotICAgICAgICBwYXNzCi0gICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6Ci0gICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKyAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCisgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKLSAgICAgIGl0cmFucy5jbG9zZSgpCi0gICAgICBvdHJhbnMuY2xvc2UoKQorICAgICAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCisKKyAgICAgICAgICAgICMgZm9yIFRIZWFkZXJQcm90b2NvbCwgd2UgbXVzdCB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgaW5zdGFuY2UgZm9yCisgICAgICAgICAgICAjIGlucHV0IGFuZCBvdXRwdXQgc28gdGhhdCB0aGUgcmVzcG9uc2UgaXMgaW4gdGhlIHNhbWUgZGlhbGVjdCB0aGF0CisgICAgICAgICAgICAjIHRoZSBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzIGluLgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICAgICAgb3Byb3QgPSBpcHJvdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgICAgICBpdHJhbnMuY2xvc2UoKQorICAgICAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgICAgIG90cmFucy5jbG9zZSgpCiAKIAogY2xhc3MgVFRocmVhZGVkU2VydmVyKFRTZXJ2ZXIpOgotICAiIiJUaHJlYWRlZCBzZXJ2ZXIgdGhhdCBzcGF3bnMgYSBuZXcgdGhyZWFkIHBlciBlYWNoIGNvbm5lY3Rpb24uIiIiCisgICAgIiIiVGhyZWFkZWQgc2VydmVyIHRoYXQgc3Bhd25zIGEgbmV3IHRocmVhZCBwZXIgZWFjaCBjb25uZWN0aW9uLiIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCi0gICAgc2VsZi5kYWVtb24gPSBrd2FyZ3MuZ2V0KCJkYWVtb24iLCBGYWxzZSkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgc2VsZi5kYWVtb24gPSBrd2FyZ3MuZ2V0KCJkYWVtb24iLCBGYWxzZSkKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgdHJ5OgotICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQotICAgICAgICBpZiBub3QgY2xpZW50OgotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLmhhbmRsZSwgYXJncz0oY2xpZW50LCkpCi0gICAgICAgIHQuc2V0RGFlbW9uKHNlbGYuZGFlbW9uKQotICAgICAgICB0LnN0YXJ0KCkKLSAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgcmFpc2UKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKLSAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBjbGllbnQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuaGFuZGxlLCBhcmdzPShjbGllbnQsKSkKKyAgICAgICAgICAgICAgICB0LnNldERhZW1vbihzZWxmLmRhZW1vbikKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAotICBkZWYgaGFuZGxlKHNlbGYsIGNsaWVudCk6Ci0gICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQotICAgIHRyeToKLSAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24gYXMgdHg6Ci0gICAgICBwYXNzCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgotICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorICAgIGRlZiBoYW5kbGUoc2VsZiwgY2xpZW50KToKKyAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKIAotICAgIGl0cmFucy5jbG9zZSgpCi0gICAgb3RyYW5zLmNsb3NlKCkKKyAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbCBpbnN0YW5jZSBmb3IgaW5wdXQKKyAgICAgICAgIyBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluIHRoZSBzYW1lIGRpYWxlY3QgdGhhdCB0aGUKKyAgICAgICAgIyBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzIGluLgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpOgorICAgICAgICAgICAgb3RyYW5zID0gTm9uZQorICAgICAgICAgICAgb3Byb3QgPSBpcHJvdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisKKyAgICAgICAgaXRyYW5zLmNsb3NlKCkKKyAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgb3RyYW5zLmNsb3NlKCkKIAogCiBjbGFzcyBUVGhyZWFkUG9vbFNlcnZlcihUU2VydmVyKToKLSAgIiIiU2VydmVyIHdpdGggYSBmaXhlZCBzaXplIHBvb2wgb2YgdGhyZWFkcyB3aGljaCBzZXJ2aWNlIHJlcXVlc3RzLiIiIgorICAgICIiIlNlcnZlciB3aXRoIGEgZml4ZWQgc2l6ZSBwb29sIG9mIHRocmVhZHMgd2hpY2ggc2VydmljZSByZXF1ZXN0cy4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKLSAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQotICAgIHNlbGYuY2xpZW50cyA9IFF1ZXVlLlF1ZXVlKCkKLSAgICBzZWxmLnRocmVhZHMgPSAxMAotICAgIHNlbGYuZGFlbW9uID0ga3dhcmdzLmdldCgiZGFlbW9uIiwgRmFsc2UpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgIHNlbGYuY2xpZW50cyA9IHF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi50aHJlYWRzID0gMTAKKyAgICAgICAgc2VsZi5kYWVtb24gPSBrd2FyZ3MuZ2V0KCJkYWVtb24iLCBGYWxzZSkKIAotICBkZWYgc2V0TnVtVGhyZWFkcyhzZWxmLCBudW0pOgotICAgICIiIlNldCB0aGUgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWQiIiIKLSAgICBzZWxmLnRocmVhZHMgPSBudW0KKyAgICBkZWYgc2V0TnVtVGhyZWFkcyhzZWxmLCBudW0pOgorICAgICAgICAiIiJTZXQgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB0aGF0IHNob3VsZCBiZSBjcmVhdGVkIiIiCisgICAgICAgIHNlbGYudGhyZWFkcyA9IG51bQogCi0gIGRlZiBzZXJ2ZVRocmVhZChzZWxmKToKLSAgICAiIiJMb29wIGFyb3VuZCBnZXR0aW5nIGNsaWVudHMgZnJvbSB0aGUgc2hhcmVkIHF1ZXVlIGFuZCBwcm9jZXNzIHRoZW0uIiIiCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHRyeToKLSAgICAgICAgY2xpZW50ID0gc2VsZi5jbGllbnRzLmdldCgpCi0gICAgICAgIHNlbGYuc2VydmVDbGllbnQoY2xpZW50KQotICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgotICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisgICAgZGVmIHNlcnZlVGhyZWFkKHNlbGYpOgorICAgICAgICAiIiJMb29wIGFyb3VuZCBnZXR0aW5nIGNsaWVudHMgZnJvbSB0aGUgc2hhcmVkIHF1ZXVlIGFuZCBwcm9jZXNzIHRoZW0uIiIiCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5jbGllbnRzLmdldCgpCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZUNsaWVudChjbGllbnQpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCi0gIGRlZiBzZXJ2ZUNsaWVudChzZWxmLCBjbGllbnQpOgotICAgICIiIlByb2Nlc3MgaW5wdXQvb3V0cHV0IGZyb20gYSBjbGllbnQgZm9yIGFzIGxvbmcgYXMgcG9zc2libGUiIiIKLSAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCi0gICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgdHJ5OgotICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyB0eDoKLSAgICAgIHBhc3MKLSAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6Ci0gICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisgICAgZGVmIHNlcnZlQ2xpZW50KHNlbGYsIGNsaWVudCk6CisgICAgICAgICIiIlByb2Nlc3MgaW5wdXQvb3V0cHV0IGZyb20gYSBjbGllbnQgZm9yIGFzIGxvbmcgYXMgcG9zc2libGUiIiIKKyAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKIAotICAgIGl0cmFucy5jbG9zZSgpCi0gICAgb3RyYW5zLmNsb3NlKCkKKyAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbCBpbnN0YW5jZSBmb3IgaW5wdXQKKyAgICAgICAgIyBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluIHRoZSBzYW1lIGRpYWxlY3QgdGhhdCB0aGUKKyAgICAgICAgIyBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzIGluLgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpOgorICAgICAgICAgICAgb3RyYW5zID0gTm9uZQorICAgICAgICAgICAgb3Byb3QgPSBpcHJvdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgIiIiU3RhcnQgYSBmaXhlZCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIHB1dCBjbGllbnQgaW50byBhIHF1ZXVlIiIiCi0gICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi50aHJlYWRzKToKLSAgICAgIHRyeToKLSAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuc2VydmVUaHJlYWQpCi0gICAgICAgIHQuc2V0RGFlbW9uKHNlbGYuZGFlbW9uKQotICAgICAgICB0LnN0YXJ0KCkKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKLSAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKLSAgICAjIFB1bXAgdGhlIHNvY2tldCBmb3IgY2xpZW50cwotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHRyeToKLSAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKLSAgICAgICAgaWYgbm90IGNsaWVudDoKLSAgICAgICAgICBjb250aW51ZQotICAgICAgICBzZWxmLmNsaWVudHMucHV0KGNsaWVudCkKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKLSAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorICAgICAgICBpdHJhbnMuY2xvc2UoKQorICAgICAgICBpZiBvdHJhbnM6CisgICAgICAgICAgICBvdHJhbnMuY2xvc2UoKQorCisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICAiIiJTdGFydCBhIGZpeGVkIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBhbmQgcHV0IGNsaWVudCBpbnRvIGEgcXVldWUiIiIKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi50aHJlYWRzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5zZXJ2ZVRocmVhZCkKKyAgICAgICAgICAgICAgICB0LnNldERhZW1vbihzZWxmLmRhZW1vbikKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisKKyAgICAgICAgIyBQdW1wIHRoZSBzb2NrZXQgZm9yIGNsaWVudHMKKyAgICAgICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBjbGllbnQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VsZi5jbGllbnRzLnB1dChjbGllbnQpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCiAKIGNsYXNzIFRGb3JraW5nU2VydmVyKFRTZXJ2ZXIpOgotICAiIiJBIFRocmlmdCBzZXJ2ZXIgdGhhdCBmb3JrcyBhIG5ldyBwcm9jZXNzIGZvciBlYWNoIHJlcXVlc3QKKyAgICAiIiJBIFRocmlmdCBzZXJ2ZXIgdGhhdCBmb3JrcyBhIG5ldyBwcm9jZXNzIGZvciBlYWNoIHJlcXVlc3QKIAotICBUaGlzIGlzIG1vcmUgc2NhbGFibGUgdGhhbiB0aGUgdGhyZWFkZWQgc2VydmVyIGFzIGl0IGRvZXMgbm90IGNhdXNlCi0gIEdJTCBjb250ZW50aW9uLgorICAgIFRoaXMgaXMgbW9yZSBzY2FsYWJsZSB0aGFuIHRoZSB0aHJlYWRlZCBzZXJ2ZXIgYXMgaXQgZG9lcyBub3QgY2F1c2UKKyAgICBHSUwgY29udGVudGlvbi4KIAotICBOb3RlIHRoYXQgdGhpcyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmcm9tIHRoZSB0aHJlYWRpbmcgc2VydmVyLgotICBTcGVjaWZpY2FsbHksIHVwZGF0ZXMgdG8gc2hhcmVkIHZhcmlhYmxlcyB3aWxsIG5vIGxvbmdlciBiZSBzaGFyZWQuCi0gIEl0IHdpbGwgYWxzbyBub3Qgd29yayBvbiB3aW5kb3dzLgorICAgIE5vdGUgdGhhdCB0aGlzIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIGZyb20gdGhlIHRocmVhZGluZyBzZXJ2ZXIuCisgICAgU3BlY2lmaWNhbGx5LCB1cGRhdGVzIHRvIHNoYXJlZCB2YXJpYWJsZXMgd2lsbCBubyBsb25nZXIgYmUgc2hhcmVkLgorICAgIEl0IHdpbGwgYWxzbyBub3Qgd29yayBvbiB3aW5kb3dzLgogCi0gIFRoaXMgY29kZSBpcyBoZWF2aWx5IGluc3BpcmVkIGJ5IFNvY2tldFNlcnZlci5Gb3JraW5nTWl4SW4gaW4gdGhlCi0gIFB5dGhvbiBzdGRsaWIuCi0gICIiIgotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgotICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCi0gICAgc2VsZi5jaGlsZHJlbiA9IFtdCisgICAgVGhpcyBjb2RlIGlzIGhlYXZpbHkgaW5zcGlyZWQgYnkgU29ja2V0U2VydmVyLkZvcmtpbmdNaXhJbiBpbiB0aGUKKyAgICBQeXRob24gc3RkbGliLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbXQogCi0gIGRlZiBzZXJ2ZShzZWxmKToKLSAgICBkZWYgdHJ5X2Nsb3NlKGZpbGUpOgotICAgICAgdHJ5OgotICAgICAgICBmaWxlLmNsb3NlKCkKLSAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6Ci0gICAgICAgIGxvZ2dlci53YXJuaW5nKGUsIGV4Y19pbmZvPVRydWUpCi0KLSAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQotICAgICAgaWYgbm90IGNsaWVudDoKLSAgICAgICAgY29udGludWUKLSAgICAgIHRyeToKLSAgICAgICAgcGlkID0gb3MuZm9yaygpCi0KLSAgICAgICAgaWYgcGlkOiAgIyBwYXJlbnQKLSAgICAgICAgICAjIGFkZCBiZWZvcmUgY29sbGVjdCwgb3RoZXJ3aXNlIHlvdSByYWNlIHcvIHdhaXRwaWQKLSAgICAgICAgICBzZWxmLmNoaWxkcmVuLmFwcGVuZChwaWQpCi0gICAgICAgICAgc2VsZi5jb2xsZWN0X2NoaWxkcmVuKCkKLQotICAgICAgICAgICMgUGFyZW50IG11c3QgY2xvc2Ugc29ja2V0IG9yIHRoZSBjb25uZWN0aW9uIG1heSBub3QgZ2V0Ci0gICAgICAgICAgIyBjbG9zZWQgcHJvbXB0bHkKLSAgICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgICAgIHRyeV9jbG9zZShpdHJhbnMpCi0gICAgICAgICAgdHJ5X2Nsb3NlKG90cmFucykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotCi0gICAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKLQotICAgICAgICAgIGVjb2RlID0gMAotICAgICAgICAgIHRyeToKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIGRlZiB0cnlfY2xvc2UoZmlsZSk6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGFzIHR4OgotICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oZSkKLSAgICAgICAgICAgICAgZWNvZGUgPSAxCi0gICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIHRyeV9jbG9zZShpdHJhbnMpCi0gICAgICAgICAgICB0cnlfY2xvc2Uob3RyYW5zKQorICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZyhlLCBleGNfaW5mbz1UcnVlKQogCi0gICAgICAgICAgb3MuX2V4aXQoZWNvZGUpCisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgaWYgbm90IGNsaWVudDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBpZCA9IG9zLmZvcmsoKQogCi0gICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGFzIHR4OgotICAgICAgICBwYXNzCi0gICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6Ci0gICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKyAgICAgICAgICAgICAgICBpZiBwaWQ6ICAjIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAjIGFkZCBiZWZvcmUgY29sbGVjdCwgb3RoZXJ3aXNlIHlvdSByYWNlIHcvIHdhaXRwaWQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQocGlkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQogCi0gIGRlZiBjb2xsZWN0X2NoaWxkcmVuKHNlbGYpOgotICAgIHdoaWxlIHNlbGYuY2hpbGRyZW46Ci0gICAgICB0cnk6Ci0gICAgICAgIHBpZCwgc3RhdHVzID0gb3Mud2FpdHBpZCgwLCBvcy5XTk9IQU5HKQotICAgICAgZXhjZXB0IG9zLmVycm9yOgotICAgICAgICBwaWQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICMgUGFyZW50IG11c3QgY2xvc2Ugc29ja2V0IG9yIHRoZSBjb25uZWN0aW9uIG1heSBub3QgZ2V0CisgICAgICAgICAgICAgICAgICAgICMgY2xvc2VkIHByb21wdGx5CisgICAgICAgICAgICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2UoaXRyYW5zKQorICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2Uob3RyYW5zKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCiAKLSAgICAgIGlmIHBpZDoKLSAgICAgICAgc2VsZi5jaGlsZHJlbi5yZW1vdmUocGlkKQotICAgICAgZWxzZToKLSAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbAorICAgICAgICAgICAgICAgICAgICAjIGluc3RhbmNlIGZvciBpbnB1dCBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluCisgICAgICAgICAgICAgICAgICAgICMgdGhlIHNhbWUgZGlhbGVjdCB0aGF0IHRoZSBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzCisgICAgICAgICAgICAgICAgICAgICMgaW4uCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICAgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBvcHJvdCA9IGlwcm90CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQorCisgICAgICAgICAgICAgICAgICAgIGVjb2RlID0gMAorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNvZGUgPSAxCisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2UoaXRyYW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeV9jbG9zZShvdHJhbnMpCisKKyAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoZWNvZGUpCisKKyAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgIGRlZiBjb2xsZWN0X2NoaWxkcmVuKHNlbGYpOgorICAgICAgICB3aGlsZSBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBpZCwgc3RhdHVzID0gb3Mud2FpdHBpZCgwLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBpZCA9IE5vbmUKKworICAgICAgICAgICAgaWYgcGlkOgorICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4ucmVtb3ZlKHBpZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDU2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LnB5CkBAIC0wLDAgKzEsMzUyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHN0cnVjdAoraW1wb3J0IHpsaWIKKworZnJvbSB0aHJpZnQuY29tcGF0IGltcG9ydCBCdWZmZXJJTywgYnl0ZV9pbmRleAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wsIHJlYWRWYXJpbnQsIHdyaXRlVmFyaW50Citmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0ICgKKyAgICBDUmVhZGFibGVUcmFuc3BvcnQsCisgICAgVE1lbW9yeUJ1ZmZlciwKKyAgICBUVHJhbnNwb3J0QmFzZSwKKyAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLAorKQorCisKK1UxNiA9IHN0cnVjdC5TdHJ1Y3QoIiFIIikKK0kzMiA9IHN0cnVjdC5TdHJ1Y3QoIiFpIikKK0hFQURFUl9NQUdJQyA9IDB4MEZGRgorSEFSRF9NQVhfRlJBTUVfU0laRSA9IDB4M0ZGRkZGRkYKKworCitjbGFzcyBUSGVhZGVyQ2xpZW50VHlwZShvYmplY3QpOgorICAgIEhFQURFUlMgPSAweDAwCisKKyAgICBGUkFNRURfQklOQVJZID0gMHgwMQorICAgIFVORlJBTUVEX0JJTkFSWSA9IDB4MDIKKworICAgIEZSQU1FRF9DT01QQUNUID0gMHgwMworICAgIFVORlJBTUVEX0NPTVBBQ1QgPSAweDA0CisKKworY2xhc3MgVEhlYWRlclN1YnByb3RvY29sSUQob2JqZWN0KToKKyAgICBCSU5BUlkgPSAweDAwCisgICAgQ09NUEFDVCA9IDB4MDIKKworCitjbGFzcyBUSW5mb0hlYWRlclR5cGUob2JqZWN0KToKKyAgICBLRVlfVkFMVUUgPSAweDAxCisKKworY2xhc3MgVEhlYWRlclRyYW5zZm9ybUlEKG9iamVjdCk6CisgICAgWkxJQiA9IDB4MDEKKworCitSRUFEX1RSQU5TRk9STVNfQllfSUQgPSB7CisgICAgVEhlYWRlclRyYW5zZm9ybUlELlpMSUI6IHpsaWIuZGVjb21wcmVzcywKK30KKworCitXUklURV9UUkFOU0ZPUk1TX0JZX0lEID0geworICAgIFRIZWFkZXJUcmFuc2Zvcm1JRC5aTElCOiB6bGliLmNvbXByZXNzLAorfQorCisKK2RlZiBfcmVhZFN0cmluZyh0cmFucyk6CisgICAgc2l6ZSA9IHJlYWRWYXJpbnQodHJhbnMpCisgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAiTmVnYXRpdmUgbGVuZ3RoIgorICAgICAgICApCisgICAgcmV0dXJuIHRyYW5zLnJlYWQoc2l6ZSkKKworCitkZWYgX3dyaXRlU3RyaW5nKHRyYW5zLCB2YWx1ZSk6CisgICAgd3JpdGVWYXJpbnQodHJhbnMsIGxlbih2YWx1ZSkpCisgICAgdHJhbnMud3JpdGUodmFsdWUpCisKKworY2xhc3MgVEhlYWRlclRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBhbGxvd2VkX2NsaWVudF90eXBlcyk6CisgICAgICAgIHNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgICAgICBzZWxmLl9jbGllbnRfdHlwZSA9IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlMKKyAgICAgICAgc2VsZi5fYWxsb3dlZF9jbGllbnRfdHlwZXMgPSBhbGxvd2VkX2NsaWVudF90eXBlcworCisgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gQnVmZmVySU8oYiIiKQorICAgICAgICBzZWxmLl9yZWFkX2hlYWRlcnMgPSB7fQorCisgICAgICAgIHNlbGYuX3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVycyA9IHt9CisgICAgICAgIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXMgPSBbXQorCisgICAgICAgIHNlbGYuZmxhZ3MgPSAwCisgICAgICAgIHNlbGYuc2VxdWVuY2VfaWQgPSAwCisgICAgICAgIHNlbGYuX3Byb3RvY29sX2lkID0gVEhlYWRlclN1YnByb3RvY29sSUQuQklOQVJZCisgICAgICAgIHNlbGYuX21heF9mcmFtZV9zaXplID0gSEFSRF9NQVhfRlJBTUVfU0laRQorCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RyYW5zcG9ydC5pc09wZW4oKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmFuc3BvcnQub3BlbigpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmFuc3BvcnQuY2xvc2UoKQorCisgICAgZGVmIGdldF9oZWFkZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9oZWFkZXJzCisKKyAgICBkZWYgc2V0X2hlYWRlcihzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoa2V5LCBieXRlcyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJoZWFkZXIgbmFtZXMgbXVzdCBiZSBieXRlcyIpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBieXRlcyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJoZWFkZXIgdmFsdWVzIG11c3QgYmUgYnl0ZXMiKQorICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzW2tleV0gPSB2YWx1ZQorCisgICAgZGVmIGNsZWFyX2hlYWRlcnMoc2VsZik6CisgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcnMuY2xlYXIoKQorCisgICAgZGVmIGFkZF90cmFuc2Zvcm0oc2VsZiwgdHJhbnNmb3JtX2lkKToKKyAgICAgICAgaWYgdHJhbnNmb3JtX2lkIG5vdCBpbiBXUklURV9UUkFOU0ZPUk1TX0JZX0lEOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biB0cmFuc2Zvcm0iKQorICAgICAgICBzZWxmLl93cml0ZV90cmFuc2Zvcm1zLmFwcGVuZCh0cmFuc2Zvcm1faWQpCisKKyAgICBkZWYgc2V0X21heF9mcmFtZV9zaXplKHNlbGYsIHNpemUpOgorICAgICAgICBpZiBub3QgMCA8IHNpemUgPCBIQVJEX01BWF9GUkFNRV9TSVpFOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibWF4aW11bSBmcmFtZSBzaXplIHNob3VsZCBiZSA8ICVkIGFuZCA+IDAiICUgSEFSRF9NQVhfRlJBTUVfU0laRSkKKyAgICAgICAgc2VsZi5fbWF4X2ZyYW1lX3NpemUgPSBzaXplCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcHJvdG9jb2xfaWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NsaWVudF90eXBlID09IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2xfaWQKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZKToKKyAgICAgICAgICAgIHJldHVybiBUSGVhZGVyU3VicHJvdG9jb2xJRC5CSU5BUlkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QsIFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgcmV0dXJuIFRIZWFkZXJTdWJwcm90b2NvbElELkNPTVBBQ1QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5JTlZBTElEX0NMSUVOVF9UWVBFLAorICAgICAgICAgICAgICAgICJQcm90b2NvbCBJRCBub3Qga25vdyBmb3IgY2xpZW50IHR5cGUgJWQiICUgc2VsZi5fY2xpZW50X3R5cGUsCisgICAgICAgICAgICApCisKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgICMgaWYgdGhlcmUgYXJlIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciwgcHJvZHVjZSB0aG9zZSBmaXJzdC4KKyAgICAgICAgYnl0ZXNfcmVhZCA9IHNlbGYuX3JlYWRfYnVmZmVyLnJlYWQoc3opCisgICAgICAgIGJ5dGVzX2xlZnRfdG9fcmVhZCA9IHN6IC0gbGVuKGJ5dGVzX3JlYWQpCisgICAgICAgIGlmIGJ5dGVzX2xlZnRfdG9fcmVhZCA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQKKworICAgICAgICAjIGlmIHdlJ3ZlIGRldGVybWluZWQgdGhpcyBpcyBhbiB1bmZyYW1lZCBjbGllbnQsIGp1c3QgcGFzcyB0aGUgcmVhZAorICAgICAgICAjIHRocm91Z2ggdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVudGlsIHdlJ3JlIHJlc2V0IGFnYWluIGF0IHRoZQorICAgICAgICAjIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBtZXNzYWdlLgorICAgICAgICBpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIHJldHVybiBieXRlc19yZWFkICsgc2VsZi5fdHJhbnNwb3J0LnJlYWQoYnl0ZXNfbGVmdF90b19yZWFkKQorCisgICAgICAgICMgd2UncmUgZW1wdHkgYW5kIChtYXliZSkgZnJhbWVkLiBmaWxsIHRoZSBidWZmZXJzIHdpdGggdGhlIG5leHQgZnJhbWUuCisgICAgICAgIHNlbGYucmVhZEZyYW1lKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKyAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQgKyBzZWxmLl9yZWFkX2J1ZmZlci5yZWFkKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKworICAgIGRlZiBfc2V0X2NsaWVudF90eXBlKHNlbGYsIGNsaWVudF90eXBlKToKKyAgICAgICAgaWYgY2xpZW50X3R5cGUgbm90IGluIHNlbGYuX2FsbG93ZWRfY2xpZW50X3R5cGVzOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIkNsaWVudCB0eXBlICVkIG5vdCBhbGxvd2VkIGJ5IHNlcnZlci4iICUgY2xpZW50X3R5cGUsCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuX2NsaWVudF90eXBlID0gY2xpZW50X3R5cGUKKworICAgIGRlZiByZWFkRnJhbWUoc2VsZiwgcmVxX3N6KToKKyAgICAgICAgIyB0aGUgZmlyc3Qgd29yZCBjb3VsZCBlaXRoZXIgYmUgdGhlIGxlbmd0aCBmaWVsZCBvZiBhIGZyYW1lZCBtZXNzYWdlCisgICAgICAgICMgb3IgdGhlIGZpcnN0IGJ5dGVzIG9mIGFuIHVuZnJhbWVkIG1lc3NhZ2UuCisgICAgICAgIGZpcnN0X3dvcmQgPSBzZWxmLl90cmFuc3BvcnQucmVhZEFsbChJMzIuc2l6ZSkKKyAgICAgICAgZnJhbWVfc2l6ZSwgPSBJMzIudW5wYWNrKGZpcnN0X3dvcmQpCisgICAgICAgIGlzX3VuZnJhbWVkID0gRmFsc2UKKyAgICAgICAgaWYgZnJhbWVfc2l6ZSAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlkpCisgICAgICAgICAgICBpc191bmZyYW1lZCA9IFRydWUKKyAgICAgICAgZWxpZiAoYnl0ZV9pbmRleChmaXJzdF93b3JkLCAwKSA9PSBUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEIGFuZAorICAgICAgICAgICAgICBieXRlX2luZGV4KGZpcnN0X3dvcmQsIDEpICYgVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OKToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKQorICAgICAgICAgICAgaXNfdW5mcmFtZWQgPSBUcnVlCisKKyAgICAgICAgaWYgaXNfdW5mcmFtZWQ6CisgICAgICAgICAgICBieXRlc19sZWZ0X3RvX3JlYWQgPSByZXFfc3ogLSBJMzIuc2l6ZQorICAgICAgICAgICAgaWYgYnl0ZXNfbGVmdF90b19yZWFkID4gMDoKKyAgICAgICAgICAgICAgICByZXN0ID0gc2VsZi5fdHJhbnNwb3J0LnJlYWQoYnl0ZXNfbGVmdF90b19yZWFkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXN0ID0gYiIiCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IEJ1ZmZlcklPKGZpcnN0X3dvcmQgKyByZXN0KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBvaywgd2UncmUgc3RpbGwgaGVyZSBzbyB3ZSdyZSBmcmFtZWQuCisgICAgICAgIGlmIGZyYW1lX3NpemUgPiBzZWxmLl9tYXhfZnJhbWVfc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJGcmFtZSB3YXMgdG9vIGxhcmdlLiIsCisgICAgICAgICAgICApCisgICAgICAgIHJlYWRfYnVmZmVyID0gQnVmZmVySU8oc2VsZi5fdHJhbnNwb3J0LnJlYWRBbGwoZnJhbWVfc2l6ZSkpCisKKyAgICAgICAgIyB0aGUgbmV4dCB3b3JkIGlzIGVpdGhlciBnb2luZyB0byBiZSB0aGUgdmVyc2lvbiBmaWVsZCBvZiBhCisgICAgICAgICMgYmluYXJ5L2NvbXBhY3QgcHJvdG9jb2wgbWVzc2FnZSBvciB0aGUgbWFnaWMgdmFsdWUgKyBmbGFncyBvZiBhCisgICAgICAgICMgaGVhZGVyIHByb3RvY29sIG1lc3NhZ2UuCisgICAgICAgIHNlY29uZF93b3JkID0gcmVhZF9idWZmZXIucmVhZChJMzIuc2l6ZSkKKyAgICAgICAgdmVyc2lvbiwgPSBJMzIudW5wYWNrKHNlY29uZF93b3JkKQorICAgICAgICByZWFkX2J1ZmZlci5zZWVrKDApCisgICAgICAgIGlmIHZlcnNpb24gPj4gMTYgPT0gSEVBREVSX01BR0lDOgorICAgICAgICAgICAgc2VsZi5fc2V0X2NsaWVudF90eXBlKFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlMpCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IHNlbGYuX3BhcnNlX2hlYWRlcl9mb3JtYXQocmVhZF9idWZmZXIpCisgICAgICAgIGVsaWYgdmVyc2lvbiAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQklOQVJZKQorICAgICAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSByZWFkX2J1ZmZlcgorICAgICAgICBlbGlmIChieXRlX2luZGV4KHNlY29uZF93b3JkLCAwKSA9PSBUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEIGFuZAorICAgICAgICAgICAgICBieXRlX2luZGV4KHNlY29uZF93b3JkLCAxKSAmIFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9NQVNLID09IFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTik6CisgICAgICAgICAgICBzZWxmLl9zZXRfY2xpZW50X3R5cGUoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QpCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IHJlYWRfYnVmZmVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uSU5WQUxJRF9DTElFTlRfVFlQRSwKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRldGVjdCBjbGllbnQgdHJhbnNwb3J0IHR5cGUuIiwKKyAgICAgICAgICAgICkKKworICAgIGRlZiBfcGFyc2VfaGVhZGVyX2Zvcm1hdChzZWxmLCBidWZmZXIpOgorICAgICAgICAjIG1ha2UgQnVmZmVySU8gbG9vayBsaWtlIFRUcmFuc3BvcnQgZm9yIHZhcmludCBoZWxwZXJzCisgICAgICAgIGJ1ZmZlcl90cmFuc3BvcnQgPSBUTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgYnVmZmVyX3RyYW5zcG9ydC5fYnVmZmVyID0gYnVmZmVyCisKKyAgICAgICAgYnVmZmVyLnJlYWQoMikgICMgZGlzY2FyZCB0aGUgbWFnaWMgYnl0ZXMKKyAgICAgICAgc2VsZi5mbGFncywgPSBVMTYudW5wYWNrKGJ1ZmZlci5yZWFkKFUxNi5zaXplKSkKKyAgICAgICAgc2VsZi5zZXF1ZW5jZV9pZCwgPSBJMzIudW5wYWNrKGJ1ZmZlci5yZWFkKEkzMi5zaXplKSkKKworICAgICAgICBoZWFkZXJfbGVuZ3RoID0gVTE2LnVucGFjayhidWZmZXIucmVhZChVMTYuc2l6ZSkpWzBdICogNAorICAgICAgICBlbmRfb2ZfaGVhZGVycyA9IGJ1ZmZlci50ZWxsKCkgKyBoZWFkZXJfbGVuZ3RoCisgICAgICAgIGlmIGVuZF9vZl9oZWFkZXJzID4gbGVuKGJ1ZmZlci5nZXR2YWx1ZSgpKToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJIZWFkZXIgc2l6ZSBpcyBsYXJnZXIgdGhhbiB3aG9sZSBmcmFtZS4iLAorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuX3Byb3RvY29sX2lkID0gcmVhZFZhcmludChidWZmZXJfdHJhbnNwb3J0KQorCisgICAgICAgIHRyYW5zZm9ybXMgPSBbXQorICAgICAgICB0cmFuc2Zvcm1fY291bnQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgIGZvciBfIGluIHJhbmdlKHRyYW5zZm9ybV9jb3VudCk6CisgICAgICAgICAgICB0cmFuc2Zvcm1faWQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICBpZiB0cmFuc2Zvcm1faWQgbm90IGluIFJFQURfVFJBTlNGT1JNU19CWV9JRDoKKyAgICAgICAgICAgICAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlZBTElEX1RSQU5TRk9STSwKKyAgICAgICAgICAgICAgICAgICAgIlVua25vd24gdHJhbnNmb3JtOiAlZCIgJSB0cmFuc2Zvcm1faWQsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgdHJhbnNmb3Jtcy5hcHBlbmQodHJhbnNmb3JtX2lkKQorICAgICAgICB0cmFuc2Zvcm1zLnJldmVyc2UoKQorCisgICAgICAgIGhlYWRlcnMgPSB7fQorICAgICAgICB3aGlsZSBidWZmZXIudGVsbCgpIDwgZW5kX29mX2hlYWRlcnM6CisgICAgICAgICAgICBoZWFkZXJfdHlwZSA9IHJlYWRWYXJpbnQoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgICAgIGlmIGhlYWRlcl90eXBlID09IFRJbmZvSGVhZGVyVHlwZS5LRVlfVkFMVUU6CisgICAgICAgICAgICAgICAgY291bnQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoY291bnQpOgorICAgICAgICAgICAgICAgICAgICBrZXkgPSBfcmVhZFN0cmluZyhidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9yZWFkU3RyaW5nKGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrICAjIGlnbm9yZSB1bmtub3duIGhlYWRlcnMKKyAgICAgICAgc2VsZi5fcmVhZF9oZWFkZXJzID0gaGVhZGVycworCisgICAgICAgICMgc2tpcCBwYWRkaW5nIC8gYW55dGhpbmcgd2UgZGlkbid0IHVuZGVyc3RhbmQKKyAgICAgICAgYnVmZmVyLnNlZWsoZW5kX29mX2hlYWRlcnMpCisKKyAgICAgICAgcGF5bG9hZCA9IGJ1ZmZlci5yZWFkKCkKKyAgICAgICAgZm9yIHRyYW5zZm9ybV9pZCBpbiB0cmFuc2Zvcm1zOgorICAgICAgICAgICAgdHJhbnNmb3JtX2ZuID0gUkVBRF9UUkFOU0ZPUk1TX0JZX0lEW3RyYW5zZm9ybV9pZF0KKyAgICAgICAgICAgIHBheWxvYWQgPSB0cmFuc2Zvcm1fZm4ocGF5bG9hZCkKKyAgICAgICAgcmV0dXJuIEJ1ZmZlcklPKHBheWxvYWQpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fd3JpdGVfYnVmZmVyLndyaXRlKGJ1ZikKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGF5bG9hZCA9IHNlbGYuX3dyaXRlX2J1ZmZlci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcklPKCkKKworICAgICAgICBidWZmZXIgPSBCdWZmZXJJTygpCisgICAgICAgIGlmIHNlbGYuX2NsaWVudF90eXBlID09IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlM6CisgICAgICAgICAgICBmb3IgdHJhbnNmb3JtX2lkIGluIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXM6CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2ZuID0gV1JJVEVfVFJBTlNGT1JNU19CWV9JRFt0cmFuc2Zvcm1faWRdCisgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHRyYW5zZm9ybV9mbihwYXlsb2FkKQorCisgICAgICAgICAgICBoZWFkZXJzID0gQnVmZmVySU8oKQorICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgc2VsZi5fcHJvdG9jb2xfaWQpCisgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBsZW4oc2VsZi5fd3JpdGVfdHJhbnNmb3JtcykpCisgICAgICAgICAgICBmb3IgdHJhbnNmb3JtX2lkIGluIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXM6CisgICAgICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgdHJhbnNmb3JtX2lkKQorICAgICAgICAgICAgaWYgc2VsZi5fd3JpdGVfaGVhZGVyczoKKyAgICAgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBUSW5mb0hlYWRlclR5cGUuS0VZX1ZBTFVFKQorICAgICAgICAgICAgICAgIHdyaXRlVmFyaW50KGhlYWRlcnMsIGxlbihzZWxmLl93cml0ZV9oZWFkZXJzKSkKKyAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl93cml0ZV9oZWFkZXJzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIF93cml0ZVN0cmluZyhoZWFkZXJzLCBrZXkpCisgICAgICAgICAgICAgICAgICAgIF93cml0ZVN0cmluZyhoZWFkZXJzLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzID0ge30KKyAgICAgICAgICAgIHBhZGRpbmdfbmVlZGVkID0gKDQgLSAobGVuKGhlYWRlcnMuZ2V0dmFsdWUoKSkgJSA0KSkgJSA0CisgICAgICAgICAgICBoZWFkZXJzLndyaXRlKGIiXHgwMCIgKiBwYWRkaW5nX25lZWRlZCkKKyAgICAgICAgICAgIGhlYWRlcl9ieXRlcyA9IGhlYWRlcnMuZ2V0dmFsdWUoKQorCisgICAgICAgICAgICBidWZmZXIud3JpdGUoSTMyLnBhY2soMTAgKyBsZW4oaGVhZGVyX2J5dGVzKSArIGxlbihwYXlsb2FkKSkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUoVTE2LnBhY2soSEVBREVSX01BR0lDKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShVMTYucGFjayhzZWxmLmZsYWdzKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShJMzIucGFjayhzZWxmLnNlcXVlbmNlX2lkKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShVMTYucGFjayhsZW4oaGVhZGVyX2J5dGVzKSAvLyA0KSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShoZWFkZXJfYnl0ZXMpCisgICAgICAgICAgICBidWZmZXIud3JpdGUocGF5bG9hZCkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgYnVmZmVyLndyaXRlKEkzMi5wYWNrKGxlbihwYXlsb2FkKSkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUocGF5bG9hZCkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShwYXlsb2FkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIlVua25vd24gY2xpZW50IHR5cGUuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICAjIHRoZSBmcmFtZSBsZW5ndGggZmllbGQgZG9lc24ndCBjb3VudCB0b3dhcmRzIHRoZSBmcmFtZSBwYXlsb2FkIHNpemUKKyAgICAgICAgZnJhbWVfYnl0ZXMgPSBidWZmZXIuZ2V0dmFsdWUoKQorICAgICAgICBmcmFtZV9wYXlsb2FkX3NpemUgPSBsZW4oZnJhbWVfYnl0ZXMpIC0gNAorICAgICAgICBpZiBmcmFtZV9wYXlsb2FkX3NpemUgPiBzZWxmLl9tYXhfZnJhbWVfc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIHNlbmQgZnJhbWUgdGhhdCBpcyB0b28gbGFyZ2UuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLl90cmFuc3BvcnQud3JpdGUoZnJhbWVfYnl0ZXMpCisgICAgICAgIHNlbGYuX3RyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfYnVmZmVyCisKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgcmVzdWx0ID0gYnl0ZWFycmF5KHBhcnRpYWxyZWFkKQorICAgICAgICB3aGlsZSBsZW4ocmVzdWx0KSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHJlc3VsdCArPSBzZWxmLnJlYWQocmVxbGVuIC0gbGVuKHJlc3VsdCkpCisgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gQnVmZmVySU8ocmVzdWx0KQorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9idWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKaW5kZXggNTg1MWZhMi4uMzdiMGE0ZCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKQEAgLTE3LDEzNSArMTcsMTcxIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgaHR0cGxpYgorZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwogaW1wb3J0IG9zCi1pbXBvcnQgc29ja2V0CitpbXBvcnQgc3NsCiBpbXBvcnQgc3lzCi1pbXBvcnQgdXJsbGliCi1pbXBvcnQgdXJscGFyc2UKIGltcG9ydCB3YXJuaW5ncworaW1wb3J0IGJhc2U2NAogCi1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWIKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBodHRwX2NsaWVudAogCi1mcm9tIFRUcmFuc3BvcnQgaW1wb3J0ICoKK2Zyb20gLlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRCYXNlCitpbXBvcnQgc2l4CiAKIAogY2xhc3MgVEh0dHBDbGllbnQoVFRyYW5zcG9ydEJhc2UpOgotICAiIiJIdHRwIGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQgYmFzZS4iIiIKKyAgICAiIiJIdHRwIGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQgYmFzZS4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgdXJpX29yX2hvc3QsIHBvcnQ9Tm9uZSwgcGF0aD1Ob25lKToKLSAgICAiIiJUSHR0cENsaWVudCBzdXBwb3J0cyB0d28gZGlmZmVyZW50IHR5cGVzIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVyaV9vcl9ob3N0LCBwb3J0PU5vbmUsIHBhdGg9Tm9uZSwgY2FmaWxlPU5vbmUsIGNlcnRfZmlsZT1Ob25lLCBrZXlfZmlsZT1Ob25lLCBzc2xfY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiVEh0dHBDbGllbnQgc3VwcG9ydHMgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBjb25zdHJ1Y3Rpb246CiAKLSAgICBUSHR0cENsaWVudChob3N0LCBwb3J0LCBwYXRoKSAtIGRlcHJlY2F0ZWQKLSAgICBUSHR0cENsaWVudCh1cmkpCisgICAgICAgIFRIdHRwQ2xpZW50KGhvc3QsIHBvcnQsIHBhdGgpIC0gZGVwcmVjYXRlZAorICAgICAgICBUSHR0cENsaWVudCh1cmksIFtwb3J0PTxuPiwgcGF0aD08cz4sIGNhZmlsZT08ZmlsZW5hbWU+LCBjZXJ0X2ZpbGU9PGZpbGVuYW1lPiwga2V5X2ZpbGU9PGZpbGVuYW1lPiwgc3NsX2NvbnRleHQ9PGNvbnRleHQ+XSkKIAotICAgIE9ubHkgdGhlIHNlY29uZCBzdXBwb3J0cyBodHRwcy4KLSAgICAiIiIKLSAgICBpZiBwb3J0IGlzIG5vdCBOb25lOgotICAgICAgd2FybmluZ3Mud2FybigKLSAgICAgICAgIlBsZWFzZSB1c2UgdGhlIFRIdHRwQ2xpZW50KCdodHRwOi8vaG9zdDpwb3J0L3BhdGgnKSBzeW50YXgiLAotICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCi0gICAgICAgIHN0YWNrbGV2ZWw9MikKLSAgICAgIHNlbGYuaG9zdCA9IHVyaV9vcl9ob3N0Ci0gICAgICBzZWxmLnBvcnQgPSBwb3J0Ci0gICAgICBhc3NlcnQgcGF0aAotICAgICAgc2VsZi5wYXRoID0gcGF0aAotICAgICAgc2VsZi5zY2hlbWUgPSAnaHR0cCcKLSAgICBlbHNlOgotICAgICAgcGFyc2VkID0gdXJscGFyc2UudXJscGFyc2UodXJpX29yX2hvc3QpCi0gICAgICBzZWxmLnNjaGVtZSA9IHBhcnNlZC5zY2hlbWUKLSAgICAgIGFzc2VydCBzZWxmLnNjaGVtZSBpbiAoJ2h0dHAnLCAnaHR0cHMnKQotICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgotICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydCBvciBodHRwbGliLkhUVFBfUE9SVAotICAgICAgZWxpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cHMnOgotICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydCBvciBodHRwbGliLkhUVFBTX1BPUlQKLSAgICAgIHNlbGYuaG9zdCA9IHBhcnNlZC5ob3N0bmFtZQotICAgICAgc2VsZi5wYXRoID0gcGFyc2VkLnBhdGgKLSAgICAgIGlmIHBhcnNlZC5xdWVyeToKLSAgICAgICAgc2VsZi5wYXRoICs9ICc/JXMnICUgcGFyc2VkLnF1ZXJ5Ci0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX2h0dHAgPSBOb25lCi0gICAgc2VsZi5fX3RpbWVvdXQgPSBOb25lCi0gICAgc2VsZi5fX2N1c3RvbV9oZWFkZXJzID0gTm9uZQorICAgICAgICBPbmx5IHRoZSBzZWNvbmQgc3VwcG9ydHMgaHR0cHMuICBUbyBwcm9wZXJseSBhdXRoZW50aWNhdGUgYWdhaW5zdCB0aGUgc2VydmVyLAorICAgICAgICBwcm92aWRlIHRoZSBjbGllbnQncyBpZGVudGl0eSBieSBzcGVjaWZ5aW5nIGNlcnRfZmlsZSBhbmQga2V5X2ZpbGUuICBUbyBwcm9wZXJseQorICAgICAgICBhdXRoZW50aWNhdGUgdGhlIHNlcnZlciwgc3BlY2lmeSBlaXRoZXIgY2FmaWxlIG9yIHNzbF9jb250ZXh0IHdpdGggYSBDQSBkZWZpbmVkLgorICAgICAgICBOT1RFOiBpZiBib3RoIGNhZmlsZSBhbmQgc3NsX2NvbnRleHQgYXJlIGRlZmluZWQsIHNzbF9jb250ZXh0IHdpbGwgb3ZlcnJpZGUgY2FmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgcG9ydCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgIlBsZWFzZSB1c2UgdGhlIFRIdHRwQ2xpZW50KCdodHRwe3N9Oi8vaG9zdDpwb3J0L3BhdGgnKSBjb25zdHJ1Y3RvciIsCisgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgIHNlbGYuaG9zdCA9IHVyaV9vcl9ob3N0CisgICAgICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgICAgICBhc3NlcnQgcGF0aAorICAgICAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICAgICAgc2VsZi5zY2hlbWUgPSAnaHR0cCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcnNlZCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmlfb3JfaG9zdCkKKyAgICAgICAgICAgIHNlbGYuc2NoZW1lID0gcGFyc2VkLnNjaGVtZQorICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc2NoZW1lIGluICgnaHR0cCcsICdodHRwcycpCisgICAgICAgICAgICBpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cCc6CisgICAgICAgICAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cF9jbGllbnQuSFRUUF9QT1JUCisgICAgICAgICAgICBlbGlmIHNlbGYuc2NoZW1lID09ICdodHRwcyc6CisgICAgICAgICAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cF9jbGllbnQuSFRUUFNfUE9SVAorICAgICAgICAgICAgICAgIHNlbGYuY2VydGZpbGUgPSBjZXJ0X2ZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLmtleWZpbGUgPSBrZXlfZmlsZQorICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KGNhZmlsZT1jYWZpbGUpIGlmIChjYWZpbGUgYW5kIG5vdCBzc2xfY29udGV4dCkgZWxzZSBzc2xfY29udGV4dAorICAgICAgICAgICAgc2VsZi5ob3N0ID0gcGFyc2VkLmhvc3RuYW1lCisgICAgICAgICAgICBzZWxmLnBhdGggPSBwYXJzZWQucGF0aAorICAgICAgICAgICAgaWYgcGFyc2VkLnF1ZXJ5OgorICAgICAgICAgICAgICAgIHNlbGYucGF0aCArPSAnPyVzJyAlIHBhcnNlZC5xdWVyeQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcm94eSA9IHVybGxpYi5yZXF1ZXN0LmdldHByb3hpZXMoKVtzZWxmLnNjaGVtZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcHJveHkgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB1cmxsaWIucmVxdWVzdC5wcm94eV9ieXBhc3Moc2VsZi5ob3N0KToKKyAgICAgICAgICAgICAgICBwcm94eSA9IE5vbmUKKyAgICAgICAgaWYgcHJveHk6CisgICAgICAgICAgICBwYXJzZWQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UocHJveHkpCisgICAgICAgICAgICBzZWxmLnJlYWxob3N0ID0gc2VsZi5ob3N0CisgICAgICAgICAgICBzZWxmLnJlYWxwb3J0ID0gc2VsZi5wb3J0CisgICAgICAgICAgICBzZWxmLmhvc3QgPSBwYXJzZWQuaG9zdG5hbWUKKyAgICAgICAgICAgIHNlbGYucG9ydCA9IHBhcnNlZC5wb3J0CisgICAgICAgICAgICBzZWxmLnByb3h5X2F1dGggPSBzZWxmLmJhc2ljX3Byb3h5X2F1dGhfaGVhZGVyKHBhcnNlZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucmVhbGhvc3QgPSBzZWxmLnJlYWxwb3J0ID0gc2VsZi5wcm94eV9hdXRoID0gTm9uZQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQorICAgICAgICBzZWxmLl9faHR0cCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2h0dHBfcmVzcG9uc2UgPSBOb25lCisgICAgICAgIHNlbGYuX190aW1lb3V0ID0gTm9uZQorICAgICAgICBzZWxmLl9fY3VzdG9tX2hlYWRlcnMgPSBOb25lCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgotICAgICAgc2VsZi5fX2h0dHAgPSBodHRwbGliLkhUVFAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX19odHRwID0gaHR0cGxpYi5IVFRQUyhzZWxmLmhvc3QsIHNlbGYucG9ydCkKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGJhc2ljX3Byb3h5X2F1dGhfaGVhZGVyKHByb3h5KToKKyAgICAgICAgaWYgcHJveHkgaXMgTm9uZSBvciBub3QgcHJveHkudXNlcm5hbWU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBhcCA9ICIlczolcyIgJSAodXJsbGliLnBhcnNlLnVucXVvdGUocHJveHkudXNlcm5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliLnBhcnNlLnVucXVvdGUocHJveHkucGFzc3dvcmQpKQorICAgICAgICBjciA9IGJhc2U2NC5iNjRlbmNvZGUoYXApLnN0cmlwKCkKKyAgICAgICAgcmV0dXJuICJCYXNpYyAiICsgY3IKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5fX2h0dHAuY2xvc2UoKQotICAgIHNlbGYuX19odHRwID0gTm9uZQorICAgIGRlZiB1c2luZ19wcm94eShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhbGhvc3QgaXMgbm90IE5vbmUKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9faHR0cCBpcyBub3QgTm9uZQorICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cCc6CisgICAgICAgICAgICBzZWxmLl9faHR0cCA9IGh0dHBfY2xpZW50LkhUVFBDb25uZWN0aW9uKHNlbGYuaG9zdCwgc2VsZi5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXNlbGYuX190aW1lb3V0KQorICAgICAgICBlbGlmIHNlbGYuc2NoZW1lID09ICdodHRwcyc6CisgICAgICAgICAgICBzZWxmLl9faHR0cCA9IGh0dHBfY2xpZW50LkhUVFBTQ29ubmVjdGlvbihzZWxmLmhvc3QsIHNlbGYucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9maWxlPXNlbGYua2V5ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfZmlsZT1zZWxmLmNlcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1zZWxmLl9fdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ9c2VsZi5jb250ZXh0KQorICAgICAgICBpZiBzZWxmLnVzaW5nX3Byb3h5KCk6CisgICAgICAgICAgICBzZWxmLl9faHR0cC5zZXRfdHVubmVsKHNlbGYucmVhbGhvc3QsIHNlbGYucmVhbHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiUHJveHktQXV0aG9yaXphdGlvbiI6IHNlbGYucHJveHlfYXV0aH0pCiAKLSAgZGVmIHNldFRpbWVvdXQoc2VsZiwgbXMpOgotICAgIGlmIG5vdCBoYXNhdHRyKHNvY2tldCwgJ2dldGRlZmF1bHR0aW1lb3V0Jyk6Ci0gICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9faHR0cC5jbG9zZSgpCisgICAgICAgIHNlbGYuX19odHRwID0gTm9uZQorICAgICAgICBzZWxmLl9faHR0cF9yZXNwb25zZSA9IE5vbmUKIAotICAgIGlmIG1zIGlzIE5vbmU6Ci0gICAgICBzZWxmLl9fdGltZW91dCA9IE5vbmUKLSAgICBlbHNlOgotICAgICAgc2VsZi5fX3RpbWVvdXQgPSBtcyAvIDEwMDAuMAorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9faHR0cCBpcyBub3QgTm9uZQogCi0gIGRlZiBzZXRDdXN0b21IZWFkZXJzKHNlbGYsIGhlYWRlcnMpOgotICAgIHNlbGYuX19jdXN0b21faGVhZGVycyA9IGhlYWRlcnMKKyAgICBkZWYgc2V0VGltZW91dChzZWxmLCBtcyk6CisgICAgICAgIGlmIG1zIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9fdGltZW91dCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX190aW1lb3V0ID0gbXMgLyAxMDAwLjAKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcmV0dXJuIHNlbGYuX19odHRwLmZpbGUucmVhZChzeikKKyAgICBkZWYgc2V0Q3VzdG9tSGVhZGVycyhzZWxmLCBoZWFkZXJzKToKKyAgICAgICAgc2VsZi5fX2N1c3RvbV9oZWFkZXJzID0gaGVhZGVycwogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldHVybiBzZWxmLl9faHR0cF9yZXNwb25zZS5yZWFkKHN6KQogCi0gIGRlZiBfX3dpdGhUaW1lb3V0KGYpOgotICAgIGRlZiBfZigqYXJncywgKiprd2FyZ3MpOgotICAgICAgb3JpZ190aW1lb3V0ID0gc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkKLSAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChhcmdzWzBdLl9fdGltZW91dCkKLSAgICAgIHRyeToKLSAgICAgICAgcmVzdWx0ID0gZigqYXJncywgKiprd2FyZ3MpCi0gICAgICBmaW5hbGx5OgotICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQob3JpZ190aW1lb3V0KQotICAgICAgcmV0dXJuIHJlc3VsdAotICAgIHJldHVybiBfZgorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIGlmIHNlbGYuaXNPcGVuKCk6Ci0gICAgICBzZWxmLmNsb3NlKCkKLSAgICBzZWxmLm9wZW4oKQorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pc09wZW4oKToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICBzZWxmLm9wZW4oKQogCi0gICAgIyBQdWxsIGRhdGEgb3V0IG9mIGJ1ZmZlcgotICAgIGRhdGEgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCisgICAgICAgICMgUHVsbCBkYXRhIG91dCBvZiBidWZmZXIKKyAgICAgICAgZGF0YSA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKIAotICAgICMgSFRUUCByZXF1ZXN0Ci0gICAgc2VsZi5fX2h0dHAucHV0cmVxdWVzdCgnUE9TVCcsIHNlbGYucGF0aCkKKyAgICAgICAgIyBIVFRQIHJlcXVlc3QKKyAgICAgICAgaWYgc2VsZi51c2luZ19wcm94eSgpIGFuZCBzZWxmLnNjaGVtZSA9PSAiaHR0cCI6CisgICAgICAgICAgICAjIG5lZWQgZnVsbCBVUkwgb2YgcmVhbCBob3N0IGZvciBIVFRQIHByb3h5IGhlcmUgKEhUVFBTIHVzZXMgQ09OTkVDVCB0dW5uZWwpCisgICAgICAgICAgICBzZWxmLl9faHR0cC5wdXRyZXF1ZXN0KCdQT1NUJywgImh0dHA6Ly8lczolcyVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnJlYWxob3N0LCBzZWxmLnJlYWxwb3J0LCBzZWxmLnBhdGgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0cmVxdWVzdCgnUE9TVCcsIHNlbGYucGF0aCkKIAotICAgICMgV3JpdGUgaGVhZGVycwotICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignSG9zdCcsIHNlbGYuaG9zdCkKLSAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXRocmlmdCcpCi0gICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIHN0cihsZW4oZGF0YSkpKQorICAgICAgICAjIFdyaXRlIGhlYWRlcnMKKyAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC10aHJpZnQnKQorICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgc3RyKGxlbihkYXRhKSkpCisgICAgICAgIGlmIHNlbGYudXNpbmdfcHJveHkoKSBhbmQgc2VsZi5zY2hlbWUgPT0gImh0dHAiIGFuZCBzZWxmLnByb3h5X2F1dGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoIlByb3h5LUF1dGhvcml6YXRpb24iLCBzZWxmLnByb3h5X2F1dGgpCiAKLSAgICBpZiBub3Qgc2VsZi5fX2N1c3RvbV9oZWFkZXJzIG9yICdVc2VyLUFnZW50JyBub3QgaW4gc2VsZi5fX2N1c3RvbV9oZWFkZXJzOgotICAgICAgdXNlcl9hZ2VudCA9ICdQeXRob24vVEh0dHBDbGllbnQnCi0gICAgICBzY3JpcHQgPSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKQotICAgICAgaWYgc2NyaXB0OgotICAgICAgICB1c2VyX2FnZW50ID0gJyVzICglcyknICUgKHVzZXJfYWdlbnQsIHVybGxpYi5xdW90ZShzY3JpcHQpKQotICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdVc2VyLUFnZW50JywgdXNlcl9hZ2VudCkKKyAgICAgICAgaWYgbm90IHNlbGYuX19jdXN0b21faGVhZGVycyBvciAnVXNlci1BZ2VudCcgbm90IGluIHNlbGYuX19jdXN0b21faGVhZGVyczoKKyAgICAgICAgICAgIHVzZXJfYWdlbnQgPSAnUHl0aG9uL1RIdHRwQ2xpZW50JworICAgICAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKKyAgICAgICAgICAgIGlmIHNjcmlwdDoKKyAgICAgICAgICAgICAgICB1c2VyX2FnZW50ID0gJyVzICglcyknICUgKHVzZXJfYWdlbnQsIHVybGxpYi5wYXJzZS5xdW90ZShzY3JpcHQpKQorICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdVc2VyLUFnZW50JywgdXNlcl9hZ2VudCkKIAotICAgIGlmIHNlbGYuX19jdXN0b21faGVhZGVyczoKLSAgICAgICAgZm9yIGtleSwgdmFsIGluIHNlbGYuX19jdXN0b21faGVhZGVycy5pdGVyaXRlbXMoKToKLSAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcihrZXksIHZhbCkKKyAgICAgICAgaWYgc2VsZi5fX2N1c3RvbV9oZWFkZXJzOgorICAgICAgICAgICAgZm9yIGtleSwgdmFsIGluIHNpeC5pdGVyaXRlbXMoc2VsZi5fX2N1c3RvbV9oZWFkZXJzKToKKyAgICAgICAgICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoa2V5LCB2YWwpCiAKLSAgICBzZWxmLl9faHR0cC5lbmRoZWFkZXJzKCkKKyAgICAgICAgc2VsZi5fX2h0dHAuZW5kaGVhZGVycygpCiAKLSAgICAjIFdyaXRlIHBheWxvYWQKLSAgICBzZWxmLl9faHR0cC5zZW5kKGRhdGEpCisgICAgICAgICMgV3JpdGUgcGF5bG9hZAorICAgICAgICBzZWxmLl9faHR0cC5zZW5kKGRhdGEpCiAKLSAgICAjIEdldCByZXBseSB0byBmbHVzaCB0aGUgcmVxdWVzdAotICAgIHNlbGYuY29kZSwgc2VsZi5tZXNzYWdlLCBzZWxmLmhlYWRlcnMgPSBzZWxmLl9faHR0cC5nZXRyZXBseSgpCi0KLSAgIyBEZWNvcmF0ZSBpZiB3ZSBrbm93IGhvdyB0byB0aW1lb3V0Ci0gIGlmIGhhc2F0dHIoc29ja2V0LCAnZ2V0ZGVmYXVsdHRpbWVvdXQnKToKLSAgICBmbHVzaCA9IF9fd2l0aFRpbWVvdXQoZmx1c2gpCisgICAgICAgICMgR2V0IHJlcGx5IHRvIGZsdXNoIHRoZSByZXF1ZXN0CisgICAgICAgIHNlbGYuX19odHRwX3Jlc3BvbnNlID0gc2VsZi5fX2h0dHAuZ2V0cmVzcG9uc2UoKQorICAgICAgICBzZWxmLmNvZGUgPSBzZWxmLl9faHR0cF9yZXNwb25zZS5zdGF0dXMKKyAgICAgICAgc2VsZi5tZXNzYWdlID0gc2VsZi5fX2h0dHBfcmVzcG9uc2UucmVhc29uCisgICAgICAgIHNlbGYuaGVhZGVycyA9IHNlbGYuX19odHRwX3Jlc3BvbnNlLm1zZwpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQucHkKaW5kZXggNmFkOGQ1MC4uMDY2ZDhkYSAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LnB5CkBAIC0xNywyMTEgKzE3LDM5MiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAoraW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcwogaW1wb3J0IHNvY2tldAogaW1wb3J0IHNzbAoraW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCiAKK2Zyb20gLnNzbGNvbXBhdCBpbXBvcnQgX21hdGNoX2hvc3RuYW1lLCBfbWF0Y2hfaGFzX2lwYWRkcmVzcwogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgogCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKAorICAgICdkZWZhdWx0JywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9X19uYW1lX18pCiAKLWNsYXNzIFRTU0xTb2NrZXQoVFNvY2tldC5UU29ja2V0KToKLSAgIiIiCi0gIFNTTCBpbXBsZW1lbnRhdGlvbiBvZiBjbGllbnQtc2lkZSBUU29ja2V0CiAKLSAgVGhpcyBjbGFzcyBjcmVhdGVzIG91dGJvdW5kIHNvY2tldHMgd3JhcHBlZCB1c2luZyB0aGUKLSAgcHl0aG9uIHN0YW5kYXJkIHNzbCBtb2R1bGUgZm9yIGVuY3J5cHRlZCBjb25uZWN0aW9ucy4KK2NsYXNzIFRTU0xCYXNlKG9iamVjdCk6CisgICAgIyBTU0xDb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiA8IDIuNy45CisgICAgX2hhc19zc2xfY29udGV4dCA9IHN5cy5oZXh2ZXJzaW9uID49IDB4MDIwNzA5RjAKIAotICBUaGUgcHJvdG9jb2wgdXNlZCBpcyBzZXQgdXNpbmcgdGhlIGNsYXNzIHZhcmlhYmxlCi0gIFNTTF9WRVJTSU9OLCB3aGljaCBtdXN0IGJlIG9uZSBvZiBzc2wuUFJPVE9DT0xfKiBhbmQKLSAgZGVmYXVsdHMgdG8gIHNzbC5QUk9UT0NPTF9UTFN2MSBmb3IgZ3JlYXRlc3Qgc2VjdXJpdHkuCi0gICIiIgotICBTU0xfVkVSU0lPTiA9IHNzbC5QUk9UT0NPTF9UTFN2MQorICAgICMgY2lwaGVycyBhcmd1bWVudCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gPCAyLjcuMAorICAgIF9oYXNfY2lwaGVycyA9IHN5cy5oZXh2ZXJzaW9uID49IDB4MDIwNzAwRjAKIAotICBkZWYgX19pbml0X18oc2VsZiwKLSAgICAgICAgICAgICAgIGhvc3Q9J2xvY2FsaG9zdCcsCi0gICAgICAgICAgICAgICBwb3J0PTkwOTAsCi0gICAgICAgICAgICAgICB2YWxpZGF0ZT1UcnVlLAotICAgICAgICAgICAgICAgY2FfY2VydHM9Tm9uZSwKLSAgICAgICAgICAgICAgIGtleWZpbGU9Tm9uZSwKLSAgICAgICAgICAgICAgIGNlcnRmaWxlPU5vbmUsCi0gICAgICAgICAgICAgICB1bml4X3NvY2tldD1Ob25lLAotICAgICAgICAgICAgICAgY2lwaGVycz1Ob25lKToKLSAgICAiIiJDcmVhdGUgU1NMIFRTb2NrZXQKKyAgICAjIEZvciBweXRob24gPj0gMi43LjksIHVzZSBsYXRlc3QgVExTIHRoYXQgYm90aCBjbGllbnQgYW5kIHNlcnZlcgorICAgICMgc3VwcG9ydHMuCisgICAgIyBTU0wgMi4wIGFuZCAzLjAgYXJlIGRpc2FibGVkIHZpYSBzc2wuT1BfTk9fU1NMdjIgYW5kIHNzbC5PUF9OT19TU0x2My4KKyAgICAjIEZvciBweXRob24gPCAyLjcuOSwgdXNlIFRMUyAxLjAgc2luY2UgVExTdjFfWCBub3IgT1BfTk9fU1NMdlggaXMKKyAgICAjIHVuYXZhaWxhYmxlLgorICAgIF9kZWZhdWx0X3Byb3RvY29sID0gc3NsLlBST1RPQ09MX1NTTHYyMyBpZiBfaGFzX3NzbF9jb250ZXh0IGVsc2UgXAorICAgICAgICBzc2wuUFJPVE9DT0xfVExTdjEKIAotICAgIEBwYXJhbSB2YWxpZGF0ZTogU2V0IHRvIEZhbHNlIHRvIGRpc2FibGUgU1NMIGNlcnRpZmljYXRlIHZhbGlkYXRpb24KLSAgICBAdHlwZSB2YWxpZGF0ZTogYm9vbAotICAgIEBwYXJhbSBjYV9jZXJ0czogRmlsZW5hbWUgdG8gdGhlIENlcnRpZmljYXRlIEF1dGhvcml0eSBwZW0gZmlsZSwgcG9zc2libHkgYQotICAgIGZpbGUgZG93bmxvYWRlZCBmcm9tOiBodHRwOi8vY3VybC5oYXh4LnNlL2NhL2NhY2VydC5wZW0gIFRoaXMgaXMgcGFzc2VkIHRvCi0gICAgdGhlIHNzbF93cmFwIGZ1bmN0aW9uIGFzIHRoZSAnY2FfY2VydHMnIHBhcmFtZXRlci4KLSAgICBAdHlwZSBjYV9jZXJ0czogc3RyCi0gICAgQHBhcmFtIGtleWZpbGU6IFRoZSBwcml2YXRlIGtleQotICAgIEB0eXBlIGtleWZpbGU6IHN0cgotICAgIEBwYXJhbSBjZXJ0ZmlsZTogVGhlIGNlcnQgZmlsZQotICAgIEB0eXBlIGNlcnRmaWxlOiBzdHIKLSAgICBAcGFyYW0gY2lwaGVyczogVGhlIGNpcGhlciBzdWl0ZXMgdG8gYWxsb3cuIFRoaXMgaXMgcGFzc2VkIHRvCi0gICAgICAgICAgICAgICAgICAgIHRoZSBzc2xfd3JhcCBmdW5jdGlvbiBhcyB0aGUgJ2NpcGhlcnMnIHBhcmFtZXRlci4KLSAgICBAdHlwZSBjaXBoZXJzOiBzdHIKLSAgICAKLSAgICBSYWlzZXMgYW4gSU9FcnJvciBleGNlcHRpb24gaWYgdmFsaWRhdGUgaXMgVHJ1ZSBhbmQgdGhlIGNhX2NlcnRzIGZpbGUgaXMKLSAgICBOb25lLCBub3QgcHJlc2VudCBvciB1bnJlYWRhYmxlLgorICAgIGRlZiBfaW5pdF9jb250ZXh0KHNlbGYsIHNzbF92ZXJzaW9uKToKKyAgICAgICAgaWYgc2VsZi5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgc2VsZi5fY29udGV4dCA9IHNzbC5TU0xDb250ZXh0KHNzbF92ZXJzaW9uKQorICAgICAgICAgICAgaWYgc2VsZi5fY29udGV4dC5wcm90b2NvbCA9PSBzc2wuUFJPVE9DT0xfU1NMdjIzOgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRleHQub3B0aW9ucyB8PSBzc2wuT1BfTk9fU1NMdjIKKyAgICAgICAgICAgICAgICBzZWxmLl9jb250ZXh0Lm9wdGlvbnMgfD0gc3NsLk9QX05PX1NTTHYzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9jb250ZXh0ID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fc3NsX3ZlcnNpb24gPSBzc2xfdmVyc2lvbgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIF9zaG91bGRfdmVyaWZ5KHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29udGV4dC52ZXJpZnlfbW9kZSAhPSBzc2wuQ0VSVF9OT05FCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jZXJ0X3JlcXMgIT0gc3NsLkNFUlRfTk9ORQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHNzbF92ZXJzaW9uKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zc2xfY29udGV4dC5wcm90b2NvbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NzbF92ZXJzaW9uCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3NsX2NvbnRleHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250ZXh0CisKKyAgICBTU0xfVkVSU0lPTiA9IF9kZWZhdWx0X3Byb3RvY29sCiAgICAgIiIiCi0gICAgc2VsZi52YWxpZGF0ZSA9IHZhbGlkYXRlCi0gICAgc2VsZi5pc192YWxpZCA9IEZhbHNlCi0gICAgc2VsZi5wZWVyY2VydCA9IE5vbmUKLSAgICBpZiBub3QgdmFsaWRhdGU6Ci0gICAgICBzZWxmLmNlcnRfcmVxcyA9IHNzbC5DRVJUX05PTkUKLSAgICBlbHNlOgotICAgICAgc2VsZi5jZXJ0X3JlcXMgPSBzc2wuQ0VSVF9SRVFVSVJFRAotICAgIHNlbGYuY2FfY2VydHMgPSBjYV9jZXJ0cwotICAgIHNlbGYua2V5ZmlsZSA9IGtleWZpbGUKLSAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKLSAgICBzZWxmLmNpcGhlcnMgPSBjaXBoZXJzCi0gICAgaWYgdmFsaWRhdGU6Ci0gICAgICBpZiBjYV9jZXJ0cyBpcyBOb25lIG9yIG5vdCBvcy5hY2Nlc3MoY2FfY2VydHMsIG9zLlJfT0spOgotICAgICAgICByYWlzZSBJT0Vycm9yKCdDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgY2FfY2VydHMgZmlsZSAiJXMiICcKLSAgICAgICAgICAgICAgICAgICAgICAnaXMgbm90IHJlYWRhYmxlLCBjYW5ub3QgdmFsaWRhdGUgU1NMICcKLSAgICAgICAgICAgICAgICAgICAgICAnY2VydGlmaWNhdGVzLicgJSAoY2FfY2VydHMpKQotICAgIFRTb2NrZXQuVFNvY2tldC5fX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0LCB1bml4X3NvY2tldCkKKyAgRGVmYXVsdCBTU0wgdmVyc2lvbi4KKyAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBpdCBjYW4gYmUgbW9kaWZpZWQuCisgIFVzZSBfX2luaXRfXyBrZXl3b3JkIGFyZ3VtZW50ICJzc2xfdmVyc2lvbiIgaW5zdGVhZC4KKyAgIiIiCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgdHJ5OgotICAgICAgcmVzMCA9IHNlbGYuX3Jlc29sdmVBZGRyKCkKLSAgICAgIGZvciByZXMgaW4gcmVzMDoKLSAgICAgICAgc29ja19mYW1pbHksIHNvY2tfdHlwZSA9IHJlc1swOjJdCi0gICAgICAgIGlwX3BvcnQgPSByZXNbNF0KLSAgICAgICAgcGxhaW5fc29jayA9IHNvY2tldC5zb2NrZXQoc29ja19mYW1pbHksIHNvY2tfdHlwZSkKLSAgICAgICAgc2VsZi5oYW5kbGUgPSBzc2wud3JhcF9zb2NrZXQocGxhaW5fc29jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c2VsZi5TU0xfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9VHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9c2VsZi5jYV9jZXJ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ZmlsZT1zZWxmLmtleWZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRmaWxlPXNlbGYuY2VydGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zZWxmLmNlcnRfcmVxcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVycz1zZWxmLmNpcGhlcnMpCi0gICAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKKyAgICBkZWYgX2RlcHJlY2F0ZWRfYXJnKHNlbGYsIGFyZ3MsIGt3YXJncywgcG9zLCBrZXkpOgorICAgICAgICBpZiBsZW4oYXJncykgPD0gcG9zOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJlYWxfcG9zID0gcG9zICsgMworICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgJyVkdGggcG9zaXRpb25hbCBhcmd1bWVudCBpcyBkZXByZWNhdGVkLicKKyAgICAgICAgICAgICdwbGVhc2UgdXNlIGtleXdvcmQgYXJndW1lbnQgaW5zdGVhZC4nCisgICAgICAgICAgICAlIHJlYWxfcG9zLCBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MykKKworICAgICAgICBpZiBrZXkgaW4ga3dhcmdzOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAorICAgICAgICAgICAgICAgICdEdXBsaWNhdGUgYXJndW1lbnQ6ICVkdGggYXJndW1lbnQgYW5kICVzIGtleXdvcmQgYXJndW1lbnQuJworICAgICAgICAgICAgICAgICUgKHJlYWxfcG9zLCBrZXkpKQorICAgICAgICBrd2FyZ3Nba2V5XSA9IGFyZ3NbcG9zXQorCisgICAgZGVmIF91bml4X3NvY2tldF9hcmcoc2VsZiwgaG9zdCwgcG9ydCwgYXJncywga3dhcmdzKToKKyAgICAgICAga2V5ID0gJ3VuaXhfc29ja2V0JworICAgICAgICBpZiBob3N0IGlzIE5vbmUgYW5kIHBvcnQgaXMgTm9uZSBhbmQgbGVuKGFyZ3MpID09IDEgYW5kIGtleSBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAga3dhcmdzW2tleV0gPSBhcmdzWzBdCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBrZXkpOgorICAgICAgICBpZiBrZXkgPT0gJ1NTTF9WRVJTSU9OJzoKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgJ1NTTF9WRVJTSU9OIGlzIGRlcHJlY2F0ZWQuJworICAgICAgICAgICAgICAgICdwbGVhc2UgdXNlIHNzbF92ZXJzaW9uIGF0dHJpYnV0ZSBpbnN0ZWFkLicsCisgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5zc2xfdmVyc2lvbgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlcl9zaWRlLCBob3N0LCBzc2xfb3B0cyk6CisgICAgICAgIHNlbGYuX3NlcnZlcl9zaWRlID0gc2VydmVyX3NpZGUKKyAgICAgICAgaWYgVFNTTEJhc2UuU1NMX1ZFUlNJT04gIT0gc2VsZi5fZGVmYXVsdF9wcm90b2NvbDoKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgJ1NTTF9WRVJTSU9OIGlzIGRlcHJlY2F0ZWQuJworICAgICAgICAgICAgICAgICdwbGVhc2UgdXNlIHNzbF92ZXJzaW9uIGtleXdvcmQgYXJndW1lbnQgaW5zdGVhZC4nLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICBzZWxmLl9jb250ZXh0ID0gc3NsX29wdHMucG9wKCdzc2xfY29udGV4dCcsIE5vbmUpCisgICAgICAgIHNlbGYuX3NlcnZlcl9ob3N0bmFtZSA9IE5vbmUKKyAgICAgICAgaWYgbm90IHNlbGYuX3NlcnZlcl9zaWRlOgorICAgICAgICAgICAgc2VsZi5fc2VydmVyX2hvc3RuYW1lID0gc3NsX29wdHMucG9wKCdzZXJ2ZXJfaG9zdG5hbWUnLCBob3N0KQorICAgICAgICBpZiBzZWxmLl9jb250ZXh0OgorICAgICAgICAgICAgc2VsZi5fY3VzdG9tX2NvbnRleHQgPSBUcnVlCisgICAgICAgICAgICBpZiBzc2xfb3B0czoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAnSW5jb21wYXRpYmxlIGFyZ3VtZW50czogc3NsX2NvbnRleHQgYW5kICVzJworICAgICAgICAgICAgICAgICAgICAlICcgJy5qb2luKHNzbF9vcHRzLmtleXMoKSkpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICdzc2xfY29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGlzIHZlcnNpb24gb2YgUHl0aG9uJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2N1c3RvbV9jb250ZXh0ID0gRmFsc2UKKyAgICAgICAgICAgIHNzbF92ZXJzaW9uID0gc3NsX29wdHMucG9wKCdzc2xfdmVyc2lvbicsIFRTU0xCYXNlLlNTTF9WRVJTSU9OKQorICAgICAgICAgICAgc2VsZi5faW5pdF9jb250ZXh0KHNzbF92ZXJzaW9uKQorICAgICAgICAgICAgc2VsZi5jZXJ0X3JlcXMgPSBzc2xfb3B0cy5wb3AoJ2NlcnRfcmVxcycsIHNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICAgICAgc2VsZi5jYV9jZXJ0cyA9IHNzbF9vcHRzLnBvcCgnY2FfY2VydHMnLCBOb25lKQorICAgICAgICAgICAgc2VsZi5rZXlmaWxlID0gc3NsX29wdHMucG9wKCdrZXlmaWxlJywgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuY2VydGZpbGUgPSBzc2xfb3B0cy5wb3AoJ2NlcnRmaWxlJywgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuY2lwaGVycyA9IHNzbF9vcHRzLnBvcCgnY2lwaGVycycsIE5vbmUpCisKKyAgICAgICAgICAgIGlmIHNzbF9vcHRzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICdVbmtub3duIGtleXdvcmQgYXJndW1lbnRzOiAnLCAnICcuam9pbihzc2xfb3B0cy5rZXlzKCkpKQorCisgICAgICAgICAgICBpZiBzZWxmLl9zaG91bGRfdmVyaWZ5OgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNhX2NlcnRzOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NhX2NlcnRzIGlzIG5lZWRlZCB3aGVuIGNlcnRfcmVxcyBpcyBub3Qgc3NsLkNFUlRfTk9ORScpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLmFjY2VzcyhzZWxmLmNhX2NlcnRzLCBvcy5SX09LKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignQ2VydGlmaWNhdGUgQXV0aG9yaXR5IGNhX2NlcnRzIGZpbGUgIiVzIiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIG5vdCByZWFkYWJsZSwgY2Fubm90IHZhbGlkYXRlIFNTTCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NlcnRpZmljYXRlcy4nICUgKHNlbGYuY2FfY2VydHMpKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNlcnRmaWxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2VydGZpbGUKKworICAgIEBjZXJ0ZmlsZS5zZXR0ZXIKKyAgICBkZWYgY2VydGZpbGUoc2VsZiwgY2VydGZpbGUpOgorICAgICAgICBpZiBzZWxmLl9zZXJ2ZXJfc2lkZSBhbmQgbm90IGNlcnRmaWxlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignY2VydGZpbGUgaXMgbmVlZGVkIGZvciBzZXJ2ZXItc2lkZScpCisgICAgICAgIGlmIGNlcnRmaWxlIGFuZCBub3Qgb3MuYWNjZXNzKGNlcnRmaWxlLCBvcy5SX09LKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ05vIHN1Y2ggY2VydGZpbGUgZm91bmQ6ICVzJyAlIChjZXJ0ZmlsZSkpCisgICAgICAgIHNlbGYuX2NlcnRmaWxlID0gY2VydGZpbGUKKworICAgIGRlZiBfd3JhcF9zb2NrZXQoc2VsZiwgc29jayk6CisgICAgICAgIGlmIHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jdXN0b21fY29udGV4dDoKKyAgICAgICAgICAgICAgICBzZWxmLnNzbF9jb250ZXh0LnZlcmlmeV9tb2RlID0gc2VsZi5jZXJ0X3JlcXMKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNlcnRmaWxlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNzbF9jb250ZXh0LmxvYWRfY2VydF9jaGFpbihzZWxmLmNlcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmtleWZpbGUpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jaXBoZXJzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNzbF9jb250ZXh0LnNldF9jaXBoZXJzKHNlbGYuY2lwaGVycykKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNhX2NlcnRzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNzbF9jb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzZWxmLmNhX2NlcnRzKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3NsX2NvbnRleHQud3JhcF9zb2NrZXQoCisgICAgICAgICAgICAgICAgc29jaywgc2VydmVyX3NpZGU9c2VsZi5fc2VydmVyX3NpZGUsCisgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPXNlbGYuX3NlcnZlcl9ob3N0bmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNzbF9vcHRzID0geworICAgICAgICAgICAgICAgICdzc2xfdmVyc2lvbic6IHNlbGYuX3NzbF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICdzZXJ2ZXJfc2lkZSc6IHNlbGYuX3NlcnZlcl9zaWRlLAorICAgICAgICAgICAgICAgICdjYV9jZXJ0cyc6IHNlbGYuY2FfY2VydHMsCisgICAgICAgICAgICAgICAgJ2tleWZpbGUnOiBzZWxmLmtleWZpbGUsCisgICAgICAgICAgICAgICAgJ2NlcnRmaWxlJzogc2VsZi5jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAnY2VydF9yZXFzJzogc2VsZi5jZXJ0X3JlcXMsCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiBzZWxmLmNpcGhlcnM6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5faGFzX2NpcGhlcnM6CisgICAgICAgICAgICAgICAgICAgIHNzbF9vcHRzWydjaXBoZXJzJ10gPSBzZWxmLmNpcGhlcnMKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICdjaXBoZXJzIGlzIHNwZWNpZmllZCBidXQgaWdub3JlZCBkdWUgdG8gb2xkIFB5dGhvbiB2ZXJzaW9uJykKKyAgICAgICAgICAgIHJldHVybiBzc2wud3JhcF9zb2NrZXQoc29jaywgKipzc2xfb3B0cykKKworCitjbGFzcyBUU1NMU29ja2V0KFRTb2NrZXQuVFNvY2tldCwgVFNTTEJhc2UpOgorICAgICIiIgorICAgIFNTTCBpbXBsZW1lbnRhdGlvbiBvZiBUU29ja2V0CisKKyAgICBUaGlzIGNsYXNzIGNyZWF0ZXMgb3V0Ym91bmQgc29ja2V0cyB3cmFwcGVkIHVzaW5nIHRoZQorICAgIHB5dGhvbiBzdGFuZGFyZCBzc2wgbW9kdWxlIGZvciBlbmNyeXB0ZWQgY29ubmVjdGlvbnMuCisgICAgIiIiCisKKyAgICAjIE5ldyBzaWduYXR1cmUKKyAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsCisgICAgIyAgICAgICAgICAgICAgKipzc2xfYXJncyk6CisgICAgIyBEZXByZWNhdGVkIHNpZ25hdHVyZQorICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdmFsaWRhdGU9VHJ1ZSwKKyAgICAjICAgICAgICAgICAgICBjYV9jZXJ0cz1Ob25lLCBrZXlmaWxlPU5vbmUsIGNlcnRmaWxlPU5vbmUsCisgICAgIyAgICAgICAgICAgICAgdW5peF9zb2NrZXQ9Tm9uZSwgY2lwaGVycz1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiJQb3NpdGlvbmFsIGFyZ3VtZW50czogYGBob3N0YGAsIGBgcG9ydGBgLCBgYHVuaXhfc29ja2V0YGAKKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czogYGBrZXlmaWxlYGAsIGBgY2VydGZpbGVgYCwgYGBjZXJ0X3JlcXNgYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgc3NsX3ZlcnNpb25gYCwgYGBjYV9jZXJ0c2BgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBjaXBoZXJzYGAgKFB5dGhvbiAyLjcuMCBvciBsYXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBgYHNlcnZlcl9ob3N0bmFtZWBgIChQeXRob24gMi43Ljkgb3IgbGF0ZXIpCisgICAgICAgIFBhc3NlZCB0byBzc2wud3JhcF9zb2NrZXQuIFNlZSBzc2wud3JhcF9zb2NrZXQgZG9jdW1lbnRhdGlvbi4KKworICAgICAgICBBbHRlcm5hdGl2ZSBrZXl3b3JkIGFyZ3VtZW50czogKFB5dGhvbiAyLjcuOSBvciBsYXRlcikKKyAgICAgICAgICBgYHNzbF9jb250ZXh0YGA6IHNzbC5TU0xDb250ZXh0IHRvIGJlIHVzZWQgZm9yIFNTTENvbnRleHQud3JhcF9zb2NrZXQKKyAgICAgICAgICBgYHNlcnZlcl9ob3N0bmFtZWBgOiBQYXNzZWQgdG8gU1NMQ29udGV4dC53cmFwX3NvY2tldAorCisgICAgICAgIENvbW1vbiBrZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICAgIGBgdmFsaWRhdGVfY2FsbGJhY2tgYCAoY2VydCwgaG9zdG5hbWUpIC0+IE5vbmU6CisgICAgICAgICAgICAgIENhbGxlZCBhZnRlciBTU0wgaGFuZHNoYWtlLiBDYW4gcmFpc2Ugd2hlbiBob3N0bmFtZSBkb2VzIG5vdAorICAgICAgICAgICAgICBtYXRjaCB0aGUgY2VydC4KKyAgICAgICAgICBgYHNvY2tldF9rZWVwYWxpdmVgYCBlbmFibGUgVENQIGtlZXBhbGl2ZSwgZGVmYXVsdCBvZmYuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmlzX3ZhbGlkID0gRmFsc2UKKyAgICAgICAgc2VsZi5wZWVyY2VydCA9IE5vbmUKKworICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID4gNjoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnQnKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3VuaXhfc29ja2V0X2FyZyhob3N0LCBwb3J0LCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMCwgJ3ZhbGlkYXRlJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMSwgJ2NhX2NlcnRzJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMiwgJ2tleWZpbGUnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAzLCAnY2VydGZpbGUnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCA0LCAndW5peF9zb2NrZXQnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCA1LCAnY2lwaGVycycpCisKKyAgICAgICAgdmFsaWRhdGUgPSBrd2FyZ3MucG9wKCd2YWxpZGF0ZScsIE5vbmUpCisgICAgICAgIGlmIHZhbGlkYXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY2VydF9yZXFzX25hbWUgPSAnQ0VSVF9SRVFVSVJFRCcgaWYgdmFsaWRhdGUgZWxzZSAnQ0VSVF9OT05FJworICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAndmFsaWRhdGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0X3JlcXM9c3NsLiVzIGluc3RlYWQnCisgICAgICAgICAgICAgICAgJSBjZXJ0X3JlcXNfbmFtZSwKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgIGlmICdjZXJ0X3JlcXMnIGluIGt3YXJnczoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0Nhbm5vdCBzcGVjaWZ5IGJvdGggdmFsaWRhdGUgYW5kIGNlcnRfcmVxcycpCisgICAgICAgICAgICBrd2FyZ3NbJ2NlcnRfcmVxcyddID0gc3NsLkNFUlRfUkVRVUlSRUQgaWYgdmFsaWRhdGUgZWxzZSBzc2wuQ0VSVF9OT05FCisKKyAgICAgICAgdW5peF9zb2NrZXQgPSBrd2FyZ3MucG9wKCd1bml4X3NvY2tldCcsIE5vbmUpCisgICAgICAgIHNvY2tldF9rZWVwYWxpdmUgPSBrd2FyZ3MucG9wKCdzb2NrZXRfa2VlcGFsaXZlJywgRmFsc2UpCisgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2NhbGxiYWNrID0ga3dhcmdzLnBvcCgndmFsaWRhdGVfY2FsbGJhY2snLCBfbWF0Y2hfaG9zdG5hbWUpCisgICAgICAgIFRTU0xCYXNlLl9faW5pdF9fKHNlbGYsIEZhbHNlLCBob3N0LCBrd2FyZ3MpCisgICAgICAgIFRTb2NrZXQuVFNvY2tldC5fX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0LCB1bml4X3NvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9rZWVwYWxpdmU9c29ja2V0X2tlZXBhbGl2ZSkKKworICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgdHJ5OgotICAgICAgICAgIHNlbGYuaGFuZGxlLmNvbm5lY3QoaXBfcG9ydCkKLSAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgotICAgICAgICAgIGlmIHJlcyBpcyBub3QgcmVzMFstMV06Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBlCi0gICAgICAgIGJyZWFrCi0gICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgotICAgICAgaWYgc2VsZi5fdW5peF9zb2NrZXQ6Ci0gICAgICAgIG1lc3NhZ2UgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gc2VjdXJlIHNvY2tldCAlczogJXMnIFwKLSAgICAgICAgICAgICAgICAlIChzZWxmLl91bml4X3NvY2tldCwgZSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIG1lc3NhZ2UgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gJXM6JWQ6ICVzJyAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCwgZSkKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPW1lc3NhZ2UpCi0gICAgaWYgc2VsZi52YWxpZGF0ZToKLSAgICAgIHNlbGYuX3ZhbGlkYXRlX2NlcnQoKQorICAgICAgICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dCgwLjAwMSkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlID0gc2VsZi5oYW5kbGUudW53cmFwKCkKKyAgICAgICAgZXhjZXB0IChzc2wuU1NMRXJyb3IsIHNvY2tldC5lcnJvciwgT1NFcnJvcik6CisgICAgICAgICAgICAjIGNvdWxkIG5vdCBjb21wbGV0ZSBzaHV0ZG93biBpbiBhIHJlYXNvbmFibGUgYW1vdW50IG9mIHRpbWUuICBiYWlsLgorICAgICAgICAgICAgcGFzcworICAgICAgICBUU29ja2V0LlRTb2NrZXQuY2xvc2Uoc2VsZikKIAotICBkZWYgX3ZhbGlkYXRlX2NlcnQoc2VsZik6Ci0gICAgIiIiaW50ZXJuYWwgbWV0aG9kIHRvIHZhbGlkYXRlIHRoZSBwZWVyJ3MgU1NMIGNlcnRpZmljYXRlLCBhbmQgdG8gY2hlY2sgdGhlCi0gICAgY29tbW9uTmFtZSBvZiB0aGUgY2VydGlmaWNhdGUgdG8gZW5zdXJlIGl0IG1hdGNoZXMgdGhlIGhvc3RuYW1lIHdlCi0gICAgdXNlZCB0byBtYWtlIHRoaXMgY29ubmVjdGlvbi4gIERvZXMgbm90IHN1cHBvcnQgc3ViamVjdEFsdE5hbWUgcmVjb3JkcwotICAgIGluIGNlcnRpZmljYXRlcy4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgICAgIHdhcm5pbmdzLndhcm4oJ3ZhbGlkYXRlIGlzIGRlcHJlY2F0ZWQuIHBsZWFzZSB1c2UgY2VydF9yZXFzIGluc3RlYWQnLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICByZXR1cm4gc2VsZi5jZXJ0X3JlcXMgIT0gc3NsLkNFUlRfTk9ORQogCi0gICAgcmFpc2VzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlIGNlcnRpZmljYXRlIGZhaWxzIHZhbGlkYXRpb24uCisgICAgQHZhbGlkYXRlLnNldHRlcgorICAgIGRlZiB2YWxpZGF0ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIHdhcm5pbmdzLndhcm4oJ3ZhbGlkYXRlIGlzIGRlcHJlY2F0ZWQuIHBsZWFzZSB1c2UgY2VydF9yZXFzIGluc3RlYWQnLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICBzZWxmLmNlcnRfcmVxcyA9IHNzbC5DRVJUX1JFUVVJUkVEIGlmIHZhbHVlIGVsc2Ugc3NsLkNFUlRfTk9ORQorCisgICAgZGVmIF9kb19vcGVuKHNlbGYsIGZhbWlseSwgc29ja3R5cGUpOgorICAgICAgICBwbGFpbl9zb2NrID0gc29ja2V0LnNvY2tldChmYW1pbHksIHNvY2t0eXBlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fd3JhcF9zb2NrZXQocGxhaW5fc29jaykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBsYWluX3NvY2suY2xvc2UoKQorICAgICAgICAgICAgbXNnID0gJ2ZhaWxlZCB0byBpbml0aWFsaXplIFNTTCcKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24obXNnKQorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBtc2cpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgc3VwZXIoVFNTTFNvY2tldCwgc2VsZikub3BlbigpCisgICAgICAgIGlmIHNlbGYuX3Nob3VsZF92ZXJpZnk6CisgICAgICAgICAgICBzZWxmLnBlZXJjZXJ0ID0gc2VsZi5oYW5kbGUuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2NhbGxiYWNrKHNlbGYucGVlcmNlcnQsIHNlbGYuX3NlcnZlcl9ob3N0bmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmlzX3ZhbGlkID0gVHJ1ZQorICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sIHN0cihleCkpCisKKworY2xhc3MgVFNTTFNlcnZlclNvY2tldChUU29ja2V0LlRTZXJ2ZXJTb2NrZXQsIFRTU0xCYXNlKToKKyAgICAiIiJTU0wgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclNvY2tldAorCisgICAgVGhpcyB1c2VzIHRoZSBzc2wgbW9kdWxlJ3Mgd3JhcF9zb2NrZXQoKSBtZXRob2QgdG8gcHJvdmlkZSBTU0wKKyAgICBuZWdvdGlhdGVkIGVuY3J5cHRpb24uCiAgICAgIiIiCi0gICAgY2VydCA9IHNlbGYuaGFuZGxlLmdldHBlZXJjZXJ0KCkKLSAgICBzZWxmLnBlZXJjZXJ0ID0gY2VydAotICAgIGlmICdzdWJqZWN0JyBub3QgaW4gY2VydDoKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCi0gICAgICAgIHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKLSAgICAgICAgbWVzc2FnZT0nTm8gU1NMIGNlcnRpZmljYXRlIGZvdW5kIGZyb20gJXM6JXMnICUgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSkKLSAgICBmaWVsZHMgPSBjZXJ0WydzdWJqZWN0J10KLSAgICBmb3IgZmllbGQgaW4gZmllbGRzOgotICAgICAgIyBlbnN1cmUgc3RydWN0dXJlIHdlIGdldCBiYWNrIGlzIHdoYXQgd2UgZXhwZWN0Ci0gICAgICBpZiBub3QgaXNpbnN0YW5jZShmaWVsZCwgdHVwbGUpOgotICAgICAgICBjb250aW51ZQotICAgICAgY2VydF9wYWlyID0gZmllbGRbMF0KLSAgICAgIGlmIGxlbihjZXJ0X3BhaXIpIDwgMjoKLSAgICAgICAgY29udGludWUKLSAgICAgIGNlcnRfa2V5LCBjZXJ0X3ZhbHVlID0gY2VydF9wYWlyWzA6Ml0KLSAgICAgIGlmIGNlcnRfa2V5ICE9ICdjb21tb25OYW1lJzoKLSAgICAgICAgY29udGludWUKLSAgICAgIGNlcnRob3N0ID0gY2VydF92YWx1ZQotICAgICAgIyB0aGlzIGNoZWNrIHNob3VsZCBiZSBwZXJmb3JtZWQgYnkgc29tZSBzb3J0IG9mIEFjY2VzcyBNYW5hZ2VyCi0gICAgICBpZiBjZXJ0aG9zdCA9PSBzZWxmLmhvc3Q6Ci0gICAgICAgICMgc3VjY2VzcywgY2VydCBjb21tb25OYW1lIG1hdGNoZXMgZGVzaXJlZCBob3N0bmFtZQotICAgICAgICBzZWxmLmlzX3ZhbGlkID0gVHJ1ZQotICAgICAgICByZXR1cm4KLSAgICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCi0gICAgICAgICAgdHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCi0gICAgICAgICAgbWVzc2FnZT0nSG9zdG5hbWUgd2UgY29ubmVjdGVkIHRvICIlcyIgZG9lc25cJ3QgbWF0Y2ggY2VydGlmaWNhdGUgJwotICAgICAgICAgICAgICAgICAgJ3Byb3ZpZGVkIGNvbW1vbk5hbWUgIiVzIicgJSAoc2VsZi5ob3N0LCBjZXJ0aG9zdCkpCi0gICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKLSAgICAgIHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLAotICAgICAgbWVzc2FnZT0nQ291bGQgbm90IHZhbGlkYXRlIFNTTCBjZXJ0aWZpY2F0ZSBmcm9tICcKLSAgICAgICAgICAgICAgJ2hvc3QgIiVzIi4gIENlcnQ9JXMnICUgKHNlbGYuaG9zdCwgY2VydCkpCiAKKyAgICAjIE5ldyBzaWduYXR1cmUKKyAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsICoqc3NsX2FyZ3MpOgorICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PU5vbmUsIHBvcnQ9OTA5MCwgY2VydGZpbGU9J2NlcnQucGVtJywgdW5peF9zb2NrZXQ9Tm9uZSwgY2lwaGVycz1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIlBvc2l0aW9uYWwgYXJndW1lbnRzOiBgYGhvc3RgYCwgYGBwb3J0YGAsIGBgdW5peF9zb2NrZXRgYAogCi1jbGFzcyBUU1NMU2VydmVyU29ja2V0KFRTb2NrZXQuVFNlcnZlclNvY2tldCk6Ci0gICIiIlNTTCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyU29ja2V0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOiBgYGtleWZpbGVgYCwgYGBjZXJ0ZmlsZWBgLCBgYGNlcnRfcmVxc2BgLCBgYHNzbF92ZXJzaW9uYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBgYGNhX2NlcnRzYGAsIGBgY2lwaGVyc2BgIChQeXRob24gMi43LjAgb3IgbGF0ZXIpCisgICAgICAgIFNlZSBzc2wud3JhcF9zb2NrZXQgZG9jdW1lbnRhdGlvbi4KIAotICBUaGlzIHVzZXMgdGhlIHNzbCBtb2R1bGUncyB3cmFwX3NvY2tldCgpIG1ldGhvZCB0byBwcm92aWRlIFNTTAotICBuZWdvdGlhdGVkIGVuY3J5cHRpb24uCi0gICIiIgotICBTU0xfVkVSU0lPTiA9IHNzbC5QUk9UT0NPTF9UTFN2MQorICAgICAgICBBbHRlcm5hdGl2ZSBrZXl3b3JkIGFyZ3VtZW50czogKFB5dGhvbiAyLjcuOSBvciBsYXRlcikKKyAgICAgICAgICBgYHNzbF9jb250ZXh0YGA6IHNzbC5TU0xDb250ZXh0IHRvIGJlIHVzZWQgZm9yIFNTTENvbnRleHQud3JhcF9zb2NrZXQKKyAgICAgICAgICBgYHNlcnZlcl9ob3N0bmFtZWBgOiBQYXNzZWQgdG8gU1NMQ29udGV4dC53cmFwX3NvY2tldAogCi0gIGRlZiBfX2luaXRfXyhzZWxmLAotICAgICAgICAgICAgICAgaG9zdD1Ob25lLAotICAgICAgICAgICAgICAgcG9ydD05MDkwLAotICAgICAgICAgICAgICAgY2VydGZpbGU9J2NlcnQucGVtJywKLSAgICAgICAgICAgICAgIHVuaXhfc29ja2V0PU5vbmUsCi0gICAgICAgICAgICAgICBjaXBoZXJzPU5vbmUpOgotICAgICIiIkluaXRpYWxpemUgYSBUU1NMU2VydmVyU29ja2V0CisgICAgICAgIENvbW1vbiBrZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICAgIGBgdmFsaWRhdGVfY2FsbGJhY2tgYCAoY2VydCwgaG9zdG5hbWUpIC0+IE5vbmU6CisgICAgICAgICAgICAgIENhbGxlZCBhZnRlciBTU0wgaGFuZHNoYWtlLiBDYW4gcmFpc2Ugd2hlbiBob3N0bmFtZSBkb2VzIG5vdAorICAgICAgICAgICAgICBtYXRjaCB0aGUgY2VydC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICBpZiBsZW4oYXJncykgPiAzOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudCcpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fdW5peF9zb2NrZXRfYXJnKGhvc3QsIHBvcnQsIGFyZ3MsIGt3YXJncyk6CisgICAgICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAwLCAnY2VydGZpbGUnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAxLCAndW5peF9zb2NrZXQnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAyLCAnY2lwaGVycycpCiAKLSAgICBAcGFyYW0gY2VydGZpbGU6IGZpbGVuYW1lIG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUsIGRlZmF1bHRzIHRvIGNlcnQucGVtCi0gICAgQHR5cGUgY2VydGZpbGU6IHN0cgotICAgIEBwYXJhbSBob3N0OiBUaGUgaG9zdG5hbWUgb3IgSVAgdG8gYmluZCB0aGUgbGlzdGVuIHNvY2tldCB0bywKLSAgICAgICAgICAgICAgICAgaS5lLiAnbG9jYWxob3N0JyBmb3Igb25seSBhbGxvd2luZyBsb2NhbCBuZXR3b3JrIGNvbm5lY3Rpb25zLgotICAgICAgICAgICAgICAgICBQYXNzIE5vbmUgdG8gYmluZCB0byBhbGwgaW50ZXJmYWNlcy4KLSAgICBAdHlwZSBob3N0OiBzdHIKLSAgICBAcGFyYW0gcG9ydDogVGhlIHBvcnQgdG8gbGlzdGVuIG9uIGZvciBpbmJvdW5kIGNvbm5lY3Rpb25zLgotICAgIEB0eXBlIHBvcnQ6IGludAotICAgIEBwYXJhbSBjaXBoZXJzOiBUaGUgY2lwaGVyIHN1aXRlcyB0byBhbGxvdy4gVGhpcyBpcyBwYXNzZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgdGhlIHNzbF93cmFwIGZ1bmN0aW9uIGFzIHRoZSAnY2lwaGVycycgcGFyYW1ldGVyLgotICAgIEB0eXBlIGNpcGhlcnM6IHN0cgorICAgICAgICBpZiAnc3NsX2NvbnRleHQnIG5vdCBpbiBrd2FyZ3M6CisgICAgICAgICAgICAjIFByZXNlcnZlIGV4aXN0aW5nIGJlaGF2aW9ycyBmb3IgZGVmYXVsdCB2YWx1ZXMKKyAgICAgICAgICAgIGlmICdjZXJ0X3JlcXMnIG5vdCBpbiBrd2FyZ3M6CisgICAgICAgICAgICAgICAga3dhcmdzWydjZXJ0X3JlcXMnXSA9IHNzbC5DRVJUX05PTkUKKyAgICAgICAgICAgIGlmJ2NlcnRmaWxlJyBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAgICAgIGt3YXJnc1snY2VydGZpbGUnXSA9ICdjZXJ0LnBlbScKIAotICAgICIiIgotICAgIHNlbGYuc2V0Q2VydGZpbGUoY2VydGZpbGUpCi0gICAgVFNvY2tldC5UU2VydmVyU29ja2V0Ll9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQpCi0gICAgc2VsZi5jaXBoZXJzID0gY2lwaGVycworICAgICAgICB1bml4X3NvY2tldCA9IGt3YXJncy5wb3AoJ3VuaXhfc29ja2V0JywgTm9uZSkKKyAgICAgICAgc2VsZi5fdmFsaWRhdGVfY2FsbGJhY2sgPSBcCisgICAgICAgICAgICBrd2FyZ3MucG9wKCd2YWxpZGF0ZV9jYWxsYmFjaycsIF9tYXRjaF9ob3N0bmFtZSkKKyAgICAgICAgVFNTTEJhc2UuX19pbml0X18oc2VsZiwgVHJ1ZSwgTm9uZSwga3dhcmdzKQorICAgICAgICBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgdW5peF9zb2NrZXQpCisgICAgICAgIGlmIHNlbGYuX3Nob3VsZF92ZXJpZnkgYW5kIG5vdCBfbWF0Y2hfaGFzX2lwYWRkcmVzczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ05lZWQgaXBhZGRyZXNzIGFuZCBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZSB0byB2ZXJpZnkgY2xpZW50IGNlcnRpZmljYXRlJykKIAotICBkZWYgc2V0Q2VydGZpbGUoc2VsZiwgY2VydGZpbGUpOgotICAgICIiIlNldCBvciBjaGFuZ2UgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBmaWxlIHVzZWQgdG8gd3JhcCBuZXcgY29ubmVjdGlvbnMuCisgICAgZGVmIHNldENlcnRmaWxlKHNlbGYsIGNlcnRmaWxlKToKKyAgICAgICAgIiIiU2V0IG9yIGNoYW5nZSB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGZpbGUgdXNlZCB0byB3cmFwIG5ldworICAgICAgICBjb25uZWN0aW9ucy4KIAotICAgIEBwYXJhbSBjZXJ0ZmlsZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUsCi0gICAgICAgICAgICAgICAgICAgICBpLmUuICcvZXRjL2NlcnRzL3NlcnZlci5wZW0nCi0gICAgQHR5cGUgY2VydGZpbGU6IHN0cgorICAgICAgICBAcGFyYW0gY2VydGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGkuZS4gJy9ldGMvY2VydHMvc2VydmVyLnBlbScKKyAgICAgICAgQHR5cGUgY2VydGZpbGU6IHN0cgogCi0gICAgUmFpc2VzIGFuIElPRXJyb3IgZXhjZXB0aW9uIGlmIHRoZSBjZXJ0ZmlsZSBpcyBub3QgcHJlc2VudCBvciB1bnJlYWRhYmxlLgotICAgICIiIgotICAgIGlmIG5vdCBvcy5hY2Nlc3MoY2VydGZpbGUsIG9zLlJfT0spOgotICAgICAgcmFpc2UgSU9FcnJvcignTm8gc3VjaCBjZXJ0ZmlsZSBmb3VuZDogJXMnICUgKGNlcnRmaWxlKSkKLSAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKKyAgICAgICAgUmFpc2VzIGFuIElPRXJyb3IgZXhjZXB0aW9uIGlmIHRoZSBjZXJ0ZmlsZSBpcyBub3QgcHJlc2VudCBvciB1bnJlYWRhYmxlLgorICAgICAgICAiIiIKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICdzZXRDZXJ0ZmlsZSBpcyBkZXByZWNhdGVkLiBwbGVhc2UgdXNlIGNlcnRmaWxlIHByb3BlcnR5IGluc3RlYWQuJywKKyAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKIAotICBkZWYgYWNjZXB0KHNlbGYpOgotICAgIHBsYWluX2NsaWVudCwgYWRkciA9IHNlbGYuaGFuZGxlLmFjY2VwdCgpCi0gICAgdHJ5OgotICAgICAgY2xpZW50ID0gc3NsLndyYXBfc29ja2V0KHBsYWluX2NsaWVudCwgY2VydGZpbGU9c2VsZi5jZXJ0ZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfc2lkZT1UcnVlLCBzc2xfdmVyc2lvbj1zZWxmLlNTTF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnM9c2VsZi5jaXBoZXJzKQotICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IgYXMgc3NsX2V4YzoKLSAgICAgICMgZmFpbGVkIGhhbmRzaGFrZS9zc2wgd3JhcCwgY2xvc2Ugc29ja2V0IHRvIGNsaWVudAotICAgICAgcGxhaW5fY2xpZW50LmNsb3NlKCkKLSAgICAgICMgcmFpc2Ugc3NsX2V4YwotICAgICAgIyBXZSBjYW4ndCByYWlzZSB0aGUgZXhjZXB0aW9uLCBiZWNhdXNlIGl0IGtpbGxzIG1vc3QgVFNlcnZlciBkZXJpdmVkCi0gICAgICAjIHNlcnZlKCkgbWV0aG9kcy4KLSAgICAgICMgSW5zdGVhZCwgcmV0dXJuIE5vbmUsIGFuZCBsZXQgdGhlIFRTZXJ2ZXIgaW5zdGFuY2UgZGVhbCB3aXRoIGl0IGluCi0gICAgICAjIG90aGVyIGV4Y2VwdGlvbiBoYW5kbGluZy4gIChidXQgVFNpbXBsZVNlcnZlciBkaWVzIGFueXdheSkKLSAgICAgIHJldHVybiBOb25lCi0gICAgcmVzdWx0ID0gVFNvY2tldC5UU29ja2V0KCkKLSAgICByZXN1bHQuc2V0SGFuZGxlKGNsaWVudCkKLSAgICByZXR1cm4gcmVzdWx0CisgICAgZGVmIGFjY2VwdChzZWxmKToKKyAgICAgICAgcGxhaW5fY2xpZW50LCBhZGRyID0gc2VsZi5oYW5kbGUuYWNjZXB0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5fd3JhcF9zb2NrZXQocGxhaW5fY2xpZW50KQorICAgICAgICBleGNlcHQgKHNzbC5TU0xFcnJvciwgc29ja2V0LmVycm9yLCBPU0Vycm9yKToKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ0Vycm9yIHdoaWxlIGFjY2VwdGluZyBmcm9tICVzJywgYWRkcikKKyAgICAgICAgICAgICMgZmFpbGVkIGhhbmRzaGFrZS9zc2wgd3JhcCwgY2xvc2Ugc29ja2V0IHRvIGNsaWVudAorICAgICAgICAgICAgcGxhaW5fY2xpZW50LmNsb3NlKCkKKyAgICAgICAgICAgICMgcmFpc2UKKyAgICAgICAgICAgICMgV2UgY2FuJ3QgcmFpc2UgdGhlIGV4Y2VwdGlvbiwgYmVjYXVzZSBpdCBraWxscyBtb3N0IFRTZXJ2ZXIgZGVyaXZlZAorICAgICAgICAgICAgIyBzZXJ2ZSgpIG1ldGhvZHMuCisgICAgICAgICAgICAjIEluc3RlYWQsIHJldHVybiBOb25lLCBhbmQgbGV0IHRoZSBUU2VydmVyIGluc3RhbmNlIGRlYWwgd2l0aCBpdCBpbgorICAgICAgICAgICAgIyBvdGhlciBleGNlcHRpb24gaGFuZGxpbmcuICAoYnV0IFRTaW1wbGVTZXJ2ZXIgZGllcyBhbnl3YXkpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGlmIHNlbGYuX3Nob3VsZF92ZXJpZnk6CisgICAgICAgICAgICBjbGllbnQucGVlcmNlcnQgPSBjbGllbnQuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2NhbGxiYWNrKGNsaWVudC5wZWVyY2VydCwgYWRkclswXSkKKyAgICAgICAgICAgICAgICBjbGllbnQuaXNfdmFsaWQgPSBUcnVlCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gdmFsaWRhdGUgY2xpZW50IGNlcnRpZmljYXRlIGFkZHJlc3M6ICVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyWzBdLCBleGNfaW5mbz1UcnVlKQorICAgICAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpCisgICAgICAgICAgICAgICAgcGxhaW5fY2xpZW50LmNsb3NlKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHJlc3VsdCA9IFRTb2NrZXQuVFNvY2tldCgpCisgICAgICAgIHJlc3VsdC5oYW5kbGUgPSBjbGllbnQKKyAgICAgICAgcmV0dXJuIHJlc3VsdApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNvY2tldC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTb2NrZXQucHkKaW5kZXggN2I1NjRhYS4uYzhiZTI1YSAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNvY2tldC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnB5CkBAIC0xOCwxNjMgKzE4LDE5MyBAQAogIwogCiBpbXBvcnQgZXJybm8KK2ltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3MKIGltcG9ydCBzb2NrZXQKIGltcG9ydCBzeXMKIAotZnJvbSBUVHJhbnNwb3J0IGltcG9ydCAqCitmcm9tIC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZSwgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgVFNlcnZlclRyYW5zcG9ydEJhc2UKKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAKIAogY2xhc3MgVFNvY2tldEJhc2UoVFRyYW5zcG9ydEJhc2UpOgotICBkZWYgX3Jlc29sdmVBZGRyKHNlbGYpOgotICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0IGlzIG5vdCBOb25lOgotICAgICAgcmV0dXJuIFsoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSwgTm9uZSwgTm9uZSwKLSAgICAgICAgICAgICAgIHNlbGYuX3VuaXhfc29ja2V0KV0KLSAgICBlbHNlOgotICAgICAgcmV0dXJuIHNvY2tldC5nZXRhZGRyaW5mbyhzZWxmLmhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc29ja2V0X2ZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LlNPQ0tfU1RSRUFNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuQUlfUEFTU0lWRSB8IHNvY2tldC5BSV9BRERSQ09ORklHKQorICAgIGRlZiBfcmVzb2x2ZUFkZHIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIFsoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSwgTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3VuaXhfc29ja2V0KV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzb2NrZXQuZ2V0YWRkcmluZm8oc2VsZi5ob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NvY2tldF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5TT0NLX1NUUkVBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LkFJX1BBU1NJVkUgfCBzb2NrZXQuQUlfQUREUkNPTkZJRykKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgaWYgc2VsZi5oYW5kbGU6Ci0gICAgICBzZWxmLmhhbmRsZS5jbG9zZSgpCi0gICAgICBzZWxmLmhhbmRsZSA9IE5vbmUKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFuZGxlOgorICAgICAgICAgICAgc2VsZi5oYW5kbGUuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5oYW5kbGUgPSBOb25lCiAKIAogY2xhc3MgVFNvY2tldChUU29ja2V0QmFzZSk6Ci0gICIiIlNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCisgICAgIiIiU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQgYmFzZS4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLCBzb2NrZXRfZmFtaWx5PXNvY2tldC5BRl9VTlNQRUMpOgotICAgICIiIkluaXRpYWxpemUgYSBUU29ja2V0CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgc29ja2V0X2ZhbWlseT1zb2NrZXQuQUZfVU5TUEVDLAorICAgICAgICAgICAgICAgICBzb2NrZXRfa2VlcGFsaXZlPUZhbHNlKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIFRTb2NrZXQKIAotICAgIEBwYXJhbSBob3N0KHN0cikgIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8uCi0gICAgQHBhcmFtIHBvcnQoaW50KSAgVGhlIChUQ1ApIHBvcnQgdG8gY29ubmVjdCB0by4KLSAgICBAcGFyYW0gdW5peF9zb2NrZXQoc3RyKSAgVGhlIGZpbGVuYW1lIG9mIGEgdW5peCBzb2NrZXQgdG8gY29ubmVjdCB0by4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhvc3QgYW5kIHBvcnQgd2lsbCBiZSBpZ25vcmVkLikKLSAgICBAcGFyYW0gc29ja2V0X2ZhbWlseShpbnQpICBUaGUgc29ja2V0IGZhbWlseSB0byB1c2Ugd2l0aCB0aGlzIHNvY2tldC4KLSAgICAiIiIKLSAgICBzZWxmLmhvc3QgPSBob3N0Ci0gICAgc2VsZi5wb3J0ID0gcG9ydAotICAgIHNlbGYuaGFuZGxlID0gTm9uZQotICAgIHNlbGYuX3VuaXhfc29ja2V0ID0gdW5peF9zb2NrZXQKLSAgICBzZWxmLl90aW1lb3V0ID0gTm9uZQotICAgIHNlbGYuX3NvY2tldF9mYW1pbHkgPSBzb2NrZXRfZmFtaWx5CisgICAgICAgIEBwYXJhbSBob3N0KHN0cikgIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8uCisgICAgICAgIEBwYXJhbSBwb3J0KGludCkgIFRoZSAoVENQKSBwb3J0IHRvIGNvbm5lY3QgdG8uCisgICAgICAgIEBwYXJhbSB1bml4X3NvY2tldChzdHIpICBUaGUgZmlsZW5hbWUgb2YgYSB1bml4IHNvY2tldCB0byBjb25uZWN0IHRvLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhvc3QgYW5kIHBvcnQgd2lsbCBiZSBpZ25vcmVkLikKKyAgICAgICAgQHBhcmFtIHNvY2tldF9mYW1pbHkoaW50KSAgVGhlIHNvY2tldCBmYW1pbHkgdG8gdXNlIHdpdGggdGhpcyBzb2NrZXQuCisgICAgICAgIEBwYXJhbSBzb2NrZXRfa2VlcGFsaXZlKGJvb2wpIGVuYWJsZSBUQ1Aga2VlcGFsaXZlLCBkZWZhdWx0IG9mZi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLmhhbmRsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fdW5peF9zb2NrZXQgPSB1bml4X3NvY2tldAorICAgICAgICBzZWxmLl90aW1lb3V0ID0gTm9uZQorICAgICAgICBzZWxmLl9zb2NrZXRfZmFtaWx5ID0gc29ja2V0X2ZhbWlseQorICAgICAgICBzZWxmLl9zb2NrZXRfa2VlcGFsaXZlID0gc29ja2V0X2tlZXBhbGl2ZQogCi0gIGRlZiBzZXRIYW5kbGUoc2VsZiwgaCk6Ci0gICAgc2VsZi5oYW5kbGUgPSBoCisgICAgZGVmIHNldEhhbmRsZShzZWxmLCBoKToKKyAgICAgICAgc2VsZi5oYW5kbGUgPSBoCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5oYW5kbGUgaXMgbm90IE5vbmUKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGUgaXMgbm90IE5vbmUKIAotICBkZWYgc2V0VGltZW91dChzZWxmLCBtcyk6Ci0gICAgaWYgbXMgaXMgTm9uZToKLSAgICAgIHNlbGYuX3RpbWVvdXQgPSBOb25lCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX3RpbWVvdXQgPSBtcyAvIDEwMDAuMAorICAgIGRlZiBzZXRUaW1lb3V0KHNlbGYsIG1zKToKKyAgICAgICAgaWYgbXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3RpbWVvdXQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl90aW1lb3V0ID0gbXMgLyAxMDAwLjAKIAotICAgIGlmIHNlbGYuaGFuZGxlIGlzIG5vdCBOb25lOgotICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChzZWxmLl90aW1lb3V0KQorICAgICAgICBpZiBzZWxmLmhhbmRsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICB0cnk6Ci0gICAgICByZXMwID0gc2VsZi5fcmVzb2x2ZUFkZHIoKQotICAgICAgZm9yIHJlcyBpbiByZXMwOgotICAgICAgICBzZWxmLmhhbmRsZSA9IHNvY2tldC5zb2NrZXQocmVzWzBdLCByZXNbMV0pCi0gICAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKKyAgICBkZWYgX2RvX29wZW4oc2VsZiwgZmFtaWx5LCBzb2NrdHlwZSk6CisgICAgICAgIHJldHVybiBzb2NrZXQuc29ja2V0KGZhbWlseSwgc29ja3R5cGUpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX2FkZHJlc3Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl91bml4X3NvY2tldCBpZiBzZWxmLl91bml4X3NvY2tldCBlbHNlICclczolZCcgJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYW5kbGU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQUxSRUFEWV9PUEVOKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgc2VsZi5oYW5kbGUuY29ubmVjdChyZXNbNF0pCisgICAgICAgICAgICBhZGRycyA9IHNlbGYuX3Jlc29sdmVBZGRyKCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5nYWllcnJvcjoKKyAgICAgICAgICAgIG1zZyA9ICdmYWlsZWQgdG8gcmVzb2x2ZSBzb2NrYWRkciBmb3IgJyArIHN0cihzZWxmLl9hZGRyZXNzKQorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbihtc2cpCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIG1zZykKKyAgICAgICAgZm9yIGZhbWlseSwgc29ja3R5cGUsIF8sIF8sIHNvY2thZGRyIGluIGFkZHJzOgorICAgICAgICAgICAgaGFuZGxlID0gc2VsZi5fZG9fb3BlbihmYW1pbHksIHNvY2t0eXBlKQorCisgICAgICAgICAgICAjIFRDUF9LRUVQQUxJVkUKKyAgICAgICAgICAgIGlmIHNlbGYuX3NvY2tldF9rZWVwYWxpdmU6CisgICAgICAgICAgICAgICAgaGFuZGxlLnNldHNvY2tvcHQoc29ja2V0LklQUFJPVE9fVENQLCBzb2NrZXQuU09fS0VFUEFMSVZFLCAxKQorCisgICAgICAgICAgICBoYW5kbGUuc2V0dGltZW91dChzZWxmLl90aW1lb3V0KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGhhbmRsZS5jb25uZWN0KHNvY2thZGRyKQorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlID0gaGFuZGxlCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgIGhhbmRsZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0NvdWxkIG5vdCBjb25uZWN0IHRvICVzJywgc29ja2FkZHIsIGV4Y19pbmZvPVRydWUpCisgICAgICAgIG1zZyA9ICdDb3VsZCBub3QgY29ubmVjdCB0byBhbnkgb2YgJXMnICUgbGlzdChtYXAobGFtYmRhIGE6IGFbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcnMpKQorICAgICAgICBsb2dnZXIuZXJyb3IobXNnKQorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIG1zZykKKworICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnVmZiA9IHNlbGYuaGFuZGxlLnJlY3Yoc3opCiAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKLSAgICAgICAgICBpZiByZXMgaXMgbm90IHJlczBbLTFdOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgZQotICAgICAgICBicmVhawotICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKLSAgICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0OgotICAgICAgICBtZXNzYWdlID0gJ0NvdWxkIG5vdCBjb25uZWN0IHRvIHNvY2tldCAlcycgJSBzZWxmLl91bml4X3NvY2tldAotICAgICAgZWxzZToKLSAgICAgICAgbWVzc2FnZSA9ICdDb3VsZCBub3QgY29ubmVjdCB0byAlczolZCcgJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCi0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT1tZXNzYWdlKQorICAgICAgICAgICAgaWYgKGUuYXJnc1swXSA9PSBlcnJuby5FQ09OTlJFU0VUIGFuZAorICAgICAgICAgICAgICAgICAgICAoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdmcmVlYnNkJykpKToKKyAgICAgICAgICAgICAgICAjIGZyZWVic2QgYW5kIE1hY2ggZG9uJ3QgZm9sbG93IFBPU0lYIHNlbWFudGljIG9mIHJlY3YKKyAgICAgICAgICAgICAgICAjIGFuZCBmYWlsIHdpdGggRUNPTk5SRVNFVCBpZiBwZWVyIHBlcmZvcm1lZCBzaHV0ZG93bi4KKyAgICAgICAgICAgICAgICAjIFNlZSBjb3JyZXNwb25kaW5nIGNvbW1lbnQgYW5kIGNvZGUgaW4gVFNvY2tldDo6cmVhZCgpCisgICAgICAgICAgICAgICAgIyBpbiBsaWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5jcHAuCisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgIyBUcmlnZ2VyIHRoZSBjaGVjayB0byByYWlzZSB0aGUgRU5EX09GX0ZJTEUgZXhjZXB0aW9uIGJlbG93LgorICAgICAgICAgICAgICAgIGJ1ZmYgPSAnJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBpZiBsZW4oYnVmZikgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUU29ja2V0IHJlYWQgMCBieXRlcycpCisgICAgICAgIHJldHVybiBidWZmCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHRyeToKLSAgICAgIGJ1ZmYgPSBzZWxmLmhhbmRsZS5yZWN2KHN6KQotICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKLSAgICAgIGlmIChlLmFyZ3NbMF0gPT0gZXJybm8uRUNPTk5SRVNFVCBhbmQKLSAgICAgICAgICAoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdmcmVlYnNkJykpKToKLSAgICAgICAgIyBmcmVlYnNkIGFuZCBNYWNoIGRvbid0IGZvbGxvdyBQT1NJWCBzZW1hbnRpYyBvZiByZWN2Ci0gICAgICAgICMgYW5kIGZhaWwgd2l0aCBFQ09OTlJFU0VUIGlmIHBlZXIgcGVyZm9ybWVkIHNodXRkb3duLgotICAgICAgICAjIFNlZSBjb3JyZXNwb25kaW5nIGNvbW1lbnQgYW5kIGNvZGUgaW4gVFNvY2tldDo6cmVhZCgpCi0gICAgICAgICMgaW4gbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuY3BwLgotICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgIyBUcmlnZ2VyIHRoZSBjaGVjayB0byByYWlzZSB0aGUgRU5EX09GX0ZJTEUgZXhjZXB0aW9uIGJlbG93LgotICAgICAgICBidWZmID0gJycKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlCi0gICAgaWYgbGVuKGJ1ZmYpID09IDA6Ci0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVFNvY2tldCByZWFkIDAgYnl0ZXMnKQotICAgIHJldHVybiBidWZmCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1ZmYpOgorICAgICAgICBpZiBub3Qgc2VsZi5oYW5kbGU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVHJhbnNwb3J0IG5vdCBvcGVuJykKKyAgICAgICAgc2VudCA9IDAKKyAgICAgICAgaGF2ZSA9IGxlbihidWZmKQorICAgICAgICB3aGlsZSBzZW50IDwgaGF2ZToKKyAgICAgICAgICAgIHBsdXMgPSBzZWxmLmhhbmRsZS5zZW5kKGJ1ZmYpCisgICAgICAgICAgICBpZiBwbHVzID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUU29ja2V0IHNlbnQgMCBieXRlcycpCisgICAgICAgICAgICBzZW50ICs9IHBsdXMKKyAgICAgICAgICAgIGJ1ZmYgPSBidWZmW3BsdXM6XQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWZmKToKLSAgICBpZiBub3Qgc2VsZi5oYW5kbGU6Ci0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVHJhbnNwb3J0IG5vdCBvcGVuJykKLSAgICBzZW50ID0gMAotICAgIGhhdmUgPSBsZW4oYnVmZikKLSAgICB3aGlsZSBzZW50IDwgaGF2ZToKLSAgICAgIHBsdXMgPSBzZWxmLmhhbmRsZS5zZW5kKGJ1ZmYpCi0gICAgICBpZiBwbHVzID09IDA6Ci0gICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1RTb2NrZXQgc2VudCAwIGJ5dGVzJykKLSAgICAgIHNlbnQgKz0gcGx1cwotICAgICAgYnVmZiA9IGJ1ZmZbcGx1czpdCi0KLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHBhc3MKIAogCiBjbGFzcyBUU2VydmVyU29ja2V0KFRTb2NrZXRCYXNlLCBUU2VydmVyVHJhbnNwb3J0QmFzZSk6Ci0gICIiIlNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0IGJhc2UuIiIiCisgICAgIiIiU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQgYmFzZS4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsIHNvY2tldF9mYW1pbHk9c29ja2V0LkFGX1VOU1BFQyk6Ci0gICAgc2VsZi5ob3N0ID0gaG9zdAotICAgIHNlbGYucG9ydCA9IHBvcnQKLSAgICBzZWxmLl91bml4X3NvY2tldCA9IHVuaXhfc29ja2V0Ci0gICAgc2VsZi5fc29ja2V0X2ZhbWlseSA9IHNvY2tldF9mYW1pbHkKLSAgICBzZWxmLmhhbmRsZSA9IE5vbmUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsIHNvY2tldF9mYW1pbHk9c29ja2V0LkFGX1VOU1BFQyk6CisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLl91bml4X3NvY2tldCA9IHVuaXhfc29ja2V0CisgICAgICAgIHNlbGYuX3NvY2tldF9mYW1pbHkgPSBzb2NrZXRfZmFtaWx5CisgICAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQorICAgICAgICBzZWxmLl9iYWNrbG9nID0gMTI4CiAKLSAgZGVmIGxpc3RlbihzZWxmKToKLSAgICByZXMwID0gc2VsZi5fcmVzb2x2ZUFkZHIoKQotICAgIHNvY2tldF9mYW1pbHkgPSBzZWxmLl9zb2NrZXRfZmFtaWx5ID09IHNvY2tldC5BRl9VTlNQRUMgYW5kIHNvY2tldC5BRl9JTkVUNiBvciBzZWxmLl9zb2NrZXRfZmFtaWx5Ci0gICAgZm9yIHJlcyBpbiByZXMwOgotICAgICAgaWYgcmVzWzBdIGlzIHNvY2tldF9mYW1pbHkgb3IgcmVzIGlzIHJlczBbLTFdOgotICAgICAgICBicmVhaworICAgIGRlZiBzZXRCYWNrbG9nKHNlbGYsIGJhY2tsb2c9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmhhbmRsZToKKyAgICAgICAgICAgIHNlbGYuX2JhY2tsb2cgPSBiYWNrbG9nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdlIGNhbm4ndCB1cGRhdGUgYmFja2xvZyB3aGVuIGl0IGlzIGFscmVhZHkgbGlzdGVuaW5nLCBzaW5jZSB0aGUKKyAgICAgICAgICAgICMgaGFuZGxlIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICAgICAgICBsb2dnZXIud2FybignWW91IGhhdmUgdG8gc2V0IGJhY2tsb2cgYmVmb3JlIGxpc3Rlbi4nKQogCi0gICAgIyBXZSBuZWVkIHJlbW92ZSB0aGUgb2xkIHVuaXggc29ja2V0IGlmIHRoZSBmaWxlIGV4aXN0cyBhbmQKLSAgICAjIG5vYm9keSBpcyBsaXN0ZW5pbmcgb24gaXQuCi0gICAgaWYgc2VsZi5fdW5peF9zb2NrZXQ6Ci0gICAgICB0bXAgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQotICAgICAgdHJ5OgotICAgICAgICB0bXAuY29ubmVjdChyZXNbNF0pCi0gICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGVycjoKLSAgICAgICAgZW5vLCBtZXNzYWdlID0gZXJyLmFyZ3MKLSAgICAgICAgaWYgZW5vID09IGVycm5vLkVDT05OUkVGVVNFRDoKLSAgICAgICAgICBvcy51bmxpbmsocmVzWzRdKQorICAgIGRlZiBsaXN0ZW4oc2VsZik6CisgICAgICAgIHJlczAgPSBzZWxmLl9yZXNvbHZlQWRkcigpCisgICAgICAgIHNvY2tldF9mYW1pbHkgPSBzZWxmLl9zb2NrZXRfZmFtaWx5ID09IHNvY2tldC5BRl9VTlNQRUMgYW5kIHNvY2tldC5BRl9JTkVUNiBvciBzZWxmLl9zb2NrZXRfZmFtaWx5CisgICAgICAgIGZvciByZXMgaW4gcmVzMDoKKyAgICAgICAgICAgIGlmIHJlc1swXSBpcyBzb2NrZXRfZmFtaWx5IG9yIHJlcyBpcyByZXMwWy0xXToKKyAgICAgICAgICAgICAgICBicmVhawogCi0gICAgc2VsZi5oYW5kbGUgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQotICAgIHNlbGYuaGFuZGxlLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCi0gICAgaWYgaGFzYXR0cihzZWxmLmhhbmRsZSwgJ3NldHRpbWVvdXQnKToKLSAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoTm9uZSkKLSAgICBzZWxmLmhhbmRsZS5iaW5kKHJlc1s0XSkKLSAgICBzZWxmLmhhbmRsZS5saXN0ZW4oMTI4KQorICAgICAgICAjIFdlIG5lZWQgcmVtb3ZlIHRoZSBvbGQgdW5peCBzb2NrZXQgaWYgdGhlIGZpbGUgZXhpc3RzIGFuZAorICAgICAgICAjIG5vYm9keSBpcyBsaXN0ZW5pbmcgb24gaXQuCisgICAgICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0OgorICAgICAgICAgICAgdG1wID0gc29ja2V0LnNvY2tldChyZXNbMF0sIHJlc1sxXSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0bXAuY29ubmVjdChyZXNbNF0pCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGVycjoKKyAgICAgICAgICAgICAgICBlbm8sIG1lc3NhZ2UgPSBlcnIuYXJncworICAgICAgICAgICAgICAgIGlmIGVubyA9PSBlcnJuby5FQ09OTlJFRlVTRUQ6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhyZXNbNF0pCiAKLSAgZGVmIGFjY2VwdChzZWxmKToKLSAgICBjbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQotICAgIHJlc3VsdCA9IFRTb2NrZXQoKQotICAgIHJlc3VsdC5zZXRIYW5kbGUoY2xpZW50KQotICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgc2VsZi5oYW5kbGUgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQorICAgICAgICBzZWxmLmhhbmRsZS5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYuaGFuZGxlLCAnc2V0dGltZW91dCcpOgorICAgICAgICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmhhbmRsZS5iaW5kKHJlc1s0XSkKKyAgICAgICAgc2VsZi5oYW5kbGUubGlzdGVuKHNlbGYuX2JhY2tsb2cpCisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICBjbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQorICAgICAgICByZXN1bHQgPSBUU29ja2V0KCkKKyAgICAgICAgcmVzdWx0LnNldEhhbmRsZShjbGllbnQpCisgICAgICAgIHJldHVybiByZXN1bHQKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnB5CmluZGV4IDU5MTRhY2EuLmQxMzA2MGYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5weQpAQCAtMTcsNDMwICsxNyw0MzkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssIHVucGFjawogZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBURXhjZXB0aW9uCitmcm9tIC4uY29tcGF0IGltcG9ydCBCdWZmZXJJTwogCiAKIGNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24oVEV4Y2VwdGlvbik6Ci0gICIiIkN1c3RvbSBUcmFuc3BvcnQgRXhjZXB0aW9uIGNsYXNzIiIiCisgICAgIiIiQ3VzdG9tIFRyYW5zcG9ydCBFeGNlcHRpb24gY2xhc3MiIiIKIAotICBVTktOT1dOID0gMAotICBOT1RfT1BFTiA9IDEKLSAgQUxSRUFEWV9PUEVOID0gMgotICBUSU1FRF9PVVQgPSAzCi0gIEVORF9PRl9GSUxFID0gNAorICAgIFVOS05PV04gPSAwCisgICAgTk9UX09QRU4gPSAxCisgICAgQUxSRUFEWV9PUEVOID0gMgorICAgIFRJTUVEX09VVCA9IDMKKyAgICBFTkRfT0ZfRklMRSA9IDQKKyAgICBORUdBVElWRV9TSVpFID0gNQorICAgIFNJWkVfTElNSVQgPSA2CisgICAgSU5WQUxJRF9DTElFTlRfVFlQRSA9IDcKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgotICAgIFRFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKLSAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCiAKIAotY2xhc3MgVFRyYW5zcG9ydEJhc2U6Ci0gICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCB0cmFuc3BvcnQgbGF5ZXIuIiIiCitjbGFzcyBUVHJhbnNwb3J0QmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCB0cmFuc3BvcnQgbGF5ZXIuIiIiCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEFsbChzZWxmLCBzeik6Ci0gICAgYnVmZiA9ICcnCi0gICAgaGF2ZSA9IDAKLSAgICB3aGlsZSAoaGF2ZSA8IHN6KToKLSAgICAgIGNodW5rID0gc2VsZi5yZWFkKHN6IC0gaGF2ZSkKLSAgICAgIGhhdmUgKz0gbGVuKGNodW5rKQotICAgICAgYnVmZiArPSBjaHVuaworICAgIGRlZiByZWFkQWxsKHNlbGYsIHN6KToKKyAgICAgICAgYnVmZiA9IGInJworICAgICAgICBoYXZlID0gMAorICAgICAgICB3aGlsZSAoaGF2ZSA8IHN6KToKKyAgICAgICAgICAgIGNodW5rID0gc2VsZi5yZWFkKHN6IC0gaGF2ZSkKKyAgICAgICAgICAgIGNodW5rTGVuID0gbGVuKGNodW5rKQorICAgICAgICAgICAgaGF2ZSArPSBjaHVua0xlbgorICAgICAgICAgICAgYnVmZiArPSBjaHVuawogCi0gICAgICBpZiBsZW4oY2h1bmspID09IDA6Ci0gICAgICAgIHJhaXNlIEVPRkVycm9yKCkKKyAgICAgICAgICAgIGlmIGNodW5rTGVuID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IoKQogCi0gICAgcmV0dXJuIGJ1ZmYKKyAgICAgICAgcmV0dXJuIGJ1ZmYKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHBhc3MKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGFzcwogCiAKICMgVGhpcyBjbGFzcyBzaG91bGQgYmUgdGhvdWdodCBvZiBhcyBhbiBpbnRlcmZhY2UuCi1jbGFzcyBDUmVhZGFibGVUcmFuc3BvcnQ6Ci0gICIiImJhc2UgY2xhc3MgZm9yIHRyYW5zcG9ydHMgdGhhdCBhcmUgcmVhZGFibGUgZnJvbSBDIiIiCitjbGFzcyBDUmVhZGFibGVUcmFuc3BvcnQob2JqZWN0KToKKyAgICAiIiJiYXNlIGNsYXNzIGZvciB0cmFuc3BvcnRzIHRoYXQgYXJlIHJlYWRhYmxlIGZyb20gQyIiIgogCi0gICMgVE9ETyhkcmVpc3MpOiBUaGluayBhYm91dCBjaGFuZ2luZyB0aGlzIGludGVyZmFjZSB0byBhbGxvdyB1cyB0byB1c2UKLSAgIyAgICAgICAgICAgICAgIGEgKFB5dGhvbiwgbm90IGMpIFN0cmluZ0lPIGluc3RlYWQsIGJlY2F1c2UgaXQgYWxsb3dzCi0gICMgICAgICAgICAgICAgICB5b3UgdG8gd3JpdGUgYWZ0ZXIgcmVhZGluZy4KKyAgICAjIFRPRE8oZHJlaXNzKTogVGhpbmsgYWJvdXQgY2hhbmdpbmcgdGhpcyBpbnRlcmZhY2UgdG8gYWxsb3cgdXMgdG8gdXNlCisgICAgIyAgICAgICAgICAgICAgIGEgKFB5dGhvbiwgbm90IGMpIFN0cmluZ0lPIGluc3RlYWQsIGJlY2F1c2UgaXQgYWxsb3dzCisgICAgIyAgICAgICAgICAgICAgIHlvdSB0byB3cml0ZSBhZnRlciByZWFkaW5nLgogCi0gICMgTk9URTogVGhpcyBpcyBhIGNsYXNzaWMgY2xhc3MsIHNvIHByb3BlcnRpZXMgd2lsbCBOT1Qgd29yawotICAjICAgICAgIGNvcnJlY3RseSBmb3Igc2V0dGluZy4KLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgICIiIkEgY1N0cmluZ0lPIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSBjdXJyZW50IGNodW5rIHdlIGFyZSByZWFkaW5nLiIiIgotICAgIHBhc3MKKyAgICAjIE5PVEU6IFRoaXMgaXMgYSBjbGFzc2ljIGNsYXNzLCBzbyBwcm9wZXJ0aWVzIHdpbGwgTk9UIHdvcmsKKyAgICAjICAgICAgIGNvcnJlY3RseSBmb3Igc2V0dGluZy4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgIiIiQSBjU3RyaW5nSU8gYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnQgY2h1bmsgd2UgYXJlIHJlYWRpbmcuIiIiCisgICAgICAgIHBhc3MKIAotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKLSAgICAiIiJSZWZpbGxzIGNzdHJpbmdpb19idWYuCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6CisgICAgICAgICIiIlJlZmlsbHMgY3N0cmluZ2lvX2J1Zi4KIAotICAgIFJldHVybnMgdGhlIGN1cnJlbnRseSB1c2VkIGJ1ZmZlciAod2hpY2ggY2FuIGJ1dCBuZWVkIG5vdCBiZSB0aGUgc2FtZSBhcwotICAgIHRoZSBvbGQgY3N0cmluZ2lvX2J1ZikuIHBhcnRpYWxyZWFkIGlzIHdoYXQgdGhlIEMgY29kZSBoYXMgcmVhZCBmcm9tIHRoZQotICAgIGJ1ZmZlciwgYW5kIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBidWZmZXIgYmVmb3JlIGFueSBtb3JlIHJlYWRzLiAgVGhlCi0gICAgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBuZXcsIG5vdCBib3Jyb3dlZCByZWZlcmVuY2UuICBTb21ldGhpbmcgYWxvbmcgdGhlCi0gICAgbGluZXMgb2Ygc2VsZi5fYnVmIHNob3VsZCBiZSBmaW5lLgorICAgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50bHkgdXNlZCBidWZmZXIgKHdoaWNoIGNhbiBidXQgbmVlZCBub3QgYmUgdGhlIHNhbWUgYXMKKyAgICAgICAgdGhlIG9sZCBjc3RyaW5naW9fYnVmKS4gcGFydGlhbHJlYWQgaXMgd2hhdCB0aGUgQyBjb2RlIGhhcyByZWFkIGZyb20gdGhlCisgICAgICAgIGJ1ZmZlciwgYW5kIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBidWZmZXIgYmVmb3JlIGFueSBtb3JlIHJlYWRzLiAgVGhlCisgICAgICAgIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgbmV3LCBub3QgYm9ycm93ZWQgcmVmZXJlbmNlLiAgU29tZXRoaW5nIGFsb25nIHRoZQorICAgICAgICBsaW5lcyBvZiBzZWxmLl9idWYgc2hvdWxkIGJlIGZpbmUuCiAKLSAgICBJZiByZXFsZW4gYnl0ZXMgY2FuJ3QgYmUgcmVhZCwgdGhyb3cgRU9GRXJyb3IuCi0gICAgIiIiCi0gICAgcGFzcworICAgICAgICBJZiByZXFsZW4gYnl0ZXMgY2FuJ3QgYmUgcmVhZCwgdGhyb3cgRU9GRXJyb3IuCisgICAgICAgICIiIgorICAgICAgICBwYXNzCiAKIAotY2xhc3MgVFNlcnZlclRyYW5zcG9ydEJhc2U6Ci0gICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCBzZXJ2ZXIgdHJhbnNwb3J0cy4iIiIKK2NsYXNzIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHNlcnZlciB0cmFuc3BvcnRzLiIiIgogCi0gIGRlZiBsaXN0ZW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBsaXN0ZW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgYWNjZXB0KHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHBhc3MKIAogCi1jbGFzcyBUVHJhbnNwb3J0RmFjdG9yeUJhc2U6Ci0gICIiIkJhc2UgY2xhc3MgZm9yIGEgVHJhbnNwb3J0IEZhY3RvcnkiIiIKK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5QmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGEgVHJhbnNwb3J0IEZhY3RvcnkiIiIKIAotICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKLSAgICByZXR1cm4gdHJhbnMKKyAgICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIHRyYW5zCiAKIAotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeToKLSAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgYnVmZmVyZWQgdHJhbnNwb3J0cyIiIgorY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeShvYmplY3QpOgorICAgICIiIkZhY3RvcnkgdHJhbnNwb3J0IHRoYXQgYnVpbGRzIGJ1ZmZlcmVkIHRyYW5zcG9ydHMiIiIKIAotICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKLSAgICBidWZmZXJlZCA9IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucykKLSAgICByZXR1cm4gYnVmZmVyZWQKKyAgICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKKyAgICAgICAgYnVmZmVyZWQgPSBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpCisgICAgICAgIHJldHVybiBidWZmZXJlZAogCiAKIGNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKLSAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgYnVmZmVycyBpdHMgSS9PLgorICAgICIiIkNsYXNzIHRoYXQgd3JhcHMgYW5vdGhlciB0cmFuc3BvcnQgYW5kIGJ1ZmZlcnMgaXRzIEkvTy4KIAotICBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBhIChjb25maWd1cmFibGUpIGZpeGVkLXNpemUgcmVhZCBidWZmZXIKLSAgYnV0IGJ1ZmZlcnMgYWxsIHdyaXRlcyB1bnRpbCBhIGZsdXNoIGlzIHBlcmZvcm1lZC4KLSAgIiIiCi0gIERFRkFVTFRfQlVGRkVSID0gNDA5NgorICAgIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgKGNvbmZpZ3VyYWJsZSkgZml4ZWQtc2l6ZSByZWFkIGJ1ZmZlcgorICAgIGJ1dCBidWZmZXJzIGFsbCB3cml0ZXMgdW50aWwgYSBmbHVzaCBpcyBwZXJmb3JtZWQuCisgICAgIiIiCisgICAgREVGQVVMVF9CVUZGRVIgPSA0MDk2CiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCByYnVmX3NpemU9REVGQVVMVF9CVUZGRVIpOgotICAgIHNlbGYuX190cmFucyA9IHRyYW5zCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTygiIikKLSAgICBzZWxmLl9fcmJ1Zl9zaXplID0gcmJ1Zl9zaXplCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCByYnVmX3NpemU9REVGQVVMVF9CVUZGRVIpOgorICAgICAgICBzZWxmLl9fdHJhbnMgPSB0cmFucworICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgIyBQYXNzIHN0cmluZyBhcmd1bWVudCB0byBpbml0aWFsaXplIHJlYWQgYnVmZmVyIGFzIGNTdHJpbmdJTy5JbnB1dFR5cGUKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhiJycpCisgICAgICAgIHNlbGYuX19yYnVmX3NpemUgPSByYnVmX3NpemUKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5jbG9zZSgpCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKLSAgICBpZiBsZW4ocmV0KSAhPSAwOgotICAgICAgcmV0dXJuIHJldAorICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICAgICAgaWYgbGVuKHJldCkgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiByZXQKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhzZWxmLl9fdHJhbnMucmVhZChtYXgoc3osIHNlbGYuX19yYnVmX3NpemUpKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCiAKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHNlbGYuX190cmFucy5yZWFkKG1heChzeiwgc2VsZi5fX3JidWZfc2l6ZSkpKQotICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICMgb24gZXhjZXB0aW9uIHJlc2V0IHdidWYgc28gaXQgZG9lc24ndCBjb250YWluIGEgcGFydGlhbCBmdW5jdGlvbiBjYWxsCisgICAgICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgICAgIHJhaXNlIGUKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICB0cnk6Ci0gICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgIyBvbiBleGNlcHRpb24gcmVzZXQgd2J1ZiBzbyBpdCBkb2Vzbid0IGNvbnRhaW4gYSBwYXJ0aWFsIGZ1bmN0aW9uIGNhbGwKLSAgICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgICAgcmFpc2UgZQorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgb3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICAjIHJlc2V0IHdidWYgYmVmb3JlIHdyaXRlL2ZsdXNoIHRvIHByZXNlcnZlIHN0YXRlIG9uIHVuZGVybHlpbmcgZmFpbHVyZQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fX3RyYW5zLndyaXRlKG91dCkKKyAgICAgICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgb3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX3RyYW5zLndyaXRlKG91dCkKLSAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQorICAgICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAotICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgorICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgorICAgICAgICByZXRzdHJpbmcgPSBwYXJ0aWFscmVhZAorICAgICAgICBpZiByZXFsZW4gPCBzZWxmLl9fcmJ1Zl9zaXplOgorICAgICAgICAgICAgIyB0cnkgdG8gbWFrZSBhIHJlYWQgb2YgYXMgbXVjaCBhcyB3ZSBjYW4uCisgICAgICAgICAgICByZXRzdHJpbmcgKz0gc2VsZi5fX3RyYW5zLnJlYWQoc2VsZi5fX3JidWZfc2l6ZSkKIAotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKLSAgICByZXRzdHJpbmcgPSBwYXJ0aWFscmVhZAotICAgIGlmIHJlcWxlbiA8IHNlbGYuX19yYnVmX3NpemU6Ci0gICAgICAjIHRyeSB0byBtYWtlIGEgcmVhZCBvZiBhcyBtdWNoIGFzIHdlIGNhbi4KLSAgICAgIHJldHN0cmluZyArPSBzZWxmLl9fdHJhbnMucmVhZChzZWxmLl9fcmJ1Zl9zaXplKQorICAgICAgICAjIGJ1dCBtYWtlIHN1cmUgd2UgZG8gcmVhZCByZXFsZW4gYnl0ZXMuCisgICAgICAgIGlmIGxlbihyZXRzdHJpbmcpIDwgcmVxbGVuOgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYuX190cmFucy5yZWFkQWxsKHJlcWxlbiAtIGxlbihyZXRzdHJpbmcpKQogCi0gICAgIyBidXQgbWFrZSBzdXJlIHdlIGRvIHJlYWQgcmVxbGVuIGJ5dGVzLgotICAgIGlmIGxlbihyZXRzdHJpbmcpIDwgcmVxbGVuOgotICAgICAgcmV0c3RyaW5nICs9IHNlbGYuX190cmFucy5yZWFkQWxsKHJlcWxlbiAtIGxlbihyZXRzdHJpbmcpKQotCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhyZXRzdHJpbmcpCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8ocmV0c3RyaW5nKQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAogCiBjbGFzcyBUTWVtb3J5QnVmZmVyKFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgotICAiIiJXcmFwcyBhIGNTdHJpbmdJTyBvYmplY3QgYXMgYSBUVHJhbnNwb3J0LgorICAgICIiIldyYXBzIGEgY0J5dGVzSU8gb2JqZWN0IGFzIGEgVFRyYW5zcG9ydC4KIAotICBOT1RFOiBVbmxpa2UgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoaXMgY2xhc3MsIHlvdSBjYW5ub3Qgd3JpdGUgdG8gaXQKLSAgICAgICAgdGhlbiBpbW1lZGlhdGVseSByZWFkIGZyb20gaXQuICBJZiB5b3Ugd2FudCB0byByZWFkIGZyb20gYQotICAgICAgICBUTWVtb3J5QnVmZmVyLCB5b3UgbXVzdCBlaXRoZXIgcGFzcyBhIHN0cmluZyB0byB0aGUgY29uc3RydWN0b3IuCi0gIFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIHdvcmsgbGlrZSB0aGUgQysrIHZlcnNpb24uCi0gICIiIgorICAgIE5PVEU6IFVubGlrZSB0aGUgQysrIHZlcnNpb24gb2YgdGhpcyBjbGFzcywgeW91IGNhbm5vdCB3cml0ZSB0byBpdAorICAgICAgICAgIHRoZW4gaW1tZWRpYXRlbHkgcmVhZCBmcm9tIGl0LiAgSWYgeW91IHdhbnQgdG8gcmVhZCBmcm9tIGEKKyAgICAgICAgICBUTWVtb3J5QnVmZmVyLCB5b3UgbXVzdCBlaXRoZXIgcGFzcyBhIHN0cmluZyB0byB0aGUgY29uc3RydWN0b3IuCisgICAgVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgd29yayBsaWtlIHRoZSBDKysgdmVyc2lvbi4KKyAgICAiIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWU9Tm9uZSk6Ci0gICAgIiIidmFsdWUgLS0gYSB2YWx1ZSB0byByZWFkIGZyb20gZm9yIHN0cmluZ2lvCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlPU5vbmUsIG9mZnNldD0wKToKKyAgICAgICAgIiIidmFsdWUgLS0gYSB2YWx1ZSB0byByZWFkIGZyb20gZm9yIHN0cmluZ2lvCiAKLSAgICBJZiB2YWx1ZSBpcyBzZXQsIHRoaXMgd2lsbCBiZSBhIHRyYW5zcG9ydCBmb3IgcmVhZGluZywKLSAgICBvdGhlcndpc2UsIGl0IGlzIGZvciB3cml0aW5nIiIiCi0gICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6Ci0gICAgICBzZWxmLl9idWZmZXIgPSBTdHJpbmdJTyh2YWx1ZSkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fYnVmZmVyID0gU3RyaW5nSU8oKQorICAgICAgICBJZiB2YWx1ZSBpcyBzZXQsIHRoaXMgd2lsbCBiZSBhIHRyYW5zcG9ydCBmb3IgcmVhZGluZywKKyAgICAgICAgb3RoZXJ3aXNlLCBpdCBpcyBmb3Igd3JpdGluZyIiIgorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlciA9IEJ1ZmZlcklPKHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gQnVmZmVySU8oKQorICAgICAgICBpZiBvZmZzZXQ6CisgICAgICAgICAgICBzZWxmLl9idWZmZXIuc2VlayhvZmZzZXQpCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gbm90IHNlbGYuX2J1ZmZlci5jbG9zZWQKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYuX2J1ZmZlci5jbG9zZWQKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5fYnVmZmVyLmNsb3NlKCkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX2J1ZmZlci5jbG9zZSgpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldHVybiBzZWxmLl9idWZmZXIucmVhZChzeikKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWZmZXIucmVhZChzeikKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl9idWZmZXIud3JpdGUoYnVmKQorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLl9idWZmZXIud3JpdGUoYnVmKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGdldHZhbHVlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9idWZmZXIuZ2V0dmFsdWUoKQorICAgIGRlZiBnZXR2YWx1ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1ZmZlci5nZXR2YWx1ZSgpCiAKLSAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gIEBwcm9wZXJ0eQotICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fYnVmZmVyCisgICAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWZmZXIKIAotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKLSAgICAjIG9ubHkgb25lIHNob3QgYXQgcmVhZGluZy4uLgotICAgIHJhaXNlIEVPRkVycm9yKCkKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgIyBvbmx5IG9uZSBzaG90IGF0IHJlYWRpbmcuLi4KKyAgICAgICAgcmFpc2UgRU9GRXJyb3IoKQogCiAKLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5OgotICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyBmcmFtZWQgdHJhbnNwb3J0cyIiIgorY2xhc3MgVEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnkob2JqZWN0KToKKyAgICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyBmcmFtZWQgdHJhbnNwb3J0cyIiIgogCi0gIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgotICAgIGZyYW1lZCA9IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpCi0gICAgcmV0dXJuIGZyYW1lZAorICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgorICAgICAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKQorICAgICAgICByZXR1cm4gZnJhbWVkCiAKIAogY2xhc3MgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKLSAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgZnJhbWVzIGl0cyBJL08gd2hlbiB3cml0aW5nLiIiIgorICAgICIiIkNsYXNzIHRoYXQgd3JhcHMgYW5vdGhlciB0cmFuc3BvcnQgYW5kIGZyYW1lcyBpdHMgSS9PIHdoZW4gd3JpdGluZy4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsKToKLSAgICBzZWxmLl9fdHJhbnMgPSB0cmFucwotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywpOgorICAgICAgICBzZWxmLl9fdHJhbnMgPSB0cmFucworICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKGInJykKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMub3BlbigpCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMub3BlbigpCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5jbG9zZSgpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCi0gICAgaWYgbGVuKHJldCkgIT0gMDoKLSAgICAgIHJldHVybiByZXQKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgICAgIGlmIGxlbihyZXQpICE9IDA6CisgICAgICAgICAgICByZXR1cm4gcmV0CiAKLSAgICBzZWxmLnJlYWRGcmFtZSgpCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgICAgIHNlbGYucmVhZEZyYW1lKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCiAKLSAgZGVmIHJlYWRGcmFtZShzZWxmKToKLSAgICBidWZmID0gc2VsZi5fX3RyYW5zLnJlYWRBbGwoNCkKLSAgICBzeiwgPSB1bnBhY2soJyFpJywgYnVmZikKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHNlbGYuX190cmFucy5yZWFkQWxsKHN6KSkKKyAgICBkZWYgcmVhZEZyYW1lKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi5fX3RyYW5zLnJlYWRBbGwoNCkKKyAgICAgICAgc3osID0gdW5wYWNrKCchaScsIGJ1ZmYpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oc2VsZi5fX3RyYW5zLnJlYWRBbGwoc3opKQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICB3b3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgIHdzeiA9IGxlbih3b3V0KQotICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgIyBOLkIuOiBEb2luZyB0aGlzIHN0cmluZyBjb25jYXRlbmF0aW9uIGlzIFdBWSBjaGVhcGVyIHRoYW4gbWFraW5nCi0gICAgIyB0d28gc2VwYXJhdGUgY2FsbHMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdC4gU29ja2V0IHdyaXRlcyBpbgotICAgICMgUHl0aG9uIHR1cm4gb3V0IHRvIGJlIFJFQUxMWSBleHBlbnNpdmUsIGJ1dCBpdCBzZWVtcyB0byBkbyBhIHByZXR0eQotICAgICMgZ29vZCBqb2Igb2YgbWFuYWdpbmcgc3RyaW5nIGJ1ZmZlciBvcGVyYXRpb25zIHdpdGhvdXQgZXhjZXNzaXZlIGNvcGllcwotICAgIGJ1ZiA9IHBhY2soIiFpIiwgd3N6KSArIHdvdXQKLSAgICBzZWxmLl9fdHJhbnMud3JpdGUoYnVmKQotICAgIHNlbGYuX190cmFucy5mbHVzaCgpCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICB3b3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICB3c3ogPSBsZW4od291dCkKKyAgICAgICAgIyByZXNldCB3YnVmIGJlZm9yZSB3cml0ZS9mbHVzaCB0byBwcmVzZXJ2ZSBzdGF0ZSBvbiB1bmRlcmx5aW5nIGZhaWx1cmUKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgICMgTi5CLjogRG9pbmcgdGhpcyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpcyBXQVkgY2hlYXBlciB0aGFuIG1ha2luZworICAgICAgICAjIHR3byBzZXBhcmF0ZSBjYWxscyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0LiBTb2NrZXQgd3JpdGVzIGluCisgICAgICAgICMgUHl0aG9uIHR1cm4gb3V0IHRvIGJlIFJFQUxMWSBleHBlbnNpdmUsIGJ1dCBpdCBzZWVtcyB0byBkbyBhIHByZXR0eQorICAgICAgICAjIGdvb2Qgam9iIG9mIG1hbmFnaW5nIHN0cmluZyBidWZmZXIgb3BlcmF0aW9ucyB3aXRob3V0IGV4Y2Vzc2l2ZSBjb3BpZXMKKyAgICAgICAgYnVmID0gcGFjaygiIWkiLCB3c3opICsgd291dAorICAgICAgICBzZWxmLl9fdHJhbnMud3JpdGUoYnVmKQorICAgICAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQogCi0gICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX19yYnVmCisgICAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgogCi0gIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKLSAgICAjIHNlbGYuX19yYnVmIHdpbGwgYWxyZWFkeSBiZSBlbXB0eSBoZXJlIGJlY2F1c2UgZmFzdGJpbmFyeSBkb2Vzbid0Ci0gICAgIyBhc2sgZm9yIGEgcmVmaWxsIHVudGlsIHRoZSBwcmV2aW91cyBidWZmZXIgaXMgZW1wdHkuICBUaGVyZWZvcmUsCi0gICAgIyB3ZSBjYW4gc3RhcnQgcmVhZGluZyBuZXcgZnJhbWVzIGltbWVkaWF0ZWx5LgotICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgotICAgICAgc2VsZi5yZWFkRnJhbWUoKQotICAgICAgcHJlZml4ICs9IHNlbGYuX19yYnVmLmdldHZhbHVlKCkKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHByZWZpeCkKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6CisgICAgICAgICMgc2VsZi5fX3JidWYgd2lsbCBhbHJlYWR5IGJlIGVtcHR5IGhlcmUgYmVjYXVzZSBmYXN0YmluYXJ5IGRvZXNuJ3QKKyAgICAgICAgIyBhc2sgZm9yIGEgcmVmaWxsIHVudGlsIHRoZSBwcmV2aW91cyBidWZmZXIgaXMgZW1wdHkuICBUaGVyZWZvcmUsCisgICAgICAgICMgd2UgY2FuIHN0YXJ0IHJlYWRpbmcgbmV3IGZyYW1lcyBpbW1lZGlhdGVseS4KKyAgICAgICAgd2hpbGUgbGVuKHByZWZpeCkgPCByZXFsZW46CisgICAgICAgICAgICBzZWxmLnJlYWRGcmFtZSgpCisgICAgICAgICAgICBwcmVmaXggKz0gc2VsZi5fX3JidWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHByZWZpeCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCiAKIAogY2xhc3MgVEZpbGVPYmplY3RUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UpOgotICAiIiJXcmFwcyBhIGZpbGUtbGlrZSBvYmplY3QgdG8gbWFrZSBpdCB3b3JrIGFzIGEgVGhyaWZ0IHRyYW5zcG9ydC4iIiIKKyAgICAiIiJXcmFwcyBhIGZpbGUtbGlrZSBvYmplY3QgdG8gbWFrZSBpdCB3b3JrIGFzIGEgVGhyaWZ0IHRyYW5zcG9ydC4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaik6Ci0gICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqKToKKyAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIFRydWUKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcmV0dXJuIHNlbGYuZmlsZW9iai5yZWFkKHN6KQorICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iai5yZWFkKHN6KQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIHNlbGYuZmlsZW9iai5mbHVzaCgpCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVvYmouZmx1c2goKQogCiAKIGNsYXNzIFRTYXNsQ2xpZW50VHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgotICAiIiIKLSAgU0FTTCB0cmFuc3BvcnQgCi0gICIiIgotCi0gIFNUQVJUID0gMQotICBPSyA9IDIKLSAgQkFEID0gMwotICBFUlJPUiA9IDQKLSAgQ09NUExFVEUgPSA1Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaG9zdCwgc2VydmljZSwgbWVjaGFuaXNtPSdHU1NBUEknLAotICAgICAgKipzYXNsX2t3YXJncyk6CiAgICAgIiIiCi0gICAgdHJhbnNwb3J0OiBhbiB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byB1c2UsIHR5cGljYWxseSBqdXN0IGEgVFNvY2tldAotICAgIGhvc3Q6IHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCi0gICAgc2VydmljZTogdGhlIG5hbWUgb2YgdGhlIHNlcnZlcidzIHNlcnZpY2UsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCi0gICAgbWVjaGFuaXNtOiB0aGUgbmFtZSBvZiB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSB0byB1c2UKLQotICAgIEFsbCBvdGhlciBrd2FyZ3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHB1cmVzYXNsLmNsaWVudC5TQVNMQ2xpZW50Ci0gICAgY29uc3RydWN0b3IuCisgICAgU0FTTCB0cmFuc3BvcnQKICAgICAiIiIKIAotICAgIGZyb20gcHVyZXNhc2wuY2xpZW50IGltcG9ydCBTQVNMQ2xpZW50CisgICAgU1RBUlQgPSAxCisgICAgT0sgPSAyCisgICAgQkFEID0gMworICAgIEVSUk9SID0gNAorICAgIENPTVBMRVRFID0gNQogCi0gICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKLSAgICBzZWxmLnNhc2wgPSBTQVNMQ2xpZW50KGhvc3QsIHNlcnZpY2UsIG1lY2hhbmlzbSwgKipzYXNsX2t3YXJncykKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc209J0dTU0FQSScsCisgICAgICAgICAgICAgICAgICoqc2FzbF9rd2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgdHJhbnNwb3J0OiBhbiB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byB1c2UsIHR5cGljYWxseSBqdXN0IGEgVFNvY2tldAorICAgICAgICBob3N0OiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyLCBmcm9tIGEgU0FTTCBwZXJzcGVjdGl2ZQorICAgICAgICBzZXJ2aWNlOiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyJ3Mgc2VydmljZSwgZnJvbSBhIFNBU0wgcGVyc3BlY3RpdmUKKyAgICAgICAgbWVjaGFuaXNtOiB0aGUgbmFtZSBvZiB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSB0byB1c2UKIAotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oKQorICAgICAgICBBbGwgb3RoZXIga3dhcmdzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBwdXJlc2FzbC5jbGllbnQuU0FTTENsaWVudAorICAgICAgICBjb25zdHJ1Y3Rvci4KKyAgICAgICAgIiIiCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgaWYgbm90IHNlbGYudHJhbnNwb3J0LmlzT3BlbigpOgotICAgICAgc2VsZi50cmFuc3BvcnQub3BlbigpCisgICAgICAgIGZyb20gcHVyZXNhc2wuY2xpZW50IGltcG9ydCBTQVNMQ2xpZW50CiAKLSAgICBzZWxmLnNlbmRfc2FzbF9tc2coc2VsZi5TVEFSVCwgc2VsZi5zYXNsLm1lY2hhbmlzbSkKLSAgICBzZWxmLnNlbmRfc2FzbF9tc2coc2VsZi5PSywgc2VsZi5zYXNsLnByb2Nlc3MoKSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgICAgICAgc2VsZi5zYXNsID0gU0FTTENsaWVudChob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc20sICoqc2FzbF9rd2FyZ3MpCiAKLSAgICB3aGlsZSBUcnVlOgotICAgICAgc3RhdHVzLCBjaGFsbGVuZ2UgPSBzZWxmLnJlY3Zfc2FzbF9tc2coKQotICAgICAgaWYgc3RhdHVzID09IHNlbGYuT0s6Ci0gICAgICAgIHNlbGYuc2VuZF9zYXNsX21zZyhzZWxmLk9LLCBzZWxmLnNhc2wucHJvY2VzcyhjaGFsbGVuZ2UpKQotICAgICAgZWxpZiBzdGF0dXMgPT0gc2VsZi5DT01QTEVURToKLSAgICAgICAgaWYgbm90IHNlbGYuc2FzbC5jb21wbGV0ZToKLSAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKCJUaGUgc2VydmVyIGVycm9uZW91c2x5IGluZGljYXRlZCAiCi0gICAgICAgICAgICAgICJ0aGF0IFNBU0wgbmVnb3RpYXRpb24gd2FzIGNvbXBsZXRlIikKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oYicnKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnRyYW5zcG9ydC5pc09wZW4oKToKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0Lm9wZW4oKQorCisgICAgICAgIHNlbGYuc2VuZF9zYXNsX21zZyhzZWxmLlNUQVJULCBzZWxmLnNhc2wubWVjaGFuaXNtKQorICAgICAgICBzZWxmLnNlbmRfc2FzbF9tc2coc2VsZi5PSywgc2VsZi5zYXNsLnByb2Nlc3MoKSkKKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc3RhdHVzLCBjaGFsbGVuZ2UgPSBzZWxmLnJlY3Zfc2FzbF9tc2coKQorICAgICAgICAgICAgaWYgc3RhdHVzID09IHNlbGYuT0s6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX3Nhc2xfbXNnKHNlbGYuT0ssIHNlbGYuc2FzbC5wcm9jZXNzKGNoYWxsZW5nZSkpCisgICAgICAgICAgICBlbGlmIHN0YXR1cyA9PSBzZWxmLkNPTVBMRVRFOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNhc2wuY29tcGxldGU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBzZXJ2ZXIgZXJyb25lb3VzbHkgaW5kaWNhdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGF0IFNBU0wgbmVnb3RpYXRpb24gd2FzIGNvbXBsZXRlIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAiQmFkIFNBU0wgbmVnb3RpYXRpb24gc3RhdHVzOiAlZCAoJXMpIgorICAgICAgICAgICAgICAgICAgICAlIChzdGF0dXMsIGNoYWxsZW5nZSkpCisKKyAgICBkZWYgc2VuZF9zYXNsX21zZyhzZWxmLCBzdGF0dXMsIGJvZHkpOgorICAgICAgICBoZWFkZXIgPSBwYWNrKCI+QkkiLCBzdGF0dXMsIGxlbihib2R5KSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGUoaGVhZGVyICsgYm9keSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuZmx1c2goKQorCisgICAgZGVmIHJlY3Zfc2FzbF9tc2coc2VsZik6CisgICAgICAgIGhlYWRlciA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoNSkKKyAgICAgICAgc3RhdHVzLCBsZW5ndGggPSB1bnBhY2soIj5CSSIsIGhlYWRlcikKKyAgICAgICAgaWYgbGVuZ3RoID4gMDoKKyAgICAgICAgICAgIHBheWxvYWQgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKGxlbmd0aCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICBicmVhawotICAgICAgZWxzZToKLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQmFkIFNBU0wgbmVnb3RpYXRpb24gc3RhdHVzOiAlZCAoJXMpIgotICAgICAgICAgICAgJSAoc3RhdHVzLCBjaGFsbGVuZ2UpKQorICAgICAgICAgICAgcGF5bG9hZCA9ICIiCisgICAgICAgIHJldHVybiBzdGF0dXMsIHBheWxvYWQKIAotICBkZWYgc2VuZF9zYXNsX21zZyhzZWxmLCBzdGF0dXMsIGJvZHkpOgotICAgIGhlYWRlciA9IHBhY2soIj5CSSIsIHN0YXR1cywgbGVuKGJvZHkpKQotICAgIHNlbGYudHJhbnNwb3J0LndyaXRlKGhlYWRlciArIGJvZHkpCi0gICAgc2VsZi50cmFuc3BvcnQuZmx1c2goKQorICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoZGF0YSkKIAotICBkZWYgcmVjdl9zYXNsX21zZyhzZWxmKToKLSAgICBoZWFkZXIgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKDUpCi0gICAgc3RhdHVzLCBsZW5ndGggPSB1bnBhY2soIj5CSSIsIGhlYWRlcikKLSAgICBpZiBsZW5ndGggPiAwOgotICAgICAgcGF5bG9hZCA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwobGVuZ3RoKQotICAgIGVsc2U6Ci0gICAgICBwYXlsb2FkID0gIiIKLSAgICByZXR1cm4gc3RhdHVzLCBwYXlsb2FkCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICBlbmNvZGVkID0gc2VsZi5zYXNsLndyYXAoZGF0YSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGUoJycuam9pbigocGFjaygiIWkiLCBsZW4oZW5jb2RlZCkpLCBlbmNvZGVkKSkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgotICAgIHNlbGYuX193YnVmLndyaXRlKGRhdGEpCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBpZiBsZW4ocmV0KSAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBkYXRhID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgIGVuY29kZWQgPSBzZWxmLnNhc2wud3JhcChkYXRhKQotICAgIHNlbGYudHJhbnNwb3J0LndyaXRlKCcnLmpvaW4oKHBhY2soIiFpIiwgbGVuKGVuY29kZWQpKSwgZW5jb2RlZCkpKQotICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fcmVhZF9mcmFtZSgpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIGlmIGxlbihyZXQpICE9IDA6Ci0gICAgICByZXR1cm4gcmV0CisgICAgZGVmIF9yZWFkX2ZyYW1lKHNlbGYpOgorICAgICAgICBoZWFkZXIgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKDQpCisgICAgICAgIGxlbmd0aCwgPSB1bnBhY2soJyFpJywgaGVhZGVyKQorICAgICAgICBlbmNvZGVkID0gc2VsZi50cmFuc3BvcnQucmVhZEFsbChsZW5ndGgpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oc2VsZi5zYXNsLnVud3JhcChlbmNvZGVkKSkKIAotICAgIHNlbGYuX3JlYWRfZnJhbWUoKQotICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5zYXNsLmRpc3Bvc2UoKQorICAgICAgICBzZWxmLnRyYW5zcG9ydC5jbG9zZSgpCiAKLSAgZGVmIF9yZWFkX2ZyYW1lKHNlbGYpOgotICAgIGhlYWRlciA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoNCkKLSAgICBsZW5ndGgsID0gdW5wYWNrKCchaScsIGhlYWRlcikKLSAgICBlbmNvZGVkID0gc2VsZi50cmFuc3BvcnQucmVhZEFsbChsZW5ndGgpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhzZWxmLnNhc2wudW53cmFwKGVuY29kZWQpKQorICAgICMgYmFzZWQgb24gVEZyYW1lZFRyYW5zcG9ydAorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5zYXNsLmRpc3Bvc2UoKQotICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKLQotICAjIGJhc2VkIG9uIFRGcmFtZWRUcmFuc3BvcnQKLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgotCi0gIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKLSAgICAjIHNlbGYuX19yYnVmIHdpbGwgYWxyZWFkeSBiZSBlbXB0eSBoZXJlIGJlY2F1c2UgZmFzdGJpbmFyeSBkb2Vzbid0Ci0gICAgIyBhc2sgZm9yIGEgcmVmaWxsIHVudGlsIHRoZSBwcmV2aW91cyBidWZmZXIgaXMgZW1wdHkuICBUaGVyZWZvcmUsCi0gICAgIyB3ZSBjYW4gc3RhcnQgcmVhZGluZyBuZXcgZnJhbWVzIGltbWVkaWF0ZWx5LgotICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgotICAgICAgc2VsZi5fcmVhZF9mcmFtZSgpCi0gICAgICBwcmVmaXggKz0gc2VsZi5fX3JidWYuZ2V0dmFsdWUoKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8ocHJlZml4KQotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgotCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcHJlZml4LCByZXFsZW4pOgorICAgICAgICAjIHNlbGYuX19yYnVmIHdpbGwgYWxyZWFkeSBiZSBlbXB0eSBoZXJlIGJlY2F1c2UgZmFzdGJpbmFyeSBkb2Vzbid0CisgICAgICAgICMgYXNrIGZvciBhIHJlZmlsbCB1bnRpbCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIGVtcHR5LiAgVGhlcmVmb3JlLAorICAgICAgICAjIHdlIGNhbiBzdGFydCByZWFkaW5nIG5ldyBmcmFtZXMgaW1tZWRpYXRlbHkuCisgICAgICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgorICAgICAgICAgICAgc2VsZi5fcmVhZF9mcmFtZSgpCisgICAgICAgICAgICBwcmVmaXggKz0gc2VsZi5fX3JidWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHByZWZpeCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUd2lzdGVkLnB5CmluZGV4IDI5YmJkNGMuLmEyN2YwYWQgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUd2lzdGVkLnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUd2lzdGVkLnB5CkBAIC0xNywxMCArMTcsMTAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2Zyb20gaW8gaW1wb3J0IEJ5dGVzSU8KIGltcG9ydCBzdHJ1Y3QKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogCi1mcm9tIHpvcGUuaW50ZXJmYWNlIGltcG9ydCBpbXBsZW1lbnRzLCBJbnRlcmZhY2UsIEF0dHJpYnV0ZQorZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50ZXIsIEludGVyZmFjZSwgQXR0cmlidXRlCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQucHJvdG9jb2wgaW1wb3J0IFNlcnZlckZhY3RvcnksIENsaWVudEZhY3RvcnksIFwKICAgICBjb25uZWN0aW9uRG9uZQogZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlcgpAQCAtMzQsMTQgKzM0LDE0IEBACiBjbGFzcyBUTWVzc2FnZVNlbmRlclRyYW5zcG9ydChUVHJhbnNwb3J0LlRUcmFuc3BvcnRCYXNlKToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuX193YnVmID0gQnl0ZXNJTygpCiAKICAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKICAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQogCiAgICAgZGVmIGZsdXNoKHNlbGYpOgogICAgICAgICBtc2cgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCi0gICAgICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQogICAgICAgICByZXR1cm4gc2VsZi5zZW5kTWVzc2FnZShtc2cpCiAKICAgICBkZWYgc2VuZE1lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CkBAIC04MiwxMSArODIsMTggQEAKICAgICAgICAgc2VsZi5zdGFydGVkLmNhbGxiYWNrKHNlbGYuY2xpZW50KQogCiAgICAgZGVmIGNvbm5lY3Rpb25Mb3N0KHNlbGYsIHJlYXNvbj1jb25uZWN0aW9uRG9uZSk6Ci0gICAgICAgIGZvciBrLCB2IGluIHNlbGYuY2xpZW50Ll9yZXFzLml0ZXJpdGVtcygpOgorICAgICAgICAjIHRoZSBjYWxsZWQgZXJyYmFja3MgY2FuIGFkZCBpdGVtcyB0byBvdXIgY2xpZW50J3MgX3JlcXMsCisgICAgICAgICMgc28gd2UgbmVlZCB0byB1c2UgYSB0bXAsIGFuZCBpdGVyYXRlIHVudGlsIG5vIG1vcmUgcmVxdWVzdHMKKyAgICAgICAgIyBhcmUgYWRkZWQgZHVyaW5nIGVycmJhY2tzCisgICAgICAgIGlmIHNlbGYuY2xpZW50OgogICAgICAgICAgICAgdGV4ID0gVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIHR5cGU9VFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAotICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0Nvbm5lY3Rpb24gY2xvc2VkJykKLSAgICAgICAgICAgIHYuZXJyYmFjayh0ZXgpCisgICAgICAgICAgICAgICAgbWVzc2FnZT0nQ29ubmVjdGlvbiBjbG9zZWQgKCVzKScgJSByZWFzb24pCisgICAgICAgICAgICB3aGlsZSBzZWxmLmNsaWVudC5fcmVxczoKKyAgICAgICAgICAgICAgICBfLCB2ID0gc2VsZi5jbGllbnQuX3JlcXMucG9waXRlbSgpCisgICAgICAgICAgICAgICAgdi5lcnJiYWNrKHRleCkKKyAgICAgICAgICAgIGRlbCBzZWxmLmNsaWVudC5fcmVxcworICAgICAgICAgICAgc2VsZi5jbGllbnQgPSBOb25lCiAKICAgICBkZWYgc3RyaW5nUmVjZWl2ZWQoc2VsZiwgZnJhbWUpOgogICAgICAgICB0ciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihmcmFtZSkKQEAgLTExMyw3ICsxMjAsNyBAQAogICAgIE1BWF9MRU5HVEggPSAyICoqIDMxIC0gMQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNsaWVudF9jbGFzcywgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lLAotICAgICAgICAgICAgaG9zdD1Ob25lLCBzZXJ2aWNlPU5vbmUsIG1lY2hhbmlzbT0nR1NTQVBJJywgKipzYXNsX2t3YXJncyk6CisgICAgICAgICAgICAgICAgIGhvc3Q9Tm9uZSwgc2VydmljZT1Ob25lLCBtZWNoYW5pc209J0dTU0FQSScsICoqc2FzbF9rd2FyZ3MpOgogICAgICAgICAiIiIKICAgICAgICAgaG9zdDogdGhlIG5hbWUgb2YgdGhlIHNlcnZlciwgZnJvbSBhIFNBU0wgcGVyc3BlY3RpdmUKICAgICAgICAgc2VydmljZTogdGhlIG5hbWUgb2YgdGhlIHNlcnZlcidzIHNlcnZpY2UsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCkBAIC0yMjksNyArMjM2LDcgQEAKIAogICAgICAgICBkID0gc2VsZi5mYWN0b3J5LnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKICAgICAgICAgZC5hZGRDYWxsYmFja3Moc2VsZi5wcm9jZXNzT2ssIHNlbGYucHJvY2Vzc0Vycm9yLAotICAgICAgICAgICAgY2FsbGJhY2tBcmdzPSh0bW8sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tBcmdzPSh0bW8sKSkKIAogCiBjbGFzcyBJVGhyaWZ0U2VydmVyRmFjdG9yeShJbnRlcmZhY2UpOgpAQCAtMjUwLDEwICsyNTcsOSBAQAogICAgIG9wcm90X2ZhY3RvcnkgPSBBdHRyaWJ1dGUoIk91dHB1dCBwcm90b2NvbCBmYWN0b3J5IikKIAogCitAaW1wbGVtZW50ZXIoSVRocmlmdFNlcnZlckZhY3RvcnkpCiBjbGFzcyBUaHJpZnRTZXJ2ZXJGYWN0b3J5KFNlcnZlckZhY3RvcnkpOgogCi0gICAgaW1wbGVtZW50cyhJVGhyaWZ0U2VydmVyRmFjdG9yeSkKLQogICAgIHByb3RvY29sID0gVGhyaWZ0U2VydmVyUHJvdG9jb2wKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSk6CkBAIC0yNjUsMTAgKzI3MSw5IEBACiAgICAgICAgICAgICBzZWxmLm9wcm90X2ZhY3RvcnkgPSBvcHJvdF9mYWN0b3J5CiAKIAorQGltcGxlbWVudGVyKElUaHJpZnRDbGllbnRGYWN0b3J5KQogY2xhc3MgVGhyaWZ0Q2xpZW50RmFjdG9yeShDbGllbnRGYWN0b3J5KToKIAotICAgIGltcGxlbWVudHMoSVRocmlmdENsaWVudEZhY3RvcnkpCi0KICAgICBwcm90b2NvbCA9IFRocmlmdENsaWVudFByb3RvY29sCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgY2xpZW50X2NsYXNzLCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5PU5vbmUpOgpAQCAtMjgxLDcgKzI4Niw3IEBACiAKICAgICBkZWYgYnVpbGRQcm90b2NvbChzZWxmLCBhZGRyKToKICAgICAgICAgcCA9IHNlbGYucHJvdG9jb2woc2VsZi5jbGllbnRfY2xhc3MsIHNlbGYuaXByb3RfZmFjdG9yeSwKLSAgICAgICAgICAgIHNlbGYub3Byb3RfZmFjdG9yeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHJvdF9mYWN0b3J5KQogICAgICAgICBwLmZhY3RvcnkgPSBzZWxmCiAgICAgICAgIHJldHVybiBwCiAKQEAgLTI5MSw3ICsyOTYsNyBAQAogICAgIGFsbG93ZWRNZXRob2RzID0gKCdQT1NUJywpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUpOgorICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSk6CiAgICAgICAgIHJlc291cmNlLlJlc291cmNlLl9faW5pdF9fKHNlbGYpCiAgICAgICAgIHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeQogICAgICAgICBpZiBvdXRwdXRQcm90b2NvbEZhY3RvcnkgaXMgTm9uZToKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQucHkKaW5kZXggYTJmNDJhNS4uZTg0ODU3OSAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQucHkKQEAgLTI0LDIyNSArMjQsMjI1IEBACiAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KIGltcG9ydCB6bGliCi1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLWZyb20gVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydAorZnJvbSAuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydAorZnJvbSAuLmNvbXBhdCBpbXBvcnQgQnVmZmVySU8KIAogCiBjbGFzcyBUWmxpYlRyYW5zcG9ydEZhY3Rvcnkob2JqZWN0KToKLSAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgemxpYiBjb21wcmVzc2VkIHRyYW5zcG9ydHMuCisgICAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgemxpYiBjb21wcmVzc2VkIHRyYW5zcG9ydHMuCiAKLSAgVGhpcyBmYWN0b3J5IGNhY2hlcyB0aGUgbGFzdCBzaW5nbGUgY2xpZW50L3RyYW5zcG9ydCB0aGF0IGl0IHdhcyBwYXNzZWQKLSAgYW5kIHJldHVybnMgdGhlIHNhbWUgVFpsaWJUcmFuc3BvcnQgb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuCisgICAgVGhpcyBmYWN0b3J5IGNhY2hlcyB0aGUgbGFzdCBzaW5nbGUgY2xpZW50L3RyYW5zcG9ydCB0aGF0IGl0IHdhcyBwYXNzZWQKKyAgICBhbmQgcmV0dXJucyB0aGUgc2FtZSBUWmxpYlRyYW5zcG9ydCBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZC4KIAotICBUaGlzIGNhY2hpbmcgbWVhbnMgdGhlIFRTZXJ2ZXIgY2xhc3Mgd2lsbCBnZXQgdGhlIF9zYW1lXyB0cmFuc3BvcnQKLSAgb2JqZWN0IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNwb3J0cyBmcm9tIHRoaXMgZmFjdG9yeS4KLSAgKEZvciBub24tdGhyZWFkZWQgc2NlbmFyaW9zIG9ubHksIHNpbmNlIHRoZSBjYWNoZSBvbmx5IGhvbGRzIG9uZSBvYmplY3QpCisgICAgVGhpcyBjYWNoaW5nIG1lYW5zIHRoZSBUU2VydmVyIGNsYXNzIHdpbGwgZ2V0IHRoZSBfc2FtZV8gdHJhbnNwb3J0CisgICAgb2JqZWN0IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNwb3J0cyBmcm9tIHRoaXMgZmFjdG9yeS4KKyAgICAoRm9yIG5vbi10aHJlYWRlZCBzY2VuYXJpb3Mgb25seSwgc2luY2UgdGhlIGNhY2hlIG9ubHkgaG9sZHMgb25lIG9iamVjdCkKIAotICBUaGUgcHVycG9zZSBvZiB0aGlzIGNhY2hpbmcgaXMgdG8gYWxsb2NhdGUgb25seSBvbmUgVFpsaWJUcmFuc3BvcnQgd2hlcmUKLSAgb25seSBvbmUgaXMgcmVhbGx5IG5lZWRlZCAoc2luY2UgaXQgbXVzdCBoYXZlIHNlcGFyYXRlIHJlYWQvd3JpdGUgYnVmZmVycyksCi0gIGFuZCBtYWtlcyB0aGUgc3RhdGlzdGljcyBmcm9tIGdldENvbXBTYXZpbmdzKCkgYW5kIGdldENvbXBSYXRpbygpCi0gIGVhc2llciB0byB1bmRlcnN0YW5kLgotICAiIiIKLSAgIyBjbGFzcyBzY29wZWQgY2FjaGUgb2YgbGFzdCB0cmFuc3BvcnQgZ2l2ZW4gYW5kIHpsaWJ0cmFuc3BvcnQgcmV0dXJuZWQKLSAgX2xhc3RfdHJhbnMgPSBOb25lCi0gIF9sYXN0X3ogPSBOb25lCi0KLSAgZGVmIGdldFRyYW5zcG9ydChzZWxmLCB0cmFucywgY29tcHJlc3NsZXZlbD05KToKLSAgICAiIiJXcmFwIGEgdHJhbnNwb3J0LCB0cmFucywgd2l0aCB0aGUgVFpsaWJUcmFuc3BvcnQKLSAgICBjb21wcmVzc2VkIHRyYW5zcG9ydCBjbGFzcywgcmV0dXJuaW5nIGEgbmV3Ci0gICAgdHJhbnNwb3J0IHRvIHRoZSBjYWxsZXIuCi0KLSAgICBAcGFyYW0gY29tcHJlc3NsZXZlbDogVGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwsIHJhbmdpbmcKLSAgICBmcm9tIDAgKG5vIGNvbXByZXNzaW9uKSB0byA5IChiZXN0IGNvbXByZXNzaW9uKS4gIERlZmF1bHRzIHRvIDkuCi0gICAgQHR5cGUgY29tcHJlc3NsZXZlbDogaW50Ci0KLSAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgVFpsaWJUcmFuc3BvcnQgd2hpY2ggd3JhcHMgdGhlCi0gICAgcGFzc2VkIEN7dHJhbnN9IFRUcmFuc3BvcnQgZGVyaXZlZCBpbnN0YW5jZS4KKyAgICBUaGUgcHVycG9zZSBvZiB0aGlzIGNhY2hpbmcgaXMgdG8gYWxsb2NhdGUgb25seSBvbmUgVFpsaWJUcmFuc3BvcnQgd2hlcmUKKyAgICBvbmx5IG9uZSBpcyByZWFsbHkgbmVlZGVkIChzaW5jZSBpdCBtdXN0IGhhdmUgc2VwYXJhdGUgcmVhZC93cml0ZSBidWZmZXJzKSwKKyAgICBhbmQgbWFrZXMgdGhlIHN0YXRpc3RpY3MgZnJvbSBnZXRDb21wU2F2aW5ncygpIGFuZCBnZXRDb21wUmF0aW8oKQorICAgIGVhc2llciB0byB1bmRlcnN0YW5kLgogICAgICIiIgotICAgIGlmIHRyYW5zID09IHNlbGYuX2xhc3RfdHJhbnM6Ci0gICAgICByZXR1cm4gc2VsZi5fbGFzdF96Ci0gICAgenRyYW5zID0gVFpsaWJUcmFuc3BvcnQodHJhbnMsIGNvbXByZXNzbGV2ZWwpCi0gICAgc2VsZi5fbGFzdF90cmFucyA9IHRyYW5zCi0gICAgc2VsZi5fbGFzdF96ID0genRyYW5zCi0gICAgcmV0dXJuIHp0cmFucworICAgICMgY2xhc3Mgc2NvcGVkIGNhY2hlIG9mIGxhc3QgdHJhbnNwb3J0IGdpdmVuIGFuZCB6bGlidHJhbnNwb3J0IHJldHVybmVkCisgICAgX2xhc3RfdHJhbnMgPSBOb25lCisgICAgX2xhc3RfeiA9IE5vbmUKKworICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMsIGNvbXByZXNzbGV2ZWw9OSk6CisgICAgICAgICIiIldyYXAgYSB0cmFuc3BvcnQsIHRyYW5zLCB3aXRoIHRoZSBUWmxpYlRyYW5zcG9ydAorICAgICAgICBjb21wcmVzc2VkIHRyYW5zcG9ydCBjbGFzcywgcmV0dXJuaW5nIGEgbmV3CisgICAgICAgIHRyYW5zcG9ydCB0byB0aGUgY2FsbGVyLgorCisgICAgICAgIEBwYXJhbSBjb21wcmVzc2xldmVsOiBUaGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCwgcmFuZ2luZworICAgICAgICBmcm9tIDAgKG5vIGNvbXByZXNzaW9uKSB0byA5IChiZXN0IGNvbXByZXNzaW9uKS4gIERlZmF1bHRzIHRvIDkuCisgICAgICAgIEB0eXBlIGNvbXByZXNzbGV2ZWw6IGludAorCisgICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSBUWmxpYlRyYW5zcG9ydCB3aGljaCB3cmFwcyB0aGUKKyAgICAgICAgcGFzc2VkIEN7dHJhbnN9IFRUcmFuc3BvcnQgZGVyaXZlZCBpbnN0YW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHRyYW5zID09IHNlbGYuX2xhc3RfdHJhbnM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbGFzdF96CisgICAgICAgIHp0cmFucyA9IFRabGliVHJhbnNwb3J0KHRyYW5zLCBjb21wcmVzc2xldmVsKQorICAgICAgICBzZWxmLl9sYXN0X3RyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5fbGFzdF96ID0genRyYW5zCisgICAgICAgIHJldHVybiB6dHJhbnMKIAogCiBjbGFzcyBUWmxpYlRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKLSAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhIHRyYW5zcG9ydCB3aXRoIHpsaWIsIGNvbXByZXNzaW5nIHdyaXRlcwotICBhbmQgZGVjb21wcmVzc2VzIHJlYWRzLCB1c2luZyB0aGUgcHl0aG9uIHN0YW5kYXJkCi0gIGxpYnJhcnkgemxpYiBtb2R1bGUuCi0gICIiIgotICAjIFJlYWQgYnVmZmVyIHNpemUgZm9yIHRoZSBweXRob24gZmFzdGJpbmFyeSBDIGV4dGVuc2lvbiwKLSAgIyB0aGUgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgY2xhc3MuCi0gIERFRkFVTFRfQlVGRlNJWkUgPSA0MDk2Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCBjb21wcmVzc2xldmVsPTkpOgotICAgICIiIkNyZWF0ZSBhIG5ldyBUWmxpYlRyYW5zcG9ydCwgd3JhcHBpbmcgQ3t0cmFuc30sIGFub3RoZXIKLSAgICBUVHJhbnNwb3J0IGRlcml2ZWQgb2JqZWN0LgotCi0gICAgQHBhcmFtIHRyYW5zOiBBIHRocmlmdCB0cmFuc3BvcnQgb2JqZWN0LCBpLmUuIGEgVFNvY2tldCgpIG9iamVjdC4KLSAgICBAdHlwZSB0cmFuczogVFRyYW5zcG9ydAotICAgIEBwYXJhbSBjb21wcmVzc2xldmVsOiBUaGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCwgcmFuZ2luZwotICAgIGZyb20gMCAobm8gY29tcHJlc3Npb24pIHRvIDkgKGJlc3QgY29tcHJlc3Npb24pLiAgRGVmYXVsdCBpcyA5LgotICAgIEB0eXBlIGNvbXByZXNzbGV2ZWw6IGludAorICAgICIiIkNsYXNzIHRoYXQgd3JhcHMgYSB0cmFuc3BvcnQgd2l0aCB6bGliLCBjb21wcmVzc2luZyB3cml0ZXMKKyAgICBhbmQgZGVjb21wcmVzc2VzIHJlYWRzLCB1c2luZyB0aGUgcHl0aG9uIHN0YW5kYXJkCisgICAgbGlicmFyeSB6bGliIG1vZHVsZS4KICAgICAiIiIKLSAgICBzZWxmLl9fdHJhbnMgPSB0cmFucwotICAgIHNlbGYuY29tcHJlc3NsZXZlbCA9IGNvbXByZXNzbGV2ZWwKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9pbml0X3psaWIoKQotICAgIHNlbGYuX2luaXRfc3RhdHMoKQorICAgICMgUmVhZCBidWZmZXIgc2l6ZSBmb3IgdGhlIHB5dGhvbiBmYXN0YmluYXJ5IEMgZXh0ZW5zaW9uLAorICAgICMgdGhlIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGNsYXNzLgorICAgIERFRkFVTFRfQlVGRlNJWkUgPSA0MDk2CiAKLSAgZGVmIF9yZWluaXRfYnVmZmVycyhzZWxmKToKLSAgICAiIiJJbnRlcm5hbCBtZXRob2QgdG8gaW5pdGlhbGl6ZS9yZXNldCB0aGUgaW50ZXJuYWwgU3RyaW5nSU8gb2JqZWN0cwotICAgIGZvciByZWFkIGFuZCB3cml0ZSBidWZmZXJzLgotICAgICIiIgotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgY29tcHJlc3NsZXZlbD05KToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IFRabGliVHJhbnNwb3J0LCB3cmFwcGluZyBDe3RyYW5zfSwgYW5vdGhlcgorICAgICAgICBUVHJhbnNwb3J0IGRlcml2ZWQgb2JqZWN0LgogCi0gIGRlZiBfaW5pdF9zdGF0cyhzZWxmKToKLSAgICAiIiJJbnRlcm5hbCBtZXRob2QgdG8gcmVzZXQgdGhlIGludGVybmFsIHN0YXRpc3RpY3MgY291bnRlcnMKLSAgICBmb3IgY29tcHJlc3Npb24gcmF0aW9zIGFuZCBiYW5kd2lkdGggc2F2aW5ncy4KLSAgICAiIiIKLSAgICBzZWxmLmJ5dGVzX2luID0gMAotICAgIHNlbGYuYnl0ZXNfb3V0ID0gMAotICAgIHNlbGYuYnl0ZXNfaW5fY29tcCA9IDAKLSAgICBzZWxmLmJ5dGVzX291dF9jb21wID0gMAorICAgICAgICBAcGFyYW0gdHJhbnM6IEEgdGhyaWZ0IHRyYW5zcG9ydCBvYmplY3QsIGkuZS4gYSBUU29ja2V0KCkgb2JqZWN0LgorICAgICAgICBAdHlwZSB0cmFuczogVFRyYW5zcG9ydAorICAgICAgICBAcGFyYW0gY29tcHJlc3NsZXZlbDogVGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwsIHJhbmdpbmcKKyAgICAgICAgZnJvbSAwIChubyBjb21wcmVzc2lvbikgdG8gOSAoYmVzdCBjb21wcmVzc2lvbikuICBEZWZhdWx0IGlzIDkuCisgICAgICAgIEB0eXBlIGNvbXByZXNzbGV2ZWw6IGludAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5jb21wcmVzc2xldmVsID0gY29tcHJlc3NsZXZlbAorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX2luaXRfemxpYigpCisgICAgICAgIHNlbGYuX2luaXRfc3RhdHMoKQogCi0gIGRlZiBfaW5pdF96bGliKHNlbGYpOgotICAgICIiIkludGVybmFsIG1ldGhvZCBmb3Igc2V0dGluZyB1cCB0aGUgemxpYiBjb21wcmVzc2lvbiBhbmQKLSAgICBkZWNvbXByZXNzaW9uIG9iamVjdHMuCi0gICAgIiIiCi0gICAgc2VsZi5femNvbXBfcmVhZCA9IHpsaWIuZGVjb21wcmVzc29iaigpCi0gICAgc2VsZi5femNvbXBfd3JpdGUgPSB6bGliLmNvbXByZXNzb2JqKHNlbGYuY29tcHJlc3NsZXZlbCkKKyAgICBkZWYgX3JlaW5pdF9idWZmZXJzKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbCBtZXRob2QgdG8gaW5pdGlhbGl6ZS9yZXNldCB0aGUgaW50ZXJuYWwgU3RyaW5nSU8gb2JqZWN0cworICAgICAgICBmb3IgcmVhZCBhbmQgd3JpdGUgYnVmZmVycy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKIAotICBkZWYgZ2V0Q29tcFJhdGlvKHNlbGYpOgotICAgICIiIkdldCB0aGUgY3VycmVudCBtZWFzdXJlZCBjb21wcmVzc2lvbiByYXRpb3MgKGluLG91dCkgZnJvbQotICAgIHRoaXMgdHJhbnNwb3J0LgorICAgIGRlZiBfaW5pdF9zdGF0cyhzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgbWV0aG9kIHRvIHJlc2V0IHRoZSBpbnRlcm5hbCBzdGF0aXN0aWNzIGNvdW50ZXJzCisgICAgICAgIGZvciBjb21wcmVzc2lvbiByYXRpb3MgYW5kIGJhbmR3aWR0aCBzYXZpbmdzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ieXRlc19pbiA9IDAKKyAgICAgICAgc2VsZi5ieXRlc19vdXQgPSAwCisgICAgICAgIHNlbGYuYnl0ZXNfaW5fY29tcCA9IDAKKyAgICAgICAgc2VsZi5ieXRlc19vdXRfY29tcCA9IDAKIAotICAgIFJldHVybnMgYSB0dXBsZSBvZjoKLSAgICAoaW5ib3VuZF9jb21wcmVzc2lvbl9yYXRpbywgb3V0Ym91bmRfY29tcHJlc3Npb25fcmF0aW8pCisgICAgZGVmIF9pbml0X3psaWIoc2VsZik6CisgICAgICAgICIiIkludGVybmFsIG1ldGhvZCBmb3Igc2V0dGluZyB1cCB0aGUgemxpYiBjb21wcmVzc2lvbiBhbmQKKyAgICAgICAgZGVjb21wcmVzc2lvbiBvYmplY3RzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5femNvbXBfcmVhZCA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgIHNlbGYuX3pjb21wX3dyaXRlID0gemxpYi5jb21wcmVzc29iaihzZWxmLmNvbXByZXNzbGV2ZWwpCiAKLSAgICBUaGUgY29tcHJlc3Npb24gcmF0aW9zIGFyZSBjb21wdXRlZCBhczoKLSAgICAgICAgY29tcHJlc3NlZCAvIHVuY29tcHJlc3NlZAorICAgIGRlZiBnZXRDb21wUmF0aW8oc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgY3VycmVudCBtZWFzdXJlZCBjb21wcmVzc2lvbiByYXRpb3MgKGluLG91dCkgZnJvbQorICAgICAgICB0aGlzIHRyYW5zcG9ydC4KIAotICAgIEUuZy4sIGRhdGEgdGhhdCBjb21wcmVzc2VzIGJ5IDEweCB3aWxsIGhhdmUgYSByYXRpbyBvZjogMC4xMAotICAgIGFuZCBkYXRhIHRoYXQgY29tcHJlc3NlcyB0byBoYWxmIG9mIHRzIG9yaWdpbmFsIHNpemUgd2lsbAotICAgIGhhdmUgYSByYXRpbyBvZiAwLjUKKyAgICAgICAgUmV0dXJucyBhIHR1cGxlIG9mOgorICAgICAgICAoaW5ib3VuZF9jb21wcmVzc2lvbl9yYXRpbywgb3V0Ym91bmRfY29tcHJlc3Npb25fcmF0aW8pCiAKLSAgICBOb25lIGlzIHJldHVybmVkIGlmIG5vIGJ5dGVzIGhhdmUgeWV0IGJlZW4gcHJvY2Vzc2VkIGluCi0gICAgYSBwYXJ0aWN1bGFyIGRpcmVjdGlvbi4KLSAgICAiIiIKLSAgICByX3BlcmNlbnQsIHdfcGVyY2VudCA9IChOb25lLCBOb25lKQotICAgIGlmIHNlbGYuYnl0ZXNfaW4gPiAwOgotICAgICAgcl9wZXJjZW50ID0gc2VsZi5ieXRlc19pbl9jb21wIC8gc2VsZi5ieXRlc19pbgotICAgIGlmIHNlbGYuYnl0ZXNfb3V0ID4gMDoKLSAgICAgIHdfcGVyY2VudCA9IHNlbGYuYnl0ZXNfb3V0X2NvbXAgLyBzZWxmLmJ5dGVzX291dAotICAgIHJldHVybiAocl9wZXJjZW50LCB3X3BlcmNlbnQpCisgICAgICAgIFRoZSBjb21wcmVzc2lvbiByYXRpb3MgYXJlIGNvbXB1dGVkIGFzOgorICAgICAgICAgICAgY29tcHJlc3NlZCAvIHVuY29tcHJlc3NlZAogCi0gIGRlZiBnZXRDb21wU2F2aW5ncyhzZWxmKToKLSAgICAiIiJHZXQgdGhlIGN1cnJlbnQgY291bnQgb2Ygc2F2ZWQgYnl0ZXMgZHVlIHRvIGRhdGEKLSAgICBjb21wcmVzc2lvbi4KKyAgICAgICAgRS5nLiwgZGF0YSB0aGF0IGNvbXByZXNzZXMgYnkgMTB4IHdpbGwgaGF2ZSBhIHJhdGlvIG9mOiAwLjEwCisgICAgICAgIGFuZCBkYXRhIHRoYXQgY29tcHJlc3NlcyB0byBoYWxmIG9mIHRzIG9yaWdpbmFsIHNpemUgd2lsbAorICAgICAgICBoYXZlIGEgcmF0aW8gb2YgMC41CiAKLSAgICBSZXR1cm5zIGEgdHVwbGUgb2Y6Ci0gICAgKGluYm91bmRfc2F2ZWRfYnl0ZXMsIG91dGJvdW5kX3NhdmVkX2J5dGVzKQorICAgICAgICBOb25lIGlzIHJldHVybmVkIGlmIG5vIGJ5dGVzIGhhdmUgeWV0IGJlZW4gcHJvY2Vzc2VkIGluCisgICAgICAgIGEgcGFydGljdWxhciBkaXJlY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICByX3BlcmNlbnQsIHdfcGVyY2VudCA9IChOb25lLCBOb25lKQorICAgICAgICBpZiBzZWxmLmJ5dGVzX2luID4gMDoKKyAgICAgICAgICAgIHJfcGVyY2VudCA9IHNlbGYuYnl0ZXNfaW5fY29tcCAvIHNlbGYuYnl0ZXNfaW4KKyAgICAgICAgaWYgc2VsZi5ieXRlc19vdXQgPiAwOgorICAgICAgICAgICAgd19wZXJjZW50ID0gc2VsZi5ieXRlc19vdXRfY29tcCAvIHNlbGYuYnl0ZXNfb3V0CisgICAgICAgIHJldHVybiAocl9wZXJjZW50LCB3X3BlcmNlbnQpCiAKLSAgICBOb3RlOiBpZiBjb21wcmVzc2lvbiBpcyBhY3R1YWxseSBleHBhbmRpbmcgeW91cgotICAgIGRhdGEgKG9ubHkgbGlrZWx5IHdpdGggdmVyeSB0aW55IHRocmlmdCBvYmplY3RzKSwgdGhlbgotICAgIHRoZSB2YWx1ZXMgcmV0dXJuZWQgd2lsbCBiZSBuZWdhdGl2ZS4KLSAgICAiIiIKLSAgICByX3NhdmVkID0gc2VsZi5ieXRlc19pbiAtIHNlbGYuYnl0ZXNfaW5fY29tcAotICAgIHdfc2F2ZWQgPSBzZWxmLmJ5dGVzX291dCAtIHNlbGYuYnl0ZXNfb3V0X2NvbXAKLSAgICByZXR1cm4gKHJfc2F2ZWQsIHdfc2F2ZWQpCisgICAgZGVmIGdldENvbXBTYXZpbmdzKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIGN1cnJlbnQgY291bnQgb2Ygc2F2ZWQgYnl0ZXMgZHVlIHRvIGRhdGEKKyAgICAgICAgY29tcHJlc3Npb24uCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICAiIiJSZXR1cm4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0J3Mgb3BlbiBzdGF0dXMiIiIKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCisgICAgICAgIFJldHVybnMgYSB0dXBsZSBvZjoKKyAgICAgICAgKGluYm91bmRfc2F2ZWRfYnl0ZXMsIG91dGJvdW5kX3NhdmVkX2J5dGVzKQogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgICIiIk9wZW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IiIiCi0gICAgc2VsZi5faW5pdF9zdGF0cygpCi0gICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKKyAgICAgICAgTm90ZTogaWYgY29tcHJlc3Npb24gaXMgYWN0dWFsbHkgZXhwYW5kaW5nIHlvdXIKKyAgICAgICAgZGF0YSAob25seSBsaWtlbHkgd2l0aCB2ZXJ5IHRpbnkgdGhyaWZ0IG9iamVjdHMpLCB0aGVuCisgICAgICAgIHRoZSB2YWx1ZXMgcmV0dXJuZWQgd2lsbCBiZSBuZWdhdGl2ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJfc2F2ZWQgPSBzZWxmLmJ5dGVzX2luIC0gc2VsZi5ieXRlc19pbl9jb21wCisgICAgICAgIHdfc2F2ZWQgPSBzZWxmLmJ5dGVzX291dCAtIHNlbGYuYnl0ZXNfb3V0X2NvbXAKKyAgICAgICAgcmV0dXJuIChyX3NhdmVkLCB3X3NhdmVkKQogCi0gIGRlZiBsaXN0ZW4oc2VsZik6Ci0gICAgIiIiSW52b2tlIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCdzIGxpc3RlbigpIG1ldGhvZCIiIgotICAgIHNlbGYuX190cmFucy5saXN0ZW4oKQorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQncyBvcGVuIHN0YXR1cyIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCiAKLSAgZGVmIGFjY2VwdChzZWxmKToKLSAgICAiIiJBY2NlcHQgY29ubmVjdGlvbnMgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IiIiCi0gICAgcmV0dXJuIHNlbGYuX190cmFucy5hY2NlcHQoKQorICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICAiIiJPcGVuIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCIiIgorICAgICAgICBzZWxmLl9pbml0X3N0YXRzKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgIiIiQ2xvc2UgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCIiIgotICAgIHNlbGYuX3JlaW5pdF9idWZmZXJzKCkKLSAgICBzZWxmLl9pbml0X3psaWIoKQotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQorICAgIGRlZiBsaXN0ZW4oc2VsZik6CisgICAgICAgICIiIkludm9rZSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQncyBsaXN0ZW4oKSBtZXRob2QiIiIKKyAgICAgICAgc2VsZi5fX3RyYW5zLmxpc3RlbigpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgICIiIlJlYWQgdXAgdG8gc3ogYnl0ZXMgZnJvbSB0aGUgZGVjb21wcmVzc2VkIGJ5dGVzIGJ1ZmZlciwgYW5kCi0gICAgcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpZiB0aGUgZGVjb21wcmVzc2lvbgotICAgIGJ1ZmZlciBpcyBlbXB0eS4KLSAgICAiIiIKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIGlmIGxlbihyZXQpID4gMDoKLSAgICAgIHJldHVybiByZXQKLSAgICAjIGtlZXAgcmVhZGluZyBmcm9tIHRyYW5zcG9ydCB1bnRpbCBzb21ldGhpbmcgY29tZXMgYmFjawotICAgIHdoaWxlIFRydWU6Ci0gICAgICBpZiBzZWxmLnJlYWRDb21wKHN6KToKLSAgICAgICAgYnJlYWsKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIHJldHVybiByZXQKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICAiIiJBY2NlcHQgY29ubmVjdGlvbnMgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuYWNjZXB0KCkKIAotICBkZWYgcmVhZENvbXAoc2VsZiwgc3opOgotICAgICIiIlJlYWQgY29tcHJlc3NlZCBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCB0aGVuCi0gICAgZGVjb21wcmVzcyBpdCBhbmQgYXBwZW5kIGl0IHRvIHRoZSBpbnRlcm5hbCBTdHJpbmdJTyByZWFkIGJ1ZmZlcgotICAgICIiIgotICAgIHpidWYgPSBzZWxmLl9fdHJhbnMucmVhZChzeikKLSAgICB6YnVmID0gc2VsZi5femNvbXBfcmVhZC51bmNvbnN1bWVkX3RhaWwgKyB6YnVmCi0gICAgYnVmID0gc2VsZi5femNvbXBfcmVhZC5kZWNvbXByZXNzKHpidWYpCi0gICAgc2VsZi5ieXRlc19pbiArPSBsZW4oemJ1ZikKLSAgICBzZWxmLmJ5dGVzX2luX2NvbXAgKz0gbGVuKGJ1ZikKLSAgICBvbGQgPSBzZWxmLl9fcmJ1Zi5yZWFkKCkKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKG9sZCArIGJ1ZikKLSAgICBpZiBsZW4ob2xkKSArIGxlbihidWYpID09IDA6Ci0gICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gVHJ1ZQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCIiIgorICAgICAgICBzZWxmLl9yZWluaXRfYnVmZmVycygpCisgICAgICAgIHNlbGYuX2luaXRfemxpYigpCisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgICIiIldyaXRlIHNvbWUgYnl0ZXMsIHB1dHRpbmcgdGhlbSBpbnRvIHRoZSBpbnRlcm5hbCB3cml0ZQotICAgIGJ1ZmZlciBmb3IgZXZlbnR1YWwgY29tcHJlc3Npb24uCi0gICAgIiIiCi0gICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQorICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgIiIiUmVhZCB1cCB0byBzeiBieXRlcyBmcm9tIHRoZSBkZWNvbXByZXNzZWQgYnl0ZXMgYnVmZmVyLCBhbmQKKyAgICAgICAgcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpZiB0aGUgZGVjb21wcmVzc2lvbgorICAgICAgICBidWZmZXIgaXMgZW1wdHkuCisgICAgICAgICIiIgorICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBpZiBsZW4ocmV0KSA+IDA6CisgICAgICAgICAgICByZXR1cm4gcmV0CisgICAgICAgICMga2VlcCByZWFkaW5nIGZyb20gdHJhbnNwb3J0IHVudGlsIHNvbWV0aGluZyBjb21lcyBiYWNrCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBzZWxmLnJlYWRDb21wKHN6KToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICByZXR1cm4gcmV0CiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgICIiIkZsdXNoIGFueSBxdWV1ZWQgdXAgZGF0YSBpbiB0aGUgd3JpdGUgYnVmZmVyIGFuZCBlbnN1cmUgdGhlCi0gICAgY29tcHJlc3Npb24gYnVmZmVyIGlzIGZsdXNoZWQgb3V0IHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAotICAgICIiIgotICAgIHdvdXQgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCi0gICAgaWYgbGVuKHdvdXQpID4gMDoKLSAgICAgIHpidWYgPSBzZWxmLl96Y29tcF93cml0ZS5jb21wcmVzcyh3b3V0KQotICAgICAgc2VsZi5ieXRlc19vdXQgKz0gbGVuKHdvdXQpCi0gICAgICBzZWxmLmJ5dGVzX291dF9jb21wICs9IGxlbih6YnVmKQotICAgIGVsc2U6Ci0gICAgICB6YnVmID0gJycKLSAgICB6dGFpbCA9IHNlbGYuX3pjb21wX3dyaXRlLmZsdXNoKHpsaWIuWl9TWU5DX0ZMVVNIKQotICAgIHNlbGYuYnl0ZXNfb3V0X2NvbXAgKz0gbGVuKHp0YWlsKQotICAgIGlmIChsZW4oemJ1ZikgKyBsZW4oenRhaWwpKSA+IDA6Ci0gICAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICAgIHNlbGYuX190cmFucy53cml0ZSh6YnVmICsgenRhaWwpCi0gICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKKyAgICBkZWYgcmVhZENvbXAoc2VsZiwgc3opOgorICAgICAgICAiIiJSZWFkIGNvbXByZXNzZWQgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwgdGhlbgorICAgICAgICBkZWNvbXByZXNzIGl0IGFuZCBhcHBlbmQgaXQgdG8gdGhlIGludGVybmFsIFN0cmluZ0lPIHJlYWQgYnVmZmVyCisgICAgICAgICIiIgorICAgICAgICB6YnVmID0gc2VsZi5fX3RyYW5zLnJlYWQoc3opCisgICAgICAgIHpidWYgPSBzZWxmLl96Y29tcF9yZWFkLnVuY29uc3VtZWRfdGFpbCArIHpidWYKKyAgICAgICAgYnVmID0gc2VsZi5femNvbXBfcmVhZC5kZWNvbXByZXNzKHpidWYpCisgICAgICAgIHNlbGYuYnl0ZXNfaW4gKz0gbGVuKHpidWYpCisgICAgICAgIHNlbGYuYnl0ZXNfaW5fY29tcCArPSBsZW4oYnVmKQorICAgICAgICBvbGQgPSBzZWxmLl9fcmJ1Zi5yZWFkKCkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhvbGQgKyBidWYpCisgICAgICAgIGlmIGxlbihvbGQpICsgbGVuKGJ1ZikgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQogCi0gIEBwcm9wZXJ0eQotICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKLSAgICAiIiJJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UiIiIKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgIiIiV3JpdGUgc29tZSBieXRlcywgcHV0dGluZyB0aGVtIGludG8gdGhlIGludGVybmFsIHdyaXRlCisgICAgICAgIGJ1ZmZlciBmb3IgZXZlbnR1YWwgY29tcHJlc3Npb24uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCiAKLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6Ci0gICAgIiIiSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlIGZvciByZWZpbGwiIiIKLSAgICByZXRzdHJpbmcgPSBwYXJ0aWFscmVhZAotICAgIGlmIHJlcWxlbiA8IHNlbGYuREVGQVVMVF9CVUZGU0laRToKLSAgICAgIHJldHN0cmluZyArPSBzZWxmLnJlYWQoc2VsZi5ERUZBVUxUX0JVRkZTSVpFKQotICAgIHdoaWxlIGxlbihyZXRzdHJpbmcpIDwgcmVxbGVuOgotICAgICAgcmV0c3RyaW5nICs9IHNlbGYucmVhZChyZXFsZW4gLSBsZW4ocmV0c3RyaW5nKSkKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHJldHN0cmluZykKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICIiIkZsdXNoIGFueSBxdWV1ZWQgdXAgZGF0YSBpbiB0aGUgd3JpdGUgYnVmZmVyIGFuZCBlbnN1cmUgdGhlCisgICAgICAgIGNvbXByZXNzaW9uIGJ1ZmZlciBpcyBmbHVzaGVkIG91dCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgICAgIiIiCisgICAgICAgIHdvdXQgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgIGlmIGxlbih3b3V0KSA+IDA6CisgICAgICAgICAgICB6YnVmID0gc2VsZi5femNvbXBfd3JpdGUuY29tcHJlc3Mod291dCkKKyAgICAgICAgICAgIHNlbGYuYnl0ZXNfb3V0ICs9IGxlbih3b3V0KQorICAgICAgICAgICAgc2VsZi5ieXRlc19vdXRfY29tcCArPSBsZW4oemJ1ZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHpidWYgPSAnJworICAgICAgICB6dGFpbCA9IHNlbGYuX3pjb21wX3dyaXRlLmZsdXNoKHpsaWIuWl9TWU5DX0ZMVVNIKQorICAgICAgICBzZWxmLmJ5dGVzX291dF9jb21wICs9IGxlbih6dGFpbCkKKyAgICAgICAgaWYgKGxlbih6YnVmKSArIGxlbih6dGFpbCkpID4gMDoKKyAgICAgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICAgICAgc2VsZi5fX3RyYW5zLndyaXRlKHpidWYgKyB6dGFpbCkKKyAgICAgICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICAiIiJJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCisKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgIiIiSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlIGZvciByZWZpbGwiIiIKKyAgICAgICAgcmV0c3RyaW5nID0gcGFydGlhbHJlYWQKKyAgICAgICAgaWYgcmVxbGVuIDwgc2VsZi5ERUZBVUxUX0JVRkZTSVpFOgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYucmVhZChzZWxmLkRFRkFVTFRfQlVGRlNJWkUpCisgICAgICAgIHdoaWxlIGxlbihyZXRzdHJpbmcpIDwgcmVxbGVuOgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYucmVhZChyZXFsZW4gLSBsZW4ocmV0c3RyaW5nKSkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhyZXRzdHJpbmcpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvc3NsY29tcGF0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvc3NsY29tcGF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDBjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9zc2xjb21wYXQucHkKQEAgLTAsMCArMSwxMDAgQEAKKyMKKyMgbGljZW5zZWQgdG8gdGhlIGFwYWNoZSBzb2Z0d2FyZSBmb3VuZGF0aW9uIChhc2YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gc2VlIHRoZSBub3RpY2UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gdGhlIGFzZiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBhcGFjaGUgbGljZW5zZSwgdmVyc2lvbiAyLjAgKHRoZQorIyAibGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIGxpY2Vuc2UuIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgbGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9saWNlbnNlLTIuMAorIworIyB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBsaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJhcyBpcyIgYmFzaXMsIHdpdGhvdXQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIGFueQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN5cworCitmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworCitkZWYgbGVnYWN5X3ZhbGlkYXRlX2NhbGxiYWNrKGNlcnQsIGhvc3RuYW1lKToKKyAgICAiIiJsZWdhY3kgbWV0aG9kIHRvIHZhbGlkYXRlIHRoZSBwZWVyJ3MgU1NMIGNlcnRpZmljYXRlLCBhbmQgdG8gY2hlY2sKKyAgICB0aGUgY29tbW9uTmFtZSBvZiB0aGUgY2VydGlmaWNhdGUgdG8gZW5zdXJlIGl0IG1hdGNoZXMgdGhlIGhvc3RuYW1lIHdlCisgICAgdXNlZCB0byBtYWtlIHRoaXMgY29ubmVjdGlvbi4gIERvZXMgbm90IHN1cHBvcnQgc3ViamVjdEFsdE5hbWUgcmVjb3JkcworICAgIGluIGNlcnRpZmljYXRlcy4KKworICAgIHJhaXNlcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZSBjZXJ0aWZpY2F0ZSBmYWlscyB2YWxpZGF0aW9uLgorICAgICIiIgorICAgIGlmICdzdWJqZWN0JyBub3QgaW4gY2VydDoKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAnTm8gU1NMIGNlcnRpZmljYXRlIGZvdW5kIGZyb20gJXMnICUgaG9zdG5hbWUpCisgICAgZmllbGRzID0gY2VydFsnc3ViamVjdCddCisgICAgZm9yIGZpZWxkIGluIGZpZWxkczoKKyAgICAgICAgIyBlbnN1cmUgc3RydWN0dXJlIHdlIGdldCBiYWNrIGlzIHdoYXQgd2UgZXhwZWN0CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZpZWxkLCB0dXBsZSk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBjZXJ0X3BhaXIgPSBmaWVsZFswXQorICAgICAgICBpZiBsZW4oY2VydF9wYWlyKSA8IDI6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBjZXJ0X2tleSwgY2VydF92YWx1ZSA9IGNlcnRfcGFpclswOjJdCisgICAgICAgIGlmIGNlcnRfa2V5ICE9ICdjb21tb25OYW1lJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGNlcnRob3N0ID0gY2VydF92YWx1ZQorICAgICAgICAjIHRoaXMgY2hlY2sgc2hvdWxkIGJlIHBlcmZvcm1lZCBieSBzb21lIHNvcnQgb2YgQWNjZXNzIE1hbmFnZXIKKyAgICAgICAgaWYgY2VydGhvc3QgPT0gaG9zdG5hbWU6CisgICAgICAgICAgICAjIHN1Y2Nlc3MsIGNlcnQgY29tbW9uTmFtZSBtYXRjaGVzIGRlc2lyZWQgaG9zdG5hbWUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCisgICAgICAgICAgICAgICAgJ0hvc3RuYW1lIHdlIGNvbm5lY3RlZCB0byAiJXMiIGRvZXNuXCd0IG1hdGNoIGNlcnRpZmljYXRlICcKKyAgICAgICAgICAgICAgICAncHJvdmlkZWQgY29tbW9uTmFtZSAiJXMiJyAlIChob3N0bmFtZSwgY2VydGhvc3QpKQorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKKyAgICAgICAgJ0NvdWxkIG5vdCB2YWxpZGF0ZSBTU0wgY2VydGlmaWNhdGUgZnJvbSBob3N0ICIlcyIuICBDZXJ0PSVzJworICAgICAgICAlIChob3N0bmFtZSwgY2VydCkpCisKKworZGVmIF9vcHRpb25hbF9kZXBlbmRlbmNpZXMoKToKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBpcGFkZHJlc3MgICMgbm9xYQorICAgICAgICBsb2dnZXIuZGVidWcoJ2lwYWRkcmVzcyBtb2R1bGUgaXMgYXZhaWxhYmxlJykKKyAgICAgICAgaXBhZGRyID0gVHJ1ZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgbG9nZ2VyLndhcm4oJ2lwYWRkcmVzcyBtb2R1bGUgaXMgdW5hdmFpbGFibGUnKQorICAgICAgICBpcGFkZHIgPSBGYWxzZQorCisgICAgaWYgc3lzLmhleHZlcnNpb24gPCAweDAzMDUwMEYwOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IG1hdGNoX2hvc3RuYW1lLCBfX3ZlcnNpb25fXyBhcyB2ZXIKKyAgICAgICAgICAgIHZlciA9IGxpc3QobWFwKGludCwgdmVyLnNwbGl0KCcuJykpKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIG1vZHVsZSBpcyBhdmFpbGFibGUnKQorICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaF9ob3N0bmFtZQorICAgICAgICAgICAgaWYgdmVyWzBdICogMTAgKyB2ZXJbMV0gPj0gMzU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGlwYWRkciwgbWF0Y2gKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2JhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgbW9kdWxlIGlzIHRvbyBvbGQnKQorICAgICAgICAgICAgICAgIGlwYWRkciA9IEZhbHNlCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGlzIHVuYXZhaWxhYmxlJykKKyAgICAgICAgICAgIGlwYWRkciA9IEZhbHNlCisgICAgdHJ5OgorICAgICAgICBmcm9tIHNzbCBpbXBvcnQgbWF0Y2hfaG9zdG5hbWUKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdzc2wubWF0Y2hfaG9zdG5hbWUgaXMgYXZhaWxhYmxlJykKKyAgICAgICAgbWF0Y2ggPSBtYXRjaF9ob3N0bmFtZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgbG9nZ2VyLndhcm4oJ3VzaW5nIGxlZ2FjeSB2YWxpZGF0aW9uIGNhbGxiYWNrJykKKyAgICAgICAgbWF0Y2ggPSBsZWdhY3lfdmFsaWRhdGVfY2FsbGJhY2sKKyAgICByZXR1cm4gaXBhZGRyLCBtYXRjaAorCisKK19tYXRjaF9oYXNfaXBhZGRyZXNzLCBfbWF0Y2hfaG9zdG5hbWUgPSBfb3B0aW9uYWxfZGVwZW5kZW5jaWVzKCkKZGlmZiAtLWdpdCBhL2xpYi9weS90ZXN0L19pbXBvcnRfbG9jYWxfdGhyaWZ0LnB5IGIvbGliL3B5L3Rlc3QvX2ltcG9ydF9sb2NhbF90aHJpZnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyMzEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS90ZXN0L19pbXBvcnRfbG9jYWxfdGhyaWZ0LnB5CkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgZ2xvYgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK1NDUklQVF9ESVIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpKSkKKworZm9yIGxpYnBhdGggaW4gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihST09UX0RJUiwgJ2xpYicsICdweScsICdidWlsZCcsICdsaWIuKicpKToKKyAgICBpZiBsaWJwYXRoLmVuZHN3aXRoKCctJWQuJWQnICUgKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0pKToKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGxpYnBhdGgpCisgICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS9saWIvcHkvdGVzdC90ZXN0X3NzbHNvY2tldC5weSBiL2xpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OGMxNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvdGVzdC90ZXN0X3NzbHNvY2tldC5weQpAQCAtMCwwICsxLDM0NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzc2wKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKKworaW1wb3J0IF9pbXBvcnRfbG9jYWxfdGhyaWZ0ICAjIG5vcWEKKworU0NSSVBUX0RJUiA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK1JPT1RfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUikpKQorU0VSVkVSX1BFTSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdzZXJ2ZXIucGVtJykKK1NFUlZFUl9DRVJUID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ3NlcnZlci5jcnQnKQorU0VSVkVSX0tFWSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdzZXJ2ZXIua2V5JykKK0NMSUVOVF9DRVJUX05PX0lQID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ2NsaWVudC5jcnQnKQorQ0xJRU5UX0tFWV9OT19JUCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdjbGllbnQua2V5JykKK0NMSUVOVF9DRVJUID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ2NsaWVudF92My5jcnQnKQorQ0xJRU5UX0tFWSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdjbGllbnRfdjMua2V5JykKK0NMSUVOVF9DQSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdDQS5wZW0nKQorCitURVNUX0NJUEhFUlMgPSAnREVTLUNCQzMtU0hBOkVDREhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NicKKworCitjbGFzcyBTZXJ2ZXJBY2NlcHRvcih0aHJlYWRpbmcuVGhyZWFkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyLCBleHBlY3RfZmFpbHVyZT1GYWxzZSk6CisgICAgICAgIHN1cGVyKFNlcnZlckFjY2VwdG9yLCBzZWxmKS5fX2luaXRfXygpCisgICAgICAgIHNlbGYuZGFlbW9uID0gVHJ1ZQorICAgICAgICBzZWxmLl9zZXJ2ZXIgPSBzZXJ2ZXIKKyAgICAgICAgc2VsZi5fbGlzdGVuaW5nID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fcG9ydCA9IE5vbmUKKyAgICAgICAgc2VsZi5fcG9ydF9ib3VuZCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuX2NsaWVudCA9IE5vbmUKKyAgICAgICAgc2VsZi5fY2xpZW50X2FjY2VwdGVkID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fZXhwZWN0X2ZhaWx1cmUgPSBleHBlY3RfZmFpbHVyZQorICAgICAgICBmcmFtZSA9IGluc3BlY3Quc3RhY2soMylbMl0KKyAgICAgICAgc2VsZi5uYW1lID0gZnJhbWVbM10KKyAgICAgICAgZGVsIGZyYW1lCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLl9zZXJ2ZXIubGlzdGVuKCkKKyAgICAgICAgc2VsZi5fbGlzdGVuaW5nLnNldCgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYWRkcmVzcyA9IHNlbGYuX3NlcnZlci5oYW5kbGUuZ2V0c29ja25hbWUoKQorICAgICAgICAgICAgaWYgbGVuKGFkZHJlc3MpID4gMToKKyAgICAgICAgICAgICAgICAjIEFGX0lORVQgYWRkcmVzc2VzIGFyZSAyLXR1cGxlcyAoaG9zdCwgcG9ydCkgYW5kIEFGX0lORVQ2IGFyZQorICAgICAgICAgICAgICAgICMgNC10dXBsZXMgKGhvc3QsIHBvcnQsIC4uLiksIGJ1dCBpbiBlYWNoIGNhc2UgcG9ydCBpcyBpbiB0aGUgc2Vjb25kIHNsb3QuCisgICAgICAgICAgICAgICAgc2VsZi5fcG9ydCA9IGFkZHJlc3NbMV0KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX3BvcnRfYm91bmQuc2V0KCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9jbGllbnQgPSBzZWxmLl9zZXJ2ZXIuYWNjZXB0KCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCdlcnJvciBvbiBzZXJ2ZXIgc2lkZSAoJXMpOicgJSBzZWxmLm5hbWUpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZXhwZWN0X2ZhaWx1cmU6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NsaWVudF9hY2NlcHRlZC5zZXQoKQorCisgICAgZGVmIGF3YWl0X2xpc3RlbmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fbGlzdGVuaW5nLndhaXQoKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHBvcnQoc2VsZik6CisgICAgICAgIHNlbGYuX3BvcnRfYm91bmQud2FpdCgpCisgICAgICAgIHJldHVybiBzZWxmLl9wb3J0CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY2xpZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9jbGllbnRfYWNjZXB0ZWQud2FpdCgpCisgICAgICAgIHJldHVybiBzZWxmLl9jbGllbnQKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY2xpZW50OgorICAgICAgICAgICAgc2VsZi5fY2xpZW50LmNsb3NlKCkKKyAgICAgICAgc2VsZi5fc2VydmVyLmNsb3NlKCkKKworCisjIFB5dGhvbiAyLjYgY29tcGF0CitjbGFzcyBBc3NlcnRSYWlzZXMob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwZWN0ZWQpOgorICAgICAgICBzZWxmLl9leHBlY3RlZCA9IGV4cGVjdGVkCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgaWYgbm90IGV4Y190eXBlIG9yIG5vdCBpc3N1YmNsYXNzKGV4Y190eXBlLCBzZWxmLl9leHBlY3RlZCk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ2ZhaWwnKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIFRTU0xTb2NrZXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX3NlcnZlcl9zb2NrZXQoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gVFNTTFNlcnZlclNvY2tldChwb3J0PTAsICoqa3dhcmdzKQorCisgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgZGVmIF9jb25uZWN0YWJsZV9jbGllbnQoc2VsZiwgc2VydmVyLCBleHBlY3RfZmFpbHVyZT1GYWxzZSwgcGF0aD1Ob25lLCAqKmNsaWVudF9rd2FyZ3MpOgorICAgICAgICBhY2MgPSBTZXJ2ZXJBY2NlcHRvcihzZXJ2ZXIsIGV4cGVjdF9mYWlsdXJlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhY2Muc3RhcnQoKQorICAgICAgICAgICAgYWNjLmF3YWl0X2xpc3RlbmluZygpCisKKyAgICAgICAgICAgIGhvc3QsIHBvcnQgPSAoJ2xvY2FsaG9zdCcsIGFjYy5wb3J0KSBpZiBwYXRoIGlzIE5vbmUgZWxzZSAoTm9uZSwgTm9uZSkKKyAgICAgICAgICAgIGNsaWVudCA9IFRTU0xTb2NrZXQoaG9zdCwgcG9ydCwgdW5peF9zb2NrZXQ9cGF0aCwgKipjbGllbnRfa3dhcmdzKQorICAgICAgICAgICAgeWllbGQgYWNjLCBjbGllbnQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGFjYy5jbG9zZSgpCisKKyAgICBkZWYgX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VsZiwgc2VydmVyLCBwYXRoPU5vbmUsICoqY2xpZW50X2FyZ3MpOgorICAgICAgICBsb2dnaW5nLmRpc2FibGUobG9nZ2luZy5DUklUSUNBTCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBzZWxmLl9jb25uZWN0YWJsZV9jbGllbnQoc2VydmVyLCBUcnVlLCBwYXRoPXBhdGgsICoqY2xpZW50X2FyZ3MpIGFzIChhY2MsIGNsaWVudCk6CisgICAgICAgICAgICAgICAgIyBXZSBuZWVkIHRvIHdhaXQgZm9yIGEgY29ubmVjdGlvbiBmYWlsdXJlLCBidXQgbm90IHRvbyBsb25nLiAgMjBtcyBpcyBhIHR1bmFibGUKKyAgICAgICAgICAgICAgICAjIGNvbXByb21pc2UgYmV0d2VlbiB0ZXN0IHNwZWVkIGFuZCBzdGFiaWxpdHkKKyAgICAgICAgICAgICAgICBjbGllbnQuc2V0VGltZW91dCgyMCkKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuX2Fzc2VydF9yYWlzZXMoVFRyYW5zcG9ydEV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgICAgIGNsaWVudC5vcGVuKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWNjLmNsaWVudCBpcyBOb25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9nZ2luZy5kaXNhYmxlKGxvZ2dpbmcuTk9UU0VUKQorCisgICAgZGVmIF9hc3NlcnRfcmFpc2VzKHNlbGYsIGV4Yyk6CisgICAgICAgIGlmIHN5cy5oZXh2ZXJzaW9uID49IDB4MDIwNzAwRjA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hc3NlcnRSYWlzZXMoZXhjKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEFzc2VydFJhaXNlcyhleGMpCisKKyAgICBkZWYgX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VsZiwgc2VydmVyLCBwYXRoPU5vbmUsICoqY2xpZW50X2FyZ3MpOgorICAgICAgICB3aXRoIHNlbGYuX2Nvbm5lY3RhYmxlX2NsaWVudChzZXJ2ZXIsIHBhdGg9cGF0aCwgKipjbGllbnRfYXJncykgYXMgKGFjYywgY2xpZW50KToKKyAgICAgICAgICAgIGNsaWVudC5vcGVuKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWNjLmNsaWVudCBpcyBub3QgTm9uZSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCkKKworICAgICMgZGVwcmVjYXRlZCBmZWF0dXJlCisgICAgZGVmIHRlc3RfZGVwcmVjYXRpb24oc2VsZik6CisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnYWx3YXlzJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9c2VsZi5fX21vZHVsZV9fKQorICAgICAgICAgICAgVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgdmFsaWRhdGU9VHJ1ZSwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMSkKKworICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAgICAgICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdmFsaWRhdGU9VHJ1ZSwgY2FfY2VydHM9Tm9uZSwga2V5ZmlsZT1Ob25lLCBjZXJ0ZmlsZT1Ob25lLCB1bml4X3NvY2tldD1Ob25lLCBjaXBoZXJzPU5vbmUpOgorICAgICAgICAgICAgVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgVHJ1ZSwgU0VSVkVSX0NFUlQsIENMSUVOVF9LRVksIENMSUVOVF9DRVJULCBOb25lLCBURVNUX0NJUEhFUlMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgNykKKworICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAgICAgICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCBjZXJ0ZmlsZT0nY2VydC5wZW0nLCB1bml4X3NvY2tldD1Ob25lLCBjaXBoZXJzPU5vbmUpOgorICAgICAgICAgICAgVFNTTFNlcnZlclNvY2tldChOb25lLCAwLCBTRVJWRVJfUEVNLCBOb25lLCBURVNUX0NJUEhFUlMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMykKKworICAgICMgZGVwcmVjYXRlZCBmZWF0dXJlCisgICAgZGVmIHRlc3Rfc2V0X2NlcnRfcmVxc19ieV92YWxpZGF0ZShzZWxmKToKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdhbHdheXMnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1zZWxmLl9fbW9kdWxlX18pCisgICAgICAgICAgICBjMSA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIHZhbGlkYXRlPVRydWUsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjMS5jZXJ0X3JlcXMsIHNzbC5DRVJUX1JFUVVJUkVEKQorCisgICAgICAgICAgICBjMSA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIHZhbGlkYXRlPUZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjMS5jZXJ0X3JlcXMsIHNzbC5DRVJUX05PTkUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAyKQorCisgICAgIyBkZXByZWNhdGVkIGZlYXR1cmUKKyAgICBkZWYgdGVzdF9zZXRfdmFsaWRhdGVfYnlfY2VydF9yZXFzKHNlbGYpOgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgIGMxID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGMxLnZhbGlkYXRlKQorCisgICAgICAgICAgICBjMiA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzIudmFsaWRhdGUpCisKKyAgICAgICAgICAgIGMzID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgY2VydF9yZXFzPXNzbC5DRVJUX09QVElPTkFMLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjMy52YWxpZGF0ZSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDMpCisKKyAgICBkZWYgdGVzdF91bml4X2RvbWFpbl9zb2NrZXQoc2VsZik6CisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X3VuaXhfZG9tYWluX3NvY2tldCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZmQsIHBhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgIG9zLnVubGluayhwYXRoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KHVuaXhfc29ja2V0PXBhdGgsIGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgcGF0aD1wYXRoLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhwYXRoKQorCisgICAgZGVmIHRlc3Rfc2VydmVyX2NlcnQoc2VsZik6CisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICAjIHNlcnZlciBjZXJ0IG5vdCBpbiBjYV9jZXJ0cworICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1DTElFTlRfQ0VSVCkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSkKKworICAgIGRlZiB0ZXN0X3NldF9zZXJ2ZXJfY2VydChzZWxmKToKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPUNMSUVOVF9DRVJUKQorICAgICAgICB3aXRoIHNlbGYuX2Fzc2VydF9yYWlzZXMoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHNlcnZlci5jZXJ0ZmlsZSA9ICdmb28nCisgICAgICAgIHdpdGggc2VsZi5fYXNzZXJ0X3JhaXNlcyhFeGNlcHRpb24pOgorICAgICAgICAgICAgc2VydmVyLmNlcnRmaWxlID0gTm9uZQorICAgICAgICBzZXJ2ZXIuY2VydGZpbGUgPSBTRVJWRVJfQ0VSVAorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKworICAgIGRlZiB0ZXN0X2NsaWVudF9jZXJ0KHNlbGYpOgorICAgICAgICBpZiBub3QgX21hdGNoX2hhc19pcGFkZHJlc3M6CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF9jbGllbnRfY2VydCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCgKKyAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwga2V5ZmlsZT1TRVJWRVJfS0VZLAorICAgICAgICAgICAgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNhX2NlcnRzPUNMSUVOVF9DRVJUKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBrZXlmaWxlPVNFUlZFUl9LRVkpCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCgKKyAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwga2V5ZmlsZT1TRVJWRVJfS0VZLAorICAgICAgICAgICAgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNhX2NlcnRzPUNMSUVOVF9DQSkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjZXJ0ZmlsZT1DTElFTlRfQ0VSVF9OT19JUCwga2V5ZmlsZT1DTElFTlRfS0VZX05PX0lQKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoCisgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGtleWZpbGU9U0VSVkVSX0tFWSwKKyAgICAgICAgICAgIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjYV9jZXJ0cz1DTElFTlRfQ0EpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2VydGZpbGU9Q0xJRU5UX0NFUlQsIGtleWZpbGU9Q0xJRU5UX0tFWSkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KAorICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX09QVElPTkFMLCBrZXlmaWxlPVNFUlZFUl9LRVksCisgICAgICAgICAgICBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2FfY2VydHM9Q0xJRU5UX0NBKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNlcnRmaWxlPUNMSUVOVF9DRVJULCBrZXlmaWxlPUNMSUVOVF9LRVkpCisKKyAgICBkZWYgdGVzdF9jaXBoZXJzKHNlbGYpOgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNpcGhlcnM9VEVTVF9DSVBIRVJTKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIGNpcGhlcnM9VEVTVF9DSVBIRVJTKQorCisgICAgICAgIGlmIG5vdCBUU1NMU29ja2V0Ll9oYXNfY2lwaGVyczoKKyAgICAgICAgICAgICMgdW5pdHRlc3Quc2tpcCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gMi42CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF9jaXBoZXJzJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgY2lwaGVycz0nTlVMTCcpCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjaXBoZXJzPVRFU1RfQ0lQSEVSUykKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBjaXBoZXJzPSdOVUxMJykKKworICAgIGRlZiB0ZXN0X3NzbDJfYW5kX3NzbDNfZGlzYWJsZWQoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1NTTHYzJyk6CisgICAgICAgICAgICBwcmludCgnUFJPVE9DT0xfU1NMdjMgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MykKKworICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjMpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfU1NMdjInKToKKyAgICAgICAgICAgIHByaW50KCdQUk9UT0NPTF9TU0x2MiBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYyKQorCisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MikKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKworICAgIGRlZiB0ZXN0X25ld2VyX3RscyhzZWxmKToKKyAgICAgICAgaWYgbm90IFRTU0xTb2NrZXQuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgICMgdW5pdHRlc3Quc2tpcCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gMi42CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF9uZXdlcl90bHMnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzInKToKKyAgICAgICAgICAgIHByaW50KCdQUk9UT0NPTF9UTFN2MV8yIGlzIG5vdCBhdmFpbGFibGUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMikKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzIpCisKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMScpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1RMU3YxXzEgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8xKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMSkKKworICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8xJykgb3Igbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMicpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1RMU3YxXzEgYW5kL29yIFBST1RPQ09MX1RMU3YxXzIgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8yKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMSkKKworICAgIGRlZiB0ZXN0X3NzbF9jb250ZXh0KHNlbGYpOgorICAgICAgICBpZiBub3QgVFNTTFNvY2tldC5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgIyB1bml0dGVzdC5za2lwIGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiAyLjYKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X3NzbF9jb250ZXh0JykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZXJ2ZXJfY29udGV4dCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KHNzbC5QdXJwb3NlLkNMSUVOVF9BVVRIKQorICAgICAgICBzZXJ2ZXJfY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oU0VSVkVSX0NFUlQsIFNFUlZFUl9LRVkpCisgICAgICAgIHNlcnZlcl9jb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhDTElFTlRfQ0EpCisgICAgICAgIHNlcnZlcl9jb250ZXh0LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChzc2xfY29udGV4dD1zZXJ2ZXJfY29udGV4dCkKKworICAgICAgICBjbGllbnRfY29udGV4dCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KHNzbC5QdXJwb3NlLlNFUlZFUl9BVVRIKQorICAgICAgICBjbGllbnRfY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oQ0xJRU5UX0NFUlQsIENMSUVOVF9LRVkpCisgICAgICAgIGNsaWVudF9jb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhTRVJWRVJfQ0VSVCkKKyAgICAgICAgY2xpZW50X2NvbnRleHQudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBzc2xfY29udGV4dD1jbGllbnRfY29udGV4dCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5XQVJOKQorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydC5UU1NMU29ja2V0IGltcG9ydCBUU1NMU29ja2V0LCBUU1NMU2VydmVyU29ja2V0LCBfbWF0Y2hfaGFzX2lwYWRkcmVzcworICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uCisKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weS90ZXN0L3RocmlmdF9qc29uLnB5IGIvbGliL3B5L3Rlc3QvdGhyaWZ0X2pzb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlN2E0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS90ZXN0L3RocmlmdF9qc29uLnB5CkBAIC0wLDAgKzEsNTEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IF9pbXBvcnRfbG9jYWxfdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorCisjCisjIEluIG9yZGVyIHRvIHJ1biB0aGUgdGVzdCB1bmRlciBXaW5kb3dzLiBXZSBuZWVkIHRvIGNyZWF0ZSBzeW1ib2xpYyBsaW5rCisjIG5hbWUgJ3RocmlmdCcgdG8gJy4uL3NyYycgZm9sZGVyIGJ5IHVzaW5nOgorIworIyBta2xpbmsgL0QgdGhyaWZ0IC4uXHNyYworIworCisKK2NsYXNzIFRlc3RKU09OU3RyaW5nKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2VzY2FwZWRfdW5pY29kZV9zdHJpbmcoc2VsZik6CisgICAgICAgIHVuaWNvZGVfanNvbiA9IGInImhlbGxvIFxcdTBlMDFcXHUwZTAyXFx1MGUwM1xcdWQ4MzVcXHVkY2FiXFx1ZGI0MFxcdWRjNzAgdW5pY29kZSInCisgICAgICAgIHVuaWNvZGVfdGV4dCA9IHUnaGVsbG8gXHUwZTAxXHUwZTAyXHUwZTAzXFUwMDAxRDRBQlxVMDAwRTAwNzAgdW5pY29kZScKKworICAgICAgICBidWYgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIodW5pY29kZV9qc29uKQorICAgICAgICB0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKS5nZXRUcmFuc3BvcnQoYnVmKQorICAgICAgICBwcm90b2NvbCA9IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KQorCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgICAgIHVuaWNvZGVfdGV4dCA9IHVuaWNvZGVfdGV4dC5lbmNvZGUoJ3V0ZjgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvY29sLnJlYWRTdHJpbmcoKSwgdW5pY29kZV90ZXh0KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcmIvTWFrZWZpbGUuYW0gYi9saWIvcmIvTWFrZWZpbGUuYW0KaW5kZXggMTM3ZWRiNC4uMTg0MTA2NSAxMDA3NTUKLS0tIGEvbGliL3JiL01ha2VmaWxlLmFtCisrKyBiL2xpYi9yYi9NYWtlZmlsZS5hbQpAQCAtMzEsNiArMzEsNyBAQAogY2xlYW4tbG9jYWw6CiAJJChCVU5ETEVSKSBpbnN0YWxsCiAJJChCVU5ETEVSKSBleGVjIHJha2UgY2xlYW4KKwkkKFJNKSAtciBzcGVjL2dlbi1yYi8KIAogY2hlY2stbG9jYWw6IGFsbAogCSQoQlVORExFUikgaW5zdGFsbApAQCAtMzgsNiArMzksOSBAQAogCiBlbmRpZgogCitkaXN0LWhvb2s6CisJJChSTSkgLXIgJChkaXN0ZGlyKS9zcGVjL2dlbi1yYi8KKwogRVhUUkFfRElTVCA9IFwKIAljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKIAlSYWtlZmlsZSBcCmRpZmYgLS1naXQgYS9saWIvcmIvUmFrZWZpbGUgYi9saWIvcmIvUmFrZWZpbGUKaW5kZXggMDgzMWU2OC4uNWU1ZTVhYyAxMDA2NDQKLS0tIGEvbGliL3JiL1Jha2VmaWxlCisrKyBiL2xpYi9yYi9SYWtlZmlsZQpAQCAtNDcsMTUgKzQ3LDE1IEBACiAKICAgdGFzayA6J25hbWVzcGFjZWRfc3BlYycgZG8KICAgICBkaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjJwotICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiOm5hbWVzcGFjZWQnLCAnLXJlY3Vyc2UnLCAnLW8nLCBkaXIsICIje2Rpcn0vVGhyaWZ0TmFtZXNwYWNlZFNwZWMudGhyaWZ0IgotICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiOm5hbWVzcGFjZWQnLCAnLXJlY3Vyc2UnLCAnLW8nLCBkaXIsICIje2Rpcn0vQmFzZVNlcnZpY2UudGhyaWZ0IgotICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiOm5hbWVzcGFjZWQnLCAnLXJlY3Vyc2UnLCAnLW8nLCBkaXIsICIje2Rpcn0vRXh0ZW5kZWRTZXJ2aWNlLnRocmlmdCIKKyAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYjpuYW1lc3BhY2VkJywgJy0tcmVjdXJzZScsICctbycsIGRpciwgIiN7ZGlyfS9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQiCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmI6bmFtZXNwYWNlZCcsICctLXJlY3Vyc2UnLCAnLW8nLCBkaXIsICIje2Rpcn0vQmFzZVNlcnZpY2UudGhyaWZ0IgorICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiOm5hbWVzcGFjZWQnLCAnLS1yZWN1cnNlJywgJy1vJywgZGlyLCAiI3tkaXJ9L0V4dGVuZGVkU2VydmljZS50aHJpZnQiCiAgIGVuZAogCiAgIHRhc2sgOidmbGF0X3NwZWMnIGRvCiAgICAgZGlyID0gRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlYycKICAgICBta2Rpcl9wKCIje2Rpcn0vZ2VuLXJiL2ZsYXQiKQotICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiJywgJy1yZWN1cnNlJywgJy1vdXQnLCAiI3tkaXJ9L2dlbi1yYi9mbGF0IiwgIiN7ZGlyfS9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQiCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmInLCAnLS1yZWN1cnNlJywgJy1vdXQnLCAiI3tkaXJ9L2dlbi1yYi9mbGF0IiwgIiN7ZGlyfS9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQiCiAgIGVuZAogCiAgIHRhc2sgOidiZW5jaG1hcmsnIGRvCkBAIC03MSw2ICs3MSw3IEBACiAKIGRlc2MgIkJ1aWxkIHRoZSBuYXRpdmUgbGlicmFyeSIKIHRhc2sgOmJ1aWxkX2V4dCA9PiA6J2dlbi1yYicgZG8KKyAgIG5leHQgaWYgZGVmaW5lZD8oUlVCWV9FTkdJTkUpICYmIFJVQllfRU5HSU5FID1+IC9qcnVieS8KICAgIERpcjo6Y2hkaXIoRmlsZTo6ZGlybmFtZSgnZXh0L2V4dGNvbmYucmInKSkgZG8KICAgICAgIHVubGVzcyBzaCAicnVieSAje0ZpbGU6OmJhc2VuYW1lKCdleHQvZXh0Y29uZi5yYicpfSIKICAgICAgICAgJHN0ZGVyci5wdXRzICJGYWlsZWQgdG8gcnVuIGV4dGNvbmYiCmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L3N0cnVjdC5jIGIvbGliL3JiL2V4dC9zdHJ1Y3QuYwppbmRleCBmNTAwZDAzLi5lM2FhODU1IDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L3N0cnVjdC5jCisrKyBiL2xpYi9yYi9leHQvc3RydWN0LmMKQEAgLTI5MCw3ICsyOTAsNyBAQAogCiAgICAgaWYgKFRZUEUodmFsdWUpID09IFRfQVJSQVkpIHsKICAgICAgIGl0ZW1zID0gdmFsdWU7Ci0gICAgfSBlbHNlIHsgICAgICAgIAorICAgIH0gZWxzZSB7CiAgICAgICBpZiAocmJfY1NldCA9PSBDTEFTU19PRih2YWx1ZSkpIHsKICAgICAgICAgaXRlbXMgPSByYl9mdW5jYWxsKHZhbHVlLCBlbnRyaWVzX21ldGhvZF9pZCwgMCk7CiAgICAgICB9IGVsc2UgewpAQCAtNjcwLDYgKzY3MCwxMCBAQAogCiAgIFZBTFVFIGZpZWxkX2luZm8gPSByYl9oYXNoX2FyZWYoc3RydWN0X2ZpZWxkcywgZmllbGRfaWQpOwogCisgIGlmKE5JTF9QKGZpZWxkX2luZm8pKSB7CisgICAgcmJfcmFpc2UocmJfZVJ1bnRpbWVFcnJvciwgInNldF9maWVsZCBpcyBub3QgdmFsaWQgZm9yIHRoaXMgdW5pb24hIik7CisgIH0KKwogICBWQUxVRSB0dHlwZV92YWx1ZSA9IHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCB0eXBlX3N5bSk7CiAgIGludCB0dHlwZSA9IEZJWDJJTlQodHR5cGVfdmFsdWUpOwogCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0LnJiCmluZGV4IGZhZGViY2EuLjBmNTgxMjIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0LnJiCkBAIC0xLDQgKzEsNCBAQAotIyAKKyMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQogIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtNiwxNiArNiwxNiBAQAogIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCiAjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAorIwogIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKKyMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KLSMgCisjCiAjIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCiAjIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCiAjIGRldGFpbHMuCkBAIC00OSw3ICs0OSw5IEBACiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0JwogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3NvY2tldCcKK3JlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldCcKK3JlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvc3NsX3NlcnZlcl9zb2NrZXQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0JwogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydCcKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYgppbmRleCBiOTZmYjQzLi5jZTIxZTEyIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm9jZXNzb3IucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvY2Vzc29yLnJiCkBAIC0xNywxMCArMTcsMTggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjIAogCityZXF1aXJlICdsb2dnZXInCisKIG1vZHVsZSBUaHJpZnQKICAgbW9kdWxlIFByb2Nlc3NvcgotICAgIGRlZiBpbml0aWFsaXplKGhhbmRsZXIpCisgICAgZGVmIGluaXRpYWxpemUoaGFuZGxlciwgbG9nZ2VyPW5pbCkKICAgICAgIEBoYW5kbGVyID0gaGFuZGxlcgorICAgICAgaWYgbG9nZ2VyLm5pbD8KKyAgICAgICAgQGxvZ2dlciA9IExvZ2dlci5uZXcoU1RERVJSKQorICAgICAgICBAbG9nZ2VyLmxldmVsID0gTG9nZ2VyOjpXQVJOCisgICAgICBlbHNlCisgICAgICAgIEBsb2dnZXIgPSBsb2dnZXIKKyAgICAgIGVuZAogICAgIGVuZAogCiAgICAgZGVmIHByb2Nlc3MoaXByb3QsIG9wcm90KQpAQCAtMzAsNiArMzgsNyBAQAogICAgICAgICAgIHNlbmQoInByb2Nlc3NfI3tuYW1lfSIsIHNlcWlkLCBpcHJvdCwgb3Byb3QpCiAgICAgICAgIHJlc2N1ZSA9PiBlCiAgICAgICAgICAgeCA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgICAgICAgQGxvZ2dlci5kZWJ1ZyAiSW50ZXJuYWwgZXJyb3IgOiAje2UubWVzc2FnZX1cbiN7ZS5iYWNrdHJhY2Uuam9pbigiXG4iKX0iCiAgICAgICAgICAgd3JpdGVfZXJyb3IoeCwgb3Byb3QsIG5hbWUsIHNlcWlkKQogICAgICAgICBlbmQKICAgICAgICAgdHJ1ZQpAQCAtNTcsMTIgKzY2LDEwIEBACiAgICAgZW5kCiAKICAgICBkZWYgd3JpdGVfZXJyb3IoZXJyLCBvcHJvdCwgbmFtZSwgc2VxaWQpCi0gICAgICBwICd3cml0ZV9lcnJvcicKICAgICAgIG9wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgTWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIHNlcWlkKQogICAgICAgZXJyLndyaXRlKG9wcm90KQogICAgICAgb3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQKICAgICAgIG9wcm90LnRyYW5zLmZsdXNoCi0gICAgICBwICd3cml0ZV9lcnJvciBlbmQnCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbC5yYgppbmRleCA4OGY0NGQ0Li40ZDgzYTIxIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIKQEAgLTMyMyw4ICszMjMsNiBAQAogCiAgICAgZGVmIHNraXAodHlwZSkKICAgICAgIGNhc2UgdHlwZQotICAgICAgd2hlbiBUeXBlczo6U1RPUAotICAgICAgICBuaWwKICAgICAgIHdoZW4gVHlwZXM6OkJPT0wKICAgICAgICAgcmVhZF9ib29sCiAgICAgICB3aGVuIFR5cGVzOjpCWVRFCkBAIC0zNjcsMTMgKzM2NSwyMyBAQAogICAgICAgICAgIHNraXAoZXR5cGUpCiAgICAgICAgIGVuZAogICAgICAgICByZWFkX2xpc3RfZW5kCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFByb3RvY29sRXhjZXB0aW9uLm5ldyhQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAnSW52YWxpZCBkYXRhJykKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiI3t0cmFucy50b19zfSIKKyAgICBlbmQKICAgZW5kCiAKICAgY2xhc3MgQmFzZVByb3RvY29sRmFjdG9yeQogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiYXNlIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiCmluZGV4IGU3MGIxZTMuLmQ4Mjc5ZGIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIKQEAgLTIyNiwxMiArMjI2LDE5IEBACiAgICAgICBzaXplID0gcmVhZF9pMzIKICAgICAgIHRyYW5zLnJlYWRfYWxsKHNpemUpCiAgICAgZW5kCi0KKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJpbmFyeSgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCiAKICAgY2xhc3MgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IDwgQmFzZVByb3RvY29sRmFjdG9yeQogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICByZXR1cm4gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcodHJhbnMpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiaW5hcnkiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIKaW5kZXggNzBlYTY1Mi4uMDliMDI2NCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYgpAQCAtMzUsNSArMzUsMTMgQEAKICAgICAgICAgQmluYXJ5UHJvdG9jb2wubmV3KHRyYW5zKQogICAgICAgZW5kCiAgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgaWYgKGRlZmluZWQ/IEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpCisgICAgICAgICJiaW5hcnktYWNjZWwiCisgICAgICBlbHNlCisgICAgICAgICJiaW5hcnkiCisgICAgICBlbmQKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sLnJiCmluZGV4IDYwNWVlYTYuLjFmOWJkMzAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvY29tcGFjdF9wcm90b2NvbC5yYgpAQCAtMzQ1LDYgKzM0NSwxMCBAQAogICAgICAgc2l6ZSA9IHJlYWRfdmFyaW50MzIoKQogICAgICAgdHJhbnMucmVhZF9hbGwoc2l6ZSkKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImNvbXBhY3QoI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAKICAgICBwcml2YXRlCiAgICAgCkBAIC00MzEsNSArNDM1LDkgQEAKICAgICBkZWYgZ2V0X3Byb3RvY29sKHRyYW5zKQogICAgICAgQ29tcGFjdFByb3RvY29sLm5ldyh0cmFucykKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImNvbXBhY3QiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9qc29uX3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvanNvbl9wcm90b2NvbC5yYgppbmRleCA5ZjAwNjlkLi45MWU3NGU0IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9qc29uX3Byb3RvY29sLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2pzb25fcHJvdG9jb2wucmIKQEAgLTE4LDYgKzE4LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjIAogCityZXF1aXJlICdiYXNlNjQnCiAKIG1vZHVsZSBUaHJpZnQKICAgY2xhc3MgTG9va2FoZWFkUmVhZGVyCkBAIC0zMTAsNyArMzExLDcgQEAKICAgICBkZWYgd3JpdGVfanNvbl9iYXNlNjQoc3RyKQogICAgICAgQGNvbnRleHQud3JpdGUodHJhbnMpCiAgICAgICB0cmFucy53cml0ZShAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQotICAgICAgd3JpdGVfanNvbl9zdHJpbmcoW3N0cl0ucGFjaygibSIpKQorICAgICAgdHJhbnMud3JpdGUoQmFzZTY0LnN0cmljdF9lbmNvZGU2NChzdHIpKQogICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKICAgICBlbmQKIApAQCAtMzMyLDcgKzMzMyw3IEBACiAgICAgIyAiTmFOIiBvciAiSW5maW5pdHkiIG9yICItSW5maW5pdHkiLgogICAgIGRlZiB3cml0ZV9qc29uX2RvdWJsZShudW0pCiAgICAgICBAY29udGV4dC53cml0ZSh0cmFucykKLSAgICAgICMgTm9ybWFsaXplIG91dHB1dCBvZiBib29zdDo6bGV4aWNhbF9jYXN0IGZvciBOYU5zIGFuZCBJbmZpbml0aWVzCisgICAgICAjIE5vcm1hbGl6ZSBvdXRwdXQgb2YgdGhyaWZ0Ojp0b19zdHJpbmcgZm9yIE5hTnMgYW5kIEluZmluaXRpZXMKICAgICAgIHNwZWNpYWwgPSBmYWxzZTsKICAgICAgIGlmIChudW0ubmFuPykKICAgICAgICAgc3BlY2lhbCA9IHRydWU7CkBAIC01MTMsNyArNTE0LDcgQEAKICAgICAgICMgVGhlIGVsZW1lbnRzIG9mIHRoaXMgYXJyYXkgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluCiAgICAgICAjIGVzY2FwZV9jaGFycwogICAgICAgZXNjYXBlX2NoYXJfdmFscyA9IFsKLSAgICAgICAgJyInLCAnXFwnLCAnLycsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsCisgICAgICAgICJcIiIsICJcXCIsICJcLyIsICJcYiIsICJcZiIsICJcbiIsICJcciIsICJcdCIsCiAgICAgICBdCiAKICAgICAgIGlmICFza2lwQ29udGV4dApAQCAtNTQ2LDcgKzU0NywxNSBAQAogCiAgICAgIyBSZWFkcyBhIGJsb2NrIG9mIGJhc2U2NCBjaGFyYWN0ZXJzLCBkZWNvZGluZyBpdCwgYW5kIHJldHVybnMgdmlhIHN0cgogICAgIGRlZiByZWFkX2pzb25fYmFzZTY0Ci0gICAgICByZWFkX2pzb25fc3RyaW5nLnVucGFjaygibSIpWzBdCisgICAgICBzdHIgPSByZWFkX2pzb25fc3RyaW5nCisgICAgICBtID0gc3RyLmxlbmd0aCAlIDQKKyAgICAgIGlmIG0gIT0gMAorICAgICAgICAjIEFkZCBtaXNzaW5nIHBhZGRpbmcKKyAgICAgICAgKDQgLSBtKS50aW1lcyBkbworICAgICAgICAgIHN0ciArPSAnPScKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIEJhc2U2NC5zdHJpY3RfZGVjb2RlNjQoc3RyKQogICAgIGVuZAogCiAgICAgIyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMsIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBvbmUgdGhhdCBpcyBub3QKQEAgLTc1OSwxMSArNzY4LDE5IEBACiAgICAgZGVmIHJlYWRfYmluYXJ5CiAgICAgICByZWFkX2pzb25fYmFzZTY0CiAgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImpzb24oI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAgIGVuZAogCiAgIGNsYXNzIEpzb25Qcm90b2NvbEZhY3RvcnkgPCBCYXNlUHJvdG9jb2xGYWN0b3J5CiAgICAgZGVmIGdldF9wcm90b2NvbCh0cmFucykKICAgICAgIHJldHVybiBUaHJpZnQ6Okpzb25Qcm90b2NvbC5uZXcodHJhbnMpCiAgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImpzb24iCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL211bHRpcGxleGVkX3Byb3RvY29sLnJiCmluZGV4IDEzYzlkOTMuLmI0NDI4YTcgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL211bHRpcGxleGVkX3Byb3RvY29sLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL211bHRpcGxleGVkX3Byb3RvY29sLnJiCkBAIC0zNiw1ICszNiw5IEBACiAgICAgICAgIEBwcm90b2NvbC53cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKQogICAgICAgZW5kIAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAibXVsdGlwbGV4ZWQoI3tAc2VydmljZV9uYW1lPUBwcm90b2NvbC50b19zfSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIKaW5kZXggMWVlMTIxMy4uYWE0ZDA5YyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL2Jhc2Vfc2VydmVyLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYgpAQCAtMjYsNiArMjYsMTIgQEAKICAgICAgIEBwcm90b2NvbF9mYWN0b3J5ID0gcHJvdG9jb2xfZmFjdG9yeSA/IHByb3RvY29sX2ZhY3RvcnkgOiBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcKICAgICBlbmQKIAotICAgIGRlZiBzZXJ2ZTsgbmlsOyBlbmQKKyAgICBkZWYgc2VydmUKKyAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAic2VydmVyKCN7QHByb3RvY29sX2ZhY3RvcnkudG9fc30oI3tAdHJhbnNwb3J0X2ZhY3RvcnkudG9fc30oI3tAc2VydmVyX3RyYW5zcG9ydC50b19zfSkpKSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9zaW1wbGVfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3NpbXBsZV9zZXJ2ZXIucmIKaW5kZXggMjFlODY1OS4uOTA1ZmU5YiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3NpbXBsZV9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3NpbXBsZV9zZXJ2ZXIucmIKQEAgLTM5LDUgKzM5LDkgQEAKICAgICAgICAgQHNlcnZlcl90cmFuc3BvcnQuY2xvc2UKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAic2ltcGxlKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZF9wb29sX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIKaW5kZXggOGNlYzgwNS4uYmI3NTRhZCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZF9wb29sX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiCkBAIC03MSw1ICs3MSw5IEBACiAgICAgICAgIEBzZXJ2ZXJfdHJhbnNwb3J0LmNsb3NlCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInRocmVhZHBvb2woI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWRfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYgppbmRleCBhMmM5MTdjLi44OGVlMTgzIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWRfc2VydmVyLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIKQEAgLTQzLDUgKzQzLDkgQEAKICAgICAgICAgQHNlcnZlcl90cmFuc3BvcnQuY2xvc2UKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAidGhyZWFkZWQoI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV9zZXJ2ZXJfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYgppbmRleCA2OGM1YWYwLi4wMTA1NDYzIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV9zZXJ2ZXJfdHJhbnNwb3J0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIKQEAgLTM0LDQgKzM0LDQgQEAKICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3RyYW5zcG9ydC5yYgppbmRleCA4NzkwMzI2Li45N2U1OTM1IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiCkBAIC05OSwxMSArOTksMTkgQEAKICAgICBhbGlhc19tZXRob2QgOjw8LCA6d3JpdGUKIAogICAgIGRlZiBmbHVzaDsgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImJhc2UiCisgICAgZW5kCiAgIGVuZAogICAKICAgY2xhc3MgQmFzZVRyYW5zcG9ydEZhY3RvcnkKICAgICBkZWYgZ2V0X3RyYW5zcG9ydCh0cmFucykKICAgICAgIHJldHVybiB0cmFucwogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiYmFzZSIKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZF90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0LnJiCmluZGV4IDc4MWQzYzYuLjRmZTljNDEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZF90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYgpAQCAtMTA0LDExICsxMDQsMTkgQEAKICAgICAgIAogICAgICAgQHRyYW5zcG9ydC5mbHVzaAogICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJidWZmZXJlZCgje0B0cmFuc3BvcnQudG9fc30pIgorICAgIGVuZAogICBlbmQKIAogICBjbGFzcyBCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgPCBCYXNlVHJhbnNwb3J0RmFjdG9yeQogICAgIGRlZiBnZXRfdHJhbnNwb3J0KHRyYW5zcG9ydCkKICAgICAgIHJldHVybiBCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnNwb3J0KQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiYnVmZmVyZWQiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWRfdHJhbnNwb3J0LnJiCmluZGV4IGQ4MDZjZTAuLjk1MzE3NzggMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWRfdHJhbnNwb3J0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWRfdHJhbnNwb3J0LnJiCkBAIC05OSw2ICs5OSwxMCBAQAogICAgICAgQHdidWYgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgogICAgIGVuZAogCisgICAgZGVmIHRvX3MKKyAgICAgICJmcmFtZWQoI3tAdHJhbnNwb3J0LnRvX3N9KSIKKyAgICBlbmQKKwogICAgIHByaXZhdGUKIAogICAgIGRlZiByZWFkX2ZyYW1lCkBAIC0xMTMsNSArMTE3LDkgQEAKICAgICBkZWYgZ2V0X3RyYW5zcG9ydCh0cmFuc3BvcnQpCiAgICAgICByZXR1cm4gRnJhbWVkVHJhbnNwb3J0Lm5ldyh0cmFuc3BvcnQpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJmcmFtZWQiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2h0dHBfY2xpZW50X3RyYW5zcG9ydC5yYgppbmRleCA3N2ZmZTM1Li41YzFkZDVjIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIKQEAgLTUwLDcgKzUwLDEyIEBACiAgICAgICBkYXRhID0gcmVzcC5ib2R5CiAgICAgICBkYXRhID0gQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGRhdGEpCiAgICAgICBAaW5idWYgPSBTdHJpbmdJTy5uZXcgZGF0YQorICAgIGVuc3VyZQogICAgICAgQG91dGJ1ZiA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJAe3NlbGYudXJsfSIKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9pb19zdHJlYW1fdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2lvX3N0cmVhbV90cmFuc3BvcnQucmIKaW5kZXggZTNjODM3OS4uY2NlYzY4ZiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2lvX3N0cmVhbV90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2lvX3N0cmVhbV90cmFuc3BvcnQucmIKQEAgLTM1LDUgKzM1LDggQEAKICAgICBkZWYgd3JpdGUoYnVmKTsgQG91dHB1dC53cml0ZShCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmKSkgZW5kCiAgICAgZGVmIGNsb3NlOyBAaW5wdXQuY2xvc2U7IEBvdXRwdXQuY2xvc2UgZW5kCiAgICAgZGVmIHRvX2lvOyBAaW5wdXQgZW5kICMgd2UncmUgYXNzdW1pbmcgdGhpcyBpcyB1c2VkIGluIGEgSU8uc2VsZWN0IGZvciByZWFkaW5nCisgICAgZGVmIHRvX3MKKyAgICAgICJpb3N0cmVhbShpbnB1dD0je0BpbnB1dC50b19zfSxvdXRwdXQ9I3tAb3V0cHV0LnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYgppbmRleCBhZDVhZDg1Li40NjllYTczIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvbWVtb3J5X2J1ZmZlcl90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiCkBAIC0xMjEsNSArMTIxLDkgQEAKICAgICAgIGVuZAogICAgICAgb3V0LmpvaW4oIiAiKQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAibWVtb3J5IgorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NlcnZlcl9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYgppbmRleCA3ZmViOWFiLi41MDAwMjMyIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYgpAQCAtNTksNSArNTksMTAgQEAKICAgICBlbmQKIAogICAgIGFsaWFzIHRvX2lvIGhhbmRsZQorCisgICAgZGVmIHRvX3MKKyAgICAgICJzb2NrZXQoI3tAaG9zdH06I3tAcG9ydH0pIgorICAgIGVuZAorCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5yYgppbmRleCAyYjdjYTA5Li5mNWU2ZjNiIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIKQEAgLTMzLDI2ICszMywyOCBAQAogICAgIGF0dHJfYWNjZXNzb3IgOmhhbmRsZSwgOnRpbWVvdXQKIAogICAgIGRlZiBvcGVuCi0gICAgICBiZWdpbgotICAgICAgICBhZGRyaW5mbyA9IDo6U29ja2V0OjpnZXRhZGRyaW5mbyhAaG9zdCwgQHBvcnQsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKS5maXJzdAotICAgICAgICBAaGFuZGxlID0gOjpTb2NrZXQubmV3KGFkZHJpbmZvWzRdLCA6OlNvY2tldDo6U09DS19TVFJFQU0sIDApCi0gICAgICAgIEBoYW5kbGUuc2V0c29ja29wdCg6OlNvY2tldDo6SVBQUk9UT19UQ1AsIDo6U29ja2V0OjpUQ1BfTk9ERUxBWSwgMSkKLSAgICAgICAgc29ja2FkZHIgPSA6OlNvY2tldC5zb2NrYWRkcl9pbihhZGRyaW5mb1sxXSwgYWRkcmluZm9bM10pCisgICAgICBmb3IgYWRkcmluZm8gaW4gOjpTb2NrZXQ6OmdldGFkZHJpbmZvKEBob3N0LCBAcG9ydCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pIGRvCiAgICAgICAgIGJlZ2luCi0gICAgICAgICAgQGhhbmRsZS5jb25uZWN0X25vbmJsb2NrKHNvY2thZGRyKQotICAgICAgICByZXNjdWUgRXJybm86OkVJTlBST0dSRVNTCi0gICAgICAgICAgdW5sZXNzIElPLnNlbGVjdChuaWwsIFsgQGhhbmRsZSBdLCBuaWwsIEB0aW1lb3V0KQotICAgICAgICAgICAgcmFpc2UgVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ29ubmVjdGlvbiB0aW1lb3V0IHRvICN7QGRlc2N9IikKLSAgICAgICAgICBlbmQKKyAgICAgICAgICBzb2NrZXQgPSA6OlNvY2tldC5uZXcoYWRkcmluZm9bNF0sIDo6U29ja2V0OjpTT0NLX1NUUkVBTSwgMCkKKyAgICAgICAgICBzb2NrZXQuc2V0c29ja29wdCg6OlNvY2tldDo6SVBQUk9UT19UQ1AsIDo6U29ja2V0OjpUQ1BfTk9ERUxBWSwgMSkKKyAgICAgICAgICBzb2NrYWRkciA9IDo6U29ja2V0LnNvY2thZGRyX2luKGFkZHJpbmZvWzFdLCBhZGRyaW5mb1szXSkKICAgICAgICAgICBiZWdpbgotICAgICAgICAgICAgQGhhbmRsZS5jb25uZWN0X25vbmJsb2NrKHNvY2thZGRyKQotICAgICAgICAgIHJlc2N1ZSBFcnJubzo6RUlTQ09OTgorICAgICAgICAgICAgc29ja2V0LmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCisgICAgICAgICAgcmVzY3VlIEVycm5vOjpFSU5QUk9HUkVTUworICAgICAgICAgICAgdW5sZXNzIElPLnNlbGVjdChuaWwsIFsgc29ja2V0IF0sIG5pbCwgQHRpbWVvdXQpCisgICAgICAgICAgICAgIG5leHQKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgYmVnaW4KKyAgICAgICAgICAgICAgc29ja2V0LmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCisgICAgICAgICAgICByZXNjdWUgRXJybm86OkVJU0NPTk4KKyAgICAgICAgICAgIGVuZAogICAgICAgICAgIGVuZAorICAgICAgICAgIHJldHVybiBAaGFuZGxlID0gc29ja2V0CisgICAgICAgIHJlc2N1ZSBTdGFuZGFyZEVycm9yID0+IGUKKyAgICAgICAgICBuZXh0CiAgICAgICAgIGVuZAotICAgICAgICBAaGFuZGxlCi0gICAgICByZXNjdWUgU3RhbmRhcmRFcnJvciA9PiBlCi0gICAgICAgIHJhaXNlIFRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBjb25uZWN0IHRvICN7QGRlc2N9OiAje2V9IikKICAgICAgIGVuZAorICAgICAgcmFpc2UgVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gI3tAZGVzY306ICN7ZX0iKQogICAgIGVuZAogCiAgICAgZGVmIG9wZW4/CkBAIC0xMzIsOCArMTM0LDEwIEBACiAgICAgICBAaGFuZGxlID0gbmlsCiAgICAgZW5kCiAKLSAgICBkZWYgdG9faW8KLSAgICAgIEBoYW5kbGUKKyAgICBhbGlhcyB0b19pbyBoYW5kbGUKKworICAgIGRlZiB0b19zCisgICAgICAic29ja2V0KCN7QGhvc3R9OiN7QHBvcnR9KSIKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc2VydmVyX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc2VydmVyX3NvY2tldC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWJkNWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zZXJ2ZXJfc29ja2V0LnJiCkBAIC0wLDAgKzEsNDEgQEAKKyMgZW5jb2Rpbmc6IGFzY2lpLThiaXQKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlICdzb2NrZXQnCisKK21vZHVsZSBUaHJpZnQKKyAgY2xhc3MgU1NMU2VydmVyU29ja2V0IDwgU2VydmVyU29ja2V0CisgICAgZGVmIGluaXRpYWxpemUoaG9zdF9vcl9wb3J0LCBwb3J0ID0gbmlsLCBzc2xfY29udGV4dCA9IG5pbCkKKyAgICAgIHN1cGVyKGhvc3Rfb3JfcG9ydCwgcG9ydCkKKyAgICAgIEBzc2xfY29udGV4dCA9IHNzbF9jb250ZXh0CisgICAgZW5kCisKKyAgICBhdHRyX2FjY2Vzc29yIDpzc2xfY29udGV4dAorCisgICAgZGVmIGxpc3RlbgorICAgICAgc29ja2V0ID0gVENQU2VydmVyLm5ldyhAaG9zdCwgQHBvcnQpCisgICAgICBAaGFuZGxlID0gT3BlblNTTDo6U1NMOjpTU0xTZXJ2ZXIubmV3KHNvY2tldCwgQHNzbF9jb250ZXh0KQorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAic3NsKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWI5NmFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zb2NrZXQucmIKQEAgLTAsMCArMSw1MSBAQAorIyBlbmNvZGluZzogYXNjaWktOGJpdAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK21vZHVsZSBUaHJpZnQKKyAgY2xhc3MgU1NMU29ja2V0IDwgU29ja2V0CisgICAgZGVmIGluaXRpYWxpemUoaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB0aW1lb3V0PW5pbCwgc3NsX2NvbnRleHQ9bmlsKQorICAgICAgc3VwZXIoaG9zdCwgcG9ydCwgdGltZW91dCkKKyAgICAgIEBzc2xfY29udGV4dCA9IHNzbF9jb250ZXh0CisgICAgZW5kCisKKyAgICBhdHRyX2FjY2Vzc29yIDpzc2xfY29udGV4dAorCisgICAgZGVmIG9wZW4KKyAgICAgIHNvY2tldCA9IHN1cGVyCisgICAgICBAaGFuZGxlID0gT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQubmV3KHNvY2tldCwgQHNzbF9jb250ZXh0KQorICAgICAgYmVnaW4KKyAgICAgICAgQGhhbmRsZS5jb25uZWN0X25vbmJsb2NrCisgICAgICAgIEBoYW5kbGUucG9zdF9jb25uZWN0aW9uX2NoZWNrKEBob3N0KQorICAgICAgICBAaGFuZGxlCisgICAgICByZXNjdWUgSU86OldhaXRSZWFkYWJsZQorICAgICAgICBJTy5zZWxlY3QoWyBAaGFuZGxlIF0sIG5pbCwgbmlsLCBAdGltZW91dCkKKyAgICAgICAgcmV0cnkKKyAgICAgIHJlc2N1ZSBJTzo6V2FpdFdyaXRhYmxlCisgICAgICAgIElPLnNlbGVjdChuaWwsIFsgQGhhbmRsZSBdLCBuaWwsIEB0aW1lb3V0KQorICAgICAgICByZXRyeQorICAgICAgcmVzY3VlIFN0YW5kYXJkRXJyb3IgPT4gZQorICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgY29ubmVjdCB0byAje0BkZXNjfTogI3tlfSIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInNzbCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zZXJ2ZXJfc29ja2V0LnJiCmluZGV4IGExMzVkMjUuLjA1N2QxMjIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYgpAQCAtNTYsNSArNTYsOSBAQAogICAgIGVuZAogCiAgICAgYWxpYXMgdG9faW8gaGFuZGxlCisKKyAgICBkZWYgdG9fcworICAgICAgImRvbWFpbigje0BwYXRofSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIKaW5kZXggOGY2OTJlNC4uNWRmZmQ1OSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NvY2tldC5yYgpAQCAtMzYsNSArMzYsOSBAQAogICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgb3BlbiBVTklYIHNvY2tldCBhdCAje0BwYXRofSIpCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImRvbWFpbigje0BwYXRofSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIgYi9saWIvcmIvc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIKaW5kZXggZWM1MGM0OC4uY2ZhNzU3MyAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmFzZV9wcm90b2NvbF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2Jhc2VfcHJvdG9jb2xfc3BlYy5yYgpAQCAtMjIsNDEgKzIyLDQ2IEBACiBkZXNjcmliZSAnQmFzZVByb3RvY29sJyBkbwogCiAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICBAdHJhbnMgPSBtb2NrKCJNb2NrVHJhbnNwb3J0IikKKyAgICBAdHJhbnMgPSBkb3VibGUoIk1vY2tUcmFuc3BvcnQiKQogICAgIEBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KEB0cmFucykKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlUHJvdG9jb2wgZG8KICAgICAjIG1vc3Qgb2YgdGhlIG1ldGhvZHMgYXJlIHN0dWJzLCBzbyB3ZSBjYW4gaWdub3JlIHRoZW0KIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90LnRvX3MpLnRvIGVxKCJ0cmFucyIpCisgICAgZW5kCisKICAgICBpdCAic2hvdWxkIG1ha2UgdHJhbnMgYWNjZXNzaWJsZSIgZG8KLSAgICAgIEBwcm90LnRyYW5zLnNob3VsZCBlcWwoQHRyYW5zKQorICAgICAgZXhwZWN0KEBwcm90LnRyYW5zKS50byBlcWwoQHRyYW5zKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgYSBmaWVsZCBuaWNlbHkgKGRlcHJlY2F0ZWQgd3JpdGVfZmllbGQgc2lnbmF0dXJlKScgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZmllbGQnLCAndHlwZScsICdmaWQnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfdHlwZSkud2l0aCh7Om5hbWUgPT4gJ2ZpZWxkJywgOnR5cGUgPT4gJ3R5cGUnfSwgJ3ZhbHVlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZmllbGQnLCAndHlwZScsICdmaWQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3R5cGUpLndpdGgoezpuYW1lID0+ICdmaWVsZCcsIDp0eXBlID0+ICd0eXBlJ30sICd2YWx1ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCiAgICAgICBAcHJvdC53cml0ZV9maWVsZCgnZmllbGQnLCAndHlwZScsICdmaWQnLCAndmFsdWUnKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgYSBmaWVsZCBuaWNlbHknIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ZpZWxkJywgJ3R5cGUnLCAnZmlkJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3R5cGUpLndpdGgoezpuYW1lID0+ICdmaWVsZCcsIDp0eXBlID0+ICd0eXBlJywgOmJpbmFyeSA9PiBmYWxzZX0sICd2YWx1ZScpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ZpZWxkJywgJ3R5cGUnLCAnZmlkJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV90eXBlKS53aXRoKHs6bmFtZSA9PiAnZmllbGQnLCA6dHlwZSA9PiAndHlwZScsIDpiaW5hcnkgPT4gZmFsc2V9LCAndmFsdWUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAogICAgICAgQHByb3Qud3JpdGVfZmllbGQoezpuYW1lID0+ICdmaWVsZCcsIDp0eXBlID0+ICd0eXBlJywgOmJpbmFyeSA9PiBmYWxzZX0sICdmaWQnLCAndmFsdWUnKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgdGhlIGRpZmZlcmVudCB0eXBlcyAoZGVwcmVjYXRlZCB3cml0ZV90eXBlIHNpZ25hdHVyZSknIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgnZG91YmxlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2k2NCkud2l0aCgnaTY0Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAotICAgICAgc3RydWN0ID0gbW9jaygnU3RydWN0JykKLSAgICAgIHN0cnVjdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYnl0ZSkud2l0aCgnYnl0ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKCdkb3VibGUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoJ2kzMicpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTY0KS53aXRoKCdpNjQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAorICAgICAgc3RydWN0ID0gZG91YmxlKCdTdHJ1Y3QnKQorICAgICAgZXhwZWN0KHN0cnVjdCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKICAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6Qk9PTCwgJ2Jvb2wnKQogICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpCWVRFLCAnYnl0ZScpCiAgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgJ2RvdWJsZScpCkBAIC03MiwxNiArNzcsMTYgQEAKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgd3JpdGUgb3V0IHRoZSBkaWZmZXJlbnQgdHlwZXMnIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgnZG91YmxlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2k2NCkud2l0aCgnaTY0Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2JpbmFyeSkud2l0aCgnYmluYXJ5Jykub3JkZXJlZAotICAgICAgc3RydWN0ID0gbW9jaygnU3RydWN0JykKLSAgICAgIHN0cnVjdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYnl0ZSkud2l0aCgnYnl0ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKCdkb3VibGUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoJ2kzMicpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTY0KS53aXRoKCdpNjQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9iaW5hcnkpLndpdGgoJ2JpbmFyeScpLm9yZGVyZWQKKyAgICAgIHN0cnVjdCA9IGRvdWJsZSgnU3RydWN0JykKKyAgICAgIGV4cGVjdChzdHJ1Y3QpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCiAgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgJ2Jvb2wnKQogICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICdieXRlJykKICAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sICdkb3VibGUnKQpAQCAtOTgsMTMgKzEwMywxMyBAQAogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCByZWFkIHRoZSBkaWZmZXJlbnQgdHlwZXMgKGRlcHJlY2F0ZWQgcmVhZF90eXBlIHNpZ25hdHVyZSknIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCiAgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6Qk9PTCkKICAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpCWVRFKQogICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OkkxNikKQEAgLTEyMCwxNCArMTI1LDE0IEBACiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHJlYWQgdGhlIGRpZmZlcmVudCB0eXBlcycgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9iaW5hcnkpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2JpbmFyeSkub3JkZXJlZAogICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSkKICAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0pCiAgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkxNn0pCkBAIC0xNDQsMTMgKzE0OSwxMyBAQAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIHRoZSBiYXNpYyB0eXBlcyIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKICAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6Qk9PTCkKICAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6QllURSkKICAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6STE2KQpAQCAtMTU4LDUyICsxNjMsNTEgQEAKICAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6STY0KQogICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpET1VCTEUpCiAgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OlNUUklORykKLSAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6U1RPUCkgIyBzaG91bGQgZG8gYWJzb2x1dGVseSBub3RoaW5nCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgc3RydWN0cyIgZG8KICAgICAgIHJlYWxfc2tpcCA9IEBwcm90Lm1ldGhvZCg6c2tpcCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoNCkudGltZXMuYW5kX3JldHVybigKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSg0KS50aW1lcy5hbmRfcmV0dXJuKAogICAgICAgICBbJ2ZpZWxkIDEnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAogICAgICAgICBbJ2ZpZWxkIDInLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDJdLAogICAgICAgICBbJ2ZpZWxkIDMnLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDNdLAogICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQogICAgICAgKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxXSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdKQogICAgICAgIyBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmV4YWN0bHkoMikudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9lbmQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAogICAgICAgcmVhbF9za2lwLmNhbGwoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIG1hcHMiIGRvCiAgICAgICByZWFsX3NraXAgPSBAcHJvdC5tZXRob2QoOnNraXApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDFdKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbInNvbWVfc3RydWN0Il0pCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIG5pbF0pOwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMV0pCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oWyJzb21lX3N0cnVjdCJdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgbmlsXSk7CisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9lbmQpLm9yZGVyZWQKICAgICAgIHJlYWxfc2tpcC5jYWxsKFRocmlmdDo6VHlwZXM6Ok1BUCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBzZXRzIiBkbwogICAgICAgcmVhbF9za2lwID0gQHByb3QubWV0aG9kKDpza2lwKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6Okk2NCwgOV0pCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQuZXhhY3RseSg5KS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2VuZCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zZXRfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STY0LCA5XSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQuZXhhY3RseSg5KS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3NldF9lbmQpCiAgICAgICByZWFsX3NraXAuY2FsbChUaHJpZnQ6OlR5cGVzOjpTRVQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgbGlzdHMiIGRvCiAgICAgICByZWFsX3NraXAgPSBAcHJvdC5tZXRob2QoOnNraXApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgMTFdKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkLmV4YWN0bHkoMTEpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2VuZCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgMTFdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZC5leGFjdGx5KDExKS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2xpc3RfZW5kKQogICAgICAgcmVhbF9za2lwLmNhbGwoVGhyaWZ0OjpUeXBlczo6TElTVCkKICAgICBlbmQKICAgZW5kCkBAIC0yMTEsNyArMjE1LDExIEBACiAgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVByb3RvY29sRmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciIgZG8KICAgICAgICMgcmV0dXJuaW5nIG5pbCBzaW5jZSBQcm90b2NvbCBpcyBqdXN0IGFuIGFic3RyYWN0IGNsYXNzCi0gICAgICBsYW1iZGEge1RocmlmdDo6QmFzZVByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKG1vY2soIk1vY2tUcmFuc3BvcnQiKSl9LnNob3VsZCByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgICAgZXhwZWN0IHtUaHJpZnQ6OkJhc2VQcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChkb3VibGUoIk1vY2tUcmFuc3BvcnQiKSl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlUHJvdG9jb2xGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYmFzZSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9iYXNlX3RyYW5zcG9ydF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvYmFzZV90cmFuc3BvcnRfc3BlYy5yYgppbmRleCA0MTk2NTcyLi5kMmY2MGFhIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iYXNlX3RyYW5zcG9ydF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIKQEAgLTI0LDEwNSArMjQsMTE5IEBACiAgIGRlc2NyaWJlIFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uIGRvCiAgICAgaXQgInNob3VsZCBtYWtlIHR5cGUgYWNjZXNzaWJsZSIgZG8KICAgICAgIGV4YyA9IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOLCAibXNnIikKLSAgICAgIGV4Yy50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOCi0gICAgICBleGMubWVzc2FnZS5zaG91bGQgPT0gIm1zZyIKKyAgICAgIGV4cGVjdChleGMudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTikKKyAgICAgIGV4cGVjdChleGMubWVzc2FnZSkudG8gZXEoIm1zZyIpCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVRyYW5zcG9ydCBkbwogICAgIGl0ICJzaG91bGQgcmVhZCB0aGUgc3BlY2lmaWVkIHNpemUiIGRvCiAgICAgICB0cmFuc3BvcnQgPSBUaHJpZnQ6OkJhc2VUcmFuc3BvcnQubmV3Ci0gICAgICB0cmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoNDApLm9yZGVyZWQuYW5kX3JldHVybigiMTAgbGV0dGVycyIpCi0gICAgICB0cmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMzApLm9yZGVyZWQuYW5kX3JldHVybigiZmlmdGVlbiBsZXR0ZXJzIikKLSAgICAgIHRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCgxNSkub3JkZXJlZC5hbmRfcmV0dXJuKCJtb3JlIGNoYXJhY3RlcnMiKQotICAgICAgdHJhbnNwb3J0LnJlYWRfYWxsKDQwKS5zaG91bGQgPT0gIjEwIGxldHRlcnNmaWZ0ZWVuIGxldHRlcnNtb3JlIGNoYXJhY3RlcnMiCisgICAgICBleHBlY3QodHJhbnNwb3J0KS50byByZWNlaXZlKDpyZWFkKS53aXRoKDQwKS5vcmRlcmVkLmFuZF9yZXR1cm4oIjEwIGxldHRlcnMiKQorICAgICAgZXhwZWN0KHRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCgzMCkub3JkZXJlZC5hbmRfcmV0dXJuKCJmaWZ0ZWVuIGxldHRlcnMiKQorICAgICAgZXhwZWN0KHRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCgxNSkub3JkZXJlZC5hbmRfcmV0dXJuKCJtb3JlIGNoYXJhY3RlcnMiKQorICAgICAgZXhwZWN0KHRyYW5zcG9ydC5yZWFkX2FsbCg0MCkpLnRvIGVxKCIxMCBsZXR0ZXJzZmlmdGVlbiBsZXR0ZXJzbW9yZSBjaGFyYWN0ZXJzIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3R1YiBvdXQgdGhlIHJlc3Qgb2YgdGhlIG1ldGhvZHMiIGRvCiAgICAgICAjIGNhbid0IHRlc3QgZm9yIHN0dWJiaW5lc3MsIHNvIGp1c3QgbWFrZSBzdXJlIHRoZXkncmUgZGVmaW5lZAogICAgICAgWzpvcGVuPywgOm9wZW4sIDpjbG9zZSwgOnJlYWQsIDp3cml0ZSwgOmZsdXNoXS5lYWNoIGRvIHxzeW18Ci0gICAgICAgIFRocmlmdDo6QmFzZVRyYW5zcG9ydC5tZXRob2RfZGVmaW5lZD8oc3ltKS5zaG91bGQgYmVfdHJ1ZQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lm1ldGhvZF9kZWZpbmVkPyhzeW0pKS50byBiZV90cnV0aHkKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhbGlhcyA8PCB0byB3cml0ZSIgZG8KLSAgICAgIFRocmlmdDo6QmFzZVRyYW5zcG9ydC5pbnN0YW5jZV9tZXRob2QoOjw8KS5zaG91bGQgPT0gVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lmluc3RhbmNlX21ldGhvZCg6d3JpdGUpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lmluc3RhbmNlX21ldGhvZCg6PDwpKS50byBlcShUaHJpZnQ6OkJhc2VUcmFuc3BvcnQuaW5zdGFuY2VfbWV0aG9kKDp3cml0ZSkpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydC5uZXcudG9fcykudG8gZXEoImJhc2UiKQogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VTZXJ2ZXJUcmFuc3BvcnQgZG8KICAgICBpdCAic2hvdWxkIHN0dWIgb3V0IGl0cyBtZXRob2RzIiBkbwogICAgICAgWzpsaXN0ZW4sIDphY2NlcHQsIDpjbG9zZV0uZWFjaCBkbyB8c3ltfAotICAgICAgICBUaHJpZnQ6OkJhc2VTZXJ2ZXJUcmFuc3BvcnQubWV0aG9kX2RlZmluZWQ/KHN5bSkuc2hvdWxkIGJlX3RydWUKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVNlcnZlclRyYW5zcG9ydC5tZXRob2RfZGVmaW5lZD8oc3ltKSkudG8gYmVfdHJ1dGh5CiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgcmV0dXJuIHRoZSB0cmFuc3BvcnQgaXQncyBnaXZlbiIgZG8KLSAgICAgIHRyYW5zcG9ydCA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICBUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zcG9ydCkuc2hvdWxkIGVxbCh0cmFuc3BvcnQpCisgICAgICB0cmFuc3BvcnQgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFuc3BvcnQpKS50byBlcWwodHJhbnNwb3J0KQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYmFzZSIpCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQgZG8KKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSB0b19zIHRoYXQgZGVzY3JpYmVzIHRoZSBlbmNhcHN1bGF0aW9uIiBkbworICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLmFuZF9yZXR1cm4oIm1vY2siKQorICAgICAgZXhwZWN0KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKS50b19zKS50byBlcSgiYnVmZmVyZWQobW9jaykiKQorICAgIGVuZAorCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggZXZlcnl0aGluZyBidXQgd3JpdGUvZmx1c2gvcmVhZCIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpvcGVuPykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4/IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpvcGVuKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3BlbiIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQgIyBmcm9tIHRoZSBjbG9zZQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgY2xvc2UiKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpvcGVuKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3BlbiIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkICMgZnJvbSB0aGUgY2xvc2UKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQuYW5kX3JldHVybigiKyBjbG9zZSIpCiAgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKLSAgICAgIGJ0cmFucy5vcGVuPy5zaG91bGQgPT0gIisgb3Blbj8iCi0gICAgICBidHJhbnMub3Blbi5zaG91bGQgPT0gIisgb3BlbiIKLSAgICAgIGJ0cmFucy5jbG9zZS5zaG91bGQgPT0gIisgY2xvc2UiCisgICAgICBleHBlY3QoYnRyYW5zLm9wZW4/KS50byBlcSgiKyBvcGVuPyIpCisgICAgICBleHBlY3QoYnRyYW5zLm9wZW4pLnRvIGVxKCIrIG9wZW4iKQorICAgICAgZXhwZWN0KGJ0cmFucy5jbG9zZSkudG8gZXEoIisgY2xvc2UiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBidWZmZXIgcmVhZHMgaW4gY2h1bmtzIG9mICN7VGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDo6REVGQVVMVF9CVUZGRVJ9IiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDo6REVGQVVMVF9CVUZGRVIpLmFuZF9yZXR1cm4oImxvcnVtIGlwc3VtIGRvbG9yIGVtZXQiKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDo6REVGQVVMVF9CVUZGRVIpLmFuZF9yZXR1cm4oImxvcnVtIGlwc3VtIGRvbG9yIGVtZXQiKQogICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCi0gICAgICBidHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImxvcnVtICIKLSAgICAgIGJ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAiaXBzdW0gIgotICAgICAgYnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJkb2xvciAiCi0gICAgICBidHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImVtZXQiCisgICAgICBleHBlY3QoYnRyYW5zLnJlYWQoNikpLnRvIGVxKCJsb3J1bSAiKQorICAgICAgZXhwZWN0KGJ0cmFucy5yZWFkKDYpKS50byBlcSgiaXBzdW0gIikKKyAgICAgIGV4cGVjdChidHJhbnMucmVhZCg2KSkudG8gZXEoImRvbG9yICIpCisgICAgICBleHBlY3QoYnRyYW5zLnJlYWQoNikpLnRvIGVxKCJlbWV0IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYnVmZmVyIHdyaXRlcyBhbmQgc2VuZCB0aGVtIG9uIGZsdXNoIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCiAgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKICAgICAgIGJ0cmFucy53cml0ZSgib25lLyIpCiAgICAgICBidHJhbnMud3JpdGUoInR3by8iKQogICAgICAgYnRyYW5zLndyaXRlKCJ0aHJlZS8iKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJvbmUvdHdvL3RocmVlLyIpLm9yZGVyZWQKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZAorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgib25lL3R3by90aHJlZS8iKS5vcmRlcmVkCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCiAgICAgICBidHJhbnMuZmx1c2gKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb25seSBzZW5kIGJ1ZmZlcmVkIGRhdGEgb25jZSIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQogICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCiAgICAgICBidHJhbnMud3JpdGUoIm9uZS8iKQogICAgICAgYnRyYW5zLndyaXRlKCJ0d28vIikKICAgICAgIGJ0cmFucy53cml0ZSgidGhyZWUvIikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgib25lL3R3by90aHJlZS8iKQotICAgICAgdHJhbnMuc3R1YiEoOmZsdXNoKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgib25lL3R3by90aHJlZS8iKQorICAgICAgYWxsb3codHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgYnRyYW5zLmZsdXNoCiAgICAgICAjIE5vdGhpbmcgdG8gZmx1c2ggd2l0aCBubyBkYXRhCiAgICAgICBidHJhbnMuZmx1c2gKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZmx1c2ggb24gY2xvc2UiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpCiAgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKLSAgICAgIGJ0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpCisgICAgICBleHBlY3QoYnRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgIGJ0cmFucy5jbG9zZQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3Qgd3JpdGUgdG8gc29ja2V0IGlmIHRoZXJlJ3Mgbm8gZGF0YSIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQogICAgICAgYnRyYW5zLmZsdXNoCiAgICAgZW5kCkBAIC0xMzAsODAgKzE0NCw5MCBAQAogCiAgIGRlc2NyaWJlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCB3cmFwIHRoZSBnaXZlbiB0cmFuc3BvcnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIGJ0cmFucyA9IG1vY2soIkJ1ZmZlcmVkVHJhbnNwb3J0IikKLSAgICAgIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCh0cmFucykuYW5kX3JldHVybihidHJhbnMpCi0gICAgICBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFucykuc2hvdWxkID09IGJ0cmFucworICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBidHJhbnMgPSBkb3VibGUoIkJ1ZmZlcmVkVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0KS50byByZWNlaXZlKDpuZXcpLndpdGgodHJhbnMpLmFuZF9yZXR1cm4oYnRyYW5zKQorICAgICAgZXhwZWN0KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zKSkudG8gZXEoYnRyYW5zKQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcudG9fcykudG8gZXEoImJ1ZmZlcmVkIikKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgdG9fcyB0aGF0IGRlc2NyaWJlcyB0aGUgZW5jYXBzdWxhdGlvbiIgZG8KKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5hbmRfcmV0dXJuKCJtb2NrIikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcodHJhbnMpLnRvX3MpLnRvIGVxKCJmcmFtZWQobW9jaykiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggb3Blbj8vb3Blbi9jbG9zZSIgZG8KICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpvcGVuKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3BlbiIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgY2xvc2UiKQotICAgICAgZnRyYW5zLm9wZW4/LnNob3VsZCA9PSAiKyBvcGVuPyIKLSAgICAgIGZ0cmFucy5vcGVuLnNob3VsZCA9PSAiKyBvcGVuIgotICAgICAgZnRyYW5zLmNsb3NlLnNob3VsZCA9PSAiKyBjbG9zZSIKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6b3Blbikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4iKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQuYW5kX3JldHVybigiKyBjbG9zZSIpCisgICAgICBleHBlY3QoZnRyYW5zLm9wZW4/KS50byBlcSgiKyBvcGVuPyIpCisgICAgICBleHBlY3QoZnRyYW5zLm9wZW4pLnRvIGVxKCIrIG9wZW4iKQorICAgICAgZXhwZWN0KGZ0cmFucy5jbG9zZSkudG8gZXEoIisgY2xvc2UiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggcmVhZCB3aGVuIHJlYWQgaXMgdHVybmVkIG9mZiIgZG8KICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMsIGZhbHNlLCB0cnVlKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDE3KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgcmVhZCIpCi0gICAgICBmdHJhbnMucmVhZCgxNykuc2hvdWxkID09ICIrIHJlYWQiCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkKS53aXRoKDE3KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgcmVhZCIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoMTcpKS50byBlcSgiKyByZWFkIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIHdyaXRlL2ZsdXNoIHdoZW4gd3JpdGUgaXMgdHVybmVkIG9mZiIgZG8KICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vIikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIHdyaXRlIikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQuYW5kX3JldHVybigiKyBmbHVzaCIpCi0gICAgICBmdHJhbnMud3JpdGUoImZvbyIpLnNob3VsZCA9PSAiKyB3cml0ZSIKLSAgICAgIGZ0cmFucy5mbHVzaC5zaG91bGQgPT0gIisgZmx1c2giCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vIikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIHdyaXRlIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgZmx1c2giKQorICAgICAgZXhwZWN0KGZ0cmFucy53cml0ZSgiZm9vIikpLnRvIGVxKCIrIHdyaXRlIikKKyAgICAgIGV4cGVjdChmdHJhbnMuZmx1c2gpLnRvIGVxKCIrIGZsdXNoIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIGEgZnVsbCBmcmFtZSBpZiBhc2tlZCBmb3IgPj0gdGhlIGZyYW1lJ3MgbGVuZ3RoIiBkbwogICAgICAgZnJhbWUgPSAidGhpcyBpcyBhIGZyYW1lIgotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQotICAgICAgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykucmVhZChmcmFtZS5sZW5ndGggKyAxMCkuc2hvdWxkID09IGZyYW1lCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKGZyYW1lLmxlbmd0aCArIDEwKSkudG8gZXEoZnJhbWUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBzbGljZXMgb2YgdGhlIGZyYW1lIHdoZW4gYXNrZWQgZm9yIDwgdGhlIGZyYW1lJ3MgbGVuZ3RoIiBkbwogICAgICAgZnJhbWUgPSAidGhpcyBpcyBhIGZyYW1lIgotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgZnRyYW5zLnJlYWQoNCkuc2hvdWxkID09ICJ0aGlzIgotICAgICAgZnRyYW5zLnJlYWQoNCkuc2hvdWxkID09ICIgaXMgIgotICAgICAgZnRyYW5zLnJlYWQoMTYpLnNob3VsZCA9PSAiYSBmcmFtZSIKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg0KSkudG8gZXEoInRoaXMiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDQpKS50byBlcSgiIGlzICIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoMTYpKS50byBlcSgiYSBmcmFtZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBub3RoaW5nIGlmIGFza2VkIGZvciA8PSAwIiBkbwotICAgICAgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykucmVhZCgtMikuc2hvdWxkID09ICIiCisgICAgICBleHBlY3QoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykucmVhZCgtMikpLnRvIGVxKCIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwdWxsIGEgbmV3IGZyYW1lIHdoZW4gdGhlIGZpcnN0IGlzIGV4aGF1c3RlZCIgZG8KICAgICAgIGZyYW1lID0gInRoaXMgaXMgYSBmcmFtZSIKICAgICAgIGZyYW1lMiA9ICJ5ZXQgYW5vdGhlciBmcmFtZSIKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIsICJcMDAwXDAwMFwwMDBcMDIxIikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZTIubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lMikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciLCAiXDAwMFwwMDBcMDAwXDAyMSIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZTIubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lMikKICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gInRoaXMiCi0gICAgICBmdHJhbnMucmVhZCg4KS5zaG91bGQgPT0gIiBpcyBhIGZyIgotICAgICAgZnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJhbWUiCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gInlldCAiCi0gICAgICBmdHJhbnMucmVhZCgxNikuc2hvdWxkID09ICJhbm90aGVyIGZyYW1lIgorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDQpKS50byBlcSgidGhpcyIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoOCkpLnRvIGVxKCIgaXMgYSBmciIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNikpLnRvIGVxKCJhbWUiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDQpKS50byBlcSgieWV0ICIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoMTYpKS50byBlcSgiYW5vdGhlciBmcmFtZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJ1ZmZlciB3cml0ZXMiIGRvCiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgQHRyYW5zLnNob3VsZF9ub3RfcmVjZWl2ZSg6d3JpdGUpCisgICAgICBleHBlY3QoQHRyYW5zKS5ub3RfdG8gcmVjZWl2ZSg6d3JpdGUpCiAgICAgICBmdHJhbnMud3JpdGUoImZvbyIpCiAgICAgICBmdHJhbnMud3JpdGUoImJhciIpCiAgICAgICBmdHJhbnMud3JpdGUoInRoaXMgaXMgYSBmcmFtZSIpCkBAIC0yMTMsMTUgKzIzNywxNSBAQAogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKICAgICAgIGZ0cmFucy53cml0ZSgiZm9vYmFyIiwgMykKICAgICAgIGZ0cmFucy53cml0ZSgiYmFyZm9vIiwgMSkKLSAgICAgIEB0cmFucy5zdHViISg6Zmx1c2gpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDA0Zm9vYiIpCisgICAgICBhbGxvdyhAdHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDRmb29iIikKICAgICAgIGZ0cmFucy5mbHVzaAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBmbHVzaCBmcmFtZXMgd2l0aCBhIDQtYnl0ZSBoZWFkZXIiIGRvCiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAzNW9uZS90d28vdGhyZWUvdGhpcyBpcyBhIGZyYW1lIikub3JkZXJlZAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZAorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMzVvbmUvdHdvL3RocmVlL3RoaXMgaXMgYSBmcmFtZSIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCiAgICAgICBmdHJhbnMud3JpdGUoIm9uZS8iKQogICAgICAgZnRyYW5zLndyaXRlKCJ0d28vIikKICAgICAgIGZ0cmFucy53cml0ZSgidGhyZWUvIikKQEAgLTIzMSwyMiArMjU1LDI2IEBACiAKICAgICBpdCAic2hvdWxkIG5vdCBmbHVzaCB0aGUgc2FtZSBidWZmZXJlZCBkYXRhIHR3aWNlIiBkbwogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDdmb28vYmFyIikKLSAgICAgIEB0cmFucy5zdHViISg6Zmx1c2gpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwN2Zvby9iYXIiKQorICAgICAgYWxsb3coQHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgIGZ0cmFucy53cml0ZSgiZm9vIikKICAgICAgIGZ0cmFucy53cml0ZSgiL2JhciIpCiAgICAgICBmdHJhbnMuZmx1c2gKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDAiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDAiKQogICAgICAgZnRyYW5zLmZsdXNoCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgd3JhcCB0aGUgZ2l2ZW4gdHJhbnNwb3J0IGluIGEgRnJhbWVkVHJhbnNwb3J0IiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCh0cmFucykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0KS50byByZWNlaXZlKDpuZXcpLndpdGgodHJhbnMpCiAgICAgICBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnMpCiAgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5uZXcudG9fcykudG8gZXEoImZyYW1lZCIpCisgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0IGRvCkBAIC0yNTQsOTYgKzI4MiwxMDYgQEAKICAgICAgIEBidWZmZXIgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKICAgICBlbmQKIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAYnVmZmVyLnRvX3MpLnRvIGVxKCJtZW1vcnkiKQorICAgIGVuZAorCiAgICAgaXQgInNob3VsZCBhY2NlcHQgYSBidWZmZXIgb24gaW5wdXQgYW5kIHVzZSBpdCBkaXJlY3RseSIgZG8KICAgICAgIHMgPSAidGhpcyBpcyBhIHRlc3QiCiAgICAgICBAYnVmZmVyID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3KHMpCi0gICAgICBAYnVmZmVyLnJlYWQoNCkuc2hvdWxkID09ICJ0aGlzIgorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZCg0KSkudG8gZXEoInRoaXMiKQogICAgICAgcy5zbGljZSEoLTQuLi0xKQotICAgICAgQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKS5zaG91bGQgPT0gIiBpcyBhICIKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiIGlzIGEgIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWx3YXlzIHJlbWFpbiBvcGVuIiBkbwotICAgICAgQGJ1ZmZlci5zaG91bGQgYmVfb3BlbgorICAgICAgZXhwZWN0KEBidWZmZXIpLnRvIGJlX29wZW4KICAgICAgIEBidWZmZXIuY2xvc2UKLSAgICAgIEBidWZmZXIuc2hvdWxkIGJlX29wZW4KKyAgICAgIGV4cGVjdChAYnVmZmVyKS50byBiZV9vcGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlc3BvbmQgdG8gcGVlayBhbmQgYXZhaWxhYmxlIiBkbwogICAgICAgQGJ1ZmZlci53cml0ZSAic29tZSBkYXRhIgotICAgICAgQGJ1ZmZlci5wZWVrLnNob3VsZCBiZV90cnVlCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gOQorICAgICAgZXhwZWN0KEBidWZmZXIucGVlaykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDkpCiAgICAgICBAYnVmZmVyLnJlYWQoNCkKLSAgICAgIEBidWZmZXIucGVlay5zaG91bGQgYmVfdHJ1ZQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDUKKyAgICAgIGV4cGVjdChAYnVmZmVyLnBlZWspLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSg1KQogICAgICAgQGJ1ZmZlci5yZWFkKDUpCi0gICAgICBAYnVmZmVyLnBlZWsuc2hvdWxkIGJlX2ZhbHNlCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gMAorICAgICAgZXhwZWN0KEBidWZmZXIucGVlaykudG8gYmVfZmFsc2V5CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJlIGFibGUgdG8gcmVzZXQgdGhlIGJ1ZmZlciIgZG8KICAgICAgIEBidWZmZXIud3JpdGUgInRlc3QgZGF0YSIKICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyKCJmb29iYXIiKQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDYKLSAgICAgIEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkuc2hvdWxkID09ICJmb29iYXIiCisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDYpCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKSkudG8gZXEoImZvb2JhciIpCiAgICAgICBAYnVmZmVyLnJlc2V0X2J1ZmZlcgotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDAKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoMCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY29weSB0aGUgZ2l2ZW4gc3RyaW5nIHdoZW4gcmVzZXR0aW5nIHRoZSBidWZmZXIiIGRvCiAgICAgICBzID0gInRoaXMgaXMgYSB0ZXN0IgogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIocykKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSAxNAorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSgxNCkKICAgICAgIEBidWZmZXIucmVhZCgxMCkKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSA0Ci0gICAgICBzLnNob3VsZCA9PSAidGhpcyBpcyBhIHRlc3QiCisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDQpCisgICAgICBleHBlY3QocykudG8gZXEoInRoaXMgaXMgYSB0ZXN0IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIGZyb20gcmVhZCB3aGF0IHdhcyBnaXZlbiBpbiB3cml0ZSIgZG8KICAgICAgIEBidWZmZXIud3JpdGUgInRlc3QgZGF0YSIKLSAgICAgIEBidWZmZXIucmVhZCg0KS5zaG91bGQgPT0gInRlc3QiCi0gICAgICBAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpLnNob3VsZCA9PSAiIGRhdGEiCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKDQpKS50byBlcSgidGVzdCIpCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKSkudG8gZXEoIiBkYXRhIikKICAgICAgIEBidWZmZXIud3JpdGUgImZvbyIKICAgICAgIEBidWZmZXIud3JpdGUgIiBiYXIiCi0gICAgICBAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpLnNob3VsZCA9PSAiZm9vIGJhciIKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiZm9vIGJhciIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHRocm93IGFuIEVPRkVycm9yIHdoZW4gdGhlcmUgaXNuJ3QgZW5vdWdoIGRhdGEgaW4gdGhlIGJ1ZmZlciIgZG8KICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyKCIiKQotICAgICAgbGFtYmRhe0BidWZmZXIucmVhZCgxKX0uc2hvdWxkIHJhaXNlX2Vycm9yKEVPRkVycm9yKQorICAgICAgZXhwZWN0e0BidWZmZXIucmVhZCgxKX0udG8gcmFpc2VfZXJyb3IoRU9GRXJyb3IpCiAKICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyKCIxMjM0IikKLSAgICAgIGxhbWJkYXtAYnVmZmVyLnJlYWQoNSl9LnNob3VsZCByYWlzZV9lcnJvcihFT0ZFcnJvcikKKyAgICAgIGV4cGVjdHtAYnVmZmVyLnJlYWQoNSl9LnRvIHJhaXNlX2Vycm9yKEVPRkVycm9yKQogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0IGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQGlucHV0ID0gbW9jaygiSW5wdXQiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIEBvdXRwdXQgPSBtb2NrKCJPdXRwdXQiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIEBpbnB1dCA9IGRvdWJsZSgiSW5wdXQiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIEBvdXRwdXQgPSBkb3VibGUoIk91dHB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQogICAgICAgQHRyYW5zID0gVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydC5uZXcoQGlucHV0LCBAb3V0cHV0KQogICAgIGVuZAogCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBpbnB1dCkudG8gcmVjZWl2ZSg6dG9fcykuYW5kX3JldHVybigibW9ja19pbnB1dCIpCisgICAgICBleHBlY3QoQG91dHB1dCkudG8gcmVjZWl2ZSg6dG9fcykuYW5kX3JldHVybigibW9ja19vdXRwdXQiKQorICAgICAgZXhwZWN0KEB0cmFucy50b19zKS50byBlcSgiaW9zdHJlYW0oaW5wdXQ9bW9ja19pbnB1dCxvdXRwdXQ9bW9ja19vdXRwdXQpIikKKyAgICBlbmQKKwogICAgIGl0ICJzaG91bGQgYmUgb3BlbiBhcyBsb25nIGFzIGJvdGggaW5wdXQgb3Igb3V0cHV0IGFyZSBvcGVuIiBkbwotICAgICAgQHRyYW5zLnNob3VsZCBiZV9vcGVuCi0gICAgICBAaW5wdXQuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEB0cmFucy5zaG91bGQgYmVfb3BlbgotICAgICAgQGlucHV0LnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKGZhbHNlKQotICAgICAgQG91dHB1dC5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHRyYW5zLnNob3VsZCBiZV9vcGVuCi0gICAgICBAaW5wdXQuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEB0cmFucy5zaG91bGRfbm90IGJlX29wZW4KKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIGJlX29wZW4KKyAgICAgIGFsbG93KEBpbnB1dCkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gYmVfb3BlbgorICAgICAgYWxsb3coQGlucHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKGZhbHNlKQorICAgICAgYWxsb3coQG91dHB1dCkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gYmVfb3BlbgorICAgICAgYWxsb3coQGlucHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zKS5ub3RfdG8gYmVfb3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggcmVhZC93cml0ZSB0byBpbnB1dC9vdXRwdXQiIGRvCi0gICAgICBAaW5wdXQuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMTcpLmFuZF9yZXR1cm4oIisgcmVhZCIpCi0gICAgICBAb3V0cHV0LnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vYmFyIikuYW5kX3JldHVybigiKyB3cml0ZSIpCi0gICAgICBAdHJhbnMucmVhZCgxNykuc2hvdWxkID09ICIrIHJlYWQiCi0gICAgICBAdHJhbnMud3JpdGUoImZvb2JhciIpLnNob3VsZCA9PSAiKyB3cml0ZSIKKyAgICAgIGV4cGVjdChAaW5wdXQpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoMTcpLmFuZF9yZXR1cm4oIisgcmVhZCIpCisgICAgICBleHBlY3QoQG91dHB1dCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvb2JhciIpLmFuZF9yZXR1cm4oIisgd3JpdGUiKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKDE3KSkudG8gZXEoIisgcmVhZCIpCisgICAgICBleHBlY3QoQHRyYW5zLndyaXRlKCJmb29iYXIiKSkudG8gZXEoIisgd3JpdGUiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjbG9zZSBib3RoIGlucHV0IGFuZCBvdXRwdXQgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBAaW5wdXQuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAgQG91dHB1dC5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoQGlucHV0KS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAb3V0cHV0KS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIEB0cmFucy5jbG9zZQogICAgIGVuZAogICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKaW5kZXggYmFjOWVhNy4uYjJjZDA0YiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKQEAgLTMzLDEwICszMywxNCBAQAogCiAgICAgZGVzY3JpYmUgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSBkbwogICAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIiBkbwotICAgICAgICBUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2wobW9jaygiTW9ja1RyYW5zcG9ydCIpKS5zaG91bGQgYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKSkudG8gYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKQorICAgICAgZW5kCisKKyAgICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiaW5hcnktYWNjZWwiKQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZAogZWxzZQogICBwdXRzICJza2lwcGluZyBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHNwZWMgYmVjYXVzZSBpdCBpcyBub3QgZGVmaW5lZC4iCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKaW5kZXggMzI3NzJkMy4uMDY1ZjVjZSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKQEAgLTM4LDI5ICszOCwzNyBAQAogICAgIGl0ICJzaG91bGQgcmVhZCBhIG1lc3NhZ2UgaGVhZGVyIiBkbwogICAgICAgQHRyYW5zLndyaXRlKFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFldLnBhY2soJ04nKSkKICAgICAgIEB0cmFucy53cml0ZShbNDJdLnBhY2soJ04nKSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigndGVzdE1lc3NhZ2UnKQotICAgICAgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luLnNob3VsZCA9PSBbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZLCA0Ml0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oJ3Rlc3RNZXNzYWdlJykKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4pLnRvIGVxKFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFksIDQyXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGhlYWRlciBoYXMgdGhlIHdyb25nIHZlcnNpb24iIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oLTEpCi0gICAgICBsYW1iZGEgeyBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4gfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ01pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyJykgZG8gfGV8CisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKC0xKQorICAgICAgZXhwZWN0IHsgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ01pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyJykgZG8gfGV8CiAgICAgICAgIGUudHlwZSA9PSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTgogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBoZWFkZXIgZG9lcyBub3QgZXhpc3QgYW5kIHN0cmljdF9yZWFkIGlzIGVuYWJsZWQiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oNDIpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6c3RyaWN0X3JlYWQpLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIGxhbWJkYSB7IEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAnTm8gdmVyc2lvbiBpZGVudGlmaWVyLCBvbGQgcHJvdG9jb2wgY2xpZW50PycpIGRvIHxlfAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybig0MikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6c3RyaWN0X3JlYWQpLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdCB7IEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICdObyB2ZXJzaW9uIGlkZW50aWZpZXIsIG9sZCBwcm90b2NvbCBjbGllbnQ/JykgZG8gfGV8CiAgICAgICAgIGUudHlwZSA9PSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTgogICAgICAgZW5kCiAgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHByb3QudG9fcykudG8gZXEoImJpbmFyeShtZW1vcnkpIikKKyAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIEJpbmFyeVByb3RvY29sIiBkbwotICAgICAgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChtb2NrKCJNb2NrVHJhbnNwb3J0IikpLnNob3VsZCBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sKQorICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYmluYXJ5IikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZC5yYiBiL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZC5yYgppbmRleCBjNjE1YjU4Li41OGQ2NWYwIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQucmIKKysrIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiCkBAIC0yNywzNCArMjcsMzQgQEAKICAgZW5kCiAKICAgaXQgInNob3VsZCBkZWZpbmUgdGhlIHByb3BlciBWRVJTSU9OXzEsIFZFUlNJT05fTUFTSyBBTkQgVFlQRV9NQVNLIiBkbwotICAgIHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl9NQVNLKS5zaG91bGQgPT0gMHhmZmZmMDAwMAotICAgIHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl8xKS5zaG91bGQgPT0gMHg4MDAxMDAwMAotICAgIHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VFlQRV9NQVNLKS5zaG91bGQgPT0gMHgwMDAwMDBmZgorICAgIGV4cGVjdChwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fTUFTSykpLnRvIGVxKDB4ZmZmZjAwMDApCisgICAgZXhwZWN0KHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl8xKSkudG8gZXEoMHg4MDAxMDAwMCkKKyAgICBleHBlY3QocHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpUWVBFX01BU0spKS50byBlcSgweDAwMDAwMGZmKQogICBlbmQKIAogICBpdCAic2hvdWxkIG1ha2Ugc3RyaWN0X3JlYWQgcmVhZGFibGUiIGRvCi0gICAgQHByb3Quc3RyaWN0X3JlYWQuc2hvdWxkIGVxbCh0cnVlKQorICAgIGV4cGVjdChAcHJvdC5zdHJpY3RfcmVhZCkudG8gZXFsKHRydWUpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgbWFrZSBzdHJpY3Rfd3JpdGUgcmVhZGFibGUiIGRvCi0gICAgQHByb3Quc3RyaWN0X3dyaXRlLnNob3VsZCBlcWwodHJ1ZSkKKyAgICBleHBlY3QoQHByb3Quc3RyaWN0X3dyaXRlKS50byBlcWwodHJ1ZSkKICAgZW5kICAgIAogCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpIHwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsICJ0ZXN0TWVzc2FnZSIuc2l6ZSwgInRlc3RNZXNzYWdlIiwgMTddLnBhY2soIk5OYTExTiIpCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpIHwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsICJ0ZXN0TWVzc2FnZSIuc2l6ZSwgInRlc3RNZXNzYWdlIiwgMTddLnBhY2soIk5OYTExTiIpKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHdpdGhvdXQgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgbm90IHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKSAjIG5vIHN0cmljdCB3cml0ZQogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAxXDAwMFwwMDBcMDAwXDAyMSIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgd2l0aCBhIHZlcnNpb24gd2hlbiB3cml0ZXMgYXJlIHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMpICMgc3RyaWN0IHdyaXRlCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDIwMFwwMDFcMDAwXDAwMVwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAwXDAwMFwwMDBcMDIxIikKICAgZW5kCiAgIAogCkBAIC02Miw2NCArNjIsNjcgQEAKIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBmaWVsZCBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfZmllbGRfYmVnaW4oJ2ZvbycsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgM10ucGFjaygiY24iKQorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgM10ucGFjaygiY24iKSkKICAgZW5kCiAgIAogICAjIGZpZWxkIGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIFNUT1AgZmllbGQiIGRvCiAgICAgQHByb3Qud3JpdGVfZmllbGRfc3RvcAotICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSAiXDAwMCIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKCJcMDAwIikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtYXAgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX21hcF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCAxN10ucGFjaygiY2NOIik7CisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCAxN10ucGFjaygiY2NOIikpOwogICBlbmQKICAgIAogICAjIG1hcCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBsaXN0IGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9saXN0X2JlZ2luKFRocmlmdDo6VHlwZXM6OkkxNiwgNDIpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyXS5wYWNrKCJjTiIpCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbVGhyaWZ0OjpUeXBlczo6STE2LCA0Ml0ucGFjaygiY04iKSkKICAgZW5kCiAgIAogICAjIGxpc3QgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgc2V0IGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9zZXRfYmVnaW4oVGhyaWZ0OjpUeXBlczo6STE2LCA0MikKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OkkxNiwgNDJdLnBhY2soImNOIikKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyXS5wYWNrKCJjTiIpKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYSBib29sIiBkbwogICAgIEBwcm90LndyaXRlX2Jvb2wodHJ1ZSkKICAgICBAcHJvdC53cml0ZV9ib29sKGZhbHNlKQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDAwMVwwMDAiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDAwMVwwMDAiKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgdHJlYXQgYSBuaWwgYm9vbCBhcyBmYWxzZSIgZG8KICAgICBAcHJvdC53cml0ZV9ib29sKG5pbCkKLSAgICBAdHJhbnMucmVhZCgxKS5zaG91bGQgPT0gIlwwMDAiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKDEpKS50byBlcSgiXDAwMCIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhIGJ5dGUiIGRvCiAgICAgIyBieXRlIGlzIHNtYWxsIGVub3VnaCwgbGV0J3MgY2hlY2sgLTEyOC4uMTI3CiAgICAgKC0xMjguLjEyNykuZWFjaCBkbyB8aXwKICAgICAgIEBwcm90LndyaXRlX2J5dGUoaSkKLSAgICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSBbaV0ucGFjaygnYycpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKFtpXS5wYWNrKCdjJykpCiAgICAgZW5kCi0gICAgIyBoYW5kaW5nIGl0IG51bWJlcnMgb3V0IG9mIHNpZ25lZCByYW5nZSBzaG91bGQgY2xpcAotICAgIEB0cmFucy5yc3BlY192ZXJpZnkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjbGlwIG51bWJlcnMgb3V0IG9mIHNpZ25lZCByYW5nZSIgZG8KICAgICAoMTI4Li4yNTUpLmVhY2ggZG8gfGl8CiAgICAgICBAcHJvdC53cml0ZV9ieXRlKGkpCi0gICAgICBAdHJhbnMucmVhZCgxKS5zaG91bGQgPT0gW2ldLnBhY2soJ2MnKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKDEpKS50byBlcShbaV0ucGFjaygnYycpKQogICAgIGVuZAotICAgICMgYW5kIGxhc3RseSwgYSBCaWdudW0gaXMgZ29pbmcgdG8gZXJyb3Igb3V0Ci0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfYnl0ZSgyKio2NSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKKyAgZW5kCisKKyAgaXQgImVycm9ycyBvdXQgd2l0aCBhIEJpZ251bSIgZG8KKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9ieXRlKDIqKjY1KSB9LnRvIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGJ5dGUiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfYnl0ZShuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfYnl0ZShuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGFuIGkxNiIgZG8KQEAgLTEzMSwxNCArMTM0LDE0IEBACiAgICAgIyBhbmQgdHJ5IHNvbWV0aGluZyBvdXQgb2Ygc2lnbmVkIHJhbmdlLCBpdCBzaG91bGQgY2xpcAogICAgIEBwcm90LndyaXRlX2kxNigyKioxNSArIDUpCiAgICAgCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMjAwXDAwMFwzNzRcMDAwXDAwMFwwMjFcMDAwXDAwMFwzMzBcMzYwXDAwNlwyNzNcMTc3XDM3N1wyMDBcMDA1IgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwyMDBcMDAwXDM3NFwwMDBcMDAwXDAyMVwwMDBcMDAwXDMzMFwzNjBcMDA2XDI3M1wxNzdcMzc3XDIwMFwwMDUiKQogICAgIAogICAgICMgYSBCaWdudW0gc2hvdWxkIGVycm9yCiAgICAgIyBsYW1iZGEgeyBAcHJvdC53cml0ZV9pMTYoMioqNjUpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGkxNiIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pMTYobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcgorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2kxNihuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGFuIGkzMiIgZG8KQEAgLTE0OCwxNCArMTUxLDE0IEBACiAgICAgICBAcHJvdC53cml0ZV9pMzIoaSkKICAgICBlbmQKICAgICAjIHRyeSBzb21ldGhpbmcgb3V0IG9mIHNpZ25lZCByYW5nZSwgaXQgc2hvdWxkIGNsaXAKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAwXDAwMFwwMDAiICsgIlwzNzdcMzc2XDAzN1xyIiArICJcMzc3XDM3N1wzNjZcMDM0IiArICJcMzc3XDM3N1wzNzdcMzc1IiArICJcMDAwXDAwMFwwMDBcMDAwIiArICJcMDAwI1wzNDBcMjAzIiArICJcMDAwXDAwMDArIiArICJcMTc3XDM3N1wzNzdcMzc3IgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwyMDBcMDAwXDAwMFwwMDAiICsgIlwzNzdcMzc2XDAzN1xyIiArICJcMzc3XDM3N1wzNjZcMDM0IiArICJcMzc3XDM3N1wzNzdcMzc1IiArICJcMDAwXDAwMFwwMDBcMDAwIiArICJcMDAwI1wzNDBcMjAzIiArICJcMDAwXDAwMDArIiArICJcMTc3XDM3N1wzNzdcMzc3IikKICAgICBbMiAqKiAzMSArIDUsIDIgKiogNjUgKyA1XS5lYWNoIGRvIHxpfAotICAgICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTMyKGkpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpICAKKyAgICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2kzMihpKSB9LnRvIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpICAKICAgICBlbmQKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgaTMyIiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2kzMihuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTMyKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYW4gaTY0IiBkbwpAQCAtMTY1LDcgKzE2OCw3IEBACiAgICAgICBAcHJvdC53cml0ZV9pNjQoaSkKICAgICBlbmQKICAgICAjIHRyeSBzb21ldGhpbmcgb3V0IG9mIHNpZ25lZCByYW5nZSwgaXQgc2hvdWxkIGNsaXAKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gWyJcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIsCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbIlwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIiwKICAgICAgICJcMzc3XDM3N1wzNjRcMzAzXDAzNVwyNDQrXSIsCiAgICAgICAiXDM3N1wzNzdcMzc3XDM3N1wzNzZcMjMxOlwzNDEiLAogICAgICAgIlwzNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMDI2IiwKQEAgLTE3MywxMiArMTc2LDEyIEBACiAgICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwzMTciLAogICAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwI1wzNDBcMjA0IiwKICAgICAgICJcMDAwXDAwMFwwMDBcMDAyXDM0MFwzMTF+XDM2NSIsCi0gICAgICAiXDE3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzciXS5qb2luKCIiKQotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2k2NCgyICoqIDY1ICsgNSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKKyAgICAgICJcMTc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3NyJdLmpvaW4oIiIpKQorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2k2NCgyICoqIDY1ICsgNSkgfS50byByYWlzZV9lcnJvcihSYW5nZUVycm9yKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBpNjQiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTY0KG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9pNjQobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhIGRvdWJsZSIgZG8KQEAgLTE4NiwxMiArMTg5LDEyIEBACiAgICAgdmFsdWVzID0gW0Zsb2F0OjpNSU4sLTEyMzEuMTUzMjUsIC0xMjMxMjMuMjMsIC0yMy4yMzUxNTEyMywgMCwgMTIzNTEuMTMyNSwgNTIzLjIzLCBGbG9hdDo6TUFYXQogICAgIHZhbHVlcy5lYWNoIGRvIHxmfAogICAgICAgQHByb3Qud3JpdGVfZG91YmxlKGYpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW2ZdLnBhY2soIkciKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbZl0ucGFjaygiRyIpKQogICAgIGVuZAogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBkb3VibGUiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfZG91YmxlKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9kb3VibGUobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogCiAgIGlmIFJVQllfVkVSU0lPTiA+PSAnMS45JwpAQCAtMTk5LDExMSArMjAyLDExMSBAQAogICAgICAgc3RyID0gJ2FiYycKICAgICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCiAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKLSAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKLSAgICAgIGEudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2M10KKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2M10pCiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHdyaXRlIGEgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzJyBkbwogICAgICAgc3RyID0gImFiYyBcdTIwQUMgXHUyMEFEIi5lbmNvZGUoJ1VURi04JykKICAgICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCiAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKLSAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKLSAgICAgIGEudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwQiwgMHg2MSwgMHg2MiwgMHg2MywgMHgyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMiwgMHg4MiwgMHhBQywgMHgyMCwgMHhFMiwgMHg4MiwgMHhBRF0KKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwQiwgMHg2MSwgMHg2MiwgMHg2MywgMHgyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMiwgMHg4MiwgMHhBQywgMHgyMCwgMHhFMiwgMHg4MiwgMHhBRF0pCiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHdyaXRlIHNob3VsZCB3cml0ZSBhIHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVycyBhbmQgdHJhbnNjb2RpbmcnIGRvCiAgICAgICBzdHIgPSAiYWJjIFx1MjBBQyIuZW5jb2RlKCdJU08tODg1OS0xNScpCiAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoc3RyKQogICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCi0gICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCi0gICAgICBhLnVucGFjaygnQyonKS5zaG91bGQgPT0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NjEsIDB4NjIsIDB4NjMsIDB4MjAsIDB4RTIsIDB4ODIsIDB4QUNdCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NjEsIDB4NjIsIDB4NjMsIDB4MjAsIDB4RTIsIDB4ODIsIDB4QUNdKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIGJpbmFyeSBzdHJpbmcnIGRvCiAgICAgICBidWZmZXIgPSBbMCwgMSwgMiwgM10ucGFjaygnQyonKQogICAgICAgQHByb3Qud3JpdGVfYmluYXJ5KGJ1ZmZlcikKICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQotICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQotICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXSkKICAgICBlbmQKICAgZWxzZQogICAgIGl0ICdzaG91bGQgd3JpdGUgYSBzdHJpbmcnIGRvCiAgICAgICBzdHIgPSAnYWJjJwogICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQotICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2M10pCiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHdyaXRlIGEgYmluYXJ5IHN0cmluZycgZG8KICAgICAgIGJ1ZmZlciA9IFswLCAxLCAyLCAzXS5wYWNrKCdDKicpCiAgICAgICBAcHJvdC53cml0ZV9iaW5hcnkoYnVmZmVyKQogICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCi0gICAgICBhLnVucGFjaygnQyonKS5zaG91bGQgPT0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXSkKICAgICBlbmQKICAgZW5kCiAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIHN0cmluZyIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9zdHJpbmcobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcgorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX3N0cmluZyhuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtZXNzYWdlIGhlYWRlciB3aXRob3V0IHZlcnNpb24gd2hlbiB3cml0ZXMgYXJlIG5vdCBzdHJpY3QiIGRvCiAgICAgQHByb3QgPSBwcm90b2NvbF9jbGFzcy5uZXcoQHRyYW5zLCB0cnVlLCBmYWxzZSkgIyBubyBzdHJpY3Qgd3JpdGUKICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxNykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAxXDAwMFwwMDBcMDAwXDAyMSIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMVwwMDBcMDAwXDAwMFwwMjEiKQogICBlbmQKICAgICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgd2l0aCBhIHZlcnNpb24gd2hlbiB3cml0ZXMgYXJlIHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMpICMgc3RyaWN0IHdyaXRlCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDIwMFwwMDFcMDAwXDAwMVwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAwXDAwMFwwMDBcMDIxIikKICAgZW5kCiAgIAogICAjIG1lc3NhZ2UgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgZmllbGQgaGVhZGVyIiBkbwogICAgIEB0cmFucy53cml0ZShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAzXS5wYWNrKCJjbiIpKQotICAgIEBwcm90LnJlYWRfZmllbGRfYmVnaW4uc2hvdWxkID09IFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUUklORywgM10KKyAgICBleHBlY3QoQHByb3QucmVhZF9maWVsZF9iZWdpbikudG8gZXEoW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAzXSkKICAgZW5kCiAgIAogICAjIGZpZWxkIGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgcmVhZCBhIHN0b3AgZmllbGQiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVE9QXS5wYWNrKCJjIikpOwotICAgIEBwcm90LnJlYWRfZmllbGRfYmVnaW4uc2hvdWxkID09IFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdCisgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfYmVnaW4pLnRvIGVxKFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdKQogICBlbmQKIAogICBpdCAic2hvdWxkIHJlYWQgYSBtYXAgaGVhZGVyIiBkbwogICAgIEB0cmFucy53cml0ZShbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCBUaHJpZnQ6OlR5cGVzOjpJNjQsIDQyXS5wYWNrKCJjY04iKSkKLSAgICBAcHJvdC5yZWFkX21hcF9iZWdpbi5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgVGhyaWZ0OjpUeXBlczo6STY0LCA0Ml0KKyAgICBleHBlY3QoQHByb3QucmVhZF9tYXBfYmVnaW4pLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIFRocmlmdDo6VHlwZXM6Okk2NCwgNDJdKQogICBlbmQKICAgCiAgICMgbWFwIGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgcmVhZCBhIGxpc3QgaGVhZGVyIiBkbwogICAgIEB0cmFucy53cml0ZShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10ucGFjaygiY04iKSkKLSAgICBAcHJvdC5yZWFkX2xpc3RfYmVnaW4uc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2xpc3RfYmVnaW4pLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XSkKICAgZW5kCiAgIAogICAjIGxpc3QgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgc2V0IGhlYWRlciIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddLnBhY2soImNOIikpCi0gICAgQHByb3QucmVhZF9zZXRfYmVnaW4uc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XQorICAgIGV4cGVjdChAcHJvdC5yZWFkX3NldF9iZWdpbikudG8gZXEoW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddKQogICBlbmQKICAgCiAgICMgc2V0IGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgcmVhZCBhIGJvb2wiIGRvCiAgICAgQHRyYW5zLndyaXRlKCJcMDAxXDAwMCIpOwotICAgIEBwcm90LnJlYWRfYm9vbC5zaG91bGQgPT0gdHJ1ZQotICAgIEBwcm90LnJlYWRfYm9vbC5zaG91bGQgPT0gZmFsc2UKKyAgICBleHBlY3QoQHByb3QucmVhZF9ib29sKS50byBlcSh0cnVlKQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2Jvb2wpLnRvIGVxKGZhbHNlKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgcmVhZCBhIGJ5dGUiIGRvCiAgICAgWy0xMjgsIC01NywgLTMsIDAsIDE3LCAyNCwgMTI3XS5lYWNoIGRvIHxpfAogICAgICAgQHRyYW5zLndyaXRlKFtpXS5wYWNrKCJjIikpCi0gICAgICBAcHJvdC5yZWFkX2J5dGUuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2J5dGUpLnRvIGVxKGkpCiAgICAgZW5kCiAgIGVuZAogICAKQEAgLTMxMSw3ICszMTQsNyBAQAogICAgICMgdHJ5IGEgc2NhdHRlcmluZyBvZiB2YWx1ZXMsIGluY2x1ZGluZyBtaW4vbWF4CiAgICAgWy0yKioxNSwgLTUyMzcsIC0zNTMsIDAsIDE1MjcsIDIyMzQsIDIqKjE1LTFdLmVhY2ggZG8gfGl8CiAgICAgICBAdHJhbnMud3JpdGUoW2ldLnBhY2soIm4iKSk7Ci0gICAgICBAcHJvdC5yZWFkX2kxNi5zaG91bGQgPT0gaQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTE2KS50byBlcShpKQogICAgIGVuZAogICBlbmQKICAgCkBAIC0zMTksNyArMzIyLDcgQEAKICAgICAjIHRyeSBhIHNjYXR0ZXJpbmcgb2YgdmFsdWVzLCBpbmNsdWRpbmcgbWluL21heAogICAgIFstMioqMzEsIC0yMzUxMjUsIC02MjM2LCAwLCAyMzUxLCAxMjMxMjMsIDIqKjMxLTFdLmVhY2ggZG8gfGl8CiAgICAgICBAdHJhbnMud3JpdGUoW2ldLnBhY2soIk4iKSkKLSAgICAgIEBwcm90LnJlYWRfaTMyLnNob3VsZCA9PSBpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9pMzIpLnRvIGVxKGkpCiAgICAgZW5kCiAgIGVuZAogICAKQEAgLTMyNyw3ICszMzAsNyBAQAogICAgICMgdHJ5IGEgc2NhdHRlcmluZyBvZiB2YWx1ZXMsIGluY2x1ZGluZyBtaW4vbWF4CiAgICAgWy0yKio2MywgLTEyMzUxMjMxMiwgLTYzNDYsIDAsIDMyLCAyMzQ2MzIyMzIzLCAyKio2My0xXS5lYWNoIGRvIHxpfAogICAgICAgQHRyYW5zLndyaXRlKFtpID4+IDMyLCBpICYgMHhGRkZGRkZGRl0ucGFjaygiTk4iKSkKLSAgICAgIEBwcm90LnJlYWRfaTY0LnNob3VsZCA9PSBpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9pNjQpLnRvIGVxKGkpCiAgICAgZW5kCiAgIGVuZAogICAKQEAgLTMzNSw3ICszMzgsNyBAQAogICAgICMgdHJ5IGEgcmFuZG9tIHNjYXR0ZXJpbmcgb2YgdmFsdWVzLCBpbmNsdWRpbmcgbWluL21heAogICAgIFtGbG9hdDo6TUlOLCAtMjMxMjMxLjEyMzUxLCAtMzIzLjIzMzUxMywgMCwgMTIzLjIzNTEyMzUsIDIzNTEyMzUuMTIzNTEyMzUsIEZsb2F0OjpNQVhdLmVhY2ggZG8gfGZ8CiAgICAgICBAdHJhbnMud3JpdGUoW2ZdLnBhY2soIkciKSk7Ci0gICAgICBAcHJvdC5yZWFkX2RvdWJsZS5zaG91bGQgPT0gZgorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZG91YmxlKS50byBlcShmKQogICAgIGVuZAogICBlbmQKIApAQCAtMzQ1LDggKzM0OCw4IEBACiAgICAgICBidWZmZXIgPSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2M10ucGFjaygnQyonKQogICAgICAgQHRyYW5zLndyaXRlKGJ1ZmZlcikKICAgICAgIGEgPSBAcHJvdC5yZWFkX3N0cmluZwotICAgICAgYS5zaG91bGQgPT0gJ2FiYycuZW5jb2RlKCdVVEYtOCcpCi0gICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6VVRGXzgKKyAgICAgIGV4cGVjdChhKS50byBlcSgnYWJjJy5lbmNvZGUoJ1VURi04JykpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCByZWFkIGEgc3RyaW5nIGNvbnRhaW5pbmcgdW5pY29kZSBjaGFyYWN0ZXJzIGZyb20gVVRGLTggZW5jb2RlZCBidWZmZXInIGRvCkBAIC0zNTQsNDQgKzM1Nyw0NCBAQAogICAgICAgYnVmZmVyID0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RTIsIDB4ODIsIDB4QUNdLnBhY2soJ0MqJykKICAgICAgIEB0cmFucy53cml0ZShidWZmZXIpCiAgICAgICBhID0gQHByb3QucmVhZF9zdHJpbmcKLSAgICAgIGEuc2hvdWxkID09ICJcdTIwQUMiLmVuY29kZSgnVVRGLTgnKQotICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OlVURl84CisgICAgICBleHBlY3QoYSkudG8gZXEoIlx1MjBBQyIuZW5jb2RlKCdVVEYtOCcpKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgcmVhZCBhIGJpbmFyeSBzdHJpbmcnIGRvCiAgICAgICBidWZmZXIgPSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10ucGFjaygnQyonKQogICAgICAgQHRyYW5zLndyaXRlKGJ1ZmZlcikKICAgICAgIGEgPSBAcHJvdC5yZWFkX2JpbmFyeQotICAgICAgYS5zaG91bGQgPT0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdLnBhY2soJ0MqJykKLSAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgIGV4cGVjdChhKS50byBlcShbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10ucGFjaygnQyonKSkKKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQogICAgIGVuZAogICBlbHNlCiAgICAgaXQgJ3Nob3VsZCByZWFkIGEgc3RyaW5nJyBkbwogICAgICAgIyBpMzIgb2YgdmFsdWUgMywgZm9sbG93ZWQgYnkgdGhyZWUgY2hhcmFjdGVycy9VVEYtOCBieXRlcyAnYScsICdiJywgJ2MnCiAgICAgICBidWZmZXIgPSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2M10ucGFjaygnQyonKQogICAgICAgQHRyYW5zLndyaXRlKGJ1ZmZlcikKLSAgICAgIEBwcm90LnJlYWRfc3RyaW5nLnNob3VsZCA9PSAnYWJjJworICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc3RyaW5nKS50byBlcSgnYWJjJykKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgcmVhZCBhIGJpbmFyeSBzdHJpbmcnIGRvCiAgICAgICBidWZmZXIgPSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10ucGFjaygnQyonKQogICAgICAgQHRyYW5zLndyaXRlKGJ1ZmZlcikKICAgICAgIGEgPSBAcHJvdC5yZWFkX2JpbmFyeQotICAgICAgYS5zaG91bGQgPT0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdLnBhY2soJ0MqJykKKyAgICAgIGV4cGVjdChhKS50byBlcShbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10ucGFjaygnQyonKSkKICAgICBlbmQKICAgZW5kCiAKICAgaXQgInNob3VsZCBwZXJmb3JtIGEgY29tcGxldGUgcnBjIHdpdGggbm8gYXJncyBvciByZXR1cm4iIGRvCiAgICAgc3J2X3Rlc3QoCiAgICAgICBwcm9jIHt8Y2xpZW50fCBjbGllbnQuc2VuZF92b2lkTWV0aG9kKCl9LAotICAgICAgcHJvYyB7fGNsaWVudHwgY2xpZW50LnJlY3Zfdm9pZE1ldGhvZC5zaG91bGQgPT0gbmlsfQorICAgICAgcHJvYyB7fGNsaWVudHwgZXhwZWN0KGNsaWVudC5yZWN2X3ZvaWRNZXRob2QpLnRvIGVxKG5pbCl9CiAgICAgKQogICBlbmQKIAogICBpdCAic2hvdWxkIHBlcmZvcm0gYSBjb21wbGV0ZSBycGMgd2l0aCBhIHByaW1pdGl2ZSByZXR1cm4gdHlwZSIgZG8KICAgICBzcnZfdGVzdCgKICAgICAgIHByb2Mge3xjbGllbnR8IGNsaWVudC5zZW5kX3ByaW1pdGl2ZU1ldGhvZCgpfSwKLSAgICAgIHByb2Mge3xjbGllbnR8IGNsaWVudC5yZWN2X3ByaW1pdGl2ZU1ldGhvZC5zaG91bGQgPT0gMX0KKyAgICAgIHByb2Mge3xjbGllbnR8IGV4cGVjdChjbGllbnQucmVjdl9wcmltaXRpdmVNZXRob2QpLnRvIGVxKDEpfQogICAgICkKICAgZW5kCiAKQEAgLTQwMiw3ICs0MDUsNyBAQAogICAgICAgICByZXN1bHQgPSBjbGllbnQucmVjdl9zdHJ1Y3RNZXRob2QKICAgICAgICAgcmVzdWx0LnNldF9ieXRlX21hcCA9IG5pbAogICAgICAgICByZXN1bHQubWFwX2J5dGVfbWFwID0gbmlsCi0gICAgICAgIHJlc3VsdC5zaG91bGQgPT0gRml4dHVyZXM6OkNPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QKKyAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8gZXEoRml4dHVyZXM6OkNPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QpCiAgICAgICB9CiAgICAgKQogICBlbmQKQEAgLTQyMyw5ICs0MjYsOSBAQAogICAgIGNsaWVudHByb3RvID0gcHJvdG9jb2xfY2xhc3MubmV3KGNsaWVudHNpZGUpCiAgICAgc2VydmVycHJvdG8gPSBwcm90b2NvbF9jbGFzcy5uZXcoc2VydmVyc2lkZSkKIAotICAgIHByb2Nlc3NvciA9IFNydjo6UHJvY2Vzc29yLm5ldyhTcnZIYW5kbGVyLm5ldykKKyAgICBwcm9jZXNzb3IgPSBUaHJpZnQ6OlRlc3Q6OlNydjo6UHJvY2Vzc29yLm5ldyhTcnZIYW5kbGVyLm5ldykKIAotICAgIGNsaWVudCA9IFNydjo6Q2xpZW50Lm5ldyhjbGllbnRwcm90bywgY2xpZW50cHJvdG8pCisgICAgY2xpZW50ID0gVGhyaWZ0OjpUZXN0OjpTcnY6OkNsaWVudC5uZXcoY2xpZW50cHJvdG8sIGNsaWVudHByb3RvKQogCiAgICAgIyBmaXJzdCBibG9jawogICAgIGZpcnN0YmxvY2suY2FsbChjbGllbnQpCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9ieXRlc19zcGVjLnJiIGIvbGliL3JiL3NwZWMvYnl0ZXNfc3BlYy5yYgppbmRleCBiODJlMzA0Li4yZTg2NTNjIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9ieXRlc19zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2J5dGVzX3NwZWMucmIKQEAgLTI1LDMzICsyNSwzMyBAQAogICAgIGRlc2NyaWJlICcuZW1wdHlfYnl0ZV9idWZmZXInIGRvCiAgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXInIGRvCiAgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCi0gICAgICAgIGIubGVuZ3RoLnNob3VsZCA9PSAwCi0gICAgICAgIGIuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgZXhwZWN0KGIubGVuZ3RoKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYi5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKICAgICAgIGVuZAogCiAgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXIgb2YgZ2l2ZW4gc2l6ZScgZG8KICAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIgMgotICAgICAgICBiLmxlbmd0aC5zaG91bGQgPT0gMgotICAgICAgICBiLmdldGJ5dGUoMCkuc2hvdWxkID09IDAKLSAgICAgICAgYi5nZXRieXRlKDEpLnNob3VsZCA9PSAwCi0gICAgICAgIGIuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgZXhwZWN0KGIubGVuZ3RoKS50byBlcSgyKQorICAgICAgICBleHBlY3QoYi5nZXRieXRlKDApKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYi5nZXRieXRlKDEpKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYi5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgZGVzY3JpYmUgJy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcnIGRvCiAgICAgICBpdCAnc2hvdWxkIGNoYW5nZSBlbmNvZGluZycgZG8KICAgICAgICAgZSA9ICdTVFJJTkcnLmVuY29kZSgnVVRGLTgnKQotICAgICAgICBlLmVuY29kaW5nLnNob3VsZF9ub3QgPT0gRW5jb2Rpbmc6OkJJTkFSWQorICAgICAgICBleHBlY3QoZS5lbmNvZGluZykubm90X3RvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyBlCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGRlc2NyaWJlICcuZ2V0X3N0cmluZ19ieXRlJyBkbwogICAgICAgaXQgJ3Nob3VsZCBnZXQgdGhlIGJ5dGUgYXQgaW5kZXgnIGRvCiAgICAgICAgIHMgPSAiXHg0MVx4NDIiCi0gICAgICAgIFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDApLnNob3VsZCA9PSAweDQxCi0gICAgICAgIFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDEpLnNob3VsZCA9PSAweDQyCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAwKSkudG8gZXEoMHg0MSkKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDEpKS50byBlcSgweDQyKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTU5LDQyICs1OSw0MiBAQAogICAgICAgaXQgJ3Nob3VsZCBzZXQgYnl0ZSB2YWx1ZSBhdCBpbmRleCcgZG8KICAgICAgICAgcyA9ICJceDQxXHg0MiIKICAgICAgICAgVGhyaWZ0OjpCeXRlcy5zZXRfc3RyaW5nX2J5dGUocywgMCwgMHg0MykKLSAgICAgICAgcy5nZXRieXRlKDApLnNob3VsZCA9PSAweDQzCi0gICAgICAgIHMuc2hvdWxkID09ICdDQicKKyAgICAgICAgZXhwZWN0KHMuZ2V0Ynl0ZSgwKSkudG8gZXEoMHg0MykKKyAgICAgICAgZXhwZWN0KHMpLnRvIGVxKCdDQicpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGRlc2NyaWJlICcuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyJyBkbwogICAgICAgaXQgJ3Nob3VsZCBjb252ZXJ0IFVURi04IFN0cmluZyB0byBieXRlIGJ1ZmZlcicgZG8KICAgICAgICAgZSA9ICJcdTIwQUMiLmVuY29kZSgnVVRGLTgnKSAjIGEgc3RyaW5nIHdpdGggZXVybyBzaWduIGNoYXJhY3RlciBVKzIwQUMKLSAgICAgICAgZS5sZW5ndGguc2hvdWxkID09IDEKKyAgICAgICAgZXhwZWN0KGUubGVuZ3RoKS50byBlcSgxKQogCiAgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlciBlCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKLSAgICAgICAgYS5sZW5ndGguc2hvdWxkID09IDMKLSAgICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweEUyLCAweDgyLCAweEFDXQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgICAgZXhwZWN0KGEubGVuZ3RoKS50byBlcSgzKQorICAgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweEUyLCAweDgyLCAweEFDXSkKICAgICAgIGVuZAogCiAgICAgICBpdCAnc2hvdWxkIGNvbnZlcnQgSVNPLTg4NTktMTUgU3RyaW5nIHRvIFVURi04IGJ5dGUgYnVmZmVyJyBkbwogICAgICAgICAjIEFzc3VtcHRpb25zCiAgICAgICAgIGUgPSAiXHUyMEFDIi5lbmNvZGUoJ0lTTy04ODU5LTE1JykgIyBhIHN0cmluZyB3aXRoIGV1cm8gc2lnbiBjaGFyYWN0ZXIgVSsyMEFDLCB0aGVuIGNvbnZlcnRlZCB0byBJU08tODg1OS0xNQotICAgICAgICBlLmxlbmd0aC5zaG91bGQgPT0gMQotICAgICAgICBlLnVucGFjaygnQyonKS5zaG91bGQgPT0gWzB4QTRdICMgZXVybyBzaWduIGlzIGEgZGlmZmVyZW50IGNvZGUgcG9pbnQgaW4gSVNPLTg4NTktMTUKKyAgICAgICAgZXhwZWN0KGUubGVuZ3RoKS50byBlcSgxKQorICAgICAgICBleHBlY3QoZS51bnBhY2soJ0MqJykpLnRvIGVxKFsweEE0XSkgIyBldXJvIHNpZ24gaXMgYSBkaWZmZXJlbnQgY29kZSBwb2ludCBpbiBJU08tODg1OS0xNQogCiAgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlciBlCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKLSAgICAgICAgYS5sZW5ndGguc2hvdWxkID09IDMKLSAgICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweEUyLCAweDgyLCAweEFDXQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgICAgZXhwZWN0KGEubGVuZ3RoKS50byBlcSgzKQorICAgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweEUyLCAweDgyLCAweEFDXSkKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgZGVzY3JpYmUgJy5jb252ZXJ0X3RvX3N0cmluZycgZG8KICAgICAgIGl0ICdzaG91bGQgY29udmVydCBVVEYtOCBieXRlIGJ1ZmZlciB0byBhIFVURi04IFN0cmluZycgZG8KICAgICAgICAgZSA9IFsweEUyLCAweDgyLCAweEFDXS5wYWNrKCJDKiIpCi0gICAgICAgIGUuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgZXhwZWN0KGUuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fc3RyaW5nIGUKLSAgICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OlVURl84Ci0gICAgICAgIGEuc2hvdWxkID09ICJcdTIwQUMiCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6VVRGXzgpCisgICAgICAgIGV4cGVjdChhKS50byBlcSgiXHUyMEFDIikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xMDIsMTQgKzEwMiwxNCBAQAogICAgIGRlc2NyaWJlICcuZW1wdHlfYnl0ZV9idWZmZXInIGRvCiAgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXInIGRvCiAgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCi0gICAgICAgIGIubGVuZ3RoLnNob3VsZCA9PSAwCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMCkKICAgICAgIGVuZAogCiAgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXIgb2YgZ2l2ZW4gc2l6ZScgZG8KICAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIgMgotICAgICAgICBiLmxlbmd0aC5zaG91bGQgPT0gMgotICAgICAgICBiWzBdLnNob3VsZCA9PSAwCi0gICAgICAgIGJbMV0uc2hvdWxkID09IDAKKyAgICAgICAgZXhwZWN0KGIubGVuZ3RoKS50byBlcSgyKQorICAgICAgICBleHBlY3QoYlswXSkudG8gZXEoMCkKKyAgICAgICAgZXhwZWN0KGJbMV0pLnRvIGVxKDApCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTE3LDE2ICsxMTcsMTYgQEAKICAgICAgIGl0ICdzaG91bGQgYmUgYSBuby1vcCcgZG8KICAgICAgICAgZSA9ICdTVFJJTkcnCiAgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyBlCi0gICAgICAgIGEuc2hvdWxkID09IGUKLSAgICAgICAgYS5zaG91bGQgYmUoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGUpCisgICAgICAgIGV4cGVjdChhKS50byBiZShlKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBkZXNjcmliZSAnLmdldF9zdHJpbmdfYnl0ZScgZG8KICAgICAgIGl0ICdzaG91bGQgZ2V0IHRoZSBieXRlIGF0IGluZGV4JyBkbwogICAgICAgICBzID0gIlx4NDFceDQyIgotICAgICAgICBUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAwKS5zaG91bGQgPT0gMHg0MQotICAgICAgICBUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAxKS5zaG91bGQgPT0gMHg0MgorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMCkpLnRvIGVxKDB4NDEpCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAxKSkudG8gZXEoMHg0MikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xMzQsOCArMTM0LDggQEAKICAgICAgIGl0ICdzaG91bGQgc2V0IGJ5dGUgdmFsdWUgYXQgaW5kZXgnIGRvCiAgICAgICAgIHMgPSAiXHg0MVx4NDIiCiAgICAgICAgIFRocmlmdDo6Qnl0ZXMuc2V0X3N0cmluZ19ieXRlKHMsIDAsIDB4NDMpCi0gICAgICAgIHNbMF0uc2hvdWxkID09IDB4NDMKLSAgICAgICAgcy5zaG91bGQgPT0gJ0NCJworICAgICAgICBleHBlY3Qoc1swXSkudG8gZXEoMHg0MykKKyAgICAgICAgZXhwZWN0KHMpLnRvIGVxKCdDQicpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTQzLDggKzE0Myw4IEBACiAgICAgICBpdCAnc2hvdWxkIGJlIGEgbm8tb3AnIGRvCiAgICAgICAgIGUgPSAnU1RSSU5HJwogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIgZQotICAgICAgICBhLnNob3VsZCA9PSBlCi0gICAgICAgIGEuc2hvdWxkIGJlKGUpCisgICAgICAgIGV4cGVjdChhKS50byBlcShlKQorICAgICAgICBleHBlY3QoYSkudG8gYmUoZSkKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xNTIsOCArMTUyLDggQEAKICAgICAgIGl0ICdzaG91bGQgYmUgYSBuby1vcCcgZG8KICAgICAgICAgZSA9ICdTVFJJTkcnCiAgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fc3RyaW5nIGUKLSAgICAgICAgYS5zaG91bGQgPT0gZQotICAgICAgICBhLnNob3VsZCBiZShlKQorICAgICAgICBleHBlY3QoYSkudG8gZXEoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGJlKGUpCiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2NsaWVudF9zcGVjLnJiCmluZGV4IGY4ZmZlOGEuLmQ1ZDRjZWUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2NsaWVudF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2NsaWVudF9zcGVjLnJiCkBAIC0yNiw3NCArMjYsNzMgQEAKICAgZW5kCiAKICAgYmVmb3JlKDplYWNoKSBkbwotICAgIEBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKKyAgICBAcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKICAgICBAY2xpZW50ID0gQ2xpZW50U3BlYy5uZXcoQHByb3QpCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6Q2xpZW50IGRvCiAgICAgaXQgInNob3VsZCByZS11c2UgaXByb3QgZm9yIG9wcm90IGlmIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkIiBkbwotICAgICAgQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAaXByb3QnKS5zaG91bGQgZXFsKEBwcm90KQotICAgICAgQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAb3Byb3QnKS5zaG91bGQgZXFsKEBwcm90KQorICAgICAgZXhwZWN0KEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQGlwcm90JykpLnRvIGVxbChAcHJvdCkKKyAgICAgIGV4cGVjdChAY2xpZW50Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0BvcHJvdCcpKS50byBlcWwoQHByb3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlbmQgYSB0ZXN0IG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMCkKLSAgICAgIG1vY2tfYXJncyA9IG1vY2soJyM8VGVzdE1lc3NhZ2VfYXJnczptb2NrPicpCi0gICAgICBtb2NrX2FyZ3Muc2hvdWxkX3JlY2VpdmUoOmZvbz0pLndpdGgoJ2ZvbycpCi0gICAgICBtb2NrX2FyZ3Muc2hvdWxkX3JlY2VpdmUoOmJhcj0pLndpdGgoNDIpCi0gICAgICBtb2NrX2FyZ3Muc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnRyYW5zKSBkbwotICAgICAgICBtb2NrKCd0cmFucycpLnRhcCBkbyB8dHJhbnN8Ci0gICAgICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAwKQorICAgICAgbW9ja19hcmdzID0gZG91YmxlKCcjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4nKQorICAgICAgZXhwZWN0KG1vY2tfYXJncykudG8gcmVjZWl2ZSg6Zm9vPSkud2l0aCgnZm9vJykKKyAgICAgIGV4cGVjdChtb2NrX2FyZ3MpLnRvIHJlY2VpdmUoOmJhcj0pLndpdGgoNDIpCisgICAgICBleHBlY3QobW9ja19hcmdzKS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRyYW5zKSBkbworICAgICAgICBkb3VibGUoJ3RyYW5zJykudGFwIGRvIHx0cmFuc3wKKyAgICAgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgICBlbmQKICAgICAgIGVuZAotICAgICAga2xhc3MgPSBzdHViKCJUZXN0TWVzc2FnZV9hcmdzIiwgOm5ldyA9PiBtb2NrX2FyZ3MpCisgICAgICBrbGFzcyA9IGRvdWJsZSgiVGVzdE1lc3NhZ2VfYXJncyIsIDpuZXcgPT4gbW9ja19hcmdzKQogICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlJywga2xhc3MsIDpmb28gPT4gJ2ZvbycsIDpiYXIgPT4gNDIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGluY3JlbWVudCB0aGUgc2VxdWVuY2UgaWQgd2hlbiBzZW5kaW5nIG1lc3NhZ2VzIiBkbwotICAgICAgcGVuZGluZyAiaXQgc2VlbXMgc2VxdWVuY2UgaWRzIGFyZSBjb21wbGV0ZWx5IGlnbm9yZWQgcmlnaHQgbm93IiBkbwotICAgICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCAgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDApLm9yZGVyZWQKLSAgICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlMicsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxKS5vcmRlcmVkCi0gICAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTMnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMikub3JkZXJlZAotICAgICAgICBAcHJvdC5zdHViISg6d3JpdGVfbWVzc2FnZV9lbmQpCi0gICAgICAgIEBwcm90LnN0dWIhKDp0cmFucykuYW5kX3JldHVybiBtb2NrKCJ0cmFucyIpLmFzX251bGxfb2JqZWN0Ci0gICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZScsIG1vY2soImFyZ3MgY2xhc3MiKS5hc19udWxsX29iamVjdCkKLSAgICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlMicsIG1vY2soImFyZ3MgY2xhc3MiKS5hc19udWxsX29iamVjdCkKLSAgICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlMycsIG1vY2soImFyZ3MgY2xhc3MiKS5hc19udWxsX29iamVjdCkKLSAgICAgIGVuZAorICAgICAgcGVuZGluZyAiaXQgc2VlbXMgc2VxdWVuY2UgaWRzIGFyZSBjb21wbGV0ZWx5IGlnbm9yZWQgcmlnaHQgbm93IgorICAgICAgQHByb3QuZXhwZWN0KDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsICBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMCkub3JkZXJlZAorICAgICAgQHByb3QuZXhwZWN0KDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTInLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMSkub3JkZXJlZAorICAgICAgQHByb3QuZXhwZWN0KDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTMnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMikub3JkZXJlZAorICAgICAgQHByb3Quc3R1YiEoOndyaXRlX21lc3NhZ2VfZW5kKQorICAgICAgQHByb3Quc3R1YiEoOnRyYW5zKS5hbmRfcmV0dXJuIGRvdWJsZSgidHJhbnMiKS5hc19udWxsX29iamVjdAorICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlJywgZG91YmxlKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCisgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UyJywgZG91YmxlKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCisgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UzJywgZG91YmxlKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlY2VpdmUgYSB0ZXN0IG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5hbmRfcmV0dXJuIFtuaWwsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAwXQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpCi0gICAgICBtb2NrX2tsYXNzID0gbW9jaygiIzxNb2NrQ2xhc3M6bW9jaz4iKQotICAgICAgbW9ja19rbGFzcy5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkKLSAgICAgIEBjbGllbnQucmVjZWl2ZV9tZXNzYWdlKHN0dWIoIk1vY2tDbGFzcyIsIDpuZXcgPT4gbW9ja19rbGFzcykpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikuYW5kX3JldHVybiBbbmlsLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMF0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkKKyAgICAgIG1vY2tfa2xhc3MgPSBkb3VibGUoIiM8TW9ja0NsYXNzOm1vY2s+IikKKyAgICAgIGV4cGVjdChtb2NrX2tsYXNzKS50byByZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KQorICAgICAgQGNsaWVudC5yZWNlaXZlX21lc3NhZ2UoZG91YmxlKCJNb2NrQ2xhc3MiLCA6bmV3ID0+IG1vY2tfa2xhc3MpKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBoYW5kbGUgcmVjZWl2ZWQgZXhjZXB0aW9ucyIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLmFuZF9yZXR1cm4gW25pbCwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgMF0KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQotICAgICAgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuIGRvCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikuYW5kX3JldHVybiBbbmlsLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6RVhDRVBUSU9OLCAwXQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQorICAgICAgZXhwZWN0KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24pLnRvIHJlY2VpdmUoOm5ldykgZG8KICAgICAgICAgU3RhbmRhcmRFcnJvci5uZXcudGFwIGRvIHxtb2NrX2V4Y3wKLSAgICAgICAgICBtb2NrX2V4Yy5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkKKyAgICAgICAgICBleHBlY3QobW9ja19leGMpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBsYW1iZGEgeyBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCisgICAgICBleHBlY3QgeyBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShuaWwpIH0udG8gcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvcikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2xvc2UgdGhlIHRyYW5zcG9ydCBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2VuZGluZyBhIG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zdHViISg6d3JpdGVfbWVzc2FnZV9iZWdpbikKLSAgICAgIEBwcm90LnNob3VsZF9ub3RfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpCi0gICAgICBtb2NrX2FyZ3MgPSBtb2NrKCIjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4iKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgICB0cmFucyA9IG1vY2soIk1vY2tUcmFuc3BvcnQiKQotICAgICAgQHByb3Quc3R1YiEoOnRyYW5zKS5hbmRfcmV0dXJuKHRyYW5zKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAga2xhc3MgPSBtb2NrKCJUZXN0TWVzc2FnZV9hcmdzIiwgOm5ldyA9PiBtb2NrX2FyZ3MpCi0gICAgICBsYW1iZGEgeyBAY2xpZW50LnNlbmRfbWVzc2FnZSgidGVzdE1lc3NhZ2UiLCBrbGFzcykgfS5zaG91bGQgcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvcikKKyAgICAgIGFsbG93KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKQorICAgICAgZXhwZWN0KEBwcm90KS5ub3RfdG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpCisgICAgICBtb2NrX2FyZ3MgPSBkb3VibGUoIiM8VGVzdE1lc3NhZ2VfYXJnczptb2NrPiIpCisgICAgICBleHBlY3QobW9ja19hcmdzKS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgICB0cmFucyA9IGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpCisgICAgICBhbGxvdyhAcHJvdCkudG8gcmVjZWl2ZSg6dHJhbnMpLmFuZF9yZXR1cm4odHJhbnMpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAga2xhc3MgPSBkb3VibGUoIlRlc3RNZXNzYWdlX2FyZ3MiLCA6bmV3ID0+IG1vY2tfYXJncykKKyAgICAgIGV4cGVjdCB7IEBjbGllbnQuc2VuZF9tZXNzYWdlKCJ0ZXN0TWVzc2FnZSIsIGtsYXNzKSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9jb21wYWN0X3Byb3RvY29sX3NwZWMucmIgYi9saWIvcmIvc3BlYy9jb21wYWN0X3Byb3RvY29sX3NwZWMucmIKaW5kZXggZGFhZDU4My4uNTEzZGQ2OSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2NvbXBhY3RfcHJvdG9jb2xfc3BlYy5yYgpAQCAtNDIsNyArNDIsNyBAQAogICAgICAgICBwcm90by5zZW5kKHdyaXRlcihwcmltaXRpdmVfdHlwZSksIHZhbHVlKQogICAgICAgICAjIHB1dHMgImJ1ZjogI3t0cmFucy5pbnNwZWN0X2J1ZmZlcn0iIGlmIHByaW1pdGl2ZV90eXBlID09IDppNjQKICAgICAgICAgcmVhZF9iYWNrID0gcHJvdG8uc2VuZChyZWFkZXIocHJpbWl0aXZlX3R5cGUpKQotICAgICAgICByZWFkX2JhY2suc2hvdWxkID09IHZhbHVlCisgICAgICAgIGV4cGVjdChyZWFkX2JhY2spLnRvIGVxKHZhbHVlKQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZApAQCAtNjIsMTAgKzYyLDEwIEBACiAKICAgICAgICAgcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpCiAgICAgICAgIG5hbWUsIHR5cGUsIGlkID0gcHJvdG8ucmVhZF9maWVsZF9iZWdpbgotICAgICAgICB0eXBlLnNob3VsZCA9PSB0aHJpZnRfdHlwZQotICAgICAgICBpZC5zaG91bGQgPT0gMTUKKyAgICAgICAgZXhwZWN0KHR5cGUpLnRvIGVxKHRocmlmdF90eXBlKQorICAgICAgICBleHBlY3QoaWQpLnRvIGVxKDE1KQogICAgICAgICByZWFkX2JhY2sgPSBwcm90by5zZW5kKHJlYWRlcihwcmltaXRpdmVfdHlwZSkpCi0gICAgICAgIHJlYWRfYmFjay5zaG91bGQgPT0gdmFsdWUKKyAgICAgICAgZXhwZWN0KHJlYWRfYmFjaykudG8gZXEodmFsdWUpCiAgICAgICAgIHByb3RvLnJlYWRfZmllbGRfZW5kCiAgICAgICBlbmQKICAgICBlbmQKQEAgLTc1LDEzICs3NSwxMyBAQAogICAgIHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CiAgICAgcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpCiAKLSAgICBzdHJ1Y3QgPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0Lm5ldworICAgIHN0cnVjdCA9IFRocmlmdDo6VGVzdDo6Q29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKICAgICAjIHNldHMgYW5kIG1hcHMgZG9uJ3QgaGFzaCB3ZWxsLi4uIG5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZS4KICAgICBzdHJ1Y3Qud3JpdGUocHJvdG8pCiAKLSAgICBzdHJ1Y3QyID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKKyAgICBzdHJ1Y3QyID0gVGhyaWZ0OjpUZXN0OjpDb21wYWN0UHJvdG9UZXN0U3RydWN0Lm5ldwogICAgIHN0cnVjdDIucmVhZChwcm90bykgICAgCi0gICAgc3RydWN0Mi5zaG91bGQgPT0gc3RydWN0CisgICAgZXhwZWN0KHN0cnVjdDIpLnRvIGVxKHN0cnVjdCkKICAgZW5kCiAKICAgaXQgInNob3VsZCBtYWtlIG1ldGhvZCBjYWxscyBjb3JyZWN0bHkiIGRvCkBAIC05MSwxOSArOTEsMTkgQEAKICAgICBjbGllbnRfaW5fdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKICAgICBjbGllbnRfaW5fcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcoY2xpZW50X2luX3RyYW5zKQogCi0gICAgcHJvY2Vzc29yID0gU3J2OjpQcm9jZXNzb3IubmV3KEphbmt5SGFuZGxlci5uZXcpCisgICAgcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpTcnY6OlByb2Nlc3Nvci5uZXcoSmFua3lIYW5kbGVyLm5ldykKIAotICAgIGNsaWVudCA9IFNydjo6Q2xpZW50Lm5ldyhjbGllbnRfaW5fcHJvdG8sIGNsaWVudF9vdXRfcHJvdG8pCisgICAgY2xpZW50ID0gVGhyaWZ0OjpUZXN0OjpTcnY6OkNsaWVudC5uZXcoY2xpZW50X2luX3Byb3RvLCBjbGllbnRfb3V0X3Byb3RvKQogICAgIGNsaWVudC5zZW5kX0phbmt5KDEpCiAgICAgIyBwdXRzIGNsaWVudF9vdXRfdHJhbnMuaW5zcGVjdF9idWZmZXIKICAgICBwcm9jZXNzb3IucHJvY2VzcyhjbGllbnRfb3V0X3Byb3RvLCBjbGllbnRfaW5fcHJvdG8pCi0gICAgY2xpZW50LnJlY3ZfSmFua3kuc2hvdWxkID09IDIKKyAgICBleHBlY3QoY2xpZW50LnJlY3ZfSmFua3kpLnRvIGVxKDIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBkZWFsIHdpdGggZmllbGRzIGZvbGxvd2luZyBmaWVsZHMgdGhhdCBoYXZlIG5vbi1kZWx0YSBpZHMiIGRvCi0gICAgYnJjcCA9IEJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3KAorICAgIGJyY3AgPSBUaHJpZnQ6OlRlc3Q6OkJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3KAogICAgICAgOmZpZWxkMSA9PiAiYmxhaCIsIAotICAgICAgOmZpZWxkMiA9PiBCaWdGaWVsZElkU3RydWN0Lm5ldygKKyAgICAgIDpmaWVsZDIgPT4gVGhyaWZ0OjpUZXN0OjpCaWdGaWVsZElkU3RydWN0Lm5ldygKICAgICAgICAgOmZpZWxkMSA9PiAic3RyaW5nMSIsIAogICAgICAgICA6ZmllbGQyID0+ICJzdHJpbmcyIiksIAogICAgICAgOmZpZWxkMyA9PiAzKQpAQCAtMTExLDIwICsxMTEsMjUgQEAKICAgICBieXRlcyA9IHNlci5zZXJpYWxpemUoYnJjcCkKIAogICAgIGRlc2VyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcpCi0gICAgYnJjcDIgPSBCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldworICAgIGJyY3AyID0gVGhyaWZ0OjpUZXN0OjpCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldwogICAgIGRlc2VyLmRlc2VyaWFsaXplKGJyY3AyLCBieXRlcykKLSAgICBicmNwMi5zaG91bGQgPT0gYnJjcAorICAgIGV4cGVjdChicmNwMikudG8gZXEoYnJjcCkKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGRlc2VyaWFsaXplIGFuIGVtcHR5IG1hcCB0byBhbiBlbXB0eSBoYXNoIiBkbwotICAgIHN0cnVjdCA9IFNpbmdsZU1hcFRlc3RTdHJ1Y3QubmV3KDppMzJfbWFwID0+IHt9KQorICAgIHN0cnVjdCA9IFRocmlmdDo6VGVzdDo6U2luZ2xlTWFwVGVzdFN0cnVjdC5uZXcoOmkzMl9tYXAgPT4ge30pCiAgICAgc2VyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3KQogICAgIGJ5dGVzID0gc2VyLnNlcmlhbGl6ZShzdHJ1Y3QpCiAKICAgICBkZXNlciA9IFRocmlmdDo6RGVzZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3KQotICAgIHN0cnVjdDIgPSBTaW5nbGVNYXBUZXN0U3RydWN0Lm5ldworICAgIHN0cnVjdDIgPSBUaHJpZnQ6OlRlc3Q6OlNpbmdsZU1hcFRlc3RTdHJ1Y3QubmV3CiAgICAgZGVzZXIuZGVzZXJpYWxpemUoc3RydWN0MiwgYnl0ZXMpCi0gICAgc3RydWN0LnNob3VsZCA9PSBzdHJ1Y3QyCisgICAgZXhwZWN0KHN0cnVjdCkudG8gZXEoc3RydWN0MikKKyAgZW5kCisgIAorICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKKyAgICBleHBlY3QoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKS50b19zKS50byBlcSgiY29tcGFjdChtZW1vcnkpIikKICAgZW5kCiAgIAogICBjbGFzcyBKYW5reUhhbmRsZXIKQEAgLTE0MSwzICsxNDYsMTMgQEAKICAgICAicmVhZF8je3N5bS50b19zfSIKICAgZW5kCiBlbmQKKworZGVzY3JpYmUgVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGRvCisgIGl0ICJzaG91bGQgY3JlYXRlIGEgQ29tcGFjdFByb3RvY29sIiBkbworICAgIGV4cGVjdChUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChkb3VibGUoIk1vY2tUcmFuc3BvcnQiKSkpLnRvIGJlX2luc3RhbmNlX29mKFRocmlmdDo6Q29tcGFjdFByb3RvY29sKQorICBlbmQKKworICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgZXhwZWN0KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcudG9fcykudG8gZXEoImNvbXBhY3QiKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvZXhjZXB0aW9uX3NwZWMucmIgYi9saWIvcmIvc3BlYy9leGNlcHRpb25fc3BlYy5yYgppbmRleCBkMWRhNjIxLi4zNzlhZTY5IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9leGNlcHRpb25fc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9leGNlcHRpb25fc3BlYy5yYgpAQCAtMjQsMTA3ICsyNCwxMDcgQEAKICAgZGVzY3JpYmUgVGhyaWZ0OjpFeGNlcHRpb24gZG8KICAgICBpdCAic2hvdWxkIGhhdmUgYW4gYWNjZXNzaWJsZSBtZXNzYWdlIiBkbwogICAgICAgZSA9IFRocmlmdDo6RXhjZXB0aW9uLm5ldygidGVzdCBtZXNzYWdlIikKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInRlc3QgbWVzc2FnZSIKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGVxKCJ0ZXN0IG1lc3NhZ2UiKQogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIGRvCiAgICAgaXQgInNob3VsZCBpbmhlcml0IGZyb20gVGhyaWZ0OjpFeGNlcHRpb24iIGRvCi0gICAgICBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLnN1cGVyY2xhc3Muc2hvdWxkID09IFRocmlmdDo6RXhjZXB0aW9uCisgICAgICBleHBlY3QoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zdXBlcmNsYXNzKS50byBlcShUaHJpZnQ6OkV4Y2VwdGlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaGF2ZSBhbiBhY2Nlc3NpYmxlIHR5cGUgYW5kIG1lc3NhZ2UiIGRvCiAgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcKLSAgICAgIGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTgotICAgICAgZS5tZXNzYWdlLnNob3VsZCBiZV9uaWwKKyAgICAgIGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV04pCisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBiZV9uaWwKICAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgInRlc3QgbWVzc2FnZSIpCi0gICAgICBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ECi0gICAgICBlLm1lc3NhZ2Uuc2hvdWxkID09ICJ0ZXN0IG1lc3NhZ2UiCisgICAgICBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCkKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGVxKCJ0ZXN0IG1lc3NhZ2UiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGEgc3RydWN0IG9mZiBvZiBhIHByb3RvY29sIiBkbwotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKAorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybigKICAgICAgICAgWyJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxXSwKICAgICAgICAgWyJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyXSwKICAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkLmFuZF9yZXR1cm4gInRlc3QgbWVzc2FnZSIKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkLmFuZF9yZXR1cm4gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lECi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSgyKS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQuYW5kX3JldHVybiAidGVzdCBtZXNzYWdlIgorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkLmFuZF9yZXR1cm4gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lECisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoMikudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3CiAgICAgICBlLnJlYWQocHJvdCkKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInRlc3QgbWVzc2FnZSIKLSAgICAgIGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lECisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgidGVzdCBtZXNzYWdlIikKKyAgICAgIGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBiYWQgZmllbGRzIHdoZW4gcmVhZGluZyBhIHN0cnVjdCIgZG8KLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoNSkudGltZXMuYW5kX3JldHVybigKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDUpLnRpbWVzLmFuZF9yZXR1cm4oCiAgICAgICAgIFsidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMl0sCiAgICAgICAgIFsidHlwZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMl0sCiAgICAgICAgIFsibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6Ok1BUCwgMV0sCiAgICAgICAgIFsibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgM10sCiAgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybiBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6Ok1BUCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDQpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybiBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6TUFQKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDQpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKICAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldwogICAgICAgZS5yZWFkKHByb3QpCi0gICAgICBlLm1lc3NhZ2Uuc2hvdWxkIGJlX25pbAotICAgICAgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRQorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gYmVfbmlsCisgICAgICBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgYSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIHN0cnVjdCB0byB0aGUgb3Byb3QiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInRlc3QgbWVzc2FnZSIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAidGVzdCBtZXNzYWdlIikKICAgICAgIGUud3JpdGUocHJvdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBuaWwgZmllbGRzIHdoZW4gd3JpdGluZyB0byB0aGUgb3Byb3QiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInRlc3QgbWVzc2FnZSIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInRlc3QgbWVzc2FnZSIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAogCiAgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcobmlsLCAidGVzdCBtZXNzYWdlIikKICAgICAgIGUud3JpdGUocHJvdCkKIAotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAogCiAgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lEKQogICAgICAgZS53cml0ZShwcm90KQogCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKICAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhuaWwpCiAgICAgICBlLndyaXRlKHByb3QpCkBAIC0xMzQsOCArMTM0LDggQEAKICAgZGVzY3JpYmUgVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgaGF2ZSBhbiBhY2Nlc3NpYmxlIHR5cGUiIGRvCiAgICAgICBwcm90ID0gVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbi5uZXcoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCwgIm1lc3NhZ2UiKQotICAgICAgcHJvdC50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUCi0gICAgICBwcm90Lm1lc3NhZ2Uuc2hvdWxkID09ICJtZXNzYWdlIgorICAgICAgZXhwZWN0KHByb3QudHlwZSkudG8gZXEoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCkKKyAgICAgIGV4cGVjdChwcm90Lm1lc3NhZ2UpLnRvIGVxKCJtZXNzYWdlIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2ZsYXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2ZsYXRfc3BlYy5yYgppbmRleCBmMzc4NzgyLi44OTMwNTZjIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9mbGF0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvZmxhdF9zcGVjLnJiCkBAIC0zMiw3ICszMiw3IEBACiAgICAgICJvdGhlcl9uYW1lc3BhY2UvcmVmZXJlbmNlZF9jb25zdGFudHMucmIiLAogICAgICAib3RoZXJfbmFtZXNwYWNlL3JlZmVyZW5jZWRfdHlwZXMucmIiCiAgICAgXS5lYWNoIGRvIHxuYW1lfAotICAgICAgRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpLnNob3VsZF9ub3QgYmVfdHJ1ZQorICAgICAgZXhwZWN0KEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKSkubm90X3RvIGJlX3RydXRoeQogICAgIGVuZAogICBlbmQKIApAQCAtNDQsMTkgKzQ0LDE5IEBACiAgICAgICJyZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCiAgICAgICJyZWZlcmVuY2VkX3R5cGVzLnJiIgogICAgIF0uZWFjaCBkbyB8bmFtZXwKLSAgICAgIEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKS5zaG91bGQgYmVfdHJ1ZQorICAgICAgZXhwZWN0KEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKSkudG8gYmVfdHJ1dGh5CiAgICAgZW5kCiAgIGVuZAogCiAgIGl0ICJoYXMgYSBzZXJ2aWNlIGNsYXNzIGluIHRoZSByaWdodCBwbGFjZSIgZG8KLSAgICBkZWZpbmVkPyhOYW1lc3BhY2VkU3BlY05hbWVzcGFjZTo6TmFtZXNwYWNlZE5vbmJsb2NraW5nU2VydmljZSkuc2hvdWxkIGJlX3RydWUKKyAgICBleHBlY3QoZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6Ok5hbWVzcGFjZWROb25ibG9ja2luZ1NlcnZpY2UpKS50byBiZV90cnV0aHkKICAgZW5kCiAKICAgaXQgImhhcyBhIHN0cnVjdCBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCi0gICAgZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6OkhlbGxvKS5zaG91bGQgYmVfdHJ1ZQorICAgIGV4cGVjdChkZWZpbmVkPyhOYW1lc3BhY2VkU3BlY05hbWVzcGFjZTo6SGVsbG8pKS50byBiZV90cnV0aHkKICAgZW5kCiAKICAgaXQgInJlcXVpcmVkIGFuIGluY2x1ZGVkIGZpbGUiIGRvCi0gICAgZGVmaW5lZD8oT3RoZXJOYW1lc3BhY2U6OlNvbWVFbnVtKS5zaG91bGQgYmVfdHJ1ZQorICAgIGV4cGVjdChkZWZpbmVkPyhPdGhlck5hbWVzcGFjZTo6U29tZUVudW0pKS50byBiZV90cnV0aHkKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2h0dHBfY2xpZW50X3NwZWMucmIgYi9saWIvcmIvc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiCmluZGV4IDc5M2ZjNzMuLmRmNDcyYWIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2h0dHBfY2xpZW50X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvaHR0cF9jbGllbnRfc3BlYy5yYgpAQCAtMjUsMjggKzI1LDMyIEBACiAgICAgYmVmb3JlKDplYWNoKSBkbwogICAgICAgQGNsaWVudCA9IFRocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydC5uZXcoImh0dHA6Ly9teS5kb21haW4uY29tL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIpCiAgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgQGNsaWVudC50b19zID09ICJodHRwOi8vbXkuZG9tYWluLmNvbS9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiCisgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFsd2F5cyBiZSBvcGVuIiBkbwotICAgICAgQGNsaWVudC5zaG91bGQgYmVfb3BlbgorICAgICAgZXhwZWN0KEBjbGllbnQpLnRvIGJlX29wZW4KICAgICAgIEBjbGllbnQuY2xvc2UKLSAgICAgIEBjbGllbnQuc2hvdWxkIGJlX29wZW4KKyAgICAgIGV4cGVjdChAY2xpZW50KS50byBiZV9vcGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBvc3QgdmlhIEhUVFAgYW5kIHJldHVybiB0aGUgcmVzdWx0cyIgZG8KICAgICAgIEBjbGllbnQud3JpdGUgImEgdGVzdCIKICAgICAgIEBjbGllbnQud3JpdGUgIiBmcmFtZSIKLSAgICAgIE5ldDo6SFRUUC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgODApLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAiYSB0ZXN0IGZyYW1lIiwgeyJDb250ZW50LVR5cGUiPT4iYXBwbGljYXRpb24veC10aHJpZnQifSkuYW5kX3JldHVybiBkbwotICAgICAgICAgICAgbW9jaygiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAotICAgICAgICAgICAgICByZXNwb25zZS5zaG91bGRfcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAiYSB0ZXN0IGZyYW1lIiwgeyJDb250ZW50LVR5cGUiPT4iYXBwbGljYXRpb24veC10aHJpZnQifSkgZG8KKyAgICAgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAorICAgICAgICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvIHJlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCiAgICAgICAgICAgICBlbmQKICAgICAgICAgICBlbmQKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICAgIEBjbGllbnQuZmx1c2gKLSAgICAgIEBjbGllbnQucmVhZCgxMCkuc2hvdWxkID09ICJkYXRhIgorICAgICAgZXhwZWN0KEBjbGllbnQucmVhZCgxMCkpLnRvIGVxKCJkYXRhIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VuZCBjdXN0b20gaGVhZGVycyBpZiBkZWZpbmVkIiBkbwpAQCAtNTUsMTggKzU5LDMzIEBACiAgICAgICBoZWFkZXJzID0geyJDb250ZW50LVR5cGUiPT4iYXBwbGljYXRpb24veC10aHJpZnQifS5tZXJnZShjdXN0b21faGVhZGVycykKIAogICAgICAgQGNsaWVudC5hZGRfaGVhZGVycyhjdXN0b21faGVhZGVycykKLSAgICAgIE5ldDo6SFRUUC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgODApLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIGhlYWRlcnMpLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgICAgIG1vY2soIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKLSAgICAgICAgICAgICAgcmVzcG9uc2Uuc2hvdWxkX3JlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA4MCkgZG8KKyAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8CisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgInRlc3QiLCBoZWFkZXJzKSBkbworICAgICAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8CisgICAgICAgICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8gcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKICAgICAgICAgICAgIGVuZAogICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgIGVuZAogICAgICAgQGNsaWVudC5mbHVzaAogICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCByZXNldCB0aGUgb3V0YnVmIG9uIEhUVFAgZmFpbHVyZXMnIGRvCisgICAgICBAY2xpZW50LndyaXRlICJ0ZXN0IgorCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA4MCkgZG8KKyAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8CisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgInRlc3QiLCB7IkNvbnRlbnQtVHlwZSI9PiJhcHBsaWNhdGlvbi94LXRocmlmdCJ9KSB7IHJhaXNlIE5ldDo6UmVhZFRpbWVvdXQgfQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBAY2xpZW50LmZsdXNoICByZXNjdWUKKyAgICAgIGV4cGVjdChAY2xpZW50Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QG91dGJ1ZikpLnRvIGVxKFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIpCisgICAgZW5kCisKICAgZW5kCiAKICAgZGVzY3JpYmUgJ3NzbCBlbmFibGVkJyBkbwpAQCAtODAsMjAgKzk5LDIwIEBACiAKICAgICAgIGNsaWVudC53cml0ZSAidGVzdCIKIAotICAgICAgTmV0OjpIVFRQLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA0NDMpLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnVzZV9zc2w9KS53aXRoKHRydWUpCi0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6dmVyaWZ5X21vZGU9KS53aXRoKE9wZW5TU0w6OlNTTDo6VkVSSUZZX1BFRVIpCi0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6cG9zdCkud2l0aChAc2VydmljZV9wYXRoLCAidGVzdCIsCi0gICAgICAgICAgICAgICJDb250ZW50LVR5cGUiID0+ICJhcHBsaWNhdGlvbi94LXRocmlmdCIpLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgICAgIG1vY2soIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKLSAgICAgICAgICAgICAgcmVzcG9uc2Uuc2hvdWxkX3JlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA0NDMpIGRvCisgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp1c2Vfc3NsPSkud2l0aCh0cnVlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp2ZXJpZnlfbW9kZT0pLndpdGgoT3BlblNTTDo6U1NMOjpWRVJJRllfUEVFUikKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6cG9zdCkud2l0aChAc2VydmljZV9wYXRoLCAidGVzdCIsCisgICAgICAgICAgICAgICJDb250ZW50LVR5cGUiID0+ICJhcHBsaWNhdGlvbi94LXRocmlmdCIpIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgogICAgICAgICAgICAgZW5kCiAgICAgICAgICAgZW5kCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgICBjbGllbnQuZmx1c2gKLSAgICAgIGNsaWVudC5yZWFkKDQpLnNob3VsZCA9PSAiZGF0YSIKKyAgICAgIGV4cGVjdChjbGllbnQucmVhZCg0KSkudG8gZXEoImRhdGEiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZXQgU1NMIHZlcmlmeSBtb2RlIHdoZW4gc3BlY2lmaWVkIiBkbwpAQCAtMTAxLDIwICsxMjAsMjAgQEAKICAgICAgICAgICA6c3NsX3ZlcmlmeV9tb2RlID0+IE9wZW5TU0w6OlNTTDo6VkVSSUZZX05PTkUpCiAKICAgICAgIGNsaWVudC53cml0ZSAidGVzdCIKLSAgICAgIE5ldDo6SFRUUC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgNDQzKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDp1c2Vfc3NsPSkud2l0aCh0cnVlKQotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnZlcmlmeV9tb2RlPSkud2l0aChPcGVuU1NMOjpTU0w6OlZFUklGWV9OT05FKQotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnBvc3QpLndpdGgoQHNlcnZpY2VfcGF0aCwgInRlc3QiLAotICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIiA9PiAiYXBwbGljYXRpb24veC10aHJpZnQiKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgICAgICBtb2NrKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8Ci0gICAgICAgICAgICAgIHJlc3BvbnNlLnNob3VsZF9yZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgZXhwZWN0KE5ldDo6SFRUUCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgNDQzKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgodHJ1ZSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dmVyaWZ5X21vZGU9KS53aXRoKE9wZW5TU0w6OlNTTDo6VkVSSUZZX05PTkUpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoQHNlcnZpY2VfcGF0aCwgInRlc3QiLAorICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIiA9PiAiYXBwbGljYXRpb24veC10aHJpZnQiKSBkbworICAgICAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8CisgICAgICAgICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8gcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKICAgICAgICAgICAgIGVuZAogICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgIGVuZAogICAgICAgY2xpZW50LmZsdXNoCi0gICAgICBjbGllbnQucmVhZCg0KS5zaG91bGQgPT0gImRhdGEiCisgICAgICBleHBlY3QoY2xpZW50LnJlYWQoNCkpLnRvIGVxKCJkYXRhIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2pzb25fcHJvdG9jb2xfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2pzb25fcHJvdG9jb2xfc3BlYy5yYgppbmRleCAyZjdmMWU2Li5mZTFhZjdiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9qc29uX3Byb3RvY29sX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiCkBAIC0zMCwyNTIgKzMwLDI1NyBAQAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGVzY2FwZWQgY2hhciIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fZXNjYXBlX2NoYXIoIlxuIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAnXHUwMDBhJworICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnXHUwMDBhJykKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9lc2NhcGVfY2hhcigiICIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gJ1x1MDAyMCcKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJ1x1MDAyMCcpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gY2hhciIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fY2hhcigiXG4iKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICdcXG4nCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCdcXG4nKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2NoYXIoIiAiKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICcgJworICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnICcpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fY2hhcigiXFwiKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcXFxcIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXFxcXCIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fY2hhcigiQCIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gJ0AnCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCdAJykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBzdHJpbmciIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX3N0cmluZygidGhpcyBpcyBhIFxcIGpzb25cbnN0cmluZyIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwidGhpcyBpcyBhIFxcXFwganNvblxcbnN0cmluZ1wiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJ0aGlzIGlzIGEgXFxcXCBqc29uXFxuc3RyaW5nXCIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGJhc2U2NCIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fYmFzZTY0KCJ0aGlzIGlzIGEgYmFzZTY0IHN0cmluZyIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiXCJkR2hwY3lCcGN5QmhJR0poYzJVMk5DQnpkSEpwYm1jPVxcblwiXCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcImRHaHBjeUJwY3lCaElHSmhjMlUyTkNCemRISnBibWM9XCIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGludGVnZXIiIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2ludGVnZXIoNDUpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjQ1IgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiNDUiKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2ludGVnZXIoMzMwMDApCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjMzMDAwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMzMwMDAiKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2ludGVnZXIoMzAwMDAwMDAwMCkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMzAwMDAwMDAwMCIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjMwMDAwMDAwMDAiKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2ludGVnZXIoNjAwMDAwMDAwMCkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiNjAwMDAwMDAwMCIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjYwMDAwMDAwMDAiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGRvdWJsZSIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fZG91YmxlKDEyLjMpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjEyLjMiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxMi4zIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoLTMuMjEpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIi0zLjIxIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiLTMuMjEiKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgoKCsxLjAvMC4wKS8oKzEuMC8wLjApKSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJOYU5cIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiTmFOXCIiKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgoKzEuMC8wLjApKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcIkluZmluaXR5XCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIkluZmluaXR5XCIiKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgoLTEuMC8wLjApKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcIi1JbmZpbml0eVwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCItSW5maW5pdHlcIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gb2JqZWN0IHN0YXJ0IiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9vYmplY3Rfc3RhcnQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAieyIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoInsiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIG9iamVjdCBlbmQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX29iamVjdF9lbmQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAifSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIn0iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGFycmF5IHN0YXJ0IiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9hcnJheV9zdGFydAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJbIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiWyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gYXJyYXkgZW5kIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9hcnJheV9lbmQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIl0iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBtZXNzYWdlIGJlZ2luIiBkbwogICAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigibmFtZSIsIDEyLCAzMikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiWzEsXCJuYW1lXCIsMTIsMzIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbMSxcIm5hbWVcIiwxMiwzMiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIG1lc3NhZ2UgZW5kIiBkbwogICAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9lbmQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIl0iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBzdHJ1Y3QgYmVnaW4iIGRvCiAgICAgICBAcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oIm5hbWUiKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJ7IgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgieyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIHN0cnVjdCBlbmQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9zdHJ1Y3RfZW5kCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIn0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgZmllbGQgYmVnaW4iIGRvCiAgICAgICBAcHJvdC53cml0ZV9maWVsZF9iZWdpbigibmFtZSIsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMzIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjMye1wicmVjXCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMntcInJlY1wiIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgZmllbGQgZW5kIiBkbwogICAgICAgQHByb3Qud3JpdGVfZmllbGRfZW5kCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIn0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgZmllbGQgc3RvcCIgZG8KICAgICAgIEBwcm90LndyaXRlX2ZpZWxkX3N0b3AKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgbWFwIGJlZ2luIiBkbwogICAgICAgQHByb3Qud3JpdGVfbWFwX2JlZ2luKFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgVGhyaWZ0OjpUeXBlczo6TElTVCwgMzIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIltcInJlY1wiLFwibHN0XCIsMzIseyIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIltcInJlY1wiLFwibHN0XCIsMzIseyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIG1hcCBlbmQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9tYXBfZW5kCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIn1dIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgifV0iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBsaXN0IGJlZ2luIiBkbwogICAgICAgQHByb3Qud3JpdGVfbGlzdF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDMyKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJbXCJyZWNcIiwzMiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIltcInJlY1wiLDMyIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgbGlzdCBlbmQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9saXN0X2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJdIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIHNldCBiZWdpbiIgZG8KICAgICAgIEBwcm90LndyaXRlX3NldF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDMyKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJbXCJyZWNcIiwzMiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIltcInJlY1wiLDMyIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgc2V0IGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX3NldF9lbmQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIl0iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBib29sIiBkbwogICAgICAgQHByb3Qud3JpdGVfYm9vbCh0cnVlKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIxIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMSIpCiAKICAgICAgIEBwcm90LndyaXRlX2Jvb2woZmFsc2UpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgYnl0ZSIgZG8KICAgICAgIEBwcm90LndyaXRlX2J5dGUoMTAwKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIxMDAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxMDAiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBpMTYiIGRvCiAgICAgICBAcHJvdC53cml0ZV9pMTYoMTAwMCkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMTAwMCIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEwMDAiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBpMzIiIGRvCiAgICAgICBAcHJvdC53cml0ZV9pMzIoMzAwMDAwMDAwMCkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMzAwMDAwMDAwMCIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjMwMDAwMDAwMDAiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBpNjQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9pNjQoNjAwMDAwMDAwMCkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiNjAwMDAwMDAwMCIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjYwMDAwMDAwMDAiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBkb3VibGUiIGRvCiAgICAgICBAcHJvdC53cml0ZV9kb3VibGUoMS4yMykKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMS4yMyIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEuMjMiKQogCiAgICAgICBAcHJvdC53cml0ZV9kb3VibGUoLTMyLjEpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIi0zMi4xIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiLTMyLjEiKQogCiAgICAgICBAcHJvdC53cml0ZV9kb3VibGUoKCgrMS4wLzAuMCkvKCsxLjAvMC4wKSkpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiTmFOXCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIk5hTlwiIikKIAogICAgICAgQHByb3Qud3JpdGVfZG91YmxlKCgrMS4wLzAuMCkpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiSW5maW5pdHlcIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiSW5maW5pdHlcIiIpCiAKICAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgoLTEuMC8wLjApKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcIi1JbmZpbml0eVwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCItSW5maW5pdHlcIiIpCiAgICAgZW5kCiAKICAgICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKICAgICAgIGl0ICdzaG91bGQgd3JpdGUgc3RyaW5nJyBkbwogICAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycpCiAgICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQotICAgICAgICBhLnNob3VsZCA9PSAnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkpCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQogICAgICAgZW5kCiAKICAgICAgIGl0ICdzaG91bGQgd3JpdGUgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzJyBkbwogICAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVyczogXHUyMEFDIFx1MjBBRCIpCiAgICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQotICAgICAgICBhLnNob3VsZCA9PSAiXCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQURcIiIuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkKLSAgICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQorICAgICAgICBleHBlY3QoYSkudG8gZXEoIlwidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEXCIiLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpKQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKICAgICAgIGVuZAogICAgIGVsc2UKICAgICAgIGl0ICdzaG91bGQgd3JpdGUgc3RyaW5nJyBkbwogICAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycpCi0gICAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInCisgICAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJykKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBiaW5hcnkiIGRvCiAgICAgICBAcHJvdC53cml0ZV9iaW5hcnkoInRoaXMgaXMgYSBiYXNlNjQgc3RyaW5nIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJcImRHaHBjeUJwY3lCaElHSmhjMlUyTkNCemRISnBibWM9XFxuXCJcIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiZEdocGN5QnBjeUJoSUdKaGMyVTJOQ0J6ZEhKcGJtYz1cIiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGxvbmcgYmluYXJ5IiBkbworICAgICAgQHByb3Qud3JpdGVfYmluYXJ5KCgwLi4uMjU2KS50b19hLnBhY2soJ0MqJykpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIkFBRUNBd1FGQmdjSUNRb0xEQTBPRHhBUkVoTVVGUllYR0JrYUd4d2RIaDhnSVNJakpDVW1KeWdwS2lzc0xTNHZNREV5TXpRMU5qYzRPVG83UEQwK1AwQkJRa05FUlVaSFNFbEtTMHhOVGs5UVVWSlRWRlZXVjFoWldsdGNYVjVmWUdGaVkyUmxabWRvYVdwcmJHMXViM0J4Y25OMGRYWjNlSGw2ZTN4OWZuK0FnWUtEaElXR2g0aUppb3VNalk2UGtKR1NrNVNWbHBlWW1acWJuSjJlbjZDaG9xT2twYWFucUttcXE2eXRycSt3c2JLenRMVzJ0N2k1dXJ1OHZiNi93TUhDdzhURnhzZkl5Y3JMek0zT3o5RFIwdFBVMWRiWDJObmEyOXpkM3QvZzRlTGo1T1htNStqcDZ1dnM3ZTd2OFBIeTgvVDE5dmY0K2ZyNy9QMysvdz09XCIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBnZXQgdHlwZSBuYW1lIGZvciB0eXBlIGlkIiBkbwogICAgICAgZXhwZWN0IHtAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNUT1ApfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQogICAgICAgZXhwZWN0IHtAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlZPSUQpfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQotICAgICAgQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpCT09MKS5zaG91bGQgPT0gInRmIgotICAgICAgQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpCWVRFKS5zaG91bGQgPT0gImk4IgotICAgICAgQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpET1VCTEUpLnNob3VsZCA9PSAiZGJsIgotICAgICAgQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpJMTYpLnNob3VsZCA9PSAiaTE2IgotICAgICAgQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpJMzIpLnNob3VsZCA9PSAiaTMyIgotICAgICAgQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpJNjQpLnNob3VsZCA9PSAiaTY0IgotICAgICAgQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpLnNob3VsZCA9PSAic3RyIgotICAgICAgQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpLnNob3VsZCA9PSAicmVjIgotICAgICAgQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpNQVApLnNob3VsZCA9PSAibWFwIgotICAgICAgQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTRVQpLnNob3VsZCA9PSAic2V0IgotICAgICAgQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpMSVNUKS5zaG91bGQgPT0gImxzdCIKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkJPT0wpKS50byBlcSgidGYiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6QllURSkpLnRvIGVxKCJpOCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpET1VCTEUpKS50byBlcSgiZGJsIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkkxNikpLnRvIGVxKCJpMTYiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6STMyKSkudG8gZXEoImkzMiIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpJNjQpKS50byBlcSgiaTY0IikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNUUklORykpLnRvIGVxKCJzdHIiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKSkudG8gZXEoInJlYyIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpNQVApKS50byBlcSgibWFwIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNFVCkpLnRvIGVxKCJzZXQiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6TElTVCkpLnRvIGVxKCJsc3QiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBnZXQgdHlwZSBpZCBmb3IgdHlwZSBuYW1lIiBkbwogICAgICAgZXhwZWN0IHtAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJwcCIpfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQotICAgICAgQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgidGYiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6Qk9PTAotICAgICAgQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTgiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6QllURQotICAgICAgQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiZGJsIikuc2hvdWxkID09IFRocmlmdDo6VHlwZXM6OkRPVUJMRQotICAgICAgQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTE2Iikuc2hvdWxkID09IFRocmlmdDo6VHlwZXM6OkkxNgotICAgICAgQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTMyIikuc2hvdWxkID09IFRocmlmdDo6VHlwZXM6OkkzMgotICAgICAgQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTY0Iikuc2hvdWxkID09IFRocmlmdDo6VHlwZXM6Okk2NAotICAgICAgQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgic3RyIikuc2hvdWxkID09IFRocmlmdDo6VHlwZXM6OlNUUklORwotICAgICAgQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgicmVjIikuc2hvdWxkID09IFRocmlmdDo6VHlwZXM6OlNUUlVDVAotICAgICAgQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgibWFwIikuc2hvdWxkID09IFRocmlmdDo6VHlwZXM6Ok1BUAotICAgICAgQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgic2V0Iikuc2hvdWxkID09IFRocmlmdDo6VHlwZXM6OlNFVAotICAgICAgQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgibHN0Iikuc2hvdWxkID09IFRocmlmdDo6VHlwZXM6OkxJU1QKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJ0ZiIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpCT09MKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImk4IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkJZVEUpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiZGJsIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpMTYiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6STE2KQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImkzMiIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpJMzIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTY0IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6Okk2NCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzdHIiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInJlYyIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgibWFwIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6Ok1BUCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzZXQiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6U0VUKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImxzdCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpMSVNUKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gc3ludGF4IGNoYXIiIGRvCkBAIC0yODcsNDcgKzI5Miw2OCBAQAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gZXNjYXBlIGNoYXIiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoJzAwNTQnKQotICAgICAgQHByb3QucmVhZF9qc29uX2VzY2FwZV9jaGFyLnNob3VsZCA9PSAnVCcKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fZXNjYXBlX2NoYXIpLnRvIGVxKCdUJykKKworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcIiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXFxcXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXFwiKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFwvXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXC8iKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXGIiKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxmXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXGYiKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxuXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXG4iKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxyXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXHIiKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFx0XCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXHQiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gc3RyaW5nIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJcIlxcUCIpCiAgICAgICBleHBlY3Qge0Bwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQogCi0gICAgICBAdHJhbnMud3JpdGUoIlwiXFxuXCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkuc2hvdWxkID09ICJcXG4iCi0KICAgICAgIEB0cmFucy53cml0ZSgiXCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmdcIiIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fc3RyaW5nLnNob3VsZCA9PSAidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIgorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcpLnRvIGVxKCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gYmFzZTY0IiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJcImRHaHBjeUJwY3lCaElIUmxjM1FnYzNSeWFXNW5cIiIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fYmFzZTY0LnNob3VsZCA9PSAidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIgorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9iYXNlNjQpLnRvIGVxKCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBpcyBqc29uIG51bWVyaWMiIGRvCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIkEiKS5zaG91bGQgPT0gZmFsc2UKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiKyIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIi0iKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCIuIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiMCIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjEiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCIyIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiMyIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjQiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCI1Iikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiNiIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjciKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCI4Iikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiOSIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIkUiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCJlIikuc2hvdWxkID09IHRydWUKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIkEiKSkudG8gZXEoZmFsc2UpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCIrIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCItIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCIuIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCIwIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCIxIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCIyIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCIzIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCI0IikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCI1IikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCI2IikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCI3IikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCI4IikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCI5IikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCJFIikpLnRvIGVxKHRydWUpCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCJlIikpLnRvIGVxKHRydWUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBudW1lcmljIGNoYXJzIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCIxLjQ1M0U0NVQiKQotICAgICAgQHByb3QucmVhZF9qc29uX251bWVyaWNfY2hhcnMuc2hvdWxkID09ICIxLjQ1M0U0NSIKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fbnVtZXJpY19jaGFycykudG8gZXEoIjEuNDUzRTQ1IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIGludGVnZXIiIGRvCkBAIC0zMzYsNyArMzYyLDcgQEAKICAgICAgIEBwcm90LnJlYWRfc3RyaW5nCiAKICAgICAgIEB0cmFucy53cml0ZSgiMTQ1M1QiKQotICAgICAgQHByb3QucmVhZF9qc29uX2ludGVnZXIuc2hvdWxkID09IDE0NTMKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25faW50ZWdlcikudG8gZXEoMTQ1MykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIGRvdWJsZSIgZG8KQEAgLTM0OCwzNyArMzc0LDM3IEBACiAgICAgICBleHBlY3Qge0Bwcm90LnJlYWRfanNvbl9kb3VibGV9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24pCiAKICAgICAgIEB0cmFucy53cml0ZSgiMS40NTNlMDFcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9kb3VibGUuc2hvdWxkID09IDE0LjUzCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2RvdWJsZSkudG8gZXEoMTQuNTMpCiAgICAgICBAcHJvdC5yZWFkX3N0cmluZwogCiAgICAgICBAdHJhbnMud3JpdGUoIlwiTmFOXCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX2RvdWJsZS5uYW4/LnNob3VsZCA9PSB0cnVlCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2RvdWJsZS5uYW4/KS50byBlcSh0cnVlKQogCiAgICAgICBAdHJhbnMud3JpdGUoIlwiSW5maW5pdHlcIiIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fZG91YmxlLnNob3VsZCA9PSArMS4wLzAuMAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUpLnRvIGVxKCsxLjAvMC4wKQogCiAgICAgICBAdHJhbnMud3JpdGUoIlwiLUluZmluaXR5XCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX2RvdWJsZS5zaG91bGQgPT0gLTEuMC8wLjAKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fZG91YmxlKS50byBlcSgtMS4wLzAuMCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIG9iamVjdCBzdGFydCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgieyIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fb2JqZWN0X3N0YXJ0LnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fb2JqZWN0X3N0YXJ0KS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBvYmplY3QgZW5kIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJ9IikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9vYmplY3RfZW5kLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fb2JqZWN0X2VuZCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gYXJyYXkgc3RhcnQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIlsiKQotICAgICAgQHByb3QucmVhZF9qc29uX2FycmF5X3N0YXJ0LnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fYXJyYXlfc3RhcnQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIGFycmF5IGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiXSIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fYXJyYXlfZW5kLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fYXJyYXlfZW5kKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWRfbWVzc2FnZV9iZWdpbiIgZG8KQEAgLTM4NiwxMjggKzQxMiwxNDEgQEAKICAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9tZXNzYWdlX2JlZ2lufS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQogCiAgICAgICBAdHJhbnMud3JpdGUoIlsxLFwibmFtZVwiLDEyLDMyXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4uc2hvdWxkID09IFsibmFtZSIsIDEyLCAzMl0KKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4pLnRvIGVxKFsibmFtZSIsIDEyLCAzMl0pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgbWVzc2FnZSBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIl0iKQotICAgICAgQHByb3QucmVhZF9tZXNzYWdlX2VuZC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tZXNzYWdlX2VuZCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIHN0cnVjdCBiZWdpbiIgZG8KICAgICAgIEB0cmFucy53cml0ZSgieyIpCi0gICAgICBAcHJvdC5yZWFkX3N0cnVjdF9iZWdpbi5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zdHJ1Y3RfYmVnaW4pLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBzdHJ1Y3QgZW5kIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJ9IikKLSAgICAgIEBwcm90LnJlYWRfc3RydWN0X2VuZC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zdHJ1Y3RfZW5kKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgZmllbGQgYmVnaW4iIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIjF7XCJyZWNcIiIpCi0gICAgICBAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luLnNob3VsZCA9PSBbbmlsLCAxMiwgMV0KKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKS50byBlcShbbmlsLCAxMiwgMV0pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgZmllbGQgZW5kIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJ9IikKLSAgICAgIEBwcm90LnJlYWRfZmllbGRfZW5kLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2ZpZWxkX2VuZCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIG1hcCBiZWdpbiIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiW1wicmVjXCIsXCJsc3RcIiwyLHsiKQotICAgICAgQHByb3QucmVhZF9tYXBfYmVnaW4uc2hvdWxkID09IFsxMiwgMTUsIDJdCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tYXBfYmVnaW4pLnRvIGVxKFsxMiwgMTUsIDJdKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIG1hcCBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIn1dIikKLSAgICAgIEBwcm90LnJlYWRfbWFwX2VuZC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tYXBfZW5kKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgbGlzdCBiZWdpbiIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiW1wicmVjXCIsMlwiXCIiKQotICAgICAgQHByb3QucmVhZF9saXN0X2JlZ2luLnNob3VsZCA9PSBbMTIsIDJdCisgICAgICBleHBlY3QoQHByb3QucmVhZF9saXN0X2JlZ2luKS50byBlcShbMTIsIDJdKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGxpc3QgZW5kIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJdIikKLSAgICAgIEBwcm90LnJlYWRfbGlzdF9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbGlzdF9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBzZXQgYmVnaW4iIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIltcInJlY1wiLDJcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfc2V0X2JlZ2luLnNob3VsZCA9PSBbMTIsIDJdCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zZXRfYmVnaW4pLnRvIGVxKFsxMiwgMl0pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgc2V0IGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiXSIpCi0gICAgICBAcHJvdC5yZWFkX3NldF9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc2V0X2VuZCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGJvb2wiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIjBcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfYm9vbC5zaG91bGQgPT0gZmFsc2UKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2Jvb2wpLnRvIGVxKGZhbHNlKQogICAgICAgQHByb3QucmVhZF9zdHJpbmcKIAogICAgICAgQHRyYW5zLndyaXRlKCIxXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2Jvb2wuc2hvdWxkID09IHRydWUKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2Jvb2wpLnRvIGVxKHRydWUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgYnl0ZSIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiNjBcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfYnl0ZS5zaG91bGQgPT0gNjAKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2J5dGUpLnRvIGVxKDYwKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGkxNiIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiMTAwMFwiXCIiKQotICAgICAgQHByb3QucmVhZF9pMTYuc2hvdWxkID09IDEwMDAKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2kxNikudG8gZXEoMTAwMCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBpMzIiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIjMwMDAwMDAwMDBcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfaTMyLnNob3VsZCA9PSAzMDAwMDAwMDAwCisgICAgICBleHBlY3QoQHByb3QucmVhZF9pMzIpLnRvIGVxKDMwMDAwMDAwMDApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgaTY0IiBkbwogICAgICAgQHRyYW5zLndyaXRlKCI2MDAwMDAwMDAwXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2k2NC5zaG91bGQgPT0gNjAwMDAwMDAwMAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTY0KS50byBlcSg2MDAwMDAwMDAwKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGRvdWJsZSIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiMTIuMjNcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfZG91YmxlLnNob3VsZCA9PSAxMi4yMworICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZG91YmxlKS50byBlcSgxMi4yMykKICAgICBlbmQKIAogICAgIGlmIFJVQllfVkVSU0lPTiA+PSAnMS45JwogICAgICAgaXQgJ3Nob3VsZCByZWFkIHN0cmluZycgZG8KICAgICAgICAgQHRyYW5zLndyaXRlKCcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkpCiAgICAgICAgIGEgPSBAcHJvdC5yZWFkX3N0cmluZwotICAgICAgICBhLnNob3VsZCA9PSAndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJwotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6VVRGXzgKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnKQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQogICAgICAgZW5kCiAKICAgICAgIGl0ICdzaG91bGQgcmVhZCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMnIGRvCiAgICAgICAgIEB0cmFucy53cml0ZSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVyczogXHUyMEFDIFx1MjBBRCInLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpKQogICAgICAgICBhID0gQHByb3QucmVhZF9zdHJpbmcKLSAgICAgICAgYS5zaG91bGQgPT0gInRoaXMgaXMgYSB0ZXN0IHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVyczogXHUyMEFDIFx1MjBBRCIKLSAgICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OlVURl84CisgICAgICAgIGV4cGVjdChhKS50byBlcSgidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEIikKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKICAgICAgIGVuZAogICAgIGVsc2UKICAgICAgIGl0ICdzaG91bGQgcmVhZCBzdHJpbmcnIGRvCiAgICAgICAgIEB0cmFucy53cml0ZSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInKQotICAgICAgICBAcHJvdC5yZWFkX3N0cmluZy5zaG91bGQgPT0gJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycKKyAgICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc3RyaW5nKS50byBlcSgndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJykKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGJpbmFyeSIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiXCJkR2hwY3lCcGN5QmhJSFJsYzNRZ2MzUnlhVzVuXCIiKQotICAgICAgQHByb3QucmVhZF9iaW5hcnkuc2hvdWxkID09ICJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciCisgICAgICBleHBlY3QoQHByb3QucmVhZF9iaW5hcnkpLnRvIGVxKCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGxvbmcgYmluYXJ5IiBkbworICAgICAgQHRyYW5zLndyaXRlKCJcIkFBRUNBd1FGQmdjSUNRb0xEQTBPRHhBUkVoTVVGUllYR0JrYUd4d2RIaDhnSVNJakpDVW1KeWdwS2lzc0xTNHZNREV5TXpRMU5qYzRPVG83UEQwK1AwQkJRa05FUlVaSFNFbEtTMHhOVGs5UVVWSlRWRlZXVjFoWldsdGNYVjVmWUdGaVkyUmxabWRvYVdwcmJHMXViM0J4Y25OMGRYWjNlSGw2ZTN4OWZuK0FnWUtEaElXR2g0aUppb3VNalk2UGtKR1NrNVNWbHBlWW1acWJuSjJlbjZDaG9xT2twYWFucUttcXE2eXRycSt3c2JLenRMVzJ0N2k1dXJ1OHZiNi93TUhDdzhURnhzZkl5Y3JMek0zT3o5RFIwdFBVMWRiWDJObmEyOXpkM3QvZzRlTGo1T1htNStqcDZ1dnM3ZTd2OFBIeTgvVDE5dmY0K2ZyNy9QMysvdz09XCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYmluYXJ5LmJ5dGVzLnRvX2EpLnRvIGVxKCgwLi4uMjU2KS50b19hKQorICAgIGVuZAorICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHByb3QudG9fcykudG8gZXEoImpzb24obWVtb3J5KSIpCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgSnNvblByb3RvY29sIiBkbwotICAgICAgVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2wobW9jaygiTW9ja1RyYW5zcG9ydCIpKS5zaG91bGQgYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpKc29uUHJvdG9jb2wpCisgICAgICBleHBlY3QoVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6Okpzb25Qcm90b2NvbCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJqc29uIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL25hbWVzcGFjZWRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL25hbWVzcGFjZWRfc3BlYy5yYgppbmRleCAzMTM3OWQ5Li40ZDZkMzY5IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvbmFtZXNwYWNlZF9zcGVjLnJiCkBAIC0zMiw3ICszMiw3IEBACiAgICAgICJvdGhlcl9uYW1lc3BhY2UvcmVmZXJlbmNlZF9jb25zdGFudHMucmIiLAogICAgICAib3RoZXJfbmFtZXNwYWNlL3JlZmVyZW5jZWRfdHlwZXMucmIiCiAgICAgXS5lYWNoIGRvIHxuYW1lfAotICAgICAgRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpLnNob3VsZCBiZV90cnVlCisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS50byBiZV90cnV0aHkKICAgICBlbmQKICAgZW5kCiAKQEAgLTQ0LDIwICs0NCwyMCBAQAogICAgICAicmVmZXJlbmNlZF9jb25zdGFudHMucmIiLAogICAgICAicmVmZXJlbmNlZF90eXBlcy5yYiIKICAgICBdLmVhY2ggZG8gfG5hbWV8Ci0gICAgICBGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkuc2hvdWxkX25vdCBiZV90cnVlCisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS5ub3RfdG8gYmVfdHJ1dGh5CiAgICAgZW5kCiAgIGVuZAogCiAgIGl0ICJoYXMgYSBzZXJ2aWNlIGNsYXNzIGluIHRoZSByaWdodCBwbGFjZSIgZG8KLSAgICBkZWZpbmVkPyhOYW1lc3BhY2VkU3BlY05hbWVzcGFjZTo6TmFtZXNwYWNlZE5vbmJsb2NraW5nU2VydmljZSkuc2hvdWxkIGJlX3RydWUKKyAgICBleHBlY3QoZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6Ok5hbWVzcGFjZWROb25ibG9ja2luZ1NlcnZpY2UpKS50byBiZV90cnV0aHkKICAgZW5kCiAKICAgaXQgImhhcyBhIHN0cnVjdCBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCi0gICAgZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6OkhlbGxvKS5zaG91bGQgYmVfdHJ1ZQorICAgIGV4cGVjdChkZWZpbmVkPyhOYW1lc3BhY2VkU3BlY05hbWVzcGFjZTo6SGVsbG8pKS50byBiZV90cnV0aHkKICAgZW5kCiAKICAgaXQgInJlcXVpcmVkIGFuIGluY2x1ZGVkIGZpbGUiIGRvCi0gICAgZGVmaW5lZD8oT3RoZXJOYW1lc3BhY2U6OlNvbWVFbnVtKS5zaG91bGQgYmVfdHJ1ZQorICAgIGV4cGVjdChkZWZpbmVkPyhPdGhlck5hbWVzcGFjZTo6U29tZUVudW0pKS50byBiZV90cnV0aHkKICAgZW5kCiAKICAgaXQgImV4dGVuZGVkIGEgc2VydmljZSIgZG8KZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL25vbmJsb2NraW5nX3NlcnZlcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIKaW5kZXggNzEyY2Y0NS4uNjEzZDg4MyAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIKQEAgLTE3Niw4ICsxNzYsOCBAQAogCiAgICAgaXQgInNob3VsZCBoYW5kbGUgYmFzaWMgbWVzc2FnZSBwYXNzaW5nIiBkbwogICAgICAgY2xpZW50ID0gc2V0dXBfY2xpZW50Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcodHJ1ZSkuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldwotICAgICAgY2xpZW50LmdyZWV0aW5nKGZhbHNlKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnQWxvaGEhJykKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcodHJ1ZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcoZmFsc2UpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKSkKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KICAgICBlbmQKIApAQCAtMTk1LDcgKzE5NSw3IEBACiAgICAgICBlbmQKICAgICAgIDQudGltZXMgeyB0cmFuc19xdWV1ZS5wb3AgfQogICAgICAgc2V0dXBfY2xpZW50LnVuYmxvY2soNCkKLSAgICAgIDQudGltZXMgeyBxdWV1ZS5wb3Auc2hvdWxkIGJlX3RydWUgfQorICAgICAgNC50aW1lcyB7IGV4cGVjdChxdWV1ZS5wb3ApLnRvIGJlX3RydXRoeSB9CiAgICAgICBAc2VydmVyLnNodXRkb3duCiAgICAgZW5kCiAKQEAgLTIxMiwxNSArMjEyLDE1IEBACiAgICAgICBxdWV1ZXNbNF0gPDwgOmhlbGxvCiAgICAgICBxdWV1ZXNbNV0gPDwgOmhlbGxvCiAgICAgICBxdWV1ZXNbNl0gPDwgOmhlbGxvCi0gICAgICAzLnRpbWVzIHsgcmVzdWx0LnBvcC5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3IH0KLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3CisgICAgICAzLnRpbWVzIHsgZXhwZWN0KHJlc3VsdC5wb3ApLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykgfQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyh0cnVlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQogICAgICAgcXVldWVzWzVdIDw8IFs6dW5ibG9jaywgNF0KLSAgICAgIDQudGltZXMgeyByZXN1bHQucG9wLnNob3VsZCBiZV90cnVlIH0KKyAgICAgIDQudGltZXMgeyBleHBlY3QocmVzdWx0LnBvcCkudG8gYmVfdHJ1dGh5IH0KICAgICAgIHF1ZXVlc1syXSA8PCA6aGVsbG8KLSAgICAgIHJlc3VsdC5wb3Auc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldwotICAgICAgY2xpZW50LmdyZWV0aW5nKGZhbHNlKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnQWxvaGEhJykKKyAgICAgIGV4cGVjdChyZXN1bHQucG9wKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKGZhbHNlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnQWxvaGEhJykpCiAgICAgICA3LnRpbWVzIHsgcXVldWVzLnNoaWZ0IDw8IDpleGl0IH0KLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3CisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCiAgICAgICBAc2VydmVyLnNodXRkb3duCiAgICAgZW5kCiAKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgICAgY2xpZW50ID0gc2V0dXBfY2xpZW50CiAgICAgICBjbGllbnQuZ3JlZXRpbmcoZmFsc2UpICMgZm9yY2UgYSBtZXNzYWdlIHBhc3MKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KLSAgICAgIEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikuc2hvdWxkIGJlX2FuX2luc3RhbmNlX29mKFRocmVhZCkKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDIpKS50byBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNvbnRpbnVlIHByb2Nlc3NpbmcgYWN0aXZlIG1lc3NhZ2VzIHdoZW4gc2h1dHRpbmcgZG93biIgZG8KQEAgLTIzOCw4ICsyMzgsOCBAQAogICAgICAgY2xpZW50IDw8IDpzbGVlcAogICAgICAgc2xlZXAgMC4xICMgZ2l2ZSB0aGUgc2VydmVyIHRpbWUgdG8gc3RhcnQgcHJvY2Vzc2luZyB0aGUgY2xpZW50J3MgbWVzc2FnZQogICAgICAgQHNlcnZlci5zaHV0ZG93bgotICAgICAgQHNlcnZlcl90aHJlYWQuam9pbigyKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoVGhyZWFkKQotICAgICAgcmVzdWx0LnBvcC5zaG91bGQgPT0gOnNsZXB0CisgICAgICBleHBlY3QoQHNlcnZlcl90aHJlYWQuam9pbigyKSkudG8gYmVfYW5faW5zdGFuY2Vfb2YoVGhyZWFkKQorICAgICAgZXhwZWN0KHJlc3VsdC5wb3ApLnRvIGVxKDpzbGVwdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQga2lsbCBhY3RpdmUgbWVzc2FnZXMgd2hlbiB0aGV5IGRvbid0IGV4cGlyZSB3aGlsZSBzaHV0dGluZyBkb3duIiBkbwpAQCAtMjQ5LDE1ICsyNDksMTUgQEAKICAgICAgIHNsZWVwIDAuMSAjIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIGNsaWVudCdzIG1lc3NhZ2UKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24oMSkKICAgICAgIEBjYXRjaF9leGNlcHRpb25zID0gdHJ1ZQotICAgICAgQHNlcnZlcl90aHJlYWQuam9pbigzKS5zaG91bGRfbm90IGJlX25pbAotICAgICAgcmVzdWx0LnNob3VsZCBiZV9lbXB0eQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMykpLm5vdF90byBiZV9uaWwKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGJlX2VtcHR5CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFsbG93IHNodXR0aW5nIGRvd24gaW4gcmVzcG9uc2UgdG8gYSBtZXNzYWdlIiBkbwogICAgICAgY2xpZW50ID0gc2V0dXBfY2xpZW50Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcodHJ1ZSkuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldworICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyh0cnVlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQogICAgICAgY2xpZW50LnNodXRkb3duCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDIpLnNob3VsZF9ub3QgYmVfbmlsCisgICAgICBleHBlY3QoQHNlcnZlcl90aHJlYWQuam9pbigyKSkubm90X3RvIGJlX25pbAogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvcHJvY2Vzc29yX3NwZWMucmIgYi9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYgppbmRleCA5ODlmNWNjLi5kMzA1NTNmIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYgpAQCAtMjcsNTIgKzI3LDUyIEBACiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpQcm9jZXNzb3IgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAcHJvY2Vzc29yID0gUHJvY2Vzc29yU3BlYy5uZXcobW9jaygiTW9ja0hhbmRsZXIiKSkKLSAgICAgIEBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKKyAgICAgIEBwcm9jZXNzb3IgPSBQcm9jZXNzb3JTcGVjLm5ldyhkb3VibGUoIk1vY2tIYW5kbGVyIikpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKICAgICBlbmQKIAogICAgIGRlZiBtb2NrX3RyYW5zKG9iaikKLSAgICAgIG9iai5zaG91bGRfcmVjZWl2ZSg6dHJhbnMpLm9yZGVyZWQuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJ0cmFucyIpLnRhcCBkbyB8dHJhbnN8Ci0gICAgICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCisgICAgICBleHBlY3Qob2JqKS50byByZWNlaXZlKDp0cmFucykub3JkZXJlZCBkbworICAgICAgICBkb3VibGUoInRyYW5zIikudGFwIGRvIHx0cmFuc3wKKyAgICAgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNhbGwgcHJvY2Vzc188bWVzc2FnZT4gd2hlbiBpdCByZWNlaXZlcyB0aGF0IG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxN10KLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3NfdGVzdE1lc3NhZ2UpLndpdGgoMTcsIEBwcm90LCBAcHJvdCkub3JkZXJlZAotICAgICAgQHByb2Nlc3Nvci5wcm9jZXNzKEBwcm90LCBAcHJvdCkuc2hvdWxkID09IHRydWUKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxN10KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzX3Rlc3RNZXNzYWdlKS53aXRoKDE3LCBAcHJvdCwgQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yLnByb2Nlc3MoQHByb3QsIEBwcm90KSkudG8gZXEodHJ1ZSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gQXBwbGljYXRpb25FeGNlcHRpb24gd2hlbiB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBjYW5ub3QgYmUgcHJvY2Vzc2VkIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuIFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgNF0KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIDQpLm9yZGVyZWQKLSAgICAgIGUgPSBtb2NrKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24pCi0gICAgICBlLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAotICAgICAgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAiVW5rbm93biBmdW5jdGlvbiB0ZXN0TWVzc2FnZSIpLmFuZF9yZXR1cm4oZSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybiBbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDRdCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6RVhDRVBUSU9OLCA0KS5vcmRlcmVkCisgICAgICBlID0gZG91YmxlKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24pCisgICAgICBleHBlY3QoZSkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uKS50byByZWNlaXZlKDpuZXcpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJVbmtub3duIGZ1bmN0aW9uIHRlc3RNZXNzYWdlIikuYW5kX3JldHVybihlKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAogICAgICAgbW9ja190cmFucyhAcHJvdCkKICAgICAgIEBwcm9jZXNzb3IucHJvY2VzcyhAcHJvdCwgQHByb3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgYXJncyBvZmYgdG8gdGhlIGFyZ3MgY2xhc3MiIGRvCi0gICAgICBhcmdzX2NsYXNzID0gbW9jaygiTW9ja0FyZ3NDbGFzcyIpCi0gICAgICBhcmdzID0gbW9jaygiIzxNb2NrQXJnc0NsYXNzOm1vY2s+IikudGFwIGRvIHxhcmdzfAotICAgICAgICBhcmdzLnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KS5vcmRlcmVkCisgICAgICBhcmdzX2NsYXNzID0gZG91YmxlKCJNb2NrQXJnc0NsYXNzIikKKyAgICAgIGFyZ3MgPSBkb3VibGUoIiM8TW9ja0FyZ3NDbGFzczptb2NrPiIpLnRhcCBkbyB8YXJnc3wKKyAgICAgICAgZXhwZWN0KGFyZ3MpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpLm9yZGVyZWQKICAgICAgIGVuZAotICAgICAgYXJnc19jbGFzcy5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuIGFyZ3MKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKS5vcmRlcmVkCi0gICAgICBAcHJvY2Vzc29yLnJlYWRfYXJncyhAcHJvdCwgYXJnc19jbGFzcykuc2hvdWxkIGVxbChhcmdzKQorICAgICAgZXhwZWN0KGFyZ3NfY2xhc3MpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybiBhcmdzCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yLnJlYWRfYXJncyhAcHJvdCwgYXJnc19jbGFzcykpLnRvIGVxbChhcmdzKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBvdXQgYSByZXBseSB3aGVuIGFza2VkIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZLCAyMykub3JkZXJlZAotICAgICAgcmVzdWx0ID0gbW9jaygiTW9ja1Jlc3VsdCIpCi0gICAgICByZXN1bHQuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFksIDIzKS5vcmRlcmVkCisgICAgICByZXN1bHQgPSBkb3VibGUoIk1vY2tSZXN1bHQiKQorICAgICAgZXhwZWN0KHJlc3VsdCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKICAgICAgIG1vY2tfdHJhbnMoQHByb3QpCiAgICAgICBAcHJvY2Vzc29yLndyaXRlX3Jlc3VsdChyZXN1bHQsIEBwcm90LCAndGVzdE1lc3NhZ2UnLCAyMykKICAgICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYgppbmRleCA1OTliNDU0Li4yYTdkYzZkIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zZXJpYWxpemVyX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiCkBAIC0yNSwxOSArMjUsMTkgQEAKICAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSBzdHJ1Y3RzIHRvIGJpbmFyeSBieSBkZWZhdWx0IiBkbwogICAgICAgc2VyaWFsaXplciA9IFRocmlmdDo6U2VyaWFsaXplci5uZXcoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcpCiAgICAgICBkYXRhID0gc2VyaWFsaXplci5zZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiJ0VsbG8gZ3V2J25vciEiKSkKLSAgICAgIGRhdGEuc2hvdWxkID09ICJceDBCXHgwMFx4MDFceDAwXHgwMFx4MDBceDBFJ0VsbG8gZ3V2J25vciFceDAwIgorICAgICAgZXhwZWN0KGRhdGEpLnRvIGVxKCJceDBCXHgwMFx4MDFceDAwXHgwMFx4MDBceDBFJ0VsbG8gZ3V2J25vciFceDAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIHN0cnVjdHMgdG8gdGhlIGdpdmVuIHByb3RvY29sIiBkbwotICAgICAgcHJvdG9jb2wgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoImdyZWV0aW5nIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgiR29vZCBkYXkiKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCi0gICAgICBwcm90b2NvbF9mYWN0b3J5ID0gbW9jaygiUHJvdG9jb2xGYWN0b3J5IikKLSAgICAgIHByb3RvY29sX2ZhY3Rvcnkuc3R1YiEoOmdldF9wcm90b2NvbCkuYW5kX3JldHVybihwcm90b2NvbCkKKyAgICAgIHByb3RvY29sID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnNwb3J0IikpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgiZ3JlZXRpbmciLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgiR29vZCBkYXkiKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCisgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gZG91YmxlKCJQcm90b2NvbEZhY3RvcnkiKQorICAgICAgYWxsb3cocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQogICAgICAgc2VyaWFsaXplciA9IFRocmlmdDo6U2VyaWFsaXplci5uZXcocHJvdG9jb2xfZmFjdG9yeSkKICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIkdvb2QgZGF5IikpCiAgICAgZW5kCkBAIC00NywyMSArNDcsMjEgQEAKICAgICBpdCAic2hvdWxkIGRlc2VyaWFsaXplIHN0cnVjdHMgZnJvbSBiaW5hcnkgYnkgZGVmYXVsdCIgZG8KICAgICAgIGRlc2VyaWFsaXplciA9IFRocmlmdDo6RGVzZXJpYWxpemVyLm5ldwogICAgICAgZGF0YSA9ICJceDBCXHgwMFx4MDFceDAwXHgwMFx4MDBceDBFJ0VsbG8gZ3V2J25vciFceDAwIgotICAgICAgZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldywgZGF0YSkuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIidFbGxvIGd1didub3IhIikKKyAgICAgIGV4cGVjdChkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3LCBkYXRhKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiJ0VsbG8gZ3V2J25vciEiKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZGVzZXJpYWxpemUgc3RydWN0cyBmcm9tIHRoZSBnaXZlbiBwcm90b2NvbCIgZG8KLSAgICAgIHByb3RvY29sID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5hbmRfcmV0dXJuKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybihbImdyZWV0aW5nIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxXSwKKyAgICAgIHByb3RvY29sID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnNwb3J0IikpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5hbmRfcmV0dXJuKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmFuZF9yZXR1cm4oWyJncmVldGluZyIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXSkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigiR29vZCBkYXkiKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkKLSAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeS5zdHViISg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigiR29vZCBkYXkiKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKQorICAgICAgcHJvdG9jb2xfZmFjdG9yeSA9IGRvdWJsZSgiUHJvdG9jb2xGYWN0b3J5IikKKyAgICAgIGFsbG93KHByb3RvY29sX2ZhY3RvcnkpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkuYW5kX3JldHVybihwcm90b2NvbCkKICAgICAgIGRlc2VyaWFsaXplciA9IFRocmlmdDo6RGVzZXJpYWxpemVyLm5ldyhwcm90b2NvbF9mYWN0b3J5KQotICAgICAgZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldywgIiIpLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpCisgICAgICBleHBlY3QoZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldywgIiIpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiCmluZGV4IDEzMDFkNTQuLmVjOWU1NTAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zb2NrZXRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKQEAgLTI4LDUyICsyOCw1NyBAQAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBoYW5kbGUgd2hlbiBjYWxsaW5nIGxpc3RlbiIgZG8KLSAgICAgIFRDUFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkKKyAgICAgIGV4cGVjdChUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpCiAgICAgICBAc29ja2V0Lmxpc3RlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgaG9zdCBhcmd1bWVudCIgZG8KICAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDEyMzQpCi0gICAgICBUQ1BTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgnbG9jYWxob3N0JywgMTIzNCkKKyAgICAgIGV4cGVjdChUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aCgnbG9jYWxob3N0JywgMTIzNCkKKyAgICAgIEBzb2NrZXQudG9fcyA9PSAic2VydmVyKGxvY2FsaG9zdDoxMjM0KSIKICAgICAgIEBzb2NrZXQubGlzdGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIFRocmlmdDo6U29ja2V0IHRvIHdyYXAgYWNjZXB0ZWQgc29ja2V0cyIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlRDUFNlcnZlciIpCi0gICAgICBUQ1BTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJUQ1BTZXJ2ZXIiKQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgc29jayA9IG1vY2soInNvY2siKQotICAgICAgaGFuZGxlLnNob3VsZF9yZWNlaXZlKDphY2NlcHQpLmFuZF9yZXR1cm4oc29jaykKLSAgICAgIHRyYW5zID0gbW9jaygiU29ja2V0IikKLSAgICAgIFRocmlmdDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odHJhbnMpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6aGFuZGxlPSkud2l0aChzb2NrKQotICAgICAgQHNvY2tldC5hY2NlcHQuc2hvdWxkID09IHRyYW5zCisgICAgICBzb2NrID0gZG91YmxlKCJzb2NrIikKKyAgICAgIGV4cGVjdChoYW5kbGUpLnRvIHJlY2VpdmUoOmFjY2VwdCkuYW5kX3JldHVybihzb2NrKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlNvY2tldCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybih0cmFucykKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6aGFuZGxlPSkud2l0aChzb2NrKQorICAgICAgZXhwZWN0KEBzb2NrZXQuYWNjZXB0KS50byBlcSh0cmFucykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2xvc2UgdGhlIGhhbmRsZSB3aGVuIGNsb3NlZCIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlRDUFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgVENQU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVENQU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBleHBlY3QoVENQU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQorICAgICAgZXhwZWN0KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCiAgICAgICBAc29ja2V0LmNsb3NlCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBuaWwgd2hlbiBhY2NlcHRpbmcgaWYgdGhlcmUgaXMgbm8gaGFuZGxlIiBkbwotICAgICAgQHNvY2tldC5hY2NlcHQuc2hvdWxkIGJlX25pbAorICAgICAgZXhwZWN0KEBzb2NrZXQuYWNjZXB0KS50byBiZV9uaWwKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIHRydWUgZm9yIGNsb3NlZD8gd2hlbiBhcHByb3ByaWF0ZSIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlRDUFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgVENQU2VydmVyLnN0dWIhKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJUQ1BTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfY2xvc2VkCi0gICAgICBoYW5kbGUuc3R1YiEoOmNsb3NlKQorICAgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9jbG9zZWQKKyAgICAgIGFsbG93KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCiAgICAgICBAc29ja2V0LmNsb3NlCi0gICAgICBAc29ja2V0LnNob3VsZCBiZV9jbG9zZWQKKyAgICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9jbG9zZWQKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfY2xvc2VkCi0gICAgICBoYW5kbGUuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEBzb2NrZXQuc2hvdWxkIGJlX2Nsb3NlZAorICAgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9jbG9zZWQKKyAgICAgIGFsbG93KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX2Nsb3NlZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzb2NrZXQudG9fcykudG8gZXEoInNvY2tldCg6MTIzNCkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIgYi9saWIvcmIvc3BlYy9zZXJ2ZXJfc3BlYy5yYgppbmRleCBlYWVjYmRhLi41N2Y1MjM3IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zZXJ2ZXJfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zZXJ2ZXJfc3BlYy5yYgpAQCAtMjEsOTUgKzIxLDEzNSBAQAogZGVzY3JpYmUgJ1NlcnZlcicgZG8KIAogICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VTZXJ2ZXIgZG8KLSAgICBpdCAic2hvdWxkIGRlZmF1bHQgdG8gQmFzZVRyYW5zcG9ydEZhY3RvcnkgYW5kIEJpbmFyeVByb3RvY29sRmFjdG9yeSB3aGVuIG5vdCBzcGVjaWZpZWQiIGRvCi0gICAgICBzZXJ2ZXIgPSBUaHJpZnQ6OkJhc2VTZXJ2ZXIubmV3KG1vY2soIlByb2Nlc3NvciIpLCBtb2NrKCJCYXNlU2VydmVyVHJhbnNwb3J0IikpCi0gICAgICBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHRyYW5zcG9ydF9mYWN0b3J5Jykuc2hvdWxkIGJlX2FuX2luc3RhbmNlX29mKFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkpCi0gICAgICBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHByb3RvY29sX2ZhY3RvcnknKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkpCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJUcmFucyA9IGRvdWJsZSgiU2VydmVyVHJhbnNwb3J0IikKKyAgICAgIEB0cmFucyA9IGRvdWJsZSgiQmFzZVRyYW5zcG9ydCIpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiQmFzZVByb3RvY29sIikKKyAgICAgIEBzZXJ2ZXIgPSBkZXNjcmliZWRfY2xhc3MubmV3KEBwcm9jZXNzb3IsIEBzZXJ2ZXJUcmFucywgQHRyYW5zLCBAcHJvdCkKICAgICBlbmQKIAotICAgICMgc2VydmUgaXMgYSBub29wLCBzbyBjYW4ndCB0ZXN0IHRoYXQKKyAgICBpdCAic2hvdWxkIGRlZmF1bHQgdG8gQmFzZVRyYW5zcG9ydEZhY3RvcnkgYW5kIEJpbmFyeVByb3RvY29sRmFjdG9yeSB3aGVuIG5vdCBzcGVjaWZpZWQiIGRvCisgICAgICBAc2VydmVyID0gVGhyaWZ0OjpCYXNlU2VydmVyLm5ldyhkb3VibGUoIlByb2Nlc3NvciIpLCBkb3VibGUoIkJhc2VTZXJ2ZXJUcmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0B0cmFuc3BvcnRfZmFjdG9yeScpKS50byBiZV9hbl9pbnN0YW5jZV9vZihUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5KQorICAgICAgZXhwZWN0KEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHByb3RvY29sX2ZhY3RvcnknKSkudG8gYmVfYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIG5vdCBzZXJ2ZSIgZG8KKyAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIuc2VydmUoKX0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInNlcnZlclRyYW5zIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInByb3QiKQorICAgICAgZXhwZWN0KEBzZXJ2ZXIudG9fcykudG8gZXEoInNlcnZlcihwcm90KHRyYW5zKHNlcnZlclRyYW5zKSkpIikKKyAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpTaW1wbGVTZXJ2ZXIgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAcHJvY2Vzc29yID0gbW9jaygiUHJvY2Vzc29yIikKLSAgICAgIEBzZXJ2ZXJUcmFucyA9IG1vY2soIlNlcnZlclRyYW5zcG9ydCIpCi0gICAgICBAdHJhbnMgPSBtb2NrKCJCYXNlVHJhbnNwb3J0IikKLSAgICAgIEBwcm90ID0gbW9jaygiQmFzZVByb3RvY29sIikKLSAgICAgIEBjbGllbnQgPSBtb2NrKCJDbGllbnQiKQorICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJUcmFucyA9IGRvdWJsZSgiU2VydmVyVHJhbnNwb3J0IikKKyAgICAgIEB0cmFucyA9IGRvdWJsZSgiQmFzZVRyYW5zcG9ydCIpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiQmFzZVByb3RvY29sIikKKyAgICAgIEBjbGllbnQgPSBkb3VibGUoIkNsaWVudCIpCiAgICAgICBAc2VydmVyID0gZGVzY3JpYmVkX2NsYXNzLm5ldyhAcHJvY2Vzc29yLCBAc2VydmVyVHJhbnMsIEB0cmFucywgQHByb3QpCiAgICAgZW5kCiAgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJUcmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJzaW1wbGUoc2VydmVyKHByb3QodHJhbnMoc2VydmVyVHJhbnMpKSkpIikKKyAgICBlbmQKKyAgICAKICAgICBpdCAic2hvdWxkIHNlcnZlIGluIHRoZSBtYWluIHRocmVhZCIgZG8KLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpnZXRfdHJhbnNwb3J0KS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQGNsaWVudCkuYW5kX3JldHVybihAdHJhbnMpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEB0cmFucykuYW5kX3JldHVybihAcHJvdCkKICAgICAgIHggPSAwCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KS5hbmRfcmV0dXJuIGRvCisgICAgICBleHBlY3QoQHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkgZG8KICAgICAgICAgY2FzZSAoeCArPSAxKQogICAgICAgICB3aGVuIDEgdGhlbiByYWlzZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDIgdGhlbiByYWlzZSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMyB0aGVuIHRocm93IDpzdG9wCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnNlcnZlIH0uc2hvdWxkIHRocm93X3N5bWJvbCg6c3RvcCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZAorICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSB9LnRvIHRocm93X3N5bWJvbCg6c3RvcCkKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpUaHJlYWRlZFNlcnZlciBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBtb2NrKCJQcm9jZXNzb3IiKQotICAgICAgQHNlcnZlclRyYW5zID0gbW9jaygiU2VydmVyVHJhbnNwb3J0IikKLSAgICAgIEB0cmFucyA9IG1vY2soIkJhc2VUcmFuc3BvcnQiKQotICAgICAgQHByb3QgPSBtb2NrKCJCYXNlUHJvdG9jb2wiKQotICAgICAgQGNsaWVudCA9IG1vY2soIkNsaWVudCIpCisgICAgICBAcHJvY2Vzc29yID0gZG91YmxlKCJQcm9jZXNzb3IiKQorICAgICAgQHNlcnZlclRyYW5zID0gZG91YmxlKCJTZXJ2ZXJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJCYXNlVHJhbnNwb3J0IikKKyAgICAgIEBwcm90ID0gZG91YmxlKCJCYXNlUHJvdG9jb2wiKQorICAgICAgQGNsaWVudCA9IGRvdWJsZSgiQ2xpZW50IikKICAgICAgIEBzZXJ2ZXIgPSBkZXNjcmliZWRfY2xhc3MubmV3KEBwcm9jZXNzb3IsIEBzZXJ2ZXJUcmFucywgQHRyYW5zLCBAcHJvdCkKICAgICBlbmQKIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigic2VydmVyVHJhbnMiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigicHJvdCIpCisgICAgICBleHBlY3QoQHNlcnZlci50b19zKS50byBlcSgidGhyZWFkZWQoc2VydmVyKHByb3QodHJhbnMoc2VydmVyVHJhbnMpKSkpIikKKyAgICBlbmQKKyAgICAKICAgICBpdCAic2hvdWxkIHNlcnZlIHVzaW5nIHRocmVhZHMiIGRvCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpnZXRfdHJhbnNwb3J0KS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQGNsaWVudCkuYW5kX3JldHVybihAdHJhbnMpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHRyYW5zKS5hbmRfcmV0dXJuKEBwcm90KQotICAgICAgVGhyZWFkLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHByb3QsIEB0cmFucykuZXhhY3RseSgzKS50aW1lcy5hbmRfeWllbGQoQHByb3QsIEB0cmFucykKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHRyYW5zKS5hbmRfcmV0dXJuKEBwcm90KQorICAgICAgZXhwZWN0KFRocmVhZCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwcm90LCBAdHJhbnMpLmV4YWN0bHkoMykudGltZXMuYW5kX3lpZWxkKEBwcm90LCBAdHJhbnMpCiAgICAgICB4ID0gMAotICAgICAgQHByb2Nlc3Nvci5zaG91bGRfcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkuYW5kX3JldHVybiBkbworICAgICAgZXhwZWN0KEBwcm9jZXNzb3IpLnRvIHJlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpIGRvCiAgICAgICAgIGNhc2UgKHggKz0gMSkKICAgICAgICAgd2hlbiAxIHRoZW4gcmFpc2UgVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24KICAgICAgICAgd2hlbiAyIHRoZW4gcmFpc2UgVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDMgdGhlbiB0aHJvdyA6c3RvcAogICAgICAgICBlbmQKICAgICAgIGVuZAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcwotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkub3JkZXJlZAotICAgICAgbGFtYmRhIHsgQHNlcnZlci5zZXJ2ZSB9LnNob3VsZCB0aHJvd19zeW1ib2woOnN0b3ApCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQKKyAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIuc2VydmUgfS50byB0aHJvd19zeW1ib2woOnN0b3ApCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6VGhyZWFkUG9vbFNlcnZlciBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBtb2NrKCJQcm9jZXNzb3IiKQotICAgICAgQHNlcnZlcl90cmFucyA9IG1vY2soIlNlcnZlclRyYW5zcG9ydCIpCi0gICAgICBAdHJhbnMgPSBtb2NrKCJCYXNlVHJhbnNwb3J0IikKLSAgICAgIEBwcm90ID0gbW9jaygiQmFzZVByb3RvY29sIikKLSAgICAgIEBjbGllbnQgPSBtb2NrKCJDbGllbnQiKQorICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJfdHJhbnMgPSBkb3VibGUoIlNlcnZlclRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIkJhc2VUcmFuc3BvcnQiKQorICAgICAgQHByb3QgPSBkb3VibGUoIkJhc2VQcm90b2NvbCIpCisgICAgICBAY2xpZW50ID0gZG91YmxlKCJDbGllbnQiKQogICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlcl90cmFucywgQHRyYW5zLCBAcHJvdCkKKyAgICAgIHNsZWVwKDAuMTUpCiAgICAgZW5kCiAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJfdHJhbnMiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigicHJvdCIpCisgICAgICBleHBlY3QoQHNlcnZlci50b19zKS50byBlcSgidGhyZWFkcG9vbChzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJfdHJhbnMpKSkpIikKKyAgICBlbmQKKyAgICAKICAgICBpdCAic2hvdWxkIHNlcnZlIGluc2lkZSBhIHRocmVhZCIgZG8KICAgICAgIGV4Y2VwdGlvbl9xID0gQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOkBleGNlcHRpb25fcSkKLSAgICAgIGRlc2NyaWJlZF9jbGFzcy5hbnlfaW5zdGFuY2Uuc2hvdWxkX3JlY2VpdmUoOnNlcnZlKSBkbyAKKyAgICAgIGV4cGVjdF9hbnlfaW5zdGFuY2Vfb2YoZGVzY3JpYmVkX2NsYXNzKS50byByZWNlaXZlKDpzZXJ2ZSkgZG8gCiAgICAgICAgIGV4Y2VwdGlvbl9xLnB1c2goU3RhbmRhcmRFcnJvci5uZXcoJ0VSUk9SJykpCiAgICAgICBlbmQKICAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIucmVzY3VhYmxlX3NlcnZlIH0udG8ocmFpc2VfZXJyb3IoJ0VSUk9SJykpCisgICAgICBzbGVlcCgwLjE1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhdm9pZCBydW5uaW5nIHRoZSBzZXJ2ZXIgdHdpY2Ugd2hlbiByZXRyeWluZyByZXNjdWFibGVfc2VydmUiIGRvCiAgICAgICBleGNlcHRpb25fcSA9IEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAZXhjZXB0aW9uX3EpCi0gICAgICBkZXNjcmliZWRfY2xhc3MuYW55X2luc3RhbmNlLnNob3VsZF9yZWNlaXZlKDpzZXJ2ZSkgZG8gCisgICAgICBleHBlY3RfYW55X2luc3RhbmNlX29mKGRlc2NyaWJlZF9jbGFzcykudG8gcmVjZWl2ZSg6c2VydmUpIGRvIAogICAgICAgICBleGNlcHRpb25fcS5wdXNoKFN0YW5kYXJkRXJyb3IubmV3KCdFUlJPUjEnKSkKICAgICAgICAgZXhjZXB0aW9uX3EucHVzaChTdGFuZGFyZEVycm9yLm5ldygnRVJST1IyJykpCiAgICAgICBlbmQKQEAgLTExOCwyOSArMTU4LDI5IEBACiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlcnZlIHVzaW5nIGEgdGhyZWFkIHBvb2wiIGRvCi0gICAgICB0aHJlYWRfcSA9IG1vY2soIlNpemVkUXVldWUiKQotICAgICAgZXhjZXB0aW9uX3EgPSBtb2NrKCJRdWV1ZSIpCisgICAgICB0aHJlYWRfcSA9IGRvdWJsZSgiU2l6ZWRRdWV1ZSIpCisgICAgICBleGNlcHRpb25fcSA9IGRvdWJsZSgiUXVldWUiKQogICAgICAgQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkB0aHJlYWRfcSwgdGhyZWFkX3EpCiAgICAgICBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QGV4Y2VwdGlvbl9xLCBleGNlcHRpb25fcSkKLSAgICAgIEBzZXJ2ZXJfdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAotICAgICAgdGhyZWFkX3Euc2hvdWxkX3JlY2VpdmUoOnB1c2gpLndpdGgoOnRva2VuKQotICAgICAgdGhyZWFkX3Euc2hvdWxkX3JlY2VpdmUoOnBvcCkKLSAgICAgIFRocmVhZC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfeWllbGQKLSAgICAgIEBzZXJ2ZXJfdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAdHJhbnMpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQHByb3QpCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCisgICAgICBleHBlY3QodGhyZWFkX3EpLnRvIHJlY2VpdmUoOnB1c2gpLndpdGgoOnRva2VuKQorICAgICAgZXhwZWN0KHRocmVhZF9xKS50byByZWNlaXZlKDpwb3ApCisgICAgICBleHBlY3QoVGhyZWFkKS50byByZWNlaXZlKDpuZXcpLmFuZF95aWVsZAorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdHJhbnMpLnRvIHJlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpnZXRfdHJhbnNwb3J0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQHRyYW5zKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAcHJvdCkKICAgICAgIHggPSAwCiAgICAgICBlcnJvciA9IFJ1bnRpbWVFcnJvci5uZXcoIlN0b3BwZWQiKQotICAgICAgQHByb2Nlc3Nvci5zaG91bGRfcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkuYW5kX3JldHVybiBkbworICAgICAgZXhwZWN0KEBwcm9jZXNzb3IpLnRvIHJlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpIGRvCiAgICAgICAgIGNhc2UgKHggKz0gMSkKICAgICAgICAgd2hlbiAxIHRoZW4gcmFpc2UgVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24KICAgICAgICAgd2hlbiAyIHRoZW4gcmFpc2UgVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDMgdGhlbiByYWlzZSBlcnJvcgogICAgICAgICBlbmQKICAgICAgIGVuZAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcwotICAgICAgZXhjZXB0aW9uX3Euc2hvdWxkX3JlY2VpdmUoOnB1c2gpLndpdGgoZXJyb3IpLmFuZF90aHJvdyg6c3RvcCkKLSAgICAgIEBzZXJ2ZXJfdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChleGNlcHRpb25fcSkudG8gcmVjZWl2ZSg6cHVzaCkud2l0aChlcnJvcikuYW5kX3Rocm93KDpzdG9wKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSB9LnRvKHRocm93X3N5bWJvbCg6c3RvcCkpCiAgICAgZW5kCiAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zb2NrZXRfc3BlYy5yYgppbmRleCBlNmI2NzMyLi4yMDJjNzQ1IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zb2NrZXRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zb2NrZXRfc3BlYy5yYgpAQCAtMjUsMzcgKzI1LDQ0IEBACiAgIGRlc2NyaWJlIFRocmlmdDo6U29ja2V0IGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwogICAgICAgQHNvY2tldCA9IFRocmlmdDo6U29ja2V0Lm5ldwotICAgICAgQGhhbmRsZSA9IG1vY2soIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQGhhbmRsZS5zdHViISg6Y2xvc2UpCi0gICAgICBAaGFuZGxlLnN0dWIhKDpjb25uZWN0X25vbmJsb2NrKQotICAgICAgQGhhbmRsZS5zdHViISg6c2V0c29ja29wdCkKLSAgICAgIDo6U29ja2V0LnN0dWIhKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICAgIEBoYW5kbGUgPSBkb3VibGUoIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjb25uZWN0X25vbmJsb2NrKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6c2V0c29ja29wdCkKKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKICAgICBlbmQKIAogICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAiYSBzb2NrZXQiCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGEgVHJhbnNwb3J0RXhjZXB0aW9uIHdoZW4gaXQgY2Fubm90IG9wZW4gYSBzb2NrZXQiIGRvCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICAgIGxhbWJkYSB7IEBzb2NrZXQub3BlbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4gfQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCB7IEBzb2NrZXQub3BlbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb3BlbiBhIDo6U29ja2V0IHdpdGggZGVmYXVsdCBhcmdzIiBkbwotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybihtb2NrKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOnNvY2thZGRyX2luKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oZG91YmxlKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBAc29ja2V0LnRvX3MgPT0gInNvY2tldChsb2NhbGhvc3Q6OTA5MCkiCiAgICAgICBAc29ja2V0Lm9wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGhvc3QvcG9ydCBvcHRpb25zIiBkbwotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybihtb2NrKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOnNvY2thZGRyX2luKQotICAgICAgVGhyaWZ0OjpTb2NrZXQubmV3KCdteS5kb21haW4nLCAxMjM0KS5vcGVuCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkpCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJ215LmRvbWFpbicsIDEyMzQpLm9wZW4KKyAgICAgIEBzb2NrZXQudG9fcyA9PSAic29ja2V0KG15LmRvbWFpbjoxMjM0KSIKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIHRpbWVvdXQiIGRvCi0gICAgICA6OlNvY2tldC5zdHViISg6bmV3KQotICAgICAgVGhyaWZ0OjpTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA4MDgwLCA1KS50aW1lb3V0LnNob3VsZCA9PSA1CisgICAgICBhbGxvdyg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgZXhwZWN0KFRocmlmdDo6U29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSkudGltZW91dCkudG8gZXEoNSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpCisgICAgICBleHBlY3QoVGhyaWZ0OjpTb2NrZXQubmV3KCdteWhvc3QnLCA4MDkwKS50b19zKS50byBlcSgic29ja2V0KG15aG9zdDo4MDkwKSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zb2NrZXRfc3BlY19zaGFyZWQucmIgYi9saWIvcmIvc3BlYy9zb2NrZXRfc3BlY19zaGFyZWQucmIKaW5kZXggNWZkZGMxNi4uMzJiZGI3MSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjX3NoYXJlZC5yYgpAQCAtMjEsODQgKzIxLDg0IEBACiAKIHNoYXJlZF9leGFtcGxlc19mb3IgImEgc29ja2V0IiBkbwogICBpdCAic2hvdWxkIG9wZW4gYSBzb2NrZXQiIGRvCi0gICAgQHNvY2tldC5vcGVuLnNob3VsZCA9PSBAaGFuZGxlCisgICAgZXhwZWN0KEBzb2NrZXQub3BlbikudG8gZXEoQGhhbmRsZSkKICAgZW5kCiAKICAgaXQgInNob3VsZCBiZSBvcGVuIHdoZW5ldmVyIGl0IGhhcyBhIGhhbmRsZSIgZG8KLSAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfb3BlbgorICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfb3BlbgogICAgIEBzb2NrZXQub3BlbgotICAgIEBzb2NrZXQuc2hvdWxkIGJlX29wZW4KKyAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfb3BlbgogICAgIEBzb2NrZXQuaGFuZGxlID0gbmlsCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KICAgICBAc29ja2V0LmhhbmRsZSA9IEBoYW5kbGUKICAgICBAc29ja2V0LmNsb3NlCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KICAgZW5kCiAKICAgaXQgInNob3VsZCB3cml0ZSBkYXRhIHRvIHRoZSBoYW5kbGUiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvb2JhciIpCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmb29iYXIiKQogICAgIEBzb2NrZXQud3JpdGUoImZvb2JhciIpCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZhaWwiKS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICBsYW1iZGEgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOIH0KKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZhaWwiKS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKKyAgICBleHBlY3QgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiBpdCBjYW5ub3QgcmVhZCBmcm9tIHRoZSBoYW5kbGUiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgIGxhbWJkYSB7IEBzb2NrZXQucmVhZCgxNykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOIH0KKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgIGV4cGVjdCB7IEBzb2NrZXQucmVhZCgxNykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmV0dXJuIHRoZSBkYXRhIHJlYWQgd2hlbiByZWFkaW5nIGZyb20gdGhlIGhhbmRsZSB3b3JrcyIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JldHVybigidGVzdCBkYXRhIikKLSAgICBAc29ja2V0LnJlYWQoMTcpLnNob3VsZCA9PSAidGVzdCBkYXRhIgorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JldHVybigidGVzdCBkYXRhIikKKyAgICBleHBlY3QoQHNvY2tldC5yZWFkKDE3KSkudG8gZXEoInRlc3QgZGF0YSIpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgZGVjbGFyZSBpdHNlbGYgYXMgY2xvc2VkIHdoZW4gaXQgaGFzIGFuIGVycm9yIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgQHNvY2tldC5zaG91bGQgYmVfb3BlbgotICAgIGxhbWJkYSB7IEBzb2NrZXQud3JpdGUoImZhaWwiKSB9LnNob3VsZCByYWlzZV9lcnJvcgotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX29wZW4KKyAgICBleHBlY3QgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZCIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KLSAgICBsYW1iZGEgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS5zaG91bGQgcmFpc2VfZXJyb3IoSU9FcnJvciwgImNsb3NlZCBzdHJlYW0iKQotICAgIGxhbWJkYSB7IEBzb2NrZXQucmVhZCgxMCkgfS5zaG91bGQgcmFpc2VfZXJyb3IoSU9FcnJvciwgImNsb3NlZCBzdHJlYW0iKQorICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KKyAgICBleHBlY3QgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS50byByYWlzZV9lcnJvcihJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIpCisgICAgZXhwZWN0IHsgQHNvY2tldC5yZWFkKDEwKSB9LnRvIHJhaXNlX2Vycm9yKElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIikKICAgZW5kCiAKICAgaXQgInNob3VsZCBzdXBwb3J0IHRoZSB0aW1lb3V0IGFjY2Vzc29yIGZvciByZWFkIiBkbwogICAgIEBzb2NrZXQudGltZW91dCA9IDMKICAgICBAc29ja2V0Lm9wZW4KLSAgICBJTy5zaG91bGRfcmVjZWl2ZSg6c2VsZWN0KS53aXRoKFtAaGFuZGxlXSwgbmlsLCBuaWwsIDMpLmFuZF9yZXR1cm4oW1tAaGFuZGxlXSwgW10sIFtdXSkKLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JldHVybigidGVzdCBkYXRhIikKLSAgICBAc29ja2V0LnJlYWQoMTcpLnNob3VsZCA9PSAidGVzdCBkYXRhIgorICAgIGV4cGVjdChJTykudG8gcmVjZWl2ZSg6c2VsZWN0KS53aXRoKFtAaGFuZGxlXSwgbmlsLCBuaWwsIDMpLmFuZF9yZXR1cm4oW1tAaGFuZGxlXSwgW10sIFtdXSkKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCisgICAgZXhwZWN0KEBzb2NrZXQucmVhZCgxNykpLnRvIGVxKCJ0ZXN0IGRhdGEiKQogICBlbmQKIAogICBpdCAic2hvdWxkIHN1cHBvcnQgdGhlIHRpbWVvdXQgYWNjZXNzb3IgZm9yIHdyaXRlIiBkbwogICAgIEBzb2NrZXQudGltZW91dCA9IDMKICAgICBAc29ja2V0Lm9wZW4KLSAgICBJTy5zaG91bGRfcmVjZWl2ZSg6c2VsZWN0KS53aXRoKG5pbCwgW0BoYW5kbGVdLCBuaWwsIDMpLnR3aWNlLmFuZF9yZXR1cm4oW1tdLCBbQGhhbmRsZV0sIFtdXSkKLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ub25ibG9jaykud2l0aCgidGVzdCBkYXRhIikuYW5kX3JldHVybig0KQotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlX25vbmJsb2NrKS53aXRoKCIgZGF0YSIpLmFuZF9yZXR1cm4oNSkKLSAgICBAc29ja2V0LndyaXRlKCJ0ZXN0IGRhdGEiKS5zaG91bGQgPT0gOQorICAgIGV4cGVjdChJTykudG8gcmVjZWl2ZSg6c2VsZWN0KS53aXRoKG5pbCwgW0BoYW5kbGVdLCBuaWwsIDMpLnR3aWNlLmFuZF9yZXR1cm4oW1tdLCBbQGhhbmRsZV0sIFtdXSkKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6d3JpdGVfbm9uYmxvY2spLndpdGgoInRlc3QgZGF0YSIpLmFuZF9yZXR1cm4oNCkKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6d3JpdGVfbm9uYmxvY2spLndpdGgoIiBkYXRhIikuYW5kX3JldHVybig1KQorICAgIGV4cGVjdChAc29ja2V0LndyaXRlKCJ0ZXN0IGRhdGEiKSkudG8gZXEoOSkKICAgZW5kCiAKICAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciB3aGVuIHJlYWQgdGltZXMgb3V0IiBkbwogICAgIEBzb2NrZXQudGltZW91dCA9IDAuNQogICAgIEBzb2NrZXQub3BlbgotICAgIElPLnNob3VsZF9yZWNlaXZlKDpzZWxlY3QpLm9uY2Uge3NsZWVwKDAuNSk7IG5pbH0KLSAgICBsYW1iZGEgeyBAc29ja2V0LnJlYWQoMTcpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQgfQorICAgIGV4cGVjdChJTykudG8gcmVjZWl2ZSg6c2VsZWN0KS5vbmNlIHtzbGVlcCgwLjUpOyBuaWx9CisgICAgZXhwZWN0IHsgQHNvY2tldC5yZWFkKDE3KSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKSB9CiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiB3cml0ZSB0aW1lcyBvdXQiIGRvCiAgICAgQHNvY2tldC50aW1lb3V0ID0gMC41CiAgICAgQHNvY2tldC5vcGVuCi0gICAgSU8uc2hvdWxkX3JlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAwLjUpLmFueV9udW1iZXJfb2ZfdGltZXMuYW5kX3JldHVybihuaWwpCi0gICAgbGFtYmRhIHsgQHNvY2tldC53cml0ZSgidGVzdCBkYXRhIikgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCB9CisgICAgYWxsb3coSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAwLjUpLmFuZF9yZXR1cm4obmlsKQorICAgIGV4cGVjdCB7IEBzb2NrZXQud3JpdGUoInRlc3QgZGF0YSIpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpIH0KICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiIGIvbGliL3JiL3NwZWMvc3BlY19oZWxwZXIucmIKaW5kZXggMzY3MmJmMC4uNWJmOThkMCAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc3BlY19oZWxwZXIucmIKKysrIGIvbGliL3JiL3NwZWMvc3BlY19oZWxwZXIucmIKQEAgLTU0LDcgKzU0LDcgQEAKIHJlcXVpcmUgJ25vbmJsb2NraW5nX3NlcnZpY2UnCiAKIG1vZHVsZSBGaXh0dXJlcwotICBDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNUID0gQ09NUEFDVF9URVNULmR1cAorICBDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNUID0gVGhyaWZ0OjpUZXN0OjpDT01QQUNUX1RFU1QuZHVwCiAgIENPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QuYV9iaW5hcnkgPSBbMCwxLDIsMyw0LDUsNiw3LDhdLnBhY2soJ2MqJykKICAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVC5zZXRfYnl0ZV9tYXAgPSBuaWwKICAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVC5tYXBfYnl0ZV9tYXAgPSBuaWwKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NzbF9zZXJ2ZXJfc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zc2xfc2VydmVyX3NvY2tldF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZTY1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9zc2xfc2VydmVyX3NvY2tldF9zcGVjLnJiCkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlICdzcGVjX2hlbHBlcicKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aCgiI3tGaWxlLmRpcm5hbWUoX19GSUxFX18pfS9zb2NrZXRfc3BlY19zaGFyZWQiKQorCitkZXNjcmliZSAnU1NMU2VydmVyU29ja2V0JyBkbworCisgIGRlc2NyaWJlIFRocmlmdDo6U1NMU2VydmVyU29ja2V0IGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHNvY2tldCA9IFRocmlmdDo6U1NMU2VydmVyU29ja2V0Lm5ldygxMjM0KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzb2NrZXQudG9fcykudG8gZXEoInNzbChzb2NrZXQoOjEyMzQpKSIpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zc2xfc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zc2xfc29ja2V0X3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4ZDhkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL3NzbF9zb2NrZXRfc3BlYy5yYgpAQCAtMCwwICsxLDc4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vc29ja2V0X3NwZWNfc2hhcmVkIikKKworZGVzY3JpYmUgJ1NTTFNvY2tldCcgZG8KKworICBkZXNjcmliZSBUaHJpZnQ6OlNTTFNvY2tldCBkbworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEBjb250ZXh0ID0gT3BlblNTTDo6U1NMOjpTU0xDb250ZXh0Lm5ldworICAgICAgQHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0Lm5ldworICAgICAgQHNpbXBsZV9zb2NrZXRfaGFuZGxlID0gZG91YmxlKCJIYW5kbGUiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KEBzaW1wbGVfc29ja2V0X2hhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyhAc2ltcGxlX3NvY2tldF9oYW5kbGUpLnRvIHJlY2VpdmUoOmNvbm5lY3Rfbm9uYmxvY2spCisgICAgICBhbGxvdyhAc2ltcGxlX3NvY2tldF9oYW5kbGUpLnRvIHJlY2VpdmUoOnNldHNvY2tvcHQpCisKKyAgICAgIEBoYW5kbGUgPSBkb3VibGUoZG91YmxlKCJTU0xIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6cG9zdF9jb25uZWN0aW9uX2NoZWNrID0+IHRydWUpLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNvbm5lY3Rfbm9uYmxvY2spCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnBvc3RfY29ubmVjdGlvbl9jaGVjaykKKworICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAc2ltcGxlX3NvY2tldF9oYW5kbGUpCisgICAgICBhbGxvdyhPcGVuU1NMOjpTU0w6OlNTTFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKEBoYW5kbGUpCisgICAgZW5kCisKKyAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgImEgc29ja2V0IgorCisgICAgaXQgInNob3VsZCByYWlzZSBhIFRyYW5zcG9ydEV4Y2VwdGlvbiB3aGVuIGl0IGNhbm5vdCBvcGVuIGEgc3NsIHNvY2tldCIgZG8KKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6Z2V0YWRkcmluZm8pLndpdGgoImxvY2FsaG9zdCIsIDkwOTAsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKS5hbmRfcmV0dXJuKFtbXV0pCisgICAgICBleHBlY3QgeyBAc29ja2V0Lm9wZW4gfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIG9wZW4gYSA6OlNvY2tldCB3aXRoIGRlZmF1bHQgYXJncyIgZG8KKyAgICAgIGV4cGVjdChPcGVuU1NMOjpTU0w6OlNTTFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBzaW1wbGVfc29ja2V0X2hhbmRsZSwgbmlsKS5hbmRfcmV0dXJuKEBoYW5kbGUpCisgICAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cG9zdF9jb25uZWN0aW9uX2NoZWNrKS53aXRoKCdsb2NhbGhvc3QnKQorICAgICAgQHNvY2tldC5vcGVuCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGFjY2VwdCBob3N0L3BvcnQgb3B0aW9ucyIgZG8KKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNvbm5lY3Rfbm9uYmxvY2sgPT4gdHJ1ZSwgOnNldHNvY2tvcHQgPT4gbmlsKQorICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIGV4cGVjdChPcGVuU1NMOjpTU0w6OlNTTFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKGhhbmRsZSwgbmlsKS5hbmRfcmV0dXJuKEBoYW5kbGUpCisgICAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cG9zdF9jb25uZWN0aW9uX2NoZWNrKS53aXRoKCdteS5kb21haW4nKQorICAgICAgVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdteS5kb21haW4nLCAxMjM0LCA2MDAwLCBuaWwpLm9wZW4KKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIHRpbWVvdXQiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA4MDgwLCA1KS50aW1lb3V0KS50byBlcSg1KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgY29udGV4dCIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNTTFNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDgwODAsIDUsIEBjb250ZXh0KS5zc2xfY29udGV4dCkudG8gZXEoQGNvbnRleHQpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdteWhvc3QnLCA4MDkwKS50b19zKS50byBlcSgic3NsKHNvY2tldChteWhvc3Q6ODA5MCkpIikKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3N0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19zcGVjLnJiIGIvbGliL3JiL3NwZWMvc3RydWN0X25lc3RlZF9jb250YWluZXJzX3NwZWMucmIKaW5kZXggZGM4Y2U1Zi4uZDA2MzU2OSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc3RydWN0X25lc3RlZF9jb250YWluZXJzX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc3RydWN0X25lc3RlZF9jb250YWluZXJzX3NwZWMucmIKQEAgLTM5LDkgKzM5LDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyBbMSwgMiwgM10sIFsyLCAzLCA0XSBdCiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZS5wdXNoIFszLCA0LCA1XQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtNTIsOSArNTIsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIFsxLCAyLCAzXSwgWzIsIDMsIDRdIF0udG9fc2V0CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZS5hZGQgWzMsIDQsIDVdCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC02NSw5ICs2NSw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgWzEsIDIsIDNdID0+IDEsIFsyLCAzLCA0XSA9PiAyIH0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlW1szLCA0LCA1XV0gPSAzCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC03OCw5ICs3OCw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgMSA9PiBbMSwgMiwgM10sIDIgPT4gWzIsIDMsIDRdIH0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlWzNdID0gWzMsIDQsIDVdCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC05MSw5ICs5MSw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgWzEsIDIsIDNdLnRvX3NldCwgWzIsIDMsIDRdLnRvX3NldCBdCiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZS5wdXNoKFszLCA0LCA1XS50b19zZXQpCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xMDQsOSArMTA0LDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyBbMSwgMiwgM10udG9fc2V0LCBbMiwgMywgNF0udG9fc2V0IF0udG9fc2V0CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZS5hZGQoWzMsIDQsIDVdLnRvX3NldCkKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTExNyw5ICsxMTcsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IFsxLCAyLCAzXS50b19zZXQgPT4gMSwgWzIsIDMsIDRdLnRvX3NldCA9PiAyIH0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlW1szLCA0LCA1XS50b19zZXRdID0gMwotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTMwLDkgKzEzMCw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgMSA9PiBbMSwgMiwgM10udG9fc2V0LCAyID0+IFsyLCAzLCA0XS50b19zZXQgfQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWVbM10gPSBbMywgNCwgNV0udG9fc2V0Ci0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xNDMsOSArMTQzLDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyB7MSA9PiAyLCAzID0+IDR9LCB7MiA9PiAzLCA0ID0+IDV9IF0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlLnB1c2goeyAzID0+IDQsIDUgPT4gNiB9KQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTU2LDkgKzE1Niw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgezEgPT4gMiwgMyA9PiA0fSwgezIgPT4gMywgNCA9PiA1fSBdLnRvX3NldAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWUuYWRkKHsgMyA9PiA0LCA1ID0+IDYgfSkKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTE2OSw5ICsxNjksOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IHsgMSA9PiAyLCAzID0+IDR9ID0+IDEsIHsyID0+IDMsIDQgPT4gNX0gID0+IDIgfQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWVbezMgPT4gNCwgNSA9PiA2fV0gPSAzCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xODIsOSArMTgyLDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyAxID0+IHsgMSA9PiAyLCAzID0+IDR9LCAyID0+IHsyID0+IDMsIDQgPT4gNX0gfQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWVbM10gPSB7IDMgPT4gNCwgNSA9PiA2IH0KLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc3RydWN0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zdHJ1Y3Rfc3BlYy5yYgppbmRleCA2NTM0ZDYxLi5iYmQ1MDJiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zdHJ1Y3Rfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zdHJ1Y3Rfc3BlYy5yYgpAQCAtMjUsNyArMjUsNyBAQAogICAgIGl0ICJzaG91bGQgaXRlcmF0ZSBvdmVyIGFsbCBmaWVsZHMgcHJvcGVybHkiIGRvCiAgICAgICBmaWVsZHMgPSB7fQogICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldy5lYWNoX2ZpZWxkIHsgfGZpZCxmaWVsZF9pbmZvfCBmaWVsZHNbZmlkXSA9IGZpZWxkX2luZm8gfQotICAgICAgZmllbGRzLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpGb286OkZJRUxEUworICAgICAgZXhwZWN0KGZpZWxkcykudG8gZXEoU3BlY05hbWVzcGFjZTo6Rm9vOjpGSUVMRFMpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGluaXRpYWxpemUgYWxsIGZpZWxkcyB0byBkZWZhdWx0cyIgZG8KQEAgLTM5LDE5ICszOSwxOSBAQAogICAgIGVuZAogCiAgICAgZGVmIHZhbGlkYXRlX2RlZmF1bHRfYXJndW1lbnRzKG9iamVjdCkKLSAgICAgIG9iamVjdC5zaW1wbGUuc2hvdWxkID09IDUzCi0gICAgICBvYmplY3Qud29yZHMuc2hvdWxkID09ICJ3b3JkcyIKLSAgICAgIG9iamVjdC5oZWxsby5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnaGVsbG8sIHdvcmxkIScpCi0gICAgICBvYmplY3QuaW50cy5zaG91bGQgPT0gWzEsIDIsIDIsIDNdCi0gICAgICBvYmplY3QuY29tcGxleC5zaG91bGQgYmVfbmlsCi0gICAgICBvYmplY3Quc2hvcnRzLnNob3VsZCA9PSBTZXQubmV3KFs1LCAxNywgMjM5XSkKKyAgICAgIGV4cGVjdChvYmplY3Quc2ltcGxlKS50byBlcSg1MykKKyAgICAgIGV4cGVjdChvYmplY3Qud29yZHMpLnRvIGVxKCJ3b3JkcyIpCisgICAgICBleHBlY3Qob2JqZWN0LmhlbGxvKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdoZWxsbywgd29ybGQhJykpCisgICAgICBleHBlY3Qob2JqZWN0LmludHMpLnRvIGVxKFsxLCAyLCAyLCAzXSkKKyAgICAgIGV4cGVjdChvYmplY3QuY29tcGxleCkudG8gYmVfbmlsCisgICAgICBleHBlY3Qob2JqZWN0LnNob3J0cykudG8gZXEoU2V0Lm5ldyhbNSwgMTcsIDIzOV0pKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3Qgc2hhcmUgZGVmYXVsdCB2YWx1ZXMgYmV0d2VlbiBpbnN0YW5jZXMiIGRvCiAgICAgICBiZWdpbgogICAgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3CiAgICAgICAgIHN0cnVjdC5pbnRzIDw8IDE3Ci0gICAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcuaW50cy5zaG91bGQgPT0gWzEsMiwyLDNdCisgICAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3LmludHMpLnRvIGVxKFsxLDIsMiwzXSkKICAgICAgIGVuc3VyZQogICAgICAgICAjIGVuc3VyZSBubyBsZWFrYWdlIHRvIG90aGVyIHRlc3RzCiAgICAgICAgIFNwZWNOYW1lc3BhY2U6OkZvbzo6RklFTERTWzRdWzpkZWZhdWx0XSA9IFsxLDIsMiwzXQpAQCAtNjAsNDggKzYwLDQ4IEBACiAKICAgICBpdCAic2hvdWxkIHByb3Blcmx5IGluaXRpYWxpemUgYm9vbGVhbiB2YWx1ZXMiIGRvCiAgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpCb29sU3RydWN0Lm5ldyg6eWVzbm8gPT4gZmFsc2UpCi0gICAgICBzdHJ1Y3QueWVzbm8uc2hvdWxkIGJlX2ZhbHNlCisgICAgICBleHBlY3Qoc3RydWN0Lnllc25vKS50byBiZV9mYWxzZXkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaGF2ZSBwcm9wZXIgPT0gc2VtYW50aWNzIiBkbwotICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldy5zaG91bGRfbm90ID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldwotICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldy5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldwotICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6c2ltcGxlID0+IDUyKS5zaG91bGRfbm90ID09IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KS5ub3RfdG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkZvby5uZXcpCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6c2ltcGxlID0+IDUyKSkubm90X3RvIGVxKFNwZWNOYW1lc3BhY2U6OkZvby5uZXcpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByaW50IGVudW0gdmFsdWUgbmFtZXMgaW4gaW5zcGVjdCIgZG8KLSAgICAgIFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bSBzb21lX2VudW06T05FICgwKT4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtIHNvbWVfZW51bTpPTkUgKDApPiIpCiAKLSAgICAgIFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhFbnVtTWFwLm5ldyg6bXlfbWFwID0+IHtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FID0+IFtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6VFdPXX0pLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aEVudW1NYXAgbXlfbWFwOntPTkUgKDApOiBbVFdPICgxKV19PiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoRW51bU1hcC5uZXcoOm15X21hcCA9PiB7U3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSA9PiBbU3BlY05hbWVzcGFjZTo6U29tZUVudW06OlRXT119KS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhFbnVtTWFwIG15X21hcDp7T05FICgwKTogW1RXTyAoMSldfT4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcmV0dHkgcHJpbnQgYmluYXJ5IGZpZWxkcyIgZG8KLSAgICAgIFNwZWNOYW1lc3BhY2U6OkZvbzIubmV3KDpteV9iaW5hcnkgPT4gIlwwMDFcMDAyXDAwMyIpLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6Rm9vMiBteV9iaW5hcnk6MDEwMjAzPiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28yLm5ldyg6bXlfYmluYXJ5ID0+ICJcMDAxXDAwMlwwMDMiKS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6OkZvbzIgbXlfYmluYXJ5OjAxMDIwMz4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBvZmZlciBmaWVsZD8gbWV0aG9kcyIgZG8KLSAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcub3B0X3N0cmluZz8uc2hvdWxkIGJlX2ZhbHNlCi0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpzaW1wbGUgPT4gNTIpLnNpbXBsZT8uc2hvdWxkIGJlX3RydWUKLSAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOm15X2Jvb2wgPT4gZmFsc2UpLm15X2Jvb2w/LnNob3VsZCBiZV90cnVlCi0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpteV9ib29sID0+IHRydWUpLm15X2Jvb2w/LnNob3VsZCBiZV90cnVlCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldy5vcHRfc3RyaW5nPykudG8gYmVfZmFsc2V5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6c2ltcGxlID0+IDUyKS5zaW1wbGU/KS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpteV9ib29sID0+IGZhbHNlKS5teV9ib29sPykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6bXlfYm9vbCA9PiB0cnVlKS5teV9ib29sPykudG8gYmVfdHJ1dGh5CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJlIGNvbXBhcmFibGUiIGRvCiAgICAgICBzMSA9IFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKQogICAgICAgczIgPSBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06OlRXTykKIAotICAgICAgKHMxIDw9PiBzMikuc2hvdWxkID09IC0xCi0gICAgICAoczIgPD0+IHMxKS5zaG91bGQgPT0gMQotICAgICAgKHMxIDw9PiBzMSkuc2hvdWxkID09IDAKLSAgICAgIChzMSA8PT4gU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldygpKS5zaG91bGQgPT0gLTEKKyAgICAgIGV4cGVjdChzMSA8PT4gczIpLnRvIGVxKC0xKQorICAgICAgZXhwZWN0KHMyIDw9PiBzMSkudG8gZXEoMSkKKyAgICAgIGV4cGVjdChzMSA8PT4gczEpLnRvIGVxKDApCisgICAgICBleHBlY3QoczEgPD0+IFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoKSkudG8gZXEoLTEpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgaXRzZWxmIG9mZiB0aGUgd2lyZSIgZG8KICAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKLSAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmFuZF9yZXR1cm4oCisgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnNwb3J0IikpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmFuZF9yZXR1cm4oCiAgICAgICAgIFsnY29tcGxleCcsIFRocmlmdDo6VHlwZXM6Ok1BUCwgNV0sICMgRm9vCiAgICAgICAgIFsnd29yZHMnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDJdLCAjIEZvbwogICAgICAgICBbJ2hlbGxvJywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzXSwgIyBGb28KQEAgLTExMiw0OSArMTEyLDQ5IEBACiAgICAgICAgIFsnc2hvcnRzJywgVGhyaWZ0OjpUeXBlczo6U0VULCA2XSwgIyBGb28KICAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0gIyBIZWxsbwogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNykudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5hbmRfcmV0dXJuKAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDcpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLmFuZF9yZXR1cm4oCiAgICAgICAgIFtUaHJpZnQ6OlR5cGVzOjpJMzIsIFRocmlmdDo6VHlwZXM6Ok1BUCwgMl0sICMgY29tcGxleAogICAgICAgICAgIFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMl0sICMgY29tcGxleC8xL3ZhbHVlCiAgICAgICAgICAgW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAxXSAjIGNvbXBsZXgvMi92YWx1ZQogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2xpc3RfYmVnaW4pLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkkzMiwgNF0pCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2xpc3RfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zZXRfYmVnaW4pLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkkxNiwgMl0pCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3NldF9lbmQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybigKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9lbmQpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2xpc3RfYmVnaW4pLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkkzMiwgNF0pCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9saXN0X2VuZCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3NldF9iZWdpbikuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STE2LCAyXSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3NldF9lbmQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oCiAgICAgICAgIDEsIDE0LCAgICAgICAgIyBjb21wbGV4IGtleXMKICAgICAgICAgNDIsICAgICAgICAgICAjIHNpbXBsZQogICAgICAgICA0LCAyMywgNCwgMjkgICMgaW50cwogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oInBpIiwgImUiLCAiZmVpZ2VuYmF1bSIsICJhcHBsZSBiYW5hbmEiLCAid2hhdCdzIHVwPyIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkuYW5kX3JldHVybihNYXRoOjpQSSwgTWF0aDo6RSwgNC42NjkyMDE2MDkpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kxNikuYW5kX3JldHVybigyLCAzKQotICAgICAgcHJvdC5zaG91bGRfbm90X3JlY2VpdmUoOnNraXApCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oInBpIiwgImUiLCAiZmVpZ2VuYmF1bSIsICJhcHBsZSBiYW5hbmEiLCAid2hhdCdzIHVwPyIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9kb3VibGUpLmFuZF9yZXR1cm4oTWF0aDo6UEksIE1hdGg6OkUsIDQuNjY5MjAxNjA5KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTE2KS5hbmRfcmV0dXJuKDIsIDMpCisgICAgICBleHBlY3QocHJvdCkubm90X3RvIHJlY2VpdmUoOnNraXApCiAgICAgICBzdHJ1Y3QucmVhZChwcm90KQogCi0gICAgICBzdHJ1Y3Quc2ltcGxlLnNob3VsZCA9PSA0MgotICAgICAgc3RydWN0LmNvbXBsZXguc2hvdWxkID09IHsxID0+IHsicGkiID0+IE1hdGg6OlBJLCAiZSIgPT4gTWF0aDo6RX0sIDE0ID0+IHsiZmVpZ2VuYmF1bSIgPT4gNC42NjkyMDE2MDl9fQotICAgICAgc3RydWN0LmhlbGxvLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJ3aGF0J3MgdXA/IikKLSAgICAgIHN0cnVjdC53b3Jkcy5zaG91bGQgPT0gImFwcGxlIGJhbmFuYSIKLSAgICAgIHN0cnVjdC5pbnRzLnNob3VsZCA9PSBbNCwgMjMsIDQsIDI5XQotICAgICAgc3RydWN0LnNob3J0cy5zaG91bGQgPT0gU2V0Lm5ldyhbMywgMl0pCisgICAgICBleHBlY3Qoc3RydWN0LnNpbXBsZSkudG8gZXEoNDIpCisgICAgICBleHBlY3Qoc3RydWN0LmNvbXBsZXgpLnRvIGVxKHsxID0+IHsicGkiID0+IE1hdGg6OlBJLCAiZSIgPT4gTWF0aDo6RX0sIDE0ID0+IHsiZmVpZ2VuYmF1bSIgPT4gNC42NjkyMDE2MDl9fSkKKyAgICAgIGV4cGVjdChzdHJ1Y3QuaGVsbG8pLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIndoYXQncyB1cD8iKSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Qud29yZHMpLnRvIGVxKCJhcHBsZSBiYW5hbmEiKQorICAgICAgZXhwZWN0KHN0cnVjdC5pbnRzKS50byBlcShbNCwgMjMsIDQsIDI5XSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Quc2hvcnRzKS50byBlcShTZXQubmV3KFszLCAyXSkpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSBmYWxzZSBib29sZWFuIGZpZWxkcyBjb3JyZWN0bHkiIGRvCiAgICAgICBiID0gU3BlY05hbWVzcGFjZTo6Qm9vbFN0cnVjdC5uZXcoOnllc25vID0+IGZhbHNlKQogICAgICAgcHJvdCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2Jvb2wpLndpdGgoZmFsc2UpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aChmYWxzZSkKICAgICAgIGIud3JpdGUocHJvdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCB1bmV4cGVjdGVkIGZpZWxkcyBpbiBzdHJ1Y3RzIGFuZCB1c2UgZGVmYXVsdCB2YWx1ZXMiIGRvCiAgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3Ci0gICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKAorICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKAogICAgICAgICBbJ3NpbXBsZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMV0sCiAgICAgICAgIFsnY29tcGxleCcsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgNV0sCiAgICAgICAgIFsndGhpbnonLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDddLApAQCAtMTYyLDU1ICsxNjIsNTUgQEAKICAgICAgICAgWyd3b3JkcycsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMl0sCiAgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg1KS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oNDIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigiZm9vYmFyIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpNQVApCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNSkudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybig0MikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigiZm9vYmFyIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6Ok1BUCkKICAgICAgICMgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkkzMiwgVGhyaWZ0OjpUeXBlczo6STMyLCAwXSkKICAgICAgICMgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIpCiAgICAgICBzdHJ1Y3QucmVhZChwcm90KQogCi0gICAgICBzdHJ1Y3Quc2ltcGxlLnNob3VsZCA9PSA0MgotICAgICAgc3RydWN0LmNvbXBsZXguc2hvdWxkIGJlX25pbAotICAgICAgc3RydWN0LndvcmRzLnNob3VsZCA9PSAiZm9vYmFyIgotICAgICAgc3RydWN0LmhlbGxvLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdoZWxsbywgd29ybGQhJykKLSAgICAgIHN0cnVjdC5pbnRzLnNob3VsZCA9PSBbMSwgMiwgMiwgM10KLSAgICAgIHN0cnVjdC5zaG9ydHMuc2hvdWxkID09IFNldC5uZXcoWzUsIDE3LCAyMzldKQorICAgICAgZXhwZWN0KHN0cnVjdC5zaW1wbGUpLnRvIGVxKDQyKQorICAgICAgZXhwZWN0KHN0cnVjdC5jb21wbGV4KS50byBiZV9uaWwKKyAgICAgIGV4cGVjdChzdHJ1Y3Qud29yZHMpLnRvIGVxKCJmb29iYXIiKQorICAgICAgZXhwZWN0KHN0cnVjdC5oZWxsbykudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnaGVsbG8sIHdvcmxkIScpKQorICAgICAgZXhwZWN0KHN0cnVjdC5pbnRzKS50byBlcShbMSwgMiwgMiwgM10pCisgICAgICBleHBlY3Qoc3RydWN0LnNob3J0cykudG8gZXEoU2V0Lm5ldyhbNSwgMTcsIDIzOV0pKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBpdHNlbGYgdG8gdGhlIHdpcmUiIGRvCi0gICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKSAjbW9jaygiUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpGb28iKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ludHMnLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCA0KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMikudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvbXBsZXgnLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDUpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnZm9vJykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgxLjIzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ3Nob3J0cycsIFRocmlmdDo6VHlwZXM6OlNFVCwgNikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCg1KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDE3KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDIzOSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLmV4YWN0bHkoNikudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdzaW1wbGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNTMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnaGVsbG8nLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZ3JlZXRpbmcnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ2hlbGxvLCB3b3JsZCEnKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWFwX2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkzMiwgVGhyaWZ0OjpUeXBlczo6TUFQLCAxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWFwX2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWFwX2VuZCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2xpc3RfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyLCA0KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbGlzdF9lbmQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zZXRfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6STE2LCAzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc2V0X2VuZCkKKyAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkgI21vY2soIlByb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkZvbyIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnaW50cycsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDIpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDMpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvbXBsZXgnLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDUpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdmb28nKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgxLjIzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdzaG9ydHMnLCBUaHJpZnQ6OlR5cGVzOjpTRVQsIDYpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDUpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDE3KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgyMzkpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLmV4YWN0bHkoNikudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnc2ltcGxlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAxKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1MykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnaGVsbG8nLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDMpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2dyZWV0aW5nJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnaGVsbG8sIHdvcmxkIScpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWFwX2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkzMiwgVGhyaWZ0OjpUeXBlczo6TUFQLCAxKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21hcF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9tYXBfZW5kKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2xpc3RfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyLCA0KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2xpc3RfZW5kKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3NldF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMTYsIDMpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc2V0X2VuZCkKIAogICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldwogICAgICAgc3RydWN0LndvcmRzID0gbmlsCkBAIC0yMjEsNTAgKzIyMSw1MCBAQAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHByZXNlbnRlZCB3aXRoIGFuIHVua25vd24gY29udGFpbmVyIiBkbwogICAgICAgIyB5ZWFoIHRoaXMgaXMgc2lsbHksIGJ1dCBJJ20gZ29pbmcgZm9yIGNvZGUgY292ZXJhZ2UgaGVyZQogICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldwotICAgICAgbGFtYmRhIHsgc3RydWN0LnNlbmQgOndyaXRlX2NvbnRhaW5lciwgbmlsLCBuaWwsIHs6dHlwZSA9PiAiZm9vIn0gfS5zaG91bGQgcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvciwgIk5vdCBhIGNvbnRhaW5lciB0eXBlOiBmb28iKQorICAgICAgZXhwZWN0IHsgc3RydWN0LnNlbmQgOndyaXRlX2NvbnRhaW5lciwgbmlsLCBuaWwsIHs6dHlwZSA9PiAiZm9vIn0gfS50byByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiTm90IGEgY29udGFpbmVyIHR5cGU6IGZvbyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN1cHBvcnQgb3B0aW9uYWwgdHlwZS1jaGVja2luZyBpbiBUaHJpZnQ6OlN0cnVjdC5uZXciIGRvCiAgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IHRydWUKICAgICAgIGJlZ2luCi0gICAgICAgIGxhbWJkYSB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gMykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsICJFeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCBGaXhudW0gZm9yIGZpZWxkIGdyZWV0aW5nIikKKyAgICAgICAgZXhwZWN0IHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCAvRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgKEludGVnZXJ8Rml4bnVtKSBmb3IgZmllbGQgZ3JlZXRpbmcvKQogICAgICAgZW5zdXJlCiAgICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gZmFsc2UKICAgICAgIGVuZAotICAgICAgbGFtYmRhIHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+IDMpIH0ubm90X3RvIHJhaXNlX2Vycm9yCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN1cHBvcnQgb3B0aW9uYWwgdHlwZS1jaGVja2luZyBpbiBmaWVsZCBhY2Nlc3NvcnMiIGRvCiAgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IHRydWUKICAgICAgIGJlZ2luCiAgICAgICAgIGhlbGxvID0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3Ci0gICAgICAgIGxhbWJkYSB7IGhlbGxvLmdyZWV0aW5nID0gMyB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgIkV4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIEZpeG51bSBmb3IgZmllbGQgZ3JlZXRpbmciKQorICAgICAgICBleHBlY3QgeyBoZWxsby5ncmVldGluZyA9IDMgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgL0V4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIChJbnRlZ2VyfEZpeG51bSkgZm9yIGZpZWxkIGdyZWV0aW5nLykKICAgICAgIGVuc3VyZQogICAgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IGZhbHNlCiAgICAgICBlbmQKLSAgICAgIGxhbWJkYSB7IGhlbGxvLmdyZWV0aW5nID0gMyB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBoZWxsby5ncmVldGluZyA9IDMgfS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdW5rbm93biB0eXBlcyBhcmUgZ2l2ZW4gdG8gVGhyaWZ0OjpTdHJ1Y3QubmV3IiBkbwotICAgICAgbGFtYmRhIHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpmaXNoID0+ICdzYWxtb24nKSB9LnNob3VsZCByYWlzZV9lcnJvcihFeGNlcHRpb24sICJVbmtub3duIGtleSBnaXZlbiB0byBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXc6IGZpc2giKQorICAgICAgZXhwZWN0IHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpmaXNoID0+ICdzYWxtb24nKSB9LnRvIHJhaXNlX2Vycm9yKEV4Y2VwdGlvbiwgIlVua25vd24ga2V5IGdpdmVuIHRvIFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldzogZmlzaCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN1cHBvcnQgYHJhaXNlIFhjZXB0aW9uLCAnbWVzc2FnZSdgIGZvciBFeGNlcHRpb24gc3RydWN0cyIgZG8KICAgICAgIGJlZ2luCiAgICAgICAgIHJhaXNlIFNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uLCAic29tZXRoaW5nIGhhcHBlbmVkIgogICAgICAgcmVzY3VlIFRocmlmdDo6RXhjZXB0aW9uID0+IGUKLSAgICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAic29tZXRoaW5nIGhhcHBlbmVkIgotICAgICAgICBlLmNvZGUuc2hvdWxkID09IDEKKyAgICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInNvbWV0aGluZyBoYXBwZW5lZCIpCisgICAgICAgIGV4cGVjdChlLmNvZGUpLnRvIGVxKDEpCiAgICAgICAgICMgZW5zdXJlIGl0IGdldHMgc2VyaWFsaXplZCBwcm9wZXJseSwgdGhpcyBpcyB0aGUgcmVhbGx5IGltcG9ydGFudCBwYXJ0Ci0gICAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnMiKSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdtZXNzYWdlJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKSMsICJzb21ldGhpbmcgaGFwcGVuZWQiKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInNvbWV0aGluZyBoYXBwZW5lZCIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb2RlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAyKSMsIDEpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgxKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCisgICAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFucyIpKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ21lc3NhZ2UnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpIywgInNvbWV0aGluZyBoYXBwZW5lZCIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInNvbWV0aGluZyBoYXBwZW5lZCIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29kZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikjLCAxKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDEpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQogCiAgICAgICAgIGUud3JpdGUocHJvdCkKICAgICAgIGVuZApAQCAtMjc0LDE3ICsyNzQsMTcgQEAKICAgICAgIGJlZ2luCiAgICAgICAgIHJhaXNlIFNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uLCA6bWVzc2FnZSA9PiAic29tZXRoaW5nIGhhcHBlbmVkIiwgOmNvZGUgPT4gNQogICAgICAgcmVzY3VlIFRocmlmdDo6RXhjZXB0aW9uID0+IGUKLSAgICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAic29tZXRoaW5nIGhhcHBlbmVkIgotICAgICAgICBlLmNvZGUuc2hvdWxkID09IDUKLSAgICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFucyIpKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ21lc3NhZ2UnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgic29tZXRoaW5nIGhhcHBlbmVkIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvZGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1KQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCisgICAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGVxKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QoZS5jb2RlKS50byBlcSg1KQorICAgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnMiKSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6WGNlcHRpb24iKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdtZXNzYWdlJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvZGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCiAKICAgICAgICAgZS53cml0ZShwcm90KQogICAgICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy90aGluX2h0dHBfc2VydmVyX3NwZWMucmIgYi9saWIvcmIvc3BlYy90aGluX2h0dHBfc2VydmVyX3NwZWMucmIKaW5kZXggNTUyMDgzOS4uNjY1MzkxYiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvdGhpbl9odHRwX3NlcnZlcl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3RoaW5faHR0cF9zZXJ2ZXJfc3BlYy5yYgpAQCAtMjMsMjQgKzIzLDI0IEBACiAKIGRlc2NyaWJlIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIgZG8KIAotICBsZXQoOnByb2Nlc3NvcikgeyBtb2NrKCdwcm9jZXNzb3InKSB9CisgIGxldCg6cHJvY2Vzc29yKSB7IGRvdWJsZSgncHJvY2Vzc29yJykgfQogCiAgIGRlc2NyaWJlICIjaW5pdGlhbGl6ZSIgZG8KIAogICAgIGNvbnRleHQgIndoZW4gdXNpbmcgdGhlIGRlZmF1bHRzIiBkbwogCiAgICAgICBpdCAiYmluZHMgdG8gcG9ydCA4MCwgd2l0aCBob3N0IDAuMC4wLjAsIGEgcGF0aCBvZiAnLyciIGRvCi0gICAgICAgIFRoaW46OlNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCcwLjAuMC4wJywgODAsIGFuX2luc3RhbmNlX29mKFJhY2s6OkJ1aWxkZXIpKQorICAgICAgICBleHBlY3QoVGhpbjo6U2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoJzAuMC4wLjAnLCA4MCwgYW5faW5zdGFuY2Vfb2YoUmFjazo6QnVpbGRlcikpCiAgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvcikKICAgICAgIGVuZAogCiAgICAgICBpdCAnY3JlYXRlcyBhIFRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb25Db250ZXh0JyBkbwotICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24uc2hvdWxkX3JlY2VpdmUoOmZvcikud2l0aCgiLyIsIHByb2Nlc3NvciwgYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkpKS5hbmRfcmV0dXJuKGFueXRoaW5nKQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uKS50byByZWNlaXZlKDpmb3IpLndpdGgoIi8iLCBwcm9jZXNzb3IsIGFuX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5KSkuYW5kX3JldHVybihhbnl0aGluZykKICAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yKQogICAgICAgZW5kCiAKICAgICAgIGl0ICJ1c2VzIHRoZSBCaW5hcnlQcm90b2NvbEZhY3RvcnkiIGRvCi0gICAgICAgIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5LnNob3VsZF9yZWNlaXZlKDpuZXcpCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSkudG8gcmVjZWl2ZSg6bmV3KQogICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IpCiAgICAgICBlbmQKIApAQCAtNTIsNyArNTIsNyBAQAogICAgICAgICBpcCA9ICIxOTIuMTY4LjAuMSIKICAgICAgICAgcG9ydCA9IDMwMDAKICAgICAgICAgcGF0aCA9ICIvdGhpbiIKLSAgICAgICAgVGhpbjo6U2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoaXAsIHBvcnQsIGFuX2luc3RhbmNlX29mKFJhY2s6OkJ1aWxkZXIpKQorICAgICAgICBleHBlY3QoVGhpbjo6U2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoaXAsIHBvcnQsIGFuX2luc3RhbmNlX29mKFJhY2s6OkJ1aWxkZXIpKQogICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aXAgPT4gaXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6cG9ydCA9PiBwb3J0LApAQCAtNjAsNyArNjAsNyBAQAogICAgICAgZW5kCiAKICAgICAgIGl0ICdjcmVhdGVzIGEgVGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbkNvbnRleHQgd2l0aCBhIGRpZmZlcmVudCBwcm90b2NvbCBmYWN0b3J5JyBkbwotICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24uc2hvdWxkX3JlY2VpdmUoOmZvcikud2l0aCgiLyIsIHByb2Nlc3NvciwgYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5KSkuYW5kX3JldHVybihhbnl0aGluZykKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbikudG8gcmVjZWl2ZSg6Zm9yKS53aXRoKCIvIiwgcHJvY2Vzc29yLCBhbl9pbnN0YW5jZV9vZihUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkpKS5hbmRfcmV0dXJuKGFueXRoaW5nKQogICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6cHJvdG9jb2xfZmFjdG9yeSA9PiBUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3KQogICAgICAgZW5kCkBAIC03MiwxMiArNzIsMTIgQEAKICAgZGVzY3JpYmUgIiNzZXJ2ZSIgZG8KIAogICAgIGl0ICdzdGFydHMgdGhlIFRoaW4gc2VydmVyJyBkbwotICAgICAgdW5kZXJseWluZ190aGluX3NlcnZlciA9IG1vY2soJ3RoaW4gc2VydmVyJywgOnN0YXJ0ID0+IHRydWUpCi0gICAgICBUaGluOjpTZXJ2ZXIuc3R1Yig6bmV3KS5hbmRfcmV0dXJuKHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIpCisgICAgICB1bmRlcmx5aW5nX3RoaW5fc2VydmVyID0gZG91YmxlKCd0aGluIHNlcnZlcicsIDpzdGFydCA9PiB0cnVlKQorICAgICAgYWxsb3coVGhpbjo6U2VydmVyKS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odW5kZXJseWluZ190aGluX3NlcnZlcikKIAogICAgICAgdGhpbl90aHJpZnRfc2VydmVyID0gVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yKQogCi0gICAgICB1bmRlcmx5aW5nX3RoaW5fc2VydmVyLnNob3VsZF9yZWNlaXZlKDpzdGFydCkKKyAgICAgIGV4cGVjdCh1bmRlcmx5aW5nX3RoaW5fc2VydmVyKS50byByZWNlaXZlKDpzdGFydCkKICAgICAgIHRoaW5fdGhyaWZ0X3NlcnZlci5zZXJ2ZQogICAgIGVuZAogICBlbmQKQEAgLTg3LDggKzg3LDggQEAKIGRlc2NyaWJlIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbiBkbwogICBpbmNsdWRlIFJhY2s6OlRlc3Q6Ok1ldGhvZHMKIAotICBsZXQoOnByb2Nlc3NvcikgeyBtb2NrKCdwcm9jZXNzb3InKSB9Ci0gIGxldCg6cHJvdG9jb2xfZmFjdG9yeSkgeyBtb2NrKCdwcm90b2NvbCBmYWN0b3J5JykgfQorICBsZXQoOnByb2Nlc3NvcikgeyBkb3VibGUoJ3Byb2Nlc3NvcicpIH0KKyAgbGV0KDpwcm90b2NvbF9mYWN0b3J5KSB7IGRvdWJsZSgncHJvdG9jb2wgZmFjdG9yeScpIH0KIAogICBkZWYgYXBwCiAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uLmZvcigiLyIsIHByb2Nlc3NvciwgcHJvdG9jb2xfZmFjdG9yeSkKQEAgLTk5LDEzICs5OSwxMyBAQAogICAgIGl0ICdyZWNlaXZlcyBhIG5vbi1QT1NUJyBkbwogICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGUnLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQogICAgICAgZ2V0ICIvIgotICAgICAgbGFzdF9yZXNwb25zZS5zdGF0dXMuc2hvdWxkIGJlIDQwNAorICAgICAgZXhwZWN0KGxhc3RfcmVzcG9uc2Uuc3RhdHVzKS50byBiZSA0MDQKICAgICBlbmQKIAogICAgIGl0ICdyZWNlaXZlcyBhIGhlYWRlciBvdGhlciB0aGFuIGFwcGxpY2F0aW9uL3gtdGhyaWZ0JyBkbwogICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGUnLCAiYXBwbGljYXRpb24vanNvbiIpCiAgICAgICBwb3N0ICIvIgotICAgICAgbGFzdF9yZXNwb25zZS5zdGF0dXMuc2hvdWxkIGJlIDQwNAorICAgICAgZXhwZWN0KGxhc3RfcmVzcG9uc2Uuc3RhdHVzKS50byBiZSA0MDQKICAgICBlbmQKIAogICBlbmQKQEAgLTExMywyNiArMTEzLDI2IEBACiAgIGNvbnRleHQgIjIwMCByZXNwb25zZSIgZG8KIAogICAgIGJlZm9yZSBkbwotICAgICAgcHJvdG9jb2xfZmFjdG9yeS5zdHViKDpnZXRfcHJvdG9jb2wpCi0gICAgICBwcm9jZXNzb3Iuc3R1Yig6cHJvY2VzcykKKyAgICAgIGFsbG93KHByb3RvY29sX2ZhY3RvcnkpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkKKyAgICAgIGFsbG93KHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2VzcykKICAgICBlbmQKIAogICAgIGl0ICdjcmVhdGVzIGFuIElPU3RyZWFtVHJhbnNwb3J0JyBkbwogICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGUnLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQotICAgICAgVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKGFuX2luc3RhbmNlX29mKFJhY2s6OkxpbnQ6OklucHV0V3JhcHBlciksIGFuX2luc3RhbmNlX29mKFJhY2s6OlJlc3BvbnNlKSkKKyAgICAgIGV4cGVjdChUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0KS50byByZWNlaXZlKDpuZXcpLndpdGgoYW5faW5zdGFuY2Vfb2YoUmFjazo6TGludDo6SW5wdXRXcmFwcGVyKSwgYW5faW5zdGFuY2Vfb2YoUmFjazo6UmVzcG9uc2UpKQogICAgICAgcG9zdCAiLyIKICAgICBlbmQKIAogICAgIGl0ICdmZXRjaGVzIHRoZSByaWdodCBwcm90b2NvbCBiYXNlZCBvbiB0aGUgVHJhbnNwb3J0JyBkbwogICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGUnLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeS5zaG91bGRfcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS53aXRoKGFuX2luc3RhbmNlX29mKFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQpKQorICAgICAgZXhwZWN0KHByb3RvY29sX2ZhY3RvcnkpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkud2l0aChhbl9pbnN0YW5jZV9vZihUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0KSkKICAgICAgIHBvc3QgIi8iCiAgICAgZW5kCiAKICAgICBpdCAnc3RhdHVzIGNvZGUgMjAwJyBkbwogICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGUnLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQogICAgICAgcG9zdCAiLyIKLSAgICAgIGxhc3RfcmVzcG9uc2Uub2s/LnNob3VsZCBiZV90cnVlCisgICAgICBleHBlY3QobGFzdF9yZXNwb25zZS5vaz8pLnRvIGJlX3RydXRoeQogICAgIGVuZAogCiAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvdHlwZXNfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3R5cGVzX3NwZWMucmIKaW5kZXggYjJjM2EyMC4uZDU5NWFiNSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvdHlwZXNfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy90eXBlc19zcGVjLnJiCkBAIC0zMSw4NSArMzEsODggQEAKIAogICBjb250ZXh0ICd0eXBlIGNoZWNraW5nJyBkbwogICAgIGl0ICJzaG91bGQgcmV0dXJuIHRoZSBwcm9wZXIgbmFtZSBmb3IgZWFjaCB0eXBlIiBkbwotICAgICAgVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpJMTYpLnNob3VsZCA9PSAiVHlwZXM6OkkxNiIKLSAgICAgIFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6Vk9JRCkuc2hvdWxkID09ICJUeXBlczo6Vk9JRCIKLSAgICAgIFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6TElTVCkuc2hvdWxkID09ICJUeXBlczo6TElTVCIKLSAgICAgIFRocmlmdC50eXBlX25hbWUoNDIpLnNob3VsZCBiZV9uaWwKKyAgICAgIGV4cGVjdChUaHJpZnQudHlwZV9uYW1lKFRocmlmdDo6VHlwZXM6OkkxNikpLnRvIGVxKCJUeXBlczo6STE2IikKKyAgICAgIGV4cGVjdChUaHJpZnQudHlwZV9uYW1lKFRocmlmdDo6VHlwZXM6OlZPSUQpKS50byBlcSgiVHlwZXM6OlZPSUQiKQorICAgICAgZXhwZWN0KFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6TElTVCkpLnRvIGVxKCJUeXBlczo6TElTVCIpCisgICAgICBleHBlY3QoVGhyaWZ0LnR5cGVfbmFtZSg0MikpLnRvIGJlX25pbAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjaGVjayB0eXBlcyBwcm9wZXJseSIgZG8KICAgICAgICMgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RPUH0sICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsICAgICAgICAgICAgezp0eXBlID0+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+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp2YWx1ZSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfX19Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbe25pbCA9PiAzfV0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoW3tuaWwgPT4gM31dLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQogICAgICAgbXNnID0gIkV4cGVjdGVkIFR5cGVzOjpJMzIsIHJlY2VpdmVkIE5pbENsYXNzIGZvciBmaWVsZCBmb28uZWxlbWVudC52YWx1ZSIKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFt7MSA9PiBuaWx9XSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbezEgPT4gbmlsfV0sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy91bmlvbl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvdW5pb25fc3BlYy5yYgppbmRleCBhNDI3MDkwLi4wY2U2MzA2IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy91bmlvbl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3VuaW9uX3NwZWMucmIKQEAgLTI0LDc4ICsyNCw4NSBAQAogICBkZXNjcmliZSBUaHJpZnQ6OlVuaW9uIGRvCiAgICAgaXQgInNob3VsZCByZXR1cm4gbmlsIHZhbHVlIGluIHVuc2V0IHVuaW9uIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IG5pbAotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcShuaWwpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNldCBhIGZpZWxkIGFuZCBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggZ2V0X3ZhbHVlIGFuZCB0aGUgbmFtZWQgZmllbGQgYWNjZXNzb3IiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldwogICAgICAgdW5pb24uaW50ZWdlcjMyID0gMjUKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gMjUKLSAgICAgIHVuaW9uLmludGVnZXIzMi5zaG91bGQgPT0gMjUKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEoMjUpCisgICAgICBleHBlY3QodW5pb24uaW50ZWdlcjMyKS50byBlcSgyNSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd29yayBjb3JyZWN0bHkgd2hlbiBpbnN0YW50aWF0ZWQgd2l0aCBzdGF0aWMgZmllbGQgY29uc3RydWN0b3JzIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5pbnRlZ2VyMzIoNSkKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmludGVnZXIzMi5zaG91bGQgPT0gNQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCisgICAgICBleHBlY3QodW5pb24uaW50ZWdlcjMyKS50byBlcSg1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSBmb3Igd3Jvbmcgc2V0IGZpZWxkIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKICAgICAgIHVuaW9uLmludGVnZXIzMiA9IDI1Ci0gICAgICBsYW1iZGEgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS5zaG91bGQgcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic29tZV9jaGFyYWN0ZXJzIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQorICAgICAgZXhwZWN0IHsgdW5pb24uc29tZV9jaGFyYWN0ZXJzIH0udG8gcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic29tZV9jaGFyYWN0ZXJzIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByYWlzZSBmb3Igd3Jvbmcgc2V0IGZpZWxkIHdoZW4gaGFzaCBpbml0aWFsaXplZCBhbmQgdHlwZSBjaGVja2luZyBpcyBvZmYiIGRvCisgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IGZhbHNlCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyh7aW5jb3JyZWN0X2ZpZWxkOiA6aW5jb3JyZWN0fSkKKyAgICAgIGV4YW1wbGUgPSBsYW1iZGEgeyBUaHJpZnQ6OlNlcmlhbGl6ZXIubmV3LnNlcmlhbGl6ZSh1bmlvbikgfQorICAgICAgZXhwZWN0KGV4YW1wbGUpLnRvIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNldF9maWVsZCBpcyBub3QgdmFsaWQgZm9yIHRoaXMgdW5pb24hIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGJlIGVxdWFsIHRvIG5pbCIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3Ci0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG5pbAorICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgYmUgZXF1YWwgd2l0aCBhbiBlbXB0eSBTdHJpbmciIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldwotICAgICAgdW5pb24uc2hvdWxkX25vdCA9PSAnJworICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEoJycpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBlcXVhdGUgdHdvIGRpZmZlcmVudCB1bmlvbnMsIGkzMiB2cy4gc3RyaW5nIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9jaGFyYWN0ZXJzLCAiYmxhaCEiKQotICAgICAgdW5pb24uc2hvdWxkX25vdCA9PSBvdGhlcl91bmlvbgorICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEob3RoZXJfdW5pb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByb3Blcmx5IHJlc2V0IHNldGZpZWxkIGFuZCBzZXR2YWx1ZSIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCiAgICAgICB1bmlvbi5zb21lX2NoYXJhY3RlcnMgPSAiYmxhaCEiCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6c29tZV9jaGFyYWN0ZXJzCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09ICJibGFoISIKLSAgICAgIGxhbWJkYSB7IHVuaW9uLmludGVnZXIzMiB9LnNob3VsZCByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJpbnRlZ2VyMzIgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOnNvbWVfY2hhcmFjdGVycykKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKCJibGFoISIpCisgICAgICBleHBlY3QgeyB1bmlvbi5pbnRlZ2VyMzIgfS50byByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJpbnRlZ2VyMzIgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBlcXVhdGUgdHdvIGRpZmZlcmVudCB1bmlvbnMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCA0MDApCi0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG90aGVyX3VuaW9uCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShvdGhlcl91bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGVxdWF0ZSB0d28gZGlmZmVyZW50IHVuaW9ucyB3aXRoIGRpZmZlcmVudCBmaWVsZHMiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKICAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpvdGhlcl9pMzIsIDI1KQotICAgICAgdW5pb24uc2hvdWxkX25vdCA9PSBvdGhlcl91bmlvbgorICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEob3RoZXJfdW5pb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGluc3BlY3QgcHJvcGVybHkiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKLSAgICAgIHVuaW9uLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gaW50ZWdlcjMyOiAyNT4iCisgICAgICBleHBlY3QodW5pb24uaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBpbnRlZ2VyMzI6IDI1PiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBhbGxvdyBzZXR0aW5nIHdpdGggaW5zdGFuY2VfdmFyaWFibGVfc2V0IiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjcpCiAgICAgICB1bmlvbi5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkBzb21lX2NoYXJhY3RlcnMsICJoYWxsbyEiKQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSAyNwotICAgICAgbGFtYmRhIHsgdW5pb24uc29tZV9jaGFyYWN0ZXJzIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNvbWVfY2hhcmFjdGVycyBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEoMjcpCisgICAgICBleHBlY3QgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS50byByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzb21lX2NoYXJhY3RlcnMgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSB0byBiaW5hcnkgY29ycmVjdGx5IiBkbwpAQCAtMTA3LDcgKzExNCw3IEBACiAKICAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQogICAgICAgb3RoZXJfdW5pb24ucmVhZChwcm90bykKLSAgICAgIG90aGVyX3VuaW9uLnNob3VsZCA9PSB1bmlvbgorICAgICAgZXhwZWN0KG90aGVyX3VuaW9uKS50byBlcSh1bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIHRvIGpzb24gY29ycmVjdGx5IiBkbwpAQCAtMTE5LDI0ICsxMjYsMjQgQEAKIAogICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCiAgICAgICBvdGhlcl91bmlvbi5yZWFkKHByb3RvKQotICAgICAgb3RoZXJfdW5pb24uc2hvdWxkID09IHVuaW9uCisgICAgICBleHBlY3Qob3RoZXJfdW5pb24pLnRvIGVxKHVuaW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSB3aGVuIHZhbGlkYXRpbmcgdW5zZXQgdW5pb24iIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldwotICAgICAgbGFtYmRhIHsgdW5pb24udmFsaWRhdGUgfS5zaG91bGQgcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvciwgIlVuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4iKQorICAgICAgZXhwZWN0IHsgdW5pb24udmFsaWRhdGUgfS50byByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LiIpCiAKICAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDEpCi0gICAgICBsYW1iZGEgeyBvdGhlcl91bmlvbi52YWxpZGF0ZSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvciwgIlVuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4iKQorICAgICAgZXhwZWN0IHsgb3RoZXJfdW5pb24udmFsaWRhdGUgfS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgdmFsaWRhdGUgYW4gZW51bSBmaWVsZCBwcm9wZXJseSIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6ZW51bV9maWVsZCwgMykKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDplbnVtX2ZpZWxkCi0gICAgICBsYW1iZGEgeyB1bmlvbi52YWxpZGF0ZSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAiSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCBlbnVtX2ZpZWxkISIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmVudW1fZmllbGQpCisgICAgICBleHBlY3QgeyB1bmlvbi52YWxpZGF0ZSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICJJbnZhbGlkIHZhbHVlIG9mIGZpZWxkIGVudW1fZmllbGQhIikKIAogICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDplbnVtX2ZpZWxkLCAxKQotICAgICAgbGFtYmRhIHsgb3RoZXJfdW5pb24udmFsaWRhdGUgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICJJbnZhbGlkIHZhbHVlIG9mIGZpZWxkIGVudW1fZmllbGQhIikKKyAgICAgIGV4cGVjdCB7IG90aGVyX3VuaW9uLnZhbGlkYXRlIH0ubm90X3RvIHJhaXNlX2Vycm9yCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByb3Blcmx5IHNlcmlhbGl6ZSBhbmQgbWF0Y2ggc3RydWN0cyB3aXRoIGEgdW5pb24iIGRvCkBAIC0xNTEsMzcgKzE1OCwzNyBAQAogICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOnNvbWVfY2hhcmFjdGVycywgImhlbGxvIHRoZXJlIikKICAgICAgIHN3dTIgPSBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3Rfd2l0aF91bmlvbi5uZXcoOmZ1bl91bmlvbiA9PiBvdGhlcl91bmlvbikKIAotICAgICAgc3d1Mi5zaG91bGRfbm90ID09IHN3dQorICAgICAgZXhwZWN0KHN3dTIpLm5vdF90byBlcShzd3UpCiAKICAgICAgIHN3dTIucmVhZChwcm90bykKLSAgICAgIHN3dTIuc2hvdWxkID09IHN3dQorICAgICAgZXhwZWN0KHN3dTIpLnRvIGVxKHN3dSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3VwcG9ydCBvbGQgc3R5bGUgY29uc3RydWN0b3IiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyID0+IDI2KQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSAyNgorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcSgyNikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IHRocm93IGFuIGVycm9yIHdoZW4gaW5zcGVjdGVkIGFuZCB1bnNldCIgZG8KLSAgICAgIGxhbWJkYXtTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KCkuaW5zcGVjdH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0e1NwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoKS5pbnNwZWN0fS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJpbnQgZW51bSB2YWx1ZSBuYW1lIHdoZW4gaW5zcGVjdGVkIiBkbwotICAgICAgU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBzb21lX2VudW06IE9ORSAoMCk+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gc29tZV9lbnVtOiBPTkUgKDApPiIpCiAKLSAgICAgIFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6bXlfbWFwID0+IHtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FID0+IFtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6VFdPXX0pLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gbXlfbWFwOiB7T05FICgwKTogW1RXTyAoMSldfT4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpteV9tYXAgPT4ge1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUgPT4gW1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV09dfSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBteV9tYXA6IHtPTkUgKDApOiBbVFdPICgxKV19PiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG9mZmVyIGZpZWxkPyBtZXRob2RzIiBkbwotICAgICAgU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3LnNvbWVfZW51bT8uc2hvdWxkIGJlX2ZhbHNlCi0gICAgICBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5zb21lX2VudW0/LnNob3VsZCBiZV90cnVlCi0gICAgICBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmltX3RydWUgPT4gZmFsc2UpLmltX3RydWU/LnNob3VsZCBiZV90cnVlCi0gICAgICBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmltX3RydWUgPT4gdHJ1ZSkuaW1fdHJ1ZT8uc2hvdWxkIGJlX3RydWUKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcuc29tZV9lbnVtPykudG8gYmVfZmFsc2V5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuc29tZV9lbnVtPykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbV90cnVlID0+IGZhbHNlKS5pbV90cnVlPykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbV90cnVlID0+IHRydWUpLmltX3RydWU/KS50byBiZV90cnV0aHkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJldHR5IHByaW50IGJpbmFyeSBmaWVsZHMiIGRvCi0gICAgICBTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDpiaW5hcnlfZmllbGQgPT4gIlwwMDFcMDAyXDAwMyIpLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uIGJpbmFyeV9maWVsZDogMDEwMjAzPiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDpiaW5hcnlfZmllbGQgPT4gIlwwMDFcMDAyXDAwMyIpLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uIGJpbmFyeV9maWVsZDogMDEwMjAzPiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJlIGNvbXBhcmFibGUiIGRvCkBAIC0yMDAsNyArMjA3LDcgQEAKICAgICAgIGZvciB5IGluIDAuLjMKICAgICAgICAgZm9yIHggaW4gMC4uMwogICAgICAgICAgICMgcHV0cyAiI3tvYmpzW3ldLmluc3BlY3R9IDw9PiAje29ianNbeF0uaW5zcGVjdH0gc2hvdWxkID09ICN7cmVsYXRpb25zaGlwc1t5XVt4XX0iCi0gICAgICAgICAgKG9ianNbeV0gPD0+IG9ianNbeF0pLnNob3VsZCA9PSByZWxhdGlvbnNoaXBzW3ldW3hdCisgICAgICAgICAgZXhwZWN0KG9ianNbeV0gPD0+IG9ianNbeF0pLnRvIGVxKHJlbGF0aW9uc2hpcHNbeV1beF0pCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy91bml4X3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvdW5peF9zb2NrZXRfc3BlYy5yYgppbmRleCBjYjZjZmYzLi44NjIzZTk1IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy91bml4X3NvY2tldF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3VuaXhfc29ja2V0X3NwZWMucmIKQEAgLTI2LDIxICsyNiwyNiBAQAogICAgIGJlZm9yZSg6ZWFjaCkgZG8KICAgICAgIEBwYXRoID0gJy90bXAvdGhyaWZ0X3NwZWNfc29ja2V0JwogICAgICAgQHNvY2tldCA9IFRocmlmdDo6VU5JWFNvY2tldC5uZXcoQHBhdGgpCi0gICAgICBAaGFuZGxlID0gbW9jaygiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBAaGFuZGxlLnN0dWIhKDpjbG9zZSkKLSAgICAgIDo6VU5JWFNvY2tldC5zdHViISg6bmV3KS5hbmRfcmV0dXJuKEBoYW5kbGUpCisgICAgICBAaGFuZGxlID0gZG91YmxlKCJIYW5kbGUiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgYWxsb3coOjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKICAgICBlbmQKIAogICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAiYSBzb2NrZXQiCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGEgVHJhbnNwb3J0RXhjZXB0aW9uIHdoZW4gaXQgY2Fubm90IG9wZW4gYSBzb2NrZXQiIGRvCi0gICAgICA6OlVOSVhTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgICBsYW1iZGEgeyBAc29ja2V0Lm9wZW4gfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOIH0KKyAgICAgIGV4cGVjdCg6OlVOSVhTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgICBleHBlY3QgeyBAc29ja2V0Lm9wZW4gfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCB0aW1lb3V0IiBkbwotICAgICAgOjpVTklYU29ja2V0LnN0dWIhKDpuZXcpCi0gICAgICBUaHJpZnQ6OlVOSVhTb2NrZXQubmV3KEBwYXRoLCA1KS50aW1lb3V0LnNob3VsZCA9PSA1CisgICAgICBhbGxvdyg6OlVOSVhTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlVOSVhTb2NrZXQubmV3KEBwYXRoLCA1KS50aW1lb3V0KS50byBlcSg1KQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGFsbG93KDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgZXhwZWN0KFRocmlmdDo6VU5JWFNvY2tldC5uZXcoQHBhdGgpLnRvX3MpLnRvIGVxKCJkb21haW4oI3tAcGF0aH0pIikKICAgICBlbmQKICAgZW5kCiAKQEAgLTUxLDU3ICs1Niw2MSBAQAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBoYW5kbGUgd2hlbiBjYWxsaW5nIGxpc3RlbiIgZG8KLSAgICAgIFVOSVhTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcGF0aCkKKyAgICAgIGV4cGVjdChVTklYU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpCiAgICAgICBAc29ja2V0Lmxpc3RlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBUaHJpZnQ6OlVOSVhTb2NrZXQgdG8gd3JhcCBhY2NlcHRlZCBzb2NrZXRzIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVU5JWFNlcnZlciIpCi0gICAgICBVTklYU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJVTklYU2VydmVyIikKKyAgICAgIGV4cGVjdChVTklYU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIHNvY2sgPSBtb2NrKCJzb2NrIikKLSAgICAgIGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5hbmRfcmV0dXJuKHNvY2spCi0gICAgICB0cmFucyA9IG1vY2soIlVOSVhTb2NrZXQiKQotICAgICAgVGhyaWZ0OjpVTklYU29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odHJhbnMpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6aGFuZGxlPSkud2l0aChzb2NrKQotICAgICAgQHNvY2tldC5hY2NlcHQuc2hvdWxkID09IHRyYW5zCisgICAgICBzb2NrID0gZG91YmxlKCJzb2NrIikKKyAgICAgIGV4cGVjdChoYW5kbGUpLnRvIHJlY2VpdmUoOmFjY2VwdCkuYW5kX3JldHVybihzb2NrKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlVOSVhTb2NrZXQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHRyYW5zKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpoYW5kbGU9KS53aXRoKHNvY2spCisgICAgICBleHBlY3QoQHNvY2tldC5hY2NlcHQpLnRvIGVxKHRyYW5zKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjbG9zZSB0aGUgaGFuZGxlIHdoZW4gY2xvc2VkIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgVU5JWFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKLSAgICAgIEZpbGUuc3R1YiEoOmRlbGV0ZSkKKyAgICAgIGV4cGVjdChoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgYWxsb3coRmlsZSkudG8gcmVjZWl2ZSg6ZGVsZXRlKQogICAgICAgQHNvY2tldC5jbG9zZQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBkZWxldGUgdGhlIHNvY2tldCB3aGVuIGNsb3NlZCIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFVOSVhTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGV4cGVjdChVTklYU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2UpCi0gICAgICBGaWxlLnNob3VsZF9yZWNlaXZlKDpkZWxldGUpLndpdGgoQHBhdGgpCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgZXhwZWN0KEZpbGUpLnRvIHJlY2VpdmUoOmRlbGV0ZSkud2l0aChAcGF0aCkKICAgICAgIEBzb2NrZXQuY2xvc2UKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIG5pbCB3aGVuIGFjY2VwdGluZyBpZiB0aGVyZSBpcyBubyBoYW5kbGUiIGRvCi0gICAgICBAc29ja2V0LmFjY2VwdC5zaG91bGQgYmVfbmlsCisgICAgICBleHBlY3QoQHNvY2tldC5hY2NlcHQpLnRvIGJlX25pbAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgY2xvc2VkPyB3aGVuIGFwcHJvcHJpYXRlIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgVU5JWFNlcnZlci5zdHViISg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKLSAgICAgIEZpbGUuc3R1YiEoOmRlbGV0ZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGFsbG93KEZpbGUpLnRvIHJlY2VpdmUoOmRlbGV0ZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfY2xvc2VkCi0gICAgICBoYW5kbGUuc3R1YiEoOmNsb3NlKQorICAgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9jbG9zZWQKKyAgICAgIGFsbG93KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCiAgICAgICBAc29ja2V0LmNsb3NlCi0gICAgICBAc29ja2V0LnNob3VsZCBiZV9jbG9zZWQKKyAgICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9jbG9zZWQKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfY2xvc2VkCi0gICAgICBoYW5kbGUuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEBzb2NrZXQuc2hvdWxkIGJlX2Nsb3NlZAorICAgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9jbG9zZWQKKyAgICAgIGFsbG93KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX2Nsb3NlZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzb2NrZXQudG9fcykudG8gZXEoImRvbWFpbigje0BwYXRofSkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3RocmlmdC5nZW1zcGVjIGIvbGliL3JiL3RocmlmdC5nZW1zcGVjCmluZGV4IGI0MDc0Y2IuLjg2OWU1ZDkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi90aHJpZnQuZ2Vtc3BlYworKysgYi9saWIvcmIvdGhyaWZ0LmdlbXNwZWMKQEAgLTMsMTQgKzMsMTQgQEAKIAogR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3wKICAgcy5uYW1lICAgICAgICA9ICd0aHJpZnQnCi0gIHMudmVyc2lvbiAgICAgPSAnMC45LjMuMCcKLSAgcy5hdXRob3JzICAgICA9IFsnVGhyaWZ0IERldmVsb3BlcnMnXQorICBzLnZlcnNpb24gICAgID0gJzAuMTMuMCcKKyAgcy5hdXRob3JzICAgICA9IFsnQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzJ10KICAgcy5lbWFpbCAgICAgICA9IFsnZGV2QHRocmlmdC5hcGFjaGUub3JnJ10KICAgcy5ob21lcGFnZSAgICA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnCiAgIHMuc3VtbWFyeSAgICAgPSAlcXtSdWJ5IGJpbmRpbmdzIGZvciBBcGFjaGUgVGhyaWZ0fQogICBzLmRlc2NyaXB0aW9uID0gJXF7UnVieSBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbX0KLSAgcy5saWNlbnNlID0gJ0FwYWNoZSAyLjAnCi0gIHMuZXh0ZW5zaW9ucyA9IFsnZXh0L2V4dGNvbmYucmInXQorICBzLmxpY2Vuc2UgICAgID0gJ0FwYWNoZS0yLjAnCisgIHMuZXh0ZW5zaW9ucyAgPSBbJ2V4dC9leHRjb25mLnJiJ10KIAogICBzLmhhc19yZG9jICAgICAgPSB0cnVlCiAgIHMucmRvY19vcHRpb25zICA9ICV3Wy0tbGluZS1udW1iZXJzIC0taW5saW5lLXNvdXJjZSAtLXRpdGxlIFRocmlmdCAtLW1haW4gUkVBRE1FXQpAQCAtMjcsMTEgKzI3LDE0IEBACiAKICAgcy5yZXF1aXJlX3BhdGhzID0gJXdbbGliIGV4dF0KIAotICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyc3BlYycsICd+PiAyLjEwLjAnCi0gIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgInJhY2siLCAifj4gMS41LjIiCi0gIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgInJhY2stdGVzdCIsICJ+PiAwLjYuMiIKLSAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAidGhpbiIsICJ+PiAxLjUuMCIKLSAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAiYnVuZGxlciIKLSAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncmFrZScKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAnYnVuZGxlcicsICAgICAgICAgICAgJ34+IDEuMTEnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByeScsICAgICAgICAgICAgICAgICd+PiAwLjExLjMnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByeS1ieWVidWcnLCAgICAgICAgICd+PiAzLjYnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByeS1zdGFja19leHBsb3JlcicsICd+PiAwLjQuOS4yJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyYWNrJywgICAgICAgICAgICAgICAnfj4gMi4wJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyYWNrLXRlc3QnLCAgICAgICAgICAnfj4gMC44LjMnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3Jha2UnLCAgICAgICAgICAgICAgICd+PiAxMi4zJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyc3BlYycsICAgICAgICAgICAgICAnfj4gMy43JworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICd0aGluJywgICAgICAgICAgICAgICAnfj4gMS43JwogZW5kCiAKZGlmZiAtLWdpdCBhL2xpYi9ycy9DYXJnby50b21sIGIvbGliL3JzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyNWIxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTkgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJ0aHJpZnQiCitkZXNjcmlwdGlvbiA9ICJSdXN0IGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIgordmVyc2lvbiA9ICIwLjEzLjAiCitsaWNlbnNlID0gIkFwYWNoZS0yLjAiCithdXRob3JzID0gWyJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iXQoraG9tZXBhZ2UgPSAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgorZG9jdW1lbnRhdGlvbiA9ICJodHRwczovL3RocmlmdC5hcGFjaGUub3JnIgorcmVhZG1lID0gIlJFQURNRS5tZCIKK2V4Y2x1ZGUgPSBbIk1ha2VmaWxlKiIsICJ0ZXN0LyoqIiwgIiouaW1sIl0KK2tleXdvcmRzID0gWyJ0aHJpZnQiXQorCitbZGVwZW5kZW5jaWVzXQorYnl0ZW9yZGVyID0gIn4xLjIuMSIKK2ludGVnZXItZW5jb2RpbmcgPSAifjEuMC40IgorbG9nID0gIn4wLjMuOCIKK3RocmVhZHBvb2wgPSAifjEuNy4xIgordHJ5X2Zyb20gPSAifjAuMi4yIgorCmRpZmYgLS1naXQgYS9saWIvcnMvTWFrZWZpbGUuYW0gYi9saWIvcnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzNDEyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4KKworaWYgV0lUSF9URVNUUworU1VCRElSUyArPSB0ZXN0CitlbmRpZgorCitpbnN0YWxsOgorCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisJQGVjaG8gJ1RoZSBSdXN0IGNsaWVudCBsaWJyYXJ5IHNob3VsZCBiZSBpbnN0YWxsZWQgdmlhIGEgQ2FyZ28udG9tbCBkZXBlbmRlbmN5IC0gcGxlYXNlIHNlZSAvbGliL3JzL1JFQURNRS5tZCcKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCitjaGVjay1sb2NhbDoKKwkkKENBUkdPKSB0ZXN0CisKK2FsbC1sb2NhbDoKKwkkKENBUkdPKSBidWlsZAorCitjbGVhbi1sb2NhbDoKKwkkKENBUkdPKSBjbGVhbgorCS0kKFJNKSBDYXJnby5sb2NrCisKK0VYVFJBX0RJU1QgPSBcCisJc3JjIFwKKwlDYXJnby50b21sIFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9ycy9SRUFETUUubWQgYi9saWIvcnMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzdhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTExIEBACisjIFJ1c3QgVGhyaWZ0IGxpYnJhcnkKKworIyMgT3ZlcnZpZXcKKworVGhpcyBjcmF0ZSBpbXBsZW1lbnRzIHRoZSBjb21wb25lbnRzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgd29ya2luZyBUaHJpZnQgc2VydmVyCithbmQgY2xpZW50LiBJdCBpcyBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZyBtb2R1bGVzOgorCisgMS4gZXJyb3JzCisgMi4gcHJvdG9jb2wKKyAzLiB0cmFuc3BvcnQKKyA0LiBzZXJ2ZXIKKyA1LiBhdXRvZ2VuCisKK1RoZSBtb2R1bGVzIGFyZSBsYXllcmVkIGFzIHNob3duLiBUaGUgYGdlbmVyYXRlZGAgbGF5ZXIgaXMgY29kZSBnZW5lcmF0ZWQgYnkgdGhlCitUaHJpZnQgY29tcGlsZXIncyBSdXN0IHBsdWdpbi4gSXQgdXNlcyB0aGUgY29tcG9uZW50cyBkZWZpbmVkIGluIHRoaXMgY3JhdGUgdG8KK3NlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgdHlwZXMgYW5kIGltcGxlbWVudCBSUEMuIFVzZXJzIGludGVyYWN0IHdpdGggdGhlc2UKK3R5cGVzIGFuZCBzZXJ2aWNlcyBieSB3cml0aW5nIHRoZWlyIG93biBjb2RlIG9uIHRvcC4KKworIGBgYHRleHQKKyArLS0tLS0tLS0tLS0rCisgfCAgYXBwIGRldiAgfAorICstLS0tLS0tLS0tLSsKKyB8IGdlbmVyYXRlZCB8IDwtPiBlcnJvcnMvcmVzdWx0cworICstLS0tLS0tLS0tLSsKKyB8ICBwcm90b2NvbCB8CisgKy0tLS0tLS0tLS0tKworIHwgdHJhbnNwb3J0IHwKKyArLS0tLS0tLS0tLS0rCisgYGBgCisKKyMjIFVzaW5nIHRoaXMgY3JhdGUKKworQWRkIGB0aHJpZnQgPSAieC55LnoiYCB0byB5b3VyIGBDYXJnby50b21sYCwgd2hlcmUgYHgueS56YCBpcyB0aGUgdmVyc2lvbiBvZiB0aGUKK1RocmlmdCBjb21waWxlciB5b3UncmUgdXNpbmcuCisKKyMjIEFQSSBEb2N1bWVudGF0aW9uCisKK0Z1bGwgW1J1c3Rkb2NdKGh0dHBzOi8vZG9jcy5ycy90aHJpZnQvKQorCisjIyBDb21wYXRpYmlsaXR5CisKK1RoZSBSdXN0IGxpYnJhcnkgYW5kIGF1dG8tZ2VuZXJhdGVkIGNvZGUgdGFyZ2V0cyBSdXN0IHZlcnNpb25zIDEuMjgrLgorSXQgZG9lcyBub3QgY3VycmVudGx5IHVzZSBhbnkgUnVzdCAyMDE4IGZlYXR1cmVzLgorCisjIyMgQnJlYWtpbmcgQ2hhbmdlcworCitCcmVha2luZyBjaGFuZ2VzIGFyZSBtaW5pbWl6ZWQuIFdoZW4gdGhleSBhcmUgbWFkZSB0aGV5IHdpbGwgYmUgb3V0bGluZWQgYmVsb3cgd2l0aCB0cmFuc2l0aW9uIGd1aWRlbGluZXMuCisKKyMjIyMjIFRocmlmdCAwLjEyLjAKKworKiAqKltUSFJJRlQtNDUyOV0qKiAtIFJ1c3QgZW51bSB2YXJpYW50cyBhcmUgbm93IGNhbWVsLWNhc2VkIGluc3RlYWQgb2YgdXBwZXJjYXNlZCB0byBjb25mb3JtIHRvIFJ1c3QgbmFtaW5nIGNvbnZlbnRpb25zCisKKyAgICBQcmV2aW91c2x5LCBlbnVtIHZhcmlhbnRzIHdlcmUgdXBwZXJjYXNlZCBpbiB0aGUgYXV0by1nZW5lcmF0ZWQgY29kZS4KKyAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0aHJpZnQgZW51bToKKworICAgIGBgYHRocmlmdAorICAgIC8vIFRIUklGVAorICAgIGVudW0gT3BlcmF0aW9uIHsKKyAgICAgIEFERCwKKyAgICAgIFNVQlRSQUNULAorICAgICAgTVVMVElQTFksCisgICAgICBESVZJREUsCisgICAgfQorICAgIGBgYAorICAgIAorICAgIHVzZWQgdG8gZ2VuZXJhdGU6CisgICAgCisgICAgYGBgcnVzdAorICAgIC8vIE9MRCBBVVRPLUdFTkVSQVRFRCBSVVNUCisgICAgcHViIGVudW0gT3BlcmF0aW9uIHsKKyAgICAgICBBREQsCisgICAgICAgU1VCVFJBQ1QsCisgICAgICAgTVVMVElQTFksCisgICAgICAgRElWSURFLAorICAgICB9CisgICAgYGBgCisgICAgSXQgKm5vdyogZ2VuZXJhdGVzOgorICAgIGBgYHJ1c3QKKyAgICAvLyBORVcgQVVUTy1HRU5FUkFURUQgUlVTVAorICAgIHB1YiBlbnVtIE9wZXJhdGlvbiB7CisgICAgICAgQWRkLAorICAgICAgIFN1YnRyYWN0LAorICAgICAgIE11bHRpcGx5LAorICAgICAgIERpdmlkZSwKKyAgICAgfQorICAgIGBgYAorICAgIAorICAgIFlvdSB3aWxsIGhhdmUgdG8gY2hhbmdlIGFsbCBlbnVtIHZhcmlhbnRzIGluIHlvdXIgY29kZSB0byB1c2UgY2FtZWwtY2FzZWQgbmFtZXMuCisgICAgVGhpcyBzaG91bGQgYmUgYSBzZWFyY2ggYW5kIHJlcGxhY2UuCisKKyMjIENvbnRyaWJ1dGluZworCitCdWcgcmVwb3J0cyBhbmQgUFJzIGFyZSBhbHdheXMgd2VsY29tZSEgUGxlYXNlIHNlZSB0aGUKK1tUaHJpZnQgd2Vic2l0ZV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy8pIGZvciBtb3JlIGRldGFpbHMuCisKK1RocmlmdCBSdXN0IHN1cHBvcnQgcmVxdWlyZXMgY29kZSBpbiBzZXZlcmFsIGRpcmVjdG9yaWVzOgorCisqIGBjb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jY2A6IGJpbmRpbmcgY29kZSBnZW5lcmF0b3IKKyogYGxpYi9yc2A6IHJ1bnRpbWUgbGlicmFyeQorKiBgbGliL3JzL3Rlc3RgOiBzdXBwbGVtZW50YWwgdGVzdHMKKyogYHR1dG9yaWFsL3JzYDogdHV0b3JpYWwgY2xpZW50IGFuZCBzZXJ2ZXIKKyogYHRlc3QvcnNgOiBjcm9zcy1sYW5ndWFnZSB0ZXN0IGNsaWVudCBhbmQgc2VydmVyCisKK0FsbCBsaWJyYXJ5IGNvZGUsIHRlc3QgY29kZSBhbmQgYXV0by1nZW5lcmF0ZWQgY29kZSBjb21waWxlcyBhbmQgcGFzc2VzIGNsaXBweQord2l0aG91dCB3YXJuaW5ncy4gQWxsIG5ldyBjb2RlIG11c3QgZG8gdGhlIHNhbWUhIFdoZW4gbWFraW5nIGNoYW5nZXMgZW5zdXJlIHRoYXQ6CisKKyogYHJ1c3RjYCBkb2VzIGRvZXMgb3V0cHV0IGFueSB3YXJuaW5ncworKiBgY2xpcHB5YCB3aXRoIGRlZmF1bHQgc2V0dGluZ3MgZG9lcyBub3Qgb3V0cHV0IGFueSB3YXJuaW5ncyAoaW5jbHVkZXMgYXV0by1nZW5lcmF0ZWQgY29kZSkKKyogYGNhcmdvIHRlc3RgIGlzIHN1Y2Nlc3NmdWwKKyogYG1ha2UgcHJlY3Jvc3NgIGFuZCBgbWFrZSBjaGVja2AgYXJlIHN1Y2Nlc3NmdWwKKyogYHR1dG9yaWFsL2Jpbi90dXRvcmlhbF9jbGllbnRgIGFuZCBgdHV0b3JpYWwvYmluL3R1dG9yaWFsX3NlcnZlcmAgY29tbXVuaWNhdGUKZGlmZiAtLWdpdCBhL2xpYi9ycy9SRUxFQVNJTkcubWQgYi9saWIvcnMvUkVMRUFTSU5HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3M2Q3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvUkVMRUFTSU5HLm1kCkBAIC0wLDAgKzEsNTcgQEAKKyMgUHVibGlzaGluZyB0aGUgdGhyaWZ0IGNyYXRlCisKK1B1Ymxpc2hpbmcgdGhlIFJ1c3QgdGhyaWZ0IGNyYXRlIGlzIHN0cmFpZ2h0Zm9yd2FyZCwgYW5kIGludm9sdmVzIHR3byBtYWpvciBzdGVwczoKKworMS4gU2V0dGluZyB1cCB5b3VyIFtjcmF0ZXMuaW9dKGh0dHBzOi8vd3d3LmNyYXRlcy5pbykgYWNjb3VudCBfKG9uZS10aW1lKV8KKworMi4gUGFja2FnaW5nL3B1Ymxpc2hpbmcgdGhlIFJ1c3QgdGhyaWZ0IGNyYXRlIGl0c2VsZgorCisjIyBTZXQgdXAgeW91ciBjcmF0ZXMuaW8gYWNjb3VudCAob25lLXRpbWUpCisKKzEuIEdvIHRvIFtjcmF0ZXMuaW9dKGh0dHBzOi8vd3d3LmNyYXRlcy5pbykgYW5kIGNsaWNrIHRoZSBgTG9nIEluYCBidXR0b24gYXQgdGhlIHRvcCByaWdodC4KKworICAgTG9nIGluICoqYXMgdGhlIEdpdGh1YiB1c2VyIHdpdGggd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhlIHRocmlmdCByZXBvISoqCisKKzIuIENsaWNrIHlvdXIgdXNlciBpY29uIGJ1dHRvbiBhdCB0aGUgdG9wIHJpZ2h0IGFuZCBzZWxlY3QgYEFjY291bnQgU2V0dGluZ3NgLgorCiszLiBDbGljayBgTmV3IFRva2VuYCBuZXh0IHRvIGBBUEkgQWNjZXNzYC4KKworICAgVGhpcyBnZW5lcmF0ZXMgYSBuZXcgQVBJIGtleSB0aGF0IGNhcmdvIHVzZXMgdG8gcHVibGlzaCBwYWNrYWdlcyB0byBjcmF0ZXMuaW8uCisgICBTdG9yZSB0aGlzIEFQSSBrZXkgc29tZXdoZXJlIHNhZmUuIElmIHlvdSB3aWxsIG9ubHkgdXNlIHRoaXMgR2l0aHViIGFjY291bnQgdG8KKyAgIHB1Ymxpc2ggY3JhdGVzIHRvIGNyYXRlcy5pbyB5b3UgY2FuIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIHNhdmUgdGhlCisgICBnZW5lcmF0ZWQga2V5IHRvIGB+Ly5jYXJnby9jcmVkZW50aWFsc2AuCisKKyMjIFBhY2thZ2UgYW5kIFB1Ymxpc2gKKworWW91IGNhbiB1c2UgdGhlIGF1dG9tYXRlZCBzY3JpcHQgb3IgcnVuIHRoZSByZWxlYXNlIHN0ZXBzIG1hbnVhbGx5LgorCisqKkltcG9ydGFudCoqOiBgY2FyZ29gIGV4cGVjdHMgdGhhdCB2ZXJzaW9uIG51bWJlcnMgZm9sbG93IHRoZSBzZW1hbnRpYyB2ZXJzaW9uaW5nIGZvcm1hdC4KK1RoaXMgbWVhbnMgdGhhdCBgVEhSSUZUX1JFTEVBU0VfVkVSU0lPTmAgbXVzdCBoYXZlIGEgbWFqb3IsIG1pbm9yIGFuZCBwYXRjaCBudW1iZXIsIGkuZS4sIG11c3QKK2JlIGluIHRoZSBmb3JtIGAjLiMjLiMjYC4KKworIyMjIyBBdXRvbWF0ZWQKKworUnVuIGAuL3JlbGVhc2Uuc2ggW1RIUklGVF9SRUxFQVNFX1ZFUlNJT05dYC4KKworX1JlcXVpcmVzIHlvdSB0byBoYXZlIHN0b3JlZCB5b3VyIGNyZWRlbnRpYWxzIGluIGB+Ly5jYXJnby9jcmVkZW50aWFsc2AuXworCisjIyMjIE1hbnVhbAorCisxLiBFZGl0IGBDYXJnby50b21sYCBhbmQgdXBkYXRlIHRoZSBgdmVyc2lvbiA9IDEuMGAga2V5IHRvIGB2ZXJzaW9uID0gW1RIUklGVF9SRUxFQVNFX1ZFUlNJT05dYAorCisyLiBgZ2l0IGFkZCBDYXJnby50b21sYAorCiszLiBgZ2l0IGNvbW1pdCAtbSAiVXBkYXRlIHRocmlmdCBjcmF0ZSB2ZXJzaW9uIHRvIFtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OXSIgLW0gIkNsaWVudDogcnMiYAorCis0LiBgY2FyZ28gbG9naW5gCisKKyAgICBfKG5vdCByZXF1aXJlZCBpZiB5b3UgaGF2ZSBzdG9yZWQgeW91ciBjcmVkZW50aWFscyBpbiBgfi8uY2FyZ28vY3JlZGVudGlhbHNgKV8KKworNS4gYGNhcmdvIGNsZWFuYAorCis2LiBgY2FyZ28gcGFja2FnZWAKKworICAgVGhpcyBzdGVwIGZhaWxzIGlmIHRoZXJlIGFyZSBhbnkgdW5jb21taXR0ZWQgb3IgaWdub3JlZCBmaWxlcy4gRG8gKipub3QqKiB1c2UgdGhlIGAtLWFsbG93LWRpcnR5YAorICAgZmxhZyEgSW5zdGVhZCwgYWRkIHRoZSBoaWdobGlnaHRlZCBmaWxlcyBhcyBlbnRyaWVzIGluIHRoZSBgQ2FyZ28udG9tbGAgYGV4Y2x1ZGVgIGtleS4KKworNy4gYGNhcmdvIHB1Ymxpc2hgCmRpZmYgLS1naXQgYS9saWIvcnMvcmVsZWFzZS5zaCBiL2xpYi9ycy9yZWxlYXNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM0ZTViNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvcmVsZWFzZS5zaApAQCAtMCwwICsxLDI2IEBACisjIS9iaW4vYmFzaAorCitzZXQgLW8gZXJyZXhpdAorc2V0IC1vIHBpcGVmYWlsCitzZXQgLW8gbm91bnNldAorCitpZiAhIFtbICQjIC1lcSAxICYmICQxID1+IF5bMC05XShcLlswLTldWzAtOV0qKXsyfSQgXV07IHRoZW4KKyAgICAoPiYyIGVjaG8gIlVzYWdlOiAuL3B1Ymxpc2gtY3JhdGUuc2ggW1RIUklGVF9SRUxFQVNFX1ZFUlNJT05dICIpCisgICAgKD4mMiBlY2hvICIgICAgICAgVEhSSUZUX1JFTEVBU0VfVkVSU0lPTiBpcyBpbiBzZW1hbnRpYyB2ZXJzaW9uaW5nIGZvcm1hdCwgaS5lLiAjLiMjLiMjIikKKyAgICBleGl0IDEKK2ZpCisKK1RIUklGVF9SRUxFQVNFX1ZFUlNJT049JHsxOi19CisKK2VjaG8gIlVwZGF0aW5nIENhcmdvLnRvbWwgdG8gJHtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OfSIKK3NlZCAtaS5vbGQgLWUgInMvXnZlcnNpb24gPSAuKiQvdmVyc2lvbiA9IFwiJHtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OfVwiL2ciIENhcmdvLnRvbWwKK3JtIENhcmdvLnRvbWwub2xkCisKK2VjaG8gIkNvbW1pdHRpbmcgdXBkYXRlZCBDYXJnby50b21sIgorZ2l0IGFkZCBDYXJnby50b21sCitnaXQgY29tbWl0IC1tICJVcGRhdGUgdGhyaWZ0IGNyYXRlIHZlcnNpb24gdG8gJHtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OfSIgLW0gIkNsaWVudDogcnMiCisKK2VjaG8gIlBhY2thZ2luZyBhbmQgcmVsZWFzaW5nIHJ1c3QgdGhyaWZ0IGNyYXRlIHdpdGggdmVyc2lvbiAke1RIUklGVF9SRUxFQVNFX1ZFUlNJT059IgorY2FyZ28gY2xlYW4KK2NhcmdvIHBhY2thZ2UKK2NhcmdvIHB1Ymxpc2gKZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvYXV0b2dlbi5ycyBiL2xpYi9ycy9zcmMvYXV0b2dlbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGQ0MDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9hdXRvZ2VuLnJzCkBAIC0wLDAgKzEsNDUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFRocmlmdCBjb21waWxlciBhdXRvLWdlbmVyYXRlZCBzdXBwb3J0LgorLy8hCisvLyEKKy8vISBUeXBlcyBhbmQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyJ3MgUnVzdCBwbHVnaW4KKy8vISB0byBpbXBsZW1lbnQgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eS4gVXNlcnMgc2hvdWxkIG5ldmVyIGhhdmUgdG8gdXNlIGNvZGUKKy8vISBpbiB0aGlzIG1vZHVsZSBkaXJlY3RseS4KKwordXNlIHByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisKKy8vLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gZnVuY3Rpb25hbGl0eSBhbiBhdXRvLWdlbmVyYXRlZCBjbGllbnQgc2hvdWxkIHByb3ZpZGUKKy8vLyB0byBjb21tdW5pY2F0ZSB3aXRoIGEgVGhyaWZ0IHNlcnZlci4KK3B1YiB0cmFpdCBUVGhyaWZ0Q2xpZW50IHsKKyAgICAvLy8gUmV0dXJucyB0aGUgaW5wdXQgcHJvdG9jb2wgdXNlZCB0byByZWFkIHNlcmlhbGl6ZWQgVGhyaWZ0IG1lc3NhZ2VzCisgICAgLy8vIGZyb20gdGhlIFRocmlmdCBzZXJ2ZXIuCisgICAgZm4gaV9wcm90X211dCgmbXV0IHNlbGYpIC0+ICZtdXQgVElucHV0UHJvdG9jb2w7CisgICAgLy8vIFJldHVybnMgdGhlIG91dHB1dCBwcm90b2NvbCB1c2VkIHRvIHdyaXRlIHNlcmlhbGl6ZWQgVGhyaWZ0IG1lc3NhZ2VzCisgICAgLy8vIHRvIHRoZSBUaHJpZnQgc2VydmVyLgorICAgIGZuIG9fcHJvdF9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IFRPdXRwdXRQcm90b2NvbDsKKyAgICAvLy8gUmV0dXJucyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBsYXN0IG1lc3NhZ2Ugd3JpdHRlbiB0byB0aGUgVGhyaWZ0CisgICAgLy8vIHNlcnZlci4gUmV0dXJucyBgMGAgaWYgbm8gbWVzc2FnZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uIFNlcXVlbmNlCisgICAgLy8vIG51bWJlcnMgc2hvdWxkICpuZXZlciogYmUgbmVnYXRpdmUsIGFuZCB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIGBpMzJgCisgICAgLy8vIHNpbXBseSBiZWNhdXNlIHRoZSBUaHJpZnQgcHJvdG9jb2wgZW5jb2RlcyBzZXF1ZW5jZSBudW1iZXJzIGFzIGBpMzJgIG9uCisgICAgLy8vIHRoZSB3aXJlLgorICAgIGZuIHNlcXVlbmNlX251bWJlcigmc2VsZikgLT4gaTMyOyAvLyBGSVhNRTogY29uc2lkZXIgcmV0dXJuaW5nIGEgdTMyCisgICAgLy8vIEluY3JlbWVudHMgdGhlIHNlcXVlbmNlIG51bWJlciwgaW5kaWNhdGluZyB0aGF0IGEgbWVzc2FnZSB3aXRoIHRoYXQKKyAgICAvLy8gbnVtYmVyIGhhcyBiZWVuIHNlbnQgdG8gdGhlIFRocmlmdCBzZXJ2ZXIuCisgICAgZm4gaW5jcmVtZW50X3NlcXVlbmNlX251bWJlcigmbXV0IHNlbGYpIC0+IGkzMjsKK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvZXJyb3JzLnJzIGIvbGliL3JzL3NyYy9lcnJvcnMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhMjU3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvZXJyb3JzLnJzCkBAIC0wLDAgKzEsNjcwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNvbnZlcnQ6OntGcm9tLCBJbnRvfTsKK3VzZSBzdGQ6OmVycm9yOjpFcnJvciBhcyBTdGRFcnJvcjsKK3VzZSBzdGQ6OmZtdDo6e0RlYnVnLCBEaXNwbGF5LCBGb3JtYXR0ZXJ9OwordXNlIHN0ZDo6e2Vycm9yLCBmbXQsIGlvLCBzdHJpbmd9OwordXNlIHRyeV9mcm9tOjpUcnlGcm9tOworCit1c2UgcHJvdG9jb2w6OntURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGV9OworCisvLyBGSVhNRTogc2hvdWxkIGFsbCBteSBlcnJvciBzdHJ1Y3RzIGltcGwgZXJyb3I6OkVycm9yIGFzIHdlbGw/CisvLyBGSVhNRTogc2hvdWxkIGFsbCBmaWVsZHMgaW4gVHJhbnNwb3J0RXJyb3IsIFByb3RvY29sRXJyb3IgYW5kIEFwcGxpY2F0aW9uRXJyb3IgYmUgb3B0aW9uYWw/CisKKy8vLyBFcnJvciB0eXBlIHJldHVybmVkIGJ5IGFsbCBydW50aW1lIGxpYnJhcnkgZnVuY3Rpb25zLgorLy8vCisvLy8gYHRocmlmdDo6RXJyb3JgIGlzIHVzZWQgdGhyb3VnaG91dCB0aGlzIGNyYXRlIGFzIHdlbGwgYXMgaW4gYXV0by1nZW5lcmF0ZWQKKy8vLyBSdXN0IGNvZGUuIEl0IGNvbnNpc3RzIG9mIGZvdXIgdmFyaWFudHMgZGVmaW5lZCBieSBjb252ZW50aW9uIGFjcm9zcyBUaHJpZnQKKy8vLyBpbXBsZW1lbnRhdGlvbnM6CisvLy8KKy8vLyAxLiBgVHJhbnNwb3J0YDogZXJyb3JzIGVuY291bnRlcmVkIHdoaWxlIG9wZXJhdGluZyBvbiBJL08gY2hhbm5lbHMKKy8vLyAyLiBgUHJvdG9jb2xgOiBlcnJvcnMgZW5jb3VudGVyZWQgZHVyaW5nIHJ1bnRpbWUtbGlicmFyeSBwcm9jZXNzaW5nCisvLy8gMy4gYEFwcGxpY2F0aW9uYDogZXJyb3JzIGVuY291bnRlcmVkIHdpdGhpbiBhdXRvLWdlbmVyYXRlZCBjb2RlCisvLy8gNC4gYFVzZXJgOiBJREwtZGVmaW5lZCBleGNlcHRpb24gc3RydWN0cworLy8vCisvLy8gVGhlIGBBcHBsaWNhdGlvbmAgdmFyaWFudCBhbHNvIGZ1bmN0aW9ucyBhcyBhIGNhdGNoLWFsbDogYWxsIGhhbmRsZXIgZXJyb3JzCisvLy8gYXJlIGF1dG9tYXRpY2FsbHkgdHVybmVkIGludG8gYXBwbGljYXRpb24gZXJyb3JzLgorLy8vCisvLy8gQWxsIGVycm9yIHZhcmlhbnRzIGV4Y2VwdCBgRXJyb3I6OlVzZXJgIHRha2UgYW4gZXBvbnltb3VzIHN0cnVjdCB3aXRoIHR3bworLy8vIHJlcXVpcmVkIGZpZWxkczoKKy8vLworLy8vIDEuIGBraW5kYDogdmFyaWFudC1zcGVjaWZpYyBlbnVtIGlkZW50aWZ5aW5nIHRoZSBlcnJvciBzdWItdHlwZQorLy8vIDIuIGBtZXNzYWdlYDogaHVtYW4tcmVhZGFibGUgZXJyb3IgaW5mbyBzdHJpbmcKKy8vLworLy8vIGBraW5kYCBpcyBkZWZpbmVkIGJ5IGNvbnZlbnRpb24gd2hpbGUgYG1lc3NhZ2VgIGlzIGZyZWVmb3JtLiBJZiBub25lIG9mIHRoZQorLy8vIGVudW1lcmF0ZWQga2luZHMgYXJlIHN1aXRhYmxlIHVzZSBgVW5rbm93bmAuCisvLy8KKy8vLyBUbyBzaW1wbGlmeSBlcnJvciBjcmVhdGlvbiBjb252ZW5pZW5jZSBjb25zdHJ1Y3RvcnMgYXJlIGRlZmluZWQgZm9yIGFsbAorLy8vIHZhcmlhbnRzLCBhbmQgY29udmVyc2lvbnMgZnJvbSB0aGVpciBzdHJ1Y3RzIChgdGhyaWZ0OjpUcmFuc3BvcnRFcnJvcmAsCisvLy8gYHRocmlmdDo6UHJvdG9jb2xFcnJvcmAgYW5kIGB0aHJpZnQ6OkFwcGxpY2F0aW9uRXJyb3JgIGludG8gYHRocmlmdDo6RXJyb3JgLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGEgYFRyYW5zcG9ydEVycm9yYC4KKy8vLworLy8vIGBgYAorLy8vIHVzZSB0aHJpZnQ7CisvLy8gdXNlIHRocmlmdDo6e1RyYW5zcG9ydEVycm9yLCBUcmFuc3BvcnRFcnJvcktpbmR9OworLy8vCisvLy8gLy8gZXhwbGljaXQKKy8vLyBsZXQgZXJyMDogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6VHJhbnNwb3J0KAorLy8vICAgICBUcmFuc3BvcnRFcnJvciB7CisvLy8gICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCwKKy8vLyAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjb25uZWN0aW9uIHRvIHNlcnZlciB0aW1lZCBvdXQiKQorLy8vICAgICB9CisvLy8gICApCisvLy8gKTsKKy8vLworLy8vIC8vIHVzZSBjb252ZXJzaW9uCisvLy8gbGV0IGVycjE6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OmZyb20oCisvLy8gICAgIFRyYW5zcG9ydEVycm9yIHsKKy8vLyAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorLy8vICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNvbm5lY3Rpb24gdG8gc2VydmVyIHRpbWVkIG91dCIpCisvLy8gICAgIH0KKy8vLyAgICkKKy8vLyApOworLy8vCisvLy8gLy8gdXNlIHN0cnVjdCBjb25zdHJ1Y3RvcgorLy8vIGxldCBlcnIyOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpUcmFuc3BvcnQoCisvLy8gICAgIFRyYW5zcG9ydEVycm9yOjpuZXcoCisvLy8gICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCwKKy8vLyAgICAgICAiY29ubmVjdGlvbiB0byBzZXJ2ZXIgdGltZWQgb3V0IgorLy8vICAgICApCisvLy8gICApCisvLy8gKTsKKy8vLworLy8vCisvLy8gLy8gdXNlIGVycm9yIHZhcmlhbnQgY29uc3RydWN0b3IKKy8vLyBsZXQgZXJyMzogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpuZXdfdHJhbnNwb3J0X2Vycm9yKAorLy8vICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorLy8vICAgICAiY29ubmVjdGlvbiB0byBzZXJ2ZXIgdGltZWQgb3V0IgorLy8vICAgKQorLy8vICk7CisvLy8gYGBgCisvLy8KKy8vLyBDcmVhdGUgYW4gZXJyb3IgZnJvbSBhIHN0cmluZy4KKy8vLworLy8vIGBgYAorLy8vIHVzZSB0aHJpZnQ7CisvLy8gdXNlIHRocmlmdDo6e0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kfTsKKy8vLworLy8vIC8vIHdlIGp1c3QgdXNlIGBGcm9tOjpmcm9tYCB0byBjb252ZXJ0IGEgYFN0cmluZ2AgaW50byBhIGB0aHJpZnQ6OkVycm9yYAorLy8vIGxldCBlcnIwOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpmcm9tKCJUaGlzIGlzIGFuIGVycm9yIikKKy8vLyApOworLy8vCisvLy8gLy8gZXJyMCBpcyBlcXVpdmFsZW50IHRvLi4uCisvLy8gbGV0IGVycjE6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKAorLy8vICAgICBBcHBsaWNhdGlvbkVycm9yIHsKKy8vLyAgICAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKy8vLyAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJUaGlzIGlzIGFuIGVycm9yIikKKy8vLyAgICAgfQorLy8vICAgKQorLy8vICk7CisvLy8gYGBgCisvLy8KKy8vLyBSZXR1cm4gYW4gSURMLWRlZmluZWQgZXhjZXB0aW9uLgorLy8vCisvLy8gYGBgdGV4dAorLy8vIC8vIFRocmlmdCBJREwgZXhjZXB0aW9uIGRlZmluaXRpb24uCisvLy8gZXhjZXB0aW9uIFhjZXB0aW9uIHsKKy8vLyAgIDE6IGkzMiBlcnJvckNvZGUsCisvLy8gICAyOiBzdHJpbmcgbWVzc2FnZQorLy8vIH0KKy8vLyBgYGAKKy8vLworLy8vIGBgYAorLy8vIHVzZSBzdGQ6OmNvbnZlcnQ6OkZyb207CisvLy8gdXNlIHN0ZDo6ZXJyb3I6OkVycm9yOworLy8vIHVzZSBzdGQ6OmZtdDsKKy8vLyB1c2Ugc3RkOjpmbXQ6OntEaXNwbGF5LCBGb3JtYXR0ZXJ9OworLy8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcgorLy8vICNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KKy8vLyBwdWIgc3RydWN0IFhjZXB0aW9uIHsKKy8vLyAgIHB1YiBlcnJvcl9jb2RlOiBPcHRpb248aTMyPiwKKy8vLyAgIHB1YiBtZXNzYWdlOiBPcHRpb248U3RyaW5nPiwKKy8vLyB9CisvLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCisvLy8gaW1wbCBFcnJvciBmb3IgWGNlcHRpb24geworLy8vICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworLy8vICAgICAicmVtb3RlIHNlcnZpY2UgdGhyZXcgWGNlcHRpb24iCisvLy8gICB9CisvLy8gfQorLy8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcgorLy8vIGltcGwgRnJvbTxYY2VwdGlvbj4gZm9yIHRocmlmdDo6RXJyb3IgeworLy8vICAgZm4gZnJvbShlOiBYY2VwdGlvbikgLT4gU2VsZiB7CisvLy8gICAgIHRocmlmdDo6RXJyb3I6OlVzZXIoQm94OjpuZXcoZSkpCisvLy8gICB9CisvLy8gfQorLy8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcgorLy8vIGltcGwgRGlzcGxheSBmb3IgWGNlcHRpb24geworLy8vICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworLy8vICAgICBzZWxmLmRlc2NyaXB0aW9uKCkuZm10KGYpCisvLy8gICB9CisvLy8gfQorLy8vCisvLy8gLy8gaW4gdXNlciBjb2RlLi4uCisvLy8gbGV0IGVycjogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6ZnJvbShYY2VwdGlvbiB7IGVycm9yX2NvZGU6IFNvbWUoMSksIG1lc3NhZ2U6IE5vbmUgfSkKKy8vLyApOworLy8vIGBgYAorcHViIGVudW0gRXJyb3IgeworICAgIC8vLyBFcnJvcnMgZW5jb3VudGVyZWQgd2hpbGUgb3BlcmF0aW5nIG9uIEkvTyBjaGFubmVscy4KKyAgICAvLy8KKyAgICAvLy8gVGhlc2UgaW5jbHVkZSAqY29ubmVjdGlvbiBjbG9zZWQqIGFuZCAqYmluZCBmYWlsdXJlKi4KKyAgICBUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IpLAorICAgIC8vLyBFcnJvcnMgZW5jb3VudGVyZWQgZHVyaW5nIHJ1bnRpbWUtbGlicmFyeSBwcm9jZXNzaW5nLgorICAgIC8vLworICAgIC8vLyBUaGVzZSBpbmNsdWRlICptZXNzYWdlIHRvbyBsYXJnZSogYW5kICp1bnN1cHBvcnRlZCBwcm90b2NvbCB2ZXJzaW9uKi4KKyAgICBQcm90b2NvbChQcm90b2NvbEVycm9yKSwKKyAgICAvLy8gRXJyb3JzIGVuY291bnRlcmVkIHdpdGhpbiBhdXRvLWdlbmVyYXRlZCBjb2RlLCBvciB3aGVuIGluY29taW5nCisgICAgLy8vIG9yIG91dGdvaW5nIG1lc3NhZ2VzIHZpb2xhdGUgdGhlIFRocmlmdCBzcGVjLgorICAgIC8vLworICAgIC8vLyBUaGVzZSBpbmNsdWRlICpvdXQtb2Ytb3JkZXIgbWVzc2FnZXMqIGFuZCAqbWlzc2luZyByZXF1aXJlZCBzdHJ1Y3QKKyAgICAvLy8gZmllbGRzKi4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyB2YXJpYW50IGFsc28gZnVuY3Rpb25zIGFzIGEgY2F0Y2gtYWxsOiBlcnJvcnMgZnJvbSBoYW5kbGVyCisgICAgLy8vIGZ1bmN0aW9ucyBhcmUgYXV0b21hdGljYWxseSByZXR1cm5lZCBhcyBhbiBgQXBwbGljYXRpb25FcnJvcmAuCisgICAgQXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvciksCisgICAgLy8vIElETC1kZWZpbmVkIGV4Y2VwdGlvbiBzdHJ1Y3RzLgorICAgIFVzZXIoQm94PGVycm9yOjpFcnJvciArIFN5bmMgKyBTZW5kPiksCit9CisKK2ltcGwgRXJyb3IgeworICAgIC8vLyBDcmVhdGUgYW4gYEFwcGxpY2F0aW9uRXJyb3JgIGZyb20gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uCisgICAgLy8vCisgICAgLy8vIEFwcGxpY2F0aW9uIGNvZGUgKipzaG91bGQgbmV2ZXIqKiBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgorICAgIHB1YiBmbiByZWFkX2FwcGxpY2F0aW9uX2Vycm9yX2Zyb21faW5fcHJvdG9jb2woCisgICAgICAgIGk6ICZtdXQgVElucHV0UHJvdG9jb2wsCisgICAgKSAtPiA6OlJlc3VsdDxBcHBsaWNhdGlvbkVycm9yPiB7CisgICAgICAgIGxldCBtdXQgbWVzc2FnZSA9ICJnZW5lcmFsIHJlbW90ZSBlcnJvciIudG9fb3duZWQoKTsKKyAgICAgICAgbGV0IG11dCBraW5kID0gQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd247CisKKyAgICAgICAgaS5yZWFkX3N0cnVjdF9iZWdpbigpPzsKKworICAgICAgICBsb29wIHsKKyAgICAgICAgICAgIGxldCBmaWVsZF9pZGVudCA9IGkucmVhZF9maWVsZF9iZWdpbigpPzsKKworICAgICAgICAgICAgaWYgZmllbGRfaWRlbnQuZmllbGRfdHlwZSA9PSBUVHlwZTo6U3RvcCB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxldCBpZCA9IGZpZWxkX2lkZW50CisgICAgICAgICAgICAgICAgLmlkCisgICAgICAgICAgICAgICAgLmV4cGVjdCgic2VuZGVyIHNob3VsZCBhbHdheXMgc3BlY2lmeSBpZCBmb3Igbm9uLVNUT1AgZmllbGQiKTsKKworICAgICAgICAgICAgbWF0Y2ggaWQgeworICAgICAgICAgICAgICAgIDEgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgcmVtb3RlX21lc3NhZ2UgPSBpLnJlYWRfc3RyaW5nKCk/OworICAgICAgICAgICAgICAgICAgICBpLnJlYWRfZmllbGRfZW5kKCk/OworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gcmVtb3RlX21lc3NhZ2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIDIgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgcmVtb3RlX3R5cGVfYXNfaW50ID0gaS5yZWFkX2kzMigpPzsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW90ZV9raW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZCA9IFRyeUZyb206OnRyeV9mcm9tKHJlbW90ZV90eXBlX2FzX2ludCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC51bndyYXBfb3IoQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24pOworICAgICAgICAgICAgICAgICAgICBpLnJlYWRfZmllbGRfZW5kKCk/OworICAgICAgICAgICAgICAgICAgICBraW5kID0gcmVtb3RlX2tpbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF8gPT4geworICAgICAgICAgICAgICAgICAgICBpLnNraXAoZmllbGRfaWRlbnQuZmllbGRfdHlwZSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGkucmVhZF9zdHJ1Y3RfZW5kKCk/OworCisgICAgICAgIE9rKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDoga2luZCwKKyAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsCisgICAgICAgIH0pCisgICAgfQorCisgICAgLy8vIENvbnZlcnQgYW4gYEFwcGxpY2F0aW9uRXJyb3JgIGludG8gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24gYW5kIHdyaXRlCisgICAgLy8vIGl0IHRvIHRoZSByZW1vdGUuCisgICAgLy8vCisgICAgLy8vIEFwcGxpY2F0aW9uIGNvZGUgKipzaG91bGQgbmV2ZXIqKiBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgorICAgIHB1YiBmbiB3cml0ZV9hcHBsaWNhdGlvbl9lcnJvcl90b19vdXRfcHJvdG9jb2woCisgICAgICAgIGU6ICZBcHBsaWNhdGlvbkVycm9yLAorICAgICAgICBvOiAmbXV0IFRPdXRwdXRQcm90b2NvbCwKKyAgICApIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIG8ud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllciB7CisgICAgICAgICAgICBuYW1lOiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIi50b19vd25lZCgpLAorICAgICAgICB9KT87CisKKyAgICAgICAgbGV0IG1lc3NhZ2VfZmllbGQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoIm1lc3NhZ2UiLCBUVHlwZTo6U3RyaW5nLCAxKTsKKyAgICAgICAgbGV0IHR5cGVfZmllbGQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoInR5cGUiLCBUVHlwZTo6STMyLCAyKTsKKworICAgICAgICBvLndyaXRlX2ZpZWxkX2JlZ2luKCZtZXNzYWdlX2ZpZWxkKT87CisgICAgICAgIG8ud3JpdGVfc3RyaW5nKCZlLm1lc3NhZ2UpPzsKKyAgICAgICAgby53cml0ZV9maWVsZF9lbmQoKT87CisKKyAgICAgICAgby53cml0ZV9maWVsZF9iZWdpbigmdHlwZV9maWVsZCk/OworICAgICAgICBvLndyaXRlX2kzMihlLmtpbmQgYXMgaTMyKT87CisgICAgICAgIG8ud3JpdGVfZmllbGRfZW5kKCk/OworCisgICAgICAgIG8ud3JpdGVfZmllbGRfc3RvcCgpPzsKKyAgICAgICAgby53cml0ZV9zdHJ1Y3RfZW5kKCk/OworCisgICAgICAgIG8uZmx1c2goKQorICAgIH0KK30KKworaW1wbCBlcnJvcjo6RXJyb3IgZm9yIEVycm9yIHsKKyAgICBmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIEVycm9yOjpUcmFuc3BvcnQocmVmIGUpID0+IFRyYW5zcG9ydEVycm9yOjpkZXNjcmlwdGlvbihlKSwKKyAgICAgICAgICAgIEVycm9yOjpQcm90b2NvbChyZWYgZSkgPT4gUHJvdG9jb2xFcnJvcjo6ZGVzY3JpcHRpb24oZSksCisgICAgICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24ocmVmIGUpID0+IEFwcGxpY2F0aW9uRXJyb3I6OmRlc2NyaXB0aW9uKGUpLAorICAgICAgICAgICAgRXJyb3I6OlVzZXIocmVmIGUpID0+IGUuZGVzY3JpcHRpb24oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEZWJ1ZyBmb3IgRXJyb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChyZWYgZSkgPT4gRGVidWc6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpQcm90b2NvbChyZWYgZSkgPT4gRGVidWc6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihyZWYgZSkgPT4gRGVidWc6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpVc2VyKHJlZiBlKSA9PiBEZWJ1Zzo6Zm10KGUsIGYpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIERpc3BsYXkgZm9yIEVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIEVycm9yOjpUcmFuc3BvcnQocmVmIGUpID0+IERpc3BsYXk6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpQcm90b2NvbChyZWYgZSkgPT4gRGlzcGxheTo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKHJlZiBlKSA9PiBEaXNwbGF5OjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6VXNlcihyZWYgZSkgPT4gRGlzcGxheTo6Zm10KGUsIGYpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIEZyb208U3RyaW5nPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oczogU3RyaW5nKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiBzLAorICAgICAgICB9KQorICAgIH0KK30KKworaW1wbDwnYT4gRnJvbTwmJ2Egc3RyPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oczogJidhIHN0cikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogU3RyaW5nOjpmcm9tKHMpLAorICAgICAgICB9KQorICAgIH0KK30KKworaW1wbCBGcm9tPFRyYW5zcG9ydEVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZTogVHJhbnNwb3J0RXJyb3IpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6VHJhbnNwb3J0KGUpCisgICAgfQorfQorCitpbXBsIEZyb208UHJvdG9jb2xFcnJvcj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKGU6IFByb3RvY29sRXJyb3IpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6UHJvdG9jb2woZSkKKyAgICB9Cit9CisKK2ltcGwgRnJvbTxBcHBsaWNhdGlvbkVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZTogQXBwbGljYXRpb25FcnJvcikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihlKQorICAgIH0KK30KKworLy8vIENyZWF0ZSBhIG5ldyBgRXJyb3JgIGluc3RhbmNlIG9mIHR5cGUgYFRyYW5zcG9ydGAgdGhhdCB3cmFwcyBhCisvLy8gYFRyYW5zcG9ydEVycm9yYC4KK3B1YiBmbiBuZXdfdHJhbnNwb3J0X2Vycm9yPFM6IEludG88U3RyaW5nPj4oa2luZDogVHJhbnNwb3J0RXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBFcnJvciB7CisgICAgRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvcjo6bmV3KGtpbmQsIG1lc3NhZ2UpKQorfQorCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgSS9PIGVycm9ycy4KKyNbZGVyaXZlKERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVHJhbnNwb3J0RXJyb3IgeworICAgIC8vLyBJL08gZXJyb3IgdmFyaWFudC4KKyAgICAvLy8KKyAgICAvLy8gSWYgYSBzcGVjaWZpYyBgVHJhbnNwb3J0RXJyb3JLaW5kYCBkb2VzIG5vdCBhcHBseSB1c2UKKyAgICAvLy8gYFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93bmAuCisgICAgcHViIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZCwKKyAgICAvLy8gSHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4KKyAgICBwdWIgbWVzc2FnZTogU3RyaW5nLAorfQorCitpbXBsIFRyYW5zcG9ydEVycm9yIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGBUcmFuc3BvcnRFcnJvcmAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gVHJhbnNwb3J0RXJyb3IgeworICAgICAgICBUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICBraW5kOiBraW5kLAorICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZS5pbnRvKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBJL08gZXJyb3IgY2F0ZWdvcmllcy4KKy8vLworLy8vIFRoaXMgbGlzdCBtYXkgZ3JvdywgYW5kIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBtYXRjaCBhZ2FpbnN0IGl0LgorI1tkZXJpdmUoQ2xvbmUsIENvcHksIEVxLCBEZWJ1ZywgUGFydGlhbEVxKV0KK3B1YiBlbnVtIFRyYW5zcG9ydEVycm9yS2luZCB7CisgICAgLy8vIENhdGNoLWFsbCBJL08gZXJyb3IuCisgICAgVW5rbm93biA9IDAsCisgICAgLy8vIEFuIEkvTyBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCB3aGVuIHRoZSB0cmFuc3BvcnQgY2hhbm5lbCB3YXMgbm90IG9wZW4uCisgICAgTm90T3BlbiA9IDEsCisgICAgLy8vIFRoZSB0cmFuc3BvcnQgY2hhbm5lbCBjYW5ub3QgYmUgb3BlbmVkIGJlY2F1c2UgaXQgd2FzIG9wZW5lZCBwcmV2aW91c2x5LgorICAgIEFscmVhZHlPcGVuID0gMiwKKyAgICAvLy8gQW4gSS9PIG9wZXJhdGlvbiB0aW1lZCBvdXQuCisgICAgVGltZWRPdXQgPSAzLAorICAgIC8vLyBBIHJlYWQgY291bGQgbm90IGNvbXBsZXRlIGJlY2F1c2Ugbm8gYnl0ZXMgd2VyZSBhdmFpbGFibGUuCisgICAgRW5kT2ZGaWxlID0gNCwKKyAgICAvLy8gQW4gaW52YWxpZCAoYnVmZmVyL21lc3NhZ2UpIHNpemUgd2FzIHJlcXVlc3RlZCBvciByZWNlaXZlZC4KKyAgICBOZWdhdGl2ZVNpemUgPSA1LAorICAgIC8vLyBUb28gbGFyZ2UgYSBidWZmZXIgb3IgbWVzc2FnZSBzaXplIHdhcyByZXF1ZXN0ZWQgb3IgcmVjZWl2ZWQuCisgICAgU2l6ZUxpbWl0ID0gNiwKK30KKworaW1wbCBUcmFuc3BvcnRFcnJvciB7CisgICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworICAgICAgICBtYXRjaCBzZWxmLmtpbmQgeworICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duID0+ICJ0cmFuc3BvcnQgZXJyb3IiLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpOb3RPcGVuID0+ICJub3Qgb3BlbiIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OkFscmVhZHlPcGVuID0+ICJhbHJlYWR5IG9wZW4iLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCA9PiAidGltZWQgb3V0IiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6RW5kT2ZGaWxlID0+ICJlbmQgb2YgZmlsZSIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6Ok5lZ2F0aXZlU2l6ZSA9PiAibmVnYXRpdmUgc2l6ZSBtZXNzYWdlIiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6U2l6ZUxpbWl0ID0+ICJtZXNzYWdlIHRvbyBsb25nIiwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEaXNwbGF5IGZvciBUcmFuc3BvcnRFcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZSEoZiwgInt9Iiwgc2VsZi5kZXNjcmlwdGlvbigpKQorICAgIH0KK30KKworaW1wbCBUcnlGcm9tPGkzMj4gZm9yIFRyYW5zcG9ydEVycm9yS2luZCB7CisgICAgdHlwZSBFcnIgPSBFcnJvcjsKKyAgICBmbiB0cnlfZnJvbShmcm9tOiBpMzIpIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnI+IHsKKyAgICAgICAgbWF0Y2ggZnJvbSB7CisgICAgICAgICAgICAwID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93biksCisgICAgICAgICAgICAxID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6Tm90T3BlbiksCisgICAgICAgICAgICAyID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6QWxyZWFkeU9wZW4pLAorICAgICAgICAgICAgMyA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0KSwKKyAgICAgICAgICAgIDQgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpFbmRPZkZpbGUpLAorICAgICAgICAgICAgNSA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6Ok5lZ2F0aXZlU2l6ZSksCisgICAgICAgICAgICA2ID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6U2l6ZUxpbWl0KSwKKyAgICAgICAgICAgIF8gPT4gRXJyKEVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSB0byBUcmFuc3BvcnRFcnJvcktpbmQiLCBmcm9tKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBGcm9tPGlvOjpFcnJvcj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKGVycjogaW86OkVycm9yKSAtPiBTZWxmIHsKKyAgICAgICAgbWF0Y2ggZXJyLmtpbmQoKSB7CisgICAgICAgICAgICBpbzo6RXJyb3JLaW5kOjpDb25uZWN0aW9uUmVzZXQKKyAgICAgICAgICAgIHwgaW86OkVycm9yS2luZDo6Q29ubmVjdGlvblJlZnVzZWQKKyAgICAgICAgICAgIHwgaW86OkVycm9yS2luZDo6Tm90Q29ubmVjdGVkID0+IEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6Tm90T3BlbiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLAorICAgICAgICAgICAgfSksCisgICAgICAgICAgICBpbzo6RXJyb3JLaW5kOjpBbHJlYWR5RXhpc3RzID0+IEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6QWxyZWFkeU9wZW4sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgaW86OkVycm9yS2luZDo6VGltZWRPdXQgPT4gRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLAorICAgICAgICAgICAgfSksCisgICAgICAgICAgICBpbzo6RXJyb3JLaW5kOjpVbmV4cGVjdGVkRW9mID0+IEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6RW5kT2ZGaWxlLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksCisgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIF8gPT4geworICAgICAgICAgICAgICAgIEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksIC8vIEZJWE1FOiB1c2UgaW8gZXJyb3IncyBkZWJ1ZyBzdHJpbmcKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIEZyb208c3RyaW5nOjpGcm9tVXRmOEVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZXJyOiBzdHJpbmc6OkZyb21VdGY4RXJyb3IpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLCAvLyBGSVhNRTogdXNlIGZtdDo6RXJyb3IncyBkZWJ1ZyBzdHJpbmcKKyAgICAgICAgfSkKKyAgICB9Cit9CisKKy8vLyBDcmVhdGUgYSBuZXcgYEVycm9yYCBpbnN0YW5jZSBvZiB0eXBlIGBQcm90b2NvbGAgdGhhdCB3cmFwcyBhCisvLy8gYFByb3RvY29sRXJyb3JgLgorcHViIGZuIG5ld19wcm90b2NvbF9lcnJvcjxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBFcnJvciB7CisgICAgRXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3I6Om5ldyhraW5kLCBtZXNzYWdlKSkKK30KKworLy8vIEluZm9ybWF0aW9uIGFib3V0IGVycm9ycyB0aGF0IG9jY3VyIGluIHRoZSBydW50aW1lIGxpYnJhcnkuCisjW2Rlcml2ZShEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFByb3RvY29sRXJyb3IgeworICAgIC8vLyBQcm90b2NvbCBlcnJvciB2YXJpYW50LgorICAgIC8vLworICAgIC8vLyBJZiBhIHNwZWNpZmljIGBQcm90b2NvbEVycm9yS2luZGAgZG9lcyBub3QgYXBwbHkgdXNlCisgICAgLy8vIGBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93bmAuCisgICAgcHViIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kLAorICAgIC8vLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICAgIHB1YiBtZXNzYWdlOiBTdHJpbmcsCit9CisKK2ltcGwgUHJvdG9jb2xFcnJvciB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBgUHJvdG9jb2xFcnJvcmAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBQcm90b2NvbEVycm9yIHsKKyAgICAgICAgUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiBraW5kLAorICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZS5pbnRvKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBSdW50aW1lIGxpYnJhcnkgZXJyb3IgY2F0ZWdvcmllcy4KKy8vLworLy8vIFRoaXMgbGlzdCBtYXkgZ3JvdywgYW5kIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBtYXRjaCBhZ2FpbnN0IGl0LgorI1tkZXJpdmUoQ2xvbmUsIENvcHksIEVxLCBEZWJ1ZywgUGFydGlhbEVxKV0KK3B1YiBlbnVtIFByb3RvY29sRXJyb3JLaW5kIHsKKyAgICAvLy8gQ2F0Y2gtYWxsIHJ1bnRpbWUtbGlicmFyeSBlcnJvci4KKyAgICBVbmtub3duID0gMCwKKyAgICAvLy8gQW4gaW52YWxpZCBhcmd1bWVudCB3YXMgc3VwcGxpZWQgdG8gYSBsaWJyYXJ5IGZ1bmN0aW9uLCBvciBpbnZhbGlkIGRhdGEKKyAgICAvLy8gd2FzIHJlY2VpdmVkIGZyb20gYSBUaHJpZnQgZW5kcG9pbnQuCisgICAgSW52YWxpZERhdGEgPSAxLAorICAgIC8vLyBBbiBpbnZhbGlkIHNpemUgd2FzIHJlY2VpdmVkIGluIGFuIGVuY29kZWQgZmllbGQuCisgICAgTmVnYXRpdmVTaXplID0gMiwKKyAgICAvLy8gVGhyaWZ0IG1lc3NhZ2Ugb3IgZmllbGQgd2FzIHRvbyBsb25nLgorICAgIFNpemVMaW1pdCA9IDMsCisgICAgLy8vIFVuc3VwcG9ydGVkIG9yIHVua25vd24gVGhyaWZ0IHByb3RvY29sIHZlcnNpb24uCisgICAgQmFkVmVyc2lvbiA9IDQsCisgICAgLy8vIFVuc3VwcG9ydGVkIFRocmlmdCBwcm90b2NvbCwgc2VydmVyIG9yIGZpZWxkIHR5cGUuCisgICAgTm90SW1wbGVtZW50ZWQgPSA1LAorICAgIC8vLyBSZWFjaGVkIHRoZSBtYXhpbXVtIG5lc3RlZCBkZXB0aCB0byB3aGljaCBhbiBlbmNvZGVkIFRocmlmdCBmaWVsZCBjb3VsZAorICAgIC8vLyBiZSBza2lwcGVkLgorICAgIERlcHRoTGltaXQgPSA2LAorfQorCitpbXBsIFByb3RvY29sRXJyb3IgeworICAgIGZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggc2VsZi5raW5kIHsKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duID0+ICJwcm90b2NvbCBlcnJvciIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEgPT4gImJhZCBkYXRhIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpOZWdhdGl2ZVNpemUgPT4gIm5lZ2F0aXZlIG1lc3NhZ2Ugc2l6ZSIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6U2l6ZUxpbWl0ID0+ICJtZXNzYWdlIHRvbyBsb25nIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uID0+ICJpbnZhbGlkIHRocmlmdCB2ZXJzaW9uIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpOb3RJbXBsZW1lbnRlZCA9PiAibm90IGltcGxlbWVudGVkIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpEZXB0aExpbWl0ID0+ICJtYXhpbXVtIHNraXAgZGVwdGggcmVhY2hlZCIsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRGlzcGxheSBmb3IgUHJvdG9jb2xFcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZSEoZiwgInt9Iiwgc2VsZi5kZXNjcmlwdGlvbigpKQorICAgIH0KK30KKworaW1wbCBUcnlGcm9tPGkzMj4gZm9yIFByb3RvY29sRXJyb3JLaW5kIHsKKyAgICB0eXBlIEVyciA9IEVycm9yOworICAgIGZuIHRyeV9mcm9tKGZyb206IGkzMikgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycj4geworICAgICAgICBtYXRjaCBmcm9tIHsKKyAgICAgICAgICAgIDAgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24pLAorICAgICAgICAgICAgMSA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEpLAorICAgICAgICAgICAgMiA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6TmVnYXRpdmVTaXplKSwKKyAgICAgICAgICAgIDMgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OlNpemVMaW1pdCksCisgICAgICAgICAgICA0ID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uKSwKKyAgICAgICAgICAgIDUgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6Ok5vdEltcGxlbWVudGVkKSwKKyAgICAgICAgICAgIDYgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OkRlcHRoTGltaXQpLAorICAgICAgICAgICAgXyA9PiBFcnIoRXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIFByb3RvY29sRXJyb3JLaW5kIiwgZnJvbSksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBDcmVhdGUgYSBuZXcgYEVycm9yYCBpbnN0YW5jZSBvZiB0eXBlIGBBcHBsaWNhdGlvbmAgdGhhdCB3cmFwcyBhbgorLy8vIGBBcHBsaWNhdGlvbkVycm9yYC4KK3B1YiBmbiBuZXdfYXBwbGljYXRpb25fZXJyb3I8UzogSW50bzxTdHJpbmc+PihraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gRXJyb3IgeworICAgIEVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yOjpuZXcoa2luZCwgbWVzc2FnZSkpCit9CisKKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBlcnJvcnMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBvciBpbiB1c2VyLWltcGxlbWVudGVkCisvLy8gc2VydmljZSBoYW5kbGVycy4KKyNbZGVyaXZlKERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgQXBwbGljYXRpb25FcnJvciB7CisgICAgLy8vIEFwcGxpY2F0aW9uIGVycm9yIHZhcmlhbnQuCisgICAgLy8vCisgICAgLy8vIElmIGEgc3BlY2lmaWMgYEFwcGxpY2F0aW9uRXJyb3JLaW5kYCBkb2VzIG5vdCBhcHBseSB1c2UKKyAgICAvLy8gYEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duYC4KKyAgICBwdWIga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQsCisgICAgLy8vIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCisgICAgcHViIG1lc3NhZ2U6IFN0cmluZywKK30KKworaW1wbCBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGBBcHBsaWNhdGlvbkVycm9yYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4oa2luZDogQXBwbGljYXRpb25FcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IGtpbmQsCisgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIEF1dG8tZ2VuZXJhdGVkIG9yIHVzZXItaW1wbGVtZW50ZWQgY29kZSBlcnJvciBjYXRlZ29yaWVzLgorLy8vCisvLy8gVGhpcyBsaXN0IG1heSBncm93LCBhbmQgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIG1hdGNoIGFnYWluc3QgaXQuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gQXBwbGljYXRpb25FcnJvcktpbmQgeworICAgIC8vLyBDYXRjaC1hbGwgYXBwbGljYXRpb24gZXJyb3IuCisgICAgVW5rbm93biA9IDAsCisgICAgLy8vIE1hZGUgc2VydmljZSBjYWxsIHRvIGFuIHVua25vd24gc2VydmljZSBtZXRob2QuCisgICAgVW5rbm93bk1ldGhvZCA9IDEsCisgICAgLy8vIFJlY2VpdmVkIGFuIHVua25vd24gVGhyaWZ0IG1lc3NhZ2UgdHlwZS4gVGhhdCBpcywgbm90IG9uZSBvZiB0aGUKKyAgICAvLy8gYHRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZWAgdmFyaWFudHMuCisgICAgSW52YWxpZE1lc3NhZ2VUeXBlID0gMiwKKyAgICAvLy8gTWV0aG9kIG5hbWUgaW4gYSBzZXJ2aWNlIHJlcGx5IGRvZXMgbm90IG1hdGNoIHRoZSBuYW1lIG9mIHRoZQorICAgIC8vLyByZWNlaXZpbmcgc2VydmljZSBtZXRob2QuCisgICAgV3JvbmdNZXRob2ROYW1lID0gMywKKyAgICAvLy8gUmVjZWl2ZWQgYW4gb3V0LW9mLW9yZGVyIFRocmlmdCBtZXNzYWdlLgorICAgIEJhZFNlcXVlbmNlSWQgPSA0LAorICAgIC8vLyBTZXJ2aWNlIHJlcGx5IGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgorICAgIE1pc3NpbmdSZXN1bHQgPSA1LAorICAgIC8vLyBBdXRvLWdlbmVyYXRlZCBjb2RlIGZhaWxlZCB1bmV4cGVjdGVkbHkuCisgICAgSW50ZXJuYWxFcnJvciA9IDYsCisgICAgLy8vIFRocmlmdCBwcm90b2NvbCBlcnJvci4gV2hlbiBwb3NzaWJsZSB1c2UgYEVycm9yOjpQcm90b2NvbEVycm9yYCB3aXRoIGEKKyAgICAvLy8gc3BlY2lmaWMgYFByb3RvY29sRXJyb3JLaW5kYCBpbnN0ZWFkLgorICAgIFByb3RvY29sRXJyb3IgPSA3LAorICAgIC8vLyAqVW5rbm93biouIEluY2x1ZGVkIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBUaHJpZnQgaW1wbGVtZW50YXRpb25zLgorICAgIEludmFsaWRUcmFuc2Zvcm0gPSA4LCAvLyA/PworICAgIC8vLyBUaHJpZnQgZW5kcG9pbnQgcmVxdWVzdGVkLCBvciBpcyB1c2luZywgYW4gdW5zdXBwb3J0ZWQgZW5jb2RpbmcuCisgICAgSW52YWxpZFByb3RvY29sID0gOSwgLy8gPz8KKyAgICAvLy8gVGhyaWZ0IGVuZHBvaW50IHJlcXVlc3RlZCwgb3IgaXMgdXNpbmcsIGFuIHVuc3VwcG9ydGVkIGF1dG8tZ2VuZXJhdGVkIGNsaWVudCB0eXBlLgorICAgIFVuc3VwcG9ydGVkQ2xpZW50VHlwZSA9IDEwLCAvLyA/PworfQorCitpbXBsIEFwcGxpY2F0aW9uRXJyb3IgeworICAgIGZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggc2VsZi5raW5kIHsKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duID0+ICJzZXJ2aWNlIGVycm9yIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duTWV0aG9kID0+ICJ1bmtub3duIHNlcnZpY2UgbWV0aG9kIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkTWVzc2FnZVR5cGUgPT4gIndyb25nIG1lc3NhZ2UgdHlwZSByZWNlaXZlZCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6V3JvbmdNZXRob2ROYW1lID0+ICJ1bmtub3duIG1ldGhvZCByZXBseSByZWNlaXZlZCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6QmFkU2VxdWVuY2VJZCA9PiAib3V0IG9mIG9yZGVyIHNlcXVlbmNlIGlkIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpNaXNzaW5nUmVzdWx0ID0+ICJtaXNzaW5nIG1ldGhvZCByZXN1bHQiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkludGVybmFsRXJyb3IgPT4gInJlbW90ZSBzZXJ2aWNlIHRocmV3IGV4Y2VwdGlvbiIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6UHJvdG9jb2xFcnJvciA9PiAicHJvdG9jb2wgZXJyb3IiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRUcmFuc2Zvcm0gPT4gImludmFsaWQgdHJhbnNmb3JtIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkUHJvdG9jb2wgPT4gImludmFsaWQgcHJvdG9jb2wgcmVxdWVzdGVkIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbnN1cHBvcnRlZENsaWVudFR5cGUgPT4gInVuc3VwcG9ydGVkIHByb3RvY29sIGNsaWVudCIsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRGlzcGxheSBmb3IgQXBwbGljYXRpb25FcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZSEoZiwgInt9Iiwgc2VsZi5kZXNjcmlwdGlvbigpKQorICAgIH0KK30KKworaW1wbCBUcnlGcm9tPGkzMj4gZm9yIEFwcGxpY2F0aW9uRXJyb3JLaW5kIHsKKyAgICB0eXBlIEVyciA9IEVycm9yOworICAgIGZuIHRyeV9mcm9tKGZyb206IGkzMikgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycj4geworICAgICAgICBtYXRjaCBmcm9tIHsKKyAgICAgICAgICAgIDAgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24pLAorICAgICAgICAgICAgMSA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bk1ldGhvZCksCisgICAgICAgICAgICAyID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkTWVzc2FnZVR5cGUpLAorICAgICAgICAgICAgMyA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6V3JvbmdNZXRob2ROYW1lKSwKKyAgICAgICAgICAgIDQgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkJhZFNlcXVlbmNlSWQpLAorICAgICAgICAgICAgNSA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6TWlzc2luZ1Jlc3VsdCksCisgICAgICAgICAgICA2ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnRlcm5hbEVycm9yKSwKKyAgICAgICAgICAgIDcgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OlByb3RvY29sRXJyb3IpLAorICAgICAgICAgICAgOCA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZFRyYW5zZm9ybSksCisgICAgICAgICAgICA5ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkUHJvdG9jb2wpLAorICAgICAgICAgICAgMTAgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OlVuc3VwcG9ydGVkQ2xpZW50VHlwZSksCisgICAgICAgICAgICBfID0+IEVycihFcnJvcjo6QXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gQXBwbGljYXRpb25FcnJvcktpbmQiLCBmcm9tKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvbGliLnJzIGIvbGliL3JzL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1YzdkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvbGliLnJzCkBAIC0wLDAgKzEsODcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFJ1c3QgcnVudGltZSBsaWJyYXJ5IGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLgorLy8hCisvLyEgVGhpcyBjcmF0ZSBpbXBsZW1lbnRzIHRoZSBjb21wb25lbnRzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgd29ya2luZworLy8hIFRocmlmdCBzZXJ2ZXIgYW5kIGNsaWVudC4gSXQgaXMgZGl2aWRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgbW9kdWxlczoKKy8vIQorLy8hIDEuIGVycm9ycworLy8hIDIuIHByb3RvY29sCisvLyEgMy4gdHJhbnNwb3J0CisvLyEgNC4gc2VydmVyCisvLyEgNS4gYXV0b2dlbgorLy8hCisvLyEgVGhlIG1vZHVsZXMgYXJlIGxheWVyZWQgYXMgc2hvd24gaW4gdGhlIGRpYWdyYW0gYmVsb3cuIFRoZSBgYXV0b2dlbidkYAorLy8hIGxheWVyIGlzIGdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyJ3MgUnVzdCBwbHVnaW4uIEl0IHVzZXMgdGhlCisvLyEgdHlwZXMgYW5kIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMgY3JhdGUgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQorLy8hIG1lc3NhZ2VzIGFuZCBpbXBsZW1lbnQgUlBDLiBVc2VycyBpbnRlcmFjdCB3aXRoIHRoZXNlIHR5cGVzIGFuZCBzZXJ2aWNlcworLy8hIGJ5IHdyaXRpbmcgdGhlaXIgb3duIGNvZGUgdGhhdCB1c2VzIHRoZSBhdXRvLWdlbmVyYXRlZCBjbGllbnRzIGFuZAorLy8hIHNlcnZlcnMuCisvLyEKKy8vISBgYGB0ZXh0CisvLyEgKy0tLS0tLS0tLS0tKworLy8hIHwgdXNlciBhcHAgIHwKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgfCBhdXRvZ2VuJ2QgfCAodXNlcyBlcnJvcnMsIGF1dG9nZW4pCisvLyEgKy0tLS0tLS0tLS0tKworLy8hIHwgIHByb3RvY29sIHwKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgfCB0cmFuc3BvcnQgfAorLy8hICstLS0tLS0tLS0tLSsKKy8vISBgYGAKKworIyFbY3JhdGVfdHlwZSA9ICJsaWIiXQorIyFbZG9jKHRlc3QoYXR0cihhbGxvdyh1bnVzZWRfdmFyaWFibGVzKSwgZGVueSh3YXJuaW5ncykpKSldCisKK2V4dGVybiBjcmF0ZSBieXRlb3JkZXI7CitleHRlcm4gY3JhdGUgaW50ZWdlcl9lbmNvZGluZzsKK2V4dGVybiBjcmF0ZSB0aHJlYWRwb29sOworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBsb2c7CisKKy8vIE5PVEU6IHRoaXMgbWFjcm8gaGFzIHRvIGJlIGRlZmluZWQgYmVmb3JlIGFueSBtb2R1bGVzLiBTZWU6CisvLyBodHRwczovL2RhbmllbGtlZXAuZ2l0aHViLmlvL3F1aWNrLWludHJvLXRvLW1hY3Jvcy5odG1sI3NvbWUtbW9yZS1nb3RjaGFzCisKKy8vLyBBc3NlcnQgdGhhdCBhbiBleHByZXNzaW9uIHJldHVybmluZyBhIGBSZXN1bHRgIGlzIGEgc3VjY2Vzcy4gSWYgaXQgaXMsCisvLy8gcmV0dXJuIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIHJlc3VsdCwgaS5lLiBgZXhwci51bndyYXAoKWAuCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBhc3NlcnRfc3VjY2VzcyB7CisgICAgKCRlOiBleHByKSA9PiB7eworICAgICAgICBsZXQgcmVzID0gJGU7CisgICAgICAgIGFzc2VydCEocmVzLmlzX29rKCkpOworICAgICAgICByZXMudW53cmFwKCkKKyAgICB9fTsKK30KKworcHViIG1vZCBwcm90b2NvbDsKK3B1YiBtb2Qgc2VydmVyOworcHViIG1vZCB0cmFuc3BvcnQ7CisKK21vZCBlcnJvcnM7CitwdWIgdXNlIGVycm9yczo6KjsKKworbW9kIGF1dG9nZW47CitwdWIgdXNlIGF1dG9nZW46Oio7CisKKy8vLyBSZXN1bHQgdHlwZSByZXR1cm5lZCBieSBhbGwgcnVudGltZSBsaWJyYXJ5IGZ1bmN0aW9ucy4KKy8vLworLy8vIEFzIGlzIGNvbnZlbnRpb24gdGhpcyBpcyBhIHR5cGVkZWYgb2YgYHN0ZDo6cmVzdWx0OjpSZXN1bHRgCisvLy8gd2l0aCBgRWAgZGVmaW5lZCBhcyB0aGUgYHRocmlmdDo6RXJyb3JgIHR5cGUuCitwdWIgdHlwZSBSZXN1bHQ8VD4gPSBzdGQ6OnJlc3VsdDo6UmVzdWx0PFQsIHNlbGY6OkVycm9yPjsKZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvYmluYXJ5LnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9iaW5hcnkucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhZmYzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvYmluYXJ5LnJzCkBAIC0wLDAgKzEsOTU3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBieXRlb3JkZXI6OntCaWdFbmRpYW4sIEJ5dGVPcmRlciwgUmVhZEJ5dGVzRXh0LCBXcml0ZUJ5dGVzRXh0fTsKK3VzZSBzdGQ6OmNvbnZlcnQ6OkZyb207Cit1c2UgdHJ5X2Zyb206OlRyeUZyb207CisKK3VzZSBzdXBlcjo6eworICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsCisgICAgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsCit9OwordXNlIHN1cGVyOjp7VE91dHB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlfTsKK3VzZSB0cmFuc3BvcnQ6OntUUmVhZFRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0fTsKK3VzZSB7UHJvdG9jb2xFcnJvciwgUHJvdG9jb2xFcnJvcktpbmR9OworCitjb25zdCBCSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xOiB1MzIgPSAweDgwMDEwMDAwOworCisvLy8gUmVhZCBtZXNzYWdlcyBlbmNvZGVkIGluIHRoZSBUaHJpZnQgc2ltcGxlIGJpbmFyeSBlbmNvZGluZy4KKy8vLworLy8vIFRoZXJlIGFyZSB0d28gYXZhaWxhYmxlIG1vZGVzOiBgc3RyaWN0YCBhbmQgYG5vbi1zdHJpY3RgLCB3aGVyZSB0aGUKKy8vLyBgbm9uLXN0cmljdGAgdmVyc2lvbiBkb2VzIG5vdCBjaGVjayBmb3IgdGhlIHByb3RvY29sIHZlcnNpb24gaW4gdGhlCisvLy8gcmVjZWl2ZWQgbWVzc2FnZSBoZWFkZXIuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQmluYXJ5SW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLworLy8vIGxldCByZWN2ZF9ib29sID0gcHJvdG9jb2wucmVhZF9ib29sKCkudW53cmFwKCk7CisvLy8gbGV0IHJlY3ZkX3N0cmluZyA9IHByb3RvY29sLnJlYWRfc3RyaW5nKCkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRCaW5hcnlJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgIHN0cmljdDogYm9vbCwKKyAgICBwdWIgdHJhbnNwb3J0OiBULCAvLyBGSVhNRTogc2hvdWxkbid0IGJlIHB1YmxpYworfQorCitpbXBsPCdhLCBUPiBUQmluYXJ5SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRCaW5hcnlJbnB1dFByb3RvY29sYCB0aGF0IHJlYWRzIGJ5dGVzIGZyb20gYHRyYW5zcG9ydGAuCisgICAgLy8vCisgICAgLy8vIFNldCBgc3RyaWN0YCB0byBgdHJ1ZWAgaWYgYWxsIGluY29taW5nIG1lc3NhZ2VzIGNvbnRhaW4gdGhlIHByb3RvY29sCisgICAgLy8vIHZlcnNpb24gbnVtYmVyIGluIHRoZSBwcm90b2NvbCBoZWFkZXIuCisgICAgcHViIGZuIG5ldyh0cmFuc3BvcnQ6IFQsIHN0cmljdDogYm9vbCkgLT4gVEJpbmFyeUlucHV0UHJvdG9jb2w8VD4geworICAgICAgICBUQmluYXJ5SW5wdXRQcm90b2NvbCB7CisgICAgICAgICAgICBzdHJpY3Q6IHN0cmljdCwKKyAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0LAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPFQ+IFRJbnB1dFByb3RvY29sIGZvciBUQmluYXJ5SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICAjW2NmZ19hdHRyKGZlYXR1cmUgPSAiY2FyZ28tY2xpcHB5IiwgYWxsb3coY29sbGFwc2libGVfaWYpKV0KKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IG11dCBmaXJzdF9ieXRlcyA9IHZlYyFbMDsgNF07CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfZXhhY3QoJm11dCBmaXJzdF9ieXRlc1suLl0pPzsKKworICAgICAgICAvLyB0aGUgdGhyaWZ0IHZlcnNpb24gaGVhZGVyIGlzIGludGVudGlvbmFsbHkgbmVnYXRpdmUKKyAgICAgICAgLy8gc28gdGhlIGZpcnN0IGNoZWNrIHdlJ2xsIGRvIGlzIHNlZSBpZiB0aGUgc2lnbiBiaXQgaXMgc2V0CisgICAgICAgIC8vIGFuZCBpZiBzbyAtIGFzc3VtZSBpdCdzIHRoZSBwcm90b2NvbC12ZXJzaW9uIGhlYWRlcgorICAgICAgICBpZiBmaXJzdF9ieXRlc1swXSA+PSA4IHsKKyAgICAgICAgICAgIC8vIGFwcGFyZW50bHkgd2UgZ290IGEgcHJvdG9jb2wtdmVyc2lvbiBoZWFkZXIgLSBjaGVjaworICAgICAgICAgICAgLy8gaXQsIGFuZCBpZiBpdCBtYXRjaGVzLCByZWFkIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMKKyAgICAgICAgICAgIGlmIGZpcnN0X2J5dGVzWzAuLjJdICE9IFsweDgwLCAweDAxXSB7CisgICAgICAgICAgICAgICAgRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgicmVjZWl2ZWQgYmFkIHZlcnNpb246IHs6P30iLCAmZmlyc3RfYnl0ZXNbMC4uMl0pLAorICAgICAgICAgICAgICAgIH0pKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUgPSBUcnlGcm9tOjp0cnlfZnJvbShmaXJzdF9ieXRlc1szXSk/OworICAgICAgICAgICAgICAgIGxldCBuYW1lID0gc2VsZi5yZWFkX3N0cmluZygpPzsKKyAgICAgICAgICAgICAgICBsZXQgc2VxdWVuY2VfbnVtYmVyID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgICAgICAgICBPayhUTWVzc2FnZUlkZW50aWZpZXI6Om5ldyhuYW1lLCBtZXNzYWdlX3R5cGUsIHNlcXVlbmNlX251bWJlcikpCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBhcHBhcmVudGx5IHdlIGRpZG4ndCBnZXQgYSBwcm90b2NvbC12ZXJzaW9uIGhlYWRlciwKKyAgICAgICAgICAgIC8vIHdoaWNoIGhhcHBlbnMgaWYgdGhlIHNlbmRlciBpcyBub3QgdXNpbmcgdGhlIHN0cmljdCBwcm90b2NvbAorICAgICAgICAgICAgaWYgc2VsZi5zdHJpY3QgeworICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGluIHN0cmljdCBtb2RlIGhvd2V2ZXIsIGFuZCB0aGF0IGFsd2F5cworICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVzIHRoZSBwcm90b2NvbC12ZXJzaW9uIGhlYWRlciB0byBiZSB3cml0dGVuIGZpcnN0CisgICAgICAgICAgICAgICAgRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgicmVjZWl2ZWQgYmFkIHZlcnNpb246IHs6P30iLCAmZmlyc3RfYnl0ZXNbMC4uMl0pLAorICAgICAgICAgICAgICAgIH0pKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbm9uLXN0cmljdCB2ZXJzaW9uIHRoZSBmaXJzdCBtZXNzYWdlIGZpZWxkCisgICAgICAgICAgICAgICAgLy8gaXMgdGhlIG1lc3NhZ2UgbmFtZS4gc3RyaW5ncyAoYnl0ZSBhcnJheXMpIGFyZSBsZW5ndGgtcHJlZml4ZWQsCisgICAgICAgICAgICAgICAgLy8gc28gd2UndmUganVzdCByZWFkIHRoZSBsZW5ndGggaW4gdGhlIGZpcnN0IDQgYnl0ZXMKKyAgICAgICAgICAgICAgICBsZXQgbmFtZV9zaXplID0gQmlnRW5kaWFuOjpyZWFkX2kzMigmZmlyc3RfYnl0ZXMpIGFzIHVzaXplOworICAgICAgICAgICAgICAgIGxldCBtdXQgbmFtZV9idWY6IFZlYzx1OD4gPSB2ZWMhWzA7IG5hbWVfc2l6ZV07CisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9leGFjdCgmbXV0IG5hbWVfYnVmKT87CisgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBTdHJpbmc6OmZyb21fdXRmOChuYW1lX2J1Zik/OworCisgICAgICAgICAgICAgICAgLy8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgZmllbGRzCisgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlID0gc2VsZi5yZWFkX2J5dGUoKS5hbmRfdGhlbihUcnlGcm9tOjp0cnlfZnJvbSk/OworICAgICAgICAgICAgICAgIGxldCBzZXF1ZW5jZV9udW1iZXIgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICAgICAgICAgIE9rKFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KG5hbWUsIG1lc3NhZ2VfdHlwZSwgc2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+IHsKKyAgICAgICAgT2soTm9uZSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VEZpZWxkSWRlbnRpZmllcj4geworICAgICAgICBsZXQgZmllbGRfdHlwZV9ieXRlID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGxldCBmaWVsZF90eXBlID0gZmllbGRfdHlwZV9mcm9tX3U4KGZpZWxkX3R5cGVfYnl0ZSk/OworICAgICAgICBsZXQgaWQgPSBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgICAgIFRUeXBlOjpTdG9wID0+IE9rKDApLAorICAgICAgICAgICAgXyA9PiBzZWxmLnJlYWRfaTE2KCksCisgICAgICAgIH0/OworICAgICAgICBPayhURmllbGRJZGVudGlmaWVyOjpuZXc6OjxPcHRpb248U3RyaW5nPiwgU3RyaW5nLCBpMTY+KAorICAgICAgICAgICAgTm9uZSwgZmllbGRfdHlwZSwgaWQsCisgICAgICAgICkpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICBsZXQgbnVtX2J5dGVzID0gc2VsZi50cmFuc3BvcnQucmVhZF9pMzI6OjxCaWdFbmRpYW4+KCk/IGFzIHVzaXplOworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyBudW1fYnl0ZXNdOworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLnJlYWRfZXhhY3QoJm11dCBidWYpCisgICAgICAgICAgICAubWFwKHxffCBidWYpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgbGV0IGIgPSBzZWxmLnJlYWRfaTgoKT87CisgICAgICAgIG1hdGNoIGIgeworICAgICAgICAgICAgMCA9PiBPayhmYWxzZSksCisgICAgICAgICAgICBfID0+IE9rKHRydWUpLAorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9pOCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk4PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfaTgoKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9pMTY6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfaTMyOjo8QmlnRW5kaWFuPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2k2NDo6PEJpZ0VuZGlhbj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9mNjQ6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIGxldCBieXRlcyA9IHNlbGYucmVhZF9ieXRlcygpPzsKKyAgICAgICAgU3RyaW5nOjpmcm9tX3V0ZjgoYnl0ZXMpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGVsZW1lbnRfdHlwZTogVFR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKGZpZWxkX3R5cGVfZnJvbV91OCk/OworICAgICAgICBsZXQgc2l6ZSA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgIE9rKFRMaXN0SWRlbnRpZmllcjo6bmV3KGVsZW1lbnRfdHlwZSwgc2l6ZSkpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VFNldElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGVsZW1lbnRfdHlwZTogVFR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKGZpZWxkX3R5cGVfZnJvbV91OCk/OworICAgICAgICBsZXQgc2l6ZSA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgIE9rKFRTZXRJZGVudGlmaWVyOjpuZXcoZWxlbWVudF90eXBlLCBzaXplKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBrZXlfdHlwZTogVFR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKGZpZWxkX3R5cGVfZnJvbV91OCk/OworICAgICAgICBsZXQgdmFsdWVfdHlwZTogVFR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKGZpZWxkX3R5cGVfZnJvbV91OCk/OworICAgICAgICBsZXQgc2l6ZSA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgIE9rKFRNYXBJZGVudGlmaWVyOjpuZXcoa2V5X3R5cGUsIHZhbHVlX3R5cGUsIHNpemUpKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF91OCgpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRCaW5hcnlJbnB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk7CisKK2ltcGwgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeWAuCisgICAgcHViIGZuIG5ldygpIC0+IFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUSW5wdXRQcm90b2NvbEZhY3RvcnkgZm9yIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcodHJhbnNwb3J0LCB0cnVlKSkKKyAgICB9Cit9CisKKy8vLyBXcml0ZSBtZXNzYWdlcyB1c2luZyB0aGUgVGhyaWZ0IHNpbXBsZSBiaW5hcnkgZW5jb2RpbmcuCisvLy8KKy8vLyBUaGVyZSBhcmUgdHdvIGF2YWlsYWJsZSBtb2RlczogYHN0cmljdGAgYW5kIGBub24tc3RyaWN0YCwgd2hlcmUgdGhlCisvLy8gYHN0cmljdGAgdmVyc2lvbiB3cml0ZXMgdGhlIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIGluIHRoZSBvdXRnb2luZyBtZXNzYWdlCisvLy8gaGVhZGVyIGFuZCB0aGUgYG5vbi1zdHJpY3RgIHZlcnNpb24gZG9lcyBub3QuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQmluYXJ5T3V0cHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLy8KKy8vLyBwcm90b2NvbC53cml0ZV9ib29sKHRydWUpLnVud3JhcCgpOworLy8vIHByb3RvY29sLndyaXRlX3N0cmluZygidGVzdF9zdHJpbmciKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJpbmFyeU91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICBzdHJpY3Q6IGJvb2wsCisgICAgcHViIHRyYW5zcG9ydDogVCwgLy8gRklYTUU6IGRvIG5vdCBtYWtlIHB1YmxpYzsgb25seSBwdWJsaWMgZm9yIHRlc3RpbmchCit9CisKK2ltcGw8VD4gVEJpbmFyeU91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRCaW5hcnlPdXRwdXRQcm90b2NvbGAgdGhhdCB3cml0ZXMgYnl0ZXMgdG8gYHRyYW5zcG9ydGAuCisgICAgLy8vCisgICAgLy8vIFNldCBgc3RyaWN0YCB0byBgdHJ1ZWAgaWYgYWxsIG91dGdvaW5nIG1lc3NhZ2VzIHNob3VsZCBjb250YWluIHRoZQorICAgIC8vLyBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBpbiB0aGUgcHJvdG9jb2wgaGVhZGVyLgorICAgIHB1YiBmbiBuZXcodHJhbnNwb3J0OiBULCBzdHJpY3Q6IGJvb2wpIC0+IFRCaW5hcnlPdXRwdXRQcm90b2NvbDxUPiB7CisgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbCB7CisgICAgICAgICAgICBzdHJpY3Q6IHN0cmljdCwKKyAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0LAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPFQ+IFRPdXRwdXRQcm90b2NvbCBmb3IgVEJpbmFyeU91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgc2VsZi5zdHJpY3QgeworICAgICAgICAgICAgbGV0IG1lc3NhZ2VfdHlwZTogdTggPSBpZGVudGlmaWVyLm1lc3NhZ2VfdHlwZS5pbnRvKCk7CisgICAgICAgICAgICBsZXQgaGVhZGVyID0gQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSB8IChtZXNzYWdlX3R5cGUgYXMgdTMyKTsKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX3UzMjo6PEJpZ0VuZGlhbj4oaGVhZGVyKT87CisgICAgICAgICAgICBzZWxmLndyaXRlX3N0cmluZygmaWRlbnRpZmllci5uYW1lKT87CisgICAgICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNlcXVlbmNlX251bWJlcikKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfc3RyaW5nKCZpZGVudGlmaWVyLm5hbWUpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShpZGVudGlmaWVyLm1lc3NhZ2VfdHlwZS5pbnRvKCkpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2VxdWVuY2VfbnVtYmVyKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmLCBfOiAmVFN0cnVjdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBpZGVudGlmaWVyLmlkLmlzX25vbmUoKSAmJiBpZGVudGlmaWVyLmZpZWxkX3R5cGUgIT0gVFR5cGU6OlN0b3AgeworICAgICAgICAgICAgcmV0dXJuIEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHdyaXRlIGlkZW50aWZpZXIgezo/fSB3aXRob3V0IHNlcXVlbmNlIG51bWJlciIsCisgICAgICAgICAgICAgICAgICAgICZpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KGlkZW50aWZpZXIuZmllbGRfdHlwZSkpPzsKKyAgICAgICAgaWYgbGV0IFNvbWUoaWQpID0gaWRlbnRpZmllci5pZCB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2kxNihpZCkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KFRUeXBlOjpTdG9wKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2kzMihiLmxlbigpIGFzIGkzMik/OworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9hbGwoYikubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBiIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTgoMSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTgoMCkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX2k4KCZtdXQgc2VsZiwgaTogaTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2k4KGkpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMTYoJm11dCBzZWxmLCBpOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2kxNjo6PEJpZ0VuZGlhbj4oaSkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfaTMyOjo8QmlnRW5kaWFuPihpKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9pNjQ6OjxCaWdFbmRpYW4+KGkpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9kb3VibGUoJm11dCBzZWxmLCBkOiBmNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2Y2NDo6PEJpZ0VuZGlhbj4oZCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZXMocy5hc19ieXRlcygpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OChpZGVudGlmaWVyLmVsZW1lbnRfdHlwZSkpPzsKKyAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zaXplKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OChpZGVudGlmaWVyLmVsZW1lbnRfdHlwZSkpPzsKKyAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zaXplKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1hcElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBrZXlfdHlwZSA9IGlkZW50aWZpZXIKKyAgICAgICAgICAgIC5rZXlfdHlwZQorICAgICAgICAgICAgLmV4cGVjdCgibWFwIGlkZW50aWZpZXIgdG8gd3JpdGUgc2hvdWxkIGNvbnRhaW4ga2V5IHR5cGUiKTsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgoa2V5X3R5cGUpKT87CisgICAgICAgIGxldCB2YWxfdHlwZSA9IGlkZW50aWZpZXIKKyAgICAgICAgICAgIC52YWx1ZV90eXBlCisgICAgICAgICAgICAuZXhwZWN0KCJtYXAgaWRlbnRpZmllciB0byB3cml0ZSBzaG91bGQgY29udGFpbiB2YWx1ZSB0eXBlIik7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KHZhbF90eXBlKSk/OworICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuZmx1c2goKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiB3cml0ZV9ieXRlKCZtdXQgc2VsZiwgYjogdTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX3U4KGIpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRCaW5hcnlPdXRwdXRQcm90b2NvbGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeTsKKworaW1wbCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnlgLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5IGZvciBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyh0cmFuc3BvcnQsIHRydWUpKQorICAgIH0KK30KKworZm4gZmllbGRfdHlwZV90b191OChmaWVsZF90eXBlOiBUVHlwZSkgLT4gdTggeworICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICBUVHlwZTo6U3RvcCA9PiAweDAwLAorICAgICAgICBUVHlwZTo6Vm9pZCA9PiAweDAxLAorICAgICAgICBUVHlwZTo6Qm9vbCA9PiAweDAyLAorICAgICAgICBUVHlwZTo6STA4ID0+IDB4MDMsIC8vIGVxdWl2YWxlbnQgdG8gVFR5cGU6OkJ5dGUKKyAgICAgICAgVFR5cGU6OkRvdWJsZSA9PiAweDA0LAorICAgICAgICBUVHlwZTo6STE2ID0+IDB4MDYsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gMHgwOCwKKyAgICAgICAgVFR5cGU6Okk2NCA9PiAweDBBLAorICAgICAgICBUVHlwZTo6U3RyaW5nIHwgVFR5cGU6OlV0ZjcgPT4gMHgwQiwKKyAgICAgICAgVFR5cGU6OlN0cnVjdCA9PiAweDBDLAorICAgICAgICBUVHlwZTo6TWFwID0+IDB4MEQsCisgICAgICAgIFRUeXBlOjpTZXQgPT4gMHgwRSwKKyAgICAgICAgVFR5cGU6Okxpc3QgPT4gMHgwRiwKKyAgICAgICAgVFR5cGU6OlV0ZjggPT4gMHgxMCwKKyAgICAgICAgVFR5cGU6OlV0ZjE2ID0+IDB4MTEsCisgICAgfQorfQorCitmbiBmaWVsZF90eXBlX2Zyb21fdTgoYjogdTgpIC0+IDo6UmVzdWx0PFRUeXBlPiB7CisgICAgbWF0Y2ggYiB7CisgICAgICAgIDB4MDAgPT4gT2soVFR5cGU6OlN0b3ApLAorICAgICAgICAweDAxID0+IE9rKFRUeXBlOjpWb2lkKSwKKyAgICAgICAgMHgwMiA9PiBPayhUVHlwZTo6Qm9vbCksCisgICAgICAgIDB4MDMgPT4gT2soVFR5cGU6OkkwOCksIC8vIEVxdWl2YWxlbnQgdG8gVFR5cGU6OkJ5dGUKKyAgICAgICAgMHgwNCA9PiBPayhUVHlwZTo6RG91YmxlKSwKKyAgICAgICAgMHgwNiA9PiBPayhUVHlwZTo6STE2KSwKKyAgICAgICAgMHgwOCA9PiBPayhUVHlwZTo6STMyKSwKKyAgICAgICAgMHgwQSA9PiBPayhUVHlwZTo6STY0KSwKKyAgICAgICAgMHgwQiA9PiBPayhUVHlwZTo6U3RyaW5nKSwgLy8gdGVjaG5pY2FsbHksIGFsc28gYSBVVEY3LCBidXQgd2UnbGwgdHJlYXQgaXQgYXMgc3RyaW5nCisgICAgICAgIDB4MEMgPT4gT2soVFR5cGU6OlN0cnVjdCksCisgICAgICAgIDB4MEQgPT4gT2soVFR5cGU6Ok1hcCksCisgICAgICAgIDB4MEUgPT4gT2soVFR5cGU6OlNldCksCisgICAgICAgIDB4MEYgPT4gT2soVFR5cGU6Okxpc3QpLAorICAgICAgICAweDEwID0+IE9rKFRUeXBlOjpVdGY4KSwKKyAgICAgICAgMHgxMSA9PiBPayhUVHlwZTo6VXRmMTYpLAorICAgICAgICB1bmtuID0+IEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIFRUeXBlIiwgdW5rbiksCisgICAgICAgIH0pKSwKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBwcm90b2NvbDo6eworICAgICAgICBURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgICAgICBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbCwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZSwKKyAgICB9OworICAgIHVzZSB0cmFuc3BvcnQ6OntSZWFkSGFsZiwgVEJ1ZmZlckNoYW5uZWwsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJpY3RfbWVzc2FnZV9jYWxsX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxNl0gPSBbCisgICAgICAgICAgICAweDgwLAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNCwKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDY1LAorICAgICAgICAgICAgMHg3MywKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ub25fc3RyaWN0X21lc3NhZ2VfY2FsbF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyhmYWxzZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDEzXSA9IFsKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDQsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHg2NSwKKyAgICAgICAgICAgIDB4NzMsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cmljdF9tZXNzYWdlX3JlcGx5X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpSZXBseSwgMTApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDE2XSA9IFsKKyAgICAgICAgICAgIDB4ODAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDIsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDA0LAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4NjUsCisgICAgICAgICAgICAweDczLAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MEEsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25vbl9zdHJpY3RfbWVzc2FnZV9yZXBseV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyhmYWxzZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OlJlcGx5LCAxMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTNdID0gWworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNCwKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDY1LAorICAgICAgICAgICAgMHg3MywKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDAyLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwQSwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJpY3RfbWVzc2FnZV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmc2VudF9pZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9ub25fc3RyaWN0X21lc3NhZ2VfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoZmFsc2UpOworCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWVzc2FnZV9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZzZW50X2lkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX21lc3NhZ2VfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF9iZWdpbigpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKAorICAgICAgICAgICAgfG98IG8ud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSksCisgICAgICAgICAgICB0cnVlLAorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9zdHJ1Y3RfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2ZpZWxkX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90CisgICAgICAgICAgICAud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygic29tZV9maWVsZCIsIFRUeXBlOjpTdHJpbmcsIDIyKSkKKyAgICAgICAgICAgIC5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgM10gPSBbMHgwQiwgMHgwMCwgMHgxNl07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2ZpZWxkX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBzZW50X2ZpZWxkX2lkZW50ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAyMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZzZW50X2ZpZWxkX2lkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfaWRlbnQgPSBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6STY0LAorICAgICAgICAgICAgaWQ6IFNvbWUoMjApLAorICAgICAgICB9OyAvLyBubyBuYW1lCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZleHBlY3RlZF9pZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RvcF9maWVsZCgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4MDBdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9maWVsZF9zdG9wKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfaWRlbnQgPSBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgIGlkOiBTb21lKDApLAorICAgICAgICB9OyAvLyB3ZSBnZXQgaWQgMAorCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZleHBlY3RlZF9pZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfZmllbGRfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfZmllbGRfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3QKKyAgICAgICAgICAgIC53cml0ZV9saXN0X2JlZ2luKCZUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6Qm9vbCwgNSkpCisgICAgICAgICAgICAuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDVdID0gWzB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDVdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpMaXN0LCA5MDApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2xpc3RfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xpc3RfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbGlzdF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90CisgICAgICAgICAgICAud3JpdGVfc2V0X2JlZ2luKCZUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJMTYsIDcpKQorICAgICAgICAgICAgLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA1XSA9IFsweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDA3XTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okk2NCwgMjAwMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX3NldF9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudF9yZXN1bHQgPSBpX3Byb3QucmVhZF9zZXRfYmVnaW4oKTsKKyAgICAgICAgYXNzZXJ0IShyZWNlaXZlZF9pZGVudF9yZXN1bHQuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50X3Jlc3VsdC51bndyYXAoKSwgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zZXRfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfc2V0X2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3QKKyAgICAgICAgICAgIC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okk2NCwgVFR5cGU6OlN0cnVjdCwgMzIpKQorICAgICAgICAgICAgLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA2XSA9IFsweDBBLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDIwXTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6Ok1hcCwgVFR5cGU6OlNldCwgMTAwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21hcF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWFwX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX21hcF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfYm9vbF90cnVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4MDFdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfYm9vbF9mYWxzZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgwMF07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX2Jvb2xfdHJ1ZSgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBfKSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBzZXRfcmVhZGFibGVfYnl0ZXMhKGlfcHJvdCwgJlsweDAxXSk7CisKKyAgICAgICAgbGV0IHJlYWRfYm9vbCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYm9vbCwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9ib29sX2ZhbHNlKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIF8pID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIHNldF9yZWFkYWJsZV9ieXRlcyEoaV9wcm90LCAmWzB4MDBdKTsKKworICAgICAgICBsZXQgcmVhZF9ib29sID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9ib29sLCBmYWxzZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWxsb3dfYW55X25vbl96ZXJvX3ZhbHVlX3RvX2JlX2ludGVycHJldGVkX2FzX2Jvb2xfdHJ1ZSgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBfKSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBzZXRfcmVhZGFibGVfYnl0ZXMhKGlfcHJvdCwgJlsweEFDXSk7CisKKyAgICAgICAgbGV0IHJlYWRfYm9vbCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYm9vbCwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfYnl0ZXMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGJ5dGVzOiBbdTg7IDEwXSA9IFsweDBBLCAweENDLCAweEQxLCAweDg0LCAweDk5LCAweDEyLCAweEFCLCAweEJCLCAweDQ1LCAweERGXTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9ieXRlcygmYnl0ZXMpLmlzX29rKCkpOworCisgICAgICAgIGxldCBidWYgPSBvX3Byb3QudHJhbnNwb3J0LndyaXRlX2J5dGVzKCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlswLi40XSwgWzB4MDAsIDB4MDAsIDB4MDAsIDB4MEFdKTsgLy8gbGVuZ3RoCisgICAgICAgIGFzc2VydF9lcSEoJmJ1Zls0Li5dLCBieXRlcyk7IC8vIGFjdHVhbCBieXRlcworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfYnl0ZXMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGJ5dGVzOiBbdTg7IDI1XSA9IFsKKyAgICAgICAgICAgIDB4MjAsCisgICAgICAgICAgICAweEZELAorICAgICAgICAgICAgMHgxOCwKKyAgICAgICAgICAgIDB4ODQsCisgICAgICAgICAgICAweDk5LAorICAgICAgICAgICAgMHgxMiwKKyAgICAgICAgICAgIDB4QUIsCisgICAgICAgICAgICAweEJCLAorICAgICAgICAgICAgMHg0NSwKKyAgICAgICAgICAgIDB4REYsCisgICAgICAgICAgICAweDM0LAorICAgICAgICAgICAgMHhEQywKKyAgICAgICAgICAgIDB4OTgsCisgICAgICAgICAgICAweEE0LAorICAgICAgICAgICAgMHg2RCwKKyAgICAgICAgICAgIDB4RjMsCisgICAgICAgICAgICAweDk5LAorICAgICAgICAgICAgMHhCNCwKKyAgICAgICAgICAgIDB4QjcsCisgICAgICAgICAgICAweEQ0LAorICAgICAgICAgICAgMHg5QywKKyAgICAgICAgICAgIDB4QTUsCisgICAgICAgICAgICAweEIzLAorICAgICAgICAgICAgMHhDOSwKKyAgICAgICAgICAgIDB4ODgsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfYnl0ZXMoJmJ5dGVzKS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfYnl0ZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2J5dGVzLCAmYnl0ZXMpOworICAgIH0KKworICAgIGZuIHRlc3Rfb2JqZWN0cygKKyAgICAgICAgc3RyaWN0OiBib29sLAorICAgICkgLT4gKAorICAgICAgICBUQmluYXJ5SW5wdXRQcm90b2NvbDxSZWFkSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg0MCwgNDApOworCisgICAgICAgIGxldCAocl9tZW0sIHdfbWVtKSA9IG1lbS5zcGxpdCgpLnVud3JhcCgpOworCisgICAgICAgIGxldCBpX3Byb3QgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KHJfbWVtLCBzdHJpY3QpOworICAgICAgICBsZXQgb19wcm90ID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcod19tZW0sIHN0cmljdCk7CisKKyAgICAgICAgKGlfcHJvdCwgb19wcm90KQorICAgIH0KKworICAgIGZuIGFzc2VydF9ub193cml0ZTxGPihtdXQgd3JpdGVfZm46IEYsIHN0cmljdDogYm9vbCkKKyAgICB3aGVyZQorICAgICAgICBGOiBGbk11dCgmbXV0IFRCaW5hcnlPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PikgLT4gOjpSZXN1bHQ8KCk+LAorICAgIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyhzdHJpY3QpOworICAgICAgICBhc3NlcnQhKHdyaXRlX2ZuKCZtdXQgb19wcm90KS5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShvX3Byb3QudHJhbnNwb3J0LndyaXRlX2J5dGVzKCkubGVuKCksIDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvY29tcGFjdC5ycyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvY29tcGFjdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjVlZGFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9jb21wYWN0LnJzCkBAIC0wLDAgKzEsMjM4NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2UgYnl0ZW9yZGVyOjp7QmlnRW5kaWFuLCBSZWFkQnl0ZXNFeHQsIFdyaXRlQnl0ZXNFeHR9OwordXNlIGludGVnZXJfZW5jb2Rpbmc6OntWYXJJbnRSZWFkZXIsIFZhckludFdyaXRlcn07Cit1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOwordXNlIHN0ZDo6aW87Cit1c2UgdHJ5X2Zyb206OlRyeUZyb207CisKK3VzZSBzdXBlcjo6eworICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsCisgICAgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsCit9OwordXNlIHN1cGVyOjp7VE91dHB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlfTsKK3VzZSB0cmFuc3BvcnQ6OntUUmVhZFRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0fTsKKworY29uc3QgQ09NUEFDVF9QUk9UT0NPTF9JRDogdTggPSAweDgyOworY29uc3QgQ09NUEFDVF9WRVJTSU9OOiB1OCA9IDB4MDE7Citjb25zdCBDT01QQUNUX1ZFUlNJT05fTUFTSzogdTggPSAweDFGOworCisvLy8gUmVhZCBtZXNzYWdlcyBlbmNvZGVkIGluIHRoZSBUaHJpZnQgY29tcGFjdCBwcm90b2NvbC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRDb21wYWN0SW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RDb21wYWN0SW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwpOworLy8vCisvLy8gbGV0IHJlY3ZkX2Jvb2wgPSBwcm90b2NvbC5yZWFkX2Jvb2woKS51bndyYXAoKTsKKy8vLyBsZXQgcmVjdmRfc3RyaW5nID0gcHJvdG9jb2wucmVhZF9zdHJpbmcoKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVENvbXBhY3RJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgIC8vIElkZW50aWZpZXIgb2YgdGhlIGxhc3QgZmllbGQgZGVzZXJpYWxpemVkIGZvciBhIHN0cnVjdC4KKyAgICBsYXN0X3JlYWRfZmllbGRfaWQ6IGkxNiwKKyAgICAvLyBTdGFjayBvZiB0aGUgbGFzdCByZWFkIGZpZWxkIGlkcyAoYSBuZXcgZW50cnkgaXMgYWRkZWQgZWFjaCB0aW1lIGEgbmVzdGVkIHN0cnVjdCBpcyByZWFkKS4KKyAgICByZWFkX2ZpZWxkX2lkX3N0YWNrOiBWZWM8aTE2PiwKKyAgICAvLyBCb29sZWFuIHZhbHVlIGZvciBhIGZpZWxkLgorICAgIC8vIFNhdmVkIGJlY2F1c2UgYm9vbGVhbiBmaWVsZHMgYW5kIHRoZWlyIHZhbHVlIGFyZSBlbmNvZGVkIGluIGEgc2luZ2xlIGJ5dGUsCisgICAgLy8gYW5kIHJlYWRpbmcgdGhlIGZpZWxkIG9ubHkgb2NjdXJzIGFmdGVyIHRoZSBmaWVsZCBpZCBpcyByZWFkLgorICAgIHBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlOiBPcHRpb248Ym9vbD4sCisgICAgLy8gVW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgYnl0ZS1sZXZlbCBvcGVyYXRpb25zLgorICAgIHRyYW5zcG9ydDogVCwKK30KKworaW1wbDxUPiBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQ29tcGFjdElucHV0UHJvdG9jb2xgIHRoYXQgcmVhZHMgYnl0ZXMgZnJvbSBgdHJhbnNwb3J0YC4KKyAgICBwdWIgZm4gbmV3KHRyYW5zcG9ydDogVCkgLT4gVENvbXBhY3RJbnB1dFByb3RvY29sPFQ+IHsKKyAgICAgICAgVENvbXBhY3RJbnB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIGxhc3RfcmVhZF9maWVsZF9pZDogMCwKKyAgICAgICAgICAgIHJlYWRfZmllbGRfaWRfc3RhY2s6IFZlYzo6bmV3KCksCisgICAgICAgICAgICBwZW5kaW5nX3JlYWRfYm9vbF92YWx1ZTogTm9uZSwKKyAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0LAorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PChUVHlwZSwgaTMyKT4geworICAgICAgICBsZXQgaGVhZGVyID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGxldCBlbGVtZW50X3R5cGUgPSBjb2xsZWN0aW9uX3U4X3RvX3R5cGUoaGVhZGVyICYgMHgwRik/OworCisgICAgICAgIGxldCBlbGVtZW50X2NvdW50OworICAgICAgICBsZXQgcG9zc2libGVfZWxlbWVudF9jb3VudCA9IChoZWFkZXIgJiAweEYwKSA+PiA0OworICAgICAgICBpZiBwb3NzaWJsZV9lbGVtZW50X2NvdW50ICE9IDE1IHsKKyAgICAgICAgICAgIC8vIGhpZ2ggYml0cyBzZXQgaGlnaCBpZiBjb3VudCBhbmQgdHlwZSBlbmNvZGVkIHNlcGFyYXRlbHkKKyAgICAgICAgICAgIGVsZW1lbnRfY291bnQgPSBwb3NzaWJsZV9lbGVtZW50X2NvdW50IGFzIGkzMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVsZW1lbnRfY291bnQgPSBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PHUzMj4oKT8gYXMgaTMyOworICAgICAgICB9CisKKyAgICAgICAgT2soKGVsZW1lbnRfdHlwZSwgZWxlbWVudF9jb3VudCkpCisgICAgfQorfQorCitpbXBsPFQ+IFRJbnB1dFByb3RvY29sIGZvciBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgZm4gcmVhZF9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1lc3NhZ2VJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBjb21wYWN0X2lkID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGlmIGNvbXBhY3RfaWQgIT0gQ09NUEFDVF9QUk9UT0NPTF9JRCB7CisgICAgICAgICAgICBFcnIoOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImludmFsaWQgY29tcGFjdCBwcm90b2NvbCBoZWFkZXIgezo/fSIsIGNvbXBhY3RfaWQpLAorICAgICAgICAgICAgfSkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgfT87CisKKyAgICAgICAgbGV0IHR5cGVfYW5kX2J5dGUgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgbGV0IHJlY2VpdmVkX3ZlcnNpb24gPSB0eXBlX2FuZF9ieXRlICYgQ09NUEFDVF9WRVJTSU9OX01BU0s7CisgICAgICAgIGlmIHJlY2VpdmVkX3ZlcnNpb24gIT0gQ09NUEFDVF9WRVJTSU9OIHsKKyAgICAgICAgICAgIEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwcm9jZXNzIGNvbXBhY3QgcHJvdG9jb2wgdmVyc2lvbiB7Oj99IiwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRfdmVyc2lvbgorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICB9KSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKCgpKQorICAgICAgICB9PzsKKworICAgICAgICAvLyBOT1RFOiB1bnNpZ25lZCByaWdodCBzaGlmdCB3aWxsIHBhZCB3aXRoIDBzCisgICAgICAgIGxldCBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSA9IFRNZXNzYWdlVHlwZTo6dHJ5X2Zyb20odHlwZV9hbmRfYnl0ZSA+PiA1KT87CisgICAgICAgIGxldCBzZXF1ZW5jZV9udW1iZXIgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICBsZXQgc2VydmljZV9jYWxsX25hbWUgPSBzZWxmLnJlYWRfc3RyaW5nKCk/OworCisgICAgICAgIHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkID0gMDsKKworICAgICAgICBPayhUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgIHNlcnZpY2VfY2FsbF9uYW1lLAorICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgc2VxdWVuY2VfbnVtYmVyLAorICAgICAgICApKQorICAgIH0KKworICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+IHsKKyAgICAgICAgc2VsZi5yZWFkX2ZpZWxkX2lkX3N0YWNrLnB1c2goc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQpOworICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCA9IDA7CisgICAgICAgIE9rKE5vbmUpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQgPSBzZWxmCisgICAgICAgICAgICAucmVhZF9maWVsZF9pZF9zdGFjaworICAgICAgICAgICAgLnBvcCgpCisgICAgICAgICAgICAuZXhwZWN0KCJzaG91bGQgaGF2ZSBwcmV2aW91cyBmaWVsZCBpZHMiKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRGaWVsZElkZW50aWZpZXI+IHsKKyAgICAgICAgLy8gd2UgY2FuIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUsIHdoaWNoIGlzOgorICAgICAgICAvLyAtIHRoZSB0eXBlCisgICAgICAgIC8vIC0gdGhlIGZpZWxkIGRlbHRhIGFuZCB0aGUgdHlwZQorICAgICAgICBsZXQgZmllbGRfdHlwZSA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICBsZXQgZmllbGRfZGVsdGEgPSAoZmllbGRfdHlwZSAmIDB4RjApID4+IDQ7CisgICAgICAgIGxldCBmaWVsZF90eXBlID0gbWF0Y2ggZmllbGRfdHlwZSAmIDB4MEYgeworICAgICAgICAgICAgMHgwMSA9PiB7CisgICAgICAgICAgICAgICAgc2VsZi5wZW5kaW5nX3JlYWRfYm9vbF92YWx1ZSA9IFNvbWUodHJ1ZSk7CisgICAgICAgICAgICAgICAgT2soVFR5cGU6OkJvb2wpCisgICAgICAgICAgICB9CisgICAgICAgICAgICAweDAyID0+IHsKKyAgICAgICAgICAgICAgICBzZWxmLnBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlID0gU29tZShmYWxzZSk7CisgICAgICAgICAgICAgICAgT2soVFR5cGU6OkJvb2wpCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0dHU4ID0+IHU4X3RvX3R5cGUodHR1OCksCisgICAgICAgIH0/OworCisgICAgICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICAgICAgVFR5cGU6OlN0b3AgPT4gT2soCisgICAgICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllcjo6bmV3Ojo8T3B0aW9uPFN0cmluZz4sIFN0cmluZywgT3B0aW9uPGkxNj4+KAorICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICAgICBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIF8gPT4geworICAgICAgICAgICAgICAgIGlmIGZpZWxkX2RlbHRhICE9IDAgeworICAgICAgICAgICAgICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCArPSBmaWVsZF9kZWx0YSBhcyBpMTY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQgPSBzZWxmLnJlYWRfaTE2KCk/OworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBPayhURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaWQ6IFNvbWUoc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgbWF0Y2ggc2VsZi5wZW5kaW5nX3JlYWRfYm9vbF92YWx1ZS50YWtlKCkgeworICAgICAgICAgICAgU29tZShiKSA9PiBPayhiKSwKKyAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgIGxldCBiID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgICAgICAgICAgbWF0Y2ggYiB7CisgICAgICAgICAgICAgICAgICAgIDB4MDEgPT4gT2sodHJ1ZSksCisgICAgICAgICAgICAgICAgICAgIDB4MDIgPT4gT2soZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICB1bmtuID0+IEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSBpbnRvIGJvb2wiLCB1bmtuKSwKKyAgICAgICAgICAgICAgICAgICAgfSkpLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgIGxldCBsZW4gPSBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PHUzMj4oKT87CisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IGxlbiBhcyB1c2l6ZV07CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAucmVhZF9leGFjdCgmbXV0IGJ1ZikKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCBidWYpCisgICAgfQorCisgICAgZm4gcmVhZF9pOCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk4PiB7CisgICAgICAgIHNlbGYucmVhZF9ieXRlKCkubWFwKHxpfCBpIGFzIGk4KQorICAgIH0KKworICAgIGZuIHJlYWRfaTE2KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTE2PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8aTE2PigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2kzMigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkzMj4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PGkzMj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9pNjQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpNjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6OjxpNjQ+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfZG91YmxlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8ZjY0PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfZjY0Ojo8QmlnRW5kaWFuPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cmluZygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBsZXQgYnl0ZXMgPSBzZWxmLnJlYWRfYnl0ZXMoKT87CisgICAgICAgIFN0cmluZzo6ZnJvbV91dGY4KGJ5dGVzKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VExpc3RJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCAoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSA9IHNlbGYucmVhZF9saXN0X3NldF9iZWdpbigpPzsKKyAgICAgICAgT2soVExpc3RJZGVudGlmaWVyOjpuZXcoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj4geworICAgICAgICBsZXQgKGVsZW1lbnRfdHlwZSwgZWxlbWVudF9jb3VudCkgPSBzZWxmLnJlYWRfbGlzdF9zZXRfYmVnaW4oKT87CisgICAgICAgIE9rKFRTZXRJZGVudGlmaWVyOjpuZXcoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBlbGVtZW50X2NvdW50ID0gc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6Ojx1MzI+KCk/IGFzIGkzMjsKKyAgICAgICAgaWYgZWxlbWVudF9jb3VudCA9PSAwIHsKKyAgICAgICAgICAgIE9rKFRNYXBJZGVudGlmaWVyOjpuZXcoTm9uZSwgTm9uZSwgMCkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZXQgdHlwZV9oZWFkZXIgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgICAgIGxldCBrZXlfdHlwZSA9IGNvbGxlY3Rpb25fdThfdG9fdHlwZSgodHlwZV9oZWFkZXIgJiAweEYwKSA+PiA0KT87CisgICAgICAgICAgICBsZXQgdmFsX3R5cGUgPSBjb2xsZWN0aW9uX3U4X3RvX3R5cGUodHlwZV9oZWFkZXIgJiAweDBGKT87CisgICAgICAgICAgICBPayhUTWFwSWRlbnRpZmllcjo6bmV3KGtleV90eXBlLCB2YWxfdHlwZSwgZWxlbWVudF9jb3VudCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PiB7CisgICAgICAgIGxldCBtdXQgYnVmID0gWzB1ODsgMV07CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAucmVhZF9leGFjdCgmbXV0IGJ1ZikKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCBidWZbMF0pCisgICAgfQorfQorCitpbXBsPFQ+IGlvOjpTZWVrIGZvciBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogaW86OlNlZWsgKyBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICBmbiBzZWVrKCZtdXQgc2VsZiwgcG9zOiBpbzo6U2Vla0Zyb20pIC0+IGlvOjpSZXN1bHQ8dTY0PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnNlZWsocG9zKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVENvbXBhY3RJbnB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5OworCitpbXBsIFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeWAuCisgICAgcHViIGZuIG5ldygpIC0+IFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgICAgICBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRJbnB1dFByb3RvY29sRmFjdG9yeSBmb3IgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KHRyYW5zcG9ydCkpCisgICAgfQorfQorCisvLy8gV3JpdGUgbWVzc2FnZXMgdXNpbmcgdGhlIFRocmlmdCBjb21wYWN0IHByb3RvY29sLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVENvbXBhY3RPdXRwdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RDb21wYWN0T3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwpOworLy8vCisvLy8gcHJvdG9jb2wud3JpdGVfYm9vbCh0cnVlKS51bndyYXAoKTsKKy8vLyBwcm90b2NvbC53cml0ZV9zdHJpbmcoInRlc3Rfc3RyaW5nIikudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIC8vIElkZW50aWZpZXIgb2YgdGhlIGxhc3QgZmllbGQgc2VyaWFsaXplZCBmb3IgYSBzdHJ1Y3QuCisgICAgbGFzdF93cml0ZV9maWVsZF9pZDogaTE2LAorICAgIC8vIFN0YWNrIG9mIHRoZSBsYXN0IHdyaXR0ZW4gZmllbGQgaWRzIChuZXcgZW50cnkgYWRkZWQgZWFjaCB0aW1lIGEgbmVzdGVkIHN0cnVjdCBpcyB3cml0dGVuKS4KKyAgICB3cml0ZV9maWVsZF9pZF9zdGFjazogVmVjPGkxNj4sCisgICAgLy8gRmllbGQgaWRlbnRpZmllciBvZiB0aGUgYm9vbGVhbiBmaWVsZCB0byBiZSB3cml0dGVuLgorICAgIC8vIFNhdmVkIGJlY2F1c2UgYm9vbGVhbiBmaWVsZHMgYW5kIHRoZWlyIHZhbHVlIGFyZSBlbmNvZGVkIGluIGEgc2luZ2xlIGJ5dGUKKyAgICBwZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllcjogT3B0aW9uPFRGaWVsZElkZW50aWZpZXI+LAorICAgIC8vIFVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZWQgZm9yIGJ5dGUtbGV2ZWwgb3BlcmF0aW9ucy4KKyAgICB0cmFuc3BvcnQ6IFQsCit9CisKK2ltcGw8VD4gVENvbXBhY3RPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQ29tcGFjdE91dHB1dFByb3RvY29sYCB0aGF0IHdyaXRlcyBieXRlcyB0byBgdHJhbnNwb3J0YC4KKyAgICBwdWIgZm4gbmV3KHRyYW5zcG9ydDogVCkgLT4gVENvbXBhY3RPdXRwdXRQcm90b2NvbDxUPiB7CisgICAgICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2wgeworICAgICAgICAgICAgbGFzdF93cml0ZV9maWVsZF9pZDogMCwKKyAgICAgICAgICAgIHdyaXRlX2ZpZWxkX2lkX3N0YWNrOiBWZWM6Om5ldygpLAorICAgICAgICAgICAgcGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXI6IE5vbmUsCisgICAgICAgICAgICB0cmFuc3BvcnQ6IHRyYW5zcG9ydCwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZJWE1FOiBmaWVsZF90eXBlIGFzIHVuY29uc3RyYWluZWQgdTggaXMgYmFkCisgICAgZm4gd3JpdGVfZmllbGRfaGVhZGVyKCZtdXQgc2VsZiwgZmllbGRfdHlwZTogdTgsIGZpZWxkX2lkOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBmaWVsZF9kZWx0YSA9IGZpZWxkX2lkIC0gc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkOworICAgICAgICBpZiBmaWVsZF9kZWx0YSA+IDAgJiYgZmllbGRfZGVsdGEgPCAxNSB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoKChmaWVsZF9kZWx0YSBhcyB1OCkgPDwgNCkgfCBmaWVsZF90eXBlKT87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZSk/OworICAgICAgICAgICAgc2VsZi53cml0ZV9pMTYoZmllbGRfaWQpPzsKKyAgICAgICAgfQorICAgICAgICBzZWxmLmxhc3Rfd3JpdGVfZmllbGRfaWQgPSBmaWVsZF9pZDsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9zZXRfYmVnaW4oJm11dCBzZWxmLCBlbGVtZW50X3R5cGU6IFRUeXBlLCBlbGVtZW50X2NvdW50OiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBlbGVtX2lkZW50aWZpZXIgPSBjb2xsZWN0aW9uX3R5cGVfdG9fdTgoZWxlbWVudF90eXBlKTsKKyAgICAgICAgaWYgZWxlbWVudF9jb3VudCA8PSAxNCB7CisgICAgICAgICAgICBsZXQgaGVhZGVyID0gKGVsZW1lbnRfY291bnQgYXMgdTgpIDw8IDQgfCBlbGVtX2lkZW50aWZpZXI7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoaGVhZGVyKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGV0IGhlYWRlciA9IDB4RjAgfCBlbGVtX2lkZW50aWZpZXI7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoaGVhZGVyKT87CisgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgICAgIC53cml0ZV92YXJpbnQoZWxlbWVudF9jb3VudCBhcyB1MzIpCisgICAgICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgICAgICAubWFwKHxffCAoKSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoJnNlbGYpIHsKKyAgICAgICAgaWYgbGV0IFNvbWUocmVmIGYpID0gc2VsZi5wZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllciB7CisgICAgICAgICAgICBwYW5pYyEoInBlbmRpbmcgYm9vbCBmaWVsZCB7Oj99IG5vdCB3cml0dGVuIiwgZikKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxUPiBUT3V0cHV0UHJvdG9jb2wgZm9yIFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoQ09NUEFDVF9QUk9UT0NPTF9JRCk/OworICAgICAgICBzZWxmLndyaXRlX2J5dGUoKHU4Ojpmcm9tKGlkZW50aWZpZXIubWVzc2FnZV90eXBlKSA8PCA1KSB8IENPTVBBQ1RfVkVSU0lPTik/OworICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNlcXVlbmNlX251bWJlcik/OworICAgICAgICBzZWxmLndyaXRlX3N0cmluZygmaWRlbnRpZmllci5uYW1lKT87CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19ib29sX3dyaXRlKCk7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIF86ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9maWVsZF9pZF9zdGFjay5wdXNoKHNlbGYubGFzdF93cml0ZV9maWVsZF9pZCk7CisgICAgICAgIHNlbGYubGFzdF93cml0ZV9maWVsZF9pZCA9IDA7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoKTsKKyAgICAgICAgc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkID0gc2VsZgorICAgICAgICAgICAgLndyaXRlX2ZpZWxkX2lkX3N0YWNrCisgICAgICAgICAgICAucG9wKCkKKyAgICAgICAgICAgIC5leHBlY3QoInNob3VsZCBoYXZlIHByZXZpb3VzIGZpZWxkIGlkcyIpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBtYXRjaCBpZGVudGlmaWVyLmZpZWxkX3R5cGUgeworICAgICAgICAgICAgVFR5cGU6OkJvb2wgPT4geworICAgICAgICAgICAgICAgIGlmIHNlbGYucGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXIuaXNfc29tZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFuaWMhKAorICAgICAgICAgICAgICAgICAgICAgICAgInNob3VsZCBub3QgaGF2ZSBhIHBlbmRpbmcgYm9vbCB3aGlsZSB3cml0aW5nIGFub3RoZXIgYm9vbCB3aXRoIGlkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgezo/fSIsCisgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5wZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllciA9IFNvbWUoaWRlbnRpZmllci5jbG9uZSgpKTsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4geworICAgICAgICAgICAgICAgIGxldCBmaWVsZF90eXBlID0gdHlwZV90b191OChpZGVudGlmaWVyLmZpZWxkX3R5cGUpOworICAgICAgICAgICAgICAgIGxldCBmaWVsZF9pZCA9IGlkZW50aWZpZXIuaWQuZXhwZWN0KCJub24tc3RvcCBmaWVsZCBzaG91bGQgaGF2ZSBmaWVsZCBpZCIpOworICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfZmllbGRfaGVhZGVyKGZpZWxkX3R5cGUsIGZpZWxkX2lkKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19ib29sX3dyaXRlKCk7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX3N0b3AoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoKTsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKHR5cGVfdG9fdTgoVFR5cGU6OlN0b3ApKQorICAgIH0KKworICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBtYXRjaCBzZWxmLnBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyLnRha2UoKSB7CisgICAgICAgICAgICBTb21lKHBlbmRpbmcpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgZmllbGRfaWQgPSBwZW5kaW5nLmlkLmV4cGVjdCgiYm9vbCBmaWVsZCBzaG91bGQgaGF2ZSBhIGZpZWxkIGlkIik7CisgICAgICAgICAgICAgICAgbGV0IGZpZWxkX3R5cGVfYXNfdTggPSBpZiBiIHsgMHgwMSB9IGVsc2UgeyAweDAyIH07CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9maWVsZF9oZWFkZXIoZmllbGRfdHlwZV9hc191OCwgZmllbGRfaWQpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAgICBpZiBiIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKDB4MDEpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKDB4MDIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfYnl0ZXMoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfdmFyaW50KGIubGVuKCkgYXMgdTMyKT87CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2FsbChiKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGkgYXMgdTgpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLndyaXRlX3ZhcmludChpKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98ICgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC53cml0ZV92YXJpbnQoaSkKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCAoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAud3JpdGVfdmFyaW50KGkpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgLm1hcCh8X3wgKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9mNjQ6OjxCaWdFbmRpYW4+KGQpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGVzKHMuYXNfYnl0ZXMoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRMaXN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9saXN0X3NldF9iZWdpbihpZGVudGlmaWVyLmVsZW1lbnRfdHlwZSwgaWRlbnRpZmllci5zaXplKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2xpc3Rfc2V0X2JlZ2luKGlkZW50aWZpZXIuZWxlbWVudF90eXBlLCBpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgaWRlbnRpZmllci5zaXplID09IDAgeworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKDApCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV92YXJpbnQoaWRlbnRpZmllci5zaXplIGFzIHUzMik/OworCisgICAgICAgICAgICBsZXQga2V5X3R5cGUgPSBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgLmtleV90eXBlCisgICAgICAgICAgICAgICAgLmV4cGVjdCgibWFwIGlkZW50aWZpZXIgdG8gd3JpdGUgc2hvdWxkIGNvbnRhaW4ga2V5IHR5cGUiKTsKKyAgICAgICAgICAgIGxldCBrZXlfdHlwZV9ieXRlID0gY29sbGVjdGlvbl90eXBlX3RvX3U4KGtleV90eXBlKSA8PCA0OworCisgICAgICAgICAgICBsZXQgdmFsX3R5cGUgPSBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgLnZhbHVlX3R5cGUKKyAgICAgICAgICAgICAgICAuZXhwZWN0KCJtYXAgaWRlbnRpZmllciB0byB3cml0ZSBzaG91bGQgY29udGFpbiB2YWx1ZSB0eXBlIik7CisgICAgICAgICAgICBsZXQgdmFsX3R5cGVfYnl0ZSA9IGNvbGxlY3Rpb25fdHlwZV90b191OCh2YWxfdHlwZSk7CisKKyAgICAgICAgICAgIGxldCBtYXBfdHlwZV9oZWFkZXIgPSBrZXlfdHlwZV9ieXRlIHwgdmFsX3R5cGVfYnl0ZTsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShtYXBfdHlwZV9oZWFkZXIpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5mbHVzaCgpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGUoJltiXSkubWFwX2VycihGcm9tOjpmcm9tKS5tYXAofF98ICgpKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVENvbXBhY3RPdXRwdXRQcm90b2NvbGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKK2ltcGwgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnlgLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgZm9yIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcodHJhbnNwb3J0KSkKKyAgICB9Cit9CisKK2ZuIGNvbGxlY3Rpb25fdHlwZV90b191OChmaWVsZF90eXBlOiBUVHlwZSkgLT4gdTggeworICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICBUVHlwZTo6Qm9vbCA9PiAweDAxLAorICAgICAgICBmID0+IHR5cGVfdG9fdTgoZiksCisgICAgfQorfQorCitmbiB0eXBlX3RvX3U4KGZpZWxkX3R5cGU6IFRUeXBlKSAtPiB1OCB7CisgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgIFRUeXBlOjpTdG9wID0+IDB4MDAsCisgICAgICAgIFRUeXBlOjpJMDggPT4gMHgwMywgLy8gZXF1aXZhbGVudCB0byBUVHlwZTo6Qnl0ZQorICAgICAgICBUVHlwZTo6STE2ID0+IDB4MDQsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gMHgwNSwKKyAgICAgICAgVFR5cGU6Okk2NCA9PiAweDA2LAorICAgICAgICBUVHlwZTo6RG91YmxlID0+IDB4MDcsCisgICAgICAgIFRUeXBlOjpTdHJpbmcgPT4gMHgwOCwKKyAgICAgICAgVFR5cGU6Okxpc3QgPT4gMHgwOSwKKyAgICAgICAgVFR5cGU6OlNldCA9PiAweDBBLAorICAgICAgICBUVHlwZTo6TWFwID0+IDB4MEIsCisgICAgICAgIFRUeXBlOjpTdHJ1Y3QgPT4gMHgwQywKKyAgICAgICAgXyA9PiBwYW5pYyEoZm9ybWF0ISgKKyAgICAgICAgICAgICJzaG91bGQgbm90IGhhdmUgYXR0ZW1wdGVkIHRvIGNvbnZlcnQge30gdG8gdTgiLAorICAgICAgICAgICAgZmllbGRfdHlwZQorICAgICAgICApKSwKKyAgICB9Cit9CisKK2ZuIGNvbGxlY3Rpb25fdThfdG9fdHlwZShiOiB1OCkgLT4gOjpSZXN1bHQ8VFR5cGU+IHsKKyAgICBtYXRjaCBiIHsKKyAgICAgICAgMHgwMSA9PiBPayhUVHlwZTo6Qm9vbCksCisgICAgICAgIG8gPT4gdThfdG9fdHlwZShvKSwKKyAgICB9Cit9CisKK2ZuIHU4X3RvX3R5cGUoYjogdTgpIC0+IDo6UmVzdWx0PFRUeXBlPiB7CisgICAgbWF0Y2ggYiB7CisgICAgICAgIDB4MDAgPT4gT2soVFR5cGU6OlN0b3ApLAorICAgICAgICAweDAzID0+IE9rKFRUeXBlOjpJMDgpLCAvLyBlcXVpdmFsZW50IHRvIFRUeXBlOjpCeXRlCisgICAgICAgIDB4MDQgPT4gT2soVFR5cGU6OkkxNiksCisgICAgICAgIDB4MDUgPT4gT2soVFR5cGU6OkkzMiksCisgICAgICAgIDB4MDYgPT4gT2soVFR5cGU6Okk2NCksCisgICAgICAgIDB4MDcgPT4gT2soVFR5cGU6OkRvdWJsZSksCisgICAgICAgIDB4MDggPT4gT2soVFR5cGU6OlN0cmluZyksCisgICAgICAgIDB4MDkgPT4gT2soVFR5cGU6Okxpc3QpLAorICAgICAgICAweDBBID0+IE9rKFRUeXBlOjpTZXQpLAorICAgICAgICAweDBCID0+IE9rKFRUeXBlOjpNYXApLAorICAgICAgICAweDBDID0+IE9rKFRUeXBlOjpTdHJ1Y3QpLAorICAgICAgICB1bmtuID0+IEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSBpbnRvIFRUeXBlIiwgdW5rbiksCisgICAgICAgIH0pKSwKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBwcm90b2NvbDo6eworICAgICAgICBURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgICAgICBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbCwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZSwKKyAgICB9OworICAgIHVzZSB0cmFuc3BvcnQ6OntSZWFkSGFsZiwgVEJ1ZmZlckNoYW5uZWwsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2JlZ2luXzAoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJlRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgImZvbyIsCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkNhbGwsCisgICAgICAgICAgICA0MzEKKyAgICAgICAgKSkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA4XSA9IFsKKyAgICAgICAgICAgIDB4ODIsIC8qIHByb3RvY29sIElEICovCisgICAgICAgICAgICAweDIxLCAvKiBtZXNzYWdlIHR5cGUgfCBwcm90b2NvbCB2ZXJzaW9uICovCisgICAgICAgICAgICAweERFLAorICAgICAgICAgICAgMHgwNiwgLyogemlnLXphZyB2YXJpbnQgc2VxdWVuY2UgbnVtYmVyICovCisgICAgICAgICAgICAweDAzLCAvKiBtZXNzYWdlLW5hbWUgbGVuZ3RoICovCisgICAgICAgICAgICAweDY2LAorICAgICAgICAgICAgMHg2RiwKKyAgICAgICAgICAgIDB4NkYgLyogImZvbyIgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfYmVnaW5fMSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICAiYmFyIiwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UmVwbHksCisgICAgICAgICAgICA5OTE4MjgKKyAgICAgICAgKSkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA5XSA9IFsKKyAgICAgICAgICAgIDB4ODIsIC8qIHByb3RvY29sIElEICovCisgICAgICAgICAgICAweDQxLCAvKiBtZXNzYWdlIHR5cGUgfCBwcm90b2NvbCB2ZXJzaW9uICovCisgICAgICAgICAgICAweEE4LAorICAgICAgICAgICAgMHg4OSwKKyAgICAgICAgICAgIDB4NzksIC8qIHppZy16YWcgdmFyaW50IHNlcXVlbmNlIG51bWJlciAqLworICAgICAgICAgICAgMHgwMywgLyogbWVzc2FnZS1uYW1lIGxlbmd0aCAqLworICAgICAgICAgICAgMHg2MiwKKyAgICAgICAgICAgIDB4NjEsCisgICAgICAgICAgICAweDcyIC8qICJiYXIiICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX21lc3NhZ2VfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygic2VydmljZV9jYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxMjgzOTQ4KTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tZXNzYWdlX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9tZXNzYWdlX2VuZCgpKTsKKyAgICB9CisKKyAgICAvLyBOT1RFOiBzdHJ1Y3RzIGFuZCBmaWVsZHMgYXJlIHRlc3RlZCB0b2dldGhlcgorICAgIC8vCisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3Rfd2l0aF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIHRpbnkgZmllbGQgaWRzCisgICAgICAgIC8vIHNpbmNlIHRoZXkncmUgc21hbGwgdGhlIGZpZWxkIGlkcyB3aWxsIGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgKGFuZCBpdCdzIHplcm8pIGl0IGdldHMgdGhlIGZ1bGwgdmFyaW50IHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMTYsIDQpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6TGlzdCwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDVdID0gWworICAgICAgICAgICAgMHgwMywgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwgLyogZmlyc3QgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4NDQsIC8qIGZpZWxkIGRlbHRhICg0KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4NTksIC8qIGZpZWxkIGRlbHRhICg1KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJ1Y3Rfd2l0aF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIHRpbnkgZmllbGQgaWRzCisgICAgICAgIC8vIHNpbmNlIHRoZXkncmUgc21hbGwgdGhlIGZpZWxkIGlkcyB3aWxsIGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgKGFuZCBpdCdzIHplcm8pIGl0IGdldHMgdGhlIGZ1bGwgdmFyaW50IHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAwKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STE2LCA0KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6TGlzdCwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3Rfd2l0aF9ub25femVyb19pbml0aWFsX2ZpZWxkX2FuZF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIHRpbnkgZmllbGQgaWRzCisgICAgICAgIC8vIHNpbmNlIHRoZXkncmUgc21hbGwgdGhlIGZpZWxkIGlkcyB3aWxsIGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCA2KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNF0gPSBbCisgICAgICAgICAgICAweDE1LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDFBLCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDQ4LCAvKiBmaWVsZCBkZWx0YSAoNCkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc3RydWN0X3dpdGhfbm9uX3plcm9faW5pdGlhbF9maWVsZF9hbmRfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCB0aW55IGZpZWxkIGlkcworICAgICAgICAvLyBzaW5jZSB0aGV5J3JlIHNtYWxsIHRoZSBmaWVsZCBpZHMgd2lsbCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgNik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3Rfd2l0aF9sb25nX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgKGFuZCBpdCdzIHplcm8pIGl0IGdldHMgdGhlIGZ1bGwgdmFyaW50IHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgMCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDE2KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgOTkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA4XSA9IFsKKyAgICAgICAgICAgIDB4MDUsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpcnN0IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDA2LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDIwLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwQSwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHhDNiwKKyAgICAgICAgICAgIDB4MDEsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc3RydWN0X3dpdGhfbG9uZ19maWVsZHMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIGZpZWxkIGlkcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIChhbmQgaXQncyB6ZXJvKSBpdCBnZXRzIHRoZSBmdWxsIHZhcmludCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgMCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMTYpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDk5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF93aXRoX21peF9vZl9sb25nX2FuZF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIGZpZWxkIGlkcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDEwMDApKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyMDAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIG9ubHkgMyB1cCBmcm9tIHRoZSBwcmV2aW91cyBpdCBpcyByZWNvcmRlZCBhcyBhIGRlbHRhCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMjAwNCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDEwXSA9IFsKKyAgICAgICAgICAgIDB4MTYsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4ODUsIC8qIGZpZWxkIGRlbHRhICg4KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MEEsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4RDAsCisgICAgICAgICAgICAweDBGLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwQSwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHhBMiwKKyAgICAgICAgICAgIDB4MUYsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDNBLCAvKiBmaWVsZCBkZWx0YSAoMykgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc3RydWN0X3dpdGhfbWl4X29mX2xvbmdfYW5kX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgbGV0IHN0cnVjdF9pZGVudCA9IFRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmc3RydWN0X2lkZW50KSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMTAwMCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMjAwMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBvbmx5IDMgdXAgZnJvbSB0aGUgcHJldmlvdXMgaXQgaXMgcmVjb3JkZWQgYXMgYSBkZWx0YQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMjAwNCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF81ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF81LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzUKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF82ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF82LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9uZXN0ZWRfc3RydWN0c18wKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGRlbHRhCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGRlbHRhCisKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgNykpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyNCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA3XSA9IFsKKyAgICAgICAgICAgIDB4MTYsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4ODUsIC8qIGZpZWxkIGRlbHRhICg4KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4NzMsIC8qIGZpZWxkIGRlbHRhICg3KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDcsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MzAsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDAwLCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmVkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgLSBjb250YWluaW5nICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25lc3RlZF9zdHJ1Y3RzXzAoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZGVsdGEKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZGVsdGEKKworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCA3KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjQpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5pbmcgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5lZCBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25lc3RlZF9zdHJ1Y3RzXzEoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZGVsdGEKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorCisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyNCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDI3KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDddID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg4NSwgLyogZmllbGQgZGVsdGEgKDgpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwNywgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgzMCwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MzMsIC8qIGZpZWxkIGRlbHRhICgzKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpZWxkIHN0b3AgLSBjb250YWluZWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5pbmcgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbmVzdGVkX3N0cnVjdHNfMSgpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBkZWx0YQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDI0KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAyNyk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmluZyBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmVkIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF83ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF83LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbmVzdGVkX3N0cnVjdHNfMigpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGRlbHRhIHdyaXRlCisKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgMjEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCA3KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMTApKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgN10gPSBbCisgICAgICAgICAgICAweDE2LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDA4LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDJBLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHg3NywgLyogZmllbGQgZGVsdGEoNykgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDMzLCAvKiBmaWVsZCBkZWx0YSAoMykgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwLCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmVkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgLSBjb250YWluaW5nICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25lc3RlZF9zdHJ1Y3RzXzIoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCAyMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgNyk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMTApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5pbmcgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5lZCBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25lc3RlZF9zdHJ1Y3RzXzMoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgMjEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDI3KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDhdID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwOCwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgyQSwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDcsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MkEsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDYzLCAvKiBmaWVsZCBkZWx0YSAoNikgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwLCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmVkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgLSBjb250YWluaW5nICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25lc3RlZF9zdHJ1Y3RzXzMoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDIxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMjcpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5pbmcgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5lZCBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2Jvb2xfZmllbGQoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIGZpZWxkIGlkcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTYgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDI2KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgNDUpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgN10gPSBbCisgICAgICAgICAgICAweDExLCAvKiBmaWVsZCBkZWx0YSAoMSkgfCB0cnVlICovCisgICAgICAgICAgICAweDgyLCAvKiBmaWVsZCBkZWx0YSAoOCkgfCBmYWxzZSAqLworICAgICAgICAgICAgMHgwMSwgLyogdHJ1ZSAqLworICAgICAgICAgICAgMHgzNCwgLyogZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDIsIC8qIGZhbHNlICovCisgICAgICAgICAgICAweDVBLCAvKiBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwMCAvKiBzdG9wIGZpZWxkICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2Jvb2xfZmllbGQoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGxldCBzdHJ1Y3RfaWRlbnQgPSBUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJnN0cnVjdF9pZGVudCkpOworCisgICAgICAgIC8vIHdyaXRlIHR3byBmaWVsZHMKKworICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE2IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAyNik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgNDUpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBsZXQgcmVhZF92YWx1ZV8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF92YWx1ZV8xLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgbGV0IHJlYWRfdmFsdWVfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfdmFsdWVfMiwgZmFsc2UpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBsZXQgcmVhZF92YWx1ZV8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF92YWx1ZV8zLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgbGV0IHJlYWRfdmFsdWVfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfdmFsdWVfNCwgZmFsc2UpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzUgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzUsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAjW3Nob3VsZF9wYW5pY10KKyAgICBmbiBtdXN0X2ZhaWxfaWZfd3JpdGVfZmllbGRfZW5kX3dpdGhvdXRfd3JpdGluZ19ib29sX3ZhbHVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkudW53cmFwKCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgICNbc2hvdWxkX3BhbmljXQorICAgIGZuIG11c3RfZmFpbF9pZl93cml0ZV9zdG9wX2ZpZWxkX3dpdGhvdXRfd3JpdGluZ19ib29sX3ZhbHVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpLnVud3JhcCgpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAjW3Nob3VsZF9wYW5pY10KKyAgICBmbiBtdXN0X2ZhaWxfaWZfd3JpdGVfc3RydWN0X2VuZF93aXRob3V0X3dyaXRpbmdfYm9vbF92YWx1ZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMSkpKTsKKyAgICAgICAgb19wcm90LndyaXRlX3N0cnVjdF9lbmQoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgI1tzaG91bGRfcGFuaWNdCisgICAgZm4gbXVzdF9mYWlsX2lmX3dyaXRlX3N0cnVjdF9lbmRfd2l0aG91dF9hbnlfZmllbGRzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkudW53cmFwKCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfZmllbGRfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfZmllbGRfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NtYWxsX3NpemVkX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2xpc3RfYmVnaW4oJlRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJNjQsIDQpKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4NDYgLyogc2l6ZSB8IGVsZW1fdHlwZSAqL107CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc21hbGxfc2l6ZWRfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJMDgsIDEwKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2xpc3RfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9saXN0X2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGFyZ2Vfc2l6ZWRfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCByZXMgPSBvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okxpc3QsIDk5OTkpKTsKKyAgICAgICAgYXNzZXJ0IShyZXMuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDNdID0gWworICAgICAgICAgICAgMHhGOSwgLyogMHhGMCB8IGVsZW1fdHlwZSAqLworICAgICAgICAgICAgMHg4RiwgMHg0RSwgLyogc2l6ZSBhcyB2YXJpbnQgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9sYXJnZV9zaXplZF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6OlNldCwgNDczODEpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2xpc3RfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9saXN0X2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX2xpc3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NtYWxsX3NpemVkX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpTdHJ1Y3QsIDIpKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4MkMgLyogc2l6ZSB8IGVsZW1fdHlwZSAqL107CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc21hbGxfc2l6ZWRfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STE2LCA3KTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3NldF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3NldF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xhcmdlX3NpemVkX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpEb3VibGUsIDIzODkxKSkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA0XSA9IFsKKyAgICAgICAgICAgIDB4RjcsIC8qIDB4RjAgfCBlbGVtX3R5cGUgKi8KKyAgICAgICAgICAgIDB4RDMsIDB4QkEsIDB4MDEsIC8qIHNpemUgYXMgdmFyaW50ICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbGFyZ2Vfc2l6ZWRfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TWFwLCAzOTI4NDI5KTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3NldF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3NldF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NldF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9zZXRfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3plcm9fc2l6ZWRfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6OlN0cmluZywgVFR5cGU6OkkzMiwgMCkpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgwMF07IC8vIHNpbmNlIHNpemUgaXMgemVybyB3ZSBkb24ndCB3cml0ZSBhbnl0aGluZworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX3plcm9fc2l6ZWRfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkRvdWJsZSwgVFR5cGU6OkkzMiwgMCkpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21hcF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgICZyZXMsCisgICAgICAgICAgICAmVE1hcElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIGtleV90eXBlOiBOb25lLAorICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU6IE5vbmUsCisgICAgICAgICAgICAgICAgc2l6ZTogMCwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgIFRUeXBlOjpEb3VibGUsCisgICAgICAgICAgICBUVHlwZTo6U3RyaW5nLAorICAgICAgICAgICAgMjM4CisgICAgICAgICkpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgM10gPSBbCisgICAgICAgICAgICAweEVFLCAweDAxLCAvKiBzaXplIGFzIHZhcmludCAqLworICAgICAgICAgICAgMHg3OCwgLyoga2V5IHR5cGUgfCB2YWwgdHlwZSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6Ok1hcCwgVFR5cGU6Okxpc3QsIDE5MjgzNDkpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWFwX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX21hcF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWFwX3dpdGhfYm9vbF9rZXlfYW5kX3ZhbHVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkJvb2wsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfZW5kKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA0XSA9IFsKKyAgICAgICAgICAgIDB4MDEsIC8qIHNpemUgYXMgdmFyaW50ICovCisgICAgICAgICAgICAweDExLCAvKiBrZXkgdHlwZSB8IHZhbCB0eXBlICovCisgICAgICAgICAgICAweDAxLCAvKiBrZXk6IHRydWUgKi8KKyAgICAgICAgICAgIDB4MDIsIC8qIHZhbDogZmFsc2UgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9tYXBfd2l0aF9ib29sX3ZhbHVlKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IG1hcF9pZGVudCA9IFRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkJvb2wsIFRUeXBlOjpCb29sLCAyKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJm1hcF9pZGVudCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyBtYXAgaGVhZGVyCisgICAgICAgIGxldCByY3ZkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21hcF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmN2ZF9pZGVudCwgJm1hcF9pZGVudCk7CisgICAgICAgIC8vIGtleSAxCisgICAgICAgIGxldCBiID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEoYiwgdHJ1ZSk7CisgICAgICAgIC8vIHZhbCAxCisgICAgICAgIGxldCBiID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEoYiwgZmFsc2UpOworICAgICAgICAvLyBrZXkgMgorICAgICAgICBsZXQgYiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKGIsIGZhbHNlKTsKKyAgICAgICAgLy8gdmFsIDIKKyAgICAgICAgbGV0IGIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShiLCB0cnVlKTsKKyAgICAgICAgLy8gbWFwIGVuZAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX21hcF9lbmQoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgXykgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgYXNzZXJ0IShpX3Byb3QucmVhZF9tYXBfZW5kKCkuaXNfb2soKSk7IC8vIHdpbGwgYmxvdyB1cCBpZiB3ZSB0cnkgdG8gcmVhZCBmcm9tIGVtcHR5IGJ1ZmZlcgorICAgIH0KKworICAgIGZuIHRlc3Rfb2JqZWN0cygpIC0+ICgKKyAgICAgICAgVENvbXBhY3RJbnB1dFByb3RvY29sPFJlYWRIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg4MCwgODApOworCisgICAgICAgIGxldCAocl9tZW0sIHdfbWVtKSA9IG1lbS5zcGxpdCgpLnVud3JhcCgpOworCisgICAgICAgIGxldCBpX3Byb3QgPSBUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhyX21lbSk7CisgICAgICAgIGxldCBvX3Byb3QgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcod19tZW0pOworCisgICAgICAgIChpX3Byb3QsIG9fcHJvdCkKKyAgICB9CisKKyAgICBmbiBhc3NlcnRfbm9fd3JpdGU8Rj4obXV0IHdyaXRlX2ZuOiBGKQorICAgIHdoZXJlCisgICAgICAgIEY6IEZuTXV0KCZtdXQgVENvbXBhY3RPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PikgLT4gOjpSZXN1bHQ8KCk+LAorICAgIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBhc3NlcnQhKHdyaXRlX2ZuKCZtdXQgb19wcm90KS5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShvX3Byb3QudHJhbnNwb3J0LndyaXRlX2J5dGVzKCkubGVuKCksIDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvbW9kLnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9tb2QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjMDI4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvbW9kLnJzCkBAIC0wLDAgKzEsOTY5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vISBUeXBlcyB1c2VkIHRvIHNlbmQgYW5kIHJlY2VpdmUgcHJpbWl0aXZlcyBiZXR3ZWVuIGEgVGhyaWZ0IGNsaWVudCBhbmQgc2VydmVyLgorLy8hCisvLyEgIyBFeGFtcGxlcworLy8hCisvLyEgQ3JlYXRlIGFuZCB1c2UgYSBgVElucHV0UHJvdG9jb2xgLgorLy8hCisvLyEgYGBgbm9fcnVuCisvLyEgdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2x9OworLy8hIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLyEKKy8vISAvLyBjcmVhdGUgdGhlIEkvTyBjaGFubmVsCisvLyEgbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8hIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vIQorLy8hIC8vIGNyZWF0ZSB0aGUgcHJvdG9jb2wgdG8gZGVjb2RlIGJ5dGVzIGludG8gdHlwZXMKKy8vISBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vIQorLy8hIC8vIHJlYWQgdHlwZXMgZnJvbSB0aGUgd2lyZQorLy8hIGxldCBmaWVsZF9pZGVudGlmaWVyID0gcHJvdG9jb2wucmVhZF9maWVsZF9iZWdpbigpLnVud3JhcCgpOworLy8hIGxldCBmaWVsZF9jb250ZW50cyA9IHByb3RvY29sLnJlYWRfc3RyaW5nKCkudW53cmFwKCk7CisvLyEgbGV0IGZpZWxkX2VuZCA9IHByb3RvY29sLnJlYWRfZmllbGRfZW5kKCkudW53cmFwKCk7CisvLyEgYGBgCisvLyEKKy8vISBDcmVhdGUgYW5kIHVzZSBhIGBUT3V0cHV0UHJvdG9jb2xgLgorLy8hCisvLyEgYGBgbm9fcnVuCisvLyEgdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRGaWVsZElkZW50aWZpZXIsIFRPdXRwdXRQcm90b2NvbCwgVFR5cGV9OworLy8hIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLyEKKy8vISAvLyBjcmVhdGUgdGhlIEkvTyBjaGFubmVsCisvLyEgbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8hIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vIQorLy8hIC8vIGNyZWF0ZSB0aGUgcHJvdG9jb2wgdG8gZW5jb2RlIHR5cGVzIGludG8gYnl0ZXMKKy8vISBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLyEKKy8vISAvLyB3cml0ZSB0eXBlcworLy8hIHByb3RvY29sLndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoInN0cmluZ190aGluZyIsIFRUeXBlOjpTdHJpbmcsIDEpKS51bndyYXAoKTsKKy8vISBwcm90b2NvbC53cml0ZV9zdHJpbmcoImZvbyIpLnVud3JhcCgpOworLy8hIHByb3RvY29sLndyaXRlX2ZpZWxkX2VuZCgpLnVud3JhcCgpOworLy8hIGBgYAorCit1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOwordXNlIHN0ZDo6Zm10OwordXNlIHN0ZDo6Zm10Ojp7RGlzcGxheSwgRm9ybWF0dGVyfTsKK3VzZSB0cnlfZnJvbTo6VHJ5RnJvbTsKKwordXNlIHRyYW5zcG9ydDo6e1RSZWFkVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnR9OwordXNlIHtQcm90b2NvbEVycm9yLCBQcm90b2NvbEVycm9yS2luZH07CisKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIHsKKyAgICAoJG9fcHJvdDppZGVudCwgJGV4cGVjdGVkX2J5dGVzOmlkZW50KSA9PiB7eworICAgICAgICBhc3NlcnRfZXEhKCRvX3Byb3QudHJhbnNwb3J0LndyaXRlX2J5dGVzKCksICYkZXhwZWN0ZWRfYnl0ZXMpOworICAgIH19OworfQorCisvLyBGSVhNRTogc2hvdWxkIHRha2UgYm90aCByZWFkIGFuZCB3cml0ZQorI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIgeworICAgICgkb19wcm90OmlkZW50KSA9PiB7eworICAgICAgICAkb19wcm90LnRyYW5zcG9ydC5jb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigpOworICAgIH19OworfQorCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBzZXRfcmVhZGFibGVfYnl0ZXMgeworICAgICgkaV9wcm90OmlkZW50LCAkYnl0ZXM6ZXhwcikgPT4geworICAgICAgICAkaV9wcm90LnRyYW5zcG9ydC5zZXRfcmVhZGFibGVfYnl0ZXMoJGJ5dGVzKTsKKyAgICB9OworfQorCittb2QgYmluYXJ5OworbW9kIGNvbXBhY3Q7Cittb2QgbXVsdGlwbGV4ZWQ7Cittb2Qgc3RvcmVkOworCitwdWIgdXNlIHNlbGY6OmJpbmFyeTo6eworICAgIFRCaW5hcnlJbnB1dFByb3RvY29sLCBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnksIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwKKyAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorfTsKK3B1YiB1c2Ugc2VsZjo6Y29tcGFjdDo6eworICAgIFRDb21wYWN0SW5wdXRQcm90b2NvbCwgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSwgVENvbXBhY3RPdXRwdXRQcm90b2NvbCwKKyAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSwKK307CitwdWIgdXNlIHNlbGY6Om11bHRpcGxleGVkOjpUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDsKK3B1YiB1c2Ugc2VsZjo6c3RvcmVkOjpUU3RvcmVkSW5wdXRQcm90b2NvbDsKKworLy8gRGVmYXVsdCBtYXhpbXVtIGRlcHRoIHRvIHdoaWNoIGBUSW5wdXRQcm90b2NvbDo6c2tpcGAgd2lsbCBza2lwIGEgVGhyaWZ0CisvLyBmaWVsZC4gQSBkZWZhdWx0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIFRocmlmdCBzdHJ1Y3RzIG9yIGNvbGxlY3Rpb25zIG1heQorLy8gY29udGFpbiBuZXN0ZWQgc3RydWN0cyBhbmQgY29sbGVjdGlvbnMsIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiBpbmRlZmluaXRlCisvLyByZWN1cnNpb24uCitjb25zdCBNQVhJTVVNX1NLSVBfREVQVEg6IGk4ID0gNjQ7CisKKy8vLyBDb252ZXJ0cyBhIHN0cmVhbSBvZiBieXRlcyBpbnRvIFRocmlmdCBpZGVudGlmaWVycywgcHJpbWl0aXZlcywKKy8vLyBjb250YWluZXJzLCBvciBzdHJ1Y3RzLgorLy8vCisvLy8gVGhpcyB0cmFpdCBkb2VzIG5vdCBkZWFsIHdpdGggaGlnaGVyLWxldmVsIFRocmlmdCBjb25jZXB0cyBsaWtlIHN0cnVjdHMgb3IKKy8vLyBleGNlcHRpb25zIC0gb25seSB3aXRoIHByaW1pdGl2ZXMgYW5kIG1lc3NhZ2Ugb3IgY29udGFpbmVyIGJvdW5kYXJpZXMuIE9uY2UKKy8vLyBieXRlcyBhcmUgcmVhZCB0aGV5IGFyZSBkZXNlcmlhbGl6ZWQgYW5kIGFuIGlkZW50aWZpZXIgKGZvciBleGFtcGxlCisvLy8gYFRNZXNzYWdlSWRlbnRpZmllcmApIG9yIGEgcHJpbWl0aXZlIGlzIHJldHVybmVkLgorLy8vCisvLy8gQWxsIG1ldGhvZHMgcmV0dXJuIGEgYHRocmlmdDo6UmVzdWx0YC4gSWYgYW4gYEVycmAgaXMgcmV0dXJuZWQgdGhlIHByb3RvY29sCisvLy8gaW5zdGFuY2UgYW5kIGl0cyB1bmRlcmx5aW5nIHRyYW5zcG9ydCBzaG91bGQgYmUgdGVybWluYXRlZC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRJbnB1dFByb3RvY29sYAorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLy8KKy8vLyBsZXQgZmllbGRfaWRlbnRpZmllciA9IHByb3RvY29sLnJlYWRfZmllbGRfYmVnaW4oKS51bndyYXAoKTsKKy8vLyBsZXQgZmllbGRfY29udGVudHMgPSBwcm90b2NvbC5yZWFkX3N0cmluZygpLnVud3JhcCgpOworLy8vIGxldCBmaWVsZF9lbmQgPSBwcm90b2NvbC5yZWFkX2ZpZWxkX2VuZCgpLnVud3JhcCgpOworLy8vIGBgYAorcHViIHRyYWl0IFRJbnB1dFByb3RvY29sIHsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IG1lc3NhZ2UuCisgICAgZm4gcmVhZF9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1lc3NhZ2VJZGVudGlmaWVyPjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgVGhyaWZ0IG1lc3NhZ2UuCisgICAgZm4gcmVhZF9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IHN0cnVjdC4KKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBUaHJpZnQgc3RydWN0LgorICAgIGZuIHJlYWRfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IHN0cnVjdCBmaWVsZC4KKyAgICBmbiByZWFkX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VEZpZWxkSWRlbnRpZmllcj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIFRocmlmdCBzdHJ1Y3QgZmllbGQuCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFJlYWQgYSBib29sLgorICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+OworICAgIC8vLyBSZWFkIGEgZml4ZWQtbGVuZ3RoIGJ5dGUgYXJyYXkuCisgICAgZm4gcmVhZF9ieXRlcygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFZlYzx1OD4+OworICAgIC8vLyBSZWFkIGEgd29yZC4KKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+OworICAgIC8vLyBSZWFkIGEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHJlYWRfaTE2KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTE2PjsKKyAgICAvLy8gUmVhZCBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiByZWFkX2kzMigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkzMj47CisgICAgLy8vIFJlYWQgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gcmVhZF9pNjQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpNjQ+OworICAgIC8vLyBSZWFkIGEgNjQtYml0IGZsb2F0LgorICAgIGZuIHJlYWRfZG91YmxlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8ZjY0PjsKKyAgICAvLy8gUmVhZCBhIGZpeGVkLWxlbmd0aCBzdHJpbmcgKG5vdCBudWxsIHRlcm1pbmF0ZWQpLgorICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdC4KKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBsaXN0LgorICAgIGZuIHJlYWRfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIHNldC4KKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgc2V0LgorICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLgorICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBtYXAuCisgICAgZm4gcmVhZF9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBTa2lwIGEgZmllbGQgd2l0aCB0eXBlIGBmaWVsZF90eXBlYCByZWN1cnNpdmVseSB1bnRpbCB0aGUgZGVmYXVsdAorICAgIC8vLyBtYXhpbXVtIHNraXAgZGVwdGggaXMgcmVhY2hlZC4KKyAgICBmbiBza2lwKCZtdXQgc2VsZiwgZmllbGRfdHlwZTogVFR5cGUpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKGZpZWxkX3R5cGUsIE1BWElNVU1fU0tJUF9ERVBUSCkKKyAgICB9CisgICAgLy8vIFNraXAgYSBmaWVsZCB3aXRoIHR5cGUgYGZpZWxkX3R5cGVgIHJlY3Vyc2l2ZWx5IHVwIHRvIGBkZXB0aGAgbGV2ZWxzLgorICAgIGZuIHNraXBfdGlsbF9kZXB0aCgmbXV0IHNlbGYsIGZpZWxkX3R5cGU6IFRUeXBlLCBkZXB0aDogaTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIGRlcHRoID09IDAgeworICAgICAgICAgICAgcmV0dXJuIEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6RGVwdGhMaW1pdCwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgcGFyc2UgcGFzdCB7Oj99IiwgZmllbGRfdHlwZSksCisgICAgICAgICAgICB9KSk7CisgICAgICAgIH0KKworICAgICAgICBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgICAgIFRUeXBlOjpCb29sID0+IHNlbGYucmVhZF9ib29sKCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6STA4ID0+IHNlbGYucmVhZF9pOCgpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OkkxNiA9PiBzZWxmLnJlYWRfaTE2KCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6STMyID0+IHNlbGYucmVhZF9pMzIoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpJNjQgPT4gc2VsZi5yZWFkX2k2NCgpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OkRvdWJsZSA9PiBzZWxmLnJlYWRfZG91YmxlKCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6U3RyaW5nID0+IHNlbGYucmVhZF9zdHJpbmcoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJ1Y3QgPT4geworICAgICAgICAgICAgICAgIHNlbGYucmVhZF9zdHJ1Y3RfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgbG9vcCB7CisgICAgICAgICAgICAgICAgICAgIGxldCBmaWVsZF9pZGVudCA9IHNlbGYucmVhZF9maWVsZF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICAgICAgaWYgZmllbGRfaWRlbnQuZmllbGRfdHlwZSA9PSBUVHlwZTo6U3RvcCB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aChmaWVsZF9pZGVudC5maWVsZF90eXBlLCBkZXB0aCAtIDEpPzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX3N0cnVjdF9lbmQoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVFR5cGU6Okxpc3QgPT4geworICAgICAgICAgICAgICAgIGxldCBsaXN0X2lkZW50ID0gc2VsZi5yZWFkX2xpc3RfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgZm9yIF8gaW4gMC4ubGlzdF9pZGVudC5zaXplIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgobGlzdF9pZGVudC5lbGVtZW50X3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfbGlzdF9lbmQoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVFR5cGU6OlNldCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHNldF9pZGVudCA9IHNlbGYucmVhZF9zZXRfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgZm9yIF8gaW4gMC4uc2V0X2lkZW50LnNpemUgeworICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aChzZXRfaWRlbnQuZWxlbWVudF90eXBlLCBkZXB0aCAtIDEpPzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX3NldF9lbmQoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVFR5cGU6Ok1hcCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG1hcF9pZGVudCA9IHNlbGYucmVhZF9tYXBfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgZm9yIF8gaW4gMC4ubWFwX2lkZW50LnNpemUgeworICAgICAgICAgICAgICAgICAgICBsZXQga2V5X3R5cGUgPSBtYXBfaWRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5rZXlfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgLmV4cGVjdCgibm9uLXplcm8gc2l6ZWQgbWFwIHNob3VsZCBjb250YWluIGtleSB0eXBlIik7CisgICAgICAgICAgICAgICAgICAgIGxldCB2YWxfdHlwZSA9IG1hcF9pZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5leHBlY3QoIm5vbi16ZXJvIHNpemVkIG1hcCBzaG91bGQgY29udGFpbiB2YWx1ZSB0eXBlIik7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKGtleV90eXBlLCBkZXB0aCAtIDEpPzsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgodmFsX3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfbWFwX2VuZCgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICB1ID0+IEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3Qgc2tpcCBmaWVsZCB0eXBlIHs6P30iLCAmdSksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1dGlsaXR5IChETyBOT1QgVVNFIElOIEdFTkVSQVRFRCBDT0RFISEhISkKKyAgICAvLworCisgICAgLy8vIFJlYWQgYW4gdW5zaWduZWQgYnl0ZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkICoqbmV2ZXIqKiBiZSB1c2VkIGluIGdlbmVyYXRlZCBjb2RlLgorICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PjsKK30KKworLy8vIENvbnZlcnRzIFRocmlmdCBpZGVudGlmaWVycywgcHJpbWl0aXZlcywgY29udGFpbmVycyBvciBzdHJ1Y3RzIGludG8gYQorLy8vIHN0cmVhbSBvZiBieXRlcy4KKy8vLworLy8vIFRoaXMgdHJhaXQgZG9lcyBub3QgZGVhbCB3aXRoIGhpZ2hlci1sZXZlbCBUaHJpZnQgY29uY2VwdHMgbGlrZSBzdHJ1Y3RzIG9yCisvLy8gZXhjZXB0aW9ucyAtIG9ubHkgd2l0aCBwcmltaXRpdmVzIGFuZCBtZXNzYWdlIG9yIGNvbnRhaW5lciBib3VuZGFyaWVzLgorLy8vIFdyaXRlIG1ldGhvZHMgdGFrZSBhbiBpZGVudGlmaWVyIChmb3IgZXhhbXBsZSwgYFRNZXNzYWdlSWRlbnRpZmllcmApIG9yIGEKKy8vLyBwcmltaXRpdmUuIEFueSBvciBhbGwgb2YgdGhlIGZpZWxkcyBpbiBhbiBpZGVudGlmaWVyIG1heSBiZSBvbWl0dGVkIHdoZW4KKy8vLyB3cml0aW5nIHRvIHRoZSB0cmFuc3BvcnQuIFdyaXRlIG1ldGhvZHMgbWF5IGV2ZW4gYmUgbm9vcHMuIEFsbCBvZiB0aGlzIGlzCisvLy8gdHJhbnNwYXJlbnQgdG8gdGhlIGNhbGxlcjsgYXMgbG9uZyBhcyBhIG1hdGNoaW5nIGBUSW5wdXRQcm90b2NvbGAKKy8vLyBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkLCByZWNlaXZlZCBtZXNzYWdlcyB3aWxsIGJlIGRlY29kZWQgY29ycmVjdGx5LgorLy8vCisvLy8gQWxsIG1ldGhvZHMgcmV0dXJuIGEgYHRocmlmdDo6UmVzdWx0YC4gSWYgYW4gYEVycmAgaXMgcmV0dXJuZWQgdGhlIHByb3RvY29sCisvLy8gaW5zdGFuY2UgYW5kIGl0cyB1bmRlcmx5aW5nIHRyYW5zcG9ydCBzaG91bGQgYmUgdGVybWluYXRlZC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRPdXRwdXRQcm90b2NvbGAKKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sLCBURmllbGRJZGVudGlmaWVyLCBUT3V0cHV0UHJvdG9jb2wsIFRUeXBlfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLworLy8vIHByb3RvY29sLndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoInN0cmluZ190aGluZyIsIFRUeXBlOjpTdHJpbmcsIDEpKS51bndyYXAoKTsKKy8vLyBwcm90b2NvbC53cml0ZV9zdHJpbmcoImZvbyIpLnVud3JhcCgpOworLy8vIHByb3RvY29sLndyaXRlX2ZpZWxkX2VuZCgpLnVud3JhcCgpOworLy8vIGBgYAorcHViIHRyYWl0IFRPdXRwdXRQcm90b2NvbCB7CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgbWVzc2FnZS4KKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgVGhyaWZ0IG1lc3NhZ2UuCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgc3RydWN0LgorICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgVGhyaWZ0IHN0cnVjdC4KKyAgICBmbiB3cml0ZV9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IGZpZWxkLgorICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIFRocmlmdCBmaWVsZC4KKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgU1RPUCBmaWVsZCBpbmRpY2F0aW5nIHRoYXQgYWxsIHRoZSBmaWVsZHMgaW4gYSBzdHJ1Y3QgaGF2ZSBiZWVuCisgICAgLy8vIHdyaXR0ZW4uCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSBib29sLgorICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgZml4ZWQtbGVuZ3RoIGJ5dGUgYXJyYXkuCisgICAgZm4gd3JpdGVfYnl0ZXMoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhbiA4LWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiB3cml0ZV9pOCgmbXV0IHNlbGYsIGk6IGk4KSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHdyaXRlX2kxNigmbXV0IHNlbGYsIGk6IGkxNikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiB3cml0ZV9pMzIoJm11dCBzZWxmLCBpOiBpMzIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgNjQtYml0IGZsb2F0LgorICAgIGZuIHdyaXRlX2RvdWJsZSgmbXV0IHNlbGYsIGQ6IGY2NCkgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIGZpeGVkLWxlbmd0aCBzdHJpbmcuCisgICAgZm4gd3JpdGVfc3RyaW5nKCZtdXQgc2VsZiwgczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdC4KKyAgICBmbiB3cml0ZV9saXN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRMaXN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgbGlzdC4KKyAgICBmbiB3cml0ZV9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIHNldC4KKyAgICBmbiB3cml0ZV9zZXRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFNldElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIHNldC4KKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLgorICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgbWFwLgorICAgIGZuIHdyaXRlX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIEZsdXNoIGJ1ZmZlcmVkIGJ5dGVzIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKworICAgIC8vIHV0aWxpdHkgKERPIE5PVCBVU0UgSU4gR0VORVJBVEVEIENPREUhISEhKQorICAgIC8vCisKKyAgICAvLy8gV3JpdGUgYW4gdW5zaWduZWQgYnl0ZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkICoqbmV2ZXIqKiBiZSB1c2VkIGluIGdlbmVyYXRlZCBjb2RlLgorICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+OyAvLyBGSVhNRTogUkVNT1ZFCit9CisKK2ltcGw8UD4gVElucHV0UHJvdG9jb2wgZm9yIEJveDxQPgord2hlcmUKKyAgICBQOiBUSW5wdXRQcm90b2NvbCArID9TaXplZCwKK3sKKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9tZXNzYWdlX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9tZXNzYWdlX2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxPcHRpb248VFN0cnVjdElkZW50aWZpZXI+PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc3RydWN0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX3N0cnVjdF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfZmllbGRfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9maWVsZF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9ib29sKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICAoKipzZWxmKS5yZWFkX2J5dGVzKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9pOCgpCisgICAgfQorCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9pMTYoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfaTMyKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND4geworICAgICAgICAoKipzZWxmKS5yZWFkX2k2NCgpCisgICAgfQorCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9kb3VibGUoKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc3RyaW5nKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9saXN0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9saXN0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj4geworICAgICAgICAoKipzZWxmKS5yZWFkX3NldF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9zZXRfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbWFwX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX21hcF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfYnl0ZSgpCisgICAgfQorfQorCitpbXBsPFA+IFRPdXRwdXRQcm90b2NvbCBmb3IgQm94PFA+Cit3aGVyZQorICAgIFA6IFRPdXRwdXRQcm90b2NvbCArID9TaXplZCwKK3sKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbWVzc2FnZV9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbWVzc2FnZV9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc3RydWN0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX3N0cnVjdF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2ZpZWxkX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfZmllbGRfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9zdG9wKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfZmllbGRfc3RvcCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2Jvb2woYikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9ieXRlcyhiKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k4KCZtdXQgc2VsZiwgaTogaTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2k4KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9pMTYoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMzIoJm11dCBzZWxmLCBpOiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2kzMihpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k2NCgmbXV0IHNlbGYsIGk6IGk2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfaTY0KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9kb3VibGUoZCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9zdHJpbmcocykKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRMaXN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbGlzdF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbGlzdF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU2V0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc2V0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX3NldF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbWFwX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX21hcF9lbmQoKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikuZmx1c2goKQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfYnl0ZShiKQorICAgIH0KK30KKworLy8vIEhlbHBlciB0eXBlIHVzZWQgYnkgc2VydmVycyB0byBjcmVhdGUgYFRJbnB1dFByb3RvY29sYCBpbnN0YW5jZXMgZm9yCisvLy8gYWNjZXB0ZWQgY2xpZW50IGNvbm5lY3Rpb25zLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGEgYFRJbnB1dFByb3RvY29sRmFjdG9yeWAgYW5kIHVzZSBpdCB0byBjcmVhdGUgYSBgVElucHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnksIFRJbnB1dFByb3RvY29sRmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgZmFjdG9yeSA9IFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCk7CisvLy8gbGV0IHByb3RvY29sID0gZmFjdG9yeS5jcmVhdGUoQm94OjpuZXcoY2hhbm5lbCkpOworLy8vIGBgYAorcHViIHRyYWl0IFRJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8gQ3JlYXRlIGEgYFRJbnB1dFByb3RvY29sYCB0aGF0IHJlYWRzIGJ5dGVzIGZyb20gYHRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPjsKK30KKworaW1wbDxUPiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgZm9yIEJveDxUPgord2hlcmUKKyAgICBUOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyA/U2l6ZWQsCit7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgICgqKnNlbGYpLmNyZWF0ZSh0cmFuc3BvcnQpCisgICAgfQorfQorCisvLy8gSGVscGVyIHR5cGUgdXNlZCBieSBzZXJ2ZXJzIHRvIGNyZWF0ZSBgVE91dHB1dFByb3RvY29sYCBpbnN0YW5jZXMgZm9yCisvLy8gYWNjZXB0ZWQgY2xpZW50IGNvbm5lY3Rpb25zLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGEgYFRPdXRwdXRQcm90b2NvbEZhY3RvcnlgIGFuZCB1c2UgaXQgdG8gY3JlYXRlIGEgYFRPdXRwdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnksIFRPdXRwdXRQcm90b2NvbEZhY3Rvcnl9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IGZhY3RvcnkgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKTsKKy8vLyBsZXQgcHJvdG9jb2wgPSBmYWN0b3J5LmNyZWF0ZShCb3g6Om5ldyhjaGFubmVsKSk7CisvLy8gYGBgCitwdWIgdHJhaXQgVE91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUT3V0cHV0UHJvdG9jb2xgIHRoYXQgd3JpdGVzIGJ5dGVzIHRvIGB0cmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPjsKK30KKworaW1wbDxUPiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5IGZvciBCb3g8VD4KK3doZXJlCisgICAgVDogVE91dHB1dFByb3RvY29sRmFjdG9yeSArID9TaXplZCwKK3sKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICAoKipzZWxmKS5jcmVhdGUodHJhbnNwb3J0KQorICAgIH0KK30KKworLy8vIFRocmlmdCBtZXNzYWdlIGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgIC8vLyBTZXJ2aWNlIGNhbGwgdGhlIG1lc3NhZ2UgaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgIHB1YiBuYW1lOiBTdHJpbmcsCisgICAgLy8vIE1lc3NhZ2UgdHlwZS4KKyAgICBwdWIgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUsCisgICAgLy8vIE9yZGVyZWQgc2VxdWVuY2UgbnVtYmVyIGlkZW50aWZ5aW5nIHRoZSBtZXNzYWdlLgorICAgIHB1YiBzZXF1ZW5jZV9udW1iZXI6IGkzMiwKK30KKworaW1wbCBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVE1lc3NhZ2VJZGVudGlmaWVyYCBmb3IgYSBUaHJpZnQgc2VydmljZS1jYWxsIG5hbWVkIGBuYW1lYAorICAgIC8vLyB3aXRoIG1lc3NhZ2UgdHlwZSBgbWVzc2FnZV90eXBlYCBhbmQgc2VxdWVuY2UgbnVtYmVyIGBzZXF1ZW5jZV9udW1iZXJgLgorICAgIHB1YiBmbiBuZXc8UzogSW50bzxTdHJpbmc+PigKKyAgICAgICAgbmFtZTogUywKKyAgICAgICAgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUsCisgICAgICAgIHNlcXVlbmNlX251bWJlcjogaTMyLAorICAgICkgLT4gVE1lc3NhZ2VJZGVudGlmaWVyIHsKKyAgICAgICAgVE1lc3NhZ2VJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6IG5hbWUuaW50bygpLAorICAgICAgICAgICAgbWVzc2FnZV90eXBlOiBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICBzZXF1ZW5jZV9udW1iZXI6IHNlcXVlbmNlX251bWJlciwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBzdHJ1Y3QgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRTdHJ1Y3RJZGVudGlmaWVyIHsKKyAgICAvLy8gTmFtZSBvZiB0aGUgZW5jb2RlZCBUaHJpZnQgc3RydWN0LgorICAgIHB1YiBuYW1lOiBTdHJpbmcsCit9CisKK2ltcGwgVFN0cnVjdElkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVFN0cnVjdElkZW50aWZpZXJgIGZvciBhIHN0cnVjdCBuYW1lZCBgbmFtZWAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KG5hbWU6IFMpIC0+IFRTdHJ1Y3RJZGVudGlmaWVyIHsKKyAgICAgICAgVFN0cnVjdElkZW50aWZpZXIgeyBuYW1lOiBuYW1lLmludG8oKSB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IGZpZWxkIGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBURmllbGRJZGVudGlmaWVyIHsKKyAgICAvLy8gTmFtZSBvZiB0aGUgVGhyaWZ0IGZpZWxkLgorICAgIC8vLworICAgIC8vLyBgTm9uZWAgaWYgaXQncyBub3Qgc2VudCBvdmVyIHRoZSB3aXJlLgorICAgIHB1YiBuYW1lOiBPcHRpb248U3RyaW5nPiwKKyAgICAvLy8gRmllbGQgdHlwZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBtYXkgYmUgYSBwcmltaXRpdmUsIGNvbnRhaW5lciwgb3IgYSBzdHJ1Y3QuCisgICAgcHViIGZpZWxkX3R5cGU6IFRUeXBlLAorICAgIC8vLyBUaHJpZnQgZmllbGQgaWQuCisgICAgLy8vCisgICAgLy8vIGBOb25lYCBvbmx5IGlmIGBmaWVsZF90eXBlYCBpcyBgVFR5cGU6OlN0b3BgLgorICAgIHB1YiBpZDogT3B0aW9uPGkxNj4sCit9CisKK2ltcGwgVEZpZWxkSWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBURmllbGRJZGVudGlmaWVyYCBmb3IgYSBmaWVsZCBuYW1lZCBgbmFtZWAgd2l0aCB0eXBlCisgICAgLy8vIGBmaWVsZF90eXBlYCBhbmQgZmllbGQgaWQgYGlkYC4KKyAgICAvLy8KKyAgICAvLy8gYGlkYCBzaG91bGQgYmUgYE5vbmVgIGlmIGBmaWVsZF90eXBlYCBpcyBgVFR5cGU6OlN0b3BgLgorICAgIHB1YiBmbiBuZXc8TiwgUywgST4obmFtZTogTiwgZmllbGRfdHlwZTogVFR5cGUsIGlkOiBJKSAtPiBURmllbGRJZGVudGlmaWVyCisgICAgd2hlcmUKKyAgICAgICAgTjogSW50bzxPcHRpb248Uz4+LAorICAgICAgICBTOiBJbnRvPFN0cmluZz4sCisgICAgICAgIEk6IEludG88T3B0aW9uPGkxNj4+LAorICAgIHsKKyAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICBuYW1lOiBuYW1lLmludG8oKS5tYXAofG58IG4uaW50bygpKSwKKyAgICAgICAgICAgIGZpZWxkX3R5cGU6IGZpZWxkX3R5cGUsCisgICAgICAgICAgICBpZDogaWQuaW50bygpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IGxpc3QgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRMaXN0SWRlbnRpZmllciB7CisgICAgLy8vIFR5cGUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgIHB1YiBlbGVtZW50X3R5cGU6IFRUeXBlLAorICAgIC8vLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgICAgcHViIHNpemU6IGkzMiwKK30KKworaW1wbCBUTGlzdElkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVExpc3RJZGVudGlmaWVyYCBmb3IgYSBsaXN0IHdpdGggYHNpemVgIGVsZW1lbnRzIG9mIHR5cGUKKyAgICAvLy8gYGVsZW1lbnRfdHlwZWAuCisgICAgcHViIGZuIG5ldyhlbGVtZW50X3R5cGU6IFRUeXBlLCBzaXplOiBpMzIpIC0+IFRMaXN0SWRlbnRpZmllciB7CisgICAgICAgIFRMaXN0SWRlbnRpZmllciB7CisgICAgICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgIHNpemU6IHNpemUsCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgc2V0IGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUU2V0SWRlbnRpZmllciB7CisgICAgLy8vIFR5cGUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzZXQuCisgICAgcHViIGVsZW1lbnRfdHlwZTogVFR5cGUsCisgICAgLy8vIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2V0LgorICAgIHB1YiBzaXplOiBpMzIsCit9CisKK2ltcGwgVFNldElkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVFNldElkZW50aWZpZXJgIGZvciBhIHNldCB3aXRoIGBzaXplYCBlbGVtZW50cyBvZiB0eXBlCisgICAgLy8vIGBlbGVtZW50X3R5cGVgLgorICAgIHB1YiBmbiBuZXcoZWxlbWVudF90eXBlOiBUVHlwZSwgc2l6ZTogaTMyKSAtPiBUU2V0SWRlbnRpZmllciB7CisgICAgICAgIFRTZXRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudF90eXBlLAorICAgICAgICAgICAgc2l6ZTogc2l6ZSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBtYXAgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRNYXBJZGVudGlmaWVyIHsKKyAgICAvLy8gTWFwIGtleSB0eXBlLgorICAgIHB1YiBrZXlfdHlwZTogT3B0aW9uPFRUeXBlPiwKKyAgICAvLy8gTWFwIHZhbHVlIHR5cGUuCisgICAgcHViIHZhbHVlX3R5cGU6IE9wdGlvbjxUVHlwZT4sCisgICAgLy8vIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBtYXAuCisgICAgcHViIHNpemU6IGkzMiwKK30KKworaW1wbCBUTWFwSWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUTWFwSWRlbnRpZmllcmAgZm9yIGEgbWFwIHdpdGggYHNpemVgIGVudHJpZXMgb2YgdHlwZQorICAgIC8vLyBga2V5X3R5cGUgLT4gdmFsdWVfdHlwZWAuCisgICAgcHViIGZuIG5ldzxLLCBWPihrZXlfdHlwZTogSywgdmFsdWVfdHlwZTogViwgc2l6ZTogaTMyKSAtPiBUTWFwSWRlbnRpZmllcgorICAgIHdoZXJlCisgICAgICAgIEs6IEludG88T3B0aW9uPFRUeXBlPj4sCisgICAgICAgIFY6IEludG88T3B0aW9uPFRUeXBlPj4sCisgICAgeworICAgICAgICBUTWFwSWRlbnRpZmllciB7CisgICAgICAgICAgICBrZXlfdHlwZToga2V5X3R5cGUuaW50bygpLAorICAgICAgICAgICAgdmFsdWVfdHlwZTogdmFsdWVfdHlwZS5pbnRvKCksCisgICAgICAgICAgICBzaXplOiBzaXplLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IG1lc3NhZ2UgdHlwZXMuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gVE1lc3NhZ2VUeXBlIHsKKyAgICAvLy8gU2VydmljZS1jYWxsIHJlcXVlc3QuCisgICAgQ2FsbCwKKyAgICAvLy8gU2VydmljZS1jYWxsIHJlc3BvbnNlLgorICAgIFJlcGx5LAorICAgIC8vLyBVbmV4cGVjdGVkIGVycm9yIGluIHRoZSByZW1vdGUgc2VydmljZS4KKyAgICBFeGNlcHRpb24sCisgICAgLy8vIE9uZS13YXkgc2VydmljZS1jYWxsIHJlcXVlc3QgKG5vIHJlc3BvbnNlIGlzIGV4cGVjdGVkKS4KKyAgICBPbmVXYXksCit9CisKK2ltcGwgRGlzcGxheSBmb3IgVE1lc3NhZ2VUeXBlIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6Q2FsbCA9PiB3cml0ZSEoZiwgIkNhbGwiKSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UmVwbHkgPT4gd3JpdGUhKGYsICJSZXBseSIpLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24gPT4gd3JpdGUhKGYsICJFeGNlcHRpb24iKSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6T25lV2F5ID0+IHdyaXRlIShmLCAiT25lV2F5IiksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRnJvbTxUTWVzc2FnZVR5cGU+IGZvciB1OCB7CisgICAgZm4gZnJvbShtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSkgLT4gU2VsZiB7CisgICAgICAgIG1hdGNoIG1lc3NhZ2VfdHlwZSB7CisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkNhbGwgPT4gMHgwMSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UmVwbHkgPT4gMHgwMiwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uID0+IDB4MDMsCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6Ok9uZVdheSA9PiAweDA0LAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIFRyeUZyb208dTg+IGZvciBUTWVzc2FnZVR5cGUgeworICAgIHR5cGUgRXJyID0gOjpFcnJvcjsKKyAgICBmbiB0cnlfZnJvbShiOiB1OCkgLT4gOjpSZXN1bHQ8U2VsZj4geworICAgICAgICBtYXRjaCBiIHsKKyAgICAgICAgICAgIDB4MDEgPT4gT2soVE1lc3NhZ2VUeXBlOjpDYWxsKSwKKyAgICAgICAgICAgIDB4MDIgPT4gT2soVE1lc3NhZ2VUeXBlOjpSZXBseSksCisgICAgICAgICAgICAweDAzID0+IE9rKFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uKSwKKyAgICAgICAgICAgIDB4MDQgPT4gT2soVE1lc3NhZ2VUeXBlOjpPbmVXYXkpLAorICAgICAgICAgICAgdW5rbiA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIFRNZXNzYWdlVHlwZSIsIHVua24pLAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IHN0cnVjdC1maWVsZCB0eXBlcy4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgZW51bSBUVHlwZSB7CisgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHNlcmlhbGl6ZWQgZmllbGRzIGluIHRoaXMgVGhyaWZ0IHN0cnVjdC4KKyAgICBTdG9wLAorICAgIC8vLyBWb2lkIChgKClgKSBmaWVsZC4KKyAgICBWb2lkLAorICAgIC8vLyBCb29sZWFuLgorICAgIEJvb2wsCisgICAgLy8vIFNpZ25lZCA4LWJpdCBpbnQuCisgICAgSTA4LAorICAgIC8vLyBEb3VibGUtcHJlY2lzaW9uIG51bWJlci4KKyAgICBEb3VibGUsCisgICAgLy8vIFNpZ25lZCAxNi1iaXQgaW50LgorICAgIEkxNiwKKyAgICAvLy8gU2lnbmVkIDMyLWJpdCBpbnQuCisgICAgSTMyLAorICAgIC8vLyBTaWduZWQgNjQtYml0IGludC4KKyAgICBJNjQsCisgICAgLy8vIFVURi04IHN0cmluZy4KKyAgICBTdHJpbmcsCisgICAgLy8vIFVURi03IHN0cmluZy4gKlVuc3VwcG9ydGVkKi4KKyAgICBVdGY3LAorICAgIC8vLyBUaHJpZnQgc3RydWN0LgorICAgIFN0cnVjdCwKKyAgICAvLy8gTWFwLgorICAgIE1hcCwKKyAgICAvLy8gU2V0LgorICAgIFNldCwKKyAgICAvLy8gTGlzdC4KKyAgICBMaXN0LAorICAgIC8vLyBVVEYtOCBzdHJpbmcuCisgICAgVXRmOCwKKyAgICAvLy8gVVRGLTE2IHN0cmluZy4gKlVuc3VwcG9ydGVkKi4KKyAgICBVdGYxNiwKK30KKworaW1wbCBEaXNwbGF5IGZvciBUVHlwZSB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICBtYXRjaCAqc2VsZiB7CisgICAgICAgICAgICBUVHlwZTo6U3RvcCA9PiB3cml0ZSEoZiwgIlNUT1AiKSwKKyAgICAgICAgICAgIFRUeXBlOjpWb2lkID0+IHdyaXRlIShmLCAidm9pZCIpLAorICAgICAgICAgICAgVFR5cGU6OkJvb2wgPT4gd3JpdGUhKGYsICJib29sIiksCisgICAgICAgICAgICBUVHlwZTo6STA4ID0+IHdyaXRlIShmLCAiaTA4IiksCisgICAgICAgICAgICBUVHlwZTo6RG91YmxlID0+IHdyaXRlIShmLCAiZG91YmxlIiksCisgICAgICAgICAgICBUVHlwZTo6STE2ID0+IHdyaXRlIShmLCAiaTE2IiksCisgICAgICAgICAgICBUVHlwZTo6STMyID0+IHdyaXRlIShmLCAiaTMyIiksCisgICAgICAgICAgICBUVHlwZTo6STY0ID0+IHdyaXRlIShmLCAiaTY0IiksCisgICAgICAgICAgICBUVHlwZTo6U3RyaW5nID0+IHdyaXRlIShmLCAic3RyaW5nIiksCisgICAgICAgICAgICBUVHlwZTo6VXRmNyA9PiB3cml0ZSEoZiwgIlVURjciKSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJ1Y3QgPT4gd3JpdGUhKGYsICJzdHJ1Y3QiKSwKKyAgICAgICAgICAgIFRUeXBlOjpNYXAgPT4gd3JpdGUhKGYsICJtYXAiKSwKKyAgICAgICAgICAgIFRUeXBlOjpTZXQgPT4gd3JpdGUhKGYsICJzZXQiKSwKKyAgICAgICAgICAgIFRUeXBlOjpMaXN0ID0+IHdyaXRlIShmLCAibGlzdCIpLAorICAgICAgICAgICAgVFR5cGU6OlV0ZjggPT4gd3JpdGUhKGYsICJVVEY4IiksCisgICAgICAgICAgICBUVHlwZTo6VXRmMTYgPT4gd3JpdGUhKGYsICJVVEYxNiIpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gQ29tcGFyZSB0aGUgZXhwZWN0ZWQgbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgYGV4cGVjdGVkYCB3aXRoIHRoZSByZWNlaXZlZAorLy8vIG1lc3NhZ2Ugc2VxdWVuY2UgbnVtYmVyIGBhY3R1YWxgLgorLy8vCisvLy8gUmV0dXJuIGAoKWAgaWYgYGFjdHVhbCA9PSBleHBlY3RlZGAsIGBFcnJgIG90aGVyd2lzZS4KK3B1YiBmbiB2ZXJpZnlfZXhwZWN0ZWRfc2VxdWVuY2VfbnVtYmVyKGV4cGVjdGVkOiBpMzIsIGFjdHVhbDogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgIGlmIGV4cGVjdGVkID09IGFjdHVhbCB7CisgICAgICAgIE9rKCgpKQorICAgIH0gZWxzZSB7CisgICAgICAgIEVycig6OkVycm9yOjpBcHBsaWNhdGlvbig6OkFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpBcHBsaWNhdGlvbkVycm9yS2luZDo6QmFkU2VxdWVuY2VJZCwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImV4cGVjdGVkIHt9IGdvdCB7fSIsIGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICB9KSkKKyAgICB9Cit9CisKKy8vLyBDb21wYXJlIHRoZSBleHBlY3RlZCBzZXJ2aWNlLWNhbGwgbmFtZSBgZXhwZWN0ZWRgIHdpdGggdGhlIHJlY2VpdmVkCisvLy8gc2VydmljZS1jYWxsIG5hbWUgYGFjdHVhbGAuCisvLy8KKy8vLyBSZXR1cm4gYCgpYCBpZiBgYWN0dWFsID09IGV4cGVjdGVkYCwgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIHZlcmlmeV9leHBlY3RlZF9zZXJ2aWNlX2NhbGwoZXhwZWN0ZWQ6ICZzdHIsIGFjdHVhbDogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBpZiBleHBlY3RlZCA9PSBhY3R1YWwgeworICAgICAgICBPaygoKSkKKyAgICB9IGVsc2UgeworICAgICAgICBFcnIoOjpFcnJvcjo6QXBwbGljYXRpb24oOjpBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6QXBwbGljYXRpb25FcnJvcktpbmQ6Oldyb25nTWV0aG9kTmFtZSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImV4cGVjdGVkIHt9IGdvdCB7fSIsIGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICB9KSkKKyAgICB9Cit9CisKKy8vLyBDb21wYXJlIHRoZSBleHBlY3RlZCBtZXNzYWdlIHR5cGUgYGV4cGVjdGVkYCB3aXRoIHRoZSByZWNlaXZlZCBtZXNzYWdlIHR5cGUKKy8vLyBgYWN0dWFsYC4KKy8vLworLy8vIFJldHVybiBgKClgIGlmIGBhY3R1YWwgPT0gZXhwZWN0ZWRgLCBgRXJyYCBvdGhlcndpc2UuCitwdWIgZm4gdmVyaWZ5X2V4cGVjdGVkX21lc3NhZ2VfdHlwZShleHBlY3RlZDogVE1lc3NhZ2VUeXBlLCBhY3R1YWw6IFRNZXNzYWdlVHlwZSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBpZiBleHBlY3RlZCA9PSBhY3R1YWwgeworICAgICAgICBPaygoKSkKKyAgICB9IGVsc2UgeworICAgICAgICBFcnIoOjpFcnJvcjo6QXBwbGljYXRpb24oOjpBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6QXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImV4cGVjdGVkIHt9IGdvdCB7fSIsIGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICB9KSkKKyAgICB9Cit9CisKKy8vLyBDaGVjayBpZiBhIHJlcXVpcmVkIFRocmlmdCBzdHJ1Y3QgZmllbGQgZXhpc3RzLgorLy8vCisvLy8gUmV0dXJuIGAoKWAgaWYgaXQgZG9lcywgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIHZlcmlmeV9yZXF1aXJlZF9maWVsZF9leGlzdHM8VD4oZmllbGRfbmFtZTogJnN0ciwgZmllbGQ6ICZPcHRpb248VD4pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgbWF0Y2ggKmZpZWxkIHsKKyAgICAgICAgU29tZShfKSA9PiBPaygoKSksCisgICAgICAgIE5vbmUgPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgibWlzc2luZyByZXF1aXJlZCBmaWVsZCB7fSIsIGZpZWxkX25hbWUpLAorICAgICAgICB9KSksCisgICAgfQorfQorCisvLy8gRXh0cmFjdCB0aGUgZmllbGQgaWQgZnJvbSBhIFRocmlmdCBmaWVsZCBpZGVudGlmaWVyLgorLy8vCisvLy8gYGZpZWxkX2lkZW50YCBtdXN0ICpub3QqIGhhdmUgYFRGaWVsZElkZW50aWZpZXIuZmllbGRfdHlwZWAgb2YgdHlwZSBgVFR5cGU6OlN0b3BgLgorLy8vCisvLy8gUmV0dXJuIGBURmllbGRJZGVudGlmaWVyLmlkYCBpZiBhbiBpZCBleGlzdHMsIGBFcnJgIG90aGVyd2lzZS4KK3B1YiBmbiBmaWVsZF9pZChmaWVsZF9pZGVudDogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PGkxNj4geworICAgIGZpZWxkX2lkZW50LmlkLm9rX29yX2Vsc2UofHwgeworICAgICAgICA6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoIm1pc3NpbmcgZmllbGQgaW4gaW4gezo/fSIsIGZpZWxkX2lkZW50KSwKKyAgICAgICAgfSkKKyAgICB9KQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2Ugc3RkOjppbzo6Q3Vyc29yOworCisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSB0cmFuc3BvcnQ6OntUUmVhZFRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0fTsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfaW5wdXRfcHJvdG9jb2xfZnJvbV9jb25jcmV0ZV9pbnB1dF9wcm90b2NvbCgpIHsKKyAgICAgICAgbGV0IHI6IEJveDxUUmVhZFRyYW5zcG9ydD4gPSBCb3g6Om5ldyhDdXJzb3I6Om5ldyhbMCwgMSwgMl0pKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcocik7CisgICAgICAgIHRha2VzX2lucHV0X3Byb3RvY29sKCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX2lucHV0X3Byb3RvY29sX2Zyb21fYm94ZWRfaW5wdXQoKSB7CisgICAgICAgIGxldCByOiBCb3g8VFJlYWRUcmFuc3BvcnQ+ID0gQm94OjpuZXcoQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKSk7CisgICAgICAgIGxldCBtdXQgdDogQm94PFRJbnB1dFByb3RvY29sPiA9IEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KHIpKTsKKyAgICAgICAgdGFrZXNfaW5wdXRfcHJvdG9jb2woJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfb3V0cHV0X3Byb3RvY29sX2Zyb21fY29uY3JldGVfb3V0cHV0X3Byb3RvY29sKCkgeworICAgICAgICBsZXQgdzogQm94PFRXcml0ZVRyYW5zcG9ydD4gPSBCb3g6Om5ldyh2ZWMhWzB1ODsgMTBdKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KHcpOworICAgICAgICB0YWtlc19vdXRwdXRfcHJvdG9jb2woJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfb3V0cHV0X3Byb3RvY29sX2Zyb21fYm94ZWRfb3V0cHV0KCkgeworICAgICAgICBsZXQgdzogQm94PFRXcml0ZVRyYW5zcG9ydD4gPSBCb3g6Om5ldyh2ZWMhWzB1ODsgMTBdKTsKKyAgICAgICAgbGV0IG11dCB0OiBCb3g8VE91dHB1dFByb3RvY29sPiA9IEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyh3KSk7CisgICAgICAgIHRha2VzX291dHB1dF9wcm90b2NvbCgmbXV0IHQpCisgICAgfQorCisgICAgZm4gdGFrZXNfaW5wdXRfcHJvdG9jb2w8Uj4odDogJm11dCBSKQorICAgIHdoZXJlCisgICAgICAgIFI6IFRJbnB1dFByb3RvY29sLAorICAgIHsKKyAgICAgICAgdC5yZWFkX2J5dGUoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICBmbiB0YWtlc19vdXRwdXRfcHJvdG9jb2w8Vz4odDogJm11dCBXKQorICAgIHdoZXJlCisgICAgICAgIFc6IFRPdXRwdXRQcm90b2NvbCwKKyAgICB7CisgICAgICAgIHQuZmx1c2goKS51bndyYXAoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3Byb3RvY29sL211bHRpcGxleGVkLnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9tdWx0aXBsZXhlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWVlNDRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9tdWx0aXBsZXhlZC5ycwpAQCAtMCwwICsxLDIzOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3VwZXI6OnsKKyAgICBURmllbGRJZGVudGlmaWVyLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwKKyAgICBUT3V0cHV0UHJvdG9jb2wsIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwKK307CisKKy8vLyBgVE91dHB1dFByb3RvY29sYCB0aGF0IHByZWZpeGVzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gYWxsIG91dGdvaW5nIFRocmlmdAorLy8vIG1lc3NhZ2VzLgorLy8vCisvLy8gQSBgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2xgIHNob3VsZCBiZSB1c2VkIHdoZW4gbXVsdGlwbGUgVGhyaWZ0IHNlcnZpY2VzCisvLy8gc2VuZCBtZXNzYWdlcyBvdmVyIGEgc2luZ2xlIEkvTyBjaGFubmVsLiBCeSBwcmVmaXhpbmcgc2VydmljZSBpZGVudGlmaWVycworLy8vIHRvIG91dGdvaW5nIG1lc3NhZ2VzIHJlY2VpdmVycyBhcmUgYWJsZSB0byBkZW11eCB0aGVtIGFuZCByb3V0ZSB0aGVtIHRvIHRoZQorLy8vIGFwcHJvcHJpYXRlIHNlcnZpY2UgcHJvY2Vzc29yLiBSdXN0IHJlY2VpdmVycyBtdXN0IHVzZSBhIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgCisvLy8gdG8gcHJvY2VzcyBpbmNvbWluZyBtZXNzYWdlcywgd2hpbGUgb3RoZXIgbGFuZ3VhZ2VzIG11c3QgdXNlIHRoZWlyCisvLy8gY29ycmVzcG9uZGluZyBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb25zLgorLy8vCisvLy8gRm9yIGV4YW1wbGUsIGdpdmVuIGEgc2VydmljZSBgVGVzdFNlcnZpY2VgIGFuZCBhIHNlcnZpY2UgY2FsbCBgdGVzdF9jYWxsYCwKKy8vLyB0aGlzIGltcGxlbWVudGF0aW9uIHdvdWxkIGlkZW50aWZ5IG1lc3NhZ2VzIGFzIG9yaWdpbmF0aW5nIGZyb20KKy8vLyBgVGVzdFNlcnZpY2U6dGVzdF9jYWxsYC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBwcm90b2NvbCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDo6bmV3KCJzZXJ2aWNlX25hbWUiLCBwcm90b2NvbCk7CisvLy8KKy8vLyBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygic3ZjX2NhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworLy8vIHByb3RvY29sLndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w8UD4KK3doZXJlCisgICAgUDogVE91dHB1dFByb3RvY29sLAoreworICAgIHNlcnZpY2VfbmFtZTogU3RyaW5nLAorICAgIGlubmVyOiBQLAorfQorCitpbXBsPFA+IFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sPFA+Cit3aGVyZQorICAgIFA6IFRPdXRwdXRQcm90b2NvbCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sYCB0aGF0IGlkZW50aWZpZXMgb3V0Z29pbmcgbWVzc2FnZXMKKyAgICAvLy8gYXMgb3JpZ2luYXRpbmcgZnJvbSBhIHNlcnZpY2UgbmFtZWQgYHNlcnZpY2VfbmFtZWAgYW5kIHNlbmRzIHRoZW0gb3ZlcgorICAgIC8vLyB0aGUgYHdyYXBwZWRgIGBUT3V0cHV0UHJvdG9jb2xgLiBPdXRnb2luZyBtZXNzYWdlcyBhcmUgZW5jb2RlZCBhbmQgc2VudAorICAgIC8vLyBieSBgd3JhcHBlZGAsIG5vdCBieSB0aGlzIGluc3RhbmNlLgorICAgIHB1YiBmbiBuZXcoc2VydmljZV9uYW1lOiAmc3RyLCB3cmFwcGVkOiBQKSAtPiBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxQPiB7CisgICAgICAgIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIHNlcnZpY2VfbmFtZTogc2VydmljZV9uYW1lLnRvX293bmVkKCksCisgICAgICAgICAgICBpbm5lcjogd3JhcHBlZCwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gRklYTUU6IGF2b2lkIHBhc3N0aHJvdWdoIG1ldGhvZHMKK2ltcGw8UD4gVE91dHB1dFByb3RvY29sIGZvciBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxQPgord2hlcmUKKyAgICBQOiBUT3V0cHV0UHJvdG9jb2wsCit7CisgICAgZm4gd3JpdGVfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWVzc2FnZUlkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIG1hdGNoIGlkZW50aWZpZXIubWVzc2FnZV90eXBlIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gb3ZlcnJpZGUgaWRlbnRpZmllciBoZXJlPworICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpDYWxsIHwgVE1lc3NhZ2VUeXBlOjpPbmVXYXkgPT4geworICAgICAgICAgICAgICAgIGxldCBpZGVudGlmaWVyID0gVE1lc3NhZ2VJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZTogZm9ybWF0ISgie306e30iLCBzZWxmLnNlcnZpY2VfbmFtZSwgaWRlbnRpZmllci5uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgLi4qaWRlbnRpZmllcgorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgc2VsZi5pbm5lci53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudGlmaWVyKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiBzZWxmLmlubmVyLndyaXRlX21lc3NhZ2VfYmVnaW4oaWRlbnRpZmllciksCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbWVzc2FnZV9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zdHJ1Y3RfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zdHJ1Y3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2ZpZWxkX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9maWVsZF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX3N0b3AoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2ZpZWxkX3N0b3AoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGVzKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfYnl0ZXMoYikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ib29sKCZtdXQgc2VsZiwgYjogYm9vbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9ib29sKGIpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9pOChpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kxNigmbXV0IHNlbGYsIGk6IGkxNikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9pMTYoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMzIoJm11dCBzZWxmLCBpOiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfaTMyKGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2k2NChpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2RvdWJsZSgmbXV0IHNlbGYsIGQ6IGY2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9kb3VibGUoZCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3N0cmluZyhzKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2xpc3RfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbGlzdF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU2V0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zZXRfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zZXRfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1hcElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbWFwX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbWFwX2VuZCgpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLmZsdXNoKCkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9ieXRlKGIpCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2UgcHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2x9OworICAgIHVzZSB0cmFuc3BvcnQ6OntUQnVmZmVyQ2hhbm5lbCwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfYmVnaW5fd2l0aF9wcmVmaXhlZF9zZXJ2aWNlX25hbWUoKSB7CisgICAgICAgIGxldCBtdXQgb19wcm90ID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoImJhciIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTldID0gWworICAgICAgICAgICAgMHg4MCwKKyAgICAgICAgICAgIDB4MDEsIC8qIHByb3RvY29sIGlkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAxLCAvKiBtZXNzYWdlIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDcsCisgICAgICAgICAgICAweDY2LAorICAgICAgICAgICAgMHg2RiwKKyAgICAgICAgICAgIDB4NkYsIC8qICJmb28iICovCisgICAgICAgICAgICAweDNBLCAvKiAiOiIgKi8KKyAgICAgICAgICAgIDB4NjIsCisgICAgICAgICAgICAweDYxLAorICAgICAgICAgICAgMHg3MiwgLyogImJhciIgKi8KKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDIgLyogc2VxdWVuY2UgbnVtYmVyICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcSEob19wcm90LmlubmVyLnRyYW5zcG9ydC53cml0ZV9ieXRlcygpLCBleHBlY3RlZCk7CisgICAgfQorCisgICAgZm4gdGVzdF9vYmplY3RzKCkgLT4gVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w8VEJpbmFyeU91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+PgorICAgIHsKKyAgICAgICAgbGV0IGMgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg0MCwgNDApOworICAgICAgICBsZXQgKF8sIHdfY2hhbikgPSBjLnNwbGl0KCkudW53cmFwKCk7CisgICAgICAgIGxldCBwcm90ID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcod19jaGFuLCB0cnVlKTsKKyAgICAgICAgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w6Om5ldygiZm9vIiwgcHJvdCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3Byb3RvY29sL3N0b3JlZC5ycyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvc3RvcmVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTU5NzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3Byb3RvY29sL3N0b3JlZC5ycwpAQCAtMCwwICsxLDE5NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjb252ZXJ0OjpJbnRvOworCit1c2Ugc3VwZXI6OnsKKyAgICBURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwKK307Cit1c2UgUHJvdG9jb2xFcnJvcktpbmQ7CisKKy8vLyBgVElucHV0UHJvdG9jb2xgIHJlcXVpcmVkIHRvIHVzZSBhIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgLgorLy8vCisvLy8gQSBgVE11bHRpcGxleGVkUHJvY2Vzc29yYCByZWFkcyBpbmNvbWluZyBtZXNzYWdlIGlkZW50aWZpZXJzIHRvIGRldGVybWluZSB0bworLy8vIHdoaWNoIGBUUHJvY2Vzc29yYCByZXF1ZXN0cyBzaG91bGQgYmUgZm9yd2FyZGVkLiBIb3dldmVyLCBvbmNlIHJlYWQsIHRob3NlCisvLy8gbWVzc2FnZSBpZGVudGlmaWVyIGJ5dGVzIGFyZSBubyBsb25nZXIgb24gdGhlIHdpcmUuIFNpbmNlIGRvd25zdHJlYW0KKy8vLyBwcm9jZXNzb3JzIGV4cGVjdCB0byByZWFkIG1lc3NhZ2UgaWRlbnRpZmllcnMgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wKKy8vLyB3ZSBuZWVkIHNvbWUgd2F5IG9mIHN1cHBseWluZyBhIGBUTWVzc2FnZUlkZW50aWZpZXJgIHdpdGggdGhlIHNlcnZpY2UtbmFtZQorLy8vIHN0cmlwcGVkLiBUaGlzIGltcGxlbWVudGF0aW9uIHN0b3JlcyB0aGUgcmVjZWl2ZWQgYFRNZXNzYWdlSWRlbnRpZmllcmAKKy8vLyAod2l0aG91dCB0aGUgc2VydmljZSBuYW1lKSBhbmQgcGFzc2VzIGl0IHRvIHRoZSB3cmFwcGVkIGBUSW5wdXRQcm90b2NvbGAKKy8vLyB3aGVuIGBUSW5wdXRQcm90b2NvbDo6cmVhZF9tZXNzYWdlX2JlZ2luKC4uLilgIGlzIGNhbGxlZC4gSXQgZGVsZWdhdGVzIGFsbAorLy8vIG90aGVyIGNhbGxzIGRpcmVjdGx5IHRvIHRoZSB3cmFwcGVkIGBUSW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBUaGlzIHR5cGUgKipzaG91bGQgbm90KiogYmUgdXNlZCBieSBhcHBsaWNhdGlvbiBjb2RlLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVFN0b3JlZElucHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRTdG9yZWRJbnB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0OjpzZXJ2ZXI6OlRQcm9jZXNzb3I7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VElvQ2hhbm5lbCwgVFRjcENoYW5uZWx9OworLy8vCisvLy8gLy8gc2FtcGxlIHByb2Nlc3NvcgorLy8vIHN0cnVjdCBBY3R1YWxQcm9jZXNzb3I7CisvLy8gaW1wbCBUUHJvY2Vzc29yIGZvciBBY3R1YWxQcm9jZXNzb3IgeworLy8vICAgICBmbiBwcm9jZXNzKAorLy8vICAgICAgICAgJnNlbGYsCisvLy8gICAgICAgICBfOiAmbXV0IFRJbnB1dFByb3RvY29sLAorLy8vICAgICAgICAgXzogJm11dCBUT3V0cHV0UHJvdG9jb2wKKy8vLyAgICAgKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKQorLy8vICAgICB9CisvLy8gfQorLy8vIGxldCBwcm9jZXNzb3IgPSBBY3R1YWxQcm9jZXNzb3Ige307CisvLy8KKy8vLyAvLyBjb25zdHJ1Y3QgdGhlIHNoYXJlZCB0cmFuc3BvcnQKKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IChpX2NoYW4sIG9fY2hhbikgPSBjaGFubmVsLnNwbGl0KCkudW53cmFwKCk7CisvLy8KKy8vLyAvLyBjb25zdHJ1Y3QgdGhlIGFjdHVhbCBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scworLy8vIGxldCBtdXQgaV9wcm90ID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhpX2NoYW4sIHRydWUpOworLy8vIGxldCBtdXQgb19wcm90ID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcob19jaGFuLCB0cnVlKTsKKy8vLworLy8vIC8vIG1lc3NhZ2UgaWRlbnRpZmllciByZWNlaXZlZCBmcm9tIHJlbW90ZSBhbmQgbW9kaWZpZWQgdG8gcmVtb3ZlIHRoZSBzZXJ2aWNlIG5hbWUKKy8vLyBsZXQgbmV3X21zZ19pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJzZXJ2aWNlX2NhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworLy8vCisvLy8gLy8gY29uc3RydWN0IHRoZSBwcm94eSBpbnB1dCBwcm90b2NvbAorLy8vIGxldCBtdXQgcHJveHlfaV9wcm90ID0gVFN0b3JlZElucHV0UHJvdG9jb2w6Om5ldygmbXV0IGlfcHJvdCwgbmV3X21zZ19pZGVudCk7CisvLy8gbGV0IHJlcyA9IHByb2Nlc3Nvci5wcm9jZXNzKCZtdXQgcHJveHlfaV9wcm90LCAmbXV0IG9fcHJvdCk7CisvLy8gYGBgCisvLyBGSVhNRTogaW1wbGVtZW50IERlYnVnCitwdWIgc3RydWN0IFRTdG9yZWRJbnB1dFByb3RvY29sPCdhPiB7CisgICAgaW5uZXI6ICYnYSBtdXQgVElucHV0UHJvdG9jb2wsCisgICAgbWVzc2FnZV9pZGVudDogT3B0aW9uPFRNZXNzYWdlSWRlbnRpZmllcj4sCit9CisKK2ltcGw8J2E+IFRTdG9yZWRJbnB1dFByb3RvY29sPCdhPiB7CisgICAgLy8vIENyZWF0ZSBhIGBUU3RvcmVkSW5wdXRQcm90b2NvbGAgdGhhdCBkZWxlZ2F0ZXMgYWxsIGNhbGxzIG90aGVyIHRoYW4KKyAgICAvLy8gYFRJbnB1dFByb3RvY29sOjpyZWFkX21lc3NhZ2VfYmVnaW4oLi4uKWAgdG8gYSBgd3JhcHBlZGAKKyAgICAvLy8gYFRJbnB1dFByb3RvY29sYC4gYG1lc3NhZ2VfaWRlbnRgIGlzIHRoZSBtb2RpZmllZCBtZXNzYWdlIGlkZW50aWZpZXIgLQorICAgIC8vLyB3aXRoIHNlcnZpY2UgbmFtZSBzdHJpcHBlZCAtIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8KKyAgICAvLy8gYHdyYXBwZWQucmVhZF9tZXNzYWdlX2JlZ2luKC4uLilgLgorICAgIHB1YiBmbiBuZXcoCisgICAgICAgIHdyYXBwZWQ6ICZtdXQgVElucHV0UHJvdG9jb2wsCisgICAgICAgIG1lc3NhZ2VfaWRlbnQ6IFRNZXNzYWdlSWRlbnRpZmllciwKKyAgICApIC0+IFRTdG9yZWRJbnB1dFByb3RvY29sIHsKKyAgICAgICAgVFN0b3JlZElucHV0UHJvdG9jb2wgeworICAgICAgICAgICAgaW5uZXI6IHdyYXBwZWQsCisgICAgICAgICAgICBtZXNzYWdlX2lkZW50OiBtZXNzYWdlX2lkZW50LmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDwnYT4gVElucHV0UHJvdG9jb2wgZm9yIFRTdG9yZWRJbnB1dFByb3RvY29sPCdhPiB7CisgICAgZm4gcmVhZF9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1lc3NhZ2VJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYubWVzc2FnZV9pZGVudC50YWtlKCkub2tfb3JfZWxzZSh8fCB7CisgICAgICAgICAgICA6OmVycm9yczo6bmV3X3Byb3RvY29sX2Vycm9yKAorICAgICAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgICJtZXNzYWdlIGlkZW50aWZpZXIgYWxyZWFkeSByZWFkIiwKKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICB9CisKKyAgICBmbiByZWFkX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX21lc3NhZ2VfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX3N0cnVjdF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX3N0cnVjdF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9maWVsZF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfZmllbGRfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfYnl0ZXMoKQorICAgIH0KKworICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2Jvb2woKQorICAgIH0KKworICAgIGZuIHJlYWRfaTgoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpOD4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfaTgoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTE2KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTE2PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9pMTYoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9pMzIoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTY0KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTY0PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9pNjQoKQorICAgIH0KKworICAgIGZuIHJlYWRfZG91YmxlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8ZjY0PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9kb3VibGUoKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9zdHJpbmcoKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbGlzdF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9saXN0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc2V0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc2V0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWFwSWRlbnRpZmllcj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbWFwX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbWFwX2VuZCgpCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiByZWFkX2J5dGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDx1OD4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfYnl0ZSgpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9zZXJ2ZXIvbW9kLnJzIGIvbGliL3JzL3NyYy9zZXJ2ZXIvbW9kLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjM4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3NlcnZlci9tb2QucnMKQEAgLTAsMCArMSwxMjQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFR5cGVzIHVzZWQgdG8gaW1wbGVtZW50IGEgVGhyaWZ0IHNlcnZlci4KKwordXNlIHByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2x9OwordXNlIHtBcHBsaWNhdGlvbkVycm9yLCBBcHBsaWNhdGlvbkVycm9yS2luZH07CisKK21vZCBtdWx0aXBsZXhlZDsKK21vZCB0aHJlYWRlZDsKKworcHViIHVzZSBzZWxmOjptdWx0aXBsZXhlZDo6VE11bHRpcGxleGVkUHJvY2Vzc29yOworcHViIHVzZSBzZWxmOjp0aHJlYWRlZDo6VFNlcnZlcjsKKworLy8vIEhhbmRsZXMgaW5jb21pbmcgVGhyaWZ0IG1lc3NhZ2VzIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gdGhlIHVzZXItZGVmaW5lZAorLy8vIGhhbmRsZXIgZnVuY3Rpb25zLgorLy8vCisvLy8gQW4gaW1wbGVtZW50YXRpb24gaXMgYXV0by1nZW5lcmF0ZWQgZm9yIGVhY2ggVGhyaWZ0IHNlcnZpY2UuIFdoZW4gdXNlZCBieSBhCisvLy8gc2VydmVyIChmb3IgZXhhbXBsZSwgYSBgVFNpbXBsZVNlcnZlcmApLCBpdCB3aWxsIGRlbXV4IGluY29taW5nIHNlcnZpY2UKKy8vLyBjYWxscyBhbmQgaW52b2tlIHRoZSBjb3JyZXNwb25kaW5nIHVzZXItZGVmaW5lZCBoYW5kbGVyIGZ1bmN0aW9uLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCBzdGFydCBhIHNlcnZlciB1c2luZyB0aGUgYXV0by1nZW5lcmF0ZWQgYFRQcm9jZXNzb3JgIGZvcgorLy8vIGEgVGhyaWZ0IHNlcnZpY2UgYFNpbXBsZVNlcnZpY2VgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnNlcnZlcjo6VFByb2Nlc3NvcjsKKy8vLworLy8vIC8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQKKy8vLyAvLworLy8vCisvLy8gLy8gcHJvY2Vzc29yIGZvciBgU2ltcGxlU2VydmljZWAKKy8vLyBzdHJ1Y3QgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3I7CisvLy8gaW1wbCBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgIGZuIG5ldzxIOiBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXI+KHByb2Nlc3NvcjogSCkgLT4gU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGBUUHJvY2Vzc29yYCBpbXBsZW1lbnRhdGlvbiBmb3IgYFNpbXBsZVNlcnZpY2VgCisvLy8gaW1wbCBUUHJvY2Vzc29yIGZvciBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgIGZuIHByb2Nlc3MoJnNlbGYsIGk6ICZtdXQgVElucHV0UHJvdG9jb2wsIG86ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIHNlcnZpY2UgZnVuY3Rpb25zIGZvciBTaW1wbGVTZXJ2aWNlCisvLy8gdHJhaXQgU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyIHsKKy8vLyAgICAgZm4gc2VydmljZV9jYWxsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT47CisvLy8gfQorLy8vCisvLy8gLy8KKy8vLyAvLyB1c2VyLWNvZGUgZm9sbG93cworLy8vIC8vCisvLy8KKy8vLyAvLyBkZWZpbmUgYSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gYHNlcnZpY2VfY2FsbGAgaXMgcmVjZWl2ZWQKKy8vLyBzdHJ1Y3QgU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsOworLy8vIGltcGwgU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyIGZvciBTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGwgeworLy8vICAgICBmbiBzZXJ2aWNlX2NhbGwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvcgorLy8vIGxldCBwcm9jZXNzb3IgPSBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbCB7fSk7CisvLy8KKy8vLyAvLyBhdCB0aGlzIHBvaW50IHlvdSBjYW4gcGFzcyB0aGUgcHJvY2Vzc29yIHRvIHRoZSBzZXJ2ZXIKKy8vLyAvLyBsZXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KC4uLiwgcHJvY2Vzc29yKTsKKy8vLyBgYGAKK3B1YiB0cmFpdCBUUHJvY2Vzc29yIHsKKyAgICAvLy8gUHJvY2VzcyBhIFRocmlmdCBzZXJ2aWNlIGNhbGwuCisgICAgLy8vCisgICAgLy8vIFJlYWRzIGFyZ3VtZW50cyBmcm9tIGBpYCwgZXhlY3V0ZXMgdGhlIHVzZXIncyBoYW5kbGVyIGNvZGUsIGFuZCB3cml0ZXMKKyAgICAvLy8gdGhlIHJlc3BvbnNlIHRvIGBvYC4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJucyBgKClgIGlmIHRoZSBoYW5kbGVyIHdhcyBleGVjdXRlZDsgYEVycmAgb3RoZXJ3aXNlLgorICAgIGZuIHByb2Nlc3MoJnNlbGYsIGk6ICZtdXQgVElucHV0UHJvdG9jb2wsIG86ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiA6OlJlc3VsdDwoKT47Cit9CisKKy8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiB1c2VkIGluIGdlbmVyYXRlZCBgVFByb2Nlc3NvcmAgaW1wbGVtZW50YXRpb25zIHRvCisvLy8gcmV0dXJuIGFuIGBBcHBsaWNhdGlvbkVycm9yYCBpZiB0aHJpZnQgbWVzc2FnZSBwcm9jZXNzaW5nIGZhaWxlZC4KK3B1YiBmbiBoYW5kbGVfcHJvY2Vzc19yZXN1bHQoCisgICAgbXNnX2lkZW50OiAmVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgIHJlczogOjpSZXN1bHQ8KCk+LAorICAgIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wsCispIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgaWYgbGV0IEVycihlKSA9IHJlcyB7CisgICAgICAgIGxldCBlID0gbWF0Y2ggZSB7CisgICAgICAgICAgICA6OkVycm9yOjpBcHBsaWNhdGlvbihhKSA9PiBhLAorICAgICAgICAgICAgXyA9PiBBcHBsaWNhdGlvbkVycm9yOjpuZXcoQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sIGZvcm1hdCEoIns6P30iLCBlKSksCisgICAgICAgIH07CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICBtc2dfaWRlbnQubmFtZS5jbG9uZSgpLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24sCisgICAgICAgICAgICBtc2dfaWRlbnQuc2VxdWVuY2VfbnVtYmVyLAorICAgICAgICApOworCisgICAgICAgIG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCk/OworICAgICAgICA6OkVycm9yOjp3cml0ZV9hcHBsaWNhdGlvbl9lcnJvcl90b19vdXRfcHJvdG9jb2woJmUsIG9fcHJvdCk/OworICAgICAgICBvX3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQoKT87CisgICAgICAgIG9fcHJvdC5mbHVzaCgpCisgICAgfSBlbHNlIHsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9zZXJ2ZXIvbXVsdGlwbGV4ZWQucnMgYi9saWIvcnMvc3JjL3NlcnZlci9tdWx0aXBsZXhlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDMzNzk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9zZXJ2ZXIvbXVsdGlwbGV4ZWQucnMKQEAgLTAsMCArMSwzNTEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Cit1c2Ugc3RkOjpjb252ZXJ0OjpJbnRvOwordXNlIHN0ZDo6Zm10OwordXNlIHN0ZDo6Zm10Ojp7RGVidWcsIEZvcm1hdHRlcn07Cit1c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRleH07CisKK3VzZSBwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRPdXRwdXRQcm90b2NvbCwgVFN0b3JlZElucHV0UHJvdG9jb2x9OworCit1c2Ugc3VwZXI6OntoYW5kbGVfcHJvY2Vzc19yZXN1bHQsIFRQcm9jZXNzb3J9OworCitjb25zdCBNSVNTSU5HX1NFUEFSQVRPUl9BTkRfTk9fREVGQVVMVDogJidzdGF0aWMgc3RyID0KKyAgICAibWlzc2luZyBzZXJ2aWNlIHNlcGFyYXRvciBhbmQgbm8gZGVmYXVsdCBwcm9jZXNzb3Igc2V0IjsKK3R5cGUgVGhyZWFkU2FmZVByb2Nlc3NvciA9IEJveDxUUHJvY2Vzc29yICsgU2VuZCArIFN5bmM+OworCisvLy8gQSBgVFByb2Nlc3NvcmAgdGhhdCBjYW4gZGVtdXggc2VydmljZSBjYWxscyB0byBtdWx0aXBsZSB1bmRlcmx5aW5nCisvLy8gVGhyaWZ0IHNlcnZpY2VzLgorLy8vCisvLy8gVXNlcnMgcmVnaXN0ZXIgc2VydmljZS1zcGVjaWZpYyBgVFByb2Nlc3NvcmAgaW5zdGFuY2VzIHdpdGggYQorLy8vIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgLCBhbmQgdGhlbiByZWdpc3RlciB0aGF0IHByb2Nlc3NvciB3aXRoIGEgc2VydmVyCisvLy8gaW1wbGVtZW50YXRpb24uIEZvbGxvd2luZyB0aGF0LCBhbGwgaW5jb21pbmcgc2VydmljZSBjYWxscyBhcmUgYXV0b21hdGljYWxseQorLy8vIHJvdXRlZCB0byB0aGUgc2VydmljZS1zcGVjaWZpYyBgVFByb2Nlc3NvcmAuCisvLy8KKy8vLyBBIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgIGNhbiBvbmx5IGhhbmRsZSBtZXNzYWdlcyBzZW50IGJ5IGEKKy8vLyBgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2xgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgc3RvcmVkOiBNdXRleDxTdG9yZWRQcm9jZXNzb3JzPiwKK30KKworI1tkZXJpdmUoRGVmYXVsdCldCitzdHJ1Y3QgU3RvcmVkUHJvY2Vzc29ycyB7CisgICAgcHJvY2Vzc29yczogSGFzaE1hcDxTdHJpbmcsIEFyYzxUaHJlYWRTYWZlUHJvY2Vzc29yPj4sCisgICAgZGVmYXVsdF9wcm9jZXNzb3I6IE9wdGlvbjxBcmM8VGhyZWFkU2FmZVByb2Nlc3Nvcj4+LAorfQorCitpbXBsIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBgVE11bHRpcGxleGVkUHJvY2Vzc29yYCB3aXRoIG5vIHJlZ2lzdGVyZWQgc2VydmljZS1zcGVjaWZpYworICAgIC8vLyBwcm9jZXNzb3JzLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgICAgICAgICAgc3RvcmVkOiBNdXRleDo6bmV3KFN0b3JlZFByb2Nlc3NvcnMgeworICAgICAgICAgICAgICAgIHByb2Nlc3NvcnM6IEhhc2hNYXA6Om5ldygpLAorICAgICAgICAgICAgICAgIGRlZmF1bHRfcHJvY2Vzc29yOiBOb25lLAorICAgICAgICAgICAgfSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gUmVnaXN0ZXIgYSBzZXJ2aWNlLXNwZWNpZmljIGBwcm9jZXNzb3JgIGZvciB0aGUgc2VydmljZSBuYW1lZAorICAgIC8vLyBgc2VydmljZV9uYW1lYC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhbHNvIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGgKKyAgICAvLy8gbm9uLW11bHRpcGxleGVkIGNsaWVudHMuIFNldCBgYXNfZGVmYXVsdGAgdG8gYHRydWVgIHRvIGFsbG93CisgICAgLy8vIG5vbi1uYW1lc3BhY2VkIHJlcXVlc3RzIHRvIGJlIGRpc3BhdGNoZWQgdG8gYSBkZWZhdWx0IHByb2Nlc3Nvci4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJucyBzdWNjZXNzIGlmIGEgbmV3IGVudHJ5IHdhcyBpbnNlcnRlZC4gUmV0dXJucyBhbiBlcnJvciBpZjoKKyAgICAvLy8gKiBBIHByb2Nlc3NvciBleGlzdHMgZm9yIGBzZXJ2aWNlX25hbWVgCisgICAgLy8vICogWW91IGF0dGVtcHQgdG8gcmVnaXN0ZXIgYSBwcm9jZXNzb3IgYXMgZGVmYXVsdCwgYW5kIGFuIGV4aXN0aW5nIGRlZmF1bHQgZXhpc3RzCisgICAgI1tjZmdfYXR0cihmZWF0dXJlID0gImNhcmdvLWNsaXBweSIsIGFsbG93KG1hcF9lbnRyeSkpXQorICAgIHB1YiBmbiByZWdpc3RlcjxTOiBJbnRvPFN0cmluZz4+KAorICAgICAgICAmbXV0IHNlbGYsCisgICAgICAgIHNlcnZpY2VfbmFtZTogUywKKyAgICAgICAgcHJvY2Vzc29yOiBCb3g8VFByb2Nlc3NvciArIFNlbmQgKyBTeW5jPiwKKyAgICAgICAgYXNfZGVmYXVsdDogYm9vbCwKKyAgICApIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBtdXQgc3RvcmVkID0gc2VsZi5zdG9yZWQubG9jaygpLnVud3JhcCgpOworCisgICAgICAgIGxldCBuYW1lID0gc2VydmljZV9uYW1lLmludG8oKTsKKyAgICAgICAgaWYgIXN0b3JlZC5wcm9jZXNzb3JzLmNvbnRhaW5zX2tleSgmbmFtZSkgeworICAgICAgICAgICAgbGV0IHByb2Nlc3NvciA9IEFyYzo6bmV3KHByb2Nlc3Nvcik7CisKKyAgICAgICAgICAgIGlmIGFzX2RlZmF1bHQgeworICAgICAgICAgICAgICAgIGlmIHN0b3JlZC5kZWZhdWx0X3Byb2Nlc3Nvci5pc19ub25lKCkgeworICAgICAgICAgICAgICAgICAgICBzdG9yZWQucHJvY2Vzc29ycy5pbnNlcnQobmFtZSwgcHJvY2Vzc29yLmNsb25lKCkpOworICAgICAgICAgICAgICAgICAgICBzdG9yZWQuZGVmYXVsdF9wcm9jZXNzb3IgPSBTb21lKHByb2Nlc3Nvci5jbG9uZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgRXJyKCJjYW5ub3QgcmVzZXQgZGVmYXVsdCBwcm9jZXNzb3IiLmludG8oKSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0b3JlZC5wcm9jZXNzb3JzLmluc2VydChuYW1lLCBwcm9jZXNzb3IpOworICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRXJyKGZvcm1hdCEoImNhbm5vdCBvdmVyd3JpdGUgZXhpc3RpbmcgcHJvY2Vzc29yIGZvciBzZXJ2aWNlIHt9IiwgbmFtZSkuaW50bygpKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcHJvY2Vzc19tZXNzYWdlKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgbXNnX2lkZW50OiAmVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgICAgICBpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wsCisgICAgICAgIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wsCisgICAgKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgKHN2Y19uYW1lLCBzdmNfY2FsbCkgPSBzcGxpdF9pZGVudF9uYW1lKCZtc2dfaWRlbnQubmFtZSk7CisgICAgICAgIGRlYnVnISgicm91dGluZyBzdmNfbmFtZSB7Oj99IHN2Y19jYWxsIHt9IiwgJnN2Y19uYW1lLCAmc3ZjX2NhbGwpOworCisgICAgICAgIGxldCBwcm9jZXNzb3I6IE9wdGlvbjxBcmM8VGhyZWFkU2FmZVByb2Nlc3Nvcj4+ID0geworICAgICAgICAgICAgbGV0IHN0b3JlZCA9IHNlbGYuc3RvcmVkLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgICAgIGlmIGxldCBTb21lKG5hbWUpID0gc3ZjX25hbWUgeworICAgICAgICAgICAgICAgIHN0b3JlZC5wcm9jZXNzb3JzLmdldChuYW1lKS5jbG9uZWQoKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdG9yZWQuZGVmYXVsdF9wcm9jZXNzb3IuY2xvbmUoKQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIG1hdGNoIHByb2Nlc3NvciB7CisgICAgICAgICAgICBTb21lKGFyYykgPT4geworICAgICAgICAgICAgICAgIGxldCBuZXdfbXNnX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICAgICAgICAgIHN2Y19jYWxsLAorICAgICAgICAgICAgICAgICAgICBtc2dfaWRlbnQubWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICBtc2dfaWRlbnQuc2VxdWVuY2VfbnVtYmVyLAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgbGV0IG11dCBwcm94eV9pX3Byb3QgPSBUU3RvcmVkSW5wdXRQcm90b2NvbDo6bmV3KGlfcHJvdCwgbmV3X21zZ19pZGVudCk7CisgICAgICAgICAgICAgICAgKCphcmMpLnByb2Nlc3MoJm11dCBwcm94eV9pX3Byb3QsIG9fcHJvdCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vbmUgPT4gRXJyKG1pc3NpbmdfcHJvY2Vzc29yX21lc3NhZ2Uoc3ZjX25hbWUpLmludG8oKSksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgVFByb2Nlc3NvciBmb3IgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICBmbiBwcm9jZXNzKCZzZWxmLCBpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBtc2dfaWRlbnQgPSBpX3Byb3QucmVhZF9tZXNzYWdlX2JlZ2luKCk/OworCisgICAgICAgIGRlYnVnISgicHJvY2VzcyBpbmNvbWluZyBtc2cgaWQ6ezo/fSIsICZtc2dfaWRlbnQpOworICAgICAgICBsZXQgcmVzID0gc2VsZi5wcm9jZXNzX21lc3NhZ2UoJm1zZ19pZGVudCwgaV9wcm90LCBvX3Byb3QpOworCisgICAgICAgIGhhbmRsZV9wcm9jZXNzX3Jlc3VsdCgmbXNnX2lkZW50LCByZXMsIG9fcHJvdCkKKyAgICB9Cit9CisKK2ltcGwgRGVidWcgZm9yIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICBsZXQgc3RvcmVkID0gc2VsZi5zdG9yZWQubG9jaygpLnVud3JhcCgpOworICAgICAgICB3cml0ZSEoCisgICAgICAgICAgICBmLAorICAgICAgICAgICAgIlRNdWx0aXBsZXhlZFByb2Nlc3Mge3sgcmVnaXN0ZXJlZF9jb3VudDogezo/fSBkZWZhdWx0OiB7Oj99IH19IiwKKyAgICAgICAgICAgIHN0b3JlZC5wcm9jZXNzb3JzLmtleXMoKS5sZW4oKSwKKyAgICAgICAgICAgIHN0b3JlZC5kZWZhdWx0X3Byb2Nlc3Nvci5pc19zb21lKCkKKyAgICAgICAgKQorICAgIH0KK30KKworZm4gc3BsaXRfaWRlbnRfbmFtZShpZGVudF9uYW1lOiAmc3RyKSAtPiAoT3B0aW9uPCZzdHI+LCAmc3RyKSB7CisgICAgaWRlbnRfbmFtZQorICAgICAgICAuZmluZCgnOicpCisgICAgICAgIC5tYXAofHBvc3wgeworICAgICAgICAgICAgbGV0IChzdmNfbmFtZSwgc3ZjX2NhbGwpID0gaWRlbnRfbmFtZS5zcGxpdF9hdChwb3MpOworICAgICAgICAgICAgbGV0IChfLCBzdmNfY2FsbCkgPSBzdmNfY2FsbC5zcGxpdF9hdCgxKTsgLy8gcmVtb3ZlIGNvbG9uIGZyb20gc2VydmljZSBjYWxsIG5hbWUKKyAgICAgICAgICAgIChTb21lKHN2Y19uYW1lKSwgc3ZjX2NhbGwpCisgICAgICAgIH0pCisgICAgICAgIC5vcl9lbHNlKHx8IFNvbWUoKE5vbmUsIGlkZW50X25hbWUpKSkKKyAgICAgICAgLnVud3JhcCgpCit9CisKK2ZuIG1pc3NpbmdfcHJvY2Vzc29yX21lc3NhZ2Uoc3ZjX25hbWU6IE9wdGlvbjwmc3RyPikgLT4gU3RyaW5nIHsKKyAgICBtYXRjaCBzdmNfbmFtZSB7CisgICAgICAgIFNvbWUobmFtZSkgPT4gZm9ybWF0ISgibm8gcHJvY2Vzc29yIGZvdW5kIGZvciBzZXJ2aWNlIHt9IiwgbmFtZSksCisgICAgICAgIE5vbmUgPT4gTUlTU0lOR19TRVBBUkFUT1JfQU5EX05PX0RFRkFVTFQudG9fb3duZWQoKSwKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3RkOjpjb252ZXJ0OjpJbnRvOworICAgIHVzZSBzdGQ6OnN5bmM6OmF0b21pYzo6e0F0b21pY0Jvb2wsIE9yZGVyaW5nfTsKKyAgICB1c2Ugc3RkOjpzeW5jOjpBcmM7CisKKyAgICB1c2UgcHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeU91dHB1dFByb3RvY29sLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZX07CisgICAgdXNlIHRyYW5zcG9ydDo6e1JlYWRIYWxmLCBUQnVmZmVyQ2hhbm5lbCwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKyAgICB1c2Uge0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfc3BsaXRfbmFtZV9pbnRvX3Byb3Blcl9zZXBhcmF0b3JfYW5kX3NlcnZpY2VfY2FsbCgpIHsKKyAgICAgICAgbGV0IGlkZW50X25hbWUgPSAiZm9vOmJhcl9jYWxsIjsKKyAgICAgICAgbGV0IChzZXJ2LCBjYWxsKSA9IHNwbGl0X2lkZW50X25hbWUoJmlkZW50X25hbWUpOworICAgICAgICBhc3NlcnRfZXEhKHNlcnYsIFNvbWUoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShjYWxsLCAiYmFyX2NhbGwiKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3JldHVybl9mdWxsX2lkZW50X2lmX25vX3NlcGFyYXRvcl9leGlzdHMoKSB7CisgICAgICAgIGxldCBpZGVudF9uYW1lID0gImJhcl9jYWxsIjsKKyAgICAgICAgbGV0IChzZXJ2LCBjYWxsKSA9IHNwbGl0X2lkZW50X25hbWUoJmlkZW50X25hbWUpOworICAgICAgICBhc3NlcnRfZXEhKHNlcnYsIE5vbmUpOworICAgICAgICBhc3NlcnRfZXEhKGNhbGwsICJiYXJfY2FsbCIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfd3JpdGVfZXJyb3JfaWZfbm9fc2VwYXJhdG9yX2ZvdW5kX2FuZF9ub19kZWZhdWx0X3Byb2Nlc3Nvcl9leGlzdHMoKSB7CisgICAgICAgIGxldCAobXV0IGksIG11dCBvKSA9IGJ1aWxkX29iamVjdHMoKTsKKworICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEwKTsKKyAgICAgICAgby53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS51bndyYXAoKTsKKyAgICAgICAgby5mbHVzaCgpLnVud3JhcCgpOworICAgICAgICBvLnRyYW5zcG9ydC5jb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigpOworICAgICAgICBvLnRyYW5zcG9ydC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICBsZXQgcCA9IFRNdWx0aXBsZXhlZFByb2Nlc3Nvcjo6bmV3KCk7CisgICAgICAgIHAucHJvY2VzcygmbXV0IGksICZtdXQgbykudW53cmFwKCk7IC8vIGF0IHRoaXMgcG9pbnQgYW4gZXJyb3Igc2hvdWxkIGJlIHdyaXR0ZW4gb3V0CisKKyAgICAgICAgaS50cmFuc3BvcnQuc2V0X3JlYWRhYmxlX2J5dGVzKCZvLnRyYW5zcG9ydC53cml0ZV9ieXRlcygpKTsKKyAgICAgICAgbGV0IHJjdmRfaWRlbnQgPSBpLnJlYWRfbWVzc2FnZV9iZWdpbigpLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiZm9vIiwgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24sIDEwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyY3ZkX2lkZW50LCBleHBlY3RlZF9pZGVudCk7CisgICAgICAgIGxldCByY3ZkX2VyciA9IDo6RXJyb3I6OnJlYWRfYXBwbGljYXRpb25fZXJyb3JfZnJvbV9pbl9wcm90b2NvbCgmbXV0IGkpLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfZXJyID0gQXBwbGljYXRpb25FcnJvcjo6bmV3KAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBNSVNTSU5HX1NFUEFSQVRPUl9BTkRfTk9fREVGQVVMVCwKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyY3ZkX2VyciwgZXhwZWN0ZWRfZXJyKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3dyaXRlX2Vycm9yX2lmX3NlcGFyYXRvcl9leGlzdHNfYW5kX25vX3Byb2Nlc3Nvcl9mb3VuZCgpIHsKKyAgICAgICAgbGV0IChtdXQgaSwgbXV0IG8pID0gYnVpbGRfb2JqZWN0cygpOworCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIm1pc3Npbmc6Y2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTApOworICAgICAgICBvLndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLnVud3JhcCgpOworICAgICAgICBvLmZsdXNoKCkudW53cmFwKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIGxldCBwID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgcC5wcm9jZXNzKCZtdXQgaSwgJm11dCBvKS51bndyYXAoKTsgLy8gYXQgdGhpcyBwb2ludCBhbiBlcnJvciBzaG91bGQgYmUgd3JpdHRlbiBvdXQKKworICAgICAgICBpLnRyYW5zcG9ydC5zZXRfcmVhZGFibGVfYnl0ZXMoJm8udHJhbnNwb3J0LndyaXRlX2J5dGVzKCkpOworICAgICAgICBsZXQgcmN2ZF9pZGVudCA9IGkucmVhZF9tZXNzYWdlX2JlZ2luKCkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJtaXNzaW5nOmNhbGwiLCBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiwgMTApOworICAgICAgICBhc3NlcnRfZXEhKHJjdmRfaWRlbnQsIGV4cGVjdGVkX2lkZW50KTsKKyAgICAgICAgbGV0IHJjdmRfZXJyID0gOjpFcnJvcjo6cmVhZF9hcHBsaWNhdGlvbl9lcnJvcl9mcm9tX2luX3Byb3RvY29sKCZtdXQgaSkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9lcnIgPSBBcHBsaWNhdGlvbkVycm9yOjpuZXcoCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1pc3NpbmdfcHJvY2Vzc29yX21lc3NhZ2UoU29tZSgibWlzc2luZyIpKSwKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyY3ZkX2VyciwgZXhwZWN0ZWRfZXJyKTsKKyAgICB9CisKKyAgICAjW2Rlcml2ZShEZWZhdWx0KV0KKyAgICBzdHJ1Y3QgU2VydmljZSB7CisgICAgICAgIHB1YiBpbnZva2VkOiBBcmM8QXRvbWljQm9vbD4sCisgICAgfQorCisgICAgaW1wbCBUUHJvY2Vzc29yIGZvciBTZXJ2aWNlIHsKKyAgICAgICAgZm4gcHJvY2Vzcygmc2VsZiwgXzogJm11dCBUSW5wdXRQcm90b2NvbCwgXzogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICAgICBsZXQgcmVzID0gc2VsZgorICAgICAgICAgICAgICAgIC5pbnZva2VkCisgICAgICAgICAgICAgICAgLmNvbXBhcmVfYW5kX3N3YXAoZmFsc2UsIHRydWUsIE9yZGVyaW5nOjpSZWxheGVkKTsKKyAgICAgICAgICAgIGlmIHJlcyB7CisgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEVycigiZmFpbGVkIHN3YXAiLmludG8oKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfcm91dGVfY2FsbF90b19jb3JyZWN0X3Byb2Nlc3NvcigpIHsKKyAgICAgICAgbGV0IChtdXQgaSwgbXV0IG8pID0gYnVpbGRfb2JqZWN0cygpOworCisgICAgICAgIC8vIGJ1aWxkIHRoZSBzZXJ2aWNlcworICAgICAgICBsZXQgc3ZjXzEgPSBTZXJ2aWNlIHsKKyAgICAgICAgICAgIGludm9rZWQ6IEFyYzo6bmV3KEF0b21pY0Jvb2w6Om5ldyhmYWxzZSkpLAorICAgICAgICB9OworICAgICAgICBsZXQgYXRtXzEgPSBzdmNfMS5pbnZva2VkLmNsb25lKCk7CisgICAgICAgIGxldCBzdmNfMiA9IFNlcnZpY2UgeworICAgICAgICAgICAgaW52b2tlZDogQXJjOjpuZXcoQXRvbWljQm9vbDo6bmV3KGZhbHNlKSksCisgICAgICAgIH07CisgICAgICAgIGxldCBhdG1fMiA9IHN2Y18yLmludm9rZWQuY2xvbmUoKTsKKworICAgICAgICAvLyByZWdpc3RlciB0aGVtCisgICAgICAgIGxldCBtdXQgcCA9IFRNdWx0aXBsZXhlZFByb2Nlc3Nvcjo6bmV3KCk7CisgICAgICAgIHAucmVnaXN0ZXIoInNlcnZpY2VfMSIsIEJveDo6bmV3KHN2Y18xKSwgZmFsc2UpLnVud3JhcCgpOworICAgICAgICBwLnJlZ2lzdGVyKCJzZXJ2aWNlXzIiLCBCb3g6Om5ldyhzdmNfMiksIGZhbHNlKS51bndyYXAoKTsKKworICAgICAgICAvLyBtYWtlIHRoZSBzZXJ2aWNlIGNhbGwKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygic2VydmljZV8xOmNhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEwKTsKKyAgICAgICAgby53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS51bndyYXAoKTsKKyAgICAgICAgby5mbHVzaCgpLnVud3JhcCgpOworICAgICAgICBvLnRyYW5zcG9ydC5jb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigpOworICAgICAgICBvLnRyYW5zcG9ydC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICBwLnByb2Nlc3MoJm11dCBpLCAmbXV0IG8pLnVud3JhcCgpOworCisgICAgICAgIC8vIHNlcnZpY2UgMSBzaG91bGQgaGF2ZSBiZWVuIGludm9rZWQsIG5vdCBzZXJ2aWNlIDIKKyAgICAgICAgYXNzZXJ0X2VxIShhdG1fMS5sb2FkKE9yZGVyaW5nOjpSZWxheGVkKSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydF9lcSEoYXRtXzIubG9hZChPcmRlcmluZzo6UmVsYXhlZCksIGZhbHNlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3JvdXRlX2NhbGxfdG9fY29ycmVjdF9wcm9jZXNzb3JfaWZfbm9fc2VwYXJhdG9yX2V4aXN0c19hbmRfZGVmYXVsdF9wcm9jZXNzb3Jfc2V0KCkgeworICAgICAgICBsZXQgKG11dCBpLCBtdXQgbykgPSBidWlsZF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIHNlcnZpY2VzCisgICAgICAgIGxldCBzdmNfMSA9IFNlcnZpY2UgeworICAgICAgICAgICAgaW52b2tlZDogQXJjOjpuZXcoQXRvbWljQm9vbDo6bmV3KGZhbHNlKSksCisgICAgICAgIH07CisgICAgICAgIGxldCBhdG1fMSA9IHN2Y18xLmludm9rZWQuY2xvbmUoKTsKKyAgICAgICAgbGV0IHN2Y18yID0gU2VydmljZSB7CisgICAgICAgICAgICBpbnZva2VkOiBBcmM6Om5ldyhBdG9taWNCb29sOjpuZXcoZmFsc2UpKSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGF0bV8yID0gc3ZjXzIuaW52b2tlZC5jbG9uZSgpOworCisgICAgICAgIC8vIHJlZ2lzdGVyIHRoZW0KKyAgICAgICAgbGV0IG11dCBwID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgcC5yZWdpc3Rlcigic2VydmljZV8xIiwgQm94OjpuZXcoc3ZjXzEpLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgIHAucmVnaXN0ZXIoInNlcnZpY2VfMiIsIEJveDo6bmV3KHN2Y18yKSwgdHJ1ZSkudW53cmFwKCk7IC8vIHNlY29uZCBwcm9jZXNzb3IgaXMgZGVmYXVsdAorCisgICAgICAgIC8vIG1ha2UgdGhlIHNlcnZpY2UgY2FsbCAoaXQncyBhbiBvbGQgY2xpZW50LCBzbyB3ZSBoYXZlIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlKQorICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJvbGRfY2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTApOworICAgICAgICBvLndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLnVud3JhcCgpOworICAgICAgICBvLmZsdXNoKCkudW53cmFwKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIHAucHJvY2VzcygmbXV0IGksICZtdXQgbykudW53cmFwKCk7CisKKyAgICAgICAgLy8gc2VydmljZSAyIHNob3VsZCBoYXZlIGJlZW4gaW52b2tlZCwgbm90IHNlcnZpY2UgMQorICAgICAgICBhc3NlcnRfZXEhKGF0bV8xLmxvYWQoT3JkZXJpbmc6OlJlbGF4ZWQpLCBmYWxzZSk7CisgICAgICAgIGFzc2VydF9lcSEoYXRtXzIubG9hZChPcmRlcmluZzo6UmVsYXhlZCksIHRydWUpOworICAgIH0KKworICAgIGZuIGJ1aWxkX29iamVjdHMoKSAtPiAoCisgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sPFJlYWRIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICApIHsKKyAgICAgICAgbGV0IGMgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMjgsIDEyOCk7CisgICAgICAgIGxldCAocl9jLCB3X2MpID0gYy5zcGxpdCgpLnVud3JhcCgpOworICAgICAgICAoCisgICAgICAgICAgICBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KHJfYywgdHJ1ZSksCisgICAgICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyh3X2MsIHRydWUpLAorICAgICAgICApCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9zZXJ2ZXIvdGhyZWFkZWQucnMgYi9saWIvcnMvc3JjL3NlcnZlci90aHJlYWRlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTM5YTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9zZXJ2ZXIvdGhyZWFkZWQucnMKQEAgLTAsMCArMSwyMzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6bmV0Ojp7VGNwTGlzdGVuZXIsIFRjcFN0cmVhbX07Cit1c2Ugc3RkOjpzeW5jOjpBcmM7Cit1c2UgdGhyZWFkcG9vbDo6VGhyZWFkUG9vbDsKKwordXNlIHByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKK3VzZSB0cmFuc3BvcnQ6OntUSW9DaGFubmVsLCBUUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRUY3BDaGFubmVsLCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKK3VzZSB7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmR9OworCit1c2Ugc3VwZXI6OlRQcm9jZXNzb3I7CisKKy8vLyBGaXhlZC1zaXplIHRocmVhZC1wb29sIGJsb2NraW5nIFRocmlmdCBzZXJ2ZXIuCisvLy8KKy8vLyBBIGBUU2VydmVyYCBsaXN0ZW5zIG9uIGEgZ2l2ZW4gYWRkcmVzcyBhbmQgc3VibWl0cyBhY2NlcHRlZCBjb25uZWN0aW9ucworLy8vIHRvIGFuICoqdW5ib3VuZGVkKiogcXVldWUuIENvbm5lY3Rpb25zIGZyb20gdGhpcyBxdWV1ZSBhcmUgc2VydmljZWQgYnkKKy8vLyB0aGUgZmlyc3QgYXZhaWxhYmxlIHdvcmtlciB0aHJlYWQgZnJvbSBhICoqZml4ZWQtc2l6ZSoqIHRocmVhZCBwb29sLiBFYWNoCisvLy8gYWNjZXB0ZWQgY29ubmVjdGlvbiBpcyBoYW5kbGVkIGJ5IHRoYXQgd29ya2VyIHRocmVhZCwgYW5kIGNvbW11bmljYXRpb24KKy8vLyBvdmVyIHRoaXMgdGhyZWFkIG9jY3VycyBzZXF1ZW50aWFsbHkgYW5kIHN5bmNocm9ub3VzbHkgKGkuZS4gY2FsbHMgYmxvY2spLgorLy8vIEFjY2VwdGVkIGNvbm5lY3Rpb25zIGhhdmUgYW4gaW5wdXQgaGFsZiBhbmQgYW4gb3V0cHV0IGhhbGYsIGVhY2ggb2Ygd2hpY2gKKy8vLyB1c2VzIGEgYFRUcmFuc3BvcnRgIGFuZCBgVElucHV0UHJvdG9jb2xgL2BUT3V0cHV0UHJvdG9jb2xgIHRvIHRyYW5zbGF0ZQorLy8vIG1lc3NhZ2VzIHRvIGFuZCBmcm9tIGJ5ZXMuIEFueSBjb21iaW5hdGlvbiBvZiBgVElucHV0UHJvdG9jb2xgLCBgVE91dHB1dFByb3RvY29sYAorLy8vIGFuZCBgVFRyYW5zcG9ydGAgbWF5IGJlIHVzZWQuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGluZyBhbmQgcnVubmluZyBhIGBUU2VydmVyYCB1c2luZyBUaHJpZnQtY29tcGlsZXItZ2VuZXJhdGVkCisvLy8gc2VydmljZSBjb2RlLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sRmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnksIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnl9OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICBUUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnl9OworLy8vIHVzZSB0aHJpZnQ6OnNlcnZlcjo6e1RQcm9jZXNzb3IsIFRTZXJ2ZXJ9OworLy8vCisvLy8gLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZAorLy8vIC8vCisvLy8KKy8vLyAvLyBwcm9jZXNzb3IgZm9yIGBTaW1wbGVTZXJ2aWNlYAorLy8vIHN0cnVjdCBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvcjsKKy8vLyBpbXBsIFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gbmV3PEg6IFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlcj4ocHJvY2Vzc29yOiBIKSAtPiBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gYFRQcm9jZXNzb3JgIGltcGxlbWVudGF0aW9uIGZvciBgU2ltcGxlU2VydmljZWAKKy8vLyBpbXBsIFRQcm9jZXNzb3IgZm9yIFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gcHJvY2Vzcygmc2VsZiwgaTogJm11dCBUSW5wdXRQcm90b2NvbCwgbzogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gc2VydmljZSBmdW5jdGlvbnMgZm9yIFNpbXBsZVNlcnZpY2UKKy8vLyB0cmFpdCBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXIgeworLy8vICAgICBmbiBzZXJ2aWNlX2NhbGwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPjsKKy8vLyB9CisvLy8KKy8vLyAvLworLy8vIC8vIHVzZXItY29kZSBmb2xsb3dzCisvLy8gLy8KKy8vLworLy8vIC8vIGRlZmluZSBhIGhhbmRsZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbiBgc2VydmljZV9jYWxsYCBpcyByZWNlaXZlZAorLy8vIHN0cnVjdCBTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGw7CisvLy8gaW1wbCBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbCB7CisvLy8gICAgIGZuIHNlcnZpY2VfY2FsbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yCisvLy8gbGV0IHByb2Nlc3NvciA9IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsIHt9KTsKKy8vLworLy8vIC8vIGluc3RhbnRpYXRlIHRoZSBzZXJ2ZXIKKy8vLyBsZXQgaV90cl9mYWN0OiBCb3g8VFJlYWRUcmFuc3BvcnRGYWN0b3J5PiA9IEJveDo6bmV3KFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSk7CisvLy8gbGV0IGlfcHJfZmFjdDogQm94PFRJbnB1dFByb3RvY29sRmFjdG9yeT4gPSBCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKTsKKy8vLyBsZXQgb190cl9mYWN0OiBCb3g8VFdyaXRlVHJhbnNwb3J0RmFjdG9yeT4gPSBCb3g6Om5ldyhUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKTsKKy8vLyBsZXQgb19wcl9mYWN0OiBCb3g8VE91dHB1dFByb3RvY29sRmFjdG9yeT4gPSBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSk7CisvLy8KKy8vLyBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKy8vLyAgICAgaV90cl9mYWN0LAorLy8vICAgICBpX3ByX2ZhY3QsCisvLy8gICAgIG9fdHJfZmFjdCwKKy8vLyAgICAgb19wcl9mYWN0LAorLy8vICAgICBwcm9jZXNzb3IsCisvLy8gICAgIDEwCisvLy8gKTsKKy8vLworLy8vIC8vIHN0YXJ0IGxpc3RlbmluZyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMKKy8vLyBtYXRjaCBzZXJ2ZXIubGlzdGVuKCIxMjcuMC4wLjE6ODA4MCIpIHsKKy8vLyAgIE9rKF8pICA9PiBwcmludGxuISgibGlzdGVuIGNvbXBsZXRlZCIpLAorLy8vICAgRXJyKGUpID0+IHByaW50bG4hKCJsaXN0ZW4gZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpLAorLy8vIH0KKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVFNlcnZlcjxQUkMsIFJURiwgSVBGLCBXVEYsIE9QRj4KK3doZXJlCisgICAgUFJDOiBUUHJvY2Vzc29yICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIHJfdHJhbnNfZmFjdG9yeTogUlRGLAorICAgIGlfcHJvdG9fZmFjdG9yeTogSVBGLAorICAgIHdfdHJhbnNfZmFjdG9yeTogV1RGLAorICAgIG9fcHJvdG9fZmFjdG9yeTogT1BGLAorICAgIHByb2Nlc3NvcjogQXJjPFBSQz4sCisgICAgd29ya2VyX3Bvb2w6IFRocmVhZFBvb2wsCit9CisKK2ltcGw8UFJDLCBSVEYsIElQRiwgV1RGLCBPUEY+IFRTZXJ2ZXI8UFJDLCBSVEYsIElQRiwgV1RGLCBPUEY+Cit3aGVyZQorICAgIFBSQzogVFByb2Nlc3NvciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICBSVEY6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgSVBGOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAorICAgIFdURjogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgT1BGOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRTZXJ2ZXJgLgorICAgIC8vLworICAgIC8vLyBFYWNoIGFjY2VwdGVkIGNvbm5lY3Rpb24gaGFzIGFuIGlucHV0IGFuZCBvdXRwdXQgaGFsZiwgZWFjaCBvZiB3aGljaAorICAgIC8vLyByZXF1aXJlcyBhIGBUVHJhbnNwb3J0YCBhbmQgYFRQcm90b2NvbGAuIGBUU2VydmVyYCB1c2VzCisgICAgLy8vIGByZWFkX3RyYW5zcG9ydF9mYWN0b3J5YCBhbmQgYGlucHV0X3Byb3RvY29sX2ZhY3RvcnlgIHRvIGNyZWF0ZQorICAgIC8vLyBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBpbnB1dCwgYW5kIGB3cml0ZV90cmFuc3BvcnRfZmFjdG9yeWAgYW5kCisgICAgLy8vIGBvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeWAgdG8gY3JlYXRlIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIG91dHB1dC4KKyAgICBwdWIgZm4gbmV3KAorICAgICAgICByZWFkX3RyYW5zcG9ydF9mYWN0b3J5OiBSVEYsCisgICAgICAgIGlucHV0X3Byb3RvY29sX2ZhY3Rvcnk6IElQRiwKKyAgICAgICAgd3JpdGVfdHJhbnNwb3J0X2ZhY3Rvcnk6IFdURiwKKyAgICAgICAgb3V0cHV0X3Byb3RvY29sX2ZhY3Rvcnk6IE9QRiwKKyAgICAgICAgcHJvY2Vzc29yOiBQUkMsCisgICAgICAgIG51bV93b3JrZXJzOiB1c2l6ZSwKKyAgICApIC0+IFRTZXJ2ZXI8UFJDLCBSVEYsIElQRiwgV1RGLCBPUEY+IHsKKyAgICAgICAgVFNlcnZlciB7CisgICAgICAgICAgICByX3RyYW5zX2ZhY3Rvcnk6IHJlYWRfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBpX3Byb3RvX2ZhY3Rvcnk6IGlucHV0X3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICB3X3RyYW5zX2ZhY3Rvcnk6IHdyaXRlX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgb19wcm90b19mYWN0b3J5OiBvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHByb2Nlc3NvcjogQXJjOjpuZXcocHJvY2Vzc29yKSwKKyAgICAgICAgICAgIHdvcmtlcl9wb29sOiBUaHJlYWRQb29sOjp3aXRoX25hbWUoIlRocmlmdCBzZXJ2aWNlIHByb2Nlc3NvciIudG9fb3duZWQoKSwgbnVtX3dvcmtlcnMpLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIExpc3RlbiBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgb24gYGxpc3Rlbl9hZGRyZXNzYC4KKyAgICAvLy8KKyAgICAvLy8gYGxpc3Rlbl9hZGRyZXNzYCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gYGhvc3Q6cG9ydGAsCisgICAgLy8vIGZvciBleGFtcGxlOiBgMTI3LjAuMC4xOjgwODBgLgorICAgIC8vLworICAgIC8vLyBSZXR1cm4gYCgpYCBpZiBzdWNjZXNzZnVsLgorICAgIC8vLworICAgIC8vLyBSZXR1cm4gYEVycmAgd2hlbiB0aGUgc2VydmVyIGNhbm5vdCBiaW5kIHRvIGBsaXN0ZW5fYWRkcmVzc2Agb3IgdGhlcmUKKyAgICAvLy8gaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICBwdWIgZm4gbGlzdGVuKCZtdXQgc2VsZiwgbGlzdGVuX2FkZHJlc3M6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBsaXN0ZW5lciA9IFRjcExpc3RlbmVyOjpiaW5kKGxpc3Rlbl9hZGRyZXNzKT87CisgICAgICAgIGZvciBzdHJlYW0gaW4gbGlzdGVuZXIuaW5jb21pbmcoKSB7CisgICAgICAgICAgICBtYXRjaCBzdHJlYW0geworICAgICAgICAgICAgICAgIE9rKHMpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IChpX3Byb3QsIG9fcHJvdCkgPSBzZWxmLm5ld19wcm90b2NvbHNfZm9yX2Nvbm5lY3Rpb24ocyk/OworICAgICAgICAgICAgICAgICAgICBsZXQgcHJvY2Vzc29yID0gc2VsZi5wcm9jZXNzb3IuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53b3JrZXJfcG9vbAorICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUobW92ZSB8fCBoYW5kbGVfaW5jb21pbmdfY29ubmVjdGlvbihwcm9jZXNzb3IsIGlfcHJvdCwgb19wcm90KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHdhcm4hKCJmYWlsZWQgdG8gYWNjZXB0IHJlbW90ZSBjb25uZWN0aW9uIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEVycig6OkVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogImFib3J0ZWQgbGlzdGVuIGxvb3AiLmludG8oKSwKKyAgICAgICAgfSkpCisgICAgfQorCisgICAgZm4gbmV3X3Byb3RvY29sc19mb3JfY29ubmVjdGlvbigKKyAgICAgICAgJm11dCBzZWxmLAorICAgICAgICBzdHJlYW06IFRjcFN0cmVhbSwKKyAgICApIC0+IDo6UmVzdWx0PChCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPiwgQm94PFRPdXRwdXRQcm90b2NvbCArIFNlbmQ+KT4geworICAgICAgICAvLyBjcmVhdGUgdGhlIHNoYXJlZCB0Y3Agc3RyZWFtCisgICAgICAgIGxldCBjaGFubmVsID0gVFRjcENoYW5uZWw6OndpdGhfc3RyZWFtKHN0cmVhbSk7CisKKyAgICAgICAgLy8gc3BsaXQgaXQgaW50byB0d28gLSBvbmUgdG8gYmUgb3duZWQgYnkgdGhlCisgICAgICAgIC8vIGlucHV0IHRyYW4vcHJvdG8gYW5kIHRoZSBvdGhlciBieSB0aGUgb3V0cHV0CisgICAgICAgIGxldCAocl9jaGFuLCB3X2NoYW4pID0gY2hhbm5lbC5zcGxpdCgpPzsKKworICAgICAgICAvLyBpbnB1dCBwcm90b2NvbCBhbmQgdHJhbnNwb3J0CisgICAgICAgIGxldCByX3RyYW4gPSBzZWxmLnJfdHJhbnNfZmFjdG9yeS5jcmVhdGUoQm94OjpuZXcocl9jaGFuKSk7CisgICAgICAgIGxldCBpX3Byb3QgPSBzZWxmLmlfcHJvdG9fZmFjdG9yeS5jcmVhdGUocl90cmFuKTsKKworICAgICAgICAvLyBvdXRwdXQgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydAorICAgICAgICBsZXQgd190cmFuID0gc2VsZi53X3RyYW5zX2ZhY3RvcnkuY3JlYXRlKEJveDo6bmV3KHdfY2hhbikpOworICAgICAgICBsZXQgb19wcm90ID0gc2VsZi5vX3Byb3RvX2ZhY3RvcnkuY3JlYXRlKHdfdHJhbik7CisKKyAgICAgICAgT2soKGlfcHJvdCwgb19wcm90KSkKKyAgICB9Cit9CisKK2ZuIGhhbmRsZV9pbmNvbWluZ19jb25uZWN0aW9uPFBSQz4oCisgICAgcHJvY2Vzc29yOiBBcmM8UFJDPiwKKyAgICBpX3Byb3Q6IEJveDxUSW5wdXRQcm90b2NvbD4sCisgICAgb19wcm90OiBCb3g8VE91dHB1dFByb3RvY29sPiwKKykgd2hlcmUKKyAgICBQUkM6IFRQcm9jZXNzb3IsCit7CisgICAgbGV0IG11dCBpX3Byb3QgPSBpX3Byb3Q7CisgICAgbGV0IG11dCBvX3Byb3QgPSBvX3Byb3Q7CisgICAgbG9vcCB7CisgICAgICAgIGxldCByID0gcHJvY2Vzc29yLnByb2Nlc3MoJm11dCAqaV9wcm90LCAmbXV0ICpvX3Byb3QpOworICAgICAgICBpZiBsZXQgRXJyKGUpID0gciB7CisgICAgICAgICAgICB3YXJuISgicHJvY2Vzc29yIGNvbXBsZXRlZCB3aXRoIGVycm9yOiB7Oj99IiwgZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2J1ZmZlcmVkLnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvYnVmZmVyZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjZmVmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2J1ZmZlcmVkLnJzCkBAIC0wLDAgKzEsNDgzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNtcDsKK3VzZSBzdGQ6OmlvOwordXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisKK3VzZSBzdXBlcjo6e1RSZWFkVHJhbnNwb3J0LCBUUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRXcml0ZVRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07CisKKy8vLyBEZWZhdWx0IGNhcGFjaXR5IG9mIHRoZSByZWFkIGJ1ZmZlciBpbiBieXRlcy4KK2NvbnN0IFJFQURfQ0FQQUNJVFk6IHVzaXplID0gNDA5NjsKKworLy8vIERlZmF1bHQgY2FwYWNpdHkgb2YgdGhlIHdyaXRlIGJ1ZmZlciBpbiBieXRlcy4uCitjb25zdCBXUklURV9DQVBBQ0lUWTogdXNpemUgPSA0MDk2OworCisvLy8gVHJhbnNwb3J0IHRoYXQgcmVhZHMgbWVzc2FnZXMgdmlhIGFuIGludGVybmFsIGJ1ZmZlci4KKy8vLworLy8vIEEgYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRgIG1haW50YWlucyBhIGZpeGVkLXNpemUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCisvLy8gT24gYSBjYWxsIHRvIGBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpyZWFkKC4uLilgIG9uZSBmdWxsIG1lc3NhZ2UgLSBib3RoCisvLy8gZml4ZWQtbGVuZ3RoIGhlYWRlciBhbmQgYnl0ZXMgLSBpcyByZWFkIGZyb20gdGhlIHdyYXBwZWQgY2hhbm5lbCBhbmQgYnVmZmVyZWQuCisvLy8gU3Vic2VxdWVudCByZWFkIGNhbGxzIGFyZSBzZXJ2aWNlZCBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXIgdW50aWwgaXQgaXMKKy8vLyBleGhhdXN0ZWQsIGF0IHdoaWNoIHBvaW50IHRoZSBuZXh0IGZ1bGwgbWVzc2FnZSBpcyByZWFkIGZyb20gdGhlIHdyYXBwZWQKKy8vLyBjaGFubmVsLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6UmVhZDsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUQnVmZmVyZWRSZWFkVHJhbnNwb3J0LCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KGMpOworLy8vCisvLy8gdC5yZWFkKCZtdXQgdmVjIVswdTg7IDFdKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGJ1ZjogQm94PFt1OF0+LAorICAgIHBvczogdXNpemUsCisgICAgY2FwOiB1c2l6ZSwKKyAgICBjaGFuOiBDLAorfQorCitpbXBsPEM+IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFRyYW5zcG9ydGAgd2l0aCBkZWZhdWx0LXNpemVkIGludGVybmFsIHJlYWQgYW5kCisgICAgLy8vIHdyaXRlIGJ1ZmZlcnMgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiBuZXcoY2hhbm5lbDogQykgLT4gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoUkVBRF9DQVBBQ0lUWSwgY2hhbm5lbCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFRyYW5zcG9ydGAgd2l0aCBhbiBpbnRlcm5hbCByZWFkIGJ1ZmZlciBvZiBzaXplCisgICAgLy8vIGByZWFkX2NhcGFjaXR5YCBhbmQgYW4gaW50ZXJuYWwgd3JpdGUgYnVmZmVyIG9mIHNpemUKKyAgICAvLy8gYHdyaXRlX2NhcGFjaXR5YCB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkocmVhZF9jYXBhY2l0eTogdXNpemUsIGNoYW5uZWw6IEMpIC0+IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ8Qz4geworICAgICAgICBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0IHsKKyAgICAgICAgICAgIGJ1ZjogdmVjIVswOyByZWFkX2NhcGFjaXR5XS5pbnRvX2JveGVkX3NsaWNlKCksCisgICAgICAgICAgICBwb3M6IDAsCisgICAgICAgICAgICBjYXA6IDAsCisgICAgICAgICAgICBjaGFuOiBjaGFubmVsLAorICAgICAgICB9CisgICAgfQorCisgICAgZm4gZ2V0X2J5dGVzKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwmW3U4XT4geworICAgICAgICBpZiBzZWxmLmNhcCAtIHNlbGYucG9zID09IDAgeworICAgICAgICAgICAgc2VsZi5wb3MgPSAwOworICAgICAgICAgICAgc2VsZi5jYXAgPSBzZWxmLmNoYW4ucmVhZCgmbXV0IHNlbGYuYnVmKT87CisgICAgICAgIH0KKworICAgICAgICBPaygmc2VsZi5idWZbc2VsZi5wb3MuLnNlbGYuY2FwXSkKKyAgICB9CisKKyAgICBmbiBjb25zdW1lKCZtdXQgc2VsZiwgY29uc3VtZWQ6IHVzaXplKSB7CisgICAgICAgIC8vIFRPRE86IHdhcyBhIGJ1ZyBoZXJlICs9IDwtLSB0ZXN0IHNvbWVob3cKKyAgICAgICAgc2VsZi5wb3MgPSBjbXA6Om1pbihzZWxmLmNhcCwgc2VsZi5wb3MgKyBjb25zdW1lZCk7CisgICAgfQorfQorCitpbXBsPEM+IFJlYWQgZm9yIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYnVmOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgbGV0IG11dCBieXRlc19yZWFkID0gMDsKKworICAgICAgICBsb29wIHsKKyAgICAgICAgICAgIGxldCBucmVhZCA9IHsKKyAgICAgICAgICAgICAgICBsZXQgYXZhaWxfYnl0ZXMgPSBzZWxmLmdldF9ieXRlcygpPzsKKyAgICAgICAgICAgICAgICBsZXQgYXZhaWxfc3BhY2UgPSBidWYubGVuKCkgLSBieXRlc19yZWFkOworICAgICAgICAgICAgICAgIGxldCBucmVhZCA9IGNtcDo6bWluKGF2YWlsX3NwYWNlLCBhdmFpbF9ieXRlcy5sZW4oKSk7CisgICAgICAgICAgICAgICAgYnVmW2J5dGVzX3JlYWQuLihieXRlc19yZWFkICsgbnJlYWQpXS5jb3B5X2Zyb21fc2xpY2UoJmF2YWlsX2J5dGVzWy4ubnJlYWRdKTsKKyAgICAgICAgICAgICAgICBucmVhZAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2VsZi5jb25zdW1lKG5yZWFkKTsKKyAgICAgICAgICAgIGJ5dGVzX3JlYWQgKz0gbnJlYWQ7CisKKyAgICAgICAgICAgIGlmIGJ5dGVzX3JlYWQgPT0gYnVmLmxlbigpIHx8IG5yZWFkID09IDAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgT2soYnl0ZXNfcmVhZCkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5OworCitpbXBsIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWIgZm4gbmV3KCkgLT4gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgICAgICBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgZm9yIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFJlYWQgKyBTZW5kPikgLT4gQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcoY2hhbm5lbCkpCisgICAgfQorfQorCisvLy8gVHJhbnNwb3J0IHRoYXQgd3JpdGVzIG1lc3NhZ2VzIHZpYSBhbiBpbnRlcm5hbCBidWZmZXIuCisvLy8KKy8vLyBBIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydGAgbWFpbnRhaW5zIGEgZml4ZWQtc2l6ZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIuCisvLy8gQWxsIHdyaXRlcyBhcmUgbWFkZSB0byB0aGlzIGJ1ZmZlciBhbmQgYXJlIHNlbnQgdG8gdGhlIHdyYXBwZWQgY2hhbm5lbCBvbmx5CisvLy8gd2hlbiBgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OmZsdXNoKClgIGlzIGNhbGxlZC4gT24gYSBmbHVzaCBhIGZpeGVkLWxlbmd0aAorLy8vIGhlYWRlciB3aXRoIGEgY291bnQgb2YgdGhlIGJ1ZmZlcmVkIGJ5dGVzIGlzIHdyaXR0ZW4sIGZvbGxvd2VkIGJ5IHRoZSBieXRlcworLy8vIHRoZW1zZWx2ZXMuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6V3JpdGU7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KGMpOworLy8vCisvLy8gdC53cml0ZSgmWzB4MDBdKS51bndyYXAoKTsKKy8vLyB0LmZsdXNoKCkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGJ1ZjogVmVjPHU4PiwKKyAgICBjYXA6IHVzaXplLAorICAgIGNoYW5uZWw6IEMsCit9CisKK2ltcGw8Qz4gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRUcmFuc3BvcnRgIHdpdGggZGVmYXVsdC1zaXplZCBpbnRlcm5hbCByZWFkIGFuZAorICAgIC8vLyB3cml0ZSBidWZmZXJzIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gbmV3KGNoYW5uZWw6IEMpIC0+IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoV1JJVEVfQ0FQQUNJVFksIGNoYW5uZWwpCisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRUcmFuc3BvcnRgIHdpdGggYW4gaW50ZXJuYWwgcmVhZCBidWZmZXIgb2Ygc2l6ZQorICAgIC8vLyBgcmVhZF9jYXBhY2l0eWAgYW5kIGFuIGludGVybmFsIHdyaXRlIGJ1ZmZlciBvZiBzaXplCisgICAgLy8vIGB3cml0ZV9jYXBhY2l0eWAgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiB3aXRoX2NhcGFjaXR5KHdyaXRlX2NhcGFjaXR5OiB1c2l6ZSwgY2hhbm5lbDogQykgLT4gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4geworICAgICAgICBhc3NlcnQhKAorICAgICAgICAgICAgd3JpdGVfY2FwYWNpdHkgPiAwLAorICAgICAgICAgICAgIndyaXRlIGJ1ZmZlciBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIgorICAgICAgICApOworCisgICAgICAgIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0IHsKKyAgICAgICAgICAgIGJ1ZjogVmVjOjp3aXRoX2NhcGFjaXR5KHdyaXRlX2NhcGFjaXR5KSwKKyAgICAgICAgICAgIGNhcDogd3JpdGVfY2FwYWNpdHksCisgICAgICAgICAgICBjaGFubmVsOiBjaGFubmVsLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPEM+IFdyaXRlIGZvciBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIGJ1ZjogJlt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgaWYgIWJ1Zi5pc19lbXB0eSgpIHsKKyAgICAgICAgICAgIGxldCBtdXQgYXZhaWxfYnl0ZXM7CisKKyAgICAgICAgICAgIGxvb3AgeworICAgICAgICAgICAgICAgIGF2YWlsX2J5dGVzID0gY21wOjptaW4oYnVmLmxlbigpLCBzZWxmLmNhcCAtIHNlbGYuYnVmLmxlbigpKTsKKworICAgICAgICAgICAgICAgIGlmIGF2YWlsX2J5dGVzID09IDAgeworICAgICAgICAgICAgICAgICAgICBzZWxmLmZsdXNoKCk/OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGV0IGF2YWlsX2J5dGVzID0gYXZhaWxfYnl0ZXM7CisKKyAgICAgICAgICAgIHNlbGYuYnVmLmV4dGVuZF9mcm9tX3NsaWNlKCZidWZbLi5hdmFpbF9ieXRlc10pOworICAgICAgICAgICAgYXNzZXJ0IShzZWxmLmJ1Zi5sZW4oKSA8PSBzZWxmLmNhcCwgImNvcHkgb3ZlcmZsb3dlZCBidWZmZXIiKTsKKworICAgICAgICAgICAgT2soYXZhaWxfYnl0ZXMpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPaygwKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuY2hhbm5lbC53cml0ZV9hbGwoJnNlbGYuYnVmKT87CisgICAgICAgIHNlbGYuY2hhbm5lbC5mbHVzaCgpPzsKKyAgICAgICAgc2VsZi5idWYuY2xlYXIoKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OworCitpbXBsIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHViIGZuIG5ldygpIC0+IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5IGZvciBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFdyaXRlICsgU2VuZD4pIC0+IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcoY2hhbm5lbCkpCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIHRyYW5zcG9ydDo6VEJ1ZmZlckNoYW5uZWw7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5femVyb19pZl9yZWFkX2J1ZmZlcl9pc19lbXB0eSgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxMCwgbWVtKTsKKworICAgICAgICBsZXQgbXV0IGIgPSB2ZWMhWzA7IDEwXTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYik7CisKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfY2FsbGVyX3JlYWRzX2ludG9femVyb19jYXBhY2l0eV9idWZmZXIoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMTAsIG1lbSk7CisKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgW10pOworCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl96ZXJvX2lmX25vdGhpbmdfbW9yZV9jYW5fYmVfcmVhZCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDQsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDQsIG1lbSk7CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWzAsIDEsIDIsIDNdKTsKKworICAgICAgICAvLyByZWFkIGJ1ZmZlciBpcyBleGFjdGx5IHRoZSBzYW1lIHNpemUgYXMgYnl0ZXMgYXZhaWxhYmxlCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDRdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMCwgMSwgMiwgM10pOworCisgICAgICAgIC8vIHRyeSByZWFkIGFnYWluCisgICAgICAgIGxldCBidWZfYWdhaW4gPSB2ZWMhWzB1ODsgNF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lLCAwIGJ5dGVzIGFuZCB3ZSBoYXZlbid0IGNoYW5nZWQgdGhlIGJ1ZmZlcgorICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmX2FnYWluLCAmWzAsIDAsIDAsIDBdKQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2ZpbGxfdXNlcl9idWZmZXJfd2l0aF9vbmx5X2FzX21hbnlfYnl0ZXNfYXNfYXZhaWxhYmxlKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoNCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNCwgbWVtKTsKKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbMCwgMSwgMiwgM10pOworCisgICAgICAgIC8vIHJlYWQgYnVmZmVyIGlzIG11Y2ggbGFyZ2VyIHRoYW4gdGhlIGJ5dGVzIGF2YWlsYWJsZQorICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyA4XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWy4uNF0sICZbMCwgMSwgMiwgM10pOworCisgICAgICAgIC8vIHRyeSByZWFkIGFnYWluCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zls0Li5dKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUsIDAgYnl0ZXMgYW5kIHdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgYnVmZmVyCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMCwgMSwgMiwgMywgMCwgMCwgMCwgMF0pCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9zdWNjZXNzZnVsbHkoKSB7CisgICAgICAgIC8vIHRoaXMgdGVzdCBpbnZvbHZlcyBhIGZldyBsb29wcyB3aXRoaW4gdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydAorICAgICAgICAvLyBpdHNlbGYgd2hlcmUgaXQgaGFzIHRvIGRyYWluIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpbiBvcmRlcgorICAgICAgICAvLyB0byBzZXJ2aWNlIGEgcmVhZAorCisgICAgICAgIC8vIHdlIGhhdmUgYSBtdWNoIHNtYWxsZXIgYnVmZmVyIHRoYW4gdGhlCisgICAgICAgIC8vIHVuZGVybHlpbmcgdHJhbnNwb3J0IGhhcyBieXRlcyBhdmFpbGFibGUKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgyLCBtZW0pOworCisgICAgICAgIC8vIGZpbGwgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0J3MgYnl0ZSBidWZmZXIKKyAgICAgICAgbGV0IG11dCByZWFkYWJsZV9ieXRlcyA9IFswdTg7IDEwXTsKKyAgICAgICAgZm9yIGkgaW4gMC4uMTAgeworICAgICAgICAgICAgcmVhZGFibGVfYnl0ZXNbaV0gPSBpIGFzIHU4OworICAgICAgICB9CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmcmVhZGFibGVfYnl0ZXMpOworCisgICAgICAgIC8vIHdlIGFzayB0byByZWFkIGludG8gYSBidWZmZXIgdGhhdCdzIG11Y2ggbGFyZ2VyCisgICAgICAgIC8vIHRoYW4gdGhlIG9uZSB0aGUgYnVmZmVyZWQgdHJhbnNwb3J0IGhhczsgYXMgYSByZXN1bHQKKyAgICAgICAgLy8gaXQncyBnb2luZyB0byBoYXZlIHRvIGtlZXAgYXNraW5nIHRoZSB1bmRlcmx5aW5nCisgICAgICAgIC8vIHRyYW5zcG9ydCBmb3IgbW9yZSBieXRlcworICAgICAgICBsZXQgbXV0IGJ1ZiA9IFswdTg7IDhdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworCisgICAgICAgIC8vIHdlIHNob3VsZCBoYXZlIHJlYWQgOCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCA4KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmLCAmWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDddKTsKKworICAgICAgICAvLyBsZXQncyBjbGVhciBvdXQgdGhlIGJ1ZmZlciBhbmQgdHJ5IHJlYWQgYWdhaW4KKyAgICAgICAgZm9yIGkgaW4gMC4uOCB7CisgICAgICAgICAgICBidWZbaV0gPSAwOworICAgICAgICB9CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lIHdlIHdlcmUgb25seSBhYmxlIHRvIHJlYWQgMiBieXRlcworICAgICAgICAvLyAoYWxsIHRoYXQncyByZW1haW5pbmcgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQpCisgICAgICAgIC8vIGxldCdzIGFsc28gY2hlY2sgdGhhdCB0aGUgcmVtYWluaW5nIGJ5dGVzIGFyZSB1bnRvdWNoZWQKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlswLi4yXSwgJls4LCA5XSk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlsyLi5dLCAmWzAsIDAsIDAsIDAsIDAsIDBdKTsKKworICAgICAgICAvLyB0cnkgcmVhZCBhZ2FpbiAod2Ugc2hvdWxkIGdldCAwKQorICAgICAgICAvLyBhbmQgYWxsIHRoZSBleGlzdGluZyBieXRlcyB3ZXJlIHVudG91Y2hlZAorICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzAuLjJdLCAmWzgsIDldKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzIuLl0sICZbMCwgMCwgMCwgMCwgMCwgMF0pOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl9lcnJvcl93aGVuX25vdGhpbmdfY2FuX2JlX3dyaXR0ZW5fdG9fdW5kZXJseWluZ19jaGFubmVsKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEsIG1lbSk7CisKKyAgICAgICAgbGV0IGIgPSB2ZWMhWzA7IDEwXTsKKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZiKTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDEgYnl0ZQorICAgICAgICBhc3NlcnRfZXEhKHIudW53cmFwKCksIDEpOworCisgICAgICAgIC8vIGxldCdzIHRyeSBhZ2Fpbi4uLgorICAgICAgICBsZXQgciA9IHQud3JpdGUoJmJbMS4uXSk7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lIHdlJ2xsIGVycm9yIG91dCBiZWNhdXNlIHRoZSBhdXRvLWZsdXNoIGZhaWxlZAorICAgICAgICBhc3NlcnQhKHIuaXNfZXJyKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl96ZXJvX2lmX2NhbGxlcl9jYWxsc193cml0ZV93aXRoX2VtcHR5X2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMTAsIG1lbSk7CisKKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZbXSk7CisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAwXSA9IFtdOworCisgICAgICAgIGFzc2VydF9lcSEoci51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2F1dG9fZmx1c2hfaWZfd3JpdGVfYnVmZmVyX2Z1bGwoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCA4KTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNCwgbWVtKTsKKworICAgICAgICBsZXQgYjAgPSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM107CisgICAgICAgIGxldCBiMSA9IFsweDA0LCAweDA1LCAweDA2LCAweDA3XTsKKworICAgICAgICAvLyB3cml0ZSB0aGUgZmlyc3QgNCBieXRlczsgd2UndmUgbm93IGZpbGxlZCB0aGUgdHJhbnNwb3J0J3Mgd3JpdGUgYnVmZmVyCisgICAgICAgIGxldCByID0gdC53cml0ZSgmYjApOworICAgICAgICBhc3NlcnRfZXEhKHIudW53cmFwKCksIDQpOworCisgICAgICAgIC8vIHRyeSB3cml0ZSB0aGUgbmV4dCA0IGJ5dGVzOyB0aGlzIGNhdXNlcyB0aGUgdHJhbnNwb3J0IHRvIGF1dG8tZmx1c2ggdGhlIGZpcnN0IDQgYnl0ZXMKKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZiMSk7CisgICAgICAgIGFzc2VydF9lcSEoci51bndyYXAoKSwgNCk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBpbiB3cml0aW5nIHRoZSBzZWNvbmQgNCBieXRlcyB3ZSBhdXRvLWZsdXNoZWQgdGhlIGZpcnN0IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgNCk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgYjApOworICAgICAgICB0LmNoYW5uZWwuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgLy8gbm93IGZsdXNoIHRoZSB0cmFuc3BvcnQgdG8gcHVzaCB0aGUgc2Vjb25kIDQgYnl0ZXMgdG8gdGhlIHVuZGVybHlpbmcgY2hhbm5lbAorICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHdlIHdyb3RlIG91dCB0aGUgc2Vjb25kIDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBiMSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfdG9faW5uZXJfdHJhbnNwb3J0X29uX2ZsdXNoKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhtZW0pOworCisgICAgICAgIGxldCBiOiBbdTg7IDVdID0gWzAsIDEsIDIsIDMsIDRdOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgMCk7CisKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBiKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdWNjZXNzZnVsbHlfYWZ0ZXJfZmx1c2goKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCA1KTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNSwgbWVtKTsKKworICAgICAgICAvLyB3cml0ZSBhbmQgZmx1c2gKKyAgICAgICAgbGV0IGI6IFt1ODsgNV0gPSBbMCwgMSwgMiwgMywgNF07CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZmx1c2hlZCBieXRlcworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIpOworCisgICAgICAgIC8vIHJlc2V0IG91ciB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAgICB0LmNoYW5uZWwuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgLy8gd3JpdGUgYW5kIGZsdXNoIGFnYWluCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZmx1c2hlZCBieXRlcworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2ZyYW1lZC5ycyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2ZyYW1lZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA5MzA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvZnJhbWVkLnJzCkBAIC0wLDAgKzEsNDU5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBieXRlb3JkZXI6OntCaWdFbmRpYW4sIFJlYWRCeXRlc0V4dCwgV3JpdGVCeXRlc0V4dH07Cit1c2Ugc3RkOjpjbXA7Cit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworCit1c2Ugc3VwZXI6OntUUmVhZFRyYW5zcG9ydCwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUV3JpdGVUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnl9OworCisvLy8gRGVmYXVsdCBjYXBhY2l0eSBvZiB0aGUgcmVhZCBidWZmZXIgaW4gYnl0ZXMuCitjb25zdCBSRUFEX0NBUEFDSVRZOiB1c2l6ZSA9IDQwOTY7CisKKy8vLyBEZWZhdWx0IGNhcGFjaXR5IG9mIHRoZSB3cml0ZSBidWZmZXIgaW4gYnl0ZXMuCitjb25zdCBXUklURV9DQVBBQ0lUWTogdXNpemUgPSA0MDk2OworCisvLy8gVHJhbnNwb3J0IHRoYXQgcmVhZHMgZnJhbWVkIG1lc3NhZ2VzLgorLy8vCisvLy8gQSBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgIG1haW50YWlucyBhIGZpeGVkLXNpemUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCisvLy8gT24gYSBjYWxsIHRvIGBURnJhbWVkUmVhZFRyYW5zcG9ydDo6cmVhZCguLi4pYCBvbmUgZnVsbCBtZXNzYWdlIC0gYm90aAorLy8vIGZpeGVkLWxlbmd0aCBoZWFkZXIgYW5kIGJ5dGVzIC0gaXMgcmVhZCBmcm9tIHRoZSB3cmFwcGVkIGNoYW5uZWwgYW5kCisvLy8gYnVmZmVyZWQuIFN1YnNlcXVlbnQgcmVhZCBjYWxscyBhcmUgc2VydmljZWQgZnJvbSB0aGUgaW50ZXJuYWwgYnVmZmVyCisvLy8gdW50aWwgaXQgaXMgZXhoYXVzdGVkLCBhdCB3aGljaCBwb2ludCB0aGUgbmV4dCBmdWxsIG1lc3NhZ2UgaXMgcmVhZAorLy8vIGZyb20gdGhlIHdyYXBwZWQgY2hhbm5lbC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRGcmFtZWRSZWFkVHJhbnNwb3J0YC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjpSZWFkOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RGcmFtZWRSZWFkVHJhbnNwb3J0LCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCB0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhjKTsKKy8vLworLy8vIHQucmVhZCgmbXV0IHZlYyFbMHU4OyAxXSkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgYnVmOiBWZWM8dTg+LAorICAgIHBvczogdXNpemUsCisgICAgY2FwOiB1c2l6ZSwKKyAgICBjaGFuOiBDLAorfQorCitpbXBsPEM+IFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAgd2l0aCBhIGRlZmF1bHQtc2l6ZWQKKyAgICAvLy8gaW50ZXJuYWwgcmVhZCBidWZmZXIgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiBuZXcoY2hhbm5lbDogQykgLT4gVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4geworICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eShSRUFEX0NBUEFDSVRZLCBjaGFubmVsKQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFRyYW5zcG9ydGAgd2l0aCBhbiBpbnRlcm5hbCByZWFkIGJ1ZmZlcgorICAgIC8vLyBvZiBzaXplIGByZWFkX2NhcGFjaXR5YCB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkocmVhZF9jYXBhY2l0eTogdXNpemUsIGNoYW5uZWw6IEMpIC0+IFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnQgeworICAgICAgICAgICAgYnVmOiB2ZWMhWzA7IHJlYWRfY2FwYWNpdHldLCAvLyBGSVhNRTogZG8gSSBhY3R1YWxseSBoYXZlIHRvIGRvIHRoaXM/CisgICAgICAgICAgICBwb3M6IDAsCisgICAgICAgICAgICBjYXA6IDAsCisgICAgICAgICAgICBjaGFuOiBjaGFubmVsLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPEM+IFJlYWQgZm9yIFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgZm4gcmVhZCgmbXV0IHNlbGYsIGI6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBpZiBzZWxmLmNhcCAtIHNlbGYucG9zID09IDAgeworICAgICAgICAgICAgbGV0IG1lc3NhZ2Vfc2l6ZSA9IHNlbGYuY2hhbi5yZWFkX2kzMjo6PEJpZ0VuZGlhbj4oKT8gYXMgdXNpemU7CisKKyAgICAgICAgICAgIGxldCBidWZfY2FwYWNpdHkgPSBjbXA6Om1heChtZXNzYWdlX3NpemUsIFJFQURfQ0FQQUNJVFkpOworICAgICAgICAgICAgc2VsZi5idWYucmVzaXplKGJ1Zl9jYXBhY2l0eSwgMCk7CisKKyAgICAgICAgICAgIHNlbGYuY2hhbi5yZWFkX2V4YWN0KCZtdXQgc2VsZi5idWZbLi5tZXNzYWdlX3NpemVdKT87CisgICAgICAgICAgICBzZWxmLmNhcCA9IG1lc3NhZ2Vfc2l6ZSBhcyB1c2l6ZTsKKyAgICAgICAgICAgIHNlbGYucG9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBucmVhZCA9IGNtcDo6bWluKGIubGVuKCksIHNlbGYuY2FwIC0gc2VsZi5wb3MpOworICAgICAgICBiWy4ubnJlYWRdLmNsb25lX2Zyb21fc2xpY2UoJnNlbGYuYnVmW3NlbGYucG9zLi5zZWxmLnBvcyArIG5yZWFkXSk7CisgICAgICAgIHNlbGYucG9zICs9IG5yZWFkOworCisgICAgICAgIE9rKG5yZWFkKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTsKKworaW1wbCBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YiBmbiBuZXcoKSAtPiBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5IGZvciBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFJlYWQgKyBTZW5kPikgLT4gQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGNoYW5uZWwpKQorICAgIH0KK30KKworLy8vIFRyYW5zcG9ydCB0aGF0IHdyaXRlcyBmcmFtZWQgbWVzc2FnZXMuCisvLy8KKy8vLyBBIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgIG1haW50YWlucyBhIGZpeGVkLXNpemUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLiBBbGwKKy8vLyB3cml0ZXMgYXJlIG1hZGUgdG8gdGhpcyBidWZmZXIgYW5kIGFyZSBzZW50IHRvIHRoZSB3cmFwcGVkIGNoYW5uZWwgb25seQorLy8vIHdoZW4gYFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6Zmx1c2goKWAgaXMgY2FsbGVkLiBPbiBhIGZsdXNoIGEgZml4ZWQtbGVuZ3RoCisvLy8gaGVhZGVyIHdpdGggYSBjb3VudCBvZiB0aGUgYnVmZmVyZWQgYnl0ZXMgaXMgd3JpdHRlbiwgZm9sbG93ZWQgYnkgdGhlIGJ5dGVzCisvLy8gdGhlbXNlbHZlcy4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6V3JpdGU7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEZyYW1lZFdyaXRlVHJhbnNwb3J0LCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcoYyk7CisvLy8KKy8vLyB0LndyaXRlKCZbMHgwMF0pLnVud3JhcCgpOworLy8vIHQuZmx1c2goKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEZyYW1lZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGJ1ZjogVmVjPHU4PiwKKyAgICBjaGFubmVsOiBDLAorfQorCitpbXBsPEM+IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAgd2l0aCBkZWZhdWx0LXNpemVkIGludGVybmFsCisgICAgLy8vIHdyaXRlIGJ1ZmZlciB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIG5ldyhjaGFubmVsOiBDKSAtPiBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4geworICAgICAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoV1JJVEVfQ0FQQUNJVFksIGNoYW5uZWwpCisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgIHdpdGggYW4gaW50ZXJuYWwgd3JpdGUgYnVmZmVyCisgICAgLy8vIG9mIHNpemUgYHdyaXRlX2NhcGFjaXR5YCB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkod3JpdGVfY2FwYWNpdHk6IHVzaXplLCBjaGFubmVsOiBDKSAtPiBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4geworICAgICAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnQgeworICAgICAgICAgICAgYnVmOiBWZWM6OndpdGhfY2FwYWNpdHkod3JpdGVfY2FwYWNpdHkpLAorICAgICAgICAgICAgY2hhbm5lbCwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxDPiBXcml0ZSBmb3IgVEZyYW1lZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGZuIHdyaXRlKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgbGV0IGN1cnJlbnRfY2FwYWNpdHkgPSBzZWxmLmJ1Zi5jYXBhY2l0eSgpOworICAgICAgICBsZXQgYXZhaWxhYmxlX3NwYWNlID0gY3VycmVudF9jYXBhY2l0eSAtIHNlbGYuYnVmLmxlbigpOworICAgICAgICBpZiBiLmxlbigpID4gYXZhaWxhYmxlX3NwYWNlIHsKKyAgICAgICAgICAgIGxldCBhZGRpdGlvbmFsX3NwYWNlID0gY21wOjptYXgoYi5sZW4oKSAtIGF2YWlsYWJsZV9zcGFjZSwgY3VycmVudF9jYXBhY2l0eSk7CisgICAgICAgICAgICBzZWxmLmJ1Zi5yZXNlcnZlKGFkZGl0aW9uYWxfc3BhY2UpOworICAgICAgICB9CisKKyAgICAgICAgc2VsZi5idWYuZXh0ZW5kX2Zyb21fc2xpY2UoYik7CisgICAgICAgIE9rKGIubGVuKCkpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBtZXNzYWdlX3NpemUgPSBzZWxmLmJ1Zi5sZW4oKTsKKworICAgICAgICBpZiBsZXQgMCA9IG1lc3NhZ2Vfc2l6ZSB7CisgICAgICAgICAgICByZXR1cm4gT2soKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi5jaGFubmVsLndyaXRlX2kzMjo6PEJpZ0VuZGlhbj4obWVzc2FnZV9zaXplIGFzIGkzMik/OworICAgICAgICB9CisKKyAgICAgICAgLy8gd2lsbCBzcGluIGlmIHRoZSB1bmRlcmx5aW5nIGNoYW5uZWwgY2FuJ3QgYmUgd3JpdHRlbiB0bworICAgICAgICBsZXQgbXV0IGJ5dGVfaW5kZXggPSAwOworICAgICAgICB3aGlsZSBieXRlX2luZGV4IDwgbWVzc2FnZV9zaXplIHsKKyAgICAgICAgICAgIGxldCBud3JpdGUgPSBzZWxmLmNoYW5uZWwud3JpdGUoJnNlbGYuYnVmW2J5dGVfaW5kZXguLm1lc3NhZ2Vfc2l6ZV0pPzsKKyAgICAgICAgICAgIGJ5dGVfaW5kZXggPSBjbXA6Om1pbihieXRlX2luZGV4ICsgbndyaXRlLCBtZXNzYWdlX3NpemUpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IGJ1Zl9jYXBhY2l0eSA9IGNtcDo6bWluKHNlbGYuYnVmLmNhcGFjaXR5KCksIFdSSVRFX0NBUEFDSVRZKTsKKyAgICAgICAgc2VsZi5idWYucmVzaXplKGJ1Zl9jYXBhY2l0eSwgMCk7CisgICAgICAgIHNlbGYuYnVmLmNsZWFyKCk7CisKKyAgICAgICAgc2VsZi5jaGFubmVsLmZsdXNoKCkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTsKKworaW1wbCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWIgZm4gbmV3KCkgLT4gVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSBmb3IgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFdyaXRlICsgU2VuZD4pIC0+IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KGNoYW5uZWwpKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgdHJhbnNwb3J0OjptZW06OlRCdWZmZXJDaGFubmVsOworCisgICAgLy8gRklYTUU6IHRlc3QgYSBmb3JjZWQgcmVzZXJ2ZQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9tZXNzYWdlX3NtYWxsZXJfdGhhbl9pbml0aWFsX2J1ZmZlcl9zaXplKCkgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDgsIGMpOworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF0pOworCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswOyA4XTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZCgmbXV0IGJ1ZikudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbLi40XSwgJlsweDAwLCAweDAxLCAweDAyLCAweDAzXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9tZXNzYWdlX2dyZWF0ZXJfdGhhbl9pbml0aWFsX2J1ZmZlcl9zaXplKCkgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIsIGMpOworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF0pOworCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswOyA4XTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZCgmbXV0IGJ1ZikudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbLi40XSwgJlsweDAwLCAweDAxLCAweDAyLCAweDAzXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9tdWx0aXBsZV9tZXNzYWdlc19pbl9zZXF1ZW5jZV9jb3JyZWN0bHkoKSB7CisgICAgICAgIGxldCBjID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMiwgYyk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gMXN0IG1lc3NhZ2UKKyAgICAgICAgLy8KKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdKTsKKworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMDsgOF07CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWQoJm11dCBidWYpLnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmLCAmWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKTsKKworICAgICAgICAvLworICAgICAgICAvLyAybmQgbWVzc2FnZQorICAgICAgICAvLworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwNCwgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF0pOworCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswOyA4XTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgMSBieXRlCisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkKCZtdXQgYnVmKS51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZiwgJlsweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9zbWFsbGVyX3RoYW5fYnVmZmVyX3NpemUoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIwLCBtZW0pOworCisgICAgICAgIGxldCBiID0gdmVjIVswOyAxMF07CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgd3JpdHRlbiAxMCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCAxMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfY2FsbGVyX2NhbGxzX3dyaXRlX3dpdGhfZW1wdHlfYnVmZmVyKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMTAsIG1lbSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDBdID0gW107CisKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZbXSkudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV90b19pbm5lcl90cmFuc3BvcnRfb25fZmx1c2goKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhtZW0pOworCisgICAgICAgIGxldCBiOiBbdTg7IDVdID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDRdOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgMCk7CisKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2J5dGVzID0gWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2dyZWF0ZXJfdGhhbl9idWZmZXJfc2l6ZV8wMCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKworICAgICAgICAvLyBJTVBPUlRBTlQ6IERPICoqTk9UKiogQ0hBTkdFIFRIRSBXUklURV9DQVBBQ0lUWSBPUiBUSEUgTlVNQkVSIE9GIEJZVEVTIFRPIEJFIFdSSVRURU4hCisgICAgICAgIC8vIHRoZXNlIGxlbmd0aHMgd2VyZSBjaG9zZW4gdG8gYmUganVzdCBsb25nIGVub3VnaAorICAgICAgICAvLyB0aGF0IGRvdWJsaW5nIHRoZSBjYXBhY2l0eSBpcyBhICoqd29yc2UqKiBjaG9pY2UgdGhhbgorICAgICAgICAvLyBzaW1wbHkgcmVzaXppbmcgdGhlIGJ1ZmZlciB0byBiLmxlbigpCisKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEsIG1lbSk7CisgICAgICAgIGxldCBiID0gWzB4MDAsIDB4MDEsIDB4MDJdOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHdyaXR0ZW4gMyBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgMCk7CisKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2J5dGVzID0gWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2dyZWF0ZXJfdGhhbl9idWZmZXJfc2l6ZV8wMSgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKworICAgICAgICAvLyBJTVBPUlRBTlQ6IERPICoqTk9UKiogQ0hBTkdFIFRIRSBXUklURV9DQVBBQ0lUWSBPUiBUSEUgTlVNQkVSIE9GIEJZVEVTIFRPIEJFIFdSSVRURU4hCisgICAgICAgIC8vIHRoZXNlIGxlbmd0aHMgd2VyZSBjaG9zZW4gdG8gYmUganVzdCBsb25nIGVub3VnaAorICAgICAgICAvLyB0aGF0IGRvdWJsaW5nIHRoZSBjYXBhY2l0eSBpcyBhICoqYmV0dGVyKiogY2hvaWNlIHRoYW4KKyAgICAgICAgLy8gc2ltcGx5IHJlc2l6aW5nIHRoZSBidWZmZXIgdG8gYi5sZW4oKQorCisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgyLCBtZW0pOworICAgICAgICBsZXQgYiA9IFsweDAwLCAweDAxLCAweDAyXTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDMgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgMyk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMhKHQsIDApOworCisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZF9ieXRlcyA9IFsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBleHBlY3RlZF9ieXRlcyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX2Vycm9yX2lmX25vdGhpbmdfY2FuX2JlX3dyaXR0ZW5fdG9faW5uZXJfdHJhbnNwb3J0X29uX2ZsdXNoKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxLCBtZW0pOworCisgICAgICAgIGxldCBiID0gdmVjIVswOyAxMF07CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgd3JpdHRlbiAxMCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCAxMCk7CisKKyAgICAgICAgLy8gbGV0J3MgZmx1c2gKKyAgICAgICAgbGV0IHIgPSB0LmZsdXNoKCk7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lIHdlJ2xsIGVycm9yIG91dCBiZWNhdXNlIHRoZSBmbHVzaCBjYW4ndCB3cml0ZSB0byB0aGUgdW5kZXJseWluZyBjaGFubmVsCisgICAgICAgIGFzc2VydCEoci5pc19lcnIoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3VjY2Vzc2Z1bGx5X2FmdGVyX2ZsdXNoKCkgeworICAgICAgICAvLyBJTVBPUlRBTlQ6IHdyaXRlIGNhcGFjaXR5ICpNVVNUKiBiZSBncmVhdGVyCisgICAgICAgIC8vIHRoYW4gbWVzc2FnZSBzaXplcyB1c2VkIGluIHRoaXMgdGVzdCArIDQtYnl0ZSBmcmFtZSBoZWFkZXIKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDUsIG1lbSk7CisKKyAgICAgICAgLy8gd3JpdGUgYW5kIGZsdXNoCisgICAgICAgIGxldCBmaXJzdF9tZXNzYWdlOiBbdTg7IDVdID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDRdOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmZpcnN0X21lc3NhZ2UpLnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IG11dCBleHBlY3RlZCA9IFZlYzo6bmV3KCk7CisgICAgICAgIGV4cGVjdGVkLndyaXRlX2FsbCgmWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDVdKS51bndyYXAoKTsgLy8gbWVzc2FnZSBzaXplCisgICAgICAgIGV4cGVjdGVkLmV4dGVuZF9mcm9tX3NsaWNlKCZmaXJzdF9tZXNzYWdlKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZmx1c2hlZCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQuY2hhbm5lbC53cml0ZV9ieXRlcygpLCBleHBlY3RlZCk7CisKKyAgICAgICAgLy8gcmVzZXQgb3VyIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICAgIHQuY2hhbm5lbC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICBsZXQgc2Vjb25kX21lc3NhZ2U6IFt1ODsgM10gPSBbMHgwNSwgMHgwNiwgMHgwN107CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmc2Vjb25kX21lc3NhZ2UpLnVud3JhcCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgZXhwZWN0ZWQuY2xlYXIoKTsKKyAgICAgICAgZXhwZWN0ZWQud3JpdGVfYWxsKCZbMHgwMCwgMHgwMCwgMHgwMCwgMHgwM10pLnVud3JhcCgpOyAvLyBtZXNzYWdlIHNpemUKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlY29uZF9tZXNzYWdlKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZmx1c2hlZCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQuY2hhbm5lbC53cml0ZV9ieXRlcygpLCBleHBlY3RlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvbWVtLnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvbWVtLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYzRiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9tZW0ucnMKQEAgLTAsMCArMSwzODUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y21wOwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRleH07CisKK3VzZSBzdXBlcjo6e1JlYWRIYWxmLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OworCisvLy8gSW4tbWVtb3J5IHJlYWQgYW5kIHdyaXRlIGNoYW5uZWwgd2l0aCBmaXhlZC1zaXplIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMuCisvLy8KKy8vLyBPbiBhIGB3cml0ZWAgYnl0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGludGVybmFsIHdyaXRlIGJ1ZmZlci4gV3JpdGVzIGFyZSBubworLy8vIGxvbmdlciBhY2NlcHRlZCBvbmNlIHRoaXMgYnVmZmVyIGlzIGZ1bGwuIENhbGxlcnMgbXVzdCBgZW1wdHlfd3JpdGVfYnVmZmVyKClgCisvLy8gYmVmb3JlIHN1YnNlcXVlbnQgd3JpdGVzIGFyZSBhY2NlcHRlZC4KKy8vLworLy8vIFlvdSBjYW4gc2V0IHJlYWRhYmxlIGJ5dGVzIGluIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlciBieSBmaWxsaW5nIGl0IHdpdGgKKy8vLyBgc2V0X3JlYWRhYmxlX2J5dGVzKC4uLilgLiBDYWxsZXJzIGNhbiB0aGVuIHJlYWQgdW50aWwgdGhlIGJ1ZmZlciBpcworLy8vIGRlcGxldGVkLiBObyBmdXJ0aGVyIHJlYWRzIGFyZSBhY2NlcHRlZCB1bnRpbCB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIgaXMKKy8vLyByZXBsZW5pc2hlZCBhZ2Fpbi4KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlckNoYW5uZWwgeworICAgIHJlYWQ6IEFyYzxNdXRleDxSZWFkRGF0YT4+LAorICAgIHdyaXRlOiBBcmM8TXV0ZXg8V3JpdGVEYXRhPj4sCit9CisKKyNbZGVyaXZlKERlYnVnKV0KK3N0cnVjdCBSZWFkRGF0YSB7CisgICAgYnVmOiBCb3g8W3U4XT4sCisgICAgcG9zOiB1c2l6ZSwKKyAgICBpZHg6IHVzaXplLAorICAgIGNhcDogdXNpemUsCit9CisKKyNbZGVyaXZlKERlYnVnKV0KK3N0cnVjdCBXcml0ZURhdGEgeworICAgIGJ1ZjogQm94PFt1OF0+LAorICAgIHBvczogdXNpemUsCisgICAgY2FwOiB1c2l6ZSwKK30KKworaW1wbCBUQnVmZmVyQ2hhbm5lbCB7CisgICAgLy8vIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGBUQnVmZmVyQ2hhbm5lbGAgd2l0aCB0aGUgZ2l2ZW4KKyAgICAvLy8gcmVhZCBidWZmZXIgY2FwYWNpdHkgYW5kIHdyaXRlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eShyZWFkX2NhcGFjaXR5OiB1c2l6ZSwgd3JpdGVfY2FwYWNpdHk6IHVzaXplKSAtPiBUQnVmZmVyQ2hhbm5lbCB7CisgICAgICAgIFRCdWZmZXJDaGFubmVsIHsKKyAgICAgICAgICAgIHJlYWQ6IEFyYzo6bmV3KE11dGV4OjpuZXcoUmVhZERhdGEgeworICAgICAgICAgICAgICAgIGJ1ZjogdmVjIVswOyByZWFkX2NhcGFjaXR5XS5pbnRvX2JveGVkX3NsaWNlKCksCisgICAgICAgICAgICAgICAgaWR4OiAwLAorICAgICAgICAgICAgICAgIHBvczogMCwKKyAgICAgICAgICAgICAgICBjYXA6IHJlYWRfY2FwYWNpdHksCisgICAgICAgICAgICB9KSksCisgICAgICAgICAgICB3cml0ZTogQXJjOjpuZXcoTXV0ZXg6Om5ldyhXcml0ZURhdGEgeworICAgICAgICAgICAgICAgIGJ1ZjogdmVjIVswOyB3cml0ZV9jYXBhY2l0eV0uaW50b19ib3hlZF9zbGljZSgpLAorICAgICAgICAgICAgICAgIHBvczogMCwKKyAgICAgICAgICAgICAgICBjYXA6IHdyaXRlX2NhcGFjaXR5LAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFJldHVybiBhIGNvcHkgb2YgdGhlIGJ5dGVzIGhlbGQgYnkgdGhlIGludGVybmFsIHJlYWQgYnVmZmVyLgorICAgIC8vLyBSZXR1cm5zIGFuIGVtcHR5IHZlY3RvciBpZiBubyByZWFkYWJsZSBieXRlcyBhcmUgcHJlc2VudC4KKyAgICBwdWIgZm4gcmVhZF9ieXRlcygmc2VsZikgLT4gVmVjPHU4PiB7CisgICAgICAgIGxldCByZGF0YSA9IHNlbGYucmVhZC5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IHJkYXRhLmlkeF07CisgICAgICAgIGJ1Zi5jb3B5X2Zyb21fc2xpY2UoJnJkYXRhLmJ1ZlsuLnJkYXRhLmlkeF0pOworICAgICAgICBidWYKKyAgICB9CisKKyAgICAvLyBGSVhNRTogZG8gSSByZWFsbHkgbmVlZCB0aGlzIEFQSSBjYWxsPworICAgIC8vIEZJWE1FOiBzaG91bGQgdGhpcyBzaW1wbHkgcmVzZXQgdG8gdGhlIGxhc3Qgc2V0IG9mIHJlYWRhYmxlIGJ5dGVzPworICAgIC8vLyBSZXNldCB0aGUgbnVtYmVyIG9mIHJlYWRhYmxlIGJ5dGVzIHRvIHplcm8uCisgICAgLy8vCisgICAgLy8vIFN1YnNlcXVlbnQgY2FsbHMgdG8gYHJlYWRgIHdpbGwgcmV0dXJuIG5vdGhpbmcuCisgICAgcHViIGZuIGVtcHR5X3JlYWRfYnVmZmVyKCZtdXQgc2VsZikgeworICAgICAgICBsZXQgbXV0IHJkYXRhID0gc2VsZi5yZWFkLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgcmRhdGEucG9zID0gMDsKKyAgICAgICAgcmRhdGEuaWR4ID0gMDsKKyAgICB9CisKKyAgICAvLy8gQ29weSBieXRlcyBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyIGBidWZgIGludG8gdGhlIGludGVybmFsIHJlYWQgYnVmZmVyLAorICAgIC8vLyBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgYnl0ZXMuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQsCisgICAgLy8vIHdoaWNoIGlzIGBtaW4oYnVmLmxlbigpLCBpbnRlcm5hbF9yZWFkX2J1Zi5sZW4oKSlgLgorICAgIHB1YiBmbiBzZXRfcmVhZGFibGVfYnl0ZXMoJm11dCBzZWxmLCBidWY6ICZbdThdKSAtPiB1c2l6ZSB7CisgICAgICAgIHNlbGYuZW1wdHlfcmVhZF9idWZmZXIoKTsKKyAgICAgICAgbGV0IG11dCByZGF0YSA9IHNlbGYucmVhZC5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBtYXhfYnl0ZXMgPSBjbXA6Om1pbihyZGF0YS5jYXAsIGJ1Zi5sZW4oKSk7CisgICAgICAgIHJkYXRhLmJ1ZlsuLm1heF9ieXRlc10uY2xvbmVfZnJvbV9zbGljZSgmYnVmWy4ubWF4X2J5dGVzXSk7CisgICAgICAgIHJkYXRhLmlkeCA9IG1heF9ieXRlczsKKyAgICAgICAgbWF4X2J5dGVzCisgICAgfQorCisgICAgLy8vIFJldHVybiBhIGNvcHkgb2YgdGhlIGJ5dGVzIGhlbGQgYnkgdGhlIGludGVybmFsIHdyaXRlIGJ1ZmZlci4KKyAgICAvLy8gUmV0dXJucyBhbiBlbXB0eSB2ZWN0b3IgaWYgbm8gYnl0ZXMgd2VyZSB3cml0dGVuLgorICAgIHB1YiBmbiB3cml0ZV9ieXRlcygmc2VsZikgLT4gVmVjPHU4PiB7CisgICAgICAgIGxldCB3ZGF0YSA9IHNlbGYud3JpdGUuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyB3ZGF0YS5wb3NdOworICAgICAgICBidWYuY29weV9mcm9tX3NsaWNlKCZ3ZGF0YS5idWZbLi53ZGF0YS5wb3NdKTsKKyAgICAgICAgYnVmCisgICAgfQorCisgICAgLy8vIFJlc2V0cyB0aGUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLCBtYWtpbmcgaXQgc2VlbSBsaWtlIG5vIGJ5dGVzIHdlcmUKKyAgICAvLy8gd3JpdHRlbi4gQ2FsbGluZyBgd3JpdGVfYnVmZmVyYCBhZnRlciB0aGlzIHJldHVybnMgYW4gZW1wdHkgdmVjdG9yLgorICAgIHB1YiBmbiBlbXB0eV93cml0ZV9idWZmZXIoJm11dCBzZWxmKSB7CisgICAgICAgIGxldCBtdXQgd2RhdGEgPSBzZWxmLndyaXRlLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgd2RhdGEucG9zID0gMDsKKyAgICB9CisKKyAgICAvLy8gT3ZlcndyaXRlcyB0aGUgY29udGVudHMgb2YgdGhlIHJlYWQgYnVmZmVyIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZQorICAgIC8vLyB3cml0ZSBidWZmZXIuIFRoZSB3cml0ZSBidWZmZXIgaXMgZW1wdGllZCBhZnRlciB0aGlzIG9wZXJhdGlvbi4KKyAgICBwdWIgZm4gY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoJm11dCBzZWxmKSB7CisgICAgICAgIC8vIEZJWE1FOiByZWRvIHRoaXMgZW50aXJlIG1ldGhvZAorICAgICAgICBsZXQgYnVmID0geworICAgICAgICAgICAgbGV0IHdkYXRhID0gc2VsZi53cml0ZS5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgYiA9ICZ3ZGF0YS5idWZbLi53ZGF0YS5wb3NdOworICAgICAgICAgICAgbGV0IG11dCBiX3JldCA9IHZlYyFbMDsgYi5sZW4oKV07CisgICAgICAgICAgICBiX3JldC5jb3B5X2Zyb21fc2xpY2UoYik7CisgICAgICAgICAgICBiX3JldAorICAgICAgICB9OworCisgICAgICAgIGxldCBieXRlc19jb3BpZWQgPSBzZWxmLnNldF9yZWFkYWJsZV9ieXRlcygmYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShieXRlc19jb3BpZWQsIGJ1Zi5sZW4oKSk7CisKKyAgICAgICAgc2VsZi5lbXB0eV93cml0ZV9idWZmZXIoKTsKKyAgICB9Cit9CisKK2ltcGwgVElvQ2hhbm5lbCBmb3IgVEJ1ZmZlckNoYW5uZWwgeworICAgIGZuIHNwbGl0KHNlbGYpIC0+IDo6UmVzdWx0PChSZWFkSGFsZjxTZWxmPiwgV3JpdGVIYWxmPFNlbGY+KT4KKyAgICB3aGVyZQorICAgICAgICBTZWxmOiBTaXplZCwKKyAgICB7CisgICAgICAgIE9rKCgKKyAgICAgICAgICAgIFJlYWRIYWxmIHsKKyAgICAgICAgICAgICAgICBoYW5kbGU6IFRCdWZmZXJDaGFubmVsIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZDogc2VsZi5yZWFkLmNsb25lKCksCisgICAgICAgICAgICAgICAgICAgIHdyaXRlOiBzZWxmLndyaXRlLmNsb25lKCksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBXcml0ZUhhbGYgeworICAgICAgICAgICAgICAgIGhhbmRsZTogVEJ1ZmZlckNoYW5uZWwgeworICAgICAgICAgICAgICAgICAgICByZWFkOiBzZWxmLnJlYWQuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgd3JpdGU6IHNlbGYud3JpdGUuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSkKKyAgICB9Cit9CisKK2ltcGwgaW86OlJlYWQgZm9yIFRCdWZmZXJDaGFubmVsIHsKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYnVmOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgbGV0IG11dCByZGF0YSA9IHNlbGYucmVhZC5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBucmVhZCA9IGNtcDo6bWluKGJ1Zi5sZW4oKSwgcmRhdGEuaWR4IC0gcmRhdGEucG9zKTsKKyAgICAgICAgYnVmWy4ubnJlYWRdLmNsb25lX2Zyb21fc2xpY2UoJnJkYXRhLmJ1ZltyZGF0YS5wb3MuLnJkYXRhLnBvcyArIG5yZWFkXSk7CisgICAgICAgIHJkYXRhLnBvcyArPSBucmVhZDsKKyAgICAgICAgT2sobnJlYWQpCisgICAgfQorfQorCitpbXBsIGlvOjpXcml0ZSBmb3IgVEJ1ZmZlckNoYW5uZWwgeworICAgIGZuIHdyaXRlKCZtdXQgc2VsZiwgYnVmOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBsZXQgbXV0IHdkYXRhID0gc2VsZi53cml0ZS5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBud3JpdGUgPSBjbXA6Om1pbihidWYubGVuKCksIHdkYXRhLmNhcCAtIHdkYXRhLnBvcyk7CisgICAgICAgIGxldCAoc3RhcnQsIGVuZCkgPSAod2RhdGEucG9zLCB3ZGF0YS5wb3MgKyBud3JpdGUpOworICAgICAgICB3ZGF0YS5idWZbc3RhcnQuLmVuZF0uY2xvbmVfZnJvbV9zbGljZSgmYnVmWy4ubndyaXRlXSk7CisgICAgICAgIHdkYXRhLnBvcyArPSBud3JpdGU7CisgICAgICAgIE9rKG53cml0ZSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpIC8vIG5vdGhpbmcgdG8gZG8gb24gZmx1c2gKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKworICAgIHVzZSBzdXBlcjo6VEJ1ZmZlckNoYW5uZWw7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9lbXB0eV93cml0ZV9idWZmZXIoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEpOworCisgICAgICAgIGxldCBieXRlc190b193cml0ZTogW3U4OyAxXSA9IFsweDAxXTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZSk7CisKKyAgICAgICAgdC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlX2J5dGVzKCkubGVuKCksIDApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FjY2VwdF93cml0ZXNfYWZ0ZXJfYnVmZmVyX2VtcHRpZWQoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDIpOworCisgICAgICAgIGxldCBieXRlc190b193cml0ZTogW3U4OyAyXSA9IFsweDAxLCAweDAyXTsKKworICAgICAgICAvLyBmaXJzdCB3cml0ZSAoYWxsIGJ5dGVzIHdyaXR0ZW4pCisgICAgICAgIGxldCByZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpLCAmYnl0ZXNfdG9fd3JpdGUpOworCisgICAgICAgIC8vIHRyeSB3cml0ZSBhZ2FpbiAobm90aGluZyBzaG91bGQgYmUgd3JpdHRlbikKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZSk7IC8vIHN0aWxsIHRoZSBzYW1lIGFzIGJlZm9yZQorCisgICAgICAgIC8vIG5vdyByZXNldCB0aGUgYnVmZmVyCisgICAgICAgIHQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZV9ieXRlcygpLmxlbigpLCAwKTsKKworICAgICAgICAvLyBub3cgdHJ5IHdyaXRlIGFnYWluIC0gdGhlIHdyaXRlIHNob3VsZCBzdWNjZWVkCisgICAgICAgIGxldCByZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpLCAmYnl0ZXNfdG9fd3JpdGUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FjY2VwdF9tdWx0aXBsZV93cml0ZXNfdW50aWxfYnVmZmVyX2lzX2Z1bGwoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKworICAgICAgICAvLyBmaXJzdCB3cml0ZSAoYWxsIGJ5dGVzIHdyaXR0ZW4pCisgICAgICAgIGxldCBieXRlc190b193cml0ZV8wOiBbdTg7IDJdID0gWzB4MDEsIDB4NDFdOworICAgICAgICBsZXQgd3JpdGVfMF9yZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZV8wKTsKKyAgICAgICAgYXNzZXJ0X2VxISh3cml0ZV8wX3Jlc3VsdC51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZV9ieXRlcygpLCAmYnl0ZXNfdG9fd3JpdGVfMCk7CisKKyAgICAgICAgLy8gc2Vjb25kIHdyaXRlIChhbGwgYnl0ZXMgd3JpdHRlbiwgc3RhcnRpbmcgYXQgaW5kZXggMikKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlXzE6IFt1ODsgN10gPSBbMHgyNCwgMHg0MSwgMHgzMiwgMHgzMywgMHgxMSwgMHg5OCwgMHhBRl07CisgICAgICAgIGxldCB3cml0ZV8xX3Jlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlXzEpOworICAgICAgICBhc3NlcnRfZXEhKHdyaXRlXzFfcmVzdWx0LnVud3JhcCgpLCA3KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpWzIuLl0sICZieXRlc190b193cml0ZV8xKTsKKworICAgICAgICAvLyB0aGlyZCB3cml0ZSAob25seSAxIGJ5dGUgd3JpdHRlbiAtIHRoYXQncyBhbGwgd2UgaGF2ZSBzcGFjZSBmb3IpCisgICAgICAgIGxldCBieXRlc190b193cml0ZV8yOiBbdTg7IDNdID0gWzB4QkYsIDB4REEsIDB4OThdOworICAgICAgICBsZXQgd3JpdGVfMl9yZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZV8yKTsKKyAgICAgICAgYXNzZXJ0X2VxISh3cml0ZV8yX3Jlc3VsdC51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKVs5Li5dLCAmYnl0ZXNfdG9fd3JpdGVfMlswLi4xXSk7IC8vIGhvdyBkb2VzIHRoaXMgc3ludGF4IHdvcms/IQorCisgICAgICAgIC8vIGZvdXJ0aCB3cml0ZSAobm8gd3JpdGVzIGFyZSBhY2NlcHRlZCkKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlXzM6IFt1ODsgM10gPSBbMHhCRiwgMHhBQSwgMHhGRF07CisgICAgICAgIGxldCB3cml0ZV8zX3Jlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlXzMpOworICAgICAgICBhc3NlcnRfZXEhKHdyaXRlXzNfcmVzdWx0LnVud3JhcCgpLCAwKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZnVsbCB3cml0ZSBidWZmZXIKKyAgICAgICAgbGV0IG11dCBleHBlY3RlZDogVmVjPHU4PiA9IFZlYzo6d2l0aF9jYXBhY2l0eSgxMCk7CisgICAgICAgIGV4cGVjdGVkLmV4dGVuZF9mcm9tX3NsaWNlKCZieXRlc190b193cml0ZV8wKTsKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJmJ5dGVzX3RvX3dyaXRlXzEpOworICAgICAgICBleHBlY3RlZC5leHRlbmRfZnJvbV9zbGljZSgmYnl0ZXNfdG9fd3JpdGVfMlswLi4xXSk7CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZV9ieXRlcygpLCAmZXhwZWN0ZWRbLi5dKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9lbXB0eV9yZWFkX2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMSwgMCk7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3JlYWQ6IFt1ODsgMV0gPSBbMHgwMV07CisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmYnl0ZXNfdG9fcmVhZCk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJmJ5dGVzX3RvX3JlYWQpOworCisgICAgICAgIHQuZW1wdHlfcmVhZF9idWZmZXIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKS5sZW4oKSwgMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWxsb3dfcmVhZGFibGVfYnl0ZXNfdG9fYmVfc2V0X2FmdGVyX3JlYWRfYnVmZmVyX2VtcHRpZWQoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEsIDApOworCisgICAgICAgIGxldCBieXRlc190b19yZWFkXzA6IFt1ODsgMV0gPSBbMHgwMV07CisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmYnl0ZXNfdG9fcmVhZF8wKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDEpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmYnl0ZXNfdG9fcmVhZF8wKTsKKworICAgICAgICB0LmVtcHR5X3JlYWRfYnVmZmVyKCk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCkubGVuKCksIDApOworCisgICAgICAgIGxldCBieXRlc190b19yZWFkXzE6IFt1ODsgMV0gPSBbMHgwMl07CisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmYnl0ZXNfdG9fcmVhZF8xKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDEpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmYnl0ZXNfdG9fcmVhZF8xKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hY2NlcHRfbXVsdGlwbGVfcmVhZHNfdW50aWxfYWxsX2J5dGVzX3JlYWQoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAwKTsKKworICAgICAgICBsZXQgcmVhZGFibGVfYnl0ZXM6IFt1ODsgMTBdID0gWzB4RkYsIDB4RUUsIDB4REQsIDB4Q0MsIDB4QkIsIDB4MDAsIDB4MUEsIDB4MkIsIDB4M0MsIDB4NERdOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgd2UncmUgYWJsZSB0byBzZXQgdGhlIGJ5dGVzIHRvIGJlIHJlYWQKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZyZWFkYWJsZV9ieXRlcyk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAxMCk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkYWJsZV9ieXRlcyk7CisKKyAgICAgICAgLy8gZmlyc3QgcmVhZAorICAgICAgICBsZXQgbXV0IHJlYWRfYnVmXzAgPSB2ZWMhWzA7IDVdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zl8wKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9idWZfMC5hc19zbGljZSgpLCAmKHJlYWRhYmxlX2J5dGVzWzAuLjVdKSk7CisKKyAgICAgICAgLy8gc2Vjb25kIHJlYWQKKyAgICAgICAgbGV0IG11dCByZWFkX2J1Zl8xID0gdmVjIVswOyA0XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWZfMSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYnVmXzEuYXNfc2xpY2UoKSwgJihyZWFkYWJsZV9ieXRlc1s1Li45XSkpOworCisgICAgICAgIC8vIHRoaXJkIHJlYWQgKG9ubHkgMSBieXRlIHJlbWFpbnMgdG8gYmUgcmVhZCkKKyAgICAgICAgbGV0IG11dCByZWFkX2J1Zl8yID0gdmVjIVswOyAzXTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWZfMik7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDEpOworICAgICAgICByZWFkX2J1Zl8yLnRydW5jYXRlKDEpOyAvLyBGSVhNRTogZG9lcyB0aGUgY2FsbGVyIGhhdmUgdG8gZG8gdGhpcz8KKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2J1Zl8yLmFzX3NsaWNlKCksICYocmVhZGFibGVfYnl0ZXNbOS4uXSkpOworCisgICAgICAgIC8vIGZvdXJ0aCByZWFkIChub3RoaW5nIHNob3VsZCBiZSByZWFkYWJsZSkKKyAgICAgICAgbGV0IG11dCByZWFkX2J1Zl8zID0gdmVjIVswOyAxMF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmXzMpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICAgICAgcmVhZF9idWZfMy50cnVuY2F0ZSgwKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IGFsbCB0aGUgYnl0ZXMgd2UgcmVjZWl2ZWQgbWF0Y2ggdGhlIG9yaWdpbmFsIChhZ2FpbiEpCisgICAgICAgIGxldCBtdXQgYnl0ZXNfcmVhZCA9IFZlYzo6d2l0aF9jYXBhY2l0eSgxMCk7CisgICAgICAgIGJ5dGVzX3JlYWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnJlYWRfYnVmXzApOworICAgICAgICBieXRlc19yZWFkLmV4dGVuZF9mcm9tX3NsaWNlKCZyZWFkX2J1Zl8xKTsKKyAgICAgICAgYnl0ZXNfcmVhZC5leHRlbmRfZnJvbV9zbGljZSgmcmVhZF9idWZfMik7CisgICAgICAgIGJ5dGVzX3JlYWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnJlYWRfYnVmXzMpOworICAgICAgICBhc3NlcnRfZXEhKCZieXRlc19yZWFkLCAmcmVhZGFibGVfYnl0ZXMpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FsbG93X3JlYWRzX3RvX3N1Y2NlZWRfYWZ0ZXJfcmVhZF9idWZmZXJfcmVwbGVuaXNoZWQoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDMsIDApOworCisgICAgICAgIGxldCByZWFkYWJsZV9ieXRlc18wOiBbdTg7IDNdID0gWzB4MDIsIDB4QUIsIDB4MzNdOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgd2UncmUgYWJsZSB0byBzZXQgdGhlIGJ5dGVzIHRvIGJlIHJlYWQKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZyZWFkYWJsZV9ieXRlc18wKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDMpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmcmVhZGFibGVfYnl0ZXNfMCk7CisKKyAgICAgICAgbGV0IG11dCByZWFkX2J1ZiA9IHZlYyFbMDsgNF07CisKKyAgICAgICAgLy8gZHJhaW4gdGhlIHJlYWQgYnVmZmVyCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMyk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkX2J1ZlswLi4zXSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBhIHN1YnNlcXVlbnQgcmVhZCBmYWlscworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zik7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworCisgICAgICAgIC8vIHdlIGRvbid0IG1vZGlmeSB0aGUgcmVhZCBidWZmZXIgb24gZmFpbHVyZQorICAgICAgICBsZXQgbXV0IGV4cGVjdGVkX2J5dGVzID0gVmVjOjp3aXRoX2NhcGFjaXR5KDQpOworICAgICAgICBleHBlY3RlZF9ieXRlcy5leHRlbmRfZnJvbV9zbGljZSgmcmVhZGFibGVfYnl0ZXNfMCk7CisgICAgICAgIGV4cGVjdGVkX2J5dGVzLnB1c2goMHgwMCk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlYWRfYnVmLCAmZXhwZWN0ZWRfYnl0ZXMpOworCisgICAgICAgIC8vIHJlcGxlbmlzaCB0aGUgcmVhZCBidWZmZXIgYWdhaW4KKyAgICAgICAgbGV0IHJlYWRhYmxlX2J5dGVzXzE6IFt1ODsgMl0gPSBbMHg5MSwgMHhBQV07CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSdyZSBhYmxlIHRvIHNldCB0aGUgYnl0ZXMgdG8gYmUgcmVhZAorICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJnJlYWRhYmxlX2J5dGVzXzEpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMik7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkYWJsZV9ieXRlc18xKTsKKworICAgICAgICAvLyByZWFkIGFnYWluCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkX2J1ZlswLi4yXSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvbW9kLnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvbW9kLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MjMzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9tb2QucnMKQEAgLTAsMCArMSwyOTEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFR5cGVzIHVzZWQgdG8gc2VuZCBhbmQgcmVjZWl2ZSBieXRlcyBvdmVyIGFuIEkvTyBjaGFubmVsLgorLy8hCisvLyEgVGhlIGNvcmUgdHlwZXMgYXJlIHRoZSBgVFJlYWRUcmFuc3BvcnRgLCBgVFdyaXRlVHJhbnNwb3J0YCBhbmQgdGhlCisvLyEgYFRJb0NoYW5uZWxgIHRyYWl0cywgdGhyb3VnaCB3aGljaCBgVElucHV0UHJvdG9jb2xgIG9yCisvLyEgYFRPdXRwdXRQcm90b2NvbGAgY2FuIHJlY2VpdmUgYW5kIHNlbmQgcHJpbWl0aXZlcyBvdmVyIHRoZSB3aXJlLiBXaGlsZQorLy8hIGBUSW5wdXRQcm90b2NvbGAgYW5kIGBUT3V0cHV0UHJvdG9jb2xgIGluc3RhbmNlcyBkZWFsIHdpdGggbGFuZ3VhZ2UgcHJpbWl0aXZlcworLy8hIHRoZSB0eXBlcyBpbiB0aGlzIG1vZHVsZSB1bmRlcnN0YW5kIG9ubHkgYnl0ZXMuCisKK3VzZSBzdGQ6OmlvOwordXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07Cit1c2Ugc3RkOjpvcHM6OntEZXJlZiwgRGVyZWZNdXR9OworCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzIHsKKyAgICAoJHRyYW5zcG9ydDppZGVudCwgJG51bV93cml0dGVuX2J5dGVzOmV4cHIpID0+IHt7CisgICAgICAgIGFzc2VydF9lcSEoJHRyYW5zcG9ydC5jaGFubmVsLndyaXRlX2J5dGVzKCkubGVuKCksICRudW1fd3JpdHRlbl9ieXRlcyk7CisgICAgfX07Cit9CisKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyB7CisgICAgKCR0cmFuc3BvcnQ6aWRlbnQsICRleHBlY3RlZF9ieXRlczppZGVudCkgPT4ge3sKKyAgICAgICAgYXNzZXJ0X2VxISgkdHJhbnNwb3J0LmNoYW5uZWwud3JpdGVfYnl0ZXMoKSwgJiRleHBlY3RlZF9ieXRlcyk7CisgICAgfX07Cit9CisKK21vZCBidWZmZXJlZDsKK21vZCBmcmFtZWQ7Cittb2QgbWVtOworbW9kIHNvY2tldDsKKworcHViIHVzZSBzZWxmOjpidWZmZXJlZDo6eworICAgIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQsIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydCwKKyAgICBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnksCit9OworcHViIHVzZSBzZWxmOjpmcmFtZWQ6OnsKKyAgICBURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBURnJhbWVkV3JpdGVUcmFuc3BvcnQsCisgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKK307CitwdWIgdXNlIHNlbGY6Om1lbTo6VEJ1ZmZlckNoYW5uZWw7CitwdWIgdXNlIHNlbGY6OnNvY2tldDo6VFRjcENoYW5uZWw7CisKKy8vLyBJZGVudGlmaWVzIGEgdHJhbnNwb3J0IHVzZWQgYnkgYSBgVElucHV0UHJvdG9jb2xgIHRvIHJlY2VpdmUgYnl0ZXMuCitwdWIgdHJhaXQgVFJlYWRUcmFuc3BvcnQ6IFJlYWQge30KKworLy8vIEhlbHBlciB0eXBlIHVzZWQgYnkgYSBzZXJ2ZXIgdG8gY3JlYXRlIGBUUmVhZFRyYW5zcG9ydGAgaW5zdGFuY2VzIGZvcgorLy8vIGFjY2VwdGVkIGNsaWVudCBjb25uZWN0aW9ucy4KK3B1YiB0cmFpdCBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVFRyYW5zcG9ydGAgdGhhdCB3cmFwcyBhIGNoYW5uZWwgb3ZlciB3aGljaCBieXRlcyBhcmUgdG8gYmUgcmVhZC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxSZWFkICsgU2VuZD4pIC0+IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+OworfQorCisvLy8gSWRlbnRpZmllcyBhIHRyYW5zcG9ydCB1c2VkIGJ5IGBUT3V0cHV0UHJvdG9jb2xgIHRvIHNlbmQgYnl0ZXMuCitwdWIgdHJhaXQgVFdyaXRlVHJhbnNwb3J0OiBXcml0ZSB7fQorCisvLy8gSGVscGVyIHR5cGUgdXNlZCBieSBhIHNlcnZlciB0byBjcmVhdGUgYFRXcml0ZVRyYW5zcG9ydGAgaW5zdGFuY2VzIGZvcgorLy8vIGFjY2VwdGVkIGNsaWVudCBjb25uZWN0aW9ucy4KK3B1YiB0cmFpdCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRUcmFuc3BvcnRgIHRoYXQgd3JhcHMgYSBjaGFubmVsIG92ZXIgd2hpY2ggYnl0ZXMgYXJlIHRvIGJlIHNlbnQuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8V3JpdGUgKyBTZW5kPikgLT4gQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+OworfQorCitpbXBsPFQ+IFRSZWFkVHJhbnNwb3J0IGZvciBUIHdoZXJlIFQ6IFJlYWQge30KKworaW1wbDxUPiBUV3JpdGVUcmFuc3BvcnQgZm9yIFQgd2hlcmUgVDogV3JpdGUge30KKworLy8gRklYTUU6IGltcGxlbWVudCB0aGUgRGVidWcgdHJhaXQgZm9yIGJveGVkIHRyYW5zcG9ydHMKKworaW1wbDxUPiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgZm9yIEJveDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyA/U2l6ZWQsCit7CisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8UmVhZCArIFNlbmQ+KSAtPiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgICgqKnNlbGYpLmNyZWF0ZShjaGFubmVsKQorICAgIH0KK30KKworaW1wbDxUPiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5IGZvciBCb3g8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArID9TaXplZCwKK3sKKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxXcml0ZSArIFNlbmQ+KSAtPiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICAoKipzZWxmKS5jcmVhdGUoY2hhbm5lbCkKKyAgICB9Cit9CisKKy8vLyBJZGVudGlmaWVzIGEgc3BsaXR0YWJsZSBiaWRpcmVjdGlvbmFsIEkvTyBjaGFubmVsIHVzZWQgdG8gc2VuZCBhbmQgcmVjZWl2ZSBieXRlcy4KK3B1YiB0cmFpdCBUSW9DaGFubmVsOiBSZWFkICsgV3JpdGUgeworICAgIC8vLyBTcGxpdCB0aGUgY2hhbm5lbCBpbnRvIGEgcmVhZGFibGUgaGFsZiBhbmQgYSB3cml0YWJsZSBoYWxmLCB3aGVyZSB0aGUKKyAgICAvLy8gcmVhZGFibGUgaGFsZiBpbXBsZW1lbnRzIGBpbzo6UmVhZGAgYW5kIHRoZSB3cml0YWJsZSBoYWxmIGltcGxlbWVudHMKKyAgICAvLy8gYGlvOjpXcml0ZWAuIFJldHVybnMgYE5vbmVgIGlmIHRoZSBjaGFubmVsIHdhcyBub3QgaW5pdGlhbGl6ZWQsIG9yIGlmIGl0CisgICAgLy8vIGNhbm5vdCBiZSBzcGxpdCBzYWZlbHkuCisgICAgLy8vCisgICAgLy8vIFJldHVybmVkIGhhbHZlcyBtYXkgc2hhcmUgdGhlIHVuZGVybHlpbmcgT1MgY2hhbm5lbCBvciBidWZmZXIgcmVzb3VyY2VzLgorICAgIC8vLyBJbXBsZW1lbnRhdGlvbnMgKipzaG91bGQgZW5zdXJlKiogdGhhdCB0aGVzZSB0d28gaGFsdmVzIGNhbiBiZSBzYWZlbHkKKyAgICAvLy8gdXNlZCBpbmRlcGVuZGVudGx5IGJ5IGNvbmN1cnJlbnQgdGhyZWFkcy4KKyAgICBmbiBzcGxpdChzZWxmKSAtPiA6OlJlc3VsdDwoOjp0cmFuc3BvcnQ6OlJlYWRIYWxmPFNlbGY+LCA6OnRyYW5zcG9ydDo6V3JpdGVIYWxmPFNlbGY+KT4KKyAgICB3aGVyZQorICAgICAgICBTZWxmOiBTaXplZDsKK30KKworLy8vIFRoZSByZWFkYWJsZSBoYWxmIG9mIGFuIG9iamVjdCByZXR1cm5lZCBmcm9tIGBUSW9DaGFubmVsOjpzcGxpdGAuCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFJlYWRIYWxmPEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgaGFuZGxlOiBDLAorfQorCisvLy8gVGhlIHdyaXRhYmxlIGhhbGYgb2YgYW4gb2JqZWN0IHJldHVybmVkIGZyb20gYFRJb0NoYW5uZWw6OnNwbGl0YC4KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgV3JpdGVIYWxmPEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGhhbmRsZTogQywKK30KKworaW1wbDxDPiBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIC8vLyBDcmVhdGUgYSBgUmVhZEhhbGZgIGFzc29jaWF0ZWQgd2l0aCByZWFkYWJsZSBgaGFuZGxlYAorICAgIHB1YiBmbiBuZXcoaGFuZGxlOiBDKSAtPiBSZWFkSGFsZjxDPiB7CisgICAgICAgIFJlYWRIYWxmIHsgaGFuZGxlIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gV3JpdGVIYWxmPEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIC8vLyBDcmVhdGUgYSBgV3JpdGVIYWxmYCBhc3NvY2lhdGVkIHdpdGggd3JpdGFibGUgYGhhbmRsZWAKKyAgICBwdWIgZm4gbmV3KGhhbmRsZTogQykgLT4gV3JpdGVIYWxmPEM+IHsKKyAgICAgICAgV3JpdGVIYWxmIHsgaGFuZGxlIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gUmVhZCBmb3IgUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYnVmOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgc2VsZi5oYW5kbGUucmVhZChidWYpCisgICAgfQorfQorCitpbXBsPEM+IFdyaXRlIGZvciBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBidWY6ICZbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIHNlbGYuaGFuZGxlLndyaXRlKGJ1ZikKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5oYW5kbGUuZmx1c2goKQorICAgIH0KK30KKworaW1wbDxDPiBEZXJlZiBmb3IgUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICB0eXBlIFRhcmdldCA9IEM7CisKKyAgICBmbiBkZXJlZigmc2VsZikgLT4gJlNlbGY6OlRhcmdldCB7CisgICAgICAgICZzZWxmLmhhbmRsZQorICAgIH0KK30KKworaW1wbDxDPiBEZXJlZk11dCBmb3IgUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBmbiBkZXJlZl9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IEMgeworICAgICAgICAmbXV0IHNlbGYuaGFuZGxlCisgICAgfQorfQorCitpbXBsPEM+IERlcmVmIGZvciBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgdHlwZSBUYXJnZXQgPSBDOworCisgICAgZm4gZGVyZWYoJnNlbGYpIC0+ICZTZWxmOjpUYXJnZXQgeworICAgICAgICAmc2VsZi5oYW5kbGUKKyAgICB9Cit9CisKK2ltcGw8Qz4gRGVyZWZNdXQgZm9yIFdyaXRlSGFsZjxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBmbiBkZXJlZl9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IEMgeworICAgICAgICAmbXV0IHNlbGYuaGFuZGxlCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2Ugc3RkOjppbzo6Q3Vyc29yOworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9yZWFkX2NoYW5uZWxfZnJvbV9jb25jcmV0ZV9yZWFkX3R5cGUoKSB7CisgICAgICAgIGxldCByID0gQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKTsKKyAgICAgICAgbGV0IF8gPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcocik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9yZWFkX2NoYW5uZWxfZnJvbV9ib3hlZF9yZWFkKCkgeworICAgICAgICBsZXQgcjogQm94PFJlYWQ+ID0gQm94OjpuZXcoQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKSk7CisgICAgICAgIGxldCBfID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KHIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfd3JpdGVfY2hhbm5lbF9mcm9tX2NvbmNyZXRlX3dyaXRlX3R5cGUoKSB7CisgICAgICAgIGxldCB3ID0gdmVjIVswdTg7IDEwXTsKKyAgICAgICAgbGV0IF8gPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KHcpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfd3JpdGVfY2hhbm5lbF9mcm9tX2JveGVkX3dyaXRlKCkgeworICAgICAgICBsZXQgdzogQm94PFdyaXRlPiA9IEJveDo6bmV3KHZlYyFbMHU4OyAxMF0pOworICAgICAgICBsZXQgXyA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcodyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9yZWFkX3RyYW5zcG9ydF9mcm9tX2NvbmNyZXRlX3JlYWRfdHJhbnNwb3J0KCkgeworICAgICAgICBsZXQgciA9IEN1cnNvcjo6bmV3KFswLCAxLCAyXSk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhyKTsKKyAgICAgICAgdGFrZXNfcmVhZF90cmFuc3BvcnQoJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfcmVhZF90cmFuc3BvcnRfZnJvbV9ib3hlZF9yZWFkKCkgeworICAgICAgICBsZXQgciA9IEN1cnNvcjo6bmV3KFswLCAxLCAyXSk7CisgICAgICAgIGxldCBtdXQgdDogQm94PFRSZWFkVHJhbnNwb3J0PiA9IEJveDo6bmV3KFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhyKSk7CisgICAgICAgIHRha2VzX3JlYWRfdHJhbnNwb3J0KCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3dyaXRlX3RyYW5zcG9ydF9mcm9tX2NvbmNyZXRlX3dyaXRlX3RyYW5zcG9ydCgpIHsKKyAgICAgICAgbGV0IHcgPSB2ZWMhWzB1ODsgMTBdOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KHcpOworICAgICAgICB0YWtlc193cml0ZV90cmFuc3BvcnQoJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfd3JpdGVfdHJhbnNwb3J0X2Zyb21fYm94ZWRfd3JpdGUoKSB7CisgICAgICAgIGxldCB3ID0gdmVjIVswdTg7IDEwXTsKKyAgICAgICAgbGV0IG11dCB0OiBCb3g8VFdyaXRlVHJhbnNwb3J0PiA9IEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcodykpOworICAgICAgICB0YWtlc193cml0ZV90cmFuc3BvcnQoJm11dCB0KQorICAgIH0KKworICAgIGZuIHRha2VzX3JlYWRfdHJhbnNwb3J0PFI+KHQ6ICZtdXQgUikKKyAgICB3aGVyZQorICAgICAgICBSOiBUUmVhZFRyYW5zcG9ydCwKKyAgICB7CisgICAgICAgIHQuYnl0ZXMoKTsKKyAgICB9CisKKyAgICBmbiB0YWtlc193cml0ZV90cmFuc3BvcnQ8Vz4odDogJm11dCBXKQorICAgIHdoZXJlCisgICAgICAgIFc6IFRXcml0ZVRyYW5zcG9ydCwKKyAgICB7CisgICAgICAgIHQuZmx1c2goKS51bndyYXAoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3RyYW5zcG9ydC9zb2NrZXQucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9zb2NrZXQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlZjY3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L3NvY2tldC5ycwpAQCAtMCwwICsxLDE2OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjppbzo6e0Vycm9yS2luZCwgUmVhZCwgV3JpdGV9OwordXNlIHN0ZDo6bmV0Ojp7U2h1dGRvd24sIFRjcFN0cmVhbX07CisKK3VzZSBzdXBlcjo6e1JlYWRIYWxmLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OwordXNlIHtuZXdfdHJhbnNwb3J0X2Vycm9yLCBUcmFuc3BvcnRFcnJvcktpbmR9OworCisvLy8gQmlkaXJlY3Rpb25hbCBUQ1AvSVAgY2hhbm5lbC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhIGBUVGNwQ2hhbm5lbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGMub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDRdOworLy8vIGMucmVhZCgmbXV0IGJ1ZikudW53cmFwKCk7CisvLy8gYy53cml0ZSgmdmVjIVswLCAxLCAyXSkudW53cmFwKCk7CisvLy8gYGBgCisvLy8KKy8vLyBDcmVhdGUgYSBgVFRjcENoYW5uZWxgIGJ5IHdyYXBwaW5nIGFuIGV4aXN0aW5nIGBUY3BTdHJlYW1gLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisvLy8gdXNlIHN0ZDo6bmV0OjpUY3BTdHJlYW07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBzdHJlYW0gPSBUY3BTdHJlYW06OmNvbm5lY3QoIjEyNy4wLjAuMTo5MTg5IikudW53cmFwKCk7CisvLy8KKy8vLyAvLyBubyBuZWVkIHRvIGNhbGwgYy5vcGVuKCkgc2luY2Ugd2UndmUgYWxyZWFkeSBjb25uZWN0ZWQgYWJvdmUKKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6d2l0aF9zdHJlYW0oc3RyZWFtKTsKKy8vLworLy8vIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDRdOworLy8vIGMucmVhZCgmbXV0IGJ1ZikudW53cmFwKCk7CisvLy8gYy53cml0ZSgmdmVjIVswLCAxLCAyXSkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZywgRGVmYXVsdCldCitwdWIgc3RydWN0IFRUY3BDaGFubmVsIHsKKyAgICBzdHJlYW06IE9wdGlvbjxUY3BTdHJlYW0+LAorfQorCitpbXBsIFRUY3BDaGFubmVsIHsKKyAgICAvLy8gQ3JlYXRlIGFuIHVuaW5pdGlhbGl6ZWQgYFRUY3BDaGFubmVsYC4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHJldHVybmVkIGluc3RhbmNlIG11c3QgYmUgb3BlbmVkIHVzaW5nIGBUVGNwQ2hhbm5lbDo6b3BlbiguLi4pYAorICAgIC8vLyBiZWZvcmUgaXQgY2FuIGJlIHVzZWQuCisgICAgcHViIGZuIG5ldygpIC0+IFRUY3BDaGFubmVsIHsKKyAgICAgICAgVFRjcENoYW5uZWwgeyBzdHJlYW06IE5vbmUgfQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBgVFRjcENoYW5uZWxgIHRoYXQgd3JhcHMgYW4gZXhpc3RpbmcgYFRjcFN0cmVhbWAuCisgICAgLy8vCisgICAgLy8vIFRoZSBwYXNzZWQtaW4gc3RyZWFtIGlzIGFzc3VtZWQgdG8gaGF2ZSBiZWVuIG9wZW5lZCBiZWZvcmUgYmVpbmcgd3JhcHBlZAorICAgIC8vLyBieSB0aGUgY3JlYXRlZCBgVFRjcENoYW5uZWxgIGluc3RhbmNlLgorICAgIHB1YiBmbiB3aXRoX3N0cmVhbShzdHJlYW06IFRjcFN0cmVhbSkgLT4gVFRjcENoYW5uZWwgeworICAgICAgICBUVGNwQ2hhbm5lbCB7CisgICAgICAgICAgICBzdHJlYW06IFNvbWUoc3RyZWFtKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBDb25uZWN0IHRvIGByZW1vdGVfYWRkcmVzc2AsIHdoaWNoIHNob3VsZCBoYXZlIHRoZSBmb3JtIGBob3N0OnBvcnRgLgorICAgIHB1YiBmbiBvcGVuKCZtdXQgc2VsZiwgcmVtb3RlX2FkZHJlc3M6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIHNlbGYuc3RyZWFtLmlzX3NvbWUoKSB7CisgICAgICAgICAgICBFcnIobmV3X3RyYW5zcG9ydF9lcnJvcigKKyAgICAgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OkFscmVhZHlPcGVuLAorICAgICAgICAgICAgICAgICJ0Y3AgY29ubmVjdGlvbiBwcmV2aW91c2x5IG9wZW5lZCIsCisgICAgICAgICAgICApKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF0Y2ggVGNwU3RyZWFtOjpjb25uZWN0KCZyZW1vdGVfYWRkcmVzcykgeworICAgICAgICAgICAgICAgIE9rKHMpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBTb21lKHMpOworICAgICAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRXJyKGUpID0+IEVycihGcm9tOjpmcm9tKGUpKSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBTaHV0IGRvd24gdGhpcyBjaGFubmVsLgorICAgIC8vLworICAgIC8vLyBCb3RoIHNlbmQgYW5kIHJlY2VpdmUgaGFsdmVzIGFyZSBjbG9zZWQsIGFuZCB0aGlzIGluc3RhbmNlIGNhbiBubworICAgIC8vLyBsb25nZXIgYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGFub3RoZXIgZW5kcG9pbnQuCisgICAgcHViIGZuIGNsb3NlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pZl9zZXQofHN8IHMuc2h1dGRvd24oU2h1dGRvd246OkJvdGgpKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiBpZl9zZXQ8RiwgVD4oJm11dCBzZWxmLCBtdXQgc3RyZWFtX29wZXJhdGlvbjogRikgLT4gaW86OlJlc3VsdDxUPgorICAgIHdoZXJlCisgICAgICAgIEY6IEZuTXV0KCZtdXQgVGNwU3RyZWFtKSAtPiBpbzo6UmVzdWx0PFQ+LAorICAgIHsKKyAgICAgICAgaWYgbGV0IFNvbWUocmVmIG11dCBzKSA9IHNlbGYuc3RyZWFtIHsKKyAgICAgICAgICAgIHN0cmVhbV9vcGVyYXRpb24ocykKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVycihpbzo6RXJyb3I6Om5ldygKKyAgICAgICAgICAgICAgICBFcnJvcktpbmQ6Ok5vdENvbm5lY3RlZCwKKyAgICAgICAgICAgICAgICAidGNwIGVuZHBvaW50IG5vdCBjb25uZWN0ZWQiLAorICAgICAgICAgICAgKSkKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBUSW9DaGFubmVsIGZvciBUVGNwQ2hhbm5lbCB7CisgICAgZm4gc3BsaXQoc2VsZikgLT4gOjpSZXN1bHQ8KFJlYWRIYWxmPFNlbGY+LCBXcml0ZUhhbGY8U2VsZj4pPgorICAgIHdoZXJlCisgICAgICAgIFNlbGY6IFNpemVkLAorICAgIHsKKyAgICAgICAgbGV0IG11dCBzID0gc2VsZjsKKworICAgICAgICBzLnN0cmVhbQorICAgICAgICAgICAgLmFzX211dCgpCisgICAgICAgICAgICAuYW5kX3RoZW4ofHN8IHMudHJ5X2Nsb25lKCkub2soKSkKKyAgICAgICAgICAgIC5tYXAofGNsb25lZHwgeworICAgICAgICAgICAgICAgIGxldCByZWFkX2hhbGYgPSBSZWFkSGFsZjo6bmV3KFRUY3BDaGFubmVsIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtOiBzLnN0cmVhbS50YWtlKCksCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgbGV0IHdyaXRlX2hhbGYgPSBXcml0ZUhhbGY6Om5ldyhUVGNwQ2hhbm5lbCB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbTogU29tZShjbG9uZWQpLAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIChyZWFkX2hhbGYsIHdyaXRlX2hhbGYpCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLm9rX29yX2Vsc2UofHwgeworICAgICAgICAgICAgICAgIG5ld190cmFuc3BvcnRfZXJyb3IoCisgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBjbG9uZSB1bmRlcmx5aW5nIHRjcCBzdHJlYW0iLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCisgICAgfQorfQorCitpbXBsIFJlYWQgZm9yIFRUY3BDaGFubmVsIHsKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYjogJm11dCBbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIHNlbGYuaWZfc2V0KHxzfCBzLnJlYWQoYikpCisgICAgfQorfQorCitpbXBsIFdyaXRlIGZvciBUVGNwQ2hhbm5lbCB7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBzZWxmLmlmX3NldCh8c3wgcy53cml0ZShiKSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pZl9zZXQofHN8IHMuZmx1c2goKSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9DYXJnby50b21sIGIvbGliL3JzL3Rlc3QvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGRlYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE1IEBACitbcGFja2FnZV0KK25hbWUgPSAia2l0Y2hlbi1zaW5rIgordmVyc2lvbiA9ICIwLjEuMCIKK2xpY2Vuc2UgPSAiQXBhY2hlLTIuMCIKK2F1dGhvcnMgPSBbIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiJdCitwdWJsaXNoID0gZmFsc2UKKworW2RlcGVuZGVuY2llc10KK2NsYXAgPSAiPDIuMjguMCIKK29yZGVyZWQtZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKKworW2RlcGVuZGVuY2llcy50aHJpZnRdCitwYXRoID0gIi4uLyIKKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvcnMvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWRkNzU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK3N0dWJzOiB0aHJpZnRzL0Jhc2VfT25lLnRocmlmdCB0aHJpZnRzL0Jhc2VfVHdvLnRocmlmdCB0aHJpZnRzL01pZGxheWVyLnRocmlmdCB0aHJpZnRzL1VsdGltYXRlLnRocmlmdCAkKHRvcF9idWlsZGRpcikvdGVzdC9SZWN1cnNpdmUudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQKKwkkKFRIUklGVCkgLUkgLi90aHJpZnRzIC1vdXQgc3JjIC0tZ2VuIHJzIHRocmlmdHMvQmFzZV9Ud28udGhyaWZ0CisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyB0aHJpZnRzL01pZGxheWVyLnRocmlmdAorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQKKwkkKFRIUklGVCkgLW91dCBzcmMgLS1nZW4gcnMgJCh0b3BfYnVpbGRkaXIpL3Rlc3QvUmVjdXJzaXZlLnRocmlmdAorCitjaGVjazogc3R1YnMKKwkkKENBUkdPKSBidWlsZAorCSQoQ0FSR08pIHRlc3QKKwlbIC1kIGJpbiBdIHx8IG1rZGlyIGJpbgorCWNwIHRhcmdldC9kZWJ1Zy9raXRjaGVuX3Npbmtfc2VydmVyIGJpbi9raXRjaGVuX3Npbmtfc2VydmVyCisJY3AgdGFyZ2V0L2RlYnVnL2tpdGNoZW5fc2lua19jbGllbnQgYmluL2tpdGNoZW5fc2lua19jbGllbnQKKworY2xlYW4tbG9jYWw6CisJJChDQVJHTykgY2xlYW4KKwktJChSTSkgQ2FyZ28ubG9jaworCS0kKFJNKSBzcmMvYmFzZV9vbmUucnMKKwktJChSTSkgc3JjL2Jhc2VfdHdvLnJzCisJLSQoUk0pIHNyYy9taWRsYXllci5ycworCS0kKFJNKSBzcmMvdWx0aW1hdGUucnMKKwktJChSTSkgLXIgYmluCisKK0VYVFJBX0RJU1QgPSBcCisJQ2FyZ28udG9tbCBcCisJdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQgXAorCXRocmlmdHMvQmFzZV9Ud28udGhyaWZ0IFwKKwl0aHJpZnRzL01pZGxheWVyLnRocmlmdCBcCisJdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQgXAorCXNyYy9saWIucnMgXAorCXNyYy9iaW4va2l0Y2hlbl9zaW5rX3NlcnZlci5ycyBcCisJc3JjL2Jpbi9raXRjaGVuX3NpbmtfY2xpZW50LnJzCisKZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX2NsaWVudC5ycyBiL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX2NsaWVudC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjk1Yzg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3NpbmtfY2xpZW50LnJzCkBAIC0wLDAgKzEsMjM5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGNsYXA7CisKK2V4dGVybiBjcmF0ZSBraXRjaGVuX3Npbms7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworCit1c2Ugc3RkOjpjb252ZXJ0OjpJbnRvOworCit1c2Uga2l0Y2hlbl9zaW5rOjpiYXNlX3R3bzo6e1ROYXBraW5TZXJ2aWNlU3luY0NsaWVudCwgVFJhbWVuU2VydmljZVN5bmNDbGllbnR9OwordXNlIGtpdGNoZW5fc2luazo6bWlkbGF5ZXI6OntNZWFsU2VydmljZVN5bmNDbGllbnQsIFRNZWFsU2VydmljZVN5bmNDbGllbnR9OwordXNlIGtpdGNoZW5fc2luazo6cmVjdXJzaXZlOwordXNlIGtpdGNoZW5fc2luazo6cmVjdXJzaXZlOjp7Q29SZWMsIENvUmVjMiwgUmVjTGlzdCwgUmVjVHJlZSwgVFRlc3RTZXJ2aWNlU3luY0NsaWVudH07Cit1c2Uga2l0Y2hlbl9zaW5rOjp1bHRpbWF0ZTo6e0Z1bGxNZWFsU2VydmljZVN5bmNDbGllbnQsIFRGdWxsTWVhbFNlcnZpY2VTeW5jQ2xpZW50fTsKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7CisgICAgVEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwgVENvbXBhY3RJbnB1dFByb3RvY29sLCBUQ29tcGFjdE91dHB1dFByb3RvY29sLAorICAgIFRJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2wsCit9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7CisgICAgUmVhZEhhbGYsIFRGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkV3JpdGVUcmFuc3BvcnQsIFRJb0NoYW5uZWwsIFRUY3BDaGFubmVsLCBXcml0ZUhhbGYsCit9OworCitmbiBtYWluKCkgeworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IHByaW50bG4hKCJraXRjaGVuIHNpbmsgY2xpZW50IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJraXRjaGVuIHNpbmsgY2xpZW50IGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbWF0Y2hlcyA9IGNsYXBfYXBwIShydXN0X2tpdGNoZW5fc2lua19jbGllbnQgPT4KKyAgICAgICAgKHZlcnNpb246ICIwLjEuMCIpCisgICAgICAgIChhdXRob3I6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iKQorICAgICAgICAoYWJvdXQ6ICJUaHJpZnQgUnVzdCBraXRjaGVuIHNpbmsgY2xpZW50IikKKyAgICAgICAgKEBhcmcgaG9zdDogLS1ob3N0ICt0YWtlc192YWx1ZSAiSG9zdCBvbiB3aGljaCB0aGUgVGhyaWZ0IHRlc3Qgc2VydmVyIGlzIGxvY2F0ZWQiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJQb3J0IG9uIHdoaWNoIHRoZSBUaHJpZnQgdGVzdCBzZXJ2ZXIgaXMgbGlzdGVuaW5nIikKKyAgICAgICAgKEBhcmcgcHJvdG9jb2w6IC0tcHJvdG9jb2wgK3Rha2VzX3ZhbHVlICJUaHJpZnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJpbmFyeVwiLCBcImNvbXBhY3RcIikiKQorICAgICAgICAoQGFyZyBzZXJ2aWNlOiAtLXNlcnZpY2UgK3Rha2VzX3ZhbHVlICJTZXJ2aWNlIHR5cGUgdG8gY29udGFjdCAoXCJwYXJ0XCIsIFwiZnVsbFwiLCBcInJlY3Vyc2l2ZVwiKSIpCisgICAgKQorICAgICAgICAgICAgLmdldF9tYXRjaGVzKCk7CisKKyAgICBsZXQgaG9zdCA9IG1hdGNoZXMudmFsdWVfb2YoImhvc3QiKS51bndyYXBfb3IoIjEyNy4wLjAuMSIpOworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKyAgICBsZXQgcHJvdG9jb2wgPSBtYXRjaGVzLnZhbHVlX29mKCJwcm90b2NvbCIpLnVud3JhcF9vcigiY29tcGFjdCIpOworICAgIGxldCBzZXJ2aWNlID0gbWF0Y2hlcy52YWx1ZV9vZigic2VydmljZSIpLnVud3JhcF9vcigicGFydCIpOworCisgICAgbGV0IChpX2NoYW4sIG9fY2hhbikgPSB0Y3BfY2hhbm5lbChob3N0LCBwb3J0KT87CisgICAgbGV0IChpX3RyYW4sIG9fdHJhbikgPSAoCisgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpuZXcoaV9jaGFuKSwKKyAgICAgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcob19jaGFuKSwKKyAgICApOworCisgICAgbGV0IChpX3Byb3QsIG9fcHJvdCk6IChCb3g8VElucHV0UHJvdG9jb2w+LCBCb3g8VE91dHB1dFByb3RvY29sPikgPSBtYXRjaCBwcm90b2NvbCB7CisgICAgICAgICJiaW5hcnkiID0+ICgKKyAgICAgICAgICAgIEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuLCB0cnVlKSksCisgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4sIHRydWUpKSwKKyAgICAgICAgKSwKKyAgICAgICAgImNvbXBhY3QiID0+ICgKKyAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbikpLAorICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbikpLAorICAgICAgICApLAorICAgICAgICB1bm1hdGNoZWQgPT4gcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCBwcm90b2NvbCB7fSIsIHVubWF0Y2hlZCkuaW50bygpKSwKKyAgICB9OworCisgICAgcnVuX2NsaWVudChzZXJ2aWNlLCBpX3Byb3QsIG9fcHJvdCkKK30KKworZm4gcnVuX2NsaWVudCgKKyAgICBzZXJ2aWNlOiAmc3RyLAorICAgIGlfcHJvdDogQm94PFRJbnB1dFByb3RvY29sPiwKKyAgICBvX3Byb3Q6IEJveDxUT3V0cHV0UHJvdG9jb2w+LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIG1hdGNoIHNlcnZpY2UgeworICAgICAgICAiZnVsbCIgPT4gZXhlY19mdWxsX21lYWxfY2xpZW50KGlfcHJvdCwgb19wcm90KSwKKyAgICAgICAgInBhcnQiID0+IGV4ZWNfbWVhbF9jbGllbnQoaV9wcm90LCBvX3Byb3QpLAorICAgICAgICAicmVjdXJzaXZlIiA9PiBleGVjX3JlY3Vyc2l2ZV9jbGllbnQoaV9wcm90LCBvX3Byb3QpLAorICAgICAgICBfID0+IEVycih0aHJpZnQ6OkVycm9yOjpmcm9tKGZvcm1hdCEoCisgICAgICAgICAgICAidW5rbm93biBzZXJ2aWNlIHR5cGUge30iLAorICAgICAgICAgICAgc2VydmljZQorICAgICAgICApKSksCisgICAgfQorfQorCitmbiB0Y3BfY2hhbm5lbCgKKyAgICBob3N0OiAmc3RyLAorICAgIHBvcnQ6IHUxNiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KFJlYWRIYWxmPFRUY3BDaGFubmVsPiwgV3JpdGVIYWxmPFRUY3BDaGFubmVsPik+IHsKKyAgICBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisgICAgYy5vcGVuKCZmb3JtYXQhKCJ7fTp7fSIsIGhvc3QsIHBvcnQpKT87CisgICAgYy5zcGxpdCgpCit9CisKK2ZuIGV4ZWNfbWVhbF9jbGllbnQoCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG11dCBjbGllbnQgPSBNZWFsU2VydmljZVN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCk7CisKKyAgICAvLyBjbGllbnQuZnVsbF9tZWFsKCk7IC8vIDwtLSBJTVBPUlRBTlQ6IGlmIHlvdSB1bmNvbW1lbnQgdGhpcywgY29tcGlsYXRpb24gKnNob3VsZCogZmFpbAorICAgIC8vIHRoaXMgaXMgYmVjYXVzZSB0aGUgTWVhbFNlcnZpY2Ugc3RydWN0IGRvZXMgbm90IGNvbnRhaW4gdGhlIGFwcHJvcHJpYXRlIHNlcnZpY2UgbWFya2VyCisKKyAgICAvLyBvbmx5IHRoZSBmb2xsb3dpbmcgdGhyZWUgY2FsbHMgd29yaworICAgIGV4ZWN1dGVfY2FsbCgicGFydCIsICJyYW1lbiIsIHx8IGNsaWVudC5yYW1lbig1MCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoInBhcnQiLCAibWVhbCIsIHx8IGNsaWVudC5tZWFsKCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoInBhcnQiLCAibmFwa2luIiwgfHwgY2xpZW50Lm5hcGtpbigpKS5tYXAofF98ICgpKT87CisKKyAgICBPaygoKSkKK30KKworZm4gZXhlY19mdWxsX21lYWxfY2xpZW50KAorICAgIGlfcHJvdDogQm94PFRJbnB1dFByb3RvY29sPiwKKyAgICBvX3Byb3Q6IEJveDxUT3V0cHV0UHJvdG9jb2w+LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBtdXQgY2xpZW50ID0gRnVsbE1lYWxTZXJ2aWNlU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KTsKKworICAgIGV4ZWN1dGVfY2FsbCgiZnVsbCIsICJyYW1lbiIsIHx8IGNsaWVudC5yYW1lbigxMDApKS5tYXAofF98ICgpKT87CisgICAgZXhlY3V0ZV9jYWxsKCJmdWxsIiwgIm1lYWwiLCB8fCBjbGllbnQubWVhbCgpKS5tYXAofF98ICgpKT87CisgICAgZXhlY3V0ZV9jYWxsKCJmdWxsIiwgIm5hcGtpbiIsIHx8IGNsaWVudC5uYXBraW4oKSkubWFwKHxffCAoKSk/OworICAgIGV4ZWN1dGVfY2FsbCgiZnVsbCIsICJmdWxsIG1lYWwiLCB8fCBjbGllbnQuZnVsbF9tZWFsKCkpLm1hcCh8X3wgKCkpPzsKKworICAgIE9rKCgpKQorfQorCitmbiBleGVjX3JlY3Vyc2l2ZV9jbGllbnQoCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG11dCBjbGllbnQgPSByZWN1cnNpdmU6OlRlc3RTZXJ2aWNlU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KTsKKworICAgIGxldCB0cmVlID0gUmVjVHJlZSB7CisgICAgICAgIGNoaWxkcmVuOiBTb21lKHZlYyFbQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICBjaGlsZHJlbjogU29tZSh2ZWMhWworICAgICAgICAgICAgICAgIEJveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgaXRlbTogU29tZSgzKSwKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICBCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoNCksCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICBdKSwKKyAgICAgICAgICAgIGl0ZW06IFNvbWUoMiksCisgICAgICAgIH0pXSksCisgICAgICAgIGl0ZW06IFNvbWUoMSksCisgICAgfTsKKworICAgIGxldCBleHBlY3RlZF90cmVlID0gUmVjVHJlZSB7CisgICAgICAgIGNoaWxkcmVuOiBTb21lKHZlYyFbQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICBjaGlsZHJlbjogU29tZSh2ZWMhWworICAgICAgICAgICAgICAgIEJveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogU29tZShWZWM6Om5ldygpKSwgLy8gcmVtb3RlIHJldHVybnMgYW4gZW1wdHkgbGlzdAorICAgICAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDMpLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIEJveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogU29tZShWZWM6Om5ldygpKSwgLy8gcmVtb3RlIHJldHVybnMgYW4gZW1wdHkgbGlzdAorICAgICAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDQpLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgXSksCisgICAgICAgICAgICBpdGVtOiBTb21lKDIpLAorICAgICAgICB9KV0pLAorICAgICAgICBpdGVtOiBTb21lKDEpLAorICAgIH07CisKKyAgICBsZXQgcmV0dXJuZWRfdHJlZSA9IGV4ZWN1dGVfY2FsbCgicmVjdXJzaXZlIiwgImVjaG9fdHJlZSIsIHx8IGNsaWVudC5lY2hvX3RyZWUodHJlZS5jbG9uZSgpKSk/OworICAgIGlmIHJldHVybmVkX3RyZWUgIT0gZXhwZWN0ZWRfdHJlZSB7CisgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgKKyAgICAgICAgICAgICJtaXNtYXRjaGVkIHJlY3Vyc2l2ZSB0cmVlIHs6P30gezo/fSIsCisgICAgICAgICAgICBleHBlY3RlZF90cmVlLCByZXR1cm5lZF90cmVlCisgICAgICAgICkKKyAgICAgICAgLmludG8oKSk7CisgICAgfQorCisgICAgbGV0IGxpc3QgPSBSZWNMaXN0IHsKKyAgICAgICAgbmV4dGl0ZW06IFNvbWUoQm94OjpuZXcoUmVjTGlzdCB7CisgICAgICAgICAgICBuZXh0aXRlbTogU29tZShCb3g6Om5ldyhSZWNMaXN0IHsKKyAgICAgICAgICAgICAgICBuZXh0aXRlbTogTm9uZSwKKyAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDMpLAorICAgICAgICAgICAgfSkpLAorICAgICAgICAgICAgaXRlbTogU29tZSgyKSwKKyAgICAgICAgfSkpLAorICAgICAgICBpdGVtOiBTb21lKDEpLAorICAgIH07CisgICAgbGV0IHJldHVybmVkX2xpc3QgPSBleGVjdXRlX2NhbGwoInJlY3Vyc2l2ZSIsICJlY2hvX2xpc3QiLCB8fCBjbGllbnQuZWNob19saXN0KGxpc3QuY2xvbmUoKSkpPzsKKyAgICBpZiByZXR1cm5lZF9saXN0ICE9IGxpc3QgeworICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoIm1pc21hdGNoZWQgcmVjdXJzaXZlIGxpc3Qgezo/fSB7Oj99IiwgbGlzdCwgcmV0dXJuZWRfbGlzdCkuaW50bygpKTsKKyAgICB9CisKKyAgICBsZXQgY29fcmVjID0gQ29SZWMgeworICAgICAgICBvdGhlcjogU29tZShCb3g6Om5ldyhDb1JlYzIgeworICAgICAgICAgICAgb3RoZXI6IFNvbWUoQ29SZWMgeworICAgICAgICAgICAgICAgIG90aGVyOiBTb21lKEJveDo6bmV3KENvUmVjMiB7IG90aGVyOiBOb25lIH0pKSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICB9KSksCisgICAgfTsKKyAgICBsZXQgcmV0dXJuZWRfY29fcmVjID0gZXhlY3V0ZV9jYWxsKCJyZWN1cnNpdmUiLCAiZWNob19jb19yZWMiLCB8fCB7CisgICAgICAgIGNsaWVudC5lY2hvX2NvX3JlYyhjb19yZWMuY2xvbmUoKSkKKyAgICB9KT87CisgICAgaWYgcmV0dXJuZWRfY29fcmVjICE9IGNvX3JlYyB7CisgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgibWlzbWF0Y2hlZCBjb19yZWMgezo/fSB7Oj99IiwgY29fcmVjLCByZXR1cm5lZF9jb19yZWMpLmludG8oKSk7CisgICAgfQorCisgICAgT2soKCkpCit9CisKK2ZuIGV4ZWN1dGVfY2FsbDxGLCBSPihzZXJ2aWNlX3R5cGU6ICZzdHIsIGNhbGxfbmFtZTogJnN0ciwgbXV0IGY6IEYpIC0+IHRocmlmdDo6UmVzdWx0PFI+Cit3aGVyZQorICAgIEY6IEZuTXV0KCkgLT4gdGhyaWZ0OjpSZXN1bHQ8Uj4sCit7CisgICAgbGV0IHJlcyA9IGYoKTsKKworICAgIG1hdGNoIHJlcyB7CisgICAgICAgIE9rKF8pID0+IHByaW50bG4hKCJ7fTogY29tcGxldGVkIHt9IGNhbGwiLCBzZXJ2aWNlX3R5cGUsIGNhbGxfbmFtZSksCisgICAgICAgIEVycihyZWYgZSkgPT4gcHJpbnRsbiEoCisgICAgICAgICAgICAie306IGZhaWxlZCB7fSBjYWxsIHdpdGggZXJyb3Igezo/fSIsCisgICAgICAgICAgICBzZXJ2aWNlX3R5cGUsIGNhbGxfbmFtZSwgZQorICAgICAgICApLAorICAgIH0KKworICAgIHJlcworfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3Npbmtfc2VydmVyLnJzIGIvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3Npbmtfc2VydmVyLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODAxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIucnMKQEAgLTAsMCArMSwzMTMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKK2V4dGVybiBjcmF0ZSBraXRjaGVuX3Npbms7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworCit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6eworICAgIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSwgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSwgVElucHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorfTsKK3VzZSB0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcjsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6eworICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRXcml0ZVRyYW5zcG9ydEZhY3RvcnksCit9OworCit1c2Uga2l0Y2hlbl9zaW5rOjpiYXNlX29uZTo6Tm9vZGxlOwordXNlIGtpdGNoZW5fc2luazo6YmFzZV90d286OnsKKyAgICBCcm90aFR5cGUsIE5hcGtpbiwgTmFwa2luU2VydmljZVN5bmNIYW5kbGVyLCBSYW1lbiwgUmFtZW5TZXJ2aWNlU3luY0hhbmRsZXIsCit9OwordXNlIGtpdGNoZW5fc2luazo6bWlkbGF5ZXI6OnsKKyAgICBEZXNzZXJ0LCBNZWFsLCBNZWFsU2VydmljZVN5bmNIYW5kbGVyLCBNZWFsU2VydmljZVN5bmNQcm9jZXNzb3IsIFBpZSwKK307Cit1c2Uga2l0Y2hlbl9zaW5rOjpyZWN1cnNpdmU7Cit1c2Uga2l0Y2hlbl9zaW5rOjp1bHRpbWF0ZTo6RnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlU3luY0hhbmRsZXI7Cit1c2Uga2l0Y2hlbl9zaW5rOjp1bHRpbWF0ZTo6eworICAgIERyaW5rLCBGdWxsTWVhbCwgRnVsbE1lYWxBbmREcmlua3MsIEZ1bGxNZWFsQW5kRHJpbmtzU2VydmljZVN5bmNQcm9jZXNzb3IsCisgICAgRnVsbE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIsCit9OworCitmbiBtYWluKCkgeworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IHByaW50bG4hKCJraXRjaGVuIHNpbmsgc2VydmVyIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJraXRjaGVuIHNpbmsgc2VydmVyIGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbWF0Y2hlcyA9IGNsYXBfYXBwIShydXN0X2tpdGNoZW5fc2lua19zZXJ2ZXIgPT4KKyAgICAgICAgKHZlcnNpb246ICIwLjEuMCIpCisgICAgICAgIChhdXRob3I6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iKQorICAgICAgICAoYWJvdXQ6ICJUaHJpZnQgUnVzdCBraXRjaGVuIHNpbmsgdGVzdCBzZXJ2ZXIiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJwb3J0IG9uIHdoaWNoIHRoZSB0ZXN0IHNlcnZlciBsaXN0ZW5zIikKKyAgICAgICAgKEBhcmcgcHJvdG9jb2w6IC0tcHJvdG9jb2wgK3Rha2VzX3ZhbHVlICJUaHJpZnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJpbmFyeVwiLCBcImNvbXBhY3RcIikiKQorICAgICAgICAoQGFyZyBzZXJ2aWNlOiAtLXNlcnZpY2UgK3Rha2VzX3ZhbHVlICJTZXJ2aWNlIHR5cGUgdG8gY29udGFjdCAoXCJwYXJ0XCIsIFwiZnVsbFwiLCBcInJlY3Vyc2l2ZVwiKSIpCisgICAgKQorICAgICAgICAgICAgLmdldF9tYXRjaGVzKCk7CisKKyAgICBsZXQgcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJwb3J0IiwgdTE2KS51bndyYXBfb3IoOTA5MCk7CisgICAgbGV0IHByb3RvY29sID0gbWF0Y2hlcy52YWx1ZV9vZigicHJvdG9jb2wiKS51bndyYXBfb3IoImNvbXBhY3QiKTsKKyAgICBsZXQgc2VydmljZSA9IG1hdGNoZXMudmFsdWVfb2YoInNlcnZpY2UiKS51bndyYXBfb3IoInBhcnQiKTsKKyAgICBsZXQgbGlzdGVuX2FkZHJlc3MgPSBmb3JtYXQhKCIxMjcuMC4wLjE6e30iLCBwb3J0KTsKKworICAgIHByaW50bG4hKCJiaW5kaW5nIHRvIHt9IiwgbGlzdGVuX2FkZHJlc3MpOworCisgICAgbGV0IHJfdHJhbnNwb3J0X2ZhY3RvcnkgPSBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpOworICAgIGxldCB3X3RyYW5zcG9ydF9mYWN0b3J5ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCk7CisKKyAgICBsZXQgKGlfcHJvdG9jb2xfZmFjdG9yeSwgb19wcm90b2NvbF9mYWN0b3J5KTogKAorICAgICAgICBCb3g8VElucHV0UHJvdG9jb2xGYWN0b3J5PiwKKyAgICAgICAgQm94PFRPdXRwdXRQcm90b2NvbEZhY3Rvcnk+LAorICAgICkgPSBtYXRjaCAmKnByb3RvY29sIHsKKyAgICAgICAgImJpbmFyeSIgPT4gKAorICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICksCisgICAgICAgICJjb21wYWN0IiA9PiAoCisgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpLAorICAgICAgICApLAorICAgICAgICB1bmtub3duID0+IHsKKyAgICAgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgdHJhbnNwb3J0IHR5cGUge30iLCB1bmtub3duKS5pbnRvKCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIEZJWE1FOiBzaG91bGQgcHJvY2Vzc29yIGJlIGJveGVkIGFzIHdlbGw/CisgICAgLy8KKyAgICAvLyBbc2lnaF0gSSBoYXRlIFJ1c3QgZ2VuZXJpY3MgaW1wbGVtZW50YXRpb24KKyAgICAvLworICAgIC8vIEkgd291bGQgaGF2ZSBwcmVmZXJyZWQgdG8gYnVpbGQgYSBzZXJ2ZXIgaGVyZSwgcmV0dXJuIGl0LCBhbmQgdGhlbiBkbworICAgIC8vIHRoZSBjb21tb24gbGlzdGVuLWFuZC1oYW5kbGUgc3R1ZmYsIGJ1dCBzaW5jZSB0aGUgc2VydmVyIGRvZXNuJ3QgaGF2ZSBhCisgICAgLy8gY29tbW9uIHR5cGUgKGJlY2F1c2UgZWFjaCBtYXRjaCBhcm0gaW5zdGFudGlhdGVzIGEgc2VydmVyIHdpdGggYQorICAgIC8vIGRpZmZlcmVudCBwcm9jZXNzb3IpIHRoaXMgaXNuJ3QgcG9zc2libGUuCisgICAgLy8KKyAgICAvLyBTaW5jZSB3aGF0IEknbSBkb2luZyBpcyB1bmNvbW1vbiBJJ20ganVzdCBnb2luZyB0byBkdXBsaWNhdGUgdGhlIGNvZGUKKyAgICBtYXRjaCAmKnNlcnZpY2UgeworICAgICAgICAicGFydCIgPT4gcnVuX21lYWxfc2VydmVyKAorICAgICAgICAgICAgJmxpc3Rlbl9hZGRyZXNzLAorICAgICAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICksCisgICAgICAgICJmdWxsIiA9PiBydW5fZnVsbF9tZWFsX3NlcnZlcigKKyAgICAgICAgICAgICZsaXN0ZW5fYWRkcmVzcywKKyAgICAgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICApLAorICAgICAgICAicmVjdXJzaXZlIiA9PiBydW5fcmVjdXJzaXZlX3NlcnZlcigKKyAgICAgICAgICAgICZsaXN0ZW5fYWRkcmVzcywKKyAgICAgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICApLAorICAgICAgICB1bmtub3duID0+IEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCBzZXJ2aWNlIHR5cGUge30iLCB1bmtub3duKS5pbnRvKCkpLAorICAgIH0KK30KKworZm4gcnVuX21lYWxfc2VydmVyPFJURiwgSVBGLCBXVEYsIE9QRj4oCisgICAgbGlzdGVuX2FkZHJlc3M6ICZzdHIsCisgICAgcl90cmFuc3BvcnRfZmFjdG9yeTogUlRGLAorICAgIGlfcHJvdG9jb2xfZmFjdG9yeTogSVBGLAorICAgIHdfdHJhbnNwb3J0X2ZhY3Rvcnk6IFdURiwKKyAgICBvX3Byb3RvY29sX2ZhY3Rvcnk6IE9QRiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+Cit3aGVyZQorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIGxldCBwcm9jZXNzb3IgPSBNZWFsU2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhQYXJ0SGFuZGxlciB7fSk7CisgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgIDEsCisgICAgKTsKKworICAgIHNlcnZlci5saXN0ZW4obGlzdGVuX2FkZHJlc3MpCit9CisKK2ZuIHJ1bl9mdWxsX21lYWxfc2VydmVyPFJURiwgSVBGLCBXVEYsIE9QRj4oCisgICAgbGlzdGVuX2FkZHJlc3M6ICZzdHIsCisgICAgcl90cmFuc3BvcnRfZmFjdG9yeTogUlRGLAorICAgIGlfcHJvdG9jb2xfZmFjdG9yeTogSVBGLAorICAgIHdfdHJhbnNwb3J0X2ZhY3Rvcnk6IFdURiwKKyAgICBvX3Byb3RvY29sX2ZhY3Rvcnk6IE9QRiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+Cit3aGVyZQorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIGxldCBwcm9jZXNzb3IgPSBGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoRnVsbEhhbmRsZXIge30pOworICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAxLAorICAgICk7CisKKyAgICBzZXJ2ZXIubGlzdGVuKGxpc3Rlbl9hZGRyZXNzKQorfQorCitzdHJ1Y3QgUGFydEhhbmRsZXI7CisKK2ltcGwgTWVhbFNlcnZpY2VTeW5jSGFuZGxlciBmb3IgUGFydEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9tZWFsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxNZWFsPiB7CisgICAgICAgIHByaW50bG4hKCJwYXJ0OiBoYW5kbGluZyBtZWFsIGNhbGwiKTsKKyAgICAgICAgT2sobWVhbCgpKQorICAgIH0KK30KKworaW1wbCBSYW1lblNlcnZpY2VTeW5jSGFuZGxlciBmb3IgUGFydEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9yYW1lbigmc2VsZiwgXzogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxSYW1lbj4geworICAgICAgICBwcmludGxuISgicGFydDogaGFuZGxpbmcgcmFtZW4gY2FsbCIpOworICAgICAgICBPayhyYW1lbigpKQorICAgIH0KK30KKworaW1wbCBOYXBraW5TZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFBhcnRIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfbmFwa2luKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxOYXBraW4+IHsKKyAgICAgICAgcHJpbnRsbiEoInBhcnQ6IGhhbmRsaW5nIG5hcGtpbiBjYWxsIik7CisgICAgICAgIE9rKG5hcGtpbigpKQorICAgIH0KK30KKworLy8gZnVsbCBzZXJ2aWNlCisvLworCitzdHJ1Y3QgRnVsbEhhbmRsZXI7CisKK2ltcGwgRnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfZnVsbF9tZWFsX2FuZF9kcmlua3MoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PEZ1bGxNZWFsQW5kRHJpbmtzPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsX21lYWxfYW5kX2RyaW5rczogaGFuZGxpbmcgZnVsbCBtZWFsIGFuZCBkcmlua3MgY2FsbCIpOworICAgICAgICBPayhGdWxsTWVhbEFuZERyaW5rczo6bmV3KGZ1bGxfbWVhbCgpLCBEcmluazo6Q2FuYWRpYW5XaGlza3kpKQorICAgIH0KKworICAgIGZuIGhhbmRsZV9iZXN0X3BpZSgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8UGllPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsX21lYWxfYW5kX2RyaW5rczogaGFuZGxpbmcgcGllIGNhbGwiKTsKKyAgICAgICAgT2soUGllOjpNaXNzaXNzaXBwaU11ZCkgLy8gSSBwcmVmZXIgUGllOjpQdW1wa2luLCBidXQgSSBoYXZlIHRvIGNoZWNrIHRoYXQgY2FzaW5nIHdvcmtzCisgICAgfQorfQorCitpbXBsIEZ1bGxNZWFsU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX2Z1bGxfbWVhbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8RnVsbE1lYWw+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGw6IGhhbmRsaW5nIGZ1bGwgbWVhbCBjYWxsIik7CisgICAgICAgIE9rKGZ1bGxfbWVhbCgpKQorICAgIH0KK30KKworaW1wbCBNZWFsU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX21lYWwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PE1lYWw+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGw6IGhhbmRsaW5nIG1lYWwgY2FsbCIpOworICAgICAgICBPayhtZWFsKCkpCisgICAgfQorfQorCitpbXBsIFJhbWVuU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX3JhbWVuKCZzZWxmLCBfOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PFJhbWVuPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsOiBoYW5kbGluZyByYW1lbiBjYWxsIik7CisgICAgICAgIE9rKHJhbWVuKCkpCisgICAgfQorfQorCitpbXBsIE5hcGtpblNlcnZpY2VTeW5jSGFuZGxlciBmb3IgRnVsbEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9uYXBraW4oJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PE5hcGtpbj4geworICAgICAgICBwcmludGxuISgiZnVsbDogaGFuZGxpbmcgbmFwa2luIGNhbGwiKTsKKyAgICAgICAgT2sobmFwa2luKCkpCisgICAgfQorfQorCitmbiBmdWxsX21lYWwoKSAtPiBGdWxsTWVhbCB7CisgICAgRnVsbE1lYWw6Om5ldyhtZWFsKCksIERlc3NlcnQ6OlBvcnQoIkdyYWhhbSdzIFRhd255Ii50b19vd25lZCgpKSkKK30KKworZm4gbWVhbCgpIC0+IE1lYWwgeworICAgIE1lYWw6Om5ldyhub29kbGUoKSwgcmFtZW4oKSkKK30KKworZm4gbm9vZGxlKCkgLT4gTm9vZGxlIHsKKyAgICBOb29kbGU6Om5ldygic3BlbHQiLnRvX293bmVkKCksIDEwMCkKK30KKworZm4gcmFtZW4oKSAtPiBSYW1lbiB7CisgICAgUmFtZW46Om5ldygiTXIgUmFtZW4iLnRvX293bmVkKCksIDcyLCBCcm90aFR5cGU6Ok1pc28pCit9CisKK2ZuIG5hcGtpbigpIC0+IE5hcGtpbiB7CisgICAgTmFwa2luIHt9Cit9CisKK2ZuIHJ1bl9yZWN1cnNpdmVfc2VydmVyPFJURiwgSVBGLCBXVEYsIE9QRj4oCisgICAgbGlzdGVuX2FkZHJlc3M6ICZzdHIsCisgICAgcl90cmFuc3BvcnRfZmFjdG9yeTogUlRGLAorICAgIGlfcHJvdG9jb2xfZmFjdG9yeTogSVBGLAorICAgIHdfdHJhbnNwb3J0X2ZhY3Rvcnk6IFdURiwKKyAgICBvX3Byb3RvY29sX2ZhY3Rvcnk6IE9QRiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+Cit3aGVyZQorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIGxldCBwcm9jZXNzb3IgPSByZWN1cnNpdmU6OlRlc3RTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFJlY3Vyc2l2ZVRlc3RTZXJ2ZXJIYW5kbGVyIHt9KTsKKyAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgMSwKKyAgICApOworCisgICAgc2VydmVyLmxpc3RlbihsaXN0ZW5fYWRkcmVzcykKK30KKworc3RydWN0IFJlY3Vyc2l2ZVRlc3RTZXJ2ZXJIYW5kbGVyOworaW1wbCByZWN1cnNpdmU6OlRlc3RTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFJlY3Vyc2l2ZVRlc3RTZXJ2ZXJIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfZWNob190cmVlKCZzZWxmLCB0cmVlOiByZWN1cnNpdmU6OlJlY1RyZWUpIC0+IHRocmlmdDo6UmVzdWx0PHJlY3Vyc2l2ZTo6UmVjVHJlZT4geworICAgICAgICBwcmludGxuISgiezo/fSIsIHRyZWUpOworICAgICAgICBPayh0cmVlKQorICAgIH0KKworICAgIGZuIGhhbmRsZV9lY2hvX2xpc3QoJnNlbGYsIGxzdDogcmVjdXJzaXZlOjpSZWNMaXN0KSAtPiB0aHJpZnQ6OlJlc3VsdDxyZWN1cnNpdmU6OlJlY0xpc3Q+IHsKKyAgICAgICAgcHJpbnRsbiEoIns6P30iLCBsc3QpOworICAgICAgICBPayhsc3QpCisgICAgfQorCisgICAgZm4gaGFuZGxlX2VjaG9fY29fcmVjKCZzZWxmLCBpdGVtOiByZWN1cnNpdmU6OkNvUmVjKSAtPiB0aHJpZnQ6OlJlc3VsdDxyZWN1cnNpdmU6OkNvUmVjPiB7CisgICAgICAgIHByaW50bG4hKCJ7Oj99IiwgaXRlbSk7CisgICAgICAgIE9rKGl0ZW0pCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3Qvc3JjL2xpYi5ycyBiL2xpYi9ycy90ZXN0L3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlMTc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3NyYy9saWIucnMKQEAgLTAsMCArMSw1NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKK3B1YiBtb2QgYmFzZV9vbmU7CitwdWIgbW9kIGJhc2VfdHdvOworcHViIG1vZCBtaWRsYXllcjsKK3B1YiBtb2QgdWx0aW1hdGU7CitwdWIgbW9kIHJlY3Vyc2l2ZTsKKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHN0ZDo6ZGVmYXVsdDo6RGVmYXVsdDsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2JlX2FibGVfdG9fdXNlX2NvbnN0cnVjdG9yKCkgeworICAgICAgICBsZXQgXyA9IG1pZGxheWVyOjpNZWFsOjpuZXcoU29tZShiYXNlX29uZTo6Tm9vZGxlOjpkZWZhdWx0KCkpLCBOb25lKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9iZV9hYmxlX3RvX3VzZV9jb25zdHJ1Y3Rvcl93aXRoX25vX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IF8gPSBtaWRsYXllcjo6TWVhbDo6bmV3KE5vbmUsIE5vbmUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2JlX2FibGVfdG9fdXNlX2NvbnN0cnVjdG9yX3dpdGhvdXRfb3B0aW9uX3dyYXAoKSB7CisgICAgICAgIGxldCBfID0gbWlkbGF5ZXI6Ok1lYWw6Om5ldyhiYXNlX29uZTo6Tm9vZGxlOjpkZWZhdWx0KCksIE5vbmUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2JlX2FibGVfdG9fdXNlX2RlZmF1bHRzKCkgeworICAgICAgICBsZXQgXyA9IG1pZGxheWVyOjpNZWFsIHsKKyAgICAgICAgICAgIG5vb2RsZTogU29tZShiYXNlX29uZTo6Tm9vZGxlOjpkZWZhdWx0KCkpLAorICAgICAgICAgICAgLi5EZWZhdWx0OjpkZWZhdWx0KCkKKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfT25lLnRocmlmdCBiL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9PbmUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmE2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfT25lLnRocmlmdApAQCAtMCwwICsxLDg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit0eXBlZGVmIGk2NCBUZW1wZXJhdHVyZQorCit0eXBlZGVmIGk4IFNpemUKKwordHlwZWRlZiBzdHJpbmcgTG9jYXRpb24KKworY29uc3QgaTMyIEJvaWxpbmdQb2ludCA9IDEwMAorCitjb25zdCBsaXN0PFRlbXBlcmF0dXJlPiBUZW1wZXJhdHVyZXMgPSBbMTAsIDExLCAyMiwgMzNdCisKKy8vIElNUE9SVEFOVDogdGVtcHMgc2hvdWxkIGVuZCB3aXRoICIuMCIgYmVjYXVzZSB0aGlzIHRlc3RzCisvLyB0aGF0IHdlIGRvbid0IGhhdmUgYSBwcm9ibGVtIHdpdGggY29uc3QgZmxvYXQgbGlzdCBnZW5lcmF0aW9uCitjb25zdCBsaXN0PGRvdWJsZT4gQ29tbW9uVGVtcGVyYXR1cmVzID0gWzMwMC4wLCA0NTAuMF0KKworY29uc3QgZG91YmxlIE1lYWxzUGVyRGF5ID0gMi41OworCitjb25zdCBzdHJpbmcgRGVmYXVsdFJlY2lwZU5hbWUgPSAiU291cC1yaXNlIG9mIHRoZSBEYXkiCitjb25zdCBiaW5hcnkgRGVmYXVsdFJlY2lwZUJpbmFyeSA9ICJTb3VwLXJpc2Ugb2YgdGhlIDAxMDEwMTAxIgorCitzdHJ1Y3QgTm9vZGxlIHsKKyAgMTogc3RyaW5nIGZsb3VyVHlwZQorICAyOiBUZW1wZXJhdHVyZSBjb29rVGVtcAorfQorCitzdHJ1Y3QgU3BhZ2hldHRpIHsKKyAgMTogb3B0aW9uYWwgbGlzdDxOb29kbGU+IG5vb2RsZXMKK30KKworY29uc3QgTm9vZGxlIFNwZWx0Tm9vZGxlID0geyAiZmxvdXJUeXBlIjogInNwZWx0IiwgImNvb2tUZW1wIjogMTEwIH0KKworc3RydWN0IE1lYXN1cmluZ1Nwb29uIHsKKyAgMTogU2l6ZSBzaXplCit9CisKK3N0cnVjdCBNZWFzdXJpbmdDdXAgeworICAxOiBkb3VibGUgbWlsbGlzCit9CisKK3VuaW9uIE1lYXN1cmluZ0FpZHMgeworICAxOiBNZWFzdXJpbmdTcG9vbiBzcG9vbgorICAyOiBNZWFzdXJpbmdDdXAgY3VwCit9CisKK3N0cnVjdCBDb29raW5nVGVtcGVyYXR1cmVzIHsKKyAgMTogc2V0PGRvdWJsZT4gY29tbW9uVGVtcGVyYXR1cmVzCisgIDI6IGxpc3Q8ZG91YmxlPiB1c2VkVGVtcGVyYXR1cmVzCisgIDM6IG1hcDxkb3VibGUsIGRvdWJsZT4gZmFocmVuaGVpdFRvQ2VudGlncmFkZUNvbnZlcnNpb25zCit9CisKK3N0cnVjdCBSZWNpcGUgeworICAxOiBzdHJpbmcgcmVjaXBlTmFtZQorICAyOiBzdHJpbmcgY3Vpc2luZQorICAzOiBpOCBwYWdlCit9CisKK3VuaW9uIENvb2tpbmdUb29scyB7CisgIDE6IHNldDxNZWFzdXJpbmdTcG9vbj4gbWVhc3VyaW5nU3Bvb25zCisgIDI6IG1hcDxTaXplLCBMb2NhdGlvbj4gbWVhc3VyaW5nQ3VwcywKKyAgMzogbGlzdDxSZWNpcGU+IHJlY2lwZXMKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQgYi9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfVHdvLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWE2YWNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworY29uc3QgaTMyIFdhdGVyV2VpZ2h0ID0gMjAwCisKK2VudW0gYnJvdGhUeXBlIHsKKyAgTWlzbywKKyAgc2hvdXl1LAorfQorCitzdHJ1Y3QgUmFtZW4geworICAxOiBvcHRpb25hbCBzdHJpbmcgcmFtZW5UeXBlCisgIDI6IHJlcXVpcmVkIGkzMiBub29kbGVDb3VudAorICAzOiBicm90aFR5cGUgYnJvdGgKK30KKworc3RydWN0IE5hcGtpbiB7CisgIC8vIGVtcHR5Cit9CisKK3NlcnZpY2UgTmFwa2luU2VydmljZSB7CisgIE5hcGtpbiBuYXBraW4oKQorfQorCitzZXJ2aWNlIFJhbWVuU2VydmljZSBleHRlbmRzIE5hcGtpblNlcnZpY2UgeworICBSYW1lbiByYW1lbigxOiBpMzIgcmVxdWVzdGVkTm9vZGxlQ291bnQpCit9CisKKy8qIGNvbnN0IHN0cnVjdCBDb29rZWRSYW1lbiA9IHsgImJhciI6IDEwIH0gKi8KKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvdGhyaWZ0cy9NaWRsYXllci50aHJpZnQgYi9saWIvcnMvdGVzdC90aHJpZnRzL01pZGxheWVyLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZmNDliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9NaWRsYXllci50aHJpZnQKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworaW5jbHVkZSAiQmFzZV9PbmUudGhyaWZ0IgoraW5jbHVkZSAiQmFzZV9Ud28udGhyaWZ0IgorCitjb25zdCBpMzIgV2F0ZXJCb2lsaW5nUG9pbnQgPSBCYXNlX09uZS5Cb2lsaW5nUG9pbnQKKworY29uc3QgbWFwPHN0cmluZywgQmFzZV9PbmUuVGVtcGVyYXR1cmU+IFRlbXBlcmF0dXJlTmFtZXMgPSB7ICJmcmVlemluZyI6IDAsICJib2lsaW5nIjogMTAwIH0KKworY29uc3QgbWFwPHNldDxpMzI+LCBtYXA8bGlzdDxzdHJpbmc+LCBzdHJpbmc+PiBNeUNvbnN0TmVzdGVkTWFwID0geworICBbMCwgMSwgMiwgM106IHsgWyJmb28iXTogImJhciIgfSwKKyAgWzIwXTogeyBbIm51dCIsICJ0b24iXSA6ICJiYXIiIH0sCisgIFszMCwgNDBdOiB7IFsiYm91bmN5IiwgInRpbmtseSJdOiAiY2FzdGxlIiB9Cit9CisKK2NvbnN0IGxpc3Q8bGlzdDxpMzI+PiBNeUNvbnN0TmVzdGVkTGlzdCA9IFsKKyAgWzAsIDEsIDJdLAorICBbMywgNCwgNV0sCisgIFs2LCA3LCA4XQorXQorCitjb25zdCBzZXQ8c2V0PGkzMj4+IE15Q29uc3ROZXN0ZWRTZXQgPSBbCisgIFswLCAxLCAyXSwKKyAgWzMsIDQsIDVdLAorICBbNiwgNywgOF0KK10KKworZW51bSBQaWUgeworICBQVU1QS0lOLAorICBhcHBsZSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgU1RSQVdCRVJSWV9SSFVCQVJCLAorICBLZXlfTGltZSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgY29jb251dF9DcmVhbSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgbWlzc2lzc2lwcGlfbXVkLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorfQorCitzdHJ1Y3QgTWVhbCB7CisgIDE6IEJhc2VfT25lLk5vb2RsZSBub29kbGUKKyAgMjogQmFzZV9Ud28uUmFtZW4gcmFtZW4KK30KKwordW5pb24gRGVzc2VydCAgeworICAxOiBzdHJpbmcgcG9ydAorICAyOiBzdHJpbmcgaWNlV2luZQorfQorCitzZXJ2aWNlIE1lYWxTZXJ2aWNlIGV4dGVuZHMgQmFzZV9Ud28uUmFtZW5TZXJ2aWNlIHsKKyAgTWVhbCBtZWFsKCkKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQgYi9saWIvcnMvdGVzdC90aHJpZnRzL1VsdGltYXRlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmZhMTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworaW5jbHVkZSAiTWlkbGF5ZXIudGhyaWZ0IgorCitlbnVtIERyaW5rIHsKKyAgV0FURVIsCisgIFdISVNLRVksCisgIFdJTkUsCisgIHNjb3RjaCwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgTEFURV9IQVJWRVNUX1dJTkUsCisgIEluZGlhX1BhbGVfQWxlLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBhcHBsZV9jaWRlciwgLy8gaW50ZW50aWFsbHkgcG9vcmx5IGNhc2VkCisgIGJlbGdpYW5fQWxlLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBDYW5hZGlhbl93aGlza3ksIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCit9CisKK2NvbnN0IG1hcDxpOCwgTWlkbGF5ZXIuUGllPiBSYW5rZWRQaWVzID0geworICAxOiBNaWRsYXllci5QaWUuUFVNUEtJTiwKKyAgMjogTWlkbGF5ZXIuUGllLlNUUkFXQkVSUllfUkhVQkFSQiwKKyAgMzogTWlkbGF5ZXIuUGllLmFwcGxlLAorICA0OiBNaWRsYXllci5QaWUubWlzc2lzc2lwcGlfbXVkLAorICA1OiBNaWRsYXllci5QaWUuY29jb251dF9DcmVhbSwKKyAgNjogTWlkbGF5ZXIuUGllLktleV9MaW1lLAorfQorCitzdHJ1Y3QgRnVsbE1lYWwgeworICAxOiByZXF1aXJlZCBNaWRsYXllci5NZWFsIG1lYWwKKyAgMjogcmVxdWlyZWQgTWlkbGF5ZXIuRGVzc2VydCBkZXNzZXJ0Cit9CisKK3N0cnVjdCBGdWxsTWVhbEFuZERyaW5rcyB7CisgIDE6IHJlcXVpcmVkIEZ1bGxNZWFsIGZ1bGxNZWFsCisgIDI6IG9wdGlvbmFsIERyaW5rIGRyaW5rCit9CisKK3NlcnZpY2UgRnVsbE1lYWxTZXJ2aWNlIGV4dGVuZHMgTWlkbGF5ZXIuTWVhbFNlcnZpY2UgeworICBGdWxsTWVhbCBmdWxsTWVhbCgpCit9CisKK3NlcnZpY2UgRnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlIGV4dGVuZHMgRnVsbE1lYWxTZXJ2aWNlIHsKKyAgRnVsbE1lYWxBbmREcmlua3MgZnVsbE1lYWxBbmREcmlua3MoKQorCisgIE1pZGxheWVyLlBpZSBiZXN0UGllKCkKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3N0L3BhY2thZ2UueG1sIGIvbGliL3N0L3BhY2thZ2UueG1sCmluZGV4IGQ0MDYwMTguLjIxYjdhZGMgMTAwNjQ0Ci0tLSBhL2xpYi9zdC9wYWNrYWdlLnhtbAorKysgYi9saWIvc3QvcGFja2FnZS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgdW5kZXIgdGhlIExpY2Vuc2UuCiAgLS0+Ci08IS0tIEFwYWNoZSBUaHJpZnQgU21hbGx0YWxrIGxpYnJhcnkgdmVyc2lvbiAwLjkuMyAtLT4KKzwhLS0gQXBhY2hlIFRocmlmdCBTbWFsbHRhbGsgbGlicmFyeSB2ZXJzaW9uIDAuMTMuMCAtLT4KIDxwYWNrYWdlPgogICA8bmFtZT5saWJ0aHJpZnQtc3Q8L25hbWU+CiAgIDxmaWxlPnRocmlmdC5zdDwvZmlsZT4KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9NYWtlZmlsZS5hbSBiL2xpYi9zd2lmdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjg4YjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLgorCithbGwtbG9jYWw6CisJc3dpZnQgYnVpbGQgLS1jb25maWd1cmF0aW9uIHJlbGVhc2UKKworaW5zdGFsbC1leGVjLWhvb2s6CisJc3dpZnQgaW5zdGFsbAorCitjbGVhbi1sb2NhbDoKKwlzd2lmdCBwYWNrYWdlIGNsZWFuCisJcm0gLXJmIC5idWlsZAorCitwcmVjcm9zczoKKwlzd2lmdAorCitjaGVjay1sb2NhbDoKKwlzd2lmdCB0ZXN0CisKK0VYVFJBX0RJU1QgPSBcCisJUGFja2FnZS5zd2lmdCBcCisJU291cmNlcyBcCisJVGVzdHMgXAorCVJFQURNRS5tZAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IFwKKwlNYWtlZmlsZSBcCisJTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9QYWNrYWdlLnN3aWZ0IGIvbGliL3N3aWZ0L1BhY2thZ2Uuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzM2Y2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9QYWNrYWdlLnN3aWZ0CkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IFBhY2thZ2VEZXNjcmlwdGlvbgorCitsZXQgcGFja2FnZSA9IFBhY2thZ2UoCisJbmFtZTogIlRocmlmdCIKKykKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9SRUFETUUubWQgYi9saWIvc3dpZnQvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMTA5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjE1IEBACitUaHJpZnQgU3dpZnQgTGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitMaWNlbnNlCistLS0tLS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworCisjIyBCdWlsZAorICAgIHN3aWZ0IGJ1aWxkCisKKyMjIFRlc3QKKyAgICBzd2lmdCB0ZXN0CisKKyMjIEluc3RhbGwgTGlicmFyeQorIyMjIyMgQ29jb2Fwb2RzCitBZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIHBvZGZpbGUKK2BgYHJ1YnkKKyAgICBwb2QgJ1RocmlmdC1zd2lmdDMnLCA6Z2l0ID0+ICdnaXRAZ2l0aHViLmNvbTphcGFjaGUvdGhyaWZ0LmdpdCcsIDpicmFuY2ggPT4gJ21hc3RlcicKK2BgYAorCisjIyMjIyBTUE0KK1VuZm9ydHVuYXRlbHkgZHVlIHRvIHNvbWUgbGltaXRhdGlvbnMgaW4gU1BNLCB0aGUgUGFja2FnZSBtYW5pZmVzdCBhbmQgU291cmNlcyBkaXJlY3RvcnkgbXVzdCBiZSBhdCB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC4KK1RvIGdldCBhcm91bmQgdGhhdCBmb3IgdGhlIHRpbWUgYmVpbmcsIHlvdSBjYW4gdXNlIHRoaXMgbWlycm9yZWQgcmVwby4KK0FkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgUGFja2FnZS5zd2lmdAorYGBgc3dpZnQKK2RlcGVuZGVuY2llczogWworICAgIC5QYWNrYWdlKHVybDogImh0dHBzOi8vZ2l0aHViLmNvbS9hcG9jb2xpcHNlL1RocmlmdC1Td2lmdC5naXQiLCBtYWpvclZlcnNpb246IDEpCitdCitgYGAKKworIyMgVGhyaWZ0IENvbXBpbGVyCisKK1lvdSBjYW4gY29tcGlsZSBJREwgc291cmNlcyBmb3IgU3dpZnQgMyB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworICAgIHRocmlmdCAtLWdlbiBzd2lmdCB0aHJpZnRfZmlsZQorCisjIyBDbGllbnQgRXhhbXBsZQorYGBgc3dpZnQKK2xldCB0cmFuc3BvcnQgPSBUU29ja2V0VHJhbnNwb3J0KGhvc3RuYW1lOiAibG9jYWxob3N0IiwgcG9ydDogOTA5MCkhCisKKy8vICB2YXIgcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydDogdHJhbnNwb3J0KQorbGV0IHByb3RvID0gVEJpbmFyeVByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisvLyAgdmFyIGNsaWVudCA9IEhlcm1lc0NsaWVudChpbm91dFByb3RvY29sOiBwcm90bykKK2xldCBjbGllbnQgPSBUaHJpZnRUZXN0Q2xpZW50KGlub3V0UHJvdG9jb2w6IHByb3RvKQorZG8geworICAgIHRyeSBjbGllbnQudGVzdFZvaWQoKQorfSBjYXRjaCBsZXQgZXJyb3IgeworICAgIHByaW50KCJcKGVycm9yKSIpCit9CitgYGAKKworIyMgTGlicmFyeSBOb3RlcworLSBFbGltaW5hdGVkIFByb3RvY29sIEZhY3RvcmllcywgVGhleSB3ZXJlIG9ubHkgdXNlZCBpbiBhc3luYyBjbGllbnRzIGFuZCBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zLCB3aGVyZSBHZW5lcmljcyBwcm92aWRlIGEgYmV0dGVyIGFsdGVybmF0aXZlLgorLSBTd2lmdHkgRXJyb3JzLCBBbGwgYFRFcnJvcmAgdHlwZXMgaGF2ZSBhIG5lc3RlZCBgRXJyb3JDb2RlYCBFbnVtIGFzIHdlbGwgYXMgc29tZSBleHRyYSBmbGF2b3Igd2hlcmUgbmVlZGVkLgorLSBWYWx1ZSB0eXBlZCBldmVyeXRoaW5nLiAgYFRUcmFuc3BvcnRgIG9wZXJhdGVzIG9uIHZhbHVlIHR5cGVkIGBEYXRhYCByYXRoZXIgdGhhbiByZWZlcmVuY2UgdHlwZWQgYE5TRGF0YWAgb3IgYFVuc2FmZUJ1ZmZlclBvaW50ZXJgcworLSBTd2lmdCAzIE5hbWVkIHByb3RvY29scy4gIFN3aWZ0IDMgbmFtaW5nIGNvbnZlbnRpb25zIHN1Z2dlc3QgdGhlIGVsaW1pbmF0aW9uIG9mIHJlZHVuZGFudCB3b3JkcyB0aGF0IGNhbiBiZSBpbmZlcnJlZCBmcm9tIHZhcmlhYmxlL2Z1bmN0aW9uIHNpZ25hdHVyZXMuICBUaGlzIHJlbmFtaW5nIGlzIGFwcGxpZWQgdGhyb3VnaG91dCB0aGUgU3dpZnQgMyBsaWJyYXJ5IGNvbnZlcnRpbmcgbW9zdCBuYW1pbmcgY29udmVudGlvbnMgdXNlZCBpbiB0aGUgU3dpZnQyL0NvY29hIGxpYnJhcnkgdG8gU3dpZnQgMy1lc3F1ZSBuYW1pbmcgY29udmVudGlvbnMuIGVnLgorYGBgc3dpZnQKK2Z1bmMgcmVhZFN0cmluZygpIHRocm93cyAtPiBTdHJpbmcKK2Z1bmMgd3JpdGVTdHJpbmcoXyB2YWw6IFN0cmluZykgdGhyb3dzCitgYGAKK2hhdmUgYmVlbiByZW5hbWVkIHRvIGVsaW1pbmF0ZSByZWR1bmRhbnQgd29yZHM6CitgYGBzd2lmdAorZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZworZnVuYyB3cml0ZShfIHZhbDogU3RyaW5nKSB0aHJvd3MKK2BgYAorCistIEVsaW1pbmF0ZWQgYFRIVFRQVHJhbnNwb3J0YCB0aGF0IHVzZXMgYE5TVVJMQ29ubmVjdGlvbmAgZHVlIHRvIGl0IGJlaW5nIGRlcHJlY2F0ZWQgYW5kIG5vdCBhdmFpbGFibGUgYXQgYWxsIGluIFN3aWZ0IDMgZm9yIExpbnV4LiAgYFRIVFRQU2Vzc2lvblRyYW5zcG9ydGAgZnJvbSB0aGUgU3dpZnQyL0NvY29hIGxpYnJhcnkgdGhhdCB1c2VzIGBOU1VSTFNlc3Npb25gIGhhcyBiZWVuIHJlbmFtZWQgdG8gYFRIVFRQVHJhbnNwb3J0YCBmb3IgdGhpcyBsaWJyYXJ5IGFuZCBsZXZlcmFnZXMgYFVSTFNlc3Npb25gLCBwcm92aWRpbmcgYm90aCBzeW5jaHJvbm91cyAod2l0aCBzZW1hcGhvcmVzKSBhbmQgYXN5bmNocm9ub3VzIGJlaGF2aW9yLgorLSBQcm9iYWJseSBzb21lIE1vcmUgdGhpbmdzIEkndmUgbWlzc2VkIGhlcmUuCisKKyMjIEdlbmVyYXRvciBOb3RlcworIyMjIyBHZW5lcmF0b3IgRmxhZ3MKK3wgRmxhZyAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICB8Cit8IC0tLS0tLS0tLS0tLS0gfDotLS0tLS0tLS0tLS0tOnwKK3wgYXN5bmNfY2xpZW50cyB8IEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBibG9jayBzeW50YXguIEFzeW5jaHJvbm91cyBjbGFzc2VzIGFyZSBhcHBlbmRlZCB3aXRoIGBfQXN5bmNgIHwKK3wgbm9fc3RyaWN0KiAgICB8IEdlbmVyYXRlcyBub24tc3RyaWN0IHN0cnVjdHMgICAgICB8Cit8IGRlYnVnX2Rlc2NyaXB0aW9ucyB8IEFsbG93IHVzZSBvZiBkZWJ1Z0Rlc2NyaXB0aW9uIHNvIHRoZSBhcHAgY2FuIGFkZCBkZXNjcmlwdGlvbiB2aWEgYSBjYXRlb2dvcnkvZXh0ZW5zaW9uICAgICAgfAorfCBsb2dfdW5leHBlY3RlZCB8IExvZyBldmVyeSB0aW1lIGFuIHVuZXhwZWN0ZWQgZmllbGQgSUQgb3IgdHlwZSBpcyBlbmNvdW50ZXJlZC4gfAorfCBzYWZlX2VudW1zICAgICB8IEdlbmVyYXRlIGVudW0gdHlwZXMgd2l0aCBhbiB1bmtub3duIGNhc2UgdG8gaGFuZGxlIHVuc3BlY2lmaWVkIHZhbHVlcyByYXRoZXIgdGhhbiB0aHJvdyBhIHNlcmlhbGl6YXRpb24gZXJyb3IgIHwKKworCisKKypNb3N0IHRocmlmdCBsaWJyYXJpZXMgYWxsb3cgZW1wdHkgaW5pdGlhbGl6YXRpb24gb2YgU3RydWN0cywgaW5pdGlhbGl6aW5nIGByZXF1aXJlZGAgZmllbGRzIHdpdGggbmlsL251bGwvTm9uZSAoUHl0aG9uIGFuZCBOb2RlIGdlbmVyYXRvcnMpLiAgU3dpZnQgb24gdGhlIG90aGVyIGhhbmQgcmVxdWlyZXMgaW5pdGlhbGl6ZXJzIHRvIGluaXRpYWxpemUgYWxsIG5vbi1PcHRpb25hbCBmaWVsZHMsIGFuZCB0aHVzIHRoZSBTd2lmdCAzIGdlbmVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGRlZmF1bHQgdmFsdWVzICh1bmxpa2UgdGhlIFN3aWZ0IDIvQ29jb2EgZ2VuZXJhdG9yKS4gIEluIG90aGVyIGxhbmd1YWdlcywgdGhpcyBhbGxvd3MgdGhlIHNlbmRpbmcgb2YgTlVMTCB2YWx1ZXMgaW4gZmllbGRzIHRoYXQgYXJlIG1hcmtlZCBgcmVxdWlyZWRgLCBhbmQgdGh1cyB3aWxsIHRocm93IGFuIGVycm9yIGluIFN3aWZ0IGNsaWVudHMgYXR0ZW1wdGluZyB0byB2YWxpZGF0ZSBmaWVsZHMuICBUaGUgYG5vX3N0cmljdGAgb3B0aW9uIGhlcmUgd2lsbCBpZ25vcmUgdGhlIHZhbGlkYXRpb24gY2hlY2ssIGFzIHdlbGwgYXMgYmVoYXZlIHNpbWlsYXIgdG8gdGhlIFN3aWZ0Mi9Db2NvYSBnZW5lcmF0b3IgYW5kIGluaXRpYWxpemUgcmVxdWlyZWQgZmllbGRzIHdpdGggZW1wdHkgaW5pdGlhbGl6ZXJzICh3aGVyZSBwb3NzaWJsZSkuCisKKworIyMgV2hhdHMgaW1wbGVtZW50ZWQKKyMjIyMgTGlicmFyeQorIyMjIyMgVHJhbnNwb3J0cworLSBbeF0gVFNvY2tldFRyYW5zcG9ydCAtIENGU29ja2V0IGFuZCBQb3NpeFNvY2tldCB2YXJpYW50cyBhdmFpbGFibGUuIENGU29ja2V0IHZhcmlhbnQgb25seSBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciBEYXJ3aW4gcGxhdGZvcm1zCistIFt4XSBUSFRUUFRyYW5zcG9ydCAtIEN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBmb3IgRGFyd2luIHBsYXRmb3JtcywgU3dpZnQgRm91bmRhdGlvbiBVUkxTZXNzaW9uIGltcGxlbWVudGF0aW9uIG5lZWRzIGNvbXBsZXRpb24gb24gbGludXguCistIFt4XSBUU29ja2V0U2VydmVyIC0gVXNlcyBDRlNvY2tldHMgb25seSBmb3IgYmluZGluZywgc2hvdWxkIGJlIHdvcmtpbmcgb24gbGludXgKKy0gW3hdIFRGcmFtZWRUcmFuc3BvcnQKKy0gW3hdIFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQKKy0gW3hdIFRGaWxlVHJhbnNwb3J0IC0gQSBmZXcgdmFyaWFudHMgdXNpbmcgRmlsZSBoYW5kbGVzIGFuZCBmaWxlIGRlc2NyaXB0b3JzLgorLSBbeF0gVFN0cmVhbVRyYW5zcG9ydCAtIEZ1bGx5IGZ1bmN0aW9uYWwgaW4gRGFyd2luLCBGb3VuZGF0aW9uIGJhY2tpbmcgbm90IHlldCBjb21wbGV0ZWQgaW4gTGludXggKFRoaXMgbGltaXRzIFRDRlNvY2tldFRyYW5zcG9ydCB0byBEYXJ3aW4pCistIFsgXSBIVFRQU2VydmVyIC0gQ3VycmVudGx5IHRoZXJlIGlzIG5vIGxpZ2h0d2VpZ2h0ICBIVFRQU2VydmVyIGltcGxlbWVudGF0aW9uIHRoZSBTd2lmdCBTdGFuZGFyZCBMaWJyYXJ5LCBzbyBvdGhlciAzcmQgcGFydHkgYWx0ZXJuYXRpdmVzIGFyZSByZXF1aXJlZCBhbmQgb3V0IG9mIHNjb3BlIGZvciB0aGUgVGhyaWZ0IGxpYnJhcnkuICBFeGFtcGxlcyB1c2luZyBQZXJmZWN0IHdpbGwgYmUgcHJvdmlkZWQuCistIFsgXSBPdGhlciAoZ3osIGV0YykKKworIyMjIyMgUHJvdG9jb2xzCistIFt4XSBUQmluYXJ5UHJvdG9jb2wKKy0gW3hdIFRDb21wYWN0UHJvdG9jb2wKKy0gWyBdIFRKU09OUHJvdG9jb2wgLSBUaGlzIHdpbGwgbmVlZCB0byBiZSBpbXBsZW1lbnRlZAorCisjIyMjIyBHZW5lcmF0b3IKKy0gW3hdIENvZGUgQ29tcGxldGUgR2VuZXJhdG9yCistIFt4XSBBc3luYyBjbGllbnRzCistIFt4XSBEb2N1bWVudGF0aW9uIEdlbmVyYXRpb24gLSBHZW5lcmF0b3Igd2lsbCB0cmFuc3BsYW50IElETCBkb2NzIHRvIFN3aWZ0IGNvZGUgZm9yIGVhc3kgbG9va3VwIGluIFhjb2RlCistIFsgXSBEZWZhdWx0IFZhbHVlcyAtIFRPRE8KKy0gWyBdIG5vX3N0cmljdCBtb2RlIC0gVE9ETworLSBbIF0gTmFtZXNwYWNpbmcgLSBTdGlsbCBoYXZlbid0IG5haWxlZCBkb3duIGEgZ29vZCBwYXJhZGlnbSBmb3IgbmFtZXNwYWNpbmcuICBJdCB3aWxsIGxpa2VseSBpbnZvbHZlIGNyZWF0aW5nIHN1YmRpcmVjdG9yaWVzIGZvciBkaWZmZXJlbnQgbmFtZXNwYWNlcyBhbmQgZXhwZWN0aW5nIHRoZSBkZXZlbG9wZXIgdG8gaW1wb3J0IGVhY2ggc3ViZGlyZWN0b3J5IGFzIHNlcGFyYXRlIG1vZHVsZXMuICBJdCBjb3VsZCBleHRlbmQgdG8gY3JlYXRpbmcgU1BNIFBhY2thZ2UgbWFuaWZlc3RzIHdpdGggc3ViLW1vZHVsZXMgd2l0aGluIHRoZSBnZW5lcmF0ZWQgbW9kdWxlCisKKworCisjIyBFeGFtcGxlIEhUVFAgU2VydmVyIHdpdGggUGVyZmVjdAorYGBgc3dpZnQKK2ltcG9ydCBQZXJmZWN0TGliCitpbXBvcnQgUGVyZmVjdEhUVFAKK2ltcG9ydCBQZXJmZWN0SFRUUFNlcnZlcgoraW1wb3J0IERpc3BhdGNoCisKK2xldCBsb2dRdWV1ZSA9IERpc3BhdGNoUXVldWUobGFiZWw6ICJsb2ciLCBxb3M6IC5iYWNrZ3JvdW5kLCBhdHRyaWJ1dGVzOiAuY29uY3VycmVudCkKK2xldCBwUXVldWUgPSBEaXNwYXRjaFF1ZXVlKGxhYmVsOiAibG9nIiwgcW9zOiAudXNlckluaXRpYXRlZCwgYXR0cmlidXRlczogLmNvbmN1cnJlbnQpCisKKworY2xhc3MgVFBlcmZlY3RTZXJ2ZXI8SW5Qcm90b2NvbDogVFByb3RvY29sLCBPdXRQcm90b2NvbDogVFByb3RvY29sPiB7CisKKyBwcml2YXRlIHZhciBzZXJ2ZXIgPSBIVFRQU2VydmVyKCkKKyBwcml2YXRlIHZhciBwcm9jZXNzb3I6IFRQcm9jZXNzb3IKKworIGluaXQoYWRkcmVzczogU3RyaW5nPyA9IG5pbCwKKyAgICAgIHBhdGg6IFN0cmluZz8gPSBuaWwsCisgICAgICBwb3J0OiBJbnQsCisgICAgICBwcm9jZXNzb3I6IFRQcm9jZXNzb3IsCisgICAgICBpblByb3RvY29sOiBJblByb3RvY29sLlR5cGUsCisgICAgICBvdXRQcm90b2NvbDogT3V0UHJvdG9jb2wuVHlwZSkgdGhyb3dzIHsKKworICAgc2VsZi5wcm9jZXNzb3IgPSBwcm9jZXNzb3IKKworICAgaWYgbGV0IGFkZHJlc3MgPSBhZGRyZXNzIHsKKyAgICAgc2VydmVyLnNlcnZlckFkZHJlc3MgPSBhZGRyZXNzCisgICB9CisgICBzZXJ2ZXIuc2VydmVyUG9ydCA9IFVJbnQxNihwb3J0KQorCisgICB2YXIgcm91dGVzID0gUm91dGVzKCkKKyAgIHZhciB1cmkgPSAiLyIKKyAgIGlmIGxldCBwYXRoID0gcGF0aCB7CisgICAgIHVyaSArPSBwYXRoCisgICB9CisgICByb3V0ZXMuYWRkKG1ldGhvZDogLnBvc3QsIHVyaTogdXJpKSB7IHJlcXVlc3QsIHJlc3BvbnNlIGluCisgICAgIHBRdWV1ZS5hc3luYyB7CisgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKC5jb250ZW50VHlwZSwgdmFsdWU6ICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisKKyAgICAgICBsZXQgaXRyYW5zID0gVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCgpCisgICAgICAgaWYgbGV0IGJ5dGVzID0gcmVxdWVzdC5wb3N0Qm9keUJ5dGVzIHsKKyAgICAgICAgIGxldCBkYXRhID0gRGF0YShieXRlczogYnl0ZXMpCisgICAgICAgICBpdHJhbnMucmVzZXQocmVhZEJ1ZmZlcjogZGF0YSkKKyAgICAgICB9CisKKyAgICAgICBsZXQgb3RyYW5zID0gVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydChmbHVzaEhhbmRsZXI6IHsgdHJhbnMsIGJ1ZmYgaW4KKyAgICAgICAgIGxldCBhcnJheSA9IGJ1ZmYud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgICAgQXJyYXk8VUludDg+KFVuc2FmZUJ1ZmZlclBvaW50ZXIoc3RhcnQ6ICQwLCBjb3VudDogYnVmZi5jb3VudCkpCisgICAgICAgICB9CisgICAgICAgICByZXNwb25zZS5zdGF0dXMgPSAub2sKKyAgICAgICAgIHJlc3BvbnNlLnNldEJvZHkoYnl0ZXM6IGFycmF5KQorICAgICAgICAgcmVzcG9uc2UuY29tcGxldGVkKCkKKyAgICAgICB9KQorCisgICAgICAgbGV0IGlucHJvdG8gPSBJblByb3RvY29sKG9uOiBpdHJhbnMpCisgICAgICAgbGV0IG91dHByb3RvID0gT3V0UHJvdG9jb2wob246IG90cmFucykKKworICAgICAgIGRvIHsKKyAgICAgICAgIHRyeSBwcm9jZXNzb3IucHJvY2VzcyhvbjogaW5wcm90bywgb3V0UHJvdG9jb2w6IG91dHByb3RvKQorICAgICAgICAgdHJ5IG90cmFucy5mbHVzaCgpCisgICAgICAgfSBjYXRjaCB7CisgICAgICAgICByZXNwb25zZS5zdGF0dXMgPSAuYmFkUmVxdWVzdAorICAgICAgICAgcmVzcG9uc2UuY29tcGxldGVkKCkKKyAgICAgICB9CisgICAgIH0KKyAgIH0KKyAgIHNlcnZlci5hZGRSb3V0ZXMocm91dGVzKQorIH0KKworIGZ1bmMgc2VydmUoKSB0aHJvd3MgeworICAgdHJ5IHNlcnZlci5zdGFydCgpCisgfQorfQorYGBgCisKKyMjIyMgRXhhbXBsZSBVc2FnZQorYGBgc3dpZnQKK2NsYXNzIFNlcnZpY2VIYW5kbGVyIDogU2VydmljZSB7CisgICAgLi4uCit9CitsZXQgc2VydmVyID0gdHJ5PyBUUGVyZmVjdFNlcnZlcihwb3J0OiA5MDkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3I6IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZTogU2VydmljZUhhbmRsZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvdG9jb2w6IFRCaW5hcnlQcm90b2NvbC5zZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQcm90b2NvbDogVEJpbmFyeVByb3RvY29sLnNlbGYpCisKK3RyeT8gc2VydmVyPy5zZXJ2ZSgpCitgYGAKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL0xpbnV4SGVscGVyLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvTGludXhIZWxwZXIuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZkOTJiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL0xpbnV4SGVscGVyLnN3aWZ0CkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IENvcmVGb3VuZGF0aW9uCisKKyNpZiBvcyhMaW51eCkKKy8vLyBFeHRlbnNpb25zIGZvciBMaW51eCBmb3IgaW5jb21wbGV0ZSBGb3VuZGF0aW9uIEFQSSdzLgorLy8vIHN3aWZ0LWNvcmVsaWJzLWZvdW5kYXRpb24gaXMgbm90IHlldCAxOjEgd2l0aCBPU1gvaU9TIEZvdW5kYXRpb24KKworZXh0ZW5zaW9uIENGU29ja2V0RXJyb3IgeworICBwdWJsaWMgc3RhdGljIGxldCBzdWNjZXNzID0ga0NGU29ja2V0U3VjY2VzcworfQorICAKK2V4dGVuc2lvbiBVSW50IHsKKyAgcHVibGljIHN0YXRpYyBmdW5jICYobGhzOiBVSW50LCByaHM6IEludCkgLT4gVUludCB7CisgICAgbGV0IGNhc3QgPSB1bnNhZmVCaXRDYXN0KHJocywgdG86IFVJbnQuc2VsZikKKyAgICByZXR1cm4gbGhzICYgY2FzdAorICB9Cit9CisKKyNlbHNlCitleHRlbnNpb24gQ0ZTdHJlYW1Qcm9wZXJ0eUtleSB7CisgIHN0YXRpYyBsZXQgc2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQgID0gQ0ZTdHJlYW1Qcm9wZXJ0eUtleShrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0KQorICAvLyBFeGlzdHMgYXMgU3RyZWFtLlByb3BlcnR5S2V5LnNvY2tldFNlY3VyaXR5bGV2ZWxLZXkgYnV0IGRvZXNuJ3Qgd29yayB3aXRoIENGUmVhZFN0cmVhbVNldFByb3BlcnR5CisgIHN0YXRpYyBsZXQgc29ja2V0U2VjdXJpdHlMZXZlbCAgICAgID0gQ0ZTdHJlYW1Qcm9wZXJ0eUtleShrQ0ZTdHJlYW1Qcm9wZXJ0eVNvY2tldFNlY3VyaXR5TGV2ZWwpCisgIHN0YXRpYyBsZXQgU1NMU2V0dGluZ3MgICAgICAgICAgICAgID0gQ0ZTdHJlYW1Qcm9wZXJ0eUtleShrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFNldHRpbmdzKQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UQXBwbGljYXRpb25FcnJvci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RBcHBsaWNhdGlvbkVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMzkzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQXBwbGljYXRpb25FcnJvci5zd2lmdApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwdWJsaWMgc3RydWN0IFRBcHBsaWNhdGlvbkVycm9yIDogVEVycm9yIHsKKyAgcHVibGljIGVudW0gQ29kZSA6IFRFcnJvckNvZGUgeworICAgIGNhc2UgdW5rbm93bgorICAgIGNhc2UgdW5rbm93bk1ldGhvZChtZXRob2ROYW1lOiBTdHJpbmc/KQorICAgIGNhc2UgaW52YWxpZE1lc3NhZ2VUeXBlCisgICAgY2FzZSB3cm9uZ01ldGhvZE5hbWUobWV0aG9kTmFtZTogU3RyaW5nPykKKyAgICBjYXNlIGJhZFNlcXVlbmNlSWQKKyAgICBjYXNlIG1pc3NpbmdSZXN1bHQobWV0aG9kTmFtZTogU3RyaW5nPykKKyAgICBjYXNlIGludGVybmFsRXJyb3IKKyAgICBjYXNlIHByb3RvY29sRXJyb3IKKyAgICBjYXNlIGludmFsaWRUcmFuc2Zvcm0KKyAgICBjYXNlIGludmFsaWRQcm90b2NvbAorICAgIGNhc2UgdW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgICAgCisgICAgCisgICAgLy8vIEluaXRpYWxpemUgYSBUQXBwbGljYXRpb25FcnJvciB3aXRoIGEgVGhyaWZ0IGVycm9yIGNvZGUKKyAgICAvLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBhY2hpZXZlZCB3aXRoIFJhd1JlcHJlc2VudGFibGUgaG93ZXZlcgorICAgIC8vLyBieSBkb2luZyB0aGlzIHdlIGNhbiBhbGxvdyBmb3IgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzIG9uIGVudW0gY2FzZXMgZm9yCisgICAgLy8vIGNhc2Ugc3BlY2lmaWMgY29udGV4dCBkYXRhIGluIGEgU3dpZnR5LCB0eXBlLXNhZmUgbWFubmVyLgorICAgIC8vLworICAgIC8vLyAtIHBhcmFtZXRlciB0aHJpZnRFcnJvckNvZGU6IEludGVnZXIgVEFwcGxpY2F0aW9uRXJyb3IoZXhjZXB0aW9uKSBlcnJvciBjb2RlLiAgCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCB0byAwICgudW5rbm93bikKKyAgICBwdWJsaWMgaW5pdCh0aHJpZnRFcnJvckNvZGU6IEludCkgeworICAgICAgc3dpdGNoIHRocmlmdEVycm9yQ29kZSB7CisgICAgICBjYXNlIDE6ICBzZWxmID0gLnVua25vd25NZXRob2QobWV0aG9kTmFtZTogbmlsKQorICAgICAgY2FzZSAyOiAgc2VsZiA9IC5pbnZhbGlkTWVzc2FnZVR5cGUKKyAgICAgIGNhc2UgMzogIHNlbGYgPSAud3JvbmdNZXRob2ROYW1lKG1ldGhvZE5hbWU6IG5pbCkKKyAgICAgIGNhc2UgNDogIHNlbGYgPSAuYmFkU2VxdWVuY2VJZAorICAgICAgY2FzZSA1OiAgc2VsZiA9IC5taXNzaW5nUmVzdWx0KG1ldGhvZE5hbWU6IG5pbCkKKyAgICAgIGNhc2UgNjogIHNlbGYgPSAuaW50ZXJuYWxFcnJvcgorICAgICAgY2FzZSA3OiAgc2VsZiA9IC5wcm90b2NvbEVycm9yCisgICAgICBjYXNlIDg6ICBzZWxmID0gLmludmFsaWRQcm90b2NvbAorICAgICAgY2FzZSA5OiAgc2VsZiA9IC5pbnZhbGlkVHJhbnNmb3JtCisgICAgICBjYXNlIDEwOiBzZWxmID0gLnVuc3VwcG9ydGVkQ2xpZW50VHlwZQorICAgICAgZGVmYXVsdDogc2VsZiA9IC51bmtub3duCisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgIGNhc2UgLnVua25vd25NZXRob2Q6ICAgICAgICAgIHJldHVybiAxCisgICAgICBjYXNlIC5pbnZhbGlkTWVzc2FnZVR5cGU6ICAgICByZXR1cm4gMgorICAgICAgY2FzZSAud3JvbmdNZXRob2ROYW1lOiAgICAgICAgcmV0dXJuIDMKKyAgICAgIGNhc2UgLmJhZFNlcXVlbmNlSWQ6ICAgICAgICAgIHJldHVybiA0CisgICAgICBjYXNlIC5taXNzaW5nUmVzdWx0OiAgICAgICAgICByZXR1cm4gNQorICAgICAgY2FzZSAuaW50ZXJuYWxFcnJvcjogICAgICAgICAgcmV0dXJuIDYKKyAgICAgIGNhc2UgLnByb3RvY29sRXJyb3I6ICAgICAgICAgIHJldHVybiA3CisgICAgICBjYXNlIC5pbnZhbGlkUHJvdG9jb2w6ICAgICAgICByZXR1cm4gOAorICAgICAgY2FzZSAuaW52YWxpZFRyYW5zZm9ybTogICAgICAgcmV0dXJuIDkKKyAgICAgIGNhc2UgLnVuc3VwcG9ydGVkQ2xpZW50VHlwZTogIHJldHVybiAxMAorICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgLy8vIE91dHB1dCAiZm9yICNtZXRob2ROYW1lIiBpZiBtZXRob2QgaXMgbm90IG5pbCBlbHNlIGVtcHR5CisgICAgICBsZXQgbWV0aG9kVW53cmFwOiAoU3RyaW5nPykgLT4gU3RyaW5nID0gIHsgbWV0aG9kIGluCisgICAgICAgIHJldHVybiAiXChtZXRob2QgPT0gbmlsID8gIiIgOiAiIGZvciBcKG1ldGhvZCA/PyAiIikiKSIKKyAgICAgIH0KKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBUQXBwbGljYXRpb25FcnJvciIKKyAgICAgIGNhc2UgLnVua25vd25NZXRob2QobGV0IG1ldGhvZCk6ICAgIHJldHVybiAiVW5rbm93biBNZXRob2RcKG1ldGhvZFVud3JhcChtZXRob2QpKSIKKyAgICAgIGNhc2UgLmludmFsaWRNZXNzYWdlVHlwZTogICAgICAgICAgIHJldHVybiAiSW52YWxpZCBNZXNzYWdlIFR5cGUiCisgICAgICBjYXNlIC53cm9uZ01ldGhvZE5hbWUobGV0IG1ldGhvZCk6ICByZXR1cm4gIldyb25nIE1ldGhvZCBOYW1lXChtZXRob2RVbndyYXAobWV0aG9kKSkiCisgICAgICBjYXNlIC5iYWRTZXF1ZW5jZUlkOiAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBTZXF1ZW5jZSBJRCIKKyAgICAgIGNhc2UgLm1pc3NpbmdSZXN1bHQobGV0IG1ldGhvZCk6ICAgIHJldHVybiAiTWlzc2luZyBSZXN1bHRcKG1ldGhvZFVud3JhcChtZXRob2QpKSIKKyAgICAgIGNhc2UgLmludGVybmFsRXJyb3I6ICAgICAgICAgICAgICAgIHJldHVybiAiSW50ZXJuYWwgRXJyb3IiCisgICAgICBjYXNlIC5wcm90b2NvbEVycm9yOiAgICAgICAgICAgICAgICByZXR1cm4gIlByb3RvY29sIEVycm9yIgorICAgICAgY2FzZSAuaW52YWxpZFByb3RvY29sOiAgICAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkIFByb3RvY29sIgorICAgICAgY2FzZSAuaW52YWxpZFRyYW5zZm9ybTogICAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkIFRyYW5zZm9ybSIKKyAgICAgIGNhc2UgLnVuc3VwcG9ydGVkQ2xpZW50VHlwZTogICAgICAgIHJldHVybiAiVW5zdXBwb3J0ZWQgQ2xpZW50IFR5cGUiCisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIGluaXQoKSB7IH0KKyAgCisgIHB1YmxpYyBpbml0KHRocmlmdEVycm9yQ29kZSBjb2RlOiBJbnQsIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwpIHsKKyAgICBzZWxmLmVycm9yID0gQ29kZSh0aHJpZnRFcnJvckNvZGU6IGNvZGUpCisgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICB9CisgIAorICBwdWJsaWMgdmFyIGVycm9yOiBDb2RlID0gLnVua25vd24KKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBDb2RlIHsgcmV0dXJuIC51bmtub3duIH0KK30KKworZXh0ZW5zaW9uIFRBcHBsaWNhdGlvbkVycm9yIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5zdHJ1Y3QgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVEFwcGxpY2F0aW9uRXJyb3IgeworICAgIHZhciBlcnJvckNvZGU6IEludCA9IDAKKyAgICB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICAgIF8gPSB0cnkgcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkKKyAgICBmaWVsZHM6IHdoaWxlIHRydWUgeworICAgICAgbGV0IChfLCBmaWVsZFR5cGUsIGZpZWxkSUQpID0gdHJ5IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIAorICAgICAgc3dpdGNoIChmaWVsZElELCBmaWVsZFR5cGUpIHsKKyAgICAgIGNhc2UgKF8sIC5zdG9wKToKKyAgICAgICAgYnJlYWsgZmllbGRzCisgICAgICBjYXNlICgxLCAuc3RyaW5nKToKKyAgICAgICAgbWVzc2FnZSA9IHRyeSBwcm90by5yZWFkKCkKKyAgICAgIGNhc2UgKDIsIC5pMzIpOgorICAgICAgICBlcnJvckNvZGUgPSBJbnQodHJ5IHByb3RvLnJlYWQoKSBhcyBJbnQzMikKKyAgICAgIAorICAgICAgY2FzZSBsZXQgKF8sIHVua25vd25UeXBlKToKKyAgICAgICAgdHJ5IHByb3RvLnNraXAodHlwZTogdW5rbm93blR5cGUpCisgICAgICB9CisgICAgICAKKyAgICAgIHRyeSBwcm90by5yZWFkRmllbGRFbmQoKQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZFN0cnVjdEVuZCgpCisgICAgcmV0dXJuIFRBcHBsaWNhdGlvbkVycm9yKHRocmlmdEVycm9yQ29kZTogZXJyb3JDb2RlLCBtZXNzYWdlOiBtZXNzYWdlKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbihuYW1lOiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKyAgICAKKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZEJlZ2luKG5hbWU6ICJtZXNzYWdlIiwgdHlwZTogLnN0cmluZywgZmllbGRJRDogMSkKKyAgICB0cnkgcHJvdG8ud3JpdGUobWVzc2FnZSA/PyAiIikKKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZEVuZCgpCisgICAgCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRCZWdpbihuYW1lOiAidHlwZSIsIHR5cGU6IC5pMzIsIGZpZWxkSUQ6IDIpCisgICAgbGV0IHZhbCA9IEludDMyKGVycm9yLnRocmlmdEVycm9yQ29kZSkKKyAgICB0cnkgcHJvdG8ud3JpdGUodmFsKQorICAgIHRyeSBwcm90by53cml0ZUZpZWxkRW5kKCkKKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHRyeSBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlOiBJbnQgeworICAgIHJldHVybiBlcnJvci50aHJpZnRFcnJvckNvZGUgJisgKG1lc3NhZ2U/Lmhhc2hWYWx1ZSA/PyAwKQorICB9Cit9CisKK3B1YmxpYyBmdW5jID09KGxoczogVEFwcGxpY2F0aW9uRXJyb3IsIHJoczogVEFwcGxpY2F0aW9uRXJyb3IpIC0+IEJvb2wgeworICByZXR1cm4gbGhzLmVycm9yLnRocmlmdEVycm9yQ29kZSA9PSByaHMuZXJyb3IudGhyaWZ0RXJyb3JDb2RlICYmIGxocy5tZXNzYWdlID09IHJocy5tZXNzYWdlCit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmU1NjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeS5zd2lmdApAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK2V4dGVuc2lvbiBEYXRhIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5zdHJpbmcgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gRGF0YSB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkgYXMgRGF0YQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5UHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5UHJvdG9jb2wuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3MjQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnlQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDM4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgc3RydWN0IFRCaW5hcnlQcm90b2NvbFZlcnNpb24geworICBzdGF0aWMgbGV0IHZlcnNpb24xICAgID0gSW50MzIoYml0UGF0dGVybjogMHg4MDAxMDAwMCkKKyAgc3RhdGljIGxldCB2ZXJzaW9uTWFzayA9IEludDMyKGJpdFBhdHRlcm46IDB4ZmZmZjAwMDApCit9CisKK3B1YmxpYyBjbGFzcyBUQmluYXJ5UHJvdG9jb2w6IFRQcm90b2NvbCB7CisgIHB1YmxpYyB2YXIgbWVzc2FnZVNpemVMaW1pdDogVUludDMyICA9IDAKKyAgCisgIHB1YmxpYyB2YXIgdHJhbnNwb3J0OiBUVHJhbnNwb3J0CisgIAorICAvLyBjbGFzcyBsZXZlbCBwcm9wZXJ0aWVzIGZvciBzZXR0aW5nIGdsb2JhbCBjb25maWcgKHVzZWZ1bCBmb3Igc2VydmVyIGluIGxpZXUgb2YgRmFjdG9yeSBkZXNpZ24pCisgIHB1YmxpYyBzdGF0aWMgdmFyIHN0cmljdFJlYWQ6IEJvb2wgPSBmYWxzZQorICBwdWJsaWMgc3RhdGljIHZhciBzdHJpY3RXcml0ZTogQm9vbCA9IHRydWUKKworICBwcml2YXRlIHZhciBzdHJpY3RSZWFkOiBCb29sCisgIHByaXZhdGUgdmFyIHN0cmljdFdyaXRlOiBCb29sCisgIAorICB2YXIgY3VycmVudE1lc3NhZ2VOYW1lOiBTdHJpbmc/CisgIHZhciBjdXJyZW50RmllbGROYW1lOiBTdHJpbmc/CisgIAorICAKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQodHJhbnNwb3J0OiBUVHJhbnNwb3J0LCBzdHJpY3RSZWFkOiBCb29sLCBzdHJpY3RXcml0ZTogQm9vbCkgeworICAgIHNlbGYuaW5pdChvbjogdHJhbnNwb3J0KQorICAgIHNlbGYuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQKKyAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKKyAgfQorICAKKyAgcHVibGljIHJlcXVpcmVkIGluaXQob24gdHJhbnNwb3J0OiBUVHJhbnNwb3J0KSB7CisgICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgICBzZWxmLnN0cmljdFdyaXRlID0gVEJpbmFyeVByb3RvY29sLnN0cmljdFdyaXRlCisgICAgc2VsZi5zdHJpY3RSZWFkID0gVEJpbmFyeVByb3RvY29sLnN0cmljdFJlYWQKKyAgfQorICAKKyAgZnVuYyByZWFkU3RyaW5nQm9keShfIHNpemU6IEludCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgCisgICAgdmFyIGRhdGEgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKSkgeworICAgICAgZGF0YSA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IHNpemUpCisgICAgfQorICAgIAorICAgIHJldHVybiBTdHJpbmcoZGF0YTogZGF0YSwgZW5jb2Rpbmc6IFN0cmluZy5FbmNvZGluZy51dGY4KSA/PyAiIgorICB9CisgIAorICAvLy8gTWFyazogLSBUUHJvdG9jb2wKKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVE1lc3NhZ2VUeXBlLCBJbnQzMikgeworICAgIGxldCBzaXplOiBJbnQzMiA9IHRyeSByZWFkKCkKKyAgICB2YXIgbWVzc2FnZU5hbWUgPSAiIgorICAgIHZhciB0eXBlID0gVE1lc3NhZ2VUeXBlLmV4Y2VwdGlvbgorICAgIAorICAgIGlmIHNpemUgPCAwIHsKKyAgICAgIGxldCB2ZXJzaW9uID0gc2l6ZSAmIFRCaW5hcnlQcm90b2NvbFZlcnNpb24udmVyc2lvbk1hc2sKKyAgICAgIGlmIHZlcnNpb24gIT0gVEJpbmFyeVByb3RvY29sVmVyc2lvbi52ZXJzaW9uMSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuYmFkVmVyc2lvbihleHBlY3RlZDogIlwoVEJpbmFyeVByb3RvY29sVmVyc2lvbi52ZXJzaW9uMSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290OiAiXCh2ZXJzaW9uKSIpKQorICAgICAgfQorICAgICAgdHlwZSA9IFRNZXNzYWdlVHlwZShyYXdWYWx1ZTogSW50MzIoc2l6ZSkgJiAweDAwRkYpID8/IHR5cGUKKyAgICAgIG1lc3NhZ2VOYW1lID0gdHJ5IHJlYWQoKQorICAgIH0gZWxzZSB7CisgICAgICBpZiBzdHJpY3RSZWFkIHsKKyAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9ICJNaXNzaW5nIG1lc3NhZ2UgdmVyc2lvbiwgb2xkIGNsaWVudD8gTWVzc2FnZSBOYW1lOiBcKGN1cnJlbnRNZXNzYWdlTmFtZSA/PyAiIikiCisgICAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSkKKyAgICAgIH0KKyAgICAgIGlmIG1lc3NhZ2VTaXplTGltaXQgPiAwICYmIHNpemUgPiBJbnQzMihtZXNzYWdlU2l6ZUxpbWl0KSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuc2l6ZUxpbWl0KGxpbWl0OiBJbnQobWVzc2FnZVNpemVMaW1pdCksIGdvdDogSW50KHNpemUpKSkKKyAgICAgIH0KKyAgICAgIAorICAgICAgbWVzc2FnZU5hbWUgPSB0cnkgcmVhZFN0cmluZ0JvZHkoSW50KHNpemUpKQorICAgICAgdHlwZSA9IFRNZXNzYWdlVHlwZShyYXdWYWx1ZTogSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkpID8/IHR5cGUKKyAgICB9CisgICAgCisgICAgbGV0IHNlcUlEOiBJbnQzMiA9IHRyeSByZWFkKCkKKyAgICByZXR1cm4gKG1lc3NhZ2VOYW1lLCB0eXBlLCBzZXFJRCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICByZXR1cm4gIiIKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRUeXBlLCBJbnQzMikgeworICAgIAorICAgIGxldCBmaWVsZFR5cGUgPSBUVHlwZShyYXdWYWx1ZTogSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkpID8/IFRUeXBlLnN0b3AKKyAgICB2YXIgZmllbGRJRDogSW50MzIgPSAwCisgICAgCisgICAgaWYgZmllbGRUeXBlICE9IC5zdG9wIHsKKyAgICAgIGZpZWxkSUQgPSBJbnQzMih0cnkgcmVhZCgpIGFzIEludDE2KQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gKCIiLCBmaWVsZFR5cGUsIGZpZWxkSUQpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIFRUeXBlLCBJbnQzMikgeworICAgIHZhciByYXcgPSBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KQorICAgIGd1YXJkIGxldCBrZXlUeXBlID0gVFR5cGUocmF3VmFsdWU6IHJhdykgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biB2YWx1ZSBmb3Iga2V5VHlwZSBUVHlwZTogXChyYXcpIikKKyAgICB9CisgICAgCisgICAgcmF3ID0gSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkKKyAgICBndWFyZCBsZXQgdmFsdWVUeXBlID0gVFR5cGUocmF3VmFsdWU6IHJhdykgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biB2YWx1ZSBmb3IgdmFsdWVUeXBlIFRUeXBlOiBcKHJhdykiKQorICAgIH0KKyAgICBsZXQgc2l6ZTogSW50MzIgPSB0cnkgcmVhZCgpCisgICAgCisgICAgcmV0dXJuIChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIGxldCByYXcgPSBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KQorICAgIGd1YXJkIGxldCBlbGVtZW50VHlwZSA9IFRUeXBlKHJhd1ZhbHVlOiByYXcpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gdmFsdWUgZm9yIGVsZW1lbnRUeXBlIFRUeXBlOiBcKHJhdykiKQorICAgIH0KKyAgICAKKyAgICBsZXQgc2l6ZTogSW50MzIgPSB0cnkgcmVhZCgpCisgICAgCisgICAgcmV0dXJuIChlbGVtZW50VHlwZSwgc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIGxldCByYXcgPSBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KQorICAgIGd1YXJkIGxldCBlbGVtZW50VHlwZSA9IFRUeXBlKHJhd1ZhbHVlOiByYXcpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gdmFsdWUgZm9yIGVsZW1lbnRUeXBlIFRUeXBlOiBcKHJhdykiKQorICAgIH0KKyAgICBsZXQgc2l6ZTogSW50MzIgPSB0cnkgcmVhZCgpCisgICAgCisgICAgcmV0dXJuIChlbGVtZW50VHlwZSwgc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgbGV0IGRhdGE6IERhdGEgPSB0cnkgcmVhZCgpCisgICAgZ3VhcmQgbGV0IHN0ciA9IFN0cmluZy5pbml0KGRhdGE6IGRhdGEsIGVuY29kaW5nOiAudXRmOCkgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLCBtZXNzYWdlOiAiQ291bGRuJ3QgZW5jb2RlIFVURi04IGZyb20gZGF0YSByZWFkIikKKyAgICB9CisgICAgcmV0dXJuIHN0cgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEJvb2wgeworICAgIHJldHVybiAodHJ5IHJlYWQoKSBhcyBVSW50OCkgPT0gMQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFVJbnQ4IHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogMSkKKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZbMF0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQxNiB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDIpCisgICAgfQorICAgIHZhciByZXQgPSBJbnQxNihidWZmWzBdICYgMHhmZikgPDwgOAorICAgIHJldCB8PSAgICBJbnQxNihidWZmWzFdICYgMHhmZikKKyAgICByZXR1cm4gcmV0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MzIgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiA0KQorICAgIH0KKyAgICB2YXIgcmV0ID0gSW50MzIoYnVmZlswXSAmIDB4ZmYpIDw8IDI0CisgICAgcmV0IHw9ICAgIEludDMyKGJ1ZmZbMV0gJiAweGZmKSA8PCAxNgorICAgIHJldCB8PSAgICBJbnQzMihidWZmWzJdICYgMHhmZikgPDwgOAorICAgIHJldCB8PSAgICBJbnQzMihidWZmWzNdICYgMHhmZikKKyAgICAKKyAgICByZXR1cm4gcmV0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50NjQgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiA4KQorICAgIH0KKyAgICB2YXIgcmV0ID0gSW50NjQoYnVmZlswXSAmIDB4ZmYpIDw8IDU2CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbMV0gJiAweGZmKSA8PCA0OAorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzJdICYgMHhmZikgPDwgNDAKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZlszXSAmIDB4ZmYpIDw8IDMyCisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbNF0gJiAweGZmKSA8PCAyNAorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzVdICYgMHhmZikgPDwgMTYKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZls2XSAmIDB4ZmYpIDw8IDgKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZls3XSAmIDB4ZmYpCisgICAgCisgICAgcmV0dXJuIHJldAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgbGV0IHZhbCA9IHRyeSByZWFkKCkgYXMgSW50NjQKKyAgICByZXR1cm4gRG91YmxlKGJpdFBhdHRlcm46IFVJbnQ2NChiaXRQYXR0ZXJuOiB2YWwpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCBzaXplID0gSW50KHRyeSByZWFkKCkgYXMgSW50MzIpCisgICAgdmFyIGRhdGEgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgZGF0YSA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IHNpemUpCisgICAgfQorICAgIAorICAgIHJldHVybiBkYXRhCisgIH0KKyAgCisgIC8vIFdyaXRlIG1ldGhvZHMKKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBtZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlLCBzZXF1ZW5jZUlEOiBJbnQzMikgdGhyb3dzIHsKKyAgICBpZiBzdHJpY3RXcml0ZSB7CisgICAgICBsZXQgdmVyc2lvbiA9IFRCaW5hcnlQcm90b2NvbFZlcnNpb24udmVyc2lvbjEgfCBJbnQzMihtZXNzYWdlVHlwZS5yYXdWYWx1ZSkKKyAgICAgIHRyeSB3cml0ZSh2ZXJzaW9uKQorICAgICAgdHJ5IHdyaXRlKG5hbWUpCisgICAgICB0cnkgd3JpdGUoc2VxdWVuY2VJRCkKKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHdyaXRlKG5hbWUpCisgICAgICB0cnkgd3JpdGUoVUludDgobWVzc2FnZVR5cGUucmF3VmFsdWUpKQorICAgICAgdHJ5IHdyaXRlKHNlcXVlbmNlSUQpCisgICAgfQorICAgIGN1cnJlbnRNZXNzYWdlTmFtZSA9IG5hbWUKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICBjdXJyZW50TWVzc2FnZU5hbWUgPSBuaWwKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTdHJ1Y3RCZWdpbihuYW1lOiBTdHJpbmcpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBmaWVsZFR5cGU6IFRUeXBlLCBmaWVsZElEOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoVUludDgoZmllbGRUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoSW50MTYoZmllbGRJRCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoVUludDgoVFR5cGUuc3RvcC5yYXdWYWx1ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEJlZ2luKGtleVR5cGU6IFRUeXBlLCB2YWx1ZVR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoVUludDgoa2V5VHlwZS5yYXdWYWx1ZSkpCisgICAgdHJ5IHdyaXRlKFVJbnQ4KHZhbHVlVHlwZS5yYXdWYWx1ZSkpCisgICAgdHJ5IHdyaXRlKHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChlbGVtZW50VHlwZS5yYXdWYWx1ZSkpCisgICAgdHJ5IHdyaXRlKHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoVUludDgoZWxlbWVudFR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBTdHJpbmcpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKHZhbHVlLmRhdGEodXNpbmc6IC51dGY4KSEpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEJvb2wpIHRocm93cyB7CisgICAgbGV0IGJ5dGVWYWw6IFVJbnQ4ID0gdmFsdWUgPyAxIDogMAorICAgIHRyeSB3cml0ZShieXRlVmFsKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBVSW50OCkgdGhyb3dzIHsKKyAgICBsZXQgYnVmZiA9IERhdGEoYnl0ZXM6IFt2YWx1ZV0pCisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogYnVmZikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDE2KSB0aHJvd3MgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gOCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUpKV0pKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ1ZmYpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQzMikgdGhyb3dzIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDI0KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiAxNikpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gOCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUpKV0pKQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ1ZmYpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQ2NCkgdGhyb3dzIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDU2KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA0OCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gNDApKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDMyKSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiAyNCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMTYpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDgpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlKSldKSkKKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRG91YmxlKSB0aHJvd3MgeworICAgIC8vIE5vdGFibHkgdW5zYWZlLCBzaW5jZSBEb3VibGUgYW5kIEludDY0IGFyZSB0aGUgc2FtZSBzaXplLCB0aGlzIHNob3VsZCB3b3JrIGZpbmUKKyAgICB0cnkgc2VsZi53cml0ZShJbnQ2NChiaXRQYXR0ZXJuOiB2YWx1ZS5iaXRQYXR0ZXJuKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyBkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShJbnQzMihkYXRhLmNvdW50KSkKKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBkYXRhKQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVENsaWVudC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RDbGllbnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MzMjg4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RDbGllbnQuc3dpZnQKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK29wZW4gY2xhc3MgVENsaWVudCB7CisgIHB1YmxpYyBsZXQgaW5Qcm90b2NvbDogVFByb3RvY29sCisgIHB1YmxpYyBsZXQgb3V0UHJvdG9jb2w6IFRQcm90b2NvbAorCisgIHJlcXVpcmVkIHB1YmxpYyBpbml0KGlub3V0UHJvdG9jb2w6IFRQcm90b2NvbCkgeworICAgIHNlbGYuaW5Qcm90b2NvbCA9IGlub3V0UHJvdG9jb2wKKyAgICBzZWxmLm91dFByb3RvY29sID0gaW5vdXRQcm90b2NvbAorICB9CisKKyAgcmVxdWlyZWQgcHVibGljIGluaXQoaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRQcm90b2NvbDogVFByb3RvY29sKSB7CisgICAgc2VsZi5pblByb3RvY29sID0gaW5Qcm90b2NvbAorICAgIHNlbGYub3V0UHJvdG9jb2wgPSBvdXRQcm90b2NvbAorICB9Cit9CisKKworb3BlbiBjbGFzcyBUQXN5bmNDbGllbnQ8UHJvdG9jb2w6IFRQcm90b2NvbCwgRmFjdG9yeTogVEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4geworICBwdWJsaWMgdmFyIGZhY3Rvcnk6IEZhY3RvcnkKKyAgcHVibGljIGluaXQod2l0aCBwcm90b2NvbDogUHJvdG9jb2wuVHlwZSwgZmFjdG9yeTogRmFjdG9yeSkgeworICAgIHNlbGYuZmFjdG9yeSA9IGZhY3RvcnkKKyAgfQorfQorCisKK3B1YmxpYyBlbnVtIFRBc3luY1Jlc3VsdDxUPiB7CisgIGNhc2Ugc3VjY2VzcyhUKQorICBjYXNlIGVycm9yKFN3aWZ0LkVycm9yKQorICAKKyAgcHVibGljIGZ1bmMgdmFsdWUoKSB0aHJvd3MgLT4gVCB7CisgICAgc3dpdGNoIHNlbGYgeworICAgIGNhc2UgLnN1Y2Nlc3MobGV0IHQpOiByZXR1cm4gdAorICAgIGNhc2UgLmVycm9yKGxldCBlKTogdGhyb3cgZQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVENvbXBhY3RQcm90b2NvbC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RDb21wYWN0UHJvdG9jb2wuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3NzNjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RDb21wYWN0UHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSw1NzUgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworcHVibGljIGVudW0gVENUeXBlOiBVSW50OCB7CisgIGNhc2Ugc3RvcCAgICAgICAgICA9IDB4MDAKKyAgY2FzZSBib29sZWFuX1RSVUUgID0gMHgwMQorICBjYXNlIGJvb2xlYW5fRkFMU0UgPSAweDAyCisgIGNhc2UgaTggICAgICAgICAgICA9IDB4MDMKKyAgY2FzZSBpMTYgICAgICAgICAgID0gMHgwNAorICBjYXNlIGkzMiAgICAgICAgICAgPSAweDA1CisgIGNhc2UgaTY0ICAgICAgICAgICA9IDB4MDYKKyAgY2FzZSBkb3VibGUgICAgICAgID0gMHgwNworICBjYXNlIGJpbmFyeSAgICAgICAgPSAweDA4CisgIGNhc2UgbGlzdCAgICAgICAgICA9IDB4MDkKKyAgY2FzZSBzZXQgICAgICAgICAgID0gMHgwQQorICBjYXNlIG1hcCAgICAgICAgICAgPSAweDBCCisgIGNhc2UgYHN0cnVjdGAgICAgICA9IDB4MEMKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHR5cGVNYXNrOiBVSW50OCA9IDB4RTAgLy8gMTExMCAwMDAwCisgIHB1YmxpYyBzdGF0aWMgbGV0IHR5cGVCaXRzOiBVSW50OCA9IDB4MDcgLy8gMDAwMCAwMTExCisgIHB1YmxpYyBzdGF0aWMgbGV0IHR5cGVTaGlmdEFtb3VudCA9IDUKKyAKK30KKworCitwdWJsaWMgY2xhc3MgVENvbXBhY3RQcm90b2NvbDogVFByb3RvY29sIHsKKyAgcHVibGljIHN0YXRpYyBsZXQgcHJvdG9jb2xJRDogVUludDggID0gMHg4MgorICBwdWJsaWMgc3RhdGljIGxldCB2ZXJzaW9uOiBVSW50OCAgICAgPSAxCisgIHB1YmxpYyBzdGF0aWMgbGV0IHZlcnNpb25NYXNrOiBVSW50OCA9IDB4MUYgLy8gMDAwMSAxMTExCisgIAorICBwdWJsaWMgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydAorICAKKyAgdmFyIGxhc3RGaWVsZDogW1VJbnQ4XSA9IFtdCisgIHZhciBsYXN0RmllbGRJZDogVUludDggPSAwCisgIAorICB2YXIgYm9vbEZpZWxkTmFtZTogU3RyaW5nPworICB2YXIgYm9vbEZpZWxkVHlwZTogVFR5cGU/CisgIHZhciBib29sRmllbGRJZDogSW50MzI/CisgIHZhciBib29sZWFuVmFsdWU6IEJvb2w/CisgIAorICB2YXIgY3VycmVudE1lc3NhZ2VOYW1lOiBTdHJpbmc/CisKKyAgcHVibGljIHJlcXVpcmVkIGluaXQob24gdHJhbnNwb3J0OiBUVHJhbnNwb3J0KSB7CisgICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgfQorCisgIAorICAvLy8gTWFyazogLSBUQ29tcGFjdFByb3RvY29sIGhlbHBlcnMKKyAgCisgIGZ1bmMgd3JpdGVieXRlRGlyZWN0KF8gYnl0ZTogVUludDgpIHRocm93cyB7CisgICAgbGV0IGJ5dGUgPSBEYXRhKGJ5dGVzOiBbYnl0ZV0pCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFdyaXRlIEZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogYnl0ZSkKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgd3JpdGVWYXJpbnQzMihfIHZhbDogVUludDMyKSB0aHJvd3MgeworICAgIHZhciB2YWwgPSB2YWwKKyAgICB2YXIgaTMyYnVmID0gW1VJbnQ4XShyZXBlYXRpbmc6IDAsIGNvdW50OiA1KQorICAgIHZhciBpZHggPSAwCisgICAgd2hpbGUgdHJ1ZSB7CisgICAgICBpZiAodmFsICYgfjB4N0YpID09IDAgeworICAgICAgICBpMzJidWZbaWR4XSA9IFVJbnQ4KHZhbCkKKyAgICAgICAgaWR4ICs9IDEKKyAgICAgICAgYnJlYWsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGkzMmJ1ZltpZHhdID0gVUludDgoKHZhbCAmIDB4N0YpIHwgMHg4MCkKKyAgICAgICAgaWR4ICs9IDEKKyAgICAgICAgdmFsID4+PSA3CisgICAgICB9CisgICAgfQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IERhdGEoYnl0ZXM6IGkzMmJ1ZlswLi48aWR4XSkpCisgICAgfQorICB9CisgIAorICBmdW5jIHdyaXRlVmFyaW50NjQoXyB2YWw6IFVJbnQ2NCkgdGhyb3dzIHsKKyAgICB2YXIgdmFsID0gdmFsCisgICAgdmFyIHZhcmludDY0b3V0ID0gW1VJbnQ4XShyZXBlYXRpbmc6IDAsIGNvdW50OiAxMCkKKyAgICB2YXIgaWR4ID0gMAorICAgIHdoaWxlIHRydWUgeworICAgICAgaWYgKHZhbCAmIH4weDdGKSA9PSAweworICAgICAgICB2YXJpbnQ2NG91dFtpZHhdID0gVUludDgodmFsKQorICAgICAgICBpZHggKz0gMQorICAgICAgICBicmVhaworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyaW50NjRvdXRbaWR4XSA9IFVJbnQ4KHZhbCAmIDB4N0YpIHwgMHg4MAorICAgICAgICBpZHggKz0gMQorICAgICAgICB2YWwgPj49IDcKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFdyaXRlIEZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogRGF0YShieXRlczogdmFyaW50NjRvdXRbMC4uPGlkeF0pKQorICAgIH0KKyAgCisgIH0KKyAgCisgIGZ1bmMgd3JpdGVDb2xsZWN0aW9uQmVnaW4oXyBlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIGxldCBjdHlwZSA9IGNvbXBhY3RUeXBlKGVsZW1lbnRUeXBlKS5yYXdWYWx1ZQorICAgIGlmIHNpemUgPD0gMTQgeworICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdChVSW50OChzaXplIDw8IDQpIHwgY3R5cGUpCisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoMHhGMCB8IGN0eXBlKQorICAgICAgdHJ5IHdyaXRlVmFyaW50MzIoVUludDMyKHNpemUpKQorICAgIH0KKyAgfQorICAKKyAgZnVuYyByZWFkQmluYXJ5KF8gc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgdmFyIHJlc3VsdCA9IERhdGEoKQorICAgIGlmIHNpemUgIT0gMCB7CisgICAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgICByZXN1bHQgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiBzaXplKQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIGZ1bmMgcmVhZFZhcmludDMyKCkgdGhyb3dzIC0+IFVJbnQzMiB7CisgICAgdmFyIHJlc3VsdDogVUludDMyID0gMAorICAgIHZhciBzaGlmdDogVUludDMyID0gMAorICAgIHdoaWxlIHRydWUgeworICAgICAgbGV0IGJ5dGU6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgICAgCisgICAgICByZXN1bHQgfD0gVUludDMyKGJ5dGUgJiAweDdGKSA8PCBzaGlmdAorICAgICAgaWYgKGJ5dGUgJiAweDgwKSA9PSAwIHsKKyAgICAgICAgYnJlYWsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2hpZnQgKz0gNworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIGZ1bmMgcmVhZFZhcmludDY0KCkgdGhyb3dzIC0+IFVJbnQ2NCB7CisgICAgdmFyIHJlc3VsdDogVUludDY0ID0gMAorICAgIHZhciBzaGlmdDogVUludDY0ID0gMAorICAgIAorICAgIHdoaWxlIHRydWUgeworICAgICAgbGV0IGJ5dGU6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgICAgCisgICAgICByZXN1bHQgfD0gVUludDY0KGJ5dGUgJiAweDdGKSA8PCBzaGlmdAorICAgICAgaWYgKGJ5dGUgJiAweDgwKSA9PSAwIHsKKyAgICAgICAgYnJlYWsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2hpZnQgKz0gNworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisKKyAgZnVuYyB0dHlwZShfIGNvbXBhY3RUeXBlVmFsOiBVSW50OCkgdGhyb3dzIC0+IFRUeXBlIHsKKyAgICBndWFyZCBsZXQgY29tcGFjdFR5cGUgPSBUQ1R5cGUocmF3VmFsdWU6IGNvbXBhY3RUeXBlVmFsKSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIFRDVHlwZSB2YWx1ZTogXChjb21wYWN0VHlwZVZhbCkiKQorICAgIH0KKyAgICAKKyAgICBzd2l0Y2ggY29tcGFjdFR5cGUgeworICAgIGNhc2UgLnN0b3A6IHJldHVybiAuc3RvcDsKKyAgICBjYXNlIC5ib29sZWFuX0ZBTFNFLCAuYm9vbGVhbl9UUlVFOiByZXR1cm4gLmJvb2w7CisgICAgY2FzZSAuaTg6IHJldHVybiAuaTg7CisgICAgY2FzZSAuaTE2OiByZXR1cm4gLmkxNjsKKyAgICBjYXNlIC5pMzI6IHJldHVybiAuaTMyOworICAgIGNhc2UgLmk2NDogcmV0dXJuIC5pNjQ7CisgICAgY2FzZSAuZG91YmxlOiByZXR1cm4gLmRvdWJsZTsKKyAgICBjYXNlIC5iaW5hcnk6IHJldHVybiAuc3RyaW5nOworICAgIGNhc2UgLmxpc3Q6IHJldHVybiAubGlzdDsKKyAgICBjYXNlIC5zZXQ6IHJldHVybiAuc2V0OworICAgIGNhc2UgLm1hcDogcmV0dXJuIC5tYXA7CisgICAgY2FzZSAuc3RydWN0OiByZXR1cm4gLnN0cnVjdDsKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgY29tcGFjdFR5cGUoXyB0dHlwZTogVFR5cGUpIC0+IFRDVHlwZSB7CisgICAgc3dpdGNoIHR0eXBlIHsKKyAgICBjYXNlIC5zdG9wOiAgIHJldHVybiAuc3RvcAorICAgIGNhc2UgLnZvaWQ6ICAgcmV0dXJuIC5pOAorICAgIGNhc2UgLmJvb2w6ICAgcmV0dXJuIC5ib29sZWFuX0ZBTFNFCisgICAgY2FzZSAuaTg6ICAgcmV0dXJuIC5pOAorICAgIGNhc2UgLmRvdWJsZTogcmV0dXJuIC5kb3VibGUKKyAgICBjYXNlIC5pMTY6ICAgIHJldHVybiAuaTE2CisgICAgY2FzZSAuaTMyOiAgICByZXR1cm4gLmkzMgorICAgIGNhc2UgLmk2NDogICAgcmV0dXJuIC5pNjQKKyAgICBjYXNlIC5zdHJpbmc6IHJldHVybiAuYmluYXJ5CisgICAgY2FzZSAuc3RydWN0OiByZXR1cm4gLnN0cnVjdAorICAgIGNhc2UgLm1hcDogICAgcmV0dXJuIC5tYXAKKyAgICBjYXNlIC5zZXQ6ICAgIHJldHVybiAuc2V0CisgICAgY2FzZSAubGlzdDogICByZXR1cm4gLmxpc3QKKyAgICBjYXNlIC51dGY4OiAgIHJldHVybiAuYmluYXJ5CisgICAgY2FzZSAudXRmMTY6ICByZXR1cm4gLmJpbmFyeQorICAgIH0KKyAgfQorICAKKyAgLy8vIFppZ1phZyBlbmNvZGluZyBtYXBzIHNpZ25lZCBpbnRlZ2VycyB0byB1bnNpZ25lZCBpbnRlZ2VycyBzbyB0aGF0CisgIC8vLyBudW1iZXJzIHdpdGggYSBzbWFsbCBhYnNvbHV0ZSB2YWx1ZSAoZm9yIGluc3RhbmNlLCAtMSkgaGF2ZQorICAvLy8gYSBzbWFsbCB2YXJpbnQgZW5jb2RlZCB2YWx1ZSB0b28uIEl0IGRvZXMgdGhpcyBpbiBhIHdheSB0aGF0CisgIC8vLyAiemlnLXphZ3MiIGJhY2sgYW5kIGZvcnRoIHRocm91Z2ggdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBpbnRlZ2VycywKKyAgLy8vIHNvIHRoYXQgLTEgaXMgZW5jb2RlZCBhcyAxLCAxIGlzIGVuY29kZWQgYXMgMiwgLTIgaXMgZW5jb2RlZCBhcyAzLCBhbmQgc28KKyAgLy8vCisgIC8vLyAtIHBhcmFtZXRlciBuOiBudW1iZXIgdG8gemlnemFnCisgIC8vLworICAvLy8gLSByZXR1cm5zOiB6aWd6YWdlZCBVSW50MzIKKyAgZnVuYyBpMzJUb1ppZ1phZyhfIG4gOiBJbnQzMikgLT4gVUludDMyIHsKKyAgICByZXR1cm4gVUludDMyKGJpdFBhdHRlcm46IEludDMyKG4gPDwgMSkgXiBJbnQzMihuID4+IDMxKSkKKyAgfQorCisgIGZ1bmMgaTY0VG9aaWdaYWcoXyBuIDogSW50NjQpIC0+IFVJbnQ2NCB7CisgICAgcmV0dXJuIFVJbnQ2NChiaXRQYXR0ZXJuOiBJbnQ2NChuIDw8IDEpIF4gSW50NjQobiA+PiA2MykpCisgIH0KKworICBmdW5jIHppZ1phZ1RvaTMyKF8gbjogVUludDMyKSAtPiBJbnQzMiB7CisgICAgcmV0dXJuIEludDMyKG4gPj4gMSkgXiAoLUludDMyKG4gJiAxKSkKKyAgfQorICAKKyAgZnVuYyB6aWdaYWdUb2k2NChfIG46IFVJbnQ2NCkgLT4gSW50NjQgeworICAgIHJldHVybiBJbnQ2NChuID4+IDEpIF4gKC1JbnQ2NChuICYgMSkpCisgIH0KKyAgCisgIAorICAKKyAgLy8vIE1hcms6IC0gVFByb3RvY29sICAKKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVE1lc3NhZ2VUeXBlLCBJbnQzMikgeworICAgIGxldCBwcm90b2NvbElkOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICAKKyAgICBpZiBwcm90b2NvbElkICE9IFRDb21wYWN0UHJvdG9jb2wucHJvdG9jb2xJRCB7CisgICAgICBsZXQgZXhwZWN0ZWQgPSBTdHJpbmcoZm9ybWF0OiIlMlgiLCBUQ29tcGFjdFByb3RvY29sLnByb3RvY29sSUQpCisgICAgICBsZXQgZ290ICAgICAgPSBTdHJpbmcoZm9ybWF0OiIlMlgiLCBwcm90b2NvbElkKQorICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIldyb25nIFByb3RvY29sIElEIFwoZ290KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiAubWlzbWF0Y2hlZFByb3RvY29sKGV4cGVjdGVkOiBleHBlY3RlZCwgZ290OiBnb3QpKQorCisgICAgfQorCisgICAgbGV0IHZlcnNpb25BbmRUeXBlOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICBsZXQgdmVyc2lvbjogVUludDggPSB2ZXJzaW9uQW5kVHlwZSAmIFRDb21wYWN0UHJvdG9jb2wudmVyc2lvbk1hc2sKKyAgICBpZiB2ZXJzaW9uICE9IFRDb21wYWN0UHJvdG9jb2wudmVyc2lvbiB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmJhZFZlcnNpb24oZXhwZWN0ZWQ6ICJcKFRDb21wYWN0UHJvdG9jb2wudmVyc2lvbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdDoiXCh2ZXJzaW9uKSIpKQorCisgICAgfQorICAgIAorICAgIGxldCB0eXBlID0gKHZlcnNpb25BbmRUeXBlID4+IFVJbnQ4KFRDVHlwZS50eXBlU2hpZnRBbW91bnQpKSAmIFRDVHlwZS50eXBlQml0cworICAgIGd1YXJkIGxldCBtdHlwZSA9IFRNZXNzYWdlVHlwZShyYXdWYWx1ZTogSW50MzIodHlwZSkpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gVE1lc3NhZ2VUeXBlIHZhbHVlOiBcKHR5cGUpIikKKyAgICB9CisgICAgbGV0IHNlcXVlbmNlSWQgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICBsZXQgbmFtZTogU3RyaW5nID0gdHJ5IHJlYWQoKQorICAgIAorICAgIHJldHVybiAobmFtZSwgbXR5cGUsIEludDMyKHNlcXVlbmNlSWQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiBTdHJpbmcgeworICAgIGxhc3RGaWVsZC5hcHBlbmQobGFzdEZpZWxkSWQpCisgICAgbGFzdEZpZWxkSWQgPSAwCisgICAgcmV0dXJuICIiCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIGxhc3RGaWVsZElkID0gbGFzdEZpZWxkLmxhc3QgPz8gMAorICAgIGxhc3RGaWVsZC5yZW1vdmVMYXN0KCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVFR5cGUsIEludDMyKSB7CisgICAgbGV0IGJ5dGU6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgIGd1YXJkIGxldCB0eXBlID0gVENUeXBlKHJhd1ZhbHVlOiBieXRlICYgMHgwRikgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biBUQ1R5cGUgXChieXRlICYgMHgwRikiKQorICAgIH0KKyAgICAKKyAgICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIKKyAgICBpZiB0eXBlID09IC5zdG9wIHsKKyAgICAgIHJldHVybiAoIiIsIC5zdG9wLCAwKQorICAgIH0KKyAgICAKKyAgICB2YXIgZmllbGRJZDogSW50MTYgPSAwCisgICAgCisgICAgLy8gbWFzayBvZmYgdGhlIDRNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiAgaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhCisgICAgbGV0IG1vZGlmaWVyID0gKGJ5dGUgJiAweEYwKSA+PiA0CisgICAgaWYgbW9kaWZpZXIgPT0gMCB7CisgICAgICAvLyBub3QgYSBkZWx0YS4gIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkCisgICAgICBmaWVsZElkID0gdHJ5IHJlYWQoKQorICAgIH0gZWxzZSB7CisgICAgICAvLyBoYXMgYSBkZWx0YS4gIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgUmVhZCBmaWVsZCBpZC4KKyAgICAgIGZpZWxkSWQgPSBJbnQxNihsYXN0RmllbGRJZCArIG1vZGlmaWVyKQorICAgIH0KKyAgICAKKyAgICBsZXQgZmllbGRUeXBlID0gdHJ5IHR0eXBlKHR5cGUucmF3VmFsdWUpCisgICAgCisgICAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgICBpZiB0eXBlID09IC5ib29sZWFuX1RSVUUgfHwgdHlwZSA9PSAuYm9vbGVhbl9GQUxTRSB7CisgICAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZQorICAgICAgYm9vbGVhblZhbHVlID0gdHlwZSA9PSAuYm9vbGVhbl9UUlVFCisgICAgfQorICAgIAorICAgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nCisgICAgbGFzdEZpZWxkSWQgPSBVSW50OChmaWVsZElkKQorICAgIHJldHVybiAoIiIsIGZpZWxkVHlwZSwgSW50MzIoZmllbGRJZCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICBsZXQgbGVuZ3RoID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgCisgICAgdmFyIHJlc3VsdDogU3RyaW5nCisgICAgCisgICAgaWYgbGVuZ3RoICE9IDAgeworICAgICAgbGV0IGRhdGEgPSB0cnkgcmVhZEJpbmFyeShJbnQobGVuZ3RoKSkKKyAgICAgIHJlc3VsdCA9IFN0cmluZyhkYXRhOiBkYXRhLCBlbmNvZGluZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpID8/ICIiCisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9ICIiCisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBCb29sIHsKKyAgICBpZiBsZXQgdmFsID0gYm9vbGVhblZhbHVlIHsKKyAgICAgIHNlbGYuYm9vbGVhblZhbHVlID0gbmlsCisgICAgICByZXR1cm4gdmFsCisgICAgfSBlbHNlIHsKKyAgICAgIGxldCByZXN1bHQgPSB0cnkgcmVhZCgpIGFzIFVJbnQ4CisgICAgICByZXR1cm4gVENUeXBlKHJhd1ZhbHVlOiByZXN1bHQpID09IC5ib29sZWFuX1RSVUUKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gVUludDggeworICAgIHZhciBidWZmOiBVSW50OCA9IDAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDEpWzBdCisgICAgfQorICAgIHJldHVybiBidWZmCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MTYgeworICAgIGxldCB2ID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgcmV0dXJuIEludDE2KHppZ1phZ1RvaTMyKHYpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDMyIHsKKyAgICBsZXQgdiA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIHJldHVybiB6aWdaYWdUb2kzMih2KQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICBsZXQgdiA9IHRyeSByZWFkVmFyaW50NjQoKQorICAgIHJldHVybiB6aWdaYWdUb2k2NCh2KQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDgpCisgICAgfQorICAgIAorICAgIGxldCBpNjQ6IFVJbnQ2NCA9IGJ1ZmYud2l0aFVuc2FmZUJ5dGVzIHsgKHB0cjogVW5zYWZlUG9pbnRlcjxVSW50OD4pIC0+IFVJbnQ2NCBpbgorICAgICAgcmV0dXJuIFVuc2FmZVBvaW50ZXI8VUludDY0PihPcGFxdWVQb2ludGVyKHB0cikpLnBvaW50ZWUKKyAgICB9CisgICAgbGV0IGJpdHMgPSBDRlN3YXBJbnQ2NExpdHRsZVRvSG9zdChpNjQpCisgICAgcmV0dXJuIERvdWJsZShiaXRQYXR0ZXJuOiBiaXRzKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCBsZW5ndGggPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICByZXR1cm4gdHJ5IHJlYWRCaW5hcnkoSW50KGxlbmd0aCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIFRUeXBlLCBJbnQzMikgeworICAgIHZhciBrZXlBbmRWYWx1ZVR5cGU6IFVJbnQ4ID0gOAorICAgIGxldCBzaXplID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgaWYgc2l6ZSAhPSAwIHsKKyAgICAgIGtleUFuZFZhbHVlVHlwZSA9IHRyeSByZWFkKCkKKyAgICB9CisgICAgCisgICAgbGV0IGtleVR5cGUgPSB0cnkgdHR5cGUoa2V5QW5kVmFsdWVUeXBlID4+IDQpCisgICAgbGV0IHZhbHVlVHlwZSA9IHRyeSB0dHlwZShrZXlBbmRWYWx1ZVR5cGUgJiAweEYpCisgICAgCisgICAgcmV0dXJuIChrZXlUeXBlLCB2YWx1ZVR5cGUsIEludDMyKHNpemUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwRW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICByZXR1cm4gdHJ5IHJlYWRMaXN0QmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0RW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgbGV0IHNpemVBbmRUeXBlOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICB2YXIgc2l6ZTogVUludDMyID0gVUludDMyKHNpemVBbmRUeXBlID4+IDQpICYgMHgwZgorICAgIGlmIHNpemUgPT0gMTUgeworICAgICAgc2l6ZSA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIH0KKyAgICBsZXQgZWxlbWVudFR5cGUgPSB0cnkgdHR5cGUoc2l6ZUFuZFR5cGUgJiAweDBGKQorICAgIAorICAgIHJldHVybiAoZWxlbWVudFR5cGUsIEludDMyKHNpemUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBtZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVieXRlRGlyZWN0KFRDb21wYWN0UHJvdG9jb2wucHJvdG9jb2xJRCkKKyAgICBsZXQgbmV4dEJ5dGU6IFVJbnQ4ID0gKFRDb21wYWN0UHJvdG9jb2wudmVyc2lvbiAmIFRDb21wYWN0UHJvdG9jb2wudmVyc2lvbk1hc2spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJbnQ4KChVSW50MzIobWVzc2FnZVR5cGUucmF3VmFsdWUpIDw8IFVJbnQzMihUQ1R5cGUudHlwZVNoaWZ0QW1vdW50KSkpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVENUeXBlLnR5cGVNYXNrKQorICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QobmV4dEJ5dGUpCisgICAgdHJ5IHdyaXRlVmFyaW50MzIoVUludDMyKHNlcXVlbmNlSUQpKQorICAgIHRyeSB3cml0ZShuYW1lKQorICAgIAorICAgIGN1cnJlbnRNZXNzYWdlTmFtZSA9IG5hbWUKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICBjdXJyZW50TWVzc2FnZU5hbWUgPSBuaWwKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTdHJ1Y3RCZWdpbihuYW1lOiBTdHJpbmcpIHRocm93cyB7CisgICAgbGFzdEZpZWxkLmFwcGVuZChsYXN0RmllbGRJZCkKKyAgICBsYXN0RmllbGRJZCA9IDAKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIGxhc3RGaWVsZElkID0gbGFzdEZpZWxkLmxhc3QgPz8gMAorICAgIGxhc3RGaWVsZC5yZW1vdmVMYXN0KCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IEludDMyKSB0aHJvd3MgeworICAgIGlmIGZpZWxkVHlwZSA9PSAuYm9vbCB7CisgICAgICBib29sRmllbGROYW1lID0gbmFtZQorICAgICAgYm9vbEZpZWxkVHlwZSA9IGZpZWxkVHlwZQorICAgICAgYm9vbEZpZWxkSWQgPSBmaWVsZElECisgICAgICByZXR1cm4KKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWU6IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IGZpZWxkSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOiAweEZGKQorICAgIH0KKyAgfQorICAKKyAgZnVuYyB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lOiBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBmaWVsZFR5cGU6IFRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IEludDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZTogVUludDgpIHRocm93cyB7CisgICAgCisgICAgbGV0IHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlID09IDB4RkYgPyBjb21wYWN0VHlwZShmaWVsZFR5cGUpLnJhd1ZhbHVlIDogdHlwZU92ZXJyaWRlCisgICAgCisgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgICAgbGV0IGRpZmYgPSBVSW50OChmaWVsZElEKSAtIGxhc3RGaWVsZElkCisgICAgaWYgKFVJbnQ4KGZpZWxkSUQpID4gbGFzdEZpZWxkSWQpICYmIChkaWZmIDw9IDE1KSB7CisgICAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KChVSW50OChmaWVsZElEKSAtIGxhc3RGaWVsZElkKSA8PCA0IHwgdHlwZVRvV3JpdGUpCisgICAgICAKKyAgICB9IGVsc2UgeworICAgICAgLy8gV3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCh0eXBlVG9Xcml0ZSkKKyAgICAgIHRyeSB3cml0ZShJbnQxNihmaWVsZElEKSkKKyAgICB9CisgICAgCisgICAgbGFzdEZpZWxkSWQgPSBVSW50OChmaWVsZElEKQorICAgICAgCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVieXRlRGlyZWN0KFRDVHlwZS5zdG9wLnJhd1ZhbHVlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBCZWdpbihrZXlUeXBlOiBUVHlwZSwgdmFsdWVUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgaWYgc2l6ZSA9PSAwIHsKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoMCkKKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHdyaXRlVmFyaW50MzIoVUludDMyKHNpemUpKQorICAgICAgCisgICAgICBsZXQgY29tcGFjdGVkVHlwZXMgPSBjb21wYWN0VHlwZShrZXlUeXBlKS5yYXdWYWx1ZSA8PCA0IHwgY29tcGFjdFR5cGUodmFsdWVUeXBlKS5yYXdWYWx1ZQorICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdChjb21wYWN0ZWRUeXBlcykKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwRW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtZW50VHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtZW50VHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZSh2YWx1ZS5kYXRhKHVzaW5nOiBTdHJpbmcuRW5jb2RpbmcudXRmOCkhKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBCb29sKSB0aHJvd3MgeworICAgIGlmIGxldCBib29sRmllbGRJZCA9IGJvb2xGaWVsZElkLCBsZXQgYm9vbEZpZWxkVHlwZSA9IGJvb2xGaWVsZFR5cGUsCisgICAgICAgbGV0IGJvb2xGaWVsZE5hbWUgPSBib29sRmllbGROYW1lIHsKKyAgICAgIAorICAgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgICBsZXQgY29tcGFjdFR5cGU6IFRDVHlwZSA9IHZhbHVlID8gLmJvb2xlYW5fVFJVRSA6IC5ib29sZWFuX0ZBTFNFCisgICAgICB0cnkgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZTogYm9vbEZpZWxkTmFtZSwgdHlwZTogYm9vbEZpZWxkVHlwZSwgZmllbGRJRDogYm9vbEZpZWxkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOiBjb21wYWN0VHlwZS5yYXdWYWx1ZSkKKyAgICAgIHNlbGYuYm9vbEZpZWxkSWQgPSBuaWwKKyAgICAgIHNlbGYuYm9vbEZpZWxkVHlwZSA9IG5pbAorICAgICAgc2VsZi5ib29sRmllbGROYW1lID0gbmlsCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlLgorICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCh2YWx1ZSA/IFRDVHlwZS5ib29sZWFuX1RSVUUucmF3VmFsdWUgOiBUQ1R5cGUuYm9vbGVhbl9GQUxTRS5yYXdWYWx1ZSkKKyAgICB9CisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBVSW50OCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVieXRlRGlyZWN0KHZhbHVlKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MTYpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlVmFyaW50MzIoaTMyVG9aaWdaYWcoSW50MzIodmFsdWUpKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlVmFyaW50MzIoaTMyVG9aaWdaYWcodmFsdWUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQ2NCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVWYXJpbnQ2NChpNjRUb1ppZ1phZyh2YWx1ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IERvdWJsZSkgdGhyb3dzIHsKKyAgICB2YXIgYml0cyA9IENGU3dhcEludDY0SG9zdFRvTGl0dGxlKHZhbHVlLmJpdFBhdHRlcm4pCisgICAgbGV0IGRhdGEgPSB3aXRoVW5zYWZlUG9pbnRlcih0bzogJmJpdHMpIHsKKyAgICAgIHJldHVybiBEYXRhKGJ5dGVzOiBVbnNhZmVQb2ludGVyPFVJbnQ4PihPcGFxdWVQb2ludGVyKCQwKSksIGNvdW50OiBNZW1vcnlMYXlvdXQ8VUludDY0Pi5zaXplKQorICAgIH0KKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgV3JpdGUgRmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBkYXRhKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyBkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVZhcmludDMyKFVJbnQzMihkYXRhLmNvdW50KSkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgV3JpdGUgRmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBkYXRhKQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEVudW0uc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URW51bS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWRmZGIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEVudW0uc3dpZnQKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3B1YmxpYyBwcm90b2NvbCBURW51bSA6IFRTZXJpYWxpemFibGUsIEhhc2hhYmxlIHsKKyAgdmFyIHJhd1ZhbHVlOiBJbnQzMiB7IGdldCB9Cit9CisKK2V4dGVuc2lvbiBURW51bSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5pMzIgfQorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZTogSW50IHsgcmV0dXJuIHJhd1ZhbHVlLmhhc2hWYWx1ZSB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUocmF3VmFsdWUpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RFcnJvci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RFcnJvci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWVkYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEVycm9yLnN3aWZ0CkBAIC0wLDAgKzEsNzcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworLy8vIFRFcnJvckNvZGUKKy8vLworLy8vIFByb3RvY29sIGZvciBURXJyb3IgY29uZm9ybWVycycgZW51bSdzIHRvIGNvbmZvcm0gdG8uCisvLy8gR2VuZXJpYyBJbnQgVGhyaWZ0IGVycm9yIGNvZGUgdG8gYWxsb3cgZXJyb3IgY2FzZXMgdG8gaGF2ZQorLy8vIGFzc29jaWF0ZWQgdmFsdWVzLgorcHVibGljIHByb3RvY29sIFRFcnJvckNvZGUgOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSB7CisgIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7IGdldCB9Cit9CisKKy8vLyBURXJyb3IKKy8vLworLy8vIEJhc2UgcHJvdG9jb2wgZm9yIGFsbCBUaHJpZnQgRXJyb3IoRXhjZXB0aW9uKSB0eXBlcyB0byBjb25mb3JtIHRvCitwdWJsaWMgcHJvdG9jb2wgVEVycm9yIDogRXJyb3IsIEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlIHsKKworICAvLy8gRW51bSBmb3IgZXJyb3IgY2FzZXMuICBDYW4gYmUgdHlwZWFsaWFzZWQgdG8gYW55IGNvbmZvcm1pbmcgZW51bQorICAvLy8gb3IgZGVmaW5lZCBuZXN0ZWQuCisgIGFzc29jaWF0ZWR0eXBlIENvZGU6IFRFcnJvckNvZGUKKyAgCisgIC8vLyBFcnJvciBDYXNlLCB2YWx1ZSBmcm9tIGludGVybmFsIGVudW0KKyAgdmFyIGVycm9yOiBDb2RlIHsgZ2V0IHNldCB9CisgIAorICAvLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBtZXNzYWdlCisgIHZhciBtZXNzYWdlOiBTdHJpbmc/IHsgZ2V0IHNldCB9CisgIAorICAvLy8gRGVmYXVsdCBlcnJvciBjYXNlIGZvciB0aGUgZXJyb3IgdHlwZSwgdXNlZCBmb3IgZ2VuZXJpYyBpbml0KCkKKyAgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogQ29kZSB7IGdldCB9CisgIAorICBpbml0KCkKK30KKworZXh0ZW5zaW9uIFRFcnJvciB7CisgIC8vLyBIdW1hbiByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiBlcnJvci4gRGVmYXVsdCBwcm92aWRlZCBmb3IgeW91IGluIHRoZQorICAvLy8gZm9ybWF0IFwoU2VsZi5zZWxmKTogXChlcnJvci5lcnJvckRlc2NyaXB0aW9uKSBcbiBtZXNzYWdlCisgIC8vLyBlZzoKKyAgLy8vCisgIC8vLyAgICAgVEFwcGxpY2F0aW9uRXJyb3IgKDEpOiBJbnZhbGlkIE1lc3NhZ2UgVHlwZQorICAvLy8gICAgIEFuIHVua25vd24gRXJyb3IgaGFzIG9jY3VyZWQuCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgdmFyIG91dCA9ICJcKFNlbGYuc2VsZikgKFwoZXJyb3IudGhyaWZ0RXJyb3JDb2RlKSk6ICIgKyBlcnJvci5kZXNjcmlwdGlvbiArICJcbiIKKyAgICBpZiBsZXQgbWVzc2FnZSA9IG1lc3NhZ2UgeworICAgICAgb3V0ICs9ICJNZXNzYWdlOiBcKG1lc3NhZ2UpIgorICAgIH0KKyAgICByZXR1cm4gb3V0CisgIH0KKworICAvLy8gU2ltcGxlIGRlZmF1bHQgSW5pdGlhbGl6ZXIgZm9yIFRFcnJvcidzCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgZXJyb3I6ICAgRXJyb3JDb2RlIHZhbHVlLiAgRGVmYXVsdDogZGVmYXVsdENhc2UKKyAgLy8vIC0gcGFyYW1ldGVyIG1lc3NhZ2U6IEN1c3RvbSBtZXNzYWdlIHdpdGggZXJyb3IuICBPcHRpb25hbAorICAvLy8KKyAgLy8vIC0gcmV0dXJuczogPCNyZXR1cm4gdmFsdWUgZGVzY3JpcHRpb24jPgorICBwdWJsaWMgaW5pdChlcnJvcjogQ29kZSwgbWVzc2FnZTogU3RyaW5nPyA9IG5pbCkgeworICAgIHNlbGYuaW5pdCgpCisgICAgc2VsZi5lcnJvciA9IGVycm9yCisgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URmlsZUhhbmRsZVRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlSGFuZGxlVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTVmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URmlsZUhhbmRsZVRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDU2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgY2xhc3MgVEZpbGVIYW5kbGVUcmFuc3BvcnQ6IFRUcmFuc3BvcnQgeworICB2YXIgaW5wdXRGaWxlSGFuZGxlOiBGaWxlSGFuZGxlCisgIHZhciBvdXRwdXRGaWxlSGFuZGxlOiBGaWxlSGFuZGxlCisgIAorICBwdWJsaWMgaW5pdChpbnB1dEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUsIG91dHB1dEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUpIHsKKyAgICBzZWxmLmlucHV0RmlsZUhhbmRsZSA9IGlucHV0RmlsZUhhbmRsZQorICAgIHNlbGYub3V0cHV0RmlsZUhhbmRsZSA9IG91dHB1dEZpbGVIYW5kbGUKKyAgfQorICAKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQoZmlsZUhhbmRsZTogRmlsZUhhbmRsZSkgeworICAgIHNlbGYuaW5pdChpbnB1dEZpbGVIYW5kbGU6IGZpbGVIYW5kbGUsIG91dHB1dEZpbGVIYW5kbGU6IGZpbGVIYW5kbGUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgdmFyIGRhdGEgPSBEYXRhKCkKKyAgICB3aGlsZSBkYXRhLmNvdW50IDwgc2l6ZSB7CisgICAgICBsZXQgcmVhZCA9IGlucHV0RmlsZUhhbmRsZS5yZWFkRGF0YShvZkxlbmd0aDogc2l6ZSAtIGRhdGEuY291bnQpCisgICAgICBkYXRhLmFwcGVuZChyZWFkKQorICAgICAgaWYgcmVhZC5jb3VudCA9PSAwIHsKKyAgICAgICAgYnJlYWsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRhdGEKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICBvdXRwdXRGaWxlSGFuZGxlLndyaXRlKGRhdGEpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyMjUzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMTAxIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisjaWYgb3MoT1NYKSB8fCBvcyhpT1MpIHx8IG9zKHdhdGNoT1MpIHx8IG9zKHR2T1MpCisgIGltcG9ydCBEYXJ3aW4KKyNlbHNlaWYgb3MoTGludXgpIHx8IG9zKEZyZWVCU0QpIHx8IG9zKFBTNCkgfHwgb3MoQW5kcm9pZCkKKyAgaW1wb3J0IEdsaWJjCisjZW5kaWYKKworLy8vIFRGaWxlVHJhbnNwb3J0CisvLy8gRm91bmRhdGlvbi1sZXNzIFN3aWZ0IEZpbGUgdHJhbnNwb3J0LgorLy8vIFVzZXMgQyBmb3Blbi9mcmVhZC9md3JpdGUsCisvLy8gcHJvdmlkZWQgYnkgR2xpYmMgaW4gbGludXggYW5kIERhcndpbiBvbiBPU1gvaU9TCitwdWJsaWMgY2xhc3MgVEZpbGVUcmFuc3BvcnQ6IFRUcmFuc3BvcnQgeworICB2YXIgZmlsZUhhbmRsZTogVW5zYWZlTXV0YWJsZVBvaW50ZXI8RklMRT4/ID0gbmlsCisgIAorICBwdWJsaWMgaW5pdCAoZmlsZUhhbmRsZTogVW5zYWZlTXV0YWJsZVBvaW50ZXI8RklMRT4pIHsKKyAgICBzZWxmLmZpbGVIYW5kbGUgPSBmaWxlSGFuZGxlCisgIH0KKworICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChmaWxlbmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHZhciBmaWxlSGFuZGxlOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxGSUxFPj8KKyAgICBmaWxlbmFtZS53aXRoQ1N0cmluZyh7IGNGaWxlbmFtZSBpbgorICAgICAgInJ3Ii53aXRoQ1N0cmluZyh7IGNNb2RlIGluCisgICAgICAgIGZpbGVIYW5kbGUgPSBmb3BlbihjRmlsZW5hbWUsIGNNb2RlKQorICAgICAgfSkKKyAgICB9KQorICAgIGlmIGxldCBmaWxlSGFuZGxlID0gZmlsZUhhbmRsZSB7CisgICAgICBzZWxmLmluaXQoZmlsZUhhbmRsZTogZmlsZUhhbmRsZSkKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbikKKyAgICB9CisgIH0KKyAgCisgIGRlaW5pdCB7CisgICAgZmNsb3NlKHNlbGYuZmlsZUhhbmRsZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgcmVhZCA9IHRyeSBzZWxmLnJlYWQoc2l6ZTogc2l6ZSkKKyAgICAKKyAgICBpZiByZWFkLmNvdW50ICE9IHNpemUgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAuZW5kT2ZGaWxlKQorICAgIH0KKyAgICByZXR1cm4gcmVhZAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIC8vIHNldCB1cCByZWFkIGJ1ZmZlciwgcG9zaXRpb24gMAorICAgIHZhciByZWFkID0gRGF0YShjYXBhY2l0eTogc2l6ZSkKKyAgICB2YXIgcG9zaXRpb24gPSAwCisgICAgCisgICAgLy8gcmVhZCBjaGFyYWN0ZXIgYnVmZmVyCisgICAgdmFyIG5leHRDaGFyOiBVSW50OCA9IDAKKyAgICAKKyAgICAvLyBjb250aW51ZSB1bnRpbCB3ZSd2ZSByZWFkIHNpemUgYnl0ZXMKKyAgICB3aGlsZSByZWFkLmNvdW50IDwgc2l6ZSB7CisgICAgICBpZiBmcmVhZCgmbmV4dENoYXIsIDEsIDEsIHNlbGYuZmlsZUhhbmRsZSkgPT0gMSB7CisgICAgICAgIHJlYWRbcG9zaXRpb25dID0gbmV4dENoYXIKKworICAgICAgICAvLyBJbmNyZW1lbnQgb3V0cHV0IGJ5dGUgcG9pbnRlcgorICAgICAgICBwb3NpdGlvbiArPSAxCisgICAgICAgIAorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAuZW5kT2ZGaWxlKQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVhZAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIGxldCBieXRlc1dyaXR0ZW4gPSBkYXRhLndpdGhVbnNhZmVCeXRlcyB7CisgICAgICBmd3JpdGUoJDAsIDEsIGRhdGEuY291bnQsIHNlbGYuZmlsZUhhbmRsZSkKKyAgICB9CisgICAgaWYgYnl0ZXNXcml0dGVuICE9IGRhdGEuY291bnQgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93bikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEZyYW1lZFRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGcmFtZWRUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzODVkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGcmFtZWRUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBjbGFzcyBURnJhbWVkVHJhbnNwb3J0OiBUVHJhbnNwb3J0IHsKKyAgcHVibGljIHN0YXRpYyBsZXQgaGVhZGVyU2l6ZSAgICA9IDQKKyAgcHVibGljIHN0YXRpYyBsZXQgaW5pdEZyYW1lU2l6ZSA9IDEwMjQKKyAgcHJpdmF0ZSBzdGF0aWMgbGV0IGRlZmF1bHRNYXhMZW5ndGggPSAxNjM4NDAwMAorCisgIHB1YmxpYyB2YXIgdHJhbnNwb3J0OiBUVHJhbnNwb3J0CisgIHByaXZhdGUgdmFyIHdyaXRlQnVmZmVyID0gRGF0YSgpCisKKyAgcHJpdmF0ZSB2YXIgbWF4U2l6ZSAgICAgPSBURnJhbWVkVHJhbnNwb3J0LmRlZmF1bHRNYXhMZW5ndGgKKyAgcHJpdmF0ZSB2YXIgcmVtYWluaW5nQnl0ZXMgPSAwCisKKworICBwdWJsaWMgaW5pdCh0cmFuc3BvcnQ6IFRUcmFuc3BvcnQsIG1heFNpemU6IEludCkgeworICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgICAgc2VsZi5tYXhTaXplID0gbWF4U2l6ZQorICB9CisKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQodHJhbnNwb3J0OiBUVHJhbnNwb3J0KSB7CisgICAgc2VsZi5pbml0KHRyYW5zcG9ydDogdHJhbnNwb3J0LCBtYXhTaXplOiBURnJhbWVkVHJhbnNwb3J0LmRlZmF1bHRNYXhMZW5ndGgpCisgIH0KKworICBmdW5jIHJlYWRIZWFkZXIoKSB0aHJvd3MgeworICAgIGxldCByZWFkID0gdHJ5IHRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IFRGcmFtZWRUcmFuc3BvcnQuaGVhZGVyU2l6ZSkKKyAgICByZW1haW5pbmdCeXRlcyA9IEludChkZWNvZGVGcmFtZVNpemUoZGF0YTogcmVhZCkpCisgIH0KKworICAvLy8gTWFyazogLSBUVHJhbnNwb3J0CisKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB3aGlsZSAocmVtYWluaW5nQnl0ZXMgPD0gMCkgeworICAgICAgICB0cnkgcmVhZEhlYWRlcigpCisgICAgfQorCisgICAgbGV0IHRvUmVhZCA9IG1pbihzaXplLCByZW1haW5pbmdCeXRlcykKKworICAgIGlmIHRvUmVhZCA8IDAgeworICAgICAgICB0cnkgY2xvc2UoKQorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5uZWdhdGl2ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAgIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplIChcKHRvUmVhZCkpISIpCisgICAgfQorCisgICAgaWYgdG9SZWFkID4gbWF4U2l6ZSB7CisgICAgICAgIHRyeSBjbG9zZSgpCisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnNpemVMaW1pdChsaW1pdDogbWF4U2l6ZSwgZ290OiB0b1JlYWQpKQorICAgIH0KKworICAgIHJldHVybiB0cnkgdHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogdG9SZWFkKQorICB9CisKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIC8vIGNvcHkgYnVmZmVyIGFuZCByZXNldAorICAgIGxldCBidWZmID0gd3JpdGVCdWZmZXIKKyAgICB3cml0ZUJ1ZmZlciA9IERhdGEoKQorCisgICAgaWYgYnVmZi5jb3VudCAtIFRGcmFtZWRUcmFuc3BvcnQuaGVhZGVyU2l6ZSA8IDAgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93bikKKyAgICB9CisKKyAgICBsZXQgZnJhbWVTaXplID0gZW5jb2RlRnJhbWVTaXplKHNpemU6IFVJbnQzMihidWZmLmNvdW50KSkKKworICAgIHRyeSB0cmFuc3BvcnQud3JpdGUoZGF0YTogZnJhbWVTaXplKQorICAgIHRyeSB0cmFuc3BvcnQud3JpdGUoZGF0YTogYnVmZikKKyAgICB0cnkgdHJhbnNwb3J0LmZsdXNoKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgd3JpdGVCdWZmZXIuYXBwZW5kKGRhdGEpCisgIH0KKworCisKKyAgcHJpdmF0ZSBmdW5jIGVuY29kZUZyYW1lU2l6ZShzaXplOiBVSW50MzIpIC0+IERhdGEgeworICAgIHZhciBkYXRhID0gRGF0YSgpCisgICAgZGF0YS5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAoc2l6ZSA+PiAyNCkpXSkpCisgICAgZGF0YS5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAoc2l6ZSA+PiAxNikpXSkpCisgICAgZGF0YS5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAoc2l6ZSA+PiA4KSldKSkKKyAgICBkYXRhLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmIChzaXplKSldKSkKKworICAgIHJldHVybiBkYXRhCisgIH0KKworICBwcml2YXRlIGZ1bmMgZGVjb2RlRnJhbWVTaXplKGRhdGE6IERhdGEpIC0+IFVJbnQzMiB7CisgICAgdmFyIHNpemU6IFVJbnQzMgorICAgIHNpemUgID0gKFVJbnQzMihkYXRhWzBdICYgMHhmZikgPDwgMjQpCisgICAgc2l6ZSB8PSAoVUludDMyKGRhdGFbMV0gJiAweGZmKSA8PCAxNikKKyAgICBzaXplIHw9IChVSW50MzIoZGF0YVsyXSAmIDB4ZmYpIDw8ICA4KQorICAgIHNpemUgfD0gKFVJbnQzMihkYXRhWzNdICYgMHhmZikpCisgICAgcmV0dXJuIHNpemUKKyAgfQorCisgIHB1YmxpYyBmdW5jIGNsb3NlKCkgdGhyb3dzIHsKKyAgICB0cnkgdHJhbnNwb3J0LmNsb3NlKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIG9wZW4oKSB0aHJvd3MgeworICAgIHRyeSB0cmFuc3BvcnQub3BlbigpCisgIH0KKworICBwdWJsaWMgZnVuYyBpc09wZW4oKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgcmV0dXJuIHRyeSB0cmFuc3BvcnQuaXNPcGVuKCkKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEhUVFBTZXNzaW9uVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEhUVFBTZXNzaW9uVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMGFmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9USFRUUFNlc3Npb25UcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwxODQgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgRGlzcGF0Y2gKKworCitwdWJsaWMgY2xhc3MgVEhUVFBTZXNzaW9uVHJhbnNwb3J0OiBUQXN5bmNUcmFuc3BvcnQgeworICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRBc3luY1RyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YmxpYyB2YXIgcmVzcG9uc2VWYWxpZGF0ZTogKChIVFRQVVJMUmVzcG9uc2U/LCBEYXRhPykgdGhyb3dzIC0+IFZvaWQpPworICAgIAorICAgIHZhciBzZXNzaW9uOiBVUkxTZXNzaW9uCisgICAgdmFyIHVybDogVVJMCisgICAgCisgICAgcHVibGljIGNsYXNzIGZ1bmMgc2V0dXBEZWZhdWx0c0ZvclNlc3Npb25Db25maWd1cmF0aW9uKF8gY29uZmlnOiBVUkxTZXNzaW9uQ29uZmlndXJhdGlvbiwgd2l0aFByb3RvY29sTmFtZSBwcm90b2NvbE5hbWU6IFN0cmluZz8pIHsKKyAgICAgIHZhciB0aHJpZnRDb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCIKKyAgICAgIAorICAgICAgaWYgbGV0IHByb3RvY29sTmFtZSA9IHByb3RvY29sTmFtZSB7CisgICAgICAgIHRocmlmdENvbnRlbnRUeXBlICs9ICI7IHA9XChwcm90b2NvbE5hbWUpIgorICAgICAgfQorICAgICAgCisgICAgICBjb25maWcucmVxdWVzdENhY2hlUG9saWN5ID0gLnJlbG9hZElnbm9yaW5nTG9jYWxDYWNoZURhdGEKKyAgICAgIGNvbmZpZy51cmxDYWNoZSA9IG5pbAorICAgICAgCisgICAgICBjb25maWcuaHR0cFNob3VsZFVzZVBpcGVsaW5pbmcgID0gdHJ1ZQorICAgICAgY29uZmlnLmh0dHBTaG91bGRTZXRDb29raWVzICAgICA9IHRydWUKKyAgICAgIGNvbmZpZy5odHRwQWRkaXRpb25hbEhlYWRlcnMgICAgPSBbIkNvbnRlbnQtVHlwZSI6IHRocmlmdENvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWNjZXB0IjogdGhyaWZ0Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2VyLUFnZW50IjogIlRocmlmdC9Td2lmdCAoU2Vzc2lvbikiXQorICAgICAgCisgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIGluaXQoc2Vzc2lvbjogVVJMU2Vzc2lvbiwgdXJsOiBVUkwpIHsKKyAgICAgIHNlbGYuc2Vzc2lvbiA9IHNlc3Npb24KKyAgICAgIHNlbGYudXJsID0gdXJsCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIG5ld1RyYW5zcG9ydCgpIC0+IFRIVFRQU2Vzc2lvblRyYW5zcG9ydCB7CisgICAgICByZXR1cm4gVEhUVFBTZXNzaW9uVHJhbnNwb3J0KGZhY3Rvcnk6IHNlbGYpCisgICAgfQorICAgIAorICAgIGZ1bmMgdmFsaWRhdGVSZXNwb25zZShfIHJlc3BvbnNlOiBIVFRQVVJMUmVzcG9uc2U/LCBkYXRhOiBEYXRhPykgdGhyb3dzIHsKKyAgICAgIHRyeSByZXNwb25zZVZhbGlkYXRlPyhyZXNwb25zZSwgZGF0YSkKKyAgICB9CisgICAgCisgICAgZnVuYyB0YXNrV2l0aFJlcXVlc3QoXyByZXF1ZXN0OiBVUkxSZXF1ZXN0LCBjb21wbGV0aW9uSGFuZGxlcjogQGVzY2FwaW5nIChEYXRhPywgVVJMUmVzcG9uc2U/LCBFcnJvcj8pIC0+ICgpKSB0aHJvd3MgLT4gVVJMU2Vzc2lvblRhc2sgeworICAgICAgCisgICAgICBsZXQgbmV3VGFzazogVVJMU2Vzc2lvblRhc2s/ID0gc2Vzc2lvbi5kYXRhVGFzayh3aXRoOiByZXF1ZXN0LCBjb21wbGV0aW9uSGFuZGxlcjogY29tcGxldGlvbkhhbmRsZXIpCisgICAgICBpZiBsZXQgbmV3VGFzayA9IG5ld1Rhc2sgeworICAgICAgICByZXR1cm4gbmV3VGFzaworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93biwgbWVzc2FnZTogIkZhaWxlZCB0byBjcmVhdGUgc2Vzc2lvbiBkYXRhIHRhc2siKQorICAgICAgfQorICAgIH0gICAgCisgIH0KKyAgCisgIHZhciBmYWN0b3J5OiBGYWN0b3J5CisgIHZhciByZXF1ZXN0RGF0YSA9IERhdGEoKQorICB2YXIgcmVzcG9uc2VEYXRhID0gRGF0YSgpCisgIHZhciByZXNwb25zZURhdGFPZmZzZXQ6IEludCA9IDAKKyAgCisgIGluaXQoZmFjdG9yeTogRmFjdG9yeSkgeworICAgIHNlbGYuZmFjdG9yeSA9IGZhY3RvcnkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgcmVhZCA9IHRyeSBzZWxmLnJlYWQoc2l6ZTogc2l6ZSkKKyAgICBpZiByZWFkLmNvdW50ICE9IHNpemUgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAuZW5kT2ZGaWxlKQorICAgIH0KKyAgICByZXR1cm4gcmVhZAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCBhdmFpbCA9IHJlc3BvbnNlRGF0YS5jb3VudCAtIHJlc3BvbnNlRGF0YU9mZnNldAorICAgIGxldCAoc3RhcnQsIHN0b3ApID0gKHJlc3BvbnNlRGF0YU9mZnNldCwgcmVzcG9uc2VEYXRhT2Zmc2V0ICsgbWluKHNpemUsIGF2YWlsKSkKKyAgICBsZXQgcmVhZCA9IHJlc3BvbnNlRGF0YS5zdWJkYXRhKGluOiBzdGFydC4uPHN0b3ApCisgICAgcmVzcG9uc2VEYXRhT2Zmc2V0ICs9IHJlYWQuY291bnQKKyAgICByZXR1cm4gcmVhZAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHJlcXVlc3REYXRhLmFwcGVuZChkYXRhKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaChfIGNvbXBsZXRlZDogQGVzY2FwaW5nIChUQXN5bmNUcmFuc3BvcnQsIEVycm9yPykgLT4gVm9pZCkgeworICAgIHZhciBlcnJvcjogRXJyb3I/CisgICAgdmFyIHRhc2s6IFVSTFNlc3Npb25UYXNrPworICAgIAorICAgIHZhciByZXF1ZXN0ID0gVVJMUmVxdWVzdCh1cmw6IGZhY3RvcnkudXJsKQorICAgIHJlcXVlc3QuaHR0cE1ldGhvZCA9ICJQT1NUIgorICAgIHJlcXVlc3QuaHR0cEJvZHkgPSAgcmVxdWVzdERhdGEKKworICAgIHJlcXVlc3REYXRhID0gRGF0YSgpCisKKyAgICBkbyB7CisgICAgICB0YXNrID0gdHJ5IGZhY3RvcnkudGFza1dpdGhSZXF1ZXN0KHJlcXVlc3QsIGNvbXBsZXRpb25IYW5kbGVyOiB7IChkYXRhLCByZXNwb25zZSwgdGFza0Vycm9yKSBpbgorCisgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aXRoIHRoZSBuZXR3b3JrCisgICAgICAgIGlmIHRhc2tFcnJvciAhPSBuaWwgeworICAgICAgICAgICAgZXJyb3IgPSBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC50aW1lZE91dCkKKyAgICAgICAgICAgIGNvbXBsZXRlZChzZWxmLCBlcnJvcikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgcmVzcG9uc2UgdHlwZQorICAgICAgICBpZiB0YXNrRXJyb3IgPT0gbmlsICYmICEocmVzcG9uc2UgaXMgSFRUUFVSTFJlc3BvbnNlKSB7CisgICAgICAgICAgICBlcnJvciA9IFRIVFRQVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5pbnZhbGlkUmVzcG9uc2UpCisgICAgICAgICAgICBjb21wbGV0ZWQoc2VsZiwgZXJyb3IpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQ2hlY2sgc3RhdHVzIGNvZGUKKyAgICAgICAgaWYgbGV0IGh0dHBSZXNwb25zZSA9IHJlc3BvbnNlIGFzPyBIVFRQVVJMUmVzcG9uc2UgeworICAgICAgICAgIGlmIHRhc2tFcnJvciA9PSBuaWwgJiYgaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUgIT0gMjAwIHsKKyAgICAgICAgICAgIGlmIGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlID09IDQwMSB7CisgICAgICAgICAgICAgIGVycm9yID0gVEhUVFBUcmFuc3BvcnRFcnJvcihlcnJvcjogLmF1dGhlbnRpY2F0aW9uKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZXJyb3IgPSBUSFRUUFRyYW5zcG9ydEVycm9yKGVycm9yOiAuaW52YWxpZFN0YXR1cyhzdGF0dXNDb2RlOiBodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIC8vIEFsbG93IGZhY3RvcnkgdG8gY2hlY2sKKyAgICAgICAgICBpZiBlcnJvciAhPSBuaWwgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICB0cnkgc2VsZi5mYWN0b3J5LnZhbGlkYXRlUmVzcG9uc2UoaHR0cFJlc3BvbnNlLCBkYXRhOiBkYXRhKQorICAgICAgICAgICAgfSBjYXRjaCBsZXQgdmFsaWRhdGVFcnJvciB7CisgICAgICAgICAgICAgIGVycm9yID0gdmFsaWRhdGVFcnJvcgorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBzZWxmLnJlc3BvbnNlRGF0YU9mZnNldCA9IDAKKyAgICAgICAgICBpZiBlcnJvciAhPSBuaWwgeworICAgICAgICAgICAgc2VsZi5yZXNwb25zZURhdGEgPSBEYXRhKCkKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi5yZXNwb25zZURhdGEgPSBkYXRhID8/IERhdGEoKQorICAgICAgICAgIH0KKyAgICAgICAgICBjb21wbGV0ZWQoc2VsZiwgZXJyb3IpCisgICAgICAgIH0KKyAgICAgIH0pCisgICAgICAKKyAgICB9IGNhdGNoIGxldCB0YXNrRXJyb3IgeworICAgICAgZXJyb3IgPSB0YXNrRXJyb3IKKyAgICB9CisgICAgCisgICAgaWYgbGV0IGVycm9yID0gZXJyb3IsIHRhc2sgPT0gbmlsIHsKKyAgICAgIGNvbXBsZXRlZChzZWxmLCBlcnJvcikKKyAgICB9CisgICAgdGFzaz8ucmVzdW1lKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICBsZXQgY29tcGxldGVkID0gRGlzcGF0Y2hTZW1hcGhvcmUodmFsdWU6IDApCisgICAgdmFyIGludGVybmFsRXJyb3I6IEVycm9yPworICAgIAorICAgIGZsdXNoKCkgeyBfLCBlcnJvciBpbgorICAgICAgaW50ZXJuYWxFcnJvciA9IGVycm9yCisgICAgICBjb21wbGV0ZWQuc2lnbmFsKCkKKyAgICB9CisgICAgCisgICAgXyA9IGNvbXBsZXRlZC53YWl0KHRpbWVvdXQ6IERpc3BhdGNoVGltZS5kaXN0YW50RnV0dXJlKQorICAgIAorICAgIGlmIGxldCBlcnJvciA9IGludGVybmFsRXJyb3IgeworICAgICAgdGhyb3cgZXJyb3IKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RMaXN0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVExpc3Quc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzOWQxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RMaXN0LnN3aWZ0CkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3B1YmxpYyBzdHJ1Y3QgVExpc3Q8RWxlbWVudCA6IFRTZXJpYWxpemFibGU+IDogUmFuZG9tQWNjZXNzQ29sbGVjdGlvbiwgTXV0YWJsZUNvbGxlY3Rpb24sIEV4cHJlc3NpYmxlQnlBcnJheUxpdGVyYWwsIFRTZXJpYWxpemFibGUsIEhhc2hhYmxlIHsKKyAgcHVibGljIHR5cGVhbGlhcyBTdG9yYWdlID0gQXJyYXk8RWxlbWVudD4KKyAgcHVibGljIHR5cGVhbGlhcyBJbmRpY2VzID0gU3RvcmFnZS5JbmRpY2VzCisKKyAgaW50ZXJuYWwgdmFyIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgcHVibGljIGluaXQoKSB7IH0KKyAgcHVibGljIGluaXQoYXJyYXlMaXRlcmFsIGVsZW1lbnRzOiBFbGVtZW50Li4uKSB7CisgICAgc2VsZi5zdG9yYWdlID0gU3RvcmFnZShlbGVtZW50cykKKyAgfQorICBwdWJsaWMgaW5pdDxTb3VyY2UgOiBTZXF1ZW5jZT4oXyBzZXF1ZW5jZTogU291cmNlKSB3aGVyZSBTb3VyY2UuSXRlcmF0b3IuRWxlbWVudCA9PSBFbGVtZW50IHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZShzZXF1ZW5jZSkKKyAgfQorCisgIC8vLyBNYXJrOiBIYXNoYWJsZQorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZSA6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIGZvciBlbGVtZW50IGluIHN0b3JhZ2UgeworICAgICAgcmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrIGVsZW1lbnQuaGFzaFZhbHVlCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgLy8vIE1hcms6IFRTZXJpYWxpemFibGUKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIC5saXN0IH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUTGlzdCB7CisgICAgbGV0IChlbGVtZW50VHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZExpc3RCZWdpbigpCisgICAgaWYgZWxlbWVudFR5cGUgIT0gRWxlbWVudC50aHJpZnRUeXBlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiAudW5leHBlY3RlZFR5cGUodHlwZTogZWxlbWVudFR5cGUpKQorICAgIH0KKyAgICB2YXIgbGlzdCA9IFRMaXN0KCkKKyAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICBsZXQgZWxlbWVudCA9IHRyeSBFbGVtZW50LnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBsaXN0LnN0b3JhZ2UuYXBwZW5kKGVsZW1lbnQpCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkTGlzdEVuZCgpCisgICAgcmV0dXJuIGxpc3QKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IEVsZW1lbnQudGhyaWZ0VHlwZSwgc2l6ZTogSW50MzIoc2VsZi5jb3VudCkpCisgICAgZm9yIGVsZW1lbnQgaW4gc2VsZi5zdG9yYWdlIHsKKyAgICAgIHRyeSBFbGVtZW50LndyaXRlKGVsZW1lbnQsIHRvOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlTGlzdEVuZCgpCisgIH0KKworICAvLy8gTWFyazogTXV0YWJsZUNvbGxlY3Rpb24KKyAgCisgIHB1YmxpYyB0eXBlYWxpYXMgU3ViU2VxdWVuY2UgPSBTdG9yYWdlLlN1YlNlcXVlbmNlCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXggPSBTdG9yYWdlLkluZGV4CisgIAorICBwdWJsaWMgc3Vic2NyaXB0KHBvc2l0aW9uOiBTdG9yYWdlLkluZGV4KSAtPiBFbGVtZW50IHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgICAgfQorICAgIHNldCB7CisgICAgICBzdG9yYWdlW3Bvc2l0aW9uXSA9IG5ld1ZhbHVlCisgICAgfQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0KHJhbmdlOiBSYW5nZTxJbmRleD4pIC0+IFN1YlNlcXVlbmNlIHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIHN0b3JhZ2VbcmFuZ2VdCisgICAgfQorICAgIHNldCB7CisgICAgICBzdG9yYWdlW3JhbmdlXSA9IG5ld1ZhbHVlCisgICAgfQorICB9CisgIAorICBwdWJsaWMgdmFyIHN0YXJ0SW5kZXg6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4CisgIH0KKyAgcHVibGljIHZhciBlbmRJbmRleDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmVuZEluZGV4CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZvcm1JbmRleChhZnRlciBpOiBpbm91dCBJbmRleCkgeworICAgIHN0b3JhZ2UuZm9ybUluZGV4KGFmdGVyOiAmaSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZm9ybUluZGV4KGJlZm9yZSBpOiBpbm91dCBJbnQpIHsKKyAgICBzdG9yYWdlLmZvcm1JbmRleChiZWZvcmU6ICZpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleChhZnRlciBpOiBJbmRleCkgLT4gSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGFmdGVyOiBpKQorICB9CisKKyAgcHVibGljIGZ1bmMgaW5kZXgoYmVmb3JlIGk6IEludCkgLT4gSW50IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChiZWZvcmU6IGkpCisgIH0KKworfQorCitleHRlbnNpb24gVExpc3QgOiBSYW5nZVJlcGxhY2VhYmxlQ29sbGVjdGlvbiB7CisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlcGxhY2VTdWJyYW5nZTxDOiBDb2xsZWN0aW9uPihfIHN1YnJhbmdlOiBSYW5nZTxJbmRleD4sIHdpdGggbmV3RWxlbWVudHM6IEMpCisgICAgd2hlcmUgQy5JdGVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQgeworICAgIHN0b3JhZ2UucmVwbGFjZVN1YnJhbmdlKHN1YnJhbmdlLCB3aXRoOiBuZXdFbGVtZW50cykKKyAgfQorfQorCitleHRlbnNpb24gVExpc3QgOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSB7CisgIAorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIAorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworcHVibGljIGZ1bmMgPT08RWxlbWVudD4obGhzOiBUTGlzdDxFbGVtZW50PiwgcmhzOiBUTGlzdDxFbGVtZW50PikgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuc3RvcmFnZS5lbGVtZW50c0VxdWFsKHJocy5zdG9yYWdlKSB7ICQwID09ICQxIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RNYXAuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UTWFwLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ODAzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UTWFwLnN3aWZ0CkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3B1YmxpYyBzdHJ1Y3QgVE1hcDxLZXkgOiBUU2VyaWFsaXphYmxlICYgSGFzaGFibGUsIFZhbHVlIDogVFNlcmlhbGl6YWJsZT46IENvbGxlY3Rpb24sIEV4cHJlc3NpYmxlQnlEaWN0aW9uYXJ5TGl0ZXJhbCwgSGFzaGFibGUsIFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgdHlwZWFsaWFzIFN0b3JhZ2UgPSBEaWN0aW9uYXJ5PEtleSwgVmFsdWU+CisgIHB1YmxpYyB0eXBlYWxpYXMgRWxlbWVudCA9IFN0b3JhZ2UuRWxlbWVudAorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4RGlzdGFuY2UgPSBTdG9yYWdlLkluZGV4RGlzdGFuY2UKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRpY2VzID0gU3RvcmFnZS5JbmRpY2VzCisgIHB1YmxpYyB0eXBlYWxpYXMgU3ViU2VxdWVuY2UgPSBTdG9yYWdlLlN1YlNlcXVlbmNlCisgIGludGVybmFsIHZhciBzdG9yYWdlID0gU3RvcmFnZSgpCisgIAorICAvLy8gTWFyazogQmUgTGlrZSBEaWN0aW9uYXJ5CisgIAorICBwdWJsaWMgZnVuYyBpbmRleEZvcktleShfIGtleTogS2V5KSAtPiBJbmRleD8geworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGZvcktleToga2V5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyB1cGRhdGVWYWx1ZShfIHZhbHVlOiBWYWx1ZSwgZm9yS2V5IGtleTogS2V5KSAtPiBWYWx1ZT8geworICAgIHJldHVybiB1cGRhdGVWYWx1ZSh2YWx1ZSwgZm9yS2V5OiBrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUF0SW5kZXgoXyBpbmRleDogRGljdGlvbmFyeUluZGV4PEtleSwgVmFsdWU+KSAtPiAoS2V5LCBWYWx1ZSkgeworICAgIHJldHVybiByZW1vdmVBdEluZGV4KGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVWYWx1ZUZvcktleShfIGtleTogS2V5KSAtPiBWYWx1ZT8geworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZVZhbHVlKGZvcktleToga2V5KQorICB9CisgIAorICBwdWJsaWMgaW5pdChtaW5pbXVtQ2FwYWNpdHk6IEludCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKG1pbmltdW1DYXBhY2l0eTogbWluaW11bUNhcGFjaXR5KQorICB9CisgIAorICAvLy8gaW5pdCBmcm9tIERpY3Rpb25hcnk8SyxWPgorICBwdWJsaWMgaW5pdChfIGRpY3Q6IFtLZXk6IFZhbHVlXSkgeworICAgIHN0b3JhZ2UgPSBkaWN0CisgIH0KKworICAvLy8gcmVhZCBvbmx5IGFjY2VzcyB0byBzdG9yYWdlIGlmIG5lZWRlZCBhcyBEaWN0aW9uYXJ5PEssVj4KKyAgcHVibGljIHZhciBkaWN0aW9uYXJ5OiBbS2V5OiBWYWx1ZV0geworICAgIHJldHVybiBzdG9yYWdlCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQgKGtleTogS2V5KSAtPiBWYWx1ZT8geworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtrZXldCisgICAgfQorICAgIHNldCB7CisgICAgICBzdG9yYWdlW2tleV0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorICAKKyAgLy8vIE1hcms6IENvbGxlY3Rpb24KKyAgCisgIHB1YmxpYyB2YXIgaW5kaWNlczogSW5kaWNlcyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kaWNlcworICB9CisgIAorICBwdWJsaWMgZnVuYyBkaXN0YW5jZShmcm9tIHN0YXJ0OiBJbmRleCwgdG8gZW5kOiBJbmRleCkgLT4gSW5kZXhEaXN0YW5jZSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGlzdGFuY2UoZnJvbTogc3RhcnQsIHRvOiBlbmQpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KF8gaTogSW5kZXgsIG9mZnNldEJ5IG46IEluZGV4RGlzdGFuY2UpIC0+IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChpLCBvZmZzZXRCeTogbikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXgoXyBpOiBJbmRleCwgb2Zmc2V0QnkgbjogSW5kZXhEaXN0YW5jZSwgbGltaXRlZEJ5IGxpbWl0OiBJbmRleCkgLT4gSW5kZXg/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChpLCBvZmZzZXRCeTogbiwgbGltaXRlZEJ5OiBsaW1pdCkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdChwb3NpdGlvbjogSW5kZXgpIC0+IEVsZW1lbnQgeworICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICB9CisgIAorICAvLy8gTWFyazogSW5kZXhhYmxlQmFzZQorICAKKyAgcHVibGljIHZhciBzdGFydEluZGV4OiBJbmRleCB7IHJldHVybiBzdG9yYWdlLnN0YXJ0SW5kZXggfQorICBwdWJsaWMgdmFyIGVuZEluZGV4OiBJbmRleCB7IHJldHVybiBzdG9yYWdlLmVuZEluZGV4IH0KKyAgcHVibGljIGZ1bmMgaW5kZXgoYWZ0ZXIgaTogSW5kZXgpIC0+IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChhZnRlcjogaSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZm9ybUluZGV4KGFmdGVyIGk6IGlub3V0IEluZGV4KSB7CisgICAgc3RvcmFnZS5mb3JtSW5kZXgoYWZ0ZXI6ICZpKQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0KGJvdW5kczogUmFuZ2U8SW5kZXg+KSAtPiBTdWJTZXF1ZW5jZSB7CisgICAgcmV0dXJuIHN0b3JhZ2VbYm91bmRzXQorICB9CisgIAorICAvLy8gTWFyazogRGljdGlvbmFyeUxpdGVyYWxDb252ZXJ0aWJsZQorICAKKyAgcHVibGljIGluaXQoZGljdGlvbmFyeUxpdGVyYWwgZWxlbWVudHM6IChLZXksIFZhbHVlKS4uLikgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIGVsZW1lbnRzIHsKKyAgICAgIHN0b3JhZ2Vba2V5XSA9IHZhbHVlCisgICAgfQorICB9CisKKyAgLy8vIE1hcms6IEhhc2hhYmxlCisgIAorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZTogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyBrZXkuaGFzaFZhbHVlCisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisgdmFsdWUuaGFzaFZhbHVlCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgLy8vIE1hcms6IFRTZXJpYWxpemFibGUKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAubWFwIH0KKyAgcHVibGljIGluaXQoKSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICB9CisgICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVE1hcCB7CisKKyAgICBsZXQgKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZE1hcEJlZ2luKCkKKyAgICBpZiBzaXplID4gMCB7CisgICAgICBpZiBrZXlUeXBlICE9IEtleS50aHJpZnRUeXBlIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlVuZXhwZWN0ZWQgVE1hcCBLZXkgVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkRXJyb3I6IC51bmV4cGVjdGVkVHlwZSh0eXBlOiBrZXlUeXBlKSkKKyAgICAgIH0KKyAgICAgIGlmIHZhbHVlVHlwZSAhPSBWYWx1ZS50aHJpZnRUeXBlIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlVuZXhwZWN0ZWQgVE1hcCBWYWx1ZSBUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLnVuZXhwZWN0ZWRUeXBlKHR5cGU6IHZhbHVlVHlwZSkpCisgICAgICB9CisgICAgfQorCisgICAgdmFyIG1hcCA9IFRNYXAoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBrZXkgPSB0cnkgS2V5LnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBsZXQgdmFsdWUgPSB0cnkgVmFsdWUucmVhZChmcm9tOiBwcm90bykKKyAgICAgIG1hcC5zdG9yYWdlW2tleV0gPSB2YWx1ZQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZE1hcEVuZCgpCisgICAgcmV0dXJuIG1hcAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZU1hcEJlZ2luKGtleVR5cGU6IEtleS50aHJpZnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogVmFsdWUudGhyaWZ0VHlwZSwgc2l6ZTogSW50MzIoc2VsZi5jb3VudCkpCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiBzZWxmLnN0b3JhZ2UgeworICAgICAgdHJ5IEtleS53cml0ZShrZXksIHRvOiBwcm90bykKKyAgICAgIHRyeSBWYWx1ZS53cml0ZSh2YWx1ZSwgdG86IHByb3RvKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVNYXBFbmQoKQorICB9Cit9CisKKy8vLyBNYXJrOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZQorCitleHRlbnNpb24gVE1hcCA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCisvLy8gTWFyazogRXF1YXRhYmxlCisKK3B1YmxpYyBmdW5jID09PEtleSwgVmFsdWU+KGxoczogVE1hcDxLZXksVmFsdWU+LCByaHM6IFRNYXA8S2V5LCBWYWx1ZT4pIC0+IEJvb2wgeworICBpZiBsaHMuY291bnQgIT0gcmhzLmNvdW50IHsKKyAgICByZXR1cm4gZmFsc2UKKyAgfQorICByZXR1cm4gbGhzLnN0b3JhZ2UuZWxlbWVudHNFcXVhbChyaHMuc3RvcmFnZSkgeyAkMC5rZXkgPT0gJDEua2V5ICYmICQwLnZhbHVlID09ICQxLnZhbHVlIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RNZW1vcnlCdWZmZXJUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UTWVtb3J5QnVmZmVyVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNThiNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UTWVtb3J5QnVmZmVyVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQgOiBUVHJhbnNwb3J0IHsKKyAgcHVibGljIHByaXZhdGUoc2V0KSB2YXIgcmVhZEJ1ZmZlciA9IERhdGEoKQorICBwdWJsaWMgcHJpdmF0ZShzZXQpIHZhciB3cml0ZUJ1ZmZlciA9IERhdGEoKQorICAKKyAgcHVibGljIHByaXZhdGUoc2V0KSB2YXIgcG9zaXRpb24gPSAwCisKKyAgcHVibGljIHZhciBieXRlc1JlbWFpbmluZ0luQnVmZmVyOiBJbnQgeworICAgIHJldHVybiByZWFkQnVmZmVyLmNvdW50IC0gcG9zaXRpb24KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgY29uc3VtZUJ1ZmZlcihzaXplOiBJbnQpIHsKKyAgICBwb3NpdGlvbiArPSBzaXplCisgIH0KKyAgcHVibGljIGZ1bmMgY2xlYXIoKSB7CisgICAgcmVhZEJ1ZmZlciA9IERhdGEoKQorICAgIHdyaXRlQnVmZmVyID0gRGF0YSgpCisgIH0KKyAgCisgIAorICBwcml2YXRlIHZhciBmbHVzaEhhbmRsZXI6ICgoVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCwgRGF0YSkgLT4gKCkpPworICAKKyAgcHVibGljIGluaXQoZmx1c2hIYW5kbGVyOiAoKFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQsIERhdGEpIC0+ICgpKT8gPSBuaWwpIHsKKyAgICBzZWxmLmZsdXNoSGFuZGxlciA9IGZsdXNoSGFuZGxlcgorICB9CisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChyZWFkQnVmZmVyOiBEYXRhLCBmbHVzaEhhbmRsZXI6ICgoVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCwgRGF0YSkgLT4gKCkpPyA9IG5pbCkgeworICAgIHNlbGYuaW5pdCgpCisgICAgc2VsZi5yZWFkQnVmZmVyID0gcmVhZEJ1ZmZlcgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZXNldChyZWFkQnVmZmVyOiBEYXRhID0gRGF0YSgpLCB3cml0ZUJ1ZmZlcjogRGF0YSA9IERhdGEoKSkgeworICAgIHNlbGYucmVhZEJ1ZmZlciA9IHJlYWRCdWZmZXIKKyAgICBzZWxmLndyaXRlQnVmZmVyID0gd3JpdGVCdWZmZXIKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgYW1vdW50VG9SZWFkID0gbWluKGJ5dGVzUmVtYWluaW5nSW5CdWZmZXIsIHNpemUpCisgICAgaWYgYW1vdW50VG9SZWFkID4gMCB7CisgICAgICBsZXQgcmV0ID0gcmVhZEJ1ZmZlci5zdWJkYXRhKGluOiBSYW5nZSh1bmNoZWNrZWRCb3VuZHM6IChsb3dlcjogcG9zaXRpb24sIHVwcGVyOiBwb3NpdGlvbiArIGFtb3VudFRvUmVhZCkpKQorICAgICAgcG9zaXRpb24gKz0gcmV0LmNvdW50CisgICAgICByZXR1cm4gcmV0CisgICAgfQorICAgIHJldHVybiBEYXRhKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICB3cml0ZUJ1ZmZlci5hcHBlbmQoZGF0YSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIGZsdXNoSGFuZGxlcj8oc2VsZiwgd3JpdGVCdWZmZXIpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RNdWx0aXBsZXhlZFByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVE11bHRpcGxleGVkUHJvdG9jb2wuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhOGQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNdWx0aXBsZXhlZFByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsNDcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3B1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbDxQcm90b2NvbDogVFByb3RvY29sPjogVFdyYXBwZWRQcm90b2NvbDxQcm90b2NvbD4geworICBwdWJsaWMgbGV0IHNlcGFyYXRvciA9ICI6IgorCisgIHB1YmxpYyB2YXIgc2VydmljZU5hbWUgPSAiIgorICAKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQob24gdHJhbnNwb3J0OiBUVHJhbnNwb3J0LCBzZXJ2aWNlTmFtZTogU3RyaW5nKSB7CisgICAgc2VsZi5pbml0KG9uOiB0cmFuc3BvcnQpCisgICAgc2VsZi5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lICAgIAorICB9CisKKyAgb3ZlcnJpZGUgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MgeworICAgIHN3aXRjaCBtZXNzYWdlVHlwZSB7CisgICAgY2FzZSAuY2FsbCwgLm9uZXdheToKKyAgICAgIHZhciBzZXJ2aWNlRnVuY3Rpb24gPSBzZXJ2aWNlTmFtZQorICAgICAgc2VydmljZUZ1bmN0aW9uICs9IHNlcnZpY2VOYW1lID09ICIiID8gIiIgOiBzZXBhcmF0b3IKKyAgICAgIHNlcnZpY2VGdW5jdGlvbiArPSBuYW1lCisgICAgICByZXR1cm4gdHJ5IHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IHNlcnZpY2VGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQpCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiB0cnkgc3VwZXIud3JpdGVNZXNzYWdlQmVnaW4obmFtZTogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQpCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UUHJvY2Vzc29yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb2Nlc3Nvci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmYyMjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb2Nlc3Nvci5zd2lmdApAQCAtMCwwICsxLDI5IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3B1YmxpYyB0eXBlYWxpYXMgVFByb2Nlc3Nvck1lc3NhZ2VIYW5kbGVyPFQ+ID0gKEludCwgVFByb3RvY29sLCBUUHJvdG9jb2wsIFQpIC0+IFZvaWQKKworcHVibGljIHByb3RvY29sIFRQcm9jZXNzb3IgeworICBhc3NvY2lhdGVkdHlwZSBTZXJ2aWNlCisgIHZhciBzZXJ2aWNlOiBTZXJ2aWNlIHsgZ2V0IHNldCB9CisgIGZ1bmMgcHJvY2VzcyhvbiBpblByb3RvY29sOiBUUHJvdG9jb2wsIG91dFByb3RvY29sOiBUUHJvdG9jb2wpIHRocm93cworICBpbml0KHNlcnZpY2U6IFNlcnZpY2UpCit9CisKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTExZTcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsMTgzIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorLy8KKworcHVibGljIGVudW0gVE1lc3NhZ2VUeXBlOiBJbnQzMiB7CisgIGNhc2UgY2FsbCA9IDEKKyAgY2FzZSByZXBseSA9IDIKKyAgY2FzZSBleGNlcHRpb24gPSAzCisgIGNhc2Ugb25ld2F5ID0gNAorfQorCitwdWJsaWMgZW51bSBUVHlwZTogSW50MzIgeworICBjYXNlIHN0b3AgICAgID0gMAorICBjYXNlIHZvaWQgICAgID0gMQorICBjYXNlIGJvb2wgICAgID0gMgorICBjYXNlIGk4ICAgICAgID0gMworICBjYXNlIGRvdWJsZSAgID0gNAorICBjYXNlIGkxNiAgICAgID0gNgorICBjYXNlIGkzMiAgICAgID0gOAorICBjYXNlIGk2NCAgICAgID0gMTAKKyAgY2FzZSBzdHJpbmcgICA9IDExCisgIGNhc2UgYHN0cnVjdGAgPSAxMgorICBjYXNlIG1hcCAgICAgID0gMTMKKyAgY2FzZSBzZXQgICAgICA9IDE0CisgIGNhc2UgbGlzdCAgICAgPSAxNQorICBjYXNlIHV0ZjggICAgID0gMTYKKyAgY2FzZSB1dGYxNiAgICA9IDE3Cit9CisKK3B1YmxpYyBwcm90b2NvbCBUUHJvdG9jb2wgeworICB2YXIgdHJhbnNwb3J0OiBUVHJhbnNwb3J0IHsgZ2V0IHNldCB9CisgIGluaXQob24gdHJhbnNwb3J0OiBUVHJhbnNwb3J0KQorICAvLyBSZWFkaW5nIE1ldGhvZHMKKyAgCisgIGZ1bmMgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUTWVzc2FnZVR5cGUsIEludDMyKQorICBmdW5jIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzCisgIGZ1bmMgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIC0+IFN0cmluZworICBmdW5jIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MKKyAgZnVuYyByZWFkRmllbGRCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZEZpZWxkRW5kKCkgdGhyb3dzCisgIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKQorICBmdW5jIHJlYWRNYXBFbmQoKSB0aHJvd3MKKyAgZnVuYyByZWFkU2V0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkU2V0RW5kKCkgdGhyb3dzCisgIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKQorICBmdW5jIHJlYWRMaXN0RW5kKCkgdGhyb3dzCisgIAorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gU3RyaW5nCisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBCb29sCisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBVSW50OAorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MTYKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDMyCisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQ2NAorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRG91YmxlCisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEYXRhCisgIAorICAvLyBXcml0aW5nIG1ldGhvZHMKKyAgCisgIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFN0cmluZykgdGhyb3dzCisgIGZ1bmMgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZUZpZWxkQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIGZpZWxkVHlwZTogVFR5cGUsIGZpZWxkSUQ6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZUZpZWxkU3RvcCgpIHRocm93cworICBmdW5jIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZU1hcEJlZ2luKGtleVR5cGU6IFRUeXBlLCB2YWx1ZVR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGVNYXBFbmQoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlU2V0RW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGVMaXN0RW5kKCkgdGhyb3dzCisKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBTdHJpbmcpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IEJvb2wpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IFVJbnQ4KSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQxNikgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDY0KSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBEb3VibGUpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IERhdGEpIHRocm93cworfQorCitwdWJsaWMgZXh0ZW5zaW9uIFRQcm90b2NvbCB7CisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRWYWx1ZShfIHZhbHVlOiBUU2VyaWFsaXphYmxlLCBuYW1lOiBTdHJpbmcsIHR5cGU6IFRUeXBlLCBpZDogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlRmllbGRCZWdpbihuYW1lOiBuYW1lLCB0eXBlOiB0eXBlLCBmaWVsZElEOiBpZCkKKyAgICB0cnkgdmFsdWUud3JpdGUodG86IHNlbGYpCisgICAgdHJ5IHdyaXRlRmllbGRFbmQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgdmFsaWRhdGVWYWx1ZShfIHZhbHVlOiBBbnk/LCBuYW1lZCBuYW1lOiBTdHJpbmcpIHRocm93cyB7CisgICAgaWYgdmFsdWUgPT0gbmlsIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAudW5rbm93biwgbWVzc2FnZTogIk1pc3NpbmcgcmVxdWlyZWQgdmFsdWUgZm9yIGZpZWxkOiBcKG5hbWUpIikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRSZXN1bHRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgeworICAgIGxldCAoXywgdHlwZSwgXykgPSB0cnkgcmVhZE1lc3NhZ2VCZWdpbigpOworICAgIGlmIHR5cGUgPT0gLmV4Y2VwdGlvbiB7CisgICAgICBsZXQgeCA9IHRyeSByZWFkRXhjZXB0aW9uKCkKKyAgICAgIHRocm93IHgKKyAgICB9CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRFeGNlcHRpb24oKSB0aHJvd3MgLT4gVEFwcGxpY2F0aW9uRXJyb3IgeworICAgIHJldHVybiB0cnkgVEFwcGxpY2F0aW9uRXJyb3IucmVhZChmcm9tOiBzZWxmKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUV4Y2VwdGlvbihtZXNzYWdlTmFtZSBuYW1lOiBTdHJpbmcsIHNlcXVlbmNlSUQ6IEludDMyLCBleDogVEFwcGxpY2F0aW9uRXJyb3IpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IG5hbWUsIHR5cGU6IC5leGNlcHRpb24sIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQpCisgICAgdHJ5IGV4LndyaXRlKHRvOiBzZWxmKQorICAgIHRyeSB3cml0ZU1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBza2lwKHR5cGU6IFRUeXBlKSB0aHJvd3MgeworICAgIHN3aXRjaCB0eXBlIHsKKyAgICBjYXNlIC5ib29sOiAgIF8gPSB0cnkgcmVhZCgpIGFzIEJvb2wKKyAgICBjYXNlIC5pODogICBfID0gdHJ5IHJlYWQoKSBhcyBVSW50OAorICAgIGNhc2UgLmkxNjogICAgXyA9IHRyeSByZWFkKCkgYXMgSW50MTYKKyAgICBjYXNlIC5pMzI6ICAgIF8gPSB0cnkgcmVhZCgpIGFzIEludDMyCisgICAgY2FzZSAuaTY0OiAgICBfID0gdHJ5IHJlYWQoKSBhcyBJbnQ2NAorICAgIGNhc2UgLmRvdWJsZTogXyA9IHRyeSByZWFkKCkgYXMgRG91YmxlCisgICAgY2FzZSAuc3RyaW5nOiBfID0gdHJ5IHJlYWQoKSBhcyBTdHJpbmcKKyAgICAgIAorICAgIGNhc2UgLnN0cnVjdDoKKyAgICAgIF8gPSB0cnkgcmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgIHdoaWxlIHRydWUgeworICAgICAgICBsZXQgKF8sIGZpZWxkVHlwZSwgXykgPSB0cnkgcmVhZEZpZWxkQmVnaW4oKQorICAgICAgICBpZiBmaWVsZFR5cGUgPT0gLnN0b3AgeworICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHNraXAodHlwZTogZmllbGRUeXBlKQorICAgICAgICB0cnkgcmVhZEZpZWxkRW5kKCkKKyAgICAgIH0KKyAgICAgIHRyeSByZWFkU3RydWN0RW5kKCkKKyAgICAgIAorICAgICAgCisgICAgY2FzZSAubWFwOgorICAgICAgbGV0IChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpID0gdHJ5IHJlYWRNYXBCZWdpbigpCisgICAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICAgIHRyeSBza2lwKHR5cGU6IGtleVR5cGUpCisgICAgICAgIHRyeSBza2lwKHR5cGU6IHZhbHVlVHlwZSkKKyAgICAgIH0KKyAgICAgIHRyeSByZWFkTWFwRW5kKCkKKyAgICAgIAorICAgICAgCisgICAgY2FzZSAuc2V0OgorICAgICAgbGV0IChlbGVtVHlwZSwgc2l6ZSkgPSB0cnkgcmVhZFNldEJlZ2luKCkKKyAgICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgICAgdHJ5IHNraXAodHlwZTogZWxlbVR5cGUpCisgICAgICB9CisgICAgICB0cnkgcmVhZFNldEVuZCgpCisgICAgICAKKyAgICBjYXNlIC5saXN0OgorICAgICAgbGV0IChlbGVtVHlwZSwgc2l6ZSkgPSB0cnkgcmVhZExpc3RCZWdpbigpCisgICAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICAgIHRyeSBza2lwKHR5cGU6IGVsZW1UeXBlKQorICAgICAgfQorICAgICAgdHJ5IHJlYWRMaXN0RW5kKCkKKyAgICAgIAorICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLCBtZXNzYWdlOiAiSW52YWxpZCBkYXRhIikKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sRXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkMTRmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbEVycm9yLnN3aWZ0CkBAIC0wLDAgKzEsMTQ2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgc3RydWN0IFRQcm90b2NvbEVycm9yIDogVEVycm9yIHsKKyAgcHVibGljIGluaXQoKSB7IH0KKworICBwdWJsaWMgZW51bSBDb2RlIDogVEVycm9yQ29kZSB7CisgICAgY2FzZSB1bmtub3duCisgICAgY2FzZSBpbnZhbGlkRGF0YQorICAgIGNhc2UgbmVnYXRpdmVTaXplCisgICAgY2FzZSBzaXplTGltaXQobGltaXQ6IEludCwgZ290OiBJbnQpCisgICAgY2FzZSBiYWRWZXJzaW9uKGV4cGVjdGVkOiBTdHJpbmcsIGdvdDogU3RyaW5nKQorICAgIGNhc2Ugbm90SW1wbGVtZW50ZWQKKyAgICBjYXNlIGRlcHRoTGltaXQKKworICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgIHJldHVybiAwCisgICAgICBjYXNlIC5pbnZhbGlkRGF0YTogICAgcmV0dXJuIDEKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogICByZXR1cm4gMgorICAgICAgY2FzZSAuc2l6ZUxpbWl0OiAgICAgIHJldHVybiAzCisgICAgICBjYXNlIC5iYWRWZXJzaW9uOiAgICAgcmV0dXJuIDQKKyAgICAgIGNhc2UgLm5vdEltcGxlbWVudGVkOiByZXR1cm4gNQorICAgICAgY2FzZSAuZGVwdGhMaW1pdDogICAgIHJldHVybiA2CisgICAgICB9CisKKyAgICB9CisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICByZXR1cm4gIlVua25vd24gVFByb3RvY29sRXJyb3IiCisgICAgICBjYXNlIC5pbnZhbGlkRGF0YTogICAgcmV0dXJuICJJbnZhbGlkIERhdGEiCisgICAgICBjYXNlIC5uZWdhdGl2ZVNpemU6ICAgcmV0dXJuICJOZWdhdGl2ZSBTaXplIgorICAgICAgY2FzZSAuc2l6ZUxpbWl0KGxldCBsaW1pdCwgbGV0IGdvdCk6CisgICAgICAgIHJldHVybiAiTWVzc2FnZSBleGNlZWRzIHNpemUgbGltaXQgb2YgXChsaW1pdCkgKHJlY2VpdmVkOiBcKGdvdCkiCisgICAgICBjYXNlIC5iYWRWZXJzaW9uKGxldCBleHBlY3RlZCwgbGV0IGdvdCk6CisgICAgICAgIHJldHVybiAiQmFkIFZlcnNpb24uIChFeHBlY3RlZDogXChleHBlY3RlZCksIEdvdDogXChnb3QpIgorICAgICAgY2FzZSAubm90SW1wbGVtZW50ZWQ6IHJldHVybiAiTm90IEltcGxlbWVudGVkIgorICAgICAgY2FzZSAuZGVwdGhMaW1pdDogICAgIHJldHVybiAiRGVwdGggTGltaXQiCisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIGVudW0gRXh0ZW5kZWRFcnJvckNvZGUgOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIHVua25vd24KKyAgICBjYXNlIG1pc3NpbmdSZXF1aXJlZEZpZWxkKGZpZWxkTmFtZTogU3RyaW5nKQorICAgIGNhc2UgdW5leHBlY3RlZFR5cGUodHlwZTogVFR5cGUpCisgICAgY2FzZSBtaXNtYXRjaGVkUHJvdG9jb2woZXhwZWN0ZWQ6IFN0cmluZywgZ290OiBTdHJpbmcpCisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgICAgICAgcmV0dXJuIDEwMDAKKyAgICAgIGNhc2UgLm1pc3NpbmdSZXF1aXJlZEZpZWxkOiByZXR1cm4gMTAwMQorICAgICAgY2FzZSAudW5leHBlY3RlZFR5cGU6ICAgICAgIHJldHVybiAxMDAyCisgICAgICBjYXNlIC5taXNtYXRjaGVkUHJvdG9jb2w6ICAgcmV0dXJuIDEwMDMKKyAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIFRQcm90b2NvbEV4dGVuZGVkRXJyb3IiCisgICAgICBjYXNlIC5taXNzaW5nUmVxdWlyZWRGaWVsZChsZXQgZmllbGROYW1lKTogICAgICAgIHJldHVybiAiTWlzc2luZyBSZXF1aXJlZCBGaWVsZDogXChmaWVsZE5hbWUpIgorICAgICAgY2FzZSAudW5leHBlY3RlZFR5cGUobGV0IHR5cGUpOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVuZXhwZWN0ZWQgVHlwZSBcKHR5cGUuc2VsZikiCisgICAgICBjYXNlIC5taXNtYXRjaGVkUHJvdG9jb2wobGV0IGV4cGVjdGVkLCBsZXQgZ290KTogIHJldHVybiAiTWlzbWF0Y2hlZCBQcm90b2NvbC4gIChFeHBlY3RlZDogXChleHBlY3RlZCksIGdvdCBcKGdvdCkpIgorICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2YXIgZXh0ZW5kZWRFcnJvcjogRXh0ZW5kZWRFcnJvckNvZGU/ID0gbmlsCisKKyAgcHVibGljIGluaXQoZXJyb3I6IENvZGUgPSAudW5rbm93biwKKyAgICAgICAgICAgICAgbWVzc2FnZTogU3RyaW5nPyA9IG5pbCwKKyAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogRXh0ZW5kZWRFcnJvckNvZGU/ID0gbmlsKSB7CisgICAgc2VsZi5lcnJvciA9IGVycm9yCisgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICAgIHNlbGYuZXh0ZW5kZWRFcnJvciA9IGV4dGVuZGVkRXJyb3IKKyAgfQorCisgIC8vLyBNYXJrOiBURXJyb3IKKyAgcHVibGljIHZhciBlcnJvcjogQ29kZSA9IC51bmtub3duCisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogQ29kZSB7IHJldHVybiAudW5rbm93biB9CisKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICB2YXIgb3V0ID0gIlwoVFByb3RvY29sRXJyb3Iuc2VsZik6ICAoXChlcnJvci50aHJpZnRFcnJvckNvZGUpIFwoZXJyb3IuZGVzY3JpcHRpb24pXG4iCisgICAgaWYgbGV0IGV4dGVuZGVkRXJyb3IgPSBleHRlbmRlZEVycm9yIHsKKyAgICAgIG91dCArPSAiVFByb3RvY29sRXh0ZW5kZWRFcnJvciAoXChleHRlbmRlZEVycm9yLnRocmlmdEVycm9yQ29kZSkpOiBcKGV4dGVuZGVkRXJyb3IuZGVzY3JpcHRpb24pIgorICAgIH0KKyAgICBpZiBsZXQgbWVzc2FnZSA9IG1lc3NhZ2UgeworICAgICAgb3V0ICs9ICJNZXNzYWdlOiBcKG1lc3NhZ2UpIgorICAgIH0KKyAgICByZXR1cm4gb3V0CisgIH0KK30KKworCisvLy8gV3JhcHBlciBmb3IgVHJhbnNwb3J0IGVycm9ycyBpbiBQcm90b2NvbHMuICBJbnNwaXJlZCBieSBUaHJpZnQtQ29jb2EgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SCisvLy8gbWFjcm8uICBNb2RpZmllZCB0byBiZSBtb3JlIFN3aWZ0LXkuICBDYXRjaGVzIGFueSBURXJyb3IgdGhyb3duIHdpdGhpbiB0aGUgYmxvY2sgYW5kCisvLy8gcmV0aHJvd3MgYSBnaXZlbiBUUHJvdG9jb2xFcnJvciwgdGhlIG9yaWdpbmFsIGVycm9yJ3MgZGVzY3JpcHRpb24gaXMgYXBwZW5kZWQgdG8gdGhlIG5ldworLy8vIFRQcm90b2NvbEVycm9yJ3MgbWVzc2FnZS4gIHNvdXJjZUZpbGUsIHNvdXJjZUxpbmUsIHNvdXJjZU1ldGhvZCBhcmUgYXV0by1wb3B1bGF0ZWQgYW5kIHNob3VsZAorLy8vIGJlIGlnbm9yZWQgd2hlbiBjYWxsaW5nLgorLy8vCisvLy8gLSBwYXJhbWV0ZXIgZXJyb3I6ICAgICAgICBUUHJvdG9jb2xFcnJvciB0byB0aHJvdyBpZiB0aGUgYmxvY2sgdGhyb3dzCisvLy8gLSBwYXJhbWV0ZXIgc291cmNlRmlsZTogICB0aHJvd2luZyBmaWxlLCBhdXRvcG9wdWxhdGVkCisvLy8gLSBwYXJhbWV0ZXIgc291cmNlTGluZTogICB0aHJvd2luZyBsaW5lLCBhdXRvcG9wdWxhdGVkCisvLy8gLSBwYXJhbWV0ZXIgc291cmNlTWV0aG9kOiB0aHJvd2luZyBtZXRob2QsIGF1dG9wb3B1bGF0ZWQKKy8vLyAtIHBhcmFtZXRlciBibG9jazogICAgICAgIHRocm93aW5nIGJsb2NrCisvLy8KKy8vLyAtIHRocm93czogVFByb3RvY29sRXJyb3IgIERlZmF1bHQgaXMgVFByb3RvY29sRXJyb3IuRXJyb3JDb2RlLnVua25vd24uICBVbmRlcmx5aW5nCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcidzIGRlc2NyaXB0aW9uIGFwcGVuZGVkIHRvIFRQcm90b2NvbEVycm9yLm1lc3NhZ2UKK2Z1bmMgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yID0gVFByb3RvY29sRXJyb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZTogU3RyaW5nID0gI2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUxpbmU6IEludCA9ICNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VNZXRob2Q6IFN0cmluZyA9ICNmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2s6ICgpIHRocm93cyAtPiAoKSkgdGhyb3dzIHsKKyAgLy8gTmVlZCBtdXRhYmxlIGNvcHkKKyAgdmFyIGVycm9yID0gZXJyb3IKKyAgZG8geworICAgIHRyeSBibG9jaygpCisgIH0gY2F0Y2ggbGV0IGVyciBhcyBURXJyb3IgeworICAgIHZhciBtZXNzYWdlID0gZXJyb3IubWVzc2FnZSA/PyAiIgorICAgIG1lc3NhZ2UgKz0gIlxuRmlsZTogXChzb3VyY2VGaWxlKVxuIgorICAgIG1lc3NhZ2UgKz0gIkxpbmU6IFwoc291cmNlTGluZSlcbiIKKyAgICBtZXNzYWdlICs9ICJNZXRob2Q6IFwoc291cmNlTWV0aG9kKSIKKyAgICBtZXNzYWdlICs9ICJcbk9yaWdpbmFsIEVycm9yOlxuIiArIGVyci5kZXNjcmlwdGlvbgorICAgIGVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgdGhyb3cgZXJyb3IKKyAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYjU5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMjI5IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IENvcmVGb3VuZGF0aW9uCisKKyNpZiBvcyhMaW51eCkKK3B1YmxpYyBjbGFzcyBUU1NMU29ja2V0VHJhbnNwb3J0IHsKKyAgaW5pdChob3N0bmFtZTogU3RyaW5nLCBwb3J0OiBVSW50MTYpIHsKKyAgICAvLyBGSVhNRSEKKyAgICBhc3NlcnQoZmFsc2UsICJTZWN1cml0eSBub3QgYXZhaWxhYmxlIGluIExpbnV4LCBUU1NMU29ja2V0VHJhbnNwb3J0IFVuYXZpbGFibGUgZm9yIG5vdyIpCisgIH0KK30KKyNlbHNlCitsZXQgaXNMaXR0bGVFbmRpYW4gPSBJbnQoT1NIb3N0Qnl0ZU9yZGVyKCkpID09IE9TTGl0dGxlRW5kaWFuCitsZXQgaHRvbnMgID0gaXNMaXR0bGVFbmRpYW4gPyBfT1NTd2FwSW50MTYgOiB7ICQwIH0KK2xldCBodG9ubCAgPSBpc0xpdHRsZUVuZGlhbiA/IF9PU1N3YXBJbnQzMiA6IHsgJDAgfQorCitwdWJsaWMgY2xhc3MgVFNTTFNvY2tldFRyYW5zcG9ydDogVFN0cmVhbVRyYW5zcG9ydCB7CisgIHZhciBzc2xIb3N0bmFtZTogU3RyaW5nCisgIHZhciBzZDogSW50MzIgPSAwCisgIAorICBwdWJsaWMgaW5pdChob3N0bmFtZTogU3RyaW5nLCBwb3J0OiBVSW50MTYpIHRocm93cyB7CisgICAgc3NsSG9zdG5hbWUgPSBob3N0bmFtZQorICAgIHZhciByZWFkU3RyZWFtOiBVbm1hbmFnZWQ8Q0ZSZWFkU3RyZWFtPj8KKyAgICB2YXIgd3JpdGVTdHJlYW06IFVubWFuYWdlZDxDRldyaXRlU3RyZWFtPj8KKyAgICAKKyAgICAvKiBjcmVhdGUgYSBzb2NrZXQgc3RydWN0dXJlICovCisgICAgdmFyIHBpbjogc29ja2FkZHJfaW4gPSBzb2NrYWRkcl9pbigpCisgICAgdmFyIGhwOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxob3N0ZW50Pj8gPSBuaWwKKyAgICBmb3IgaSBpbiAwLi48MTAgeworICAgICAgCisgICAgICBocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUuY1N0cmluZyh1c2luZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpISkKKyAgICAgIGlmIGhwID09IG5pbCB7CisgICAgICAgIHByaW50KCJmYWlsZWQgdG8gcmVzb2x2ZSBob3N0bmFtZSBcKGhvc3RuYW1lKSIpCisgICAgICAgIGhlcnJvcigicmVzb2x2IikKKyAgICAgICAgaWYgaSA9PSA5IHsKKyAgICAgICAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBuaWwsIG91dHB1dFN0cmVhbTogbmlsKSAvLyBoYXZlIHRvIGluaXQgYmVmb3JlIHRocm93aW5nCisgICAgICAgICAgdGhyb3cgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yKGVycm9yOiAuaG9zdGFuYW1lUmVzb2x1dGlvbihob3N0bmFtZTogaG9zdG5hbWUpKQorICAgICAgICB9CisgICAgICAgIFRocmVhZC5zbGVlcChmb3JUaW1lSW50ZXJ2YWw6IDAuMikKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgfQorICAgIHBpbi5zaW5fZmFtaWx5ICA9IFVJbnQ4KEFGX0lORVQpCisgICAgcGluLnNpbl9hZGRyICAgID0gaW5fYWRkcihzX2FkZHI6IFVJbnQzMigoaHA/LnBvaW50ZWUuaF9hZGRyX2xpc3QucG9pbnRlZT8ucG9pbnRlZSkhKSkgLy8gSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGlzPz8/CisgICAgcGluLnNpbl9wb3J0ICAgID0gaHRvbnMocG9ydCkKKyAgICAKKyAgICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLworICAgIHNkID0gc29ja2V0KEludDMyKEFGX0lORVQpLCBJbnQzMihTT0NLX1NUUkVBTSksIEludDMyKElQUFJPVE9fVENQKSkKKyAgICBpZiBzZCA9PSAtMSB7CisgICAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBuaWwsIG91dHB1dFN0cmVhbTogbmlsKSAvLyBoYXZlIHRvIGluaXQgYmVmb3JlIHRocm93aW5nCisgICAgICB0aHJvdyBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5zb2NrZXRDcmVhdGUocG9ydDogSW50KHBvcnQpKSkKKyAgICB9CisgICAgCisgICAgLyogb3BlbiBhIGNvbm5lY3Rpb24gKi8KKyAgICAvLyBuZWVkIGEgbm9uLXNlbGYgcmVmIHRvIHNkLCBvdGhlcndpc2UgdGhlIGogY29tcGxhaW5zCisgICAgbGV0IHNkX2xvY2FsID0gc2QKKyAgICBsZXQgY29ubmVjdFJlc3VsdCA9IHdpdGhVbnNhZmVQb2ludGVyKHRvOiAmcGluKSB7CisgICAgICBjb25uZWN0KHNkX2xvY2FsLCBVbnNhZmVQb2ludGVyPHNvY2thZGRyPihPcGFxdWVQb2ludGVyKCQwKSksIHNvY2tsZW5fdChNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpKQorICAgIH0KKyAgICBpZiBjb25uZWN0UmVzdWx0ID09IC0xIHsKKyAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpIC8vIGhhdmUgdG8gaW5pdCBiZWZvcmUgdGhyb3dpbmcKKyAgICAgIHRocm93IFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmNvbm5lY3QpCisgICAgfQorICAgIAorICAgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgc2QsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pCisgICAgCisgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSwgLnNvY2tldE5hdGl2ZUhhbmRsZSwga0NGQm9vbGVhblRydWUpCisgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KHdyaXRlU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLCAuc29ja2V0TmF0aXZlSGFuZGxlLCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAKKyAgICB2YXIgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtPyA9IG5pbAorICAgIHZhciBvdXRwdXRTdHJlYW06IE91dHB1dFN0cmVhbT8gPSBuaWwKKyAgICBpZiByZWFkU3RyZWFtICE9IG5pbCAmJiB3cml0ZVN0cmVhbSAhPSBuaWwgeworICAgICAgCisgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvY2tldFNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsVExTdjEpCisgICAgICAKKyAgICAgIGxldCBzZXR0aW5nczogW1N0cmluZzogQm9vbF0gPSBba0NGU3RyZWFtU1NMVmFsaWRhdGVzQ2VydGlmaWNhdGVDaGFpbiBhcyBTdHJpbmc6IHRydWVdCisgICAgICAKKyAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU1NMU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyBhcyBDRlR5cGVSZWYhKQorICAgICAgCisgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU1NMU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyBhcyBDRlR5cGVSZWYhKQorICAgICAgCisgICAgICBpbnB1dFN0cmVhbSA9IHJlYWRTdHJlYW0hLnRha2VSZXRhaW5lZFZhbHVlKCkKKyAgICAgIGlucHV0U3RyZWFtPy5zY2hlZHVsZShpbjogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICBpbnB1dFN0cmVhbT8ub3BlbigpCisgICAgICAKKyAgICAgIG91dHB1dFN0cmVhbSA9IHdyaXRlU3RyZWFtIS50YWtlUmV0YWluZWRWYWx1ZSgpCisgICAgICBvdXRwdXRTdHJlYW0/LnNjaGVkdWxlKGluOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgIG91dHB1dFN0cmVhbT8ub3BlbigpCisgICAgICAKKyAgICAgIHJlYWRTdHJlYW0/LnJlbGVhc2UoKQorICAgICAgd3JpdGVTdHJlYW0/LnJlbGVhc2UoKQorICAgIH0KKyAgICAKKyAgICAKKyAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtOiBvdXRwdXRTdHJlYW0pCisgICAgc2VsZi5pbnB1dD8uZGVsZWdhdGUgPSBzZWxmCisgICAgc2VsZi5vdXRwdXQ/LmRlbGVnYXRlID0gc2VsZgorICB9CisgIAorICBmdW5jIHJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKF8gbXlUcnVzdDogU2VjVHJ1c3QsIGxhc3RUcnVzdFJlc3VsdDogU2VjVHJ1c3RSZXN1bHRUeXBlKSAtPiBCb29sIHsKKyAgICBsZXQgdHJ1c3RUaW1lID0gU2VjVHJ1c3RHZXRWZXJpZnlUaW1lKG15VHJ1c3QpCisgICAgbGV0IGN1cnJlbnRUaW1lID0gQ0ZBYnNvbHV0ZVRpbWVHZXRDdXJyZW50KCkKKyAgICAKKyAgICBsZXQgdGltZUluY3JlbWVudCA9IDMxNTM2MDAwIC8vIGZyb20gVFNTTFNvY2tldFRyYW5zcG9ydC5tCisgICAgbGV0IG5ld1RpbWUgPSBjdXJyZW50VGltZSAtIERvdWJsZSh0aW1lSW5jcmVtZW50KQorICAgIAorICAgIGlmIHRydXN0VGltZSAtIG5ld1RpbWUgIT0gMCB7CisgICAgICBsZXQgbmV3RGF0ZSA9IENGRGF0ZUNyZWF0ZShuaWwsIG5ld1RpbWUpCisgICAgICBTZWNUcnVzdFNldFZlcmlmeURhdGUobXlUcnVzdCwgbmV3RGF0ZSEpCisgICAgICAKKyAgICAgIHZhciB0ciA9IGxhc3RUcnVzdFJlc3VsdAorICAgICAgbGV0IHN1Y2Nlc3MgPSB3aXRoVW5zYWZlTXV0YWJsZVBvaW50ZXIodG86ICZ0cikgeyB0clB0ciAtPiBCb29sIGluCisgICAgICAgIGlmIFNlY1RydXN0RXZhbHVhdGUobXlUcnVzdCwgdHJQdHIpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgIHJldHVybiBmYWxzZQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlCisgICAgICB9CisgICAgICBpZiAhc3VjY2VzcyB7IHJldHVybiBmYWxzZSB9CisgICAgfQorICAgIGlmIGxhc3RUcnVzdFJlc3VsdCA9PSAucHJvY2VlZCB8fCBsYXN0VHJ1c3RSZXN1bHQgPT0gLnVuc3BlY2lmaWVkIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgfQorCisgICAgcHJpbnQoIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IFVuYWJsZSB0byByZWNvdmVyIGNlcnRpZmljYXRlIHRydXN0IGZhaWx1cmUiKQorICAgIHJldHVybiB0cnVlCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGlzT3BlbigpIC0+IEJvb2wgeworICAgIHJldHVybiBzZCA+IDAKKyAgfQorfQorCitleHRlbnNpb24gVFNTTFNvY2tldFRyYW5zcG9ydDogU3RyZWFtRGVsZWdhdGUgeworICBwdWJsaWMgZnVuYyBzdHJlYW0oXyBhU3RyZWFtOiBTdHJlYW0sIGhhbmRsZSBldmVudENvZGU6IFN0cmVhbS5FdmVudCkgeworICAgIAorICAgIHN3aXRjaCBldmVudENvZGUgeworICAgIGNhc2UgU3RyZWFtLkV2ZW50KCk6IGJyZWFrCisgICAgY2FzZSBTdHJlYW0uRXZlbnQuaGFzQnl0ZXNBdmFpbGFibGU6IGJyZWFrCisgICAgY2FzZSBTdHJlYW0uRXZlbnQub3BlbkNvbXBsZXRlZDogYnJlYWsKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5oYXNTcGFjZUF2YWlsYWJsZToKKyAgICAgIHZhciBwcm9jZWVkID0gZmFsc2UKKyAgICAgIHZhciB0cnVzdFJlc3VsdDogU2VjVHJ1c3RSZXN1bHRUeXBlID0gLmludmFsaWQKKworICAgICAgdmFyIG5ld1BvbGljaWVzOiBDRk11dGFibGVBcnJheT8KKyAgICAgIAorICAgICAgcmVwZWF0IHsKKyAgICAgICAgbGV0IHRydXN0OiBTZWNUcnVzdCA9IGFTdHJlYW0ucHJvcGVydHkoZm9yS2V5OiAuU1NMUGVlclRydXN0KSBhcyEgU2VjVHJ1c3QKKyAgICAgICAgCisgICAgICAgIC8vIEFkZCBuZXcgcG9saWN5IHRvIGN1cnJlbnQgbGlzdCBvZiBwb2xpY2llcworICAgICAgICBsZXQgcG9saWN5ID0gU2VjUG9saWN5Q3JlYXRlU1NMKGZhbHNlLCBzc2xIb3N0bmFtZSBhcyBDRlN0cmluZz8pCisgICAgICAgIHZhciBwcG9saWN5ID0gcG9saWN5IC8vIG11dGFibGUgZm9yIHBvaW50ZXIKKyAgICAgICAgbGV0IHBvbGljaWVzOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxDRkFycmF5Pz4/ID0gbmlsCisgICAgICAgIGlmIFNlY1RydXN0Q29weVBvbGljaWVzKHRydXN0LCBwb2xpY2llcyEpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgd2l0aFVuc2FmZU11dGFibGVQb2ludGVyKHRvOiAmcHBvbGljeSkgeyBwdHIgaW4KKyAgICAgICAgICBuZXdQb2xpY2llcyA9IENGQXJyYXlDcmVhdGVNdXRhYmxlQ29weShuaWwsIDAsIHBvbGljaWVzPy5wb2ludGVlKQorICAgICAgICAgIENGQXJyYXlBcHBlbmRWYWx1ZShuZXdQb2xpY2llcywgcHRyKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyB1cGRhdGUgdHJ1c3QgcG9saWNpZXMKKyAgICAgICAgaWYgU2VjVHJ1c3RTZXRQb2xpY2llcyh0cnVzdCwgbmV3UG9saWNpZXMhKSAhPSBlcnJTZWNTdWNjZXNzIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBFdmFsdWF0ZSB0aGUgdHJ1c3QgY2hhaW4KKyAgICAgICAgbGV0IHN1Y2Nlc3MgPSB3aXRoVW5zYWZlTXV0YWJsZVBvaW50ZXIodG86ICZ0cnVzdFJlc3VsdCkgeyB0cnVzdFB0ciAtPiBCb29sIGluCisgICAgICAgICAgaWYgU2VjVHJ1c3RFdmFsdWF0ZSh0cnVzdCwgdHJ1c3RQdHIpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICFzdWNjZXNzIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgc3dpdGNoIHRydXN0UmVzdWx0IHsKKyAgICAgICAgY2FzZSAucHJvY2VlZDogICAgICBwcm9jZWVkID0gdHJ1ZQorICAgICAgICBjYXNlIC51bnNwZWNpZmllZDogIHByb2NlZWQgPSB0cnVlCisgICAgICAgIGNhc2UgLnJlY292ZXJhYmxlVHJ1c3RGYWlsdXJlOgorICAgICAgICAgIHByb2NlZWQgPSBzZWxmLnJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKHRydXN0LCBsYXN0VHJ1c3RSZXN1bHQ6IHRydXN0UmVzdWx0KQorICAgICAgICAgIAorICAgICAgICBjYXNlIC5kZW55OiAgICAgICAgIGJyZWFrCisgICAgICAgIGNhc2UgLmZhdGFsVHJ1c3RGYWlsdXJlOiBicmVhaworICAgICAgICBjYXNlIC5vdGhlckVycm9yOiAgIGJyZWFrCisgICAgICAgIGNhc2UgLmludmFsaWQ6ICAgICAgYnJlYWsKKyAgICAgICAgZGVmYXVsdDogYnJlYWsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSBmYWxzZQorICAKKyAgICAgIGlmICFwcm9jZWVkIHsKKyAgICAgICAgcHJpbnQoIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IENhbm5vdCB0cnVzdCBjZXJ0aWZpY2F0ZS4gIFJlc3VsdDogXCh0cnVzdFJlc3VsdCkiKQorICAgICAgICBhU3RyZWFtLmNsb3NlKCkKKyAgICAgIH0KKyAgICAgIAorICAgIGNhc2UgU3RyZWFtLkV2ZW50LmVycm9yT2NjdXJyZWQ6IGJyZWFrCisgICAgY2FzZSBTdHJlYW0uRXZlbnQuZW5kRW5jb3VudGVyZWQ6IGJyZWFrCisgICAgZGVmYXVsdDogYnJlYWsKKyAgICB9CisgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTE2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3Iuc3dpZnQKQEAgLTAsMCArMSw0OCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcHVibGljIHN0cnVjdCBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3I6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIEVycm9yQ29kZTogVEVycm9yQ29kZSB7CisgICAgY2FzZSBob3N0YW5hbWVSZXNvbHV0aW9uKGhvc3RuYW1lOiBTdHJpbmcpCisgICAgY2FzZSBzb2NrZXRDcmVhdGUocG9ydDogSW50KQorICAgIGNhc2UgY29ubmVjdAorICAKKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLmhvc3RhbmFtZVJlc29sdXRpb246ICByZXR1cm4gLTEwMDAwCisgICAgICBjYXNlIC5zb2NrZXRDcmVhdGU6ICAgICAgICAgcmV0dXJuIC0xMDAwMQorICAgICAgY2FzZSAuY29ubmVjdDogICAgICAgICAgICAgIHJldHVybiAtMTAwMDIKKyAgICAgIH0KKyAgICB9CisgIAorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC5ob3N0YW5hbWVSZXNvbHV0aW9uKGxldCBob3N0bmFtZSk6ICByZXR1cm4gIkZhaWxlZCB0byByZXNvbHZlIGhvc3RuYW1lOiBcKGhvc3RuYW1lKSIKKyAgICAgIGNhc2UgLnNvY2tldENyZWF0ZShsZXQgcG9ydCk6ICAgICAgICAgICAgIHJldHVybiAiQ291bGQgbm90IGNyZWF0ZSBzb2NrZXQgb24gcG9ydDogXChwb3J0KSIKKyAgICAgIGNhc2UgLmNvbm5lY3Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ29ubmVjdCBlcnJvciIKKyAgICAgIH0KKyAgICB9CisgIAorICB9CisgIHB1YmxpYyB2YXIgZXJyb3I6IEVycm9yQ29kZSA9IC5jb25uZWN0CisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPworICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogRXJyb3JDb2RlIHsgcmV0dXJuIC5jb25uZWN0IH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeyB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU2VyaWFsaXphYmxlLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNlcmlhbGl6YWJsZS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDUwOTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNlcmlhbGl6YWJsZS5zd2lmdApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBwcm90b2NvbCBUU2VyaWFsaXphYmxlIHsKKyAgdmFyIGhhc2hWYWx1ZTogSW50IHsgZ2V0IH0KKworICAvLy8gVFR5cGUgZm9yIGluc3RhbmNlCisgIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyBnZXQgfQorCisgIC8vLyBSZWFkIFRTZXJpYWxpemFibGUgaW5zdGFuY2UgZnJvbSBQcm90b2NvbAorICBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFNlbGYKKworICAvLy8gV3JpdGUgVFNlcmlhbGl6YWJsZSBpbnN0YW5jZSB0byBQcm90b2NvbAorICBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cworCit9CisKK2V4dGVuc2lvbiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFNlbGYsIHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHZhbHVlLndyaXRlKHRvOiBwcm90bykKKyAgfQorCisgIC8vLyBjb252ZW5pZW5jZSBmb3IgbWVtYmVyIGFjY2VzcworICBwdWJsaWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIFNlbGYudGhyaWZ0VHlwZSB9Cit9CisKK3B1YmxpYyBmdW5jID09PFQ+KGxoczogVCwgcmhzOiBUKSAtPiBCb29sIHdoZXJlIFQgOiBUU2VyaWFsaXphYmxlIHsKKyAgcmV0dXJuIGxocy5oYXNoVmFsdWUgPT0gcmhzLmhhc2hWYWx1ZQorfQorCisvLy8gRGVmYXVsdCByZWFkL3dyaXRlIGZvciBwcmltaXRhdmUgVGhyaWZ0IHR5cGVzOgorLy8vIEJvb2wsIEludDggKGJ5dGUpLCBJbnQxNiwgSW50MzIsIEludDY0LCBEb3VibGUsIFN0cmluZworCitleHRlbnNpb24gQm9vbCA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuYm9vbCB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KKworZXh0ZW5zaW9uIEludDggOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmk4IH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQ4IHsKKyAgICByZXR1cm4gSW50OCh0cnkgcHJvdG8ucmVhZCgpIGFzIFVJbnQ4KQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoVUludDgoc2VsZikpCisgIH0KK30KKworZXh0ZW5zaW9uIEludDE2IDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5pMTYgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gSW50MzIgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmkzMiB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50MzIgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CisKKworZXh0ZW5zaW9uIEludDY0IDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5pNjQgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gRG91YmxlIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5kb3VibGUgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KKworZXh0ZW5zaW9uIFN0cmluZyA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuc3RyaW5nIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBTdHJpbmcgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU2V0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNldC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWNkMTcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNldC5zd2lmdApAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgc3RydWN0IFRTZXQ8RWxlbWVudCA6IFRTZXJpYWxpemFibGUgJiBIYXNoYWJsZT4gOiBTZXRBbGdlYnJhLCBIYXNoYWJsZSwgQ29sbGVjdGlvbiwgRXhwcmVzc2libGVCeUFycmF5TGl0ZXJhbCwgVFNlcmlhbGl6YWJsZSB7CisgIC8vLyBUeXBlYWxpYXMgZm9yIFN0b3JhZ2UgdHlwZQorICBwdWJsaWMgdHlwZWFsaWFzIFN0b3JhZ2UgPSBTZXQ8RWxlbWVudD4KKyAgCisgIAorICAvLy8gSW50ZXJuYWwgU3RvcmFnZSB1c2VkIGZvciBUU2V0IChTZXRcPEVsZW1lbnRcPikKKyAgaW50ZXJuYWwgdmFyIHN0b3JhZ2UgOiBTdG9yYWdlCisgIAorICAKKyAgLy8vIE1hcms6IENvbGxlY3Rpb24KKyAgCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kaWNlcyA9IFN0b3JhZ2UuSW5kaWNlcworICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4RGlzdGFuY2UgPSBTdG9yYWdlLkluZGV4RGlzdGFuY2UKKyAgcHVibGljIHR5cGVhbGlhcyBTdWJTZXF1ZW5jZSA9IFN0b3JhZ2UuU3ViU2VxdWVuY2UKKyAgCisgIAorICBwdWJsaWMgdmFyIGluZGljZXM6IEluZGljZXMgeyByZXR1cm4gc3RvcmFnZS5pbmRpY2VzIH0KKyAgCisgIC8vIE11c3QgaW1wbGVtZW50IGlzRW1wdHkgZXZlbiB0aG91Z2ggYm90aCBTZXRBbGdlYnJhIGFuZCBDb2xsZWN0aW9uIHByb3ZpZGUgaXQgZHVlIHRvIHRoZWlyIGNvbmZsY2l0aW5nIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zCisgIHB1YmxpYyB2YXIgaXNFbXB0eTogQm9vbCB7IHJldHVybiBzdG9yYWdlLmlzRW1wdHkgfQorICAKKyAgcHVibGljIGZ1bmMgZGlzdGFuY2UoZnJvbSBzdGFydDogSW5kZXgsIHRvIGVuZDogSW5kZXgpIC0+IEluZGV4RGlzdGFuY2UgeworICAgIHJldHVybiBzdG9yYWdlLmRpc3RhbmNlKGZyb206IHN0YXJ0LCB0bzogZW5kKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleChfIGk6IEluZGV4LCBvZmZzZXRCeSBuOiBJbmRleERpc3RhbmNlKSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KF8gaTogSW5kZXgsIG9mZnNldEJ5IG46IEluZGV4RGlzdGFuY2UsIGxpbWl0ZWRCeSBsaW1pdDogSW5kZXgpIC0+IEluZGV4PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4sIGxpbWl0ZWRCeTogbGltaXQpCisgIH0KKyAgCisgICNpZiBzd2lmdCg+PTMuMikKKyAgcHVibGljIHN1YnNjcmlwdCAocG9zaXRpb246IFN0b3JhZ2UuSW5kZXgpIC0+IEVsZW1lbnQgeworICAgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgICAgfQorICAjZWxzZQorICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogU3RvcmFnZS5JbmRleCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICB9CisgICNlbmRpZgorICAKKyAgLy8vIE1hcms6IFNldEFsZ2VicmEKKyAgaW50ZXJuYWwgaW5pdChzdG9yYWdlOiBTZXQ8RWxlbWVudD4pIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBzdG9yYWdlCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGNvbnRhaW5zKF8gbWVtYmVyOiBFbGVtZW50KSAtPiBCb29sIHsKKyAgICByZXR1cm4gc3RvcmFnZS5jb250YWlucyhtZW1iZXIpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydChfIG5ld01lbWJlcjogRWxlbWVudCkgLT4gKGluc2VydGVkOiBCb29sLCBtZW1iZXJBZnRlckluc2VydDogRWxlbWVudCkgeworICAgIHJldHVybiBzdG9yYWdlLmluc2VydChuZXdNZW1iZXIpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZShfIG1lbWJlcjogRWxlbWVudCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZShtZW1iZXIpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHVuaW9uKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2U6IHN0b3JhZ2UudW5pb24ob3RoZXIuc3RvcmFnZSkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGZvcm1JbnRlcnNlY3Rpb24oXyBvdGhlcjogVFNldDxFbGVtZW50PikgeworICAgIHJldHVybiBzdG9yYWdlLmZvcm1JbnRlcnNlY3Rpb24ob3RoZXIuc3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgZm9ybVN5bW1ldHJpY0RpZmZlcmVuY2UoXyBvdGhlcjogVFNldDxFbGVtZW50PikgeworICAgIHJldHVybiBzdG9yYWdlLmZvcm1TeW1tZXRyaWNEaWZmZXJlbmNlKG90aGVyLnN0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGZvcm1VbmlvbihfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZm9ybVVuaW9uKG90aGVyLnN0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGludGVyc2VjdGlvbihfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlOiBzdG9yYWdlLmludGVyc2VjdGlvbihvdGhlci5zdG9yYWdlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgc3ltbWV0cmljRGlmZmVyZW5jZShfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlOiBzdG9yYWdlLnN5bW1ldHJpY0RpZmZlcmVuY2Uob3RoZXIuc3RvcmFnZSkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHVwZGF0ZSh3aXRoIG5ld01lbWJlcjogRWxlbWVudCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlLnVwZGF0ZSh3aXRoOiBuZXdNZW1iZXIpCisgIH0KKyAgCisgIC8vLyBNYXJrOiBJbmRleGFibGVCYXNlCisgIAorICBwdWJsaWMgdmFyIHN0YXJ0SW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleCB9CisgIHB1YmxpYyB2YXIgZW5kSW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXggfQorICBwdWJsaWMgZnVuYyBpbmRleChhZnRlciBpOiBJbmRleCkgLT4gSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGFmdGVyOiBpKQorICB9CisKKyAgcHVibGljIGZ1bmMgZm9ybUluZGV4KGFmdGVyIGk6IGlub3V0IFN0b3JhZ2UuSW5kZXgpIHsKKyAgICBzdG9yYWdlLmZvcm1JbmRleChhZnRlcjogJmkpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQoYm91bmRzOiBSYW5nZTxJbmRleD4pIC0+IFN1YlNlcXVlbmNlIHsKKyAgICByZXR1cm4gc3RvcmFnZVtib3VuZHNdCisgIH0KKworICAKKyAgLy8vIE1hcms6IEhhc2hhYmxlCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIGVsZW1lbnQgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisgZWxlbWVudC5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICAvLy8gTWFyazogVFNlcmlhbGl6YWJsZQorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLnNldCB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGFycmF5TGl0ZXJhbCBlbGVtZW50czogRWxlbWVudC4uLikgeworICAgIHNlbGYuc3RvcmFnZSA9IFN0b3JhZ2UoZWxlbWVudHMpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0PFNvdXJjZSA6IFNlcXVlbmNlPihfIHNlcXVlbmNlOiBTb3VyY2UpIHdoZXJlIFNvdXJjZS5JdGVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKHNlcXVlbmNlKQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUU2V0IHsKKyAgICBsZXQgKGVsZW1lbnRUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkU2V0QmVnaW4oKQorICAgIGlmIGVsZW1lbnRUeXBlICE9IEVsZW1lbnQudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLnVuZXhwZWN0ZWRUeXBlKHR5cGU6IGVsZW1lbnRUeXBlKSkKKyAgICB9CisgICAgdmFyIHNldCA9IFRTZXQoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZChmcm9tOiBwcm90bykKKyAgICAgIHNldC5zdG9yYWdlLmluc2VydChlbGVtZW50KQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZFNldEVuZCgpCisgICAgcmV0dXJuIHNldAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBFbGVtZW50LnRocmlmdFR5cGUsIHNpemU6IEludDMyKHNlbGYuY291bnQpKQorICAgIGZvciBlbGVtZW50IGluIHNlbGYuc3RvcmFnZSB7CisgICAgICB0cnkgRWxlbWVudC53cml0ZShlbGVtZW50LCB0bzogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZVNldEVuZCgpCisgIH0KK30KKworZXh0ZW5zaW9uIFRTZXQ6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworcHVibGljIGZ1bmMgPT08RWxlbWVudD4obGhzOiBUU2V0PEVsZW1lbnQ+LCByaHM6IFRTZXQ8RWxlbWVudD4pIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UgPT0gcmhzLnN0b3JhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRTZXJ2ZXIuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0U2VydmVyLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMjRlNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0U2VydmVyLnN3aWZ0CkBAIC0wLDAgKzEsMTQ5IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWYgb3MoT1NYKSB8fCBvcyhpT1MpIHx8IG9zKHdhdGNoT1MpIHx8IG9zKHR2T1MpCisgIGltcG9ydCBEYXJ3aW4KKyNlbHNlaWYgb3MoTGludXgpIHx8IG9zKEZyZWVCU0QpIHx8IG9zKFBTNCkgfHwgb3MoQW5kcm9pZCkKKyAgaW1wb3J0IEdsaWJjCisgIGltcG9ydCBEaXNwYXRjaAorI2VuZGlmCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworcHVibGljIGxldCBUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkID0gIlRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQiCitwdWJsaWMgbGV0IFRTb2NrZXRTZXJ2ZXJQcm9jZXNzb3JLZXkgPSAiVFNvY2tldFNlcnZlclByb2Nlc3NvciIKK3B1YmxpYyBsZXQgVFNvY2tldFNlcnZlclRyYW5zcG9ydEtleSA9ICJUU29ja2V0U2VydmVyVHJhbnNwb3J0IgorCitjbGFzcyBUU29ja2V0U2VydmVyPEluUHJvdG9jb2w6IFRQcm90b2NvbCwgT3V0UHJvdG9jb2w6IFRQcm90b2NvbCwgUHJvY2Vzc29yOiBUUHJvY2Vzc29yLCBTZXJ2aWNlPiB3aGVyZSBQcm9jZXNzb3IuU2VydmljZSA9PSBTZXJ2aWNlIHsKKyAgdmFyIHNvY2tldEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUKKyAgdmFyIHByb2Nlc3NpbmdRdWV1ZSA9ICBEaXNwYXRjaFF1ZXVlKGxhYmVsOiAiVFNvY2tldFNlcnZlci5wcm9jZXNzaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFvczogLmJhY2tncm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiAuY29uY3VycmVudCkKKyAgdmFyIHNlcnZpY2VIYW5kbGVyOiBTZXJ2aWNlCisKKyAgcHVibGljIGluaXQocG9ydDogSW50LAorICAgICAgICAgICAgICBzZXJ2aWNlOiBTZXJ2aWNlLAorICAgICAgICAgICAgICBpblByb3RvY29sOiBJblByb3RvY29sLlR5cGUsCisgICAgICAgICAgICAgIG91dFByb3RvY29sOiBPdXRQcm90b2NvbC5UeXBlLAorICAgICAgICAgICAgICBwcm9jZXNzb3I6IFByb2Nlc3Nvci5UeXBlKSB0aHJvd3MgeworICAgIC8vIHNldCBzZXJ2aWNlIGhhbmRsZXIKKyAgICBzZWxmLnNlcnZpY2VIYW5kbGVyID0gc2VydmljZQorCisgICAgLy8gY3JlYXRlIGEgc29ja2V0CisgICAgdmFyIGZkOiBJbnQzMiA9IC0xCisgICAgI2lmIG9zKExpbnV4KQorICAgICAgbGV0IHNvY2sgPSBDRlNvY2tldENyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBQRl9JTkVULCBJbnQzMihTT0NLX1NUUkVBTS5yYXdWYWx1ZSksIEludDMyKElQUFJPVE9fVENQKSwgMCwgbmlsLCBuaWwpCisgICAgI2Vsc2UKKyAgICAgIGxldCBzb2NrID0gQ0ZTb2NrZXRDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCAwLCBuaWwsIG5pbCkKKyAgICAjZW5kaWYKKyAgICBpZiBzb2NrICE9IG5pbCB7CisgICAgICBDRlNvY2tldFNldFNvY2tldEZsYWdzKHNvY2ssIENGU29ja2V0R2V0U29ja2V0RmxhZ3Moc29jaykgJiB+a0NGU29ja2V0Q2xvc2VPbkludmFsaWRhdGUpCisKKyAgICAgIGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29jaykKKyAgICAgIHZhciB5ZXMgPSAxCisgICAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZ5ZXMsIFVJbnQzMihNZW1vcnlMYXlvdXQ8SW50Pi5zaXplKSkKKworICAgICAgI2lmIG9zKExpbnV4KQorICAgICAgICB2YXIgYWRkciA9IHNvY2thZGRyX2luKHNpbl9mYW1pbHk6IHNhX2ZhbWlseV90KEFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QocG9ydC5iaWdFbmRpYW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBpbl9hZGRyKHNfYWRkcjogaW5fYWRkcl90KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICAgI2Vsc2UKKyAgICAgICAgdmFyIGFkZHIgPSBzb2NrYWRkcl9pbihzaW5fbGVuOiBVSW50OChNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9mYW1pbHk6IHNhX2ZhbWlseV90KEFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QocG9ydC5iaWdFbmRpYW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBpbl9hZGRyKHNfYWRkcjogaW5fYWRkcl90KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICAgI2VuZGlmCisKKyAgICAgIGxldCBwdHIgPSB3aXRoVW5zYWZlUG9pbnRlcih0bzogJmFkZHIpIHsKKyAgICAgICAgcmV0dXJuIFVuc2FmZVBvaW50ZXI8VUludDg+KE9wYXF1ZVBvaW50ZXIoJDApKQorICAgICAgfQorCisgICAgICBsZXQgYWRkcmVzcyA9IERhdGEoYnl0ZXM6IHB0ciwgY291bnQ6IE1lbW9yeUxheW91dDxzb2NrYWRkcl9pbj4uc2l6ZSkKKworICAgICAgbGV0IGNmYWRkciA9IGFkZHJlc3Mud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsICQwLCBhZGRyZXNzLmNvdW50LCBuaWwpCisgICAgICB9CisgICAgICBpZiBDRlNvY2tldFNldEFkZHJlc3Moc29jaywgY2ZhZGRyKSAhPSBDRlNvY2tldEVycm9yLnN1Y2Nlc3MgeyAvL2tDRlNvY2tldFN1Y2Nlc3MgeworICAgICAgICBDRlNvY2tldEludmFsaWRhdGUoc29jaykKKyAgICAgICAgcHJpbnQoIlRTb2NrZXRTZXJ2ZXI6IENvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3MiKQorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuLCBtZXNzYWdlOiAiQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpCisgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnQoIlRTb2NrZXRTZXJ2ZXI6IE5vIHNlcnZlciBzb2NrZXQiKQorICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbiwgbWVzc2FnZTogIkNvdWxkIG5vdCBjcmVhdGUgc29ja2V0IikKKyAgICB9CisKKyAgICAvLyB3cmFwIGl0IGluIGEgZmlsZSBoYW5kbGUgc28gd2UgY2FuIGdldCBtZXNzYWdlcyBmcm9tIGl0CisgICAgc29ja2V0RmlsZUhhbmRsZSA9IEZpbGVIYW5kbGUoZmlsZURlc2NyaXB0b3I6IGZkLCBjbG9zZU9uRGVhbGxvYzogdHJ1ZSkKKworICAgIC8vIHRocm93IGF3YXkgb3VyIHNvY2tldAorICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrKQorCisgICAgLy8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgb2YgYWNjZXB0ZWQgaW5jb21pbmcgY29ubmVjdGlvbnMKKyAgICBfID0gTm90aWZpY2F0aW9uQ2VudGVyLmRlZmF1bHQuYWRkT2JzZXJ2ZXIoZm9yTmFtZTogLk5TRmlsZUhhbmRsZUNvbm5lY3Rpb25BY2NlcHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBuaWwsIHF1ZXVlOiBuaWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3ZWFrIHNlbGZdIG5vdGlmaWNhdGlvbiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VhcmQgbGV0IHN0cm9uZ1NlbGYgPSBzZWxmIGVsc2UgeyByZXR1cm4gfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb25nU2VsZi5jb25uZWN0aW9uQWNjZXB0ZWQoc3Ryb25nU2VsZi5zb2NrZXRGaWxlSGFuZGxlKQorCisgICAgfQorCisgICAgLy8gdGVsbCBzb2NrZXQgdG8gbGlzdGVuCisgICAgc29ja2V0RmlsZUhhbmRsZS5hY2NlcHRDb25uZWN0aW9uSW5CYWNrZ3JvdW5kQW5kTm90aWZ5KCkKKworICAgIHByaW50KCJUU29ja2V0U2VydmVyOiBMaXN0ZW5pbmcgb24gVENQIHBvcnQgXChwb3J0KSIpCisgIH0KKworICBkZWluaXQgeworICAgIE5vdGlmaWNhdGlvbkNlbnRlci5kZWZhdWx0LnJlbW92ZU9ic2VydmVyKHNlbGYpCisgIH0KKworICBmdW5jIGNvbm5lY3Rpb25BY2NlcHRlZChfIHNvY2tldDogRmlsZUhhbmRsZSkgeworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBjbGllbnQgY29ubmVjdGVkLCBoYW5kbGUgdGhlIHJlcXVlc3Qgb24gcXVldWUKKyAgICBwcm9jZXNzaW5nUXVldWUuYXN5bmMgeworICAgICAgc2VsZi5oYW5kbGVDbGllbnRDb25uZWN0aW9uKHNvY2tldCkKKyAgICB9CisgIH0KKworICBmdW5jIGhhbmRsZUNsaWVudENvbm5lY3Rpb24oXyBjbGllbnRTb2NrZXQ6IEZpbGVIYW5kbGUpIHsKKworICAgIGxldCB0cmFuc3BvcnQgPSBURmlsZUhhbmRsZVRyYW5zcG9ydChmaWxlSGFuZGxlOiBjbGllbnRTb2NrZXQpCisgICAgbGV0IHByb2Nlc3NvciA9IFByb2Nlc3NvcihzZXJ2aWNlOiBzZXJ2aWNlSGFuZGxlcikKKworICAgIGxldCBpblByb3RvY29sID0gSW5Qcm90b2NvbChvbjogdHJhbnNwb3J0KQorICAgIGxldCBvdXRQcm90b2NvbCA9IE91dFByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisKKyAgICBkbyB7CisgICAgICB0cnkgcHJvY2Vzc29yLnByb2Nlc3Mob246IGluUHJvdG9jb2wsIG91dFByb3RvY29sOiBvdXRQcm90b2NvbCkKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBwcmludCgiRXJyb3IgcHJvY2Vzc2lnbiByZXF1ZXN0OiBcKGVycm9yKSIpCisgICAgfQorICAgIERpc3BhdGNoUXVldWUubWFpbi5hc3luYyB7CisgICAgICBOb3RpZmljYXRpb25DZW50ZXIuZGVmYXVsdAorICAgICAgICAucG9zdChuYW1lOiBOb3RpZmljYXRpb24uTmFtZShyYXdWYWx1ZTogVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCksCisgICAgICAgICAgICAgIG9iamVjdDogc2VsZiwKKyAgICAgICAgICAgICAgdXNlckluZm86IFtUU29ja2V0U2VydmVyUHJvY2Vzc29yS2V5OiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFNvY2tldFNlcnZlclRyYW5zcG9ydEtleTogdHJhbnNwb3J0XSkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0VHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTZlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0VHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMjEwIEBACisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWYgb3MoT1NYKSB8fCBvcyhpT1MpIHx8IG9zKHdhdGNoT1MpIHx8IG9zKHR2T1MpCisgIGltcG9ydCBEYXJ3aW4KKyNlbHNlaWYgb3MoTGludXgpIHx8IG9zKEZyZWVCU0QpIHx8IG9zKFBTNCkgfHwgb3MoQW5kcm9pZCkKKyAgaW1wb3J0IEdsaWJjCisgIGltcG9ydCBEaXNwYXRjaAorI2VuZGlmCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworcHJpdmF0ZSBzdHJ1Y3QgU3lzIHsKKyAgI2lmIG9zKExpbnV4KQorICBzdGF0aWMgbGV0IHJlYWQgPSBHbGliYy5yZWFkCisgIHN0YXRpYyBsZXQgd3JpdGUgPSBHbGliYy53cml0ZQorICBzdGF0aWMgbGV0IGNsb3NlID0gR2xpYmMuY2xvc2UKKyAgI2Vsc2UKKyAgc3RhdGljIGxldCByZWFkID0gRGFyd2luLnJlYWQKKyAgc3RhdGljIGxldCB3cml0ZSA9IERhcndpbi53cml0ZQorICBzdGF0aWMgbGV0IGNsb3NlID0gRGFyd2luLmNsb3NlCisgICNlbmRpZgorfQorCitleHRlbnNpb24gaW5fYWRkciB7CisgIHB1YmxpYyBpbml0Pyhob3N0ZW50OiBob3N0ZW50PykgeworICAgIGd1YXJkIGxldCBob3N0ID0gaG9zdGVudCwgaG9zdC5oX2FkZHJfbGlzdCAhPSBuaWwsIGhvc3QuaF9hZGRyX2xpc3QucG9pbnRlZSAhPSBuaWwgZWxzZSB7CisgICAgICByZXR1cm4gbmlsCisgICAgfQorICAgIHNlbGYuaW5pdCgpCisgICAgbWVtY3B5KCZzZWxmLCBob3N0LmhfYWRkcl9saXN0LnBvaW50ZWUhLCBJbnQoaG9zdC5oX2xlbmd0aCkpCisgICAgCisgIH0KK30KKworCisjaWYgb3MoTGludXgpCisgIC8vLyBUQ0ZTb2NrZXRUcmFuc3BvcnQgY3VycmVudGx5IHVuYXZhaWxhYmxlCisgIC8vLyByZW1vdmUgY29tbWVudHMgYW5kIGJ1aWxkIHRvIHNlZSB3aHkvZml4CisgIC8vLyBjdXJyZW50bHkgQ0ZbUmVhZHxXcml0ZV1TdHJlYW0ncyBjYW4ndCBjYXN0IHRvIFtJbnB1dHxPdXRwdXRdU3RyZWFtcyB3aGljaCBicmVha3MgdGhpZ25zCisjZWxzZQorZXh0ZW5zaW9uIFN0cmVhbS5Qcm9wZXJ0eUtleSB7CisgIHN0YXRpYyBsZXQgU1NMUGVlclRydXN0ID0gU3RyZWFtLlByb3BlcnR5S2V5KGtDRlN0cmVhbVByb3BlcnR5U1NMUGVlclRydXN0IGFzIFN0cmluZykKK30KKworLy8vIFRDRlNvY2tldFRyYW5zcG9ydCwgdXNlcyBDRlNvY2tldHMgYW5kIChOUylTdHJlYW0ncworcHVibGljIGNsYXNzIFRDRlNvY2tldFRyYW5zcG9ydDogVFN0cmVhbVRyYW5zcG9ydCB7CisgICAgcHVibGljIGluaXQ/KGhvc3RuYW1lOiBTdHJpbmcsIHBvcnQ6IEludCwgc2VjdXJlOiBCb29sID0gZmFsc2UpIHsKKyAgICAKKyAgICB2YXIgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtCisgICAgdmFyIG91dHB1dFN0cmVhbTogT3V0cHV0U3RyZWFtCisgICAgCisgICAgdmFyIHJlYWRTdHJlYW06ICBVbm1hbmFnZWQ8Q0ZSZWFkU3RyZWFtPj8KKyAgICB2YXIgd3JpdGVTdHJlYW06ICBVbm1hbmFnZWQ8Q0ZXcml0ZVN0cmVhbT4/CisgICAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldFRvSG9zdChrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUgYXMgQ0ZTdHJpbmchLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyKHBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVTdHJlYW0pCisgICAgCisgICAgaWYgbGV0IHJlYWRTdHJlYW0gPSByZWFkU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLAorICAgICAgbGV0IHdyaXRlU3RyZWFtID0gd3JpdGVTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCkgeworICAgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCAuc2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKQorICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAKKyAgICAgICAgaWYgc2VjdXJlIHsKKyAgICAgICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIC5zb2NrZXRTZWN1cml0eUxldmVsLCBTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsLm5lZ290aWF0ZWRTU0wucmF3VmFsdWUgYXMgQ0ZTdHJpbmcpCisgICAgICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIC5zb2NrZXRTZWN1cml0eUxldmVsLCBTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsLm5lZ290aWF0ZWRTU0wucmF3VmFsdWUgYXMgQ0ZTdHJpbmcpCisgICAgICAgIH0KKworICAgICAgaW5wdXRTdHJlYW0gPSByZWFkU3RyZWFtIGFzIElucHV0U3RyZWFtCisgICAgICBpbnB1dFN0cmVhbS5zY2hlZHVsZShpbjogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICBpbnB1dFN0cmVhbS5vcGVuKCkKKyAgICAgIAorICAgICAgb3V0cHV0U3RyZWFtID0gd3JpdGVTdHJlYW0gYXMgT3V0cHV0U3RyZWFtCisgICAgICBvdXRwdXRTdHJlYW0uc2NoZWR1bGUoaW46IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgb3V0cHV0U3RyZWFtLm9wZW4oKQorICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIAorICAgICAgaWYgcmVhZFN0cmVhbSAhPSBuaWwgeworICAgICAgICByZWFkU3RyZWFtPy5yZWxlYXNlKCkKKyAgICAgIH0KKyAgICAgIGlmIHdyaXRlU3RyZWFtICE9IG5pbCB7CisgICAgICAgIHdyaXRlU3RyZWFtPy5yZWxlYXNlKCkKKyAgICAgIH0KKyAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpCisgICAgICByZXR1cm4gbmlsCisgICAgfQorICAgIAorICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbSkKKyAgICAKKyAgICBzZWxmLmlucHV0Py5kZWxlZ2F0ZSA9IHNlbGYKKyAgICBzZWxmLm91dHB1dD8uZGVsZWdhdGUgPSBzZWxmCisgIH0KK30KKworZXh0ZW5zaW9uIFRDRlNvY2tldFRyYW5zcG9ydDogU3RyZWFtRGVsZWdhdGUgeyB9CisjZW5kaWYKKworCisvLy8gVFNvY2tldFRyYW5zcG9ydCwgcG9zaXggc29ja2V0cy4gIFN1cHBvcnRzIElQdjQgb25seSBmb3Igbm93CitwdWJsaWMgY2xhc3MgVFNvY2tldFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICBwdWJsaWMgdmFyIHNvY2tldERlc2NyaXB0b3I6IEludDMyCisgIAorICAKKyAgCisgIC8vLyBJbml0aWFsaXplIGZyb20gYW4gYWxyZWFkeSBzZXQgdXAgc29ja2V0RGVzY3JpcHRvci4KKyAgLy8vIEV4cGVjdHMgc29ja2V0IHRoYXRzIGFscmVhZHkgYm91bmQvY29ubmVjdGVkIChpLmUuIGZyb20gbGlzdGVuaW5nKQorICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIHNvY2tldERlc2NyaXB0b3I6IHBvc2l4IHNvY2tldCBkZXNjcmlwdG9yIChJbnQzMikKKyAgcHVibGljIGluaXQoc29ja2V0RGVzY3JpcHRvcjogSW50MzIpIHsKKyAgICBzZWxmLnNvY2tldERlc2NyaXB0b3IgPSBzb2NrZXREZXNjcmlwdG9yCisgIH0KKyAgCisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChob3N0bmFtZTogU3RyaW5nLCBwb3J0OiBJbnQpIHRocm93cyB7CisgICAgZ3VhcmQgbGV0IGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZS5jU3RyaW5nKHVzaW5nOiAudXRmOCkhKT8ucG9pbnRlZSwKKyAgICAgIGxldCBob3N0QWRkciA9IGluX2FkZHIoaG9zdGVudDogaHApIGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duLCBtZXNzYWdlOiAiSW52YWxpZCBhZGRyZXNzOiBcKGhvc3RuYW1lKSIpCisgICAgfQorICAgIAorICAgIAorICAgIAorICAgICNpZiBvcyhMaW51eCkKKyAgICAgIGxldCBzb2NrID0gc29ja2V0KEFGX0lORVQsIEludDMyKFNPQ0tfU1RSRUFNLnJhd1ZhbHVlKSwgMCkKKyAgICAgIHZhciBhZGRyID0gc29ja2FkZHJfaW4oc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QoaHRvbnMoVUludDE2KHBvcnQpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBob3N0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3plcm86ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSkKKyAgICAjZWxzZQorICAgICAgbGV0IHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApCisgICAgICAKKyAgICAgIHZhciBhZGRyID0gc29ja2FkZHJfaW4oc2luX2xlbjogVUludDgoTWVtb3J5TGF5b3V0PHNvY2thZGRyX2luPi5zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QoaHRvbnMoVUludDE2KHBvcnQpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBpbl9hZGRyKHNfYWRkcjogaW5fYWRkcl90KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3plcm86ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSkKKyAgICAgIAorICAgICNlbmRpZgorICAgIAorICAgIGxldCBhZGRyUHRyID0gd2l0aFVuc2FmZVBvaW50ZXIodG86ICZhZGRyKXsgVW5zYWZlUG9pbnRlcjxzb2NrYWRkcj4oT3BhcXVlUG9pbnRlcigkMCkpIH0KKyAgICAKKyAgICBsZXQgY29ubmVjdGVkID0gY29ubmVjdChzb2NrLCBhZGRyUHRyLCBVSW50MzIoTWVtb3J5TGF5b3V0PHNvY2thZGRyX2luPi5zaXplKSkKKyAgICBpZiBjb25uZWN0ZWQgIT0gMCB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuLCBtZXNzYWdlOiAiRXJyb3IgYmluZGluZyB0byBob3N0OiBcKGhvc3RuYW1lKSBcKHBvcnQpIikKKyAgICB9CisgICAgCisgICAgc2VsZi5pbml0KHNvY2tldERlc2NyaXB0b3I6IHNvY2spCisgIH0KKyAgCisgIGRlaW5pdCB7CisgICAgY2xvc2UoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBvdXQgPSBEYXRhKCkKKyAgICB3aGlsZSBvdXQuY291bnQgPCBzaXplIHsKKyAgICAgIG91dC5hcHBlbmQodHJ5IHNlbGYucmVhZChzaXplOiBzaXplKSkKKyAgICB9CisgICAgcmV0dXJuIG91dAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBidWZmID0gQXJyYXk8VUludDg+LmluaXQocmVwZWF0aW5nOiAwLCBjb3VudDogc2l6ZSkKKyAgICBsZXQgcmVhZEJ5dGVzID0gU3lzLnJlYWQoc29ja2V0RGVzY3JpcHRvciwgJmJ1ZmYsIHNpemUpCisgICAgCisgICAgcmV0dXJuIERhdGEoYnl0ZXM6IGJ1ZmZbMC4uPHJlYWRCeXRlc10pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHsKKyAgICB2YXIgYnl0ZXNUb1dyaXRlID0gZGF0YS5jb3VudAorICAgIHZhciB3cml0ZUJ1ZmZlciA9IGRhdGEKKyAgICB3aGlsZSBieXRlc1RvV3JpdGUgPiAwIHsKKyAgICAgIGxldCB3cml0dGVuID0gd3JpdGVCdWZmZXIud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgU3lzLndyaXRlKHNvY2tldERlc2NyaXB0b3IsICQwLCB3cml0ZUJ1ZmZlci5jb3VudCkKKyAgICAgIH0KKyAgICAgIHdyaXRlQnVmZmVyID0gd3JpdGVCdWZmZXIuc3ViZGF0YShpbjogd3JpdHRlbiAuLjwgd3JpdGVCdWZmZXIuY291bnQpCisgICAgICBieXRlc1RvV3JpdGUgLT0gd3JpdHRlbgorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgY2xvc2UoKSB7CisgICAgc2h1dGRvd24oc29ja2V0RGVzY3JpcHRvciwgSW50MzIoU0hVVF9SRFdSKSkKKyAgICBfID0gU3lzLmNsb3NlKHNvY2tldERlc2NyaXB0b3IpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJlYW1UcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU3RyZWFtVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmMxYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU3RyZWFtVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworI2lmIG9zKExpbnV4KQorICAvLy8gQ3VycmVudGx5IHVuYXZhaWxhYmxlIGluIExpbnV4CisgIC8vLyBSZW1vdmUgY29tbWVudHMgYW5kIGJ1aWxkIHRvIGZpeAorICAvLy8gQ3VycmVudGx5IGtDb25zdGFudHMgZm9yIENGU29ja2V0cyBkb24ndCBleGlzdCBpbiBsaW51eCBhbmQgbm90IGFsbCBoYXZlIGJlZW4gbW92ZWQKKyAgLy8vIHRvIHByb3BlcnR5IHN0cnVjdHMgeWV0CisjZWxzZQorICAvLyBNdXN0IGluaGVyaXQgTlNPYmplY3QgZm9yIE5TU3RyZWFtRGVsZWdhdGUgY29uZm9ybWFuY2UKKyAgcHVibGljIGNsYXNzIFRTdHJlYW1UcmFuc3BvcnQgOiBOU09iamVjdCwgVFRyYW5zcG9ydCB7CisgICAgcHVibGljIHZhciBpbnB1dDogSW5wdXRTdHJlYW0/ID0gbmlsCisgICAgcHVibGljIHZhciBvdXRwdXQ6IE91dHB1dFN0cmVhbT8gPSBuaWwKKyAgICAKKyAgICBwdWJsaWMgaW5pdChpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0/LCBvdXRwdXRTdHJlYW06IE91dHB1dFN0cmVhbT8pIHsKKyAgICAgIGlucHV0ICAgPSBpbnB1dFN0cmVhbQorICAgICAgb3V0cHV0ICA9IG91dHB1dFN0cmVhbQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0/KSB7CisgICAgICBzZWxmLmluaXQoaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW06IG5pbCkKKyAgICB9CisgICAgCisgICAgcHVibGljIGNvbnZlbmllbmNlIGluaXQob3V0cHV0U3RyZWFtOiBPdXRwdXRTdHJlYW0/KSB7CisgICAgICBzZWxmLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBvdXRwdXRTdHJlYW0pCisgICAgfQorICAgIAorICAgIGRlaW5pdCB7CisgICAgICBjbG9zZSgpCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgICBndWFyZCBsZXQgaW5wdXQgPSBpbnB1dCBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93bikKKyAgICAgIH0KKyAgICAgIAorICAgICAgdmFyIHJlYWQgPSBEYXRhKCkKKyAgICAgIHdoaWxlIHJlYWQuY291bnQgPCBzaXplIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IEFycmF5PFVJbnQ4PihyZXBlYXRpbmc6IDAsIGNvdW50OiBzaXplIC0gcmVhZC5jb3VudCkKKyAgICAgICAgCisgICAgICAgIGxldCBieXRlc1JlYWQgPSBidWZmZXIud2l0aFVuc2FmZU11dGFibGVCdWZmZXJQb2ludGVyIHsgYnVmZmVyUHRyIGluCisgICAgICAgICAgcmV0dXJuIGlucHV0LnJlYWQoYnVmZmVyUHRyLmJhc2VBZGRyZXNzISwgbWF4TGVuZ3RoOiBzaXplIC0gcmVhZC5jb3VudCkKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgYnl0ZXNSZWFkIDw9IDAgeworICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4pCisgICAgICAgIH0KKyAgICAgICAgcmVhZC5hcHBlbmQoRGF0YShieXRlczogYnVmZmVyKSkKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWFkCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgICBndWFyZCBsZXQgaW5wdXQgPSBpbnB1dCBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93bikKKyAgICAgIH0KKyAgICAgIAorICAgICAgdmFyIHJlYWQgPSBEYXRhKCkKKyAgICAgIHdoaWxlIHJlYWQuY291bnQgPCBzaXplIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IEFycmF5PFVJbnQ4PihyZXBlYXRpbmc6IDAsIGNvdW50OiBzaXplIC0gcmVhZC5jb3VudCkKKyAgICAgICAgbGV0IGJ5dGVzUmVhZCA9IGJ1ZmZlci53aXRoVW5zYWZlTXV0YWJsZUJ1ZmZlclBvaW50ZXIgeworICAgICAgICAgIGlucHV0LnJlYWQoJDAuYmFzZUFkZHJlc3MhLCBtYXhMZW5ndGg6IHNpemUgLSByZWFkLmNvdW50KQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiBieXRlc1JlYWQgPD0gMCB7CisgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmVhZC5hcHBlbmQoRGF0YShieXRlczogYnVmZmVyKSkKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWFkCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgICBndWFyZCBsZXQgb3V0cHV0ID0gb3V0cHV0IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgICAgfQorICAgICAgCisgICAgICB2YXIgYnl0ZXNXcml0dGVuID0gMAorICAgICAgd2hpbGUgYnl0ZXNXcml0dGVuIDwgZGF0YS5jb3VudCB7CisgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGRhdGEud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgICByZXR1cm4gb3V0cHV0LndyaXRlKCQwLCBtYXhMZW5ndGg6IGRhdGEuY291bnQpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIGJ5dGVzV3JpdHRlbiA9PSAtMSB7CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbikKKyAgICAgICAgfSBlbHNlIGlmIGJ5dGVzV3JpdHRlbiA9PSAwIHsKKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgICAgcmV0dXJuCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIGNsb3NlKCkgeworICAgICAgCisgICAgICBpZiBpbnB1dCAhPSBuaWwgeworICAgICAgICAvLyBDbG9zZSBhbmQgcmVzZXQgaW5wdXRzdHJlYW0KKyAgICAgICAgaWYgbGV0IGNmOiBDRlJlYWRTdHJlYW0gPSBpbnB1dCB7CisgICAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoY2YsIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlucHV0Py5kZWxlZ2F0ZSA9IG5pbAorICAgICAgICBpbnB1dD8uY2xvc2UoKQorICAgICAgICBpbnB1dD8ucmVtb3ZlKGZyb206IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgICBpbnB1dCA9IG5pbAorICAgICAgfQorICAgICAgCisgICAgICBpZiBvdXRwdXQgIT0gbmlsIHsKKyAgICAgICAgLy8gQ2xvc2UgYW5kIHJlc2V0IG91dHB1dCBzdHJlYW0KKyAgICAgICAgaWYgbGV0IGNmOiBDRldyaXRlU3RyZWFtID0gb3V0cHV0IHsKKyAgICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkoY2YsIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0Py5kZWxlZ2F0ZSA9IG5pbAorICAgICAgICBvdXRwdXQ/LmNsb3NlKCkKKyAgICAgICAgb3V0cHV0Py5yZW1vdmUoZnJvbTogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICAgIG91dHB1dCA9IG5pbAorICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU3RydWN0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cnVjdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTcyYTMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cnVjdC5zd2lmdApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8vLyBQcm90b2NvbCBmb3IgR2VuZXJhdGVkIFN0cnVjdHMgdG8gY29uZm9ybSB0bworLy8vIERpY3Rpb25hcnkgbWFwcyBmaWVsZCBuYW1lcyB0byBpbnRlcm5hbCBJRHMgYW5kIHVzZXMgUmVmbGVjdGlvbgorLy8vIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgZmllbGRzLiAgCisvLy8gYHdyaXRlRmllbGRWYWx1ZShfOm5hbWU6dHlwZTppZDopYCBjYWxscyBgVFNlcmlhbGl6YWJsZS53cml0ZSh0bzopYCBpbnRlcm5hbGx5CisvLy8gZ2l2aW5nIGEgbmljZSByZWN1cnNpdmUgYmVoYXZpb3IgZm9yIG5lc3RlZCBUU3RydWN0cywgVExpc3RzLCBUTWFwcywgYW5kIFRTZXRzCitwdWJsaWMgcHJvdG9jb2wgVFN0cnVjdCA6IFRTZXJpYWxpemFibGUgeworICBzdGF0aWMgdmFyIGZpZWxkSWRzOiBbU3RyaW5nOiBJbnQzMl0geyBnZXQgfQorICBzdGF0aWMgdmFyIHN0cnVjdE5hbWU6IFN0cmluZyB7IGdldCB9Cit9CisKK3B1YmxpYyBleHRlbnNpb24gVFN0cnVjdCB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIGZpZWxkSWRzOiBbU3RyaW5nOiAoaWQ6IEludDMyLCB0eXBlOiBUVHlwZSldIHsgcmV0dXJuIFs6XSB9CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5zdHJ1Y3QgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICAvLyBXcml0ZSBzdHJ1Y3QgbmFtZSBmaXJzdAorICAgIHRyeSBwcm90by53cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFNlbGYuc3RydWN0TmFtZSkKKyAgICAKKyAgICB0cnkgc2VsZi5mb3JFYWNoIHsgbmFtZSwgdmFsdWUsIGlkIGluCisgICAgICAvLyBXcml0ZSB0byBwcm90b2NvbAorICAgICAgdHJ5IHByb3RvLndyaXRlRmllbGRWYWx1ZSh2YWx1ZSwgbmFtZTogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdmFsdWUudGhyaWZ0VHlwZSwgaWQ6IGlkKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHRyeSBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBzZWxmLmZvckVhY2ggeyBfLCB2YWx1ZSwgXyBpbgorICAgICAgcmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrICh2YWx1ZS5oYXNoVmFsdWUpCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgLy8vIFByb3ZpZGVzIGEgYmxvY2sgZm9yIGhhbmRsaW5nIGVhY2ggKGF2YWlsYWJsZSkgdGhyaWZ0IHByb3BlcnR5IHVzaW5nIHJlZmxlY3Rpb24KKyAgLy8vIENhdmVhdDogU2tpcHMgb3ZlciBvcHRpb25hbCB2YWx1ZXMKKyAgCisgIAorICAvLy8gUHJvdmlkZXMgYSBibG9jayBmb3IgaGFuZGxpbmcgZWFjaCAoYXZhaWxhYmxlKSB0aHJpZnQgcHJvcGVydHkgdXNpbmcgcmVmbGVjdGlvbgorICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIGJsb2NrOiBibG9jayBmb3IgaGFuZGxpbmcgcHJvcGVydHkKKyAgLy8vCisgIC8vLyAtIHRocm93czogcmV0aHJvd3MgYW55IEVycm9yIHRocm93biBpbiBibG9jaworICBwcml2YXRlIGZ1bmMgZm9yRWFjaChfIGJsb2NrOiAoXyBuYW1lOiBTdHJpbmcsIF8gdmFsdWU6IFRTZXJpYWxpemFibGUsIF8gaWQ6IEludDMyKSB0aHJvd3MgLT4gVm9pZCkgcmV0aHJvd3MgeworICAgIC8vIE1pcnJvciB0aGUgb2JqZWN0LCBnZXR0aW5nIChuYW1lOiBTdHJpbmc/LCB2YWx1ZTogQW55KSBmb3IgZXZlcnkgcHJvcGVydHkKKyAgICBsZXQgbWlycm9yID0gTWlycm9yKHJlZmxlY3Rpbmc6IHNlbGYpCisgICAgCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBjaGlsZHJlbiwgaWdub3JlIGVtcHR5IHByb3BlcnR5IG5hbWVzCisgICAgZm9yIChwcm9wTmFtZSwgcHJvcFZhbHVlKSBpbiBtaXJyb3IuY2hpbGRyZW4geworICAgICAgZ3VhcmQgbGV0IHByb3BOYW1lID0gcHJvcE5hbWUgZWxzZSB7IGNvbnRpbnVlIH0KKworICAgICAgaWYgbGV0IHR2YWwgPSB1bndyYXAoYW55OiBwcm9wVmFsdWUpIGFzPyBUU2VyaWFsaXphYmxlLCBsZXQgaWQgPSBTZWxmLmZpZWxkSWRzW3Byb3BOYW1lXSB7CisgICAgICAgIHRyeSBibG9jayhwcm9wTmFtZSwgdHZhbCwgaWQpCisgICAgICB9CisgICAgfQorICB9CisgIAorICAKKyAgLy8vIEFueSBjYW4gbXlzdGVyaW91c2x5IGJlIGFuIE9wdGlvbmFsPEFueT4gYXQgdGhlIHNhbWUgdGltZSwKKyAgLy8vIHRoaXMgY2hlY2tzIGFuZCBhbHdheXMgcmV0dXJucyBPcHRpb25hbDxBbnk+IHdpdGhvdXQgZG91YmxlIHdyYXBwaW5nCisgIC8vLyB3ZSB0aGVuIHRyeSB0byBiaW5kIHZhbHVlIGFzIFRTZXJpYWxpemFibGUgdG8gaWdub3JlIGFueSBleHRlbnNpb24gcHJvcGVydGllcworICAvLy8gYW5kIHRoZSBsaWtlIGFuZCB2ZXJpZnkgdGhlIHByb3BlcnR5IGV4aXN0cyBhbmQgZ3JhYiB0aGUgVGhyaWZ0CisgIC8vLyBwcm9wZXJ0eSBJRCBhdCB0aGUgc2FtZSB0aW1lCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgYW55OiBBbnkgaW5zdGFuY2UgdG8gYXR0ZW1wdCB0byB1bndyYXAKKyAgLy8vCisgIC8vLyAtIHJldHVybnM6IFVud3JhcHBlZCBBbnkgYXMgT3B0aW9uYWw8QW55PgorICBwcml2YXRlIGZ1bmMgdW53cmFwKGFueTogQW55KSAtPiBBbnk/IHsKKyAgICBsZXQgbWkgPSBNaXJyb3IocmVmbGVjdGluZzogYW55KQorICAgIAorICAgIGlmIG1pLmRpc3BsYXlTdHlsZSAhPSAub3B0aW9uYWwgeyByZXR1cm4gYW55IH0KKyAgICBpZiBtaS5jaGlsZHJlbi5jb3VudCA9PSAwIHsgcmV0dXJuIG5pbCB9CisgICAgCisgICAgbGV0IChfLCBzb21lKSA9IG1pLmNoaWxkcmVuLmZpcnN0IQorICAgIHJldHVybiBzb21lCisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyYmJlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSw2NCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIHByb3RvY29sIFRUcmFuc3BvcnQgeworICAKKyAgLy8gUmVxdWlyZWQKKyAgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEKKyAgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MKKyAgZnVuYyBmbHVzaCgpIHRocm93cworCisgIC8vIE9wdGlvbmFsIChkZWZhdWx0IHByb3ZpZGVkKQorICBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YQorICBmdW5jIGlzT3BlbigpIHRocm93cyAtPiBCb29sCisgIGZ1bmMgb3BlbigpIHRocm93cworICBmdW5jIGNsb3NlKCkgdGhyb3dzCit9CisKK3B1YmxpYyBleHRlbnNpb24gVFRyYW5zcG9ydCB7CisgIGZ1bmMgaXNPcGVuKCkgdGhyb3dzIC0+IEJvb2wgeyByZXR1cm4gdHJ1ZSB9CisgIGZ1bmMgb3BlbigpIHRocm93cyB7IH0KKyAgZnVuYyBjbG9zZSgpIHRocm93cyB7IH0KKyAgCisgIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHZhciBoYXZlID0gMAorICAgIHdoaWxlIGhhdmUgPCBzaXplIHsKKyAgICAgIGxldCBjaHVuayA9IHRyeSBzZWxmLnJlYWQoc2l6ZTogc2l6ZSAtIGhhdmUpCisgICAgICBoYXZlICs9IGNodW5rLmNvdW50CisgICAgICBidWZmLmFwcGVuZChjaHVuaykKKyAgICAgIGlmIGNodW5rLmNvdW50ID09IDAgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgICB9CisgICAgfQorICAgIHJldHVybiBidWZmCisgIH0KK30KKworcHVibGljIHByb3RvY29sIFRBc3luY1RyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICAvLyBGYWN0b3J5CisgIGZ1bmMgZmx1c2goXyBjb21wbGV0aW9uOiBAZXNjYXBpbmcgKFRBc3luY1RyYW5zcG9ydCwgRXJyb3I/KSAtPigpKQorfQorCitwdWJsaWMgcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSB7CisgIGFzc29jaWF0ZWR0eXBlIFRyYW5zcG9ydCA6IFRBc3luY1RyYW5zcG9ydAorICBmdW5jIG5ld1RyYW5zcG9ydCgpIC0+IFRyYW5zcG9ydAorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydEVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDAwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0RXJyb3Iuc3dpZnQKQEAgLTAsMCArMSw4NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcHVibGljIHN0cnVjdCBUVHJhbnNwb3J0RXJyb3I6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIEVycm9yQ29kZTogVEVycm9yQ29kZSB7CisgICAgY2FzZSB1bmtub3duCisgICAgY2FzZSBub3RPcGVuCisgICAgY2FzZSBhbHJlYWR5T3BlbgorICAgIGNhc2UgdGltZWRPdXQKKyAgICBjYXNlIGVuZE9mRmlsZQorICAgIGNhc2UgbmVnYXRpdmVTaXplCisgICAgY2FzZSBzaXplTGltaXQobGltaXQ6IEludCwgZ290OiBJbnQpCisgICAgCisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgIHJldHVybiAwCisgICAgICBjYXNlIC5ub3RPcGVuOiAgICAgIHJldHVybiAxCisgICAgICBjYXNlIC5hbHJlYWR5T3BlbjogIHJldHVybiAyCisgICAgICBjYXNlIC50aW1lZE91dDogICAgIHJldHVybiAzCisgICAgICBjYXNlIC5lbmRPZkZpbGU6ICAgIHJldHVybiA0CisgICAgICBjYXNlIC5uZWdhdGl2ZVNpemU6IHJldHVybiA1CisgICAgICBjYXNlIC5zaXplTGltaXQ6ICAgIHJldHVybiA2CisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgIHJldHVybiAiVW5rbm93biBUVHJhbnNwb3J0RXJyb3IiCisgICAgICBjYXNlIC5ub3RPcGVuOiAgICAgIHJldHVybiAiTm90IE9wZW4iCisgICAgICBjYXNlIC5hbHJlYWR5T3BlbjogIHJldHVybiAiQWxyZWFkeSBPcGVuIgorICAgICAgY2FzZSAudGltZWRPdXQ6ICAgICByZXR1cm4gIlRpbWVkIE91dCIKKyAgICAgIGNhc2UgLmVuZE9mRmlsZTogICAgcmV0dXJuICJFbmQgT2YgRmlsZSIKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogcmV0dXJuICJOZWdhdGl2ZSBTaXplIgorICAgICAgY2FzZSAuc2l6ZUxpbWl0KGxldCBsaW1pdCwgbGV0IGdvdCk6CisgICAgICAgIHJldHVybiAiTWVzc2FnZSBleGNlZWRzIHNpemUgbGltaXQgb2YgXChsaW1pdCkgKHJlY2VpdmVkOiBcKGdvdCkiCisgICAgICB9CisgICAgfQorICB9CisgIHB1YmxpYyB2YXIgZXJyb3I6IEVycm9yQ29kZSA9IC51bmtub3duCisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogRXJyb3JDb2RlIHsgcmV0dXJuIC51bmtub3duIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeyB9CisKK30KKworLy8vIFRIVFRQVHJhbnNwb3J0RXJyb3IKKy8vLworLy8vIEVycm9yJ3MgdGhyb3duIG9uIEhUVFAgVHJhbnNwb3J0CitwdWJsaWMgc3RydWN0IFRIVFRQVHJhbnNwb3J0RXJyb3I6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIEVycm9yQ29kZTogVEVycm9yQ29kZSB7CisgICAgY2FzZSBpbnZhbGlkUmVzcG9uc2UKKyAgICBjYXNlIGludmFsaWRTdGF0dXMoc3RhdHVzQ29kZTogSW50KQorICAgIGNhc2UgYXV0aGVudGljYXRpb24KKyAgICAKKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAuaW52YWxpZFJlc3BvbnNlOiAgICAgICAgICAgICAgICByZXR1cm4gIkludmFsaWQgSFRUUCBSZXNwb25zZSIKKyAgICAgIGNhc2UgLmludmFsaWRTdGF0dXMobGV0IHN0YXR1c0NvZGUpOiAgcmV0dXJuICJJbnZhbGlkIEhUVFAgU3RhdHVzIENvZGUgKFwoc3RhdHVzQ29kZSkpIgorICAgICAgY2FzZSAuYXV0aGVudGljYXRpb246ICAgICAgICAgICAgICAgICByZXR1cm4gIkF1dGhlbnRpY2F0aW9uIEVycm9yIgorICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsgcmV0dXJuIDAgfQorICB9CisgIHB1YmxpYyB2YXIgZXJyb3I6IEVycm9yQ29kZSA9IC5pbnZhbGlkUmVzcG9uc2UKKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBFcnJvckNvZGUgeyByZXR1cm4gLmludmFsaWRSZXNwb25zZSB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsgfQorfQorCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UV3JhcHBlZFByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFdyYXBwZWRQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTg1NzdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFdyYXBwZWRQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDIwOCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24gLy8gRm9yIChOUylEYXRhCisKKworLy8vIEdlbmVyaWMgcHJvdG9jb2wsIGltcGxlbWVudGVzIFRQcm90b2NvbCBhbmQgd3JhcHMgYSBjb25jcmV0ZSBwcm90b2NvbC4KKy8vLyBVc2VmdWwgZm9yIGdlbmVyaWNhbGx5IHN1YmNsYXNzaW5nIHByb3RvY29scyB0byBvdmVycmlkZSBzcGVjaWZpYyBtZXRob2RzIAorLy8vIChpLmUuIFRNdWx0aXBsZXhlZFByb3RvY29sKQorb3BlbiBjbGFzcyBUV3JhcHBlZFByb3RvY29sPFByb3RvY29sOiBUUHJvdG9jb2w+IDogVFByb3RvY29sIHsKKyAgdmFyIGNvbmNyZXRlUHJvdG9jb2w6IFByb3RvY29sCisgIAorICBwdWJsaWMgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnRyYW5zcG9ydAorICAgIH0KKyAgICBzZXQgeworICAgICAgY29uY3JldGVQcm90b2NvbC50cmFuc3BvcnQgPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorCisgIHB1YmxpYyByZXF1aXJlZCBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCkgeworICAgIHNlbGYuY29uY3JldGVQcm90b2NvbCA9IFByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisgIH0KKyAgCisgIC8vIFJlYWQgbWV0aG9kcworICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUTWVzc2FnZVR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZFN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkRmllbGRCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZEZpZWxkRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRNYXBCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRNYXBFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU2V0QmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU2V0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRMaXN0QmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZExpc3RFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEJvb2wgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBVSW50OCB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MzIgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQ2NCB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERhdGEgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgLy8gV3JpdGUgbWV0aG9kcworICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBuYW1lLCB0eXBlOiBtZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKG5hbWU6IG5hbWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwgZmllbGRJRDogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKG5hbWU6IG5hbWUsIHR5cGU6IGZpZWxkVHlwZSwgZmllbGRJRDogZmllbGRJRCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlRmllbGRTdG9wKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTWFwQmVnaW4oa2V5VHlwZToga2V5VHlwZSwgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZU1hcEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBlbGVtZW50VHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlU2V0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogZWxlbWVudFR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVMaXN0RW5kKCkKKyAgfQorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBTdHJpbmcpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEJvb2wpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFVJbnQ4KSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MTYpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQ2NCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRG91YmxlKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyBkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKGRhdGEpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RocmlmdC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RocmlmdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWM2OGYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVGhyaWZ0LnN3aWZ0CkBAIC0wLDAgKzEsMyBAQAorY2xhc3MgVGhyaWZ0IHsKKwlsZXQgdmVyc2lvbiA9ICIwLjEzLjAiCit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvVGVzdHMvTGludXhNYWluLnN3aWZ0IGIvbGliL3N3aWZ0L1Rlc3RzL0xpbnV4TWFpbi5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODhmZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1Rlc3RzL0xpbnV4TWFpbi5zd2lmdApAQCAtMCwwICsxLDggQEAKK2ltcG9ydCBYQ1Rlc3QKK0B0ZXN0YWJsZSBpbXBvcnQgVGhyaWZ0VGVzdHMKKworWENUTWFpbihbCisgICAgIHRlc3RDYXNlKFRocmlmdFRlc3RzLmFsbFRlc3RzKSwKKyAgICAgdGVzdENhc2UoVEJpbmFyeVByb3RvY29sVGVzdHMuYWxsVGVzdHMpLAorICAgICB0ZXN0Q2FzZShUQ29tcGFjdFByb3RvY29sVGVzdHMuYWxsVGVzdHMpLAorXSkKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQmluYXJ5UHJvdG9jb2xUZXN0cy5zd2lmdCBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQmluYXJ5UHJvdG9jb2xUZXN0cy5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmE1NTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RCaW5hcnlQcm90b2NvbFRlc3RzLnN3aWZ0CkBAIC0wLDAgKzEsMTY4IEBACisvLworLy8gIFRCaW5hcnlQcm90b2NvbFRlc3RzLnN3aWZ0CisvLyAgVGhyaWZ0CisvLworLy8gIENyZWF0ZWQgYnkgQ2hyaXN0b3BoZXIgU2ltcHNvbiBvbiA4LzE4LzE2LgorLy8KKy8vCisKK2ltcG9ydCBYQ1Rlc3QKK2ltcG9ydCBGb3VuZGF0aW9uCitAdGVzdGFibGUgaW1wb3J0IFRocmlmdAorCisKKy8vLyBUZXN0aW5nIEJpbmFyeSBwcm90b2NvbCByZWFkL3dyaXRlIGFnYWluc3QgaXRzZWxmCisvLy8gVXNlcyBzZXBhcmF0ZSByZWFkL3dyaXRlIHRyYW5zcG9ydC9wcm90b2NvbHMgCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xUZXN0czogWENUZXN0Q2FzZSB7CisgIHZhciB0cmFuc3BvcnQ6IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQgPSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0KGZsdXNoSGFuZGxlcjogeworICAgICQwLnJlc2V0KHJlYWRCdWZmZXI6ICQxKQorICB9KQorICAKKyAgdmFyIHByb3RvOiBUQmluYXJ5UHJvdG9jb2whCisgIAorICBvdmVycmlkZSBmdW5jIHNldFVwKCkgeworICAgIHN1cGVyLnNldFVwKCkKKyAgICBwcm90byA9IFRCaW5hcnlQcm90b2NvbChvbjogdHJhbnNwb3J0KQorICAgIHRyYW5zcG9ydC5yZXNldCgpCisgIH0KKyAgCisgIG92ZXJyaWRlIGZ1bmMgdGVhckRvd24oKSB7CisgICAgc3VwZXIudGVhckRvd24oKQorICAgIHRyYW5zcG9ydC5yZXNldCgpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDhXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBVSW50OCA9IDI1MAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IFVJbnQ4ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIFVJbnQ4LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50MTZXcml0ZVJlYWQoKSB7CisKKyAgICBsZXQgd3JpdGVWYWw6IEludDE2ID0gMTIzMTIKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKyAgICBsZXQgcmVhZFZhbDogSW50MTYgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50MTYsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQzMldyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDMyID0gMjAyOTIzNAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEludDMyID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDMyLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50NjRXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBJbnQ2NCA9IDIzNDIzNDk4MTM3NDEzNAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEludDY0ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDY0LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0RG91YmxlV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogRG91YmxlID0gMy4xNDE1OTI2CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogRG91YmxlID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwLjAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggRG91YmxlLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0Qm9vbFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEJvb2wgPSB0cnVlCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogQm9vbCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gZmFsc2UKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggQm9vbCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdFN0cmluZ1dyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IFN0cmluZyA9ICJIZWxsbyBXb3JsZCIKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBTdHJpbmchCisgICAgZG8geworICAgICAgcmVhZFZhbCA9IHRyeSBwcm90by5yZWFkKCkKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiRXJyb3IgcmVhZGluZyBcKGVycm9yKSIpCisgICAgICByZXR1cm4KKyAgICB9CisgICAgCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIFN0cmluZywgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdERhdGFXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBEYXRhID0gIkRhdGEgV29ybGQiLmRhdGEodXNpbmc6IC51dGY4KSEKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBEYXRhID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAiR29vZGJ5ZSBXb3JsZCIuZGF0YSh1c2luZzogLnV0ZjgpIQorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBEYXRhLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0U3RydWN0V3JpdGVSZWFkKCkgeworICAgIGxldCBtc2cgPSAiVGVzdCBQcm90b2NvbCBFcnJvciIKKyAgICBsZXQgd3JpdGVWYWwgPSBUQXBwbGljYXRpb25FcnJvcihlcnJvcjogLnByb3RvY29sRXJyb3IsIG1lc3NhZ2U6IG1zZykKKyAgICBkbyB7CisgICAgICB0cnkgd3JpdGVWYWwud3JpdGUodG86IHByb3RvKQorICAgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkNhdWdodCBFcnJvciBhdHRlbXB0aW5nIHRvIHdyaXRlIFwoZXJyb3IpIikKKyAgICB9CisgICAgCisgICAgZG8geworICAgICAgbGV0IHJlYWRWYWwgPSB0cnkgVEFwcGxpY2F0aW9uRXJyb3IucmVhZChmcm9tOiBwcm90bykKKyAgICAgIFhDVEFzc2VydEVxdWFsKHJlYWRWYWwuZXJyb3IudGhyaWZ0RXJyb3JDb2RlLCB3cml0ZVZhbC5lcnJvci50aHJpZnRFcnJvckNvZGUsICJFcnJvciBjYXNlIG1pc21hdGNoLCBleHBlY3RlZCBcKHJlYWRWYWwuZXJyb3IpIGdvdCBcKHdyaXRlVmFsLmVycm9yKSIpCisgICAgICBYQ1RBc3NlcnRFcXVhbChyZWFkVmFsLm1lc3NhZ2UsIHdyaXRlVmFsLm1lc3NhZ2UsICJFcnJvciBtZXNzYWdlIG1pc21hdGNoLCBleHBlY3RlZCBcKHJlYWRWYWwubWVzc2FnZSkgZ290IFwod3JpdGVWYWwubWVzc2FnZSkiKQorICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJDYXVnaHQgRXJyb3IgYXR0ZW1wdGluZyB0byByZWFkIFwoZXJyb3IpIikKKyAgICB9CisgIH0KKyAgZnVuYyB0ZXN0VW5zYWZlQml0Y2FzdFVwZGF0ZSgpIHsKKyAgICBsZXQgdmFsdWU6IERvdWJsZSA9IDMuMTQxNTkKKyAgICBsZXQgdmFsOiBJbnQ2NCA9IDMxNDE1OTI2CisgICAgbGV0IHV2YWw6IFVJbnQ2NCA9IDMxNDE1OTI2CisgICAgCisgICAgbGV0IGk2NCA9IEludDY0KGJpdFBhdHRlcm46IHZhbHVlLmJpdFBhdHRlcm4pCisgICAgbGV0IHViYyA9IHVuc2FmZUJpdENhc3QodmFsdWUsIHRvOiBJbnQ2NC5zZWxmKQorICAgIAorICAgIFhDVEFzc2VydEVxdWFsKGk2NCwgdWJjLCAiQml0Y2FzdCBEb3VibGUtPiBpNjQgVmFsdWVzIGRvbid0IG1hdGNoIikKKyAgICAKKyAgICBsZXQgZGJsID0gRG91YmxlKGJpdFBhdHRlcm46IFVJbnQ2NCh2YWwpKQorICAgIGxldCB1YmRiID0gdW5zYWZlQml0Q2FzdCh2YWwsIHRvOiBEb3VibGUuc2VsZikKKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbChkYmwsIHViZGIsICJCaXRjYXN0IGk2NCAtPiBEb3VibGUgVmFsdWVzIGRvbid0IG1hdGNoIikKKyAgICAKKyAgICBsZXQgZGIyID0gRG91YmxlKGJpdFBhdHRlcm46IHV2YWwpCisgICAgbGV0IHVzYmMyID0gdW5zYWZlQml0Q2FzdCh1dmFsLCB0bzogRG91YmxlLnNlbGYpCisgICAgCisgICAgWENUQXNzZXJ0RXF1YWwoZGIyLCB1c2JjMiwgIkJpdGNhc3QgdTY0IC0+IERvdWJsZSBWYWx1ZXMgZG9uJ3QgbWF0Y2giKQorCisgICAgCisgIH0KKyAgCisgIHN0YXRpYyB2YXIgYWxsVGVzdHMgOiBbKFN0cmluZywgKFRCaW5hcnlQcm90b2NvbFRlc3RzKSAtPiAoKSB0aHJvd3MgLT4gVm9pZCldIHsKKyAgICByZXR1cm4gWworICAgICAgKCJ0ZXN0SW50OFdyaXRlUmVhZCIsIHRlc3RJbnQ4V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDE2V3JpdGVSZWFkIiwgdGVzdEludDE2V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDMyV3JpdGVSZWFkIiwgdGVzdEludDMyV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDY0V3JpdGVSZWFkIiwgdGVzdEludDY0V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdERvdWJsZVdyaXRlUmVhZCIsIHRlc3REb3VibGVXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0Qm9vbFdyaXRlUmVhZCIsIHRlc3RCb29sV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdFN0cmluZ1dyaXRlUmVhZCIsIHRlc3RTdHJpbmdXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0RGF0YVdyaXRlUmVhZCIsIHRlc3REYXRhV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdFN0cnVjdFdyaXRlUmVhZCIsIHRlc3RTdHJ1Y3RXcml0ZVJlYWQpCisgICAgXQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVENvbXBhY3RQcm90b2NvbFRlc3RzLnN3aWZ0IGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RDb21wYWN0UHJvdG9jb2xUZXN0cy5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODJjMjYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RDb21wYWN0UHJvdG9jb2xUZXN0cy5zd2lmdApAQCAtMCwwICsxLDIxMCBAQAorLy8KKy8vICBUQ29tcGFjdFByb3RvY29sVGVzdHMuc3dpZnQKKy8vICBUaHJpZnQKKy8vCisvLyAgQ3JlYXRlZCBieSBDaHJpc3RvcGhlciBTaW1wc29uIG9uIDgvMTkvMTYuCisvLworLy8KKworaW1wb3J0IFhDVGVzdAoraW1wb3J0IEZvdW5kYXRpb24KK0B0ZXN0YWJsZSBpbXBvcnQgVGhyaWZ0CisKKworLy8vIFRlc3RpbmcgQmluYXJ5IHByb3RvY29sIHJlYWQvd3JpdGUgYWdhaW5zdCBpdHNlbGYKKy8vLyBVc2VzIHNlcGFyYXRlIHJlYWQvd3JpdGUgdHJhbnNwb3J0L3Byb3RvY29scworY2xhc3MgVENvbXBhY3RQcm90b2NvbFRlc3RzOiBYQ1Rlc3RDYXNlIHsKKyAgdmFyIHRyYW5zcG9ydDogVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCA9IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQoZmx1c2hIYW5kbGVyOiB7CisgICAgJDAucmVzZXQocmVhZEJ1ZmZlcjogJDEpCisgIH0pCisgIHZhciBwcm90bzogVENvbXBhY3RQcm90b2NvbCEKKyAgCisgIG92ZXJyaWRlIGZ1bmMgc2V0VXAoKSB7CisgICAgc3VwZXIuc2V0VXAoKQorICAgIHByb3RvID0gVENvbXBhY3RQcm90b2NvbChvbjogdHJhbnNwb3J0KQorICAgIHRyYW5zcG9ydC5yZXNldCgpCisgIH0KKyAgCisgIG92ZXJyaWRlIGZ1bmMgdGVhckRvd24oKSB7CisgICAgc3VwZXIudGVhckRvd24oKQorICAgIHRyYW5zcG9ydC5yZXNldCgpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDhXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBVSW50OCA9IDI1MAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorICAgIGxldCByZWFkVmFsOiBVSW50OCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBVSW50OCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDE2V3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogSW50MTYgPSAxMjMxMgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEludDE2ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDE2LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50MzJXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBJbnQzMiA9IDIwMjkyMzQKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBJbnQzMiA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQzMiwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDY0V3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogSW50NjQgPSAyMzQyMzQ5ODEzNzQxMzQKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBJbnQ2NCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQ2NCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdERvdWJsZVdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IERvdWJsZSA9IDMuMTQxNTkyNgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IERvdWJsZSA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMC4wCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIERvdWJsZSwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEJvb2xXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBCb29sID0gdHJ1ZQorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEJvb2wgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IGZhbHNlCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEJvb2wsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RTdHJpbmdXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBTdHJpbmcgPSAiSGVsbG8gV29ybGQiCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogU3RyaW5nIQorICAgIGRvIHsKKyAgICAgIHJlYWRWYWwgPSB0cnkgcHJvdG8ucmVhZCgpCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkVycm9yIHJlYWRpbmcgXChlcnJvcikiKQorICAgICAgcmV0dXJuCisgICAgfQorICAgIAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBTdHJpbmcsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3REYXRhV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogRGF0YSA9ICJEYXRhIFdvcmxkIi5kYXRhKHVzaW5nOiAudXRmOCkhCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogRGF0YSA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gIkdvb2RieWUgV29ybGQiLmRhdGEodXNpbmc6IC51dGY4KSEKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggRGF0YSwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdFN0cnVjdFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgbXNnID0gIlRlc3QgUHJvdG9jb2wgRXJyb3IiCisgICAgbGV0IHdyaXRlVmFsID0gVEFwcGxpY2F0aW9uRXJyb3IoZXJyb3I6IC5wcm90b2NvbEVycm9yLCBtZXNzYWdlOiBtc2cpCisgICAgZG8geworICAgICAgdHJ5IHdyaXRlVmFsLndyaXRlKHRvOiBwcm90bykKKyAgICAgIHRyeSB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkNhdWdodCBFcnJvciBhdHRlbXB0aW5nIHRvIHdyaXRlIFwoZXJyb3IpIikKKyAgICB9CisgICAgCisgICAgZG8geworICAgICAgbGV0IHJlYWRWYWwgPSB0cnkgVEFwcGxpY2F0aW9uRXJyb3IucmVhZChmcm9tOiBwcm90bykKKyAgICAgIFhDVEFzc2VydEVxdWFsKHJlYWRWYWwuZXJyb3IudGhyaWZ0RXJyb3JDb2RlLCB3cml0ZVZhbC5lcnJvci50aHJpZnRFcnJvckNvZGUsICJFcnJvciBjYXNlIG1pc21hdGNoLCBleHBlY3RlZCBcKHJlYWRWYWwuZXJyb3IpIGdvdCBcKHdyaXRlVmFsLmVycm9yKSIpCisgICAgICBYQ1RBc3NlcnRFcXVhbChyZWFkVmFsLm1lc3NhZ2UsIHdyaXRlVmFsLm1lc3NhZ2UsICJFcnJvciBtZXNzYWdlIG1pc21hdGNoLCBleHBlY3RlZCBcKHJlYWRWYWwubWVzc2FnZSkgZ290IFwod3JpdGVWYWwubWVzc2FnZSkiKQorICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJDYXVnaHQgRXJyb3IgYXR0ZW1wdGluZyB0byByZWFkIFwoZXJyb3IpIikKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDMyWmlnWmFnKCkgeworICAgIGxldCB6ZXJvOiBJbnQzMiA9IDAKKyAgICBsZXQgb25lOiBJbnQzMiA9IDEKKyAgICBsZXQgbk9uZTogSW50MzIgPSAtMQorICAgIGxldCB0d286IEludDMyID0gMgorICAgIGxldCBuVHdvOiBJbnQzMiA9IC0yCisgICAgbGV0IG1heCA9IEludDMyLm1heAorICAgIGxldCBtaW4gPSBJbnQzMi5taW4KKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKHplcm8pLCBVSW50MzIoMCksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXCh6ZXJvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoMCksIHplcm8sICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXCh6ZXJvKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyhuT25lKSwgVUludDMyKDEpLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwobk9uZSkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKDEpLCBuT25lLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwobk9uZSkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcob25lKSwgVUludDMyKDIpLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwob25lKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoMiksIG9uZSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG9uZSkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcoblR3byksIFVJbnQzMigzKSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG5Ud28pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMigzKSwgblR3bywgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG5Ud28pIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKHR3byksIFVJbnQzMig0KSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKHR3bykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKDQpLCB0d28sICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXCh0d28pIikKKworICAgIGxldCB1TWF4TWludXNPbmU6IFVJbnQzMiA9IFVJbnQzMi5tYXggLSAxCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcobWF4KSwgdU1heE1pbnVzT25lLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwobWF4KSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIodU1heE1pbnVzT25lKSwgbWF4LCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwobWF4KSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyhtaW4pLCBVSW50MzIubWF4LCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwobWluKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoVUludDMyLm1heCksIG1pbiwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG1pbikiKQorICB9CisKKyAgZnVuYyB0ZXN0SW50NjRaaWdaYWcoKSB7CisgICAgbGV0IHplcm86IEludDY0ID0gMAorICAgIGxldCBvbmU6IEludDY0ID0gMQorICAgIGxldCBuT25lOiBJbnQ2NCA9IC0xCisgICAgbGV0IHR3bzogSW50NjQgPSAyCisgICAgbGV0IG5Ud286IEludDY0ID0gLTIKKyAgICBsZXQgbWF4ID0gSW50NjQubWF4CisgICAgbGV0IG1pbiA9IEludDY0Lm1pbgorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcoemVybyksIFVJbnQ2NCgwKSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKHplcm8pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCgwKSwgemVybywgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKHplcm8pIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKG5PbmUpLCBVSW50NjQoMSksICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChuT25lKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoMSksIG5PbmUsICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChuT25lKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyhvbmUpLCBVSW50NjQoMiksICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChvbmUpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCgyKSwgb25lLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwob25lKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyhuVHdvKSwgVUludDY0KDMpLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwoblR3bykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDMpLCBuVHdvLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwoblR3bykiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcodHdvKSwgVUludDY0KDQpLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwodHdvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoNCksIHR3bywgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKHR3bykiKQorCisgICAgbGV0IHVNYXhNaW51c09uZTogVUludDY0ID0gVUludDY0Lm1heCAtIDEKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyhtYXgpLCB1TWF4TWludXNPbmUsICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChtYXgpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCh1TWF4TWludXNPbmUpLCBtYXgsICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChtYXgpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKG1pbiksIFVJbnQ2NC5tYXgsICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChtaW4pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NChVSW50NjQubWF4KSwgbWluLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobWluKSIpCisgIH0KKyAgCisgIHN0YXRpYyB2YXIgYWxsVGVzdHMgOiBbKFN0cmluZywgKFRDb21wYWN0UHJvdG9jb2xUZXN0cykgLT4gKCkgdGhyb3dzIC0+IFZvaWQpXSB7CisgICAgcmV0dXJuIFsKKyAgICAgICgidGVzdEludDhXcml0ZVJlYWQiLCB0ZXN0SW50OFdyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQxNldyaXRlUmVhZCIsIHRlc3RJbnQxNldyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQzMldyaXRlUmVhZCIsIHRlc3RJbnQzMldyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQ2NFdyaXRlUmVhZCIsIHRlc3RJbnQ2NFdyaXRlUmVhZCksCisgICAgICAoInRlc3REb3VibGVXcml0ZVJlYWQiLCB0ZXN0RG91YmxlV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEJvb2xXcml0ZVJlYWQiLCB0ZXN0Qm9vbFdyaXRlUmVhZCksCisgICAgICAoInRlc3RTdHJpbmdXcml0ZVJlYWQiLCB0ZXN0U3RyaW5nV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdERhdGFXcml0ZVJlYWQiLCB0ZXN0RGF0YVdyaXRlUmVhZCksCisgICAgICAoInRlc3RTdHJ1Y3RXcml0ZVJlYWQiLCB0ZXN0U3RydWN0V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDMyWmlnWmFnIiwgdGVzdEludDMyWmlnWmFnKSwKKyAgICAgICgidGVzdEludDY0WmlnWmFnIiwgdGVzdEludDY0WmlnWmFnKQorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RocmlmdFRlc3RzLnN3aWZ0IGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RocmlmdFRlc3RzLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNDdmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVGhyaWZ0VGVzdHMuc3dpZnQKQEAgLTAsMCArMSwxOCBAQAoraW1wb3J0IFhDVGVzdAorQHRlc3RhYmxlIGltcG9ydCBUaHJpZnQKKworY2xhc3MgVGhyaWZ0VGVzdHM6IFhDVGVzdENhc2UgeworICBmdW5jIHRlc3RWZXJzaW9uKCkgeworICAgIFhDVEFzc2VydEVxdWFsKFRocmlmdCgpLnZlcnNpb24sICIwLjEzLjAiKQorICB9CisKKyAgZnVuYyB0ZXN0X2luX2FkZHJfZXh0ZW5zaW9uKCkgeworCisgIH0KKworICBzdGF0aWMgdmFyIGFsbFRlc3RzIDogWyhTdHJpbmcsIChUaHJpZnRUZXN0cykgLT4gKCkgdGhyb3dzIC0+IFZvaWQpXSB7CisgICAgcmV0dXJuIFsKKyAgICAgICgidGVzdFZlcnNpb24iLCB0ZXN0VmVyc2lvbiksCisgICAgXQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvdHMvLmdpdGlnbm9yZSBiL2xpYi90cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZjI1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdHMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKK3Rlc3QvYnVpbGQvCit0ZXN0L2dlbi0qCmRpZmYgLS1naXQgYS9saWIvdHMvR3J1bnRmaWxlLmpzIGIvbGliL3RzL0dydW50ZmlsZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2Q3OWY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3RzL0dydW50ZmlsZS5qcwpAQCAtMCwwICsxLDE2MyBAQAorLy9UbyBidWlsZCBkaXN0L3RocmlmdC5qcywgZGlzdC90aHJpZnQubWluLmpzIGFuZCBkb2MvKgorLy9ydW4gZ3J1bnQgYXQgdGhlIGNvbW1hbmQgbGluZSBpbiB0aGlzIGRpcmVjdG9yeS4KKy8vUHJlcmVxdWlzaXRlczoKKy8vIE5vZGUgU2V0dXAgLSAgIG5vZGVqcy5vcmcKKy8vIEdydW50IFNldHVwIC0gIG5wbSBpbnN0YWxsICAvL3JlYWRzIHRoZSAuL3BhY2thZ2UuanNvbiBhbmQgaW5zdGFsbHMgcHJvamVjdCBkZXBlbmRlbmNpZXMKKy8vIFJ1biBncnVudCAtICAgIG5weCBncnVudCAgLy8gdXNlcyBwcm9qZWN0LWxvY2FsIGluc3RhbGxlZCB2ZXJzaW9uIG9mIGdydW50IChmcm9tIHBhY2thZ2UuanNvbikKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihncnVudCkgeworICAndXNlIHN0cmljdCc7CisKKyAgZ3J1bnQuaW5pdENvbmZpZyh7CisgICAgcGtnOiBncnVudC5maWxlLnJlYWRKU09OKCdwYWNrYWdlLmpzb24nKSwKKyAgICBjb25jYXQ6IHsKKyAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgc2VwYXJhdG9yOiAnOycKKyAgICAgIH0sCisgICAgICBkaXN0OiB7CisgICAgICAgIHNyYzogWydzcmMvKiovKi5qcyddLAorICAgICAgICBkZXN0OiAnZGlzdC88JT0gcGtnLm5hbWUgJT4uanMnCisgICAgICB9CisgICAgfSwKKyAgICBzaGVsbDogeworICAgICAgSW5zdGFsbFRocmlmdEpTOiB7CisgICAgICAgIGNvbW1hbmQ6ICdta2RpciAtcCB0ZXN0L2J1aWxkL3RzL2xpYjsgY3AgLi4vanMvc3JjL3RocmlmdC5qcyB0ZXN0L2J1aWxkL3RzL3RocmlmdC5qcycKKyAgICAgIH0sCisgICAgICBJbnN0YWxsVGhyaWZ0Tm9kZUpTRGVwOiB7CisgICAgICAgIGNvbW1hbmQ6ICdjZCAuLi8uLjsgbnBtIGluc3RhbGwnCisgICAgICB9LAorICAgICAgSW5zdGFsbFRlc3RMaWJzOiB7CisgICAgICAgIGNvbW1hbmQ6ICdjZCB0ZXN0OyBhbnQgZG93bmxvYWRfanNsaWJzJworICAgICAgfSwKKyAgICAgIFRocmlmdEdlbjogeworICAgICAgICBjb21tYW5kOiBbCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLWpzJywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOnRzIC0tb3V0IHRlc3QvZ2VuLWpzIC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICAgICdta2RpciAtcCB0ZXN0L2dlbi1ub2RlanMnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6bm9kZSx0cyAtLW91dCB0ZXN0L2dlbi1ub2RlanMgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgIF0uam9pbignICYmICcpCisgICAgICB9LAorICAgICAgVGhyaWZ0QnJvd3NlcmlmeU5vZGVJbnQ2NDogeworICAgICAgICBjb21tYW5kOiBbCisgICAgICAgICAgJy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvYmluL2NtZC5qcyAuL25vZGVfbW9kdWxlcy9ub2RlLWludDY0L0ludDY0LmpzIC1zIEludDY0IC1vIHRlc3QvYnVpbGQvanMvbGliL0ludDY0LmpzJywKKyAgICAgICAgICAnLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9iaW4vY21kLmpzIC4uL25vZGVqcy9saWIvdGhyaWZ0L2ludDY0X3V0aWwuanMgLXMgSW50NjRVdGlsIC1vIHRlc3QvYnVpbGQvanMvbGliL0ludDY0VXRpbC5qcycsCisgICAgICAgICAgJy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvYmluL2NtZC5qcyAuL25vZGVfbW9kdWxlcy9qc29uLWludDY0L2luZGV4LmpzIC1zIEpTT05JbnQ2NCAtbyB0ZXN0L2J1aWxkL2pzL2xpYi9KU09OSW50NjQuanMnCisgICAgICAgIF0uam9pbignICYmICcpCisgICAgICB9LAorICAgICAgVGhyaWZ0R2VuSW50NjQ6IHsKKyAgICAgICAgY29tbWFuZDogJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqczp0cyAtbyB0ZXN0IC4uLy4uL3Rlc3QvSW50NjRUZXN0LnRocmlmdCcKKyAgICAgIH0sCisgICAgICBUaHJpZnRUZXN0U2VydmVyOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBhc3luYzogdHJ1ZSwKKyAgICAgICAgICBleGVjT3B0aW9uczogeworICAgICAgICAgICAgY3dkOiAiLi90ZXN0IiwKKyAgICAgICAgICAgIGVudjoge05PREVfUEFUSDogIi4uLy4uL25vZGVqcy9saWI6Li4vLi4vLi4vbm9kZV9tb2R1bGVzIn0KKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIGNvbW1hbmQ6ICJub2RlIHNlcnZlcl9odHRwLmpzIiwKKyAgICAgIH0sCisgICAgICBCdWlsZFRTOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBleGVjT3B0aW9uczogeworICAgICAgICAgICAgY3dkOiAiLi90ZXN0IiwKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIGNvbW1hbmQgOiAiLi4vbm9kZV9tb2R1bGVzL3R5cGVzY3JpcHQvYmluL3RzYyAtLWxpc3RGaWxlcyAtLW91dERpciBidWlsZC90cyIKKyAgICAgIH0sCisgICAgICBCcm93c2VyaWZ5Q29tcGlsZWRUUzogeworICAgICAgICBjb21tYW5kOiBbCisgICAgICAgICAgIi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvYmluL2NtZC5qcyB0ZXN0L2J1aWxkL3RzL3Rlc3QuanMgLW8gdGVzdC9idWlsZC90cy9saWIvdGVzdC5qcyAtLXN0YW5kYWxvbmUgdGVzdCIsCisgICAgICAgICAgIi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvYmluL2NtZC5qcyB0ZXN0L2J1aWxkL3RzL3Rlc3QtaW50NjQuanMgLW8gdGVzdC9idWlsZC90cy9saWIvdGVzdC1pbnQ2NC5qcyAtLXN0YW5kYWxvbmUgdGVzdEludDY0IiwKKyAgICAgICAgXS5qb2luKCIgJiYgIikKKyAgICAgIH0sCisgICAgICBJbnN0YWxsR2VuZXJhdGVkQ29kZTogeworICAgICAgICBjb21tYW5kOiBbCisgICAgICAgICAgIm1rZGlyIC1wIHRlc3QvYnVpbGQvdHMiLAorICAgICAgICAgICJjcCAtciB0ZXN0L2dlbi1qcyB0ZXN0L2J1aWxkL3RzIgorICAgICAgICBdLmpvaW4oIiAmJiAiKQorICAgICAgfSwKKyAgICB9LAorICAgIHF1bml0OiB7CisgICAgICBUaHJpZnRKUzogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgdXJsczogWworICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNfSW50NjQ6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1pbnQ2NC5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgIH0sCisgICAganNoaW50OiB7CisgICAgICAvLyBUaGUgbWFpbiBUaHJpZnQgbGlicmFyeSBmaWxlLiBub3QgZXM2IHlldCA6KAorICAgICAgbGliOiB7CisgICAgICAgIHNyYzogWycuLi9qcy9zcmMvKiovKi5qcyddLAorICAgICAgfSwKKyAgICAgIC8vIFRoZSB0ZXN0IGZpbGVzIHVzZSBlczYKKyAgICAgIHRlc3Q6IHsKKyAgICAgICAgc3JjOiBbJ0dydW50ZmlsZS5qcycsICd0ZXN0LyouanMnXSwKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGVzdmVyc2lvbjogNiwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIGdlbl9qc19jb2RlOiB7CisgICAgICAgIHNyYzogWyd0ZXN0L2dlbi1qcy8qLmpzJ10sCisgICAgICB9LAorICAgICAgZ2VuX25vZGVfY29kZTogeworICAgICAgICBzcmM6IFsndGVzdC9nZW4tbm9kZWpzLyouanMnXSwKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIG5vZGU6IHRydWUsCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgfSwKKyAgfSk7CisKKyAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1jb250cmliLWpzaGludCcpOworICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWNvbnRyaWItcXVuaXQnKTsKKyAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1zaGVsbC1zcGF3bicpOworCisgIGdydW50LnJlZ2lzdGVyVGFzaygnd2FpdCcsICdXYWl0IGp1c3Qgb25lIHNlY29uZCBmb3IgdGhlIHNlcnZlciB0byBzdGFydCcsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgZG9uZSA9IHRoaXMuYXN5bmMoKTsKKyAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworICAgICAgZG9uZSh0cnVlKTsKKyAgICB9LCAxMDAwKTsKKyAgfSk7CisKKyAgZ3J1bnQucmVnaXN0ZXJUYXNrKCdpbnN0YWxsQW5kR2VuZXJhdGUnLCBbCisgICAgJ3NoZWxsOkluc3RhbGxUaHJpZnRKUycsCisgICAgJ3NoZWxsOkluc3RhbGxUaHJpZnROb2RlSlNEZXAnLAorICAgICdzaGVsbDpUaHJpZnRHZW4nLAorICAgICdzaGVsbDpUaHJpZnRCcm93c2VyaWZ5Tm9kZUludDY0JywKKyAgICAnc2hlbGw6VGhyaWZ0R2VuSW50NjQnLAorICAgICdzaGVsbDpJbnN0YWxsVGVzdExpYnMnLAorICAgICdzaGVsbDpCdWlsZFRTJywKKyAgICAnc2hlbGw6SW5zdGFsbEdlbmVyYXRlZENvZGUnLAorICAgICdzaGVsbDpCcm93c2VyaWZ5Q29tcGlsZWRUUycsCisgIF0pOworCisgIGdydW50LnJlZ2lzdGVyVGFzaygndGVzdCcsIFsKKyAgICAnaW5zdGFsbEFuZEdlbmVyYXRlJywKKyAgICAnanNoaW50JywKKyAgICAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcicsCisgICAgJ3dhaXQnLAorICAgICdxdW5pdDpUaHJpZnRKUycsCisgICAgJ3F1bml0OlRocmlmdEpTX0ludDY0JywKKyAgICAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcjpraWxsJywKKyAgXSk7CisgIGdydW50LnJlZ2lzdGVyVGFzaygnZGVmYXVsdCcsIFsndGVzdCddKTsKK307CmRpZmYgLS1naXQgYS9saWIvdHMvTWFrZWZpbGUuYW0gYi9saWIvdHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlYTIwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDU4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgorIyBXZSBjYWxsIGluc3RhbGwgdHdpY2UgdG8gd29yayBhcm91bmQgbnBtIGlzc3VlcworIworaWYgSEFWRV9OUE0KKworcHJlcmVxOgorCSQoTlBNKSBpbnN0YWxsIHx8ICQoTlBNKSBpbnN0YWxsCisJJChOUE0pIGxpc3QKKworY2hlY2stbG9jYWw6IHByZXJlcSBhbGwKKwkuL25vZGVfbW9kdWxlcy8uYmluL2dydW50CisKK2RvYzogcHJlcmVxCisJLi9ub2RlX21vZHVsZXMvLmJpbi9ncnVudCBqc2RvYworCitlbmRpZgorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBkaXN0CisJJChSTSkgLXIgZG9jCisJJChSTSkgLXIgbm9kZV9tb2R1bGVzCisJJChSTSkgLXIgdGVzdC9idWlsZC8KKwkkKFJNKSAtciB0ZXN0L2dlbi0qLworCitkaXN0LWhvb2s6CisJJChSTSkgLXIgJChkaXN0ZGlyKS9kaXN0LworCSQoUk0pIC1yICQoZGlzdGRpcikvZG9jLworCSQoUk0pIC1yICQoZGlzdGRpcikvbm9kZV9tb2R1bGVzLworCSQoUk0pIC1yICQoZGlzdGRpcikvdGVzdC9idWlsZC8KKwkkKFJNKSAtciAkKGRpc3RkaXIpL3Rlc3QvZ2VuLSovCisKK0VYVFJBX0RJU1QgPSBcCisgICAgY29kaW5nX3N0YW5kYXJkcy5tZCBcCisgICAgR3J1bnRmaWxlLmpzIFwKKyAgICBwYWNrYWdlLmpzb24gXAorICAgIHBhY2thZ2UtbG9jay5qc29uIFwKKyAgICB0aHJpZnQuZC50cyBcCisgICAgdHNjb25maWcuanNvbgorCmRpZmYgLS1naXQgYS9saWIvdHMvZGlzdC90aHJpZnQuanMgYi9saWIvdHMvZGlzdC90aHJpZnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90cy9kaXN0L3RocmlmdC5qcwpkaWZmIC0tZ2l0IGEvbGliL3RzL2Rpc3QvdGhyaWZ0Lm1pbi5qcyBiL2xpYi90cy9kaXN0L3RocmlmdC5taW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxNGYyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90cy9kaXN0L3RocmlmdC5taW4uanMKQEAgLTAsMCArMSBAQAorLyohIHRocmlmdCAwNy0wMS0yMDE5ICovCmRpZmYgLS1naXQgYS9saWIvdHMvcGFja2FnZS1sb2NrLmpzb24gYi9saWIvdHMvcGFja2FnZS1sb2NrLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwYTdmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90cy9wYWNrYWdlLWxvY2suanNvbgpAQCAtMCwwICsxLDQ5NTUgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgInZlcnNpb24iOiAiMC4xMy4wIiwKKyAgImxvY2tmaWxlVmVyc2lvbiI6IDEsCisgICJyZXF1aXJlcyI6IHRydWUsCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgIkB0eXBlcy9ub2RlIjogeworICAgICAgInZlcnNpb24iOiAiMTAuMTIuMTgiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9ub2RlLy0vbm9kZS0xMC4xMi4xOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZmgrcEFxdDR4UnpQZnFBNmVoM1oyeTZmeVphdlJJdW12amhhQ0w3NTMrVFZrR0tHaHBQZXlySkcySmZ0RDBUOXE0R0YwMEtqZWZzUStQUU5EZFdRYVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIkB0eXBlcy9ub2RlLWludDY0IjogeworICAgICAgInZlcnNpb24iOiAiMC40LjI5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXMvbm9kZS1pbnQ2NC8tL25vZGUtaW50NjQtMC40LjI5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ySFh2ZW5MVGovQ2NzbU5BZWJhQk9oeFEyTXFFR2wzeVhaWmNaMjFYWVIrZ3pHVFRjcE95Mk40SXhwdlRDejQ4bG95UU5hdEh2Zm42R2hJYmJaMVIzUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiQHR5cGVzL25vZGUiOiAiKiIKKyAgICAgIH0KKyAgICB9LAorICAgICJAdHlwZXMvcGhhbnRvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMi41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXMvcGhhbnRvbS8tL3BoYW50b20tMy4yLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTdtMzZEb0tTdlpnQkdXcDB4aUo3NGVIbnVvdHlycER5UTZtK2xlcnM1aU12VzRRWCtSdkJFTm43UENqTml4N09WcVBXbEJNKzdBcXpZVklRN05yS3JBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJAdHlwZXMvcXVuaXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjUuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzL3F1bml0Ly0vcXVuaXQtMi41LjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVZIaTJsRWQ0L3pwOE9Pb3VmNDNKWEdKSjVaeEh2ZExMMWRVMFlha3A2SXk3M1NqcHVYbDd5andBd21oMXFoVHY4a3JEZ0h0ZVN3YXlTcisrdVhYOVlRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJKU09OU3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0pTT05TdHJlYW0vLS9KU09OU3RyZWFtLTEuMy41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1FK2lydU5PWThWVjlzNEpFYmUxYU5FbTZNaXN6UFJyL1VmY0hNejBUUWgxQlhTeEhLK0FTVjFSNlc0SHBqQmhTZVMrNTRQSXNBTUNCbXdEMDZMTHNxUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAianNvbnBhcnNlIjogIl4xLjIuMCIsCisgICAgICAgICJ0aHJvdWdoIjogIj49Mi4yLjcgPDMiCisgICAgICB9CisgICAgfSwKKyAgICAiYWJicmV2IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FiYnJldi8tL2FiYnJldi0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbm5lOS9JaVEvaHpJaFk2cGREbmJCdHo3RGpQVEtyWTAwUC96dlBTbTVwT0ZrbDZ4dUdyR25Ybi9WdFROTmZOdEFmWjkvMVJ0ZWhrc3pVOXFjVGlpMFE9PSIKKyAgICB9LAorICAgICJhY29ybiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hY29ybi8tL2Fjb3JuLTYuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WWTRpNUVLU0trb2ZZMkkrNlFMVGJUVE4vVXZFUVBDbzZlaXd6elNhU1dmcGFEaE9tU3RNQ01vZDZ3bXVQY2lOcStYUzBmYUNnbEZ1MmxIWnBkSFV0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYWNvcm4tZHluYW1pYy1pbXBvcnQiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWNvcm4tZHluYW1pYy1pbXBvcnQvLS9hY29ybi1keW5hbWljLWltcG9ydC00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZDNPRWpRVjRST3BvZmxzblVBOEhvem9JUjUwNFRGeE5pdllFVWk2dXd6MElZaEJrVERYR3VXbE5kTXR5YlJ0M25xVngvTDZYcU10MEZ4a1h1V0taaHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFjb3JuLW5vZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWNvcm4tbm9kZS8tL2Fjb3JuLW5vZGUtMS42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXJJaE5FWnVOSThpYlFjTDdBTm0vbUd5UHVrSWFac1JOWDlwc0ZOUVVSeUpXMG51Nms4d2pTRGxkMjB6NnYybURCV3FYMTNwSUVuazlnR1pKSElsRVhnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhY29ybiI6ICJeNi4wLjIiLAorICAgICAgICAiYWNvcm4tZHluYW1pYy1pbXBvcnQiOiAiXjQuMC4wIiwKKyAgICAgICAgImFjb3JuLXdhbGsiOiAiXjYuMS4wIiwKKyAgICAgICAgInh0ZW5kIjogIl40LjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJhY29ybi13YWxrIjogeworICAgICAgInZlcnNpb24iOiAiNi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fjb3JuLXdhbGsvLS9hY29ybi13YWxrLTYuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PdFV3NkpVVGd4QTJRb3FxbXJtUTdGMk5ZcWlCUGkvTDJqcUh5RnRsbGhPVXZYWVFYZjBaMUNZVWluSWZ5VDRiVENHbXJBN2dYOUZ2SEE4MXV6Q29Wdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYWdlbnQtYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hZ2VudC1iYXNlLy0vYWdlbnQtYmFzZS00LjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSlZ3WE1yOW5IWVRVWHNCRktVcWhKd3ZsY1lVL2JscmVPRVVraE5SMmVYWkl2d2QrYytvNVY0TWdEUEtXbk1TLzU2YXdOM1RSeklQK0tvUG4rcm9RdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNpZnkiOiAiXjUuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImFqdiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hanYvLS9hanYtNi43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJaWFB2aUJUdGZtdGthOW45c3kxTjVNNWI4MkNieFdJUjZISWlzNHMzV1FUWERKYW1jLzBncENXTkd6NkVXZFdwNERPZmp6SmZoei9BUzl6VlBqaldnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmYXN0LWRlZXAtZXF1YWwiOiAiXjIuMC4xIiwKKyAgICAgICAgImZhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6ICJeMC40LjEiLAorICAgICAgICAidXJpLWpzIjogIl40LjIuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJhbGlnbi10ZXh0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FsaWduLXRleHQvLS9hbGlnbi10ZXh0LTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRE5rS1ZoQ1Q4MTBLbVNWc0lyY0dsRFA2MFJjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4yIiwKKyAgICAgICAgImxvbmdlc3QiOiAiXjEuMC4xIiwKKyAgICAgICAgInJlcGVhdC1zdHJpbmciOiAiXjEuNS4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYW5zaS1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXJlZ2V4Ly0vYW5zaS1yZWdleC0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXc3TTZ0ZTQyRFliZzVpandSb3JuN3lmV1ZOOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTMuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WVDBaSTZrWlJkVGg4WXlKdzNTTWJZbS91K05xZnNBeEVwV08wUGY5c3E4L2U5NFd4eE9wUEt4OUZSMUZseUN0T1ZETk9RKzhudGxxRnhpUmMrcjVxQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItY29udmVydCI6ICJeMS45LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYXJncGFyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FyZ3BhcnNlLy0vYXJncGFyc2UtMS4wLjEwLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1vNVJveTZ0Tkc0U0wvRk9rQ0FONlJ6amlha1pTMjVSTFlGcmNNdHRKcWJkZDhCV3JuQStmR3o1N2lONVBiMDZwdkJHdmw1Z1EwQjQ4ZEpsc2xYdm9UZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3ByaW50Zi1qcyI6ICJ+MS4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3NwcmludGYtanMvLS9zcHJpbnRmLWpzLTEuMC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUJPYVNiMllvbFRWUFBkQVZJRFl6dUZjcGZpdz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJhcnItZGlmZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnItZGlmZi8tL2Fyci1kaWZmLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMWtZUWRQNi83SEhuNFZJMWRob3ltbDNIeFNBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFyci1mbGF0dGVuIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fyci1mbGF0dGVuLy0vYXJyLWZsYXR0ZW4tMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUwzaEtWNVIvcDVvODFSN08wMklHbndwRG1rcDZFOTgyWGh0YnV3U2UzTzRxT3RNTU10b2RpY0FTQTFDbnkyVSthQ1hjTnBtbCttNGRQc3ZzSjNqYXRnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnItdW5pb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyLXVuaW9uLy0vYXJyLXVuaW9uLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNDVzSnJxbmUrR2FvOGdiaWlLOWprWnV1T2NRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LWVhY2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktZWFjaC8tL2FycmF5LWVhY2gtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wNVN2REFXckYxS0VidWRUb2ZJUm9GdWd4RTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktZmlsdGVyIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LWZpbHRlci8tL2FycmF5LWZpbHRlci0wLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZhalBMaVppanRjeWdEV0IvU0gyZkt6Uzd1dz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS1maW5kLWluZGV4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LWZpbmQtaW5kZXgvLS9hcnJheS1maW5kLWluZGV4LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM3dFS29TaCtGa3U5cHZseU93cVdvZXhCaDZFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS1tYXAvLS9hcnJheS1tYXAtMC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pS0s2dHowYzk3elZ3YkVZb0FQMmIyWmZwbUk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktcmVkdWNlIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXJlZHVjZS8tL2FycmF5LXJlZHVjZS0wLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUZ6aVowLy9SeDlrNFBrUjVVbDIrSjR5clh5cz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS1zbGljZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS1zbGljZS8tL2FycmF5LXNsaWNlLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1CMXFNRDNSQlA3TzhvMEgyS2JyWER5QjBJY2Nlak1GMTUrODdMdmxvcjEyT05QUkhQNmdUalhNTmt0L2QzWnVPR2JBZTY2aEZtYUNmRUNJMjRVZnA2dz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktdW5pcXVlIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXVuaXF1ZS8tL2FycmF5LXVuaXF1ZS0wLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFKUzNYVXZFOXMxbm52TWtTcC9ZOUdyaTFDZz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc24xIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzbjEvLS9hc24xLTAuMi40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qeHd6UXBMUWpTbVdYZ3dhQ1pFOU56K2dsQUcwMXlGMVFuV2diaEd3SEk1QTZGUklFWTZJVnF0SGhJZXBIcUk3L2t5RXlRRWFnQkM1bUJFRmxJWXZkZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZXItYnVmZmVyIjogIn4yLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhc24xLmpzIjogeworICAgICAgInZlcnNpb24iOiAiNC4xMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc24xLmpzLy0vYXNuMS5qcy00LjEwLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXAzMmNPRjVxMFpxczl1QmlPTktZTG02QkNsQ29CQ001TzlKZmVVU2xuUUxCVHhZZFRLK3BXK25YZmxtOFVrS2QyVVlsRWJZejVxRWkwSnVaUjlja1N3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJibi5qcyI6ICJeNC4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4xIiwKKyAgICAgICAgIm1pbmltYWxpc3RpYy1hc3NlcnQiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImFzc2VydCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3NlcnQvLS9hc3NlcnQtMS40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tWkV0V1JnMnRhYjFzMFhBOEg3dndJL0dYWkU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidXRpbCI6ICIwLjEwLjMiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImluaGVyaXRzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5oZXJpdHMvLS9pbmhlcml0cy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zWDBJMHlhMFFqNVdqdjl4bjVHd3NjdmZhZkU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAidXRpbCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjEwLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3V0aWwvLS91dGlsLTAuMTAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ldnNhL2xDQVVrWkluajIzL2c3VGVUTnF3UGs9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaW5oZXJpdHMiOiAiMi4wLjEiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYXNzZXJ0LXBsdXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXNzZXJ0LXBsdXMvLS9hc3NlcnQtcGx1cy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLThTNFBQRjEzc0xITjJSUnBRdVRwYkI1TjFTVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3NpZ24tc3ltYm9scyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3NpZ24tc3ltYm9scy8tL2Fzc2lnbi1zeW1ib2xzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV1daL1FmcmRUeURNdkN1NWE0MVBmM2pzQTJjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5jIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMvLS9hc3luYy0xLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTdHcGhybFpJREF3OHNrSEpWaGppQ0pMNVp5bz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luYy1saW1pdGVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLWxpbWl0ZXIvLS9hc3luYy1saW1pdGVyLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qcC91Rm5vb09pTytMMjExZVpPb1N5enBPSVRNWHgxckJJVGF1WXlrRzNCUllQdThoMFVjeHNQTkIwNFJSNXZvNFR5ejMrYXkxN3RSNkpWZjlxellXZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmNraXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmNraXQvLS9hc3luY2tpdC0wLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXg1N1pmMzgweTQ4cm9ieVhrTHpEWmtkTFMzaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhdG9iIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F0b2IvLS9hdG9iLTIuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1XbTZ1a29hT0dKaS83M3AvY2wyR3ZMalRJNUpNMWsvTzE0aXNENzNZTUw4U3RySC83L2xSRmdtZzhuSUNaZ0QzYlpadmp3Q0d4dE1PRDN3V05BdThjZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXdzLXNpZ24yIjogeworICAgICAgInZlcnNpb24iOiAiMC43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F3cy1zaWduMi8tL2F3cy1zaWduMi0wLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRHNkpDVFNwV1I4dEwyK0cxK2FwOGJQK2RxZz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhd3M0IjogeworICAgICAgInZlcnNpb24iOiAiMS44LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F3czQvLS9hd3M0LTEuOC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SZVp4dk5ISU92ODhGbFQ3cnhjWElJQzBmUHQ0S1pxWmJPbGl2eVd0WEx0OEVTeDg0emQza01DNmlLNWpWZVMycXQrZzdmdFM3eWU0ZmkwNlg1cnRSUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmFieWxvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC4wLWJldGEuMTkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JhYnlsb24vLS9iYWJ5bG9uLTcuMC4wLWJldGEuMTkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVZnMEM5cy9SRVg2L1dJWE4zN1VLcHY1WmhSaTZBNHBqSGxwa0UzNCs4L2E2YzJXMVE2OTJuM2htYytTWkc1bEtSbmFFeExVYnh0SjFTVlQrS2FDUS9BPT0iCisgICAgfSwKKyAgICAiYmFsYW5jZWQtbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFsYW5jZWQtbWF0Y2gvLS9iYWxhbmNlZC1tYXRjaC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWliVFJtYXNyN2tuZUZrNmdLNG5PUmkxeHQyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJiYXNlIjogeworICAgICAgInZlcnNpb24iOiAiMC4xMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYXNlLy0vYmFzZS0wLjExLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTVUNlA0eFBncHAwWURGdlNXd0VaNE5vRTNhTTRRQlFYRHptVmJyYUNrRmo4ekhNK21iYThTeXFCNURiWld5UjdtWUhvNlk3QmRRbzNNb0E0bTBUZVFnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjYWNoZS1iYXNlIjogIl4xLjAuMSIsCisgICAgICAgICJjbGFzcy11dGlscyI6ICJeMC4zLjUiLAorICAgICAgICAiY29tcG9uZW50LWVtaXR0ZXIiOiAiXjEuMi4xIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMS4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIiwKKyAgICAgICAgIm1peGluLWRlZXAiOiAiXjEuMi4wIiwKKyAgICAgICAgInBhc2NhbGNhc2UiOiAiXjAuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZHA2NnJ6OUtZNnJUcjU2Tk1FeWJ2bm0vc09ZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW01aG5IVGtjVnNQZnF4M0FLbHl0dElQYjdKK1h5a0h2SlAyQjliWkRqbGhMSW9FcTRYb0s2NFZnN2JvWmxWV1lLNkxVWTk0ZFlQRUU3TGgwWmtaS2NRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYlJYeTFGbXRBb0NqUWtWbUlWWXd1dXFERlViYU9lRGptZWQxdE9HUHJzTWh0SkE0ckQ5dGtnQTBGMXFKM2dSRlJYY0hZVmtkZWFQNTBRNXJFL2pMUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTEuMC4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItMmVpczVXcVFHVjdwZW9vRHlMbU5FUFVycHM5K1NYWDVjOXBMM3hFQis0ZTlIbkd1RGE3bUI3a0h4SHc0Q2JxUzlrMVQyaE9IM21pTDhuOFd0aVlWdGc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJiYXNlNjQtanMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFzZTY0LWpzLy0vYmFzZTY0LWpzLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jY2F2L3lHdm9hODBCUURsakN4c21tUTNYdng2MC9VcEJJaWo1UU4yMVczd0JpL2hoSUM5T29PK0tMcHU5SUpUUzlqNERSVkozYURERjljTVNvYTJsdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmNyeXB0LXBia2RmIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JjcnlwdC1wYmtkZi8tL2JjcnlwdC1wYmtkZi0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBEQWRPSnRxUS9tMmYvUEtFYVAyWTM0MkRwND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ0d2VldG5hY2wiOiAiXjAuMTQuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJibHVlYmlyZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ibHVlYmlyZC8tL2JsdWViaXJkLTMuNS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0vcUtQVVFsYVcxT3lSNTFXZUNQQnZSbkFsblpGVUprQ1NHNUh6R251SXFoZ3lKdEYrVDk0bEZubjMzZWlhempSbTJMQUhWeTJndU5uYXE0OFg5U0p1dz09IgorICAgIH0sCisgICAgImJuLmpzIjogeworICAgICAgInZlcnNpb24iOiAiNC4xMS44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ibi5qcy8tL2JuLmpzLTQuMTEuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSXRmWWZQTGtXSFVqY2tRQ2s4eEMrTHd4Z0s4TlljWHl3R2lnSmdTd09QOFkyaXlXVDRmMnZzWm5vT1hUVGJvK281eVhtSVVKNGduNTUzOFNPNVMzZ0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJyYWNlLWV4cGFuc2lvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJhY2UtZXhwYW5zaW9uLy0vYnJhY2UtZXhwYW5zaW9uLTEuMS4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItaUN1UEhERmdySFg3SDJ2RUkvNXhwejA3elNIQjAwVHB1Z3FobVl0Vm1NTzY1MThtQ3VSTW9PWUZsZEVCbDBnMTg3dWZvemRhSGdXS2NZRmI2MXFHaUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhbGFuY2VkLW1hdGNoIjogIl4xLjAuMCIsCisgICAgICAgICJjb25jYXQtbWFwIjogIjAuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImJyYWNlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icmFjZXMvLS9icmFjZXMtMi4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFOZGJuajlQOFBqZFhVNHliYVdMSzJJRjNqYy9Fb0RZYkM3QWF6VzZ0bzNUUnNmWHhzY0M5VVhPQjVpRGlFUXJreUliV3AyU0xRZGE0K1FBYTduYzN3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItZmxhdHRlbiI6ICJeMS4xLjAiLAorICAgICAgICAiYXJyYXktdW5pcXVlIjogIl4wLjMuMiIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAiZmlsbC1yYW5nZSI6ICJeNC4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIiwKKyAgICAgICAgInJlcGVhdC1lbGVtZW50IjogIl4xLjEuMiIsCisgICAgICAgICJzbmFwZHJhZ29uIjogIl4wLjguMSIsCisgICAgICAgICJzbmFwZHJhZ29uLW5vZGUiOiAiXjIuMC4xIiwKKyAgICAgICAgInNwbGl0LXN0cmluZyI6ICJeMy4wLjIiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImJyb3JhbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJvcmFuZC8tL2Jyb3JhbmQtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Fc0plL2tDa1hqd3lQcmhuV2dvTTVYc2lOeDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnJvd3Nlci1wYWNrIjogeworICAgICAgInZlcnNpb24iOiAiNi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJvd3Nlci1wYWNrLy0vYnJvd3Nlci1wYWNrLTYuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lcll1ZzhYb3F6VTNJZmNVOGZVZ3lIcXlPWHFJRTR0VVRUUSs3bXFValFsdm5Ya09PNk9sVDljL1pvSlZIWW9BYXFHeHIwOUNONTNHN1hJc080S3RXQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiSlNPTlN0cmVhbSI6ICJeMS4wLjMiLAorICAgICAgICAiY29tYmluZS1zb3VyY2UtbWFwIjogIn4wLjguMCIsCisgICAgICAgICJkZWZpbmVkIjogIl4xLjAuMCIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4xLjEiLAorICAgICAgICAidGhyb3VnaDIiOiAiXjIuMC4wIiwKKyAgICAgICAgInVtZCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYnJvd3Nlci1yZXNvbHZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icm93c2VyLXJlc29sdmUvLS9icm93c2VyLXJlc29sdmUtMS4xMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1leERpMUJZV0IvNnJhS0htRFRDaWNRZlRrcXdONWZpb01GVjRqOEJzZk1VNFIyREsvUWZaZks3a09Wa21XQ05BTmYwc25rQnpxR3FBSkJhbzlnWk1kUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVzb2x2ZSI6ICIxLjEuNyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAicmVzb2x2ZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuNyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS8tL3Jlc29sdmUtMS4xLjcudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSURFVTJDclN4ZTJlamdRUnM1TW9kZWlKNlhzPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImJyb3dzZXJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxNi4yLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXJpZnkvLS9icm93c2VyaWZ5LTE2LjIuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItelF0L0dkMStXK0lZK2gveFgyTllNVzRvclFXaHFTd3lWK3hzYmx5Y1R0cE91QjI3aDFmWmhoTlF1aXBKNHQ3OW9odzRQNG1NZW0wanAvWmtJU1F0alE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIkpTT05TdHJlYW0iOiAiXjEuMC4zIiwKKyAgICAgICAgImFzc2VydCI6ICJeMS40LjAiLAorICAgICAgICAiYnJvd3Nlci1wYWNrIjogIl42LjAuMSIsCisgICAgICAgICJicm93c2VyLXJlc29sdmUiOiAiXjEuMTEuMCIsCisgICAgICAgICJicm93c2VyaWZ5LXpsaWIiOiAifjAuMi4wIiwKKyAgICAgICAgImJ1ZmZlciI6ICJeNS4wLjIiLAorICAgICAgICAiY2FjaGVkLXBhdGgtcmVsYXRpdmUiOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbmNhdC1zdHJlYW0iOiAiXjEuNi4wIiwKKyAgICAgICAgImNvbnNvbGUtYnJvd3NlcmlmeSI6ICJeMS4xLjAiLAorICAgICAgICAiY29uc3RhbnRzLWJyb3dzZXJpZnkiOiAifjEuMC4wIiwKKyAgICAgICAgImNyeXB0by1icm93c2VyaWZ5IjogIl4zLjAuMCIsCisgICAgICAgICJkZWZpbmVkIjogIl4xLjAuMCIsCisgICAgICAgICJkZXBzLXNvcnQiOiAiXjIuMC4wIiwKKyAgICAgICAgImRvbWFpbi1icm93c2VyIjogIl4xLjIuMCIsCisgICAgICAgICJkdXBsZXhlcjIiOiAifjAuMS4yIiwKKyAgICAgICAgImV2ZW50cyI6ICJeMi4wLjAiLAorICAgICAgICAiZ2xvYiI6ICJeNy4xLjAiLAorICAgICAgICAiaGFzIjogIl4xLjAuMCIsCisgICAgICAgICJodG1sZXNjYXBlIjogIl4xLjEuMCIsCisgICAgICAgICJodHRwcy1icm93c2VyaWZ5IjogIl4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjEiLAorICAgICAgICAiaW5zZXJ0LW1vZHVsZS1nbG9iYWxzIjogIl43LjAuMCIsCisgICAgICAgICJsYWJlbGVkLXN0cmVhbS1zcGxpY2VyIjogIl4yLjAuMCIsCisgICAgICAgICJta2RpcnAiOiAiXjAuNS4wIiwKKyAgICAgICAgIm1vZHVsZS1kZXBzIjogIl42LjAuMCIsCisgICAgICAgICJvcy1icm93c2VyaWZ5IjogIn4wLjMuMCIsCisgICAgICAgICJwYXJlbnRzIjogIl4xLjAuMSIsCisgICAgICAgICJwYXRoLWJyb3dzZXJpZnkiOiAifjAuMC4wIiwKKyAgICAgICAgInByb2Nlc3MiOiAifjAuMTEuMCIsCisgICAgICAgICJwdW55Y29kZSI6ICJeMS4zLjIiLAorICAgICAgICAicXVlcnlzdHJpbmctZXMzIjogIn4wLjIuMCIsCisgICAgICAgICJyZWFkLW9ubHktc3RyZWFtIjogIl4yLjAuMCIsCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAiXjIuMC4yIiwKKyAgICAgICAgInJlc29sdmUiOiAiXjEuMS40IiwKKyAgICAgICAgInNoYXN1bSI6ICJeMS4wLjAiLAorICAgICAgICAic2hlbGwtcXVvdGUiOiAiXjEuNi4xIiwKKyAgICAgICAgInN0cmVhbS1icm93c2VyaWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJzdHJlYW0taHR0cCI6ICJeMi4wLjAiLAorICAgICAgICAic3RyaW5nX2RlY29kZXIiOiAiXjEuMS4xIiwKKyAgICAgICAgInN1YmFyZyI6ICJeMS4wLjAiLAorICAgICAgICAic3ludGF4LWVycm9yIjogIl4xLjEuMSIsCisgICAgICAgICJ0aHJvdWdoMiI6ICJeMi4wLjAiLAorICAgICAgICAidGltZXJzLWJyb3dzZXJpZnkiOiAiXjEuMC4xIiwKKyAgICAgICAgInR0eS1icm93c2VyaWZ5IjogIjAuMC4xIiwKKyAgICAgICAgInVybCI6ICJ+MC4xMS4wIiwKKyAgICAgICAgInV0aWwiOiAifjAuMTAuMSIsCisgICAgICAgICJ2bS1icm93c2VyaWZ5IjogIl4xLjAuMCIsCisgICAgICAgICJ4dGVuZCI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYnJvd3NlcmlmeS1hZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icm93c2VyaWZ5LWFlcy8tL2Jyb3dzZXJpZnktYWVzLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0rN0NIWHFHdXNwVW4vU2w1YU83RWEweFdHQXRFVFBYTlNBakhvNDhKZkxkUFdjTW5nMzNYZTR6bkZ2UXdlcWMvdXprNXpTT0kzSDUyQ1luakNmYjVoQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnVmZmVyLXhvciI6ICJeMS4wLjMiLAorICAgICAgICAiY2lwaGVyLWJhc2UiOiAiXjEuMC4wIiwKKyAgICAgICAgImNyZWF0ZS1oYXNoIjogIl4xLjEuMCIsCisgICAgICAgICJldnBfYnl0ZXN0b2tleSI6ICJeMS4wLjMiLAorICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4xIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJicm93c2VyaWZ5LWNpcGhlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icm93c2VyaWZ5LWNpcGhlci8tL2Jyb3dzZXJpZnktY2lwaGVyLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zUGhrejBBUktiZjRyUlF0MmhUcEFIcW40N1gzbGxMa1VHbit4RUp6TGp3WThMUnMycDB2N2xqdkk1RXlvUk8vbWV4ck51bk5FQ2lzWnMrZ3cyenoxdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnJvd3NlcmlmeS1hZXMiOiAiXjEuMC40IiwKKyAgICAgICAgImJyb3dzZXJpZnktZGVzIjogIl4xLjAuMCIsCisgICAgICAgICJldnBfYnl0ZXN0b2tleSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYnJvd3NlcmlmeS1kZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJvd3NlcmlmeS1kZXMvLS9icm93c2VyaWZ5LWRlcy0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQmlvTzF4ZjNoRnd6NGtjNmlCaEkzaWVERm9tcE1ock1sbkRGQzQvMC92ZDVNb2twdUFjM1IrTFlid1RBOUE1WWM5cHE5VVlQcWZmS3BXMk9idXdYNUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNpcGhlci1iYXNlIjogIl4xLjAuMSIsCisgICAgICAgICJkZXMuanMiOiAiXjEuMC4wIiwKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4xLjIiCisgICAgICB9CisgICAgfSwKKyAgICAiYnJvd3NlcmlmeS1yc2EiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icm93c2VyaWZ5LXJzYS8tL2Jyb3dzZXJpZnktcnNhLTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSWVDcit2YnlBcHp5K3ZzVE5XZW5BZFFUVlNRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJuLmpzIjogIl40LjEuMCIsCisgICAgICAgICJyYW5kb21ieXRlcyI6ICJeMi4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYnJvd3NlcmlmeS1zaWduIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXJpZnktc2lnbi8tL2Jyb3dzZXJpZnktc2lnbi00LjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFrNjJqbDE3Wll1cWEvYWxmbU1NdlhxVDBwZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJibi5qcyI6ICJeNC4xLjEiLAorICAgICAgICAiYnJvd3NlcmlmeS1yc2EiOiAiXjQuMC4wIiwKKyAgICAgICAgImNyZWF0ZS1oYXNoIjogIl4xLjEuMCIsCisgICAgICAgICJjcmVhdGUtaG1hYyI6ICJeMS4xLjIiLAorICAgICAgICAiZWxsaXB0aWMiOiAiXjYuMC4wIiwKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJwYXJzZS1hc24xIjogIl41LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJicm93c2VyaWZ5LXpsaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJvd3NlcmlmeS16bGliLy0vYnJvd3NlcmlmeS16bGliLTAuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1aOTQyUnlzSFhtSnJocWs4OEZtS0JWcS92NXRxbVNrRHo3cDU0Ry9NR3lqTW5DRkZuQzc5WFdOYmcrVnRhOFc2V2IycXRTWlRTeElHa0pyUnBDRkVpQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGFrbyI6ICJ+MS4wLjUiCisgICAgICB9CisgICAgfSwKKyAgICAiYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiNS4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci8tL2J1ZmZlci01LjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYytLbzBsb0RhRmZ1UFdpTDAybHM5WGQzR08zY1BWbVVvYlE2dDNyWE5VazMwNHU2aEdxKzhOL2tGaStRRUlLaHpLM3V3b2xWaEx6c3ptZkxtTUxucWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhc2U2NC1qcyI6ICJeMS4wLjIiLAorICAgICAgICAiaWVlZTc1NCI6ICJeMS4xLjQiCisgICAgICB9CisgICAgfSwKKyAgICAiYnVmZmVyLWZyb20iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLWZyb20vLS9idWZmZXItZnJvbS0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTVFjWEVVYkNLdEVvN2JocUVzNjU2MEh5ZDRYYW92WmxPL2s5VjNoalZVRi96d1c3S0JWZFNLNGdJdC9iendTOU1iUjVxb2IrRjVqdXNac2IwWVFLMkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1ZmZlci1zaGltcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItc2hpbXMvLS9idWZmZXItc2hpbXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tWGpPTVhPSXhrbXRoNU1DakRSMzd3UktpMUU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnVmZmVyLXhvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXIteG9yLy0vYnVmZmVyLXhvci0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUp1WWUwVUl2dHczVUxtNDJjcDdWSFlWZjZOaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWZmZXJ1dGlsIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlcnV0aWwvLS9idWZmZXJ1dGlsLTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi14b3dyeHZweG9qcWthZ1BjV1JRVlhabDBZWGhSaEF0QkVJcTNWb0VSMU5INU13MW4xbzBvamRzcHArR1MySi8vMmdDVnlyelFEQXBRNHVuR0YrUU9vQT09IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm5vZGUtZ3lwLWJ1aWxkIjogIn4zLjcuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJidWlsdGluLW1vZHVsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVpbHRpbi1tb2R1bGVzLy0vYnVpbHRpbi1tb2R1bGVzLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSnc4SGJGcHl3QzliWmFSOStVeGY0Nko0aVM4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1aWx0aW4tc3RhdHVzLWNvZGVzIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1aWx0aW4tc3RhdHVzLWNvZGVzLy0vYnVpbHRpbi1zdGF0dXMtY29kZXMtMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oWmdvZU9JYm1PSEdaQ1hnUFFGMGVJOVdudWc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FjaGUtYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYWNoZS1iYXNlLy0vY2FjaGUtYmFzZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQUtjZFRuRlNXQVRkNS9HQ1BSeHIyQ2h3SUo4NUNleXJFeWpSSGxLeFE1NmQ0WEpNR3ltMHVBaUtuMHhiTE9HT2wzK3lScE9UaTQ4NGRWQ0VjNUFVelE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbGxlY3Rpb24tdmlzaXQiOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbXBvbmVudC1lbWl0dGVyIjogIl4xLjIuMSIsCisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImhhcy12YWx1ZSI6ICJeMS4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIiwKKyAgICAgICAgInNldC12YWx1ZSI6ICJeMi4wLjAiLAorICAgICAgICAidG8tb2JqZWN0LXBhdGgiOiAiXjAuMy4wIiwKKyAgICAgICAgInVuaW9uLXZhbHVlIjogIl4xLjAuMCIsCisgICAgICAgICJ1bnNldC12YWx1ZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FjaGVkLXBhdGgtcmVsYXRpdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FjaGVkLXBhdGgtcmVsYXRpdmUvLS9jYWNoZWQtcGF0aC1yZWxhdGl2ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNXIyR3Fzb0ViNHFNVFROOUorV3pYZmpvditoanhUK2ozdTVLK2tJVk5Jd0FkOTlETENKRTlwQklNUDFxVmV5YlY2SmlpakwzODVPejBEY1l4ZmJPSWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhbWVsY2FzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2UvLS9jYW1lbGNhc2UtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mQjBXMW5taHUrV2NvQ3lzN1BzQkhpQWZXaDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FtZWxjYXNlLWtleXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2Uta2V5cy8tL2NhbWVsY2FzZS1rZXlzLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUl2dXIvM3lnUmtGSHZvZGt5SVR5UnVQa3VjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6ICJeMi4wLjAiLAorICAgICAgICAibWFwLW9iaiI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FzZWxlc3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEyLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nhc2VsZXNzLy0vY2FzZWxlc3MtMC4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJnY0lmK0VBenlDWlVNSkJvbENEUmh4VWR3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhdGhhcnNpcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYXRoYXJzaXMvLS9jYXRoYXJzaXMtMC44LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tTXlKREtaUzNTN3c1d3Mza2xNUS81NlEvSXM9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUtY29udHJpYiI6ICJ+MC4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2VudGVyLWFsaWduIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NlbnRlci1hbGlnbi8tL2NlbnRlci1hbGlnbi0wLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFnMHlZcHR1NlhJZ0JCSEwxRVlja0h2Q3Q2MD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbGlnbi10ZXh0IjogIl4wLjEuMyIsCisgICAgICAgICJsYXp5LWNhY2hlIjogIl4xLjAuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJjaGFsayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTIuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PYk42aDF2MmZUSlNtVVhvUzNuTVE5MkxiREs5YmU0VFYrNkcrb21RbEdKRmRjVVg1aGVLaTFMWjFZblJNSWd3VExFajNFMjRiVDZ0WW5pNTBybENmUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjMuMi4xIiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIsCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeNS4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2lwaGVyLWJhc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2lwaGVyLWJhc2UvLS9jaXBoZXItYmFzZS0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS2todDV5ZTZaR213djQwdVVEWnp0YXlUMlRoTFFHZm5qL1Q3MU4vWHplWmVvM25mOGZveVc3ekdUc1BZa0V5YTNtNWYzY0F5cEgrcWU3WU9yTTFVMlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiY2xhc3MtdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xhc3MtdXRpbHMvLS9jbGFzcy11dGlscy0wLjMuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcU9oUGEvRmo3czZUWThIOGVzR3U1UU5wTU1ReHo3OWgrdXJ6ck5ZTjZtbis5Qm54bERHZjVRWitYZUNEc3hTalBxc1NSNTZYT1pPSm1wZXVybkxNZWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci11bmlvbiI6ICJeMy4xLjAiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiLAorICAgICAgICAic3RhdGljLWV4dGVuZCI6ICJeMC4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY2xpIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsaS8tL2NsaS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlvRjFOUEpMK2tsUXcwMVRMVWpzdkdJYmpCUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleGl0IjogIjAuMS4yIiwKKyAgICAgICAgImdsb2IiOiAiXjcuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgImNsaXVpIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsaXVpLy0vY2xpdWktMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TMGRYWVArQUpreDJMRG9YR1FNdWtjZitvTkU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2VudGVyLWFsaWduIjogIl4wLjEuMSIsCisgICAgICAgICJyaWdodC1hbGlnbiI6ICJeMC4xLjEiLAorICAgICAgICAid29yZHdyYXAiOiAiMC4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAiY29mZmVlc2NyaXB0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2ZmZWVzY3JpcHQvLS9jb2ZmZWVzY3JpcHQtMS4xMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNTZxREFaRis5aUd6WFlvNTgwamMzUjIzNHo0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbGxlY3Rpb24tdmlzaXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sbGVjdGlvbi12aXNpdC8tL2NvbGxlY3Rpb24tdmlzaXQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TOEEzUEJaTHd5a2JUVGFNZ3B6eHFBcFozS0E9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWFwLXZpc2l0IjogIl4xLjAuMCIsCisgICAgICAgICJvYmplY3QtdmlzaXQiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImNvbG9yIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLy0vY29sb3ItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpDcGQ1K3MwczB0N3AzcEhRS3BuSjBUcFFLS2RsZVA3MUxXY0EwYXFpbGpwaXVBa09TVUZOL2R5SDhad0YwaFJtRmxySXVSaHVmZHMxUXlFUDlFQit3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xvci1jb252ZXJ0IjogIl4xLjkuMSIsCisgICAgICAgICJjb2xvci1zdHJpbmciOiAiXjEuNS4yIgorICAgICAgfQorICAgIH0sCisgICAgImNvbG9yLWNvbnZlcnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjkuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3ItY29udmVydC8tL2NvbG9yLWNvbnZlcnQtMS45LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFmQVV0ZCt2RmRBdEZRY0M4Q0N5WXQxZllXeFNxQWlLMmNTRDZ6REI4TjNjcHNFQkF2UnhwOXpPR2c2Ry9TSEhKWUFUODgvYXovSXVER0FMc05WYkdnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xvci1uYW1lIjogIjEuMS4zIgorICAgICAgfQorICAgIH0sCisgICAgImNvbG9yLW5hbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3ItbmFtZS8tL2NvbG9yLW5hbWUtMS4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wOUJWaTlpY1F2ZVYzVUl5ajNRSU1jcFR2Q1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29sb3Itc3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLXN0cmluZy8tL2NvbG9yLXN0cmluZy0xLjUuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZEMyQzVxZVdvWWt4a2k1VUFYYXBkanFPNjcyQU00dlp1UEdSUWZPOGI1SEt1S0dCYktXcElUeURZTjdUT0ZLdlJXN2tPZ0FuMzc0NmNsREJNREp5UXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLW5hbWUiOiAiXjEuMC4wIiwKKyAgICAgICAgInNpbXBsZS1zd2l6emxlIjogIl4wLjIuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb2xvcm5hbWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9ybmFtZXMvLS9jb2xvcm5hbWVzLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK0lpUU1HaGNmRS81NHFWWjlRZCt0MnFCYjVZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbG9ycyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9ycy8tL2NvbG9ycy0xLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUZvcEhBWFZyYW45Um9Temd5WHY2S01DRTdXTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2xvcnNwYWNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yc3BhY2UvLS9jb2xvcnNwYWNlLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1wSTNidFd5aXV6N0tlbjBCV2g5RWx6c212MmJNOUFoQTdwc1hpYjRhblVYeS9vcmZaL0UwTWJRd2hTT0cvOUw4aExsYWxxclUwVWhPdXF4VzFZam1Wdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3IiOiAiMy4wLngiLAorICAgICAgICAidGV4dC1oZXgiOiAiMS4wLngiCisgICAgICB9CisgICAgfSwKKyAgICAiY29tYmluZS1zb3VyY2UtbWFwIjogeworICAgICAgInZlcnNpb24iOiAiMC44LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbWJpbmUtc291cmNlLW1hcC8tL2NvbWJpbmUtc291cmNlLW1hcC0wLjguMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBZME44RUxCaHZ6NElxam9BVjlVVU5MWG1vcz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb252ZXJ0LXNvdXJjZS1tYXAiOiAifjEuMS4wIiwKKyAgICAgICAgImlubGluZS1zb3VyY2UtbWFwIjogIn4wLjYuMCIsCisgICAgICAgICJsb2Rhc2gubWVtb2l6ZSI6ICJ+My4wLjMiLAorICAgICAgICAic291cmNlLW1hcCI6ICJ+MC41LjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY29tYmluZWQtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbWJpbmVkLXN0cmVhbS8tL2NvbWJpbmVkLXN0cmVhbS0xLjAuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYnJXbDl5NnZPQjF4WVBaY3BaZGUzTjl6REJ5WFRvc0FlTURvNHAxd3pvNlVNT1g0dnVtQitUUDFSWjc2c2ZFNk1kNjhRME5KU3JFL2diZXpkNFVsK3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlbGF5ZWQtc3RyZWFtIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb21wb25lbnQtZW1pdHRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21wb25lbnQtZW1pdHRlci8tL2NvbXBvbmVudC1lbWl0dGVyLTEuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRTNrWTF0ZUNnL2ZmZW10OFdtUGhRT2FVSmVZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbmNhdC1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uY2F0LW1hcC8tL2NvbmNhdC1tYXAtMC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yS2xyMTMvV2pmZDVPbk1EYWp1ZzFVQmRSM3M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29uY2F0LXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25jYXQtc3RyZWFtLy0vY29uY2F0LXN0cmVhbS0xLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMjdIQmdoSnhqaVp0SWszWWN2bi80a2JKay8xdVp1SkZmdVBFbnM2TGFFdnB2RzFmMGhUZWE4bGlscm91eW85bVZjMkdXZGNFWjhPTG9HbVNBRGxyQ3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJ1ZmZlci1mcm9tIjogIl4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjMiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjIuMiIsCisgICAgICAgICJ0eXBlZGFycmF5IjogIl4wLjAuNiIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb25zb2xlLWJyb3dzZXJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uc29sZS1icm93c2VyaWZ5Ly0vY29uc29sZS1icm93c2VyaWZ5LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOENRY1JYTUtuOFl5T3lCdHZ6anR4MEhRdXhBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRhdGUtbm93IjogIl4wLjEuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb25zdGFudHMtYnJvd3NlcmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25zdGFudHMtYnJvd3NlcmlmeS8tL2NvbnN0YW50cy1icm93c2VyaWZ5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtd2d1VzJNWVhkSXF2SEJZQ0YyRE5KL3k0eTNVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbnZlcnQtc291cmNlLW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbnZlcnQtc291cmNlLW1hcC8tL2NvbnZlcnQtc291cmNlLW1hcC0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNDbklkK24rU2JNV0h6dnpaemlJNGdScG1HQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb3B5LWRlc2NyaXB0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29weS1kZXNjcmlwdG9yLy0vY29weS1kZXNjcmlwdG9yLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWjI5dXM4T1psOEx1R3NPcEpQMWhKSFNQVjQwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvcmUtdXRpbC1pcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb3JlLXV0aWwtaXMvLS9jb3JlLXV0aWwtaXMtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZjFVSWdxaXZGcTFlcXR4UU1sQWRVVUR3YWM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY3JlYXRlLWVjZGgiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY3JlYXRlLWVjZGgvLS9jcmVhdGUtZWNkaC00LjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR2JFSFFQTU9zd0dwS1hNOWtDV1ZycmVtVWNCbWp0ZVVhUTAxVDlya0tDUERYZlVIWDBJb1A5THBIWW8yTlBGYW1wYTRlKy9wRkRjM2pRZHhyeFFMYXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJuLmpzIjogIl40LjEuMCIsCisgICAgICAgICJlbGxpcHRpYyI6ICJeNi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY3JlYXRlLWhhc2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jcmVhdGUtaGFzaC8tL2NyZWF0ZS1oYXNoLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi16MDBiQ0dOSERHOG1IQWtQN0N0VDFxVnUrYkZRVVBqWXEvNEl2M0Mza1dqVEZWMTB6SWpmU29lcVhvOUFzd3M4Z3dTSERHai9obDJ1NE9HSWphcGVDZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2lwaGVyLWJhc2UiOiAiXjEuMC4xIiwKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJtZDUuanMiOiAiXjEuMy40IiwKKyAgICAgICAgInJpcGVtZDE2MCI6ICJeMi4wLjEiLAorICAgICAgICAic2hhLmpzIjogIl4yLjQuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjcmVhdGUtaG1hYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NyZWF0ZS1obWFjLy0vY3JlYXRlLWhtYWMtMS4xLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU1KRzlsaWlaK29nYzRUelV3dXZiRVIxSlJkZ3ZVRlNCNStWUi9nNWg4MmZHYUlSV01XZGR0S0JIaTcvc1ZoZmpRWjZTZWhseWh2UVlyY1lrYVVJcExnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaXBoZXItYmFzZSI6ICJeMS4wLjMiLAorICAgICAgICAiY3JlYXRlLWhhc2giOiAiXjEuMS4wIiwKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJyaXBlbWQxNjAiOiAiXjIuMC4wIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjAuMSIsCisgICAgICAgICJzaGEuanMiOiAiXjIuNC44IgorICAgICAgfQorICAgIH0sCisgICAgImNyb3NzLXNwYXduIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nyb3NzLXNwYXduLy0vY3Jvc3Mtc3Bhd24tNi4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVUVkxyQlN0N2ZqYkR5Z3o4MDVwTW5zdElzMlZUQk5rUm0wcXhaZCtNN0E1WERkeFZSV081TXhHQlhaaGpZNGNxTFlMZHRyR3FSZjhtQlBtendTcFdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJuaWNlLXRyeSI6ICJeMS4wLjQiLAorICAgICAgICAicGF0aC1rZXkiOiAiXjIuMC4xIiwKKyAgICAgICAgInNlbXZlciI6ICJeNS41LjAiLAorICAgICAgICAic2hlYmFuZy1jb21tYW5kIjogIl4xLjIuMCIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjkiCisgICAgICB9CisgICAgfSwKKyAgICAiY3J5cHRvLWJyb3dzZXJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEyLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NyeXB0by1icm93c2VyaWZ5Ly0vY3J5cHRvLWJyb3dzZXJpZnktMy4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mejRzcEloK3puak8yVmpMK0lkaEVwUkozWU42c016SVRTQmlqazZGSzJVdlRxcnVTUVcrL2NDWlRTTnNNaVpOdlVlcTBDcXVyRitkQWJ5aUdPWTZXZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnJvd3NlcmlmeS1jaXBoZXIiOiAiXjEuMC4wIiwKKyAgICAgICAgImJyb3dzZXJpZnktc2lnbiI6ICJeNC4wLjAiLAorICAgICAgICAiY3JlYXRlLWVjZGgiOiAiXjQuMC4wIiwKKyAgICAgICAgImNyZWF0ZS1oYXNoIjogIl4xLjEuMCIsCisgICAgICAgICJjcmVhdGUtaG1hYyI6ICJeMS4xLjAiLAorICAgICAgICAiZGlmZmllLWhlbGxtYW4iOiAiXjUuMC4wIiwKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJwYmtkZjIiOiAiXjMuMC4zIiwKKyAgICAgICAgInB1YmxpYy1lbmNyeXB0IjogIl40LjAuMCIsCisgICAgICAgICJyYW5kb21ieXRlcyI6ICJeMi4wLjAiLAorICAgICAgICAicmFuZG9tZmlsbCI6ICJeMS4wLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY3VycmVudGx5LXVuaGFuZGxlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jdXJyZW50bHktdW5oYW5kbGVkLy0vY3VycmVudGx5LXVuaGFuZGxlZC0wLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1JM3pQK3F4a2U5NW1tRTJuZGRzRjYzNVYrbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS1maW5kLWluZGV4IjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJkYXNoZGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGFzaGRhc2gvLS9kYXNoZGFzaC0xLjE0LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oVHo2RDN5K0wrMWQ0Z01tdU4xWUVEWDI0dkE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImRhdGUtbm93IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RhdGUtbm93Ly0vZGF0ZS1ub3ctMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02dlE1L1UxSVNLMTA1Y3g5dnZJQVp5dWVORnM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGF0ZWZvcm1hdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGF0ZWZvcm1hdC8tL2RhdGVmb3JtYXQtMS4wLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbnhKTFoxbE1rMy8zQnBNdVNtUXN5bzI3L3VrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdldC1zdGRpbiI6ICJeNC4wLjEiLAorICAgICAgICAibWVvdyI6ICJeMy4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVidWciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy0yLjYuOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYkM3RWxyZEphSm5QYkFQKzFFb3RZdnFac2IzZWNsNXdpNkJmaTZCSlRVY05vd3A2Y3ZzcGcwalh6blJUS0RqbS9FN0FkZ0ZCVmVBUFZNTmNLR3NITUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1zIjogIjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImRlY2FtZWxpemUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVjYW1lbGl6ZS8tL2RlY2FtZWxpemUtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05bE5ORlJTQ2FiSURVdWUrNG05UUg1b1pFcEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVjb2RlLXVyaS1jb21wb25lbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVjb2RlLXVyaS1jb21wb25lbnQvLS9kZWNvZGUtdXJpLWNvbXBvbmVudC0wLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZ6a1RNelJZZDF5NFROR2grdUJpRUd1NGRVVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTIuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qd0syVVY0Y25QcGJjRzcrVlJBUktUWlBVV293d1hBOGJ6SDVOUDZ1ZDBvZUF4eVlQdUdaVUFDN2hNdWdwQ2R6NEJlU1psMkRsOWs2NkNISi80NlpZUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMS4wLjIiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tNWhuSFRrY1ZzUGZxeDNBS2x5dHRJUGI3SitYeWtIdkpQMkI5YlpEamxoTElvRXE0WG9LNjRWZzdib1psVldZSzZMVVk5NGRZUEVFN0xoMFprWktjUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItamJSWHkxRm10QW9DalFrVm1JVll3dXVxREZVYmFPZURqbWVkMXRPR1Byc01odEpBNHJEOXRrZ0EwRjFxSjNnUkZSWGNIWVZrZGVhUDUwUTVyRS9qTFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJlaXM1V3FRR1Y3cGVvb0R5TG1ORVBVcnBzOStTWFg1YzlwTDN4RUIrNGU5SG5HdURhN21CN2tIeEh3NENicVM5azFUMmhPSDNtaUw4bjhXdGlZVnRnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZGVmaW5lZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmVkLy0vZGVmaW5lZC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXlZMmJ6dmRXZEJpT0VRbHBGUkdaNDVzZnBwTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWxheWVkLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWxheWVkLXN0cmVhbS8tL2RlbGF5ZWQtc3RyZWFtLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM3pyaG1heXQrMzFFQ3FyZ3NwNGljckpPeGhrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlcHMtc29ydCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2RlcHMtc29ydC8tL2RlcHMtc29ydC0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNSY2trQzZFWllKZzY1RUhTTXpOR3ZiaUg3VT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJKU09OU3RyZWFtIjogIl4xLjAuMyIsCisgICAgICAgICJzaGFzdW0iOiAiXjEuMC4wIiwKKyAgICAgICAgInN1YmFyZyI6ICJeMS4wLjAiLAorICAgICAgICAidGhyb3VnaDIiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImRlcy5qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZXMuanMvLS9kZXMuanMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13SFRTNHFwcWlwb0gyOVlmbWhYQ3pZUHNqc3c9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4xIiwKKyAgICAgICAgIm1pbmltYWxpc3RpYy1hc3NlcnQiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImRldGVjdC1maWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RldGVjdC1maWxlLy0vZGV0ZWN0LWZpbGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04Tlp0QTJjcWdseXh0enZiUCtZakVNamxVcmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGV0ZWN0aXZlIjogeworICAgICAgInZlcnNpb24iOiAiNS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGV0ZWN0aXZlLy0vZGV0ZWN0aXZlLTUuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1URkhNcWZPdnhsZ3JmVnpURWtOQlNoOVN2U05YL0hmRjRPRkkyUUZHQ3lQbTAyRXN5SUxxblVlYjVQNnE3SlozU0ZOVEJMNXQyc2VQUmdyTjRlcFVXUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWNvcm4tbm9kZSI6ICJeMS4zLjAiLAorICAgICAgICAiZGVmaW5lZCI6ICJeMS4wLjAiLAorICAgICAgICAibWluaW1pc3QiOiAiXjEuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vMUFJc2c5Qk9EN3NIN2tVOU0xZDk1b21Rb1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZGlhZ25vc3RpY3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGlhZ25vc3RpY3MvLS9kaWFnbm9zdGljcy0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItOHduMVBtZHVuTEo5VHFieCtGeC9aRXVIZkpmNE5LU04yWkJqN1NKQy9PV1JXaGE4NDMrV3NUanFNZTFCNUUzcDI4anFCbHArbUoyZlBWeFB5TmdZS1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yc3BhY2UiOiAiMS4xLngiLAorICAgICAgICAiZW5hYmxlZCI6ICIxLjAueCIsCisgICAgICAgICJrdWxlciI6ICIxLjAueCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkaWZmaWUtaGVsbG1hbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2RpZmZpZS1oZWxsbWFuLy0vZGlmZmllLWhlbGxtYW4tNS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWtxYWcvTmwrZjNHd3lLMjVmaFVNWWo4MUJVT3JaOUl1SnNqSWNERTVpY05NOUZKSEFWbTNWY1VEeGRMUG9RdFR1VXlsV202WklrbllKd3dhUHhzVXpnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJibi5qcyI6ICJeNC4xLjAiLAorICAgICAgICAibWlsbGVyLXJhYmluIjogIl40LjAuMCIsCisgICAgICAgICJyYW5kb21ieXRlcyI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZG9tLXNlcmlhbGl6ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tLXNlcmlhbGl6ZXIvLS9kb20tc2VyaWFsaXplci0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJ6eHBkVWJPQjRET0k3NUtLT0tUNUF2RERJST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICJ+MS4xLjEiLAorICAgICAgICAiZW50aXRpZXMiOiAifjEuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tZWxlbWVudHR5cGUvLS9kb21lbGVtZW50dHlwZS0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS12U2gzUGlaQ2lCcnNVVlJKSkNtY1hOZ2lHRnM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiZW50aXRpZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbnRpdGllcy8tL2VudGl0aWVzLTEuMS4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItZjJMWk1ZbDFGenU3WVNCS2crUm9ST2VscE9hTnJjR21FOUFadWJlRGZyQ0VpYTQ4M29XNE1JNFZ5RmQ1Vk5ISWdRLzdxbTFJMHdVSEsxZUpubjJ5Mnc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImRvbWFpbi1icm93c2VyIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvbWFpbi1icm93c2VyLy0vZG9tYWluLWJyb3dzZXItMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpuanlpTTZlUnlabDJIK1c4US96TE1BNDgxaHppMGVzekFhQlV6SVZubVlWREJibkx4Vk5uZnUxSGdFQnZDYkwrNzFGcnhNbDNFNmxwS0g3R2UzT1hBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkb21lbGVtZW50dHlwZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb21lbGVtZW50dHlwZS8tL2RvbWVsZW1lbnR0eXBlLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1CU0tCK1RTcE1wRkkvSE94Q05yMU84YU1PVFo4aFQzcE0zR1Ewdy9tV1Jta2hFRFNGSmtreXp6NFhRc0JWNDRCQ2h3R2tyRGZNeWpWRDBlQTJhRlYzdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZG9taGFuZGxlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb21oYW5kbGVyLy0vZG9taGFuZGxlci0yLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUxlV2FDQ0xWQW4rci8yOERMQ3Nsb3FpcjV6Zz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgImRvbXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvbXV0aWxzLy0vZG9tdXRpbHMtMS41LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zTmhJaWliMVk5WVFlZVNNbjN0K01qYzJnczg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZG9tLXNlcmlhbGl6ZXIiOiAiMCIsCisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgImR1cGxleGVyMiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kdXBsZXhlcjIvLS9kdXBsZXhlcjItMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peExhdUhqQTFwNCtlSkVGRm1Lakw4YTkzTUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJlY2MtanNibiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lY2MtanNibi8tL2VjYy1qc2JuLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT29PcEJPVkRVeWg0ZE1Wa3QxU1Rob1NhbU1rPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImpzYm4iOiAifjAuMS4wIiwKKyAgICAgICAgInNhZmVyLWJ1ZmZlciI6ICJeMi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZWxsaXB0aWMiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZWxsaXB0aWMvLS9lbGxpcHRpYy02LjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQnNYTHo1c3FYOE9IY3NoN0NxQk16dHlYQVJtR1EzTFdQdEdqSmk2RGlKSHE1Qy9xdmk5UDNPcWdzd0tTRGZ0YnU4K0lvSS9RRFRBbTJmRm5ROVNaU1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJuLmpzIjogIl40LjQuMCIsCisgICAgICAgICJicm9yYW5kIjogIl4xLjAuMSIsCisgICAgICAgICJoYXNoLmpzIjogIl4xLjAuMCIsCisgICAgICAgICJobWFjLWRyYmciOiAiXjEuMC4wIiwKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJtaW5pbWFsaXN0aWMtYXNzZXJ0IjogIl4xLjAuMCIsCisgICAgICAgICJtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlbmFibGVkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VuYWJsZWQvLS9lbmFibGVkLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbGw5bEU5TEMwY1gwWlN0a291TTVaR2Y4TDVNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVudi12YXJpYWJsZSI6ICIwLjAueCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlbnRpdGllcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2VudGl0aWVzLy0vZW50aXRpZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zcGg2bzRJVFIvemVaQ3NrL2Z5ZVQ3Y1N2eVk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZW52LXZhcmlhYmxlIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Vudi12YXJpYWJsZS8tL2Vudi12YXJpYWJsZS0wLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItem9CNjAzdlFSZU9GdlRnNXhNbDlJMVAyUG5Ic0hRUUtURW93c0tLRDduc2VVZkpxNlVXeksrNFl0bFdVTzFuaGlRVXhlNlhNa2srSmxlU1pEMU5aRkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVycm9yLWV4IjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Vycm9yLWV4Ly0vZXJyb3ItZXgtMS4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTdkRkhObXFlRlNFdDJaQnNDcmlvcktubjNaMnBqK2ZkOWttSTZRb1d3NC8vREwraWNFQmZjMFU3cUpDaXNxclRzS1RqdzRmTkZ5MnBXOU9xU3REODRnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1hcnJheWlzaCI6ICJeMC4yLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXM2LXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXM2LXByb21pc2UvLS9lczYtcHJvbWlzZS00LjIuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbjZ3dnBkRTQzVkZ0SnErbFVEWURCRlV3VjhUWmJ1R1hMVjRENndLYWZnMTNsZHpuS3N5RXZhdHVibm1VZTMxemN2ZWxTek9IRitYYmFUK0JsOU9iRGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzNi1wcm9taXNpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXM2LXByb21pc2lmeS8tL2VzNi1wcm9taXNpZnktNS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VUW5XTHo1VzZwWjhTMk5RV3U4SUtSeUtVZ009IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXM2LXByb21pc2UiOiAiXjQuMC4zIgorICAgICAgfQorICAgIH0sCisgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzY2FwZS1zdHJpbmctcmVnZXhwLy0vZXNjYXBlLXN0cmluZy1yZWdleHAtMS4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HMkhBVmlHUXFOLzJyanV5endJQXloTUxodFE9IgorICAgIH0sCisgICAgImVzcHJpbWEiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjcuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmltYS8tL2VzcHJpbWEtMi43LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sdU8zRFZkNTlxMUp6UU1tYzlIREVuWjdwWUU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXZlbnRlbWl0dGVyMiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4xNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ldmVudGVtaXR0ZXIyLy0vZXZlbnRlbWl0dGVyMi0wLjQuMTQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1qMkczWE40Qkt5NmVzb1RVVkZXRHRXUTdZYXM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXZlbnRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V2ZW50cy8tL2V2ZW50cy0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItM1ptaW9iZW5kOFA5RGptS0F0eTBFcmE0alY4b0oweUdZZTJuSkpBeGd5bUY5K044RjJtMGhoWmlNb1d0Y2ZlcEV4ek5LWnVtRlUza3NkUWJJbkdXQ2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV2cF9ieXRlc3Rva2V5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V2cF9ieXRlc3Rva2V5Ly0vZXZwX2J5dGVzdG9rZXktMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLS9mMkdvNFRvZ25IL0t2Q0lTUDdPVXNIbjg1aFQ5blVreHhBOUJFV3hGbitPajlvOFpOTG0vNDBoZGxnU0x5dU9pbXNyVEtMVU1Fb3JRZXhwL2FQUWVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtZDUuanMiOiAiXjEuMy40IiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJleGl0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4aXQvLS9leGl0LTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQmpKamo0MkhmTWdoQjlNS0QvOGFGOHVoelF3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4cGFuZC1icmFja2V0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHBhbmQtYnJhY2tldHMvLS9leHBhbmQtYnJhY2tldHMtMi4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10M2MxNHhYT01QYTI3L0Q0T3dRVkdpSkVsaUk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVidWciOiAiXjIuMy4zIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgInBvc2l4LWNoYXJhY3Rlci1jbGFzc2VzIjogIl4wLjEuMCIsCisgICAgICAgICJyZWdleC1ub3QiOiAiXjEuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMi41IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTAuMi41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXcxc2UrUmpzUEprUG1sdkZlK0JLck94Y2dSWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImV4cGFuZC10aWxkZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHBhbmQtdGlsZGUvLS9leHBhbmQtdGlsZGUtMi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sK2dCcWdVdDhDUlUza2F3Sy9ZaFpDemNoUUk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaG9tZWRpci1wb2x5ZmlsbCI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC8tL2V4dGVuZC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZmpxdUM1OWNEN0N5VzZ1ck5YSzBGQnVma1pjb2lHRzgwd1R1UHVqWDU5MGNCNVR0bG4yMEUyVUI0Uy9XQVJWcWhYZmZabDJMTmdTK2dRZFBJSWltL2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KcWNhcndjN09mc2hKeGNuUmhNY0p3UUNqYmc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzaWduLXN5bWJvbHMiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjEuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJpcy1leHRlbmRhYmxlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZXh0ZW5kYWJsZS8tL2lzLWV4dGVuZGFibGUtMS4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hcm5YTXhUMWhob0tvOWsxTFpkbWxOeUpkRERmeTJ2MGZYakZsbW9rNCtpOHVsLzZXbGJWZ2U5YmhNNzRPcE5QUVBNR1VUb0R0eitLWGExUG5lSnhPQT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuNCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJleHRnbG9iIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGdsb2IvLS9leHRnbG9iLTIuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ObWI2UVhrRUxzdUJyMjRDSlNraWxvNlVISGdiZWtLNVVpWmdmRTZVSEQzRWIyN1lDNm9EK2JoY1QrdEo2Y2w4ZG1zZ2RReG5XbGNyeThrc0JJQkxwdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktdW5pcXVlIjogIl4wLjMuMiIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjEuMC4wIiwKKyAgICAgICAgImV4cGFuZC1icmFja2V0cyI6ICJeMi4xLjQiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImZyYWdtZW50LWNhY2hlIjogIl4wLjIuMSIsCisgICAgICAgICJyZWdleC1ub3QiOiAiXjEuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWRwNjZyejlLWTZyVHI1Nk5NRXlidm5tL3NPWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW01aG5IVGtjVnNQZnF4M0FLbHl0dElQYjdKK1h5a0h2SlAyQjliWkRqbGhMSW9FcTRYb0s2NFZnN2JvWmxWV1lLNkxVWTk0ZFlQRUU3TGgwWmtaS2NRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYlJYeTFGbXRBb0NqUWtWbUlWWXd1dXFERlViYU9lRGptZWQxdE9HUHJzTWh0SkE0ckQ5dGtnQTBGMXFKM2dSRlJYY0hZVmtkZWFQNTBRNXJFL2pMUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTEuMC4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItMmVpczVXcVFHVjdwZW9vRHlMbU5FUFVycHM5K1NYWDVjOXBMM3hFQis0ZTlIbkd1RGE3bUI3a0h4SHc0Q2JxUzlrMVQyaE9IM21pTDhuOFd0aVlWdGc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJleHRyYWN0LXppcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRyYWN0LXppcC8tL2V4dHJhY3QtemlwLTEuNi43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUVDMHVLOWtBeVpNamJWL1R4cDBNejc0SCtrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbmNhdC1zdHJlYW0iOiAiMS42LjIiLAorICAgICAgICAiZGVidWciOiAiMi42LjkiLAorICAgICAgICAibWtkaXJwIjogIjAuNS4xIiwKKyAgICAgICAgInlhdXpsIjogIjIuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgImV4dHNwcmludGYiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0c3ByaW50Zi8tL2V4dHNwcmludGYtMS4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1scEdFUU9NRUducEJUNHhTNDhWMDZ6dytIZ1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1kZWVwLWVxdWFsIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtZGVlcC1lcXVhbC8tL2Zhc3QtZGVlcC1lcXVhbC0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWV3VWhqZCtXWjc5L053djMvYkxMRmYzUXFraz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS8tL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMVJRc0RLN21zUmlmaDlPbllSRUdUNGJJdS9JPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZhc3Qtc2FmZS1zdHJpbmdpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1zYWZlLXN0cmluZ2lmeS8tL2Zhc3Qtc2FmZS1zdHJpbmdpZnktMi4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXE4Qlo4OWpqYyttejA4clN4Uk9zOFZzckJCY24xU0l3MWtxOU5qb2xMNTA5dGtBQlJrOWlvMDFSQWpTYUV2MVhiMnVGTHQ4VnRSaVpiR3A1SDhpRHRnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmZC1zbGljZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmQtc2xpY2VyLy0vZmQtc2xpY2VyLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaTF2TDJld3lmRkJCdjVxd0kvMW5VUEVYZm1VPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBlbmQiOiAifjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgImZlY2hhIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZlY2hhLy0vZmVjaGEtMi4zLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxVR0JuSWFtVEF3azR6bnE1QmNxc0RheFNtWjluRFZKYWlqNk52UnQvVGc0UjY5Z0VSQStvdFBLYlM4NlJPdzlueFZNdzIvbXAxZm5haVdxYnM2U2RnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmaWd1cmVzIjogeworICAgICAgInZlcnNpb24iOiAiMS43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpZ3VyZXMvLS9maWd1cmVzLTEuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteStIanIvenh6VVM0REszKzBvM0hrNmx3SFM0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaWxsLXJhbmdlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbGwtcmFuZ2UvLS9maWxsLXJhbmdlLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMVVTQkhVS1BtT3NHcGozRUF0SkFQREtNT1BjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICJpcy1udW1iZXIiOiAiXjMuMC4wIiwKKyAgICAgICAgInJlcGVhdC1zdHJpbmciOiAiXjEuNi4xIiwKKyAgICAgICAgInRvLXJlZ2V4LXJhbmdlIjogIl4yLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJmaW5kLXVwIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbmQtdXAvLS9maW5kLXVwLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYXk2WUlyR2l6Z3BncTJUV0VPeksxVHl5VFE4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtZXhpc3RzIjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZmluZHVwLXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZHVwLXN5bmMvLS9maW5kdXAtc3luYy0wLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU41TUtwZGdXdDNmQU5FWGhsbXpHZVFwTUN4WT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iIjogIn41LjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjAuMTUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi01LjAuMTUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzhrMnVlQXZTbUEvekNJdXozWXowd3VMazdFPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAiMiIsCisgICAgICAgICAgICAibWluaW1hdGNoIjogIjIgfHwgMyIsCisgICAgICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImZpbmVkIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbmVkLy0vZmluZWQtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpRcDk0OVptRWJpWUhrM2drYmR0cEowRzEra2d0TFFCTmRQNWVkRlA3RmgrV0FZY2VMUXo2eU8xU0JqNzJYa2c4R1Z5VEIzYkJ6QVlySEpWaDVYZDVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHBhbmQtdGlsZGUiOiAiXjIuMC4yIiwKKyAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjMiLAorICAgICAgICAib2JqZWN0LmRlZmF1bHRzIjogIl4xLjEuMCIsCisgICAgICAgICJvYmplY3QucGljayI6ICJeMS4yLjAiLAorICAgICAgICAicGFyc2UtZmlsZXBhdGgiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImZsYWdnZWQtcmVzcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mbGFnZ2VkLXJlc3Bhd24vLS9mbGFnZ2VkLXJlc3Bhd24tMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxOYUhOVnltYWptazBPSk1CbjhmVlVBVTFCdERlS0lxS29WaGs0eEFBTEI1N2FBTGc2YjRXME1mSi9jVUUwZzlZQlh5NVhoU2xQSXBZSUo3SGFZLzNRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmb3ItaW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZm9yLWluLy0vZm9yLWluLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZ1FhTktWcUJRdXdLeHliRzRpQU1NUHR0WG9BPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZvci1vd24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZm9yLW93bi8tL2Zvci1vd24tMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS14ak15OUJYTzNFc0UyLzV3ejROa2xNVTh0RXM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZm9yLWluIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmb3JldmVyLWFnZW50IjogeworICAgICAgInZlcnNpb24iOiAiMC42LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZvcmV2ZXItYWdlbnQvLS9mb3JldmVyLWFnZW50LTAuNi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtKzhjZkRFR3Q2emY1YkZkNjBlMUMyUDJzeXBFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZvcm0tZGF0YSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3JtLWRhdGEvLS9mb3JtLWRhdGEtMi4zLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFsTEtCMk11M2FHUDFRLzJlQ094MGZOYlJNZTdYZHdrdHdPcnVoZnFxZDBySUpXd040RGgrRTNoclBTbERDWG5TUjdVdFoxTjM4clZYbSs2K01FaEpRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luY2tpdCI6ICJeMC40LjAiLAorICAgICAgICAiY29tYmluZWQtc3RyZWFtIjogIl4xLjAuNiIsCisgICAgICAgICJtaW1lLXR5cGVzIjogIl4yLjEuMTIiCisgICAgICB9CisgICAgfSwKKyAgICAiZnJhZ21lbnQtY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnJhZ21lbnQtY2FjaGUvLS9mcmFnbWVudC1jYWNoZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFwRDYwbjhUNkp2bjh6ZVp4cnhhQ3IvL0RSaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtYXAtY2FjaGUiOiAiXjAuMi4yIgorICAgICAgfQorICAgIH0sCisgICAgImZzLWV4dHJhIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzLWV4dHJhLy0vZnMtZXh0cmEtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16VHpsOStmTFlVV0lQOHJqR1I2WWQvaFllVkE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS4yIiwKKyAgICAgICAgImpzb25maWxlIjogIl4yLjEuMCIsCisgICAgICAgICJrbGF3IjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2xhdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjMuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tsYXcvLS9rbGF3LTEuMy4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVFJaERPMGF6c2JvbG5YaDRYWTZXOXp1Z0pEaz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjkiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZnMucmVhbHBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMucmVhbHBhdGgvLS9mcy5yZWFscGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUZRU3RKU01WaktwQTIwb25oOHNCUVJtVTZrOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmdW5jdGlvbi1iaW5kIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Z1bmN0aW9uLWJpbmQvLS9mdW5jdGlvbi1iaW5kLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15SW92QXpNWDQ5c0Y4WWw1OGZTQ1dKNXN2U0x1YWliUHhYUUpGTG1CT2JUdUNyME1mMUtpUG9wR005TmlGamlZQkNiZmFhMkZoNmJyZVE2QU5WVEkwQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0LWFzc2lnbmVkLWlkZW50aWZpZXJzIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldC1hc3NpZ25lZC1pZGVudGlmaWVycy8tL2dldC1hc3NpZ25lZC1pZGVudGlmaWVycy0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbUJCd21lR1RyeEVNTzRwTWFhZi91VUVGSG5ZdHdyOEZUZThZL21lcjRyY1YvYnllMHFHbTZwdzFiR1pGR1N0eEM1Tzc2YzVaQVZCR25xSG1PYUpwZFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdldC1zdGRpbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXQtc3RkaW4vLS9nZXQtc3RkaW4tNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11V2pHc0tCRGhESkpBdWkvR2wzekpYbWtVUDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0LXZhbHVlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldC12YWx1ZS8tL2dldC12YWx1ZS0yLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTNCWEtIR2NqaDhwMnZUZXNDamxib2dRcUxDZz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXRvYmplY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2V0b2JqZWN0Ly0vZ2V0b2JqZWN0LTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQkhwRWw0bjZGZzBCajFTRzdaRXlDMjdIaUZ3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdldHBhc3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2V0cGFzcy8tL2dldHBhc3MtMC4xLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1YditPUG1oTlZwcmt5eXNTZ21CT2k2WWhTZm89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNy4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXZjZnVpSXhvZ0xWNERsR0JISVVPd0kwSWJySjhIV1BjNE1VN0h6dmlHZU5oby9VSkRmaTZCNXAzc0hlV0lRMEtHSVUwSnB4aTVaSHhlbVFmTGtrQXdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmcy5yZWFscGF0aCI6ICJeMS4wLjAiLAorICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnbG9iYWwtbW9kdWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iYWwtbW9kdWxlcy8tL2dsb2JhbC1tb2R1bGVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zS3pwRWtmMTFHcE9GdXcwWnpqem10NEI0VVp3ak9jRzc1N1BQdnJmaHhjTEZicTB3cHNncE9xeHB4dHhGaUNHNER0RzkzTTZYUlZiRjJvR2RldjdiZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYmFsLXByZWZpeCI6ICJeMS4wLjEiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjEiLAorICAgICAgICAicmVzb2x2ZS1kaXIiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdsb2JhbC1wcmVmaXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmFsLXByZWZpeC8tL2dsb2JhbC1wcmVmaXgtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yL2REeHNGSmtsazhaVlZveTJidE1zQVNMcjQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMiIsCisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIsCisgICAgICAgICJpbmkiOiAiXjEuMy40IiwKKyAgICAgICAgImlzLXdpbmRvd3MiOiAiXjEuMC4xIiwKKyAgICAgICAgIndoaWNoIjogIl4xLjIuMTQiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3JhY2VmdWwtZnMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMTUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dyYWNlZnVsLWZzLy0vZ3JhY2VmdWwtZnMtNC4xLjE1LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02dUhVaE9QRUJnUTI0SE0rcjZiL1F3V2ZacSt5aUZjaXBLRnJPRmlCRW5XZHk1c2R6WW9pK3BKZVFhUEk1cU9MUkZxV21BWFVQUU5zaWVsemRMb2VjQT09IgorICAgIH0sCisgICAgImdydW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50Ly0vZ3J1bnQtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLS9Kem1aTlBmS29ybENycm14V3FRTzRKVm9kTytEVmQ1WFg0RGtvY0wvMVdsTGxLVkxFOStTZEVJZW1wT0F4RGhXUHlzTGxlNmFmdm4vaGc3Q2syazlnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2ZmZWVzY3JpcHQiOiAifjEuMTAuMCIsCisgICAgICAgICJkYXRlZm9ybWF0IjogIn4xLjAuMTIiLAorICAgICAgICAiZXZlbnRlbWl0dGVyMiI6ICJ+MC40LjEzIiwKKyAgICAgICAgImV4aXQiOiAifjAuMS4xIiwKKyAgICAgICAgImZpbmR1cC1zeW5jIjogIn4wLjMuMCIsCisgICAgICAgICJnbG9iIjogIn43LjAuMCIsCisgICAgICAgICJncnVudC1jbGkiOiAifjEuMi4wIiwKKyAgICAgICAgImdydW50LWtub3duLW9wdGlvbnMiOiAifjEuMS4wIiwKKyAgICAgICAgImdydW50LWxlZ2FjeS1sb2ciOiAifjIuMC4wIiwKKyAgICAgICAgImdydW50LWxlZ2FjeS11dGlsIjogIn4xLjEuMSIsCisgICAgICAgICJpY29udi1saXRlIjogIn4wLjQuMTMiLAorICAgICAgICAianMteWFtbCI6ICJ+My41LjIiLAorICAgICAgICAibWluaW1hdGNoIjogIn4zLjAuMiIsCisgICAgICAgICJta2RpcnAiOiAifjAuNS4xIiwKKyAgICAgICAgIm5vcHQiOiAifjMuMC42IiwKKyAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAifjEuMC4wIiwKKyAgICAgICAgInJpbXJhZiI6ICJ+Mi42LjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImdsb2IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNy4wLjYiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi03LjAuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUnV2cjBubEpiak5reVlORktzVFlWS3o5WG89IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZnMucmVhbHBhdGgiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpbmZsaWdodCI6ICJeMS4wLjQiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4wLjIiLAorICAgICAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJncnVudC1jbGkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNsaS8tL2dydW50LWNsaS0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WaXNSbnJzR25kdEdTczRvUlZBYjZYczF0cWc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZmluZHVwLXN5bmMiOiAifjAuMy4wIiwKKyAgICAgICAgICAgICJncnVudC1rbm93bi1vcHRpb25zIjogIn4xLjEuMCIsCisgICAgICAgICAgICAibm9wdCI6ICJ+My4wLjYiLAorICAgICAgICAgICAgInJlc29sdmUiOiAifjEuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm5vcHQiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4wLjYiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub3B0Ly0vbm9wdC0zLjAuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS14a1pkdndpcnpVMnpXVEYvZWF4b3BrYXlqL2s9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYWJicmV2IjogIjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAicmVzb2x2ZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuNyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS8tL3Jlc29sdmUtMS4xLjcudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSURFVTJDclN4ZTJlamdRUnM1TW9kZWlKNlhzPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNsaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jbGkvLS9ncnVudC1jbGktMS4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLThPSERpWlprY3B0eFZYdE1mRHhKdm1ON01WSk5FOEwveUljUGI0SEI3VGx5RkQxa0R2akhyYjYydWh5U3NVMTR3Sng5T1JNblR1aFJNUTQwbEgvb3JRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncnVudC1rbm93bi1vcHRpb25zIjogIn4xLjEuMCIsCisgICAgICAgICJpbnRlcnByZXQiOiAifjEuMS4wIiwKKyAgICAgICAgImxpZnRvZmYiOiAifjIuNS4wIiwKKyAgICAgICAgIm5vcHQiOiAifjQuMC4xIiwKKyAgICAgICAgInY4ZmxhZ3MiOiAifjMuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNvbnRyaWItY29uY2F0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItY29uY2F0Ly0vZ3J1bnQtY29udHJpYi1jb25jYXQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZVkNZWXdoT2h4MStodDVJd0JVbG50bDNSYjA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAiXjAuNS4zIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMi4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdERMZE0xaTJOTTkxNGVSbVEyZ2tCVFBCM2I0PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNoYWxrIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTEuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXFCRmNWZVNuQXY1TkZRcTlPSEtDS240Si9KZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMi4yLjEiLAorICAgICAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuMiIsCisgICAgICAgICAgICAiaGFzLWFuc2kiOiAiXjIuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIsCisgICAgICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VMTBFWE9hMk5qK2tBUmNJUmltWlhwM3pKTWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jb250cmliLWpzaGludC8tL2dydW50LWNvbnRyaWItanNoaW50LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTnAyUW15V1R4QTZMNTVsQXNoTkFoUXg1T2F3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4xLjEuMSIsCisgICAgICAgICJob29rZXIiOiAiXjAuMi4zIiwKKyAgICAgICAgImpzaGludCI6ICJ+Mi45LjQiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0yLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10RExkTTFpMk5NOTE0ZVJtUTJna0JUUEIzYjQ9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY2hhbGsiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYWxrLy0vY2hhbGstMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUJGY1ZlU25BdjVORlFxOU9IS0NLbjRKL0pnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktc3R5bGVzIjogIl4yLjIuMSIsCisgICAgICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC4yIiwKKyAgICAgICAgICAgICJoYXMtYW5zaSI6ICJeMi4wLjAiLAorICAgICAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4wIiwKKyAgICAgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeMi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVUxMEVYT2EyTmora0FSY0lSaW1aWHAzekpNYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jb250cmliLXF1bml0IjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItcXVuaXQvLS9ncnVudC1jb250cmliLXF1bml0LTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tZGs4VWx0SDZteENENjNFMGhUWE1BdHM0MkRPaTR6NGJCQnJZN3FudUhpU2hmbE1GN0l1ZVNNWWUweldhWjJkTzhtZ3VqaDU3WmZueTJFYmlnSmhSZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXZlbnRlbWl0dGVyMiI6ICJeNS4wLjEiLAorICAgICAgICAicC1lYWNoLXNlcmllcyI6ICJeMS4wLjAiLAorICAgICAgICAicHVwcGV0ZWVyIjogIl4xLjExLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImV2ZW50ZW1pdHRlcjIiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNS4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ldmVudGVtaXR0ZXIyLy0vZXZlbnRlbWl0dGVyMi01LjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZWmVnbGRYN2ExZm9sQzl2MStxdFk2Q2NsRkk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtY29udHJpYi11Z2xpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jb250cmliLXVnbGlmeS8tL2dydW50LWNvbnRyaWItdWdsaWZ5LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcm1la2I1RlQ3ZFRMRVlFNlZldHB4dzE5c3ZzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4xLjAuMCIsCisgICAgICAgICJsb2Rhc2giOiAiXjQuMC4xIiwKKyAgICAgICAgIm1heG1pbiI6ICJeMS4xLjAiLAorICAgICAgICAidWdsaWZ5LWpzIjogIn4yLjYuMiIsCisgICAgICAgICJ1cmktcGF0aCI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0yLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10RExkTTFpMk5NOTE0ZVJtUTJna0JUUEIzYjQ9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY2hhbGsiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYWxrLy0vY2hhbGstMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUJGY1ZlU25BdjVORlFxOU9IS0NLbjRKL0pnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktc3R5bGVzIjogIl4yLjIuMSIsCisgICAgICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC4yIiwKKyAgICAgICAgICAgICJoYXMtYW5zaSI6ICJeMi4wLjAiLAorICAgICAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4wIiwKKyAgICAgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeMi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVUxMEVYT2EyTmora0FSY0lSaW1aWHAzekpNYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1qc2RvYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1qc2RvYy8tL2dydW50LWpzZG9jLTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1nQzY2VENSWGVRTWozSEl5cVZTQkptOHpkVXo0M2U1dmFHL1BMTy82MjdBMWVkYkpuenhoSlY3bkYwS3FMd01NMFJETnUxaXN0QzZmdmZuWXFGS2kzdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY3Jvc3Mtc3Bhd24iOiAiXjYuMC41IiwKKyAgICAgICAgImpzZG9jIjogIn4zLjUuNSIsCisgICAgICAgICJtYXJrZWQiOiAiXjAuNS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtYXJrZWQiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC41LjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXJrZWQvLS9tYXJrZWQtMC41LjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mZFp2QmE3L3ZTUUlaQ2k0dXV3bzJOM3ErN2pKVVJwTVZDY2JhWDBTMU1nNjVXWjVpbFh2QzY3TXZpSkFzZGpxcWdEK0NFcTRSS281QVlHZ0lOa1ZBQT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQta25vd24tb3B0aW9ucyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1rbm93bi1vcHRpb25zLy0vZ3J1bnQta25vd24tb3B0aW9ucy0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItY0h3c0xxb2lnaHB1N1R1WWo1Um9ubkV1eEdWRm56dGNVcVRxcDVyWEZHWUw0T3VQRm9md0M0WWNnN245Zll3dks2RjVXYllnZVZPd3BoOUNyczJmc1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdydW50LWxlZ2FjeS1sb2ciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtbGVnYWN5LWxvZy8tL2dydW50LWxlZ2FjeS1sb2ctMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFtMys1UXZEWWZSMWx0cjhoamlhaU5qZGR4R2RRV2NIMHJ3MWlLS2lRbkYwK3h0Z1RhemlyU1RHdTY4UmNoUHloMU9CbmcxYkJVakxtWDhxOU5wb0N3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xvcnMiOiAifjEuMS4yIiwKKyAgICAgICAgImdydW50LWxlZ2FjeS1sb2ctdXRpbHMiOiAifjIuMC4wIiwKKyAgICAgICAgImhvb2tlciI6ICJ+MC4yLjMiLAorICAgICAgICAibG9kYXNoIjogIn40LjE3LjUiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtbGVnYWN5LWxvZy11dGlscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1sZWdhY3ktbG9nLXV0aWxzLy0vZ3J1bnQtbGVnYWN5LWxvZy11dGlscy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbzd1SHlPL0oraTJ0WEc4cjJiWk5sVmsyMHZsSUZKOUlFWXlITUNRR2ZXWXJ1OEp2M3dUcUtaenZWMzBZVzlyV0VqcTBlUDNjZmxRMXFXb2pJZTlWRkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIn4yLjQuMSIsCisgICAgICAgICJsb2Rhc2giOiAifjQuMTcuMTAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtbGVnYWN5LXV0aWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtbGVnYWN5LXV0aWwvLS9ncnVudC1sZWdhY3ktdXRpbC0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItOXp5QTI5dy9mQmU2QklmakdFTm5kd29lMVV5MzFCSVh4VEgzczhtZ2EwWjVCejJTcDRVQ2prZXl2MnRJNDQ5eW1reDN4MjZCKzQ2RlY0ZlhFZGRsNUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jIjogIn4xLjUuMiIsCisgICAgICAgICJleGl0IjogIn4wLjEuMSIsCisgICAgICAgICJnZXRvYmplY3QiOiAifjAuMS4wIiwKKyAgICAgICAgImhvb2tlciI6ICJ+MC4yLjMiLAorICAgICAgICAibG9kYXNoIjogIn40LjE3LjEwIiwKKyAgICAgICAgInVuZGVyc2NvcmUuc3RyaW5nIjogIn4zLjMuNCIsCisgICAgICAgICJ3aGljaCI6ICJ+MS4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtc2hlbGwtc3Bhd24iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMTIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LXNoZWxsLXNwYXduLy0vZ3J1bnQtc2hlbGwtc3Bhd24tMC4zLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1UcHJaY3Q5MnNRNE0yUTkycGlhZUxzQ3J4NCtncS9hZ2V1eGpac1JHNmNnbEt0N3g3ckdBM1lIdDhEMzArRzc4OXYrL3B3NGwwdERqRXlya01YeDJ0QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3J1bnQiOiAiPj0wLjQueCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnemlwLXNpemUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3ppcC1zaXplLy0vZ3ppcC1zaXplLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWnMrTEVCQkhJbnVWdXM1dW9kb01GMzdWd2k4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJyb3dzZXJpZnktemxpYiI6ICJeMC4xLjQiLAorICAgICAgICAiY29uY2F0LXN0cmVhbSI6ICJeMS40LjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImJyb3dzZXJpZnktemxpYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXJpZnktemxpYi8tL2Jyb3dzZXJpZnktemxpYi0wLjEuNC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11elg0cFJuMkFPRDZhNFNGSkJ5WG5RRkIreTA9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAicGFrbyI6ICJ+MC4yLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAicGFrbyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuOSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFrby8tL3Bha28tMC4yLjkudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOC9kU0wwNzNnalNOcUJZYnJaN1AxUnY0T25VPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImhhci1zY2hlbWEiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFyLXNjaGVtYS8tL2hhci1zY2hlbWEtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xVXdpSk92S3dFZUNvTmtEVlNIeVJ6VzM3Skk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFyLXZhbGlkYXRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXItdmFsaWRhdG9yLy0vaGFyLXZhbGlkYXRvci01LjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItc052T0N6RVFOci9xcnZKZ2MzVUcva0Q0UXRsSHljcnp3Uys2bWZUcnJTcTk3QnZhWWNQWlpJMVpTcUdTUFI3M0N4bjRMS1RENFB0dFJ3ZlU3aldxNWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFqdiI6ICJeNi41LjUiLAorICAgICAgICAiaGFyLXNjaGVtYSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaGFzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy8tL2hhcy0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZjJkdk8wVlU2T2VqN1JrV0pHcmVoamJ6TUFqRnA1L1ZLUHA1dFRwV0lWNEpISFpLMS9CeGJGUnRmL3NpQTJTV1RlMDljYURtVnRZWXpXRUliQlM0enc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZ1bmN0aW9uLWJpbmQiOiAiXjEuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgImhhcy1hbnNpIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1hbnNpLy0vaGFzLWFuc2ktMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1OUFVFbk9IczN5c0dTYTgrOGs1RjdUVkJiWkU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1yZWdleCI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaGFzLWZsYWciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLWZsYWcvLS9oYXMtZmxhZy0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRkUlUzQ0dacmlKV21mTkdmbG9IODdsVnV2MD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJoYXMtdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLXZhbHVlLy0vaGFzLXZhbHVlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtR0xLQjJsaGJIRnhSM3ZKTWt3N1NtZ3Ztc1hjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdldC12YWx1ZSI6ICJeMi4wLjYiLAorICAgICAgICAiaGFzLXZhbHVlcyI6ICJeMS4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImhhcy12YWx1ZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLXZhbHVlcy8tL2hhcy12YWx1ZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sYkMyUCt3aFJtR2FiK1YvNTFZbzFhT2Uvazg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtbnVtYmVyIjogIl4zLjAuMCIsCisgICAgICAgICJraW5kLW9mIjogIl40LjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTQuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUlJRTk4OWNTa29zZ2MzaHBHa1VHYjY1eTNWYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImhhc2gtYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXNoLWJhc2UvLS9oYXNoLWJhc2UtMy4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1YOGhvYUVmczF6U1pRRE1acHJDajgvYXVTUmc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4xIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXNoLmpzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhc2guanMvLS9oYXNoLmpzLTEuMS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10YU9hc2tHdDR6NFNPQU5Oc2VPdmlZRHZqRUppbklrUmdtcDdMYktQMllUVG1WeFdCbDg3cy91eks5cis0NEJjbEJTcDJYN0sxaHFlTmZ6OUpiQmVYQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4zIiwKKyAgICAgICAgIm1pbmltYWxpc3RpYy1hc3NlcnQiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImhhc2hhIjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhc2hhLy0vaGFzaGEtMi4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lTmZML0I1dFpqQS81NWczTmxtRVVYc3ZidUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtc3RyZWFtIjogIl4xLjAuMSIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaG1hYy1kcmJnIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2htYWMtZHJiZy8tL2htYWMtZHJiZy0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTBuUlhBUUphYkhkYWJGUlhrKzFRTDhER1NhRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXNoLmpzIjogIl4xLjAuMyIsCisgICAgICAgICJtaW5pbWFsaXN0aWMtYXNzZXJ0IjogIl4xLjAuMCIsCisgICAgICAgICJtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJob21lZGlyLXBvbHlmaWxsIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hvbWVkaXItcG9seWZpbGwvLS9ob21lZGlyLXBvbHlmaWxsLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVEN1OGluV0ptUDdyOWUxb1dBOTIxR2RvdEx3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhcnNlLXBhc3N3ZCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaG9va2VyIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hvb2tlci8tL2hvb2tlci0wLjIuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXVEVDNJOHhLSkNxbVdXTkZuZmJaaE1YVDJWaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJob3N0ZWQtZ2l0LWluZm8iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjcuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaG9zdGVkLWdpdC1pbmZvLy0vaG9zdGVkLWdpdC1pbmZvLTIuNy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi03VC9CeEgxOXpiY0NUYThYa01sYks1bFRvMVd0Z2tGaTNHdmRXRXlOdWM0VmV4Ny85RHFibnBzZjRKTXlkY2ZqOUhDZzR6VVdGVEwzWmE2bGFwZzUvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaHRtbGVzY2FwZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2h0bWxlc2NhcGUvLS9odG1sZXNjYXBlLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT2dQdHdpRkx5anRtUWtvK2VWazBsUW5MQTFFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImh0bWxwYXJzZXIyIjogeworICAgICAgInZlcnNpb24iOiAiMy44LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHRtbHBhcnNlcjIvLS9odG1scGFyc2VyMi0zLjguMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1Xd29zWkZSYW92b1pRR24xNWRYNWNjTUVHZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICIxIiwKKyAgICAgICAgImRvbWhhbmRsZXIiOiAiMi4zIiwKKyAgICAgICAgImRvbXV0aWxzIjogIjEuNSIsCisgICAgICAgICJlbnRpdGllcyI6ICIxLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIjEuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaXNhcnJheSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzYXJyYXkvLS9pc2FycmF5LTAuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWloaXMvS21vOUJkK0NhdjhZRGlUbXdYUjd0OD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjE0IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMS4xLjE0LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWZQVEZUdlpJNDRFd2hNWTIzU0I1NFdiQWdkaz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJjb3JlLXV0aWwtaXMiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjEiLAorICAgICAgICAgICAgImlzYXJyYXkiOiAiMC4wLjEiLAorICAgICAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4wLjEwLngiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4xMC4zMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0wLjEwLjMxLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVl1SUR2RUYyYkd3b3lmeUVNQjJySEZNUStwUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJodHRwLXNpZ25hdHVyZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9odHRwLXNpZ25hdHVyZS8tL2h0dHAtc2lnbmF0dXJlLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbXV6WkpSRkhjdlBaVzJXbUNydVBmQmo3ck9FPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzc2VydC1wbHVzIjogIl4xLjAuMCIsCisgICAgICAgICJqc3ByaW0iOiAiXjEuMi4yIiwKKyAgICAgICAgInNzaHBrIjogIl4xLjcuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJodHRwcy1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2h0dHBzLWJyb3dzZXJpZnkvLS9odHRwcy1icm93c2VyaWZ5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN0FiQkRnbzB3UEw2OFpuMy9YL0hqLy9RUEhNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImh0dHBzLXByb3h5LWFnZW50IjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2h0dHBzLXByb3h5LWFnZW50Ly0vaHR0cHMtcHJveHktYWdlbnQtMi4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUhQQ1RTMUxXNTFiY3lNWWJ4VUlPTzRIRU9sUTEvMXFSYUZXY3l4dndhcVVTOVRZODhhb0V1SFVZMzNrdUFoMVloVlZhRFFoTFpzblBkK1hOQVJXWmxRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhZ2VudC1iYXNlIjogIl40LjEuMCIsCisgICAgICAgICJkZWJ1ZyI6ICJeMy4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlYnVnIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy0zLjIuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1lbCtqZjducnRFbDVQbjFReDQ2ekFSWEtEcEJidnplenNlN3A3THFJTm1kb0lrOFBZUDVTeVNheEVtWXY2VFowSnlFS0ExaHNDSWQ2REloZ0lUdFdRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJtcyI6ICJeMi4xLjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGdwK2RsNWNHazI4dXRZa3RCc3JGcUE3SEtncmhnUHNnNlovRWZoV0k0Z2wxSHdxOEIvR21ZLzBvWFo2bkY4aERWZXNTL0ZwbllhRC9rT1doWVF2eWc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImljb252LWxpdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ljb252LWxpdGUvLS9pY29udi1saXRlLTAuNC4yNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdjNNWG5aQWN2bnl3a1RVRVpvbUlBY3RsZTdSWFhlZWRPUjMxd3dsN1ZseW9YTzRRaTlhcnZTZW5OUVduZTFUY1J3aENMMUh3TEkyMWJFcWRwajgvckE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmVyLWJ1ZmZlciI6ICI+PSAyLjEuMiA8IDMiCisgICAgICB9CisgICAgfSwKKyAgICAiaWVlZTc1NCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaWVlZTc1NC8tL2llZWU3NTQtMS4xLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HZ3VQK0RSWStwSjNzb3lJaUdQVHZkaVZYalorRGJYT3hHcFhuM2VNdk5XNHg0aXJqcVhtNHdIS3NjQytUZnhTSjB5dy9TMUYyNHRxZE1Oc01aVGlMQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW5kZW50LXN0cmluZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmRlbnQtc3RyaW5nLy0vaW5kZW50LXN0cmluZy0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWppMUlOSWRDRWh0S2doaTNvVGZwcFNCSjNJQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZXBlYXRpbmciOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImluZmxpZ2h0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luZmxpZ2h0Ly0vaW5mbGlnaHQtMS4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TYjFqTWRmUUxRd0p2SkVLRUhXNmdXVzFiZms9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAid3JhcHB5IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5oZXJpdHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5oZXJpdHMvLS9pbmhlcml0cy0yLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVl6d3NnK1BhUXFVQzlTUm1BaVNBOUNDQ1lkND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbmkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5pLy0vaW5pLTEuMy41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SWlk1aHVJS0NNUldEVXFabEVpNzJmL2xtWEtNdnVzemNNQmR1bGlRM25uV2J4OVgvWkJRTzdEaWpNRVlTOUVoSEJiMnFhY1JVTXRDN3N2THdlMGxjdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW5saW5lLXNvdXJjZS1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5saW5lLXNvdXJjZS1tYXAvLS9pbmxpbmUtc291cmNlLW1hcC0wLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLStUazBjY0dLZWRGeVQ0WS9vNHRZWTNDdDRxVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzb3VyY2UtbWFwIjogIn4wLjUuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbnNlcnQtbW9kdWxlLWdsb2JhbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5zZXJ0LW1vZHVsZS1nbG9iYWxzLy0vaW5zZXJ0LW1vZHVsZS1nbG9iYWxzLTcuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WRTZObFcrV0duMi9BZU9NZDQ5NkFIRlltRTdlTEtrVVk2VHkzMWs0b2c1dm1BM0ZqdXdlOXY2aWZINlh4L0h6MjdRdmRvTW92aXcxL3BxV1JCMDlTdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiSlNPTlN0cmVhbSI6ICJeMS4wLjMiLAorICAgICAgICAiYWNvcm4tbm9kZSI6ICJeMS41LjIiLAorICAgICAgICAiY29tYmluZS1zb3VyY2UtbWFwIjogIl4wLjguMCIsCisgICAgICAgICJjb25jYXQtc3RyZWFtIjogIl4xLjYuMSIsCisgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS4wIiwKKyAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAiXjEuMC4xIiwKKyAgICAgICAgInByb2Nlc3MiOiAifjAuMTEuMCIsCisgICAgICAgICJ0aHJvdWdoMiI6ICJeMi4wLjAiLAorICAgICAgICAidW5kZWNsYXJlZC1pZGVudGlmaWVycyI6ICJeMS4xLjIiLAorICAgICAgICAieHRlbmQiOiAiXjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImludGVycHJldCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbnRlcnByZXQvLS9pbnRlcnByZXQtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mdEd4UVF4cURnOTR6NVhUdUVRTVkvZUxoaFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtYWJzb2x1dGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWJzb2x1dGUvLS9pcy1hYnNvbHV0ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZE9Xb3FmbHZjeWRBUmEzNjBHdnYxOERaL2dSdUhLaTJOVS93VTVYMVpGemRZZkgyOW5raU5ac0YzbXA0T0ozSDR5bzlNeDhBL3VBR056cHpQTjN5QkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXJlbGF0aXZlIjogIl4xLjAuMCIsCisgICAgICAgICJpcy13aW5kb3dzIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMC4xLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xZUVzczY2TmgyY243dTg0US9pZ2lYdGNtTlk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1hcnJheWlzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hcnJheWlzaC8tL2lzLWFycmF5aXNoLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZDhtWVFGSjZxT3l4cUxwcGU0QmtXbnFTYXAwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1idWZmZXIvLS9pcy1idWZmZXItMS4xLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5jZEFMd3BYa1RtNVp2dmJrN293T1VTdlZ2QktEZ0tQNS9ld2ZYRXpubVFGZnM0WlJtYW5PZUtCVGpSVmprYTNRRm9ONlhKKzlGM1VTcWZIcVRhVTV3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1idWlsdGluLW1vZHVsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWJ1aWx0aW4tbW9kdWxlLy0vaXMtYnVpbHRpbi1tb2R1bGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WQVZ5MDA5Nnd4R2ZqM2JEREx3YkhnTjYvNzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnVpbHRpbi1tb2R1bGVzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DMTdtU0RpT0xJWUNndWVUOFlWdjdEOHdHMVk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTAuMS42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hdkRZcjBTQjNEd085enNNb3YwZ0tDRVNGWXFDbkU0aHEvNHozVGRVbHVrRXk1dDlDMFlScTdITHJzTjUyTkFjcVhLYWVwZUNEMG4rQjBhcm5WRzNIZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMC4xLjYiLAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4wLjEuNCIsCisgICAgICAgICJraW5kLW9mIjogIl41LjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjEuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTUuMS4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkdFRXJuSDZGMnZVdVhEaCtPbGJjS1c3L3dPY2ZkUkhhWjdWV3RxQ3p0ZkhyaS8rK1lLbVA1MU9kV2VHUHVxQ09iYTZrazJPVGU1ZDAyVm1UQjgwUHc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZXh0ZW5kYWJsZS8tL2lzLWV4dGVuZGFibGUtMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZckVRNG9ta2NVR09Qc05xWVgxSExqQWQvSWs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZXh0Z2xvYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRnbG9iLy0vaXMtZXh0Z2xvYi0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFJd0NVMWVSOEM3VGZIYWh1ZXFYYzhneitNST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1maW5pdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZmluaXRlLy0vaXMtZmluaXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtekdaM2FWWUN2bFVPOFI2TFNxWXdVMEsyMEtvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm51bWJlci1pcy1uYW4iOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZ2xvYi8tL2lzLWdsb2ItMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lNld1SkNGNEJLeHdjSHVXa2lWblNHekQ2RW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZXh0Z2xvYiI6ICJeMi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtbnVtYmVyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLW51bWJlci8tL2lzLW51bWJlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUpQMWlBYVI0TFBVRlljZ1FKMnI4ZlJMWEVaVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLXBsYWluLW9iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wbGFpbi1vYmplY3QvLS9pcy1wbGFpbi1vYmplY3QtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWg1UHBnWGtXaXRjMzhCQk1ZYXdUWU1XSkhGWkpWbkJxdUZFNTd4RnBqQjhwSkZpRjZnWitiVStXeUkveXFYaUZSNW1kTHNnWU5hUGU4dWFvNlV2OU9nPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcmVsYXRpdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcmVsYXRpdmUvLS9pcy1yZWxhdGl2ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS3cvUmVLMGlxd0tldTBNSVRMRnVqMGpiUEFtRWlPc0l3eUlYdnZiZmE2UWZtTjlwa0QxTSs4cGRrN1JsL2RUS2JIMzQvWEJGTWJnRDRpTUpoTFFiR0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXVuYy1wYXRoIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtc3RyZWFtLy0vaXMtc3RyZWFtLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRXRTajNVNW80TGVjNjQyOGhCYzY2QTJSeWtRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXR5cGVkYXJyYXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtdHlwZWRhcnJheS8tL2lzLXR5cGVkYXJyYXktMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS01SG5JQ0ZqZkRCc1IzZHBwUVBsZ0VmemFTcG89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtdW5jLXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtdW5jLXBhdGgvLS9pcy11bmMtcGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbXJHcFZkMGZzN1dXTGZWc1N0dmdGNmlFSm5iakRGWmg5L2VtaFJEY0dXVGR1VGZOSGQ5Q0hlVXdIM2dZSWpkYndvNE9uNmh1bmt6dHdPYUF3MHlsbFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuYy1wYXRoLXJlZ2V4IjogIl4wLjEuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy11dGY4IjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXV0ZjgvLS9pcy11dGY4LTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtU3cyaFJDRUUwYk0yTkE2QWVYNkdYUE9mZlhJPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXdpbmRvd3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtd2luZG93cy8tL2lzLXdpbmRvd3MtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVYSzFVSW5xMmJQbWp5WDZlM1ZISXpNTG9iYzRKOTRpNEFXbitIcHEzT1U1S2tyUkM5Nk9BY1IzUFJKL3BHdTZtOFRSbkJIUDlka1hRVnNUL0NPVklBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc2FycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzYXJyYXkvLS9pc2FycmF5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdTVOZFNGZ3N1aGFNQm9OSlY2VktQZ2NTVHhFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzZXhlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzZXhlLy0vaXNleGUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02UHZ6ZE54VmIvaVVlaERjc0ZjdFl6OHMraEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXNvYmplY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNvYmplY3QvLS9pc29iamVjdC0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVRrTWVrckVhbHpGamFxSDV5TkhNdlAycmVOOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc3N0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc3N0cmVhbS8tL2lzc3RyZWFtLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUitZL2V2VmErbStTNFZBT2FRNjR1RktjQ1pvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzLXlhbWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMteWFtbC8tL2pzLXlhbWwtMy41LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BM2ZEZ0JmS3ZITWlzTkg3elNXa2tXUWZMNzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJncGFyc2UiOiAiXjEuMC4yIiwKKyAgICAgICAgImVzcHJpbWEiOiAiXjIuNi4wIgorICAgICAgfQorICAgIH0sCisgICAgImpzMnhtbHBhcnNlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qczJ4bWxwYXJzZXIvLS9qczJ4bWxwYXJzZXItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QN1lPcWdpY1ZFRDVNWjlSZGd6TkIrSkpsek09IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInhtbGNyZWF0ZSI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAianNibiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2JuLy0vanNibi0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBlWlV3dVdpM3JYeUFkbHM3N3lvREE3eTlSTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJqc2RvYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2RvYy8tL2pzZG9jLTMuNS41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02UHhCNjVUQVU0V08wV3p5ci80L1lobEdvdlhsMEVWWWZwS2JwU3JvU2owcUJ4VDQveG9kL2w0ME9wa20zOGRSSFJkUWdkZVk4MzZNMHVWbkpRRzdrZz09IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhYnlsb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAgICJibHVlYmlyZCI6ICJ+My41LjAiLAorICAgICAgICAiY2F0aGFyc2lzIjogIn4wLjguOSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJ+MS4wLjUiLAorICAgICAgICAianMyeG1scGFyc2VyIjogIn4zLjAuMCIsCisgICAgICAgICJrbGF3IjogIn4yLjAuMCIsCisgICAgICAgICJtYXJrZWQiOiAifjAuMy42IiwKKyAgICAgICAgIm1rZGlycCI6ICJ+MC41LjEiLAorICAgICAgICAicmVxdWl6emxlIjogIn4wLjIuMSIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIn4yLjAuMSIsCisgICAgICAgICJ0YWZmeWRiIjogIjIuNi4yIiwKKyAgICAgICAgInVuZGVyc2NvcmUiOiAifjEuOC4zIgorICAgICAgfQorICAgIH0sCisgICAgImpzaGludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuOS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2hpbnQvLS9qc2hpbnQtMi45LjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVE4WE4zOGhHc1ZRaGRsTSs0Z2QxWGw3T0IxVmllU3VDSmYrZkVKanBvNTlKSDk5YlZKaFhSWEFoMjZxUTE1d2ZkZDFWUE11RFdOZVNXb05sNTNUNFlBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjbGkiOiAifjEuMC4wIiwKKyAgICAgICAgImNvbnNvbGUtYnJvd3NlcmlmeSI6ICIxLjEueCIsCisgICAgICAgICJleGl0IjogIjAuMS54IiwKKyAgICAgICAgImh0bWxwYXJzZXIyIjogIjMuOC54IiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy4xMCIsCisgICAgICAgICJtaW5pbWF0Y2giOiAifjMuMC4yIiwKKyAgICAgICAgInNoZWxsanMiOiAiMC4zLngiLAorICAgICAgICAic3RyaXAtanNvbi1jb21tZW50cyI6ICIxLjAueCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAic3RyaXAtanNvbi1jb21tZW50cyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuNCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWpzb24tY29tbWVudHMvLS9zdHJpcC1qc29uLWNvbW1lbnRzLTEuMC40LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUhoWDd5c2w5UHVtYjh0YzdUR1ZyQ0N1Nis1RT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJqc2xpbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEyLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzbGludC8tL2pzbGludC0wLjEyLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJvQ3N5SUNjS0ErNlRGc2J5czlEcEtUZlBWYUM3MU1tNVFTanZyV0EwbERWTitMSXZ4NmFwYTQyRkZpc01xbUNUdko4RHhrY29RR0owajdtM2tUVm93PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleGl0IjogIn4wLjEuMiIsCisgICAgICAgICJnbG9iIjogIn43LjEuMiIsCisgICAgICAgICJub3B0IjogIn4zLjAuMSIsCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAifjIuMS41IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJub3B0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMC42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9wdC8tL25vcHQtMy4wLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEteGtaZHZ3aXJ6VTJ6V1RGL2VheG9wa2F5ai9rPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFiYnJldiI6ICIxIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC43IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvLS9wcm9jZXNzLW5leHRpY2stYXJncy0xLjAuNy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1GUTRndDFaWkN0UDVFSlB5V2s4cTJML3pDNk09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMS41IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMi4xLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWnZxTGNnNFVPTE5rYUI4cTBhWThZWVJJeWRBPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImJ1ZmZlci1zaGltcyI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMSIsCisgICAgICAgICAgICAiaXNhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4xLjAuNiIsCisgICAgICAgICAgICAic3RyaW5nX2RlY29kZXIiOiAifjAuMTAueCIsCisgICAgICAgICAgICAidXRpbC1kZXByZWNhdGUiOiAifjEuMC4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN0cmluZ19kZWNvZGVyIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMTAuMzEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZ19kZWNvZGVyLy0vc3RyaW5nX2RlY29kZXItMC4xMC4zMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZdUlEdkVGMmJHd295ZnlFTUIyckhGTVErcFE9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAianNvbi1pbnQ2NCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLWludDY0Ly0vanNvbi1pbnQ2NC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteXJUZzlzd1RvRWxoRVBFVExNZFprRXpEaGJYTHMrY3hrdy9iMnJnbE1QT0JsTTFERTB1dEgxRVJlU01MY25wWUprNWlVdkQxMnIwZlAyL3hIaXRGNVE9PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJub2RlLWludDY0IjogIjAuNC4wIgorICAgICAgfQorICAgIH0sCisgICAgImpzb24tc2NoZW1hIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24tc2NoZW1hLy0vanNvbi1zY2hlbWEtMC4yLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10SURJa3VXYUx3V1ZUT2NudlQ4cVRvZ3ZuaE09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zY2hlbWEtdHJhdmVyc2UvLS9qc29uLXNjaGVtYS10cmF2ZXJzZS0wLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteGJiQ0g1ZENZVTVUOExjRWhodWg3SEo4OEhYdVczcXNJM1kwek9aRktmWkVIY3BXaUhVL0p4ems2MjlCcnNhYi9tTWlIUXRpOXdNUCs4NDVSUGUzVmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzb24tc3RhYmxlLXN0cmluZ2lmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXN0YWJsZS1zdHJpbmdpZnkvLS9qc29uLXN0YWJsZS1zdHJpbmdpZnktMC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZUndqNkJUYk4xVW4zNFVSazl0WjNTcnlmMFU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAianNvbmlmeSI6ICJ+MC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAianNvbi1zdHJpbmdpZnktc2FmZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXN0cmluZ2lmeS1zYWZlLy0vanNvbi1zdHJpbmdpZnktc2FmZS01LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUVwYWkxWS9VWHhtZzlzNEIxbGNCNHNjMXR1cz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJqc29uZmlsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uZmlsZS8tL2pzb25maWxlLTIuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTnphaXRDaTRlNzJneklPMVA2UFdNNk5jS3VnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuNiIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc29uaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb25pZnkvLS9qc29uaWZ5LTAuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTEhTMjdrSFpQS1ViZTFxdTZQVURZeDBsS25NPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzb25wYXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29ucGFyc2UvLS9qc29ucGFyc2UtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QMDJ1U3BINnd4WDNFR0w0VWh6Q09mRTJZb0E9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianNwcmltIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzcHJpbS8tL2pzcHJpbS0xLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1UNW12QjVjd0c1RGk4RzNTWnd1WEZhc3RxST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICIxLjAuMCIsCisgICAgICAgICJleHRzcHJpbnRmIjogIjEuMy4wIiwKKyAgICAgICAgImpzb24tc2NoZW1hIjogIjAuMi4zIiwKKyAgICAgICAgInZlcnJvciI6ICIxLjEwLjAiCisgICAgICB9CisgICAgfSwKKyAgICAia2V3IjogeworICAgICAgInZlcnNpb24iOiAiMC43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tldy8tL2tldy0wLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVkazlMVE0yUFcvZEtYQ3pOZGtVR3RXUjE1cz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJraW5kLW9mIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTYuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zNWtMT2NuSDBYcURPK0Z2dWFMWDhERGpaMThDR0ZrN1Z5Z0g0MFFvS1BVUWhXNGUycnZNMHJ3VXEwdDhJUURPd1lTZUxLMDFVOTBPanpCVG1lMlFxQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAia2xhdyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rbGF3Ly0va2xhdy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdjRW80TnhjNUJBZ0VWRVpUdXVjdjRXR1VQWT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS45IgorICAgICAgfQorICAgIH0sCisgICAgImt1bGVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2t1bGVyLy0va3VsZXItMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUo5blZVdWNHMXAvc2tLdWw2RFUzUFVacmhzMExQdWxOYWVVT294MEl5WERpOFM0Q3p0VEhzMWdRcGhodVptelhHN1ZPUVNmNk5KZkt1enRlUUx2OWdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xvcm5hbWVzIjogIl4xLjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJsYWJlbGVkLXN0cmVhbS1zcGxpY2VyIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbGFiZWxlZC1zdHJlYW0tc3BsaWNlci8tL2xhYmVsZWQtc3RyZWFtLXNwbGljZXItMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU1DOTRtSFpSdkozTGZ5a0psVFVpcEJxZW5aejFwYWNPWkVNaGhROGRNR2NESHMwU0JFNUdic2F2VVhWN1l0UDNpY0JXMTdXMFp5MUkwbGZBU21vOVBnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjEiLAorICAgICAgICAiaXNhcnJheSI6ICJeMi4wLjQiLAorICAgICAgICAic3RyZWFtLXNwbGljZXIiOiAiXjIuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJpc2FycmF5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNhcnJheS8tL2lzYXJyYXktMi4wLjQudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HTXhYT2lVaXJXZzF4VEtSaXBNMEVrMDdyWCt1Yng0bk5WRWxUSmROTFltTk8vMllyRGtnSkd3OUNsalhuK3I0RVdpRFFnLzhsc1JkSHlnMlBKdVVhQT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAibGF6eS1jYWNoZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sYXp5LWNhY2hlLy0vbGF6eS1jYWNoZS0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW9kZVB3NlVFZE11QWhGMDdPMjRkcEpwRWJvND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJsaWZ0b2ZmIjogeworICAgICAgInZlcnNpb24iOiAiMi41LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xpZnRvZmYvLS9saWZ0b2ZmLTIuNS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSUFrcEc3TWM2b1lidnhDbndWb295dmRjTWV3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4dGVuZCI6ICJeMy4wLjAiLAorICAgICAgICAiZmluZHVwLXN5bmMiOiAiXjIuMC4wIiwKKyAgICAgICAgImZpbmVkIjogIl4xLjAuMSIsCisgICAgICAgICJmbGFnZ2VkLXJlc3Bhd24iOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjQiLAorICAgICAgICAib2JqZWN0Lm1hcCI6ICJeMS4wLjAiLAorICAgICAgICAicmVjaG9pciI6ICJeMC42LjIiLAorICAgICAgICAicmVzb2x2ZSI6ICJeMS4xLjciCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImZpbmR1cC1zeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZHVwLXN5bmMvLS9maW5kdXAtc3luYy0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1reWF4U0l3aTBhWUlobENvYVFHeTJha0tMTHc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZGV0ZWN0LWZpbGUiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1nbG9iIjogIl4zLjEuMCIsCisgICAgICAgICAgICAibWljcm9tYXRjaCI6ICJeMy4wLjQiLAorICAgICAgICAgICAgInJlc29sdmUtZGlyIjogIl4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJsb2FkLWpzb24tZmlsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2xvYWQtanNvbi1maWxlLy0vbG9hZC1qc29uLWZpbGUtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sV2tGY0kxWXRMcTB3aVliQlBXZk1jbVRkTUE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS4yIiwKKyAgICAgICAgInBhcnNlLWpzb24iOiAiXjIuMi4wIiwKKyAgICAgICAgInBpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIsCisgICAgICAgICJzdHJpcC1ib20iOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImxvZGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMTcuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvZGFzaC8tL2xvZGFzaC00LjE3LjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jUUtoOGlnbzVRVWhaN2xnMzhEWVdBeE12alNBS0cwQTh3R1NWaW1QMDdTSVVFSzJVTythclNSS2JSWld0ZWxNdE41VjBIa3doNXJ5T3RvL1NzaFlJZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibG9kYXNoLm1lbW9pemUiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9kYXNoLm1lbW9pemUvLS9sb2Rhc2gubWVtb2l6ZS0zLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUxjdlN3b2ZMd0tWY3hDTW92UXh6WVZEVlBqOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJsb2dmb3JtIjogeworICAgICAgInZlcnNpb24iOiAiMS4xMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sb2dmb3JtLy0vbG9nZm9ybS0xLjEwLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVtNW9qSWhVMThmSU1Pdy8zMzNtRCtaTEUyZmlzMEV6WGwxWndIeDRpUXptcFFpNm9kTmlZL3QrSVROcjMzSlpoVDkvS0VhSCtVUElpcHI2YTlFaldnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xvcnMiOiAiXjEuMi4xIiwKKyAgICAgICAgImZhc3Qtc2FmZS1zdHJpbmdpZnkiOiAiXjIuMC40IiwKKyAgICAgICAgImZlY2hhIjogIl4yLjMuMyIsCisgICAgICAgICJtcyI6ICJeMi4xLjEiLAorICAgICAgICAidHJpcGxlLWJlYW0iOiAiXjEuMi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJjb2xvcnMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4zLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvcnMvLS9jb2xvcnMtMS4zLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tbUd0LzFwWnFZUmpNeEIxYXhoVG8xNi9zblZaNWtycktrY21NZVZLeHpFQ01NWG9DZ252VFBwMTBRZ0hmY2JRWnc4RHEyak1ORzZqZTRKbFdVMGdXZz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAibXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGdwK2RsNWNHazI4dXRZa3RCc3JGcUE3SEtncmhnUHNnNlovRWZoV0k0Z2wxSHdxOEIvR21ZLzBvWFo2bkY4aERWZXNTL0ZwbllhRC9rT1doWVF2eWc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImxvbmdlc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9uZ2VzdC8tL2xvbmdlc3QtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NS0N5MmpqM04zRG9LVW9OSXVaaVh0ZDlBSmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibG91ZC1yZWplY3Rpb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG91ZC1yZWplY3Rpb24vLS9sb3VkLXJlamVjdGlvbi0xLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVcwYjRBVWZ0N2xlSWNQQ0cwRWdoejVtT1ZSOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjdXJyZW50bHktdW5oYW5kbGVkIjogIl4wLjQuMSIsCisgICAgICAgICJzaWduYWwtZXhpdCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAibWFrZS1pdGVyYXRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYWtlLWl0ZXJhdG9yLy0vbWFrZS1pdGVyYXRvci0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcHhpdVhoMGlWRXE3Vk03S01JaHM1Z3hzZnhDdXgyVVJwdFVRYVhvNGlaWkp4QkF6VFBPTEUyQnVtTzVkYmZWWXEvaEJKRkJSL2ExbUZEbU94NUFHbXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgIm1hcC1jYWNoZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXAtY2FjaGUvLS9tYXAtY2FjaGUtMC4yLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13eXE5QzlaU1hac0ZGa1c3VHlhc1hjbUtEYjg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWFwLW9iaiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXAtb2JqLy0vbWFwLW9iai0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJUUE91U0JkZ3IzUFNJYjJkQ3ZjSzAzcUZHMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtYXAtdmlzaXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFwLXZpc2l0Ly0vbWFwLXZpc2l0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN055bzhURkU1bUR4dGIxQjhTODBlZG1OKzQ4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9iamVjdC12aXNpdCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAibWFya2VkIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjE5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXJrZWQvLS9tYXJrZWQtMC4zLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lYTJlR1dPcU54UGNYdjhkeUVSZFNyLzZGbXp2V3d6ak14cGZHQi9zYk1jY1hvY3QreFkrWXVrUEQrUVRVWnd5dks3Qlp3Y3I0bTIxV0JPVzQxcEFrZz09IgorICAgIH0sCisgICAgIm1heG1pbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXhtaW4vLS9tYXhtaW4tMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jVFplaEttZDJQaXo5OVg5NHZBTkhuOXp2bUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgImZpZ3VyZXMiOiAiXjEuMC4xIiwKKyAgICAgICAgImd6aXAtc2l6ZSI6ICJeMS4wLjAiLAorICAgICAgICAicHJldHR5LWJ5dGVzIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1kNS5qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tZDUuanMvLS9tZDUuanMtMS4zLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXhpdFArV3hOUGNUVE9nblRKY3JoTTB4dmRQZXBpcFBTZjNJOEVJcEdLZUZManQzUGxKTElERzN1OEVYNTNaSXVia2IrNVUyKzNyRUxZcEVoSGh6ZGtnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXNoLWJhc2UiOiAiXjMuMC4wIiwKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4xLjIiCisgICAgICB9CisgICAgfSwKKyAgICAibWVvdyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21lb3cvLS9tZW93LTMuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtY3N0bWkwSlNLQ2tLdS9xRmFKSlljd2lvQWZzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZS1rZXlzIjogIl4yLjAuMCIsCisgICAgICAgICJkZWNhbWVsaXplIjogIl4xLjEuMiIsCisgICAgICAgICJsb3VkLXJlamVjdGlvbiI6ICJeMS4wLjAiLAorICAgICAgICAibWFwLW9iaiI6ICJeMS4wLjEiLAorICAgICAgICAibWluaW1pc3QiOiAiXjEuMS4zIiwKKyAgICAgICAgIm5vcm1hbGl6ZS1wYWNrYWdlLWRhdGEiOiAiXjIuMy40IiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMC4xIiwKKyAgICAgICAgInJlYWQtcGtnLXVwIjogIl4xLjAuMSIsCisgICAgICAgICJyZWRlbnQiOiAiXjEuMC4wIiwKKyAgICAgICAgInRyaW0tbmV3bGluZXMiOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vMUFJc2c5Qk9EN3NIN2tVOU0xZDk1b21Rb1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAibWljcm9tYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4xMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWljcm9tYXRjaC8tL21pY3JvbWF0Y2gtMy4xLjEwLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NV2lrZ2w5bjlNM3crYnBzWTNIZThMK3c5ZUY5MzM4eFJsOElBTzV2aURpendTenppRkV5VXpvMnhycmxvQjY0QURiVGY4dUE4dlJxcXR0RFRPbWNjZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyLWRpZmYiOiAiXjQuMC4wIiwKKyAgICAgICAgImFycmF5LXVuaXF1ZSI6ICJeMC4zLjIiLAorICAgICAgICAiYnJhY2VzIjogIl4yLjMuMSIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjIuMC4yIiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4zLjAuMiIsCisgICAgICAgICJleHRnbG9iIjogIl4yLjAuNCIsCisgICAgICAgICJmcmFnbWVudC1jYWNoZSI6ICJeMC4yLjEiLAorICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiLAorICAgICAgICAibmFub21hdGNoIjogIl4xLjIuOSIsCisgICAgICAgICJvYmplY3QucGljayI6ICJeMS4zLjAiLAorICAgICAgICAicmVnZXgtbm90IjogIl4xLjAuMCIsCisgICAgICAgICJzbmFwZHJhZ29uIjogIl4wLjguMSIsCisgICAgICAgICJ0by1yZWdleCI6ICJeMy4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAibWlsbGVyLXJhYmluIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbGxlci1yYWJpbi8tL21pbGxlci1yYWJpbi00LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMTE1ZkxodlpWcVd3SFBiQ2x5bnR4RVZmVkRmbDlETExUdUp2cTNnMk8vT3hpOEFpTm91QUh2RFN6SFMwdmlVSmMrVjV2bTNlcTkxWHdxbjlkcDRqUkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJuLmpzIjogIl40LjAuMCIsCisgICAgICAgICJicm9yYW5kIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJtaW1lIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbWUvLS9taW1lLTIuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pa0JjV3d5cVhRU0hLdGNpQ2NjdHU5WWZQYkZZWjQrZ2JIRW1FMFE4anpjVFlRZzVkSENyM2cyd3dBWmpQb0pmUVZYWnE2S1hBanBYT1RmNS9jalQ3dz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltZS1kYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMzcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS1kYi8tL21pbWUtZGItMS4zNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SM0M0ZGI2YmdRaGxJaFBVNDhmVXRkVm1LbmZscStoUmRhZDdJeUtodEZqMDZWUE5WZGsyUmhpWUwzVWpRSWxzbzhMK1l4QXRGa29iVDBWSytTL3liZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltZS10eXBlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4yMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS10eXBlcy8tL21pbWUtdHlwZXMtMi4xLjIxLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0zaUw2RGJ3cHlMempSM3hIU0ZORmViOU56L004V0RrWDMzdDFHRlFuRk9sbFdrOHBPcmgvTFNyQjVPWGxubFc1UDlMSDczWDZsb1cvZW9nYytGNWxKZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWltZS1kYiI6ICJ+MS4zNy4wIgorICAgICAgfQorICAgIH0sCisgICAgIm1pbmltYWxpc3RpYy1hc3NlcnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1hbGlzdGljLWFzc2VydC8tL21pbmltYWxpc3RpYy1hc3NlcnQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVV0SmNBRDR5RWFHdGpQZXpXdU85d0M0bndVblZILzgvSW0zeUVIUVA0YjY3Y1hsRC9RcjloZElUQ1UxeERiU0VYZzJYS05hUDhqc1JlVjd2UWQwMC9BPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltYWxpc3RpYy1jcnlwdG8tdXRpbHMvLS9taW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOXNBTUhBc0lJa2JseE5tZCs0eDhDRHNyV0NvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1pbmltYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWF0Y2gvLS9taW5pbWF0Y2gtMy4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlKSFZRRWh5cVBMVVRndDlCODNQWHU2VzNyeDRNdnZIdlNVdlRvb2dwd29HRE9VUSt5RHJSMEhSb3QreU9DZENPN3U0aFgzcFdmdDZrV0JCY3FoMFVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJicmFjZS1leHBhbnNpb24iOiAiXjEuMS43IgorICAgICAgfQorICAgIH0sCisgICAgIm1pbmltaXN0IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0wLjAuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWhYL0t2OE01ZlNZbHVDS0NZdWhxcDZBUnNGMD0iCisgICAgfSwKKyAgICAibWl4aW4tZGVlcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taXhpbi1kZWVwLy0vbWl4aW4tZGVlcC0xLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItOFpJdExIZUVnYXFFdmQ1bFlCWGZtNEVaU0ZDWDI5SmI5SytsQUhoREt6UmVLQlFLajNSKzdOT0Y2dGpxWWk5dDRvSThWVWZhV0lUSlFtODZ3blhHTlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1pbiI6ICJeMS4wLjIiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMS4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRlbmRhYmxlLy0vaXMtZXh0ZW5kYWJsZS0xLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFyblhNeFQxaGhvS285azFMWmRtbE55SmRERGZ5MnYwZlhqRmxtb2s0K2k4dWwvNldsYlZnZTliaE03NE9wTlBRUE1HVVRvRHR6K0tYYTFQbmVKeE9BPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC40IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1rZGlycCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21rZGlycC8tL21rZGlycC0wLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1BVjBPT3JHejMrTVIyZnpoa2pXYVgxMXlRTT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWluaW1pc3QiOiAiMC4wLjgiCisgICAgICB9CisgICAgfSwKKyAgICAibW9kdWxlLWRlcHMiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbW9kdWxlLWRlcHMvLS9tb2R1bGUtZGVwcy02LjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItaEtQbU8wNnNvNmJML1p2cVZOVnFkVFZPOFVBWXNpM3RRV2xDYSt6OUt1V2hvTjRLRFF0YjVoY3FRUXY1OHFZaURFMjF3SXZudHRaRVBpRGdFYnB3YkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIkpTT05TdHJlYW0iOiAiXjEuMC4zIiwKKyAgICAgICAgImJyb3dzZXItcmVzb2x2ZSI6ICJeMS43LjAiLAorICAgICAgICAiY2FjaGVkLXBhdGgtcmVsYXRpdmUiOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbmNhdC1zdHJlYW0iOiAifjEuNi4wIiwKKyAgICAgICAgImRlZmluZWQiOiAiXjEuMC4wIiwKKyAgICAgICAgImRldGVjdGl2ZSI6ICJeNS4wLjIiLAorICAgICAgICAiZHVwbGV4ZXIyIjogIl4wLjEuMiIsCisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjEiLAorICAgICAgICAicGFyZW50cyI6ICJeMS4wLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjAuMiIsCisgICAgICAgICJyZXNvbHZlIjogIl4xLjQuMCIsCisgICAgICAgICJzdHJlYW0tY29tYmluZXIyIjogIl4xLjEuMSIsCisgICAgICAgICJzdWJhcmciOiAiXjEuMC4wIiwKKyAgICAgICAgInRocm91Z2gyIjogIl4yLjAuMCIsCisgICAgICAgICJ4dGVuZCI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAibXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZnaXVyZndBdm13cEFkOWZtR0Y0amVEVmw4Zz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJuYW5vbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMTMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25hbm9tYXRjaC8tL25hbm9tYXRjaC0xLjIuMTMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWZwb2UyVDBSYkh3QlRCVU9mdEFmQlBhREVpMDZ1ZmFVYWkwbUU2WW4xa2FjYzNTblRFcmZiL2grWDk0Vlh6STY0cktGSFlJbVhTdmR3R0dDbXdPcUNBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItZGlmZiI6ICJeNC4wLjAiLAorICAgICAgICAiYXJyYXktdW5pcXVlIjogIl4wLjMuMiIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjIuMC4yIiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4zLjAuMiIsCisgICAgICAgICJmcmFnbWVudC1jYWNoZSI6ICJeMC4yLjEiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjIiLAorICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiLAorICAgICAgICAib2JqZWN0LnBpY2siOiAiXjEuMy4wIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm5pY2UtdHJ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25pY2UtdHJ5Ly0vbmljZS10cnktMS4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFuaDQ1ZGVlYjVvbE5ZN2VYODJCa1BPN1NTeFI1U1NZSmlQVHJUZEZVVll3QWw4Q0tNQTVOOVBqVFlrSGlSamlzVmN4Y1ExSFhkTGh4MnF4eEp6TE5RPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJub2RlLWd5cC1idWlsZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub2RlLWd5cC1idWlsZC8tL25vZGUtZ3lwLWJ1aWxkLTMuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ML0VnMDJFcHg2U2kyTlhtZWR4K09rZys0VUhxbWFmM1ROY3hkNTBTRjlOUUdjSmFPTjNBdFUrK2theDY5WFY3WVd6NHRVc3BxWlNBc1ZvZmhGS0cydz09IgorICAgIH0sCisgICAgIm5vZGUtaW50NjQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9kZS1pbnQ2NC8tL25vZGUtaW50NjQtMC40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oNmtHWE5zMVhUR0MyUGxNNFJHSXVDWEdpanM9IgorICAgIH0sCisgICAgIm5vcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9wdC8tL25vcHQtNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0wTlJvV3YxVUZSazhqSFVGWUMwTkY4MWtSMDA9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFiYnJldiI6ICIxIiwKKyAgICAgICAgIm9zZW52IjogIl4wLjEuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJub3JtYWxpemUtcGFja2FnZS1kYXRhIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcm1hbGl6ZS1wYWNrYWdlLWRhdGEvLS9ub3JtYWxpemUtcGFja2FnZS1kYXRhLTIuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi05ampVRmJUUGZFeTNSL2FkLzJvTmJLdFc5SGdvdmw1TzFGdkZXS2tLYmxOWG9OL09vdTYrOStLS29oUEsxM1ljMy9UeXVueVdoSnA2Z3ZSTlIvUFBBdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaG9zdGVkLWdpdC1pbmZvIjogIl4yLjEuNCIsCisgICAgICAgICJpcy1idWlsdGluLW1vZHVsZSI6ICJeMS4wLjAiLAorICAgICAgICAic2VtdmVyIjogIjIgfHwgMyB8fCA0IHx8IDUiLAorICAgICAgICAidmFsaWRhdGUtbnBtLXBhY2thZ2UtbGljZW5zZSI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAibnVtYmVyLWlzLW5hbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9udW1iZXItaXMtbmFuLy0vbnVtYmVyLWlzLW5hbi0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNYdGdLMU5DS2xJc0d2dUhrREdETnBRYUFSMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYXV0aC1zaWduIjogeworICAgICAgInZlcnNpb24iOiAiMC45LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29hdXRoLXNpZ24vLS9vYXV0aC1zaWduLTAuOS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mZXhoVUZGUFRHVjh5YkF0U0lHYlY2Z09rU3Y4VXRSYkRCbkF5TFF3NFFQS2tnTmxzSDJCeVBHdE1VcWRXa29zNllDUm1BcVZpd2dackpjL21SRHpaUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWFzc2lnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtYXNzaWduLy0vb2JqZWN0LWFzc2lnbi00LjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlRbXR4NVpZaDgvQVhMdlVRc3JJdjdzMkNHTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYmplY3QtY29weSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtY29weS8tL29iamVjdC1jb3B5LTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZm4yRmkzZ2IxOG1ScEJ1cGRlMDRFblZPbVl3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvcHktZGVzY3JpcHRvciI6ICJeMC4xLjAiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMi41IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTAuMi41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXcxc2UrUmpzUEprUG1sdkZlK0JLck94Y2dSWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAib2JqZWN0LXZpc2l0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC12aXNpdC8tL29iamVjdC12aXNpdC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTk1eEVrNjhNVTNlMW4rT2RPVjVCQkMzUVJicz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAib2JqZWN0LmRlZmF1bHRzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC5kZWZhdWx0cy8tL29iamVjdC5kZWZhdWx0cy0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9uK0dnelMwQjk2Z2JhRnRpTlhOS2VRMS9zOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS1lYWNoIjogIl4xLjAuMSIsCisgICAgICAgICJhcnJheS1zbGljZSI6ICJeMS4wLjAiLAorICAgICAgICAiZm9yLW93biI6ICJeMS4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC5tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0Lm1hcC8tL29iamVjdC5tYXAtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16NFBsbmNqOHdLMWZRbERoOTRzN2diMkFIVGM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZm9yLW93biI6ICJeMS4wLjAiLAorICAgICAgICAibWFrZS1pdGVyYXRvciI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAib2JqZWN0LnBpY2siOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LnBpY2svLS9vYmplY3QucGljay0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWg2RUt4TUZwUzlMaHkvVTFrYVpoUWZ0ZDEwYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAib25jZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vbmNlLy0vb25jZS0xLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdEc2FwM1dXSFVzUk9zRjluRkM2NzUzWGE5RT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ3cmFwcHkiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJvbmUtdGltZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vbmUtdGltZS8tL29uZS10aW1lLTAuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK00zM2VJU0NiK1RmK1Q0Nm5NTjdIa1NBZEM0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9zLWJyb3dzZXJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3MtYnJvd3NlcmlmeS8tL29zLWJyb3dzZXJpZnktMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oVU56eC9YQ01Wa1UvSnY4YTlnamo5Mmg3Q2M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib3MtaG9tZWRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy1ob21lZGlyLy0vb3MtaG9tZWRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS83eEppRE51RG9NOTRNRm94KzhWSVNHcWY3TT0iCisgICAgfSwKKyAgICAib3MtdG1wZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zLXRtcGRpci8tL29zLXRtcGRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXUrWjBCc2VhcUZ4Yy9zZG0vbGMwVlYzNkVuUT0iCisgICAgfSwKKyAgICAib3NlbnYiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3NlbnYvLS9vc2Vudi0wLjEuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMENXY0NFQ2RNVmMyUnczVTV3OVpqcVg2Z2E2dWJrMXhEVkt4dEJRUEs3d2lzLzBGMnI5VDZrNHlkR1loZWNsN1lVQnhCVnhoTDVvaXNQc054QVBlMmc9PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvcy1ob21lZGlyIjogIl4xLjAuMCIsCisgICAgICAgICJvcy10bXBkaXIiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInAtZWFjaC1zZXJpZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcC1lYWNoLXNlcmllcy8tL3AtZWFjaC1zZXJpZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1rdzg5RXQwZlVPZERSRmVpTE5id1NzYXRmM0U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicC1yZWR1Y2UiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInAtcmVkdWNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3AtcmVkdWNlLy0vcC1yZWR1Y2UtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HTUt3M1pOcVJwQ2xLZmdqSDFpZy9iYWtmZm89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFrbyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYWtvLy0vcGFrby0xLjAuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItM0hOSzV0VzR4OG81bU84UnVIWnAzWWR3OWljWlh4MFJBTkFPTXpsTXp4N0xWWGhNSjRtbzNNT0JwenlkN3IvK1JVdThCbW5kUDQ3TFhUK3Z6anRXY1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhcmVudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyZW50cy8tL3BhcmVudHMtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0vdDFOSy9HVHAzZEYvbkhqY2RjOE13Zlp4MUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGF0aC1wbGF0Zm9ybSI6ICJ+MC4xMS4xNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJwYXJzZS1hc24xIjogeworICAgICAgInZlcnNpb24iOiAiNS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyc2UtYXNuMS8tL3BhcnNlLWFzbjEtNS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUtQeDdmbEtYZzc3NXpacG5wOVN4Smx6MDBnVGQ0Qm1KMnlKdWZTYzQ0Z01DUnJSUTdOU3pBY1NKUWZpZnVPTGdXNmJFaStmdHJBTHRzZ0FMZUIyQWR3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc24xLmpzIjogIl40LjAuMCIsCisgICAgICAgICJicm93c2VyaWZ5LWFlcyI6ICJeMS4wLjAiLAorICAgICAgICAiY3JlYXRlLWhhc2giOiAiXjEuMS4wIiwKKyAgICAgICAgImV2cF9ieXRlc3Rva2V5IjogIl4xLjAuMCIsCisgICAgICAgICJwYmtkZjIiOiAiXjMuMC4zIgorICAgICAgfQorICAgIH0sCisgICAgInBhcnNlLWZpbGVwYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhcnNlLWZpbGVwYXRoLy0vcGFyc2UtZmlsZXBhdGgtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1waklTZjFPcTg5RllkdldITHovNngyUFd5SkU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtYWJzb2x1dGUiOiAiXjEuMC4wIiwKKyAgICAgICAgIm1hcC1jYWNoZSI6ICJeMC4yLjAiLAorICAgICAgICAicGF0aC1yb290IjogIl4wLjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJwYXJzZS1qc29uIjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhcnNlLWpzb24vLS9wYXJzZS1qc29uLTIuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOUlEMEJEVHZnSFFmaEdrSm40M3FHUFZhVGNrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVycm9yLWV4IjogIl4xLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwYXJzZS1wYXNzd2QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyc2UtcGFzc3dkLy0vcGFyc2UtcGFzc3dkLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYlZ1VFNrVnBrN0k5Ti9RS09DMXZGbWFvNWNZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhc2NhbGNhc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFzY2FsY2FzZS8tL3Bhc2NhbGNhc2UtMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zMlBsWG9BR3ltL2lGNFRTMnlLOUZkZVJmeFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtYnJvd3NlcmlmeS8tL3BhdGgtYnJvd3NlcmlmeS0wLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQmFwQTQwTkhJQ09TK1VTWDlTTjR0eWhxK0EyUnJOL1dzNUYwWjVhTUhEcDk4Rmw4NmxYOE90aThCN3VOOTNMNElmdjRmSE9FQStwUXc4N2dtTU8vbFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtZXhpc3RzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtZXhpc3RzLy0vcGF0aC1leGlzdHMtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EK3RzWlBEOFVZMmFkVTNWNzdZc2NDSjJIMHM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBhdGgtaXMtYWJzb2x1dGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWlzLWFic29sdXRlLy0vcGF0aC1pcy1hYnNvbHV0ZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUYwdVNhSE5WTlArOGVzNXI5VHBhbmh0Y1gxOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWtleSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWtleS8tL3BhdGgta2V5LTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUVJ5dHRYVEZvVURUcExHUkRVRFlETW4wQzBBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtcGFyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1wYXJzZS8tL3BhdGgtcGFyc2UtMS4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdTbU9UMkViSHJJTkJmOVNSN0NERUx3bEo4QUVOazNRbjdPaWtLNG5GWUF1M090ZTIrSllOVnZrcEFFUW0zL1RMTkVKRkQveFpKanp5eGczS0JXT3p3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXBsYXRmb3JtIjogeworICAgICAgInZlcnNpb24iOiAiMC4xMS4xNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1wbGF0Zm9ybS8tL3BhdGgtcGxhdGZvcm0tMC4xMS4xNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZHUWhmM1REYUZEd2hTdDQzSHYzMUtWeUcvST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXJvb3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1yb290Ly0vcGF0aC1yb290LTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbWtwb0ZNckJ3TTF6TmdxVjh5Q0R5T3BIUmJjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtcm9vdC1yZWdleCI6ICJeMC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGF0aC1yb290LXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtcm9vdC1yZWdleC8tL3BhdGgtcm9vdC1yZWdleC0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXY4emNqZld4TGNVc2kwUHNPTkdOY3NCTHFXMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXR5cGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC10eXBlLy0vcGF0aC10eXBlLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2NSUGZ1U1IybkJOcEJYYVdrQnd1aytQNUVFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJwaWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGJrZGYyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjE3IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYmtkZjIvLS9wYmtkZjItMy4wLjE3LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VL2lsNU1zclpwN21HZzNtU1Fmbjc0Mm5hMlQrMS92SERDRzUvaVRJM1g5TUtVdVlVWlZMUWh5UnNnMDZtQ2dEQlRkNTdUeHpnWnQ3UCtmWWZqUkx0QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY3JlYXRlLWhhc2giOiAiXjEuMS4yIiwKKyAgICAgICAgImNyZWF0ZS1obWFjIjogIl4xLjEuNCIsCisgICAgICAgICJyaXBlbWQxNjAiOiAiXjIuMC4xIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjAuMSIsCisgICAgICAgICJzaGEuanMiOiAiXjIuNC44IgorICAgICAgfQorICAgIH0sCisgICAgInBlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGVuZC8tL3BlbmQtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lbGZyVlFwbmcva1JVekg4OUdZOVhJNEFlbEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGVyZm9ybWFuY2Utbm93IjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BlcmZvcm1hbmNlLW5vdy8tL3BlcmZvcm1hbmNlLW5vdy0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVl3bjA0T1g2a1Q3QnhwTUhyalpMU3pkOG5ucz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwaGFudG9tIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BoYW50b20vLS9waGFudG9tLTYuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi04YmI4dXJXb1VpWjBFK0pDNGdvYVlCRFB4bGpUbm54R3dvZ3o1Y3Zhc2gyU1FvdmYvL1FBUG9zaFhRejA2a1kvdHBJKzVjYUJWbmcwSzBvWmtWTU5JUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGhhbnRvbWpzLXByZWJ1aWx0IjogIl4yLjEuMTYiLAorICAgICAgICAic3BsaXQiOiAiXjEuMC4xIiwKKyAgICAgICAgIndpbnN0b24iOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBoYW50b21qcy1wcmVidWlsdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGhhbnRvbWpzLXByZWJ1aWx0Ly0vcGhhbnRvbWpzLXByZWJ1aWx0LTIuMS4xNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTc5SVNwS09XYlRaSGFFNm91bmlGU2I0cTcrOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlczYtcHJvbWlzZSI6ICJeNC4wLjMiLAorICAgICAgICAiZXh0cmFjdC16aXAiOiAiXjEuNi41IiwKKyAgICAgICAgImZzLWV4dHJhIjogIl4xLjAuMCIsCisgICAgICAgICJoYXNoYSI6ICJeMi4yLjAiLAorICAgICAgICAia2V3IjogIl4wLjcuMCIsCisgICAgICAgICJwcm9ncmVzcyI6ICJeMS4xLjgiLAorICAgICAgICAicmVxdWVzdCI6ICJeMi44MS4wIiwKKyAgICAgICAgInJlcXVlc3QtcHJvZ3Jlc3MiOiAiXjIuMC4xIiwKKyAgICAgICAgIndoaWNoIjogIl4xLjIuMTAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInByb2dyZXNzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS44IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvZ3Jlc3MvLS9wcm9ncmVzcy0xLjEuOC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS00bURIajJGaHpkbXc1V3pENEtoZDRYeDZWNzQ9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicGlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3BpZnkvLS9waWZ5LTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN1JRYWFzQkRxRW5xV0lTWTU5eW9zVk13NlF3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBpbmtpZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUvLS9waW5raWUtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jbFZyZ00rZzFJcVhUb0RuY2tqb0R0VDMrSEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llLXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlua2llLXByb21pc2UvLS9waW5raWUtcHJvbWlzZS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlUWFczNmVqV01CcHJKc1hoM1lvZ2loRkQvbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwaW5raWUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBvc2l4LWNoYXJhY3Rlci1jbGFzc2VzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bvc2l4LWNoYXJhY3Rlci1jbGFzc2VzLy0vcG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMtMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BZXJBL2p0YTl4b3FiQUwrcTdqQi92ZmdEcXM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJldHR5LWJ5dGVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJldHR5LWJ5dGVzLy0vcHJldHR5LWJ5dGVzLTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ2lMb0lRWUpyVFZVTDR5TlhTRlpyL0IxSElRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdldC1zdGRpbiI6ICJeNC4wLjEiLAorICAgICAgICAibWVvdyI6ICJeMy4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicHJvY2VzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTEuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MvLS9wcm9jZXNzLTAuMTEuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jekl3RG9RQlliMmo1cG9kSFpHbjFMd1c4WUk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvLS9wcm9jZXNzLW5leHRpY2stYXJncy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTXRFQzFUcU4wRVU1bmVwaGFKNHJBdFRoSHRDODZkTk45cUN1RWh0c2h2cFZCa0FXNVpPN0JBU045UkVuRjllb1hHY1J1YitwRnVLRXBPSEUrSGJFTXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByb2dyZXNzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2dyZXNzLy0vcHJvZ3Jlc3MtMi4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTdQaUh0TGxsNUxkbktJTXcxMDBJKzh4SlhSNWdXMlF3V1lrVDZpSnZhMGJYaXRaS2EvWE1yU2JkbWczcjJYbmFpZHo5UXVtZDBWUGFNclpsRjlWOXNBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcm94eS1mcm9tLWVudiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcm94eS1mcm9tLWVudi8tL3Byb3h5LWZyb20tZW52LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTThVRG1QY09wK3VXMGg5N2dYWXdwVmVSeCs0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBzbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHNsLy0vcHNsLTEuMS4zMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItLzZwdDQrQytUK3daVWllS1I2MjBPcHpOL0xsbk5LdVdqeTFpRkxRL1VHMzVKcUhsUi84OU1QMWQ5NmRVZmtmNkRuZTNUdUxRek9ZRVlzaEorSHg4bXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInB1YmxpYy1lbmNyeXB0IjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1YmxpYy1lbmNyeXB0Ly0vcHVibGljLWVuY3J5cHQtNC4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXpWcGE4b0taU3o1YlRNVEZDbGMxZlFPbnl5RXpwbDVvenBpMUI1WWN2QnJkb2hNakgycmZzQnR5WGN1TnV3anNESVhtQllsRjJONUZsSlloUjI5dDhRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJibi5qcyI6ICJeNC4xLjAiLAorICAgICAgICAiYnJvd3NlcmlmeS1yc2EiOiAiXjQuMC4wIiwKKyAgICAgICAgImNyZWF0ZS1oYXNoIjogIl4xLjEuMCIsCisgICAgICAgICJwYXJzZS1hc24xIjogIl41LjAuMCIsCisgICAgICAgICJyYW5kb21ieXRlcyI6ICJeMi4wLjEiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMS4yIgorICAgICAgfQorICAgIH0sCisgICAgInB1bnljb2RlIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1bnljb2RlLy0vcHVueWNvZGUtMS40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13TldtT3ljWWdBclk0ZXNQcFNhY2hOMUJoRjQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHVwcGV0ZWVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdXBwZXRlZXIvLS9wdXBwZXRlZXItMS4xMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pRzRpTU9IaXhjMkVwenFSVitwdjdvM0dnbVUyZE5ZRU1rdkt3U2FRTy92TVpVUmFrd1NPbi9FWUo2T0lSRllPcXVlMXFvcnpJQnZyeXRQSVFCM1l6UT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVidWciOiAiXjQuMS4wIiwKKyAgICAgICAgImV4dHJhY3QtemlwIjogIl4xLjYuNiIsCisgICAgICAgICJodHRwcy1wcm94eS1hZ2VudCI6ICJeMi4yLjEiLAorICAgICAgICAibWltZSI6ICJeMi4wLjMiLAorICAgICAgICAicHJvZ3Jlc3MiOiAiXjIuMC4xIiwKKyAgICAgICAgInByb3h5LWZyb20tZW52IjogIl4xLjAuMCIsCisgICAgICAgICJyaW1yYWYiOiAiXjIuNi4xIiwKKyAgICAgICAgIndzIjogIl42LjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVidWciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNC4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTQuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItcFlBSXplUm84SjZLUEVhSjBWV09oNVB6a2J3L1JldHV6ZWhHTTdRUlJYNWhlNGZQSHgycmRLTUIyNTZlaEpDa1grWFJRbTE2ZVpMcUxOUzhSU1pYWnc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgIm1zIjogIl4yLjEuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJtcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21zLy0vbXMtMi4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10Z3ArZGw1Y0drMjh1dFlrdEJzckZxQTdIS2dyaGdQc2c2Wi9FZmhXSTRnbDFId3E4Qi9HbVkvMG9YWjZuRjhoRFZlc1MvRnBuWWFEL2tPV2hZUXZ5Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicXMiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcXMvLS9xcy02LjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTjVaQVg0L0x4Sm1GKzd3Tjc0cFVENnFBaDkvd252ZFFjanE5VFpqZXZ2WHpTVW83YmZtdzkxc2FxTWp6R1MyeHE5MS9vZE4yZFcvV09sN3FRSE5ER0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInF1ZXJ5c3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3F1ZXJ5c3RyaW5nLy0vcXVlcnlzdHJpbmctMC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zZ21Fa2dPN0pkK0NEYWRXNTBjQVdIaFNGaUE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicXVlcnlzdHJpbmctZXMzIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3F1ZXJ5c3RyaW5nLWVzMy8tL3F1ZXJ5c3RyaW5nLWVzMy0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW5zWWZlUVNZZFhCOWFVRkZsdjJRZWsxeEhuTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyYW5kb21ieXRlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yYW5kb21ieXRlcy8tL3JhbmRvbWJ5dGVzLTIuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1DSVE1T0Z4ZjRKb3U2dU9LZTl0MUFPZ3FwZVU1ZmQ3MEE4TlBkSFNHZVlYcVhzUGU2cGVPd0kwY1VsODhSV1o2c1AxdlBNVjNhdmQvUjZjWjUvc1AxQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInJhbmRvbWZpbGwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmFuZG9tZmlsbC8tL3JhbmRvbWZpbGwtMS4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTg3bGNiUjgrTWhjV2NVaVErOWUrUnd4OE15UjJQN3FudDE1eW5VbGJtM1RVL2ZqYmd6NEdzdmZTVURUZW10Q0N0VkNxYjRaY0VGbHlQTlRoOWJCVEx3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyYW5kb21ieXRlcyI6ICJeMi4wLjUiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlYWQtb25seS1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZC1vbmx5LXN0cmVhbS8tL3JlYWQtb25seS1zdHJlYW0tMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KeVQ5YW9FVDF6ZGtyQ2lOUTRZbkRCMi9GL0E9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZWFkLXBrZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkLXBrZy8tL3JlYWQtcGtnLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOWYrcVhzMHB5ekhBUjB2S2ZYVnJhN0tlUHlnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImxvYWQtanNvbi1maWxlIjogIl4xLjAuMCIsCisgICAgICAgICJub3JtYWxpemUtcGFja2FnZS1kYXRhIjogIl4yLjMuMiIsCisgICAgICAgICJwYXRoLXR5cGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlYWQtcGtnLXVwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWQtcGtnLXVwLy0vcmVhZC1wa2ctdXAtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uV1BCTW5iQVpaR05WL0FDcFg5QW9iWkQrd0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmluZC11cCI6ICJeMS4wLjAiLAorICAgICAgICAicmVhZC1wa2ciOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0yLjMuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdFF0S0E5V0lBaEJGMytWTEFzZXlNcVplQmpXMEFISm94T3RZcVNVWk5KeGF1RXJtTGJWbTJGVzF5K0ovWUE5ZFVyQUMzOUlUZWpsWldoVkl3YXdrS3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4zIiwKKyAgICAgICAgImlzYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4yLjAuMCIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjEiLAorICAgICAgICAic3RyaW5nX2RlY29kZXIiOiAifjEuMS4xIiwKKyAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZ19kZWNvZGVyLy0vc3RyaW5nX2RlY29kZXItMS4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uL1NobnZEaTZGSGJiVmZ2aXJvK1dvamlGenYrczhNUE1IQmN6VmVQZlVwREpMd29MVDBodDFsNFl3QkNiaThwSkF2ZUVFZG5rSHlQeVRQL216UmZ3Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInJlY2hvaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVjaG9pci8tL3JlY2hvaXItMC42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oU0JMVk51b0xWZEM0b3lXZFc3ME92VU9NNFE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVzb2x2ZSI6ICJeMS4xLjYiCisgICAgICB9CisgICAgfSwKKyAgICAicmVkZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlZGVudC8tL3JlZGVudC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXo1RnFzZjFmSHhiZnNnZ2kzVzdIOXpEQ3I5ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpbmRlbnQtc3RyaW5nIjogIl4yLjEuMCIsCisgICAgICAgICJzdHJpcC1pbmRlbnQiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInJlZ2V4LW5vdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWdleC1ub3QvLS9yZWdleC1ub3QtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUo2U0RqVWdEeFFqNU51c25PdGRGeER3Ti8rSFd5a1I4R0VMd2N0SjdtZHFoY3l5MXhFYzRTUkZIVVh2eFRwNjYxWWFWS0FqZlJMWjljQ3FTNnRuMzJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAic2FmZS1yZWdleCI6ICJeMS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVwZWF0LWVsZW1lbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVwZWF0LWVsZW1lbnQvLS9yZXBlYXQtZWxlbWVudC0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYWhHcTBablY1bTVYdFpMTWIrdlA3NmtjQU01bmtMcWswbHBxQXVvalNLR2dRdG40ZVJpNFpaR20yb2xvMnpLRkgrc01zV2FxT0NXMWRxQW5PcnU3Mmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlcGVhdC1zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVwZWF0LXN0cmluZy8tL3JlcGVhdC1zdHJpbmctMS42LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1qY3JrY09ISWlyd3RZQS8vU25kaWh0cDE1amM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVwZWF0aW5nIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcGVhdGluZy8tL3JlcGVhdGluZy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVVoVEZPcEp0TlZKd2RTZjdxMEZkdkFqUWJkbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1maW5pdGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlcXVlc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjg4LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVlc3QvLS9yZXF1ZXN0LTIuODguMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkFxQlNyaWpHTFpkTTBXWk5zSW5MSnBrSm9rTDcyWFlqVXBuQjBpd3NSZ3hoN2RCNkNPckhuVEJOd04wRStsSERBSnp1N2tMQWtEZVkwOHoyL0EwaGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImF3cy1zaWduMiI6ICJ+MC43LjAiLAorICAgICAgICAiYXdzNCI6ICJeMS44LjAiLAorICAgICAgICAiY2FzZWxlc3MiOiAifjAuMTIuMCIsCisgICAgICAgICJjb21iaW5lZC1zdHJlYW0iOiAifjEuMC42IiwKKyAgICAgICAgImV4dGVuZCI6ICJ+My4wLjIiLAorICAgICAgICAiZm9yZXZlci1hZ2VudCI6ICJ+MC42LjEiLAorICAgICAgICAiZm9ybS1kYXRhIjogIn4yLjMuMiIsCisgICAgICAgICJoYXItdmFsaWRhdG9yIjogIn41LjEuMCIsCisgICAgICAgICJodHRwLXNpZ25hdHVyZSI6ICJ+MS4yLjAiLAorICAgICAgICAiaXMtdHlwZWRhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAiaXNzdHJlYW0iOiAifjAuMS4yIiwKKyAgICAgICAgImpzb24tc3RyaW5naWZ5LXNhZmUiOiAifjUuMC4xIiwKKyAgICAgICAgIm1pbWUtdHlwZXMiOiAifjIuMS4xOSIsCisgICAgICAgICJvYXV0aC1zaWduIjogIn4wLjkuMCIsCisgICAgICAgICJwZXJmb3JtYW5jZS1ub3ciOiAiXjIuMS4wIiwKKyAgICAgICAgInFzIjogIn42LjUuMiIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4xLjIiLAorICAgICAgICAidG91Z2gtY29va2llIjogIn4yLjQuMyIsCisgICAgICAgICJ0dW5uZWwtYWdlbnQiOiAiXjAuNi4wIiwKKyAgICAgICAgInV1aWQiOiAiXjMuMy4yIgorICAgICAgfQorICAgIH0sCisgICAgInJlcXVlc3QtcHJvZ3Jlc3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVxdWVzdC1wcm9ncmVzcy8tL3JlcXVlc3QtcHJvZ3Jlc3MtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1YVGE3VjVZY1p6cWx0NGpieUJRZjN5TzBUZ2c9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidGhyb3R0bGVpdCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVxdWl6emxlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVpenpsZS8tL3JlcXVpenpsZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWFVUERVd3hObW41RzhjM2RVY0ZZL0djTTI5ND0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IgorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicmVzb2x2ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLy0vcmVzb2x2ZS0xLjkuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVFpOeWUwMHRJNjdsd1l2enhDeEhHandUTmxVVjcwaW81NC9FZDRqNlBzY0I4eFZmdUJKcFJlbkkvbzZkVmswY1kwUFlUWTI3QWdDb0dHeFJuWXVJdFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtcGFyc2UiOiAiXjEuMC42IgorICAgICAgfQorICAgIH0sCisgICAgInJlc29sdmUtZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUtZGlyLy0vcmVzb2x2ZS1kaXItMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lYVFHUk1OaXZvTHlidi9uT2NtN1U0SUViME09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMCIsCisgICAgICAgICJnbG9iYWwtbW9kdWxlcyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVzb2x2ZS11cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS11cmwvLS9yZXNvbHZlLXVybC0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUxHTi81M3lKT3YwcVpqL2lHcWtJQUdqaUJTbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMTUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JldC8tL3JldC0wLjEuMTUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRUbFlwYStPTCt2TU1ORzI0eFNsUUdFSjNCL1J6RWZVbExjdDdiNUcveXRhdit3UHJwbENwVk1GdXd6WGJrZWNKcmI2SVlvMWlGYjBTOXYzNzc1NG1nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyaWdodC1hbGlnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaWdodC1hbGlnbi8tL3JpZ2h0LWFsaWduLTAuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWVRPYmNpL21vMUZXaVNFTkpPRk1saFNHRSs4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFsaWduLXRleHQiOiAiXjAuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInJpbXJhZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaW1yYWYvLS9yaW1yYWYtMi42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxyZWV3TEsvQmxnaG14dGZIMzZZWVZnMWk4SUFjZTRUSTdvYW83NUkxZzI0NSs2QmN0cVRWUWlCUDNZVUo5QzZEUU9YSm1rWVI5WDlmQ0x0Q09KYzV3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iIjogIl43LjAuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJyaXBlbWQxNjAiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmlwZW1kMTYwLy0vcmlwZW1kMTYwLTIuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1paTRpYWdpMjVXdXNWb2lDNEI0bHE3cGJYZkFwM0Q5djVDd2ZrWTMzdmZmdzIrcGtEalkxRDhHYU43c3BzeHZDU3g4ZGtQcU9aQ0VaeWZ4Y21KRzJJQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaGFzaC1iYXNlIjogIl4zLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAic2FmZS1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZS1idWZmZXIvLS9zYWZlLWJ1ZmZlci01LjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR2QyVVpCSkRrWGxZN0diSnhmc0U4L252S2tVRVUxRzM4YzFzaU42UVA2YTlQVDlNbUhCOEducHNjU21NSlNvRjhMT0lydDh1ZC93UHRvanlzNEc2K2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNhZmUtcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlLXJlZ2V4Ly0vc2FmZS1yZWdleC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFLTm1uenNIZlI2VVBVUmluaFY5MUlBanZ5ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZXQiOiAifjAuMS4xMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzYWZlci1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZXItYnVmZmVyLy0vc2FmZXItYnVmZmVyLTIuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZWm8zSzgyU0Q3Uml5aTBFMUVRUG9qTHo3a3BlcG5TUUk5SXlQYkhIZzFYWFhldmI1ZEpJN3RweU4yQUR4R2NRYkhHN3ZjeVJIazBjYndxY1FyaVV0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2VtdmVyIjogeworICAgICAgInZlcnNpb24iOiAiNS42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NlbXZlci8tL3NlbXZlci01LjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUlM5UjZSMzVOWWdRbisrZmtEV2FPbXFHb2o0RWs5Z0dzK0RQeE5VWkt1d0UxODN4akpyb0t2eW8xSXpWRmVYdlVydm1BTHk2RldENXhyZEpUMjVnTWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtdmFsdWUvLS9zZXQtdmFsdWUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWh3MHl4azlHVC9IcjV5SkVZbkhOS1lYa0lBOG1WSmdkOWRpdFlaQ2UxNlpjemNhRUxZWWNmdmFYZXNOQUNrMk84TzBuVGlQUWNRaEdVUWo4Skx6ZWVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuMyIsCisgICAgICAgICJzcGxpdC1zdHJpbmciOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInNoYS5qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGEuanMvLS9zaGEuanMtMi40LjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RTUVwNUI3Y2Z0RTdBUE9qazVZNnhncmJXdStXa0xWUXdrOEpOalo4bktSY2laYUJ5RVc2TXViaWVBaVRvUzcrZHd2cmpHaEg4alJYejNNVmQwQVlxUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4xIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJzaGFzdW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGFzdW0vLS9zaGFzdW0tMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS01d0VqRU5qMEYvVGV0WEVoVU9Wbmk0ZXVWbDg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAianNvbi1zdGFibGUtc3RyaW5naWZ5IjogIn4wLjAuMCIsCisgICAgICAgICJzaGEuanMiOiAifjIuNC40IgorICAgICAgfQorICAgIH0sCisgICAgInNoZWJhbmctY29tbWFuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLWNvbW1hbmQvLS9zaGViYW5nLWNvbW1hbmQtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SS3JHVzJsYkF6bUphTU9mTmovdVhlcjk4ZW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2hlYmFuZy1yZWdleCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic2hlYmFuZy1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLXJlZ2V4Ly0vc2hlYmFuZy1yZWdleC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJrTDBsMERBdEMyeXlwY29WeHl4a01tTy9xTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaGVsbC1xdW90ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGVsbC1xdW90ZS8tL3NoZWxsLXF1b3RlLTEuNi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOUhnWlNjemtBbWx4SjBNT283UEZSMjlJRjJjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFycmF5LWZpbHRlciI6ICJ+MC4wLjAiLAorICAgICAgICAiYXJyYXktbWFwIjogIn4wLjAuMCIsCisgICAgICAgICJhcnJheS1yZWR1Y2UiOiAifjAuMC4wIiwKKyAgICAgICAgImpzb25pZnkiOiAifjAuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNoZWxsanMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGVsbGpzLy0vc2hlbGxqcy0wLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5aYm1NSHA0RlVUMWtmTjlwaGcyRHpIYlY3RT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaWduYWwtZXhpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaWduYWwtZXhpdC8tL3NpZ25hbC1leGl0LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYzQWp4S0g2aEY0WW81QlhpVVRLM05rYkcwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpbXBsZS1jb25jYXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2ltcGxlLWNvbmNhdC8tL3NpbXBsZS1jb25jYXQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jMFRMdUxiaWI3Sjlackw4aHZuMjFabDFJY1k9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2ltcGxlLXN3aXp6bGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2ltcGxlLXN3aXp6bGUvLS9zaW1wbGUtc3dpenpsZS0wLjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBOcHJZMS84ek1vejl3MFh5NUpaTGVsZVZYbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1hcnJheWlzaCI6ICJeMC4zLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzLWFycmF5aXNoIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMy4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYXJyYXlpc2gvLS9pcy1hcnJheWlzaC0wLjMuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVWUnFDdlZsWmJ1dzNHck02M292TlNOQWVBMUsxNmthUi9MUlkvOTJ3MHp4UTUvMVl6d2JsVVg2NTJpNFhzOVJ3QUdqVzlkOXk2WDg4dDhPYUFKZldRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzbmFwZHJhZ29uIjogeworICAgICAgInZlcnNpb24iOiAiMC44LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NuYXBkcmFnb24vLS9zbmFwZHJhZ29uLTAuOC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GdHlPbldOL3dDSFRWWE9Nd3ZTdjI2ZCtrbzV2V2xJREQ2em9VSjdMVzh2aCtaQkM4UWRsanZlUlArY3JOcnRCd2lvRVVXeS80ZE10YkJqQTRpb05sZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFzZSI6ICJeMC4xMS4xIiwKKyAgICAgICAgImRlYnVnIjogIl4yLjIuMCIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjAuMi41IiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICJtYXAtY2FjaGUiOiAiXjAuMi4yIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAiXjAuNS42IiwKKyAgICAgICAgInNvdXJjZS1tYXAtcmVzb2x2ZSI6ICJeMC41LjAiLAorICAgICAgICAidXNlIjogIl4zLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMi41IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTAuMi41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXcxc2UrUmpzUEprUG1sdkZlK0JLck94Y2dSWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInNuYXBkcmFnb24tbm9kZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zbmFwZHJhZ29uLW5vZGUvLS9zbmFwZHJhZ29uLW5vZGUtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU8yN2w0eGFNWXQvUlNRNVRSM3ZwV0NBQjVLYi9jekljcVVGT00vQzRmWWNMbmJaVWMxUGtqVEFNam9mMnBCV2FTVHdPVWQ2cVVIY0ZHVkdqN2FJd253PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIsCisgICAgICAgICJzbmFwZHJhZ29uLXV0aWwiOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZHA2NnJ6OUtZNnJUcjU2Tk1FeWJ2bm0vc09ZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW01aG5IVGtjVnNQZnF4M0FLbHl0dElQYjdKK1h5a0h2SlAyQjliWkRqbGhMSW9FcTRYb0s2NFZnN2JvWmxWV1lLNkxVWTk0ZFlQRUU3TGgwWmtaS2NRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYlJYeTFGbXRBb0NqUWtWbUlWWXd1dXFERlViYU9lRGptZWQxdE9HUHJzTWh0SkE0ckQ5dGtnQTBGMXFKM2dSRlJYY0hZVmtkZWFQNTBRNXJFL2pMUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTEuMC4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItMmVpczVXcVFHVjdwZW9vRHlMbU5FUFVycHM5K1NYWDVjOXBMM3hFQis0ZTlIbkd1RGE3bUI3a0h4SHc0Q2JxUzlrMVQyaE9IM21pTDhuOFd0aVlWdGc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzbmFwZHJhZ29uLXV0aWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc25hcGRyYWdvbi11dGlsLy0vc25hcGRyYWdvbi11dGlsLTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tYktrTWRRS3NqWDRCQUw0YlJZVGoyMWVkT2Y4Y043WEhkWVVKRWUrWm45OWhWRVljTXZLUGN0MUlxTmU3K0FaUGlybjhCQ0RPUUJIUVprbnFtS2xaUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4yLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzb3VyY2UtbWFwIjogeworICAgICAgInZlcnNpb24iOiAiMC41LjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAvLS9zb3VyY2UtbWFwLTAuNS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaWdPZExSQWgwaTBlb1V5QTJPcEdpNkx2UDh3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNvdXJjZS1tYXAtcmVzb2x2ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLXJlc29sdmUvLS9zb3VyY2UtbWFwLXJlc29sdmUtMC41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU1qcXN2Tnd5ejFzMGs4MUdvei85dlJCZTlTWmRCMDlCZHcrL3pZeU8rM0N1UGs2Zm91VGF4c2NIa2d0RThqS3ZmMDFrVmZsOHJpSHpFUlEva2VmYVNBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhdG9iIjogIl4yLjEuMSIsCisgICAgICAgICJkZWNvZGUtdXJpLWNvbXBvbmVudCI6ICJeMC4yLjAiLAorICAgICAgICAicmVzb2x2ZS11cmwiOiAiXjAuMi4xIiwKKyAgICAgICAgInNvdXJjZS1tYXAtdXJsIjogIl4wLjQuMCIsCisgICAgICAgICJ1cml4IjogIl4wLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzb3VyY2UtbWFwLXVybCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLXVybC8tL3NvdXJjZS1tYXAtdXJsLTAuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUHBOZGZkMXpZeHVYWlpsVzFWRW82SHRRaEtNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNwZHgtY29ycmVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGR4LWNvcnJlY3QvLS9zcGR4LWNvcnJlY3QtMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxyMkVaQ2N0QzJCTlI3ajdXekoyRnBEem54a3kxc2pmeHZ2WUV5enhOeWI2bFpYSE9EbUVvSmVGdTRKdXBZbGtmaGExS1pwSnlvcWlKN3BnQTFxcThRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcGR4LWV4cHJlc3Npb24tcGFyc2UiOiAiXjMuMC4wIiwKKyAgICAgICAgInNwZHgtbGljZW5zZS1pZHMiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNwZHgtZXhjZXB0aW9ucyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGR4LWV4Y2VwdGlvbnMvLS9zcGR4LWV4Y2VwdGlvbnMtMi4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJYUUFDZkVsS2k5U2xWYjFDWWFkS0RYdm9halBnQlZQbi9nT1FMclR2SGRFbGFWaHI3WkVicUphUm5KTFZOZWFJNGNNRUFnVkNlQk1LRjZNV1JEQ1JBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzcGR4LWV4cHJlc3Npb24tcGFyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BkeC1leHByZXNzaW9uLXBhcnNlLy0vc3BkeC1leHByZXNzaW9uLXBhcnNlLTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZZzZEM1hwUkQ0a2tPbVRwZGdiVWlFSkZLZ2hKSDAzZmlDMU9QbGw1aC8wc082bmVoMmpxUkRWSE9RNG8vTE1lYTB0Z0NrYk1nZWE1aXAvZStNa1d5Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3BkeC1leGNlcHRpb25zIjogIl4yLjEuMCIsCisgICAgICAgICJzcGR4LWxpY2Vuc2UtaWRzIjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcGR4LWxpY2Vuc2UtaWRzIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwZHgtbGljZW5zZS1pZHMvLS9zcGR4LWxpY2Vuc2UtaWRzLTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xa3k5Q1Z0MGxWSUVDa0VzWWJOSUxWblB2eWN1RUJrWG9NRkxSV3NSRWtvbVFMZXZZaHRSS0MrUjkxYTVUT0FRM2JDTWppa1J3aHlhUnFqMVZZYXRZZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3BsaXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BsaXQvLS9zcGxpdC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbVR5T29QYnJpdnRYbnduSXhaUkZZUnJQTnRFRktscEIyZnZqU25DUVVpQUE2cUFaenF3bmE1ZW52SzR1azZPSWVQMTdDc2RGM3JTQkdZVkJzVTBUa2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInRocm91Z2giOiAiMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcGxpdC1zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BsaXQtc3RyaW5nLy0vc3BsaXQtc3RyaW5nLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Oek5WaEpEWXB3Y2VWVmlpOC9IdTZES2ZEMkcrTnJRSGxTL1YvcWd2NzYzRVl1ZFZ3RWNNUU54ZDJsaCswVnJVQnlYTi9vSmtsNWdyT2hZV3ZRVVlpdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNwcmludGYtanMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3ByaW50Zi1qcy8tL3NwcmludGYtanMtMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVZFMFNPVkVIQ2s3UWM4dWxrV3czbnRBelh1cWY3UzJsdndRYURMUm5VZUlFYUtOUUp6VjZCd21MS2hPcVQ2MWFHaGZVTXJYZWFCaytvREdDenZoY3VnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzc2hwayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3NocGsvLS9zc2hway0xLjE2LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVpoZXYzNS95N2hSTWNJRC91cFJlSXZSc2UrSTlTVmh5VnJlL0tUSlNKUVdNejNDMytHK0hwTzdtMXdLL3lja0V0dWpLWjdkUzRoa1Z4QW5tSGFJR1ZRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc24xIjogIn4wLjIuMyIsCisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAiYmNyeXB0LXBia2RmIjogIl4xLjAuMCIsCisgICAgICAgICJkYXNoZGFzaCI6ICJeMS4xMi4wIiwKKyAgICAgICAgImVjYy1qc2JuIjogIn4wLjEuMSIsCisgICAgICAgICJnZXRwYXNzIjogIl4wLjEuMSIsCisgICAgICAgICJqc2JuIjogIn4wLjEuMCIsCisgICAgICAgICJzYWZlci1idWZmZXIiOiAiXjIuMC4yIiwKKyAgICAgICAgInR3ZWV0bmFjbCI6ICJ+MC4xNC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0YWNrLXRyYWNlIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdGFjay10cmFjZS8tL3N0YWNrLXRyYWNlLTAuMC4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZIeHdzMGZvMHl0T0VJNmhvcUZaNWYzZUdjQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzdGF0aWMtZXh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0YXRpYy1leHRlbmQvLS9zdGF0aWMtZXh0ZW5kLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWUlDY09jdi9WVE55SnYxZUMxSVBOQjhmdGNZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAib2JqZWN0LWNvcHkiOiAiXjAuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInN0cmVhbS1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyZWFtLWJyb3dzZXJpZnkvLS9zdHJlYW0tYnJvd3NlcmlmeS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVppWnU1Zm05dVpRS1RrVVV5dnREdTNIbHlkcz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjEiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJlYW0tY29tYmluZXIyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmVhbS1jb21iaW5lcjIvLS9zdHJlYW0tY29tYmluZXIyLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtKzAyS0ZDRHFOaWRrNGhyVWVBT1h2cnkwSEw0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImR1cGxleGVyMiI6ICJ+MC4xLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJlYW0taHR0cCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuOC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJlYW0taHR0cC8tL3N0cmVhbS1odHRwLTIuOC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0rVFNrZklOSERvNEorWm9iUUxXaU1vdVFZQitVVllGdHRSQTk0RnBFenpKN1pkcWNMNHVVVVE3V2tka0k0RFNvekdtZ0JVRS9hNDdMKzM4UGVuWGhVdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnVpbHRpbi1zdGF0dXMtY29kZXMiOiAiXjMuMC4wIiwKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAiXjIuMy42IiwKKyAgICAgICAgInRvLWFycmF5YnVmZmVyIjogIl4xLjAuMCIsCisgICAgICAgICJ4dGVuZCI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyZWFtLXNwbGljZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJlYW0tc3BsaWNlci8tL3N0cmVhbS1zcGxpY2VyLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJPK1E0b1RQa3RuSE1HVFVaZGdBWFdSRFlNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImluaGVyaXRzIjogIl4yLjAuMSIsCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAiXjIuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmluZ19kZWNvZGVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZ19kZWNvZGVyLy0vc3RyaW5nX2RlY29kZXItMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZZcXlYNlpXRVlndUF4Z1p6SEdMN1NzQ2VHeDNWMlR0T1RxWnoxeFNUU1ducXNiV3dicHRhZk55dmYvQUNxdVpVWFYzREFOcjVCREl3TlllMW1ONDJ3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaXAtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWFuc2kvLS9zdHJpcC1hbnNpLTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYWpoZnVJVTlsUzFmOEYwT2lxK1VKNDNHUGM4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWJvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1ib20vLS9zdHJpcC1ib20tMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZaG1vVmhaU0JKSHpWNGk5dnhSSHFaeCthdzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtdXRmOCI6ICJeMC4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaXAtaW5kZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWluZGVudC8tL3N0cmlwLWluZGVudC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURIbGlwcTN2cDd2VXJEWmtZS1k0VlNyaG9LST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtanNvbi1jb21tZW50cy8tL3N0cmlwLWpzb24tY29tbWVudHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QRk1aUXVrSXdtbDhEc05FaFl3b2JIeWdwZ289IgorICAgIH0sCisgICAgInN1YmFyZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdWJhcmcvLS9zdWJhcmctMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05aXp4ZFlIcGxyU1B5V1ZwbjFUQWF1Sm91Tkk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWluaW1pc3QiOiAiXjEuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vMUFJc2c5Qk9EN3NIN2tVOU0xZDk1b21Rb1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjUuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci01LjUuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUWpWandkWEl0NDA4TUlpQXFDWDRvVUtzZ1UyRXFBR3pzMlBwa200YVFZYmptK1pFV0VjVzRTZkZOVHI0dU1OWm1hMGV5NGY1bGdMcmtCMGFYMFFNb3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy1mbGFnIjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzeW50YXgtZXJyb3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zeW50YXgtZXJyb3IvLS9zeW50YXgtZXJyb3ItMS40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVlQUGx1NjdtZG5IR1R1cDJBOGZmN0JDMlBqcTBlMFlwL0l5VEZOMDN6V08wUmNLMDd1TGNiaTdDMktwR1IyRnZXYmFCMCtiZkUyN2Erc0JLZWJTbzd3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhY29ybi1ub2RlIjogIl4xLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0YWZmeWRiIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RhZmZ5ZGIvLS90YWZmeWRiLTIuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZkx5MlMxb1VHMm91L0N4ZExHZTA0VkN5b21nPSIKKyAgICB9LAorICAgICJ0ZXh0LWhleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90ZXh0LWhleC8tL3RleHQtaGV4LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi11dVZHTld6Z0o0eWhSYU5TaXViUFk3T2pJU3c0c3c0RTVVdjB3YmpwK096Y2JtVlUvcnNUOHVqZ2NYSmhuOXlwenNncjV2bHpwUHFQK01CQktjR3ZiZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidGhyb3R0bGVpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90aHJvdHRsZWl0Ly0vdGhyb3R0bGVpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW5uaFlOdHIwWjBNVVdsbUV0aWFOZ29Vb3JHdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0aHJvdWdoIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGhyb3VnaC8tL3Rocm91Z2gtMi4zLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EZFRKLzZxOE5YbGdzYmNrRVYxK0RvYWk0ZlU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidGhyb3VnaDIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGhyb3VnaDIvLS90aHJvdWdoMi0yLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItL21yUm9kOHhxcEErSUhTTHlHQ1EyczhTUEhpQ0RFZVFKU2VwMWpxTFllRVVDbE9GRzJRc2grNEZVNkc5VmVxcFpuR1cvU3U4TFFHYzRZS25pNXJZU1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJ+Mi4zLjYiLAorICAgICAgICAieHRlbmQiOiAifjQuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInRpbWVycy1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS40LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGltZXJzLWJyb3dzZXJpZnkvLS90aW1lcnMtYnJvd3NlcmlmeS0xLjQuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXljV0xWMXZvUUhOMXkxNGtZdHJPNTBOWjlCMD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwcm9jZXNzIjogIn4wLjExLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidG8tYXJyYXlidWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG8tYXJyYXlidWZmZXIvLS90by1hcnJheWJ1ZmZlci0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZTS2JIOHhqZmtac29JRVlDRGFucXIvNFAwTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0by1vYmplY3QtcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1vYmplY3QtcGF0aC8tL3RvLW9iamVjdC1wYXRoLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtS1hXSXQ3RG40S3dJNEU1bkw0WEI5Sm1lRjY4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidG8tcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG8tcmVnZXgvLS90by1yZWdleC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRld0bGVOQXRaL0tpMnF0cWVqMkNYVE9heU9IOWJIRFFGK1E0OFZwV3lEWGpiWXhBNFl6OGlEQjMxelhPQlVsT0hIS2lkRGJxR1ZyVFV2UU1QbUJHQnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMi4wLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjIiLAorICAgICAgICAic2FmZS1yZWdleCI6ICJeMS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidG8tcmVnZXgtcmFuZ2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG8tcmVnZXgtcmFuZ2UvLS90by1yZWdleC1yYW5nZS0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZJREJlNTMrdmxtZUp6WitEVTNWV1FGQjJ6Zz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1udW1iZXIiOiAiXjMuMC4wIiwKKyAgICAgICAgInJlcGVhdC1zdHJpbmciOiAiXjEuNi4xIgorICAgICAgfQorICAgIH0sCisgICAgInRvdWdoLWNvb2tpZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90b3VnaC1jb29raWUvLS90b3VnaC1jb29raWUtMi40LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVE1c3JrLzR2RE01NFdKc0ppbzNYTm42SzJzQ0crQ1E4RzVXejZiWmhSWm9BZS8rVHhqV0IvR2xGQW5ZRWJrWVZsT045Rk1rL2ZFM2gyUkxwUFhvNGxRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwc2wiOiAiXjEuMS4yNCIsCisgICAgICAgICJwdW55Y29kZSI6ICJeMS40LjEiCisgICAgICB9CisgICAgfSwKKyAgICAidHJpbS1uZXdsaW5lcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90cmltLW5ld2xpbmVzLy0vdHJpbS1uZXdsaW5lcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdJZVdhN1dDcEZBNlFldFNUMzAxQVJnVnBoTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0cmlwbGUtYmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90cmlwbGUtYmVhbS8tL3RyaXBsZS1iZWFtLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1YckhVdlY1SHBkTG1JajR1Vk14SGdnTGJGU1pZSW43SEVXc3FlUFpjSTUwcGNvK01QcUo1MHdNR1k3OTRYN0FPT2h4T0JBamJrcWZBYkVlL1FNcDJMdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidHR5LWJyb3dzZXJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHR5LWJyb3dzZXJpZnkvLS90dHktYnJvd3NlcmlmeS0wLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQzNUYU83SzgxWXZqQ2dRSDlRMVMzUjNQM0J0TjNSSU04bitPdlg0aWwxSzF6Z0U4WmhJMG9wN2tDbGdreHR1dElFOGhRcmNySEJYdkloZXFLVVVDeHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInR1bm5lbC1hZ2VudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90dW5uZWwtYWdlbnQvLS90dW5uZWwtYWdlbnQtMC42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KNlhlb0dzMnNFb0ttV1ozU3lrSWFQRDhRUDA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInR3ZWV0bmFjbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTQuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHdlZXRuYWNsLy0vdHdlZXRuYWNsLTAuMTQuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVd1YUJkL0dTMUVWaWFkRUlyNmsvK0hRL1QyUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0eXBlZGFycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R5cGVkYXJyYXkvLS90eXBlZGFycmF5LTAuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaG5ySFRqaGtHSHNkUFVmWmxxZU94Y2lEQjNjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInR5cGVzY3JpcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjIuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHlwZXNjcmlwdC8tL3R5cGVzY3JpcHQtMy4yLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTBSTkRiU2RFb2tCZUVBa2dOYnhKK0JMd1NNYW5GeTlUZVh6OHVXKzQ4ai94aEVYdjFlUE1FNjBvbHl6dzJYelVxVUJOQVlGZUphZElxQWdOcUlBQ3dnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1Z2xpZnktanMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91Z2xpZnktanMvLS91Z2xpZnktanMtMi42LjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1aZW92c3dXY2s1UnBMeFgrMkh3ck5zRnJtdDg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMiOiAifjAuMi42IiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAifjAuNS4xIiwKKyAgICAgICAgInVnbGlmeS10by1icm93c2VyaWZ5IjogIn4xLjAuMCIsCisgICAgICAgICJ5YXJncyI6ICJ+My4xMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhc3luYyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuMTAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMC4yLjEwLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRydmdzR2RMblhHWENNbzQzb3dqZkxVbXc5RT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ1Z2xpZnktdG8tYnJvd3NlcmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91Z2xpZnktdG8tYnJvd3NlcmlmeS8tL3VnbGlmeS10by1icm93c2VyaWZ5LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYmdrazFyMm10YS9qU2VPYWJXTW9VS0Q0Z3JjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVtZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bWQvLS91bWQtMy4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTRJY0dTdWZoRnNodkxOY01DVjgwVW5RVmxaNXBNT0M4bXZOUEZvcnF3QTQrbHpZUXVldFRFU0xEUWtlTG1paHE4YlJjbnBiUWE0OFdiOExoMTYveG93PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1bmMtcGF0aC1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmMtcGF0aC1yZWdleC8tL3VuYy1wYXRoLXJlZ2V4LTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNXozVDE3RFh4ZTJHKzZ4ckN1Zll4cWFkVVBvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVuZGVjbGFyZWQtaWRlbnRpZmllcnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZWNsYXJlZC1pZGVudGlmaWVycy8tL3VuZGVjbGFyZWQtaWRlbnRpZmllcnMtMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTEzRWFlb2NPNGVkRi8zSktpbWU5ckQ3b0I2UUk4bGxBR2hnbjVmS09QeWZrSmJSYjZORnY5cFlWNmRGRW1wYTR1UmpLZUJxTFpQOEdwdXpxSGxLRE1RPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhY29ybi1ub2RlIjogIl4xLjMuMCIsCisgICAgICAgICJnZXQtYXNzaWduZWQtaWRlbnRpZmllcnMiOiAiXjEuMi4wIiwKKyAgICAgICAgInNpbXBsZS1jb25jYXQiOiAiXjEuMC4wIiwKKyAgICAgICAgInh0ZW5kIjogIl40LjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgInZlcnNpb24iOiAiMS44LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuOC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVHorMU94QnVZSmY4K2N0QkNmS2w2YjM2VUNJPSIKKyAgICB9LAorICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS1jb250cmliLy0vdW5kZXJzY29yZS1jb250cmliLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmx0bXdrZUQrUG9yR01uNHk3RGl4OVNNSnNjPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogIjEuNi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS42LjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaXppeERLemU5ak0zdUxKT1QvaHRSYTZsS2FnPSIKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVuZGVyc2NvcmUuc3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMy4zLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUuc3RyaW5nLy0vdW5kZXJzY29yZS5zdHJpbmctMy4zLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWcrZHBtZ24rWEJuZUxtWFhvK3NHbFc1eFFFdDRFcmtTM21nZU4yR0ZicmVtWWVNQlNKS3I5V2YyS0pwbFFWYWlQWS9mN0ZONmF0b3NXWU5tOW92cllnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcHJpbnRmLWpzIjogIl4xLjAuMyIsCisgICAgICAgICJ1dGlsLWRlcHJlY2F0ZSI6ICJeMS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAidW5pb24tdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5pb24tdmFsdWUvLS91bmlvbi12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVhISERUTFc2MWR6cjQrb00wSUlIdWxxaHJxUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItdW5pb24iOiAiXjMuMS4wIiwKKyAgICAgICAgImdldC12YWx1ZSI6ICJeMi4wLjYiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAic2V0LXZhbHVlIjogIl4wLjQuMyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzZXQtdmFsdWUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC40LjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtdmFsdWUvLS9zZXQtdmFsdWUtMC40LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZmJDUG5UMGkzSDk0NVRyenc3OUdadXpmelBFPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjEiLAorICAgICAgICAgICAgInRvLW9iamVjdC1wYXRoIjogIl4wLjMuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ1bnNldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bnNldC12YWx1ZS8tL3Vuc2V0LXZhbHVlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZzNhSFAzMGpOUmVmK3g1dnc2anREZnlLdFZrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy12YWx1ZSI6ICJeMC4zLjEiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJoYXMtdmFsdWUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4zLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWUvLS9oYXMtdmFsdWUtMC4zLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZXg5WXV0cGl5b0ord0tJSGdDVmxTRVdaWGg4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImdldC12YWx1ZSI6ICJeMi4wLjMiLAorICAgICAgICAgICAgImhhcy12YWx1ZXMiOiAiXjAuMS40IiwKKyAgICAgICAgICAgICJpc29iamVjdCI6ICJeMi4wLjAiCisgICAgICAgICAgfSwKKyAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAgICAgImlzb2JqZWN0IjogeworICAgICAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc29iamVjdC8tL2lzb2JqZWN0LTIuMS4wLnRneiIsCisgICAgICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04R1ZXRUphajhkb3U5R0p5K0JYSVFOaCtESWs9IiwKKyAgICAgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICAgICAiaXNhcnJheSI6ICIxLjAuMCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImhhcy12YWx1ZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWVzLy0vaGFzLXZhbHVlcy0wLjEuNC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iV0hlbGRrZC9LbTVvQ0NKclRoTC80OWl0M0U9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidXJpLWpzIjogeworICAgICAgInZlcnNpb24iOiAiNC4yLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VyaS1qcy8tL3VyaS1qcy00LjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS1k5RnJtaXJxbDkxWDJRZ2pyeTBXZDRZK1lUZHJkWmhlUzhURnd2a2JMV2YvRzVLTkpEQ2g2cEtMNU9aY3RFVzQrMEJhYTVpZEsyWlF1RUxSd1B6blE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInB1bnljb2RlIjogIl4yLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAicHVueWNvZGUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdW55Y29kZS8tL3B1bnljb2RlLTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItWFJzUmpkZitqNW1sK3kvNkdLSFBaYnJGLzhwMllnYTBKUHRkcVRJWTJYZTVvaEpQRDlzYURKSkxQdnA5K05TQnByVnZldmRYWnlibmoyY3Y4T0VkMEE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVyaS1wYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VyaS1wYXRoLy0vdXJpLXBhdGgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sMGZ3R0RXSk04TWQ0UHpQMkMwVGptY21Makk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidXJpeCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91cml4Ly0vdXJpeC0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJwTi9lbUxpSCt3ZjBZMUpzMXdwTlFaNmJIST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjExLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VybC8tL3VybC0wLjExLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1PRGpwZlB4Z1VoNjNQRkphamxXLzNaNHVLUEU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHVueWNvZGUiOiAiMS4zLjIiLAorICAgICAgICAicXVlcnlzdHJpbmciOiAiMC4yLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInB1bnljb2RlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMy4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHVueWNvZGUvLS9wdW55Y29kZS0xLjMuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sbE9nTnZ0OEh1UWpRdkl5WE03djZqa214STA9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidXNlIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VzZS8tL3VzZS0zLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItY3dFU1ZYbE8zdXJsOVlXbEZXL1RBOWNzaENFaHR1N0lLSi9wNXNvSi9nR3BqN3ZidkZyQVkvZUlpb1E2RHcyM0tqWmhZZ2lJbzhIT3MxblEydnIvb1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInV0aWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEwLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V0aWwvLS91dGlsLTAuMTAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMFBtOWhUUTNzZTVsbDFYaWhSaWMzRkRJa3U3MEMraUhVZFQvVzkyNnJTZ0hWNVFnWHNZYktaTjhNU0MzdEp0U2todVJPenZzUWpBYUZFTlJYcisxOUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImluaGVyaXRzIjogIjIuMC4zIgorICAgICAgfQorICAgIH0sCisgICAgInV0aWwtZGVwcmVjYXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V0aWwtZGVwcmVjYXRlLy0vdXRpbC1kZXByZWNhdGUtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SUTFOeWZwdzNuTW5ZdnZTMUtLSmdVR2FETTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidXVpZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMy4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dWlkLy0vdXVpZC0zLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteVhKbWVOYXczRG5uS0FPS0pFNTFzTC9aYVlmV0pSbDFwSzlkcjE5WUZDdTBPYlMyMzFBQjEvTGJxVEtSQVE1a3c4QTkwckE2ZnI0cmlPVXBUWnZRWkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInY4ZmxhZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdjhmbGFncy8tL3Y4ZmxhZ3MtMy4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU10aXZBN0dGMjR5TVB0ZTlScC9CV0dDWVFOYVVqODZ6ZVl4Vi94MlJSSk1LYWdJbWJidjN1OGlKQzU3bE5oV0xQY0dMSm1IY0htRldrTnNwbGJiTFd3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJ2YWxpZGF0ZS1ucG0tcGFja2FnZS1saWNlbnNlIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UvLS92YWxpZGF0ZS1ucG0tcGFja2FnZS1saWNlbnNlLTMuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1EcEttMlVpL3hONy9IUUtDdHBaeG9SV0JoWjlaMGtxdHlnRzhYQ2dOUThabERueHVRbVdoajU2Nmo4Zk40Q3UzL0ptYmhzRG83ZmNBSnE0czloMjdFdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3BkeC1jb3JyZWN0IjogIl4zLjAuMCIsCisgICAgICAgICJzcGR4LWV4cHJlc3Npb24tcGFyc2UiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInZlcnJvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdmVycm9yLy0vdmVycm9yLTEuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9oQmNvWEJUcjFYVzRuREIrQ2lHZ3VHTnBBQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAiY29yZS11dGlsLWlzIjogIjEuMC4yIiwKKyAgICAgICAgImV4dHNwcmludGYiOiAiXjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgInZtLWJyb3dzZXJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdm0tYnJvd3NlcmlmeS8tL3ZtLWJyb3dzZXJpZnktMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlxK1M3dlpKRTYweWVqRFlNMGVrNnpnMzA4K1Vac2R0UEV4V1A5VlpvQ0ZDejF6a0pvWEZuQVg3YVpmZC9ad3JraWR6ZFVaTDBDL3J5VytKd0FpSUd3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3aGljaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aGljaC8tL3doaWNoLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1IeEpkWVdxMU1USVFiSjNudzBjcXNzSG9UTlUyNjdLbHJEdUdaMVdZbHhEU3RVdEtVaE9hSm1oMTEyL1RabUh4eFVmdUpxUFhTT203dER5YXMwT1NJUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNleGUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIndpbmRvdy1zaXplIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dpbmRvdy1zaXplLy0vd2luZG93LXNpemUtMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WRGpOTHFrN0lDNzZPaG4raUlldTU4bFBuSjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid2luc3RvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aW5zdG9uLy0vd2luc3Rvbi0zLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRnNRZkVFKzhZSUVldVpFWWhIRGs1Y0lMbzFIT2NXa0d3dm9pZExyRGdQb2cwcjRic2VyMWxFSU9jbzJkTjl6cERKMU04OGhmRGdadnhlNXo0eE5jd2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jIjogIl4yLjYuMCIsCisgICAgICAgICJkaWFnbm9zdGljcyI6ICJeMS4xLjEiLAorICAgICAgICAiaXMtc3RyZWFtIjogIl4xLjEuMCIsCisgICAgICAgICJsb2dmb3JtIjogIl4xLjkuMSIsCisgICAgICAgICJvbmUtdGltZSI6ICIwLjAuNCIsCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAiXjIuMy42IiwKKyAgICAgICAgInN0YWNrLXRyYWNlIjogIjAuMC54IiwKKyAgICAgICAgInRyaXBsZS1iZWFtIjogIl4xLjMuMCIsCisgICAgICAgICJ3aW5zdG9uLXRyYW5zcG9ydCI6ICJeNC4yLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFzeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuNi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMvLS9hc3luYy0yLjYuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWZORWlMMitBWnQ2QWxBdy8yOUNyMFVEZTRzUkFIQ3BFSGg1NFdNeitCYjdRZk5jRnc0aDNsb29meUpwTGVRczRZeDd5dXF1LzJkTGdNNWhLT3M2SGxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJsb2Rhc2giOiAiXjQuMTcuMTAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAid2luc3Rvbi10cmFuc3BvcnQiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2luc3Rvbi10cmFuc3BvcnQvLS93aW5zdG9uLXRyYW5zcG9ydC00LjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQjJ3UHV3VWkzdmh6bi81MVV1a2NhbzRkSWR1RWlQT2NPdDlISjNRZWFYZ2tKNVo3VXdwQnp4UzRaR05IdHJ4clV2VHdlbXNRaVN5czBpaE9mOE1wMUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4zLjYiLAorICAgICAgICAidHJpcGxlLWJlYW0iOiAiXjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgIndvcmR3cmFwIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dvcmR3cmFwLy0vd29yZHdyYXAtMC4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10NVpwdTBMc3RBbjRQVmc4clZMS0YrcWhaRDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3JhcHB5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dyYXBweS8tL3dyYXBweS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRTUTlqejdCcWpYeE5rWUZ2QTBRTnVNS3RwOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cy8tL3dzLTYuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10YlN4aVQrcUpJMjIzQVA0aUxmUWJrYnhrd2RGY25lWWluTTIreDQ2R3gyd2d2YmFPTU8zNmN6ZmRmVlVCUlRIdnpBTVJoRGQ5OHNBNWQvQnVXYlFkZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMtbGltaXRlciI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAieG1sY3JlYXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3htbGNyZWF0ZS8tL3htbGNyZWF0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSttdjNZcVlLUVQrejNZOUxBOFd5YVNPTk1JOD0iCisgICAgfSwKKyAgICAieHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveHRlbmQvLS94dGVuZC00LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBjYlZNcjVsYmlQYmdnNzdsRG9mQkptTlk2OD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ5YXJncyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMTAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy95YXJncy8tL3lhcmdzLTMuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTkrNTcyRmZkZkIwdE9NRG5UdnZXZ2RGREg5RT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjYW1lbGNhc2UiOiAiXjEuMC4yIiwKKyAgICAgICAgImNsaXVpIjogIl4yLjEuMCIsCisgICAgICAgICJkZWNhbWVsaXplIjogIl4xLjAuMCIsCisgICAgICAgICJ3aW5kb3ctc2l6ZSI6ICIwLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiY2FtZWxjYXNlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FtZWxjYXNlLy0vY2FtZWxjYXNlLTEuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW03VXdUUzRMVm1tTExIV0xDS1BxcWRxbGlqaz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ5YXV6bCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy95YXV6bC8tL3lhdXpsLTIuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbFNqMFF0cXhzaWhPV0xRM203R1U0aTRNUUFVPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZkLXNsaWNlciI6ICJ+MS4wLjEiCisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvdHMvcGFja2FnZS5qc29uIGIvbGliL3RzL3BhY2thZ2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGExYzBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3RzL3BhY2thZ2UuanNvbgpAQCAtMCwwICsxLDM5IEBACit7CisgICJuYW1lIjogInRocmlmdCIsCisgICJ2ZXJzaW9uIjogIjAuMTMuMCIsCisgICJkZXNjcmlwdGlvbiI6ICJUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LiIsCisgICJhdXRob3IiOiB7CisgICAgIm5hbWUiOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiwKKyAgICAiZW1haWwiOiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIgorICB9LAorICAiYnVncyI6ICJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvcHJvamVjdHMvVEhSSUZUL3N1bW1hcnkiLAorICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiwKKyAgInJlcG9zaXRvcnkiOiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiLAorICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKKyAgImRldkRlcGVuZGVuY2llcyI6IHsKKyAgICAiQHR5cGVzL25vZGUtaW50NjQiOiAiXjAuNC4yOSIsCisgICAgIkB0eXBlcy9waGFudG9tIjogIl4zLjIuNSIsCisgICAgIkB0eXBlcy9xdW5pdCI6ICJeMi41LjQiLAorICAgICJicm93c2VyaWZ5IjogIl4xNi4yLjMiLAorICAgICJidWZmZXJ1dGlsIjogIl40LjAuMSIsCisgICAgImdydW50IjogIl4xLjAuMyIsCisgICAgImdydW50LWNsaSI6ICJeMS4yLjAiLAorICAgICJncnVudC1jb250cmliLWNvbmNhdCI6ICJeMS4wLjEiLAorICAgICJncnVudC1jb250cmliLWpzaGludCI6ICJeMS4wLjAiLAorICAgICJncnVudC1jb250cmliLXF1bml0IjogIl4zLjEuMCIsCisgICAgImdydW50LWNvbnRyaWItdWdsaWZ5IjogIl4xLjAuMSIsCisgICAgImdydW50LWpzZG9jIjogIl4yLjIuMSIsCisgICAgImdydW50LXNoZWxsLXNwYXduIjogIl4wLjMuMTIiLAorICAgICJqc2xpbnQiOiAiXjAuMTIuMCIsCisgICAgIm5vZGUtaW50NjQiOiAiXjAuNC4wIiwKKyAgICAicGhhbnRvbSI6ICJeNi4wLjMiLAorICAgICJ0eXBlc2NyaXB0IjogIl4zLjIuNCIKKyAgfSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiYnVmZmVydXRpbCI6ICJeNC4wLjEiLAorICAgICJqc2RvYyI6ICJeMy41LjUiLAorICAgICJqc29uLWludDY0IjogIl4xLjAuMCIsCisgICAgIm5vcHQiOiAiXjQuMC4xIgorICB9LAorICAidHlwZXMiOiAiLi90aHJpZnQuZC50cyIKK30KZGlmZiAtLWdpdCBhL2xpYi90cy90ZXN0L2J1aWxkLnhtbCBiL2xpYi90cy90ZXN0L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YzNhNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3RzL3Rlc3QvYnVpbGQueG1sCkBAIC0wLDAgKzEsMjUwIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iSmF2YSBTY3JpcHQgVGVzdCIgZGVmYXVsdD0idGVzdCIgYmFzZWRpcj0iLiIKKyAgeG1sbnM6YXJ0aWZhY3Q9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIKKyAgeG1sbnM6anNsPSJhbnRsaWI6Y29tLmdvb2dsZWNvZGUuanNsaW50NGphdmEiPgorCisgIDxkZXNjcmlwdGlvbj5KYXZhIFNjcmlwdCBUZXN0IGJhc2VkIG9uIFRocmlmdCBKYXZhIExpYnJhcnk8L2Rlc2NyaXB0aW9uPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSJzcmMiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW5qYXZhIiBsb2NhdGlvbj0iZ2VuLWphdmEiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW5qcyIgbG9jYXRpb249Imdlbi1qcyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiBsb2NhdGlvbj0iYnVpbGQiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGR9L2pzdGVzdC5qYXIiIC8+CisKKyAgPCEtLSB0aGUgcm9vdCBkaXJlY3RvcnksIHdoZXJlIHlvdSB1bnBhY2sgdGhyaWZ0IGRpc3RpYnV0aW9uIChlLmcuOiB0aHJpZnQtMC54LngudGFyLmd6KSAtLT4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5kaXIiIGxvY2F0aW9uPSIuLi8uLi8uLi8iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuamF2YS5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2xpYi9qYXZhIiAvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudG9vbHMuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL3Rvb2xzLyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIi8+CisKKyAgPCEtLSBJbmNsdWRlIHRoZSBiYXNlIEphdmEgcHJvcGVydGllcyBmaWxlIC0tPgorICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2dyYWRsZS5wcm9wZXJ0aWVzIiAvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuY29tcGlsZXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2NvbXBpbGVyL2NwcC90aHJpZnQiIC8+CisKKyAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnNvdXJjZXMuamFyIiAvPgorICAgIDwvZmlsZXNldD4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9kZXBzIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorICAgIDwvZmlsZXNldD4KKyAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGR9L2xpYiI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICA8L2ZpbGVzZXQ+CisgIDwvcGF0aD4KKworICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgorICAgIDxwYXRoIHJlZmlkPSJsaWJzLmNsYXNzcGF0aCIgLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amFyLmZpbGV9IiAvPgorICA8L3BhdGg+CisKKyAgPHRhcmdldCBuYW1lPSJkZXBlbmRlbmNpZXMiPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMiI+CisgICAgICAgICAgICA8ZmlsZXNldCBpZD0iZnMiIGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgICAgWW91IG5lZWQgbGlidGhyaWZ0Ki5qYXIgYW5kIGxpYnRocmlmdCp0ZXN0LmphciBsb2NhdGVkIGF0CisgICAgICAke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlicworICAgICAgRGlkIHlvdSBjb21waWxlIFRocmlmdCBKYXZhIGxpYnJhcnkgYW5kIGl0cyB0ZXN0IHN1aXRlIGJ5ICJhbnQgY29tcGlsZS10ZXN0Ij8KKyAgICA8L2ZhaWw+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIxIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGlkPSJmcyIgZGlyPSIke3RocmlmdC5kaXJ9IiBpbmNsdWRlcz0iY29tcGlsZXIvY3BwL3RocmlmdCIvPgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIFRocmlmdCBjb21waWxlciBpcyBtaXNzaW5nICEKKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iZGVwZW5kZW5jaWVzIj4KKyAgICA8dHN0YW1wIC8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC50b29scy5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS9qcy9saWIiLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS9saWIiLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS9sb2ciLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS90ZXN0Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0vdGVzdC9sb2ciLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkb3dubG9hZF9qc2xpYnMiPgorICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjExLjMubWluLmpzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvanF1ZXJ5LmpzIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgICA8Z2V0IHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0yLjYuMi5qcyIgZGVzdD0iJHtidWlsZH0vanMvbGliL3F1bml0LmpzIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgICA8Z2V0IHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0yLjYuMi5jc3MiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9xdW5pdC5jc3MiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTIuNi4yLmpzIiBkZXN0PSIke2J1aWxkfS90cy9xdW5pdC5qcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgICAgPGdldCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMi42LjIuY3NzIiBkZXN0PSIke2J1aWxkfS90cy9xdW5pdC5jc3MiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImpzbGlicyIgZGVwZW5kcz0iaW5pdCwgcHJveHksIGRvd25sb2FkX2pzbGlicyI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249ImNvbXBpbGUgdGhlIHRlc3Qgc3VpdGUiIGRlcGVuZHM9ImluaXQsIGdlbmVyYXRlLCByZXNvbHZlIj4KKyAgICA8IS0tIC8vVE9ETyBlbmFibGUgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQiLz4tLT4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VuamF2YX0iIGRlc3RkaXI9IiR7YnVpbGR9L3Rlc3QiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0vdGVzdCIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImpzdGVzdCIgZGVzY3JpcHRpb249ImNyZWF0ZSB0aGUgdGVzdCBzdWl0ZSBqYXIgZmlsZSIgZGVwZW5kcz0iY29tcGlsZSI+CisgICAgPGphciBqYXJmaWxlPSIke2phci5maWxlfSIgYmFzZWRpcj0iJHtidWlsZH0vdGVzdCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJydW4gdGhlIHRlc3Qgc2VydmVyIiBkZXBlbmRzPSJqc3Rlc3QsIGpzbGlicyI+CisgICAgPGphdmEgY2xhc3NuYW1lPSJ0ZXN0Lkh0dHBkIiBmb3JrPSJ0cnVlIgorICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyB2YWx1ZT0iLi4vIiAvPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJwcm94eSIgaWY9InByb3h5LmVuYWJsZWQiPgorICAgIDxzZXRwcm94eSBwcm94eWhvc3Q9IiR7cHJveHkuaG9zdH0iIHByb3h5cG9ydD0iJHtwcm94eS5wb3J0fSIKKyAgICAgIHByb3h5dXNlcj0iJHtwcm94eS51c2VyfSIgcHJveHlwYXNzd29yZD0iJHtwcm94eS5wYXNzfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Inh2ZmIiPgorICAgIDxlY2hvPmNoZWNrIGlmIFh2ZmIgaXMgYXZhaWxhYmxlOjwvZWNobz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSJYdmZiIiBmYWlsaWZleGVjdXRpb25mYWlscz0ibm8iIHJlc3VsdHByb3BlcnR5PSJ4dmZiLnByZXNlbnQiIGZhaWxvbmVycm9yPSJmYWxzZSIgb3V0cHV0PSIke2J1aWxkfS9sb2cveHZmYi5sb2ciPgorICAgICAgPGFyZyBsaW5lPSItLXZlcnNpb24iLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icGhhbnRvbWpzIiBkZXBlbmRzPSJ4dmZiIiBpZj0ieHZmYi5wcmVzZW50Ij4KKyAgICA8ZWNobz5jaGVjayBpZiBwaGFudG9tanMgaXMgYXZhaWxhYmxlOjwvZWNobz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSJwaGFudG9tanMiIGZhaWxpZmV4ZWN1dGlvbmZhaWxzPSJubyIgcmVzdWx0cHJvcGVydHk9InBoYW50b21qcy5wcmVzZW50IiBmYWlsb25lcnJvcj0iZmFsc2UiIG91dHB1dD0iJHtidWlsZH0vbG9nL3BoYW50b21qcy5sb2ciPgorICAgICAgPGFyZyBsaW5lPSItLXZlcnNpb24iLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idW5pdHRlc3QiIGRlc2NyaXB0aW9uPSJkbyB1bml0IHRlc3RzIHdpdGggaGVhZGxlc3MgYnJvd3NlciBwaGFudG9tanMiIGRlcGVuZHM9ImluaXQsIHBoYW50b21qcywganN0ZXN0LCBqc2xpYnMiIGlmPSJwaGFudG9tanMucHJlc2VudCI+CisgICAgPHBhcmFsbGVsPgorICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iWHZmYiIgc3Bhd249InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSI+CisgICAgICAgIDxhcmcgbGluZT0iOjk5IiAvPgorICAgICAgPC9leGVjPgorICAgICAgPGphdmEgY2xhc3NuYW1lPSJ0ZXN0Lkh0dHBkIiBmb3JrPSJ0cnVlIiB0aW1lb3V0PSIxMDAwMCIKKyAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy91bml0dGVzdC5sb2ciPgorICAgICAgICA8YXJnIHZhbHVlPSIuLi8iIC8+CisgICAgICA8L2phdmE+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPHNsZWVwIHNlY29uZHM9IjIiLz4KKyAgICAgICAgPGVjaG8+UnVubmluZyBVbml0IFRlc3RzIHdpdGggaGVhZGxlc3MgYnJvd3NlciE8L2VjaG8+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9InBoYW50b21qcyIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICAgIDxlbnYga2V5PSJESVNQTEFZIiB2YWx1ZT0iOjk5Ii8+CisgICAgICAgICAgPGFyZyBsaW5lPSJwaGFudG9tanMtcXVuaXQuanMgaHR0cDovL2xvY2FsaG9zdDo4MDg4L3Rlc3QvdGVzdC5odG1sIiAvPgorICAgICAgICA8L2V4ZWM+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9wYXJhbGxlbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSI+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmEgJHt0aHJpZnQuZGlyfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDwvZXhlYz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4ganM6anF1ZXJ5ICR7dGhyaWZ0LmRpcn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8L2V4ZWM+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzOmpxdWVyeSAke3RocmlmdC5kaXJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQiIC8+CisgICAgPC9leGVjPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJydW4gdGVzdCBzdWl0ZSAobGludCwgdW5pdHRlc3QpIiBkZXBlbmRzPSJsaW50LCB1bml0dGVzdCIvPgorCisgIDx0YXJnZXQgbmFtZT0ibGludCIgZGVzY3JpcHRpb249ImNvZGUgcXVhbGl0eSBjaGVja3MgKGpzbGludCBhbmQgZ2pzbGludCBpZiBhdmFpbGFibGUpIiBkZXBlbmRzPSJnZW5lcmF0ZSwgZ2pzbGludCwganNsaW50Ii8+CisKKyAgPHRhcmdldCBuYW1lPSJqc2xpbnQiIGRlcGVuZHM9InJlc29sdmUiPgorICAgIDx0YXNrZGVmIHVyaT0iYW50bGliOmNvbS5nb29nbGVjb2RlLmpzbGludDRqYXZhIiByZXNvdXJjZT0iY29tL2dvb2dsZWNvZGUvanNsaW50NGphdmEvYW50bGliLnhtbCIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIgLz4KKyAgICA8IS0tCisgICAgICAgICB0aGUgZm9sbG93aW5nIG9wdGlvbnMgd291bGQgcHJvYmFibHkgbWFrZSBzZW5zZSBpbiB0aGUgZnV0dXJlOgorICAgICAgICAgYnJvd3Nlcix1bmRlZixlcWVxZXEscGx1c3BsdXMsYml0d2lzZSxyZWdleHAsc3RyaWN0LG5ld2NhcCxpbW1lZAorICAgIC0tPgorICAgIDxqc2w6anNsaW50IG9wdGlvbnM9ImV2aWwsZm9yaW4sYnJvd3NlcixiaXR3aXNlLHJlZ2V4cCxuZXdjYXAsaW1tZWQiIGVuY29kaW5nPSJVVEYtOCI+CisgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIiAvPgorICAgICAgPGZpbGVzZXQgZGlyPSIuLi9zcmMiIGluY2x1ZGVzPSJ0aHJpZnQuanMiIC8+CisKKyAgICAgIDwhLS0gaXNzdWVzIHdpdGggdW5zYWZlIGNoYXJhY3RlciAtLT4KKyAgICAgIDwhLS0gZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSIqdGVzdCouanMiIC8+IC0tPgorICAgIDwvanNsOmpzbGludD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjaGVjay1nanNsaW50Ij4KKyAgICA8ZWNobz5jaGVjayBpZiBnanNsaW50IGlzIGF2YWlsYWJsZTo8L2VjaG8+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iZ2pzbGludCIgZmFpbGlmZXhlY3V0aW9uZmFpbHM9Im5vIiByZXN1bHRwcm9wZXJ0eT0iZ2pzbGludC5wcmVzZW50IiBmYWlsb25lcnJvcj0iZmFsc2UiPgorICAgICAgPGFyZyBsaW5lPSItLWhlbHBzaG9ydCIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnanNsaW50IiBkZXBlbmRzPSJjaGVjay1nanNsaW50IiBpZj0iZ2pzbGludC5wcmVzZW50Ij4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSJnanNsaW50IiBmYWlsaWZleGVjdXRpb25mYWlscz0ibm8iPgorICAgICAgPGFyZyBsaW5lPSItLW5vanNkb2MiLz4KKyAgICAgIDxhcmcgbGluZT0iJHtnZW5qc30vKi5qcyIvPgorICAgICAgPGFyZyBsaW5lPSIuLi9zcmMvdGhyaWZ0LmpzIi8+CisKKyAgICAgIDwhLS0gaXNzdWVzIHdpdGggdW5zYWZlIGNoYXJhY3RlciwgZXRjLiAtLT4KKyAgICAgIDwhLS0gPGFyZyBsaW5lPSIqdGVzdCouanMiLz4gLS0+CisgICAgPC9leGVjPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7Z2VuamF2YX0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7Z2VuanN9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9ImluaXQsbXZuLmFudC50YXNrcy5jaGVjayIgdW5sZXNzPSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICA8Z2V0IHNyYz0iJHttdm4uYW50LnRhc2sudXJsfS8ke212bi5hbnQudGFzay5qYXJ9IiBkZXN0PSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5jaGVjayI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlc29sdmUiIGRlcGVuZHM9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIHVubGVzcz0ibXZuLmZpbmlzaGVkIj4KKyAgICA8dHlwZWRlZiB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgY2xhc3NwYXRoPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvdG9vbHMvJHttdm4uYW50LnRhc2suamFyfSIvPgorCisgICAgPGFydGlmYWN0OmRlcGVuZGVuY2llcyBmaWxlc2V0SWQ9ImpzLnRlc3QuZGVwZW5kZW5jeS5qYXJzIj4KKyAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMiIGFydGlmYWN0SWQ9Imh0dHBjbGllbnQiIHZlcnNpb249IjQuMC4xIi8+CisgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlY29kZS5qc2xpbnQ0amF2YSIgYXJ0aWZhY3RJZD0ianNsaW50NGphdmEtYW50IiB2ZXJzaW9uPSIxLjQuNiIvPgorICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iZXUubWVkc2VhLm1pbWV1dGlsIiBhcnRpZmFjdElkPSJtaW1lLXV0aWwiIHZlcnNpb249IjIuMS4zIi8+CisgICAgPC9hcnRpZmFjdDpkZXBlbmRlbmNpZXM+CisKKyAgICA8IS0tIENvcHkgdGhlIGRlcGVuZGVuY2llcyB0byB0aGUgYnVpbGQvbGliIGRpciAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtidWlsZH0vbGliIj4KKyAgICAgIDxmaWxlc2V0IHJlZmlkPSJqcy50ZXN0LmRlcGVuZGVuY3kuamFycyIvPgorICAgICAgPG1hcHBlciB0eXBlPSJmbGF0dGVuIi8+CisgICAgPC9jb3B5PgorCisgICAgPHByb3BlcnR5IG5hbWU9Im12bi5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvdHMvdGVzdC9waGFudG9tLWNsaWVudC50cyBiL2xpYi90cy90ZXN0L3BoYW50b20tY2xpZW50LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MTg5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdHMvdGVzdC9waGFudG9tLWNsaWVudC50cwpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCitpbXBvcnQgeyBUaHJpZnRUZXN0IH0gZnJvbSAiLi9nZW4tanMvVGhyaWZ0VGVzdF90eXBlcyI7CitpbXBvcnQgIi4vZ2VuLWpzL1RocmlmdFRlc3QiOwordmFyIEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOwordmFyIHBoYW50b20gPSByZXF1aXJlKCJwaGFudG9tIik7CisKK2NvbnN0IGludDY0XzJfcG93XzYwOiB0eXBlb2YgSW50NjQgPSBuZXcgSW50NjQoJzEwMDAwMDAwMDAwMDAwMDAnKTsKK2NvbnN0IGludDY0X21pbnVzXzJfcG93XzYwOiB0eXBlb2YgSW50NjQgPSBuZXcgSW50NjQoJ2YwMDAwMDAwMDAwMDAwMDAnKTsKKworIChmdW5jdGlvbigpIHsKKyAgICAndXNlIHN0cmljdCc7CisgIAorICAgIC8vIFJ1ZGltZW50YXJ5IHRlc3QgaGVscGVyIGZ1bmN0aW9ucworICAgIC8vIFRPRE86IFJldHVybiBlcnJvciBjb2RlIGJhc2VkIG9uIGtpbmQgb2YgZXJyb3JzIHJhdGhlciB0aGFuIHRocm93CisgICAgdmFyIG9rID0gZnVuY3Rpb24odCwgbXNnKSB7CisgICAgICBpZiAoIXQpIHsKKyAgICAgICAgY29uc29sZS5sb2coJyoqKiBGQUlMRUQgKioqJyk7CisgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpOworICAgICAgfQorICAgIH07CisgICAgdmFyIGVxdWFsID0gZnVuY3Rpb24oYSwgYikgeworICAgICAgaWYgKGEgIT09IGIpIHsKKyAgICAgICAgY29uc29sZS5sb2coJyoqKiBGQUlMRUQgKioqJyk7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigpOworICAgICAgfQorICAgIH07CisgICAgdmFyIHRlc3QgPSBmdW5jdGlvbihuYW1lLCBmKSB7CisgICAgICBjb25zb2xlLmxvZygnVEVTVCA6ICcgKyBuYW1lKTsKKyAgICAgIGYoKTsKKyAgICAgIGNvbnNvbGUubG9nKCdPS1xuJyk7CisgICAgfTsKKyAgCisgICAgdmFyIHBhcnNlQXJncyA9IGZ1bmN0aW9uKGFyZ3MpIHsKKyAgICAgIHZhciBza2lwcyA9IFsKKyAgICAgICAgJy0tdHJhbnNwb3J0PWh0dHAnLAorICAgICAgICAnLS1wcm90b2NvbD1qc29uJworICAgICAgXTsKKyAgICAgIHZhciBvcHRzID0geworICAgICAgICBwb3J0OiAnOTA5MCcKKyAgICAgICAgLy8gcHJvdG9jb2w6ICdqc29uJywKKyAgICAgIH07CisgICAgICB2YXIga2V5cyA9IHt9OworICAgICAgZm9yICh2YXIga2V5IGluIG9wdHMpIHsKKyAgICAgICAga2V5c1snLS0nICsga2V5ICsgJz0nXSA9IGtleTsKKyAgICAgIH0KKyAgICAgIGZvciAodmFyIGkgaW4gYXJncykgeworICAgICAgICB2YXIgYXJnID0gYXJnc1tpXTsKKyAgICAgICAgaWYgKHNraXBzLmluZGV4T2YoYXJnKSAhPSAtMSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHZhciBoaXQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh2YXIgayBpbiBrZXlzKSB7CisgICAgICAgICAgaWYgKGFyZy5zbGljZSgwLCBrLmxlbmd0aCkgPT09IGspIHsKKyAgICAgICAgICAgIG9wdHNba2V5c1trXV0gPSBhcmcuc2xpY2Uoay5sZW5ndGgpOworICAgICAgICAgICAgaGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWhpdCkgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBhcmd1bWVudDogJyArIGFyZyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHZhciBwb3J0QXNJbnQ6IG51bWJlciA9IHBhcnNlSW50KG9wdHMucG9ydCwgMTApOworICAgICAgaWYgKCFvcHRzLnBvcnQgfHwgcG9ydEFzSW50IDwgMSB8fCBwb3J0QXNJbnQgPiA2NTUzNSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcG9ydCBudW1iZXInKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBvcHRzOworICAgIH07CisgIAorICAgIHZhciBleGVjdXRlID0gZnVuY3Rpb24oKSB7CisgICAgICBjb25zb2xlLmxvZygnIyMjIEFwYWNoZSBUaHJpZnQgSmF2YXNjcmlwdCBzdGFuZGFsb25lIHRlc3QgY2xpZW50Jyk7CisgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CisgIAorICAgICAgcGhhbnRvbS5wYWdlLmluamVjdEpzKCd0aHJpZnQuanMnKTsKKyAgICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygnZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMnKTsKKyAgICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygnZ2VuLWpzL1RocmlmdFRlc3QuanMnKTsKKyAgCisgICAgICB2YXIgc3lzdGVtID0gcmVxdWlyZSgnc3lzdGVtJyk7CisgICAgICB2YXIgb3B0cyA9IHBhcnNlQXJncyhzeXN0ZW0uYXJncy5zbGljZSgxKSk7CisgICAgICB2YXIgcG9ydCA9IG9wdHMucG9ydDsKKyAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnaHR0cDovL2xvY2FsaG9zdDonICsgcG9ydCArICcvc2VydmljZScpOworICAgICAgdmFyIHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgdmFyIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworICAKKyAgCisgICAgICAvLyBUT0RPOiBSZW1vdmUgZHVwbGljYXRlIGNvZGUgd2l0aCB0ZXN0LmpzLgorICAgICAgLy8gYWxsIExhbmd1YWdlcyBpbiBVVEYtOAorICAgICAgdmFyIHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7CisgIAorICAgICAgZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShtYXAxLCBtYXAyKSB7CisgICAgICAgIGlmICh0eXBlb2YgbWFwMSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWFwMiAhPT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gJ29iamVjdCcpIHsKKyAgICAgICAgICAgIGVxdWFsKG1hcDEsIG1hcDIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgeworICAgICAgICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgCisgICAgICB0ZXN0KCdWb2lkJywgZnVuY3Rpb24oKSB7CisgICAgICAgIGVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOworICAgICAgfSk7CisgICAgICB0ZXN0KCdCaW5hcnkgKFN0cmluZyknLCBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGJpbmFyeTogc3RyaW5nID0gJyc7CisgICAgICAgIGZvciAodmFyIHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgICAgICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodik7CisgICAgICAgIH0KKyAgICAgICAgZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYmluYXJ5KSwgYmluYXJ5KTsKKyAgICAgIH0pOworICAgICAgdGVzdCgnQmluYXJ5IChVaW50OEFycmF5KScsIGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgYmluYXJ5OiBzdHJpbmcgPSAnJzsKKyAgICAgICAgZm9yICh2YXIgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICAgICAgfQorICAgICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aCk7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgYXJyW2ldID0gYmluYXJ5W2ldLmNoYXJDb2RlQXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgaGV4RW5jb2RlZFN0cmluZyA9IEFycmF5LmZyb20oYXJyLCBmdW5jdGlvbihieXRlKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKTsKKyAgICAgICAgfSkuam9pbignJykKKyAgICAgICAgZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoaGV4RW5jb2RlZFN0cmluZyksIGJpbmFyeSk7CisgICAgICB9KTsKKyAgICAgIHRlc3QoJ1N0cmluZycsIGZ1bmN0aW9uKCkgeworICAgICAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZygnJyksICcnKTsKKyAgICAgICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCksIHN0cmluZ1Rlc3QpOworICAKKyAgICAgICAgdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAgICAgICAgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKKyAgICAgICAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOworICAgICAgICAgICAgICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKSwgc3BlY2lhbENoYXJhY3RlcnMpOworICAgICAgfSk7CisgICAgICB0ZXN0KCdEb3VibGUnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMCksIDApOworICAgICAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZSgtMSksIC0xKTsKKyAgICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMy4xNCksIDMuMTQpOworICAgICAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLCA2MCkpLCBNYXRoLnBvdygyLCA2MCkpOworICAgICAgfSk7CisgICAgICB0ZXN0KCdCb29sJywgZnVuY3Rpb24oKSB7CisgICAgICAgIGVxdWFsKGNsaWVudC50ZXN0Qm9vbCh0cnVlKSwgdHJ1ZSk7CisgICAgICAgIGVxdWFsKGNsaWVudC50ZXN0Qm9vbChmYWxzZSksIGZhbHNlKTsKKyAgICAgIH0pOworICAgICAgdGVzdCgnSTgnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgZXF1YWwoY2xpZW50LnRlc3RCeXRlKDApLCAwKTsKKyAgICAgICAgZXF1YWwoY2xpZW50LnRlc3RCeXRlKDB4MDEpLCAweDAxKTsKKyAgICAgIH0pOworICAgICAgdGVzdCgnSTMyJywgZnVuY3Rpb24oKSB7CisgICAgICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKDApLCAwKTsKKyAgICAgICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApKSwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsIDMwKSksIC1NYXRoLnBvdygyLCAzMCkpOworICAgICAgfSk7CisgICAgICB0ZXN0KCdJNjQnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgZXF1YWwoY2xpZW50LnRlc3RJNjQobmV3IEludDY0KDApKSwgMCk7CisgICAgICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KGludDY0XzJfcG93XzYwKSwgTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoaW50NjRfbWludXNfMl9wb3dfNjApLCAtTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgIH0pOworICAKKyAgICAgIHRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgc3RydWN0VGVzdElucHV0OiBUaHJpZnRUZXN0Llh0cnVjdCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICAgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IGludDY0XzJfcG93XzYwOworICAKKyAgICAgICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQ6IFRocmlmdFRlc3QuWHRydWN0ID0gY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKKyAgCisgICAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICAKKyAgICAgICAgZXF1YWwoSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgICAgfSk7CisgIAorICAgICAgdGVzdCgnTmVzdCcsIGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgeHRyVGVzdElucHV0OiBUaHJpZnRUZXN0Llh0cnVjdCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgICB4dHJUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgICAgIHh0clRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICAgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IGludDY0XzJfcG93XzYwOworICAKKyAgICAgICAgdmFyIG5lc3RUZXN0SW5wdXQ6IFRocmlmdFRlc3QuWHRydWN0MiA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKKyAgICAgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICAgICAgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcgPSB4dHJUZXN0SW5wdXQ7CisgICAgICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMTUpOworICAKKyAgICAgICAgdmFyIG5lc3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQpOworICAKKyAgICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcpOworICAgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOworICAgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcpOworICAgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgCisgICAgICAgIGVxdWFsKEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RJbnB1dCkpOworICAgICAgfSk7CisgIAorICAgICAgdGVzdCgnTWFwJywgZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBtYXBUZXN0SW5wdXQ6IHtbazogbnVtYmVyXTogbnVtYmVyO30gPSB7NzogNzcsIDg6IDg4LCA5OiA5OX07CisgIAorICAgICAgICB2YXIgbWFwVGVzdE91dHB1dDoge1trOiBudW1iZXJdOiBudW1iZXI7fSA9IGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCk7CisgIAorICAgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgICAgIGVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgICAgICB9CisgICAgICB9KTsKKyAgCisgICAgICB0ZXN0KCdTdHJpbmdNYXAnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIG1hcFRlc3RJbnB1dDoge1trOiBzdHJpbmddOiBzdHJpbmc7fSA9IHsKKyAgICAgICAgICAnYSc6ICcxMjMnLCAnYSBiJzogJ3dpdGggc3BhY2VzICcsICdzYW1lJzogJ3NhbWUnLCAnMCc6ICdudW1lcmljIGtleScsCisgICAgICAgICAgJ2xvbmdWYWx1ZSc6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICdsb25nIGtleScKKyAgICAgICAgfTsKKyAgCisgICAgICAgIHZhciBtYXBUZXN0T3V0cHV0OiB7W2s6IHN0cmluZ106IHN0cmluZzt9ID0gY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KTsKKyAgCisgICAgICAgIGZvciAodmFyIGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7CisgICAgICAgICAgZXF1YWwobWFwVGVzdE91dHB1dFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAKKyAgICAgIHRlc3QoJ1NldCcsIGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgc2V0VGVzdElucHV0OiBudW1iZXJbXSA9IFsxLCAyLCAzXTsKKyAgICAgICAgb2soY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0KSwgc2V0VGVzdElucHV0KTsKKyAgICAgIH0pOworICAKKyAgICAgIHRlc3QoJ0xpc3QnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGxpc3RUZXN0SW5wdXQ6IG51bWJlcltdID0gWzEsIDIsIDNdOworICAgICAgICBvayhjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCksIGxpc3RUZXN0SW5wdXQpOworICAgICAgfSk7CisgIAorICAgICAgdGVzdCgnRW51bScsIGZ1bmN0aW9uKCkgeworICAgICAgICBlcXVhbChjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgICAgfSk7CisgIAorICAgICAgdGVzdCgnVHlwZURlZicsIGZ1bmN0aW9uKCkgeworICAgICAgICBlcXVhbChjbGllbnQudGVzdFR5cGVkZWYobmV3IEludDY0KDY5KSksIDY5KTsKKyAgICAgIH0pOworICAKKyAgICAgIHRlc3QoJ01hcE1hcCcsIGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0OiB7W0s6IG51bWJlcl06IHtbazogbnVtYmVyXTogbnVtYmVyfX0gPSB7CisgICAgICAgICAgJzQnOiB7JzEnOiAxLCAnMic6IDIsICczJzogMywgJzQnOiA0fSwKKyAgICAgICAgICAnLTQnOiB7Jy00JzogLTQsICctMyc6IC0zLCAnLTInOiAtMiwgJy0xJzogLTF9CisgICAgICAgIH07CisgIAorICAgICAgICB2YXIgbWFwTWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworICAKKyAgCisgICAgICAgIGZvciAodmFyIGtleSBpbiBtYXBNYXBUZXN0T3V0cHV0KSB7CisgICAgICAgICAgZm9yICh2YXIga2V5MiBpbiBtYXBNYXBUZXN0T3V0cHV0W2tleV0pIHsKKyAgICAgICAgICAgIGVxdWFsKG1hcE1hcFRlc3RPdXRwdXRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseShtYXBNYXBUZXN0T3V0cHV0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOworICAgICAgfSk7CisgIAorICAgICAgdGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKKyAgICAgICAgICBvayhmYWxzZSwgImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiBidXQgdGhlcmUgd2FzIG5vIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOworICAgICAgICAgIGVxdWFsKGUubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAKKyAgICAgIHRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgIG9rKGZhbHNlLCAiZXhwZWN0ZWQgbm8gZXhjZXB0aW9uIGJ1dCBoZXJlIHdhcyBhbiBleGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgIAorICAgICAgdGVzdCgnVEV4Y2VwdGlvbicsIGZ1bmN0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJyk7CisgICAgICAgICAgb2soZmFsc2UsICJleHBlY3RlZCBhbiBleGNlcHRpb24gYnV0IHRoZXJlIHdhcyBubyBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgIG9rKG9rLCAic3VjY2VzZnVsbHkgZ290IGV4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgICB9KTsKKyAgCisgICAgICBjb25zdCBjcmF6eTogVGhyaWZ0VGVzdC5JbnNhbml0eSA9IHsKKyAgICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogbmV3IEludDY0KDUpLCAnOCc6IG5ldyBJbnQ2NCg4KSB9LAorICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgJ2k2NF90aGluZyc6IG5ldyBJbnQ2NCg0KQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgICAgICdpNjRfdGhpbmcnOiBuZXcgSW50NjQoMikKKyAgICAgICAgfV0KKyAgICB9OworICAgICAgdGVzdCgnSW5zYW5pdHknLCBmdW5jdGlvbigpIHsKKyAgICAgICAgY29uc3QgaW5zYW5pdHk6IHtbazogbnVtYmVyXTogKFRocmlmdFRlc3QuSW5zYW5pdHkgfCB7W2s6bnVtYmVyXTogVGhyaWZ0VGVzdC5JbnNhbml0eX0pfSA9IHsKKyAgICAgICAgICAgICcxJzogeworICAgICAgICAgICAgICAgICcyJzogY3JhenksCisgICAgICAgICAgICAgICAgJzMnOiBjcmF6eQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICcyJzogeyAnNic6IG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCkgfQorICAgICAgICB9OworICAgICAgICB2YXIgcmVzID0gY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eShjcmF6eSkpOworICAgICAgICBvayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOworICAgICAgICBvayhpbnNhbml0eSwgSlNPTi5zdHJpbmdpZnkoaW5zYW5pdHkpKTsKKyAgCisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkocmVzLCBpbnNhbml0eSk7CisgICAgICB9KTsKKyAgCisgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CisgICAgICBjb25zb2xlLmxvZygnIyMjIEFsbCB0ZXN0cyBzdWNjZWVkZWQuJyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9OworICAKKyAgICB0cnkgeworICAgICAgdmFyIHJldCA9IGV4ZWN1dGUoKTsKKyAgICAgIHBoYW50b20uZXhpdChyZXQpOworICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgLy8gQ2F0Y2ggYWxsIGFuZCBleGl0IHRvIGF2b2lkIGhhbmcuCisgICAgICBjb25zb2xlLmVycm9yKGVycik7CisgICAgICBwaGFudG9tLmV4aXQoMSk7CisgICAgfQorICB9KSgpOworICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvdHMvdGVzdC9zZXJ2ZXJfaHR0cC5qcyBiL2xpYi90cy90ZXN0L3NlcnZlcl9odHRwLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzODBjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdHMvdGVzdC9zZXJ2ZXJfaHR0cC5qcwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICBUaGlzIEhUVFAgc2VydmVyIGlzIGRlc2lnbmVkIHRvIHNlcnZlIHRoZSB0ZXN0Lmh0bWwgYnJvd3NlcgorLy8gIGJhc2VkIEphdmFTY3JpcHQgdGVzdCBwYWdlICh3aGljaCBtdXN0IGJlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSkuCisvLyAgVGhpcyBzZXJ2ZXIgYWxzbyBzdXBwbGllcyB0aGUgVGhyaWZ0IGJhc2VkIHRlc3Qgc2VydmljZSwgd2hpY2ggZGVwZW5kcworLy8gIG9uIHRoZSBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBJREwgc2VydmljZSAod2hpY2ggbXVzdCBiZSBjb21waWxlZAorLy8gIGZvciBOb2RlIGFuZCBicm93c2VyIGJhc2VkIEphdmFTY3JpcHQgaW4gLi9nZW4tbm9kZWpzIGFuZCAuL2dlbi1qcworLy8gIHJlc3BlY3RpdmVseSkuCisvLworLy8gIFVzaW5nIHRoZSBjb21tYW5kIGZsYWcgLS1lczYsIHRoaXMgc2VydmVyIGNhbiBiZSBydW4gdXNpbmcgbm9kZWpzIGNvZGUgYnVpbHQKKy8vICBmb3IgdGhlIGVzNiBlbnZpcm9ubWVudCBvciBmb3IgcHJlLWVzNiBlbnZpcm9ubWVudC4KKy8vCisKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoJy4uLy4uL25vZGVqcy9saWIvdGhyaWZ0Jyk7Citjb25zdCBlczZNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWVzNicpOworY29uc3QgZ2VuRm9sZGVyID0gZXM2TW9kZSA/ICdnZW4tbm9kZWpzLWVzNicgOiAnZ2VuLW5vZGVqcyc7Citjb25zdCBUaHJpZnRUZXN0U3ZjID0gcmVxdWlyZShgLi8ke2dlbkZvbGRlcn0vVGhyaWZ0VGVzdC5qc2ApOworY29uc3QgVGhyaWZ0VGVzdEhhbmRsZXIgPSByZXF1aXJlKCcuL3Rlc3RfaGFuZGxlcicpLlRocmlmdFRlc3RIYW5kbGVyOworCitjb25zdCBUaHJpZnRUZXN0U3ZjT3B0ID0geworCXRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKwlwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisJcHJvY2Vzc29yOiBUaHJpZnRUZXN0U3ZjLAorCWhhbmRsZXI6IFRocmlmdFRlc3RIYW5kbGVyCit9OworCitjb25zdCBUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zID0geworCWZpbGVzOiBfX2Rpcm5hbWUsCisJc2VydmljZXM6IHsKKwkJJy9zZXJ2aWNlJzogVGhyaWZ0VGVzdFN2Y09wdAorCX0KK307CisKK2NvbnN0IHNlcnZlciA9IHRocmlmdC5jcmVhdGVXZWJTZXJ2ZXIoVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyk7Citjb25zdCBwb3J0ID0gZXM2TW9kZSA/IDgwODggOiA4MDg5Oworc2VydmVyLmxpc3Rlbihwb3J0KTsKK2NvbnNvbGUubG9nKGBTZXJ2aW5nIGZpbGVzIGZyb206ICR7X19kaXJuYW1lfWApOworY29uc29sZS5sb2coYEh0dHAvVGhyaWZ0IFNlcnZlciAoRVM2IG1vZGUgJHtlczZNb2RlfSkgcnVubmluZyBvbiBwb3J0OiAke3BvcnR9YCk7CmRpZmYgLS1naXQgYS9saWIvdHMvdGVzdC90ZXN0LWludDY0Lmh0bWwgYi9saWIvdHMvdGVzdC90ZXN0LWludDY0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhYzI3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90cy90ZXN0L3Rlc3QtaW50NjQuaHRtbApAQCAtMCwwICsxLDQ2IEBACisrPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgICAgPHRpdGxlPkludDY0IENvbnN0YW50cyBpbiBKUzogVW5pdCBUZXN0PC90aXRsZT4KKworICAgICAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgorCisgICAgICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC90cy9saWIvdGVzdC1pbnQ2NC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgIDwvaGVhZD4KKzxib2R5PgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+SW50NjQgQ29uc3RhbnRzIGluIEpTOiBVbml0IFRlc3Q8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorICAtLT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi90cy90ZXN0L3Rlc3QtaW50NjQudHMgYi9saWIvdHMvdGVzdC90ZXN0LWludDY0LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NGQ4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdHMvdGVzdC90ZXN0LWludDY0LnRzCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLyoganNoaW50IC1XMTAwICovCisKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoIm5vZGUtaW50NjQiKTsKK3ZhciBKU09OSW50NjQgPSByZXF1aXJlKCJqc29uLWludDY0Iik7CitpbXBvcnQgeyBJbnQ2NFRlc3QgfSBmcm9tICIuL2dlbi1qcy9JbnQ2NFRlc3RfdHlwZXMiOworCisKKy8vIFdvcmsgYXJvdW5kIGZvciBvbGQgQVBJIHVzZWQgYnkgUVVuaXRBZGFwdGVyIG9mIGpzVGVzdERyaXZlcgoraWYgKHR5cGVvZiBRVW5pdC5sb2cgPT0gJ2Z1bmN0aW9uJykgeworICAvLyBXaGVuIHVzaW5nIHJlYWwgUVVuaXQgKGZyb24gUGhhbnRvbUpTKSBsb2cgZmFpbHVyZXMgdG8gY29uc29sZQorICBRVW5pdC5sb2coZnVuY3Rpb24oZGV0YWlscykgeworICAgIGlmICghZGV0YWlscy5yZXN1bHQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PSBGQUlMID09PT09PT09Jyk7CisgICAgICBjb25zb2xlLmxvZygnVGVzdE5hbWU6ICcgKyBkZXRhaWxzLm5hbWUpOworICAgICAgaWYgKGRldGFpbHMubWVzc2FnZSkgY29uc29sZS5sb2coZGV0YWlscy5tZXNzYWdlKTsKKyAgICAgIGNvbnNvbGUubG9nKCdFeHBlY3RlZDogJyArIGRldGFpbHMuZXhwZWN0ZWQpOworICAgICAgY29uc29sZS5sb2coJ0FjdHVhbCAgOiAnICsgZGV0YWlscy5hY3R1YWwpOworICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09PT0nKTsKKyAgICB9CisgIH0pOworfQorCitRVW5pdC5tb2R1bGUoJ0ludDY0Jyk7CisKKyAgUVVuaXQudGVzdCgnSW50NjQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zb2xlLmxvZygnSW50NjQgdGVzdCAtLSBzdGFydHMnKTsKKyAgICBjb25zdCBFWFBFQ1RFRF9TTUFMTF9JTlQ2NF9BU19OVU1CRVI6IG51bWJlciA9IDQyOworICAgIGNvbnN0IEVYUEVDVEVEX1NNQUxMX0lOVDY0OiB0eXBlb2YgSW50NjQgPSBuZXcgSW50NjQoNDIpOworICAgIGNvbnN0IEVYUEVDVEVEX01BWF9KU19TQUZFX0lOVDY0OiB0eXBlb2YgSW50NjQgPSBuZXcgSW50NjQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpOworICAgIGNvbnN0IEVYUEVDVEVEX01JTl9KU19TQUZFX0lOVDY0OiB0eXBlb2YgSW50NjQgPSBuZXcgSW50NjQoTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIpOworICAgIGNvbnN0IEVYUEVDVEVEX01BWF9KU19TQUZFX1BMVVNfT05FX0lOVDY0OiB0eXBlb2YgSW50NjQgPSBuZXcgSW50NjQoIjAwMjAwMDAwMDAwMDAwMDAiKTsgLy8gaGV4LWVuY29kZWQKKyAgICBjb25zdCBFWFBFQ1RFRF9NSU5fSlNfU0FGRV9NSU5VU19PTkVfSU5UNjQ6IHR5cGVvZiBJbnQ2NCA9IG5ldyBJbnQ2NCgiZmZlMDAwMDAwMDAwMDAwMCIpOyAvLyBoZXgtZW5jb2RlZCAyJ3MgY29tcGxlbWVudAorICAgIGNvbnN0IEVYUEVDVEVEX01BWF9TSUdORURfSU5UNjQ6IHR5cGVvZiBJbnQ2NCA9IG5ldyBJbnQ2NCgiN2ZmZmZmZmZmZmZmZmZmZiIpOyAvLyBoZXgtZW5jb2RlZAorICAgIGNvbnN0IEVYUEVDVEVEX01JTl9TSUdORURfSU5UNjQ6IHR5cGVvZiBJbnQ2NCA9IG5ldyBJbnQ2NCgiODAwMDAwMDAwMDAwMDAwMCIpOyAvLyBoZXgtZW5jb2RlZCAyJ3MgY29tcGxlbWVudAorICAgIGNvbnN0IEVYUEVDVEVEX0lOVDY0X0xJU1QgPSBbCisgICAgICBFWFBFQ1RFRF9TTUFMTF9JTlQ2NCwKKyAgICAgIEVYUEVDVEVEX01BWF9KU19TQUZFX0lOVDY0LAorICAgICAgRVhQRUNURURfTUlOX0pTX1NBRkVfSU5UNjQsCisgICAgICBFWFBFQ1RFRF9NQVhfSlNfU0FGRV9QTFVTX09ORV9JTlQ2NCwKKyAgICAgIEVYUEVDVEVEX01JTl9KU19TQUZFX01JTlVTX09ORV9JTlQ2NCwKKyAgICAgIEVYUEVDVEVEX01BWF9TSUdORURfSU5UNjQsCisgICAgICBFWFBFQ1RFRF9NSU5fU0lHTkVEX0lOVDY0CisgICAgXTsKKyAgICBhc3NlcnQub2soRVhQRUNURURfU01BTExfSU5UNjQuZXF1YWxzKEludDY0VGVzdC5TTUFMTF9JTlQ2NCkpOworICAgIGFzc2VydC5vayhFWFBFQ1RFRF9NQVhfSlNfU0FGRV9JTlQ2NC5lcXVhbHMoSW50NjRUZXN0Lk1BWF9KU19TQUZFX0lOVDY0KSk7CisgICAgYXNzZXJ0Lm9rKEVYUEVDVEVEX01JTl9KU19TQUZFX0lOVDY0LmVxdWFscyhJbnQ2NFRlc3QuTUlOX0pTX1NBRkVfSU5UNjQpKTsKKyAgICBhc3NlcnQub2soCisgICAgICBFWFBFQ1RFRF9NQVhfSlNfU0FGRV9QTFVTX09ORV9JTlQ2NC5lcXVhbHMoCisgICAgICAgIEludDY0VGVzdC5NQVhfSlNfU0FGRV9QTFVTX09ORV9JTlQ2NAorICAgICAgKQorICAgICk7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgRVhQRUNURURfTUlOX0pTX1NBRkVfTUlOVVNfT05FX0lOVDY0LmVxdWFscygKKyAgICAgICAgSW50NjRUZXN0Lk1JTl9KU19TQUZFX01JTlVTX09ORV9JTlQ2NAorICAgICAgKQorICAgICk7CisgICAgYXNzZXJ0Lm9rKEVYUEVDVEVEX01BWF9TSUdORURfSU5UNjQuZXF1YWxzKEludDY0VGVzdC5NQVhfU0lHTkVEX0lOVDY0KSk7CisgICAgYXNzZXJ0Lm9rKEVYUEVDVEVEX01JTl9TSUdORURfSU5UNjQuZXF1YWxzKEludDY0VGVzdC5NSU5fU0lHTkVEX0lOVDY0KSk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgRVhQRUNURURfU01BTExfSU5UNjRfQVNfTlVNQkVSLAorICAgICAgSW50NjRUZXN0LlNNQUxMX0lOVDY0LnRvTnVtYmVyKCkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLAorICAgICAgSW50NjRUZXN0Lk1BWF9KU19TQUZFX0lOVDY0LnRvTnVtYmVyKCkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLAorICAgICAgSW50NjRUZXN0Lk1JTl9KU19TQUZFX0lOVDY0LnRvTnVtYmVyKCkKKyAgICApOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9JTlQ2NF9MSVNULmxlbmd0aDsgKytpKSB7CisgICAgICBhc3NlcnQub2soRVhQRUNURURfSU5UNjRfTElTVFtpXS5lcXVhbHMoSW50NjRUZXN0LklOVDY0X0xJU1RbaV0pKTsKKyAgICB9CisKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IEVYUEVDVEVEX0lOVDY0X0xJU1QubGVuZ3RoOyArK2kpeworICAgICAgbGV0IGludDY0T2JqZWN0ID0gRVhQRUNURURfSU5UNjRfTElTVFtpXTsKKyAgICAgIGFzc2VydC5vayhJbnQ2NFRlc3QuSU5UNjRfMl9JTlQ2NF9NQVBbSlNPTkludDY0LnRvRGVjaW1hbFN0cmluZyhpbnQ2NE9iamVjdCldLmVxdWFscyhpbnQ2NE9iamVjdCkpOworICAgIH0KKworICAgIGNvbnNvbGUubG9nKCdJbnQ2NCB0ZXN0IC0tIGVuZHMnKTsKKyAgfSk7CisKZGlmZiAtLWdpdCBhL2xpYi90cy90ZXN0L3Rlc3QuaHRtbCBiL2xpYi90cy90ZXN0L3Rlc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYzdkN2ViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3RzL3Rlc3QvdGVzdC5odG1sCkBAIC0wLDAgKzEsNTMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CisKKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL2xpYi9JbnQ2NC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy9saWIvSW50NjRVdGlsLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL2xpYi9KU09OSW50NjQuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iYnVpbGQvdHMvdGhyaWZ0LmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKyAgPCEtLSA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4gLS0+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+CisKKyAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC90cy9saWIvdGVzdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD10aHJpZnQuZ2l0O2E9YmxvYjtmPXRlc3QvVGhyaWZ0VGVzdC50aHJpZnQ7aGI9SEVBRCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgorICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgorICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KKyAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PGxpPjwhLS0gZ2V0IHZhbGlkIHhodG1sIHN0cmljdC0tPjwvbGk+PC9vbD4KKyAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBjaGVjayB0aGUgdmFsaWRpdHkuIFRoaXMgc2lnbmlmaWNhbnRseSBzbG93cyBkb3duIHRoZSB0ZXN0LgorICA8cD4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcKKyAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiCisgICAgICAgICAgYWx0PSJWYWxpZCBYSFRNTCAxLjAhIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiIC8+PC9hPgorICA8L3A+CisgIC0tPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL3RzL3Rlc3QvdGVzdC50cyBiL2xpYi90cy90ZXN0L3Rlc3QudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmZGNiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90cy90ZXN0L3Rlc3QudHMKQEAgLTAsMCArMSwzNDIgQEAKK2ltcG9ydCB7IFRocmlmdFRlc3QgfSBmcm9tICIuL2dlbi1qcy9UaHJpZnRUZXN0X3R5cGVzIjsKK2ltcG9ydCAiLi9nZW4tanMvVGhyaWZ0VGVzdCI7CisKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoIm5vZGUtaW50NjQiKTsKK3ZhciBKU09OSW50NjQgPSByZXF1aXJlKCJqc29uLWludDY0Iik7Cit2YXIgUVVuaXQgPSByZXF1aXJlKCIuL3F1bml0Iik7CisKK2NvbnN0IHRyYW5zcG9ydDogVGhyaWZ0LlRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCIvc2VydmljZSIpOworY29uc3QgcHJvdG9jb2w6IFRocmlmdC5Qcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKK2NvbnN0IGNsaWVudDogVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKK2NvbnN0IGludDY0XzJfcG93XzYwOiB0eXBlb2YgSW50NjQgPSBuZXcgSW50NjQoJzEwMDAwMDAwMDAwMDAwMDAnKTsKK2NvbnN0IGludDY0X21pbnVzXzJfcG93XzYwOiB0eXBlb2YgSW50NjQgPSBuZXcgSW50NjQoJ2YwMDAwMDAwMDAwMDAwMDAnKTsKKworLy8gV29yayBhcm91bmQgZm9yIG9sZCBBUEkgdXNlZCBieSBRVW5pdEFkYXB0ZXIgb2YganNUZXN0RHJpdmVyCitpZiAodHlwZW9mIFFVbml0LmxvZyA9PSAnZnVuY3Rpb24nKSB7CisgICAgLy8gV2hlbiB1c2luZyByZWFsIFFVbml0IChmcm9uIFBoYW50b21KUykgbG9nIGZhaWx1cmVzIHRvIGNvbnNvbGUKKyAgICBRVW5pdC5sb2coZnVuY3Rpb24oZGV0YWlscykgeworICAgICAgICBpZiAoIWRldGFpbHMucmVzdWx0KSB7CisgICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PSBGQUlMID09PT09PT09Jyk7CisgICAgICAgIGNvbnNvbGUubG9nKCdUZXN0TmFtZTogJyArIGRldGFpbHMubmFtZSk7CisgICAgICAgIGlmIChkZXRhaWxzLm1lc3NhZ2UpIGNvbnNvbGUubG9nKGRldGFpbHMubWVzc2FnZSk7CisgICAgICAgIGNvbnNvbGUubG9nKCdFeHBlY3RlZDogJyArIEpTT05JbnQ2NC5zdHJpbmdpZnkoZGV0YWlscy5leHBlY3RlZCkpOworICAgICAgICBjb25zb2xlLmxvZygnQWN0dWFsICA6ICcgKyBKU09OSW50NjQuc3RyaW5naWZ5KGRldGFpbHMuYWN0dWFsKSk7CisgICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09Jyk7CisgICAgICAgIH0KKyAgICB9KTsKK30KKworLy8gYWxsIExhbmd1YWdlcyBpbiBVVEYtOAorY29uc3Qgc3RyaW5nVGVzdDogc3RyaW5nID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCisKK2Z1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxOiBPYmplY3QsIG1hcDI6IE9iamVjdCk6IHZvaWQgeworICAgIGlmICh0eXBlb2YgbWFwMSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWFwMiAhPT0gJ2Z1bmN0aW9uJykgeworICAgICAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICdvYmplY3QnKSB7CisgICAgICAgICAgICBhc3NlcnQuZXF1YWwobWFwMSwgbWFwMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gbWFwMSkgeworICAgICAgICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCitRVW5pdC5tb2R1bGUoJ0Jhc2UgVHlwZXMnKTsKKworICAgIFFVbml0LnRlc3QoJ1ZvaWQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOworICAgIH0pOworICAgIFFVbml0LnRlc3QoJ0JpbmFyeSAoU3RyaW5nKScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgICBsZXQgYmluYXJ5OiBzdHJpbmcgPSAnJzsKKyAgICAgICAgZm9yIChsZXQgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgICAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpOworICAgICAgICB9CisgICAgICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEJpbmFyeShiaW5hcnkpLCBiaW5hcnkpOworICAgIH0pOworICAgIFFVbml0LnRlc3QoJ0JpbmFyeSAoVWludDhBcnJheSknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgICAgbGV0IGJpbmFyeTogc3RyaW5nID0gJyc7CisgICAgICAgIGZvciAobGV0IHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgICAgICAgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBhcnI6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnkubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGFycltpXSA9IGJpbmFyeVtpXS5jaGFyQ29kZUF0KDApOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGhleEVuY29kZWRTdHJpbmcgPSBBcnJheS5mcm9tKGFyciwgZnVuY3Rpb24oYnl0ZSkgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSk7CisgICAgICAgIH0pLmpvaW4oJycpCisgICAgICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEJpbmFyeShoZXhFbmNvZGVkU3RyaW5nKSwgYmluYXJ5KTsKKyAgICB9KTsKKyAgICBRVW5pdC50ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpOworICAgICAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCksIHN0cmluZ1Rlc3QpOworCisgICAgICAgIGNvbnN0IHNwZWNpYWxDaGFyYWN0ZXJzOiBzdHJpbmcgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAgICAgICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKworICAgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICAgICAgICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JzsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKSwgc3BlY2lhbENoYXJhY3RlcnMpOworICAgIH0pOworICAgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMCksIDApOworICAgICAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoLTEpLCAtMSk7CisgICAgICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdERvdWJsZSgzLjE0KSwgMy4xNCk7CisgICAgICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLCA2MCkpLCBNYXRoLnBvdygyLCA2MCkpOworICAgIH0pOworICAgIFFVbml0LnRlc3QoJ0J5dGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgwKSwgMCk7CisgICAgICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEJ5dGUoMHgwMSksIDB4MDEpOworICAgIH0pOworICAgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RJMzIoMCksIDApOworICAgICAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApKSwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STMyKC1NYXRoLnBvdygyLCAzMCkpLCAtTWF0aC5wb3coMiwgMzApKTsKKyAgICB9KTsKKyAgICBRVW5pdC50ZXN0KCdJNjQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KG5ldyBJbnQ2NCgwKSksIDApOworCisgICAgICAgIGxldCBpbnQ2NF8yX3Bvd182MF9yZXN1bHQ6IHR5cGVvZiBJbnQ2NCA9IGNsaWVudC50ZXN0STY0KGludDY0XzJfcG93XzYwKTsKKyAgICAgICAgYXNzZXJ0Lm9rKGludDY0XzJfcG93XzYwLmVxdWFscyhpbnQ2NF8yX3Bvd182MF9yZXN1bHQpKTsKKworICAgICAgICBsZXQgaW50NjRfbWludXNfMl9wb3dfNjBfcmVzdWx0OiB0eXBlb2YgSW50NjQgPSBjbGllbnQudGVzdEk2NChpbnQ2NF9taW51c18yX3Bvd182MCk7CisgICAgICAgIGFzc2VydC5vayhpbnQ2NF9taW51c18yX3Bvd182MC5lcXVhbHMoaW50NjRfbWludXNfMl9wb3dfNjBfcmVzdWx0KSk7CisgICAgfSk7CisKKworUVVuaXQubW9kdWxlKCdTdHJ1Y3R1cmVkIFR5cGVzJyk7CisKKyAgICBRVW5pdC50ZXN0KCdTdHJ1Y3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgICAgY29uc3Qgc3RydWN0VGVzdElucHV0OiBUaHJpZnRUZXN0Llh0cnVjdCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICAgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IGludDY0XzJfcG93XzYwOworCisgICAgICAgIGNvbnN0IHN0cnVjdFRlc3RPdXRwdXQ6IFRocmlmdFRlc3QuWHRydWN0ID0gY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKKworICAgICAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgICAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICAgIGFzc2VydC5vayhzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZy5lcXVhbHMoc3RydWN0VGVzdElucHV0Lmk2NF90aGluZykpOworICAgICAgICBhc3NlcnQub2soc3RydWN0VGVzdElucHV0Lmk2NF90aGluZy5lcXVhbHMoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcpKTsKKworICAgICAgICBhc3NlcnQuZXF1YWwoSlNPTkludDY0LnN0cmluZ2lmeShzdHJ1Y3RUZXN0T3V0cHV0KSwgSlNPTkludDY0LnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKKyAgICB9KTsKKworICAgIFFVbml0LnRlc3QoJ05lc3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgICAgY29uc3QgeHRyVGVzdElucHV0OiBUaHJpZnRUZXN0Llh0cnVjdCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgICB4dHJUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgICAgIHh0clRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICAgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IGludDY0XzJfcG93XzYwOworCisgICAgICAgIGNvbnN0IG5lc3RUZXN0SW5wdXQ6IFRocmlmdFRlc3QuWHRydWN0MiA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKKyAgICAgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICAgICAgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcgPSB4dHJUZXN0SW5wdXQ7CisgICAgICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMTUpOworCisgICAgICAgIGNvbnN0IG5lc3RUZXN0T3V0cHV0OiBUaHJpZnRUZXN0Llh0cnVjdDIgPSBjbGllbnQudGVzdE5lc3QobmVzdFRlc3RJbnB1dCk7CisKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICAgIGFzc2VydC5lcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOworICAgICAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcpOworICAgICAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICAgICAgYXNzZXJ0Lm9rKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcuZXF1YWxzKG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZykpOworICAgICAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisKKyAgICAgICAgYXNzZXJ0LmVxdWFsKEpTT05JbnQ2NC5zdHJpbmdpZnkobmVzdFRlc3RPdXRwdXQpLCBKU09OSW50NjQuc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICB9KTsKKyAgICAKKyAgICBRVW5pdC50ZXN0KCdNYXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgICAgY29uc3QgbWFwVGVzdElucHV0OiB7W2s6IG51bWJlcl06IG51bWJlcjt9ID0gezc6IDc3LCA4OiA4OCwgOTogOTl9OworICAgIAorICAgICAgICBjb25zdCBtYXBUZXN0T3V0cHV0OiB7W2s6IG51bWJlcl06IG51bWJlcjt9ID0gY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KTsKKyAgICAKKyAgICAgICAgZm9yIChsZXQga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKKyAgICAgICAgICAgIGFzc2VydC5lcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIAorICAgIFFVbml0LnRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgICBjb25zdCBtYXBUZXN0SW5wdXQ6IHtbazogc3RyaW5nXTogc3RyaW5nO30gPSB7CisgICAgICAgICAgICAnYSc6ICcxMjMnLCAnYSBiJzogJ3dpdGggc3BhY2VzICcsICdzYW1lJzogJ3NhbWUnLCAnMCc6ICdudW1lcmljIGtleScsCisgICAgICAgICAgICAnbG9uZ1ZhbHVlJzogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogJ2xvbmcga2V5JworICAgICAgICB9OworICAgIAorICAgICAgICBjb25zdCBtYXBUZXN0T3V0cHV0OiB7W2s6IHN0cmluZ106IHN0cmluZzt9ID0gY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KTsKKyAgICAKKyAgICAgICAgZm9yIChsZXQga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKKyAgICAgICAgICAgIGFzc2VydC5lcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIAorICAgIFFVbml0LnRlc3QoJ1NldCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgICBjb25zdCBzZXRUZXN0SW5wdXQ6IG51bWJlcltdID0gWzEsIDIsIDNdOworICAgICAgICBhc3NlcnQub2soY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0KSwgc2V0VGVzdElucHV0KTsKKyAgICB9KTsKKyAgICAKKyAgICBRVW5pdC50ZXN0KCdMaXN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICAgIGNvbnN0IGxpc3RUZXN0SW5wdXQ6IG51bWJlcltdID0gWzEsIDIsIDNdOworICAgICAgICBhc3NlcnQub2soY2xpZW50LnRlc3RMaXN0KGxpc3RUZXN0SW5wdXQpLCBsaXN0VGVzdElucHV0KTsKKyAgICB9KTsKKyAgICAKKyAgICBRVW5pdC50ZXN0KCdFbnVtJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgIH0pOworICAgIAorICAgIFFVbml0LnRlc3QoJ1R5cGVEZWYnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0VHlwZWRlZihuZXcgSW50NjQoNjkpKSwgNjkpOworICAgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnZGVlcGVyIScpOworCisgICAgUVVuaXQudGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICAgIGNvbnN0IG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdDoge1tLOiBudW1iZXJdOiB7W2s6IG51bWJlcl06IG51bWJlcn19ID0geworICAgICAgICAgICAgJzQnOiB7JzEnOiAxLCAnMic6IDIsICczJzogMywgJzQnOiA0fSwKKyAgICAgICAgICAgICctNCc6IHsnLTQnOiAtNCwgJy0zJzogLTMsICctMic6IC0yLCAnLTEnOiAtMX0KKyAgICAgICAgfTsKKyAgICAKKyAgICAgICAgY29uc3QgbWFwTWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworICAgIAorICAgIAorICAgICAgICBmb3IgKGxldCBrZXkgaW4gbWFwTWFwVGVzdE91dHB1dCkgeworICAgICAgICAgICAgZm9yIChsZXQga2V5MiBpbiBtYXBNYXBUZXN0T3V0cHV0W2tleV0pIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQuZXF1YWwobWFwTWFwVGVzdE91dHB1dFtrZXldW2tleTJdLCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHRba2V5XVtrZXkyXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcE1hcFRlc3RPdXRwdXQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CisgICAgfSk7CisKKworUVVuaXQubW9kdWxlKCdFeGNlcHRpb24nKTsKKworICAgIFFVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOworICAgICAgICAgICAgYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICAgICAgfWNhdGNoIChlKSB7CisgICAgICAgICAgICBhc3NlcnQuZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOworICAgICAgICAgICAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICAgICAgICBkb25lKCk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgCisgICAgUVVuaXQudGVzdCgnbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJyk7CisgICAgICAgICAgICBhc3NlcnQub2sodHJ1ZSk7CisgICAgICAgIH1jYXRjaCAoZSkgeworICAgICAgICAgICAgYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0pOworICAKKyAgICBRVW5pdC50ZXN0KCdURXhjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICAgIC8vVGhyaWZ0VGVzdCBkb2VzIG5vdCBsaXN0IFRFeGNlcHRpb24gYXMgYSBsZWdhbCBleGNlcHRpb24gc28gaXQgd2lsbAorICAgICAgICAvLyBnZW5lcmF0ZSBhbiBleGNlcHRpb24gb24gdGhlIHNlcnZlciB0aGF0IGRvZXMgbm90IHByb3BhZ2F0ZSBiYWNrIHRvCisgICAgICAgIC8vIHRoZSBjbGllbnQuIFRoaXMgdGVzdCBoYXMgYmVlbiBtb2RpZmllZCB0byBlcXVhdGUgdG8gIm5vIGV4Y2VwdGlvbiIKKyAgICAgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJyk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIC8vYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQub2sodHJ1ZSk7CisgICAgfSk7CisKKworUVVuaXQubW9kdWxlKCdJbnNhbml0eScpOworCisgICAgY29uc3QgY3Jhenk6IFRocmlmdFRlc3QuSW5zYW5pdHkgPSB7CisgICAgICAgICd1c2VyTWFwJzogeyAnNSc6IG5ldyBJbnQ2NCg1KSwgJzgnOiBuZXcgSW50NjQoOCkgfSwKKyAgICAgICAgJ3h0cnVjdHMnOiBbeworICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICAgICAgICdpNjRfdGhpbmcnOiBuZXcgSW50NjQoNCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAgICAgICAnaTY0X3RoaW5nJzogbmV3IEludDY0KDIpCisgICAgICAgIH1dCisgICAgfTsKKyAgICBRVW5pdC50ZXN0KCd0ZXN0SW5zYW5pdHknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgICAgY29uc3QgaW5zYW5pdHk6IHtbazogbnVtYmVyXTogKFRocmlmdFRlc3QuSW5zYW5pdHkgfCB7W2s6bnVtYmVyXTogVGhyaWZ0VGVzdC5JbnNhbml0eX0pfSA9IHsKKyAgICAgICAgICAgICcxJzogeworICAgICAgICAgICAgICAgICcyJzogY3JhenksCisgICAgICAgICAgICAgICAgJzMnOiBjcmF6eQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICcyJzogeyAnNic6IG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCkgfQorICAgICAgICB9OworICAgICAgICBjb25zdCByZXMgPSBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KGNyYXp5KSk7CisgICAgICAgIGFzc2VydC5vayhyZXMsIEpTT05JbnQ2NC5zdHJpbmdpZnkocmVzKSk7CisgICAgICAgIGFzc2VydC5vayhpbnNhbml0eSwgSlNPTkludDY0LnN0cmluZ2lmeShpbnNhbml0eSkpOworICAgIAorICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzLCBpbnNhbml0eSk7CisgICAgfSk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy9SdW4gc2FtZSB0ZXN0cyBhc3luY2hyb25vdXNseQorCitRVW5pdC5tb2R1bGUoJ0FzeW5jJyk7CisKKyAgICBRVW5pdC50ZXN0KCdEb3VibGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKworICAgICAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQxNTkyNjUsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMy4xNDE1OTI2NSk7CisgICAgICAgICAgICBkb25lKCk7CisgICAgICAgIH0pOworICAgIH0pOworCisgICAgUVVuaXQudGVzdCgnQnl0ZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgICBhc3NlcnQuZXhwZWN0KDEpOworCisgICAgICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICAgICAgY2xpZW50LnRlc3RCeXRlKDB4MDEsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMHgwMSk7CisgICAgICAgICAgICBkb25lKCk7CisgICAgICAgIH0pOworICAgIH0pOworCisgICAgUVVuaXQudGVzdCgnSTMyJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICAgIGFzc2VydC5leHBlY3QoMik7CisKKyAgICAgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKKyAgICAgICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDMwKSk7CisgICAgICAgICAgICBkb25lKCk7CisgICAgICAgIH0pOworCisgICAgICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KC0yLCAzMSksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDMxKSk7CisgICAgICAgICAgICBkb25lKCk7CisgICAgICAgIH0pOworICAgIH0pOworCisgICAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICAgIGFzc2VydC5leHBlY3QoMik7CisKKyAgICAgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKKyAgICAgICAgY2xpZW50LnRlc3RJNjQoaW50NjRfMl9wb3dfNjAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgICAgICAgYXNzZXJ0Lm9rKGludDY0XzJfcG93XzYwLmVxdWFscyhyZXN1bHQpKTsKKyAgICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgY2xpZW50LnRlc3RJNjQoaW50NjRfbWludXNfMl9wb3dfNjAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgICAgICAgYXNzZXJ0Lm9rKGludDY0X21pbnVzXzJfcG93XzYwLmVxdWFscyhyZXN1bHQpKTsKKyAgICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgfSk7CisgICAgfSk7CmRpZmYgLS1naXQgYS9saWIvdHMvdGVzdC90ZXN0X2hhbmRsZXIuanMgYi9saWIvdHMvdGVzdC90ZXN0X2hhbmRsZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhMjk2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90cy90ZXN0L3Rlc3RfaGFuZGxlci5qcwpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL1RoaXMgaXMgdGhlIHNlcnZlciBzaWRlIE5vZGUgdGVzdCBoYW5kbGVyIGZvciB0aGUgc3RhbmRhcmQKKy8vICBBcGFjaGUgVGhyaWZ0IHRlc3Qgc2VydmljZS4KKworY29uc3QgZXM2TW9kZSA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1lczYnKTsKK2NvbnN0IGdlbkZvbGRlciA9IGVzNk1vZGUgPyAnZ2VuLW5vZGVqcy1lczYnIDogJ2dlbi1ub2RlanMnOworY29uc3QgdHR5cGVzID0gcmVxdWlyZShgLi8ke2dlbkZvbGRlcn0vVGhyaWZ0VGVzdF90eXBlc2ApOworY29uc3QgVEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4uLy4uL25vZGVqcy9saWIvdGhyaWZ0JykuVEV4Y2VwdGlvbjsKK2NvbnN0IEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOworCitleHBvcnRzLlRocmlmdFRlc3RIYW5kbGVyID0geworICB0ZXN0Vm9pZDogZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RWb2lkKCknKTsKKyAgICByZXN1bHQobnVsbCk7CisgIH0sCisgIHRlc3RTdHJpbmc6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZyhcJycgKyB0aGluZyArICdcJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0Qnl0ZTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0Qnl0ZSgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RJMzI6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEkzMignICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RJNjQ6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEk2NCgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3REb3VibGU6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdERvdWJsZSgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RCaW5hcnk6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEJpbmFyeShcJycgKyB0aGluZyArICdcJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0U3RydWN0OiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RTdHJ1Y3QoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdE5lc3Q6IGZ1bmN0aW9uKG5lc3QsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TmVzdCgnKTsKKyAgICBjb25zb2xlLmxvZyhuZXN0KTsKKyAgICBjb25zb2xlLmxvZygnKScpOworICAgIHJlc3VsdChudWxsLCBuZXN0KTsKKyAgfSwKKyAgdGVzdE1hcDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TWFwKCcpOworICAgIGNvbnNvbGUubG9nKHRoaW5nKTsKKyAgICBjb25zb2xlLmxvZygnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RTdHJpbmdNYXA6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZ01hcCgnKTsKKyAgICBjb25zb2xlLmxvZyh0aGluZyk7CisgICAgY29uc29sZS5sb2coJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0U2V0OiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RTZXQoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdExpc3Q6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdExpc3QoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdEVudW06IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEVudW0oJyArIHRoaW5nICsgJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0VHlwZWRlZjogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0VHlwZWRlZignICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RNYXBNYXA6IGZ1bmN0aW9uKGhlbGxvLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdE1hcE1hcCgnICsgaGVsbG8gKyAnKScpOworCisgICAgY29uc3QgbWFwbWFwID0gW107CisgICAgY29uc3QgcG9zID0gW107CisgICAgY29uc3QgbmVnID0gW107CisgICAgZm9yIChsZXQgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgIHBvc1tpXSA9IGk7CisgICAgICBuZWdbLWldID0gLWk7CisgICAgfQorICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgcmVzdWx0KG51bGwsIG1hcG1hcCk7CisgIH0sCisgIHRlc3RJbnNhbml0eTogZnVuY3Rpb24oYXJndW1lbnQsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0SW5zYW5pdHkoJyk7CisgICAgY29uc29sZS5sb2coYXJndW1lbnQpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisKKyAgICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7CisgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7CisgICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKKyAgICBoZWxsby5pNjRfdGhpbmcgPSBuZXcgSW50NjQoMik7CisKKyAgICBjb25zdCBnb29kYnllID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICdHb29kYnllNCc7CisgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKKyAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7CisgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSBuZXcgSW50NjQoNCk7CisKKyAgICBjb25zdCBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgICBjcmF6eS51c2VyTWFwID0gW107CisgICAgY3JhenkudXNlck1hcFt0dHlwZXMuTnVtYmVyei5FSUdIVF0gPSA4OworICAgIGNyYXp5LnVzZXJNYXBbdHR5cGVzLk51bWJlcnouRklWRV0gPSA1OworICAgIGNyYXp5Lnh0cnVjdHMgPSBbZ29vZGJ5ZSwgaGVsbG9dOworCisgICAgY29uc3QgZmlyc3RfbWFwID0gW107CisgICAgY29uc3Qgc2Vjb25kX21hcCA9IFtdOworCisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRXT10gPSBjcmF6eTsKKyAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVEhSRUVdID0gY3Jhenk7CisKKyAgICBjb25zdCBsb29uZXkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CisgICAgc2Vjb25kX21hcFt0dHlwZXMuTnVtYmVyei5TSVhdID0gbG9vbmV5OworCisgICAgY29uc3QgaW5zYW5lID0gW107CisgICAgaW5zYW5lWzFdID0gZmlyc3RfbWFwOworICAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CisKKyAgICBjb25zb2xlLmxvZygnaW5zYW5lIHJlc3VsdDonKTsKKyAgICBjb25zb2xlLmxvZyhpbnNhbmUpOworICAgIHJlc3VsdChudWxsLCBpbnNhbmUpOworICB9LAorICB0ZXN0TXVsdGk6IGZ1bmN0aW9uKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TXVsdGkoKScpOworCisgICAgY29uc3QgaGVsbG8gPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICdIZWxsbzInOworICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSBhcmcwOworICAgIGhlbGxvLmkzMl90aGluZyA9IGFyZzE7CisgICAgaGVsbG8uaTY0X3RoaW5nID0gYXJnMjsKKyAgICByZXN1bHQobnVsbCwgaGVsbG8pOworICB9LAorICB0ZXN0RXhjZXB0aW9uOiBmdW5jdGlvbihhcmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0RXhjZXB0aW9uKCcgKyBhcmcgKyAnKScpOworICAgIGlmIChhcmcgPT09ICdYY2VwdGlvbicpIHsKKyAgICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CisgICAgICByZXN1bHQoeCk7CisgICAgfSBlbHNlIGlmIChhcmcgPT09ICdURXhjZXB0aW9uJykgeworICAgICAgcmVzdWx0KG5ldyBURXhjZXB0aW9uKGFyZykpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQobnVsbCk7CisgICAgfQorICB9LAorICB0ZXN0TXVsdGlFeGNlcHRpb246IGZ1bmN0aW9uKGFyZzAsIGFyZzEsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TXVsdGlFeGNlcHRpb24oJyArIGFyZzAgKyAnLCAnICsgYXJnMSArICcpJyk7CisgICAgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24nKSkgeworICAgICAgY29uc3QgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIHgubWVzc2FnZSA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uJzsKKyAgICAgIHJlc3VsdCh4KTsKKyAgICB9IGVsc2UgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24yJykpIHsKKyAgICAgIGNvbnN0IHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKKyAgICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMic7CisgICAgICByZXN1bHQoeDIpOworICAgIH0KKworICAgIGNvbnN0IHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgcmVzLnN0cmluZ190aGluZyA9IGFyZzE7CisgICAgcmVzdWx0KG51bGwsIHJlcyk7CisgIH0sCisgIHRlc3RPbmV3YXk6IGZ1bmN0aW9uKHNsZWVwRm9yLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdE9uZXdheSgnICsgc2xlZXBGb3IgKyAnKSA9PiBKYXZhU2NyaXB0IChsaWtlIFJ1c3QpIG5ldmVyIHNsZWVwcyEnKTsKKyAgfQorfTsgICAvL1RocmlmdFRlc3RTdmNIYW5kbGVyCmRpZmYgLS1naXQgYS9saWIvdHMvdGhyaWZ0LmQudHMgYi9saWIvdHMvdGhyaWZ0LmQudHMKaW5kZXggN2M1YjllNC4uMGJhNDZjOSAxMDA2NDQKLS0tIGEvbGliL3RzL3RocmlmdC5kLnRzCisrKyBiL2xpYi90cy90aHJpZnQuZC50cwpAQCAtMzA0LDcgKzMwNCw3IEBACiAgICAgICovCiAgICAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpOwogCi0gICAgX19yZXNldCh1cmwpOiB2b2lkOworICAgIF9fcmVzZXQodXJsOiBzdHJpbmcpOiB2b2lkOwogCiAgICAgLyoqCiAgICAgICogU2VuZHMgdGhlIGN1cnJlbnQgV1MgcmVxdWVzdCBhbmQgcmVnaXN0ZXJzIGNhbGxiYWNrLiBUaGUgYXN5bmMgCkBAIC02OTQsNiArNjk0LDYgQEAKICAgICAgKiBAcGFyYW0ge1RocmlmdC5TZXJ2aWNlQ2xpZW50fSBTQ2wgLSBUaGUgU2VydmljZSBDbGllbnQgQ2xhc3MuCiAgICAgICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFuc3BvcnQgLSBUaHJpZnQuVHJhbnNwb3J0IGluc3RhbmNlIHdoaWNoIHByb3ZpZGVzIHJlbW90ZSBob3N0OnBvcnQuCiAgICAgICovCi0gICAgY3JlYXRlQ2xpZW50KHNlcnZpY2VOYW1lOiBzdHJpbmcsIFNDbDogYW55LCB0cmFuc3BvcnQ6IE9iamVjdCk7CisgICAgY3JlYXRlQ2xpZW50KHNlcnZpY2VOYW1lOiBzdHJpbmcsIFNDbDogYW55LCB0cmFuc3BvcnQ6IE9iamVjdCk6IGFueTsKICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2xpYi90cy90c2NvbmZpZy5qc29uIGIvbGliL3RzL3RzY29uZmlnLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmYTIyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90cy90c2NvbmZpZy5qc29uCkBAIC0wLDAgKzEsMzEgQEAKK3sKKyAgICAiY29tcGlsZXJPcHRpb25zIjogeworICAgICAgICAiYWxsb3dKcyI6IGZhbHNlLAorICAgICAgICAiYWx3YXlzU3RyaWN0IjogdHJ1ZSwKKyAgICAgICAgImJhc2VVcmwiOiAiLiIsCisgICAgICAgICJkZWNsYXJhdGlvbiI6IHRydWUsCisgICAgICAgICJlbWl0RGVjb3JhdG9yTWV0YWRhdGEiOiB0cnVlLAorICAgICAgICAiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyI6IHRydWUsCisgICAgICAgICJtb2R1bGUiOiAiY29tbW9uanMiLAorICAgICAgICAibW9kdWxlUmVzb2x1dGlvbiI6ICJub2RlIiwKKyAgICAgICAgIm5vSW1wbGljaXRUaGlzIjogdHJ1ZSwKKyAgICAgICAgIm5vVW51c2VkTG9jYWxzIjogdHJ1ZSwKKyAgICAgICAgInByZXNlcnZlQ29uc3RFbnVtcyI6IHRydWUsCisgICAgICAgICJyZW1vdmVDb21tZW50cyI6IHRydWUsCisgICAgICAgICJzdHJpY3RGdW5jdGlvblR5cGVzIjogdHJ1ZSwKKyAgICAgICAgInN0cmljdE51bGxDaGVja3MiOiB0cnVlLAorICAgICAgICAidGFyZ2V0IjogImVzNiIsCisgICAgICAgICJwYXRocyI6IHsKKyAgICAgICAgICAgICIqIjogWworICAgICAgICAgICAgICAgICIqIiwKKyAgICAgICAgICAgICAgICAidGVzdC8iLAorICAgICAgICAgICAgICAgICJ0ZXN0L2dlbi1qcy8qIgorCisgICAgICAgICAgICBdCisgICAgICAgIH0sCisgICAgfSwKKyAgICAiZXhjbHVkZSI6IFsKKyAgICAgICAgIi4vdGVzdC9nZW4tbm9kZWpzLyIsCisgICAgICAgICIuL3Rlc3QvYnVpbGQvIiwKKyAgICBdCit9CmRpZmYgLS1naXQgYS9saWIveG1sL01ha2VmaWxlLmFtIGIvbGliL3htbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2FkNmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3htbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9CisKK2lmIFdJVEhfSkFWQQorIyBTY2hlbWEgdmFsaWRhdGlvbiB0ZXN0IGRlcGVuZHMgb24gamF2YQorU1VCRElSUyArPSB0ZXN0CitlbmRpZgorCitFWFRSQV9ESVNUID0gXAorICB0aHJpZnQtaWRsLnhzZCBcCisgIHRlc3QKZGlmZiAtLWdpdCBhL2xpYi94bWwvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi94bWwvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjg3YTUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3htbC90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitjaGVjazoKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHRlc3QKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgorY2xlYW4tbG9jYWw6CisJQU5UPSQoQU5UKSA7IGlmIHRlc3QgLXogIiQkQU5UIiA7IHRoZW4gQU5UPTogOyBmaSA7IFwKKwkkJEFOVCAkKEFOVF9GTEFHUykgY2xlYW4KZGlmZiAtLWdpdCBhL2xpYi94bWwvdGVzdC9idWlsZC54bWwgYi9saWIveG1sL3Rlc3QvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZTk1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveG1sL3Rlc3QvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTEyIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iWE1MIFNjaGVtYSBUZXN0IiBkZWZhdWx0PSJ0ZXN0IiBiYXNlZGlyPSIuIj4KKworICA8ZGVzY3JpcHRpb24+WE1MIFNjaGVtYSBWYWxpZGF0aW9uIFRlc3Q8L2Rlc2NyaXB0aW9uPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJ4bWwuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Imdlbi54bWwuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi9nZW4teG1sIiAvPgorICA8cHJvcGVydHkgbmFtZT0iaWRsLnhtbC5zY2hlbWEiIGxvY2F0aW9uPSIke3htbC5kaXJ9L3RocmlmdC1pZGwueHNkIiAvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuZGlyIiBsb2NhdGlvbj0iLi4vLi4vLi4vIiAvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnRlc3QuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS90ZXN0IiAvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmNvbXBpbGVyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS9jb21waWxlci9jcHAvdGhyaWZ0IiAvPgorCisgIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJjb21waWxlci5jaGVjayI+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIxIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGlkPSJmcyIgZmlsZT0iJHt0aHJpZnQuY29tcGlsZXJ9Ii8+CisgICAgICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgICAgVGhyaWZ0IGNvbXBpbGVyIGlzIG1pc3NpbmcgIQorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJjb21waWxlci5jaGVjaywgbWtkaXJzIj4KKyAgICA8dHN0YW1wIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibWtkaXJzIj4KKyAgICA8bWtkaXIgZGlyPSIke2dlbi54bWwuZGlyfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9UaHJpZnRUZXN0LnRocmlmdCIvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L0luY2x1ZGUudGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vUmVjdXJzaXZlLnRocmlmdCIvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L01hbnlPcHRpb25hbHMudGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vQ29uc3RhbnRzRGVtby50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9UeXBlZGVmVGVzdC50aHJpZnQiIC8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vQW5ub3RhdGlvblRlc3QudGhyaWZ0IiAvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L0RvY1Rlc3QudGhyaWZ0IiAvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L0VudW1UZXN0LnRocmlmdCIgLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9NYW55VHlwZWRlZnMudGhyaWZ0IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJydW4gc2NoZW1hIHZhbGlkYXRpb24iCisgICAgICAgICAgZGVwZW5kcz0idmFsaWRhdGUtZ2VuZXJhdGVkLXhtbCIvPgorICAgIAorICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlLWdlbmVyYXRlZC14bWwiIGRlcGVuZHM9ImluaXQsIGdlbmVyYXRlIj4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L1RocmlmdFRlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9JbmNsdWRlLnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vUmVjdXJzaXZlLnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vTWFueU9wdGlvbmFscy54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L09wdGlvbmFsUmVxdWlyZWRUZXN0LnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vQ29uc3RhbnRzRGVtby54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L1R5cGVkZWZUZXN0LnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vQW5ub3RhdGlvblRlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9Eb2NUZXN0LnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vRW51bVRlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9NYW55VHlwZWRlZnMueG1sIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7Z2VuLnhtbC5kaXJ9IiAvPgorICA8L3RhcmdldD4KKworICA8bWFjcm9kZWYgbmFtZT0iZ2VuZXJhdGUteG1sIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIC8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgPGFyZyBsaW5lPSItZ2VuIHhtbDptZXJnZSIvPgorICAgICAgICA8YXJnIGxpbmU9Ii1vdXQgJHtnZW4ueG1sLmRpcn0iLz4KKyAgICAgICAgPGFyZyBsaW5lPSJAe2ZpbGV9Ii8+CisgICAgICA8L2V4ZWM+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCisgIDxtYWNyb2RlZiBuYW1lPSJ2YWxpZGF0ZS14bWwiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxlY2hvIG1lc3NhZ2U9InZhbGlkYXRpbmcgZ2VuZXJhdGVkIFhNTDogQHtmaWxlfSIgLz4KKyAgICAgIDxzY2hlbWF2YWxpZGF0ZSBmaWxlPSJAe2ZpbGV9Ij4KKyAgICAgICAgPHNjaGVtYSBuYW1lc3BhY2U9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvaWRsIiAKKyAgICAgICAgICAgICAgICBmaWxlPSIke2lkbC54bWwuc2NoZW1hfSIgLz4KKyAgICAgIDwvc2NoZW1hdmFsaWRhdGU+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIveG1sL3RocmlmdC1pZGwueHNkIGIvbGliL3htbC90aHJpZnQtaWRsLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWRkNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3htbC90aHJpZnQtaWRsLnhzZApAQCAtMCwwICsxLDI4MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvaWRsIiAKKyAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcveG1sL2lkbCIgCisgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKworICA8ZWxlbWVudCBuYW1lPSJpZGwiIHR5cGU9InRuczpJREwiIC8+CisgIDxlbGVtZW50IG5hbWU9ImRvY3VtZW50IiB0eXBlPSJ0bnM6RG9jdW1lbnQiIC8+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IklETCI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgcmVmPSJ0bnM6ZG9jdW1lbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3NlcXVlbmNlPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJEb2N1bWVudCI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0iaW5jbHVkZSIgdHlwZT0idG5zOkluY2x1ZGUiIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0idG5zOk5hbWVzcGFjZSIgLz4KKyAgICAgIDwvY2hvaWNlPgorICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uIiB0eXBlPSJ0bnM6RXhjZXB0aW9uIiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0eXBlZGVmIiB0eXBlPSJ0bnM6VHlwZWRlZiIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0ic2VydmljZSIgdHlwZT0idG5zOlNlcnZpY2UiIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9InN0cnVjdCIgdHlwZT0idG5zOlN0cnVjdCIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0iY29uc3QiIHR5cGU9InRuczpDb25zdCIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0idW5pb24iIHR5cGU9InRuczpVbmlvbiIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0iZW51bSIgdHlwZT0idG5zOkVudW0iIC8+CisgICAgICA8L2Nob2ljZT4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iSW5jbHVkZSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVzcGFjZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxncm91cCBuYW1lPSJBYnN0cmFjdFN0cnVjdCI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9InRuczpGaWVsZCIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICA8L3NlcXVlbmNlPgorICA8L2dyb3VwPgorCisgIDxhdHRyaWJ1dGVHcm91cCBuYW1lPSJTdHJ1Y3RBdHRyaWJ1dGVzIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICA8L2F0dHJpYnV0ZUdyb3VwPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJFeGNlcHRpb24iPgorICAgIDxncm91cCByZWY9InRuczpBYnN0cmFjdFN0cnVjdCIgLz4KKyAgICA8YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6U3RydWN0QXR0cmlidXRlcyIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iU2VydmljZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0ibWV0aG9kIiB0eXBlPSJ0bnM6TWV0aG9kIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InBhcmVudC1tb2R1bGUiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InBhcmVudC1pZCIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPiAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJNZXRob2QiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9InJldHVybnMiIHR5cGU9InRuczpUaHJpZnRUeXBlIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iYXJnIiB0eXBlPSJ0bnM6RmllbGQiIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9InRocm93cyIgdHlwZT0idG5zOkZpZWxkIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJvbmV3YXkiIHR5cGU9ImJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iVHlwZWRlZiI+CisgICAgPGNvbXBsZXhDb250ZW50PgorICAgICAgPGV4dGVuc2lvbiBiYXNlPSJ0bnM6VGhyaWZ0VHlwZSI+CisgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgICAgICA8L2V4dGVuc2lvbj4KKyAgICA8L2NvbXBsZXhDb250ZW50PgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJTdHJ1Y3QiPgorICAgIDxncm91cCByZWY9InRuczpBYnN0cmFjdFN0cnVjdCIgLz4KKyAgICA8YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6U3RydWN0QXR0cmlidXRlcyIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iVW5pb24iPgorICAgIDxncm91cCByZWY9InRuczpBYnN0cmFjdFN0cnVjdCIgLz4KKyAgICA8YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6U3RydWN0QXR0cmlidXRlcyIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iRW51bSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0ibWVtYmVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiIC8+CisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHBsaWNpdCIgdHlwZT0iYm9vbGVhbiIgLz4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiAvPgorICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgPC9lbGVtZW50PgorICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJGaWVsZCI+CisgICAgPGNvbXBsZXhDb250ZW50PgorICAgICAgPGV4dGVuc2lvbiBiYXNlPSJ0bnM6VGhyaWZ0VHlwZSI+CisgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJkZWZhdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+CisgICAgICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgIDxncm91cCByZWY9InRuczpDb25zdFZhbHVlIiAvPgorICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICAgICAgICA8L2VsZW1lbnQ+CisgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmllbGQtaWQiIHR5cGU9ImxvbmciIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ0bnM6UmVxdWlyZWRuZXNzIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiAvPgorICAgICAgPC9leHRlbnNpb24+CisgICAgPC9jb21wbGV4Q29udGVudD4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8c2ltcGxlVHlwZSBuYW1lPSJSZXF1aXJlZG5lc3MiPgorICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJyZXF1aXJlZCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ib3B0aW9uYWwiIC8+CisgICAgPC9yZXN0cmljdGlvbj4KKyAgPC9zaW1wbGVUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJBbm5vdGF0aW9uIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImtleSIgdHlwZT0ic3RyaW5nIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iQ29uc3QiPgorICAgIDxjb21wbGV4Q29udGVudD4KKyAgICAgIDxleHRlbnNpb24gYmFzZT0idG5zOlRocmlmdFR5cGUiPgorICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgPGdyb3VwIHJlZj0idG5zOkNvbnN0VmFsdWUiIC8+CisgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiAvPgorICAgICAgPC9leHRlbnNpb24+CisgICAgPC9jb21wbGV4Q29udGVudD4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iQ29uc3RMaXN0Ij4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJlbnRyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICA8Z3JvdXAgcmVmPSJ0bnM6Q29uc3RWYWx1ZSIgLz4KKyAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICAgIDwvZWxlbWVudD4KKyAgICA8L3NlcXVlbmNlPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJDb25zdE1hcCI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZW50cnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ia2V5Ij4KKyAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgIDxncm91cCByZWY9InRuczpDb25zdFZhbHVlIiAvPgorICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC9lbGVtZW50PgorICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFsdWUiPgorICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgPGdyb3VwIHJlZj0idG5zOkNvbnN0VmFsdWUiIC8+CisgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICAgICAgICA8L2VsZW1lbnQ+CisgICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICAgIDwvZWxlbWVudD4KKyAgICA8L3NlcXVlbmNlPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxncm91cCBuYW1lPSJDb25zdFZhbHVlIj4KKyAgICA8Y2hvaWNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0ic3RyaW5nIiB0eXBlPSJzdHJpbmciIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJkb3VibGUiIHR5cGU9ImRvdWJsZSIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Imxpc3QiIHR5cGU9InRuczpDb25zdExpc3QiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJtYXAiIHR5cGU9InRuczpDb25zdE1hcCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImludCIgdHlwZT0ibG9uZyIgLz4KKyAgICA8L2Nob2ljZT4KKyAgPC9ncm91cD4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iVGhyaWZ0VHlwZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+CisgICAgICAgIDxlbGVtZW50IG5hbWU9ImVsZW1UeXBlIiB0eXBlPSJ0bnM6VGhyaWZ0VHlwZSIgLz4KKyAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImtleVR5cGUiIHR5cGU9InRuczpUaHJpZnRUeXBlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KKyAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YWx1ZVR5cGUiIHR5cGU9InRuczpUaHJpZnRUeXBlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KKyAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgIDwvY2hvaWNlPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ0bnM6VHlwZUlkZW50aWZpZXIiIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlLW1vZHVsZSIgdHlwZT0ic3RyaW5nIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZS1pZCIgdHlwZT0ic3RyaW5nIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxzaW1wbGVUeXBlIG5hbWU9IlR5cGVJZGVudGlmaWVyIj4KKyAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0idm9pZCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iYm9vbCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iYnl0ZSIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaTgiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImkxNiIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaTMyIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpNjQiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImRvdWJsZSIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iYmluYXJ5IiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJzdHJpbmciIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImlkIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJtYXAiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InNldCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibGlzdCIgLz4KKyAgICA8L3Jlc3RyaWN0aW9uPgorICA8L3NpbXBsZVR5cGU+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGFja2FnZS1sb2NrLmpzb24gYi9wYWNrYWdlLWxvY2suanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWI4YTIxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS1sb2NrLmpzb24KQEAgLTAsMCArMSwyNTYzIEBACit7CisgICJuYW1lIjogInRocmlmdCIsCisgICJ2ZXJzaW9uIjogIjAuMTMuMCIsCisgICJsb2NrZmlsZVZlcnNpb24iOiAxLAorICAicmVxdWlyZXMiOiB0cnVlLAorICAiZGVwZW5kZW5jaWVzIjogeworICAgICJAYmFiZWwvY29kZS1mcmFtZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AYmFiZWwvY29kZS1mcmFtZS8tL2NvZGUtZnJhbWUtNy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9mQzJ1ZW1ha25Ycjg3YmRMVWtXb2c3bll1bGlNOUlqNUhVY2Fqc1ZjTUNwUXJjTG10eFJiVkZUSXFtY1NrU2VZUkJGQlJ4czJGaVVxRkpETGRpZWJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJAYmFiZWwvaGlnaGxpZ2h0IjogIl43LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJAYmFiZWwvaGlnaGxpZ2h0IjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BiYWJlbC9oaWdobGlnaHQvLS9oaWdobGlnaHQtNy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVGTUM0WmVGQzQ4VHB2ajdDOFVnTHZ0a2FVdW92UVgrNXhOV3JzSW9NRzhvMnorWEZLakthTjlpVm1TODRkUHdWTjAwVzR3UG1xdllvWkYzRUdBc2Z3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJeMi4wLjAiLAorICAgICAgICAiZXN1dGlscyI6ICJeMi4wLjIiLAorICAgICAgICAianMtdG9rZW5zIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJAdHlwZXMvbm9kZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEwLjEyLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9ub2RlLy0vbm9kZS0xMC4xMi42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0rWldCNUVjMWlraTk5eFFGekJsaXZsS3hTWlErZnVVS0JvdHQ4U3RCT25MTjRkV2JSSGxnZGcxWGtucFc2ZzB0d2VuaU41RGNPcUE2NENKeU9VUFNBdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiQHR5cGVzL25vZGUtaW50NjQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9ub2RlLWludDY0Ly0vbm9kZS1pbnQ2NC0wLjQuMjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXJIWHZlbkxUai9DY3NtTkFlYmFCT2h4UTJNcUVHbDN5WFpaY1oyMVhZUitnekdUVGNwT3kyTjRJeHB2VEN6NDhsb3lRTmF0SHZmbjZHaEliYloxUjNRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJAdHlwZXMvbm9kZSI6ICIqIgorICAgICAgfQorICAgIH0sCisgICAgIkB0eXBlcy9xIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9xLy0vcS0xLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZXF6OGMvMGt3TmkvT0VIUWZ2SXVKVkxUc3QzaW4wZTd1VEtldVkrV0wvemZLbjB4VnVqT1RwNDJiUy92VVVva2hLNVAyQnBwTGQ5SlhNT01IY2diakE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFiYnJldiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hYmJyZXYvLS9hYmJyZXYtMS4wLjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1rYlI1SllpbmM0d2w4MTNXOWpkU292aDNZVFU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYWNvcm4iOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWNvcm4vLS9hY29ybi02LjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR1htS0l2YnJOM1RWN2FWcUF6VkZhTVc4Rjh3elZYN3ZvRUJSTzNiREE2NCtFWDM3WVNheWdnUkpQNVhpZzZIWUhCa1dLcEZnOVc1Z2c2b3JrbHViaGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFjb3JuLWpzeCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hY29ybi1qc3gvLS9hY29ybi1qc3gtNS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVhrQjUwZm4wTVVSRHl3dzkrVVlMM2MxeUxiT0J6MFpGdnJkWWxHQjhsK0lqZTFvU0M3NXFBcXJ6U1BqWVFiZG5RVXpobFVHTkt1ZXNyeUF2MGd4Wk9nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhanYiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjUuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWp2Ly0vYWp2LTYuNS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi00V3lqdDgrdDZZc3pxYVhuTERmTW1HLzhBbE81WmJjc3kzQVRIbmNDempXL05vUHpBSWQ4QUs2NzQ5WWJqbWR0K2tVWTFnUDYwZkN1NDZvRHhQdi9tZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmFzdC1kZWVwLWVxdWFsIjogIl4yLjAuMSIsCisgICAgICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6ICJeMi4wLjAiLAorICAgICAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiAiXjAuNC4xIiwKKyAgICAgICAgInVyaS1qcyI6ICJeNC4yLjIiCisgICAgICB9CisgICAgfSwKKyAgICAiYW1kZWZpbmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW1kZWZpbmUvLS9hbWRlZmluZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNsS0NyQlpIS2VrMkdiejlPdEZSK0JmT2tmVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1lc2NhcGVzIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktZXNjYXBlcy8tL2Fuc2ktZXNjYXBlcy0zLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVWdBYjhIOUQ0MUFRbnUvUGJXbENvZlFWY25WNEdzMmJCSmk5ZVpQeGZVL2hnZ2xGaDNTTURNRU5SSXFkcjdINlhGblhkb2tuY3RGQnlWc0NPb3RUVnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFuc2ktcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1yZWdleC8tL2Fuc2ktcmVnZXgtMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03UU1Yd3lJR1QzbEdiQUtXYTkyMkJhczMyWmc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0zLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVlQwWkk2a1pSZFRoOFl5SnczU01iWW0vdStOcWZzQXhFcFdPMFBmOXNxOC9lOTRXeHhPcFBLeDlGUjFGbHlDdE9WRE5PUSs4bnRscUZ4aVJjK3I1cUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLWNvbnZlcnQiOiAiXjEuOS4wIgorICAgICAgfQorICAgIH0sCisgICAgImFwcm9iYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcHJvYmEvLS9hcHJvYmEtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVk5SjZaalh0b1loOFJuWFZDTU9VL3R0RG1rMWFCanVucTl2TzB0YTV4ODVXRFFpUWZVRjlzSVBCSVRkYmlpSVZjQm8wM0hpM2pNeGlnQnRzZGRsWFJ3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcmUtd2UtdGhlcmUteWV0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FyZS13ZS10aGVyZS15ZXQvLS9hcmUtd2UtdGhlcmUteWV0LTEuMS41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi01aFlkQWtabGNHOHRPTHVqVkRUZ0NUK3VQWDBWbnBBSDI4Z1dzTGZ6cFhZbTd3UDZtcDVRL2dZeVI3WVEwY0tWSmNYSm5sM2oya3BCYW4xM1B0UWY2dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVsZWdhdGVzIjogIl4xLjAuMCIsCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAiXjIuMC42IgorICAgICAgfQorICAgIH0sCisgICAgImFyZ3BhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcmdwYXJzZS8tL2FyZ3BhcnNlLTEuMC4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbzVSb3k2dE5HNFNML0ZPa0NBTjZSemppYWtaUzI1UkxZRnJjTXR0SnFiZGQ4QldybkErZkd6NTdpTjVQYjA2cHZCR3ZsNWdRMEI0OGRKbHNsWHZvVGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiAifjEuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImFycmF5LXVuaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXVuaW9uLy0vYXJyYXktdW5pb24tMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1talJCRGs5T1BhSTk2amRiNWI1dzhrZDQ3RGs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktdW5pcSI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYXJyYXktdW5pcSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS11bmlxLy0vYXJyYXktdW5pcS0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXIycklkNkpjeC9kT0JZaVVkVGhZMzlzay9iWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyaWZ5Ly0vYXJyaWZ5LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaVlVSTJpSW04NERma0Vjb1JXaEp3VkFhU3cwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzbjEiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXNuMS8tL2FzbjEtMC4yLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWp4d3pRcExRalNtV1hnd2FDWkU5TnorZ2xBRzAxeUYxUW5XZ2JoR3dISTVBNkZSSUVZNklWcXRIaEllcEhxSTcva3lFeVFFYWdCQzVtQkVGbElZdmRnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlci1idWZmZXIiOiAifjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImFzc2VydC1wbHVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fzc2VydC1wbHVzLy0vYXNzZXJ0LXBsdXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04UzRQUEYxM3NMSE4yUlJwUXVUcGJCNU4xU1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTEuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN0dwaHJsWklEQXc4c2tISlZoamlDSkw1WnlvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5jLWxpbWl0ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMtbGltaXRlci8tL2FzeW5jLWxpbWl0ZXItMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpwL3VGbm9vT2lPK0wyMTFlWk9vU3l6cE9JVE1YeDFyQklUYXVZeWtHM0JSWVB1OGgwVWN4c1BOQjA0UlI1dm80VHl6MytheTE3dFI2SlZmOXF6WVdnPT0iCisgICAgfSwKKyAgICAiYXN5bmNraXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmNraXQvLS9hc3luY2tpdC0wLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXg1N1pmMzgweTQ4cm9ieVhrTHpEWmtkTFMzaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhd3Mtc2lnbjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXdzLXNpZ24yLy0vYXdzLXNpZ24yLTAuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdEc2SkNUU3BXUjh0TDIrRzErYXA4YlArZHFnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImF3czQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjguMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXdzNC8tL2F3czQtMS44LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJlWnh2TkhJT3Y4OEZsVDdyeGNYSUlDMGZQdDRLWnFaYk9saXZ5V3RYTHQ4RVN4ODR6ZDNrTUM2aUs1alZlUzJxdCtnN2Z0Uzd5ZTRmaTA2WDVydFJRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJiYWJ5bG9uIjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFieWxvbi8tL2JhYnlsb24tNy4wLjAtYmV0YS4xOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVmcwQzlzL1JFWDYvV0lYTjM3VUtwdjVaaFJpNkE0cGpIbHBrRTM0KzgvYTZjMlcxUTY5Mm4zaG1jK1NaRzVsS1JuYUV4TFVieHRKMVNWVCtLYUNRL0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJhbGFuY2VkLW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JhbGFuY2VkLW1hdGNoLy0vYmFsYW5jZWQtbWF0Y2gtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pYlRSbWFzcjdrbmVGazZnSzRuT1JpMXh0MmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmNyeXB0LXBia2RmIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JjcnlwdC1wYmtkZi8tL2JjcnlwdC1wYmtkZi0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBEQWRPSnRxUS9tMmYvUEtFYVAyWTM0MkRwND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ0d2VldG5hY2wiOiAiXjAuMTQuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJiaW5kaW5ncyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iaW5kaW5ncy8tL2JpbmRpbmdzLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1EcExoNUV6TVIya3p2WDFLSWxWQzBWa0MzaVp0SEtUZ2R0WjBhM3BnbEJaZGFRRmp0NVM5Zzl4ZDFsRStZdlh5ZmQ2bXRDZVJuclVmT0xZaVRNbE5Tdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ibC8tL2JsLTEuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lOHRRWW5ab2RtZWJZRFdHSDdLTVJ2dHpLWGFKSHgzQmJpbHJnWkNmdnlMVVlkS3BLMXQ1UFNQbXBrbnkvU2dpVFNDbmpmTFc3djVybE9OWFZGa1FFQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjMuNSIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYmx1ZWJpcmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmx1ZWJpcmQvLS9ibHVlYmlyZC0zLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZGhIVFdNSTdrTXg1d2hNUW50bDdWcjlDNkJ2VjEwbEZYREFhc25xbnJNWWhYVkN6ems2SU85Rm8yTDc1alhIVDA3V3JPbmdMMVdEWE9wK3lZUzkxWWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJyYWNlLWV4cGFuc2lvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJhY2UtZXhwYW5zaW9uLy0vYnJhY2UtZXhwYW5zaW9uLTEuMS4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItaUN1UEhERmdySFg3SDJ2RUkvNXhwejA3elNIQjAwVHB1Z3FobVl0Vm1NTzY1MThtQ3VSTW9PWUZsZEVCbDBnMTg3dWZvemRhSGdXS2NZRmI2MXFHaUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhbGFuY2VkLW1hdGNoIjogIl4xLjAuMCIsCisgICAgICAgICJjb25jYXQtbWFwIjogIjAuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImJ1ZmZlci1hbGxvYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItYWxsb2MvLS9idWZmZXItYWxsb2MtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUNGc0hRZ2p0VzFVQ2hkWGdieUpHdG5tK08vdUxRZVpkdGJEbzhtZlVnWVhDSFNNMXdnclZ4WG02YlN5clV1RXJFYis0c1lWR0N6QVNCUm90N3p5cm93PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWZmZXItYWxsb2MtdW5zYWZlIjogIl4xLjEuMCIsCisgICAgICAgICJidWZmZXItZmlsbCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYnVmZmVyLWFsbG9jLXVuc2FmZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItYWxsb2MtdW5zYWZlLy0vYnVmZmVyLWFsbG9jLXVuc2FmZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVEVNMmlNSUVRZEoyeWpQSm9TSXNsZG5sZVZhQWsxb1czREJWVXlreU9Mc0VzRm1FYzlrbitTRkZQeitnbDU0S1FOeGxEbkF3Q1hvc09TOU9reDJ4QWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1ZmZlci1lcXVhbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItZXF1YWxzLy0vYnVmZmVyLWVxdWFscy0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUExTzFUOUIvMlZaQmNHY2E1dlpyblBFTkovVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWZmZXItZmlsbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItZmlsbC8tL2J1ZmZlci1maWxsLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK1BlTGRuaVlpTzg1OGdYTlkzOW81d0lTS3l3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhbGxlci1wYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbGxlci1wYXRoLy0vY2FsbGVyLXBhdGgtMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sQWhlOWpXQjdOUGFxU1JFcVA2VTZDVjNkUjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FsbHNpdGVzIjogIl4wLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjYWxsc2l0ZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FsbHNpdGVzLy0vY2FsbHNpdGVzLTAuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcjZ1V0ppa1FwL004R2FWM1dDWEduelRqVU1vPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhc2VsZXNzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYXNlbGVzcy8tL2Nhc2VsZXNzLTAuMTIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUcyZ2NJZitFQXp5Q1pVTUpCb2xDRFJoeFVkdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjYXRoYXJzaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjguOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2F0aGFyc2lzLy0vY2F0aGFyc2lzLTAuOC45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbU15SkRLWlMzUzd3NXdzM2tsTVEvNTZRL0lzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUtY29udHJpYiI6ICJ+MC4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2hhbGsiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0yLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItT2JONmgxdjJmVEpTbVVYb1Mzbk1ROTJMYkRLOWJlNFRWKzZHK29tUWxHSkZkY1VYNWhlS2kxTFoxWW5STUlnd1RMRWozRTI0YlQ2dFluaTUwcmxDZlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogIl4zLjIuMSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjUiLAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjUuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNoYXJkZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhcmRldC8tL2NoYXJkZXQtMC43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1UOGlEY3JoMDNxREdSUm1vQTJobUJKbnhwbGxNUiswLzBxbHpqcVpFUzZOZGlXRGNaa0NOQWs0clBGWjlRODVyMjd1bmtpTk5nOFpPaXdaWEJId2NBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjaG93bnIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hvd25yLy0vY2hvd25yLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qMzhFdk81K0xIWDg0amxvNmg0VXptT3dpMFVnVzYxV1J5UHRKejRxYWFkSzVlWTNCVFM1VFkvUzFTdGMzVWsybElNNlRQZXZBbFVMaUVKd2llODYwZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2lyY3VsYXItanNvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaXJjdWxhci1qc29uLy0vY2lyY3VsYXItanNvbi0wLjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVVpLM05CeDJNY2ErYjVMc0c3YlkxODNwSFd0NVkxeHRzNFAzUHo3RU5Ud0dWbkpPVVdiUmIzb2Nqdlg3aHg5dHEveVRBZGNsWG05c1ozOGdOdWVtNEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNsaS1jdXJzb3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xpLWN1cnNvci8tL2NsaS1jdXJzb3ItMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zMTJzTjJSNStzdytsSFI5UWREUTlTT1AvTFU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVzdG9yZS1jdXJzb3IiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImNsaS13aWR0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGktd2lkdGgvLS9jbGktd2lkdGgtMi4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0veG50NkttbDVYa3lRVWV3d1I4UHZMcSsxams9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29kZS1wb2ludC1hdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2RlLXBvaW50LWF0Ly0vY29kZS1wb2ludC1hdC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURRY0xUUVE2Vytvem92R2tEaTdiUFpwTXozYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2xvci1jb252ZXJ0IjogeworICAgICAgInZlcnNpb24iOiAiMS45LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLWNvbnZlcnQvLS9jb2xvci1jb252ZXJ0LTEuOS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RZkFVdGQrdkZkQXRGUWNDOENDeVl0MWZZV3hTcUFpSzJjU0Q2ekRCOE4zY3BzRUJBdlJ4cDl6T0dnNkcvU0hISllBVDg4L2F6L0l1REdBTHNOVmJHZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItbmFtZSI6ICIxLjEuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb2xvci1uYW1lIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLW5hbWUvLS9jb2xvci1uYW1lLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcDlCVmk5aWNRdmVWM1VJeWozUUlNY3BUdkNVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbWJpbmVkLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21iaW5lZC1zdHJlYW0vLS9jb21iaW5lZC1zdHJlYW0tMS4wLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJyV2w5eTZ2T0IxeFlQWmNwWmRlM045ekRCeVhUb3NBZU1EbzRwMXd6bzZVTU9YNHZ1bUIrVFAxUlo3NnNmRTZNZDY4UTBOSlNyRS9nYmV6ZDRVbCt3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWxheWVkLXN0cmVhbSI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY29tbWFuZGVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4xOS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21tYW5kZXIvLS9jb21tYW5kZXItMi4xOS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02dHZBT08rRDZPRU52UkFoNTI0RGg5amNmS1RZRFFBcXZxZXpiQ1c4MnhqNVgwcFNyY3B4dHZSS0hMRzB5Qlk2U0Q3UFNEckphaiswQWlPY0tWZDFYZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29uY2F0LW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25jYXQtbWFwLy0vY29uY2F0LW1hcC0wLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJLbHIxMy9XamZkNU9uTURhanVnMVVCZFIzcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb25uZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMy42LjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nvbm5lY3QvLS9jb25uZWN0LTMuNi42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ2UvMnhWcjNJMjRUY1RXbkpYU0ZpMmVHOVNRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlYnVnIjogIjIuNi45IiwKKyAgICAgICAgImZpbmFsaGFuZGxlciI6ICIxLjEuMCIsCisgICAgICAgICJwYXJzZXVybCI6ICJ+MS4zLjIiLAorICAgICAgICAidXRpbHMtbWVyZ2UiOiAiMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiY29uc29sZS1jb250cm9sLXN0cmluZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uc29sZS1jb250cm9sLXN0cmluZ3MvLS9jb25zb2xlLWNvbnRyb2wtc3RyaW5ncy0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVBYejBSazIyUkc2bVJMOUxPVkIvbUZFQWpvND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb3JlLXV0aWwtaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29yZS11dGlsLWlzLy0vY29yZS11dGlsLWlzLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYxVUlncWl2RnExZXF0eFFNbEFkVVVEd2FjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNyb3NzLXNwYXduIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nyb3NzLXNwYXduLy0vY3Jvc3Mtc3Bhd24tNi4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVUVkxyQlN0N2ZqYkR5Z3o4MDVwTW5zdElzMlZUQk5rUm0wcXhaZCtNN0E1WERkeFZSV081TXhHQlhaaGpZNGNxTFlMZHRyR3FSZjhtQlBtendTcFdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJuaWNlLXRyeSI6ICJeMS4wLjQiLAorICAgICAgICAicGF0aC1rZXkiOiAiXjIuMC4xIiwKKyAgICAgICAgInNlbXZlciI6ICJeNS41LjAiLAorICAgICAgICAic2hlYmFuZy1jb21tYW5kIjogIl4xLjIuMCIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjkiCisgICAgICB9CisgICAgfSwKKyAgICAiZGFzaGRhc2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjE0LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Rhc2hkYXNoLy0vZGFzaGRhc2gtMS4xNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFR6NkQzeStMKzFkNGdNbXVOMVlFRFgyNHZBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzc2VydC1wbHVzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWJ1ZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTIuNi45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1iQzdFbHJkSmFKblBiQVArMUVvdFl2cVpzYjNlY2w1d2k2QmZpNkJKVFVjTm93cDZjdnNwZzBqWHpuUlRLRGptL0U3QWRnRkJWZUFQVk1OY0tHc0hNQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibXMiOiAiMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVjb21wcmVzcy1yZXNwb25zZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWNvbXByZXNzLXJlc3BvbnNlLy0vZGVjb21wcmVzcy1yZXNwb25zZS0zLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWdLVGRNamRJT0V2NkpJQ0RZaXJ0N0pncTMvTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW1pYy1yZXNwb25zZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVlcC1lcXVhbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWVwLWVxdWFsLy0vZGVlcC1lcXVhbC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTlkSmdLU3RtRGdoTy8wemJ5ZkNLMHlSMFNMVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWVwLWV4dGVuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWVwLWV4dGVuZC8tL2RlZXAtZXh0ZW5kLTAuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1MT0h4SU9hUFlkSGxKUnRDUWZESVZadGZ3L3VmTTgrclZqNjQ5UklIemNtL3ZHd1FSWEZ0Nk9QcUlGV3NtMlhFTXJOSUV0V1I2NHNZMUxFS0QydkFPQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVlcC1pcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWVwLWlzLy0vZGVlcC1pcy0wLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMyblcrMTI4RSs3UFVrK1JzSEQrN2NOWHp6UT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWZpbmUtcHJvcGVydGllcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydGllcy8tL2RlZmluZS1wcm9wZXJ0aWVzLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0zTXFmWUtqMmxMemRNU2Y4WklaRS9WK1p1eStCZ0Q2ZjE2NGU4SzJ3N2RnbnBLQXJCRGVyR1lwTTQ2SVlZY2pua2RQTk1qUGs5QTZWRkI4KzNTS2xYUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib2JqZWN0LWtleXMiOiAiXjEuMC4xMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWZpbmVkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZWQvLS9kZWZpbmVkLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteVkyYnp2ZFdkQmlPRVFscEZSR1o0NXNmcHBNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWwvLS9kZWwtMi4yLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13U3lZSFFaNFJzaEx5dmhpei9rdzJRZi8wYWc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYmJ5IjogIl41LjAuMCIsCisgICAgICAgICJpcy1wYXRoLWN3ZCI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtcGF0aC1pbi1jd2QiOiAiXjEuMC4wIiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMC4xIiwKKyAgICAgICAgInBpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIsCisgICAgICAgICJyaW1yYWYiOiAiXjIuMi44IgorICAgICAgfQorICAgIH0sCisgICAgImRlbGF5ZWQtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlbGF5ZWQtc3RyZWFtLy0vZGVsYXllZC1zdHJlYW0tMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zenJobWF5dCszMUVDcXJnc3A0aWNySk94aGs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVsZWdhdGVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlbGVnYXRlcy8tL2RlbGVnYXRlcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWhNYmhXYmdaQlAzS1dhRHZSTTJIRFRFbEQ1bz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZXRlY3QtbGliYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZXRlY3QtbGliYy8tL2RldGVjdC1saWJjLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK2hOOFM5YVk3ZlZjMWMwQ3JGV2ZrYVRFdXBzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRvY3RyaW5lIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvY3RyaW5lLy0vZG9jdHJpbmUtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTM1bVNrdTRaWEswdmZDdUhFREF3dDU1ZGcyak5hakhaMW9kdkYrOFNTcjgyRXNaWTRRbVhmdVdzbzhvRWQ4elJoVk9iU04xOGFNMENqU2RvQlg3ekl3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3V0aWxzIjogIl4yLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJlY2MtanNibiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lY2MtanNibi8tL2VjYy1qc2JuLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT29PcEJPVkRVeWg0ZE1Wa3QxU1Rob1NhbU1rPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImpzYm4iOiAifjAuMS4wIiwKKyAgICAgICAgInNhZmVyLWJ1ZmZlciI6ICJeMi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZWUtZmlyc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZWUtZmlyc3QvLS9lZS1maXJzdC0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdReGhGV3NLNHZUd0pWY3lvVml5WnJ4V3NoMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlbmNvZGV1cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZW5jb2RldXJsLy0vZW5jb2RldXJsLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtclQvMHlHN0MwQ2t5TDFvQ3c2bW1Cc2xiUDFrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVuZC1vZi1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZW5kLW9mLXN0cmVhbS8tL2VuZC1vZi1zdHJlYW0tMS40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFNa3JaTnZXVEtDYWlnYm4rVzE1ZWxxMkJCL0wyMm5xclNZNURLbG8zWDYrdmNsSm04QmI1ZGpYSkJtRVg2ZlMzK3pDaC9GNFZCSzVaMkt4SnQ0czJRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvbmNlIjogIl4xLjQuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlcy1hYnN0cmFjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXMtYWJzdHJhY3QvLS9lcy1hYnN0cmFjdC0xLjEyLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUM4RngvMGpGbVY1SVBvTU9GUEE5UDlHNU50cVcrNGNPUGl0M01JdXZSMnQ3QWcySzE1RUpUcHhuSEFZVHpMK2FZUUpJRVNZZVhabURCZk9CRTFIY3BBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlcy10by1wcmltaXRpdmUiOiAiXjEuMS4xIiwKKyAgICAgICAgImZ1bmN0aW9uLWJpbmQiOiAiXjEuMS4xIiwKKyAgICAgICAgImhhcyI6ICJeMS4wLjEiLAorICAgICAgICAiaXMtY2FsbGFibGUiOiAiXjEuMS4zIiwKKyAgICAgICAgImlzLXJlZ2V4IjogIl4xLjAuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlcy10by1wcmltaXRpdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXMtdG8tcHJpbWl0aXZlLy0vZXMtdG8tcHJpbWl0aXZlLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xWnJ5Qk9KalYvL0xheExUVjZVQy8vV2V3bmVCM0xjWE9MOU5QKytvektWWHNJSUlwbS8yYzEzVURpRDlKcDJlVGhzZWN3OW0zalBxRHdUeW9iY2RiZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtY2FsbGFibGUiOiAiXjEuMS40IiwKKyAgICAgICAgImlzLWRhdGUtb2JqZWN0IjogIl4xLjAuMSIsCisgICAgICAgICJpcy1zeW1ib2wiOiAiXjEuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImVzY2FwZS1odG1sIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzY2FwZS1odG1sLy0vZXNjYXBlLWh0bWwtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BbGpxNU5QUXdKZE40Y0ZwR0k3d0JSMGRHWWc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjYXBlLXN0cmluZy1yZWdleHAvLS9lc2NhcGUtc3RyaW5nLXJlZ2V4cC0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUcySEFWaUdRcU4vMnJqdXl6d0lBeWhNTGh0UT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc2NvZGVnZW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjguMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjb2RlZ2VuLy0vZXNjb2RlZ2VuLTEuOC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2x0VHIwYVRFUXZyc0laNm8wTU4wN2NLRUJnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzcHJpbWEiOiAiXjIuNy4xIiwKKyAgICAgICAgImVzdHJhdmVyc2UiOiAiXjEuOS4xIiwKKyAgICAgICAgImVzdXRpbHMiOiAiXjIuMC4yIiwKKyAgICAgICAgIm9wdGlvbmF0b3IiOiAiXjAuOC4xIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAifjAuMi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJlc3ByaW1hIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuNy4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmltYS8tL2VzcHJpbWEtMi43LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbHVPM0RWZDU5cTFKelFNbWM5SERFblo3cFlFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImVzdHJhdmVyc2UiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS45LjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3RyYXZlcnNlLy0vZXN0cmF2ZXJzZS0xLjkuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1yMmZ5M0pJbGdrRlpVSkpna2FRQVhTbkp1MFE9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZXNsaW50IjogeworICAgICAgInZlcnNpb24iOiAiNS43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC8tL2VzbGludC01LjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItellDZUZRYWhzeGZmR2w4N1UyYUo3RFB5SDhDYldneEJDMjEzWTgrVENhbmhVVGYyZ0V2ZnEzRUtwSG1FY296VEx5UG1HZTlMWmRNQXdDL0NwSkJNNUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIkBiYWJlbC9jb2RlLWZyYW1lIjogIl43LjAuMCIsCisgICAgICAgICJhanYiOiAiXjYuNS4zIiwKKyAgICAgICAgImNoYWxrIjogIl4yLjEuMCIsCisgICAgICAgICJjcm9zcy1zcGF3biI6ICJeNi4wLjUiLAorICAgICAgICAiZGVidWciOiAiXjQuMC4xIiwKKyAgICAgICAgImRvY3RyaW5lIjogIl4yLjEuMCIsCisgICAgICAgICJlc2xpbnQtc2NvcGUiOiAiXjQuMC4wIiwKKyAgICAgICAgImVzbGludC11dGlscyI6ICJeMS4zLjEiLAorICAgICAgICAiZXNsaW50LXZpc2l0b3Ita2V5cyI6ICJeMS4wLjAiLAorICAgICAgICAiZXNwcmVlIjogIl40LjAuMCIsCisgICAgICAgICJlc3F1ZXJ5IjogIl4xLjAuMSIsCisgICAgICAgICJlc3V0aWxzIjogIl4yLjAuMiIsCisgICAgICAgICJmaWxlLWVudHJ5LWNhY2hlIjogIl4yLjAuMCIsCisgICAgICAgICJmdW5jdGlvbmFsLXJlZC1ibGFjay10cmVlIjogIl4xLjAuMSIsCisgICAgICAgICJnbG9iIjogIl43LjEuMiIsCisgICAgICAgICJnbG9iYWxzIjogIl4xMS43LjAiLAorICAgICAgICAiaWdub3JlIjogIl40LjAuNiIsCisgICAgICAgICJpbXVybXVyaGFzaCI6ICJeMC4xLjQiLAorICAgICAgICAiaW5xdWlyZXIiOiAiXjYuMS4wIiwKKyAgICAgICAgImlzLXJlc29sdmFibGUiOiAiXjEuMS4wIiwKKyAgICAgICAgImpzLXlhbWwiOiAiXjMuMTIuMCIsCisgICAgICAgICJqc29uLXN0YWJsZS1zdHJpbmdpZnktd2l0aG91dC1qc29uaWZ5IjogIl4xLjAuMSIsCisgICAgICAgICJsZXZuIjogIl4wLjMuMCIsCisgICAgICAgICJsb2Rhc2giOiAiXjQuMTcuNSIsCisgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgIm1rZGlycCI6ICJeMC41LjEiLAorICAgICAgICAibmF0dXJhbC1jb21wYXJlIjogIl4xLjQuMCIsCisgICAgICAgICJvcHRpb25hdG9yIjogIl4wLjguMiIsCisgICAgICAgICJwYXRoLWlzLWluc2lkZSI6ICJeMS4wLjIiLAorICAgICAgICAicGx1cmFsaXplIjogIl43LjAuMCIsCisgICAgICAgICJwcm9ncmVzcyI6ICJeMi4wLjAiLAorICAgICAgICAicmVnZXhwcCI6ICJeMi4wLjEiLAorICAgICAgICAicmVxdWlyZS11bmNhY2hlZCI6ICJeMS4wLjMiLAorICAgICAgICAic2VtdmVyIjogIl41LjUuMSIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl40LjAuMCIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIl4yLjAuMSIsCisgICAgICAgICJ0YWJsZSI6ICJeNS4wLjIiLAorICAgICAgICAidGV4dC10YWJsZSI6ICJeMC4yLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlYnVnIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjQuMS4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy00LjEuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWhlTlBKVUpJcUMreEI2YXlMQU1IYUlybU45SEthN2FRTzhNR3FLcHZDQSt1SllWY3ZSNmw1a2dkcmhSdXdQRkhVN1A1L0ExdzBCakJ5UEh3cGZUREtnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJtcyI6ICJeMi4xLjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGdwK2RsNWNHazI4dXRZa3RCc3JGcUE3SEtncmhnUHNnNlovRWZoV0k0Z2wxSHdxOEIvR21ZLzBvWFo2bkY4aERWZXNTL0ZwbllhRC9rT1doWVF2eWc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImVzbGludC1jb25maWctcHJldHRpZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50LWNvbmZpZy1wcmV0dGllci8tL2VzbGludC1jb25maWctcHJldHRpZXItMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFZR2ZtenVjNHE0SjZYSWhscDh2UktkSS9mSTB0UWZRUHkxZE1FM1VPTHByRSt2NHNzSC8zVzlMTTJRN2g1cUJjeTVtMGVoQ3JCRFUyWUY4cTZPWTh3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjYuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzbGludC1wbHVnaW4tcHJldHRpZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50LXBsdWdpbi1wcmV0dGllci8tL2VzbGludC1wbHVnaW4tcHJldHRpZXItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTRnMTFvcHpocXEvOCtBTW1vNVZjMkduN3o5YWxaNEpxcmJaK0Q0aThLbFN5eGVRaFpIbG1Jclk4VTlBa2Y1MTRNb0Vob2dQYTg3SmdrcTg3YVoyT2h3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwcmV0dGllci1saW50ZXItaGVscGVycyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNsaW50LXNjb3BlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC1zY29wZS8tL2VzbGludC1zY29wZS00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMUc2VVREaTdKYzFFTEZ3blI1OEhWNGZLOU9RSzRTNk45ODVmMTY2eHFYeHBqVTZwbHhGSVNKYTJCYTlLQ1F1RmE4UkNuai9sU0ZKYkhvN1VGREJuVUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzcmVjdXJzZSI6ICJeNC4xLjAiLAorICAgICAgICAiZXN0cmF2ZXJzZSI6ICJeNC4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNsaW50LXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC11dGlscy8tL2VzbGludC11dGlscy0xLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWjdZam5JbGRYKzJYTWNqcjdaa2dFc09qL2JSRU9OVjYwcVllQi9iak1BcXFxWjR6eEt5V1grQk9Va2RtUm1BOXJpaUlQVnZvNXg4Nm01ZWx2aU9rMFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzbGludC12aXNpdG9yLWtleXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50LXZpc2l0b3Ita2V5cy8tL2VzbGludC12aXNpdG9yLWtleXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXF6bS9YeElieG0vRkh5SDM0MVpyYm5NVXBlKzVCb2N0ZTl4a21GTXpQTWpSYVpNY1h3dytNcEJwdEZ2dFUrNzlMMzYybnFpTGhla0N4Q3hEUGFVTUJRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc3ByZWUiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmVlLy0vZXNwcmVlLTQuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1JNUJ5Y1pXNkZDVkl1YjkzVGVWWTFzN3ZqaFA5Q1k2Y1hDem5JUmZpaWc3blJ2aUtaWWRSbmovc0hFV0M2QTdXRTlSRFdPRnE5KzdPc1dTWXo4cXYydz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWNvcm4iOiAiXjYuMC4yIiwKKyAgICAgICAgImFjb3JuLWpzeCI6ICJeNS4wLjAiLAorICAgICAgICAiZXNsaW50LXZpc2l0b3Ita2V5cyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNwcmltYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3ByaW1hLy0vZXNwcmltYS00LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZUd1RkZ3N1VwZGErZzRwK1FIdm5XMFJ5VFgvU1ZlSkJETS9nQ3RNQVJPMGNMdVQySGNFS25UUHZoalY2YUdlcXJDQi9zYk5vcDBLc3ptMGpzYVdVNEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzcXVlcnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNxdWVyeS8tL2VzcXVlcnktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVNtaXlaNXpJV0g5Vk0rU1JVUmVMUzVROGE3R3h0UmR4RUJWWnBtOThySk03U2IrQTlEVkNuZFhma2VGVWQzYnlkZXJnK0ViRGtmbmV2ZkN3eW5XYU5BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3RyYXZlcnNlIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc3JlY3Vyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNyZWN1cnNlLy0vZXNyZWN1cnNlLTQuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02NFJCQisrZklPQVhQdzNQOWN5ODlxZk1sdlpFWFprcXFKa2pxcVhJdnpQNWV6UlpqVytsUFdqdzM1VVgvM0VoVVBGWWJnNUVSNEpZZ0R3NDAwNy9EUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXN0cmF2ZXJzZSI6ICJeNC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXN0cmF2ZXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3RyYXZlcnNlLy0vZXN0cmF2ZXJzZS00LjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURlNC83VEg4MUdsaGpPYzBJSm44R3ZvTDJ4TT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc3V0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzdXRpbHMvLS9lc3V0aWxzLTIuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ3I5UEhLcGJ5eDk2bllyTWJlcFBxcUJMckpzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4cGFuZC10ZW1wbGF0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHBhbmQtdGVtcGxhdGUvLS9leHBhbmQtdGVtcGxhdGUtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNlYnFMdFY4S09aZncwVUk4VEVGV3h0Y3p4eEMxanZ5VXZ4Nkg0ZnlwMUsxRk43QTRRK3VnZ1ZVbE9zSTFLOEFHVTByd09HcVA4bkNhcGRydzhDWVFnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLy0vZXh0ZW5kLTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1manF1QzU5Y0Q3Q3lXNnVyTlhLMEZCdWZrWmNvaUdHODB3VHVQdWpYNTkwY0I1VHRsbjIwRTJVQjRTL1dBUlZxaFhmZlpsMkxOZ1MrZ1FkUElJaW0vZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXh0ZXJuYWwtZWRpdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVybmFsLWVkaXRvci8tL2V4dGVybmFsLWVkaXRvci0zLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYm43MUg5K3FXb09RS3laRG8yNW1PTVZwU21YUk9Bc1RKVlZWWXpycnRvbDNkNHkrQXNLamY0SXdsMlErSXVUMGtGU1ExcW8xNjZVdUl3cVlxN21HbkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYXJkZXQiOiAiXjAuNy4wIiwKKyAgICAgICAgImljb252LWxpdGUiOiAiXjAuNC4yNCIsCisgICAgICAgICJ0bXAiOiAiXjAuMC4zMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJleHRzcHJpbnRmIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dHNwcmludGYvLS9leHRzcHJpbnRmLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbHBHRVFPTUVHbnBCVDR4UzQ4VjA2encrSGdVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZhc3QtZGVlcC1lcXVhbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWRlZXAtZXF1YWwvLS9mYXN0LWRlZXAtZXF1YWwtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ld1VoamQrV1o3OS9Od3YzL2JMTEZmM1Fxa2s9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1kaWZmIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtZGlmZi8tL2Zhc3QtZGlmZi0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteEp1b1Q1K0w5OVhsWjh0d2VkYVJmNkF4MlRnUVZ4dmdaT1lvUEtxWnVmbUppYjB0TDJ0ZWdQQk9aYjFwVk5nSWhscURsQTBlTzBjM3dCdlFjbXp4NHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5Ly0vZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnktMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0xUlFzREs3bXNSaWZoOU9uWVJFR1Q0Ykl1L0k9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1sZXZlbnNodGVpbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWxldmVuc2h0ZWluLy0vZmFzdC1sZXZlbnNodGVpbi0yLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVBZcGNab2c2RnFNTXFHUStoUjhadXFkNWVSYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmaWd1cmVzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpZ3VyZXMvLS9maWd1cmVzLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT3JHaTBxWXNpL3RER2d5VXkzbDZMODRueVdJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaWxlLWVudHJ5LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbGUtZW50cnktY2FjaGUvLS9maWxlLWVudHJ5LWNhY2hlLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzVLWkRENW9SNFBZT0xqSVNrWFlvRWhGZzJFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZsYXQtY2FjaGUiOiAiXjEuMi4xIiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImZpbmFsaGFuZGxlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5hbGhhbmRsZXIvLS9maW5hbGhhbmRsZXItMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16Z3RvVmJSWVUrZVJzdnpHZ0FSdGlDVTkxL1U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVidWciOiAiMi42LjkiLAorICAgICAgICAiZW5jb2RldXJsIjogIn4xLjAuMSIsCisgICAgICAgICJlc2NhcGUtaHRtbCI6ICJ+MS4wLjMiLAorICAgICAgICAib24tZmluaXNoZWQiOiAifjIuMy4wIiwKKyAgICAgICAgInBhcnNldXJsIjogIn4xLjMuMiIsCisgICAgICAgICJzdGF0dXNlcyI6ICJ+MS4zLjEiLAorICAgICAgICAidW5waXBlIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmbGF0LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZsYXQtY2FjaGUvLS9mbGF0LWNhY2hlLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMHdNTE1yT0JWUFRqdCtuSENmU1E5KytYeElFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNpcmN1bGFyLWpzb24iOiAiXjAuMy4xIiwKKyAgICAgICAgImRlbCI6ICJeMi4wLjIiLAorICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS4yIiwKKyAgICAgICAgIndyaXRlIjogIl4wLjIuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmb3ItZWFjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3ItZWFjaC8tL2Zvci1lYWNoLTAuMy4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qcVlmTHA3bW85dkl5UWY4eWtXMnY3QSsyTjRRamVDZUk1K0R6OVhyYWlPMWlnbjgxd2ppSDdGYjl2U09XdlFmTnRtU2E0SDJSb1FUcnJYaXZkVVptdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtY2FsbGFibGUiOiAiXjEuMS4zIgorICAgICAgfQorICAgIH0sCisgICAgImZvcmV2ZXItYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZm9yZXZlci1hZ2VudC8tL2ZvcmV2ZXItYWdlbnQtMC42LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rOGNmREVHdDZ6ZjViRmQ2MGUxQzJQMnN5cEU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZm9ybS1kYXRhIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvcm0tZGF0YS8tL2Zvcm0tZGF0YS0yLjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMWxMS0IyTXUzYUdQMVEvMmVDT3gwZk5iUk1lN1hkd2t0d09ydWhmcXFkMHJJSld3TjREaCtFM2hyUFNsRENYblNSN1V0WjFOMzhyVlhtKzYrTUVoSlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5ja2l0IjogIl4wLjQuMCIsCisgICAgICAgICJjb21iaW5lZC1zdHJlYW0iOiAiXjEuMC42IiwKKyAgICAgICAgIm1pbWUtdHlwZXMiOiAiXjIuMS4xMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJmcy1jb25zdGFudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMtY29uc3RhbnRzLy0vZnMtY29uc3RhbnRzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15Nk9Bd29TSWY3RnlqTUl2OTR1K2I1cmRoZVpFanpSNjNHVHlaSm01cWg0QmkrMllnd0xDY0kvZlBGWmtMNVBTaXhPdDZaTkttK3crSGZwL0JjaXdvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZnMucmVhbHBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMucmVhbHBhdGgvLS9mcy5yZWFscGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUZRU3RKU01WaktwQTIwb25oOHNCUVJtVTZrOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmdW5jdGlvbi1iaW5kIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Z1bmN0aW9uLWJpbmQvLS9mdW5jdGlvbi1iaW5kLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15SW92QXpNWDQ5c0Y4WWw1OGZTQ1dKNXN2U0x1YWliUHhYUUpGTG1CT2JUdUNyME1mMUtpUG9wR005TmlGamlZQkNiZmFhMkZoNmJyZVE2QU5WVEkwQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mdW5jdGlvbmFsLXJlZC1ibGFjay10cmVlLy0vZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUd3cXp2VlU3S2cxam1kS2NEajZnc2xJSGd5Yz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnYXVnZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNy40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nYXVnZS8tL2dhdWdlLTIuNy40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTEFOQVhIVTR3NTErczNzeGNDTGpKZnNCaS9jPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFwcm9iYSI6ICJeMS4wLjMiLAorICAgICAgICAiY29uc29sZS1jb250cm9sLXN0cmluZ3MiOiAiXjEuMC4wIiwKKyAgICAgICAgImhhcy11bmljb2RlIjogIl4yLjAuMCIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjEuMCIsCisgICAgICAgICJzaWduYWwtZXhpdCI6ICJeMy4wLjAiLAorICAgICAgICAic3RyaW5nLXdpZHRoIjogIl4xLjAuMSIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMSIsCisgICAgICAgICJ3aWRlLWFsaWduIjogIl4xLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1yZWdleCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktcmVnZXgvLS9hbnNpLXJlZ2V4LTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXc3TTZ0ZTQyRFliZzVpandSb3JuN3lmV1ZOOD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50Ly0vaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQtMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNzU0eE9HOERHbjhOWkRyNEw5NVF4RmZ2QU1zPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgIm51bWJlci1pcy1uYW4iOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN0cmluZy13aWR0aCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZy13aWR0aC8tL3N0cmluZy13aWR0aC0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1FWXZmVzR6Y1VhS241dzBoSGdmaXNMbXhCOU09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiY29kZS1wb2ludC1hdCI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogIl4xLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3RyaXAtYW5zaSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtYW5zaS8tL3N0cmlwLWFuc2ktMy4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYWpoZnVJVTlsUzFmOEYwT2lxK1VKNDNHUGM4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdldC1zdGRpbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXQtc3RkaW4vLS9nZXQtc3RkaW4tNi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpwNHRIYXd5VjcrZmtrU0t5dmp1TFpzd2JsVXR6K1NRS3pTV25CYmlpMTZCdVprc0psVTF3dUJZWFk3NXIrZHVoL2xsRjF1cjZvTndpKzJaempLWjdnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXRwYXNzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldHBhc3MvLS9nZXRwYXNzLTAuMS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWHYrT1BtaE5WcHJreXlzU2dtQk9pNlloU2ZvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzc2VydC1wbHVzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnaXRodWItZnJvbS1wYWNrYWdlIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dpdGh1Yi1mcm9tLXBhY2thZ2UvLS9naXRodWItZnJvbS1wYWNrYWdlLTAuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbC90ZGxyL2VpWE14UHlEb0tJNzVvV2Y2Wk00PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNy4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXZjZnVpSXhvZ0xWNERsR0JISVVPd0kwSWJySjhIV1BjNE1VN0h6dmlHZU5oby9VSkRmaTZCNXAzc0hlV0lRMEtHSVUwSnB4aTVaSHhlbVFmTGtrQXdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmcy5yZWFscGF0aCI6ICJeMS4wLjAiLAorICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnbG9iYWxzIjogeworICAgICAgInZlcnNpb24iOiAiMTEuOC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iYWxzLy0vZ2xvYmFscy0xMS44LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlvNkxreVBWdXpDSEJTUVY5Zm1Pd3haa1VrNm5JYUdteGhlTERnbXVGdjg5ajBmbTJhcURiSVhLQUdmekNNSHF6M0hMRjJaZjhXU0c2VnFNaDJxRm1BPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnbG9iYnkiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmJ5Ly0vZ2xvYmJ5LTUuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNjloR1o4b051ek1MbWJ6OGFPckN2RlEzRGcwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFycmF5LXVuaW9uIjogIl4xLjAuMSIsCisgICAgICAgICJhcnJpZnkiOiAiXjEuMC4wIiwKKyAgICAgICAgImdsb2IiOiAiXjcuMC4zIiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMC4xIiwKKyAgICAgICAgInBpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJncmFjZWZ1bC1mcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3JhY2VmdWwtZnMvLS9ncmFjZWZ1bC1mcy00LjEuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Eb3ZmNU5IZHVJVk5aT0JPcDhBT0tnSnVWbGc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFuZGxlYmFycyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFuZGxlYmFycy8tL2hhbmRsZWJhcnMtNC4wLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SaG1UZWtQK0ZaTCtYTmh3UzFXZitiVFRacGRMb3Vnd3Q1cGNnQTF0dXo2SmN4MGZwSC83ejBxZDcxUktuWkhCQ3hJUkJIZkJPbmlvNGdWaVBlbU56QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMiOiAiXjIuNS4wIiwKKyAgICAgICAgIm9wdGltaXN0IjogIl4wLjYuMSIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIl4wLjYuMSIsCisgICAgICAgICJ1Z2xpZnktanMiOiAiXjMuMS40IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhc3luYyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjYuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMi42LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mTkVpTDIrQVp0NkFsQXcvMjlDcjBVRGU0c1JBSENwRUhoNTRXTXorQmI3UWZOY0Z3NGgzbG9vZnlKcExlUXM0WXg3eXVxdS8yZExnTTVoS09zNkhsUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAibG9kYXNoIjogIl40LjE3LjEwIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInNvdXJjZS1tYXAiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC42LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLy0vc291cmNlLW1hcC0wLjYuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVqZ2FwdW1XbGJNaGtCZ3pUN1lrYzVZWFVUNDZGMGlLdThTR1hxMGJjd1A1ZHovaDBQbGo2ZW5KcWp6MVpicTJsNVdhcVluclZid1dPV015RjNGNDdnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJoYXItc2NoZW1hIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhci1zY2hlbWEvLS9oYXItc2NoZW1hLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcVV3aUpPdkt3RWVDb05rRFZTSHlSelczN0pJPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImhhci12YWxpZGF0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFyLXZhbGlkYXRvci8tL2hhci12YWxpZGF0b3ItNS4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXNOdk9DekVRTnIvcXJ2SmdjM1VHL2tENFF0bEh5Y3J6d1MrNm1mVHJyU3E5N0J2YVljUFpaSTFaU3FHU1BSNzNDeG40TEtURDRQdHRSd2ZVN2pXcTVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhanYiOiAiXjYuNS41IiwKKyAgICAgICAgImhhci1zY2hlbWEiOiAiXjIuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhanYiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNi43LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hanYvLS9hanYtNi43LjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SWlhQdmlCVHRmbXRrYTluOXN5MU41TTViODJDYnhXSVI2SElpczRzM1dRVFhESmFtYy8wZ3BDV05HejZFV2RXcDRET2ZqekpmaHovQVM5elZQampXZz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZmFzdC1kZWVwLWVxdWFsIjogIl4yLjAuMSIsCisgICAgICAgICAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6ICJeMC40LjEiLAorICAgICAgICAgICAgInVyaS1qcyI6ICJeNC4yLjIiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiaGFzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy8tL2hhcy0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZjJkdk8wVlU2T2VqN1JrV0pHcmVoamJ6TUFqRnA1L1ZLUHA1dFRwV0lWNEpISFpLMS9CeGJGUnRmL3NpQTJTV1RlMDljYURtVnRZWXpXRUliQlM0enc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZ1bmN0aW9uLWJpbmQiOiAiXjEuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgImhhcy1mbGFnIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1mbGFnLy0vaGFzLWZsYWctMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZFJVM0NHWnJpSldtZk5HZmxvSDg3bFZ1djA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFzLXN5bWJvbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLXN5bWJvbHMvLS9oYXMtc3ltYm9scy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXVocVBHdktnL0RsbEQxeUZBMmR3UVNJR08wUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJoYXMtdW5pY29kZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdW5pY29kZS8tL2hhcy11bmljb2RlLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNE9iK2FpalBVUk9JVmVDRzBXa2VkeDNpcUxrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImh0bWwtdmFsaWRhdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2h0bWwtdmFsaWRhdG9yLy0vaHRtbC12YWxpZGF0b3ItMy4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJoamNRSUhTL1NmWXpRKy9KckZXS1U2QVZ2ZTZBdXdmdEFHL2NXWDMrYnB2QksvdEdNcWJPbGVLbHNBeExyS0Q4NCtHU0oxb0pHbmt5aGRWTEJHQ3FnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZXF1ZXN0IjogIjIuODguMCIsCisgICAgICAgICJ2YWxpZC11cmwiOiAiMS4wLjkiCisgICAgICB9CisgICAgfSwKKyAgICAiaHRtbC12YWxpZGF0b3ItY2xpIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2h0bWwtdmFsaWRhdG9yLWNsaS8tL2h0bWwtdmFsaWRhdG9yLWNsaS00LjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNHZHUDEwN1VEaGhOSGVXQTVOOGovblVQbFFidEIvVy9LMngvUDdhRWxiV01Xck9rSkEwTVJTVkZzTUZyVFBTQUFqWldDRzl1a2kyKzFjUUR6RnRWY1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImh0bWwtdmFsaWRhdG9yIjogIjMuMS4zIiwKKyAgICAgICAgIm1pbmltaXN0IjogIjEuMi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzFBSXNnOUJPRDdzSDdrVTlNMWQ5NW9tUW9RPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImh0dHAtc2lnbmF0dXJlIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2h0dHAtc2lnbmF0dXJlLy0vaHR0cC1zaWduYXR1cmUtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tdXpaSlJGSGN2UFpXMldtQ3J1UGZCajdyT0U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImpzcHJpbSI6ICJeMS4yLjIiLAorICAgICAgICAic3NocGsiOiAiXjEuNy4wIgorICAgICAgfQorICAgIH0sCisgICAgImljb252LWxpdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ljb252LWxpdGUvLS9pY29udi1saXRlLTAuNC4yNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdjNNWG5aQWN2bnl3a1RVRVpvbUlBY3RsZTdSWFhlZWRPUjMxd3dsN1ZseW9YTzRRaTlhcnZTZW5OUVduZTFUY1J3aENMMUh3TEkyMWJFcWRwajgvckE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmVyLWJ1ZmZlciI6ICI+PSAyLjEuMiA8IDMiCisgICAgICB9CisgICAgfSwKKyAgICAiaWdub3JlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lnbm9yZS8tL2lnbm9yZS00LjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItY3lGREtycWMvWWRjV0ZuaUpoekk0MitBelMrZ053bVV6T1NGY1JDUVl3eVN1QkJCeS9LanV4V0xaL0ZIRUg2TW9xMU5pek1PQld5VGN2OE80T1pJTWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImltdXJtdXJoYXNoIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ltdXJtdXJoYXNoLy0vaW11cm11cmhhc2gtMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1raGk1c3Jrb29qaXhQY1Q3YTIxWGJ5TVVVK289IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW5mbGlnaHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5mbGlnaHQvLS9pbmZsaWdodC0xLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNiMWpNZGZRTFF3SnZKRUtFSFc2Z1dXMWJmaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJ3cmFwcHkiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbmhlcml0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmhlcml0cy8tL2luaGVyaXRzLTIuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXp3c2crUGFRcVVDOVNSbUFpU0E5Q0NDWWQ0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImluaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmkvLS9pbmktMS4zLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJaWTVodUlLQ01SV0RVcVpsRWk3MmYvbG1YS012dXN6Y01CZHVsaVEzbm5XYng5WC9aQlFPN0Rpak1FWVM5RWhIQmIycWFjUlVNdEM3c3ZMd2UwbGN3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbnF1aXJlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbnF1aXJlci8tL2lucXVpcmVyLTYuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RSUVRRzRZeVEyVVlaR0RDNHNyTVo3QmpIT21OazFsUjJKUWo1VWtuQmFwa2xtNldIQStWVkg3TitzVWRYM0E3TmVDZkdGOG80WDFTM0FvN25BY0llZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1lc2NhcGVzIjogIl4zLjAuMCIsCisgICAgICAgICJjaGFsayI6ICJeMi4wLjAiLAorICAgICAgICAiY2xpLWN1cnNvciI6ICJeMi4xLjAiLAorICAgICAgICAiY2xpLXdpZHRoIjogIl4yLjAuMCIsCisgICAgICAgICJleHRlcm5hbC1lZGl0b3IiOiAiXjMuMC4wIiwKKyAgICAgICAgImZpZ3VyZXMiOiAiXjIuMC4wIiwKKyAgICAgICAgImxvZGFzaCI6ICJeNC4xNy4xMCIsCisgICAgICAgICJtdXRlLXN0cmVhbSI6ICIwLjAuNyIsCisgICAgICAgICJydW4tYXN5bmMiOiAiXjIuMi4wIiwKKyAgICAgICAgInJ4anMiOiAiXjYuMS4wIiwKKyAgICAgICAgInN0cmluZy13aWR0aCI6ICJeMi4xLjAiLAorICAgICAgICAic3RyaXAtYW5zaSI6ICJeNC4wLjAiLAorICAgICAgICAidGhyb3VnaCI6ICJeMi4zLjYiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtY2FsbGFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtY2FsbGFibGUvLS9pcy1jYWxsYWJsZS0xLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcjVwOXN4SmpZbkFyTGpPYnBqQTR4dTVFS0kzQ3VLSGtKWE1oVDdrd2JwVXlJRkQxbjVQTUFzb1B2V252dFppTno3TGprWURSWmhkN0ZsSTBlTWlqRUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWRhdGUtb2JqZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGUtb2JqZWN0Ly0vaXMtZGF0ZS1vYmplY3QtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tcUlPdHE3cnYvZC92VFBuVEtBYk0xZ2RPaFk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQvLS9pcy1mdWxsd2lkdGgtY29kZS1wb2ludC0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW83TUtYRThaa1lNV2VxcTVPKzc2NDkzN1pVOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1wYXRoLWN3ZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wYXRoLWN3ZC8tL2lzLXBhdGgtY3dkLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMGlYc0l4TXVpZTNUajlwMmRITG1MbVh4RUcwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXBhdGgtaW4tY3dkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXBhdGgtaW4tY3dkLy0vaXMtcGF0aC1pbi1jd2QtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUZqVjFSVFc0OEU3Q1dNN2VFL0oyTkp2QUVFVmVrdGVjREJWQkU1SGgzbk0xSmQwa3ZoSHRYNjhQcjN4c0RmODU3eHQzWTRBa3dWVUxLMVZrdTYyYWFRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1wYXRoLWluc2lkZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcGF0aC1pbnNpZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcGF0aC1pbnNpZGUvLS9pcy1wYXRoLWluc2lkZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWp2VzMzbEJEZWovY3ByVG9aZTk2cFZ5MGdEWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYXRoLWlzLWluc2lkZSI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcHJvbWlzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wcm9taXNlLy0vaXMtcHJvbWlzZS0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVhS3A3T2Z3bHVnUE50S3k4N3dXd2Y5TDgvbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1yZWdleC8tL2lzLXJlZ2V4LTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVlJkSW0xUndrYkNURGdsV1ZNN1NYdWwrbEpFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcyI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcmVzb2x2YWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1yZXNvbHZhYmxlLy0vaXMtcmVzb2x2YWJsZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcWdEWVhGU1I1V3ZFZnVTNWRNajZvVE1FYnJyU2FNMENyRmsyWWlxL2dYbkJ2RDlwTWEyakdYeHloR0xmdmhacHVNWmUxOENKcEZ4QXQzQ1JzNDJOTWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXN5bWJvbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1zeW1ib2wvLS9pcy1zeW1ib2wtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUhTOGJaOW94NjB5Q0pMSDlzbkJwSXd2OXBZVUFrY3VMaFNBMW9lcm8xVUI1eTlhaVFwUkE4eTJleDk0NUFPdENaTDFsSkRlSWszRzVMdGhzd0k0Nkx3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMtc3ltYm9scyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtdHlwZWRhcnJheSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy10eXBlZGFycmF5Ly0vaXMtdHlwZWRhcnJheS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTVIbklDRmpmREJzUjNkcHBRUGxnRWZ6YVNwbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc2FycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzYXJyYXkvLS9pc2FycmF5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdTVOZFNGZ3N1aGFNQm9OSlY2VktQZ2NTVHhFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzZXhlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzZXhlLy0vaXNleGUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02UHZ6ZE54VmIvaVVlaERjc0ZjdFl6OHMraEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXNzdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNzdHJlYW0vLS9pc3N0cmVhbS0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVIrWS9ldlZhK20rUzRWQU9hUTY0dUZLY0Nabz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc3RhbmJ1bCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc3RhbmJ1bC8tL2lzdGFuYnVsLTAuNC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmNmWFBVeE5xRTFQT3NNUXVSajdDNEF6Y3pzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFiYnJldiI6ICIxLjAueCIsCisgICAgICAgICJhc3luYyI6ICIxLngiLAorICAgICAgICAiZXNjb2RlZ2VuIjogIjEuOC54IiwKKyAgICAgICAgImVzcHJpbWEiOiAiMi43LngiLAorICAgICAgICAiZ2xvYiI6ICJeNS4wLjE1IiwKKyAgICAgICAgImhhbmRsZWJhcnMiOiAiXjQuMC4xIiwKKyAgICAgICAgImpzLXlhbWwiOiAiMy54IiwKKyAgICAgICAgIm1rZGlycCI6ICIwLjUueCIsCisgICAgICAgICJub3B0IjogIjMueCIsCisgICAgICAgICJvbmNlIjogIjEueCIsCisgICAgICAgICJyZXNvbHZlIjogIjEuMS54IiwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4zLjEuMCIsCisgICAgICAgICJ3aGljaCI6ICJeMS4xLjEiLAorICAgICAgICAid29yZHdyYXAiOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJlc3ByaW1hIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuNy4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmltYS8tL2VzcHJpbWEtMi43LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbHVPM0RWZDU5cTFKelFNbWM5SERFblo3cFlFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImdsb2IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNS4wLjE1IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNS4wLjE1LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUc4azJ1ZUF2U21BL3pDSXV6M1l6MHd1TGs3RT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpbmZsaWdodCI6ICJeMS4wLjQiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAgICAgIm1pbmltYXRjaCI6ICIyIHx8IDMiLAorICAgICAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJoYXMtZmxhZyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1mbGFnLy0vaGFzLWZsYWctMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtblo1NU1XWE9BWG9BOEFRWXhEK1VLbnNkRWZvPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0zLjIuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1aYXdGQkxPVlFYSFlwa2xHc3E0OHU0cGZWUFk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaGFzLWZsYWciOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImpzLXRva2VucyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qcy10b2tlbnMvLS9qcy10b2tlbnMtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJkSlVmbGNFM2NVektpTXFRZ3NDdTA2RlB1OVVkSUpPMGJlWWJQaEhONGs2YXBnSnRpZmNvQ3RUOWJjeE9wWUJ0cEQya0NNNlNiemc0Q2F1c1cvUEtRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJqcy15YW1sIjogeworICAgICAgInZlcnNpb24iOiAiMy4xMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qcy15YW1sLy0vanMteWFtbC0zLjEyLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVBJdDJjbndtUGZMNGhLTndxZWl1ejRiS2ZuekhUQnY2SHlWZ2phaEE2bVBMd1BEempEV3JwbEpCTWpIVUZ4a3UvTjNGbG1yYnlQY2xhZCtJKzRtSjNBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcmdwYXJzZSI6ICJeMS4wLjciLAorICAgICAgICAiZXNwcmltYSI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAianMyeG1scGFyc2VyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzMnhtbHBhcnNlci8tL2pzMnhtbHBhcnNlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVA3WU9xZ2ljVkVENU1aOVJkZ3pOQitKSmx6TT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ4bWxjcmVhdGUiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImpzYm4iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNibi8tL2pzYm4tMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wZVpVd3VXaTNyWHlBZGxzNzd5b0RBN3k5Uk09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianNkb2MiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNkb2MvLS9qc2RvYy0zLjUuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNlB4QjY1VEFVNFdPMFd6eXIvNC9ZaGxHb3ZYbDBFVllmcEticFNyb1NqMHFCeFQ0L3hvZC9sNDBPcGttMzhkUkhSZFFnZGVZODM2TTB1Vm5KUUc3a2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhYnlsb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAgICJibHVlYmlyZCI6ICJ+My41LjAiLAorICAgICAgICAiY2F0aGFyc2lzIjogIn4wLjguOSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJ+MS4wLjUiLAorICAgICAgICAianMyeG1scGFyc2VyIjogIn4zLjAuMCIsCisgICAgICAgICJrbGF3IjogIn4yLjAuMCIsCisgICAgICAgICJtYXJrZWQiOiAifjAuMy42IiwKKyAgICAgICAgIm1rZGlycCI6ICJ+MC41LjEiLAorICAgICAgICAicmVxdWl6emxlIjogIn4wLjIuMSIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIn4yLjAuMSIsCisgICAgICAgICJ0YWZmeWRiIjogIjIuNi4yIiwKKyAgICAgICAgInVuZGVyc2NvcmUiOiAifjEuOC4zIgorICAgICAgfQorICAgIH0sCisgICAgImpzb24taW50NjQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1pbnQ2NC8tL2pzb24taW50NjQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlyVGc5c3dUb0VsaEVQRVRMTWRaa0V6RGhiWExzK2N4a3cvYjJyZ2xNUE9CbE0xREUwdXRIMUVSZVNNTGNucFlKazVpVXZEMTJyMGZQMi94SGl0RjVRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJub2RlLWludDY0IjogIjAuNC4wIgorICAgICAgfQorICAgIH0sCisgICAgImpzb24tc2NoZW1hIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24tc2NoZW1hLy0vanNvbi1zY2hlbWEtMC4yLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10SURJa3VXYUx3V1ZUT2NudlQ4cVRvZ3ZuaE09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zY2hlbWEtdHJhdmVyc2UvLS9qc29uLXNjaGVtYS10cmF2ZXJzZS0wLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteGJiQ0g1ZENZVTVUOExjRWhodWg3SEo4OEhYdVczcXNJM1kwek9aRktmWkVIY3BXaUhVL0p4ems2MjlCcnNhYi9tTWlIUXRpOXdNUCs4NDVSUGUzVmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeS8tL2pzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uYmUxbEphdFB6eis4d3AxRkMwdGt3clhKbEU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianNvbi1zdHJpbmdpZnktc2FmZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXN0cmluZ2lmeS1zYWZlLy0vanNvbi1zdHJpbmdpZnktc2FmZS01LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUVwYWkxWS9VWHhtZzlzNEIxbGNCNHNjMXR1cz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJqc3ByaW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNwcmltLy0vanNwcmltLTEuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTVQ1bXZCNWN3RzVEaThHM1Nad3VYRmFzdHFJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzc2VydC1wbHVzIjogIjEuMC4wIiwKKyAgICAgICAgImV4dHNwcmludGYiOiAiMS4zLjAiLAorICAgICAgICAianNvbi1zY2hlbWEiOiAiMC4yLjMiLAorICAgICAgICAidmVycm9yIjogIjEuMTAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJrbGF3IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tsYXcvLS9rbGF3LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2NFbzROeGM1QkFnRVZFWlR1dWN2NFdHVVBZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuOSIKKyAgICAgIH0KKyAgICB9LAorICAgICJsZXZuIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xldm4vLS9sZXZuLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT3dtU1R0K2ZDRHdFa1AzVXdMeEVJZUJIWk80PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInByZWx1ZGUtbHMiOiAifjEuMS4yIiwKKyAgICAgICAgInR5cGUtY2hlY2siOiAifjAuMy4yIgorICAgICAgfQorICAgIH0sCisgICAgImxvZGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMTcuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvZGFzaC8tL2xvZGFzaC00LjE3LjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jUUtoOGlnbzVRVWhaN2xnMzhEWVdBeE12alNBS0cwQTh3R1NWaW1QMDdTSVVFSzJVTythclNSS2JSWld0ZWxNdE41VjBIa3doNXJ5T3RvL1NzaFlJZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWFya2VkIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjE5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21hcmtlZC8tL21hcmtlZC0wLjMuMTkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVhMmVHV09xTnhQY1h2OGR5RVJkU3IvNkZtenZXd3pqTXhwZkdCL3NiTWNjWG9jdCt4WStZdWtQRCtRVFVad3l2SzdCWndjcjRtMjFXQk9XNDFwQWtnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1lLWRiIjogeworICAgICAgInZlcnNpb24iOiAiMS4zNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1lLWRiLy0vbWltZS1kYi0xLjM3LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVIzQzRkYjZiZ1FobEloUFU0OGZVdGRWbUtuZmxxK2hSZGFkN0l5S2h0RmowNlZQTlZkazJSaGlZTDNValFJbHNvOEwrWXhBdEZrb2JUMFZLK1MveWJnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1lLXR5cGVzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIxIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1lLXR5cGVzLy0vbWltZS10eXBlcy0yLjEuMjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTNpTDZEYndweUx6alIzeEhTRk5GZWI5TnovTThXRGtYMzN0MUdGUW5GT2xsV2s4cE9yaC9MU3JCNU9YbG5sVzVQOUxINzNYNmxvVy9lb2djK0Y1bEpnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW1lLWRiIjogIn4xLjM3LjAiCisgICAgICB9CisgICAgfSwKKyAgICAibWltaWMtZm4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltaWMtZm4vLS9taW1pYy1mbi0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItamY4NHV4endpdWlJVktpT0xwZllrN040NlRTeTh1YlRvbm1uZVk5dnJwSE5BbnAwUUJ0MkJ4V1Y5ZE8zL2orQm9WQWIrYTVHNllEUFczTTVIT2RNV1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1pbWljLXJlc3BvbnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbWljLXJlc3BvbnNlLy0vbWltaWMtcmVzcG9uc2UtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWo1RWN0bmtIN2FtZlYvcTVIZ21vYWwxZzJRSEZKUnJhT3RteDBKcElxa3hoQmhJL2xKU2wxbk1wUTQ1aFZhcndORVRPb1dFaW1uZFo0UUswUkh4dXhRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW5pbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1hdGNoLy0vbWluaW1hdGNoLTMuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15SkhWUUVoeXFQTFVUZ3Q5QjgzUFh1Nlczcng0TXZ2SHZTVXZUb29ncHdvR0RPVVEreURyUjBIUm90K3lPQ2RDTzd1NGhYM3BXZnQ2a1dCQmNxaDBVQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnJhY2UtZXhwYW5zaW9uIjogIl4xLjEuNyIKKyAgICAgIH0KKyAgICB9LAorICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMC4wLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oWC9LdjhNNWZTWWx1Q0tDWXVocXA2QVJzRjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWtkaXJwIjogeworICAgICAgInZlcnNpb24iOiAiMC41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWtkaXJwLy0vbWtkaXJwLTAuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUFWME9Pckd6MytNUjJmemhraldhWDExeVFNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogIjAuMC44IgorICAgICAgfQorICAgIH0sCisgICAgIm1zIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21zLy0vbXMtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WZ2l1cmZ3QXZtd3BBZDlmbUdGNGplRFZsOGc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibXV0ZS1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuNyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXV0ZS1zdHJlYW0vLS9tdXRlLXN0cmVhbS0wLjAuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1IWE9rN3dodVBxMFBodkUybjZCRmUwZWU2cz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJuYW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEwLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmFuLy0vbmFuLTIuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYkFkSnY3ZkJMaFdDKy9CbHMwT3phK212VGFOUXRQKzFSeWhoaHZEOTVwZ1VKejZYTTVJemdteE9rSXRKOXRrb0NpcGx2QW5YSTF0Tm1tVUQvZVNjeUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5hdHVyYWwtY29tcGFyZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9uYXR1cmFsLWNvbXBhcmUvLS9uYXR1cmFsLWNvbXBhcmUtMS40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TcjYvN3RkVUh5d25yUHNwdmJ2UlhJMWJwUGM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibmljZS10cnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmljZS10cnkvLS9uaWNlLXRyeS0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMW5oNDVkZWViNW9sTlk3ZVg4MkJrUE83U1N4UjVTU1lKaVBUclRkRlVWWXdBbDhDS01BNU45UGpUWWtIaVJqaXNWY3hjUTFIWGRMaHgycXh4SnpMTlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5vZGUtYWJpIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vZGUtYWJpLy0vbm9kZS1hYmktMi40LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFhL1VDNk5yMyt0cWhIR1JzQXV3L2VkejcvcTlubmV0QnJLV3hqNnJwVHRtKzBYOVQxcVU3bElFSE1TM3lOOUp3QWJSaUtVYlJSRnkxUEx6L3kzYWFBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzZW12ZXIiOiAiXjUuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm5vZGUtaW50NjQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9kZS1pbnQ2NC8tL25vZGUtaW50NjQtMC40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oNmtHWE5zMVhUR0MyUGxNNFJHSXVDWEdpanM9IgorICAgIH0sCisgICAgIm5vb3AtbG9nZ2VyIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vb3AtbG9nZ2VyLy0vbm9vcC1sb2dnZXItMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sS0t4WXp4UEV4ZFZNQWZZbG0vUTZFRzJwTUk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibm9wdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub3B0Ly0vbm9wdC0zLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXhrWmR2d2lyelUyeldURi9lYXhvcGtheWovaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhYmJyZXYiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJucG1sb2ciOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbnBtbG9nLy0vbnBtbG9nLTQuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0ydVVxYXp1S2xUYVNJL2RDOEF6aWNVY2s3K0lyRWFPbk4vZTBqZDNYdHQxS2NHcHd4MzB2NTBtTDdvUHlyL2g5YkwzRTRhWmNjVndwd1ArNVc5VmprZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJlLXdlLXRoZXJlLXlldCI6ICJ+MS4xLjIiLAorICAgICAgICAiY29uc29sZS1jb250cm9sLXN0cmluZ3MiOiAifjEuMS4wIiwKKyAgICAgICAgImdhdWdlIjogIn4yLjcuMyIsCisgICAgICAgICJzZXQtYmxvY2tpbmciOiAifjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm51bWJlci1pcy1uYW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbnVtYmVyLWlzLW5hbi8tL251bWJlci1pcy1uYW4tMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DWHRnSzFOQ0tsSXNHdnVIa0RHRE5wUWFBUjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2F1dGgtc2lnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYXV0aC1zaWduLy0vb2F1dGgtc2lnbi0wLjkuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZmV4aFVGRlBUR1Y4eWJBdFNJR2JWNmdPa1N2OFV0UmJEQm5BeUxRdzRRUEtrZ05sc0gyQnlQR3RNVXFkV2tvczZZQ1JtQXFWaXdnWnJKYy9tUkR6WlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1hc3NpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWFzc2lnbi8tL29iamVjdC1hc3NpZ24tNC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUW10eDVaWWg4L0FYTHZVUXNySXY3czJDR009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWluc3BlY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWluc3BlY3QvLS9vYmplY3QtaW5zcGVjdC0xLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR0p6ZkJaNkRnREFtbnVhTTMxMDRqUjRzMU15eHIzWTN6Zkl5TjR6M1VkcU42OW9TUmFjTks4VWhub2JEZEMrN0oyQUhDakd3eFF1Yk5KZkU3MFNYWFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1rZXlzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEyIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3Qta2V5cy8tL29iamVjdC1rZXlzLTEuMC4xMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRlRNeUZVbTJ3QmNHSG5IMmVYbXo3dEM2SXdscVFaNm1WWis2ZG02dlo0SVFJSGpzNkZkTnNRQnVLR1B1VVVVWTZOZkp3MlBzaEMwOFRuNkx6TERPYWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9uLWZpbmlzaGVkIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29uLWZpbmlzaGVkLy0vb24tZmluaXNoZWQtMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUEV6WklHd2c4MTFNM21Tb1dseHFpMlFhVWM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZWUtZmlyc3QiOiAiMS4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAib25jZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vbmNlLy0vb25jZS0xLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdEc2FwM1dXSFVzUk9zRjluRkM2NzUzWGE5RT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ3cmFwcHkiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJvbmV0aW1lIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29uZXRpbWUvLS9vbmV0aW1lLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQm5Rb0l3L1dkRU95ZVVzaXU2VW90b1o1WXRRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1pbWljLWZuIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvcHRpbWlzdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcHRpbWlzdC8tL29wdGltaXN0LTAuNi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMmo2blJvYjZJYUdhRVJ3eWJwRHJGYUFaWm9ZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogIn4wLjAuMSIsCisgICAgICAgICJ3b3Jkd3JhcCI6ICJ+MC4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIndvcmR3cmFwIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd29yZHdyYXAvLS93b3Jkd3JhcC0wLjAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vOVhhYk5YQXZBQUkwM0kwdTY4YjdXTUZrUWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAib3B0aW9uYXRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcHRpb25hdG9yLy0vb3B0aW9uYXRvci0wLjguMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5reGVRSjAvVFdNQjFzQzB3RnU2VUJnSzYyUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWVwLWlzIjogIn4wLjEuMyIsCisgICAgICAgICJmYXN0LWxldmVuc2h0ZWluIjogIn4yLjAuNCIsCisgICAgICAgICJsZXZuIjogIn4wLjMuMCIsCisgICAgICAgICJwcmVsdWRlLWxzIjogIn4xLjEuMiIsCisgICAgICAgICJ0eXBlLWNoZWNrIjogIn4wLjMuMiIsCisgICAgICAgICJ3b3Jkd3JhcCI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAib3MtaG9tZWRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy1ob21lZGlyLy0vb3MtaG9tZWRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS83eEppRE51RG9NOTRNRm94KzhWSVNHcWY3TT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvcy10bXBkaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3MtdG1wZGlyLy0vb3MtdG1wZGlyLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdStaMEJzZWFxRnhjL3NkbS9sYzBWVjM2RW5RPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhcnNldXJsIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhcnNldXJsLy0vcGFyc2V1cmwtMS4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0vQ2lkVHRpWk1SbEdEQlZpVXlZczNJM21XL009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1pcy1hYnNvbHV0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWlzLWFic29sdXRlLy0vcGF0aC1pcy1hYnNvbHV0ZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUYwdVNhSE5WTlArOGVzNXI5VHBhbmh0Y1gxOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWlzLWluc2lkZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWlzLWluc2lkZS8tL3BhdGgtaXMtaW5zaWRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTmxRWDN0NUVRdzBjRWE5aEFuK3M4SFM5L0ZNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgta2V5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgta2V5Ly0vcGF0aC1rZXktMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RUnl0dFhURm9VRFRwTEdSRFVEWURNbjBDMEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1wYXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLXBhcnNlLy0vcGF0aC1wYXJzZS0xLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR1NtT1QyRWJIcklOQmY5U1I3Q0RFTHdsSjhBRU5rM1FuN09pa0s0bkZZQXUzT3RlMitKWU5WdmtwQUVRbTMvVExORUpGRC94Wkpqenl4ZzNLQldPenc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBlcmZvcm1hbmNlLW5vdyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wZXJmb3JtYW5jZS1ub3cvLS9wZXJmb3JtYW5jZS1ub3ctMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Zd24wNE9YNmtUN0J4cE1IcmpaTFN6ZDhubnM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3BpZnkvLS9waWZ5LTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN1JRYWFzQkRxRW5xV0lTWTU5eW9zVk13NlF3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBpbmtpZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUvLS9waW5raWUtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jbFZyZ00rZzFJcVhUb0RuY2tqb0R0VDMrSEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llLXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlua2llLXByb21pc2UvLS9waW5raWUtcHJvbWlzZS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlUWFczNmVqV01CcHJKc1hoM1lvZ2loRkQvbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwaW5raWUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBsdXJhbGl6ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wbHVyYWxpemUvLS9wbHVyYWxpemUtNy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUFSaEJPZHpTM2U0MUZia1cvWFdyVEV0dWtxcUxvSzUrWi80VWVEYUx1U1crMzlKUGVGZ3M0Z0NHcXNySkhWWlgwZlVyeC8vNE9GMEsxQ1VHd2xJRm93PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcmVidWlsZC1pbnN0YWxsIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZWJ1aWxkLWluc3RhbGwvLS9wcmVidWlsZC1pbnN0YWxsLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi03dGF5eGVZYm9KWDBSYlZ6ZG5LeUdsMnZoUVJXcjZxZkNsRVhEaE9rWGp1YU9LQ3cycThhaXVGaE9OUllWc0cvY3ppYTdLaHB5a0lsSTJTMlZhUHVuQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGV0ZWN0LWxpYmMiOiAiXjEuMC4zIiwKKyAgICAgICAgImV4cGFuZC10ZW1wbGF0ZSI6ICJeMS4wLjIiLAorICAgICAgICAiZ2l0aHViLWZyb20tcGFja2FnZSI6ICIwLjAuMCIsCisgICAgICAgICJtaW5pbWlzdCI6ICJeMS4yLjAiLAorICAgICAgICAibWtkaXJwIjogIl4wLjUuMSIsCisgICAgICAgICJub2RlLWFiaSI6ICJeMi4yLjAiLAorICAgICAgICAibm9vcC1sb2dnZXIiOiAiXjAuMS4xIiwKKyAgICAgICAgIm5wbWxvZyI6ICJeNC4wLjEiLAorICAgICAgICAib3MtaG9tZWRpciI6ICJeMS4wLjEiLAorICAgICAgICAicHVtcCI6ICJeMi4wLjEiLAorICAgICAgICAicmMiOiAiXjEuMS42IiwKKyAgICAgICAgInNpbXBsZS1nZXQiOiAiXjIuNy4wIiwKKyAgICAgICAgInRhci1mcyI6ICJeMS4xMy4wIiwKKyAgICAgICAgInR1bm5lbC1hZ2VudCI6ICJeMC42LjAiLAorICAgICAgICAid2hpY2gtcG0tcnVucyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJwcmVsdWRlLWxzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZWx1ZGUtbHMvLS9wcmVsdWRlLWxzLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVpNcVZKOWVVdi9acUNmMWNPQkw1aXFYMmxRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByZXR0aWVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xNC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcmV0dGllci8tL3ByZXR0aWVyLTEuMTQuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcVpEVm5Dcm5wc1JKSnE1blNzaUhDRTNCWU1FRDJPdHNJK2Ntekl6RjFRSWZxbTVBTGY4dEVKY08yN3pWMWdLTktSUGRoak8wZE5XbnJ6c3NEUTF0Rmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByZXR0aWVyLWxpbnRlci1oZWxwZXJzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZXR0aWVyLWxpbnRlci1oZWxwZXJzLy0vcHJldHRpZXItbGludGVyLWhlbHBlcnMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdiSzJjUDlucmFTU1VGOU4yWHdVd3FmemxBRmxNTllZbCtTaEUvVitIOGE5dU5sL29VcUIxdzJFTDU0SmgwT2x5UlNkOFJmV1lKM2NvVlM0VFJPUDJ3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmYXN0LWRpZmYiOiAiXjEuMS4yIgorICAgICAgfQorICAgIH0sCisgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MtbmV4dGljay1hcmdzLy0vcHJvY2Vzcy1uZXh0aWNrLWFyZ3MtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU10RUMxVHFOMEVVNW5lcGhhSjRyQXRUaEh0Qzg2ZE5OOXFDdUVodHNodnBWQmtBVzVaTzdCQVNOOVJFbkY5ZW9YR2NSdWIrcEZ1S0VwT0hFK0hiRU13PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcm9ncmVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcm9ncmVzcy8tL3Byb2dyZXNzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PRSthNnZ6cWF6YytLNkx4SnJYNVVQeUtGdkduTDVDWW1xMmpGR05JQldIcGM0UXlFNDkvWU91bWNycFFGSnBmZWptdlJ0Ykp6Z08xelBtTUNxbGJCZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHNsIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMxIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wc2wvLS9wc2wtMS4xLjMxLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0vNnB0NCtDK1Qrd1pVaWVLUjYyME9wek4vTGxuTkt1V2p5MWlGTFEvVUczNUpxSGxSLzg5TVAxZDk2ZFVma2Y2RG5lM1R1TFF6T1lFWXNoSitIeDhtdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHVtcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdW1wLy0vcHVtcC0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcnVQTU5Sa04zTUhQMWNXSmM5T1dyK1QveERQMGpoWFlDTGZKY0J1WDU0aGhmSUJuYVFtQVVNZkRjRzRETTVVTVdCeUJiSlk2OVFTcGhtM2p0REtJa0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVuZC1vZi1zdHJlYW0iOiAiXjEuMS4wIiwKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4xIgorICAgICAgfQorICAgIH0sCisgICAgInB1bnljb2RlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1bnljb2RlLy0vcHVueWNvZGUtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVhSc1JqZGYrajVtbCt5LzZHS0hQWmJyRi84cDJZZ2EwSlB0ZHFUSVkyWGU1b2hKUEQ5c2FESkpMUHZwOStOU0JwclZ2ZXZkWFp5Ym5qMmN2OE9FZDBBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJxIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3EvLS9xLTEuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZmpMM1cwRTRFcEhRUmhIeHZ4UVFtc0FHVWRjPSIKKyAgICB9LAorICAgICJxcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9xcy8tL3FzLTYuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ONVpBWDQvTHhKbUYrN3dONzRwVUQ2cUFoOS93bnZkUWNqcTlUWmpldnZYelNVbzdiZm13OTFzYXFNanpHUzJ4cTkxL29kTjJkVy9XT2w3cVFITkRHQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuOCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmMvLS9yYy0xLjIuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteTNiR2dxS2ozUUJkeExiTGtvbWxvaGt2c0E4Z2RBaVVRbFNCSm5CaGZuK0JQeGc0YmM2MmQ4VGNCVzE1d2F2RGZnZXhDZ2NjY2toY1p2eXd5UVlQT3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZXAtZXh0ZW5kIjogIl4wLjYuMCIsCisgICAgICAgICJpbmkiOiAifjEuMy4wIiwKKyAgICAgICAgIm1pbmltaXN0IjogIl4xLjIuMCIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIn4yLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWluaW1pc3QiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzFBSXNnOUJPRDdzSDdrVTlNMWQ5NW9tUW9RPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0yLjMuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdFF0S0E5V0lBaEJGMytWTEFzZXlNcVplQmpXMEFISm94T3RZcVNVWk5KeGF1RXJtTGJWbTJGVzF5K0ovWUE5ZFVyQUMzOUlUZWpsWldoVkl3YXdrS3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4zIiwKKyAgICAgICAgImlzYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4yLjAuMCIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjEiLAorICAgICAgICAic3RyaW5nX2RlY29kZXIiOiAifjEuMS4xIiwKKyAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZWdleHBwIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlZ2V4cHAvLS9yZWdleHBwLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1sdjBNNitUa0RWbmlBM2FEMUVnMERWcGZVL2Jvb1N1N0VldjNURE8vbVpLSEJmVmpnQ0dUVjR0NGJ1cHBFU0VZRHRrQXJZRk94VEpXdjZTNUMraWFOdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVxdWVzdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuODguMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVxdWVzdC8tL3JlcXVlc3QtMi44OC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1OQXFCU3JpakdMWmRNMFdaTnNJbkxKcGtKb2tMNzJYWWpVcG5CMGl3c1JneGg3ZEI2Q09ySG5UQk53TjBFK2xIREFKenU3a0xBa0RlWTA4ejIvQTBoZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXdzLXNpZ24yIjogIn4wLjcuMCIsCisgICAgICAgICJhd3M0IjogIl4xLjguMCIsCisgICAgICAgICJjYXNlbGVzcyI6ICJ+MC4xMi4wIiwKKyAgICAgICAgImNvbWJpbmVkLXN0cmVhbSI6ICJ+MS4wLjYiLAorICAgICAgICAiZXh0ZW5kIjogIn4zLjAuMiIsCisgICAgICAgICJmb3JldmVyLWFnZW50IjogIn4wLjYuMSIsCisgICAgICAgICJmb3JtLWRhdGEiOiAifjIuMy4yIiwKKyAgICAgICAgImhhci12YWxpZGF0b3IiOiAifjUuMS4wIiwKKyAgICAgICAgImh0dHAtc2lnbmF0dXJlIjogIn4xLjIuMCIsCisgICAgICAgICJpcy10eXBlZGFycmF5IjogIn4xLjAuMCIsCisgICAgICAgICJpc3N0cmVhbSI6ICJ+MC4xLjIiLAorICAgICAgICAianNvbi1zdHJpbmdpZnktc2FmZSI6ICJ+NS4wLjEiLAorICAgICAgICAibWltZS10eXBlcyI6ICJ+Mi4xLjE5IiwKKyAgICAgICAgIm9hdXRoLXNpZ24iOiAifjAuOS4wIiwKKyAgICAgICAgInBlcmZvcm1hbmNlLW5vdyI6ICJeMi4xLjAiLAorICAgICAgICAicXMiOiAifjYuNS4yIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjEuMiIsCisgICAgICAgICJ0b3VnaC1jb29raWUiOiAifjIuNC4zIiwKKyAgICAgICAgInR1bm5lbC1hZ2VudCI6ICJeMC42LjAiLAorICAgICAgICAidXVpZCI6ICJeMy4zLjIiCisgICAgICB9CisgICAgfSwKKyAgICAicmVxdWlyZS11bmNhY2hlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXF1aXJlLXVuY2FjaGVkLy0vcmVxdWlyZS11bmNhY2hlZC0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVRnMVcxc2xtTDlNZVF3RWNTNVdxU1pWVUlkTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjYWxsZXItcGF0aCI6ICJeMC4xLjAiLAorICAgICAgICAicmVzb2x2ZS1mcm9tIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1aXp6bGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVxdWl6emxlLy0vcmVxdWl6emxlLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYVVQRFV3eE5tbjVHOGMzZFVjRlkvR2NNMjk0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiAifjEuNi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS42LjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaXppeERLemU5ak0zdUxKT1QvaHRSYTZsS2FnPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInJlc29sdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuNyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS8tL3Jlc29sdmUtMS4xLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JREVVMkNyU3hlMmVqZ1FSczVNb2RlaUo2WHM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVzb2x2ZS1mcm9tIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUtZnJvbS8tL3Jlc29sdmUtZnJvbS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUpzditrMTBhN3VxN0tidy81YTZ3SHBQVVFpWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXN0b3JlLWN1cnNvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXN0b3JlLWN1cnNvci8tL3Jlc3RvcmUtY3Vyc29yLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbjM3aWgvZ3YweWJVL1JZcEk5WWhLZTdnMzY4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9uZXRpbWUiOiAiXjIuMC4wIiwKKyAgICAgICAgInNpZ25hbC1leGl0IjogIl4zLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXN1bWVyIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc3VtZXIvLS9yZXN1bWVyLTAuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOGVqMFllUUdTNk9lZ3E4ODNDcU1pVDBIWjFrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInRocm91Z2giOiAifjIuMy40IgorICAgICAgfQorICAgIH0sCisgICAgInJpbXJhZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaW1yYWYvLS9yaW1yYWYtMi42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxyZWV3TEsvQmxnaG14dGZIMzZZWVZnMWk4SUFjZTRUSTdvYW83NUkxZzI0NSs2QmN0cVRWUWlCUDNZVUo5QzZEUU9YSm1rWVI5WDlmQ0x0Q09KYzV3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iIjogIl43LjAuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJydW4tYXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcnVuLWFzeW5jLy0vcnVuLWFzeW5jLTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQTNHclN1QzkxeURVRm0xOS9hWlA5NlJGcHNBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXByb21pc2UiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInJ4anMiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjMuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcnhqcy8tL3J4anMtNi4zLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUpUV21vWTl0V0NzN3p2SWsvQ3ZSamhqR2FPZCtPVkJNOTg3bXhGbytPVzY2Y0dwZEtqWmNwbWM3NEVTMXNCLy83S2wvUEFlOCt3RWFrdWhHNHBjZ093PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ0c2xpYiI6ICJeMS45LjAiCisgICAgICB9CisgICAgfSwKKyAgICAic2FmZS1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZS1idWZmZXIvLS9zYWZlLWJ1ZmZlci01LjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR2QyVVpCSkRrWGxZN0diSnhmc0U4L252S2tVRVUxRzM4YzFzaU42UVA2YTlQVDlNbUhCOEducHNjU21NSlNvRjhMT0lydDh1ZC93UHRvanlzNEc2K2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNhZmVyLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlci1idWZmZXIvLS9zYWZlci1idWZmZXItMi4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVlabzNLODJTRDdSaXlpMEUxRVFQb2pMejdrcGVwblNRSTlJeVBiSEhnMVhYWGV2YjVkSkk3dHB5TjJBRHhHY1FiSEc3dmN5UkhrMGNid3FjUXJpVXRnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzZW12ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2VtdmVyLy0vc2VtdmVyLTUuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SUzlSNlIzNU5ZZ1FuKytma0RXYU9tcUdvajRFazlnR3MrRFB4TlVaS3V3RTE4M3hqSnJvS3Z5bzFJelZGZVh2VXJ2bUFMeTZGV0Q1eHJkSlQyNWdNZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2V0LWJsb2NraW5nIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NldC1ibG9ja2luZy8tL3NldC1ibG9ja2luZy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJGK1hndEFScnBwb0E5M1RnckpEa3JQWWtQYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaGViYW5nLWNvbW1hbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1jb21tYW5kLy0vc2hlYmFuZy1jb21tYW5kLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUktyR1cybGJBem1KYU1PZk5qL3VYZXI5OGVvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNoZWJhbmctcmVnZXgiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNoZWJhbmctcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1yZWdleC8tL3NoZWJhbmctcmVnZXgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0ya0wwbDBEQXRDMnl5cGNvVnh5eGtNbU8vcU09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2lnbmFsLWV4aXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2lnbmFsLWV4aXQvLS9zaWduYWwtZXhpdC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRmM0FqeEtINmhGNFlvNUJYaVVUSzNOa2JHMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaW1wbGUtY29uY2F0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NpbXBsZS1jb25jYXQvLS9zaW1wbGUtY29uY2F0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYzBUTHVMYmliN0o5WnJMOGh2bjIxWmwxSWNZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpbXBsZS1nZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjguMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2ltcGxlLWdldC8tL3NpbXBsZS1nZXQtMi44LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxTU0hSU3czbVFOVUdQQVlScW83eHk5ZGhLbXhGWElqTGpwNEtIcGY5OUdFSDJWSDdDM0FNK1FmeDZkdTZqaGZVaTZWbTdYbmJFVkVmN1diNk44alJ3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWNvbXByZXNzLXJlc3BvbnNlIjogIl4zLjMuMCIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMSIsCisgICAgICAgICJzaW1wbGUtY29uY2F0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzbGljZS1hbnNpIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NsaWNlLWFuc2kvLS9zbGljZS1hbnNpLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1QT3F4Qks2TGIzcTZzMDQ3RC9Yc0RWTlBuRjlEbDhKU2FxZTloOWxVUmwwT2ROcXkvdWpEck9pSUh0c3FYTUdiV1dUSW9tUnpBTWFUeWF3QVUvL1JlZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNvdXJjZS1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC8tL3NvdXJjZS1tYXAtMC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0ycmMvdlB3cnFCbTAzZ085YjI2cVNCWkxQNTA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFtZGVmaW5lIjogIj49MC4wLjQiCisgICAgICB9CisgICAgfSwKKyAgICAic3ByaW50Zi1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcHJpbnRmLWpzLy0vc3ByaW50Zi1qcy0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJPYVNiMllvbFRWUFBkQVZJRFl6dUZjcGZpdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzc2hwayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3NocGsvLS9zc2hway0xLjE2LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUhYWHFWVXE3K3BjS2VMcXFaajZtSEZVTXZYdE9KdDF1b1V4MDlwRlc2MDExaW5UTXhxSThCQThQTTk1bXlySXl5S3dkbnpqZEZqTGlFNktCUFZ0SklnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc24xIjogIn4wLjIuMyIsCisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAiYmNyeXB0LXBia2RmIjogIl4xLjAuMCIsCisgICAgICAgICJkYXNoZGFzaCI6ICJeMS4xMi4wIiwKKyAgICAgICAgImVjYy1qc2JuIjogIn4wLjEuMSIsCisgICAgICAgICJnZXRwYXNzIjogIl4wLjEuMSIsCisgICAgICAgICJqc2JuIjogIn4wLjEuMCIsCisgICAgICAgICJzYWZlci1idWZmZXIiOiAiXjIuMC4yIiwKKyAgICAgICAgInR3ZWV0bmFjbCI6ICJ+MC4xNC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0YXR1c2VzIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0YXR1c2VzLy0vc3RhdHVzZXMtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rdlVibnJkS3J2T3pyUFN0WDJHcjhreTN1VDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3RyaW5nLXdpZHRoIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZy13aWR0aC8tL3N0cmluZy13aWR0aC0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbk9xSDU5ZGVDcTlTUkhseHExQXc4NUpudDR3Nkt2TEtxV1ZpazZvQTlaa2xYTE5JT2xxZzRGMnlyVDFNVmFUakFxdlZ3ZGZlWjd3N2FDdkpEN3Vna3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogIl4yLjAuMCIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpbmcucHJvdG90eXBlLnRyaW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nLnByb3RvdHlwZS50cmltLy0vc3RyaW5nLnByb3RvdHlwZS50cmltLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMEUzaXlKNFRmMDE5SUc4SWExN1MrdWErak9vPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0aWVzIjogIl4xLjEuMiIsCisgICAgICAgICJlcy1hYnN0cmFjdCI6ICJeMS41LjAiLAorICAgICAgICAiZnVuY3Rpb24tYmluZCI6ICJeMS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbi9TaG52RGk2RkhiYlZmdmlybytXb2ppRnp2K3M4TVBNSEJjelZlUGZVcERKTHdvTFQwaHQxbDRZd0JDYmk4cEpBdmVFRWRua0h5UHlUUC9telJmd2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIn41LjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpcC1hbnNpIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWFuc2kvLS9zdHJpcC1hbnNpLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUVlUUl1c2F3MmlvY1RpYlkxSml4UVh1Tm84PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtanNvbi1jb21tZW50cy8tL3N0cmlwLWpzb24tY29tbWVudHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QRk1aUXVrSXdtbDhEc05FaFl3b2JIeWdwZ289IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjUuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci01LjUuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUWpWandkWEl0NDA4TUlpQXFDWDRvVUtzZ1UyRXFBR3pzMlBwa200YVFZYmptK1pFV0VjVzRTZkZOVHI0dU1OWm1hMGV5NGY1bGdMcmtCMGFYMFFNb3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy1mbGFnIjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0YWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YWJsZS8tL3RhYmxlLTUuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lNTQyaW4yMlpMaEQvZk9JdVhzLzh5RFo5VzYxbHRGOGRhTTg4cmtSTnRnVEljdCt2STJmVG5BeXUvRGIyVENmRWNJOGk3bWpaejZtZUxxMG5XN1RZZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWp2IjogIl42LjUuMyIsCisgICAgICAgICJsb2Rhc2giOiAiXjQuMTcuMTAiLAorICAgICAgICAic2xpY2UtYW5zaSI6ICIxLjAuMCIsCisgICAgICAgICJzdHJpbmctd2lkdGgiOiAiXjIuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInRhZmZ5ZGIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFmZnlkYi8tL3RhZmZ5ZGItMi42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mTHkyUzFvVUcyb3UvQ3hkTEdlMDRWQ3lvbWc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidGFwZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuOS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YXBlLy0vdGFwZS00LjkuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNmZLSVhrbkxwb2UvSnA0cnpIS0ZQcEpVSERIRHFuOGp1czk5SWZQbkhJanl6NzhIWWxlZlRHRDNiNUVrYlF6dUxmYUV2bWZQSzNJb2xMZ3EyeFQza3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZXAtZXF1YWwiOiAifjEuMC4xIiwKKyAgICAgICAgImRlZmluZWQiOiAifjEuMC4wIiwKKyAgICAgICAgImZvci1lYWNoIjogIn4wLjMuMyIsCisgICAgICAgICJmdW5jdGlvbi1iaW5kIjogIn4xLjEuMSIsCisgICAgICAgICJnbG9iIjogIn43LjEuMiIsCisgICAgICAgICJoYXMiOiAifjEuMC4zIiwKKyAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICJtaW5pbWlzdCI6ICJ+MS4yLjAiLAorICAgICAgICAib2JqZWN0LWluc3BlY3QiOiAifjEuNi4wIiwKKyAgICAgICAgInJlc29sdmUiOiAifjEuNy4xIiwKKyAgICAgICAgInJlc3VtZXIiOiAifjAuMC4wIiwKKyAgICAgICAgInN0cmluZy5wcm90b3R5cGUudHJpbSI6ICJ+MS4xLjIiLAorICAgICAgICAidGhyb3VnaCI6ICJ+Mi4zLjgiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJyZXNvbHZlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNy4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS8tL3Jlc29sdmUtMS43LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jN3J3TG9mcDhnMVUraDFLTnlITC9qaWNyS2cxRWs0cStMcjMzQUw2NXVaVGluVVpIZTMwRDVIbHlONVY5TlcwSlgxRDVkWFE0anFXNWw3U3kva0dmdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAicGF0aC1wYXJzZSI6ICJeMS4wLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidGFyLWZzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xNi4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YXItZnMvLS90YXItZnMtMS4xNi4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1OdkNlWHBZeDdPc21PaDh6SU9QL2ViRzU1elpteExFMGV0ZldSYldvaytxMlFvOHgvdk9SL0lKVDF0YUFEWFBlK2pzaXU5YXhEYjNYNEIraUlnTmxLdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hvd25yIjogIl4xLjAuMSIsCisgICAgICAgICJta2RpcnAiOiAiXjAuNS4xIiwKKyAgICAgICAgInB1bXAiOiAiXjEuMC4wIiwKKyAgICAgICAgInRhci1zdHJlYW0iOiAiXjEuMS4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJwdW1wIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHVtcC8tL3B1bXAtMS4wLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi04azBKdXBXbWU1NSs5dENWRStGUzVVTFQzSzZBYmdxckdhNThsVFQ0OVJweWZ3d2NHZWRIcWFDNUxsUU5kRUF1bW4vd0ZzdTZhUHdrdVBNaW95OGtxdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZW5kLW9mLXN0cmVhbSI6ICJeMS4xLjAiLAorICAgICAgICAgICAgIm9uY2UiOiAiXjEuMy4xIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInRhci1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFyLXN0cmVhbS8tL3Rhci1zdHJlYW0tMS42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXJ6UzBoZWlOZjhYbjcvbXBkU1ZWU01BV0FveTliZmIxV09UWUM3OFowVVFLZUthL0NXUzhGT3EwbEtHTmE4RFdLQW45Z3hqQ3ZNTFljNVBHWFlsSzJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJibCI6ICJeMS4wLjAiLAorICAgICAgICAiYnVmZmVyLWFsbG9jIjogIl4xLjIuMCIsCisgICAgICAgICJlbmQtb2Ytc3RyZWFtIjogIl4xLjAuMCIsCisgICAgICAgICJmcy1jb25zdGFudHMiOiAiXjEuMC4wIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4zLjAiLAorICAgICAgICAidG8tYnVmZmVyIjogIl4xLjEuMSIsCisgICAgICAgICJ4dGVuZCI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidGV4dC10YWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90ZXh0LXRhYmxlLy0vdGV4dC10YWJsZS0wLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWYxN29JNjZBVWdmQUN2TGZTb1RzUDgrbGNMUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0aHJvdWdoIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGhyb3VnaC8tL3Rocm91Z2gtMi4zLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EZFRKLzZxOE5YbGdzYmNrRVYxK0RvYWk0ZlU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidG1wIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjMzIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90bXAvLS90bXAtMC4wLjMzLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qUkNKbG9qS25aM2FkZHRUT2pkSXFvUnVQRUtCdk5YY0dZcXpPNnpXWlg4S2ZLRXBuR1k1amZnZ0pRM0VqS3V1OEQ0YkpScjB5K2NZSkZtWWJJbVhHdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib3MtdG1wZGlyIjogIn4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG8tYnVmZmVyLy0vdG8tYnVmZmVyLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1seDlCNWl2N21zdUZZRTNkeXRUK0tFNXRhcCtyTll3K0s0alZrYjlSL2FzQWIrcGJCU00xN2p0dW5IcGxoQmU2UlJKZFp4M1BuMkpwaDI0TzMybU9WZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidG91Z2gtY29va2llIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RvdWdoLWNvb2tpZS8tL3RvdWdoLWNvb2tpZS0yLjQuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUTVzcmsvNHZETTU0V0pzSmlvM1hObjZLMnNDRytDUThHNVd6NmJaaFJab0FlLytUeGpXQi9HbEZBbllFYmtZVmxPTjlGTWsvZkUzaDJSTHBQWG80bFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBzbCI6ICJeMS4xLjI0IiwKKyAgICAgICAgInB1bnljb2RlIjogIl4xLjQuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAicHVueWNvZGUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdW55Y29kZS8tL3B1bnljb2RlLTEuNC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXdOV21PeWNZZ0FyWTRlc1BwU2FjaE4xQmhGND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ0c2xpYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90c2xpYi8tL3RzbGliLTEuOS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi00a3JGOHNjcGVqaGFPZ3F6QkVjR003eURJRWZpMC84Kzh6RFJaaE5aWjJram1ISjRodjN6Q2JRV3hvSkd6MWl3NVUwSmwwbm1hMTN4ekhYY25jTWF2UT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidHVubmVsLWFnZW50IjogeworICAgICAgInZlcnNpb24iOiAiMC42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R1bm5lbC1hZ2VudC8tL3R1bm5lbC1hZ2VudC0wLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUo2WGVvR3Myc0VvS21XWjNTeWtJYVBEOFFQMD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAidHdlZXRuYWNsIjogeworICAgICAgInZlcnNpb24iOiAiMC4xNC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90d2VldG5hY2wvLS90d2VldG5hY2wtMC4xNC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV3VhQmQvR1MxRVZpYWRFSXI2ay8rSFEvVDJRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInR5cGUtY2hlY2siOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHlwZS1jaGVjay8tL3R5cGUtY2hlY2stMC4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XSVRLdFJMUEhUVmVQN2VFOHdnRXNyVWcyM0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHJlbHVkZS1scyI6ICJ+MS4xLjIiCisgICAgICB9CisgICAgfSwKKyAgICAidHlwZXNjcmlwdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90eXBlc2NyaXB0Ly0vdHlwZXNjcmlwdC0zLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdERNWWZWdHZwYjk2bXNTMWxEWDlNRWRIclc0eU91WjRLZGM0SGltOW9VNzk2WGxkUFlGL3QyK3VLb1gwQkJhMGhYWHdEbHFZUWJYWTVSemp6YzVoQkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVnbGlmeS1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91Z2xpZnktanMvLS91Z2xpZnktanMtMy40LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLThDSnNiS090RWJuSnNUeXY2TEU2bTZaS25pcU1pRldtbTlzUmJvcGJrR3MzZ01QUGZkM0ZoOGlJQTRZa3Y1TWdhVGJxSHI0QmFvR0xKTFpOaHNyVzFRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29tbWFuZGVyIjogIn4yLjE3LjEiLAorICAgICAgICAic291cmNlLW1hcCI6ICJ+MC42LjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImNvbW1hbmRlciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjE3LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21tYW5kZXIvLS9jb21tYW5kZXItMi4xNy4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItd1BNVXQ2Rm5IMnl6Rzk1U0E2bXpqUU9FS1VVM2FMYURFbXpzMXRpKzFFOWgrQ3NyWmdoUmxxRU0vRUo0S3Njc1FWRzh1Tk40dVZyZVVlVDgrZHJsZ2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAic291cmNlLW1hcCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjYuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAvLS9zb3VyY2UtbWFwLTAuNi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItVWpnYXB1bVdsYk1oa0JnelQ3WWtjNVlYVVQ0NkYwaUt1OFNHWHEwYmN3UDVkei9oMFBsajZlbkpxanoxWmJxMmw1V2FxWW5yVmJ3V09XTXlGM0Y0N2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5kZXJzY29yZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjguMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVR6KzFPeEJ1WUpmOCtjdEJDZktsNmIzNlVDST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS1jb250cmliLy0vdW5kZXJzY29yZS1jb250cmliLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmx0bXdrZUQrUG9yR01uNHk3RGl4OVNNSnNjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiAiMS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5waXBlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VucGlwZS8tL3VucGlwZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXNyOU82RkZLcm1GbHRJRjRLZEliTHZTWkJPdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1cmktanMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXJpLWpzLy0vdXJpLWpzLTQuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1LWTlGcm1pcnFsOTFYMlFnanJ5MFdkNFkrWVRkcmRaaGVTOFRGd3ZrYkxXZi9HNUtOSkRDaDZwS0w1T1pjdEVXNCswQmFhNWlkSzJaUXVFTFJ3UHpuUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHVueWNvZGUiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInV0Zi04LXZhbGlkYXRlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V0Zi04LXZhbGlkYXRlLy0vdXRmLTgtdmFsaWRhdGUtNC4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUNTNjNTc3A2enluQlE0SXhWemdqUDVBYmRvNkx1Sjg3SEZJY2dJaVZVZVk5NitNVEhrcUt0clVocGhid1E2alg4YVNHWnY4elg2bDFEQ1BwZmNBbnhBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiaW5kaW5ncyI6ICJ+MS4zLjAiLAorICAgICAgICAibmFuIjogIn4yLjEwLjAiLAorICAgICAgICAicHJlYnVpbGQtaW5zdGFsbCI6ICJ+NC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidXRpbC1kZXByZWNhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXRpbC1kZXByZWNhdGUvLS91dGlsLWRlcHJlY2F0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVJRMU55ZnB3M25Nbll2dlMxS0tKZ1VHYURNOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1dGlscy1tZXJnZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dGlscy1tZXJnZS8tL3V0aWxzLW1lcmdlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbjVWeEQxQ2laNVI3TE13U1IwSEJBb1FuNXhNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInV1aWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXVpZC8tL3V1aWQtMy4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlYSm1lTmF3M0RubktBT0tKRTUxc0wvWmFZZldKUmwxcEs5ZHIxOVlGQ3UwT2JTMjMxQUIxL0xicVRLUkFRNWt3OEE5MHJBNmZyNHJpT1VwVFp2UVpBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ2YWxpZC11cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdmFsaWQtdXJsLy0vdmFsaWQtdXJsLTEuMC45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSEJSSG0wRHhPWHAxZUM4UlhrQ0dSSFF6b2dBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInZlcnJvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdmVycm9yLy0vdmVycm9yLTEuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9oQmNvWEJUcjFYVzRuREIrQ2lHZ3VHTnBBQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAiY29yZS11dGlsLWlzIjogIjEuMC4yIiwKKyAgICAgICAgImV4dHNwcmludGYiOiAiXjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgIndoaWNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3doaWNoLy0vd2hpY2gtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUh4SmRZV3ExTVRJUWJKM253MGNxc3NIb1ROVTI2N0tsckR1R1oxV1lseERTdFV0S1VoT2FKbWgxMTIvVFptSHh4VWZ1SnFQWFNPbTd0RHlhczBPU0lRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc2V4ZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAid2hpY2gtcG0tcnVucyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aGljaC1wbS1ydW5zLy0vd2hpY2gtcG0tcnVucy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVp3czYrOFZTNExWZDlyZDRES2RHRmZJNjBjcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3aWRlLWFsaWduIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dpZGUtYWxpZ24vLS93aWRlLWFsaWduLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RR2tPUWM4WEw2QnQ1UHduc0V4S0JQdU1LQnhuR3hXV1czZlU1NVh0NGZlSG96TVVoZFVNYUJDazI5MHFwbS93RzV1L1JTS3p3ZEFDNGk1MVlpZ2loQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3RyaW5nLXdpZHRoIjogIl4xLjAuMiB8fCAyIgorICAgICAgfQorICAgIH0sCisgICAgIndvcmR3cmFwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dvcmR3cmFwLy0vd29yZHdyYXAtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KMWhJRUlrVVZxUVhISTBDSmtRYTNwREx5dXM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3JhcHB5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dyYXBweS8tL3dyYXBweS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRTUTlqejdCcWpYeE5rWUZ2QTBRTnVNS3RwOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3cml0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cml0ZS8tL3dyaXRlLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWDhBNEtPSmt6cVAra1VWVWR2ZWp4V2JMQjFjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1rZGlycCI6ICJeMC41LjEiCisgICAgICB9CisgICAgfSwKKyAgICAid3MiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd3MvLS93cy01LjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItamFIRkQ2UEZ2NlVnb0lWZGE2cVpsbHB0UXNNbERFSmtUUWN5Ynp6WERZTTFYTzlZOGVtNjkxRkdNUG1NNDZXR3lMVTR6OUtNZ1FOK3FydXgvbmhsSEE9PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYy1saW1pdGVyIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ4bWxjcmVhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveG1sY3JlYXRlLy0veG1sY3JlYXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK212M1lxWUtRVCt6M1k5TEE4V3lhU09OTUk4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3h0ZW5kLy0veHRlbmQtNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wY2JWTXI1bGJpUGJnZzc3bERvZkJKbU5ZNjg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlLmpzb24gYi9wYWNrYWdlLmpzb24KaW5kZXggN2NjMWVmOS4uNjM5M2VlNyAxMDA2NDQKLS0tIGEvcGFja2FnZS5qc29uCisrKyBiL3BhY2thZ2UuanNvbgpAQCAtNCw5ICs0LDkgQEAKICAgImhvbWVwYWdlIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8iLAogICAicmVwb3NpdG9yeSI6IHsKICAgICAidHlwZSI6ICJnaXQiLAotICAgICJ1cmwiOiAiaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQiCisgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCiAgIH0sCi0gICJ2ZXJzaW9uIjogIjAuOS4zIiwKKyAgInZlcnNpb24iOiAiMC4xMy4wIiwKICAgImF1dGhvciI6IHsKICAgICAibmFtZSI6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMiLAogICAgICJlbWFpbCI6ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLApAQCAtMjMsMjggKzIzLDQ4IEBACiAgICAgIm1haWwiOiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiwKICAgICAidXJsIjogImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUIgogICB9LAorICAiZmlsZXMiOiBbCisgICAgImxpYi9ub2RlanMvbGliL3RocmlmdCIsCisgICAgImxpYi9ub2RlanMvUkVBRE1FLm1kIgorICBdLAogICAiZGlyZWN0b3JpZXMiOiB7CiAgICAgImxpYiI6ICIuL2xpYi9ub2RlanMvbGliL3RocmlmdCIKICAgfSwKKyAgImJyb3dzZXIiOiAiLi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnJvd3Nlci5qcyIsCiAgICJtYWluIjogIi4vbGliL25vZGVqcy9saWIvdGhyaWZ0IiwKICAgImVuZ2luZXMiOiB7Ci0gICAgIm5vZGUiOiAiPj0gMC4yLjQiCisgICAgIm5vZGUiOiAiPj0gNC4xLjAiCiAgIH0sCiAgICJkZXBlbmRlbmNpZXMiOiB7Ci0gICAgIm5vZGUtaW50NjQiOiAifjAuMy4wIiwKLSAgICAicSI6ICIxLjAueCIsCi0gICAgIndzIjogIn4wLjQuMzIiCisgICAgIm5vZGUtaW50NjQiOiAiXjAuNC4wIiwKKyAgICAicSI6ICJeMS41LjAiLAorICAgICJ3cyI6ICJeNS4wLjAiCiAgIH0sCiAgICJkZXZEZXBlbmRlbmNpZXMiOiB7Ci0gICAgImJ1ZmZlci1lcXVhbHMiOiAiXjEuMC4zIiwKLSAgICAiY29tbWFuZGVyIjogIjIuMS54IiwKLSAgICAiY29ubmVjdCI6ICIyLjcueCIsCi0gICAgImlzdGFuYnVsIjogIl4wLjMuNSIsCi0gICAgInJ1bi1icm93c2VyIjogIl4yLjAuMSIsCi0gICAgInRhcGUiOiAifjMuNS4wIgorICAgICJidWZmZXItZXF1YWxzIjogIl4xLjAuNCIsCisgICAgImNvbW1hbmRlciI6ICJeMi4xNC4xIiwKKyAgICAiY29ubmVjdCI6ICJeMy42LjYiLAorICAgICJlc2xpbnQiOiAiXjUuNy4wIiwKKyAgICAiZXNsaW50LWNvbmZpZy1wcmV0dGllciI6ICJeMy4xLjAiLAorICAgICJlc2xpbnQtcGx1Z2luLXByZXR0aWVyIjogIl4zLjAuMCIsCisgICAgImh0bWwtdmFsaWRhdG9yLWNsaSI6ICJeNC4xLjQiLAorICAgICJpc3RhbmJ1bCI6ICJeMC40LjUiLAorICAgICJqc2RvYyI6ICJeMy41LjUiLAorICAgICJqc29uLWludDY0IjogIl4xLjAuMCIsCisgICAgInByZXR0aWVyIjogIl4xLjE0LjMiLAorICAgICJ0YXBlIjogIl40LjkuMCIsCisgICAgInV0Zi04LXZhbGlkYXRlIjogIl40LjAuMCIsCisgICAgInR5cGVzY3JpcHQiOiAiXjMuMS42IiwKKyAgICAiQHR5cGVzL25vZGUiOiAiXjEwLjEyLjYiLAorICAgICJAdHlwZXMvbm9kZS1pbnQ2NCI6ICJeMC40LjI5IiwKKyAgICAiQHR5cGVzL3EiOiAiXjEuNS4xIgogICB9LAogICAic2NyaXB0cyI6IHsKICAgICAiY292ZXIiOiAibGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2ggQ09WRVIiLAotICAgICJ0ZXN0IjogImxpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoIgorICAgICJ0ZXN0IjogImxpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoIiwKKyAgICAidGVzdC10cyI6ICJsaWIvbm9kZXRzL3Rlc3QvdGVzdEFsbC5zaCIsCisgICAgInByZXR0aWVyIjogInByZXR0aWVyIC0td3JpdGUgJyoqLyouanMnIiwKKyAgICAibGludCI6ICJlc2xpbnQgbGliL25vZGVqcy8uIC0tZXh0IC5qcyIsCisgICAgImxpbnQtdGVzdHMiOiAiZXNsaW50IGxpYi9ub2RlanMvdGVzdC8uIC0tZXh0IC5qcyIKICAgfQogfQpkaWZmIC0tZ2l0IGEvcGhwY3MueG1sLmRpc3QgYi9waHBjcy54bWwuZGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAzODhhCi0tLSAvZGV2L251bGwKKysrIGIvcGhwY3MueG1sLmRpc3QKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cnVsZXNldCBuYW1lPSJBcGFjaGVfVGhyaWZ0Ij4KKyAgICA8ZGVzY3JpcHRpb24+VGhlIGNvZGluZyBzdGFuZGFyZCBmb3IgdGhyaWZ0LjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZmlsZT5saWIvcGhwL2xpYjwvZmlsZT4KKyAgICA8ZmlsZT5saWIvcGhwL3Rlc3Q8L2ZpbGU+CisgICAgPGV4Y2x1ZGUtcGF0dGVybj5saWIvcGhwL3Rlc3QvcGFja2FnZXMvKjwvZXhjbHVkZS1wYXR0ZXJuPgorCisgICAgPGFyZyBuYW1lPSJiYXNlcGF0aCIgdmFsdWU9Ii4iLz4KKyAgICA8YXJnIG5hbWU9ImNvbG9ycyIgLz4KKyAgICA8YXJnIG5hbWU9InBhcmFsbGVsIiB2YWx1ZT0iNCIgLz4KKworICAgIDxydWxlIHJlZj0iUFNSMiI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IlBTUjIuTWV0aG9kcy5NZXRob2REZWNsYXJhdGlvbi5VbmRlcnNjb3JlIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IlBTUjIuQ2xhc3Nlcy5Qcm9wZXJ0eURlY2xhcmF0aW9uLlVuZGVyc2NvcmUiLz4KKyAgICA8L3J1bGU+CisKKyAgICA8cnVsZSByZWY9IlBTUjEuRmlsZXMuU2lkZUVmZmVjdHMiPgorICAgICAgICA8ZXhjbHVkZS1wYXR0ZXJuPmxpYi9waHAvdGVzdC8qPC9leGNsdWRlLXBhdHRlcm4+CisgICAgPC9ydWxlPgorICAgIDxydWxlIHJlZj0iR2VuZXJpYy5GaWxlcy5MaW5lTGVuZ3RoIj4KKyAgICAgICAgPGV4Y2x1ZGUtcGF0dGVybj5saWIvcGhwL3Rlc3QvKjwvZXhjbHVkZS1wYXR0ZXJuPgorICAgIDwvcnVsZT4KKworPC9ydWxlc2V0PgpkaWZmIC0tZ2l0IGEvcmF0X2V4Y2x1ZGUgYi9yYXRfZXhjbHVkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhZmU4Yi4uMDAwMDAwMAotLS0gYS9yYXRfZXhjbHVkZQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS5naXRpZ25vcmUKLUNIQU5HRVMKLUNPTlRSSUJVVE9SUwotYXV0b3NjYW4ubG9nCi1jb25maWcuZ3Vlc3MKLWNvbmZpZy5sb2cKLWNvbmZpZy5zdGF0dXMKLWNvbmZpZy5zdWIKLWNvbmZpZ3VyZQotY29uZmlndXJlLnNjYW4KLWRlcGNvbXAKLWluc3RhbGwtc2gKLWxpYnRvb2wKLWx0bWFpbi5zaAotbWlzc2luZwotc3RhbXAtaDEKLXlsd3JhcAotKi5tNAotYXV0b200dGUuY2FjaGUKLXRocmlmdHkuaAotdGhyaWZ0eS5oaAotdmVyc2lvbi5oCi12ZXJzaW9uLmguaW4KLW1kNS5jCi1tZDUuaAotZG9jCi1saWIvZXJsL3Zzbi5tawotL2xpYi9lcmwvYnVpbGQvKiovKgotbGliL2VybC9zcmMvTWFrZWZpbGUKLXRocmlmdC5hcHB1cC5zcmMKLU9DYW1sTWFrZWZpbGUKLVJFQURNRS1PQ2FtbE1ha2VmaWxlCi1UT0RPCi1NYW5pZmVzdAotc2V0dXAucmIKZGlmZiAtLWdpdCBhL3NvbmFyLXByb2plY3QucHJvcGVydGllcyBiL3NvbmFyLXByb2plY3QucHJvcGVydGllcwppbmRleCAyMWZlYzNkLi5hMjM4MTk3IDEwMDc1NQotLS0gYS9zb25hci1wcm9qZWN0LnByb3BlcnRpZXMKKysrIGIvc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzCkBAIC0xNiw3ICsxNiw3IEBACiBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkgYmV0d2VlbiBhbGwgbWFqb3IgbGFuZ3VhZ2VzLgogCiAjIEFwYWNoZSBUaHJpZnQgVmVyc2lvbgotc29uYXIucHJvamVjdFZlcnNpb249MC45LjMKK3NvbmFyLnByb2plY3RWZXJzaW9uPTAuMTMuMAogIyB1c2UgdGhpcyB0byBzZXQgYW5vdGhlciB2ZXJzaW9uIHN0cmluZwogIyAkIHNvbmFyLXJ1bm5lciAtRCBzb25hci5wcm9qZWN0VmVyc2lvbj1gZ2l0IHJldi1wYXJzZSBIRUFEYAogIyBzZXQgcHJvamVjdERhdGUgaW4gY29tYmluYXRpb24gd2l0aCBwcm9qZWN0VmVyc2lvbiBmb3IgaW1wb3J0cyBvZiBvbGQgcmVsZWFzZXMKQEAgLTMxLDcgKzMxLDcgQEAKIHNvbmFyLnNvdXJjZUVuY29kaW5nPVVURi04CiAKICMgc2NtCi1zb25hci5zY20udXJsPXNjbTpnaXQ6aHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdAorc29uYXIuc2NtLnVybD1zY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdAogCiAjIGNwcGNoZWNrIC1xIC0tZXJyb3ItZXhpdGNvZGU9MCAtLXhtbCAuIDI+IGNwcGNoZWNrLXJlc3VsdC54bWwKIHNvbmFyLmN4eC5jcHBjaGVjay5yZXBvcnRQYXRoPWNwcGNoZWNrLXJlc3VsdC54bWwKQEAgLTU0LDE1ICs1NCwxNSBAQAogbW9kdWxlMS5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvamF2YQogbW9kdWxlMS5zb25hci5zb3VyY2VzPXNyYwogbW9kdWxlMS5zb25hci50ZXN0cz10ZXN0Ci1tb2R1bGUxLnNvbmFyLmJpbmFyaWVzPWJ1aWxkL2xpYnRocmlmdC0xLjAuMC5qYXIKLW1vZHVsZTEuc29uYXIubGlicmFyaWVzPWJ1aWxkL2xpYi8qLmphcgorbW9kdWxlMS5zb25hci5iaW5hcmllcz1idWlsZC9saWJzL2xpYnRocmlmdC0wLjEzLjAuamFyCittb2R1bGUxLnNvbmFyLmxpYnJhcmllcz1idWlsZC9kZXBzLyouamFyCiBtb2R1bGUxLnNvbmFyLmxhbmd1YWdlPWphdmEKIAogbW9kdWxlMi5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gSmF2YSBUdXRvcmlhbAogbW9kdWxlMi5zb25hci5wcm9qZWN0QmFzZURpcj0uCiBtb2R1bGUyLnNvbmFyLnNvdXJjZXM9dHV0b3JpYWwvamF2YS9zcmMsIHR1dG9yaWFsL2phdmEvZ2VuLWphdmEKIG1vZHVsZTIuc29uYXIuYmluYXJpZXM9dHV0b3JpYWwvamF2YS90dXRvcmlhbC5qYXIKLW1vZHVsZTIuc29uYXIubGlicmFyaWVzPWxpYi9qYXZhL2J1aWxkL2xpYi8qLmphcixsaWIvamF2YS9idWlsZC9saWJ0aHJpZnQtMS4wLjAuamFyCittb2R1bGUyLnNvbmFyLmxpYnJhcmllcz1saWIvamF2YS9idWlsZC9kZXBzLyouamFyLGxpYi9qYXZhL2J1aWxkL2xpYnMvbGlidGhyaWZ0LTAuMTMuMC5qYXIKIG1vZHVsZTIuc29uYXIubGFuZ3VhZ2U9amF2YQogCiBtb2R1bGUzLnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBKYXZhU2NyaXB0IExpYnJhcnkKZGlmZiAtLWdpdCBhL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0IGIvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKaW5kZXggMTkxOTk1YS4uN2UyNGUxYyAxMDA2NDQKLS0tIGEvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKKysrIGIvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKQEAgLTU3LDYgKzU3LDE1IEBACiAgICJXaW50ZXIiCiB9ICggZm9vID0gImJhciIgKQogCitzdHJ1Y3Qgb3N0cl9kZWZhdWx0IHsKKyAgMTogaTMyIGJhcjsKK30KKworc3RydWN0IG9zdHJfY3VzdG9tIHsKKyAgMTogaTMyIGJhcjsKK30gKGNwcC5jdXN0b21vc3RyZWFtKQorCisKIHNlcnZpY2UgZm9vX3NlcnZpY2UgewogICB2b2lkIGZvbygpICggZm9vID0gImJhciIgKQogfSAoYS5iPSJjIikKZGlmZiAtLWdpdCBhL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQgYi90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0CmluZGV4IDlhNzFhYzguLmE1NDUzNGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKKysrIGIvdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdApAQCAtMTgsNiArMTgsNyBAQAogICovCiAKIG5hbWVzcGFjZSBjcHAgeW96b25lCituYW1lc3BhY2UgZXJsIGNvbnN0c18KIAogc3RydWN0IHRoaW5nIHsKICAgMTogaTMyIGhlbGxvLApAQCAtNDcsNiArNDgsOSBAQAogY29uc3QgZG91YmxlIEdFbl9EVSA9IDA4NS4yMzU1CiBjb25zdCBzdHJpbmcgR0VOX1NUUklORyA9ICJhc2xka2phc2ZkIgogCitjb25zdCBkb3VibGUgZTEwID0gMWUxMCAgIC8vIGZhaWxzIHdpdGggMC45LjMgYW5kIGVhcmxpZXIKK2NvbnN0IGRvdWJsZSBlMTEgPSAtMWUxMCAgCisKIGNvbnN0IG1hcDxpMzIsaTMyPiBHRU5fTUFQID0geyAzNTUzMiA6IDIzMywgNDM1MjMgOiA4NTMgfQogY29uc3QgbGlzdDxpMzI+IEdFTl9MSVNUID0gWyAyMzUyMzUsIDIzNTk4MzUyLCAzMjUzNTIzIF0KIApkaWZmIC0tZ2l0IGEvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgYi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAppbmRleCA0ZTlmYjQ3Li5iNmE3NjU5IDEwMDY0NAotLS0gYS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorKysgYi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdApAQCAtMjAsNiArMjAsNyBAQAogbmFtZXNwYWNlIGNfZ2xpYiBUVGVzdAogbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdC5kZWJ1ZwogbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKK25hbWVzcGFjZSByYiB0aHJpZnQudGVzdAogCiBzdHJ1Y3QgRG91YmxlcyB7CiAgMTogZG91YmxlIG5hbiwKQEAgLTM1LDcgKzM2LDcgQEAKIHN0cnVjdCBPbmVPZkVhY2ggewogICAxOiBib29sIGltX3RydWUsCiAgIDI6IGJvb2wgaW1fZmFsc2UsCi0gIDM6IGJ5dGUgYV9iaXRlID0gMHg3ZiwKKyAgMzogaTggYV9iaXRlID0gMHg3ZiwKICAgNDogaTE2IGludGVnZXIxNiA9IDB4N2ZmZiwKICAgNTogaTMyIGludGVnZXIzMiwKICAgNjogaTY0IGludGVnZXI2NCA9IDEwMDAwMDAwMDAwLApAQCAtNDQsNyArNDUsNyBAQAogICA5OiBzdHJpbmcgem9tZ191bmljb2RlLAogICAxMDogYm9vbCB3aGF0X3dobywKICAgMTE6IGJpbmFyeSBiYXNlNjQsCi0gIDEyOiBsaXN0PGJ5dGU+IGJ5dGVfbGlzdCA9IFsxLCAyLCAzXSwKKyAgMTI6IGxpc3Q8aTg+IGJ5dGVfbGlzdCA9IFsxLCAyLCAzXSwKICAgMTM6IGxpc3Q8aTE2PiBpMTZfbGlzdCA9IFsxLDIsM10sCiAgIDE0OiBsaXN0PGk2ND4gaTY0X2xpc3QgPSBbMSwyLDNdCiB9CkBAIC02MSw3ICs2Miw3IEBACiAKIHN0cnVjdCBIb2x5TW9sZXkgewogICAxOiBsaXN0PE9uZU9mRWFjaD4gYmlnLAotICAyOiBzZXQ8bGlzdDxzdHJpbmc+PiBjb250YWluLAorICAyOiBzZXQ8bGlzdDxzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPiBjb250YWluLAogICAzOiBtYXA8c3RyaW5nLGxpc3Q8Qm9uaz4+IGJvbmtzLAogfQogCkBAIC03MSwxMSArNzIsMTUgQEAKIH0KIAogc3RydWN0IEVtcHR5IHsKLX0KK30gKAorICBweXRob24uaW1tdXRhYmxlID0gIiIsCispCiAKIHN0cnVjdCBXcmFwcGVyIHsKICAgMTogRW1wdHkgZm9vCi19Cit9ICgKKyAgcHl0aG9uLmltbXV0YWJsZSA9ICIiLAorKQogCiBzdHJ1Y3QgUmFuZG9tU3R1ZmYgewogICAxOiBpMzIgYSwKQEAgLTEwMCw3ICsxMDUsNyBAQAogCiBzdHJ1Y3QgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCB7CiAgIC8vIHByaW1pdGl2ZSBmaWVsZHMKLSAgMTogYnl0ZSAgIGFfYnl0ZTsKKyAgMTogaTggICAgIGFfYnl0ZTsKICAgMjogaTE2ICAgIGFfaTE2OwogICAzOiBpMzIgICAgYV9pMzI7CiAgIDQ6IGk2NCAgICBhX2k2NDsKQEAgLTExMiw3ICsxMTcsNyBAQAogICAxMDogRW1wdHkgZW1wdHlfc3RydWN0X2ZpZWxkOwogCiAgIC8vIHByaW1pdGl2ZXMgaW4gbGlzdHMKLSAgMTE6IGxpc3Q8Ynl0ZT4gICAgYnl0ZV9saXN0OworICAxMTogbGlzdDxpOD4gICAgICBieXRlX2xpc3Q7CiAgIDEyOiBsaXN0PGkxNj4gICAgIGkxNl9saXN0OwogICAxMzogbGlzdDxpMzI+ICAgICBpMzJfbGlzdDsKICAgMTQ6IGxpc3Q8aTY0PiAgICAgaTY0X2xpc3Q7CkBAIC0xMjMsNyArMTI4LDcgQEAKICAgMTk6IGxpc3Q8RW1wdHk+ICAgc3RydWN0X2xpc3Q7CiAKICAgLy8gcHJpbWl0aXZlcyBpbiBzZXRzCi0gIDIwOiBzZXQ8Ynl0ZT4gICAgIGJ5dGVfc2V0OworICAyMDogc2V0PGk4PiAgICAgICBieXRlX3NldDsKICAgMjE6IHNldDxpMTY+ICAgICAgaTE2X3NldDsKICAgMjI6IHNldDxpMzI+ICAgICAgaTMyX3NldDsKICAgMjM6IHNldDxpNjQ+ICAgICAgaTY0X3NldDsKQEAgLTEzNSwzMCArMTQwLDMwIEBACiAKICAgLy8gbWFwcwogICAvLyBwcmltaXRpdmVzIGFzIGtleXMKLSAgMjk6IG1hcDxieXRlLCBieXRlPiAgICAgICAgICAgICBieXRlX2J5dGVfbWFwOwotICAzMDogbWFwPGkxNiwgYnl0ZT4gICAgICAgICAgICAgIGkxNl9ieXRlX21hcDsKLSAgMzE6IG1hcDxpMzIsIGJ5dGU+ICAgICAgICAgICAgICBpMzJfYnl0ZV9tYXA7Ci0gIDMyOiBtYXA8aTY0LCBieXRlPiAgICAgICAgICAgICAgaTY0X2J5dGVfbWFwOwotICAzMzogbWFwPGRvdWJsZSwgYnl0ZT4gICAgICAgICAgIGRvdWJsZV9ieXRlX21hcDsKLSAgMzQ6IG1hcDxzdHJpbmcsIGJ5dGU+ICAgICAgICAgICBzdHJpbmdfYnl0ZV9tYXA7Ci0gIDM1OiBtYXA8YmluYXJ5LCBieXRlPiAgICAgICAgICAgYmluYXJ5X2J5dGVfbWFwOwotICAzNjogbWFwPGJvb2wsIGJ5dGU+ICAgICAgICAgICAgIGJvb2xlYW5fYnl0ZV9tYXA7CisgIDI5OiBtYXA8aTgsIGk4PiAgICAgICAgICAgICAgIGJ5dGVfYnl0ZV9tYXA7CisgIDMwOiBtYXA8aTE2LCBpOD4gICAgICAgICAgICAgIGkxNl9ieXRlX21hcDsKKyAgMzE6IG1hcDxpMzIsIGk4PiAgICAgICAgICAgICAgaTMyX2J5dGVfbWFwOworICAzMjogbWFwPGk2NCwgaTg+ICAgICAgICAgICAgICBpNjRfYnl0ZV9tYXA7CisgIDMzOiBtYXA8ZG91YmxlLCBpOD4gICAgICAgICAgIGRvdWJsZV9ieXRlX21hcDsKKyAgMzQ6IG1hcDxzdHJpbmcsIGk4PiAgICAgICAgICAgc3RyaW5nX2J5dGVfbWFwOworICAzNTogbWFwPGJpbmFyeSwgaTg+ICAgICAgICAgICBiaW5hcnlfYnl0ZV9tYXA7CisgIDM2OiBtYXA8Ym9vbCwgaTg+ICAgICAgICAgICAgIGJvb2xlYW5fYnl0ZV9tYXA7CiAgIC8vIHByaW1pdGl2ZXMgYXMgdmFsdWVzCi0gIDM3OiBtYXA8Ynl0ZSwgaTE2PiAgICAgICAgICAgICAgYnl0ZV9pMTZfbWFwOwotICAzODogbWFwPGJ5dGUsIGkzMj4gICAgICAgICAgICAgIGJ5dGVfaTMyX21hcDsKLSAgMzk6IG1hcDxieXRlLCBpNjQ+ICAgICAgICAgICAgICBieXRlX2k2NF9tYXA7Ci0gIDQwOiBtYXA8Ynl0ZSwgZG91YmxlPiAgICAgICAgICAgYnl0ZV9kb3VibGVfbWFwOwotICA0MTogbWFwPGJ5dGUsIHN0cmluZz4gICAgICAgICAgIGJ5dGVfc3RyaW5nX21hcDsKLSAgNDI6IG1hcDxieXRlLCBiaW5hcnk+ICAgICAgICAgICBieXRlX2JpbmFyeV9tYXA7Ci0gIDQzOiBtYXA8Ynl0ZSwgYm9vbD4gICAgICAgICAgICAgYnl0ZV9ib29sZWFuX21hcDsKKyAgMzc6IG1hcDxpOCwgaTE2PiAgICAgICAgICAgICAgYnl0ZV9pMTZfbWFwOworICAzODogbWFwPGk4LCBpMzI+ICAgICAgICAgICAgICBieXRlX2kzMl9tYXA7CisgIDM5OiBtYXA8aTgsIGk2ND4gICAgICAgICAgICAgIGJ5dGVfaTY0X21hcDsKKyAgNDA6IG1hcDxpOCwgZG91YmxlPiAgICAgICAgICAgYnl0ZV9kb3VibGVfbWFwOworICA0MTogbWFwPGk4LCBzdHJpbmc+ICAgICAgICAgICBieXRlX3N0cmluZ19tYXA7CisgIDQyOiBtYXA8aTgsIGJpbmFyeT4gICAgICAgICAgIGJ5dGVfYmluYXJ5X21hcDsKKyAgNDM6IG1hcDxpOCwgYm9vbD4gICAgICAgICAgICAgYnl0ZV9ib29sZWFuX21hcDsKICAgLy8gY29sbGVjdGlvbnMgYXMga2V5cwotICA0NDogbWFwPGxpc3Q8Ynl0ZT4sIGJ5dGU+ICAgICAgIGxpc3RfYnl0ZV9tYXA7Ci0gIDQ1OiBtYXA8c2V0PGJ5dGU+LCBieXRlPiAgICAgICAgc2V0X2J5dGVfbWFwOwotICA0NjogbWFwPG1hcDxieXRlLGJ5dGU+LCBieXRlPiAgIG1hcF9ieXRlX21hcDsKKyAgNDQ6IG1hcDxsaXN0PGk4PiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgaTg+ICAgICAgIGxpc3RfYnl0ZV9tYXA7CisgIDQ1OiBtYXA8c2V0PGk4PiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgaTg+ICAgICAgICBzZXRfYnl0ZV9tYXA7CisgIDQ2OiBtYXA8bWFwPGk4LGk4PiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgaTg+ICAgICBtYXBfYnl0ZV9tYXA7CiAgIC8vIGNvbGxlY3Rpb25zIGFzIHZhbHVlcwotICA0NzogbWFwPGJ5dGUsIG1hcDxieXRlLGJ5dGU+PiAgIGJ5dGVfbWFwX21hcDsKLSAgNDg6IG1hcDxieXRlLCBzZXQ8Ynl0ZT4+ICAgICAgICBieXRlX3NldF9tYXA7Ci0gIDQ5OiBtYXA8Ynl0ZSwgbGlzdDxieXRlPj4gICAgICAgYnl0ZV9saXN0X21hcDsKKyAgNDc6IG1hcDxpOCwgbWFwPGk4LGk4Pj4gICAgIGJ5dGVfbWFwX21hcDsKKyAgNDg6IG1hcDxpOCwgc2V0PGk4Pj4gICAgICAgIGJ5dGVfc2V0X21hcDsKKyAgNDk6IG1hcDxpOCwgbGlzdDxpOD4+ICAgICAgIGJ5dGVfbGlzdF9tYXA7CiB9CiAKIC8vIFRvIGJlIHVzZWQgdG8gdGVzdCB0aGUgc2VyaWFsaXphdGlvbiBvZiBhbiBlbXB0eSBtYXAKQEAgLTI0Myw2ICsyNDgsOCBAQAogICB2b2lkIG1ldGhvZFdpdGhEZWZhdWx0QXJncygxOiBpMzIgc29tZXRoaW5nID0gTVlDT05TVCk7CiAKICAgb25ld2F5IHZvaWQgb25ld2F5TWV0aG9kKCk7CisKKyAgYm9vbCBkZWNsYXJlZEV4Y2VwdGlvbk1ldGhvZCgxOiBib29sIHNob3VsZFRocm93KSB0aHJvd3MgKDE6IEV4Y2VwdGlvbldpdGhBTWFwIHh3YW1hcCk7CiB9CiAKIHNlcnZpY2UgSW5oZXJpdGVkIGV4dGVuZHMgU3J2IHsKQEAgLTI1NCwxMCArMjYxLDEwIEBACiAvLyBUaGUgb25seSBwdXJwb3NlIG9mIHRoaXMgdGhpbmcgaXMgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlCiAvLyBzbyB0aGF0IFpsaWJUZXN0IGhhcyBtb3JlIGhpZ2hseSBjb21wcmVzc2libGUgZGF0YSB0byBwbGF5IHdpdGguCiBzdHJ1Y3QgQmxvd1VwIHsKLSAgMTogbWFwPGxpc3Q8aTMyPixzZXQ8bWFwPGkzMixzdHJpbmc+Pj4gYjE7Ci0gIDI6IG1hcDxsaXN0PGkzMj4sc2V0PG1hcDxpMzIsc3RyaW5nPj4+IGIyOwotICAzOiBtYXA8bGlzdDxpMzI+LHNldDxtYXA8aTMyLHN0cmluZz4+PiBiMzsKLSAgNDogbWFwPGxpc3Q8aTMyPixzZXQ8bWFwPGkzMixzdHJpbmc+Pj4gYjQ7CisgIDE6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjE7CisgIDI6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjI7CisgIDM6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjM7CisgIDQ6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjQ7CiB9CiAKIApkaWZmIC0tZ2l0IGEvdGVzdC9Eb2NUZXN0LnRocmlmdCBiL3Rlc3QvRG9jVGVzdC50aHJpZnQKaW5kZXggOWQxOTg1NS4uZDcwMmIyYyAxMDA2NDQKLS0tIGEvdGVzdC9Eb2NUZXN0LnRocmlmdAorKysgYi90ZXN0L0RvY1Rlc3QudGhyaWZ0CkBAIC01OCw3ICs1OCw3IEBACiAgIDE6ICBzdHJpbmcgc3RyaW5nX3RoaW5nCiAKICAgLyoqIGRvY3QgdGV4dCBnb2VzIGJlZm9yZSBhIGNvbW1hICovCi0gIDQ6ICBieXRlICAgYnl0ZV90aGluZywKKyAgNDogIGk4ICAgICBieXRlX3RoaW5nLAogCiAgIDk6ICBpMzIgICAgaTMyX3RoaW5nLAogICAxMTogaTY0ICAgIGk2NF90aGluZwpAQCAtNzQsNyArNzQsNyBAQAogCiBzdHJ1Y3QgWHRydWN0MgogewotICAxOiBieXRlICAgYnl0ZV90aGluZywKKyAgMTogaTggICAgIGJ5dGVfdGhpbmcsCiAgIDI6IFh0cnVjdCBzdHJ1Y3RfdGhpbmcsCiAgIDM6IGkzMiAgICBpMzJfdGhpbmcKIH0KQEAgLTExNyw3ICsxMTcsNyBAQAogICAvKiogQW5kIHRoaXMgaXMgaG93IHlvdSB3b3VsZCBkb2N1bWVudCBmdW5jdGlvbnMgaW4gYSBzZXJ2aWNlICovCiAgIHZvaWQgICAgICAgICB0ZXN0Vm9pZCgpLAogICBzdHJpbmcgICAgICAgdGVzdFN0cmluZygxOiBzdHJpbmcgdGhpbmcpLAotICBieXRlICAgICAgICAgdGVzdEJ5dGUoMTogYnl0ZSB0aGluZyksCisgIGk4ICAgICAgICAgICB0ZXN0Qnl0ZSgxOiBieXRlIHRoaW5nKSwKICAgaTMyICAgICAgICAgIHRlc3RJMzIoMTogaTMyIHRoaW5nKSwKIAogICAvKiogTGlrZSB0aGlzIG9uZSAqLwpAQCAtMjQ2LDQgKzI0Niw0MiBAQAogCiAvKipubyByb29tIGZvciBuZXdsaW5lIGhlcmUqLwogCisvKiAqIC8gKi8KK3R5cGVkZWYgaTMyIFRlc3RGb3IzNTAxYQorCisvKioKKyAqIC8KKyAqLwordHlwZWRlZiBpMzIgVGVzdEZvcjM1MDFiCisKKworLyogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDAgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICoqLworc3RydWN0IFRlc3RGb3IzNzA5XzAxIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDIgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqLworc3RydWN0IFRlc3RGb3IzNzA5XzAzIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDQgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDUgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wNiB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKioqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wNyB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKioqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDggeyAvKiA/ICovIDE6IGkzMiBmb28gfQorCitzdHJ1Y3QgVGVzdEZvcjM3MDkgeworICAvKiogVGhpcyBpcyBhIGNvbW1lbnQgKi8KKyAgMTogcmVxdWlyZWQgc3RyaW5nIGlkLAorICAvKiogVGhpcyBpcyBhbHNvIGEgY29tbWVudCAqKi8KKyAgMjogcmVxdWlyZWQgc3RyaW5nIHR5cGVJZCwKKyAgLyoqIFlldCBhbm90aGVyIGNvbW1lbnQhICovCisgIDM6IHJlcXVpcmVkIGkzMiBlbmRUaW1lc3RhbXAKK30KKworCiAvKiBUSEUgRU5EICovCmRpZmYgLS1naXQgYS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IGIvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTIxMmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdApAQCAtMCwwICsxLDE3IEBACituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdAorCisvLyBtb3JlIHRlc3RzIG9uIGRvdWJsZSBjb25zdGFudHMgKHByZWNpc2lvbiBhbmQgdHlwZSBjaGVja3MpCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUID0gMQorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCA9IC0xMDAKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNworY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QgPSAzLjE0MTU5MjY1MzU5Citjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QgPSAxMDAwMDAwLjEKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IC0xMDAwMDAwLjEKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QgPSAxLjdlKzMwOAorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MworY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCA9IC0xLjdlKzMwOAorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCisKK2NvbnN0IGxpc3Q8ZG91YmxlPiBET1VCTEVfTElTVF9URVNUID0gWzEsLTEwMCwxMDAsOTIyMzM3MjAzNjg1NDc3NTgwNywtOTIyMzM3MjAzNjg1NDc3NTgwNywzLjE0MTU5MjY1MzU5LDEwMDAwMDAuMSwtMTAwMDAwMC4xLDEuN2UrMzA4LC0xLjdlKzMwOCw5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzXQpkaWZmIC0tZ2l0IGEvdGVzdC9FbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0IGIvdGVzdC9FbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjQwOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0VudW1Db250YWluZXJzVGVzdC50aHJpZnQKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycworCitlbnVtIEdyZWVrR29kR29kZGVzcyB7CisgICAgQVJFUywKKyAgICBBUEhST0RJVEUsCisgICAgWkVVUywKKyAgICBQT1NFSURPTiwKKyAgICBIRVJBLAorfQorCit0eXBlZGVmIEdyZWVrR29kR29kZGVzcyBHcmVla0dvZEdvZGRlc3NUeXBlCit0eXBlZGVmIGkzMiBQb3dlcgorCitzdHJ1Y3QgR29kQmVhbiB7CisgICAgMTogb3B0aW9uYWwgbWFwPEdyZWVrR29kR29kZGVzc1R5cGUsIFBvd2VyPiBwb3dlciwKKyAgICAyOiBvcHRpb25hbCBzZXQ8R3JlZWtHb2RHb2RkZXNzVHlwZT4gZ29kZGVzcywKKyAgICAzOiBvcHRpb25hbCBtYXA8c3RyaW5nLCBHcmVla0dvZEdvZGRlc3M+IGJ5QWxpYXMsCisgICAgNDogb3B0aW9uYWwgc2V0PHN0cmluZz4gaW1hZ2VzLAorfQorCitjb25zdCBtYXA8R3JlZWtHb2RHb2RkZXNzVHlwZSwgc3RyaW5nPiBBVFRSSUJVVEVTID0KK3sKKyAgICBHcmVla0dvZEdvZGRlc3MuWkVVUzogImxpZ2h0bmluZyBib2x0IiwKKyAgICBHcmVla0dvZEdvZGRlc3MuUE9TRUlET046ICJ0cmlkZW50IiwKK30KKworY29uc3Qgc2V0PEdyZWVrR29kR29kZGVzc1R5cGU+IEJFQVVUWSA9IFsgR3JlZWtHb2RHb2RkZXNzLkFQSFJPRElURSwgR3JlZWtHb2RHb2RkZXNzLkhFUkEgXQpkaWZmIC0tZ2l0IGEvdGVzdC9FbnVtVGVzdC50aHJpZnQgYi90ZXN0L0VudW1UZXN0LnRocmlmdAppbmRleCA2MjAxOTIzLi43OTYxZjM4IDEwMDY0NAotLS0gYS90ZXN0L0VudW1UZXN0LnRocmlmdAorKysgYi90ZXN0L0VudW1UZXN0LnRocmlmdApAQCAtMjEsNiArMjEsOCBAQAogICogZGV0YWlscy4KICAqLwogCituYW1lc3BhY2UgY19nbGliIFRUZXN0CisKIGVudW0gTXlFbnVtMSB7CiAgIE1FMV8wID0gMCwKICAgTUUxXzEgPSAxLApAQCAtNjQsOSArNjYsNTQgQEAKICAgLy8gcmVwcmVzZW50ZWQgd2l0aCBhbiBpMzIuCiB9CiAKK2VudW0gTXlFbnVtNSB7CisgIGUxICAgICAgICAvLyBmYWlscyB3aXRoIDAuOS4zIGFuZCBlYXJsaWVyCisgIGUyID0gNDIgICAvLyBmYWlscyB3aXRoIDAuOS4zIGFuZCBlYXJsaWVyCit9CisKK2VudW0gTXlFbnVtV2l0aEN1c3RvbU9zdHJlYW0geworICBjdXN0b20xID0gMSwKKyAgQ3VzdG9NMgorfSAoY3BwLmN1c3RvbW9zdHJlYW0pCisKIHN0cnVjdCBNeVN0cnVjdCB7CiAgIDE6IE15RW51bTIgbWUyXzIgPSBNeUVudW0xLk1FMl8yCiAgIDI6IE15RW51bTMgbWUzX24yID0gTXlFbnVtMy5NRTNfTjIKICAgMzogTXlFbnVtMyBtZTNfZDEgPSBNeUVudW0zLk1FM19EMQogfQogCitzdHJ1Y3QgRW51bVRlc3RTdHJ1Y3QgeworICAxOiBNeUVudW0zIGFfZW51bTsKKyAgMjogbGlzdDxNeUVudW0zPiBlbnVtX2xpc3Q7CisgIDM6IHNldDxNeUVudW0zPiBlbnVtX3NldDsKKyAgNDogbWFwPE15RW51bTMsIE15RW51bTM+IGVudW1fZW51bV9tYXA7CisgIC8vIGNvbGxlY3Rpb25zIGFzIGtleXMKKyAgNDQ6IG1hcDxsaXN0PE15RW51bTM+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBNeUVudW0zPiBsaXN0X2VudW1fbWFwOworICA0NTogbWFwPHNldDxNeUVudW0zPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgTXlFbnVtMz4gc2V0X2VudW1fbWFwOworICA0NjogbWFwPG1hcDxNeUVudW0zLE15RW51bTM+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBNeUVudW0zPiBtYXBfZW51bV9tYXA7CisgIC8vIGNvbGxlY3Rpb25zIGFzIHZhbHVlcworICA0NzogbWFwPE15RW51bTMsIG1hcDxNeUVudW0zLCBNeUVudW0zPj4gZW51bV9tYXBfbWFwOworICA0ODogbWFwPE15RW51bTMsIHNldDxNeUVudW0zPj4gZW51bV9zZXRfbWFwOworICA0OTogbWFwPE15RW51bTMsIGxpc3Q8TXlFbnVtMz4+IGVudW1fbGlzdF9tYXA7Cit9CisKK2NvbnN0IEVudW1UZXN0U3RydWN0IEVOVU1fVEVTVCA9IHsKKyAgJ2FfZW51bSc6IE15RW51bTMuTUUzX0QxLAorICAnZW51bV9saXN0JzogW015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM18wLCBNeUVudW0zLk1FM19OMl0sCisgICdlbnVtX3NldCc6IFtNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfTjFdLAorICAnZW51bV9lbnVtX21hcCc6IHtNeUVudW0zLk1FM19EMTogTXlFbnVtMy5NRTNfMCwgTXlFbnVtMy5NRTNfMDogTXlFbnVtMy5NRTNfRDF9LAorICAnbGlzdF9lbnVtX21hcCc6IHtbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzXzBdOiBNeUVudW0zLk1FM18wLCBbTXlFbnVtMy5NRTNfRDFdOiBNeUVudW0zLk1FM18wLCBbTXlFbnVtMy5NRTNfMF06IE15RW51bTMuTUUzX0QxfSwKKyAgJ3NldF9lbnVtX21hcCc6IHtbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzXzBdOiBNeUVudW0zLk1FM18wLCBbTXlFbnVtMy5NRTNfRDFdOiBNeUVudW0zLk1FM18wfSwKKyAgJ21hcF9lbnVtX21hcCc6IHt7TXlFbnVtMy5NRTNfTjE6IE15RW51bTMuTUUzXzEwfTogTXlFbnVtMy5NRTNfMX0sCisgICdlbnVtX21hcF9tYXAnOiB7TXlFbnVtMy5NRTNfTjE6IHtNeUVudW0zLk1FM19EMTogTXlFbnVtMy5NRTNfRDF9fSwKKyAgJ2VudW1fc2V0X21hcCc6IHtNeUVudW0zLk1FM19OMjogW015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM19OMV0sIE15RW51bTMuTUUzXzEwOiBbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzX04xXX0sCisgICdlbnVtX2xpc3RfbWFwJzoge015RW51bTMuTUUzX0QxOiBbTXlFbnVtMy5NRTNfMTBdLCBNeUVudW0zLk1FM18wOiBbTXlFbnVtMy5NRTNfOSwgTXlFbnVtMy5NRTNfMTBdfSwKK30KKworc2VydmljZSBFbnVtVGVzdFNlcnZpY2UgeworICBNeUVudW0zIHRlc3RFbnVtKDE6IE15RW51bTMgZW51bTEpLAorICBsaXN0PE15RW51bTM+IHRlc3RFbnVtTGlzdCgxOiBsaXN0PE15RW51bTM+IGVudW0xKSwKKyAgc2V0PE15RW51bTM+IHRlc3RFbnVtU2V0KDE6IHNldDxNeUVudW0zPiBlbnVtMSksCisgIG1hcDxNeUVudW0zLCBNeUVudW0zPiB0ZXN0RW51bU1hcCgxOiBtYXA8TXlFbnVtMywgTXlFbnVtMz4gZW51bTEpLAorICBFbnVtVGVzdFN0cnVjdCB0ZXN0RW51bVN0cnVjdCgxOiBFbnVtVGVzdFN0cnVjdCBlbnVtMSksCit9CmRpZmYgLS1naXQgYS90ZXN0L0Zhc3RiaW5hcnlUZXN0LnB5IGIvdGVzdC9GYXN0YmluYXJ5VGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Y2ZWZhZS4uMDAwMDAwMAotLS0gYS90ZXN0L0Zhc3RiaW5hcnlUZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotciIiIgotdGhyaWZ0IC0tZ2VuIHB5IERlYnVnUHJvdG9UZXN0LnRocmlmdAotLi9GYXN0YmluYXJ5VGVzdC5weQotIiIiCi0KLSMgVE9ETyhkcmVpc3MpOiBUZXN0IGVycm9yIGNhc2VzLiAgQ2hlY2sgZm9yIG1lbW9yeSBsZWFrcy4KLQotaW1wb3J0IHN5cwotc3lzLnBhdGguYXBwZW5kKCcuL2dlbi1weScpCi0KLWltcG9ydCBtYXRoCi1mcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBTcnYKLWZyb20gRGVidWdQcm90b1Rlc3QudHR5cGVzIGltcG9ydCAqCi1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLQotaW1wb3J0IHRpbWVpdAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi1mcm9tIGNvcHkgaW1wb3J0IGRlZXBjb3B5Ci1mcm9tIHBwcmludCBpbXBvcnQgcHByaW50Ci0KLWNsYXNzIFREZXZOdWxsVHJhbnNwb3J0KFRUcmFuc3BvcnQuVFRyYW5zcG9ydEJhc2UpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgcGFzcwotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBUcnVlCi0KLW9vZTEgPSBPbmVPZkVhY2goKQotb29lMS5pbV90cnVlICAgPSBUcnVlOwotb29lMS5pbV9mYWxzZSAgPSBGYWxzZTsKLW9vZTEuYV9iaXRlICAgID0gMHhkNjsKLW9vZTEuaW50ZWdlcjE2ID0gMjcwMDA7Ci1vb2UxLmludGVnZXIzMiA9IDE8PDI0Owotb29lMS5pbnRlZ2VyNjQgPSA2MDAwICogMTAwMCAqIDEwMDA7Ci1vb2UxLmRvdWJsZV9wcmVjaXNpb24gPSBtYXRoLnBpOwotb29lMS5zb21lX2NoYXJhY3RlcnMgID0gIkRlYnVnIFRISVMhIjsKLW9vZTEuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKLQotb29lMiA9IE9uZU9mRWFjaCgpOwotb29lMi5pbnRlZ2VyMTYgPSAxNjsKLW9vZTIuaW50ZWdlcjMyID0gMzI7Ci1vb2UyLmludGVnZXI2NCA9IDY0Owotb29lMi5kb3VibGVfcHJlY2lzaW9uID0gKG1hdGguc3FydCg1KSsxKS8yOwotb29lMi5zb21lX2NoYXJhY3RlcnMgID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOwotb29lMi56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmUiXAotICAgICAgICAgICAgICAgICAgICAgICAgIlx4YzlceGExXHhkMFx4YjNceGQwXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmEiXAotICAgICAgICAgICAgICAgICAgICAgICAgIlx4YzdceDgzXHhlMlx4ODBceGJjIjsKLQotaG0gPSBIb2x5TW9sZXkoeyJiaWciOltdLCAiY29udGFpbiI6c2V0KCksICJib25rcyI6e319KQotaG0uYmlnLmFwcGVuZChvb2UxKQotaG0uYmlnLmFwcGVuZChvb2UyKQotaG0uYmlnWzBdLmFfYml0ZSA9IDB4MjI7Ci1obS5iaWdbMV0uYV9iaXRlID0gMHgyMjsKLQotaG0uY29udGFpbi5hZGQoKCJhbmQgYSBvbmUiLCAiYW5kIGEgdHdvIikpCi1obS5jb250YWluLmFkZCgoInRoZW4gYSBvbmUsIHR3byIsICJ0aHJlZSEiLCAiRk9VUiEiKSkKLWhtLmNvbnRhaW4uYWRkKCgpKQotCi1obS5ib25rc1sibm90aGluZyJdID0gW107Ci1obS5ib25rc1sic29tZXRoaW5nIl0gPSBbCi0gIEJvbmsoeyJ0eXBlIjoxLCAibWVzc2FnZSI6IldhaXQuIn0pLAotICBCb25rKHsidHlwZSI6MiwgIm1lc3NhZ2UiOiJXaGF0PyJ9KSwKLV0KLWhtLmJvbmtzWyJwb2UiXSA9IFsKLSAgQm9uayh7InR5cGUiOjMsICJtZXNzYWdlIjoicXVvdGgifSksCi0gIEJvbmsoeyJ0eXBlIjo0LCAibWVzc2FnZSI6InRoZSByYXZlbiJ9KSwKLSAgQm9uayh7InR5cGUiOjUsICJtZXNzYWdlIjoibmV2ZXJtb3JlIn0pLAotXQotCi1ycyA9IFJhbmRvbVN0dWZmKCkKLXJzLmEgPSAxCi1ycy5iID0gMgotcnMuYyA9IDMKLXJzLm15aW50bGlzdCA9IHJhbmdlKDIwKQotcnMubWFwcyA9IHsxOldyYXBwZXIoeyJmb28iOkVtcHR5KCl9KSwyOldyYXBwZXIoeyJmb28iOkVtcHR5KCl9KX0KLXJzLmJpZ2ludCA9IDEyNDUyMzQ1MjQzNUwKLXJzLnRyaXBsZSA9IDMuMTQKLQotIyBtYWtlIHN1cmUgdGhpcyBzcGxpdHMgdHdvIGJ1ZmZlcnMgaW4gYSBidWZmZXJlZCBwcm90b2NvbAotcnNodWdlID0gUmFuZG9tU3R1ZmYoKQotcnNodWdlLm15aW50bGlzdD1yYW5nZSgxMDAwMCkKLQotbXlfemVybyA9IFNydi5KYW5reV9yZXN1bHQoeyJhcmciOjV9KQotCi1kZWYgY2hlY2tXcml0ZShvKToKLSAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICBwcm90X2Zhc3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNfZmFzdCkKLSAgcHJvdF9zbG93ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc19zbG93KQotCi0gIG8ud3JpdGUocHJvdF9mYXN0KQotICBvLndyaXRlKHByb3Rfc2xvdykKLSAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQotICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCi0gIGlmIE9SSUcgIT0gTUlORToKLSAgICBwcmludCAibWluZTogJXNcbm9yaWc6ICVzIiAlIChyZXByKE1JTkUpLCByZXByKE9SSUcpKQotCi1kZWYgY2hlY2tSZWFkKG8pOgotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSkKLSAgby53cml0ZShwcm90KQotCi0gIHNsb3dfdmVyc2lvbl9iaW5hcnkgPSBwcm90LnRyYW5zLmdldHZhbHVlKCkKLQotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKAotICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2xvd192ZXJzaW9uX2JpbmFyeSkpCi0gIGMgPSBvLl9fY2xhc3NfXygpCi0gIGMucmVhZChwcm90KQotICBpZiBjICE9IG86Ci0gICAgcHJpbnQgImNvcHk6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKGMpKSkKLSAgICBwcmludCAib3JpZzogIgotICAgIHBwcmludChldmFsKHJlcHIobykpKQotCi0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoCi0gICAgICAgICAgIFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAotICAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSkpCi0gIGMgPSBvLl9fY2xhc3NfXygpCi0gIGMucmVhZChwcm90KQotICBpZiBjICE9IG86Ci0gICAgcHJpbnQgImNvcHk6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKGMpKSkKLSAgICBwcmludCAib3JpZzogIgotICAgIHBwcmludChldmFsKHJlcHIobykpKQotCi0KLWRlZiBkb1Rlc3QoKToKLSAgY2hlY2tXcml0ZShobSkKLSAgbm9fc2V0ID0gZGVlcGNvcHkoaG0pCi0gIG5vX3NldC5jb250YWluID0gc2V0KCkKLSAgY2hlY2tSZWFkKG5vX3NldCkKLSAgY2hlY2tXcml0ZShycykKLSAgY2hlY2tSZWFkKHJzKQotICBjaGVja1dyaXRlKHJzaHVnZSkKLSAgY2hlY2tSZWFkKHJzaHVnZSkKLSAgY2hlY2tXcml0ZShteV96ZXJvKQotICBjaGVja1JlYWQobXlfemVybykKLSAgY2hlY2tSZWFkKEJhY2t3YXJkcyh7ImZpcnN0X3RhZzIiOjQsICJzZWNvbmRfdGFnMSI6Mn0pKQotCi0gICMgT25lIGNhc2Ugd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZm9ybSBjaGFuZ2VzLCBidXQgb25seSBzdXBlcmZpY2lhbGx5LgotICBvID0gQmFja3dhcmRzKHsiZmlyc3RfdGFnMiI6NCwgInNlY29uZF90YWcxIjoyfSkKLSAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICBwcm90X2Zhc3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNfZmFzdCkKLSAgcHJvdF9zbG93ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc19zbG93KQotCi0gIG8ud3JpdGUocHJvdF9mYXN0KQotICBvLndyaXRlKHByb3Rfc2xvdykKLSAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQotICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCi0gIGlmIE9SSUcgPT0gTUlORToKLSAgICBwcmludCAiVGhhdCBzaG91bGRuJ3QgaGFwcGVuLiIKLQotCi0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkpCi0gIG8ud3JpdGUocHJvdCkKLSAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2woCi0gICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigKLSAgICAgICAgICAgICBwcm90LnRyYW5zLmdldHZhbHVlKCkpKQotICBjID0gby5fX2NsYXNzX18oKQotICBjLnJlYWQocHJvdCkKLSAgaWYgYyAhPSBvOgotICAgIHByaW50ICJjb3B5OiAiCi0gICAgcHByaW50KGV2YWwocmVwcihjKSkpCi0gICAgcHJpbnQgIm9yaWc6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKG8pKSkKLQotCi0KLWRlZiBkb0JlbmNobWFyaygpOgotCi0gIGl0ZXJzID0gMjUwMDAKLQotICBzZXR1cCA9ICIiIgotZnJvbSBfX21haW5fXyBpbXBvcnQgaG0sIHJzLCBURGV2TnVsbFRyYW5zcG9ydAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotdHJhbnMgPSBURGV2TnVsbFRyYW5zcG9ydCgpCi1wcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCVzKHRyYW5zKQotIiIiCi0KLSAgc2V0dXBfZmFzdCA9IHNldHVwICUgIkFjY2VsZXJhdGVkIgotICBzZXR1cF9zbG93ID0gc2V0dXAgJSAiIgotCi0gIHByaW50ICJTdGFydGluZyBCZW5jaG1hcmtzIgotCi0gIHByaW50ICJIb2x5TW9sZXkgU3RhbmRhcmQgPSAlZiIgJSBcCi0gICAgICB0aW1laXQuVGltZXIoJ2htLndyaXRlKHByb3QpJywgc2V0dXBfc2xvdykudGltZWl0KG51bWJlcj1pdGVycykKLSAgcHJpbnQgIkhvbHlNb2xleSBBY2NlbGVyLiA9ICVmIiAlIFwKLSAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKQotCi0gIHByaW50ICJGYXN0U3RydWN0IFN0YW5kYXJkID0gJWYiICUgXAotICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX3Nsb3cpLnRpbWVpdChudW1iZXI9aXRlcnMpCi0gIHByaW50ICJGYXN0U3RydWN0IEFjY2VsZXIuID0gJWYiICUgXAotICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX2Zhc3QpLnRpbWVpdChudW1iZXI9aXRlcnMpCi0KLQotCi1kb1Rlc3QoKQotZG9CZW5jaG1hcmsoKQotCmRpZmYgLS1naXQgYS90ZXN0L0Z1bGxDYW1lbFRlc3QudGhyaWZ0IGIvdGVzdC9GdWxsQ2FtZWxUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWU0ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9GdWxsQ2FtZWxUZXN0LnRocmlmdApAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0LmZ1bGxjYW1lbAorCitzdHJ1Y3QgT25lT2ZFYWNoWlogeworICAxOiBib29sIGltX3RydWUsCisgIDI6IGJvb2wgaW1fZmFsc2UsCisgIDM6IGJ5dGUgYV9iaXRlLAorICA0OiBpMTYgaW50ZWdlcjE2LAorICA1OiBpMzIgaW50ZWdlcjMyLAorICA2OiBpNjQgaW50ZWdlcjY0LAorICA3OiBkb3VibGUgZG91YmxlX3ByZWNpc2lvbiwKKyAgODogc3RyaW5nIHNvbWVfY2hhcmFjdGVycywKKyAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKKyAgMTA6IGJvb2wgd2hhdF93aG8sCit9CisKK3NlcnZpY2UgVW5kZXJzY29yZVNydiB7CisgIGk2NCBzb21lX3JwY19jYWxsKDE6IHN0cmluZyBtZXNzYWdlKQorfQorCmRpZmYgLS1naXQgYS90ZXN0L0ludDY0VGVzdC50aHJpZnQgYi90ZXN0L0ludDY0VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4Y2M5YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSW50NjRUZXN0LnRocmlmdApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCituYW1lc3BhY2UganMgSW50NjRUZXN0CisKK2NvbnN0IGk2NCBTTUFMTF9JTlQ2NCA9IDQyCitjb25zdCBpNjQgTUFYX0pTX1NBRkVfSU5UNjQgPSA5MDA3MTk5MjU0NzQwOTkxCitjb25zdCBpNjQgTUlOX0pTX1NBRkVfSU5UNjQgPSAtOTAwNzE5OTI1NDc0MDk5MQorY29uc3QgaTY0IE1BWF9KU19TQUZFX1BMVVNfT05FX0lOVDY0ID0gOTAwNzE5OTI1NDc0MDk5MgorY29uc3QgaTY0IE1JTl9KU19TQUZFX01JTlVTX09ORV9JTlQ2NCA9IC05MDA3MTk5MjU0NzQwOTkyCitjb25zdCBpNjQgTUFYX1NJR05FRF9JTlQ2NCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKK2NvbnN0IGk2NCBNSU5fU0lHTkVEX0lOVDY0ID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDgKKworY29uc3QgbGlzdDxpNjQ+IElOVDY0X0xJU1QgPSBbU01BTExfSU5UNjQsIE1BWF9KU19TQUZFX0lOVDY0LCBNSU5fSlNfU0FGRV9JTlQ2NCwgTUFYX0pTX1NBRkVfUExVU19PTkVfSU5UNjQsIE1JTl9KU19TQUZFX01JTlVTX09ORV9JTlQ2NCwgTUFYX1NJR05FRF9JTlQ2NCwgTUlOX1NJR05FRF9JTlQ2NF0KKworY29uc3QgbWFwPGk2NCwgaTY0PiBJTlQ2NF8yX0lOVDY0X01BUCA9IHsKKyAgICBTTUFMTF9JTlQ2NDogU01BTExfSU5UNjQsCisgICAgTUFYX0pTX1NBRkVfSU5UNjQ6IE1BWF9KU19TQUZFX0lOVDY0LAorICAgIE1JTl9KU19TQUZFX0lOVDY0OiBNSU5fSlNfU0FGRV9JTlQ2NCwKKyAgICBNQVhfSlNfU0FGRV9QTFVTX09ORV9JTlQ2NDogTUFYX0pTX1NBRkVfUExVU19PTkVfSU5UNjQsCisgICAgTUlOX0pTX1NBRkVfTUlOVVNfT05FX0lOVDY0OiBNSU5fSlNfU0FGRV9NSU5VU19PTkVfSU5UNjQsCisgICAgTUFYX1NJR05FRF9JTlQ2NDogTUFYX1NJR05FRF9JTlQ2NCwKKyAgICBNSU5fU0lHTkVEX0lOVDY0OiBNSU5fU0lHTkVEX0lOVDY0CisgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC9KYXZhRGVlcENvcHlUZXN0LnRocmlmdCBiL3Rlc3QvSmF2YURlZXBDb3B5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5NzRhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSmF2YURlZXBDb3B5VGVzdC50aHJpZnQKQEAgLTAsMCArMSwxOSBAQAoraW5jbHVkZSAiSmF2YVR5cGVzLnRocmlmdCIKKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworc3RydWN0IERlZXBDb3B5Rm9vIHsKKyAgMTogb3B0aW9uYWwgbGlzdDxEZWVwQ29weUJhcj4gbCwKKyAgMjogb3B0aW9uYWwgc2V0PERlZXBDb3B5QmFyPiBzLAorICAzOiBvcHRpb25hbCBtYXA8c3RyaW5nLCBEZWVwQ29weUJhcj4gbSwKKyAgNDogb3B0aW9uYWwgbGlzdDxKYXZhVHlwZXMuT2JqZWN0PiBsaSwKKyAgNTogb3B0aW9uYWwgc2V0PEphdmFUeXBlcy5PYmplY3Q+IHNpLAorICA2OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBKYXZhVHlwZXMuT2JqZWN0PiBtaSwKKyAgNzogb3B0aW9uYWwgRGVlcENvcHlCYXIgYmFyLAorfQorCitzdHJ1Y3QgRGVlcENvcHlCYXIgeworICAxOiBvcHRpb25hbCBzdHJpbmcgYSwKKyAgMjogb3B0aW9uYWwgaTMyIGIsCisgIDM6IG9wdGlvbmFsIGJvb2wgYywKK30KZGlmZiAtLWdpdCBhL3Rlc3QvSmF2YVR5cGVzLnRocmlmdCBiL3Rlc3QvSmF2YVR5cGVzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzczM2FkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9KYXZhVHlwZXMudGhyaWZ0CkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CisKK3N0cnVjdCBJbnRlZ2VyIHsKKyAgMTogaTMyIHZhbAorfQorCitzdHJ1Y3QgU3RyaW5nIHsKKyAgMTogc3RyaW5nIHZhbAorfQorCitzdHJ1Y3QgQm9vbGVhbiB7CisgIDE6IGJvb2wgdmFsCit9CisKK3N0cnVjdCBEb3VibGUgeworICAxOiBkb3VibGUgdmFsCit9CisKK3N0cnVjdCBMb25nIHsKKyAgMTogaTY0IHZhbAorfQorCitzdHJ1Y3QgQnl0ZSB7CisgIDE6IGJ5dGUgdmFsCit9CisKK3N0cnVjdCBGbG9hdCB7CisgIDE6IGRvdWJsZSB2YWwKK30KKworc3RydWN0IExpc3QgeworICAxOiBsaXN0PHN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgQXJyYXlMaXN0IHsKKyAgMTogbGlzdDxzdHJpbmc+IHZhbHMKK30KKworc3RydWN0IFNvcnRlZE1hcCB7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgVHJlZU1hcCB7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgSGFzaE1hcCB7CisgIDE6IG1hcDxzdHJpbmcsIFN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgTWFwIHsKKyAgMTogbWFwPGRvdWJsZSwgRG91YmxlPiB2YWxzCit9CisKK3N0cnVjdCBPYmplY3QgeworICAxOiBJbnRlZ2VyIGludGVnZXIsCisgIDI6IFN0cmluZyBzdHIsCisgIDM6IEJvb2xlYW4gYm9vbGVhbl9maWVsZCwKKyAgNDogRG91YmxlIGRibCwKKyAgNTogQnl0ZSBiaXRlLAorICA2OiBtYXA8aTMyLCBJbnRlZ2VyPiBpbnRtYXAsCisgIDc6IE1hcCBzb21lbWFwLAorfQorCitleGNlcHRpb24gRXhjZXB0aW9uIHsKKyAgMTogc3RyaW5nIG1zZworfQorCitzZXJ2aWNlIEFzeW5jTm9uYmxvY2tpbmdTZXJ2aWNlIHsKKyAgT2JqZWN0IG15bWV0aG9kKAorICAgIDE6IEludGVnZXIgaW50ZWdlciwKKyAgICAyOiBTdHJpbmcgc3RyLAorICAgIDM6IEJvb2xlYW4gYm9vbGVhbl9maWVsZCwKKyAgICA0OiBEb3VibGUgZGJsLAorICAgIDU6IEJ5dGUgYml0ZSwKKyAgICA2OiBtYXA8aTMyLCBJbnRlZ2VyPiBpbnRtYXAsCisgICAgNzogTWFwIHNvbWVtYXAsCisgICkgdGhyb3dzICgxOkV4Y2VwdGlvbiBleCk7Cit9CisKK3N0cnVjdCBTYWZlQnl0ZXMgeworICAxOiBiaW5hcnkgYnl0ZXM7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdCBiL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdAppbmRleCBjMmUyM2FmLi5lZjUxMjZmIDEwMDY0NAotLS0gYS90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQKKysrIGIvdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0CkBAIC05LDYgKzksOCBAQAogICA0OiBtYXA8c3RyaW5nLFNpbXBsZT4gc3RydWN0X21hcF9maWVsZAogICA1OiBsaXN0PHNldDxtYXA8c3RyaW5nLGxpc3Q8U2ltcGxlPj4+PiBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQKICAgNjogbWFwPHN0cmluZywgbGlzdDxtYXA8c3RyaW5nLFNpbXBsZT4+ID4gc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMgorICA3OiBsaXN0PGxpc3Q8c3RyaW5nPj4gbGlzdF9vZl9saXN0X2ZpZWxkCisgIDg6IGxpc3Q8bGlzdDxsaXN0PHN0cmluZz4+PiBsaXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZAogfQogCiBzdHJ1Y3QgQ29tcGxleExpc3QgewpkaWZmIC0tZ2l0IGEvdGVzdC9NYWtlZmlsZS5hbSBiL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggNmViY2QyNy4uZjZiODY3YyAxMDA3NTUKLS0tIGEvdGVzdC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L01ha2VmaWxlLmFtCkBAIC0xNyw3ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1TVUJESVJTID0KK1NVQkRJUlMgPSBmZWF0dXJlcwogUFJFQ1JPU1NfVEFSR0VUID0KIAogaWYgV0lUSF9DX0dMSUIKQEAgLTI1LDYgKzI1LDE2IEBACiBQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtY19nbGliCiBlbmRpZgogCitpZiBXSVRIX0NMCitTVUJESVJTICs9IGNsCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtY2wKK2VuZGlmCisKK2lmIFdJVEhfTU9OTworU1VCRElSUyArPSBjc2hhcnAKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1jc2hhcnAKK2VuZGlmCisKIGlmIFdJVEhfQ1BQCiBTVUJESVJTICs9IGNwcAogUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWNwcApAQCAtNDAsMTEgKzUwLDE4IEBACiBQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtcGhwCiBlbmRpZgogCitpZiBXSVRIX0RBUlQKK1NVQkRJUlMgKz0gZGFydAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWRhcnQKK2VuZGlmCisKIGlmIFdJVEhfUFlUSE9OCiBTVUJESVJTICs9IHB5CiBQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtcHkKLVNVQkRJUlMgKz0gcHkudHdpc3RlZAogU1VCRElSUyArPSBweS50b3JuYWRvCitpZiBXSVRIX1RXSVNURURfVEVTVAorU1VCRElSUyArPSBweS50d2lzdGVkCitlbmRpZgogZW5kaWYKIAogaWYgV0lUSF9SVUJZCkBAIC02MCw2ICs3NywxMSBAQAogU1VCRElSUyArPSBoYXhlCiBlbmRpZgogCitpZiBXSVRIX0RPVE5FVAorU1VCRElSUyArPSBuZXRjb3JlCitTVUJESVJTICs9IG5ldHN0ZAorZW5kaWYKKwogaWYgV0lUSF9HTwogU1VCRElSUyArPSBnbwogUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWdvCkBAIC02NywzMyArODksNjEgQEAKIAogaWYgV0lUSF9FUkxBTkcKIFNVQkRJUlMgKz0gZXJsCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtZXJsCitlbmRpZgorCitpZiBXSVRIX0xVQQorU1VCRElSUyArPSBsdWEKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1sdWEKK2VuZGlmCisKK2lmIFdJVEhfUlMKK1NVQkRJUlMgKz0gcnMKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1ycwogZW5kaWYKIAogIwotIyBnZW5lcmF0ZSBodG1sIGZvciBUaHJpZnRUZXN0LnRocmlmdAorIyBnZW5lcmF0ZSBodG1sIGZvciBUaHJpZnRUZXN0LnRocmlmdCBBTkQgdmFsaWRhdGUgaXQhCiAjCitpZiBXSVRIX05PREVKUwogY2hlY2stbG9jYWw6CiAJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gaHRtbCAtciAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwkkKHRvcF9idWlsZGRpcikvbm9kZV9tb2R1bGVzLy5iaW4vaHRtbC12YWxpZGF0b3IgLS1maWxlPWdlbi1odG1sL2luZGV4Lmh0bWwgLS12ZXJib3NlCisJJCh0b3BfYnVpbGRkaXIpL25vZGVfbW9kdWxlcy8uYmluL2h0bWwtdmFsaWRhdG9yIC0tZmlsZT1nZW4taHRtbC9UaHJpZnRUZXN0Lmh0bWwgLS12ZXJib3NlCitlbHNlCitjaGVjay1sb2NhbDoKKwkkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBodG1sIC1yICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorZW5kaWYKIAogY2xlYW4tbG9jYWw6Ci0Jcm0gLXJmICQodG9wX3NyY2RpcikvdGVzdC9nZW4taHRtbAorCSQoUk0pIC1yICQodG9wX3NyY2RpcikvdGVzdC9nZW4taHRtbC8KKwlmaW5kIC4gLXR5cGUgZCAtbmFtZSAiX19weWNhY2hlX18iIHwgeGFyZ3Mgcm0gLXJmCisJZmluZCAuIC10eXBlIGYgLW5hbWUgIioucHljIiB8IHhhcmdzIHJtIC1mCisKK2Rpc3QtaG9vazoKKwkkKFJNKSAtciAkKGRpc3RkaXIpL2dlbi1odG1sLworCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIC1uYW1lICJfX3B5Y2FjaGVfXyIgfCB4YXJncyBybSAtcmYKKwlmaW5kICQoZGlzdGRpcikgLXR5cGUgZiAtbmFtZSAiKi5weWMiIHwgeGFyZ3Mgcm0gLWYKIAogRVhUUkFfRElTVCA9IFwKIAlhdWRpdCBcCi0JY3Jvc3NydW5uZXIgXAotCWtleXMgXAogCWNfZ2xpYiBcCisJY2wgXAogCWNwcCBcCisJY3Jvc3NydW5uZXIgXAorCWRhcnQgXAogCWVybCBcCiAJaHMgXAorCWtleXMgXAogCWx1YSBcCiAJb2NhbWwgXAogCXBlcmwgXAogCXBocCBcCiAJcHkgXAotCXB5LnR3aXN0ZWQgXAogCXB5LnRvcm5hZG8gXAorCXB5LnR3aXN0ZWQgXAogCXJiIFwKKwlycyBcCiAJdGhyZWFkcyBcCiAJQW5ub3RhdGlvblRlc3QudGhyaWZ0IFwKIAlCcm9rZW5Db25zdGFudHMudGhyaWZ0IFwKQEAgLTEwMSwxMCArMTUxLDE1IEBACiAJRGVidWdQcm90b1Rlc3QudGhyaWZ0IFwKIAlEZW5zZUxpbmtpbmdUZXN0LnRocmlmdCBcCiAJRG9jVGVzdC50aHJpZnQgXAorCURvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IFwKKwlFbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0IFwKIAlFbnVtVGVzdC50aHJpZnQgXAotCWtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gXAorCUZ1bGxDYW1lbFRlc3QudGhyaWZ0IFwKIAlJbmNsdWRlLnRocmlmdCBcCisJSW50NjRUZXN0LnRocmlmdCBcCiAJSmF2YUJlYW5zVGVzdC50aHJpZnQgXAorCUphdmFEZWVwQ29weVRlc3QudGhyaWZ0IFwKKwlKYXZhVHlwZXMudGhyaWZ0IFwKIAlKc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0IFwKIAlNYW55T3B0aW9uYWxzLnRocmlmdCBcCiAJTWFueVR5cGVkZWZzLnRocmlmdCBcCkBAIC0xMTQsMTIgKzE2OSwxNSBAQAogCVJldXNlT2JqZWN0cy50aHJpZnQgXAogCVNtYWxsVGVzdC50aHJpZnQgXAogCVN0cmVzc1Rlc3QudGhyaWZ0IFwKLQl0ZXN0LnB5IFwKLQl0ZXN0cy5qc29uIFwKIAlUaHJpZnRUZXN0LnRocmlmdCBcCiAJVHlwZWRlZlRlc3QudGhyaWZ0IFwKLQlGYXN0YmluYXJ5VGVzdC5weSBcCi0JcmVzdWx0Lmh0bWwgXAorCVVuc2FmZVR5cGVzLnRocmlmdCBcCisJa25vd25fZmFpbHVyZXNfTGludXguanNvbiBcCisJdGVzdC5weSBcCisJdGVzdHMuanNvbiBcCisJcmVidWlsZF9rbm93bl9mYWlsdXJlcy5zaCBcCisJcmVzdWx0LmpzIFwKKwlpbmRleC5odG1sIFwKIAlSRUFETUUubWQgXAogCXZhbGdyaW5kLnN1cHByZXNzCiAKZGlmZiAtLWdpdCBhL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0IGIvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKaW5kZXggZGNkZDBmMi4uYTYwODg5OCAxMDA2NDQKLS0tIGEvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKKysrIGIvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKQEAgLTgwLDMgKzgwLDkgQEAKICAgNTogcmVxdWlyZWQgYmluYXJ5IHJlcV9iaW47CiAgIDY6IG9wdGlvbmFsIGJpbmFyeSBvcHRfYmluOwogfQorCitzdHJ1Y3QgQmluYXJpZXMgeworICA0OiBiaW5hcnkgYmluOworICA1OiByZXF1aXJlZCBiaW5hcnkgcmVxX2JpbjsKKyAgNjogb3B0aW9uYWwgYmluYXJ5IG9wdF9iaW47Cit9CmRpZmYgLS1naXQgYS90ZXN0L1JFQURNRS5tZCBiL3Rlc3QvUkVBRE1FLm1kCmluZGV4IGMxYTczZWMuLjA2ODJmNWQgMTAwNzU1Ci0tLSBhL3Rlc3QvUkVBRE1FLm1kCisrKyBiL3Rlc3QvUkVBRE1FLm1kCkBAIC0zMSw2ICszMSwxMSBAQAogICAgIHRlc3QvdGVzdC5weSAtLXNlcnZlciBjcHAsamF2YSAtLWNsaWVudCBub2RlanMKICAgICB0ZXN0L3Rlc3QucHkgLS1zZXJ2ZXIgbm9kZWpzIC0tY2xpZW50IGNwcCxqYXZhCiAKK0Fub3RoZXIgdXNlZnVsIGZsYWcgaXMgLS1yZWdleC4gRm9yIGV4YW1wbGUsIHRvIHJ1biBhbGwgdGVzdHMgdGhhdCBpbnZvbHZlCitKYXZhIFRCaW5hcnlQcm90b2NvbDoKKworICAgIHRlc3QvdGVzdC5weSAtLXJlZ2V4ICJqYXZhLipiaW5hcnkiCisKICMjIFRlc3QgY2FzZSBkZWZpbml0aW9uIGZpbGUKIAogVGhlIGNyb3NzIHRlc3QgY2FzZXMgYXJlIGRlZmluZWQgaW4gW3Rlc3RzLmpzb25dKHRlc3RzLmpzb24pLgpAQCAtMTYxLDcgKzE2Niw5IEBACiAgICAgICAjZGVmaW5lIFRFU1RfU1RSVUNUUyAgICAgICAyICAvLyAwMDAwIDAwMTAKICAgICAgICNkZWZpbmUgVEVTVF9DT05UQUlORVJTICAgIDQgIC8vIDAwMDAgMDEwMAogICAgICAgI2RlZmluZSBURVNUX0VYQ0VQVElPTlMgICAgOCAgLy8gMDAwMCAxMDAwCi0gICAgICAjZGVmaW5lIFRFU1RfTk9UVVNFRCAgICAgMjQwICAvLyAxMTExIDAwMDAgKHJlc2VydmVkIGJpdHMpCisgICAgICAjZGVmaW5lIFRFU1RfVU5LTk9XTiAgICAgIDY0ICAvLyAwMTAwIDAwMDAgKEZhaWxlZCB0byBwcmVwYXJlIGVudmlyb25lbXQgZXRjLikKKyAgICAgICNkZWZpbmUgVEVTVF9USU1FT1VUICAgICAxMjggIC8vIDEwMDAgMDAwMAorICAgICAgI2RlZmluZSBURVNUX05PVFVTRUQgICAgICA0OCAgLy8gMDAxMSAwMDAwIChyZXNlcnZlZCBiaXRzKQogCiBUZXN0cyB0aGF0IGhhdmUgbm90IGJlZW4gZXhlY3V0ZWQgYXQgYWxsIGNvdW50IGFzIGVycm9ycy4KIApkaWZmIC0tZ2l0IGEvdGVzdC9TdHJlc3NUZXN0LnRocmlmdCBiL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKaW5kZXggY2NmMjJhZi4uNDMxODExYiAxMDA2NDQKLS0tIGEvdGVzdC9TdHJlc3NUZXN0LnRocmlmdAorKysgYi90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CkBAIC0yNCwxMiArMjQsMTIgQEAKIHNlcnZpY2UgU2VydmljZSB7CiAKICAgdm9pZCBlY2hvVm9pZCgpLAotICBieXRlIGVjaG9CeXRlKDE6IGJ5dGUgYXJnKSwKKyAgaTggZWNob0J5dGUoMTogaTggYXJnKSwKICAgaTMyIGVjaG9JMzIoMTogaTMyIGFyZyksCiAgIGk2NCBlY2hvSTY0KDE6IGk2NCBhcmcpLAogICBzdHJpbmcgZWNob1N0cmluZygxOiBzdHJpbmcgYXJnKSwKLSAgbGlzdDxieXRlPiAgZWNob0xpc3QoMTogbGlzdDxieXRlPiBhcmcpLAotICBzZXQ8Ynl0ZT4gIGVjaG9TZXQoMTogc2V0PGJ5dGU+IGFyZyksCi0gIG1hcDxieXRlLCBieXRlPiAgZWNob01hcCgxOiBtYXA8Ynl0ZSwgYnl0ZT4gYXJnKSwKKyAgbGlzdDxpOD4gIGVjaG9MaXN0KDE6IGxpc3Q8aTg+IGFyZyksCisgIHNldDxpOD4gIGVjaG9TZXQoMTogc2V0PGk4PiBhcmcpLAorICBtYXA8aTgsIGk4PiAgZWNob01hcCgxOiBtYXA8aTgsIGk4PiBhcmcpLAogfQogCmRpZmYgLS1naXQgYS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IGIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAppbmRleCBhNzQ5NTY2Li5kMWU2YjVlIDEwMDY0NAotLS0gYS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisrKyBiL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKQEAgLTIyLDIwICsyMiwyMiBAQAogICovCiAKIG5hbWVzcGFjZSBjX2dsaWIgVFRlc3QKLW5hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CiBuYW1lc3BhY2UgY3BwIHRocmlmdC50ZXN0Ci1uYW1lc3BhY2UgcmIgVGhyaWZ0LlRlc3QKLW5hbWVzcGFjZSBwZXJsIFRocmlmdFRlc3QKIG5hbWVzcGFjZSBjc2hhcnAgVGhyaWZ0LlRlc3QKK25hbWVzcGFjZSBkZWxwaGkgVGhyaWZ0LlRlc3QKK25hbWVzcGFjZSBnbyB0aHJpZnR0ZXN0CituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAogbmFtZXNwYWNlIGpzIFRocmlmdFRlc3QKLW5hbWVzcGFjZSBzdCBUaHJpZnRUZXN0CituYW1lc3BhY2UgbHVhIFRocmlmdFRlc3QKK25hbWVzcGFjZSBuZXRjb3JlIFRocmlmdFRlc3QKK25hbWVzcGFjZSBuZXRzdGQgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIHBlcmwgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIHBocCBUaHJpZnRUZXN0CiBuYW1lc3BhY2UgcHkgVGhyaWZ0VGVzdAogbmFtZXNwYWNlIHB5LnR3aXN0ZWQgVGhyaWZ0VGVzdAotbmFtZXNwYWNlIGdvIHRocmlmdHRlc3QKLW5hbWVzcGFjZSBwaHAgVGhyaWZ0VGVzdAotbmFtZXNwYWNlIGRlbHBoaSBUaHJpZnQuVGVzdAotbmFtZXNwYWNlIGNvY29hIFRocmlmdFRlc3QKLW5hbWVzcGFjZSBsdWEgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIHJiIFRocmlmdC5UZXN0CituYW1lc3BhY2Ugc3QgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIHhzZCB0ZXN0ICh1cmkgPSAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL25zL1RocmlmdFRlc3QnKQogCiAvLyBQcmVzZW5jZSBvZiBuYW1lc3BhY2VzIGFuZCBzdWItbmFtZXNwYWNlcyBmb3Igd2hpY2ggdGhlcmUgaXMKIC8vIG5vIGdlbmVyYXRvciBzaG91bGQgY29tcGlsZSB3aXRoIHdhcm5pbmdzIG9ubHkKQEAgLTc5LDE0ICs4MSwxNCBAQAogc3RydWN0IFh0cnVjdAogewogICAxOiAgc3RyaW5nIHN0cmluZ190aGluZywKLSAgNDogIGJ5dGUgICBieXRlX3RoaW5nLAorICA0OiAgaTggICAgIGJ5dGVfdGhpbmcsCiAgIDk6ICBpMzIgICAgaTMyX3RoaW5nLAogICAxMTogaTY0ICAgIGk2NF90aGluZwogfQogCiBzdHJ1Y3QgWHRydWN0MgogewotICAxOiBieXRlICAgYnl0ZV90aGluZywKKyAgMTogaTggICAgIGJ5dGVfdGhpbmcsICAvLyB1c2VkIHRvIGJlIGJ5dGUsIGhlbmNlIHRoZSBuYW1lCiAgIDI6IFh0cnVjdCBzdHJ1Y3RfdGhpbmcsCiAgIDM6IGkzMiAgICBpMzJfdGhpbmcKIH0KQEAgLTEwNCwxNSArMTA2LDI0IEBACiB7CiAgIDE6IG1hcDxOdW1iZXJ6LCBVc2VySWQ+IHVzZXJNYXAsCiAgIDI6IGxpc3Q8WHRydWN0PiB4dHJ1Y3RzCi19Cit9IChweXRob24uaW1tdXRhYmxlPSAiIikKIAogc3RydWN0IENyYXp5TmVzdGluZyB7CiAgIDE6IHN0cmluZyBzdHJpbmdfZmllbGQsCiAgIDI6IG9wdGlvbmFsIHNldDxJbnNhbml0eT4gc2V0X2ZpZWxkLAotICAzOiByZXF1aXJlZCBsaXN0PCBtYXA8c2V0PGkzMj4sbWFwPGkzMixzZXQ8bGlzdDxtYXA8SW5zYW5pdHksc3RyaW5nPj4+Pj4+IGxpc3RfZmllbGQsCisgIC8vIERvIG5vdCBpbnNlcnQgbGluZSBicmVhayBhcyB0ZXN0L2dvL01ha2VmaWxlLmFtIGlzIHJlbW92aW5nIHRoaXMgbGluZSB3aXRoIHBhdHRlcm4gbWF0Y2gKKyAgMzogcmVxdWlyZWQgbGlzdDxtYXA8c2V0PGkzMj4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIG1hcDxpMzIsc2V0PGxpc3Q8bWFwPEluc2FuaXR5LHN0cmluZz4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4gKHB5dGhvbi5pbW11dGFibGUgPSAiIik+Pj4+IGxpc3RfZmllbGQsCiAgIDQ6IGJpbmFyeSBiaW5hcnlfZmllbGQKIH0KIAordW5pb24gU29tZVVuaW9uIHsKKyAgMTogbWFwPE51bWJlcnosIFVzZXJJZD4gbWFwX3RoaW5nLAorICAyOiBzdHJpbmcgc3RyaW5nX3RoaW5nLAorICAzOiBpMzIgaTMyX3RoaW5nLAorICA0OiBYdHJ1Y3QzIHh0cnVjdF90aGluZywKKyAgNTogSW5zYW5pdHkgaW5zYW5pdHlfdGhpbmcKK30KKwogZXhjZXB0aW9uIFhjZXB0aW9uIHsKICAgMTogaTMyIGVycm9yQ29kZSwKICAgMjogc3RyaW5nIG1lc3NhZ2UKQEAgLTE1MiwxMCArMTYzLDExIEBACiAKICAgLyoqCiAgICAqIFByaW50cyAndGVzdEJ5dGUoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJwotICAgKiBAcGFyYW0gYnl0ZSB0aGluZyAtIHRoZSBieXRlIHRvIHByaW50Ci0gICAqIEByZXR1cm4gYnl0ZSAtIHJldHVybnMgdGhlIGJ5dGUgJ3RoaW5nJworICAgKiBUaGUgdHlwZXMgaTggYW5kIGJ5dGUgYXJlIHN5bm9ueW1zLCB1c2Ugb2YgaTggaXMgZW5jb3VyYWdlZCwgYnl0ZSBzdGlsbCBleGlzdHMgZm9yIHRoZSBzYWtlIG9mIGNvbXBhdGliaWxpdHkuCisgICAqIEBwYXJhbSBieXRlIHRoaW5nIC0gdGhlIGk4L2J5dGUgdG8gcHJpbnQKKyAgICogQHJldHVybiBpOCAtIHJldHVybnMgdGhlIGk4L2J5dGUgJ3RoaW5nJwogICAgKi8KLSAgYnl0ZSAgICAgICAgIHRlc3RCeXRlKDE6IGJ5dGUgdGhpbmcpLAorICBpOCAgICAgICAgICAgdGVzdEJ5dGUoMTogaTggdGhpbmcpLAogCiAgIC8qKgogICAgKiBQcmludHMgJ3Rlc3RJMzIoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJwpAQCAtMTg0LDcgKzE5Niw3IEBACiAgICAqIEByZXR1cm4gYmluYXJ5ICAtIHJldHVybnMgdGhlIGJpbmFyeSAndGhpbmcnCiAgICAqLwogICBiaW5hcnkgICAgICAgdGVzdEJpbmFyeSgxOiBiaW5hcnkgdGhpbmcpLAotICAKKwogICAvKioKICAgICogUHJpbnRzICd0ZXN0U3RydWN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMKICAgICogQHBhcmFtIFh0cnVjdCB0aGluZyAtIHRoZSBYdHJ1Y3QgdG8gcHJpbnQKQEAgLTI2OCw3ICsyODAsNyBAQAogCiAgIC8qKgogICAgKiBQcmludHMgJ3Rlc3RNdWx0aSgpJwotICAgKiBAcGFyYW0gYnl0ZSBhcmcwIC0KKyAgICogQHBhcmFtIGk4IGFyZzAgLQogICAgKiBAcGFyYW0gaTMyIGFyZzEgLQogICAgKiBAcGFyYW0gaTY0IGFyZzIgLQogICAgKiBAcGFyYW0gbWFwPGkxNiwgc3RyaW5nPiBhcmczIC0KQEAgLTI3Nyw3ICsyODksNyBAQAogICAgKiBAcmV0dXJuIFh0cnVjdCAtIHJldHVybnMgYW4gWHRydWN0IHdpdGggc3RyaW5nX3RoaW5nID0gIkhlbGxvMiwgYnl0ZV90aGluZyA9IGFyZzAsIGkzMl90aGluZyA9IGFyZzEKICAgICogICAgYW5kIGk2NF90aGluZyA9IGFyZzIKICAgICovCi0gIFh0cnVjdCB0ZXN0TXVsdGkoMTogYnl0ZSBhcmcwLCAyOiBpMzIgYXJnMSwgMzogaTY0IGFyZzIsIDQ6IG1hcDxpMTYsIHN0cmluZz4gYXJnMywgNTogTnVtYmVyeiBhcmc0LCA2OiBVc2VySWQgYXJnNSksCisgIFh0cnVjdCB0ZXN0TXVsdGkoMTogaTggYXJnMCwgMjogaTMyIGFyZzEsIDM6IGk2NCBhcmcyLCA0OiBtYXA8aTE2LCBzdHJpbmc+IGFyZzMsIDU6IE51bWJlcnogYXJnNCwgNjogVXNlcklkIGFyZzUpLAogCiAgIC8qKgogICAgKiBQcmludCAndGVzdEV4Y2VwdGlvbiglcyknIHdpdGggYXJnIGFzICclcycKQEAgLTI5Miw3ICszMDQsNyBAQAogICAgKiBQcmludCAndGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcyknIHdpdGggYXJnMCBhcyAnJXMnIGFuZCBhcmcxIGFzICclcycKICAgICogQHBhcmFtIHN0cmluZyBhcmcgLSBhIHN0cmluZyBpbmRpY2F0aW9uIHdoYXQgdHlwZSBvZiBleGNlcHRpb24gdG8gdGhyb3cKICAgICogaWYgYXJnMCA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIgotICAgKiBlbHNlbiBpZiBhcmcwID09ICJYY2VwdGlvbjIiIHRocm93IFhjZXB0aW9uMiB3aXRoIGVycm9yQ29kZSA9IDIwMDIgYW5kIG1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisgICAqIGVsc2VuIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiIgdGhyb3cgWGNlcHRpb24yIHdpdGggZXJyb3JDb2RlID0gMjAwMiBhbmQgc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKICAgICogZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKICAgICogQHJldHVybiBYdHJ1Y3QgLSBhbiBYdHJ1Y3Qgd2l0aCBzdHJpbmdfdGhpbmcgPSBhcmcxCiAgICAqLwpAQCAtMzA5LDEzICszMjEsMTIgQEAKIAogc2VydmljZSBTZWNvbmRTZXJ2aWNlCiB7Ci0gIHZvaWQgYmxhaEJsYWgoKQogICAvKioKICAgICogUHJpbnRzICd0ZXN0U3RyaW5nKCIlcyIpJyB3aXRoIHRoaW5nIGFzICclcycKICAgICogQHBhcmFtIHN0cmluZyB0aGluZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQKICAgICogQHJldHVybiBzdHJpbmcgLSByZXR1cm5zIHRoZSBzdHJpbmcgJ3RoaW5nJwogICAgKi8KLSAgc3RyaW5nICAgICAgIHNlY29uZHRlc3RTdHJpbmcoMTogc3RyaW5nIHRoaW5nKSwKKyAgc3RyaW5nIHNlY29uZHRlc3RTdHJpbmcoMTogc3RyaW5nIHRoaW5nKQogfQogCiBzdHJ1Y3QgVmVyc2lvbmluZ1Rlc3RWMSB7CkBAIC0zMjgsNyArMzM5LDcgQEAKICAgICAgICAxOiBpMzIgYmVnaW5faW5fYm90aCwKIAogICAgICAgIDI6IGkzMiBuZXdpbnQsCi0gICAgICAgMzogYnl0ZSBuZXdieXRlLAorICAgICAgIDM6IGk4IG5ld2J5dGUsCiAgICAgICAgNDogaTE2IG5ld3Nob3J0LAogICAgICAgIDU6IGk2NCBuZXdsb25nLAogICAgICAgIDY6IGRvdWJsZSBuZXdkb3VibGUKZGlmZiAtLWdpdCBhL3Rlc3QvVW5zYWZlVHlwZXMudGhyaWZ0IGIvdGVzdC9VbnNhZmVUeXBlcy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4YzkwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvVW5zYWZlVHlwZXMudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworc3RydWN0IFVuc2FmZUJ5dGVzIHsKKyAgMTogYmluYXJ5IGJ5dGVzOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvQ01ha2VMaXN0cy50eHQgYi90ZXN0L2NfZ2xpYi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODE3MzE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jX2dsaWIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgQ29udGFpbnMgdGhlIHRocmlmdCBzcGVjaWZpYyBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkKK2luY2x1ZGUoVGhyaWZ0TWFjcm9zKQorCitmaW5kX3BhY2thZ2UoR0xJQiBSRVFVSVJFRCBDT01QT05FTlRTIGdvYmplY3QpCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtHTElCX0lOQ0xVREVfRElSfSIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtHTElCQ09ORklHX0lOQ0xVREVfRElSfSIpCisKKyNNYWtlIHN1cmUgZ2VuLWNfZ2xpYiBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNfZ2xpYiIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vbGliL2NfZ2xpYi9zcmMiKQorCitzZXQoY3Jvc3N0ZXN0Z2VuY2dsaWJfU09VUkNFUworCWdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMKKwlnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oCisJZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYworCWdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmgKKwlnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jCisJZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaAorKQorYWRkX2xpYnJhcnkoY3Jvc3N0ZXN0Z2VuY2dsaWIgU1RBVElDICR7Y3Jvc3N0ZXN0Z2VuY2dsaWJfU09VUkNFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoY3Jvc3N0ZXN0Z2VuY2dsaWIgdGhyaWZ0X2NfZ2xpYikKKworYWRkX2V4ZWN1dGFibGUodGVzdF9zZXJ2ZXIgc3JjL3Rlc3Rfc2VydmVyLmMgc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuYyBzcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0X3NlcnZlciBjcm9zc3Rlc3RnZW5jZ2xpYikKKworYWRkX2V4ZWN1dGFibGUodGVzdF9jbGllbnQgc3JjL3Rlc3RfY2xpZW50LmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdF9jbGllbnQgY3Jvc3N0ZXN0Z2VuY2dsaWIpCisKKyMKKyMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKKyMKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY19nbGliIC1yICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CispCmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9NYWtlZmlsZS5hbSBiL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtCmluZGV4IDc1NTlmZDYuLjAxYWIyY2EgMTAwNzU1Ci0tLSBhL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtCkBAIC0yOSw3ICsyOSw3IEBACiAKIGxpYnRlc3RjZ2xpYl9sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCiAKLXByZWNyb3NzOiB0ZXN0X2NsaWVudCB0ZXN0X3NlcnZlcgorcHJlY3Jvc3M6IGxpYnRlc3RjZ2xpYi5sYSB0ZXN0X2NsaWVudCB0ZXN0X3NlcnZlcgogCiBjaGVja19QUk9HUkFNUyA9IFwKIAl0ZXN0X2NsaWVudCBcCkBAIC00NSw2ICs0NSw4IEBACiB0ZXN0X3NlcnZlcl9TT1VSQ0VTID0gXAogCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMgXAogCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmggXAorCXNyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jIFwKKwlzcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCBcCiAJc3JjL3Rlc3Rfc2VydmVyLmMKIAogdGVzdF9zZXJ2ZXJfTERBREQgPSBcCkBAIC01NCw4ICs1Niw2IEBACiAjCiAjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCiAjCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAtciAkPAogCkBAIC02NSwxMCArNjUsMTggQEAKIEFNX0xERkxBR1MgPSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpIEBHQ09WX0xERkxBR1NACiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIGdlbi1jX2dsaWIvKgorCSQoUk0pIC1yIGdlbi1jX2dsaWIvCisJJChSTSkgdGVzdF9jbGllbnQKKwkkKFJNKSB0ZXN0X3NlcnZlcgorCSQoUk0pIGxpYnRlc3RjZ2xpYi5sYQorCWZpbmQgLiAtdHlwZSBmIC1pbmFtZSAiKi5vIiB8IHhhcmdzIHJtIC1mCisKK2Rpc3QtaG9vazoKKwkkKFJNKSAtciAkKGRpc3RkaXIpL2dlbi1jX2dsaWIvCisJJChSTSkgJChkaXN0ZGlyKS90ZXN0X2NsaWVudAorCSQoUk0pICQoZGlzdGRpcikvdGVzdF9zZXJ2ZXIKKwkkKFJNKSAkKGRpc3RkaXIpL2xpYnRlc3RjZ2xpYi5sYQorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBmIC1pbmFtZSAiKi5vIiB8IHhhcmdzIHJtIC1mCiAKIEVYVFJBX0RJU1QgPSBcCi0Jc3JjL3Rlc3RfY2xpZW50LmMgXAotCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMgXAotCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmggXAotCXNyYy90ZXN0X3NlcnZlci5jCisJc3JjCmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9jbGllbnQuYyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X2NsaWVudC5jCmluZGV4IGIxZmUwNjUuLmVmMjRhYjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvY19nbGliL3NyYy90ZXN0X2NsaWVudC5jCisrKyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X2NsaWVudC5jCkBAIC0yNywxMSArMjcsMTUgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgogCisjaW5jbHVkZSAiLi4vZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCIKICNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIgogCiAvKiBIYW5kbGUgU0lHUElQRSBzaWduYWxzIChpbmRpY2F0aW5nIHRoZSBzZXJ2ZXIgaGFzIGNsb3NlZCB0aGUKQEAgLTcxLDQyICs3NSw4MiBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCisvKioKKyAqIEl0IGdldHMgYSBtdWx0aXBsZXhlZCBwcm90b2NvbCB3aGljaCB1c2VzIGEgY29uY3JldGUgcHJvdG9jb2wgdW5kZXJuZWF0aAorICogQHBhcmFtICBwcm90b2NvbF9uYW1lICB0aGUgZnVsbHkgcXVhbGlmaWVkIHByb3RvY29sIHBhdGggKGUuZy4gImJpbmFyeTptdWx0aSIpCisgKiBAcGFyYW0gIHRyYW5zcG9ydCAgICAgIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICogQHBhcmFtICBzZXJ2aWNlX25hbWUgICB0aGUgc2luZ2xlIHN1cHBvcnRlZCBzZXJ2aWNlIG5hbWUKKyAqIEB0b2RvICAgICAgICAgICAgICAgICAgbmVlZCB0byBhbGxvdyBtdWx0aXBsZSBzZXJ2aWNlcyB0byBmdWxseSB0ZXN0IG11bHRpcGxleGVkCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgIGEgbXVsdGlwbGV4ZWQgcHJvdG9jb2wgd3JhcHBpbmcgdGhlIGNvcnJlY3QgdW5kZXJseWluZyBwcm90b2NvbAorICovCitUaHJpZnRQcm90b2NvbCAqCitnZXRfbXVsdGlwbGV4ZWRfcHJvdG9jb2woZ2NoYXIgKnByb3RvY29sX25hbWUsIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBnY2hhciAqc2VydmljZV9uYW1lKQoreworICBUaHJpZnRQcm90b2NvbCAqIG11bHRpcGxleGVkX3Byb3RvY29sID0gTlVMTDsKKworICBpZiAoIHN0cm5jbXAocHJvdG9jb2xfbmFtZSwgImJpbmFyeToiLCA3KSA9PSAwKSB7CisgICAgbXVsdGlwbGV4ZWRfcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgTlVMTCk7CisgIH0gZWxzZSBpZiAoIHN0cm5jbXAocHJvdG9jb2xfbmFtZSwgImNvbXBhY3Q6IiwgOCkgPT0gMCkgeworICAgIG11bHRpcGxleGVkX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbXVsdGlwbGV4IHByb3RvY29sIG5hbWU6ICVzXG4iLCBwcm90b2NvbF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MLAorICAgICAgICAgICJ0cmFuc3BvcnQiLCAgICAgIHRyYW5zcG9ydCwKKyAgICAgICAgICAicHJvdG9jb2wiLCAgICAgICBtdWx0aXBsZXhlZF9wcm90b2NvbCwKKyAgICAgICAgICAic2VydmljZS1uYW1lIiwgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgTlVMTCk7Cit9CisKIGludAogbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotICBzdGF0aWMgZ2NoYXIgKmhvc3QgPSBOVUxMOwotICBzdGF0aWMgZ2ludCAgIHBvcnQgPSA5MDkwOwotICBzdGF0aWMgZ2NoYXIgKnRyYW5zcG9ydF9vcHRpb24gPSBOVUxMOwotICBzdGF0aWMgZ2NoYXIgKnByb3RvY29sX29wdGlvbiA9IE5VTEw7Ci0gIHN0YXRpYyBnaW50ICAgbnVtX3Rlc3RzID0gMTsKKyAgc3RhdGljIGdjaGFyICogIGhvc3QgPSBOVUxMOworICBzdGF0aWMgZ2ludCAgICAgcG9ydCA9IDkwOTA7CisgIHN0YXRpYyBnYm9vbGVhbiBzc2wgID0gRkFMU0U7CisgIHN0YXRpYyBnY2hhciAqICB0cmFuc3BvcnRfb3B0aW9uID0gTlVMTDsKKyAgc3RhdGljIGdjaGFyICogIHByb3RvY29sX29wdGlvbiA9IE5VTEw7CisgIHN0YXRpYyBnaW50ICAgICBudW1fdGVzdHMgPSAxOwogCiAgIHN0YXRpYwogICAgIEdPcHRpb25FbnRyeSBvcHRpb25fZW50cmllc1tdID17Ci0gICAgeyAiaG9zdCIsICAgICAgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmaG9zdCwKKyAgICB7ICJob3N0IiwgICAgICAgICAgICAnaCcsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJmhvc3QsCiAgICAgICAiSG9zdCB0byBjb25uZWN0ICg9bG9jYWxob3N0KSIsIE5VTEwgfSwKLSAgICB7ICJwb3J0IiwgICAgICAgICAgICAwLCAwLCBHX09QVElPTl9BUkdfSU5ULCAgICAgICZwb3J0LAorICAgIHsgInBvcnQiLCAgICAgICAgICAgICdwJywgMCwgR19PUFRJT05fQVJHX0lOVCwgICAgICAmcG9ydCwKICAgICAgICJQb3J0IG51bWJlciB0byBjb25uZWN0ICg9OTA5MCkiLCBOVUxMIH0sCi0gICAgeyAidHJhbnNwb3J0IiwgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmdHJhbnNwb3J0X29wdGlvbiwKKyAgICB7ICJzc2wiLCAgICAgICAgICAgICAncycsIDAsIEdfT1BUSU9OX0FSR19OT05FLCAgICAgJnNzbCwKKyAgICAgICJFbmFibGUgU1NMIiwgTlVMTCB9LAorICAgIHsgInRyYW5zcG9ydCIsICAgICAgICd0JywgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmdHJhbnNwb3J0X29wdGlvbiwKICAgICAgICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQgKD1idWZmZXJlZCkiLCBOVUxMIH0sCi0gICAgeyAicHJvdG9jb2wiLCAgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmcHJvdG9jb2xfb3B0aW9uLAotICAgICAgIlByb3RvY29sOiBiaW5hcnkgKD1iaW5hcnkpIiwgTlVMTCB9LAotICAgIHsgInRlc3Rsb29wcyIsICAgICAnbicsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJm51bV90ZXN0cywKKyAgICB7ICJwcm90b2NvbCIsICAgICAgICAncicsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJnByb3RvY29sX29wdGlvbiwKKyAgICAgICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBtdWx0aSwgbXVsdGljICg9YmluYXJ5KSIsIE5VTEwgfSwKKyAgICB7ICJ0ZXN0bG9vcHMiLCAgICAgICAnbicsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJm51bV90ZXN0cywKICAgICAgICJOdW1iZXIgb2YgdGVzdHMgKD0xKSIsIE5VTEwgfSwKICAgICB7IE5VTEwgfQogICB9OwogCiAgIHN0cnVjdCBzaWdhY3Rpb24gc2lncGlwZV9hY3Rpb247CiAKKyAgR1R5cGUgIHNvY2tldF90eXBlICAgID0gVEhSSUZUX1RZUEVfU09DS0VUOworICBnY2hhciAqc29ja2V0X25hbWUgICAgPSAiaXAiOwogICBHVHlwZSAgdHJhbnNwb3J0X3R5cGUgPSBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQ7CiAgIGdjaGFyICp0cmFuc3BvcnRfbmFtZSA9ICJidWZmZXJlZCI7CiAgIEdUeXBlICBwcm90b2NvbF90eXBlICA9IFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTDsKICAgZ2NoYXIgKnByb3RvY29sX25hbWUgID0gImJpbmFyeSI7CiAKLSAgVGhyaWZ0U29ja2V0ICAgICpzb2NrZXQ7Ci0gIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OwotICBUaHJpZnRQcm90b2NvbCAgKnByb3RvY29sOworICBUaHJpZnRTb2NrZXQgICAgKnNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgICpwcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICAqcHJvdG9jb2wyID0gTlVMTDsgICAgICAgICAgICAvLyBmb3IgbXVsdGlwbGV4ZWQgdGVzdHMKIAotICBUVGVzdFRocmlmdFRlc3RJZiAqdGVzdF9jbGllbnQ7CisgIFRUZXN0VGhyaWZ0VGVzdElmICp0ZXN0X2NsaWVudCA9IE5VTEw7CisgIFRUZXN0U2Vjb25kU2VydmljZUlmICpzZWNvbmRfc2VydmljZSA9IE5VTEw7ICAvLyBmb3IgbXVsdGlwbGV4ZWQgdGVzdHMKIAogICBzdHJ1Y3QgdGltZXZhbCB0aW1lX3N0YXJ0LCB0aW1lX3N0b3AsIHRpbWVfZWxhcHNlZDsKICAgZ3VpbnQ2NCB0aW1lX2VsYXBzZWRfdXNlYywgdGltZV90b3RhbF91c2VjID0gMDsKQEAgLTE0MSwxMCArMTg1LDI2IEBACiAgICAgaG9zdCA9IGdfc3RyZHVwICgibG9jYWxob3N0Iik7CiAKICAgLyogVmFsaWRhdGUgdGhlIHBhcnNlZCBvcHRpb25zICovCi0gIGlmIChwcm90b2NvbF9vcHRpb24gIT0gTlVMTCAmJgotICAgICAgc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAiYmluYXJ5IiwgNykgIT0gMCkgewotICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gcHJvdG9jb2wgdHlwZSAlc1xuIiwgcHJvdG9jb2xfb3B0aW9uKTsKLSAgICBvcHRpb25zX3ZhbGlkID0gRkFMU0U7CisgIGlmIChwcm90b2NvbF9vcHRpb24gIT0gTlVMTCkgeworICAgIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJjb21wYWN0IiwgOCkgPT0gMCkgeworICAgICAgcHJvdG9jb2xfdHlwZSA9IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0w7CisgICAgICBwcm90b2NvbF9uYW1lID0gImNvbXBhY3QiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJtdWx0aSIsIDYpID09IDApIHsKKyAgICAgIHByb3RvY29sX3R5cGUgPSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTDsKKyAgICAgIHByb3RvY29sX25hbWUgPSAiYmluYXJ5Om11bHRpIjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAibXVsdGljIiwgNykgPT0gMCkgeworICAgICAgcHJvdG9jb2xfdHlwZSA9IFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MOworICAgICAgcHJvdG9jb2xfbmFtZSA9ICJjb21wYWN0Om11bHRpYyI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImJpbmFyeSIsIDcpID09IDApIHsKKyAgICAgIHByaW50ZigiV2UgYXJlIGdvaW5nIHdpdGggZGVmYXVsdCBwcm90b2NvbFxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biBwcm90b2NvbCB0eXBlICVzXG4iLCBwcm90b2NvbF9vcHRpb24pOworICAgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOworICAgIH0KICAgfQogCiAgIGlmICh0cmFuc3BvcnRfb3B0aW9uICE9IE5VTEwpIHsKQEAgLTE1OCwxMiArMjE4LDE5IEBACiAgICAgfQogICB9CiAKKyAgaWYgKHNzbCkgeworICAgIHNvY2tldF90eXBlID0gVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVDsKKyAgICBzb2NrZXRfbmFtZSA9ICJpcC1zc2wiOworICAgIHByaW50ZigiVHlwZSBuYW1lICVzXG4iLCBnX3R5cGVfbmFtZSAoc29ja2V0X3R5cGUpKTsKKyAgfQorCiAgIGlmICghb3B0aW9uc192YWxpZCkKICAgICByZXR1cm4gMjU0OwogCi0gIHByaW50ZiAoIkNvbm5lY3RpbmcgKCVzLyVzKSB0bzogJXM6JWRcbiIsCisgIHByaW50ZiAoIkNvbm5lY3RpbmcgKCVzLyVzKSB0bzogJXMvJXM6JWRcbiIsCiAgICAgICAgICAgdHJhbnNwb3J0X25hbWUsCiAgICAgICAgICAgcHJvdG9jb2xfbmFtZSwKKyAgICAgICAgICBzb2NrZXRfbmFtZSwKICAgICAgICAgICBob3N0LAogICAgICAgICAgIHBvcnQpOwogCkBAIC0xNzUsMTcgKzI0Miw1MCBAQAogICBzaWdwaXBlX2FjdGlvbi5zYV9mbGFncyA9IFNBX1JFU0VUSEFORDsKICAgc2lnYWN0aW9uIChTSUdQSVBFLCAmc2lncGlwZV9hY3Rpb24sIE5VTEwpOwogCisgIGlmIChzc2wpIHsKKyAgICB0aHJpZnRfc3NsX3NvY2tldF9pbml0aWFsaXplX29wZW5zc2woKTsKKyAgfQorCiAgIC8qIEVzdGFibGlzaCBhbGwgb3VyIGNvbm5lY3Rpb24gb2JqZWN0cyAqLwotICBzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKKyAgc29ja2V0ID0gZ19vYmplY3RfbmV3IChzb2NrZXRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCBob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgICAgIHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgaWYgKHNzbCAmJiAhdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKFRIUklGVF9TU0xfU09DS0VUKHNvY2tldCksICIuLi9rZXlzL0NBLnBlbSIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gbG9hZCB2YWxpZGF0aW9uIGNlcnRpZmljYXRlIC4uL2tleXMvQ0EucGVtIC0gZGlkIHlvdSBydW4gaW4gdGhlIHRlc3QvY19nbGliIGRpcmVjdG9yeT9cbiIpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmc29ja2V0KTsKKyAgICByZXR1cm4gMjUzOworICB9CisKICAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3ICh0cmFuc3BvcnRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0Iiwgc29ja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZihwcm90b2NvbF90eXBlPT1USFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCkgeworICAgIC8vIFRPRE86IEEgbXVsdGlwbGV4ZWQgdGVzdCBzaG91bGQgYWxzbyB0ZXN0ICJTZWNvbmQiIChzZWUgSmF2YSBUZXN0U2VydmVyKQorICAgIC8vIFRoZSBjb250ZXh0IGNvbWVzIGZyb20gdGhlIG5hbWUgb2YgdGhlIHRocmlmdCBmaWxlLiBJZiBtdWx0aXBsZSB0aHJpZnQKKyAgICAvLyBzY2hlbWFzIGFyZSB1c2VkIHdlIGhhdmUgdG8gcmVkbyB0aGUgd2F5IHRoaXMgaXMgZG9uZS4KKyAgICBwcm90b2NvbCA9IGdldF9tdWx0aXBsZXhlZF9wcm90b2NvbChwcm90b2NvbF9uYW1lLCB0cmFuc3BvcnQsICJUaHJpZnRUZXN0Iik7CisgICAgaWYgKE5VTEwgPT0gcHJvdG9jb2wpIHsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmdHJhbnNwb3J0KTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmc29ja2V0KTsKKyAgICAgIHJldHVybiAyNTI7CisgICAgfQorCisgICAgLy8gTWFrZSBhIHNlY29uZCBwcm90b2NvbCBhbmQgY2xpZW50IHJ1bm5pbmcgb24gdGhlIHNhbWUgbXVsdGlwbGV4ZWQgdHJhbnNwb3J0CisgICAgcHJvdG9jb2wyID0gZ2V0X211bHRpcGxleGVkX3Byb3RvY29sKHByb3RvY29sX25hbWUsIHRyYW5zcG9ydCwgIlNlY29uZFNlcnZpY2UiKTsKKyAgICBzZWNvbmRfc2VydmljZSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfU0VDT05EX1NFUlZJQ0VfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2wiLCAgcHJvdG9jb2wyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgcHJvdG9jb2wyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICB9ZWxzZXsKKyAgICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfdHlwZSwKKyAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgTlVMTCk7CisgIH0KKwogICB0ZXN0X2NsaWVudCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVEhSSUZUX1RFU1RfQ0xJRU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sIiwgIHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbCIsIHByb3RvY29sLApAQCAtMjA0LDcgKzMwNCw3IEBACiAgICAgICBnaW50IGJ5dGVfdGhpbmcsIGkzMl90aGluZywgaW5uZXJfYnl0ZV90aGluZywgaW5uZXJfaTMyX3RoaW5nOwogICAgICAgZ2ludDY0IGk2NF90aGluZywgaW5uZXJfaTY0X3RoaW5nOwogCi0gICAgICBUVGVzdFh0cnVjdCAgKnh0cnVjdF9vdXQsICAqeHRydWN0X2luLCAgKmlubmVyX3h0cnVjdF9pbjsKKyAgICAgIFRUZXN0WHRydWN0ICAqeHRydWN0X291dCwgICp4dHJ1Y3Rfb3V0MiwgKnh0cnVjdF9pbiwgICppbm5lcl94dHJ1Y3RfaW47CiAgICAgICBUVGVzdFh0cnVjdDIgKnh0cnVjdDJfb3V0LCAqeHRydWN0Ml9pbjsKIAogICAgICAgR0hhc2hUYWJsZSAqbWFwX291dCwgKm1hcF9pbiwgKmlubmVyX21hcF9pbjsKQEAgLTIxNyw4ICszMTcsOSBAQAogICAgICAgR0FycmF5ICpsaXN0X291dCwgKmxpc3RfaW47CiAKICAgICAgIFRUZXN0TnVtYmVyeiBudW1iZXJ6OworICAgICAgVFRlc3ROdW1iZXJ6IG51bWJlcnoyOwogCi0gICAgICBUVGVzdFVzZXJJZCB1c2VyX2lkLCAqdXNlcl9pZF9wdHI7CisgICAgICBUVGVzdFVzZXJJZCB1c2VyX2lkLCAqdXNlcl9pZF9wdHIsICp1c2VyX2lkX3B0cjI7CiAKICAgICAgIFRUZXN0SW5zYW5pdHkgKmluc2FuaXR5X291dCwgKmluc2FuaXR5X2luOwogICAgICAgR0hhc2hUYWJsZSAqdXNlcl9tYXA7CkBAIC0yNzAsMTAgKzM3MSwxMSBAQAogICAgICAgICBwcmludGYgKCIgPSB2b2lkXG4iKTsKICAgICAgIH0KICAgICAgIGVsc2UgewotICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOwotICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKLSAgICAgICAgZXJyb3IgPSBOVUxMOwotCisgICAgICAgIGlmKGVycm9yIT1OVUxMKXsKKyAgICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBmYWlsX2NvdW50Kys7CiAgICAgICB9CiAKQEAgLTMwMSw2ICs0MDMsMzEgQEAKICAgICAgIH0KIAogICAgICAgLyoqCisgICAgICAgKiBNdWx0aXBsZXhlZCBUZXN0IC0gZG8gdGhpcyByaWdodCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBub3JtYWwgVGVzdCBDbGllbnQgcnVuCisgICAgICAgKi8KKyAgICAgIGlmIChzZWNvbmRfc2VydmljZSkgeworICAgICAgICBwcmludGYgKCJ0ZXN0U2Vjb25kU2VydmljZU11bHRpcGxleFNlY29uZFRlc3RTdHJpbmcoXCIybmRcIikiKTsKKyAgICAgICAgaWYgKHRfdGVzdF9zZWNvbmRfc2VydmljZV9pZl9zZWNvbmR0ZXN0X3N0cmluZyAoc2Vjb25kX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIybmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgICAgcHJpbnRmICgiID0gXCIlc1wiXG4iLCBzdHJpbmcpOworICAgICAgICAgIGlmIChzdHJjbXAgKHN0cmluZywgInRlc3RTdHJpbmcoXCIybmRcIikiKSAhPSAwKSB7CisgICAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ19mcmVlIChzdHJpbmcpOworICAgICAgICAgIHN0cmluZyA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoqCiAgICAgICAgKiBCT09MIFRFU1QKICAgICAgICAqLwogICAgICAgcHJpbnRmICgidGVzdEJ5dGUodHJ1ZSkiKTsKQEAgLTM1NSw2ICs0ODIsMjIgQEAKIAogICAgICAgICBmYWlsX2NvdW50Kys7CiAgICAgICB9CisgICAgICBwcmludGYgKCJ0ZXN0Qnl0ZSgtMSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9ieXRlICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9ICVkXG4iLCBieXRlKTsKKyAgICAgICAgaWYgKGJ5dGUgIT0gLTEpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQogCiAgICAgICAvKioKICAgICAgICAqIEkzMiBURVNUCkBAIC00MTYsOCArNTU5LDEwNSBAQAogICAgICAgICBmYWlsX2NvdW50Kys7CiAgICAgICB9CiAKLSAgICAgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgCSAgCi0JICAKKyAgICAgIC8qKgorICAgICAgICogQklOQVJZIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdEJpbmFyeShlbXB0eSkiKTsKKyAgICAgIEdCeXRlQXJyYXkgKmVtcHR5QXJyYXkgPSBnX2J5dGVfYXJyYXlfbmV3KCk7CisgICAgICBHQnl0ZUFycmF5ICpyZXN1bHQgPSBOVUxMOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2JpbmFyeSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgR0J5dGVzICpyZXNwb25zZSA9IGdfYnl0ZV9hcnJheV9mcmVlX3RvX2J5dGVzKHJlc3VsdCk7ICAvLyBmcmVlcyByZXN1bHQKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgZ3NpemUgc2l6ID0gZ19ieXRlc19nZXRfc2l6ZShyZXNwb25zZSk7CisgICAgICAgIGlmIChzaXogPT0gMCkgeworICAgICAgICAgIHByaW50ZigiID0gZW1wdHlcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50ZigiID0gbm90IGVtcHR5ICglbGQgYnl0ZXMpXG4iLCAobG9uZylzaXopOworICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgfQorICAgICAgICBnX2J5dGVzX3VucmVmKHJlc3BvbnNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZ19ieXRlX2FycmF5X3VucmVmKGVtcHR5QXJyYXkpOworICAgICAgZW1wdHlBcnJheSA9IE5VTEw7CisKKyAgICAgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgd2l0aCBkYXRhCisgICAgICBwcmludGYgKCJ0ZXN0QmluYXJ5KFstMTI4Li4xMjddKSA9IHsiKTsKKyAgICAgIGNvbnN0IHNpZ25lZCBjaGFyIGJpbl9kYXRhWzI1Nl0KKyAgICAgICAgPSB7LTEyOCwgLTEyNywgLTEyNiwgLTEyNSwgLTEyNCwgLTEyMywgLTEyMiwgLTEyMSwgLTEyMCwgLTExOSwgLTExOCwgLTExNywgLTExNiwgLTExNSwgLTExNCwKKyAgICAgICAgICAgLTExMywgLTExMiwgLTExMSwgLTExMCwgLTEwOSwgLTEwOCwgLTEwNywgLTEwNiwgLTEwNSwgLTEwNCwgLTEwMywgLTEwMiwgLTEwMSwgLTEwMCwgLTk5LAorICAgICAgICAgICAtOTgsICAtOTcsICAtOTYsICAtOTUsICAtOTQsICAtOTMsICAtOTIsICAtOTEsICAtOTAsICAtODksICAtODgsICAtODcsICAtODYsICAtODUsICAtODQsCisgICAgICAgICAgIC04MywgIC04MiwgIC04MSwgIC04MCwgIC03OSwgIC03OCwgIC03NywgIC03NiwgIC03NSwgIC03NCwgIC03MywgIC03MiwgIC03MSwgIC03MCwgIC02OSwKKyAgICAgICAgICAgLTY4LCAgLTY3LCAgLTY2LCAgLTY1LCAgLTY0LCAgLTYzLCAgLTYyLCAgLTYxLCAgLTYwLCAgLTU5LCAgLTU4LCAgLTU3LCAgLTU2LCAgLTU1LCAgLTU0LAorICAgICAgICAgICAtNTMsICAtNTIsICAtNTEsICAtNTAsICAtNDksICAtNDgsICAtNDcsICAtNDYsICAtNDUsICAtNDQsICAtNDMsICAtNDIsICAtNDEsICAtNDAsICAtMzksCisgICAgICAgICAgIC0zOCwgIC0zNywgIC0zNiwgIC0zNSwgIC0zNCwgIC0zMywgIC0zMiwgIC0zMSwgIC0zMCwgIC0yOSwgIC0yOCwgIC0yNywgIC0yNiwgIC0yNSwgIC0yNCwKKyAgICAgICAgICAgLTIzLCAgLTIyLCAgLTIxLCAgLTIwLCAgLTE5LCAgLTE4LCAgLTE3LCAgLTE2LCAgLTE1LCAgLTE0LCAgLTEzLCAgLTEyLCAgLTExLCAgLTEwLCAgLTksCisgICAgICAgICAgIC04LCAgIC03LCAgIC02LCAgIC01LCAgIC00LCAgIC0zLCAgIC0yLCAgIC0xLCAgIDAsICAgIDEsICAgIDIsICAgIDMsICAgIDQsICAgIDUsICAgIDYsCisgICAgICAgICAgIDcsICAgIDgsICAgIDksICAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLAorICAgICAgICAgICAyMiwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAzMiwgICAzMywgICAzNCwgICAzNSwgICAzNiwKKyAgICAgICAgICAgMzcsICAgMzgsICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsICAgNDgsICAgNDksICAgNTAsICAgNTEsCisgICAgICAgICAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LCAgIDU5LCAgIDYwLCAgIDYxLCAgIDYyLCAgIDYzLCAgIDY0LCAgIDY1LCAgIDY2LAorICAgICAgICAgICA2NywgICA2OCwgICA2OSwgICA3MCwgICA3MSwgICA3MiwgICA3MywgICA3NCwgICA3NSwgICA3NiwgICA3NywgICA3OCwgICA3OSwgICA4MCwgICA4MSwKKyAgICAgICAgICAgODIsICAgODMsICAgODQsICAgODUsICAgODYsICAgODcsICAgODgsICAgODksICAgOTAsICAgOTEsICAgOTIsICAgOTMsICAgOTQsICAgOTUsICAgOTYsCisgICAgICAgICAgIDk3LCAgIDk4LCAgIDk5LCAgIDEwMCwgIDEwMSwgIDEwMiwgIDEwMywgIDEwNCwgIDEwNSwgIDEwNiwgIDEwNywgIDEwOCwgIDEwOSwgIDExMCwgIDExMSwKKyAgICAgICAgICAgMTEyLCAgMTEzLCAgMTE0LCAgMTE1LCAgMTE2LCAgMTE3LCAgMTE4LCAgMTE5LCAgMTIwLCAgMTIxLCAgMTIyLCAgMTIzLCAgMTI0LCAgMTI1LCAgMTI2LAorICAgICAgICAgICAxMjd9OworICAgICAgR0J5dGVBcnJheSAqZnVsbEFycmF5ID0gZ19ieXRlX2FycmF5X25ldygpOworICAgICAgZ19ieXRlX2FycmF5X2FwcGVuZChmdWxsQXJyYXksIChndWludDggKikoJmJpbl9kYXRhWzBdKSwgMjU2KTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9iaW5hcnkgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgR0J5dGVzICpyZXNwb25zZSA9IGdfYnl0ZV9hcnJheV9mcmVlX3RvX2J5dGVzKHJlc3VsdCk7ICAvLyBmcmVlcyByZXN1bHQKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgZ3NpemUgc2l6ID0gZ19ieXRlc19nZXRfc2l6ZShyZXNwb25zZSk7CisgICAgICAgIGdjb25zdHBvaW50ZXIgcHRyID0gZ19ieXRlc19nZXRfZGF0YShyZXNwb25zZSwgJnNpeik7CisgICAgICAgIGlmIChzaXogPT0gMjU2KSB7CisgICAgICAgICAgZ2Jvb2xlYW4gZmlyc3QgPSAxOworICAgICAgICAgIGdib29sZWFuIGZhaWxlZCA9IDA7CisgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpCisgICAgICAgICAgICAgIHByaW50ZigiLCIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgICAgICBpbnQgdmFsID0gKChzaWduZWQgY2hhciAqKXB0cilbaV07CisgICAgICAgICAgICBwcmludGYoIiVkIiwgdmFsKTsKKyAgICAgICAgICAgIGlmICghZmFpbGVkICYmIHZhbCAhPSBpIC0gMTI4KSB7CisgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZigifSAiKTsKKyAgICAgICAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgICAgICBwcmludGYoIkZBSUwgKGJhZCBjb250ZW50KSBzaXplICVsZCBPS1xuIiwgKGxvbmcpc2l6KTsKKyAgICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJPSyBzaXplICVsZCBPS1xuIiwgKGxvbmcpc2l6KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmKCIgPSBiYWQgc2l6ZSAlbGRcbiIsIChsb25nKXNpeik7CisgICAgICAgICAgKytmYWlsX2NvdW50OworICAgICAgICB9CisgICAgICAgIGdfYnl0ZXNfdW5yZWYocmVzcG9uc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBnX2J5dGVfYXJyYXlfdW5yZWYoZnVsbEFycmF5KTsKKyAgICAgIGZ1bGxBcnJheSA9IE5VTEw7CisKICAgICAgIC8qKgogICAgICAgICogU1RSVUNUIFRFU1QKICAgICAgICAqLwpAQCAtNDUxLDYgKzY5MSwxMSBAQAogICAgICAgICAgICAgaTMyX3RoaW5nICE9IC0zIHx8CiAgICAgICAgICAgICBpNjRfdGhpbmcgIT0gKGdpbnQ2NCktNSkKICAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgaWYgKHN0cmluZykgeworICAgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgICAgICAgICBzdHJpbmcgPSBOVUxMOworICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlIHsKICAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKQEAgLTQ1OSw3ICs3MDQsOCBAQAogCiAgICAgICAgIGZhaWxfY291bnQrKzsKICAgICAgIH0KLSAgICAgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3RfaW4pOworICAgICAgLy8gZ19jbGVhcl9vYmplY3QoJnh0cnVjdF9vdXQpOyB1c2VkIGJlbG93CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0X2luKTsKIAogICAgICAgLyoqCiAgICAgICAgKiBORVNURUQgU1RSVUNUIFRFU1QKQEAgLTUwMiw2ICs3NDgsMTEgQEAKICAgICAgICAgICAgIGlubmVyX2k2NF90aGluZyAhPSAoZ2ludDY0KS01IHx8CiAgICAgICAgICAgICBpMzJfdGhpbmcgIT0gNSkKICAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgaWYgKHN0cmluZykgeworICAgICAgICAgIGdfZnJlZShzdHJpbmcpOworICAgICAgICAgIHN0cmluZyA9IE5VTEw7CisgICAgICAgIH0KICAgICAgIH0KICAgICAgIGVsc2UgewogICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOwpAQCAtNTExLDEwICs3NjIsMTAgQEAKICAgICAgICAgZmFpbF9jb3VudCsrOwogICAgICAgfQogCi0gICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0X2luKTsKLSAgICAgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3QyX2luKTsKLSAgICAgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3QyX291dCk7Ci0gICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0X291dCk7CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0X2luKTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3QyX2luKTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3QyX291dCk7CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0X291dCk7CiAKICAgICAgIC8qKgogICAgICAgICogTUFQIFRFU1QKQEAgLTEwMjEsMTcgKzEyNzIsMjggQEAKICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAKICAgICAgIG51bWJlcnogPSBUX1RFU1RfTlVNQkVSWl9GSVZFOworICAgICAgbnVtYmVyejIgPSBUX1RFU1RfTlVNQkVSWl9FSUdIVDsKICAgICAgIHVzZXJfaWRfcHRyID0gZ19tYWxsb2MgKHNpemVvZiAqdXNlcl9pZF9wdHIpOwotICAgICAgKnVzZXJfaWRfcHRyID0gNTAwMDsKKyAgICAgICp1c2VyX2lkX3B0ciA9IDU7CisgICAgICB1c2VyX2lkX3B0cjIgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkX3B0cik7CisgICAgICAqdXNlcl9pZF9wdHIyID0gODsKICAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHVzZXJfbWFwLCAoZ3BvaW50ZXIpbnVtYmVyeiwgdXNlcl9pZF9wdHIpOworICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAodXNlcl9tYXAsIChncG9pbnRlciludW1iZXJ6MiwgdXNlcl9pZF9wdHIyKTsKICAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAodXNlcl9tYXApOwogCiAgICAgICB4dHJ1Y3Rfb3V0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIlRydWNrIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgOExMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJIZWxsbzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAyTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIHh0cnVjdF9vdXQyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkdvb2RieWU0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgNExMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBnX3B0cl9hcnJheV9hZGQgKHh0cnVjdHMsIHh0cnVjdF9vdXQyKTsKICAgICAgIGdfcHRyX2FycmF5X2FkZCAoeHRydWN0cywgeHRydWN0X291dCk7CiAgICAgICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CiAKQEAgLTEyNDYsNyArMTUwOCw3IEBACiAgICAgICB9CiAKICAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAobWFwX2luKTsKLSAgICAgIGdfb2JqZWN0X3VucmVmIChpbnNhbml0eV9vdXQpOworICAgICAgZ19jbGVhcl9vYmplY3QgKCZpbnNhbml0eV9vdXQpOwogCiAgICAgICAvKiB0ZXN0IGV4Y2VwdGlvbiAqLwogICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iKTsKQEAgLTEyNjIsOCArMTUyNCw3IEBACiAgICAgICAgIHByaW50ZiAoIiAgeyV1LCBcIiVzXCJ9XG4iLCBpbnQzMiwgc3RyaW5nKTsKICAgICAgICAgZ19mcmVlIChzdHJpbmcpOwogCi0gICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Ci0gICAgICAgIHhjZXB0aW9uID0gTlVMTDsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CiAKICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgICAgICAgIGVycm9yID0gTlVMTDsKQEAgLTEyOTksMTAgKzE1NjAsNyBAQAogICAgICAgICBwcmludGYgKCIgIHZvaWRcbkZBSUxVUkVcbiIpOwogICAgICAgICBmYWlsX2NvdW50Kys7CiAKLSAgICAgICAgaWYgKHhjZXB0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQorICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKIAogICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgewogICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwpAQCAtMTMyMCwxMCArMTU3OCw3IEBACiAgICAgICAgIHByaW50ZiAoIiAgdm9pZFxuRkFJTFVSRVxuIik7CiAgICAgICAgIGZhaWxfY291bnQrKzsKIAotICAgICAgICBpZiAoeGNlcHRpb24gIT0gTlVMTCkgewotICAgICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Ci0gICAgICAgICAgeGNlcHRpb24gPSBOVUxMOwotICAgICAgICB9CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24pOwogCiAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICAgICAgICBlcnJvciA9IE5VTEw7CkBAIC0xMzYwLDE1ICsxNjE1LDggQEAKICAgICAgICAgcHJpbnRmICgiICByZXN1bHRcbkZBSUxVUkVcbiIpOwogICAgICAgICBmYWlsX2NvdW50Kys7CiAKLSAgICAgICAgaWYgKHhjZXB0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4Y2VwdGlvbjIgIT0gTlVMTCkgewotICAgICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbjIpOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQorICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbjIpOwogCiAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CiAgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CkBAIC0xMzk4LDExICsxNjQ2LDggQEAKICAgICAgICAgcHJpbnRmICgiICB7JXUsIHtcIiVzXCJ9fVxuIiwgaW50MzIsIHN0cmluZyk7CiAgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKIAotICAgICAgICBnX29iamVjdF91bnJlZiAoaW5uZXJfeHRydWN0X2luKTsKLSAgICAgICAgaW5uZXJfeHRydWN0X2luID0gTlVMTDsKLQotICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24yKTsKLSAgICAgICAgeGNlcHRpb24yID0gTlVMTDsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZpbm5lcl94dHJ1Y3RfaW4pOworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uMik7CiAKICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgICAgICAgIGVycm9yID0gTlVMTDsKQEAgLTE0MTEsMjIgKzE2NTYsMTUgQEAKICAgICAgICAgcHJpbnRmICgiICByZXN1bHRcbkZBSUxVUkVcbiIpOwogICAgICAgICBmYWlsX2NvdW50Kys7CiAKLSAgICAgICAgaWYgKHhjZXB0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4Y2VwdGlvbjIgIT0gTlVMTCkgewotICAgICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbjIpOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQorICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbjIpOwogCiAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CiAgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgICAgICAgICAgZXJyb3IgPSBOVUxMOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0X2luKTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeHRydWN0X2luKTsKIAogICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwidGVzdCAzXCIpID0+Iik7CiAgICAgICB4dHJ1Y3RfaW4gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CkBAIC0xNDQ5LDIyICsxNjg3LDE1IEBACiAgICAgICAgIHByaW50ZiAoIiAgcmVzdWx0XG5GQUlMVVJFXG4iKTsKICAgICAgICAgZmFpbF9jb3VudCsrOwogCi0gICAgICAgIGlmICh4Y2VwdGlvbiAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKLSAgICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeGNlcHRpb24yICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24yKTsKLSAgICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24yKTsKIAogICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgewogICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICAgICAgICAgIGVycm9yID0gTlVMTDsKICAgICAgICAgfQogICAgICAgfQotICAgICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdF9pbik7CisgICAgICBnX2NsZWFyX29iamVjdCAoJnh0cnVjdF9pbik7CiAKICAgICAgIC8qIHRlc3Qgb25ld2F5IHZvaWQgKi8KICAgICAgIHByaW50ZiAoInRlc3RDbGllbnQudGVzdE9uZXdheSgxKSA9PiIpOwpAQCAtMTU1MCw2ICsxNzgxLDcgQEAKIAogICAvKiBBbGwgZG9uZS0tLW91dHB1dCBzdGF0aXN0aWNzICovCiAgIHB1dHMgKCJcbkFsbCB0ZXN0cyBkb25lLiIpOworICBwcmludGYoIk51bWJlciBvZiBmYWlsdXJlczogJWRcbiIsIGZhaWxfY291bnQpOwogCiAgIHRpbWVfYXZnX3VzZWMgPSB0aW1lX3RvdGFsX3VzZWMgLyBudW1fdGVzdHM7CiAKQEAgLTE1NTcsMTAgKzE3ODksMTYgQEAKICAgcHJpbnRmICgiTWF4IHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX21heF91c2VjKTsKICAgcHJpbnRmICgiQXZnIHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX2F2Z191c2VjKTsKIAotICBnX29iamVjdF91bnJlZiAodGVzdF9jbGllbnQpOwotICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19mcmVlIChob3N0KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlY29uZF9zZXJ2aWNlKTsKKyAgZ19jbGVhcl9vYmplY3QoJnByb3RvY29sMik7CisgIGdfY2xlYXJfb2JqZWN0KCZ0ZXN0X2NsaWVudCk7CisgIGdfY2xlYXJfb2JqZWN0KCZwcm90b2NvbCk7CisgIGdfY2xlYXJfb2JqZWN0KCZ0cmFuc3BvcnQpOworICBnX2NsZWFyX29iamVjdCgmc29ja2V0KTsKKworICBpZiAoc3NsKSB7CisgICAgdGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemVfb3BlbnNzbCgpOworICB9CiAKICAgcmV0dXJuIGZhaWxfY291bnQ7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9zZXJ2ZXIuYyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X3NlcnZlci5jCmluZGV4IDEzZWVjMjcuLjJkNzE2ZWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvY19nbGliL3NyYy90ZXN0X3NlcnZlci5jCisrKyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X3NlcnZlci5jCkBAIC0yMyw3ICsyMyw5IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KQEAgLTM2LDggKzM4LDEwIEBACiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+CiAKICNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIgorI2luY2x1ZGUgIi4uL2dlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmgiCiAKICNpbmNsdWRlICJ0aHJpZnRfdGVzdF9oYW5kbGVyLmgiCisjaW5jbHVkZSAidGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCIKIAogLyogT3VyIHNlcnZlciBvYmplY3QsIGRlY2xhcmVkIGdsb2JhbGx5IHNvIGl0IGlzIGFjY2Vzc2libGUgd2l0aGluIHRoZSBTSUdJTlQKICAgIHNpZ25hbCBoYW5kbGVyICovCkBAIC02OCw2ICs3Miw4IEBACiAgIHN0YXRpYyBnY2hhciAqc2VydmVyX3R5cGVfb3B0aW9uID0gTlVMTDsKICAgc3RhdGljIGdjaGFyICp0cmFuc3BvcnRfb3B0aW9uID0gTlVMTDsKICAgc3RhdGljIGdjaGFyICpwcm90b2NvbF9vcHRpb24gPSBOVUxMOworICBzdGF0aWMgZ2ludCAgIHN0cmluZ19saW1pdCA9IDA7CisgIHN0YXRpYyBnaW50ICAgY29udGFpbmVyX2xpbWl0ID0gMDsKIAogICBzdGF0aWMKICAgICBHT3B0aW9uRW50cnkgb3B0aW9uX2VudHJpZXNbXSA9IHsKQEAgLTc4LDcgKzg0LDExIEBACiAgICAgeyAidHJhbnNwb3J0IiwgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmdHJhbnNwb3J0X29wdGlvbiwKICAgICAgICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQgKD1idWZmZXJlZCkiLCBOVUxMIH0sCiAgICAgeyAicHJvdG9jb2wiLCAgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmcHJvdG9jb2xfb3B0aW9uLAotICAgICAgIlByb3RvY29sOiBiaW5hcnkgKD1iaW5hcnkpIiwgTlVMTCB9LAorICAgICAgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QgKD1iaW5hcnkpIiwgTlVMTCB9LAorICAgIHsgInN0cmluZy1saW1pdCIsICAgIDAsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJnN0cmluZ19saW1pdCwKKyAgICAgICJNYXggc3RyaW5nIGxlbmd0aCAoPW5vbmUpIiwgTlVMTCB9LAorICAgIHsgImNvbnRhaW5lci1saW1pdCIsIDAsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJmNvbnRhaW5lcl9saW1pdCwKKyAgICAgICJNYXggY29udGFpbmVyIGxlbmd0aCAoPW5vbmUpIiwgTlVMTCB9LAogICAgIHsgTlVMTCB9CiAgIH07CiAKQEAgLTg5LDcgKzk5LDEwIEBACiAgIEdUeXBlICBwcm90b2NvbF9mYWN0b3J5X3R5cGUgID0gVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlk7CiAKICAgVFRlc3RUaHJpZnRUZXN0SGFuZGxlciAqaGFuZGxlcjsKKyAgVFRlc3RUaHJpZnRUZXN0SGFuZGxlciAqaGFuZGxlcl9zZWNvbmRfc2VydmljZSA9IE5VTEw7CiAgIFRocmlmdFByb2Nlc3NvciAgICAgICAgKnByb2Nlc3NvcjsKKyAgVGhyaWZ0UHJvY2Vzc29yICAgICAgICAqcHJvY2Vzc29yX3Rlc3QgPSBOVUxMOworICBUaHJpZnRQcm9jZXNzb3IgICAgICAgICpwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UgPSBOVUxMOwogICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgICpzZXJ2ZXJfdHJhbnNwb3J0OwogICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICp0cmFuc3BvcnRfZmFjdG9yeTsKICAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICAqcHJvdG9jb2xfZmFjdG9yeTsKQEAgLTEyNiwxMCArMTM5LDIyIEBACiAgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOwogICB9CiAKLSAgaWYgKHByb3RvY29sX29wdGlvbiAhPSBOVUxMICYmCi0gICAgICBzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJiaW5hcnkiLCA3KSAhPSAwKSB7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biBwcm90b2NvbCB0eXBlICVzXG4iLCBwcm90b2NvbF9vcHRpb24pOwotICAgIG9wdGlvbnNfdmFsaWQgPSBGQUxTRTsKKyAgaWYgKHByb3RvY29sX29wdGlvbiAhPSBOVUxMKSB7CisgICAgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImNvbXBhY3QiLCA4KSA9PSAwKSB7CisgICAgICBwcm90b2NvbF9mYWN0b3J5X3R5cGUgPSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlk7CisgICAgICBwcm90b2NvbF9uYW1lID0gImNvbXBhY3QiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJtdWx0aSIsIDYpID09IDApIHsKKwlwcm90b2NvbF9uYW1lID0gImJpbmFyeTptdWx0aSI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgIm11bHRpYyIsIDcpID09IDApIHsKKwlwcm90b2NvbF9mYWN0b3J5X3R5cGUgPSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlk7CisJcHJvdG9jb2xfbmFtZSA9ICJjb21wYWN0Om11bHRpYyI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImJpbmFyeSIsIDcpICE9IDApIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gcHJvdG9jb2wgdHlwZSAlc1xuIiwgcHJvdG9jb2xfb3B0aW9uKTsKKyAgICAgIG9wdGlvbnNfdmFsaWQgPSBGQUxTRTsKKyAgICB9CiAgIH0KIAogICBpZiAodHJhbnNwb3J0X29wdGlvbiAhPSBOVUxMKSB7CkBAIC0xNDksMTYgKzE3NCw2NSBAQAogICAvKiBFc3RhYmxpc2ggYWxsIG91ciBjb25uZWN0aW9uIG9iamVjdHMgKi8KICAgaGFuZGxlciAgICAgICAgICAgPSBnX29iamVjdF9uZXcgKFRZUEVfVEhSSUZUX1RFU1RfSEFORExFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBwcm9jZXNzb3IgICAgICAgICA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVEhSSUZUX1RFU1RfUFJPQ0VTU09SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmRsZXIiLCBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKworCisgIGlmKHN0cnN0cihwcm90b2NvbF9uYW1lLCAiOm11bHRpIikpeworICAgICAgLyogV2hlbiBhIG11bHRpcGxleGVkIHByb2Nlc3NvciBpcyBpbnZvbHZlZCB0aGUgaGFuZGxlciBpcyBub3QKKyAgICAgICAgIHJlZ2lzdGVyZWQgYXMgdXN1YWwuIFdlIGNyZWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGUgcmVhbAorICAgICAgICAgcHJvY2Vzc29yIGlzIHJlZ2lzdGVyZWQuIE11bHRpcGxlIHByb2Nlc3NvcnMgY2FuIGJlIHJlZ2lzdGVyZWQKKyAgICAgICAgIGF0IG9uY2UuIFRoaXMgaXMgd2h5IHdlIGRvbid0IGhhdmUgYSBjb25zdHJ1Y3RvciBwcm9wZXJ0eSAqLworICAgICAgcHJvY2Vzc29yID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsCisJCQkJCSBOVUxMKTsKKworICAgICAgaGFuZGxlcl9zZWNvbmRfc2VydmljZSA9IGdfb2JqZWN0X25ldyAoVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLAorICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIHByb2Nlc3Nvcl90ZXN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9QUk9DRVNTT1IsCisJCQkJICAgICJoYW5kbGVyIiwgaGFuZGxlciwKKwkJCQkgICAgTlVMTCk7CisgICAgICBwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UgPSAgIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfU0VDT05EX1NFUlZJQ0VfUFJPQ0VTU09SLAorCQkJCSAgICAiaGFuZGxlciIsIGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UsCisJCQkJICAgIE5VTEwpOworCisgICAgICAvKiBXZSByZWdpc3RlciBhIHRlc3QgcHJvY2Vzc29yIHdpdGggTXVsdGlwbGV4ZWQgbmFtZSBUaHJpZnRUZXN0ICovCisgICAgICBpZighdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3IocHJvY2Vzc29yLAorCQkJCQkJICAgICAgIlRocmlmdFRlc3QiLCBwcm9jZXNzb3JfdGVzdCwKKwkJCQkJCSAgICAgICZlcnJvcikpeworCSAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2VydmVyX3NlcnZlOiAlcyIsCisJICAgICAgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihudWxsKSIpOworCSAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAgICAgfQorICAgICAgLyogV2UgcmVnaXN0ZXIgYSBzZWNvbmQgdGVzdCBwcm9jZXNzb3Igd2l0aCBNdWx0aXBsZXhlZCBuYW1lIFNlY29uZFNlcnZpY2UKKyAgICAgICAqIHdlIGFyZSByZXNwb25zaWJsZSBvZiBmcmVlaW5nIHRoZSBwcm9jZXNzb3Igd2hlbiBpdCdzIG5vdCB1c2VkIGFueW1vcmUgKi8KKyAgICAgIGlmKCF0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcihwcm9jZXNzb3IsCisJCQkJCQkgICAgICAiU2Vjb25kU2VydmljZSIsIHByb2Nlc3Nvcl9zZWNvbmRfc2VydmljZSwKKwkJCQkJCSAgICAgICZlcnJvcikpeworCSAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2VydmVyX3NlcnZlOiAlcyIsCisJICAgICAgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihudWxsKSIpOworCSAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAgICAgfQorCisgIH1lbHNleworICAgICAgcHJvY2Vzc29yID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9QUk9DRVNTT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmRsZXIiLCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB9CiAgIHNlcnZlcl90cmFuc3BvcnQgID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgIHRyYW5zcG9ydF9mYWN0b3J5ID0gZ19vYmplY3RfbmV3ICh0cmFuc3BvcnRfZmFjdG9yeV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIHByb3RvY29sX2ZhY3RvcnkgID0gZ19vYmplY3RfbmV3IChwcm90b2NvbF9mYWN0b3J5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZiAoc3Ryc3RyIChwcm90b2NvbF9uYW1lLCAiY29tcGFjdCIpICE9IE5VTEwpIHsKKyAgICBwcm90b2NvbF9mYWN0b3J5ICA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfZmFjdG9yeV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX2xpbWl0Iiwgc3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGFpbmVyX2xpbWl0IiwgY29udGFpbmVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBwcm90b2NvbF9mYWN0b3J5ICA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfZmFjdG9yeV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfQogCiAgIHNlcnZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc29yIiwgICAgICAgICAgICAgICAgcHJvY2Vzc29yLApAQCAtMjAyLDYgKzI3NiwxNSBAQAogICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CiAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3IpOwogICBnX29iamVjdF91bnJlZiAoaGFuZGxlcik7CisgIGlmKGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UpeworICAgICAgZ19vYmplY3RfdW5yZWYgKGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UpOworICB9CisgIGlmKHByb2Nlc3Nvcl90ZXN0KXsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3JfdGVzdCk7CisgIH0KKyAgaWYocHJvY2Vzc29yX3NlY29uZF9zZXJ2aWNlKXsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UpOworICB9CiAKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YWM3YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworI2luY2x1ZGUgInRocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmgiCisKKy8qIEEgaGFuZGxlciB0aGF0IGltcGxlbWVudHMgdGhlIFRUZXN0U2Vjb25kU2VydmljZUlmIGludGVyZmFjZSAqLworCitHX0RFRklORV9UWVBFIChTZWNvbmRTZXJ2aWNlSGFuZGxlciwKKyAgICAgICAgICAgICAgIHNlY29uZF9zZXJ2aWNlX2hhbmRsZXIsCisJICAgICAgIFRfVEVTVF9UWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIpOworCisKK2dib29sZWFuCitzZWNvbmRfc2VydmljZV9oYW5kbGVyX3NlY29uZHRlc3Rfc3RyaW5nIChUVGVzdFNlY29uZFNlcnZpY2VJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgICAgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIGdjaGFyIGJ1ZmZlclsyNTZdOworCisgIHByaW50ZiAoInRlc3RTZWNvbmRTZXJ2aWNlTXVsdGlwbGV4U2Vjb25kVGVzdFN0cmluZyhcIiVzXCIpXG4iLCB0aGluZyk7CisgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAidGVzdFN0cmluZyhcIiVzXCIpIiwgdGhpbmcpOworICAqX3JldHVybiA9IGdfc3RyZHVwIChidWZmZXIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9pbml0IChTZWNvbmRTZXJ2aWNlSGFuZGxlciAqc2VsZikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAorc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9jbGFzc19pbml0IChTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzICprbGFzcykKK3sKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzICpiYXNlX2NsYXNzID0KKyAgICAgIFRfVEVTVF9TRUNPTkRfU0VSVklDRV9IQU5ETEVSX0NMQVNTIChrbGFzcyk7CisKKworICBiYXNlX2NsYXNzLT5zZWNvbmR0ZXN0X3N0cmluZyA9CisgICAgICBzZWNvbmRfc2VydmljZV9oYW5kbGVyX3NlY29uZHRlc3Rfc3RyaW5nOworCit9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTA0OGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaApAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfSAorI2RlZmluZSBfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qIEEgaGFuZGxlciB0aGF0IGltcGxlbWVudHMgdGhlIFRUZXN0U2Vjb25kU2VydmljZUlmIGludGVyZmFjZSAqLworCisjZGVmaW5lIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUiAoc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9nZXRfdHlwZSAoKSkKKworI2RlZmluZSBTRUNPTkRfU0VSVklDRV9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZFNlcnZpY2VIYW5kbGVyKSkKKyNkZWZpbmUgSVNfU0VDT05EX1NFUlZJQ0VfSEFORExFUihvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIFNFQ09ORF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUiwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzcykpCisjZGVmaW5lIElTX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIFNFQ09ORF9TRVJWSUNFX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyIFNlY29uZFNlcnZpY2VIYW5kbGVyOwordHlwZWRlZiBzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MgU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzczsKKworc3RydWN0IF9TZWNvbmRTZXJ2aWNlSGFuZGxlciB7CisgIFRUZXN0U2Vjb25kU2VydmljZUhhbmRsZXIgcGFyZW50OworfTsKKworc3RydWN0IF9TZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzIHsKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzIHBhcmVudDsKKworfTsKKworLyogVXNlZCBieSBTRUNPTkRfU0VSVklDRV9IQU5ETEVSX0dFVF9UWVBFICovCitHVHlwZSBzZWNvbmRfc2VydmljZV9oYW5kbGVyX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9ibGFoX2JsYWggKFRUZXN0U2Vjb25kU2VydmljZUlmICppZmFjZSwgR0Vycm9yICoqZXJyb3IpOworZ2Jvb2xlYW4gc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9zZWNvbmR0ZXN0X3N0cmluZyAgICAgICAgICAoVFRlc3RTZWNvbmRTZXJ2aWNlSWYgKmlmYWNlLCBnY2hhciAqKiBfcmV0dXJuLCBjb25zdCBnY2hhciAqIHRoaW5nLCBHRXJyb3IgKiplcnJvcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9IICovCmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuYwppbmRleCBkODJiZWZiLi4xZDhiY2IyIDEwMDY0NAotLS0gYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jCisrKyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMKQEAgLTY4LDcgKzY4LDcgQEAKICAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKICAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKIAotICBwcmludGYgKCJ0ZXN0Qnl0ZSglcylcbiIsIHRoaW5nID8gInRydWUiIDogImZhbHNlIik7CisgIHByaW50ZiAoInRlc3RCb29sKCVzKVxuIiwgdGhpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgKl9yZXR1cm4gPSB0aGluZzsKIAogICByZXR1cm4gVFJVRTsKQEAgLTE0NCw3ICsxNDQsOCBAQAogICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwogCiAgIHByaW50ZiAoInRlc3RCaW5hcnkoKVxuIik7ICAvLyBUT0RPOiBoZXggb3V0cHV0Ci0gIGdfYnl0ZV9hcnJheV9hcHBlbmQoICpfcmV0dXJuLCB0aGluZy0+ZGF0YSwgdGhpbmctPmxlbik7CisgIGdfYnl0ZV9hcnJheV9yZWYoKEdCeXRlQXJyYXkgKil0aGluZyk7CisgICpfcmV0dXJuID0gKEdCeXRlQXJyYXkgKil0aGluZzsKIAogICByZXR1cm4gVFJVRTsKIH0KQEAgLTQ3Miw4ICs0NzMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdEluc2FuaXR5ICAqYXJndW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcikKIHsKLSAgVFRlc3RYdHJ1Y3QgKmhlbGxvOwotICBUVGVzdFh0cnVjdCAqZ29vZGJ5ZTsKICAgVFRlc3RYdHJ1Y3QgKnh0cnVjdF9pbjsKIAogICBnY2hhciAqc3RyaW5nX3RoaW5nID0gTlVMTDsKQEAgLTQ4Myw3ICs0ODIsNiBAQAogCiAgIEdQdHJBcnJheSAqeHRydWN0czsKIAotICBUVGVzdEluc2FuaXR5ICpjcmF6eTsKICAgVFRlc3RJbnNhbml0eSAqbG9vbmV5OwogCiAgIEdIYXNoVGFibGUgKnVzZXJfbWFwOwpAQCAtNTAyLDUwICs1MDAsMTAgQEAKICAgZ3VpbnQgaTsKIAogICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoYXJndW1lbnQpOwogICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwogCiAgIHByaW50ZiAoInRlc3RJbnNhbml0eSgpXG4iKTsKIAotICBoZWxsbyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAotICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJIZWxsbzIiLAotICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAyLAotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgZ29vZGJ5ZSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkdvb2RieWU0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgY3JhenkgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0lOU0FOSVRZLCBOVUxMKTsKLSAgZ19vYmplY3RfZ2V0IChjcmF6eSwKLSAgICAgICAgICAgICAgICAidXNlck1hcCIsICZ1c2VyX21hcCwKLSAgICAgICAgICAgICAgICAieHRydWN0cyIsICZ4dHJ1Y3RzLAotICAgICAgICAgICAgICAgIE5VTEwpOwotCi0gIHVzZXJfaWQgPSBnX21hbGxvYyhzaXplb2YgKnVzZXJfaWQpOwotICAqdXNlcl9pZCA9IDg7Ci0gIGdfaGFzaF90YWJsZV9pbnNlcnQgKHVzZXJfbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBHSU5UX1RPX1BPSU5URVIgKFRfVEVTVF9OVU1CRVJaX0VJR0hUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCk7Ci0KLSAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCBnb29kYnllKTsKLQotICB1c2VyX2lkID0gZ19tYWxsb2Moc2l6ZW9mICp1c2VyX2lkKTsKLSAgKnVzZXJfaWQgPSA1OwotICBnX2hhc2hfdGFibGVfaW5zZXJ0ICh1c2VyX21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgR0lOVF9UT19QT0lOVEVSIChUX1RFU1RfTlVNQkVSWl9GSVZFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCk7Ci0KLSAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCBoZWxsbyk7Ci0KLSAgZ19oYXNoX3RhYmxlX3VucmVmICh1c2VyX21hcCk7Ci0gIGdfcHRyX2FycmF5X3VucmVmICh4dHJ1Y3RzKTsKLQogICBmaXJzdF9tYXAgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfZGlyZWN0X2hhc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19kaXJlY3RfZXF1YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKQEAgLTU1NywxNyArNTE1LDIxIEBACiAKICAgZ19oYXNoX3RhYmxlX2luc2VydCAoZmlyc3RfbWFwLAogICAgICAgICAgICAgICAgICAgICAgICBHSU5UX1RPX1BPSU5URVIgKFRfVEVTVF9OVU1CRVJaX1RXTyksCi0gICAgICAgICAgICAgICAgICAgICAgIGNyYXp5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKWFyZ3VtZW50KTsKICAgZ19oYXNoX3RhYmxlX2luc2VydCAoZmlyc3RfbWFwLAogICAgICAgICAgICAgICAgICAgICAgICBHSU5UX1RPX1BPSU5URVIgKFRfVEVTVF9OVU1CRVJaX1RIUkVFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY3JhenkpOworICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpYXJndW1lbnQpOwogCi0gIC8qIEluY3JlbWVudCBjcmF6eSdzIHJlZiBjb3VudCBzaW5jZSBmaXJzdF9tYXAgbm93IGhvbGRzIHR3bwotICAgICByZWZlcmVuY2VzIHRvIGl0IGFuZCB3b3VsZCBvdGhlcndpc2UgYXR0ZW1wdCB0byBkZWFsbG9jYXRlIGl0Ci0gICAgIHR3aWNlIGR1cmluZyBkZXN0cnVjdGlvbi4gV2UgZG8gdGhpcyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgY29weQotICAgICBvZiBjcmF6eSBpbiBvcmRlciB0byBtaW1pYyB0aGUgQysrIGltcGxlbWVudGF0aW9uIChhbmQgc2luY2UsCi0gICAgIGZyYW5rbHksIHRoZSB3b3JsZCBuZWVkcyBsZXNzIGNyYXp5LCBub3QgbW9yZSkuICovCi0gIGdfb2JqZWN0X3JlZiAoY3JhenkpOworICAvKiBJbmNyZW1lbnQgYXJndW1lbnQncyByZWYgY291bnQgYnkgdHdvIGJlY2F1c2UgZmlyc3RfbWFwIG5vdyBob2xkcworICAgICB0d28gcmVmZXJlbmNlcyB0byBpdCBhbmQgdGhlIGNhbGxlciBpcyBub3QgYXdhcmUgd2UgaGF2ZSBtYWRlIGFueQorICAgICBhZGRpdGlvbmFsIHJlZmVyZW5jZXMgdG8gYXJndW1lbnQuICAoVGhhdCBpcywgY2FsbGVyIG93bnMgYXJndW1lbnQKKyAgICAgYW5kIHdpbGwgdW5yZWYgaXQgZXhwbGljaXRseSBpbiBhZGRpdGlvbiB0byB1bnJlZi1pbmcgKl9yZXR1cm4uKQorCisgICAgIFdlIGRvIHRoaXMgaW5zdGVhZCBvZiBjcmVhdGluZyBhIGNvcHkgb2YgYXJndW1lbnQgaW4gb3JkZXIgdG8gbWltaWMKKyAgICAgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiAoYW5kIHNpbmNlLCBmcmFua2x5LCB0aGUgd29ybGQgbmVlZHMgbGVzcworICAgICBhcmd1bWVudCwgbm90IG1vcmUpLiAqLworICBnX29iamVjdF9yZWYgKChncG9pbnRlcilhcmd1bWVudCk7CisgIGdfb2JqZWN0X3JlZiAoKGdwb2ludGVyKWFyZ3VtZW50KTsKIAogICBsb29uZXkgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0lOU0FOSVRZLCBOVUxMKTsKICAgZ19oYXNoX3RhYmxlX2luc2VydCAoc2Vjb25kX21hcCwKQEAgLTc0NCwxNiArNzA2LDE3IEBACiAgIGdfYXNzZXJ0ICgqZXJyMSA9PSBOVUxMKTsKICAgZ19hc3NlcnQgKCplcnIyID09IE5VTEwpOwogCi0gIGlmIChzdHJuY21wIChhcmcwLCAiWGNlcHRpb24iLCA5KSA9PSAwKSB7CisgIGlmIChzdHJuY21wIChhcmcwLCAiWGNlcHRpb24iLCA4KSA9PSAwICYmIHN0cmxlbihhcmcwKSA9PSA4KSB7CiAgICAgKmVycjEgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hDRVBUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JDb2RlIiwgMTAwMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAgIGdfc3RyZHVwICgiVGhpcyBpcyBhbiBYY2VwdGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICByZXN1bHQgPSBGQUxTRTsKICAgfQotICBlbHNlIGlmIChzdHJuY21wIChhcmcwLCAiWGNlcHRpb24yIiwgMTApID09IDApIHsKKyAgZWxzZSBpZiAoc3RybmNtcCAoYXJnMCwgIlhjZXB0aW9uMiIsIDkpID09IDApIHsKICAgICAqZXJyMiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWENFUFRJT04yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JDb2RlIiwgMjAwMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvckNvZGUiLCAyMDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKIAogICAgIGdfb2JqZWN0X2dldCAoKmVycjIsCiAgICAgICAgICAgICAgICAgICAic3RydWN0X3RoaW5nIiwgJnN0cnVjdF90aGluZywKQEAgLTgyNiw2ICs3ODksOSBAQAogICBiYXNlX2NsYXNzLT50ZXN0X2RvdWJsZSA9CiAgICAga2xhc3MtPnRlc3RfZG91YmxlID0KICAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfZG91YmxlOworICBiYXNlX2NsYXNzLT50ZXN0X2JpbmFyeSA9CisgICAga2xhc3MtPnRlc3RfYmluYXJ5ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfYmluYXJ5OwogICBiYXNlX2NsYXNzLT50ZXN0X3N0cnVjdCA9CiAgICAga2xhc3MtPnRlc3Rfc3RydWN0ID0KICAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RydWN0OwpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaCBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmgKaW5kZXggOTU3YmJkYS4uYjY0Y2IxNiAxMDA2NDQKLS0tIGEvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5oCkBAIC04Niw2ICs4NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSpfcmV0dXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSAgICAgICAgIHRoaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2JpbmFyeSkgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdCeXRlQXJyYXkgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdCeXRlQXJyYXkgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CiAgIGdib29sZWFuICgqdGVzdF9zdHJ1Y3QpICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdCAgICAgICAgICoqX3JldHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0WHRydWN0ICAgICp0aGluZywKZGlmZiAtLWdpdCBhL3Rlc3QvY2wvTWFrZWZpbGUuYW0gYi90ZXN0L2NsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1ZTcyYmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCitzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY2wgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworVGVzdFNlcnZlcjogbWFrZS10ZXN0LXNlcnZlci5saXNwCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXRlc3Qtc2VydmVyLmxpc3AKKworVGVzdENsaWVudDogbWFrZS10ZXN0LWNsaWVudC5saXNwCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXRlc3QtY2xpZW50Lmxpc3AKKworcHJlY3Jvc3M6IHN0dWJzIFRlc3RTZXJ2ZXIgVGVzdENsaWVudAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tY2wKKwkkKFJNKSBUZXN0U2VydmVyCisJJChSTSkgVGVzdENsaWVudAorCitFWFRSQV9ESVNUID0gXAorCWltcGxlbWVudGF0aW9uLmxpc3AgXAorCW1ha2UtdGVzdC1jbGllbnQubGlzcCBcCisJbWFrZS10ZXN0LXNlcnZlci5saXNwIFwKKwl0ZXN0cy5saXNwCmRpZmYgLS1naXQgYS90ZXN0L2NsL2ltcGxlbWVudGF0aW9uLmxpc3AgYi90ZXN0L2NsL2ltcGxlbWVudGF0aW9uLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhZjdiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvaW1wbGVtZW50YXRpb24ubGlzcApAQCAtMCwwICsxLDEzNiBAQAorKGluLXBhY2thZ2UgIzp0aHJpZnQudGVzdC1pbXBsZW1lbnRhdGlvbikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC12b2lkICgpCisgIChmb3JtYXQgdCAidGVzdFZvaWQoKX4lIikpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXN0cmluZyAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdFN0cmluZyh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1ib29sICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0Qm9vbCh+YSl+JSIgKGlmIHRoaW5nICJ0cnVlIiAiZmFsc2UiKSkKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWJ5dGUgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RCeXRlKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWkzMiAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEkzMih+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1pNjQgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RJNjQofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtZG91YmxlICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0RG91YmxlKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWJpbmFyeSAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEJpbmFyeSh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1zdHJ1Y3QgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RTdHJ1Y3QofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbmVzdCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdE5lc3QofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbWFwICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0TWFwKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXN0cmluZy1tYXAgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RTdHJpbmdNYXAofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtc2V0ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0U2V0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWxpc3QgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RMaXN0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWVudW0gKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RFbnVtKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXR5cGVkZWYgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RUeXBlZGVmKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW1hcC1tYXAgKGhlbGxvKQorICAoZm9ybWF0IHQgInRlc3RNYXBNYXAofmEpfiUiIGhlbGxvKQorICAnKCgtNCAuICgoLTQgLiAtNCkgKC0zIC4gLTMpICgtMiAuIC0yKSAoLTEgLiAtMSkpKSAoNCAuICgoMSAuIDEpICgyIC4gMikgKDMgLiAzKSAoNCAuIDQpKSkpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1pbnNhbml0eSAoYXJndW1lbnQpCisgIChsZXQgKChyZXN1bHQgYCgoMSAuICgoMiAuICxhcmd1bWVudCkgKDMgLiAsYXJndW1lbnQpKSkKKyAgICAgICAgICAgICAgICAgICgyIC4gKCg2IC4gLCh0aHJpZnQudGVzdDo6bWFrZS1pbnNhbml0eSA6dXNlci1tYXAgbmlsIDp4dHJ1Y3RzIG5pbCkpKSkpKSkKKyAgICAoZm9ybWF0IHQgIn5hfiUiIHJlc3VsdCkKKyAgICByZXN1bHQpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1tdWx0aSAoYXJnMCBhcmcxIGFyZzIgYXJnMyBhcmc0IGFyZzUpCisgIChkZWNsYXJlIChpZ25vcmFibGUgYXJnMyBhcmc0IGFyZzUpKQorICAoZm9ybWF0IHQgInRlc3RNdWx0aSgpfiUiKQorICAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyAiSGVsbG8yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJ5dGUtdGhpbmcgYXJnMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyBhcmcxCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTY0LXRoaW5nIGFyZzIpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1leGNlcHRpb24gKGFyZykKKyAgKGZvcm1hdCB0ICJ0ZXN0RXhjZXB0aW9uKH5hKX4lIiBhcmcpCisgIChjb25kCisgICAgKChzdHJpbmc9IGFyZyAiWGNlcHRpb24iKSAoZXJyb3IgJ3RocmlmdC50ZXN0OnhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmVycm9yLWNvZGUgMTAwMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptZXNzYWdlIGFyZykpCisgICAgKChzdHJpbmc9IGFyZyAiVEV4Y2VwdGlvbiIpIChlcnJvciAndGhyaWZ0LnRlc3Q6eGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptZXNzYWdlICJTdHVmZiEiKSkpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1tdWx0aS1leGNlcHRpb24gKGFyZzAgYXJnMSkKKyAgKGZvcm1hdCB0ICJ0ZXN0TXVsdGlFeGNlcHRpb24ofmEsIH5hKX4lIiBhcmcwIGFyZzEpCisgIChjb25kCisgICAgKChzdHJpbmc9IGFyZzAgIlhjZXB0aW9uIikgKGVycm9yICd0aHJpZnQudGVzdDp4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDEwMDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bWVzc2FnZSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIpKQorICAgICgoc3RyaW5nPSBhcmcwICJYY2VwdGlvbjIiKSAoZXJyb3IgJ3RocmlmdC50ZXN0OnhjZXB0aW9uMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDIwMDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c3RydWN0LXRoaW5nICh0aHJpZnQudGVzdDptYWtlLXh0cnVjdCA6c3RyaW5nLXRoaW5nICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ynl0ZS10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmk2NC10aGluZyAwKSkpKQorICAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyBhcmcxCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ynl0ZS10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTMyLXRoaW5nIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDppNjQtdGhpbmcgMCkpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW9uZXdheSAoc2Vjb25kcykKKyAgKGZvcm1hdCB0ICJ0ZXN0T25ld2F5KH5hKTogU2xlZXBpbmcuLi5+JSIgc2Vjb25kcykKKyAgKHNsZWVwIHNlY29uZHMpCisgIChmb3JtYXQgdCAidGVzdE9uZXdheSh+YSk6IGRvbmUgc2xlZXBpbmchfiUiIHNlY29uZHMpKQorCis7OzsgUmVtb3ZlZCBmcm9tIHRoZSBJREwgZGVmaW5pdGlvbi4KKyMrKG9yKQorKGRlZnVuIHRocmlmdC50ZXN0LnNlY29uZC1zZXJ2aWNlLWltcGxlbWVudGF0aW9uOmJsYWgtYmxhaCAoKQorICAoZm9ybWF0IHQgImJsYWhCbGFoKCl+JSIpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3Quc2Vjb25kLXNlcnZpY2UtaW1wbGVtZW50YXRpb246c2Vjb25kdGVzdC1zdHJpbmcgKHRoaW5nKQorICAoZm9ybWF0IHQgInNlY29uZHRlc3RTdHJpbmcofmEpfiUiIHRoaW5nKQorICAoY29uY2F0ZW5hdGUgJ3N0cmluZyAidGVzdFN0cmluZyhcIiIgdGhpbmcgIlwiKSIpKQorCmRpZmYgLS1naXQgYS90ZXN0L2NsL21ha2UtdGVzdC1jbGllbnQubGlzcCBiL3Rlc3QvY2wvbWFrZS10ZXN0LWNsaWVudC5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTY2OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL21ha2UtdGVzdC1jbGllbnQubGlzcApAQCAtMCwwICsxLDkzIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIysob3IpICh3aGVuIChub3QgKGJvdW5kcCAnc2ItaW1wbDo6ZGVmYXVsdC1leHRlcm5hbC1mb3JtYXQpCisgICAgICAgICAgICAgICAgIChzZXRmIHNiLWltcGw6OmRlZmF1bHQtZXh0ZXJuYWwtZm9ybWF0IDpVVEYtOCkpKQorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICIuLi8uLi9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6bmV0LmRpZGllcnZlcm5hLmNsb24pCisoYXNkZjpsb2FkLXN5c3RlbSA6Zmlhc2NvKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL1RocmlmdFRlc3QvdGhyaWZ0LWdlbi1UaHJpZnRUZXN0LmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtZ2VuLXRocmlmdHRlc3QpCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoZGVmcGFja2FnZSAjOnRocmlmdC1jcm9zcworICAoOnVzZSAjOmNvbW1vbi1saXNwICM6Zmlhc2NvKQorICAoOmV4cG9ydCAjOmNyb3NzLXRlc3QpKQorCisoaW4tcGFja2FnZSAjOnRocmlmdC1jcm9zcykKKworKGRlZnBhcmFtZXRlciAqcHJvdCogbmlsKQorCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJ0ZXN0cy5saXNwIiAqbG9hZC10cnVlbmFtZSopIDpleHRlcm5hbC1mb3JtYXQgOlVURi04KQorCisoY2xvbjpkZWZzeW5vcHNpcyAoKQorICAodGV4dCA6Y29udGVudHMgIlRoZSBDb21tb24gTGlzcCBjbGllbnQgZm9yIFRocmlmdCdzIGNyb3NzLWxhbmd1YWdlIHRlc3Qgc3VpdGUuIikKKyAgKGdyb3VwICg6aGVhZGVyICJBbGxvd2VkIG9wdGlvbnM6IikKKyAgICAoZmxhZyA6c2hvcnQtbmFtZSAiaCIgOmxvbmctbmFtZSAiaGVscCIKKyAgICAgICAgICA6ZGVzY3JpcHRpb24gIlByaW50IHRoaXMgaGVscCBhbmQgZXhpdC4iKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAiaG9zdCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiVGhlIGhvc3QgdG8gY29ubmVjdCB0by4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAibG9jYWxob3N0IgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwb3J0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJOdW1iZXIgb2YgdGhlIHBvcnQgdG8gbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbi4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiOTA5MCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciCisgICAgICAgICAgICA6YXJndW1lbnQtdHlwZSA6b3B0aW9uYWwpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJ0cmFuc3BvcnQiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlRyYW5zcG9ydDogdHJhbnNwb3J0IHRvIHVzZSAoXCJidWZmZXJlZFwiLCBcImZyYW1lZFwiKSIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJidWZmZXJlZCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAicHJvdG9jb2wiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlByb3RvY29sOiBwcm90b2NvbCB0byB1c2UgKFwiYmluYXJ5XCIsIFwibXVsdGlcIikiCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiYmluYXJ5IgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpKSkKKworKGRlZnVuIG1haW4gKCkKKyAgIkVudHJ5IHBvaW50IGZvciBvdXIgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbi4iCisgIChjbG9uOm1ha2UtY29udGV4dCkKKyAgKHdoZW4gKGNsb246Z2V0b3B0IDpzaG9ydC1uYW1lICJoIikKKyAgICAoY2xvbjpoZWxwKQorICAgIChjbG9uOmV4aXQpKQorICAobGV0ICgocG9ydCAiOTA5MCIpCisgICAgICAgIChob3N0ICJsb2NhbGhvc3QiKQorICAgICAgICAoZnJhbWVkIG5pbCkKKyAgICAgICAgKG11bHRpcGxleGVkIG5pbCkpCisgICAgKGNsb246ZG8tY21kbGluZS1vcHRpb25zIChvcHRpb24gbmFtZSB2YWx1ZSBzb3VyY2UpCisgICAgICAocHJpbnQgKGxpc3Qgb3B0aW9uIG5hbWUgdmFsdWUgc291cmNlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJob3N0IikKKyAgICAgICAgICAoc2V0ZiBob3N0IHZhbHVlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJwb3J0IikKKyAgICAgICAgICAoc2V0ZiBwb3J0IHZhbHVlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJ0cmFuc3BvcnQiKQorICAgICAgICAgIChjb25kICgoc3RyaW5nPSB2YWx1ZSAiYnVmZmVyZWQiKSAoc2V0ZiBmcmFtZWQgbmlsKSkKKyAgICAgICAgICAgICAgICAoKHN0cmluZz0gdmFsdWUgImZyYW1lZCIpIChzZXRmIGZyYW1lZCB0KSkKKyAgICAgICAgICAgICAgICAodCAoZXJyb3IgIlVuc3VwcG9ydGVkIHRyYW5zcG9ydC4iKSkpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInByb3RvY29sIikKKyAgICAgICAgICAoY29uZCAoKHN0cmluZz0gdmFsdWUgImJpbmFyeSIpIChzZXRmIG11bHRpcGxleGVkIG5pbCkpCisgICAgICAgICAgICAgICAgKChzdHJpbmc9IHZhbHVlICJtdWx0aSIpIChzZXRmIG11bHRpcGxleGVkIHQpKQorICAgICAgICAgICAgICAgICh0IChlcnJvciAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wuIikpKSkpCisgICAgKHRlcnByaSkKKyAgICAoc2V0ZiAqcHJvdCogKHRocmlmdC5pbXBsZW1lbnRhdGlvbjo6Y2xpZW50IChwdXJpOnBhcnNlLXVyaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jYXRlbmF0ZSAnc3RyaW5nICJ0aHJpZnQ6Ly8iIGhvc3QgIjoiIHBvcnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZyYW1lZCBmcmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdWx0aXBsZXhlZCBtdWx0aXBsZXhlZCkpCisgICAgKGxldCAoKHJlc3VsdCAoY3Jvc3MtdGVzdCA6bXVsdGlwbGV4ZWQgbXVsdGlwbGV4ZWQpKSkKKyAgICAgICh0aHJpZnQuaW1wbGVtZW50YXRpb246OmNsb3NlICpwcm90KikKKyAgICAgIChjbG9uOmV4aXQgcmVzdWx0KSkpKQorCisoY2xvbjpkdW1wICJUZXN0Q2xpZW50IiBtYWluKQpkaWZmIC0tZ2l0IGEvdGVzdC9jbC9tYWtlLXRlc3Qtc2VydmVyLmxpc3AgYi90ZXN0L2NsL21ha2UtdGVzdC1zZXJ2ZXIubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTNjODc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jbC9tYWtlLXRlc3Qtc2VydmVyLmxpc3AKQEAgLTAsMCArMSw4MCBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhyZXF1aXJlICJhc2RmIikKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgIi4uLy4uL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC9UaHJpZnRUZXN0L3RocmlmdC1nZW4tVGhyaWZ0VGVzdC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0LWdlbi10aHJpZnR0ZXN0KQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiaW1wbGVtZW50YXRpb24ubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKworKG5ldC5kaWRpZXJ2ZXJuYS5jbG9uOm5pY2tuYW1lLXBhY2thZ2UpCisKKyhjbG9uOmRlZnN5bm9wc2lzICgpCisgICh0ZXh0IDpjb250ZW50cyAiVGhlIENvbW1vbiBMaXNwIHNlcnZlciBmb3IgVGhyaWZ0J3MgY3Jvc3MtbGFuZ3VhZ2UgdGVzdCBzdWl0ZS4iKQorICAoZ3JvdXAgKDpoZWFkZXIgIkFsbG93ZWQgb3B0aW9uczoiKQorICAgIChmbGFnIDpzaG9ydC1uYW1lICJoIiA6bG9uZy1uYW1lICJoZWxwIgorICAgICAgICAgIDpkZXNjcmlwdGlvbiAiUHJpbnQgdGhpcyBoZWxwIGFuZCBleGl0LiIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwb3J0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJOdW1iZXIgb2YgdGhlIHBvcnQgdG8gbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbi4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiOTA5MCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciCisgICAgICAgICAgICA6YXJndW1lbnQtdHlwZSA6b3B0aW9uYWwpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJzZXJ2ZXItdHlwZSIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiVGhlIHR5cGUgb2Ygc2VydmVyLCBjdXJyZW50bHkgb25seSBcInNpbXBsZVwiIGlzIGF2YWlsYWJsZS4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAic2ltcGxlIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJ0cmFuc3BvcnQiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlRyYW5zcG9ydDogdHJhbnNwb3J0IHRvIHVzZSAoXCJidWZmZXJlZFwiIG9yIFwiZnJhbWVkXCIpIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImJ1ZmZlcmVkIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwcm90b2NvbCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiUHJvdG9jb2w6IHByb3RvY29sIHRvIHVzZSAoXCJiaW5hcnlcIiBvciBcIm11bHRpXCIpIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImJpbmFyeSIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKSkpCisKKyhkZWZ1biBtYWluICgpCisgICJFbnRyeSBwb2ludCBmb3Igb3VyIHN0YW5kYWxvbmUgYXBwbGljYXRpb24uIgorICAoY2xvbjptYWtlLWNvbnRleHQpCisgICh3aGVuIChjbG9uOmdldG9wdCA6c2hvcnQtbmFtZSAiaCIpCisgICAgKGNsb246aGVscCkKKyAgICAoY2xvbjpleGl0KSkKKyAgKGxldCAoKHBvcnQgIjkwOTAiKQorICAgICAgICAoZnJhbWVkIG5pbCkKKyAgICAgICAgKG11bHRpcGxleGVkIG5pbCkpCisgICAgKGNsb246ZG8tY21kbGluZS1vcHRpb25zIChvcHRpb24gbmFtZSB2YWx1ZSBzb3VyY2UpCisgICAgICAocHJpbnQgKGxpc3Qgb3B0aW9uIG5hbWUgdmFsdWUgc291cmNlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJwb3J0IikKKyAgICAgICAgICAoc2V0ZiBwb3J0IHZhbHVlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJ0cmFuc3BvcnQiKQorICAgICAgICAgIChjb25kICgoc3RyaW5nPSB2YWx1ZSAiYnVmZmVyZWQiKSAoc2V0ZiBmcmFtZWQgbmlsKSkKKyAgICAgICAgICAgICAgICAoKHN0cmluZz0gdmFsdWUgImZyYW1lZCIpIChzZXRmIGZyYW1lZCB0KSkKKyAgICAgICAgICAgICAgICAodCAoZXJyb3IgIlVuc3VwcG9ydGVkIHRyYW5zcG9ydC4iKSkpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInByb3RvY29sIikKKyAgICAgICAgICAoY29uZCAoKHN0cmluZz0gdmFsdWUgImJpbmFyeSIpIChzZXRmIG11bHRpcGxleGVkIG5pbCkpCisgICAgICAgICAgICAgICAgKChzdHJpbmc9IHZhbHVlICJtdWx0aSIpIChzZXRmIG11bHRpcGxleGVkIHQpKQorICAgICAgICAgICAgICAgICh0IChlcnJvciAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wuIikpKSkpCisgICAgKHRlcnByaSkKKyAgICAobGV0ICgoc2VydmljZXMgKGlmIG11bHRpcGxleGVkCisgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCB0aHJpZnQudGVzdDp0aHJpZnQtdGVzdCB0aHJpZnQudGVzdDpzZWNvbmQtc2VydmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdC50ZXN0OnRocmlmdC10ZXN0KSkpCisgICAgICAodGhyaWZ0OnNlcnZlIChwdXJpOnBhcnNlLXVyaSAoY29uY2F0ZW5hdGUgJ3N0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJpZnQ6Ly8xMjcuMC4wLjE6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQpKQorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcworICAgICAgICAgICAgICAgICAgICA6ZnJhbWVkIGZyYW1lZAorICAgICAgICAgICAgICAgICAgICA6bXVsdGlwbGV4ZWQgbXVsdGlwbGV4ZWQpKSkKKyAgKGNsb246ZXhpdCkpCisKKyhjbG9uOmR1bXAgIlRlc3RTZXJ2ZXIiIG1haW4pCmRpZmYgLS1naXQgYS90ZXN0L2NsL3Rlc3RzLmxpc3AgYi90ZXN0L2NsL3Rlc3RzLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwMzVmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvdGVzdHMubGlzcApAQCAtMCwwICsxLDI0MCBAQAorKGluLXBhY2thZ2UgIzp0aHJpZnQtY3Jvc3MpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBUaGUgdGVzdHMgaGVyZSBvbmx5IG1ha2Ugc2Vuc2UgaW4gdGhlIGNvbnRleHQgb2YgYSBUZXN0U2VydmVyCis7Ozs7IHJ1bm5pbmcgYW5kIHRoZSBkeW5hbWljIHZhcmlhYmxlIHRocmlmdC1jcm9zczo6KnByb3QqCis7Ozs7IGJlaW5nIHNldCB3aXRoIGEgY2xpZW50IGNvbm5lY3Rpb24gdG8gdGhlIFRlc3RTZXJ2ZXIuIE5vcm1hbGx5LAorOzs7OyB0aGlzIGlzIGhhbmRsZWQgaW4gbWFrZS10ZXN0LWNsaWVudC5saXNwLgorCisKKzs7OyBTdGFuZGFyZCBUaHJpZnQgY3Jvc3MtdGVzdCBlcnJvciBjb2RlcworKGRlZnBhcmFtZXRlciAqdGVzdF9iYXNldHlwZXMqIDEpCisoZGVmcGFyYW1ldGVyICp0ZXN0X3N0cnVjdHMqIDIpCisoZGVmcGFyYW1ldGVyICp0ZXN0X2NvbnRhaW5lcnMqIDQpCisoZGVmcGFyYW1ldGVyICp0ZXN0X2V4Y2VwdGlvbnMqIDgpCisoZGVmcGFyYW1ldGVyICp0ZXN0X3Vua25vd24qIDY0KQorKGRlZnBhcmFtZXRlciAqdGVzdF90aW1lb3V0KiAxMjgpCisKKyhkZWZ1biBjcm9zcy10ZXN0ICgma2V5IChtdWx0aXBsZXhlZCBuaWwpKQorICAiVGhlIG1haW4gY3Jvc3MtdGVzdCBydW5uZXIuIgorICAobGV0ICgocmVzdWx0IG5pbCkpCisgICAgKGhhbmRsZXItY2FzZQorICAgICAgICAocHJvZ24KKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6YmFzZS10eXBlcykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X2Jhc2V0eXBlcyogcmVzdWx0KSkKKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6c3RydWN0cykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X3N0cnVjdHMqIHJlc3VsdCkpCisgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOmNvbnRhaW5lcnMpCisgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF9jb250YWluZXJzKiByZXN1bHQpKQorICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDpleGNlcHRpb25zKQorICAgICAgICAgICAgKHB1c2huZXcgKnRlc3RfZXhjZXB0aW9ucyogcmVzdWx0KSkKKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6bWlzYykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X3Vua25vd24qIHJlc3VsdCkpCisKKyAgICAgICAgICA7OyBJdCBkb2Vzbid0IHNlZW0gbGlrZSBhbnlvbmUgYWN0dWFsbHkgdXNlcworICAgICAgICAgIDs7IHRoZSBzZWNvbmQgdGVzdCBzZXJ2aWNlIHdoZW4gdGVzdGluZyBtdWx0aXBsZXhpbmcsCisgICAgICAgICAgOzsgc28gdGhpcyB3b3VsZCBmYWlsIGFnYWluc3Qgc2VydmVycyBpbiBvdGhlcgorICAgICAgICAgIDs7IGxhbmd1YWdlcy4gRm9yIG5vdywgYW55d2F5LgorICAgICAgICAgICMrKG9yKQorICAgICAgICAgICh3aGVuIG11bHRpcGxleGVkCisgICAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6bXVsdGlwbGV4KQorICAgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF91bmtub3duKiByZXN1bHQpKSkpCisgICAgICAoZXJyb3IgKGUpIChwdXNobmV3ICp0ZXN0X3Vua25vd24qIHJlc3VsdCkpKQorICAgIChhcHBseSAjJysgcmVzdWx0KSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOmJhc2UtdHlwZXMpCisKKyhpbi1wYWNrYWdlICM6YmFzZS10eXBlcykKKworKGRlZmNvbnN0YW50ICpsYW5nLXN0cmluZyogIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhIE1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iKQorCisoZGVmcGFyYW1ldGVyICp0cmljay1zdHJpbmcqIChmb3JtYXQgbmlsICJxdW90ZTogXCIgYmFja3NsYXNoOiBcXCBuZXdsaW5lOiB+JSBiYWNrc3BhY2U6IH5DIH4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYjogflQganVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCIgI1xiYWNrc3BhY2UpKQorCisoZGVmY29uc3RhbnQgKmJpbmFyeS1zZXF1ZW5jZSogIygxMjggMTI5IDEzMCAxMzEgMTMyIDEzMyAxMzQgMTM1IDEzNiAxMzcgMTM4IDEzOSAxNDAgMTQxIDE0MiAxNDMgMTQ0IDE0NSAxNDYgMTQ3IDE0OCAxNDkgMTUwIDE1MSAxNTIgMTUzIDE1NCAxNTUgMTU2IDE1NyAxNTggMTU5IDE2MCAxNjEgMTYyIDE2MyAxNjQgMTY1IDE2NiAxNjcgMTY4IDE2OSAxNzAgMTcxIDE3MiAxNzMgMTc0IDE3NSAxNzYgMTc3IDE3OCAxNzkgMTgwIDE4MSAxODIgMTgzIDE4NCAxODUgMTg2IDE4NyAxODggMTg5IDE5MCAxOTEgMTkyIDE5MyAxOTQgMTk1IDE5NiAxOTcgMTk4IDE5OSAyMDAgMjAxIDIwMiAyMDMgMjA0IDIwNSAyMDYgMjA3IDIwOCAyMDkgMjEwIDIxMSAyMTIgMjEzIDIxNCAyMTUgMjE2IDIxNyAyMTggMjE5IDIyMCAyMjEgMjIyIDIyMyAyMjQgMjI1IDIyNiAyMjcgMjI4IDIyOSAyMzAgMjMxIDIzMiAyMzMgMjM0IDIzNSAyMzYgMjM3IDIzOCAyMzkgMjQwIDI0MSAyNDIgMjQzIDI0NCAyNDUgMjQ2IDI0NyAyNDggMjQ5IDI1MCAyNTEgMjUyIDI1MyAyNTQgMjU1IDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNDUgNDYgNDcgNDggNDkgNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcgNTggNTkgNjAgNjEgNjIgNjMgNjQgNjUgNjYgNjcgNjggNjkgNzAgNzEgNzIgNzMgNzQgNzUgNzYgNzcgNzggNzkgODAgODEgODIgODMgODQgODUgODYgODcgODggODkgOTAgOTEgOTIgOTMgOTQgOTUgOTYgOTcgOTggOTkgMTAwIDEwMSAxMDIgMTAzIDEwNCAxMDUgMTA2IDEwNyAxMDggMTA5IDExMCAxMTEgMTEyIDExMyAxMTQgMTE1IDExNiAxMTcgMTE4IDExOSAxMjAgMTIxIDEyMiAxMjMgMTI0IDEyNSAxMjYgMTI3KSkKKworKGRlZnRlc3Qgdm9pZC10ZXN0ICgpCisgIChpcyAobnVsbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC12b2lkIHRocmlmdC1jcm9zczo6KnByb3QqKSkpKQorCisoZGVmdGVzdCBib29sZWFuLXRlc3QgKCkKKyAgKGlzICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJvb2wgdGhyaWZ0LWNyb3NzOjoqcHJvdCogdCkpCisgIChpcyAobm90ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJvb2wgdGhyaWZ0LWNyb3NzOjoqcHJvdCogbmlsKSkpKQorCisoZGVmdGVzdCBpbnRlZ2VyLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMTI3KSAxMjcpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYnl0ZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtMTI4KSAtMTI4KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogNDIpIDQyKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMCkgMCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pMzIgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMCkgMCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pMzIgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMjE0NzQ4MzY0NykgMjE0NzQ4MzY0NykpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pMzIgdGhyaWZ0LWNyb3NzOjoqcHJvdCogLTIxNDc0ODM2NDgpIC0yMTQ3NDgzNjQ4KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWk2NCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwKSAwKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWk2NCB0aHJpZnQtY3Jvc3M6Oipwcm90KiA5MjIzMzcyMDM2ODU0Nzc1ODA3KSA5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWk2NCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtOTIyMzM3MjAzNjg1NDc3NTgwOCkgLTkyMjMzNzIwMzY4NTQ3NzU4MDgpKSkKKworKGRlZnRlc3QgZG91YmxlLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWRvdWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwLjApIDApKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIDQyLjApIDQyKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWRvdWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtNTU1LjApIC01NTUpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIC01Mi4zNjc4KSAtNTIuMzY3OCkpKQorCisoZGVmdGVzdCBzdHJpbmctdGVzdCAoKQorICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICIiKSAiIikpCisgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogIihkZWZ1biBib3RzYnVpbGRib3RzICgpIChib3RzYnVpbHNib3RzKSkiKQorICAgICAgICAgICAgICAgIihkZWZ1biBib3RzYnVpbGRib3RzICgpIChib3RzYnVpbHNib3RzKSkiKSkKKyAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqbGFuZy1zdHJpbmcqKSAqbGFuZy1zdHJpbmcqKSkKKyAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqdHJpY2stc3RyaW5nKikgKnRyaWNrLXN0cmluZyopKSkKKworKGRlZnRlc3QgYmluYXJ5LXRlc3QgKCkKKyAgKGlzIChlcXVhbHAgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYmluYXJ5IHRocmlmdC1jcm9zczo6KnByb3QqICMoKSkgIygpKSkKKyAgKGlzIChlcXVhbHAgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYmluYXJ5IHRocmlmdC1jcm9zczo6KnByb3QqICpiaW5hcnktc2VxdWVuY2UqKSAqYmluYXJ5LXNlcXVlbmNlKikpKQorCisoZGVmdGVzdCBlbnVtLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWVudW0gdGhyaWZ0LWNyb3NzOjoqcHJvdCogdGhyaWZ0LnRlc3Q6bnVtYmVyei5maXZlKSB0aHJpZnQudGVzdDpudW1iZXJ6LmZpdmUpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZW51bSB0aHJpZnQtY3Jvc3M6Oipwcm90KiB0aHJpZnQudGVzdDpudW1iZXJ6LmVpZ2h0KSB0aHJpZnQudGVzdDpudW1iZXJ6LmVpZ2h0KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWVudW0gdGhyaWZ0LWNyb3NzOjoqcHJvdCogdGhyaWZ0LnRlc3Q6bnVtYmVyei5vbmUpIHRocmlmdC50ZXN0Om51bWJlcnoub25lKSkpCisKKyhkZWZ0ZXN0IHR5cGVkZWYtdGVzdCAoKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtdHlwZWRlZiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAzMDk4NTgyMzUwODI1MjMpIDMwOTg1ODIzNTA4MjUyMykpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzpzdHJ1Y3RzKQorCisoaW4tcGFja2FnZSAjOnN0cnVjdHMpCisKKyhkZWZwYXJhbWV0ZXIgKnRlc3Qtc3RydWN0KiAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyAiSGVsbCBpcyBlbXB0eS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpieXRlLXRoaW5nIC0yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgNDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmk2NC10aGluZyA0MjQyNDI0MikpCisKKyhkZWZwYXJhbWV0ZXIgKnRlc3QtbmVzdCogKHRocmlmdC50ZXN0Om1ha2UteHRydWN0MiA6Ynl0ZS10aGluZyA0MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzdHJ1Y3QtdGhpbmcgKnRlc3Qtc3RydWN0KgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgLTQyKSkKKworKGRlZnRlc3Qgc3RydWN0LXRlc3QgKCkKKyAgKGxldCAoKHJlYy1zdHJ1Y3QgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RydWN0IHRocmlmdC1jcm9zczo6KnByb3QqICp0ZXN0LXN0cnVjdCopKSkKKyAgICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1ieXRlLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyByZWMtc3RydWN0KSkpKSkKKworKGRlZnRlc3QgbmVzdC10ZXN0ICgpCisgIChsZXQqICgocmVjLW5lc3QgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbmVzdCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqdGVzdC1uZXN0KikpCisgICAgICAgICAocmVjLXN0cnVjdCAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1zdHJ1Y3QtdGhpbmcgcmVjLW5lc3QpKSkKKyAgICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1ieXRlLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QyLWJ5dGUtdGhpbmcgKnRlc3QtbmVzdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QyLWJ5dGUtdGhpbmcgcmVjLW5lc3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdDItaTMyLXRoaW5nICp0ZXN0LW5lc3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1pMzItdGhpbmcgcmVjLW5lc3QpKSkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzpjb250YWluZXJzKQorCisoaW4tcGFja2FnZSAjOmNvbnRhaW5lcnMpCisKKyhkZWZ0ZXN0IGxpc3QtdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbGlzdCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkKKyAgKGlzIChlcXVhbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1saXN0IHRocmlmdC1jcm9zczo6KnByb3QqICcoNDIgLTQyIDAgNSkpICcoNDIgLTQyIDAgNSkpKSkKKworKGRlZnRlc3Qgc2V0LXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXNldCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkKKyAgKGlzIChlcXVhbCAoc29ydCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zZXQgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKGxpc3QgNDIgLTQyIDAgNSkpICMnPCkKKyAgICAgICAgICAgICAnKC00MiAwIDUgNDIpKSkpCisKKyhkZWZ1biBtYXA9IChtYXAxIG1hcDIgJmtleSAoY2FyLXByZWRpY2F0ZSAjJ2VxdWFsKSAoY2RyLXByZWRpY2F0ZSAjJ2VxdWFsKSkKKyAgIkNvbXBhcmUgdHdvIGFzc29jIG1hcHMgYWNjb3JkaW5nIHRvIHRoZSBwcmVkaWNhdGVzIGdpdmVuLiIKKyAgKG5vdCAoc2V0LWV4Y2x1c2l2ZS1vciBtYXAxIG1hcDIgOnRlc3QgKGxhbWJkYSAoZWwxIGVsMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIChmdW5jYWxsIGNhci1wcmVkaWNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXIgZWwxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciBlbDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwgY2RyLXByZWRpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNkciBlbDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RyIGVsMikpKSkpKSkKKworKGRlZnRlc3QgbWFwLXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW1hcCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkKKyAgKGlzIChtYXA9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW1hcCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAnKCgwIC4gMSkgKDQyIC4gLTQyKSAoNSAuIDUpKSkKKyAgICAgICAgICAgICcoKDAgLiAxKSAoNDIgLiAtNDIpICg1IC4gNSkpKSkKKyAgKGlzIChtYXA9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW1hcC1tYXAgdGhyaWZ0LWNyb3NzOjoqcHJvdCogNDIpCisgICAgICAgICAgICAnKCgtNCAuICgoLTQgLiAtNCkgKC0zIC4gLTMpICgtMiAuIC0yKSAoLTEgLiAtMSkpKQorICAgICAgICAgICAgICAoNCAuICgoMSAuIDEpICgyIC4gMikgKDMgLiAzKSAoNCAuIDQpKSkpCisgICAgICAgICAgICA6Y2RyLXByZWRpY2F0ZSAjJ21hcD0pKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6ZXhjZXB0aW9ucykKKworKGluLXBhY2thZ2UgIzpleGNlcHRpb25zKQorCisoZGVmdW4gdGVzdC14Y2VwdGlvbiAoZXhwZWN0ZWQtY29kZSBleHBlY3RlZC1tZXNzYWdlIGZ1bmN0aW9uICZyZXN0IGFyZ3MpCisgICJBIGhlbHBlciBmdW5jdGlvbiB0byB0ZXN0IHdoZXRoZXIgeGNlcHRpb24gaXMgc2lnbmFsbGVkLCBhbmQgd2hldGhlciBpdHMgZmllbGRzIGhhdmUgdGhlIGV4cGVjdGVkIHZhbHVlcy4iCisgIChoYW5kbGVyLWNhc2UgKHByb2duIChhcHBseSBmdW5jdGlvbiBhcmdzKQorICAgICAgICAgICAgICAgICAgICAgICBuaWwpCisgICAgKHRocmlmdC50ZXN0OnhjZXB0aW9uIChleCkgKGFuZCAoPSAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uLWVycm9yLWNvZGUgZXgpIGV4cGVjdGVkLWNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nPSAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uLW1lc3NhZ2UgZXgpIGV4cGVjdGVkLW1lc3NhZ2UpKSkpKQorCisoZGVmdW4gdGVzdC14Y2VwdGlvbjIgKGV4cGVjdGVkLWNvZGUgZXhwZWN0ZWQtbWVzc2FnZSBmdW5jdGlvbiAmcmVzdCBhcmdzKQorICAiQSBoZWxwZXIgZnVuY3Rpb24gdG8gdGVzdCB3aGV0aGVyIHhjZXB0aW9uMiBpcyBzaWduYWxsZWQsIGFuZCB3aGV0aGVyIGl0cyBmaWVsZHMgaGF2ZSB0aGUgZXhwZWN0ZWQgdmFsdWVzLiIKKyAgKGhhbmRsZXItY2FzZSAocHJvZ24gKGFwcGx5IGZ1bmN0aW9uIGFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgIG5pbCkKKyAgICAodGhyaWZ0LnRlc3Q6eGNlcHRpb24yIChleCkgKGFuZCAoPSAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uMi1lcnJvci1jb2RlIGV4KSBleHBlY3RlZC1jb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmc9ICh0aHJpZnQudGVzdDo6eHRydWN0LXN0cmluZy10aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uMi1zdHJ1Y3QtdGhpbmcgZXgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLW1lc3NhZ2UpKSkpKQorCisoZGVmdGVzdCBleGNlcHRpb24tdGVzdCAoKQorICAoaXMgKHRlc3QteGNlcHRpb24gMTAwMSAiWGNlcHRpb24iICMndGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCogIlhjZXB0aW9uIikpCisgIChzaWduYWxzIHRocmlmdDphcHBsaWNhdGlvbi1lcnJvciAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCogIlRFeGNlcHRpb24iKSkKKyAgKGZpbmlzaGVzICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWV4Y2VwdGlvbiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAic3VjY2VzcyIpKSkKKworKGRlZnRlc3QgbXVsdGktZXhjZXB0aW9uLXRlc3QgKCkKKyAgKGlzICh0ZXN0LXhjZXB0aW9uIDEwMDEKKyAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgIyd0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW11bHRpLWV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0LWNyb3NzOjoqcHJvdCoKKyAgICAgICAgICAgICAgICAgICAgICJYY2VwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICJtZWFuaW5nbGVzcyIpKQorICAoaXMgKHRlc3QteGNlcHRpb24yIDIwMDIKKyAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisgICAgICAgICAgICAgICAgICAgICAgIyd0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW11bHRpLWV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgIHRocmlmdC1jcm9zczo6KnByb3QqCisgICAgICAgICAgICAgICAgICAgICAgIlhjZXB0aW9uMiIKKyAgICAgICAgICAgICAgICAgICAgICAibWVhbmluZ2xlc3MgdG9vISIpKQorICAoaXMgKHN0cmluZz0gImZvb2JhciIgKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tdWx0aS1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MhIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vYmFyIikpKSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOm1pc2MpCisKKyhpbi1wYWNrYWdlICM6bWlzYykKKworKGRlZnRlc3Qgb25ld2F5LXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW9uZXdheSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAxKSkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzptdWx0aXBsZXgpCisKKyhpbi1wYWNrYWdlICM6bXVsdGlwbGV4KQorCisoZGVmdGVzdCBtdWx0aXBsZXgtdGVzdCAoKQorICA7OyBSZW1vdmVkIGZyb20gdGhlIElETCBkZWZpbml0aW9uLgorICA7OyAoZmluaXNoZXMgKHRocmlmdC50ZXN0LnNlY29uZC1zZXJ2aWNlOmJsYWgtYmxhaCB0aHJpZnQtY3Jvc3M6Oipwcm90KikpCisgIChpcyAoc3RyaW5nPSAiYXNkIiAodGhyaWZ0LnRlc3Quc2Vjb25kLXNlcnZpY2U6c2Vjb25kdGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogImFzZCIpKSkpCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9DTWFrZUxpc3RzLnR4dCBiL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0CmluZGV4IDJkNzVmMmUuLjkwYWY3ODIgMTAwNzU1Ci0tLSBhL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0CisrKyBiL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0xNywyNiArMTcsMzEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKKyMgVGhlIHRlc3QgZXhlY3V0YWJsZXMgc3RpbGwgZGVwZW5kIG9uIEJvb3N0CitpbmNsdWRlKEJvb3N0TWFjcm9zKQorUkVRVUlSRV9CT09TVF9IRUFERVJTKCkKK3NldChCT09TVF9DT01QT05FTlRTIGZpbGVzeXN0ZW0gcHJvZ3JhbV9vcHRpb25zIHJhbmRvbSkKK1JFUVVJUkVfQk9PU1RfTElCUkFSSUVTKEJPT1NUX0NPTVBPTkVOVFMpCisKICMgQ29udGFpbnMgdGhlIHRocmlmdCBzcGVjaWZpYyBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkKIGluY2x1ZGUoVGhyaWZ0TWFjcm9zKQogCi1zZXQoQm9vc3RfVVNFX1NUQVRJQ19MSUJTIE9OKQotZmluZF9wYWNrYWdlKEJvb3N0IDEuNTMuMCBSRVFVSVJFRCBDT01QT05FTlRTIHByb2dyYW1fb3B0aW9ucyBzeXN0ZW0gZmlsZXN5c3RlbSkKLWluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke0Jvb3N0X0lOQ0xVREVfRElSU30iKQotCiBmaW5kX3BhY2thZ2UoT3BlblNTTCBSRVFVSVJFRCkKIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke09QRU5TU0xfSU5DTFVERV9ESVJ9IikKIAogZmluZF9wYWNrYWdlKExpYmV2ZW50IFJFUVVJUkVEKSAgIyBMaWJldmVudCBjb21lcyB3aXRoIENNYWtlIHN1cHBvcnQgZnJvbSB1cHN0cmVhbQogaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtMSUJFVkVOVF9JTkNMVURFX0RJUlN9KQogCitmaW5kX3BhY2thZ2UoWkxJQiBSRVFVSVJFRCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7WkxJQl9JTkNMVURFX0RJUlN9KQorCiAjTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCiBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQogaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jcHAiKQogaW5jbHVkZV9kaXJlY3RvcmllcygiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYi9jcHAvc3JjIikKIAotCiBzZXQoY3Jvc3N0ZXN0Z2VuY3BwX1NPVVJDRVMKKyAgICBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwCiAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcAogICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAKICAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcApAQCAtNDcsNyArNTIsNyBAQAogCiBzZXQoY3Jvc3NzdHJlc3NnZW5jcHBfU09VUkNFUwogICAgIGdlbi1jcHAvU2VydmljZS5jcHAKLSAgICAjZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcCAjYmFzaWNhbGx5IGVtcHR5LCBzbyBvbWl0dGluZworICAgIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAKICAgICBnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmNwcAogKQogYWRkX2xpYnJhcnkoY3Jvc3NzdHJlc3NnZW5jcHAgU1RBVElDICR7Y3Jvc3NzdHJlc3NnZW5jcHBfU09VUkNFU30pCkBAIC01NywxNyArNjIsMjAgQEAKIHRhcmdldF9saW5rX2xpYnJhcmllcyhUZXN0U2VydmVyIGNyb3NzdGVzdGdlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30gJHtMSUJFVkVOVF9MSUJ9KQogTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RTZXJ2ZXIgdGhyaWZ0KQogTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RTZXJ2ZXIgdGhyaWZ0bmIpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdFNlcnZlciB0aHJpZnR6KQogCiBhZGRfZXhlY3V0YWJsZShUZXN0Q2xpZW50IHNyYy9UZXN0Q2xpZW50LmNwcCkKIHRhcmdldF9saW5rX2xpYnJhcmllcyhUZXN0Q2xpZW50IGNyb3NzdGVzdGdlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30gJHtMSUJFVkVOVF9MSUJ9KQogTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RDbGllbnQgdGhyaWZ0KQogTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RDbGllbnQgdGhyaWZ0bmIpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdENsaWVudCB0aHJpZnR6KQogCiBhZGRfZXhlY3V0YWJsZShTdHJlc3NUZXN0IHNyYy9TdHJlc3NUZXN0LmNwcCkKIHRhcmdldF9saW5rX2xpYnJhcmllcyhTdHJlc3NUZXN0IGNyb3Nzc3RyZXNzZ2VuY3BwICR7Qm9vc3RfTElCUkFSSUVTfSAke0xJQkVWRU5UX0xJQn0pCiBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3RyZXNzVGVzdCB0aHJpZnQpCiBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3RyZXNzVGVzdCB0aHJpZnRuYikKIGFkZF90ZXN0KE5BTUUgU3RyZXNzVGVzdCBDT01NQU5EIFN0cmVzc1Rlc3QpCithZGRfdGVzdChOQU1FIFN0cmVzc1Rlc3RDb25jdXJyZW50IENPTU1BTkQgU3RyZXNzVGVzdCAtLWNsaWVudC10eXBlPWNvbmN1cnJlbnQpCiAKIGFkZF9leGVjdXRhYmxlKFN0cmVzc1Rlc3ROb25CbG9ja2luZyBzcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcCkKIHRhcmdldF9saW5rX2xpYnJhcmllcyhTdHJlc3NUZXN0Tm9uQmxvY2tpbmcgY3Jvc3NzdHJlc3NnZW5jcHAgJHtCb29zdF9MSUJSQVJJRVN9ICR7TElCRVZFTlRfTElCfSkKQEAgLTgwLDEwICs4OCwxMCBAQAogIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcwogIwogCi1hZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcAotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGNwcDp0ZW1wbGF0ZXMsY29iX3N0eWxlIC1yICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmggZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3QuaCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgLXIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKICkKIAogYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvU2VydmljZS5jcHAKLSAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKICkKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL01ha2VmaWxlLmFtIGIvdGVzdC9jcHAvTWFrZWZpbGUuYW0KaW5kZXggODlmZWQ4Zi4uZWJlNzE1ZSAxMDA3NTUKLS0tIGEvdGVzdC9jcHAvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9jcHAvTWFrZWZpbGUuYW0KQEAgLTIxLDEyICsyMSwxNiBAQAogQlVJTFRfU09VUkNFUyA9IGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgXAogICAgICAgICAgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgXAogICAgICAgICAgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIFwKICAgICAgICAgICAgICAgICBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwIFwKICAgICAgICAgICAgICAgICBnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmNwcCBcCiAgICAgICAgICAgICAgICAgZ2VuLWNwcC9TZXJ2aWNlLmNwcAogCiBub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ0ZXN0Z2VuY3BwLmxhIGxpYnN0cmVzc3Rlc3RnZW5jcHAubGEKIG5vZGlzdF9saWJ0ZXN0Z2VuY3BwX2xhX1NPVVJDRVMgPSBcCisJZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBcCisJZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmggXAorCWdlbi1jcHAvU2Vjb25kU2VydmljZS50Y2MgXAogCWdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIFwKIAlnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmggXAogCWdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgXApAQCAtNjksNyArNzMsNyBAQAogCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCiAJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0ei5sYSBcCiAJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAotCS1sZXZlbnQgLWxib29zdF9wcm9ncmFtX29wdGlvbnMgLWxib29zdF9zeXN0ZW0gLWxib29zdF9maWxlc3lzdGVtCisJLWxldmVudCAtbGJvb3N0X3Byb2dyYW1fb3B0aW9ucyAtbGJvb3N0X3N5c3RlbSAtbGJvb3N0X2ZpbGVzeXN0ZW0gJChaTElCX0xJQlMpCiAKIFRlc3RDbGllbnRfU09VUkNFUyA9IFwKIAlzcmMvVGVzdENsaWVudC5jcHAKQEAgLTc5LDcgKzgzLDcgQEAKIAkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAogCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdHoubGEgXAogCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdG5iLmxhIFwKLQktbGV2ZW50IC1sYm9vc3RfcHJvZ3JhbV9vcHRpb25zIC1sYm9vc3Rfc3lzdGVtIC1sYm9vc3RfZmlsZXN5c3RlbQorCS1sZXZlbnQgLWxib29zdF9wcm9ncmFtX29wdGlvbnMgLWxib29zdF9zeXN0ZW0gLWxib29zdF9maWxlc3lzdGVtICQoWkxJQl9MSUJTKQogCiBTdHJlc3NUZXN0X1NPVVJDRVMgPSBcCiAJc3JjL1N0cmVzc1Rlc3QuY3BwCkBAIC05OCwyMCArMTAyLDE4IEBACiAjCiAjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCiAjCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCi1nZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHA6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmggZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLnRjYzogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQogCSQoVEhSSUZUKSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAtciAkPAogCi1nZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvU2VydmljZS5jcHA6ICQodG9wX3NyY2RpcikvdGVzdC9TdHJlc3NUZXN0LnRocmlmdAorZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1NlcnZpY2UuY3BwOiAkKHRvcF9zcmNkaXIpL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCiBBTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpICQoTElCRVZFTlRfQ1BQRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9saWIvY3BwL3NyYyAtSWdlbi1jcHAKLUFNX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKK0FNX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgLURfX1NURENfRk9STUFUX01BQ1JPUyAtRF9fU1REQ19MSU1JVF9NQUNST1MKIEFNX0xERkxBR1MgPSAkKEJPT1NUX0xERkxBR1MpICQoTElCRVZFTlRfTERGTEFHUykgJChaTElCX0xJQlMpCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1jcHAKKwkkKFJNKSAtciBnZW4tY3BwLwogCiBzdHlsZS1sb2NhbDoKIAkkKENQUFNUWUxFX0NNRCkKQEAgLTEyMCw2ICsxMjIsNCBAQAogCXNyYy9UZXN0Q2xpZW50LmNwcCBcCiAJc3JjL1Rlc3RTZXJ2ZXIuY3BwIFwKIAlzcmMvU3RyZXNzVGVzdC5jcHAgXAotCXNyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwIFwKLQlyZWFsbG9jL3JlYWxsb2NfdGVzdC5jIFwKLQlyZWFsbG9jL01ha2VmaWxlCisJc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3JlYWxsb2MvTWFrZWZpbGUgYi90ZXN0L2NwcC9yZWFsbG9jL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODliYmIzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3BwL3JlYWxsb2MvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBUaGlzIHByb2JhYmx5IHNob3VsZCBub3QgZ28gaW50byAibWFrZSBjaGVjayIsIGJlY2F1c2UgaXQgaXMgYW4gZXhwZXJpbWVudCwKLSMgbm90IGEgdGVzdC4gIFNwZWNpZmljYWxseSwgaXQgaXMgbWVhbnQgdG8gZGV0ZXJtaW5lIGhvdyBsaWtlbHkgcmVhbGxvYyBpcwotIyB0byBhdm9pZCBhIGNvcHkuICBUaGlzIGlzIHBvb3JseSBkb2N1bWVudGVkLgotCi1ydW46IHJlYWxsb2NfdGVzdAotCWZvciBpdCBpbiAxIDQgNjQgOyBkbyBcCi0JCWZvciBuYiBpbiAxIDggNjQgNTEyIDsgZG8gXAotCQkJZm9yIG1pbnMgaW4gNjQgNTEyIDsgZG8gXAotCQkJCWZvciBtYXhzIGluIDIwNDggMjYyMTQ0IDsgZG8gXAotCQkJCQlmb3IgZGIgaW4gOCA2NCA7IGRvIFwKLQkJCQkJCS4vcmVhbGxvY190ZXN0ICQkbmIgJCRtaW5zICQkbWF4cyAkJGRiICQkaXQgXAotCQkJCQk7IGRvbmUgXAotCQkJCTsgZG9uZSBcCi0JCQk7IGRvbmUgXAotCQk7IGRvbmUgXAotCTsgZG9uZSBcCi0JPiByYXdfc3RhdHMKLQotQ0ZMQUdTID0gLVdhbGwgLWcgLXN0ZD1jOTkKLUxETElCUyA9IC1sZGwKLXJlYWxsb2NfdGVzdDogcmVhbGxvY190ZXN0LmMKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3JlYWxsb2MvcmVhbGxvY190ZXN0LmMgYi90ZXN0L2NwcC9yZWFsbG9jL3JlYWxsb2NfdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTc2M2FkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3BwL3JlYWxsb2MvcmVhbGxvY190ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIF9HTlVfU09VUkNFCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLQotaW50IGNvcGllczsKLWludCBub25fY29waWVzOwotCi12b2lkICpyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpIHsKLSAgc3RhdGljIHZvaWQgKigqcmVhbF9yZWFsbG9jKSh2b2lkKiwgc2l6ZV90KSA9IE5VTEw7Ci0gIGlmIChyZWFsX3JlYWxsb2MgPT0gTlVMTCkgewotICAgIHJlYWxfcmVhbGxvYyA9ICh2b2lkKiAoKikgKHZvaWQqLCBzaXplX3QpKSBkbHN5bShSVExEX05FWFQsICJyZWFsbG9jIik7Ci0gIH0KLQotICB2b2lkICpyZXRfcHRyID0gKCpyZWFsX3JlYWxsb2MpKHB0ciwgc2l6ZSk7Ci0KLSAgaWYgKHJldF9wdHIgPT0gcHRyKSB7Ci0gICAgbm9uX2NvcGllcysrOwotICB9IGVsc2UgewotICAgIGNvcGllcysrOwotICB9Ci0KLSAgcmV0dXJuIHJldF9wdHI7Ci19Ci0KLQotc3RydWN0IFRNZW1vcnlCdWZmZXIgewotICB2b2lkKiBwdHI7Ci0gIGludCBzaXplOwotfTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotICBpbnQgbnVtX2J1ZmZlcnM7Ci0gIGludCBpbml0X3NpemU7Ci0gIGludCBtYXhfc2l6ZTsKLSAgaW50IGRvdWJsaW5nczsKLSAgaW50IGl0ZXJhdGlvbnM7Ci0KLSAgaWYgKGFyZ2MgPCA2IHx8Ci0gICAgICBhcmdjID4gNyB8fAotICAgICAgKG51bV9idWZmZXJzID0gYXRvaShhcmd2WzFdKSkgPT0gMCB8fAotICAgICAgKGluaXRfc2l6ZSA9IGF0b2koYXJndlsyXSkpID09IDAgfHwKLSAgICAgIChtYXhfc2l6ZSA9IGF0b2koYXJndlszXSkpID09IDAgfHwKLSAgICAgIGluaXRfc2l6ZSA+IG1heF9zaXplIHx8Ci0gICAgICAoaXRlcmF0aW9ucyA9IGF0b2koYXJndls0XSkpID09IDAgfHwKLSAgICAgIChkb3VibGluZ3MgPSBhdG9pKGFyZ3ZbNV0pKSA9PSAwIHx8Ci0gICAgICAoYXJnYyA9PSA3ICYmIGF0b2koYXJndls2XSkgPT0gMCkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiByZWFsbG9jX3Rlc3QgPG51bV9idWZmZXJzPiA8aW5pdF9zaXplPiA8bWF4X3NpemU+IDxkb3VibGluZ3M+IDxpdGVyYXRpb25zPiBbc2VlZF1cbiIpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotCi0gIGZvciAoIGludCBpID0gMCA7IGkgPCBhcmdjIDsgaSsrICkgewotICAgIHByaW50ZigiJXMgIiwgYXJndltpXSk7Ci0gIH0KLSAgcHJpbnRmKCJcbiIpOwotCi0gIGlmIChhcmdjID09IDcpIHsKLSAgICBzcmFuZChhdG9pKGFyZ3ZbNl0pKTsKLSAgfSBlbHNlIHsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgfQotCi0gIHN0cnVjdCBUTWVtb3J5QnVmZmVyKiBidWZmZXJzID0gY2FsbG9jKG51bV9idWZmZXJzLCBzaXplb2YoKmJ1ZmZlcnMpKTsKLSAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgYWJvcnQoKTsKLQotICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbnVtX2J1ZmZlcnMgOyBpKysgKSB7Ci0gICAgYnVmZmVyc1tpXS5zaXplID0gbWF4X3NpemU7Ci0gIH0KLQotICB3aGlsZSAoaXRlcmF0aW9ucyAtLT4gMCkgewotICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBkb3VibGluZ3MgKiBudW1fYnVmZmVycyA7IGkrKyApIHsKLSAgICAgIHN0cnVjdCBUTWVtb3J5QnVmZmVyKiBidWYgPSAmYnVmZmVyc1tyYW5kKCkgJSBudW1fYnVmZmVyc107Ci0gICAgICBidWYtPnNpemUgKj0gMjsKLSAgICAgIGlmIChidWYtPnNpemUgPD0gbWF4X3NpemUpIHsKLSAgICAgICAgYnVmLT5wdHIgPSByZWFsbG9jKGJ1Zi0+cHRyLCBidWYtPnNpemUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZnJlZShidWYtPnB0cik7Ci0gICAgICAgIGJ1Zi0+c2l6ZSA9IGluaXRfc2l6ZTsKLSAgICAgICAgYnVmLT5wdHIgPSBtYWxsb2MoYnVmLT5zaXplKTsKLSAgICAgIH0KLSAgICAgIGlmIChidWYtPnB0ciA9PSBOVUxMKSBhYm9ydCgpOwotICAgIH0KLSAgfQotCi0gIHByaW50ZigiTm9uLWNvcGllZCAlZC8lZCAoJS4yZiUlKVxuIiwgbm9uX2NvcGllcywgY29waWVzICsgbm9uX2NvcGllcywgMTAwLjAgKiBub25fY29waWVzIC8gKGNvcGllcyArIG5vbl9jb3BpZXMpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdC5jcHAgYi90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdC5jcHAKaW5kZXggOTM3MWJjZS4uNzlhNzA4ZSAxMDA2NDQKLS0tIGEvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3QuY3BwCisrKyBiL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0LmNwcApAQCAtMTgsOSArMTgsOCBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CkBAIC00NSw2ICs0NCw3IEBACiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7CkBAIC02NSw3ICs2NSw3IEBACiAKIGNsYXNzIFNlcnZlciA6IHB1YmxpYyBTZXJ2aWNlSWYgewogcHVibGljOgotICBTZXJ2ZXIoKSB7fQorICBTZXJ2ZXIoKSA9IGRlZmF1bHQ7CiAKICAgdm9pZCBjb3VudChjb25zdCBjaGFyKiBtZXRob2QpIHsKICAgICBHdWFyZCBtKGxvY2tfKTsKQEAgLTczLDcgKzczLDcgQEAKICAgICBjb3VudHNfW21ldGhvZF0gPSArK2N0OwogICB9CiAKLSAgdm9pZCBlY2hvVm9pZCgpIHsKKyAgdm9pZCBlY2hvVm9pZCgpIG92ZXJyaWRlIHsKICAgICBjb3VudCgiZWNob1ZvaWQiKTsKICAgICByZXR1cm47CiAgIH0KQEAgLTgzLDE4ICs4MywxOCBAQAogICAgIHJldHVybiBjb3VudHNfOwogICB9CiAKLSAgaW50OF90IGVjaG9CeXRlKGNvbnN0IGludDhfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQotICBpbnQzMl90IGVjaG9JMzIoY29uc3QgaW50MzJfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQotICBpbnQ2NF90IGVjaG9JNjQoY29uc3QgaW50NjRfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQotICB2b2lkIGVjaG9TdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyYgYXJnKSB7CisgIGludDhfdCBlY2hvQnl0ZShjb25zdCBpbnQ4X3QgYXJnKSBvdmVycmlkZSB7IHJldHVybiBhcmc7IH0KKyAgaW50MzJfdCBlY2hvSTMyKGNvbnN0IGludDMyX3QgYXJnKSBvdmVycmlkZSB7IHJldHVybiBhcmc7IH0KKyAgaW50NjRfdCBlY2hvSTY0KGNvbnN0IGludDY0X3QgYXJnKSBvdmVycmlkZSB7IHJldHVybiBhcmc7IH0KKyAgdm9pZCBlY2hvU3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcmIGFyZykgb3ZlcnJpZGUgewogICAgIGlmIChhcmcgIT0gImhlbGxvIikgewogICAgICAgVF9FUlJPUl9BQk9SVCgiV1JPTkcgU1RSSU5HICglcykhISEhIiwgYXJnLmNfc3RyKCkpOwogICAgIH0KICAgICBvdXQgPSBhcmc7CiAgIH0KLSAgdm9pZCBlY2hvTGlzdCh2ZWN0b3I8aW50OF90PiYgb3V0LCBjb25zdCB2ZWN0b3I8aW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQotICB2b2lkIGVjaG9TZXQoc2V0PGludDhfdD4mIG91dCwgY29uc3Qgc2V0PGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KLSAgdm9pZCBlY2hvTWFwKG1hcDxpbnQ4X3QsIGludDhfdD4mIG91dCwgY29uc3QgbWFwPGludDhfdCwgaW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQorICB2b2lkIGVjaG9MaXN0KHZlY3RvcjxpbnQ4X3Q+JiBvdXQsIGNvbnN0IHZlY3RvcjxpbnQ4X3Q+JiBhcmcpIG92ZXJyaWRlIHsgb3V0ID0gYXJnOyB9CisgIHZvaWQgZWNob1NldChzZXQ8aW50OF90PiYgb3V0LCBjb25zdCBzZXQ8aW50OF90PiYgYXJnKSBvdmVycmlkZSB7IG91dCA9IGFyZzsgfQorICB2b2lkIGVjaG9NYXAobWFwPGludDhfdCwgaW50OF90PiYgb3V0LCBjb25zdCBtYXA8aW50OF90LCBpbnQ4X3Q+JiBhcmcpIG92ZXJyaWRlIHsgb3V0ID0gYXJnOyB9CiAKIHByaXZhdGU6CiAgIGNvdW50X21hcCBjb3VudHNfOwpAQCAtMTA3LDggKzEwNyw4IEBACiB9OwogY2xhc3MgQ2xpZW50VGhyZWFkIDogcHVibGljIFJ1bm5hYmxlIHsKIHB1YmxpYzoKLSAgQ2xpZW50VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VJZj4gY2xpZW50LAorICBDbGllbnRUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlSWY+IGNsaWVudCwKICAgICAgICAgICAgICAgIE1vbml0b3ImIG1vbml0b3IsCiAgICAgICAgICAgICAgICBzaXplX3QmIHdvcmtlckNvdW50LAogICAgICAgICAgICAgICAgc2l6ZV90IGxvb3BDb3VudCwKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgICAgX2xvb3BUeXBlKGxvb3BUeXBlKSwKICAgICAgIF9iZWhhdmlvcihiZWhhdmlvcikge30KIAotICB2b2lkIHJ1bigpIHsKKyAgdm9pZCBydW4oKSBvdmVycmlkZSB7CiAKICAgICAvLyBXYWl0IGZvciBhbGwgd29ya2VyIHRocmVhZHMgdG8gc3RhcnQKIApAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgX3N0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgX3N0YXJ0VGltZSA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKICAgICBpZihfYmVoYXZpb3IgPT0gT3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQpIHsKICAgICAgIF90cmFuc3BvcnQtPm9wZW4oKTsKICAgICB9CkBAIC0xNTksNyArMTU5LDcgQEAKICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICBfZW5kVGltZSA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKIAogICAgIGlmKF9iZWhhdmlvciA9PSBPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkgewogICAgICAgX3RyYW5zcG9ydC0+Y2xvc2UoKTsKQEAgLTIyNCw4ICsyMjQsOCBAQAogICAgIH0KICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IF90cmFuc3BvcnQ7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VJZj4gX2NsaWVudDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IF90cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlSWY+IF9jbGllbnQ7CiAgIE1vbml0b3ImIF9tb25pdG9yOwogICBzaXplX3QmIF93b3JrZXJDb3VudDsKICAgc2l6ZV90IF9sb29wQ291bnQ7CkBAIC0yNDAsNyArMjQwLDcgQEAKIGNsYXNzIFRTdGFydE9ic2VydmVyIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXIgewogcHVibGljOgogICBUU3RhcnRPYnNlcnZlcigpIDogYXdha2VfKGZhbHNlKSB7fQotICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7CisgIHZvaWQgcHJlU2VydmUoKSBvdmVycmlkZSB7CiAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhtXyk7CiAgICAgYXdha2VfID0gdHJ1ZTsKICAgICBtXy5ub3RpZnlBbGwoKTsKQEAgLTI2NSw4ICsyNjUsOCBAQAogICBzdHJpbmcgY2xpZW50VHlwZSA9ICJyZWd1bGFyIjsKICAgc3RyaW5nIHNlcnZlclR5cGUgPSAidGhyZWFkLXBvb2wiOwogICBzdHJpbmcgcHJvdG9jb2xUeXBlID0gImJpbmFyeSI7Ci0gIHNpemVfdCB3b3JrZXJDb3VudCA9IDQ7Ci0gIHNpemVfdCBjbGllbnRDb3VudCA9IDIwOworICBzaXplX3Qgd29ya2VyQ291bnQgPSA4OworICBzaXplX3QgY2xpZW50Q291bnQgPSA0OwogICBzaXplX3QgbG9vcENvdW50ID0gNTAwMDA7CiAgIFRUeXBlIGxvb3BUeXBlID0gVF9WT0lEOwogICBzdHJpbmcgY2FsbE5hbWUgPSAiZWNob1ZvaWQiOwpAQCAtMjg1LDE0ICsyODUsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIG9ubHkuICBEZWZhdWx0IGlzICIgPDwgY2xpZW50Q291bnQgPDwgZW5kbAogICAgICAgICA8PCAiXHRoZWxwICAgICAgICAgICBQcmludHMgdGhpcyBoZWxwIHRleHQuIiA8PCBlbmRsCiAgICAgICAgIDw8ICJcdGNhbGwgICAgICAgICAgIFNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuICBEZWZhdWx0IGlzICIgPDwgY2FsbE5hbWUgPDwgZW5kbAotICAgICAgICA8PCAiXHRsb29wICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJlbW90ZSB0aHJpZnQgY2FsbHMgZWFjaCBjbGllbnQgbWFrZXMuICBEZWZhdWx0IGlzICIgPDwgbG9vcENvdW50IDw8IGVuZGwgCisgICAgICAgIDw8ICJcdGxvb3AgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcmVtb3RlIHRocmlmdCBjYWxscyBlYWNoIGNsaWVudCBtYWtlcy4gIERlZmF1bHQgaXMgIiA8PCBsb29wQ291bnQgPDwgZW5kbAogICAgICAgICA8PCAiXHRwb3J0ICAgICAgICAgICBUaGUgcG9ydCB0aGUgc2VydmVyIGFuZCBjbGllbnRzIHNob3VsZCBiaW5kIHRvICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmlmdCBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgRGVmYXVsdCBpcyAiIDw8IHBvcnQgPDwgZW5kbAotICAgICAgICA8PCAiXHRzZXJ2ZXIgICAgICAgICBSdW4gdGhlIFRocmlmdCBzZXJ2ZXIgaW4gdGhpcyBwcm9jZXNzLiAgRGVmYXVsdCBpcyAiIDw8IHJ1blNlcnZlciA8PCBlbmRsIAorICAgICAgICA8PCAiXHRzZXJ2ZXIgICAgICAgICBSdW4gdGhlIFRocmlmdCBzZXJ2ZXIgaW4gdGhpcyBwcm9jZXNzLiAgRGVmYXVsdCBpcyAiIDw8IHJ1blNlcnZlciA8PCBlbmRsCiAgICAgICAgIDw8ICJcdHNlcnZlci10eXBlICAgIFR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiIG9yIFwidGhyZWFkLXBvb2xcIi4gIERlZmF1bHQgaXMgIiA8PCBzZXJ2ZXJUeXBlIDw8IGVuZGwKICAgICAgICAgPDwgIlx0cHJvdG9jb2wtdHlwZSAgVHlwZSBvZiBwcm90b2NvbCwgXCJiaW5hcnlcIiwgXCJhc2NpaVwiLCBvciBcInhtbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHByb3RvY29sVHlwZSA8PCBlbmRsCi0gICAgICAgIDw8ICJcdGxvZy1yZXF1ZXN0ICAgIExvZyBhbGwgcmVxdWVzdCB0byAuL3JlcXVlc3Rsb2cudGxvZy4gRGVmYXVsdCBpcyAiIDw8IGxvZ1JlcXVlc3RzIDw8IGVuZGwgCi0gICAgICAgIDw8ICJcdHJlcGxheS1yZXF1ZXN0IFJlcGxheSByZXF1ZXN0cyBmcm9tIGxvZyBmaWxlICguL3JlcXVlc3Rsb2cudGxvZykgRGVmYXVsdCBpcyAiIDw8IHJlcGxheVJlcXVlc3RzIDw8IGVuZGwgCisgICAgICAgIDw8ICJcdGxvZy1yZXF1ZXN0ICAgIExvZyBhbGwgcmVxdWVzdCB0byAuL3JlcXVlc3Rsb2cudGxvZy4gRGVmYXVsdCBpcyAiIDw8IGxvZ1JlcXVlc3RzIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0cmVwbGF5LXJlcXVlc3QgUmVwbGF5IHJlcXVlc3RzIGZyb20gbG9nIGZpbGUgKC4vcmVxdWVzdGxvZy50bG9nKSBEZWZhdWx0IGlzICIgPDwgcmVwbGF5UmVxdWVzdHMgPDwgZW5kbAogICAgICAgICA8PCAiXHR3b3JrZXJzICAgICAgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuICBPbmx5IHZhbGlkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlLiAgRGVmYXVsdCBpcyAiIDw8IHdvcmtlckNvdW50IDw8IGVuZGwKICAgICAgICAgPDwgIlx0Y2xpZW50LXR5cGUgICAgVHlwZSBvZiBjbGllbnQsIFwicmVndWxhclwiIG9yIFwiY29uY3VycmVudFwiLiAgRGVmYXVsdCBpcyAiIDw8IGNsaWVudFR5cGUgPDwgZW5kbApAQCAtMzkwLDI0ICszOTAsMjQgQEAKICAgICBjZXJyIDw8IHVzYWdlLnN0cigpOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5Ci0gICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+KG5ldyBUaHJlYWRGYWN0b3J5KCkpOwogCiAgIC8vIERpc3BhdGNoZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwogCiAgIGlmIChyZXBsYXlSZXF1ZXN0cykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwogCiAgICAgLy8gVHJhbnNwb3J0cwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZWVrVG9FbmQoKTsKIAogICAgIC8vIFByb3RvY29sIEZhY3RvcnkKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKIAogICAgIFRGaWxlUHJvY2Vzc29yIGZpbGVQcm9jZXNzb3Ioc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBmaWxlVHJhbnNwb3J0KTsKIApAQCAtNDE3LDI4ICs0MTcsMjggQEAKIAogICBpZiAocnVuU2VydmVyKSB7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKIAogICAgIC8vIFRyYW5zcG9ydAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CiAKICAgICAvLyBUcmFuc3BvcnQgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKIAogICAgIC8vIFByb3RvY29sIEZhY3RvcnkKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKIAogICAgIGlmIChsb2dSZXF1ZXN0cykgewogICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbG9nIGZpbGUKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwogICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0Q2h1bmtTaXplKDIgKiAxMDI0ICogMTAyNCk7CiAgICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKIAogICAgICAgdHJhbnNwb3J0RmFjdG9yeQotICAgICAgICAgID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGZpbGVUcmFuc3BvcnQpKTsKKyAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOwogICAgIH0KIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+IHNlcnZlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4gc2VydmVyOwogCiAgICAgaWYgKHNlcnZlclR5cGUgPT0gInNpbXBsZSIpIHsKIApAQCAtNDUyLDcgKzQ1Miw3IEBACiAKICAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZC1wb29sIikgewogCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcgogICAgICAgICAgID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7CiAKICAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CkBAIC00NjQsOSArNDY0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTWFuYWdlcikpOwogICAgIH0KIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTdGFydE9ic2VydmVyPiBvYnNlcnZlcihuZXcgVFN0YXJ0T2JzZXJ2ZXIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU3RhcnRPYnNlcnZlcj4gb2JzZXJ2ZXIobmV3IFRTdGFydE9ic2VydmVyKTsKICAgICBzZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihvYnNlcnZlcik7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2VydmVyKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2VydmVyKTsKIAogICAgIGNlcnIgPDwgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAiIDw8IHBvcnQgPDwgZW5kbDsKIApAQCAtNDg1LDcgKzQ4NSw3IEBACiAKICAgICBzaXplX3QgdGhyZWFkQ291bnQgPSAwOwogCi0gICAgc2V0PGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gPiBjbGllbnRUaHJlYWRzOworICAgIHNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+IGNsaWVudFRocmVhZHM7CiAKICAgICBpZiAoY2FsbE5hbWUgPT0gImVjaG9Wb2lkIikgewogICAgICAgbG9vcFR5cGUgPSBUX1ZPSUQ7CkBAIC01MDQsMjggKzUwNCwyOCBAQAogICAgIGlmKGNsaWVudFR5cGUgPT0gInJlZ3VsYXIiKSB7CiAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKIAotICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpKTsKLSAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCwgMjA0OCkpOwotICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmZmVyZWRTb2NrZXQpKTsKLSAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0KSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZlcmVkU29ja2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0LCAyMDQ4KSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmZmVyZWRTb2NrZXQpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKIAotICAgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPigKKyAgICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAogICAgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlLCBPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkpKSk7CiAgICAgICB9CiAgICAgfSBlbHNlIGlmKGNsaWVudFR5cGUgPT0gImNvbmN1cnJlbnQiKSB7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gYnVmZmVyZWRTb2NrZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQsIDIwNDgpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChidWZmZXJlZFNvY2tldCkpOwotICAgICAgLy9ib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ29uY3VycmVudENsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNvbmN1cnJlbnRDbGllbnQocHJvdG9jb2wpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZlcmVkU29ja2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0LCAyMDQ4KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZmZlcmVkU29ja2V0KSk7CisgICAgICBhdXRvIHN5bmMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8+KCk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNvbmN1cnJlbnRDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDb25jdXJyZW50Q2xpZW50KHByb3RvY29sLCBzeW5jKSk7CiAgICAgICBzb2NrZXQtPm9wZW4oKTsKICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgewotICAgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPigKKyAgICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAogICAgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlLCBEb250T3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQpKSkpOwogICAgICAgfQogICAgIH0KIAotICAgIGZvciAoc3RkOjpzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CisgICAgZm9yIChhdXRvIHRocmVhZCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKICAgICAgICAgIHRocmVhZCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOwogICAgICAgICAgdGhyZWFkKyspIHsKICAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKQEAgLTU0MCw3ICs1NDAsNyBAQAogCiAgICAgICBjZXJyIDw8ICJMYXVuY2ggIiA8PCBjbGllbnRDb3VudCA8PCAiICIgPDwgY2xpZW50VHlwZSA8PCAiIGNsaWVudCB0aHJlYWRzIiA8PCBlbmRsOwogCi0gICAgICB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgICAgdGltZTAwID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOwogCiAgICAgICBtb25pdG9yLm5vdGlmeUFsbCgpOwogCkBAIC01NDgsNyArNTQ4LDcgQEAKICAgICAgICAgbW9uaXRvci53YWl0KCk7CiAgICAgICB9CiAKLSAgICAgIHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICB0aW1lMDEgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCk7CiAgICAgfQogCiAgICAgaW50NjRfdCBmaXJzdFRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CkBAIC01NTgsMTIgKzU1OCwxMiBAQAogICAgIGludDY0X3QgbWluVGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKICAgICBpbnQ2NF90IG1heFRpbWUgPSAwOwogCi0gICAgZm9yIChzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKKyAgICBmb3IgKGF1dG8gaXggPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CiAgICAgICAgICBpeCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOwogICAgICAgICAgaXgrKykgewogCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+IGNsaWVudAotICAgICAgICAgID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PENsaWVudFRocmVhZD4oKCppeCktPnJ1bm5hYmxlKCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4gY2xpZW50CisgICAgICAgICAgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PENsaWVudFRocmVhZD4oKCppeCktPnJ1bm5hYmxlKCkpOwogCiAgICAgICBpbnQ2NF90IGRlbHRhID0gY2xpZW50LT5fZW5kVGltZSAtIGNsaWVudC0+X3N0YXJ0VGltZTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAgYi90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcAppbmRleCA4ZjE2MWMwLi5lOTRlY2IyIDEwMDY0NAotLS0gYS90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcAorKysgYi90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcApAQCAtMTgsOSArMTgsOCBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CkBAIC0yOSwxNCArMjgsMTMgQEAKICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L1RMb2dnaW5nLmg+CiAKICNpbmNsdWRlICJTZXJ2aWNlLmgiCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CkBAIC02OSw3ICs2Nyw3IEBACiAKIGNsYXNzIFNlcnZlciA6IHB1YmxpYyBTZXJ2aWNlSWYgewogcHVibGljOgotICBTZXJ2ZXIoKSB7fQorICBTZXJ2ZXIoKSA9IGRlZmF1bHQ7CiAKICAgdm9pZCBjb3VudChjb25zdCBjaGFyKiBtZXRob2QpIHsKICAgICBHdWFyZCBtKGxvY2tfKTsKQEAgLTc3LDcgKzc1LDcgQEAKICAgICBjb3VudHNfW21ldGhvZF0gPSArK2N0OwogICB9CiAKLSAgdm9pZCBlY2hvVm9pZCgpIHsKKyAgdm9pZCBlY2hvVm9pZCgpIG92ZXJyaWRlIHsKICAgICBjb3VudCgiZWNob1ZvaWQiKTsKICAgICAvLyBTbGVlcCB0byBzaW11bGF0ZSB3b3JrCiAgICAgVEhSSUZUX1NMRUVQX1VTRUMoMSk7CkBAIC04OSwxOCArODcsMTggQEAKICAgICByZXR1cm4gY291bnRzXzsKICAgfQogCi0gIGludDhfdCBlY2hvQnl0ZShjb25zdCBpbnQ4X3QgYXJnKSB7IHJldHVybiBhcmc7IH0KLSAgaW50MzJfdCBlY2hvSTMyKGNvbnN0IGludDMyX3QgYXJnKSB7IHJldHVybiBhcmc7IH0KLSAgaW50NjRfdCBlY2hvSTY0KGNvbnN0IGludDY0X3QgYXJnKSB7IHJldHVybiBhcmc7IH0KLSAgdm9pZCBlY2hvU3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcmIGFyZykgeworICBpbnQ4X3QgZWNob0J5dGUoY29uc3QgaW50OF90IGFyZykgb3ZlcnJpZGUgeyByZXR1cm4gYXJnOyB9CisgIGludDMyX3QgZWNob0kzMihjb25zdCBpbnQzMl90IGFyZykgb3ZlcnJpZGUgeyByZXR1cm4gYXJnOyB9CisgIGludDY0X3QgZWNob0k2NChjb25zdCBpbnQ2NF90IGFyZykgb3ZlcnJpZGUgeyByZXR1cm4gYXJnOyB9CisgIHZvaWQgZWNob1N0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nJiBhcmcpIG92ZXJyaWRlIHsKICAgICBpZiAoYXJnICE9ICJoZWxsbyIpIHsKICAgICAgIFRfRVJST1JfQUJPUlQoIldST05HIFNUUklORyAoJXMpISEhISIsIGFyZy5jX3N0cigpKTsKICAgICB9CiAgICAgb3V0ID0gYXJnOwogICB9Ci0gIHZvaWQgZWNob0xpc3QodmVjdG9yPGludDhfdD4mIG91dCwgY29uc3QgdmVjdG9yPGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KLSAgdm9pZCBlY2hvU2V0KHNldDxpbnQ4X3Q+JiBvdXQsIGNvbnN0IHNldDxpbnQ4X3Q+JiBhcmcpIHsgb3V0ID0gYXJnOyB9Ci0gIHZvaWQgZWNob01hcChtYXA8aW50OF90LCBpbnQ4X3Q+JiBvdXQsIGNvbnN0IG1hcDxpbnQ4X3QsIGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KKyAgdm9pZCBlY2hvTGlzdCh2ZWN0b3I8aW50OF90PiYgb3V0LCBjb25zdCB2ZWN0b3I8aW50OF90PiYgYXJnKSBvdmVycmlkZSB7IG91dCA9IGFyZzsgfQorICB2b2lkIGVjaG9TZXQoc2V0PGludDhfdD4mIG91dCwgY29uc3Qgc2V0PGludDhfdD4mIGFyZykgb3ZlcnJpZGUgeyBvdXQgPSBhcmc7IH0KKyAgdm9pZCBlY2hvTWFwKG1hcDxpbnQ4X3QsIGludDhfdD4mIG91dCwgY29uc3QgbWFwPGludDhfdCwgaW50OF90PiYgYXJnKSBvdmVycmlkZSB7IG91dCA9IGFyZzsgfQogCiBwcml2YXRlOgogICBjb3VudF9tYXAgY291bnRzXzsKQEAgLTEwOSw4ICsxMDcsOCBAQAogCiBjbGFzcyBDbGllbnRUaHJlYWQgOiBwdWJsaWMgUnVubmFibGUgewogcHVibGljOgotICBDbGllbnRUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gY2xpZW50LAorICBDbGllbnRUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBjbGllbnQsCiAgICAgICAgICAgICAgICBNb25pdG9yJiBtb25pdG9yLAogICAgICAgICAgICAgICAgc2l6ZV90JiB3b3JrZXJDb3VudCwKICAgICAgICAgICAgICAgIHNpemVfdCBsb29wQ291bnQsCkBAIC0xMjIsNyArMTIwLDcgQEAKICAgICAgIF9sb29wQ291bnQobG9vcENvdW50KSwKICAgICAgIF9sb29wVHlwZShsb29wVHlwZSkge30KIAotICB2b2lkIHJ1bigpIHsKKyAgdm9pZCBydW4oKSBvdmVycmlkZSB7CiAKICAgICAvLyBXYWl0IGZvciBhbGwgd29ya2VyIHRocmVhZHMgdG8gc3RhcnQKIApAQCAtMTMzLDcgKzEzMSw3IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgX3N0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgX3N0YXJ0VGltZSA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKIAogICAgIF90cmFuc3BvcnQtPm9wZW4oKTsKIApAQCAtMTU4LDcgKzE1Niw3IEBACiAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgX2VuZFRpbWUgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCk7CiAKICAgICBfdHJhbnNwb3J0LT5jbG9zZSgpOwogCkBAIC0yMjEsOCArMjE5LDggQEAKICAgICB9CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OwotICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBfY2xpZW50OworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gX3RyYW5zcG9ydDsKKyAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IF9jbGllbnQ7CiAgIE1vbml0b3ImIF9tb25pdG9yOwogICBzaXplX3QmIF93b3JrZXJDb3VudDsKICAgc2l6ZV90IF9sb29wQ291bnQ7CkBAIC0zNDQsMjQgKzM0MiwyNCBAQAogICAgIGNlcnIgPDwgdXNhZ2Uuc3RyKCk7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKLSAgICAgID0gYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4obmV3IFRocmVhZEZhY3RvcnkoKSk7CiAKICAgLy8gRGlzcGF0Y2hlcgotICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CiAKICAgaWYgKHJlcGxheVJlcXVlc3RzKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CiAKICAgICAvLyBUcmFuc3BvcnRzCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNlZWtUb0VuZCgpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCiAgICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIGZpbGVUcmFuc3BvcnQpOwogCkBAIC0zNzEsNDUgKzM2OSw1MSBAQAogCiAgIGlmIChydW5TZXJ2ZXIpIHsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCiAgICAgLy8gVHJhbnNwb3J0IEZhY3RvcnkKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3Rvcnk7CiAKICAgICBpZiAobG9nUmVxdWVzdHMpIHsKICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGxvZyBmaWxlCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKICAgICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOwogICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0TWF4RXZlbnRTaXplKDEwMjQgKiAxNik7CiAKICAgICAgIHRyYW5zcG9ydEZhY3RvcnkKLSAgICAgICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShmaWxlVHJhbnNwb3J0KSk7CisgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGZpbGVUcmFuc3BvcnQpKTsKICAgICB9CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gc2VydmVyVGhyZWFkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDI7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBuYlNvY2tldDE7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBuYlNvY2tldDI7CiAKICAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgewogCi0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCi0gICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQpKSk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAotICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0ICsgMSkpKTsKKyAgICAgIG5iU29ja2V0MS5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPigKKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQxKSkpOworICAgICAgbmJTb2NrZXQyLnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0ICsgMSkpOworICAgICAgc2VydmVyVGhyZWFkMiA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0MikpKTsKIAogICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7CiAKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyCiAgICAgICAgICAgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKIAogICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKICAgICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCi0gICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQsIHRocmVhZE1hbmFnZXIpKSk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAotICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0ICsgMSwgdGhyZWFkTWFuYWdlcikpKTsKKyAgICAgIG5iU29ja2V0MS5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPigKKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQxLCB0aHJlYWRNYW5hZ2VyKSkpOworICAgICAgbmJTb2NrZXQyLnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0ICsgMSkpOworICAgICAgc2VydmVyVGhyZWFkMiA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0MiwgdGhyZWFkTWFuYWdlcikpKTsKICAgICB9CiAKICAgICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiA8PCBwb3J0IDw8ICIgYW5kICIgPDwgKHBvcnQgKyAxKSA8PCBlbmRsOwpAQCAtNDMxLDcgKzQzNSw3IEBACiAKICAgICBzaXplX3QgdGhyZWFkQ291bnQgPSAwOwogCi0gICAgc2V0PGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gPiBjbGllbnRUaHJlYWRzOworICAgIHNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+IGNsaWVudFRocmVhZHM7CiAKICAgICBpZiAoY2FsbE5hbWUgPT0gImVjaG9Wb2lkIikgewogICAgICAgbG9vcFR5cGUgPSBUX1ZPSUQ7CkBAIC00NDksMTYgKzQ1MywxNiBAQAogCiAgICAgZm9yICh1aW50MzJfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKIAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0ICsgKGl4ICUgMikpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IGZyYW1lZFNvY2tldChuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChmcmFtZWRTb2NrZXQpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQgKyAoaXggJSAyKSkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IGZyYW1lZFNvY2tldChuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woZnJhbWVkU29ja2V0KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOwogCi0gICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPigKKyAgICAgIGNsaWVudFRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPigKICAgICAgICAgICBuZXcgQ2xpZW50VGhyZWFkKHNvY2tldCwgc2VydmljZUNsaWVudCwgbW9uaXRvciwgdGhyZWFkQ291bnQsIGxvb3BDb3VudCwgbG9vcFR5cGUpKSkpOwogICAgIH0KIAotICAgIGZvciAoc3RkOjpzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CisgICAgZm9yIChhdXRvIHRocmVhZCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKICAgICAgICAgIHRocmVhZCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOwogICAgICAgICAgdGhyZWFkKyspIHsKICAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKQEAgLTQ3Myw3ICs0NzcsNyBAQAogCiAgICAgICBjZXJyIDw8ICJMYXVuY2ggIiA8PCBjbGllbnRDb3VudCA8PCAiIGNsaWVudCB0aHJlYWRzIiA8PCBlbmRsOwogCi0gICAgICB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgICAgdGltZTAwID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOwogCiAgICAgICBtb25pdG9yLm5vdGlmeUFsbCgpOwogCkBAIC00ODEsNyArNDg1LDcgQEAKICAgICAgICAgbW9uaXRvci53YWl0KCk7CiAgICAgICB9CiAKLSAgICAgIHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICB0aW1lMDEgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCk7CiAgICAgfQogCiAgICAgaW50NjRfdCBmaXJzdFRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CkBAIC00OTEsMTIgKzQ5NSwxMiBAQAogICAgIGludDY0X3QgbWluVGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKICAgICBpbnQ2NF90IG1heFRpbWUgPSAwOwogCi0gICAgZm9yIChzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKKyAgICBmb3IgKGF1dG8gaXggPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CiAgICAgICAgICBpeCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOwogICAgICAgICAgaXgrKykgewogCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+IGNsaWVudAotICAgICAgICAgID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PENsaWVudFRocmVhZD4oKCppeCktPnJ1bm5hYmxlKCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4gY2xpZW50CisgICAgICAgICAgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PENsaWVudFRocmVhZD4oKCppeCktPnJ1bm5hYmxlKCkpOwogCiAgICAgICBpbnQ2NF90IGRlbHRhID0gY2xpZW50LT5fZW5kVGltZSAtIGNsaWVudC0+X3N0YXJ0VGltZTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwIGIvdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwCmluZGV4IDdjNDI1YTkuLmM0MTQ2Y2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcAorKysgYi90ZXN0L2NwcC9zcmMvVGVzdENsaWVudC5jcHAKQEAgLTEsNCArMSw0IEBACi0vKgor77u/LyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtMTcsOTggKzE3LDE4MyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPGlvcz4KICNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPiAvLyA8ZXZlbnQuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy5ocHA+CisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Ym9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+Ci0jaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4KKyNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3JhbmRvbS9yYW5kb21fZGV2aWNlLmhwcD4KICNpZiBfV0lOMzIKICNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgogI2VuZGlmCiAKKyNpbmNsdWRlICJTZWNvbmRTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiVGhyaWZ0VGVzdC5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOwogCi0vLyBMZW5ndGggb2YgYXJndlswXSAtIExlbmd0aCBvZiBzY3JpcHQgZGlyCi0jZGVmaW5lIEVYRUNVVEFCTEVfRklMRV9OQU1FX0xFTkdUSCAxOQorLy8KKy8vIEEgcGVkYW50aWMgcHJvdG9jb2wgdGhhdCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoZSByZXNwb25zZSBzZXF1ZW5jZSBJRAorLy8gaXMgdGhlIHNhbWUgYXMgdGhlIHNlbnQgc2VxdWVuY2UgSUQuICBsaWIvY3BwIGFsd2F5cyBzZW5kcyB6ZXJvIGZvcgorLy8gc3luY2hyb25vdXMgY2xpZW50cywgc28gdGhpcyBidW1wcyB0aGUgbnVtYmVyIHRvIG1ha2Ugc3VyZSBpdCBnZXRzCisvLyByZXR1cm5lZCBwcm9wZXJseSBmcm9tIHRoZSByZW1vdGUgc2VydmVyLiAgQW55IHNlcnZlciB0aGF0IGRvZXMgbm90CisvLyByZXNwb25kIHdpdGggdGhlIHNhbWUgc2VxdWVuY2UgbnVtYmVyIGlzIHZpb2xhdGluZyB0aGUgc2VxdWVuY2UgSUQKKy8vIGFncmVlbWVudCBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyLgorLy8KKwordGVtcGxhdGU8dHlwZW5hbWUgUHJvdG8+CitjbGFzcyBUUGVkYW50aWNQcm90b2NvbCA6IHB1YmxpYyBQcm90byAKK3sKKyAgICBwdWJsaWM6CisgICAgICAgIFRQZWRhbnRpY1Byb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0KQorICAgICAgICAgIDogUHJvdG8odHJhbnNwb3J0KSwgbV9sYXN0X3NlcWlkKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkgLSAxMCkgeyB9CisKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGluX3NlcWlkKSBvdmVycmlkZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHNlcWlkID0gaW5fc2VxaWQ7CisgICAgICAgICAgICBpZiAoIXNlcWlkKSB7IC8vIHRoaXMgaXMgdHlwaWNhbCBmb3Igbm9ybWFsIGNwcCBnZW5lcmF0ZWQgY29kZQorICAgICAgICAgICAgICAgIHNlcWlkID0gKyttX2xhc3Rfc2VxaWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBQcm90bzo6d3JpdGVNZXNzYWdlQmVnaW5fdmlydChuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIG92ZXJyaWRlCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlc3VsdCA9IFByb3RvOjpyZWFkTWVzc2FnZUJlZ2luX3ZpcnQobmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgICAgICAgICAgIGlmIChzZXFpZCAhPSBtX2xhc3Rfc2VxaWQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgICAgICBzcyA8PCAiRVJST1I6IHNlbmQgcmVxdWVzdCB3aXRoIHNlcWlkICIgPDwgbV9sYXN0X3NlcWlkIDw8ICIgYW5kIGdvdCByZXBseSB3aXRoIHNlcWlkICIgPDwgc2VxaWQ7CisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcihzcy5zdHIoKSk7CisgICAgICAgICAgICB9IC8qIGVsc2UgeworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAidmVyaWZpZWQgc2VxaWQgIiA8PCBtX2xhc3Rfc2VxaWQgPDwgIiByb3VuZCB0cmlwIE9LIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9ICovCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBpbnQzMl90IG1fbGFzdF9zZXFpZDsKK307CiAKIC8vIEN1cnJlbnQgdGltZSwgbWljcm9zZWNvbmRzIHNpbmNlIHRoZSBlcG9jaAogdWludDY0X3Qgbm93KCkgewogICBpbnQ2NF90IHJldDsKICAgc3RydWN0IHRpbWV2YWwgdHY7CiAKLSAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdHYsIE5VTEwpOworICBUSFJJRlRfR0VUVElNRU9GREFZKCZ0diwgbnVsbHB0cik7CiAgIHJldCA9IHR2LnR2X3NlYzsKICAgcmV0ID0gcmV0ICogMTAwMCAqIDEwMDAgKyB0di50dl91c2VjOwogICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0U3RyaW5nX2NsaWVudFJldHVybihjb25zdCBjaGFyKiBob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9iYXNlKiBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSogcHJvdG9jb2xGYWN0b3J5LAorc3RhdGljIHZvaWQgdGVzdFN0cmluZ19jbGllbnRSZXR1cm4oZXZlbnRfYmFzZSogYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZXN0TnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUZXN0Q29iQ2xpZW50KiBjbGllbnQpIHsKLSAgKHZvaWQpaG9zdDsKLSAgKHZvaWQpcG9ydDsKLSAgKHZvaWQpcHJvdG9jb2xGYWN0b3J5OwogICB0cnkgewogICAgIHN0cmluZyBzOwogICAgIGNsaWVudC0+cmVjdl90ZXN0U3RyaW5nKHMpOwotICAgIGNvdXQgPDwgInRlc3RTdHJpbmc6ICIgPDwgcyA8PCBlbmRsOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAidGVzdCIgPDwgdGVzdE5yOworICAgIGNvbnN0IGJvb2wgb2sgPSAocyA9PSBvcy5zdHIoKSk7CisgICAgY291dCA8PCAidGVzdFN0cmluZzogIiA8PCBzIDw8ICIgIiA8PCAoKG9rKSA/ICJvayIgOiAiZmFpbGVkIikgPDwgZW5kbDsKICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgZXhuKSB7CiAgICAgY291dCA8PCAiRXJyb3I6ICIgPDwgZXhuLndoYXQoKSA8PCBlbmRsOwogICB9CiAKLSAgZXZlbnRfYmFzZV9sb29wYnJlYWsoYmFzZSk7IC8vIGVuZCB0ZXN0CisgIGlmICh0ZXN0TnIgPT0gOSkKKyAgICBldmVudF9iYXNlX2xvb3BicmVhayhiYXNlKTsgLy8gZW5kIHRlc3QKIH0KIAotc3RhdGljIHZvaWQgdGVzdFZvaWRfY2xpZW50UmV0dXJuKGNvbnN0IGNoYXIqIGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfYmFzZSogYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5KiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VGVzdENvYkNsaWVudCogY2xpZW50KSB7CitzdGF0aWMgdm9pZCB0ZXN0Vm9pZF9jbGllbnRSZXR1cm4oZXZlbnRfYmFzZSogYmFzZSwgVGhyaWZ0VGVzdENvYkNsaWVudCogY2xpZW50KSB7CiAgIHRyeSB7CiAgICAgY2xpZW50LT5yZWN2X3Rlc3RWb2lkKCk7CiAgICAgY291dCA8PCAidGVzdFZvaWQiIDw8IGVuZGw7CiAKLSAgICAvLyBuZXh0IHRlc3QKLSAgICBkZWxldGUgY2xpZW50OwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0NoYW5uZWw+IGNoYW5uZWwobmV3IFRFdmh0dHBDbGllbnRDaGFubmVsKGhvc3QsICIvIiwgaG9zdCwgcG9ydCwgYmFzZSkpOwotICAgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0Q29iQ2xpZW50KGNoYW5uZWwsIHByb3RvY29sRmFjdG9yeSk7Ci0gICAgY2xpZW50LT50ZXN0U3RyaW5nKHRjeHg6OmJpbmQodGVzdFN0cmluZ19jbGllbnRSZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjeHg6OnBsYWNlaG9sZGVyczo6XzEpLAotICAgICAgICAgICAgICAgICAgICAgICAiVGVzdCIpOworICAgIGZvciAoaW50IHRlc3ROciA9IDA7IHRlc3ROciA8IDEwOyArK3Rlc3ROcikgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgInRlc3QiIDw8IHRlc3ROcjsKKyAgICAgIGNsaWVudC0+dGVzdFN0cmluZyhzdGQ6OmJpbmQodGVzdFN0cmluZ19jbGllbnRSZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdE5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RyKCkpOworICAgIH0KICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgZXhuKSB7CiAgICAgY291dCA8PCAiRXJyb3I6ICIgPDwgZXhuLndoYXQoKSA8PCBlbmRsOwogICB9CiB9CiAKKy8vIFdvcmthcm91bmQgZm9yIGFic2Vuc2Ugb2YgQysrMTEgImF1dG8iIGtleXdvcmQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgcHJpbnRfZXEoVCBleHBlY3RlZCwgVCBhY3R1YWwpIHsKKyAgY291dCA8PCAiKCIgPDwgYWN0dWFsIDw8ICIpIiA8PCBlbmRsOworICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB7CisgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICIgYnV0IGdvdDogIiA8PCBhY3R1YWwgPDwgZW5kbDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgQkFTRVRZUEVfSURFTlRJVFlfVEVTVChmdW5jLCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY291dCA8PCAjZnVuYyAiKCIgPDwgdmFsdWUgPDwgIikgPSAiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIXByaW50X2VxKHZhbHVlLCB0ZXN0Q2xpZW50LmZ1bmModmFsdWUpKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aHJvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBjYXRjaCAoZXhjZXB0aW9uICYgZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitpbnQgYmluYXJ5X3Rlc3QoVGhyaWZ0VGVzdENsaWVudCYgdGVzdENsaWVudCwgc3RyaW5nOjpzaXplX3R5cGUgc2l6KTsKKworQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIGludCBFUlJfQkFTRVRZUEVTID0gMTsKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX1NUUlVDVFMgPSAyOworQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIGludCBFUlJfQ09OVEFJTkVSUyA9IDQ7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9FWENFUFRJT05TID0gODsKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX1VOS05PV04gPSA2NDsKKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIHN0cmluZyBmaWxlX3BhdGggPSBib29zdDo6ZmlsZXN5c3RlbTo6c3lzdGVtX2NvbXBsZXRlKGFyZ3ZbMF0pLnN0cmluZygpOwotICBzdHJpbmcgZGlyX3BhdGggPSBmaWxlX3BhdGguc3Vic3RyKDAsIGZpbGVfcGF0aC5zaXplKCkgLSBFWEVDVVRBQkxFX0ZJTEVfTkFNRV9MRU5HVEgpOworICBjb3V0LnByZWNpc2lvbigxOSk7CisKKyAgc3RyaW5nIHRlc3REaXIgID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnN5c3RlbV9jb21wbGV0ZShhcmd2WzBdKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5zdHJpbmcoKTsKKyAgc3RyaW5nIGNhUGF0aCAgID0gdGVzdERpciArICIva2V5cy9DQS5wZW0iOworICBzdHJpbmcgY2VydFBhdGggPSB0ZXN0RGlyICsgIi9rZXlzL2NsaWVudC5jcnQiOworICBzdHJpbmcga2V5UGF0aCAgPSB0ZXN0RGlyICsgIi9rZXlzL2NsaWVudC5rZXkiOworCiAjaWYgX1dJTjMyCiAgIHRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOwogI2VuZGlmCkBAIC0xMTYsNDcgKzIwMSw2NSBAQAogICBpbnQgcG9ydCA9IDkwOTA7CiAgIGludCBudW1UZXN0cyA9IDE7CiAgIGJvb2wgc3NsID0gZmFsc2U7CisgIGJvb2wgemxpYiA9IGZhbHNlOwogICBzdHJpbmcgdHJhbnNwb3J0X3R5cGUgPSAiYnVmZmVyZWQiOwogICBzdHJpbmcgcHJvdG9jb2xfdHlwZSA9ICJiaW5hcnkiOwogICBzdHJpbmcgZG9tYWluX3NvY2tldCA9ICIiOworICBib29sIGFic3RyYWN0X25hbWVzcGFjZSA9IGZhbHNlOwogICBib29sIG5vaW5zYW5lID0gZmFsc2U7CiAKKyAgaW50IHJldHVybl9jb2RlID0gMDsKKwogICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjpvcHRpb25zX2Rlc2NyaXB0aW9uIGRlc2MoIkFsbG93ZWQgb3B0aW9ucyIpOwotICBkZXNjLmFkZF9vcHRpb25zKCkoImhlbHAsaCIsCi0gICAgICAgICAgICAgICAgICAgICAicHJvZHVjZSBoZWxwIG1lc3NhZ2UiKSgiaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZob3N0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ZGVmYXVsdF92YWx1ZShob3N0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3N0IHRvIGNvbm5lY3QiKSgicG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnQpLT5kZWZhdWx0X3ZhbHVlKHBvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3J0IG51bWJlciB0byBjb25uZWN0IikoCi0gICAgICAiZG9tYWluLXNvY2tldCIsCi0gICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZkb21haW5fc29ja2V0KS0+ZGVmYXVsdF92YWx1ZShkb21haW5fc29ja2V0KSwKLSAgICAgICJEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLCBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQiKSgKLSAgICAgICJ0cmFuc3BvcnQiLAotICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmdHJhbnNwb3J0X3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHRyYW5zcG9ydF90eXBlKSwKLSAgICAgICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cCIpKAotICAgICAgInByb3RvY29sIiwKLSAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnByb3RvY29sX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHByb3RvY29sX3R5cGUpLAotICAgICAgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24iKSgic3NsIiwgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikoCi0gICAgICAidGVzdGxvb3BzLG4iLAotICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmbnVtVGVzdHMpLT5kZWZhdWx0X3ZhbHVlKG51bVRlc3RzKSwKLSAgICAgICJOdW1iZXIgb2YgVGVzdHMiKSgibm9pbnNhbmUiLCAiRG8gbm90IHJ1biBpbnNhbml0eSB0ZXN0Iik7CisgIGRlc2MuYWRkX29wdGlvbnMoKQorICAgICAgKCJoZWxwLGgiLCAicHJvZHVjZSBoZWxwIG1lc3NhZ2UiKQorICAgICAgKCJob3N0IiwKKyAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZob3N0KS0+ZGVmYXVsdF92YWx1ZShob3N0KSwKKyAgICAgICAgICAiSG9zdCB0byBjb25uZWN0IikKKyAgICAgICgicG9ydCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmcG9ydCktPmRlZmF1bHRfdmFsdWUocG9ydCksCisgICAgICAgICAgIlBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKQorICAgICAgKCJkb21haW4tc29ja2V0IiwKKyAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZkb21haW5fc29ja2V0KS0+ZGVmYXVsdF92YWx1ZShkb21haW5fc29ja2V0KSwKKyAgICAgICAgICAiRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSwgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0IikKKyAgICAgICgiYWJzdHJhY3QtbmFtZXNwYWNlIiwKKyAgICAgICAgICAiTG9vayBmb3IgdGhlIGRvbWFpbiBzb2NrZXQgaW4gdGhlIEFic3RyYWN0IE5hbWVzcGFjZSIKKyAgICAgICAgICAiIChubyBjb25uZWN0aW9uIHdpdGggZmlsZXN5c3RlbSBwYXRobmFtZXMpIikKKyAgICAgICgidHJhbnNwb3J0IiwKKyAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZ0cmFuc3BvcnRfdHlwZSktPmRlZmF1bHRfdmFsdWUodHJhbnNwb3J0X3R5cGUpLAorICAgICAgICAgICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cCwgemxpYiIpCisgICAgICAoInByb3RvY29sIiwKKyAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZwcm90b2NvbF90eXBlKS0+ZGVmYXVsdF92YWx1ZShwcm90b2NvbF90eXBlKSwKKyAgICAgICAgICAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwgaGVhZGVyLCBqc29uLCBtdWx0aSwgbXVsdGljLCBtdWx0aWgsIG11bHRpaiIpCisgICAgICAoInNzbCIsCisgICAgICAgICAgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKKyAgICAgICgiemxpYiIsCisgICAgICAgICAgIldyYXAgVHJhbnNwb3J0IHdpdGggWmxpYiIpCisgICAgICAoInRlc3Rsb29wcyxuIiwKKyAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxpbnQ+KCZudW1UZXN0cyktPmRlZmF1bHRfdmFsdWUobnVtVGVzdHMpLAorICAgICAgICAgICJOdW1iZXIgb2YgVGVzdHMiKQorICAgICAgKCJub2luc2FuZSIsCisgICAgICAgICAgIkRvIG5vdCBydW4gaW5zYW5pdHkgdGVzdCIpOwogCiAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhcmlhYmxlc19tYXAgdm07CiAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnN0b3JlKGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnBhcnNlX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBkZXNjKSwgdm0pOwogICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjpub3RpZnkodm0pOwogCiAgIGlmICh2bS5jb3VudCgiaGVscCIpKSB7Ci0gICAgY291dCA8PCBkZXNjIDw8ICJcbiI7Ci0gICAgcmV0dXJuIDE7CisgICAgY291dCA8PCBkZXNjIDw8IGVuZGw7CisgICAgcmV0dXJuIEVSUl9VTktOT1dOOwogICB9CiAKICAgdHJ5IHsKICAgICBpZiAoIXByb3RvY29sX3R5cGUuZW1wdHkoKSkgewogICAgICAgaWYgKHByb3RvY29sX3R5cGUgPT0gImJpbmFyeSIpIHsKICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiaGVhZGVyIikgewogICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aSIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWgiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpaiIpIHsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gcHJvdG9jb2wgdHlwZSAiICsgcHJvdG9jb2xfdHlwZSk7CiAgICAgICB9CkBAIC0xNjcsNzAgKzI3MCwxMDcgQEAKICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImZyYW1lZCIpIHsKICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiKSB7CiAgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJldmh0dHAiKSB7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJ6bGliIikgeworICAgICAgICAvLyBjcm9zc3Rlc3Qgd2lsbCBwYXNzIHpsaWIgYXMgYSB0cmFuc3BvcnQgYW5kIGFzIGEgZmxhZyByaWdodCBub3cuLgogICAgICAgfSBlbHNlIHsKICAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biB0cmFuc3BvcnQgdHlwZSAiICsgdHJhbnNwb3J0X3R5cGUpOwogICAgICAgfQogICAgIH0KIAotICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICB9IGNhdGNoIChleGNlcHRpb24mIGUpIHsKICAgICBjZXJyIDw8IGUud2hhdCgpIDw8IGVuZGw7Ci0gICAgY291dCA8PCBkZXNjIDw8ICJcbiI7Ci0gICAgcmV0dXJuIDE7CisgICAgY291dCA8PCBkZXNjIDw8IGVuZGw7CisgICAgcmV0dXJuIEVSUl9VTktOT1dOOwogICB9CiAKICAgaWYgKHZtLmNvdW50KCJzc2wiKSkgewogICAgIHNzbCA9IHRydWU7CiAgIH0KIAorICBpZiAodm0uY291bnQoInpsaWIiKSkgeworICAgIHpsaWIgPSB0cnVlOworICB9CisKKyAgaWYgKHZtLmNvdW50KCJhYnN0cmFjdC1uYW1lc3BhY2UiKSkgeworICAgIGFic3RyYWN0X25hbWVzcGFjZSA9IHRydWU7CisgIH0KKwogICBpZiAodm0uY291bnQoIm5vaW5zYW5lIikpIHsKICAgICBub2luc2FuZSA9IHRydWU7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2w7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0OwotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeTsKKyAgLy8gVEhSSUZULTQxNjQ6IFRoZSBmYWN0b3J5IE1VU1Qgb3V0bGl2ZSBhbnkgc29ja2V0cyBpdCBjcmVhdGVzIGZvciBjb3JyZWN0IGJlaGF2aW9yIQorICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3Rvcnk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbDI7ICAvLyBTZWNvbmRTZXJ2aWNlIGZvciBtdWx0aXBsZXhlZAogCiAgIGlmIChzc2wpIHsKLSAgICBmYWN0b3J5ID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+KG5ldyBUU1NMU29ja2V0RmFjdG9yeSgpKTsKKyAgICBjb3V0IDw8ICJDbGllbnQgQ2VydGlmaWNhdGUgRmlsZTogIiA8PCBjZXJ0UGF0aCA8PCBlbmRsOworICAgIGNvdXQgPDwgIkNsaWVudCBLZXkgICAgICAgICBGaWxlOiAiIDw8IGtleVBhdGggPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJDQSAgICAgICAgICAgICAgICAgRmlsZTogIiA8PCBjYVBhdGggPDwgZW5kbDsKKworICAgIGZhY3RvcnkgPSBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+KG5ldyBUU1NMU29ja2V0RmFjdG9yeSgpKTsKICAgICBmYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKLSAgICBmYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcygoZGlyX3BhdGggKyAiLi4va2V5cy9DQS5wZW0iKS5jX3N0cigpKTsKKyAgICBmYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjYVBhdGguY19zdHIoKSk7CisgICAgZmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRQYXRoLmNfc3RyKCkpOworICAgIGZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGtleVBhdGguY19zdHIoKSk7CiAgICAgZmFjdG9yeS0+YXV0aGVudGljYXRlKHRydWUpOwogICAgIHNvY2tldCA9IGZhY3RvcnktPmNyZWF0ZVNvY2tldChob3N0LCBwb3J0KTsKICAgfSBlbHNlIHsKICAgICBpZiAoZG9tYWluX3NvY2tldCAhPSAiIikgewotICAgICAgc29ja2V0ID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoZG9tYWluX3NvY2tldCkpOworICAgICAgaWYgKGFic3RyYWN0X25hbWVzcGFjZSkgeworICAgICAgICBzdGQ6OnN0cmluZyBhYnN0cmFjdF9zb2NrZXQoIlwwIiwgMSk7CisgICAgICAgIGFic3RyYWN0X3NvY2tldCArPSBkb21haW5fc29ja2V0OworICAgICAgICBzb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoYWJzdHJhY3Rfc29ja2V0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoZG9tYWluX3NvY2tldCkpOworICAgICAgfQogICAgICAgcG9ydCA9IDA7CiAgICAgfSBlbHNlIHsKLSAgICAgIHNvY2tldCA9IGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpKTsKKyAgICAgIHNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChob3N0LCBwb3J0KSk7CiAgICAgfQogICB9CiAKICAgaWYgKHRyYW5zcG9ydF90eXBlLmNvbXBhcmUoImh0dHAiKSA9PSAwKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaHR0cFNvY2tldChuZXcgVEh0dHBDbGllbnQoc29ja2V0LCBob3N0LCAiL3NlcnZpY2UiKSk7Ci0gICAgdHJhbnNwb3J0ID0gaHR0cFNvY2tldDsKKyAgICB0cmFuc3BvcnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRIdHRwQ2xpZW50Pihzb2NrZXQsIGhvc3QsICIvc2VydmljZSIpOwogICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlLmNvbXBhcmUoImZyYW1lZCIpID09IDApIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiBmcmFtZWRTb2NrZXQobmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KSk7Ci0gICAgdHJhbnNwb3J0ID0gZnJhbWVkU29ja2V0OworICAgIHRyYW5zcG9ydCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEZyYW1lZFRyYW5zcG9ydD4oc29ja2V0KTsKICAgfSBlbHNlIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZlcmVkU29ja2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7Ci0gICAgdHJhbnNwb3J0ID0gYnVmZmVyZWRTb2NrZXQ7CisgICAgdHJhbnNwb3J0ID0gc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnQ+KHNvY2tldCk7CiAgIH0KIAotICBpZiAocHJvdG9jb2xfdHlwZS5jb21wYXJlKCJqc29uIikgPT0gMCkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ganNvblByb3RvY29sKG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCkpOwotICAgIHByb3RvY29sID0ganNvblByb3RvY29sOwotICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuY29tcGFyZSgiY29tcGFjdCIpID09IDApIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGNvbXBhY3RQcm90b2NvbChuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpKTsKLSAgICBwcm90b2NvbCA9IGNvbXBhY3RQcm90b2NvbDsKKyAgaWYgKHpsaWIpIHsKKyAgICB0cmFuc3BvcnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRabGliVHJhbnNwb3J0Pih0cmFuc3BvcnQpOworICB9CisKKyAgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpaiIpIHsKKyAgICB0eXBlZGVmIFRQZWRhbnRpY1Byb3RvY29sPFRKU09OUHJvdG9jb2w+IFRQZWRhbnRpY0pTT05Qcm90b2NvbDsKKyAgICBwcm90b2NvbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VFBlZGFudGljSlNPTlByb3RvY29sPih0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImNvbXBhY3QiIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpYyIpIHsKKyAgICB0eXBlZGVmIFRQZWRhbnRpY1Byb3RvY29sPFRDb21wYWN0UHJvdG9jb2w+IFRQZWRhbnRpY0NvbXBhY3RQcm90b2NvbDsKKyAgICBwcm90b2NvbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VFBlZGFudGljQ29tcGFjdFByb3RvY29sPih0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgIHR5cGVkZWYgVFBlZGFudGljUHJvdG9jb2w8VEhlYWRlclByb3RvY29sPiBUUGVkYW50aWNIZWFkZXJQcm90b2NvbDsKKyAgICBwcm90b2NvbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VFBlZGFudGljSGVhZGVyUHJvdG9jb2w+KHRyYW5zcG9ydCk7CiAgIH0gZWxzZSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOwotICAgIHByb3RvY29sID0gYmluYXJ5UHJvdG9jb2w7CisgICAgdHlwZWRlZiBUUGVkYW50aWNQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2w+IFRQZWRhbnRpY0JpbmFyeVByb3RvY29sOworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUUGVkYW50aWNCaW5hcnlQcm90b2NvbD4odHJhbnNwb3J0KTsKKyAgfQorCisgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgICBwcm90b2NvbDIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRNdWx0aXBsZXhlZFByb3RvY29sPihwcm90b2NvbCwgIlNlY29uZFNlcnZpY2UiKTsKKyAgICAvLyB3ZSBkb24ndCBuZWVkIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgcHJvdG9jb2wgYW55IG1vcmUsIHNvLi4uCisgICAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRNdWx0aXBsZXhlZFByb3RvY29sPihwcm90b2NvbCwgIlRocmlmdFRlc3QiKTsKICAgfQogCiAgIC8vIENvbm5lY3Rpb24gaW5mbwotICBjb3V0IDw8ICJDb25uZWN0aW5nICgiIDw8IHRyYW5zcG9ydF90eXBlIDw8ICIvIiA8PCBwcm90b2NvbF90eXBlIDw8ICIpIHRvOiAiIDw8IGRvbWFpbl9zb2NrZXQ7CisgIGNvdXQgPDwgIkNvbm5lY3RpbmcgKCIgPDwgdHJhbnNwb3J0X3R5cGUgPDwgIi8iIDw8IHByb3RvY29sX3R5cGUgPDwgIikgdG86ICI7CisgIGlmIChhYnN0cmFjdF9uYW1lc3BhY2UpIHsKKyAgICBjb3V0IDw8ICdAJzsKKyAgfQorICBjb3V0IDw8IGRvbWFpbl9zb2NrZXQ7CiAgIGlmIChwb3J0ICE9IDApIHsKICAgICBjb3V0IDw8IGhvc3QgPDwgIjoiIDw8IHBvcnQ7CiAgIH0KQEAgLTI0NCwxNyArMzg0LDE0IEBACiAgICAgY291dCA8PCAiTGliZXZlbnQgRmVhdHVyZXM6IDB4IiA8PCBoZXggPDwgZXZlbnRfYmFzZV9nZXRfZmVhdHVyZXMoYmFzZSkgPDwgZW5kbDsKICNlbmRpZgogCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNDaGFubmVsPiBjaGFubmVsKAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNDaGFubmVsPiBjaGFubmVsKAogICAgICAgICBuZXcgVEV2aHR0cENsaWVudENoYW5uZWwoaG9zdC5jX3N0cigpLCAiLyIsIGhvc3QuY19zdHIoKSwgcG9ydCwgYmFzZSkpOwogICAgIFRocmlmdFRlc3RDb2JDbGllbnQqIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0Q29iQ2xpZW50KGNoYW5uZWwsIHByb3RvY29sRmFjdG9yeS5nZXQoKSk7Ci0gICAgY2xpZW50LT50ZXN0Vm9pZCh0Y3h4OjpiaW5kKHRlc3RWb2lkX2NsaWVudFJldHVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAorICAgIGNsaWVudC0+dGVzdFZvaWQoc3RkOjpiaW5kKHRlc3RWb2lkX2NsaWVudFJldHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOwogCiAgICAgZXZlbnRfYmFzZV9sb29wKGJhc2UsIDApOwogICAgIHJldHVybiAwOwpAQCAtMjY2LDIwICs0MDMsMTQgQEAKICAgdWludDY0X3QgdGltZV9tYXggPSAwOwogICB1aW50NjRfdCB0aW1lX3RvdCA9IDA7CiAKLSAgaW50IHJldHVybl9jb2RlID0gMDsKLSAgaW50IEVSUl9CQVNFVFlQRVMgPSAxOwotICBpbnQgRVJSX1NUUlVDVFMgPSAyOwotICBpbnQgRVJSX0NPTlRBSU5FUlMgPSA0OwotICBpbnQgRVJSX0VYQ0VQVElPTlMgPSA4OwotCiAgIGludCB0ZXN0ID0gMDsKICAgZm9yICh0ZXN0ID0gMDsgdGVzdCA8IG51bVRlc3RzOyArK3Rlc3QpIHsKIAogICAgIHRyeSB7CiAgICAgICB0cmFuc3BvcnQtPm9wZW4oKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHByaW50ZigiQ29ubmVjdCBmYWlsZWQ6ICVzXG4iLCB0dHgud2hhdCgpKTsKLSAgICAgIHJldHVybiAxOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICJDb25uZWN0IGZhaWxlZDogIiA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybiBFUlJfVU5LTk9XTjsKICAgICB9CiAKICAgICAvKioKQEAgLTI5MywxNTAgKzQyNCwyMjUgQEAKICAgICAgKiBWT0lEIFRFU1QKICAgICAgKi8KICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Vm9pZCgpIik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Vm9pZCgpIiA8PCBmbHVzaDsKICAgICAgIHRlc3RDbGllbnQudGVzdFZvaWQoKTsKLSAgICAgIHByaW50ZigiID0gdm9pZFxuIik7Ci0gICAgfSBjYXRjaCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uJiB0YXgpIHsKLSAgICAgIHByaW50ZigiKioqIEZBSUxFRCAqKipcbiIpOwotICAgICAgcHJpbnRmKCIlc1xuIiwgdGF4LndoYXQoKSk7CisgICAgICBjb3V0IDw8ICIgPSB2b2lkIiA8PCBlbmRsOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICAvLyBTdG9wIGhlcmUgaWYgdHJhbnNwb3J0IGdvdCBicm9rZW4KKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTVFJJTkcgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIgPDwgZmx1c2g7CiAgICAgc3RyaW5nIHM7CiAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsICJUZXN0Iik7Ci0gICAgcHJpbnRmKCIgPSBcIiVzXCJcbiIsIHMuY19zdHIoKSk7CisgICAgY291dCA8PCAiID0gIiA8PCBzIDw8IGVuZGw7CiAgICAgaWYgKHMgIT0gIlRlc3QiKSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICB9CiAKKyAgICAvLworICAgIC8vIE11bHRpcGxleGVkIHByb3RvY29sIC0gY2FsbCBhbm90aGVyIHNlcnZpY2UgbWV0aG9kCisgICAgLy8gaW4gdGhlIG1pZGRsZSBvZiB0aGUgVGhyaWZ0VGVzdAorICAgIC8vCisgICAgaWYgKGJvb3N0OjpzdGFydHNfd2l0aChwcm90b2NvbF90eXBlLCAibXVsdGkiKSkgeworICAgIFNlY29uZFNlcnZpY2VDbGllbnQgc3NjKHByb3RvY29sMik7CisgICAgLy8gdHJhbnNwb3J0IGlzIGFscmVhZHkgb3Blbi4uLgorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgY291dCA8PCAic2Vjb25kU2VydmljZS5zZWNvbmRUZXN0U3RyaW5nKFwiZm9vXCIpID0+ICIgPDwgZmx1c2g7CisgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICAgIHNzYy5zZWNvbmR0ZXN0U3RyaW5nKHJlc3VsdCwgImZvbyIpOworICAgICAgY291dCA8PCAieyIgPDwgcmVzdWx0IDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICAgIGNvdXQgPDwgIiAgKioqIEZBSUxFRCAqKiogIiA8PCBlLndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisgICAgfQorICAgIH0KKworICAgIHRyeSB7CisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcHVzaCApCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTY2ICkKKyNlbmRpZgorICAgICAgc3RyaW5nIHN0cigKKyAgICAgICAgICAifXtBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIgorICAgICAgICAgICJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIgorICAgICAgICAgICLQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sICIKKyAgICAgICAgICAi4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiCisgICAgICAgICAgIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIgorICAgICAgICAgICJEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsICIKKyAgICAgICAgICAiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiCisgICAgICAgICAgIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIgorICAgICAgICAgICJBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCAiCisgICAgICAgICAgIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIKKyAgICAgICAgICAiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiCisgICAgICAgICAgIuGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgIgorICAgICAgICAgICJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIKKyAgICAgICAgICAiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIgorICAgICAgICAgICJCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCDZhdin2LLZkNix2YjZhtuMLCBCYWhhc2EgIgorICAgICAgICAgICJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiCisgICAgICAgICAgIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIgorICAgICAgICAgICJPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgIgorICAgICAgICAgICJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIgorICAgICAgICAgICLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIKKyAgICAgICAgICAiRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCAiCisgICAgICAgICAgIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIgorICAgICAgICAgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiCisgICAgICAgICAgIldhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsICIKKyAgICAgICAgICAiQsOibi1sw6JtLWfDuiwg57K16KqeIik7CisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorICAgICAgY291dCA8PCAidGVzdFN0cmluZygiIDw8IHN0ciA8PCAiKSA9ICIgPDwgZmx1c2g7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RTdHJpbmcocywgc3RyKTsKKyAgICAgIGNvdXQgPDwgcyA8PCBlbmRsOworICAgICAgaWYgKHMgIT0gc3RyKSB7CisgICAgICAgIGNvdXQuaW1idWUobG9jYWxlKCJlbl9VUy5VVEY4IikpOworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCAiRXhwZWN0ZWQgc3RyaW5nOiAiIDw8IHN0ciA8PCAiIGJ1dCBnb3Q6ICIgPDwgcyA8PCBlbmRsIDw8ICJDTEVBUiI7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgIHJldHVybiByZXR1cm5fY29kZTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHN0cmluZyBzdHIoCisgICAgICAgICAgInF1b3RlOiBcIiBiYWNrc2xhc2g6IgorICAgICAgICAgICIgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcLyAiCisgICAgICAgICAgIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIgorICAgICAgICAgICIgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXFwvXGJcblxyXHQiCisgICAgICAgICAgIiBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48IgorICAgICAgICAgICIgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXFwiIH19fXsgW1tbICIpOworICAgICAgY291dCA8PCAidGVzdFN0cmluZygiIDw8IHN0ciA8PCAiKSA9ICIgPDwgZmx1c2g7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RTdHJpbmcocywgc3RyKTsKKyAgICAgIGNvdXQgPDwgcyA8PCBlbmRsOworICAgICAgaWYgKHMgIT0gc3RyKSB7CisgICAgICAgIGNvdXQuaW1idWUobG9jYWxlKCJlbl9VUy5VVEY4IikpOworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBzdHJpbmc6ICIgPDwgc3RyIDw8ICIgYnV0IGdvdDogIiA8PCBzIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiQ0xFQVIiOworICAgICAgICA7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgIHJldHVybiByZXR1cm5fY29kZTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBCT09MIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RCb29sKHRydWUpIik7Ci0gICAgYm9vbCBibCA9IHRlc3RDbGllbnQudGVzdEJvb2wodHJ1ZSk7Ci0gICAgcHJpbnRmKCIgPSAlc1xuIiwgYmwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICBpZiAoYmwgIT0gdHJ1ZSkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7Ci0gICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOwotICAgIH0KLQotICAgIHByaW50ZigidGVzdEJvb2woZmFsc2UpIik7Ci0gICAgYmwgPSB0ZXN0Q2xpZW50LnRlc3RCb29sKGZhbHNlKTsKLSAgICBwcmludGYoIiA9ICVzXG4iLCBibCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgIGlmIChibCAhPSBmYWxzZSkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7Ci0gICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOwotICAgIH0KKyAgICBjb3V0IDw8IGJvb2xhbHBoYTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCb29sLCB0cnVlKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCb29sLCBmYWxzZSk7CiAKICAgICAvKioKICAgICAgKiBCWVRFIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RCeXRlKDEpIik7Ci0gICAgdWludDhfdCB1OCA9IHRlc3RDbGllbnQudGVzdEJ5dGUoMSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgKGludCl1OCk7Ci0gICAgaWYgKHU4ICE9IDEpIHsKLSAgICAgIHByaW50ZigiKioqIEZBSUxFRCAqKipcbiIpOwotICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKLSAgICB9CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCkwKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KS0xKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KTQyKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KS00Mik7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCkxMjcpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpLTEyOCk7CiAKICAgICAvKioKICAgICAgKiBJMzIgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdEkzMigtMSkiKTsKLSAgICBpbnQzMl90IGkzMiA9IHRlc3RDbGllbnQudGVzdEkzMigtMSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgaTMyKTsKLSAgICBpZiAoaTMyICE9IC0xKSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKLSAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7Ci0gICAgfQorICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEkzMiwgMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAtMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAxOTAwMDAwMTMpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEkzMiwgLTE5MDAwMDAxMyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAobnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAobnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbikoKSk7CiAKICAgICAvKioKICAgICAgKiBJNjQgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7Ci0gICAgaW50NjRfdCBpNjQgPSB0ZXN0Q2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4TEwpOwotICAgIHByaW50ZigiID0gJSIgUFJJZDY0ICJcbiIsIGk2NCk7Ci0gICAgaWYgKGk2NCAhPSAtMzQzNTk3MzgzNjhMTCkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7Ci0gICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOwotICAgIH0KKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KTApOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpLTEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpNzAwMDAwMDAwMDAwMDAwMDEyM0xMKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KS03MDAwMDAwMDAwMDAwMDAwMTIzTEwpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMkxMKSwgMzIpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KS1wb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyTEwpLCAzMikpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMkxMKSwgMzIpICsgMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMkxMKSwgMzIpIC0gMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAobnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCkoKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAobnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbikoKSk7CiAKICAgICAvKioKICAgICAgKiBET1VCTEUgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdERvdWJsZSgtNS4yMDk4NTIzKSIpOwotICAgIGRvdWJsZSBkdWIgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoLTUuMjA5ODUyMyk7Ci0gICAgcHJpbnRmKCIgPSAlZlxuIiwgZHViKTsKLSAgICBpZiAoKGR1YiAtICgtNS4yMDk4NTIzKSkgPiAwLjAwMSkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgLy8gQ29tcGFyaW5nIGRvdWJsZSB2YWx1ZXMgd2l0aCBwbGFpbiBlcXVhbGl0eSBiZWNhdXNlIFRocmlmdCBoYW5kbGVzIGZ1bGwgcHJlY2lzaW9uIG9mIGRvdWJsZQorICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgMC4wKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC0xLjApOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLTUuMjA5ODUyMyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDMyKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgMzIpICsgMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgNTMpIC0gMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDMyKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDMyKSAtIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCA1MykgKyAxKTsKKworICAgIHRyeSB7CisgICAgICBkb3VibGUgZXhwZWN0ZWQgPSBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigxMCksIDMwNyk7CisgICAgICBjb3V0IDw8ICJ0ZXN0RG91YmxlKCIgPDwgZXhwZWN0ZWQgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgZG91YmxlIGFjdHVhbCA9IHRlc3RDbGllbnQudGVzdERvdWJsZShleHBlY3RlZCk7CisgICAgICBjb3V0IDw8ICIoIiA8PCBhY3R1YWwgPDwgIikiIDw8IGVuZGw7CisgICAgICBpZiAoZXhwZWN0ZWQgLSBhY3R1YWwgPiBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigxMCksIDI5MikpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIiBidXQgZ290OiAiIDw8IGFjdHVhbCA8PCBlbmRsOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGRvdWJsZSBleHBlY3RlZCA9IHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDEwKSwgLTI5Mik7CisgICAgICBjb3V0IDw8ICJ0ZXN0RG91YmxlKCIgPDwgZXhwZWN0ZWQgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgZG91YmxlIGFjdHVhbCA9IHRlc3RDbGllbnQudGVzdERvdWJsZShleHBlY3RlZCk7CisgICAgICBjb3V0IDw8ICIoIiA8PCBhY3R1YWwgPDwgIikiIDw8IGVuZGw7CisgICAgICBpZiAoZXhwZWN0ZWQgLSBhY3R1YWwgPiBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigxMCksIC0zMDcpKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICIgYnV0IGdvdDogIiA8PCBhY3R1YWwgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CiAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEJJTkFSWSBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0QmluYXJ5KFstMTI4Li4xMjddKSA9IHsiKTsKLSAgICBjb25zdCBjaGFyIGJpbl9kYXRhWzI1Nl0KLSAgICAgICAgPSB7LTEyOCwgLTEyNywgLTEyNiwgLTEyNSwgLTEyNCwgLTEyMywgLTEyMiwgLTEyMSwgLTEyMCwgLTExOSwgLTExOCwgLTExNywgLTExNiwgLTExNSwgLTExNCwKLSAgICAgICAgICAgLTExMywgLTExMiwgLTExMSwgLTExMCwgLTEwOSwgLTEwOCwgLTEwNywgLTEwNiwgLTEwNSwgLTEwNCwgLTEwMywgLTEwMiwgLTEwMSwgLTEwMCwgLTk5LAotICAgICAgICAgICAtOTgsICAtOTcsICAtOTYsICAtOTUsICAtOTQsICAtOTMsICAtOTIsICAtOTEsICAtOTAsICAtODksICAtODgsICAtODcsICAtODYsICAtODUsICAtODQsCi0gICAgICAgICAgIC04MywgIC04MiwgIC04MSwgIC04MCwgIC03OSwgIC03OCwgIC03NywgIC03NiwgIC03NSwgIC03NCwgIC03MywgIC03MiwgIC03MSwgIC03MCwgIC02OSwKLSAgICAgICAgICAgLTY4LCAgLTY3LCAgLTY2LCAgLTY1LCAgLTY0LCAgLTYzLCAgLTYyLCAgLTYxLCAgLTYwLCAgLTU5LCAgLTU4LCAgLTU3LCAgLTU2LCAgLTU1LCAgLTU0LAotICAgICAgICAgICAtNTMsICAtNTIsICAtNTEsICAtNTAsICAtNDksICAtNDgsICAtNDcsICAtNDYsICAtNDUsICAtNDQsICAtNDMsICAtNDIsICAtNDEsICAtNDAsICAtMzksCi0gICAgICAgICAgIC0zOCwgIC0zNywgIC0zNiwgIC0zNSwgIC0zNCwgIC0zMywgIC0zMiwgIC0zMSwgIC0zMCwgIC0yOSwgIC0yOCwgIC0yNywgIC0yNiwgIC0yNSwgIC0yNCwKLSAgICAgICAgICAgLTIzLCAgLTIyLCAgLTIxLCAgLTIwLCAgLTE5LCAgLTE4LCAgLTE3LCAgLTE2LCAgLTE1LCAgLTE0LCAgLTEzLCAgLTEyLCAgLTExLCAgLTEwLCAgLTksCi0gICAgICAgICAgIC04LCAgIC03LCAgIC02LCAgIC01LCAgIC00LCAgIC0zLCAgIC0yLCAgIC0xLCAgIDAsICAgIDEsICAgIDIsICAgIDMsICAgIDQsICAgIDUsICAgIDYsCi0gICAgICAgICAgIDcsICAgIDgsICAgIDksICAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLAotICAgICAgICAgICAyMiwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAzMiwgICAzMywgICAzNCwgICAzNSwgICAzNiwKLSAgICAgICAgICAgMzcsICAgMzgsICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsICAgNDgsICAgNDksICAgNTAsICAgNTEsCi0gICAgICAgICAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LCAgIDU5LCAgIDYwLCAgIDYxLCAgIDYyLCAgIDYzLCAgIDY0LCAgIDY1LCAgIDY2LAotICAgICAgICAgICA2NywgICA2OCwgICA2OSwgICA3MCwgICA3MSwgICA3MiwgICA3MywgICA3NCwgICA3NSwgICA3NiwgICA3NywgICA3OCwgICA3OSwgICA4MCwgICA4MSwKLSAgICAgICAgICAgODIsICAgODMsICAgODQsICAgODUsICAgODYsICAgODcsICAgODgsICAgODksICAgOTAsICAgOTEsICAgOTIsICAgOTMsICAgOTQsICAgOTUsICAgOTYsCi0gICAgICAgICAgIDk3LCAgIDk4LCAgIDk5LCAgIDEwMCwgIDEwMSwgIDEwMiwgIDEwMywgIDEwNCwgIDEwNSwgIDEwNiwgIDEwNywgIDEwOCwgIDEwOSwgIDExMCwgIDExMSwKLSAgICAgICAgICAgMTEyLCAgMTEzLCAgMTE0LCAgMTE1LCAgMTE2LCAgMTE3LCAgMTE4LCAgMTE5LCAgMTIwLCAgMTIxLCAgMTIyLCAgMTIzLCAgMTI0LCAgMTI1LCAgMTI2LAotICAgICAgICAgICAxMjd9OwotICAgIHRyeSB7Ci0gICAgICBzdHJpbmcgYmluX3Jlc3VsdDsKLSAgICAgIHRlc3RDbGllbnQudGVzdEJpbmFyeShiaW5fcmVzdWx0LCBzdHJpbmcoYmluX2RhdGEsIDI1NikpOwotICAgICAgaWYgKGJpbl9yZXN1bHQuc2l6ZSgpICE9IDI1NikgewotICAgICAgICBwcmludGYoIn1cbioqKiBGQUlMRUQgKioqXG4iKTsKLSAgICAgICAgcHJpbnRmKCJpbnZhbGlkIGxlbmd0aDogJWx1XG4iLCBiaW5fcmVzdWx0LnNpemUoKSk7Ci0gICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7ICsraSkgewotICAgICAgICAgIGlmICghZmlyc3QpCi0gICAgICAgICAgICBwcmludGYoIiAsIik7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICBwcmludGYoIiVkIiwgYmluX3Jlc3VsdFtpXSk7Ci0gICAgICAgICAgaWYgKCFmYWlsZWQgJiYgYmluX3Jlc3VsdFtpXSAhPSBpIC0gMTI4KSB7Ci0gICAgICAgICAgICBmYWlsZWQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcmludGYoIn1cbiIpOwotICAgICAgICBpZiAoZmFpbGVkKSB7Ci0gICAgICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7Ci0gICAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKLSAgICAgIHByaW50ZigifVxuKioqIEZBSUxFRCAqKipcbiIpOwotICAgICAgcHJpbnRmKCIlc1xuIiwgZXgud2hhdCgpKTsKLSAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgZm9yIChzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IDEzMTA3MyAmJiAhcmV0dXJuX2NvZGU7ICkgeworICAgICAgcmV0dXJuX2NvZGUgfD0gYmluYXJ5X3Rlc3QodGVzdENsaWVudCwgaSk7CisgICAgICBpZiAoaSA+IDApIHsgaSAqPSAyOyB9IGVsc2UgeyArK2k7IH0KICAgICB9CiAKIAogICAgIC8qKgogICAgICAqIFNUUlVDVCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiIDw8IGZsdXNoOwogICAgIFh0cnVjdCBvdXQ7CiAgICAgb3V0LnN0cmluZ190aGluZyA9ICJaZXJvIjsKICAgICBvdXQuYnl0ZV90aGluZyA9IDE7CkBAIC00NTAsMTQgKzY1NiwxNCBAQAogICAgICAgICAgICBpbi5pMzJfdGhpbmcsCiAgICAgICAgICAgIGluLmk2NF90aGluZyk7CiAgICAgaWYgKGluICE9IG91dCkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIE5FU1RFRCBTVFJVQ1QgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSksIDV9Iik7CisgICAgY291dCA8PCAidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSksIDV9IiA8PCBmbHVzaDsKICAgICBYdHJ1Y3QyIG91dDI7CiAgICAgb3V0Mi5ieXRlX3RoaW5nID0gMTsKICAgICBvdXQyLnN0cnVjdF90aGluZyA9IG91dDsKQEAgLTQ3Myw3ICs2NzksNyBAQAogICAgICAgICAgICBpbi5pNjRfdGhpbmcsCiAgICAgICAgICAgIGluMi5pMzJfdGhpbmcpOwogICAgIGlmIChpbjIgIT0gb3V0MikgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOwogICAgIH0KIApAQCAtNDg0LDQwICs2OTAsNDAgQEAKICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA1OyArK2kpIHsKICAgICAgIG1hcG91dC5pbnNlcnQobWFrZV9wYWlyKGksIGkgLSAxMCkpOwogICAgIH0KLSAgICBwcmludGYoInRlc3RNYXAoeyIpOworICAgIGNvdXQgPDwgInRlc3RNYXAoeyIgPDwgZmx1c2g7CiAgICAgbWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChtX2l0ZXIgPSBtYXBvdXQuYmVnaW4oKTsgbV9pdGVyICE9IG1hcG91dC5lbmQoKTsgKyttX2l0ZXIpIHsKICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICBjb3V0IDw8ICIsIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQgPT4gJWQiLCBtX2l0ZXItPmZpcnN0LCBtX2l0ZXItPnNlY29uZCk7CisgICAgICBjb3V0IDw8IG1faXRlci0+Zmlyc3QgPDwgIiA9PiAiIDw8IG1faXRlci0+c2Vjb25kOwogICAgIH0KLSAgICBwcmludGYoIn0pIik7CisgICAgY291dCA8PCAifSkiOwogICAgIG1hcDxpbnQzMl90LCBpbnQzMl90PiBtYXBpbjsKICAgICB0ZXN0Q2xpZW50LnRlc3RNYXAobWFwaW4sIG1hcG91dCk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7CisgICAgY291dCA8PCAiID0geyI7CiAgICAgZmlyc3QgPSB0cnVlOwogICAgIGZvciAobV9pdGVyID0gbWFwaW4uYmVnaW4oKTsgbV9pdGVyICE9IG1hcGluLmVuZCgpOyArK21faXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCA9PiAlZCIsIG1faXRlci0+Zmlyc3QsIG1faXRlci0+c2Vjb25kKTsKKyAgICAgIGNvdXQgPDwgbV9pdGVyLT5maXJzdCA8PCAiID0+ICIgPDwgbV9pdGVyLT5zZWNvbmQ7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKICAgICBpZiAobWFwaW4gIT0gbWFwb3V0KSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU1RSSU5HIE1BUCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0U3RyaW5nTWFwKHthID0+IDIsIGIgPT4gYmxhaCwgc29tZSA9PiB0aGluZ30pID0geyIpOworICAgIGNvdXQgPDwgInRlc3RTdHJpbmdNYXAoe2EgPT4gMiwgYiA9PiBibGFoLCBzb21lID0+IHRoaW5nfSkgPSB7IiA8PCBmbHVzaDsKICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHNtYXBpbjsKICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHNtYXBvdXQ7CiAgICAgc21hcGluWyJhIl0gPSAiMiI7CkBAIC01MjgsMTkgKzczNCwyMCBAQAogICAgICAgZmlyc3QgPSB0cnVlOwogICAgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHNtYXBvdXQuYmVnaW4oKTsgaXQgIT0gc21hcG91dC5lbmQoKTsgKytpdCkgewogICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgcHJpbnRmKCIsIik7CisgICAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICAgIGVsc2UKICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBwcmludGYoIiVzID0+ICVzIiwgaXQtPmZpcnN0LmNfc3RyKCksIGl0LT5zZWNvbmQuY19zdHIoKSk7CisgICAgICAgIGNvdXQgPDwgaXQtPmZpcnN0IDw8ICIgPT4gIiA8PCBpdC0+c2Vjb25kOwogICAgICAgfQotICAgICAgcHJpbnRmKCJ9XG4iKTsKKyAgICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CiAgICAgICBpZiAoc21hcGluICE9IHNtYXBvdXQpIHsKLSAgICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKICAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CiAgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgewotICAgICAgcHJpbnRmKCJ9XG4qKiogRkFJTEVEICoqKlxuIik7Ci0gICAgICBwcmludGYoIiVzXG4iLCBleC53aGF0KCkpOworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CiAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKICAgICB9CiAKQEAgLTU1MSwxNDQgKzc1OCwxNjYgQEAKICAgICBmb3IgKGludDMyX3QgaSA9IC0yOyBpIDwgMzsgKytpKSB7CiAgICAgICBzZXRvdXQuaW5zZXJ0KGkpOwogICAgIH0KLSAgICBwcmludGYoInRlc3RTZXQoeyIpOworICAgIGNvdXQgPDwgInRlc3RTZXQoeyIgPDwgZmx1c2g7CiAgICAgc2V0PGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CiAgICAgZmlyc3QgPSB0cnVlOwogICAgIGZvciAoc19pdGVyID0gc2V0b3V0LmJlZ2luKCk7IHNfaXRlciAhPSBzZXRvdXQuZW5kKCk7ICsrc19pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKnNfaXRlcik7CisgICAgICBjb3V0IDw8ICpzX2l0ZXI7CiAgICAgfQotICAgIHByaW50ZigifSkiKTsKKyAgICBjb3V0IDw8ICJ9KSI7CiAgICAgc2V0PGludDMyX3Q+IHNldGluOwogICAgIHRlc3RDbGllbnQudGVzdFNldChzZXRpbiwgc2V0b3V0KTsKLSAgICBwcmludGYoIiA9IHsiKTsKKyAgICBjb3V0IDw8ICIgPSB7IjsKICAgICBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChzX2l0ZXIgPSBzZXRpbi5iZWdpbigpOyBzX2l0ZXIgIT0gc2V0aW4uZW5kKCk7ICsrc19pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKnNfaXRlcik7CisgICAgICBjb3V0IDw8ICpzX2l0ZXI7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKICAgICBpZiAoc2V0aW4gIT0gc2V0b3V0KSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogTElTVCBURVNUCiAgICAgICovCi0gICAgdmVjdG9yPGludDMyX3Q+IGxpc3RvdXQ7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAtMjsgaSA8IDM7ICsraSkgewotICAgICAgbGlzdG91dC5wdXNoX2JhY2soaSk7Ci0gICAgfQotICAgIHByaW50ZigidGVzdExpc3QoeyIpOwotICAgIHZlY3RvcjxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbF9pdGVyOwotICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGxfaXRlciA9IGxpc3RvdXQuYmVnaW4oKTsgbF9pdGVyICE9IGxpc3RvdXQuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0TGlzdChlbXB0eSkiIDw8IGZsdXNoOworICAgIHRyeSB7CisgICAgICB2ZWN0b3I8aW50MzJfdD4gbGlzdG91dDsKKyAgICAgIHRlc3RDbGllbnQudGVzdExpc3QobGlzdG91dCwgdmVjdG9yPGludDMyX3Q+KCkpOworICAgICAgaWYgKCFsaXN0b3V0LmVtcHR5KCkpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICAgIGNvdXQgPDwgImludmFsaWQgbGVuZ3RoOiAiIDw8IGxpc3RvdXQuc2l6ZSgpIDw8IGVuZGw7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpsX2l0ZXIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOwogICAgIH0KLSAgICBwcmludGYoIn0pIik7Ci0gICAgdmVjdG9yPGludDMyX3Q+IGxpc3RpbjsKLSAgICB0ZXN0Q2xpZW50LnRlc3RMaXN0KGxpc3RpbiwgbGlzdG91dCk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7Ci0gICAgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobF9pdGVyID0gbGlzdGluLmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0aW4uZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICB0cnkgeworICAgICAgdmVjdG9yPGludDMyX3Q+IGxpc3RvdXQ7CisgICAgICBmb3IgKGludDMyX3QgaSA9IC0yOyBpIDwgMzsgKytpKSB7CisgICAgICAgIGxpc3RvdXQucHVzaF9iYWNrKGkpOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpsX2l0ZXIpOwotICAgIH0KLSAgICBwcmludGYoIn1cbiIpOwotICAgIGlmIChsaXN0aW4gIT0gbGlzdG91dCkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICJ0ZXN0TGlzdCh7IiA8PCBmbHVzaDsKKyAgICAgIHZlY3RvcjxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbF9pdGVyOworICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChsX2l0ZXIgPSBsaXN0b3V0LmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0b3V0LmVuZCgpOyArK2xfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvdXQgPDwgIiwiOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgKmxfaXRlcjsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgIn0pIjsKKyAgICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0aW47CisgICAgICB0ZXN0Q2xpZW50LnRlc3RMaXN0KGxpc3RpbiwgbGlzdG91dCk7CisgICAgICBjb3V0IDw8ICIgPSB7IjsKKyAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAobF9pdGVyID0gbGlzdGluLmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0aW4uZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY291dCA8PCAiLCI7CisgICAgICAgIH0KKyAgICAgICAgY291dCA8PCAqbF9pdGVyOworICAgICAgfQorICAgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGlmIChsaXN0aW4gIT0gbGlzdG91dCkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogRU5VTSBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShPTkUpIik7CisgICAgY291dCA8PCAidGVzdEVudW0oT05FKSIgPDwgZmx1c2g7CiAgICAgTnVtYmVyejo6dHlwZSByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcno6Ok9ORSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgcmV0KTsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IHJldCA8PCBlbmRsOwogICAgIGlmIChyZXQgIT0gTnVtYmVyejo6T05FKSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CiAgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShUV08pIik7CisgICAgY291dCA8PCAidGVzdEVudW0oVFdPKSIgPDwgZmx1c2g7CiAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpUV08pOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKICAgICBpZiAocmV0ICE9IE51bWJlcno6OlRXTykgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOwogICAgIH0KIAotICAgIHByaW50ZigidGVzdEVudW0oVEhSRUUpIik7CisgICAgY291dCA8PCAidGVzdEVudW0oVEhSRUUpIiA8PCBmbHVzaDsKICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcno6OlRIUkVFKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCByZXQpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcmV0IDw8IGVuZGw7CiAgICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpUSFJFRSkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOwogICAgIH0KIAotICAgIHByaW50ZigidGVzdEVudW0oRklWRSkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShGSVZFKSIgPDwgZmx1c2g7CiAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpGSVZFKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCByZXQpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcmV0IDw8IGVuZGw7CiAgICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpGSVZFKSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CiAgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShFSUdIVCkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShFSUdIVCkiIDw8IGZsdXNoOwogICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyejo6RUlHSFQpOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKICAgICBpZiAocmV0ICE9IE51bWJlcno6OkVJR0hUKSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVFlQRURFRiBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgY291dCA8PCAidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIgPDwgZmx1c2g7CiAgICAgVXNlcklkIHVpZCA9IHRlc3RDbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzTEwpOwotICAgIHByaW50ZigiID0gJSIgUFJJZDY0ICJcbiIsIHVpZCk7CisgICAgY291dCA8PCAiID0gIiA8PCB1aWQgPDwgZW5kbDsKICAgICBpZiAodWlkICE9IDMwOTg1ODIzNTA4MjUyM0xMKSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogTkVTVEVEIE1BUCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgY291dCA8PCAidGVzdE1hcE1hcCgxKSIgPDwgZmx1c2g7CiAgICAgbWFwPGludDMyX3QsIG1hcDxpbnQzMl90LCBpbnQzMl90PiA+IG1tOwogICAgIHRlc3RDbGllbnQudGVzdE1hcE1hcChtbSwgMSk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7CisgICAgY291dCA8PCAiID0geyI7CiAgICAgbWFwPGludDMyX3QsIG1hcDxpbnQzMl90LCBpbnQzMl90PiA+Ojpjb25zdF9pdGVyYXRvciBtaTsKICAgICBmb3IgKG1pID0gbW0uYmVnaW4oKTsgbWkgIT0gbW0uZW5kKCk7ICsrbWkpIHsKICAgICAgIHByaW50ZigiJWQgPT4geyIsIG1pLT5maXJzdCk7CiAgICAgICBtYXA8aW50MzJfdCwgaW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIG1pMjsKICAgICAgIGZvciAobWkyID0gbWktPnNlY29uZC5iZWdpbigpOyBtaTIgIT0gbWktPnNlY29uZC5lbmQoKTsgKyttaTIpIHsKLSAgICAgICAgcHJpbnRmKCIlZCA9PiAlZCwgIiwgbWkyLT5maXJzdCwgbWkyLT5zZWNvbmQpOworICAgICAgICBjb3V0IDw8IG1pMi0+Zmlyc3QgPDwgIiA9PiAiIDw8IG1pMi0+c2Vjb25kOwogICAgICAgfQotICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgIGNvdXQgPDwgIn0sICI7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKICAgICBpZiAobW0uc2l6ZSgpICE9IDIgfHwKICAgICAgICAgbW1bLTRdWy00XSAhPSAtNCB8fAogICAgICAgICBtbVstNF1bLTNdICE9IC0zIHx8CkBAIC02OTgsNyArOTI3LDcgQEAKICAgICAgICAgbW1bNF1bM10gIT0gMyB8fAogICAgICAgICBtbVs0XVsyXSAhPSAyIHx8CiAgICAgICAgIG1tWzRdWzFdICE9IDEpIHsKLSAgICAgIHByaW50ZigiKioqIEZBSUxFRCAqKipcbiIpOworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CiAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKICAgICB9CiAKQEAgLTcyMSwxMCArOTUwLDEwIEBACiAgICAgICB0cnVjazIuaTY0X3RoaW5nID0gMjsKICAgICAgIGluc2FuZS54dHJ1Y3RzLnB1c2hfYmFjayh0cnVjayk7CiAgICAgICBpbnNhbmUueHRydWN0cy5wdXNoX2JhY2sodHJ1Y2syKTsKLSAgICAgIHByaW50ZigidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgIGNvdXQgPDwgInRlc3RJbnNhbml0eSgpIiA8PCBmbHVzaDsKICAgICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiB3aG9hOwogICAgICAgdGVzdENsaWVudC50ZXN0SW5zYW5pdHkod2hvYSwgaW5zYW5lKTsKLSAgICAgIHByaW50ZigiID0geyIpOworICAgICAgY291dCA8PCAiID0geyI7CiAgICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKICAgICAgIGZvciAoaV9pdGVyID0gd2hvYS5iZWdpbigpOyBpX2l0ZXIgIT0gd2hvYS5lbmQoKTsgKytpX2l0ZXIpIHsKICAgICAgICAgcHJpbnRmKCIlIiBQUklkNjQgIiA9PiB7IiwgaV9pdGVyLT5maXJzdCk7CkBAIC03MzMsMTUgKzk2MiwxNSBAQAogICAgICAgICAgIHByaW50ZigiJWQgPT4geyIsIGkyX2l0ZXItPmZpcnN0KTsKICAgICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPiB1c2VyTWFwID0gaTJfaXRlci0+c2Vjb25kLnVzZXJNYXA7CiAgICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD46OmNvbnN0X2l0ZXJhdG9yIHVtOwotICAgICAgICAgIHByaW50ZigieyIpOworICAgICAgICAgIGNvdXQgPDwgInsiOwogICAgICAgICAgIGZvciAodW0gPSB1c2VyTWFwLmJlZ2luKCk7IHVtICE9IHVzZXJNYXAuZW5kKCk7ICsrdW0pIHsKLSAgICAgICAgICAgIHByaW50ZigiJWQgPT4gJSIgUFJJZDY0ICIsICIsIHVtLT5maXJzdCwgdW0tPnNlY29uZCk7CisgICAgICAgICAgICBjb3V0IDw8IHVtLT5maXJzdCA8PCAiID0+ICIgPDwgdW0tPnNlY29uZDsKICAgICAgICAgICB9Ci0gICAgICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgICAgICBjb3V0IDw8ICJ9LCAiOwogCiAgICAgICAgICAgdmVjdG9yPFh0cnVjdD4geHRydWN0cyA9IGkyX2l0ZXItPnNlY29uZC54dHJ1Y3RzOwogICAgICAgICAgIHZlY3RvcjxYdHJ1Y3Q+Ojpjb25zdF9pdGVyYXRvciB4OwotICAgICAgICAgIHByaW50ZigieyIpOworICAgICAgICAgIGNvdXQgPDwgInsiOwogICAgICAgICAgIGZvciAoeCA9IHh0cnVjdHMuYmVnaW4oKTsgeCAhPSB4dHJ1Y3RzLmVuZCgpOyArK3gpIHsKICAgICAgICAgICAgIHByaW50Zigie1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0sICIsCiAgICAgICAgICAgICAgICAgICAgeC0+c3RyaW5nX3RoaW5nLmNfc3RyKCksCkBAIC03NDksMTMgKzk3OCwxMyBAQAogICAgICAgICAgICAgICAgICAgIHgtPmkzMl90aGluZywKICAgICAgICAgICAgICAgICAgICB4LT5pNjRfdGhpbmcpOwogICAgICAgICAgIH0KLSAgICAgICAgICBwcmludGYoIn0iKTsKKyAgICAgICAgICBjb3V0IDw8ICJ9IjsKIAotICAgICAgICAgIHByaW50ZigifSwgIik7CisgICAgICAgICAgY291dCA8PCAifSwgIjsKICAgICAgICAgfQotICAgICAgICBwcmludGYoIn0sICIpOworICAgICAgICBjb3V0IDw8ICJ9LCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCJ9XG4iKTsKKyAgICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CiAgICAgICBib29sIGZhaWxlZCA9IGZhbHNlOwogICAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpdDEgPSB3aG9hLmZpbmQoVXNlcklkKDEpKTsKICAgICAgIGlmICh3aG9hLnNpemUoKSAhPSAyKSB7CkBAIC03NjQsMTEgKzk5MywxMSBAQAogICAgICAgaWYgKGl0MSA9PSB3aG9hLmVuZCgpKSB7CiAgICAgICAgIGZhaWxlZCA9IHRydWU7CiAgICAgICB9IGVsc2UgewotICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+Ojpjb25zdF9pdGVyYXRvciBpdDEyID0gaXQxLT5zZWNvbmQuZmluZChOdW1iZXJ6OjpUV08pOworICAgICAgICBhdXRvIGl0MTIgPSBpdDEtPnNlY29uZC5maW5kKE51bWJlcno6OlRXTyk7CiAgICAgICAgIGlmIChpdDEyID09IGl0MS0+c2Vjb25kLmVuZCgpIHx8IGl0MTItPnNlY29uZCAhPSBpbnNhbmUpIHsKICAgICAgICAgICBmYWlsZWQgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGl0MTMgPSBpdDEtPnNlY29uZC5maW5kKE51bWJlcno6OlRIUkVFKTsKKyAgICAgICAgYXV0byBpdDEzID0gaXQxLT5zZWNvbmQuZmluZChOdW1iZXJ6OjpUSFJFRSk7CiAgICAgICAgIGlmIChpdDEzID09IGl0MS0+c2Vjb25kLmVuZCgpIHx8IGl0MTMtPnNlY29uZCAhPSBpbnNhbmUpIHsKICAgICAgICAgICBmYWlsZWQgPSB0cnVlOwogICAgICAgICB9CkBAIC03NzcsMTMgKzEwMDYsMTMgQEAKICAgICAgIGlmIChpdDIgPT0gd2hvYS5lbmQoKSkgewogICAgICAgICBmYWlsZWQgPSB0cnVlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaXQyNiA9IGl0Mi0+c2Vjb25kLmZpbmQoTnVtYmVyejo6U0lYKTsKLSAgICAgICAgaWYgKGl0MjYgPT0gaXQxLT5zZWNvbmQuZW5kKCkgfHwgaXQyNi0+c2Vjb25kICE9IEluc2FuaXR5KCkpIHsKKyAgICAgICAgYXV0byBpdDI2ID0gaXQyLT5zZWNvbmQuZmluZChOdW1iZXJ6OjpTSVgpOworICAgICAgICBpZiAoaXQyNiA9PSBpdDItPnNlY29uZC5lbmQoKSB8fCBpdDI2LT5zZWNvbmQgIT0gSW5zYW5pdHkoKSkgewogICAgICAgICAgIGZhaWxlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGlmIChmYWlsZWQpIHsKLSAgICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKICAgICAgIH0KICAgICB9CkBAIC03OTEsNyArMTAyMCw3IEBACiAgICAgLyoqCiAgICAgICogTVVMVEkgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdE11bHRpKClcbiIpOworICAgIGNvdXQgPDwgInRlc3RNdWx0aSgpIiA8PCBlbmRsOwogICAgIHRyeSB7CiAgICAgICBtYXA8aW50MTZfdCwgc3RyaW5nPiBtdWxfbWFwOwogICAgICAgWHRydWN0IG11bF9yZXN1bHQ7CkBAIC04MDQsMjAgKzEwMzMsMjIgQEAKICAgICAgIHh4cy5pMzJfdGhpbmcgPSA0MjQyOwogICAgICAgeHhzLmk2NF90aGluZyA9IDQyNDI0MjsKICAgICAgIGlmIChtdWxfcmVzdWx0ICE9IHh4cykgewotICAgICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CiAgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOwogICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKICAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CiAgICAgfQogCiAgICAgLyogdGVzdCBleGNlcHRpb24gKi8KIAogICAgIHRyeSB7Ci0gICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSA9PiIgPDwgZmx1c2g7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7Ci0gICAgICBwcmludGYoIiAgdm9pZFxuKioqIEZBSUxFRCAqKipcbiIpOworICAgICAgY291dCA8PCAiICB2b2lkXG4qKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOwogCiAgICAgfSBjYXRjaCAoWGNlcHRpb24mIGUpIHsKQEAgLTgyNSw0MSArMTA1Niw0MSBAQAogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikgPT4iIDw8IGZsdXNoOwogICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7Ci0gICAgICBwcmludGYoIiAgdm9pZFxuKioqIEZBSUxFRCAqKipcbiIpOworICAgICAgY291dCA8PCAiICB2b2lkXG4qKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOwogCiAgICAgfSBjYXRjaCAoY29uc3QgVEV4Y2VwdGlvbiYpIHsKLSAgICAgIHByaW50ZigiICBDYXVnaHQgVEV4Y2VwdGlvblxuIik7CisgICAgICBjb3V0IDw8ICIgIENhdWdodCBURXhjZXB0aW9uIiA8PCBlbmRsOwogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iIDw8IGZsdXNoOwogICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJzdWNjZXNzIik7Ci0gICAgICBwcmludGYoIiAgdm9pZFxuIik7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBwcmludGYoIiAgZXhjZXB0aW9uXG4qKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICIgIHZvaWQiIDw8IGVuZGw7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uICYgZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAgICAgfQogCiAgICAgLyogdGVzdCBtdWx0aSBleGNlcHRpb24gKi8KIAogICAgIHRyeSB7Ci0gICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb25cIiwgXCJ0ZXN0IDFcIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb25cIiwgXCJ0ZXN0IDFcIikgPT4iIDw8IGZsdXNoOwogICAgICAgWHRydWN0IHJlc3VsdDsKICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKHJlc3VsdCwgIlhjZXB0aW9uIiwgInRlc3QgMSIpOwotICAgICAgcHJpbnRmKCIgIHJlc3VsdFxuKioqIEZBSUxFRCAqKipcbiIpOworICAgICAgY291dCA8PCAiICByZXN1bHRcbioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAgICAgfSBjYXRjaCAoWGNlcHRpb24mIGUpIHsKICAgICAgIHByaW50ZigiICB7JXUsIFwiJXNcIn1cbiIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UuY19zdHIoKSk7CiAgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgXCJ0ZXN0IDJcIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIFwidGVzdCAyXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIFh0cnVjdCByZXN1bHQ7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihyZXN1bHQsICJYY2VwdGlvbjIiLCAidGVzdCAyIik7Ci0gICAgICBwcmludGYoIiAgcmVzdWx0XG4qKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICIgIHJlc3VsdFxuKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CiAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKIAogICAgIH0gY2F0Y2ggKFhjZXB0aW9uMiYgZSkgewpAQCAtODY3LDE4ICsxMDk4LDE4IEBACiAgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwidGVzdCAzXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJ0ZXN0IDNcIikgPT4iIDw8IGZsdXNoOwogICAgICAgWHRydWN0IHJlc3VsdDsKICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKHJlc3VsdCwgInN1Y2Nlc3MiLCAidGVzdCAzIik7CiAgICAgICBwcmludGYoIiAge3tcIiVzXCJ9fVxuIiwgcmVzdWx0LnN0cmluZ190aGluZy5jX3N0cigpKTsKLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIHByaW50ZigiICBleGNlcHRpb25cbioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICB9IGNhdGNoIChleGNlcHRpb24gJiBleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CiAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICB9CiAKICAgICAvKiB0ZXN0IG9uZXdheSB2b2lkICovCiAgICAgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSkgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdE9uZXdheSgxKSA9PiIgPDwgZmx1c2g7CiAgICAgICB1aW50NjRfdCBzdGFydE9uZXdheSA9IG5vdygpOwogICAgICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDEpOwogICAgICAgdWludDY0X3QgZWxhcHNlZCA9IG5vdygpIC0gc3RhcnRPbmV3YXk7CkBAIC05MDEsMTYgKzExMzIsMTggQEAKICAgICAvKioKICAgICAgKiBJMzIgVEVTVAogICAgICAqLwotICAgIHByaW50ZigicmUtdGVzdCB0ZXN0STMyKC0xKSIpOwotICAgIGkzMiA9IHRlc3RDbGllbnQudGVzdEkzMigtMSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgaTMyKTsKKyAgICBjb3V0IDw8ICJyZS10ZXN0IHRlc3RJMzIoLTEpIiA8PCBmbHVzaDsKKyAgICBpbnQgaTMyID0gdGVzdENsaWVudC50ZXN0STMyKC0xKTsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IGkzMiA8PCBlbmRsOwogICAgIGlmIChpMzIgIT0gLTEpCiAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOwogCisgICAgY291dCA8PCBlbmRsIDw8ICJBbGwgdGVzdHMgZG9uZS4iIDw8IGVuZGwgPDwgZmx1c2g7CisKICAgICB1aW50NjRfdCBzdG9wID0gbm93KCk7CiAgICAgdWludDY0X3QgdG90ID0gc3RvcCAtIHN0YXJ0OwogCi0gICAgcHJpbnRmKCJUb3RhbCB0aW1lOiAlIiBQUkl1NjQgIiB1c1xuIiwgc3RvcCAtIHN0YXJ0KTsKKyAgICBjb3V0IDw8ICJUb3RhbCB0aW1lOiAiIDw8IHN0b3AgLSBzdGFydCA8PCAiIHVzIiA8PCBlbmRsOwogCiAgICAgdGltZV90b3QgKz0gdG90OwogICAgIGlmICh0aW1lX21pbiA9PSAwIHx8IHRvdCA8IHRpbWVfbWluKSB7CkBAIC05MjAsMTYgKzExNTMsNzkgQEAKICAgICAgIHRpbWVfbWF4ID0gdG90OwogICAgIH0KIAorICAgIGNvdXQgPDwgZmx1c2g7CiAgICAgdHJhbnNwb3J0LT5jbG9zZSgpOwogICB9CiAKLSAgcHJpbnRmKCJcbkFsbCB0ZXN0cyBkb25lLlxuIik7CiAKICAgdWludDY0X3QgdGltZV9hdmcgPSB0aW1lX3RvdCAvIG51bVRlc3RzOwogCi0gIHByaW50ZigiTWluIHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX21pbik7Ci0gIHByaW50ZigiTWF4IHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX21heCk7Ci0gIHByaW50ZigiQXZnIHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX2F2Zyk7CisgIGNvdXQgPDwgIk1pbiB0aW1lOiAiIDw8IHRpbWVfbWluIDw8ICIgdXMiIDw8IGVuZGw7CisgIGNvdXQgPDwgIk1heCB0aW1lOiAiIDw8IHRpbWVfbWF4IDw8ICIgdXMiIDw8IGVuZGw7CisgIGNvdXQgPDwgIkF2ZyB0aW1lOiAiIDw8IHRpbWVfYXZnIDw8ICIgdXMiIDw8IGVuZGw7CiAKICAgcmV0dXJuIHJldHVybl9jb2RlOwogfQorCit2b2lkIGJpbmFyeV9maWxsKHN0ZDo6c3RyaW5nJiBzdHIsIHN0cmluZzo6c2l6ZV90eXBlIHNpeikKK3sKKyAgICBzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgYmluX2RhdGFbMjU2XQorICAgICAgICA9IHstMTI4LCAtMTI3LCAtMTI2LCAtMTI1LCAtMTI0LCAtMTIzLCAtMTIyLCAtMTIxLCAtMTIwLCAtMTE5LCAtMTE4LCAtMTE3LCAtMTE2LCAtMTE1LCAtMTE0LAorICAgICAgICAgICAtMTEzLCAtMTEyLCAtMTExLCAtMTEwLCAtMTA5LCAtMTA4LCAtMTA3LCAtMTA2LCAtMTA1LCAtMTA0LCAtMTAzLCAtMTAyLCAtMTAxLCAtMTAwLCAtOTksCisgICAgICAgICAgIC05OCwgIC05NywgIC05NiwgIC05NSwgIC05NCwgIC05MywgIC05MiwgIC05MSwgIC05MCwgIC04OSwgIC04OCwgIC04NywgIC04NiwgIC04NSwgIC04NCwKKyAgICAgICAgICAgLTgzLCAgLTgyLCAgLTgxLCAgLTgwLCAgLTc5LCAgLTc4LCAgLTc3LCAgLTc2LCAgLTc1LCAgLTc0LCAgLTczLCAgLTcyLCAgLTcxLCAgLTcwLCAgLTY5LAorICAgICAgICAgICAtNjgsICAtNjcsICAtNjYsICAtNjUsICAtNjQsICAtNjMsICAtNjIsICAtNjEsICAtNjAsICAtNTksICAtNTgsICAtNTcsICAtNTYsICAtNTUsICAtNTQsCisgICAgICAgICAgIC01MywgIC01MiwgIC01MSwgIC01MCwgIC00OSwgIC00OCwgIC00NywgIC00NiwgIC00NSwgIC00NCwgIC00MywgIC00MiwgIC00MSwgIC00MCwgIC0zOSwKKyAgICAgICAgICAgLTM4LCAgLTM3LCAgLTM2LCAgLTM1LCAgLTM0LCAgLTMzLCAgLTMyLCAgLTMxLCAgLTMwLCAgLTI5LCAgLTI4LCAgLTI3LCAgLTI2LCAgLTI1LCAgLTI0LAorICAgICAgICAgICAtMjMsICAtMjIsICAtMjEsICAtMjAsICAtMTksICAtMTgsICAtMTcsICAtMTYsICAtMTUsICAtMTQsICAtMTMsICAtMTIsICAtMTEsICAtMTAsICAtOSwKKyAgICAgICAgICAgLTgsICAgLTcsICAgLTYsICAgLTUsICAgLTQsICAgLTMsICAgLTIsICAgLTEsICAgMCwgICAgMSwgICAgMiwgICAgMywgICAgNCwgICAgNSwgICAgNiwKKyAgICAgICAgICAgNywgICAgOCwgICAgOSwgICAgMTAsICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsICAgMTgsICAgMTksICAgMjAsICAgMjEsCisgICAgICAgICAgIDIyLCAgIDIzLCAgIDI0LCAgIDI1LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDMyLCAgIDMzLCAgIDM0LCAgIDM1LCAgIDM2LAorICAgICAgICAgICAzNywgICAzOCwgICAzOSwgICA0MCwgICA0MSwgICA0MiwgICA0MywgICA0NCwgICA0NSwgICA0NiwgICA0NywgICA0OCwgICA0OSwgICA1MCwgICA1MSwKKyAgICAgICAgICAgNTIsICAgNTMsICAgNTQsICAgNTUsICAgNTYsICAgNTcsICAgNTgsICAgNTksICAgNjAsICAgNjEsICAgNjIsICAgNjMsICAgNjQsICAgNjUsICAgNjYsCisgICAgICAgICAgIDY3LCAgIDY4LCAgIDY5LCAgIDcwLCAgIDcxLCAgIDcyLCAgIDczLCAgIDc0LCAgIDc1LCAgIDc2LCAgIDc3LCAgIDc4LCAgIDc5LCAgIDgwLCAgIDgxLAorICAgICAgICAgICA4MiwgICA4MywgICA4NCwgICA4NSwgICA4NiwgICA4NywgICA4OCwgICA4OSwgICA5MCwgICA5MSwgICA5MiwgICA5MywgICA5NCwgICA5NSwgICA5NiwKKyAgICAgICAgICAgOTcsICAgOTgsICAgOTksICAgMTAwLCAgMTAxLCAgMTAyLCAgMTAzLCAgMTA0LCAgMTA1LCAgMTA2LCAgMTA3LCAgMTA4LCAgMTA5LCAgMTEwLCAgMTExLAorICAgICAgICAgICAxMTIsICAxMTMsICAxMTQsICAxMTUsICAxMTYsICAxMTcsICAxMTgsICAxMTksICAxMjAsICAxMjEsICAxMjIsICAxMjMsICAxMjQsICAxMjUsICAxMjYsCisgICAgICAgICAgIDEyN307CisKKyAgICBzdHIucmVzaXplKHNpeik7CisgICAgY2hhciAqcHRyID0gJnN0clswXTsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworICAgIGZvciAoc3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBzaXo7ICsraSkKKyAgICB7CisgICAgICAgIGlmIChwb3MgPT0gMjU1KSB7IHBvcyA9IDA7IH0gZWxzZSB7ICsrcG9zOyB9CisgICAgICAgICpwdHIrKyA9IGJpbl9kYXRhW3Bvc107CisgICAgfQorfQorCitpbnQgYmluYXJ5X3Rlc3QoVGhyaWZ0VGVzdENsaWVudCYgdGVzdENsaWVudCwgc3RyaW5nOjpzaXplX3R5cGUgc2l6KQoreworICAgIHN0cmluZyBiaW5fcmVxdWVzdDsKKyAgICBzdHJpbmcgYmluX3Jlc3VsdDsKKworICAgIGNvdXQgPDwgInRlc3RCaW5hcnkoc2l6ID0gIiA8PCBzaXogPDwgIikiIDw8IGVuZGw7CisgICAgYmluYXJ5X2ZpbGwoYmluX3JlcXVlc3QsIHNpeik7CisgICAgdHJ5IHsKKyAgICAgICAgdGVzdENsaWVudC50ZXN0QmluYXJ5KGJpbl9yZXN1bHQsIGJpbl9yZXF1ZXN0KTsKKworICAgICAgICBpZiAoYmluX3JlcXVlc3Quc2l6ZSgpICE9IGJpbl9yZXN1bHQuc2l6ZSgpKSB7CisgICAgICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEOiByZXF1ZXN0IHNpemUgIiA8PCBiaW5fcmVxdWVzdC5zaXplKCkgPDwgIjsgcmVzdWx0IHNpemUgIiA8PCBiaW5fcmVzdWx0LnNpemUoKSA8PCBlbmRsOworICAgICAgICAgICAgcmV0dXJuIEVSUl9CQVNFVFlQRVM7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgc2l6OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChiaW5fcmVxdWVzdC5hdChpKSAhPSBiaW5fcmVzdWx0LmF0KGkpKSB7CisgICAgICAgICAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRDogYXQgcG9zaXRpb24gIiA8PCBpIDw8ICIgcmVxdWVzdFtpXSBpcyBoIiA8PCBoZXggPDwgYmluX3JlcXVlc3QuYXQoaSkgPDwgIiByZXN1bHRbaV0gaXMgaCIgPDwgaGV4IDw8IGJpbl9yZXN1bHQuYXQoaSkgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICAgIHJldHVybiBFUlJfQkFTRVRZUEVTOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1Rlc3RTZXJ2ZXIuY3BwIGIvdGVzdC9jcHAvc3JjL1Rlc3RTZXJ2ZXIuY3BwCmluZGV4IGU1YmMzMWUuLjhkNWI0ZDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL3NyYy9UZXN0U2VydmVyLmNwcAorKysgYi90ZXN0L2NwcC9zcmMvVGVzdFNlcnZlci5jcHAKQEAgLTE3LDM4ICsxNyw1MSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgotI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgotI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgotI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oPgogI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KKworI2luY2x1ZGUgIlNlY29uZFNlcnZpY2UuaCIKICNpbmNsdWRlICJUaHJpZnRUZXN0LmgiCiAKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TSUdOQUxfSAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAjaW5jbHVkZSA8c3N0cmVhbT4KIAorI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgogI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+Ci0jaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4KIAotI2luY2x1ZGUgPHNpZ25hbC5oPgogI2lmIF9XSU4zMgogI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CiAjZW5kaWYKQEAgLTU2LDYxICs2OSw2OSBAQAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6YXN5bmM7CiAKIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q7CiAKLS8vIExlbmd0aCBvZiBhcmd2WzBdIC0gTGVuZ3RoIG9mIHNjcmlwdCBkaXIKLSNkZWZpbmUgRVhFQ1VUQUJMRV9GSUxFX05BTUVfTEVOR1RIIDE5CisvLyB0byBoYW5kbGUgYSBjb250cm9sbGVkIHNodXRkb3duLCBzaWduYWwgaGFuZGxpbmcgaXMgbWFuZGF0b3J5CisjaWZkZWYgSEFWRV9TSUdOQUxfSAorYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGdNb25pdG9yOwordm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbnVtKQoreworICBpZiAoc2lnbnVtID09IFNJR0lOVCkgeworICAgIGdNb25pdG9yLm5vdGlmeUFsbCgpOworICB9Cit9CisjZW5kaWYKIAogY2xhc3MgVGVzdEhhbmRsZXIgOiBwdWJsaWMgVGhyaWZ0VGVzdElmIHsKIHB1YmxpYzoKLSAgVGVzdEhhbmRsZXIoKSB7fQorICBUZXN0SGFuZGxlcigpID0gZGVmYXVsdDsKIAotICB2b2lkIHRlc3RWb2lkKCkgeyBwcmludGYoInRlc3RWb2lkKClcbiIpOyB9CisgIHZvaWQgdGVzdFZvaWQoKSBvdmVycmlkZSB7IHByaW50ZigidGVzdFZvaWQoKVxuIik7IH0KIAotICB2b2lkIHRlc3RTdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyYgdGhpbmcpIHsKKyAgdm9pZCB0ZXN0U3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcmIHRoaW5nKSBvdmVycmlkZSB7CiAgICAgcHJpbnRmKCJ0ZXN0U3RyaW5nKFwiJXNcIilcbiIsIHRoaW5nLmNfc3RyKCkpOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKLSAgYm9vbCB0ZXN0Qm9vbChjb25zdCBib29sIHRoaW5nKSB7CisgIGJvb2wgdGVzdEJvb2woY29uc3QgYm9vbCB0aGluZykgb3ZlcnJpZGUgewogICAgIHByaW50ZigidGVzdEJvb2woJXMpXG4iLCB0aGluZyA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCi0gIGludDhfdCB0ZXN0Qnl0ZShjb25zdCBpbnQ4X3QgdGhpbmcpIHsKKyAgaW50OF90IHRlc3RCeXRlKGNvbnN0IGludDhfdCB0aGluZykgb3ZlcnJpZGUgewogICAgIHByaW50ZigidGVzdEJ5dGUoJWQpXG4iLCAoaW50KXRoaW5nKTsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAotICBpbnQzMl90IHRlc3RJMzIoY29uc3QgaW50MzJfdCB0aGluZykgeworICBpbnQzMl90IHRlc3RJMzIoY29uc3QgaW50MzJfdCB0aGluZykgb3ZlcnJpZGUgewogICAgIHByaW50ZigidGVzdEkzMiglZClcbiIsIHRoaW5nKTsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAotICBpbnQ2NF90IHRlc3RJNjQoY29uc3QgaW50NjRfdCB0aGluZykgeworICBpbnQ2NF90IHRlc3RJNjQoY29uc3QgaW50NjRfdCB0aGluZykgb3ZlcnJpZGUgewogICAgIHByaW50ZigidGVzdEk2NCglIiBQUklkNjQgIilcbiIsIHRoaW5nKTsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAotICBkb3VibGUgdGVzdERvdWJsZShjb25zdCBkb3VibGUgdGhpbmcpIHsKKyAgZG91YmxlIHRlc3REb3VibGUoY29uc3QgZG91YmxlIHRoaW5nKSBvdmVycmlkZSB7CiAgICAgcHJpbnRmKCJ0ZXN0RG91YmxlKCVmKVxuIiwgdGhpbmcpOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCi0gIHZvaWQgdGVzdEJpbmFyeShzdGQ6OnN0cmluZyYgX3JldHVybiwgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKSB7CisgIHZvaWQgdGVzdEJpbmFyeShzdGQ6OnN0cmluZyYgX3JldHVybiwgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKSBvdmVycmlkZSB7CiAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGhleHN0cjsKICAgICBoZXhzdHIgPDwgc3RkOjpoZXggPDwgdGhpbmc7Ci0gICAgcHJpbnRmKCJ0ZXN0QmluYXJ5KCVzKVxuIiwgaGV4c3RyLnN0cigpLmNfc3RyKCkpOworICAgIHByaW50ZigidGVzdEJpbmFyeSglbHU6ICVzKVxuIiwgc2FmZV9udW1lcmljX2Nhc3Q8dW5zaWduZWQgbG9uZz4odGhpbmcuc2l6ZSgpKSwgaGV4c3RyLnN0cigpLmNfc3RyKCkpOwogICAgIF9yZXR1cm4gPSB0aGluZzsKICAgfQogCi0gIHZvaWQgdGVzdFN0cnVjdChYdHJ1Y3QmIG91dCwgY29uc3QgWHRydWN0JiB0aGluZykgeworICB2b2lkIHRlc3RTdHJ1Y3QoWHRydWN0JiBvdXQsIGNvbnN0IFh0cnVjdCYgdGhpbmcpIG92ZXJyaWRlIHsKICAgICBwcmludGYoInRlc3RTdHJ1Y3Qoe1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0pXG4iLAogICAgICAgICAgICB0aGluZy5zdHJpbmdfdGhpbmcuY19zdHIoKSwKICAgICAgICAgICAgKGludCl0aGluZy5ieXRlX3RoaW5nLApAQCAtMTE5LDcgKzE0MCw3IEBACiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3ROZXN0KFh0cnVjdDImIG91dCwgY29uc3QgWHRydWN0MiYgbmVzdCkgeworICB2b2lkIHRlc3ROZXN0KFh0cnVjdDImIG91dCwgY29uc3QgWHRydWN0MiYgbmVzdCkgb3ZlcnJpZGUgewogICAgIGNvbnN0IFh0cnVjdCYgdGhpbmcgPSBuZXN0LnN0cnVjdF90aGluZzsKICAgICBwcmludGYoInRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0sICVkfSlcbiIsCiAgICAgICAgICAgIChpbnQpbmVzdC5ieXRlX3RoaW5nLApAQCAtMTMxLDcgKzE1Miw3IEBACiAgICAgb3V0ID0gbmVzdDsKICAgfQogCi0gIHZvaWQgdGVzdE1hcChtYXA8aW50MzJfdCwgaW50MzJfdD4mIG91dCwgY29uc3QgbWFwPGludDMyX3QsIGludDMyX3Q+JiB0aGluZykgeworICB2b2lkIHRlc3RNYXAobWFwPGludDMyX3QsIGludDMyX3Q+JiBvdXQsIGNvbnN0IG1hcDxpbnQzMl90LCBpbnQzMl90PiYgdGhpbmcpIG92ZXJyaWRlIHsKICAgICBwcmludGYoInRlc3RNYXAoeyIpOwogICAgIG1hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwpAQCAtMTQ4LDcgKzE2OSw3IEBACiAgIH0KIAogICB2b2lkIHRlc3RTdHJpbmdNYXAobWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiB0aGluZykgeworICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHRoaW5nKSBvdmVycmlkZSB7CiAgICAgcHJpbnRmKCJ0ZXN0TWFwKHsiKTsKICAgICBtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwpAQCAtMTY0LDcgKzE4NSw3IEBACiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RTZXQoc2V0PGludDMyX3Q+JiBvdXQsIGNvbnN0IHNldDxpbnQzMl90PiYgdGhpbmcpIHsKKyAgdm9pZCB0ZXN0U2V0KHNldDxpbnQzMl90PiYgb3V0LCBjb25zdCBzZXQ8aW50MzJfdD4mIHRoaW5nKSBvdmVycmlkZSB7CiAgICAgcHJpbnRmKCJ0ZXN0U2V0KHsiKTsKICAgICBzZXQ8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKQEAgLTE4MCw3ICsyMDEsNyBAQAogICAgIG91dCA9IHRoaW5nOwogICB9CiAKLSAgdm9pZCB0ZXN0TGlzdCh2ZWN0b3I8aW50MzJfdD4mIG91dCwgY29uc3QgdmVjdG9yPGludDMyX3Q+JiB0aGluZykgeworICB2b2lkIHRlc3RMaXN0KHZlY3RvcjxpbnQzMl90PiYgb3V0LCBjb25zdCB2ZWN0b3I8aW50MzJfdD4mIHRoaW5nKSBvdmVycmlkZSB7CiAgICAgcHJpbnRmKCJ0ZXN0TGlzdCh7Iik7CiAgICAgdmVjdG9yPGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBsX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CkBAIC0xOTYsMTcgKzIxNywxNyBAQAogICAgIG91dCA9IHRoaW5nOwogICB9CiAKLSAgTnVtYmVyejo6dHlwZSB0ZXN0RW51bShjb25zdCBOdW1iZXJ6Ojp0eXBlIHRoaW5nKSB7CisgIE51bWJlcno6OnR5cGUgdGVzdEVudW0oY29uc3QgTnVtYmVyejo6dHlwZSB0aGluZykgb3ZlcnJpZGUgewogICAgIHByaW50ZigidGVzdEVudW0oJWQpXG4iLCB0aGluZyk7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKLSAgVXNlcklkIHRlc3RUeXBlZGVmKGNvbnN0IFVzZXJJZCB0aGluZykgeworICBVc2VySWQgdGVzdFR5cGVkZWYoY29uc3QgVXNlcklkIHRoaW5nKSBvdmVycmlkZSB7CiAgICAgcHJpbnRmKCJ0ZXN0VHlwZWRlZiglIiBQUklkNjQgIilcbiIsIHRoaW5nKTsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LCBpbnQzMl90PiA+JiBtYXBtYXAsIGNvbnN0IGludDMyX3QgaGVsbG8pIHsKKyAgdm9pZCB0ZXN0TWFwTWFwKG1hcDxpbnQzMl90LCBtYXA8aW50MzJfdCwgaW50MzJfdD4gPiYgbWFwbWFwLCBjb25zdCBpbnQzMl90IGhlbGxvKSBvdmVycmlkZSB7CiAgICAgcHJpbnRmKCJ0ZXN0TWFwTWFwKCVkKVxuIiwgaGVsbG8pOwogCiAgICAgbWFwPGludDMyX3QsIGludDMyX3Q+IHBvczsKQEAgLTIyMCwzNSArMjQxLDE1IEBACiAgICAgbWFwbWFwLmluc2VydChtYWtlX3BhaXIoLTQsIG5lZykpOwogICB9CiAKLSAgdm9pZCB0ZXN0SW5zYW5pdHkobWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+JiBpbnNhbmUsIGNvbnN0IEluc2FuaXR5JiBhcmd1bWVudCkgewotICAgICh2b2lkKWFyZ3VtZW50OworICB2b2lkIHRlc3RJbnNhbml0eShtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4mIGluc2FuZSwgY29uc3QgSW5zYW5pdHkmIGFyZ3VtZW50KSBvdmVycmlkZSB7CiAgICAgcHJpbnRmKCJ0ZXN0SW5zYW5pdHkoKVxuIik7CiAKLSAgICBYdHJ1Y3QgaGVsbG87Ci0gICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7Ci0gICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKLSAgICBoZWxsby5pNjRfdGhpbmcgPSAyOwotCi0gICAgWHRydWN0IGdvb2RieWU7Ci0gICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOwotICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IDQ7Ci0gICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OwotICAgIGdvb2RieWUuaTY0X3RoaW5nID0gNDsKLQotICAgIEluc2FuaXR5IGNyYXp5OwotICAgIGNyYXp5LnVzZXJNYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpFSUdIVCwgOCkpOwotICAgIGNyYXp5Lnh0cnVjdHMucHVzaF9iYWNrKGdvb2RieWUpOwotCiAgICAgSW5zYW5pdHkgbG9vbmV5OwotICAgIGNyYXp5LnVzZXJNYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpGSVZFLCA1KSk7Ci0gICAgY3JhenkueHRydWN0cy5wdXNoX2JhY2soaGVsbG8pOwotCiAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiBmaXJzdF9tYXA7CiAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiBzZWNvbmRfbWFwOwogCi0gICAgZmlyc3RfbWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6VFdPLCBjcmF6eSkpOwotICAgIGZpcnN0X21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlRIUkVFLCBjcmF6eSkpOworICAgIGZpcnN0X21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlRXTywgYXJndW1lbnQpKTsKKyAgICBmaXJzdF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpUSFJFRSwgYXJndW1lbnQpKTsKIAogICAgIHNlY29uZF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpTSVgsIGxvb25leSkpOwogCkBAIC0yOTYsNyArMjk3LDcgQEAKICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBhcmcyLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxpbnQxNl90LCBzdGQ6OnN0cmluZz4mIGFyZzMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IE51bWJlcno6OnR5cGUgYXJnNCwKLSAgICAgICAgICAgICAgICAgY29uc3QgVXNlcklkIGFyZzUpIHsKKyAgICAgICAgICAgICAgICAgY29uc3QgVXNlcklkIGFyZzUpIG92ZXJyaWRlIHsKICAgICAodm9pZClhcmczOwogICAgICh2b2lkKWFyZzQ7CiAgICAgKHZvaWQpYXJnNTsKQEAgLTMwOSw3ICszMTAsNyBAQAogICAgIGhlbGxvLmk2NF90aGluZyA9IChpbnQ2NF90KWFyZzI7CiAgIH0KIAotICB2b2lkIHRlc3RFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGFyZykgeworICB2b2lkIHRlc3RFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGFyZykgb3ZlcnJpZGUgewogICAgIHByaW50ZigidGVzdEV4Y2VwdGlvbiglcylcbiIsIGFyZy5jX3N0cigpKTsKICAgICBpZiAoYXJnLmNvbXBhcmUoIlhjZXB0aW9uIikgPT0gMCkgewogICAgICAgWGNlcHRpb24gZTsKQEAgLTMyOCw3ICszMjksNyBAQAogCiAgIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKFh0cnVjdCYgcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZzEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZzEpIG92ZXJyaWRlIHsKIAogICAgIHByaW50ZigidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsIGFyZzAuY19zdHIoKSwgYXJnMS5jX3N0cigpKTsKIApAQCAtMzQ4LDM2ICszNDksNDEgQEAKICAgICB9CiAgIH0KIAotICB2b2lkIHRlc3RPbmV3YXkoY29uc3QgaW50MzJfdCBzbGVlcEZvcikgewotICAgIHByaW50ZigidGVzdE9uZXdheSglZCk6IFNsZWVwaW5nLi4uXG4iLCBzbGVlcEZvcik7Ci0gICAgVEhSSUZUX1NMRUVQX1NFQyhzbGVlcEZvcik7Ci0gICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogZG9uZSBzbGVlcGluZyFcbiIsIHNsZWVwRm9yKTsKKyAgdm9pZCB0ZXN0T25ld2F5KGNvbnN0IGludDMyX3QgYU51bSkgb3ZlcnJpZGUgeworICAgIHByaW50ZigidGVzdE9uZXdheSglZCk6IGNhbGwgcmVjZWl2ZWRcbiIsIGFOdW0pOwogICB9CiB9OwogCitjbGFzcyBTZWNvbmRIYW5kbGVyIDogcHVibGljIFNlY29uZFNlcnZpY2VJZgoreworICBwdWJsaWM6CisgICAgdm9pZCBzZWNvbmR0ZXN0U3RyaW5nKHN0ZDo6c3RyaW5nJiByZXN1bHQsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aGluZykgb3ZlcnJpZGUKKyAgICB7IHJlc3VsdCA9ICJ0ZXN0U3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKSI7IH0KK307CisKIGNsYXNzIFRlc3RQcm9jZXNzb3JFdmVudEhhbmRsZXIgOiBwdWJsaWMgVFByb2Nlc3NvckV2ZW50SGFuZGxlciB7Ci0gIHZpcnR1YWwgdm9pZCogZ2V0Q29udGV4dChjb25zdCBjaGFyKiBmbl9uYW1lLCB2b2lkKiBzZXJ2ZXJDb250ZXh0KSB7CisgIHZvaWQqIGdldENvbnRleHQoY29uc3QgY2hhciogZm5fbmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgb3ZlcnJpZGUgewogICAgICh2b2lkKXNlcnZlckNvbnRleHQ7CiAgICAgcmV0dXJuIG5ldyBzdGQ6OnN0cmluZyhmbl9uYW1lKTsKICAgfQotICB2aXJ0dWFsIHZvaWQgZnJlZUNvbnRleHQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CisgIHZvaWQgZnJlZUNvbnRleHQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSBvdmVycmlkZSB7CiAgICAgKHZvaWQpZm5fbmFtZTsKICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmcqPihjdHgpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCBwcmVSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeyBjb21tdW5pY2F0ZSgicHJlUmVhZCIsIGN0eCwgZm5fbmFtZSk7IH0KLSAgdmlydHVhbCB2b2lkIHBvc3RSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKKyAgdm9pZCBwcmVSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgb3ZlcnJpZGUgeyBjb21tdW5pY2F0ZSgicHJlUmVhZCIsIGN0eCwgZm5fbmFtZSk7IH0KKyAgdm9pZCBwb3N0UmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUsIHVpbnQzMl90IGJ5dGVzKSBvdmVycmlkZSB7CiAgICAgKHZvaWQpYnl0ZXM7CiAgICAgY29tbXVuaWNhdGUoInBvc3RSZWFkIiwgY3R4LCBmbl9uYW1lKTsKICAgfQotICB2aXJ0dWFsIHZvaWQgcHJlV3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7IGNvbW11bmljYXRlKCJwcmVXcml0ZSIsIGN0eCwgZm5fbmFtZSk7IH0KLSAgdmlydHVhbCB2b2lkIHBvc3RXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgIHZvaWQgcHJlV3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSBvdmVycmlkZSB7IGNvbW11bmljYXRlKCJwcmVXcml0ZSIsIGN0eCwgZm5fbmFtZSk7IH0KKyAgdm9pZCBwb3N0V3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lLCB1aW50MzJfdCBieXRlcykgb3ZlcnJpZGUgewogICAgICh2b2lkKWJ5dGVzOwogICAgIGNvbW11bmljYXRlKCJwb3N0V3JpdGUiLCBjdHgsIGZuX25hbWUpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCBhc3luY0NvbXBsZXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeworICB2b2lkIGFzeW5jQ29tcGxldGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSBvdmVycmlkZSB7CiAgICAgY29tbXVuaWNhdGUoImFzeW5jQ29tcGxldGUiLCBjdHgsIGZuX25hbWUpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCBoYW5kbGVyRXJyb3Iodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CisgIHZvaWQgaGFuZGxlckVycm9yKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgb3ZlcnJpZGUgewogICAgIGNvbW11bmljYXRlKCJoYW5kbGVyRXJyb3IiLCBjdHgsIGZuX25hbWUpOwogICB9CiAKQEAgLTM4OCwxMzcgKzM5NCwxMzcgQEAKIAogY2xhc3MgVGVzdEhhbmRsZXJBc3luYyA6IHB1YmxpYyBUaHJpZnRUZXN0Q29iU3ZJZiB7CiBwdWJsaWM6Ci0gIFRlc3RIYW5kbGVyQXN5bmMoYm9vc3Q6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+JiBoYW5kbGVyKSA6IF9kZWxlZ2F0ZShoYW5kbGVyKSB7fQotICB2aXJ0dWFsIH5UZXN0SGFuZGxlckFzeW5jKCkge30KKyAgVGVzdEhhbmRsZXJBc3luYyhzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+JiBoYW5kbGVyKSA6IF9kZWxlZ2F0ZShoYW5kbGVyKSB7fQorICB+VGVzdEhhbmRsZXJBc3luYygpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAotICB2aXJ0dWFsIHZvaWQgdGVzdFZvaWQodGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IpIHsKKyAgdm9pZCB0ZXN0Vm9pZChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iKSBvdmVycmlkZSB7CiAgICAgX2RlbGVnYXRlLT50ZXN0Vm9pZCgpOwogICAgIGNvYigpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RTdHJpbmcodGN4eDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKSB7CisgIHZvaWQgdGVzdFN0cmluZyhzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aGluZykgb3ZlcnJpZGUgewogICAgIHN0ZDo6c3RyaW5nIHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RTdHJpbmcocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEJvb2wodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBib29sIHRoaW5nKSB7CisgIHZvaWQgdGVzdEJvb2woc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGJvb2wgdGhpbmcpIG92ZXJyaWRlIHsKICAgICBib29sIHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEJvb2wodGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RCeXRlKHRjeHg6OmZ1bmN0aW9uPHZvaWQoaW50OF90IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQ4X3QgdGhpbmcpIHsKKyAgdm9pZCB0ZXN0Qnl0ZShzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50OF90IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQ4X3QgdGhpbmcpIG92ZXJyaWRlIHsKICAgICBpbnQ4X3QgcmVzID0gX2RlbGVnYXRlLT50ZXN0Qnl0ZSh0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEkzMih0Y3h4OjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDMyX3QgdGhpbmcpIHsKKyAgdm9pZCB0ZXN0STMyKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQzMl90IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQzMl90IHRoaW5nKSBvdmVycmlkZSB7CiAgICAgaW50MzJfdCByZXMgPSBfZGVsZWdhdGUtPnRlc3RJMzIodGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RJNjQodGN4eDo6ZnVuY3Rpb248dm9pZChpbnQ2NF90IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQ2NF90IHRoaW5nKSB7CisgIHZvaWQgdGVzdEk2NChzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50NjRfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50NjRfdCB0aGluZykgb3ZlcnJpZGUgewogICAgIGludDY0X3QgcmVzID0gX2RlbGVnYXRlLT50ZXN0STY0KHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0RG91YmxlKHRjeHg6OmZ1bmN0aW9uPHZvaWQoZG91YmxlIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBkb3VibGUgdGhpbmcpIHsKKyAgdm9pZCB0ZXN0RG91YmxlKHN0ZDo6ZnVuY3Rpb248dm9pZChkb3VibGUgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGRvdWJsZSB0aGluZykgb3ZlcnJpZGUgewogICAgIGRvdWJsZSByZXMgPSBfZGVsZWdhdGUtPnRlc3REb3VibGUodGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RCaW5hcnkodGN4eDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKSB7CisgIHZvaWQgdGVzdEJpbmFyeShzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aGluZykgb3ZlcnJpZGUgewogICAgIHN0ZDo6c3RyaW5nIHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RCaW5hcnkocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdFN0cnVjdCh0Y3h4OjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgWHRydWN0JiB0aGluZykgeworICB2b2lkIHRlc3RTdHJ1Y3Qoc3RkOjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgWHRydWN0JiB0aGluZykgb3ZlcnJpZGUgewogICAgIFh0cnVjdCByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0U3RydWN0KHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3ROZXN0KHRjeHg6OmZ1bmN0aW9uPHZvaWQoWHRydWN0MiBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgWHRydWN0MiYgdGhpbmcpIHsKKyAgdm9pZCB0ZXN0TmVzdChzdGQ6OmZ1bmN0aW9uPHZvaWQoWHRydWN0MiBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgWHRydWN0MiYgdGhpbmcpIG92ZXJyaWRlIHsKICAgICBYdHJ1Y3QyIHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3ROZXN0KHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RNYXAodGN4eDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiBjb25zdCYgX3JldHVybik+IGNvYiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4mIHRoaW5nKSB7CisgIHZvaWQgdGVzdE1hcChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+JiB0aGluZykgb3ZlcnJpZGUgewogICAgIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RNYXAocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdFN0cmluZ01hcCgKLSAgICAgIHRjeHg6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBjb25zdCYgX3JldHVybik+IGNvYiwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHRoaW5nKSB7CisgIHZvaWQgdGVzdFN0cmluZ01hcCgKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdGhpbmcpIG92ZXJyaWRlIHsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RTdHJpbmdNYXAocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdFNldCh0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2V0PGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxpbnQzMl90PiYgdGhpbmcpIHsKKyAgdm9pZCB0ZXN0U2V0KHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNldDxpbnQzMl90PiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8aW50MzJfdD4mIHRoaW5nKSBvdmVycmlkZSB7CiAgICAgc3RkOjpzZXQ8aW50MzJfdD4gcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdFNldChyZXMsIHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0TGlzdCh0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHRoaW5nKSB7CisgIHZvaWQgdGVzdExpc3Qoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHRoaW5nKSBvdmVycmlkZSB7CiAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdExpc3QocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEVudW0odGN4eDo6ZnVuY3Rpb248dm9pZChOdW1iZXJ6Ojp0eXBlIGNvbnN0JiBfcmV0dXJuKT4gY29iLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTnVtYmVyejo6dHlwZSB0aGluZykgeworICB2b2lkIHRlc3RFbnVtKHN0ZDo6ZnVuY3Rpb248dm9pZChOdW1iZXJ6Ojp0eXBlIGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTnVtYmVyejo6dHlwZSB0aGluZykgb3ZlcnJpZGUgewogICAgIE51bWJlcno6OnR5cGUgcmVzID0gX2RlbGVnYXRlLT50ZXN0RW51bSh0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdFR5cGVkZWYodGN4eDo6ZnVuY3Rpb248dm9pZChVc2VySWQgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IFVzZXJJZCB0aGluZykgeworICB2b2lkIHRlc3RUeXBlZGVmKHN0ZDo6ZnVuY3Rpb248dm9pZChVc2VySWQgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IFVzZXJJZCB0aGluZykgb3ZlcnJpZGUgewogICAgIFVzZXJJZCByZXMgPSBfZGVsZWdhdGUtPnRlc3RUeXBlZGVmKHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0TWFwTWFwKAotICAgICAgdGN4eDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiA+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAotICAgICAgY29uc3QgaW50MzJfdCBoZWxsbykgeworICB2b2lkIHRlc3RNYXBNYXAoCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8aW50MzJfdCwgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gPiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgIGNvbnN0IGludDMyX3QgaGVsbG8pIG92ZXJyaWRlIHsKICAgICBzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiA+IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RNYXBNYXAocmVzLCBoZWxsbyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEluc2FuaXR5KAotICAgICAgdGN4eDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxVc2VySWQsIHN0ZDo6bWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAotICAgICAgY29uc3QgSW5zYW5pdHkmIGFyZ3VtZW50KSB7CisgIHZvaWQgdGVzdEluc2FuaXR5KAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPFVzZXJJZCwgc3RkOjptYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBjb25zdCBJbnNhbml0eSYgYXJndW1lbnQpIG92ZXJyaWRlIHsKICAgICBzdGQ6Om1hcDxVc2VySWQsIHN0ZDo6bWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RJbnNhbml0eShyZXMsIGFyZ3VtZW50KTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0TXVsdGkodGN4eDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgIHZvaWQgdGVzdE11bHRpKHN0ZDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90IGFyZzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBhcmcxLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgYXJnMiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxpbnQxNl90LCBzdGQ6OnN0cmluZz4mIGFyZzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTnVtYmVyejo6dHlwZSBhcmc0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVzZXJJZCBhcmc1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXNlcklkIGFyZzUpIG92ZXJyaWRlIHsKICAgICBYdHJ1Y3QgcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdE11bHRpKHJlcywgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEV4Y2VwdGlvbigKLSAgICAgIHRjeHg6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLAotICAgICAgdGN4eDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gZXhuX2NvYiwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcpIHsKKyAgdm9pZCB0ZXN0RXhjZXB0aW9uKAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gZXhuX2NvYiwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcpIG92ZXJyaWRlIHsKICAgICB0cnkgewogICAgICAgX2RlbGVnYXRlLT50ZXN0RXhjZXB0aW9uKGFyZyk7CiAgICAgfSBjYXRjaCAoY29uc3QgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24mIGUpIHsKQEAgLTUyOCwxMSArNTM0LDExIEBACiAgICAgY29iKCk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKAotICAgICAgdGN4eDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsCi0gICAgICB0Y3h4OjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiBleG5fY29iLAorICB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbigKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IGV4bl9jb2IsCiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMCwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcxKSB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMSkgb3ZlcnJpZGUgewogICAgIFh0cnVjdCByZXM7CiAgICAgdHJ5IHsKICAgICAgIF9kZWxlZ2F0ZS0+dGVzdE11bHRpRXhjZXB0aW9uKHJlcywgYXJnMCwgYXJnMSk7CkBAIC01NDMsNTYgKzU0OSw1NyBAQAogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RPbmV3YXkodGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IGludDMyX3Qgc2Vjb25kc1RvU2xlZXApIHsKKyAgdm9pZCB0ZXN0T25ld2F5KHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IGludDMyX3Qgc2Vjb25kc1RvU2xlZXApIG92ZXJyaWRlIHsKICAgICBfZGVsZWdhdGUtPnRlc3RPbmV3YXkoc2Vjb25kc1RvU2xlZXApOwogICAgIGNvYigpOwogICB9CiAKIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IF9kZWxlZ2F0ZTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiBfZGVsZWdhdGU7CiB9OwogCituYW1lc3BhY2UgcG8gPSBib29zdDo6cHJvZ3JhbV9vcHRpb25zOworCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKIAotICBzdHJpbmcgZmlsZV9wYXRoID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnN5c3RlbV9jb21wbGV0ZShhcmd2WzBdKS5zdHJpbmcoKTsKLSAgc3RyaW5nIGRpcl9wYXRoID0gZmlsZV9wYXRoLnN1YnN0cigwLCBmaWxlX3BhdGguc2l6ZSgpIC0gRVhFQ1VUQUJMRV9GSUxFX05BTUVfTEVOR1RIKTsKKyAgc3RyaW5nIHRlc3REaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6c3lzdGVtX2NvbXBsZXRlKGFyZ3ZbMF0pLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnN0cmluZygpOworICBzdHJpbmcgY2VydFBhdGggPSB0ZXN0RGlyICsgIi9rZXlzL3NlcnZlci5jcnQiOworICBzdHJpbmcga2V5UGF0aCA9IHRlc3REaXIgKyAiL2tleXMvc2VydmVyLmtleSI7CiAKICNpZiBfV0lOMzIKICAgdHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CiAjZW5kaWYKICAgaW50IHBvcnQgPSA5MDkwOwogICBib29sIHNzbCA9IGZhbHNlOworICBib29sIHpsaWIgPSBmYWxzZTsKICAgc3RyaW5nIHRyYW5zcG9ydF90eXBlID0gImJ1ZmZlcmVkIjsKICAgc3RyaW5nIHByb3RvY29sX3R5cGUgPSAiYmluYXJ5IjsKICAgc3RyaW5nIHNlcnZlcl90eXBlID0gInNpbXBsZSI7CiAgIHN0cmluZyBkb21haW5fc29ja2V0ID0gIiI7CisgIGJvb2wgYWJzdHJhY3RfbmFtZXNwYWNlID0gZmFsc2U7CiAgIHNpemVfdCB3b3JrZXJzID0gNDsKKyAgaW50IHN0cmluZ19saW1pdCA9IDA7CisgIGludCBjb250YWluZXJfbGltaXQgPSAwOwogCi0gIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6Om9wdGlvbnNfZGVzY3JpcHRpb24gZGVzYygiQWxsb3dlZCBvcHRpb25zIik7Ci0gIGRlc2MuYWRkX29wdGlvbnMoKSgiaGVscCxoIiwgInByb2R1Y2UgaGVscCBtZXNzYWdlIikoCi0gICAgICAicG9ydCIsCi0gICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxpbnQ+KCZwb3J0KS0+ZGVmYXVsdF92YWx1ZShwb3J0KSwKLSAgICAgICJQb3J0IG51bWJlciB0byBsaXN0ZW4iKSgiZG9tYWluLXNvY2tldCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5kZWZhdWx0X3ZhbHVlKGRvbWFpbl9zb2NrZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbml4IERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCkiKSgKLSAgICAgICJzZXJ2ZXItdHlwZSIsCi0gICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZzZXJ2ZXJfdHlwZSktPmRlZmF1bHRfdmFsdWUoc2VydmVyX3R5cGUpLAotICAgICAgInR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiLCBcInRocmVhZC1wb29sXCIsIFwidGhyZWFkZWRcIiwgb3IgXCJub25ibG9ja2luZ1wiIikoCi0gICAgICAidHJhbnNwb3J0IiwKLSAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnRyYW5zcG9ydF90eXBlKS0+ZGVmYXVsdF92YWx1ZSh0cmFuc3BvcnRfdHlwZSksCi0gICAgICAidHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIikoCi0gICAgICAicHJvdG9jb2wiLAotICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmcHJvdG9jb2xfdHlwZSktPmRlZmF1bHRfdmFsdWUocHJvdG9jb2xfdHlwZSksCi0gICAgICAicHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiIpKCJzc2wiLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKSgKLSAgICAgICJwcm9jZXNzb3ItZXZlbnRzIiwKLSAgICAgICJwcm9jZXNzb3ItZXZlbnRzIikoIndvcmtlcnMsbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHNpemVfdD4oJndvcmtlcnMpLT5kZWZhdWx0X3ZhbHVlKHdvcmtlcnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiBPbmx5IHZhbGlkIGZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZSIpOworICBwbzo6b3B0aW9uc19kZXNjcmlwdGlvbiBkZXNjKCJBbGxvd2VkIG9wdGlvbnMiKTsKKyAgZGVzYy5hZGRfb3B0aW9ucygpCisgICAgKCJoZWxwLGgiLCAicHJvZHVjZSBoZWxwIG1lc3NhZ2UiKQorICAgICgicG9ydCIsIHBvOjp2YWx1ZTxpbnQ+KCZwb3J0KS0+ZGVmYXVsdF92YWx1ZShwb3J0KSwgIlBvcnQgbnVtYmVyIHRvIGxpc3RlbiIpCisgICAgKCJkb21haW4tc29ja2V0IiwgcG86OnZhbHVlPHN0cmluZz4oJmRvbWFpbl9zb2NrZXQpIC0+ZGVmYXVsdF92YWx1ZShkb21haW5fc29ja2V0KSwgIlVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSIpCisgICAgKCJhYnN0cmFjdC1uYW1lc3BhY2UiLCAiQ3JlYXRlIHRoZSBkb21haW4gc29ja2V0IGluIHRoZSBBYnN0cmFjdCBOYW1lc3BhY2UgKG5vIGNvbm5lY3Rpb24gd2l0aCBmaWxlc3lzdGVtIHBhdGhuYW1lcykiKQorICAgICgic2VydmVyLXR5cGUiLCBwbzo6dmFsdWU8c3RyaW5nPigmc2VydmVyX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHNlcnZlcl90eXBlKSwgInR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiLCBcInRocmVhZC1wb29sXCIsIFwidGhyZWFkZWRcIiwgb3IgXCJub25ibG9ja2luZ1wiIikKKyAgICAoInRyYW5zcG9ydCIsIHBvOjp2YWx1ZTxzdHJpbmc+KCZ0cmFuc3BvcnRfdHlwZSktPmRlZmF1bHRfdmFsdWUodHJhbnNwb3J0X3R5cGUpLCAidHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCB6bGliIikKKyAgICAoInByb3RvY29sIiwgcG86OnZhbHVlPHN0cmluZz4oJnByb3RvY29sX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHByb3RvY29sX3R5cGUpLCAicHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwgaGVhZGVyLCBqc29uLCBtdWx0aSwgbXVsdGljLCBtdWx0aWgsIG11bHRpaiIpCisgICAgKCJzc2wiLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQorICAgICgiemxpYiIsICJXcmFwcGVkIFRyYW5zcG9ydCB1c2luZyBabGliIikKKyAgICAoInByb2Nlc3Nvci1ldmVudHMiLCAicHJvY2Vzc29yLWV2ZW50cyIpCisgICAgKCJ3b3JrZXJzLG4iLCBwbzo6dmFsdWU8c2l6ZV90Pigmd29ya2VycyktPmRlZmF1bHRfdmFsdWUod29ya2VycyksICJOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlIikKKyAgICAoInN0cmluZy1saW1pdCIsIHBvOjp2YWx1ZTxpbnQ+KCZzdHJpbmdfbGltaXQpKQorICAgICgiY29udGFpbmVyLWxpbWl0IiwgcG86OnZhbHVlPGludD4oJmNvbnRhaW5lcl9saW1pdCkpOwogCi0gIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhcmlhYmxlc19tYXAgdm07Ci0gIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnN0b3JlKGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnBhcnNlX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBkZXNjKSwgdm0pOwotICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjpub3RpZnkodm0pOworICBwbzo6dmFyaWFibGVzX21hcCB2bTsKKyAgcG86OnN0b3JlKHBvOjpwYXJzZV9jb21tYW5kX2xpbmUoYXJnYywgYXJndiwgZGVzYyksIHZtKTsKKyAgcG86Om5vdGlmeSh2bSk7CiAKICAgaWYgKHZtLmNvdW50KCJoZWxwIikpIHsKICAgICBjb3V0IDw8IGRlc2MgPDwgIlxuIjsKQEAgLTYxNCw2ICs2MjEsMTEgQEAKICAgICAgIGlmIChwcm90b2NvbF90eXBlID09ICJiaW5hcnkiKSB7CiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImNvbXBhY3QiKSB7CiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGkiKSB7ICAvLyBtdWx0aXBsZXhlZCBiaW5hcnkKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgeyAvLyBtdWx0aXBsZXhlZCBjb21wYWN0CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpaCIpIHsgLy8gbXVsdGlwbGV4ZWQgaGVhZGVyCisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpaiIpIHsgLy8gbXVsdGlwbGV4ZWQganNvbgogICAgICAgfSBlbHNlIHsKICAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBwcm90b2NvbCB0eXBlICIgKyBwcm90b2NvbF90eXBlKTsKICAgICAgIH0KQEAgLTYyMyw2ICs2MzUsOCBAQAogICAgICAgaWYgKHRyYW5zcG9ydF90eXBlID09ICJidWZmZXJlZCIpIHsKICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImZyYW1lZCIpIHsKICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiKSB7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJ6bGliIikgeworICAgICAgICAvLyBjcm9zc3Rlc3RlciB3aWxsIHBhc3MgemxpYiBhcyBhIGZsYWcgYW5kIGEgdHJhbnNwb3J0IHJpZ2h0IG5vdy4uLgogICAgICAgfSBlbHNlIHsKICAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biB0cmFuc3BvcnQgdHlwZSAiICsgdHJhbnNwb3J0X3R5cGUpOwogICAgICAgfQpAQCAtNjM4LDg1ICs2NTIsMTI5IEBACiAgICAgc3NsID0gdHJ1ZTsKICAgfQogCi0gIC8vIERpc3BhdGNoZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5OwotICBpZiAocHJvdG9jb2xfdHlwZSA9PSAianNvbiIpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBqc29uUHJvdG9jb2xGYWN0b3J5KG5ldyBUSlNPTlByb3RvY29sRmFjdG9yeSgpKTsKLSAgICBwcm90b2NvbEZhY3RvcnkgPSBqc29uUHJvdG9jb2xGYWN0b3J5OwotICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImNvbXBhY3QiKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gY29tcGFjdFByb3RvY29sRmFjdG9yeShuZXcgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSk7Ci0gICAgcHJvdG9jb2xGYWN0b3J5ID0gY29tcGFjdFByb3RvY29sRmFjdG9yeTsKLSAgfSBlbHNlIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBiaW5hcnlQcm90b2NvbEZhY3RvcnkoCi0gICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUQnVmZmVyQmFzZT4oKSk7Ci0gICAgcHJvdG9jb2xGYWN0b3J5ID0gYmluYXJ5UHJvdG9jb2xGYWN0b3J5OworICBpZiAodm0uY291bnQoInpsaWIiKSkgeworICAgIHpsaWIgPSB0cnVlOwogICB9CiAKLSAgLy8gUHJvY2Vzc29yCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmlmdFRlc3RQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKKyNpZiBkZWZpbmVkKEhBVkVfU0lHTkFMX0gpICYmIGRlZmluZWQoU0lHUElQRSkKKyAgaWYgKHNzbCkgeworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsgLy8gZm9yIE9wZW5TU0wsIG90aGVyd2lzZSB3ZSBlbmQgYWJydXB0bHkKKyAgfQorI2VuZGlmCisKKyAgaWYgKHZtLmNvdW50KCJhYnN0cmFjdC1uYW1lc3BhY2UiKSkgeworICAgIGFic3RyYWN0X25hbWVzcGFjZSA9IHRydWU7CisgIH0KKworICAvLyBEaXNwYXRjaGVyCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3Rvcnk7CisgIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGpzb25Qcm90b2NvbEZhY3RvcnkobmV3IFRKU09OUHJvdG9jb2xGYWN0b3J5KCkpOworICAgIHByb3RvY29sRmFjdG9yeSA9IGpzb25Qcm90b2NvbEZhY3Rvcnk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgeworICAgIGF1dG8gKmNvbXBhY3RQcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPigpOworICAgIGNvbXBhY3RQcm90b2NvbEZhY3RvcnktPnNldENvbnRhaW5lclNpemVMaW1pdChjb250YWluZXJfbGltaXQpOworICAgIGNvbXBhY3RQcm90b2NvbEZhY3RvcnktPnNldFN0cmluZ1NpemVMaW1pdChzdHJpbmdfbGltaXQpOworICAgIHByb3RvY29sRmFjdG9yeS5yZXNldChjb21wYWN0UHJvdG9jb2xGYWN0b3J5KTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpaCIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaGVhZGVyUHJvdG9jb2xGYWN0b3J5KG5ldyBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KCkpOworICAgIHByb3RvY29sRmFjdG9yeSA9IGhlYWRlclByb3RvY29sRmFjdG9yeTsKKyAgfSBlbHNlIHsKKyAgICBhdXRvKiBiaW5hcnlQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQ8VEJ1ZmZlckJhc2U+KCk7CisgICAgYmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5zZXRDb250YWluZXJTaXplTGltaXQoY29udGFpbmVyX2xpbWl0KTsKKyAgICBiaW5hcnlQcm90b2NvbEZhY3RvcnktPnNldFN0cmluZ1NpemVMaW1pdChzdHJpbmdfbGltaXQpOworICAgIHByb3RvY29sRmFjdG9yeS5yZXNldChiaW5hcnlQcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgLy8gUHJvY2Vzc29ycworICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IHRlc3RIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKIAogICBpZiAodm0uY291bnQoInByb2Nlc3Nvci1ldmVudHMiKSkgewogICAgIHRlc3RQcm9jZXNzb3ItPnNldEV2ZW50SGFuZGxlcigKLSAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4obmV3IFRlc3RQcm9jZXNzb3JFdmVudEhhbmRsZXIoKSkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4obmV3IFRlc3RQcm9jZXNzb3JFdmVudEhhbmRsZXIoKSkpOwogICB9CiAKICAgLy8gVHJhbnNwb3J0Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBzc2xTb2NrZXRGYWN0b3J5OwotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gc3NsU29ja2V0RmFjdG9yeTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldDsKIAogICBpZiAoc3NsKSB7Ci0gICAgc3NsU29ja2V0RmFjdG9yeSA9IGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PihuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7Ci0gICAgc3NsU29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKChkaXJfcGF0aCArICIuLi9rZXlzL3NlcnZlci5jcnQiKS5jX3N0cigpKTsKLSAgICBzc2xTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleSgoZGlyX3BhdGggKyAiLi4va2V5cy9zZXJ2ZXIua2V5IikuY19zdHIoKSk7CisgICAgc3NsU29ja2V0RmFjdG9yeSA9IHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4obmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICAgIHNzbFNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0UGF0aC5jX3N0cigpKTsKKyAgICBzc2xTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShrZXlQYXRoLmNfc3RyKCkpOwogICAgIHNzbFNvY2tldEZhY3RvcnktPmNpcGhlcnMoIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIpOwotICAgIHNlcnZlclNvY2tldCA9IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU1NMU2VydmVyU29ja2V0KHBvcnQsIHNzbFNvY2tldEZhY3RvcnkpKTsKKyAgICBpZiAoc2VydmVyX3R5cGUgIT0gIm5vbmJsb2NraW5nIikgeworICAgICAgc2VydmVyU29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU1NMU2VydmVyU29ja2V0KHBvcnQsIHNzbFNvY2tldEZhY3RvcnkpKTsKKyAgICB9CiAgIH0gZWxzZSB7CiAgICAgaWYgKGRvbWFpbl9zb2NrZXQgIT0gIiIpIHsKLSAgICAgIHVubGluayhkb21haW5fc29ja2V0LmNfc3RyKCkpOwotICAgICAgc2VydmVyU29ja2V0ID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQoZG9tYWluX3NvY2tldCkpOworICAgICAgaWYgKGFic3RyYWN0X25hbWVzcGFjZSkgeworICAgICAgICBzdGQ6OnN0cmluZyBhYnN0cmFjdF9zb2NrZXQoIlwwIiwgMSk7CisgICAgICAgIGFic3RyYWN0X3NvY2tldCArPSBkb21haW5fc29ja2V0OworICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQoYWJzdHJhY3Rfc29ja2V0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB1bmxpbmsoZG9tYWluX3NvY2tldC5jX3N0cigpKTsKKyAgICAgICAgc2VydmVyU29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU2VydmVyU29ja2V0KGRvbWFpbl9zb2NrZXQpKTsKKyAgICAgIH0KICAgICAgIHBvcnQgPSAwOwogICAgIH0gZWxzZSB7Ci0gICAgICBzZXJ2ZXJTb2NrZXQgPSBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOwogICAgIH0KICAgfQogCiAgIC8vIEZhY3RvcnkKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3Rvcnk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeTsKIAogICBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiICYmIHNlcnZlcl90eXBlICE9ICJub25ibG9ja2luZyIpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaHR0cFRyYW5zcG9ydEZhY3RvcnkobmV3IFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSgpKTsKLSAgICB0cmFuc3BvcnRGYWN0b3J5ID0gaHR0cFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5PigpOwogICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGZyYW1lZFRyYW5zcG9ydEZhY3RvcnkobmV3IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCkpOwotICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBmcmFtZWRUcmFuc3BvcnRGYWN0b3J5OworICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5PigpOwogICB9IGVsc2UgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBidWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7Ci0gICAgdHJhbnNwb3J0RmFjdG9yeSA9IGJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKKyAgICB0cmFuc3BvcnRGYWN0b3J5ID0gc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpOworICB9CisKKyAgaWYgKHpsaWIpIHsKKyAgICAvLyBobW0uLiBkb2Vzbid0IHNlZW0gdG8gYmUgYSB3YXkgdG8gbWFrZSBpdCB3cmFwIHRoZSBvdGhlcnMuLi4KKyAgICB0cmFuc3BvcnRGYWN0b3J5ID0gc3RkOjptYWtlX3NoYXJlZDxUWmxpYlRyYW5zcG9ydEZhY3Rvcnk+KCk7CiAgIH0KIAogICAvLyBTZXJ2ZXIgSW5mbwogICBjb3V0IDw8ICJTdGFydGluZyBcIiIgPDwgc2VydmVyX3R5cGUgPDwgIlwiIHNlcnZlciAoIiA8PCB0cmFuc3BvcnRfdHlwZSA8PCAiLyIgPDwgcHJvdG9jb2xfdHlwZQotICAgICAgIDw8ICIpIGxpc3RlbiBvbjogIiA8PCBkb21haW5fc29ja2V0OworICAgICAgIDw8ICIpIGxpc3RlbiBvbjogIjsKKyAgaWYgKGFic3RyYWN0X25hbWVzcGFjZSkgeworICAgIGNvdXQgPDwgJ0AnOworICB9CisgIGNvdXQgPDwgZG9tYWluX3NvY2tldDsKICAgaWYgKHBvcnQgIT0gMCkgewogICAgIGNvdXQgPDwgcG9ydDsKICAgfQogICBjb3V0IDw8IGVuZGw7CiAKKyAgLy8gTXVsdGlwbGV4ZWQgUHJvY2Vzc29yIGlmIG5lZWRlZAorICBpZiAoYm9vc3Q6OnN0YXJ0c193aXRoKHByb3RvY29sX3R5cGUsICJtdWx0aSIpKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlY29uZEhhbmRsZXI+IHNlY29uZEhhbmRsZXIobmV3IFNlY29uZEhhbmRsZXIoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlY29uZFNlcnZpY2VQcm9jZXNzb3I+IHNlY29uZFByb2Nlc3NvcihuZXcgU2Vjb25kU2VydmljZVByb2Nlc3NvcihzZWNvbmRIYW5kbGVyKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE11bHRpcGxleGVkUHJvY2Vzc29yPiBtdWx0aXBsZXhlZFByb2Nlc3NvcihuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCkpOworICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLT5yZWdpc3RlckRlZmF1bHQodGVzdFByb2Nlc3Nvcik7IC8vIG5vbi1tdWx0aSBjbGllbnRzIGdvIHRvIHRoZSBkZWZhdWx0IHByb2Nlc3NvciAobXVsdGk6YmluYXJ5LCBtdWx0aWM6Y29tcGFjdCwgLi4uKQorICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigiVGhyaWZ0VGVzdCIsIHRlc3RQcm9jZXNzb3IpOworICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigiU2Vjb25kU2VydmljZSIsIHNlY29uZFByb2Nlc3Nvcik7CisgICAgdGVzdFByb2Nlc3NvciA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFByb2Nlc3Nvcj4obXVsdGlwbGV4ZWRQcm9jZXNzb3IpOworICB9CisKICAgLy8gU2VydmVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXI+IHNlcnZlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXI+IHNlcnZlcjsKIAogICBpZiAoc2VydmVyX3R5cGUgPT0gInNpbXBsZSIpIHsKICAgICBzZXJ2ZXIucmVzZXQobmV3IFRTaW1wbGVTZXJ2ZXIodGVzdFByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKICAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJzKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PihuZXcgVGhyZWFkRmFjdG9yeSgpKTsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQotICAgICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKLQorICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJzKTsKICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwotCiAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKIAogICAgIHNlcnZlci5yZXNldChuZXcgVFRocmVhZFBvb2xTZXJ2ZXIodGVzdFByb2Nlc3NvciwKQEAgLTcyNSwxNSArNzgzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRNYW5hZ2VyKSk7CiAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gInRocmVhZGVkIikgewotCiAgICAgc2VydmVyLnJlc2V0KAogICAgICAgICBuZXcgVFRocmVhZGVkU2VydmVyKHRlc3RQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CiAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gIm5vbmJsb2NraW5nIikgewogICAgIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiaHR0cCIpIHsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyQXN5bmM+IHRlc3RIYW5kbGVyQXN5bmMobmV3IFRlc3RIYW5kbGVyQXN5bmModGVzdEhhbmRsZXIpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvckFzeW5jKAorICAgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyQXN5bmM+IHRlc3RIYW5kbGVyQXN5bmMobmV3IFRlc3RIYW5kbGVyQXN5bmModGVzdEhhbmRsZXIpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3JBc3luYygKICAgICAgICAgICBuZXcgVGhyaWZ0VGVzdEFzeW5jUHJvY2Vzc29yKHRlc3RIYW5kbGVyQXN5bmMpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gdGVzdEJ1ZmZlclByb2Nlc3NvcigKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHRlc3RCdWZmZXJQcm9jZXNzb3IoCiAgICAgICAgICAgbmV3IFRBc3luY1Byb3RvY29sUHJvY2Vzc29yKHRlc3RQcm9jZXNzb3JBc3luYywgcHJvdG9jb2xGYWN0b3J5KSk7CiAKICAgICAgIC8vIG5vdCBsb2FkaW5nIG5vbmJsb2NraW5nU2VydmVyIGludG8gInNlcnZlciIgYmVjYXVzZQpAQCAtNzQxLDI2ICs3OTgsNDEgQEAKICAgICAgIC8vIHByb3ZpZGUgYSBzdG9wIG1ldGhvZC4KICAgICAgIFRFdmh0dHBTZXJ2ZXIgbm9uYmxvY2tpbmdTZXJ2ZXIodGVzdEJ1ZmZlclByb2Nlc3NvciwgcG9ydCk7CiAgICAgICBub25ibG9ja2luZ1NlcnZlci5zZXJ2ZSgpOworICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImZyYW1lZCIpIHsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4gbmJTb2NrZXQ7CisgICAgICBuYlNvY2tldC5yZXNldCgKKyAgICAgICAgICBzc2wgPyBuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgc3NsU29ja2V0RmFjdG9yeSkKKyAgICAgICAgICAgICAgOiBuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgc2VydmVyLnJlc2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIodGVzdFByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBuYlNvY2tldCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICBzZXJ2ZXIucmVzZXQobmV3IFROb25ibG9ja2luZ1NlcnZlcih0ZXN0UHJvY2Vzc29yLCBwb3J0KSk7CisgICAgICBjZXJyIDw8ICJzZXJ2ZXItdHlwZSBub25ibG9ja2luZyByZXF1aXJlcyB0cmFuc3BvcnQgb2YgaHR0cCBvciBmcmFtZWQiIDw8IGVuZGw7CisgICAgICBleGl0KDEpOwogICAgIH0KICAgfQogCi0gIGlmIChzZXJ2ZXIuZ2V0KCkgIT0gTlVMTCkgewotICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5IGZhY3Rvcnk7Ci0gICAgZmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZT4gc2VydmVyVGhyZWFkUnVubmVyKHNlcnZlcik7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZAotICAgICAgICA9IGZhY3RvcnkubmV3VGhyZWFkKHNlcnZlclRocmVhZFJ1bm5lcik7Ci0gICAgdGhyZWFkLT5zdGFydCgpOwotCi0gICAgLy8gSEFDSzogY3Jvc3MgbGFuZ3VhZ2UgdGVzdCBzdWl0ZSBpcyB1bmFibGUgdG8gaGFuZGxlIGNpbiBwcm9wZXJseQotICAgIC8vICAgICAgIHRoYXQncyB3aHkgd2Ugc3RheSBpbiBhIGVuZGxlc3MgbG9vcCBoZXJlCi0gICAgd2hpbGUgKDEpIHsKKyAgaWYgKHNlcnZlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIpIHsKKyAgICAgIC8vIFRlbGwgdGhlIHNlcnZlciB0byB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgZm9yIGlucHV0IC8gb3V0cHV0CisgICAgICAvLyBpZiB1c2luZyBoZWFkZXIKKyAgICAgIHNlcnZlci0+c2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PigpKTsKICAgICB9Ci0gICAgLy8gRklYTUU6IGZpbmQgYW5vdGhlciB3YXkgdG8gc3RvcCB0aGUgc2VydmVyIChlLmcuIGEgc2lnbmFsKQotICAgIC8vIGNvdXQ8PCJQcmVzcyBlbnRlciB0byBzdG9wIHRoZSBzZXJ2ZXIuIjw8ZW5kbDsKLSAgICAvLyBjaW4uaWdub3JlKCk7IC8vd2FpdCB1bnRpbCBhIGtleSBpcyBwcmVzc2VkCisgICAgCisgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5IGZhY3Rvcnk7CisgICAgZmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU+IHNlcnZlclRocmVhZFJ1bm5lcihzZXJ2ZXIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkCisgICAgICAgID0gZmFjdG9yeS5uZXdUaHJlYWQoc2VydmVyVGhyZWFkUnVubmVyKTsKKworI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyAgICBzaWduYWwoU0lHSU5ULCBzaWduYWxfaGFuZGxlcik7CisjZW5kaWYKKworICAgIHRocmVhZC0+c3RhcnQoKTsKKyAgICBnTW9uaXRvci53YWl0Rm9yZXZlcigpOyAgICAgICAgIC8vIHdhaXQgZm9yIGEgc2h1dGRvd24gc2lnbmFsCisgICAgCisjaWZkZWYgSEFWRV9TSUdOQUxfSAorICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworI2VuZGlmCiAKICAgICBzZXJ2ZXItPnN0b3AoKTsKICAgICB0aHJlYWQtPmpvaW4oKTsKQEAgLTc3MCwzICs4NDIsNCBAQAogICBjb3V0IDw8ICJkb25lLiIgPDwgZW5kbDsKICAgcmV0dXJuIDA7CiB9CisKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvX19pbml0X18ucHkgYi90ZXN0L2Nyb3NzcnVubmVyL19faW5pdF9fLnB5CmluZGV4IDA2ZGUyZDAuLjlkMGI4M2EgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3Jvc3NydW5uZXIvX19pbml0X18ucHkKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9fX2luaXRfXy5weQpAQCAtMTcsOSArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBjcm9zc3J1bm5lci50ZXN0IGltcG9ydCB0ZXN0X25hbWUKLWZyb20gY3Jvc3NydW5uZXIuY29sbGVjdCBpbXBvcnQgY29sbGVjdF90ZXN0cwotZnJvbSBjcm9zc3J1bm5lci5ydW4gaW1wb3J0IFRlc3REaXNwYXRjaGVyCi1mcm9tIGNyb3NzcnVubmVyLnJlcG9ydCBpbXBvcnQgZ2VuZXJhdGVfa25vd25fZmFpbHVyZXMKLWZyb20gY3Jvc3NydW5uZXIucmVwb3J0IGltcG9ydCBsb2FkX2tub3duX2ZhaWx1cmVzCi1mcm9tIGNyb3NzcnVubmVyLnByZXBhcmUgaW1wb3J0IHByZXBhcmUKK2Zyb20gLnRlc3QgaW1wb3J0IHRlc3RfbmFtZSAgIyBub3FhCitmcm9tIC5jb2xsZWN0IGltcG9ydCBjb2xsZWN0X2Nyb3NzX3Rlc3RzLCBjb2xsZWN0X2ZlYXR1cmVfdGVzdHMgICMgbm9xYQorZnJvbSAucnVuIGltcG9ydCBUZXN0RGlzcGF0Y2hlciAgIyBub3FhCitmcm9tIC5yZXBvcnQgaW1wb3J0IGdlbmVyYXRlX2tub3duX2ZhaWx1cmVzLCBsb2FkX2tub3duX2ZhaWx1cmVzICAjIG5vcWEKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weQppbmRleCAxNDVhZmVmLi5lMmQ4OTc4IDEwMDY0NAotLS0gYS90ZXN0L2Nyb3NzcnVubmVyL2NvbGxlY3QucHkKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9jb2xsZWN0LnB5CkBAIC0xOCw5ICsxOCwxMSBAQAogIwogCiBpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByZQogZnJvbSBpdGVydG9vbHMgaW1wb3J0IHByb2R1Y3QKIAotZnJvbSBjcm9zc3J1bm5lci51dGlsIGltcG9ydCBtZXJnZV9kaWN0Citmcm9tIC51dGlsIGltcG9ydCBtZXJnZV9kaWN0Citmcm9tIC50ZXN0IGltcG9ydCBUZXN0RW50cnkKIAogIyBUaG9zZSBrZXlzIGFyZSBwYXNzZWQgdG8gZXhlY3V0aW9uIGFzIGlzLgogIyBOb3RlIHRoYXQgdGhlcmUgYXJlIGtleXMgb3RoZXIgdGhhbiB0aGVzZSwgbmFtZWx5OgpAQCAtMzksMTA0ICs0MSwxMjQgQEAKICMgKGUuZy4gImJpbmFyeSIgaXMgZXF1aXZhbGVudCB0byAiYmluYXJ5OmJpbmFyeSIgaW4gdGVzdHMuanNvbikKICMKIFZBTElEX0pTT05fS0VZUyA9IFsKLSAgJ25hbWUnLCAgIyBuYW1lIG9mIHRoZSBsaWJyYXJ5LCB0eXBpY2FsbHkgYSBsYW5ndWFnZSBuYW1lCi0gICd3b3JrZGlyJywgICMgd29yayBkaXJlY3Rvcnkgd2hlcmUgY29tbWFuZCBpcyBleGVjdXRlZAotICAnY29tbWFuZCcsICAjIHRlc3QgY29tbWFuZAotICAnZXh0cmFfYXJncycsICAjIGFyZ3MgYXBwZW5kZWQgdG8gY29tbWFuZCBhZnRlciBvdGhlciBhcmdzIGFyZSBhcHBlbmRlZAotICAnam9pbl9hcmdzJywgICMgd2hldGhlciBhcmdzIHNob3VsZCBiZSBwYXNzZWQgYXMgc2luZ2xlIGNvbmNhdGVuYXRlZCBzdHJpbmcKLSAgJ2VudicsICAjIGFkZGl0aW9uYWwgZW52aXJvbm1lbnRhbCB2YXJpYWJsZQorICAgICduYW1lJywgICMgbmFtZSBvZiB0aGUgbGlicmFyeSwgdHlwaWNhbGx5IGEgbGFuZ3VhZ2UgbmFtZQorICAgICd3b3JrZGlyJywgICMgd29yayBkaXJlY3Rvcnkgd2hlcmUgY29tbWFuZCBpcyBleGVjdXRlZAorICAgICdjb21tYW5kJywgICMgdGVzdCBjb21tYW5kCisgICAgJ2V4dHJhX2FyZ3MnLCAgIyBhcmdzIGFwcGVuZGVkIHRvIGNvbW1hbmQgYWZ0ZXIgb3RoZXIgYXJncyBhcmUgYXBwZW5kZWQKKyAgICAncmVtb3RlX2FyZ3MnLCAgIyBhcmdzIGFkZGVkIHRvIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBwcm9ncmFtCisgICAgJ2pvaW5fYXJncycsICAjIHdoZXRoZXIgYXJncyBzaG91bGQgYmUgcGFzc2VkIGFzIHNpbmdsZSBjb25jYXRlbmF0ZWQgc3RyaW5nCisgICAgJ2VudicsICAjIGFkZGl0aW9uYWwgZW52aXJvbm1lbnRhbCB2YXJpYWJsZQogXQogCi1ERUZBVUxUX0RFTEFZID0gMQorREVGQVVMVF9NQVhfREVMQVkgPSA1CitERUZBVUxUX1NJR05BTCA9IDEKIERFRkFVTFRfVElNRU9VVCA9IDUKIAogCi1kZWYgY29sbGVjdF90ZXN0bGlicyhjb25maWcsIHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoKToKLSAgIiIiQ29sbGVjdHMgc2VydmVyL2NsaWVudCBjb25maWd1cmF0aW9ucyBmcm9tIGxpYnJhcnkgY29uZmlndXJhdGlvbnMiIiIKLSAgZGVmIGV4cGFuZF9saWJzKGNvbmZpZyk6Ci0gICAgZm9yIGxpYiBpbiBjb25maWc6Ci0gICAgICBzdiA9IGxpYi5wb3AoJ3NlcnZlcicsIE5vbmUpCi0gICAgICBjbCA9IGxpYi5wb3AoJ2NsaWVudCcsIE5vbmUpCi0gICAgICB5aWVsZCBsaWIsIHN2LCBjbAorZGVmIF9jb2xsZWN0X3Rlc3RsaWJzKGNvbmZpZywgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2g9W05vbmVdKToKKyAgICAiIiJDb2xsZWN0cyBzZXJ2ZXIvY2xpZW50IGNvbmZpZ3VyYXRpb25zIGZyb20gbGlicmFyeSBjb25maWd1cmF0aW9ucyIiIgorICAgIGRlZiBleHBhbmRfbGlicyhjb25maWcpOgorICAgICAgICBmb3IgbGliIGluIGNvbmZpZzoKKyAgICAgICAgICAgIHN2ID0gbGliLnBvcCgnc2VydmVyJywgTm9uZSkKKyAgICAgICAgICAgIGNsID0gbGliLnBvcCgnY2xpZW50JywgTm9uZSkKKyAgICAgICAgICAgIHlpZWxkIGxpYiwgc3YsIGNsCiAKLSAgZGVmIHlpZWxkX3Rlc3RsaWJzKGJhc2VfY29uZmlncywgY29uZmlncywgbWF0Y2gpOgotICAgIGZvciBiYXNlLCBjb25mIGluIHppcChiYXNlX2NvbmZpZ3MsIGNvbmZpZ3MpOgotICAgICAgaWYgY29uZjoKLSAgICAgICAgaWYgbm90IG1hdGNoIG9yIGJhc2VbJ25hbWUnXSBpbiBtYXRjaDoKLSAgICAgICAgICBwbGF0Zm9ybXMgPSBjb25mLmdldCgncGxhdGZvcm1zJykgb3IgYmFzZS5nZXQoJ3BsYXRmb3JtcycpCi0gICAgICAgICAgaWYgbm90IHBsYXRmb3JtcyBvciBwbGF0Zm9ybS5zeXN0ZW0oKSBpbiBwbGF0Zm9ybXM6Ci0gICAgICAgICAgICB5aWVsZCBtZXJnZV9kaWN0KGJhc2UsIGNvbmYpCisgICAgZGVmIHlpZWxkX3Rlc3RsaWJzKGJhc2VfY29uZmlncywgY29uZmlncywgbWF0Y2gpOgorICAgICAgICBmb3IgYmFzZSwgY29uZiBpbiB6aXAoYmFzZV9jb25maWdzLCBjb25maWdzKToKKyAgICAgICAgICAgIGlmIGNvbmY6CisgICAgICAgICAgICAgICAgaWYgbm90IG1hdGNoIG9yIGJhc2VbJ25hbWUnXSBpbiBtYXRjaDoKKyAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1zID0gY29uZi5nZXQoJ3BsYXRmb3JtcycpIG9yIGJhc2UuZ2V0KCdwbGF0Zm9ybXMnKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcGxhdGZvcm1zIG9yIHBsYXRmb3JtLnN5c3RlbSgpIGluIHBsYXRmb3JtczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIG1lcmdlX2RpY3QoYmFzZSwgY29uZikKIAotICBsaWJzLCBzdnMsIGNscyA9IHppcCgqZXhwYW5kX2xpYnMoY29uZmlnKSkKLSAgc2VydmVycyA9IGxpc3QoeWllbGRfdGVzdGxpYnMobGlicywgc3ZzLCBzZXJ2ZXJfbWF0Y2gpKQotICBjbGllbnRzID0gbGlzdCh5aWVsZF90ZXN0bGlicyhsaWJzLCBjbHMsIGNsaWVudF9tYXRjaCkpCi0gIHJldHVybiBzZXJ2ZXJzLCBjbGllbnRzCisgICAgbGlicywgc3ZzLCBjbHMgPSB6aXAoKmV4cGFuZF9saWJzKGNvbmZpZykpCisgICAgc2VydmVycyA9IGxpc3QoeWllbGRfdGVzdGxpYnMobGlicywgc3ZzLCBzZXJ2ZXJfbWF0Y2gpKQorICAgIGNsaWVudHMgPSBsaXN0KHlpZWxkX3Rlc3RsaWJzKGxpYnMsIGNscywgY2xpZW50X21hdGNoKSkKKyAgICByZXR1cm4gc2VydmVycywgY2xpZW50cwogCiAKLWRlZiBkb19jb2xsZWN0X3Rlc3RzKHNlcnZlcnMsIGNsaWVudHMpOgotICBkZWYgaW50ZXJzZWN0aW9uKGtleSwgbzEsIG8yKToKLSAgICAiIiJpbnRlcnNlY3Rpb24gb2YgdHdvIGNvbGxlY3Rpb25zLgotICAgIGNvbGxlY3Rpb25zIGFyZSByZXBsYWNlZCB3aXRoIHNldHMgdGhlIGZpcnN0IHRpbWUiIiIKLSAgICBkZWYgY2FjaGVkX3NldChvLCBrZXkpOgotICAgICAgdiA9IG9ba2V5XQotICAgICAgaWYgbm90IGlzaW5zdGFuY2Uodiwgc2V0KToKLSAgICAgICAgdiA9IHNldCh2KQotICAgICAgICBvW2tleV0gPSB2Ci0gICAgICByZXR1cm4gdgotICAgIHJldHVybiBjYWNoZWRfc2V0KG8xLCBrZXkpICYgY2FjaGVkX3NldChvMiwga2V5KQotCi0gIGRlZiBpbnRlcnNlY3Rfd2l0aF9zcGVjKGtleSwgbzEsIG8yKToKLSAgICAjIHN0b3JlIGFzIHNldCBvZiAoc3BlYywgaW1wbCkgdHVwbGUKLSAgICBkZWYgY2FjaGVkX3NldChvKToKLSAgICAgIGRlZiB0b19zcGVjX2ltcGxfdHVwbGVzKHZhbHVlcyk6Ci0gICAgICAgIGZvciB2IGluIHZhbHVlczoKLSAgICAgICAgICBzcGVjLCBfLCBpbXBsID0gdi5wYXJ0aXRpb24oJzonKQotICAgICAgICAgIHlpZWxkIHNwZWMsIGltcGwgb3Igc3BlYwotICAgICAgdiA9IG9ba2V5XQotICAgICAgaWYgbm90IGlzaW5zdGFuY2Uodiwgc2V0KToKLSAgICAgICAgdiA9IHNldCh0b19zcGVjX2ltcGxfdHVwbGVzKHNldCh2KSkpCi0gICAgICAgIG9ba2V5XSA9IHYKLSAgICAgIHJldHVybiB2Ci0gICAgZm9yIHNwZWMxLCBpbXBsMSBpbiBjYWNoZWRfc2V0KG8xKToKLSAgICAgIGZvciBzcGVjMiwgaW1wbDIgaW4gY2FjaGVkX3NldChvMik6Ci0gICAgICAgIGlmIHNwZWMxID09IHNwZWMyOgotICAgICAgICAgIG5hbWUgPSBpbXBsMSBpZiBpbXBsMSA9PSBpbXBsMiBlbHNlICclcy0lcycgJSAoaW1wbDEsIGltcGwyKQotICAgICAgICAgIHlpZWxkIG5hbWUsIGltcGwxLCBpbXBsMgotCi0gIGRlZiBtYXliZV9tYXgoa2V5LCBvMSwgbzIsIGRlZmF1bHQpOgotICAgICIiIm1heGltdW0gb2YgdHdvIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkZWZ1bHQgdmFsdWUiIiIKLSAgICB2MSA9IG8xLmdldChrZXkpCi0gICAgdjIgPSBvMi5nZXQoa2V5KQotICAgIHJldHVybiBtYXgodjEsIHYyKSBpZiB2MSBhbmQgdjIgZWxzZSB2MSBvciB2MiBvciBkZWZhdWx0Ci0KLSAgZGVmIGZpbHRlcl93aXRoX3ZhbGlka2V5cyhvKToKLSAgICByZXQgPSB7fQotICAgIGZvciBrZXkgaW4gVkFMSURfSlNPTl9LRVlTOgotICAgICAgaWYga2V5IGluIG86Ci0gICAgICAgIHJldFtrZXldID0gb1trZXldCi0gICAgcmV0dXJuIHJldAotCi0gIGRlZiBtZXJnZV9tZXRhZGF0YShvLCAqKnJldCk6Ci0gICAgZm9yIGtleSBpbiBWQUxJRF9KU09OX0tFWVM6Ci0gICAgICBpZiBrZXkgaW4gbzoKLSAgICAgICAgcmV0W2tleV0gPSBvW2tleV0KLSAgICByZXR1cm4gcmV0Ci0KLSAgZm9yIHN2LCBjbCBpbiBwcm9kdWN0KHNlcnZlcnMsIGNsaWVudHMpOgotICAgIGZvciBwcm90bywgcHJvdG8xLCBwcm90bzIgaW4gaW50ZXJzZWN0X3dpdGhfc3BlYygncHJvdG9jb2xzJywgc3YsIGNsKToKLSAgICAgIGZvciB0cmFucywgdHJhbnMxLCB0cmFuczIgaW4gaW50ZXJzZWN0X3dpdGhfc3BlYygndHJhbnNwb3J0cycsIHN2LCBjbCk6Ci0gICAgICAgIGZvciBzb2NrIGluIGludGVyc2VjdGlvbignc29ja2V0cycsIHN2LCBjbCk6Ci0gICAgICAgICAgeWllbGQgewotICAgICAgICAgICAgJ3NlcnZlcic6IG1lcmdlX21ldGFkYXRhKHN2LCAqKnsncHJvdG9jb2wnOiBwcm90bzEsICd0cmFuc3BvcnQnOiB0cmFuczF9KSwKLSAgICAgICAgICAgICdjbGllbnQnOiBtZXJnZV9tZXRhZGF0YShjbCwgKip7J3Byb3RvY29sJzogcHJvdG8yLCAndHJhbnNwb3J0JzogdHJhbnMyfSksCi0gICAgICAgICAgICAnZGVsYXknOiBtYXliZV9tYXgoJ2RlbGF5Jywgc3YsIGNsLCBERUZBVUxUX0RFTEFZKSwKLSAgICAgICAgICAgICd0aW1lb3V0JzogbWF5YmVfbWF4KCd0aW1lb3V0Jywgc3YsIGNsLCBERUZBVUxUX1RJTUVPVVQpLAotICAgICAgICAgICAgJ3Byb3RvY29sJzogcHJvdG8sCi0gICAgICAgICAgICAndHJhbnNwb3J0JzogdHJhbnMsCi0gICAgICAgICAgICAnc29ja2V0Jzogc29jawotICAgICAgICAgIH0KK2RlZiBjb2xsZWN0X2ZlYXR1cmVzKGNvbmZpZywgbWF0Y2gpOgorICAgIHJlcyA9IGxpc3QobWFwKHJlLmNvbXBpbGUsIG1hdGNoKSkKKyAgICByZXR1cm4gbGlzdChmaWx0ZXIobGFtYmRhIGM6IGFueShtYXAobGFtYmRhIHI6IHIuc2VhcmNoKGNbJ25hbWUnXSksIHJlcykpLCBjb25maWcpKQogCiAKLWRlZiBjb2xsZWN0X3Rlc3RzKHRlc3RzX2RpY3QsIHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoKToKLSAgc3YsIGNsID0gY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCkKLSAgcmV0dXJuIGxpc3QoZG9fY29sbGVjdF90ZXN0cyhzdiwgY2wpKQorZGVmIF9kb19jb2xsZWN0X3Rlc3RzKHNlcnZlcnMsIGNsaWVudHMpOgorICAgIGRlZiBpbnRlcnNlY3Rpb24oa2V5LCBvMSwgbzIpOgorICAgICAgICAiIiJpbnRlcnNlY3Rpb24gb2YgdHdvIGNvbGxlY3Rpb25zLgorICAgICAgICBjb2xsZWN0aW9ucyBhcmUgcmVwbGFjZWQgd2l0aCBzZXRzIHRoZSBmaXJzdCB0aW1lIiIiCisgICAgICAgIGRlZiBjYWNoZWRfc2V0KG8sIGtleSk6CisgICAgICAgICAgICB2ID0gb1trZXldCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2LCBzZXQpOgorICAgICAgICAgICAgICAgIHYgPSBzZXQodikKKyAgICAgICAgICAgICAgICBvW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICByZXR1cm4gY2FjaGVkX3NldChvMSwga2V5KSAmIGNhY2hlZF9zZXQobzIsIGtleSkKKworICAgIGRlZiBpbnRlcnNlY3Rfd2l0aF9zcGVjKGtleSwgbzEsIG8yKToKKyAgICAgICAgIyBzdG9yZSBhcyBzZXQgb2YgKHNwZWMsIGltcGwpIHR1cGxlCisgICAgICAgIGRlZiBjYWNoZWRfc2V0KG8pOgorICAgICAgICAgICAgZGVmIHRvX3NwZWNfaW1wbF90dXBsZXModmFsdWVzKToKKyAgICAgICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgIHNwZWMsIF8sIGltcGwgPSB2LnBhcnRpdGlvbignOicpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNwZWMsIGltcGwgb3Igc3BlYworICAgICAgICAgICAgdiA9IG9ba2V5XQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uodiwgc2V0KToKKyAgICAgICAgICAgICAgICB2ID0gc2V0KHRvX3NwZWNfaW1wbF90dXBsZXMoc2V0KHYpKSkKKyAgICAgICAgICAgICAgICBvW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICBmb3Igc3BlYzEsIGltcGwxIGluIGNhY2hlZF9zZXQobzEpOgorICAgICAgICAgICAgZm9yIHNwZWMyLCBpbXBsMiBpbiBjYWNoZWRfc2V0KG8yKToKKyAgICAgICAgICAgICAgICBpZiBzcGVjMSA9PSBzcGVjMjoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGltcGwxIGlmIGltcGwxID09IGltcGwyIGVsc2UgJyVzLSVzJyAlIChpbXBsMSwgaW1wbDIpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIG5hbWUsIGltcGwxLCBpbXBsMgorCisgICAgZGVmIG1heWJlX21heChrZXksIG8xLCBvMiwgZGVmYXVsdCk6CisgICAgICAgICIiIm1heGltdW0gb2YgdHdvIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkZWZhdWx0IHZhbHVlIiIiCisgICAgICAgIHYxID0gbzEuZ2V0KGtleSkKKyAgICAgICAgdjIgPSBvMi5nZXQoa2V5KQorICAgICAgICByZXR1cm4gbWF4KHYxLCB2MikgaWYgdjEgYW5kIHYyIGVsc2UgdjEgb3IgdjIgb3IgZGVmYXVsdAorCisgICAgZGVmIGZpbHRlcl93aXRoX3ZhbGlka2V5cyhvKToKKyAgICAgICAgcmV0ID0ge30KKyAgICAgICAgZm9yIGtleSBpbiBWQUxJRF9KU09OX0tFWVM6CisgICAgICAgICAgICBpZiBrZXkgaW4gbzoKKyAgICAgICAgICAgICAgICByZXRba2V5XSA9IG9ba2V5XQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgbWVyZ2VfbWV0YWRhdGEobywgKipyZXQpOgorICAgICAgICBmb3Iga2V5IGluIFZBTElEX0pTT05fS0VZUzoKKyAgICAgICAgICAgIGlmIGtleSBpbiBvOgorICAgICAgICAgICAgICAgIHJldFtrZXldID0gb1trZXldCisgICAgICAgIHJldHVybiByZXQKKworICAgIGZvciBzdiwgY2wgaW4gcHJvZHVjdChzZXJ2ZXJzLCBjbGllbnRzKToKKyAgICAgICAgZm9yIHByb3RvLCBwcm90bzEsIHByb3RvMiBpbiBpbnRlcnNlY3Rfd2l0aF9zcGVjKCdwcm90b2NvbHMnLCBzdiwgY2wpOgorICAgICAgICAgICAgZm9yIHRyYW5zLCB0cmFuczEsIHRyYW5zMiBpbiBpbnRlcnNlY3Rfd2l0aF9zcGVjKCd0cmFuc3BvcnRzJywgc3YsIGNsKToKKyAgICAgICAgICAgICAgICBmb3Igc29jayBpbiBpbnRlcnNlY3Rpb24oJ3NvY2tldHMnLCBzdiwgY2wpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCB7CisgICAgICAgICAgICAgICAgICAgICAgICAnc2VydmVyJzogbWVyZ2VfbWV0YWRhdGEoc3YsICoqeydwcm90b2NvbCc6IHByb3RvMSwgJ3RyYW5zcG9ydCc6IHRyYW5zMX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NsaWVudCc6IG1lcmdlX21ldGFkYXRhKGNsLCAqKnsncHJvdG9jb2wnOiBwcm90bzIsICd0cmFuc3BvcnQnOiB0cmFuczJ9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdkZWxheSc6IG1heWJlX21heCgnZGVsYXknLCBzdiwgY2wsIERFRkFVTFRfTUFYX0RFTEFZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdzdG9wX3NpZ25hbCc6IG1heWJlX21heCgnc3RvcF9zaWduYWwnLCBzdiwgY2wsIERFRkFVTFRfU0lHTkFMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lb3V0JzogbWF5YmVfbWF4KCd0aW1lb3V0Jywgc3YsIGNsLCBERUZBVUxUX1RJTUVPVVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3RvY29sJzogcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAndHJhbnNwb3J0JzogdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAnc29ja2V0Jzogc29jaworICAgICAgICAgICAgICAgICAgICB9CisKKworZGVmIF9maWx0ZXJfZW50cmllcyh0ZXN0cywgcmVnZXgpOgorICAgIGlmIHJlZ2V4OgorICAgICAgICByZXR1cm4gZmlsdGVyKGxhbWJkYSB0OiByZS5zZWFyY2gocmVnZXgsIFRlc3RFbnRyeS5nZXRfbmFtZSgqKnQpKSwgdGVzdHMpCisgICAgcmV0dXJuIHRlc3RzCisKKworZGVmIGNvbGxlY3RfY3Jvc3NfdGVzdHModGVzdHNfZGljdCwgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIHJlZ2V4KToKKyAgICBzdiwgY2wgPSBfY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCkKKyAgICByZXR1cm4gbGlzdChfZmlsdGVyX2VudHJpZXMoX2RvX2NvbGxlY3RfdGVzdHMoc3YsIGNsKSwgcmVnZXgpKQorCisKK2RlZiBjb2xsZWN0X2ZlYXR1cmVfdGVzdHModGVzdHNfZGljdCwgZmVhdHVyZXNfZGljdCwgc2VydmVyX21hdGNoLCBmZWF0dXJlX21hdGNoLCByZWdleCk6CisgICAgc3YsIF8gPSBfY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gpCisgICAgZnQgPSBjb2xsZWN0X2ZlYXR1cmVzKGZlYXR1cmVzX2RpY3QsIGZlYXR1cmVfbWF0Y2gpCisgICAgcmV0dXJuIGxpc3QoX2ZpbHRlcl9lbnRyaWVzKF9kb19jb2xsZWN0X3Rlc3RzKHN2LCBmdCksIHJlZ2V4KSkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvY29tcGF0LnB5IGIvdGVzdC9jcm9zc3J1bm5lci9jb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjYTkxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvY29tcGF0LnB5CkBAIC0wLDAgKzEsMjQgQEAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgX0VOQ09ERSA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQorCisgICAgZGVmIHBhdGhfam9pbigqYXJncyk6CisgICAgICAgIGJpbl9hcmdzID0gbWFwKGxhbWJkYSBhOiBhLmRlY29kZShfRU5DT0RFKSwgYXJncykKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigqYmluX2FyZ3MpLmVuY29kZShfRU5DT0RFKQorCisgICAgZGVmIHN0cl9qb2luKHMsIGwpOgorICAgICAgICBiaW5fYXJncyA9IG1hcChsYW1iZGEgYTogYS5kZWNvZGUoX0VOQ09ERSksIGwpCisgICAgICAgIGIgPSBzLmRlY29kZShfRU5DT0RFKQorICAgICAgICByZXR1cm4gYi5qb2luKGJpbl9hcmdzKS5lbmNvZGUoX0VOQ09ERSkKKworICAgIGxvZ2ZpbGVfb3BlbiA9IG9wZW4KKworZWxzZToKKworICAgIHBhdGhfam9pbiA9IG9zLnBhdGguam9pbgorICAgIHN0cl9qb2luID0gc3RyLmpvaW4KKworICAgIGRlZiBsb2dmaWxlX29wZW4oKmFyZ3MpOgorICAgICAgICByZXR1cm4gb3BlbigqYXJncywgZXJyb3JzPSdyZXBsYWNlJykKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvcHJlcGFyZS5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvcHJlcGFyZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU0ZjZlZS4uMDAwMDAwMAotLS0gYS90ZXN0L2Nyb3NzcnVubmVyL3ByZXBhcmUucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotaW1wb3J0IG9zCi1pbXBvcnQgc3VicHJvY2VzcwotCi1mcm9tIGNyb3NzcnVubmVyLmNvbGxlY3QgaW1wb3J0IGNvbGxlY3RfdGVzdGxpYnMKLQotCi1kZWYgcHJlcGFyZShjb25maWdfZGljdCwgdGVzdGRpciwgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gpOgotICBsaWJzLCBsaWJzMiA9IGNvbGxlY3RfdGVzdGxpYnMoY29uZmlnX2RpY3QsIHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoKQotICBsaWJzLmV4dGVuZChsaWJzMikKLQotICBkZWYgcHJlcGFyZXMoKToKLSAgICBmb3IgbGliIGluIGxpYnM6Ci0gICAgICBwcmUgPSBsaWIuZ2V0KCdwcmVwYXJlJykKLSAgICAgIGlmIHByZToKLSAgICAgICAgeWllbGQgcHJlLCBsaWJbJ3dvcmtkaXInXQotCi0gIGRlZiBmaWxlcygpOgotICAgIGZvciBsaWIgaW4gbGliczoKLSAgICAgIHdvcmtkaXIgPSBvcy5wYXRoLmpvaW4odGVzdGRpciwgbGliWyd3b3JrZGlyJ10pCi0gICAgICBmb3IgYyBpbiBsaWJbJ2NvbW1hbmQnXToKLSAgICAgICAgaWYgbm90IGMuc3RhcnRzd2l0aCgnLScpOgotICAgICAgICAgIHAgPSBvcy5wYXRoLmpvaW4od29ya2RpciwgYykKLSAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocCk6Ci0gICAgICAgICAgICB5aWVsZCBvcy5wYXRoLnNwbGl0KHApCi0KLSAgZGVmIG1ha2UocCk6Ci0gICAgZCwgZiA9IHAKLSAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCwgJ3cnKSBhcyBkZXZudWxsOgotICAgICAgcmV0dXJuIHN1YnByb2Nlc3MuUG9wZW4oWydtYWtlJywgZl0sIGN3ZD1kLCBzdGRlcnI9ZGV2bnVsbCkKLQotICBmb3IgcHJlLCBkIGluIHByZXBhcmVzKCk6Ci0gICAgc3VicHJvY2Vzcy5Qb3BlbihwcmUsIGN3ZD1kKS53YWl0KCkKLQotICBmb3IgcCBpbiBsaXN0KG1hcChtYWtlLCBzZXQoZmlsZXMoKSkpKToKLSAgICBwLndhaXQoKQotICByZXR1cm4gVHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9yZXBvcnQucHkgYi90ZXN0L2Nyb3NzcnVubmVyL3JlcG9ydC5weQppbmRleCBhMjg0ZDJiLi41YmFmMTYxIDEwMDY0NAotLS0gYS90ZXN0L2Nyb3NzcnVubmVyL3JlcG9ydC5weQorKysgYi90ZXN0L2Nyb3NzcnVubmVyL3JlcG9ydC5weQpAQCAtMTcsNiArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgogaW1wb3J0IGRhdGV0aW1lCiBpbXBvcnQganNvbgogaW1wb3J0IG11bHRpcHJvY2Vzc2luZwpAQCAtMjgsMzc4ICsyOSw0MTMgQEAKIGltcG9ydCB0aW1lCiBpbXBvcnQgdHJhY2ViYWNrCiAKLWZyb20gY3Jvc3NydW5uZXIudGVzdCBpbXBvcnQgVGVzdEVudHJ5Citmcm9tIC5jb21wYXQgaW1wb3J0IGxvZ2ZpbGVfb3BlbiwgcGF0aF9qb2luLCBzdHJfam9pbgorZnJvbSAudGVzdCBpbXBvcnQgVGVzdEVudHJ5CiAKIExPR19ESVIgPSAnbG9nJwotUkVTVUxUX0hUTUwgPSAncmVzdWx0Lmh0bWwnCitSRVNVTFRfSFRNTCA9ICdpbmRleC5odG1sJwogUkVTVUxUX0pTT04gPSAncmVzdWx0cy5qc29uJwogRkFJTF9KU09OID0gJ2tub3duX2ZhaWx1cmVzXyVzLmpzb24nCiAKIAogZGVmIGdlbmVyYXRlX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIsIG92ZXJ3cml0ZSwgc2F2ZSwgb3V0KToKLSAgZGVmIGNvbGxlY3RfZmFpbHVyZXMocmVzdWx0cyk6Ci0gICAgc3VjY2Vzc19pbmRleCA9IDUKLSAgICBmb3IgciBpbiByZXN1bHRzOgotICAgICAgaWYgbm90IHJbc3VjY2Vzc19pbmRleF06Ci0gICAgICAgIHlpZWxkIFRlc3RFbnRyeS5nZXRfbmFtZSgqcikKLSAgdHJ5OgotICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4odGVzdGRpciwgUkVTVUxUX0pTT04pLCAncicpIGFzIGZwOgotICAgICAgcmVzdWx0cyA9IGpzb24ubG9hZChmcCkKLSAgZXhjZXB0IElPRXJyb3I6Ci0gICAgc3lzLnN0ZGVyci53cml0ZSgnVW5hYmxlIHRvIGxvYWQgbGFzdCByZXN1bHQuIERpZCB5b3UgcnVuIHRlc3RzID9cbicpCi0gICAgcmV0dXJuIEZhbHNlCi0gIGZhaWxzID0gY29sbGVjdF9mYWlsdXJlcyhyZXN1bHRzWydyZXN1bHRzJ10pCi0gIGlmIG5vdCBvdmVyd3JpdGU6Ci0gICAga25vd24gPSBsb2FkX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIpCi0gICAga25vd24uZXh0ZW5kKGZhaWxzKQotICAgIGZhaWxzID0ga25vd24KLSAgZmFpbHNfanNvbiA9IGpzb24uZHVtcHMoc29ydGVkKHNldChmYWlscykpLCBpbmRlbnQ9Miwgc2VwYXJhdG9ycz0oJywnLCAnOiAnKSkKLSAgaWYgc2F2ZToKLSAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHRlc3RkaXIsIEZBSUxfSlNPTiAlIHBsYXRmb3JtLnN5c3RlbSgpKSwgJ3crJykgYXMgZnA6Ci0gICAgICBmcC53cml0ZShmYWlsc19qc29uKQotICAgIHN5cy5zdGRvdXQud3JpdGUoJ1N1Y2Nlc3NmdWxseSB1cGRhdGVkIGtub3duIGZhaWx1cmVzLlxuJykKLSAgaWYgb3V0OgotICAgIHN5cy5zdGRvdXQud3JpdGUoZmFpbHNfanNvbikKLSAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCi0gIHJldHVybiBUcnVlCisgICAgZGVmIGNvbGxlY3RfZmFpbHVyZXMocmVzdWx0cyk6CisgICAgICAgIHN1Y2Nlc3NfaW5kZXggPSA1CisgICAgICAgIGZvciByIGluIHJlc3VsdHM6CisgICAgICAgICAgICBpZiBub3QgcltzdWNjZXNzX2luZGV4XToKKyAgICAgICAgICAgICAgICB5aWVsZCBUZXN0RW50cnkuZ2V0X25hbWUoKnIpCisgICAgdHJ5OgorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihwYXRoX2pvaW4odGVzdGRpciwgUkVTVUxUX0pTT04pLCAncicpIGFzIGZwOgorICAgICAgICAgICAgcmVzdWx0cyA9IGpzb24ubG9hZChmcCkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnVW5hYmxlIHRvIGxvYWQgbGFzdCByZXN1bHQuIERpZCB5b3UgcnVuIHRlc3RzID9cbicpCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGZhaWxzID0gY29sbGVjdF9mYWlsdXJlcyhyZXN1bHRzWydyZXN1bHRzJ10pCisgICAgaWYgbm90IG92ZXJ3cml0ZToKKyAgICAgICAga25vd24gPSBsb2FkX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIpCisgICAgICAgIGtub3duLmV4dGVuZChmYWlscykKKyAgICAgICAgZmFpbHMgPSBrbm93bgorICAgIGZhaWxzX2pzb24gPSBqc29uLmR1bXBzKHNvcnRlZChzZXQoZmFpbHMpKSwgaW5kZW50PTIsIHNlcGFyYXRvcnM9KCcsJywgJzogJykpCisgICAgaWYgc2F2ZToKKyAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4ob3MucGF0aC5qb2luKHRlc3RkaXIsIEZBSUxfSlNPTiAlIHBsYXRmb3JtLnN5c3RlbSgpKSwgJ3crJykgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZShmYWlsc19qc29uKQorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdTdWNjZXNzZnVsbHkgdXBkYXRlZCBrbm93biBmYWlsdXJlcy5cbicpCisgICAgaWYgb3V0OgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGZhaWxzX2pzb24pCisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1xuJykKKyAgICByZXR1cm4gVHJ1ZQogCiAKIGRlZiBsb2FkX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIpOgotICB0cnk6Ci0gICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbih0ZXN0ZGlyLCBGQUlMX0pTT04gJSBwbGF0Zm9ybS5zeXN0ZW0oKSksICdyJykgYXMgZnA6Ci0gICAgICByZXR1cm4ganNvbi5sb2FkKGZwKQotICBleGNlcHQgSU9FcnJvcjoKLSAgICByZXR1cm4gW10KKyAgICB0cnk6CisgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHBhdGhfam9pbih0ZXN0ZGlyLCBGQUlMX0pTT04gJSBwbGF0Zm9ybS5zeXN0ZW0oKSksICdyJykgYXMgZnA6CisgICAgICAgICAgICByZXR1cm4ganNvbi5sb2FkKGZwKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICByZXR1cm4gW10KIAogCiBjbGFzcyBUZXN0UmVwb3J0ZXIob2JqZWN0KToKLSAgIyBVbmZvcnR1bmF0ZWx5LCBzdGFuZGFyZCBsaWJyYXJ5IGRvZXNuJ3QgaGFuZGxlIHRpbWV6b25lIHdlbGwKLSAgIyBEQVRFVElNRV9GT1JNQVQgPSAnJWEgJWIgJWQgJUg6JU06JVMgJVogJVknCi0gIERBVEVUSU1FX0ZPUk1BVCA9ICclYSAlYiAlZCAlSDolTTolUyAlWScKKyAgICAjIFVuZm9ydHVuYXRlbHksIHN0YW5kYXJkIGxpYnJhcnkgZG9lc24ndCBoYW5kbGUgdGltZXpvbmUgd2VsbAorICAgICMgREFURVRJTUVfRk9STUFUID0gJyVhICViICVkICVIOiVNOiVTICVaICVZJworICAgIERBVEVUSU1FX0ZPUk1BVCA9ICclYSAlYiAlZCAlSDolTTolUyAlWScKIAotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQotICAgIHNlbGYuX2xvY2sgPSBtdWx0aXByb2Nlc3NpbmcuTG9jaygpCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYuX2xvY2sgPSBtdWx0aXByb2Nlc3NpbmcuTG9jaygpCiAKLSAgQGNsYXNzbWV0aG9kCi0gIGRlZiB0ZXN0X2xvZ2ZpbGUoY2xzLCB0ZXN0X25hbWUsIHByb2dfa2luZCwgZGlyPU5vbmUpOgotICAgIHJlbHBhdGggPSBvcy5wYXRoLmpvaW4oJ2xvZycsICclc18lcy5sb2cnICUgKHRlc3RfbmFtZSwgcHJvZ19raW5kKSkKLSAgICByZXR1cm4gcmVscGF0aCBpZiBub3QgZGlyIGVsc2Ugb3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmpvaW4oZGlyLCByZWxwYXRoKSkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVzdF9sb2dmaWxlKGNscywgdGVzdF9uYW1lLCBwcm9nX2tpbmQsIGRpcj1Ob25lKToKKyAgICAgICAgcmVscGF0aCA9IHBhdGhfam9pbignbG9nJywgJyVzXyVzLmxvZycgJSAodGVzdF9uYW1lLCBwcm9nX2tpbmQpKQorICAgICAgICByZXR1cm4gcmVscGF0aCBpZiBub3QgZGlyIGVsc2Ugb3MucGF0aC5yZWFscGF0aChwYXRoX2pvaW4oZGlyLCByZWxwYXRoKSkKIAotICBkZWYgX3N0YXJ0KHNlbGYpOgotICAgIHNlbGYuX3N0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQorICAgIGRlZiBfc3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuX3N0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQogCi0gIEBwcm9wZXJ0eQotICBkZWYgX2VsYXBzZWQoc2VsZik6Ci0gICAgcmV0dXJuIHRpbWUudGltZSgpIC0gc2VsZi5fc3RhcnRfdGltZQorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfZWxhcHNlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHRpbWUudGltZSgpIC0gc2VsZi5fc3RhcnRfdGltZQogCi0gIEBjbGFzc21ldGhvZAotICBkZWYgX2Zvcm1hdF9kYXRlKGNscyk6Ci0gICAgcmV0dXJuICclcycgJSBkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZShjbHMuREFURVRJTUVfRk9STUFUKQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfZm9ybWF0X2RhdGUoY2xzKToKKyAgICAgICAgcmV0dXJuICclcycgJSBkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZShjbHMuREFURVRJTUVfRk9STUFUKQogCi0gIGRlZiBfcHJpbnRfZGF0ZShzZWxmKToKLSAgICBzZWxmLm91dC53cml0ZSgnJXNcbicgJSBzZWxmLl9mb3JtYXRfZGF0ZSgpKQorICAgIGRlZiBfcHJpbnRfZGF0ZShzZWxmKToKKyAgICAgICAgcHJpbnQoc2VsZi5fZm9ybWF0X2RhdGUoKSwgZmlsZT1zZWxmLm91dCkKIAotICBkZWYgX3ByaW50X2JhcihzZWxmLCBvdXQ9Tm9uZSk6Ci0gICAgKG91dCBvciBzZWxmLm91dCkud3JpdGUoCi0gICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJykKKyAgICBkZWYgX3ByaW50X2JhcihzZWxmLCBvdXQ9Tm9uZSk6CisgICAgICAgIHByaW50KAorICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nLAorICAgICAgICAgICAgZmlsZT0ob3V0IG9yIHNlbGYub3V0KSkKIAotICBkZWYgX3ByaW50X2V4ZWNfdGltZShzZWxmKToKLSAgICBzZWxmLm91dC53cml0ZSgnVGVzdCBleGVjdXRpb24gdG9vayB7Oi4xZn0gc2Vjb25kcy5cbicuZm9ybWF0KHNlbGYuX2VsYXBzZWQpKQorICAgIGRlZiBfcHJpbnRfZXhlY190aW1lKHNlbGYpOgorICAgICAgICBwcmludCgnVGVzdCBleGVjdXRpb24gdG9vayB7Oi4xZn0gc2Vjb25kcy4nLmZvcm1hdChzZWxmLl9lbGFwc2VkKSwgZmlsZT1zZWxmLm91dCkKIAogCiBjbGFzcyBFeGVjUmVwb3J0ZXIoVGVzdFJlcG9ydGVyKToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIHRlc3QsIHByb2cpOgotICAgIHN1cGVyKEV4ZWNSZXBvcnRlciwgc2VsZikuX19pbml0X18oKQotICAgIHNlbGYuX3Rlc3QgPSB0ZXN0Ci0gICAgc2VsZi5fcHJvZyA9IHByb2cKLSAgICBzZWxmLmxvZ3BhdGggPSBzZWxmLnRlc3RfbG9nZmlsZSh0ZXN0Lm5hbWUsIHByb2cua2luZCwgdGVzdGRpcikKLSAgICBzZWxmLm91dCA9IE5vbmUKLQotICBkZWYgYmVnaW4oc2VsZik6Ci0gICAgc2VsZi5fc3RhcnQoKQotICAgIHNlbGYuX29wZW4oKQotICAgIGlmIHNlbGYub3V0IGFuZCBub3Qgc2VsZi5vdXQuY2xvc2VkOgotICAgICAgc2VsZi5fcHJpbnRfaGVhZGVyKCkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fbG9nLmRlYnVnKCdPdXRwdXQgc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUuJykKLQotICBkZWYgZW5kKHNlbGYsIHJldHVybmNvZGUpOgotICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCi0gICAgdHJ5OgotICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6Ci0gICAgICAgIHNlbGYuX3ByaW50X2Zvb3RlcihyZXR1cm5jb2RlKQotICAgICAgICBzZWxmLl9jbG9zZSgpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIHRlc3QsIHByb2cpOgorICAgICAgICBzdXBlcihFeGVjUmVwb3J0ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5fdGVzdCA9IHRlc3QKKyAgICAgICAgc2VsZi5fcHJvZyA9IHByb2cKKyAgICAgICAgc2VsZi5sb2dwYXRoID0gc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCBwcm9nLmtpbmQsIHRlc3RkaXIpCiAgICAgICAgIHNlbGYub3V0ID0gTm9uZQotICAgICAgZWxzZToKLSAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdPdXRwdXQgc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUuJykKLSAgICBmaW5hbGx5OgotICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKIAotICBkZWYga2lsbGVkKHNlbGYpOgotICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCi0gICAgdHJ5OgotICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6Ci0gICAgICAgIHNlbGYuX3ByaW50X2Zvb3RlcigpCi0gICAgICAgIHNlbGYuX2Nsb3NlKCkKLSAgICAgICAgc2VsZi5vdXQgPSBOb25lCi0gICAgICBlbHNlOgotICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ091dHB1dCBzdHJlYW0gaXMgbm90IGF2YWlsYWJsZS4nKQotICAgIGZpbmFsbHk6Ci0gICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorICAgIGRlZiBiZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5fc3RhcnQoKQorICAgICAgICBzZWxmLl9vcGVuKCkKKyAgICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgICAgICAgICBzZWxmLl9wcmludF9oZWFkZXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdPdXRwdXQgc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUuJykKIAotICBfaW5pdF9mYWlsdXJlX2V4cHJzID0gewotICAgICdzZXJ2ZXInOiBsaXN0KG1hcChyZS5jb21waWxlLCBbCi0gICAgICAnW0FhXWRkcmVzcyBhbHJlYWR5IGluIHVzZScsCi0gICAgICAnQ291bGQgbm90IGJpbmQnLAotICAgICAgJ0VBRERSSU5VU0UnLAotICAgIF0pKSwKLSAgICAnY2xpZW50JzogbGlzdChtYXAocmUuY29tcGlsZSwgWwotICAgICAgJ1tDY11vbm5lY3Rpb24gcmVmdXNlZCcsCi0gICAgICAnQ291bGQgbm90IGNvbm5lY3QgdG8gbG9jYWxob3N0JywKLSAgICAgICdFQ09OTlJFRlVTRUQnLAotICAgICAgJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknLCAgIyBkb21haW4gc29ja2V0Ci0gICAgXSkpLAotICB9CisgICAgZGVmIGVuZChzZWxmLCByZXR1cm5jb2RlKToKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5fcHJpbnRfZm9vdGVyKHJldHVybmNvZGUpCisgICAgICAgICAgICAgICAgc2VsZi5fY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYub3V0ID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ091dHB1dCBzdHJlYW0gaXMgbm90IGF2YWlsYWJsZS4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKIAotICBkZWYgbWF5YmVfZmFsc2VfcG9zaXRpdmUoc2VsZik6Ci0gICAgIiIiU2VhcmNoZXMgdGhyb3VnaCBsb2cgZmlsZSBmb3Igc29ja2V0IGJpbmQgZXJyb3IuCi0gICAgUmV0dXJucyBUcnVlIGlmIHN1c3BpY2lvdXMgZXhwcmVzc2lvbiBpcyBmb3VuZCwgb3RoZXJ3aXNlIEZhbHNlIiIiCi0gICAgZGVmIG1hdGNoKGxpbmUpOgotICAgICAgZm9yIGV4cHIgaW4gZXhwcnM6Ci0gICAgICAgIGlmIGV4cHIuc2VhcmNoKGxpbmUpOgotICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgdHJ5OgotICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgZGVmIGtpbGxlZChzZWxmKToKKyAgICAgICAgcHJpbnQoZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJ1NlcnZlciBwcm9jZXNzIGlzIHN1Y2Nlc3NmdWxseSBraWxsZWQuJywgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgc2VsZi5lbmQoTm9uZSkKKworICAgIGRlZiBkaWVkKHNlbGYpOgorICAgICAgICBwcmludChmaWxlPXNlbGYub3V0KQorICAgICAgICBwcmludCgnKioqIFNlcnZlciBwcm9jZXNzIGhhcyBkaWVkIHVuZXhwZWN0ZWRseSAqKionLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBzZWxmLmVuZChOb25lKQorCisgICAgX2luaXRfZmFpbHVyZV9leHBycyA9IHsKKyAgICAgICAgJ3NlcnZlcic6IGxpc3QobWFwKHJlLmNvbXBpbGUsIFsKKyAgICAgICAgICAgICdbQWFdZGRyZXNzIGFscmVhZHkgaW4gdXNlJywKKyAgICAgICAgICAgICdDb3VsZCBub3QgYmluZCcsCisgICAgICAgICAgICAnRUFERFJJTlVTRScsCisgICAgICAgIF0pKSwKKyAgICAgICAgJ2NsaWVudCc6IGxpc3QobWFwKHJlLmNvbXBpbGUsIFsKKyAgICAgICAgICAgICdbQ2Ndb25uZWN0aW9uIHJlZnVzZWQnLAorICAgICAgICAgICAgJ0NvdWxkIG5vdCBjb25uZWN0IHRvJywKKyAgICAgICAgICAgICdDb3VsZCBub3Qgb3BlbiBVTklYICcsICAgICAgICMgZG9tYWluIHNvY2tldCAocmIpCisgICAgICAgICAgICAnRUNPTk5SRUZVU0VEJywKKyAgICAgICAgICAgICdlY29ubnJlZnVzZWQnLCAgICAgICAgICAgICAgICMgZXJsCisgICAgICAgICAgICAnQ09OTkVDVElPTi1SRUZVU0VELUVSUk9SJywgICAjIGNsCisgICAgICAgICAgICAnY29ubmVjdCBFTk9FTlQnLCAgICAgICAgICAgICAjIG5vZGVqcyBkb21haW4gc29ja2V0CisgICAgICAgICAgICAnTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScsICAjIGRvbWFpbiBzb2NrZXQKKyAgICAgICAgICAgICdTb2NrZXRzLlRjcENsaWVudC5Db25uZWN0JywgICMgY3NoYXJwCisgICAgICAgIF0pKSwKKyAgICB9CisKKyAgICBkZWYgbWF5YmVfZmFsc2VfcG9zaXRpdmUoc2VsZik6CisgICAgICAgICIiIlNlYXJjaGVzIHRocm91Z2ggbG9nIGZpbGUgZm9yIHNvY2tldCBiaW5kIGVycm9yLgorICAgICAgICBSZXR1cm5zIFRydWUgaWYgc3VzcGljaW91cyBleHByZXNzaW9uIGlzIGZvdW5kLCBvdGhlcndpc2UgRmFsc2UiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQuZmx1c2goKQorICAgICAgICAgICAgZXhwcnMgPSBzZWxmLl9pbml0X2ZhaWx1cmVfZXhwcnNbc2VsZi5fcHJvZy5raW5kXQorCisgICAgICAgICAgICBkZWYgbWF0Y2gobGluZSk6CisgICAgICAgICAgICAgICAgZm9yIGV4cHIgaW4gZXhwcnM6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4cHIuc2VhcmNoKGxpbmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oIm1heWJlIGZhbHNlIHBvc2l0aXZlOiAlcyIgJSBsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4oc2VsZi5sb2dwYXRoLCAncicpIGFzIGZwOgorICAgICAgICAgICAgICAgIGlmIGFueShtYXAobWF0Y2gsIGZwKSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgICAgICAgIHNlbGYuX2xvZy53YXJuKCdbJXNdOiBFcnJvciB3aGlsZSBkZXRlY3RpbmcgZmFsc2UgcG9zaXRpdmU6ICVzJyAlIChzZWxmLl90ZXN0Lm5hbWUsIHN0cihleCkpKQorICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8odHJhY2ViYWNrLnByaW50X2V4YygpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5vdXQgPSBsb2dmaWxlX29wZW4oc2VsZi5sb2dwYXRoLCAndysnKQorCisgICAgZGVmIF9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5vdXQuY2xvc2UoKQorCisgICAgZGVmIF9wcmludF9oZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuX3ByaW50X2RhdGUoKQorICAgICAgICBwcmludCgnRXhlY3V0aW5nOiAlcycgJSBzdHJfam9pbignICcsIHNlbGYuX3Byb2cuY29tbWFuZCksIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdEaXJlY3Rvcnk6ICVzJyAlIHNlbGYuX3Byb2cud29ya2RpciwgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJ2NvbmZpZzpkZWxheTogJXMnICUgc2VsZi5fdGVzdC5kZWxheSwgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJ2NvbmZpZzp0aW1lb3V0OiAlcycgJSBzZWxmLl90ZXN0LnRpbWVvdXQsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCiAgICAgICAgIHNlbGYub3V0LmZsdXNoKCkKLSAgICAgIGV4cHJzID0gbGlzdChtYXAocmUuY29tcGlsZSwgc2VsZi5faW5pdF9mYWlsdXJlX2V4cHJzW3NlbGYuX3Byb2cua2luZF0pKQogCi0gICAgICBzZXJ2ZXJfbG9nZmlsZSA9IHNlbGYubG9ncGF0aAotICAgICAgIyBuZWVkIHRvIGhhbmRsZSB1bmljb2RlIGVycm9ycyBvbiBQeXRob24gMwotICAgICAga3dhcmdzID0ge30gaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgZWxzZSB7J2Vycm9ycyc6ICdyZXBsYWNlJ30KLSAgICAgIHdpdGggb3BlbihzZXJ2ZXJfbG9nZmlsZSwgJ3InLCAqKmt3YXJncykgYXMgZnA6Ci0gICAgICAgIGlmIGFueShtYXAobWF0Y2gsIGZwKSk6Ci0gICAgICAgICAgcmV0dXJuIFRydWUKLSAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKLSAgICAgIHJhaXNlCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKLSAgICAgIHNlbGYuX2xvZy53YXJuKCdbJXNdOiBFcnJvciB3aGlsZSBkZXRlY3RpbmcgZmFsc2UgcG9zaXRpdmU6ICVzJyAlIChzZWxmLl90ZXN0Lm5hbWUsIHN0cihleCkpKQotICAgICAgc2VsZi5fbG9nLmluZm8odHJhY2ViYWNrLnByaW50X2V4YygpKQotICAgIHJldHVybiBGYWxzZQotCi0gIGRlZiBfb3BlbihzZWxmKToKLSAgICBzZWxmLm91dCA9IG9wZW4oc2VsZi5sb2dwYXRoLCAndysnKQotCi0gIGRlZiBfY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5vdXQuY2xvc2UoKQotCi0gIGRlZiBfcHJpbnRfaGVhZGVyKHNlbGYpOgotICAgIHNlbGYuX3ByaW50X2RhdGUoKQotICAgIHNlbGYub3V0LndyaXRlKCdFeGVjdXRpbmc6ICVzXG4nICUgJyAnLmpvaW4oc2VsZi5fcHJvZy5jb21tYW5kKSkKLSAgICBzZWxmLm91dC53cml0ZSgnRGlyZWN0b3J5OiAlc1xuJyAlIHNlbGYuX3Byb2cud29ya2RpcikKLSAgICBzZWxmLm91dC53cml0ZSgnY29uZmlnOmRlbGF5OiAlc1xuJyAlIHNlbGYuX3Rlc3QuZGVsYXkpCi0gICAgc2VsZi5vdXQud3JpdGUoJ2NvbmZpZzp0aW1lb3V0OiAlc1xuJyAlIHNlbGYuX3Rlc3QudGltZW91dCkKLSAgICBzZWxmLl9wcmludF9iYXIoKQotICAgIHNlbGYub3V0LmZsdXNoKCkKLQotICBkZWYgX3ByaW50X2Zvb3RlcihzZWxmLCByZXR1cm5jb2RlPU5vbmUpOgotICAgIHNlbGYuX3ByaW50X2JhcigpCi0gICAgaWYgcmV0dXJuY29kZSBpcyBub3QgTm9uZToKLSAgICAgIHNlbGYub3V0LndyaXRlKCdSZXR1cm4gY29kZTogJWRcbicgJSByZXR1cm5jb2RlKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLm91dC53cml0ZSgnUHJvY2VzcyBpcyBraWxsZWQuXG4nKQotICAgIHNlbGYuX3ByaW50X2V4ZWNfdGltZSgpCi0gICAgc2VsZi5fcHJpbnRfZGF0ZSgpCisgICAgZGVmIF9wcmludF9mb290ZXIoc2VsZiwgcmV0dXJuY29kZT1Ob25lKToKKyAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKyAgICAgICAgaWYgcmV0dXJuY29kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByaW50KCdSZXR1cm4gY29kZTogJWQgKG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBraWxsIGJ5IHNpZ25hbCknICUgcmV0dXJuY29kZSwgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCdQcm9jZXNzIGlzIGtpbGxlZC4nLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBzZWxmLl9wcmludF9leGVjX3RpbWUoKQorICAgICAgICBzZWxmLl9wcmludF9kYXRlKCkKIAogCiBjbGFzcyBTdW1tYXJ5UmVwb3J0ZXIoVGVzdFJlcG9ydGVyKToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIGNvbmN1cnJlbnQ9VHJ1ZSk6Ci0gICAgc3VwZXIoU3VtbWFyeVJlcG9ydGVyLCBzZWxmKS5fX2luaXRfXygpCi0gICAgc2VsZi50ZXN0ZGlyID0gdGVzdGRpcgotICAgIHNlbGYubG9nZGlyID0gb3MucGF0aC5qb2luKHRlc3RkaXIsIExPR19ESVIpCi0gICAgc2VsZi5vdXRfcGF0aCA9IG9zLnBhdGguam9pbih0ZXN0ZGlyLCBSRVNVTFRfSlNPTikKLSAgICBzZWxmLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50Ci0gICAgc2VsZi5vdXQgPSBzeXMuc3Rkb3V0Ci0gICAgc2VsZi5fcGxhdGZvcm0gPSBwbGF0Zm9ybS5zeXN0ZW0oKQotICAgIHNlbGYuX3JldmlzaW9uID0gc2VsZi5fZ2V0X3JldmlzaW9uKCkKLSAgICBzZWxmLl90ZXN0cyA9IFtdCi0gICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYubG9nZGlyKToKLSAgICAgIG9zLm1rZGlyKHNlbGYubG9nZGlyKQotICAgIHNlbGYuX2tub3duX2ZhaWx1cmVzID0gbG9hZF9rbm93bl9mYWlsdXJlcyh0ZXN0ZGlyKQotICAgIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcyA9IFtdCi0gICAgc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlID0gW10KLSAgICBzZWxmLl9leHBlY3RlZF9mYWlsdXJlID0gW10KLSAgICBzZWxmLl9wcmludF9oZWFkZXIoKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXNlZGlyLCB0ZXN0ZGlyX3JlbGF0aXZlLCBjb25jdXJyZW50PVRydWUpOgorICAgICAgICBzdXBlcihTdW1tYXJ5UmVwb3J0ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5fYmFzZWRpciA9IGJhc2VkaXIKKyAgICAgICAgc2VsZi5fdGVzdGRpcl9yZWwgPSB0ZXN0ZGlyX3JlbGF0aXZlCisgICAgICAgIHNlbGYubG9nZGlyID0gcGF0aF9qb2luKHNlbGYudGVzdGRpciwgTE9HX0RJUikKKyAgICAgICAgc2VsZi5vdXRfcGF0aCA9IHBhdGhfam9pbihzZWxmLnRlc3RkaXIsIFJFU1VMVF9KU09OKQorICAgICAgICBzZWxmLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50CisgICAgICAgIHNlbGYub3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3JtLnN5c3RlbSgpCisgICAgICAgIHNlbGYuX3JldmlzaW9uID0gc2VsZi5fZ2V0X3JldmlzaW9uKCkKKyAgICAgICAgc2VsZi5fdGVzdHMgPSBbXQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5sb2dkaXIpOgorICAgICAgICAgICAgb3MubWtkaXIoc2VsZi5sb2dkaXIpCisgICAgICAgIHNlbGYuX2tub3duX2ZhaWx1cmVzID0gbG9hZF9rbm93bl9mYWlsdXJlcyhzZWxmLnRlc3RkaXIpCisgICAgICAgIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcyA9IFtdCisgICAgICAgIHNlbGYuX2ZsYWt5X3N1Y2Nlc3MgPSBbXQorICAgICAgICBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUgPSBbXQorICAgICAgICBzZWxmLl9leHBlY3RlZF9mYWlsdXJlID0gW10KKyAgICAgICAgc2VsZi5fcHJpbnRfaGVhZGVyKCkKIAotICBkZWYgX2dldF9yZXZpc2lvbihzZWxmKToKLSAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1zaG9ydCcsICdIRUFEJ10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3dkPXNlbGYudGVzdGRpciwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKLSAgICBvdXQsIF8gPSBwLmNvbW11bmljYXRlKCkKLSAgICByZXR1cm4gb3V0LnN0cmlwKCkKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdGVzdGRpcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhdGhfam9pbihzZWxmLl9iYXNlZGlyLCBzZWxmLl90ZXN0ZGlyX3JlbCkKIAotICBkZWYgX2Zvcm1hdF90ZXN0KHNlbGYsIHRlc3QsIHdpdGhfcmVzdWx0PVRydWUpOgotICAgIG5hbWUgPSAnJXMtJXMnICUgKHRlc3Quc2VydmVyLm5hbWUsIHRlc3QuY2xpZW50Lm5hbWUpCi0gICAgdHJhbnMgPSAnJXMtJXMnICUgKHRlc3QudHJhbnNwb3J0LCB0ZXN0LnNvY2tldCkKLSAgICBpZiBub3Qgd2l0aF9yZXN1bHQ6Ci0gICAgICByZXR1cm4gJ3s6MTlzfXs6MTNzfXs6MjVzfScuZm9ybWF0KG5hbWVbOjE4XSwgdGVzdC5wcm90b2NvbFs6MTJdLCB0cmFuc1s6MjRdKQotICAgIGVsc2U6Ci0gICAgICByZXN1bHQgPSAnc3VjY2VzcycgaWYgdGVzdC5zdWNjZXNzIGVsc2UgKAotICAgICAgICAgICd0aW1lb3V0JyBpZiB0ZXN0LmV4cGlyZWQgZWxzZSAnZmFpbHVyZScpCi0gICAgICByZXN1bHRfc3RyaW5nID0gJyVzKCVkKScgJSAocmVzdWx0LCB0ZXN0LnJldHVybmNvZGUpCi0gICAgICByZXR1cm4gJ3s6MTlzfXs6MTNzfXs6MjVzfXs6c31cbicuZm9ybWF0KG5hbWVbOjE4XSwgdGVzdC5wcm90b2NvbFs6MTJdLCB0cmFuc1s6MjRdLCByZXN1bHRfc3RyaW5nKQotCi0gIGRlZiBfcHJpbnRfdGVzdF9oZWFkZXIoc2VsZik6Ci0gICAgc2VsZi5fcHJpbnRfYmFyKCkKLSAgICBzZWxmLm91dC53cml0ZSgKLSAgICAgICd7OjE5c317OjEzc317OjI1c317OnN9XG4nLmZvcm1hdCgnc2VydmVyLWNsaWVudDonLCAncHJvdG9jb2w6JywgJ3RyYW5zcG9ydDonLCAncmVzdWx0OicpKQotCi0gIGRlZiBfcHJpbnRfaGVhZGVyKHNlbGYpOgotICAgIHNlbGYuX3N0YXJ0KCkKLSAgICBzZWxmLm91dC53cml0ZWxpbmVzKFsKLSAgICAgICdBcGFjaGUgVGhyaWZ0IC0gSW50ZWdyYXRpb24gVGVzdCBTdWl0ZVxuJywKLSAgICBdKQotICAgIHNlbGYuX3ByaW50X2RhdGUoKQotICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKLQotICBkZWYgX3ByaW50X3VuZXhwZWN0ZWRfZmFpbHVyZShzZWxmKToKLSAgICBpZiBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKSA+IDA6Ci0gICAgICBzZWxmLm91dC53cml0ZWxpbmVzKFsKLSAgICAgICAgJyoqKiBGb2xsb3dpbmcgJWQgZmFpbHVyZXMgd2VyZSB1bmV4cGVjdGVkICoqKjpcbicgJSBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKSwKLSAgICAgICAgJ0lmIGl0IGlzIGludHJvZHVjZWQgYnkgeW91LCBwbGVhc2UgZml4IGl0IGJlZm9yZSBzdWJtaXR0aW5nIHRoZSBjb2RlLlxuJywKLSAgICAgICAgIyAnSWYgbm90LCBwbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUXG4nLAotICAgICAgXSkKLSAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKLSAgICAgIGZvciBpIGluIHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZToKLSAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3Qoc2VsZi5fdGVzdHNbaV0pKQotICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKLSAgICBlbHNlOgotICAgICAgc2VsZi5vdXQud3JpdGUoJ05vIHVuZXhwZWN0ZWQgZmFpbHVyZXMuXG4nKQotCi0gIGRlZiBfcHJpbnRfdW5leHBlY3RlZF9zdWNjZXNzKHNlbGYpOgotICAgIGlmIGxlbihzZWxmLl91bmV4cGVjdGVkX3N1Y2Nlc3MpID4gMDoKLSAgICAgIHNlbGYub3V0LndyaXRlKAotICAgICAgICAnRm9sbG93aW5nICVkIHRlc3RzIHdlcmUga25vd24gdG8gZmFpbCBidXQgc3VjY2VlZGVkIChpdFwncyBub3JtYWwpOlxuJyAlIGxlbihzZWxmLl91bmV4cGVjdGVkX3N1Y2Nlc3MpKQotICAgICAgc2VsZi5fcHJpbnRfdGVzdF9oZWFkZXIoKQotICAgICAgZm9yIGkgaW4gc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzOgotICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdChzZWxmLl90ZXN0c1tpXSkpCi0gICAgICBzZWxmLl9wcmludF9iYXIoKQotCi0gIGRlZiBfaHR0cF9zZXJ2ZXJfY29tbWFuZChzZWxmLCBwb3J0KToKLSAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKLSAgICAgIHJldHVybiAncHl0aG9uIC1tIFNpbXBsZUhUVFBTZXJ2ZXIgJWQnICUgcG9ydAotICAgIGVsc2U6Ci0gICAgICByZXR1cm4gJ3B5dGhvbiAtbSBodHRwLnNlcnZlciAlZCcgJSBwb3J0Ci0KLSAgZGVmIF9wcmludF9mb290ZXIoc2VsZik6Ci0gICAgZmFpbF9jb3VudCA9IGxlbihzZWxmLl9leHBlY3RlZF9mYWlsdXJlKSArIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpCi0gICAgc2VsZi5fcHJpbnRfYmFyKCkKLSAgICBzZWxmLl9wcmludF91bmV4cGVjdGVkX3N1Y2Nlc3MoKQotICAgIHNlbGYuX3ByaW50X3VuZXhwZWN0ZWRfZmFpbHVyZSgpCi0gICAgc2VsZi5fd3JpdGVfaHRtbF9kYXRhKCkKLSAgICBzZWxmLl9hc3NlbWJsZV9sb2coJ3VuZXhwZWN0ZWQgZmFpbHVyZXMnLCBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpCi0gICAgc2VsZi5fYXNzZW1ibGVfbG9nKCdrbm93biBmYWlsdXJlcycsIHNlbGYuX2V4cGVjdGVkX2ZhaWx1cmUpCi0gICAgc2VsZi5vdXQud3JpdGVsaW5lcyhbCi0gICAgICAnWW91IGNhbiBicm93c2UgcmVzdWx0cyBhdDpcbicsCi0gICAgICAnXHRmaWxlOi8vJXMvJXNcbicgJSAoc2VsZi50ZXN0ZGlyLCBSRVNVTFRfSFRNTCksCi0gICAgICAnIyBJZiB5b3UgdXNlIENocm9tZSwgcnVuOlxuJywKLSAgICAgICcjIFx0Y2QgJXNcbiNcdCVzXG4nICUgKHNlbGYudGVzdGRpciwgc2VsZi5faHR0cF9zZXJ2ZXJfY29tbWFuZCg4MDAxKSksCi0gICAgICAnIyB0aGVuIGJyb3dzZTpcbicsCi0gICAgICAnIyBcdGh0dHA6Ly9sb2NhbGhvc3Q6JWQvJXNcbicgJSAoODAwMSwgUkVTVUxUX0hUTUwpLAotICAgICAgJ0Z1bGwgbG9nIGZvciBlYWNoIHRlc3QgaXMgaGVyZTpcbicsCi0gICAgICAnXHR0ZXN0L2xvZy9jbGllbnRfc2VydmVyX3Byb3RvY29sX3RyYW5zcG9ydF9jbGllbnQubG9nXG4nLAotICAgICAgJ1x0dGVzdC9sb2cvY2xpZW50X3NlcnZlcl9wcm90b2NvbF90cmFuc3BvcnRfc2VydmVyLmxvZ1xuJywKLSAgICAgICclZCBmYWlsZWQgb2YgJWQgdGVzdHMgaW4gdG90YWwuXG4nICUgKGZhaWxfY291bnQsIGxlbihzZWxmLl90ZXN0cykpLAotICAgIF0pCi0gICAgc2VsZi5fcHJpbnRfZXhlY190aW1lKCkKLSAgICBzZWxmLl9wcmludF9kYXRlKCkKLQotICBkZWYgX3JlbmRlcl9yZXN1bHQoc2VsZiwgdGVzdCk6Ci0gICAgcmV0dXJuIFsKLSAgICAgIHRlc3Quc2VydmVyLm5hbWUsCi0gICAgICB0ZXN0LmNsaWVudC5uYW1lLAotICAgICAgdGVzdC5wcm90b2NvbCwKLSAgICAgIHRlc3QudHJhbnNwb3J0LAotICAgICAgdGVzdC5zb2NrZXQsCi0gICAgICB0ZXN0LnN1Y2Nlc3MsCi0gICAgICB0ZXN0LmFzX2V4cGVjdGVkLAotICAgICAgdGVzdC5yZXR1cm5jb2RlLAotICAgICAgewotICAgICAgICAnc2VydmVyJzogc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCB0ZXN0LnNlcnZlci5raW5kKSwKLSAgICAgICAgJ2NsaWVudCc6IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgdGVzdC5jbGllbnQua2luZCksCi0gICAgICB9LAotICAgIF0KLQotICBkZWYgX3dyaXRlX2h0bWxfZGF0YShzZWxmKToKLSAgICAiIiJXcml0ZXMgSlNPTiBkYXRhIHRvIGJlIHJlYWQgYnkgcmVzdWx0IGh0bWwiIiIKLSAgICByZXN1bHRzID0gW3NlbGYuX3JlbmRlcl9yZXN1bHQocikgZm9yIHIgaW4gc2VsZi5fdGVzdHNdCi0gICAgd2l0aCBvcGVuKHNlbGYub3V0X3BhdGgsICd3KycpIGFzIGZwOgotICAgICAgZnAud3JpdGUoanNvbi5kdW1wcyh7Ci0gICAgICAgICdkYXRlJzogc2VsZi5fZm9ybWF0X2RhdGUoKSwKLSAgICAgICAgJ3JldmlzaW9uJzogc3RyKHNlbGYuX3JldmlzaW9uKSwKLSAgICAgICAgJ3BsYXRmb3JtJzogc2VsZi5fcGxhdGZvcm0sCi0gICAgICAgICdkdXJhdGlvbic6ICd7Oi4xZn0nLmZvcm1hdChzZWxmLl9lbGFwc2VkKSwKLSAgICAgICAgJ3Jlc3VsdHMnOiByZXN1bHRzLAotICAgICAgfSwgaW5kZW50PTIpKQotCi0gIGRlZiBfYXNzZW1ibGVfbG9nKHNlbGYsIHRpdGxlLCBpbmRleGVzKToKLSAgICBpZiBsZW4oaW5kZXhlcykgPiAwOgotICAgICAgZGVmIGFkZF9wcm9nX2xvZyhmcCwgdGVzdCwgcHJvZ19raW5kKToKLSAgICAgICAgZnAud3JpdGUoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAlcyBtZXNzYWdlICoqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJwotICAgICAgICAgICAgICAgICAlIHByb2dfa2luZCkKLSAgICAgICAgcGF0aCA9IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgcHJvZ19raW5kLCBzZWxmLnRlc3RkaXIpCi0gICAgICAgIGt3YXJncyA9IHt9IGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIGVsc2UgeydlcnJvcnMnOiAncmVwbGFjZSd9Ci0gICAgICAgIHdpdGggb3BlbihwYXRoLCAncicsICoqa3dhcmdzKSBhcyBwcm9nX2ZwOgotICAgICAgICAgIGZwLndyaXRlKHByb2dfZnAucmVhZCgpKQotICAgICAgZmlsZW5hbWUgPSB0aXRsZS5yZXBsYWNlKCcgJywgJ18nKSArICcubG9nJwotICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihzZWxmLmxvZ2RpciwgZmlsZW5hbWUpLCAndysnKSBhcyBmcDoKLSAgICAgICAgZm9yIHRlc3QgaW4gbWFwKHNlbGYuX3Rlc3RzLl9fZ2V0aXRlbV9fLCBpbmRleGVzKToKLSAgICAgICAgICBmcC53cml0ZSgnVEVTVDogWyVzXVxuJyAlIHRlc3QubmFtZSkKLSAgICAgICAgICBhZGRfcHJvZ19sb2coZnAsIHRlc3QsIHRlc3Quc2VydmVyLmtpbmQpCi0gICAgICAgICAgYWRkX3Byb2dfbG9nKGZwLCB0ZXN0LCB0ZXN0LmNsaWVudC5raW5kKQotICAgICAgICAgIGZwLndyaXRlKCcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbicpCi0gICAgICBzZWxmLm91dC53cml0ZSgnJXMgYXJlIGxvZ2dlZCB0byB0ZXN0LyVzLyVzXG4nICUgKHRpdGxlLmNhcGl0YWxpemUoKSwgTE9HX0RJUiwgZmlsZW5hbWUpKQotCi0gIGRlZiBlbmQoc2VsZik6Ci0gICAgc2VsZi5fcHJpbnRfZm9vdGVyKCkKLSAgICByZXR1cm4gbGVuKHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZSkgPT0gMAotCi0gIGRlZiBhZGRfdGVzdChzZWxmLCB0ZXN0X2RpY3QpOgotICAgIHRlc3QgPSBUZXN0RW50cnkoc2VsZi50ZXN0ZGlyLCAqKnRlc3RfZGljdCkKLSAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQotICAgIHRyeToKLSAgICAgIGlmIG5vdCBzZWxmLmNvbmN1cnJlbnQ6Ci0gICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHRlc3QsIEZhbHNlKSkKLSAgICAgICAgc2VsZi5vdXQuZmx1c2goKQotICAgICAgc2VsZi5fdGVzdHMuYXBwZW5kKHRlc3QpCi0gICAgICByZXR1cm4gbGVuKHNlbGYuX3Rlc3RzKSAtIDEKLSAgICBmaW5hbGx5OgotICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKLQotICBkZWYgYWRkX3Jlc3VsdChzZWxmLCBpbmRleCwgcmV0dXJuY29kZSwgZXhwaXJlZCk6Ci0gICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKLSAgICB0cnk6Ci0gICAgICBmYWlsZWQgPSByZXR1cm5jb2RlIGlzIE5vbmUgb3IgcmV0dXJuY29kZSAhPSAwCi0gICAgICB0ZXN0ID0gc2VsZi5fdGVzdHNbaW5kZXhdCi0gICAgICBrbm93biA9IHRlc3QubmFtZSBpbiBzZWxmLl9rbm93bl9mYWlsdXJlcwotICAgICAgaWYgZmFpbGVkOgotICAgICAgICBpZiBrbm93bjoKLSAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJyVzIGZhaWxlZCBhcyBleHBlY3RlZCcgJSB0ZXN0Lm5hbWUpCi0gICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfZmFpbHVyZS5hcHBlbmQoaW5kZXgpCisgICAgZGVmIF9yZXN1bHRfc3RyaW5nKHNlbGYsIHRlc3QpOgorICAgICAgICBpZiB0ZXN0LnN1Y2Nlc3M6CisgICAgICAgICAgICBpZiB0ZXN0LnJldHJ5X2NvdW50ID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuICdzdWNjZXNzJworICAgICAgICAgICAgZWxpZiB0ZXN0LnJldHJ5X2NvdW50ID09IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmbGFreSgxIHJldHJ5KScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmbGFreSglZCByZXRyaWVzKScgJSB0ZXN0LnJldHJ5X2NvdW50CisgICAgICAgIGVsaWYgdGVzdC5leHBpcmVkOgorICAgICAgICAgICAgcmV0dXJuICdmYWlsdXJlKHRpbWVvdXQpJwogICAgICAgICBlbHNlOgotICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCd1bmV4cGVjdGVkIGZhaWx1cmU6ICVzJyAlIHRlc3QubmFtZSkKLSAgICAgICAgICBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUuYXBwZW5kKGluZGV4KQotICAgICAgZWxpZiBrbm93bjoKLSAgICAgICAgc2VsZi5fbG9nLmluZm8oJ3VuZXhwZWN0ZWQgc3VjY2VzczogJXMnICUgdGVzdC5uYW1lKQotICAgICAgICBzZWxmLl91bmV4cGVjdGVkX3N1Y2Nlc3MuYXBwZW5kKGluZGV4KQotICAgICAgdGVzdC5zdWNjZXNzID0gbm90IGZhaWxlZAotICAgICAgdGVzdC5yZXR1cm5jb2RlID0gcmV0dXJuY29kZQotICAgICAgdGVzdC5leHBpcmVkID0gZXhwaXJlZAotICAgICAgdGVzdC5hc19leHBlY3RlZCA9IGtub3duID09IGZhaWxlZAotICAgICAgaWYgbm90IHNlbGYuY29uY3VycmVudDoKLSAgICAgICAgcmVzdWx0ID0gJ3N1Y2Nlc3MnIGlmIG5vdCBmYWlsZWQgZWxzZSAnZmFpbHVyZScKLSAgICAgICAgcmVzdWx0X3N0cmluZyA9ICclcyglZCknICUgKHJlc3VsdCwgcmV0dXJuY29kZSkKLSAgICAgICAgc2VsZi5vdXQud3JpdGUocmVzdWx0X3N0cmluZyArICdcbicpCi0gICAgICBlbHNlOgotICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdCh0ZXN0KSkKLSAgICBmaW5hbGx5OgotICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgIHJldHVybiAnZmFpbHVyZSglZCknICUgdGVzdC5yZXR1cm5jb2RlCisKKyAgICBkZWYgX2dldF9yZXZpc2lvbihzZWxmKToKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWydnaXQnLCAncmV2LXBhcnNlJywgJy0tc2hvcnQnLCAnSEVBRCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9c2VsZi50ZXN0ZGlyLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBvdXQsIF8gPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgcmV0dXJuIG91dC5zdHJpcCgpCisKKyAgICBkZWYgX2Zvcm1hdF90ZXN0KHNlbGYsIHRlc3QsIHdpdGhfcmVzdWx0PVRydWUpOgorICAgICAgICBuYW1lID0gJyVzLSVzJyAlICh0ZXN0LnNlcnZlci5uYW1lLCB0ZXN0LmNsaWVudC5uYW1lKQorICAgICAgICB0cmFucyA9ICclcy0lcycgJSAodGVzdC50cmFuc3BvcnQsIHRlc3Quc29ja2V0KQorICAgICAgICBpZiBub3Qgd2l0aF9yZXN1bHQ6CisgICAgICAgICAgICByZXR1cm4gJ3s6MjRzfXs6MThzfXs6MjVzfScuZm9ybWF0KG5hbWVbOjIzXSwgdGVzdC5wcm90b2NvbFs6MTddLCB0cmFuc1s6MjRdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICd7OjI0c317OjE4c317OjI1c317OnN9XG4nLmZvcm1hdChuYW1lWzoyM10sIHRlc3QucHJvdG9jb2xbOjE3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNbOjI0XSwgc2VsZi5fcmVzdWx0X3N0cmluZyh0ZXN0KSkKKworICAgIGRlZiBfcHJpbnRfdGVzdF9oZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisgICAgICAgIHByaW50KAorICAgICAgICAgICAgJ3s6MjRzfXs6MThzfXs6MjVzfXs6c30nLmZvcm1hdCgnc2VydmVyLWNsaWVudDonLCAncHJvdG9jb2w6JywgJ3RyYW5zcG9ydDonLCAncmVzdWx0OicpLAorICAgICAgICAgICAgZmlsZT1zZWxmLm91dCkKKworICAgIGRlZiBfcHJpbnRfaGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLl9zdGFydCgpCisgICAgICAgIHByaW50KCdBcGFjaGUgVGhyaWZ0IC0gSW50ZWdyYXRpb24gVGVzdCBTdWl0ZScsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuX3ByaW50X2RhdGUoKQorICAgICAgICBzZWxmLl9wcmludF90ZXN0X2hlYWRlcigpCisKKyAgICBkZWYgX3ByaW50X3VuZXhwZWN0ZWRfZmFpbHVyZShzZWxmKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZSkgPiAwOgorICAgICAgICAgICAgc2VsZi5vdXQud3JpdGVsaW5lcyhbCisgICAgICAgICAgICAgICAgJyoqKiBGb2xsb3dpbmcgJWQgZmFpbHVyZXMgd2VyZSB1bmV4cGVjdGVkICoqKjpcbicgJSBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKSwKKyAgICAgICAgICAgICAgICAnSWYgaXQgaXMgaW50cm9kdWNlZCBieSB5b3UsIHBsZWFzZSBmaXggaXQgYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIGNvZGUuXG4nLAorICAgICAgICAgICAgICAgICMgJ0lmIG5vdCwgcGxlYXNlIHJlcG9ydCBhdCBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVFxuJywKKyAgICAgICAgICAgIF0pCisgICAgICAgICAgICBzZWxmLl9wcmludF90ZXN0X2hlYWRlcigpCisgICAgICAgICAgICBmb3IgaSBpbiBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmU6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3Qoc2VsZi5fdGVzdHNbaV0pKQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCdObyB1bmV4cGVjdGVkIGZhaWx1cmVzLicsIGZpbGU9c2VsZi5vdXQpCisKKyAgICBkZWYgX3ByaW50X2ZsYWt5X3N1Y2Nlc3Moc2VsZik6CisgICAgICAgIGlmIGxlbihzZWxmLl9mbGFreV9zdWNjZXNzKSA+IDA6CisgICAgICAgICAgICBwcmludCgKKyAgICAgICAgICAgICAgICAnRm9sbG93aW5nICVkIHRlc3RzIHdlcmUgZXhwZWN0ZWQgdG8gY2xlYW5seSBzdWNjZWVkIGJ1dCBuZWVkZWQgcmV0cnk6JyAlIGxlbihzZWxmLl9mbGFreV9zdWNjZXNzKSwKKyAgICAgICAgICAgICAgICBmaWxlPXNlbGYub3V0KQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfdGVzdF9oZWFkZXIoKQorICAgICAgICAgICAgZm9yIGkgaW4gc2VsZi5fZmxha3lfc3VjY2VzczoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdChzZWxmLl90ZXN0c1tpXSkpCisgICAgICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorCisgICAgZGVmIF9wcmludF91bmV4cGVjdGVkX3N1Y2Nlc3Moc2VsZik6CisgICAgICAgIGlmIGxlbihzZWxmLl91bmV4cGVjdGVkX3N1Y2Nlc3MpID4gMDoKKyAgICAgICAgICAgIHByaW50KAorICAgICAgICAgICAgICAgICdGb2xsb3dpbmcgJWQgdGVzdHMgd2VyZSBrbm93biB0byBmYWlsIGJ1dCBzdWNjZWVkZWQgKG1heWJlIGZsYWt5KTonICUgbGVuKHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcyksCisgICAgICAgICAgICAgICAgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKKyAgICAgICAgICAgIGZvciBpIGluIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzczoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdChzZWxmLl90ZXN0c1tpXSkpCisgICAgICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorCisgICAgZGVmIF9odHRwX3NlcnZlcl9jb21tYW5kKHNlbGYsIHBvcnQpOgorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKKyAgICAgICAgICAgIHJldHVybiAncHl0aG9uIC1tIFNpbXBsZUhUVFBTZXJ2ZXIgJWQnICUgcG9ydAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdweXRob24gLW0gaHR0cC5zZXJ2ZXIgJWQnICUgcG9ydAorCisgICAgZGVmIF9wcmludF9mb290ZXIoc2VsZik6CisgICAgICAgIGZhaWxfY291bnQgPSBsZW4oc2VsZi5fZXhwZWN0ZWRfZmFpbHVyZSkgKyBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKQorICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBzZWxmLl9wcmludF91bmV4cGVjdGVkX3N1Y2Nlc3MoKQorICAgICAgICBzZWxmLl9wcmludF9mbGFreV9zdWNjZXNzKCkKKyAgICAgICAgc2VsZi5fcHJpbnRfdW5leHBlY3RlZF9mYWlsdXJlKCkKKyAgICAgICAgc2VsZi5fd3JpdGVfaHRtbF9kYXRhKCkKKyAgICAgICAgc2VsZi5fYXNzZW1ibGVfbG9nKCd1bmV4cGVjdGVkIGZhaWx1cmVzJywgc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKQorICAgICAgICBzZWxmLl9hc3NlbWJsZV9sb2coJ2tub3duIGZhaWx1cmVzJywgc2VsZi5fZXhwZWN0ZWRfZmFpbHVyZSkKKyAgICAgICAgc2VsZi5vdXQud3JpdGVsaW5lcyhbCisgICAgICAgICAgICAnWW91IGNhbiBicm93c2UgcmVzdWx0cyBhdDpcbicsCisgICAgICAgICAgICAnXHRmaWxlOi8vJXMvJXNcbicgJSAoc2VsZi50ZXN0ZGlyLCBSRVNVTFRfSFRNTCksCisgICAgICAgICAgICAnIyBJZiB5b3UgdXNlIENocm9tZSwgcnVuOlxuJywKKyAgICAgICAgICAgICcjIFx0Y2QgJXNcbiNcdCVzXG4nICUgKHNlbGYuX2Jhc2VkaXIsIHNlbGYuX2h0dHBfc2VydmVyX2NvbW1hbmQoODAwMSkpLAorICAgICAgICAgICAgJyMgdGhlbiBicm93c2U6XG4nLAorICAgICAgICAgICAgJyMgXHRodHRwOi8vbG9jYWxob3N0OiVkLyVzL1xuJyAlICg4MDAxLCBzZWxmLl90ZXN0ZGlyX3JlbCksCisgICAgICAgICAgICAnRnVsbCBsb2cgZm9yIGVhY2ggdGVzdCBpcyBoZXJlOlxuJywKKyAgICAgICAgICAgICdcdHRlc3QvbG9nL3NlcnZlcl9jbGllbnRfcHJvdG9jb2xfdHJhbnNwb3J0X2NsaWVudC5sb2dcbicsCisgICAgICAgICAgICAnXHR0ZXN0L2xvZy9zZXJ2ZXJfY2xpZW50X3Byb3RvY29sX3RyYW5zcG9ydF9zZXJ2ZXIubG9nXG4nLAorICAgICAgICAgICAgJyVkIGZhaWxlZCBvZiAlZCB0ZXN0cyBpbiB0b3RhbC5cbicgJSAoZmFpbF9jb3VudCwgbGVuKHNlbGYuX3Rlc3RzKSksCisgICAgICAgIF0pCisgICAgICAgIHNlbGYuX3ByaW50X2V4ZWNfdGltZSgpCisgICAgICAgIHNlbGYuX3ByaW50X2RhdGUoKQorCisgICAgZGVmIF9yZW5kZXJfcmVzdWx0KHNlbGYsIHRlc3QpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgdGVzdC5zZXJ2ZXIubmFtZSwKKyAgICAgICAgICAgIHRlc3QuY2xpZW50Lm5hbWUsCisgICAgICAgICAgICB0ZXN0LnByb3RvY29sLAorICAgICAgICAgICAgdGVzdC50cmFuc3BvcnQsCisgICAgICAgICAgICB0ZXN0LnNvY2tldCwKKyAgICAgICAgICAgIHRlc3Quc3VjY2VzcywKKyAgICAgICAgICAgIHRlc3QuYXNfZXhwZWN0ZWQsCisgICAgICAgICAgICB0ZXN0LnJldHVybmNvZGUsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ3NlcnZlcic6IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgdGVzdC5zZXJ2ZXIua2luZCksCisgICAgICAgICAgICAgICAgJ2NsaWVudCc6IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgdGVzdC5jbGllbnQua2luZCksCisgICAgICAgICAgICB9LAorICAgICAgICBdCisKKyAgICBkZWYgX3dyaXRlX2h0bWxfZGF0YShzZWxmKToKKyAgICAgICAgIiIiV3JpdGVzIEpTT04gZGF0YSB0byBiZSByZWFkIGJ5IHJlc3VsdCBodG1sIiIiCisgICAgICAgIHJlc3VsdHMgPSBbc2VsZi5fcmVuZGVyX3Jlc3VsdChyKSBmb3IgciBpbiBzZWxmLl90ZXN0c10KKyAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4oc2VsZi5vdXRfcGF0aCwgJ3crJykgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZShqc29uLmR1bXBzKHsKKyAgICAgICAgICAgICAgICAnZGF0ZSc6IHNlbGYuX2Zvcm1hdF9kYXRlKCksCisgICAgICAgICAgICAgICAgJ3JldmlzaW9uJzogc3RyKHNlbGYuX3JldmlzaW9uKSwKKyAgICAgICAgICAgICAgICAncGxhdGZvcm0nOiBzZWxmLl9wbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICAnZHVyYXRpb24nOiAnezouMWZ9Jy5mb3JtYXQoc2VsZi5fZWxhcHNlZCksCisgICAgICAgICAgICAgICAgJ3Jlc3VsdHMnOiByZXN1bHRzLAorICAgICAgICAgICAgfSwgaW5kZW50PTIpKQorCisgICAgZGVmIF9hc3NlbWJsZV9sb2coc2VsZiwgdGl0bGUsIGluZGV4ZXMpOgorICAgICAgICBpZiBsZW4oaW5kZXhlcykgPiAwOgorICAgICAgICAgICAgZGVmIGFkZF9wcm9nX2xvZyhmcCwgdGVzdCwgcHJvZ19raW5kKToKKyAgICAgICAgICAgICAgICBwcmludCgnKioqKioqKioqKioqKioqKioqKioqKioqKioqICVzIG1lc3NhZ2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqJyAlIHByb2dfa2luZCwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlPWZwKQorICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLnRlc3RfbG9nZmlsZSh0ZXN0Lm5hbWUsIHByb2dfa2luZCwgc2VsZi50ZXN0ZGlyKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihwYXRoLCAncicpIGFzIHByb2dfZnA6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludChwcm9nX2ZwLnJlYWQoKSwgZmlsZT1mcCkKKyAgICAgICAgICAgIGZpbGVuYW1lID0gdGl0bGUucmVwbGFjZSgnICcsICdfJykgKyAnLmxvZycKKyAgICAgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKG9zLnBhdGguam9pbihzZWxmLmxvZ2RpciwgZmlsZW5hbWUpLCAndysnKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBmb3IgdGVzdCBpbiBtYXAoc2VsZi5fdGVzdHMuX19nZXRpdGVtX18sIGluZGV4ZXMpOgorICAgICAgICAgICAgICAgICAgICBmcC53cml0ZSgnVEVTVDogWyVzXVxuJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgYWRkX3Byb2dfbG9nKGZwLCB0ZXN0LCB0ZXN0LnNlcnZlci5raW5kKQorICAgICAgICAgICAgICAgICAgICBhZGRfcHJvZ19sb2coZnAsIHRlc3QsIHRlc3QuY2xpZW50LmtpbmQpCisgICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKCcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbicpCisgICAgICAgICAgICBwcmludCgnJXMgYXJlIGxvZ2dlZCB0byAlcy8lcy8lcycgJSAodGl0bGUuY2FwaXRhbGl6ZSgpLCBzZWxmLl90ZXN0ZGlyX3JlbCwgTE9HX0RJUiwgZmlsZW5hbWUpKQorCisgICAgZGVmIGVuZChzZWxmKToKKyAgICAgICAgc2VsZi5fcHJpbnRfZm9vdGVyKCkKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpID09IDAKKworICAgIGRlZiBhZGRfdGVzdChzZWxmLCB0ZXN0X2RpY3QpOgorICAgICAgICB0ZXN0ID0gVGVzdEVudHJ5KHNlbGYudGVzdGRpciwgKip0ZXN0X2RpY3QpCisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNvbmN1cnJlbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3QodGVzdCwgRmFsc2UpKQorICAgICAgICAgICAgICAgIHNlbGYub3V0LmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RzLmFwcGVuZCh0ZXN0KQorICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmLl90ZXN0cykgLSAxCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIGFkZF9yZXN1bHQoc2VsZiwgaW5kZXgsIHJldHVybmNvZGUsIGV4cGlyZWQsIHJldHJ5X2NvdW50KToKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmFpbGVkID0gcmV0dXJuY29kZSBpcyBOb25lIG9yIHJldHVybmNvZGUgIT0gMAorICAgICAgICAgICAgZmxha3kgPSBub3QgZmFpbGVkIGFuZCByZXRyeV9jb3VudCAhPSAwCisgICAgICAgICAgICB0ZXN0ID0gc2VsZi5fdGVzdHNbaW5kZXhdCisgICAgICAgICAgICBrbm93biA9IHRlc3QubmFtZSBpbiBzZWxmLl9rbm93bl9mYWlsdXJlcworICAgICAgICAgICAgaWYgZmFpbGVkOgorICAgICAgICAgICAgICAgIGlmIGtub3duOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJyVzIGZhaWxlZCBhcyBleHBlY3RlZCcgJSB0ZXN0Lm5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2V4cGVjdGVkX2ZhaWx1cmUuYXBwZW5kKGluZGV4KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCd1bmV4cGVjdGVkIGZhaWx1cmU6ICVzJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlLmFwcGVuZChpbmRleCkKKyAgICAgICAgICAgIGVsaWYgZmxha3kgYW5kIG5vdCBrbm93bjoKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygndW5leHBlY3RlZCBmbGFreSBzdWNjZXNzOiAlcycgJSB0ZXN0Lm5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5fZmxha3lfc3VjY2Vzcy5hcHBlbmQoaW5kZXgpCisgICAgICAgICAgICBlbGlmIG5vdCBmbGFreSBhbmQga25vd246CisgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oJ3VuZXhwZWN0ZWQgc3VjY2VzczogJXMnICUgdGVzdC5uYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2Vzcy5hcHBlbmQoaW5kZXgpCisgICAgICAgICAgICB0ZXN0LnN1Y2Nlc3MgPSBub3QgZmFpbGVkCisgICAgICAgICAgICB0ZXN0LnJldHVybmNvZGUgPSByZXR1cm5jb2RlCisgICAgICAgICAgICB0ZXN0LnJldHJ5X2NvdW50ID0gcmV0cnlfY291bnQKKyAgICAgICAgICAgIHRlc3QuZXhwaXJlZCA9IGV4cGlyZWQKKyAgICAgICAgICAgIHRlc3QuYXNfZXhwZWN0ZWQgPSBrbm93biA9PSBmYWlsZWQKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNvbmN1cnJlbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fcmVzdWx0X3N0cmluZyh0ZXN0KSArICdcbicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHRlc3QpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvcnVuLnB5IGIvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKaW5kZXggZTMzMDBiYS4uYmIwNmQyNSAxMDA2NDQKLS0tIGEvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKQEAgLTI0LDI5NCArMjQsNDAyIEBACiBpbXBvcnQgcGxhdGZvcm0KIGltcG9ydCByYW5kb20KIGltcG9ydCBzb2NrZXQKLWltcG9ydCBzaWduYWwKIGltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQotaW1wb3J0IHRyYWNlYmFjawogCi1mcm9tIGNyb3NzcnVubmVyLnRlc3QgaW1wb3J0IFRlc3RFbnRyeSwgZG9tYWluX3NvY2tldF9wYXRoCi1mcm9tIGNyb3NzcnVubmVyLnJlcG9ydCBpbXBvcnQgRXhlY1JlcG9ydGVyLCBTdW1tYXJ5UmVwb3J0ZXIKK2Zyb20gLmNvbXBhdCBpbXBvcnQgc3RyX2pvaW4KK2Zyb20gLnJlcG9ydCBpbXBvcnQgRXhlY1JlcG9ydGVyLCBTdW1tYXJ5UmVwb3J0ZXIKK2Zyb20gLnRlc3QgaW1wb3J0IFRlc3RFbnRyeQorZnJvbSAudXRpbCBpbXBvcnQgZG9tYWluX3NvY2tldF9wYXRoCiAKLVJFU1VMVF9USU1FT1VUID0gMTI4CiBSRVNVTFRfRVJST1IgPSA2NAorUkVTVUxUX1RJTUVPVVQgPSAxMjgKK1NJR05PTkUgPSAwCitTSUdLSUxMID0gMTUKKworIyBnbG9iYWxzCitwb3J0cyA9IE5vbmUKK3N0b3AgPSBOb25lCiAKIAogY2xhc3MgRXhlY3V0aW9uQ29udGV4dChvYmplY3QpOgotICBkZWYgX19pbml0X18oc2VsZiwgY21kLCBjd2QsIGVudiwgcmVwb3J0KToKLSAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCi0gICAgc2VsZi5yZXBvcnQgPSByZXBvcnQKLSAgICBzZWxmLmNtZCA9IGNtZAotICAgIHNlbGYuY3dkID0gY3dkCi0gICAgc2VsZi5lbnYgPSBlbnYKLSAgICBzZWxmLnRpbWVyID0gTm9uZQotICAgIHNlbGYuZXhwaXJlZCA9IEZhbHNlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNtZCwgY3dkLCBlbnYsIHN0b3Bfc2lnbmFsLCBpc19zZXJ2ZXIsIHJlcG9ydCk6CisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5jbWQgPSBjbWQKKyAgICAgICAgc2VsZi5jd2QgPSBjd2QKKyAgICAgICAgc2VsZi5lbnYgPSBlbnYKKyAgICAgICAgc2VsZi5zdG9wX3NpZ25hbCA9IHN0b3Bfc2lnbmFsCisgICAgICAgIHNlbGYuaXNfc2VydmVyID0gaXNfc2VydmVyCisgICAgICAgIHNlbGYucmVwb3J0ID0gcmVwb3J0CisgICAgICAgIHNlbGYuZXhwaXJlZCA9IEZhbHNlCisgICAgICAgIHNlbGYua2lsbGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5wcm9jID0gTm9uZQogCi0gIGRlZiBfZXhwaXJlKHNlbGYpOgotICAgIHNlbGYuX2xvZy5pbmZvKCdUaW1lb3V0JykKLSAgICBzZWxmLmV4cGlyZWQgPSBUcnVlCi0gICAgc2VsZi5raWxsKCkKKyAgICBkZWYgX3BvcGVuX2FyZ3Moc2VsZik6CisgICAgICAgIGFyZ3MgPSB7CisgICAgICAgICAgICAnY3dkJzogc2VsZi5jd2QsCisgICAgICAgICAgICAnZW52Jzogc2VsZi5lbnYsCisgICAgICAgICAgICAnc3Rkb3V0Jzogc2VsZi5yZXBvcnQub3V0LAorICAgICAgICAgICAgJ3N0ZGVycic6IHN1YnByb2Nlc3MuU1RET1VULAorICAgICAgICB9CisgICAgICAgICMgbWFrZSBzdXJlIGNoaWxkIHByb2Nlc3NlcyBkb2Vzbid0IHJlbWFpbiBhZnRlciBraWxsaW5nCisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKKyAgICAgICAgICAgIERFVEFDSEVEX1BST0NFU1MgPSAweDAwMDAwMDA4CisgICAgICAgICAgICBhcmdzLnVwZGF0ZShjcmVhdGlvbmZsYWdzPURFVEFDSEVEX1BST0NFU1MgfCBzdWJwcm9jZXNzLkNSRUFURV9ORVdfUFJPQ0VTU19HUk9VUCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZ3MudXBkYXRlKHByZWV4ZWNfZm49b3Muc2V0c2lkKQorICAgICAgICByZXR1cm4gYXJncwogCi0gIGRlZiBraWxsKHNlbGYpOgotICAgIHNlbGYuX2xvZy5kZWJ1ZygnS2lsbGluZyBwcm9jZXNzIDogJWQnICUgc2VsZi5wcm9jLnBpZCkKLSAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6Ci0gICAgICB0cnk6Ci0gICAgICAgIG9zLmtpbGxwZyhzZWxmLnByb2MucGlkLCBzaWduYWwuU0lHS0lMTCkKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgotICAgICAgICBzZWxmLl9sb2cuaW5mbygnRmFpbGVkIHRvIGtpbGwgcHJvY2VzcyBncm91cCA6ICVzJyAlIHN0cihlcnIpKQotICAgIHRyeToKLSAgICAgIHNlbGYucHJvYy5raWxsKCkKLSAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKLSAgICAgIHNlbGYuX2xvZy5pbmZvKCdGYWlsZWQgdG8ga2lsbCBwcm9jZXNzIDogJXMnICUgc3RyKGVycikpCi0gICAgc2VsZi5yZXBvcnQua2lsbGVkKCkKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgIGpvaW5lZCA9IHN0cl9qb2luKCcgJywgc2VsZi5jbWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnQ09NTUFORDogJXMnLCBqb2luZWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnV09SS0RJUjogJXMnLCBzZWxmLmN3ZCkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdMT0dGSUxFOiAlcycsIHNlbGYucmVwb3J0LmxvZ3BhdGgpCisgICAgICAgIHNlbGYucmVwb3J0LmJlZ2luKCkKKyAgICAgICAgc2VsZi5wcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihzZWxmLmNtZCwgKipzZWxmLl9wb3Blbl9hcmdzKCkpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnICAgIFBJRDogJWQnLCBzZWxmLnByb2MucGlkKQorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJyAgIFBHSUQ6ICVkJywgb3MuZ2V0cGdpZChzZWxmLnByb2MucGlkKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Njb3BlZCgpCiAKLSAgZGVmIF9wb3Blbl9hcmdzKHNlbGYpOgotICAgIGFyZ3MgPSB7Ci0gICAgICAnY3dkJzogc2VsZi5jd2QsCi0gICAgICAnZW52Jzogc2VsZi5lbnYsCi0gICAgICAnc3Rkb3V0Jzogc2VsZi5yZXBvcnQub3V0LAotICAgICAgJ3N0ZGVycic6IHN1YnByb2Nlc3MuU1RET1VULAotICAgIH0KLSAgICAjIG1ha2Ugc3VyZSBjaGlsZCBwcm9jZXNzZXMgZG9lc24ndCByZW1haW4gYWZ0ZXIga2lsbGluZwotICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKLSAgICAgIERFVEFDSEVEX1BST0NFU1MgPSAweDAwMDAwMDA4Ci0gICAgICBhcmdzLnVwZGF0ZShjcmVhdGlvbmZsYWdzPURFVEFDSEVEX1BST0NFU1MgfCBzdWJwcm9jZXNzLkNSRUFURV9ORVdfUFJPQ0VTU19HUk9VUCkKLSAgICBlbHNlOgotICAgICAgYXJncy51cGRhdGUocHJlZXhlY19mbj1vcy5zZXRzaWQpCi0gICAgcmV0dXJuIGFyZ3MKKyAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgIGRlZiBfc2NvcGVkKHNlbGYpOgorICAgICAgICB5aWVsZCBzZWxmCisgICAgICAgIGlmIHNlbGYuaXNfc2VydmVyOgorICAgICAgICAgICAgIyB0aGUgc2VydmVyIGlzIHN1cHBvc2VkIHRvIHJ1biB1bnRpbCB3ZSBzdG9wIGl0CisgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZGllZCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RvcF9zaWduYWwgIT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaWd3YWl0KHNlbGYuc3RvcF9zaWduYWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZW5kKHNlbGYucmV0dXJuY29kZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaWd3YWl0KFNJR0tJTEwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHRoZSBjbGllbnQgaXMgc3VwcG9zZWQgdG8gZXhpdCBub3JtYWxseQorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2lnd2FpdChTSUdLSUxMKQorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gZXhpdGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKIAotICBkZWYgc3RhcnQoc2VsZiwgdGltZW91dD0wKToKLSAgICBzZWxmLl9sb2cuZGVidWcoJ0NPTU1BTkQ6ICVzJywgJyAnLmpvaW4oc2VsZi5jbWQpKQotICAgIHNlbGYuX2xvZy5kZWJ1ZygnV09SS0RJUjogJXMnLCBzZWxmLmN3ZCkKLSAgICBzZWxmLl9sb2cuZGVidWcoJ0xPR0ZJTEU6ICVzJywgc2VsZi5yZXBvcnQubG9ncGF0aCkKLSAgICBzZWxmLnJlcG9ydC5iZWdpbigpCi0gICAgc2VsZi5wcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihzZWxmLmNtZCwgKipzZWxmLl9wb3Blbl9hcmdzKCkpCi0gICAgaWYgdGltZW91dCA+IDA6Ci0gICAgICBzZWxmLnRpbWVyID0gdGhyZWFkaW5nLlRpbWVyKHRpbWVvdXQsIHNlbGYuX2V4cGlyZSkKLSAgICAgIHNlbGYudGltZXIuc3RhcnQoKQotICAgIHJldHVybiBzZWxmLl9zY29wZWQoKQorICAgICMgU2VuZCBhIHNpZ25hbCB0byB0aGUgcHJvY2VzcyBhbmQgdGhlbiB3YWl0IGZvciBpdCB0byBlbmQKKyAgICAjIElmIHRoZSBzaWduYWwgcmVxdWVzdGVkIGlzIFNJR05PTkUsIG5vIHNpZ25hbCBpcyBzZW50LCBhbmQKKyAgICAjIGluc3RlYWQgd2UganVzdCB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBlbmQ7IGZ1cnRoZXIgaWYgaXQKKyAgICAjIGRvZXMgbm90IGVuZCBub3JtYWxseSB3aXRoIFNJR05PTkUsIHdlIG1hcmsgaXQgYXMgZXhwaXJlZC4KKyAgICAjIElmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIGVuZCBhbmQgdGhlIHNpZ25hbCBpcyBub3QgU0lHS0lMTCwKKyAgICAjIGl0IHJlLXJ1bnMgd2l0aCBTSUdLSUxMIHNvIHRoYXQgYSByZWFsIHByb2Nlc3Mga2lsbCBvY2N1cnMKKyAgICAjIHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvY2VzcyBlbmRlZCwgRmFsc2UgaWYgaXQgbWF5IG5vdCBoYXZlCisgICAgZGVmIHNpZ3dhaXQoc2VsZiwgc2lnPVNJR0tJTEwsIHRpbWVvdXQ9Mik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNpZyAhPSBTSUdOT05FOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gc2VuZCBzaWduYWwgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2lnKSkKKyAgICAgICAgICAgICAgICBpZiBzaWcgPT0gU0lHS0lMTDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5raWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5raWxscGcob3MuZ2V0cGdpZChzZWxmLnByb2MucGlkKSwgc2lnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jLnNlbmRfc2lnbmFsKHNpZykKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnW3swfV0gRmFpbGVkIHRvIGtpbGwgcHJvY2VzcycuZm9ybWF0KHNlbGYucHJvYy5waWQpLCBleGNfaW5mbz1zeXMuZXhjX2luZm8oKSkKKyAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gd2FpdCBiZWdpbiwgdGltZW91dCB7MX0gc2VjKHMpJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgdGltZW91dCkpCisgICAgICAgICAgICBzZWxmLnByb2MuY29tbXVuaWNhdGUodGltZW91dD10aW1lb3V0KQorICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdbezB9XSBwcm9jZXNzIGVuZGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKKyAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKKyAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCdbezB9XSB0aW1lb3V0IHdhaXRpbmcgZm9yIHByb2Nlc3MgdG8gZW5kJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCkpCisgICAgICAgICAgICBpZiBzaWcgPT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGlyZWQgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UgaWYgc2lnID09IFNJR0tJTEwgZWxzZSBzZWxmLnNpZ3dhaXQoU0lHS0lMTCwgMSkKIAotICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgotICBkZWYgX3Njb3BlZChzZWxmKToKLSAgICB5aWVsZCBzZWxmCi0gICAgc2VsZi5fbG9nLmRlYnVnKCdLaWxsaW5nIHNjb3BlZCBwcm9jZXNzJykKLSAgICBzZWxmLmtpbGwoKQorICAgICMgY2FsbGVkIG9uIHRoZSBjbGllbnQgcHJvY2VzcyB0byB3YWl0IGZvciBpdCB0byBlbmQgbmF0dXJhbGx5CisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dCk6CisgICAgICAgIHNlbGYuc2lnd2FpdChTSUdOT05FLCB0aW1lb3V0KQogCi0gIGRlZiB3YWl0KHNlbGYpOgotICAgIHNlbGYucHJvYy5jb21tdW5pY2F0ZSgpCi0gICAgaWYgc2VsZi50aW1lcjoKLSAgICAgIHNlbGYudGltZXIuY2FuY2VsKCkKLSAgICBzZWxmLnJlcG9ydC5lbmQoc2VsZi5yZXR1cm5jb2RlKQotCi0gIEBwcm9wZXJ0eQotICBkZWYgcmV0dXJuY29kZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5wcm9jLnJldHVybmNvZGUgaWYgc2VsZi5wcm9jIGVsc2UgTm9uZQorICAgIEBwcm9wZXJ0eQorICAgIGRlZiByZXR1cm5jb2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wcm9jLnJldHVybmNvZGUgaWYgc2VsZi5wcm9jIGVsc2UgTm9uZQogCiAKLWRlZiBleGVjX2NvbnRleHQocG9ydCwgdGVzdGRpciwgdGVzdCwgcHJvZyk6Ci0gIHJlcG9ydCA9IEV4ZWNSZXBvcnRlcih0ZXN0ZGlyLCB0ZXN0LCBwcm9nKQotICBwcm9nLmJ1aWxkX2NvbW1hbmQocG9ydCkKLSAgcmV0dXJuIEV4ZWN1dGlvbkNvbnRleHQocHJvZy5jb21tYW5kLCBwcm9nLndvcmtkaXIsIHByb2cuZW52LCByZXBvcnQpCitkZWYgZXhlY19jb250ZXh0KHBvcnQsIGxvZ2RpciwgdGVzdCwgcHJvZywgaXNfc2VydmVyKToKKyAgICByZXBvcnQgPSBFeGVjUmVwb3J0ZXIobG9nZGlyLCB0ZXN0LCBwcm9nKQorICAgIHByb2cuYnVpbGRfY29tbWFuZChwb3J0KQorICAgIHJldHVybiBFeGVjdXRpb25Db250ZXh0KHByb2cuY29tbWFuZCwgcHJvZy53b3JrZGlyLCBwcm9nLmVudiwgcHJvZy5zdG9wX3NpZ25hbCwgaXNfc2VydmVyLCByZXBvcnQpCiAKIAotZGVmIHJ1bl90ZXN0KHRlc3RkaXIsIHRlc3RfZGljdCwgYXN5bmM9VHJ1ZSwgbWF4X3JldHJ5PTMpOgotICB0cnk6CitkZWYgcnVuX3Rlc3QodGVzdGRpciwgbG9nZGlyLCB0ZXN0X2RpY3QsIG1heF9yZXRyeSwgYXN5bmNfbW9kZT1UcnVlKToKICAgICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCi0gICAgcmV0cnlfY291bnQgPSAwCi0gICAgdGVzdCA9IFRlc3RFbnRyeSh0ZXN0ZGlyLCAqKnRlc3RfZGljdCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgaWYgc3RvcC5pc19zZXQoKToKLSAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBiZWNhdXNlIHNodXR0aW5nIGRvd24nKQotICAgICAgICByZXR1cm4gTm9uZQotICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydCcpCi0gICAgICB3aXRoIFBvcnRBbGxvY2F0b3IuYWxsb2NfcG9ydF9zY29wZWQocG9ydHMsIHRlc3Quc29ja2V0KSBhcyBwb3J0OgotICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0IHdpdGggcG9ydCAlZCcgJSBwb3J0KQotICAgICAgICBzdiA9IGV4ZWNfY29udGV4dChwb3J0LCB0ZXN0ZGlyLCB0ZXN0LCB0ZXN0LnNlcnZlcikKLSAgICAgICAgY2wgPSBleGVjX2NvbnRleHQocG9ydCwgdGVzdGRpciwgdGVzdCwgdGVzdC5jbGllbnQpCiAKLSAgICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydGluZyBzZXJ2ZXInKQotICAgICAgICB3aXRoIHN2LnN0YXJ0KCk6Ci0gICAgICAgICAgaWYgdGVzdC5kZWxheSA+IDA6Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0RlbGF5aW5nIGNsaWVudCBmb3IgJS4yZiBzZWNvbmRzJyAlIHRlc3QuZGVsYXkpCi0gICAgICAgICAgICB0aW1lLnNsZWVwKHRlc3QuZGVsYXkpCi0gICAgICAgICAgY2xfcmV0cnlfY291bnQgPSAwCi0gICAgICAgICAgY2xfbWF4X3JldHJ5ID0gMTAKLSAgICAgICAgICBjbF9yZXRyeV93YWl0ID0gMC41Ci0gICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgY2xpZW50JykKLSAgICAgICAgICAgIGNsLnN0YXJ0KHRlc3QudGltZW91dCkKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2FpdGluZyBjbGllbnQnKQotICAgICAgICAgICAgY2wud2FpdCgpCi0gICAgICAgICAgICBpZiBub3QgY2wucmVwb3J0Lm1heWJlX2ZhbHNlX3Bvc2l0aXZlKCkgb3IgY2xfcmV0cnlfY291bnQgPj0gY2xfbWF4X3JldHJ5OgotICAgICAgICAgICAgICBpZiBjbF9yZXRyeV9jb3VudCA+IDAgYW5kIGNsX3JldHJ5X2NvdW50IDwgY2xfbWF4X3JldHJ5OgotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdbJXNdOiBDb25uZWN0ZWQgYWZ0ZXIgJWQgcmV0cnkgKCUuMmYgc2VjIGVhY2gpJyAlICh0ZXN0LnNlcnZlci5uYW1lLCBjbF9yZXRyeV9jb3VudCwgY2xfcmV0cnlfd2FpdCkpCi0gICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1NlcnZlciBtYXkgbm90IGJlIHJlYWR5LCB3YWl0aW5nICUuMmYgc2Vjb25kLi4uJyAlIGNsX3JldHJ5X3dhaXQpCi0gICAgICAgICAgICB0aW1lLnNsZWVwKGNsX3JldHJ5X3dhaXQpCi0gICAgICAgICAgICBjbF9yZXRyeV9jb3VudCArPSAxCisgICAgZGVmIGVuc3VyZV9zb2NrZXRfb3BlbihzdiwgcG9ydCwgdGVzdCk6CisgICAgICAgIHNsZXB0ID0gMC4xCisgICAgICAgIHRpbWUuc2xlZXAoc2xlcHQpCisgICAgICAgIHNsZWVwX3N0ZXAgPSAwLjEKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHNsZXB0ID4gdGVzdC5kZWxheToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybignW3swfV0gc2xlcHQgZm9yIHsxfSBzZWNvbmRzIGJ1dCBzZXJ2ZXIgaXMgbm90IG9wZW4nLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgdGVzdC5zb2NrZXQgPT0gJ2RvbWFpbic6CisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KSk6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnW3swfV0gZG9tYWluKHVuaXgpIHNvY2tldCBub3QgYXZhaWxhYmxlIHlldC4gc2xlcHQgZm9yIHsxfSBzZWNvbmRzIHNvIGZhcicuZm9ybWF0KHN2LnByb2MucGlkLCBzbGVwdCkpCisgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoc2xlZXBfc3RlcCkKKyAgICAgICAgICAgICAgICAgICAgc2xlcHQgKz0gc2xlZXBfc3RlcAorICAgICAgICAgICAgZWxpZiB0ZXN0LnNvY2tldCA9PSAnYWJzdHJhY3QnOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgQ3JlYXRlIHNvY2tldHMgZXZlcnkgaXRlcmF0aW9uIGJlY2F1c2UgcmVmdXNlZCBzb2NrZXRzIGNhbm5vdCBiZQorICAgICAgICAgICAgICAgICMgcmV1c2VkIG9uIHNvbWUgc3lzdGVtcy4KKyAgICAgICAgICAgICAgICBzb2NrNCA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICAgICAgICAgIHNvY2s2ID0gc29ja2V0LnNvY2tldChmYW1pbHk9c29ja2V0LkFGX0lORVQ2KQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgc29jazQuY29ubmVjdF9leCgoJzEyNy4wLjAuMScsIHBvcnQpKSA9PSAwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzb2NrNi5jb25uZWN0X2V4KCgnOjoxJywgcG9ydCkpID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBpZiBzdi5wcm9jLnBvbGwoKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdbezB9XSBzZXJ2ZXIgcHJvY2VzcyBpcyBleGl0ZWQnLmZvcm1hdChzdi5wcm9jLnBpZCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdbezB9XSBzb2NrZXQgbm90IGF2YWlsYWJsZSB5ZXQuIHNsZXB0IGZvciB7MX0gc2Vjb25kcyBzbyBmYXInLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNsZWVwX3N0ZXApCisgICAgICAgICAgICAgICAgICAgIHNsZXB0ICs9IHNsZWVwX3N0ZXAKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBzb2NrNC5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIHNvY2s2LmNsb3NlKCkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnW3swfV0gc2VydmVyIHJlYWR5IC0gd2FpdGVkIGZvciB7MX0gc2Vjb25kcycuZm9ybWF0KHN2LnByb2MucGlkLCBzbGVwdCkpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQogCi0gICAgICBpZiBub3Qgc3YucmVwb3J0Lm1heWJlX2ZhbHNlX3Bvc2l0aXZlKCkgb3IgcmV0cnlfY291bnQgPj0gbWF4X3JldHJ5OgotICAgICAgICBsb2dnZXIuZGVidWcoJ0ZpbmlzaCcpCi0gICAgICAgIHJldHVybiBSRVNVTFRfVElNRU9VVCBpZiBjbC5leHBpcmVkIGVsc2UgY2wucHJvYy5yZXR1cm5jb2RlCi0gICAgICBsb2dnZXIud2FybignWyVzXTogRGV0ZWN0ZWQgc29ja2V0IGJpbmQgZmFpbHVyZSwgcmV0cnlpbmcuLi4nICUgdGVzdC5zZXJ2ZXIubmFtZSkKLSAgICAgIHJldHJ5X2NvdW50ICs9IDEKLSAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6Ci0gICAgbG9nZ2VyLmluZm8oJ0ludGVycnVwdGVkIGV4ZWN1dGlvbicpCi0gICAgaWYgbm90IGFzeW5jOgotICAgICAgcmFpc2UKLSAgICBzdG9wLnNldCgpCi0gICAgcmV0dXJuIE5vbmUKLSAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKLSAgICBsb2dnZXIud2FybignRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRlc3QgOiAlcycgJSBzdHIoZXgpKQotICAgIGlmIG5vdCBhc3luYzoKLSAgICAgIHJhaXNlCi0gICAgbG9nZ2VyLmluZm8odHJhY2ViYWNrLnByaW50X2V4YygpKQotICAgIHJldHVybiBSRVNVTFRfRVJST1IKKyAgICB0cnk6CisgICAgICAgIG1heF9iaW5kX3JldHJ5ID0gMworICAgICAgICByZXRyeV9jb3VudCA9IDAKKyAgICAgICAgYmluZF9yZXRyeV9jb3VudCA9IDAKKyAgICAgICAgdGVzdCA9IFRlc3RFbnRyeSh0ZXN0ZGlyLCAqKnRlc3RfZGljdCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHN0b3AuaXNfc2V0KCk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBiZWNhdXNlIHNodXR0aW5nIGRvd24nKQorICAgICAgICAgICAgICAgIHJldHVybiAocmV0cnlfY291bnQsIE5vbmUpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0JykKKyAgICAgICAgICAgIHdpdGggUG9ydEFsbG9jYXRvci5hbGxvY19wb3J0X3Njb3BlZChwb3J0cywgdGVzdC5zb2NrZXQpIGFzIHBvcnQ6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydCB3aXRoIHBvcnQgJWQnICUgcG9ydCkKKyAgICAgICAgICAgICAgICBzdiA9IGV4ZWNfY29udGV4dChwb3J0LCBsb2dkaXIsIHRlc3QsIHRlc3Quc2VydmVyLCBUcnVlKQorICAgICAgICAgICAgICAgIGNsID0gZXhlY19jb250ZXh0KHBvcnQsIGxvZ2RpciwgdGVzdCwgdGVzdC5jbGllbnQsIEZhbHNlKQorCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydGluZyBzZXJ2ZXInKQorICAgICAgICAgICAgICAgIHdpdGggc3Yuc3RhcnQoKToKKyAgICAgICAgICAgICAgICAgICAgcG9ydF9vayA9IGVuc3VyZV9zb2NrZXRfb3BlbihzdiwgcG9ydCwgdGVzdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcG9ydF9vazoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcmV0cnlfY291bnQgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfY29ubmVjdF9yZXRyeSA9IDEyCisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X3JldHJ5X3dhaXQgPSAwLjI1CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN2LnByb2MucG9sbCgpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnbm90IHN0YXJ0aW5nIGNsaWVudCBiZWNhdXNlIHNlcnZlciBwcm9jZXNzIGlzIGFic2VudCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydGluZyBjbGllbnQnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsLnN0YXJ0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1dhaXRpbmcgY2xpZW50ICh1cCB0byAlZCBzZWNzKScgJSB0ZXN0LnRpbWVvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wud2FpdCh0ZXN0LnRpbWVvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNsLnJlcG9ydC5tYXliZV9mYWxzZV9wb3NpdGl2ZSgpIG9yIGNvbm5lY3RfcmV0cnlfY291bnQgPj0gbWF4X2Nvbm5lY3RfcmV0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbm5lY3RfcmV0cnlfY291bnQgPiAwIGFuZCBjb25uZWN0X3JldHJ5X2NvdW50IDwgbWF4X2Nvbm5lY3RfcmV0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnWyVzXTogQ29ubmVjdGVkIGFmdGVyICVkIHJldHJ5ICglLjJmIHNlYyBlYWNoKScgJSAodGVzdC5zZXJ2ZXIubmFtZSwgY29ubmVjdF9yZXRyeV9jb3VudCwgY29ubmVjdF9yZXRyeV93YWl0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXYWl0IGZvciA1MG1zIHRvIHNlZSBpZiBzZXJ2ZXIgZG9lcyBub3QgZGllIGF0IHRoZSBlbmQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1NlcnZlciBtYXkgbm90IGJlIHJlYWR5LCB3YWl0aW5nICUuMmYgc2Vjb25kLi4uJyAlIGNvbm5lY3RfcmV0cnlfd2FpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKGNvbm5lY3RfcmV0cnlfd2FpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X3JldHJ5X2NvdW50ICs9IDEKKworICAgICAgICAgICAgaWYgc3YucmVwb3J0Lm1heWJlX2ZhbHNlX3Bvc2l0aXZlKCkgYW5kIGJpbmRfcmV0cnlfY291bnQgPCBtYXhfYmluZF9yZXRyeToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybignWyVzXTogRGV0ZWN0ZWQgc29ja2V0IGJpbmQgZmFpbHVyZSwgcmV0cnlpbmcuLi4nLCB0ZXN0LnNlcnZlci5uYW1lKQorICAgICAgICAgICAgICAgIGJpbmRfcmV0cnlfY291bnQgKz0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSRVNVTFRfVElNRU9VVCBpZiBjbC5leHBpcmVkIGVsc2UgY2wucmV0dXJuY29kZSBpZiAoY2wucHJvYyBhbmQgY2wucHJvYy5wb2xsKCkpIGlzIG5vdCBOb25lIGVsc2UgUkVTVUxUX0VSUk9SCisKKyAgICAgICAgICAgICAgICAjIEZvciBzZXJ2ZXJzIHRoYXQgaGFuZGxlIGEgY29udHJvbGxlZCBzaHV0ZG93biBieSBzaWduYWwKKyAgICAgICAgICAgICAgICAjIGlmIHRoZXkgYXJlIGtpbGxlZCwgb3IgcmV0dXJuIGFuIGVycm9yIGNvZGUsIHRoYXQgaXMgYQorICAgICAgICAgICAgICAgICMgcHJvYmxlbS4gIEZvciBzZXJ2ZXJzIHRoYXQgYXJlIG5vdCBzaWduYWwtYXdhcmUsIHdlIHNpbXBseQorICAgICAgICAgICAgICAgICMga2lsbCB0aGVtIG9mZjsgaWYgd2UgZGlkbid0IGtpbGwgdGhlbSBvZmYsIHNvbWV0aGluZyBlbHNlCisgICAgICAgICAgICAgICAgIyBoYXBwZW5lZCAoY3Jhc2hlZD8pCisgICAgICAgICAgICAgICAgaWYgdGVzdC5zZXJ2ZXIuc3RvcF9zaWduYWwgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3Yua2lsbGVkIG9yIHN2LnJldHVybmNvZGUgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IFJFU1VMVF9FUlJPUgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzdi5raWxsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gUkVTVUxUX0VSUk9SCisKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQgPT0gMCBvciByZXRyeV9jb3VudCA+PSBtYXhfcmV0cnk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0cnlfY291bnQsIHJlc3VsdCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnWyVzLSVzXTogdGVzdCBmYWlsZWQsIHJldHJ5aW5nLi4uJywgdGVzdC5zZXJ2ZXIubmFtZSwgdGVzdC5jbGllbnQubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0cnlfY291bnQgKz0gMQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIGlmIG5vdCBhc3luY19tb2RlOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgbG9nZ2VyLndhcm4oJ0Vycm9yIGV4ZWN1dGluZyBbJXNdJywgdGVzdC5uYW1lLCBleGNfaW5mbz1UcnVlKQorICAgICAgICByZXR1cm4gKHJldHJ5X2NvdW50LCBSRVNVTFRfRVJST1IpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgbG9nZ2VyLmluZm8oJ0ludGVycnVwdGVkIGV4ZWN1dGlvbicsIGV4Y19pbmZvPVRydWUpCisgICAgICAgIGlmIG5vdCBhc3luY19tb2RlOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgc3RvcC5zZXQoKQorICAgICAgICByZXR1cm4gKHJldHJ5X2NvdW50LCBSRVNVTFRfRVJST1IpCiAKIAogY2xhc3MgUG9ydEFsbG9jYXRvcihvYmplY3QpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQotICAgIHNlbGYuX2xvY2sgPSBtdWx0aXByb2Nlc3NpbmcuTG9jaygpCi0gICAgc2VsZi5fcG9ydHMgPSBzZXQoKQotICAgIHNlbGYuX2RvbV9wb3J0cyA9IHNldCgpCi0gICAgc2VsZi5fbGFzdF9hbGxvYyA9IDAKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5fbG9jayA9IG11bHRpcHJvY2Vzc2luZy5Mb2NrKCkKKyAgICAgICAgc2VsZi5fcG9ydHMgPSBzZXQoKQorICAgICAgICBzZWxmLl9kb21fcG9ydHMgPSBzZXQoKQorICAgICAgICBzZWxmLl9sYXN0X2FsbG9jID0gMAogCi0gIGRlZiBfZ2V0X3RjcF9wb3J0KHNlbGYpOgotICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCi0gICAgc29jay5iaW5kKCgnMTI3LjAuMC4xJywgMCkpCi0gICAgcG9ydCA9IHNvY2suZ2V0c29ja25hbWUoKVsxXQotICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCi0gICAgdHJ5OgotICAgICAgb2sgPSBwb3J0IG5vdCBpbiBzZWxmLl9wb3J0cwotICAgICAgaWYgb2s6Ci0gICAgICAgIHNlbGYuX3BvcnRzLmFkZChwb3J0KQotICAgICAgICBzZWxmLl9sYXN0X2FsbG9jID0gdGltZS50aW1lKCkKLSAgICBmaW5hbGx5OgotICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKLSAgICAgIHNvY2suY2xvc2UoKQotICAgIHJldHVybiBwb3J0IGlmIG9rIGVsc2Ugc2VsZi5fZ2V0X3RjcF9wb3J0KCkKKyAgICBkZWYgX2dldF90Y3BfcG9ydChzZWxmKToKKyAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQorICAgICAgICBzb2NrLmJpbmQoKCcnLCAwKSkKKyAgICAgICAgcG9ydCA9IHNvY2suZ2V0c29ja25hbWUoKVsxXQorICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvayA9IHBvcnQgbm90IGluIHNlbGYuX3BvcnRzCisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBzZWxmLl9wb3J0cy5hZGQocG9ydCkKKyAgICAgICAgICAgICAgICBzZWxmLl9sYXN0X2FsbG9jID0gdGltZS50aW1lKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpCisgICAgICAgICAgICBzb2NrLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIHBvcnQgaWYgb2sgZWxzZSBzZWxmLl9nZXRfdGNwX3BvcnQoKQogCi0gIGRlZiBfZ2V0X2RvbWFpbl9wb3J0KHNlbGYpOgotICAgIHBvcnQgPSByYW5kb20ucmFuZGludCgxMDI0LCA2NTUzNikKLSAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQotICAgIHRyeToKLSAgICAgIG9rID0gcG9ydCBub3QgaW4gc2VsZi5fZG9tX3BvcnRzCi0gICAgICBpZiBvazoKLSAgICAgICAgc2VsZi5fZG9tX3BvcnRzLmFkZChwb3J0KQotICAgIGZpbmFsbHk6Ci0gICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQotICAgIHJldHVybiBwb3J0IGlmIG9rIGVsc2Ugc2VsZi5fZ2V0X2RvbWFpbl9wb3J0KCkKKyAgICBkZWYgX2dldF9kb21haW5fcG9ydChzZWxmKToKKyAgICAgICAgcG9ydCA9IHJhbmRvbS5yYW5kaW50KDEwMjQsIDY1NTM2KQorICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvayA9IHBvcnQgbm90IGluIHNlbGYuX2RvbV9wb3J0cworICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9tX3BvcnRzLmFkZChwb3J0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKyAgICAgICAgcmV0dXJuIHBvcnQgaWYgb2sgZWxzZSBzZWxmLl9nZXRfZG9tYWluX3BvcnQoKQogCi0gIGRlZiBhbGxvY19wb3J0KHNlbGYsIHNvY2tldF90eXBlKToKLSAgICBpZiBzb2NrZXRfdHlwZSA9PSAnZG9tYWluJzoKLSAgICAgIHJldHVybiBzZWxmLl9nZXRfZG9tYWluX3BvcnQoKQotICAgIGVsc2U6Ci0gICAgICByZXR1cm4gc2VsZi5fZ2V0X3RjcF9wb3J0KCkKKyAgICBkZWYgYWxsb2NfcG9ydChzZWxmLCBzb2NrZXRfdHlwZSk6CisgICAgICAgIGlmIHNvY2tldF90eXBlIGluICgnZG9tYWluJywgJ2Fic3RyYWN0Jyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2RvbWFpbl9wb3J0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfdGNwX3BvcnQoKQogCi0gICMgc3RhdGljIG1ldGhvZCBmb3IgaW50ZXItcHJvY2VzcyBpbnZva2F0aW9uCi0gIEBzdGF0aWNtZXRob2QKLSAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKLSAgZGVmIGFsbG9jX3BvcnRfc2NvcGVkKGFsbG9jYXRvciwgc29ja2V0X3R5cGUpOgotICAgIHBvcnQgPSBhbGxvY2F0b3IuYWxsb2NfcG9ydChzb2NrZXRfdHlwZSkKLSAgICB5aWVsZCBwb3J0Ci0gICAgYWxsb2NhdG9yLmZyZWVfcG9ydChzb2NrZXRfdHlwZSwgcG9ydCkKKyAgICAjIHN0YXRpYyBtZXRob2QgZm9yIGludGVyLXByb2Nlc3MgaW52b2thdGlvbgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgIGRlZiBhbGxvY19wb3J0X3Njb3BlZChhbGxvY2F0b3IsIHNvY2tldF90eXBlKToKKyAgICAgICAgcG9ydCA9IGFsbG9jYXRvci5hbGxvY19wb3J0KHNvY2tldF90eXBlKQorICAgICAgICB5aWVsZCBwb3J0CisgICAgICAgIGFsbG9jYXRvci5mcmVlX3BvcnQoc29ja2V0X3R5cGUsIHBvcnQpCiAKLSAgZGVmIGZyZWVfcG9ydChzZWxmLCBzb2NrZXRfdHlwZSwgcG9ydCk6Ci0gICAgc2VsZi5fbG9nLmRlYnVnKCdmcmVlX3BvcnQnKQotICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCi0gICAgdHJ5OgotICAgICAgaWYgc29ja2V0X3R5cGUgPT0gJ2RvbWFpbic6Ci0gICAgICAgIHNlbGYuX2RvbV9wb3J0cy5yZW1vdmUocG9ydCkKLSAgICAgICAgcGF0aCA9IGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KQotICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLSAgICAgICAgICBvcy5yZW1vdmUocGF0aCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNlbGYuX3BvcnRzLnJlbW92ZShwb3J0KQotICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGVycjoKLSAgICAgIHNlbGYuX2xvZy5pbmZvKCdFcnJvciB3aGlsZSBmcmVlaW5nIHBvcnQgOiAlcycgJSBzdHIoZXJyKSkKLSAgICBmaW5hbGx5OgotICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKyAgICBkZWYgZnJlZV9wb3J0KHNlbGYsIHNvY2tldF90eXBlLCBwb3J0KToKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdmcmVlX3BvcnQnKQorICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzb2NrZXRfdHlwZSA9PSAnZG9tYWluJzoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb21fcG9ydHMucmVtb3ZlKHBvcnQpCisgICAgICAgICAgICAgICAgcGF0aCA9IGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUocGF0aCkKKyAgICAgICAgICAgIGVsaWYgc29ja2V0X3R5cGUgPT0gJ2Fic3RyYWN0JzoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb21fcG9ydHMucmVtb3ZlKHBvcnQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX3BvcnRzLnJlbW92ZShwb3J0KQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCdFcnJvciB3aGlsZSBmcmVlaW5nIHBvcnQnLCBleGNfaW5mbz1zeXMuZXhjX2luZm8oKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpCiAKIAogY2xhc3MgTm9uQXN5bmNSZXN1bHQob2JqZWN0KToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKLSAgICBzZWxmLl92YWx1ZSA9IHZhbHVlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZQogCi0gIGRlZiBnZXQoc2VsZiwgdGltZW91dD1Ob25lKToKLSAgICByZXR1cm4gc2VsZi5fdmFsdWUKKyAgICBkZWYgZ2V0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLl92YWx1ZQogCi0gIGRlZiB3YWl0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6Ci0gICAgcGFzcworICAgIGRlZiB3YWl0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZHkoc2VsZik6Ci0gICAgcmV0dXJuIFRydWUKKyAgICBkZWYgcmVhZHkoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCiAKLSAgZGVmIHN1Y2Nlc3NmdWwoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX3ZhbHVlID09IDAKKyAgICBkZWYgc3VjY2Vzc2Z1bChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlID09IDAKIAogCiBjbGFzcyBUZXN0RGlzcGF0Y2hlcihvYmplY3QpOgotICBkZWYgX19pbml0X18oc2VsZiwgdGVzdGRpciwgY29uY3VycmVuY3kpOgotICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKLSAgICBzZWxmLnRlc3RkaXIgPSB0ZXN0ZGlyCi0gICAgIyBzZWVtcyBuZWVkZWQgZm9yIHB5dGhvbiAyLnggdG8gaGFuZGxlIGtleWJvYXJkIGludGVycnVwdAotICAgIHNlbGYuX3N0b3AgPSBtdWx0aXByb2Nlc3NpbmcuRXZlbnQoKQotICAgIHNlbGYuX2FzeW5jID0gY29uY3VycmVuY3kgPiAxCi0gICAgaWYgbm90IHNlbGYuX2FzeW5jOgotICAgICAgc2VsZi5fcG9vbCA9IE5vbmUKLSAgICAgIGdsb2JhbCBzdG9wCi0gICAgICBnbG9iYWwgcG9ydHMKLSAgICAgIHN0b3AgPSBzZWxmLl9zdG9wCi0gICAgICBwb3J0cyA9IFBvcnRBbGxvY2F0b3IoKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9tID0gbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLkJhc2VNYW5hZ2VyKCkKLSAgICAgIHNlbGYuX20ucmVnaXN0ZXIoJ3BvcnRzJywgUG9ydEFsbG9jYXRvcikKLSAgICAgIHNlbGYuX20uc3RhcnQoKQotICAgICAgc2VsZi5fcG9vbCA9IG11bHRpcHJvY2Vzc2luZy5Qb29sKGNvbmN1cnJlbmN5LCBzZWxmLl9wb29sX2luaXQsIChzZWxmLl9tLmFkZHJlc3MsKSkKLSAgICBzZWxmLl9yZXBvcnQgPSBTdW1tYXJ5UmVwb3J0ZXIodGVzdGRpciwgY29uY3VycmVuY3kgPiAxKQotICAgIHNlbGYuX2xvZy5kZWJ1ZygKLSAgICAgICAgJ1Rlc3REaXNwYXRjaGVyIHN0YXJ0ZWQgd2l0aCAlZCBjb25jdXJyZW50IGpvYnMnICUgY29uY3VycmVuY3kpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIGJhc2VkaXIsIGxvZ2Rpcl9yZWwsIGNvbmN1cnJlbmN5KToKKyAgICAgICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgICAgICBzZWxmLnRlc3RkaXIgPSB0ZXN0ZGlyCisgICAgICAgIHNlbGYuX3JlcG9ydCA9IFN1bW1hcnlSZXBvcnRlcihiYXNlZGlyLCBsb2dkaXJfcmVsLCBjb25jdXJyZW5jeSA+IDEpCisgICAgICAgIHNlbGYubG9nZGlyID0gc2VsZi5fcmVwb3J0LnRlc3RkaXIKKyAgICAgICAgIyBzZWVtcyBuZWVkZWQgZm9yIHB5dGhvbiAyLnggdG8gaGFuZGxlIGtleWJvYXJkIGludGVycnVwdAorICAgICAgICBzZWxmLl9zdG9wID0gbXVsdGlwcm9jZXNzaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fYXN5bmMgPSBjb25jdXJyZW5jeSA+IDEKKyAgICAgICAgaWYgbm90IHNlbGYuX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5fcG9vbCA9IE5vbmUKKyAgICAgICAgICAgIGdsb2JhbCBzdG9wCisgICAgICAgICAgICBnbG9iYWwgcG9ydHMKKyAgICAgICAgICAgIHN0b3AgPSBzZWxmLl9zdG9wCisgICAgICAgICAgICBwb3J0cyA9IFBvcnRBbGxvY2F0b3IoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbSA9IG11bHRpcHJvY2Vzc2luZy5tYW5hZ2Vycy5CYXNlTWFuYWdlcigpCisgICAgICAgICAgICBzZWxmLl9tLnJlZ2lzdGVyKCdwb3J0cycsIFBvcnRBbGxvY2F0b3IpCisgICAgICAgICAgICBzZWxmLl9tLnN0YXJ0KCkKKyAgICAgICAgICAgIHNlbGYuX3Bvb2wgPSBtdWx0aXByb2Nlc3NpbmcuUG9vbChjb25jdXJyZW5jeSwgc2VsZi5fcG9vbF9pbml0LCAoc2VsZi5fbS5hZGRyZXNzLCkpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygKKyAgICAgICAgICAgICdUZXN0RGlzcGF0Y2hlciBzdGFydGVkIHdpdGggJWQgY29uY3VycmVudCBqb2JzJyAlIGNvbmN1cnJlbmN5KQogCi0gIGRlZiBfcG9vbF9pbml0KHNlbGYsIGFkZHJlc3MpOgotICAgIGdsb2JhbCBzdG9wCi0gICAgZ2xvYmFsIG0KLSAgICBnbG9iYWwgcG9ydHMKLSAgICBzdG9wID0gc2VsZi5fc3RvcAotICAgIG0gPSBtdWx0aXByb2Nlc3NpbmcubWFuYWdlcnMuQmFzZU1hbmFnZXIoYWRkcmVzcykKLSAgICBtLmNvbm5lY3QoKQotICAgIHBvcnRzID0gbS5wb3J0cygpCisgICAgZGVmIF9wb29sX2luaXQoc2VsZiwgYWRkcmVzcyk6CisgICAgICAgIGdsb2JhbCBzdG9wCisgICAgICAgIGdsb2JhbCBtCisgICAgICAgIGdsb2JhbCBwb3J0cworICAgICAgICBzdG9wID0gc2VsZi5fc3RvcAorICAgICAgICBtID0gbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLkJhc2VNYW5hZ2VyKGFkZHJlc3MpCisgICAgICAgIG0uY29ubmVjdCgpCisgICAgICAgIHBvcnRzID0gbS5wb3J0cygpCiAKLSAgZGVmIF9kaXNwYXRjaF9zeW5jKHNlbGYsIHRlc3QsIGNvbnQpOgotICAgIHIgPSBydW5fdGVzdChzZWxmLnRlc3RkaXIsIHRlc3QsIEZhbHNlKQotICAgIGNvbnQocikKLSAgICByZXR1cm4gTm9uQXN5bmNSZXN1bHQocikKKyAgICBkZWYgX2Rpc3BhdGNoX3N5bmMoc2VsZiwgdGVzdCwgY29udCwgbWF4X3JldHJ5KToKKyAgICAgICAgciA9IHJ1bl90ZXN0KHNlbGYudGVzdGRpciwgc2VsZi5sb2dkaXIsIHRlc3QsIG1heF9yZXRyeSwgYXN5bmNfbW9kZT1GYWxzZSkKKyAgICAgICAgY29udChyKQorICAgICAgICByZXR1cm4gTm9uQXN5bmNSZXN1bHQocikKIAotICBkZWYgX2Rpc3BhdGNoX2FzeW5jKHNlbGYsIHRlc3QsIGNvbnQpOgotICAgIHJldHVybiBzZWxmLl9wb29sLmFwcGx5X2FzeW5jKGZ1bmM9cnVuX3Rlc3QsIGFyZ3M9KHNlbGYudGVzdGRpciwgdGVzdCwpLCBjYWxsYmFjaz1jb250KQorICAgIGRlZiBfZGlzcGF0Y2hfYXN5bmMoc2VsZiwgdGVzdCwgY29udCwgbWF4X3JldHJ5KToKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdfZGlzcGF0Y2hfYXN5bmMnKQorICAgICAgICByZXR1cm4gc2VsZi5fcG9vbC5hcHBseV9hc3luYyhmdW5jPXJ1bl90ZXN0LCBhcmdzPShzZWxmLnRlc3RkaXIsIHNlbGYubG9nZGlyLCB0ZXN0LCBtYXhfcmV0cnkpLCBjYWxsYmFjaz1jb250KQogCi0gIGRlZiBkaXNwYXRjaChzZWxmLCB0ZXN0KToKLSAgICBpbmRleCA9IHNlbGYuX3JlcG9ydC5hZGRfdGVzdCh0ZXN0KQorICAgIGRlZiBkaXNwYXRjaChzZWxmLCB0ZXN0LCBtYXhfcmV0cnkpOgorICAgICAgICBpbmRleCA9IHNlbGYuX3JlcG9ydC5hZGRfdGVzdCh0ZXN0KQogCi0gICAgZGVmIGNvbnQocik6Ci0gICAgICBpZiBub3Qgc2VsZi5fc3RvcC5pc19zZXQoKToKLSAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdmcmVlaW5nIHBvcnQnKQotICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2FkZGluZyByZXN1bHQnKQotICAgICAgICBzZWxmLl9yZXBvcnQuYWRkX3Jlc3VsdChpbmRleCwgciwgciA9PSBSRVNVTFRfVElNRU9VVCkKLSAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdmaW5pc2ggY29udGludWF0aW9uJykKLSAgICBmbiA9IHNlbGYuX2Rpc3BhdGNoX2FzeW5jIGlmIHNlbGYuX2FzeW5jIGVsc2Ugc2VsZi5fZGlzcGF0Y2hfc3luYwotICAgIHJldHVybiBmbih0ZXN0LCBjb250KQorICAgICAgICBkZWYgY29udChyZXN1bHQpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3N0b3AuaXNfc2V0KCk6CisgICAgICAgICAgICAgICAgaWYgcmVzdWx0IGFuZCBsZW4ocmVzdWx0KSA9PSAyOgorICAgICAgICAgICAgICAgICAgICByZXRyeV9jb3VudCwgcmV0dXJuY29kZSA9IHJlc3VsdAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHJ5X2NvdW50ID0gMAorICAgICAgICAgICAgICAgICAgICByZXR1cm5jb2RlID0gUkVTVUxUX0VSUk9SCisgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdmcmVlaW5nIHBvcnQnKQorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnYWRkaW5nIHJlc3VsdCcpCisgICAgICAgICAgICAgICAgc2VsZi5fcmVwb3J0LmFkZF9yZXN1bHQoaW5kZXgsIHJldHVybmNvZGUsIHJldHVybmNvZGUgPT0gUkVTVUxUX1RJTUVPVVQsIHJldHJ5X2NvdW50KQorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnZmluaXNoIGNvbnRpbnVhdGlvbicpCisgICAgICAgIGZuID0gc2VsZi5fZGlzcGF0Y2hfYXN5bmMgaWYgc2VsZi5fYXN5bmMgZWxzZSBzZWxmLl9kaXNwYXRjaF9zeW5jCisgICAgICAgIHJldHVybiBmbih0ZXN0LCBjb250LCBtYXhfcmV0cnkpCiAKLSAgZGVmIHdhaXQoc2VsZik6Ci0gICAgaWYgc2VsZi5fYXN5bmM6Ci0gICAgICBzZWxmLl9wb29sLmNsb3NlKCkKLSAgICAgIHNlbGYuX3Bvb2wuam9pbigpCi0gICAgICBzZWxmLl9tLnNodXRkb3duKCkKLSAgICByZXR1cm4gc2VsZi5fcmVwb3J0LmVuZCgpCisgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5fcG9vbC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLl9wb29sLmpvaW4oKQorICAgICAgICAgICAgc2VsZi5fbS5zaHV0ZG93bigpCisgICAgICAgIHJldHVybiBzZWxmLl9yZXBvcnQuZW5kKCkKIAotICBkZWYgdGVybWluYXRlKHNlbGYpOgotICAgIHNlbGYuX3N0b3Auc2V0KCkKLSAgICBpZiBzZWxmLl9hc3luYzoKLSAgICAgIHNlbGYuX3Bvb2wudGVybWluYXRlKCkKLSAgICAgIHNlbGYuX3Bvb2wuam9pbigpCi0gICAgICBzZWxmLl9tLnNodXRkb3duKCkKKyAgICBkZWYgdGVybWluYXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9zdG9wLnNldCgpCisgICAgICAgIGlmIHNlbGYuX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5fcG9vbC50ZXJtaW5hdGUoKQorICAgICAgICAgICAgc2VsZi5fcG9vbC5qb2luKCkKKyAgICAgICAgICAgIHNlbGYuX20uc2h1dGRvd24oKQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9zZXR1cC5jZmcgYi90ZXN0L2Nyb3NzcnVubmVyL3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGExZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9zZXR1cC5jZmcKQEAgLTAsMCArMSwyIEBACitbZmxha2U4XQorbWF4LWxpbmUtbGVuZ3RoID0gMTAwCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL3Rlc3QucHkgYi90ZXN0L2Nyb3NzcnVubmVyL3Rlc3QucHkKaW5kZXggNTEyZTY2NC4uMGU5MTI4NCAxMDA2NDQKLS0tIGEvdGVzdC9jcm9zc3J1bm5lci90ZXN0LnB5CisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvdGVzdC5weQpAQCAtMjEsMTE2ICsyMSwxMjkgQEAKIGltcG9ydCBtdWx0aXByb2Nlc3NpbmcKIGltcG9ydCBvcwogaW1wb3J0IHN5cwotCi1mcm9tIGNyb3NzcnVubmVyLnV0aWwgaW1wb3J0IG1lcmdlX2RpY3QKLQotCi1kZWYgZG9tYWluX3NvY2tldF9wYXRoKHBvcnQpOgotICByZXR1cm4gJy90bXAvVGhyaWZ0VGVzdC50aHJpZnQuJWQnICUgcG9ydAorZnJvbSAuY29tcGF0IGltcG9ydCBwYXRoX2pvaW4KK2Zyb20gLnV0aWwgaW1wb3J0IG1lcmdlX2RpY3QsIGRvbWFpbl9zb2NrZXRfcGF0aAogCiAKIGNsYXNzIFRlc3RQcm9ncmFtKG9iamVjdCk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBraW5kLCBuYW1lLCBwcm90b2NvbCwgdHJhbnNwb3J0LCBzb2NrZXQsIHdvcmtkaXIsIGNvbW1hbmQsIGVudj1Ob25lLAotICAgICAgICAgICAgICAgZXh0cmFfYXJncz1bXSwgam9pbl9hcmdzPUZhbHNlLCAqKmt3YXJncyk6Ci0gICAgc2VsZi5raW5kID0ga2luZAotICAgIHNlbGYubmFtZSA9IG5hbWUKLSAgICBzZWxmLnByb3RvY29sID0gcHJvdG9jb2wKLSAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAotICAgIHNlbGYuc29ja2V0ID0gc29ja2V0Ci0gICAgc2VsZi53b3JrZGlyID0gd29ya2RpcgotICAgIHNlbGYuY29tbWFuZCA9IE5vbmUKLSAgICBzZWxmLl9iYXNlX2NvbW1hbmQgPSBzZWxmLl9maXhfY21kX3BhdGgoY29tbWFuZCkKLSAgICBpZiBlbnY6Ci0gICAgICBzZWxmLmVudiA9IGNvcHkuY29weShvcy5lbnZpcm9uKQotICAgICAgc2VsZi5lbnYudXBkYXRlKGVudikKLSAgICBlbHNlOgotICAgICAgc2VsZi5lbnYgPSBvcy5lbnZpcm9uCi0gICAgc2VsZi5fZXh0cmFfYXJncyA9IGV4dHJhX2FyZ3MKLSAgICBzZWxmLl9qb2luX2FyZ3MgPSBqb2luX2FyZ3MKKyAgICBkZWYgX19pbml0X18oc2VsZiwga2luZCwgbmFtZSwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0LCB3b3JrZGlyLCBzdG9wX3NpZ25hbCwgY29tbWFuZCwgZW52PU5vbmUsCisgICAgICAgICAgICAgICAgIGV4dHJhX2FyZ3M9W10sIGV4dHJhX2FyZ3MyPVtdLCBqb2luX2FyZ3M9RmFsc2UsICoqa3dhcmdzKToKIAotICBkZWYgX2ZpeF9jbWRfcGF0aChzZWxmLCBjbWQpOgotICAgICMgaWYgdGhlIGFyZyBpcyBhIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBtYWtlIGl0IHBhdGgKLSAgICBkZWYgYWJzX2lmX2V4aXN0cyhhcmcpOgotICAgICAgcCA9IG9zLnBhdGguam9pbihzZWxmLndvcmtkaXIsIGFyZykKLSAgICAgIHJldHVybiBwIGlmIG9zLnBhdGguZXhpc3RzKHApIGVsc2UgYXJnCisgICAgICAgIHNlbGYua2luZCA9IGtpbmQKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnByb3RvY29sID0gcHJvdG9jb2wKKyAgICAgICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgICAgICAgc2VsZi5zb2NrZXQgPSBzb2NrZXQKKyAgICAgICAgc2VsZi53b3JrZGlyID0gd29ya2RpcgorICAgICAgICBzZWxmLnN0b3Bfc2lnbmFsID0gc3RvcF9zaWduYWwKKyAgICAgICAgc2VsZi5jb21tYW5kID0gTm9uZQorICAgICAgICBzZWxmLl9iYXNlX2NvbW1hbmQgPSBzZWxmLl9maXhfY21kX3BhdGgoY29tbWFuZCkKKyAgICAgICAgaWYgZW52OgorICAgICAgICAgICAgc2VsZi5lbnYgPSBjb3B5LmNvcHkob3MuZW52aXJvbikKKyAgICAgICAgICAgIHNlbGYuZW52LnVwZGF0ZShlbnYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmVudiA9IG9zLmVudmlyb24KKyAgICAgICAgc2VsZi5fZXh0cmFfYXJncyA9IGV4dHJhX2FyZ3MKKyAgICAgICAgc2VsZi5fZXh0cmFfYXJnczIgPSBleHRyYV9hcmdzMgorICAgICAgICBzZWxmLl9qb2luX2FyZ3MgPSBqb2luX2FyZ3MKIAotICAgIGlmIGNtZFswXSA9PSAncHl0aG9uJzoKLSAgICAgIGNtZFswXSA9IHN5cy5leGVjdXRhYmxlCi0gICAgZWxzZToKLSAgICAgIGNtZFswXSA9IGFic19pZl9leGlzdHMoY21kWzBdKQotICAgIHJldHVybiBjbWQKKyAgICBkZWYgX2ZpeF9jbWRfcGF0aChzZWxmLCBjbWQpOgorICAgICAgICAjIGlmIHRoZSBhcmcgaXMgYSBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgbWFrZSBpdCBwYXRoCisgICAgICAgIGRlZiBhYnNfaWZfZXhpc3RzKGFyZyk6CisgICAgICAgICAgICBwID0gcGF0aF9qb2luKHNlbGYud29ya2RpciwgYXJnKQorICAgICAgICAgICAgcmV0dXJuIHAgaWYgb3MucGF0aC5leGlzdHMocCkgZWxzZSBhcmcKIAotICBkZWYgX3NvY2tldF9hcmcoc2VsZiwgc29ja2V0LCBwb3J0KToKLSAgICByZXR1cm4gewotICAgICAgJ2lwLXNzbCc6ICctLXNzbCcsCi0gICAgICAnZG9tYWluJzogJy0tZG9tYWluLXNvY2tldD0lcycgJSBkb21haW5fc29ja2V0X3BhdGgocG9ydCksCi0gICAgfS5nZXQoc29ja2V0LCBOb25lKQorICAgICAgICBpZiBjbWRbMF0gPT0gJ3B5dGhvbic6CisgICAgICAgICAgICBjbWRbMF0gPSBzeXMuZXhlY3V0YWJsZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY21kWzBdID0gYWJzX2lmX2V4aXN0cyhjbWRbMF0pCisgICAgICAgIHJldHVybiBjbWQKIAotICBkZWYgYnVpbGRfY29tbWFuZChzZWxmLCBwb3J0KToKLSAgICBjbWQgPSBjb3B5LmNvcHkoc2VsZi5fYmFzZV9jb21tYW5kKQotICAgIGFyZ3MgPSBbXQotICAgIGFyZ3MuYXBwZW5kKCctLXByb3RvY29sPScgKyBzZWxmLnByb3RvY29sKQotICAgIGFyZ3MuYXBwZW5kKCctLXRyYW5zcG9ydD0nICsgc2VsZi50cmFuc3BvcnQpCi0gICAgc29ja2V0X2FyZyA9IHNlbGYuX3NvY2tldF9hcmcoc2VsZi5zb2NrZXQsIHBvcnQpCi0gICAgaWYgc29ja2V0X2FyZzoKLSAgICAgIGFyZ3MuYXBwZW5kKHNvY2tldF9hcmcpCi0gICAgYXJncy5hcHBlbmQoJy0tcG9ydD0lZCcgJSBwb3J0KQotICAgIGlmIHNlbGYuX2pvaW5fYXJnczoKLSAgICAgIGNtZC5hcHBlbmQoJyVzJyAlICIgIi5qb2luKGFyZ3MpKQotICAgIGVsc2U6Ci0gICAgICBjbWQuZXh0ZW5kKGFyZ3MpCi0gICAgaWYgc2VsZi5fZXh0cmFfYXJnczoKLSAgICAgIGNtZC5leHRlbmQoc2VsZi5fZXh0cmFfYXJncykKLSAgICBzZWxmLmNvbW1hbmQgPSBjbWQKLSAgICByZXR1cm4gc2VsZi5jb21tYW5kCisgICAgZGVmIF9zb2NrZXRfYXJncyhzZWxmLCBzb2NrZXQsIHBvcnQpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ2lwLXNzbCc6IFsnLS1zc2wnXSwKKyAgICAgICAgICAgICdkb21haW4nOiBbJy0tZG9tYWluLXNvY2tldD0lcycgJSBkb21haW5fc29ja2V0X3BhdGgocG9ydCldLAorICAgICAgICAgICAgJ2Fic3RyYWN0JzogWyctLWFic3RyYWN0LW5hbWVzcGFjZScsICctLWRvbWFpbi1zb2NrZXQ9JXMnICUgZG9tYWluX3NvY2tldF9wYXRoKHBvcnQpXSwKKyAgICAgICAgfS5nZXQoc29ja2V0LCBOb25lKQorCisgICAgZGVmIF90cmFuc3BvcnRfYXJncyhzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ3psaWInOiBbJy0temxpYiddLAorICAgICAgICB9LmdldCh0cmFuc3BvcnQsIE5vbmUpCisKKyAgICBkZWYgYnVpbGRfY29tbWFuZChzZWxmLCBwb3J0KToKKyAgICAgICAgY21kID0gY29weS5jb3B5KHNlbGYuX2Jhc2VfY29tbWFuZCkKKyAgICAgICAgYXJncyA9IGNvcHkuY29weShzZWxmLl9leHRyYV9hcmdzMikKKyAgICAgICAgYXJncy5hcHBlbmQoJy0tcHJvdG9jb2w9JyArIHNlbGYucHJvdG9jb2wpCisgICAgICAgIGFyZ3MuYXBwZW5kKCctLXRyYW5zcG9ydD0nICsgc2VsZi50cmFuc3BvcnQpCisgICAgICAgIHRyYW5zcG9ydF9hcmdzID0gc2VsZi5fdHJhbnNwb3J0X2FyZ3Moc2VsZi50cmFuc3BvcnQpCisgICAgICAgIGlmIHRyYW5zcG9ydF9hcmdzOgorICAgICAgICAgICAgYXJncyArPSB0cmFuc3BvcnRfYXJncworICAgICAgICBzb2NrZXRfYXJncyA9IHNlbGYuX3NvY2tldF9hcmdzKHNlbGYuc29ja2V0LCBwb3J0KQorICAgICAgICBpZiBzb2NrZXRfYXJnczoKKyAgICAgICAgICAgIGFyZ3MgKz0gc29ja2V0X2FyZ3MKKyAgICAgICAgYXJncy5hcHBlbmQoJy0tcG9ydD0lZCcgJSBwb3J0KQorICAgICAgICBpZiBzZWxmLl9qb2luX2FyZ3M6CisgICAgICAgICAgICBjbWQuYXBwZW5kKCclcycgJSAiICIuam9pbihhcmdzKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZC5leHRlbmQoYXJncykKKyAgICAgICAgaWYgc2VsZi5fZXh0cmFfYXJnczoKKyAgICAgICAgICAgIGNtZC5leHRlbmQoc2VsZi5fZXh0cmFfYXJncykKKyAgICAgICAgc2VsZi5jb21tYW5kID0gY21kCisgICAgICAgIHJldHVybiBzZWxmLmNvbW1hbmQKIAogCiBjbGFzcyBUZXN0RW50cnkob2JqZWN0KToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIHNlcnZlciwgY2xpZW50LCBkZWxheSwgdGltZW91dCwgKiprd2FyZ3MpOgotICAgIHNlbGYudGVzdGRpciA9IHRlc3RkaXIKLSAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCi0gICAgc2VsZi5fY29uZmlnID0ga3dhcmdzCi0gICAgc2VsZi5wcm90b2NvbCA9IGt3YXJnc1sncHJvdG9jb2wnXQotICAgIHNlbGYudHJhbnNwb3J0ID0ga3dhcmdzWyd0cmFuc3BvcnQnXQotICAgIHNlbGYuc29ja2V0ID0ga3dhcmdzWydzb2NrZXQnXQotICAgIHNlbGYuc2VydmVyID0gVGVzdFByb2dyYW0oJ3NlcnZlcicsICoqc2VsZi5fZml4X3dvcmtkaXIobWVyZ2VfZGljdChzZWxmLl9jb25maWcsIHNlcnZlcikpKQotICAgIHNlbGYuY2xpZW50ID0gVGVzdFByb2dyYW0oJ2NsaWVudCcsICoqc2VsZi5fZml4X3dvcmtkaXIobWVyZ2VfZGljdChzZWxmLl9jb25maWcsIGNsaWVudCkpKQotICAgIHNlbGYuZGVsYXkgPSBkZWxheQotICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKLSAgICBzZWxmLl9uYW1lID0gTm9uZQotICAgICMgcmVzdWx0cwotICAgIHNlbGYuc3VjY2VzcyA9IE5vbmUKLSAgICBzZWxmLmFzX2V4cGVjdGVkID0gTm9uZQotICAgIHNlbGYucmV0dXJuY29kZSA9IE5vbmUKLSAgICBzZWxmLmV4cGlyZWQgPSBGYWxzZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0ZGlyLCBzZXJ2ZXIsIGNsaWVudCwgZGVsYXksIHRpbWVvdXQsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi50ZXN0ZGlyID0gdGVzdGRpcgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYuX2NvbmZpZyA9IGt3YXJncworICAgICAgICBzZWxmLnByb3RvY29sID0ga3dhcmdzWydwcm90b2NvbCddCisgICAgICAgIHNlbGYudHJhbnNwb3J0ID0ga3dhcmdzWyd0cmFuc3BvcnQnXQorICAgICAgICBzZWxmLnNvY2tldCA9IGt3YXJnc1snc29ja2V0J10KKyAgICAgICAgc3J2X2RpY3QgPSBzZWxmLl9maXhfd29ya2RpcihtZXJnZV9kaWN0KHNlbGYuX2NvbmZpZywgc2VydmVyKSkKKyAgICAgICAgY2xpX2RpY3QgPSBzZWxmLl9maXhfd29ya2RpcihtZXJnZV9kaWN0KHNlbGYuX2NvbmZpZywgY2xpZW50KSkKKyAgICAgICAgY2xpX2RpY3RbJ2V4dHJhX2FyZ3MyJ10gPSBzcnZfZGljdC5wb3AoJ3JlbW90ZV9hcmdzJywgW10pCisgICAgICAgIHNydl9kaWN0WydleHRyYV9hcmdzMiddID0gY2xpX2RpY3QucG9wKCdyZW1vdGVfYXJncycsIFtdKQorICAgICAgICBzZWxmLnNlcnZlciA9IFRlc3RQcm9ncmFtKCdzZXJ2ZXInLCAqKnNydl9kaWN0KQorICAgICAgICBzZWxmLmNsaWVudCA9IFRlc3RQcm9ncmFtKCdjbGllbnQnLCAqKmNsaV9kaWN0KQorICAgICAgICBzZWxmLmRlbGF5ID0gZGVsYXkKKyAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAorICAgICAgICBzZWxmLl9uYW1lID0gTm9uZQorICAgICAgICAjIHJlc3VsdHMKKyAgICAgICAgc2VsZi5zdWNjZXNzID0gTm9uZQorICAgICAgICBzZWxmLmFzX2V4cGVjdGVkID0gTm9uZQorICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBOb25lCisgICAgICAgIHNlbGYuZXhwaXJlZCA9IEZhbHNlCisgICAgICAgIHNlbGYucmV0cnlfY291bnQgPSAwCiAKLSAgZGVmIF9maXhfd29ya2RpcihzZWxmLCBjb25maWcpOgotICAgIGtleSA9ICd3b3JrZGlyJwotICAgIHBhdGggPSBjb25maWcuZ2V0KGtleSwgTm9uZSkKLSAgICBpZiBub3QgcGF0aDoKLSAgICAgIHBhdGggPSBzZWxmLnRlc3RkaXIKLSAgICBpZiBvcy5wYXRoLmlzYWJzKHBhdGgpOgotICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgocGF0aCkKLSAgICBlbHNlOgotICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5qb2luKHNlbGYudGVzdGRpciwgcGF0aCkpCi0gICAgY29uZmlnLnVwZGF0ZSh7a2V5OiBwYXRofSkKLSAgICByZXR1cm4gY29uZmlnCisgICAgZGVmIF9maXhfd29ya2RpcihzZWxmLCBjb25maWcpOgorICAgICAgICBrZXkgPSAnd29ya2RpcicKKyAgICAgICAgcGF0aCA9IGNvbmZpZy5nZXQoa2V5LCBOb25lKQorICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgIHBhdGggPSBzZWxmLnRlc3RkaXIKKyAgICAgICAgaWYgb3MucGF0aC5pc2FicyhwYXRoKToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5yZWFscGF0aChwYXRoX2pvaW4oc2VsZi50ZXN0ZGlyLCBwYXRoKSkKKyAgICAgICAgY29uZmlnLnVwZGF0ZSh7a2V5OiBwYXRofSkKKyAgICAgICAgcmV0dXJuIGNvbmZpZwogCi0gIEBjbGFzc21ldGhvZAotICBkZWYgZ2V0X25hbWUoY2xzLCBzZXJ2ZXIsIGNsaWVudCwgcHJvdG8sIHRyYW5zLCBzb2NrLCAqYXJncyk6Ci0gICAgcmV0dXJuICclcy0lc18lc18lcy0lcycgJSAoc2VydmVyLCBjbGllbnQsIHByb3RvLCB0cmFucywgc29jaykKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZ2V0X25hbWUoY2xzLCBzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0LCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gJyVzLSVzXyVzXyVzLSVzJyAlIChzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0KQogCi0gIEBwcm9wZXJ0eQotICBkZWYgbmFtZShzZWxmKToKLSAgICBpZiBub3Qgc2VsZi5fbmFtZToKLSAgICAgIHNlbGYuX25hbWUgPSBzZWxmLmdldF9uYW1lKAotICAgICAgICAgIHNlbGYuc2VydmVyLm5hbWUsIHNlbGYuY2xpZW50Lm5hbWUsIHNlbGYucHJvdG9jb2wsIHNlbGYudHJhbnNwb3J0LCBzZWxmLnNvY2tldCkKLSAgICByZXR1cm4gc2VsZi5fbmFtZQorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fbmFtZToKKyAgICAgICAgICAgIHNlbGYuX25hbWUgPSBzZWxmLmdldF9uYW1lKAorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLm5hbWUsIHNlbGYuY2xpZW50Lm5hbWUsIHNlbGYucHJvdG9jb2wsIHNlbGYudHJhbnNwb3J0LCBzZWxmLnNvY2tldCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKIAotICBAcHJvcGVydHkKLSAgZGVmIHRyYW5zcG9ydF9uYW1lKHNlbGYpOgotICAgIHJldHVybiAnJXMtJXMnICUgKHNlbGYudHJhbnNwb3J0LCBzZWxmLnNvY2tldCkKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdHJhbnNwb3J0X25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiAnJXMtJXMnICUgKHNlbGYudHJhbnNwb3J0LCBzZWxmLnNvY2tldCkKIAogCiBkZWYgdGVzdF9uYW1lKHNlcnZlciwgY2xpZW50LCBwcm90b2NvbCwgdHJhbnNwb3J0LCBzb2NrZXQsICoqa3dhcmdzKToKLSAgcmV0dXJuIFRlc3RFbnRyeS5nZXRfbmFtZShzZXJ2ZXJbJ25hbWUnXSwgY2xpZW50WyduYW1lJ10sIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCkKKyAgICByZXR1cm4gVGVzdEVudHJ5LmdldF9uYW1lKHNlcnZlclsnbmFtZSddLCBjbGllbnRbJ25hbWUnXSwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0KQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci91dGlsLnB5IGIvdGVzdC9jcm9zc3J1bm5lci91dGlsLnB5CmluZGV4IDc1MGVkNDcuLmMyMTRkZjggMTAwNjQ0Ci0tLSBhL3Rlc3QvY3Jvc3NydW5uZXIvdXRpbC5weQorKysgYi90ZXN0L2Nyb3NzcnVubmVyL3V0aWwucHkKQEAgLTIwLDEyICsyMCwxNiBAQAogaW1wb3J0IGNvcHkKIAogCitkZWYgZG9tYWluX3NvY2tldF9wYXRoKHBvcnQpOgorICAgIHJldHVybiAnL3RtcC9UaHJpZnRUZXN0LnRocmlmdC4lZCcgJSBwb3J0CisKKwogZGVmIG1lcmdlX2RpY3QoYmFzZSwgdXBkYXRlKToKLSAgIiIiVXBkYXRlIGRpY3QgY29uY2F0ZW5hdGluZyBsaXN0IHZhbHVlcyIiIgotICByZXMgPSBjb3B5LmRlZXBjb3B5KGJhc2UpCi0gIGZvciBrLCB2IGluIGxpc3QodXBkYXRlLml0ZW1zKCkpOgotICAgIGlmIGsgaW4gbGlzdChyZXMua2V5cygpKSBhbmQgaXNpbnN0YW5jZSh2LCBsaXN0KToKLSAgICAgIHJlc1trXS5leHRlbmQodikKLSAgICBlbHNlOgotICAgICAgcmVzW2tdID0gdgotICByZXR1cm4gcmVzCisgICAgIiIiVXBkYXRlIGRpY3QgY29uY2F0ZW5hdGluZyBsaXN0IHZhbHVlcyIiIgorICAgIHJlcyA9IGNvcHkuZGVlcGNvcHkoYmFzZSkKKyAgICBmb3IgaywgdiBpbiBsaXN0KHVwZGF0ZS5pdGVtcygpKToKKyAgICAgICAgaWYgayBpbiBsaXN0KHJlcy5rZXlzKCkpIGFuZCBpc2luc3RhbmNlKHYsIGxpc3QpOgorICAgICAgICAgICAgcmVzW2tdLmV4dGVuZCh2KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzW2tdID0gdgorICAgIHJldHVybiByZXMKZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL01ha2VmaWxlLmFtIGIvdGVzdC9jc2hhcnAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxNjZlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOTUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitHRU5FUkFURUQgPSBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9Cb25rLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0Jvb2xzLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0Jvb2xUZXN0LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0NyYXp5TmVzdGluZy5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9FbXB0eVN0cnVjdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9HdWVzc1Byb3RvY29sU3RydWN0LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0luc2FuaXR5LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0xhcmdlRGVsdGFzLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0xpc3RCb25rcy5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9MaXN0VHlwZVZlcnNpb25pbmdWMS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9MaXN0VHlwZVZlcnNpb25pbmdWMi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9OZXN0ZWRMaXN0c0JvbmsuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTmVzdGVkTGlzdHNJMzJ4Mi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9OZXN0ZWRMaXN0c0kzMngzLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L05lc3RlZE1peGVkeDIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTnVtYmVyei5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9PbmVGaWVsZC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9TZWNvbmRTZXJ2aWNlLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1N0cnVjdEEuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvU3RydWN0Qi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9UaHJpZnRUZXN0LkNvbnN0YW50cy5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9UaHJpZnRUZXN0LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1ZlcnNpb25pbmdUZXN0VjEuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvVmVyc2lvbmluZ1Rlc3RWMi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9YY2VwdGlvbi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9YY2VwdGlvbjIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvWHRydWN0LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1h0cnVjdDIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvWHRydWN0My5jcworCitCVUlMVF9TT1VSQ0VTID0gJChHRU5FUkFURUQpCisKK2lmIE1PTk9fTUNTCitDU0MgPSBtY3MKK2Vsc2UKK0NTQyA9IGdtY3MKK2VuZGlmCisKK2lmIE5FVF8yXzAKK0NTQ19ERUZJTkVTID0gLWQ6TkVUXzJfMAorZW5kaWYKKworTElCRElSID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jc2hhcnAKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworJChHRU5FUkFURUQpOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGNzaGFycCAtbyAuICQ8CisKK3ByZWNyb3NzOiBUZXN0Q2xpZW50U2VydmVyLmV4ZQorCitUaHJpZnRJbXBsLmRsbDogJChHRU5FUkFURUQpICQoTElCRElSKS9UaHJpZnQuZGxsCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC10OmxpYnJhcnkgLW91dDokQCAtcmVmZXJlbmNlOiQoTElCRElSKS9UaHJpZnQuZGxsICQoR0VORVJBVEVEKQorCitTUkNTID0gVGVzdENsaWVudC5jcyBUZXN0U2VydmVyLmNzIFByb2dyYW0uY3MKKworVGVzdENsaWVudFNlcnZlci5leGU6ICQoU1JDUykgVGhyaWZ0SW1wbC5kbGwKKwkkKENTQykgJChDU0NfREVGSU5FUykgLW91dDokQCAtcmVmZXJlbmNlOiQoTElCRElSKS9UaHJpZnQuZGxsIC1yZWZlcmVuY2U6VGhyaWZ0SW1wbC5kbGwgJChTUkNTKQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtcmYgZ2VuLWNzaGFycCAqLmV4ZSAqLmRsbAorCitURVNUUE9SVCA9IDk1MDAKK2NoZWNrLWxvY2FsOiBUZXN0Q2xpZW50U2VydmVyLmV4ZQorCU1PTk9fUEFUSD0kKExJQkRJUikgdGltZW91dCAxMCBtb25vIFRlc3RDbGllbnRTZXJ2ZXIuZXhlIHNlcnZlciAtLXBvcnQ9JChURVNUUE9SVCkgJgorCXNsZWVwIDEKKwlNT05PX1BBVEg9JChMSUJESVIpIG1vbm8gVGVzdENsaWVudFNlcnZlci5leGUgY2xpZW50IC0tcG9ydD0kKFRFU1RQT1JUKQorCitFWFRSQV9ESVNUID0gXAorCVByb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIFwKKwlUaHJpZnRUZXN0LmNzcHJvaiBcCisJVGhyaWZ0VGVzdC5zbG4gXAorCVByb2dyYW0uY3MgXAorCVRlc3RTZXJ2ZXIuY3MgXAorCVRlc3RDbGllbnQuY3MKZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1Byb2dyYW0uY3MgYi90ZXN0L2NzaGFycC9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYzAwZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlCisvLworLy8gU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0Ugb3IgdmlzaXQgdGhlIFRocmlmdCBzaXRlIGF0OgorLy8gaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdC8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5UZXN0OyAvL2dlbmVyYXRlZCBjb2RlCisKK25hbWVzcGFjZSBUZXN0Cit7CisgICAgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgc3RhdGljIGludCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhcmdzLkxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJtdXN0IHByb3ZpZGUgJ3NlcnZlcicgb3IgJ2NsaWVudCcgYXJnIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlNldEJ1ZmZlclNpemUoQ29uc29sZS5CdWZmZXJXaWR0aCwgNDA5Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJGYWlsZWQgdG8gZ3JvdyBzY3JvbGwtYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyaW5nW10gc3ViQXJncyA9IG5ldyBzdHJpbmdbYXJncy5MZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1YkFyZ3NbaS0xXSA9IGFyZ3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXJnc1swXSA9PSAiY2xpZW50IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGVzdENsaWVudC5FeGVjdXRlKHN1YkFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1swXSA9PSAic2VydmVyIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGVzdFNlcnZlci5FeGVjdXRlKHN1YkFyZ3MpID8gMCA6IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgJ3NlcnZlcicgb3IgJ2NsaWVudCciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmM5YTgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlRocmlmdFRlc3QiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCJmNDFiMTkzYi1mMWFiLTQ4ZWUtODg0My1mODhlNDMwODRlMjYiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKKy8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuMTMuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuMTMuMC4wIildCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UZXN0Q2xpZW50LmNzIGIvdGVzdC9jc2hhcnAvVGVzdENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDljMDZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvVGVzdENsaWVudC5jcwpAQCAtMCwwICsxLDg3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuVGVzdDsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKKworbmFtZXNwYWNlIFRlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdENsaWVudAorICAgIHsKKyAgICAgICAgcHVibGljIGNsYXNzIFRlc3RQYXJhbXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBudW1JdGVyYXRpb25zID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOworICAgICAgICAgICAgcHVibGljIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdXJsOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBwaXBlOworICAgICAgICAgICAgcHVibGljIGJvb2wgYnVmZmVyZWQ7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBmcmFtZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHByb3RvY29sOworICAgICAgICAgICAgcHVibGljIGJvb2wgZW5jcnlwdGVkID0gZmFsc2U7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBtdWx0aXBsZXhlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgX2lzRmlyc3RUcmFuc3BvcnQgPSB0cnVlOworCisKKyAgICAgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0IENyZWF0ZVRyYW5zcG9ydCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5kcG9pbnQgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAocGlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jcnlwdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjZXJ0UGF0aCA9ICIuLi9rZXlzL2NsaWVudC5wMTIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydFBhdGgsICJ0aHJpZnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVExTU29ja2V0KGhvc3QsIHBvcnQsIDAsIGNlcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobywgYywgY2hhaW4sIGVycm9ycykgPT4gdHJ1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBsYXllcmVkIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVkKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9pc0ZpcnN0VHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2Vuc3VyZSBwcm9wZXIgb3Blbi9jbG9zZSBvZiB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLk9wZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfaXNGaXJzdFRyYW5zcG9ydCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSHR0cENsaWVudChuZXcgVXJpKHVybCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBDcmVhdGVQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gImNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm90b2NvbCA9PSAianNvbiIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckJhc2VUeXBlcyA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yU3RydWN0cyA9IDI7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQ29udGFpbmVycyA9IDQ7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yRXhjZXB0aW9ucyA9IDg7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yUHJvdG9jb2wgPSAxNjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JVbmtub3duID0gNjQ7CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBDbGllbnRUZXN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGVzdFBhcmFtcyBwYXJhbTsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNlY29uZFNlcnZpY2UuQ2xpZW50IHNlY29uZDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGhyaWZ0VGVzdC5DbGllbnQgY2xpZW50OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgbnVtSXRlcmF0aW9uczsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBkb25lOworCisgICAgICAgICAgICBwdWJsaWMgaW50IFJldHVybkNvZGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgICAgICBwdWJsaWMgQ2xpZW50VGVzdChUZXN0UGFyYW1zIHBhcmFtaW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyYW0gPSBwYXJhbWluOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHBhcmFtLkNyZWF0ZVRyYW5zcG9ydCgpOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IHBhcmFtLkNyZWF0ZVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLm11bHRpcGxleGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vjb25kID0gbmV3IFNlY29uZFNlcnZpY2UuQ2xpZW50KG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIlNlY29uZFNlcnZpY2UiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCk7CisgICAgICAgICAgICAgICAgbnVtSXRlcmF0aW9ucyA9IHBhcmFtLm51bUl0ZXJhdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVjdXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZG9uZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGVjdXRlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtSXRlcmF0aW9uczsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNwb3J0LklzT3BlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuT3BlbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb25uZWN0IGZhaWxlZDogIiArIGV4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFeGVjdXRlQ2xpZW50VGVzdChjbGllbnQsIHNlY29uZCwgcGFyYW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSBjbG9zaW5nIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEV4ZWN1dGUoc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVzdFBhcmFtcyBwYXJhbSA9IG5ldyBUZXN0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgaW50IG51bVRocmVhZHMgPSAxOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSAiLXUiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnVybCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5udW1JdGVyYXRpb25zID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItcGlwZSIpICAvLyAtcGlwZSA8bmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5waXBlID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBuYW1lZCBwaXBlcyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0taG9zdD0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5ob3N0ID0gYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5wb3J0ID0gaW50LlBhcnNlKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpKzEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItLWJ1ZmZlcmVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1idWZmZXJlZCIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uYnVmZmVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBidWZmZXJlZCBzb2NrZXRzIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiICB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1mcmFtZWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGZyYW1lZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi10IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1UaHJlYWRzID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9Y29tcGFjdCIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1tdWx0aWMiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnByb3RvY29sID0gImNvbXBhY3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBjb21wYWN0IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1tdWx0aWoiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnByb3RvY29sID0gImpzb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBKU09OIHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZW5jcnlwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZW5jcnlwdGVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXByb3RvY29sPW11bHRpIikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0ubXVsdGlwbGV4ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlICBwYXJzaW5nIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB0ZXN0cyA9IEVudW1lcmFibGUuUmFuZ2UoMCwgbnVtVGhyZWFkcykuU2VsZWN0KF8gPT4gbmV3IENsaWVudFRlc3QocGFyYW0pKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgLy9pc3N1ZSB0ZXN0cyBvbiBzZXBhcmF0ZSB0aHJlYWRzIHNpbXVsdGFuZW91c2x5CisgICAgICAgICAgICAgICAgdmFyIHRocmVhZHMgPSB0ZXN0cy5TZWxlY3QodGVzdCA9PiBuZXcgVGhyZWFkKHRlc3QuRXhlY3V0ZSkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBEYXRlVGltZSBzdGFydCA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiB0aHJlYWRzKQorICAgICAgICAgICAgICAgICAgICB0LlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gdGhyZWFkcykKKyAgICAgICAgICAgICAgICAgICAgdC5Kb2luKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRvdGFsIHRpbWU6ICIgKyAoRGF0ZVRpbWUuTm93IC0gc3RhcnQpKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0cy5TZWxlY3QodCA9PiB0LlJldHVybkNvZGUpLkFnZ3JlZ2F0ZSgocjEsIHIyKSA9PiByMSB8IHIyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gb3V0ZXJFeCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVW5leHBlY3RlZCBlcnJvciIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKG91dGVyRXguTWVzc2FnZSArICIgU1Q6ICIgKyBvdXRlckV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclVua25vd247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBCeXRlc1RvSGV4KGJ5dGVbXSBkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLlRvU3RyaW5nKGRhdGEpLlJlcGxhY2UoIi0iLCBzdHJpbmcuRW1wdHkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gUHJlcGFyZVRlc3REYXRhKGJvb2wgcmFuZG9tRGlzdCwgYm9vbCBodWdlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBodWdlID0gdHJ1ZSB0ZXN0cyBmb3IgVEhSSUZULTQzNzIKKyAgICAgICAgICAgIGJ5dGVbXSByZXR2YWwgPSBuZXcgYnl0ZVtodWdlID8gMHgxMjM0NSA6IDB4MTAwXTsKKyAgICAgICAgICAgIGludCBpbml0TGVuID0gcmV0dmFsLkxlbmd0aDsKKworICAgICAgICAgICAgLy8gbGluZWFyIGRpc3RyaWJ1dGlvbiwgdW5sZXNzIHJhbmRvbSBpcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGlmICghcmFuZG9tRGlzdCkgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbFtpXSA9IChieXRlKWk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJhbmRvbSBkaXN0cmlidXRpb24KKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsW2ldID0gKGJ5dGUpMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBybmQgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGluaXRMZW47ICsraSkgeworICAgICAgICAgICAgICAgIHdoaWxlKCB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXh0UG9zID0gcm5kLk5leHQoKSAlIGluaXRMZW47CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWxbbmV4dFBvc10gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsW25leHRQb3NdID0gKGJ5dGUpaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEV4ZWN1dGVDbGllbnRUZXN0KFRocmlmdFRlc3QuQ2xpZW50IGNsaWVudCwgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kLCBUZXN0UGFyYW1zIHBhcmFtKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IDA7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgIGNsaWVudC50ZXN0Vm9pZCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHZvaWQiKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICAgICAgICAgIHN0cmluZyBzID0gY2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7CisgICAgICAgICAgICBpZiAoIlRlc3QiICE9IHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtLm11bHRpcGxleGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzZWNvbmRUZXN0U3RyaW5nKFwiVGVzdDJcIikiKTsKKyAgICAgICAgICAgICAgICBzID0gc2Vjb25kLnNlY29uZHRlc3RTdHJpbmcoIlRlc3QyIik7CisgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7CisgICAgICAgICAgICAgIGlmICgidGVzdFN0cmluZyhcIlRlc3QyXCIpIiAhPSBzKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JQcm90b2NvbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qm9vbCh0cnVlKSIpOworICAgICAgICAgICAgYm9vbCB0ID0gY2xpZW50LnRlc3RCb29sKChib29sKXRydWUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB0KTsKKyAgICAgICAgICAgIGlmICghdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJvb2woZmFsc2UpIik7CisgICAgICAgICAgICBib29sIGYgPSBjbGllbnQudGVzdEJvb2woKGJvb2wpZmFsc2UpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBmKTsKKyAgICAgICAgICAgIGlmIChmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCeXRlKDEpIik7CisgICAgICAgICAgICBzYnl0ZSBpOCA9IGNsaWVudC50ZXN0Qnl0ZSgoc2J5dGUpMSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGk4KTsKKyAgICAgICAgICAgIGlmICgxICE9IGk4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RJMzIoLTEpIik7CisgICAgICAgICAgICBpbnQgaTMyID0gY2xpZW50LnRlc3RJMzIoLTEpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpMzIpOworICAgICAgICAgICAgaWYgKC0xICE9IGkzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKKyAgICAgICAgICAgIGxvbmcgaTY0ID0gY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTY0KTsKKyAgICAgICAgICAgIGlmICgtMzQzNTk3MzgzNjggIT0gaTY0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7CisgICAgICAgICAgICBkb3VibGUgZHViID0gY2xpZW50LnRlc3REb3VibGUoNS4zMjUwOTgyMzUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKDUuMzI1MDk4MjM1ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpIik7CisgICAgICAgICAgICBkdWIgPSBjbGllbnQudGVzdERvdWJsZSgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSAhPSBkdWIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMzIgPSAwOyBpMzIgPCAyOyArK2kzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaHVnZSA9IChpMzIgPiAwKTsKKyAgICAgICAgICAgICAgICBieXRlW10gYmluT3V0ID0gUHJlcGFyZVRlc3REYXRhKGZhbHNlLGh1Z2UpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCaW5hcnkoIiArIEJ5dGVzVG9IZXgoYmluT3V0KSArICIpIik7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBieXRlW10gYmluSW4gPSBjbGllbnQudGVzdEJpbmFyeShiaW5PdXQpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIEJ5dGVzVG9IZXgoYmluSW4pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluLkxlbmd0aCAhPSBiaW5PdXQuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgb2ZzID0gMDsgb2ZzIDwgTWF0aC5NaW4oYmluSW4uTGVuZ3RoLCBiaW5PdXQuTGVuZ3RoKTsgKytvZnMpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmluSW5bb2ZzXSAhPSBiaW5PdXRbb2ZzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYmluYXJ5IGVxdWFscz8gb25seSB3aXRoIGhhc2hjb2RlIG9wdGlvbiBlbmFibGVkIC4uLgorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3QgQ3JhenlOZXN0aW5nIik7CisgICAgICAgICAgICBpZiggdHlwZW9mKENyYXp5TmVzdGluZykuR2V0TWV0aG9kKCJFcXVhbHMiKS5EZWNsYXJpbmdUeXBlID09IHR5cGVvZihDcmF6eU5lc3RpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyYXp5TmVzdGluZyBvbmUgPSBuZXcgQ3JhenlOZXN0aW5nKCk7CisgICAgICAgICAgICAgICAgQ3JhenlOZXN0aW5nIHR3byA9IG5ldyBDcmF6eU5lc3RpbmcoKTsKKyAgICAgICAgICAgICAgICBvbmUuU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgICAgICB0d28uU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgICAgICBvbmUuQmluYXJ5X2ZpZWxkID0gbmV3IGJ5dGVbMTBdIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHhGRiB9OworICAgICAgICAgICAgICAgIHR3by5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVsxMF0geyAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweEZGIH07CisgICAgICAgICAgICAgICAgaWYgKCFvbmUuRXF1YWxzKHR3bykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckNvbnRhaW5lcnM7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNyYXp5TmVzdGluZy5FcXVhbHMgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKKyAgICAgICAgICAgIFh0cnVjdCBvID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgby5TdHJpbmdfdGhpbmcgPSAiWmVybyI7CisgICAgICAgICAgICBvLkJ5dGVfdGhpbmcgPSAoc2J5dGUpMTsKKyAgICAgICAgICAgIG8uSTMyX3RoaW5nID0gLTM7CisgICAgICAgICAgICBvLkk2NF90aGluZyA9IC01OworICAgICAgICAgICAgWHRydWN0IGkgPSBjbGllbnQudGVzdFN0cnVjdChvKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSIpOworCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9LCA1fSkiKTsKKyAgICAgICAgICAgIFh0cnVjdDIgbzIgPSBuZXcgWHRydWN0MigpOworICAgICAgICAgICAgbzIuQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgbzIuU3RydWN0X3RoaW5nID0gbzsKKyAgICAgICAgICAgIG8yLkkzMl90aGluZyA9IDU7CisgICAgICAgICAgICBYdHJ1Y3QyIGkyID0gY2xpZW50LnRlc3ROZXN0KG8yKTsKKyAgICAgICAgICAgIGkgPSBpMi5TdHJ1Y3RfdGhpbmc7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0geyIgKyBpMi5CeXRlX3RoaW5nICsgIiwge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0sICIgKyBpMi5JMzJfdGhpbmcgKyAifSIpOworCisgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcG91dFtqXSA9IGogLSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOworICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1hcG91dC5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwb3V0W2tleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbWFwaW4gPSBjbGllbnQudGVzdE1hcChtYXBvdXQpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1hcGluLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIExpc3Q8aW50PiBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RvdXQuQWRkKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gbGlzdG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgTGlzdDxpbnQ+IGxpc3RpbiA9IGNsaWVudC50ZXN0TGlzdChsaXN0b3V0KTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gbGlzdGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvL3NldAorICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgVEhhc2hTZXQ8aW50PiBzZXRvdXQgPSBuZXcgVEhhc2hTZXQ8aW50PigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNldG91dC5BZGQoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U2V0KHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIHNldG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgVEhhc2hTZXQ8aW50PiBzZXRpbiA9IGNsaWVudC50ZXN0U2V0KHNldG91dCk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIHNldGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKE9ORSkiKTsKKyAgICAgICAgICAgIE51bWJlcnogcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6Lk9ORSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRXTykiKTsKKyAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRXTyk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5UV08gIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRIUkVFKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRIUkVFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LkZJVkUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRklWRSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEVJR0hUKSIpOworICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRUlHSFQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRUlHSFQgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgICAgICAgICBsb25nIHVpZCA9IGNsaWVudC50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjNMKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdWlkKTsKKyAgICAgICAgICAgIGlmICgzMDk4NTgyMzUwODI1MjNMICE9IHVpZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE1hcE1hcCgxKSIpOworICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiBtbSA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiBtbS5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbTIgPSBtbVtrZXldOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBrMiBpbiBtMi5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMiArICIgPT4gIiArIG0yW2syXSArICIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIEluc2FuaXR5IGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDBMOworICAgICAgICAgICAgWHRydWN0IHRydWNrID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgdHJ1Y2suU3RyaW5nX3RoaW5nID0gIlRydWNrIjsKKyAgICAgICAgICAgIHRydWNrLkJ5dGVfdGhpbmcgPSAoc2J5dGUpODsKKyAgICAgICAgICAgIHRydWNrLkkzMl90aGluZyA9IDg7CisgICAgICAgICAgICB0cnVjay5JNjRfdGhpbmcgPSA4OworICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cy5BZGQodHJ1Y2spOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgICAgIERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IHdob2EgPSBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmb3JlYWNoIChsb25nIGtleSBpbiB3aG9hLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gdmFsID0gd2hvYVtrZXldOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChOdW1iZXJ6IGsyIGluIHZhbC5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSW5zYW5pdHkgdjIgPSB2YWxbazJdOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazIgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPiB1c2VyTWFwID0gdjIuVXNlck1hcDsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKE51bWJlcnogazMgaW4gdXNlck1hcC5LZXlzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazMgKyAiID0+ICIgKyB1c2VyTWFwW2szXSArICIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworCisgICAgICAgICAgICAgICAgICAgIExpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIuWHRydWN0czsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFh0cnVjdCB4IGluIHh0cnVjdHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgie1wiIiArIHguU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgeC5CeXRlX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0iKTsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICBzYnl0ZSBhcmcwID0gMTsKKyAgICAgICAgICAgIGludCBhcmcxID0gMjsKKyAgICAgICAgICAgIGxvbmcgYXJnMiA9IGxvbmcuTWF4VmFsdWU7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IG11bHRpRGljdCA9IG5ldyBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+KCk7CisgICAgICAgICAgICBtdWx0aURpY3RbMV0gPSAib25lIjsKKyAgICAgICAgICAgIE51bWJlcnogYXJnNCA9IE51bWJlcnouRklWRTsKKyAgICAgICAgICAgIGxvbmcgYXJnNSA9IDUwMDAwMDA7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IE11bHRpKCIgKyBhcmcwICsgIiwiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLCIgKyBtdWx0aURpY3QgKyAiLCIgKyBhcmc0ICsgIiwiICsgYXJnNSArICIpIik7CisgICAgICAgICAgICBYdHJ1Y3QgbXVsdGlSZXNwb25zZSA9IGNsaWVudC50ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgbXVsdGlEaWN0LCBhcmc0LCBhcmc1KTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IFh0cnVjdChieXRlX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkJ5dGVfdGhpbmcgKyAiLFN0cmluZ190aGluZzoiICsgbXVsdGlSZXNwb25zZS5TdHJpbmdfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIixpMzJfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTMyX3RoaW5nICsgIixpNjRfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTY0X3RoaW5nICsgIilcbiIpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAxMDAxIHx8IGV4Lk1lc3NhZ2UgIT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5URXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIm9rXCIpIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIm9rIik7CisgICAgICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIC4uLikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbiIsICJpZ25vcmUiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDEwMDEgfHwgZXguTWVzc2FnZSAhPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCAuLi4pIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgImlnbm9yZSIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uMiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDIwMDIgfHwgZXguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyAhPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwiT0tcIikiKTsKKyAgICAgICAgICAgICAgICBpZiAoIk9LIiAhPSBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJzdWNjZXNzIiwgIk9LIikuU3RyaW5nX3RoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RvcHdhdGNoIHN3ID0gbmV3IFN0b3B3YXRjaCgpOworICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOworICAgICAgICAgICAgY2xpZW50LnRlc3RPbmV3YXkoMSk7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBpZiAoc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyA+IDEwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiVGVzdCBDYWxsdGltZSgpIik7CisgICAgICAgICAgICB2YXIgdGltZXMgPSA1MDsKKyAgICAgICAgICAgIHN3LlJlc2V0KCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB0aW1lczsgKytrKQorICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0Vm9pZCgpOworICAgICAgICAgICAgc3cuU3RvcCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHswfSBtcyBhIHRlc3RWb2lkKCkgY2FsbCIsIHN3LkVsYXBzZWRNaWxsaXNlY29uZHMgLyB0aW1lcyk7CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1Rlc3RTZXJ2ZXIuY3MgYi90ZXN0L2NzaGFycC9UZXN0U2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjQ1YzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9UZXN0U2VydmVyLmNzCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQorLy8KKy8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKKy8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5UZXN0OyAvL2dlbmVyYXRlZCBjb2RlCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKKworbmFtZXNwYWNlIFRlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdFNlcnZlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgX2NsaWVudElEID0gLTE7CisgICAgICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIFRlc3RMb2dEZWxlZ2F0ZShzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKTsKKworICAgICAgICBwdWJsaWMgY2xhc3MgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY2FsbENvdW50ID0gMDsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByZVNlcnZlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlQ29udGV4dChUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5UcmFuc3BvcnQuVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKworICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdEhhbmRsZXIgOiBUaHJpZnRUZXN0LklmYWNlLCBUaHJpZnQuVENvbnRyb2xsaW5nSGFuZGxlcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVFNlcnZlciBzZXJ2ZXIgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHJpdmF0ZSBpbnQgaGFuZGxlcklEOworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIHJldXNhYmxlU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBwcml2YXRlIFRlc3RMb2dEZWxlZ2F0ZSB0ZXN0TG9nRGVsZWdhdGU7CisKKyAgICAgICAgICAgIHB1YmxpYyBUZXN0SGFuZGxlcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlcklEID0gSW50ZXJsb2NrZWQuSW5jcmVtZW50KHJlZiBfY2xpZW50SUQpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZSArPSB0ZXN0Q29uc29sZUxvZ2dlcjsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJOZXcgVGVzdEhhbmRsZXIgaW5zdGFuY2UgY3JlYXRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc29sZUxvZ2dlcihzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5DbGVhcigpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRGb3JtYXQoImhhbmRsZXJ7MDpEM306IixoYW5kbGVySUQpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRGb3JtYXQobXNnLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRMaW5lKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggcmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdFZvaWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0cmluZyB0ZXN0U3RyaW5nKHN0cmluZyB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0U3RyaW5nKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCB0ZXN0Qm9vbChib29sIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RCb29sKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc2J5dGUgdGVzdEJ5dGUoc2J5dGUgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEJ5dGUoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgdGVzdEkzMihpbnQgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEkzMih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgdGVzdEk2NChsb25nIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RJNjQoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBkb3VibGUgdGVzdERvdWJsZShkb3VibGUgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdERvdWJsZSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSB0ZXN0QmluYXJ5KGJ5dGVbXSB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgaGV4ID0gQml0Q29udmVydGVyLlRvU3RyaW5nKHRoaW5nKS5SZXBsYWNlKCItIiwgc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0QmluYXJ5KHswOlh9KSIsIGhleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWHRydWN0IHRlc3RTdHJ1Y3QoWHRydWN0IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RTdHJ1Y3Qoe3tcInswfVwiLCB7MX0sIHsyfSwgezN9fX0pIiwgdGhpbmcuU3RyaW5nX3RoaW5nLCB0aGluZy5CeXRlX3RoaW5nLCB0aGluZy5JMzJfdGhpbmcsIHRoaW5nLkk2NF90aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWHRydWN0MiB0ZXN0TmVzdChYdHJ1Y3QyIG5lc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWHRydWN0IHRoaW5nID0gbmVzdC5TdHJ1Y3RfdGhpbmc7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE5lc3Qoe3t7MH0sIHt7XCJ7MX1cIiwgezJ9LCB7M30sIHs0fSwgezV9fX19fSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdC5CeXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuU3RyaW5nX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuQnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3QuSTMyX3RoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmVzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8aW50LCBpbnQ+IHRlc3RNYXAoRGljdGlvbmFyeTxpbnQsIGludD4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdE1hcCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9ID0+IHsxfSIsIGtleSwgdGhpbmdba2V5XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHRlc3RTdHJpbmdNYXAoRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdFN0cmluZ01hcCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9ID0+IHsxfSIsIGtleSwgdGhpbmdba2V5XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRIYXNoU2V0PGludD4gdGVzdFNldChUSGFzaFNldDxpbnQ+IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5DbGVhcigpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoInRlc3RTZXQoe3siKTsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIExpc3Q8aW50PiB0ZXN0TGlzdChMaXN0PGludD4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdExpc3Qoe3siKTsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0RW51bSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgdGVzdFR5cGVkZWYobG9uZyB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0VHlwZWRlZih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gdGVzdE1hcE1hcChpbnQgaGVsbG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE1hcE1hcCh7MH0pIiwgaGVsbG8pOworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gbWFwbWFwID0KKyAgICAgICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7CisKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBwb3MgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBuZWcgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvc1tpXSA9IGk7CisgICAgICAgICAgICAgICAgICAgIG5lZ1staV0gPSAtaTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtYXBtYXBbNF0gPSBwb3M7CisgICAgICAgICAgICAgICAgbWFwbWFwWy00XSA9IG5lZzsKKworICAgICAgICAgICAgICAgIHJldHVybiBtYXBtYXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluc2FuaXR5CisgICAgICAgICAgICAvLyByZXR1cm5zOgorICAgICAgICAgICAgLy8geyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgIC8vICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgICAgICAgICAvLyAgICAgICAgfSwKKyAgICAgICAgICAgIC8vICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAgICAgICAgICAvLyB9CisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4gdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RJbnNhbml0eSgpIik7CisKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiBmaXJzdF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiBzZWNvbmRfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7IDsKKworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXBbTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKKworICAgICAgICAgICAgICAgIHNlY29uZF9tYXBbTnVtYmVyei5TSVhdID0gbmV3IEluc2FuaXR5KCk7CisKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiBpbnNhbmUgPQorICAgICAgICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+KCk7CisgICAgICAgICAgICAgICAgaW5zYW5lWyhsb25nKTFdID0gZmlyc3RfbWFwOworICAgICAgICAgICAgICAgIGluc2FuZVsobG9uZykyXSA9IHNlY29uZF9tYXA7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zYW5lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aShzYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RNdWx0aSgpIik7CisKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7IDsKKyAgICAgICAgICAgICAgICBoZWxsby5TdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgICAgICAgICAgICBoZWxsby5CeXRlX3RoaW5nID0gYXJnMDsKKyAgICAgICAgICAgICAgICBoZWxsby5JMzJfdGhpbmcgPSBhcmcxOworICAgICAgICAgICAgICAgIGhlbGxvLkk2NF90aGluZyA9IGFyZzI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhlbGxvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFByaW50ICd0ZXN0RXhjZXB0aW9uKCVzKScgd2l0aCBhcmcgYXMgJyVzJworICAgICAgICAgICAgICogQHBhcmFtIHN0cmluZyBhcmcgLSBhIHN0cmluZyBpbmRpY2F0aW9uIHdoYXQgdHlwZSBvZiBleGNlcHRpb24gdG8gdGhyb3cKKyAgICAgICAgICAgICAqIGlmIGFyZyA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9IGFyZworICAgICAgICAgICAgICogZWxzZW4gaWYgYXJnID09ICJURXhjZXB0aW9uIiB0aHJvdyBURXhjZXB0aW9uCisgICAgICAgICAgICAgKiBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKHN0cmluZyBhcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEV4Y2VwdGlvbih7MH0pIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHguRXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgICAgICAgICAgICAgeC5NZXNzYWdlID0gYXJnOworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJURXhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaHJpZnQuVEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpRXhjZXB0aW9uKHN0cmluZyBhcmcwLCBzdHJpbmcgYXJnMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0TXVsdGlFeGNlcHRpb24oezB9LCB7MX0pIiwgYXJnMCxhcmcxKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnMCA9PSAiWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWGNlcHRpb24geCA9IG5ldyBYY2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB4LkVycm9yQ29kZSA9IDEwMDE7CisgICAgICAgICAgICAgICAgICAgIHguTWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnMCA9PSAiWGNlcHRpb24yIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uMiB4ID0gbmV3IFhjZXB0aW9uMigpOworICAgICAgICAgICAgICAgICAgICB4LkVycm9yQ29kZSA9IDIwMDI7CisgICAgICAgICAgICAgICAgICAgIHguU3RydWN0X3RoaW5nID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgICAgICAgICB4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFh0cnVjdCByZXN1bHQgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LlN0cmluZ190aGluZyA9IGFyZzE7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdFN0b3AoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0T25ld2F5KGludCBhcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE9uZXdheSh7MH0pLCBzbGVlcGluZy4uLiIsIGFyZyk7CisgICAgICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoYXJnICogMTAwMCk7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLy8gY2xhc3MgVGVzdEhhbmRsZXIKKworICAgICAgICBwcml2YXRlIGVudW0gU2VydmVyVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBUU2ltcGxlU2VydmVyLAorICAgICAgICAgICAgVFRocmVhZGVkU2VydmVyLAorICAgICAgICAgICAgVFRocmVhZFBvb2xTZXJ2ZXIsCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gUHJvY2Vzc29yRmFjdG9yeVR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBFeGVjdXRlKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2UsIHVzZUZyYW1lZCA9IGZhbHNlLCB1c2VFbmNyeXB0aW9uID0gZmFsc2UsIGNvbXBhY3QgPSBmYWxzZSwganNvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIFNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlclR5cGUuVFNpbXBsZVNlcnZlcjsKKyAgICAgICAgICAgICAgICBQcm9jZXNzb3JGYWN0b3J5VHlwZSBwcm9jZXNzb3JGYWN0b3J5VHlwZSA9IFByb2Nlc3NvckZhY3RvcnlUeXBlLlRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5OworICAgICAgICAgICAgICAgIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcGlwZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gIi1waXBlIikgIC8vIC1waXBlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGlwZSA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLkNvbnRhaW5zKCItLXBvcnQ9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNlQnVmZmVyZWRTb2NrZXRzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tdGhyZWFkZWQiIHx8IGFyZ3NbaV0gPT0gIi0tc2VydmVyLXR5cGU9dGhyZWFkZWQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS5UVGhyZWFkZWRTZXJ2ZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS10aHJlYWRwb29sIiB8fCBhcmdzW2ldID09ICItLXNlcnZlci10eXBlPXRocmVhZHBvb2wiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS5UVGhyZWFkUG9vbFNlcnZlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXByb3RvdHlwZSIgfHwgYXJnc1tpXSA9PSAiLS1wcm9jZXNzb3I9cHJvdG90eXBlIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeVR5cGUgPSBQcm9jZXNzb3JGYWN0b3J5VHlwZS5UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZUVuY3J5cHRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVHJhbnNwb3J0CisgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCB0cmFuczsKKyAgICAgICAgICAgICAgICBpZiAocGlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUVuY3J5cHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjZXJ0UGF0aCA9ICIuLi9rZXlzL3NlcnZlci5wMTIiOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRMU1NlcnZlclNvY2tldChwb3J0LCAwLCB1c2VCdWZmZXJlZFNvY2tldHMsIG5ldyBYNTA5Q2VydGlmaWNhdGUyKGNlcnRQYXRoLCAidGhyaWZ0IiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU2VydmVyU29ja2V0KHBvcnQsIDAsIHVzZUJ1ZmZlcmVkU29ja2V0cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvOworICAgICAgICAgICAgICAgIGlmIChjb21wYWN0KQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChqc29uKQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUSlNPTlByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OworICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzb3JGYWN0b3J5VHlwZSA9PSBQcm9jZXNzb3JGYWN0b3J5VHlwZS5UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFByb3RvdHlwZVByb2Nlc3NvckZhY3Rvcnk8VGhyaWZ0VGVzdC5Qcm9jZXNzb3IsIFRlc3RIYW5kbGVyPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgVGVzdEhhbmRsZXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgdGVzdFByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3Nvcih0ZXN0SGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkodGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNGYWN0b3J5OworICAgICAgICAgICAgICAgIGlmICh1c2VGcmFtZWQpCisgICAgICAgICAgICAgICAgICAgIHRyYW5zRmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRyYW5zRmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgVFNlcnZlciBzZXJ2ZXJFbmdpbmU7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzZXJ2ZXJUeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTZXJ2ZXJUeXBlLlRUaHJlYWRQb29sU2VydmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRQb29sU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHByb3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNlcnZlclR5cGUuVFRocmVhZGVkU2VydmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCB0cmFucywgdHJhbnNGYWN0b3J5LCBwcm90byk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHByb3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vU2VydmVyIGV2ZW50IGhhbmRsZXIKKyAgICAgICAgICAgICAgICBUcmFkZVNlcnZlckV2ZW50SGFuZGxlciBzZXJ2ZXJFdmVudHMgPSBuZXcgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuc2V0RXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50cyk7CisKKyAgICAgICAgICAgICAgICAvLyBSdW4gaXQKKyAgICAgICAgICAgICAgICBzdHJpbmcgd2hlcmUgPSAocGlwZSAhPSBudWxsID8gIm9uIHBpcGUgIiArIHBpcGUgOiAib24gcG9ydCAiICsgcG9ydCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlN0YXJ0aW5nIHRoZSAiICsgc2VydmVyVHlwZS5Ub1N0cmluZygpICsgIiAiICsgd2hlcmUgKworICAgICAgICAgICAgICAgICAgICAocHJvY2Vzc29yRmFjdG9yeVR5cGUgPT0gUHJvY2Vzc29yRmFjdG9yeVR5cGUuVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkgPyAiIHdpdGggcHJvY2Vzc29yIHByb3RvdHlwZSBmYWN0b3J5ICIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAodXNlQnVmZmVyZWRTb2NrZXRzID8gIiB3aXRoIGJ1ZmZlcmVkIHNvY2tldCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAodXNlRnJhbWVkID8gIiB3aXRoIGZyYW1lZCB0cmFuc3BvcnQiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgKHVzZUVuY3J5cHRpb24gPyAiIHdpdGggZW5jcnlwdGlvbiIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAoY29tcGFjdCA/ICIgd2l0aCBjb21wYWN0IHByb3RvY29sIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgIChqc29uID8gIiB3aXRoIGpzb24gcHJvdG9jb2wiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgIi4uLiIpOworICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZS5TZXJ2ZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZSh4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5jc3Byb2ogYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZlYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5jc3Byb2oKQEAgLTAsMCArMSwxNDEgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4yMTAyMjwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnRUZXN0PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0VGVzdDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPC9GaWxlVXBncmFkZUZsYWdzPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgorICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgorICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgorICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgorICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+CisgICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgorICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+CisgICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgorICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CisgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgorICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4wLjEzLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgorICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iVGhyaWZ0SW1wbCwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KKyAgICAgIDxIaW50UGF0aD4uXFRocmlmdEltcGwuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvZ3JhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0Q2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RTZXJ2ZXIuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4yLjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMi4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy4wIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cbGliXGNzaGFycFxUaHJpZnQuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+cm1kaXIgL3MgL3EgIiQoUHJvamVjdERpcilnZW4tY3NoYXJwIgorZGVsIC9mIC9xICIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiCitTRVQgT1VUUFVUX0RJUj0kKFByb2plY3REaXIpCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlxUaHJpZnRUZXN0LnRocmlmdAorZm9yICUyNSUyNUkgaW4gKCIlMjVPVVRQVVRfRElSJTI1IikgZG8gc2V0IFNIT1JUX0RJUj0lMjUlMjV+ZnNJCitmb3IgJTI1JTI1SSBpbiAoIiUyNVRIUklGVF9GSUxFJTI1IikgZG8gc2V0IFRIUklGVF9TSE9SVD0lMjUlMjV+ZnNJCisiJChQcm9qZWN0RGlyKVwuLlwuLlxjb21waWxlclxjcHBcdGhyaWZ0LmV4ZSIgLS1nZW4gY3NoYXJwIC1vICUyNVNIT1JUX0RJUiUyNSAlMjVUSFJJRlRfU0hPUlQlMjUKKyQoTVNCdWlsZFRvb2xzUGF0aClcQ3NjLmV4ZSAvdDpsaWJyYXJ5IC9vdXQ6IiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIgL3JlY3Vyc2U6IiQoUHJvamVjdERpcilnZW4tY3NoYXJwIlwqIC9yZWZlcmVuY2U6IiQoUHJvamVjdERpcikuLlwuLlxsaWJcY3NoYXJwXGJpblxEZWJ1Z1xUaHJpZnQuZGxsIjwvUHJlQnVpbGRFdmVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5zbG4gYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzY1YTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5zbG4KQEAgLTAsMCArMSwxNyBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMTAKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0VGVzdCIsICJUaHJpZnRUZXN0LmNzcHJvaiIsICJ7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvTWFrZWZpbGUuYW0gYi90ZXN0L2RhcnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmZGMwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGFydC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZ2VuLWRhcnQvdGhyaWZ0X3Rlc3QvbGliL3RocmlmdF90ZXN0LmRhcnQ6IC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGRhcnQgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworcHViLWdldC1nZW46IGdlbi1kYXJ0L3RocmlmdF90ZXN0L2xpYi90aHJpZnRfdGVzdC5kYXJ0CisJY2QgZ2VuLWRhcnQvdGhyaWZ0X3Rlc3Q7ICR7REFSVFBVQn0gZ2V0CisKK3B1Yi1nZXQ6IHB1Yi1nZXQtZ2VuCisJY2QgdGVzdF9jbGllbnQ7ICR7REFSVFBVQn0gZ2V0CisKK3N0dWJzOiBnZW4tZGFydC90aHJpZnRfdGVzdC9saWIvdGhyaWZ0X3Rlc3QuZGFydCBwdWItZ2V0CisKK3ByZWNyb3NzOiBzdHVicworCitjaGVjazogc3R1YnMKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLWRhcnQvIHRlc3RfY2xpZW50Ly5wdWIKKwlmaW5kIC4gLXR5cGUgZCAtbmFtZSAiLmRhcnRfdG9vbCIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgLiAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICIucGFja2FnZXMiIHwgeGFyZ3MgJChSTSkKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAicHVic3BlYy5sb2NrIiB8IHhhcmdzICQoUk0pCisKK2Rpc3QtaG9vazoKKwkkKFJNKSAtciAkKGRpc3RkaXIpL2dlbi1kYXJ0LyAkKGRpc3RkaXIpL3Rlc3RfY2xpZW50Ly5wdWIKKwlmaW5kICQoZGlzdGRpcikgLXR5cGUgZCAtbmFtZSAiLmRhcnRfdG9vbCIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBmIC1uYW1lICIucGFja2FnZXMiIHwgeGFyZ3MgJChSTSkKKworY2xpZW50OiBzdHVicworCSR7REFSVH0gdGVzdF9jbGllbnQvYmluL21haW4uZGFydAorCitFWFRSQV9ESVNUID0gXAorCXRlc3RfY2xpZW50CmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvdGVzdF9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZDRjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvYmluL21haW4uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWJhNjEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQKQEAgLTAsMCArMSwzMzcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOworaW1wb3J0ICdkYXJ0OmlvJzsKKworaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpjb2xsZWN0aW9uL2NvbGxlY3Rpb24uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIGFzIGh0dHA7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0X2NvbnNvbGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0X3Rlc3QvdGhyaWZ0X3Rlc3QuZGFydCc7CisKK2NvbnN0IFRFU1RfQkFTRVRZUEVTID0gMTsgLy8gMDAwMCAwMDAxCitjb25zdCBURVNUX1NUUlVDVFMgPSAyOyAvLyAwMDAwIDAwMTAKK2NvbnN0IFRFU1RfQ09OVEFJTkVSUyA9IDQ7IC8vIDAwMDAgMDEwMAorY29uc3QgVEVTVF9FWENFUFRJT05TID0gODsgLy8gMDAwMCAxMDAwCitjb25zdCBURVNUX1VOS05PV04gPSA2NDsgLy8gMDEwMCAwMDAwIChGYWlsZWQgdG8gcHJlcGFyZSBlbnZpcm9uZW10IGV0Yy4pCitjb25zdCBURVNUX1RJTUVPVVQgPSAxMjg7IC8vIDEwMDAgMDAwMAorY29uc3QgVEVTVF9OT1RVU0VEID0gNDg7IC8vIDAwMTEgMDAwMCAocmVzZXJ2ZWQgYml0cykKKwordHlwZWRlZiBGdXR1cmUgRnV0dXJlRnVuY3Rpb24oKTsKKworY2xhc3MgVFRlc3QgeworICBmaW5hbCBpbnQgZXJyb3JDb2RlOworICBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgZmluYWwgRnV0dXJlRnVuY3Rpb24gZnVuYzsKKworICBUVGVzdCh0aGlzLmVycm9yQ29kZSwgdGhpcy5uYW1lLCB0aGlzLmZ1bmMpOworfQorCitjbGFzcyBUVGVzdEVycm9yIGV4dGVuZHMgRXJyb3IgeworICBmaW5hbCBhY3R1YWw7CisgIGZpbmFsIGV4cGVjdGVkOworCisgIFRUZXN0RXJyb3IodGhpcy5hY3R1YWwsIHRoaXMuZXhwZWN0ZWQpOworCisgIFN0cmluZyB0b1N0cmluZygpID0+ICckYWN0dWFsICE9ICRleHBlY3RlZCc7Cit9CisKK0xpc3Q8VFRlc3Q+IF90ZXN0czsKK1RocmlmdFRlc3RDbGllbnQgY2xpZW50OworYm9vbCB2ZXJib3NlOworCisvLy8gQWRhcHRlZCBmcm9tIFRlc3RDbGllbnQucGhwCittYWluKExpc3Q8U3RyaW5nPiBhcmdzKSBhc3luYyB7CisgIEFyZ1Jlc3VsdHMgcmVzdWx0cyA9IF9wYXJzZUFyZ3MoYXJncyk7CisKKyAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworICAgIGV4aXQoVEVTVF9VTktOT1dOKTsKKyAgfQorCisgIHZlcmJvc2UgPSByZXN1bHRzWyd2ZXJib3NlJ10gPT0gdHJ1ZTsKKworICBhd2FpdCBfaW5pdFRlc3RDbGllbnQoCisgICAgICBob3N0OiByZXN1bHRzWydob3N0J10sCisgICAgICBwb3J0OiBpbnQucGFyc2UocmVzdWx0c1sncG9ydCddKSwKKyAgICAgIHRyYW5zcG9ydFR5cGU6IHJlc3VsdHNbJ3RyYW5zcG9ydCddLAorICAgICAgcHJvdG9jb2xUeXBlOiByZXN1bHRzWydwcm90b2NvbCddKS5jYXRjaEVycm9yKChlKSB7CisgICAgc3Rkb3V0LndyaXRlbG4oJ0Vycm9yOicpOworICAgIHN0ZG91dC53cml0ZWxuKCckZScpOworICAgIGlmIChlIGlzIEVycm9yKSB7CisgICAgICBzdGRvdXQud3JpdGVsbignJHtlLnN0YWNrVHJhY2V9Jyk7CisgICAgfQorICAgIGV4aXQoVEVTVF9VTktOT1dOKTsKKyAgfSk7CisKKyAgLy8gcnVuIHRlc3RzCisgIF90ZXN0cyA9IF9jcmVhdGVUZXN0cygpOworCisgIGludCByZXN1bHQgPSAwOworCisgIGZvciAoVFRlc3QgdGVzdCBpbiBfdGVzdHMpIHsKKyAgICBpZiAodmVyYm9zZSkgc3Rkb3V0LndyaXRlKCcke3Rlc3QubmFtZX0uLi4gJyk7CisgICAgdHJ5IHsKKyAgICAgIGF3YWl0IHRlc3QuZnVuYygpOworICAgICAgaWYgKHZlcmJvc2UpIHN0ZG91dC53cml0ZWxuKCdzdWNjZXNzIScpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGlmICh2ZXJib3NlKSBzdGRvdXQud3JpdGVsbignJGUnKTsKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCB8IHRlc3QuZXJyb3JDb2RlOworICAgIH0KKyAgfQorCisgIGV4aXQocmVzdWx0KTsKK30KKworQXJnUmVzdWx0cyBfcGFyc2VBcmdzKExpc3Q8U3RyaW5nPiBhcmdzKSB7CisgIHZhciBwYXJzZXIgPSBuZXcgQXJnUGFyc2VyKCk7CisgIHBhcnNlci5hZGRPcHRpb24oJ2hvc3QnLCBkZWZhdWx0c1RvOiAnbG9jYWxob3N0JywgaGVscDogJ1RoZSBzZXJ2ZXIgaG9zdCcpOworICBwYXJzZXIuYWRkT3B0aW9uKCdwb3J0JywgZGVmYXVsdHNUbzogJzkwOTAnLCBoZWxwOiAnVGhlIHBvcnQgdG8gY29ubmVjdCB0bycpOworICBwYXJzZXIuYWRkT3B0aW9uKCd0cmFuc3BvcnQnLAorICAgICAgZGVmYXVsdHNUbzogJ2J1ZmZlcmVkJywKKyAgICAgIGFsbG93ZWQ6IFsnYnVmZmVyZWQnLCAnZnJhbWVkJywgJ2h0dHAnXSwKKyAgICAgIGhlbHA6ICdUaGUgdHJhbnNwb3J0IG5hbWUnLAorICAgICAgYWxsb3dlZEhlbHA6IHsKKyAgICAgICAgJ2J1ZmZlcmVkJzogJ1RCdWZmZXJlZFRyYW5zcG9ydCcsCisgICAgICAgICdmcmFtZWQnOiAnVEZyYW1lZFRyYW5zcG9ydCcKKyAgICAgIH0pOworICBwYXJzZXIuYWRkT3B0aW9uKCdwcm90b2NvbCcsCisgICAgICBkZWZhdWx0c1RvOiAnYmluYXJ5JywKKyAgICAgIGFsbG93ZWQ6IFsnYmluYXJ5JywgJ2NvbXBhY3QnLCAnanNvbiddLAorICAgICAgaGVscDogJ1RoZSBwcm90b2NvbCBuYW1lJywKKyAgICAgIGFsbG93ZWRIZWxwOiB7CisgICAgICAgICdiaW5hcnknOiAnVEJpbmFyeVByb3RvY29sJywKKyAgICAgICAgJ2NvbXBhY3QnOiAnVENvbXBhY3RQcm90b2NvbCcsCisgICAgICAgICdqc29uJzogJ1RKc29uUHJvdG9jb2wnCisgICAgICB9KTsKKyAgcGFyc2VyLmFkZEZsYWcoJ3ZlcmJvc2UnLCBkZWZhdWx0c1RvOiB0cnVlKTsKKworICBBcmdSZXN1bHRzIHJlc3VsdHM7CisgIHRyeSB7CisgICAgcmVzdWx0cyA9IHBhcnNlci5wYXJzZShhcmdzKTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHN0ZG91dC53cml0ZWxuKCckZVxuJyk7CisgIH0KKworICBpZiAocmVzdWx0cyA9PSBudWxsKSBzdGRvdXQud3JpdGUocGFyc2VyLnVzYWdlKTsKKworICByZXR1cm4gcmVzdWx0czsKK30KKworVFByb3RvY29sRmFjdG9yeSBnZXRQcm90b2NvbEZhY3RvcnkoU3RyaW5nIHByb3RvY29sVHlwZSkgeworICBpZiAocHJvdG9jb2xUeXBlID09ICdiaW5hcnknKSB7CisgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xUeXBlID09ICdjb21wYWN0JykgeworICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbFR5cGUgPT0gJ2pzb24nKSB7CisgICAgcmV0dXJuIG5ldyBUSnNvblByb3RvY29sRmFjdG9yeSgpOworICB9CisKKyAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUocHJvdG9jb2xUeXBlKTsKK30KKworRnV0dXJlIF9pbml0VGVzdENsaWVudCgKKyAgICB7U3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgdHJhbnNwb3J0VHlwZSwgU3RyaW5nIHByb3RvY29sVHlwZX0pIGFzeW5jIHsKKyAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgIHZhciBwcm90b2NvbEZhY3RvcnkgPSBnZXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xUeXBlKTsKKworICBpZiAodHJhbnNwb3J0VHlwZSA9PSAnaHR0cCcpIHsKKyAgICB2YXIgaHR0cENsaWVudCA9IG5ldyBodHRwLklPQ2xpZW50KCk7CisgICAgdmFyIHVyaSA9IFVyaS5wYXJzZSgnaHR0cDovLyRob3N0OiRwb3J0Jyk7CisgICAgdmFyIGNvbmZpZyA9IG5ldyBUSHR0cENvbmZpZyh1cmksIHt9KTsKKyAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQoaHR0cENsaWVudCwgY29uZmlnKTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgc29ja2V0ID0gYXdhaXQgU29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgdHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQobmV3IFRUY3BTb2NrZXQoc29ja2V0KSk7CisgICAgaWYgKHRyYW5zcG9ydFR5cGUgPT0gJ2ZyYW1lZCcpIHsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgfQorICB9CisKKyAgdmFyIHByb3RvY29sID0gcHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCk7CisgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworICBhd2FpdCB0cmFuc3BvcnQub3BlbigpOworfQorCitMaXN0PFRUZXN0PiBfY3JlYXRlVGVzdHMoKSB7CisgIExpc3Q8VFRlc3Q+IHRlc3RzID0gW107CisKKyAgdmFyIHh0cnVjdCA9IG5ldyBYdHJ1Y3QoKQorICAgIC4uc3RyaW5nX3RoaW5nID0gJ1plcm8nCisgICAgLi5ieXRlX3RoaW5nID0gMQorICAgIC4uaTMyX3RoaW5nID0gLTMKKyAgICAuLmk2NF90aGluZyA9IC01OworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0Vm9pZCcsICgpIGFzeW5jIHsKKyAgICBhd2FpdCBjbGllbnQudGVzdFZvaWQoKTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0U3RyaW5nJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9ICdUZXN0JzsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RTdHJpbmcoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RCb29sJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IHRydWU7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0Qm9vbChpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEJ5dGUnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gNjQ7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0Qnl0ZShpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEkzMicsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSAyMTQ3NDgzNjQ3OworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEkzMihpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEk2NCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3OworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEk2NChpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdERvdWJsZScsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSAzLjE0MTU5MjY7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0RG91YmxlKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0QmluYXJ5JywgKCkgYXN5bmMgeworICAgIHZhciB1dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKyAgICB2YXIgaW5wdXQgPSB1dGY4Q29kZWMuZW5jb2RlKCdmb28nKTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RCaW5hcnkoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IExpc3RFcXVhbGl0eSgpOworICAgIGlmICghZXF1YWxpdHkuZXF1YWxzKHJlc3VsdCwgaW5wdXQpKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdFN0cnVjdCcsICgpIGFzeW5jIHsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RTdHJ1Y3QoeHRydWN0KTsKKyAgICBpZiAoJyRyZXN1bHQnICE9ICckeHRydWN0JykgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCB4dHJ1Y3QpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TmVzdCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBuZXcgWHRydWN0MigpCisgICAgICAuLmJ5dGVfdGhpbmcgPSAxCisgICAgICAuLnN0cnVjdF90aGluZyA9IHh0cnVjdAorICAgICAgLi5pMzJfdGhpbmcgPSAtMzsKKworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdE5lc3QoaW5wdXQpOworICAgIGlmICgnJHJlc3VsdCcgIT0gJyRpbnB1dCcpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TWFwJywgKCkgYXN5bmMgeworICAgIE1hcDxpbnQsIGludD4gaW5wdXQgPSB7MTogLTEwLCAyOiAtOSwgMzogLTgsIDQ6IC03LCA1OiAtNn07CisKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RNYXAoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IE1hcEVxdWFsaXR5KCk7CisgICAgaWYgKCFlcXVhbGl0eS5lcXVhbHMocmVzdWx0LCBpbnB1dCkpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0U2V0JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IG5ldyBTZXQ8aW50Pi5mcm9tKFstMiwgLTEsIDAsIDEsIDJdKTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RTZXQoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IFNldEVxdWFsaXR5KCk7CisgICAgaWYgKCFlcXVhbGl0eS5lcXVhbHMocmVzdWx0LCBpbnB1dCkpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TGlzdCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBbLTIsIC0xLCAwLCAxLCAyXTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RMaXN0KGlucHV0KTsKKyAgICB2YXIgZXF1YWxpdHkgPSBjb25zdCBMaXN0RXF1YWxpdHkoKTsKKyAgICBpZiAoIWVxdWFsaXR5LmVxdWFscyhyZXN1bHQsIGlucHV0KSkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RFbnVtJywgKCkgYXN5bmMgeworICAgIGF3YWl0IF90ZXN0RW51bShOdW1iZXJ6Lk9ORSk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouVFdPKTsKKyAgICBhd2FpdCBfdGVzdEVudW0oTnVtYmVyei5USFJFRSk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouRklWRSk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouRUlHSFQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RUeXBlZGVmJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IDMwOTg1ODIzNTA4MjUyMzsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RUeXBlZGVmKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdE1hcE1hcCcsICgpIGFzeW5jIHsKKyAgICBNYXA8aW50LCBNYXA8aW50LCBpbnQ+PiByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdE1hcE1hcCgxKTsKKyAgICBpZiAocmVzdWx0LmlzRW1wdHkgfHwgcmVzdWx0W3Jlc3VsdC5rZXlzLmZpcnN0XS5pc0VtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsICdNYXA8aW50LCBNYXA8aW50LCBpbnQ+PicpOworICAgIH0KKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdEluc2FuaXR5JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IG5ldyBJbnNhbml0eSgpOworICAgIGlucHV0LnVzZXJNYXAgPSB7TnVtYmVyei5GSVZFOiA1MDAwfTsKKyAgICBpbnB1dC54dHJ1Y3RzID0gW3h0cnVjdF07CisKKyAgICBNYXA8aW50LCBNYXA8aW50LCBJbnNhbml0eT4+IHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5wdXQpOworICAgIGlmIChyZXN1bHQuaXNFbXB0eSB8fCByZXN1bHRbcmVzdWx0LmtleXMuZmlyc3RdLmlzRW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgJ01hcDxpbnQsIE1hcDxpbnQsIEluc2FuaXR5Pj4nKTsKKyAgICB9CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RNdWx0aScsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBuZXcgWHRydWN0KCkKKyAgICAgIC4uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMicKKyAgICAgIC4uYnl0ZV90aGluZyA9IDEyMworICAgICAgLi5pMzJfdGhpbmcgPSA0NTYKKyAgICAgIC4uaTY0X3RoaW5nID0gNzg5OworCisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0TXVsdGkoaW5wdXQuYnl0ZV90aGluZywgaW5wdXQuaTMyX3RoaW5nLAorICAgICAgICBpbnB1dC5pNjRfdGhpbmcsIHsxOiAnb25lJ30sIE51bWJlcnouRUlHSFQsIDU2NzgpOworICAgIGlmICgnJHJlc3VsdCcgIT0gJyRpbnB1dCcpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0VYQ0VQVElPTlMsICd0ZXN0RXhjZXB0aW9uJywgKCkgYXN5bmMgeworICAgIHRyeSB7CisgICAgICBhd2FpdCBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKKyAgICB9IG9uIFhjZXB0aW9uIGNhdGNoIChfKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhyb3cgbmV3IFRUZXN0RXJyb3IobnVsbCwgJ1hjZXB0aW9uJyk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfRVhDRVBUSU9OUywgJ3Rlc3RNdWx0aUV4Y2VwdGlvbicsICgpIGFzeW5jIHsKKyAgICB0cnkgeworICAgICAgYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignWGNlcHRpb24yJywgJ2ZvbycpOworICAgIH0gb24gWGNlcHRpb24yIGNhdGNoIChfKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhyb3cgbmV3IFRUZXN0RXJyb3IobnVsbCwgJ1hjZXB0aW9uMicpOworICB9KSk7CisKKyAgcmV0dXJuIHRlc3RzOworfQorCitGdXR1cmUgX3Rlc3RFbnVtKGludCBpbnB1dCkgYXN5bmMgeworICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtKGlucHV0KTsKKyAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvdGVzdF9jbGllbnQvcHVic3BlYy55YW1sIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODYyMjVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbApAQCAtMCwwICsxLDM2IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWU6IHRocmlmdF90ZXN0X2NsaWVudAordmVyc2lvbjogMC4xMy4wCitkZXNjcmlwdGlvbjogQSBjbGllbnQgaW50ZWdyYXRpb24gdGVzdCBmb3IgdGhlIERhcnQgVGhyaWZ0IGxpYnJhcnkKK2F1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Citob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK2Vudmlyb25tZW50OgorICBzZGs6ICI+PTEuMjQuMyA8My4wLjAiCisKK2RlcGVuZGVuY2llczoKKyAgYXJnczogIj49MC4xMy4wIDwyLjAuMCIKKyAgaHR0cDogXjAuMTEuMAorICB0aHJpZnQ6CisgICAgcGF0aDogLi4vLi4vLi4vbGliL2RhcnQKKyAgdGhyaWZ0X3Rlc3Q6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvdGhyaWZ0X3Rlc3QKKworZGV2X2RlcGVuZGVuY2llczoKKyAgdGVzdDogIj49MC4xMi4zMCA8Mi4wLjAiCmRpZmYgLS1naXQgYS90ZXN0L2VybC9NYWtlZmlsZS5hbSBiL3Rlc3QvZXJsL01ha2VmaWxlLmFtCmluZGV4IDE5NDBjZTMuLjgxOTEzZWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvZXJsL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvZXJsL01ha2VmaWxlLmFtCkBAIC0xNywyNCArMTcsMzUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci1SRUJBUiA9ICQodG9wX3NyY2RpcikvbGliL2VybC9yZWJhcgotCiBUSFJJRlRfRklMRVMgPSAkKHdpbGRjYXJkIC4uLyoudGhyaWZ0KQogCitpZiBFUkxBTkdfT1RQMTYKK0VSTF9GTEFHID0gZXJsOm90cDE2CitlbHNlCitFUkxfRkxBRyA9IGVybAorZW5kaWYKICMgbWFrZSBzdXJlIFRocmlmdFRlc3QudGhyaWZ0IGlzIGdlbmVyYXRlZCBsYXN0IHRvIHByZXZlbnQgY29uZmxpY3RzIHdpdGggb3RoZXIgKi50aHJpZnQgZmlsZXMKIC5nZW5lcmF0ZWQ6ICQoVEhSSUZUX0ZJTEVTKQogCWZvciBmIGluICQoVEhSSUZUX0ZJTEVTKSA7IGRvIFwKLQkgICQoVEhSSUZUKSAtLWdlbiBlcmwgJCRmIDsgXAorCSAgJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUcpIC1vIHNyYyAkJGYgOyBcCiAJZG9uZSA7IFwKLQkkKFRIUklGVCkgLS1nZW4gZXJsOmxlZ2FjeW5hbWVzIExlZ2FjeU5hbWVzLnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBlcmwgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBRykgLW8gc3JjIC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJdG91Y2ggLmdlbmVyYXRlZAogCi1jaGVjazogLmdlbmVyYXRlZAotCSQoUkVCQVIpIGV1bml0CitwcmVjcm9zczogLmdlbmVyYXRlZAorCSQoUkVCQVIpIGNvbXBpbGUKKworbWFpbnRhaW5lci1jbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBlYmluLwogCiBjbGVhbjoKLQlybSAtZiAuZ2VuZXJhdGVkCi0Jcm0gLXJmIGdlbi1lcmwKIAkkKFJFQkFSKSBjbGVhbgorCSQoUk0pICAgIC5nZW5lcmF0ZWQKKwkkKFJNKSAtciAucmViYXIvCisJJChSTSkgLXIgc3JjL2dlbi1lcmwvCisKK2Rpc3QtaG9vazoKKwkkKFJNKSAgICAkKGRpc3RkaXIpLy5nZW5lcmF0ZWQKKwkkKFJNKSAtciAkKGRpc3RkaXIpLy5yZWJhci8KKwkkKFJNKSAtciAkKGRpc3RkaXIpL2ViaW4vCisJJChSTSkgLXIgJChkaXN0ZGlyKS9zcmMvZ2VuLWVybC8KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3JlYmFyLmNvbmZpZyBiL3Rlc3QvZXJsL3JlYmFyLmNvbmZpZwppbmRleCA2MDM1ODQ5Li41OWEwNzg4IDEwMDY0NAotLS0gYS90ZXN0L2VybC9yZWJhci5jb25maWcKKysrIGIvdGVzdC9lcmwvcmViYXIuY29uZmlnCkBAIC0xLDUgKzEsNiBAQAore3N1Yl9kaXJzLCBbIi4uLy4uL2xpYi9lcmwiXX0uCisKIHtlcmxfb3B0cywgWwogICBkZWJ1Z19pbmZvLAotICB7aSwgWyJnZW4tZXJsIl19LAotICB7c3JjX2RpcnMsIFsiZ2VuLWVybCJdfQorICB7aSwgIi4uLy4uL2xpYi9lcmwvaW5jbHVkZSJ9CiBdfS4KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy9sZWdhY3lfbmFtZXNfdGVzdC5lcmwgYi90ZXN0L2VybC9zcmMvbGVnYWN5X25hbWVzX3Rlc3QuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWNlN2QwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZXJsL3NyYy9sZWdhY3lfbmFtZXNfdGVzdC5lcmwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZShsZWdhY3lfbmFtZXNfdGVzdCkuCi0tY29tcGlsZShleHBvcnRfYWxsKS4KLQotLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgotCi0taW5jbHVkZSgibGVnYWN5TmFtZXNfY29uc3RhbnRzLmhybCIpLgotCi1yZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+Ci0gIFsKLSAgICB7ImNhcGl0YWxpemVkU3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7Y2FwaXRhbGl6ZWRTdHJ1Y3QsIF8sIF99LAotICAgICAgI2NhcGl0YWxpemVkU3RydWN0e2lkPW51bGwsbWVzc2FnZT1udWxsfQotICAgICl9Ci0gIF0uCi0KLXN0cnVjdF9pbmZvX3Rlc3RfKCkgLT4KLSAgWwotICAgIHsiY2FwaXRhbGl6ZWRTdHJ1Y3QgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgJ2lkJywgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCAnbWVzc2FnZScsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgbGVnYWN5TmFtZXNfdHlwZXM6c3RydWN0X2luZm9fZXh0KGNhcGl0YWxpemVkU3RydWN0KQotICAgICl9LAotICAgIHsibGlzdENhcGl0YWxpemVkU3RydWN0cyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnY2FwaXRhbGl6ZWRTdHJ1Y3QnfX19LCAnc3RydWN0cycsIFtdfQotICAgICAgXX0sCi0gICAgICBsZWdhY3lOYW1lc190eXBlczpzdHJ1Y3RfaW5mb19leHQobGlzdENhcGl0YWxpemVkU3RydWN0cykKLSAgICApfQotICBdLgotCi1zZXJ2aWNlX2luZm9fdGVzdF8oKSAtPgotICBbCi0gICAgeyJuYW1lcyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwge3N0cnVjdCwgeydsZWdhY3lOYW1lc190eXBlcycsICdjYXBpdGFsaXplZFN0cnVjdCd9fX0sCi0gICAgICAgIHsyLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2NhcGl0YWxpemVkU3RydWN0J319fQotICAgICAgXX0sCi0gICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJuYW1lcyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2xpc3RDYXBpdGFsaXplZFN0cnVjdHMnfX0sCi0gICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7Im5hbWVzIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ3hjZXB0aW9uJ319fV19LAotICAgICAgbGVnYWN5TmFtZXNfdGhyaWZ0OmZ1bmN0aW9uX2luZm8obmFtZXMsIGV4Y2VwdGlvbnMpCi0gICAgKX0KLSAgXS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvbmFtZV9jb25mbGljdF90ZXN0LmVybCBiL3Rlc3QvZXJsL3NyYy9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTc2ZmZhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZXJsL3NyYy9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLSUlCi0lJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0lJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0lJQotJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSUlCi0lJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0lJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0lJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotJSUgdW5kZXIgdGhlIExpY2Vuc2UuCi0lJQotCi0tbW9kdWxlKG5hbWVfY29uZmxpY3RfdGVzdCkuCi0tY29tcGlsZShleHBvcnRfYWxsKS4KLQotLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgotCi0taW5jbHVkZSgibmFtZV9jb25mbGljdF90ZXN0X2NvbnN0YW50cy5ocmwiKS4KLQotcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgotICBbCi0gICAgeyJ1c2luZyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAge3VzaW5nLCBfLCBffSwKLSAgICAgICN1c2luZ3tzaW5nbGU9bnVsbCxpbnRlZ2VyPW51bGx9Ci0gICAgKX0sCi0gICAgeyJkZWxlZ2F0ZSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAge2RlbGVnYXRlLCBfLCBffSwKLSAgICAgICNkZWxlZ2F0ZXtwYXJ0aWFsPW51bGwsZGVsZWdhdGU9bnVsbH0KLSAgICApfSwKLSAgICB7ImdldCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAge2dldCwgX30sCi0gICAgICAjZ2V0e3NieXRlPW51bGx9Ci0gICAgKX0sCi0gICAgeyJwYXJ0aWFsIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7cGFydGlhbCwgXywgXywgX30sCi0gICAgICAjcGFydGlhbHt1c2luZz1udWxsfQotICAgICl9LAotICAgIHsiQ2xhc3NBbmRQcm9wIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0NsYXNzQW5kUHJvcCcsIF8sIF8sIF8sIF99LAotICAgICAgIydDbGFzc0FuZFByb3AnewotICAgICAgICAnQ2xhc3NBbmRQcm9wJz1udWxsLAotICAgICAgICAnQ2xhc3NBbmRQcm9wXyc9bnVsbCwKLSAgICAgICAgJ0NsYXNzQW5kUHJvcF9fJz1udWxsLAotICAgICAgICAnQ2xhc3NBbmRQcm9wZXInPW51bGwKLSAgICAgIH0KLSAgICApfSwKLSAgICB7InNlY29uZF9jaGFuY2UgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHtzZWNvbmRfY2hhbmNlLCBfLCBfLCBfLCBffSwKLSAgICAgICNzZWNvbmRfY2hhbmNlewotICAgICAgICAnU0VDT05EX0NIQU5DRSc9bnVsbCwKLSAgICAgICAgJ1NFQ09ORF9DSEFOQ0VfJz1udWxsLAotICAgICAgICAnU0VDT05EX0NIQU5DRV9fJz1udWxsLAotICAgICAgICAnU0VDT05EX0NIQU5DRVMnPW51bGwKLSAgICAgIH0KLSAgICApfSwKLSAgICB7Ik5PV19FQVRfVEhJUyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydOT1dfRUFUX1RISVMnLCBfLCBfLCBfLCBffSwKLSAgICAgICMnTk9XX0VBVF9USElTJ3sKLSAgICAgICAgbm93X2VhdF90aGlzPW51bGwsCi0gICAgICAgIG5vd19lYXRfdGhpc189bnVsbCwKLSAgICAgICAgbm93X2VhdF90aGlzX189bnVsbCwKLSAgICAgICAgbm93X2VhdF90aGlzX2FuZF90aGlzPW51bGwKLSAgICAgIH0KLSAgICApfSwKLSAgICB7IlRoZUVkZ2VDYXNlIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1RoZUVkZ2VDYXNlJywgXywgXywgXywgXywgXywgX30sCi0gICAgICAjJ1RoZUVkZ2VDYXNlJ3sKLSAgICAgICAgdGhlRWRnZUNhc2U9bnVsbCwKLSAgICAgICAgdGhlRWRnZUNhc2VfPW51bGwsCi0gICAgICAgIHRoZUVkZ2VDYXNlX189bnVsbCwKLSAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAotICAgICAgICAnVGhlRWRnZUNhc2VfJz1udWxsLAotICAgICAgICAnVGhlRWRnZUNhc2VfXyc9bnVsbAotICAgICAgfQotICAgICl9LAotICAgIHsiVHJpY2t5XyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydUcmlja3lfJywgXywgX30sCi0gICAgICAjJ1RyaWNreV8ne3RyaWNreT1udWxsLCdUcmlja3knPW51bGx9Ci0gICAgKX0sCi0gICAgeyJOZXN0ZWQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnTmVzdGVkJywgXywgXywgXywgXywgXywgX30sCi0gICAgICAjJ05lc3RlZCd7Ci0gICAgICAgICdDbGFzc0FuZFByb3AnPW51bGwsCi0gICAgICAgIHNlY29uZF9jaGFuY2U9bnVsbCwKLSAgICAgICAgJ05PV19FQVRfVEhJUyc9bnVsbCwKLSAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAotICAgICAgICAnVHJpY2t5Xyc9bnVsbCwKLSAgICAgICAgJ05lc3RlZCc9bnVsbAotICAgICAgfQotICAgICl9LAotICAgIHsiUHJvYmxlbV8gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnUHJvYmxlbV8nLCBfLCBffSwKLSAgICAgICMnUHJvYmxlbV8ne3Byb2JsZW09bnVsbCwnUHJvYmxlbSc9bnVsbH0KLSAgICApfQotICBdLgotCi1zdHJ1Y3RfaW5mb190ZXN0XygpIC0+Ci0gIFsKLSAgICB7InVzaW5nIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBkb3VibGV9LHsyLCBkb3VibGV9XX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8odXNpbmcpCi0gICAgKX0sCi0gICAgeyJkZWxlZ2F0ZSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHN0cmluZ30sCi0gICAgICAgIHsyLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19fQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZGVsZWdhdGUpCi0gICAgKX0sCi0gICAgeyJnZXQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGJvb2x9XX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZ2V0KQotICAgICl9LAotICAgIHsicGFydGlhbCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHVzaW5nfX19LAotICAgICAgICB7MiwgYm9vbH0sCi0gICAgICAgIHszLCBib29sfQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8ocGFydGlhbCkKLSAgICApfSwKLSAgICB7IkNsYXNzQW5kUHJvcCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnQ2xhc3NBbmRQcm9wJykKLSAgICApfSwKLSAgICB7InNlY29uZF9jaGFuY2UgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9XX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oc2Vjb25kX2NoYW5jZSkKLSAgICApfSwKLSAgICB7Ik5PV19FQVRfVEhJUyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnTk9XX0VBVF9USElTJykKLSAgICApfSwKLSAgICB7IlRoZUVkZ2VDYXNlIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH0sezMsIGJvb2x9LHs0LCBib29sfSx7NSwgYm9vbH0sezYsIGJvb2x9XX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1RoZUVkZ2VDYXNlJykKLSAgICApfSwKLSAgICB7IlRyaWNreV8gZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfV19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdUcmlja3lfJykKLSAgICApfSwKLSAgICB7Ik5lc3RlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdDbGFzc0FuZFByb3AnfX19LAotICAgICAgICB7Miwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgc2Vjb25kX2NoYW5jZX19fSwKLSAgICAgICAgezMsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdOT1dfRUFUX1RISVMnfX19LAotICAgICAgICB7NCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ1RoZUVkZ2VDYXNlJ319fSwKLSAgICAgICAgezUsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdUcmlja3lfJ319fSwKLSAgICAgICAgezYsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdOZXN0ZWQnfX19Ci0gICAgICBdfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnTmVzdGVkJykKLSAgICApfSwKLSAgICB7IlByb2JsZW1fIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH1dfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnUHJvYmxlbV8nKQotICAgICl9LAotICAgIHsidXNpbmcgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGRvdWJsZSwgc2luZ2xlLCB1bmRlZmluZWR9LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCBkb3VibGUsIGludGVnZXIsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCh1c2luZykKLSAgICApfSwKLSAgICB7ImRlbGVnYXRlIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHBhcnRpYWwsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIGRlbGVnYXRlfX0sIGRlbGVnYXRlLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoZGVsZWdhdGUpCi0gICAgKX0sCi0gICAgeyJnZXQgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIHVuZGVmaW5lZCwgYm9vbCwgc2J5dGUsIHVuZGVmaW5lZH1dfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoZ2V0KQotICAgICl9LAotICAgIHsicGFydGlhbCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgdXNpbmd9fSwgdXNpbmcsICN1c2luZ3t9fSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgcmVhZCwgdW5kZWZpbmVkfSwKLSAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgd3JpdGUsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dChwYXJ0aWFsKQotICAgICl9LAotICAgIHsiQ2xhc3NBbmRQcm9wIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wJywgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcF8nLCB1bmRlZmluZWR9LAotICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wX18nLCB1bmRlZmluZWR9LAotICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wZXInLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0NsYXNzQW5kUHJvcCcpCi0gICAgKX0sCi0gICAgeyJzZWNvbmRfY2hhbmNlIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRScsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFXycsIHVuZGVmaW5lZH0sCi0gICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFX18nLCB1bmRlZmluZWR9LAotICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRVMnLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoc2Vjb25kX2NoYW5jZSkKLSAgICApfSwKLSAgICB7Ik5PV19FQVRfVEhJUyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzLCB1bmRlZmluZWR9LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXNfLCB1bmRlZmluZWR9LAotICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXNfXywgdW5kZWZpbmVkfSwKLSAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzX2FuZF90aGlzLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ05PV19FQVRfVEhJUycpCi0gICAgKX0sCi0gICAgeyJUaGVFZGdlQ2FzZSBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgdGhlRWRnZUNhc2UsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlXywgdW5kZWZpbmVkfSwKLSAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgdGhlRWRnZUNhc2VfXywgdW5kZWZpbmVkfSwKLSAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ1RoZUVkZ2VDYXNlJywgdW5kZWZpbmVkfSwKLSAgICAgICAgezUsIHVuZGVmaW5lZCwgYm9vbCwgJ1RoZUVkZ2VDYXNlXycsIHVuZGVmaW5lZH0sCi0gICAgICAgIHs2LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZV9fJywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdUaGVFZGdlQ2FzZScpCi0gICAgKX0sCi0gICAgeyJUcmlja3lfIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCB0cmlja3ksIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdUcmlja3knLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ1RyaWNreV8nKQotICAgICl9LAotICAgIHsiTmVzdGVkIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7Ci0gICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAotICAgICAgICAgICdDbGFzc0FuZFByb3AnCi0gICAgICAgIH19LCAnQ2xhc3NBbmRQcm9wJywgIydDbGFzc0FuZFByb3Ane319LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7Ci0gICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAotICAgICAgICAgIHNlY29uZF9jaGFuY2UKLSAgICAgICAgfX0sIHNlY29uZF9jaGFuY2UsICNzZWNvbmRfY2hhbmNle319LAotICAgICAgICB7MywgdW5kZWZpbmVkLCB7c3RydWN0LCB7Ci0gICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAotICAgICAgICAgICdOT1dfRUFUX1RISVMnCi0gICAgICAgIH19LCAnTk9XX0VBVF9USElTJywgIydOT1dfRUFUX1RISVMne319LAotICAgICAgICB7NCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7Ci0gICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAotICAgICAgICAgICdUaGVFZGdlQ2FzZScKLSAgICAgICAgfX0sICdUaGVFZGdlQ2FzZScsICMnVGhlRWRnZUNhc2Une319LAotICAgICAgICB7NSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7Ci0gICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAotICAgICAgICAgICdUcmlja3lfJwotICAgICAgICB9fSwgJ1RyaWNreV8nLCAjJ1RyaWNreV8ne319LAotICAgICAgICB7NiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7Ci0gICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAotICAgICAgICAgICdOZXN0ZWQnCi0gICAgICAgIH19LCAnTmVzdGVkJywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdOZXN0ZWQnKQotICAgICl9LAotICAgIHsiUHJvYmxlbV8gZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIHByb2JsZW0sIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdQcm9ibGVtJywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdQcm9ibGVtXycpCi0gICAgKX0KLSAgXS4KLQotc2VydmljZV9pbmZvX3Rlc3RfKCkgLT4KLSAgWwotICAgIHsiZXZlbnQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgcGFydGlhbH19fV19LAotICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKGV2ZW50LCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7ImV2ZW50IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIGRlbGVnYXRlfX0sCi0gICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oZXZlbnQsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJldmVudCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhldmVudCwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7IkZvbyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnTmVzdGVkJ319fV19LAotICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKCdGb28nLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7IkZvbyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oJ0ZvbycsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJGb28gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdQcm9ibGVtXyd9fX1dfSwKLSAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbygnRm9vJywgZXhjZXB0aW9ucykKLSAgICApfQotICBdLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy90ZXN0X2NsaWVudC5lcmwgYi90ZXN0L2VybC9zcmMvdGVzdF9jbGllbnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYWQ1OTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VybC9zcmMvdGVzdF9jbGllbnQuZXJsCkBAIC0wLDAgKzEsMTc0IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X2NsaWVudCkuCisKKy1leHBvcnQoW3N0YXJ0LzAsIHN0YXJ0LzFdKS4KKworLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0X3Rlc3RfdHlwZXMuaHJsIikuCisKKy1yZWNvcmQob3B0aW9ucywge3BvcnQgPSA5MDkwLAorICAgICAgICAgICAgICAgICAgY2xpZW50X29wdHMgPSBbXX0pLgorCitwYXJzZV9hcmdzKEFyZ3MpIC0+IHBhcnNlX2FyZ3MoQXJncywgI29wdGlvbnN7fSkuCitwYXJzZV9hcmdzKFtdLCBPcHRzKSAtPgorICBPcHRzOworcGFyc2VfYXJncyhbSGVhZCB8IFJlc3RdLCBPcHRzKSAtPgorICAgIE5ld09wdHMgPQorICAgICAgICBjYXNlIEhlYWQgb2YKKyAgICAgICAgICAgICItLXBvcnQ9IiArKyBQb3J0IC0+CisgICAgICAgICAgICAgICAgY2FzZSBzdHJpbmc6dG9faW50ZWdlcihQb3J0KSBvZgorICAgICAgICAgICAgICAgICAge0ludFBvcnQsX30gd2hlbiBpc19pbnRlZ2VyKEludFBvcnQpIC0+CisgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3twb3J0ID0gSW50UG9ydH07CisgICAgICAgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQorICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgICAgICAgICItLXRyYW5zcG9ydD0iICsrIFRyYW5zIC0+CisgICAgICAgICAgICAgICAgJSBUT0RPOiBFbmFibGUgQnVmZmVyZWQgYW5kIEhUVFAgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgY2FzZSBUcmFucyBvZgorICAgICAgICAgICAgICAgICAgICAiZnJhbWVkIiAtPgorICAgICAgICAgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze2NsaWVudF9vcHRzID0gW3tmcmFtZWQsIHRydWV9IHwgT3B0cyNvcHRpb25zLmNsaWVudF9vcHRzXX07CisgICAgICAgICAgICAgICAgICAgIF9FbHNlIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBPcHRzCisgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgIi0tc3NsIiAtPgorICAgICAgICAgICAgICAgIHNzbDpzdGFydCgpLAorICAgICAgICAgICAgICAgIFNzbE9wdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICB7c3Nsb3B0aW9ucywgWworICAgICAgICAgICAgICAgICAgICAgICAge2NhY2VydGZpbGUsICIuLi9rZXlzL0NBLnBlbSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAge2NlcnRmaWxlLCAiLi4va2V5cy9jbGllbnQucGVtIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7a2V5ZmlsZSwgIi4uL2tleXMvY2xpZW50LmtleSJ9CisgICAgICAgICAgICAgICAgICAgIF19LAorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7c3NsdHJhbnNwb3J0LCB0cnVlfSB8IFtTc2xPcHRpb25zIHwgT3B0cyNvcHRpb25zLmNsaWVudF9vcHRzXV19OworICAgICAgICAgICAgIi0tcHJvdG9jb2w9IiArKyBQcm90byAtPgorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7cHJvdG9jb2wsIGxpc3RfdG9fYXRvbShQcm90byl9XX07CisgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCisgICAgICAgIGVuZCwKKyAgICBwYXJzZV9hcmdzKFJlc3QsIE5ld09wdHMpLgorCitzdGFydCgpIC0+IHN0YXJ0KGluaXQ6Z2V0X3BsYWluX2FyZ3VtZW50cygpKS4KK3N0YXJ0KEFyZ3MpIC0+CisgICNvcHRpb25ze3BvcnQgPSBQb3J0LCBjbGllbnRfb3B0cyA9IENsaWVudE9wdHN9ID0gcGFyc2VfYXJncyhBcmdzKSwKKyAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXcoCisgICAgIjEyNy4wLjAuMSIsIFBvcnQsIHRocmlmdF90ZXN0X3RocmlmdCwgQ2xpZW50T3B0cyksCisKKyAgRGVtb1h0cnVjdCA9ICMndGhyaWZ0LnRlc3QuWHRydWN0J3sKKyAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZyA9IDw8Ilplcm8iPj4sCisgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gMSwKKyAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IDkxMjgzNjEsCisgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3fSwKKworICBEZW1vTmVzdCA9ICMndGhyaWZ0LnRlc3QuWHRydWN0Mid7CisgICAgYnl0ZV90aGluZyA9IDcsCisgICAgc3RydWN0X3RoaW5nID0gRGVtb1h0cnVjdCwKKyAgICAlIE5vdGUgdGhhdCB3ZSBkb24ndCBzZXQgaTMyX3RoaW5nLCBpdCB3aWxsIGNvbWUgYmFjayBhcyB1bmRlZmluZWQKKyAgICAlIGZyb20gdGhlIFB5dGhvbiBzZXJ2ZXIsIGJ1dCAwIGZyb20gdGhlIEMrKyBzZXJ2ZXIsIHNpbmNlIGl0IGlzIG5vdAorICAgICUgb3B0aW9uYWwKKyAgICBpMzJfdGhpbmcgPSAyfSwKKworICAlIElzIGl0IHNhZmUgdG8gbWF0Y2ggdGhlc2UgdGhpbmdzPworICBEZW1vRGljdCA9IGRpY3Q6ZnJvbV9saXN0KFsge0tleSwgS2V5LTEwfSB8fCBLZXkgPC0gbGlzdHM6c2VxKDAsMTApIF0pLAorICBEZW1vU2V0ID0gc2V0czpmcm9tX2xpc3QoWyBLZXkgfHwgS2V5IDwtIGxpc3RzOnNlcSgtMywzKSBdKSwKKworICBEZW1vSW5zYW5lID0gIyd0aHJpZnQudGVzdC5JbnNhbml0eSd7CisgICAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P1RIUklGVF9URVNUX05VTUJFUlpfRklWRSwgNTAwMH1dKSwKKyAgICB4dHJ1Y3RzID0gWyMndGhyaWZ0LnRlc3QuWHRydWN0J3sgc3RyaW5nX3RoaW5nID0gPDwiVHJ1Y2siPj4sIGJ5dGVfdGhpbmcgPSA4LCBpMzJfdGhpbmcgPSA4LCBpNjRfdGhpbmcgPSA4fV19LAorCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFZvaWQiKSwKKyAge0NsaWVudDAxLCB7b2ssIG9rfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MCwgdGVzdFZvaWQsIFtdKSwKKworICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RTdHJpbmciKSwKKyAge0NsaWVudDAyLCB7b2ssIDw8IlRlc3QiPj59fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAxLCB0ZXN0U3RyaW5nLCBbIlRlc3QiXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFN0cmluZyIpLAorICB7Q2xpZW50MDMsIHtvaywgPDwiVGVzdCI+Pn19ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDIsIHRlc3RTdHJpbmcsIFs8PCJUZXN0Ij4+XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdEJ5dGUiKSwKKyAge0NsaWVudDA0LCB7b2ssIDYzfX0gICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAzLCB0ZXN0Qnl0ZSwgWzYzXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdEkzMiIpLAorICB7Q2xpZW50MDUsIHtvaywgLTF9fSAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDQsIHRlc3RJMzIsIFstMV0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RJMzIiKSwKKyAge0NsaWVudDA2LCB7b2ssIDB9fSAgICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA1LCB0ZXN0STMyLCBbMF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RJNjQiKSwKKyAge0NsaWVudDA3LCB7b2ssIC0zNDM1OTczODM2OH19ICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA2LCB0ZXN0STY0LCBbLTM0MzU5NzM4MzY4XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdERvdWJsZSIpLAorICB7Q2xpZW50MDgsIHtvaywgLTUuMjA5ODUyM319ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDcsIHRlc3REb3VibGUsIFstNS4yMDk4NTIzXSksCisgICUlIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgY2FsbAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RTdHJ1Y3QiKSwKKyAge0NsaWVudDA5LCB7b2ssIERlbW9YdHJ1Y3R9fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA4LCB0ZXN0U3RydWN0LCBbRGVtb1h0cnVjdF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3ROZXN0IiksCisgIHtDbGllbnQxMCwge29rLCBEZW1vTmVzdH19ICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwOSwgdGVzdE5lc3QsIFtEZW1vTmVzdF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RNYXAiKSwKKyAge0NsaWVudDExLCB7b2ssIERlbW9EaWN0fX0gICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEwLCB0ZXN0TWFwLCBbRGVtb0RpY3RdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0U2V0IiksCisgIHtDbGllbnQxMiwge29rLCBEZW1vU2V0fX0gICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMSwgdGVzdFNldCwgW0RlbW9TZXRdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0TGlzdCIpLAorICB7Q2xpZW50MTMsIHtvaywgWy0xLDIsM119fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTIsIHRlc3RMaXN0LCBbWy0xLDIsM11dKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0RW51bSIpLAorICB7Q2xpZW50MTQsIHtvaywgMX19ICAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTMsIHRlc3RFbnVtLCBbP1RIUklGVF9URVNUX05VTUJFUlpfT05FXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFR5cGVkZWYiKSwKKyAge0NsaWVudDE1LCB7b2ssIDMwOTg1ODIzNTA4MjUyM319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE0LCB0ZXN0VHlwZWRlZiwgWzMwOTg1ODIzNTA4MjUyM10pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RJbnNhbml0eSIpLAorICB7Q2xpZW50MTYsIHtvaywgSW5zYW5lUmVzdWx0fX0gICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTUsIHRlc3RJbnNhbml0eSwgW0RlbW9JbnNhbmVdKSwKKyAgaW86Zm9ybWF0KCJ+cH5uIiwgW0luc2FuZVJlc3VsdF0pLAorCisgIHtDbGllbnQxNywge29rLCAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gPDwiTWVzc2FnZSI+Pn19fSA9CisgICAgdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE2LCB0ZXN0TXVsdGlFeGNlcHRpb24sIFsiU2FmZSIsICJNZXNzYWdlIl0pLAorCisgIENsaWVudDE4ID0KKyAgICB0cnkKKyAgICAgIHtDbGllbnRTMSwgUmVzdWx0MX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTcsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJYY2VwdGlvbiIsICJNZXNzYWdlIl0pLAorICAgICAgaW86Zm9ybWF0KCJVbmV4cGVjdGVkIHJldHVybiEgfnB+biIsIFtSZXN1bHQxXSksCisgICAgICBDbGllbnRTMQorICAgIGNhdGNoCisgICAgICB0aHJvdzp7Q2xpZW50UzIsIHtleGNlcHRpb24sIEV4blMxID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7fX19IC0+CisgICAgICAgICMndGhyaWZ0LnRlc3QuWGNlcHRpb24ne2Vycm9yQ29kZSA9IDEwMDEsIG1lc3NhZ2UgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uIj4+fSA9IEV4blMxLAorICAgICAgICBDbGllbnRTMjsKKyAgICAgIHRocm93OntDbGllbnRTMiwge2V4Y2VwdGlvbiwgX0V4blMxID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne319fSAtPgorICAgICAgICBpbzpmb3JtYXQoIldyb25nIGV4Y2VwdGlvbiB0eXBlIX5uIiwgW10pLAorICAgICAgICBDbGllbnRTMgorICAgIGVuZCwKKworICBDbGllbnQxOSA9CisgICAgdHJ5CisgICAgICB7Q2xpZW50UzMsIFJlc3VsdDJ9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE4LCB0ZXN0TXVsdGlFeGNlcHRpb24sIFsiWGNlcHRpb24yIiwgIk1lc3NhZ2UiXSksCisgICAgICBpbzpmb3JtYXQoIlVuZXhwZWN0ZWQgcmV0dXJuISB+cH5uIiwgW1Jlc3VsdDJdKSwKKyAgICAgIENsaWVudFMzCisgICAgY2F0Y2gKKyAgICAgIHRocm93OntDbGllbnRTNCwge2V4Y2VwdGlvbiwgX0V4blMyID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7fX19IC0+CisgICAgICAgIGlvOmZvcm1hdCgiV3JvbmcgZXhjZXB0aW9uIHR5cGUhfm4iLCBbXSksCisgICAgICAgIENsaWVudFM0OworICAgICAgdGhyb3c6e0NsaWVudFM0LCB7ZXhjZXB0aW9uLCBFeG5TMiA9ICMndGhyaWZ0LnRlc3QuWGNlcHRpb24yJ3t9fX0gLT4KKyAgICAgICAgIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne2Vycm9yQ29kZSA9IDIwMDIsCisgICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3QneworICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbjIiPj59fSA9IEV4blMyLAorICAgICAgICBDbGllbnRTNAorICAgIGVuZCwKKworICAlJSBTdGFydGVkID0gZXJsYW5nOm1vbm90b25pY190aW1lKG1pbGxpX3NlY29uZHMpLAorICB7XywgU3RhcnRTZWMsIFN0YXJ0VVNlY30gPSBlcmxhbmc6dGltZXN0YW1wKCksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdE9uZXdheSIpLAorICB7Q2xpZW50MjAsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxOSwgdGVzdE9uZXdheSwgWzFdKSwKKyAge18sIEVuZFNlYywgRW5kVVNlY30gPSBlcmxhbmc6dGltZXN0YW1wKCksCisgIEVsYXBzZWQgPSAoRW5kU2VjIC0gU3RhcnRTZWMpICogMTAwMCArIChFbmRVU2VjIC0gU3RhcnRVU2VjKSAvIDEwMDAsCisgIGlmCisgICAgRWxhcHNlZCA+IDEwMDAgLT4gZXhpdCgxKTsKKyAgICB0cnVlIC0+IHRydWUKKyAgZW5kLAorCisgIHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MjApLgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3Rlc3RfdGhyaWZ0X3NlcnZlci5lcmwgYi90ZXN0L2VybC9zcmMvdGVzdF90aHJpZnRfc2VydmVyLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWQ4ZGVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9lcmwvc3JjL3Rlc3RfdGhyaWZ0X3NlcnZlci5lcmwKQEAgLTAsMCArMSwyMzMgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfdGhyaWZ0X3NlcnZlcikuCisKKy1leHBvcnQoW3N0YXJ0LzAsIHN0YXJ0LzEsIHN0YXJ0X2xpbmsvMiwgaGFuZGxlX2Z1bmN0aW9uLzJdKS4KKworLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfdGVzdF90eXBlcy5ocmwiKS4KKworLXJlY29yZChvcHRpb25zLCB7cG9ydCA9IDkwOTAsCisgICAgICAgICAgICAgICAgICBzZXJ2ZXJfb3B0cyA9IFtdfSkuCisKK3BhcnNlX2FyZ3MoQXJncykgLT4gcGFyc2VfYXJncyhBcmdzLCAjb3B0aW9uc3t9KS4KK3BhcnNlX2FyZ3MoW10sIE9wdHMpIC0+CisgIE9wdHM7CitwYXJzZV9hcmdzKFtIZWFkIHwgUmVzdF0sIE9wdHMpIC0+CisgICAgTmV3T3B0cyA9CisgICAgICAgIGNhc2UgSGVhZCBvZgorICAgICAgICAgICAgIi0tcG9ydD0iICsrIFBvcnQgLT4KKyAgICAgICAgICAgICAgICBjYXNlIHN0cmluZzp0b19pbnRlZ2VyKFBvcnQpIG9mCisgICAgICAgICAgICAgICAgICB7SW50UG9ydCxffSB3aGVuIGlzX2ludGVnZXIoSW50UG9ydCkgLT4KKyAgICAgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3BvcnQgPSBJbnRQb3J0fTsKKyAgICAgICAgICAgICAgICAgIF9FbHNlIC0+CisgICAgICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCisgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgIi0tdHJhbnNwb3J0PSIgKysgVHJhbnMgLT4KKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zIG9mCisgICAgICAgICAgICAgICAgICAgICJmcmFtZWQiIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7c2VydmVyX29wdHMgPSBbe2ZyYW1lZCwgdHJ1ZX0gfCBPcHRzI29wdGlvbnMuc2VydmVyX29wdHNdfTsKKyAgICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMKKyAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAiLS1zc2wiIC0+CisgICAgICAgICAgICAgICAgc3NsOnN0YXJ0KCksCisgICAgICAgICAgICAgICAgU3NsT3B0aW9ucyA9CisgICAgICAgICAgICAgICAgICAgIHtzc2xvcHRpb25zLCBbCisgICAgICAgICAgICAgICAgICAgICAgICAge2NlcnRmaWxlLCAiLi4va2V5cy9zZXJ2ZXIucGVtIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICx7a2V5ZmlsZSwgICIuLi9rZXlzL3NlcnZlci5rZXkifQorICAgICAgICAgICAgICAgICAgICBdfSwKKyAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7c2VydmVyX29wdHMgPSBbe3NzbHRyYW5zcG9ydCwgdHJ1ZX0gfCBbU3NsT3B0aW9ucyB8IE9wdHMjb3B0aW9ucy5zZXJ2ZXJfb3B0c11dfTsKKyAgICAgICAgICAgICItLXByb3RvY29sPSIgKysgUHJvdG8gLT4KKyAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7c2VydmVyX29wdHMgPSBbe3Byb3RvY29sLCBsaXN0X3RvX2F0b20oUHJvdG8pfSB8IE9wdHMjb3B0aW9ucy5zZXJ2ZXJfb3B0c119OworICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQorICAgICAgICBlbmQsCisgICAgcGFyc2VfYXJncyhSZXN0LCBOZXdPcHRzKS4KKworc3RhcnQoKSAtPiBzdGFydChpbml0OmdldF9wbGFpbl9hcmd1bWVudHMoKSkuCitzdGFydChBcmdzKSAtPgorICAgICNvcHRpb25ze3BvcnQgPSBQb3J0LCBzZXJ2ZXJfb3B0cyA9IFNlcnZlck9wdHN9ID0gcGFyc2VfYXJncyhBcmdzKSwKKyAgICBzcGF3bihmdW4oKSAtPiBzdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpLCByZWNlaXZlIGFmdGVyIGluZmluaXR5IC0+IG9rIGVuZCBlbmQpLgorCitzdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpIC0+CisgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RhcnQoW3toYW5kbGVyLCA/TU9EVUxFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlcnZpY2UsIHRocmlmdF90ZXN0X3RocmlmdH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwb3J0LCBQb3J0fV0gKysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJPcHRzKS4KKworCitoYW5kbGVfZnVuY3Rpb24odGVzdFZvaWQsIHt9KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdFZvaWR+biIpLAorICAgIG9rOworCitoYW5kbGVfZnVuY3Rpb24odGVzdFN0cmluZywge1N9KSB3aGVuIGlzX2JpbmFyeShTKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdFN0cmluZzogfnB+biIsIFtTXSksCisgICAge3JlcGx5LCBTfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RCb29sLCB7Qn0pIHdoZW4gaXNfYm9vbGVhbihCKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEJvb2w6IH5wfm4iLCBbQl0pLAorICAgIHtyZXBseSwgQn07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0Qnl0ZSwge0k4fSkgd2hlbiBpc19pbnRlZ2VyKEk4KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEJ5dGU6IH5wfm4iLCBbSThdKSwKKyAgICB7cmVwbHksIEk4fTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RJMzIsIHtJMzJ9KSB3aGVuIGlzX2ludGVnZXIoSTMyKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEkzMjogfnB+biIsIFtJMzJdKSwKKyAgICB7cmVwbHksIEkzMn07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0STY0LCB7STY0fSkgd2hlbiBpc19pbnRlZ2VyKEk2NCkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RJNjQ6IH5wfm4iLCBbSTY0XSksCisgICAge3JlcGx5LCBJNjR9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdERvdWJsZSwge0RvdWJsZX0pIHdoZW4gaXNfZmxvYXQoRG91YmxlKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdERvdWJsZTogfnB+biIsIFtEb3VibGVdKSwKKyAgICB7cmVwbHksIERvdWJsZX07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0QmluYXJ5LCB7U30pIHdoZW4gaXNfYmluYXJ5KFMpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0QmluYXJ5OiB+cH5uIiwgW1NdKSwKKyAgICB7cmVwbHksIFN9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdFN0cnVjdCwKKyAgICAgICAgICAgICAgICB7U3RydWN0ID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSBCeXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gSTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gSTY0fX0pCit3aGVuIGlzX2JpbmFyeShTdHJpbmcpLAorICAgICBpc19pbnRlZ2VyKEJ5dGUpLAorICAgICBpc19pbnRlZ2VyKEkzMiksCisgICAgIGlzX2ludGVnZXIoSTY0KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdFN0cnVjdDogfnB+biIsIFtTdHJ1Y3RdKSwKKyAgICB7cmVwbHksIFN0cnVjdH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0TmVzdCwKKyAgICAgICAgICAgICAgICB7TmVzdH0pIHdoZW4gaXNfcmVjb3JkKE5lc3QsICd0aHJpZnQudGVzdC5YdHJ1Y3QyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlY29yZChOZXN0Iyd0aHJpZnQudGVzdC5YdHJ1Y3QyJy5zdHJ1Y3RfdGhpbmcsICd0aHJpZnQudGVzdC5YdHJ1Y3QnKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdE5lc3Q6IH5wfm4iLCBbTmVzdF0pLAorICAgIHtyZXBseSwgTmVzdH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0TWFwLCB7TWFwfSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RNYXA6IH5wfm4iLCBbZGljdDp0b19saXN0KE1hcCldKSwKKyAgICB7cmVwbHksIE1hcH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0U3RyaW5nTWFwLCB7TWFwfSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RTdHJpbmdNYXA6IH5wfm4iLCBbZGljdDp0b19saXN0KE1hcCldKSwKKyAgICB7cmVwbHksIE1hcH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0U2V0LCB7U2V0fSkgLT4KKyAgICB0cnVlID0gc2V0czppc19zZXQoU2V0KSwKKyAgICBpbzpmb3JtYXQoInRlc3RTZXQ6IH5wfm4iLCBbc2V0czp0b19saXN0KFNldCldKSwKKyAgICB7cmVwbHksIFNldH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0TGlzdCwge0xpc3R9KSB3aGVuIGlzX2xpc3QoTGlzdCkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RMaXN0OiB+cH5uIiwgW0xpc3RdKSwKKyAgICB7cmVwbHksIExpc3R9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdEVudW0sIHtFbnVtfSkgd2hlbiBpc19pbnRlZ2VyKEVudW0pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0RW51bTogfnB+biIsIFtFbnVtXSksCisgICAge3JlcGx5LCBFbnVtfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RUeXBlZGVmLCB7VXNlcklEfSkgd2hlbiBpc19pbnRlZ2VyKFVzZXJJRCkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RUeXBlZGVmOiB+cH5uIiwgW1VzZXJJRF0pLAorICAgIHtyZXBseSwgVXNlcklEfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RNYXBNYXAsIHtIZWxsb30pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0TWFwTWFwOiB+cH5uIiwgW0hlbGxvXSksCisKKyAgICBQb3NMaXN0ID0gW3tJLCBJfSAgIHx8IEkgPC0gbGlzdHM6c2VxKDEsIDQpXSwKKyAgICBOZWdMaXN0ID0gW3stSSwgLUl9IHx8IEkgPC0gbGlzdHM6c2VxKDEsIDQpXSwKKworICAgIE1hcE1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7NCwgIGRpY3Q6ZnJvbV9saXN0KFBvc0xpc3QpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey00LCBkaWN0OmZyb21fbGlzdChOZWdMaXN0KX1dKSwKKyAgICB7cmVwbHksIE1hcE1hcH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0SW5zYW5pdHksIHtJbnNhbml0eX0pIHdoZW4gaXNfcmVjb3JkKEluc2FuaXR5LCAndGhyaWZ0LnRlc3QuSW5zYW5pdHknKSAtPgorICAgIEhlbGxvID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8IkhlbGxvMiI+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IDJ9LAorCisgICAgR29vZGJ5ZSA9ICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJHb29kYnllNCI+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gNH0sCisgICAgQ3JhenkgPSAjJ3RocmlmdC50ZXN0Lkluc2FuaXR5J3sKKyAgICAgICAgICAgICAgIHVzZXJNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX0VJR0hULCA4fV0pLAorICAgICAgICAgICAgICAgeHRydWN0cyA9IFtHb29kYnllXQorICAgICAgICAgICAgICB9LAorCisgICAgTG9vbmV5ID0gIyd0aHJpZnQudGVzdC5JbnNhbml0eSd7fSwKKworICAgIEZpcnN0TWFwID0gZGljdDpmcm9tX2xpc3QoW3s/VEhSSUZUX1RFU1RfTlVNQkVSWl9UV08sIEluc2FuaXR5fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7P1RIUklGVF9URVNUX05VTUJFUlpfVEhSRUUsIEluc2FuaXR5fV0pLAorCisgICAgU2Vjb25kTWFwID0gZGljdDpmcm9tX2xpc3QoW3s/VEhSSUZUX1RFU1RfTlVNQkVSWl9TSVgsIExvb25leX1dKSwKKworICAgIEluc2FuZSA9IGRpY3Q6ZnJvbV9saXN0KFt7MSwgRmlyc3RNYXB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwgU2Vjb25kTWFwfV0pLAorCisgICAgaW86Zm9ybWF0KCJSZXR1cm4gPSB+cH5uIiwgW0luc2FuZV0pLAorCisgICAge3JlcGx5LCBJbnNhbmV9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdE11bHRpLCBBcmdzID0ge0FyZzAsIEFyZzEsIEFyZzIsIF9BcmczLCBBcmc0LCBBcmc1fSkKKyAgd2hlbiBpc19pbnRlZ2VyKEFyZzApLAorICAgICAgIGlzX2ludGVnZXIoQXJnMSksCisgICAgICAgaXNfaW50ZWdlcihBcmcyKSwKKyAgICAgICBpc19pbnRlZ2VyKEFyZzQpLAorICAgICAgIGlzX2ludGVnZXIoQXJnNSkgLT4KKworICAgIGlvOmZvcm1hdCgidGVzdE11bHRpKH5wKX5uIiwgW0FyZ3NdKSwKKyAgICB7cmVwbHksICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJIZWxsbzIiPj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IEFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gQXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSBBcmcyfX07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0RXhjZXB0aW9uLCB7U3RyaW5nfSkgd2hlbiBpc19iaW5hcnkoU3RyaW5nKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEV4Y2VwdGlvbih+cCl+biIsIFtTdHJpbmddKSwKKyAgICBjYXNlIFN0cmluZyBvZgorICAgICAgICA8PCJYY2VwdGlvbiI+PiAtPgorICAgICAgICAgICAgdGhyb3coIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7ZXJyb3JDb2RlID0gMTAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gU3RyaW5nfSk7CisgICAgICAgIDw8IlRFeGNlcHRpb24iPj4gLT4KKyAgICAgICAgICAgIHRocm93KHs/VEFwcGxpY2F0aW9uRXhjZXB0aW9uX1N0cnVjdHVyZX0pOworICAgICAgICBfIC0+CisgICAgICAgICAgICBvaworICAgIGVuZDsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RNdWx0aUV4Y2VwdGlvbiwge0FyZzAsIEFyZzF9KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdE11bHRpRXhjZXB0aW9uKH5wLCB+cCl+biIsIFtBcmcwLCBBcmcxXSksCisgICAgY2FzZSBBcmcwIG9mCisgICAgICAgIDw8IlhjZXB0aW9uIj4+IC0+CisgICAgICAgICAgICB0aHJvdygjJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ3tlcnJvckNvZGUgPSAxMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbiI+Pn0pOworICAgICAgICA8PCJYY2VwdGlvbjIiPj4gLT4KKyAgICAgICAgICAgIHRocm93KCMndGhyaWZ0LnRlc3QuWGNlcHRpb24yJ3tlcnJvckNvZGUgPSAyMDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uMiI+Pn19KTsKKyAgICAgICAgXyAtPgorICAgICAgICAgICAge3JlcGx5LCAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gQXJnMX19CisgICAgZW5kOworCitoYW5kbGVfZnVuY3Rpb24odGVzdE9uZXdheSwge1NlY29uZHN9KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdE9uZXdheTogfnB+biIsIFtTZWNvbmRzXSksCisgICAgdGltZXI6c2xlZXAoMTAwMCAqIFNlY29uZHMpLAorICAgIG9rLgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3RocmlmdF90ZXN0LmFwcC5zcmMgYi90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYwppbmRleCBhMGMzNDhmLi5mZmJhZDU4IDEwMDY0NAotLS0gYS90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYworKysgYi90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYwpAQCAtMTksMTMgKzE5LDE2IEBACiAlJSUgLSotIG1vZGU6ZXJsYW5nIC0qLQoge2FwcGxpY2F0aW9uLCB0aHJpZnRfdGVzdCwgWwogICAlIEEgcXVpY2sgZGVzY3JpcHRpb24gb2YgdGhlIGFwcGxpY2F0aW9uLgotICB7ZGVzY3JpcHRpb24sICJ0ZXN0cyBmb3IgdGhyaWZ0IGVybGFuZyBjb21waWxlciBiYWNrZW5kIn0sCisgIHtkZXNjcmlwdGlvbiwgIlRocmlmdCBjcm9zcyBsYW5ndWFnZSB0ZXN0In0sCiAKICAgJSBUaGUgdmVyc2lvbiBvZiB0aGUgYXBwbGljYXRvbgotICB7dnNuLCAiMC45LjMifSwKKyAge3ZzbiwgIjAuMTMuMCJ9LAogCiAgICUgQWxsIG1vZHVsZXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCi0gIHttb2R1bGVzLCBbbGVnYWN5X25hbWVzX3Rlc3QsIG5hbWVfY29uZmxpY3RfdGVzdCwgdGhyaWZ0X3Rlc3RfdGVzdF19LAorICB7bW9kdWxlcywgWworICAgIHRlc3RfY2xpZW50LAorICAgIHRlc3RfdGhyaWZ0X3NlcnZlcgorICBdfSwKIAogICAlIEFsbCBvZiB0aGUgcmVnaXN0ZXJlZCBuYW1lcyB0aGUgYXBwbGljYXRpb24gdXNlcy4gVGhpcyBjYW4gYmUgaWdub3JlZC4KICAge3JlZ2lzdGVyZWQsIFtdfSwKZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdF90ZXN0LmVybCBiL3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdF90ZXN0LmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkZmUxYy4uMDAwMDAwMAotLS0gYS90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3RfdGVzdC5lcmwKKysrIC9kZXYvbnVsbApAQCAtMSw2NTUgKzAsMCBAQAotJSUKLSUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0lJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0lJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0lJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0lJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSUlCi0lJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotJSUKLSUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0lJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0lJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0lJSB1bmRlciB0aGUgTGljZW5zZS4KLSUlCi0KLSUgZG9uJ3QgcmVuYW1lIHRoaXMgdGhyaWZ0X3Rlc3QsIGl0IGNsb2JiZXJzIGdlbmVyYXRlZCBmaWxlcwotLW1vZHVsZSh0aHJpZnRfdGVzdF90ZXN0KS4KLS1jb21waWxlKGV4cG9ydF9hbGwpLgotCi0taW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCi0KLS1pbmNsdWRlKCJ0aHJpZnRfdGVzdF9jb25zdGFudHMuaHJsIikuCi0KLWNvbnN0YW50X3Rlc3RfKCkgLT4KLSAgWwotICAgIHsibXlOdW1iZXJ6IGVxdWFscyAxIiwgP19hc3NlcnRFcXVhbCgxLCA/VEhSSUZUX1RFU1RfTVlOVU1CRVJaKX0KLSAgXS4KLQotcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgotICBbCi0gICAgeyJCb25rIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0JvbmsnLCBfLCBffSwKLSAgICAgICMnQm9uayd7bWVzc2FnZT1udWxsLHR5cGU9bnVsbH0KLSAgICApfSwKLSAgICB7IkJvb2xzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0Jvb2xzJywgXywgX30sCi0gICAgICAjJ0Jvb2xzJ3tpbV90cnVlPW51bGwsaW1fZmFsc2U9bnVsbH0KLSAgICApfSwKLSAgICB7Ilh0cnVjdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydYdHJ1Y3QnLCBfLCBfLCBfLCBffSwKLSAgICAgICMnWHRydWN0J3tzdHJpbmdfdGhpbmc9bnVsbCxieXRlX3RoaW5nPW51bGwsaTMyX3RoaW5nPW51bGwsaTY0X3RoaW5nPW51bGx9Ci0gICAgKX0sCi0gICAgeyJYdHJ1Y3QyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1h0cnVjdDInLCBfLCBfLCBffSwKLSAgICAgICMnWHRydWN0Mid7Ynl0ZV90aGluZz1udWxsLHN0cnVjdF90aGluZz1udWxsLGkzMl90aGluZz1udWxsfQotICAgICl9LAotICAgIHsiWHRydWN0MyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydYdHJ1Y3QzJywgXywgXywgXywgX30sCi0gICAgICAjJ1h0cnVjdDMne3N0cmluZ190aGluZz1udWxsLGNoYW5nZWQ9bnVsbCxpMzJfdGhpbmc9bnVsbCxpNjRfdGhpbmc9bnVsbH0KLSAgICApfSwKLSAgICB7Ikluc2FuaXR5IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0luc2FuaXR5JywgXywgX30sCi0gICAgICAjJ0luc2FuaXR5J3t1c2VyTWFwPW51bGwseHRydWN0cz1udWxsfQotICAgICl9LAotICAgIHsiQ3JhenlOZXN0aW5nIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0NyYXp5TmVzdGluZycsIF8sIF8sIF8sIF99LAotICAgICAgIydDcmF6eU5lc3RpbmcnewotICAgICAgICBzdHJpbmdfZmllbGQ9bnVsbCwKLSAgICAgICAgc2V0X2ZpZWxkPW51bGwsCi0gICAgICAgIGxpc3RfZmllbGQ9bnVsbCwKLSAgICAgICAgYmluYXJ5X2ZpZWxkPW51bGwKLSAgICAgIH0KLSAgICApfSwKLSAgICB7IlhjZXB0aW9uIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1hjZXB0aW9uJywgXywgX30sCi0gICAgICAjJ1hjZXB0aW9uJ3tlcnJvckNvZGU9bnVsbCxtZXNzYWdlPW51bGx9Ci0gICAgKX0sCi0gICAgeyJYY2VwdGlvbjIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnWGNlcHRpb24yJywgXywgX30sCi0gICAgICAjJ1hjZXB0aW9uMid7ZXJyb3JDb2RlPW51bGwsc3RydWN0X3RoaW5nPW51bGx9Ci0gICAgKX0sCi0gICAgeyJFbXB0eVN0cnVjdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsnRW1wdHlTdHJ1Y3QnfSwgIydFbXB0eVN0cnVjdCd7fSl9LAotICAgIHsiT25lRmllbGQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J09uZUZpZWxkJywgX30sICMnT25lRmllbGQne2ZpZWxkPW51bGx9KX0sCi0gICAgeyJWZXJzaW9uaW5nVGVzdFYxIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1ZlcnNpb25pbmdUZXN0VjEnLCBfLCBfLCBffSwKLSAgICAgICMnVmVyc2lvbmluZ1Rlc3RWMSd7YmVnaW5faW5fYm90aD1udWxsLG9sZF9zdHJpbmc9bnVsbCxlbmRfaW5fYm90aD1udWxsfQotICAgICl9LAotICAgIHsiVmVyc2lvbmluZ1Rlc3RWMiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydWZXJzaW9uaW5nVGVzdFYyJywgXywgXywgXywgXywgXywgXywgXywgXywgXywgXywgXywgX30sCi0gICAgICAjJ1ZlcnNpb25pbmdUZXN0VjInewotICAgICAgICBiZWdpbl9pbl9ib3RoPW51bGwsCi0gICAgICAgIG5ld2ludD1udWxsLAotICAgICAgICBuZXdieXRlPW51bGwsCi0gICAgICAgIG5ld3Nob3J0PW51bGwsCi0gICAgICAgIG5ld2xvbmc9bnVsbCwKLSAgICAgICAgbmV3ZG91YmxlPW51bGwsCi0gICAgICAgIG5ld3N0cnVjdD1udWxsLAotICAgICAgICBuZXdsaXN0PW51bGwsCi0gICAgICAgIG5ld3NldD1udWxsLAotICAgICAgICBuZXdtYXA9bnVsbCwKLSAgICAgICAgbmV3c3RyaW5nPW51bGwsCi0gICAgICAgIGVuZF9pbl9ib3RoPW51bGwKLSAgICAgIH0KLSAgICApfSwKLSAgICB7Ikxpc3RUeXBlVmVyc2lvbmluZ1YxIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0xpc3RUeXBlVmVyc2lvbmluZ1YxJywgXywgX30sCi0gICAgICAjJ0xpc3RUeXBlVmVyc2lvbmluZ1YxJ3tteWludHM9bnVsbCxoZWxsbz1udWxsfQotICAgICl9LAotICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnTGlzdFR5cGVWZXJzaW9uaW5nVjInLCBfLCBffSwKLSAgICAgICMnTGlzdFR5cGVWZXJzaW9uaW5nVjIne3N0cmluZ3M9bnVsbCxoZWxsbz1udWxsfQotICAgICl9LAotICAgIHsiR3Vlc3NQcm90b2NvbFN0cnVjdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydHdWVzc1Byb3RvY29sU3RydWN0JywgX30sCi0gICAgICAjJ0d1ZXNzUHJvdG9jb2xTdHJ1Y3Qne21hcF9maWVsZD1udWxsfQotICAgICl9LAotICAgIHsiTGFyZ2VEZWx0YXMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnTGFyZ2VEZWx0YXMnLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBffSwKLSAgICAgICMnTGFyZ2VEZWx0YXMnewotICAgICAgICBiMT1udWxsLAotICAgICAgICBiMTA9bnVsbCwKLSAgICAgICAgYjEwMD1udWxsLAotICAgICAgICBjaGVja190cnVlPW51bGwsCi0gICAgICAgIGIxMDAwPW51bGwsCi0gICAgICAgIGNoZWNrX2ZhbHNlPW51bGwsCi0gICAgICAgIHZlcnR3bzIwMDA9bnVsbCwKLSAgICAgICAgYV9zZXQyNTAwPW51bGwsCi0gICAgICAgIHZlcnR3bzMwMDA9bnVsbCwKLSAgICAgICAgYmlnX251bWJlcnM9bnVsbAotICAgICAgfQotICAgICl9LAotICAgIHsiTmVzdGVkTGlzdHNJMzJ4MiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydOZXN0ZWRMaXN0c0kzMngyJywgX30sCi0gICAgICAjJ05lc3RlZExpc3RzSTMyeDIne2ludGVnZXJsaXN0PW51bGx9Ci0gICAgKX0sCi0gICAgeyJOZXN0ZWRMaXN0c0kzMngzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J05lc3RlZExpc3RzSTMyeDMnLCBffSwKLSAgICAgICMnTmVzdGVkTGlzdHNJMzJ4Myd7aW50ZWdlcmxpc3Q9bnVsbH0KLSAgICApfSwKLSAgICB7Ik5lc3RlZE1peGVkeDIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnTmVzdGVkTWl4ZWR4MicsIF8sIF8sIF99LAotICAgICAgIydOZXN0ZWRNaXhlZHgyJ3sKLSAgICAgICAgaW50X3NldF9saXN0PW51bGwsCi0gICAgICAgIG1hcF9pbnRfc3Ryc2V0PW51bGwsCi0gICAgICAgIG1hcF9pbnRfc3Ryc2V0X2xpc3Q9bnVsbAotICAgICAgfQotICAgICl9LAotICAgIHsiTGlzdEJvbmtzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goeydMaXN0Qm9ua3MnLCBffSwgIydMaXN0Qm9ua3Mne2Jvbms9bnVsbH0pfSwKLSAgICB7Ik5lc3RlZExpc3RzQm9uayByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydOZXN0ZWRMaXN0c0JvbmsnLCBffSwKLSAgICAgICMnTmVzdGVkTGlzdHNCb25rJ3tib25rPW51bGx9Ci0gICAgKX0sCi0gICAgeyJCb29sVGVzdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydCb29sVGVzdCcsIF8sIF99LAotICAgICAgIydCb29sVGVzdCd7Yj1udWxsLHM9bnVsbH0KLSAgICApfSwKLSAgICB7IlN0cnVjdEEgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J1N0cnVjdEEnLCBffSwgIydTdHJ1Y3RBJ3tzPW51bGx9KX0sCi0gICAgeyJTdHJ1Y3RCIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1N0cnVjdEInLCBfLCBffSwKLSAgICAgICMnU3RydWN0Qid7YWE9bnVsbCxhYj1udWxsfQotICAgICl9Ci0gIF0uCi0KLXN0cnVjdF9pbmZvX3Rlc3RfKCkgLT4KLSAgWwotICAgIHsiQm9uayBkZWZpbml0aW9uIChzaG9ydCB2ZXJzaW9uKSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIHN0cmluZ30sIHsyLCBpMzJ9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnQm9uaycpCi0gICAgKX0sCi0gICAgeyJCb25rIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIG1lc3NhZ2UsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGkzMiwgdHlwZSwgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0JvbmsnKQotICAgICl9LAotICAgIHsiQm9vbHMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIGltX3RydWUsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIGltX2ZhbHNlLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnQm9vbHMnKQotICAgICl9LAotICAgIHsiWHRydWN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHN0cmluZ190aGluZywgdW5kZWZpbmVkfSwKLSAgICAgICAgezQsIHVuZGVmaW5lZCwgYnl0ZSwgYnl0ZV90aGluZywgdW5kZWZpbmVkfSwKLSAgICAgICAgezksIHVuZGVmaW5lZCwgaTMyLCBpMzJfdGhpbmcsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsxMSwgdW5kZWZpbmVkLCBpNjQsIGk2NF90aGluZywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ1h0cnVjdCcpCi0gICAgKX0sCi0gICAgeyJYdHJ1Y3QyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBieXRlLCBieXRlX3RoaW5nLCB1bmRlZmluZWR9LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ1h0cnVjdCd9fSwgc3RydWN0X3RoaW5nLCAjJ1h0cnVjdCd7fX0sCi0gICAgICAgIHszLCB1bmRlZmluZWQsIGkzMiwgaTMyX3RoaW5nLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnWHRydWN0MicpCi0gICAgKX0sCi0gICAgeyJYdHJ1Y3QzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHN0cmluZ190aGluZywgdW5kZWZpbmVkfSwKLSAgICAgICAgezQsIHVuZGVmaW5lZCwgaTMyLCBjaGFuZ2VkLCB1bmRlZmluZWR9LAotICAgICAgICB7OSwgdW5kZWZpbmVkLCBpMzIsIGkzMl90aGluZywgdW5kZWZpbmVkfSwKLSAgICAgICAgezExLCB1bmRlZmluZWQsIGk2NCwgaTY0X3RoaW5nLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnWHRydWN0MycpCi0gICAgKX0sCi0gICAgeyJJbnNhbml0eSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge21hcCwgaTMyLCBpNjR9LCB1c2VyTWFwLCBkaWN0Om5ldygpfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwge2xpc3QsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAnWHRydWN0J319fSwgeHRydWN0cywgW119Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnSW5zYW5pdHknKQotICAgICl9LAotICAgIHsiQ3JhenlOZXN0aW5nIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHN0cmluZ19maWVsZCwgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIG9wdGlvbmFsLCB7c2V0LCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ0luc2FuaXR5J319fSwgc2V0X2ZpZWxkLCBzZXRzOm5ldygpfSwKLSAgICAgICAgezMsIHJlcXVpcmVkLCB7bGlzdCwge21hcCwgCi0gICAgICAgICAge3NldCwgaTMyfSwKLSAgICAgICAgICB7bWFwLCBpMzIsIHtzZXQsIHtsaXN0LCB7bWFwLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ0luc2FuaXR5J319LCBzdHJpbmd9fX19Ci0gICAgICAgIH19LCBsaXN0X2ZpZWxkLCBbXX0sCi0gICAgICAgIHs0LCB1bmRlZmluZWQsIHN0cmluZywgYmluYXJ5X2ZpZWxkLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnQ3JhenlOZXN0aW5nJykKLSAgICApfSwKLSAgICB7IlhjZXB0aW9uIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGVycm9yQ29kZSwgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCBtZXNzYWdlLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnWGNlcHRpb24nKQotICAgICl9LAotICAgIHsiWGNlcHRpb24yIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGVycm9yQ29kZSwgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICdYdHJ1Y3QnfX0sIHN0cnVjdF90aGluZywgIydYdHJ1Y3Qne319Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnWGNlcHRpb24yJykKLSAgICApfSwKLSAgICB7IkVtcHR5U3RydWN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdFbXB0eVN0cnVjdCcpCi0gICAgKX0sCi0gICAgeyJPbmVGaWVsZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICdFbXB0eVN0cnVjdCd9fSwgZmllbGQsICMnRW1wdHlTdHJ1Y3Qne319Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnT25lRmllbGQnKQotICAgICl9LAotICAgIHsiVmVyc2lvbmluZ1Rlc3RWMSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCBiZWdpbl9pbl9ib3RoLCB1bmRlZmluZWR9LAotICAgICAgICB7MywgdW5kZWZpbmVkLCBzdHJpbmcsIG9sZF9zdHJpbmcsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsxMiwgdW5kZWZpbmVkLCBpMzIsIGVuZF9pbl9ib3RoLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnVmVyc2lvbmluZ1Rlc3RWMScpCi0gICAgKX0sCi0gICAgeyJWZXJzaW9uaW5nVGVzdFYyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGJlZ2luX2luX2JvdGgsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGkzMiwgbmV3aW50LCB1bmRlZmluZWR9LAotICAgICAgICB7MywgdW5kZWZpbmVkLCBieXRlLCBuZXdieXRlLCB1bmRlZmluZWR9LAotICAgICAgICB7NCwgdW5kZWZpbmVkLCBpMTYsIG5ld3Nob3J0LCB1bmRlZmluZWR9LAotICAgICAgICB7NSwgdW5kZWZpbmVkLCBpNjQsIG5ld2xvbmcsIHVuZGVmaW5lZH0sCi0gICAgICAgIHs2LCB1bmRlZmluZWQsIGRvdWJsZSwgbmV3ZG91YmxlLCB1bmRlZmluZWR9LAotICAgICAgICB7NywgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdCb25rJ319LCBuZXdzdHJ1Y3QsICMnQm9uayd7fX0sCi0gICAgICAgIHs4LCB1bmRlZmluZWQsIHtsaXN0LCBpMzJ9LCBuZXdsaXN0LCBbXX0sCi0gICAgICAgIHs5LCB1bmRlZmluZWQsIHtzZXQsIGkzMn0sIG5ld3NldCwgc2V0czpuZXcoKX0sCi0gICAgICAgIHsxMCwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIGkzMn0sIG5ld21hcCwgZGljdDpuZXcoKX0sCi0gICAgICAgIHsxMSwgdW5kZWZpbmVkLCBzdHJpbmcsIG5ld3N0cmluZywgdW5kZWZpbmVkfSwKLSAgICAgICAgezEyLCB1bmRlZmluZWQsIGkzMiwgZW5kX2luX2JvdGgsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdWZXJzaW9uaW5nVGVzdFYyJykKLSAgICApfSwKLSAgICB7Ikxpc3RUeXBlVmVyc2lvbmluZ1YxIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwgaTMyfSwgbXlpbnRzLCBbXX0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIHN0cmluZywgaGVsbG8sIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdMaXN0VHlwZVZlcnNpb25pbmdWMScpCi0gICAgKX0sCi0gICAgeyJMaXN0VHlwZVZlcnNpb25pbmdWMiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHN0cmluZ30sIHN0cmluZ3MsIFtdfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCBoZWxsbywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0xpc3RUeXBlVmVyc2lvbmluZ1YyJykKLSAgICApfSwKLSAgICB7Ikd1ZXNzUHJvdG9jb2xTdHJ1Y3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHs3LCB1bmRlZmluZWQsIHttYXAsIHN0cmluZywgc3RyaW5nfSwgbWFwX2ZpZWxkLCBkaWN0Om5ldygpfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0d1ZXNzUHJvdG9jb2xTdHJ1Y3QnKQotICAgICl9LAotICAgIHsiTGFyZ2VEZWx0YXMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ0Jvb2xzJ319LCBiMSwgIydCb29scyd7fX0sCi0gICAgICAgIHsxMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdCb29scyd9fSwgYjEwLCAjJ0Jvb2xzJ3t9fSwKLSAgICAgICAgezEwMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdCb29scyd9fSwgYjEwMCwgIydCb29scyd7fX0sCi0gICAgICAgIHs1MDAsIHVuZGVmaW5lZCwgYm9vbCwgY2hlY2tfdHJ1ZSwgdW5kZWZpbmVkfSwKLSAgICAgICAgezEwMDAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnQm9vbHMnfX0sIGIxMDAwLCAjJ0Jvb2xzJ3t9fSwKLSAgICAgICAgezE1MDAsIHVuZGVmaW5lZCwgYm9vbCwgY2hlY2tfZmFsc2UsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyMDAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1ZlcnNpb25pbmdUZXN0VjInfX0sIHZlcnR3bzIwMDAsICMnVmVyc2lvbmluZ1Rlc3RWMid7fX0sCi0gICAgICAgIHsyNTAwLCB1bmRlZmluZWQsIHtzZXQsIHN0cmluZ30sIGFfc2V0MjUwMCwgc2V0czpuZXcoKX0sCi0gICAgICAgIHszMDAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1ZlcnNpb25pbmdUZXN0VjInfX0sIHZlcnR3bzMwMDAsICMnVmVyc2lvbmluZ1Rlc3RWMid7fX0sCi0gICAgICAgIHs0MDAwLCB1bmRlZmluZWQsIHtsaXN0LCBpMzJ9LCBiaWdfbnVtYmVycywgW119Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTGFyZ2VEZWx0YXMnKQotICAgICl9LAotICAgIHsiTmVzdGVkTGlzdHNJMzJ4MiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtsaXN0LCBpMzJ9fSwgaW50ZWdlcmxpc3QsIFtdfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ05lc3RlZExpc3RzSTMyeDInKQotICAgICl9LAotICAgIHsiTmVzdGVkTGlzdHNJMzJ4MyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtsaXN0LCB7bGlzdCwgaTMyfX19LCBpbnRlZ2VybGlzdCwgW119Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTmVzdGVkTGlzdHNJMzJ4MycpCi0gICAgKX0sCi0gICAgeyJOZXN0ZWRNaXhlZHgyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge3NldCwgaTMyfX0sIGludF9zZXRfbGlzdCwgW119LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIHtzZXQsIHN0cmluZ319LCBtYXBfaW50X3N0cnNldCwgZGljdDpuZXcoKX0sCi0gICAgICAgIHszLCB1bmRlZmluZWQsIHtsaXN0LCB7bWFwLCBpMzIsIHtzZXQsIHN0cmluZ319fSwgbWFwX2ludF9zdHJzZXRfbGlzdCwgW119Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTmVzdGVkTWl4ZWR4MicpCi0gICAgKX0sCi0gICAgeyJMaXN0Qm9ua3MgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdCb25rJ319fSwgYm9uaywgW119Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTGlzdEJvbmtzJykKLSAgICApfSwKLSAgICB7Ik5lc3RlZExpc3RzQm9uayBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtsaXN0LCB7bGlzdCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnQm9uayd9fX19fSwgYm9uaywgW119Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTmVzdGVkTGlzdHNCb25rJykKLSAgICApfSwKLSAgICB7IkJvb2xUZXN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgb3B0aW9uYWwsIGJvb2wsIGIsIHRydWV9LAotICAgICAgICB7Miwgb3B0aW9uYWwsIHN0cmluZywgcywgInRydWUifQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0Jvb2xUZXN0JykKLSAgICApfSwKLSAgICB7IlN0cnVjdEEgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIHJlcXVpcmVkLCBzdHJpbmcsIHMsIHVuZGVmaW5lZH1dfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnU3RydWN0QScpCi0gICAgKX0sCi0gICAgeyJTdHJ1Y3RCIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgb3B0aW9uYWwsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1N0cnVjdEEnfX0sIGFhLCAjJ1N0cnVjdEEne319LAotICAgICAgICB7MiwgcmVxdWlyZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1N0cnVjdEEnfX0sIGFiLCAjJ1N0cnVjdEEne319Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnU3RydWN0QicpCi0gICAgKX0KLSAgXS4KLQotc2VydmljZV9pbmZvX3Rlc3RfKCkgLT4KLSAgWwotICAgIHsidGVzdFZvaWQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RWb2lkLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RWb2lkIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RWb2lkLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdFZvaWQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Vm9pZCwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RTdHJpbmcgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfV19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZywgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0U3RyaW5nIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHN0cmluZywKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmcsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0U3RyaW5nIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZywgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RCeXRlIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGJ5dGV9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Qnl0ZSwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0Qnl0ZSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICBieXRlLAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEJ5dGUsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0Qnl0ZSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RCeXRlLCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdEkzMiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBpMzJ9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STMyLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RJMzIgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAgaTMyLAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEkzMiwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RJMzIgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STMyLCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdEk2NCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBpNjR9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STY0LCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RJNjQgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAgaTY0LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEk2NCwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RJNjQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STY0LCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdERvdWJsZSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBkb3VibGV9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RG91YmxlLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3REb3VibGUgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAgZG91YmxlLAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdERvdWJsZSwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3REb3VibGUgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RG91YmxlLCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdFN0cnVjdCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWHRydWN0J319fQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RydWN0LCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RTdHJ1Y3QgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWHRydWN0J319LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cnVjdCwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RTdHJ1Y3QgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RydWN0LCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdE5lc3QgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1h0cnVjdDInfX19Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3ROZXN0LCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3ROZXN0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1h0cnVjdDInfX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TmVzdCwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3ROZXN0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE5lc3QsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TWFwIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB7bWFwLCBpMzIsIGkzMn19Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXAsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdE1hcCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7bWFwLCBpMzIsIGkzMn0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdE1hcCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXAsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0U3RyaW5nTWFwIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB7bWFwLCBzdHJpbmcsIHN0cmluZ319Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmdNYXAsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdFN0cmluZ01hcCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7bWFwLCBzdHJpbmcsIHN0cmluZ30sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nTWFwLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdFN0cmluZ01hcCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmdNYXAsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0U2V0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB7c2V0LCBpMzJ9fQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U2V0LCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RTZXQgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3NldCwgaTMyfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTZXQsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0U2V0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFNldCwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RMaXN0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB7bGlzdCwgaTMyfX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdExpc3QsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdExpc3QgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge2xpc3QsIGkzMn0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TGlzdCwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RMaXN0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdExpc3QsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0RW51bSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgaTMyfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RW51bSwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0RW51bSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICBpMzIsCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RW51bSwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RFbnVtIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEVudW0sIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0VHlwZWRlZiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBpNjR9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0VHlwZWRlZiwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0VHlwZWRlZiByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICBpNjQsCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0VHlwZWRlZiwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RUeXBlZGVmIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFR5cGVkZWYsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TWFwTWFwIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCBpMzJ9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXBNYXAsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdE1hcE1hcCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7bWFwLCBpMzIsIHttYXAsIGkzMixpMzJ9fSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXBNYXAsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TWFwTWFwIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcE1hcCwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RJbnNhbml0eSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnSW5zYW5pdHknfX19Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJbnNhbml0eSwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0SW5zYW5pdHkgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge21hcCwgaTY0LCB7bWFwLCBpMzIsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAnSW5zYW5pdHknfX19fSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJbnNhbml0eSwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RJbnNhbml0eSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJbnNhbml0eSwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RNdWx0aSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgYnl0ZX0sCi0gICAgICAgIHsyLCBpMzJ9LAotICAgICAgICB7MywgaTY0fSwKLSAgICAgICAgezQsIHttYXAsIGkxNiwgc3RyaW5nfX0sCi0gICAgICAgIHs1LCBpMzJ9LAotICAgICAgICB7NiwgaTY0fQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGksIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdE11bHRpIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1h0cnVjdCd9fSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aSwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RNdWx0aSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aSwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RFeGNlcHRpb24gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfV19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEV4Y2VwdGlvbiwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0RXhjZXB0aW9uIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFeGNlcHRpb24sIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0RXhjZXB0aW9uIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWGNlcHRpb24nfX19Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFeGNlcHRpb24sIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TXVsdGlFeGNlcHRpb24gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfSwgezIsIHN0cmluZ31dfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aUV4Y2VwdGlvbiwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TXVsdGlFeGNlcHRpb24gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWHRydWN0J319LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpRXhjZXB0aW9uLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdE11bHRpRXhjZXB0aW9uIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWGNlcHRpb24nfX19LAotICAgICAgICB7Miwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWGNlcHRpb24yJ319fQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGlFeGNlcHRpb24sIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0T25ld2F5IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGkzMn1dfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RPbmV3YXksIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdE9uZXdheSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICBvbmV3YXlfdm9pZCwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RPbmV3YXksIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0T25ld2F5IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE9uZXdheSwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7ImJsYWhCbGFoIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhibGFoQmxhaCwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJibGFoQmxhaCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhibGFoQmxhaCwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7ImJsYWhCbGFoIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgc2Vjb25kX3NlcnZpY2VfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oYmxhaEJsYWgsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJzZWNvbmR0ZXN0U3RyaW5nIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIHN0cmluZ31dfSwKLSAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKHNlY29uZHRlc3RTdHJpbmcsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsic2Vjb25kdGVzdFN0cmluZyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICBzdHJpbmcsCi0gICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhzZWNvbmR0ZXN0U3RyaW5nLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsic2Vjb25kdGVzdFN0cmluZyBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKHNlY29uZHRlc3RTdHJpbmcsIGV4Y2VwdGlvbnMpCi0gICAgKX0KLSAgXS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL01ha2VmaWxlLmFtIGIvdGVzdC9mZWF0dXJlcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzdkNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMwIEBACisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0VYVFJBX0RJU1QgPSBcCisJbG9jYWxfdGhyaWZ0IFwKKwlpbmRleC5odG1sIFwKKwljb250YWluZXJfbGltaXQucHkgXAorCWluZGV4Lmh0bWwgXAorCWtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gXAorCU1ha2VmaWxlLmFtIFwKKyAgICAgICAgbm9zc2x2My5zaCBcCisJc3RyaW5nX2xpbWl0LnB5IFwKKwl0ZXN0cy5qc29uIFwKKwl0aGVhZGVyX2JpbmFyeS5weSBcCisJc2V0dXAuY2ZnIFwKKyAgICAgICAgdGxzLnNoIFwKKwl1dGlsLnB5CmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2NvbnRhaW5lcl9saW1pdC5weSBiL3Rlc3QvZmVhdHVyZXMvY29udGFpbmVyX2xpbWl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Zjg0ODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL2NvbnRhaW5lcl9saW1pdC5weQpAQCAtMCwwICsxLDcyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc3lzCisKK2Zyb20gdXRpbCBpbXBvcnQgYWRkX2NvbW1vbl9hcmdzLCBpbml0X3Byb3RvY29sCitmcm9tIGxvY2FsX3RocmlmdCBpbXBvcnQgdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVE1lc3NhZ2VUeXBlLCBUVHlwZQorCisKKyMgVE9ETzogZ2VuZXJhdGUgZnJvbSBUaHJpZnRUZXN0LnRocmlmdAorZGVmIHRlc3RfbGlzdChwcm90bywgdmFsdWUpOgorICAgIG1ldGhvZF9uYW1lID0gJ3Rlc3RMaXN0JworICAgIHR0eXBlID0gVFR5cGUuTElTVAorICAgIGV0eXBlID0gVFR5cGUuSTMyCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlQmVnaW4obWV0aG9kX25hbWUsIFRNZXNzYWdlVHlwZS5DQUxMLCAzKQorICAgIHByb3RvLndyaXRlU3RydWN0QmVnaW4obWV0aG9kX25hbWUgKyAnX2FyZ3MnKQorICAgIHByb3RvLndyaXRlRmllbGRCZWdpbigndGhpbmcnLCB0dHlwZSwgMSkKKyAgICBwcm90by53cml0ZUxpc3RCZWdpbihldHlwZSwgbGVuKHZhbHVlKSkKKyAgICBmb3IgZSBpbiB2YWx1ZToKKyAgICAgICAgcHJvdG8ud3JpdGVJMzIoZSkKKyAgICBwcm90by53cml0ZUxpc3RFbmQoKQorICAgIHByb3RvLndyaXRlRmllbGRFbmQoKQorICAgIHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBwcm90by50cmFucy5mbHVzaCgpCisKKyAgICBfLCBtdHlwZSwgXyA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKQorICAgIGFzc2VydCBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBwcm90by5yZWFkU3RydWN0QmVnaW4oKQorICAgIF8sIGZ0eXBlLCBmaWQgPSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgYXNzZXJ0IGZpZCA9PSAwCisgICAgYXNzZXJ0IGZ0eXBlID09IHR0eXBlCisgICAgZXR5cGUyLCBsZW4yID0gcHJvdG8ucmVhZExpc3RCZWdpbigpCisgICAgYXNzZXJ0IGV0eXBlID09IGV0eXBlMgorICAgIGFzc2VydCBsZW4yID09IGxlbih2YWx1ZSkKKyAgICBmb3IgaSBpbiByYW5nZShsZW4yKToKKyAgICAgICAgdiA9IHByb3RvLnJlYWRJMzIoKQorICAgICAgICBhc3NlcnQgdiA9PSB2YWx1ZVtpXQorICAgIHByb3RvLnJlYWRMaXN0RW5kKCkKKyAgICBwcm90by5yZWFkRmllbGRFbmQoKQorICAgIF8sIGZ0eXBlLCBfID0gcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgIGFzc2VydCBmdHlwZSA9PSBUVHlwZS5TVE9QCisgICAgcHJvdG8ucmVhZFN0cnVjdEVuZCgpCisgICAgcHJvdG8ucmVhZE1lc3NhZ2VFbmQoKQorCisKK2RlZiBtYWluKGFyZ3YpOgorICAgIHAgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgYWRkX2NvbW1vbl9hcmdzKHApCisgICAgcC5hZGRfYXJndW1lbnQoJy0tbGltaXQnLCB0eXBlPWludCkKKyAgICBhcmdzID0gcC5wYXJzZV9hcmdzKCkKKyAgICBwcm90byA9IGluaXRfcHJvdG9jb2woYXJncykKKyAgICAjIFRPRE86IHRlc3Qgc2V0IGFuZCBtYXAKKyAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCAtIDEpKSkKKyAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCAtIDEpKSkKKyAgICBwcmludCgnW09LXTogbGltaXQgLSAxJykKKyAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCkpKQorICAgIHRlc3RfbGlzdChwcm90bywgbGlzdChyYW5nZShhcmdzLmxpbWl0KSkpCisgICAgcHJpbnQoJ1tPS106IGp1c3QgbGltaXQnKQorICAgIHRyeToKKyAgICAgICAgdGVzdF9saXN0KHByb3RvLCBsaXN0KHJhbmdlKGFyZ3MubGltaXQgKyAxKSkpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcHJpbnQoJ1tPS106IGxpbWl0ICsgMScpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQoJ1tFUlJPUl06IGxpbWl0ICsgMScpCisgICAgICAgIGFzc2VydCBGYWxzZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9pbmRleC5odG1sIGIvdGVzdC9mZWF0dXJlcy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YTAwMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL2luZGV4Lmh0bWwKQEAgLTAsMCArMSw1MSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8IURPQ1RZUEUgSFRNTD4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cis8dGl0bGU+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEwLjQvY3NzL2pxdWVyeS5kYXRhVGFibGVzLmNzcyI+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMi4xLjMubWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuNC9qcy9qcXVlcnkuZGF0YVRhYmxlcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vcmVzdWx0LmpzIj4KKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8aDI+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU6IFJlc3VsdHM8L2gyPgorPHRhYmxlIGlkPSJ0ZXN0X3Jlc3VsdHMiIGNsYXNzPSJkaXNwbGF5Ij4KKyAgICA8dGhlYWQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5TZXJ2ZXI8L3RoPgorICAgICAgICAgICAgPHRoPkNsaWVudDwvdGg+CisgICAgICAgICAgICA8dGg+UHJvdG9jb2w8L3RoPgorICAgICAgICAgICAgPHRoPlRyYW5zcG9ydDwvdGg+CisgICAgICAgICAgICA8dGg+UmVzdWx0IChsb2cpPC90aD4KKyAgICAgICAgICAgIDx0aD5FeHBlY3RlZDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgPC90aGVhZD4KKzwvdGFibGU+Cis8aDI+VGVzdCBJbmZvcm1hdGlvbjwvaDI+Cis8cHJlIGlkPSJ0ZXN0X2luZm8iPjwvcHJlPgorCis8YSBocmVmPSJsb2ciPmJyb3dzZSByYXcgbG9nIGZpbGVzPC9hPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gYi90ZXN0L2ZlYXR1cmVzL2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0Nzg2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMva25vd25fZmFpbHVyZXNfTGludXguanNvbgpAQCAtMCwwICsxLDUyIEBACitbCisgICAgImNfZ2xpYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNfZ2xpYi1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNsLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY2wtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl9mcmFtZWRfYmluYXJ5X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl9mcmFtZWRfY29tcGFjdF9tdWx0aWgtaGVhZGVyX2J1ZmZlcmVkLWlwIiwKKyAgICAiY3BwLXRoZWFkZXJfdW5mcmFtZWRfYmluYXJ5X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl91bmZyYW1lZF9jb21wYWN0X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiY3NoYXJwLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY3NoYXJwLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJkLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJkLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiZ28tbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJnby1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJnby1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImdvLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImhzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiaHMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiaHMtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJocy1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAibm9kZWpzLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAibm9kZWpzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInBlcmwtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJwZXJsLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfY29udGFpbmVyX2xlbmd0aF9hY2NlbC1iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X3N0cmluZ19sZW5ndGhfYWNjZWwtYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfbXVsdGljLWNvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X3N0cmluZ19sZW5ndGhfbXVsdGljLWNvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJuZXRjb3JlLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgIm5ldGNvcmUtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAibm9kZWpzLXRoZWFkZXJfZnJhbWVkX2JpbmFyeV9oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtdGhlYWRlcl9mcmFtZWRfY29tcGFjdF9oZWFkZXJfYnVmZmVyZWQtaXAiCitdCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2xvY2FsX3RocmlmdC9fX2luaXRfXy5weSBiL3Rlc3QvZmVhdHVyZXMvbG9jYWxfdGhyaWZ0L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NWNlYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL2xvY2FsX3RocmlmdC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDMyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitfU0NSSVBUX0RJUiA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK19ST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9TQ1JJUFRfRElSKSkpCitfTElCRElSID0gb3MucGF0aC5qb2luKF9ST09UX0RJUiwgJ2xpYicsICdweScsICdidWlsZCcsICdsaWIuKicpCisKK2ZvciBsaWJwYXRoIGluIGdsb2IuZ2xvYihfTElCRElSKToKKyAgICBpZiBsaWJwYXRoLmVuZHN3aXRoKCctJWQuJWQnICUgKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0pKToKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGxpYnBhdGgpCisgICAgICAgIHRocmlmdCA9IF9faW1wb3J0X18oJ3RocmlmdCcpCisgICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL25vc3NsdjMuc2ggYi90ZXN0L2ZlYXR1cmVzL25vc3NsdjMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhjY2EwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvbm9zc2x2My5zaApAQCAtMCwwICsxLDU5IEBACisjIS9iaW4vYmFzaAorCisjCisjIENoZWNrcyB0byBtYWtlIHN1cmUgU1NMdjMgaXMgbm90IGFsbG93ZWQgYnkgYSBzZXJ2ZXIuCisjCisKK1RIUklGVEhPU1Q9bG9jYWxob3N0CitUSFJJRlRQT1JUPTkwOTAKKword2hpbGUgW1sgJCMgLWdlIDEgXV07IGRvCisgIGFyZz0iJDEiCisgIGFyZ0lOPSgke2FyZy8vPS8gfSkKKworICBjYXNlICR7YXJnSU5bMF19IGluCisgICAgLWh8LS1ob3N0KQorICAgIFRIUklGVEhPU1Q9JHthcmdJTlsxXX0KKyAgICBzaGlmdCAjIHBhc3QgYXJndW1lbnQKKyAgICA7OworICAgIC1wfC0tcG9ydCkKKyAgICBUSFJJRlRQT1JUPSR7YXJnSU5bMV19CisgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50CisgICAgOzsKKyAgICAqKQorICAgICAgICAgICMgdW5rbm93biBvcHRpb24gaWdub3JlZAorICAgIDs7CisgIGVzYWMKKworICBzaGlmdCAgICMgcGFzdCBhcmd1bWVudCBvciB2YWx1ZQorZG9uZQorCitmdW5jdGlvbiBub3NzbHYzCit7CisgIGxvY2FsIG5lZ28KKyAgbG9jYWwgbmVnb2RlbmllZAorICBsb2NhbCBvcGVuc3NsdgorCisgIG9wZW5zc2x2PSQob3BlbnNzbCB2ZXJzaW9uIHwgY3V0IC1kJyAnIC1mMikKKyAgaWYgW1sgJG9wZW5zc2x2ID4gIjEuMCIgXV07IHRoZW4KKyAgICBlY2hvICJbcGFzc10gT3BlblNTTCAxLjEgb3IgbGF0ZXIgLSBubyBuZWVkIHRvIGNoZWNrIHNzbDMiCisgICAgcmV0dXJuIDAKKyAgZmkKKworICAjIGVjaG8gIm9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgJFRIUklGVEhPU1Q6JFRIUklGVFBPUlQgLUNBZmlsZSAuLi9rZXlzL0NBLnBlbSAtc3NsMyAyPiYxIDwgL2Rldi9udWxsIgorICBuZWdvPSQob3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAkVEhSSUZUSE9TVDokVEhSSUZUUE9SVCAtQ0FmaWxlIC4uL2tleXMvQ0EucGVtIC1zc2wzIDI+JjEgPCAvZGV2L251bGwpCisgIG5lZ29kZW5pZWQ9JD8KKworICBpZiBbWyAkbmVnb2RlbmllZCAtbmUgMCBdXTsgdGhlbgorICAgIGVjaG8gIltwYXNzXSBTU0x2MyBuZWdvdGlhdGlvbiBkaXNhYmxlZCIKKyAgICBlY2hvICRuZWdvCisgICAgcmV0dXJuIDAKKyAgZmkKKworICBlY2hvICJbZmFpbF0gU1NMdjMgbmVnb3RpYXRpb24gZW5hYmxlZCEgIHN0ZG91dDoiCisgIGVjaG8gJG5lZ28KKyAgcmV0dXJuIDEKK30KKworbm9zc2x2MworZXhpdCAkPwpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9zZXR1cC5jZmcgYi90ZXN0L2ZlYXR1cmVzL3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGExZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9zZXR1cC5jZmcKQEAgLTAsMCArMSwyIEBACitbZmxha2U4XQorbWF4LWxpbmUtbGVuZ3RoID0gMTAwCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL3N0cmluZ19saW1pdC5weSBiL3Rlc3QvZmVhdHVyZXMvc3RyaW5nX2xpbWl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTkxZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL3N0cmluZ19saW1pdC5weQpAQCAtMCwwICsxLDYyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc3lzCisKK2Zyb20gdXRpbCBpbXBvcnQgYWRkX2NvbW1vbl9hcmdzLCBpbml0X3Byb3RvY29sCitmcm9tIGxvY2FsX3RocmlmdCBpbXBvcnQgdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVE1lc3NhZ2VUeXBlLCBUVHlwZQorCisKKyMgVE9ETzogZ2VuZXJhdGUgZnJvbSBUaHJpZnRUZXN0LnRocmlmdAorZGVmIHRlc3Rfc3RyaW5nKHByb3RvLCB2YWx1ZSk6CisgICAgbWV0aG9kX25hbWUgPSAndGVzdFN0cmluZycKKyAgICB0dHlwZSA9IFRUeXBlLlNUUklORworICAgIHByb3RvLndyaXRlTWVzc2FnZUJlZ2luKG1ldGhvZF9uYW1lLCBUTWVzc2FnZVR5cGUuQ0FMTCwgMykKKyAgICBwcm90by53cml0ZVN0cnVjdEJlZ2luKG1ldGhvZF9uYW1lICsgJ19hcmdzJykKKyAgICBwcm90by53cml0ZUZpZWxkQmVnaW4oJ3RoaW5nJywgdHR5cGUsIDEpCisgICAgcHJvdG8ud3JpdGVTdHJpbmcodmFsdWUpCisgICAgcHJvdG8ud3JpdGVGaWVsZEVuZCgpCisgICAgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgICBwcm90by53cml0ZU1lc3NhZ2VFbmQoKQorICAgIHByb3RvLnRyYW5zLmZsdXNoKCkKKworICAgIF8sIG10eXBlLCBfID0gcHJvdG8ucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgYXNzZXJ0IG10eXBlID09IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIHByb3RvLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgXywgZnR5cGUsIGZpZCA9IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkKKyAgICBhc3NlcnQgZmlkID09IDAKKyAgICBhc3NlcnQgZnR5cGUgPT0gdHR5cGUKKyAgICByZXN1bHQgPSBwcm90by5yZWFkU3RyaW5nKCkKKyAgICBwcm90by5yZWFkRmllbGRFbmQoKQorICAgIF8sIGZ0eXBlLCBfID0gcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgIGFzc2VydCBmdHlwZSA9PSBUVHlwZS5TVE9QCisgICAgcHJvdG8ucmVhZFN0cnVjdEVuZCgpCisgICAgcHJvdG8ucmVhZE1lc3NhZ2VFbmQoKQorICAgIGFzc2VydCB2YWx1ZSA9PSByZXN1bHQKKworCitkZWYgbWFpbihhcmd2KToKKyAgICBwID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIGFkZF9jb21tb25fYXJncyhwKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLWxpbWl0JywgdHlwZT1pbnQpCisgICAgYXJncyA9IHAucGFyc2VfYXJncygpCisgICAgcHJvdG8gPSBpbml0X3Byb3RvY29sKGFyZ3MpCisgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIChhcmdzLmxpbWl0IC0gMSkpCisgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIChhcmdzLmxpbWl0IC0gMSkpCisgICAgcHJpbnQoJ1tPS106IGxpbWl0IC0gMScpCisgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIGFyZ3MubGltaXQpCisgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIGFyZ3MubGltaXQpCisgICAgcHJpbnQoJ1tPS106IGp1c3QgbGltaXQnKQorICAgIHRyeToKKyAgICAgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIChhcmdzLmxpbWl0ICsgMSkpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcHJpbnQoJ1tPS106IGxpbWl0ICsgMScpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQoJ1tFUlJPUl06IGxpbWl0ICsgMScpCisgICAgICAgIGFzc2VydCBGYWxzZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbihzeXMuYXJndlsxOl0pCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL3Rlc3RzLmpzb24gYi90ZXN0L2ZlYXR1cmVzL3Rlc3RzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlMDdkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvdGVzdHMuanNvbgpAQCAtMCwwICsxLDExNCBAQAorWworICB7CisgICAgImRlc2NyaXB0aW9uIjogIlRIZWFkZXIgZGV0ZWN0cyB1bmZyYW1lZCBiaW5hcnkgd2lyZSBmb3JtYXQiLAorICAgICJuYW1lIjogInRoZWFkZXJfdW5mcmFtZWRfYmluYXJ5IiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgInRoZWFkZXJfYmluYXJ5LnB5IiwKKyAgICAgICItLW92ZXJyaWRlLXByb3RvY29sPWJpbmFyeSIsCisgICAgICAiLS1vdmVycmlkZS10cmFuc3BvcnQ9YnVmZmVyZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJoZWFkZXIiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJUSGVhZGVyIGRldGVjdHMgZnJhbWVkIGJpbmFyeSB3aXJlIGZvcm1hdCIsCisgICAgIm5hbWUiOiAidGhlYWRlcl9mcmFtZWRfYmluYXJ5IiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgInRoZWFkZXJfYmluYXJ5LnB5IiwKKyAgICAgICItLW92ZXJyaWRlLXByb3RvY29sPWJpbmFyeSIsCisgICAgICAiLS1vdmVycmlkZS10cmFuc3BvcnQ9ZnJhbWVkIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiaGVhZGVyIl0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAiZGVzY3JpcHRpb24iOiAiVEhlYWRlciBkZXRlY3RzIHVuZnJhbWVkIGNvbXBhY3Qgd2lyZSBmb3JtYXQiLAorICAgICJuYW1lIjogInRoZWFkZXJfdW5mcmFtZWRfY29tcGFjdCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJ0aGVhZGVyX2JpbmFyeS5weSIsCisgICAgICAiLS1vdmVycmlkZS1wcm90b2NvbD1jb21wYWN0IiwKKyAgICAgICItLW92ZXJyaWRlLXRyYW5zcG9ydD1idWZmZXJlZCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbImhlYWRlciJdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgImRlc2NyaXB0aW9uIjogIlRIZWFkZXIgZGV0ZWN0cyBmcmFtZWQgY29tcGFjdCB3aXJlIGZvcm1hdCIsCisgICAgIm5hbWUiOiAidGhlYWRlcl9mcmFtZWRfY29tcGFjdCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJ0aGVhZGVyX2JpbmFyeS5weSIsCisgICAgICAiLS1vdmVycmlkZS1wcm90b2NvbD1jb21wYWN0IiwKKyAgICAgICItLW92ZXJyaWRlLXRyYW5zcG9ydD1mcmFtZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJoZWFkZXIiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImxpbWl0X3N0cmluZ19sZW5ndGgiLAorICAgICJjb21tYW5kIjogWworICAgICAgInB5dGhvbiIsCisgICAgICAic3RyaW5nX2xpbWl0LnB5IiwKKyAgICAgICItLWxpbWl0PTUwIgorICAgIF0sCisgICAgInJlbW90ZV9hcmdzIjogWworICAgICAgIi0tc3RyaW5nLWxpbWl0PTUwIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJjb21wYWN0IgorICAgIF0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJsaW1pdF9jb250YWluZXJfbGVuZ3RoIiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgImNvbnRhaW5lcl9saW1pdC5weSIsCisgICAgICAiLS1saW1pdD01MCIKKyAgICBdLAorICAgICJyZW1vdGVfYXJncyI6IFsKKyAgICAgICItLWNvbnRhaW5lci1saW1pdD01MCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibm9zc2x2MyIsCisgICAgImNvbW1lbnQiOiAiY2hlY2sgdG8gbWFrZSBzdXJlIFNTTHYzIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICJjb21tYW5kIjogWworICAgICAgIm5vc3NsdjMuc2giCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAtc3NsIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJ0bHMiLAorICAgICJjb21tZW50IjogImNoZWNrIHRvIG1ha2Ugc3VyZSBUTFN2MS4wIG9yIGxhdGVyIGlzIHN1cHBvcnRlZCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAidGxzLnNoIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiYmluYXJ5Il0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwLXNzbCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9CitdCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL3RoZWFkZXJfYmluYXJ5LnB5IGIvdGVzdC9mZWF0dXJlcy90aGVhZGVyX2JpbmFyeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTEzOTlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy90aGVhZGVyX2JpbmFyeS5weQpAQCAtMCwwICsxLDcwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3lzCisKK2Zyb20gdXRpbCBpbXBvcnQgYWRkX2NvbW1vbl9hcmdzCitmcm9tIGxvY2FsX3RocmlmdCBpbXBvcnQgdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVE1lc3NhZ2VUeXBlLCBUVHlwZQorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRTb2NrZXQgaW1wb3J0IFRTb2NrZXQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUQnVmZmVyZWRUcmFuc3BvcnQsIFRGcmFtZWRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCisKKworZGVmIHRlc3Rfdm9pZChwcm90byk6CisgICAgcHJvdG8ud3JpdGVNZXNzYWdlQmVnaW4oJ3Rlc3RWb2lkJywgVE1lc3NhZ2VUeXBlLkNBTEwsIDMpCisgICAgcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbigndGVzdFZvaWRfYXJncycpCisgICAgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgICBwcm90by53cml0ZU1lc3NhZ2VFbmQoKQorICAgIHByb3RvLnRyYW5zLmZsdXNoKCkKKworICAgIF8sIG10eXBlLCBfID0gcHJvdG8ucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgYXNzZXJ0IG10eXBlID09IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIHByb3RvLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgXywgZnR5cGUsIF8gPSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgYXNzZXJ0IGZ0eXBlID09IFRUeXBlLlNUT1AKKyAgICBwcm90by5yZWFkU3RydWN0RW5kKCkKKyAgICBwcm90by5yZWFkTWVzc2FnZUVuZCgpCisKKworIyBUSGVhZGVyIHN0YWNrIHNob3VsZCBhY2NlcHQgYmluYXJ5IHByb3RvY29sIHdpdGggb3B0aW9uYWxseSBmcmFtZWQgdHJhbnNwb3J0CitkZWYgbWFpbihhcmd2KToKKyAgICBwID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIGFkZF9jb21tb25fYXJncyhwKQorICAgICMgU2luY2UgVEhlYWRlclRyYW5zcG9ydCBhY3RzIGFzIGZyYW1lZCB0cmFuc3BvcnQgd2hlbiBkZXRlY3RlZCBmcmFtZSwgd2UKKyAgICAjIGNhbm5vdCB1c2UgLS10cmFuc3BvcnQ9ZnJhbWVkIGFzIGl0IHdvdWxkIHJlc3VsdCBpbiAyIGxheWVyZWQgZnJhbWVzLgorICAgIHAuYWRkX2FyZ3VtZW50KCctLW92ZXJyaWRlLXRyYW5zcG9ydCcpCisgICAgcC5hZGRfYXJndW1lbnQoJy0tb3ZlcnJpZGUtcHJvdG9jb2wnKQorICAgIGFyZ3MgPSBwLnBhcnNlX2FyZ3MoKQorICAgIGFzc2VydCBhcmdzLnByb3RvY29sID09ICdoZWFkZXInCisgICAgYXNzZXJ0IGFyZ3MudHJhbnNwb3J0ID09ICdidWZmZXJlZCcKKyAgICBhc3NlcnQgbm90IGFyZ3Muc3NsCisKKyAgICBzb2NrID0gVFNvY2tldChhcmdzLmhvc3QsIGFyZ3MucG9ydCwgc29ja2V0X2ZhbWlseT1zb2NrZXQuQUZfSU5FVCkKKyAgICBpZiBub3QgYXJncy5vdmVycmlkZV90cmFuc3BvcnQgb3IgYXJncy5vdmVycmlkZV90cmFuc3BvcnQgPT0gJ2J1ZmZlcmVkJzoKKyAgICAgICAgdHJhbnMgPSBUQnVmZmVyZWRUcmFuc3BvcnQoc29jaykKKyAgICBlbGlmIGFyZ3Mub3ZlcnJpZGVfdHJhbnNwb3J0ID09ICdmcmFtZWQnOgorICAgICAgICBwcmludCgnVEZSQU1FRCcpCisgICAgICAgIHRyYW5zID0gVEZyYW1lZFRyYW5zcG9ydChzb2NrKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ludmFsaWQgdHJhbnNwb3J0JykKKyAgICB0cmFucy5vcGVuKCkKKworICAgIGlmIG5vdCBhcmdzLm92ZXJyaWRlX3Byb3RvY29sIG9yIGFyZ3Mub3ZlcnJpZGVfcHJvdG9jb2wgPT0gJ2JpbmFyeSc6CisgICAgICAgIHByb3RvID0gVEJpbmFyeVByb3RvY29sKHRyYW5zKQorICAgIGVsaWYgYXJncy5vdmVycmlkZV9wcm90b2NvbCA9PSAnY29tcGFjdCc6CisgICAgICAgIHByb3RvID0gVENvbXBhY3RQcm90b2NvbCh0cmFucykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbnZhbGlkIHRyYW5zcG9ydCcpCisKKyAgICB0ZXN0X3ZvaWQocHJvdG8pCisgICAgdGVzdF92b2lkKHByb3RvKQorCisgICAgdHJhbnMuY2xvc2UoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy90bHMuc2ggYi90ZXN0L2ZlYXR1cmVzL3Rscy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYWRhNmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy90bHMuc2gKQEAgLTAsMCArMSw3MSBAQAorIyEvYmluL2Jhc2gKKworIworIyBDaGVja3MgdG8gbWFrZSBzdXJlIFRMU3YxLjAgb3IgbGF0ZXIgaXMgYWxsb3dlZCBieSBhIHNlcnZlci4KKyMKKworVEhSSUZUSE9TVD1sb2NhbGhvc3QKK1RIUklGVFBPUlQ9OTA5MAorCit3aGlsZSBbWyAkIyAtZ2UgMSBdXTsgZG8KKyAgYXJnPSIkMSIKKyAgYXJnSU49KCR7YXJnLy89LyB9KQorCisgIGNhc2UgJHthcmdJTlswXX0gaW4KKyAgICAtaHwtLWhvc3QpCisgICAgVEhSSUZUSE9TVD0ke2FyZ0lOWzFdfQorICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAorICAgIDs7CisgICAgLXB8LS1wb3J0KQorICAgIFRIUklGVFBPUlQ9JHthcmdJTlsxXX0KKyAgICBzaGlmdCAjIHBhc3QgYXJndW1lbnQKKyAgICA7OworICAgICopCisgICAgICAgICAgIyB1bmtub3duIG9wdGlvbiBpZ25vcmVkCisgICAgOzsKKyAgZXNhYworCisgIHNoaWZ0ICAgIyBwYXN0IGFyZ3VtZW50IG9yIHZhbHVlCitkb25lCisKK2RlY2xhcmUgLUEgRVhQRUNUX05FR09USUFURQorRVhQRUNUX05FR09USUFURVt0bHMxXT0xCitFWFBFQ1RfTkVHT1RJQVRFW3RsczFfMV09MQorRVhQRUNUX05FR09USUFURVt0bHMxXzJdPTEKKworZmFpbHVyZXM9MAorCitmdW5jdGlvbiB0bHMKK3sKKyAgZm9yIFBST1RPIGluICIkeyFFWFBFQ1RfTkVHT1RJQVRFW0BdfSI7IGRvCisKKyAgICBsb2NhbCBuZWdvCisgICAgbG9jYWwgbmVnb2RlbmllZAorICAgIGxvY2FsIHJlcworCisgICAgZWNobyAib3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAkVEhSSUZUSE9TVDokVEhSSUZUUE9SVCAtQ0FmaWxlIC4uL2tleXMvQ0EucGVtIC0kUFJPVE8gMj4mMSA8IC9kZXYvbnVsbCIKKyAgICBuZWdvPSQob3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAkVEhSSUZUSE9TVDokVEhSSUZUUE9SVCAtQ0FmaWxlIC4uL2tleXMvQ0EucGVtIC0kUFJPVE8gMj4mMSA8IC9kZXYvbnVsbCkKKyAgICBuZWdvZGVuaWVkPSQ/CisgICAgZWNobyAicmVzdWx0IG9mIGNvbW1hbmQ6ICRuZWdvZGVuaWVkIgorCisgICAgcmVzPSJlbmFibGVkIjsgaWYgW1sgJHtFWFBFQ1RfTkVHT1RJQVRFWyRQUk9UT119IC1lcSAwIF1dOyB0aGVuIHJlcz0iZGlzYWJsZWQiOyBmaQorCisgICAgaWYgW1sgJG5lZ29kZW5pZWQgLW5lICR7RVhQRUNUX05FR09USUFURVskUFJPVE9dfSBdXTsgdGhlbgorICAgICAgZWNobyAiJFBST1RPIG5lZ290aWF0aW9uIGFsbG93ZWQiCisgICAgZWxzZQorICAgICAgZWNobyAiW3dhcm5dICRQUk9UTyBuZWdvdGlhdGlvbiBkaWQgbm90IHdvcmsiCisgICAgICBlY2hvICRuZWdvCisgICAgICAoKGZhaWx1cmVzKyspKQorICAgIGZpCisgIGRvbmUKK30KKwordGxzCisKK2lmIFtbICRmYWlsdXJlcyAtZXEgMyBdXTsgdGhlbgorICBlY2hvICJbZmFpbF0gQXQgbGVhc3Qgb25lIG9mIFRMU3YxLjAsIFRMU3YxLjEsIG9yIFRMU3YxLjIgbmVlZHMgdG8gd29yaywgYnV0IGRvZXMgbm90IgorICBleGl0ICRmYWlsdXJlcworZmkKKworZWNobyAiW3Bhc3NdIEF0IGxlYXN0IG9uZSBvZiBUTFN2MS4wLCBUTFN2MS4xLCBvciBUTFN2MS4yIHdvcmtlZCIKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy91dGlsLnB5IGIvdGVzdC9mZWF0dXJlcy91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYmJiYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL3V0aWwucHkKQEAgLTAsMCArMSw0MCBAQAoraW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc29ja2V0CisKK2Zyb20gbG9jYWxfdGhyaWZ0IGltcG9ydCB0aHJpZnQgICMgbm9xYQorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRTb2NrZXQgaW1wb3J0IFRTb2NrZXQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUQnVmZmVyZWRUcmFuc3BvcnQsIFRGcmFtZWRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5USHR0cENsaWVudCBpbXBvcnQgVEh0dHBDbGllbnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCisKKworZGVmIGFkZF9jb21tb25fYXJncyhwKToKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1ob3N0JywgZGVmYXVsdD0nbG9jYWxob3N0JykKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1wb3J0JywgdHlwZT1pbnQsIGRlZmF1bHQ9OTA5MCkKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1wcm90b2NvbCcsIGRlZmF1bHQ9J2JpbmFyeScpCisgICAgcC5hZGRfYXJndW1lbnQoJy0tdHJhbnNwb3J0JywgZGVmYXVsdD0nYnVmZmVyZWQnKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLXNzbCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisKKworZGVmIHBhcnNlX2NvbW1vbl9hcmdzKGFyZ3YpOgorICAgIHAgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgYWRkX2NvbW1vbl9hcmdzKHApCisgICAgcmV0dXJuIHAucGFyc2VfYXJncyhhcmd2KQorCisKK2RlZiBpbml0X3Byb3RvY29sKGFyZ3MpOgorICAgIHNvY2sgPSBUU29ja2V0KGFyZ3MuaG9zdCwgYXJncy5wb3J0LCBzb2NrZXRfZmFtaWx5PXNvY2tldC5BRl9JTkVUKQorICAgIHNvY2suc2V0VGltZW91dCg1MDApCisgICAgdHJhbnMgPSB7CisgICAgICAgICdidWZmZXJlZCc6IFRCdWZmZXJlZFRyYW5zcG9ydCwKKyAgICAgICAgJ2ZyYW1lZCc6IFRGcmFtZWRUcmFuc3BvcnQsCisgICAgICAgICdodHRwJzogVEh0dHBDbGllbnQsCisgICAgfVthcmdzLnRyYW5zcG9ydF0oc29jaykKKyAgICB0cmFucy5vcGVuKCkKKyAgICByZXR1cm4geworICAgICAgICAnYmluYXJ5JzogVEJpbmFyeVByb3RvY29sLAorICAgICAgICAnY29tcGFjdCc6IFRDb21wYWN0UHJvdG9jb2wsCisgICAgICAgICdqc29uJzogVEpTT05Qcm90b2NvbCwKKyAgICB9W2FyZ3MucHJvdG9jb2xdKHRyYW5zKQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9NYWtlZmlsZS5hbSBiL3Rlc3QvZ28vTWFrZWZpbGUuYW0KaW5kZXggMmIyZGJjZS4uNmRhODMzOSAxMDA2NDQKLS0tIGEvdGVzdC9nby9NYWtlZmlsZS5hbQorKysgYi90ZXN0L2dvL01ha2VmaWxlLmFtCkBAIC0xOSw4ICsxOSw3IEBACiAKIEJVSUxUX1NPVVJDRVMgPSBnb3BhdGgKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLVRIUklGVENNRCA9ICQoVEhSSUZUKSAtb3V0IHNyYy9nZW4gLS1nZW4gZ286dGhyaWZ0X2ltcG9ydD10aHJpZnQKK1RIUklGVENNRCA9ICQoVEhSSUZUKSAtb3V0IHNyYy9nZW4gLS1nZW4gZ286dGhyaWZ0X2ltcG9ydD10aHJpZnQkKENPTVBJTEVSX0VYVFJBRkxBRykKIFRIUklGVFRFU1QgPSAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAogcHJlY3Jvc3M6IGJpbi90ZXN0Y2xpZW50IGJpbi90ZXN0c2VydmVyCkBAIC0yOCwxMyArMjcsMTcgQEAKIFRocmlmdFRlc3QudGhyaWZ0OiAkKFRIUklGVFRFU1QpCiAJZ3JlcCAtdiBsaXN0LiptYXAuKmxpc3QuKm1hcCAkKFRIUklGVFRFU1QpID4gVGhyaWZ0VGVzdC50aHJpZnQKIAorLlBIT05ZOiBnb3BhdGgKKwogIyBUaHJpZnQgZm9yIEdPIGhhcyBwcm9ibGVtcyB3aXRoIGNvbXBsZXggbWFwIGtleXM6IFRIUklGVC0yMDYzCiBnb3BhdGg6ICQoVEhSSUZUKSBUaHJpZnRUZXN0LnRocmlmdAogCW1rZGlyIC1wIHNyYy9nZW4KIAkkKFRIUklGVENNRCkgVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVENNRCkgLi4vU3RyZXNzVGVzdC50aHJpZnQKLQlsbiAtbmZzIC4uLy4uLy4uL2xpYi9nby90aHJpZnQgc3JjL3RocmlmdAorCUdPUEFUSD1gcHdkYCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sgfHwgdHJ1ZQorCXNlZCAtaSAncy9cImNvbnRleHRcIi9cImdvbGFuZy5vcmdcL3hcL25ldFwvY29udGV4dFwiL2cnIHNyYy9naXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jay9jb250cm9sbGVyLmdvIHx8IHRydWUKIAlHT1BBVEg9YHB3ZGAgJChHTykgZ2V0IGdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrCisJbG4gLW5mcyAuLi8uLi8uLi9saWIvZ28vdGhyaWZ0IHNyYy90aHJpZnQKIAl0b3VjaCBnb3BhdGgKIAogYmluL3Rlc3RjbGllbnQ6IGdvcGF0aApAQCAtNTEsNyArNTQsNyBAQAogCiBjaGVja19QUk9HUkFNUzogYmluL3Rlc3RjbGllbnQgYmluL3Rlc3RzZXJ2ZXIgYmluL3N0cmVzcwogCi1jaGVjazogZ29wYXRoCitjaGVjazogZ29wYXRoIGdlbm1vY2sKIAlHT1BBVEg9YHB3ZGAgJChHTykgdGVzdCAtdiBjb21tb24vLi4uCiAKIGdlbm1vY2s6IGdvcGF0aApkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvYmluL3N0cmVzcy9tYWluLmdvIGIvdGVzdC9nby9zcmMvYmluL3N0cmVzcy9tYWluLmdvCmluZGV4IDRmYzg4ZTAuLmYyZTBmMjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2Jpbi9zdHJlc3MvbWFpbi5nbworKysgYi90ZXN0L2dvL3NyYy9iaW4vc3RyZXNzL21haW4uZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgbWFpbgogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJmbGFnIgogCSJmbXQiCiAJImdlbi9zdHJlc3MiCkBAIC0yMDEsMTQgKzIwMiwxMyBAQAogCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQogCQl9CiAJY2FzZSBlY2hvU2V0OgotCQlzIDo9IG1hcFtpbnQ4XWJvb2x7LTEwOiB0cnVlLCAtOTogdHJ1ZSwgLTg6IHRydWUsIC03OiB0cnVlLCAtNjogdHJ1ZSwgLTU6IHRydWUsIC00OiB0cnVlLCAtMzogdHJ1ZSwgLTI6IHRydWUsIC0xOiB0cnVlLCAwOiB0cnVlLCAxOiB0cnVlLCAyOiB0cnVlLCAzOiB0cnVlLCA0OiB0cnVlLCA1OiB0cnVlLCA2OiB0cnVlLCA3OiB0cnVlLCA4OiB0cnVlfQorCQlzIDo9IG1hcFtpbnQ4XXN0cnVjdHt9ey0xMDoge30sIC05OiB7fSwgLTg6IHt9LCAtNzoge30sIC02OiB7fSwgLTU6IHt9LCAtNDoge30sIC0zOiB7fSwgLTI6IHt9LCAtMToge30sIDA6IHt9LCAxOiB7fSwgMjoge30sIDM6IHt9LCA0OiB7fSwgNToge30sIDY6IHt9LCA3OiB7fSwgODoge319CiAJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKIAkJCWNsaWVudC5FY2hvU2V0KHMpCiAJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCiAJCX0KIAljYXNlIGVjaG9NYXA6Ci0JCW0gOj0gbWFwW2ludDhdaW50OHsKLQkJCS0xMDogMTAsIC05OiA5LCAtODogOCwgLTc6IDcsIC02OiA2LCAtNTogNSwgLTQ6IDQsIC0zOiAzLCAtMjogMiwgLTE6IDEsIDA6IDAsIDE6IDEsIDI6IDIsIDM6IDMsIDQ6IDQsIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDh9CisJCW0gOj0gbWFwW2ludDhdaW50OHstMTA6IDEwLCAtOTogOSwgLTg6IDgsIC03OiA3LCAtNjogNiwgLTU6IDUsIC00OiA0LCAtMzogMywgLTI6IDIsIC0xOiAxLCAwOiAwLCAxOiAxLCAyOiAyLCAzOiAzLCA0OiA0LCA1OiA1LCA2OiA2LCA3OiA3LCA4OiA4fQogCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CiAJCQljbGllbnQuRWNob01hcChtKQogCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQpAQCAtMjIwLDM1ICsyMjAsMzUgQEAKIAogdHlwZSBoYW5kbGVyIHN0cnVjdHt9CiAKLWZ1bmMgKGggKmhhbmRsZXIpIEVjaG9Wb2lkKCkgKGVyciBlcnJvcikgeworZnVuYyAoaCAqaGFuZGxlcikgRWNob1ZvaWQoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gbmlsCiB9Ci1mdW5jIChoICpoYW5kbGVyKSBFY2hvQnl0ZShhcmcgaW50OCkgKHIgaW50OCwgZXJyIGVycm9yKSB7CitmdW5jIChoICpoYW5kbGVyKSBFY2hvQnl0ZShjdHggY29udGV4dC5Db250ZXh0LCBhcmcgaW50OCkgKHIgaW50OCwgZXJyIGVycm9yKSB7CiAJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQogCXJldHVybiBhcmcsIG5pbAogfQotZnVuYyAoaCAqaGFuZGxlcikgRWNob0kzMihhcmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9JMzIoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIGludDMyKSAociBpbnQzMiwgZXJyIGVycm9yKSB7CiAJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQogCXJldHVybiBhcmcsIG5pbAogfQotZnVuYyAoaCAqaGFuZGxlcikgRWNob0k2NChhcmcgaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9JNjQoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CiAJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQogCXJldHVybiBhcmcsIG5pbAogfQotZnVuYyAoaCAqaGFuZGxlcikgRWNob1N0cmluZyhhcmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworZnVuYyAoaCAqaGFuZGxlcikgRWNob1N0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCBhcmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gYXJnLCBuaWwKIH0KLWZ1bmMgKGggKmhhbmRsZXIpIEVjaG9MaXN0KGFyZyBbXWludDgpIChyIFtdaW50OCwgZXJyIGVycm9yKSB7CitmdW5jIChoICpoYW5kbGVyKSBFY2hvTGlzdChjdHggY29udGV4dC5Db250ZXh0LCBhcmcgW11pbnQ4KSAociBbXWludDgsIGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gYXJnLCBuaWwKIH0KLWZ1bmMgKGggKmhhbmRsZXIpIEVjaG9TZXQoYXJnIG1hcFtpbnQ4XWJvb2wpIChyIG1hcFtpbnQ4XWJvb2wsIGVyciBlcnJvcikgeworZnVuYyAoaCAqaGFuZGxlcikgRWNob1NldChjdHggY29udGV4dC5Db250ZXh0LCBhcmcgbWFwW2ludDhdc3RydWN0e30pIChyIG1hcFtpbnQ4XXN0cnVjdHt9LCBlcnIgZXJyb3IpIHsKIAlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCiAJcmV0dXJuIGFyZywgbmlsCiB9Ci1mdW5jIChoICpoYW5kbGVyKSBFY2hvTWFwKGFyZyBtYXBbaW50OF1pbnQ4KSAociBtYXBbaW50OF1pbnQ4LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9NYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIG1hcFtpbnQ4XWludDgpIChyIG1hcFtpbnQ4XWludDgsIGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gYXJnLCBuaWwKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0Y2xpZW50L21haW4uZ28gYi90ZXN0L2dvL3NyYy9iaW4vdGVzdGNsaWVudC9tYWluLmdvCmluZGV4IGQwZTVmZjguLjQzNTdlZTggMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0Y2xpZW50L21haW4uZ28KKysrIGIvdGVzdC9nby9zcmMvYmluL3Rlc3RjbGllbnQvbWFpbi5nbwpAQCAtMjEsNiArMjEsNyBAQAogCiBpbXBvcnQgKAogCSJjb21tb24iCisJImNvbnRleHQiCiAJImZsYWciCiAJImdlbi90aHJpZnR0ZXN0IgogCXQgImxvZyIKQEAgLTM0LDExICszNSwxMiBAQAogdmFyIHRyYW5zcG9ydCA9IGZsYWcuU3RyaW5nKCJ0cmFuc3BvcnQiLCAiYnVmZmVyZWQiLCAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCB6bGliIikKIHZhciBwcm90b2NvbCA9IGZsYWcuU3RyaW5nKCJwcm90b2NvbCIsICJiaW5hcnkiLCAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiIpCiB2YXIgc3NsID0gZmxhZy5Cb29sKCJzc2wiLCBmYWxzZSwgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKK3ZhciB6bGliID0gZmxhZy5Cb29sKCJ6bGliIiwgZmFsc2UsICJXcmFwcGVkIFRyYW5zcG9ydCB1c2luZyBabGliIikKIHZhciB0ZXN0bG9vcHMgPSBmbGFnLkludCgidGVzdGxvb3BzIiwgMSwgIk51bWJlciBvZiBUZXN0cyIpCiAKIGZ1bmMgbWFpbigpIHsKIAlmbGFnLlBhcnNlKCkKLQljbGllbnQsIGVyciA6PSBjb21tb24uU3RhcnRDbGllbnQoKmhvc3QsICpwb3J0LCAqZG9tYWluX3NvY2tldCwgKnRyYW5zcG9ydCwgKnByb3RvY29sLCAqc3NsKQorCWNsaWVudCwgXywgZXJyIDo9IGNvbW1vbi5TdGFydENsaWVudCgqaG9zdCwgKnBvcnQsICpkb21haW5fc29ja2V0LCAqdHJhbnNwb3J0LCAqcHJvdG9jb2wsICpzc2wpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50OiAiLCBlcnIpCiAJfQpAQCAtNjAsMTQgKzYyLDE1IEBACiB9CiAKIHZhciB4Y2VwdCA9ICZ0aHJpZnR0ZXN0LlhjZXB0aW9ue0Vycm9yQ29kZTogMTAwMSwgTWVzc2FnZTogIlhjZXB0aW9uIn0KK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKIAogZnVuYyBjYWxsRXZlcnl0aGluZyhjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCkgewogCXZhciBlcnIgZXJyb3IKLQlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAiLCBlcnIpCiAJfQogCi0JdGhpbmcsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZygidGhpbmciKQorCXRoaW5nLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRoaW5nIikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZygpIGNhbGw6ICIsIGVycikKIAl9CkBAIC03NSwxNCArNzgsMTQgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZygpIHJlc3VsdCwgZXhwZWN0ZWQgJ3RoaW5nJyBnb3QgJyVzJyAiLCB0aGluZykKIAl9CiAKLQlibCwgZXJyIDo9IGNsaWVudC5UZXN0Qm9vbCh0cnVlKQorCWJsLCBlcnIgOj0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIHRydWUpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCb29sKCkgY2FsbDogIiwgZXJyKQogCX0KIAlpZiAhYmwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCB0cnVlLCBnb3QgJWYgIiwgYmwpCiAJfQotCWJsLCBlcnIgPSBjbGllbnQuVGVzdEJvb2woZmFsc2UpCisJYmwsIGVyciA9IGNsaWVudC5UZXN0Qm9vbChkZWZhdWx0Q3R4LCBmYWxzZSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtOTAsNyArOTMsNyBAQAogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCBmYWxzZSwgZ290ICVmICIsIGJsKQogCX0KIAotCWIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoNDIpCisJYiwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCA0MikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJ5dGUoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtOTgsNyArMTAxLDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEJ5dGUoKSByZXN1bHQgZXhwZWN0ZWQgNDIsIGdvdCAlZCAiLCBiKQogCX0KIAotCWkzMiwgZXJyIDo9IGNsaWVudC5UZXN0STMyKDQyNDIpCisJaTMyLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoZGVmYXVsdEN0eCwgNDI0MikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEkzMigpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xMDYsNyArMTA5LDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEkzMigpIHJlc3VsdCBleHBlY3RlZCA0MjQyLCBnb3QgJWQgIiwgaTMyKQogCX0KIAotCWk2NCwgZXJyIDo9IGNsaWVudC5UZXN0STY0KDQyNDI0MikKKwlpNjQsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCA0MjQyNDIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJNjQoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtMTE0LDcgKzExNyw3IEBACiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJNjQoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MjQyLCBnb3QgJWQgIiwgaTY0KQogCX0KIAotCWQsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZSg0Mi40MikKKwlkLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgNDIuNDIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtMTIyLDE0ICsxMjUsMjMgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdERvdWJsZSgpIHJlc3VsdCBleHBlY3RlZCA0Mi40MiwgZ290ICVmICIsIGQpCiAJfQogCi0JLy8gVE9ETzogYWRkIFRlc3RCaW5hcnkoKSBjYWxsCi0JCisJYmlub3V0IDo9IG1ha2UoW11ieXRlLCAyNTYpCisJZm9yIGkgOj0gMDsgaSA8IDI1NjsgaSsrIHsKKwkJYmlub3V0W2ldID0gYnl0ZShpKQorCX0KKwliaW4sIGVyciA6PSBjbGllbnQuVGVzdEJpbmFyeShkZWZhdWx0Q3R4LCBiaW5vdXQpCisJZm9yIGkgOj0gMDsgaSA8IDI1NjsgaSsrIHsKKwkJaWYgYmlub3V0W2ldICE9IGJpbltpXSB7CisJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0QmluYXJ5KCkgcmVzdWx0IGV4cGVjdGVkICVkLCBnb3QgJWQgIiwgYmlub3V0W2ldLCBiaW5baV0pCisJCX0KKwl9CisKIAl4cyA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCiAJeHMuU3RyaW5nVGhpbmcgPSAidGhpbmciCiAJeHMuQnl0ZVRoaW5nID0gNDIKIAl4cy5JMzJUaGluZyA9IDQyNDIKIAl4cy5JNjRUaGluZyA9IDQyNDI0MgotCXhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoeHMpCisJeHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB4cykKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cnVjdCgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xMzksNyArMTUxLDcgQEAKIAogCXgyIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0MigpCiAJeDIuU3RydWN0VGhpbmcgPSB4cwotCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KHgyKQorCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KGRlZmF1bHRDdHgsIHgyKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TmVzdCgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xNDgsNyArMTYwLDcgQEAKIAl9CiAKIAltIDo9IG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0KLQltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAobSkKKwltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAoZGVmYXVsdEN0eCwgbSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcCgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xNTcsNyArMTY5LDcgQEAKIAl9CiAKIAlzbSA6PSBtYXBbc3RyaW5nXXN0cmluZ3siYSI6ICIyIiwgImIiOiAiYmxhaCIsICJzb21lIjogInRoaW5nIn0KLQlzbXJldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nTWFwKHNtKQorCXNtcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAoZGVmYXVsdEN0eCwgc20pCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJpbmdNYXAoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtMTY1LDI1ICsxNzcsMzIgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZ01hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgc20sIHNtcmV0KQogCX0KIAotCXMgOj0gbWFwW2ludDMyXWJvb2x7MTogdHJ1ZSwgMjogdHJ1ZSwgNDI6IHRydWV9Ci0Jc3JldCwgZXJyIDo9IGNsaWVudC5UZXN0U2V0KHMpCisJcyA6PSBbXWludDMyezEsIDIsIDQyfQorCXNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFNldChkZWZhdWx0Q3R4LCBzKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U2V0KCkgY2FsbDogIiwgZXJyKQogCX0KLQlpZiAhcmVmbGVjdC5EZWVwRXF1YWwocywgc3JldCkgewotCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCS8vIFNldHMgY2FuIGJlIGluIGFueSBvcmRlciwgYnV0IEdvIHNsaWNlcyBhcmUgb3JkZXJlZCwgc28gcmVmbGVjdC5EZWVwRXF1YWwgd29uJ3Qgd29yay4KKwlzdGVtcCA6PSBtYXBbaW50MzJdc3RydWN0e317fQorCWZvciBfLCB2YWwgOj0gcmFuZ2UgcyB7CisJCXN0ZW1wW3ZhbF0gPSBzdHJ1Y3R7fXt9CisJfQorCWZvciBfLCB2YWwgOj0gcmFuZ2Ugc3JldCB7CisJCWlmIF8sIG9rIDo9IHN0ZW1wW3ZhbF07ICFvayB7CisJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCQl9CiAJfQogCiAJbCA6PSBbXWludDMyezEsIDIsIDQyfQotCWxyZXQsIGVyciA6PSBjbGllbnQuVGVzdExpc3QobCkKKwlscmV0LCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGwpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RMaXN0KCkgY2FsbDogIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobCwgbHJldCkgewotCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBsLCBscmV0KQorCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TGlzdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgbCwgbHJldCkKIAl9CiAKLQllcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKHRocmlmdHRlc3QuTnVtYmVyel9UV08pCisJZXJldCwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0RW51bSgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xOTEsNyArMjEwLDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEVudW0oKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuTnVtYmVyel9UV08sIGVyZXQpCiAJfQogCi0JdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZih0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCisJdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RUeXBlZGVmKCkgY2FsbDogIiwgZXJyKQogCX0KQEAgLTE5OSw3ICsyMTgsNyBAQAogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0VHlwZWRlZigpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgdGhyaWZ0dGVzdC5Vc2VySWQoNDIpLCB0cmV0KQogCX0KIAotCW1hcG1hcCwgZXJyIDo9IGNsaWVudC5UZXN0TWFwTWFwKDQyKQorCW1hcG1hcCwgZXJyIDo9IGNsaWVudC5UZXN0TWFwTWFwKGRlZmF1bHRDdHgsIDQyKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TWFwTWFwKCkgY2FsbDogIiwgZXJyKQogCX0KQEAgLTIwOCw0NCArMjI3LDQ0IEBACiAJfQogCiAJY3JhenkgOj0gdGhyaWZ0dGVzdC5OZXdJbnNhbml0eSgpCi0JY3JhenkuVXNlck1hcCA9IG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpddGhyaWZ0dGVzdC5Vc2VySWQgewotCQl0aHJpZnR0ZXN0Lk51bWJlcnpfRklWRTogNSwKKwljcmF6eS5Vc2VyTWFwID0gbWFwW3RocmlmdHRlc3QuTnVtYmVyel10aHJpZnR0ZXN0LlVzZXJJZHsKKwkJdGhyaWZ0dGVzdC5OdW1iZXJ6X0ZJVkU6ICA1LAogCQl0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQ6IDgsCiAJfQogCXRydWNrMSA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCiAJdHJ1Y2sxLlN0cmluZ1RoaW5nID0gIkdvb2RieWU0IgotCXRydWNrMS5CeXRlVGhpbmcgPSA0OwotCXRydWNrMS5JMzJUaGluZyA9IDQ7Ci0JdHJ1Y2sxLkk2NFRoaW5nID0gNDsKKwl0cnVjazEuQnl0ZVRoaW5nID0gNAorCXRydWNrMS5JMzJUaGluZyA9IDQKKwl0cnVjazEuSTY0VGhpbmcgPSA0CiAJdHJ1Y2syIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKIAl0cnVjazIuU3RyaW5nVGhpbmcgPSAiSGVsbG8yIgotCXRydWNrMi5CeXRlVGhpbmcgPSAyOwotCXRydWNrMi5JMzJUaGluZyA9IDI7Ci0JdHJ1Y2syLkk2NFRoaW5nID0gMjsKLQljcmF6eS5YdHJ1Y3RzID0gW10qdGhyaWZ0dGVzdC5YdHJ1Y3QgeworCXRydWNrMi5CeXRlVGhpbmcgPSAyCisJdHJ1Y2syLkkzMlRoaW5nID0gMgorCXRydWNrMi5JNjRUaGluZyA9IDIKKwljcmF6eS5YdHJ1Y3RzID0gW10qdGhyaWZ0dGVzdC5YdHJ1Y3R7CiAJCXRydWNrMSwKIAkJdHJ1Y2syLAogCX0KLQlpbnNhbml0eSwgZXJyIDo9IGNsaWVudC5UZXN0SW5zYW5pdHkoY3JhenkpCisJaW5zYW5pdHksIGVyciA6PSBjbGllbnQuVGVzdEluc2FuaXR5KGRlZmF1bHRDdHgsIGNyYXp5KQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0SW5zYW5pdHkoKSBjYWxsOiAiLCBlcnIpCiAJfQogCWlmICFyZWZsZWN0LkRlZXBFcXVhbChjcmF6eSwgaW5zYW5pdHlbMV1bMl0pIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEluc2FuaXR5KCkgZmlyc3QgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLAotCQljcmF6eSwKLQkJaW5zYW5pdHlbMV1bMl0pCisJCQljcmF6eSwKKwkJCWluc2FuaXR5WzFdWzJdKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoY3JhenksIGluc2FuaXR5WzFdWzNdKSB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJbnNhbml0eSgpIHNlY29uZCByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsCi0JCWNyYXp5LAotCQlpbnNhbml0eVsxXVszXSkKKwkJCWNyYXp5LAorCQkJaW5zYW5pdHlbMV1bM10pCiAJfQogCWlmIGxlbihpbnNhbml0eVsyXVs2XS5Vc2VyTWFwKSA+IDAgfHwgbGVuKGluc2FuaXR5WzJdWzZdLlh0cnVjdHMpID4gMCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJbnNhbml0eSgpIG5vbi1lbXB0eSByZXN1bHQgZ290ICUjdiAiLAotCQlpbnNhbml0eVsyXVs2XSkKKwkJCWluc2FuaXR5WzJdWzZdKQogCX0KIAotCXh4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGkoNDIsIDQyNDIsIDQyNDI0MiwgbWFwW2ludDE2XXN0cmluZ3sxOiAiYmxhaCIsIDI6ICJ0aGluZyJ9LCB0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQsIHRocmlmdHRlc3QuVXNlcklkKDI0KSkKKwl4eHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdE11bHRpKGRlZmF1bHRDdHgsIDQyLCA0MjQyLCA0MjQyNDIsIG1hcFtpbnQxNl1zdHJpbmd7MTogImJsYWgiLCAyOiAidGhpbmcifSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hULCB0aHJpZnR0ZXN0LlVzZXJJZCgyNCkpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNdWx0aSgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0yNTMsNyArMjcyLDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4eHMsIHh4c3JldCkKIAl9CiAKLQllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKQorCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIpCiAJaWYgZXJyID09IG5pbCB7CiAJCXQuRmF0YWxmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RFeGNlcHRpb24oKSBjYWxsIikKIAl9CkBAIC0yNjEsMTMgKzI4MCwxMyBAQAogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0RXhjZXB0aW9uKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4Y2VwdCwgZXJyKQogCX0KIAotCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikKKwllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiVEV4Y2VwdGlvbiIpCiAJXywgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQogCWlmIGVyciA9PSBuaWwgfHwgIW9rIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbigpIHJlc3VsdCBleHBlY3RlZCBBcHBsaWNhdGlvbkVycm9yLCBnb3QgJSN2ICIsIGVycikKIAl9CiAKLQlpZ24sIGVyciA6PSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbiIsICJpZ25vcmVtZSIpCisJaWduLCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24iLCAiaWdub3JlbWUiKQogCWlmIGlnbiAhPSBuaWwgfHwgZXJyID09IG5pbCB7CiAJCXQuRmF0YWxmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RNdWx0aUV4Y2VwdGlvbigpIGNhbGwiKQogCX0KQEAgLTI3NSw3ICsyOTQsNyBAQAogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TXVsdGlFeGNlcHRpb24oKSAlI3YgIiwgZXJyKQogCX0KIAotCWlnbiwgZXJyID0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgImlnbm9yZW1lIikKKwlpZ24sIGVyciA9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uMiIsICJpZ25vcmVtZSIpCiAJaWYgaWduICE9IG5pbCB8fCBlcnIgPT0gbmlsIHsKIAkJdC5GYXRhbGYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdE11bHRpRXhjZXB0aW9uKCkgY2FsbCIpCiAJfQpAQCAtMjg1LDEzICszMDQsMTMgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpRXhjZXB0aW9uKCkgJSN2ICIsIGVycikKIAl9CiAKLQllcnIgPSBjbGllbnQuVGVzdE9uZXdheSgyKQorCWVyciA9IGNsaWVudC5UZXN0T25ld2F5KGRlZmF1bHRDdHgsIDIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RPbmV3YXkoKSBjYWxsOiAiLCBlcnIpCiAJfQogCiAJLy9NYWtlIHN1cmUgdGhlIGNvbm5lY3Rpb24gc3RpbGwgYWxpdmUKLQlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAiLCBlcnIpCiAJfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvYmluL3Rlc3RzZXJ2ZXIvbWFpbi5nbyBiL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0c2VydmVyL21haW4uZ28KaW5kZXggMjkxZGZmNS4uY2EyZDk2NyAxMDA2NDQKLS0tIGEvdGVzdC9nby9zcmMvYmluL3Rlc3RzZXJ2ZXIvbWFpbi5nbworKysgYi90ZXN0L2dvL3NyYy9iaW4vdGVzdHNlcnZlci9tYWluLmdvCkBAIC0yMiw3ICsyMiwxMCBAQAogaW1wb3J0ICgKIAkiY29tbW9uIgogCSJmbGFnIgorCSJmbXQiCiAJImxvZyIKKwkibmV0L2h0dHAiCisJInRocmlmdCIKICkKIAogdmFyIGhvc3QgPSBmbGFnLlN0cmluZygiaG9zdCIsICJsb2NhbGhvc3QiLCAiSG9zdCB0byBjb25uZWN0IikKQEAgLTMxLDEzICszNCwzOCBAQAogdmFyIHRyYW5zcG9ydCA9IGZsYWcuU3RyaW5nKCJ0cmFuc3BvcnQiLCAiYnVmZmVyZWQiLCAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCB6bGliIikKIHZhciBwcm90b2NvbCA9IGZsYWcuU3RyaW5nKCJwcm90b2NvbCIsICJiaW5hcnkiLCAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiIpCiB2YXIgc3NsID0gZmxhZy5Cb29sKCJzc2wiLCBmYWxzZSwgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKK3ZhciB6bGliID0gZmxhZy5Cb29sKCJ6bGliIiwgZmFsc2UsICJXcmFwcGVkIFRyYW5zcG9ydCB1c2luZyBabGliIikKIHZhciBjZXJ0UGF0aCA9IGZsYWcuU3RyaW5nKCJjZXJ0UGF0aCIsICJrZXlzIiwgIkRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIFNTTCBjZXJ0aWZpY2F0ZXMiKQogCiBmdW5jIG1haW4oKSB7CiAJZmxhZy5QYXJzZSgpCi0Jc2VydmVyLCBlcnIgOj0gY29tbW9uLlN0YXJ0U2VydmVyKCpob3N0LCAqcG9ydCwgKmRvbWFpbl9zb2NrZXQsICp0cmFuc3BvcnQsICpwcm90b2NvbCwgKnNzbCwgKmNlcnRQYXRoLCBjb21tb24uUHJpbnRpbmdIYW5kbGVyKQorCisJcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgZXJyIDo9IGNvbW1vbi5HZXRTZXJ2ZXJQYXJhbXMoKmhvc3QsICpwb3J0LCAqZG9tYWluX3NvY2tldCwgKnRyYW5zcG9ydCwgKnByb3RvY29sLCAqc3NsLCAqY2VydFBhdGgsIGNvbW1vbi5QcmludGluZ0hhbmRsZXIpCisKIAlpZiBlcnIgIT0gbmlsIHsKLQkJbG9nLkZhdGFsZigiVW5hYmxlIHRvIHN0YXJ0IHNlcnZlcjogIiwgZXJyKQorCQlsb2cuRmF0YWxmKCJVbmFibGUgdG8gcHJvY2VzcyBzZXJ2ZXIgcGFyYW1zOiAiLCBlcnIpCiAJfQotCXNlcnZlci5TZXJ2ZSgpCisKKwlpZiAqdHJhbnNwb3J0ID09ICJodHRwIiB7CisJCWh0dHAuSGFuZGxlRnVuYygiLyIsIHRocmlmdC5OZXdUaHJpZnRIYW5kbGVyRnVuYyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSkKKworCQlpZiAqc3NsIHsKKwkJCWVyciA6PSBodHRwLkxpc3RlbkFuZFNlcnZlVExTKGZtdC5TcHJpbnRmKCI6JWQiLCAqcG9ydCksCisJCQkJKmNlcnRQYXRoKyIvc2VydmVyLnBlbSIsICpjZXJ0UGF0aCsiL3NlcnZlci5rZXkiLCBuaWwpCisKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCWZtdC5QcmludGxuKGVycikKKwkJCQlyZXR1cm4KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWh0dHAuTGlzdGVuQW5kU2VydmUoZm10LlNwcmludGYoIjolZCIsICpwb3J0KSwgbmlsKQorCQl9CisJfSBlbHNlIHsKKwkJc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCQlpZiBlcnIgPSBzZXJ2ZXIuTGlzdGVuKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwkJZ28gc2VydmVyLkFjY2VwdExvb3AoKQorCQlzZXJ2ZXIuU2VydmUoKQorCX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnQuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50LmdvCmluZGV4IGU1NWRjNmQuLjIzNmNlNDMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnQuZ28KKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudC5nbwpAQCAtMjUsNiArMjUsNyBAQAogCSJmbGFnIgogCSJmbXQiCiAJImdlbi90aHJpZnR0ZXN0IgorCSJuZXQvaHR0cCIKIAkidGhyaWZ0IgogKQogCkBAIC00MCw3ICs0MSw3IEBACiAJZG9tYWluX3NvY2tldCBzdHJpbmcsCiAJdHJhbnNwb3J0IHN0cmluZywKIAlwcm90b2NvbCBzdHJpbmcsCi0Jc3NsIGJvb2wpIChjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCwgZXJyIGVycm9yKSB7CisJc3NsIGJvb2wpIChjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCwgdHJhbnMgdGhyaWZ0LlRUcmFuc3BvcnQsIGVyciBlcnJvcikgewogCiAJaG9zdFBvcnQgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKIApAQCAtNTUsMTIgKzU2LDExIEBACiAJY2FzZSAiYmluYXJ5IjoKIAkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKIAlkZWZhdWx0OgotCQlyZXR1cm4gbmlsLCBmbXQuRXJyb3JmKCJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZCAlcyIsIHByb3RvY29sKQorCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgcHJvdG9jb2wgc3BlY2lmaWVkICVzIiwgcHJvdG9jb2wpCiAJfQogCWlmIGRlYnVnQ2xpZW50UHJvdG9jb2wgewogCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VERlYnVnUHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSwgImNsaWVudDoiKQogCX0KLQl2YXIgdHJhbnMgdGhyaWZ0LlRUcmFuc3BvcnQKIAlpZiBzc2wgewogCQl0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RTU0xTb2NrZXQoaG9zdFBvcnQsICZ0bHMuQ29uZmlne0luc2VjdXJlU2tpcFZlcmlmeTogdHJ1ZX0pCiAJfSBlbHNlIHsKQEAgLTcxLDEzICs3MSwxOSBAQAogCQl9CiAJfQogCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4gbmlsLCBlcnIKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKIAl9CiAJc3dpdGNoIHRyYW5zcG9ydCB7CiAJY2FzZSAiaHR0cCI6Ci0JCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBDbGllbnQoZm10LlNwcmludGYoImh0dHA6Ly8lcy9zZXJ2aWNlIiwgaG9zdFBvcnQpKQotCQlpZiBlcnIgIT0gbmlsIHsKLQkJCXJldHVybiBuaWwsIGVycgorCQlpZiBzc2wgeworCQkJdHIgOj0gJmh0dHAuVHJhbnNwb3J0eworCQkJCVRMU0NsaWVudENvbmZpZzogJnRscy5Db25maWd7SW5zZWN1cmVTa2lwVmVyaWZ5OiB0cnVlfSwKKwkJCX0KKwkJCWNsaWVudCA6PSAmaHR0cC5DbGllbnR7VHJhbnNwb3J0OiB0cn0KKwkJCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnMoZm10LlNwcmludGYoImh0dHBzOi8vJXMvIiwgaG9zdFBvcnQpLCB0aHJpZnQuVEh0dHBDbGllbnRPcHRpb25ze0NsaWVudDogY2xpZW50fSkKKwkJCWZtdC5QcmludGxuKGhvc3RQb3J0KQorCQl9IGVsc2UgeworCQkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUSHR0cFBvc3RDbGllbnQoZm10LlNwcmludGYoImh0dHA6Ly8lcy8iLCBob3N0UG9ydCkpCiAJCX0KIAljYXNlICJmcmFtZWQiOgogCQl0cmFucyA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0KHRyYW5zKQpAQCAtODUsMTggKzkxLDE5IEBACiAJCXRyYW5zID0gdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydCh0cmFucywgODE5MikKIAljYXNlICJ6bGliIjoKIAkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUWmxpYlRyYW5zcG9ydCh0cmFucywgemxpYi5CZXN0Q29tcHJlc3Npb24pCi0JCWlmIGVyciAhPSBuaWwgewotCQkJcmV0dXJuIG5pbCwgZXJyCi0JCX0KIAljYXNlICIiOgogCQl0cmFucyA9IHRyYW5zCiAJZGVmYXVsdDoKLQkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCB0cmFuc3BvcnQgc3BlY2lmaWVkICVzIiwgdHJhbnNwb3J0KQorCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgdHJhbnNwb3J0IHNwZWNpZmllZCAlcyIsIHRyYW5zcG9ydCkKIAl9Ci0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKKwl9CiAJaWYgZXJyID0gdHJhbnMuT3BlbigpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgZXJyCisJCXJldHVybiBuaWwsIG5pbCwgZXJyCiAJfQotCWNsaWVudCA9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudEZhY3RvcnkodHJhbnMsIHByb3RvY29sRmFjdG9yeSkKKwlpcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJb3Byb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCWNsaWVudCA9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCkpCiAJcmV0dXJuCiB9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50c2VydmVyX3Rlc3QuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50c2VydmVyX3Rlc3QuZ28KaW5kZXggNWM4OTE1YS4uOWY5M2M0YyAxMDA2NDQKLS0tIGEvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudHNlcnZlcl90ZXN0LmdvCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnRzZXJ2ZXJfdGVzdC5nbwpAQCAtMjAsMTIgKzIwLDE1IEBACiBwYWNrYWdlIGNvbW1vbgogCiBpbXBvcnQgKAotCSJnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayIKKwkiY29udGV4dCIKIAkiZXJyb3JzIgogCSJnZW4vdGhyaWZ0dGVzdCIKIAkicmVmbGVjdCIKKwkic3luYyIKIAkidGVzdGluZyIKIAkidGhyaWZ0IgorCisJImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgogKQogCiB0eXBlIHRlc3RfdW5pdCBzdHJ1Y3QgewpAQCAtMzgsNyArNDEsNyBAQAogfQogCiB2YXIgdW5pdHMgPSBbXXRlc3RfdW5pdHsKLQl7IjEyNy4wLjAuMSIsIDkwOTAsICIiLCAiIiwgImJpbmFyeSIsIGZhbHNlfSwKKwl7IjEyNy4wLjAuMSIsIDkwOTUsICIiLCAiIiwgImJpbmFyeSIsIGZhbHNlfSwKIAl7IjEyNy4wLjAuMSIsIDkwOTEsICIiLCAiIiwgImNvbXBhY3QiLCBmYWxzZX0sCiAJeyIxMjcuMC4wLjEiLCA5MDkyLCAiIiwgIiIsICJiaW5hcnkiLCB0cnVlfSwKIAl7IjEyNy4wLjAuMSIsIDkwOTMsICIiLCAiIiwgImNvbXBhY3QiLCB0cnVlfSwKQEAgLTQ2LDI4ICs0OSwzNyBAQAogCiBmdW5jIFRlc3RBbGxDb25uZWN0aW9uKHQgKnRlc3RpbmcuVCkgewogCWNlcnRQYXRoID0gIi4uLy4uLy4uL2tleXMiCisJd2cgOj0gJnN5bmMuV2FpdEdyb3Vwe30KKwl3Zy5BZGQobGVuKHVuaXRzKSkKIAlmb3IgXywgdW5pdCA6PSByYW5nZSB1bml0cyB7Ci0JCXQuTG9nZigiJSN2IiwgdW5pdCkKLQkJZG9Vbml0KHQsICZ1bml0KQorCQlnbyBmdW5jKHUgdGVzdF91bml0KSB7CisJCQlkZWZlciB3Zy5Eb25lKCkKKwkJCWRvVW5pdCh0LCAmdSkKKwkJfSh1bml0KQogCX0KKwl3Zy5XYWl0KCkKIH0KIAogZnVuYyBkb1VuaXQodCAqdGVzdGluZy5ULCB1bml0ICp0ZXN0X3VuaXQpIHsKIAljdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCiAJZGVmZXIgY3RybC5GaW5pc2goKQogCWhhbmRsZXIgOj0gTmV3TW9ja1RocmlmdFRlc3QoY3RybCkKLQlzZXJ2ZXIsIGVyciA6PSBTdGFydFNlcnZlcih1bml0Lmhvc3QsIHVuaXQucG9ydCwgdW5pdC5kb21haW5fc29ja2V0LCB1bml0LnRyYW5zcG9ydCwgdW5pdC5wcm90b2NvbCwgdW5pdC5zc2wsICIuLi8uLi8uLi9rZXlzIiwgaGFuZGxlcikKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuYWJsZSB0byBzdGFydCBzZXJ2ZXIiLCBlcnIpCi0JCXQuRmFpbE5vdygpCisKKwlwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBlcnIgOj0gR2V0U2VydmVyUGFyYW1zKHVuaXQuaG9zdCwgdW5pdC5wb3J0LCB1bml0LmRvbWFpbl9zb2NrZXQsIHVuaXQudHJhbnNwb3J0LCB1bml0LnByb3RvY29sLCB1bml0LnNzbCwgIi4uLy4uLy4uL2tleXMiLCBoYW5kbGVyKQorCisJc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCWlmIGVyciA9IHNlcnZlci5MaXN0ZW4oKTsgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmFibGUgdG8gc3RhcnQgc2VydmVyOiAldiIsIGVycikKKwkJcmV0dXJuCiAJfQorCWdvIHNlcnZlci5BY2NlcHRMb29wKCkKIAlkZWZlciBzZXJ2ZXIuU3RvcCgpCi0JY2xpZW50LCBlcnIgOj0gU3RhcnRDbGllbnQodW5pdC5ob3N0LCB1bml0LnBvcnQsIHVuaXQuZG9tYWluX3NvY2tldCwgdW5pdC50cmFuc3BvcnQsIHVuaXQucHJvdG9jb2wsIHVuaXQuc3NsKQorCWNsaWVudCwgdHJhbnMsIGVyciA6PSBTdGFydENsaWVudCh1bml0Lmhvc3QsIHVuaXQucG9ydCwgdW5pdC5kb21haW5fc29ja2V0LCB1bml0LnRyYW5zcG9ydCwgdW5pdC5wcm90b2NvbCwgdW5pdC5zc2wpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50IiwgZXJyKQotCQl0LkZhaWxOb3coKQorCQl0LkVycm9yZigiVW5hYmxlIHRvIHN0YXJ0IGNsaWVudDogJXYiLCBlcnIpCisJCXJldHVybgogCX0KLQlkZWZlciBjbGllbnQuVHJhbnNwb3J0LkNsb3NlKCkKKwlkZWZlciB0cmFucy5DbG9zZSgpCiAJY2FsbEV2ZXJ5dGhpbmdXaXRoTW9jayh0LCBjbGllbnQsIGhhbmRsZXIpCiB9CiAKQEAgLTg0LDEwNiArOTYsMTA3IEBACiB9CiAKIHZhciB4Y2VwdCA9ICZ0aHJpZnR0ZXN0LlhjZXB0aW9ue0Vycm9yQ29kZTogMTAwMSwgTWVzc2FnZTogInNvbWUifQordmFyIGRlZmF1bHRDdHggPSBjb250ZXh0LkJhY2tncm91bmQoKQogCiBmdW5jIGNhbGxFdmVyeXRoaW5nV2l0aE1vY2sodCAqdGVzdGluZy5ULCBjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCwgaGFuZGxlciAqTW9ja1RocmlmdFRlc3QpIHsKIAlnb21vY2suSW5PcmRlcigKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Vm9pZCgpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTdHJpbmcoInRoaW5nIikuUmV0dXJuKCJ0aGluZyIsIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEJvb2wodHJ1ZSkuUmV0dXJuKHRydWUsIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEJvb2woZmFsc2UpLlJldHVybihmYWxzZSwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Qnl0ZShpbnQ4KDQyKSkuUmV0dXJuKGludDgoNDIpLCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RJMzIoaW50MzIoNDI0MikpLlJldHVybihpbnQzMig0MjQyKSwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0STY0KGludDY0KDQyNDI0MikpLlJldHVybihpbnQ2NCg0MjQyNDIpLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RWb2lkKGdvbW9jay5BbnkoKSksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cmluZyhnb21vY2suQW55KCksICJ0aGluZyIpLlJldHVybigidGhpbmciLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RCb29sKGdvbW9jay5BbnkoKSwgdHJ1ZSkuUmV0dXJuKHRydWUsIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEJvb2woZ29tb2NrLkFueSgpLCBmYWxzZSkuUmV0dXJuKGZhbHNlLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RCeXRlKGdvbW9jay5BbnkoKSwgaW50OCg0MikpLlJldHVybihpbnQ4KDQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0STMyKGdvbW9jay5BbnkoKSwgaW50MzIoNDI0MikpLlJldHVybihpbnQzMig0MjQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0STY0KGdvbW9jay5BbnkoKSwgaW50NjQoNDI0MjQyKSkuUmV0dXJuKGludDY0KDQyNDI0MiksIG5pbCksCiAJCS8vIFRPRE86IGFkZCBUZXN0QmluYXJ5KCkKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RG91YmxlKGZsb2F0NjQoNDIuNDIpKS5SZXR1cm4oZmxvYXQ2NCg0Mi40MiksIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cnVjdCgmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfSkuUmV0dXJuKCZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9LCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3ROZXN0KCZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSkuUmV0dXJuKCZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TWFwKG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0pLlJldHVybihtYXBbaW50MzJdaW50MzJ7MTogMiwgMzogNCwgNTogNDJ9LCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTdHJpbmdNYXAobWFwW3N0cmluZ11zdHJpbmd7ImEiOiAiMiIsICJiIjogImJsYWgiLCAic29tZSI6ICJ0aGluZyJ9KS5SZXR1cm4obWFwW3N0cmluZ11zdHJpbmd7ImEiOiAiMiIsICJiIjogImJsYWgiLCAic29tZSI6ICJ0aGluZyJ9LCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTZXQobWFwW2ludDMyXWJvb2x7MTogdHJ1ZSwgMjogdHJ1ZSwgNDI6IHRydWV9KS5SZXR1cm4obWFwW2ludDMyXWJvb2x7MTogdHJ1ZSwgMjogdHJ1ZSwgNDI6IHRydWV9LCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RMaXN0KFtdaW50MzJ7MSwgMiwgNDJ9KS5SZXR1cm4oW11pbnQzMnsxLCAyLCA0Mn0sIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEVudW0odGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTykuUmV0dXJuKHRocmlmdHRlc3QuTnVtYmVyel9UV08sIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFR5cGVkZWYodGhyaWZ0dGVzdC5Vc2VySWQoNDIpKS5SZXR1cm4odGhyaWZ0dGVzdC5Vc2VySWQoNDIpLCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNYXBNYXAoaW50MzIoNDIpKS5SZXR1cm4ocm1hcG1hcCwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RG91YmxlKGdvbW9jay5BbnkoKSwgZmxvYXQ2NCg0Mi40MikpLlJldHVybihmbG9hdDY0KDQyLjQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U3RydWN0KGdvbW9jay5BbnkoKSwgJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAidGhpbmciLCBCeXRlVGhpbmc6IDQyLCBJMzJUaGluZzogNDI0MiwgSTY0VGhpbmc6IDQyNDI0Mn0pLlJldHVybigmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TmVzdChnb21vY2suQW55KCksICZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSkuUmV0dXJuKCZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TWFwKGdvbW9jay5BbnkoKSwgbWFwW2ludDMyXWludDMyezE6IDIsIDM6IDQsIDU6IDQyfSkuUmV0dXJuKG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cmluZ01hcChnb21vY2suQW55KCksIG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifSkuUmV0dXJuKG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U2V0KGdvbW9jay5BbnkoKSwgW11pbnQzMnsxLCAyLCA0Mn0pLlJldHVybihbXWludDMyezEsIDIsIDQyfSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TGlzdChnb21vY2suQW55KCksIFtdaW50MzJ7MSwgMiwgNDJ9KS5SZXR1cm4oW11pbnQzMnsxLCAyLCA0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEVudW0oZ29tb2NrLkFueSgpLCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKS5SZXR1cm4odGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTywgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0VHlwZWRlZihnb21vY2suQW55KCksIHRocmlmdHRlc3QuVXNlcklkKDQyKSkuUmV0dXJuKHRocmlmdHRlc3QuVXNlcklkKDQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TWFwTWFwKGdvbW9jay5BbnkoKSwgaW50MzIoNDIpKS5SZXR1cm4ocm1hcG1hcCwgbmlsKSwKIAkJLy8gVE9ETzogbm90IHRlc3RpbmcgaW5zYW5pdHkKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TXVsdGkoaW50OCg0MiksIGludDMyKDQyNDIpLCBpbnQ2NCg0MjQyNDIpLCBtYXBbaW50MTZdc3RyaW5nezE6ICJibGFoIiwgMjogInRoaW5nIn0sIHRocmlmdHRlc3QuTnVtYmVyel9FSUdIVCwgdGhyaWZ0dGVzdC5Vc2VySWQoMjQpKS5SZXR1cm4oeHhzLCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFeGNlcHRpb24oInNvbWUiKS5SZXR1cm4oeGNlcHQpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKS5SZXR1cm4oZXJyb3JzLk5ldygiSnVzdCByYW5kb20gZXhjZXB0aW9uIikpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24iLCAiaWdub3JlbWUiKS5SZXR1cm4obmlsLCAmdGhyaWZ0dGVzdC5YY2VwdGlvbntFcnJvckNvZGU6IDEwMDEsIE1lc3NhZ2U6ICJUaGlzIGlzIGFuIFhjZXB0aW9uIn0pLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgImlnbm9yZW1lIikuUmV0dXJuKG5pbCwgJnRocmlmdHRlc3QuWGNlcHRpb24ye0Vycm9yQ29kZTogMjAwMiwgU3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogIlRoaXMgaXMgYW4gWGNlcHRpb24yIn19KSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0T25ld2F5KGludDMyKDIpKS5SZXR1cm4obmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Vm9pZCgpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aShnb21vY2suQW55KCksIGludDgoNDIpLCBpbnQzMig0MjQyKSwgaW50NjQoNDI0MjQyKSwgbWFwW2ludDE2XXN0cmluZ3sxOiAiYmxhaCIsIDI6ICJ0aGluZyJ9LCB0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQsIHRocmlmdHRlc3QuVXNlcklkKDI0KSkuUmV0dXJuKHh4cywgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RXhjZXB0aW9uKGdvbW9jay5BbnkoKSwgInNvbWUiKS5SZXR1cm4oeGNlcHQpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFeGNlcHRpb24oZ29tb2NrLkFueSgpLCAiVEV4Y2VwdGlvbiIpLlJldHVybihlcnJvcnMuTmV3KCJKdXN0IHJhbmRvbSBleGNlcHRpb24iKSksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE11bHRpRXhjZXB0aW9uKGdvbW9jay5BbnkoKSwgIlhjZXB0aW9uIiwgImlnbm9yZW1lIikuUmV0dXJuKG5pbCwgJnRocmlmdHRlc3QuWGNlcHRpb257RXJyb3JDb2RlOiAxMDAxLCBNZXNzYWdlOiAiVGhpcyBpcyBhbiBYY2VwdGlvbiJ9KSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TXVsdGlFeGNlcHRpb24oZ29tb2NrLkFueSgpLCAiWGNlcHRpb24yIiwgImlnbm9yZW1lIikuUmV0dXJuKG5pbCwgJnRocmlmdHRlc3QuWGNlcHRpb24ye0Vycm9yQ29kZTogMjAwMiwgU3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogIlRoaXMgaXMgYW4gWGNlcHRpb24yIn19KSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0T25ld2F5KGdvbW9jay5BbnkoKSwgaW50MzIoMikpLlJldHVybihuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RWb2lkKGdvbW9jay5BbnkoKSksCiAJKQogCXZhciBlcnIgZXJyb3IKLQlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoKTsgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RWb2lkKCkgY2FsbDogIiwgZXJyKQorCWlmIGVyciA9IGNsaWVudC5UZXN0Vm9pZChkZWZhdWx0Q3R4KTsgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RWb2lkKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCi0JdGhpbmcsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZygidGhpbmciKQorCXRoaW5nLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRoaW5nIikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZygpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZygpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiB0aGluZyAhPSAidGhpbmciIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZygpIHJlc3VsdCwgZXhwZWN0ZWQgJ3RoaW5nJyBnb3QgJyVzJyAiLCB0aGluZykKIAl9CiAKLQlibCwgZXJyIDo9IGNsaWVudC5UZXN0Qm9vbCh0cnVlKQorCWJsLCBlcnIgOj0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIHRydWUpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCb29sKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qm9vbCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAhYmwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCB0cnVlLCBnb3QgJWYgIiwgYmwpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RCb29sKCkgcmVzdWx0IGV4cGVjdGVkIHRydWUsIGdvdCAldiAiLCBibCkKIAl9Ci0JYmwsIGVyciA9IGNsaWVudC5UZXN0Qm9vbChmYWxzZSkKKwlibCwgZXJyID0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIGZhbHNlKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qm9vbCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgYmwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCBmYWxzZSwgZ290ICVmICIsIGJsKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCBmYWxzZSwgZ290ICV2ICIsIGJsKQogCX0KIAotCWIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoNDIpCisJYiwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCA0MikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJ5dGUoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCeXRlKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmIGIgIT0gNDIgewogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qnl0ZSgpIHJlc3VsdCBleHBlY3RlZCA0MiwgZ290ICVkICIsIGIpCiAJfQogCi0JaTMyLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoNDI0MikKKwlpMzIsIGVyciA6PSBjbGllbnQuVGVzdEkzMihkZWZhdWx0Q3R4LCA0MjQyKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STMyKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STMyKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmIGkzMiAhPSA0MjQyIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEkzMigpIHJlc3VsdCBleHBlY3RlZCA0MjQyLCBnb3QgJWQgIiwgaTMyKQogCX0KIAotCWk2NCwgZXJyIDo9IGNsaWVudC5UZXN0STY0KDQyNDI0MikKKwlpNjQsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCA0MjQyNDIpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJNjQoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJNjQoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgaTY0ICE9IDQyNDI0MiB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RJNjQoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MjQyLCBnb3QgJWQgIiwgaTY0KQogCX0KIAotCWQsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZSg0Mi40MikKKwlkLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgNDIuNDIpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgZCAhPSA0Mi40MiB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3REb3VibGUoKSByZXN1bHQgZXhwZWN0ZWQgNDIuNDIsIGdvdCAlZiAiLCBkKQogCX0KIAogCS8vIFRPRE86IGFkZCBUZXN0QmluYXJ5KCkgY2FsbAotCQorCiAJeHMgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQogCXhzLlN0cmluZ1RoaW5nID0gInRoaW5nIgogCXhzLkJ5dGVUaGluZyA9IDQyCiAJeHMuSTMyVGhpbmcgPSA0MjQyCiAJeHMuSTY0VGhpbmcgPSA0MjQyNDIKLQl4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KHhzKQorCXhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgeHMpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJ1Y3QoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJ1Y3QoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgKnhzICE9ICp4c3JldCB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RTdHJ1Y3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHhzLCB4c3JldCkKQEAgLTE5MSw4MyArMjA0LDkwIEBACiAKIAl4MiA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdDIoKQogCXgyLlN0cnVjdFRoaW5nID0geHMKLQl4MnJldCwgZXJyIDo9IGNsaWVudC5UZXN0TmVzdCh4MikKKwl4MnJldCwgZXJyIDo9IGNsaWVudC5UZXN0TmVzdChkZWZhdWx0Q3R4LCB4MikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE5lc3QoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3ROZXN0KCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmICFyZWZsZWN0LkRlZXBFcXVhbCh4MiwgeDJyZXQpIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdE5lc3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHgyLCB4MnJldCkKIAl9CiAKIAltIDo9IG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0KLQltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAobSkKKwltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAoZGVmYXVsdEN0eCwgbSkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobSwgbXJldCkgewogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBtLCBtcmV0KQogCX0KIAogCXNtIDo9IG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifQotCXNtcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAoc20pCisJc21yZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZ01hcChkZWZhdWx0Q3R4LCBzbSkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZ01hcCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZ01hcCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoc20sIHNtcmV0KSB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RTdHJpbmdNYXAoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHNtLCBzbXJldCkKIAl9CiAKLQlzIDo9IG1hcFtpbnQzMl1ib29sezE6IHRydWUsIDI6IHRydWUsIDQyOiB0cnVlfQotCXNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFNldChzKQorCXMgOj0gW11pbnQzMnsxLCAyLCA0Mn0KKwlzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTZXQoZGVmYXVsdEN0eCwgcykKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFNldCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFNldCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KLQlpZiAhcmVmbGVjdC5EZWVwRXF1YWwocywgc3JldCkgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCS8vIFNldHMgY2FuIGJlIGluIGFueSBvcmRlciwgYnV0IEdvIHNsaWNlcyBhcmUgb3JkZXJlZCwgc28gcmVmbGVjdC5EZWVwRXF1YWwgd29uJ3Qgd29yay4KKwlzdGVtcCA6PSBtYXBbaW50MzJdc3RydWN0e317fQorCWZvciBfLCB2YWwgOj0gcmFuZ2UgcyB7CisJCXN0ZW1wW3ZhbF0gPSBzdHJ1Y3R7fXt9CisJfQorCWZvciBfLCB2YWwgOj0gcmFuZ2Ugc3JldCB7CisJCWlmIF8sIG9rIDo9IHN0ZW1wW3ZhbF07ICFvayB7CisJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCQl9CiAJfQogCiAJbCA6PSBbXWludDMyezEsIDIsIDQyfQotCWxyZXQsIGVyciA6PSBjbGllbnQuVGVzdExpc3QobCkKKwlscmV0LCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGwpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RMaXN0KCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TGlzdCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobCwgbHJldCkgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBsLCBscmV0KQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TGlzdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgbCwgbHJldCkKIAl9CiAKLQllcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKHRocmlmdHRlc3QuTnVtYmVyel9UV08pCisJZXJldCwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0RW51bSgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEVudW0oKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgZXJldCAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEVudW0oKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuTnVtYmVyel9UV08sIGVyZXQpCiAJfQogCi0JdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZih0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCisJdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RUeXBlZGVmKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0VHlwZWRlZigpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiB0cmV0ICE9IHRocmlmdHRlc3QuVXNlcklkKDQyKSB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RUeXBlZGVmKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB0aHJpZnR0ZXN0LlVzZXJJZCg0MiksIHRyZXQpCiAJfQogCi0JbWFwbWFwLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoNDIpCisJbWFwbWFwLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoZGVmYXVsdEN0eCwgNDIpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXBtYXAoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXBtYXAoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKG1hcG1hcCwgcm1hcG1hcCkgewogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TWFwbWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBybWFwbWFwLCBtYXBtYXApCiAJfQogCi0JeHhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aSg0MiwgNDI0MiwgNDI0MjQyLCBtYXBbaW50MTZdc3RyaW5nezE6ICJibGFoIiwgMjogInRoaW5nIn0sIHRocmlmdHRlc3QuTnVtYmVyel9FSUdIVCwgdGhyaWZ0dGVzdC5Vc2VySWQoMjQpKQorCXh4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGkoZGVmYXVsdEN0eCwgNDIsIDQyNDIsIDQyNDI0MiwgbWFwW2ludDE2XXN0cmluZ3sxOiAiYmxhaCIsIDI6ICJ0aGluZyJ9LCB0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQsIHRocmlmdHRlc3QuVXNlcklkKDI0KSkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE11bHRpKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TXVsdGkoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHh4cywgeHhzcmV0KSB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aSgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeHhzLCB4eHNyZXQpCiAJfQogCi0JZXJyID0gY2xpZW50LlRlc3RFeGNlcHRpb24oInNvbWUiKQorCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJzb21lIikKIAlpZiBlcnIgPT0gbmlsIHsKIAkJdC5FcnJvcmYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdEV4Y2VwdGlvbigpIGNhbGwiKQogCX0KQEAgLTI3NiwxMyArMjk2LDE2IEBACiAJfQogCiAJLy8gVE9ETzogY29ubmVjdGlvbiBpcyBiZWluZyBjbG9zZWQgb24gdGhpcwotCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikKLQl0ZXgsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKLQlpZiBlcnIgPT0gbmlsIHx8ICFvayB8fCB0ZXguVHlwZUlkKCkgIT0gdGhyaWZ0LklOVEVSTkFMX0VSUk9SIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbigpIHJlc3VsdCBleHBlY3RlZCBBcHBsaWNhdGlvbkVycm9yLCBnb3QgJSN2ICIsIGVycikKKwllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiVEV4Y2VwdGlvbiIpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRXJyb3IoImV4cGVjdGVkIGV4Y2VwdGlvbiBnb3QgbmlsIikKKwl9IGVsc2UgaWYgdGV4LCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pOyAhb2sgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0RXhjZXB0aW9uKCkgcmVzdWx0IGV4cGVjdGVkIEFwcGxpY2F0aW9uRXJyb3IsIGdvdCAlVCAiLCBlcnIpCisJfSBlbHNlIGlmIHRleC5UeXBlSWQoKSAhPSB0aHJpZnQuSU5URVJOQUxfRVJST1IgeworCQl0LkVycm9yZigiZXhwZWN0ZWQgaW50ZXJuYWxfZXJyb3IgZ290ICV2IiwgdGV4LlR5cGVJZCgpKQogCX0KIAotCWlnbiwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgImlnbm9yZW1lIikKKwlpZ24sIGVyciA6PSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIsICJpZ25vcmVtZSIpCiAJaWYgaWduICE9IG5pbCB8fCBlcnIgPT0gbmlsIHsKIAkJdC5FcnJvcmYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdE11bHRpRXhjZXB0aW9uKCkgY2FsbCIpCiAJfQpAQCAtMjkwLDcgKzMxMyw3IEBACiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aUV4Y2VwdGlvbigpICUjdiAiLCBlcnIpCiAJfQogCi0JaWduLCBlcnIgPSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbjIiLCAiaWdub3JlbWUiKQorCWlnbiwgZXJyID0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24yIiwgImlnbm9yZW1lIikKIAlpZiBpZ24gIT0gbmlsIHx8IGVyciA9PSBuaWwgewogCQl0LkVycm9yZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0TXVsdGlFeGNlcHRpb24oKSBjYWxsIikKIAl9CkBAIC0zMDAsMTMgKzMyMywxMyBAQAogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TXVsdGlFeGNlcHRpb24oKSAlI3YgIiwgZXJyKQogCX0KIAotCWVyciA9IGNsaWVudC5UZXN0T25ld2F5KDIpCisJZXJyID0gY2xpZW50LlRlc3RPbmV3YXkoZGVmYXVsdEN0eCwgMikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE9uZXdheSgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE9uZXdheSgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAogCS8vTWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIHN0aWxsIGFsaXZlCi0JaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKCk7IGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Vm9pZCgpIGNhbGw6ICIsIGVycikKKwlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoZGVmYXVsdEN0eCk7IGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Vm9pZCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jb250ZXh0X3Rlc3QuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY29udGV4dF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NGRiYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9jb21tb24vY29udGV4dF90ZXN0LmdvCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb21tb24KKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorCSJuZXQiCisJIm5ldC9odHRwIgorCSJuZXQvdXJsIgorCSJvcyIKKwkic3lzY2FsbCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCSJ0aW1lIgorKQorCit0eXBlIHNsb3dIdHRwSGFuZGxlciBzdHJ1Y3R7fQorCitmdW5jIChzbG93SHR0cEhhbmRsZXIpIFNlcnZlSFRUUCh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgeworCXRpbWUuU2xlZXAoMSAqIHRpbWUuU2Vjb25kKQorfQorCitmdW5jIFRlc3RIdHRwQ29udGV4dFRpbWVvdXQodCAqdGVzdGluZy5UKSB7CisJY2VydFBhdGggPSAiLi4vLi4vLi4va2V5cyIKKworCXVuaXQgOj0gdGVzdF91bml0eyIxMjcuMC4wLjEiLCA5MDk2LCAiIiwgImh0dHAiLCAiYmluYXJ5IiwgZmFsc2V9CisKKwlzZXJ2ZXIgOj0gJmh0dHAuU2VydmVye0FkZHI6IHVuaXQuaG9zdCArIGZtdC5TcHJpbnRmKCI6JWQiLCB1bml0LnBvcnQpLCBIYW5kbGVyOiBzbG93SHR0cEhhbmRsZXJ7fX0KKwlnbyBzZXJ2ZXIuTGlzdGVuQW5kU2VydmUoKQorCisJY2xpZW50LCB0cmFucywgZXJyIDo9IFN0YXJ0Q2xpZW50KHVuaXQuaG9zdCwgdW5pdC5wb3J0LCB1bml0LmRvbWFpbl9zb2NrZXQsIHVuaXQudHJhbnNwb3J0LCB1bml0LnByb3RvY29sLCB1bml0LnNzbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuYWJsZSB0byBzdGFydCBjbGllbnQ6ICV2IiwgZXJyKQorCQlyZXR1cm4KKwl9CisJZGVmZXIgdHJhbnMuQ2xvc2UoKQorCisJdW53cmFwRXJyIDo9IGZ1bmMoZXJyIGVycm9yKSBlcnJvciB7CisJCWZvciB7CisJCQlzd2l0Y2ggZXJyLih0eXBlKSB7CisJCQljYXNlIHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorCQkJCWVyciA9IGVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pLkVycigpCisJCQljYXNlICp1cmwuRXJyb3I6CisJCQkJZXJyID0gZXJyLigqdXJsLkVycm9yKS5FcnIKKwkJCWNhc2UgKm5ldC5PcEVycm9yOgorCQkJCWVyciA9IGVyci4oKm5ldC5PcEVycm9yKS5FcnIKKwkJCWNhc2UgKm9zLlN5c2NhbGxFcnJvcjoKKwkJCQllcnIgPSBlcnIuKCpvcy5TeXNjYWxsRXJyb3IpLkVycgorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwl9CisKKwlzZXJ2ZXJTdGFydHVwRGVhZGxpbmUgOj0gdGltZS5Ob3coKS5BZGQoNSAqIHRpbWUuU2Vjb25kKQorCWZvciB7CisJCWN0eCwgXyA6PSBjb250ZXh0LldpdGhUaW1lb3V0KGNvbnRleHQuQmFja2dyb3VuZCgpLCA1MCp0aW1lLk1pbGxpc2Vjb25kKQorCQllcnIgPSBjbGllbnQuVGVzdFZvaWQoY3R4KQorCQllcnIgPSB1bndyYXBFcnIoZXJyKQorCQlpZiBlcnIgIT0gc3lzY2FsbC5FQ09OTlJFRlVTRUQgfHwgdGltZS5Ob3coKS5BZnRlcihzZXJ2ZXJTdGFydHVwRGVhZGxpbmUpIHsKKwkJCWJyZWFrCisJCX0KKwkJdGltZS5TbGVlcCh0aW1lLk1pbGxpc2Vjb25kKQorCX0KKworCWlmIGVyciA9PSBuaWwgeworCQl0LkVycm9yZigiUmVxdWVzdCBjb21wbGV0ZWQgKHNob3VsZCBoYXZlIHRpbWVkIG91dCkiKQorCQlyZXR1cm4KKwl9CisKKwkvLyBXZSd2ZSBnb3QgdG8gc3dpdGNoIG9uIGBlcnIuRXJyb3IoKWAgaGVyZSBzaW5jZSBnbzEuNyBkb2Vzbid0IHByb3Blcmx5IHJldHVybgorCS8vIGBjb250ZXh0LkRlYWRsaW5lRXhjZWVkZWRgIGVycm9yIGFuZCBgaHR0cC5lcnJSZXF1ZXN0Q2FuY2VsZWRgIGlzIG5vdCBleHBvcnRlZC4KKwkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nby9pc3N1ZXMvMTc3MTEKKwlzd2l0Y2ggZXJyLkVycm9yKCkgeworCWNhc2UgY29udGV4dC5EZWFkbGluZUV4Y2VlZGVkLkVycm9yKCksICJuZXQvaHR0cDogcmVxdWVzdCBjYW5jZWxlZCI6CisJCS8vIEV4cGVjdGVkIGVycm9yCisJZGVmYXVsdDoKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3I6ICVzIiwgZXJyKQorCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9tb2NrX2hhbmRsZXIuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vbW9ja19oYW5kbGVyLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDk1ZmM2Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9tb2NrX2hhbmRsZXIuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBNb2NrR2VuLiBETyBOT1QgRURJVCEKLS8vIFNvdXJjZTogZ2VuL3RocmlmdHRlc3QgKGludGVyZmFjZXM6IFRocmlmdFRlc3QpCi0KLXBhY2thZ2UgY29tbW9uCi0KLWltcG9ydCAoCi0JZ29tb2NrICJnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayIKLQl0aHJpZnR0ZXN0ICJnZW4vdGhyaWZ0dGVzdCIKLSkKLQotLy8gTW9jayBvZiBUaHJpZnRUZXN0IGludGVyZmFjZQotdHlwZSBNb2NrVGhyaWZ0VGVzdCBzdHJ1Y3QgewotCWN0cmwgICAgICpnb21vY2suQ29udHJvbGxlcgotCXJlY29yZGVyICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcgotfQotCi0vLyBSZWNvcmRlciBmb3IgTW9ja1RocmlmdFRlc3QgKG5vdCBleHBvcnRlZCkKLXR5cGUgX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIgc3RydWN0IHsKLQltb2NrICpNb2NrVGhyaWZ0VGVzdAotfQotCi1mdW5jIE5ld01vY2tUaHJpZnRUZXN0KGN0cmwgKmdvbW9jay5Db250cm9sbGVyKSAqTW9ja1RocmlmdFRlc3QgewotCW1vY2sgOj0gJk1vY2tUaHJpZnRUZXN0e2N0cmw6IGN0cmx9Ci0JbW9jay5yZWNvcmRlciA9ICZfTW9ja1RocmlmdFRlc3RSZWNvcmRlcnttb2NrfQotCXJldHVybiBtb2NrCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgRVhQRUNUKCkgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyIHsKLQlyZXR1cm4gX20ucmVjb3JkZXIKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0Qm9vbChfcGFyYW0wIGJvb2wpIChib29sLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0Qm9vbCIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKGJvb2wpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RCb29sKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RCb29sIiwgYXJnMCkKLX0KLQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RCeXRlKF9wYXJhbTAgaW50OCkgKGludDgsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RCeXRlIiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4oaW50OCkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEJ5dGUoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdEJ5dGUiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3REb3VibGUoX3BhcmFtMCBmbG9hdDY0KSAoZmxvYXQ2NCwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdERvdWJsZSIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKGZsb2F0NjQpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3REb3VibGUoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdERvdWJsZSIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdEJpbmFyeShfcGFyYW0wIFtdYnl0ZSkgKFtdYnl0ZSwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdEJpbmFyeSIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKFtdYnl0ZSkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEJpbmFyeShhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0QmluYXJ5IiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0RW51bShfcGFyYW0wIHRocmlmdHRlc3QuTnVtYmVyeikgKHRocmlmdHRlc3QuTnVtYmVyeiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdEVudW0iLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLih0aHJpZnR0ZXN0Lk51bWJlcnopCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RFbnVtKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RFbnVtIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0RXhjZXB0aW9uKF9wYXJhbTAgc3RyaW5nKSBlcnJvciB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RFeGNlcHRpb24iLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKLQlyZXR1cm4gcmV0MAotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0RXhjZXB0aW9uKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RFeGNlcHRpb24iLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RJMzIoX3BhcmFtMCBpbnQzMikgKGludDMyLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0STMyIiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4oaW50MzIpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RJMzIoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdEkzMiIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdEk2NChfcGFyYW0wIGludDY0KSAoaW50NjQsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RJNjQiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihpbnQ2NCkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEk2NChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0STY0IiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0SW5zYW5pdHkoX3BhcmFtMCAqdGhyaWZ0dGVzdC5JbnNhbml0eSkgKG1hcFt0aHJpZnR0ZXN0LlVzZXJJZF1tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XSp0aHJpZnR0ZXN0Lkluc2FuaXR5LCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0SW5zYW5pdHkiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEluc2FuaXR5KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RJbnNhbml0eSIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdExpc3QoX3BhcmFtMCBbXWludDMyKSAoW11pbnQzMiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdExpc3QiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihbXWludDMyKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0TGlzdChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TGlzdCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdE1hcChfcGFyYW0wIG1hcFtpbnQzMl1pbnQzMikgKG1hcFtpbnQzMl1pbnQzMiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdE1hcCIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKG1hcFtpbnQzMl1pbnQzMikKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdE1hcChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TWFwIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0TWFwTWFwKF9wYXJhbTAgaW50MzIpIChtYXBbaW50MzJdbWFwW2ludDMyXWludDMyLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0TWFwTWFwIiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4obWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMikKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdE1hcE1hcChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TWFwTWFwIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0TXVsdGkoX3BhcmFtMCBpbnQ4LCBfcGFyYW0xIGludDMyLCBfcGFyYW0yIGludDY0LCBfcGFyYW0zIG1hcFtpbnQxNl1zdHJpbmcsIF9wYXJhbTQgdGhyaWZ0dGVzdC5OdW1iZXJ6LCBfcGFyYW01IHRocmlmdHRlc3QuVXNlcklkKSAoKnRocmlmdHRlc3QuWHRydWN0LCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0TXVsdGkiLCBfcGFyYW0wLCBfcGFyYW0xLCBfcGFyYW0yLCBfcGFyYW0zLCBfcGFyYW00LCBfcGFyYW01KQotCXJldDAsIF8gOj0gcmV0WzBdLigqdGhyaWZ0dGVzdC5YdHJ1Y3QpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1IGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TXVsdGkiLCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RNdWx0aUV4Y2VwdGlvbihfcGFyYW0wIHN0cmluZywgX3BhcmFtMSBzdHJpbmcpICgqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RNdWx0aUV4Y2VwdGlvbiIsIF9wYXJhbTAsIF9wYXJhbTEpCi0JcmV0MCwgXyA6PSByZXRbMF0uKCp0aHJpZnR0ZXN0Llh0cnVjdCkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdE11bHRpRXhjZXB0aW9uKGFyZzAsIGFyZzEgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RNdWx0aUV4Y2VwdGlvbiIsIGFyZzAsIGFyZzEpCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdE5lc3QoX3BhcmFtMCAqdGhyaWZ0dGVzdC5YdHJ1Y3QyKSAoKnRocmlmdHRlc3QuWHRydWN0MiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdE5lc3QiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLigqdGhyaWZ0dGVzdC5YdHJ1Y3QyKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0TmVzdChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TmVzdCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdE9uZXdheShfcGFyYW0wIGludDMyKSBlcnJvciB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RPbmV3YXkiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKLQlyZXR1cm4gcmV0MAotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0T25ld2F5KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RPbmV3YXkiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RTZXQoX3BhcmFtMCBtYXBbaW50MzJdYm9vbCkgKG1hcFtpbnQzMl1ib29sLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0U2V0IiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4obWFwW2ludDMyXWJvb2wpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RTZXQoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdFNldCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdFN0cmluZyhfcGFyYW0wIHN0cmluZykgKHN0cmluZywgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdFN0cmluZyIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKHN0cmluZykKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdFN0cmluZyhhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0U3RyaW5nIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0U3RyaW5nTWFwKF9wYXJhbTAgbWFwW3N0cmluZ11zdHJpbmcpIChtYXBbc3RyaW5nXXN0cmluZywgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdFN0cmluZ01hcCIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKG1hcFtzdHJpbmddc3RyaW5nKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0U3RyaW5nTWFwKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RTdHJpbmdNYXAiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RTdHJ1Y3QoX3BhcmFtMCAqdGhyaWZ0dGVzdC5YdHJ1Y3QpICgqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RTdHJ1Y3QiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLigqdGhyaWZ0dGVzdC5YdHJ1Y3QpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RTdHJ1Y3QoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdFN0cnVjdCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdFR5cGVkZWYoX3BhcmFtMCB0aHJpZnR0ZXN0LlVzZXJJZCkgKHRocmlmdHRlc3QuVXNlcklkLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0VHlwZWRlZiIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKHRocmlmdHRlc3QuVXNlcklkKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0VHlwZWRlZihhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0VHlwZWRlZiIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdFZvaWQoKSBlcnJvciB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RWb2lkIikKLQlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdFZvaWQoKSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0Vm9pZCIpCi19CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vcHJpbnRpbmdfaGFuZGxlci5nbyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9wcmludGluZ19oYW5kbGVyLmdvCmluZGV4IGJjMzA4YjYuLjJiMjJkMGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9wcmludGluZ19oYW5kbGVyLmdvCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9wcmludGluZ19oYW5kbGVyLmdvCkBAIC0yMCw5ICsyMCwxMCBAQAogcGFja2FnZSBjb21tb24KIAogaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvaGV4IgogCSJlcnJvcnMiCiAJImZtdCIKLQkiZW5jb2RpbmcvaGV4IgogCS4gImdlbi90aHJpZnR0ZXN0IgogCSJ0aW1lIgogKQpAQCAtMzIsNyArMzMsNyBAQAogdHlwZSBwcmludGluZ0hhbmRsZXIgc3RydWN0e30KIAogLy8gUHJpbnRzICJ0ZXN0Vm9pZCgpIiBhbmQgcmV0dXJucyBub3RoaW5nLgotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0Vm9pZCgpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFZvaWQoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgewogCWZtdC5QcmludGxuKCJ0ZXN0Vm9pZCgpIikKIAlyZXR1cm4gbmlsCiB9CkBAIC00MywxOSArNDQsMTkgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cmluZyh0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTdHJpbmcoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RTdHJpbmcoXCIlc1wiKVxuIiwgdGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotLy8gUHJpbnRzICd0ZXN0Qm9vbCgiJWQiKScgd2l0aCB0aGluZyBhcyAndHJ1ZScgb3IgJ2ZhbHNlJworLy8gUHJpbnRzICd0ZXN0Qm9vbCgiJXQiKScgd2l0aCB0aGluZyBhcyAndHJ1ZScgb3IgJ2ZhbHNlJwogLy8gQHBhcmFtIGJvb2wgdGhpbmcgLSB0aGUgYm9vbCB0byBwcmludAogLy8gQHJldHVybiBib29sIC0gcmV0dXJucyB0aGUgYm9vbCAndGhpbmcnCiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RCb29sKHRoaW5nIGJvb2wpIChyIGJvb2wsIGVyciBlcnJvcikgewotCWZtdC5QcmludGYoInRlc3RCb29sKCVkKVxuIiwgdGhpbmcpCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RCb29sKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGJvb2wpIChyIGJvb2wsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RCb29sKCV0KVxuIiwgdGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIApAQCAtNjUsNyArNjYsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0Qnl0ZSh0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEJ5dGUoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50OCkgKHIgaW50OCwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdEJ5dGUoJWQpXG4iLCB0aGluZykKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQpAQCAtNzYsNyArNzcsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0STMyKHRoaW5nIGludDMyKSAociBpbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RJMzIoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0STMyKCVkKVxuIiwgdGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KQEAgLTg3LDcgKzg4LDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEk2NCh0aGluZyBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0STY0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdEk2NCglZClcbiIsIHRoaW5nKQogCXJldHVybiB0aGluZywgbmlsCiB9CkBAIC05OCw3ICs5OSw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3REb3VibGUodGhpbmcgZmxvYXQ2NCkgKHIgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3REb3VibGUoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgZmxvYXQ2NCkgKHIgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdERvdWJsZSglZilcbiIsIHRoaW5nKQogCXJldHVybiB0aGluZywgbmlsCiB9CkBAIC0xMDksNyArMTEwLDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEJpbmFyeSh0aGluZyBbXWJ5dGUpIChyIFtdYnl0ZSwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RCaW5hcnkoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11ieXRlKSAociBbXWJ5dGUsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RCaW5hcnkoJXMpXG4iLCBoZXguRW5jb2RlVG9TdHJpbmcodGhpbmcpKQogCXJldHVybiB0aGluZywgbmlsCiB9CkBAIC0xMjAsNyArMTIxLDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cnVjdCh0aGluZyAqWHRydWN0KSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cnVjdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyAqWHRydWN0KSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJWR9KVxuIiwgdGhpbmcuU3RyaW5nVGhpbmcsIHRoaW5nLkJ5dGVUaGluZywgdGhpbmcuSTMyVGhpbmcsIHRoaW5nLkk2NFRoaW5nKQogCXJldHVybiB0aGluZywgZXJyCiB9CkBAIC0xMzEsNyArMTMyLDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE5lc3QobmVzdCAqWHRydWN0MikgKHIgKlh0cnVjdDIsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TmVzdChjdHggY29udGV4dC5Db250ZXh0LCBuZXN0ICpYdHJ1Y3QyKSAociAqWHRydWN0MiwgZXJyIGVycm9yKSB7CiAJdGhpbmcgOj0gbmVzdC5TdHJ1Y3RUaGluZwogCWZtdC5QcmludGYoInRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlZH0sICVkfSlcbiIsIG5lc3QuQnl0ZVRoaW5nLCB0aGluZy5TdHJpbmdUaGluZywgdGhpbmcuQnl0ZVRoaW5nLCB0aGluZy5JMzJUaGluZywgdGhpbmcuSTY0VGhpbmcsIG5lc3QuSTMyVGhpbmcpCiAJcmV0dXJuIG5lc3QsIG5pbApAQCAtMTQ0LDcgKzE0NSw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNYXAodGhpbmcgbWFwW2ludDMyXWludDMyKSAociBtYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIG1hcFtpbnQzMl1pbnQzMikgKHIgbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0TWFwKHsiKQogCWZpcnN0IDo9IHRydWUKIAlmb3IgaywgdiA6PSByYW5nZSB0aGluZyB7CkBAIC0xNjYsNyArMTY3LDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cmluZ01hcCh0aGluZyBtYXBbc3RyaW5nXXN0cmluZykgKHIgbWFwW3N0cmluZ11zdHJpbmcsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0U3RyaW5nTWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIG1hcFtzdHJpbmddc3RyaW5nKSAociBtYXBbc3RyaW5nXXN0cmluZywgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdFN0cmluZ01hcCh7IikKIAlmaXJzdCA6PSB0cnVlCiAJZm9yIGssIHYgOj0gcmFuZ2UgdGhpbmcgewpAQCAtMTg4LDcgKzE4OSw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTZXQodGhpbmcgbWFwW2ludDMyXWJvb2wpIChyIG1hcFtpbnQzMl1ib29sLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFNldChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0U2V0KHsiKQogCWZpcnN0IDo9IHRydWUKIAlmb3IgaywgXyA6PSByYW5nZSB0aGluZyB7CkBAIC0yMTAsNyArMjExLDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdExpc3QodGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RMaXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RMaXN0KHsiKQogCWZvciBpLCB2IDo9IHJhbmdlIHRoaW5nIHsKIAkJaWYgaSAhPSAwIHsKQEAgLTIyOCw3ICsyMjksNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0RW51bSh0aGluZyBOdW1iZXJ6KSAociBOdW1iZXJ6LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEVudW0oY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgTnVtYmVyeikgKHIgTnVtYmVyeiwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdEVudW0oJWQpXG4iLCB0aGluZykKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQpAQCAtMjM5LDcgKzI0MCw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RUeXBlZGVmKHRoaW5nIFVzZXJJZCkgKHIgVXNlcklkLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFR5cGVkZWYoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgVXNlcklkKSAociBVc2VySWQsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RUeXBlZGVmKCVkKVxuIiwgdGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KQEAgLTI1MSw3ICsyNTIsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBIZWxsbwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TWFwTWFwKGhlbGxvIGludDMyKSAociBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE1hcE1hcChjdHggY29udGV4dC5Db250ZXh0LCBoZWxsbyBpbnQzMikgKHIgbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdE1hcE1hcCglZClcbiIsIGhlbGxvKQogCiAJciA9IG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzJ7CkBAIC0yNzMsMTQgKzI3NCwxNCBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBBcmd1bWVudAotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0SW5zYW5pdHkoYXJndW1lbnQgKkluc2FuaXR5KSAociBtYXBbVXNlcklkXW1hcFtOdW1iZXJ6XSpJbnNhbml0eSwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RJbnNhbml0eShjdHggY29udGV4dC5Db250ZXh0LCBhcmd1bWVudCAqSW5zYW5pdHkpIChyIG1hcFtVc2VySWRdbWFwW051bWJlcnpdKkluc2FuaXR5LCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0SW5zYW5pdHkoKVxuIikKIAlyID0gbWFrZShtYXBbVXNlcklkXW1hcFtOdW1iZXJ6XSpJbnNhbml0eSkKLQlyWzFdID0gbWFwW051bWJlcnpdKkluc2FuaXR5IHsKKwlyWzFdID0gbWFwW051bWJlcnpdKkluc2FuaXR5ewogCQkyOiBhcmd1bWVudCwKIAkJMzogYXJndW1lbnQsCiAJfQotCXJbMl0gPSBtYXBbTnVtYmVyel0qSW5zYW5pdHkgeworCXJbMl0gPSBtYXBbTnVtYmVyel0qSW5zYW5pdHl7CiAJCTY6IE5ld0luc2FuaXR5KCksCiAJfQogCXJldHVybgpAQCAtMzAzLDcgKzMwNCw3IEBACiAvLyAgLSBBcmczCiAvLyAgLSBBcmc0CiAvLyAgLSBBcmc1Ci1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNdWx0aShhcmcwIGludDgsIGFyZzEgaW50MzIsIGFyZzIgaW50NjQsIGFyZzMgbWFwW2ludDE2XXN0cmluZywgYXJnNCBOdW1iZXJ6LCBhcmc1IFVzZXJJZCkgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNdWx0aShjdHggY29udGV4dC5Db250ZXh0LCBhcmcwIGludDgsIGFyZzEgaW50MzIsIGFyZzIgaW50NjQsIGFyZzMgbWFwW2ludDE2XXN0cmluZywgYXJnNCBOdW1iZXJ6LCBhcmc1IFVzZXJJZCkgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdE11bHRpKClcbiIpCiAJciA9IE5ld1h0cnVjdCgpCiAKQEAgLTMyMiw3ICszMjMsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBBcmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEV4Y2VwdGlvbihhcmcgc3RyaW5nKSAoZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RFeGNlcHRpb24oY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIHN0cmluZykgKGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RFeGNlcHRpb24oJXMpXG4iLCBhcmcpCiAJc3dpdGNoIGFyZyB7CiAJY2FzZSAiWGNlcHRpb24iOgpAQCAtMzQ2LDcgKzM0Nyw3IEBACiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gQXJnMAogLy8gIC0gQXJnMQotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TXVsdGlFeGNlcHRpb24oYXJnMCBzdHJpbmcsIGFyZzEgc3RyaW5nKSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE11bHRpRXhjZXB0aW9uKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZzAgc3RyaW5nLCBhcmcxIHN0cmluZykgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsIGFyZzAsIGFyZzEpCiAJc3dpdGNoIGFyZzAgewogCkBAIC0zNzUsNyArMzc2LDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gU2Vjb25kc1RvU2xlZXAKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCBpbnQzMikgKGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0T25ld2F5KGN0eCBjb250ZXh0LkNvbnRleHQsIHNlY29uZHNUb1NsZWVwIGludDMyKSAoZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdE9uZXdheSglZCk6IFNsZWVwaW5nLi4uXG4iLCBzZWNvbmRzVG9TbGVlcCkKIAl0aW1lLlNsZWVwKHRpbWUuU2Vjb25kICogdGltZS5EdXJhdGlvbihzZWNvbmRzVG9TbGVlcCkpCiAJZm10LlByaW50ZigidGVzdE9uZXdheSglZCk6IGRvbmUgc2xlZXBpbmchXG4iLCBzZWNvbmRzVG9TbGVlcCkKZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9zZXJ2ZXIuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vc2VydmVyLmdvCmluZGV4IGRjMzgwYjIuLjVhYzQ0MDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9zZXJ2ZXIuZ28KKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL3NlcnZlci5nbwpAQCAtMzcsNyArMzcsNyBAQAogCWZsYWcuQm9vbFZhcigmZGVidWdTZXJ2ZXJQcm90b2NvbCwgImRlYnVnX3NlcnZlcl9wcm90b2NvbCIsIGZhbHNlLCAidHVybiBzZXJ2ZXIgcHJvdG9jb2wgdHJhY2Ugb24iKQogfQogCi1mdW5jIFN0YXJ0U2VydmVyKAorZnVuYyBHZXRTZXJ2ZXJQYXJhbXMoCiAJaG9zdCBzdHJpbmcsCiAJcG9ydCBpbnQ2NCwKIAlkb21haW5fc29ja2V0IHN0cmluZywKQEAgLTQ1LDggKzQ1LDkgQEAKIAlwcm90b2NvbCBzdHJpbmcsCiAJc3NsIGJvb2wsCiAJY2VydFBhdGggc3RyaW5nLAotCWhhbmRsZXIgdGhyaWZ0dGVzdC5UaHJpZnRUZXN0KSAoc3J2ICp0aHJpZnQuVFNpbXBsZVNlcnZlciwgZXJyIGVycm9yKSB7CisJaGFuZGxlciB0aHJpZnR0ZXN0LlRocmlmdFRlc3QpICh0aHJpZnQuVFByb2Nlc3NvciwgdGhyaWZ0LlRTZXJ2ZXJUcmFuc3BvcnQsIHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeSwgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnksIGVycm9yKSB7CiAKKwl2YXIgZXJyIGVycm9yCiAJaG9zdFBvcnQgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKIAogCXZhciBwcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkKQEAgLTYwLDcgKzYxLDcgQEAKIAljYXNlICJiaW5hcnkiOgogCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQogCWRlZmF1bHQ6Ci0JCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgcHJvdG9jb2wgc3BlY2lmaWVkICVzIiwgcHJvdG9jb2wpCisJCXJldHVybiBuaWwsIG5pbCwgbmlsLCBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgcHJvdG9jb2wgc3BlY2lmaWVkICVzIiwgcHJvdG9jb2wpCiAJfQogCWlmIGRlYnVnU2VydmVyUHJvdG9jb2wgewogCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VERlYnVnUHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSwgInNlcnZlcjoiKQpAQCAtNzAsNyArNzEsNyBAQAogCWlmIHNzbCB7CiAJCWNmZyA6PSBuZXcodGxzLkNvbmZpZykKIAkJaWYgY2VydCwgZXJyIDo9IHRscy5Mb2FkWDUwOUtleVBhaXIoY2VydFBhdGgrIi9zZXJ2ZXIuY3J0IiwgY2VydFBhdGgrIi9zZXJ2ZXIua2V5Iik7IGVyciAhPSBuaWwgewotCQkJcmV0dXJuIG5pbCwgZXJyCisJCQlyZXR1cm4gbmlsLCBuaWwsIG5pbCwgbmlsLCBlcnIKIAkJfSBlbHNlIHsKIAkJCWNmZy5DZXJ0aWZpY2F0ZXMgPSBhcHBlbmQoY2ZnLkNlcnRpZmljYXRlcywgY2VydCkKIAkJfQpAQCAtODMsMTggKzg0LDE1IEBACiAJCX0KIAl9CiAJaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBuaWwsIGVycgorCQlyZXR1cm4gbmlsLCBuaWwsIG5pbCwgbmlsLCBlcnIKIAl9CiAKIAl2YXIgdHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnkKIAogCXN3aXRjaCB0cmFuc3BvcnQgewogCWNhc2UgImh0dHAiOgotCQlyZXR1cm4gbmlsLCBmbXQuRXJyb3JmKCJIdHRwIHNlcnZlciB0cmFuc3BvcnQgaXMgbm90IHN1cHBvcnRlZCIpCi0JCS8vIHRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBDbGllbnQoZm10LlNwcmludGYoImh0dHA6Ly8lcy9zZXJ2aWNlIiwgaG9zdFBvcnQpKQotCQkvLyBpZiBlcnIgIT0gbmlsIHsKLQkJLy8gCXJldHVybiBuaWwsIGVycgotCQkvLyB9CisJCS8vIHRoZXJlIGlzIG5vIHN1Y2ggZmFjdG9yeSwgYW5kIHdlIGRvbid0IG5lZWQgYW55CisJCXRyYW5zcG9ydEZhY3RvcnkgPSBuaWwKIAljYXNlICJmcmFtZWQiOgogCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKIAkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQpAQCAtMTA1LDEzICsxMDMsOSBAQAogCWNhc2UgIiI6CiAJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQogCWRlZmF1bHQ6Ci0JCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgdHJhbnNwb3J0IHNwZWNpZmllZCAlcyIsIHRyYW5zcG9ydCkKKwkJcmV0dXJuIG5pbCwgbmlsLCBuaWwsIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCB0cmFuc3BvcnQgc3BlY2lmaWVkICVzIiwgdHJhbnNwb3J0KQogCX0KIAlwcm9jZXNzb3IgOj0gdGhyaWZ0dGVzdC5OZXdUaHJpZnRUZXN0UHJvY2Vzc29yKGhhbmRsZXIpCi0Jc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQotCWlmIGVyciA9IHNlcnZlci5MaXN0ZW4oKTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybgotCX0KLQlnbyBzZXJ2ZXIuQWNjZXB0TG9vcCgpCi0JcmV0dXJuIHNlcnZlciwgbmlsCisKKwlyZXR1cm4gcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgbmlsCiB9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vc2ltcGxlX2hhbmRsZXIuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vc2ltcGxlX2hhbmRsZXIuZ28KaW5kZXggOTQ0ZjExYy4uMGM5NDYzZCAxMDA2NDQKLS0tIGEvdGVzdC9nby9zcmMvY29tbW9uL3NpbXBsZV9oYW5kbGVyLmdvCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9zaW1wbGVfaGFuZGxlci5nbwpAQCAtNzcsNyArNzcsNyBAQAogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RTZXQodGhpbmcgbWFwW2ludDMyXWJvb2wpIChyIG1hcFtpbnQzMl1ib29sLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RTZXQodGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL01ha2VmaWxlLmFtIGIvdGVzdC9oYXhlL01ha2VmaWxlLmFtCmluZGV4IDM3Y2NmYzMuLjZjMDQ4M2UgMTAwNjQ0Ci0tLSBhL3Rlc3QvaGF4ZS9NYWtlZmlsZS5hbQorKysgYi90ZXN0L2hheGUvTWFrZWZpbGUuYW0KQEAgLTE3LDE2ICsxNywxNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKIFRIUklGVENNRCA9ICQoVEhSSUZUKSAtLWdlbiBoYXhlIC1yCiBUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiAKIEJJTl9DUFAgPSBiaW4vTWFpbi1kZWJ1ZworQklOX1BIUCA9IGJpbi9waHAvTWFpbi1kZWJ1Zy5waHAKK0JJTl9QSFBfV0VCID0gYmluL3BocC13ZWItc2VydmVyL01haW4tZGVidWcucGhwCiAKIGdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHg6ICQoVEhSSUZUVEVTVCkKIAkkKFRIUklGVENNRCkgJChUSFJJRlRURVNUKQogCi1hbGwtbG9jYWw6ICQoQklOX0NQUCkKK2FsbC1sb2NhbDogJChCSU5fQ1BQKSAkKEJJTl9QSFApICQoQklOX1BIUF9XRUIpCiAKICQoQklOX0NQUCk6IFwKIAkJc3JjLyouaHggXApAQCAtMzQsNiArMzUsMTkgQEAKIAkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeAogCSQoSEFYRSkgLS1jd2QgLiAgY3BwLmh4bWwKIAorJChCSU5fUEhQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLmh4bWwKKworJChCSU5fUEhQX1dFQik6IFwKKwkJc3JjLyouaHggXAorCQkuLi8uLi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIHBocC13ZWItc2VydmVyLmh4bWwKKworCiAKICNUT0RPOiBvdGhlciBoYXhlIHRhcmdldHMKICMgICAgJChIQVhFKSAgLS1jd2QgLiAgY3NoYXJwCkBAIC00MSwzMCArNTUsNTAgQEAKICMgICAgJChIQVhFKSAgLS1jd2QgLiAgamF2YQogIyAgICAkKEhBWEUpICAtLWN3ZCAuICBqYXZhc2NyaXB0CiAjICAgICQoSEFYRSkgIC0tY3dkIC4gIG5la28KLSMgICAgJChIQVhFKSAgLS1jd2QgLiAgcGhwCiAjICAgICQoSEFYRSkgIC0tY3dkIC4gIHB5dGhvbiAgIyBuZWVkcyBIYXhlIDMuMi4wCiAKIAogY2xlYW4tbG9jYWw6CiAJJChSTSkgLXIgZ2VuLWhheGUgYmluCiAKLWNoZWNrOiAkKEJJTl9DUFApCi0JdGltZW91dCAxMCAkKEJJTl9DUFApIHNlcnZlciAmCisuTk9UUEFSQUxMRUw6CisKK2NoZWNrOiBjaGVja19jcHAgXAorCWNoZWNrX3BocCBcCisJY2hlY2tfcGhwX3dlYiAKKworY2hlY2tfY3BwOiAkKEJJTl9DUFApIAorCXRpbWVvdXQgMjAgJChCSU5fQ1BQKSBzZXJ2ZXIgJgogCXNsZWVwIDEKIAkkKEJJTl9DUFApIGNsaWVudAogCXNsZWVwIDEwCiAKK2NoZWNrX3BocDogJChCSU5fUEhQKSAKKwl0aW1lb3V0IDIwIHBocCAtZiAkKEJJTl9QSFApIHNlcnZlciAmCisJc2xlZXAgMQorCXBocCAtZiAkKEJJTl9QSFApIGNsaWVudAorCXNsZWVwIDEwCisKK2NoZWNrX3BocF93ZWI6ICQoQklOX1BIUF9XRUIpICQoQklOX0NQUCkKKwl0aW1lb3V0IDIwIHBocCAtUyAxMjcuMC4wLjE6OTA5MCByb3V0ZXIucGhwICYKKwlzbGVlcCAxCisJJChCSU5fQ1BQKSBjbGllbnQgLS10cmFuc3BvcnQgaHR0cAorCXNsZWVwIDEwCisKKwogRVhUUkFfRElTVCA9IFwKLSAgICAgICAgICAgICBzcmMgXAotICAgICAgICAgICAgIGNwcC5oeG1sIFwKLSAgICAgICAgICAgICBjc2hhcnAuaHhtbCBcCi0gICAgICAgICAgICAgZmxhc2guaHhtbCBcCi0gICAgICAgICAgICAgamF2YS5oeG1sIFwKLSAgICAgICAgICAgICBqYXZhc2NyaXB0Lmh4bWwgXAotICAgICAgICAgICAgIG5la28uaHhtbCBcCi0gICAgICAgICAgICAgcGhwLmh4bWwgXAotICAgICAgICAgICAgIHB5dGhvbi5oeG1sIFwKLSAgICAgICAgICAgICBwcm9qZWN0LmhpZGUgXAotICAgICAgICAgICAgIFRlc3RDbGllbnRTZXJ2ZXIuaHhwcm9qIFwKLSAgICAgICAgICAgICBtYWtlX2FsbC5iYXQgXAotICAgICAgICAgICAgIG1ha2VfYWxsLnNoCisJc3JjIFwKKwljcHAuaHhtbCBcCisJY3NoYXJwLmh4bWwgXAorCWZsYXNoLmh4bWwgXAorCWphdmEuaHhtbCBcCisJamF2YXNjcmlwdC5oeG1sIFwKKwluZWtvLmh4bWwgXAorCXBocC5oeG1sIFwKKwlweXRob24uaHhtbCBcCisJcm91dGVyLnBocCBcCisJcHJvamVjdC5oaWRlIFwKKwlwaHAtd2ViLXNlcnZlci5oeG1sIFwKKwlUZXN0Q2xpZW50U2VydmVyLmh4cHJvaiBcCisJbWFrZV9hbGwuYmF0IFwKKwltYWtlX2FsbC5zaApkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL21ha2VfYWxsLnNoIGIvdGVzdC9oYXhlL21ha2VfYWxsLnNoCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMjYyMTI1OC4uZWIyYzljMgotLS0gYS90ZXN0L2hheGUvbWFrZV9hbGwuc2gKKysrIGIvdGVzdC9oYXhlL21ha2VfYWxsLnNoCkBAIC0xOSw3ICsxOSw3IEBACiAjCiAKICMgaW52b2tlIFRocmlmdCBjb21ucGlsZXIKLXRocmlmdCAtciAtZ2VuIGhheGUgIC4uL1RocmlmdFRlc3QudGhyaWZ0CisuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAogIyBvdXRwdXQgZm9sZGVyCiBpZiBbICEgLWQgYmluIF07IHRoZW4KZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sIGIvdGVzdC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1YTg1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQSFAgdGFyZ2V0CistcGhwIGJpbi9waHAtd2ViLXNlcnZlci8KKy0tcGhwLWZyb250IE1haW4tZGVidWcucGhwCisKKyNkZWZpbmVzCistRCBwaHB3ZWJzZXJ2ZXIKKworCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvcGhwLmh4bWwgYi90ZXN0L2hheGUvcGhwLmh4bWwKaW5kZXggMWVhYWM4Yi4uOTY1MTg5OCAxMDA2NDQKLS0tIGEvdGVzdC9oYXhlL3BocC5oeG1sCisrKyBiL3Rlc3QvaGF4ZS9waHAuaHhtbApAQCAtMjYsNyArMjYsOSBAQAogLW1haW4gTWFpbgogCiAjUEhQIHRhcmdldAotLXBocCBiaW4vVHV0b3JpYWwucGhwCistcGhwIGJpbi9waHAvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAorCiAKICNBZGQgZGVidWcgaW5mb3JtYXRpb24KIC1kZWJ1ZwpAQCAtMzUsNCArMzcsNCBAQAogIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKICMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQogIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQotLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvcm91dGVyLnBocCBiL3Rlc3QvaGF4ZS9yb3V0ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDEzNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvcm91dGVyLnBocApAQCAtMCwwICsxLDMxIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCisKKworLy9yb3V0ZXIgZmlsZSB0byBydW4gdGVzdGluZyB3ZWIgc2VydmVyCisKKy8vc2V0X3RpbWVfbGltaXQoMSk7CisKK3JlcXVpcmVfb25jZSAgZGlybmFtZShfX0ZJTEVfXykgLiAnL2Jpbi9waHAtd2ViLXNlcnZlci9NYWluLWRlYnVnLnBocCc7CisKKwpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3NyYy9Bcmd1bWVudHMuaHggYi90ZXN0L2hheGUvc3JjL0FyZ3VtZW50cy5oeAppbmRleCBjYWU5MWRmLi5jYzEwNzQ5IDEwMDY0NAotLS0gYS90ZXN0L2hheGUvc3JjL0FyZ3VtZW50cy5oeAorKysgYi90ZXN0L2hheGUvc3JjL0FyZ3VtZW50cy5oeApAQCAtNzIsMTIgKzcyLDE4IEBACiAKICAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgewogICAgICAgICAjaWYgc3lzCi0gICAgICAgIHRyeSB7CisgICAgICAgICAgI2lmICFwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICBQYXJzZUFyZ3MoKTsKLSAgICAgICAgfSBjYXRjaCAoZSA6IFN0cmluZykgeworICAgICAgICAgIH0gY2F0Y2ggKGUgOiBTdHJpbmcpIHsKICAgICAgICAgICAgIHRyYWNlKEdldEhlbHAoKSk7CiAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAvL2ZvcmNpbmcgc2VydmVyCisgICAgICAgICAgICBzZXJ2ZXIgPSB0cnVlOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gaHR0cDsKKyAgICAgICAgICAjZW5kCiAgICAgICAgICNlbHNlCiAgICAgICAgIHRyYWNlKCJXTjogUGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBwcm9ncmFtIGFyZ3VtZW50cywgdXNpbmcgZGVmYXVsdHMuIik7CiAgICAgICAgICNlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9zcmMvTWFpbi5oeCBiL3Rlc3QvaGF4ZS9zcmMvTWFpbi5oeAppbmRleCAzMGMwNGE2Li45ZWI4MjhmIDEwMDY0NAotLS0gYS90ZXN0L2hheGUvc3JjL01haW4uaHgKKysrIGIvdGVzdC9oYXhlL3NyYy9NYWluLmh4CkBAIC0zMSw2ICszMSwxNSBAQAogY2xhc3MgTWFpbgogewogICAgIHN0YXRpYyBmdW5jdGlvbiBtYWluKCkgeworICAgICAgICAjaWYgcGhwd2Vic2VydmVyCisgICAgICAgIGluaXRQaHBXZWJTZXJ2ZXIoKTsKKyAgICAgICAgLy9jaGVjayBtZXRob2QKKyAgICAgICAgaWYocGhwLldlYi5nZXRNZXRob2QoKSAhPSAnUE9TVCcpIHsKKyAgICAgICAgICBTeXMucHJpbnRsbignaHR0cCBlbmRwb2ludCBmb3IgdGhyaWZ0IHRlc3Qgc2VydmVyJyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICNlbmQKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJndW1lbnRzKCk7CiAKQEAgLTQ4LDQgKzU3LDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAjaWYgcGhwd2Vic2VydmVyCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdFBocFdlYlNlcnZlcigpCisgICAgeworICAgICAgICAvL3JlbWFwIHRyYWNlIHRvIGVycm9yIGxvZworICAgICAgICBoYXhlLkxvZy50cmFjZSA9IGZ1bmN0aW9uKHY6RHluYW1pYywgP2luZm9zOmhheGUuUG9zSW5mb3MpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBoYW5kbGUgdHJhY2UKKyAgICAgICAgICB2YXIgbmV3VmFsdWUgOiBEeW5hbWljOworICAgICAgICAgIGlmIChpbmZvcyAhPSBudWxsICYmIGluZm9zLmN1c3RvbVBhcmFtcyE9bnVsbCkgeworICAgICAgICAgICAgdmFyIGV4dHJhOlN0cmluZyA9ICIiOworICAgICAgICAgICAgZm9yKCB2IGluIGluZm9zLmN1c3RvbVBhcmFtcyApCisgICAgICAgICAgICAgIGV4dHJhICs9ICIsIiArIHY7CisgICAgICAgICAgICBuZXdWYWx1ZSA9IHYgKyBleHRyYTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBuZXdWYWx1ZSA9IHY7CisgICAgICAgICAgfQorICAgICAgICAgIHZhciBtc2cgPSBpbmZvcyAhPSBudWxsID8gaW5mb3MuZmlsZU5hbWUgKyAnOicgKyBpbmZvcy5saW5lTnVtYmVyICsgJzogJyA6ICcnOworICAgICAgICAgIFN5cy5zdGRlcnIoKS53cml0ZVN0cmluZygnJHttc2d9JHtuZXdWYWx1ZX1cbicpOworICAgICAgICB9CisgICAgfQorICAgICNlbmQKKwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3NyYy9UZXN0Q2xpZW50Lmh4IGIvdGVzdC9oYXhlL3NyYy9UZXN0Q2xpZW50Lmh4CmluZGV4IDVjMGRlN2MuLjg1MzMxOWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvaGF4ZS9zcmMvVGVzdENsaWVudC5oeAorKysgYi90ZXN0L2hheGUvc3JjL1Rlc3RDbGllbnQuaHgKQEAgLTQzLDYgKzQzLDggQEAKIGltcG9ydCB0aHJpZnQudGVzdC4qOyAgLy8gZ2VuZXJhdGVkIGNvZGUKIAogCit1c2luZyBTdHJpbmdUb29sczsKKwogY2xhc3MgVGVzdFJlc3VsdHMgewogICAgIHByaXZhdGUgdmFyIHN1Y2Nlc3NDbnQgOiBJbnQgPSAwOwogICAgIHByaXZhdGUgdmFyIGVycm9yQ250IDogSW50ID0gMDsKQEAgLTEwMiw3ICsxMDQsNyBAQAogICAgICAgICBpZiAoIGVycm9yQ250ID4gMCkKICAgICAgICAgewogICAgICAgICAgICAgdHJhY2UoJz09PT09PT09PT09PT09PT09PT09PT09PT09PScpOwotICAgICAgICAgICAgICB0cmFjZSgnRkFJTEVEIFRFU1RTOiAkZmFpbGVkVGVzdHMnKTsKKyAgICAgICAgICAgIHRyYWNlKCdGQUlMRUQgVEVTVFM6ICRmYWlsZWRUZXN0cycpOwogICAgICAgICB9CiAgICAgICAgIHRyYWNlKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTsKICAgICB9CkBAIC0xMTgsMjAgKzEyMCwxNSBAQAogICAgICAgICB7CiAgICAgICAgICAgICB2YXIgZGlmZnQgPSBUaW1lci5zdGFtcCgpOwogCi0gICAgICAgICAgICBpZiggYXJncy5udW1UaHJlYWRzID4gMSkgewotICAgICAgICAgICAgICAgIHZhciB0aHJlYWRzID0gbmV3IExpc3Q8VGhyZWFkPigpOwotICAgICAgICAgICAgICAgIGZvciggdGVzdCBpbiAwIC4uLiBhcmdzLm51bVRocmVhZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFkcy5hZGQoIFN0YXJ0VGhyZWFkKCBhcmdzKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoIHRocmVhZCBpbiB0aHJlYWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXRDb2RlIHw9IFRocmVhZC5yZWFkTWVzc2FnZSh0cnVlKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGFyZ3MubnVtVGhyZWFkcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAjaWYgY3BwCisgICAgICAgICAgICAgICAgZXhpdENvZGUgPSBNdWx0aVRocmVhZENsaWVudChhcmdzKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHRyYWNlKCdUaHJlYWRzIG5vdCBzdXBwb3J0ZWQvaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0uJyk7CisgICAgICAgICAgICAgICAgZXhpdENvZGUgPSBTaW5nbGVUaHJlYWRDbGllbnQoYXJncyk7CisgICAgICAgICAgICAgICAgI2VuZAogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2YXIgcnNsdCA9IG5ldyBUZXN0UmVzdWx0cyh0cnVlKTsKLSAgICAgICAgICAgICAgICBSdW5DbGllbnQoYXJncyxyc2x0KTsKLSAgICAgICAgICAgICAgICByc2x0LlByaW50U3VtbWFyeSgpOwotICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gcnNsdC5DYWxjdWxhdGVFeGl0Q29kZSgpOworICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gU2luZ2xlVGhyZWFkQ2xpZW50KGFyZ3MpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBkaWZmdCA9IE1hdGgucm91bmQoIDEwMDAgKiAoVGltZXIuc3RhbXAoKSAtIGRpZmZ0KSkgLyAxMDAwOwpAQCAtMTU0LDYgKzE1MSwzMSBAQAogICAgIH0KIAogCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTaW5nbGVUaHJlYWRDbGllbnQoYXJncyA6IEFyZ3VtZW50cykgOiAgSW50CisgICAgeworICAgICAgICB2YXIgcnNsdCA9IG5ldyBUZXN0UmVzdWx0cyh0cnVlKTsKKyAgICAgICAgUnVuQ2xpZW50KGFyZ3MscnNsdCk7CisgICAgICAgIHJzbHQuUHJpbnRTdW1tYXJ5KCk7CisgICAgICAgIHJldHVybiByc2x0LkNhbGN1bGF0ZUV4aXRDb2RlKCk7CisgICAgfQorCisKKyAgICAjaWYgY3BwCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBNdWx0aVRocmVhZENsaWVudChhcmdzIDogQXJndW1lbnRzKSA6ICBJbnQKKyAgICB7CisgICAgICAgIHZhciB0aHJlYWRzID0gbmV3IExpc3Q8VGhyZWFkPigpOworICAgICAgICBmb3IoIHRlc3QgaW4gMCAuLi4gYXJncy5udW1UaHJlYWRzKSB7CisgICAgICAgICAgICB0aHJlYWRzLmFkZCggU3RhcnRUaHJlYWQoIGFyZ3MpKTsKKyAgICAgICAgfQorICAgICAgICB2YXIgZXhpdENvZGUgOiBJbnQgPSAwOworICAgICAgICBmb3IoIHRocmVhZCBpbiB0aHJlYWRzKSB7CisgICAgICAgICAgICBleGl0Q29kZSB8PSBUaHJlYWQucmVhZE1lc3NhZ2UodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4aXRDb2RlOworICAgIH0KKyAgICAjZW5kCisKKyAgICAjaWYgY3BwCiAgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gU3RhcnRUaHJlYWQoYXJncyA6IEFyZ3VtZW50cykgOiBUaHJlYWQgewogICAgICAgICB2YXIgdGhyZWFkID0gVGhyZWFkLmNyZWF0ZSgKICAgICAgICAgICAgIGZ1bmN0aW9uKCkgOiBWb2lkIHsKQEAgLTE3OSw2ICsyMDEsNyBAQAogICAgICAgICB0aHJlYWQuc2VuZE1lc3NhZ2UoVGhyZWFkLmN1cnJlbnQoKSk7CiAgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgfQorICAgICNlbmQKIAogCiAgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSdW5DbGllbnQoYXJncyA6IEFyZ3VtZW50cywgcnNsdCA6IFRlc3RSZXN1bHRzKQpAQCAtMTg5LDcgKzIxMiw5IEBACiAgICAgICAgICAgICBjYXNlIHNvY2tldDoKICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldChhcmdzLmhvc3QsIGFyZ3MucG9ydCk7CiAgICAgICAgICAgICBjYXNlIGh0dHA6Ci0gICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50KGFyZ3MuaG9zdCk7CisgICAgICAgICAgICAgICAgdmFyIHVyaSA9ICdodHRwOi8vJHthcmdzLmhvc3R9OiR7YXJncy5wb3J0fSc7CisgICAgICAgICAgICAgICAgdHJhY2UoJy0gaHR0cCBjbGllbnQgOiAke3VyaX0nKTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnQodXJpKTsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0cmFuc3BvcnQiOwogICAgICAgICB9CkBAIC0yMzUsNyArMjYwLDcgQEAKICAgICB7CiAgICAgICAgIC8vIFdlIG5lZWQgdG8gdGVzdCBhIGZldyBiYXNpYyB0aGluZ3MgdXNlZCBpbiB0aGUgQ2xpZW50VGVzdAogICAgICAgICAvLyBBbnl0aGluZyBlbHNlIGJleW9uZCB0aGlzIHNjb3BlIHNob3VsZCBnbyBpbnRvIC9saWIvaGF4ZS8gaW5zdGVhZAotICAgICAgICByc2x0LlN0YXJ0VGVzdEdyb3VwKCAwKTsKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9CQVNFVFlQRVMpOwogCiAgICAgICAgIHZhciBtYXAzMiA9IG5ldyBJbnRNYXA8SW50MzI+KCk7CiAgICAgICAgIHZhciBtYXA2NCA9IG5ldyBJbnQ2NE1hcDxJbnQzMj4oKTsKQEAgLTI5Nyw4ICszMjIsOSBAQAogICAgICAgICByc2x0LkV4cGVjdCggYzMyID09IGM2NCwgIkludDY0TWFwPEludDMyPiBUZXN0ICMzMCIpOwogICAgICAgICByc2x0LkV4cGVjdCggJyRrc3VtNjQnID09ICcka3N1bTMyJywgJyRrc3VtNjQgPT0gJGtzdW0zMiAgIFRlc3QgIzMxJyk7CiAKLSAgICAgICAgdmFyIHMzMiA9IG1hcDMyLnRvU3RyaW5nKCk7Ci0gICAgICAgIHZhciBzNjQgPSBtYXA2NC50b1N0cmluZygpOworICAgICAgICAvL2NvbXBhcmUgd2l0aG91dCBzcGFjZXMgYmVjYXVzZSBkaWZmZXIgaW4gcGhwIGFuZCBjcHAKKyAgICAgICAgdmFyIHMzMiA9IG1hcDMyLnRvU3RyaW5nKCkucmVwbGFjZSgnICcsICcnKTsKKyAgICAgICAgdmFyIHM2NCA9IG1hcDY0LnRvU3RyaW5nKCkucmVwbGFjZSgnICcsICcnKTsKICAgICAgICAgcnNsdC5FeHBlY3QoIHMzMiA9PSBzNjQsICJJbnQ2NE1hcDxJbnQzMj4udG9TdHJpbmcoKTogIiArICcgKCIkczMyIiA9PSAiJHM2NCIpIFRlc3QgIzMyJyk7CiAKICAgICAgICAgbWFwMzIucmVtb3ZlKCA0Mik7CkBAIC0zMjIsOCArMzQ4LDggQEAKIAogICAgIC8vIGNvcmUgbW9kdWxlIHVuaXQgdGVzdHMKICAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE1vZHVsZVVuaXRUZXN0cyggYXJncyA6IEFyZ3VtZW50cywgcnNsdCA6IFRlc3RSZXN1bHRzKSA6IFZvaWQgewotCQkjaWYgZGVidWcKLQkJCisgICAgICAgICNpZiBkZWJ1ZworCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBCaXRDb252ZXJ0ZXIuVW5pdFRlc3QoKTsKICAgICAgICAgICAgIHJzbHQuRXhwZWN0KCB0cnVlLCAnQml0Q29udmVydGVyLlVuaXRUZXN0ICBUZXN0ICMxMDAnKTsKQEAgLTMzOSw4ICszNjUsOCBAQAogICAgICAgICBjYXRjaCggZSA6IER5bmFtaWMpIHsKICAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ1ppZ1phZy5Vbml0VGVzdDogJGUgIFRlc3QgIzEwMScpOwogICAgICAgICB9Ci0JCQotCQkjZW5kCisKKyAgICAgICAgI2VuZAogICAgIH0KIAogCkBAIC00MTgsNiArNDQ0LDEwIEBACiAgICAgICAgICAgICByc2x0LkV4cGVjdCggZS5tZXNzYWdlID09ICJYY2VwdGlvbiIsICd0ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpICAtICBlLm1lc3NhZ2UgPT0gIlhjZXB0aW9uIicpOwogICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGUuZXJyb3JDb2RlID09IDEwMDEsICd0ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpICAtICBlLmVycm9yQ29kZSA9PSAxMDAxJyk7CiAgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd0ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpICAtICAke2V9IDogJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CiAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKICAgICAgICAgewogICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSAgLSAgJGUnKTsKQEAgLTQzMSw3ICs0NjEsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKICAgICAgICAgewotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIHRydWUsICd0ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikgIC0gICRlJyk7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggdHJ1ZSwgJ3Rlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKSAgLSAgJGUgOiAke2UuZXJyb3JNc2d9Jyk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQogICAgICAgICB7CkBAIC00NDksNiArNDc5LDEwIEBACiAgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiYmxhIik7CiAgICAgICAgICAgICByc2x0LkV4cGVjdCggdHJ1ZSwgJ3Rlc3RFeGNlcHRpb24oImJsYSIpIHNob3VsZCBub3QgdGhyb3cnKTsKICAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oImJsYSIpICAtICAke2V9IDogJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CiAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKICAgICAgICAgewogICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiYmxhIikgIC0gICRlJyk7CkBAIC00NjQsMTEgKzQ5OCwxMSBAQAogICAgICAgICB0cmFjZSgndGVzdEJvb2woJHt0cnVlfSknKTsKICAgICAgICAgdmFyIGIgPSBjbGllbnQudGVzdEJvb2wodHJ1ZSk7CiAgICAgICAgIHRyYWNlKCcgPSAkYicpOwotCQlyc2x0LkV4cGVjdChiLCAnJGIgPT0gIiR7dHJ1ZX0iJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KGIsICckYiA9PSAiJHt0cnVlfSInKTsKICAgICAgICAgdHJhY2UoJ3Rlc3RCb29sKCR7ZmFsc2V9KScpOwogICAgICAgICBiID0gY2xpZW50LnRlc3RCb29sKGZhbHNlKTsKICAgICAgICAgdHJhY2UoJyA9ICRiJyk7Ci0JCXJzbHQuRXhwZWN0KCAhIGIsICckYiA9PSAiJHtmYWxzZX0iJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCAhIGIsICckYiA9PSAiJHtmYWxzZX0iJyk7CiAKICAgICAgICAgdHJhY2UoJ3Rlc3RTdHJpbmcoIlRlc3QiKScpOwogICAgICAgICB2YXIgcyA9IGNsaWVudC50ZXN0U3RyaW5nKCJUZXN0Iik7CkBAIC04MjAsNiArODU0LDE4IEBACiAgICAgICAgIHRyYWNlKCJ9Iik7CiAKIAorCQkvKioKKwkJKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKwkJKgorCQkqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorCQkqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKwkJKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisJCSogICAgICAgICAgfSwKKwkJKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisJCSogICB9CisJCSogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisJCSovCisJCQogICAgICAgICB2YXIgZmlyc3RfbWFwID0gd2hvYS5nZXQoSW50NjQubWFrZSgwLDEpKTsKICAgICAgICAgdmFyIHNlY29uZF9tYXAgPSB3aG9hLmdldChJbnQ2NC5tYWtlKDAsMikpOwogICAgICAgICByc2x0LkV4cGVjdCggKGZpcnN0X21hcCAhPSBudWxsKSAmJiAoc2Vjb25kX21hcCAhPSBudWxsKSwgIihmaXJzdF9tYXAgIT0gbnVsbCkgJiYgKHNlY29uZF9tYXAgIT0gbnVsbCkiKTsKQEAgLTgzMSw0MiArODc3LDI3IEBACiAgICAgICAgICAgICByc2x0LkV4cGVjdCggKGNyYXp5MiAhPSBudWxsKSAmJiAoY3JhenkzICE9IG51bGwpICYmIChsb29uZXkgIT0gbnVsbCksCiAgICAgICAgICAgICAgICAgICAgICAgICAiKGNyYXp5MiAhPSBudWxsKSAmJiAoY3JhenkzICE9IG51bGwpICYmIChsb29uZXkgIT0gbnVsbCkiKTsKIAotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIGNyYXp5Mi51c2VyTWFwLmdldChOdW1iZXJ6LkVJR0hUKSwgSW50NjQubWFrZSgwLDgpKSA9PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgImNyYXp5Mi5Vc2VyTWFwLmdldChOdW1iZXJ6LkVJR0hUKSA9PSA4Iik7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggY3JhenkzLnVzZXJNYXAuZ2V0KE51bWJlcnouRUlHSFQpLCBJbnQ2NC5tYWtlKDAsOCkpID09IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY3JhenkzLlVzZXJNYXAuZ2V0KE51bWJlcnouRUlHSFQpID09IDgiKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBjcmF6eTIudXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSwgSW50NjQubWFrZSgwLDUpKSA9PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgImNyYXp5Mi5Vc2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpID09IDUiKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBjcmF6eTMudXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSwgSW50NjQubWFrZSgwLDUpKSA9PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgImNyYXp5My5Vc2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpID09IDUiKTsKLQogICAgICAgICAgICAgdmFyIGNyejJpdGVyID0gY3JhenkyLnh0cnVjdHMuaXRlcmF0b3IoKTsKICAgICAgICAgICAgIHZhciBjcnozaXRlciA9IGNyYXp5My54dHJ1Y3RzLml0ZXJhdG9yKCk7CiAgICAgICAgICAgICByc2x0LkV4cGVjdCggY3J6Mml0ZXIuaGFzTmV4dCgpICYmIGNyejNpdGVyLmhhc05leHQoKSwgImNyejJpdGVyLmhhc05leHQoKSAmJiBjcnozaXRlci5oYXNOZXh0KCkiKTsKICAgICAgICAgICAgIHZhciBnb29kYnllMiA9IGNyejJpdGVyLm5leHQoKTsKICAgICAgICAgICAgIHZhciBnb29kYnllMyA9IGNyejNpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBjcnoyaXRlci5oYXNOZXh0KCkgJiYgY3J6M2l0ZXIuaGFzTmV4dCgpLCAiY3J6Mml0ZXIuaGFzTmV4dCgpICYmIGNyejNpdGVyLmhhc05leHQoKSIpOwotICAgICAgICAgICAgdmFyIGhlbGxvMiA9IGNyejJpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHZhciBoZWxsbzMgPSBjcnozaXRlci5uZXh0KCk7CiAgICAgICAgICAgICByc2x0LkV4cGVjdCggISAoY3J6Mml0ZXIuaGFzTmV4dCgpIHx8IGNyejNpdGVyLmhhc05leHQoKSksICIhIChjcnoyaXRlci5oYXNOZXh0KCkgfHwgY3J6M2l0ZXIuaGFzTmV4dCgpKSIpOwogCi0gICAgICAgICAgICByc2x0LkV4cGVjdCggaGVsbG8yLnN0cmluZ190aGluZyA9PSAiSGVsbG8yIiwgJ2hlbGxvMi5TdHJpbmdfdGhpbmcgPT0gIkhlbGxvMiInKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBoZWxsbzIuYnl0ZV90aGluZyA9PSAyLCAnaGVsbG8yLkJ5dGVfdGhpbmcgPT0gMicpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGhlbGxvMi5pMzJfdGhpbmcgPT0gMiwgJ2hlbGxvMi5JMzJfdGhpbmcgPT0gMicpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIGhlbGxvMi5pNjRfdGhpbmcsIEludDY0Lm1ha2UoMCwyKSkgPT0gMCwgJ2hlbGxvMi5JNjRfdGhpbmcgPT0gMicpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGhlbGxvMy5zdHJpbmdfdGhpbmcgPT0gIkhlbGxvMiIsICdoZWxsbzMuU3RyaW5nX3RoaW5nID09ICJIZWxsbzIiJyk7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggaGVsbG8zLmJ5dGVfdGhpbmcgPT0gMiwgJ2hlbGxvMy5CeXRlX3RoaW5nID09IDInKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBoZWxsbzMuaTMyX3RoaW5nID09IDIsICdoZWxsbzMuSTMyX3RoaW5nID09IDInKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBoZWxsbzMuaTY0X3RoaW5nLCBJbnQ2NC5tYWtlKDAsMikpID09IDAsICdoZWxsbzMuSTY0X3RoaW5nID09IDInKTsKKwkJCXJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBjcmF6eTIudXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSwgaW5zYW5lLnVzZXJNYXAuZ2V0KE51bWJlcnouRklWRSkpID09IDAsICJjcmF6eTIudXNlck1hcFs1XSA9PSBpbnNhbmUudXNlck1hcFs1XSIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLnN0cmluZ190aGluZyA9PSBnb29kYnllMi5zdHJpbmdfdGhpbmcsICJ0cnVjay5zdHJpbmdfdGhpbmcgPT0gZ29vZGJ5ZTIuc3RyaW5nX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suYnl0ZV90aGluZyAgPT0gZ29vZGJ5ZTIuYnl0ZV90aGluZywgInRydWNrLmJ5dGVfdGhpbmcgID09IGdvb2RieWUyLmJ5dGVfdGhpbmciKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5pMzJfdGhpbmcgID09IGdvb2RieWUyLmkzMl90aGluZywgInRydWNrLmkzMl90aGluZyAgPT0gZ29vZGJ5ZTIuaTMyX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggdHJ1Y2suaTY0X3RoaW5nLCBnb29kYnllMi5pNjRfdGhpbmcpID09IDAsICJ0cnVjay5pNjRfdGhpbmcgID09IGdvb2RieWUyLmk2NF90aGluZyIpOwogCi0gICAgICAgICAgICByc2x0LkV4cGVjdCggZ29vZGJ5ZTIuc3RyaW5nX3RoaW5nID09ICJHb29kYnllNCIsICdnb29kYnllMi5TdHJpbmdfdGhpbmcgPT0gIkdvb2RieWU0IicpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGdvb2RieWUyLmJ5dGVfdGhpbmcgPT0gNCwgJ2dvb2RieWUyLkJ5dGVfdGhpbmcgPT0gNCcpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGdvb2RieWUyLmkzMl90aGluZyA9PSA0LCAnZ29vZGJ5ZTIuSTMyX3RoaW5nID09IDQnKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBnb29kYnllMi5pNjRfdGhpbmcsIEludDY0Lm1ha2UoMCw0KSkgPT0gMCwgJ2dvb2RieWUyLkk2NF90aGluZyA9PSA0Jyk7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggZ29vZGJ5ZTMuc3RyaW5nX3RoaW5nID09ICJHb29kYnllNCIsICdnb29kYnllMy5TdHJpbmdfdGhpbmcgPT0gIkdvb2RieWU0IicpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGdvb2RieWUzLmJ5dGVfdGhpbmcgPT0gNCwgJ2dvb2RieWUzLkJ5dGVfdGhpbmcgPT0gNCcpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGdvb2RieWUzLmkzMl90aGluZyA9PSA0LCAnZ29vZGJ5ZTMuSTMyX3RoaW5nID09IDQnKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBnb29kYnllMy5pNjRfdGhpbmcsIEludDY0Lm1ha2UoMCw0KSkgPT0gMCwgJ2dvb2RieWUzLkk2NF90aGluZyA9PSA0Jyk7CisJCQlyc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggY3JhenkzLnVzZXJNYXAuZ2V0KE51bWJlcnouRklWRSksIGluc2FuZS51c2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpKSA9PSAwLCAiY3JhenkzLnVzZXJNYXBbNV0gPT0gaW5zYW5lLnVzZXJNYXBbNV0iKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5zdHJpbmdfdGhpbmcgPT0gZ29vZGJ5ZTMuc3RyaW5nX3RoaW5nLCAidHJ1Y2suc3RyaW5nX3RoaW5nID09IGdvb2RieWUzLnN0cmluZ190aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLmJ5dGVfdGhpbmcgID09IGdvb2RieWUzLmJ5dGVfdGhpbmcsICJ0cnVjay5ieXRlX3RoaW5nICA9PSBnb29kYnllMy5ieXRlX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suaTMyX3RoaW5nICA9PSBnb29kYnllMy5pMzJfdGhpbmcsICJ0cnVjay5pMzJfdGhpbmcgID09IGdvb2RieWUzLmkzMl90aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIHRydWNrLmk2NF90aGluZywgZ29vZGJ5ZTMuaTY0X3RoaW5nKSA9PSAwLCAidHJ1Y2suaTY0X3RoaW5nICA9PSBnb29kYnllMy5pNjRfdGhpbmciKTsKKwkJCQorCQkJcnNsdC5FeHBlY3QoICEgbG9vbmV5LmlzU2V0KDEpLCAiISBsb29uZXkuaXNTZXQoMSkiKTsKKwkJCXJzbHQuRXhwZWN0KCAhIGxvb25leS5pc1NldCgyKSwgIiEgbG9vbmV5LmlzU2V0KDIpIik7CiAgICAgICAgIH0KIAogICAgICAgICB2YXIgYXJnMCA9IDE7CmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXIuaHggYi90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXIuaHgKaW5kZXggYmZmNWE0Ny4uNDUwYzhmMiAxMDA2NDQKLS0tIGEvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVyLmh4CisrKyBiL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlci5oeApAQCAtNDIsOCArNDIsMTggQEAKICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCggYXJncy5wb3J0KTsKICAgICAgICAgICAgIGNhc2UgaHR0cDoKICAgICAgICAgICAgICAgICB0cmFjZSgiLSBodHRwIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgIkhUVFAgc2VydmVyIG5vdCBpbXBsZW1lbnRlZCB5ZXQiOworICAgICAgICAgICAgICAgICNpZiAhcGhwd2Vic2VydmVyCisgICAgICAgICAgICAgICAgICB0aHJvdyAiSFRUUCBzZXJ2ZXIgbm90IGltcGxlbWVudGVkIHlldCI7CiAgICAgICAgICAgICAgICAgIC8vdHJhbnNwb3J0ID0gbmV3IFRIdHRwU2VydmVyKCB0YXJnZXRIb3N0KTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9ICAgIG5ldyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVFN0cmVhbVRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9pbnB1dCIsIFJlYWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEZpbGVTdHJlYW0oInBocDovL291dHB1dCIsIEFwcGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgICNlbmQKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0cmFuc3BvcnQiOwogICAgICAgICAgICAgfQpAQCAtODQsNyArOTQsMTIgQEAKICAgICAgICAgICAgIHN3aXRjaCggYXJncy5zZXJ2ZXJ0eXBlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBzaW1wbGU6Ci0gICAgICAgICAgICAgICAgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc2ZhY3RvcnksIHByb3RmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICB2YXIgc2ltcGxlU2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc2ZhY3RvcnksIHByb3RmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAjaWYgcGhwd2Vic2VydmVyCisgICAgICAgICAgICAgICAgc2ltcGxlU2VydmVyLnJ1bk9uY2UgPSB0cnVlOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBzaW1wbGVTZXJ2ZXI7CisKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCBzZXJ2ZXIgdHlwZSI7CiAgICAgICAgICAgICB9CkBAIC0xMDYsNyArMTIxLDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoeCA6IFRFeGNlcHRpb24pCiAgICAgICAgIHsKLQkJCXRyYWNlKCckeCAke3guZXJyb3JJRH0gJHt4LmVycm9yTXNnfScpOworICAgICAgICAgICAgdHJhY2UoJyR4ICR7eC5lcnJvcklEfSAke3guZXJyb3JNc2d9Jyk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKHggOiBEeW5hbWljKQogICAgICAgICB7CmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJIYW5kbGVyLmh4IGIvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVySGFuZGxlci5oeAppbmRleCA3NGE4ODA1Li5iOGEyNTkwIDEwMDY0NAotLS0gYS90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJIYW5kbGVyLmh4CisrKyBiL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlckhhbmRsZXIuaHgKQEAgLTUxLDE0ICs1MSwxNCBAQAogICAgICAgICB0cmFjZSgidGVzdFZvaWQoKSIpOwogICAgIH0KIAotCS8qKgotCSogUHJpbnRzICd0ZXN0Qm9vbCgiJXMiKScgd2hlcmUgJyVzJyB3aXRoIHRoaW5nIGFzICd0cnVlJyBvciAnZmFsc2UnCi0JKiBAcGFyYW0gYm9vbCAgdGhpbmcgLSB0aGUgYm9vbCBkYXRhIHRvIHByaW50Ci0JKiBAcmV0dXJuIGJvb2wgIC0gcmV0dXJucyB0aGUgYm9vbCAndGhpbmcnCi0JKiAKLQkqIEBwYXJhbSB0aGluZwotCSovCi0JcHVibGljIGZ1bmN0aW9uIHRlc3RCb29sKHRoaW5nIDogQm9vbCkgOiBCb29sCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RCb29sKCIlcyIpJyB3aGVyZSAnJXMnIHdpdGggdGhpbmcgYXMgJ3RydWUnIG9yICdmYWxzZScKKyAgICAqIEBwYXJhbSBib29sICB0aGluZyAtIHRoZSBib29sIGRhdGEgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gYm9vbCAgLSByZXR1cm5zIHRoZSBib29sICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qm9vbCh0aGluZyA6IEJvb2wpIDogQm9vbAogICAgIHsKICAgICAgICAgdHJhY2UoJ3Rlc3RCb29sKCR0aGluZyknKTsKICAgICAgICAgcmV0dXJuIHRoaW5nOwpAQCAtMzUyLDMzICszNTIsMTIgQEAKICAgICB7CiAgICAgICAgIHRyYWNlKCJ0ZXN0SW5zYW5pdHkoKSIpOwogCi0gICAgICAgIHZhciBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSAyOwotICAgICAgICBoZWxsby5pMzJfdGhpbmcgPSAyOwotICAgICAgICBoZWxsby5pNjRfdGhpbmcgPSBJbnQ2NC5tYWtlKDAsIDIpOwotCi0gICAgICAgIHZhciBnb29kYnllID0gbmV3IFh0cnVjdCgpOwotICAgICAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7Ci0gICAgICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IDQ7Ci0gICAgICAgIGdvb2RieWUuaTMyX3RoaW5nID0gNDsKLSAgICAgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSBJbnQ2NC5tYWtlKDAsIDQpOwotCi0gICAgICAgIHZhciBjcmF6eSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgICBjcmF6eS51c2VyTWFwID0gbmV3IEludE1hcDwgaGF4ZS5JbnQ2ND4oKTsKLSAgICAgICAgY3JhenkudXNlck1hcC5zZXQoTnVtYmVyei5FSUdIVCwgSW50NjQubWFrZSgwLDgpKTsKLSAgICAgICAgY3JhenkueHRydWN0cyA9IG5ldyBMaXN0PFh0cnVjdD4oKTsKLSAgICAgICAgY3JhenkueHRydWN0cy5hZGQoZ29vZGJ5ZSk7Ci0KLSAgICAgICAgdmFyIGxvb25leSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgICBjcmF6eS51c2VyTWFwLnNldChOdW1iZXJ6LkZJVkUsIEludDY0Lm1ha2UoMCw1KSk7Ci0gICAgICAgIGNyYXp5Lnh0cnVjdHMuYWRkKGhlbGxvKTsKLQogICAgICAgICB2YXIgZmlyc3RfbWFwID0gbmV3IEludE1hcDwgSW5zYW5pdHk+KCk7Ci0gICAgICAgIGZpcnN0X21hcC5zZXQoTnVtYmVyei5UV08sIGNyYXp5KTsKLSAgICAgICAgZmlyc3RfbWFwLnNldChOdW1iZXJ6LlRIUkVFLCBjcmF6eSk7CisgICAgICAgIGZpcnN0X21hcC5zZXQoTnVtYmVyei5UV08sIGFyZ3VtZW50KTsKKyAgICAgICAgZmlyc3RfbWFwLnNldChOdW1iZXJ6LlRIUkVFLCBhcmd1bWVudCk7CiAKICAgICAgICAgdmFyIHNlY29uZF9tYXAgPSBuZXcgSW50TWFwPCBJbnNhbml0eT4oKTsKKyAgICAgICAgdmFyIGxvb25leSA9IG5ldyBJbnNhbml0eSgpOwogICAgICAgICBzZWNvbmRfbWFwLnNldChOdW1iZXJ6LlNJWCwgbG9vbmV5KTsKIAogICAgICAgICB2YXIgaW5zYW5lID0gbmV3IEludDY0TWFwPCBJbnRNYXA8IEluc2FuaXR5Pj4oKTsKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvQ01ha2VMaXN0cy50eHQgYi90ZXN0L2hzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2EzZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTE0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc2V0KGhzX3Rlc3RfZ2VuCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Db25zdGFudHNEZW1vX0NvbnN0cy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvQ29uc3RhbnRzRGVtb19UeXBlcy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvRGVidWdQcm90b1Rlc3RfQ29uc3RzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9EZWJ1Z1Byb3RvVGVzdF9UeXBlcy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvRW1wdHlTZXJ2aWNlX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvRW1wdHlTZXJ2aWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9FbXB0eVNlcnZpY2VfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luY2x1ZGVfQ29uc3RzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9JbmNsdWRlX1R5cGVzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Jbmhlcml0ZWRfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Jbmhlcml0ZWQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luaGVyaXRlZF9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvUmV2ZXJzZU9yZGVyU2VydmljZV9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1JldmVyc2VPcmRlclNlcnZpY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1JldmVyc2VPcmRlclNlcnZpY2VfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlY29uZFNlcnZpY2VfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZWNvbmRTZXJ2aWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZWNvbmRTZXJ2aWNlX0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZXJ2aWNlRm9yRXhjZXB0aW9uV2l0aEFNYXBfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZXJ2aWNlRm9yRXhjZXB0aW9uV2l0aEFNYXAuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlcnZpY2VGb3JFeGNlcHRpb25XaXRoQU1hcF9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU3J2X0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU3J2LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TcnZfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1RocmlmdFRlc3RfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0X0NvbnN0cy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdF9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdF9UeXBlcy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvWW93emFfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Zb3d6YS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvWW93emFfSWZhY2UuaHMKKykKKworc2V0KGhzX2Nyb3NzdGVzdF9hcHBzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1Rlc3RTZXJ2ZXIKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vVGVzdENsaWVudAorKQorc2V0KGhzX2Nyb3NzdGVzdF9hcmdzCisgICAgLWlnZW4taHMKKyAgICAtb2Rpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICAtaGlkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CispCisKK2lmIChDTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJEZWJ1ZyIpCisgIHNldChoc19vcHRpbWl6ZSAtTzApCitlbHNlKCkKKyAgc2V0KGhzX29wdGltaXplIC1PMSkKK2VuZGlmKCkKKworYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAke2hzX2Nyb3NzdGVzdF9hcHBzfQorICAgIENPTU1BTkQgJHtHSEN9ICR7aHNfb3B0aW1pemV9ICR7aHNfY3Jvc3N0ZXN0X2FyZ3N9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9UZXN0U2VydmVyLmhzIC1vIFRlc3RTZXJ2ZXIKKyAgICBDT01NQU5EICR7R0hDfSAke2hzX29wdGltaXplfSAke2hzX2Nyb3NzdGVzdF9hcmdzfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vVGVzdENsaWVudC5ocyAtbyBUZXN0Q2xpZW50CisgICAgREVQRU5EUyAke2hzX3Rlc3RfZ2VufSBoYXNrZWxsX2xpYnJhcnkgVGVzdFNlcnZlci5ocyBUZXN0Q2xpZW50LmhzCispCithZGRfY3VzdG9tX3RhcmdldChoYXNrZWxsX2Nyb3NzdGVzdCBBTEwKKyAgICBDT01NRU5UICJCdWlsZGluZyBIYXNrZWxsIGNyb3NzIHRlc3QgZXhlY3V0YWJsZXMiCisgICAgREVQRU5EUyAke2hzX2Nyb3NzdGVzdF9hcHBzfQorKQorCitzZXQoaHNfdGVzdF9zb3VyY2VzCisgICAgQ29uc3RhbnRzRGVtb19NYWluLmhzCisgICAgRGVidWdQcm90b1Rlc3RfTWFpbi5ocworICAgIEluY2x1ZGVfTWFpbi5ocworICAgIFRocmlmdFRlc3RfTWFpbi5ocworKQorc2V0KGhzX3Rlc3RfYXJncworICAgIC1XYWxsCisgICAgLVhTY29wZWRUeXBlVmFyaWFibGVzCisgICAgLWkke1BST0pFQ1RfU09VUkNFX0RJUn0vbGliL2hzL3NyYworICAgIC1pJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocworKQorYWRkX2N1c3RvbV90YXJnZXQoaGFza2VsbF90ZXN0cyBBTEwgREVQRU5EUyAke2hzX3Rlc3RfZ2VufSkKK2ZvcmVhY2goU1JDICR7aHNfdGVzdF9zb3VyY2VzfSkKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KEJBU0UgJHtTUkN9IE5BTUVfV0UpCisgICAgYWRkX3Rlc3QoTkFNRSBIYXNrZWxsVGVzdHMtJHtCQVNFfQorICAgICAgICBDT01NQU5EICR7UlVOX0hBU0tFTEx9ICR7aHNfdGVzdF9hcmdzfSAke1NSQ30KKyAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorZW5kZm9yZWFjaCgpCisKK3NldChoc190ZXN0X2dlbl9zb3VyY2VzCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0luY2x1ZGUudGhyaWZ0CispCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUICR7aHNfdGVzdF9nZW59CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gaHMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBocyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBocyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGhzICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0luY2x1ZGUudGhyaWZ0CisgICAgREVQRU5EUyAke2hzX3Rlc3RfZ2VuX3NvdXJjZXN9CispCmRpZmYgLS1naXQgYS90ZXN0L2hzL0RlYnVnUHJvdG9UZXN0X01haW4uaHMgYi90ZXN0L2hzL0RlYnVnUHJvdG9UZXN0X01haW4uaHMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9NYWtlZmlsZS5hbSBiL3Rlc3QvaHMvTWFrZWZpbGUuYW0KaW5kZXggZTE3MTI0OC4uODE3MDcwZCAxMDA2NDQKLS0tIGEvdGVzdC9ocy9NYWtlZmlsZS5hbQorKysgYi90ZXN0L2hzL01ha2VmaWxlLmFtCkBAIC0xNyw5ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCi1zdHViczogLi4vQ29uc3RhbnRzRGVtby50aHJpZnQgLi4vRGVidWdQcm90b1Rlc3QudGhyaWZ0IC4uL1RocmlmdFRlc3QudGhyaWZ0IC4uL0luY2x1ZGUudGhyaWZ0CitzdHViczogJChUSFJJRlQpIC4uL0NvbnN0YW50c0RlbW8udGhyaWZ0IC4uL0RlYnVnUHJvdG9UZXN0LnRocmlmdCAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9JbmNsdWRlLnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBocyAuLi9Db25zdGFudHNEZW1vLnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBocyAuLi9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gaHMgLi4vVGhyaWZ0VGVzdC50aHJpZnQKQEAgLTMyLDEwICszMCwyMSBAQAogCXNoIHJ1bi10ZXN0LnNoIEluY2x1ZGUKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLWhzCisJJChSTSkgLXIgZ2VuLWhzLwogCSQoUk0pICouaGkKIAkkKFJNKSAqLm8KKwkkKFJNKSBUZXN0Q2xpZW50CisJJChSTSkgVGVzdFNlcnZlcgorCitkaXN0LWhvb2s6CisJJChSTSkgLXIgJChkaXN0ZGlyKS9nZW4taHMvCisJJChSTSkgJChkaXN0ZGlyKS8qLmhpCisJJChSTSkgJChkaXN0ZGlyKS8qLm8KKwkkKFJNKSAkKGRlc3RkaXIpL1Rlc3RDbGllbnQKKwkkKFJNKSAkKGRlc3RkaXIpL1Rlc3RTZXJ2ZXIKIAogYWxsLWxvY2FsOiBzdHVicwogCWdoYyAtaWdlbi1ocyBUZXN0U2VydmVyLmhzCiAJZ2hjIC1pZ2VuLWhzIFRlc3RDbGllbnQuaHMKKworcHJlY3Jvc3M6IGFsbC1sb2NhbApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9UZXN0Q2xpZW50LmhzIGIvdGVzdC9ocy9UZXN0Q2xpZW50LmhzCmluZGV4IDA1N2E1NjAuLjkzZmI1OTEgMTAwNjQ0Ci0tLSBhL3Rlc3QvaHMvVGVzdENsaWVudC5ocworKysgYi90ZXN0L2hzL1Rlc3RDbGllbnQuaHMKQEAgLTI5LDcgKzI5LDYgQEAKIGltcG9ydCBOZXR3b3JrLlVSSQogaW1wb3J0IFN5c3RlbS5FbnZpcm9ubWVudAogaW1wb3J0IFN5c3RlbS5FeGl0Ci1pbXBvcnQgU3lzdGVtLlBvc2l4LlVuaXN0ZAogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoU2V0IGFzIFNldApAQCAtNDcsNiArNDYsNyBAQAogaW1wb3J0IFRocmlmdC5Qcm90b2NvbAogaW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5IZWFkZXIKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSlNPTgogCiBkYXRhIE9wdGlvbnMgPSBPcHRpb25zCkBAIC04NiwxMiArODYsMTQgQEAKIGRhdGEgUHJvdG9jb2xUeXBlID0gQmluYXJ5CiAgICAgICAgICAgICAgICAgICB8IENvbXBhY3QKICAgICAgICAgICAgICAgICAgIHwgSlNPTgorICAgICAgICAgICAgICAgICAgfCBIZWFkZXIKICAgICAgICAgICAgICAgICAgIGRlcml2aW5nIChTaG93LCBFcSkKIAogZ2V0UHJvdG9jb2wgOjogU3RyaW5nIC0+IFByb3RvY29sVHlwZQogZ2V0UHJvdG9jb2wgImJpbmFyeSIgID0gQmluYXJ5CiBnZXRQcm90b2NvbCAiY29tcGFjdCIgPSBDb21wYWN0CiBnZXRQcm90b2NvbCAianNvbiIgICAgPSBKU09OCitnZXRQcm90b2NvbCAiaGVhZGVyIiA9IEhlYWRlcgogZ2V0UHJvdG9jb2wgcCA9IGVycm9yICQgIlVuc3VwcG9ydGVkIFByb3RvY29sOiAiICsrIHAKIAogZGVmYXVsdE9wdGlvbnMgOjogT3B0aW9ucwpAQCAtMTA1LDcgKzEwNyw3IEBACiAgICwgdGVzdExvb3BzICAgID0gMQogICB9CiAKLXJ1bkNsaWVudCA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBJTyAoKQorcnVuQ2xpZW50IDo6IFByb3RvY29sIHAgPT4gcCAtPiBJTyAoKQogcnVuQ2xpZW50IHAgPSBkbwogICBsZXQgcHJvdCA9IChwLHApCiAgIHB1dFN0ckxuICJTdGFydGluZyBUZXN0cyIKQEAgLTE2OSwxMyArMTcxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgfQogICBwdXRTdHJMbiAidGVzdE5lc3QiCiAgIG5lc3RPdXQgPC0gQ2xpZW50LnRlc3ROZXN0IHByb3QgbmVzdEluCi0gIHdoZW4gKG5lc3RJbiAvPSBuZXN0T3V0KSBleGl0U3VjY2VzcworICB3aGVuIChuZXN0SW4gLz0gbmVzdE91dCkgZXhpdEZhaWx1cmUKIAogICAtLSBNYXAgVGVzdAogICBsZXQgbWFwSW4gPSBNYXAuZnJvbUxpc3QgJCBtYXAgKFxpIC0+IChpLCBpLTEwKSkgWzEuLjVdCiAgIHB1dFN0ckxuICJ0ZXN0TWFwIgogICBtYXBPdXQgPC0gQ2xpZW50LnRlc3RNYXAgcHJvdCBtYXBJbgotICB3aGVuIChtYXBJbiAvPSBtYXBPdXQpIGV4aXRTdWNjZXNzCisgIHdoZW4gKG1hcEluIC89IG1hcE91dCkgZXhpdEZhaWx1cmUKIAogICAtLSBTZXQgVGVzdAogICBsZXQgc2V0SW4gPSBTZXQuZnJvbUxpc3QgWy0yLi4zXQpAQCAtMjY3LDYgKzI2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeSAgLT4gcnVuQ2xpZW50ICQgQmluYXJ5UHJvdG9jb2wgdAogICAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0IC0+IHJ1bkNsaWVudCAkIENvbXBhY3RQcm90b2NvbCB0CiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04gICAgLT4gcnVuQ2xpZW50ICQgSlNPTlByb3RvY29sIHQKKyAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyICAtPiBjcmVhdGVIZWFkZXJQcm90b2NvbCB0IHQgPj49IHJ1bkNsaWVudAogICAgIHJ1blRlc3QgbG9vcHMgcCB0ID0gZG8KICAgICAgIGxldCBjbGllbnQgPSBtYWtlQ2xpZW50IHAgdAogICAgICAgcmVwbGljYXRlTV8gbG9vcHMgY2xpZW50CmRpZmYgLS1naXQgYS90ZXN0L2hzL1Rlc3RTZXJ2ZXIuaHMgYi90ZXN0L2hzL1Rlc3RTZXJ2ZXIuaHMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBhODgwYTVlLi5iNzczMWFiCi0tLSBhL3Rlc3QvaHMvVGVzdFNlcnZlci5ocworKysgYi90ZXN0L2hzL1Rlc3RTZXJ2ZXIuaHMKQEAgLTMxLDcgKzMxLDcgQEAKIGltcG9ydCBTeXN0ZW0uRW52aXJvbm1lbnQKIGltcG9ydCBTeXN0ZW0uRXhpdAogaW1wb3J0IFN5c3RlbS5JTwotaW1wb3J0IFN5c3RlbS5Qb3NpeC5VbmlzdGQKK2ltcG9ydCBDb250cm9sLkNvbmN1cnJlbnQgKHRocmVhZERlbGF5KQogaW1wb3J0IHF1YWxpZmllZCBTeXN0ZW0uSU8gYXMgSU8KIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoU2V0IGFzIFNldApAQCAtNDgsNiArNDgsNyBAQAogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlCiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQogaW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkhlYWRlcgogaW1wb3J0IFRocmlmdC5Qcm90b2NvbC5KU09OCiAKIGRhdGEgT3B0aW9ucyA9IE9wdGlvbnMKQEAgLTkwLDExICs5MSwxMyBAQAogZGF0YSBQcm90b2NvbFR5cGUgPSBCaW5hcnkKICAgICAgICAgICAgICAgICAgIHwgQ29tcGFjdAogICAgICAgICAgICAgICAgICAgfCBKU09OCisgICAgICAgICAgICAgICAgICB8IEhlYWRlcgogCiBnZXRQcm90b2NvbCA6OiBTdHJpbmcgLT4gUHJvdG9jb2xUeXBlCiBnZXRQcm90b2NvbCAiYmluYXJ5IiAgPSBCaW5hcnkKIGdldFByb3RvY29sICJjb21wYWN0IiA9IENvbXBhY3QKIGdldFByb3RvY29sICJqc29uIiAgICA9IEpTT04KK2dldFByb3RvY29sICJoZWFkZXIiICA9IEhlYWRlcgogZ2V0UHJvdG9jb2wgcCA9IGVycm9yICQiVW5zdXBwb3J0ZWQgUHJvdG9jb2w6ICIgKysgcAogCiBkZWZhdWx0T3B0aW9ucyA6OiBPcHRpb25zCkBAIC0yMzUsMTMgKzIzOCwxMyBAQAogICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0TXVsdGlFeGNlcHRpb24oIiArKyBzaG93IHMxICsrICIsICIgKysgc2hvdyBzMiArKyAgIikiCiAgICAgY2FzZSBzMSBvZgogICAgICAgIlhjZXB0aW9uIiAgIC0+IHRocm93ICQgWGNlcHRpb24gMTAwMSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKLSAgICAgICJYY2VwdGlvbjIiICAtPiB0aHJvdyAkIFhjZXB0aW9uMiAyMDAyIGRlZmF1bHRfWHRydWN0CisgICAgICAiWGNlcHRpb24yIiAgLT4gdGhyb3cgJCBYY2VwdGlvbjIgMjAwMiAkIFh0cnVjdCAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiIDAgMCAwCiAgICAgICAiVEV4Y2VwdGlvbiIgLT4gdGhyb3cgVGhyaWZ0RXhjZXB0aW9uCiAgICAgICBfIC0+IHJldHVybiBkZWZhdWx0X1h0cnVjdHsgeHRydWN0X3N0cmluZ190aGluZyA9IHMyIH0KIAogICB0ZXN0T25ld2F5IF8gaSA9IGRvCiAgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RPbmV3YXkoIiArKyBzaG93IGkgKysgIik6IFNsZWVwaW5nLi4uIgotICAgIHNsZWVwIChmcm9tSW50ZWdyYWwgaSkKKyAgICB0aHJlYWREZWxheSAkIChmcm9tSW50ZWdyYWwgaSkgKiAxMDAwMDAwCiAgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RPbmV3YXkoIiArKyBzaG93IGkgKysgIik6IGRvbmUgc2xlZXBpbmchIgogCiBtYWluIDo6IElPICgpCkBAIC0yNjEsMTMgKzI2NCwxOSBAQAogICAgICAgICAgIHQgPC0gZiBzb2NrZXQKICAgICAgICAgICByZXR1cm4gKHAgdCwgcCB0KQogCisgICAgICAgIGhlYWRlckFjY2VwdG9yIGYgc29ja2V0ID0gZG8KKyAgICAgICAgICB0IDwtIGYgc29ja2V0CisgICAgICAgICAgcCA8LSBjcmVhdGVIZWFkZXJQcm90b2NvbDEgdAorICAgICAgICAgIHJldHVybiAocCwgcCkKKwogICAgICAgICBkb1J1blNlcnZlciBwIGYgPSBkbwogICAgICAgICAgIHJ1blRocmVhZGVkU2VydmVyIChhY2NlcHRvciBwIGYpIFRlc3RIYW5kbGVyIFRocmlmdFRlc3QucHJvY2VzcyAuIFBvcnROdW1iZXIgLiBmcm9tSW50ZWdyYWwKIAogICAgICAgICBydW5TZXJ2ZXIgcCBmIHBvcnQgPSBjYXNlIHAgb2YKLSAgICAgICAgICBCaW5hcnkgIC0+IGRvIGRvUnVuU2VydmVyIEJpbmFyeVByb3RvY29sIGYgcG9ydAotICAgICAgICAgIENvbXBhY3QgLT4gZG8gZG9SdW5TZXJ2ZXIgQ29tcGFjdFByb3RvY29sIGYgcG9ydAotICAgICAgICAgIEpTT04gICAgLT4gZG8gZG9SdW5TZXJ2ZXIgSlNPTlByb3RvY29sIGYgcG9ydAorICAgICAgICAgIEJpbmFyeSAgLT4gZG9SdW5TZXJ2ZXIgQmluYXJ5UHJvdG9jb2wgZiBwb3J0CisgICAgICAgICAgQ29tcGFjdCAtPiBkb1J1blNlcnZlciBDb21wYWN0UHJvdG9jb2wgZiBwb3J0CisgICAgICAgICAgSlNPTiAgICAtPiBkb1J1blNlcnZlciBKU09OUHJvdG9jb2wgZiBwb3J0CisgICAgICAgICAgSGVhZGVyICAtPiBydW5UaHJlYWRlZFNlcnZlciAoaGVhZGVyQWNjZXB0b3IgZikgVGVzdEhhbmRsZXIgVGhyaWZ0VGVzdC5wcm9jZXNzIChQb3J0TnVtYmVyICQgZnJvbUludGVncmFsIHBvcnQpCiAKIHBhcnNlRmxhZ3MgOjogW1N0cmluZ10gLT4gT3B0aW9ucyAtPiBNYXliZSBPcHRpb25zCiBwYXJzZUZsYWdzIChmbGFnIDogZmxhZ3MpIG9wdHMgPSBkbwpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9UaHJpZnRUZXN0X01haW4uaHMgYi90ZXN0L2hzL1RocmlmdFRlc3RfTWFpbi5ocwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS90ZXN0L2luZGV4Lmh0bWwgYi90ZXN0L2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxMWE5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaW5kZXguaHRtbApAQCAtMCwwICsxLDUxIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzwhRE9DVFlQRSBIVE1MPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKzx0aXRsZT5BcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZTwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuNC9jc3MvanF1ZXJ5LmRhdGFUYWJsZXMuY3NzIj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0yLjEuMy5taW4uanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9Imh0dHA6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvMS4xMC40L2pzL2pxdWVyeS5kYXRhVGFibGVzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJyZXN1bHQuanMiPgorPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMj5BcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZTogUmVzdWx0czwvaDI+Cis8dGFibGUgaWQ9InRlc3RfcmVzdWx0cyIgY2xhc3M9ImRpc3BsYXkiPgorICAgIDx0aGVhZD4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlNlcnZlcjwvdGg+CisgICAgICAgICAgICA8dGg+Q2xpZW50PC90aD4KKyAgICAgICAgICAgIDx0aD5Qcm90b2NvbDwvdGg+CisgICAgICAgICAgICA8dGg+VHJhbnNwb3J0PC90aD4KKyAgICAgICAgICAgIDx0aD5SZXN1bHQgKGxvZyk8L3RoPgorICAgICAgICAgICAgPHRoPkV4cGVjdGVkPC90aD4KKyAgICAgICAgPC90cj4KKyAgICA8L3RoZWFkPgorPC90YWJsZT4KKzxoMj5UZXN0IEluZm9ybWF0aW9uPC9oMj4KKzxwcmUgaWQ9InRlc3RfaW5mbyI+PC9wcmU+CisKKzxhIGhyZWY9ImxvZyI+YnJvd3NlIHJhdyBsb2c8L2E+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9SRUFETUUubWQgYi90ZXN0L2tleXMvUkVBRE1FLm1kCmluZGV4IDUzZmUwY2MuLjAxMDgzNWQgMTAwNzU1Ci0tLSBhL3Rlc3Qva2V5cy9SRUFETUUubWQKKysrIGIvdGVzdC9rZXlzL1JFQURNRS5tZApAQCAtMjYsNyArMjYsNyBAQAogICAgIG9wZW5zc2wgeDUwOSAtaW4gc2VydmVyLmNydCAtdGV4dCA+IENBLnBlbQogICAgIGNhdCBzZXJ2ZXIuY3J0IHNlcnZlci5rZXkgPiBzZXJ2ZXIucGVtCiAKLUV4cG9ydCBwYXNzd29yZCBpcyAqKnRocmlmdCoqCitFeHBvcnQgcGFzc3dvcmQgaXMgInRocmlmdCIgd2l0aG91dCB0aGUgcXVvdGVzCiAKICAgICBvcGVuc3NsIHBrY3MxMiAtZXhwb3J0IC1jbGNlcnRzIC1pbiBzZXJ2ZXIuY3J0IC1pbmtleSBzZXJ2ZXIua2V5IC1vdXQgc2VydmVyLnAxMgogCkBAIC00MCw5ICs0MCw5IEBACiAKIHNpZ24gdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBzZXJ2ZXIua2V5CiAKLSAgICBvcGVuc3NsIHg1MDkgLXJlcSAtZGF5cyAzNjUgLWluIGNsaWVudC5jc3IgLUNBIENBLnBlbSAtQ0FrZXkgc2VydmVyLmtleSAtc2V0X3NlcmlhbCAwMSAtb3V0IGNsaWVudC5jcnQKKyAgICBvcGVuc3NsIHg1MDkgLXJlcSAtZGF5cyAzMDAwIC1pbiBjbGllbnQuY3NyIC1DQSBDQS5wZW0gLUNBa2V5IHNlcnZlci5rZXkgLXNldF9zZXJpYWwgMDEgLW91dCBjbGllbnQuY3J0CiAKLWV4cG9ydCBjZXJ0aWZpY2F0ZSBpbiBQS0NTMTIgZm9ybWF0IChFeHBvcnQgcGFzc3dvcmQgaXMgKip0aHJpZnQqKikKK2V4cG9ydCBjZXJ0aWZpY2F0ZSBpbiBQS0NTMTIgZm9ybWF0IChFeHBvcnQgcGFzc3dvcmQgaXMgInRocmlmdCIgd2l0aG91dCB0aGUgcXVvdGVzKQogCiAgICAgb3BlbnNzbCBwa2NzMTIgLWV4cG9ydCAtY2xjZXJ0cyAtaW4gY2xpZW50LmNydCAtaW5rZXkgY2xpZW50LmtleSAtb3V0IGNsaWVudC5wMTIKIApAQCAtNTAsOSArNTAsMjggQEAKIAogICAgIG9wZW5zc2wgcGtjczEyIC1pbiBjbGllbnQucDEyIC1vdXQgY2xpZW50LnBlbSAtY2xjZXJ0cwogCisjIyMgY3JlYXRlIGNsaWVudCBrZXkgYW5kIGNlcnRpZmljYXRlIHdpdGggYWx0bmFtZXMKKworY29weSBvcGVuc3NsLmNuZiBmcm9tIHlvdXIgc3lzdGVtIGUuZy4gL2V0Yy9zc2wvb3BlbnNzbC5jbmYgYW5kIGFwcGVuZCBmb2xsb3dpbmcgdG8gdGhlIGVuZCBvZiBbIHYzX3JlcSBdCisKKyAgICBzdWJqZWN0QWx0TmFtZT1AYWx0ZXJuYXRlX25hbWVzCisKKyAgICBbIGFsdGVybmF0ZV9uYW1lcyBdCisgICAgSVAuMT0xMjcuMC4wLjEKKyAgICBJUC4yPTo6MQorICAgIElQLjM9OjpmZmZmOjEyNy4wLjAuMQorCitjcmVhdGUgYSBzaWduaW5nIHJlcXVlc3Q6CisKKyAgICBvcGVuc3NsIHJlcSAtbmV3IC1rZXkgY2xpZW50X3YzLmtleSAtb3V0IGNsaWVudF92My5jc3IgLWNvbmZpZyBvcGVuc3NsLmNuZiBcCisgICAgICAgIC1zdWJqICIvQz1VUy9TVD1NYXJ5bGFuZC9MPUZvcmVzdCBIaWxsL089VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uL09VPUFwYWNoZSBUaHJpZnQvQ049bG9jYWxob3N0IiAtZXh0ZW5zaW9ucyB2M19yZXEKKworc2lnbiB0aGUgY2xpZW50IGNlcnRpZmljYXRlIHdpdGggdGhlIHNlcnZlci5rZXkKKworICAgIG9wZW5zc2wgeDUwOSAtcmVxIC1kYXlzIDMwMDAgLWluIGNsaWVudF92My5jc3IgLUNBIENBLnBlbSAtQ0FrZXkgc2VydmVyLmtleSAtc2V0X3NlcmlhbCAwMSAtb3V0IGNsaWVudF92My5jcnQgLWV4dGVuc2lvbnMgdjNfcmVxIC1leHRmaWxlIG9wZW5zc2wuY25mCiAKICMjIEphdmEga2V5IGFuZCBjZXJ0aWZpY2F0ZSBpbXBvcnQKLUphdmEgVGVzdCBFbnZpcm9ubWVudCB1c2VzIGtleSBhbmQgdHJ1c3Qgc3RvcmUgcGFzc3dvcmQgKip0aHJpZnQqKgorSmF2YSBUZXN0IEVudmlyb25tZW50IHVzZXMga2V5IGFuZCB0cnVzdCBzdG9yZSBwYXNzd29yZCAidGhyaWZ0IiB3aXRob3V0IHRoZSBxdW90ZXMKIAogbGlzdCBrZXlzdG9yZSBlbnRyaWVzCiAKQEAgLTY1LDcgKzg0LDcgQEAKIAogZGVsZXRlIGFuIGVudHJ5CiAKLSAgICBrZXl0b29sIC1kZWxldGUgLXN0b3JlcGFzcyB0aHJpZnQgLWtleXN0b3JlIC4uLy4uL2xpYi9qYXZhL3Rlc3QvLnRydXN0c3RvcmUgLWFsaWFzIHNzbHRlc3QgCisgICAga2V5dG9vbCAtZGVsZXRlIC1zdG9yZXBhc3MgdGhyaWZ0IC1rZXlzdG9yZSAuLi8uLi9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlIC1hbGlhcyBzc2x0ZXN0CiAKIAogaW1wb3J0IGNlcnRpZmljYXRlIGludG8gdHJ1c3RzdG9yZQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudC5jcnQgYi90ZXN0L2tleXMvY2xpZW50LmNydAppbmRleCA2NDUyNmY2Li44MGE5YWQwIDEwMDY0NAotLS0gYS90ZXN0L2tleXMvY2xpZW50LmNydAorKysgYi90ZXN0L2tleXMvY2xpZW50LmNydApAQCAtMSwyMCArMSwyMyBAQAogLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlEVkRDQ0Fqd0NBUUV3RFFZSktvWklodmNOQVFFRkJRQXdnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lECitNSUlEMkRDQ0FzQUNBUUV3RFFZSktvWklodmNOQVFFTEJRQXdnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lECiBWUVFJREFoTllYSjViR0Z1WkRFVU1CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvCiBaU0JCY0dGamFHVWdVMjltZEhkaGNtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvCiBjbWxtZERFU01CQUdBMVVFQXd3SmJHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5Ci1hV1owTG1Gd1lXTm9aUzV2Y21jd0hoY05NVFF3TkRBM01Ua3dNRE16V2hjTk1UVXdOREEzTVRrd01ETXpXakNCCithV1owTG1Gd1lXTm9aUzV2Y21jd0hoY05NVFV4TWpJek1EY3dOelV3V2hjTk1qUXdNekV3TURjd056VXdXakNCCiBzVEVMTUFrR0ExVUVCaE1DVlZNeEVUQVBCZ05WQkFnTUNFMWhjbmxzWVc1a01SUXdFZ1lEVlFRSERBdEdiM0psCiBjM1FnU0dsc2JERW5NQ1VHQTFVRUNnd2VWR2hsSUVGd1lXTm9aU0JUYjJaMGQyRnlaU0JHYjNWdVpHRjBhVzl1CiBNUll3RkFZRFZRUUxEQTFCY0dGamFHVWdWR2h5YVdaME1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXhKREFpCi1CZ2txaGtpRzl3MEJDUUVXRldSbGRrQjBhSEpwWm5RdVlYQmhZMmhsTG05eVp6Q0JuekFOQmdrcWhraUc5dzBCCi1BUUVGQUFPQmpRQXdnWWtDZ1lFQXJyTTJIaVRmNUxUMVFoMUpBQUxXVWxKeFZKTmMxdUM4Ly93WklXOEVrazZ6Ci1IMlhrckFPVzhDczdyVmZ6NlEreDAwcTd4U0g4MjV2OVJMNnB2NGw3c1BEU0dLNWx2YytXa1R4RHBpUjJFakltCi11V1N0VXpDUnE3RVhoVjUwcFVubzZNRkFCVnRxcFJQODdUaUUxbDdZYjhTMzN2K2dBVmRzcnBKZXdZSUR3V2NDCi1Bd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWJHakhMYW1EbTFGUXBnYXRZaVovaWM3WjhERkIrQ0pvCi1GY1pINGh3dzI3QkQvV3BRTHNqNlQxNTQwQjM1aHNtWjczeWV2NHhnTHliYy9TRUlkdWNUOUJIeWMxRHJEWnRmCi1DRmVTcTZPT0p1LzFwSlo5bS9kMGkrc0JKYVdnNXcxeVQ4K2FFS0phV1lmRitDOWpaNiszK0k5YWdJRDVPcGxFCi1Xd3d6ZzN4WGxsejNqZm10TmxjMGYraEUxL1hMV0ZFMm5ZKzVjQmhseFJlV0gzSEFoVS9xWkw5bi9XZHhDakhkCi1OeWVXeGxEbG16YzIrdU9lVkY1c0lHekZPai9xakd4YytVeVVYYWFFdVN2aDdqM3J2WWxadG5odmhKK3RNa29SCi1LYnhsMVZVWXh4K2p6ZmhCeStiS3U1dUdaQjNGMXF0eVk5Zkk1RFF1dDc1bk5idWVRUEcrcXc9PQorQmdrcWhraUc5dzBCQ1FFV0ZXUmxka0IwYUhKcFpuUXVZWEJoWTJobExtOXlaekNDQVNJd0RRWUpLb1pJaHZjTgorQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxsL2JKaGcxN1B1MXQ3ODVKSXV3bGg3ZTJFNTFlb1dGdnV4TVdmSAorZHNVQVZxRGFPejk5TzVzdjhwZ1dLWHJrUEJ0dEU5OFQrTXgvUHd6NUpIczRRY3JlM0E1YWRtNmNkYWIwQUt1ZworZVZHMVB2SHJXelY0YWhlZzRLVWZWU2lNejhCRzJLM1ExVkd2WmtnTVJhL1E0MDlGS2pVNlo0RDl2Qkc0UGFzMworUE41RnhuQUw2UDcweVdDRXIyVnUvdFdKbENOK3FyUkRmU2FFMmhxbVQxaXJ4YW9QYTYxR3Z1UlZzR1EzVGVvRQorbUdmRU50dkZxQzZxUVd1U0NiRzVhSTQ3UnY2NnBxb1dXeHFrcmNvbE5jNyt2aHg2clcrd2RGTzNJbHFJVDhJRworc2RRVnArWTRpci9kR3AyZWp6cUdaQ3JlbVBKMXVFS2pMTXBJdWtkZzI1eW1IQzBDQXdFQUFUQU5CZ2txaGtpRworOXcwQkFRc0ZBQU9DQVFFQUJjUmR3YzltZFk5ek92VGl4dFRoSHJjaVZ2cXdwNlJhaVFxTUVWb21vellpbFpEUgorSjkwTTNINktubEFESmJDdjBGWHVqc2FBcEI1M2F3cTVJN3NPYkFZV0ZoREpaOUxLbHcwbERGN0tjaExYaUFsaworWFZ5dkwybkpqdUpjeFBDRlBXa3R3cnc1YlRndVJDQnpHMTJIemlrbit4czZ1UHVyN1ZRWU0zM2piWEVkYTVQUworVUVxdkFWV2FPTkpDWDhNRFlPc2NWb0pGMEVTeUkrZk45MmlwRmFYUjdmR2Fqb2QvcmMwQWZlTjJHVk1aRVR2ZQorMjFwa1V5RHd3Q0dBNDR1dk5VQ2QxZTMyTnhFM2FoOVVBcENSbjVzR0o2NFI2dXJwRlRYVDNJQUxGM2thT083VQorVnNNaEZyVWlaNytCdzVuSWVpSzBRT0Y2RWlwaitiSnZyTFpwU2c9PQogLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudC5rZXkgYi90ZXN0L2tleXMvY2xpZW50LmtleQppbmRleCA3MDNlMDQ1Li4yNWRjZmQ3IDEwMDY0NAotLS0gYS90ZXN0L2tleXMvY2xpZW50LmtleQorKysgYi90ZXN0L2tleXMvY2xpZW50LmtleQpAQCAtMSwxNSArMSwyNyBAQAogLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQotTUlJQ1hBSUJBQUtCZ1FDdXN6WWVKTi9rdFBWQ0hVa0FBdFpTVW5GVWsxelc0THovL0JraGJ3U1NUck1mWmVTcwotQTVid0t6dXRWL1BwRDdIVFNydkZJZnpibS8xRXZxbS9pWHV3OE5JWXJtVzl6NWFSUEVPbUpIWVNNaWE1WksxVAotTUpHcnNSZUZYblNsU2Vqb3dVQUZXMnFsRS96dE9JVFdYdGh2eExmZS82QUJWMnl1a2w3QmdnUEJad0lEQVFBQgotQW9HQVgxVVdYQjY5T3Yzd3RISnNxcC9odXF5WWdaR2s0UEZrMGNBTktxeDlieVdaSTdJanRpYURVRzRYTThIQwotTFZWT01jSWZjelRYMmpObVl3UTBkM3diell4NXhJNHAxS3BkeFoyWktkaWx4ZFVQU0N1c0tLQ080V1JFLzVqQwotOGlXMmN6eE1lamNLZ2QyOXRuRUpZL1pnMmpYYmUreXE3TFNFZStwTHZ6TkdaaGtDUVFEZ0t3UG9EMVZsMGJ5dQotNDZtcUlEdzdyanFEVXUxNHZZMVM3RVk5TlNydXdvNVNkb25xdFhucmJGT3U1dW1Oc0NKMnlTbythRkx3ZU5QRQotM21UaURMRXJBa0VBeDRIdC84UHFjT3lKZ29La3EwemtSOHRxUEh0MWhvYXo0WCtRZmZxaGRPL0pVTTJoV280UQotVmJOV1hkRWRGaStGT2dVNk9lUmlwb211UG9vZlFkUjZ0UUpBQ29xN1VreDJUYVdCWkJBY3lIMWZsOGJueFlrKwotMWJERVZxUDU0YU1BYzkzK1oyNWZxZ1FDeWNsOFhmdEovSG5PQlJ3TXVvYVpiK21ldStGaGlTZmpwUUpCQUlPUgotTUxYUnFvS3J5b2N4eG94ZEdkSXEyRFZvcVhsOHpaVncvWVhHeWNFRy9MajMwbWVZZGpjK0hEK2tUczA1cTE4MgotNFU0YVNlQlB2WVBxckhCS1FsMENRR0NIMmtZNkVTeHNNU29YY2Y4VWgyV0tWL2lnSFNURVl0eDdyZTRSWGhzSwotMGZET3VQVHkvaFZBMERFVFBkZGZJNXdGcE9rS1NKV2Joa2NLK1RGZHJ6cz0KK01JSUVvd0lCQUFLQ0FRRUF1WDlzbUdEWHMrN1czdnpra2k3Q1dIdDdZVG5WNmhZVys3RXhaOGQyeFFCV29ObzcKK1AzMDdteS95bUJZcGV1UThHMjBUM3hQNHpIOC9EUGtrZXpoQnl0N2NEbHAyYnB4MXB2UUFxNkI1VWJVKzhldGIKK05YaHFGNkRncFI5VktJelB3RWJZcmREVlVhOW1TQXhGcjlEalQwVXFOVHBuZ1AyOEViZzlxemM4M2tYR2NBdm8KKy92VEpZSVN2Wlc3KzFZbVVJMzZxdEVOOUpvVGFHcVpQV0t2RnFnOXJyVWErNUZXd1pEZE42Z1NZWjhRMjI4V28KK0xxcEJhNUlKc2Jsb2pqdEcvcnFtcWhaYkdxU3R5aVUxenY2K0hIcXRiN0IwVTdjaVdvaFB3Z2F4MUJXbjVqaUsKK3Y5MGFuWjZQT29aa0t0Nlk4blc0UXFNc3lraTZSMkRibktZY0xRSURBUUFCQW9JQkFGb3RiQ21YeXNVYWN6THMKK1ZtSUtnVWhxbjB4Z3hYR0xVNWtBUnpoZ2E0alI1VXRGVEZCTkhWRVFPaXRkZXNUWGQ3RU5rZjk4d2hNSU9TcWgKK1krN1RKb2p0VnFWVHJRZVE0RkZOaFpYcDZaQ2pQL3B6cEYrV0xsMVdSRitCbi9DYW85U2huR3pEZlRDOHlFaDIKK1R0cHQvbE5uR0dIUUJzbGFrTGM4amg1U09ERUZmYnVnWDhTZFRDd1pZc2VzS05yWG0xcFMvNUlFdW5QcWFSaTAKK0lJMEVjbnFIRXNncVNvK0NsanBXN3VOeFNyeUEydlNBVmRsUGVqNis5RlpqZElITFA1QUVLWXZrN2U5RDJDTVYKKzErZ3JOZS9Ra1FwcFNoaXpQaXJiYjkzdEhtODZ2NWJrREZDTTl5V3JoY01janZJTE1YRVR4SXBwTUdQbWFjUnUKK2pxdFljQUVDZ1lFQThWRHp5bFR6NGtTMytEM24zaFRnYjQxWFZZYTdmZVVzaDk5R1dSTzF3WElGcEhqQ0lSakEKKzlyL0JYVzkrUngzcHVWUGhTOGh3TFE0QkxkQTdsRnBWMUM4YWcwZTMrdm42elZpcm56MWp0SSt1SE12U3R6aE8KK2Q2aTBuZit3NEhZWG83bU42bzlaZEhFZkM4U0ZOYnltaENvVktoMkRJTER3YjRFWDlSWE5weTBDZ1lFQXhNajQKKyt2cmtsSi9pbEgrUnkxenN0NHpRWUl3bW0zUVdqYXJEcnlwR3VjSGdkNGpnNXY5QS9DSklLVWk4eDBNanJjdU4KK3dWYjdSOFhKeVl6RlFSWElVWFI2R25MZWVTbmZweHp0NFlsaWZDdlh4bk9pOHc0ZnY3S2VHQlY1bnAxRWdwbzgKK25XTnlaRnhkdlFEdUNvcHIzU1VvUzlKSThKUHdWZ0E3VCs3RGFRRUNnWUFHb2F2aGJvNDVOSnc5cFMzZkM0SFQKK2J2WHNjc1JxUkVjQ0FOL0ZDT2FneDBwaVo3TW1CN0VkMXMwd2pTVFNQWDh6eVp0U1l0SzZXajBzRGlIbEJNcUIKK0J6NWFSemxHRzJLS0RCckRTSU9aN2F6aU83T3h0MGxvdm1rZ1FtdVE3NDNjd1BlbWI0UU0wQ01EUnNaR1lNWE8KK3NmMWM1K3kzbEVVM096djJUMEFValFLQmdCbG56T1V5TVFLVEpjQ0FPOFZpaU5rbG45MW5HckRsS3VnOVRLZzMKK3NBdlpZTzV0eUlOcUh1eXVURnl3SEZjcGJ0aklOOVBuTStmUFBENytJcFZGaDZna2ZvTWRvMlZISjYyK2lXT2QKK3hnNDc1czZqTFQxdDdHRm1ZUXpBOFFPdVVDTUFZS1Q5S3M2VU1qSHRoYzNza3dKcEFxdlBTVVZ1QkJCR1ZXSDcKK2RGVUJBb0dCQUw2N0FSTHVqaUFFVk5IdDVyYWppeEI2bmNsNy9SK1oydWF3STFKZm1kbkNab25BS1ZaWUh1WFUKKy80ajIrbzRRaEpJUEx0V0lvYXhBa01pZ1F0QWtlc3Fpcm4zS2svYzdrWlJJb041NDlIVEp1d1pxWXFOcDdDQi8KK2tWaTVSMzM1K005ejQ5aTZxQTBSWnNKR1NvU0JrN1B1Zkc0Um1MaW1jUmJHd3JZOTNzUEQKIC0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50LnAxMiBiL3Rlc3Qva2V5cy9jbGllbnQucDEyCmluZGV4IGE3ZDk1ZGYuLjVkMjY2OWMgMTAwNjQ0Ci0tLSBhL3Rlc3Qva2V5cy9jbGllbnQucDEyCisrKyBiL3Rlc3Qva2V5cy9jbGllbnQucDEyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnQucGVtIGIvdGVzdC9rZXlzL2NsaWVudC5wZW0KaW5kZXggZWU1YmM2MS4uNjZlZjYyNiAxMDA2NDQKLS0tIGEvdGVzdC9rZXlzL2NsaWVudC5wZW0KKysrIGIvdGVzdC9rZXlzL2NsaWVudC5wZW0KQEAgLTEsNDQgKzEsNjAgQEAKIEJhZyBBdHRyaWJ1dGVzCi0gICAgbG9jYWxLZXlJRDogMDUgM0MgNkEgOUQgNkQgRUMgQTAgRkEgMkYgQUUgNDEgMzIgMEQgMjQgM0EgMjEgMzQgRjYgMDggMTUgCisgICAgbG9jYWxLZXlJRDogMzkgRUMgM0QgNUIgMjggMTcgREEgREQgMDkgN0EgNjIgNjggRDUgNDQgMUYgQzcgRTIgRjggRTAgQ0QgCiBzdWJqZWN0PS9DPVVTL1NUPU1hcnlsYW5kL0w9Rm9yZXN0IEhpbGwvTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vT1U9QXBhY2hlIFRocmlmdC9DTj1sb2NhbGhvc3QvZW1haWxBZGRyZXNzPWRldkB0aHJpZnQuYXBhY2hlLm9yZwogaXNzdWVyPS9DPVVTL1NUPU1hcnlsYW5kL0w9Rm9yZXN0IEhpbGwvTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vT1U9QXBhY2hlIFRocmlmdC9DTj1sb2NhbGhvc3QvZW1haWxBZGRyZXNzPWRldkB0aHJpZnQuYXBhY2hlLm9yZwogLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlEVkRDQ0Fqd0NBUUV3RFFZSktvWklodmNOQVFFRkJRQXdnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lECitNSUlEMkRDQ0FzQUNBUUV3RFFZSktvWklodmNOQVFFTEJRQXdnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lECiBWUVFJREFoTllYSjViR0Z1WkRFVU1CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvCiBaU0JCY0dGamFHVWdVMjltZEhkaGNtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvCiBjbWxtZERFU01CQUdBMVVFQXd3SmJHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5Ci1hV1owTG1Gd1lXTm9aUzV2Y21jd0hoY05NVFF3TkRBM01Ua3dNRE16V2hjTk1UVXdOREEzTVRrd01ETXpXakNCCithV1owTG1Gd1lXTm9aUzV2Y21jd0hoY05NVFV4TWpJek1EY3dOelV3V2hjTk1qUXdNekV3TURjd056VXdXakNCCiBzVEVMTUFrR0ExVUVCaE1DVlZNeEVUQVBCZ05WQkFnTUNFMWhjbmxzWVc1a01SUXdFZ1lEVlFRSERBdEdiM0psCiBjM1FnU0dsc2JERW5NQ1VHQTFVRUNnd2VWR2hsSUVGd1lXTm9aU0JUYjJaMGQyRnlaU0JHYjNWdVpHRjBhVzl1CiBNUll3RkFZRFZRUUxEQTFCY0dGamFHVWdWR2h5YVdaME1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXhKREFpCi1CZ2txaGtpRzl3MEJDUUVXRldSbGRrQjBhSEpwWm5RdVlYQmhZMmhsTG05eVp6Q0JuekFOQmdrcWhraUc5dzBCCi1BUUVGQUFPQmpRQXdnWWtDZ1lFQXJyTTJIaVRmNUxUMVFoMUpBQUxXVWxKeFZKTmMxdUM4Ly93WklXOEVrazZ6Ci1IMlhrckFPVzhDczdyVmZ6NlEreDAwcTd4U0g4MjV2OVJMNnB2NGw3c1BEU0dLNWx2YytXa1R4RHBpUjJFakltCi11V1N0VXpDUnE3RVhoVjUwcFVubzZNRkFCVnRxcFJQODdUaUUxbDdZYjhTMzN2K2dBVmRzcnBKZXdZSUR3V2NDCi1Bd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWJHakhMYW1EbTFGUXBnYXRZaVovaWM3WjhERkIrQ0pvCi1GY1pINGh3dzI3QkQvV3BRTHNqNlQxNTQwQjM1aHNtWjczeWV2NHhnTHliYy9TRUlkdWNUOUJIeWMxRHJEWnRmCi1DRmVTcTZPT0p1LzFwSlo5bS9kMGkrc0JKYVdnNXcxeVQ4K2FFS0phV1lmRitDOWpaNiszK0k5YWdJRDVPcGxFCi1Xd3d6ZzN4WGxsejNqZm10TmxjMGYraEUxL1hMV0ZFMm5ZKzVjQmhseFJlV0gzSEFoVS9xWkw5bi9XZHhDakhkCi1OeWVXeGxEbG16YzIrdU9lVkY1c0lHekZPai9xakd4YytVeVVYYWFFdVN2aDdqM3J2WWxadG5odmhKK3RNa29SCi1LYnhsMVZVWXh4K2p6ZmhCeStiS3U1dUdaQjNGMXF0eVk5Zkk1RFF1dDc1bk5idWVRUEcrcXc9PQorQmdrcWhraUc5dzBCQ1FFV0ZXUmxka0IwYUhKcFpuUXVZWEJoWTJobExtOXlaekNDQVNJd0RRWUpLb1pJaHZjTgorQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxsL2JKaGcxN1B1MXQ3ODVKSXV3bGg3ZTJFNTFlb1dGdnV4TVdmSAorZHNVQVZxRGFPejk5TzVzdjhwZ1dLWHJrUEJ0dEU5OFQrTXgvUHd6NUpIczRRY3JlM0E1YWRtNmNkYWIwQUt1ZworZVZHMVB2SHJXelY0YWhlZzRLVWZWU2lNejhCRzJLM1ExVkd2WmtnTVJhL1E0MDlGS2pVNlo0RDl2Qkc0UGFzMworUE41RnhuQUw2UDcweVdDRXIyVnUvdFdKbENOK3FyUkRmU2FFMmhxbVQxaXJ4YW9QYTYxR3Z1UlZzR1EzVGVvRQorbUdmRU50dkZxQzZxUVd1U0NiRzVhSTQ3UnY2NnBxb1dXeHFrcmNvbE5jNyt2aHg2clcrd2RGTzNJbHFJVDhJRworc2RRVnArWTRpci9kR3AyZWp6cUdaQ3JlbVBKMXVFS2pMTXBJdWtkZzI1eW1IQzBDQXdFQUFUQU5CZ2txaGtpRworOXcwQkFRc0ZBQU9DQVFFQUJjUmR3YzltZFk5ek92VGl4dFRoSHJjaVZ2cXdwNlJhaVFxTUVWb21vellpbFpEUgorSjkwTTNINktubEFESmJDdjBGWHVqc2FBcEI1M2F3cTVJN3NPYkFZV0ZoREpaOUxLbHcwbERGN0tjaExYaUFsaworWFZ5dkwybkpqdUpjeFBDRlBXa3R3cnc1YlRndVJDQnpHMTJIemlrbit4czZ1UHVyN1ZRWU0zM2piWEVkYTVQUworVUVxdkFWV2FPTkpDWDhNRFlPc2NWb0pGMEVTeUkrZk45MmlwRmFYUjdmR2Fqb2QvcmMwQWZlTjJHVk1aRVR2ZQorMjFwa1V5RHd3Q0dBNDR1dk5VQ2QxZTMyTnhFM2FoOVVBcENSbjVzR0o2NFI2dXJwRlRYVDNJQUxGM2thT083VQorVnNNaEZyVWlaNytCdzVuSWVpSzBRT0Y2RWlwaitiSnZyTFpwU2c9PQogLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQogQmFnIEF0dHJpYnV0ZXMKLSAgICBsb2NhbEtleUlEOiAwNSAzQyA2QSA5RCA2RCBFQyBBMCBGQSAyRiBBRSA0MSAzMiAwRCAyNCAzQSAyMSAzNCBGNiAwOCAxNSAKKyAgICBsb2NhbEtleUlEOiAzOSBFQyAzRCA1QiAyOCAxNyBEQSBERCAwOSA3QSA2MiA2OCBENSA0NCAxRiBDNyBFMiBGOCBFMCBDRCAKIEtleSBBdHRyaWJ1dGVzOiA8Tm8gQXR0cmlidXRlcz4KIC0tLS0tQkVHSU4gRU5DUllQVEVEIFBSSVZBVEUgS0VZLS0tLS0KLU1JSUN4akJBQmdrcWhraUc5dzBCQlEwd016QWJCZ2txaGtpRzl3MEJCUXd3RGdRSVd5ZVlBR1JCV3Z3Q0FnZ0EKLU1CUUdDQ3FHU0liM0RRTUhCQWpYSGxCRytObVdEd1NDQW9CUmdJYjJOaThxR2hydVlXN0JpS01sVktQbkRkbnIKLXNNZ1NUZ3plbHdBTFVhemQ1OUI3cEExbWRDVmF6VFoyYnFQWllKMHZSb21udTR1b3NuMjRzWFNOd2RZZzdwSmQKLUNSbnR0RTJCR2x4QzRQcUZyVk0xSjdvTzVUZm5vMXJyWFZzUmkwSjRRcjZHdGo1eHdaUlppR25MR3RuUTlHL1gKLVRzUnROSC9wTlJuY211KzIweG1UQzJGOEVzOHEvLzRzY281WWVFY2xjbWNCcjdnb08rVHVzSUgzZ2hsZjBqYmQKLU05b1R2RUc3V1kzbFNhcmhacDRRWWxXV2tHZkdma2Q3clAzeXhoTENoaWpkVkVPTEw2Z2Z0RE9zMEFMQm50QVIKLU5ZZVN4Rm95VEVCQ3o4RitXalZ0N1FRekF5Uk5TS05ESThxTXhNbS9LREthRTkyaFM3Nks4UGNCbGJkeTExOHMKLUxmSE5iM3YvdjRXRmRqbVJKcVBkV3g1eDNjVHdHV3dPRjRNcVpkOStYbisvaXN1OFNmUWQyV21TbTJxYXdiUVAKLUJyam9RU3VVUXJaeUw1QVFtRktrZFE4NzVmTGZOdzNJMmNraHBnTWkrV0NXeDExLzhrMmRZWm9QOVZUWjEveVQKLWwzMkZNNHVudDd3YWZVMHZVVTJ0UGNzRXE0U1Rkd1dSNVE0RkJQRjNKUmlNaU55OEt6dkZlVXRuU1gwOG0vc0IKLUIzVWl3MWpLd3dvQngxZ2ZQcHEzL1VCdm1CbHZHbXdCeCs3VitoTWZYQkFpSW9GWkZBTXJ1V1ZnbzRHY084WnYKLXNlOWNyT09iaXBjUjhyL3E5Vk9GNE9sd0N5aGtsMnlEd0VqUWxSQlBrUTFjcE80RldrZTdWQW9SUnRhQ292OEsKLW9RWUV4UndjMTQxampobFp2a1hJYTBUc3RacEhHWlptQnlGcWJycGNBaHlSd0RKWSt3cUMzVUZrK01BTFQ2R3cKLVRjYlFPM3lJSUF6ZmVhTVlrdzZpc2lBYTk0ZE9qcllIcU9LQWJYcncwYnR0M3ZLRVRWNVh4MGpvZ251T2NDQzgKLWkxUjVTMGNMc1ptMmo0a1dWOG1YdUN2WGt2dXEvV2dQQzE2MisvR1JyaEVwMXdDc1NvOER3RzJJCitNSUlGRGpCQUJna3Foa2lHOXcwQkJRMHdNekFiQmdrcWhraUc5dzBCQlF3d0RnUUlSS29sNDJiQVMzQUNBZ2dBCitNQlFHQ0NxR1NJYjNEUU1IQkFqT3VsY3lITWFXc1FTQ0JNZ2JlWFE4cElZVEVOS20wOFVQZXF4a0NSMm5MeFNPCitndFJtQnhEWWpxWXYzNXk0SzhLaHliQnZTQmxJUGdFNWpFV3hVQ2NjMVF2eTV5ZFVRL1g5cG1rVThkbm1BbURDCitvMHp3ZDNsdDJlTlB5KzRXbGlxRkRWbUhyTGZZUUZPb0lySGp1ekMwbEk0QzJpUE9qeGhmYTF6RnVtZWRnd0dTCitHeDEwWDV1RVZINU42NGZXNkIzQnZ6UU0wcm4ycXIwT051U1JtdGVSdEk4TnN6bmZrZ2VKOWE0Q0lBRjdFNVoyCitKVEdJMTJlZE56elVKMUpoWDQ3Wlc0bWlRd0NVNUxjeTAxVVpxVEZ1VXBtSzdGVVFlZ3RMeTNlNWVES3ErYklnCitaWXE2SHg3bHU4aGpUNWtXWkdLeTcxYVltSEtFakkwZjcyN2NBYnFEVEc1dVpCSEJqd0svM3Avem5RVlFYeEJiCisxK0U5Q2lLZUZkWGoyRWxwdHNuRHlvVHZyU3dKL0pxdTF3a1hCY0g1RW1iZzdhSk1vZDFJT3M2T1FCMXJQRHZkCitGRmE4NHpicVJOV0hTeHh4WVp4Y0I4WVppbkw2L2RRSm5pc0t1OUxNUWQzQkJHc0dXcUg4Wno1dEV2WGpTNUt2CiszZzlKUmE3UURrU0YwMDV4NlUrcS82NzhHMk1HK1crTldxamUzTlp4OVBzaC9QdG0raCtxOW4yR1N2bmliaUs1CittRWo5Rkl3R3F1R3BiWlVUSzVhWEhjS042NTdkS2lJQ3NFSmVOYXIxaVp6blJtenJNYlpKK0R4cUpuVHcrR0F2Cis3WWI2My9DTkF0cVN4aXlOSEdaNk5NMlpBOXZBS1kxSFhuMFJWQzB5MSs5Rm1OcFNSd3YzdS8reWRTQ25Kb25SCitHRUtqek9xTTlEbjdxeGQraDRVbm5BN2hYV3hJVGFnZUI2RzZLbWZpWFJ4aGlXeXF0T0lDZENuZUN3cHE4VVo0CitlMGZtMDVOUlc2TTJtcUdRSHNNTlN2VFdkZHd6NWI4d2d3NGVWc2IreFF5dHhWZGo5bHBCdUI5S3lqUWp4VWdVCiszb1p4NEt5V0xvRVdqa3p0UEFpSzN1djVHZm90TklNZHpuUmZPTjEreG0xTTVzd3RuM3kzUnUxZjZTVFpDN1NwCitxdmJHN2pQbXBCNWdMRVVyaStjaHcrYUtVWWJKMGI4MjBPZDRGTFFZbndMV3I0NlZlbFltVjQ0eHVSMDZ3Z3FQCisxSGNoTVNzSHRTK1psSWlRUVU5amhkeVRybDg2RVFISDMzZGgrU3VhOEFoZmV3UFJ5MlZGcDNaazM0QVVzV2NYCitFZklZR2VtaHFVRDNkckcwU01WYkZGTk9hRkdwOWUwdFFvdVlPQzYvcUZCdi9TTmdRejNtQUVrY2lKWWJVdVVaCitWNFlRUHZ0ZHZTcklTVjBlN2JqRmdkU0VqRzdQN0Y2Q0ZyV1RyalVsSFp1V2o2L3JKMysvMVBIZUpWaXloc3JKCitaWUZlMTRXLzQ4UER4QlJsNElFQW14Y04xRWIyRXo5ZUNxdjBIVzc3SHZpRzZ6SWdua1ByaFdIakZHVXB4S2s0CitqTGZ1QjJUZnE5RjdvenY0TDJRQW4rRi95S3QxUm0ySGg1SjYxZVVKdEFUNjBwYWpnK2dKdGptcHU1UHI0SERuCitiNnAzeG1Zd2FMNUxldDF6Q0FiYk1mZGxESzE0WWpkT2RNL0JFS3BYYjl5NEVJdWJYNUFNWTRsalhlRzlneCtUCitCMVR1UVZkSjBQNXdJSy9EMTBUUXpBV0RLYW0wa3YzUlhpZGx6UnhwWjNzblJuTi9MM0VWZDU4Um50ajFPYzB5CitGaUlpU0tSc3pEYlB6S0R4UUUyc05nUWNkTzI0Sk5MU2Evc1pZdHEyZ1Jnc3BsL1lxSURvNFpZcWk5eDhGNU9TCityZFBVNUQvSDhMV1I0dnBKTEw4RFlySGg1cUZHM0JYMk9KSWhQUlMrNDhwRFl0clJqcDdTLzFaVTY0T0pBeXRrCis5OWhEcVNybjFqMmE2eUZFOEwyUHR6KzRVQ0YyT1FYRWM5UnFxZWI4UUVVdU1Ta05ING9RK0EyRjZ1ekxwWmkwCitYSDY0UjJuaU5DNTZMeFYyaSszVDVLUkVGTGFoeWs4ZXBMWmx2OFlkeFlSNFNiN0ovNXlpb29LM2c5aG1ZVktPCit6TGM9CiAtLS0tLUVORCBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudF92My5jcnQgYi90ZXN0L2tleXMvY2xpZW50X3YzLmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDdmMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL2NsaWVudF92My5jcnQKQEAgLTAsMCArMSwyNCBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFQ0RDQ0F2Q2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQnNURUxNQWtHQTFVRUJoTUNWVk14CitFVEFQQmdOVkJBZ01DRTFoY25sc1lXNWtNUlF3RWdZRFZRUUhEQXRHYjNKbGMzUWdTR2xzYkRFbk1DVUdBMVVFCitDZ3dlVkdobElFRndZV05vWlNCVGIyWjBkMkZ5WlNCR2IzVnVaR0YwYVc5dU1SWXdGQVlEVlFRTERBMUJjR0ZqCithR1VnVkdoeWFXWjBNUkl3RUFZRFZRUUREQWxzYjJOaGJHaHZjM1F4SkRBaUJna3Foa2lHOXcwQkNRRVdGV1JsCitka0IwYUhKcFpuUXVZWEJoWTJobExtOXlaekFlRncweE5qQXlNakl4TVRVNE5ERmFGdzB5TkRBMU1UQXhNVFU0CitOREZhTUlHTE1Rc3dDUVlEVlFRR0V3SlZVekVSTUE4R0ExVUVDQXdJVFdGeWVXeGhibVF4RkRBU0JnTlZCQWNNCitDMFp2Y21WemRDQklhV3hzTVNjd0pRWURWUVFLREI1VWFHVWdRWEJoWTJobElGTnZablIzWVhKbElFWnZkVzVrCitZWFJwYjI0eEZqQVVCZ05WQkFzTURVRndZV05vWlNCVWFISnBablF4RWpBUUJnTlZCQU1NQ1d4dlkyRnNhRzl6CitkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMWjB3aVFuWGc1UU1aWld1Z2QvCitPM3dvYXR5SHVjekp1RlNtWWlSR1dMcjNQdWdCK3h0dmp5MHJUY0UyTU54L2Jkc1Z4cmFwQ0tBK3RNRk9SYkVsCitzRjZqazBIK0I3QnpHb0l3SHI2TjhHUDFWT29BMmVzcmhzTkV6MjJhSkkwMFZhRlRGRThHL3FnRmNpaHlhVldICitac0xhM01ha096RlVtT0JhVjJ0TEJqQ2phem5xWHczZW8zWHdVSTBCa2dTOWI5dnFYalNjbWZXWER3NSsxaXM0CitiQ2d1bUcyemo5RXBMeXBjOXFDR05LRkJPMllJZzBYc0lJSjhScHJsaWFuakw2UDRNZkM2R1BPeVc0TmJaYUxkCitFU3YvYnVtcFZ5dVYvQy94cWtQYWh2T3dCdVBFMWxveFpaUHg2UXYzNjhxbjdTVk5WWk9MeVg3MjJzcG9vQTVHCis2Y3NDQXdFQUFhTlBNRTB3Q1FZRFZSMFRCQUl3QURBTEJnTlZIUThFQkFNQ0JlQXdNd1lEVlIwUkJDd3dLb2NFCitmd0FBQVljUUFBQUFBQUFBQUFBQUFBQUFBQUFBQVljUUFBQUFBQUFBQUFBQUFQLy9md0FBQVRBTkJna3Foa2lHCis5dzBCQVFzRkFBT0NBUUVBQlVFbWVRa0cvUFM5MzVqTUhEcmcvNXptNFgyeHJuRnRtVHdiMGpkeGZhdTZ6LzdoCitBYnhENWlveVk3RlVUTkN6STZTeU1vOXZKSnRZQ1RDdUVHcjg0SmpUMlI3MjMyejYwazRjMXovYXYwMVczT3J2CitFeEhmQVo4bGxoa2Z1MDIwOVQ1VGFJWUNCN2hERmo1S0RidGE4YzZmRWN3dG1sSFFXajNNMzFsU05zcjRadFdXCit3T2JoSzNzcVRzT2x1SGJoS053bE5FYXQ0OGxiT1FVQzE5STFXaTNkQVM2bjhscjBsRWhmR0t2cXh1MFZpQVNTCitOMW5MZmRrUkVHcDM5YllwS2cwbjZFRnc1Yll5VjRxRTNjbkllZEZKcDdOSU9NLzZ4bmRKTWgvYzVsNk4ydXlaCit1cEFyUlFwdy8zaitIa0wxeDlicys5MDBRSzBHSTZBeGdqYm9wQT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50X3YzLmtleSBiL3Rlc3Qva2V5cy9jbGllbnRfdjMua2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ODlmNzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvY2xpZW50X3YzLmtleQpAQCAtMCwwICsxLDI3IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlFcEFJQkFBS0NBUUVBdG5UQ0pDZGVEbEF4bGxhNkIzODdmQ2hxM0llNXpNbTRWS1ppSkVaWXV2Yys2QUg3CitHMitQTFN0TndUWXczSDl0MnhYR3Rxa0lvRDYwd1U1RnNTV3dYcU9UUWY0SHNITWFnakFldm8zd1kvVlU2Z0RaCis2eXVHdzBUUGJab2tqVFJWb1ZNVVR3YitxQVZ5S0hKcFZZZG13dHJjeHFRN01WU1k0RnBYYTBzR01LTnJPZXBmCitEZDZqZGZCUWpRR1NCTDF2MitwZU5KeVo5WmNQRG43V0t6aHNLQzZZYmJPUDBTa3ZLbHoyb0lZMG9VRTdaZ2lECitSZXdnZ254R211V0pxZU12by9neDhMb1k4N0piZzF0bG90MFJLLzl1NmFsWEs1WDhML0dxUTlxRzg3QUc0OFRXCitXakZsay9IcEMvZnJ5cWZ0SlUxVms0dkpmdmJheW1pZ0RrYnB5d0lEQVFBQkFvSUJBUUNKcHlVaGFhSUlZbkJHCis0RCtSa0dnc2o4R3ZoNmFoM2o1M2Z0L2tSajZETUM0QmxCMEM0Zk8vUEVCNVdJMGNqZmN2cHdvNG5PYXBIeVg0CitBVG1MSU1nalhuMm0rQ1NNOXdvMDFtRWJtcktXZDIwTTduOTZjV2hHd2c5TXZWSitSZEdrMkswbHdqMDJQb1dXCitCbHQ1NzZHVHVOTi8raisrUS9qaXFzWHhhTFRPMC9Xais0YjJnUWgzbjhJMHU2YmtvbERMb0VSS0lkckxHSEgrCitGVTNzazhicFVoSG1laVVUZnd3Y2kranVodE9ZOWUzMEFFc3Q2eGFrQ0hicTFsUlJ5RVlQdFdMN29MZHM2eXYwCitVQUtQN3dTOVlsNmRjZWtYU0YxUlpwQitmb3ZUVytxUFluOGFFdWtzYU16MHdLOTZGQ09qVk5HWXhNcCtYbnZsCitzS3g2M1VaQkFvR0JBT0NiQ2JKdE8wSHNnSWF1dkN2R1o1MGFaMXZEdlFSZUN3cmk0aW91dEVnNEpDQVhIRXNYCisrYXh6Mko1ajNVRVFoR0tyMEVYOUJHNllieEdXME1tamYzUXhlUkIrMFdMcE1NWTJTRnQ5M29DMlIxQVg5bDBJCitoNTBPNnRZdjVTWG05NnBLeHdSejAxZDg0bUNKZ3duL0crY1ovRUpqNHJmWnNOYlFzdDZKUUZ2ekFvR0JBTS8xCitnTFZRdDVsK0lLKzZzNjhFbkFESTY2aTdjS2U2c2ozckZSVGFoWkp4TDJ2WTI4SjlFQjJtRi9YRWdBUlNOSlFWCitYL0g5ekRyd0ttOU1YODcvZUNIMm5FYmMrNXFTR3BEUFFtNDgyQzlEcXNNaXR4Q0tEOGJibGUxQmxwakZiOGhyCitSMFEzdjVxOHU1dW9tTEJkczVlVUJlUktNdHU5dE9NQTlLUlNER2pKQW9HQUY0NEsyVXg5VDIrWEZ3alNNU0VRCitrcmhIS0tlQmRpaktyYXlYbldiaWYwUnIvWFdQQVEwVm9SRlJJV05GdStJWWtDU0dwaUJmeTUxdTRJQlppeHY3CitiTnNYWURSOGp3djNrb0gwMnF0N256SCtqcGJFdm9MN2Zld25rcWpaTmoxZnNkcy92ZWJMdmp3Wm5aZ3VSdWtiCitLd1Jkb1RUS2ZROTJiVURiMFZ6QmhDTUNnWUI3SCszT2JEWG9DUWN0UkNzeWlsWWJHTnArRWt4RzRvQzVyRC9WCitFdlJXbWZEcnQzK1ZqUnBIazVsSUI4bUx4V2dmN08vYmhOcXdZcFdkUStqTjArKzZuQm8yMG91ZEhyZmYyUGFKCis4amhFODVsYzQyYmp3ZnBKVUtWWnphVnVXaWN1MEdWbmZHSlRLVDhpa0JXbkJqTllvV2xEbXJLMTY0SDNqUTlMCitZdEM2RVFLQmdRQ2FiRlhYSHg1Y0lKMlhPbTRLL25UT0c3Q2x2RDgweGFwcXlHcm9RZDlFL2NKVUhIUHAvd1E0CitjMWRNTzVFVmlNN0pSc0tmeGtsOXZNNW85SU03c3dsWWg0RU1GU0xKTmp6Z09ZOVhWa3ZRaDB1R2JpSk9CTzRmCitpblV1V24xWVdVai9IRnRyVCswTm8rY1l2WlZjTUtyRkF5M0svQXdwVGJmS0NrNnJvdWxsTkE9PQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva25vd25fZmFpbHVyZXNfTGludXguanNvbiBiL3Rlc3Qva25vd25fZmFpbHVyZXNfTGludXguanNvbgppbmRleCBlZTEyZWJmLi42YzYxZDVhIDEwMDY0NAotLS0gYS90ZXN0L2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KKysrIGIvdGVzdC9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uCkBAIC0xLDI5NSArMSw2MDIgQEAKIFsKLSAgImNfZ2xpYi1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImNfZ2xpYi1jcHBfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJjX2dsaWItY3NoYXJwX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJjX2dsaWItY3NoYXJwX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiY19nbGliLWhzX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJjX2dsaWItaHNfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJjX2dsaWItbm9kZWpzX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJjX2dsaWItbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiY19nbGliLXB5X2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCi0gICJjX2dsaWItcHlfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCi0gICJjX2dsaWItcHlfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImNfZ2xpYi1weV9iaW5hcnlfZnJhbWVkLWlwIiwKLSAgImNfZ2xpYi1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAotICAiY19nbGliLXJiX2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAiLAotICAiY19nbGliLXJiX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJjX2dsaWItcmJfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJjcHAtY3BwX2JpbmFyeV9odHRwLWlwIiwKLSAgImNwcC1jcHBfY29tcGFjdF9odHRwLWRvbWFpbiIsCi0gICJjcHAtY3BwX2pzb25faHR0cC1pcCIsCi0gICJjcHAtY3NoYXJwX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAiY3BwLWNzaGFycF9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJjcHAtY3NoYXJwX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNwcC1jc2hhcnBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgImNwcC1jc2hhcnBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAotICAiY3BwLWNzaGFycF9qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAiY3BwLWhzX2pzb25fYnVmZmVyZWQtaXAiLAotICAiY3BwLWhzX2pzb25fZnJhbWVkLWlwIiwKLSAgImNwcC1oc19qc29uX2h0dHAtaXAiLAorICAiY19nbGliLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgImNfZ2xpYi1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAiY19nbGliLXJzX211bHRpY19idWZmZXJlZC1pcCIsCisgICJjX2dsaWItcnNfbXVsdGljX2ZyYW1lZC1pcCIsCisgICJjbC1jX2dsaWJfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLWNfZ2xpYl9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLWNfZ2xpYl9tdWx0aS1iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtY19nbGliX211bHRpLWJpbmFyeV9mcmFtZWQtaXAiLAorICAiY2wtY19nbGliX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgImNsLWNfZ2xpYl9tdWx0aV9mcmFtZWQtaXAiLAorICAiY2wtZ29fYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLWdvX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiY2wtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKKyAgImNsLXJiX2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAiLAorICAiY2wtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLXJiX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiY2wtcnNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLXJzX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiY2wtcnNfbXVsdGktYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLXJzX211bHRpLWJpbmFyeV9mcmFtZWQtaXAiLAorICAiY2wtcnNfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAiY2wtcnNfbXVsdGlfZnJhbWVkLWlwIiwKKyAgImNwcC1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtZGFydF9qc29uX2h0dHAtaXAiLAorICAiY3BwLWRhcnRfbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWRhcnRfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtZGFydF9tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1nb19iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtZ29fYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWdvX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX2pzb25faHR0cC1pcCIsCisgICJjcHAtZ29fanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtZ29fbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWdvX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtZ29fbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtZ29fbXVsdGljLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLWdvX211bHRpai1qc29uX2h0dHAtaXAtc3NsIiwKICAgImNwcC1qYXZhX2JpbmFyeV9odHRwLWlwIiwKICAgImNwcC1qYXZhX2JpbmFyeV9odHRwLWlwLXNzbCIsCiAgICJjcHAtamF2YV9jb21wYWN0X2h0dHAtaXAiLAogICAiY3BwLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCiAgICJjcHAtamF2YV9qc29uX2h0dHAtaXAiLAogICAiY3BwLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCi0gICJjcHAtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKLSAgImNwcC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKLSAgImNwcC1yYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiY3BwLXJiX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiY3BwLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAotICAiY3BwLXJiX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgImNwcC1yYl9qc29uX2J1ZmZlcmVkLWlwIiwKLSAgImNwcC1yYl9qc29uX2ZyYW1lZC1pcCIsCi0gICJjc2hhcnAtY19nbGliX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtY19nbGliX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiY3NoYXJwLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1jcHBfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJjc2hhcnAtY3BwX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1jcHBfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1jcHBfY29tcGFjdF9mcmFtZWQtaXAiLAotICAiY3NoYXJwLWNwcF9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLWNwcF9qc29uX2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1jcHBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLWNwcF9qc29uX2ZyYW1lZC1pcCIsCi0gICJjc2hhcnAtY3BwX2pzb25fZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtY3NoYXJwX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLWNzaGFycF9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtY3NoYXJwX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1jc2hhcnBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1jc2hhcnBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLWNzaGFycF9qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLWdvX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtZ29fYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtZ29fYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJjc2hhcnAtZ29fYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLWdvX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLWdvX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1nb19jb21wYWN0X2ZyYW1lZC1pcCIsCi0gICJjc2hhcnAtZ29fY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1nb19qc29uX2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1nb19qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtZ29fanNvbl9mcmFtZWQtaXAiLAotICAiY3NoYXJwLWdvX2pzb25fZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtaHNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1oc19iaW5hcnlfZnJhbWVkLWlwIiwKLSAgImNzaGFycC1oc19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1oc19jb21wYWN0X2ZyYW1lZC1pcCIsCi0gICJjc2hhcnAtaHNfanNvbl9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtaHNfanNvbl9mcmFtZWQtaXAiLAotICAiY3NoYXJwLWphdmFfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1qYXZhX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLWphdmFfYmluYXJ5X2ZyYW1lZC1mYXN0ZnJhbWVkLWlwIiwKLSAgImNzaGFycC1qYXZhX2JpbmFyeV9mcmFtZWQtZmFzdGZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLWphdmFfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJjc2hhcnAtamF2YV9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtamF2YV9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1qYXZhX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1qYXZhX2NvbXBhY3RfZnJhbWVkLWZhc3RmcmFtZWQtaXAiLAotICAiY3NoYXJwLWphdmFfY29tcGFjdF9mcmFtZWQtZmFzdGZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLWphdmFfY29tcGFjdF9mcmFtZWQtaXAiLAotICAiY3NoYXJwLWphdmFfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1qYXZhX2pzb25fYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLWphdmFfanNvbl9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLWphdmFfanNvbl9mcmFtZWQtZmFzdGZyYW1lZC1pcCIsCi0gICJjc2hhcnAtamF2YV9qc29uX2ZyYW1lZC1mYXN0ZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtamF2YV9qc29uX2ZyYW1lZC1pcCIsCi0gICJjc2hhcnAtamF2YV9qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1ub2RlanNfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJjc2hhcnAtbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1ub2RlanNfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1ub2RlanNfY29tcGFjdF9mcmFtZWQtaXAiLAotICAiY3NoYXJwLW5vZGVqc19jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLW5vZGVqc19qc29uX2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1ub2RlanNfanNvbl9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLW5vZGVqc19qc29uX2ZyYW1lZC1pcCIsCi0gICJjc2hhcnAtbm9kZWpzX2pzb25fZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcHlfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcHlfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLXB5X2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLXB5X2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weV9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcHlfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weV9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcHlfanNvbl9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLXJiX2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAiLAotICAiY3NoYXJwLXJiX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtcmJfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJjc2hhcnAtcmJfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtcmJfY29tcGFjdF9mcmFtZWQtaXAiLAotICAiY3NoYXJwLXJiX2pzb25fYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLXJiX2pzb25fZnJhbWVkLWlwIiwKLSAgImdvLWNfZ2xpYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiZ28tY19nbGliX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiZ28tY3BwX2pzb25fYnVmZmVyZWQtaXAiLAotICAiZ28tY3BwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgImdvLWNwcF9qc29uX2ZyYW1lZC1pcCIsCi0gICJnby1jcHBfanNvbl9mcmFtZWQtaXAtc3NsIiwKLSAgImdvLWNzaGFycF9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImdvLWNzaGFycF9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJnby1jc2hhcnBfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAotICAiZ28tY3NoYXJwX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCi0gICJnby1jc2hhcnBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAotICAiZ28tY3NoYXJwX2pzb25fZnJhbWVkLWlwLXNzbCIsCi0gICJnby1oc19qc29uX2J1ZmZlcmVkLWlwIiwKLSAgImdvLWhzX2pzb25fZnJhbWVkLWlwIiwKLSAgImdvLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiZ28tbm9kZWpzX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAiZ28tbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiZ28tbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgImdvLW5vZGVqc19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgImdvLW5vZGVqc19jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJnby1ub2RlanNfY29tcGFjdF9mcmFtZWQtaXAiLAotICAiZ28tbm9kZWpzX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCi0gICJnby1ub2RlanNfanNvbl9idWZmZXJlZC1pcCIsCi0gICJnby1ub2RlanNfanNvbl9idWZmZXJlZC1pcC1zc2wiLAotICAiZ28tbm9kZWpzX2pzb25fZnJhbWVkLWlwIiwKLSAgImdvLW5vZGVqc19qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAiZ28tcGVybF9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImdvLXBlcmxfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAotICAiZ28tcmJfanNvbl9idWZmZXJlZC1pcCIsCi0gICJnby1yYl9qc29uX2ZyYW1lZC1pcCIsCi0gICJocy1jcHBfanNvbl9idWZmZXJlZC1pcCIsCi0gICJocy1jcHBfanNvbl9mcmFtZWQtaXAiLAorICAiY3BwLWphdmFfbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aWNfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aWpfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWpfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19iaW5hcnlfaHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX2NvbXBhY3RfaHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfanNvbl9odHRwLWRvbWFpbiIsCisgICJjcHAtbm9kZWpzX2pzb25faHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19tdWx0aS1iaW5hcnlfaHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX211bHRpYy1jb21wYWN0X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfbXVsdGlqLWpzb25faHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1ub2RlanNfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19tdWx0aWgtaGVhZGVyX2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19tdWx0aWgtaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfbXVsdGloLWhlYWRlcl9odHRwLWRvbWFpbiIsCisgICJjcHAtbm9kZWpzX2hlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1ub2RlanNfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfaGVhZGVyX2h0dHAtZG9tYWluIiwKKyAgImNwcC1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHkzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtcHkzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHkzX2hlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2pzb25faHR0cC1pcCIsCisgICJjcHAtcHkzX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aS1hY2NlbF9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpLW11bHRpYV9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGktbXVsdGlhX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGlfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljLWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGljLWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpYy1tdWx0aWFjX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWMtbXVsdGlhY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpY19odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGljX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGloLWhlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGloLWhlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpal9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGlqX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJjcHAtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHlfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHlfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9qc29uX2h0dHAtaXAiLAorICAiY3BwLXB5X2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpLWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpLWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aS1tdWx0aWFfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGktbXVsdGlhX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aV9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljLWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWMtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljLW11bHRpYWNfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGljLW11bHRpYWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpY19odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpaC1oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGloLWhlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGloX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpaF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpal9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWpfaHR0cC1pcC1zc2wiLAorICAiY3BwLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgImNwcC1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAiY3BwLXJzX211bHRpY19idWZmZXJlZC1pcCIsCisgICJjcHAtcnNfbXVsdGljX2ZyYW1lZC1pcCIsCisgICJjc2hhcnAtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY2xfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImQtY2xfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLWNwcF9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtY3BwX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLWNwcF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtY3BwX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtY3BwX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLWNwcF9qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtY3BwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtY3BwX2pzb25fZnJhbWVkLWlwIiwKKyAgImQtY3BwX2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLWNwcF9qc29uX2h0dHAtaXAiLAorICAiZC1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLWRfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWRfanNvbl9odHRwLWlwIiwKKyAgImQtZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJkLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtZGFydF9qc29uX2h0dHAtaXAiLAorICAiZC1nb19iaW5hcnlfaHR0cC1pcCIsCisgICJkLWdvX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLWdvX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWdvX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1nb19qc29uX2h0dHAtaXAiLAorICAiZC1nb19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJkLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1qYXZhX2pzb25faHR0cC1pcCIsCisgICJkLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLWpzX2pzb25faHR0cC1pcCIsCisgICJkLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1ub2RlanNfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLW5vZGVqc19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19jb21wYWN0X2h0dHAtaXAiLAorICAiZC1ub2RlanNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLW5vZGVqc19qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2pzb25fZnJhbWVkLWlwIiwKKyAgImQtbm9kZWpzX2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19qc29uX2h0dHAtaXAiLAorICAiZC1ub2RlanNfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLW5vZGV0c19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLXB5M19iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnlfaHR0cC1pcCIsCisgICJkLXB5M19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJkLXB5M19jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJkLXB5M19jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtcHkzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfanNvbl9idWZmZXJlZC1pcCIsCisgICJkLXB5M19qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19qc29uX2ZyYW1lZC1pcCIsCisgICJkLXB5M19qc29uX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfanNvbl9odHRwLWlwIiwKKyAgImQtcHkzX2pzb25faHR0cC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAorICAiZC1weV9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAiZC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1weV9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLXB5X2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1weV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19idWZmZXJlZC1pcCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtcHlfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJkLXB5X2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLXB5X2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1weV9qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHlfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9qc29uX2ZyYW1lZC1pcCIsCisgICJkLXB5X2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2pzb25faHR0cC1pcCIsCisgICJkLXB5X2pzb25faHR0cC1pcC1zc2wiLAorICAiZXJsLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZXJsLWNwcF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1jc2hhcnBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1jc2hhcnBfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJlcmwtbm9kZWpzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZXJsLW5vZGV0c19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZXJsLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiZXJsLXJiX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJlcmwtcmJfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZXJsLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZXJsLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImVybC1yYl9jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImdvLWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJnby1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImdvLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAiZ28tY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZ28tY3BwX2pzb25faHR0cC1pcCIsCisgICJnby1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJnby1kX2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImdvLWRfY29tcGFjdF9odHRwLWlwIiwKKyAgImdvLWRfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJnby1kX2pzb25faHR0cC1pcCIsCisgICJnby1kX2pzb25faHR0cC1pcC1zc2wiLAorICAiZ28tZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJnby1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJnby1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJnby1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImdvLWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgImdvLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJnby1qYXZhX2pzb25faHR0cC1pcCIsCisgICJnby1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAiZ28tcHkzX2JpbmFyeS1hY2NlbF96bGliLWlwLXNzbCIsCisgICJnby1weTNfY29tcGFjdC1hY2NlbGNfemxpYi1pcC1zc2wiLAorICAiZ28tcHlfYmluYXJ5LWFjY2VsX3psaWItaXAtc3NsIiwKKyAgImdvLXB5X2NvbXBhY3QtYWNjZWxjX3psaWItaXAtc3NsIiwKKyAgImhzLWNzaGFycF9iaW5hcnlfYnVmZmVyZWQtaXAiLAogICAiaHMtY3NoYXJwX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiaHMtY3NoYXJwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAogICAiaHMtY3NoYXJwX2NvbXBhY3RfZnJhbWVkLWlwIiwKICAgImhzLWNzaGFycF9qc29uX2J1ZmZlcmVkLWlwIiwKICAgImhzLWNzaGFycF9qc29uX2ZyYW1lZC1pcCIsCi0gICJocy1nb19iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiaHMtZ29fYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJocy1nb19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgImhzLWdvX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgImhzLWdvX2pzb25fYnVmZmVyZWQtaXAiLAotICAiaHMtZ29fanNvbl9mcmFtZWQtaXAiLAotICAiaHMtbm9kZWpzX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJocy1ub2RlanNfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJocy1ub2RlanNfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJocy1ub2RlanNfY29tcGFjdF9mcmFtZWQtaXAiLAotICAiaHMtbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAiLAotICAiaHMtbm9kZWpzX2pzb25fZnJhbWVkLWlwIiwKLSAgImhzLXB5X2pzb25fYnVmZmVyZWQtaXAiLAotICAiaHMtcHlfanNvbl9mcmFtZWQtaXAiLAotICAiaHMtcmJfanNvbl9idWZmZXJlZC1pcCIsCi0gICJocy1yYl9qc29uX2ZyYW1lZC1pcCIsCi0gICJqYXZhLWNzaGFycF9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImphdmEtY3NoYXJwX2JpbmFyeV9mYXN0ZnJhbWVkLWZyYW1lZC1pcC1zc2wiLAotICAiamF2YS1jc2hhcnBfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAotICAiamF2YS1jc2hhcnBfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAotICAiamF2YS1jc2hhcnBfY29tcGFjdF9mYXN0ZnJhbWVkLWZyYW1lZC1pcC1zc2wiLAotICAiamF2YS1jc2hhcnBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgImphdmEtY3NoYXJwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgImphdmEtY3NoYXJwX2pzb25fZmFzdGZyYW1lZC1mcmFtZWQtaXAtc3NsIiwKLSAgImphdmEtY3NoYXJwX2pzb25fZnJhbWVkLWlwLXNzbCIsCi0gICJqYXZhLWhzX2pzb25fYnVmZmVyZWQtaXAiLAotICAiamF2YS1oc19qc29uX2Zhc3RmcmFtZWQtZnJhbWVkLWlwIiwKLSAgImphdmEtaHNfanNvbl9mcmFtZWQtaXAiLAotICAiamF2YS1ub2RlanNfanNvbl9idWZmZXJlZC1pcCIsCi0gICJqYXZhLW5vZGVqc19qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJqYXZhLXJiX2pzb25fYnVmZmVyZWQtaXAiLAotICAiamF2YS1yYl9qc29uX2Zhc3RmcmFtZWQtZnJhbWVkLWlwIiwKLSAgImphdmEtcmJfanNvbl9mcmFtZWQtaXAiLAotICAibm9kZWpzLWNfZ2xpYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLWNfZ2xpYl9iaW5hcnlfZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgIm5vZGVqcy1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJub2RlanMtY3BwX2JpbmFyeV9mcmFtZWQtaXAiLAotICAibm9kZWpzLWNwcF9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJub2RlanMtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLWNwcF9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJub2RlanMtY3BwX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1jcHBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1jcHBfanNvbl9idWZmZXJlZC1pcCIsCisgICJub2RlanMtY3BwX2JpbmFyeV9odHRwLWRvbWFpbiIsCisgICJub2RlanMtY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1jcHBfY29tcGFjdF9odHRwLWRvbWFpbiIsCisgICJub2RlanMtY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAogICAibm9kZWpzLWNwcF9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJub2RlanMtY3BwX2pzb25fZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1jcHBfanNvbl9mcmFtZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1jc2hhcnBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgIm5vZGVqcy1jc2hhcnBfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJub2RlanMtY3NoYXJwX2JpbmFyeV9mcmFtZWQtaXAiLAotICAibm9kZWpzLWNzaGFycF9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJub2RlanMtY3NoYXJwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLWNzaGFycF9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJub2RlanMtY3NoYXJwX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1jc2hhcnBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1jc2hhcnBfanNvbl9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtY3NoYXJwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1jc2hhcnBfanNvbl9mcmFtZWQtaXAiLAotICAibm9kZWpzLWNzaGFycF9qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAibm9kZWpzLWhzX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtaHNfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJub2RlanMtaHNfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtaHNfY29tcGFjdF9mcmFtZWQtaXAiLAotICAibm9kZWpzLWhzX2pzb25fYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLWhzX2pzb25fZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1qYXZhX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1weV9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLXB5X2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcC1zc2wiLAotICAibm9kZWpzLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAiLAotICAibm9kZWpzLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1weV9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLXB5X2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAibm9kZWpzLXB5X2JpbmFyeV9mcmFtZWQtaXAiLAotICAibm9kZWpzLXB5X2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1weV9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgIm5vZGVqcy1weV9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJub2RlanMtcHlfY29tcGFjdF9mcmFtZWQtaXAiLAotICAibm9kZWpzLXB5X2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCi0gICJub2RlanMtcHlfanNvbl9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtcHlfanNvbl9idWZmZXJlZC1pcC1zc2wiLAotICAibm9kZWpzLXB5X2pzb25fZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1weV9qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAibm9kZWpzLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCi0gICJub2RlanMtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgIm5vZGVqcy1yYl9iaW5hcnlfZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1yYl9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgIm5vZGVqcy1yYl9jb21wYWN0X2ZyYW1lZC1pcCIsCi0gICJub2RlanMtcmJfanNvbl9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtcmJfanNvbl9mcmFtZWQtaXAiLAotICAicGVybC1waHBfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJweS1jc2hhcnBfYWNjZWwtYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJweS1jc2hhcnBfYWNjZWwtYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAotICAicHktY3NoYXJwX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAicHktY3NoYXJwX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgInB5LWNzaGFycF9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJweS1jc2hhcnBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgInB5LWNzaGFycF9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJweS1jc2hhcnBfanNvbl9mcmFtZWQtaXAtc3NsIiwKLSAgInB5LWhzX2pzb25fYnVmZmVyZWQtaXAiLAotICAicHktaHNfanNvbl9mcmFtZWQtaXAiLAotICAicHktbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAiLAotICAicHktbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgInB5LW5vZGVqc19qc29uX2ZyYW1lZC1pcCIsCi0gICJweS1ub2RlanNfanNvbl9mcmFtZWQtaXAtc3NsIiwKLSAgInB5LXJiX2FjY2VsLWJpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJweS1yYl9hY2NlbC1iaW5hcnlfZnJhbWVkLWlwIiwKLSAgInB5LXJiX2FjY2VsX2J1ZmZlcmVkLWlwIiwKLSAgInB5LXJiX2FjY2VsX2ZyYW1lZC1pcCIsCi0gICJweS1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAotICAicHktcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCi0gICJweS1yYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAicHktcmJfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJweS1yYl9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgInB5LXJiX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgInB5LXJiX2pzb25fYnVmZmVyZWQtaXAiLAotICAicHktcmJfanNvbl9mcmFtZWQtaXAiLAotICAicmItY19nbGliX2FjY2VsLWJpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJyYi1jX2dsaWJfYWNjZWwtYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJyYi1jX2dsaWJfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgInJiLWNfZ2xpYl9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgIm5vZGVqcy1jcHBfanNvbl9odHRwLWRvbWFpbiIsCisgICJub2RlanMtY3BwX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtY3BwX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWNwcF9oZWFkZXJfaHR0cC1pcCIsCisgICJub2RlanMtY3BwX2hlYWRlcl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtY3BwX2hlYWRlcl9odHRwLWRvbWFpbiIsCisgICJub2RlanMtZF9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtZF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1kX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1kX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJub2RlanMtZ29fYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWdvX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZ29fY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1nb19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1nb19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWdvX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWhzX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1oc19jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWhzX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtaHNfaGVhZGVyX2h0dHAtaXAiLAorICAibm9kZWpzLWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1qYXZhX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1qc19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWx1YV9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtbHVhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtbHVhX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weTNfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weTNfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfanNvbl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHkzX2hlYWRlcl9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9oZWFkZXJfaHR0cC1pcCIsCisgICJub2RlanMtcHlfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJub2RlanMtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtcHlfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2pzb25faHR0cC1pcC1zc2wiLAorICAicGVybC1yc19tdWx0aV9idWZmZXJlZC1pcCIsCisgICJwZXJsLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJweS1jcHBfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfYWNjZWwtYmluYXJ5X3psaWItaXAiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV96bGliLWlwLXNzbCIsCisgICJweS1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAtc3NsIiwKKyAgInB5LWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAicHktY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5LWNwcF9oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2pzb25faHR0cC1pcCIsCisgICJweS1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAicHktY3BwX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfbXVsdGlfaHR0cC1pcCIsCisgICJweS1jcHBfbXVsdGlfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX211bHRpYS1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1jcHBfbXVsdGlhLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfbXVsdGlhLWJpbmFyeV96bGliLWlwIiwKKyAgInB5LWNwcF9tdWx0aWEtYmluYXJ5X3psaWItaXAtc3NsIiwKKyAgInB5LWNwcF9tdWx0aWEtbXVsdGlfaHR0cC1pcCIsCisgICJweS1jcHBfbXVsdGlhLW11bHRpX2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9tdWx0aWEtbXVsdGlfemxpYi1pcCIsCisgICJweS1jcHBfbXVsdGlhLW11bHRpX3psaWItaXAtc3NsIiwKKyAgInB5LWNwcF9tdWx0aWFjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1jcHBfbXVsdGlhYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9tdWx0aWFjLWNvbXBhY3RfemxpYi1pcCIsCisgICJweS1jcHBfbXVsdGlhYy1jb21wYWN0X3psaWItaXAtc3NsIiwKKyAgInB5LWNwcF9tdWx0aWFjLW11bHRpY19odHRwLWlwIiwKKyAgInB5LWNwcF9tdWx0aWFjLW11bHRpY19odHRwLWlwLXNzbCIsCisgICJweS1jcHBfbXVsdGlhYy1tdWx0aWNfemxpYi1pcCIsCisgICJweS1jcHBfbXVsdGlhYy1tdWx0aWNfemxpYi1pcC1zc2wiLAorICAicHktY3BwX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktY3BwX211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9tdWx0aWNfaHR0cC1pcCIsCisgICJweS1jcHBfbXVsdGljX2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9tdWx0aWgtaGVhZGVyX2h0dHAtaXAiLAorICAicHktY3BwX211bHRpaC1oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX211bHRpaF9odHRwLWlwIiwKKyAgInB5LWNwcF9tdWx0aWhfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX211bHRpai1qc29uX2h0dHAtaXAiLAorICAicHktY3BwX211bHRpai1qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9tdWx0aWpfaHR0cC1pcCIsCisgICJweS1jcHBfbXVsdGlqX2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktZF9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktZF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktZF9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1kX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1kX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktZF9qc29uX2h0dHAtaXAiLAorICAicHktZF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5LWRhcnRfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktZGFydF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAicHktZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAicHktZGFydF9qc29uX2h0dHAtaXAiLAorICAicHktaHNfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktaHNfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1oc19iaW5hcnlfaHR0cC1pcCIsCisgICJweS1oc19jb21wYWN0X2h0dHAtaXAiLAorICAicHktaHNfaGVhZGVyX2h0dHAtaXAiLAorICAicHktaHNfanNvbl9odHRwLWlwIiwKKyAgInB5LWphdmFfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX211bHRpX2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfbXVsdGlhLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX211bHRpYS1tdWx0aV9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX211bHRpYWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX211bHRpYWMtbXVsdGljX2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfbXVsdGljLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktamF2YV9tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAicHktamF2YV9tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX211bHRpal9odHRwLWlwLXNzbCIsCisgICJweS1sdWFfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktbHVhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktbHVhX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWx1YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHktbHVhX2pzb25faHR0cC1pcCIsCisgICJweS1yc19tdWx0aV9idWZmZXJlZC1pcCIsCisgICJweS1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAicHktcnNfbXVsdGlhLW11bHRpX2J1ZmZlcmVkLWlwIiwKKyAgInB5LXJzX211bHRpYS1tdWx0aV9mcmFtZWQtaXAiLAorICAicHktcnNfbXVsdGlhYy1tdWx0aWNfYnVmZmVyZWQtaXAiLAorICAicHktcnNfbXVsdGlhYy1tdWx0aWNfZnJhbWVkLWlwIiwKKyAgInB5LXJzX211bHRpY19idWZmZXJlZC1pcCIsCisgICJweS1yc19tdWx0aWNfZnJhbWVkLWlwIiwKKyAgInB5My1jcHBfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWNwcF9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9hY2NlbC1iaW5hcnlfemxpYi1pcCIsCisgICJweTMtY3BwX2FjY2VsLWJpbmFyeV96bGliLWlwLXNzbCIsCisgICJweTMtY3BwX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWNwcF9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAiLAorICAicHkzLWNwcF9hY2NlbGMtY29tcGFjdF96bGliLWlwLXNzbCIsCisgICJweTMtY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5My1jcHBfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfanNvbl9odHRwLWlwIiwKKyAgInB5My1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1jcHBfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfbXVsdGlfaHR0cC1pcCIsCisgICJweTMtY3BwX211bHRpX2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfbXVsdGlhLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1jcHBfbXVsdGlhLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX211bHRpYS1iaW5hcnlfemxpYi1pcCIsCisgICJweTMtY3BwX211bHRpYS1iaW5hcnlfemxpYi1pcC1zc2wiLAorICAicHkzLWNwcF9tdWx0aWEtbXVsdGlfaHR0cC1pcCIsCisgICJweTMtY3BwX211bHRpYS1tdWx0aV9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX211bHRpYS1tdWx0aV96bGliLWlwIiwKKyAgInB5My1jcHBfbXVsdGlhLW11bHRpX3psaWItaXAtc3NsIiwKKyAgInB5My1jcHBfbXVsdGlhYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWNwcF9tdWx0aWFjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9tdWx0aWFjLWNvbXBhY3RfemxpYi1pcCIsCisgICJweTMtY3BwX211bHRpYWMtY29tcGFjdF96bGliLWlwLXNzbCIsCisgICJweTMtY3BwX211bHRpYWMtbXVsdGljX2h0dHAtaXAiLAorICAicHkzLWNwcF9tdWx0aWFjLW11bHRpY19odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX211bHRpYWMtbXVsdGljX3psaWItaXAiLAorICAicHkzLWNwcF9tdWx0aWFjLW11bHRpY196bGliLWlwLXNzbCIsCisgICJweTMtY3BwX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWNwcF9tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX211bHRpY19odHRwLWlwIiwKKyAgInB5My1jcHBfbXVsdGljX2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfbXVsdGloLWhlYWRlcl9odHRwLWlwIiwKKyAgInB5My1jcHBfbXVsdGloLWhlYWRlcl9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX211bHRpaF9odHRwLWlwIiwKKyAgInB5My1jcHBfbXVsdGloX2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJweTMtY3BwX211bHRpai1qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfbXVsdGlqX2h0dHAtaXAiLAorICAicHkzLWNwcF9tdWx0aWpfaHR0cC1pcC1zc2wiLAorICAicHkzLWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWRfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2pzb25faHR0cC1pcCIsCisgICJweTMtZF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5My1kYXJ0X2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJweTMtaHNfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWhzX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWhzX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1oc19jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWhzX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5My1oc19qc29uX2h0dHAtaXAiLAorICAicHkzLWphdmFfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAicHkzLWphdmFfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX211bHRpX2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX211bHRpYS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWphdmFfbXVsdGlhLW11bHRpX2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX211bHRpYWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9tdWx0aWFjLW11bHRpY19odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAicHkzLWphdmFfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAicHkzLWphdmFfbXVsdGlqX2h0dHAtaXAtc3NsIiwKKyAgInB5My1sdWFfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWx1YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1sdWFfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWx1YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWx1YV9qc29uX2h0dHAtaXAiLAorICAicHkzLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgInB5My1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAicHkzLXJzX211bHRpYS1tdWx0aV9idWZmZXJlZC1pcCIsCisgICJweTMtcnNfbXVsdGlhLW11bHRpX2ZyYW1lZC1pcCIsCisgICJweTMtcnNfbXVsdGlhYy1tdWx0aWNfYnVmZmVyZWQtaXAiLAorICAicHkzLXJzX211bHRpYWMtbXVsdGljX2ZyYW1lZC1pcCIsCisgICJweTMtcnNfbXVsdGljX2J1ZmZlcmVkLWlwIiwKKyAgInB5My1yc19tdWx0aWNfZnJhbWVkLWlwIiwKKyAgInJiLWNwcF9qc29uX2J1ZmZlcmVkLWRvbWFpbiIsCiAgICJyYi1jcHBfanNvbl9idWZmZXJlZC1pcCIsCisgICJyYi1jcHBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAicmItY3BwX2pzb25fZnJhbWVkLWRvbWFpbiIsCiAgICJyYi1jcHBfanNvbl9mcmFtZWQtaXAiLAotICAicmItY3NoYXJwX2pzb25fYnVmZmVyZWQtaXAiLAotICAicmItY3NoYXJwX2pzb25fZnJhbWVkLWlwIiwKLSAgInJiLWhzX2pzb25fYnVmZmVyZWQtaXAiLAotICAicmItaHNfanNvbl9mcmFtZWQtaXAiLAotICAicmItbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAiLAotICAicmItbm9kZWpzX2pzb25fZnJhbWVkLWlwIiwKLSAgInJiLXJiX2pzb25fYnVmZmVyZWQtaXAiLAotICAicmItcmJfanNvbl9mcmFtZWQtaXAiCisgICJyYi1jcHBfanNvbl9mcmFtZWQtaXAtc3NsIgogXQpkaWZmIC0tZ2l0IGEvdGVzdC9sdWEvTWFrZWZpbGUuYW0gYi90ZXN0L2x1YS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjY4M2UxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9sdWEvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKKyMgUmVtb3ZlICJNYXBUeXBlID0iIGxpbmUgdG8gaWdub3JlIHNvbWUgbWFwIGJ1ZyBmb3Igbm93CitzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGx1YSAkPAorCSQoU0VEKSAtaS5iYWsgJ3MvTWFwVHlwZSA9Ly9nJyBnZW4tbHVhL1RocmlmdFRlc3RfdHR5cGVzLmx1YQorCSQoUk0pIGdlbi1sdWEvVGhyaWZ0VGVzdF90dHlwZXMubHVhLmJhaworCitwcmVjcm9zczogc3R1YnMKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLWx1YS8KKworZGlzdC1ob29rOgorCSQoUk0pIC1yICQoZGlzdGRpcikvZ2VuLWx1YS8KZGlmZiAtLWdpdCBhL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfY2xpZW50Lmx1YSBiL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfY2xpZW50Lmx1YQppbmRleCBlNzU3MWY5Li43N2Q4ZDA3IDEwMDY0NAotLS0gYS90ZXN0L2x1YS90ZXN0X2Jhc2ljX2NsaWVudC5sdWEKKysrIGIvdGVzdC9sdWEvdGVzdF9iYXNpY19jbGllbnQubHVhCkBAIC0xLDIyICsxLDI3IEBACi0tLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCiAKIAogcmVxdWlyZSgnVFNvY2tldCcpCityZXF1aXJlKCdUQnVmZmVyZWRUcmFuc3BvcnQnKQorcmVxdWlyZSgnVEZyYW1lZFRyYW5zcG9ydCcpCityZXF1aXJlKCdUSHR0cFRyYW5zcG9ydCcpCityZXF1aXJlKCdUQ29tcGFjdFByb3RvY29sJykKK3JlcXVpcmUoJ1RKc29uUHJvdG9jb2wnKQogcmVxdWlyZSgnVEJpbmFyeVByb3RvY29sJykKIHJlcXVpcmUoJ1RocmlmdFRlc3RfVGhyaWZ0VGVzdCcpCiByZXF1aXJlKCdsaWJsdWFsb25nbnVtYmVyJykKQEAgLTI1LDI3ICszMCw1OCBAQAogCiBmdW5jdGlvbiB0ZWFyZG93bigpCiAgIGlmIGNsaWVudCB0aGVuCi0gICAgLS0gU2h1dHMgZG93biB0aGUgc2VydmVyCi0gICAgY2xpZW50OnRlc3RWb2lkKCkKLQogICAgIC0tIGNsb3NlIHRoZSBjb25uZWN0aW9uCiAgICAgY2xpZW50OmNsb3NlKCkKICAgZW5kCiBlbmQKIAorZnVuY3Rpb24gcGFyc2VBcmdzKHJhd0FyZ3MpCisgIGxvY2FsIG9wdCA9IHsKKyAgICBwcm90b2NvbD0nYmluYXJ5JywKKyAgICB0cmFuc3BvcnQ9J2J1ZmZlcmVkJywKKyAgICBwb3J0PSc5MDkwJywKKyAgfQorICBmb3IgaSwgc3RyIGluIHBhaXJzKHJhd0FyZ3MpIGRvCisgICAgaWYgaSA+IDAgdGhlbgorICAgICAgaywgdiA9IHN0cmluZy5tYXRjaChzdHIsICctLSgldyspPSgldyspJykKKyAgICAgIGFzc2VydChvcHRba10gfj0gbmlsLCAnVW5rbm93biBhcmd1bWVudCcpCisgICAgICBvcHRba10gPSB2CisgICAgZW5kCisgIGVuZAorICByZXR1cm4gb3B0CitlbmQKKwogZnVuY3Rpb24gYXNzZXJ0RXF1YWwodmFsMSwgdmFsMiwgbXNnKQogICBhc3NlcnQodmFsMSA9PSB2YWwyLCBtc2cpCiBlbmQKIAotZnVuY3Rpb24gdGVzdEJhc2ljQ2xpZW50KCkKK2Z1bmN0aW9uIHRlc3RCYXNpY0NsaWVudChyYXdBcmdzKQorICBsb2NhbCBvcHQgPSBwYXJzZUFyZ3MocmF3QXJncykKICAgbG9jYWwgc29ja2V0ID0gVFNvY2tldDpuZXd7Ci0gICAgcG9ydCA9IDkwOTAKKyAgICBwb3J0ID0gdG9udW1iZXIob3B0LnBvcnQpCiAgIH0KICAgYXNzZXJ0KHNvY2tldCwgJ0ZhaWxlZCB0byBjcmVhdGUgY2xpZW50IHNvY2tldCcpCiAgIHNvY2tldDpzZXRUaW1lb3V0KDUwMDApCiAKLSAgbG9jYWwgcHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2w6bmV3ewotICAgIHRyYW5zID0gc29ja2V0CisgIGxvY2FsIHRyYW5zcG9ydHMgPSB7CisgICAgYnVmZmVyZWQgPSBUQnVmZmVyZWRUcmFuc3BvcnQsCisgICAgZnJhbWVkID0gVEZyYW1lZFRyYW5zcG9ydCwKKyAgICBodHRwID0gVEh0dHBUcmFuc3BvcnQsCisgIH0KKyAgYXNzZXJ0KHRyYW5zcG9ydHNbb3B0LnRyYW5zcG9ydF0gfj0gbmlsKQorICBsb2NhbCB0cmFuc3BvcnQgPSB0cmFuc3BvcnRzW29wdC50cmFuc3BvcnRdOm5ld3sKKyAgICB0cmFucyA9IHNvY2tldCwKKyAgICBpc1NlcnZlciA9IGZhbHNlCisgIH0KKworICBsb2NhbCBwcm90b2NvbHMgPSB7CisgICAgYmluYXJ5ID0gVEJpbmFyeVByb3RvY29sLAorICAgIGNvbXBhY3QgPSBUQ29tcGFjdFByb3RvY29sLAorICAgIGpzb24gPSBUSlNPTlByb3RvY29sLAorICB9CisgIGFzc2VydChwcm90b2NvbHNbb3B0LnByb3RvY29sXSB+PSBuaWwpCisgIGxvY2FsIHByb3RvY29sID0gcHJvdG9jb2xzW29wdC5wcm90b2NvbF06bmV3eworICAgIHRyYW5zID0gdHJhbnNwb3J0CiAgIH0KICAgYXNzZXJ0KHByb3RvY29sLCAnRmFpbGVkIHRvIGNyZWF0ZSBiaW5hcnkgcHJvdG9jb2wnKQogCkBAIC01NCwxNCArOTAsMTggQEAKICAgfQogICBhc3NlcnQoY2xpZW50LCAnRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQnKQogCi0gIC0tIE9wZW4gdGhlIHNvY2tldAotICBsb2NhbCBzdGF0dXMsIF8gPSBwY2FsbChzb2NrZXQub3Blbiwgc29ja2V0KQorICAtLSBPcGVuIHRoZSB0cmFuc3BvcnQKKyAgbG9jYWwgc3RhdHVzLCBfID0gcGNhbGwodHJhbnNwb3J0Lm9wZW4sIHRyYW5zcG9ydCkKICAgYXNzZXJ0KHN0YXR1cywgJ0ZhaWxlZCB0byBjb25uZWN0IHRvIHNlcnZlcicpCiAKICAgLS0gU3RyaW5nCiAgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0U3RyaW5nKCdsYWxhJyksICAnbGFsYScsICAnRmFpbGVkIHRlc3RTdHJpbmcnKQogICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdFN0cmluZygnd2Fob28nKSwgJ3dhaG9vJywgJ0ZhaWxlZCB0ZXN0U3RyaW5nJykKIAorICAtLSBCb29sCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qm9vbCh0cnVlKSwgdHJ1ZSwgJ0ZhaWxlZCB0ZXN0Qm9vbCB0cnVlJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCb29sKGZhbHNlKSwgZmFsc2UsICdGYWlsZWQgdGVzdEJvb2wgZmFsc2UnKQorCiAgIC0tIEJ5dGUKICAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDB4MDEpLCAxLCAgICAnRmFpbGVkIHRlc3RCeXRlIDEnKQogICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMHg0MCksIDY0LCAgICdGYWlsZWQgdGVzdEJ5dGUgMicpCkBAIC0xMjAsMTkgKzE2MCwyMCBAQAogICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdERvdWJsZShhKSwgYiwgJ0ZhaWxlZCB0ZXN0RG91YmxlIDUnKQogCiAgIC0tIFN0cnVjdAotICBsb2NhbCBhID0geworICBsb2NhbCBvID0gWHRydWN0Om5ld3sKICAgICBzdHJpbmdfdGhpbmcgPSAnWmVybycsCiAgICAgYnl0ZV90aGluZyA9IDEsCiAgICAgaTMyX3RoaW5nID0gLTMsCiAgICAgaTY0X3RoaW5nID0gbG9uZygtNSkKICAgfQorICBsb2NhbCByID0gY2xpZW50OnRlc3RTdHJ1Y3QobykKKyAgYXNzZXJ0RXF1YWwoby5zdHJpbmdfdGhpbmcsIHIuc3RyaW5nX3RoaW5nLCAnRmFpbGVkIHRlc3RTdHJ1Y3QgMScpCisgIGFzc2VydEVxdWFsKG8uYnl0ZV90aGluZywgci5ieXRlX3RoaW5nLCAnRmFpbGVkIHRlc3RTdHJ1Y3QgMicpCisgIGFzc2VydEVxdWFsKG8uaTMyX3RoaW5nLCByLmkzMl90aGluZywgJ0ZhaWxlZCB0ZXN0U3RydWN0IDMnKQorICBhc3NlcnRFcXVhbChvLmk2NF90aGluZywgci5pNjRfdGhpbmcsICdGYWlsZWQgdGVzdFN0cnVjdCA0JykKIAotICAtLSBUT0RPIGZpeCBjbGllbnQgc3RydWN0IGVxdWFsaXR5Ci0gIC0tYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RTdHJ1Y3QoYSksIGEsICdGYWlsZWQgdGVzdFN0cnVjdCcpCi0KLSAgLS0gQ2FsbCB0aGUgdm9pZCBmdW5jdGlvbiBhbmQgZW5kIHRoZSB0ZXN0IChoYW5kbGVyIHN0b3BzIHNlcnZlcikKLSAgY2xpZW50OnRlc3RWb2lkKCkKKyAgLS0gVE9ETyBhZGQgbGlzdCBtYXAgc2V0IGV4Y2VwdGlvbiBldGMgZXRjCiBlbmQKIAotdGVzdEJhc2ljQ2xpZW50KCkKLXRlYXJkb3duKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit0ZXN0QmFzaWNDbGllbnQoYXJnKQordGVhcmRvd24oKQpkaWZmIC0tZ2l0IGEvdGVzdC9sdWEvdGVzdF9iYXNpY19zZXJ2ZXIubHVhIGIvdGVzdC9sdWEvdGVzdF9iYXNpY19zZXJ2ZXIubHVhCmluZGV4IDk2YTFhZTkuLmFjZDJkNzkgMTAwNjQ0Ci0tLSBhL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfc2VydmVyLmx1YQorKysgYi90ZXN0L2x1YS90ZXN0X2Jhc2ljX3NlcnZlci5sdWEKQEAgLTEsMjMgKzEsMjcgQEAKLS0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KIAogcmVxdWlyZSgnVGhyaWZ0VGVzdF9UaHJpZnRUZXN0JykKIHJlcXVpcmUoJ1RTb2NrZXQnKQorcmVxdWlyZSgnVEJ1ZmZlcmVkVHJhbnNwb3J0JykKIHJlcXVpcmUoJ1RGcmFtZWRUcmFuc3BvcnQnKQorcmVxdWlyZSgnVEh0dHBUcmFuc3BvcnQnKQorcmVxdWlyZSgnVENvbXBhY3RQcm90b2NvbCcpCityZXF1aXJlKCdUSnNvblByb3RvY29sJykKIHJlcXVpcmUoJ1RCaW5hcnlQcm90b2NvbCcpCiByZXF1aXJlKCdUU2VydmVyJykKIHJlcXVpcmUoJ2xpYmx1YWxvbmdudW1iZXInKQpAQCAtMjgsMTMgKzMyLDE2IEBACiAKIC0tIFN0b3BzIHRoZSBzZXJ2ZXIKIGZ1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RWb2lkKCkKLSAgc2VsZi5fX3NlcnZlcjpzdG9wKCkKIGVuZAogCiBmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0U3RyaW5nKHN0cikKICAgcmV0dXJuIHN0cgogZW5kCiAKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RCb29sKGJvb2wpCisgIHJldHVybiBib29sCitlbmQKKwogZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdEJ5dGUoYnl0ZSkKICAgcmV0dXJuIGJ5dGUKIGVuZApAQCAtNjksNyArNzYsMjQgQEAKICAgZW5kCiBlbmQKIAotZnVuY3Rpb24gdGVzdEJhc2ljU2VydmVyKCkKK2Z1bmN0aW9uIHBhcnNlQXJncyhyYXdBcmdzKQorICBsb2NhbCBvcHQgPSB7CisgICAgcHJvdG9jb2w9J2JpbmFyeScsCisgICAgdHJhbnNwb3J0PSdidWZmZXJlZCcsCisgICAgcG9ydD0nOTA5MCcsCisgIH0KKyAgZm9yIGksIHN0ciBpbiBwYWlycyhyYXdBcmdzKSBkbworICAgIGlmIGkgPiAwIHRoZW4KKyAgICAgIGssIHYgPSBzdHJpbmcubWF0Y2goc3RyLCAnLS0oJXcrKT0oJXcrKScpCisgICAgICBhc3NlcnQob3B0W2tdIH49IG5pbCwgJ1Vua25vd24gYXJndW1lbnQnKQorICAgICAgb3B0W2tdID0gdgorICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIG9wdAorZW5kCisKK2Z1bmN0aW9uIHRlc3RCYXNpY1NlcnZlcihyYXdBcmdzKQorICBsb2NhbCBvcHQgPSBwYXJzZUFyZ3MocmF3QXJncykKICAgLS0gSGFuZGxlciAmIFByb2Nlc3NvcgogICBsb2NhbCBoYW5kbGVyID0gVGVzdEhhbmRsZXI6bmV3e30KICAgYXNzZXJ0KGhhbmRsZXIsICdGYWlsZWQgdG8gY3JlYXRlIGhhbmRsZXInKQpAQCAtODAsMTQgKzEwNCwyNCBAQAogCiAgIC0tIFNlcnZlciBTb2NrZXQKICAgbG9jYWwgc29ja2V0ID0gVFNlcnZlclNvY2tldDpuZXd7Ci0gICAgcG9ydCA9IDkwOTAKKyAgICBwb3J0ID0gb3B0LnBvcnQKICAgfQogICBhc3NlcnQoc29ja2V0LCAnRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0JykKIAogICAtLSBUcmFuc3BvcnQgJiBGYWN0b3J5Ci0gIGxvY2FsIHRyYW5zX2ZhY3RvcnkgPSBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeTpuZXd7fQotICBhc3NlcnQodHJhbnNfZmFjdG9yeSwgJ0ZhaWxlZCB0byBjcmVhdGUgZnJhbWVkIHRyYW5zcG9ydCBmYWN0b3J5JykKLSAgbG9jYWwgcHJvdF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sRmFjdG9yeTpuZXd7fQorICBsb2NhbCB0cmFuc3BvcnRzID0geworICAgIGJ1ZmZlcmVkID0gVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBodHRwID0gVEh0dHBUcmFuc3BvcnRGYWN0b3J5LAorICB9CisgIGFzc2VydCh0cmFuc3BvcnRzW29wdC50cmFuc3BvcnRdLCAnRmFpbGVkIHRvIGNyZWF0ZSBmcmFtZWQgdHJhbnNwb3J0IGZhY3RvcnknKQorICBsb2NhbCB0cmFuc19mYWN0b3J5ID0gdHJhbnNwb3J0c1tvcHQudHJhbnNwb3J0XTpuZXd7fQorICBsb2NhbCBwcm90b2NvbHMgPSB7CisgICAgYmluYXJ5ID0gVEJpbmFyeVByb3RvY29sRmFjdG9yeSwKKyAgICBjb21wYWN0ID0gVENvbXBhY3RQcm90b2NvbEZhY3RvcnksCisgICAganNvbiA9IFRKU09OUHJvdG9jb2xGYWN0b3J5LAorICB9CisgIGxvY2FsIHByb3RfZmFjdG9yeSA9IHByb3RvY29sc1tvcHQucHJvdG9jb2xdOm5ld3t9CiAgIGFzc2VydChwcm90X2ZhY3RvcnksICdGYWlsZWQgdG8gY3JlYXRlIGJpbmFyeSBwcm90b2NvbCBmYWN0b3J5JykKIAogICAtLSBTaW1wbGUgU2VydmVyCkBAIC0xMDQsNSArMTM4LDUgQEAKICAgc2VydmVyID0gbmlsCiBlbmQKIAotdGVzdEJhc2ljU2VydmVyKCkKLXRlYXJkb3duKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit0ZXN0QmFzaWNTZXJ2ZXIoYXJnKQordGVhcmRvd24oKQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL0NsaWVudC8uZ2l0aWdub3JlIGIvdGVzdC9uZXRjb3JlL0NsaWVudC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDU1MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50Ly5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL1RocmlmdFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvaiBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTZhZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qCkBAIC0wLDAgKzEsMzEgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPkNsaWVudDwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+Q2xpZW50PC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2luSHR0cEhhbmRsZXIiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uVGhyZWFkaW5nIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPFRhcmdldCBOYW1lPSJQcmVCdWlsZCIgQmVmb3JlVGFyZ2V0cz0iX0dlbmVyYXRlUmVzdG9yZVByb2plY3RTcGVjO1Jlc3RvcmU7Q29tcGlsZSI+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSInJChPUyknID09ICdXaW5kb3dzX05UJyIgQ29tbWFuZD0id2hlcmUgdGhyaWZ0IiBDb25zb2xlVG9NU0J1aWxkPSJ0cnVlIj4KKyAgICAgIDxPdXRwdXQgVGFza1BhcmFtZXRlcj0iQ29uc29sZU91dHB1dCIgUHJvcGVydHlOYW1lPSJQYXRoVG9UaHJpZnQiIC8+CisgICAgPC9FeGVjPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFBhdGhUb1RocmlmdCknKSIgQ29tbWFuZD0iJnF1b3Q7JChQYXRoVG9UaHJpZnQpJnF1b3Q7IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICA8L1RhcmdldD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjEzOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdFRlc3Q7CisKK25hbWVzcGFjZSBDbGllbnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlNldEJ1ZmZlclNpemUoQ29uc29sZS5CdWZmZXJXaWR0aCwgNDA5Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJGYWlsZWQgdG8gZ3JvdyBzY3JvbGwtYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3BsaXQgbW9kZSBhbmQgb3B0aW9ucworICAgICAgICAgICAgdmFyIHN1YkFyZ3MgPSBuZXcgTGlzdDxzdHJpbmc+KGFyZ3MpOworICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgaWYgKHN1YkFyZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICBmaXJzdEFyZyA9IHN1YkFyZ3NbMF07CisgICAgICAgICAgICAgICAgc3ViQXJncy5SZW1vdmVBdCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcnVuIHdoYXRldmVyIG1vZGUgaXMgY2hvb3NlbgorICAgICAgICAgICAgc3dpdGNoKGZpcnN0QXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgImNsaWVudCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXN0Q2xpZW50LkV4ZWN1dGUoc3ViQXJncyk7CisgICAgICAgICAgICAgICAgY2FzZSAiLS1oZWxwIjoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFByaW50SGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFByaW50SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2FnZToiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIENsaWVudCAgY2xpZW50ICBbb3B0aW9uc10nIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBDbGllbnQgIC0taGVscCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiIpOworCisgICAgICAgICAgICBUZXN0Q2xpZW50LlByaW50T3B0aW9uc0hlbHAoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTcxNTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDbGllbnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiQjBDMTNEQTAtMzExNy00ODQ0LThBRTgtQjE3NzVFNDYyMjNEIildCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvVGVzdENsaWVudC5jcyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvVGVzdENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmUxOThjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9UZXN0Q2xpZW50LmNzCkBAIC0wLDAgKzEsOTQzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5TZXJ2aWNlTW9kZWw7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0VGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50CisgICAgeworICAgICAgICBwcml2YXRlIGNsYXNzIFRlc3RQYXJhbXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBudW1JdGVyYXRpb25zID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBJUEFkZHJlc3MgaG9zdCA9IElQQWRkcmVzcy5Bbnk7CisgICAgICAgICAgICBwdWJsaWMgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgcHVibGljIGludCBudW1UaHJlYWRzID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdXJsOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBwaXBlOworICAgICAgICAgICAgcHVibGljIGJvb2wgYnVmZmVyZWQ7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBmcmFtZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHByb3RvY29sOworICAgICAgICAgICAgcHVibGljIGJvb2wgZW5jcnlwdGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGludGVybmFsIHZvaWQgUGFyc2UoIExpc3Q8c3RyaW5nPiBhcmdzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5Db3VudDsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gIi11IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1uIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtSXRlcmF0aW9ucyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1waXBlPSIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXBlID0gYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBuYW1lZCBwaXBlcyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0taG9zdD0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlcmUgZm9yIGlwYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA9IG5ldyBJUEFkZHJlc3MoRW5jb2RpbmcuVW5pY29kZS5HZXRCeXRlcyhhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXBvcnQ9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGJ1ZmZlcmVkIHNvY2tldHMiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi10IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGhyZWFkcyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tYmluYXJ5IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWJpbmFyeSIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gImJpbmFyeSI7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJjb21wYWN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBjb21wYWN0IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWpzb24iKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJqc29uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBKU09OIHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1zc2wiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGVuY3J5cHRlZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUyIEdldENsaWVudENlcnQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjbGllbnRDZXJ0TmFtZSA9ICJjbGllbnQucDEyIjsKKyAgICAgICAgICAgICAgICB2YXIgcG9zc2libGVQYXRocyA9IG5ldyBMaXN0PHN0cmluZz4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICIuLi8uLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICIuLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICIuLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICJrZXlzLyIsCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHN0cmluZyBleGlzdGluZ1BhdGggPSBudWxsOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwb3NzaWJsZVBhdGggaW4gcG9zc2libGVQYXRocykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwYXRoID0gUGF0aC5HZXRGdWxsUGF0aChwb3NzaWJsZVBhdGggKyBjbGllbnRDZXJ0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhwYXRoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGV4aXN0aW5nUGF0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCQiQ2Fubm90IGZpbmQgZmlsZToge2NsaWVudENlcnROYW1lfSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHZhciBjZXJ0ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoZXhpc3RpbmdQYXRoLCAidGhyaWZ0Iik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY2VydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIFRDbGllbnRUcmFuc3BvcnQgQ3JlYXRlVHJhbnNwb3J0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodXJsID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBlbmRwb2ludCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCB0cmFucyA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpcGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNyeXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VydCA9IEdldENsaWVudENlcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZXJ0ID09IG51bGwgfHwgIWNlcnQuSGFzUHJpdmF0ZUtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDZXJ0aWZpY2F0ZSBkb2Vzbid0IGNvbnRhaW4gcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChob3N0LCBwb3J0LCAwLCBjZXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbmRlciwgY2VydGlmaWNhdGUsIGNoYWluLCBlcnJvcnMpID0+IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMgfCBTc2xQcm90b2NvbHMuVGxzMTEgfCBTc2xQcm90b2NvbHMuVGxzMTIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBsYXllcmVkIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KG5ldyBVcmkodXJsKSwgbnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgQ3JlYXRlUHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByb3RvY29sID09ICJjb21wYWN0IikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSAianNvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckJhc2VUeXBlcyA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yU3RydWN0cyA9IDI7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQ29udGFpbmVycyA9IDQ7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yRXhjZXB0aW9ucyA9IDg7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yVW5rbm93biA9IDY0OworCisgICAgICAgIHByaXZhdGUgY2xhc3MgQ2xpZW50VGVzdAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBudW1JdGVyYXRpb25zOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGRvbmU7CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgUmV0dXJuQ29kZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGllbnRUZXN0KFRlc3RQYXJhbXMgcGFyYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gcGFyYW0uQ3JlYXRlVHJhbnNwb3J0KCk7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHBhcmFtLkNyZWF0ZVByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgIG51bUl0ZXJhdGlvbnMgPSBwYXJhbS5udW1JdGVyYXRpb25zOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVjdXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lOworCisgICAgICAgICAgICAgICAgaWYgKGRvbmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhlY3V0ZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUl0ZXJhdGlvbnM7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zcG9ydC5Jc09wZW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW5Bc3luYyh0b2tlbikuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb25uZWN0IGZhaWxlZDogIiArIGV4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ29ubmVjdCBmYWlsZWQ6ICIgKyBleC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXhlY3V0ZUNsaWVudFRlc3RBc3luYyhjbGllbnQpLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3Igd2hpbGUgY2xvc2luZyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBQcmludE9wdGlvbnNIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNsaWVudCBvcHRpb25zOiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLXUgPFVSTD4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC10IDwjIG9mIHRocmVhZHMgdG8gcnVuPiAgICAgICAgZGVmYXVsdCA9IDEiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC1uIDwjIG9mIGl0ZXJhdGlvbnM+ICAgICAgICAgICAgcGVyIHRocmVhZCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1waXBlPTxwaXBlIG5hbWU+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLWhvc3Q9PElQIGFkZHJlc3M+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXBvcnQ9PHBvcnQgbnVtYmVyPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS10cmFuc3BvcnQ9PHRyYW5zcG9ydCBuYW1lPiAgICBvbmUgb2YgYnVmZmVyZWQsZnJhbWVkICAoZGVmYXVsdHMgdG8gbm9uZSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcHJvdG9jb2w9PHByb3RvY29sIG5hbWU+ICAgICAgb25lIG9mIGNvbXBhY3QsanNvbiAgKGRlZmF1bHRzIHRvIGJpbmFyeSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tc3NsIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRXhlY3V0ZShMaXN0PHN0cmluZz4gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhcmFtID0gbmV3IFRlc3RQYXJhbXMoKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uUGFyc2UoYXJncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlICBwYXJzaW5nIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB0ZXN0cyA9IEVudW1lcmFibGUuUmFuZ2UoMCwgcGFyYW0ubnVtVGhyZWFkcykuU2VsZWN0KF8gPT4gbmV3IENsaWVudFRlc3QocGFyYW0pKS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKKyAgICAgICAgICAgICAgICB2YXIgdGhyZWFkcyA9IHRlc3RzLlNlbGVjdCh0ZXN0ID0+IG5ldyBUYXNrKHRlc3QuRXhlY3V0ZSkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBEYXRlVGltZS5Ob3c7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gdGhyZWFkcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUYXNrLldhaXRBbGwodGhyZWFkcyk7CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVG90YWwgdGltZTogIiArIChEYXRlVGltZS5Ob3cgLSBzdGFydCkpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RzLlNlbGVjdCh0ID0+IHQuUmV0dXJuQ29kZSkuQWdncmVnYXRlKChyMSwgcjIpID0+IHIxIHwgcjIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBvdXRlckV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVbmV4cGVjdGVkIGVycm9yIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUob3V0ZXJFeC5NZXNzYWdlICsgIiBTVDogIiArIG91dGVyRXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEJ5dGVzVG9IZXgoYnl0ZVtdIGRhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcoZGF0YSkuUmVwbGFjZSgiLSIsIHN0cmluZy5FbXB0eSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBQcmVwYXJlVGVzdERhdGEoYm9vbCByYW5kb21EaXN0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmV0dmFsID0gbmV3IGJ5dGVbMHgxMDBdOworICAgICAgICAgICAgdmFyIGluaXRMZW4gPSBNYXRoLk1pbigweDEwMCwgcmV0dmFsLkxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIGxpbmVhciBkaXN0cmlidXRpb24sIHVubGVzcyByYW5kb20gaXMgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoIXJhbmRvbURpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByYW5kb20gZGlzdHJpYnV0aW9uCisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRMZW47ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSkwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgaW5pdExlbjsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRQb3MgPSBybmQuTmV4dCgpICUgaW5pdExlbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbFtuZXh0UG9zXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWxbbmV4dFBvc10gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrPGludD4gRXhlY3V0ZUNsaWVudFRlc3RBc3luYyhUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLk5vbmU7CisgICAgICAgICAgICB2YXIgcmV0dXJuQ29kZSA9IDA7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0Vm9pZEFzeW5jKHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB2b2lkIik7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7CisgICAgICAgICAgICB2YXIgcyA9IGF3YWl0IGNsaWVudC50ZXN0U3RyaW5nQXN5bmMoIlRlc3QiLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gXCIiICsgcyArICJcIiIpOworICAgICAgICAgICAgaWYgKCJUZXN0IiAhPSBzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKHRydWUpIik7CisgICAgICAgICAgICB2YXIgdCA9IGF3YWl0IGNsaWVudC50ZXN0Qm9vbEFzeW5jKChib29sKXRydWUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdCk7CisgICAgICAgICAgICBpZiAoIXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKGZhbHNlKSIpOworICAgICAgICAgICAgdmFyIGYgPSBhd2FpdCBjbGllbnQudGVzdEJvb2xBc3luYygoYm9vbClmYWxzZSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBmKTsKKyAgICAgICAgICAgIGlmIChmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCeXRlKDEpIik7CisgICAgICAgICAgICB2YXIgaTggPSBhd2FpdCBjbGllbnQudGVzdEJ5dGVBc3luYygoc2J5dGUpMSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpOCk7CisgICAgICAgICAgICBpZiAoMSAhPSBpOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STMyKC0xKSIpOworICAgICAgICAgICAgdmFyIGkzMiA9IGF3YWl0IGNsaWVudC50ZXN0STMyQXN5bmMoLTEsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTMyKTsKKyAgICAgICAgICAgIGlmICgtMSAhPSBpMzIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CisgICAgICAgICAgICB2YXIgaTY0ID0gYXdhaXQgY2xpZW50LnRlc3RJNjRBc3luYygtMzQzNTk3MzgzNjgsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTY0KTsKKyAgICAgICAgICAgIGlmICgtMzQzNTk3MzgzNjggIT0gaTY0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7CisgICAgICAgICAgICB2YXIgZHViID0gYXdhaXQgY2xpZW50LnRlc3REb3VibGVBc3luYyg1LjMyNTA5ODIzNSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKDUuMzI1MDk4MjM1ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpIik7CisgICAgICAgICAgICBkdWIgPSBhd2FpdCBjbGllbnQudGVzdERvdWJsZUFzeW5jKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSAhPSBkdWIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJpbk91dCA9IFByZXBhcmVUZXN0RGF0YSh0cnVlKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCaW5hcnkoIiArIEJ5dGVzVG9IZXgoYmluT3V0KSArICIpIik7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYmluSW4gPSBhd2FpdCBjbGllbnQudGVzdEJpbmFyeUFzeW5jKGJpbk91dCwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgQnl0ZXNUb0hleChiaW5JbikpOworICAgICAgICAgICAgICAgIGlmIChiaW5Jbi5MZW5ndGggIT0gYmluT3V0Lkxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHZhciBvZnMgPSAwOyBvZnMgPCBNYXRoLk1pbihiaW5Jbi5MZW5ndGgsIGJpbk91dC5MZW5ndGgpOyArK29mcykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluW29mc10gIT0gYmluT3V0W29mc10pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBiaW5hcnkgZXF1YWxzPyBvbmx5IHdpdGggaGFzaGNvZGUgb3B0aW9uIGVuYWJsZWQgLi4uCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVGVzdCBDcmF6eU5lc3RpbmciKTsKKyAgICAgICAgICAgIHZhciBvbmUgPSBuZXcgQ3JhenlOZXN0aW5nKCk7CisgICAgICAgICAgICB2YXIgdHdvID0gbmV3IENyYXp5TmVzdGluZygpOworICAgICAgICAgICAgb25lLlN0cmluZ19maWVsZCA9ICJjcmF6eSI7CisgICAgICAgICAgICB0d28uU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgIG9uZS5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVtdIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHhGRiB9OworICAgICAgICAgICAgdHdvLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlWzEwXSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4RkYgfTsKKyAgICAgICAgICAgIGlmICh0eXBlb2YoQ3JhenlOZXN0aW5nKS5HZXRNZXRob2QoIkVxdWFscyIpPy5EZWNsYXJpbmdUeXBlID09IHR5cGVvZihDcmF6eU5lc3RpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghb25lLkVxdWFscyh0d28pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JDb250YWluZXJzOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDcmF6eU5lc3RpbmcuRXF1YWxzIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7CisgICAgICAgICAgICB2YXIgbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgIG8uU3RyaW5nX3RoaW5nID0gIlplcm8iOworICAgICAgICAgICAgby5CeXRlX3RoaW5nID0gKHNieXRlKTE7CisgICAgICAgICAgICBvLkkzMl90aGluZyA9IC0zOworICAgICAgICAgICAgby5JNjRfdGhpbmcgPSAtNTsKKyAgICAgICAgICAgIHZhciBpID0gYXdhaXQgY2xpZW50LnRlc3RTdHJ1Y3RBc3luYyhvLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0ge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pIik7CisgICAgICAgICAgICB2YXIgbzIgPSBuZXcgWHRydWN0MigpOworICAgICAgICAgICAgbzIuQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgbzIuU3RydWN0X3RoaW5nID0gbzsKKyAgICAgICAgICAgIG8yLkkzMl90aGluZyA9IDU7CisgICAgICAgICAgICB2YXIgaTIgPSBhd2FpdCBjbGllbnQudGVzdE5lc3RBc3luYyhvMiwgdG9rZW4pOworICAgICAgICAgICAgaSA9IGkyLlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7IiArIGkyLkJ5dGVfdGhpbmcgKyAiLCB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSwgIiArIGkyLkkzMl90aGluZyArICJ9Iik7CisKKyAgICAgICAgICAgIHZhciBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcG91dFtqXSA9IGogLSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOworICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbWFwb3V0LktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBvdXRba2V5XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgbWFwaW4gPSBhd2FpdCBjbGllbnQudGVzdE1hcEFzeW5jKG1hcG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIG1hcGluLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOworICAgICAgICAgICAgZm9yICh2YXIgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RvdXQuQWRkKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGogaW4gbGlzdG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgdmFyIGxpc3RpbiA9IGF3YWl0IGNsaWVudC50ZXN0TGlzdEFzeW5jKGxpc3RvdXQsIHRva2VuKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGogaW4gbGlzdGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvL3NldAorICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIHNldG91dCA9IG5ldyBUSGFzaFNldDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKHZhciBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0b3V0LkFkZChqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTZXQoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gc2V0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgc2V0aW4gPSBhd2FpdCBjbGllbnQudGVzdFNldEFzeW5jKHNldG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShPTkUpIik7CisgICAgICAgICAgICB2YXIgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5PTkUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6Lk9ORSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRXTykiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouVFdPLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5UV08gIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouVEhSRUUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRIUkVFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouRklWRSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRklWRSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEVJR0hUKSIpOworICAgICAgICAgICAgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5FSUdIVCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRUlHSFQgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgICAgICAgICB2YXIgdWlkID0gYXdhaXQgY2xpZW50LnRlc3RUeXBlZGVmQXN5bmMoMzA5ODU4MjM1MDgyNTIzTCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOworICAgICAgICAgICAgaWYgKDMwOTg1ODIzNTA4MjUyM0wgIT0gdWlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgICAgICAgICB2YXIgbW0gPSBhd2FpdCBjbGllbnQudGVzdE1hcE1hcEFzeW5jKDEsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbW0uS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworICAgICAgICAgICAgICAgIHZhciBtMiA9IG1tW2tleV07CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGsyIGluIG0yLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDBMOworICAgICAgICAgICAgdmFyIHRydWNrID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgdHJ1Y2suU3RyaW5nX3RoaW5nID0gIlRydWNrIjsKKyAgICAgICAgICAgIHRydWNrLkJ5dGVfdGhpbmcgPSAoc2J5dGUpODsKKyAgICAgICAgICAgIHRydWNrLkkzMl90aGluZyA9IDg7CisgICAgICAgICAgICB0cnVjay5JNjRfdGhpbmcgPSA4OworICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cy5BZGQodHJ1Y2spOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgICAgIHZhciB3aG9hID0gYXdhaXQgY2xpZW50LnRlc3RJbnNhbml0eUFzeW5jKGluc2FuZSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiB3aG9hLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHdob2Fba2V5XTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGsyIGluIHZhbC5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHYyID0gdmFsW2syXTsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgICAgIHZhciB1c2VyTWFwID0gdjIuVXNlck1hcDsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrMyBpbiB1c2VyTWFwLktleXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMyArICIgPT4gIiArIHVzZXJNYXBbazNdICsgIiwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHh0cnVjdHMgPSB2Mi5YdHJ1Y3RzOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHggaW4geHRydWN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7XCIiICsgeC5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LkJ5dGVfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAifSwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSIpOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIHNieXRlIGFyZzAgPSAxOworICAgICAgICAgICAgdmFyIGFyZzEgPSAyOworICAgICAgICAgICAgdmFyIGFyZzIgPSBsb25nLk1heFZhbHVlOworICAgICAgICAgICAgdmFyIG11bHRpRGljdCA9IG5ldyBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+KCk7CisgICAgICAgICAgICBtdWx0aURpY3RbMV0gPSAib25lIjsKKworICAgICAgICAgICAgdmFyIHRtcE11bHRpRGljdCA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYWlyIGluIG11bHRpRGljdCkKKyAgICAgICAgICAgICAgICB0bXBNdWx0aURpY3QuQWRkKHBhaXIuS2V5ICsiID0+ICIrIHBhaXIuVmFsdWUpOworCisgICAgICAgICAgICB2YXIgYXJnNCA9IE51bWJlcnouRklWRTsKKyAgICAgICAgICAgIGxvbmcgYXJnNSA9IDUwMDAwMDA7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IE11bHRpKCIgKyBhcmcwICsgIiwiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLHsiICsgc3RyaW5nLkpvaW4oIiwiLCB0bXBNdWx0aURpY3QpICsgIn0sIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKKyAgICAgICAgICAgIHZhciBtdWx0aVJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnRlc3RNdWx0aUFzeW5jKGFyZzAsIGFyZzEsIGFyZzIsIG11bHRpRGljdCwgYXJnNCwgYXJnNSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICArICIsaTMyX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkkzMl90aGluZyArICIsaTY0X3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkk2NF90aGluZyArICIpXG4iKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uQXN5bmMoIlhjZXB0aW9uIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMTAwMSB8fCBleC5NZXNzYWdlICE9ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RFeGNlcHRpb25Bc3luYygiVEV4Y2VwdGlvbiIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJpZnQuVEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJva1wiKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uQXN5bmMoIm9rIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCAuLi4pIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jKCJYY2VwdGlvbiIsICJpZ25vcmUiLCB0b2tlbik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAxMDAxIHx8IGV4Lk1lc3NhZ2UgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgLi4uKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb25Bc3luYygiWGNlcHRpb24yIiwgImlnbm9yZSIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbjIgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAyMDAyIHx8IGV4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcIk9LXCIpIik7CisgICAgICAgICAgICAgICAgaWYgKCJPSyIgIT0gKGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb25Bc3luYygic3VjY2VzcyIsICJPSyIsIHRva2VuKSkuU3RyaW5nX3RoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHN3ID0gbmV3IFN0b3B3YXRjaCgpOworICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RPbmV3YXlBc3luYygxLCB0b2tlbik7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBpZiAoc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyA+IDEwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiVGVzdCBDYWxsdGltZSgpIik7CisgICAgICAgICAgICB2YXIgdGltZXMgPSA1MDsKKyAgICAgICAgICAgIHN3LlJlc2V0KCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aW1lczsgKytrKQorICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0Vm9pZEFzeW5jKHRva2VuKTsKKyAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7MH0gbXMgYSB0ZXN0Vm9pZCgpIGNhbGwiLCBzdy5FbGFwc2VkTWlsbGlzZWNvbmRzIC8gdGltZXMpOworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvTWFrZWZpbGUuYW0gYi90ZXN0L25ldGNvcmUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmZjRiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4gCisKK2FsbC1sb2NhbDoKKwkkKERPVE5FVENPUkUpIGJ1aWxkCisKK3ByZWNyb3NzOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgQ2xpZW50L2JpbgorCSQoUk0pIC1yIENsaWVudC9vYmoKKwkkKFJNKSAtciBDbGllbnQvVGhyaWZ0VGVzdAorCSQoUk0pIC1yIFNlcnZlci9iaW4KKwkkKFJNKSAtciBTZXJ2ZXIvb2JqCisJJChSTSkgLXIgU2VydmVyL1RocmlmdFRlc3QKKworZGlzdC1ob29rOgorCSQoUk0pIC1yICQoZGlzdGRpcikvQ2xpZW50L2JpbgorCSQoUk0pIC1yICQoZGlzdGRpcikvQ2xpZW50L29iagorCSQoUk0pIC1yICQoZGlzdGRpcikvQ2xpZW50L1RocmlmdFRlc3QKKwkkKFJNKSAtciAkKGRpc3RkaXIpL1NlcnZlci9iaW4KKwkkKFJNKSAtciAkKGRpc3RkaXIpL1NlcnZlci9vYmoKKwkkKFJNKSAtciAkKGRpc3RkaXIpL1NlcnZlci9UaHJpZnRUZXN0CisKK0VYVFJBX0RJU1QgPSBcCisJQ2xpZW50IFwKKwlSRUFETUUubWQgXAorCVNlcnZlciBcCisJVGhyaWZ0VGVzdC5zbG4gXAorCWJ1aWxkLmNtZCBcCisJYnVpbGQuc2gKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9SRUFETUUubWQgYi90ZXN0L25ldGNvcmUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNzI4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjAgQEAKKyMgQXBhY2hlIFRocmlmdCBuZXQtY29yZS1saWIgdGVzdHMKKworVGVzdHMgZm9yIFRocmlmdCBjbGllbnQgbGlicmFyeSBwb3J0ZWQgdG8gTWljcm9zb2Z0IC5OZXQgQ29yZSAKKworIyBDb250ZW50CistIFRocmlmdFRlc3QgLSB0ZXN0cyBmb3IgVGhyaWZ0IGxpYnJhcnkgCisKKyMgUmV1c2VkIGNvbXBvbmVudHMgCistIE5FVCBDb3JlIFN0YW5kYXJkIDEuNiAoU0RLIDIuMC4wKQorCisjIEhvdyB0byBidWlsZCBvbiBXaW5kb3dzCistIEdldCBUaHJpZnQgSURMIGNvbXBpbGVyIGV4ZWN1dGFibGUsIGFkZCB0byBzb21lIGZvbGRlciBhbmQgYWRkIHBhdGggdG8gdGhpcyBmb2xkZXIgaW50byBQQVRIIHZhcmlhYmxlCistIE9wZW4gVGhyaWZ0VGVzdC5zbG4gaW4gVmlzdWFsIFN0dWRpbyBhbmQgYnVpbGQKK29yIAorLSBCdWlsZCB3aXRoIHNjcmlwdHMKKworIyBIb3cgdG8gYnVpbGQgb24gVW5peAorLSBFbnN1cmUgeW91IGhhdmUgLk5FVCBDb3JlIDIuMC4wIFNESyBpbnN0YWxsZWQgb3IgdXNlIHRoZSBVYnVudHUgWGVuaWFsIGRvY2tlciBpbWFnZQorLSBGb2xsb3cgY29tbW9uIGJ1aWxkIHByYWN0aWNlIGZvciBUaHJpZnQ6IGJvb3RzdHJhcCwgY29uZmlndXJlLCBhbmQgbWFrZSBwcmVjcm9zcworCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvU2VydmVyLy5naXRpZ25vcmUgYi90ZXN0L25ldGNvcmUvU2VydmVyLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNTUxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKKyMgaWdub3JlIGZvciBhdXRvZ2VuZXJhdGVkIGZpbGVzCisvVGhyaWZ0VGVzdApkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NDdlNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvU2VydmVyL1Byb2dyYW0uY3MKQEAgLTAsMCArMSw3MiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0VGVzdDsKKworbmFtZXNwYWNlIFNlcnZlcgoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuU2V0QnVmZmVyU2l6ZShDb25zb2xlLkJ1ZmZlcldpZHRoLCA0MDk2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkZhaWxlZCB0byBncm93IHNjcm9sbC1iYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzcGxpdCBtb2RlIGFuZCBvcHRpb25zCisgICAgICAgICAgICB2YXIgc3ViQXJncyA9IG5ldyBMaXN0PHN0cmluZz4oYXJncyk7CisgICAgICAgICAgICB2YXIgZmlyc3RBcmcgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBpZiAoc3ViQXJncy5Db3VudCA+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++7v01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwCisjIFZpc3VhbCBTdHVkaW8gMTUKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxNS4wLjI2NzMwLjEyCitNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEwLjAuNDAyMTkuMQorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQiLCAiLi5cLi5cbGliXG5ldGNvcmVcVGhyaWZ0XFRocmlmdC5jc3Byb2oiLCAie0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkNsaWVudCIsICJDbGllbnRcQ2xpZW50LmNzcHJvaiIsICJ7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiU2VydmVyIiwgIlNlcnZlclxTZXJ2ZXIuY3Nwcm9qIiwgInswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJRGVidWd8eDY0ID0gRGVidWd8eDY0CisJCURlYnVnfHg4NiA9IERlYnVnfHg4NgorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NAorCQlSZWxlYXNlfHg4NiA9IFJlbGVhc2V8eDg2CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbgorCQlTb2x1dGlvbkd1aWQgPSB7NTJDRTlBMTItRjZDQi00RjBDLUJCNDItMDEwNTYxMkY1RkY0fQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL2J1aWxkLmNtZCBiL3Rlc3QvbmV0Y29yZS9idWlsZC5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NGVmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9idWlsZC5jbWQKQEAgLTAsMCArMSwyNSBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCitzZXRsb2NhbAorCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQKKworOmVvZgpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL2J1aWxkLnNoIGIvdGVzdC9uZXRjb3JlL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM5N2UzMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvYnVpbGQuc2gKQEAgLTAsMCArMSwyNiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworI2V4aXQgaWYgYW55IGNvbW1hbmQgZmFpbHMKK3NldCAtZQorCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0c3RkL0NsaWVudC8uZ2l0aWdub3JlIGIvdGVzdC9uZXRzdGQvQ2xpZW50Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNTUxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0c3RkL0NsaWVudC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMiBAQAorIyBpZ25vcmUgZm9yIGF1dG9nZW5lcmF0ZWQgZmlsZXMKKy9UaHJpZnRUZXN0CmRpZmYgLS1naXQgYS90ZXN0L25ldHN0ZC9DbGllbnQvQ2xpZW50LmNzcHJvaiBiL3Rlc3QvbmV0c3RkL0NsaWVudC9DbGllbnQuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMzBjMzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldHN0ZC9DbGllbnQvQ2xpZW50LmNzcHJvagpAQCAtMCwwICsxLDUwIEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPCEtLQorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAKKyAgCSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+Q2xpZW50PC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5DbGllbnQ8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuSHR0cC5XaW5IdHRwSGFuZGxlciIgVmVyc2lvbj0iNC41LjIiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5QcmltaXRpdmVzIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbC5QcmltaXRpdmVzIiBWZXJzaW9uPSI0LjUuMyIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uVGhyZWFkaW5nIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxuZXRzdGRcVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8VGFyZ2V0IE5hbWU9IlByZUJ1aWxkIiBCZWZvcmVUYXJnZXRzPSJfR2VuZXJhdGVSZXN0b3JlUHJvamVjdFNwZWM7UmVzdG9yZTtDb21waWxlIj4KKyAgICA8RXhlYyBDb25kaXRpb249IickKE9TKScgPT0gJ1dpbmRvd3NfTlQnIiBDb21tYW5kPSJ3aGVyZSB0aHJpZnQiIENvbnNvbGVUb01TQnVpbGQ9InRydWUiPgorICAgICAgPE91dHB1dCBUYXNrUGFyYW1ldGVyPSJDb25zb2xlT3V0cHV0IiBQcm9wZXJ0eU5hbWU9IlBhdGhUb1RocmlmdCIgLz4KKyAgICA8L0V4ZWM+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSImcXVvdDskKFBhdGhUb1RocmlmdCkmcXVvdDsgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0c3RkOndjZix1bmlvbixzZXJpYWwgLXIgLi8uLi8uLi9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRzdGQ6d2NmLHVuaW9uLHNlcmlhbCAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldHN0ZDp3Y2YsdW5pb24sc2VyaWFsIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgIDwvVGFyZ2V0PgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRzdGQvQ2xpZW50L1Byb2dyYW0uY3MgYi90ZXN0L25ldHN0ZC9DbGllbnQvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDk3M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRzdGQvQ2xpZW50L1Byb2dyYW0uY3MKQEAgLTAsMCArMSw3MyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0VGVzdDsKKworbmFtZXNwYWNlIENsaWVudAoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuU2V0QnVmZmVyU2l6ZShDb25zb2xlLkJ1ZmZlcldpZHRoLCA0MDk2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkZhaWxlZCB0byBncm93IHNjcm9sbC1iYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzcGxpdCBtb2RlIGFuZCBvcHRpb25zCisgICAgICAgICAgICB2YXIgc3ViQXJncyA9IG5ldyBMaXN0PHN0cmluZz4oYXJncyk7CisgICAgICAgICAgICB2YXIgZmlyc3RBcmcgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBpZiAoc3ViQXJncy5Db3VudCA+IDApCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIGZpcnN0QXJnID0gc3ViQXJnc1swXTsKKyAgICAgICAgICAgICAgICBzdWJBcmdzLlJlbW92ZUF0KDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBydW4gd2hhdGV2ZXIgbW9kZSBpcyBjaG9vc2VuCisgICAgICAgICAgICBzd2l0Y2goZmlyc3RBcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiY2xpZW50IjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RDbGllbnQuRXhlY3V0ZShzdWJBcmdzKTsKKyAgICAgICAgICAgICAgICBjYXNlICItLWhlbHAiOgorICAgICAgICAgICAgICAgICAgICBQcmludEhlbHAoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkludmFsaWQgYXJndW1lbnQ6IHswfSIsIGZpcnN0QXJnKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJpbnRIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzYWdlOiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgQ2xpZW50ICBjbGllbnQgIFtvcHRpb25zXSciKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIENsaWVudCAgLS1oZWxwIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiIik7CisKKyAgICAgICAgICAgIFRlc3RDbGllbnQuUHJpbnRPcHRpb25zSGVscCgpOworICAgICAgICB9CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0c3RkL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3Rlc3QvbmV0c3RkL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTcxNTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRzdGQvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkNsaWVudCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJCMEMxM0RBMC0zMTE3LTQ4NDQtOEFFOC1CMTc3NUU0NjIyM0QiKV0KKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRzdGQvQ2xpZW50L1Rlc3RDbGllbnQuY3MgYi90ZXN0L25ldHN0ZC9DbGllbnQvVGVzdENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODUzMTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRzdGQvQ2xpZW50L1Rlc3RDbGllbnQuY3MKQEAgLTAsMCArMSwxMDE4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5TZXJ2aWNlTW9kZWw7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0VGVzdAoreworICAgIGludGVybmFsIGVudW0gUHJvdG9jb2xDaG9pY2UKKyAgICB7CisgICAgICAgIEJpbmFyeSwKKyAgICAgICAgQ29tcGFjdCwKKyAgICAgICAgSnNvbgorICAgIH0KKworICAgIC8vIGl0IGRvZXMgbm90IG1ha2UgbXVjaCBzZW5zZSB0byB1c2UgYnVmZmVyZWQgd2hlbiB3ZSBhbHJlYWR5IHVzZSBmcmFtZWQKKyAgICBpbnRlcm5hbCBlbnVtIExheWVyZWRDaG9pY2UKKyAgICB7CisgICAgICAgIE5vbmUsCisgICAgICAgIEJ1ZmZlcmVkLAorICAgICAgICBGcmFtZWQKKyAgICB9CisKKworICAgIGludGVybmFsIGVudW0gVHJhbnNwb3J0Q2hvaWNlCisgICAgeworICAgICAgICBTb2NrZXQsCisgICAgICAgIFRsc1NvY2tldCwKKyAgICAgICAgTmFtZWRQaXBlCisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFRlc3RDbGllbnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgY2xhc3MgVGVzdFBhcmFtcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bUl0ZXJhdGlvbnMgPSAxOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7CisgICAgICAgICAgICBwdWJsaWMgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgcHVibGljIGludCBudW1UaHJlYWRzID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdXJsOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBwaXBlOworICAgICAgICAgICAgcHVibGljIExheWVyZWRDaG9pY2UgbGF5ZXJlZCA9IExheWVyZWRDaG9pY2UuTm9uZTsKKyAgICAgICAgICAgIHB1YmxpYyBQcm90b2NvbENob2ljZSBwcm90b2NvbCA9IFByb3RvY29sQ2hvaWNlLkJpbmFyeTsKKyAgICAgICAgICAgIHB1YmxpYyBUcmFuc3BvcnRDaG9pY2UgdHJhbnNwb3J0ID0gVHJhbnNwb3J0Q2hvaWNlLlNvY2tldDsKKworICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBQYXJzZSggTGlzdDxzdHJpbmc+IGFyZ3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLkNvdW50OyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSAiLXUiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBhcmdzWysraV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLW4iKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1JdGVyYXRpb25zID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXBpcGU9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gVHJhbnNwb3J0Q2hvaWNlLk5hbWVkUGlwZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0taG9zdD0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlcmUgZm9yIGlwYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA9IGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNwb3J0ICE9IFRyYW5zcG9ydENob2ljZS5UbHNTb2NrZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gVHJhbnNwb3J0Q2hvaWNlLlNvY2tldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCA9IGludC5QYXJzZShhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gVHJhbnNwb3J0Q2hvaWNlLlRsc1NvY2tldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBUcmFuc3BvcnRDaG9pY2UuU29ja2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItLWJ1ZmZlcmVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1idWZmZXJlZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyZWQgPSBMYXllcmVkQ2hvaWNlLkJ1ZmZlcmVkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9ZnJhbWVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJlZCA9IExheWVyZWRDaG9pY2UuRnJhbWVkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi10IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGhyZWFkcyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tYmluYXJ5IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWJpbmFyeSIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gUHJvdG9jb2xDaG9pY2UuQmluYXJ5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tY29tcGFjdCIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1jb21wYWN0IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBQcm90b2NvbENob2ljZS5Db21wYWN0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBQcm90b2NvbENob2ljZS5Kc29uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tc3NsIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gVHJhbnNwb3J0Q2hvaWNlLlRsc1NvY2tldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWhlbHAiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludE9wdGlvbnNIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiSW52YWxpZCBhcmd1bWVudDogezB9IiwgYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludE9wdGlvbnNIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0Q2hvaWNlLlNvY2tldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBzb2NrZXQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnRDaG9pY2UuVGxzU29ja2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGVuY3J5cHRlZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydENob2ljZS5OYW1lZFBpcGU6CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgbmFtZWQgcGlwZXMgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogIC8vIHVuaGFuZGxlZCBjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChsYXllcmVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMYXllcmVkQ2hvaWNlLkZyYW1lZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBmcmFtZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMYXllcmVkQ2hvaWNlLkJ1ZmZlcmVkOgorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGJ1ZmZlcmVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyB1bmhhbmRsZWQgY2FzZT8KKyAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnLkFzc2VydChsYXllcmVkID09IExheWVyZWRDaG9pY2UuTm9uZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb3RvY29sKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbENob2ljZS5CaW5hcnk6CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbENob2ljZS5Db21wYWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGNvbXBhY3QgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sQ2hvaWNlLkpzb246CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgSlNPTiBwcm90b2NvbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyB1bmhhbmRsZWQgY2FzZT8KKyAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnLkFzc2VydChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZTIgR2V0Q2xpZW50Q2VydCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNsaWVudENlcnROYW1lID0gImNsaWVudC5wMTIiOworICAgICAgICAgICAgICAgIHZhciBwb3NzaWJsZVBhdGhzID0gbmV3IExpc3Q8c3RyaW5nPgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIi4uLy4uLy4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAgICAgIi4uLy4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAgICAgIi4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAgICAgImtleXMvIiwKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgc3RyaW5nIGV4aXN0aW5nUGF0aCA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBvc3NpYmxlUGF0aCBpbiBwb3NzaWJsZVBhdGhzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGggPSBQYXRoLkdldEZ1bGxQYXRoKHBvc3NpYmxlUGF0aCArIGNsaWVudENlcnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKHBhdGgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1BhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZXhpc3RpbmdQYXRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oJCJDYW5ub3QgZmluZCBmaWxlOiB7Y2xpZW50Q2VydE5hbWV9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFyIGNlcnQgPSBuZXcgWDUwOUNlcnRpZmljYXRlMihleGlzdGluZ1BhdGgsICJ0aHJpZnQiKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBjZXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydCBDcmVhdGVUcmFuc3BvcnQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGVuZHBvaW50IHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2godHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydENob2ljZS5OYW1lZFBpcGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KHBpcGUgIT0gbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZVRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnRDaG9pY2UuVGxzU29ja2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlcnQgPSBHZXRDbGllbnRDZXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlcnQgPT0gbnVsbCB8fCAhY2VydC5IYXNQcml2YXRlS2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNlcnRpZmljYXRlIGRvZXNuJ3QgY29udGFpbiBwcml2YXRlIGtleSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVGxzU29ja2V0VHJhbnNwb3J0KGhvc3QsIHBvcnQsIDAsIGNlcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VuZGVyLCBjZXJ0aWZpY2F0ZSwgY2hhaW4sIGVycm9ycykgPT4gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyB8IFNzbFByb3RvY29scy5UbHMxMSB8IFNzbFByb3RvY29scy5UbHMxMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0Q2hvaWNlLlNvY2tldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldFRyYW5zcG9ydChob3N0LCBwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgLy8gbGF5ZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGxheWVyZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTGF5ZXJlZENob2ljZS5CdWZmZXJlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMYXllcmVkQ2hvaWNlLkZyYW1lZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KGxheWVyZWQgPT0gTGF5ZXJlZENob2ljZS5Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwVHJhbnNwb3J0KG5ldyBVcmkodXJsKSwgbnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgQ3JlYXRlUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcm90b2NvbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2xDaG9pY2UuQ29tcGFjdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sQ2hvaWNlLkpzb246CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbENob2ljZS5CaW5hcnk6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JCYXNlVHlwZXMgPSAxOworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvclN0cnVjdHMgPSAyOworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckNvbnRhaW5lcnMgPSA0OworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckV4Y2VwdGlvbnMgPSA4OworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvclVua25vd24gPSA2NDsKKworICAgICAgICBwcml2YXRlIGNsYXNzIENsaWVudFRlc3QKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGhyaWZ0VGVzdC5DbGllbnQgY2xpZW50OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgbnVtSXRlcmF0aW9uczsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBkb25lOworCisgICAgICAgICAgICBwdWJsaWMgaW50IFJldHVybkNvZGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgICAgICBwdWJsaWMgQ2xpZW50VGVzdChUZXN0UGFyYW1zIHBhcmFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHBhcmFtLkNyZWF0ZVRyYW5zcG9ydCgpOworICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwYXJhbS5DcmVhdGVQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICBudW1JdGVyYXRpb25zID0gcGFyYW0ubnVtSXRlcmF0aW9uczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgRXhlY3V0ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTsKKworICAgICAgICAgICAgICAgIGlmIChkb25lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4ZWN1dGUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1JdGVyYXRpb25zOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc3BvcnQuSXNPcGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuQXN5bmModG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ29ubmVjdCBmYWlsZWQ6ICIgKyBleC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNvbm5lY3QgZmFpbGVkOiAiICsgZXguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEV4ZWN1dGVDbGllbnRUZXN0QXN5bmMoY2xpZW50KS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7IDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlIGNsb3NpbmcgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgUHJpbnRPcHRpb25zSGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDbGllbnQgb3B0aW9uczoiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC11IDxVUkw+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtdCA8IyBvZiB0aHJlYWRzIHRvIHJ1bj4gICAgICAgIGRlZmF1bHQgPSAxIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtbiA8IyBvZiBpdGVyYXRpb25zPiAgICAgICAgICAgIHBlciB0aHJlYWQiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcGlwZT08cGlwZSBuYW1lPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1ob3N0PTxJUCBhZGRyZXNzPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1wb3J0PTxwb3J0IG51bWJlcj4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tdHJhbnNwb3J0PTx0cmFuc3BvcnQgbmFtZT4gICAgb25lIG9mIGJ1ZmZlcmVkLGZyYW1lZCAgKGRlZmF1bHRzIHRvIG5vbmUpIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXByb3RvY29sPTxwcm90b2NvbCBuYW1lPiAgICAgIG9uZSBvZiBjb21wYWN0LGpzb24gIChkZWZhdWx0cyB0byBiaW5hcnkpIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXNzbCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEV4ZWN1dGUoTGlzdDxzdHJpbmc+IGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwYXJhbSA9IG5ldyBUZXN0UGFyYW1zKCk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLlBhcnNlKGFyZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSAgcGFyc2luZyBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgdGVzdHMgPSBFbnVtZXJhYmxlLlJhbmdlKDAsIHBhcmFtLm51bVRocmVhZHMpLlNlbGVjdChfID0+IG5ldyBDbGllbnRUZXN0KHBhcmFtKSkuVG9BcnJheSgpOworCisgICAgICAgICAgICAgICAgLy9pc3N1ZSB0ZXN0cyBvbiBzZXBhcmF0ZSB0aHJlYWRzIHNpbXVsdGFuZW91c2x5CisgICAgICAgICAgICAgICAgdmFyIHRocmVhZHMgPSB0ZXN0cy5TZWxlY3QodGVzdCA9PiBuZXcgVGFzayh0ZXN0LkV4ZWN1dGUpKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHRocmVhZHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0LlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVGFzay5XYWl0QWxsKHRocmVhZHMpOworCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRvdGFsIHRpbWU6ICIgKyAoRGF0ZVRpbWUuTm93IC0gc3RhcnQpKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0cy5TZWxlY3QodCA9PiB0LlJldHVybkNvZGUpLkFnZ3JlZ2F0ZSgocjEsIHIyKSA9PiByMSB8IHIyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gb3V0ZXJFeCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVW5leHBlY3RlZCBlcnJvciIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKG91dGVyRXguTWVzc2FnZSArICIgU1Q6ICIgKyBvdXRlckV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclVua25vd247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBCeXRlc1RvSGV4KGJ5dGVbXSBkYXRhKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLlRvU3RyaW5nKGRhdGEpLlJlcGxhY2UoIi0iLCBzdHJpbmcuRW1wdHkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gUHJlcGFyZVRlc3REYXRhKGJvb2wgcmFuZG9tRGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJldHZhbCA9IG5ldyBieXRlWzB4MTAwXTsKKyAgICAgICAgICAgIHZhciBpbml0TGVuID0gTWF0aC5NaW4oMHgxMDAsIHJldHZhbC5MZW5ndGgpOworCisgICAgICAgICAgICAvLyBsaW5lYXIgZGlzdHJpYnV0aW9uLCB1bmxlc3MgcmFuZG9tIGlzIHJlcXVlc3RlZAorICAgICAgICAgICAgaWYgKCFyYW5kb21EaXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsW2ldID0gKGJ5dGUpaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmFuZG9tIGRpc3RyaWJ1dGlvbgorICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dmFsW2ldID0gKGJ5dGUpMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBybmQgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGluaXRMZW47ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0UG9zID0gcm5kLk5leHQoKSAlIGluaXRMZW47CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWxbbmV4dFBvc10gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsW25leHRQb3NdID0gKGJ5dGUpaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgVGFzazxpbnQ+IEV4ZWN1dGVDbGllbnRUZXN0QXN5bmMoVGhyaWZ0VGVzdC5DbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG9rZW4gPSBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lOworICAgICAgICAgICAgdmFyIHJldHVybkNvZGUgPSAwOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Vm9pZCgpIik7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQudGVzdFZvaWRBc3luYyh0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gdm9pZCIpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOworICAgICAgICAgICAgdmFyIHMgPSBhd2FpdCBjbGllbnQudGVzdFN0cmluZ0FzeW5jKCJUZXN0IiwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IFwiIiArIHMgKyAiXCIiKTsKKyAgICAgICAgICAgIGlmICgiVGVzdCIgIT0gcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qm9vbCh0cnVlKSIpOworICAgICAgICAgICAgdmFyIHQgPSBhd2FpdCBjbGllbnQudGVzdEJvb2xBc3luYygoYm9vbCl0cnVlLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHQpOworICAgICAgICAgICAgaWYgKCF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qm9vbChmYWxzZSkiKTsKKyAgICAgICAgICAgIHZhciBmID0gYXdhaXQgY2xpZW50LnRlc3RCb29sQXN5bmMoKGJvb2wpZmFsc2UsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgZik7CisgICAgICAgICAgICBpZiAoZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qnl0ZSgxKSIpOworICAgICAgICAgICAgdmFyIGk4ID0gYXdhaXQgY2xpZW50LnRlc3RCeXRlQXN5bmMoKHNieXRlKTEsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTgpOworICAgICAgICAgICAgaWYgKDEgIT0gaTgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEkzMigtMSkiKTsKKyAgICAgICAgICAgIHZhciBpMzIgPSBhd2FpdCBjbGllbnQudGVzdEkzMkFzeW5jKC0xLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGkzMik7CisgICAgICAgICAgICBpZiAoLTEgIT0gaTMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOworICAgICAgICAgICAgdmFyIGk2NCA9IGF3YWl0IGNsaWVudC50ZXN0STY0QXN5bmMoLTM0MzU5NzM4MzY4LCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGk2NCk7CisgICAgICAgICAgICBpZiAoLTM0MzU5NzM4MzY4ICE9IGk2NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RG91YmxlKDUuMzI1MDk4MjM1KSIpOworICAgICAgICAgICAgdmFyIGR1YiA9IGF3YWl0IGNsaWVudC50ZXN0RG91YmxlQXN5bmMoNS4zMjUwOTgyMzUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgZHViKTsKKyAgICAgICAgICAgIGlmICg1LjMyNTA5ODIzNSAhPSBkdWIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KSIpOworICAgICAgICAgICAgZHViID0gYXdhaXQgY2xpZW50LnRlc3REb3VibGVBc3luYygtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzksIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgZHViKTsKKyAgICAgICAgICAgIGlmICgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkgIT0gZHViKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBiaW5PdXQgPSBQcmVwYXJlVGVzdERhdGEodHJ1ZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0QmluYXJ5KCIgKyBCeXRlc1RvSGV4KGJpbk91dCkgKyAiKSIpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGJpbkluID0gYXdhaXQgY2xpZW50LnRlc3RCaW5hcnlBc3luYyhiaW5PdXQsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIEJ5dGVzVG9IZXgoYmluSW4pKTsKKyAgICAgICAgICAgICAgICBpZiAoYmluSW4uTGVuZ3RoICE9IGJpbk91dC5MZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yICh2YXIgb2ZzID0gMDsgb2ZzIDwgTWF0aC5NaW4oYmluSW4uTGVuZ3RoLCBiaW5PdXQuTGVuZ3RoKTsgKytvZnMpCisgICAgICAgICAgICAgICAgICAgIGlmIChiaW5JbltvZnNdICE9IGJpbk91dFtvZnNdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYmluYXJ5IGVxdWFscz8gCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVGVzdCBDcmF6eU5lc3RpbmciKTsKKyAgICAgICAgICAgIHZhciBvbmUgPSBuZXcgQ3JhenlOZXN0aW5nKCk7CisgICAgICAgICAgICB2YXIgdHdvID0gbmV3IENyYXp5TmVzdGluZygpOworICAgICAgICAgICAgb25lLlN0cmluZ19maWVsZCA9ICJjcmF6eSI7CisgICAgICAgICAgICB0d28uU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgIG9uZS5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVtdIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHhGRiB9OworICAgICAgICAgICAgdHdvLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlWzEwXSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4RkYgfTsKKyAgICAgICAgICAgIGlmICh0eXBlb2YoQ3JhenlOZXN0aW5nKS5HZXRNZXRob2QoIkVxdWFscyIpPy5EZWNsYXJpbmdUeXBlID09IHR5cGVvZihDcmF6eU5lc3RpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghb25lLkVxdWFscyh0d28pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JDb250YWluZXJzOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDcmF6eU5lc3RpbmcuRXF1YWxzIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7CisgICAgICAgICAgICB2YXIgbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgIG8uU3RyaW5nX3RoaW5nID0gIlplcm8iOworICAgICAgICAgICAgby5CeXRlX3RoaW5nID0gKHNieXRlKTE7CisgICAgICAgICAgICBvLkkzMl90aGluZyA9IC0zOworICAgICAgICAgICAgby5JNjRfdGhpbmcgPSAtNTsKKyAgICAgICAgICAgIHZhciBpID0gYXdhaXQgY2xpZW50LnRlc3RTdHJ1Y3RBc3luYyhvLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0ge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pIik7CisgICAgICAgICAgICB2YXIgbzIgPSBuZXcgWHRydWN0MigpOworICAgICAgICAgICAgbzIuQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgbzIuU3RydWN0X3RoaW5nID0gbzsKKyAgICAgICAgICAgIG8yLkkzMl90aGluZyA9IDU7CisgICAgICAgICAgICB2YXIgaTIgPSBhd2FpdCBjbGllbnQudGVzdE5lc3RBc3luYyhvMiwgdG9rZW4pOworICAgICAgICAgICAgaSA9IGkyLlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7IiArIGkyLkJ5dGVfdGhpbmcgKyAiLCB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSwgIiArIGkyLkkzMl90aGluZyArICJ9Iik7CisKKyAgICAgICAgICAgIHZhciBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcG91dFtqXSA9IGogLSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOworICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbWFwb3V0LktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBvdXRba2V5XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgbWFwaW4gPSBhd2FpdCBjbGllbnQudGVzdE1hcEFzeW5jKG1hcG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIG1hcGluLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOworICAgICAgICAgICAgZm9yICh2YXIgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RvdXQuQWRkKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGogaW4gbGlzdG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgdmFyIGxpc3RpbiA9IGF3YWl0IGNsaWVudC50ZXN0TGlzdEFzeW5jKGxpc3RvdXQsIHRva2VuKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGogaW4gbGlzdGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvL3NldAorICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIHNldG91dCA9IG5ldyBUSGFzaFNldDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKHZhciBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0b3V0LkFkZChqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTZXQoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gc2V0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgc2V0aW4gPSBhd2FpdCBjbGllbnQudGVzdFNldEFzeW5jKHNldG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShPTkUpIik7CisgICAgICAgICAgICB2YXIgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5PTkUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6Lk9ORSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRXTykiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouVFdPLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5UV08gIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouVEhSRUUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRIUkVFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouRklWRSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRklWRSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEVJR0hUKSIpOworICAgICAgICAgICAgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5FSUdIVCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRUlHSFQgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgICAgICAgICB2YXIgdWlkID0gYXdhaXQgY2xpZW50LnRlc3RUeXBlZGVmQXN5bmMoMzA5ODU4MjM1MDgyNTIzTCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOworICAgICAgICAgICAgaWYgKDMwOTg1ODIzNTA4MjUyM0wgIT0gdWlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgICAgICAgICB2YXIgbW0gPSBhd2FpdCBjbGllbnQudGVzdE1hcE1hcEFzeW5jKDEsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbW0uS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworICAgICAgICAgICAgICAgIHZhciBtMiA9IG1tW2tleV07CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGsyIGluIG0yLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDBMOworICAgICAgICAgICAgdmFyIHRydWNrID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgdHJ1Y2suU3RyaW5nX3RoaW5nID0gIlRydWNrIjsKKyAgICAgICAgICAgIHRydWNrLkJ5dGVfdGhpbmcgPSAoc2J5dGUpODsKKyAgICAgICAgICAgIHRydWNrLkkzMl90aGluZyA9IDg7CisgICAgICAgICAgICB0cnVjay5JNjRfdGhpbmcgPSA4OworICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cy5BZGQodHJ1Y2spOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgICAgIHZhciB3aG9hID0gYXdhaXQgY2xpZW50LnRlc3RJbnNhbml0eUFzeW5jKGluc2FuZSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiB3aG9hLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHdob2Fba2V5XTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGsyIGluIHZhbC5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHYyID0gdmFsW2syXTsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgICAgIHZhciB1c2VyTWFwID0gdjIuVXNlck1hcDsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrMyBpbiB1c2VyTWFwLktleXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMyArICIgPT4gIiArIHVzZXJNYXBbazNdICsgIiwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHh0cnVjdHMgPSB2Mi5YdHJ1Y3RzOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHggaW4geHRydWN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7XCIiICsgeC5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LkJ5dGVfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAifSwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSIpOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIHNieXRlIGFyZzAgPSAxOworICAgICAgICAgICAgdmFyIGFyZzEgPSAyOworICAgICAgICAgICAgdmFyIGFyZzIgPSBsb25nLk1heFZhbHVlOworICAgICAgICAgICAgdmFyIG11bHRpRGljdCA9IG5ldyBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+KCk7CisgICAgICAgICAgICBtdWx0aURpY3RbMV0gPSAib25lIjsKKworICAgICAgICAgICAgdmFyIHRtcE11bHRpRGljdCA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYWlyIGluIG11bHRpRGljdCkKKyAgICAgICAgICAgICAgICB0bXBNdWx0aURpY3QuQWRkKHBhaXIuS2V5ICsiID0+ICIrIHBhaXIuVmFsdWUpOworCisgICAgICAgICAgICB2YXIgYXJnNCA9IE51bWJlcnouRklWRTsKKyAgICAgICAgICAgIGxvbmcgYXJnNSA9IDUwMDAwMDA7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IE11bHRpKCIgKyBhcmcwICsgIiwiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLHsiICsgc3RyaW5nLkpvaW4oIiwiLCB0bXBNdWx0aURpY3QpICsgIn0sIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKKyAgICAgICAgICAgIHZhciBtdWx0aVJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnRlc3RNdWx0aUFzeW5jKGFyZzAsIGFyZzEsIGFyZzIsIG11bHRpRGljdCwgYXJnNCwgYXJnNSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICArICIsaTMyX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkkzMl90aGluZyArICIsaTY0X3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkk2NF90aGluZyArICIpXG4iKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uQXN5bmMoIlhjZXB0aW9uIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMTAwMSB8fCBleC5NZXNzYWdlICE9ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RFeGNlcHRpb25Bc3luYygiVEV4Y2VwdGlvbiIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJpZnQuVEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJva1wiKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uQXN5bmMoIm9rIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCAuLi4pIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jKCJYY2VwdGlvbiIsICJpZ25vcmUiLCB0b2tlbik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAxMDAxIHx8IGV4Lk1lc3NhZ2UgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgLi4uKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb25Bc3luYygiWGNlcHRpb24yIiwgImlnbm9yZSIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbjIgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAyMDAyIHx8IGV4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcIk9LXCIpIik7CisgICAgICAgICAgICAgICAgaWYgKCJPSyIgIT0gKGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb25Bc3luYygic3VjY2VzcyIsICJPSyIsIHRva2VuKSkuU3RyaW5nX3RoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHN3ID0gbmV3IFN0b3B3YXRjaCgpOworICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RPbmV3YXlBc3luYygxLCB0b2tlbik7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBpZiAoc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyA+IDEwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiVGVzdCBDYWxsdGltZSgpIik7CisgICAgICAgICAgICB2YXIgdGltZXMgPSA1MDsKKyAgICAgICAgICAgIHN3LlJlc2V0KCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aW1lczsgKytrKQorICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0Vm9pZEFzeW5jKHRva2VuKTsKKyAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7MH0gbXMgYSB0ZXN0Vm9pZCgpIGNhbGwiLCBzdy5FbGFwc2VkTWlsbGlzZWNvbmRzIC8gdGltZXMpOworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L25ldHN0ZC9NYWtlZmlsZS5hbSBiL3Rlc3QvbmV0c3RkL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NmZmYjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldHN0ZC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4gCisKK2FsbC1sb2NhbDoKKwkkKERPVE5FVENPUkUpIGJ1aWxkCisKK3ByZWNyb3NzOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgQ2xpZW50L2JpbgorCSQoUk0pIC1yIFNlcnZlci9iaW4KKwkkKFJNKSAtciBDbGllbnQvb2JqCisJJChSTSkgLXIgU2VydmVyL29iagorCSQoUk0pIC1yIFRocmlmdFRlc3QvVGhyaWZ0VGVzdAorCitFWFRSQV9ESVNUID0gXAorCUNsaWVudCBcCisJUkVBRE1FLm1kIFwKKwlTZXJ2ZXIgXAorCVRocmlmdFRlc3Quc2xuIFwKKwlidWlsZC5jbWQgXAorCWJ1aWxkLnNoCmRpZmYgLS1naXQgYS90ZXN0L25ldHN0ZC9SRUFETUUubWQgYi90ZXN0L25ldHN0ZC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3MjhkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0c3RkL1JFQURNRS5tZApAQCAtMCwwICsxLDIwIEBACisjIEFwYWNoZSBUaHJpZnQgbmV0LWNvcmUtbGliIHRlc3RzCisKK1Rlc3RzIGZvciBUaHJpZnQgY2xpZW50IGxpYnJhcnkgcG9ydGVkIHRvIE1pY3Jvc29mdCAuTmV0IENvcmUgCisKKyMgQ29udGVudAorLSBUaHJpZnRUZXN0IC0gdGVzdHMgZm9yIFRocmlmdCBsaWJyYXJ5IAorCisjIFJldXNlZCBjb21wb25lbnRzIAorLSBORVQgQ29yZSBTdGFuZGFyZCAxLjYgKFNESyAyLjAuMCkKKworIyBIb3cgdG8gYnVpbGQgb24gV2luZG93cworLSBHZXQgVGhyaWZ0IElETCBjb21waWxlciBleGVjdXRhYmxlLCBhZGQgdG8gc29tZSBmb2xkZXIgYW5kIGFkZCBwYXRoIHRvIHRoaXMgZm9sZGVyIGludG8gUEFUSCB2YXJpYWJsZQorLSBPcGVuIFRocmlmdFRlc3Quc2xuIGluIFZpc3VhbCBTdHVkaW8gYW5kIGJ1aWxkCitvciAKKy0gQnVpbGQgd2l0aCBzY3JpcHRzCisKKyMgSG93IHRvIGJ1aWxkIG9uIFVuaXgKKy0gRW5zdXJlIHlvdSBoYXZlIC5ORVQgQ29yZSAyLjAuMCBTREsgaW5zdGFsbGVkIG9yIHVzZSB0aGUgVWJ1bnR1IFhlbmlhbCBkb2NrZXIgaW1hZ2UKKy0gRm9sbG93IGNvbW1vbiBidWlsZCBwcmFjdGljZSBmb3IgVGhyaWZ0OiBib290c3RyYXAsIGNvbmZpZ3VyZSwgYW5kIG1ha2UgcHJlY3Jvc3MKKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRzdGQvU2VydmVyLy5naXRpZ25vcmUgYi90ZXN0L25ldHN0ZC9TZXJ2ZXIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Q1NTEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRzdGQvU2VydmVyLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL1RocmlmdFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0c3RkL1NlcnZlci9Qcm9ncmFtLmNzIGIvdGVzdC9uZXRzdGQvU2VydmVyL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmYTM3MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0c3RkL1NlcnZlci9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNzMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdFRlc3Q7CisKK25hbWVzcGFjZSBTZXJ2ZXIKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlNldEJ1ZmZlclNpemUoQ29uc29sZS5CdWZmZXJXaWR0aCwgNDA5Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJGYWlsZWQgdG8gZ3JvdyBzY3JvbGwtYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3BsaXQgbW9kZSBhbmQgb3B0aW9ucworICAgICAgICAgICAgdmFyIHN1YkFyZ3MgPSBuZXcgTGlzdDxzdHJpbmc+KGFyZ3MpOworICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgaWYgKHN1YkFyZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICBmaXJzdEFyZyA9IHN1YkFyZ3NbMF07CisgICAgICAgICAgICAgICAgc3ViQXJncy5SZW1vdmVBdCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcnVuIHdoYXRldmVyIG1vZGUgaXMgY2hvb3NlbgorICAgICAgICAgICAgc3dpdGNoKGZpcnN0QXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgInNlcnZlciI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXN0U2VydmVyLkV4ZWN1dGUoc3ViQXJncyk7CisgICAgICAgICAgICAgICAgY2FzZSAiLS1oZWxwIjoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJJbnZhbGlkIGFyZ3VtZW50OiB7MH0iLCBmaXJzdEFyZyk7CisgICAgICAgICAgICAgICAgICAgIFByaW50SGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFByaW50SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2FnZToiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIFNlcnZlciAgc2VydmVyICBbb3B0aW9uc10nIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBTZXJ2ZXIgIC0taGVscCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiIpOworCisgICAgICAgICAgICBTZXJ2ZXJQYXJhbS5QcmludE9wdGlvbnNIZWxwKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRzdGQvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9uZXRzdGQvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NTQ5NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldHN0ZC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0MyBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisKK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiU2VydmVyIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoIkIwQzEzREEwLTMxMTctNDg0NC04QUU4LUIxNzc1RTQ2MjIzRCIpXQorCmRpZmYgLS1naXQgYS90ZXN0L25ldHN0ZC9TZXJ2ZXIvU2VydmVyLmNzcHJvaiBiL3Rlc3QvbmV0c3RkL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZjQ2YzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldHN0ZC9TZXJ2ZXIvU2VydmVyLmNzcHJvagpAQCAtMCwwICsxLDUyIEBACivvu788UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPCEtLQorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAKKyAgCSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+U2VydmVyPC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5TZXJ2ZXI8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5JTy5QaXBlcyIgVmVyc2lvbj0iNC4zLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLklPLlBpcGVzLkFjY2Vzc0NvbnRyb2wiIFZlcnNpb249IjQuNS4xIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuSHR0cC5XaW5IdHRwSGFuZGxlciIgVmVyc2lvbj0iNC41LjIiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5QcmltaXRpdmVzIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbC5QcmltaXRpdmVzIiBWZXJzaW9uPSI0LjUuMyIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uVGhyZWFkaW5nIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxuZXRzdGRcVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8VGFyZ2V0IE5hbWU9IlByZUJ1aWxkIiBCZWZvcmVUYXJnZXRzPSJfR2VuZXJhdGVSZXN0b3JlUHJvamVjdFNwZWM7UmVzdG9yZTtDb21waWxlIj4KKyAgICA8RXhlYyBDb25kaXRpb249IickKE9TKScgPT0gJ1dpbmRvd3NfTlQnIiBDb21tYW5kPSJ3aGVyZSB0aHJpZnQiIENvbnNvbGVUb01TQnVpbGQ9InRydWUiPgorICAgICAgPE91dHB1dCBUYXNrUGFyYW1ldGVyPSJDb25zb2xlT3V0cHV0IiBQcm9wZXJ0eU5hbWU9IlBhdGhUb1RocmlmdCIgLz4KKyAgICA8L0V4ZWM+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSImcXVvdDskKFBhdGhUb1RocmlmdCkmcXVvdDsgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0c3RkOndjZix1bmlvbixzZXJpYWwgLXIgLi8uLi8uLi9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRzdGQ6d2NmLHVuaW9uLHNlcmlhbCAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldHN0ZDp3Y2YsdW5pb24sc2VyaWFsIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgIDwvVGFyZ2V0PgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0c3RkL1NlcnZlci9UZXN0U2VydmVyLmNzIGIvdGVzdC9uZXRzdGQvU2VydmVyL1Rlc3RTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1ZTYxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0c3RkL1NlcnZlci9UZXN0U2VydmVyLmNzCkBAIC0wLDAgKzEsNjQ5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlByb2Nlc3NvcjsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydC5TZXJ2ZXI7CisKK25hbWVzcGFjZSBUaHJpZnRUZXN0Cit7CisgICAgaW50ZXJuYWwgZW51bSBQcm90b2NvbENob2ljZQorICAgIHsKKyAgICAgICAgQmluYXJ5LAorICAgICAgICBDb21wYWN0LAorICAgICAgICBKc29uCisgICAgfQorCisgICAgLy8gaXQgZG9lcyBub3QgbWFrZSBtdWNoIHNlbnNlIHRvIHVzZSBidWZmZXJlZCB3aGVuIHdlIGFscmVhZHkgdXNlIGZyYW1lZAorICAgIGludGVybmFsIGVudW0gTGF5ZXJlZENob2ljZQorICAgIHsKKyAgICAgICAgTm9uZSwKKyAgICAgICAgQnVmZmVyZWQsCisgICAgICAgIEZyYW1lZAorICAgIH0KKworCisgICAgaW50ZXJuYWwgZW51bSBUcmFuc3BvcnRDaG9pY2UKKyAgICB7CisgICAgICAgIFNvY2tldCwKKyAgICAgICAgVGxzU29ja2V0LAorICAgICAgICBOYW1lZFBpcGUKKyAgICB9CisKKyAgICBpbnRlcm5hbCBjbGFzcyBTZXJ2ZXJQYXJhbQorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgTGF5ZXJlZENob2ljZSBsYXllcmVkID0gTGF5ZXJlZENob2ljZS5Ob25lOworICAgICAgICBpbnRlcm5hbCBQcm90b2NvbENob2ljZSBwcm90b2NvbCA9IFByb3RvY29sQ2hvaWNlLkJpbmFyeTsKKyAgICAgICAgaW50ZXJuYWwgVHJhbnNwb3J0Q2hvaWNlIHRyYW5zcG9ydCA9IFRyYW5zcG9ydENob2ljZS5Tb2NrZXQ7CisgICAgICAgIGludGVybmFsIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIHBpcGUgPSBudWxsOworCisgICAgICAgIGludGVybmFsIHZvaWQgUGFyc2UoTGlzdDxzdHJpbmc+IGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5Db3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcGlwZT0iKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpOworICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBUcmFuc3BvcnRDaG9pY2UuTmFtZWRQaXBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHRyYW5zcG9ydCAhPSBUcmFuc3BvcnRDaG9pY2UuVGxzU29ja2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gVHJhbnNwb3J0Q2hvaWNlLlNvY2tldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxheWVyZWQgPSBMYXllcmVkQ2hvaWNlLkJ1ZmZlcmVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsYXllcmVkID0gTGF5ZXJlZENob2ljZS5GcmFtZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tYmluYXJ5IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWJpbmFyeSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9IFByb3RvY29sQ2hvaWNlLkJpbmFyeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBQcm90b2NvbENob2ljZS5Db21wYWN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9IFByb3RvY29sQ2hvaWNlLkpzb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tdGhyZWFkZWQiIHx8IGFyZ3NbaV0gPT0gIi0tc2VydmVyLXR5cGU9dGhyZWFkZWQiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXRocmVhZHBvb2wiIHx8IGFyZ3NbaV0gPT0gIi0tc2VydmVyLXR5cGU9dGhyZWFkcG9vbCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tcHJvdG90eXBlIiB8fCBhcmdzW2ldID09ICItLXByb2Nlc3Nvcj1wcm90b3R5cGUiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBUcmFuc3BvcnRDaG9pY2UuVGxzU29ja2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWhlbHAiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRPcHRpb25zSGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJJbnZhbGlkIGFyZ3VtZW50OiB7MH0iLCBhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRPcHRpb25zSGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBQcmludE9wdGlvbnNIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNlcnZlciBvcHRpb25zOiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1waXBlPTxwaXBlIG5hbWU+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXBvcnQ9PHBvcnQgbnVtYmVyPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS10cmFuc3BvcnQ9PHRyYW5zcG9ydCBuYW1lPiAgICBvbmUgb2YgYnVmZmVyZWQsZnJhbWVkICAoZGVmYXVsdHMgdG8gbm9uZSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcHJvdG9jb2w9PHByb3RvY29sIG5hbWU+ICAgICAgb25lIG9mIGNvbXBhY3QsanNvbiAgKGRlZmF1bHRzIHRvIGJpbmFyeSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tc2VydmVyLXR5cGU9PHR5cGU+ICAgICAgICAgICAgb25lIG9mIHRocmVhZGVkLHRocmVhZHBvb2wgIChkZWZhdWx0cyB0byBzaW1wbGUpIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXByb2Nlc3Nvcj08cHJvdG90eXBlPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1zc2wiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgVGVzdFNlcnZlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgX2NsaWVudElEID0gLTE7CisgICAgICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIFRlc3RMb2dEZWxlZ2F0ZShzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKTsKKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlTZXJ2ZXJFdmVudEhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY2FsbENvdW50ID0gMDsKKworICAgICAgICAgICAgcHVibGljIFRhc2sgUHJlU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxvYmplY3Q+IENyZWF0ZUNvbnRleHRBc3luYyhUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQ8b2JqZWN0PihudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2sgRGVsZXRlQ29udGV4dEFzeW5jKG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIFByb2Nlc3NDb250ZXh0QXN5bmMob2JqZWN0IHNlcnZlckNvbnRleHQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIFRlc3RIYW5kbGVyQXN5bmMgOiBUaHJpZnRUZXN0LklBc3luYworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVFNlcnZlciBzZXJ2ZXIgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHJpdmF0ZSBpbnQgaGFuZGxlcklEOworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHByaXZhdGUgVGVzdExvZ0RlbGVnYXRlIGxvZ2dlcjsKKworICAgICAgICAgICAgcHVibGljIFRlc3RIYW5kbGVyQXN5bmMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbmRsZXJJRCA9IEludGVybG9ja2VkLkluY3JlbWVudChyZWYgX2NsaWVudElEKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIgKz0gdGVzdENvbnNvbGVMb2dnZXI7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgiTmV3IFRlc3RIYW5kbGVyIGluc3RhbmNlIGNyZWF0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdENvbnNvbGVMb2dnZXIoc3RyaW5nIG1zZywgcGFyYW1zIG9iamVjdFtdIHZhbHVlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5DbGVhcigpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiaGFuZGxlcnswOkQzfToiLCBoYW5kbGVySUQpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdChtc2csIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kTGluZSgpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIHRlc3RWb2lkQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdFZvaWQoKSIpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPHN0cmluZz4gdGVzdFN0cmluZ0FzeW5jKHN0cmluZyB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdFN0cmluZyh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxib29sPiB0ZXN0Qm9vbEFzeW5jKGJvb2wgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RCb29sKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPHNieXRlPiB0ZXN0Qnl0ZUFzeW5jKHNieXRlIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0Qnl0ZSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxpbnQ+IHRlc3RJMzJBc3luYyhpbnQgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RJMzIoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8bG9uZz4gdGVzdEk2NEFzeW5jKGxvbmcgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RJNjQoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8ZG91YmxlPiB0ZXN0RG91YmxlQXN5bmMoZG91YmxlIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0RG91YmxlKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGJ5dGVbXT4gdGVzdEJpbmFyeUFzeW5jKGJ5dGVbXSB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGhleCA9IEJpdENvbnZlcnRlci5Ub1N0cmluZyh0aGluZykuUmVwbGFjZSgiLSIsIHN0cmluZy5FbXB0eSk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEJpbmFyeSh7MDpYfSkiLCBoZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxYdHJ1Y3Q+IHRlc3RTdHJ1Y3RBc3luYyhYdHJ1Y3QgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RTdHJ1Y3Qoe3tcInswfVwiLCB7MX0sIHsyfSwgezN9fX0pIiwgdGhpbmcuU3RyaW5nX3RoaW5nLCB0aGluZy5CeXRlX3RoaW5nLCB0aGluZy5JMzJfdGhpbmcsIHRoaW5nLkk2NF90aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdDI+IHRlc3ROZXN0QXN5bmMoWHRydWN0MiBuZXN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdGhpbmcgPSBuZXN0LlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TmVzdCh7e3swfSwge3tcInsxfVwiLCB7Mn0sIHszfSwgezR9LCB7NX19fX19KSIsCisgICAgICAgICAgICAgICAgICAgIG5lc3QuQnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgdGhpbmcuU3RyaW5nX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICB0aGluZy5CeXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICB0aGluZy5JMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIHRoaW5nLkk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgbmVzdC5JMzJfdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmVzdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPERpY3Rpb25hcnk8aW50LCBpbnQ+PiB0ZXN0TWFwQXN5bmMoRGljdGlvbmFyeTxpbnQsIGludD4gdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ0ZXN0TWFwKHt7Iik7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIHRoaW5nLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0gPT4gezF9Iiwga2V5LCB0aGluZ1trZXldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKHNiLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPj4gdGVzdFN0cmluZ01hcEFzeW5jKERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5DbGVhcigpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgidGVzdFN0cmluZ01hcCh7eyIpOworICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiB0aGluZy5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9ID0+IHsxfSIsIGtleSwgdGhpbmdba2V5XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8VEhhc2hTZXQ8aW50Pj4gdGVzdFNldEFzeW5jKFRIYXNoU2V0PGludD4gdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ0ZXN0U2V0KHt7Iik7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSIsIGVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2Uoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPExpc3Q8aW50Pj4gdGVzdExpc3RBc3luYyhMaXN0PGludD4gdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ0ZXN0TGlzdCh7eyIpOworICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVsZW0gaW4gdGhpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0iLCBlbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKHNiLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxOdW1iZXJ6PiB0ZXN0RW51bUFzeW5jKE51bWJlcnogdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RFbnVtKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGxvbmc+IHRlc3RUeXBlZGVmQXN5bmMobG9uZyB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdFR5cGVkZWYoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8RGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+Pj4gdGVzdE1hcE1hcEFzeW5jKGludCBoZWxsbywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE1hcE1hcCh7MH0pIiwgaGVsbG8pOworICAgICAgICAgICAgICAgIHZhciBtYXBtYXAgPSBuZXcgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PigpOworCisgICAgICAgICAgICAgICAgdmFyIHBvcyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgICAgIHZhciBuZWcgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvc1tpXSA9IGk7CisgICAgICAgICAgICAgICAgICAgIG5lZ1staV0gPSAtaTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtYXBtYXBbNF0gPSBwb3M7CisgICAgICAgICAgICAgICAgbWFwbWFwWy00XSA9IG5lZzsKKworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobWFwbWFwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8RGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4+IHRlc3RJbnNhbml0eUFzeW5jKEluc2FuaXR5IGFyZ3VtZW50LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0SW5zYW5pdHkoKSIpOworCisgICAgICAgICAgICAgICAgLyoqIGZyb20gVGhyaWZ0VGVzdC50aHJpZnQ6CisgICAgICAgICAgICAgICAgICogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKyAgICAgICAgICAgICAgICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICogICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAqICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgICAgICAgICAgICAgICAqICAgfQorICAgICAgICAgICAgICAgICAqIEByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgdmFyIGZpcnN0X21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOworICAgICAgICAgICAgICAgIHZhciBzZWNvbmRfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7IDsKKworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXBbTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKKworICAgICAgICAgICAgICAgIHNlY29uZF9tYXBbTnVtYmVyei5TSVhdID0gbmV3IEluc2FuaXR5KCk7CisKKyAgICAgICAgICAgICAgICB2YXIgaW5zYW5lID0gbmV3IERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbMV0gPSBmaXJzdF9tYXAsCisgICAgICAgICAgICAgICAgICAgIFsyXSA9IHNlY29uZF9tYXAKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChpbnNhbmUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxYdHJ1Y3Q+IHRlc3RNdWx0aUFzeW5jKHNieXRlIGFyZzAsIGludCBhcmcxLCBsb25nIGFyZzIsIERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUsCisgICAgICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE11bHRpKCkiKTsKKworICAgICAgICAgICAgICAgIHZhciBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsgOworICAgICAgICAgICAgICAgIGhlbGxvLlN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgICAgICAgICAgICAgIGhlbGxvLkJ5dGVfdGhpbmcgPSBhcmcwOworICAgICAgICAgICAgICAgIGhlbGxvLkkzMl90aGluZyA9IGFyZzE7CisgICAgICAgICAgICAgICAgaGVsbG8uSTY0X3RoaW5nID0gYXJnMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KGhlbGxvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2sgdGVzdEV4Y2VwdGlvbkFzeW5jKHN0cmluZyBhcmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RFeGNlcHRpb24oezB9KSIsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGFyZyA9PSAiWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0gMTAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPSBhcmcKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFyZyA9PSAiVEV4Y2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxYdHJ1Y3Q+IHRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jKHN0cmluZyBhcmcwLCBzdHJpbmcgYXJnMSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE11bHRpRXhjZXB0aW9uKHswfSwgezF9KSIsIGFyZzAsIGFyZzEpOworICAgICAgICAgICAgICAgIGlmIChhcmcwID09ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPSAxMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhcmcwID09ICJYY2VwdGlvbjIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24yCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9IDIwMDIsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3RfdGhpbmcgPSBuZXcgWHRydWN0IHsgU3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIiB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBYdHJ1Y3QgeyBTdHJpbmdfdGhpbmcgPSBhcmcxIH07CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChyZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzayB0ZXN0T25ld2F5QXN5bmMoaW50IHNlY29uZHNUb1NsZWVwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0T25ld2F5KHswfSksIHNsZWVwaW5nLi4uIiwgc2Vjb25kc1RvU2xlZXApOworICAgICAgICAgICAgICAgIFRhc2suRGVsYXkoc2Vjb25kc1RvU2xlZXAgKiAxMDAwLCBjYW5jZWxsYXRpb25Ub2tlbikuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RPbmV3YXkgZmluaXNoZWQiKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZTIgR2V0U2VydmVyQ2VydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZXJ2ZXJDZXJ0TmFtZSA9ICJzZXJ2ZXIucDEyIjsKKyAgICAgICAgICAgIHZhciBwb3NzaWJsZVBhdGhzID0gbmV3IExpc3Q8c3RyaW5nPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICIuLi8uLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgIi4uLy4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAiLi4va2V5cy8iLAorICAgICAgICAgICAgICAgICJrZXlzLyIsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBzdHJpbmcgZXhpc3RpbmdQYXRoID0gbnVsbDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwb3NzaWJsZVBhdGggaW4gcG9zc2libGVQYXRocykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IFBhdGguR2V0RnVsbFBhdGgocG9zc2libGVQYXRoICsgc2VydmVyQ2VydE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhwYXRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGV4aXN0aW5nUGF0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigkIkNhbm5vdCBmaW5kIGZpbGU6IHtzZXJ2ZXJDZXJ0TmFtZX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIGNlcnQgPSBuZXcgWDUwOUNlcnRpZmljYXRlMihleGlzdGluZ1BhdGgsICJ0aHJpZnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIGNlcnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBFeGVjdXRlKExpc3Q8c3RyaW5nPiBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbG9nZ2VyRmFjdG9yeSA9IG5ldyBMb2dnZXJGYWN0b3J5KCk7Ly8uQWRkQ29uc29sZSgpLkFkZERlYnVnKCk7CisgICAgICAgICAgICB2YXIgbG9nZ2VyID0gbmV3IExvZ2dlckZhY3RvcnkoKS5DcmVhdGVMb2dnZXIoIlRlc3QiKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhcmFtID0gbmV3IFNlcnZlclBhcmFtKCk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLlBhcnNlKGFyZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSAgcGFyc2luZyBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc0ZhY3RvcnkgPSBudWxsOworCisgICAgICAgICAgICAgICAgLy8gVHJhbnNwb3J0CisgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCB0cmFuczsKKyAgICAgICAgICAgICAgICB2YXIgdXNlQnVmZmVyZWQgPSAocGFyYW0ubGF5ZXJlZCA9PSBMYXllcmVkQ2hvaWNlLkJ1ZmZlcmVkKTsKKyAgICAgICAgICAgICAgICB2YXIgdXNlRnJhbWVkID0gKHBhcmFtLmxheWVyZWQgPT0gTGF5ZXJlZENob2ljZS5GcmFtZWQpOworICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyYW0udHJhbnNwb3J0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnRDaG9pY2UuTmFtZWRQaXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KHBhcmFtLnBpcGUgIT0gbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHBhcmFtLnBpcGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydENob2ljZS5UbHNTb2NrZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VydCA9IEdldFNlcnZlckNlcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZXJ0ID09IG51bGwgfHwgIWNlcnQuSGFzUHJpdmF0ZUtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2VydGlmaWNhdGUgZG9lc24ndCBjb250YWluIHByaXZhdGUga2V5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zRmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOyAvLyBmcmFtZWQvYnVmZmVyZWQgaXMgYnVpbHQgaW50byBzb2NrZXQgdHJhbnNwb3J0cworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydCggcGFyYW0ucG9ydCwgdXNlQnVmZmVyZWQsIHVzZUZyYW1lZCwgY2VydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VuZGVyLCBjZXJ0aWZpY2F0ZSwgY2hhaW4sIGVycm9ycykgPT4gdHJ1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyB8IFNzbFByb3RvY29scy5UbHMxMSB8IFNzbFByb3RvY29scy5UbHMxMik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydENob2ljZS5Tb2NrZXQ6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zRmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOyAvLyBmcmFtZWQvYnVmZmVyZWQgaXMgYnVpbHQgaW50byBzb2NrZXQgdHJhbnNwb3J0cworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChwYXJhbS5wb3J0LCAwLCB1c2VCdWZmZXJlZCwgdXNlRnJhbWVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGFkZCBsYXllcmVkIHRyYW5zcG9ydCwgaWYgbm90IGFscmVhZHkgc2V0IGFib3ZlCisgICAgICAgICAgICAgICAgaWYgKHRyYW5zRmFjdG9yeSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwYXJhbS5sYXllcmVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExheWVyZWRDaG9pY2UuRnJhbWVkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zRmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTGF5ZXJlZENob2ljZS5CdWZmZXJlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc0ZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0LkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFByb3RvY29sCisgICAgICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgcHJvdG87CisgICAgICAgICAgICAgICAgc3dpdGNoIChwYXJhbS5wcm90b2NvbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2xDaG9pY2UuQ29tcGFjdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2xDaG9pY2UuSnNvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRKc29uUHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2xDaG9pY2UuQmluYXJ5OgorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFByb2Nlc3NvcgorICAgICAgICAgICAgICAgIHZhciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlckFzeW5jKCk7CisgICAgICAgICAgICAgICAgdmFyIHRlc3RQcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Bc3luY1Byb2Nlc3Nvcih0ZXN0SGFuZGxlcik7CisgICAgICAgICAgICAgICAgdmFyIHByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkodGVzdFByb2Nlc3Nvcik7CisKKyAgICAgICAgICAgICAgICBUU2VydmVyIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlQXN5bmNTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgdHJhbnMsIHRyYW5zRmFjdG9yeSwgdHJhbnNGYWN0b3J5LCBwcm90bywgcHJvdG8sIGxvZ2dlcik7CisKKyAgICAgICAgICAgICAgICAvL1NlcnZlciBldmVudCBoYW5kbGVyCisgICAgICAgICAgICAgICAgdmFyIHNlcnZlckV2ZW50cyA9IG5ldyBNeVNlcnZlckV2ZW50SGFuZGxlcigpOworICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZS5TZXRFdmVudEhhbmRsZXIoc2VydmVyRXZlbnRzKTsKKworICAgICAgICAgICAgICAgIC8vIFJ1biBpdAorICAgICAgICAgICAgICAgIHZhciB3aGVyZSA9ICghIHN0cmluZy5Jc051bGxPckVtcHR5KHBhcmFtLnBpcGUpKSA/ICJvbiBwaXBlICIgKyBwYXJhbS5waXBlIDogIm9uIHBvcnQgIiArIHBhcmFtLnBvcnQ7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlN0YXJ0aW5nIHRoZSBBc3luY0Jhc2VTZXJ2ZXIgIiArIHdoZXJlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggcHJvY2Vzc29yIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5IHByb3RvdHlwZSBmYWN0b3J5ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS5sYXllcmVkID09IExheWVyZWRDaG9pY2UuQnVmZmVyZWQgPyAiIHdpdGggYnVmZmVyZWQgdHJhbnNwb3J0IiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLmxheWVyZWQgPT0gTGF5ZXJlZENob2ljZS5GcmFtZWQgPyAiIHdpdGggZnJhbWVkIHRyYW5zcG9ydCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS50cmFuc3BvcnQgPT0gVHJhbnNwb3J0Q2hvaWNlLlRsc1NvY2tldCA/ICIgd2l0aCBlbmNyeXB0aW9uIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLnByb3RvY29sID09IFByb3RvY29sQ2hvaWNlLkNvbXBhY3QgPyAiIHdpdGggY29tcGFjdCBwcm90b2NvbCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS5wcm90b2NvbCA9PSBQcm90b2NvbENob2ljZS5Kc29uID8gIiB3aXRoIGpzb24gcHJvdG9jb2wiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4uIik7CisgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lLlNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSkuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgIENvbnNvbGUuUmVhZExpbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlKHgpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvbmUuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRzdGQvVGhyaWZ0VGVzdC5zbG4gYi90ZXN0L25ldHN0ZC9UaHJpZnRUZXN0LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQwODU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRzdGQvVGhyaWZ0VGVzdC5zbG4KQEAgLTAsMCArMSw2NCBAQAor77u/TWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTIuMDAKKyMgVmlzdWFsIFN0dWRpbyAxNQorVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDE1LjAuMjY3MzAuMTIKK01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xCitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdCIsICIuLlwuLlxsaWJcbmV0c3RkXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiwgIntDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJDbGllbnQiLCAiQ2xpZW50XENsaWVudC5jc3Byb2oiLCAiezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlNlcnZlciIsICJTZXJ2ZXJcU2VydmVyLmNzcHJvaiIsICJ7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwkJU29sdXRpb25HdWlkID0gezUyQ0U5QTEyLUY2Q0ItNEYwQy1CQjQyLTAxMDU2MTJGNUZGNH0KKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0c3RkL2J1aWxkLmNtZCBiL3Rlc3QvbmV0c3RkL2J1aWxkLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjg0ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRzdGQvYnVpbGQuY21kCkBAIC0wLDAgKzEsMjUgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCisKKzplb2YKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0c3RkL2J1aWxkLnNoIGIvdGVzdC9uZXRzdGQvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3ZTMxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0c3RkL2J1aWxkLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyNleGl0IGlmIGFueSBjb21tYW5kIGZhaWxzCitzZXQgLWUKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvTWFrZWZpbGUuYW0gYi90ZXN0L3BlcmwvTWFrZWZpbGUuYW0KaW5kZXggZDk3NWY2OS4uMWRiYWYyOCAxMDA2NDQKLS0tIGEvdGVzdC9wZXJsL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcGVybC9NYWtlZmlsZS5hbQpAQCAtMTcsOCArMTcsNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHBlcmwgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIApAQCAtMjcsNSArMjUsNyBAQAogY2hlY2s6IHN0dWJzCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1wZXJsCisJJChSTSkgLXIgZ2VuLXBlcmwvCiAKK2Rpc3QtaG9vazoKKwkkKFJNKSAtciAkKGRpc3RkaXIpL2dlbi1wZXJsLwpkaWZmIC0tZ2l0IGEvdGVzdC9wZXJsL1Rlc3RDbGllbnQucGwgYi90ZXN0L3BlcmwvVGVzdENsaWVudC5wbAppbmRleCA5ZDRhYWIyLi45NmUzYmVjIDEwMDc1NQotLS0gYS90ZXN0L3BlcmwvVGVzdENsaWVudC5wbAorKysgYi90ZXN0L3BlcmwvVGVzdENsaWVudC5wbApAQCAtMTksNyArMTksNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogdXNlIERhdGE6OkR1bXBlcjsKQEAgLTMzLDI3ICszMywzNSBAQAogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKIHVzZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpTU0xTb2NrZXQ7CiB1c2UgVGhyaWZ0OjpTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpVbml4U29ja2V0OwogCit1c2UgVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZTsKIHVzZSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0OwogdXNlIFRocmlmdFRlc3Q6OlR5cGVzOwogCiAkfCsrOwogCiBzdWIgdXNhZ2UgewotICAgIHByaW50IDw8RU9GOworICAgIHByaW50IDw8IkVPRiI7CiBVc2FnZTogJDAgW09QVElPTlNdCiAKIE9wdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCkKKyAgLS1jYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0EgdG8gdmFsaWRhdGUgc2VydmVyIHdpdGguCiAgIC0tY2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIHRvIHVzZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgaWYgdXNpbmcgLS1zc2wuCisgIC0tY2lwaGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdGFibGUgY2lwaGVyIGxpc3QuCisgIC0tZG9tYWluLXNvY2tldCA8ZmlsZT4gICAgICAgICAgICAgICAgICAgICAgIFVzZSBhIHVuaXggZG9tYWluIHNvY2tldC4KICAgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdyB1c2FnZS4KKyAgLS1rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUga2V5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbC4KICAgLS1wb3J0IDxwb3J0bnVtPiAgICAgICAgICAgICAgICA5MDkwICAgICAgICAgUG9ydCB0byB1c2UuCiAgIC0tcHJvdG9jb2wge2JpbmFyeX0gICAgICAgICAgICAgYmluYXJ5ICAgICAgIFByb3RvY29sIHRvIHVzZS4KICAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgcHJlc2VudCwgdXNlIFNTTC4KICAgLS10cmFuc3BvcnQge2J1ZmZlcmVkfGZyYW1lZH0gICBidWZmZXJlZCAgICAgVHJhbnNwb3J0IHRvIHVzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKIEVPRgogfQogCkBAIC02NCw3ICs3MiwxMSBAQAogKTsKIAogR2V0T3B0aW9ucyhcJW9wdHMsIHF3ICgKKyAgICBjYT1zCiAgICAgY2VydD1zCisgICAgY2lwaGVycz1zCisgICAga2V5PXMKKyAgICBkb21haW4tc29ja2V0PXMKICAgICBoZWxwCiAgICAgaG9zdD1zCiAgICAgcG9ydD1pCkBAIC03OCw5OCArOTAsMTMyIEBACiAgICAgZXhpdCAwOwogfQogCi1pZiAoJG9wdHN7c3NsfSBhbmQgbm90IGRlZmluZWQgJG9wdHN7Y2VydH0pIHsKLSAgICB1c2FnZSgpOwotICAgIGV4aXQgMTsKLX0KLQogbXkgJHNvY2tldCA9IHVuZGVmOwotaWYgKCRvcHRze3NzbH0pIHsKLQkkc29ja2V0ID0gbmV3IFRocmlmdDo6U1NMU29ja2V0KCRvcHRze2hvc3R9LCAkb3B0c3twb3J0fSk7Ci19IGVsc2UgewotCSRzb2NrZXQgPSBuZXcgVGhyaWZ0OjpTb2NrZXQoJG9wdHN7aG9zdH0sICRvcHRze3BvcnR9KTsKK2lmICgkb3B0c3snZG9tYWluLXNvY2tldCd9KSB7CisgICAgJHNvY2tldCA9IFRocmlmdDo6VW5peFNvY2tldC0+bmV3KCRvcHRzeydkb21haW4tc29ja2V0J30pOworfQorZWxzaWYgKCRvcHRze3NzbH0pIHsKKyAgJHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0LT5uZXcoXCVvcHRzKTsKK30KK2Vsc2UgeworICAkc29ja2V0ID0gVGhyaWZ0OjpTb2NrZXQtPm5ldygkb3B0c3tob3N0fSwgJG9wdHN7cG9ydH0pOwogfQogCiBteSAkdHJhbnNwb3J0OwogaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2J1ZmZlcmVkJykgewotICAgICR0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydCgkc29ja2V0LCAxMDI0LCAxMDI0KTsKLX0gZWxzaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2ZyYW1lZCcpIHsKLSAgICAkdHJhbnNwb3J0ID0gbmV3IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0KCRzb2NrZXQpOwotfSBlbHNlIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC0+bmV3KCRzb2NrZXQsIDEwMjQsIDEwMjQpOworfQorZWxzaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2ZyYW1lZCcpIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQtPm5ldygkc29ja2V0KTsKK30KK2Vsc2UgewogICAgIHVzYWdlKCk7CiAgICAgZXhpdCAxOwogfQogCiBteSAkcHJvdG9jb2w7Ci1pZiAoJG9wdHN7cHJvdG9jb2x9IGVxICdiaW5hcnknKSB7Ci0gICAgJHByb3RvY29sID0gbmV3IFRocmlmdDo6QmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci19IGVsc2UgeworbXkgJHByb3RvY29sMjsKK2lmICgkb3B0c3twcm90b2NvbH0gZXEgJ2JpbmFyeScgfHwgJG9wdHN7cHJvdG9jb2x9IGVxICdtdWx0aScpIHsKKyAgICAkcHJvdG9jb2wgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJHRyYW5zcG9ydCk7Cit9CitlbHNlIHsKICAgICB1c2FnZSgpOwogICAgIGV4aXQgMTsKIH0KIAotbXkgJHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdENsaWVudCgkcHJvdG9jb2wpOworbXkgJHNlY29uZFNlcnZpY2UgPSB1bmRlZjsKK2lmIChpbmRleCgkb3B0c3twcm90b2NvbH0sICdtdWx0aScpID09IDApIHsKKyAgJHByb3RvY29sMiAgICAgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2wtPm5ldygkcHJvdG9jb2wsICdTZWNvbmRTZXJ2aWNlJyk7CisgICRwcm90b2NvbCAgICAgID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoJHByb3RvY29sLCAnVGhyaWZ0VGVzdCcpOworICAkc2Vjb25kU2VydmljZSA9IFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2VDbGllbnQtPm5ldygkcHJvdG9jb2wyKTsKK30KKworbXkgJHRlc3RDbGllbnQgPSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0Q2xpZW50LT5uZXcoJHByb3RvY29sKTsKIAogZXZhbCB7CiAgICR0cmFuc3BvcnQtPm9wZW4oKTsKLX07IAorfTsKIGlmKCRAKXsKICAgICBkaWUoRHVtcGVyKCRAKSk7CiB9CisKK3VzZSBjb25zdGFudCBFUlJfQkFTRVRZUEVTID0+IDE7Cit1c2UgY29uc3RhbnQgRVJSX1NUUlVDVFMgPT4gMjsKK3VzZSBjb25zdGFudCBFUlJfQ09OVEFJTkVSUyA9PiA0OwordXNlIGNvbnN0YW50IEVSUl9FWENFUFRJT05TID0+IDg7Cit1c2UgY29uc3RhbnQgRVJSX1BST1RPQ09MID0+IDE2OwordXNlIGNvbnN0YW50IEVSUl9VTktOT1dOID0+IDY0OworCiBteSAkc3RhcnQgPSBnZXR0aW1lb2ZkYXkoKTsKIAogIwogIyBWT0lEIFRFU1QKICMKLXByaW50KCJ0ZXN0Vm9pZCgpIik7CitwcmludCgndGVzdFZvaWQoKScpOwogJHRlc3RDbGllbnQtPnRlc3RWb2lkKCk7CiBwcmludCgiID0gdm9pZFxuIik7CiAKICMKICMgU1RSSU5HIFRFU1QKICMKLXByaW50KCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOwotbXkgJHMgPSAkdGVzdENsaWVudC0+dGVzdFN0cmluZygiVGVzdCIpOwotcHJpbnQoIiA9IFwiJHNcIlxuIik7CitwcmludCgndGVzdFN0cmluZygiVGVzdCIpJyk7CitteSAkcyA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RyaW5nKCdUZXN0Jyk7CitwcmludChxcXwgPSAiJHMiXG58KTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRzIG5lICdUZXN0Jyk7CisKKyMKKyMgTVVMVElQTEVYRUQgVEVTVAorIworaWYgKGluZGV4KCRvcHRze3Byb3RvY29sfSwgJ211bHRpJykgPT0gMCkgeworICAgIHByaW50KCdzZWNvbmR0ZXN0U3RyaW5nKCJUZXN0MiIpJyk7CisgICAgJHMgPSAkc2Vjb25kU2VydmljZS0+c2Vjb25kdGVzdFN0cmluZygnVGVzdDInKTsKKyAgICBwcmludChxcXwgPSAiJHMiXG58KTsKKyAgICBleGl0KEVSUl9QUk9UT0NPTCkgaWYgKCRzIG5lICd0ZXN0U3RyaW5nKCJUZXN0MiIpJyk7Cit9CiAKICMKICMgQk9PTCBURVNUCiAjCi1wcmludCgidGVzdEJvb2woMSkiKTsKK3ByaW50KCd0ZXN0Qm9vbCgxKScpOwogbXkgJHQgPSAkdGVzdENsaWVudC0+dGVzdEJvb2woMSk7CiBwcmludCgiID0gJHRcbiIpOwotcHJpbnQoInRlc3RCb29sKDApIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkdCBuZSAxKTsKK3ByaW50KCd0ZXN0Qm9vbCgwKScpOwogbXkgJGYgPSAkdGVzdENsaWVudC0+dGVzdEJvb2woMCk7CiBwcmludCgiID0gJGZcbiIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJGYgbmUgcXx8KTsKIAogCiAjCiAjIEJZVEUgVEVTVAogIwotcHJpbnQoInRlc3RCeXRlKDEpIik7CitwcmludCgndGVzdEJ5dGUoMSknKTsKIG15ICR1OCA9ICR0ZXN0Q2xpZW50LT50ZXN0Qnl0ZSgxKTsKIHByaW50KCIgPSAkdThcbiIpOwogCiAjCiAjIEkzMiBURVNUCiAjCi1wcmludCgidGVzdEkzMigtMSkiKTsKK3ByaW50KCd0ZXN0STMyKC0xKScpOwogbXkgJGkzMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STMyKC0xKTsKIHByaW50KCIgPSAkaTMyXG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRpMzIgbmUgLTEpOwogCiAjCi0jSTY0IFRFU1QKKyMgSTY0IFRFU1QKICMKLXByaW50KCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKK3ByaW50KCd0ZXN0STY0KC0zNDM1OTczODM2OCknKTsKIG15ICRpNjQgPSAkdGVzdENsaWVudC0+dGVzdEk2NCgtMzQzNTk3MzgzNjgpOwogcHJpbnQoIiA9ICRpNjRcbiIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJGk2NCBuZSAtMzQzNTk3MzgzNjgpOwogCiAjCiAjIERPVUJMRSBURVNUCiAjCi1wcmludCgidGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCkiKTsKK3ByaW50KCd0ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KScpOwogbXkgJGR1YiA9ICR0ZXN0Q2xpZW50LT50ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KTsKIHByaW50KCIgPSAkZHViXG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRkdWIgbmUgLTg1Mi4yMzQyMzQyMzQpOwogCiAjCiAjIEJJTkFSWSBURVNUICAgLS0tICBUT0RPCkBAIC0xNzksMzMgKzIyNSwzMyBAQAogIwogIyBTVFJVQ1QgVEVTVAogIwotcHJpbnQoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOwotbXkgJG91dCA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3QoKTsKLSRvdXQtPnN0cmluZ190aGluZygiWmVybyIpOworcHJpbnQoJ3Rlc3RTdHJ1Y3QoeyJaZXJvIiwgMSwgLTMsIC01fSknKTsKK215ICRvdXQgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldygpOworJG91dC0+c3RyaW5nX3RoaW5nKCdaZXJvJyk7CiAkb3V0LT5ieXRlX3RoaW5nKDEpOwogJG91dC0+aTMyX3RoaW5nKC0zKTsKICRvdXQtPmk2NF90aGluZygtNSk7CiBteSAkaW4gPSAkdGVzdENsaWVudC0+dGVzdFN0cnVjdCgkb3V0KTsKLXByaW50KCIgPSB7XCIiLiRpbi0+c3RyaW5nX3RoaW5nLiJcIiwgIi4KLSAgICAgICAgJGluLT5ieXRlX3RoaW5nLiIsICIuCi0gICAgICAgICRpbi0+aTMyX3RoaW5nLiIsICIuCitwcmludCgnID0geyInLiRpbi0+c3RyaW5nX3RoaW5nLiciLCAnLgorICAgICAgICAkaW4tPmJ5dGVfdGhpbmcuJywgJy4KKyAgICAgICAgJGluLT5pMzJfdGhpbmcuJywgJy4KICAgICAgICAgJGluLT5pNjRfdGhpbmcuIn1cbiIpOwogCiAjCiAjIE5FU1RFRCBTVFJVQ1QgVEVTVAogIwotcHJpbnQoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0sIDV9Iik7Ci1teSAkb3V0MiA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3QyKCk7CitwcmludCgndGVzdE5lc3QoezEsIHsiWmVybyIsIDEsIC0zLCAtNX0sIDV9Jyk7CitteSAkb3V0MiA9IFRocmlmdFRlc3Q6Olh0cnVjdDItPm5ldygpOwogJG91dDItPmJ5dGVfdGhpbmcoMSk7CiAkb3V0Mi0+c3RydWN0X3RoaW5nKCRvdXQpOwogJG91dDItPmkzMl90aGluZyg1KTsKIG15ICRpbjIgPSAkdGVzdENsaWVudC0+dGVzdE5lc3QoJG91dDIpOwogJGluID0gJGluMi0+c3RydWN0X3RoaW5nOwotcHJpbnQoIiA9IHsiLiRpbjItPmJ5dGVfdGhpbmcuIiwge1wiIi4KLSAgICAgICRpbi0+c3RyaW5nX3RoaW5nLiJcIiwgIi4KLSAgICAgICRpbi0+Ynl0ZV90aGluZy4iLCAiLgotICAgICAgJGluLT5pMzJfdGhpbmcuIiwgIi4KLSAgICAgICRpbi0+aTY0X3RoaW5nLiJ9LCAiLgorcHJpbnQoJyA9IHsnLiRpbjItPmJ5dGVfdGhpbmcuJywgeyInLgorICAgICAgJGluLT5zdHJpbmdfdGhpbmcuJyIsICcuCisgICAgICAkaW4tPmJ5dGVfdGhpbmcuJywgJy4KKyAgICAgICRpbi0+aTMyX3RoaW5nLicsICcuCisgICAgICAkaW4tPmk2NF90aGluZy4nfSwgJy4KICAgICAgICRpbjItPmkzMl90aGluZy4ifVxuIik7CiAKICMKQEAgLTIxNSwyOCArMjYxLDMwIEBACiBmb3IgKG15ICRpID0gMDsgJGkgPCA1OyArKyRpKSB7CiAgICRtYXBvdXQtPnskaX0gPSAkaS0xMDsKIH0KLXByaW50KCJ0ZXN0TWFwKHsiKTsKK3ByaW50KCd0ZXN0TWFwKHsnKTsKIG15ICRmaXJzdCA9IDE7CiB3aGlsZSggbXkoJGtleSwkdmFsKSA9IGVhY2ggJSRtYXBvdXQpIHsKICAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgICRmaXJzdCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnQoIiwgIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludCgnLCAnKTsKICAgICB9CiAgICAgcHJpbnQoIiRrZXkgPT4gJHZhbCIpOwogfQotcHJpbnQoIn0pIik7CitwcmludCgnfSknKTsKIAogCiBteSAkbWFwaW4gPSAkdGVzdENsaWVudC0+dGVzdE1hcCgkbWFwb3V0KTsKLXByaW50KCIgPSB7Iik7CitwcmludCgnID0geycpOwogCiAkZmlyc3QgPSAxOwogd2hpbGUoIG15KCRrZXksJHZhbCkgPSBlYWNoICUkbWFwaW4pewogICAgIGlmICgkZmlyc3QpIHsKICAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByaW50KCcsICcpOwogICAgIH0KICAgICBwcmludCgiJGtleSA9PiAkdmFsIik7CiB9CkBAIC0yNTAsMTEgKzI5OCwxMSBAQAogICAgIHB1c2goQCRzZXRvdXQsICRpKTsKIH0KIAotcHJpbnQoInRlc3RTZXQoeyIuam9pbigiLCIsQCRzZXRvdXQpLiJ9KSIpOworcHJpbnQoJ3Rlc3RTZXQoeycuam9pbignLCcsQCRzZXRvdXQpLid9KScpOwogCiBteSAkc2V0aW4gPSAkdGVzdENsaWVudC0+dGVzdFNldCgkc2V0b3V0KTsKIAotcHJpbnQoIiA9IHsiLmpvaW4oIiwiLEAkc2V0b3V0KS4ifVxuIik7CitwcmludCgnID0geycuam9pbignLCcsQCRzZXRvdXQpLiJ9XG4iKTsKIAogIwogIyBMSVNUIFRFU1QKQEAgLTI2NCwxMTEgKzMxMiwxMTEgQEAKICAgICBwdXNoKEAkbGlzdG91dCwgJGkpOwogfQogCi1wcmludCgidGVzdExpc3QoeyIuam9pbigiLCIsQCRsaXN0b3V0KS4ifSkiKTsKK3ByaW50KCd0ZXN0TGlzdCh7Jy5qb2luKCcsJyxAJGxpc3RvdXQpLid9KScpOwogCiBteSAkbGlzdGluID0gJHRlc3RDbGllbnQtPnRlc3RMaXN0KCRsaXN0b3V0KTsKIAotcHJpbnQoIiA9IHsiLmpvaW4oIiwiLEAkbGlzdGluKS4ifVxuIik7CitwcmludCgnID0geycuam9pbignLCcsQCRsaXN0aW4pLiJ9XG4iKTsKIAogIwogIyBFTlVNIFRFU1QKICMKLXByaW50KCJ0ZXN0RW51bShPTkUpIik7CitwcmludCgndGVzdEVudW0oT05FKScpOwogbXkgJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpPTkUpOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCi1wcmludCgidGVzdEVudW0oVFdPKSIpOworcHJpbnQoJ3Rlc3RFbnVtKFRXTyknKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6VFdPKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAotcHJpbnQoInRlc3RFbnVtKFRIUkVFKSIpOworcHJpbnQoJ3Rlc3RFbnVtKFRIUkVFKScpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpUSFJFRSk7CiBwcmludCgiID0gJHJldFxuIik7CiAKLXByaW50KCJ0ZXN0RW51bShGSVZFKSIpOworcHJpbnQoJ3Rlc3RFbnVtKEZJVkUpJyk7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6OkZJVkUpOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCi1wcmludCgidGVzdEVudW0oRUlHSFQpIik7CitwcmludCgndGVzdEVudW0oRUlHSFQpJyk7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6OkVJR0hUKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAogIwogIyBUWVBFREVGIFRFU1QKICMKLXByaW50KCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CitwcmludCgndGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKScpOwogbXkgJHVpZCA9ICR0ZXN0Q2xpZW50LT50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpOwogcHJpbnQoIiA9ICR1aWRcbiIpOwogCiAjCiAjIE5FU1RFRCBNQVAgVEVTVAogIwotcHJpbnQoInRlc3RNYXBNYXAoMSkiKTsKK3ByaW50KCd0ZXN0TWFwTWFwKDEpJyk7CiBteSAkbW0gPSAkdGVzdENsaWVudC0+dGVzdE1hcE1hcCgxKTsKLXByaW50KCIgPSB7Iik7CitwcmludCgnID0geycpOwogd2hpbGUoIG15ICgka2V5LCR2YWwpID0gZWFjaCAlJG1tKSB7CiAgICAgcHJpbnQoIiRrZXkgPT4geyIpOwogICAgIHdoaWxlKCBteSgkazIsJHYyKSA9IGVhY2ggJSR2YWwpIHsKICAgICAgICAgcHJpbnQoIiRrMiA9PiAkdjIsICIpOwogICAgIH0KLSAgICBwcmludCgifSwgIik7CisgICAgcHJpbnQoJ30sICcpOwogfQogcHJpbnQoIn1cbiIpOwogCiAjCiAjIElOU0FOSVRZIFRFU1QKICMKLW15ICRpbnNhbmUgPSBuZXcgVGhyaWZ0VGVzdDo6SW5zYW5pdHkoKTsKK215ICRpbnNhbmUgPSBUaHJpZnRUZXN0OjpJbnNhbml0eS0+bmV3KCk7CiAkaW5zYW5lLT57dXNlck1hcH0tPntUaHJpZnRUZXN0OjpOdW1iZXJ6OjpGSVZFfSA9IDUwMDA7Ci1teSAkdHJ1Y2sgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KCk7Ci0kdHJ1Y2stPnN0cmluZ190aGluZygiSGVsbG8yIik7CitteSAkdHJ1Y2sgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldygpOworJHRydWNrLT5zdHJpbmdfdGhpbmcoJ0hlbGxvMicpOwogJHRydWNrLT5ieXRlX3RoaW5nKDIpOwogJHRydWNrLT5pMzJfdGhpbmcoMik7CiAkdHJ1Y2stPmk2NF90aGluZygyKTsKLW15ICR0cnVjazIgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KCk7Ci0kdHJ1Y2syLT5zdHJpbmdfdGhpbmcoIkdvb2RieWU0Iik7CitteSAkdHJ1Y2syID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoKTsKKyR0cnVjazItPnN0cmluZ190aGluZygnR29vZGJ5ZTQnKTsKICR0cnVjazItPmJ5dGVfdGhpbmcoNCk7CiAkdHJ1Y2syLT5pMzJfdGhpbmcoNCk7CiAkdHJ1Y2syLT5pNjRfdGhpbmcoNCk7CiBwdXNoKEB7JGluc2FuZS0+e3h0cnVjdHN9fSwgJHRydWNrKTsKIHB1c2goQHskaW5zYW5lLT57eHRydWN0c319LCAkdHJ1Y2syKTsKIAotcHJpbnQoInRlc3RJbnNhbml0eSgpIik7CitwcmludCgndGVzdEluc2FuaXR5KCknKTsKIG15ICR3aG9hID0gJHRlc3RDbGllbnQtPnRlc3RJbnNhbml0eSgkaW5zYW5lKTsKLXByaW50KCIgPSB7Iik7CitwcmludCgnID0geycpOwogd2hpbGUoIG15ICgka2V5LCR2YWwpID0gZWFjaCAlJHdob2EpIHsKICAgICBwcmludCgiJGtleSA9PiB7Iik7CiAgICAgd2hpbGUoIG15KCRrMiwkdjIpID0gZWFjaCAlJHZhbCkgewogICAgICAgICBwcmludCgiJGsyID0+IHsiKTsKICAgICAgICAgbXkgJHVzZXJNYXAgPSAkdjItPnt1c2VyTWFwfTsKLSAgICAgICAgcHJpbnQoInsiKTsKLSAgICAgICAgaWYgKHJlZigkdXNlck1hcCkgZXEgIkhBU0giKSB7CisgICAgICAgIHByaW50KCd7Jyk7CisgICAgICAgIGlmIChyZWYoJHVzZXJNYXApIGVxICdIQVNIJykgewogICAgICAgICAgICAgd2hpbGUoIG15KCRrMywkdjMpID0gZWFjaCAlJHVzZXJNYXApIHsKICAgICAgICAgICAgICAgICBwcmludCgiJGszID0+ICR2MywgIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnQoIn0sICIpOworICAgICAgICBwcmludCgnfSwgJyk7CiAKICAgICAgICAgbXkgJHh0cnVjdHMgPSAkdjItPnt4dHJ1Y3RzfTsKLSAgICAgICAgcHJpbnQoInsiKTsKLSAgICAgICAgaWYgKHJlZigkeHRydWN0cykgZXEgIkFSUkFZIikgeworICAgICAgICBwcmludCgneycpOworICAgICAgICBpZiAocmVmKCR4dHJ1Y3RzKSBlcSAnQVJSQVknKSB7CiAgICAgICAgICAgICBmb3JlYWNoIG15ICR4IChAJHh0cnVjdHMpIHsKLSAgICAgICAgICAgICAgICBwcmludCgie1wiIi4keC0+e3N0cmluZ190aGluZ30uIlwiLCAiLgotICAgICAgICAgICAgICAgICAgICAgICR4LT57Ynl0ZV90aGluZ30uIiwgIi4keC0+e2kzMl90aGluZ30uIiwgIi4keC0+e2k2NF90aGluZ30uIn0sICIpOworICAgICAgICAgICAgICAgIHByaW50KCd7IicuJHgtPntzdHJpbmdfdGhpbmd9LiciLCAnLgorICAgICAgICAgICAgICAgICAgICAgICR4LT57Ynl0ZV90aGluZ30uJywgJy4keC0+e2kzMl90aGluZ30uJywgJy4keC0+e2k2NF90aGluZ30uJ30sICcpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHByaW50KCJ9Iik7CisgICAgICAgIHByaW50KCd9Jyk7CiAKLSAgICAgICAgcHJpbnQoIn0sICIpOworICAgICAgICBwcmludCgnfSwgJyk7CiAgICAgfQotICAgIHByaW50KCJ9LCAiKTsKKyAgICBwcmludCgnfSwgJyk7CiB9CiBwcmludCgifVxuIik7CiAKICMKICMgRVhDRVBUSU9OIFRFU1QKICMKLXByaW50KCJ0ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpIik7CitwcmludChxfHRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyl8KTsKIGV2YWwgewogICAgICR0ZXN0Q2xpZW50LT50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOwogICAgIHByaW50KCIgIHZvaWRcbkZBSUxVUkVcbiIpOwpAQCAtMzgxLDcgKzQyOSw3IEBACiAjIE5vcm1hbCB0ZXN0cyBkb25lLgogIwogbXkgJHN0b3AgPSBnZXR0aW1lb2ZkYXkoKTsKLW15ICRlbHAgID0gc3ByaW50ZigiJWQiLDEwMDAqKCRzdG9wIC0gJHN0YXJ0KSwgMCk7CitteSAkZWxwICA9IHNwcmludGYoJyVkJywxMDAwKigkc3RvcCAtICRzdGFydCksIDApOwogcHJpbnQoIlRvdGFsIHRpbWU6ICRlbHAgbXNcbiIpOwogCiAjCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvVGVzdFNlcnZlci5wbCBiL3Rlc3QvcGVybC9UZXN0U2VydmVyLnBsCmluZGV4IDViZmE2NDAuLmQyYjlhMzggMTAwNjQ0Ci0tLSBhL3Rlc3QvcGVybC9UZXN0U2VydmVyLnBsCisrKyBiL3Rlc3QvcGVybC9UZXN0U2VydmVyLnBsCkBAIC0xOSwxMyArMTksMTUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIHVzZSBEYXRhOjpEdW1wZXI7CiB1c2UgR2V0b3B0OjpMb25nIHF3KEdldE9wdGlvbnMpOwogdXNlIFRpbWU6OkhpUmVzIHF3KGdldHRpbWVvZmRheSk7CiAKKyRTSUd7SU5UfSA9IFwmc2lnaW50X2hhbmRsZXI7CisKIHVzZSBsaWIgJy4uLy4uL2xpYi9wZXJsL2xpYic7CiB1c2UgbGliICdnZW4tcGVybCc7CiAKQEAgLTMzLDIzICszNSwyOCBAQAogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKIHVzZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwogdXNlIFRocmlmdDo6U1NMU2VydmVyU29ja2V0OwogdXNlIFRocmlmdDo6U2VydmVyU29ja2V0OwogdXNlIFRocmlmdDo6U2VydmVyOwordXNlIFRocmlmdDo6VW5peFNlcnZlclNvY2tldDsKIAordXNlIFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2U7CiB1c2UgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdDsKIHVzZSBUaHJpZnRUZXN0OjpUeXBlczsKIAogJHwrKzsKIAogc3ViIHVzYWdlIHsKLSAgICBwcmludCA8PEVPRjsKKyAgICBwcmludCA8PCJFT0YiOwogVXNhZ2U6ICQwIFtPUFRJT05TXQogCiBPcHRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQpCiAgIC0tY2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlIChvcHRpb25hbCkuCiAgIC0tY2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGZpbGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsLgorICAtLWNpcGhlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRhYmxlIGNpcGhlciBsaXN0LgorICAtLWRvbWFpbi1zb2NrZXQgPGZpbGU+ICAgICAgICAgICAgICAgICAgICAgICBVc2UgYSB1bml4IGRvbWFpbiBzb2NrZXQuCiAgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgdXNhZ2UuCiAgIC0ta2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhdGUga2V5IGZpbGUgZm9yIGNlcnRpZmljYXRlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbCBhbmQgcHJpdmF0ZSBrZXkgaXMKQEAgLTU4LDcgKzY1LDcgQEAKICAgLS1wcm90b2NvbCB7YmluYXJ5fSAgICAgICAgICAgICBiaW5hcnkgICAgICAgUHJvdG9jb2wgdG8gdXNlLgogICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBwcmVzZW50LCB1c2UgU1NML1RMUy4KICAgLS10cmFuc3BvcnQge2J1ZmZlcmVkfGZyYW1lZH0gICBidWZmZXJlZCAgICAgVHJhbnNwb3J0IHRvIHVzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKIEVPRgogfQogCkBAIC03MSw2ICs3OCw4IEBACiBHZXRPcHRpb25zKFwlb3B0cywgcXcgKAogICAgIGNhPXMKICAgICBjZXJ0PXMKKyAgICBjaXBoZXJzPXMKKyAgICBkb21haW4tc29ja2V0PXMKICAgICBoZWxwCiAgICAgaG9zdD1zCiAgICAga2V5PXMKQEAgLTkwLDQwICs5OSw2OSBAQAogICAgIGV4aXQgMTsKIH0KIAotbXkgJGhhbmRsZXIgPSBuZXcgVGhyaWZ0VGVzdEhhbmRsZXIoKTsKLW15ICRwcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdFByb2Nlc3NvcigkaGFuZGxlcik7CitteSAkaGFuZGxlciAgICA9IFRocmlmdFRlc3RIYW5kbGVyLT5uZXcoKTsKK215ICRoYW5kbGVyMiAgID0gU2Vjb25kU2VydmljZUhhbmRsZXItPm5ldygpOworbXkgJHByb2Nlc3NvciAgPSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0UHJvY2Vzc29yLT5uZXcoJGhhbmRsZXIpOworbXkgJHByb2Nlc3NvcjIgPSBUaHJpZnRUZXN0OjpTZWNvbmRTZXJ2aWNlUHJvY2Vzc29yLT5uZXcoJGhhbmRsZXIyKTsKKwogbXkgJHNlcnZlcnNvY2tldDsKLWlmICgkb3B0c3tzc2x9KSB7Ci0gICAgJHNlcnZlcnNvY2tldCA9IG5ldyBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldChcJW9wdHMpOwotfSBlbHNlIHsKLSAgICAkc2VydmVyc29ja2V0ID0gbmV3IFRocmlmdDo6U2VydmVyU29ja2V0KFwlb3B0cyk7CitpZiAoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSkgeworICAgIHVubGluaygkb3B0c3snZG9tYWluLXNvY2tldCd9KTsKKyAgICAkc2VydmVyc29ja2V0ID0gVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0LT5uZXcoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSk7Cit9CitlbHNpZiAoJG9wdHN7c3NsfSkgeworICAgICRzZXJ2ZXJzb2NrZXQgPSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldC0+bmV3KFwlb3B0cyk7Cit9CitlbHNlIHsKKyAgICAkc2VydmVyc29ja2V0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQtPm5ldyhcJW9wdHMpOwogfQogbXkgJHRyYW5zcG9ydDsKIGlmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdidWZmZXJlZCcpIHsKLSAgICAkdHJhbnNwb3J0ID0gbmV3IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCk7Ci19IGVsc2lmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdmcmFtZWQnKSB7Ci0gICAgJHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKTsKLX0gZWxzZSB7CisgICAgJHRyYW5zcG9ydCA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKTsKK30KK2Vsc2lmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdmcmFtZWQnKSB7CisgICAgJHRyYW5zcG9ydCA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeS0+bmV3KCk7Cit9CitlbHNlIHsKICAgICB1c2FnZSgpOwogICAgIGV4aXQgMTsKIH0KIG15ICRwcm90b2NvbDsKLWlmICgkb3B0c3twcm90b2NvbH0gZXEgJ2JpbmFyeScpIHsKLSAgICAkcHJvdG9jb2wgPSBuZXcgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKLX0gZWxzZSB7CitpZiAoJG9wdHN7cHJvdG9jb2x9IGVxICdiaW5hcnknIHx8ICRvcHRze3Byb3RvY29sfSBlcSAnbXVsdGknKSB7CisgICAgJHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnktPm5ldygpOworfQorZWxzZSB7CiAgICAgdXNhZ2UoKTsKICAgICBleGl0IDE7CiB9CiAKK2lmIChpbmRleCgkb3B0c3twcm90b2NvbH0sICdtdWx0aScpID09IDApIHsKKyAgbXkgJG5ld1Byb2Nlc3NvciA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3ItPm5ldygkcHJvdG9jb2wpOworICAkbmV3UHJvY2Vzc29yLT5kZWZhdWx0UHJvY2Vzc29yKCRwcm9jZXNzb3IpOworICAkbmV3UHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcignVGhyaWZ0VGVzdCcsICRwcm9jZXNzb3IpOworICAkbmV3UHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcignU2Vjb25kU2VydmljZScsICRwcm9jZXNzb3IyKTsKKyAgJHByb2Nlc3NvciA9ICRuZXdQcm9jZXNzb3I7Cit9CisKIG15ICRzc2x0YWcgPSAnJzsKIGlmICgkb3B0c3tzc2x9KSB7Ci0gICAgJHNzbHRhZyA9ICIoU1NMKSI7CisgICAgJHNzbHRhZyA9ICcoU1NMKSc7CiB9Ci1teSAkc2VydmVyID0gbmV3IFRocmlmdDo6U2ltcGxlU2VydmVyKCRwcm9jZXNzb3IsICRzZXJ2ZXJzb2NrZXQsICR0cmFuc3BvcnQsICRwcm90b2NvbCk7Ci1wcmludCAiU3RhcnRpbmcgXCJzaW1wbGVcIiBzZXJ2ZXIgKCRvcHRze3RyYW5zcG9ydH0vJG9wdHN7cHJvdG9jb2x9KSBsaXN0ZW4gb246ICRvcHRze3BvcnR9ICRzc2x0YWdcbiI7CitteSAkbGlzdGVuaW5nX29uID0gIiRvcHRze3BvcnR9ICRzc2x0YWciOworaWYgKCRvcHRzeydkb21haW4tc29ja2V0J30pIHsKKyAgICAkbGlzdGVuaW5nX29uID0gJG9wdHN7J2RvbWFpbi1zb2NrZXQnfTsKK30KK215ICRzZXJ2ZXIgPSBUaHJpZnQ6OlNpbXBsZVNlcnZlci0+bmV3KCRwcm9jZXNzb3IsICRzZXJ2ZXJzb2NrZXQsICR0cmFuc3BvcnQsICRwcm90b2NvbCk7CitwcmludCBxcXxTdGFydGluZyAic2ltcGxlIiBzZXJ2ZXIgKCRvcHRze3RyYW5zcG9ydH0vJG9wdHN7cHJvdG9jb2x9KSBsaXN0ZW4gb246ICRsaXN0ZW5pbmdfb25cbnw7CiAkc2VydmVyLT5zZXJ2ZSgpOworcHJpbnQgImRvbmUuXG4iOwogCi0jIyMgICAgCitzdWIgc2lnaW50X2hhbmRsZXIgeworICBwcmludCAicmVjZWl2ZWQgU0lHSU5ULCBzdG9wcGluZy4uLlxuIjsKKyAgJHNlcnZlci0+c3RvcCgpOworfQorCisjIyMKICMjIyBUZXN0IHNlcnZlciBpbXBsZW1lbnRhdGlvbgogIyMjCiAKQEAgLTEzNyw3MCArMTc1LDY3IEBACiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKIH0KIAotc3ViIHRlc3RWb2lkKCkgewotICBwcmludCgidGVzdFZvaWQoKVxuIik7IAorc3ViIHRlc3RWb2lkIHsKKyAgcHJpbnQoInRlc3RWb2lkKClcbiIpOwogfQogCi1zdWIgdGVzdFN0cmluZygpIHsKK3N1YiB0ZXN0U3RyaW5nIHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7CiAgIHByaW50KCJ0ZXN0U3RyaW5nKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEJvb2woKSB7CitzdWIgdGVzdEJvb2wgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKLSAgbXkgJHN0ciA9ICR0aGluZyA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgIG15ICRzdHIgPSAkdGhpbmcgPyAndHJ1ZScgOiAnZmFsc2UnOwogICBwcmludCgidGVzdEJvb2woJHN0cilcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEJ5dGUoKSB7CitzdWIgdGVzdEJ5dGUgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKICAgcHJpbnQoInRlc3RCeXRlKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEkzMigpIHsKK3N1YiB0ZXN0STMyIHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7CiAgIHByaW50KCJ0ZXN0STMyKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEk2NCgpIHsKK3N1YiB0ZXN0STY0IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7CiAgIHByaW50KCJ0ZXN0STY0KCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdERvdWJsZSgpIHsKK3N1YiB0ZXN0RG91YmxlIHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7CiAgIHByaW50KCJ0ZXN0RG91YmxlKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEJpbmFyeSgpIHsKK3N1YiB0ZXN0QmluYXJ5IHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICR0aGluZyA9IHNoaWZ0OwogICAgIG15IEBieXRlcyA9IHNwbGl0IC8vLCAkdGhpbmc7Ci0gICAgcHJpbnQoInRlc3RCaW5hcnkoIik7Ci0gICAgZm9yZWFjaCAoQGJ5dGVzKQotICAgIHsKLSAgICAgICAgcHJpbnRmICIlMDJseCIsIG9yZCAkXzsKLSAgICB9Ci0gICAgcHJpbnQoIilcbiIpOworICAgIHByaW50ICd0ZXN0QmluYXJ5KCc7CisgICAgcHJpbnRmKCAnJTAybHgnLCBvcmQgJF8gKSBmb3JlYWNoIChAYnl0ZXMpOworICAgIHByaW50ICIpXG4iOwogICAgIHJldHVybiAkdGhpbmc7CiB9CiAKLXN1YiB0ZXN0U3RydWN0KCkgeworc3ViIHRlc3RTdHJ1Y3QgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKLSAgcHJpbnRmKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJWxsZH0pXG4iLAorICBwcmludGYocXF8dGVzdFN0cnVjdCh7IiVzIiwgJWQsICVkLCAlbGxkfSlcbnwsCiAgICAgICAgICAgICR0aGluZy0+e3N0cmluZ190aGluZ30sCiAgICAgICAgICAgICR0aGluZy0+e2J5dGVfdGhpbmd9LAogICAgICAgICAgICAkdGhpbmctPntpMzJfdGhpbmd9LApAQCAtMjA4LDExICsyNDMsMTEgQEAKICAgcmV0dXJuICR0aGluZzsKIH0KIAotc3ViIHRlc3ROZXN0KCkgeworc3ViIHRlc3ROZXN0IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJG5lc3QgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gJG5lc3QtPntzdHJ1Y3RfdGhpbmd9OwotICBwcmludGYoInRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlbGxkfSwgJWR9KVxuIiwKKyAgcHJpbnRmKHFxfHRlc3ROZXN0KHslZCwgeyIlcyIsICVkLCAlZCwgJWxsZH0sICVkfSlcbnwsCiAgICAgICAgICAgICRuZXN0LT57Ynl0ZV90aGluZ30sCiAgICAgICAgICAgICR0aGluZy0+e3N0cmluZ190aGluZ30sCiAgICAgICAgICAgICR0aGluZy0+e2J5dGVfdGhpbmd9LApAQCAtMjIyLDExOSArMjU3LDg1IEBACiAgIHJldHVybiAkbmVzdDsKIH0KIAotc3ViIHRlc3RNYXAoKSB7CitzdWIgdGVzdE1hcCB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICR0aGluZyA9IHNoaWZ0OwotICBwcmludCgidGVzdE1hcCh7Iik7Ci0gIG15ICRmaXJzdCA9IDE7Ci0gIGZvcmVhY2ggbXkgJGtleSAoa2V5cyAlJHRoaW5nKSB7Ci0gICAgaWYgKCRmaXJzdCkgewotICAgICAgICAkZmlyc3QgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50KCIsICIpOwotICAgIH0KLSAgICBwcmludCgiJGtleSA9PiAkdGhpbmctPnska2V5fSIpOwotICB9Ci0gIHByaW50KCJ9KVxuIik7CisgIHByaW50ZiAidGVzdE1hcCh7JXN9KVxuIiwKKyAgICBqb2luKCAnLCAnLAorICAgICAgICAgIG1hcCB7ICRfIC4gJyA9PiAnIC4gJHRoaW5nLT57JF99IH0KKyAgICAgICAgICBzb3J0IGtleXMgJSR0aGluZworICAgICk7CiAgIHJldHVybiAkdGhpbmc7CiB9CiAKLXN1YiB0ZXN0U3RyaW5nTWFwKCkgeworc3ViIHRlc3RTdHJpbmdNYXAgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKLSAgcHJpbnQoInRlc3RTdHJpbmdNYXAoeyIpOwotICBteSAkZmlyc3QgPSAxOwotICBmb3JlYWNoIG15ICRrZXkgKGtleXMgJSR0aGluZykgewotICAgIGlmICgkZmlyc3QpIHsKLSAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKLSAgICB9Ci0gICAgcHJpbnQoIiRrZXkgPT4gJHRoaW5nLT57JGtleX0iKTsKLSAgfQotICBwcmludCgifSlcbiIpOworICBwcmludGYgInRlc3RTdHJpbmdNYXAoeyVzfSlcbiIsCisgICAgam9pbiggJywgJywKKyAgICAgICAgICBtYXAgeyAkXyAuICcgPT4gJyAuICR0aGluZy0+eyRffSB9CisgICAgICAgICAgc29ydCBrZXlzICUkdGhpbmcKKyAgICApOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdFNldCgpIHsKK3N1YiB0ZXN0U2V0IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7Ci0gIG15IEBhcnI7Ci0gIG15ICRyZXN1bHQgPSBcQGFycjsKLSAgcHJpbnQoInRlc3RTZXQoeyIpOwotICBteSAkZmlyc3QgPSAxOwotICBmb3JlYWNoIG15ICRrZXkgKGtleXMgJSR0aGluZykgewotICAgIGlmICgkZmlyc3QpIHsKLSAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKLSAgICB9Ci0gICAgcHJpbnQoIiRrZXkiKTsKLSAgICBwdXNoKCRyZXN1bHQsICRrZXkpOwotICB9Ci0gIHByaW50KCJ9KVxuIik7Ci0gIHJldHVybiAkcmVzdWx0OworICBteSBAcmVzdWx0ID0gc29ydCBrZXlzICUkdGhpbmc7CisgIHByaW50ZiAidGVzdFNldCh7JXN9KVxuIiwgam9pbignLCAnLCBAcmVzdWx0ICk7CisgIHJldHVybiBcQHJlc3VsdDsKIH0KIAotc3ViIHRlc3RMaXN0KCkgeworc3ViIHRlc3RMaXN0IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7Ci0gIHByaW50KCJ0ZXN0TGlzdCh7Iik7Ci0gIG15ICRmaXJzdCA9IDE7Ci0gIGZvcmVhY2ggbXkgJGtleSAoQCR0aGluZykgewotICAgIGlmICgkZmlyc3QpIHsKLSAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKLSAgICB9Ci0gICAgcHJpbnQoIiRrZXkiKTsKLSAgfQotICBwcmludCgifSlcbiIpOworICBwcmludCAidGVzdExpc3QoeyVzfSlcbiIsIGpvaW4oJywgJywgQCR0aGluZyk7CiAgIHJldHVybiAkdGhpbmc7CiB9CiAKLXN1YiB0ZXN0RW51bSgpIHsKK3N1YiB0ZXN0RW51bSB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICR0aGluZyA9IHNoaWZ0OwotICBwcmludCgidGVzdEVudW0oJHRoaW5nKVxuIik7CisgIHByaW50ICJ0ZXN0RW51bSgkdGhpbmcpXG4iOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdFR5cGVkZWYoKSB7CitzdWIgdGVzdFR5cGVkZWYgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKICAgcHJpbnQoInRlc3RUeXBlZGVmKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdE1hcE1hcCgpIHsKK3N1YiB0ZXN0TWFwTWFwIHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJGhlbGxvID0gc2hpZnQ7Ci0gIAorCiAgIHByaW50ZigidGVzdE1hcE1hcCglZClcbiIsICRoZWxsbyk7CiAgIG15ICRyZXN1bHQgPSB7IDQgPT4geyAxID0+IDEsIDIgPT4gMiwgMyA9PiAzLCA0ID0+IDQgfSwgLTQgPT4geyAtMSA9PiAtMSwgLTIgPT4gLTIsIC0zID0+IC0zLCAtNCA9PiAtNCB9IH07CiAgIHJldHVybiAkcmVzdWx0OwogfQogCi1zdWIgdGVzdEluc2FuaXR5KCkgeworc3ViIHRlc3RJbnNhbml0eSB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICRhcmd1bWVudCA9IHNoaWZ0OwogICBwcmludCgidGVzdEluc2FuaXR5KClcbiIpOwogCi0gIG15ICRoZWxsbyA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3Qoe3N0cmluZ190aGluZyA9PiAiSGVsbG8yIiwgYnl0ZV90aGluZyA9PiAyLCBpMzJfdGhpbmcgPT4gMiwgaTY0X3RoaW5nID0+IDJ9KTsKKyAgbXkgJGhlbGxvID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAnSGVsbG8yJywgYnl0ZV90aGluZyA9PiAyLCBpMzJfdGhpbmcgPT4gMiwgaTY0X3RoaW5nID0+IDJ9KTsKICAgbXkgQGhlbGxvczsKICAgcHVzaChAaGVsbG9zLCAkaGVsbG8pOwotICBteSAkZ29vZGJ5ZSA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3Qoe3N0cmluZ190aGluZyA9PiAiR29vZGJ5ZTQiLCBieXRlX3RoaW5nID0+IDQsIGkzMl90aGluZyA9PiA0LCBpNjRfdGhpbmcgPT4gNH0pOworICBteSAkZ29vZGJ5ZSA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ0dvb2RieWU0JywgYnl0ZV90aGluZyA9PiA0LCBpMzJfdGhpbmcgPT4gNCwgaTY0X3RoaW5nID0+IDR9KTsKICAgbXkgQGdvb2RieWVzOwogICBwdXNoKEBnb29kYnllcywgJGdvb2RieWUpOwotICBteSAkY3JhenkgPSBuZXcgVGhyaWZ0VGVzdDo6SW5zYW5pdHkoe3VzZXJNYXAgPT4geyBUaHJpZnRUZXN0OjpOdW1iZXJ6OjpFSUdIVCA9PiA4IH0sIHh0cnVjdHMgPT4gXEBnb29kYnllc30pOwotICBteSAkbG9vbnkgPSBuZXcgVGhyaWZ0VGVzdDo6SW5zYW5pdHkoKTsKKyAgbXkgJGNyYXp5ID0gVGhyaWZ0VGVzdDo6SW5zYW5pdHktPm5ldyh7dXNlck1hcCA9PiB7IFRocmlmdFRlc3Q6Ok51bWJlcno6OkVJR0hUID0+IDggfSwgeHRydWN0cyA9PiBcQGdvb2RieWVzfSk7CisgIG15ICRsb29ueSA9IFRocmlmdFRlc3Q6Okluc2FuaXR5LT5uZXcoKTsKICAgbXkgJHJlc3VsdCA9IHsgMSA9PiB7IFRocmlmdFRlc3Q6Ok51bWJlcno6OlRXTyA9PiAkYXJndW1lbnQsIFRocmlmdFRlc3Q6Ok51bWJlcno6OlRIUkVFID0+ICRhcmd1bWVudCB9LAogICAgICAgICAgICAgICAgICAyID0+IHsgVGhyaWZ0VGVzdDo6TnVtYmVyejo6U0lYID0+ICRsb29ueSB9IH07CiAgIHJldHVybiAkcmVzdWx0OwogfQogCi1zdWIgdGVzdE11bHRpKCkgeworc3ViIHRlc3RNdWx0aSB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICRhcmcwID0gc2hpZnQ7CiAgIG15ICRhcmcxID0gc2hpZnQ7CkBAIC0zNDIsNDcgKzM0Myw2OSBAQAogICBteSAkYXJnMyA9IHNoaWZ0OwogICBteSAkYXJnNCA9IHNoaWZ0OwogICBteSAkYXJnNSA9IHNoaWZ0OwotICAKKwogICBwcmludCgidGVzdE11bHRpKClcbiIpOwotICByZXR1cm4gbmV3IFRocmlmdFRlc3Q6Olh0cnVjdCh7c3RyaW5nX3RoaW5nID0+ICJIZWxsbzIiLCBieXRlX3RoaW5nID0+ICRhcmcwLCBpMzJfdGhpbmcgPT4gJGFyZzEsIGk2NF90aGluZyA9PiAkYXJnMn0pOworICByZXR1cm4gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAnSGVsbG8yJywgYnl0ZV90aGluZyA9PiAkYXJnMCwgaTMyX3RoaW5nID0+ICRhcmcxLCBpNjRfdGhpbmcgPT4gJGFyZzJ9KTsKIH0KIAotc3ViIHRlc3RFeGNlcHRpb24oKSB7CitzdWIgdGVzdEV4Y2VwdGlvbiB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICRhcmcgPSBzaGlmdDsKICAgcHJpbnQoInRlc3RFeGNlcHRpb24oJGFyZylcbiIpOwotICBpZiAoJGFyZyBlcSAiWGNlcHRpb24iKSB7Ci0gICAgZGllIG5ldyBUaHJpZnRUZXN0OjpYY2VwdGlvbih7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gJGFyZ30pOwotICB9IGVsc2lmICgkYXJnIGVxICJURXhjZXB0aW9uIikgewotICAgIGRpZSAiYXN0cmluZyI7ICMgYWxsIHVuaGFuZGxlZCBleGNlcHRpb25zIGJlY29tZSBURXhjZXB0aW9ucwotICB9IGVsc2UgewotICAgIHJldHVybiBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KHtzdHJpbmdfdGhpbmcgPT4gJGFyZ30pOworICBpZiAoJGFyZyBlcSAnWGNlcHRpb24nKSB7CisgICAgICBkaWUgVGhyaWZ0VGVzdDo6WGNlcHRpb24tPm5ldyh7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gJGFyZ30pOworICB9CisgIGVsc2lmICgkYXJnIGVxICdURXhjZXB0aW9uJykgeworICAgICAgZGllICdhc3RyaW5nJzsgIyBhbGwgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgYmVjb21lIFRFeGNlcHRpb25zCisgIH0KKyAgZWxzZSB7CisgICAgICByZXR1cm4gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAkYXJnfSk7CiAgIH0KIH0KIAotc3ViIHRlc3RNdWx0aUV4Y2VwdGlvbigpIHsKK3N1YiB0ZXN0TXVsdGlFeGNlcHRpb24gewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkYXJnMCA9IHNoaWZ0OwogICBteSAkYXJnMSA9IHNoaWZ0OwogCiAgIHByaW50ZigidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsICRhcmcwLCAkYXJnMSk7Ci0gIGlmICgkYXJnMCBlcSAiWGNlcHRpb24iKSB7Ci0gICAgZGllIG5ldyBUaHJpZnRUZXN0OjpYY2VwdGlvbih7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gIlRoaXMgaXMgYW4gWGNlcHRpb24ifSk7Ci0gIH0gZWxzaWYgKCRhcmcwIGVxICJYY2VwdGlvbjIiKSB7Ci0gICAgbXkgJHN0cnVjdF90aGluZyA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3Qoe3N0cmluZ190aGluZyA9PiAiVGhpcyBpcyBhbiBYY2VwdGlvbjIifSk7Ci0gICAgZGllIG5ldyBUaHJpZnRUZXN0OjpYY2VwdGlvbjIoe2Vycm9yQ29kZSA9PiAyMDAyLCBzdHJ1Y3RfdGhpbmcgPT4gJHN0cnVjdF90aGluZ30pOwotICB9IGVsc2UgewotICAgIHJldHVybiBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KHtzdHJpbmdfdGhpbmcgPT4gJGFyZzF9KTsKKyAgaWYgKCRhcmcwIGVxICdYY2VwdGlvbicpIHsKKyAgICBkaWUgVGhyaWZ0VGVzdDo6WGNlcHRpb24tPm5ldyh7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24nfSk7CisgIH0KKyAgZWxzaWYgKCRhcmcwIGVxICdYY2VwdGlvbjInKSB7CisgICAgbXkgJHN0cnVjdF90aGluZyA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJ30pOworICAgIGRpZSBUaHJpZnRUZXN0OjpYY2VwdGlvbjItPm5ldyh7ZXJyb3JDb2RlID0+IDIwMDIsIHN0cnVjdF90aGluZyA9PiAkc3RydWN0X3RoaW5nfSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJGFyZzF9KTsKICAgfQogfQogCi1zdWIgdGVzdE9uZXdheSgpIHsKK3N1YiB0ZXN0T25ld2F5IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgbXkgJHNsZWVwRm9yID0gc2hpZnQ7Ci0gIHByaW50KCJ0ZXN0T25ld2F5KCRzbGVlcEZvcik6IFNsZWVwaW5nLi4uXG4iKTsKLSAgc2xlZXAgJHNsZWVwRm9yOwotICBwcmludCgidGVzdE9uZXdheSgkc2xlZXBGb3IpOiBkb25lIHNsZWVwaW5nIVxuIik7CisgIG15ICRudW0gPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RPbmV3YXkoJG51bSk6IHJlY2VpdmVkXG4iKTsKIH0KIAorIyMjCisjIyMgVGVzdCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyMjIworCitwYWNrYWdlIFNlY29uZFNlcnZpY2VIYW5kbGVyOworCit1c2UgYmFzZSBxdyggVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZUlmICk7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiA9IHt9OworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBzZWNvbmR0ZXN0U3RyaW5nIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0U3RyaW5nKCR0aGluZylcbiIpOworICByZXR1cm4gcXF8dGVzdFN0cmluZygiJHRoaW5nIil8OworfQogCiAxOwpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvTWFrZWZpbGUuYW0gYi90ZXN0L3BocC9NYWtlZmlsZS5hbQppbmRleCAxMTk3NGRhLi41Mjc2NWVlIDEwMDc1NQotLS0gYS90ZXN0L3BocC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L3BocC9NYWtlZmlsZS5hbQpAQCAtMTcsMTggKzE3LDI5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcGhwIC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHBocDppbmxpbmVkIC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChNS0RJUl9QKSBnZW4tcGhwLWNsYXNzbWFwCisJJChUSFJJRlQpIC1vdXQgZ2VuLXBocC1jbGFzc21hcCAtLWdlbiBwaHAgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAotcHJlY3Jvc3M6IHN0dWJzCitwaHBfZXh0X2RpcjoKKwlta2RpciAtcCBwaHBfZXh0X2RpcgorCWxuIC1zIC4uLy4uLy4uL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbW9kdWxlcy90aHJpZnRfcHJvdG9jb2wuc28gcGhwX2V4dF9kaXIvCisJbG4gLXMgIiQkKHBocC1jb25maWcgLS1leHRlbnNpb24tZGlyKS9qc29uLnNvIiBwaHBfZXh0X2Rpci8KKwlsbiAtcyAiJCQocGhwLWNvbmZpZyAtLWV4dGVuc2lvbi1kaXIpL3NvY2tldHMuc28iIHBocF9leHRfZGlyLwogCi1jaGVjazogc3R1YnMKK3ByZWNyb3NzOiBzdHVicyBwaHBfZXh0X2RpcgorCitjaGVjazogc3R1YnMgcGhwX2V4dF9kaXIKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLXBocCBnZW4tcGhwaQorCSQoUk0pIC1yIGdlbi0qLworCSQoUk0pIC1yIHBocF9leHRfZGlyCiAKLWNsaWVudDogc3R1YnMKK2Rpc3QtaG9vazoKKwkkKFJNKSAtciAkKGRpc3RkaXIpL2dlbi0qLworCSQoUk0pIC1yICQoZGlzdGRpcikvcGhwX2V4dF9kaXIvCisKK2NsaWVudDogc3R1YnMgcGhwX2V4dF9kaXIKIAlwaHAgVGVzdENsaWVudC5waHAKZGlmZiAtLWdpdCBhL3Rlc3QvcGhwL1Rlc3RDbGFzc21hcC5waHAgYi90ZXN0L3BocC9UZXN0Q2xhc3NtYXAucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZDE1OTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BocC9UZXN0Q2xhc3NtYXAucGhwCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworPD9waHAKKyRHRU5fRElSID0gJ2dlbi1waHAtY2xhc3NtYXAnOworaW5jbHVkZV9vbmNlKCdUZXN0Q2xpZW50LnBocCcpOworPz4KZGlmZiAtLWdpdCBhL3Rlc3QvcGhwL1Rlc3RDbGllbnQucGhwIGIvdGVzdC9waHAvVGVzdENsaWVudC5waHAKaW5kZXggY2U1N2RjMC4uYWNkOTAxZCAxMDA3NTUKLS0tIGEvdGVzdC9waHAvVGVzdENsaWVudC5waHAKKysrIGIvdGVzdC9waHAvVGVzdENsaWVudC5waHAKQEAgLTIsNyArMiw4IEBACiAKIG5hbWVzcGFjZSB0ZXN0XHBocDsKIAotcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi9saWIvcGhwL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKKy8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCiskbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKIAogdXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKIApAQCAtMTMsMTAgKzE0LDE0IEBACiAgICRNT0RFID0gJ25vcm1hbCc7CiB9CiAKLSRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKLSRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUaHJpZnQnLCBfX0RJUl9fIC4gJy8uLi8uLi9saWIvcGhwL2xpYicpOwotJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnRUZXN0JywgJEdFTl9ESVIpOwotJGxvYWRlci0+cmVnaXN0ZXIoKTsKKworaWYgKCRHRU5fRElSID09ICdnZW4tcGhwJykgeworICAkbG9hZGVyLT5hZGRQc3I0KCcnLCAkR0VOX0RJUik7Cit9IGVsc2UgeworICAkbG9hZGVyID0gbmV3IFRocmlmdENsYXNzTG9hZGVyKCk7CisgICRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignVGhyaWZ0VGVzdCcsICRHRU5fRElSKTsKKyAgJGxvYWRlci0+cmVnaXN0ZXIoKTsKK30KIAogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTQwLDYgKzQ1LDcgQEAKIC8qKiBJbmNsdWRlIHRoZSBUaHJpZnQgYmFzZSAqLwogLyoqIEluY2x1ZGUgdGhlIHByb3RvY29scyAqLwogdXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkOwogdXNlIFRocmlmdFxQcm90b2NvbFxUQ29tcGFjdFByb3RvY29sOwogdXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOwogCkBAIC01OSw5ICs2NSwxNiBAQAogICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCgkdHJhbnNwb3J0KTsKICAgfSBlbHNlIGlmICgkUFJPVE8gPT0gJ2pzb24nKSB7CiAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKCR0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKCRQUk9UTyA9PSAnYWNjZWwnKSB7CisgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKSkgeworICAgICAgZWNobyAiQWNjZWxlcmF0aW9uIGV4dGVuc2lvbiBpcyBub3QgbG9hZGVkXG4iOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgkdHJhbnNwb3J0KTsKICAgfQogCi0gIGRpZSAoIi0tcHJvdG9jb2wgbXVzdCBiZSBvbmUgb2Yge2JpbmFyeXxjb21wYWN0fGpzb259Iik7CisgIGVjaG8gIi0tcHJvdG9jb2wgbXVzdCBiZSBvbmUgb2Yge2JpbmFyeXxjb21wYWN0fGpzb258YWNjZWx9XG4iOworICBleGl0KDEpOwogfQogCiAkaG9zdCA9ICdsb2NhbGhvc3QnOwpAQCAtODIsNyArOTUsNyBAQAogICAgICRNT0RFID0gc3Vic3RyKCRhcmcsIDEyKTsKICAgfSBlbHNlIGlmIChzdWJzdHIoJGFyZywgMCwgMTEpID09ICctLXByb3RvY29sPScpIHsKICAgICAkUFJPVE8gPSBzdWJzdHIoJGFyZywgMTEpOwotICB9IAorICB9CiB9CiAKICRob3N0cyA9IGFycmF5KCdsb2NhbGhvc3QnKTsKQEAgLTExMCw2ICsxMjMsMTIgQEAKIAogJHN0YXJ0ID0gbWljcm90aW1lKHRydWUpOwogCitkZWZpbmUoJ0VSUl9CQVNFVFlQRVMnLCAxKTsKK2RlZmluZSgnRVJSX1NUUlVDVFMnLCAyKTsKK2RlZmluZSgnRVJSX0NPTlRBSU5FUlMnLCA0KTsKK2RlZmluZSgnRVJSX0VYQ0VQVElPTlMnLCA4KTsKK2RlZmluZSgnRVJSX1VOS05PV04nLCA2NCk7CiskZXhpdGNvZGUgPSAwOwogLyoqCiAgKiBWT0lEIFRFU1QKICAqLwpAQCAtMTE3LDQwICsxMzYsNTMgQEAKICR0ZXN0Q2xpZW50LT50ZXN0Vm9pZCgpOwogcHJpbnRfcigiID0gdm9pZFxuIik7CiAKK2Z1bmN0aW9uIHJvdW5kdHJpcCgkdGVzdENsaWVudCwgJG1ldGhvZCwgJHZhbHVlKSB7CisgIGdsb2JhbCAkZXhpdGNvZGU7CisgIHByaW50X3IoIiRtZXRob2QoJHZhbHVlKSIpOworICAkcmV0ID0gJHRlc3RDbGllbnQtPiRtZXRob2QoJHZhbHVlKTsKKyAgcHJpbnRfcigiID0gXCIkcmV0XCJcbiIpOworICBpZiAoJHZhbHVlICE9PSAkcmV0KSB7CisgICAgcHJpbnRfcigiKioqIEZBSUxFRCAqKipcbiIpOworICAgICRleGl0Y29kZSB8PSBFUlJfQkFTRVRZUEVTOworICB9Cit9CisKIC8qKgogICogU1RSSU5HIFRFU1QKICAqLwotcHJpbnRfcigidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKLSRzID0gJHRlc3RDbGllbnQtPnRlc3RTdHJpbmcoIlRlc3QiKTsKLXByaW50X3IoIiA9IFwiJHNcIlxuIik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0U3RyaW5nJywgIlRlc3QiKTsKKworLyoqCisgKiBCT09MIFRFU1QKKyAqLworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJvb2wnLCB0cnVlKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCb29sJywgZmFsc2UpOwogCiAvKioKICAqIEJZVEUgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0Qnl0ZSgxKSIpOwotJHU4ID0gJHRlc3RDbGllbnQtPnRlc3RCeXRlKDEpOwotcHJpbnRfcigiID0gJHU4XG4iKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCeXRlJywgMSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qnl0ZScsIC0xKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCeXRlJywgMTI3KTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCeXRlJywgLTEyOCk7CiAKIC8qKgogICogSTMyIFRFU1QKICAqLwotcHJpbnRfcigidGVzdEkzMigtMSkiKTsKLSRpMzIgPSAkdGVzdENsaWVudC0+dGVzdEkzMigtMSk7Ci1wcmludF9yKCIgPSAkaTMyXG4iKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJMzInLCAtMSk7CiAKIC8qKgogICogSTY0IFRFU1QKICAqLwotcHJpbnRfcigidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7Ci0kaTY0ID0gJHRlc3RDbGllbnQtPnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKLXByaW50X3IoIiA9ICRpNjRcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEk2NCcsIDApOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEk2NCcsIDEpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEk2NCcsIC0xKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAtMzQzNTk3MzgzNjgpOwogCiAvKioKICAqIERPVUJMRSBURVNUCiAgKi8KLXByaW50X3IoInRlc3REb3VibGUoLTg1Mi4yMzQyMzQyMzQpIik7Ci0kZHViID0gJHRlc3RDbGllbnQtPnRlc3REb3VibGUoLTg1Mi4yMzQyMzQyMzQpOwotcHJpbnRfcigiID0gJGR1YlxuIik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0RG91YmxlJywgLTg1Mi4yMzQyMzQyMzQpOwogCiAvKioKICAqIEJJTkFSWSBURVNUICAtLSAgVE9ETwpAQCAtMTcxLDYgKzIwMywxMSBAQAogICAgICAgICAkaW4tPmkzMl90aGluZy4iLCAiLgogICAgICAgICAkaW4tPmk2NF90aGluZy4ifVxuIik7CiAKK2lmICgkaW4gIT0gJG91dCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfQorCiAvKioKICAqIE5FU1RFRCBTVFJVQ1QgVEVTVAogICovCkBAIC0xODgsNiArMjI1LDExIEBACiAgICAgICAgICRpbi0+aTY0X3RoaW5nLiJ9LCAiLgogICAgICAgICAkaW4yLT5pMzJfdGhpbmcuIn1cbiIpOwogCitpZiAoJGluMiAhPSAkb3V0MikgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfQorCiAvKioKICAqIE1BUCBURVNUCiAgKi8KQEAgLTIyMCwzNiArMjYyLDY5IEBACiB9CiBwcmludF9yKCJ9XG4iKTsKIAoraWYgKCRtYXBpbiAhPSAkbWFwb3V0KSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CisKKyRtYXBvdXQgPSBhcnJheSgpOworZm9yICgkaSA9IDA7ICRpIDwgMTA7ICRpKyspIHsKKyAgICAkbWFwb3V0WyJrZXkkaSJdID0gInZhbCRpIjsKK30KK3ByaW50X3IoJ3Rlc3RTdHJpbmdNYXAoeycpOworJGZpcnN0ID0gdHJ1ZTsKK2ZvcmVhY2ggKCRtYXBvdXQgYXMgJGtleSA9PiAkdmFsKSB7CisgIGlmICgkZmlyc3QpIHsKKyAgICAkZmlyc3QgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBwcmludF9yKCIsICIpOworICB9CisgIHByaW50X3IoIlwiJGtleVwiID0+IFwiJHZhbFwiIik7Cit9CitwcmludF9yKCJ9KSIpOworJG1hcGluID0gJHRlc3RDbGllbnQtPnRlc3RTdHJpbmdNYXAoJG1hcG91dCk7CitwcmludF9yKCIgPSB7Iik7CiskZmlyc3QgPSB0cnVlOworZm9yZWFjaCAoJG1hcGluIGFzICRrZXkgPT4gJHZhbCkgeworICBpZiAoJGZpcnN0KSB7CisgICAgJGZpcnN0ID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgcHJpbnRfcigiLCAiKTsKKyAgfQorICBwcmludF9yKCJcIiRrZXlcIiA9PiBcIiR2YWxcIiIpOworfQorcHJpbnRfcigifVxuIik7Citrc29ydCgkbWFwaW4pOworaWYgKCRtYXBpbiAhPSAkbWFwb3V0KSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CisKIC8qKgogICogU0VUIFRFU1QKICAqLwogJHNldG91dCA9IGFycmF5KCk7OwogZm9yICgkaSA9IC0yOyAkaSA8IDM7ICsrJGkpIHsKLSAgJHNldG91dCBbXT0gJGk7CisgICRzZXRvdXRbJGldPSB0cnVlOwogfQogcHJpbnRfcigidGVzdFNldCh7Iik7Ci0kZmlyc3QgPSB0cnVlOwotZm9yZWFjaCAoJHNldG91dCBhcyAkdmFsKSB7Ci0gIGlmICgkZmlyc3QpIHsKLSAgICAkZmlyc3QgPSBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBwcmludF9yKCIsICIpOwotICB9Ci0gIHByaW50X3IoJHZhbCk7Ci19CitlY2hvIGltcGxvZGUoJywnLCBhcnJheV9rZXlzKCRzZXRvdXQpKTsKIHByaW50X3IoIn0pIik7CiAkc2V0aW4gPSAkdGVzdENsaWVudC0+dGVzdFNldCgkc2V0b3V0KTsKIHByaW50X3IoIiA9IHsiKTsKLSRmaXJzdCA9IHRydWU7Ci1mb3JlYWNoICgkc2V0aW4gYXMgJHZhbCkgewotICBpZiAoJGZpcnN0KSB7Ci0gICAgJGZpcnN0ID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRfcigiLCAiKTsKLSAgfQotICBwcmludF9yKCR2YWwpOwotfQorZWNobyBpbXBsb2RlKCcsICcsIGFycmF5X2tleXMoJHNldGluKSk7CiBwcmludF9yKCJ9XG4iKTsKKy8vIE9yZGVyIG9mIGtleXMgaW4gc2V0IGRvZXMgbm90IG1hdHRlcgora3NvcnQoJHNldGluKTsKK2lmICgkc2V0b3V0ICE9PSAkc2V0aW4pIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKK30KKy8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgY29ycnVwdGVkIGFycmF5CitpZiAoJHNldGluWzJdICE9PSAkc2V0b3V0WzJdIHx8IGlzX2ludCgkc2V0aW5bMl0pKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CiAKIC8qKgogICogTElTVCBURVNUCkBAIC0yODEsNiArMzU2LDEwIEBACiAgIHByaW50X3IoJHZhbCk7CiB9CiBwcmludF9yKCJ9XG4iKTsKK2lmICgkbGlzdGluICE9PSAkbGlzdG91dCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQogCiAvKioKICAqIEVOVU0gVEVTVApAQCAtMjg4LDIyICszNjcsNDIgQEAKIHByaW50X3IoInRlc3RFbnVtKE9ORSkiKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oXFRocmlmdFRlc3RcTnVtYmVyejo6T05FKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6T05FKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKFRXTykiKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oXFRocmlmdFRlc3RcTnVtYmVyejo6VFdPKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6VFdPKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKFRIUkVFKSIpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpUSFJFRSk7CiBwcmludF9yKCIgPSAkcmV0XG4iKTsKK2lmICgkcmV0ICE9IFxUaHJpZnRUZXN0XE51bWJlcno6OlRIUkVFKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKEZJVkUpIik7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OkZJVkUpOwogcHJpbnRfcigiID0gJHJldFxuIik7CitpZiAoJHJldCAhPSBcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpGSVZFKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKEVJR0hUKSIpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpFSUdIVCk7CiBwcmludF9yKCIgPSAkcmV0XG4iKTsKK2lmICgkcmV0ICE9IFxUaHJpZnRUZXN0XE51bWJlcno6OkVJR0hUKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIC8qKgogICogVFlQRURFRiBURVNUCkBAIC0zMTEsNiArNDEwLDEwIEBACiBwcmludF9yKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CiAkdWlkID0gJHRlc3RDbGllbnQtPnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMyk7CiBwcmludF9yKCIgPSAkdWlkXG4iKTsKK2lmICgkdWlkICE9PSAzMDk4NTgyMzUwODI1MjMpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogLyoqCiAgKiBORVNURUQgTUFQIFRFU1QKQEAgLTMyNiw2ICs0MjksMTQgQEAKICAgcHJpbnRfcigifSwgIik7CiB9CiBwcmludF9yKCJ9XG4iKTsKKyRleHBlY3RlZF9tbSA9IFsKKyAgLTQgPT4gWy00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xXSwKKyAgNCA9PiBbNCA9PiA0LCAzID0+IDMsIDIgPT4gMiwgMSA9PiAxXSwKK107CitpZiAoJG1tICE9ICRleHBlY3RlZF9tbSkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQogCiAvKioKICAqIElOU0FOSVRZIFRFU1QKQEAgLTM3NywxMCArNDg4LDI5IEBACiB0cnkgewogICAkdGVzdENsaWVudC0+dGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKICAgcHJpbnRfcigiICB2b2lkXG5GQUlMVVJFXG4iKTsKKyAgJGV4aXRjb2RlIHw9IEVSUl9FWENFUFRJT05TOwogfSBjYXRjaCAoXFRocmlmdFRlc3RcWGNlcHRpb24gJHgpIHsKICAgcHJpbnRfcignIGNhdWdodCB4Y2VwdGlvbiAnLiR4LT5lcnJvckNvZGUuJzogJy4keC0+bWVzc2FnZS4iXG4iKTsKIH0KIAorLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBUSFJJRlQtNDI2MworcHJpbnRfcigidGVzdEJpbmFyeVNlcmlhbGl6ZXJfRGVzZXJpYWxpemUoJ2ZvbycpIik7Cit0cnkgeworICBcVGhyaWZ0XFNlcmlhbGl6ZXJcVEJpbmFyeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKGJhc2U2NF9kZWNvZGUoJ2ZvbycpLCBcVGhyaWZ0VGVzdFxYdHJ1Y3QyOjpjbGFzcyk7CisgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30gY2F0Y2ggKFxUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb24gJGhhcHB5X2V4Y2VwdGlvbikgeworICAvLyBXZSBleHBlY3RlZCB0aGlzIGR1ZSB0byBiaW5hcnkgZGF0YSBvZiBiYXNlNjRfZGVjb2RlKCdmb28nKSBpcyBsZXNzIHRoZW4gNAorICAvLyBieXRlcyBhbmQgaXQgdHJpZXMgdG8gZmluZCB0aHJpZnQgdmVyc2lvbiBudW1iZXIgaW4gdGhlIHRyYW5zcG9ydCBieQorICAvLyByZWFkaW5nIGkzMigpIGF0IHRoZSBiZWdpbm5pbmcuICBDYXN0aW5nIHRvIHN0cmluZyB2YWxpZGF0ZXMgdGhhdAorICAvLyBleGNlcHRpb24gaXMgc3RpbGwgYWNjZXNzaWJsZSBpbiBtZW1vcnkgYW5kIG5vdCBjb3JydXB0ZWQuICBXaXRob3V0IHBhdGNoLAorICAvLyBQSFAgd2lsbCBlcnJvciBsb2cgdGhhdCB0aGUgZXhjZXB0aW9uIGRvZXNuJ3QgaGF2ZSBhbnkgdG9zdHJpbmcgbWV0aG9kLAorICAvLyB3aGljaCBpcyBhIGxpZSBkdWUgdG8gY29ycnVwdGVkIG1lbW9yeS4KKyAgZm9yKCRpPTk5OyAkaSA+IDA7ICRpLS0pIHsKKyAgICAoc3RyaW5nKSRoYXBweV9leGNlcHRpb247CisgIH0KKyAgcHJpbnRfcigiICBTVUNDRVNTXG4iKTsKK30KIAogLyoqCiAgKiBOb3JtYWwgdGVzdHMgZG9uZS4KQEAgLTM5NCwzNCArNTI0LDM0IEBACiAgKiBFeHRyYW5lb3VzICJJIGRvbid0IHRydXN0IFBIUCB0byBwYWNrL3VucGFjayBpbnRlZ2VyIiB0ZXN0cwogICovCiAKK2lmICgkcHJvdG9jb2wgaW5zdGFuY2VvZiBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgeworICAgIC8vIFJlZ3Jlc3Npb24gY2hlY2s6IGNoZWNrIHRoYXQgbWV0aG9kIG5hbWUgaXMgbm90IGRvdWJsZS1mcmVlZAorICAgIC8vIE1ldGhvZCBuYW1lIHNob3VsZCBub3QgYmUgYW4gaW50ZXJuZWQgc3RyaW5nLgorICAgICRtZXRob2RfbmFtZSA9ICJWb2lkIjsKKyAgICAkbWV0aG9kX25hbWUgPSAidGVzdCRtZXRob2RfbmFtZSI7CisKKyAgICAkc2VxaWQgPSAwOworICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFZvaWRfYXJncygpOworICAgIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoJHByb3RvY29sLCAkbWV0aG9kX25hbWUsIFxUaHJpZnRcVHlwZVxUTWVzc2FnZVR5cGU6OkNBTEwsICRhcmdzLCAkc2VxaWQsICRwcm90b2NvbC0+aXNTdHJpY3RXcml0ZSgpKTsKKyAgICAkdGVzdENsaWVudC0+cmVjdl90ZXN0Vm9pZCgpOworCit9CisKIC8vIE1heCBJMzIKICRudW0gPSBwb3coMiwgMzApICsgKHBvdygyLCAzMCkgLSAxKTsKLSRudW0yID0gJHRlc3RDbGllbnQtPnRlc3RJMzIoJG51bSk7Ci1pZiAoJG51bSAhPSAkbnVtMikgewotICBwcmludCAiTWlzc2VkICRudW0gPSAkbnVtMlxuIjsKLX0KK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJMzInLCAkbnVtKTsKIAogLy8gTWluIEkzMgogJG51bSA9IDAgLSBwb3coMiwgMzEpOwotJG51bTIgPSAkdGVzdENsaWVudC0+dGVzdEkzMigkbnVtKTsKLWlmICgkbnVtICE9ICRudW0yKSB7Ci0gIHByaW50ICJNaXNzZWQgJG51bSA9ICRudW0yXG4iOwotfQorcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEkzMicsICRudW0pOwogCiAvLyBNYXggSTY0CiAkbnVtID0gcG93KDIsIDYyKSArIChwb3coMiwgNjIpIC0gMSk7Ci0kbnVtMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STY0KCRudW0pOwotaWYgKCRudW0gIT0gJG51bTIpIHsKLSAgcHJpbnQgIk1pc3NlZCAkbnVtID0gJG51bTJcbiI7Ci19Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgJG51bSk7CiAKIC8vIE1pbiBJNjQKLSRudW0gPSAwIC0gcG93KDIsIDYzKTsKLSRudW0yID0gJHRlc3RDbGllbnQtPnRlc3RJNjQoJG51bSk7Ci1pZiAoJG51bSAhPSAkbnVtMikgewotICBwcmludCAiTWlzc2VkICRudW0gPSAkbnVtMlxuIjsKLX0KKyRudW0gPSAwIC0gcG93KDIsIDYyKSAtIHBvdygyLCA2Mik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgJG51bSk7CiAKICR0cmFuc3BvcnQtPmNsb3NlKCk7Ci1yZXR1cm47Ci0KK2V4aXQoJGV4aXRjb2RlKTsKZGlmZiAtLWdpdCBhL3Rlc3QvcGhwL3Rlc3RfcGhwLmluaSBiL3Rlc3QvcGhwL3Rlc3RfcGhwLmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWI2N2NiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9waHAvdGVzdF9waHAuaW5pCkBAIC0wLDAgKzEsMyBAQAorZXh0ZW5zaW9uPXRocmlmdF9wcm90b2NvbC5zbworZXh0ZW5zaW9uPWpzb24uc28KK2V4dGVuc2lvbj1zb2NrZXRzLnNvCmRpZmYgLS1naXQgYS90ZXN0L3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0gYi90ZXN0L3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KaW5kZXggYThlNjgwYS4uZTk2MmYwYyAxMDA2NDQKLS0tIGEvdGVzdC9weS50b3JuYWRvL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcHkudG9ybmFkby9NYWtlZmlsZS5hbQpAQCAtMjcsNCArMjcsMTIgQEAKIAkuL3Rlc3Rfc3VpdGUucHkKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLXB5LnRvcm5hZG8KKwkkKFJNKSAtciBidWlsZAorCWZpbmQgLiAtdHlwZSBmIFwoIC1pbmFtZSAiKi5weWMiIFwpIHwgeGFyZ3Mgcm0gLWYKKwlmaW5kIC4gLXR5cGUgZCBcKCAtaW5hbWUgIl9fcHljYWNoZV9fIiAtb3IgLWluYW1lICJfdHJpYWxfdGVtcCIgXCkgfCB4YXJncyBybSAtcmYKKwkkKFJNKSAtciBnZW4tcHkqLworCitkaXN0LWhvb2s6CisJZmluZCAkKGRpc3RkaXIpIC10eXBlIGYgXCggLWluYW1lICIqLnB5YyIgXCkgfCB4YXJncyBybSAtZgorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIFwoIC1pbmFtZSAiX19weWNhY2hlX18iIC1vciAtaW5hbWUgIl90cmlhbF90ZW1wIiBcKSB8IHhhcmdzIHJtIC1yZgorCSQoUk0pIC1yICQoZGlzdGRpcikvZ2VuLXB5Ki8KZGlmZiAtLWdpdCBhL3Rlc3QvcHkudG9ybmFkby9zZXR1cC5jZmcgYi90ZXN0L3B5LnRvcm5hZG8vc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTg3YzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5LnRvcm5hZG8vc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMyBAQAorW2ZsYWtlOF0KK2lnbm9yZSA9IEU0MDIKK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvdGVzdC9weS50b3JuYWRvL3Rlc3Rfc3VpdGUucHkgYi90ZXN0L3B5LnRvcm5hZG8vdGVzdF9zdWl0ZS5weQppbmRleCBiNjNlYTJkLi40NDdmZGU2IDEwMDc1NQotLS0gYS90ZXN0L3B5LnRvcm5hZG8vdGVzdF9zdWl0ZS5weQorKysgYi90ZXN0L3B5LnRvcm5hZG8vdGVzdF9zdWl0ZS5weQpAQCAtMjEsMzAgKzIxLDMwIEBACiAKIGltcG9ydCBkYXRldGltZQogaW1wb3J0IGdsb2IKLWltcG9ydCBzeXMKIGltcG9ydCBvcworaW1wb3J0IHN5cwogaW1wb3J0IHRpbWUKIGltcG9ydCB1bml0dGVzdAogCiBiYXNlcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQotc3lzLnBhdGguaW5zZXJ0KDAsIGJhc2VwYXRoKycvZ2VuLXB5LnRvcm5hZG8nKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oYmFzZXBhdGgsICcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKSlbMF0pCitzeXMucGF0aC5pbnNlcnQoMCwgYmFzZXBhdGggKyAnL2dlbi1weS50b3JuYWRvJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGJhc2VwYXRoLCAnLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKSlbMF0pCiAKIHRyeToKICAgICBfX2ltcG9ydF9fKCd0b3JuYWRvJykKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBwcmludCAibW9kdWxlIGB0b3JuYWRvYCBub3QgZm91bmQsIHNraXBwaW5nIHRlc3QiCisgICAgcHJpbnQoIm1vZHVsZSBgdG9ybmFkb2Agbm90IGZvdW5kLCBza2lwcGluZyB0ZXN0IikKICAgICBzeXMuZXhpdCgwKQogCiBmcm9tIHRvcm5hZG8gaW1wb3J0IGdlbgogZnJvbSB0b3JuYWRvLnRlc3RpbmcgaW1wb3J0IEFzeW5jVGVzdENhc2UsIGdldF91bnVzZWRfcG9ydCwgZ2VuX3Rlc3QKIAogZnJvbSB0aHJpZnQgaW1wb3J0IFRUb3JuYWRvCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KIAogZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0Ci1mcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAqCitmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCBYY2VwdGlvbiwgWHRydWN0CiAKIAogY2xhc3MgVGVzdEhhbmRsZXIob2JqZWN0KToKQEAgLTU1LDYgKzU1LDggQEAKICAgICAgICAgcGFzcwogCiAgICAgZGVmIHRlc3RTdHJpbmcoc2VsZiwgcyk6CisgICAgICAgIGlmIHMgPT0gJ3VuZXhwZWN0ZWRfZXJyb3InOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKHMpCiAgICAgICAgIHJldHVybiBzCiAKICAgICBkZWYgdGVzdEJ5dGUoc2VsZiwgYik6CkBAIC04NSw3ICs4Nyw3IEBACiAgICAgICAgICAgICB4Lm1lc3NhZ2UgPSBzCiAgICAgICAgICAgICByYWlzZSB4CiAgICAgICAgIGVsaWYgcyA9PSAndGhyb3dfdW5kZWNsYXJlZCc6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmb28iKQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndGVzdGluZyB1bmRlY2xhcmVkIGV4Y2VwdGlvbicpCiAKICAgICBkZWYgdGVzdE9uZXdheShzZWxmLCBzZWNvbmRzKToKICAgICAgICAgc3RhcnQgPSB0aW1lLnRpbWUoKQpAQCAtOTcsNiArOTksNyBAQAogICAgICAgICBzZWxmLnRlc3RfaW5zdGFuY2UuaW9fbG9vcC5hZGRfdGltZW91dCgKICAgICAgICAgICAgIGRhdGV0aW1lLnRpbWVkZWx0YShzZWNvbmRzPXNlY29uZHMpLAogICAgICAgICAgICAgZmlyZV9vbmV3YXkpCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigndGVzdGluZyBleGNlcHRpb24gaW4gb25ld2F5IG1ldGhvZCcpCiAKICAgICBkZWYgdGVzdE5lc3Qoc2VsZiwgdGhpbmcpOgogICAgICAgICByZXR1cm4gdGhpbmcKQEAgLTE4NywxMCArMTkwLDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5pMzJfdGhpbmcsIC0zKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuaTY0X3RoaW5nLCAtNSkKIAorICAgIEBnZW5fdGVzdAogICAgIGRlZiB0ZXN0X29uZXdheShzZWxmKToKLSAgICAgICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgwLjUpCi0gICAgICAgIHN0YXJ0LCBlbmQsIHNlY29uZHMgPSBzZWxmLndhaXQodGltZW91dD0xKQotICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFscyhzZWNvbmRzLCAoZW5kIC0gc3RhcnQpLCBwbGFjZXM9MykKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKQorICAgICAgICB2ID0geWllbGQgc2VsZi5jbGllbnQudGVzdEkzMigtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCAtMSkKIAogICAgIEBnZW5fdGVzdAogICAgIGRlZiB0ZXN0X21hcChzZWxmKToKQEAgLTIwMyw4ICsyMDcsNiBAQAogCiAgICAgQGdlbl90ZXN0CiAgICAgZGVmIHRlc3RfZXhjZXB0aW9uKHNlbGYpOgotICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKLQogICAgICAgICB0cnk6CiAgICAgICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCiAgICAgICAgIGV4Y2VwdCBYY2VwdGlvbiBhcyBleDoKQEAgLTIxNCwxMSArMjE2LDEzIEBACiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCd0aHJvd191bmRlY2xhcmVkJykKLSAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnRFeGNlcHRpb24gYXMgZXg6CisgICAgICAgIGV4Y2VwdCBUQXBwbGljYXRpb25FeGNlcHRpb246CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQogCisgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQorCiAKIGRlZiBzdWl0ZSgpOgogICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkudHdpc3RlZC9NYWtlZmlsZS5hbSBiL3Rlc3QvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQppbmRleCA1MDIwMjE1Li5kZWU4ZTJmIDEwMDY0NAotLS0gYS90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9weS50d2lzdGVkL01ha2VmaWxlLmFtCkBAIC0xNyw3ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorVFJJQUwgPz0gdHJpYWwKIAogc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0IC4uL1NtYWxsVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcHk6dHdpc3RlZCAuLi9UaHJpZnRUZXN0LnRocmlmdApAQCAtMjcsNCArMjcsMTIgQEAKIAkkKFRSSUFMKSAuL3Rlc3Rfc3VpdGUucHkKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLXB5LnR3aXN0ZWQKKwkkKFJNKSAtciBidWlsZAorCWZpbmQgLiAtdHlwZSBmIFwoIC1pbmFtZSAiKi5weWMiIFwpIHwgeGFyZ3Mgcm0gLWYKKwlmaW5kIC4gLXR5cGUgZCBcKCAtaW5hbWUgIl9fcHljYWNoZV9fIiAtb3IgLWluYW1lICJfdHJpYWxfdGVtcCIgXCkgfCB4YXJncyBybSAtcmYKKwkkKFJNKSAtciBnZW4tcHkqLworCitkaXN0LWhvb2s6CisJZmluZCAkKGRpc3RkaXIpIC10eXBlIGYgXCggLWluYW1lICIqLnB5YyIgXCkgfCB4YXJncyBybSAtZgorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIFwoIC1pbmFtZSAiX19weWNhY2hlX18iIC1vciAtaW5hbWUgIl90cmlhbF90ZW1wIiBcKSB8IHhhcmdzIHJtIC1yZgorCSQoUk0pIC1yICQoZGlzdGRpcikvZ2VuLXB5Ki8KZGlmZiAtLWdpdCBhL3Rlc3QvcHkudHdpc3RlZC9zZXR1cC5jZmcgYi90ZXN0L3B5LnR3aXN0ZWQvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTg3YzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5LnR3aXN0ZWQvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMyBAQAorW2ZsYWtlOF0KK2lnbm9yZSA9IEU0MDIKK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkgYi90ZXN0L3B5LnR3aXN0ZWQvdGVzdF9zdWl0ZS5weQppbmRleCAwNDhhYmM1Li4wMmViN2YxIDEwMDc1NQotLS0gYS90ZXN0L3B5LnR3aXN0ZWQvdGVzdF9zdWl0ZS5weQorKysgYi90ZXN0L3B5LnR3aXN0ZWQvdGVzdF9zdWl0ZS5weQpAQCAtMTksMTEgKzE5LDE3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBvcywgZ2xvYiwgdGltZQoraW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKKwogYmFzZXBhdGggPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4oYmFzZXBhdGgsICdnZW4tcHkudHdpc3RlZCcpKQogc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oYmFzZXBhdGgsICcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKSlbMF0pCiAKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uCisKIGZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdAogZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgWGNlcHRpb24sIFh0cnVjdAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHdpc3RlZApAQCAtMzMsMTEgKzM5LDExIEBACiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IGRlZmVyLCByZWFjdG9yCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQucHJvdG9jb2wgaW1wb3J0IENsaWVudENyZWF0b3IKIAotZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50cworZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50ZXIKIAorCitAaW1wbGVtZW50ZXIoVGhyaWZ0VGVzdC5JZmFjZSkKIGNsYXNzIFRlc3RIYW5kbGVyOgotICAgIGltcGxlbWVudHMoVGhyaWZ0VGVzdC5JZmFjZSkKLQogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgc2VsZi5vbmV3YXlzUXVldWUgPSBkZWZlci5EZWZlcnJlZFF1ZXVlKCkKIApAQCAtODEsNiArODcsNyBAQAogICAgICAgICBkZWYgZmlyZU9uZXdheSh0KToKICAgICAgICAgICAgIHNlbGYub25ld2F5c1F1ZXVlLnB1dCgodCwgdGltZS50aW1lKCksIHNlY29uZHMpKQogICAgICAgICByZWFjdG9yLmNhbGxMYXRlcihzZWNvbmRzLCBmaXJlT25ld2F5LCB0aW1lLnRpbWUoKSkKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCcnKQogCiAgICAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKICAgICAgICAgcmV0dXJuIHRoaW5nCkBAIC0xMDAsNiArMTA3LDcgQEAKICAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZiwgdGhpbmcpOgogICAgICAgICByZXR1cm4gdGhpbmcKIAorCiBjbGFzcyBUaHJpZnRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCkBAIC0xMDgsMTYgKzExNiwxNSBAQAogICAgICAgICBzZWxmLnByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKHNlbGYuaGFuZGxlcikKICAgICAgICAgc2VsZi5wZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKIAotICAgICAgICBzZWxmLnNlcnZlciA9IHJlYWN0b3IubGlzdGVuVENQKDAsCi0gICAgICAgICAgICBUVHdpc3RlZC5UaHJpZnRTZXJ2ZXJGYWN0b3J5KHNlbGYucHJvY2Vzc29yLAotICAgICAgICAgICAgc2VsZi5wZmFjdG9yeSksIGludGVyZmFjZT0iMTI3LjAuMC4xIikKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSByZWFjdG9yLmxpc3RlblRDUCgKKyAgICAgICAgICAgIDAsIFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3Rvcnkoc2VsZi5wcm9jZXNzb3IsIHNlbGYucGZhY3RvcnkpLCBpbnRlcmZhY2U9IjEyNy4wLjAuMSIpCiAKICAgICAgICAgc2VsZi5wb3J0Tm8gPSBzZWxmLnNlcnZlci5nZXRIb3N0KCkucG9ydAogCiAgICAgICAgIHNlbGYudHhjbGllbnQgPSB5aWVsZCBDbGllbnRDcmVhdG9yKHJlYWN0b3IsCi0gICAgICAgICAgICBUVHdpc3RlZC5UaHJpZnRDbGllbnRQcm90b2NvbCwKLSAgICAgICAgICAgIFRocmlmdFRlc3QuQ2xpZW50LAotICAgICAgICAgICAgc2VsZi5wZmFjdG9yeSkuY29ubmVjdFRDUCgiMTI3LjAuMC4xIiwgc2VsZi5wb3J0Tm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUd2lzdGVkLlRocmlmdENsaWVudFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUZXN0LkNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wZmFjdG9yeSkuY29ubmVjdFRDUCgiMTI3LjAuMC4xIiwgc2VsZi5wb3J0Tm8pCiAgICAgICAgIHNlbGYuY2xpZW50ID0gc2VsZi50eGNsaWVudC5jbGllbnQKIAogICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKQEAgLTE2OCwyMiArMTc1LDI0IEBACiAKICAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCiAgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZik6Ci0gICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQotICAgICAgICBleGNlcHQgWGNlcHRpb24sIHg6CisgICAgICAgIGV4Y2VwdCBYY2VwdGlvbiBhcyB4OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5lcnJvckNvZGUsIDEwMDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4Lm1lc3NhZ2UsICdYY2VwdGlvbicpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbigidGhyb3dfdW5kZWNsYXJlZCIpCi0gICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKQotICAgICAgICBleGNlcHQgRXhjZXB0aW9uOiAjIHR5cGUgaXMgdW5kZWZpbmVkCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOgogICAgICAgICAgICAgcGFzcwogCisgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQorCiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwogICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYpOgogICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpCiAgICAgICAgIHN0YXJ0LCBlbmQsIHNlY29uZHMgPSB5aWVsZCBzZWxmLmhhbmRsZXIub25ld2F5c1F1ZXVlLmdldCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKHNlY29uZHMsIChlbmQgLSBzdGFydCksIHBsYWNlcz0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdEkzMigtMSkpLCAtMSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvQ01ha2VMaXN0cy50eHQgYi90ZXN0L3B5L0NNYWtlTGlzdHMudHh0Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNmM5MDdiZi4uZmJjMjIxNwotLS0gYS90ZXN0L3B5L0NNYWtlTGlzdHMudHh0CisrKyBiL3Rlc3QvcHkvQ01ha2VMaXN0cy50eHQKQEAgLTE3LDMyICsxNywxOCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAorYWRkX3Rlc3QoTkFNRSBweXRob25fdGVzdF9nZW5lcmF0ZQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfQorICAgICAgICAgICAgLURUSFJJRlRDT01QSUxFUj0kPFRBUkdFVF9GSUxFOnRocmlmdC1jb21waWxlcj4KKyAgICAgICAgICAgIC1ETVlfUFJPSkVDVF9ESVI9JHtQUk9KRUNUX1NPVVJDRV9ESVJ9CisgICAgICAgICAgICAtRE1ZX0NVUlJFTlRfU09VUkNFX0RJUj0ke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICAgICAgICAgIC1ETVlfQ1VSUkVOVF9CSU5BUllfRElSPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorICAgIC1QICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9nZW5lcmF0ZS5jbWFrZQorKQorCiBhZGRfdGVzdChOQU1FIHB5dGhvbl90ZXN0Ci0gICAgQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vUnVuQ2xpZW50U2VydmVyLnB5Ci0gICAgREVQRU5EUyBnZW4tcHktZGVmYXVsdC9UaHJpZnRUZXN0L1RocmlmdFRlc3QucHkKKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9SdW5DbGllbnRTZXJ2ZXIucHkgLS1nZW4tYmFzZT0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIHB5dGhvbl90ZXN0X2dlbmVyYXRlCiAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CiApCiAKLWFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLXB5LWRlZmF1bHQvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LnB5Ci0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gZ2VuLXB5LWRlZmF1bHQgLW91dCBnZW4tcHktZGVmYXVsdCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotKQotCi1hZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1weS1zbG90cy9UaHJpZnRUZXN0L1RocmlmdFRlc3QucHkKLSAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiBweTpzbG90cyAtb3V0IGdlbi1weS1zbG90cyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotKQotCi1hZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1weS1uZXdzdHlsZS9UaHJpZnRUZXN0L1RocmlmdFRlc3QucHkKLSAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiBweTpuZXdfc3R5bGUgLW91dCBnZW4tcHktbmV3c3R5bGUgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLSkKLQotYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tcHktbmV3c3R5bGVzbG90cy9UaHJpZnRUZXN0L1RocmlmdFRlc3QucHkKLSAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiBweTpuZXdfc3R5bGUsc2xvdHMgLW91dCBnZW4tcHktbmV3c3R5bGVzbG90cyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotKQotCi1hZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1weS1keW5hbWljL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5weQotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIHB5OmR5bmFtaWMgLW91dCBnZW4tcHktZHluYW1pYyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotKQotCi1hZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1weS1keW5hbWljc2xvdHMvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LnB5Ci0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gcHk6ZHluYW1pYyxzbG90cyAtb3V0IGdlbi1weS1keW5hbWljc2xvdHMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvRmFzdGJpbmFyeVRlc3QucHkgYi90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1YzBiYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5CkBAIC0wLDAgKzEsMjU2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3IiIiIKK1BZVEhPTlBBVEg9Li9nZW4tcHk6Li4vLi4vbGliL3B5L2J1aWxkL2xpYi4uLiAuL0Zhc3RiaW5hcnlUZXN0LnB5CisiIiIKKworIyBUT0RPKGRyZWlzcyk6IFRlc3QgZXJyb3IgY2FzZXMuICBDaGVjayBmb3IgbWVtb3J5IGxlYWtzLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCBtYXRoCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1laXQKKworZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQorZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAorCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkCisKK2Zyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IFNydgorZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0IEJhY2t3YXJkcywgQm9uaywgRW1wdHksIEhvbHlNb2xleSwgT25lT2ZFYWNoLCBSYW5kb21TdHVmZiwgV3JhcHBlcgorCisKK2NsYXNzIFREZXZOdWxsVHJhbnNwb3J0KFRUcmFuc3BvcnQuVFRyYW5zcG9ydEJhc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitvb2UxID0gT25lT2ZFYWNoKCkKK29vZTEuaW1fdHJ1ZSA9IFRydWUKK29vZTEuaW1fZmFsc2UgPSBGYWxzZQorb29lMS5hX2JpdGUgPSAweGQ2Citvb2UxLmludGVnZXIxNiA9IDI3MDAwCitvb2UxLmludGVnZXIzMiA9IDEgPDwgMjQKK29vZTEuaW50ZWdlcjY0ID0gNjAwMCAqIDEwMDAgKiAxMDAwCitvb2UxLmRvdWJsZV9wcmVjaXNpb24gPSBtYXRoLnBpCitvb2UxLnNvbWVfY2hhcmFjdGVycyA9ICJEZWJ1ZyBUSElTISIKK29vZTEuem9tZ191bmljb2RlID0gdSJceGQ3XG5cYVx0IgorCitvb2UyID0gT25lT2ZFYWNoKCkKK29vZTIuaW50ZWdlcjE2ID0gMTYKK29vZTIuaW50ZWdlcjMyID0gMzIKK29vZTIuaW50ZWdlcjY0ID0gNjQKK29vZTIuZG91YmxlX3ByZWNpc2lvbiA9IChtYXRoLnNxcnQoNSkgKyAxKSAvIDIKK29vZTIuc29tZV9jaGFyYWN0ZXJzID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiCitvb2UyLnpvbWdfdW5pY29kZSA9IHUiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZSJcCisgICAgICAgICAgICAgICAgICAgIHUiXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYSJcCisgICAgICAgICAgICAgICAgICAgIHUiXHhjN1x4ODNceGUyXHg4MFx4YmMiCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgb29lMS56b21nX3VuaWNvZGUgPSBvb2UxLnpvbWdfdW5pY29kZS5lbmNvZGUoJ3V0ZjgnKQorICAgIG9vZTIuem9tZ191bmljb2RlID0gb29lMi56b21nX3VuaWNvZGUuZW5jb2RlKCd1dGY4JykKKworaG0gPSBIb2x5TW9sZXkoKip7ImJpZyI6IFtdLCAiY29udGFpbiI6IHNldCgpLCAiYm9ua3MiOiB7fX0pCitobS5iaWcuYXBwZW5kKG9vZTEpCitobS5iaWcuYXBwZW5kKG9vZTIpCitobS5iaWdbMF0uYV9iaXRlID0gMHgyMgoraG0uYmlnWzFdLmFfYml0ZSA9IDB4MjIKKworaG0uY29udGFpbi5hZGQoKCJhbmQgYSBvbmUiLCAiYW5kIGEgdHdvIikpCitobS5jb250YWluLmFkZCgoInRoZW4gYSBvbmUsIHR3byIsICJ0aHJlZSEiLCAiRk9VUiEiKSkKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIuZW5jb2RlKCd1dGY4JyksKSkKK2Vsc2U6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIsKSkKK2htLmNvbnRhaW4uYWRkKCgpKQorCitobS5ib25rc1sibm90aGluZyJdID0gW10KK2htLmJvbmtzWyJzb21ldGhpbmciXSA9IFsKKyAgICBCb25rKCoqeyJ0eXBlIjogMSwgIm1lc3NhZ2UiOiAiV2FpdC4ifSksCisgICAgQm9uaygqKnsidHlwZSI6IDIsICJtZXNzYWdlIjogIldoYXQ/In0pLAorXQoraG0uYm9ua3NbInBvZSJdID0gWworICAgIEJvbmsoKip7InR5cGUiOiAzLCAibWVzc2FnZSI6ICJxdW90aCJ9KSwKKyAgICBCb25rKCoqeyJ0eXBlIjogNCwgIm1lc3NhZ2UiOiAidGhlIHJhdmVuIn0pLAorICAgIEJvbmsoKip7InR5cGUiOiA1LCAibWVzc2FnZSI6ICJuZXZlcm1vcmUifSksCitdCisKK3JzID0gUmFuZG9tU3R1ZmYoKQorcnMuYSA9IDEKK3JzLmIgPSAyCitycy5jID0gMworcnMubXlpbnRsaXN0ID0gbGlzdChyYW5nZSgyMCkpCitycy5tYXBzID0gezE6IFdyYXBwZXIoKip7ImZvbyI6IEVtcHR5KCl9KSwgMjogV3JhcHBlcigqKnsiZm9vIjogRW1wdHkoKX0pfQorcnMuYmlnaW50ID0gMTI0NTIzNDUyNDM1Citycy50cmlwbGUgPSAzLjE0CisKKyMgbWFrZSBzdXJlIHRoaXMgc3BsaXRzIHR3byBidWZmZXJzIGluIGEgYnVmZmVyZWQgcHJvdG9jb2wKK3JzaHVnZSA9IFJhbmRvbVN0dWZmKCkKK3JzaHVnZS5teWludGxpc3QgPSBsaXN0KHJhbmdlKDEwMDAwKSkKKworbXlfemVybyA9IFNydi5KYW5reV9yZXN1bHQoKip7InN1Y2Nlc3MiOiA1fSkKKworCitjbGFzcyBUZXN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZhc3QsIHNsb3cpOgorICAgICAgICBzZWxmLl9mYXN0ID0gZmFzdAorICAgICAgICBzZWxmLl9zbG93ID0gc2xvdworCisgICAgZGVmIF9jaGVja193cml0ZShzZWxmLCBvKToKKyAgICAgICAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBwcm90X2Zhc3QgPSBzZWxmLl9mYXN0KHRyYW5zX2Zhc3QsIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBwcm90X3Nsb3cgPSBzZWxmLl9zbG93KHRyYW5zX3Nsb3cpCisKKyAgICAgICAgby53cml0ZShwcm90X2Zhc3QpCisgICAgICAgIG8ud3JpdGUocHJvdF9zbG93KQorICAgICAgICBPUklHID0gdHJhbnNfc2xvdy5nZXR2YWx1ZSgpCisgICAgICAgIE1JTkUgPSB0cmFuc19mYXN0LmdldHZhbHVlKCkKKyAgICAgICAgaWYgT1JJRyAhPSBNSU5FOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAlc1xuZXhwZWN0ZWQ6ICVzIiAlIChyZXByKE1JTkUpLCByZXByKE9SSUcpKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignd3JpdGUgdmFsdWUgbWlzbWF0Y2gnKQorCisgICAgZGVmIF9jaGVja19yZWFkKHNlbGYsIG8pOgorICAgICAgICBwcm90ID0gc2VsZi5fc2xvdyhUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSkKKyAgICAgICAgby53cml0ZShwcm90KQorCisgICAgICAgIHNsb3dfdmVyc2lvbl9iaW5hcnkgPSBwcm90LnRyYW5zLmdldHZhbHVlKCkKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdCgKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSwgZmFsbGJhY2s9RmFsc2UpCisgICAgICAgIGMgPSBvLl9fY2xhc3NfXygpCisgICAgICAgIGMucmVhZChwcm90KQorICAgICAgICBpZiBjICE9IG86CisgICAgICAgICAgICBwcmludCgiYWN0dWFsICA6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihjKSkKKyAgICAgICAgICAgIHByaW50KCJleHBlY3RlZDogIikKKyAgICAgICAgICAgIHBwcmludChyZXByKG8pKQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdyZWFkIHZhbHVlIG1pc21hdGNoJykKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdCgKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSksIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIoYykpCisgICAgICAgICAgICBwcmludCgiZXhwZWN0ZWQ6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihvKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigncmVhZCB2YWx1ZSBtaXNtYXRjaCcpCisKKyAgICBkZWYgZG9fdGVzdChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUoSG9seU1vbGV5KCkpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQoSG9seU1vbGV5KCkpCisKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUoaG0pCisgICAgICAgIG5vX3NldCA9IGRlZXBjb3B5KGhtKQorICAgICAgICBub19zZXQuY29udGFpbiA9IHNldCgpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQobm9fc2V0KQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKGhtKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKHJzKQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKHJzKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKHJzaHVnZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChyc2h1Z2UpCisKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUobXlfemVybykKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChteV96ZXJvKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQoQmFja3dhcmRzKCoqeyJmaXJzdF90YWcyIjogNCwgInNlY29uZF90YWcxIjogMn0pKQorCisgICAgICAgICMgT25lIGNhc2Ugd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZm9ybSBjaGFuZ2VzLCBidXQgb25seSBzdXBlcmZpY2lhbGx5LgorICAgICAgICBvID0gQmFja3dhcmRzKCoqeyJmaXJzdF90YWcyIjogNCwgInNlY29uZF90YWcxIjogMn0pCisgICAgICAgIHRyYW5zX2Zhc3QgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICB0cmFuc19zbG93ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdF9mYXN0ID0gc2VsZi5fZmFzdCh0cmFuc19mYXN0LCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgcHJvdF9zbG93ID0gc2VsZi5fc2xvdyh0cmFuc19zbG93KQorCisgICAgICAgIG8ud3JpdGUocHJvdF9mYXN0KQorICAgICAgICBvLndyaXRlKHByb3Rfc2xvdykKKyAgICAgICAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQorICAgICAgICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCisgICAgICAgIGFzc2VydCBpZChPUklHKSAhPSBpZChNSU5FKQorCisgICAgICAgIHByb3QgPSBzZWxmLl9mYXN0KFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpLCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgby53cml0ZShwcm90KQorICAgICAgICBwcm90ID0gc2VsZi5fc2xvdygKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihwcm90LnRyYW5zLmdldHZhbHVlKCkpKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImNvcHk6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihjKSkKKyAgICAgICAgICAgIHByaW50KCJvcmlnOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIobykpCisKKworZGVmIGRvX3Rlc3QoZmFzdCwgc2xvdyk6CisgICAgVGVzdChmYXN0LCBzbG93KS5kb190ZXN0KCkKKworCitkZWYgZG9fYmVuY2htYXJrKHByb3RvY29sLCBpdGVycz01MDAwLCBza2lwX3Nsb3c9RmFsc2UpOgorICAgIHNldHVwID0gIiIiCitmcm9tIF9fbWFpbl9fIGltcG9ydCBobSwgcnMsIFREZXZOdWxsVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbC57MH0gaW1wb3J0IHswfXsxfQordHJhbnMgPSBURGV2TnVsbFRyYW5zcG9ydCgpCitwcm90ID0gezB9ezF9KHRyYW5zezJ9KQorIiIiCisKKyAgICBzZXR1cF9mYXN0ID0gc2V0dXAuZm9ybWF0KHByb3RvY29sLCAnQWNjZWxlcmF0ZWQnLCAnLCBmYWxsYmFjaz1GYWxzZScpCisgICAgaWYgbm90IHNraXBfc2xvdzoKKyAgICAgICAgc2V0dXBfc2xvdyA9IHNldHVwLmZvcm1hdChwcm90b2NvbCwgJycsICcnKQorCisgICAgcHJpbnQoIlN0YXJ0aW5nIEJlbmNobWFya3MiKQorCisgICAgaWYgbm90IHNraXBfc2xvdzoKKyAgICAgICAgcHJpbnQoIkhvbHlNb2xleSBTdGFuZGFyZCA9ICVmIiAlCisgICAgICAgICAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9zbG93KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIHByaW50KCJIb2x5TW9sZXkgQWNjZWxlci4gPSAlZiIgJQorICAgICAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIGlmIG5vdCBza2lwX3Nsb3c6CisgICAgICAgIHByaW50KCJGYXN0U3RydWN0IFN0YW5kYXJkID0gJWYiICUKKyAgICAgICAgICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX3Nsb3cpLnRpbWVpdChudW1iZXI9aXRlcnMpKQorCisgICAgcHJpbnQoIkZhc3RTdHJ1Y3QgQWNjZWxlci4gPSAlZiIgJQorICAgICAgICAgIHRpbWVpdC5UaW1lcigncnMud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHByaW50KCdUZXN0aW5nIFRCaW5hcnlBY2NlbGVyYXRlZCcpCisgICAgZG9fdGVzdChUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwgVEJpbmFyeVByb3RvY29sKQorICAgIGRvX2JlbmNobWFyaygnVEJpbmFyeVByb3RvY29sJykKKyAgICBwcmludCgnVGVzdGluZyBUQ29tcGFjdEFjY2VsZXJhdGVkJykKKyAgICBkb190ZXN0KFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCwgVENvbXBhY3RQcm90b2NvbCkKKyAgICBkb19iZW5jaG1hcmsoJ1RDb21wYWN0UHJvdG9jb2wnKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9NYWtlZmlsZS5hbSBiL3Rlc3QvcHkvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkM2YwYTdkLi45NDMzZTU5Ci0tLSBhL3Rlc3QvcHkvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9weS9NYWtlZmlsZS5hbQpAQCAtMTgsMjcgKzE4LDQwIEBACiAjCiBBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIHB5X3VuaXRfdGVzdHMgPSBSdW5DbGllbnRTZXJ2ZXIucHkKIAogdGhyaWZ0X2dlbiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBnZW4tcHkvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgXAogICAgICAgICBnZW4tcHkvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHkvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS9SZWN1cnNpdmUvX19pbml0X18ucHkgXAogICAgICAgICBnZW4tcHktZGVmYXVsdC9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCiAgICAgICAgIGdlbi1weS1kZWZhdWx0L0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWRlZmF1bHQvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1kZWZhdWx0L1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCiAgICAgICAgIGdlbi1weS1zbG90cy9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCiAgICAgICAgIGdlbi1weS1zbG90cy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCi0gICAgICAgIGdlbi1weS1uZXdzdHlsZS9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCi0gICAgICAgIGdlbi1weS1uZXdzdHlsZS9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCi0gICAgICAgIGdlbi1weS1uZXdzdHlsZXNsb3RzL1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKLSAgICAgICAgZ2VuLXB5LW5ld3N0eWxlc2xvdHMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktc2xvdHMvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1zbG90cy9SZWN1cnNpdmUvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1vbGRzdHlsZS9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1vbGRzdHlsZS9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW9sZHN0eWxlL1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9UaHJpZnRUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktbm9fdXRmOHN0cmluZ3MvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKICAgICAgICAgZ2VuLXB5LWR5bmFtaWMvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgXAogICAgICAgICBnZW4tcHktZHluYW1pYy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1keW5hbWljL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pYy9SZWN1cnNpdmUvX19pbml0X18ucHkgXAogICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKLSAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weQorICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9SZWN1cnNpdmUvX19pbml0X18ucHkKIAotcHJlY3Jvc3M6ICQoVEhSSUZUKSAkKHRocmlmdF9nZW4pCisKK3ByZWNyb3NzOiAkKHRocmlmdF9nZW4pCiBCVUlMVF9TT1VSQ0VTID0gJCh0aHJpZnRfZ2VuKQogCiBoZWxwZXJfc2NyaXB0cz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC01MywzMiArNjYsNDAgQEAKIFRFU1RTPSAkKHB5X3VuaXRfdGVzdHMpCiAKIAotZ2VuLXB5LyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0CitnZW4tcHkvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIHB5ICAkPAogCi1nZW4tcHktZGVmYXVsdC8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdAorZ2VuLXB5LWRlZmF1bHQvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCiAJdGVzdCAtZCBnZW4tcHktZGVmYXVsdCB8fCAkKE1LRElSX1ApIGdlbi1weS1kZWZhdWx0CiAJJChUSFJJRlQpIC0tZ2VuIHB5IC1vdXQgZ2VuLXB5LWRlZmF1bHQgJDwKIAotZ2VuLXB5LXNsb3RzLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0CitnZW4tcHktc2xvdHMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCiAJdGVzdCAtZCBnZW4tcHktc2xvdHMgfHwgJChNS0RJUl9QKSBnZW4tcHktc2xvdHMKIAkkKFRIUklGVCkgLS1nZW4gcHk6c2xvdHMgLW91dCBnZW4tcHktc2xvdHMgJDwKIAotZ2VuLXB5LW5ld3N0eWxlLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0Ci0JdGVzdCAtZCBnZW4tcHktbmV3c3R5bGUgfHwgJChNS0RJUl9QKSBnZW4tcHktbmV3c3R5bGUKLQkkKFRIUklGVCkgLS1nZW4gcHk6bmV3X3N0eWxlIC1vdXQgZ2VuLXB5LW5ld3N0eWxlICQ8CitnZW4tcHktb2xkc3R5bGUvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktb2xkc3R5bGUgfHwgJChNS0RJUl9QKSBnZW4tcHktb2xkc3R5bGUKKwkkKFRIUklGVCkgLS1nZW4gcHk6b2xkX3N0eWxlIC1vdXQgZ2VuLXB5LW9sZHN0eWxlICQ8CiAKLWdlbi1weS1uZXdzdHlsZXNsb3RzLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0Ci0JdGVzdCAtZCBnZW4tcHktbmV3c3R5bGVzbG90cyB8fCAkKE1LRElSX1ApIGdlbi1weS1uZXdzdHlsZXNsb3RzCi0JJChUSFJJRlQpIC0tZ2VuIHB5Om5ld19zdHlsZSxzbG90cyAtb3V0IGdlbi1weS1uZXdzdHlsZXNsb3RzICQ8CitnZW4tcHktbm9fdXRmOHN0cmluZ3MvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktbm9fdXRmOHN0cmluZ3MgfHwgJChNS0RJUl9QKSBnZW4tcHktbm9fdXRmOHN0cmluZ3MKKwkkKFRIUklGVCkgLS1nZW4gcHk6bm9fdXRmOHN0cmluZ3MgLW91dCBnZW4tcHktbm9fdXRmOHN0cmluZ3MgJDwKIAotZ2VuLXB5LWR5bmFtaWMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQKK2dlbi1weS1keW5hbWljLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQogCXRlc3QgLWQgZ2VuLXB5LWR5bmFtaWMgfHwgJChNS0RJUl9QKSBnZW4tcHktZHluYW1pYwogCSQoVEhSSUZUKSAtLWdlbiBweTpkeW5hbWljIC1vdXQgZ2VuLXB5LWR5bmFtaWMgJDwKIAotZ2VuLXB5LWR5bmFtaWNzbG90cy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdAorZ2VuLXB5LWR5bmFtaWNzbG90cy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKIAl0ZXN0IC1kIGdlbi1weS1keW5hbWljc2xvdHMgfHwgJChNS0RJUl9QKSBnZW4tcHktZHluYW1pY3Nsb3RzCiAJJChUSFJJRlQpIC0tZ2VuIHB5OmR5bmFtaWMsc2xvdHMgLW91dCBnZW4tcHktZHluYW1pY3Nsb3RzICQ8CiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1weSBnZW4tcHktc2xvdHMgZ2VuLXB5LWRlZmF1bHQgZ2VuLXB5LW5ld3N0eWxlIGdlbi1weS1uZXdzdHlsZXNsb3RzIGdlbi1weS1keW5hbWljIGdlbi1weS1keW5hbWljc2xvdHMKKwkkKFJNKSAtciBidWlsZAorCWZpbmQgLiAtdHlwZSBmIFwoIC1pbmFtZSAiKi5weWMiIFwpIHwgeGFyZ3Mgcm0gLWYKKwlmaW5kIC4gLXR5cGUgZCBcKCAtaW5hbWUgIl9fcHljYWNoZV9fIiAtb3IgLWluYW1lICJfdHJpYWxfdGVtcCIgXCkgfCB4YXJncyBybSAtcmYKKwkkKFJNKSAtciBnZW4tcHkqLworCitkaXN0LWhvb2s6CisJZmluZCAkKGRpc3RkaXIpIC10eXBlIGYgXCggLWluYW1lICIqLnB5YyIgXCkgfCB4YXJncyBybSAtZgorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIFwoIC1pbmFtZSAiX19weWNhY2hlX18iIC1vciAtaW5hbWUgIl90cmlhbF90ZW1wIiBcKSB8IHhhcmdzIHJtIC1yZgorCSQoUk0pIC1yICQoZGlzdGRpcikvZ2VuLXB5Ki8KZGlmZiAtLWdpdCBhL3Rlc3QvcHkvUnVuQ2xpZW50U2VydmVyLnB5IGIvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkKaW5kZXggYjdmNDMzMi4uNTZhNDA4ZSAxMDA3NTUKLS0tIGEvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkKKysrIGIvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkKQEAgLTIwLDE5NSArMjAsMzA0IEBACiAjCiAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KLWltcG9ydCB0aW1lCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBjb3B5CitpbXBvcnQgb3MKK2ltcG9ydCBzaWduYWwKIGltcG9ydCBzb2NrZXQKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCi1pbXBvcnQgb3MKLWltcG9ydCBzaWduYWwKK2ltcG9ydCB0aW1lCiBmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKIAotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlycycsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlycycsCi0gICAgZGVmYXVsdD0nZGVmYXVsdCxzbG90cyxuZXdzdHlsZSxuZXdzdHlsZXNsb3RzLGR5bmFtaWMsZHluYW1pY3Nsb3RzJywKLSAgICBoZWxwPSdkaXJlY3RvcnkgZXh0ZW5zaW9ucyBmb3IgZ2VuZXJhdGVkIGNvZGUsIHVzZWQgYXMgc3VmZml4ZXMgZm9yIFwiZ2VuLXB5LSpcIiBhZGRlZCBzeXMucGF0aCBmb3IgaW5kaXZpZHVhbCB0ZXN0cycpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsIGRlZmF1bHQ9OTA5MCwKLSAgICBoZWxwPSJwb3J0IG51bWJlciBmb3Igc2VydmVyIHRvIGxpc3RlbiBvbiIpCi1wYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCi0gICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCi0gICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQotcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKLSAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKLSAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCi1wYXJzZXIuc2V0X2RlZmF1bHRzKHZlcmJvc2U9MSkKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCitmcm9tIHV0aWwgaW1wb3J0IGxvY2FsX2xpYnBhdGgKIAotZ2VuZXJhdGVkX2RpcnMgPSBbXQotZm9yIGdwX2RpciBpbiBvcHRpb25zLmdlbnB5ZGlycy5zcGxpdCgnLCcpOgotICBnZW5lcmF0ZWRfZGlycy5hcHBlbmQoJ2dlbi1weS0lcycgJSAoZ3BfZGlyKSkKK1NDUklQVF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKIAotU0NSSVBUUyA9IFsnVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHknLAotICAgICAgICAgICAnU2VyaWFsaXphdGlvblRlc3QucHknLAotICAgICAgICAgICAnVGVzdEVvZi5weScsCi0gICAgICAgICAgICdUZXN0U3ludGF4LnB5JywKLSAgICAgICAgICAgJ1Rlc3RTb2NrZXQucHknXQorU0NSSVBUUyA9IFsKKyAgICAnRmFzdGJpbmFyeVRlc3QucHknLAorICAgICdUZXN0RnJvemVuLnB5JywKKyAgICAnVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5JywKKyAgICAnVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHknLAorICAgICdTZXJpYWxpemF0aW9uVGVzdC5weScsCisgICAgJ1Rlc3RFb2YucHknLAorICAgICdUZXN0U3ludGF4LnB5JywKKyAgICAnVGVzdFNvY2tldC5weScsCitdCiBGUkFNRUQgPSBbIlROb25ibG9ja2luZ1NlcnZlciJdCiBTS0lQX1pMSUIgPSBbJ1ROb25ibG9ja2luZ1NlcnZlcicsICdUSHR0cFNlcnZlciddCi1TS0lQX1NTTCA9IFsnVE5vbmJsb2NraW5nU2VydmVyJywgJ1RIdHRwU2VydmVyJ10KK1NLSVBfU1NMID0gWydUSHR0cFNlcnZlciddCiBFWFRSQV9ERUxBWSA9IGRpY3QoVFByb2Nlc3NQb29sU2VydmVyPTUuNSkKIAotUFJPVE9TPSBbCitQUk9UT1MgPSBbCiAgICAgJ2FjY2VsJywKKyAgICAnYWNjZWxjJywKICAgICAnYmluYXJ5JywKICAgICAnY29tcGFjdCcsCi0gICAgJ2pzb24nXQorICAgICdqc29uJywKKyAgICAnaGVhZGVyJywKK10KIAotU0VSVkVSUyA9IFsKLSAgIlRTaW1wbGVTZXJ2ZXIiLAotICAiVFRocmVhZGVkU2VydmVyIiwKLSAgIlRUaHJlYWRQb29sU2VydmVyIiwKLSAgIlRQcm9jZXNzUG9vbFNlcnZlciIsICMgbmV3IQotICAiVEZvcmtpbmdTZXJ2ZXIiLAotICAiVE5vbmJsb2NraW5nU2VydmVyIiwKLSAgIlRIdHRwU2VydmVyIiBdCiAKLSMgVGVzdCBmb3IgcHJlc2VuY2Ugb2YgbXVsdGlwcm9jZXNzaW5nIG1vZHVsZSwgYW5kIGlmIGl0IGlzIG5vdCBwcmVzZW50LCB0aGVuCi0jIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBzZXJ2ZXJzLgotdHJ5OgotICBpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCi1leGNlcHQ6Ci0gIHByaW50ICdXYXJuaW5nOiB0aGUgbXVsdGlwcm9jZXNzaW5nIG1vZHVsZSBpcyB1bmF2YWlsYWJsZS4gU2tpcHBpbmcgdGVzdHMgZm9yIFRQcm9jZXNzUG9vbFNlcnZlcicKLSAgU0VSVkVSUy5yZW1vdmUoJ1RQcm9jZXNzUG9vbFNlcnZlcicpCi0KLXRyeToKLSAgaW1wb3J0IHNzbAotZXhjZXB0OgotICBwcmludCAnV2FybmluZywgbm8gc3NsIG1vZHVsZSBhdmFpbGFibGUuIFNraXBwaW5nIGFsbCBTU0wgdGVzdHMuJwotICBTS0lQX1NTTC5leHRlbmQoU0VSVkVSUykKLQotIyBjb21tYW5kbGluZSBwZXJtaXRzIGEgc2luZ2xlIGNsYXNzIG5hbWUgdG8gYmUgc3BlY2lmaWVkIHRvIG92ZXJyaWRlIFNFUlZFUlM9Wy4uLl0KLWlmIGxlbihhcmdzKSA9PSAxOgotICBpZiBhcmdzWzBdIGluIFNFUlZFUlM6Ci0gICAgU0VSVkVSUyA9IGFyZ3MKLSAgZWxzZToKLSAgICBwcmludCAnVW5hdmFpbGFibGUgc2VydmVyIHR5cGUgIiVzIiwgcGxlYXNlIGNob29zZSBvbmUgb2Y6ICVzJyAlIChhcmdzWzBdLCBTRVJWRVJTKQotICAgIHN5cy5leGl0KDApCitkZWYgZGVmYXVsdF9zZXJ2ZXJzKCk6CisgICAgc2VydmVycyA9IFsKKyAgICAgICAgJ1RTaW1wbGVTZXJ2ZXInLAorICAgICAgICAnVFRocmVhZGVkU2VydmVyJywKKyAgICAgICAgJ1RUaHJlYWRQb29sU2VydmVyJywKKyAgICAgICAgJ1ROb25ibG9ja2luZ1NlcnZlcicsCisgICAgICAgICdUSHR0cFNlcnZlcicsCisgICAgXQorICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpICE9ICdXaW5kb3dzJzoKKyAgICAgICAgc2VydmVycy5hcHBlbmQoJ1RQcm9jZXNzUG9vbFNlcnZlcicpCisgICAgICAgIHNlcnZlcnMuYXBwZW5kKCdURm9ya2luZ1NlcnZlcicpCisgICAgcmV0dXJuIHNlcnZlcnMKIAogCiBkZWYgcmVsZmlsZShmbmFtZSk6Ci0gICAgcmV0dXJuIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCBmbmFtZSkKKyAgICByZXR1cm4gb3MucGF0aC5qb2luKFNDUklQVF9ESVIsIGZuYW1lKQogCi1kZWYgcnVuU2NyaXB0VGVzdChnZW5weWRpciwgc2NyaXB0KToKLSAgc2NyaXB0X2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoc2NyaXB0KSBdCi0gIHNjcmlwdF9hcmdzLmFwcGVuZCgnLS1nZW5weWRpcj0lcycgJSBnZW5weWRpcikKLSAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2NyaXB0X2FyZ3MpCi0gIHByaW50ICdcblRlc3Rpbmcgc2NyaXB0OiAlc1xuLS0tLScgJSAoJyAnLmpvaW4oc2NyaXB0X2FyZ3MpKQotICByZXQgPSBzdWJwcm9jZXNzLmNhbGwoc2NyaXB0X2FyZ3MpCi0gIGlmIHJldCAhPSAwOgotICAgIHJhaXNlIEV4Y2VwdGlvbigiU2NyaXB0IHN1YnByb2Nlc3MgZmFpbGVkLCByZXRjb2RlPSVkLCBhcmdzOiAlcyIgJSAocmV0LCAnICcuam9pbihzY3JpcHRfYXJncykpKQogCi1kZWYgcnVuU2VydmljZVRlc3QoZ2VucHlkaXIsIHNlcnZlcl9jbGFzcywgcHJvdG8sIHBvcnQsIHVzZV96bGliLCB1c2Vfc3NsKToKLSAgIyBCdWlsZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gIHNlcnZlcl9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKCdUZXN0U2VydmVyLnB5JykgXQotICBjbGlfYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgcmVsZmlsZSgnVGVzdENsaWVudC5weScpIF0KLSAgZm9yIHdoaWNoIGluIChzZXJ2ZXJfYXJncywgY2xpX2FyZ3MpOgotICAgIHdoaWNoLmFwcGVuZCgnLS1nZW5weWRpcj0lcycgJSBnZW5weWRpcikKLSAgICB3aGljaC5hcHBlbmQoJy0tcHJvdG9jb2w9JXMnICUgcHJvdG8pICMgYWNjZWwsIGJpbmFyeSBvciBjb21wYWN0Ci0gICAgd2hpY2guYXBwZW5kKCctLXBvcnQ9JWQnICUgcG9ydCkgIyBkZWZhdWx0IHRvIDkwOTAKLSAgICBpZiB1c2VfemxpYjoKLSAgICAgIHdoaWNoLmFwcGVuZCgnLS16bGliJykKLSAgICBpZiB1c2Vfc3NsOgotICAgICAgd2hpY2guYXBwZW5kKCctLXNzbCcpCi0gICAgaWYgb3B0aW9ucy52ZXJib3NlID09IDA6Ci0gICAgICB3aGljaC5hcHBlbmQoJy1xJykKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPT0gMjoKLSAgICAgIHdoaWNoLmFwcGVuZCgnLXYnKQotICAjIHNlcnZlci1zcGVjaWZpYyBvcHRpb24gdG8gc2VsZWN0IHNlcnZlciBjbGFzcwotICBzZXJ2ZXJfYXJncy5hcHBlbmQoc2VydmVyX2NsYXNzKQotICAjIGNsaWVudC1zcGVjaWZpYyBjbWRsaW5lIG9wdGlvbnMKLSAgaWYgc2VydmVyX2NsYXNzIGluIEZSQU1FRDoKLSAgICBjbGlfYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PWZyYW1lZCcpCi0gIGVsc2U6Ci0gICAgIGNsaV9hcmdzLmFwcGVuZCgnLS10cmFuc3BvcnQ9YnVmZmVyZWQnKQotICBpZiBzZXJ2ZXJfY2xhc3MgPT0gJ1RIdHRwU2VydmVyJzoKLSAgICBjbGlfYXJncy5hcHBlbmQoJy0taHR0cD0vJykKLSAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICBwcmludCAnVGVzdGluZyBzZXJ2ZXIgJXM6ICVzJyAlIChzZXJ2ZXJfY2xhc3MsICcgJy5qb2luKHNlcnZlcl9hcmdzKSkKLSAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2VydmVyX2FyZ3MpCitkZWYgc2V0dXBfcHlwYXRoKGxpYmRpciwgZ2VuZGlyKToKKyAgICBkaXJzID0gW2xpYmRpciwgZ2VuZGlyXQorICAgIGVudiA9IGNvcHkuZGVlcGNvcHkob3MuZW52aXJvbikKKyAgICBweXBhdGggPSBlbnYuZ2V0KCdQWVRIT05QQVRIJywgTm9uZSkKKyAgICBpZiBweXBhdGg6CisgICAgICAgIGRpcnMuYXBwZW5kKHB5cGF0aCkKKyAgICBlbnZbJ1BZVEhPTlBBVEgnXSA9IG9zLnBhdGhzZXAuam9pbihkaXJzKQorICAgIGlmIGdlbmRpci5lbmRzd2l0aCgnZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzJyk6CisgICAgICAgIGVudlsnVEhSSUZUX1RFU1RfUFlfTk9fVVRGOFNUUklOR1MnXSA9ICcxJworICAgIHJldHVybiBlbnYKIAotICBkZWYgZW5zdXJlU2VydmVyQWxpdmUoKToKLSAgICBpZiBzZXJ2ZXJwcm9jLnBvbGwoKSBpcyBub3QgTm9uZToKLSAgICAgIHByaW50ICgnRkFJTDogU2VydmVyIHByb2Nlc3MgKCVzKSBmYWlsZWQgd2l0aCByZXRjb2RlICVkJwotICAgICAgICAgICAgICUgKCcgJy5qb2luKHNlcnZlcl9hcmdzKSwgc2VydmVycHJvYy5yZXR1cm5jb2RlKSkKLSAgICAgIHJhaXNlIEV4Y2VwdGlvbignU2VydmVyIHN1YnByb2Nlc3MgJXMgZGllZCwgYXJnczogJXMnCi0gICAgICAgICAgICAgICAgICAgICAgJSAoc2VydmVyX2NsYXNzLCAnICcuam9pbihzZXJ2ZXJfYXJncykpKQogCi0gICMgV2FpdCBmb3IgdGhlIHNlcnZlciB0byBzdGFydCBhY2NlcHRpbmcgY29ubmVjdGlvbnMgb24gdGhlIGdpdmVuIHBvcnQuCi0gIHNvY2sgPSBzb2NrZXQuc29ja2V0KCkKLSAgc2xlZXBfdGltZSA9IDAuMSAgIyBTZWNvbmRzCi0gIG1heF9hdHRlbXB0cyA9IDEwMAotICB0cnk6Ci0gICAgYXR0ZW1wdCA9IDAKLSAgICB3aGlsZSBzb2NrLmNvbm5lY3RfZXgoKCcxMjcuMC4wLjEnLCBwb3J0KSkgIT0gMDoKLSAgICAgIGF0dGVtcHQgKz0gMQotICAgICAgaWYgYXR0ZW1wdCA+PSBtYXhfYXR0ZW1wdHM6Ci0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVGVzdFNlcnZlciBub3QgcmVhZHkgb24gcG9ydCAlZCBhZnRlciAlLjJmIHNlY29uZHMiCi0gICAgICAgICAgICAgICAgICAgICAgICAlIChwb3J0LCBzbGVlcF90aW1lICogYXR0ZW1wdCkpCi0gICAgICBlbnN1cmVTZXJ2ZXJBbGl2ZSgpCi0gICAgICB0aW1lLnNsZWVwKHNsZWVwX3RpbWUpCi0gIGZpbmFsbHk6Ci0gICAgc29jay5jbG9zZSgpCi0KLSAgdHJ5OgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6Ci0gICAgICBwcmludCAnVGVzdGluZyBjbGllbnQ6ICVzJyAlICgnICcuam9pbihjbGlfYXJncykpCi0gICAgcmV0ID0gc3VicHJvY2Vzcy5jYWxsKGNsaV9hcmdzKQorZGVmIHJ1blNjcmlwdFRlc3QobGliZGlyLCBnZW5iYXNlLCBnZW5weWRpciwgc2NyaXB0KToKKyAgICBlbnYgPSBzZXR1cF9weXBhdGgobGliZGlyLCBvcy5wYXRoLmpvaW4oZ2VuYmFzZSwgZ2VucHlkaXIpKQorICAgIHNjcmlwdF9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKHNjcmlwdCldCisgICAgcHJpbnQoJ1xuVGVzdGluZyBzY3JpcHQ6ICVzXG4tLS0tJyAlICgnICcuam9pbihzY3JpcHRfYXJncykpKQorICAgIHJldCA9IHN1YnByb2Nlc3MuY2FsbChzY3JpcHRfYXJncywgZW52PWVudikKICAgICBpZiByZXQgIT0gMDoKLSAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQ2xpZW50IHN1YnByb2Nlc3MgZmFpbGVkLCByZXRjb2RlPSVkLCBhcmdzOiAlcyIgJSAocmV0LCAnICcuam9pbihjbGlfYXJncykpKQotICBmaW5hbGx5OgotICAgICMgY2hlY2sgdGhhdCBzZXJ2ZXIgZGlkbid0IGRpZQotICAgIGVuc3VyZVNlcnZlckFsaXZlKCkKLSAgICBleHRyYV9zbGVlcCA9IEVYVFJBX0RFTEFZLmdldChzZXJ2ZXJfY2xhc3MsIDApCi0gICAgaWYgZXh0cmFfc2xlZXAgPiAwIGFuZCBvcHRpb25zLnZlcmJvc2UgPiAwOgotICAgICAgcHJpbnQgKCdHaXZpbmcgJXMgKHByb3RvPSVzLHpsaWI9JXMsc3NsPSVzKSBhbiBleHRyYSAlZCBzZWNvbmRzIGZvciBjaGlsZCcKLSAgICAgICAgICAgICAncHJvY2Vzc2VzIHRvIHRlcm1pbmF0ZSB2aWEgYWxhcm0nCi0gICAgICAgICAgICAgJSAoc2VydmVyX2NsYXNzLCBwcm90bywgdXNlX3psaWIsIHVzZV9zc2wsIGV4dHJhX3NsZWVwKSkKLSAgICAgIHRpbWUuc2xlZXAoZXh0cmFfc2xlZXApCi0gICAgb3Mua2lsbChzZXJ2ZXJwcm9jLnBpZCwgc2lnbmFsLlNJR0tJTEwpCi0gICAgc2VydmVycHJvYy53YWl0KCkKKyAgICAgICAgcHJpbnQoJyoqKiBGQUlMRUQgKioqJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnTElCRElSOiAlcycgJSBsaWJkaXIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJ1BZX0dFTjogJXMnICUgZ2VucHlkaXIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJ1NDUklQVDogJXMnICUgc2NyaXB0LCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiU2NyaXB0IHN1YnByb2Nlc3MgZmFpbGVkLCByZXRjb2RlPSVkLCBhcmdzOiAlcyIgJSAocmV0LCAnICcuam9pbihzY3JpcHRfYXJncykpKQogCi10ZXN0X2NvdW50ID0gMAotIyBydW4gdGVzdHMgd2l0aG91dCBhIGNsaWVudC9zZXJ2ZXIgZmlyc3QKLXByaW50ICctLS0tLS0tLS0tLS0tLS0tJwotcHJpbnQgJyBFeGVjdXRpbmcgaW5kaXZpZHVhbCB0ZXN0IHNjcmlwdHMgd2l0aCB2YXJpb3VzIGdlbmVyYXRlZCBjb2RlIGRpcmVjdG9yaWVzJwotcHJpbnQgJyBEaXJlY3RvcmllcyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oZ2VuZXJhdGVkX2RpcnMpCi1wcmludCAnIFNjcmlwdHMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKFNDUklQVFMpCi1wcmludCAnLS0tLS0tLS0tLS0tLS0tLScKLWZvciBnZW5weWRpciBpbiBnZW5lcmF0ZWRfZGlyczoKLSAgZm9yIHNjcmlwdCBpbiBTQ1JJUFRTOgotICAgIHJ1blNjcmlwdFRlc3QoZ2VucHlkaXIsIHNjcmlwdCkKIAotcHJpbnQgJy0tLS0tLS0tLS0tLS0tLS0nCi1wcmludCAnIEV4ZWN1dGluZyBDbGllbnQvU2VydmVyIHRlc3RzIHdpdGggdmFyaW91cyBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcycKLXByaW50ICcgU2VydmVycyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oU0VSVkVSUykKLXByaW50ICcgRGlyZWN0b3JpZXMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKGdlbmVyYXRlZF9kaXJzKQotcHJpbnQgJyBQcm90b2NvbHMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKFBST1RPUykKLXByaW50ICcgT3B0aW9ucyB0byBiZSB0ZXN0ZWQ6IFpMSUIoeWVzL25vKSwgU1NMKHllcy9ubyknCi1wcmludCAnLS0tLS0tLS0tLS0tLS0tLScKLWZvciB0cnlfc2VydmVyIGluIFNFUlZFUlM6Ci0gIGZvciBnZW5weWRpciBpbiBnZW5lcmF0ZWRfZGlyczoKLSAgICBmb3IgdHJ5X3Byb3RvIGluIFBST1RPUzoKLSAgICAgIGZvciB3aXRoX3psaWIgaW4gKEZhbHNlLCBUcnVlKToKK2RlZiBydW5TZXJ2aWNlVGVzdChsaWJkaXIsIGdlbmJhc2UsIGdlbnB5ZGlyLCBzZXJ2ZXJfY2xhc3MsIHByb3RvLCBwb3J0LCB1c2VfemxpYiwgdXNlX3NzbCwgdmVyYm9zZSk6CisgICAgZW52ID0gc2V0dXBfcHlwYXRoKGxpYmRpciwgb3MucGF0aC5qb2luKGdlbmJhc2UsIGdlbnB5ZGlyKSkKKyAgICAjIEJ1aWxkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBzZXJ2ZXJfYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgcmVsZmlsZSgnVGVzdFNlcnZlci5weScpXQorICAgIGNsaV9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKCdUZXN0Q2xpZW50LnB5JyldCisgICAgZm9yIHdoaWNoIGluIChzZXJ2ZXJfYXJncywgY2xpX2FyZ3MpOgorICAgICAgICB3aGljaC5hcHBlbmQoJy0tcHJvdG9jb2w9JXMnICUgcHJvdG8pICAjIGFjY2VsLCBiaW5hcnksIGNvbXBhY3Qgb3IganNvbgorICAgICAgICB3aGljaC5hcHBlbmQoJy0tcG9ydD0lZCcgJSBwb3J0KSAgIyBkZWZhdWx0IHRvIDkwOTAKKyAgICAgICAgaWYgdXNlX3psaWI6CisgICAgICAgICAgICB3aGljaC5hcHBlbmQoJy0temxpYicpCisgICAgICAgIGlmIHVzZV9zc2w6CisgICAgICAgICAgICB3aGljaC5hcHBlbmQoJy0tc3NsJykKKyAgICAgICAgaWYgdmVyYm9zZSA9PSAwOgorICAgICAgICAgICAgd2hpY2guYXBwZW5kKCctcScpCisgICAgICAgIGlmIHZlcmJvc2UgPT0gMjoKKyAgICAgICAgICAgIHdoaWNoLmFwcGVuZCgnLXYnKQorICAgICMgc2VydmVyLXNwZWNpZmljIG9wdGlvbiB0byBzZWxlY3Qgc2VydmVyIGNsYXNzCisgICAgc2VydmVyX2FyZ3MuYXBwZW5kKHNlcnZlcl9jbGFzcykKKyAgICAjIGNsaWVudC1zcGVjaWZpYyBjbWRsaW5lIG9wdGlvbnMKKyAgICBpZiBzZXJ2ZXJfY2xhc3MgaW4gRlJBTUVEOgorICAgICAgICBjbGlfYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PWZyYW1lZCcpCisgICAgZWxzZToKKyAgICAgICAgY2xpX2FyZ3MuYXBwZW5kKCctLXRyYW5zcG9ydD1idWZmZXJlZCcpCisgICAgaWYgc2VydmVyX2NsYXNzID09ICdUSHR0cFNlcnZlcic6CisgICAgICAgIGNsaV9hcmdzLmFwcGVuZCgnLS1odHRwPS8nKQorICAgIGlmIHZlcmJvc2UgPiAwOgorICAgICAgICBwcmludCgnVGVzdGluZyBzZXJ2ZXIgJXM6ICVzJyAlIChzZXJ2ZXJfY2xhc3MsICcgJy5qb2luKHNlcnZlcl9hcmdzKSkpCisgICAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2VydmVyX2FyZ3MsIGVudj1lbnYpCisKKyAgICBkZWYgZW5zdXJlU2VydmVyQWxpdmUoKToKKyAgICAgICAgaWYgc2VydmVycHJvYy5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludCgoJ0ZBSUw6IFNlcnZlciBwcm9jZXNzICglcykgZmFpbGVkIHdpdGggcmV0Y29kZSAlZCcpCisgICAgICAgICAgICAgICAgICAlICgnICcuam9pbihzZXJ2ZXJfYXJncyksIHNlcnZlcnByb2MucmV0dXJuY29kZSkpCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ1NlcnZlciBzdWJwcm9jZXNzICVzIGRpZWQsIGFyZ3M6ICVzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlcnZlcl9jbGFzcywgJyAnLmpvaW4oc2VydmVyX2FyZ3MpKSkKKworICAgICMgV2FpdCBmb3IgdGhlIHNlcnZlciB0byBzdGFydCBhY2NlcHRpbmcgY29ubmVjdGlvbnMgb24gdGhlIGdpdmVuIHBvcnQuCisgICAgc2xlZXBfdGltZSA9IDAuMSAgIyBTZWNvbmRzCisgICAgbWF4X2F0dGVtcHRzID0gMTAwCisgICAgYXR0ZW1wdCA9IDAKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBzb2NrNCA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICBzb2NrNiA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQ2KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzb2NrNC5jb25uZWN0X2V4KCgnMTI3LjAuMC4xJywgcG9ydCkpID09IDAgXAorICAgICAgICAgICAgICAgICAgICBvciBzb2NrNi5jb25uZWN0X2V4KCgnOjoxJywgcG9ydCkpID09IDA6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGF0dGVtcHQgKz0gMQorICAgICAgICAgICAgaWYgYXR0ZW1wdCA+PSBtYXhfYXR0ZW1wdHM6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJUZXN0U2VydmVyIG5vdCByZWFkeSBvbiBwb3J0ICVkIGFmdGVyICUuMmYgc2Vjb25kcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAocG9ydCwgc2xlZXBfdGltZSAqIGF0dGVtcHQpKQorICAgICAgICAgICAgZW5zdXJlU2VydmVyQWxpdmUoKQorICAgICAgICAgICAgdGltZS5zbGVlcChzbGVlcF90aW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29jazQuY2xvc2UoKQorICAgICAgICAgICAgc29jazYuY2xvc2UoKQorCisgICAgdHJ5OgorICAgICAgICBpZiB2ZXJib3NlID4gMDoKKyAgICAgICAgICAgIHByaW50KCdUZXN0aW5nIGNsaWVudDogJXMnICUgKCcgJy5qb2luKGNsaV9hcmdzKSkpCisgICAgICAgIHJldCA9IHN1YnByb2Nlc3MuY2FsbChjbGlfYXJncywgZW52PWVudikKKyAgICAgICAgaWYgcmV0ICE9IDA6CisgICAgICAgICAgICBwcmludCgnKioqIEZBSUxFRCAqKionLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICBwcmludCgnTElCRElSOiAlcycgJSBsaWJkaXIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIHByaW50KCdQWV9HRU46ICVzJyAlIGdlbnB5ZGlyLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNsaWVudCBzdWJwcm9jZXNzIGZhaWxlZCwgcmV0Y29kZT0lZCwgYXJnczogJXMiICUgKHJldCwgJyAnLmpvaW4oY2xpX2FyZ3MpKSkKKyAgICBmaW5hbGx5OgorICAgICAgICAjIGNoZWNrIHRoYXQgc2VydmVyIGRpZG4ndCBkaWUKKyAgICAgICAgZW5zdXJlU2VydmVyQWxpdmUoKQorICAgICAgICBleHRyYV9zbGVlcCA9IEVYVFJBX0RFTEFZLmdldChzZXJ2ZXJfY2xhc3MsIDApCisgICAgICAgIGlmIGV4dHJhX3NsZWVwID4gMCBhbmQgdmVyYm9zZSA+IDA6CisgICAgICAgICAgICBwcmludCgnR2l2aW5nICVzIChwcm90bz0lcyx6bGliPSVzLHNzbD0lcykgYW4gZXh0cmEgJWQgc2Vjb25kcyBmb3IgY2hpbGQnCisgICAgICAgICAgICAgICAgICAncHJvY2Vzc2VzIHRvIHRlcm1pbmF0ZSB2aWEgYWxhcm0nCisgICAgICAgICAgICAgICAgICAlIChzZXJ2ZXJfY2xhc3MsIHByb3RvLCB1c2VfemxpYiwgdXNlX3NzbCwgZXh0cmFfc2xlZXApKQorICAgICAgICAgICAgdGltZS5zbGVlcChleHRyYV9zbGVlcCkKKyAgICAgICAgc2lnID0gc2lnbmFsLlNJR0tJTEwgaWYgcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnIGVsc2Ugc2lnbmFsLlNJR0FCUlQKKyAgICAgICAgb3Mua2lsbChzZXJ2ZXJwcm9jLnBpZCwgc2lnKQorICAgICAgICBzZXJ2ZXJwcm9jLndhaXQoKQorCisKK2NsYXNzIFRlc3RDYXNlcyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZW5iYXNlLCBsaWJkaXIsIHBvcnQsIGdlbmRpcnMsIHNlcnZlcnMsIHZlcmJvc2UpOgorICAgICAgICBzZWxmLmdlbmJhc2UgPSBnZW5iYXNlCisgICAgICAgIHNlbGYubGliZGlyID0gbGliZGlyCisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorICAgICAgICBzZWxmLmdlbmRpcnMgPSBnZW5kaXJzCisgICAgICAgIHNlbGYuc2VydmVycyA9IHNlcnZlcnMKKworICAgIGRlZiBkZWZhdWx0X2NvbmYoc2VsZik6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnZ2VuZGlyJzogc2VsZi5nZW5kaXJzWzBdLAorICAgICAgICAgICAgJ3NlcnZlcic6IHNlbGYuc2VydmVyc1swXSwKKyAgICAgICAgICAgICdwcm90byc6IFBST1RPU1swXSwKKyAgICAgICAgICAgICd6bGliJzogRmFsc2UsCisgICAgICAgICAgICAnc3NsJzogRmFsc2UsCisgICAgICAgIH0KKworICAgIGRlZiBydW4oc2VsZiwgY29uZiwgdGVzdF9jb3VudCk6CisgICAgICAgIHdpdGhfemxpYiA9IGNvbmZbJ3psaWInXQorICAgICAgICB3aXRoX3NzbCA9IGNvbmZbJ3NzbCddCisgICAgICAgIHRyeV9zZXJ2ZXIgPSBjb25mWydzZXJ2ZXInXQorICAgICAgICB0cnlfcHJvdG8gPSBjb25mWydwcm90byddCisgICAgICAgIGdlbnB5ZGlyID0gY29uZlsnZ2VuZGlyJ10KICAgICAgICAgIyBza2lwIGFueSBzZXJ2ZXJzIHRoYXQgZG9uJ3Qgd29yayB3aXRoIHRoZSBabGliIHRyYW5zcG9ydAogICAgICAgICBpZiB3aXRoX3psaWIgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9aTElCOgotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZvciB3aXRoX3NzbCBpbiAoRmFsc2UsIFRydWUpOgotICAgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCBTU0wKLSAgICAgICAgICBpZiB3aXRoX3NzbCBhbmQgdHJ5X3NlcnZlciBpbiBTS0lQX1NTTDoKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgdGVzdF9jb3VudCArPSAxCi0gICAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICAgICAgICAgIHByaW50ICdcblRlc3QgcnVuICMlZDogIChpbmNsdWRlcyAlcykgU2VydmVyPSVzLCAgUHJvdG89JXMsICB6bGliPSVzLCAgU1NMPSVzJyAlICh0ZXN0X2NvdW50LCBnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCB3aXRoX3psaWIsIHdpdGhfc3NsKQotICAgICAgICAgIHJ1blNlcnZpY2VUZXN0KGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIG9wdGlvbnMucG9ydCwgd2l0aF96bGliLCB3aXRoX3NzbCkKLSAgICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwOgotICAgICAgICAgICAgcHJpbnQgJ09LOiBGaW5pc2hlZCAoaW5jbHVkZXMgJXMpICAlcyAvICVzIHByb3RvIC8gemxpYj0lcyAvIFNTTD0lcy4gICAlZCBjb21iaW5hdGlvbnMgdGVzdGVkLicgJSAoZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCwgdGVzdF9jb3VudCkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAjIHNraXAgYW55IHNlcnZlcnMgdGhhdCBkb24ndCB3b3JrIHdpdGggU1NMCisgICAgICAgIGlmIHdpdGhfc3NsIGFuZCB0cnlfc2VydmVyIGluIFNLSVBfU1NMOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDA6CisgICAgICAgICAgICBwcmludCgnXG5UZXN0IHJ1biAjJWQ6ICAoaW5jbHVkZXMgJXMpIFNlcnZlcj0lcywgIFByb3RvPSVzLCAgemxpYj0lcywgIFNTTD0lcycKKyAgICAgICAgICAgICAgICAgICUgKHRlc3RfY291bnQsIGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wpKQorICAgICAgICBydW5TZXJ2aWNlVGVzdChzZWxmLmxpYmRpciwgc2VsZi5nZW5iYXNlLCBnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCBzZWxmLnBvcnQsIHdpdGhfemxpYiwgd2l0aF9zc2wsIHNlbGYudmVyYm9zZSkKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMDoKKyAgICAgICAgICAgIHByaW50KCdPSzogRmluaXNoZWQgKGluY2x1ZGVzICVzKSAgJXMgLyAlcyBwcm90byAvIHpsaWI9JXMgLyBTU0w9JXMuICAgJWQgY29tYmluYXRpb25zIHRlc3RlZC4nCisgICAgICAgICAgICAgICAgICAlIChnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCB3aXRoX3psaWIsIHdpdGhfc3NsLCB0ZXN0X2NvdW50KSkKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB0ZXN0X2ZlYXR1cmUoc2VsZiwgbmFtZSwgdmFsdWVzKToKKyAgICAgICAgdGVzdF9jb3VudCA9IDAKKyAgICAgICAgY29uZiA9IHNlbGYuZGVmYXVsdF9jb25mKCkKKyAgICAgICAgZm9yIHRyeV9zZXJ2ZXIgaW4gdmFsdWVzOgorICAgICAgICAgICAgY29uZltuYW1lXSA9IHRyeV9zZXJ2ZXIKKyAgICAgICAgICAgIGlmIHNlbGYucnVuKGNvbmYsIHRlc3RfY291bnQpOgorICAgICAgICAgICAgICAgIHRlc3RfY291bnQgKz0gMQorICAgICAgICByZXR1cm4gdGVzdF9jb3VudAorCisgICAgZGVmIHJ1bl9hbGxfdGVzdHMoc2VsZik6CisgICAgICAgIHRlc3RfY291bnQgPSAwCisgICAgICAgIGZvciB0cnlfc2VydmVyIGluIHNlbGYuc2VydmVyczoKKyAgICAgICAgICAgIGZvciBnZW5weWRpciBpbiBzZWxmLmdlbmRpcnM6CisgICAgICAgICAgICAgICAgZm9yIHRyeV9wcm90byBpbiBQUk9UT1M6CisgICAgICAgICAgICAgICAgICAgIGZvciB3aXRoX3psaWIgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCB0aGUgWmxpYiB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHdpdGhfemxpYiBhbmQgdHJ5X3NlcnZlciBpbiBTS0lQX1pMSUI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB3aXRoX3NzbCBpbiAoRmFsc2UsIFRydWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCBTU0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB3aXRoX3NzbCBhbmQgdHJ5X3NlcnZlciBpbiBTS0lQX1NTTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2NvdW50ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnXG5UZXN0IHJ1biAjJWQ6ICAoaW5jbHVkZXMgJXMpIFNlcnZlcj0lcywgIFByb3RvPSVzLCAgemxpYj0lcywgIFNTTD0lcycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodGVzdF9jb3VudCwgZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU2VydmljZVRlc3Qoc2VsZi5saWJkaXIsIHNlbGYuZ2VuYmFzZSwgZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgc2VsZi5wb3J0LCB3aXRoX3psaWIsIHdpdGhfc3NsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCdPSzogRmluaXNoZWQgKGluY2x1ZGVzICVzKSAgJXMgLyAlcyBwcm90byAvIHpsaWI9JXMgLyBTU0w9JXMuICAgJWQgY29tYmluYXRpb25zIHRlc3RlZC4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wsIHRlc3RfY291bnQpKQorICAgICAgICByZXR1cm4gdGVzdF9jb3VudAorCisKK2RlZiBtYWluKCk6CisgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1hbGwnLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSdhbGwnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlycycsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlycycsCisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nZGVmYXVsdCxzbG90cyxvbGRzdHlsZSxub191dGY4c3RyaW5ncyxkeW5hbWljLGR5bmFtaWNzbG90cycsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlyZWN0b3J5IGV4dGVuc2lvbnMgZm9yIGdlbmVyYXRlZCBjb2RlLCB1c2VkIGFzIHN1ZmZpeGVzIGZvciBcImdlbi1weS0qXCIgYWRkZWQgc3lzLnBhdGggZm9yIGluZGl2aWR1YWwgdGVzdHMnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXBvcnQiLCB0eXBlPSJpbnQiLCBkZXN0PSJwb3J0IiwgZGVmYXVsdD05MDkwLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InBvcnQgbnVtYmVyIGZvciBzZXJ2ZXIgdG8gbGlzdGVuIG9uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctcScsICctLXF1aWV0JywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctTCcsICctLWxpYmRpcicsIGRlc3Q9ImxpYmRpciIsIGRlZmF1bHQ9bG9jYWxfbGlicGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImRpcmVjdG9yeSBwYXRoIHRoYXQgY29udGFpbnMgVGhyaWZ0IFB5dGhvbiBsaWJyYXJ5IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nZW4tYmFzZScsIGRlc3Q9Imdlbl9iYXNlIiwgZGVmYXVsdD1TQ1JJUFRfRElSLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImRpcmVjdG9yeSBwYXRoIHRoYXQgY29udGFpbnMgVGhyaWZ0IFB5dGhvbiBsaWJyYXJ5IikKKyAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKHZlcmJvc2U9MSkKKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgZ2VuZXJhdGVkX2RpcnMgPSBbXQorICAgIGZvciBncF9kaXIgaW4gb3B0aW9ucy5nZW5weWRpcnMuc3BsaXQoJywnKToKKyAgICAgICAgZ2VuZXJhdGVkX2RpcnMuYXBwZW5kKCdnZW4tcHktJXMnICUgKGdwX2RpcikpCisKKyAgICAjIGNvbW1hbmRsaW5lIHBlcm1pdHMgYSBzaW5nbGUgY2xhc3MgbmFtZSB0byBiZSBzcGVjaWZpZWQgdG8gb3ZlcnJpZGUgU0VSVkVSUz1bLi4uXQorICAgIHNlcnZlcnMgPSBkZWZhdWx0X3NlcnZlcnMoKQorICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICBpZiBhcmdzWzBdIGluIHNlcnZlcnM6CisgICAgICAgICAgICBzZXJ2ZXJzID0gYXJncworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoJ1VuYXZhaWxhYmxlIHNlcnZlciB0eXBlICIlcyIsIHBsZWFzZSBjaG9vc2Ugb25lIG9mOiAlcycgJSAoYXJnc1swXSwgc2VydmVycykpCisgICAgICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgdGVzdHMgPSBUZXN0Q2FzZXMob3B0aW9ucy5nZW5fYmFzZSwgb3B0aW9ucy5saWJkaXIsIG9wdGlvbnMucG9ydCwgZ2VuZXJhdGVkX2RpcnMsIHNlcnZlcnMsIG9wdGlvbnMudmVyYm9zZSkKKworICAgICMgcnVuIHRlc3RzIHdpdGhvdXQgYSBjbGllbnQvc2VydmVyIGZpcnN0CisgICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0nKQorICAgIHByaW50KCcgRXhlY3V0aW5nIGluZGl2aWR1YWwgdGVzdCBzY3JpcHRzIHdpdGggdmFyaW91cyBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcycpCisgICAgcHJpbnQoJyBEaXJlY3RvcmllcyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oZ2VuZXJhdGVkX2RpcnMpKQorICAgIHByaW50KCcgU2NyaXB0cyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oU0NSSVBUUykpCisgICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0nKQorICAgIGZvciBnZW5weWRpciBpbiBnZW5lcmF0ZWRfZGlyczoKKyAgICAgICAgZm9yIHNjcmlwdCBpbiBTQ1JJUFRTOgorICAgICAgICAgICAgcnVuU2NyaXB0VGVzdChvcHRpb25zLmxpYmRpciwgb3B0aW9ucy5nZW5fYmFzZSwgZ2VucHlkaXIsIHNjcmlwdCkKKworICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tJykKKyAgICBwcmludCgnIEV4ZWN1dGluZyBDbGllbnQvU2VydmVyIHRlc3RzIHdpdGggdmFyaW91cyBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcycpCisgICAgcHJpbnQoJyBTZXJ2ZXJzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihzZXJ2ZXJzKSkKKyAgICBwcmludCgnIERpcmVjdG9yaWVzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihnZW5lcmF0ZWRfZGlycykpCisgICAgcHJpbnQoJyBQcm90b2NvbHMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKFBST1RPUykpCisgICAgcHJpbnQoJyBPcHRpb25zIHRvIGJlIHRlc3RlZDogWkxJQih5ZXMvbm8pLCBTU0woeWVzL25vKScpCisgICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0nKQorCisgICAgaWYgb3B0aW9ucy5hbGw6CisgICAgICAgIHRlc3RzLnJ1bl9hbGxfdGVzdHMoKQorICAgIGVsc2U6CisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgnZ2VuZGlyJywgZ2VuZXJhdGVkX2RpcnMpCisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgnc2VydmVyJywgc2VydmVycykKKyAgICAgICAgdGVzdHMudGVzdF9mZWF0dXJlKCdwcm90bycsIFBST1RPUykKKyAgICAgICAgdGVzdHMudGVzdF9mZWF0dXJlKCd6bGliJywgW0ZhbHNlLCBUcnVlXSkKKyAgICAgICAgdGVzdHMudGVzdF9mZWF0dXJlKCdzc2wnLCBbRmFsc2UsIFRydWVdKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9TZXJpYWxpemF0aW9uVGVzdC5weSBiL3Rlc3QvcHkvU2VyaWFsaXphdGlvblRlc3QucHkKaW5kZXggNDBhNTJlNi4uZWY3OTgzNSAxMDA3NTUKLS0tIGEvdGVzdC9weS9TZXJpYWxpemF0aW9uVGVzdC5weQorKysgYi90ZXN0L3B5L1NlcmlhbGl6YXRpb25UZXN0LnB5CkBAIC0xOSwzNTMgKzE5LDQzOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsIGRlZmF1bHQ9J2dlbi1weScpCi1vcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQotZGVsIHN5cy5hcmd2WzE6XSAjIGNsZWFuIHVwIGhhY2sgc28gdW5pdHRlc3QgZG9lc24ndCBjb21wbGFpbgotc3lzLnBhdGguaW5zZXJ0KDAsIG9wdGlvbnMuZ2VucHlkaXIpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICgKKyAgICBCb25rLAorICAgIEJvb2xzLAorICAgIExhcmdlRGVsdGFzLAorICAgIExpc3RCb25rcywKKyAgICBOZXN0ZWRMaXN0c0JvbmssCisgICAgTmVzdGVkTGlzdHNJMzJ4MiwKKyAgICBOZXN0ZWRMaXN0c0kzMngzLAorICAgIE5lc3RlZE1peGVkeDIsCisgICAgTnVtYmVyeiwKKyAgICBWZXJzaW9uaW5nVGVzdFYxLAorICAgIFZlcnNpb25pbmdUZXN0VjIsCisgICAgWHRydWN0LAorICAgIFh0cnVjdDIsCispCiAKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgUmVjVHJlZQorZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBSZWNMaXN0Citmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IENvUmVjCitmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IENvUmVjMgorZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBWZWN0b3JUZXN0CiBmcm9tIERlYnVnUHJvdG9UZXN0LnR0eXBlcyBpbXBvcnQgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCwgRW1wdHkKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUQ29tcGFjdFByb3RvY29sLCBUSlNPTlByb3RvY29sCiBmcm9tIHRocmlmdC5UU2VyaWFsaXphdGlvbiBpbXBvcnQgc2VyaWFsaXplLCBkZXNlcmlhbGl6ZQoraW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgdGltZQorCiAKIGNsYXNzIEFic3RyYWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgc2VsZi52MW9iaiA9IFZlcnNpb25pbmdUZXN0VjEoCi0gICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKLSAgICAgICAgICBvbGRfc3RyaW5nPSdhYWEnLAotICAgICAgICAgIGVuZF9pbl9ib3RoPTU0MzIxLAotICAgICAgICAgICkKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudjFvYmogPSBWZXJzaW9uaW5nVGVzdFYxKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG9sZF9zdHJpbmc9J2FhYScsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKKyAgICAgICAgKQogCi0gICAgICBzZWxmLnYyb2JqID0gVmVyc2lvbmluZ1Rlc3RWMigKLSAgICAgICAgICBiZWdpbl9pbl9ib3RoPTEyMzQ1LAotICAgICAgICAgIG5ld2ludD0xLAotICAgICAgICAgIG5ld2J5dGU9MiwKLSAgICAgICAgICBuZXdzaG9ydD0zLAotICAgICAgICAgIG5ld2xvbmc9NCwKLSAgICAgICAgICBuZXdkb3VibGU9NS4wLAotICAgICAgICAgIG5ld3N0cnVjdD1Cb25rKG1lc3NhZ2U9IkhlbGxvISIsIHR5cGU9MTIzKSwKLSAgICAgICAgICBuZXdsaXN0PVs3LDgsOV0sCi0gICAgICAgICAgbmV3c2V0PXNldChbNDIsMSw4XSksCi0gICAgICAgICAgbmV3bWFwPXsxOjIsMjozfSwKLSAgICAgICAgICBuZXdzdHJpbmc9IkhvbGEhIiwKLSAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKLSAgICAgICAgICApCisgICAgICAgIHNlbGYudjJvYmogPSBWZXJzaW9uaW5nVGVzdFYyKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG5ld2ludD0xLAorICAgICAgICAgICAgbmV3Ynl0ZT0yLAorICAgICAgICAgICAgbmV3c2hvcnQ9MywKKyAgICAgICAgICAgIG5ld2xvbmc9NCwKKyAgICAgICAgICAgIG5ld2RvdWJsZT01LjAsCisgICAgICAgICAgICBuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSJIZWxsbyEiLCB0eXBlPTEyMyksCisgICAgICAgICAgICBuZXdsaXN0PVs3LCA4LCA5XSwKKyAgICAgICAgICAgIG5ld3NldD1zZXQoWzQyLCAxLCA4XSksCisgICAgICAgICAgICBuZXdtYXA9ezE6IDIsIDI6IDN9LAorICAgICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKKyAgICAgICAgKQogCi0gICAgICBzZWxmLmJvb2xzID0gQm9vbHMoaW1fdHJ1ZT1UcnVlLCBpbV9mYWxzZT1GYWxzZSkKLSAgICAgIHNlbGYuYm9vbHNfZmxpcHBlZCA9IEJvb2xzKGltX3RydWU9RmFsc2UsIGltX2ZhbHNlPVRydWUpCisgICAgICAgIHNlbGYuYm9vbHMgPSBCb29scyhpbV90cnVlPVRydWUsIGltX2ZhbHNlPUZhbHNlKQorICAgICAgICBzZWxmLmJvb2xzX2ZsaXBwZWQgPSBCb29scyhpbV90cnVlPUZhbHNlLCBpbV9mYWxzZT1UcnVlKQogCi0gICAgICBzZWxmLmxhcmdlX2RlbHRhcyA9IExhcmdlRGVsdGFzICgKLSAgICAgICAgICBiMT1zZWxmLmJvb2xzLAotICAgICAgICAgIGIxMD1zZWxmLmJvb2xzX2ZsaXBwZWQsCi0gICAgICAgICAgYjEwMD1zZWxmLmJvb2xzLAotICAgICAgICAgIGNoZWNrX3RydWU9VHJ1ZSwKLSAgICAgICAgICBiMTAwMD1zZWxmLmJvb2xzX2ZsaXBwZWQsCi0gICAgICAgICAgY2hlY2tfZmFsc2U9RmFsc2UsCi0gICAgICAgICAgdmVydHdvMjAwMD1WZXJzaW9uaW5nVGVzdFYyKG5ld3N0cnVjdD1Cb25rKG1lc3NhZ2U9J1dvcmxkIScsIHR5cGU9MzE0KSksCi0gICAgICAgICAgYV9zZXQyNTAwPXNldChbJ2xhenknLCAnYnJvd24nLCAnY293J10pLAotICAgICAgICAgIHZlcnR3bzMwMDA9VmVyc2lvbmluZ1Rlc3RWMihuZXdzZXQ9c2V0KFsyLCAzLCA1LCA3LCAxMV0pKSwKLSAgICAgICAgICBiaWdfbnVtYmVycz1bMioqOCwgMioqMTYsIDIqKjMxLTEsIC0oMioqMzEtMSldCi0gICAgICAgICAgKQorICAgICAgICBzZWxmLmxhcmdlX2RlbHRhcyA9IExhcmdlRGVsdGFzKAorICAgICAgICAgICAgYjE9c2VsZi5ib29scywKKyAgICAgICAgICAgIGIxMD1zZWxmLmJvb2xzX2ZsaXBwZWQsCisgICAgICAgICAgICBiMTAwPXNlbGYuYm9vbHMsCisgICAgICAgICAgICBjaGVja190cnVlPVRydWUsCisgICAgICAgICAgICBiMTAwMD1zZWxmLmJvb2xzX2ZsaXBwZWQsCisgICAgICAgICAgICBjaGVja19mYWxzZT1GYWxzZSwKKyAgICAgICAgICAgIHZlcnR3bzIwMDA9VmVyc2lvbmluZ1Rlc3RWMihuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSdXb3JsZCEnLCB0eXBlPTMxNCkpLAorICAgICAgICAgICAgYV9zZXQyNTAwPXNldChbJ2xhenknLCAnYnJvd24nLCAnY293J10pLAorICAgICAgICAgICAgdmVydHdvMzAwMD1WZXJzaW9uaW5nVGVzdFYyKG5ld3NldD1zZXQoWzIsIDMsIDUsIDcsIDExXSkpLAorICAgICAgICAgICAgYmlnX251bWJlcnM9WzIgKiogOCwgMiAqKiAxNiwgMiAqKiAzMSAtIDEsIC0oMiAqKiAzMSAtIDEpXQorICAgICAgICApCiAKLSAgICAgIHNlbGYuY29tcGFjdF9zdHJ1Y3QgPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KAotICAgICAgICAgIGFfYnl0ZSA9IDEyNywKLSAgICAgICAgICBhX2kxNj0zMjAwMCwKLSAgICAgICAgICBhX2kzMj0xMDAwMDAwMDAwLAotICAgICAgICAgIGFfaTY0PTB4ZmZmZmZmZmZmZiwKLSAgICAgICAgICBhX2RvdWJsZT01LjY3ODksCi0gICAgICAgICAgYV9zdHJpbmc9Im15IHN0cmluZyIsCi0gICAgICAgICAgdHJ1ZV9maWVsZD1UcnVlLAotICAgICAgICAgIGZhbHNlX2ZpZWxkPUZhbHNlLAotICAgICAgICAgIGVtcHR5X3N0cnVjdF9maWVsZD1FbXB0eSgpLAotICAgICAgICAgIGJ5dGVfbGlzdD1bLTEyNywgLTEsIDAsIDEsIDEyN10sCi0gICAgICAgICAgaTE2X2xpc3Q9Wy0xLCAwLCAxLCAweDdmZmZdLAotICAgICAgICAgIGkzMl9saXN0PSBbLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4N2ZmZmZmZmZdLAotICAgICAgICAgIGk2NF9saXN0PVstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmZmZiwgMHg3ZmZmZmZmZmZmZmZmZmZmXSwKLSAgICAgICAgICBkb3VibGVfbGlzdD1bMC4xLCAwLjIsIDAuM10sCi0gICAgICAgICAgc3RyaW5nX2xpc3Q9WyJmaXJzdCIsICJzZWNvbmQiLCAidGhpcmQiXSwKLSAgICAgICAgICBib29sZWFuX2xpc3Q9W1RydWUsIFRydWUsIFRydWUsIEZhbHNlLCBGYWxzZSwgRmFsc2VdLAotICAgICAgICAgIHN0cnVjdF9saXN0PVtFbXB0eSgpLCBFbXB0eSgpXSwKLSAgICAgICAgICBieXRlX3NldD1zZXQoWy0xMjcsIC0xLCAwLCAxLCAxMjddKSwKLSAgICAgICAgICBpMTZfc2V0PXNldChbLTEsIDAsIDEsIDB4N2ZmZl0pLAotICAgICAgICAgIGkzMl9zZXQ9c2V0KFsxLCAyLCAzXSksCi0gICAgICAgICAgaTY0X3NldD1zZXQoWy0xLCAwLCAweGZmLCAweGZmZmYsIDB4ZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZmZmLCAweDdmZmZmZmZmZmZmZmZmZmZdKSwKLSAgICAgICAgICBkb3VibGVfc2V0PXNldChbMC4xLCAwLjIsIDAuM10pLAotICAgICAgICAgIHN0cmluZ19zZXQ9c2V0KFsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIl0pLAotICAgICAgICAgIGJvb2xlYW5fc2V0PXNldChbVHJ1ZSwgRmFsc2VdKSwKLSAgICAgICAgICAjc3RydWN0X3NldD1zZXQoW0VtcHR5KCldKSwgIyB1bmhhc2hhYmxlIGluc3RhbmNlCi0gICAgICAgICAgYnl0ZV9ieXRlX21hcD17MSA6IDJ9LAotICAgICAgICAgIGkxNl9ieXRlX21hcD17MSA6IDEsIC0xIDogMSwgMHg3ZmZmIDogMX0sCi0gICAgICAgICAgaTMyX2J5dGVfbWFwPXsxIDogMSwgLTEgOiAxLCAweDdmZmZmZmZmIDogMX0sCi0gICAgICAgICAgaTY0X2J5dGVfbWFwPXswIDogMSwgIDEgOiAxLCAtMSA6IDEsIDB4N2ZmZmZmZmZmZmZmZmZmZiA6IDF9LAotICAgICAgICAgIGRvdWJsZV9ieXRlX21hcD17LTEuMSA6IDEsIDEuMSA6IDF9LAotICAgICAgICAgIHN0cmluZ19ieXRlX21hcD17ImZpcnN0IiA6IDEsICJzZWNvbmQiIDogMiwgInRoaXJkIiA6IDMsICIiIDogMH0sCi0gICAgICAgICAgYm9vbGVhbl9ieXRlX21hcD17VHJ1ZSA6IDEsIEZhbHNlOiAwfSwKLSAgICAgICAgICBieXRlX2kxNl9tYXA9ezEgOiAxLCAyIDogLTEsIDMgOiAweDdmZmZ9LAotICAgICAgICAgIGJ5dGVfaTMyX21hcD17MSA6IDEsIDIgOiAtMSwgMyA6IDB4N2ZmZmZmZmZ9LAotICAgICAgICAgIGJ5dGVfaTY0X21hcD17MSA6IDEsIDIgOiAtMSwgMyA6IDB4N2ZmZmZmZmZmZmZmZmZmZn0sCi0gICAgICAgICAgYnl0ZV9kb3VibGVfbWFwPXsxIDogMC4xLCAyIDogLTAuMSwgMyA6IDEwMDAwMDAuMX0sCi0gICAgICAgICAgYnl0ZV9zdHJpbmdfbWFwPXsxIDogIiIsIDIgOiAiYmxhaCIsIDMgOiAibG9vb29vb29vb29vb29vbmcgc3RyaW5nIn0sCi0gICAgICAgICAgYnl0ZV9ib29sZWFuX21hcD17MSA6IFRydWUsIDIgOiBGYWxzZX0sCi0gICAgICAgICAgI2xpc3RfYnl0ZV9tYXAgIyB1bmhhc2hhYmxlCi0gICAgICAgICAgI3NldF9ieXRlX21hcD17c2V0KFsxLCAyLCAzXSkgOiAxLCBzZXQoWzAsIDFdKSA6IDIsIHNldChbXSkgOiAwfSwgIyB1bmhhc2hhYmxlCi0gICAgICAgICAgI21hcF9ieXRlX21hcCAjIHVuaGFzaGFibGUKLSAgICAgICAgICBieXRlX21hcF9tYXA9ezAgOiB7fSwgMSA6IHsxIDogMX0sIDIgOiB7MSA6IDEsIDIgOiAyfX0sCi0gICAgICAgICAgYnl0ZV9zZXRfbWFwPXswIDogc2V0KFtdKSwgMSA6IHNldChbMV0pLCAyIDogc2V0KFsxLCAyXSl9LAotICAgICAgICAgIGJ5dGVfbGlzdF9tYXA9ezAgOiBbXSwgMSA6IFsxXSwgMiA6IFsxLCAyXX0sCi0gICAgICAgICAgKQorICAgICAgICBzZWxmLmNvbXBhY3Rfc3RydWN0ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgKKyAgICAgICAgICAgIGFfYnl0ZT0xMjcsCisgICAgICAgICAgICBhX2kxNj0zMjAwMCwKKyAgICAgICAgICAgIGFfaTMyPTEwMDAwMDAwMDAsCisgICAgICAgICAgICBhX2k2ND0weGZmZmZmZmZmZmYsCisgICAgICAgICAgICBhX2RvdWJsZT01LjY3ODksCisgICAgICAgICAgICBhX3N0cmluZz0ibXkgc3RyaW5nIiwKKyAgICAgICAgICAgIHRydWVfZmllbGQ9VHJ1ZSwKKyAgICAgICAgICAgIGZhbHNlX2ZpZWxkPUZhbHNlLAorICAgICAgICAgICAgZW1wdHlfc3RydWN0X2ZpZWxkPUVtcHR5KCksCisgICAgICAgICAgICBieXRlX2xpc3Q9Wy0xMjcsIC0xLCAwLCAxLCAxMjddLAorICAgICAgICAgICAgaTE2X2xpc3Q9Wy0xLCAwLCAxLCAweDdmZmZdLAorICAgICAgICAgICAgaTMyX2xpc3Q9Wy0xLCAwLCAweGZmLCAweGZmZmYsIDB4ZmZmZmZmLCAweDdmZmZmZmZmXSwKKyAgICAgICAgICAgIGk2NF9saXN0PVstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmZmZiwgMHg3ZmZmZmZmZmZmZmZmZmZmXSwKKyAgICAgICAgICAgIGRvdWJsZV9saXN0PVswLjEsIDAuMiwgMC4zXSwKKyAgICAgICAgICAgIHN0cmluZ19saXN0PVsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIl0sCisgICAgICAgICAgICBib29sZWFuX2xpc3Q9W1RydWUsIFRydWUsIFRydWUsIEZhbHNlLCBGYWxzZSwgRmFsc2VdLAorICAgICAgICAgICAgc3RydWN0X2xpc3Q9W0VtcHR5KCksIEVtcHR5KCldLAorICAgICAgICAgICAgYnl0ZV9zZXQ9c2V0KFstMTI3LCAtMSwgMCwgMSwgMTI3XSksCisgICAgICAgICAgICBpMTZfc2V0PXNldChbLTEsIDAsIDEsIDB4N2ZmZl0pLAorICAgICAgICAgICAgaTMyX3NldD1zZXQoWzEsIDIsIDNdKSwKKyAgICAgICAgICAgIGk2NF9zZXQ9c2V0KFstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmZmZiwgMHg3ZmZmZmZmZmZmZmZmZmZmXSksCisgICAgICAgICAgICBkb3VibGVfc2V0PXNldChbMC4xLCAwLjIsIDAuM10pLAorICAgICAgICAgICAgc3RyaW5nX3NldD1zZXQoWyJmaXJzdCIsICJzZWNvbmQiLCAidGhpcmQiXSksCisgICAgICAgICAgICBib29sZWFuX3NldD1zZXQoW1RydWUsIEZhbHNlXSksCisgICAgICAgICAgICAjIHN0cnVjdF9zZXQ9c2V0KFtFbXB0eSgpXSksICMgdW5oYXNoYWJsZSBpbnN0YW5jZQorICAgICAgICAgICAgYnl0ZV9ieXRlX21hcD17MTogMn0sCisgICAgICAgICAgICBpMTZfYnl0ZV9tYXA9ezE6IDEsIC0xOiAxLCAweDdmZmY6IDF9LAorICAgICAgICAgICAgaTMyX2J5dGVfbWFwPXsxOiAxLCAtMTogMSwgMHg3ZmZmZmZmZjogMX0sCisgICAgICAgICAgICBpNjRfYnl0ZV9tYXA9ezA6IDEsIDE6IDEsIC0xOiAxLCAweDdmZmZmZmZmZmZmZmZmZmY6IDF9LAorICAgICAgICAgICAgZG91YmxlX2J5dGVfbWFwPXstMS4xOiAxLCAxLjE6IDF9LAorICAgICAgICAgICAgc3RyaW5nX2J5dGVfbWFwPXsiZmlyc3QiOiAxLCAic2Vjb25kIjogMiwgInRoaXJkIjogMywgIiI6IDB9LAorICAgICAgICAgICAgYm9vbGVhbl9ieXRlX21hcD17VHJ1ZTogMSwgRmFsc2U6IDB9LAorICAgICAgICAgICAgYnl0ZV9pMTZfbWFwPXsxOiAxLCAyOiAtMSwgMzogMHg3ZmZmfSwKKyAgICAgICAgICAgIGJ5dGVfaTMyX21hcD17MTogMSwgMjogLTEsIDM6IDB4N2ZmZmZmZmZ9LAorICAgICAgICAgICAgYnl0ZV9pNjRfbWFwPXsxOiAxLCAyOiAtMSwgMzogMHg3ZmZmZmZmZmZmZmZmZmZmfSwKKyAgICAgICAgICAgIGJ5dGVfZG91YmxlX21hcD17MTogMC4xLCAyOiAtMC4xLCAzOiAxMDAwMDAwLjF9LAorICAgICAgICAgICAgYnl0ZV9zdHJpbmdfbWFwPXsxOiAiIiwgMjogImJsYWgiLCAzOiAibG9vb29vb29vb29vb29vbmcgc3RyaW5nIn0sCisgICAgICAgICAgICBieXRlX2Jvb2xlYW5fbWFwPXsxOiBUcnVlLCAyOiBGYWxzZX0sCisgICAgICAgICAgICAjIGxpc3RfYnl0ZV9tYXAgIyB1bmhhc2hhYmxlCisgICAgICAgICAgICAjIHNldF9ieXRlX21hcD17c2V0KFsxLCAyLCAzXSkgOiAxLCBzZXQoWzAsIDFdKSA6IDIsIHNldChbXSkgOiAwfSwgIyB1bmhhc2hhYmxlCisgICAgICAgICAgICAjIG1hcF9ieXRlX21hcCAjIHVuaGFzaGFibGUKKyAgICAgICAgICAgIGJ5dGVfbWFwX21hcD17MDoge30sIDE6IHsxOiAxfSwgMjogezE6IDEsIDI6IDJ9fSwKKyAgICAgICAgICAgIGJ5dGVfc2V0X21hcD17MDogc2V0KFtdKSwgMTogc2V0KFsxXSksIDI6IHNldChbMSwgMl0pfSwKKyAgICAgICAgICAgIGJ5dGVfbGlzdF9tYXA9ezA6IFtdLCAxOiBbMV0sIDI6IFsxLCAyXX0sCisgICAgICAgICkKIAotICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIgPSBOZXN0ZWRMaXN0c0kzMngyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgMSwgMSwgMiBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAyLCA3LCA5IF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIDMsIDUsIDggXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBzZWxmLm5lc3RlZF9saXN0c19pMzJ4MiA9IE5lc3RlZExpc3RzSTMyeDIoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgWzEsIDEsIDJdLAorICAgICAgICAgICAgICAgIFsyLCA3LCA5XSwKKyAgICAgICAgICAgICAgICBbMywgNSwgOF0KKyAgICAgICAgICAgIF0KKyAgICAgICAgKQogCi0gICAgICBzZWxmLm5lc3RlZF9saXN0c19pMzJ4MyA9IE5lc3RlZExpc3RzSTMyeDMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIDIsIDcsIDkgXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAzLCA1LCA4IF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgMSwgMSwgMiBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIDEsIDQsIDkgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotCi0gICAgICBzZWxmLm5lc3RlZF9taXhlZHgyID0gTmVzdGVkTWl4ZWR4MiggaW50X3NldF9saXN0PVsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0KFsxLDIsM10pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQoWzEsNCw5XSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldChbMSwyLDMsNSw4LDEzLDIxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldChbLTEsIDAsIDFdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdGUsIHRoZSBzZXRzIGJlbG93IGFyZSBzZXRzIG9mIGNoYXJzLCBzaW5jZSB0aGUgc3RyaW5ncyBhcmUgaXRlcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ludF9zdHJzZXQ9eyAxMDpzZXQoJ2FiYycpLCAyMDpzZXQoJ2RlZicpLCAzMDpzZXQoJ0dISScpIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9pbnRfc3Ryc2V0X2xpc3Q9WwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDEwOnNldCgnYWJjJyksIDIwOnNldCgnZGVmJyksIDMwOnNldCgnR0hJJykgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxMDA6c2V0KCdsbW4nKSwgMjAwOnNldCgnb3BxJyksIDMwMDpzZXQoJ1JTVCcpIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMTAwMDpzZXQoJ3V2dycpLCAyMDAwOnNldCgnd3h5JyksIDMwMDA6c2V0KCdYWVonKSB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLQotICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uayA9IE5lc3RlZExpc3RzQm9uaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEgZmlyc3QnLCB0eXBlPTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQSBzZWNvbmQnLCB0eXBlPTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBCIGZpcnN0JywgdHlwZT0yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBCIHNlY29uZCcsIHR5cGU9MikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotCi0gICAgICBzZWxmLmxpc3RfYm9ua3MgPSBMaXN0Qm9ua3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQScsIHR5cGU9MSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQicsIHR5cGU9MiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQycsIHR5cGU9MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0KLSAgZGVmIF9zZXJpYWxpemUoc2VsZiwgb2JqKToKLSAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKLSAgICBvYmoud3JpdGUocHJvdCkKLSAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQotCi0gIGRlZiBfZGVzZXJpYWxpemUoc2VsZiwgb2JqdHlwZSwgZGF0YSk6Ci0gICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCi0gICAgcmV0ID0gb2JqdHlwZSgpCi0gICAgcmV0LnJlYWQocHJvdCkKLSAgICByZXR1cm4gcmV0Ci0KLSAgZGVmIHRlc3RGb3J3YXJkcyhzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52MW9iaikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmJlZ2luX2luX2JvdGgsIHNlbGYudjFvYmouYmVnaW5faW5fYm90aCkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouZW5kX2luX2JvdGgsIHNlbGYudjFvYmouZW5kX2luX2JvdGgpCi0KLSAgZGVmIHRlc3RCYWNrd2FyZHMoc2VsZik6Ci0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMSwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjJvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYyb2JqLmJlZ2luX2luX2JvdGgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmVuZF9pbl9ib3RoLCBzZWxmLnYyb2JqLmVuZF9pbl9ib3RoKQotCi0gIGRlZiB0ZXN0U2VyaWFsaXplVjEoc2VsZik6Ci0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMSwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjFvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi52MW9iaikKLQotICBkZWYgdGVzdFNlcmlhbGl6ZVYyKHNlbGYpOgotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYyb2JqKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYudjJvYmopCi0KLSAgZGVmIHRlc3RCb29scyhzZWxmKToKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhzZWxmLmJvb2xzLCBzZWxmLmJvb2xzX2ZsaXBwZWQpCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoc2VsZi5ib29scywgc2VsZi52MW9iaikKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShCb29scywgc2VsZi5fc2VyaWFsaXplKHNlbGYuYm9vbHMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5ib29scykKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShCb29scywgc2VsZi5fc2VyaWFsaXplKHNlbGYuYm9vbHNfZmxpcHBlZCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLmJvb2xzX2ZsaXBwZWQpCi0gICAgcmVwID0gcmVwcihzZWxmLmJvb2xzKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCi0KLSAgZGVmIHRlc3RMYXJnZURlbHRhcyhzZWxmKToKLSAgICAjIHRlc3QgbGFyZ2UgZmllbGQgZGVsdGFzIChtZWFuaW5nZnVsIGluIENvbXBhY3RQcm90byBvbmx5KQotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKExhcmdlRGVsdGFzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5sYXJnZV9kZWx0YXMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5sYXJnZV9kZWx0YXMpCi0gICAgcmVwID0gcmVwcihzZWxmLmxhcmdlX2RlbHRhcykKLSAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQotCi0gIGRlZiB0ZXN0TmVzdGVkTGlzdHNJMzJ4MihzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRMaXN0c0kzMngyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpCi0gICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19pMzJ4MikKLSAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQotCi0gIGRlZiB0ZXN0TmVzdGVkTGlzdHNJMzJ4MyhzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRMaXN0c0kzMngzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCi0gICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19pMzJ4MykKLSAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQotCi0gIGRlZiB0ZXN0TmVzdGVkTWl4ZWR4MihzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRNaXhlZHgyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbWl4ZWR4MikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLm5lc3RlZF9taXhlZHgyKQotICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbWl4ZWR4MikKLSAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQotCi0gIGRlZiB0ZXN0TmVzdGVkTGlzdHNCb25rKHNlbGYpOgotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzQm9uaywgc2VsZi5fc2VyaWFsaXplKHNlbGYubmVzdGVkX2xpc3RzX2JvbmspKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykKLSAgICByZXAgPSByZXByKHNlbGYubmVzdGVkX2xpc3RzX2JvbmspCi0gICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKLQotICBkZWYgdGVzdExpc3RCb25rcyhzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShMaXN0Qm9ua3MsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmxpc3RfYm9ua3MpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5saXN0X2JvbmtzKQotICAgIHJlcCA9IHJlcHIoc2VsZi5saXN0X2JvbmtzKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCi0KLSAgZGVmIHRlc3RDb21wYWN0U3RydWN0KHNlbGYpOgotICAgICMgdGVzdCBsYXJnZSBmaWVsZCBkZWx0YXMgKG1lYW5pbmdmdWwgaW4gQ29tcGFjdFByb3RvIG9ubHkpCi0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQ29tcGFjdFByb3RvVGVzdFN0cnVjdCwgc2VsZi5fc2VyaWFsaXplKHNlbGYuY29tcGFjdF9zdHJ1Y3QpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5jb21wYWN0X3N0cnVjdCkKLSAgICByZXAgPSByZXByKHNlbGYuY29tcGFjdF9zdHJ1Y3QpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKLQotICBkZWYgdGVzdEludGVnZXJMaW1pdHMoc2VsZik6Ci0gICAgYmFkX3ZhbHVlcyA9IFtDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfYnl0ZT0xMjgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfYnl0ZT0tMTI5KSwKLSAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMTY9MzI3NjgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTE2PS0zMjc2OSksCi0gICAgICAgICAgICAgICAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTMyPTIxNDc0ODM2NDgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTMyPS0yMTQ3NDgzNjQ5KSwKLSAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pNjQ9OTIyMzM3MjAzNjg1NDc3NTgwOCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pNjQ9LTkyMjMzNzIwMzY4NTQ3NzU4MDkpCisgICAgICAgIHNlbGYubmVzdGVkX2xpc3RzX2kzMngzID0gTmVzdGVkTGlzdHNJMzJ4MygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIFsyLCA3LCA5XSwKKyAgICAgICAgICAgICAgICAgICAgWzMsIDUsIDhdCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIFsxLCAxLCAyXSwKKyAgICAgICAgICAgICAgICAgICAgWzEsIDQsIDldCiAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgXQorICAgICAgICApCiAKLSAgICBmb3IgdmFsdWUgaW4gYmFkX3ZhbHVlczoKLSAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgc2VsZi5fc2VyaWFsaXplLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5uZXN0ZWRfbWl4ZWR4MiA9IE5lc3RlZE1peGVkeDIoaW50X3NldF9saXN0PVsKKyAgICAgICAgICAgIHNldChbMSwgMiwgM10pLAorICAgICAgICAgICAgc2V0KFsxLCA0LCA5XSksCisgICAgICAgICAgICBzZXQoWzEsIDIsIDMsIDUsIDgsIDEzLCAyMV0pLAorICAgICAgICAgICAgc2V0KFstMSwgMCwgMV0pCisgICAgICAgIF0sCisgICAgICAgICAgICAjIG5vdGUsIHRoZSBzZXRzIGJlbG93IGFyZSBzZXRzIG9mIGNoYXJzLCBzaW5jZSB0aGUgc3RyaW5ncyBhcmUgaXRlcmF0ZWQKKyAgICAgICAgICAgIG1hcF9pbnRfc3Ryc2V0PXsxMDogc2V0KCdhYmMnKSwgMjA6IHNldCgnZGVmJyksIDMwOiBzZXQoJ0dISScpfSwKKyAgICAgICAgICAgIG1hcF9pbnRfc3Ryc2V0X2xpc3Q9WworICAgICAgICAgICAgICAgIHsxMDogc2V0KCdhYmMnKSwgMjA6IHNldCgnZGVmJyksIDMwOiBzZXQoJ0dISScpfSwKKyAgICAgICAgICAgICAgICB7MTAwOiBzZXQoJ2xtbicpLCAyMDA6IHNldCgnb3BxJyksIDMwMDogc2V0KCdSU1QnKX0sCisgICAgICAgICAgICAgICAgezEwMDA6IHNldCgndXZ3JyksIDIwMDA6IHNldCgnd3h5JyksIDMwMDA6IHNldCgnWFlaJyl9XQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uayA9IE5lc3RlZExpc3RzQm9uaygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQSBmaXJzdCcsIHR5cGU9MSksCisgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEgc2Vjb25kJywgdHlwZT0xKQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEIgZmlyc3QnLCB0eXBlPTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBCIHNlY29uZCcsIHR5cGU9MikKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgICAgIHNlbGYubGlzdF9ib25rcyA9IExpc3RCb25rcygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEnLCB0eXBlPTEpLAorICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQicsIHR5cGU9MiksCisgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBDJywgdHlwZT0wKQorICAgICAgICAgICAgXQorICAgICAgICApCisKKyAgICBkZWYgX3NlcmlhbGl6ZShzZWxmLCBvYmopOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgIG9iai53cml0ZShwcm90KQorICAgICAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQorCisgICAgZGVmIF9kZXNlcmlhbGl6ZShzZWxmLCBvYmp0eXBlLCBkYXRhKToKKyAgICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCisgICAgICAgIHJldCA9IG9ianR5cGUoKQorICAgICAgICByZXQucmVhZChwcm90KQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgdGVzdEZvcndhcmRzKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52MW9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYxb2JqLmJlZ2luX2luX2JvdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5lbmRfaW5fYm90aCwgc2VsZi52MW9iai5lbmRfaW5fYm90aCkKKworICAgIGRlZiB0ZXN0QmFja3dhcmRzKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYxLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52Mm9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYyb2JqLmJlZ2luX2luX2JvdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5lbmRfaW5fYm90aCwgc2VsZi52Mm9iai5lbmRfaW5fYm90aCkKKworICAgIGRlZiB0ZXN0U2VyaWFsaXplVjEoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjEsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYxb2JqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLnYxb2JqKQorCisgICAgZGVmIHRlc3RTZXJpYWxpemVWMihzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMiwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjJvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYudjJvYmopCisKKyAgICBkZWYgdGVzdEJvb2xzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhzZWxmLmJvb2xzLCBzZWxmLmJvb2xzX2ZsaXBwZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKHNlbGYuYm9vbHMsIHNlbGYudjFvYmopCisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKEJvb2xzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5ib29scykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5ib29scykKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQm9vbHMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmJvb2xzX2ZsaXBwZWQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuYm9vbHNfZmxpcHBlZCkKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLmJvb2xzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3RMYXJnZURlbHRhcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGxhcmdlIGZpZWxkIGRlbHRhcyAobWVhbmluZ2Z1bCBpbiBDb21wYWN0UHJvdG8gb25seSkKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTGFyZ2VEZWx0YXMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmxhcmdlX2RlbHRhcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5sYXJnZV9kZWx0YXMpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5sYXJnZV9kZWx0YXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzSTMyeDIoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzSTMyeDIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9saXN0c19pMzJ4MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzSTMyeDMoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzSTMyeDMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9saXN0c19pMzJ4MykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZE1peGVkeDIoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZE1peGVkeDIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9taXhlZHgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLm5lc3RlZF9taXhlZHgyKQorICAgICAgICByZXAgPSByZXByKHNlbGYubmVzdGVkX21peGVkeDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzQm9uayhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTmVzdGVkTGlzdHNCb25rLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19ib25rKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3RMaXN0Qm9ua3Moc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKExpc3RCb25rcywgc2VsZi5fc2VyaWFsaXplKHNlbGYubGlzdF9ib25rcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5saXN0X2JvbmtzKQorICAgICAgICByZXAgPSByZXByKHNlbGYubGlzdF9ib25rcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0Q29tcGFjdFN0cnVjdChzZWxmKToKKyAgICAgICAgIyB0ZXN0IGxhcmdlIGZpZWxkIGRlbHRhcyAobWVhbmluZ2Z1bCBpbiBDb21wYWN0UHJvdG8gb25seSkKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQ29tcGFjdFByb3RvVGVzdFN0cnVjdCwgc2VsZi5fc2VyaWFsaXplKHNlbGYuY29tcGFjdF9zdHJ1Y3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuY29tcGFjdF9zdHJ1Y3QpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5jb21wYWN0X3N0cnVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0SW50ZWdlckxpbWl0cyhzZWxmKToKKyAgICAgICAgaWYgKHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgc3lzLnZlcnNpb25faW5mb1sxXSA8PSA2KToKKyAgICAgICAgICAgIHByaW50KCdTa2lwcGluZyB0ZXN0SW50ZWdlckxpbWl0cyBmb3IgUHl0aG9uIDIuNicpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYmFkX3ZhbHVlcyA9IFtDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfYnl0ZT0xMjgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfYnl0ZT0tMTI5KSwKKyAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTE2PTMyNzY4KSwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2kxNj0tMzI3NjkpLAorICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMzI9MjE0NzQ4MzY0OCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMzI9LTIxNDc0ODM2NDkpLAorICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pNjQ9OTIyMzM3MjAzNjg1NDc3NTgwOCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pNjQ9LTkyMjMzNzIwMzY4NTQ3NzU4MDkpCisgICAgICAgICAgICAgICAgICAgICAgXQorCisgICAgICAgIGZvciB2YWx1ZSBpbiBiYWRfdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uLCBzZWxmLl9zZXJpYWxpemUsIHZhbHVlKQorCisgICAgZGVmIHRlc3RSZWNUcmVlKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgcmVjdXJzaXZlIHRyZWUgbm9kZSBjYW4gYmUgY3JlYXRlZC4iIiIKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBmb3IgaWR4IGluIHJhbmdlKDEsIDUpOgorICAgICAgICAgICAgbm9kZSA9IFJlY1RyZWUoaXRlbT1pZHgsIGNoaWxkcmVuPU5vbmUpCisgICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmQobm9kZSkKKworICAgICAgICBwYXJlbnQgPSBSZWNUcmVlKGl0ZW09MCwgY2hpbGRyZW49Y2hpbGRyZW4pCisgICAgICAgIHNlcmRlX3BhcmVudCA9IHNlbGYuX2Rlc2VyaWFsaXplKFJlY1RyZWUsIHNlbGYuX3NlcmlhbGl6ZShwYXJlbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwLCBzZXJkZV9wYXJlbnQuaXRlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoNCwgbGVuKHNlcmRlX3BhcmVudC5jaGlsZHJlbikpCisgICAgICAgIGZvciBjaGlsZCBpbiBzZXJkZV9wYXJlbnQuY2hpbGRyZW46CisgICAgICAgICAgICAjIENhbm5vdCB1c2UgYXNzZXJ0SXNJbnN0YW5jZSBpbiBweXRob24gMi42PworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoY2hpbGQsIFJlY1RyZWUpKQorCisgICAgZGVmIF9idWlsZExpbmtlZExpc3Qoc2VsZik6CisgICAgICAgIGhlYWQgPSBjdXIgPSBSZWNMaXN0KGl0ZW09MCkKKyAgICAgICAgZm9yIGlkeCBpbiByYW5nZSgxLCA1KToKKyAgICAgICAgICAgIG5vZGUgPSBSZWNMaXN0KGl0ZW09aWR4KQorICAgICAgICAgICAgY3VyLm5leHRpdGVtID0gbm9kZQorICAgICAgICAgICAgY3VyID0gbm9kZQorICAgICAgICByZXR1cm4gaGVhZAorCisgICAgZGVmIF9jb2xsYXBzZUxpbmtlZExpc3Qoc2VsZiwgaGVhZCk6CisgICAgICAgIG91dF9saXN0ID0gW10KKyAgICAgICAgY3VyID0gaGVhZAorICAgICAgICB3aGlsZSBjdXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvdXRfbGlzdC5hcHBlbmQoY3VyLml0ZW0pCisgICAgICAgICAgICBjdXIgPSBjdXIubmV4dGl0ZW0KKyAgICAgICAgcmV0dXJuIG91dF9saXN0CisKKyAgICBkZWYgdGVzdFJlY0xpc3Qoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSByZWN1cnNpdmUgbGlua2VkIGxpc3QgY2FuIGJlIGNyZWF0ZWQuIiIiCisgICAgICAgIHJlY19saXN0ID0gc2VsZi5fYnVpbGRMaW5rZWRMaXN0KCkKKyAgICAgICAgc2VyZGVfbGlzdCA9IHNlbGYuX2Rlc2VyaWFsaXplKFJlY0xpc3QsIHNlbGYuX3NlcmlhbGl6ZShyZWNfbGlzdCkpCisgICAgICAgIG91dF9saXN0ID0gc2VsZi5fY29sbGFwc2VMaW5rZWRMaXN0KHNlcmRlX2xpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFswLCAxLCAyLCAzLCA0XSwgb3V0X2xpc3QpCisKKyAgICBkZWYgdGVzdENvUmVjKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgY28tcmVjdXJzaXZlIHN0cnVjdHVyZXMgY2FuIGJlIGNyZWF0ZWQuIiIiCisgICAgICAgIGl0ZW0xID0gQ29SZWMoKQorICAgICAgICBpdGVtMiA9IENvUmVjMigpCisKKyAgICAgICAgaXRlbTEub3RoZXIgPSBpdGVtMgorICAgICAgICBpdGVtMi5vdGhlciA9IGl0ZW0xCisKKyAgICAgICAgIyBOT1RFIFtlY29ubmVyNzI0LDIwMTctMDYtMjFdOiBUaGVzZSBvYmplY3RzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGFzIHNlcmlhbGl6YXRpb24KKyAgICAgICAgIyByZXN1bHRzIGluIGFuIGluZmluaXRlIGxvb3AuIGZidGhyaWZ0IGFsc28gc3VmZmVycyBmcm9tIHRoaXMKKyAgICAgICAgIyBwcm9ibGVtLgorCisgICAgZGVmIHRlc3RSZWNWZWN0b3Ioc2VsZik6CisgICAgICAgICIiIkVuc3VyZSBhIGxpc3Qgb2YgcmVjdXJzaXZlIG5vZGVzIGNhbiBiZSBjcmVhdGVkLiIiIgorICAgICAgICBteWxpc3QgPSBbc2VsZi5fYnVpbGRMaW5rZWRMaXN0KCksIHNlbGYuX2J1aWxkTGlua2VkTGlzdCgpXQorICAgICAgICBteXZlYyA9IFZlY3RvclRlc3QobGlzdGVyPW15bGlzdCkKKworICAgICAgICBzZXJkZV92ZWMgPSBzZWxmLl9kZXNlcmlhbGl6ZShWZWN0b3JUZXN0LCBzZWxmLl9zZXJpYWxpemUobXl2ZWMpKQorICAgICAgICBnb2xkZW5fbGlzdCA9IFswLCAxLCAyLCAzLCA0XQorICAgICAgICBmb3IgY3VyX2xpc3QgaW4gc2VyZGVfdmVjLmxpc3RlcjoKKyAgICAgICAgICAgIG91dF9saXN0ID0gc2VsZi5fY29sbGFwc2VMaW5rZWRMaXN0KGN1cl9saXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fbGlzdCwgb3V0X2xpc3QpCisKIAogY2xhc3MgTm9ybWFsQmluYXJ5VGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisKIAogY2xhc3MgQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCkKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkKKwogCiBjbGFzcyBDb21wYWN0UHJvdG9jb2xUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCisKKworY2xhc3MgQWNjZWxlcmF0ZWRDb21wYWN0VGVzdChBYnN0cmFjdFRlc3QpOgorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpCisKIAogY2xhc3MgSlNPTlByb3RvY29sVGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpCisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKQorCiAKIGNsYXNzIEFjY2VsZXJhdGVkRnJhbWVkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gIGRlZiB0ZXN0U3BsaXQoc2VsZik6Ci0gICAgIiIiVGVzdCBGcmFtZWRUcmFuc3BvcnQgYW5kIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKKyAgICBkZWYgdGVzdFNwbGl0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IEZyYW1lZFRyYW5zcG9ydCBhbmQgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAogCi0gICAgVGVzdHMgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgVEZyYW1lZFRyYW5zcG9ydAotICAgIHBsYXkgbmljZWx5IHRvZ2V0aGVyIHdoZW4gYSByZWFkIHNwYW5zIGEgZnJhbWUiIiIKKyAgICAgICAgVGVzdHMgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgVEZyYW1lZFRyYW5zcG9ydAorICAgICAgICBwbGF5IG5pY2VseSB0b2dldGhlciB3aGVuIGEgcmVhZCBzcGFucyBhIGZyYW1lIiIiCiAKLSAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCi0gICAgYmlnc3RyaW5nID0gIiIuam9pbihjaHIoYnl0ZSkgZm9yIGJ5dGUgaW4gcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpKQorICAgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCisgICAgICAgIGJpZ3N0cmluZyA9ICIiLmpvaW4oY2hyKGJ5dGUpIGZvciBieXRlIGluIHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSArIDEpKQogCi0gICAgZGF0YWJ1ZiA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgcHJvdCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woZGF0YWJ1ZikKLSAgICBwcm90LndyaXRlSTMyKDQyKQotICAgIHByb3Qud3JpdGVTdHJpbmcoYmlnc3RyaW5nKQotICAgIHByb3Qud3JpdGVJMTYoMjQpCi0gICAgZGF0YSA9IGRhdGFidWYuZ2V0dmFsdWUoKQotICAgIGN1dHBvaW50ID0gbGVuKGRhdGEpLzIKLSAgICBwYXJ0cyA9IFsgZGF0YVs6Y3V0cG9pbnRdLCBkYXRhW2N1dHBvaW50Ol0gXQorICAgICAgICBkYXRhYnVmID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woZGF0YWJ1ZikKKyAgICAgICAgcHJvdC53cml0ZUkzMig0MikKKyAgICAgICAgcHJvdC53cml0ZVN0cmluZyhiaWdzdHJpbmcpCisgICAgICAgIHByb3Qud3JpdGVJMTYoMjQpCisgICAgICAgIGRhdGEgPSBkYXRhYnVmLmdldHZhbHVlKCkKKyAgICAgICAgY3V0cG9pbnQgPSBsZW4oZGF0YSkgLy8gMgorICAgICAgICBwYXJ0cyA9IFtkYXRhWzpjdXRwb2ludF0sIGRhdGFbY3V0cG9pbnQ6XV0KIAotICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIGZyYW1lZF93cml0ZXIgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoZnJhbWVkX2J1ZmZlcikKLSAgICBmb3IgcGFydCBpbiBwYXJ0czoKLSAgICAgIGZyYW1lZF93cml0ZXIud3JpdGUocGFydCkKLSAgICAgIGZyYW1lZF93cml0ZXIuZmx1c2goKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihmcmFtZWRfYnVmZmVyLmdldHZhbHVlKCkpLCBsZW4oZGF0YSkgKyA4KQorICAgICAgICBmcmFtZWRfYnVmZmVyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgZnJhbWVkX3dyaXRlciA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChmcmFtZWRfYnVmZmVyKQorICAgICAgICBmb3IgcGFydCBpbiBwYXJ0czoKKyAgICAgICAgICAgIGZyYW1lZF93cml0ZXIud3JpdGUocGFydCkKKyAgICAgICAgICAgIGZyYW1lZF93cml0ZXIuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKSwgbGVuKGRhdGEpICsgOCkKIAotICAgICMgUmVjcmVhdGUgZnJhbWVkX2J1ZmZlciBzbyB3ZSBjYW4gcmVhZCBmcm9tIGl0LgotICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKQotICAgIGZyYW1lZF9yZWFkZXIgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoZnJhbWVkX2J1ZmZlcikKLSAgICBwcm90ID0gcHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChmcmFtZWRfcmVhZGVyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTMyKCksIDQyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkU3RyaW5nKCksIGJpZ3N0cmluZykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZEkxNigpLCAyNCkKKyAgICAgICAgIyBSZWNyZWF0ZSBmcmFtZWRfYnVmZmVyIHNvIHdlIGNhbiByZWFkIGZyb20gaXQuCisgICAgICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKQorICAgICAgICBmcmFtZWRfcmVhZGVyID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KGZyYW1lZF9idWZmZXIpCisgICAgICAgIHByb3QgPSBwcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKGZyYW1lZF9yZWFkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTMyKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZFN0cmluZygpLCBiaWdzdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTE2KCksIDI0KQorCiAKIGNsYXNzIFNlcmlhbGl6ZXJzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgZGVmIHRlc3RTZXJpYWxpemVUaGVuRGVzZXJpYWxpemUoc2VsZik6Ci0gICAgb2JqID0gWHRydWN0MihpMzJfdGhpbmc9MSwKLSAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZz1YdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJmb28iKSkKKyAgICBkZWYgdGVzdFNlcmlhbGl6ZVRoZW5EZXNlcmlhbGl6ZShzZWxmKToKKyAgICAgICAgb2JqID0gWHRydWN0MihpMzJfdGhpbmc9MSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc9WHRydWN0KHN0cmluZ190aGluZz0iZm9vIikpCiAKLSAgICBzMSA9IHNlcmlhbGl6ZShvYmopCi0gICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoczEsIHNlcmlhbGl6ZShvYmopKQotICAgICAgb2JqY29weSA9IFh0cnVjdDIoKQotICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCi0gICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisgICAgICAgIHMxID0gc2VyaWFsaXplKG9iaikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoczEsIHNlcmlhbGl6ZShvYmopKQorICAgICAgICAgICAgb2JqY29weSA9IFh0cnVjdDIoKQorICAgICAgICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCiAKLSAgICBvYmogPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJiYXIiKQotICAgIG9iamNvcHkgPSBYdHJ1Y3QoKQotICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgb2JqY29weSkKKyAgICAgICAgb2JqID0gWHRydWN0KHN0cmluZ190aGluZz0iYmFyIikKKyAgICAgICAgb2JqY29weSA9IFh0cnVjdCgpCisgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCiAKLSAgICAjIHRlc3QgYm9vbGVhbnMKLSAgICBvYmogPSBCb29scyhpbV90cnVlPVRydWUsIGltX2ZhbHNlPUZhbHNlKQotICAgIG9iamNvcHkgPSBCb29scygpCi0gICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQotICAgIAotICAgICMgdGVzdCBlbnVtcwotICAgIGZvciBudW0sIG5hbWUgaW4gTnVtYmVyei5fVkFMVUVTX1RPX05BTUVTLml0ZXJpdGVtcygpOgotICAgICAgb2JqID0gQm9uayhtZXNzYWdlPSdlbnVtIE51bWJlcnogdmFsdWUgJWQgaXMgc3RyaW5nICVzJyAlIChudW0sIG5hbWUpLCB0eXBlPW51bSkKLSAgICAgIG9iamNvcHkgPSBCb25rKCkKLSAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQotICAKKyAgICAgICAgIyB0ZXN0IGJvb2xlYW5zCisgICAgICAgIG9iaiA9IEJvb2xzKGltX3RydWU9VHJ1ZSwgaW1fZmFsc2U9RmFsc2UpCisgICAgICAgIG9iamNvcHkgPSBCb29scygpCisgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisKKyAgICAgICAgIyB0ZXN0IGVudW1zCisgICAgICAgIGZvciBudW0sIG5hbWUgaW4gTnVtYmVyei5fVkFMVUVTX1RPX05BTUVTLml0ZW1zKCk6CisgICAgICAgICAgICBvYmogPSBCb25rKG1lc3NhZ2U9J2VudW0gTnVtYmVyeiB2YWx1ZSAlZCBpcyBzdHJpbmcgJXMnICUgKG51bSwgbmFtZSksIHR5cGU9bnVtKQorICAgICAgICAgICAgb2JqY29weSA9IEJvbmsoKQorICAgICAgICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisKIAogZGVmIHN1aXRlKCk6Ci0gIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLSAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQogCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShOb3JtYWxCaW5hcnlUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0UHJvdG9jb2xUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEpTT05Qcm90b2NvbFRlc3QpKQotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRGcmFtZWRUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFNlcmlhbGl6ZXJzVGVzdCkpCi0gIHJldHVybiBzdWl0ZQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShOb3JtYWxCaW5hcnlUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRDb21wYWN0VGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKENvbXBhY3RQcm90b2NvbFRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShKU09OUHJvdG9jb2xUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRGcmFtZWRUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoU2VyaWFsaXplcnNUZXN0KSkKKyAgICByZXR1cm4gc3VpdGUKKwogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnB5IGIvdGVzdC9weS9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5weQppbmRleCAwODAyOTNhLi43Mjk4NzYwIDEwMDY0NAotLS0gYS90ZXN0L3B5L1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnB5CisrKyBiL3Rlc3QvcHkvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHkKQEAgLTE5LDE3ICsxOSw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzCi1pbXBvcnQgZ2xvYgotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsIGRlZmF1bHQ9J2dlbi1weScpCi1vcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQotZGVsIHN5cy5hcmd2WzE6XSAjIGNsZWFuIHVwIGhhY2sgc28gdW5pdHRlc3QgZG9lc24ndCBjb21wbGFpbgotc3lzLnBhdGguaW5zZXJ0KDAsIG9wdGlvbnMuZ2VucHlkaXIpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKLQotZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgKgorZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgQm9uaywgVmVyc2lvbmluZ1Rlc3RWMSwgVmVyc2lvbmluZ1Rlc3RWMgogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCkBAIC0zOCw4MiArMjgsODEgQEAKIAogCiBjbGFzcyBTaW1wbGVKU09OUHJvdG9jb2xUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKQorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUSlNPTlByb3RvY29sLlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkKIAotICBkZWYgX2Fzc2VydERpY3RFcXVhbChzZWxmLCBhICxiLCBtc2c9Tm9uZSk6Ci0gICAgaWYgaGFzYXR0cihzZWxmLCAnYXNzZXJ0RGljdEVxdWFsJyk6Ci0gICAgICAjIGFzc2VydERpY3RFcXVhbCBvbmx5IGluIFB5dGhvbiAyLjcuIERlcGVuZHMgb24geW91ciBtYWNoaW5lLgotICAgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoYSwgYiwgbXNnKQotICAgICAgcmV0dXJuCi0gICAgCi0gICAgIyBTdWJzdGl0dXRlIGltcGxlbWVudGF0aW9uIG5vdCBhcyBnb29kIGFzIHVuaXR0ZXN0IGxpYnJhcnkncwotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihhKSwgbGVuKGIpLCBtc2cpCi0gICAgZm9yIGssIHYgaW4gYS5pdGVyaXRlbXMoKToKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrIGluIGIsIG1zZykKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGIuZ2V0KGspLCB2LCBtc2cpCisgICAgZGVmIF9hc3NlcnREaWN0RXF1YWwoc2VsZiwgYSwgYiwgbXNnPU5vbmUpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdhc3NlcnREaWN0RXF1YWwnKToKKyAgICAgICAgICAgICMgYXNzZXJ0RGljdEVxdWFsIG9ubHkgaW4gUHl0aG9uIDIuNy4gRGVwZW5kcyBvbiB5b3VyIG1hY2hpbmUuCisgICAgICAgICAgICBzZWxmLmFzc2VydERpY3RFcXVhbChhLCBiLCBtc2cpCisgICAgICAgICAgICByZXR1cm4KIAotICBkZWYgX3NlcmlhbGl6ZShzZWxmLCBvYmopOgotICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQotICAgIG9iai53cml0ZShwcm90KQotICAgIHJldHVybiB0cmFucy5nZXR2YWx1ZSgpCisgICAgICAgICMgU3Vic3RpdHV0ZSBpbXBsZW1lbnRhdGlvbiBub3QgYXMgZ29vZCBhcyB1bml0dGVzdCBsaWJyYXJ5J3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGEpLCBsZW4oYiksIG1zZykKKyAgICAgICAgZm9yIGssIHYgaW4gYS5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrIGluIGIsIG1zZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGIuZ2V0KGspLCB2LCBtc2cpCiAKLSAgZGVmIF9kZXNlcmlhbGl6ZShzZWxmLCBvYmp0eXBlLCBkYXRhKToKLSAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihkYXRhKSkKLSAgICByZXQgPSBvYmp0eXBlKCkKLSAgICByZXQucmVhZChwcm90KQotICAgIHJldHVybiByZXQKKyAgICBkZWYgX3NlcmlhbGl6ZShzZWxmLCBvYmopOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgIG9iai53cml0ZShwcm90KQorICAgICAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQogCi0gIGRlZiB0ZXN0V3JpdGVPbmx5KHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGVzZXJpYWxpemUsIFZlcnNpb25pbmdUZXN0VjEsICd7fScpCisgICAgZGVmIF9kZXNlcmlhbGl6ZShzZWxmLCBvYmp0eXBlLCBkYXRhKToKKyAgICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCisgICAgICAgIHJldCA9IG9ianR5cGUoKQorICAgICAgICByZXQucmVhZChwcm90KQorICAgICAgICByZXR1cm4gcmV0CiAKLSAgZGVmIHRlc3RTaW1wbGVNZXNzYWdlKHNlbGYpOgotICAgICAgdjFvYmogPSBWZXJzaW9uaW5nVGVzdFYxKAotICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCi0gICAgICAgICAgb2xkX3N0cmluZz0nYWFhJywKLSAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKLSAgICAgIGV4cGVjdGVkID0gZGljdChiZWdpbl9pbl9ib3RoPXYxb2JqLmJlZ2luX2luX2JvdGgsCi0gICAgICAgICAgICAgICAgICAgICAgb2xkX3N0cmluZz12MW9iai5vbGRfc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgIGVuZF9pbl9ib3RoPXYxb2JqLmVuZF9pbl9ib3RoKQotICAgICAgYWN0dWFsID0ganNvbi5sb2FkcyhzZWxmLl9zZXJpYWxpemUodjFvYmopKQorICAgIGRlZiB0ZXN0V3JpdGVPbmx5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kZXNlcmlhbGl6ZSwgVmVyc2lvbmluZ1Rlc3RWMSwgYid7fScpCiAKLSAgICAgIHNlbGYuX2Fzc2VydERpY3RFcXVhbChleHBlY3RlZCwgYWN0dWFsKQotICAgICAKLSAgZGVmIHRlc3RDb21wbGljYXRlZChzZWxmKToKLSAgICAgIHYyb2JqID0gVmVyc2lvbmluZ1Rlc3RWMigKLSAgICAgICAgICBiZWdpbl9pbl9ib3RoPTEyMzQ1LAotICAgICAgICAgIG5ld2ludD0xLAotICAgICAgICAgIG5ld2J5dGU9MiwKLSAgICAgICAgICBuZXdzaG9ydD0zLAotICAgICAgICAgIG5ld2xvbmc9NCwKLSAgICAgICAgICBuZXdkb3VibGU9NS4wLAotICAgICAgICAgIG5ld3N0cnVjdD1Cb25rKG1lc3NhZ2U9IkhlbGxvISIsIHR5cGU9MTIzKSwKLSAgICAgICAgICBuZXdsaXN0PVs3LDgsOV0sCi0gICAgICAgICAgbmV3c2V0PXNldChbNDIsMSw4XSksCi0gICAgICAgICAgbmV3bWFwPXsxOjIsMjozfSwKLSAgICAgICAgICBuZXdzdHJpbmc9IkhvbGEhIiwKLSAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKLSAgICAgIGV4cGVjdGVkID0gZGljdChiZWdpbl9pbl9ib3RoPXYyb2JqLmJlZ2luX2luX2JvdGgsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3aW50PXYyb2JqLm5ld2ludCwKLSAgICAgICAgICAgICAgICAgICAgICBuZXdieXRlPXYyb2JqLm5ld2J5dGUsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3c2hvcnQ9djJvYmoubmV3c2hvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3bG9uZz12Mm9iai5uZXdsb25nLAotICAgICAgICAgICAgICAgICAgICAgIG5ld2RvdWJsZT12Mm9iai5uZXdkb3VibGUsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3c3RydWN0PWRpY3QobWVzc2FnZT12Mm9iai5uZXdzdHJ1Y3QubWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXYyb2JqLm5ld3N0cnVjdC50eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICBuZXdsaXN0PXYyb2JqLm5ld2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3c2V0PWxpc3QodjJvYmoubmV3c2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICBuZXdtYXA9djJvYmoubmV3bWFwLAotICAgICAgICAgICAgICAgICAgICAgIG5ld3N0cmluZz12Mm9iai5uZXdzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgZW5kX2luX2JvdGg9djJvYmouZW5kX2luX2JvdGgpCi0gICAgICAKLSAgICAgICMgTmVlZCB0byBsb2FkL2R1bXAgYmVjYXVzZSBtYXAga2V5cyBnZXQgZXNjYXBlZC4KLSAgICAgIGV4cGVjdGVkID0ganNvbi5sb2Fkcyhqc29uLmR1bXBzKGV4cGVjdGVkKSkKLSAgICAgIGFjdHVhbCA9IGpzb24ubG9hZHMoc2VsZi5fc2VyaWFsaXplKHYyb2JqKSkKLSAgICAgIHNlbGYuX2Fzc2VydERpY3RFcXVhbChleHBlY3RlZCwgYWN0dWFsKQorICAgIGRlZiB0ZXN0U2ltcGxlTWVzc2FnZShzZWxmKToKKyAgICAgICAgdjFvYmogPSBWZXJzaW9uaW5nVGVzdFYxKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG9sZF9zdHJpbmc9J2FhYScsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKKyAgICAgICAgZXhwZWN0ZWQgPSBkaWN0KGJlZ2luX2luX2JvdGg9djFvYmouYmVnaW5faW5fYm90aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9zdHJpbmc9djFvYmoub2xkX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9pbl9ib3RoPXYxb2JqLmVuZF9pbl9ib3RoKQorICAgICAgICBhY3R1YWwgPSBqc29uLmxvYWRzKHNlbGYuX3NlcmlhbGl6ZSh2MW9iaikuZGVjb2RlKCdhc2NpaScpKQorCisgICAgICAgIHNlbGYuX2Fzc2VydERpY3RFcXVhbChleHBlY3RlZCwgYWN0dWFsKQorCisgICAgZGVmIHRlc3RDb21wbGljYXRlZChzZWxmKToKKyAgICAgICAgdjJvYmogPSBWZXJzaW9uaW5nVGVzdFYyKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG5ld2ludD0xLAorICAgICAgICAgICAgbmV3Ynl0ZT0yLAorICAgICAgICAgICAgbmV3c2hvcnQ9MywKKyAgICAgICAgICAgIG5ld2xvbmc9NCwKKyAgICAgICAgICAgIG5ld2RvdWJsZT01LjAsCisgICAgICAgICAgICBuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSJIZWxsbyEiLCB0eXBlPTEyMyksCisgICAgICAgICAgICBuZXdsaXN0PVs3LCA4LCA5XSwKKyAgICAgICAgICAgIG5ld3NldD1zZXQoWzQyLCAxLCA4XSksCisgICAgICAgICAgICBuZXdtYXA9ezE6IDIsIDI6IDN9LAorICAgICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKKyAgICAgICAgZXhwZWN0ZWQgPSBkaWN0KGJlZ2luX2luX2JvdGg9djJvYmouYmVnaW5faW5fYm90aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2ludD12Mm9iai5uZXdpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdieXRlPXYyb2JqLm5ld2J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzaG9ydD12Mm9iai5uZXdzaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xvbmc9djJvYmoubmV3bG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2RvdWJsZT12Mm9iai5uZXdkb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzdHJ1Y3Q9ZGljdChtZXNzYWdlPXYyb2JqLm5ld3N0cnVjdC5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT12Mm9iai5uZXdzdHJ1Y3QudHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaXN0PXYyb2JqLm5ld2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzZXQ9bGlzdCh2Mm9iai5uZXdzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3bWFwPXYyb2JqLm5ld21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3N0cmluZz12Mm9iai5uZXdzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5fYm90aD12Mm9iai5lbmRfaW5fYm90aCkKKworICAgICAgICAjIE5lZWQgdG8gbG9hZC9kdW1wIGJlY2F1c2UgbWFwIGtleXMgZ2V0IGVzY2FwZWQuCisgICAgICAgIGV4cGVjdGVkID0ganNvbi5sb2Fkcyhqc29uLmR1bXBzKGV4cGVjdGVkKSkKKyAgICAgICAgYWN0dWFsID0ganNvbi5sb2FkcyhzZWxmLl9zZXJpYWxpemUodjJvYmopLmRlY29kZSgnYXNjaWknKSkKKyAgICAgICAgc2VsZi5fYXNzZXJ0RGljdEVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdW5pdHRlc3QubWFpbigpCi0KKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdENsaWVudC5weSBiL3Rlc3QvcHkvVGVzdENsaWVudC5weQppbmRleCA1MTExMWE2Li5lN2E5YTFhIDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RDbGllbnQucHkKKysrIGIvdGVzdC9weS9UZXN0Q2xpZW50LnB5CkBAIC0xLDUgKzEsNSBAQAogIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KKyMgLSotIGNvZGluZzogdXRmLTggLSotCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE5LDI1NCArMTksNDgyIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgZ2xvYgogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQogaW1wb3J0IHVuaXR0ZXN0CisKIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgorZnJvbSB1dGlsIGltcG9ydCBsb2NhbF9saWJwYXRoCitzeXMucGF0aC5pbnNlcnQoMCwgbG9jYWxfbGlicGF0aCgpKQorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRQcm90b2NvbCwgVFByb3RvY29sRGVjb3JhdG9yCiAKLXBhcnNlciA9IE9wdGlvblBhcnNlcigpCi1wYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlyJywKLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9J2dlbi1weScsCi0gICAgICAgICAgICAgICAgICBoZWxwPSdpbmNsdWRlIHRoaXMgbG9jYWwgZGlyZWN0b3J5IGluIHN5cy5wYXRoIGZvciBsb2NhdGluZyBnZW5lcmF0ZWQgY29kZScpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsCi0gICAgaGVscD0iY29ubmVjdCB0byBzZXJ2ZXIgYXQgcG9ydCIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1ob3N0IiwgdHlwZT0ic3RyaW5nIiwgZGVzdD0iaG9zdCIsCi0gICAgaGVscD0iY29ubmVjdCB0byBzZXJ2ZXIiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0temxpYiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InpsaWIiLAotICAgIGhlbHA9InVzZSB6bGliIHdyYXBwZXIgZm9yIGNvbXByZXNzZWQgdHJhbnNwb3J0IikKLXBhcnNlci5hZGRfb3B0aW9uKCItLXNzbCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InNzbCIsCi0gICAgaGVscD0idXNlIFNTTCBmb3IgZW5jcnlwdGVkIHRyYW5zcG9ydCIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1odHRwIiwgZGVzdD0iaHR0cF9wYXRoIiwKLSAgICBoZWxwPSJVc2UgdGhlIEhUVFAgdHJhbnNwb3J0IHdpdGggdGhlIHNwZWNpZmllZCBwYXRoIikKLXBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKLSAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKLSAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCi1wYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAotICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAotICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctLXByb3RvY29sJywgIGRlc3Q9InByb3RvIiwgdHlwZT0ic3RyaW5nIiwKLSAgICBoZWxwPSJwcm90b2NvbCB0byB1c2UsIG9uZSBvZjogYWNjZWwsIGJpbmFyeSwgY29tcGFjdCwganNvbiIpCi1wYXJzZXIuYWRkX29wdGlvbignLS10cmFuc3BvcnQnLCAgZGVzdD0idHJhbnMiLCB0eXBlPSJzdHJpbmciLAotICAgIGhlbHA9InRyYW5zcG9ydCB0byB1c2UsIG9uZSBvZjogYnVmZmVyZWQsIGZyYW1lZCIpCi1wYXJzZXIuc2V0X2RlZmF1bHRzKGZyYW1lZD1GYWxzZSwgaHR0cF9wYXRoPU5vbmUsIHZlcmJvc2U9MSwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCBwcm90bz0nYmluYXJ5JykKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCi0KLXNjcmlwdF9kaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKLWxpYl9kaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShzY3JpcHRfZGlyKSksICdsaWInLCAncHknLCAnYnVpbGQnLCAnbGliLionKQotc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihzY3JpcHRfZGlyLCBvcHRpb25zLmdlbnB5ZGlyKSkKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IobGliX2RpcilbMF0pCi0KLWZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdCwgU2Vjb25kU2VydmljZQotZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgKgotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVEh0dHBDbGllbnQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFpsaWJUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCi1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorU0NSSVBUX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQogCiAKIGNsYXNzIEFic3RyYWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gIGRlZiBzZXRVcChzZWxmKToKLSAgICBpZiBvcHRpb25zLmh0dHBfcGF0aDoKLSAgICAgIHNlbGYudHJhbnNwb3J0ID0gVEh0dHBDbGllbnQuVEh0dHBDbGllbnQob3B0aW9ucy5ob3N0LCBwb3J0PW9wdGlvbnMucG9ydCwgcGF0aD1vcHRpb25zLmh0dHBfcGF0aCkKLSAgICBlbHNlOgotICAgICAgaWYgb3B0aW9ucy5zc2w6Ci0gICAgICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNTTFNvY2tldAotICAgICAgICBzb2NrZXQgPSBUU1NMU29ja2V0LlRTU0xTb2NrZXQob3B0aW9ucy5ob3N0LCBvcHRpb25zLnBvcnQsIHZhbGlkYXRlPUZhbHNlKQotICAgICAgZWxzZToKLSAgICAgICAgc29ja2V0ID0gVFNvY2tldC5UU29ja2V0KG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0KQotICAgICAgIyBmcmFtZSBvciBidWZmZXIgZGVwZW5kaW5nIHVwb24gYXJncwotICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpCi0gICAgICBpZiBvcHRpb25zLnRyYW5zID09ICdmcmFtZWQnOgotICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCi0gICAgICBlbGlmIG9wdGlvbnMudHJhbnMgPT0gJ2J1ZmZlcmVkJzoKLSAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpCi0gICAgICBlbGlmIG9wdGlvbnMudHJhbnMgPT0gJyc6Ci0gICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tdHJhbnNwb3J0IG9wdGlvbjogJXMnICUgb3B0aW9ucy50cmFucykKLSAgICAgIGlmIG9wdGlvbnMuemxpYjoKLSAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUWmxpYlRyYW5zcG9ydC5UWmxpYlRyYW5zcG9ydChzZWxmLnRyYW5zcG9ydCwgOSkKLSAgICBzZWxmLnRyYW5zcG9ydC5vcGVuKCkKLSAgICBwcm90b2NvbCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChzZWxmLnRyYW5zcG9ydCkKLSAgICBzZWxmLmNsaWVudCA9IFRocmlmdFRlc3QuQ2xpZW50KHByb3RvY29sKQorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgb3B0aW9ucy50cmFucyA9PSAnaHR0cCc6CisgICAgICAgICAgICB1cmkgPSAnezB9Oi8vezF9OnsyfXszfScuZm9ybWF0KCgnaHR0cHMnIGlmIG9wdGlvbnMuc3NsIGVsc2UgJ2h0dHAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmh0dHBfcGF0aCBpZiBvcHRpb25zLmh0dHBfcGF0aCBlbHNlICcvJykpCisgICAgICAgICAgICBpZiBvcHRpb25zLnNzbDoKKyAgICAgICAgICAgICAgICBfX2NhZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgIkNBLnBlbSIpCisgICAgICAgICAgICAgICAgX19jZXJ0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgImNsaWVudC5jcnQiKQorICAgICAgICAgICAgICAgIF9fa2V5ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgImNsaWVudC5rZXkiKQorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVEh0dHBDbGllbnQuVEh0dHBDbGllbnQodXJpLCBjYWZpbGU9X19jYWZpbGUsIGNlcnRfZmlsZT1fX2NlcnRmaWxlLCBrZXlfZmlsZT1fX2tleWZpbGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVEh0dHBDbGllbnQuVEh0dHBDbGllbnQodXJpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgb3B0aW9ucy5zc2w6CisgICAgICAgICAgICAgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU1NMU29ja2V0CisgICAgICAgICAgICAgICAgc29ja2V0ID0gVFNTTFNvY2tldC5UU1NMU29ja2V0KG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0LCB2YWxpZGF0ZT1GYWxzZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc29ja2V0ID0gVFNvY2tldC5UU29ja2V0KG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0KQorICAgICAgICAgICAgIyBmcmFtZSBvciBidWZmZXIgZGVwZW5kaW5nIHVwb24gYXJncworICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpCisgICAgICAgICAgICBpZiBvcHRpb25zLnRyYW5zID09ICdmcmFtZWQnOgorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KHNvY2tldCkKKyAgICAgICAgICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnYnVmZmVyZWQnOgorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KQorICAgICAgICAgICAgZWxpZiBvcHRpb25zLnRyYW5zID09ICcnOgorICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tdHJhbnNwb3J0IG9wdGlvbjogJXMnICUgb3B0aW9ucy50cmFucykKKyAgICAgICAgICAgIGlmIG9wdGlvbnMuemxpYjoKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0KHNlbGYudHJhbnNwb3J0LCA5KQorICAgICAgICBzZWxmLnRyYW5zcG9ydC5vcGVuKCkKKyAgICAgICAgcHJvdG9jb2wgPSBzZWxmLmdldF9wcm90b2NvbChzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgc2VsZi5jbGllbnQgPSBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCkKKyAgICAgICAgIyBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXM6CisgICAgICAgIHByb3RvY29sMiA9IHNlbGYuZ2V0X3Byb3RvY29sMihzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgc2VsZi5jbGllbnQyID0gU2Vjb25kU2VydmljZS5DbGllbnQocHJvdG9jb2wyKSBpZiBwcm90b2NvbDIgaXMgbm90IE5vbmUgZWxzZSBOb25lCiAKLSAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICMgQ2xvc2UhCi0gICAgc2VsZi50cmFuc3BvcnQuY2xvc2UoKQorICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuY2xvc2UoKQogCi0gIGRlZiB0ZXN0Vm9pZChzZWxmKToKLSAgICBwcmludCgndGVzdFZvaWQnKQotICAgIHNlbGYuY2xpZW50LnRlc3RWb2lkKCkKKyAgICBkZWYgdGVzdFZvaWQoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0Vm9pZCcpCisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RWb2lkKCkKIAotICBkZWYgdGVzdFN0cmluZyhzZWxmKToKLSAgICBwcmludCgndGVzdFN0cmluZycpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0U3RyaW5nKCdQeXRob24nICogMjApLCAnUHl0aG9uJyAqIDIwKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnJyksICcnKQorICAgIGRlZiB0ZXN0U3RyaW5nKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdFN0cmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJyAqIDIwKSwgJ1B5dGhvbicgKiAyMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpCisgICAgICAgIHMxID0gdSdcYlx0XG4vXFxcXFxye30644OR44Kk44K944OzIicKKyAgICAgICAgczIgPSB1IiIiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksCisgICAgICAgIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLAorICAgICAgICDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sCisgICAgICAgIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwKKyAgICAgICAgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLAorICAgICAgICBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsCisgICAgICAgIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwKKyAgICAgICAgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLAorICAgICAgICBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLAorICAgICAgICBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLAorICAgICAgICBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsCisgICAgICAgIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwKKyAgICAgICAgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLAorICAgICAgICBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYQorICAgICAgICBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCDZhdin2LLZkNix2YjZhtuMLCBCYWhhc2EKKyAgICAgICAgTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqCisgICAgICAgIE5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwKKyAgICAgICAgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsCisgICAgICAgIE5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLAorICAgICAgICDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlCisgICAgICAgIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywKKyAgICAgICAgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLAorICAgICAgICBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLAorICAgICAgICBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLAorICAgICAgICBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iIiIKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyIGFuZCBvcy5lbnZpcm9uLmdldCgnVEhSSUZUX1RFU1RfUFlfTk9fVVRGOFNUUklOR1MnKToKKyAgICAgICAgICAgIHMxID0gczEuZW5jb2RlKCd1dGY4JykKKyAgICAgICAgICAgIHMyID0gczIuZW5jb2RlKCd1dGY4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0U3RyaW5nKHMxKSwgczEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZyhzMiksIHMyKQogCi0gIGRlZiB0ZXN0Qm9vbChzZWxmKToKLSAgICBwcmludCgndGVzdEJvb2wnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEJvb2woVHJ1ZSksIFRydWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qm9vbChGYWxzZSksIEZhbHNlKQorICAgIGRlZiB0ZXN0TXVsdGlwbGV4ZWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2xpZW50MiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByaW50KCd0ZXN0TXVsdGlwbGV4ZWQnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudDIuc2Vjb25kdGVzdFN0cmluZygnZm9vYmFyJyksICd0ZXN0U3RyaW5nKCJmb29iYXIiKScpCiAKLSAgZGVmIHRlc3RCeXRlKHNlbGYpOgotICAgIHByaW50KCd0ZXN0Qnl0ZScpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qnl0ZSg2MyksIDYzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEJ5dGUoLTEyNyksIC0xMjcpCisgICAgZGVmIHRlc3RCb29sKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEJvb2wnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCb29sKFRydWUpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCb29sKEZhbHNlKSwgRmFsc2UpCiAKLSAgZGVmIHRlc3RJMzIoc2VsZik6Ci0gICAgcHJpbnQoJ3Rlc3RJMzInKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEkzMigtMSksIC0xKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEkzMigwKSwgMCkKKyAgICBkZWYgdGVzdEJ5dGUoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0Qnl0ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEJ5dGUoNjMpLCA2MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qnl0ZSgtMTI3KSwgLTEyNykKIAotICBkZWYgdGVzdEk2NChzZWxmKToKLSAgICBwcmludCgndGVzdEk2NCcpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STY0KDEpLCAxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpLCAtMzQzNTk3MzgzNjgpCisgICAgZGVmIHRlc3RJMzIoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0STMyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STMyKC0xKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEkzMigwKSwgMCkKIAotICBkZWYgdGVzdERvdWJsZShzZWxmKToKLSAgICBwcmludCgndGVzdERvdWJsZScpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC01LjIzNTA5ODIzNSksIC01LjIzNTA5ODIzNSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoMCksIDApCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC0xKSwgLTEpCisgICAgZGVmIHRlc3RJNjQoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0STY0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STY0KDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KSwgLTM0MzU5NzM4MzY4KQogCi0gIGRlZiB0ZXN0QmluYXJ5KHNlbGYpOgotICAgIGlmIGlzaW5zdGFuY2Uoc2VsZiwgSlNPTlRlc3QpOgotICAgICAgc2VsZi5za2lwVGVzdCgnSlNPTiBwcm90b2NvbCBkb2VzIG5vdCBoYW5kbGUgYmluYXJ5IGNvcnJlY3RseS4nKQotICAgIHByaW50KCd0ZXN0QmluYXJ5JykKLSAgICB2YWwgPSBieXRlYXJyYXkoW2kgZm9yIGkgaW4gcmFuZ2UoMCwgMjU2KV0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbChieXRlYXJyYXkoc2VsZi5jbGllbnQudGVzdEJpbmFyeShieXRlcyh2YWwpKSksIHZhbCkKKyAgICBkZWYgdGVzdERvdWJsZShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3REb3VibGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTUuMjM1MDk4MjM1KSwgLTUuMjM1MDk4MjM1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdERvdWJsZSgtMSksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KSwgLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KQogCi0gIGRlZiB0ZXN0U3RydWN0KHNlbGYpOgotICAgIHByaW50KCd0ZXN0U3RydWN0JykKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgotICAgIHguYnl0ZV90aGluZyA9IDEKLSAgICB4LmkzMl90aGluZyA9IC0zCi0gICAgeC5pNjRfdGhpbmcgPSAtNQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U3RydWN0KHgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgIGRlZiB0ZXN0QmluYXJ5KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEJpbmFyeScpCisgICAgICAgIHZhbCA9IGJ5dGVhcnJheShbaSBmb3IgaSBpbiByYW5nZSgwLCAyNTYpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlYXJyYXkoc2VsZi5jbGllbnQudGVzdEJpbmFyeShieXRlcyh2YWwpKSksIHZhbCkKIAotICBkZWYgdGVzdE5lc3Qoc2VsZik6Ci0gICAgcHJpbnQoJ3Rlc3ROZXN0JykKLSAgICBpbm5lciA9IFh0cnVjdChzdHJpbmdfdGhpbmc9Ilplcm8iLCBieXRlX3RoaW5nPTEsIGkzMl90aGluZz0tMywgaTY0X3RoaW5nPS01KQotICAgIHggPSBYdHJ1Y3QyKHN0cnVjdF90aGluZz1pbm5lciwgYnl0ZV90aGluZz0wLCBpMzJfdGhpbmc9MCkKLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdE5lc3QoeCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0U3RydWN0JykKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCisgICAgICAgIHguYnl0ZV90aGluZyA9IDEKKyAgICAgICAgeC5pMzJfdGhpbmcgPSAtMworICAgICAgICB4Lmk2NF90aGluZyA9IC01CisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U3RydWN0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdE1hcChzZWxmKToKLSAgICBwcmludCgndGVzdE1hcCcpCi0gICAgeCA9IHswOjEsIDE6MiwgMjozLCAzOjQsIC0xOi0yfQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TWFwKHgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgIGRlZiB0ZXN0TmVzdChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3ROZXN0JykKKyAgICAgICAgaW5uZXIgPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJaZXJvIiwgYnl0ZV90aGluZz0xLCBpMzJfdGhpbmc9LTMsIGk2NF90aGluZz0tNSkKKyAgICAgICAgeCA9IFh0cnVjdDIoc3RydWN0X3RoaW5nPWlubmVyLCBieXRlX3RoaW5nPTAsIGkzMl90aGluZz0wKQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdE5lc3QoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gIGRlZiB0ZXN0U2V0KHNlbGYpOgotICAgIHByaW50KCd0ZXN0U2V0JykKLSAgICB4ID0gc2V0KFs4LCAxLCA0Ml0pCi0gICAgeSA9IHNlbGYuY2xpZW50LnRlc3RTZXQoeCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgZGVmIHRlc3RNYXAoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TWFwJykKKyAgICAgICAgeCA9IHswOiAxLCAxOiAyLCAyOiAzLCAzOiA0LCAtMTogLTJ9CisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TWFwKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdExpc3Qoc2VsZik6Ci0gICAgcHJpbnQoJ3Rlc3RMaXN0JykKLSAgICB4ID0gWzEsIDQsIDksIC00Ml0KLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdExpc3QoeCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgZGVmIHRlc3RTZXQoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0U2V0JykKKyAgICAgICAgeCA9IHNldChbOCwgMSwgNDJdKQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdFNldCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RFbnVtKHNlbGYpOgotICAgIHggPSBOdW1iZXJ6LkZJVkUKLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdEVudW0oeCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgZGVmIHRlc3RMaXN0KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdExpc3QnKQorICAgICAgICB4ID0gWzEsIDQsIDksIC00Ml0KKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RMaXN0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdFR5cGVkZWYoc2VsZik6Ci0gICAgeCA9IDB4ZmZmZmZmZmZmZmZmZmYgIyA3IGJ5dGVzIG9mIDB4ZmYKLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdFR5cGVkZWYoeCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgZGVmIHRlc3RFbnVtKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEVudW0nKQorICAgICAgICB4ID0gTnVtYmVyei5GSVZFCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0RW51bSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RNYXBNYXAoc2VsZik6Ci0gICAgIyBkb2VzIG5vdCB3b3JrOiBkaWN0KCkgaXMgbm90IGEgaGFzaGFibGUgdHlwZSwgc28gYSBkaWN0KCkgY2Fubm90IGJlIHVzZWQgYXMgYSBrZXkgaW4gYW5vdGhlciBkaWN0KCkKLSAgICAjeCA9IHsgezE6MTAsIDI6MjB9LCB7MToxMDAsIDI6MjAwLCAzOjMwMH0sIHsxOjEwMDAsIDI6MjAwMCwgMzozMDAwLCA0OjQwMDB9IH0KLSAgICB0cnk6Ci0gICAgICB5ID0gc2VsZi5jbGllbnQudGVzdE1hcE1hcCgpCi0gICAgZXhjZXB0OgotICAgICAgcGFzcworICAgIGRlZiB0ZXN0VHlwZWRlZihzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RUeXBlZGVmJykKKyAgICAgICAgeCA9IDB4ZmZmZmZmZmZmZmZmZmYgICMgNyBieXRlcyBvZiAweGZmCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0VHlwZWRlZih4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RNdWx0aShzZWxmKToKLSAgICB4cGVjdGVkID0gWHRydWN0KHN0cmluZ190aGluZz0nSGVsbG8yJywgYnl0ZV90aGluZz03NCwgaTMyX3RoaW5nPTB4ZmYwMGZmLCBpNjRfdGhpbmc9MHhmZmZmZmZmZmQwZDApCi0gICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNdWx0aSh4cGVjdGVkLmJ5dGVfdGhpbmcsCi0gICAgICAgICAgeHBlY3RlZC5pMzJfdGhpbmcsCi0gICAgICAgICAgeHBlY3RlZC5pNjRfdGhpbmcsCi0gICAgICAgICAgeyAwOidhYmMnIH0sCi0gICAgICAgICAgTnVtYmVyei5GSVZFLAotICAgICAgICAgIDB4ZjBmMGYwKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeHBlY3RlZCkKKyAgICBkZWYgdGVzdE1hcE1hcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNYXBNYXAnKQorICAgICAgICB4ID0geworICAgICAgICAgICAgLTQ6IHstNDogLTQsIC0zOiAtMywgLTI6IC0yLCAtMTogLTF9LAorICAgICAgICAgICAgNDogezQ6IDQsIDM6IDMsIDI6IDIsIDE6IDF9LAorICAgICAgICB9CisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TWFwTWFwKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZik6Ci0gICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignU2FmZScpCi0gICAgdHJ5OgotICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQotICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKLSAgICBleGNlcHQgWGNlcHRpb24sIHg6Ci0gICAgICBzZWxmLmFzc2VydEVxdWFsKHguZXJyb3JDb2RlLCAxMDAxKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Lm1lc3NhZ2UsICdYY2VwdGlvbicpCi0gICAgICAjIFRPRE8gZW5zdXJlIHNhbWUgYmVoYXZpb3IgZm9yIHJlcHIgd2l0aGluIGdlbmVyYXRlZCBweXRob24gdmFyaWFudHMKLSAgICAgICMgZW5zdXJlIGV4Y2VwdGlvbidzIHJlcHIgbWV0aG9kIHdvcmtzCi0gICAgICAjeF9yZXByID0gcmVwcih4KQotICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwoeF9yZXByLCAnWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9XCdYY2VwdGlvblwnKScpCisgICAgZGVmIHRlc3RNdWx0aShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNdWx0aScpCisgICAgICAgIHhwZWN0ZWQgPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSdIZWxsbzInLCBieXRlX3RoaW5nPTc0LCBpMzJfdGhpbmc9MHhmZjAwZmYsIGk2NF90aGluZz0weGZmZmZmZmZmZDBkMCkKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNdWx0aSh4cGVjdGVkLmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBlY3RlZC5pMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBlY3RlZC5pNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6ICdhYmMnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJ6LkZJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMGYwZjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeHBlY3RlZCkKIAotICAgIHRyeToKLSAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oInRocm93X3VuZGVjbGFyZWQiKQotICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIikKLSAgICBleGNlcHQgRXhjZXB0aW9uOiAjIHR5cGUgaXMgdW5kZWZpbmVkCi0gICAgICBwYXNzCisgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0RXhjZXB0aW9uJykKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignU2FmZScpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisgICAgICAgIGV4Y2VwdCBYY2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmVycm9yQ29kZSwgMTAwMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5tZXNzYWdlLCAnWGNlcHRpb24nKQorICAgICAgICAgICAgIyBUT0RPIGVuc3VyZSBzYW1lIGJlaGF2aW9yIGZvciByZXByIHdpdGhpbiBnZW5lcmF0ZWQgcHl0aG9uIHZhcmlhbnRzCisgICAgICAgICAgICAjIGVuc3VyZSBleGNlcHRpb24ncyByZXByIG1ldGhvZCB3b3JrcworICAgICAgICAgICAgIyB4X3JlcHIgPSByZXByKHgpCisgICAgICAgICAgICAjIHNlbGYuYXNzZXJ0RXF1YWwoeF9yZXByLCAnWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9XCdYY2VwdGlvblwnKScpCiAKLSAgZGVmIHRlc3RPbmV3YXkoc2VsZik6Ci0gICAgc3RhcnQgPSB0aW1lLnRpbWUoKQotICAgIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkgIyB0eXBlIGlzIGludCwgbm90IGZsb2F0Ci0gICAgZW5kID0gdGltZS50aW1lKCkKLSAgICBzZWxmLmFzc2VydFRydWUoZW5kIC0gc3RhcnQgPCAzLAotICAgICAgICAgICAgICAgICAgICAib25ld2F5IHNsZWVwIHRvb2sgJWYgc2VjIiAlIChlbmQgLSBzdGFydCkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1RFeGNlcHRpb24nKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKKyAgICAgICAgZXhjZXB0IFRFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgIHBhc3MKIAotICBkZWYgdGVzdE9uZXdheVRoZW5Ob3JtYWwoc2VsZik6Ci0gICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKSAjIHR5cGUgaXMgaW50LCBub3QgZmxvYXQKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpLCAnUHl0aG9uJykKKyAgICAgICAgIyBTaG91bGQgbm90IHRocm93CisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ3N1Y2Nlc3MnKQorCisgICAgZGVmIHRlc3RNdWx0aUV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNdWx0aUV4Y2VwdGlvbicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignWGNlcHRpb24nLCAnaWdub3JlJykKKyAgICAgICAgZXhjZXB0IFhjZXB0aW9uIGFzIGV4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5lcnJvckNvZGUsIDEwMDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Lm1lc3NhZ2UsICdUaGlzIGlzIGFuIFhjZXB0aW9uJykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oJ1hjZXB0aW9uMicsICdpZ25vcmUnKQorICAgICAgICBleGNlcHQgWGNlcHRpb24yIGFzIGV4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5lcnJvckNvZGUsIDIwMDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsICdUaGlzIGlzIGFuIFhjZXB0aW9uMicpCisKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignc3VjY2VzcycsICdmb29iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuc3RyaW5nX3RoaW5nLCAnZm9vYmFyJykKKworICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE9uZXdheScpCisgICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKSAgIyB0eXBlIGlzIGludCwgbm90IGZsb2F0CisgICAgICAgIGVuZCA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbmQgLSBzdGFydCA8IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAib25ld2F5IHNsZWVwIHRvb2sgJWYgc2VjIiAlIChlbmQgLSBzdGFydCkpCisKKyAgICBkZWYgdGVzdE9uZXdheVRoZW5Ob3JtYWwoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0T25ld2F5VGhlbk5vcm1hbCcpCisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkgICMgdHlwZSBpcyBpbnQsIG5vdCBmbG9hdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpLCAnUHl0aG9uJykKIAogCi1jbGFzcyBOb3JtYWxCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisjIExBU1RfU0VRSUQgaXMgYSBnbG9iYWwgYmVjYXVzZSB3ZSBoYXZlIG9uZSB0cmFuc3BvcnQgYW5kIG11bHRpcGxlIHByb3RvY29scworIyBydW5uaW5nIG9uIGl0ICh3aGVuIG11bHRpcGxleGVkKQorTEFTVF9TRVFJRCA9IE5vbmUKIAotY2xhc3MgQ29tcGFjdFRlc3QoQWJzdHJhY3RUZXN0KToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQogCi1jbGFzcyBKU09OVGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpCitjbGFzcyBUUGVkYW50aWNTZXF1ZW5jZUlkUHJvdG9jb2xXcmFwcGVyKFRQcm90b2NvbERlY29yYXRvci5UUHJvdG9jb2xEZWNvcmF0b3IpOgorICAgICIiIgorICAgIFdyYXBzIGFueSBwcm90b2NvbCB3aXRoIHNlcXVlbmNlIElEIGNoZWNraW5nOiBsb29rcyBmb3Igb3V0Ym91bmQKKyAgICB1bmlxdWVuZXNzIGFzIHdlbGwgYXMgcmVxdWVzdC9yZXNwb25zZSBhbGlnbm1lbnQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKKyAgICAgICAgIyBUUHJvdG9jb2xEZWNvcmF0b3IuX19uZXdfXyBkb2VzIGFsbCB0aGUgaGVhdnkgbGlmdGluZworICAgICAgICBwYXNzCiAKLWNsYXNzIEFjY2VsZXJhdGVkQmluYXJ5VGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKKyAgICAgICAgZ2xvYmFsIExBU1RfU0VRSUQKKyAgICAgICAgaWYgTEFTVF9TRVFJRCBhbmQgTEFTVF9TRVFJRCA9PSBzZXFpZDoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgIlB5dGhvbiBjbGllbnQgcmV1c2VkIHNlcXVlbmNlIElEIHswfSIuZm9ybWF0KHNlcWlkKSkKKyAgICAgICAgTEFTVF9TRVFJRCA9IHNlcWlkCisgICAgICAgIHN1cGVyKFRQZWRhbnRpY1NlcXVlbmNlSWRQcm90b2NvbFdyYXBwZXIsIHNlbGYpLndyaXRlTWVzc2FnZUJlZ2luKAorICAgICAgICAgICAgbmFtZSwgdHlwZSwgc2VxaWQpCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgZ2xvYmFsIExBU1RfU0VRSUQKKyAgICAgICAgKG5hbWUsIHR5cGUsIHNlcWlkKSA9XAorICAgICAgICAgICAgc3VwZXIoVFBlZGFudGljU2VxdWVuY2VJZFByb3RvY29sV3JhcHBlciwgc2VsZikucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgIGlmIExBU1RfU0VRSUQgIT0gc2VxaWQ6CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRQcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICJXZSBzZW50IHNlcWlkIHswfSBhbmQgc2VydmVyIHJldHVybmVkIHNlcWlkIHsxfSIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBzZWxmLmxhc3QsIHNlcWlkKSkKKyAgICAgICAgcmV0dXJuIChuYW1lLCB0eXBlLCBzZXFpZCkKKworCitkZWYgbWFrZV9wZWRhbnRpYyhwcm90byk6CisgICAgIiIiIFdyYXAgYSBwcm90b2NvbCBpbiB0aGUgcGVkYW50aWMgc2VxdWVuY2UgSUQgd3JhcHBlci4gIiIiCisgICAgcmV0dXJuIFRQZWRhbnRpY1NlcXVlbmNlSWRQcm90b2NvbFdyYXBwZXIocHJvdG8pCisKKworY2xhc3MgTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QoQWJzdHJhY3RUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIEJpbmFyeVRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIG1ha2VfcGVkYW50aWMoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpKQorCisKK2NsYXNzIE11bHRpcGxleGVkQmluYXJ5VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gbWFrZV9wZWRhbnRpYyhUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gbWFrZV9wZWRhbnRpYyhUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCisKKworY2xhc3MgQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBtYWtlX3BlZGFudGljKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkpCisKKworY2xhc3MgTXVsdGlwbGV4ZWRBY2NlbGVyYXRlZEJpbmFyeVRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IG1ha2VfcGVkYW50aWMoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KSkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJUaHJpZnRUZXN0IikKKworICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBtYWtlX3BlZGFudGljKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCisKKworY2xhc3MgQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIG1ha2VfcGVkYW50aWMoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkpCisKKworY2xhc3MgTXVsdGlwbGV4ZWRDb21wYWN0VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gbWFrZV9wZWRhbnRpYyhUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KSkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJUaHJpZnRUZXN0IikKKworICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBtYWtlX3BlZGFudGljKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpKQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIG1ha2VfcGVkYW50aWMoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpKQorCisKK2NsYXNzIE11bHRpcGxleGVkQWNjZWxlcmF0ZWRDb21wYWN0VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gbWFrZV9wZWRhbnRpYyhUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gbWFrZV9wZWRhbnRpYyhUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCisKKworY2xhc3MgSlNPTlRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIG1ha2VfcGVkYW50aWMoVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkpCisKKworY2xhc3MgTXVsdGlwbGV4ZWRKU09OVGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gbWFrZV9wZWRhbnRpYyhUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KSkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJUaHJpZnRUZXN0IikKKworICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBtYWtlX3BlZGFudGljKFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpKQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEhlYWRlclRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgZmFjdG9yeSA9IFRIZWFkZXJQcm90b2NvbC5USGVhZGVyUHJvdG9jb2xGYWN0b3J5KCkKKyAgICAgICAgcmV0dXJuIG1ha2VfcGVkYW50aWMoZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpKQorCisKK2NsYXNzIE11bHRpcGxleGVkSGVhZGVyVGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gbWFrZV9wZWRhbnRpYyhUSGVhZGVyUHJvdG9jb2wuVEhlYWRlclByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gbWFrZV9wZWRhbnRpYyhUSGVhZGVyUHJvdG9jb2wuVEhlYWRlclByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCisKIAogZGVmIHN1aXRlKCk6Ci0gIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLSAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCi0gIGlmIG9wdGlvbnMucHJvdG8gPT0gJ2JpbmFyeSc6ICMgbG9vayBmb3IgLS1wcm90byBvbiBjbWRsaW5lCi0gICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE5vcm1hbEJpbmFyeVRlc3QpKQotICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2FjY2VsJzoKLSAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KSkKLSAgZWxpZiBvcHRpb25zLnByb3RvID09ICdjb21wYWN0JzoKLSAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQ29tcGFjdFRlc3QpKQotICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2pzb24nOgotICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShKU09OVGVzdCkpCi0gIGVsc2U6Ci0gICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gcHJvdG9jb2wgZ2l2ZW4gd2l0aCAtLXByb3RvY29sOiAlcycgJSBvcHRpb25zLnByb3RvKQotICByZXR1cm4gc3VpdGUKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgaWYgb3B0aW9ucy5wcm90byA9PSAnYmluYXJ5JzogICMgbG9vayBmb3IgLS1wcm90byBvbiBjbWRsaW5lCisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShCaW5hcnlUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2FjY2VsJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdhY2NlbGMnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdjb21wYWN0JzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKENvbXBhY3RUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2hlYWRlcic6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShIZWFkZXJUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2pzb24nOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoSlNPTlRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGknOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRCaW5hcnlUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ211bHRpYSc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWFjJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkQWNjZWxlcmF0ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWMnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWgnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRIZWFkZXJUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ211bHRpaic6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShNdWx0aXBsZXhlZEpTT05UZXN0KSkKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignVW5rbm93biBwcm90b2NvbCBnaXZlbiB3aXRoIC0tcHJvdG9jb2w6ICVzJyAlIG9wdGlvbnMucHJvdG8pCisgICAgcmV0dXJuIHN1aXRlCisKIAogY2xhc3MgT3duQXJnc1Rlc3RQcm9ncmFtKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKToKICAgICBkZWYgcGFyc2VBcmdzKHNlbGYsIGFyZ3YpOgogICAgICAgICBpZiBhcmdzOgogICAgICAgICAgICAgc2VsZi50ZXN0TmFtZXMgPSBhcmdzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnRlc3ROYW1lcyA9IChzZWxmLmRlZmF1bHRUZXN0LCkKKyAgICAgICAgICAgIHNlbGYudGVzdE5hbWVzID0gKFtzZWxmLmRlZmF1bHRUZXN0XSkKICAgICAgICAgc2VsZi5jcmVhdGVUZXN0cygpCiAKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgT3duQXJnc1Rlc3RQcm9ncmFtKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTEpKQorICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tbGlicHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdsaWJweWRpcicsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGRpcmVjdG9yeSBpbiBzeXMucGF0aCBmb3IgbG9jYXRpbmcgbGlicmFyeSBjb2RlJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdpbmNsdWRlIHRoaXMgZGlyZWN0b3J5IGluIHN5cy5wYXRoIGZvciBsb2NhdGluZyBnZW5lcmF0ZWQgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImNvbm5lY3QgdG8gc2VydmVyIGF0IHBvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLWhvc3QiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJjb25uZWN0IHRvIHNlcnZlciIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0temxpYiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InpsaWIiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InVzZSB6bGliIHdyYXBwZXIgZm9yIGNvbXByZXNzZWQgdHJhbnNwb3J0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1zc2wiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJzc2wiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InVzZSBTU0wgZm9yIGVuY3J5cHRlZCB0cmFuc3BvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLWh0dHAiLCBkZXN0PSJodHRwX3BhdGgiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlVzZSB0aGUgSFRUUCB0cmFuc3BvcnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGgiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tcHJvdG9jb2wnLCBkZXN0PSJwcm90byIsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0icHJvdG9jb2wgdG8gdXNlLCBvbmUgb2Y6IGFjY2VsLCBhY2NlbGMsIGJpbmFyeSwgY29tcGFjdCwgaGVhZGVyLCBqc29uLCBtdWx0aSwgbXVsdGlhLCBtdWx0aWFjLCBtdWx0aWMsIG11bHRpaCwgbXVsdGlqIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS10cmFuc3BvcnQnLCBkZXN0PSJ0cmFucyIsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idHJhbnNwb3J0IHRvIHVzZSwgb25lIG9mOiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIikKKyAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKGZyYW1lZD1GYWxzZSwgaHR0cF9wYXRoPU5vbmUsIHZlcmJvc2U9MSwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCBwcm90bz0nYmluYXJ5JykKKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgaWYgb3B0aW9ucy5nZW5weWRpcjoKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihTQ1JJUFRfRElSLCBvcHRpb25zLmdlbnB5ZGlyKSkKKworICAgIGlmIG9wdGlvbnMuaHR0cF9wYXRoOgorICAgICAgICBvcHRpb25zLnRyYW5zID0gJ2h0dHAnCisKKyAgICBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFNlY29uZFNlcnZpY2UKKyAgICBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKKyAgICBmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCBYdHJ1Y3QsIFh0cnVjdDIsIE51bWJlcnosIFhjZXB0aW9uLCBYY2VwdGlvbjIKKyAgICBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24KKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRIdHRwQ2xpZW50CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUWmxpYlRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSGVhZGVyUHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUTXVsdGlwbGV4ZWRQcm90b2NvbAorCisgICAgT3duQXJnc1Rlc3RQcm9ncmFtKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTEpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0RW9mLnB5IGIvdGVzdC9weS9UZXN0RW9mLnB5CmluZGV4IGE5ZDgxZjEuLjBiNGE4MjkgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdEVvZi5weQorKysgYi90ZXN0L3B5L1Rlc3RFb2YucHkKQEAgLTE5LDExOCArMTksMTE0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKLXBhcnNlciA9IE9wdGlvblBhcnNlcigpCi1wYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlyJywgZGVmYXVsdD0nZ2VuLXB5JykKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCi1kZWwgc3lzLmFyZ3ZbMTpdICMgY2xlYW4gdXAgaGFjayBzbyB1bml0dGVzdCBkb2Vzbid0IGNvbXBsYWluCi1zeXMucGF0aC5pbnNlcnQoMCwgb3B0aW9ucy5nZW5weWRpcikKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFh0cnVjdAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB0aW1lCisKIAogY2xhc3MgVGVzdEVvZih1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgZGVmIG1ha2VfZGF0YShzZWxmLCBwZmFjdG9yeT1Ob25lKToKLSAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgaWYgcGZhY3Rvcnk6Ci0gICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCi0gICAgZWxzZToKLSAgICAgIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zKQorICAgIGRlZiBtYWtlX2RhdGEoc2VsZiwgcGZhY3Rvcnk9Tm9uZSk6CisgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgaWYgcGZhY3Rvcnk6CisgICAgICAgICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFucykKIAotICAgIHggPSBYdHJ1Y3QoKQotICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCi0gICAgeC5ieXRlX3RoaW5nID0gMAorICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiWmVybyIKKyAgICAgICAgeC5ieXRlX3RoaW5nID0gMAogCi0gICAgeC53cml0ZShwcm90KQorICAgICAgICB4LndyaXRlKHByb3QpCiAKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnN0cmluZ190aGluZyA9ICJPbmUiCi0gICAgeC5ieXRlX3RoaW5nID0gMQorICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiT25lIgorICAgICAgICB4LmJ5dGVfdGhpbmcgPSAxCiAKLSAgICB4LndyaXRlKHByb3QpCisgICAgICAgIHgud3JpdGUocHJvdCkKIAotICAgIHJldHVybiB0cmFucy5nZXR2YWx1ZSgpCisgICAgICAgIHJldHVybiB0cmFucy5nZXR2YWx1ZSgpCiAKLSAgZGVmIHRlc3RUcmFuc3BvcnRSZWFkQWxsKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCByZWFkQWxsIG9uIGFueSB0eXBlIG9mIHRyYW5zcG9ydCB0aHJvd3MgYW4gRU9GRXJyb3IiIiIKLSAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzZWxmLm1ha2VfZGF0YSgpKQotICAgIHRyYW5zLnJlYWRBbGwoMSkKKyAgICBkZWYgdGVzdFRyYW5zcG9ydFJlYWRBbGwoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCByZWFkQWxsIG9uIGFueSB0eXBlIG9mIHRyYW5zcG9ydCB0aHJvd3MgYW4gRU9GRXJyb3IiIiIKKyAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2VsZi5tYWtlX2RhdGEoKSkKKyAgICAgICAgdHJhbnMucmVhZEFsbCgxKQogCi0gICAgdHJ5OgotICAgICAgdHJhbnMucmVhZEFsbCgxMDAwMCkKLSAgICBleGNlcHQgRU9GRXJyb3I6Ci0gICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJhbnMucmVhZEFsbCgxMDAwMCkKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgcmV0dXJuCiAKLSAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBFT0ZFcnJvciIpCisgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIEVPRkVycm9yIikKIAotICBkZWYgZW9mVGVzdEhlbHBlcihzZWxmLCBwZmFjdG9yeSk6Ci0gICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2VsZi5tYWtlX2RhdGEocGZhY3RvcnkpKQotICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKKyAgICBkZWYgZW9mVGVzdEhlbHBlcihzZWxmLCBwZmFjdG9yeSk6CisgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNlbGYubWFrZV9kYXRhKHBmYWN0b3J5KSkKKyAgICAgICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQogCi0gICAgeCA9IFh0cnVjdCgpCi0gICAgeC5yZWFkKHByb3QpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh4LnN0cmluZ190aGluZywgIlplcm8iKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5ieXRlX3RoaW5nLCAwKQotCi0gICAgeCA9IFh0cnVjdCgpCi0gICAgeC5yZWFkKHByb3QpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh4LnN0cmluZ190aGluZywgIk9uZSIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh4LmJ5dGVfdGhpbmcsIDEpCi0KLSAgICB0cnk6Ci0gICAgICB4ID0gWHRydWN0KCkKLSAgICAgIHgucmVhZChwcm90KQotICAgIGV4Y2VwdCBFT0ZFcnJvcjoKLSAgICAgIHJldHVybgotCi0gICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gRU9GRXJyb3IiKQotCi0gIGRlZiBlb2ZUZXN0SGVscGVyU3RyZXNzKHNlbGYsIHBmYWN0b3J5KToKLSAgICAiIiJUZWVzdCB0aGUgYWJpbGl0eSBvZiBUQmluYXJ5UHJvdG9jb2wgdG8gZGVhbCB3aXRoIHRoZSByZW1vdmFsIG9mIGV2ZXJ5IGJ5dGUgaW4gdGhlIGZpbGUiIiIKLSAgICAjIFRPRE86IHdlIHNob3VsZCBtYWtlIHN1cmUgdGhpcyBjb3ZlcnMgbW9yZSBvZiB0aGUgY29kZSBwYXRocwotCi0gICAgZGF0YSA9IHNlbGYubWFrZV9kYXRhKHBmYWN0b3J5KQotICAgIGZvciBpIGluIHhyYW5nZSgwLCBsZW4oZGF0YSkgKyAxKToKLSAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGFbMDppXSkKLSAgICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKLSAgICAgIHRyeToKICAgICAgICAgeCA9IFh0cnVjdCgpCiAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyaW5nX3RoaW5nLCAiWmVybyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5ieXRlX3RoaW5nLCAwKQorCisgICAgICAgIHggPSBYdHJ1Y3QoKQogICAgICAgICB4LnJlYWQocHJvdCkKLSAgICAgICAgeC5yZWFkKHByb3QpCi0gICAgICBleGNlcHQgRU9GRXJyb3I6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBhbiBFT0ZFcnJvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHJpbmdfdGhpbmcsICJPbmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYnl0ZV90aGluZywgMSkKIAotICBkZWYgdGVzdEJpbmFyeVByb3RvY29sRW9mKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCBUQmluYXJ5UHJvdG9jb2wgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgcmV0dXJuCiAKLSAgZGVmIHRlc3RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRW9mKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgotICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCkpCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKSkKKyAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gRU9GRXJyb3IiKQogCi0gIGRlZiB0ZXN0Q29tcGFjdFByb3RvY29sRW9mKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCBUQ29tcGFjdFByb3RvY29sIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpKQorICAgIGRlZiBlb2ZUZXN0SGVscGVyU3RyZXNzKHNlbGYsIHBmYWN0b3J5KToKKyAgICAgICAgIiIiVGVzdCB0aGUgYWJpbGl0eSBvZiBUQmluYXJ5UHJvdG9jb2wgdG8gZGVhbCB3aXRoIHRoZSByZW1vdmFsIG9mIGV2ZXJ5IGJ5dGUgaW4gdGhlIGZpbGUiIiIKKyAgICAgICAgIyBUT0RPOiB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoaXMgY292ZXJzIG1vcmUgb2YgdGhlIGNvZGUgcGF0aHMKKworICAgICAgICBkYXRhID0gc2VsZi5tYWtlX2RhdGEocGZhY3RvcnkpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihkYXRhKSArIDEpOgorICAgICAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YVswOmldKQorICAgICAgICAgICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHggPSBYdHJ1Y3QoKQorICAgICAgICAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBhbiBFT0ZFcnJvciIpCisKKyAgICBkZWYgdGVzdEJpbmFyeVByb3RvY29sRW9mKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgVEJpbmFyeVByb3RvY29sIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKworICAgIGRlZiB0ZXN0QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEJpbmFyeUVvZihzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKSkKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpKQorCisgICAgZGVmIHRlc3RDb21wYWN0UHJvdG9jb2xFb2Yoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBUQ29tcGFjdFByb3RvY29sIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkpCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkpCisKKyAgICBkZWYgdGVzdENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkQ29tcGFjdEVvZihzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKSkKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkpCisKIAogZGVmIHN1aXRlKCk6Ci0gIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLSAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RW9mKSkKLSAgcmV0dXJuIHN1aXRlCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RW9mKSkKKyAgICByZXR1cm4gc3VpdGUKKwogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RGcm96ZW4ucHkgYi90ZXN0L3B5L1Rlc3RGcm96ZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmQyNTk1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvVGVzdEZyb3plbi5weQpAQCAtMCwwICsxLDEyMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIERlYnVnUHJvdG9UZXN0LnR0eXBlcyBpbXBvcnQgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCwgRW1wdHksIFdyYXBwZXIKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEZyb3plbkRpY3QKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbAoraW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBUZXN0RnJvemVuQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9yb3VuZHRyaXAoc2VsZiwgc3JjLCBkc3QpOgorICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBvcHRvcm8gPSBzZWxmLnByb3RvY29sKG90cmFucykKKyAgICAgICAgc3JjLndyaXRlKG9wdG9ybykKKyAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKG90cmFucy5nZXR2YWx1ZSgpKQorICAgICAgICBpcHJvdG8gPSBzZWxmLnByb3RvY29sKGl0cmFucykKKyAgICAgICAgcmV0dXJuIGRzdC5yZWFkKGlwcm90bykgb3IgZHN0CisKKyAgICBkZWYgdGVzdF9kaWN0X2lzX2hhc2hhYmxlX29ubHlfYWZ0ZXJfZnJvemVuKHNlbGYpOgorICAgICAgICBkMCA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShkMCwgY29sbGVjdGlvbnMuSGFzaGFibGUpKQorICAgICAgICBkMSA9IFRGcm96ZW5EaWN0KGQwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShkMSwgY29sbGVjdGlvbnMuSGFzaGFibGUpKQorCisgICAgZGVmIHRlc3Rfc3RydWN0X3dpdGhfY29sbGVjdGlvbl9maWVsZHMoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3NldChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGFubm90YXRlZCBzZXQgZmllbGQgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCIiIgorICAgICAgICB4ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdChzZXRfYnl0ZV9tYXA9eworICAgICAgICAgICAgZnJvemVuc2V0KFs0MiwgMTAwLCAtMTAwXSk6IDk5LAorICAgICAgICAgICAgZnJvemVuc2V0KFswXSk6IDEwMCwKKyAgICAgICAgICAgIGZyb3plbnNldChbXSk6IDAsCisgICAgICAgIH0pCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5zZXRfYnl0ZV9tYXBbZnJvemVuc2V0KFs0MiwgMTAwLCAtMTAwXSldLCA5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5zZXRfYnl0ZV9tYXBbZnJvemVuc2V0KFswXSldLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuc2V0X2J5dGVfbWFwW2Zyb3plbnNldChbXSldLCAwKQorCisgICAgZGVmIHRlc3RfbWFwKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIG1hcCBmaWVsZCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KG1hcF9ieXRlX21hcD17CisgICAgICAgICAgICBURnJvemVuRGljdCh7NDI6IDQyLCAxMDA6IC0xMDB9KTogOTksCisgICAgICAgICAgICBURnJvemVuRGljdCh7MDogMH0pOiAxMDAsCisgICAgICAgICAgICBURnJvemVuRGljdCh7fSk6IDAsCisgICAgICAgIH0pCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5tYXBfYnl0ZV9tYXBbVEZyb3plbkRpY3QoezQyOiA0MiwgMTAwOiAtMTAwfSldLCA5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5tYXBfYnl0ZV9tYXBbVEZyb3plbkRpY3QoezA6IDB9KV0sIDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5tYXBfYnl0ZV9tYXBbVEZyb3plbkRpY3Qoe30pXSwgMCkKKworICAgIGRlZiB0ZXN0X2xpc3Qoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgbGlzdCBmaWVsZCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGxpc3RfYnl0ZV9tYXA9eworICAgICAgICAgICAgKDQyLCAxMDAsIC0xMDApOiA5OSwKKyAgICAgICAgICAgICgwLCk6IDEwMCwKKyAgICAgICAgICAgICgpOiAwLAorICAgICAgICB9KQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubGlzdF9ieXRlX21hcFsoNDIsIDEwMCwgLTEwMCldLCA5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5saXN0X2J5dGVfbWFwWygwLCldLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubGlzdF9ieXRlX21hcFsoKV0sIDApCisKKyAgICBkZWYgdGVzdF9lbXB0eV9zdHJ1Y3Qoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgZW1wdHkgc3RydWN0IGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQiIiIKKyAgICAgICAgeCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoZW1wdHlfc3RydWN0X2ZpZWxkPUVtcHR5KCkpCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5lbXB0eV9zdHJ1Y3RfZmllbGQsIEVtcHR5KCkpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3Qoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgc3RydWN0IGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQiIiIKKyAgICAgICAgeCA9IFdyYXBwZXIoZm9vPUVtcHR5KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5mb28sIEVtcHR5KCkpCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIFdyYXBwZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuZm9vLCBFbXB0eSgpKQorCisKK2NsYXNzIFRlc3RGcm96ZW4oVGVzdEZyb3plbkJhc2UpOgorICAgIGRlZiBwcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zKQorCisKK2NsYXNzIFRlc3RGcm96ZW5BY2NlbGVyYXRlZEJpbmFyeShUZXN0RnJvemVuQmFzZSk6CisgICAgZGVmIHByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zKQorCisKK2NsYXNzIFRlc3RGcm96ZW5BY2NlbGVyYXRlZENvbXBhY3QoVGVzdEZyb3plbkJhc2UpOgorICAgIGRlZiBwcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zKQorCisKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEZyb3plbikpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RGcm96ZW5BY2NlbGVyYXRlZEJpbmFyeSkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RGcm96ZW5BY2NlbGVyYXRlZENvbXBhY3QpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5IGIvdGVzdC9weS9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5MDNkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5CkBAIC0wLDAgKzEsMTc3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gRG91YmxlQ29uc3RhbnRzVGVzdCBpbXBvcnQgY29uc3RhbnRzCisKKyMKKyMgSW4gb3JkZXIgdG8gcnVuIHRoZSB0ZXN0IHVuZGVyIFdpbmRvd3MuIFdlIG5lZWQgdG8gY3JlYXRlIHN5bWJvbGljIGxpbmsKKyMgbmFtZSAndGhyaWZ0JyB0byAnLi4vc3JjJyBmb2xkZXIgYnkgdXNpbmc6CisjCisjIG1rbGluayAvRCB0aHJpZnQgLi5cc3JjCisjCisKKworY2xhc3MgVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUID0gXAorICAgICAgICAiZmFpbGVkIHRvIHZlcmlmeSBhIGRvdWJsZSBjb25zdGFudCBnZW5lcmF0ZWQgYnkgVGhyaWZ0IChleHBlY3RlZCA9ICVmLCBnb3QgPSAlZikiCisgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9MSVNUX1RFU1QgPVwKKyAgICAgICAgImZhaWxlZCB0byB2ZXJpZnkgYSBsaXN0IGl0ZW0gYnkgVGhyaWZ0IChleHBlY3RlZCA9ICVmLCBnb3QgPSAlZikiCisgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTID0gInRoZSByZW5kZXJlZCB2YXJpYWJsZSB3aXRoIG5hbWUgJXMgaXMgbm90IG9mIGRvdWJsZSB0eXBlIgorCisgICAgIyB0byBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBpbnNpZGUgVGhyaWZ0IGZpbGVzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5CisgICAgZGVmIHRlc3RfcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50cyhzZWxmKToKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCA9IDEuMAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UID0gLTEwMC4wCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcuMAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUyA9IDMuMTQxNTkyNjUzNTkKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSA9IC0xMDAwMDAwLjEKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSA9IDEuN2UrMzA4CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSA9IC0xLjdlKzMwOAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKQorCisgICAgIyB0byBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBpbnNpZGUgVGhyaWZ0IGZpbGVzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5CisgICAgZGVmIHRlc3RfcmVuZGVyZWRfZG91YmxlX2xpc3Qoc2VsZik6CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9MSVNUID0gWzEuMCwgLTEwMC4wLCAxMDAuMCwgOTIyMzM3MjAzNjg1NDc3NTgwNy4wLCAtOTIyMzM3MjAzNjg1NDc3NTgwNy4wLCAzLjE0MTU5MjY1MzU5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwLjEsIC0xMDAwMDAwLjEsIDEuN2UrMzA4LCAtMS43ZSszMDgsIDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVCksIGxlbihFWFBFQ1RFRF9ET1VCTEVfTElTVCkpCisgICAgICAgIGZvciBpLCBleHBlY3RlZFZhbHVlIGluIGVudW1lcmF0ZShFWFBFQ1RFRF9ET1VCTEVfTElTVCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbnN0YW50cy5ET1VCTEVfTElTVF9URVNUW2ldLCBleHBlY3RlZFZhbHVlLCBwbGFjZXM9NykKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cykpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0U2VydmVyLnB5IGIvdGVzdC9weS9UZXN0U2VydmVyLnB5CmluZGV4IGI1Njk2Y2EuLmQwYTEzZTUgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdFNlcnZlci5weQorKysgYi90ZXN0L3B5L1Rlc3RTZXJ2ZXIucHkKQEAgLTE5LDI4MyArMTksMzk0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgotaW1wb3J0IGdsb2IKIGltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3MKK2ltcG9ydCBzaWduYWwKIGltcG9ydCBzeXMKIGltcG9ydCB0aW1lCiBmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKIAotIyBQcmludCBUU2VydmVyIGxvZyB0byBzdGRvdXQgc28gdGhhdCB0aGUgdGVzdC1ydW5uZXIgY2FuIHJlZGlyZWN0IGl0IHRvIGxvZyBmaWxlcwotbG9nZ2luZy5iYXNpY0NvbmZpZygpCitmcm9tIHV0aWwgaW1wb3J0IGxvY2FsX2xpYnBhdGgKK3N5cy5wYXRoLmluc2VydCgwLCBsb2NhbF9saWJwYXRoKCkpCitmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVFByb3RvY29sLCBUUHJvdG9jb2xEZWNvcmF0b3IKIAotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXInLAotICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nZ2VuLXB5JywKLSAgICAgICAgICAgICAgICAgIGhlbHA9J2luY2x1ZGUgdGhpcyBsb2NhbCBkaXJlY3RvcnkgaW4gc3lzLnBhdGggZm9yIGxvY2F0aW5nIGdlbmVyYXRlZCBjb2RlJykKLXBhcnNlci5hZGRfb3B0aW9uKCItLXBvcnQiLCB0eXBlPSJpbnQiLCBkZXN0PSJwb3J0IiwKLSAgICBoZWxwPSJwb3J0IG51bWJlciBmb3Igc2VydmVyIHRvIGxpc3RlbiBvbiIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS16bGliIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iemxpYiIsCi0gICAgaGVscD0idXNlIHpsaWIgd3JhcHBlciBmb3IgY29tcHJlc3NlZCB0cmFuc3BvcnQiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tc3NsIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0ic3NsIiwKLSAgICBoZWxwPSJ1c2UgU1NMIGZvciBlbmNyeXB0ZWQgdHJhbnNwb3J0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKLSAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKLSAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCi1wYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAotICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAotICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctLXByb3RvY29sJywgIGRlc3Q9InByb3RvIiwgdHlwZT0ic3RyaW5nIiwKLSAgICBoZWxwPSJwcm90b2NvbCB0byB1c2UsIG9uZSBvZjogYWNjZWwsIGJpbmFyeSwgY29tcGFjdCwganNvbiIpCi1wYXJzZXIuYWRkX29wdGlvbignLS10cmFuc3BvcnQnLCAgZGVzdD0idHJhbnMiLCB0eXBlPSJzdHJpbmciLAotICAgIGhlbHA9InRyYW5zcG9ydCB0byB1c2UsIG9uZSBvZjogYnVmZmVyZWQsIGZyYW1lZCIpCi1wYXJzZXIuc2V0X2RlZmF1bHRzKHBvcnQ9OTA5MCwgdmVyYm9zZT0xLCBwcm90bz0nYmluYXJ5JykKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCi0KLXNjcmlwdF9kaXIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpICAjIDwtLSBhYnNvbHV0ZSBkaXIgdGhlIHNjcmlwdCBpcyBpbgotbGliX2RpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKHNjcmlwdF9kaXIpKSwgJ2xpYicsICdweScsICdidWlsZCcsICdsaWIuKicpCi0KLXN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4oc2NyaXB0X2Rpciwgb3B0aW9ucy5nZW5weWRpcikpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKGxpYl9kaXIpWzBdKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbgotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFpsaWJUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCi1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAotZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsIFRIdHRwU2VydmVyCi0KLVBST1RfRkFDVE9SSUVTID0gewotICAgICdiaW5hcnknOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSwKLSAgICAnYWNjZWwnOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5LAotICAgICdjb21wYWN0JzogVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSwKLSAgICAnanNvbic6IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnksCi19CitTQ1JJUFRfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCiAKIAogY2xhc3MgVGVzdEhhbmRsZXIob2JqZWN0KToKLSAgZGVmIHRlc3RWb2lkKHNlbGYpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdFZvaWQoKScpCisgICAgZGVmIHRlc3RWb2lkKHNlbGYpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0Vm9pZCgpJykKIAotICBkZWYgdGVzdFN0cmluZyhzZWxmLCBzdHIpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdFN0cmluZyglcyknICUgc3RyKQotICAgIHJldHVybiBzdHIKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmLCBzdHIpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0U3RyaW5nKCVzKScgJSBzdHIpCisgICAgICAgIHJldHVybiBzdHIKIAotICBkZWYgdGVzdEJvb2woc2VsZiwgYm9vbGVhbik6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50KCd0ZXN0Qm9vbCglcyknICUgc3RyKGJvb2xlYW4pLmxvd2VyKCkpCi0gICAgcmV0dXJuIGJvb2xlYW4KKyAgICBkZWYgdGVzdEJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RCb29sKCVzKScgJSBzdHIoYm9vbGVhbikubG93ZXIoKSkKKyAgICAgICAgcmV0dXJuIGJvb2xlYW4KIAotICBkZWYgdGVzdEJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50KCd0ZXN0Qnl0ZSglZCknICUgYnl0ZSkKLSAgICByZXR1cm4gYnl0ZQorICAgIGRlZiB0ZXN0Qnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEJ5dGUoJWQpJyAlIGJ5dGUpCisgICAgICAgIHJldHVybiBieXRlCiAKLSAgZGVmIHRlc3RJMTYoc2VsZiwgaTE2KToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RJMTYoJWQpJyAlIGkxNikKLSAgICByZXR1cm4gaTE2CisgICAgZGVmIHRlc3RJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEkxNiglZCknICUgaTE2KQorICAgICAgICByZXR1cm4gaTE2CiAKLSAgZGVmIHRlc3RJMzIoc2VsZiwgaTMyKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RJMzIoJWQpJyAlIGkzMikKLSAgICByZXR1cm4gaTMyCisgICAgZGVmIHRlc3RJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEkzMiglZCknICUgaTMyKQorICAgICAgICByZXR1cm4gaTMyCiAKLSAgZGVmIHRlc3RJNjQoc2VsZiwgaTY0KToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RJNjQoJWQpJyAlIGk2NCkKLSAgICByZXR1cm4gaTY0CisgICAgZGVmIHRlc3RJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEk2NCglZCknICUgaTY0KQorICAgICAgICByZXR1cm4gaTY0CiAKLSAgZGVmIHRlc3REb3VibGUoc2VsZiwgZHViKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3REb3VibGUoJWYpJyAlIGR1YikKLSAgICByZXR1cm4gZHViCisgICAgZGVmIHRlc3REb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdERvdWJsZSglZiknICUgZHViKQorICAgICAgICByZXR1cm4gZHViCiAKLSAgZGVmIHRlc3RCaW5hcnkoc2VsZiwgdGhpbmcpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdEJpbmFyeSgpJykgICMgVE9ETzogaGV4IG91dHB1dAotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0QmluYXJ5KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEJpbmFyeSgpJykgICMgVE9ETzogaGV4IG91dHB1dAorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdFN0cnVjdChzZWxmLCB0aGluZyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50KCd0ZXN0U3RydWN0KHslcywgJWQsICVkLCAlZH0pJyAlICh0aGluZy5zdHJpbmdfdGhpbmcsIHRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKSkKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdFN0cnVjdChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RTdHJ1Y3QoeyVzLCAlcywgJXMsICVzfSknICUgKHRoaW5nLnN0cmluZ190aGluZywgdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcpKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmLCBhcmcpOgotICAgICMgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICBwcmludCgndGVzdEV4Y2VwdGlvbiglcyknICUgYXJnKQotICAgIGlmIGFyZyA9PSAnWGNlcHRpb24nOgotICAgICAgcmFpc2UgWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9YXJnKQotICAgIGVsaWYgYXJnID09ICdURXhjZXB0aW9uJzoKLSAgICAgIHJhaXNlIFRFeGNlcHRpb24obWVzc2FnZT0nVGhpcyBpcyBhIFRFeGNlcHRpb24nKQorICAgIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYsIGFyZyk6CisgICAgICAgICMgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0RXhjZXB0aW9uKCVzKScgJSBhcmcpCisgICAgICAgIGlmIGFyZyA9PSAnWGNlcHRpb24nOgorICAgICAgICAgICAgcmFpc2UgWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9YXJnKQorICAgICAgICBlbGlmIGFyZyA9PSAnVEV4Y2VwdGlvbic6CisgICAgICAgICAgICByYWlzZSBURXhjZXB0aW9uKG1lc3NhZ2U9J1RoaXMgaXMgYSBURXhjZXB0aW9uJykKIAotICBkZWYgdGVzdE11bHRpRXhjZXB0aW9uKHNlbGYsIGFyZzAsIGFyZzEpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcyknICUgKGFyZzAsIGFyZzEpKQotICAgIGlmIGFyZzAgPT0gJ1hjZXB0aW9uJzoKLSAgICAgIHJhaXNlIFhjZXB0aW9uKGVycm9yQ29kZT0xMDAxLCBtZXNzYWdlPSdUaGlzIGlzIGFuIFhjZXB0aW9uJykKLSAgICBlbGlmIGFyZzAgPT0gJ1hjZXB0aW9uMic6Ci0gICAgICByYWlzZSBYY2VwdGlvbjIoCi0gICAgICAgIGVycm9yQ29kZT0yMDAyLAotICAgICAgICBzdHJ1Y3RfdGhpbmc9WHRydWN0KHN0cmluZ190aGluZz0nVGhpcyBpcyBhbiBYY2VwdGlvbjInKSkKLSAgICByZXR1cm4gWHRydWN0KHN0cmluZ190aGluZz1hcmcxKQorICAgIGRlZiB0ZXN0TXVsdGlFeGNlcHRpb24oc2VsZiwgYXJnMCwgYXJnMSk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpJyAlIChhcmcwLCBhcmcxKSkKKyAgICAgICAgaWYgYXJnMCA9PSAnWGNlcHRpb24nOgorICAgICAgICAgICAgcmFpc2UgWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9J1RoaXMgaXMgYW4gWGNlcHRpb24nKQorICAgICAgICBlbGlmIGFyZzAgPT0gJ1hjZXB0aW9uMic6CisgICAgICAgICAgICByYWlzZSBYY2VwdGlvbjIoCisgICAgICAgICAgICAgICAgZXJyb3JDb2RlPTIwMDIsCisgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nPVh0cnVjdChzdHJpbmdfdGhpbmc9J1RoaXMgaXMgYW4gWGNlcHRpb24yJykpCisgICAgICAgIHJldHVybiBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPWFyZzEpCiAKLSAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50KCd0ZXN0T25ld2F5KCVkKSA9PiBzbGVlcGluZy4uLicgJSBzZWNvbmRzKQotICAgIHRpbWUuc2xlZXAoc2Vjb25kcyAvIDMpICAjIGJlIHF1aWNrCi0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50KCdkb25lIHNsZWVwaW5nJykKKyAgICBkZWYgdGVzdE9uZXdheShzZWxmLCBzZWNvbmRzKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE9uZXdheSglZCkgPT4gc2xlZXBpbmcuLi4nICUgc2Vjb25kcykKKyAgICAgICAgdGltZS5zbGVlcChzZWNvbmRzIC8gMykgICMgYmUgcXVpY2sKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnZG9uZSBzbGVlcGluZycpCiAKLSAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3ROZXN0KCVzKScgJSB0aGluZykKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdE5lc3Qoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TmVzdCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RNYXAoJXMpJyAlIHRoaW5nKQotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE1hcCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0U3RyaW5nTWFwKHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RTdHJpbmdNYXAoJXMpJyAlIHRoaW5nKQotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0U3RyaW5nTWFwKHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFN0cmluZ01hcCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0U2V0KHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RTZXQoJXMpJyAlIHRoaW5nKQotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0U2V0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFNldCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0TGlzdChzZWxmLCB0aGluZyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50KCd0ZXN0TGlzdCglcyknICUgdGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3RMaXN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdExpc3QoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdEVudW0oc2VsZiwgdGhpbmcpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdEVudW0oJXMpJyAlIHRoaW5nKQotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0RW51bShzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RFbnVtKCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLSAgZGVmIHRlc3RUeXBlZGVmKHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RUeXBlZGVmKCVzKScgJSB0aGluZykKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0VHlwZWRlZiglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0TWFwTWFwKHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RNYXBNYXAoJXMpJyAlIHRoaW5nKQotICAgIHJldHVybiB7Ci0gICAgICAtNDogewotICAgICAgICAtNDogLTQsCi0gICAgICAgIC0zOiAtMywKLSAgICAgICAgLTI6IC0yLAotICAgICAgICAtMTogLTEsCi0gICAgICB9LAotICAgICAgNDogewotICAgICAgICA0OiA0LAotICAgICAgICAzOiAzLAotICAgICAgICAyOiAyLAotICAgICAgICAxOiAxLAotICAgICAgfSwKLSAgICB9CisgICAgZGVmIHRlc3RNYXBNYXAoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TWFwTWFwKCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIC00OiB7CisgICAgICAgICAgICAgICAgLTQ6IC00LAorICAgICAgICAgICAgICAgIC0zOiAtMywKKyAgICAgICAgICAgICAgICAtMjogLTIsCisgICAgICAgICAgICAgICAgLTE6IC0xLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIDQ6IHsKKyAgICAgICAgICAgICAgICA0OiA0LAorICAgICAgICAgICAgICAgIDM6IDMsCisgICAgICAgICAgICAgICAgMjogMiwKKyAgICAgICAgICAgICAgICAxOiAxLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfQogCi0gIGRlZiB0ZXN0SW5zYW5pdHkoc2VsZiwgYXJndW1lbnQpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdEluc2FuaXR5KCVzKScgJSBhcmd1bWVudCkKLSAgICByZXR1cm4gewotICAgICAgMTogewotICAgICAgICAyOiBhcmd1bWVudCwKLSAgICAgICAgMzogYXJndW1lbnQsCi0gICAgICB9LAotICAgICAgMjogezY6IEluc2FuaXR5KCl9LAotICAgIH0KKyAgICBkZWYgdGVzdEluc2FuaXR5KHNlbGYsIGFyZ3VtZW50KToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEluc2FuaXR5KCVzKScgJSBhcmd1bWVudCkKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIDE6IHsKKyAgICAgICAgICAgICAgICAyOiBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAzOiBhcmd1bWVudCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAyOiB7NjogSW5zYW5pdHkoKX0sCisgICAgICAgIH0KIAotICBkZWYgdGVzdE11bHRpKHNlbGYsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdE11bHRpKCVzKScgJSBbYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNV0pCi0gICAgcmV0dXJuIFh0cnVjdChzdHJpbmdfdGhpbmc9J0hlbGxvMicsCi0gICAgICAgICAgICAgICAgICBieXRlX3RoaW5nPWFyZzAsIGkzMl90aGluZz1hcmcxLCBpNjRfdGhpbmc9YXJnMikKKyAgICBkZWYgdGVzdE11bHRpKHNlbGYsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TXVsdGkoJXMpJyAlIFthcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1XSkKKyAgICAgICAgcmV0dXJuIFh0cnVjdChzdHJpbmdfdGhpbmc9J0hlbGxvMicsCisgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZz1hcmcwLCBpMzJfdGhpbmc9YXJnMSwgaTY0X3RoaW5nPWFyZzIpCiAKIAotIyBzZXQgdXAgdGhlIHByb3RvY29sIGZhY3RvcnkgZm9ybSB0aGUgLS1wcm90b2NvbCBvcHRpb24KLXBmYWN0b3J5X2NscyA9IFBST1RfRkFDVE9SSUVTLmdldChvcHRpb25zLnByb3RvLCBOb25lKQotaWYgcGZhY3RvcnlfY2xzIGlzIE5vbmU6Ci0gIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tcHJvdG9jb2wgb3B0aW9uOiAlcycgJSBvcHRpb25zLnByb3RvKQotcGZhY3RvcnkgPSBwZmFjdG9yeV9jbHMoKQorY2xhc3MgU2Vjb25kSGFuZGxlcihvYmplY3QpOgorICAgIGRlZiBzZWNvbmR0ZXN0U3RyaW5nKHNlbGYsIGFyZ3VtZW50KToKKyAgICAgICAgcmV0dXJuICJ0ZXN0U3RyaW5nKFwiIiArIGFyZ3VtZW50ICsgIlwiKSIKIAotIyBnZXQgdGhlIHNlcnZlciB0eXBlIChUU2ltcGxlU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsIGV0Yy4uLikKLWlmIGxlbihhcmdzKSA+IDE6Ci0gIHJhaXNlIEFzc2VydGlvbkVycm9yKCdPbmx5IG9uZSBzZXJ2ZXIgdHlwZSBtYXkgYmUgc3BlY2lmaWVkLCBub3QgbXVsdGlwbGUgdHlwZXMuJykKLXNlcnZlcl90eXBlID0gYXJnc1swXQogCi0jIFNldCB1cCB0aGUgaGFuZGxlciBhbmQgcHJvY2Vzc29yIG9iamVjdHMKLWhhbmRsZXIgICA9IFRlc3RIYW5kbGVyKCkKLXByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpCisjIExBU1RfU0VRSUQgaXMgYSBnbG9iYWwgYmVjYXVzZSB3ZSBoYXZlIG9uZSB0cmFuc3BvcnQgYW5kIG11bHRpcGxlIHByb3RvY29scworIyBydW5uaW5nIG9uIGl0ICh3aGVuIG11bHRpcGxleGVkKQorTEFTVF9TRVFJRCA9IE5vbmUKIAotIyBIYW5kbGUgVEh0dHBTZXJ2ZXIgYXMgYSBzcGVjaWFsIGNhc2UKLWlmIHNlcnZlcl90eXBlID09ICdUSHR0cFNlcnZlcic6Ci0gIHNlcnZlciA9VEh0dHBTZXJ2ZXIuVEh0dHBTZXJ2ZXIocHJvY2Vzc29yLCAoJycsIG9wdGlvbnMucG9ydCksIHBmYWN0b3J5KQotICBzZXJ2ZXIuc2VydmUoKQotICBzeXMuZXhpdCgwKQogCi0jIHNldCB1cCBzZXJ2ZXIgdHJhbnNwb3J0IGFuZCB0cmFuc3BvcnQgZmFjdG9yeQotCi1hYnNfa2V5X3BhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHNjcmlwdF9kaXIpLCAna2V5cycsICdzZXJ2ZXIucGVtJykKLQotaG9zdCA9IE5vbmUKLWlmIG9wdGlvbnMuc3NsOgotICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTU0xTb2NrZXQKLSAgdHJhbnNwb3J0ID0gVFNTTFNvY2tldC5UU1NMU2VydmVyU29ja2V0KGhvc3QsIG9wdGlvbnMucG9ydCwgY2VydGZpbGU9YWJzX2tleV9wYXRoKQotZWxzZToKLSAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU2VydmVyU29ja2V0KGhvc3QsIG9wdGlvbnMucG9ydCkKLXRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKLWlmIG9wdGlvbnMudHJhbnMgPT0gJ2J1ZmZlcmVkJzoKLSAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQotZWxpZiBvcHRpb25zLnRyYW5zID09ICdmcmFtZWQnOgotICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKQotZWxpZiBvcHRpb25zLnRyYW5zID09ICcnOgotICByYWlzZSBBc3NlcnRpb25FcnJvcignVW5rbm93biAtLXRyYW5zcG9ydCBvcHRpb246ICVzJyAlIG9wdGlvbnMudHJhbnMpCi1lbHNlOgotICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCi0jIGlmIC0temxpYiwgdGhlbiB3cmFwIHNlcnZlciB0cmFuc3BvcnQsIGFuZCB1c2UgYSBkaWZmZXJlbnQgdHJhbnNwb3J0IGZhY3RvcnkKLWlmIG9wdGlvbnMuemxpYjoKLSAgdHJhbnNwb3J0ID0gVFpsaWJUcmFuc3BvcnQuVFpsaWJUcmFuc3BvcnQodHJhbnNwb3J0KSAjIHdyYXAgIHdpdGggemxpYgotICB0ZmFjdG9yeSA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0RmFjdG9yeSgpCi0KLSMgZG8gc2VydmVyLXNwZWNpZmljIHNldHVwIGhlcmU6Ci1pZiBzZXJ2ZXJfdHlwZSA9PSAiVE5vbmJsb2NraW5nU2VydmVyIjoKLSAgc2VydmVyID0gVE5vbmJsb2NraW5nU2VydmVyLlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgaW5wdXRQcm90b2NvbEZhY3Rvcnk9cGZhY3RvcnkpCi1lbGlmIHNlcnZlcl90eXBlID09ICJUUHJvY2Vzc1Bvb2xTZXJ2ZXIiOgotICBpbXBvcnQgc2lnbmFsCi0gIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFByb2Nlc3NQb29sU2VydmVyCi0gIHNlcnZlciA9IFRQcm9jZXNzUG9vbFNlcnZlci5UUHJvY2Vzc1Bvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKLSAgc2VydmVyLnNldE51bVdvcmtlcnMoNSkKLQotICBkZWYgc2V0X2FsYXJtKCk6Ci0gICAgZGVmIGNsZWFuX3NodXRkb3duKHNpZ251bSwgZnJhbWUpOgotICAgICAgZm9yIHdvcmtlciBpbiBzZXJ2ZXIud29ya2VyczoKLSAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICAgICAgICBwcmludCgnVGVybWluYXRpbmcgd29ya2VyOiAlcycgJSB3b3JrZXIpCi0gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKQotICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICAgICAgcHJpbnQoJ1JlcXVlc3Rpbmcgc2VydmVyIHRvIHN0b3AoKScpCi0gICAgICB0cnk6Ci0gICAgICAgIHNlcnZlci5zdG9wKCkKLSAgICAgIGV4Y2VwdDoKK2NsYXNzIFRQZWRhbnRpY1NlcXVlbmNlSWRQcm90b2NvbFdyYXBwZXIoVFByb3RvY29sRGVjb3JhdG9yLlRQcm90b2NvbERlY29yYXRvcik6CisgICAgIiIiCisgICAgV3JhcHMgYW55IHByb3RvY29sIHdpdGggc2VxdWVuY2UgSUQgY2hlY2tpbmc6IGxvb2tzIGZvciBvdXRib3VuZAorICAgIHVuaXF1ZW5lc3MgYXMgd2VsbCBhcyByZXF1ZXN0L3Jlc3BvbnNlIGFsaWdubWVudC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wpOgorICAgICAgICAjIFRQcm90b2NvbERlY29yYXRvci5fX25ld19fIGRvZXMgYWxsIHRoZSBoZWF2eSBsaWZ0aW5nCiAgICAgICAgIHBhc3MKLSAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBjbGVhbl9zaHV0ZG93bikKLSAgICBzaWduYWwuYWxhcm0oNCkKLSAgc2V0X2FsYXJtKCkKLWVsc2U6Ci0gICMgbG9vayB1cCBzZXJ2ZXIgY2xhc3MgZHluYW1pY2FsbHkgdG8gaW5zdGFudGlhdGUgc2VydmVyCi0gIFNlcnZlckNsYXNzID0gZ2V0YXR0cihUU2VydmVyLCBzZXJ2ZXJfdHlwZSkKLSAgc2VydmVyID0gU2VydmVyQ2xhc3MocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKLSMgZW50ZXIgc2VydmVyIG1haW4gbG9vcAotc2VydmVyLnNlcnZlKCkKKworICAgIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgorICAgICAgICBnbG9iYWwgTEFTVF9TRVFJRAorICAgICAgICAobmFtZSwgdHlwZSwgc2VxaWQpID1cCisgICAgICAgICAgICBzdXBlcihUUGVkYW50aWNTZXF1ZW5jZUlkUHJvdG9jb2xXcmFwcGVyLCBzZWxmKS5yZWFkTWVzc2FnZUJlZ2luKCkKKyAgICAgICAgaWYgTEFTVF9TRVFJRCBpcyBub3QgTm9uZSBhbmQgTEFTVF9TRVFJRCA9PSBzZXFpZDoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgIldlIHJlY2VpdmVkIHRoZSBzYW1lIHNlcWlkIHswfSB0d2ljZSBpbiBhIHJvdyIuZm9ybWF0KHNlcWlkKSkKKyAgICAgICAgTEFTVF9TRVFJRCA9IHNlcWlkCisgICAgICAgIHJldHVybiAobmFtZSwgdHlwZSwgc2VxaWQpCisKKworZGVmIG1ha2VfcGVkYW50aWMocHJvdG8pOgorICAgICIiIiBXcmFwIGEgcHJvdG9jb2wgaW4gdGhlIHBlZGFudGljIHNlcXVlbmNlIElEIHdyYXBwZXIuICIiIgorICAgICMgTk9URTogdGhpcyBpcyBkaXNhYmxlZCBmb3Igbm93IGFzIG1hbnkgY2xpZW50cyBzZW5kIHNlcWlkCisgICAgIyAgICAgICBvZiB6ZXJvIGFuZCB0aGF0IGlzIG9rYXksIG5lZWQgYSB3YXkgdG8gaWRlbnRpZnkKKyAgICAjICAgICAgIGNsaWVudHMgdGhhdCBNVVNUIHNlbmQgc2VxaWQgdW5pcXVlIHRvIGZ1bmN0aW9uIHJpZ2h0CisgICAgIyAgICAgICBvciBqdXN0IGZvcmNlIGFsbCBpbXBsZW1lbnRhdGlvbnMgdG8gc2VuZCB1bmlxdWUgc2VxaWRzIChwcmVmZXJyZWQpCisgICAgcmV0dXJuIHByb3RvICAjIFRQZWRhbnRpY1NlcXVlbmNlSWRQcm90b2NvbFdyYXBwZXIocHJvdG8pCisKKworY2xhc3MgVFBlZGFudGljU2VxdWVuY2VJZFByb3RvY29sRmFjdG9yeShUUHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVuY2Fwc3VsYXRlZCk6CisgICAgICAgIHN1cGVyKFRQZWRhbnRpY1NlcXVlbmNlSWRQcm90b2NvbEZhY3RvcnksIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5lbmNhcHN1bGF0ZWQgPSBlbmNhcHN1bGF0ZWQKKworICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBtYWtlX3BlZGFudGljKHNlbGYuZW5jYXBzdWxhdGVkLmdldFByb3RvY29sKHRyYW5zKSkKKworCitkZWYgbWFpbihvcHRpb25zKToKKyAgICAjIGNvbW1vbiBoZWFkZXIgYWxsb3dlZCBjbGllbnQgdHlwZXMKKyAgICBhbGxvd2VkX2NsaWVudF90eXBlcyA9IFsKKyAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTLAorICAgICAgICBUSGVhZGVyVHJhbnNwb3J0LlRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9CSU5BUlksCisgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLAorICAgICAgICBUSGVhZGVyVHJhbnNwb3J0LlRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9DT01QQUNULAorICAgICAgICBUSGVhZGVyVHJhbnNwb3J0LlRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0NPTVBBQ1QsCisgICAgXQorCisgICAgIyBzZXQgdXAgdGhlIHByb3RvY29sIGZhY3RvcnkgZm9ybSB0aGUgLS1wcm90b2NvbCBvcHRpb24KKyAgICBwcm90X2ZhY3RvcmllcyA9IHsKKyAgICAgICAgJ2FjY2VsJzogVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpLAorICAgICAgICAnbXVsdGlhJzogVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpLAorICAgICAgICAnYWNjZWxjJzogVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCksCisgICAgICAgICdtdWx0aWFjJzogVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCksCisgICAgICAgICdiaW5hcnknOiBUUGVkYW50aWNTZXF1ZW5jZUlkUHJvdG9jb2xGYWN0b3J5KFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpLAorICAgICAgICAnbXVsdGknOiBUUGVkYW50aWNTZXF1ZW5jZUlkUHJvdG9jb2xGYWN0b3J5KFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpLAorICAgICAgICAnY29tcGFjdCc6IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSwKKyAgICAgICAgJ211bHRpYyc6IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSwKKyAgICAgICAgJ2hlYWRlcic6IFRIZWFkZXJQcm90b2NvbC5USGVhZGVyUHJvdG9jb2xGYWN0b3J5KGFsbG93ZWRfY2xpZW50X3R5cGVzKSwKKyAgICAgICAgJ211bHRpaCc6IFRIZWFkZXJQcm90b2NvbC5USGVhZGVyUHJvdG9jb2xGYWN0b3J5KGFsbG93ZWRfY2xpZW50X3R5cGVzKSwKKyAgICAgICAgJ2pzb24nOiBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCksCisgICAgICAgICdtdWx0aWonOiBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCksCisgICAgfQorICAgIHBmYWN0b3J5ID0gcHJvdF9mYWN0b3JpZXMuZ2V0KG9wdGlvbnMucHJvdG8sIE5vbmUpCisgICAgaWYgcGZhY3RvcnkgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gLS1wcm90b2NvbCBvcHRpb246ICVzJyAlIG9wdGlvbnMucHJvdG8pCisgICAgdHJ5OgorICAgICAgICBwZmFjdG9yeS5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gb3B0aW9ucy5zdHJpbmdfbGltaXQKKyAgICAgICAgcGZhY3RvcnkuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IG9wdGlvbnMuY29udGFpbmVyX2xpbWl0CisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgIyBJZ25vcmUgZXJyb3JzIGZvciB0aG9zZSBwcm90b2NvbHMgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGxlbmd0aCBsaW1pdAorICAgICAgICBwYXNzCisKKyAgICAjIGdldCB0aGUgc2VydmVyIHR5cGUgKFRTaW1wbGVTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwgZXRjLi4uKQorICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdPbmx5IG9uZSBzZXJ2ZXIgdHlwZSBtYXkgYmUgc3BlY2lmaWVkLCBub3QgbXVsdGlwbGUgdHlwZXMuJykKKyAgICBzZXJ2ZXJfdHlwZSA9IGFyZ3NbMF0KKyAgICBpZiBvcHRpb25zLnRyYW5zID09ICdodHRwJzoKKyAgICAgICAgc2VydmVyX3R5cGUgPSAnVEh0dHBTZXJ2ZXInCisKKyAgICAjIFNldCB1cCB0aGUgaGFuZGxlciBhbmQgcHJvY2Vzc29yIG9iamVjdHMKKyAgICBoYW5kbGVyID0gVGVzdEhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpCisKKyAgICBpZiBvcHRpb25zLnByb3RvLnN0YXJ0c3dpdGgoJ211bHRpJyk6CisgICAgICAgIHNlY29uZEhhbmRsZXIgPSBTZWNvbmRIYW5kbGVyKCkKKyAgICAgICAgc2Vjb25kUHJvY2Vzc29yID0gU2Vjb25kU2VydmljZS5Qcm9jZXNzb3Ioc2Vjb25kSGFuZGxlcikKKworICAgICAgICBtdWx0aXBsZXhlZFByb2Nlc3NvciA9IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpCisgICAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyRGVmYXVsdChwcm9jZXNzb3IpCisgICAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKCdUaHJpZnRUZXN0JywgcHJvY2Vzc29yKQorICAgICAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcignU2Vjb25kU2VydmljZScsIHNlY29uZFByb2Nlc3NvcikKKyAgICAgICAgcHJvY2Vzc29yID0gbXVsdGlwbGV4ZWRQcm9jZXNzb3IKKworICAgIGdsb2JhbCBzZXJ2ZXIKKworICAgICMgSGFuZGxlIFRIdHRwU2VydmVyIGFzIGEgc3BlY2lhbCBjYXNlCisgICAgaWYgc2VydmVyX3R5cGUgPT0gJ1RIdHRwU2VydmVyJzoKKyAgICAgICAgaWYgb3B0aW9ucy5zc2w6CisgICAgICAgICAgICBfX2NlcnRmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgImtleXMiLCAic2VydmVyLmNydCIpCisgICAgICAgICAgICBfX2tleWZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJzZXJ2ZXIua2V5IikKKyAgICAgICAgICAgIHNlcnZlciA9IFRIdHRwU2VydmVyLlRIdHRwU2VydmVyKHByb2Nlc3NvciwgKCcnLCBvcHRpb25zLnBvcnQpLCBwZmFjdG9yeSwgY2VydF9maWxlPV9fY2VydGZpbGUsIGtleV9maWxlPV9fa2V5ZmlsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IFRIdHRwU2VydmVyLlRIdHRwU2VydmVyKHByb2Nlc3NvciwgKCcnLCBvcHRpb25zLnBvcnQpLCBwZmFjdG9yeSkKKyAgICAgICAgc2VydmVyLnNlcnZlKCkKKyAgICAgICAgc3lzLmV4aXQoMCkKKworICAgICMgc2V0IHVwIHNlcnZlciB0cmFuc3BvcnQgYW5kIHRyYW5zcG9ydCBmYWN0b3J5CisKKyAgICBhYnNfa2V5X3BhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAna2V5cycsICdzZXJ2ZXIucGVtJykKKworICAgIGhvc3QgPSBOb25lCisgICAgaWYgb3B0aW9ucy5zc2w6CisgICAgICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNTTFNvY2tldAorICAgICAgICB0cmFuc3BvcnQgPSBUU1NMU29ja2V0LlRTU0xTZXJ2ZXJTb2NrZXQoaG9zdCwgb3B0aW9ucy5wb3J0LCBjZXJ0ZmlsZT1hYnNfa2V5X3BhdGgpCisgICAgZWxzZToKKyAgICAgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU2VydmVyU29ja2V0KGhvc3QsIG9wdGlvbnMucG9ydCkKKyAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgaWYgb3B0aW9ucy50cmFucyA9PSAnYnVmZmVyZWQnOgorICAgICAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgZWxpZiBvcHRpb25zLnRyYW5zID09ICdmcmFtZWQnOgorICAgICAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnJzoKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gLS10cmFuc3BvcnQgb3B0aW9uOiAlcycgJSBvcHRpb25zLnRyYW5zKQorICAgIGVsc2U6CisgICAgICAgIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICAjIGlmIC0temxpYiwgdGhlbiB3cmFwIHNlcnZlciB0cmFuc3BvcnQsIGFuZCB1c2UgYSBkaWZmZXJlbnQgdHJhbnNwb3J0IGZhY3RvcnkKKyAgICBpZiBvcHRpb25zLnpsaWI6CisgICAgICAgIHRyYW5zcG9ydCA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0KHRyYW5zcG9ydCkgICMgd3JhcCAgd2l0aCB6bGliCisgICAgICAgIHRmYWN0b3J5ID0gVFpsaWJUcmFuc3BvcnQuVFpsaWJUcmFuc3BvcnRGYWN0b3J5KCkKKworICAgICMgZG8gc2VydmVyLXNwZWNpZmljIHNldHVwIGhlcmU6CisgICAgaWYgc2VydmVyX3R5cGUgPT0gIlROb25ibG9ja2luZ1NlcnZlciI6CisgICAgICAgIHNlcnZlciA9IFROb25ibG9ja2luZ1NlcnZlci5UTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIGlucHV0UHJvdG9jb2xGYWN0b3J5PXBmYWN0b3J5KQorICAgIGVsaWYgc2VydmVyX3R5cGUgPT0gIlRQcm9jZXNzUG9vbFNlcnZlciI6CisgICAgICAgIGltcG9ydCBzaWduYWwKKyAgICAgICAgZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUUHJvY2Vzc1Bvb2xTZXJ2ZXIKKyAgICAgICAgc2VydmVyID0gVFByb2Nlc3NQb29sU2VydmVyLlRQcm9jZXNzUG9vbFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgICAgICBzZXJ2ZXIuc2V0TnVtV29ya2Vycyg1KQorCisgICAgICAgIGRlZiBzZXRfYWxhcm0oKToKKyAgICAgICAgICAgIGRlZiBjbGVhbl9zaHV0ZG93bihzaWdudW0sIGZyYW1lKToKKyAgICAgICAgICAgICAgICBmb3Igd29ya2VyIGluIHNlcnZlci53b3JrZXJzOgorICAgICAgICAgICAgICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCdUZXJtaW5hdGluZyB3b3JrZXI6ICVzJyAlIHdvcmtlcikKKyAgICAgICAgICAgICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpCisgICAgICAgICAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCdSZXF1ZXN0aW5nIHNlcnZlciB0byBzdG9wKCknKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnN0b3AoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIGNsZWFuX3NodXRkb3duKQorICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDQpCisgICAgICAgIHNldF9hbGFybSgpCisgICAgZWxzZToKKyAgICAgICAgIyBsb29rIHVwIHNlcnZlciBjbGFzcyBkeW5hbWljYWxseSB0byBpbnN0YW50aWF0ZSBzZXJ2ZXIKKyAgICAgICAgU2VydmVyQ2xhc3MgPSBnZXRhdHRyKFRTZXJ2ZXIsIHNlcnZlcl90eXBlKQorICAgICAgICBzZXJ2ZXIgPSBTZXJ2ZXJDbGFzcyhwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgICMgZW50ZXIgc2VydmVyIG1haW4gbG9vcAorICAgIHNlcnZlci5zZXJ2ZSgpCisKKworZGVmIGV4aXRfZ3JhY2VmdWxseShzaWdudW0sIGZyYW1lKToKKyAgICBwcmludCgiU0lHSU5UIHJlY2VpdmVkXG4iKQorICAgIHNlcnZlci5zaHV0ZG93bigpICAgIyBkb2Vzbid0IHdvcmsgcHJvcGVybHksIHlldAorICAgIHN5cy5leGl0KDApCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdJTlQsIGV4aXRfZ3JhY2VmdWxseSkKKworICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tbGlicHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdsaWJweWRpcicsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGRpcmVjdG9yeSB0byBzeXMucGF0aCBmb3IgbG9jYXRpbmcgbGlicmFyeSBjb2RlJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSdnZW4tcHknLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2luY2x1ZGUgdGhpcyBkaXJlY3RvcnkgdG8gc3lzLnBhdGggZm9yIGxvY2F0aW5nIGdlbmVyYXRlZCBjb2RlJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0icG9ydCBudW1iZXIgZm9yIHNlcnZlciB0byBsaXN0ZW4gb24iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXpsaWIiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJ6bGliIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ1c2UgemxpYiB3cmFwcGVyIGZvciBjb21wcmVzc2VkIHRyYW5zcG9ydCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tc3NsIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0ic3NsIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ1c2UgU1NMIGZvciBlbmNyeXB0ZWQgdHJhbnNwb3J0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctcScsICctLXF1aWV0JywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLXByb3RvY29sJywgZGVzdD0icHJvdG8iLCB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InByb3RvY29sIHRvIHVzZSwgb25lIG9mOiBhY2NlbCwgYWNjZWxjLCBiaW5hcnksIGNvbXBhY3QsIGpzb24sIG11bHRpLCBtdWx0aWEsIG11bHRpYWMsIG11bHRpYywgbXVsdGloLCBtdWx0aWoiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLXRyYW5zcG9ydCcsIGRlc3Q9InRyYW5zIiwgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ0cmFuc3BvcnQgdG8gdXNlLCBvbmUgb2Y6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWNvbnRhaW5lci1saW1pdCcsIGRlc3Q9J2NvbnRhaW5lcl9saW1pdCcsIHR5cGU9J2ludCcsIGRlZmF1bHQ9Tm9uZSkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1zdHJpbmctbGltaXQnLCBkZXN0PSdzdHJpbmdfbGltaXQnLCB0eXBlPSdpbnQnLCBkZWZhdWx0PU5vbmUpCisgICAgcGFyc2VyLnNldF9kZWZhdWx0cyhwb3J0PTkwOTAsIHZlcmJvc2U9MSwgcHJvdG89J2JpbmFyeScsIHRyYW5zcG9ydD0nYnVmZmVyZWQnKQorICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICAjIFByaW50IFRTZXJ2ZXIgbG9nIHRvIHN0ZG91dCBzbyB0aGF0IHRoZSB0ZXN0LXJ1bm5lciBjYW4gcmVkaXJlY3QgaXQgdG8gbG9nIGZpbGVzCisgICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1vcHRpb25zLnZlcmJvc2UpCisKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKFNDUklQVF9ESVIsIG9wdGlvbnMuZ2VucHlkaXIpKQorCisgICAgZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0LCBTZWNvbmRTZXJ2aWNlCisgICAgZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgWHRydWN0LCBYY2VwdGlvbiwgWGNlcHRpb24yLCBJbnNhbml0eQorICAgIGZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbgorICAgIGZyb20gdGhyaWZ0LlRNdWx0aXBsZXhlZFByb2Nlc3NvciBpbXBvcnQgVE11bHRpcGxleGVkUHJvY2Vzc29yCisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUSGVhZGVyVHJhbnNwb3J0CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUWmxpYlRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSGVhZGVyUHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFNlcnZlciwgVE5vbmJsb2NraW5nU2VydmVyLCBUSHR0cFNlcnZlcgorCisgICAgc3lzLmV4aXQobWFpbihvcHRpb25zKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdFNvY2tldC5weSBiL3Rlc3QvcHkvVGVzdFNvY2tldC5weQppbmRleCBiOWJkZjI3Li42MTllYjEwIDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RTb2NrZXQucHkKKysrIGIvdGVzdC9weS9UZXN0U29ja2V0LnB5CkBAIC0xOSwyOSArMTksMTYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IKLWZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXInLCBkZWZhdWx0PSdnZW4tcHknKQotb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKLWRlbCBzeXMuYXJndlsxOl0gIyBjbGVhbiB1cCBoYWNrIHNvIHVuaXR0ZXN0IGRvZXNuJ3QgY29tcGxhaW4KLXN5cy5wYXRoLmluc2VydCgwLCBvcHRpb25zLmdlbnB5ZGlyKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCi0KLWZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdAotZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgKgotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHRpbWUKIGltcG9ydCBzb2NrZXQKIGltcG9ydCByYW5kb20KLWZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgorCiAKIGNsYXNzIFRpbWVvdXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIGZvciBpIGluIHhyYW5nZSg1MCk6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDUwKToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAjIGZpbmQgYSBwb3J0IHdlIGNhbiB1c2UKICAgICAgICAgICAgICAgICBzZWxmLmxpc3Rlbl9zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQpAQCAtNDksNyArMzYsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYubGlzdGVuX3NvY2suYmluZCgoJ2xvY2FsaG9zdCcsIHNlbGYucG9ydCkpCiAgICAgICAgICAgICAgICAgc2VsZi5saXN0ZW5fc29jay5saXN0ZW4oNSkKICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICBpZiBpID09IDQ5OgogICAgICAgICAgICAgICAgICAgICByYWlzZQogCkBAIC01OCwxMiArNDUsMTIgQEAKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBsZWFreSA9IFtdCi0gICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMCk6CiAgICAgICAgICAgICAgICAgc29ja2V0ID0gVFNvY2tldC5UU29ja2V0KCdsb2NhbGhvc3QnLCBzZWxmLnBvcnQpCiAgICAgICAgICAgICAgICAgc29ja2V0LnNldFRpbWVvdXQoMTApCiAgICAgICAgICAgICAgICAgc29ja2V0Lm9wZW4oKQogICAgICAgICAgICAgICAgIGxlYWt5LmFwcGVuZChzb2NrZXQpCi0gICAgICAgIGV4Y2VwdDoKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0aW1lLnRpbWUoKSAtIHN0YXJ0dGltZSA8IDUuMCkKIAogICAgIGRlZiB0ZXN0V3JpdGVUaW1lb3V0KHNlbGYpOgpAQCAtNzUsMTUgKzYyLDE3IEBACiAgICAgICAgICAgICBzb2NrZXQub3BlbigpCiAgICAgICAgICAgICBsc29jayA9IHNlbGYubGlzdGVuX3NvY2suYWNjZXB0KCkKICAgICAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgICAgc29ja2V0LndyaXRlKCJoaSIgKiAxMDApCisgICAgICAgICAgICAgICAgbHNvY2sud3JpdGUoImhpIiAqIDEwMCkKIAotICAgICAgICBleGNlcHQ6CisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICBzZWxmLmFzc2VydF8odGltZS50aW1lKCkgLSBzdGFydHRpbWUgPCA1LjApCiAKLXN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLWxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQogCi1zdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGltZW91dFRlc3QpKQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCiAKLXRlc3RSdW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikKLXRlc3RSdW5uZXIucnVuKHN1aXRlKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUaW1lb3V0VGVzdCkpCisKKyAgICB0ZXN0UnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpCisgICAgdGVzdFJ1bm5lci5ydW4oc3VpdGUpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RTeW50YXgucHkgYi90ZXN0L3B5L1Rlc3RTeW50YXgucHkKaW5kZXggOWY3MWNmNS4uZGJlNzk3NSAxMDA3NTUKLS0tIGEvdGVzdC9weS9UZXN0U3ludGF4LnB5CisrKyBiL3Rlc3QvcHkvVGVzdFN5bnRheC5weQpAQCAtMTksMTUgKzE5LDYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IKLWZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXInLCBkZWZhdWx0PSdnZW4tcHknKQotb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKLWRlbCBzeXMuYXJndlsxOl0gIyBjbGVhbiB1cCBoYWNrIHNvIHVuaXR0ZXN0IGRvZXNuJ3QgY29tcGxhaW4KLXN5cy5wYXRoLmluc2VydCgwLCBvcHRpb25zLmdlbnB5ZGlyKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCi0KICMgSnVzdCBpbXBvcnQgdGhlc2UgZ2VuZXJhdGVkIGZpbGVzIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBzeW50YWN0aWNhbGx5IHZhbGlkCi1mcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBFbXB0eVNlcnZpY2UKLWZyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IEluaGVyaXRlZAorZnJvbSBEZWJ1Z1Byb3RvVGVzdCBpbXBvcnQgRW1wdHlTZXJ2aWNlICAjIG5vcWEKK2Zyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IEluaGVyaXRlZCAgIyBub3FhCmRpZmYgLS1naXQgYS90ZXN0L3B5L2dlbmVyYXRlLmNtYWtlIGIvdGVzdC9weS9nZW5lcmF0ZS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQxNGNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9nZW5lcmF0ZS5jbWFrZQpAQCAtMCwwICsxLDM2IEBACittYWNybyhHRU5FUkFURSBGSUxFTkFNRSBHRU5FUkFUT1IgT1VUUFVURElSKQorICBmaWxlKE1BS0VfRElSRUNUT1JZICR7TVlfQ1VSUkVOVF9CSU5BUllfRElSfS8ke09VVFBVVERJUn0pCisgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7VEhSSUZUQ09NUElMRVJ9IC0tZ2VuICR7R0VORVJBVE9SfSAtb3V0ICR7TVlfQ1VSUkVOVF9CSU5BUllfRElSfS8ke09VVFBVVERJUn0gJHtGSUxFTkFNRX0KKyAgICAgICAgICAgICAgICAgIFJFU1VMVF9WQVJJQUJMRSBDTURfUkVTVUxUKQorICBpZihDTURfUkVTVUxUKQorICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJFcnJvciBnZW5lcmF0aW5nICR7RklMRU5BTUV9IHdpdGggZ2VuZXJhdG9yICR7R0VORVJBVE9SfSIpCisgIGVuZGlmKCkKK2VuZG1hY3JvKEdFTkVSQVRFKQorCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5IGdlbi1weS1kZWZhdWx0KQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweTpzbG90cyBnZW4tcHktc2xvdHMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5Om9sZF9zdHlsZSBnZW4tcHktb2xkc3R5bGUpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5Om5vX3V0ZjhzdHJpbmdzIGdlbi1weS1ub191dGY4c3RyaW5ncykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6ZHluYW1pYyBnZW4tcHktZHluYW1pYykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6ZHluYW1pYyxzbG90cyBnZW4tcHktZHluYW1pY3Nsb3RzKQorCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweSBnZW4tcHktZGVmYXVsdCkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5OnNsb3RzIGdlbi1weS1zbG90cykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5Om9sZF9zdHlsZSBnZW4tcHktb2xkc3R5bGUpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpub191dGY4c3RyaW5ncyBnZW4tcHktbm9fdXRmOHN0cmluZ3MpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpkeW5hbWljIGdlbi1weS1keW5hbWljKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHk6ZHluYW1pYyxzbG90cyBnZW4tcHktZHluYW1pY3Nsb3RzKQorCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5IGdlbi1weS1kZWZhdWx0KQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpzbG90cyBnZW4tcHktc2xvdHMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5Om9sZF9zdHlsZSBnZW4tcHktb2xkc3R5bGUpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5Om5vX3V0ZjhzdHJpbmdzIGdlbi1weS1ub191dGY4c3RyaW5ncykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6ZHluYW1pYyBnZW4tcHktZHluYW1pYykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6ZHluYW1pYyxzbG90cyBnZW4tcHktZHluYW1pY3Nsb3RzKQorCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHkgZ2VuLXB5LWRlZmF1bHQpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6c2xvdHMgZ2VuLXB5LXNsb3RzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5Om9sZF9zdHlsZSBnZW4tcHktb2xkc3R5bGUpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6bm9fdXRmOHN0cmluZ3MgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5OmR5bmFtaWMgZ2VuLXB5LWR5bmFtaWMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6ZHluYW1pYyxzbG90cyBnZW4tcHktZHluYW1pY3Nsb3RzKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9zZXR1cC5jZmcgYi90ZXN0L3B5L3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGExZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9zZXR1cC5jZmcKQEAgLTAsMCArMSwyIEBACitbZmxha2U4XQorbWF4LWxpbmUtbGVuZ3RoID0gMTAwCmRpZmYgLS1naXQgYS90ZXN0L3B5L3V0aWwucHkgYi90ZXN0L3B5L3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiM2Y1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvdXRpbC5weQpAQCAtMCwwICsxLDMyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitfU0NSSVBUX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorX1JPT1RfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfU0NSSVBUX0RJUikpCisKKworZGVmIGxvY2FsX2xpYnBhdGgoKToKKyAgICBnbG9iZGlyID0gb3MucGF0aC5qb2luKF9ST09UX0RJUiwgJ2xpYicsICdweScsICdidWlsZCcsICdsaWIuKicpCisgICAgZm9yIGxpYnBhdGggaW4gZ2xvYi5nbG9iKGdsb2JkaXIpOgorICAgICAgICBpZiBsaWJwYXRoLmVuZHN3aXRoKCctJWQuJWQnICUgKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0pKToKKyAgICAgICAgICAgIHJldHVybiBsaWJwYXRoCmRpZmYgLS1naXQgYS90ZXN0L3JiL0dlbWZpbGUgYi90ZXN0L3JiL0dlbWZpbGUKaW5kZXggODMwMWU0NC4uNGZmMDUzOSAxMDA2NDQKLS0tIGEvdGVzdC9yYi9HZW1maWxlCisrKyBiL3Rlc3QvcmIvR2VtZmlsZQpAQCAtMiw1ICsyLDYgQEAKIAogcmVxdWlyZSAicnVieWdlbXMiCiAKLWdlbSAicmFjayIsICJ+PiAxLjUuMiIKLWdlbSAidGhpbiIsICJ+PiAxLjUuMCIKK2dlbSAncmFjaycsICd+PiAyLjAnLCAnPj0gMi4wLjQnCitnZW0gJ3RoaW4nLCAnfj4gMS43JywgJz49IDEuNy4yJworZ2VtICd0ZXN0LXVuaXQnLCAnfj4gMy4yJywgJz49IDMuMi43JwpkaWZmIC0tZ2l0IGEvdGVzdC9yYi9NYWtlZmlsZS5hbSBiL3Rlc3QvcmIvTWFrZWZpbGUuYW0KaW5kZXggN2I3NGM2Yy4uMzkxMDkzNCAxMDA2NDQKLS0tIGEvdGVzdC9yYi9NYWtlZmlsZS5hbQorKysgYi90ZXN0L3JiL01ha2VmaWxlLmFtCkBAIC0xNywxMSArMTcsMTAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIHN0dWJzOiAkKFRIUklGVCkgLi4vVGhyaWZ0VGVzdC50aHJpZnQgLi4vU21hbGxUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiByYiAuLi9UaHJpZnRUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiByYiAuLi9TbWFsbFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHJiIC4uL1JlY3Vyc2l2ZS50aHJpZnQKIAogcHJlY3Jvc3M6IHN0dWJzCiAKQEAgLTMxLDMgKzMwLDggQEAKIAkkKEJVTkRMRVIpIGV4ZWMgJChSVUJZKSAtSS4gdGVzdF9zdWl0ZS5yYgogZW5kaWYKIAorY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLXJiLworCitkaXN0LWhvb2s6CisJJChSTSkgLXIgJChkaXN0ZGlyKS9nZW4tcmIvCmRpZmYgLS1naXQgYS90ZXN0L3JiL2dlbmVyYXRpb24vdGVzdF9yZWN1cnNpdmUucmIgYi90ZXN0L3JiL2dlbmVyYXRpb24vdGVzdF9yZWN1cnNpdmUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxMmY3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmIvZ2VuZXJhdGlvbi90ZXN0X3JlY3Vyc2l2ZS5yYgpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uL3Rlc3RfaGVscGVyJykKK3JlcXVpcmUgJ3JlY3Vyc2l2ZV90eXBlcycKKworY2xhc3MgVGVzdFJlY3Vyc2l2ZUdlbmVyYXRpb24gPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorICBDSElMRF9JVEVNID0gImNoaWxkIGl0ZW0iCisgIFBBUkVOVF9JVEVNID0gInBhcmVudCBpdGVtIgorCisgIGRlZiB0ZXN0X2Nhbl9jcmVhdGVfcmVjdXJzaXZlX3RyZWUKKworICAgIGNoaWxkX3RyZWUgPSBSZWNUcmVlLm5ldworICAgIGNoaWxkX3RyZWUuaXRlbSA9IENISUxEX0lURU0KKworICAgIHBhcmVudF90cmVlID0gUmVjVHJlZS5uZXcKKyAgICBwYXJlbnRfdHJlZS5pdGVtID0gUEFSRU5UX0lURU0KKyAgICBwYXJlbnRfdHJlZS5jaGlsZHJlbiA9IFtjaGlsZF90cmVlXQorCisgICAgYXNzZXJ0X2VxdWFsKFBBUkVOVF9JVEVNLCBwYXJlbnRfdHJlZS5pdGVtKQorICAgIGFzc2VydF9lcXVhbCgxLCBwYXJlbnRfdHJlZS5jaGlsZHJlbi5sZW5ndGgpCisgICAgYXNzZXJ0X2VxdWFsKENISUxEX0lURU0sIHBhcmVudF90cmVlLmNoaWxkcmVuLmZpcnN0Lml0ZW0pCisgICAgYXNzZXJ0X25pbChwYXJlbnRfdHJlZS5jaGlsZHJlbi5maXJzdC5jaGlsZHJlbikKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYgppbmRleCBiMzFhMDI0Li42MzlhY2E5IDEwMDc1NQotLS0gYS90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIKKysrIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiCkBAIC0xLDQgKzEsNSBAQAogIyEvdXNyL2Jpbi9lbnYgcnVieQorIyBlbmNvZGluZzogdXRmLTgKIAogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCkBAIC0yNSwzNSArMjYsNjMgQEAKIHJlcXVpcmUgJ3RocmlmdCcKIHJlcXVpcmUgJ3RocmlmdF90ZXN0JwogCi0kcHJvdG9jb2xUeXBlID0gImJpbmFyeSIKKyRkb21haW5fc29ja2V0ID0gbmlsCiAkaG9zdCA9ICJsb2NhbGhvc3QiCiAkcG9ydCA9IDkwOTAKKyRwcm90b2NvbFR5cGUgPSAiYmluYXJ5IgorJHNzbCA9IGZhbHNlCiAkdHJhbnNwb3J0ID0gImJ1ZmZlcmVkIgorCiBBUkdWLmVhY2ggZG98YXwKICAgaWYgYSA9PSAiLS1oZWxwIgogICAgIHB1dHMgIkFsbG93ZWQgb3B0aW9uczoiCiAgICAgcHV0cyAiXHQgLWggWyAtLWhlbHAgXSBcdCBwcm9kdWNlIGhlbHAgbWVzc2FnZSIKLSAgICBwdXRzICJcdC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpIFx0IEhvc3QgdG8gY29ubmVjdCIKLSAgICBwdXRzICJcdC0tcG9ydCBhcmcgKD05MDkwKSBcdCBQb3J0IG51bWJlciB0byBsaXN0ZW4iCi0gICAgcHV0cyAiXHQtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgXHQgcHJvdG9jb2w6IGJpbmFyeSwgYWNjZWwiCisgICAgcHV0cyAiXHQtLWRvbWFpbi1zb2NrZXQgYXJnICg9KSBcdCBVbml4IGRvbWFpbiBzb2NrZXQgcGF0aCIKKyAgICBwdXRzICJcdC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpIFx0IEhvc3QgdG8gY29ubmVjdCBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS1wb3J0IGFyZyAoPTkwOTApIFx0IFBvcnQgbnVtYmVyIHRvIGxpc3RlbiBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpIFx0IHByb3RvY29sOiBhY2NlbCwgYmluYXJ5LCBjb21wYWN0LCBqc29uIgorICAgIHB1dHMgIlx0LS1zc2wgXHQgdXNlIHNzbCBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgogICAgIHB1dHMgIlx0LS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCIKICAgICBleGl0CisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tZG9tYWluLXNvY2tldCIpCisgICAgJGRvbWFpbl9zb2NrZXQgPSBhLnNwbGl0KCI9IilbMV0KICAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1ob3N0IikKICAgICAkaG9zdCA9IGEuc3BsaXQoIj0iKVsxXQogICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXByb3RvY29sIikKICAgICAkcHJvdG9jb2xUeXBlID0gYS5zcGxpdCgiPSIpWzFdCisgIGVsc2lmIGEgPT0gIi0tc3NsIgorICAgICRzc2wgPSB0cnVlCiAgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tdHJhbnNwb3J0IikKICAgICAkdHJhbnNwb3J0ID0gYS5zcGxpdCgiPSIpWzFdCiAgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tcG9ydCIpCi0gICAgJHBvcnQgPSBhLnNwbGl0KCI9IilbMV0udG9faSAKKyAgICAkcG9ydCA9IGEuc3BsaXQoIj0iKVsxXS50b19pCiAgIGVuZAogZW5kCi1BUkdWPVtdCiAKIGNsYXNzIFNpbXBsZUNsaWVudFRlc3QgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQotICBkZWYgc2V0dXAgCisgIGRlZiBzZXR1cAogICAgIHVubGVzcyBAc29ja2V0Ci0gICAgICBAc29ja2V0ICAgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJGhvc3QsICRwb3J0KQorICAgICAgaWYgJGRvbWFpbl9zb2NrZXQudG9fcy5zdHJpcC5lbXB0eT8KKyAgICAgICAgaWYgJHNzbAorICAgICAgICAgICMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBydWJ5IGNyb3NzdGVzdCBpcyB0ZXN0L3JiL2dlbi1yYgorICAgICAgICAgIGtleXNEaXIgPSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKEZpbGUuZGlybmFtZShEaXIucHdkKSksICJrZXlzIikKKyAgICAgICAgICBjdHggPSBPcGVuU1NMOjpTU0w6OlNTTENvbnRleHQubmV3CisgICAgICAgICAgY3R4LmNhX2ZpbGUgPSBGaWxlLmpvaW4oa2V5c0RpciwgIkNBLnBlbSIpCisgICAgICAgICAgY3R4LmNlcnQgPSBPcGVuU1NMOjpYNTA5OjpDZXJ0aWZpY2F0ZS5uZXcoRmlsZS5vcGVuKEZpbGUuam9pbihrZXlzRGlyLCAiY2xpZW50LmNydCIpKSkKKyAgICAgICAgICBjdHguY2VydF9zdG9yZSA9IE9wZW5TU0w6Olg1MDk6OlN0b3JlLm5ldworICAgICAgICAgIGN0eC5jZXJ0X3N0b3JlLmFkZF9maWxlKEZpbGUuam9pbihrZXlzRGlyLCAnc2VydmVyLnBlbScpKQorICAgICAgICAgIGN0eC5rZXkgPSBPcGVuU1NMOjpQS2V5OjpSU0EubmV3KEZpbGUub3BlbihGaWxlLmpvaW4oa2V5c0RpciwgImNsaWVudC5rZXkiKSkpCisgICAgICAgICAgY3R4Lm9wdGlvbnMgPSBPcGVuU1NMOjpTU0w6Ok9QX05PX1NTTHYyIHwgT3BlblNTTDo6U1NMOjpPUF9OT19TU0x2MworICAgICAgICAgIGN0eC5zc2xfdmVyc2lvbiA9IDpTU0x2MjMKKyAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBPcGVuU1NMOjpTU0w6OlZFUklGWV9QRUVSCisgICAgICAgICAgQHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0Lm5ldygkaG9zdCwgJHBvcnQsIG5pbCwgY3R4KQorICAgICAgICBlbHNlCisgICAgICAgICAgQHNvY2tldCA9IFRocmlmdDo6U29ja2V0Lm5ldygkaG9zdCwgJHBvcnQpCisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpVTklYU29ja2V0Lm5ldygkZG9tYWluX3NvY2tldCkKKyAgICAgIGVuZAorICAgICAgCiAgICAgICBpZiAkdHJhbnNwb3J0ID09ICJidWZmZXJlZCIKICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KEBzb2NrZXQpCiAgICAgICBlbHNpZiAkdHJhbnNwb3J0ID09ICJmcmFtZWQiCkBAIC03MywxMSArMTAyLDE1IEBACiAgICAgICBlbHNlCiAgICAgICAgIHJhaXNlICdVbmtub3duIHByb3RvY29sIHR5cGUnCiAgICAgICBlbmQKLSAgICAgIEBjbGllbnQgICA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6Q2xpZW50Lm5ldyhAcHJvdG9jb2wpCisgICAgICBAY2xpZW50ID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpDbGllbnQubmV3KEBwcm90b2NvbCkKICAgICAgIEBzb2NrZXQub3BlbgogICAgIGVuZAogICBlbmQKLSAgCisKKyAgZGVmIHRlYXJkb3duCisgICAgQHNvY2tldC5jbG9zZQorICBlbmQKKwogICBkZWYgdGVzdF92b2lkCiAgICAgcCAndGVzdF92b2lkJwogICAgIEBjbGllbnQudGVzdFZvaWQoKQpAQCAtODUsNyArMTE4LDQxIEBACiAKICAgZGVmIHRlc3Rfc3RyaW5nCiAgICAgcCAndGVzdF9zdHJpbmcnCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFN0cmluZygnc3RyaW5nJyksICdzdHJpbmcnKQorICAgIHRlc3Rfc3RyaW5nID0KKyAgICAgICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCisgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnICsKKyAgICAgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXCIgfX19eyBbW1sgJworICAgIHRlc3Rfc3RyaW5nID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCAiICsKKyAgICAgICJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIiArCisgICAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKyAgICAgICLgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sICIgKworICAgICAgIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIiArCisgICAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKyAgICAgICJFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsICIgKworICAgICAgIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIiArCisgICAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisgICAgICAiS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgIiArCisgICAgICAiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiICsKKyAgICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworICAgICAgIlJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgIiArCisgICAgICAiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIiArCisgICAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworICAgICAgIk1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqiIgKworICAgICAgIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIiArCisgICAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworICAgICAgIk5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCAiICsKKyAgICAgICLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIgKworICAgICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisgICAgICAiU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCAiICsKKyAgICAgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiICsKKyAgICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKyAgICAgICJCw6JuLWzDom0tZ8O6LCDnsrXoqp4iCisKKyAgICByZXN1bHRfc3RyaW5nID0gQGNsaWVudC50ZXN0U3RyaW5nKHRlc3Rfc3RyaW5nKQorICAgIGFzc2VydF9lcXVhbCh0ZXN0X3N0cmluZywgcmVzdWx0X3N0cmluZy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6VVRGXzgpKQogICBlbmQKIAogICBkZWYgdGVzdF9ib29sCkBAIC0xMTcsNyArMTg0LDcgQEAKIAogICBkZWYgdGVzdF9kb3VibGUKICAgICBwICd0ZXN0X2RvdWJsZScKLSAgICB2YWwgPSAzLjE0CisgICAgdmFsID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgogICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUodmFsKSwgdmFsKQogICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUoLXZhbCksIC12YWwpCiAgICAgYXNzZXJ0X2tpbmRfb2YoRmxvYXQsIEBjbGllbnQudGVzdERvdWJsZSh2YWwpKQpAQCAtMTI1LDExICsxOTIsMTEgQEAKIAogICBkZWYgdGVzdF9iaW5hcnkKICAgICBwICd0ZXN0X2JpbmFyeScKLSAgICB2YWwgPSBbNDIsIDAsIDE0MiwgMjQyXQorICAgIHZhbCA9ICgwLi4uMjU2KS5yZXZlcnNlX2VhY2gudG9fYQogICAgIHJldCA9IEBjbGllbnQudGVzdEJpbmFyeSh2YWwucGFjaygnQyonKSkKICAgICBhc3NlcnRfZXF1YWwodmFsLCByZXQuYnl0ZXMudG9fYSkKICAgZW5kCi0gIAorCiAgIGRlZiB0ZXN0X21hcAogICAgIHAgJ3Rlc3RfbWFwJwogICAgIHZhbCA9IHsxID0+IDEsIDIgPT4gMiwgMyA9PiAzfQpAQCAtMzA1LDkgKzM3Miw5IEBACiAgIGRlZiB0ZXN0X29uZXdheQogICAgIHAgJ3Rlc3Rfb25ld2F5JwogICAgIHRpbWUxID0gVGltZS5ub3cudG9fZgotICAgIEBjbGllbnQudGVzdE9uZXdheSgzKQorICAgIEBjbGllbnQudGVzdE9uZXdheSgxKQogICAgIHRpbWUyID0gVGltZS5ub3cudG9fZgotICAgIGFzc2VydF9lcXVhbCgodGltZTItdGltZTEpKjEwMDAwMDA8NDAwLCB0cnVlKQorICAgIGFzc2VydF9vcGVyYXRvciAodGltZTItdGltZTEpLCA6PCwgMC4xCiAgIGVuZAogCiBlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYgppbmRleCAwMDIxZTJhLi43Y2FmNmE4IDEwMDc1NQotLS0gYS90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIKKysrIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiCkBAIC0zMiw2ICszMiw4IEBACiAgICA6dGVzdEVudW0sIDp0ZXN0VHlwZWRlZiwgOnRlc3RNdWx0aUV4Y2VwdGlvbl0uZWFjaCBkbyB8bWV0aHwKIAogICAgIGRlZmluZV9tZXRob2QobWV0aCkgZG8gfHRoaW5nfAorICAgICAgcCBtZXRoCisgICAgICBwIHRoaW5nCiAgICAgICB0aGluZwogICAgIGVuZAogCkBAIC0xMDQsMjEgKzEwNiwzMCBAQAogCiBlbmQKIAotcHJvdG9jb2wgPSAiYmluYXJ5IgorZG9tYWluX3NvY2tldCA9IG5pbAogcG9ydCA9IDkwOTAKK3Byb3RvY29sID0gImJpbmFyeSIKK0Bwcm90b2NvbEZhY3RvcnkgPSBuaWwKK3NzbCA9IGZhbHNlCiB0cmFuc3BvcnQgPSAiYnVmZmVyZWQiCi1AdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldwotQHByb3RvY29sRmFjdG9yeSA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldworQHRyYW5zcG9ydEZhY3RvcnkgPSBuaWwKKwogQVJHVi5lYWNoIGRvfGF8CiAgIGlmIGEgPT0gIi0taGVscCIKICAgICBwdXRzICJBbGxvd2VkIG9wdGlvbnM6IgogICAgIHB1dHMgIlx0IC1oIFsgLS1oZWxwIF0gXHQgcHJvZHVjZSBoZWxwIG1lc3NhZ2UiCi0gICAgcHV0cyAiXHQtLXBvcnQgYXJnICg9OTA5MCkgXHQgUG9ydCBudW1iZXIgdG8gbGlzdGVuIgotICAgIHB1dHMgIlx0LS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpIFx0IHByb3RvY29sOiBiaW5hcnksIGFjY2VsIgorICAgIHB1dHMgIlx0LS1kb21haW4tc29ja2V0IGFyZyAoPSkgXHQgVW5peCBkb21haW4gc29ja2V0IHBhdGgiCisgICAgcHV0cyAiXHQtLXBvcnQgYXJnICg9OTA5MCkgXHQgUG9ydCBudW1iZXIgdG8gbGlzdGVuIFx0IG5vdCB2YWxpZCB3aXRoIGRvbWFpbi1zb2NrZXQiCisgICAgcHV0cyAiXHQtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgXHQgcHJvdG9jb2w6IGFjY2VsLCBiaW5hcnksIGNvbXBhY3QsIGpzb24iCisgICAgcHV0cyAiXHQtLXNzbCBcdCB1c2Ugc3NsIFx0IG5vdCB2YWxpZCB3aXRoIGRvbWFpbi1zb2NrZXQiCiAgICAgcHV0cyAiXHQtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgdHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIgogICAgIGV4aXQKKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1kb21haW4tc29ja2V0IikKKyAgICBkb21haW5fc29ja2V0ID0gYS5zcGxpdCgiPSIpWzFdCiAgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tcHJvdG9jb2wiKQogICAgIHByb3RvY29sID0gYS5zcGxpdCgiPSIpWzFdCisgIGVsc2lmIGEgPT0gIi0tc3NsIgorICAgIHNzbCA9IHRydWUKICAgZWxzaWYgYS5zdGFydF93aXRoPygiLS10cmFuc3BvcnQiKQogICAgIHRyYW5zcG9ydCA9IGEuc3BsaXQoIj0iKVsxXQogICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXBvcnQiKQpAQCAtMTI2LDkgKzEzNyw3IEBACiAgIGVuZAogZW5kCiAKLWlmIHByb3RvY29sID09ICJiaW5hcnkiCi0gIEBwcm90b2NvbEZhY3RvcnkgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcKLWVsc2lmIHByb3RvY29sID09ICIiCitpZiBwcm90b2NvbCA9PSAiYmluYXJ5IiB8fCBwcm90b2NvbC50b19zLnN0cmlwLmVtcHR5PwogICBAcHJvdG9jb2xGYWN0b3J5ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3CiBlbHNpZiBwcm90b2NvbCA9PSAiY29tcGFjdCIKICAgQHByb3RvY29sRmFjdG9yeSA9IFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcKQEAgLTE0MCw5ICsxNDksNyBAQAogICByYWlzZSAnVW5rbm93biBwcm90b2NvbCB0eXBlJwogZW5kCiAKLWlmIHRyYW5zcG9ydCA9PSAiYnVmZmVyZWQiCi0gIEB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3Ci1lbHNpZiB0cmFuc3BvcnQgPT0gIiIKK2lmIHRyYW5zcG9ydCA9PSAiYnVmZmVyZWQiIHx8IHRyYW5zcG9ydC50b19zLnN0cmlwLmVtcHR5PwogICBAdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldwogZWxzaWYgdHJhbnNwb3J0ID09ICJmcmFtZWQiCiAgIEB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldwpAQCAtMTUwLDggKzE1NywzMiBAQAogICByYWlzZSAnVW5rbm93biB0cmFuc3BvcnQgdHlwZScKIGVuZAogCi1AaGFuZGxlciAgID0gU2ltcGxlSGFuZGxlci5uZXcKK0BoYW5kbGVyID0gU2ltcGxlSGFuZGxlci5uZXcKIEBwcm9jZXNzb3IgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OlByb2Nlc3Nvci5uZXcoQGhhbmRsZXIpCi1AdHJhbnNwb3J0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KHBvcnQpCi1Ac2VydmVyICAgID0gVGhyaWZ0OjpUaHJlYWRlZFNlcnZlci5uZXcoQHByb2Nlc3NvciwgQHRyYW5zcG9ydCwgQHRyYW5zcG9ydEZhY3RvcnksIEBwcm90b2NvbEZhY3RvcnkpCitAdHJhbnNwb3J0ID0gbmlsCitpZiBkb21haW5fc29ja2V0LnRvX3Muc3RyaXAuZW1wdHk/CisgIGlmIHNzbAorICAgICMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBydWJ5IGNyb3NzdGVzdCBpcyB0ZXN0L3JiL2dlbi1yYgorICAgIGtleXNEaXIgPSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKEZpbGUuZGlybmFtZShEaXIucHdkKSksICJrZXlzIikKKyAgICBjdHggPSBPcGVuU1NMOjpTU0w6OlNTTENvbnRleHQubmV3CisgICAgY3R4LmNhX2ZpbGUgPSBGaWxlLmpvaW4oa2V5c0RpciwgIkNBLnBlbSIpCisgICAgY3R4LmNlcnQgPSBPcGVuU1NMOjpYNTA5OjpDZXJ0aWZpY2F0ZS5uZXcoRmlsZS5vcGVuKEZpbGUuam9pbihrZXlzRGlyLCAic2VydmVyLmNydCIpKSkKKyAgICBjdHguY2VydF9zdG9yZSA9IE9wZW5TU0w6Olg1MDk6OlN0b3JlLm5ldworICAgIGN0eC5jZXJ0X3N0b3JlLmFkZF9maWxlKEZpbGUuam9pbihrZXlzRGlyLCAnY2xpZW50LnBlbScpKQorICAgIGN0eC5rZXkgPSBPcGVuU1NMOjpQS2V5OjpSU0EubmV3KEZpbGUub3BlbihGaWxlLmpvaW4oa2V5c0RpciwgInNlcnZlci5rZXkiKSkpCisgICAgY3R4Lm9wdGlvbnMgPSBPcGVuU1NMOjpTU0w6Ok9QX05PX1NTTHYyIHwgT3BlblNTTDo6U1NMOjpPUF9OT19TU0x2MworICAgIGN0eC5zc2xfdmVyc2lvbiA9IDpTU0x2MjMKKyAgICBjdHgudmVyaWZ5X21vZGUgPSBPcGVuU1NMOjpTU0w6OlZFUklGWV9QRUVSCisgICAgQHRyYW5zcG9ydCA9IFRocmlmdDo6U1NMU2VydmVyU29ja2V0Lm5ldyhuaWwsIHBvcnQsIGN0eCkKKyAgZWxzZQorICAgIEB0cmFuc3BvcnQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC5uZXcocG9ydCkKKyAgZW5kCitlbHNlCisgIEB0cmFuc3BvcnQgPSBUaHJpZnQ6OlVOSVhTZXJ2ZXJTb2NrZXQubmV3KGRvbWFpbl9zb2NrZXQpCitlbmQKKworQHNlcnZlciA9IFRocmlmdDo6VGhyZWFkZWRTZXJ2ZXIubmV3KEBwcm9jZXNzb3IsIEB0cmFuc3BvcnQsIEB0cmFuc3BvcnRGYWN0b3J5LCBAcHJvdG9jb2xGYWN0b3J5KQorCitwdXRzICJTdGFydGluZyBUZXN0U2VydmVyICN7QHNlcnZlci50b19zfSIKIEBzZXJ2ZXIuc2VydmUKK3B1dHMgImRvbmUuIgpkaWZmIC0tZ2l0IGEvdGVzdC9yZXN1bHQuaHRtbCBiL3Rlc3QvcmVzdWx0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOTE4YmUuLjAwMDAwMDAKLS0tIGEvdGVzdC9yZXN1bHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS0tPgotPCFET0NUWVBFIEhUTUw+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgY2hhcnNldD0idXRmLTgiPgotPHRpdGxlPkFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlPC90aXRsZT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Imh0dHA6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvMS4xMC40L2Nzcy9qcXVlcnkuZGF0YVRhYmxlcy5jc3MiPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTIuMS4zLm1pbi5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0iaHR0cDovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEwLjQvanMvanF1ZXJ5LmRhdGFUYWJsZXMuanMiPjwvc2NyaXB0PgotPHNjcmlwdD4KLSQuZ2V0SlNPTigncmVzdWx0cy5qc29uJywgZnVuY3Rpb24ocmVzdWx0cykgewotICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgdHJhbnNwb3J0ID0gMzsKLSAgICAgICAgdmFyIHNvY2tldCA9IDQ7Ci0gICAgICAgIHZhciBzdWNjZXNzID0gNTsKLSAgICAgICAgdmFyIGV4cGVjdGVkID0gNjsKLSAgICAgICAgdmFyIHJldHVybkNvZGUgPSA3OwotICAgICAgICB2YXIgbG9nRmlsZSA9IDg7Ci0gICAgICAgIHRlc3RUYWJsZSA9ICQoJyN0ZXN0X3Jlc3VsdHMnKS5EYXRhVGFibGUoewotICAgICAgICAgICAgZGF0YTogcmVzdWx0c1sncmVzdWx0cyddLAotICAgICAgICAgICAgY29sdW1uRGVmczogWwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0czogMywKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb3dbdHJhbnNwb3J0XSArICctJyArIHJvd1tzb2NrZXRdOwotICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOiA0LAotICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJvdykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyb3dbc3VjY2Vzc10gPyAnc3VjY2VzcycgOiAnZmFpbHVyZScpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJygnICsgKHJvd1tyZXR1cm5Db2RlXSA9PSAxMjggPyAndGltZW91dCcgOiByb3dbcmV0dXJuQ29kZV0pICsgJyknCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyg8YSBocmVmPSInICsgcm93W2xvZ0ZpbGVdLnNlcnZlciArICciPlNlcnZlcjwvYT4sICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnPGEgaHJlZj0iJyArIHJvd1tsb2dGaWxlXS5jbGllbnQgKyAnIj5DbGllbnQ8L2E+KSc7Ci0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldHM6IDUsCi0gICAgICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24oZGF0YSwgdHlwZSwgcm93KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAneWVzJyByYXRoZXIgdGhhbiAnZXhwZWN0ZWQnIHRvIGVhc2Ugc2VhcmNoCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93W2V4cGVjdGVkXSA/ICd5ZXMnIDogJ3VuZXhwZWN0ZWQnOwotICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0pOwotICAgICAgICAkKCcjdGVzdF9yZXN1bHRzX2ZpbHRlciBsYWJlbCBpbnB1dCcpLmZvY3VzKCkudmFsKCd1bmV4cGVjdGVkIGZhaWx1cmUnKTsKLSAgICAgICAgJCgnI3Rlc3RfaW5mbycpLnRleHQoCi0gICAgICAgICAgICAiVGVzdCBEYXRlOiAgICAgIiArIHJlc3VsdHNbJ2RhdGUnXSArICJcbiIgKwotICAgICAgICAgICAgIlJldmlzaW9uOiAgICAgICIgKyByZXN1bHRzWydyZXZpc2lvbiddICsgIlxuIiArCi0gICAgICAgICAgICAiUGxhdGZvcm06ICAgICAgIiArIHJlc3VsdHNbJ3BsYXRmb3JtJ10gKyAiXG4iICsKLSAgICAgICAgICAgICJUZXN0IGR1cmF0aW9uOiAiICsgcmVzdWx0c1snZHVyYXRpb24nXSkgKyAiIHNlY29uZHMiOwotICAgIH0pOwotfSk7Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5PgotPGgyPkFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlOiBSZXN1bHRzPC9oMj4KLTx0YWJsZSBpZD0idGVzdF9yZXN1bHRzIiBjbGFzcz0iZGlzcGxheSI+Ci0gICAgPHRoZWFkPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+U2VydmVyPC90aD4KLSAgICAgICAgICAgIDx0aD5DbGllbnQ8L3RoPgotICAgICAgICAgICAgPHRoPlByb3RvY29sPC90aD4KLSAgICAgICAgICAgIDx0aD5UcmFuc3BvcnQ8L3RoPgotICAgICAgICAgICAgPHRoPlJlc3VsdCAobG9nKTwvdGg+Ci0gICAgICAgICAgICA8dGg+RXhwZWN0ZWQ8L3RoPgotICAgICAgICA8L3RyPgotICAgIDwvdGhlYWQ+Ci08L3RhYmxlPgotPGgyPlRlc3QgSW5mb3JtYXRpb248L2gyPgotPHByZSBpZD0idGVzdF9pbmZvIj48L3ByZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3QvcmVzdWx0LmpzIGIvdGVzdC9yZXN1bHQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiMWE1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmVzdWx0LmpzCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorCisqLworCiskLmdldEpTT04oJ3Jlc3VsdHMuanNvbicsIGZ1bmN0aW9uKHJlc3VsdHMpIHsKKyAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHRyYW5zcG9ydCA9IDM7CisgICAgICAgIHZhciBzb2NrZXQgPSA0OworICAgICAgICB2YXIgc3VjY2VzcyA9IDU7CisgICAgICAgIHZhciBleHBlY3RlZCA9IDY7CisgICAgICAgIHZhciByZXR1cm5Db2RlID0gNzsKKyAgICAgICAgdmFyIGxvZ0ZpbGUgPSA4OworICAgICAgICB0ZXN0VGFibGUgPSAkKCcjdGVzdF9yZXN1bHRzJykuRGF0YVRhYmxlKHsKKyAgICAgICAgICAgIGRhdGE6IHJlc3VsdHNbJ3Jlc3VsdHMnXSwKKyAgICAgICAgICAgIGNvbHVtbkRlZnM6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldHM6IDMsCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24oZGF0YSwgdHlwZSwgcm93KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93W3RyYW5zcG9ydF0gKyAnLScgKyByb3dbc29ja2V0XTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0czogNCwKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByb3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocm93W3N1Y2Nlc3NdID8gJ3N1Y2Nlc3MnIDogJ2ZhaWx1cmUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcoJyArIChyb3dbcmV0dXJuQ29kZV0gPT0gMTI4ID8gJ3RpbWVvdXQnIDogcm93W3JldHVybkNvZGVdKSArICcpJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcoPGEgaHJlZj0iJyArIHJvd1tsb2dGaWxlXS5zZXJ2ZXIgKyAnIj5TZXJ2ZXI8L2E+LCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJzxhIGhyZWY9IicgKyByb3dbbG9nRmlsZV0uY2xpZW50ICsgJyI+Q2xpZW50PC9hPiknOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOiA1LAorICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJvdykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ3llcycgcmF0aGVyIHRoYW4gJ2V4cGVjdGVkJyB0byBlYXNlIHNlYXJjaAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvd1tleHBlY3RlZF0gPyAneWVzJyA6ICd1bmV4cGVjdGVkJzsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdLAorICAgICAgICB9KTsKKyAgICAgICAgJCgnI3Rlc3RfcmVzdWx0c19maWx0ZXIgbGFiZWwgaW5wdXQnKS5mb2N1cygpLnZhbCgndW5leHBlY3RlZCBmYWlsdXJlJyk7CisgICAgICAgICQoJyN0ZXN0X2luZm8nKS50ZXh0KAorICAgICAgICAgICAgIlRlc3QgRGF0ZTogICAgICIgKyByZXN1bHRzWydkYXRlJ10gKyAiXG4iICsKKyAgICAgICAgICAgICJSZXZpc2lvbjogICAgICAiICsgcmVzdWx0c1sncmV2aXNpb24nXSArICJcbiIgKworICAgICAgICAgICAgIlBsYXRmb3JtOiAgICAgICIgKyByZXN1bHRzWydwbGF0Zm9ybSddICsgIlxuIiArCisgICAgICAgICAgICAiVGVzdCBkdXJhdGlvbjogIiArIHJlc3VsdHNbJ2R1cmF0aW9uJ10pICsgIiBzZWNvbmRzIjsKKyAgICB9KTsKK30pOworCmRpZmYgLS1naXQgYS90ZXN0L3JzL0NhcmdvLnRvbWwgYi90ZXN0L3JzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIzNWUzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE3IEBACitbcGFja2FnZV0KK25hbWUgPSAidGhyaWZ0LXRlc3QiCit2ZXJzaW9uID0gIjAuMS4wIgorbGljZW5zZSA9ICJBcGFjaGUtMi4wIgorYXV0aG9ycyA9IFsiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Il0KK3B1Ymxpc2ggPSBmYWxzZQorCitbZGVwZW5kZW5jaWVzXQorY2xhcCA9ICI8Mi4yOC4wIgorZW52X2xvZ2dlciA9ICIwLjQuMCIKK2xvZyA9ICIwLjMuNyIKK29yZGVyZWQtZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKKworW2RlcGVuZGVuY2llcy50aHJpZnRdCitwYXRoID0gIi4uLy4uL2xpYi9ycyIKKwpkaWZmIC0tZ2l0IGEvdGVzdC9ycy9NYWtlZmlsZS5hbSBiL3Rlc3QvcnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwNjFlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworcHJlY3Jvc3M6IHN0dWJzCisJJChDQVJHTykgYnVpbGQKKwlbIC1kIGJpbiBdIHx8IG1rZGlyIGJpbgorCWNwIHRhcmdldC9kZWJ1Zy90ZXN0X3NlcnZlciBiaW4vdGVzdF9zZXJ2ZXIKKwljcCB0YXJnZXQvZGVidWcvdGVzdF9jbGllbnQgYmluL3Rlc3RfY2xpZW50CisKK2NsZWFuLWxvY2FsOgorCSQoQ0FSR08pIGNsZWFuCisJLSQoUk0pIENhcmdvLmxvY2sKKwktJChSTSkgc3JjL3RocmlmdF90ZXN0LnJzCisJLSQoUk0pIC1yIGJpbgorCitFWFRSQV9ESVNUID0gXAorCUNhcmdvLnRvbWwgXAorCXNyYy9saWIucnMgXAorCXNyYy9iaW4vdGVzdF9zZXJ2ZXIucnMgXAorCXNyYy9iaW4vdGVzdF9jbGllbnQucnMKKwpkaWZmIC0tZ2l0IGEvdGVzdC9ycy9zcmMvYmluL3Rlc3RfY2xpZW50LnJzIGIvdGVzdC9ycy9zcmMvYmluL3Rlc3RfY2xpZW50LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMTZjYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JzL3NyYy9iaW4vdGVzdF9jbGllbnQucnMKQEAgLTAsMCArMSw2MDUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgbG9nOworZXh0ZXJuIGNyYXRlIGVudl9sb2dnZXI7CisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGNsYXA7CitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0X3Rlc3Q7IC8vIGh1aC4gSSBoYXZlIHRvIGRvIHRoaXMgdG8gdXNlIG15IGxpYgorCit1c2Ugb3JkZXJlZF9mbG9hdDo6T3JkZXJlZEZsb2F0OwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZU1hcCwgQlRyZWVTZXR9OwordXNlIHN0ZDo6Zm10OjpEZWJ1ZzsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeU91dHB1dFByb3RvY29sLCBUQ29tcGFjdElucHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sLCBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgVE91dHB1dFByb3RvY29sfTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1JlYWRIYWxmLCBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0LCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkV3JpdGVUcmFuc3BvcnQsIFRJb0NoYW5uZWwsIFRSZWFkVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgVFRjcENoYW5uZWwsIFRXcml0ZVRyYW5zcG9ydCwgV3JpdGVIYWxmfTsKK3VzZSB0aHJpZnRfdGVzdDo6KjsKKworZm4gbWFpbigpIHsKKyAgICBlbnZfbG9nZ2VyOjppbml0KCkuZXhwZWN0KCJsb2dnZXIgc2V0dXAgZmFpbGVkIik7CisKKyAgICBkZWJ1ZyEoImluaXRpYWxpemVkIGxvZ2dlciAtIHJ1bm5pbmcgY3Jvc3MtdGVzdCBjbGllbnQiKTsKKworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IGluZm8hKCJjcm9zcy10ZXN0IGNsaWVudCBzdWNjZWVkZWQiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIGluZm8hKCJjcm9zcy10ZXN0IGNsaWVudCBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgLy8gdW5zdXBwb3J0ZWQgb3B0aW9uczoKKyAgICAvLyAtLWRvbWFpbi1zb2NrZXQKKyAgICAvLyAtLW5hbWVkLXBpcGUKKyAgICAvLyAtLWFub24tcGlwZXMKKyAgICAvLyAtLXNzbAorICAgIC8vIC0tdGhyZWFkcworICAgIGxldCBtYXRjaGVzID0gY2xhcF9hcHAhKHJ1c3RfdGVzdF9jbGllbnQgPT4KKyAgICAgICAgKHZlcnNpb246ICIxLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiUnVzdCBUaHJpZnQgdGVzdCBjbGllbnQiKQorICAgICAgICAoQGFyZyBob3N0OiAtLWhvc3QgK3Rha2VzX3ZhbHVlICJIb3N0IG9uIHdoaWNoIHRoZSBUaHJpZnQgdGVzdCBzZXJ2ZXIgaXMgbG9jYXRlZCIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgIlBvcnQgb24gd2hpY2ggdGhlIFRocmlmdCB0ZXN0IHNlcnZlciBpcyBsaXN0ZW5pbmciKQorICAgICAgICAoQGFyZyB0cmFuc3BvcnQ6IC0tdHJhbnNwb3J0ICt0YWtlc192YWx1ZSAiVGhyaWZ0IHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYnVmZmVyZWRcIiwgXCJmcmFtZWRcIikiKQorICAgICAgICAoQGFyZyBwcm90b2NvbDogLS1wcm90b2NvbCArdGFrZXNfdmFsdWUgIlRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYmluYXJ5XCIsIFwiY29tcGFjdFwiLCBcIm11bHRpXCIsIFwibXVsdGljXCIpIikKKyAgICAgICAgKEBhcmcgdGVzdGxvb3BzOiAtbiAtLXRlc3Rsb29wcyArdGFrZXNfdmFsdWUgIk51bWJlciBvZiB0aW1lcyB0byBydW4gdGVzdHMiKQorICAgICkKKyAgICAgICAgLmdldF9tYXRjaGVzKCk7CisKKyAgICBsZXQgaG9zdCA9IG1hdGNoZXMudmFsdWVfb2YoImhvc3QiKS51bndyYXBfb3IoIjEyNy4wLjAuMSIpOworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKyAgICBsZXQgdGVzdGxvb3BzID0gdmFsdWVfdCEobWF0Y2hlcywgInRlc3Rsb29wcyIsIHU4KS51bndyYXBfb3IoMSk7CisgICAgbGV0IHRyYW5zcG9ydCA9IG1hdGNoZXMudmFsdWVfb2YoInRyYW5zcG9ydCIpLnVud3JhcF9vcigiYnVmZmVyZWQiKTsKKyAgICBsZXQgcHJvdG9jb2wgPSBtYXRjaGVzLnZhbHVlX29mKCJwcm90b2NvbCIpLnVud3JhcF9vcigiYmluYXJ5Iik7CisKKworICAgIGxldCBtdXQgdGhyaWZ0X3Rlc3RfY2xpZW50ID0geworICAgICAgICBsZXQgKGlfcHJvdCwgb19wcm90KSA9IGJ1aWxkX3Byb3RvY29scyhob3N0LCBwb3J0LCB0cmFuc3BvcnQsIHByb3RvY29sLCAiVGhyaWZ0VGVzdCIpPzsKKyAgICAgICAgVGhyaWZ0VGVzdFN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCkKKyAgICB9OworCisgICAgbGV0IG11dCBzZWNvbmRfc2VydmljZV9jbGllbnQgPSBpZiBwcm90b2NvbC5zdGFydHNfd2l0aCgibXVsdGkiKSB7CisgICAgICAgIGxldCAoaV9wcm90LCBvX3Byb3QpID0gYnVpbGRfcHJvdG9jb2xzKGhvc3QsIHBvcnQsIHRyYW5zcG9ydCwgcHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIik/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+IHsKKyAgICAgICAgaW5mbyEoIihzZWNvbmQpdGVzdFN0cmluZyh7fSkiLCAmdGhpbmcpOworICAgICAgICBsZXQgcmV0ID0gZm9ybWF0ISgidGVzdFN0cmluZyhcInt9XCIpIiwgJnRoaW5nKTsKKyAgICAgICAgT2socmV0KQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvcnMvc3JjL2xpYi5ycyBiL3Rlc3QvcnMvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzliZjkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9zcmMvbGliLnJzCkBAIC0wLDAgKzEsMjMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworCittb2QgdGhyaWZ0X3Rlc3Q7CitwdWIgdXNlIHRocmlmdF90ZXN0OjoqOwpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LnB5IGIvdGVzdC90ZXN0LnB5CmluZGV4IDExNzYzNjkuLmY1OTI1NmEgMTAwNzU1Ci0tLSBhL3Rlc3QvdGVzdC5weQorKysgYi90ZXN0L3Rlc3QucHkKQEAgLTEsNCArMSw0IEBACi0jIS91c3IvYmluL2VudiBweXRob24KKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMTgsMTA2ICsxOCwxNzUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgQXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGUKKyMKKyMgQXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIChjcm9zcykgdGVzdCBzdWl0ZQogIwogIyB0ZXN0cyBkaWZmZXJlbnQgc2VydmVyLWNsaWVudCwgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydCBjb21iaW5hdGlvbnMKICMKLSMgVGhpcyBzY3JpcHQgc3VwcG9ydHMgcHl0aG9uIDIuNyBhbmQgbGF0ZXIuCi0jIHB5dGhvbiAzLnggaXMgcmVjb21tZW5kZWQgZm9yIGJldHRlciBzdGFiaWxpdHkuCi0jCi0jIFRPRE86IGVsaW1pbmF0ZSBhIGZldyAyLjcgb2NjdXJyZW5jZXMgdG8gc3VwcG9ydCAyLjYgPworIyBUaGlzIHNjcmlwdCByZXF1aXJlcyBweXRob24gMy54IGR1ZSB0byB0aGUgaW1wcm92ZW1lbnRzIGluCisjIHN1YnByb2Nlc3MgbWFuYWdlbWVudCB0aGF0IGFyZSBuZWVkZWQgZm9yIHJlbGlhYmlsaXR5LgogIwogCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4KIGltcG9ydCBqc29uCiBpbXBvcnQgbG9nZ2luZwogaW1wb3J0IG11bHRpcHJvY2Vzc2luZwotaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgYXJncGFyc2UKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogCiBpbXBvcnQgY3Jvc3NydW5uZXIKK2Zyb20gY3Jvc3NydW5uZXIuY29tcGF0IGltcG9ydCBwYXRoX2pvaW4KIAotVEVTVF9ESVIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCi1DT05GSUdfUEFUSCA9IG9zLnBhdGguam9pbihURVNUX0RJUiwgJ3Rlc3RzLmpzb24nKQorIyAzLjMgaW50cm9kdWNlZCBzdWJwcm9jZXNzIHRpbWVvdXRzIG9uIHdhaXRpbmcgZm9yIGNoaWxkCityZXFfdmVyc2lvbiA9ICgzLCAzKQorY3VyX3ZlcnNpb24gPSBzeXMudmVyc2lvbl9pbmZvCithc3NlcnQgKGN1cl92ZXJzaW9uID49IHJlcV92ZXJzaW9uKSwgIlB5dGhvbiAzLjMgb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciBvcGVyYXRpb24uIgogCiAKLWRlZiBwcmVwYXJlKHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoKToKLSAgd2l0aCBvcGVuKENPTkZJR19QQVRILCAncicpIGFzIGZwOgotICAgIGogPSBqc29uLmxvYWQoZnApCi0gIHJldHVybiBjcm9zc3J1bm5lci5wcmVwYXJlKGosIFRFU1RfRElSLCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCkKK1JPT1RfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkpCitURVNUX0RJUl9SRUxBVElWRSA9ICd0ZXN0JworVEVTVF9ESVIgPSBwYXRoX2pvaW4oUk9PVF9ESVIsIFRFU1RfRElSX1JFTEFUSVZFKQorRkVBVFVSRV9ESVJfUkVMQVRJVkUgPSBwYXRoX2pvaW4oVEVTVF9ESVJfUkVMQVRJVkUsICdmZWF0dXJlcycpCitDT05GSUdfRklMRSA9ICd0ZXN0cy5qc29uJwogCiAKLWRlZiBydW5fdGVzdHMoc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIGpvYnMsIHNraXBfa25vd25fZmFpbHVyZXMpOgotICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCi0gIGxvZ2dlci5kZWJ1ZygnQ29sbGVjdGluZyB0ZXN0cycpCi0gIHdpdGggb3BlbihDT05GSUdfUEFUSCwgJ3InKSBhcyBmcDoKLSAgICBqID0ganNvbi5sb2FkKGZwKQotICB0ZXN0cyA9IGxpc3QoY3Jvc3NydW5uZXIuY29sbGVjdF90ZXN0cyhqLCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCkpCi0gIGlmIHNraXBfa25vd25fZmFpbHVyZXM6Ci0gICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKFRFU1RfRElSKQotICAgIHRlc3RzID0gbGlzdChmaWx0ZXIobGFtYmRhIHQ6IGNyb3NzcnVubmVyLnRlc3RfbmFtZSgqKnQpIG5vdCBpbiBrbm93biwgdGVzdHMpKQorZGVmIHJ1bl9jcm9zc190ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCwgam9icywgc2tpcF9rbm93bl9mYWlsdXJlcywgb25seV9rbm93bl9mYWlsdXJlcywgcmV0cnlfY291bnQsIHJlZ2V4KToKKyAgICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgbG9nZ2VyLmRlYnVnKCdDb2xsZWN0aW5nIHRlc3RzJykKKyAgICB3aXRoIG9wZW4ocGF0aF9qb2luKFRFU1RfRElSLCBDT05GSUdfRklMRSksICdyJykgYXMgZnA6CisgICAgICAgIGogPSBqc29uLmxvYWQoZnApCisgICAgdGVzdHMgPSBjcm9zc3J1bm5lci5jb2xsZWN0X2Nyb3NzX3Rlc3RzKGosIHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoLCByZWdleCkKKyAgICBpZiBub3QgdGVzdHM6CisgICAgICAgIHByaW50KCdObyB0ZXN0IGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEnLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCcgIHNlcnZlcnM6ICVzJyAlIHNlcnZlcl9tYXRjaCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnICBjbGllbnRzOiAlcycgJSBjbGllbnRfbWF0Y2gsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgb25seV9rbm93bl9mYWlsdXJlczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdPbmx5IHJ1bm5pbmcga25vd24gZmFpbHVyZXMnKQorICAgICAgICBrbm93biA9IGNyb3NzcnVubmVyLmxvYWRfa25vd25fZmFpbHVyZXMoVEVTVF9ESVIpCisgICAgICAgIHRlc3RzID0gbGlzdChmaWx0ZXIobGFtYmRhIHQ6IGNyb3NzcnVubmVyLnRlc3RfbmFtZSgqKnQpIGluIGtub3duLCB0ZXN0cykpCisgICAgaWYgc2tpcF9rbm93bl9mYWlsdXJlczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBrbm93biBmYWlsdXJlcycpCisgICAgICAgIGtub3duID0gY3Jvc3NydW5uZXIubG9hZF9rbm93bl9mYWlsdXJlcyhURVNUX0RJUikKKyAgICAgICAgdGVzdHMgPSBsaXN0KGZpbHRlcihsYW1iZGEgdDogY3Jvc3NydW5uZXIudGVzdF9uYW1lKCoqdCkgbm90IGluIGtub3duLCB0ZXN0cykpCiAKLSAgZGlzcGF0Y2hlciA9IGNyb3NzcnVubmVyLlRlc3REaXNwYXRjaGVyKFRFU1RfRElSLCBqb2JzKQotICBsb2dnZXIuZGVidWcoJ0V4ZWN1dGluZyAlZCB0ZXN0cycgJSBsZW4odGVzdHMpKQotICB0cnk6Ci0gICAgZm9yIHIgaW4gW2Rpc3BhdGNoZXIuZGlzcGF0Y2godGVzdCkgZm9yIHRlc3QgaW4gdGVzdHNdOgotICAgICAgci53YWl0KCkKLSAgICBsb2dnZXIuZGVidWcoJ1dhaXRpbmcgZm9yIGNvbXBsZXRpb24nKQotICAgIHJldHVybiBkaXNwYXRjaGVyLndhaXQoKQotICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKLSAgICBsb2dnZXIuZGVidWcoJ0ludGVycnVwdGVkLCBzaHV0dGluZyBkb3duJykKLSAgICBkaXNwYXRjaGVyLnRlcm1pbmF0ZSgpCi0gICAgcmV0dXJuIEZhbHNlCisgICAgZGlzcGF0Y2hlciA9IGNyb3NzcnVubmVyLlRlc3REaXNwYXRjaGVyKFRFU1RfRElSLCBST09UX0RJUiwgVEVTVF9ESVJfUkVMQVRJVkUsIGpvYnMpCisgICAgbG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmcgJWQgdGVzdHMnICUgbGVuKHRlc3RzKSkKKyAgICB0cnk6CisgICAgICAgIGZvciByIGluIFtkaXNwYXRjaGVyLmRpc3BhdGNoKHRlc3QsIHJldHJ5X2NvdW50KSBmb3IgdGVzdCBpbiB0ZXN0c106CisgICAgICAgICAgICByLndhaXQoKQorICAgICAgICBsb2dnZXIuZGVidWcoJ1dhaXRpbmcgZm9yIGNvbXBsZXRpb24nKQorICAgICAgICByZXR1cm4gZGlzcGF0Y2hlci53YWl0KCkKKyAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbnRlcnJ1cHRlZCwgc2h1dHRpbmcgZG93bicpCisgICAgICAgIGRpc3BhdGNoZXIudGVybWluYXRlKCkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIHJ1bl9mZWF0dXJlX3Rlc3RzKHNlcnZlcl9tYXRjaCwgZmVhdHVyZV9tYXRjaCwgam9icywgc2tpcF9rbm93bl9mYWlsdXJlcywgb25seV9rbm93bl9mYWlsdXJlcywgcmV0cnlfY291bnQsIHJlZ2V4KToKKyAgICBiYXNlZGlyID0gcGF0aF9qb2luKFJPT1RfRElSLCBGRUFUVVJFX0RJUl9SRUxBVElWRSkKKyAgICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgbG9nZ2VyLmRlYnVnKCdDb2xsZWN0aW5nIHRlc3RzJykKKyAgICB3aXRoIG9wZW4ocGF0aF9qb2luKFRFU1RfRElSLCBDT05GSUdfRklMRSksICdyJykgYXMgZnA6CisgICAgICAgIGogPSBqc29uLmxvYWQoZnApCisgICAgd2l0aCBvcGVuKHBhdGhfam9pbihiYXNlZGlyLCBDT05GSUdfRklMRSksICdyJykgYXMgZnA6CisgICAgICAgIGoyID0ganNvbi5sb2FkKGZwKQorICAgIHRlc3RzID0gY3Jvc3NydW5uZXIuY29sbGVjdF9mZWF0dXJlX3Rlc3RzKGosIGoyLCBzZXJ2ZXJfbWF0Y2gsIGZlYXR1cmVfbWF0Y2gsIHJlZ2V4KQorICAgIGlmIG5vdCB0ZXN0czoKKyAgICAgICAgcHJpbnQoJ05vIHRlc3QgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYScsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJyAgc2VydmVyczogJXMnICUgc2VydmVyX21hdGNoLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCcgIGZlYXR1cmVzOiAlcycgJSBmZWF0dXJlX21hdGNoLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIG9ubHlfa25vd25fZmFpbHVyZXM6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnT25seSBydW5uaW5nIGtub3duIGZhaWx1cmVzJykKKyAgICAgICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKGJhc2VkaXIpCisgICAgICAgIHRlc3RzID0gbGlzdChmaWx0ZXIobGFtYmRhIHQ6IGNyb3NzcnVubmVyLnRlc3RfbmFtZSgqKnQpIGluIGtub3duLCB0ZXN0cykpCisgICAgaWYgc2tpcF9rbm93bl9mYWlsdXJlczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBrbm93biBmYWlsdXJlcycpCisgICAgICAgIGtub3duID0gY3Jvc3NydW5uZXIubG9hZF9rbm93bl9mYWlsdXJlcyhiYXNlZGlyKQorICAgICAgICB0ZXN0cyA9IGxpc3QoZmlsdGVyKGxhbWJkYSB0OiBjcm9zc3J1bm5lci50ZXN0X25hbWUoKip0KSBub3QgaW4ga25vd24sIHRlc3RzKSkKKworICAgIGRpc3BhdGNoZXIgPSBjcm9zc3J1bm5lci5UZXN0RGlzcGF0Y2hlcihURVNUX0RJUiwgUk9PVF9ESVIsIEZFQVRVUkVfRElSX1JFTEFUSVZFLCBqb2JzKQorICAgIGxvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nICVkIHRlc3RzJyAlIGxlbih0ZXN0cykpCisgICAgdHJ5OgorICAgICAgICBmb3IgciBpbiBbZGlzcGF0Y2hlci5kaXNwYXRjaCh0ZXN0LCByZXRyeV9jb3VudCkgZm9yIHRlc3QgaW4gdGVzdHNdOgorICAgICAgICAgICAgci53YWl0KCkKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdXYWl0aW5nIGZvciBjb21wbGV0aW9uJykKKyAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXIud2FpdCgpCisgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnSW50ZXJydXB0ZWQsIHNodXR0aW5nIGRvd24nKQorICAgICAgICBkaXNwYXRjaGVyLnRlcm1pbmF0ZSgpCisgICAgICAgIHJldHVybiBGYWxzZQogCiAKIGRlZiBkZWZhdWx0X2NvbmN1cnJlbnR5KCk6Ci0gIHRyeToKLSAgICByZXR1cm4gaW50KG9zLmVudmlyb24uZ2V0KCdUSFJJRlRfQ1JPU1NURVNUX0NPTkNVUlJFTkNZJykpCi0gIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKToKLSAgICAjIFNpbmNlIG11Y2ggdGltZSBpcyBzcGVudCBzbGVlcGluZywgdXNlIG1hbnkgdGhyZWFkcwotICAgIHJldHVybiBpbnQobXVsdGlwcm9jZXNzaW5nLmNwdV9jb3VudCgpICogMS4yNSkgKyAxCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gaW50KG9zLmVudmlyb24uZ2V0KCdUSFJJRlRfQ1JPU1NURVNUX0NPTkNVUlJFTkNZJykpCisgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAjIFNpbmNlIG11Y2ggdGltZSBpcyBzcGVudCBzbGVlcGluZywgdXNlIG1hbnkgdGhyZWFkcworICAgICAgICByZXR1cm4gaW50KG11bHRpcHJvY2Vzc2luZy5jcHVfY291bnQoKSAqIDEuMjUpICsgMQogCiAKIGRlZiBtYWluKGFyZ3YpOgotICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoKQotICBwYXJzZXIuYWRkX29wdGlvbignLS1zZXJ2ZXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdzZXJ2ZXJzJywgZGVmYXVsdD0nJywKLSAgICAgICAgICAgICAgICAgICAgaGVscD0nbGlzdCBvZiBzZXJ2ZXJzIHRvIHRlc3Qgc2VwYXJhdGVkIGJ5IGNvbW1hcywgZWc6LSAtLXNlcnZlcj1jcHAsamF2YScpCi0gIHBhcnNlci5hZGRfb3B0aW9uKCctLWNsaWVudCcsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2NsaWVudHMnLCBkZWZhdWx0PScnLAotICAgICAgICAgICAgICAgICAgICBoZWxwPSdsaXN0IG9mIGNsaWVudHMgdG8gdGVzdCBzZXBhcmF0ZWQgYnkgY29tbWFzLCBlZzotIC0tY2xpZW50PWNwcCxqYXZhJykKLSAgcGFyc2VyLmFkZF9vcHRpb24oJy1zJywgJy0tc2tpcC1rbm93bi1mYWlsdXJlcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J3NraXBfa25vd25fZmFpbHVyZXMnLAotICAgICAgICAgICAgICAgICAgICBoZWxwPSdkbyBub3QgZXhlY3V0ZSB0ZXN0cyB0aGF0IGFyZSBrbm93biB0byBmYWlsJykKLSAgcGFyc2VyLmFkZF9vcHRpb24oJy1qJywgJy0tam9icycsIHR5cGU9J2ludCcsIGRlc3Q9J2pvYnMnLAotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PWRlZmF1bHRfY29uY3VycmVudHkoKSwKLSAgICAgICAgICAgICAgICAgICAgaGVscD0nbnVtYmVyIG9mIGNvbmN1cnJlbnQgdGVzdCBleGVjdXRpb25zJykKLSAgZyA9IG9wdHBhcnNlLk9wdGlvbkdyb3VwKHBhcnNlciwgJ0FkdmFuY2VkJykKLSAgZy5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J3N0b3JlX2NvbnN0JywKLSAgICAgICAgICAgICAgIGRlc3Q9J2xvZ19sZXZlbCcsIGNvbnN0PWxvZ2dpbmcuREVCVUcsIGRlZmF1bHQ9bG9nZ2luZy5XQVJOSU5HLAotICAgICAgICAgICAgICAgaGVscD0nc2hvdyBkZWJ1ZyBvdXRwdXQgZm9yIHRlc3QgcnVubmVyJykKLSAgZy5hZGRfb3B0aW9uKCctUCcsICctLXByaW50LWV4cGVjdGVkLWZhaWx1cmVzJywgY2hvaWNlcz1bJ21lcmdlJywgJ292ZXJ3cml0ZSddLAotICAgICAgICAgICAgICAgZGVzdD0ncHJpbnRfZmFpbHVyZXMnLCBkZWZhdWx0PU5vbmUsCi0gICAgICAgICAgICAgICBoZWxwPSJnZW5lcmF0ZSBleHBlY3RlZCBmYWlsdXJlcyBiYXNlZCBvbiBsYXN0IHJlc3VsdCBhbmQgcHJpbnQgdG8gc3Rkb3V0IikKLSAgZy5hZGRfb3B0aW9uKCctVScsICctLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcycsIGNob2ljZXM9WydtZXJnZScsICdvdmVyd3JpdGUnXSwKLSAgICAgICAgICAgICAgIGRlc3Q9J3VwZGF0ZV9mYWlsdXJlcycsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgIGhlbHA9ImdlbmVyYXRlIGV4cGVjdGVkIGZhaWx1cmVzIGJhc2VkIG9uIGxhc3QgcmVzdWx0IGFuZCBzYXZlIHRvIGRlZmF1bHQgZmlsZSBsb2NhdGlvbiIpCi0gIGcuYWRkX29wdGlvbignLS1wcmVwYXJlJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgIGRlc3Q9J3ByZXBhcmUnLAotICAgICAgICAgICAgICAgaGVscD0idHJ5IHRvIHByZXBhcmUgZmlsZXMgbmVlZGVkIGZvciBjcm9zcyB0ZXN0IChleHBlcmltZW50YWwpIikKLSAgcGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoZykKLSAgbG9nZ2VyID0gbXVsdGlwcm9jZXNzaW5nLmxvZ190b19zdGRlcnIoKQotICBvcHRpb25zLCBfID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndikKLSAgc2VydmVyX21hdGNoID0gb3B0aW9ucy5zZXJ2ZXJzLnNwbGl0KCcsJykgaWYgb3B0aW9ucy5zZXJ2ZXJzIGVsc2UgW10KLSAgY2xpZW50X21hdGNoID0gb3B0aW9ucy5jbGllbnRzLnNwbGl0KCcsJykgaWYgb3B0aW9ucy5jbGllbnRzIGVsc2UgW10KLSAgbG9nZ2VyLnNldExldmVsKG9wdGlvbnMubG9nX2xldmVsKQorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNlcnZlcicsIGRlZmF1bHQ9JycsIG5hcmdzPScqJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2xpc3Qgb2Ygc2VydmVycyB0byB0ZXN0JykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNsaWVudCcsIGRlZmF1bHQ9JycsIG5hcmdzPScqJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2xpc3Qgb2YgY2xpZW50cyB0byB0ZXN0JykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctRicsICctLWZlYXR1cmVzJywgbmFyZ3M9JyonLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gc2VydmVyIGZlYXR1cmUgdGVzdHMgaW5zdGVhZCBvZiBjcm9zcyBsYW5ndWFnZSB0ZXN0cycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLVInLCAnLS1yZWdleCcsIGhlbHA9J3Rlc3QgbmFtZSBwYXR0ZXJuIHRvIHJ1bicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLW8nLCAnLS1vbmx5LWtub3duX2ZhaWx1cmVzJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nb25seV9rbm93bl9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdvbmx5IGV4ZWN1dGUgdGVzdHMgdGhhdCBhcmUga25vd24gdG8gZmFpbCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXMnLCAnLS1za2lwLWtub3duLWZhaWx1cmVzJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nc2tpcF9rbm93bl9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkbyBub3QgZXhlY3V0ZSB0ZXN0cyB0aGF0IGFyZSBrbm93biB0byBmYWlsJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctcicsICctLXJldHJ5LWNvdW50JywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PTAsIGhlbHA9J21heGltdW0gcmV0cnkgb24gZmFpbHVyZScpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWonLCAnLS1qb2JzJywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PWRlZmF1bHRfY29uY3VycmVudHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J251bWJlciBvZiBjb25jdXJyZW50IHRlc3QgZXhlY3V0aW9ucycpCiAKLSAgaWYgb3B0aW9ucy5wcmVwYXJlOgotICAgIHJlcyA9IHByZXBhcmUoc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gpCi0gIGVsaWYgb3B0aW9ucy51cGRhdGVfZmFpbHVyZXMgb3Igb3B0aW9ucy5wcmludF9mYWlsdXJlczoKLSAgICByZXMgPSBjcm9zc3J1bm5lci5nZW5lcmF0ZV9rbm93bl9mYWlsdXJlcygKLSAgICAgICAgVEVTVF9ESVIsIG9wdGlvbnMudXBkYXRlX2ZhaWx1cmVzID09ICdvdmVyd3JpdGUnLAotICAgICAgICBvcHRpb25zLnVwZGF0ZV9mYWlsdXJlcywgb3B0aW9ucy5wcmludF9mYWlsdXJlcykKLSAgZWxzZToKLSAgICByZXMgPSBydW5fdGVzdHMoc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIG9wdGlvbnMuam9icywgb3B0aW9ucy5za2lwX2tub3duX2ZhaWx1cmVzKQotICByZXR1cm4gMCBpZiByZXMgZWxzZSAxCisgICAgZyA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAodGl0bGU9J0FkdmFuY2VkJykKKyAgICBnLmFkZF9hcmd1bWVudCgnLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSdzdG9yZV9jb25zdCcsCisgICAgICAgICAgICAgICAgICAgZGVzdD0nbG9nX2xldmVsJywgY29uc3Q9bG9nZ2luZy5ERUJVRywgZGVmYXVsdD1sb2dnaW5nLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgaGVscD0nc2hvdyBkZWJ1ZyBvdXRwdXQgZm9yIHRlc3QgcnVubmVyJykKKyAgICBnLmFkZF9hcmd1bWVudCgnLVAnLCAnLS1wcmludC1leHBlY3RlZC1mYWlsdXJlcycsIGNob2ljZXM9WydtZXJnZScsICdvdmVyd3JpdGUnXSwKKyAgICAgICAgICAgICAgICAgICBkZXN0PSdwcmludF9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgaGVscD0iZ2VuZXJhdGUgZXhwZWN0ZWQgZmFpbHVyZXMgYmFzZWQgb24gbGFzdCByZXN1bHQgYW5kIHByaW50IHRvIHN0ZG91dCIpCisgICAgZy5hZGRfYXJndW1lbnQoJy1VJywgJy0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzJywgY2hvaWNlcz1bJ21lcmdlJywgJ292ZXJ3cml0ZSddLAorICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VwZGF0ZV9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgaGVscD0iZ2VuZXJhdGUgZXhwZWN0ZWQgZmFpbHVyZXMgYmFzZWQgb24gbGFzdCByZXN1bHQgYW5kIHNhdmUgdG8gZGVmYXVsdCBmaWxlIGxvY2F0aW9uIikKKyAgICBvcHRpb25zID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndikKKworICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5sb2dfdG9fc3RkZXJyKCkKKyAgICBsb2dnZXIuc2V0TGV2ZWwob3B0aW9ucy5sb2dfbGV2ZWwpCisKKyAgICBpZiBvcHRpb25zLmZlYXR1cmVzIGlzIG5vdCBOb25lIGFuZCBvcHRpb25zLmNsaWVudDoKKyAgICAgICAgcHJpbnQoJ0Nhbm5vdCBzcGVjaWZ5IGJvdGggLS1mZWF0dXJlcyBhbmQgLS1jbGllbnQgJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZXR1cm4gMQorCisgICAgIyBBbGxvdyBtdWx0aXBsZSBhcmdzIHNlcGFyYXRlZCB3aXRoICcsJyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgIHNlcnZlcl9tYXRjaCA9IGxpc3QoY2hhaW4oKlt4LnNwbGl0KCcsJykgZm9yIHggaW4gb3B0aW9ucy5zZXJ2ZXJdKSkKKyAgICBjbGllbnRfbWF0Y2ggPSBsaXN0KGNoYWluKCpbeC5zcGxpdCgnLCcpIGZvciB4IGluIG9wdGlvbnMuY2xpZW50XSkpCisKKyAgICBpZiBvcHRpb25zLnVwZGF0ZV9mYWlsdXJlcyBvciBvcHRpb25zLnByaW50X2ZhaWx1cmVzOgorICAgICAgICBkaXJlID0gcGF0aF9qb2luKFJPT1RfRElSLCBGRUFUVVJFX0RJUl9SRUxBVElWRSkgaWYgb3B0aW9ucy5mZWF0dXJlcyBpcyBub3QgTm9uZSBlbHNlIFRFU1RfRElSCisgICAgICAgIHJlcyA9IGNyb3NzcnVubmVyLmdlbmVyYXRlX2tub3duX2ZhaWx1cmVzKAorICAgICAgICAgICAgZGlyZSwgb3B0aW9ucy51cGRhdGVfZmFpbHVyZXMgPT0gJ292ZXJ3cml0ZScsCisgICAgICAgICAgICBvcHRpb25zLnVwZGF0ZV9mYWlsdXJlcywgb3B0aW9ucy5wcmludF9mYWlsdXJlcykKKyAgICBlbGlmIG9wdGlvbnMuZmVhdHVyZXMgaXMgbm90IE5vbmU6CisgICAgICAgIGZlYXR1cmVzID0gb3B0aW9ucy5mZWF0dXJlcyBvciBbJy4qJ10KKyAgICAgICAgcmVzID0gcnVuX2ZlYXR1cmVfdGVzdHMoc2VydmVyX21hdGNoLCBmZWF0dXJlcywgb3B0aW9ucy5qb2JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNraXBfa25vd25fZmFpbHVyZXMsIG9wdGlvbnMub25seV9rbm93bl9mYWlsdXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5yZXRyeV9jb3VudCwgb3B0aW9ucy5yZWdleCkKKyAgICBlbHNlOgorICAgICAgICByZXMgPSBydW5fY3Jvc3NfdGVzdHMoc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIG9wdGlvbnMuam9icywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2tpcF9rbm93bl9mYWlsdXJlcywgb3B0aW9ucy5vbmx5X2tub3duX2ZhaWx1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5yZXRyeV9jb3VudCwgb3B0aW9ucy5yZWdleCkKKyAgICByZXR1cm4gMCBpZiByZXMgZWxzZSAxCisKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQorICAgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3ZbMTpdKSkKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdHMuanNvbiBiL3Rlc3QvdGVzdHMuanNvbgppbmRleCBjYjJmMGUyLi5hNDY4MGQxIDEwMDY0NAotLS0gYS90ZXN0L3Rlc3RzLmpzb24KKysrIGIvdGVzdC90ZXN0cy5qc29uCkBAIC01LDE0ICs1LDI2IEBACiAgICAgICAiTGludXgiCiAgICAgXSwKICAgICAic2VydmVyIjogewotICAgICAgImRlbGF5IjogMSwKICAgICAgICJjb21tYW5kIjogWwotICAgICAgICAidGVzdF9zZXJ2ZXIiCisgICAgICAgICJ0ZXN0X3NlcnZlciIsCisgICAgICAgICItLWx0LWRlYnVnIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiLAorICAgICAgICAiY29tcGFjdDptdWx0aWMiCiAgICAgICBdCiAgICAgfSwKICAgICAiY2xpZW50IjogewogICAgICAgImNvbW1hbmQiOiBbCi0gICAgICAgICJ0ZXN0X2NsaWVudCIKKyAgICAgICAgInRlc3RfY2xpZW50IiwKKyAgICAgICAgIi0tbHQtZGVidWciCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIKKyAgICAgIF0sCisgICAgICAic29ja2V0cyI6IFsKKyAgICAgICAgImlwLXNzbCIKICAgICAgIF0KICAgICB9LAogICAgICJ0cmFuc3BvcnRzIjogWwpAQCAtMjMsMTQgKzM1LDYyIEBACiAgICAgICAiaXAiCiAgICAgXSwKICAgICAicHJvdG9jb2xzIjogWwotICAgICAgImJpbmFyeSIKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiCiAgICAgXSwKICAgICAid29ya2RpciI6ICJjX2dsaWIiCiAgIH0sCiAgIHsKKyAgICAibmFtZSI6ICJjbCIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWyJUZXN0U2VydmVyIl0sCisgICAgICAid29ya2RpciI6ICJjbCIsCisgICAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiLCAibXVsdGkiXSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCIsICJmcmFtZWQiXSwKKyAgICAgICJzb2NrZXRzIjogWyJpcCJdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbIlRlc3RDbGllbnQiXSwKKyAgICAgICJ3b3JrZGlyIjogImNsIiwKKyAgICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSIsICJtdWx0aSJdLAorICAgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIiwgImZyYW1lZCJdLAorICAgICAgInNvY2tldHMiOiBbImlwIl0KKyAgICB9CisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJkIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0aHJpZnRfdGVzdF9zZXJ2ZXIiLAorICAgICAgICAiLS10cmFjZSIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRocmlmdF90ZXN0X2NsaWVudCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImh0dHAiLAorICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAid29ya2RpciI6ICIuLi9saWIvZC90ZXN0IgorICB9LAorICB7CiAgICAgIm5hbWUiOiAiZ28iLAogICAgICJzZXJ2ZXIiOiB7Ci0gICAgICAiZGVsYXkiOiAxLAogICAgICAgImNvbW1hbmQiOiBbCiAgICAgICAgICJ0ZXN0c2VydmVyIiwKICAgICAgICAgIi0tY2VydFBhdGg9Li4vLi4va2V5cyIKQEAgLTQ0LDcgKzEwNCw5IEBACiAgICAgfSwKICAgICAidHJhbnNwb3J0cyI6IFsKICAgICAgICJidWZmZXJlZCIsCi0gICAgICAiZnJhbWVkIgorICAgICAgImZyYW1lZCIsCisgICAgICAiaHR0cCIsCisgICAgICAiemxpYiIKICAgICBdLAogICAgICJzb2NrZXRzIjogWwogICAgICAgImlwIiwKQEAgLTU5LDI5ICsxMjEsMzAgQEAKICAgfSwKICAgewogICAgICJuYW1lIjogImphdmEiLAotICAgICJqb2luX2FyZ3MiOiB0cnVlLAotICAgICJjb21tYW5kIjogWwotICAgICAgImFudCIsCi0gICAgICAiLWYiLAotICAgICAgImJ1aWxkLnhtbCIsCi0gICAgICAiLURuby1nZW4tdGhyaWZ0PVwiXCIiLAotICAgICAgIi1EdGVzdGFyZ3MiCi0gICAgXSwKLSAgICAicHJlcGFyZSI6IFsKLSAgICAgICJhbnQiLAotICAgICAgIi1mIiwKLSAgICAgICJidWlsZC54bWwiLAotICAgICAgImNvbXBpbGUtdGVzdCIKLSAgICBdLAorICAgICJqb2luX2FyZ3MiOiBmYWxzZSwKICAgICAic2VydmVyIjogewotICAgICAgImRlbGF5IjogNSwKLSAgICAgICJleHRyYV9hcmdzIjogWyJydW4tdGVzdHNlcnZlciJdCisgICAgICAiZGVsYXkiOiAxNSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiYnVpbGQvcnVuc2VydmVyIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiLAorICAgICAgICAiY29tcGFjdDptdWx0aWMiLAorICAgICAgICAianNvbjptdWx0aWoiCisgICAgICBdCiAgICAgfSwKICAgICAiY2xpZW50IjogewogICAgICAgInRpbWVvdXQiOiAxMywKLSAgICAgICJleHRyYV9hcmdzIjogWyJydW4tdGVzdGNsaWVudCJdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJidWlsZC9ydW5jbGllbnQiCisgICAgICBdLAogICAgICAgInRyYW5zcG9ydHMiOiBbCiAgICAgICAgICJodHRwIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiLAorICAgICAgICAibXVsdGlqOmpzb24iCiAgICAgICBdCiAgICAgfSwKICAgICAidHJhbnNwb3J0cyI6IFsKQEAgLTkwLDEzICsxNTMsMTYgQEAKICAgICAgICJmcmFtZWQ6ZmFzdGZyYW1lZCIKICAgICBdLAogICAgICJzb2NrZXRzIjogWwotICAgICAgImlwLXNzbCIsCi0gICAgICAiaXAiCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKICAgICBdLAogICAgICJwcm90b2NvbHMiOiBbCi0gICAgICAiY29tcGFjdCIsCiAgICAgICAiYmluYXJ5IiwKLSAgICAgICJqc29uIgorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiLAorICAgICAgIm11bHRpaiIKICAgICBdLAogICAgICJ3b3JrZGlyIjogIi4uL2xpYi9qYXZhIgogICB9LApAQCAtMTA2LDcgKzE3Miw2IEBACiAgICAgICAiTk9ERV9QQVRIIjogIi4uL2xpYiIKICAgICB9LAogICAgICJzZXJ2ZXIiOiB7Ci0gICAgICAiZGVsYXkiOiAxLAogICAgICAgImNvbW1hbmQiOiBbCiAgICAgICAgICJub2RlIiwKICAgICAgICAgInNlcnZlci5qcyIsCkBAIC0xMTQsNyArMTc5LDcgQEAKICAgICAgIF0KICAgICB9LAogICAgICJjbGllbnQiOiB7Ci0gICAgICAidGltZW91dCI6IDIuOSwKKyAgICAgICJ0aW1lb3V0IjogNiwKICAgICAgICJjb21tYW5kIjogWwogICAgICAgICAibm9kZSIsCiAgICAgICAgICJjbGllbnQuanMiLApAQCAtMTIzLDE2ICsxODgsMTkgQEAKICAgICB9LAogICAgICJ0cmFuc3BvcnRzIjogWwogICAgICAgImJ1ZmZlcmVkIiwKLSAgICAgICJmcmFtZWQiCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJodHRwIgogICAgIF0sCiAgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAogICAgICAgImlwLXNzbCIsCi0gICAgICAiaXAiCisgICAgICAiZG9tYWluIgogICAgIF0sCiAgICAgInByb3RvY29scyI6IFsKICAgICAgICJjb21wYWN0IiwKICAgICAgICJiaW5hcnkiLAotICAgICAgImpzb24iCisgICAgICAianNvbiIsCisgICAgICAiaGVhZGVyIgogICAgIF0sCiAgICAgIndvcmtkaXIiOiAiLi4vbGliL25vZGVqcy90ZXN0IgogICB9LApAQCAtMTYwLDYgKzIyOCw3IEBACiAgICAgICAiaXAiCiAgICAgXSwKICAgICAicHJvdG9jb2xzIjogWworICAgICAgImhlYWRlciIsCiAgICAgICAiY29tcGFjdCIsCiAgICAgICAiYmluYXJ5IiwKICAgICAgICJqc29uIgpAQCAtMTY5LDcgKzIzOCw2IEBACiAgIHsKICAgICAibmFtZSI6ICJweSIsCiAgICAgInNlcnZlciI6IHsKLSAgICAgICJkZWxheSI6IDEsCiAgICAgICAiZXh0cmFfYXJncyI6IFsiVFNpbXBsZVNlcnZlciJdLAogICAgICAgImNvbW1hbmQiOiBbCiAgICAgICAgICJUZXN0U2VydmVyLnB5IiwKQEAgLTE4MSw3MiArMjQ5LDE1MCBAQAogICAgICAgInRpbWVvdXQiOiAxMCwKICAgICAgICJjb21tYW5kIjogWwogICAgICAgICAiVGVzdENsaWVudC5weSIsCisgICAgICAgICItLXZlcmJvc2UiLAogICAgICAgICAiLS1ob3N0PWxvY2FsaG9zdCIsCiAgICAgICAgICItLWdlbnB5ZGlyPWdlbi1weSIKICAgICAgIF0KICAgICB9LAogICAgICJ0cmFuc3BvcnRzIjogWwogICAgICAgImJ1ZmZlcmVkIiwKLSAgICAgICJmcmFtZWQiCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJodHRwIiwKKyAgICAgICJ6bGliIgogICAgIF0sCiAgICAgInNvY2tldHMiOiBbCi0gICAgICAiaXAtc3NsIiwKLSAgICAgICJpcCIKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgogICAgIF0sCiAgICAgInByb3RvY29scyI6IFsKLSAgICAgICJjb21wYWN0IiwKICAgICAgICJiaW5hcnkiLAorICAgICAgImJpbmFyeTphY2NlbCIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAiY29tcGFjdDphY2NlbGMiLAorICAgICAgImhlYWRlciIsCiAgICAgICAianNvbiIsCi0gICAgICAiYmluYXJ5OmFjY2VsIgorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aTptdWx0aWEiLAorICAgICAgIm11bHRpYSIsCisgICAgICAibXVsdGlhYyIsCisgICAgICAibXVsdGljIiwKKyAgICAgICJtdWx0aWM6bXVsdGlhYyIsCisgICAgICAibXVsdGloIiwKKyAgICAgICJtdWx0aWoiCisgICAgXSwKKyAgICAid29ya2RpciI6ICJweSIKKyAgfSwKKyAgeworICAgICJjb21tZW50IjogIlVzaW5nICdweXRob24zJyBleGVjdXRhYmxlIHRvIHRlc3QgcHkyIGFuZCAzIGF0IG9uY2UiLAorICAgICJuYW1lIjogInB5MyIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJleHRyYV9hcmdzIjogWyJUU2ltcGxlU2VydmVyIl0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInB5dGhvbjMiLAorICAgICAgICAiVGVzdFNlcnZlci5weSIsCisgICAgICAgICItLXZlcmJvc2UiLAorICAgICAgICAiLS1nZW5weWRpcj1nZW4tcHkiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiAxMCwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicHl0aG9uMyIsCisgICAgICAgICJUZXN0Q2xpZW50LnB5IiwKKyAgICAgICAgIi0taG9zdD1sb2NhbGhvc3QiLAorICAgICAgICAiLS1nZW5weWRpcj1nZW4tcHkiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJodHRwIiwKKyAgICAgICJ6bGliIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJiaW5hcnk6YWNjZWwiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImNvbXBhY3Q6YWNjZWxjIiwKKyAgICAgICJoZWFkZXIiLAorICAgICAgImpzb24iLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aTptdWx0aWEiLAorICAgICAgIm11bHRpYSIsCisgICAgICAibXVsdGlhYyIsCisgICAgICAibXVsdGljIiwKKyAgICAgICJtdWx0aWM6bXVsdGlhYyIsCisgICAgICAibXVsdGloIiwKKyAgICAgICJtdWx0aWoiCiAgICAgXSwKICAgICAid29ya2RpciI6ICJweSIKICAgfSwKICAgewogICAgICJuYW1lIjogImNwcCIsCiAgICAgInNlcnZlciI6IHsKLSAgICAgICJkZWxheSI6IDIsCiAgICAgICAiY29tbWFuZCI6IFsKICAgICAgICAgIlRlc3RTZXJ2ZXIiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIsCisgICAgICAgICJoZWFkZXI6bXVsdGloIiwKKyAgICAgICAgImpzb246bXVsdGlqIgogICAgICAgXQogICAgIH0sCiAgICAgImNsaWVudCI6IHsKICAgICAgICJ0aW1lb3V0IjogOCwKICAgICAgICJjb21tYW5kIjogWwogICAgICAgICAiVGVzdENsaWVudCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IiwKKyAgICAgICAgIm11bHRpaDpoZWFkZXIiLAorICAgICAgICAibXVsdGlqOmpzb24iCiAgICAgICBdCiAgICAgfSwKICAgICAidHJhbnNwb3J0cyI6IFsKICAgICAgICJidWZmZXJlZCIsCiAgICAgICAiaHR0cCIsCi0gICAgICAiZnJhbWVkIgorICAgICAgImZyYW1lZCIsCisgICAgICAiemxpYiIKICAgICBdLAogICAgICJzb2NrZXRzIjogWwotICAgICAgImlwLXNzbCIsCiAgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIsCiAgICAgICAiZG9tYWluIgogICAgIF0sCiAgICAgInByb3RvY29scyI6IFsKICAgICAgICJjb21wYWN0IiwKICAgICAgICJiaW5hcnkiLAotICAgICAgImpzb24iCisgICAgICAianNvbiIsCisgICAgICAiaGVhZGVyIiwKKyAgICAgICJtdWx0aSIsCisgICAgICAibXVsdGljIiwKKyAgICAgICJtdWx0aWgiLAorICAgICAgIm11bHRpaiIKICAgICBdLAogICAgICJ3b3JrZGlyIjogImNwcCIKICAgfSwKICAgewogICAgICJuYW1lIjogInJiIiwKICAgICAic2VydmVyIjogewotICAgICAgImRlbGF5IjogMSwKICAgICAgICJjb21tYW5kIjogWwogICAgICAgICAicnVieSIsCiAgICAgICAgICIuLi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiIgogICAgICAgXQogICAgIH0sCiAgICAgImNsaWVudCI6IHsKLSAgICAgICJ0aW1lb3V0IjogNSwKKyAgICAgICJ0aW1lb3V0IjogMTAsCiAgICAgICAiY29tbWFuZCI6IFsKICAgICAgICAgInJ1YnkiLAogICAgICAgICAiLi4vaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYiIsCi0gICAgICAgICItLWhvc3Q9MTI3LjAuMC4xIgorICAgICAgICAiLS0iCiAgICAgICBdCiAgICAgfSwKICAgICAidHJhbnNwb3J0cyI6IFsKQEAgLTI1NCwyMCArNDAwLDIyIEBACiAgICAgICAiZnJhbWVkIgogICAgIF0sCiAgICAgInNvY2tldHMiOiBbCi0gICAgICAiaXAiCisgICAgICAiZG9tYWluIiwKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgogICAgIF0sCiAgICAgInByb3RvY29scyI6IFsKLSAgICAgICJjb21wYWN0IiwKICAgICAgICJiaW5hcnkiLAotICAgICAgImpzb24iLAotICAgICAgImJpbmFyeTphY2NlbCIKKyAgICAgICJiaW5hcnk6YWNjZWwiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iCiAgICAgXSwKICAgICAid29ya2RpciI6ICJyYi9nZW4tcmIiCiAgIH0sCiAgIHsKICAgICAibmFtZSI6ICJjc2hhcnAiLAogICAgICJlbnYiOiB7Ci0gICAgICAiTU9OT19QQVRIIjogIi4uLy4uIgorICAgICAgIk1PTk9fUEFUSCI6ICIuLi8uLi9saWIvY3NoYXJwLyIKICAgICB9LAogICAgICJ0cmFuc3BvcnRzIjogWwogICAgICAgImJ1ZmZlcmVkIiwKQEAgLTI4MywyMiArNDMxLDYzIEBACiAgICAgICAianNvbiIKICAgICBdLAogICAgICJzZXJ2ZXIiOiB7Ci0gICAgICAiZGVsYXkiOiAzLAogICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJtb25vIiwKICAgICAgICAgIlRlc3RDbGllbnRTZXJ2ZXIuZXhlIiwKLSAgICAgICAgInNlcnZlciIsCi0gICAgICAgICItLWNlcnQ9Li4vLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5wZW0iCisgICAgICAgICJzZXJ2ZXIiCiAgICAgICBdCiAgICAgfSwKICAgICAiY2xpZW50IjogewogICAgICAgInRpbWVvdXQiOiA5LAogICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJtb25vIiwKICAgICAgICAgIlRlc3RDbGllbnRTZXJ2ZXIuZXhlIiwKLSAgICAgICAgImNsaWVudCIsCi0gICAgICAgICItLWNlcnQ9Li4vLi4vLi4vLi4vdGVzdC9rZXlzL2NsaWVudC5wZW0iCisgICAgICAgICJjbGllbnQiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpIiwKKyAgICAgICAgIm11bHRpYyIsCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiCiAgICAgICBdCiAgICAgfSwKLSAgICAid29ya2RpciI6ICIuLi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdCIKKyAgICAid29ya2RpciI6ICJjc2hhcnAiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJuZXRjb3JlIiwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZG90bmV0IiwKKyAgICAgICAgInJ1biIsCisgICAgICAgICItLW5vLWJ1aWxkIiwKKyAgICAgICAgIi0tcHJvamVjdD1TZXJ2ZXIvU2VydmVyLmNzcHJvaiIsCisgICAgICAgICJzZXJ2ZXIiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiAxMCwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZG90bmV0IiwKKyAgICAgICAgInJ1biIsCisgICAgICAgICItLW5vLWJ1aWxkIiwKKyAgICAgICAgIi0tcHJvamVjdD1DbGllbnQvQ2xpZW50LmNzcHJvaiIsCisgICAgICAgICJjbGllbnQiCisgICAgICBdCisgICAgfSwKKyAgICAgICAgIndvcmtkaXIiOiAibmV0Y29yZSIKICAgfSwKICAgewogICAgICJuYW1lIjogInBlcmwiLApAQCAtMzA4LDEwICs0OTcsMTIgQEAKICAgICBdLAogICAgICJzb2NrZXRzIjogWwogICAgICAgImlwIiwKLSAgICAgICJpcC1zc2wiCisgICAgICAiaXAtc3NsIiwKKyAgICAgICJkb21haW4iCiAgICAgXSwKICAgICAicHJvdG9jb2xzIjogWwotICAgICAgImJpbmFyeSIKKyAgICAgICJiaW5hcnkiLAorICAgICAgIm11bHRpIgogICAgIF0sCiAgICAgImNsaWVudCI6IHsKICAgICAgICJjb21tYW5kIjogWwpAQCAtMzE5LDcgKzUxMCwxMiBAQAogICAgICAgICAiLUlnZW4tcGVybC8iLAogICAgICAgICAiLUkuLi8uLi9saWIvcGVybC9saWIvIiwKICAgICAgICAgIlRlc3RDbGllbnQucGwiLAotICAgICAgICAiLS1jZXJ0PS4uLy4uL3Rlc3Qva2V5cy9jbGllbnQucGVtIgorICAgICAgICAiLS1jYT0uLi9rZXlzL0NBLnBlbSIsCisgICAgICAgICItLWNlcnQ9Li4va2V5cy9jbGllbnQuY3J0IiwKKyAgICAgICAgIi0ta2V5PS4uL2tleXMvY2xpZW50LmtleSIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IgogICAgICAgXQogICAgIH0sCiAgICAgInNlcnZlciI6IHsKQEAgLTMyOCw4ICs1MjQsMTEgQEAKICAgICAgICAgIi1JZ2VuLXBlcmwvIiwKICAgICAgICAgIi1JLi4vLi4vbGliL3BlcmwvbGliLyIsCiAgICAgICAgICJUZXN0U2VydmVyLnBsIiwKLSAgICAgICAgIi0tY2VydD0uLi8uLi90ZXN0L2tleXMvc2VydmVyLnBlbSIsCi0gICAgICAgICItLWtleT0uLi8uLi90ZXN0L2tleXMvc2VydmVyLmtleSIKKyAgICAgICAgIi0tY2VydD0uLi9rZXlzL3NlcnZlci5jcnQiLAorICAgICAgICAiLS1rZXk9Li4va2V5cy9zZXJ2ZXIua2V5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiCiAgICAgICBdCiAgICAgfSwKICAgICAid29ya2RpciI6ICJwZXJsIgpAQCAtMzQ3LDE0ICs1NDYsMjExIEBACiAgICAgICBdLAogICAgICAgInByb3RvY29scyI6IFsKICAgICAgICAgImJpbmFyeSIsCisgICAgICAgICJiaW5hcnk6YWNjZWwiLAogICAgICAgICAiY29tcGFjdCIsCi0gICAgICAgICJiaW5hcnk6YWNjZWwiCisgICAgICAgICJqc29uIgogICAgICAgXSwKICAgICAgICJjb21tYW5kIjogWwogICAgICAgICAicGhwIiwKKyAgICAgICAgIi1kZXh0ZW5zaW9uX2Rpcj1waHBfZXh0X2RpciIsCisgICAgICAgICItLXBocC1pbmk9dGVzdF9waHAuaW5pIiwKKyAgICAgICAgIi0tbm8tcGhwLWluaSIsCisgICAgICAgICItZGRpc3BsYXlfZXJyb3JzPXN0ZGVyciIsCisgICAgICAgICItZGxvZ19lcnJvcnM9MCIsCisgICAgICAgICItZGVycm9yX3JlcG9ydGluZz1FX0FMTCIsCiAgICAgICAgICJUZXN0Q2xpZW50LnBocCIKICAgICAgIF0KICAgICB9LAogICAgICJ3b3JrZGlyIjogInBocCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImRhcnQiLAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDMwLAorICAgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAgICJidWZmZXJlZCIsCisgICAgICAgICJmcmFtZWQiLAorICAgICAgICAiaHR0cCIKKyAgICAgIF0sCisgICAgICAic29ja2V0cyI6IFsKKyAgICAgICAgImlwIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnkiLAorICAgICAgICAiY29tcGFjdCIsCisgICAgICAgICJqc29uIgorICAgICAgXSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZGFydCIsCisJIi0tY2hlY2tlZCIsCisgICAgICAgICJ0ZXN0X2NsaWVudC9iaW4vbWFpbi5kYXJ0IiwKKwkiLS12ZXJib3NlIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAiZGFydCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImVybCIsCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIKKyAgICBdLAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImVybCIsCisgICAgICAgICIrSyIsCisgICAgICAgICJ0cnVlIiwKKyAgICAgICAgIi1ub3NoZWxsIiwKKyAgICAgICAgIi1wYSIsCisgICAgICAgICIuLi8uLi9saWIvZXJsL2ViaW4vIiwKKyAgICAgICAgIi1wYSIsCisgICAgICAgICIuL2ViaW4iLAorICAgICAgICAiLXMiLAorICAgICAgICAidGVzdF9jbGllbnQiLAorICAgICAgICAiLXMiLAorICAgICAgICAiaW5pdCIsCisgICAgICAgICJzdG9wIiwKKyAgICAgICAgIi1leHRyYSIKKyAgICAgIF0KKyAgICB9LAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImVybCIsCisgICAgICAgICIrSyIsCisgICAgICAgICJ0cnVlIiwKKyAgICAgICAgIi1ub3NoZWxsIiwKKyAgICAgICAgIi1wYSIsCisgICAgICAgICIuLi8uLi9saWIvZXJsL2ViaW4vIiwKKyAgICAgICAgIi1wYSIsCisgICAgICAgICIuL2ViaW4iLAorICAgICAgICAiLXMiLAorICAgICAgICAidGVzdF90aHJpZnRfc2VydmVyIiwKKyAgICAgICAgIi1leHRyYSIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogImVybCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImpzIiwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJodHRwIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImpzb24iCisgICAgXSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJwaGFudG9tanMiLAorICAgICAgICAidGVzdC9waGFudG9tLWNsaWVudC5qcyIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogIi4uL2xpYi9qcyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImx1YSIsCisgICAgIlRPRE8iOiAiQWRkIGRsbCB0byBMVUFfQ1BBVEgiLAorICAgICJlbnYiOiB7CisgICAgICAiTFVBX1BBVEgiOiAiOztnZW4tbHVhLz8ubHVhOy4uLy4uL2xpYi9sdWEvPy5sdWEiLAorICAgICAgIkxVQV9DUEFUSCI6ICI7Oy4uLy4uL2xpYi9sdWEvLmxpYnMvPy5zbyIKKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDUsCisgICAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICAgImZyYW1lZCIsCisgICAgICAgICJodHRwIgorICAgICAgXSwKKyAgICAgICJzb2NrZXRzIjogWworICAgICAgICAiaXAiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeSIsCisgICAgICAgICJjb21wYWN0IiwKKyAgICAgICAgImpzb24iCisgICAgICBdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJsdWEiLAorICAgICAgICAidGVzdF9iYXNpY19jbGllbnQubHVhIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAibHVhIgorICB9LAorICB7CisgICAgIm5hbWUiOiAicnMiLAorICAgICJlbnYiOiB7CisgICAgICAiUlVTVF9CQUNLVFJBQ0UiOiAiMSIsCisgICAgICAiUlVTVF9MT0ciOiAiaW5mbyIKKyAgICB9LAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3Rfc2VydmVyIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiLAorICAgICAgICAiY29tcGFjdDptdWx0aWMiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA2LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0ZXN0X2NsaWVudCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IgorICAgICAgXQorICAgIH0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiCisgICAgXSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiCisgICAgXSwKKyAgICAid29ya2RpciI6ICJycy9iaW4iCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJub2RldHMiLAorICAgICJlbnYiOiB7CisgICAgICAiTk9ERV9QQVRIIjogIi4uL2xpYiIKKyAgICB9LAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInJ1blNlcnZlci5zaCIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDYsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInJ1bkNsaWVudC5zaCIKKyAgICAgIF0KKyAgICB9LAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiCisgICAgXSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogIi4uL2xpYi9ub2RldHMvdGVzdCIKICAgfQogXQpkaWZmIC0tZ2l0IGEvdGVzdC90aHJlYWRzL1RocmVhZHNDbGllbnQuY3BwIGIvdGVzdC90aHJlYWRzL1RocmVhZHNDbGllbnQuY3BwCmluZGV4IDkzMDZhM2YuLmU4YmQ3OWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdGhyZWFkcy9UaHJlYWRzQ2xpZW50LmNwcAorKysgYi90ZXN0L3RocmVhZHMvVGhyZWFkc0NsaWVudC5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnkuaD4KICNpZiBfV0lOMzIKICAgICNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgogI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3RocmVhZHMvVGhyZWFkc1NlcnZlci5jcHAgYi90ZXN0L3RocmVhZHMvVGhyZWFkc1NlcnZlci5jcHAKaW5kZXggYTI2N2MzYi4uMzgxMWI2MCAxMDA2NDQKLS0tIGEvdGVzdC90aHJlYWRzL1RocmVhZHNTZXJ2ZXIuY3BwCisrKyBiL3Rlc3QvdGhyZWFkcy9UaHJlYWRzU2VydmVyLmNwcApAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeS5oPgogI2lmIF9XSU4zMgogICAgI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CiAjZW5kaWYKQEAgLTExOCw4ICsxMTgsOCBAQAogICAvKgogICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPQogICAgIFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoMTApOwotICBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9Ci0gICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CisgIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9CisgICAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PihuZXcgVGhyZWFkRmFjdG9yeSgpKTsKICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC92YWxncmluZC5zdXBwcmVzcyBiL3Rlc3QvdmFsZ3JpbmQuc3VwcHJlc3MKaW5kZXggNDFmOTQxNC4uZGUxN2NiOCAxMDA2NDQKLS0tIGEvdGVzdC92YWxncmluZC5zdXBwcmVzcworKysgYi90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzCkBAIC01LDUgKzUsNDkgQEAKICAgIGZ1bjptYWxsb2MKICAgIGZ1bjpfWk41Ym9vc3Q2ZGV0YWlsMjVnZXRfb25jZV9wZXJfdGhyZWFkX2Vwb2NoRXYKIH0KK3sKKyAgIGJvb3N0dGhyZWFkcy9vbmNlL2lnbm9yZQorICAgSGVsZ3JpbmQ6UmFjZQorICAgZnVuOl9aTjVib29zdDEzdGhyZWFkX2RldGFpbDE3ZW50ZXJfb25jZV9yZWdpb25FUk5TXzlvbmNlX2ZsYWdFCisgICBmdW46X1pONWJvb3N0NmRldGFpbDIzZ2V0X2N1cnJlbnRfdGhyZWFkX2RhdGFFdgorICAgZnVuOl9aTjVib29zdDZkZXRhaWwyMGludGVycnVwdGlvbl9jaGVja2VyQzFFUDE1cHRocmVhZF9tdXRleF90UDE0cHRocmVhZF9jb25kX3QKKyAgIGZ1bjpfWk41Ym9vc3QyMmNvbmRpdGlvbl92YXJpYWJsZV9hbnk0d2FpdElOU18xMXVuaXF1ZV9sb2NrSU5TXzExdGltZWRfbXV0ZXhFRUVFRXZSVF8KKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k3TW9uaXRvcjRJbXBsMTF3YWl0Rm9yZXZlckV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0SW1wbDE5d2FpdEZvclRpbWVSZWxhdGl2ZUVsCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0SW1wbDR3YWl0RWwKKyAgIGZ1bjpfWk5LNmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0d2FpdEVsCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5MTFCb29zdFRocmVhZDVzdGFydEV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5NHRlc3QxOFRocmVhZEZhY3RvcnlUZXN0czEycmVhcE5UaHJlYWRzRWlpCisgICBmdW46bWFpbgorfQoreworICAgcHRocmVhZC9jcmVhdGlvbi10bHMvaWdub3JlCisgICBIZWxncmluZDpSYWNlCisgICBmdW46bWVtcGNweQorICAgZnVuOl9kbF9hbGxvY2F0ZV90bHNfaW5pdAorICAgZnVuOmdldF9jYWNoZWRfc3RhY2sKKyAgIGZ1bjphbGxvY2F0ZV9zdGFjaworICAgZnVuOnB0aHJlYWRfY3JlYXRlQEBHTElCQ18yLjIqCisgICBvYmo6L3Vzci9saWIvdmFsZ3JpbmQvdmdwcmVsb2FkX2hlbGdyaW5kLWFtZDY0LWxpbnV4LnNvCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5MTNQdGhyZWFkVGhyZWFkNXN0YXJ0RXYKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k0dGVzdDE4VGhyZWFkRmFjdG9yeVRlc3RzMTJyZWFwTlRocmVhZHNFaWkKKyAgIGZ1bjptYWluCit9Cit7CisgICBib29zdC10aHJlYWQvY3JlYXRpb24tdGxzL2lnbm9yZQorICAgSGVsZ3JpbmQ6UmFjZQorICAgZnVuOm1lbXBjcHkKKyAgIGZ1bjpfZGxfYWxsb2NhdGVfdGxzX2luaXQKKyAgIGZ1bjpnZXRfY2FjaGVkX3N0YWNrCisgICBmdW46YWxsb2NhdGVfc3RhY2sKKyAgIGZ1bjpwdGhyZWFkX2NyZWF0ZUBAR0xJQkNfMi4yLjUKKyAgIG9iajovdXNyL2xpYi92YWxncmluZC92Z3ByZWxvYWRfaGVsZ3JpbmQtYW1kNjQtbGludXguc28KKyAgIGZ1bjpfWk41Ym9vc3Q2dGhyZWFkMjFzdGFydF90aHJlYWRfbm9leGNlcHRFdgorICAgZnVuOl9aTjVib29zdDZ0aHJlYWQxMnN0YXJ0X3RocmVhZEV2CisgICBmdW46X1pONWJvb3N0NnRocmVhZEMxSVN0NV9CaW5kSUZQRlB2UzNfRVMzX0VFRUVPVF8KKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3kxMUJvb3N0VGhyZWFkNXN0YXJ0RXYKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k0dGVzdDE4VGhyZWFkRmFjdG9yeVRlc3RzMTJyZWFwTlRocmVhZHNFaWkKKyAgIGZ1bjptYWluCit9CiAKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9NYWtlZmlsZS5hbQppbmRleCA0NzcxMWE5Li4xN2E5MjU3IDEwMDc1NQotLS0gYS90dXRvcmlhbC9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9NYWtlZmlsZS5hbQpAQCAtMzEsNiArMzEsMTAgQEAKIFNVQkRJUlMgKz0gY3BwCiBlbmRpZgogCitpZiBXSVRIX0QKK1NVQkRJUlMgKz0gZAorZW5kaWYKKwogaWYgV0lUSF9KQVZBCiBTVUJESVJTICs9IGphdmEKIFNVQkRJUlMgKz0ganMKQEAgLTU0LDYgKzU4LDExIEBACiBTVUJESVJTICs9IGhheGUKIGVuZGlmCiAKK2lmIFdJVEhfRE9UTkVUCitTVUJESVJTICs9IG5ldGNvcmUKK1NVQkRJUlMgKz0gbmV0c3RkCitlbmRpZgorCiBpZiBXSVRIX0dPCiBTVUJESVJTICs9IGdvCiBlbmRpZgpAQCAtNjIsNiArNzEsMTggQEAKIFNVQkRJUlMgKz0gbm9kZWpzCiBlbmRpZgogCitpZiBXSVRIX0RBUlQKK1NVQkRJUlMgKz0gZGFydAorZW5kaWYKKworaWYgV0lUSF9SUworU1VCRElSUyArPSBycworZW5kaWYKKworaWYgV0lUSF9DTAorU1VCRElSUyArPSBjbAorZW5kaWYKKwogIwogIyBnZW5lcmF0ZSBodG1sIGZvciBUaHJpZnRUZXN0LnRocmlmdAogIwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY19nbGliL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvY19nbGliL01ha2VmaWxlLmFtCmluZGV4IDU2NWY2MzUuLjRkYmU2NTUgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL2NfZ2xpYi9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9jX2dsaWIvTWFrZWZpbGUuYW0KQEAgLTI0LDExICsyNCw5IEBACiAJZ2VuLWNfZ2xpYi9zaGFyZWRfdHlwZXMuaCBcCiAJZ2VuLWNfZ2xpYi90dXRvcmlhbF90eXBlcy5oCiAKLUFNX0NGTEFHUyA9IC1nIC1XYWxsIC1XZXh0cmEgLXBlZGFudGljICQoR0xJQl9DRkxBR1MpICQoR09CSkVDVF9DRkxBR1MpIEBHQ09WX0NGTEFHU0AKK0FNX0NGTEFHUyA9IC1nIC1XYWxsIC1XZXh0cmEgLXBlZGFudGljICQoR0xJQl9DRkxBR1MpICQoR09CSkVDVF9DRkxBR1MpICQoT1BFTlNTTF9JTkNMVURFUykgQEdDT1ZfQ0ZMQUdTQAogQU1fQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvbGliL2NfZ2xpYi9zcmMgLUlnZW4tY19nbGliCi1BTV9MREZMQUdTID0gJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSBAR0NPVl9MREZMQUdTQAotCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorQU1fTERGTEFHUyA9ICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykgJChPUEVOU1NMX0xERkxBR1MpICQoT1BFTlNTTF9MSUJTKSBAR0NPVl9MREZMQUdTQAogCiBub2luc3RfTFRMSUJSQVJJRVMgPSBcCiAJbGlidHV0b3JpYWxnZW5jZ2xpYi5sYQpAQCAtNTUsNiArNTMsNyBAQAogCiB0dXRvcmlhbF9zZXJ2ZXJfU09VUkNFUyA9IFwKIAljX2dsaWJfc2VydmVyLmMKK3R1dG9yaWFsX3NlcnZlcl9MREZMQUdTID0gJChPUEVOU1NMX0xJQlMpCiAKIHR1dG9yaWFsX3NlcnZlcl9MREFERCA9IFwKIAlsaWJ0dXRvcmlhbGdlbmNnbGliLmxhIFwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvY2wvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmIyMDEzYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzZXR1cC1sb2NhbC1saXNwLWVudjogZW5zdXJlLWV4dGVybmFscy5zaAorCWJhc2ggZW5zdXJlLWV4dGVybmFscy5zaAorCitnZW4tY2w6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNsIC1yICQ8CisKK0FMTF9GSUxFX1BSRVJFUVMgPSBcCisJCSAgIGxvYWQtbG9jYWxseS5saXNwIFwKKwkJICAgbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcCBcCisJCSAgIG1ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AgXAorCQkgICBzaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcCBcCisJCSAgIHRocmlmdC10dXRvcmlhbC5hc2QgXAorCQkgICB0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwCisKKyMgTk9URTogdGhlIHNlcnZlciBhbmQgY2xpZW50IGNhbm5vdCBiZSBidWlsdCBpbiBwYXJhbGxlbAorIyBiZWNhdXNlIG9uIGxvYWRpbmcgdGhlIG1ha2UtdHV0b3JpYWwtKiBzY3JpcHRzIFNCQ0wgd2lsbAorIyBhdHRlbXB0IHRvIGNvbXBpbGUgdGhlaXIgZGVwZW5kZW5jaWVzLiBVbmZvcnR1bmF0ZWx5LAorIyBiZWNhdXNlIHRoZWlyIGRlcGVuZGVuY2llcyBhcmUgc2hhcmVkLCBwYXJhbGxlbCBqb2JzIGNhbgorIyBlbmQgdXAgb3ZlcndyaXRpbmcgb3IgY29ycnVwdGluZyB0aGUgY29tcGlsZWQgZmlsZXMKK2FsbC1sb2NhbDogZ2VuLWNsIHNldHVwLWxvY2FsLWxpc3AtZW52ICQoQUxMX0ZJTEVfUFJFUkVRUykKKwkkKFNCQ0wpIC0tc2NyaXB0IG1ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AKKwkkKFNCQ0wpIC0tc2NyaXB0IG1ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCS4vVHV0b3JpYWxTZXJ2ZXIKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCS4vVHV0b3JpYWxDbGllbnQKKworY2xlYW4tbG9jYWw6CisJLSQoUk0pIC1yIGdlbi0qCisJLSQoUk0pIC1yIGV4dGVybmFscworCS0kKFJNKSAtciBxdWlja2xpc3AKKwktJChSTSkgLXIgbGliCisJLSQoUk0pIHF1aWNrbGlzcC5saXNwCisJLSQoUk0pIGJhY2twb3J0LXVwZGF0ZS56aXAKKwktJChSTSkgc2hhcmVkLWltcGxlbWVudGF0aW9uLmZhc2wKKwktJChSTSkgdHV0b3JpYWwtaW1wbGVtZW50YXRpb24uZmFzbAorCS0kKFJNKSBUdXRvcmlhbFNlcnZlcgorCS0kKFJNKSBUdXRvcmlhbENsaWVudAorCitFWFRSQV9ESVNUID0gXAorCXR1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AgXAorCXNoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwIFwKKwl0aHJpZnQtdHV0b3JpYWwuYXNkIFwKKwltYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwIFwKKwltYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoIGIvdHV0b3JpYWwvY2wvZW5zdXJlLWV4dGVybmFscy5zaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41YWU4YzU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvZW5zdXJlLWV4dGVybmFscy5zaApAQCAtMCwwICsxIEBACisuLi8uLi9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL2xvYWQtbG9jYWxseS5saXNwIGIvdHV0b3JpYWwvY2wvbG9hZC1sb2NhbGx5Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyYTBhMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL2xvYWQtbG9jYWxseS5saXNwCkBAIC0wLDAgKzEsMjIgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7Ozs7IEp1c3QgYSBzY3JpcHQgZm9yIGxvYWRpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLCB1c2luZyBidW5kbGVkIGRlcGVuZGVuY2llcy4KKzs7OzsgVGhpcyBpcyBhbiBpZGVudGljYWwgY29weSBvZiB0aGUgZmlsZSBpbiBsaWIvY2wuCisKKyhyZXF1aXJlICJhc2RmIikKKworKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiZXh0ZXJuYWxzL2J1bmRsZS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAibGliL2RlLnNldGYudGhyaWZ0LWJhY2twb3J0LXVwZGF0ZS90aHJpZnQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AgYi90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNmQ4NjEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwCkBAIC0wLDAgKzEsNTEgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJsb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC9zaGFyZWQvdGhyaWZ0LWdlbi1zaGFyZWQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL3R1dG9yaWFsL3RocmlmdC1nZW4tdHV0b3JpYWwuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAidGhyaWZ0LXR1dG9yaWFsLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtdHV0b3JpYWwpCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoZGVmdW4gbWFpbiAoKQorICAiRW50cnkgcG9pbnQgZm9yIHRoZSBiaW5hcnkuIgorICAodGhyaWZ0OndpdGgtY2xpZW50IChwcm90ICN1InRocmlmdDovLzEyNy4wLjAuMTo5MDkwIikKKyAgICAodHV0b3JpYWwuY2FsY3VsYXRvcjpwaW5nIHByb3QpCisgICAgKGZvcm1hdCB0ICJwaW5nKCl+JSIpCisgICAgKGZvcm1hdCB0ICIxICsgMSA9IH5hfiUiICh0dXRvcmlhbC5jYWxjdWxhdG9yOmFkZCBwcm90IDEgMSkpCisgICAgKGxldCAoKHdvcmstaW5zdGFuY2UgKHR1dG9yaWFsOm1ha2Utd29yayA6bnVtMSA1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bnVtMiAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6b3AgdHV0b3JpYWw6b3BlcmF0aW9uLmRpdmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNvbW1lbnQgIkJvb3lhISIpKSkKKyAgICAgIChoYW5kbGVyLWNhc2UgKGZvcm1hdCB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUgLyAwID0gfmEgLSBPaCwgcmVhbGx5PyBBbiBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gaGVyZS5+JSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdCAxIHdvcmstaW5zdGFuY2UpKQorICAgICAgICAodHV0b3JpYWw6aW52YWxpZG9wZXJhdGlvbiAoZSkKKyAgICAgICAgICAoZm9ybWF0IHQgIi0tLX4lKEV4cGVjdGVkKSBJbnZhbGlkIE9wZXJhdGlvbiBjYXVnaHQ6IH4lfmF+JS0tLX4lIiBlKSkpKQorICAgIChsZXQgKCh3b3JrLWluc3RhbmNlICh0dXRvcmlhbDptYWtlLXdvcmsgOm51bTEgMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpudW0yIDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6b3AgdHV0b3JpYWw6b3BlcmF0aW9uLnN1YnRyYWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y29tbWVudCAiUGxheWluZyBuaWNlIHRoaXMgdGltZS4iKSkpCisgICAgICAoaGFuZGxlci1jYXNlIChmb3JtYXQgdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxNSAtIDEwID0gfmF+JSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdCAxIHdvcmstaW5zdGFuY2UpKQorICAgICAgICAodHV0b3JpYWw6aW52YWxpZG9wZXJhdGlvbiAoZSkKKyAgICAgICAgICAoZm9ybWF0IHQgIi0tLX4lKFVuZXhwZWN0ZWQpIEludmFsaWQgT3BlcmF0aW9uIGNhdWdodDogfiV+YX4lLS0tfiUiIGUpKSkpCisgICAgKGZvcm1hdCB0ICJDaGVjayBsb2c6IH5hfiUiIChzaGFyZWQuc2hhcmVkLXNlcnZpY2U6Z2V0LXN0cnVjdCBwcm90IDEpKSkpCisKKyhjbG9uOmR1bXAgIlR1dG9yaWFsQ2xpZW50IiBtYWluKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcCBiL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmMWE5MAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AKQEAgLTAsMCArMSwyOSBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhyZXF1aXJlICJhc2RmIikKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgImxvYWQtbG9jYWxseS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL3NoYXJlZC90aHJpZnQtZ2VuLXNoYXJlZC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvdHV0b3JpYWwvdGhyaWZ0LWdlbi10dXRvcmlhbC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJ0aHJpZnQtdHV0b3JpYWwuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC10dXRvcmlhbCkKKworKG5ldC5kaWRpZXJ2ZXJuYS5jbG9uOm5pY2tuYW1lLXBhY2thZ2UpCisKKyhkZWZ1biBtYWluICgpCisgICJFbnRyeSBwb2ludCBmb3IgdGhlIGJpbmFyeS4iCisgICh0aHJpZnQ6c2VydmUgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTAiIHR1dG9yaWFsOmNhbGN1bGF0b3IpKQorCisoY2xvbjpkdW1wICJUdXRvcmlhbFNlcnZlciIgbWFpbikKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwIGIvdHV0b3JpYWwvY2wvc2hhcmVkLWltcGxlbWVudGF0aW9uLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5NzYyNgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwCkBAIC0wLDAgKzEsMjUgQEAKKyhpbi1wYWNrYWdlICM6c2hhcmVkLWltcGxlbWVudGF0aW9uKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhkZWZ2YXIgKnN0cnVjdHMqIChtYWtlLWhhc2gtdGFibGUpKQorCisoZGVmdW4gc2hhcmVkLnNoYXJlZC1zZXJ2aWNlLWltcGxlbWVudGF0aW9uOmdldC1zdHJ1Y3QgKGtleSkKKyAgKGZvcm1hdCB0ICJnZXRTdHJ1Y3QofmEpfiUiIGtleSkKKyAgKGdldGhhc2gga2V5ICpzdHJ1Y3RzKikpCisKKyhkZWZ1biBhZGQtbG9nIChrZXkgdmFsdWUpCisgIChzZXRmIChnZXRoYXNoIGtleSAqc3RydWN0cyopCisgICAgICAgIChtYWtlLWluc3RhbmNlICdzaGFyZWQ6c2hhcmVkc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgIDprZXkga2V5CisgICAgICAgICAgICAgICAgICAgICAgIDp2YWx1ZSAod3JpdGUtdG8tc3RyaW5nIHZhbHVlKSkpKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvdGhyaWZ0LXR1dG9yaWFsLmFzZCBiL3R1dG9yaWFsL2NsL3RocmlmdC10dXRvcmlhbC5hc2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwMzUzNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL3RocmlmdC10dXRvcmlhbC5hc2QKQEAgLTAsMCArMSwxNyBAQAorOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoYXNkZjpkZWZzeXN0ZW0gIzp0aHJpZnQtdHV0b3JpYWwKKyAgOmRlcGVuZHMtb24gKCM6dGhyaWZ0LWdlbi10dXRvcmlhbCkKKyAgOnNlcmlhbCB0CisgIDpjb21wb25lbnRzICgoOmZpbGUgInNoYXJlZC1pbXBsZW1lbnRhdGlvbiIpCisgICAgICAgICAgICAgICAoOmZpbGUgInR1dG9yaWFsLWltcGxlbWVudGF0aW9uIikpKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvdHV0b3JpYWwtaW1wbGVtZW50YXRpb24ubGlzcCBiL3R1dG9yaWFsL2NsL3R1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5MmZlNAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL3R1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AKQEAgLTAsMCArMSw0MSBAQAorKGluLXBhY2thZ2UgIzp0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjpwaW5nICgpCisgIChmb3JtYXQgdCAicGluZygpfiUiKSkKKworKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246YWRkIChudW0xIG51bTIpCisgIChmb3JtYXQgdCAiYWRkKH5hLCB+YSl+JSIgbnVtMSBudW0yKQorICAoKyBudW0xIG51bTIpKQorCisoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjpjYWxjdWxhdGUgKGxvZ2lkIHdvcmspCisgIChmb3JtYXQgdCAiY2FsY3VsYXRlKH5hLCB+YSl+JSIgbG9naWQgd29yaykKKyAgKGhhbmRsZXItY2FzZQorICAgICAgKGxldCogKChudW0xICh0dXRvcmlhbDp3b3JrLW51bTEgd29yaykpCisgICAgICAgICAgICAgKG51bTIgKHR1dG9yaWFsOndvcmstbnVtMiB3b3JrKSkKKyAgICAgICAgICAgICAob3AgKHR1dG9yaWFsOndvcmstb3Agd29yaykpCisgICAgICAgICAgICAgKHJlc3VsdAorICAgICAgICAgICAgICAoY29uZAorICAgICAgICAgICAgICAgICgoPSBvcCB0dXRvcmlhbDpvcGVyYXRpb24uYWRkKSAoKyBudW0xIG51bTIpKQorICAgICAgICAgICAgICAgICgoPSBvcCB0dXRvcmlhbDpvcGVyYXRpb24uc3VidHJhY3QpICgtIG51bTEgbnVtMikpCisgICAgICAgICAgICAgICAgKCg9IG9wIHR1dG9yaWFsOm9wZXJhdGlvbi5tdWx0aXBseSkgKCogbnVtMSBudW0yKSkKKyAgICAgICAgICAgICAgICAoKD0gb3AgdHV0b3JpYWw6b3BlcmF0aW9uLmRpdmlkZSkgKC8gbnVtMSBudW0yKSkpKSkKKyAgICAgICAgKHNoYXJlZC1pbXBsZW1lbnRhdGlvbjo6YWRkLWxvZyBsb2dpZCByZXN1bHQpCisgICAgICAgIHJlc3VsdCkKKyAgICAoZGl2aXNpb24tYnktemVybyAoKSAoZXJyb3IgJ3R1dG9yaWFsOmludmFsaWRvcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndoeSAiRGl2aXNpb24gYnkgemVyby4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3aGF0LW9wICh0dXRvcmlhbDp3b3JrLW9wIHdvcmspKSkpKQorCisoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjp6aXAgKCkKKyAgKGZvcm1hdCB0ICJ6aXAoKX4lIikpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvQ01ha2VMaXN0cy50eHQgYi90dXRvcmlhbC9jcHAvQ01ha2VMaXN0cy50eHQKaW5kZXggMmIwYzE0My4uYzZkOGZjMyAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3BwL0NNYWtlTGlzdHMudHh0CisrKyBiL3R1dG9yaWFsL2NwcC9DTWFrZUxpc3RzLnR4dApAQCAtMTcsOCArMTcsOCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZmluZF9wYWNrYWdlKEJvb3N0IDEuNTMuMCBSRVFVSVJFRCkKLWluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke0Jvb3N0X0lOQ0xVREVfRElSU30iKQoraW5jbHVkZShCb29zdE1hY3JvcykKK1JFUVVJUkVfQk9PU1RfSEVBREVSUygpCiAKICNNYWtlIHN1cmUgZ2VuLWNwcCBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCkBAIC0yNyw3ICsyNyw3IEBACiAKIGluY2x1ZGUoVGhyaWZ0TWFjcm9zKQogCi1zZXQodHV0b3JpYWxnZW5jcHBfU09VUkNFUyAKK3NldCh0dXRvcmlhbGdlbmNwcF9TT1VSQ0VTCiAgICAgZ2VuLWNwcC9DYWxjdWxhdG9yLmNwcAogICAgIGdlbi1jcHAvU2hhcmVkU2VydmljZS5jcHAKICAgICBnZW4tY3BwL3NoYXJlZF9jb25zdGFudHMuY3BwCkBAIC0zOSwxMyArMzksMTkgQEAKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0dXRvcmlhbGdlbmNwcCB0aHJpZnQpCiAKIGFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9DYWxjdWxhdG9yLmNwcCBnZW4tY3BwL1NoYXJlZFNlcnZpY2UuY3BwIGdlbi1jcHAvc2hhcmVkX2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9zaGFyZWRfdHlwZXMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3R1dG9yaWFsX3R5cGVzLmNwcAotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGNwcCAtciAke1BST0pFQ1RfU09VUkNFX0RJUn0vdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwIC1yICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKICkKIAogYWRkX2V4ZWN1dGFibGUoVHV0b3JpYWxTZXJ2ZXIgQ3BwU2VydmVyLmNwcCkKIHRhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbFNlcnZlciB0dXRvcmlhbGdlbmNwcCkKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUdXRvcmlhbFNlcnZlciB0aHJpZnQpCitpZiAoWkxJQl9GT1VORCkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsU2VydmVyICR7WkxJQl9MSUJSQVJJRVN9KQorZW5kaWYgKCkKIAogYWRkX2V4ZWN1dGFibGUoVHV0b3JpYWxDbGllbnQgQ3BwQ2xpZW50LmNwcCkKIHRhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbENsaWVudCB0dXRvcmlhbGdlbmNwcCkKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUdXRvcmlhbENsaWVudCB0aHJpZnQpCitpZiAoWkxJQl9GT1VORCkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsQ2xpZW50ICR7WkxJQl9MSUJSQVJJRVN9KQorZW5kaWYgKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NwcC9DcHBDbGllbnQuY3BwIGIvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKaW5kZXggMjc2M2ZlZS4uNTIwODQxMSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKKysrIGIvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKQEAgLTM0LDkgKzM0LDkgQEAKIHVzaW5nIG5hbWVzcGFjZSBzaGFyZWQ7CiAKIGludCBtYWluKCkgewotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzb2NrZXQobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CiAgIENhbGN1bGF0b3JDbGllbnQgY2xpZW50KHByb3RvY29sKTsKIAogICB0cnkgewpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL0NwcFNlcnZlci5jcHAgYi90dXRvcmlhbC9jcHAvQ3BwU2VydmVyLmNwcAppbmRleCBlYWZmZmE5Li42MzVhZmVmIDEwMDY0NAotLS0gYS90dXRvcmlhbC9jcHAvQ3BwU2VydmVyLmNwcAorKysgYi90dXRvcmlhbC9jcHAvQ3BwU2VydmVyLmNwcApAQCAtMTgsNyArMTgsNyBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CkBAIC0yOCw4ICsyOCw2IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CiAKLSNpbmNsdWRlIDxib29zdC9tYWtlX3NoYXJlZC5ocHA+Ci0KICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAjaW5jbHVkZSA8c3N0cmVhbT4KQEAgLTQ4LDE2ICs0NiwxNiBAQAogCiBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciA6IHB1YmxpYyBDYWxjdWxhdG9ySWYgewogcHVibGljOgotICBDYWxjdWxhdG9ySGFuZGxlcigpIHt9CisgIENhbGN1bGF0b3JIYW5kbGVyKCkgPSBkZWZhdWx0OwogCi0gIHZvaWQgcGluZygpIHsgY291dCA8PCAicGluZygpIiA8PCBlbmRsOyB9CisgIHZvaWQgcGluZygpIG92ZXJyaWRlIHsgY291dCA8PCAicGluZygpIiA8PCBlbmRsOyB9CiAKLSAgaW50MzJfdCBhZGQoY29uc3QgaW50MzJfdCBuMSwgY29uc3QgaW50MzJfdCBuMikgeworICBpbnQzMl90IGFkZChjb25zdCBpbnQzMl90IG4xLCBjb25zdCBpbnQzMl90IG4yKSBvdmVycmlkZSB7CiAgICAgY291dCA8PCAiYWRkKCIgPDwgbjEgPDwgIiwgIiA8PCBuMiA8PCAiKSIgPDwgZW5kbDsKICAgICByZXR1cm4gbjEgKyBuMjsKICAgfQogCi0gIGludDMyX3QgY2FsY3VsYXRlKGNvbnN0IGludDMyX3QgbG9naWQsIGNvbnN0IFdvcmsmIHdvcmspIHsKKyAgaW50MzJfdCBjYWxjdWxhdGUoY29uc3QgaW50MzJfdCBsb2dpZCwgY29uc3QgV29yayYgd29yaykgb3ZlcnJpZGUgewogICAgIGNvdXQgPDwgImNhbGN1bGF0ZSgiIDw8IGxvZ2lkIDw8ICIsICIgPDwgd29yayA8PCAiKSIgPDwgZW5kbDsKICAgICBpbnQzMl90IHZhbDsKIApAQCAtOTYsMTIgKzk0LDEyIEBACiAgICAgcmV0dXJuIHZhbDsKICAgfQogCi0gIHZvaWQgZ2V0U3RydWN0KFNoYXJlZFN0cnVjdCYgcmV0LCBjb25zdCBpbnQzMl90IGxvZ2lkKSB7CisgIHZvaWQgZ2V0U3RydWN0KFNoYXJlZFN0cnVjdCYgcmV0LCBjb25zdCBpbnQzMl90IGxvZ2lkKSBvdmVycmlkZSB7CiAgICAgY291dCA8PCAiZ2V0U3RydWN0KCIgPDwgbG9naWQgPDwgIikiIDw8IGVuZGw7CiAgICAgcmV0ID0gbG9nW2xvZ2lkXTsKICAgfQogCi0gIHZvaWQgemlwKCkgeyBjb3V0IDw8ICJ6aXAoKSIgPDwgZW5kbDsgfQorICB2b2lkIHppcCgpIG92ZXJyaWRlIHsgY291dCA8PCAiemlwKCkiIDw8IGVuZGw7IH0KIAogcHJvdGVjdGVkOgogICBtYXA8aW50MzJfdCwgU2hhcmVkU3RydWN0PiBsb2c7CkBAIC0xMTUsMTAgKzExMywxMCBAQAogKi8KIGNsYXNzIENhbGN1bGF0b3JDbG9uZUZhY3RvcnkgOiB2aXJ0dWFsIHB1YmxpYyBDYWxjdWxhdG9ySWZGYWN0b3J5IHsKICBwdWJsaWM6Ci0gIHZpcnR1YWwgfkNhbGN1bGF0b3JDbG9uZUZhY3RvcnkoKSB7fQotICB2aXJ0dWFsIENhbGN1bGF0b3JJZiogZ2V0SGFuZGxlcihjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKQorICB+Q2FsY3VsYXRvckNsb25lRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKyAgQ2FsY3VsYXRvcklmKiBnZXRIYW5kbGVyKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pIG92ZXJyaWRlCiAgIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRTb2NrZXQ+KGNvbm5JbmZvLnRyYW5zcG9ydCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2sgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRTb2NrZXQ+KGNvbm5JbmZvLnRyYW5zcG9ydCk7CiAgICAgY291dCA8PCAiSW5jb21pbmcgY29ubmVjdGlvblxuIjsKICAgICBjb3V0IDw8ICJcdFNvY2tldEluZm86ICIgIDw8IHNvY2stPmdldFNvY2tldEluZm8oKSA8PCAiXG4iOwogICAgIGNvdXQgPDwgIlx0UGVlckhvc3Q6ICIgICAgPDwgc29jay0+Z2V0UGVlckhvc3QoKSA8PCAiXG4iOwpAQCAtMTI2LDI1ICsxMjQsMjUgQEAKICAgICBjb3V0IDw8ICJcdFBlZXJQb3J0OiAiICAgIDw8IHNvY2stPmdldFBlZXJQb3J0KCkgPDwgIlxuIjsKICAgICByZXR1cm4gbmV3IENhbGN1bGF0b3JIYW5kbGVyOwogICB9Ci0gIHZpcnR1YWwgdm9pZCByZWxlYXNlSGFuZGxlciggOjpzaGFyZWQ6OlNoYXJlZFNlcnZpY2VJZiogaGFuZGxlcikgeworICB2b2lkIHJlbGVhc2VIYW5kbGVyKCA6OnNoYXJlZDo6U2hhcmVkU2VydmljZUlmKiBoYW5kbGVyKSBvdmVycmlkZSB7CiAgICAgZGVsZXRlIGhhbmRsZXI7CiAgIH0KIH07CiAKIGludCBtYWluKCkgewogICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yRmFjdG9yeT4oYm9vc3Q6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JDbG9uZUZhY3Rvcnk+KCkpLAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwgLy9wb3J0Ci0gICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCi0gICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpOworICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3NvckZhY3Rvcnk+KHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckNsb25lRmFjdG9yeT4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwgLy9wb3J0CisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CiAKICAgLyoKICAgLy8gaWYgeW91IGRvbid0IG5lZWQgcGVyLWNvbm5lY3Rpb24gc3RhdGUsIGRvIHRoZSBmb2xsb3dpbmcgaW5zdGVhZAogICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yPihib29zdDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckhhbmRsZXI+KCkpLAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwgLy9wb3J0Ci0gICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCi0gICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpOworICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3Nvcj4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9ySGFuZGxlcj4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwgLy9wb3J0CisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CiAgICovCiAKICAgLyoqCkBAIC0xNTIsMjUgKzE1MCwyNSBAQAogCiAgIC8vIFRoaXMgc2VydmVyIG9ubHkgYWxsb3dzIG9uZSBjb25uZWN0aW9uIGF0IGEgdGltZSwgYnV0IHNwYXducyBubyB0aHJlYWRzCiAgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyKAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yPihib29zdDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckhhbmRsZXI+KCkpLAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKSwKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CisgICAgc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yPihzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JIYW5kbGVyPigpKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDkwOTApLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpOwogCiAgIGNvbnN0IGludCB3b3JrZXJDb3VudCA9IDQ7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0KICAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSgKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PigpKTsKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRocmVhZEZhY3Rvcnk+KCkpOwogICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwogCiAgIC8vIFRoaXMgc2VydmVyIGFsbG93cyAid29ya2VyQ291bnQiIGNvbm5lY3Rpb24gYXQgYSB0aW1lLCBhbmQgcmV1c2VzIHRocmVhZHMKICAgVFRocmVhZFBvb2xTZXJ2ZXIgc2VydmVyKAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yRmFjdG9yeT4oYm9vc3Q6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JDbG9uZUZhY3Rvcnk+KCkpLAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKSwKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JQcm9jZXNzb3JGYWN0b3J5PihzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JDbG9uZUZhY3Rvcnk+KCkpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oOTA5MCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSwKICAgICB0aHJlYWRNYW5hZ2VyKTsKICAgKi8KIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvY3BwL01ha2VmaWxlLmFtCmluZGV4IGQ4YTlkYmMuLjQ5Y2YzYmUgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL2NwcC9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9jcHAvTWFrZWZpbGUuYW0KQEAgLTYxLDggKzYxLDYgQEAKICMKICMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKICMKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGdlbi1jcHAvQ2FsY3VsYXRvci5jcHAgZ2VuLWNwcC9TaGFyZWRTZXJ2aWNlLmNwcCBnZW4tY3BwL3NoYXJlZF9jb25zdGFudHMuY3BwIGdlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcCBnZW4tY3BwL3R1dG9yaWFsX2NvbnN0YW50cy5jcHAgZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHA6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGNwcCAtciAkPAogCkBAIC03MSw3ICs2OSw3IEBACiBBTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKSAkKExJQkVWRU5UX0xERkxBR1MpCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1jcHAKKwkkKFJNKSBnZW4tY3BwLyoKIAogdHV0b3JpYWxzZXJ2ZXI6IGFsbAogCS4vVHV0b3JpYWxTZXJ2ZXIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IDcyYWU2MTYuLmJhZTVlNzAgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMjcsOSArMjcsOSBAQAogW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDc2hhcnBDbGllbnQiKV0KIFthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiQ3NoYXJwQ2xpZW50IildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCiAKQEAgLTUxLDUgKzUxLDUgQEAKIC8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCiAvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgogLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMC4xMy4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC4xMy4wLjAiKV0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IDI4YTY5ZDIuLmUzZWQzOWEgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMjcsOSArMjcsOSBAQAogW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDc2hhcnBTZXJ2ZXIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiQ3NoYXJwU2VydmVyIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCiAKQEAgLTUxLDUgKzUxLDUgQEAKIC8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCiAvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgogLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMC4xMy4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC4xMy4wLjAiKV0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2QvTWFrZWZpbGUgYi90dXRvcmlhbC9kL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2VlOWFmLi4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL2QvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTElCX0RfRElSID0gLi4vLi4vbGliL2QKLQotR0VOX1NSQyA9IC4uL2dlbi1kL3NoYXJlL1NoYXJlZFNlcnZpY2UuZCAuLi9nZW4tZC9zaGFyZS9zaGFyZWRfdHlwZXMuZCBcCi0JLi4vZ2VuLWQvdHV0b3JpYWwvdHV0b3JpYWxfdHlwZXMuZCAuLi9nZW4tZC90dXRvcmlhbC9DYWxjdWxhdG9yLmQKLQotZGVmYXVsdDogc2VydmVyIGNsaWVudCBhc3luY19jbGllbnQKLQotc2VydmVyOiBzZXJ2ZXIuZAotCWRtZCAtSSR7TElCX0RfRElSfS9zcmMgLUwtTCR7TElCX0RfRElSfSAtTC1sdGhyaWZ0ZCBzZXJ2ZXIuZCAke0dFTl9TUkN9Ci0KLWNsaWVudDogY2xpZW50LmQKLQlkbWQgLUkke0xJQl9EX0RJUn0vc3JjIC1MLUwke0xJQl9EX0RJUn0gLUwtbHRocmlmdGQgY2xpZW50LmQgJHtHRU5fU1JDfQotCi1hc3luY19jbGllbnQ6IGFzeW5jX2NsaWVudC5kCi0JZG1kIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkLWV2ZW50IC1MLWx0aHJpZnRkIC1MLWxldmVudCBhc3luY19jbGllbnQuZCAke0dFTl9TUkN9Ci0KLWNsZWFuOgotCSQoUk0pIC1mIHNlcnZlciBjbGllbnQgYXN5bmNfY2xpZW50CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvZC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTgyOTRjCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTElCX0RfRElSID0gJCh0b3Bfc3JjZGlyKS9saWIvZAorCitHRU5fU1JDID0gZ2VuLWQvc2hhcmUvU2hhcmVkU2VydmljZS5kIGdlbi1kL3NoYXJlL3NoYXJlZF90eXBlcy5kIFwKKwlnZW4tZC90dXRvcmlhbC90dXRvcmlhbF90eXBlcy5kIGdlbi1kL3R1dG9yaWFsL0NhbGN1bGF0b3IuZAorCiskKEdFTl9TUkMpOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGQgLXIgJDwKKworc2VydmVyOiBzZXJ2ZXIuZCAkKEdFTl9TUkMpCisJJChETUQpIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkIHNlcnZlci5kICR7R0VOX1NSQ30KKworY2xpZW50OiBjbGllbnQuZCAkKEdFTl9TUkMpCisJJChETUQpIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkIGNsaWVudC5kICR7R0VOX1NSQ30KKworUFJPR1MgPSBzZXJ2ZXIgY2xpZW50CisKK2lmIFdJVEhfRF9FVkVOVF9URVNUUworYXN5bmNfY2xpZW50OiBhc3luY19jbGllbnQuZCAkKEdFTl9TUkMpCisJJChETUQpIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkLWV2ZW50IC1MLWx0aHJpZnRkIC1MLWxldmVudCBhc3luY19jbGllbnQuZCAke0dFTl9TUkN9CisKK1BST0dTICs9IGFzeW5jX2NsaWVudAorZW5kaWYKKworYWxsLWxvY2FsOiAkKFBST0dTKQorCitjbGVhbjoKKwkkKFJNKSAtZiAkKFBST0dTKQorCSQoUk0pIC1yIGdlbi1kLworCWZpbmQgLiAtdHlwZSBmIC1uYW1lICcqLm8nIHwgeGFyZ3Mgcm0gLWYKKworZGlzdC1ob29rOgorCSQoUk0pIC1mICQoZGlzdGRpcikvJChQUk9HUykKKwkkKFJNKSAtciAkKGRpc3RkaXIpL2dlbi1kLworCWZpbmQgJChkZXN0ZGlyKSAtdHlwZSBmIC1uYW1lICcqLm8nIHwgeGFyZ3Mgcm0gLWYKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9kYXJ0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOTNhYzgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitCVUlMVF9TT1VSQ0VTID0gZ2VuLWRhcnQvdHV0b3JpYWwvbGliL3R1dG9yaWFsLmRhcnQgZ2VuLWRhcnQvc2hhcmVkL2xpYi9zaGFyZWQuZGFydAorCitnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydCBnZW4tZGFydC9zaGFyZWQvbGliL3NoYXJlZC5kYXJ0OiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBkYXJ0IC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLWRhcnQvdHV0b3JpYWwvbGliL3R1dG9yaWFsLmRhcnQgcHViLWdldAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tKi8KKwlmaW5kIC4gLXR5cGUgZCAtbmFtZSAiLmRhcnRfdG9vbCIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgLiAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICIucGFja2FnZXMiIHwgeGFyZ3MgJChSTSkKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAicHVic3BlYy5sb2NrIiB8IHhhcmdzICQoUk0pCisKK2Rpc3QtaG9vazoKKwkkKFJNKSAtciAkKGRpc3RkaXIpL2dlbi0qLworCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIC1uYW1lICIuZGFydF90b29sIiB8IHhhcmdzICQoUk0pIC1yCisJZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgLW5hbWUgInBhY2thZ2VzIiB8IHhhcmdzICQoUk0pIC1yCisJZmluZCAkKGRpc3RkaXIpIC10eXBlIGYgLW5hbWUgIi5wYWNrYWdlcyIgfCB4YXJncyAkKFJNKQorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBmIC1uYW1lICJwdWJzcGVjLmxvY2siIHwgeGFyZ3MgJChSTSkKKworcHViLWdldDogcHViLWdldC1nZW4gcHViLWdldC1jbGllbnQgcHViLWdldC1jb25zb2xlLWNsaWVudCBwdWItZ2V0LXNlcnZlcgorCitwdWItZ2V0LWdlbjogcHViLWdldC10dXRvcmlhbCBwdWItZ2V0LXNoYXJlZAorCitwdWItZ2V0LXR1dG9yaWFsOiBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydAorCWNkIGdlbi1kYXJ0L3R1dG9yaWFsOyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LXNoYXJlZDogZ2VuLWRhcnQvc2hhcmVkL2xpYi9zaGFyZWQuZGFydAorCWNkIGdlbi1kYXJ0L3NoYXJlZDsgJHtEQVJUUFVCfSBnZXQKKworcHViLWdldC1jbGllbnQ6CisJY2QgY2xpZW50OyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LWNvbnNvbGUtY2xpZW50OgorCWNkIGNvbnNvbGVfY2xpZW50OyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LXNlcnZlcjoKKwljZCBzZXJ2ZXI7ICR7REFSVFBVQn0gZ2V0CisKK3R1dG9yaWFsc2VydmVyOiBwdWItZ2V0LWdlbiBwdWItZ2V0LXNlcnZlcgorCSR7REFSVH0gc2VydmVyL2Jpbi9tYWluLmRhcnQKKwordHV0b3JpYWxjbGllbnQ6IHB1Yi1nZXQtZ2VuIHB1Yi1nZXQtY2xpZW50CisJY2QgY2xpZW50OyAke0RBUlRQVUJ9IHNlcnZlCisKK3R1dG9yaWFsY29uc29sZWNsaWVudDogcHViLWdldC1jb25zb2xlLWNsaWVudAorCSR7REFSVH0gY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydAorCitFWFRSQV9ESVNUID0gXAorCWNsaWVudC93ZWIvY2xpZW50LmRhcnQgXAorCWNsaWVudC93ZWIvaW5kZXguaHRtbCBcCisJY2xpZW50L3dlYi9zdHlsZXMuY3NzIFwKKwljbGllbnQvcHVic3BlYy55YW1sIFwKKwljb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0IFwKKwljb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwgXAorCXNlcnZlci9iaW4vbWFpbi5kYXJ0IFwKKwlzZXJ2ZXIvcHVic3BlYy55YW1sIFwKKwljb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucyBcCisJY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIFwKKwlzZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMgXAorCWJ1aWxkLnNoCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2J1aWxkLnNoIGIvdHV0b3JpYWwvZGFydC9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJlMDRhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9idWlsZC5zaApAQCAtMCwwICsxLDU2IEBACisjIS9iaW4vc2gKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzZXQgLWU7CitybSAtciBnZW4tZGFydCB8fCB0cnVlOworCit0aHJpZnQgLS1nZW4gZGFydCAuLi9zaGFyZWQudGhyaWZ0OworY2QgZ2VuLWRhcnQvc2hhcmVkOworcHViIGdldDsKK2NkIC4uLy4uOworCit0aHJpZnQgLS1nZW4gZGFydCAuLi90dXRvcmlhbC50aHJpZnQ7CitjZCBnZW4tZGFydC90dXRvcmlhbDsKK3B1YiBnZXQ7CitjZCAuLi8uLjsKKworY2QgY2xpZW50OworcHViIGdldDsKK2NkIC4uOworCitjZCBjb25zb2xlX2NsaWVudDsKK3B1YiBnZXQ7CitjZCAuLjsKKworY2Qgc2VydmVyOworcHViIGdldDsKK2NkIC4uOworCitkYXJ0Zm10IC13IGdlbi1kYXJ0OworCitlY2hvICJcbkVuam95IHRoZSBEYXJ0IHR1dG9yaWFsISI7CitlY2hvICJcblRvIHJ1biB0aGUgc2VydmVyOiI7CitlY2hvICI+IGRhcnQgc2VydmVyL2Jpbi9tYWluLmRhcnQiOworZWNobyAiXG5UbyBydW4gdGhlIGNsaWVudDoiOworZWNobyAiIyBTZXJ2ZSB0aGUgYXBwIGZyb20gdGhlIGNsaWVudCBkaXJlY3RvcnkgYW5kIHZpZXcgaW4gYSBicm93c2VyIjsKK2VjaG8gIj4gY2QgY2xpZW50OyI7CitlY2hvICI+IHB1YiBzZXJ2ZTsiOworZWNobyAiXG5UbyBydW4gdGhlIGNvbnNvbGUgY2xpZW50OiI7CitlY2hvICI+IGRhcnQgY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydCI7CitlY2hvICIiOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbCBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTgxYjRkCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sCkBAIC0wLDAgKzEsMzMgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZTogdHV0b3JpYWxfY2xpZW50Cit2ZXJzaW9uOiAwLjEzLjAKK2Rlc2NyaXB0aW9uOiBBIERhcnQgY2xpZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBBcGFjaGUgVGhyaWZ0IHR1dG9yaWFsCithdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgoraG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDMuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIHNoYXJlZDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC9zaGFyZWQKKyAgdGhyaWZ0OgorICAgIHBhdGg6IC4uLy4uLy4uL2xpYi9kYXJ0CisgIHR1dG9yaWFsOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3R1dG9yaWFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvY2xpZW50LmRhcnQgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvY2xpZW50LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwMmQwZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9jbGllbnQuZGFydApAQCAtMCwwICsxLDI3OCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCAnZGFydDpodG1sJzsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdF9icm93c2VyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnNoYXJlZC9zaGFyZWQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dHV0b3JpYWwvdHV0b3JpYWwuZGFydCc7CisKKy8vLyBBZGFwdGVkIGZyb20gdGhlIEFTMyB0dXRvcmlhbAordm9pZCBtYWluKCkgeworICBuZXcgQ2FsY3VsYXRvclVJKHF1ZXJ5U2VsZWN0b3IoJyNvdXRwdXQnKSkuc3RhcnQoKTsKK30KKworY2xhc3MgQ2FsY3VsYXRvclVJIHsKKyAgZmluYWwgRGl2RWxlbWVudCBvdXRwdXQ7CisKKyAgQ2FsY3VsYXRvclVJKHRoaXMub3V0cHV0KTsKKworICBUVHJhbnNwb3J0IF90cmFuc3BvcnQ7CisgIENhbGN1bGF0b3IgX2NhbGN1bGF0b3JDbGllbnQ7CisKKyAgdm9pZCBzdGFydCgpIHsKKyAgICBfYnVpbGRJbnRlcmZhY2UoKTsKKyAgICBfaW5pdENvbm5lY3Rpb24oKTsKKyAgfQorCisgIHZvaWQgX3ZhbGlkYXRlKCkgeworICAgIGlmICghX3RyYW5zcG9ydC5pc09wZW4pIHsKKyAgICAgIHdpbmRvdy5hbGVydCgiVGhlIHRyYW5zcG9ydCBpcyBub3Qgb3BlbiEiKTsKKyAgICB9CisgIH0KKworICB2b2lkIF9pbml0Q29ubmVjdGlvbigpIHsKKyAgICBfdHJhbnNwb3J0ID0gbmV3IFRBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydCgKKyAgICAgICAgbmV3IFRXZWJTb2NrZXQoVXJpLnBhcnNlKCd3czovLzEyNy4wLjAuMTo5MDkwL3dzJykpLAorICAgICAgICBuZXcgVE1lc3NhZ2VSZWFkZXIobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woX3RyYW5zcG9ydCk7CisgICAgX3RyYW5zcG9ydC5vcGVuKCk7CisKKyAgICBfY2FsY3VsYXRvckNsaWVudCA9IG5ldyBDYWxjdWxhdG9yQ2xpZW50KHByb3RvY29sKTsKKyAgfQorCisgIHZvaWQgX2J1aWxkSW50ZXJmYWNlKCkgeworICAgIG91dHB1dC5jaGlsZHJlbi5mb3JFYWNoKChlKSB7CisgICAgICBlLnJlbW92ZSgpOworICAgIH0pOworCisgICAgX2J1aWxkUGluZ0NvbXBvbmVudCgpOworCisgICAgX2J1aWxkQWRkQ29tcG9uZW50KCk7CisKKyAgICBfYnVpbGRDYWxjdWxhdG9yQ29tcG9uZW50KCk7CisKKyAgICBfYnVpbGRHZXRTdHJ1Y3RDb21wb25lbnQoKTsKKyAgfQorCisgIHZvaWQgX2J1aWxkUGluZ0NvbXBvbmVudCgpIHsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBIZWFkaW5nRWxlbWVudC5oMygpLi50ZXh0ID0gIlBpbmciKTsKKyAgICBCdXR0b25FbGVtZW50IHBpbmdCdXR0b24gPSBuZXcgQnV0dG9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiUElORyIKKyAgICAgIC4ub25DbGljay5saXN0ZW4oX29uUGluZ0NsaWNrKTsKKyAgICBvdXRwdXQuYXBwZW5kKHBpbmdCdXR0b24pOworICB9CisKKyAgdm9pZCBfb25QaW5nQ2xpY2soTW91c2VFdmVudCBlKSB7CisgICAgX3ZhbGlkYXRlKCk7CisKKyAgICBfY2FsY3VsYXRvckNsaWVudC5waW5nKCk7CisgIH0KKworICB2b2lkIF9idWlsZEFkZENvbXBvbmVudCgpIHsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBIZWFkaW5nRWxlbWVudC5oMygpLi50ZXh0ID0gIkFkZCIpOworICAgIElucHV0RWxlbWVudCBudW0xID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImFkZDEiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG51bTEpOworICAgIFNwYW5FbGVtZW50IG9wID0gbmV3IFNwYW5FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICIrIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQob3ApOworICAgIElucHV0RWxlbWVudCBudW0yID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImFkZDIiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQobnVtMik7CisgICAgQnV0dG9uRWxlbWVudCBhZGRCdXR0b24gPSBuZXcgQnV0dG9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiPSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IgorICAgICAgLi5vbkNsaWNrLmxpc3Rlbihfb25BZGRDbGljayk7CisgICAgb3V0cHV0LmFwcGVuZChhZGRCdXR0b24pOworICAgIFNwYW5FbGVtZW50IHJlc3VsdCA9IG5ldyBTcGFuRWxlbWVudCgpCisgICAgICAuLmlkID0gImFkZFJlc3VsdCIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKHJlc3VsdCk7CisgIH0KKworICB2b2lkIF9vbkFkZENsaWNrKE1vdXNlRXZlbnQgZSkgeworICAgIF92YWxpZGF0ZSgpOworCisgICAgSW5wdXRFbGVtZW50IG51bTEgPSBxdWVyeVNlbGVjdG9yKCIjYWRkMSIpOworICAgIElucHV0RWxlbWVudCBudW0yID0gcXVlcnlTZWxlY3RvcigiI2FkZDIiKTsKKyAgICBTcGFuRWxlbWVudCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yKCIjYWRkUmVzdWx0Iik7CisKKyAgICBfY2FsY3VsYXRvckNsaWVudAorICAgICAgICAuYWRkKGludC5wYXJzZShudW0xLnZhbHVlKSwgaW50LnBhcnNlKG51bTIudmFsdWUpKQorICAgICAgICAudGhlbigoaW50IG4pIHsKKyAgICAgIHJlc3VsdC50ZXh0ID0gIiRuIjsKKyAgICB9KTsKKyAgfQorCisgIHZvaWQgX2J1aWxkQ2FsY3VsYXRvckNvbXBvbmVudCgpIHsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBIZWFkaW5nRWxlbWVudC5oMygpLi50ZXh0ID0gIkNhbGN1bGF0b3IiKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMSA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJjYWxjMSIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiOworICAgIG91dHB1dC5hcHBlbmQobnVtMSk7CisgICAgU2VsZWN0RWxlbWVudCBvcCA9IG5ldyBTZWxlY3RFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY2FsY09wIgorICAgICAgLi5tdWx0aXBsZSA9IGZhbHNlCisgICAgICAuLnNlbGVjdGVkSW5kZXggPSAwCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE2cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCI7CisgICAgT3B0aW9uRWxlbWVudCBhZGRPcCA9IG5ldyBPcHRpb25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICIrIgorICAgICAgLi52YWx1ZSA9IE9wZXJhdGlvbi5BREQudG9TdHJpbmcoKTsKKyAgICBvcC5hZGQoYWRkT3AsIDApOworICAgIE9wdGlvbkVsZW1lbnQgc3VidHJhY3RPcCA9IG5ldyBPcHRpb25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICItIgorICAgICAgLi52YWx1ZSA9IE9wZXJhdGlvbi5TVUJUUkFDVC50b1N0cmluZygpOworICAgIG9wLmFkZChzdWJ0cmFjdE9wLCAxKTsKKyAgICBPcHRpb25FbGVtZW50IG11bHRpcGx5T3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiKiIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uTVVMVElQTFkudG9TdHJpbmcoKTsKKyAgICBvcC5hZGQobXVsdGlwbHlPcCwgMik7CisgICAgT3B0aW9uRWxlbWVudCBkaXZpZGVPcCA9IG5ldyBPcHRpb25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICIvIgorICAgICAgLi52YWx1ZSA9IE9wZXJhdGlvbi5ESVZJREUudG9TdHJpbmcoKTsKKyAgICBvcC5hZGQoZGl2aWRlT3AsIDMpOworICAgIG91dHB1dC5hcHBlbmQob3ApOworICAgIElucHV0RWxlbWVudCBudW0yID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImNhbGMyIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG51bTIpOworICAgIEJ1dHRvbkVsZW1lbnQgY2FsY0J1dHRvbiA9IG5ldyBCdXR0b25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICI9IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiCisgICAgICAuLm9uQ2xpY2subGlzdGVuKF9vbkNhbGNDbGljayk7CisgICAgb3V0cHV0LmFwcGVuZChjYWxjQnV0dG9uKTsKKyAgICBTcGFuRWxlbWVudCByZXN1bHQgPSBuZXcgU3BhbkVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJjYWxjUmVzdWx0IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQocmVzdWx0KTsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBCUkVsZW1lbnQoKSk7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgQlJFbGVtZW50KCkpOworICAgIExhYmVsRWxlbWVudCBsb2dJZExhYmVsID0gbmV3IExhYmVsRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiTG9nIElEOiIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCI7CisgICAgb3V0cHV0LmFwcGVuZChsb2dJZExhYmVsKTsKKyAgICBJbnB1dEVsZW1lbnQgbG9nSWQgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAibG9nSWQiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi52YWx1ZSA9ICIxIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQobG9nSWQpOworICAgIExhYmVsRWxlbWVudCBjb21tZW50TGFiZWwgPSBuZXcgTGFiZWxFbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJDb21tZW50OiIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGNvbW1lbnRMYWJlbCk7CisgICAgSW5wdXRFbGVtZW50IGNvbW1lbnQgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY29tbWVudCIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiMTAwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChjb21tZW50KTsKKyAgfQorCisgIHZvaWQgX29uQ2FsY0NsaWNrKE1vdXNlRXZlbnQgZSkgeworICAgIF92YWxpZGF0ZSgpOworCisgICAgSW5wdXRFbGVtZW50IG51bTEgPSBxdWVyeVNlbGVjdG9yKCIjY2FsYzEiKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IHF1ZXJ5U2VsZWN0b3IoIiNjYWxjMiIpOworICAgIFNlbGVjdEVsZW1lbnQgb3AgPSBxdWVyeVNlbGVjdG9yKCIjY2FsY09wIik7CisgICAgU3BhbkVsZW1lbnQgcmVzdWx0ID0gcXVlcnlTZWxlY3RvcigiI2NhbGNSZXN1bHQiKTsKKyAgICBJbnB1dEVsZW1lbnQgbG9nSWQgPSBxdWVyeVNlbGVjdG9yKCIjbG9nSWQiKTsKKyAgICBJbnB1dEVsZW1lbnQgY29tbWVudCA9IHF1ZXJ5U2VsZWN0b3IoIiNjb21tZW50Iik7CisKKyAgICBpbnQgbG9nSWRWYWx1ZSA9IGludC5wYXJzZShsb2dJZC52YWx1ZSk7CisgICAgbG9nSWQudmFsdWUgPSAobG9nSWRWYWx1ZSArIDEpLnRvU3RyaW5nKCk7CisKKyAgICBXb3JrIHdvcmsgPSBuZXcgV29yaygpOworICAgIHdvcmsubnVtMSA9IGludC5wYXJzZShudW0xLnZhbHVlKTsKKyAgICB3b3JrLm51bTIgPSBpbnQucGFyc2UobnVtMi52YWx1ZSk7CisgICAgd29yay5vcCA9IGludC5wYXJzZShvcC5vcHRpb25zW29wLnNlbGVjdGVkSW5kZXhdLnZhbHVlKTsKKyAgICB3b3JrLmNvbW1lbnQgPSBjb21tZW50LnZhbHVlOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQuY2FsY3VsYXRlKGxvZ0lkVmFsdWUsIHdvcmspLnRoZW4oKGludCBuKSB7CisgICAgICByZXN1bHQudGV4dCA9ICIkbiI7CisgICAgfSk7CisgIH0KKworICB2b2lkIF9idWlsZEdldFN0cnVjdENvbXBvbmVudCgpIHsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBIZWFkaW5nRWxlbWVudC5oMygpLi50ZXh0ID0gIkdldCBTdHJ1Y3QiKTsKKyAgICBMYWJlbEVsZW1lbnQgbG9nSWRMYWJlbCA9IG5ldyBMYWJlbEVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIlN0cnVjdCBLZXk6IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGxvZ0lkTGFiZWwpOworICAgIElucHV0RWxlbWVudCBsb2dJZCA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJzdHJ1Y3RLZXkiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi52YWx1ZSA9ICIxIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQobG9nSWQpOworICAgIEJ1dHRvbkVsZW1lbnQgZ2V0U3RydWN0QnV0dG9uID0gbmV3IEJ1dHRvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIkdFVCIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IgorICAgICAgLi5vbkNsaWNrLmxpc3Rlbihfb25HZXRTdHJ1Y3RDbGljayk7CisgICAgb3V0cHV0LmFwcGVuZChnZXRTdHJ1Y3RCdXR0b24pOworICAgIG91dHB1dC5hcHBlbmQobmV3IEJSRWxlbWVudCgpKTsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBCUkVsZW1lbnQoKSk7CisgICAgVGV4dEFyZWFFbGVtZW50IHJlc3VsdCA9IG5ldyBUZXh0QXJlYUVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJnZXRTdHJ1Y3RSZXN1bHQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjMwMHB4IgorICAgICAgLi5zdHlsZS5oZWlnaHQgPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKHJlc3VsdCk7CisgIH0KKworICB2b2lkIF9vbkdldFN0cnVjdENsaWNrKE1vdXNlRXZlbnQgZSkgeworICAgIF92YWxpZGF0ZSgpOworCisgICAgSW5wdXRFbGVtZW50IHN0cnVjdEtleSA9IHF1ZXJ5U2VsZWN0b3IoIiNzdHJ1Y3RLZXkiKTsKKyAgICBUZXh0QXJlYUVsZW1lbnQgcmVzdWx0ID0gcXVlcnlTZWxlY3RvcigiI2dldFN0cnVjdFJlc3VsdCIpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQKKyAgICAgICAgLmdldFN0cnVjdChpbnQucGFyc2Uoc3RydWN0S2V5LnZhbHVlKSkKKyAgICAgICAgLnRoZW4oKFNoYXJlZFN0cnVjdCBzKSB7CisgICAgICByZXN1bHQudGV4dCA9ICIke3MudG9TdHJpbmcoKX0iOworICAgIH0pOworICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvaW5kZXguaHRtbCBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMzZiNDMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvaW5kZXguaHRtbApAQCAtMCwwICsxLDM1IEBACis8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIj4KKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CisgICAgPHRpdGxlPlRocmlmdCBUdXRvcmlhbDwvdGl0bGU+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJzdHlsZXMuY3NzIj4KKyAgPHNjcmlwdCBhc3luYyBzcmM9ImNsaWVudC5kYXJ0LmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHk+CisKKyAgPGRpdiBpZD0ib3V0cHV0Ij48L2Rpdj4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL3N0eWxlcy5jc3MgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvc3R5bGVzLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDMxNTAyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL3N0eWxlcy5jc3MKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90byk7CisKK2h0bWwsIGJvZHkgeworICAgIHdpZHRoOiAxMDAlOworICAgIGhlaWdodDogMTAwJTsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBmb250LWZhbWlseTogJ1JvYm90bycsIHNhbnMtc2VyaWY7Cit9CisKK2gzIHsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZDsKKyAgICBib3JkZXItd2lkdGg6IHRoaW47CisgICAgcGFkZGluZy10b3A6IDIwcHg7Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0IGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTIwNmEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L2Jpbi9tYWluLmRhcnQKQEAgLTAsMCArMSwxNDkgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmlvJzsKKworaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpsb2dnaW5nL2xvZ2dpbmcuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0X2NvbnNvbGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dHV0b3JpYWwvdHV0b3JpYWwuZGFydCc7CisKK1RUcmFuc3BvcnQgX3RyYW5zcG9ydDsKK0NhbGN1bGF0b3IgX2NhbGN1bGF0b3I7CitpbnQgbG9naWQgPSAwOworCitjb25zdCBNYXA8U3RyaW5nLCBpbnQ+IG9wZXJhdGlvbkxvb2t1cCA9IGNvbnN0IHsKKyAgJysnOiBPcGVyYXRpb24uQURELAorICAnLSc6IE9wZXJhdGlvbi5TVUJUUkFDVCwKKyAgJyonOiBPcGVyYXRpb24uTVVMVElQTFksCisgICcvJzogT3BlcmF0aW9uLkRJVklERQorfTsKKworbWFpbihMaXN0PFN0cmluZz4gYXJncykgeworICBMb2dnZXIucm9vdC5sZXZlbCA9IExldmVsLkFMTDsKKyAgTG9nZ2VyLnJvb3Qub25SZWNvcmQubGlzdGVuKChMb2dSZWNvcmQgcmVjKSB7CisgICAgcHJpbnQoJyR7cmVjLmxldmVsLm5hbWV9OiAke3JlYy50aW1lfTogJHtyZWMubWVzc2FnZX0nKTsKKyAgfSk7CisKKyAgdmFyIHBhcnNlciA9IG5ldyBBcmdQYXJzZXIoKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigncG9ydCcsIGRlZmF1bHRzVG86ICc5MDkwJywgaGVscDogJ1RoZSBwb3J0IHRvIGNvbm5lY3QgdG8nKTsKKworICBBcmdSZXN1bHRzIHJlc3VsdHM7CisgIHRyeSB7CisgICAgcmVzdWx0cyA9IHBhcnNlci5wYXJzZShhcmdzKTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHJlc3VsdHMgPSBudWxsOworICB9CisKKyAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworICAgIHByaW50KHBhcnNlci51c2FnZSk7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIGludCBwb3J0ID0gaW50LnBhcnNlKHJlc3VsdHNbJ3BvcnQnXSk7CisKKyAgX2luaXRDb25uZWN0aW9uKHBvcnQpLnRoZW4oKF8pID0+IF9ydW4oKSk7Cit9CisKK0Z1dHVyZSBfaW5pdENvbm5lY3Rpb24oaW50IHBvcnQpIGFzeW5jIHsKKyAgdmFyIHNvY2tldCA9IGF3YWl0IFNvY2tldC5jb25uZWN0KCcxMjcuMC4wLjEnLCBwb3J0KTsKKyAgX3RyYW5zcG9ydCA9IG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICBuZXcgVFRjcFNvY2tldChzb2NrZXQpLCBuZXcgVE1lc3NhZ2VSZWFkZXIobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKF90cmFuc3BvcnQpOworICBhd2FpdCBfdHJhbnNwb3J0Lm9wZW4oKTsKKworICBfY2FsY3VsYXRvciA9IG5ldyBDYWxjdWxhdG9yQ2xpZW50KHByb3RvY29sKTsKK30KKworRnV0dXJlIF9ydW4oKSBhc3luYyB7CisgIF9oZWxwKCk7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGRvdXQud3JpdGUoIj4gIik7CisgICAgdmFyIGlucHV0ID0gc3RkaW4ucmVhZExpbmVTeW5jKCk7CisgICAgdmFyIHBhcnRzID0gaW5wdXQuc3BsaXQoJyAnKTsKKyAgICB2YXIgY29tbWFuZCA9IHBhcnRzWzBdOworICAgIHZhciBhcmdzID0gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnN1Ymxpc3QoMSkgOiBbXTsKKworICAgIHN3aXRjaCAoY29tbWFuZCkgeworICAgICAgY2FzZSAncGluZyc6CisgICAgICAgIGF3YWl0IF9waW5nKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdhZGQnOgorICAgICAgICBhd2FpdCBfYWRkKGludC5wYXJzZShhcmdzWzBdKSwgaW50LnBhcnNlKGFyZ3NbMV0pKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ2NhbGMnOgorICAgICAgICBpbnQgb3AgPSBvcGVyYXRpb25Mb29rdXBbYXJnc1sxXV07CisgICAgICAgIGlmICghT3BlcmF0aW9uLlZBTElEX1ZBTFVFUy5jb250YWlucyhvcCkpIHsKKyAgICAgICAgICBzdGRvdXQud3JpdGVsbignVW5rbm93biBvcGVyYXRvciAke2FyZ3NbMV19Jyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2YXIgd29yayA9IG5ldyBXb3JrKCkKKyAgICAgICAgICAuLm51bTEgPSBpbnQucGFyc2UoYXJnc1swXSkKKyAgICAgICAgICAuLm9wID0gb3AKKyAgICAgICAgICAuLm51bTIgPSBpbnQucGFyc2UoYXJnc1syXSkKKyAgICAgICAgICAuLmNvbW1lbnQgPSBhcmdzLmxlbmd0aCA+IDMgPyBhcmdzWzNdIDogJyc7CisKKyAgICAgICAgYXdhaXQgX2NhbGMod29yayk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdzdHJ1Y3QnOgorICAgICAgICBhd2FpdCBfc3RydWN0KGludC5wYXJzZShhcmdzWzBdKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdoZWxwJzoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIF9oZWxwKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit2b2lkIF9oZWxwKCkgeworICBzdGRvdXQud3JpdGVsbignQ29tbWFuZHM6Jyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIGhlbHAnKTsKKyAgc3Rkb3V0LndyaXRlbG4oJyAgcGluZycpOworICBzdGRvdXQud3JpdGVsbignICBhZGQgeCB5Jyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIGNhbGMgeCBvcCB5IFtjb21tZW50XScpOworICBzdGRvdXQud3JpdGVsbignICBzdHJ1Y3QgaWQnKTsKKyAgc3Rkb3V0LndyaXRlbG4oJycpOworfQorCitGdXR1cmUgX3BpbmcoKSBhc3luYyB7CisgIGF3YWl0IF9jYWxjdWxhdG9yLnBpbmcoKTsKKyAgc3Rkb3V0LndyaXRlbG4oJ3Bpbmcgc3VjY2VlZGVkJyk7Cit9CisKK0Z1dHVyZSBfYWRkKGludCB4LCBpbnQgeSkgYXN5bmMgeworICBpbnQgcmVzdWx0ID0gYXdhaXQgX2NhbGN1bGF0b3IuYWRkKHgsIHkpOworICBzdGRvdXQud3JpdGVsbignPSAkcmVzdWx0Jyk7Cit9CisKK0Z1dHVyZSBfY2FsYyhXb3JrIHdvcmspIGFzeW5jIHsKKyAgaW50IHJlc3VsdCA9IGF3YWl0IF9jYWxjdWxhdG9yLmNhbGN1bGF0ZShsb2dpZCsrLCB3b3JrKTsKKyAgc3Rkb3V0LndyaXRlbG4oJz0gJHJlc3VsdCcpOworfQorCitGdXR1cmUgX3N0cnVjdChpbnQga2V5KSBhc3luYyB7CisgIHZhciBzdHJ1Y3QgPSBhd2FpdCBfY2FsY3VsYXRvci5nZXRTdHJ1Y3Qoa2V5KTsKKyAgc3Rkb3V0LndyaXRlbG4oc3RydWN0LnRvU3RyaW5nKCkpOworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTEyMmQyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSwzNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0dXRvcmlhbF9jb25zb2xlX2NsaWVudAordmVyc2lvbjogMC4xMy4wCitkZXNjcmlwdGlvbjogPgorICBBIERhcnQgY29uc29sZSBjbGllbnQgdG8gaW1wbGVtZW50YXRpb24gb2YgdGhlIEFwYWNoZSBUaHJpZnQgdHV0b3JpYWwKK2F1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Citob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK2Vudmlyb25tZW50OgorICBzZGs6ICI+PTEuMTMuMCA8My4wLjAiCisKK2RlcGVuZGVuY2llczoKKyAgYXJnczogIj49MC4xMy4wIDwyLjAuMCIKKyAgY29sbGVjdGlvbjogXjEuMS4wCisgIHNoYXJlZDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC9zaGFyZWQKKyAgdGhyaWZ0OgorICAgIHBhdGg6IC4uLy4uLy4uL2xpYi9kYXJ0CisgIHR1dG9yaWFsOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3R1dG9yaWFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L3NlcnZlci8uYW5hbHlzaXNfb3B0aW9ucyBiL3R1dG9yaWFsL2RhcnQvc2VydmVyLy5hbmFseXNpc19vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMGQ0YzUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvYmluL21haW4uZGFydCBiL3R1dG9yaWFsL2RhcnQvc2VydmVyL2Jpbi9tYWluLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhYzMwZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvc2VydmVyL2Jpbi9tYWluLmRhcnQKQEAgLTAsMCArMSwxNjMgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmlvJzsKKworaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpsb2dnaW5nL2xvZ2dpbmcuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0X2NvbnNvbGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dHV0b3JpYWwvdHV0b3JpYWwuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6c2hhcmVkL3NoYXJlZC5kYXJ0JzsKKworVFByb3RvY29sIF9wcm90b2NvbDsKK1RQcm9jZXNzb3IgX3Byb2Nlc3NvcjsKK1dlYlNvY2tldCBfd2ViU29ja2V0OworCittYWluKExpc3Q8U3RyaW5nPiBhcmdzKSB7CisgIExvZ2dlci5yb290LmxldmVsID0gTGV2ZWwuQUxMOworICBMb2dnZXIucm9vdC5vblJlY29yZC5saXN0ZW4oKExvZ1JlY29yZCByZWMpIHsKKyAgICBwcmludCgnJHtyZWMubGV2ZWwubmFtZX06ICR7cmVjLnRpbWV9OiAke3JlYy5tZXNzYWdlfScpOworICB9KTsKKworICB2YXIgcGFyc2VyID0gbmV3IEFyZ1BhcnNlcigpOworICBwYXJzZXIuYWRkT3B0aW9uKCdwb3J0JywgZGVmYXVsdHNUbzogJzkwOTAnLCBoZWxwOiAnVGhlIHBvcnQgdG8gbGlzdGVuIG9uJyk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3R5cGUnLAorICAgICAgZGVmYXVsdHNUbzogJ3dzJywKKyAgICAgIGFsbG93ZWQ6IFsnd3MnLCAndGNwJ10sCisgICAgICBoZWxwOiAnVGhlIHR5cGUgb2Ygc29ja2V0JywKKyAgICAgIGFsbG93ZWRIZWxwOiB7J3dzJzogJ1dlYlNvY2tldCcsICd0Y3AnOiAnVENQIFNvY2tldCd9KTsKKworICBBcmdSZXN1bHRzIHJlc3VsdHM7CisgIHRyeSB7CisgICAgcmVzdWx0cyA9IHBhcnNlci5wYXJzZShhcmdzKTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHJlc3VsdHMgPSBudWxsOworICB9CisKKyAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworICAgIHByaW50KHBhcnNlci51c2FnZSk7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIGludCBwb3J0ID0gaW50LnBhcnNlKHJlc3VsdHNbJ3BvcnQnXSk7CisgIFN0cmluZyBzb2NrZXRUeXBlID0gcmVzdWx0c1sndHlwZSddOworCisgIGlmIChzb2NrZXRUeXBlID09ICd0Y3AnKSB7CisgICAgX3J1blRjcFNlcnZlcihwb3J0KTsKKyAgfSBlbHNlIGlmIChzb2NrZXRUeXBlID09ICd3cycpIHsKKyAgICBfcnVuV2ViU29ja2V0U2VydmVyKHBvcnQpOworICB9Cit9CisKK0Z1dHVyZSBfcnVuV2ViU29ja2V0U2VydmVyKGludCBwb3J0KSBhc3luYyB7CisgIHZhciBodHRwU2VydmVyID0gYXdhaXQgSHR0cFNlcnZlci5iaW5kKCcxMjcuMC4wLjEnLCBwb3J0KTsKKyAgcHJpbnQoJ2xpc3RlbmluZyBmb3IgV2ViU29ja2V0IGNvbm5lY3Rpb25zIG9uICRwb3J0Jyk7CisKKyAgaHR0cFNlcnZlci5saXN0ZW4oKEh0dHBSZXF1ZXN0IHJlcXVlc3QpIGFzeW5jIHsKKyAgICBpZiAocmVxdWVzdC51cmkucGF0aCA9PSAnL3dzJykgeworICAgICAgX3dlYlNvY2tldCA9IGF3YWl0IFdlYlNvY2tldFRyYW5zZm9ybWVyLnVwZ3JhZGUocmVxdWVzdCk7CisgICAgICBhd2FpdCBfaW5pdFByb2Nlc3NvcihuZXcgVFdlYlNvY2tldChfd2ViU29ja2V0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50KCdJbnZhbGlkIHBhdGg6ICR7cmVxdWVzdC51cmkucGF0aH0nKTsKKyAgICB9CisgIH0pOworfQorCitGdXR1cmUgX3J1blRjcFNlcnZlcihpbnQgcG9ydCkgYXN5bmMgeworICB2YXIgc2VydmVyU29ja2V0ID0gYXdhaXQgU2VydmVyU29ja2V0LmJpbmQoJzEyNy4wLjAuMScsIHBvcnQpOworICBwcmludCgnbGlzdGVuaW5nIGZvciBUQ1AgY29ubmVjdGlvbnMgb24gJHBvcnQnKTsKKworICBTb2NrZXQgc29ja2V0ID0gYXdhaXQgc2VydmVyU29ja2V0LmZpcnN0OworICBhd2FpdCBfaW5pdFByb2Nlc3NvcihuZXcgVFRjcFNvY2tldChzb2NrZXQpKTsKK30KKworRnV0dXJlIF9pbml0UHJvY2Vzc29yKFRTb2NrZXQgc29ja2V0KSBhc3luYyB7CisgIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKyAgdHJhbnNwb3J0Lm9uSW5jb21pbmdNZXNzYWdlLmxpc3RlbihfcHJvY2Vzc01lc3NhZ2UpOworICBfcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3JQcm9jZXNzb3IobmV3IENhbGN1bGF0b3JTZXJ2ZXIoKSk7CisgIF9wcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgYXdhaXQgX3Byb3RvY29sLnRyYW5zcG9ydC5vcGVuKCk7CisKKyAgcHJpbnQoJ2Nvbm5lY3RlZCcpOworfQorCitGdXR1cmUgX3Byb2Nlc3NNZXNzYWdlKF8pIGFzeW5jIHsKKyAgX3Byb2Nlc3Nvci5wcm9jZXNzKF9wcm90b2NvbCwgX3Byb3RvY29sKTsKK30KKworY2xhc3MgQ2FsY3VsYXRvclNlcnZlciBpbXBsZW1lbnRzIENhbGN1bGF0b3IgeworICBmaW5hbCBNYXA8aW50LCBTaGFyZWRTdHJ1Y3Q+IF9sb2cgPSB7fTsKKworICBGdXR1cmUgcGluZygpIGFzeW5jIHsKKyAgICBwcmludCgncGluZygpJyk7CisgIH0KKworICBGdXR1cmU8aW50PiBhZGQoaW50IG51bTEsIGludCBudW0yKSBhc3luYyB7CisgICAgcHJpbnQoJ2FkZCgkbnVtMSwgJG51bTIpJyk7CisKKyAgICByZXR1cm4gbnVtMSArIG51bTI7CisgIH0KKworICBGdXR1cmU8aW50PiBjYWxjdWxhdGUoaW50IGxvZ2lkLCBXb3JrIHdvcmspIGFzeW5jIHsKKyAgICBwcmludCgnY2FsdWxhdGUoJGxvZ2lkLCAke3dvcmsudG9TdHJpbmcoKX0pJyk7CisKKyAgICBpbnQgdmFsOworCisgICAgc3dpdGNoICh3b3JrLm9wKSB7CisgICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6CisgICAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE9wZXJhdGlvbi5NVUxUSVBMWToKKyAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICBpZiAod29yay5udW0yID09IDApIHsKKyAgICAgICAgICB2YXIgeCA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wOworICAgICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCc7CisgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgfQorICAgICAgICB2YWwgPSAod29yay5udW0xIC8gd29yay5udW0yKS5mbG9vcigpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB2YXIgbG9nID0gbmV3IFNoYXJlZFN0cnVjdCgpOworICAgIGxvZy5rZXkgPSBsb2dpZDsKKyAgICBsb2cudmFsdWUgPSAnJHZhbCAiJHt3b3JrLmNvbW1lbnR9Iic7CisgICAgdGhpcy5fbG9nW2xvZ2lkXSA9IGxvZzsKKworICAgIHJldHVybiB2YWw7CisgIH0KKworICBGdXR1cmUgemlwKCkgYXN5bmMgeworICAgIHByaW50KCd6aXAoKScpOworICB9CisKKyAgRnV0dXJlPFNoYXJlZFN0cnVjdD4gZ2V0U3RydWN0KGludCBrZXkpIGFzeW5jIHsKKyAgICBwcmludCgnZ2V0U3RydWN0KCRrZXkpJyk7CisKKyAgICByZXR1cm4gX2xvZ1trZXldOworICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWwgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5NDY1ZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbApAQCAtMCwwICsxLDM0IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWU6IHR1dG9yaWFsX3NlcnZlcgordmVyc2lvbjogMC4xMy4wCitkZXNjcmlwdGlvbjogQSBEYXJ0IHNlcnZlciB0byBzdXBwb3J0IHRoZSBBcGFjaGUgVGhyaWZ0IHR1dG9yaWFsCithdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgoraG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDMuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIGFyZ3M6ICI+PTAuMTMuMCA8Mi4wLjAiCisgIHNoYXJlZDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC9zaGFyZWQKKyAgdGhyaWZ0OgorICAgIHBhdGg6IC4uLy4uLy4uL2xpYi9kYXJ0CisgIHR1dG9yaWFsOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3R1dG9yaWFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHIgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHIKaW5kZXggMGYzODBiMC4uNzRkMGQ0NSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByCisrKyBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcgpAQCAtMjYsNyArMjYsNyBAQAogICBHZW5lcmljcy5Db2xsZWN0aW9ucywKICAgVGhyaWZ0IGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQucGFzJywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLApAQCAtNjIsMTAgKzYyLDEwIEBACiAgICAgdHJhbnNwb3J0Lk9wZW47CiAKICAgICBjbGllbnQucGluZzsKLSAgICBDb25zb2xlLldyaXRlTGluZSgncGluZygpJyk7CisgICAgV3JpdGVMbigncGluZygpJyk7CiAKICAgICBzdW0gOj0gY2xpZW50LmFkZCggMSwgMSk7Ci0gICAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCggJzErMT0lZCcsIFtzdW1dKSk7CisgICAgV3JpdGVMbiggRm9ybWF0KCAnMSsxPSVkJywgW3N1bV0pKTsKIAogICAgIHdvcmsgOj0gVFdvcmtJbXBsLkNyZWF0ZTsKIApAQCAtNzQsMTEgKzc0LDExIEBACiAgICAgd29yay5OdW0yIDo9IDA7CiAgICAgdHJ5CiAgICAgICBxdW90aWVudCA6PSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOwotICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICdXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCcpOwotICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCgnMS8wPSVkJyxbcXVvdGllbnRdKSk7CisgICAgICBXcml0ZUxuKCAnV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAnKTsKKyAgICAgIFdyaXRlTG4oIEZvcm1hdCgnMS8wPSVkJyxbcXVvdGllbnRdKSk7CiAgICAgZXhjZXB0CiAgICAgICBvbiBpbzogVEludmFsaWRPcGVyYXRpb24KLSAgICAgIGRvIENvbnNvbGUuV3JpdGVMaW5lKCAnSW52YWxpZCBvcGVyYXRpb246ICcgKyBpby5XaHkpOworICAgICAgZG8gV3JpdGVMbiggJ0ludmFsaWQgb3BlcmF0aW9uOiAnICsgaW8uV2h5KTsKICAgICBlbmQ7CiAKICAgICB3b3JrLk9wICAgOj0gVE9wZXJhdGlvbi5TVUJUUkFDVDsKQEAgLTg2LDIwICs4NiwyMCBAQAogICAgIHdvcmsuTnVtMiA6PSAxMDsKICAgICB0cnkKICAgICAgIGRpZmYgOj0gY2xpZW50LmNhbGN1bGF0ZSggMSwgd29yayk7Ci0gICAgICBDb25zb2xlLldyaXRlTGluZSggRm9ybWF0KCcxNS0xMD0lZCcsIFtkaWZmXSkpOworICAgICAgV3JpdGVMbiggRm9ybWF0KCcxNS0xMD0lZCcsIFtkaWZmXSkpOwogICAgIGV4Y2VwdAogICAgICAgb24gaW86IFRJbnZhbGlkT3BlcmF0aW9uCi0gICAgICBkbyBDb25zb2xlLldyaXRlTGluZSggJ0ludmFsaWQgb3BlcmF0aW9uOiAnICsgaW8uV2h5KTsKKyAgICAgIGRvIFdyaXRlTG4oICdJbnZhbGlkIG9wZXJhdGlvbjogJyArIGlvLldoeSk7CiAgICAgZW5kOwogCiAgICAgbG9nIDo9IGNsaWVudC5nZXRTdHJ1Y3QoMSk7Ci0gICAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCggJ0NoZWNrIGxvZzogJXMnLCBbbG9nLlZhbHVlXSkpOworICAgIFdyaXRlTG4oIEZvcm1hdCggJ0NoZWNrIGxvZzogJXMnLCBbbG9nLlZhbHVlXSkpOwogCiAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CiAKICAgZXhjZXB0CiAgICAgb24gZSA6IEV4Y2VwdGlvbgotICAgIGRvIENvbnNvbGUuV3JpdGVMaW5lKCBlLkNsYXNzTmFtZSsnOiAnK2UuTWVzc2FnZSk7CisgICAgZG8gV3JpdGVMbiggZS5DbGFzc05hbWUrJzogJytlLk1lc3NhZ2UpOwogICBlbmQ7CiBlbmQ7CiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcm9qIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2oKaW5kZXggMzRhYTUzMy4uMDY4MGJlMiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2oKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2oKQEAgLTEsMTE5ICsxLDExOSBAQAot77u/ICAgIDxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICAgICAgICA8UHJvcGVydHlHcm91cD4KLSAgICAgICAgICAgIDxQcm9qZWN0R3VpZD57MkI4RkIzQTEtMkY5RS00ODgzLThDNTMtMEY1NjIyMEIzNEY2fTwvUHJvamVjdEd1aWQ+Ci0gICAgICAgICAgICA8TWFpblNvdXJjZT5EZWxwaGlDbGllbnQuZHByPC9NYWluU291cmNlPgotICAgICAgICAgICAgPFByb2plY3RWZXJzaW9uPjEyLjM8L1Byb2plY3RWZXJzaW9uPgotICAgICAgICAgICAgPEJhc2lzPlRydWU8L0Jhc2lzPgotICAgICAgICAgICAgPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+RGVidWc8L0NvbmZpZz4KLSAgICAgICAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgICAgICAgICA8QXBwVHlwZT5Db25zb2xlPC9BcHBUeXBlPgotICAgICAgICAgICAgPEZyYW1ld29ya1R5cGU+Tm9uZTwvRnJhbWV3b3JrVHlwZT4KLSAgICAgICAgICAgIDxEQ0NfRENDQ29tcGlsZXI+RENDMzI8L0RDQ19EQ0NDb21waWxlcj4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzaXMnIG9yICckKEJhc2UpJyE9JyciPgotICAgICAgICAgICAgPEJhc2U+dHJ1ZTwvQmFzZT4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4KLSAgICAgICAgICAgIDxDZmdfMT50cnVlPC9DZmdfMT4KLSAgICAgICAgICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgotICAgICAgICAgICAgPEJhc2U+dHJ1ZTwvQmFzZT4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPgotICAgICAgICAgICAgPENmZ18yPnRydWU8L0NmZ18yPgotICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8QmFzZT50cnVlPC9CYXNlPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+Ci0gICAgICAgICAgICA8RENDX1VuaXRTZWFyY2hQYXRoPi4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjOyQoRENDX1VuaXRTZWFyY2hQYXRoKTwvRENDX1VuaXRTZWFyY2hQYXRoPgotICAgICAgICAgICAgPERDQ19JbWFnZUJhc2U+MDA0MDAwMDA8L0RDQ19JbWFnZUJhc2U+Ci0gICAgICAgICAgICA8RENDX0RjdU91dHB1dD4uXGRjdVwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19EY3VPdXRwdXQ+Ci0gICAgICAgICAgICA8RENDX1VuaXRBbGlhcz5XaW5UeXBlcz1XaW5kb3dzO1dpblByb2NzPVdpbmRvd3M7RGJpVHlwZXM9QkRFO0RiaVByb2NzPUJERTskKERDQ19Vbml0QWxpYXMpPC9EQ0NfVW5pdEFsaWFzPgotICAgICAgICAgICAgPERDQ19FeGVPdXRwdXQ+Li5cYmluXCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0V4ZU91dHB1dD4KLSAgICAgICAgICAgIDxEQ0NfRT5mYWxzZTwvRENDX0U+Ci0gICAgICAgICAgICA8RENDX04+ZmFsc2U8L0RDQ19OPgotICAgICAgICAgICAgPERDQ19TPmZhbHNlPC9EQ0NfUz4KLSAgICAgICAgICAgIDxEQ0NfRj5mYWxzZTwvRENDX0Y+Ci0gICAgICAgICAgICA8RENDX0s+ZmFsc2U8L0RDQ19LPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzEpJyE9JyciPgotICAgICAgICAgICAgPERDQ19EZWZpbmU+REVCVUc7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KLSAgICAgICAgICAgIDxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4KLSAgICAgICAgICAgIDxEQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz50cnVlPC9EQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4KLSAgICAgICAgICAgIDxEQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+ZmFsc2U8L0RDQ19Mb2NhbERlYnVnU3ltYm9scz4KLSAgICAgICAgICAgIDxEQ0NfRGVmaW5lPlJFTEVBU0U7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KLSAgICAgICAgICAgIDxEQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4wPC9EQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4KLSAgICAgICAgICAgIDxEQ0NfRGVidWdJbmZvcm1hdGlvbj5mYWxzZTwvRENDX0RlYnVnSW5mb3JtYXRpb24+Ci0gICAgICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICAgICAgPEl0ZW1Hcm91cD4KLSAgICAgICAgICAgIDxEZWxwaGlDb21waWxlIEluY2x1ZGU9IkRlbHBoaUNsaWVudC5kcHIiPgotICAgICAgICAgICAgICAgIDxNYWluU291cmNlPk1haW5Tb3VyY2U8L01haW5Tb3VyY2U+Ci0gICAgICAgICAgICA8L0RlbHBoaUNvbXBpbGU+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlV0aWxzLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TZXJ2ZXIucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGdlbi1kZWxwaGlcU2hhcmVkLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFR1dG9yaWFsLnBhcyIvPgotICAgICAgICAgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4KLSAgICAgICAgICAgICAgICA8S2V5PkNmZ18yPC9LZXk+Ci0gICAgICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iQmFzaXMiPgotICAgICAgICAgICAgICAgIDxLZXk+QmFzZTwvS2V5PgotICAgICAgICAgICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIj4KLSAgICAgICAgICAgICAgICA8S2V5PkNmZ18xPC9LZXk+Ci0gICAgICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4KLSAgICAgICAgPC9JdGVtR3JvdXA+Ci0gICAgICAgIDxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cyIvPgotICAgICAgICA8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qJykiIFByb2plY3Q9IiQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2oiLz4KLSAgICAgICAgPFByb2plY3RFeHRlbnNpb25zPgotICAgICAgICAgICAgPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVscGhpLlBlcnNvbmFsaXR5LjEyPC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgotICAgICAgICAgICAgPEJvcmxhbmQuUHJvamVjdFR5cGUvPgotICAgICAgICAgICAgPEJvcmxhbmRQcm9qZWN0PgotICAgICAgICAgICAgICAgIDxEZWxwaGkuUGVyc29uYWxpdHk+Ci0gICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+VHJ1ZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9Ik1pbm9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iRGVidWciPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJQcmVSZWxlYXNlIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IlByaXZhdGUiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJETEwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkNvZGVQYWdlIj4xMjUyPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj5UaHJpZnQgVHV0b3JpYWw8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZVZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIj5EZWxwaGlDbGllbnQ8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPkNvcHlyaWdodCDCqSAyMDEyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbFRyYWRlbWFya3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iT3JpZ2luYWxGaWxlbmFtZSI+RGVscGhpQ2xpZW50LmV4ZTwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0TmFtZSI+VGhyaWZ0PC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICA8U291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNvdXJjZSBOYW1lPSJNYWluU291cmNlIj5EZWxwaGlDbGllbnQuZHByPC9Tb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvU291cmNlPgotICAgICAgICAgICAgICAgIDwvRGVscGhpLlBlcnNvbmFsaXR5PgotICAgICAgICAgICAgICAgIDxQbGF0Zm9ybXM+Ci0gICAgICAgICAgICAgICAgICAgIDxQbGF0Zm9ybSB2YWx1ZT0iV2luMzIiPlRydWU8L1BsYXRmb3JtPgotICAgICAgICAgICAgICAgIDwvUGxhdGZvcm1zPgotICAgICAgICAgICAgPC9Cb3JsYW5kUHJvamVjdD4KLSAgICAgICAgICAgIDxQcm9qZWN0RmlsZVZlcnNpb24+MTI8L1Byb2plY3RGaWxlVmVyc2lvbj4KLSAgICAgICAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KLSAgICA8L1Byb2plY3Q+Civvu78JPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisJCTxQcm9wZXJ0eUdyb3VwPgorCQkJPFByb2plY3RHdWlkPnsyQjhGQjNBMS0yRjlFLTQ4ODMtOEM1My0wRjU2MjIwQjM0RjZ9PC9Qcm9qZWN0R3VpZD4KKwkJCTxNYWluU291cmNlPkRlbHBoaUNsaWVudC5kcHI8L01haW5Tb3VyY2U+CisJCQk8UHJvamVjdFZlcnNpb24+MTIuMzwvUHJvamVjdFZlcnNpb24+CisJCQk8QmFzaXM+VHJ1ZTwvQmFzaXM+CisJCQk8Q29uZmlnIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PScnIj5EZWJ1ZzwvQ29uZmlnPgorCQkJPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKwkJCTxBcHBUeXBlPkNvbnNvbGU8L0FwcFR5cGU+CisJCQk8RnJhbWV3b3JrVHlwZT5Ob25lPC9GcmFtZXdvcmtUeXBlPgorCQkJPERDQ19EQ0NDb21waWxlcj5EQ0MzMjwvRENDX0RDQ0NvbXBpbGVyPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNpcycgb3IgJyQoQmFzZSknIT0nJyI+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPgorCQkJPENmZ18xPnRydWU8L0NmZ18xPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+CisJCQk8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KKwkJCTxEQ0NfVW5pdFNlYXJjaFBhdGg+Li5cLi5cLi5cbGliXGRlbHBoaVxzcmM7JChEQ0NfVW5pdFNlYXJjaFBhdGgpPC9EQ0NfVW5pdFNlYXJjaFBhdGg+CisJCQk8RENDX0ltYWdlQmFzZT4wMDQwMDAwMDwvRENDX0ltYWdlQmFzZT4KKwkJCTxEQ0NfRGN1T3V0cHV0Pi5cZGN1XCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0RjdU91dHB1dD4KKwkJCTxEQ0NfVW5pdEFsaWFzPldpblR5cGVzPVdpbmRvd3M7V2luUHJvY3M9V2luZG93cztEYmlUeXBlcz1CREU7RGJpUHJvY3M9QkRFOyQoRENDX1VuaXRBbGlhcyk8L0RDQ19Vbml0QWxpYXM+CisJCQk8RENDX0V4ZU91dHB1dD4uLlxiaW5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgorCQkJPERDQ19FPmZhbHNlPC9EQ0NfRT4KKwkJCTxEQ0NfTj5mYWxzZTwvRENDX04+CisJCQk8RENDX1M+ZmFsc2U8L0RDQ19TPgorCQkJPERDQ19GPmZhbHNlPC9EQ0NfRj4KKwkJCTxEQ0NfSz5mYWxzZTwvRENDX0s+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+CisJCQk8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgorCQkJPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgorCQkJPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgorCQkJPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgorCQkJPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8SXRlbUdyb3VwPgorCQkJPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iRGVscGhpQ2xpZW50LmRwciI+CisJCQkJPE1haW5Tb3VyY2U+TWFpblNvdXJjZTwvTWFpblNvdXJjZT4KKwkJCTwvRGVscGhpQ29tcGlsZT4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU2VydmVyLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFNoYXJlZC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxUdXRvcmlhbC5wYXMiLz4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+CisJCQkJPEtleT5DZmdfMjwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkJhc2lzIj4KKwkJCQk8S2V5PkJhc2U8L0tleT4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+CisJCQkJPEtleT5DZmdfMTwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCTwvSXRlbUdyb3VwPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMiLz4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaicpIiBQcm9qZWN0PSIkKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qIi8+CisJCTxQcm9qZWN0RXh0ZW5zaW9ucz4KKwkJCTxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlbHBoaS5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCQk8VmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPlRydWU8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MTI8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMzwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPgorCQkJCQk8L1ZlcnNpb25JbmZvPgorCQkJCQk8VmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iPlRocmlmdCBUdXRvcmlhbDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MC4xMy4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIj5EZWxwaGlDbGllbnQ8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPkNvcHlyaWdodCDCqSAyMDEyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbFRyYWRlbWFya3MiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iT3JpZ2luYWxGaWxlbmFtZSI+RGVscGhpQ2xpZW50LmV4ZTwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0TmFtZSI+VGhyaWZ0PC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4wLjEzLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyIvPgorCQkJCQk8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJPFNvdXJjZT4KKwkJCQkJCTxTb3VyY2UgTmFtZT0iTWFpblNvdXJjZSI+RGVscGhpQ2xpZW50LmRwcjwvU291cmNlPgorCQkJCQk8L1NvdXJjZT4KKwkJCQk8L0RlbHBoaS5QZXJzb25hbGl0eT4KKwkJCQk8UGxhdGZvcm1zPgorCQkJCQk8UGxhdGZvcm0gdmFsdWU9IldpbjMyIj5UcnVlPC9QbGF0Zm9ybT4KKwkJCQk8L1BsYXRmb3Jtcz4KKwkJCTwvQm9ybGFuZFByb2plY3Q+CisJCQk8UHJvamVjdEZpbGVWZXJzaW9uPjEyPC9Qcm9qZWN0RmlsZVZlcnNpb24+CisJCTwvUHJvamVjdEV4dGVuc2lvbnM+CisJPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByCmluZGV4IDlkNTRhMmUuLjVmNDJlN2UgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcgorKysgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHIKQEAgLTI4LDcgKzI4LDcgQEAKICAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCiAgIFRocmlmdCBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCi0gIFRocmlmdC5Db25zb2xlIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKICAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKQEAgLTg2LDEzICs4NiwxMyBAQAogCiBwcm9jZWR1cmUgVENhbGN1bGF0b3JIYW5kbGVyLnBpbmc7CiBiZWdpbgotICBDb25zb2xlLldyaXRlTGluZSggJ3BpbmcoKScpOworICBXcml0ZUxuKCAncGluZygpJyk7CiBlbmQ7CiAKIAogZnVuY3Rpb24gVENhbGN1bGF0b3JIYW5kbGVyLmFkZChudW0xOiBJbnRlZ2VyOyBudW0yOiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCi0gIENvbnNvbGUuV3JpdGVMaW5lKCBGb3JtYXQoICdhZGQoICVkLCAlZCknLCBbbnVtMSwgbnVtMl0pKTsKKyAgV3JpdGVMbiggRm9ybWF0KCAnYWRkKCAlZCwgJWQpJywgW251bTEsIG51bTJdKSk7CiAgIHJlc3VsdCA6PSBudW0xICsgbnVtMjsKIGVuZDsKIApAQCAtMTAxLDcgKzEwMSw3IEBACiB2YXIgZW50cnkgOiBJU2hhcmVkU3RydWN0OwogYmVnaW4KICAgdHJ5Ci0gICAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCgnY2FsY3VsYXRlKCAlZCwgWyVkLCVkLCVkXSknLCBbbG9naWQsIE9yZCh3Lk9wKSwgdy5OdW0xLCB3Lk51bTJdKSk7CisgICAgV3JpdGVMbiggRm9ybWF0KCdjYWxjdWxhdGUoICVkLCBbJWQsJWQsJWRdKScsIFtsb2dpZCwgT3JkKHcuT3ApLCB3Lk51bTEsIHcuTnVtMl0pKTsKIAogICAgIGNhc2Ugdy5PcCBvZgogICAgICAgVE9wZXJhdGlvbi5BREQgICAgICA6ICByZXN1bHQgOj0gdy5OdW0xICsgdy5OdW0yOwpAQCAtMTI2LDE0ICsxMjYsMTQgQEAKIAogZnVuY3Rpb24gVENhbGN1bGF0b3JIYW5kbGVyLmdldFN0cnVjdChrZXk6IEludGVnZXIpOiBJU2hhcmVkU3RydWN0OwogYmVnaW4KLSAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCggJ2dldFN0cnVjdCglZCknLCBba2V5XSkpOworICBXcml0ZUxuKCBGb3JtYXQoICdnZXRTdHJ1Y3QoJWQpJywgW2tleV0pKTsKICAgcmVzdWx0IDo9IEZMb2dba2V5XTsKIGVuZDsKIAogCiBwcm9jZWR1cmUgVENhbGN1bGF0b3JIYW5kbGVyLnppcDsKIGJlZ2luCi0gIENvbnNvbGUuV3JpdGVMaW5lKCAnemlwKCknKTsKKyAgV3JpdGVMbiggJ3ppcCgpJyk7CiBlbmQ7CiAKIApAQCAtMTUyLDE0ICsxNTIsMTQgQEAKICAgICB0cmFuc3BvcnQgOj0gVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKCA5MDkwKTsKICAgICBzZXJ2ZXIgICAgOj0gVFNpbXBsZVNlcnZlci5DcmVhdGUoIHByb2Nlc3NvciwgdHJhbnNwb3J0KTsKIAotICAgIENvbnNvbGUuV3JpdGVMaW5lKCAnU3RhcnRpbmcgdGhlIHNlcnZlci4uLicpOworICAgIFdyaXRlTG4oICdTdGFydGluZyB0aGUgc2VydmVyLi4uJyk7CiAgICAgc2VydmVyLlNlcnZlKCk7CiAKICAgZXhjZXB0Ci0gICAgb24gZTogRXhjZXB0aW9uIGRvIENvbnNvbGUuV3JpdGVMaW5lKCBlLk1lc3NhZ2UpOworICAgIG9uIGU6IEV4Y2VwdGlvbiBkbyBXcml0ZUxuKCBlLk1lc3NhZ2UpOwogICBlbmQ7CiAKLSAgQ29uc29sZS5Xcml0ZUxpbmUoJ2RvbmUuJyk7CisgIFdyaXRlTG4oJ2RvbmUuJyk7CiBlbmQ7CiAKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2ogYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJvagppbmRleCA3NDgxMWJjLi45N2Q1NjE3IDEwMDY0NAotLS0gYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJvagorKysgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJvagpAQCAtMSwxMTggKzEsMTE4IEBACi3vu78gICAgPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwPgotICAgICAgICAgICAgPFByb2plY3RHdWlkPnsyQjhGQjNBMS0yRjlFLTQ4ODMtOEM1My0wRjU2MjIwQjM0RjZ9PC9Qcm9qZWN0R3VpZD4KLSAgICAgICAgICAgIDxNYWluU291cmNlPkRlbHBoaVNlcnZlci5kcHI8L01haW5Tb3VyY2U+Ci0gICAgICAgICAgICA8UHJvamVjdFZlcnNpb24+MTIuMzwvUHJvamVjdFZlcnNpb24+Ci0gICAgICAgICAgICA8QmFzaXM+VHJ1ZTwvQmFzaXM+Ci0gICAgICAgICAgICA8Q29uZmlnIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PScnIj5EZWJ1ZzwvQ29uZmlnPgotICAgICAgICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICAgICAgICAgIDxBcHBUeXBlPkNvbnNvbGU8L0FwcFR5cGU+Ci0gICAgICAgICAgICA8RnJhbWV3b3JrVHlwZT5Ob25lPC9GcmFtZXdvcmtUeXBlPgotICAgICAgICAgICAgPERDQ19EQ0NDb21waWxlcj5EQ0MzMjwvRENDX0RDQ0NvbXBpbGVyPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNpcycgb3IgJyQoQmFzZSknIT0nJyI+Ci0gICAgICAgICAgICA8QmFzZT50cnVlPC9CYXNlPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPgotICAgICAgICAgICAgPENmZ18xPnRydWU8L0NmZ18xPgotICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8QmFzZT50cnVlPC9CYXNlPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+Ci0gICAgICAgICAgICA8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+Ci0gICAgICAgICAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KLSAgICAgICAgICAgIDxCYXNlPnRydWU8L0Jhc2U+Ci0gICAgICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICAgICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KLSAgICAgICAgICAgIDxEQ0NfSW1hZ2VCYXNlPjAwNDAwMDAwPC9EQ0NfSW1hZ2VCYXNlPgotICAgICAgICAgICAgPERDQ19EY3VPdXRwdXQ+LlxkY3VcJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRGN1T3V0cHV0PgotICAgICAgICAgICAgPERDQ19Vbml0QWxpYXM+V2luVHlwZXM9V2luZG93cztXaW5Qcm9jcz1XaW5kb3dzO0RiaVR5cGVzPUJERTtEYmlQcm9jcz1CREU7JChEQ0NfVW5pdEFsaWFzKTwvRENDX1VuaXRBbGlhcz4KLSAgICAgICAgICAgIDxEQ0NfRXhlT3V0cHV0Pi4uXGJpblwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19FeGVPdXRwdXQ+Ci0gICAgICAgICAgICA8RENDX0U+ZmFsc2U8L0RDQ19FPgotICAgICAgICAgICAgPERDQ19OPmZhbHNlPC9EQ0NfTj4KLSAgICAgICAgICAgIDxEQ0NfUz5mYWxzZTwvRENDX1M+Ci0gICAgICAgICAgICA8RENDX0Y+ZmFsc2U8L0RDQ19GPgotICAgICAgICAgICAgPERDQ19LPmZhbHNlPC9EQ0NfSz4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18xKSchPScnIj4KLSAgICAgICAgICAgIDxEQ0NfRGVmaW5lPkRFQlVHOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+Ci0gICAgICAgICAgICA8RENDX09wdGltaXplPmZhbHNlPC9EQ0NfT3B0aW1pemU+Ci0gICAgICAgICAgICA8RENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+dHJ1ZTwvRENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+Ci0gICAgICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICAgICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMiknIT0nJyI+Ci0gICAgICAgICAgICA8RENDX0xvY2FsRGVidWdTeW1ib2xzPmZhbHNlPC9EQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+Ci0gICAgICAgICAgICA8RENDX0RlZmluZT5SRUxFQVNFOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+Ci0gICAgICAgICAgICA8RENDX1N5bWJvbFJlZmVyZW5jZUluZm8+MDwvRENDX1N5bWJvbFJlZmVyZW5jZUluZm8+Ci0gICAgICAgICAgICA8RENDX0RlYnVnSW5mb3JtYXRpb24+ZmFsc2U8L0RDQ19EZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxJdGVtR3JvdXA+Ci0gICAgICAgICAgICA8RGVscGhpQ29tcGlsZSBJbmNsdWRlPSJEZWxwaGlTZXJ2ZXIuZHByIj4KLSAgICAgICAgICAgICAgICA8TWFpblNvdXJjZT5NYWluU291cmNlPC9NYWluU291cmNlPgotICAgICAgICAgICAgPC9EZWxwaGlDb21waWxlPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU2VydmVyLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFNoYXJlZC5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxUdXRvcmlhbC5wYXMiLz4KLSAgICAgICAgICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+Ci0gICAgICAgICAgICAgICAgPEtleT5DZmdfMjwvS2V5PgotICAgICAgICAgICAgICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgotICAgICAgICAgICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkJhc2lzIj4KLSAgICAgICAgICAgICAgICA8S2V5PkJhc2U8L0tleT4KLSAgICAgICAgICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+Ci0gICAgICAgICAgICAgICAgPEtleT5DZmdfMTwvS2V5PgotICAgICAgICAgICAgICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgotICAgICAgICAgICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDwvSXRlbUdyb3VwPgotICAgICAgICA8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMiLz4KLSAgICAgICAgPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaicpIiBQcm9qZWN0PSIkKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qIi8+Ci0gICAgICAgIDxQcm9qZWN0RXh0ZW5zaW9ucz4KLSAgICAgICAgICAgIDxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlbHBoaS5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KLSAgICAgICAgICAgIDxCb3JsYW5kLlByb2plY3RUeXBlLz4KLSAgICAgICAgICAgIDxCb3JsYW5kUHJvamVjdD4KLSAgICAgICAgICAgICAgICA8RGVscGhpLlBlcnNvbmFsaXR5PgotICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPlRydWU8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4xPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iUmVsZWFzZSI+MDwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iUHJlUmVsZWFzZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iRExMIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMzPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgIDwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiI+VGhyaWZ0IFR1dG9yaWFsPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkludGVybmFsTmFtZSI+RGVscGhpU2VydmVyPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsQ29weXJpZ2h0Ij5Db3B5cmlnaHQgwqkgMjAxMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPkRlbHBoaVNlcnZlci5leGU8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPlRocmlmdDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0VmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyIvPgotICAgICAgICAgICAgICAgICAgICA8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgPFNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTb3VyY2UgTmFtZT0iTWFpblNvdXJjZSI+RGVscGhpU2VydmVyLmRwcjwvU291cmNlPgotICAgICAgICAgICAgICAgICAgICA8L1NvdXJjZT4KLSAgICAgICAgICAgICAgICA8L0RlbHBoaS5QZXJzb25hbGl0eT4KLSAgICAgICAgICAgICAgICA8UGxhdGZvcm1zPgotICAgICAgICAgICAgICAgICAgICA8UGxhdGZvcm0gdmFsdWU9IldpbjMyIj5UcnVlPC9QbGF0Zm9ybT4KLSAgICAgICAgICAgICAgICA8L1BsYXRmb3Jtcz4KLSAgICAgICAgICAgIDwvQm9ybGFuZFByb2plY3Q+Ci0gICAgICAgICAgICA8UHJvamVjdEZpbGVWZXJzaW9uPjEyPC9Qcm9qZWN0RmlsZVZlcnNpb24+Ci0gICAgICAgIDwvUHJvamVjdEV4dGVuc2lvbnM+Ci0gICAgPC9Qcm9qZWN0Pgor77u/CTxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorCQk8UHJvcGVydHlHcm91cD4KKwkJCTxQcm9qZWN0R3VpZD57MkI4RkIzQTEtMkY5RS00ODgzLThDNTMtMEY1NjIyMEIzNEY2fTwvUHJvamVjdEd1aWQ+CisJCQk8TWFpblNvdXJjZT5EZWxwaGlTZXJ2ZXIuZHByPC9NYWluU291cmNlPgorCQkJPFByb2plY3RWZXJzaW9uPjEyLjM8L1Byb2plY3RWZXJzaW9uPgorCQkJPEJhc2lzPlRydWU8L0Jhc2lzPgorCQkJPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+RGVidWc8L0NvbmZpZz4KKwkJCTxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisJCQk8QXBwVHlwZT5Db25zb2xlPC9BcHBUeXBlPgorCQkJPEZyYW1ld29ya1R5cGU+Tm9uZTwvRnJhbWV3b3JrVHlwZT4KKwkJCTxEQ0NfRENDQ29tcGlsZXI+RENDMzI8L0RDQ19EQ0NDb21waWxlcj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzaXMnIG9yICckKEJhc2UpJyE9JyciPgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4KKwkJCTxDZmdfMT50cnVlPC9DZmdfMT4KKwkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPgorCQkJPENmZ18yPnRydWU8L0NmZ18yPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+CisJCQk8RENDX0ltYWdlQmFzZT4wMDQwMDAwMDwvRENDX0ltYWdlQmFzZT4KKwkJCTxEQ0NfRGN1T3V0cHV0Pi5cZGN1XCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0RjdU91dHB1dD4KKwkJCTxEQ0NfVW5pdEFsaWFzPldpblR5cGVzPVdpbmRvd3M7V2luUHJvY3M9V2luZG93cztEYmlUeXBlcz1CREU7RGJpUHJvY3M9QkRFOyQoRENDX1VuaXRBbGlhcyk8L0RDQ19Vbml0QWxpYXM+CisJCQk8RENDX0V4ZU91dHB1dD4uLlxiaW5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgorCQkJPERDQ19FPmZhbHNlPC9EQ0NfRT4KKwkJCTxEQ0NfTj5mYWxzZTwvRENDX04+CisJCQk8RENDX1M+ZmFsc2U8L0RDQ19TPgorCQkJPERDQ19GPmZhbHNlPC9EQ0NfRj4KKwkJCTxEQ0NfSz5mYWxzZTwvRENDX0s+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+CisJCQk8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgorCQkJPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgorCQkJPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgorCQkJPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgorCQkJPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8SXRlbUdyb3VwPgorCQkJPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iRGVscGhpU2VydmVyLmRwciI+CisJCQkJPE1haW5Tb3VyY2U+TWFpblNvdXJjZTwvTWFpblNvdXJjZT4KKwkJCTwvRGVscGhpQ29tcGlsZT4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU2VydmVyLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFNoYXJlZC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxUdXRvcmlhbC5wYXMiLz4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+CisJCQkJPEtleT5DZmdfMjwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkJhc2lzIj4KKwkJCQk8S2V5PkJhc2U8L0tleT4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+CisJCQkJPEtleT5DZmdfMTwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCTwvSXRlbUdyb3VwPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMiLz4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaicpIiBQcm9qZWN0PSIkKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qIi8+CisJCTxQcm9qZWN0RXh0ZW5zaW9ucz4KKwkJCTxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlbHBoaS5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCQk8VmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPlRydWU8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MTI8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMzwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPgorCQkJCQk8L1ZlcnNpb25JbmZvPgorCQkJCQk8VmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iPlRocmlmdCBUdXRvcmlhbDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MC4xMy4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIj5EZWxwaGlTZXJ2ZXI8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPkNvcHlyaWdodCDCqSAyMDEyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbFRyYWRlbWFya3MiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iT3JpZ2luYWxGaWxlbmFtZSI+RGVscGhpU2VydmVyLmV4ZTwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0TmFtZSI+VGhyaWZ0PC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4wLjEzLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyIvPgorCQkJCQk8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJPFNvdXJjZT4KKwkJCQkJCTxTb3VyY2UgTmFtZT0iTWFpblNvdXJjZSI+RGVscGhpU2VydmVyLmRwcjwvU291cmNlPgorCQkJCQk8L1NvdXJjZT4KKwkJCQk8L0RlbHBoaS5QZXJzb25hbGl0eT4KKwkJCQk8UGxhdGZvcm1zPgorCQkJCQk8UGxhdGZvcm0gdmFsdWU9IldpbjMyIj5UcnVlPC9QbGF0Zm9ybT4KKwkJCQk8L1BsYXRmb3Jtcz4KKwkJCTwvQm9ybGFuZFByb2plY3Q+CisJCQk8UHJvamVjdEZpbGVWZXJzaW9uPjEyPC9Qcm9qZWN0RmlsZVZlcnNpb24+CisJCTwvUHJvamVjdEV4dGVuc2lvbnM+CisJPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL2NsaWVudC5lcmwgYi90dXRvcmlhbC9lcmwvY2xpZW50LmVybAppbmRleCA1ZDQwOTE2Li4wMzc0MjIwIDEwMDY0NAotLS0gYS90dXRvcmlhbC9lcmwvY2xpZW50LmVybAorKysgYi90dXRvcmlhbC9lcmwvY2xpZW50LmVybApAQCAtMjgsNyArMjgsNyBAQAogICAgIG9rLgogCiB0KCkgLT4KLSAgICBQb3J0ID0gOTk5OSwKKyAgICBQb3J0ID0gOTA5MCwKIAogICAgIHtvaywgQ2xpZW50MH0gPSB0aHJpZnRfY2xpZW50X3V0aWw6bmV3KCIxMjcuMC4wLjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQsCkBAIC00NCw3ICs0NCw3IEBACiAgICAge0NsaWVudDMsIHtvaywgU3VtMX19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDIsIGFkZCwgWzEsIDRdKSwKICAgICBpbzpmb3JtYXQoIjErND1+cH5uIiwgW1N1bTFdKSwKIAotICAgIFdvcmsgPSAjd29ya3tvcD0/dHV0b3JpYWxfT3BlcmF0aW9uX1NVQlRSQUNULAorICAgIFdvcmsgPSAjJ1dvcmsne29wPT9UVVRPUklBTF9PUEVSQVRJT05fU1VCVFJBQ1QsCiAgICAgICAgICAgICAgICAgIG51bTE9MTUsCiAgICAgICAgICAgICAgICAgIG51bTI9MTB9LAogICAgIHtDbGllbnQ0LCB7b2ssIERpZmZ9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQzLCBjYWxjdWxhdGUsIFsxLCBXb3JrXSksCkBAIC01NSw3ICs1NSw3IEBACiAKICAgICBDbGllbnQ2ID0KICAgICAgICAgdHJ5Ci0gICAgICAgICAgICBXb3JrMSA9ICN3b3Jre29wPT90dXRvcmlhbF9PcGVyYXRpb25fRElWSURFLAorICAgICAgICAgICAgV29yazEgPSAjJ1dvcmsne29wPT9UVVRPUklBTF9PUEVSQVRJT05fRElWSURFLAogICAgICAgICAgICAgICAgICAgICAgICAgICBudW0xPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTI9MH0sCiAgICAgICAgICAgICB7Q2xpZW50UzEsIHtvaywgX1F1b3R9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ1LCBjYWxjdWxhdGUsIFsyLCBXb3JrMV0pLApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL2NsaWVudC5zaCBiL3R1dG9yaWFsL2VybC9jbGllbnQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGE0MTdlMGQuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvZXJsL2NsaWVudC5zaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXNlcnZlci5zaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9jbGllbnQuc2ggYi90dXRvcmlhbC9lcmwvY2xpZW50LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc3NWFmYjYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9lcmwvY2xpZW50LnNoCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9zaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworRVJMX1RIUklGVD0uLi8uLi9saWIvZXJsCisKK2lmICEgWyAtZCAke0VSTF9USFJJRlR9L2ViaW4gXTsgdGhlbgorICAgIGVjaG8gIlBsZWFzZSBidWlsZCB0aGUgVGhyaWZ0IGxpYnJhcnkgYnkgcnVubmluZyBcYG1ha2UnIGluICR7RVJMX1RIUklGVH0iCisgICAgZXhpdCAxCitmaQorCitpZiAhIFsgLWQgZ2VuLWVybCBdOyB0aGVuCisgIC4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLXIgLS1nZW4gZXJsIC4uL3R1dG9yaWFsLnRocmlmdAorZmkKKworCitlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSAke0VSTF9USFJJRlR9L2ViaW4gXAorICAgICAtSSBnZW4tZXJsIC1vIGdlbi1lcmwgZ2VuLWVybC8qLmVybCAmJgorICBlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSBnZW4tZXJsICouZXJsICYmCisgIGVybCArSyB0cnVlIC1wYSAke0VSTF9USFJJRlR9L2ViaW4gLXBhIGdlbi1lcmwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9qc29uX2NsaWVudC5lcmwgYi90dXRvcmlhbC9lcmwvanNvbl9jbGllbnQuZXJsCmluZGV4IDUyNGU5YWUuLjBiMzljZWQgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2VybC9qc29uX2NsaWVudC5lcmwKKysrIGIvdHV0b3JpYWwvZXJsL2pzb25fY2xpZW50LmVybApAQCAtMjcsOCArMjcsOCBAQAogCiAtZXhwb3J0KFt0LzBdKS4KIAotJSUgQ2xpZW50IGNvbnN0cnVjdG9yIGZvciB0aGUgY29tbW9uLWNhc2Ugb2Ygc29ja2V0IHRyYW5zcG9ydHMKLSUlIHdpdGggdGhlIGJpbmFyeSBwcm90b2NvbAorJSUgQ2xpZW50IGNvbnN0cnVjdG9yIGZvciB0aGUgaHR0cCB0cmFuc3BvcnRzCislJSB3aXRoIHRoZSBqc29uIHByb3RvY29sCiBuZXdfY2xpZW50KEhvc3QsIFBhdGgsIFNlcnZpY2UsIF9PcHRpb25zKSAtPgogICAgIHtQcm90b09wdHMsIFRyYW5zT3B0c30gPSB7W10sW119LAogICAgIFRyYW5zcG9ydEZhY3RvcnkgPSBmdW4oKSAtPiB0aHJpZnRfaHR0cF90cmFuc3BvcnQ6bmV3KEhvc3QsIFBhdGgsIFRyYW5zT3B0cykgZW5kLApAQCAtNTUsNyArNTUsNyBAQAogICAgIHtDbGllbnQzLCB7b2ssIFN1bTF9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQyLCBhZGQsIFsxLCA0XSksCiAgICAgaW86Zm9ybWF0KCIxKzQ9fnB+biIsIFtTdW0xXSksCiAKLSAgICBXb3JrID0gI3dvcmt7b3A9P3R1dG9yaWFsX09wZXJhdGlvbl9TVUJUUkFDVCwKKyAgICBXb3JrID0gIydXb3JrJ3tvcD0/VFVUT1JJQUxfT1BFUkFUSU9OX1NVQlRSQUNULAogICAgICAgICAgICAgICAgICBudW0xPTE1LAogICAgICAgICAgICAgICAgICBudW0yPTEwfSwKICAgICB7Q2xpZW50NCwge29rLCBEaWZmfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MywgY2FsY3VsYXRlLCBbMSwgV29ya10pLApAQCAtNjYsNyArNjYsNyBAQAogCiAgICAgQ2xpZW50NiA9CiAgICAgICAgIHRyeQotICAgICAgICAgICAgV29yazEgPSAjd29ya3tvcD0/dHV0b3JpYWxfT3BlcmF0aW9uX0RJVklERSwKKyAgICAgICAgICAgIFdvcmsxID0gIydXb3JrJ3tvcD0/VFVUT1JJQUxfT1BFUkFUSU9OX0RJVklERSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtMT0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICBudW0yPTB9LAogICAgICAgICAgICAge0NsaWVudFMxLCB7b2ssIF9RdW90fX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50NSwgY2FsY3VsYXRlLCBbMiwgV29yazFdKSwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9zZXJ2ZXIuZXJsIGIvdHV0b3JpYWwvZXJsL3NlcnZlci5lcmwKaW5kZXggZjFlNzM1Ny4uNjQ3Y2MyNCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZXJsL3NlcnZlci5lcmwKKysrIGIvdHV0b3JpYWwvZXJsL3NlcnZlci5lcmwKQEAgLTM2LDI1ICszNiwyNSBAQAogICAgIE4xK04yLgogCiBjYWxjdWxhdGUoTG9naWQsIFdvcmspIC0+Ci0gICAgeyBPcCwgTnVtMSwgTnVtMiB9ID0geyBXb3JrI3dvcmsub3AsIFdvcmsjd29yay5udW0xLCBXb3JrI3dvcmsubnVtMiB9LAorICAgIHsgT3AsIE51bTEsIE51bTIgfSA9IHsgV29yayMnV29yaycub3AsIFdvcmsjJ1dvcmsnLm51bTEsIFdvcmsjJ1dvcmsnLm51bTIgfSwKICAgICBkZWJ1ZygiY2FsY3VsYXRlKH5wLCB7fnAsfnAsfnB9KSIsIFtMb2dpZCwgT3AsIE51bTEsIE51bTJdKSwKICAgICBjYXNlIE9wIG9mCi0gICAgICAgID90dXRvcmlhbF9PcGVyYXRpb25fQUREICAgICAgLT4gTnVtMSArIE51bTI7Ci0gICAgICAgID90dXRvcmlhbF9PcGVyYXRpb25fU1VCVFJBQ1QgLT4gTnVtMSAtIE51bTI7Ci0gICAgICAgID90dXRvcmlhbF9PcGVyYXRpb25fTVVMVElQTFkgLT4gTnVtMSAqIE51bTI7CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fQUREICAgICAgLT4gTnVtMSArIE51bTI7CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fU1VCVFJBQ1QgLT4gTnVtMSAtIE51bTI7CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fTVVMVElQTFkgLT4gTnVtMSAqIE51bTI7CiAKLSAgICAgICAgP3R1dG9yaWFsX09wZXJhdGlvbl9ESVZJREUgd2hlbiBOdW0yID09IDAgLT4KLSAgICAgICAgICB0aHJvdygjaW52YWxpZE9wZXJhdGlvbnt3aGF0T3A9T3AsIHdoeT0iQ2Fubm90IGRpdmlkZSBieSAwIn0pOwotICAgICAgICA/dHV0b3JpYWxfT3BlcmF0aW9uX0RJVklERSAtPgorICAgICAgICA/VFVUT1JJQUxfT1BFUkFUSU9OX0RJVklERSB3aGVuIE51bTIgPT0gMCAtPgorICAgICAgICAgIHRocm93KCMnSW52YWxpZE9wZXJhdGlvbid7d2hhdE9wPU9wLCB3aHk9IkNhbm5vdCBkaXZpZGUgYnkgMCJ9KTsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUgLT4KICAgICAgICAgICBOdW0xIGRpdiBOdW0yOwogCiAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgdGhyb3coI2ludmFsaWRPcGVyYXRpb257d2hhdE9wPU9wLCB3aHk9IkludmFsaWQgb3BlcmF0aW9uIn0pCisgICAgICAgICAgdGhyb3coIydJbnZhbGlkT3BlcmF0aW9uJ3t3aGF0T3A9T3AsIHdoeT0iSW52YWxpZCBvcGVyYXRpb24ifSkKICAgICBlbmQuCiAKIGdldFN0cnVjdChLZXkpIC0+CiAgICAgZGVidWcoImdldFN0cnVjdCh+cCkiLCBbS2V5XSksCi0gICAgI3NoYXJlZFN0cnVjdHtrZXk9S2V5LCB2YWx1ZT0iUkFSRyJ9LgorICAgICMnU2hhcmVkU3RydWN0J3trZXk9S2V5LCB2YWx1ZT0iUkFSRyJ9LgogCiB6aXAoKSAtPgogICAgIGRlYnVnKCJ6aXAiLCBbXSksCkBAIC02Myw3ICs2Myw3IEBACiAlJQogCiBzdGFydCgpIC0+Ci0gICAgc3RhcnQoOTk5OSkuCisgICAgc3RhcnQoOTA5MCkuCiAKIHN0YXJ0KFBvcnQpIC0+CiAgICAgSGFuZGxlciAgID0gP01PRFVMRSwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvZ28vTWFrZWZpbGUuYW0KaW5kZXggYTcwN2Q1ZC4uYmQ1N2Q2NSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZ28vTWFrZWZpbGUuYW0KKysrIGIvdHV0b3JpYWwvZ28vTWFrZWZpbGUuYW0KQEAgLTE3LDMwICsxNywyOCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogZ2VuLWdvL3R1dG9yaWFsL2NhbGN1bGF0b3IuZ28gZ2VuLWdvL3NoYXJlZC9zaGFyZWRfc2VydmljZS5nbzogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gZ28gLXIgJDwKKwkkKFRIUklGVCkgLS1nZW4gZ28kKENPTVBJTEVSX0VYVFJBRkxBRykgLXIgJDwKIAogYWxsLWxvY2FsOiBnZW4tZ28vdHV0b3JpYWwvY2FsY3VsYXRvci5nbwogCi0KLWNoZWNrOiBzcmMvZ2l0LmFwYWNoZS5vcmcvdGhyaWZ0LmdpdC9saWIvZ28vdGhyaWZ0Ci0JJChUSFJJRlQpIC1yIC0tZ2VuIGdvICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CitjaGVjazogc3JjL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IHRoaXJkcGFydHktZGVwCisJJChUSFJJRlQpIC1yIC0tZ2VuIGdvJChDT01QSUxFUl9FWFRSQUZMQUcpICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJY3AgLXIgZ2VuLWdvLyogc3JjLwotCUdPUEFUSD1gcHdkYCAkKEdPKSBidWlsZCAuLy4uLgotCUdPUEFUSD1gcHdkYCAkKEdPKSBidWlsZCAtbyBnby10dXRvcmlhbCBzcmMvKi5nbworCUdPUEFUSD1gcHdkYCAkKEdPKSBidWlsZCAtbyBnby10dXRvcmlhbCAuL3NyYwogCUdPUEFUSD1gcHdkYCAkKEdPKSBidWlsZCAtbyBjYWxjdWxhdG9yLXJlbW90ZSBzcmMvdHV0b3JpYWwvY2FsY3VsYXRvci1yZW1vdGUvY2FsY3VsYXRvci1yZW1vdGUuZ28KIAotc3JjL2dpdC5hcGFjaGUub3JnL3RocmlmdC5naXQvbGliL2dvL3RocmlmdDoKLQlta2RpciAtcCBzcmMvZ2l0LmFwYWNoZS5vcmcvdGhyaWZ0LmdpdC9saWIvZ28KLQlsbiAtc2YgJChyZWFscGF0aCAkKHRvcF9zcmNkaXIpL2xpYi9nby90aHJpZnQpIHNyYy9naXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0L2xpYi9nby90aHJpZnQKK3NyYy9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdDoKKwlta2RpciAtcCBzcmMvZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nbworCWxuIC1zZiAkKHJlYWxwYXRoICQodG9wX3NyY2RpcikvbGliL2dvL3RocmlmdCkgc3JjL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0CisKK3RoaXJkcGFydHktZGVwOgogCiB0dXRvcmlhbHNlcnZlcjogYWxsCiAJR09QQVRIPWBwd2RgICQoR08pIHJ1biBzcmMvKi5nbyAtc2VydmVyPXRydWUKIAogdHV0b3JpYWxjbGllbnQ6IGFsbAotCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28gCisJR09QQVRIPWBwd2RgICQoR08pIHJ1biBzcmMvKi5nbwogCiB0dXRvcmlhbHNlY3VyZXNlcnZlcjogYWxsCiAJR09QQVRIPWBwd2RgICQoR08pIHJ1biBzcmMvKi5nbyAtc2VydmVyPXRydWUgLXNlY3VyZT10cnVlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvY2xpZW50LmdvIGIvdHV0b3JpYWwvZ28vc3JjL2NsaWVudC5nbwppbmRleCBhNDk3ZDdmLi5lM2ViZTAwIDEwMDY0NAotLS0gYS90dXRvcmlhbC9nby9zcmMvY2xpZW50LmdvCisrKyBiL3R1dG9yaWFsL2dvL3NyYy9jbGllbnQuZ28KQEAgLTIwLDI0ICsyMCwyOCBAQAogICovCiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImNyeXB0by90bHMiCiAJImZtdCIKLQkiZ2l0LmFwYWNoZS5vcmcvdGhyaWZ0LmdpdC9saWIvZ28vdGhyaWZ0IgogCSJ0dXRvcmlhbCIKKworCSJnaXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdCIKICkKIAordmFyIGRlZmF1bHRDdHggPSBjb250ZXh0LkJhY2tncm91bmQoKQorCiBmdW5jIGhhbmRsZUNsaWVudChjbGllbnQgKnR1dG9yaWFsLkNhbGN1bGF0b3JDbGllbnQpIChlcnIgZXJyb3IpIHsKLQljbGllbnQuUGluZygpCisJY2xpZW50LlBpbmcoZGVmYXVsdEN0eCkKIAlmbXQuUHJpbnRsbigicGluZygpIikKIAotCXN1bSwgXyA6PSBjbGllbnQuQWRkKDEsIDEpCisJc3VtLCBfIDo9IGNsaWVudC5BZGQoZGVmYXVsdEN0eCwgMSwgMSkKIAlmbXQuUHJpbnQoIjErMT0iLCBzdW0sICJcbiIpCiAKIAl3b3JrIDo9IHR1dG9yaWFsLk5ld1dvcmsoKQogCXdvcmsuT3AgPSB0dXRvcmlhbC5PcGVyYXRpb25fRElWSURFCiAJd29yay5OdW0xID0gMQogCXdvcmsuTnVtMiA9IDAKLQlxdW90aWVudCwgZXJyIDo9IGNsaWVudC5DYWxjdWxhdGUoMSwgd29yaykKKwlxdW90aWVudCwgZXJyIDo9IGNsaWVudC5DYWxjdWxhdGUoZGVmYXVsdEN0eCwgMSwgd29yaykKIAlpZiBlcnIgIT0gbmlsIHsKIAkJc3dpdGNoIHYgOj0gZXJyLih0eXBlKSB7CiAJCWNhc2UgKnR1dG9yaWFsLkludmFsaWRPcGVyYXRpb246CkBAIC01Myw3ICs1Nyw3IEBACiAJd29yay5PcCA9IHR1dG9yaWFsLk9wZXJhdGlvbl9TVUJUUkFDVAogCXdvcmsuTnVtMSA9IDE1CiAJd29yay5OdW0yID0gMTAKLQlkaWZmLCBlcnIgOj0gY2xpZW50LkNhbGN1bGF0ZSgxLCB3b3JrKQorCWRpZmYsIGVyciA6PSBjbGllbnQuQ2FsY3VsYXRlKGRlZmF1bHRDdHgsIDEsIHdvcmspCiAJaWYgZXJyICE9IG5pbCB7CiAJCXN3aXRjaCB2IDo9IGVyci4odHlwZSkgewogCQljYXNlICp0dXRvcmlhbC5JbnZhbGlkT3BlcmF0aW9uOgpAQCAtNjYsNyArNzAsNyBAQAogCQlmbXQuUHJpbnQoIjE1LTEwPSIsIGRpZmYsICJcbiIpCiAJfQogCi0JbG9nLCBlcnIgOj0gY2xpZW50LkdldFN0cnVjdCgxKQorCWxvZywgZXJyIDo9IGNsaWVudC5HZXRTdHJ1Y3QoZGVmYXVsdEN0eCwgMSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJZm10LlByaW50bG4oIlVuYWJsZSB0byBnZXQgc3RydWN0OiIsIGVycikKIAkJcmV0dXJuIGVycgpAQCAtOTAsMTAgKzk0LDE1IEBACiAJCWZtdC5QcmludGxuKCJFcnJvciBvcGVuaW5nIHNvY2tldDoiLCBlcnIpCiAJCXJldHVybiBlcnIKIAl9Ci0JdHJhbnNwb3J0ID0gdHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQodHJhbnNwb3J0KQorCXRyYW5zcG9ydCwgZXJyID0gdHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQodHJhbnNwb3J0KQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQogCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCiAJaWYgZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCk7IGVyciAhPSBuaWwgewogCQlyZXR1cm4gZXJyCiAJfQotCXJldHVybiBoYW5kbGVDbGllbnQodHV0b3JpYWwuTmV3Q2FsY3VsYXRvckNsaWVudEZhY3RvcnkodHJhbnNwb3J0LCBwcm90b2NvbEZhY3RvcnkpKQorCWlwcm90IDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpCisJb3Byb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCkKKwlyZXR1cm4gaGFuZGxlQ2xpZW50KHR1dG9yaWFsLk5ld0NhbGN1bGF0b3JDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChpcHJvdCwgb3Byb3QpKSkKIH0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NyYy9oYW5kbGVyLmdvIGIvdHV0b3JpYWwvZ28vc3JjL2hhbmRsZXIuZ28KaW5kZXggMTc2MzgzMi4uNWMwZWVkMCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZ28vc3JjL2hhbmRsZXIuZ28KKysrIGIvdHV0b3JpYWwvZ28vc3JjL2hhbmRsZXIuZ28KQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJmbXQiCiAJInNoYXJlZCIKIAkic3RyY29udiIKQEAgLTM0LDE3ICszNSwxNyBAQAogCXJldHVybiAmQ2FsY3VsYXRvckhhbmRsZXJ7bG9nOiBtYWtlKG1hcFtpbnRdKnNoYXJlZC5TaGFyZWRTdHJ1Y3QpfQogfQogCi1mdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgUGluZygpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBQaW5nKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnQoInBpbmcoKVxuIikKIAlyZXR1cm4gbmlsCiB9CiAKLWZ1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBBZGQobnVtMSBpbnQzMiwgbnVtMiBpbnQzMikgKHJldHZhbDE3IGludDMyLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBBZGQoY3R4IGNvbnRleHQuQ29udGV4dCwgbnVtMSBpbnQzMiwgbnVtMiBpbnQzMikgKHJldHZhbDE3IGludDMyLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnQoImFkZCgiLCBudW0xLCAiLCIsIG51bTIsICIpXG4iKQogCXJldHVybiBudW0xICsgbnVtMiwgbmlsCiB9CiAKLWZ1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBDYWxjdWxhdGUobG9naWQgaW50MzIsIHcgKnR1dG9yaWFsLldvcmspICh2YWwgaW50MzIsIGVyciBlcnJvcikgeworZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIENhbGN1bGF0ZShjdHggY29udGV4dC5Db250ZXh0LCBsb2dpZCBpbnQzMiwgdyAqdHV0b3JpYWwuV29yaykgKHZhbCBpbnQzMiwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50KCJjYWxjdWxhdGUoIiwgbG9naWQsICIsIHsiLCB3Lk9wLCAiLCIsIHcuTnVtMSwgIiwiLCB3Lk51bTIsICJ9KVxuIikKIAlzd2l0Y2ggdy5PcCB7CiAJY2FzZSB0dXRvcmlhbC5PcGVyYXRpb25fQUREOgpAQCAtODksMTMgKzkwLDEzIEBACiAJcmV0dXJuIHZhbCwgZXJyCiB9CiAKLWZ1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBHZXRTdHJ1Y3Qoa2V5IGludDMyKSAoKnNoYXJlZC5TaGFyZWRTdHJ1Y3QsIGVycm9yKSB7CitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgR2V0U3RydWN0KGN0eCBjb250ZXh0LkNvbnRleHQsIGtleSBpbnQzMikgKCpzaGFyZWQuU2hhcmVkU3RydWN0LCBlcnJvcikgewogCWZtdC5QcmludCgiZ2V0U3RydWN0KCIsIGtleSwgIilcbiIpCiAJdiwgXyA6PSBwLmxvZ1tpbnQoa2V5KV0KIAlyZXR1cm4gdiwgbmlsCiB9CiAKLWZ1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBaaXAoKSAoZXJyIGVycm9yKSB7CitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgWmlwKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnQoInppcCgpXG4iKQogCXJldHVybiBuaWwKIH0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvIGIvdHV0b3JpYWwvZ28vc3JjL21haW4uZ28KaW5kZXggNjMxNTRlMy4uNzczMGQ3YiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZ28vc3JjL21haW4uZ28KKysrIGIvdHV0b3JpYWwvZ28vc3JjL21haW4uZ28KQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCAoCiAJImZsYWciCiAJImZtdCIKLQkiZ2l0LmFwYWNoZS5vcmcvdGhyaWZ0LmdpdC9saWIvZ28vdGhyaWZ0IgorCSJnaXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdCIKIAkib3MiCiApCiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NyYy9zZXJ2ZXIuZ28gYi90dXRvcmlhbC9nby9zcmMvc2VydmVyLmdvCmluZGV4IGU0YzRiOTcuLjk1NzA4ZWIgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2dvL3NyYy9zZXJ2ZXIuZ28KKysrIGIvdHV0b3JpYWwvZ28vc3JjL3NlcnZlci5nbwpAQCAtMjIsNyArMjIsNyBAQAogaW1wb3J0ICgKIAkiY3J5cHRvL3RscyIKIAkiZm10IgotCSJnaXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0L2xpYi9nby90aHJpZnQiCisJImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IgogCSJ0dXRvcmlhbCIKICkKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2hheGUvTWFrZWZpbGUuYW0KaW5kZXggYzNjNTIwNC4uZTZmMjcxMyAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvaGF4ZS9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9oYXhlL01ha2VmaWxlLmFtCkBAIC0xNyw0NyArMTcsODEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CitCSU5fQ1BQID0gYmluL01haW4tZGVidWcKK0JJTl9QSFAgPSBiaW4vcGhwL01haW4tZGVidWcucGhwCitCSU5fUEhQX1dFQiA9IGJpbi9waHAtd2ViLXNlcnZlci9NYWluLWRlYnVnLnBocAogCiBnZW4taGF4ZS90dXRvcmlhbC9jYWxjdWxhdG9yLmh4IGdlbi1oYXhlL3NoYXJlZC9zaGFyZWRfc2VydmljZS5oeDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gaGF4ZSAtciAkPAogCi1hbGwtbG9jYWw6IGJpbi9NYWluLWRlYnVnCithbGwtbG9jYWw6ICQoQklOX0NQUCkgJChCSU5fUEhQKSAkKEJJTl9QSFBfV0VCKQogCiBjaGVjazogZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAogCi1iaW4vTWFpbi1kZWJ1ZzogXAorJChCSU5fQ1BQKTogXAogCQlzcmMvKi5oeCBcCiAJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKIAkJZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAogCSQoSEFYRSkgLS1jd2QgLiAgY3BwLmh4bWwKIAorJChCSU5fUEhQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLmh4bWwKKworJChCSU5fUEhQX1dFQik6IFwKKwkJc3JjLyouaHggXAorCQkuLi8uLi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3R1dG9yaWFsL2NhbGN1bGF0b3IuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIHBocC13ZWItc2VydmVyLmh4bWwKKwogdHV0b3JpYWxzZXJ2ZXI6IGFsbAotCWJpbi9NYWluLWRlYnVnIHNlcnZlcgorCSQoQklOX0NQUCkgc2VydmVyCisKK3R1dG9yaWFsc2VydmVyX3BocDogYWxsCisJcGhwIC1mICQoQklOX1BIUCkgc2VydmVyCiAKIHR1dG9yaWFsY2xpZW50OiBhbGwKLQliaW4vTWFpbi1kZWJ1ZworCSQoQklOX0NQUCkKKwordHV0b3JpYWxjbGllbnRfcGhwOiBhbGwKKwlwaHAgLWYgJChCSU5fUEhQKSAKIAogdHV0b3JpYWxzZWN1cmVzZXJ2ZXI6IGFsbAotCWJpbi9NYWluLWRlYnVnIHNlcnZlciBzZWN1cmUKKwkkKEJJTl9DUFApIHNlcnZlciBzZWN1cmUKKwordHV0b3JpYWxzZWN1cmVzZXJ2ZXJfcGhwOiBhbGwKKwlwaHAgLWYgJChCSU5fUEhQKSBzZXJ2ZXIgc2VjdXJlCiAKIHR1dG9yaWFsc2VjdXJlY2xpZW50OiBhbGwKLQliaW4vTWFpbi1kZWJ1ZyBzZWN1cmUKKwkkKEJJTl9DUFApIHNlY3VyZQorCit0dXRvcmlhbHNlY3VyZWNsaWVudF9waHA6IGFsbAorCXBocCAtZiAkKEJJTl9QSFApIHNlY3VyZQorCit0dXRvcmlhbHNlcnZlcl9waHBfaHR0cDogYWxsCisJcGhwIC1TIDEyNy4wLjAuMTo5MDkwIHJvdXRlci5waHAKKwordHV0b3JpYWxjbGllbnRfaHR0cDogYWxsCisJJChCSU5fQ1BQKSBjbGllbnQgaHR0cAogCiBjbGVhbi1sb2NhbDoKIAkkKFJNKSAtciBnZW4taGF4ZSBiaW4KIAogRVhUUkFfRElTVCA9IFwKLSAgICAgICAgICAgICBzcmMgXAotICAgICAgICAgICAgIGNwcC5oeG1sIFwKLSAgICAgICAgICAgICBjc2hhcnAuaHhtbCBcCi0gICAgICAgICAgICAgZmxhc2guaHhtbCBcCi0gICAgICAgICAgICAgamF2YS5oeG1sIFwKLSAgICAgICAgICAgICBqYXZhc2NyaXB0Lmh4bWwgXAotICAgICAgICAgICAgIG5la28uaHhtbCBcCi0gICAgICAgICAgICAgcGhwLmh4bWwgXAotICAgICAgICAgICAgIHB5dGhvbi5oeG1sIFwKLSAgICAgICAgICAgICBwcm9qZWN0LmhpZGUgXAotICAgICAgICAgICAgIFR1dG9yaWFsLmh4cHJvaiBcCi0gICAgICAgICAgICAgbWFrZV9hbGwuYmF0IFwKLSAgICAgICAgICAgICBtYWtlX2FsbC5zaAorCXNyYyBcCisJY3BwLmh4bWwgXAorCWNzaGFycC5oeG1sIFwKKwlmbGFzaC5oeG1sIFwKKwlqYXZhLmh4bWwgXAorCWphdmFzY3JpcHQuaHhtbCBcCisJcGhwLXdlYi1zZXJ2ZXIuaHhtbCBcCisJbmVrby5oeG1sIFwKKwlwaHAuaHhtbCBcCisJcHl0aG9uLmh4bWwgXAorCXJvdXRlci5waHAgXAorCXByb2plY3QuaGlkZSBcCisJVHV0b3JpYWwuaHhwcm9qIFwKKwltYWtlX2FsbC5iYXQgXAorCW1ha2VfYWxsLnNoCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwgYi90dXRvcmlhbC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1YTg1MgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvcGhwLXdlYi1zZXJ2ZXIuaHhtbApAQCAtMCwwICsxLDQzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUEhQIHRhcmdldAorLXBocCBiaW4vcGhwLXdlYi1zZXJ2ZXIvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAorCisjZGVmaW5lcworLUQgcGhwd2Vic2VydmVyCisKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9waHAuaHhtbCBiL3R1dG9yaWFsL2hheGUvcGhwLmh4bWwKaW5kZXggMWVhYWM4Yi4uYzJmNjg4NyAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvaGF4ZS9waHAuaHhtbAorKysgYi90dXRvcmlhbC9oYXhlL3BocC5oeG1sCkBAIC0yNiw3ICsyNiw4IEBACiAtbWFpbiBNYWluCiAKICNQSFAgdGFyZ2V0Ci0tcGhwIGJpbi9UdXRvcmlhbC5waHAKKy1waHAgYmluL3BocC8KKy0tcGhwLWZyb250IE1haW4tZGVidWcucGhwCiAKICNBZGQgZGVidWcgaW5mb3JtYXRpb24KIC1kZWJ1ZwpAQCAtMzUsNCArMzYsNCBAQAogIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKICMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQogIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQotLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL3JvdXRlci5waHAgYi90dXRvcmlhbC9oYXhlL3JvdXRlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0MTM1YwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvcm91dGVyLnBocApAQCAtMCwwICsxLDMxIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCisKKworLy9yb3V0ZXIgZmlsZSB0byBydW4gdGVzdGluZyB3ZWIgc2VydmVyCisKKy8vc2V0X3RpbWVfbGltaXQoMSk7CisKK3JlcXVpcmVfb25jZSAgZGlybmFtZShfX0ZJTEVfXykgLiAnL2Jpbi9waHAtd2ViLXNlcnZlci9NYWluLWRlYnVnLnBocCc7CisKKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9zcmMvTWFpbi5oeCBiL3R1dG9yaWFsL2hheGUvc3JjL01haW4uaHgKaW5kZXggOGYxNjhjMS4uNmJlYmU3MSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvaGF4ZS9zcmMvTWFpbi5oeAorKysgYi90dXRvcmlhbC9oYXhlL3NyYy9NYWluLmh4CkBAIC01MSw3ICs1MSw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHRhcmdldFBvcnQgOiBJbnQgPSA5MDkwOwogCiAgICAgc3RhdGljIGZ1bmN0aW9uIG1haW4oKSB7Ci0gICAgICAgICNpZiAhIChmbGFzaCB8fCBqcykKKworICAgICAgICAjaWYgISAoZmxhc2ggfHwganMgfHwgcGhwd2Vic2VydmVyKQogICAgICAgICB0cnkgewogICAgICAgICAgICAgICBQYXJzZUFyZ3MoKTsKICAgICAgICAgfSBjYXRjaCAoZSA6IFN0cmluZykgewpAQCAtNTksNiArNjAsMTcgQEAKICAgICAgICAgICAgIHRyYWNlKEdldEhlbHAoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKworICAgICAgICAjZWxzZWlmICBwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgLy9mb3JjaW5nIHNlcnZlcgorICAgICAgICBzZXJ2ZXIgPSB0cnVlOworICAgICAgICB0cm5zID0gaHR0cDsKKyAgICAgICAgaW5pdFBocFdlYlNlcnZlcigpOworICAgICAgICAvL2NoZWNrIG1ldGhvZAorICAgICAgICBpZihwaHAuV2ViLmdldE1ldGhvZCgpICE9ICdQT1NUJykgeworICAgICAgICAgIFN5cy5wcmludGxuKCdodHRwIGVuZHBvaW50IGZvciB0aHJpZnQgdGVzdCBzZXJ2ZXInKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgI2VuZAogCiAgICAgICAgIHRyeSB7CkBAIC03Myw2ICs4NSwyOSBAQAogICAgICAgICB0cmFjZSgiQ29tcGxldGVkLiIpOwogICAgIH0KIAorICAgICNpZiBwaHB3ZWJzZXJ2ZXIKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0UGhwV2ViU2VydmVyKCkKKyAgICB7CisgICAgICAgIC8vcmVtYXAgdHJhY2UgdG8gZXJyb3IgbG9nCisgICAgICAgIGhheGUuTG9nLnRyYWNlID0gZnVuY3Rpb24odjpEeW5hbWljLCA/aW5mb3M6aGF4ZS5Qb3NJbmZvcykKKyAgICAgICAgeworICAgICAgICAgIC8vIGhhbmRsZSB0cmFjZQorICAgICAgICAgIHZhciBuZXdWYWx1ZSA6IER5bmFtaWM7CisgICAgICAgICAgaWYgKGluZm9zICE9IG51bGwgJiYgaW5mb3MuY3VzdG9tUGFyYW1zIT1udWxsKSB7CisgICAgICAgICAgICB2YXIgZXh0cmE6U3RyaW5nID0gIiI7CisgICAgICAgICAgICBmb3IoIHYgaW4gaW5mb3MuY3VzdG9tUGFyYW1zICkKKyAgICAgICAgICAgICAgZXh0cmEgKz0gIiwiICsgdjsKKyAgICAgICAgICAgIG5ld1ZhbHVlID0gdiArIGV4dHJhOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG5ld1ZhbHVlID0gdjsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIG1zZyA9IGluZm9zICE9IG51bGwgPyBpbmZvcy5maWxlTmFtZSArICc6JyArIGluZm9zLmxpbmVOdW1iZXIgKyAnOiAnIDogJyc7CisgICAgICAgICAgU3lzLnN0ZGVycigpLndyaXRlU3RyaW5nKCcke21zZ30ke25ld1ZhbHVlfVxuJyk7CisgICAgICAgIH0KKyAgICB9CisgICAgI2VuZAorCiAKICAgICAjaWYgISAoZmxhc2ggfHwganMpCiAKQEAgLTE1NCw4ICsxODksOSBAQAogICAgICAgICAgICAgIHRyYWNlKCctIHNvY2tldCB0cmFuc3BvcnQgJHRhcmdldEhvc3Q6JHRhcmdldFBvcnQnKTsKICAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCB0YXJnZXRIb3N0LCB0YXJnZXRQb3J0KTsKICAgICAgICAgY2FzZSBodHRwOgotICAgICAgICAgICAgIHRyYWNlKCctIEhUVFAgdHJhbnNwb3J0ICR0YXJnZXRIb3N0Jyk7Ci0gICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnQoIHRhcmdldEhvc3QpOworICAgICAgICAgICAgdmFyIHVyaSA9ICdodHRwOi8vJHt0YXJnZXRIb3N0fToke3RhcmdldFBvcnR9JzsKKyAgICAgICAgICAgIHRyYWNlKCctIEhUVFAgdHJhbnNwb3J0ICR1cmknKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudCh1cmkpOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0cmFuc3BvcnQiOwogICAgICAgICB9CkBAIC0yNjcsOSArMzAzLDIwIEBACiAgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCggdGFyZ2V0UG9ydCk7CiAgICAgICAgICAgICAjZW5kCiAgICAgICAgIGNhc2UgaHR0cDoKLSAgICAgICAgICAgIHRocm93ICJIVFRQIHNlcnZlciBub3QgaW1wbGVtZW50ZWQgeWV0IjsKLSAgICAgICAgICAgICAvL3RyYWNlKCItIGh0dHAgdHJhbnNwb3J0Iik7Ci0gICAgICAgICAgICAgLy90cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnQoIHRhcmdldEhvc3QpOworICAgICAgICAgICAgI2lmICFwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgICAgICAgdGhyb3cgIkhUVFAgc2VydmVyIG5vdCBpbXBsZW1lbnRlZCB5ZXQiOworICAgICAgICAgICAgICAvL3RyYWNlKCItIGh0dHAgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgIC8vdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50KCB0YXJnZXRIb3N0KTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgIHRyYWNlKCItIGh0dHAgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgbmV3IFRTdHJlYW1UcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEZpbGVTdHJlYW0oInBocDovL2lucHV0IiwgUmVhZCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEZpbGVTdHJlYW0oInBocDovL291dHB1dCIsIEFwcGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAjZW5kCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHRyYW5zcG9ydCI7CiAgICAgICAgIH0KQEAgLTMwMSw2ICszNDgsMTAgQEAKICAgICAgICAgdmFyIGhhbmRsZXIgPSBuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKTsKICAgICAgICAgdmFyIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKGhhbmRsZXIpOwogICAgICAgICB2YXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc2ZhY3RvcnksIHByb3RmYWN0b3J5KTsKKyAgICAgICAgI2lmIHBocHdlYnNlcnZlcgorICAgICAgICBzZXJ2ZXIucnVuT25jZSA9IHRydWU7CisgICAgICAgICNlbmQKKwogICAgICAgICByZXR1cm4gc2VydmVyOwogICAgIH0KIApAQCAtMzIxLDQgKzM3Miw0IEBACiAgICAgfQogCiB9Ci0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ocy9MSUNFTlNFIGIvdHV0b3JpYWwvaHMvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjZkN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaHMvTElDRU5TRQpAQCAtMCwwICsxLDIzOSBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NPRlRXQVJFIERJU1RSSUJVVEVEIFdJVEggVEhSSUZUOgorCitUaGUgQXBhY2hlIFRocmlmdCBzb2Z0d2FyZSBpbmNsdWRlcyBhIG51bWJlciBvZiBzdWJjb21wb25lbnRzIHdpdGgKK3NlcGFyYXRlIGNvcHlyaWdodCBub3RpY2VzIGFuZCBsaWNlbnNlIHRlcm1zLiBZb3VyIHVzZSBvZiB0aGUgc291cmNlCitjb2RlIGZvciB0aGUgdGhlc2Ugc3ViY29tcG9uZW50cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BvcnRpb25zIG9mIHRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZToKKworICBsaWIvZXJsL3NyYy9NYWtlZmlsZS5hbQorCitQbGVhc2Ugc2VlIGRvYy9vdHAtYmFzZS1saWNlbnNlLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRoZSBhY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQgYW5kIGNvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGNvbXBvbmVudHM6CisKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDcgVGhvbWFzIFBvcnNjaGJlcmcgPHRob21hc0ByYW5kc3ByaW5nZXIuZGU+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0CisjICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkCisjICAgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGb3IgdGhlIGxpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzOgorCisvKgorICAgIGpzb25fcGFyc2UuanMKKyAgICAyMDE1LTA1LTAyCisgICAgUHVibGljIERvbWFpbi4KKyAgICBOTyBXQVJSQU5UWSBFWFBSRVNTRUQgT1IgSU1QTElFRC4gVVNFIEFUIFlPVVIgT1dOIFJJU0suCisKKyovCisoQnkgRG91Z2xhcyBDcm9ja2ZvcmQgPGRvdWdsYXNAY3JvY2tmb3JkLmNvbT4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaHMvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9ocy9NYWtlZmlsZS5hbQppbmRleCBmMjc0ZWI2Li45YzZmZDgzIDEwMDc1NQotLS0gYS90dXRvcmlhbC9ocy9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9ocy9NYWtlZmlsZS5hbQpAQCAtMjcsNyArMjcsMTIgQEAKICMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIEhhc2tlbGwgaXMgbm90IGNvbmZpZ3VyZWQuCiBjbGVhbi1sb2NhbDoKIAkkKENBQkFMKSBjbGVhbgotCSQoUk0pIC1yIGdlbi0qCisJJChSTSkgLXIgZGlzdC8KKwkkKFJNKSAtciBnZW4tKi8KKworZGlzdC1ob29rOgorCSQoUk0pIC1yICQoZGlzdGRpcikvZGlzdC8KKwkkKFJNKSAtciAkKGRpc3RkaXIpL2dlbi0qLwogCiBjaGVjay1sb2NhbDoKIAkkKENBQkFMKSBjaGVjawpAQCAtMzcsMyArNDIsNiBAQAogCiB0dXRvcmlhbGNsaWVudDogYWxsCiAJZGlzdC9idWlsZC9IYXNrZWxsQ2xpZW50L0hhc2tlbGxDbGllbnQKKworRVhUUkFfRElTVCA9IFwKKwlMSUNFTlNFCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbCBiL3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsCmluZGV4IGU2ZjAxODIuLmI2YTYxMjIgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsCisrKyBiL3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsCkBAIC0xOCw3ICsxOCw3IEBACiAtLQogCiBOYW1lOiAgICAgICAgICAgVGhyaWZ0VHV0b3JpYWwKLVZlcnNpb246ICAgICAgICAwLjEuMAorVmVyc2lvbjogICAgICAgIDAuMTMuMAogQ2FiYWwtVmVyc2lvbjogID49IDEuNAogTGljZW5zZTogICAgICAgIE90aGVyTGljZW5zZQogQ2F0ZWdvcnk6ICAgICAgIEZvcmVpZ24KQEAgLTI3LDcgKzI3LDcgQEAKIEhvbWVwYWdlOiAgICAgICBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKIEJ1Zy1SZXBvcnRzOiAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVAogTWFpbnRhaW5lcjogICAgIGRldkB0aHJpZnQuYXBhY2hlLm9yZwotTGljZW5zZS1GaWxlOiAgIC4uLy4uL0xJQ0VOU0UKK0xpY2Vuc2UtRmlsZTogICBMSUNFTlNFCiAKIERlc2NyaXB0aW9uOgogICBIYXNrZWxsIHR1dG9yaWFsIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLiBSZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbCBiL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCmluZGV4IDc2MzhkNWIuLjU1Y2RiOGYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCisrKyBiL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCkBAIC0yNSwxMSArMjUsMTMgQEAKICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiBsb2NhdGlvbj0iYnVpbGQiIC8+CiAKICAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkIj4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iLXRlc3QuamFyIiAvPgorICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvbGlicyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCp0ZXN0LmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+Ci0gICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIvamF2YS9idWlsZC9saWIiPgorICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvZGVwcyI+CiAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+CiAgIDwvcGF0aD4KQEAgLTQyLDcgKzQ0LDcgQEAKICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtidWlsZH0iIC8+CiAgICAgPHBhdGhlbGVtZW50IHBhdGg9InR1dG9yaWFsLmphciIgLz4KICAgPC9wYXRoPgotICAKKwogICA8dGFyZ2V0IG5hbWU9ImluaXQiPgogICAgIDx0c3RhbXAgLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfSIvPgpAQCAtNTAsOCArNTIsOCBAQAogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQsIGdlbmVyYXRlIj4KLSAgICA8amF2YWMgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCIgLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCIgLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJ0dXRvcmlhbCIgLz4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2pzL2J1aWxkLnhtbCBiL3R1dG9yaWFsL2pzL2J1aWxkLnhtbAppbmRleCBhOWE5YWQ0Li4wM2E2ZTdjIDEwMDY0NAotLS0gYS90dXRvcmlhbC9qcy9idWlsZC54bWwKKysrIGIvdHV0b3JpYWwvanMvYnVpbGQueG1sCkBAIC0zMSwxMSArMzEsMTMgQEAKICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vbGliL2phdmEiIC8+CiAKICAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkIj4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iLXRlc3QuamFyIiAvPgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0ibGlidGhyaWZ0Ki5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqdGVzdC5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CiAgICAgPC9maWxlc2V0PgotICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvbGliIj4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9kZXBzIj4KICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgogICAgIDwvZmlsZXNldD4KICAgPC9wYXRoPgpAQCAtNTEsMTMgKzUzLDEzIEBACiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2dlbn0iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIiAvPgotICAgIDxqYXZhYyBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtqYXZhc3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIj4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2phdmFzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgogICAgICAgPGV4Y2x1ZGUgbmFtZT0iSmF2YUNsaWVudC5qYXZhIi8+CiAgICAgICA8ZXhjbHVkZSBuYW1lPSJKYXZhU2VydmVyLmphdmEiLz4KICAgICAgIDxpbmNsdWRlIG5hbWU9IkNhbGN1bGF0b3JIYW5kbGVyLmphdmEiLz4KICAgICA8L2phdmFjPgotICAgIDxqYXZhYyBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgogICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6YWxsIi8+CiAgICAgPC9qYXZhYz4KICAgPC90YXJnZXQ+CkBAIC04MCw3ICs4Miw3IEBACiAgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzIC1yICAuLi90dXRvcmlhbC50aHJpZnQiLz4KICAgICA8L2V4ZWM+CiAgIDwvdGFyZ2V0PgotICAKKwogICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iIC8+CiAgICAgPGRlbGV0ZSBkaXI9Imdlbi1qcyIvPgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvanMvdHV0b3JpYWwuaHRtbCBiL3R1dG9yaWFsL2pzL3R1dG9yaWFsLmh0bWwKaW5kZXggZDdmMzk0NS4uZDAyMGJlZCAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvanMvdHV0b3JpYWwuaHRtbAorKysgYi90dXRvcmlhbC9qcy90dXRvcmlhbC5odG1sCkBAIC05OCw3ICs5OCw3IEBACiAgIDwvdGFibGU+CiAgIDwvZm9ybT4KICAgCi0gIDxwPlRoaXMgSmF2YSBTY3JpcHQgZXhhbXBsZSB1c2VzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQ7YT1ibG9iO2Y9dHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0O2hiPUhFQUQiPnR1dG9yaWFsLnRocmlmdDwvYT4gYW5kIGEgVGhyaWZ0IHNlcnZlciB1c2luZyBKU09OIHByb3RvY29sIGFuZCBIVFRQIHRyYW5zcG9ydC4KKyAgPHA+VGhpcyBKYXZhIFNjcmlwdCBleGFtcGxlIHVzZXMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0Ij50dXRvcmlhbC50aHJpZnQ8L2E+IGFuZCBhIFRocmlmdCBzZXJ2ZXIgdXNpbmcgSlNPTiBwcm90b2NvbCBhbmQgSFRUUCB0cmFuc3BvcnQuCiAgIDwvcD4KICAgICA8cD4KICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS8uZ2l0aWdub3JlIGIvdHV0b3JpYWwvbmV0Y29yZS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzhiYjIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorISoqLyoucGZ4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvaiBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExMjcyZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2oKQEAgLTAsMCArMSwxOSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisKKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5DbGllbnQ8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPkNsaWVudDwvUGFja2FnZUlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cSW50ZXJmYWNlc1xJbnRlcmZhY2VzLmNzcHJvaiIgLz4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcbmV0Y29yZVxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb2dyYW0uY3MgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNWQ4YzcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsMzU1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmc7Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7Cit1c2luZyB0dXRvcmlhbDsKK3VzaW5nIHNoYXJlZDsKKworbmFtZXNwYWNlIENsaWVudAoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTG9nZ2VyIExvZ2dlciA9IG5ldyBMb2dnZXJGYWN0b3J5KCkuQWRkQ29uc29sZSgpLkFkZERlYnVnKCkuQ3JlYXRlTG9nZ2VyKG5hbWVvZihDbGllbnQpKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIERpc3BsYXlIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKEAiCitVc2FnZTogCisgICAgQ2xpZW50LmV4ZSAtaGVscAorICAgICAgICB3aWxsIGRpcGxheSBoZWxwIGluZm9ybWF0aW9uIAorCisgICAgQ2xpZW50LmV4ZSAtdHI6PHRyYW5zcG9ydD4gLXByOjxwcm90b2NvbD4gLW1jOjxudW1DbGllbnRzPgorICAgICAgICB3aWxsIHJ1biBjbGllbnQgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzICh0Y3AgdHJhbnNwb3J0IGFuZCBiaW5hcnkgcHJvdG9jb2wgYnkgZGVmYXVsdCkgYW5kIHdpdGggMSBjbGllbnQKKworT3B0aW9uczoKKyAgICAtdHIgKHRyYW5zcG9ydCk6IAorICAgICAgICB0Y3AgLSAoZGVmYXVsdCkgdGNwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgdGNwYnVmZmVyZWQgLSBidWZmZXJlZCB0cmFuc3BvcnQgb3ZlciB0Y3Agd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIG5hbWVkcGlwZSAtIG5hbWVkcGlwZSB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChwaXBlIGFkZHJlc3MgLSAiIi50ZXN0IiIpCisgICAgICAgIGh0dHAgLSBodHRwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGFkZHJlc3MgLSAiImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIiKSAgICAgICAgCisgICAgICAgIHRjcHRscyAtIHRjcCB0bHMgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBtdWx0aXBsZXhlZCAtIG11bHRpcGxleGVkIHByb3RvY29sIHdpbGwgYmUgdXNlZAorCisgICAgLW1jIChtdWx0aXBsZSBjbGllbnRzKToKKyAgICAgICAgPG51bUNsaWVudHM+IC0gbnVtYmVyIG9mIG11bHRpcGxlIGNsaWVudHMgdG8gY29ubmVjdCB0byBzZXJ2ZXIgKG1heCAxMDAsIGRlZmF1bHQgMSkKKworU2FtcGxlOgorICAgIENsaWVudC5leGUgLXRyOnRjcCAtcDpiaW5hcnkKKyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgYXJncyA9IGFyZ3MgPz8gbmV3IHN0cmluZ1swXTsKKworICAgICAgICAgICAgaWYgKGFyZ3MuQW55KHggPT4geC5TdGFydHNXaXRoKCItaGVscCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaXNwbGF5SGVscCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJTdGFydGluZyBjbGllbnQuLi4iKTsKKworICAgICAgICAgICAgdXNpbmcgKHZhciBzb3VyY2UgPSBuZXcgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSdW5Bc3luYyhhcmdzLCBzb3VyY2UuVG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuQXN5bmMoc3RyaW5nW10gYXJncywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBudW1DbGllbnRzID0gR2V0TnVtYmVyT2ZDbGllbnRzKGFyZ3MpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJTZWxlY3RlZCAjIG9mIGNsaWVudHM6IHtudW1DbGllbnRzfSIpOworCisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0cyA9IG5ldyBUQ2xpZW50VHJhbnNwb3J0W251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHQgPSBHZXRUcmFuc3BvcnQoYXJncyk7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0c1tpXSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIlNlbGVjdGVkIGNsaWVudCB0cmFuc3BvcnQ6IHt0cmFuc3BvcnRzWzBdfSIpOworCisgICAgICAgICAgICB2YXIgcHJvdG9jb2xzID0gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+W251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHAgPSBHZXRQcm90b2NvbChhcmdzLCB0cmFuc3BvcnRzW2ldKTsKKyAgICAgICAgICAgICAgICBwcm90b2NvbHNbaV0gPSBwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJTZWxlY3RlZCBjbGllbnQgcHJvdG9jb2w6IHtwcm90b2NvbHNbMF0uSXRlbTF9Iik7CisKKyAgICAgICAgICAgIHZhciB0YXNrcyA9IG5ldyBUYXNrW251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBSdW5DbGllbnRBc3luYyhwcm90b2NvbHNbaV0sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB0YXNrc1tpXSA9IHRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRhc2suV2FpdEFsbCh0YXNrcyk7CisKKyAgICAgICAgICAgIGF3YWl0IFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFRDbGllbnRUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItdHIiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBUcmFuc3BvcnQgc2VsZWN0ZWRUcmFuc3BvcnQ7CisgICAgICAgICAgICBpZiAoRW51bS5UcnlQYXJzZSh0cmFuc3BvcnQsIHRydWUsIG91dCBzZWxlY3RlZFRyYW5zcG9ydCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzZWxlY3RlZFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5OYW1lZFBpcGU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoIi50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0Lkh0dHA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KG5ldyBVcmkoImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwQnVmZmVyZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydChuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwVGxzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCwgR2V0Q2VydGlmaWNhdGUoKSwgQ2VydFZhbGlkYXRvciwgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuRnJhbWVkOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgR2V0TnVtYmVyT2ZDbGllbnRzKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBudW1DbGllbnRzID0gYXJncy5GaXJzdE9yRGVmYXVsdCh4ID0+IHguU3RhcnRzV2l0aCgiLW1jIikpPy5TcGxpdCgnOicpP1sxXTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiU2VsZWN0ZWQgIyBvZiBjbGllbnRzOiB7bnVtQ2xpZW50c30iKTsKKworICAgICAgICAgICAgaW50IGM7CisgICAgICAgICAgICBpZiggaW50LlRyeVBhcnNlKG51bUNsaWVudHMsIG91dCBjKSAmJiAoMCA8IGMpICYmIChjIDw9IDEwMCkpCisJCQkJcmV0dXJuIGM7CisJCQllbHNlCisJCQkJcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUyIEdldENlcnRpZmljYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZHVlIHRvIGZpbGVzIGxvY2F0aW9uIGluIG5ldCBjb3JlIGJldHRlciB0byB0YWtlIGNlcnRzIGZyb20gdG9wIGZvbGRlcgorICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0gR2V0Q2VydFBhdGgoRGlyZWN0b3J5LkdldFBhcmVudChEaXJlY3RvcnkuR2V0Q3VycmVudERpcmVjdG9yeSgpKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydEZpbGUsICJUaHJpZnRUZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0Q2VydFBhdGgoRGlyZWN0b3J5SW5mbyBkaSwgaW50IG1heENvdW50ID0gNikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRvcERpciA9IGRpOworICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0KKyAgICAgICAgICAgICAgICB0b3BEaXIuRW51bWVyYXRlRmlsZXMoIlRocmlmdFRlc3QucGZ4IiwgU2VhcmNoT3B0aW9uLkFsbERpcmVjdG9yaWVzKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChjZXJ0RmlsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtYXhDb3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBmaWxlIGluIGRpcmVjdG9yaWVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldENlcnRQYXRoKGRpLlBhcmVudCwgbWF4Q291bnQgLSAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNlcnRGaWxlLkZ1bGxOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayhvYmplY3Qgc2VuZGVyLAorICAgICAgICAgICAgc3RyaW5nIHRhcmdldEhvc3QsIFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24gbG9jYWxDZXJ0aWZpY2F0ZXMsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgcmVtb3RlQ2VydGlmaWNhdGUsIHN0cmluZ1tdIGFjY2VwdGFibGVJc3N1ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0Q2VydGlmaWNhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgQ2VydFZhbGlkYXRvcihvYmplY3Qgc2VuZGVyLCBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBYNTA5Q2hhaW4gY2hhaW4sIFNzbFBvbGljeUVycm9ycyBzc2xQb2xpY3lFcnJvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4gR2V0UHJvdG9jb2woc3RyaW5nW10gYXJncywgVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IGFyZ3MuRmlyc3RPckRlZmF1bHQoeCA9PiB4LlN0YXJ0c1dpdGgoIi1wciIpKT8uU3BsaXQoJzonKT9bMV07CisKKyAgICAgICAgICAgIFByb3RvY29sIHNlbGVjdGVkUHJvdG9jb2w7CisgICAgICAgICAgICBpZiAoRW51bS5UcnlQYXJzZShwcm90b2NvbCwgdHJ1ZSwgb3V0IHNlbGVjdGVkUHJvdG9jb2wpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2VsZWN0ZWRQcm90b2NvbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuQmluYXJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPihzZWxlY3RlZFByb3RvY29sLCBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkNvbXBhY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkpzb246CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLk11bHRpcGxleGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgcmV0dXJucyBCaW5hcnlQcm90b2NvbCB0byBhdm9pZCBtYWtpbmcgd3JhcHBlZCBwcm90b2NvbCBhcyBwdWJsaWMgaW4gVFByb3RvY29sRGVjb3JhdG9yIChpbiBSdW5DbGllbnRBc3luYyBpdCB3aWxsIGJlIHdyYXBwZWQgaW50byBNdWx0aXBsZXhlZCBwcm90b2NvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuQ2xpZW50QXN5bmMoVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4gcHJvdG9jb2xUdXBsZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHByb3RvY29sVHVwbGUuSXRlbTI7CisgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sVHlwZSA9IHByb3RvY29sVHVwbGUuSXRlbTE7CisKKyAgICAgICAgICAgICAgICBUQmFzZUNsaWVudCBjbGllbnQgPSBudWxsOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2xUeXBlICE9IFByb3RvY29sLk11bHRpcGxleGVkKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBFeGVjdXRlQ2FsY3VsYXRvckNsaWVudE9wZXJhdGlvbnMoY2FuY2VsbGF0aW9uVG9rZW4sIChDYWxjdWxhdG9yLkNsaWVudCljbGllbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgdXNlcyBiaW5hcnkgcHJvdG9jb2wgdGhlcmUgIHRvIGNyZWF0ZSBNdWx0aXBsZXhlZCBwcm90b2NvbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsIG5hbWVvZihDYWxjdWxhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXVsdGlwbGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEV4ZWN1dGVDYWxjdWxhdG9yQ2xpZW50T3BlcmF0aW9ucyhjYW5jZWxsYXRpb25Ub2tlbiwgKENhbGN1bGF0b3IuQ2xpZW50KWNsaWVudCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgbmFtZW9mKFNoYXJlZFNlcnZpY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBTaGFyZWRTZXJ2aWNlLkNsaWVudChtdWx0aXBsZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgRXhlY3V0ZVNoYXJlZFNlcnZpY2VDbGllbnRPcGVyYXRpb25zKGNhbmNlbGxhdGlvblRva2VuLCAoU2hhcmVkU2VydmljZS5DbGllbnQpY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKCQie2NsaWVudD8uQ2xpZW50SWR9ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLlRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nRXJyb3IoeC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgRXhlY3V0ZUNhbGN1bGF0b3JDbGllbnRPcGVyYXRpb25zKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuLCBDYWxjdWxhdG9yLkNsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC5PcGVuVHJhbnNwb3J0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAvLyBBc3luYyB2ZXJzaW9uCisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFBpbmdBc3luYygpIik7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQucGluZ0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gQWRkQXN5bmMoMSwxKSIpOworICAgICAgICAgICAgdmFyIHN1bSA9IGF3YWl0IGNsaWVudC5hZGRBc3luYygxLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBBZGRBc3luYygxLDEpPXtzdW19Iik7CisKKyAgICAgICAgICAgIHZhciB3b3JrID0gbmV3IFdvcmsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPcCA9IE9wZXJhdGlvbi5ESVZJREUsCisgICAgICAgICAgICAgICAgTnVtMSA9IDEsCisgICAgICAgICAgICAgICAgTnVtMiA9IDAKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IENhbGN1bGF0ZUFzeW5jKDEpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LmNhbGN1bGF0ZUFzeW5jKDEsIHdvcmssIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gSW52YWxpZCBvcGVyYXRpb246ICIgKyBpbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7CisgICAgICAgICAgICB3b3JrLk51bTEgPSAxNTsKKyAgICAgICAgICAgIHdvcmsuTnVtMiA9IDEwOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBDYWxjdWxhdGVBc3luYygxKSIpOworICAgICAgICAgICAgICAgIHZhciBkaWZmID0gYXdhaXQgY2xpZW50LmNhbGN1bGF0ZUFzeW5jKDEsIHdvcmssIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSAxNS0xMD17ZGlmZn0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IEludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBHZXRTdHJ1Y3RBc3luYygxKSIpOworICAgICAgICAgICAgdmFyIGxvZyA9IGF3YWl0IGNsaWVudC5nZXRTdHJ1Y3RBc3luYygxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBDaGVjayBsb2c6IHtsb2cuVmFsdWV9Iik7CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFppcEFzeW5jKCkgd2l0aCBkZWxheSAxMDBtYyBvbiBzZXJ2ZXIgc2lkZSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnppcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIEV4ZWN1dGVTaGFyZWRTZXJ2aWNlQ2xpZW50T3BlcmF0aW9ucyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbiwgU2hhcmVkU2VydmljZS5DbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQuT3BlblRyYW5zcG9ydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgLy8gQXN5bmMgdmVyc2lvbgorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBTaGFyZWRTZXJ2aWNlIEdldFN0cnVjdEFzeW5jKDEpIik7CisgICAgICAgICAgICB2YXIgbG9nID0gYXdhaXQgY2xpZW50LmdldFN0cnVjdEFzeW5jKDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFNoYXJlZFNlcnZpY2UgVmFsdWU6IHtsb2cuVmFsdWV9Iik7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgZW51bSBUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgVGNwLAorICAgICAgICAgICAgTmFtZWRQaXBlLAorICAgICAgICAgICAgSHR0cCwKKyAgICAgICAgICAgIFRjcEJ1ZmZlcmVkLAorICAgICAgICAgICAgRnJhbWVkLAorICAgICAgICAgICAgVGNwVGxzCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gUHJvdG9jb2wKKyAgICAgICAgeworICAgICAgICAgICAgQmluYXJ5LAorICAgICAgICAgICAgQ29tcGFjdCwKKyAgICAgICAgICAgIEpzb24sCisgICAgICAgICAgICBNdWx0aXBsZXhlZAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjgzODJlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiZGU3OGEwMWItZjdjNi00OWQxLTk3ZGEtNjY5ZDJlZDM3NjQxIildClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiN2I2MGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24KQEAgLTAsMCArMSw4IEBACit7CisgICJwcm9maWxlcyI6IHsKKyAgICAiQ2xpZW50IjogeworICAgICAgImNvbW1hbmROYW1lIjogIlByb2plY3QiLAorICAgICAgImNvbW1hbmRMaW5lQXJncyI6ICItcDptdWx0aXBsZXhlZCIKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9UaHJpZnRUZXN0LnBmeCBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1RocmlmdFRlc3QucGZ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZGVkMjgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9UaHJpZnRUZXN0LnBmeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvLmdpdGlnbm9yZSBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzQ0NmUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKKyMgaWdub3JlIGZvciBhdXRvZ2VuZXJhdGVkIGZpbGVzCisvc2hhcmVkCisvdHV0b3JpYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9JbnRlcmZhY2VzLmNzcHJvaiBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9JbnRlcmZhY2VzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk3YTA2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzL0ludGVyZmFjZXMuY3Nwcm9qCkBAIC0wLDAgKzEsMzAgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0c3RhbmRhcmQyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPkludGVyZmFjZXM8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPkludGVyZmFjZXM8L1BhY2thZ2VJZD4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi4vLi4vLi4vbGliL25ldGNvcmUvVGhyaWZ0L1RocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbC5QcmltaXRpdmVzIiBWZXJzaW9uPSJbNC40LCkiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxUYXJnZXQgTmFtZT0iUHJlQnVpbGQiIEJlZm9yZVRhcmdldHM9Il9HZW5lcmF0ZVJlc3RvcmVQcm9qZWN0U3BlYztSZXN0b3JlO0NvbXBpbGUiPgorICAgIDxFeGVjIENvbmRpdGlvbj0iJyQoT1MpJyA9PSAnV2luZG93c19OVCciIENvbW1hbmQ9IndoZXJlIHRocmlmdCIgQ29uc29sZVRvTVNCdWlsZD0idHJ1ZSI+CisgICAgICA8T3V0cHV0IFRhc2tQYXJhbWV0ZXI9IkNvbnNvbGVPdXRwdXQiIFByb3BlcnR5TmFtZT0iUGF0aFRvVGhyaWZ0IiAvPgorICAgIDwvRXhlYz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQYXRoVG9UaHJpZnQpJykiIENvbW1hbmQ9IiQoUGF0aFRvVGhyaWZ0KSAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi90dXRvcmlhbC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vdHV0b3JpYWwudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCcuLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iLi8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL3R1dG9yaWFsLnRocmlmdCIgLz4KKyAgPC9UYXJnZXQ+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTI2YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoIjRkMTMxNjNkLTkwNjctNGM5Yy04YWYwLTY0ZTA4NDUxMzk3ZCIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTlkZmUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLiAKKworYWxsLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgSW50ZXJmYWNlcy5kbGwKKwkkKFJNKSAtciBDbGllbnQvYmluCisJJChSTSkgLXIgQ2xpZW50L29iagorCSQoUk0pIC1yIFNlcnZlci9iaW4KKwkkKFJNKSAtciBTZXJ2ZXIvb2JqCisJJChSTSkgLXIgSW50ZXJmYWNlcy9iaW4KKwkkKFJNKSAtciBJbnRlcmZhY2VzL29iagorCitkaXN0LWhvb2s6CisJJChSTSkgJChkaXN0ZGlyKS9JbnRlcmZhY2VzLmRsbAorCSQoUk0pIC1yICQoZGlzdGRpcikvQ2xpZW50L2JpbgorCSQoUk0pIC1yICQoZGlzdGRpcikvQ2xpZW50L29iagorCSQoUk0pIC1yICQoZGlzdGRpcikvU2VydmVyL2JpbgorCSQoUk0pIC1yICQoZGlzdGRpcikvU2VydmVyL29iagorCSQoUk0pIC1yICQoZGlzdGRpcikvSW50ZXJmYWNlcy9iaW4KKwkkKFJNKSAtciAkKGRpc3RkaXIpL0ludGVyZmFjZXMvb2JqCisKK0VYVFJBX0RJU1QgPSBcCisJQ2xpZW50IFwKKwlJbnRlcmZhY2VzIFwKKwlSRUFETUUubWQgXAorCVNlcnZlciBcCisJVHV0b3JpYWwuc2xuIFwKKwlidWlsZC5jbWQgXAorCWJ1aWxkLnNoCisJCQkgCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1JFQURNRS5tZCBiL3R1dG9yaWFsL25ldGNvcmUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNmVmOTIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1JFQURNRS5tZApAQCAtMCwwICsxLDI3OCBAQAorIyBCdWlsZGluZyBvZiBzYW1wbGVzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zIAorCisjIFJldXNlZCBjb21wb25lbnRzIAorLSBORVQgQ29yZSBTdGFuZGFyZCAyLjAKKy0gTkVUIENvcmUgQXBwIDIuMAorCisjIEhvdyB0byBidWlsZAorLSBEb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgbGF0ZXN0IC5ORVQgQ29yZSBTREsgZm9yIHlvdXIgcGxhdGZvcm0gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS9uZXQvY29yZSN3aW5kb3dzdnMyMDE1IChhcmNoaXZlIGZvciBTREsgMS4wLjAtcHJldmlldzItMDAzMTIxIGxvY2F0ZWQgYnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9kb3RuZXQvY29yZS9ibG9iL21hc3Rlci9yZWxlYXNlLW5vdGVzL2Rvd25sb2FkLWFyY2hpdmUubWQpCistIEVuc3VyZSB0aGF0IHlvdSBoYXZlIHRocmlmdC5leGUgd2hpY2ggc3VwcG9ydHMgbmV0Y29yZSBsaWIgYW5kIGl0IGFkZGVkIHRvIFBBVEggCistIEdvIHRvIGN1cnJlbnQgZm9sZGVyIAorLSBSdW4gKipidWlsZC5zaCoqIG9yICoqYnVpbGQuY21kKiogZnJvbSB0aGUgcm9vdCBvZiBjbG9uZWQgcmVwb3NpdG9yeQorLSBDaGVjayB0ZXN0cyBpbiAqKnNyYy9UZXN0cyoqIGZvbGRlcgorLSBDb250aW51ZSB3aXRoIC90dXRvcmlhbHMvbmV0Y29yZSAKKworIyBIb3cgdG8gcnVuIAorCitOb3RlczogZG90bmV0IHJ1biBzdXBwb3J0cyBwYXNzaW5nIGFyZ3VtZW50cyB0byBhcHAgYWZ0ZXIgLS0gc3ltYm9scyAoaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvZG90bmV0L2FydGljbGVzL2NvcmUvdG9vbHMvZG90bmV0LXJ1bikgLSBleGFtcGxlOiAqKmRvdG5ldCBydW4gLS0gLWgqKiB3aWxsIHNob3cgaGVscCBmb3IgYXBwCisKKy0gYnVpbGQgCistIGdvIHRvIGZvbGRlciAoQ2xpZW50L1NlcnZlcikgCistIHJ1biB3aXRoIHNwZWNpZnlpbmcgb2YgY29ycmVjdCBwYXJhbWV0ZXJzICoqZG90bmV0IHJ1biAtdHI6dGNwIC1wcjptdWx0aXBsZXhlZCoqLCAqKmRvdG5ldCBydW4gLWhlbHAqKiAobGF0ZXIsIGFmdGVyIG1pZ3JhdGlvbiB0byBjc3Byb2ogYW5kIGxhdGVzdCBTREsgd2lsbCBiZSBwb3NzaWJpbGl0eSB0byB1c2UgbW9yZSB1c2FibGUgZm9ybSAqKmRvdG5ldCBydW4gLS0gYXJndW1lbnRzKiopCisKKyNOb3RlcworLSBQb3NzaWJsZSBhZGRpbmcgYWRkaXRpb25hbCBwbGF0Zm9ybXMgYWZ0ZXIgc3RhYmlsaXphdGlvbiBvZiAuTkVUIENvcmUgKHJ1bnRpbWVzLCBwbGF0Zm9ybXMgKFJlZCBIYXQgTGludXgsIE9wZW5TdXNlLCBldGMuKSAKKworI0tub3duIGlzc3VlcworLSBJbiB0cmFjZSBsb2dnaW5nIG1vZGUgeW91IGNhbiBzZWUgc29tZSBub3QgaW1wb3J0YW50IGludGVybmFsIGV4Y2VwdGlvbnMKKworIyBSdW5uaW5nIG9mIHNhbXBsZXMgCitQbGVhc2UgaW5zdGFsbCBUaHJpZnQgQyMgLk5FVCBDb3JlIGxpYnJhcnkgb3IgY29weSBzb3VyY2VzIGFuZCBidWlsZCB0aGVtIHRvIGNvcnJlY2x5IGJ1aWxkIGFuZCBydW4gc2FtcGxlcyAKKworIyBOZXRDb3JlIFNlcnZlcgorCitVc2FnZTogCisKKyAgICBTZXJ2ZXIuZXhlIC1oCisgICAgICAgIHdpbGwgZGlwbGF5IGhlbHAgaW5mb3JtYXRpb24gCisKKyAgICBTZXJ2ZXIuZXhlIC10cjo8dHJhbnNwb3J0PiAtcHI6PHByb3RvY29sPiAKKyAgICAgICAgd2lsbCBydW4gc2VydmVyIHdpdGggc3BlY2lmaWVkIGFyZ3VtZW50cyAodGNwIHRyYW5zcG9ydCBhbmQgYmluYXJ5IHByb3RvY29sIGJ5IGRlZmF1bHQpCisKK09wdGlvbnM6CisKKyAgICAtdHIgKHRyYW5zcG9ydCk6IAorICAgICAgICB0Y3AgLSAoZGVmYXVsdCkgdGNwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgdGNwYnVmZmVyZWQgLSB0Y3AgYnVmZmVyZWQgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBuYW1lZHBpcGUgLSBuYW1lZHBpcGUgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAocGlwZSBhZGRyZXNzIC0gIiIudGVzdCIiKQorICAgICAgICBodHRwIC0gaHR0cCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChodHRwIGFkZHJlc3MgLSAiImxvY2FsaG9zdDo5MDkwIiIpCisgICAgICAgIHRjcHRscyAtIHRjcCB0cmFuc3BvcnQgd2l0aCB0bHMgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIGZyYW1lZCAtIHRjcCBmcmFtZWQgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorCisgICAgLXByIChwcm90b2NvbCk6IAorICAgICAgICBiaW5hcnkgLSAoZGVmYXVsdCkgYmluYXJ5IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBjb21wYWN0IC0gY29tcGFjdCBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAganNvbiAtIGpzb24gcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisJCQorU2FtcGxlOgorCisgICAgU2VydmVyLmV4ZSAtdHI6dGNwCisKKyoqUmVtYXJrcyoqOgorCisgICAgRm9yIFRjcFRscyBtb2RlIGNlcnRpZmljYXRlJ3MgZmlsZSBUaHJpZnRUZXN0LnBmeCBzaG91bGQgYmUgaW4gZGlyZWN0b3J5IHdpdGggYmluYXJpZXMgaW4gY2FzZSBvZiBjb21tYW5kIGxpbmUgdXNhZ2UgKG9yIGF0IHByb2plY3QgbGV2ZWwgaW4gY2FzZSBvZiBkZWJ1Z2dpbmcgZnJvbSBJREUpLgorICAgIFBhc3N3b3JkIGZvciBjZXJ0aWZpY2F0ZSAtICJUaHJpZnRUZXN0Ii4KKworCisKKyMgTmV0Q29yZSBDbGllbnQKKworVXNhZ2U6IAorCisgICAgQ2xpZW50LmV4ZSAtaAorICAgICAgICB3aWxsIGRpcGxheSBoZWxwIGluZm9ybWF0aW9uIAorCisgICAgQ2xpZW50LmV4ZSAtdHI6PHRyYW5zcG9ydD4gLXByOjxwcm90b2NvbD4gLW1jOjxudW1DbGllbnRzPgorICAgICAgICB3aWxsIHJ1biBjbGllbnQgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzICh0Y3AgdHJhbnNwb3J0IGFuZCBiaW5hcnkgcHJvdG9jb2wgYnkgZGVmYXVsdCkKKworT3B0aW9uczoKKworICAgIC10ciAodHJhbnNwb3J0KTogCisgICAgICAgIHRjcCAtIChkZWZhdWx0KSB0Y3AgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICB0Y3BidWZmZXJlZCAtIGJ1ZmZlcmVkIHRyYW5zcG9ydCBvdmVyIHRjcCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgbmFtZWRwaXBlIC0gbmFtZWRwaXBlIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKHBpcGUgYWRkcmVzcyAtICIiLnRlc3QiIikKKyAgICAgICAgaHR0cCAtIGh0dHAgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoYWRkcmVzcyAtICIiaHR0cDovL2xvY2FsaG9zdDo5MDkwIiIpICAgICAgICAKKyAgICAgICAgdGNwdGxzIC0gdGNwIHRscyB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIGZyYW1lZCAtIHRjcCBmcmFtZWQgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorCisgICAgLXByIChwcm90b2NvbCk6IAorICAgICAgICBiaW5hcnkgLSAoZGVmYXVsdCkgYmluYXJ5IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBjb21wYWN0IC0gY29tcGFjdCBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAganNvbiAtIGpzb24gcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIAorICAgIC1tYyAobXVsdGlwbGUgY2xpZW50cyk6CisgICAgICAgIDxudW1DbGllbnRzPiAtIG51bWJlciBvZiBtdWx0aXBsZSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gc2VydmVyIChtYXggMTAwLCBkZWZhdWx0IDEpCisKK1NhbXBsZToKKworICAgIENsaWVudC5leGUgLXRyOnRjcCAtcHI6YmluYXJ5IC1tYzoxMAorCitSZW1hcmtzOgorCisgICAgRm9yIFRjcFRscyBtb2RlIGNlcnRpZmljYXRlJ3MgZmlsZSBUaHJpZnRUZXN0LnBmeCBzaG91bGQgYmUgaW4gZGlyZWN0b3J5IAorCXdpdGggYmluYXJpZXMgaW4gY2FzZSBvZiBjb21tYW5kIGxpbmUgdXNhZ2UgKG9yIGF0IHByb2plY3QgbGV2ZWwgaW4gY2FzZSBvZiBkZWJ1Z2dpbmcgZnJvbSBJREUpLgorICAgIFBhc3N3b3JkIGZvciBjZXJ0aWZpY2F0ZSAtICJUaHJpZnRUZXN0Ii4KKworIyBIb3cgdG8gdGVzdCBjb21tdW5pY2F0aW9uIGJldHdlZW4gTmV0Q29yZSBhbmQgUHl0aG9uCisKKyogR2VuZXJhdGUgY29kZSB3aXRoIHRoZSBsYXRlc3QgKip0aHJpZnQuZXhlKiogdXRpbAorKiBFbnN1cmUgdGhhdCAqKnRocmlmdC5leGUqKiB1dGlsIGdlbmVyYXRlZCBmb2xkZXIgKipnZW4tcHkqKiB3aXRoIGdlbmVyYXRlZCBjb2RlIGZvciBQeXRob24KKyogQ3JlYXRlICoqY2xpZW50LnB5KiogYW5kICoqc2VydmVyLnB5KiogZnJvbSB0aGUgY29kZSBleGFtcGxlcyBiZWxvdyBhbmQgc2F2ZSB0aGVtIHRvIHRoZSBmb2xkZXIgd2l0aCBwcmV2aW9zbHkgZ2VuZXJhdGVkIGZvbGRlciAqKmdlbi1weSoqCisqIFJ1biBuZXRjb3JlIHNhbXBsZXMgKGNsaWVudCBhbmQgc2VydmVyKSBhbmQgcHl0aG9uIHNhbXBsZXMgKGNsaWVudCBhbmQgc2VydmVyKQorCitSZW1hcmtzOgorCitTYW1wbGVzIG9mIGNsaWVudCBhbmQgc2VydmVyIGNvZGUgYmVsb3cgdXNlIGNvcnJlY3QgbWV0aG9kcyAob3BlcmF0aW9ucykgCithbmQgZmllbGRzIChwcm9wZXJ0aWVzKSBhY2NvcmRpbmcgdG8gZ2VuZXJhdGVkIGNvbnRyYWN0cyBmcm9tICoudGhyaWZ0IGZpbGVzCisKK0F0IFdpbmRvd3MgMTAgYWRkIHJlY29yZCAqKjEyNy4wLjAuMSB0ZXN0c2VydmVyKiogdG8gKipDOlxXaW5kb3dzXFN5c3RlbTMyXGRyaXZlcnNcZXRjXGhvc3RzKiogZmlsZQorZm9yIGNvcnJlY3Qgd29yayBvZiBweXRob24gc2VydmVyCisKKworKipQeXRob24gQ2xpZW50OioqCisJCitgYGBweXRob24KK2ltcG9ydCBzeXMKK2ltcG9ydCBnbG9iCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weScpCisKK2Zyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24sIFdvcmsKKworZnJvbSB0aHJpZnQgaW1wb3J0IFRocmlmdAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Citmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKworCitkZWYgbWFpbigpOgorICAgICMgTWFrZSBzb2NrZXQKKyAgICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTb2NrZXQoJzEyNy4wLjAuMScsIDkwOTApCisKKyAgICAjIEJ1ZmZlcmluZyBpcyBjcml0aWNhbC4gUmF3IHNvY2tldHMgYXJlIHZlcnkgc2xvdworICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCkKKworICAgICMgV3JhcCBpbiBhIHByb3RvY29sCisgICAgcHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkKKworICAgICMgQ3JlYXRlIGEgY2xpZW50IHRvIHVzZSB0aGUgcHJvdG9jb2wgZW5jb2RlcgorICAgIGNsaWVudCA9IENhbGN1bGF0b3IuQ2xpZW50KHByb3RvY29sKQorCisgICAgIyBDb25uZWN0IQorICAgIHRyYW5zcG9ydC5vcGVuKCkKKworICAgIGNsaWVudC5QaW5nKCkKKyAgICBwcmludCgncGluZygpJykKKworICAgIHN1bSA9IGNsaWVudC5BZGQoMSwgMSkKKyAgICBwcmludCgoJzErMT0lZCcgJSAoc3VtKSkpCisKKyAgICB3b3JrID0gV29yaygpCisKKyAgICB3b3JrLk9wID0gT3BlcmF0aW9uLkRpdmlkZQorICAgIHdvcmsuTnVtMSA9IDEKKyAgICB3b3JrLk51bTIgPSAwCisKKyAgICB0cnk6CisgICAgICAgIHF1b3RpZW50ID0gY2xpZW50LkNhbGN1bGF0ZSgxLCB3b3JrKQorICAgICAgICBwcmludCgnV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvPycpCisgICAgICAgIHByaW50KCdGWUkgdGhlIGFuc3dlciBpcyAlZCcgJSBxdW90aWVudCkKKyAgICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiBhcyBlOgorICAgICAgICBwcmludCgoJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGUpKQorCisgICAgd29yay5PcCA9IE9wZXJhdGlvbi5TdWJzdHJhY3QKKyAgICB3b3JrLk51bTEgPSAxNQorICAgIHdvcmsuTnVtMiA9IDEwCisKKyAgICBkaWZmID0gY2xpZW50LkNhbGN1bGF0ZSgxLCB3b3JrKQorICAgIHByaW50KCgnMTUtMTA9JWQnICUgKGRpZmYpKSkKKworICAgIGxvZyA9IGNsaWVudC5HZXRTdHJ1Y3QoMSkKKyAgICBwcmludCgoJ0NoZWNrIGxvZzogJXMnICUgKGxvZy5WYWx1ZSkpKQorCisgICAgY2xpZW50LlppcCgpCisgICAgcHJpbnQoJ3ppcCgpJykKKworICAgICMgQ2xvc2UhCisgICAgdHJhbnNwb3J0LmNsb3NlKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdHJ5OgorICAgIG1haW4oKQorICBleGNlcHQgVGhyaWZ0LlRFeGNlcHRpb24gYXMgdHg6CisgICAgcHJpbnQoJyVzJyAlIHR4Lm1lc3NhZ2UpCitgYGAKKworCisqKlB5dGhvbiBTZXJ2ZXI6KioKKworCitgYGBweXRob24KK2ltcG9ydCBnbG9iCitpbXBvcnQgc3lzCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weScpCisKK2Zyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24KKworZnJvbSBzaGFyZWQudHR5cGVzIGltcG9ydCBTaGFyZWRTdHJ1Y3QKKworZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Citmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFNlcnZlcgorCisKK2NsYXNzIENhbGN1bGF0b3JIYW5kbGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5sb2cgPSB7fQorCisgICAgZGVmIFBpbmcoc2VsZik6CisgICAgICAgIHByaW50KCdwaW5nKCknKQorCisgICAgZGVmIEFkZChzZWxmLCBuMSwgbjIpOgorICAgICAgICBwcmludCgnYWRkKCVkLCVkKScgJSAobjEsIG4yKSkKKyAgICAgICAgcmV0dXJuIG4xICsgbjIKKworICAgIGRlZiBDYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgorICAgICAgICBwcmludCgnY2FsY3VsYXRlKCVkLCAlciknICUgKGxvZ2lkLCB3b3JrKSkKKworICAgICAgICBpZiB3b3JrLk9wID09IE9wZXJhdGlvbi5BZGQ6CisgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKyB3b3JrLk51bTIKKyAgICAgICAgZWxpZiB3b3JrLk9wID09IE9wZXJhdGlvbi5TdWJzdHJhY3Q6CisgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgLSB3b3JrLk51bTIKKyAgICAgICAgZWxpZiB3b3JrLk9wID09IE9wZXJhdGlvbi5NdWx0aXBseToKKyAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSAqIHdvcmsuTnVtMgorICAgICAgICBlbGlmIHdvcmsuT3AgPT0gT3BlcmF0aW9uLkRpdmlkZToKKyAgICAgICAgICAgIGlmIHdvcmsuTnVtMiA9PSAwOgorICAgICAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgICAgICB4LldoYXRPcCA9IHdvcmsuT3AKKyAgICAgICAgICAgICAgICB4LldoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnCisgICAgICAgICAgICAgICAgcmFpc2UgeAorICAgICAgICAgICAgdmFsID0gd29yay5OdW0xIC8gd29yay5OdW0yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICB4LldoYXRPcCA9IHdvcmsuT3AKKyAgICAgICAgICAgIHguV2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJworICAgICAgICAgICAgcmFpc2UgeAorCisgICAgICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCisgICAgICAgIGxvZy5LZXkgPSBsb2dpZAorICAgICAgICBsb2cuVmFsdWUgPSAnJWQnICUgKHZhbCkKKyAgICAgICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCisKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIEdldFN0cnVjdChzZWxmLCBrZXkpOgorICAgICAgICBwcmludCgnZ2V0U3RydWN0KCVkKScgJSAoa2V5KSkKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nW2tleV0KKworICAgIGRlZiBaaXAoc2VsZik6CisgICAgICAgIHByaW50KCd6aXAoKScpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQorICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldChob3N0PSJ0ZXN0c2VydmVyIiwgcG9ydD05MDkwKQorICAgIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICBwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKworICAgIHNlcnZlciA9IFRTZXJ2ZXIuVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgIHByaW50KCdTdGFydGluZyB0aGUgc2VydmVyLi4uJykKKyAgICBzZXJ2ZXIuc2VydmUoKQorICAgIHByaW50KCdkb25lLicpCisKKyAgICAjIFlvdSBjb3VsZCBkbyBvbmUgb2YgdGhlc2UgZm9yIGEgbXVsdGl0aHJlYWRlZCBzZXJ2ZXIKKyAgICAjIHNlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZGVkU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCisgICAgIyBzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRQb29sU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCitgYGAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb2dyYW0uY3MgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTgxYmEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNDI4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkFzcE5ldENvcmUuQnVpbGRlcjsKK3VzaW5nIE1pY3Jvc29mdC5Bc3BOZXRDb3JlLkhvc3Rpbmc7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Db25maWd1cmF0aW9uOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuRGVwZW5kZW5jeUluamVjdGlvbjsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmc7Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuU2VydmVyOwordXNpbmcgdHV0b3JpYWw7Cit1c2luZyBzaGFyZWQ7CisKK25hbWVzcGFjZSBTZXJ2ZXIKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSUxvZ2dlciBMb2dnZXIgPSBuZXcgTG9nZ2VyRmFjdG9yeSgpLkFkZENvbnNvbGUoTG9nTGV2ZWwuVHJhY2UpLkFkZERlYnVnKExvZ0xldmVsLlRyYWNlKS5DcmVhdGVMb2dnZXIobmFtZW9mKFNlcnZlcikpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzID8/IG5ldyBzdHJpbmdbMF07CisKKyAgICAgICAgICAgIGlmIChhcmdzLkFueSh4ID0+IHguU3RhcnRzV2l0aCgiLWhlbHAiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlzcGxheUhlbHAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVzaW5nICh2YXIgc291cmNlID0gbmV3IENhbmNlbGxhdGlvblRva2VuU291cmNlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUnVuQXN5bmMoYXJncywgc291cmNlLlRva2VuKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIlByZXNzIGFueSBrZXkgdG8gc3RvcC4uLiIpOworCisgICAgICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOworICAgICAgICAgICAgICAgIHNvdXJjZS5DYW5jZWwoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJTZXJ2ZXIgc3RvcHBlZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBEaXNwbGF5SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbihAIgorVXNhZ2U6IAorICAgIFNlcnZlci5leGUgLWhlbHAKKyAgICAgICAgd2lsbCBkaXBsYXkgaGVscCBpbmZvcm1hdGlvbiAKKworICAgIFNlcnZlci5leGUgLXRyOjx0cmFuc3BvcnQ+IC1wcjo8cHJvdG9jb2w+CisgICAgICAgIHdpbGwgcnVuIHNlcnZlciB3aXRoIHNwZWNpZmllZCBhcmd1bWVudHMgKHRjcCB0cmFuc3BvcnQgYW5kIGJpbmFyeSBwcm90b2NvbCBieSBkZWZhdWx0KQorCitPcHRpb25zOgorICAgIC10ciAodHJhbnNwb3J0KTogCisgICAgICAgIHRjcCAtIChkZWZhdWx0KSB0Y3AgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICB0Y3BidWZmZXJlZCAtIHRjcCBidWZmZXJlZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIG5hbWVkcGlwZSAtIG5hbWVkcGlwZSB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChwaXBlIGFkZHJlc3MgLSAiIi50ZXN0IiIpCisgICAgICAgIGh0dHAgLSBodHRwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGh0dHAgYWRkcmVzcyAtICIibG9jYWxob3N0OjkwOTAiIikKKyAgICAgICAgdGNwdGxzIC0gdGNwIHRyYW5zcG9ydCB3aXRoIHRscyB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgZnJhbWVkIC0gdGNwIGZyYW1lZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisKKyAgICAtcHIgKHByb3RvY29sKTogCisgICAgICAgIGJpbmFyeSAtIChkZWZhdWx0KSBiaW5hcnkgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGNvbXBhY3QgLSBjb21wYWN0IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBqc29uIC0ganNvbiBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgbXVsdGlwbGV4ZWQgLSBtdWx0aXBsZXhlZCBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKworU2FtcGxlOgorICAgIFNlcnZlci5leGUgLXRyOnRjcCAKKyIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgVGFzayBSdW5Bc3luYyhzdHJpbmdbXSBhcmdzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHJhbnNwb3J0ID0gR2V0VHJhbnNwb3J0KGFyZ3MpOworICAgICAgICAgICAgdmFyIHNlbGVjdGVkUHJvdG9jb2wgPSBHZXRQcm90b2NvbChhcmdzKTsKKworICAgICAgICAgICAgaWYgKHNlbGVjdGVkVHJhbnNwb3J0ID09IFRyYW5zcG9ydC5IdHRwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBIdHRwU2VydmVyU2FtcGxlKCkuUnVuKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBSdW5TZWxlY3RlZENvbmZpZ3VyYXRpb25Bc3luYyhzZWxlY3RlZFRyYW5zcG9ydCwgc2VsZWN0ZWRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgUHJvdG9jb2wgR2V0UHJvdG9jb2woc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IGFyZ3MuRmlyc3RPckRlZmF1bHQoeCA9PiB4LlN0YXJ0c1dpdGgoIi1wciIpKT8uU3BsaXQoJzonKT9bMV07CisKKyAgICAgICAgICAgIEVudW0uVHJ5UGFyc2UodHJhbnNwb3J0LCB0cnVlLCBvdXQgUHJvdG9jb2wgc2VsZWN0ZWRQcm90b2NvbCk7CisKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFByb3RvY29sOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHJhbnNwb3J0IEdldFRyYW5zcG9ydChzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gYXJncy5GaXJzdE9yRGVmYXVsdCh4ID0+IHguU3RhcnRzV2l0aCgiLXRyIikpPy5TcGxpdCgnOicpP1sxXTsKKworICAgICAgICAgICAgRW51bS5UcnlQYXJzZSh0cmFuc3BvcnQsIHRydWUsIG91dCBUcmFuc3BvcnQgc2VsZWN0ZWRUcmFuc3BvcnQpOworCisgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUcmFuc3BvcnQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIFJ1blNlbGVjdGVkQ29uZmlndXJhdGlvbkFzeW5jKFRyYW5zcG9ydCB0cmFuc3BvcnQsIFByb3RvY29sIHByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZhYnJpYyA9IG5ldyBMb2dnZXJGYWN0b3J5KCkuQWRkQ29uc29sZShMb2dMZXZlbC5UcmFjZSkuQWRkRGVidWcoTG9nTGV2ZWwuVHJhY2UpOworICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBuZXcgQ2FsY3VsYXRvckFzeW5jSGFuZGxlcigpOworICAgICAgICAgICAgSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IgPSBudWxsOworCisgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IG51bGw7CisKKyAgICAgICAgICAgIHN3aXRjaCAodHJhbnNwb3J0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcDoKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoOTA5MCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcEJ1ZmZlcmVkOgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChwb3J0OiA5MDkwLCBjbGllbnRUaW1lb3V0OiAxMDAwMCwgdXNlQnVmZmVyZWRTb2NrZXRzOiB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuTmFtZWRQaXBlOgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydCgiLnRlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwVGxzOgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydCg5MDkwLCBmYWxzZSwgR2V0Q2VydGlmaWNhdGUoKSwgQ2xpZW50Q2VydFZhbGlkYXRvciwgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuRnJhbWVkOgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlckZyYW1lZFRyYW5zcG9ydCg5MDkwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgSVRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworCisgICAgICAgICAgICBzd2l0Y2ggKHByb3RvY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuQmluYXJ5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLkFzeW5jUHJvY2Vzc29yKGhhbmRsZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5Db21wYWN0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3IoaGFuZGxlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkpzb246CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUSnNvblByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRKc29uUHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuTXVsdGlwbGV4ZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgY2FsY0hhbmRsZXIgPSBuZXcgQ2FsY3VsYXRvckFzeW5jSGFuZGxlcigpOworICAgICAgICAgICAgICAgICAgICB2YXIgY2FsY1Byb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLkFzeW5jUHJvY2Vzc29yKGNhbGNIYW5kbGVyKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgc2hhcmVkU2VydmljZUhhbmRsZXIgPSBuZXcgU2hhcmVkU2VydmljZUFzeW5jSGFuZGxlcigpOworICAgICAgICAgICAgICAgICAgICB2YXIgc2hhcmVkU2VydmljZVByb2Nlc3NvciA9IG5ldyBTaGFyZWRTZXJ2aWNlLkFzeW5jUHJvY2Vzc29yKHNoYXJlZFNlcnZpY2VIYW5kbGVyKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgbXVsdGlwbGV4ZWRQcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgICAgICAgICAgICAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKG5hbWVvZihDYWxjdWxhdG9yKSwgY2FsY1Byb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKG5hbWVvZihTaGFyZWRTZXJ2aWNlKSwgc2hhcmVkU2VydmljZVByb2Nlc3Nvcik7CisKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gbXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKG5hbWVvZihwcm90b2NvbCksIHByb3RvY29sLCBudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKAorICAgICAgICAgICAgICAgICAgICAkIlNlbGVjdGVkIFRBc3luY1NlcnZlciB3aXRoIHtzZXJ2ZXJUcmFuc3BvcnR9IHRyYW5zcG9ydCwge3Byb2Nlc3Nvcn0gcHJvY2Vzc29yIGFuZCB7aW5wdXRQcm90b2NvbEZhY3Rvcnl9IHByb3RvY29sIGZhY3RvcmllcyIpOworCisgICAgICAgICAgICAgICAgdmFyIHNlcnZlciA9IG5ldyBBc3luY0Jhc2VTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGZhYnJpYyk7CisKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBzZXJ2ZXIuU2VydmVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUyIEdldENlcnRpZmljYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZHVlIHRvIGZpbGVzIGxvY2F0aW9uIGluIG5ldCBjb3JlIGJldHRlciB0byB0YWtlIGNlcnRzIGZyb20gdG9wIGZvbGRlcgorICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0gR2V0Q2VydFBhdGgoRGlyZWN0b3J5LkdldFBhcmVudChEaXJlY3RvcnkuR2V0Q3VycmVudERpcmVjdG9yeSgpKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydEZpbGUsICJUaHJpZnRUZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0Q2VydFBhdGgoRGlyZWN0b3J5SW5mbyBkaSwgaW50IG1heENvdW50ID0gNikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRvcERpciA9IGRpOworICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0KKyAgICAgICAgICAgICAgICB0b3BEaXIuRW51bWVyYXRlRmlsZXMoIlRocmlmdFRlc3QucGZ4IiwgU2VhcmNoT3B0aW9uLkFsbERpcmVjdG9yaWVzKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChjZXJ0RmlsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtYXhDb3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBmaWxlIGluIGRpcmVjdG9yaWVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldENlcnRQYXRoKGRpLlBhcmVudCwgbWF4Q291bnQgLSAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNlcnRGaWxlLkZ1bGxOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayhvYmplY3Qgc2VuZGVyLAorICAgICAgICAgICAgc3RyaW5nIHRhcmdldEhvc3QsIFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24gbG9jYWxDZXJ0aWZpY2F0ZXMsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgcmVtb3RlQ2VydGlmaWNhdGUsIHN0cmluZ1tdIGFjY2VwdGFibGVJc3N1ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0Q2VydGlmaWNhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgQ2xpZW50Q2VydFZhbGlkYXRvcihvYmplY3Qgc2VuZGVyLCBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBYNTA5Q2hhaW4gY2hhaW4sIFNzbFBvbGljeUVycm9ycyBzc2xQb2xpY3lFcnJvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIFRyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBUY3AsCisgICAgICAgICAgICBUY3BCdWZmZXJlZCwKKyAgICAgICAgICAgIE5hbWVkUGlwZSwKKyAgICAgICAgICAgIEh0dHAsCisgICAgICAgICAgICBUY3BUbHMsCisgICAgICAgICAgICBGcmFtZWQKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW51bSBQcm90b2NvbAorICAgICAgICB7CisgICAgICAgICAgICBCaW5hcnksCisgICAgICAgICAgICBDb21wYWN0LAorICAgICAgICAgICAgSnNvbiwKKyAgICAgICAgICAgIE11bHRpcGxleGVkCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgSHR0cFNlcnZlclNhbXBsZQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBSdW4oQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5BZGRFbnZpcm9ubWVudFZhcmlhYmxlcyhwcmVmaXg6ICJBU1BORVRDT1JFXyIpCisgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpOworCisgICAgICAgICAgICAgICAgdmFyIGhvc3QgPSBuZXcgV2ViSG9zdEJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuVXNlQ29uZmlndXJhdGlvbihjb25maWcpCisgICAgICAgICAgICAgICAgICAgIC5Vc2VLZXN0cmVsKCkKKyAgICAgICAgICAgICAgICAgICAgLlVzZVVybHMoImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIpCisgICAgICAgICAgICAgICAgICAgIC5Vc2VDb250ZW50Um9vdChEaXJlY3RvcnkuR2V0Q3VycmVudERpcmVjdG9yeSgpKQorICAgICAgICAgICAgICAgICAgICAuVXNlU3RhcnR1cDxTdGFydHVwPigpCisgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpOworCisgICAgICAgICAgICAgICAgaG9zdC5SdW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbikuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgY2xhc3MgU3RhcnR1cAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1YmxpYyBTdGFydHVwKElIb3N0aW5nRW52aXJvbm1lbnQgZW52KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgQ29uZmlndXJhdGlvbkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLlNldEJhc2VQYXRoKGVudi5Db250ZW50Um9vdFBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAuQWRkRW52aXJvbm1lbnRWYXJpYWJsZXMoKTsKKworICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uID0gYnVpbGRlci5CdWlsZCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBJQ29uZmlndXJhdGlvblJvb3QgQ29uZmlndXJhdGlvbiB7IGdldDsgfQorCisgICAgICAgICAgICAgICAgLy8gVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgYnkgdGhlIHJ1bnRpbWUuIFVzZSB0aGlzIG1ldGhvZCB0byBhZGQgc2VydmljZXMgdG8gdGhlIGNvbnRhaW5lci4KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBDb25maWd1cmVTZXJ2aWNlcyhJU2VydmljZUNvbGxlY3Rpb24gc2VydmljZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcy5BZGRUcmFuc2llbnQ8Q2FsY3VsYXRvci5JQXN5bmMsIENhbGN1bGF0b3JBc3luY0hhbmRsZXI+KCk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLkFkZFRyYW5zaWVudDxJVEFzeW5jUHJvY2Vzc29yLCBDYWxjdWxhdG9yLkFzeW5jUHJvY2Vzc29yPigpOworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcy5BZGRUcmFuc2llbnQ8VEh0dHBTZXJ2ZXJUcmFuc3BvcnQsIFRIdHRwU2VydmVyVHJhbnNwb3J0PigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIGJ5IHRoZSBydW50aW1lLiBVc2UgdGhpcyBtZXRob2QgdG8gY29uZmlndXJlIHRoZSBIVFRQIHJlcXVlc3QgcGlwZWxpbmUuCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgQ29uZmlndXJlKElBcHBsaWNhdGlvbkJ1aWxkZXIgYXBwLCBJSG9zdGluZ0Vudmlyb25tZW50IGVudiwKKyAgICAgICAgICAgICAgICAgICAgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwcC5Vc2VNaWRkbGV3YXJlPFRIdHRwU2VydmVyVHJhbnNwb3J0PigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yQXN5bmNIYW5kbGVyIDogQ2FsY3VsYXRvci5JQXN5bmMKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PGludCwgU2hhcmVkU3RydWN0PiBfbG9nID0gbmV3IERpY3Rpb25hcnk8aW50LCBTaGFyZWRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgICAgIHB1YmxpYyBDYWxjdWxhdG9yQXN5bmNIYW5kbGVyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8U2hhcmVkU3RydWN0PiBnZXRTdHJ1Y3RBc3luYyhpbnQga2V5LAorICAgICAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiR2V0U3RydWN0QXN5bmMoezB9KSIsIGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbVJlc3VsdChfbG9nW2tleV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBwaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJQaW5nQXN5bmMoKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8aW50PiBhZGRBc3luYyhpbnQgbnVtMSwgaW50IG51bTIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIkFkZEFzeW5jKHtudW0xfSx7bnVtMn0pIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbVJlc3VsdChudW0xICsgbnVtMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGludD4gY2FsY3VsYXRlQXN5bmMoaW50IGxvZ2lkLCBXb3JrIHcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIkNhbGN1bGF0ZUFzeW5jKHtsb2dpZH0sIFt7dy5PcH0se3cuTnVtMX0se3cuTnVtMn1dKSIpOworCisgICAgICAgICAgICAgICAgdmFyIHZhbCA9IDA7CisgICAgICAgICAgICAgICAgc3dpdGNoICh3Lk9wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uQUREOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdy5OdW0xICsgdy5OdW0yOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uU1VCVFJBQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB3Lk51bTEgLSB3Lk51bTI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5NVUxUSVBMWToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHcuTnVtMSAqIHcuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLkRJVklERToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3Lk51bTIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hhdE9wID0gKGludCkgdy5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB3Lk51bTEgLyB3Lk51bTI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoYXRPcCA9IChpbnQpIHcuT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2h5ID0gIlVua25vd24gb3BlcmF0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBuZXcgU2hhcmVkU3RydWN0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLZXkgPSBsb2dpZCwKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSB2YWwuVG9TdHJpbmcoKQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBfbG9nW2xvZ2lkXSA9IGVudHJ5OworCisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbVJlc3VsdCh2YWwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayB6aXBBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIlppcEFzeW5jKCkgd2l0aCBkZWxheSAxMDBtYyIpOworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRGVsYXkoMTAwLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBTaGFyZWRTZXJ2aWNlQXN5bmNIYW5kbGVyIDogU2hhcmVkU2VydmljZS5JQXN5bmMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8U2hhcmVkU3RydWN0PiBnZXRTdHJ1Y3RBc3luYyhpbnQga2V5LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIkdldFN0cnVjdEFzeW5jKHswfSkiLCBrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21SZXN1bHQobmV3IFNoYXJlZFN0cnVjdCgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLZXkgPSBrZXksCisgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gIkdldFN0cnVjdEFzeW5jIgorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQ0MjM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiZTIxMGZjMTAtNWFmZi00YjA0LWFjMjEtNThhZmM3Yjc0YjBjIildClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDc2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24KQEAgLTAsMCArMSw4IEBACit7CisgICJwcm9maWxlcyI6IHsKKyAgICAiU2VydmVyIjogeworICAgICAgImNvbW1hbmROYW1lIjogIlByb2plY3QiLAorICAgICAgImNvbW1hbmRMaW5lQXJncyI6ICItcDptdWx0aXBsZXhlZCIKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmJkMzAzCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvagpAQCAtMCwwICsxLDI2IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrLldlYiI+CisKKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5TZXJ2ZXI8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPlNlcnZlcjwvUGFja2FnZUlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi4vSW50ZXJmYWNlcy9JbnRlcmZhY2VzLmNzcHJvaiIgLz4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLi8uLi8uLi9saWIvbmV0Y29yZS9UaHJpZnQvVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZSIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5Bc3BOZXRDb3JlLlNlcnZlci5JSVNJbnRlZ3JhdGlvbiIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5Bc3BOZXRDb3JlLlNlcnZlci5LZXN0cmVsIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkV4dGVuc2lvbnMuQ29uZmlndXJhdGlvbi5GaWxlRXh0ZW5zaW9ucyIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICA8L0l0ZW1Hcm91cD4KKworPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvVGhyaWZ0VGVzdC5wZnggYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9UaHJpZnRUZXN0LnBmeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRlZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvVGhyaWZ0VGVzdC5wZngKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9UdXRvcmlhbC5zbG4gYi90dXRvcmlhbC9uZXRjb3JlL1R1dG9yaWFsLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGRjZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9UdXRvcmlhbC5zbG4KQEAgLTAsMCArMSw3OCBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTIuMDAKKyMgVmlzdWFsIFN0dWRpbyAxNQorVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDE1LjAuMjYxMTQuMgorTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjEKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiwgIntDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJJbnRlcmZhY2VzIiwgIkludGVyZmFjZXNcSW50ZXJmYWNlcy5jc3Byb2oiLCAie0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIkNsaWVudCIsICJDbGllbnRcQ2xpZW50LmNzcHJvaiIsICJ7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiU2VydmVyIiwgIlNlcnZlclxTZXJ2ZXIuY3Nwcm9qIiwgIntFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJRGVidWd8eDY0ID0gRGVidWd8eDY0CisJCURlYnVnfHg4NiA9IERlYnVnfHg4NgorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NAorCQlSZWxlYXNlfHg4NiA9IFJlbGVhc2V8eDg2CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwkJU29sdXRpb25HdWlkID0gezA3MEE1RDFELUIyOUQtNDYwMy05OTlELTY5M0RCNDQ0QUQwRH0KKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuY21kIGIvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NGVmMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuY21kCkBAIC0wLDAgKzEsMjUgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCisKKzplb2YKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuc2ggYi90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM5N2UzMTAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyNleGl0IGlmIGFueSBjb21tYW5kIGZhaWxzCitzZXQgLWUKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRzdGQvLmdpdGlnbm9yZSBiL3R1dG9yaWFsL25ldHN0ZC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzhiYjIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRzdGQvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACishKiovKi5wZngKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRzdGQvQ2xpZW50L0NsaWVudC5jc3Byb2ogYi90dXRvcmlhbC9uZXRzdGQvQ2xpZW50L0NsaWVudC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlYWUxNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldHN0ZC9DbGllbnQvQ2xpZW50LmNzcHJvagpAQCAtMCwwICsxLDM3IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPCEtLQorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAKKyAgCSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+Q2xpZW50PC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5DbGllbnQ8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXEludGVyZmFjZXNcSW50ZXJmYWNlcy5jc3Byb2oiIC8+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXG5ldHN0ZFxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldHN0ZC9DbGllbnQvUHJvZ3JhbS5jcyBiL3R1dG9yaWFsL25ldHN0ZC9DbGllbnQvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjM1NzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0c3RkL0NsaWVudC9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsMzU1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmc7Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydC5DbGllbnQ7Cit1c2luZyB0dXRvcmlhbDsKK3VzaW5nIHNoYXJlZDsKKworbmFtZXNwYWNlIENsaWVudAoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTG9nZ2VyIExvZ2dlciA9IG5ldyBMb2dnZXJGYWN0b3J5KCkuQWRkQ29uc29sZSgpLkFkZERlYnVnKCkuQ3JlYXRlTG9nZ2VyKG5hbWVvZihDbGllbnQpKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIERpc3BsYXlIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKEAiCitVc2FnZTogCisgICAgQ2xpZW50LmV4ZSAtaGVscAorICAgICAgICB3aWxsIGRpcGxheSBoZWxwIGluZm9ybWF0aW9uIAorCisgICAgQ2xpZW50LmV4ZSAtdHI6PHRyYW5zcG9ydD4gLXByOjxwcm90b2NvbD4gLW1jOjxudW1DbGllbnRzPgorICAgICAgICB3aWxsIHJ1biBjbGllbnQgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzICh0Y3AgdHJhbnNwb3J0IGFuZCBiaW5hcnkgcHJvdG9jb2wgYnkgZGVmYXVsdCkgYW5kIHdpdGggMSBjbGllbnQKKworT3B0aW9uczoKKyAgICAtdHIgKHRyYW5zcG9ydCk6IAorICAgICAgICB0Y3AgLSAoZGVmYXVsdCkgdGNwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgdGNwYnVmZmVyZWQgLSBidWZmZXJlZCB0cmFuc3BvcnQgb3ZlciB0Y3Agd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIG5hbWVkcGlwZSAtIG5hbWVkcGlwZSB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChwaXBlIGFkZHJlc3MgLSAiIi50ZXN0IiIpCisgICAgICAgIGh0dHAgLSBodHRwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGFkZHJlc3MgLSAiImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIiKSAgICAgICAgCisgICAgICAgIHRjcHRscyAtIHRjcCB0bHMgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBtdWx0aXBsZXhlZCAtIG11bHRpcGxleGVkIHByb3RvY29sIHdpbGwgYmUgdXNlZAorCisgICAgLW1jIChtdWx0aXBsZSBjbGllbnRzKToKKyAgICAgICAgPG51bUNsaWVudHM+IC0gbnVtYmVyIG9mIG11bHRpcGxlIGNsaWVudHMgdG8gY29ubmVjdCB0byBzZXJ2ZXIgKG1heCAxMDAsIGRlZmF1bHQgMSkKKworU2FtcGxlOgorICAgIENsaWVudC5leGUgLXRyOnRjcCAtcDpiaW5hcnkKKyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgYXJncyA9IGFyZ3MgPz8gbmV3IHN0cmluZ1swXTsKKworICAgICAgICAgICAgaWYgKGFyZ3MuQW55KHggPT4geC5TdGFydHNXaXRoKCItaGVscCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaXNwbGF5SGVscCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJTdGFydGluZyBjbGllbnQuLi4iKTsKKworICAgICAgICAgICAgdXNpbmcgKHZhciBzb3VyY2UgPSBuZXcgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSdW5Bc3luYyhhcmdzLCBzb3VyY2UuVG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuQXN5bmMoc3RyaW5nW10gYXJncywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBudW1DbGllbnRzID0gR2V0TnVtYmVyT2ZDbGllbnRzKGFyZ3MpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJTZWxlY3RlZCAjIG9mIGNsaWVudHM6IHtudW1DbGllbnRzfSIpOworCisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0cyA9IG5ldyBUVHJhbnNwb3J0W251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHQgPSBHZXRUcmFuc3BvcnQoYXJncyk7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0c1tpXSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIlNlbGVjdGVkIGNsaWVudCB0cmFuc3BvcnQ6IHt0cmFuc3BvcnRzWzBdfSIpOworCisgICAgICAgICAgICB2YXIgcHJvdG9jb2xzID0gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+W251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHAgPSBHZXRQcm90b2NvbChhcmdzLCB0cmFuc3BvcnRzW2ldKTsKKyAgICAgICAgICAgICAgICBwcm90b2NvbHNbaV0gPSBwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJTZWxlY3RlZCBjbGllbnQgcHJvdG9jb2w6IHtwcm90b2NvbHNbMF0uSXRlbTF9Iik7CisKKyAgICAgICAgICAgIHZhciB0YXNrcyA9IG5ldyBUYXNrW251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBSdW5DbGllbnRBc3luYyhwcm90b2NvbHNbaV0sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB0YXNrc1tpXSA9IHRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRhc2suV2FpdEFsbCh0YXNrcyk7CisKKyAgICAgICAgICAgIGF3YWl0IFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFRUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItdHIiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBUcmFuc3BvcnQgc2VsZWN0ZWRUcmFuc3BvcnQ7CisgICAgICAgICAgICBpZiAoRW51bS5UcnlQYXJzZSh0cmFuc3BvcnQsIHRydWUsIG91dCBzZWxlY3RlZFRyYW5zcG9ydCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzZWxlY3RlZFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVFNvY2tldFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5OYW1lZFBpcGU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFROYW1lZFBpcGVUcmFuc3BvcnQoIi50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0Lkh0dHA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwVHJhbnNwb3J0KG5ldyBVcmkoImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwQnVmZmVyZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChuZXcgVFNvY2tldFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwVGxzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUVGxzU29ja2V0VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCwgR2V0Q2VydGlmaWNhdGUoKSwgQ2VydFZhbGlkYXRvciwgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuRnJhbWVkOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0KG5ldyBUU29ja2V0VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU29ja2V0VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgR2V0TnVtYmVyT2ZDbGllbnRzKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBudW1DbGllbnRzID0gYXJncy5GaXJzdE9yRGVmYXVsdCh4ID0+IHguU3RhcnRzV2l0aCgiLW1jIikpPy5TcGxpdCgnOicpP1sxXTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiU2VsZWN0ZWQgIyBvZiBjbGllbnRzOiB7bnVtQ2xpZW50c30iKTsKKworICAgICAgICAgICAgaW50IGM7CisgICAgICAgICAgICBpZiggaW50LlRyeVBhcnNlKG51bUNsaWVudHMsIG91dCBjKSAmJiAoMCA8IGMpICYmIChjIDw9IDEwMCkpCisJCQkJcmV0dXJuIGM7CisJCQllbHNlCisJCQkJcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUyIEdldENlcnRpZmljYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZHVlIHRvIGZpbGVzIGxvY2F0aW9uIGluIG5ldCBjb3JlIGJldHRlciB0byB0YWtlIGNlcnRzIGZyb20gdG9wIGZvbGRlcgorICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0gR2V0Q2VydFBhdGgoRGlyZWN0b3J5LkdldFBhcmVudChEaXJlY3RvcnkuR2V0Q3VycmVudERpcmVjdG9yeSgpKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydEZpbGUsICJUaHJpZnRUZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0Q2VydFBhdGgoRGlyZWN0b3J5SW5mbyBkaSwgaW50IG1heENvdW50ID0gNikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRvcERpciA9IGRpOworICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0KKyAgICAgICAgICAgICAgICB0b3BEaXIuRW51bWVyYXRlRmlsZXMoIlRocmlmdFRlc3QucGZ4IiwgU2VhcmNoT3B0aW9uLkFsbERpcmVjdG9yaWVzKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChjZXJ0RmlsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtYXhDb3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBmaWxlIGluIGRpcmVjdG9yaWVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldENlcnRQYXRoKGRpLlBhcmVudCwgbWF4Q291bnQgLSAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNlcnRGaWxlLkZ1bGxOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayhvYmplY3Qgc2VuZGVyLAorICAgICAgICAgICAgc3RyaW5nIHRhcmdldEhvc3QsIFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24gbG9jYWxDZXJ0aWZpY2F0ZXMsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgcmVtb3RlQ2VydGlmaWNhdGUsIHN0cmluZ1tdIGFjY2VwdGFibGVJc3N1ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0Q2VydGlmaWNhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgQ2VydFZhbGlkYXRvcihvYmplY3Qgc2VuZGVyLCBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBYNTA5Q2hhaW4gY2hhaW4sIFNzbFBvbGljeUVycm9ycyBzc2xQb2xpY3lFcnJvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4gR2V0UHJvdG9jb2woc3RyaW5nW10gYXJncywgVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IGFyZ3MuRmlyc3RPckRlZmF1bHQoeCA9PiB4LlN0YXJ0c1dpdGgoIi1wciIpKT8uU3BsaXQoJzonKT9bMV07CisKKyAgICAgICAgICAgIFByb3RvY29sIHNlbGVjdGVkUHJvdG9jb2w7CisgICAgICAgICAgICBpZiAoRW51bS5UcnlQYXJzZShwcm90b2NvbCwgdHJ1ZSwgb3V0IHNlbGVjdGVkUHJvdG9jb2wpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2VsZWN0ZWRQcm90b2NvbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuQmluYXJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPihzZWxlY3RlZFByb3RvY29sLCBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkNvbXBhY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkpzb246CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLk11bHRpcGxleGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgcmV0dXJucyBCaW5hcnlQcm90b2NvbCB0byBhdm9pZCBtYWtpbmcgd3JhcHBlZCBwcm90b2NvbCBhcyBwdWJsaWMgaW4gVFByb3RvY29sRGVjb3JhdG9yIChpbiBSdW5DbGllbnRBc3luYyBpdCB3aWxsIGJlIHdyYXBwZWQgaW50byBNdWx0aXBsZXhlZCBwcm90b2NvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuQ2xpZW50QXN5bmMoVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4gcHJvdG9jb2xUdXBsZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHByb3RvY29sVHVwbGUuSXRlbTI7CisgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sVHlwZSA9IHByb3RvY29sVHVwbGUuSXRlbTE7CisKKyAgICAgICAgICAgICAgICBUQmFzZUNsaWVudCBjbGllbnQgPSBudWxsOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2xUeXBlICE9IFByb3RvY29sLk11bHRpcGxleGVkKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBFeGVjdXRlQ2FsY3VsYXRvckNsaWVudE9wZXJhdGlvbnMoY2FuY2VsbGF0aW9uVG9rZW4sIChDYWxjdWxhdG9yLkNsaWVudCljbGllbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgdXNlcyBiaW5hcnkgcHJvdG9jb2wgdGhlcmUgIHRvIGNyZWF0ZSBNdWx0aXBsZXhlZCBwcm90b2NvbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsIG5hbWVvZihDYWxjdWxhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXVsdGlwbGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEV4ZWN1dGVDYWxjdWxhdG9yQ2xpZW50T3BlcmF0aW9ucyhjYW5jZWxsYXRpb25Ub2tlbiwgKENhbGN1bGF0b3IuQ2xpZW50KWNsaWVudCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgbmFtZW9mKFNoYXJlZFNlcnZpY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBTaGFyZWRTZXJ2aWNlLkNsaWVudChtdWx0aXBsZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgRXhlY3V0ZVNoYXJlZFNlcnZpY2VDbGllbnRPcGVyYXRpb25zKGNhbmNlbGxhdGlvblRva2VuLCAoU2hhcmVkU2VydmljZS5DbGllbnQpY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKCQie2NsaWVudD8uQ2xpZW50SWR9ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLlRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nRXJyb3IoeC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgRXhlY3V0ZUNhbGN1bGF0b3JDbGllbnRPcGVyYXRpb25zKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuLCBDYWxjdWxhdG9yLkNsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC5PcGVuVHJhbnNwb3J0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAvLyBBc3luYyB2ZXJzaW9uCisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFBpbmdBc3luYygpIik7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQucGluZ0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gQWRkQXN5bmMoMSwxKSIpOworICAgICAgICAgICAgdmFyIHN1bSA9IGF3YWl0IGNsaWVudC5hZGRBc3luYygxLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBBZGRBc3luYygxLDEpPXtzdW19Iik7CisKKyAgICAgICAgICAgIHZhciB3b3JrID0gbmV3IFdvcmsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPcCA9IE9wZXJhdGlvbi5ESVZJREUsCisgICAgICAgICAgICAgICAgTnVtMSA9IDEsCisgICAgICAgICAgICAgICAgTnVtMiA9IDAKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IENhbGN1bGF0ZUFzeW5jKDEpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LmNhbGN1bGF0ZUFzeW5jKDEsIHdvcmssIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gSW52YWxpZCBvcGVyYXRpb246ICIgKyBpbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7CisgICAgICAgICAgICB3b3JrLk51bTEgPSAxNTsKKyAgICAgICAgICAgIHdvcmsuTnVtMiA9IDEwOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBDYWxjdWxhdGVBc3luYygxKSIpOworICAgICAgICAgICAgICAgIHZhciBkaWZmID0gYXdhaXQgY2xpZW50LmNhbGN1bGF0ZUFzeW5jKDEsIHdvcmssIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSAxNS0xMD17ZGlmZn0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IEludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBHZXRTdHJ1Y3RBc3luYygxKSIpOworICAgICAgICAgICAgdmFyIGxvZyA9IGF3YWl0IGNsaWVudC5nZXRTdHJ1Y3RBc3luYygxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBDaGVjayBsb2c6IHtsb2cuVmFsdWV9Iik7CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFppcEFzeW5jKCkgd2l0aCBkZWxheSAxMDBtYyBvbiBzZXJ2ZXIgc2lkZSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnppcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIEV4ZWN1dGVTaGFyZWRTZXJ2aWNlQ2xpZW50T3BlcmF0aW9ucyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbiwgU2hhcmVkU2VydmljZS5DbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQuT3BlblRyYW5zcG9ydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgLy8gQXN5bmMgdmVyc2lvbgorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBTaGFyZWRTZXJ2aWNlIEdldFN0cnVjdEFzeW5jKDEpIik7CisgICAgICAgICAgICB2YXIgbG9nID0gYXdhaXQgY2xpZW50LmdldFN0cnVjdEFzeW5jKDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFNoYXJlZFNlcnZpY2UgVmFsdWU6IHtsb2cuVmFsdWV9Iik7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgZW51bSBUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgVGNwLAorICAgICAgICAgICAgTmFtZWRQaXBlLAorICAgICAgICAgICAgSHR0cCwKKyAgICAgICAgICAgIFRjcEJ1ZmZlcmVkLAorICAgICAgICAgICAgRnJhbWVkLAorICAgICAgICAgICAgVGNwVGxzCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gUHJvdG9jb2wKKyAgICAgICAgeworICAgICAgICAgICAgQmluYXJ5LAorICAgICAgICAgICAgQ29tcGFjdCwKKyAgICAgICAgICAgIEpzb24sCisgICAgICAgICAgICBNdWx0aXBsZXhlZAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0c3RkL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3R1dG9yaWFsL25ldHN0ZC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4MzgyZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldHN0ZC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiZGU3OGEwMWItZjdjNi00OWQxLTk3ZGEtNjY5ZDJlZDM3NjQxIildClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0c3RkL0NsaWVudC9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24gYi90dXRvcmlhbC9uZXRzdGQvQ2xpZW50L1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjdiNjBkCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0c3RkL0NsaWVudC9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24KQEAgLTAsMCArMSw4IEBACit7CisgICJwcm9maWxlcyI6IHsKKyAgICAiQ2xpZW50IjogeworICAgICAgImNvbW1hbmROYW1lIjogIlByb2plY3QiLAorICAgICAgImNvbW1hbmRMaW5lQXJncyI6ICItcDptdWx0aXBsZXhlZCIKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRzdGQvQ2xpZW50L1RocmlmdFRlc3QucGZ4IGIvdHV0b3JpYWwvbmV0c3RkL0NsaWVudC9UaHJpZnRUZXN0LnBmeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRlZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0c3RkL0NsaWVudC9UaHJpZnRUZXN0LnBmeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRzdGQvSW50ZXJmYWNlcy8uZ2l0aWdub3JlIGIvdHV0b3JpYWwvbmV0c3RkL0ludGVyZmFjZXMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTc0NDZlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0c3RkL0ludGVyZmFjZXMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKKyMgaWdub3JlIGZvciBhdXRvZ2VuZXJhdGVkIGZpbGVzCisvc2hhcmVkCisvdHV0b3JpYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldHN0ZC9JbnRlcmZhY2VzL0ludGVyZmFjZXMuY3Nwcm9qIGIvdHV0b3JpYWwvbmV0c3RkL0ludGVyZmFjZXMvSW50ZXJmYWNlcy5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViZWI0ZgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldHN0ZC9JbnRlcmZhY2VzL0ludGVyZmFjZXMuY3Nwcm9qCkBAIC0wLDAgKzEsNDggQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8IS0tCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAgIAorICAJICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+CisKKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRzdGFuZGFyZDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+SW50ZXJmYWNlczwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+SW50ZXJmYWNlczwvUGFja2FnZUlkPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLi8uLi8uLi9saWIvbmV0c3RkL1RocmlmdC9UaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZXJ2aWNlTW9kZWwuUHJpbWl0aXZlcyIgVmVyc2lvbj0iNC41LjMiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxUYXJnZXQgTmFtZT0iUHJlQnVpbGQiIEJlZm9yZVRhcmdldHM9Il9HZW5lcmF0ZVJlc3RvcmVQcm9qZWN0U3BlYztSZXN0b3JlO0NvbXBpbGUiPgorICAgIDxFeGVjIENvbmRpdGlvbj0iJyQoT1MpJyA9PSAnV2luZG93c19OVCciIENvbW1hbmQ9IndoZXJlIHRocmlmdCIgQ29uc29sZVRvTVNCdWlsZD0idHJ1ZSI+CisgICAgICA8T3V0cHV0IFRhc2tQYXJhbWV0ZXI9IkNvbnNvbGVPdXRwdXQiIFByb3BlcnR5TmFtZT0iUGF0aFRvVGhyaWZ0IiAvPgorICAgIDwvRXhlYz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQYXRoVG9UaHJpZnQpJykiIENvbW1hbmQ9IiQoUGF0aFRvVGhyaWZ0KSAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRzdGQ6d2NmLHVuaW9uLHNlcmlhbCAtciAuLy4uLy4uL3R1dG9yaWFsLnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRzdGQ6d2NmLHVuaW9uLHNlcmlhbCAtciAuLy4uLy4uL3R1dG9yaWFsLnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnLi8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0JykiIENvbW1hbmQ9Ii4vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRzdGQ6d2NmLHVuaW9uLHNlcmlhbCAtciAuLy4uLy4uL3R1dG9yaWFsLnRocmlmdCIgLz4KKyAgPC9UYXJnZXQ+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldHN0ZC9JbnRlcmZhY2VzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdHV0b3JpYWwvbmV0c3RkL0ludGVyZmFjZXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyNmIxNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldHN0ZC9JbnRlcmZhY2VzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoIjRkMTMxNjNkLTkwNjctNGM5Yy04YWYwLTY0ZTA4NDUxMzk3ZCIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldHN0ZC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL25ldHN0ZC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzA1NTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0c3RkL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLiAKKworYWxsLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgSW50ZXJmYWNlcy5kbGwKKwkkKFJNKSAtciBDbGllbnQvYmluCisJJChSTSkgLXIgQ2xpZW50L29iagorCSQoUk0pIC1yIFNlcnZlci9iaW4KKwkkKFJNKSAtciBTZXJ2ZXIvb2JqCisJJChSTSkgLXIgSW50ZXJmYWNlcy9iaW4KKwkkKFJNKSAtciBJbnRlcmZhY2VzL29iagorCitFWFRSQV9ESVNUID0gXAorCUNsaWVudCBcCisJSW50ZXJmYWNlcyBcCisJUkVBRE1FLm1kIFwKKwlTZXJ2ZXIgXAorCVR1dG9yaWFsLnNsbiBcCisJYnVpbGQuY21kIFwKKwlidWlsZC5zaAorCQkJIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0c3RkL1JFQURNRS5tZCBiL3R1dG9yaWFsL25ldHN0ZC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4MzE3YQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldHN0ZC9SRUFETUUubWQKQEAgLTAsMCArMSwyNzggQEAKKyMgQnVpbGRpbmcgb2Ygc2FtcGxlcyBmb3IgZGlmZmVyZW50IHBsYXRmb3JtcyAKKworIyBSZXVzZWQgY29tcG9uZW50cyAKKy0gTkVUIENvcmUgU3RhbmRhcmQgMi4wCistIE5FVCBDb3JlIEFwcCAyLjAKKworIyBIb3cgdG8gYnVpbGQKKy0gRG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIGxhdGVzdCAuTkVUIENvcmUgU0RLIGZvciB5b3VyIHBsYXRmb3JtIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vbmV0L2NvcmUjd2luZG93c3ZzMjAxNSAoYXJjaGl2ZSBmb3IgU0RLIDEuMC4wLXByZXZpZXcyLTAwMzEyMSBsb2NhdGVkIGJ5OiBodHRwczovL2dpdGh1Yi5jb20vZG90bmV0L2NvcmUvYmxvYi9tYXN0ZXIvcmVsZWFzZS1ub3Rlcy9kb3dubG9hZC1hcmNoaXZlLm1kKQorLSBFbnN1cmUgdGhhdCB5b3UgaGF2ZSB0aHJpZnQuZXhlIHdoaWNoIHN1cHBvcnRzIG5ldHN0ZCBsaWIgYW5kIGl0IGFkZGVkIHRvIFBBVEggCistIEdvIHRvIGN1cnJlbnQgZm9sZGVyIAorLSBSdW4gKipidWlsZC5zaCoqIG9yICoqYnVpbGQuY21kKiogZnJvbSB0aGUgcm9vdCBvZiBjbG9uZWQgcmVwb3NpdG9yeQorLSBDaGVjayB0ZXN0cyBpbiAqKnNyYy9UZXN0cyoqIGZvbGRlcgorLSBDb250aW51ZSB3aXRoIC90dXRvcmlhbHMvbmV0c3RkIAorCisjIEhvdyB0byBydW4gCisKK05vdGVzOiBkb3RuZXQgcnVuIHN1cHBvcnRzIHBhc3NpbmcgYXJndW1lbnRzIHRvIGFwcCBhZnRlciAtLSBzeW1ib2xzIChodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9kb3RuZXQvYXJ0aWNsZXMvY29yZS90b29scy9kb3RuZXQtcnVuKSAtIGV4YW1wbGU6ICoqZG90bmV0IHJ1biAtLSAtaCoqIHdpbGwgc2hvdyBoZWxwIGZvciBhcHAKKworLSBidWlsZCAKKy0gZ28gdG8gZm9sZGVyIChDbGllbnQvU2VydmVyKSAKKy0gcnVuIHdpdGggc3BlY2lmeWluZyBvZiBjb3JyZWN0IHBhcmFtZXRlcnMgKipkb3RuZXQgcnVuIC10cjp0Y3AgLXByOm11bHRpcGxleGVkKiosICoqZG90bmV0IHJ1biAtaGVscCoqIChsYXRlciwgYWZ0ZXIgbWlncmF0aW9uIHRvIGNzcHJvaiBhbmQgbGF0ZXN0IFNESyB3aWxsIGJlIHBvc3NpYmlsaXR5IHRvIHVzZSBtb3JlIHVzYWJsZSBmb3JtICoqZG90bmV0IHJ1biAtLSBhcmd1bWVudHMqKikKKworI05vdGVzCistIFBvc3NpYmxlIGFkZGluZyBhZGRpdGlvbmFsIHBsYXRmb3JtcyBhZnRlciBzdGFiaWxpemF0aW9uIG9mIC5ORVQgQ29yZSAocnVudGltZXMsIHBsYXRmb3JtcyAoUmVkIEhhdCBMaW51eCwgT3BlblN1c2UsIGV0Yy4pIAorCisjS25vd24gaXNzdWVzCistIEluIHRyYWNlIGxvZ2dpbmcgbW9kZSB5b3UgY2FuIHNlZSBzb21lIG5vdCBpbXBvcnRhbnQgaW50ZXJuYWwgZXhjZXB0aW9ucworCisjIFJ1bm5pbmcgb2Ygc2FtcGxlcyAKK1BsZWFzZSBpbnN0YWxsIFRocmlmdCBDIyAuTkVUIENvcmUgbGlicmFyeSBvciBjb3B5IHNvdXJjZXMgYW5kIGJ1aWxkIHRoZW0gdG8gY29ycmVjbHkgYnVpbGQgYW5kIHJ1biBzYW1wbGVzIAorCisjIE5ldENvcmUgU2VydmVyCisKK1VzYWdlOiAKKworICAgIFNlcnZlci5leGUgLWgKKyAgICAgICAgd2lsbCBkaXBsYXkgaGVscCBpbmZvcm1hdGlvbiAKKworICAgIFNlcnZlci5leGUgLXRyOjx0cmFuc3BvcnQ+IC1wcjo8cHJvdG9jb2w+IAorICAgICAgICB3aWxsIHJ1biBzZXJ2ZXIgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzICh0Y3AgdHJhbnNwb3J0IGFuZCBiaW5hcnkgcHJvdG9jb2wgYnkgZGVmYXVsdCkKKworT3B0aW9uczoKKworICAgIC10ciAodHJhbnNwb3J0KTogCisgICAgICAgIHRjcCAtIChkZWZhdWx0KSB0Y3AgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICB0Y3BidWZmZXJlZCAtIHRjcCBidWZmZXJlZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIG5hbWVkcGlwZSAtIG5hbWVkcGlwZSB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChwaXBlIGFkZHJlc3MgLSAiIi50ZXN0IiIpCisgICAgICAgIGh0dHAgLSBodHRwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGh0dHAgYWRkcmVzcyAtICIibG9jYWxob3N0OjkwOTAiIikKKyAgICAgICAgdGNwdGxzIC0gdGNwIHRyYW5zcG9ydCB3aXRoIHRscyB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgZnJhbWVkIC0gdGNwIGZyYW1lZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisKKyAgICAtcHIgKHByb3RvY29sKTogCisgICAgICAgIGJpbmFyeSAtIChkZWZhdWx0KSBiaW5hcnkgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGNvbXBhY3QgLSBjb21wYWN0IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBqc29uIC0ganNvbiBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKwkJCitTYW1wbGU6CisKKyAgICBTZXJ2ZXIuZXhlIC10cjp0Y3AKKworKipSZW1hcmtzKio6CisKKyAgICBGb3IgVGNwVGxzIG1vZGUgY2VydGlmaWNhdGUncyBmaWxlIFRocmlmdFRlc3QucGZ4IHNob3VsZCBiZSBpbiBkaXJlY3Rvcnkgd2l0aCBiaW5hcmllcyBpbiBjYXNlIG9mIGNvbW1hbmQgbGluZSB1c2FnZSAob3IgYXQgcHJvamVjdCBsZXZlbCBpbiBjYXNlIG9mIGRlYnVnZ2luZyBmcm9tIElERSkuCisgICAgUGFzc3dvcmQgZm9yIGNlcnRpZmljYXRlIC0gIlRocmlmdFRlc3QiLgorCisKKworIyBOZXRDb3JlIENsaWVudAorCitVc2FnZTogCisKKyAgICBDbGllbnQuZXhlIC1oCisgICAgICAgIHdpbGwgZGlwbGF5IGhlbHAgaW5mb3JtYXRpb24gCisKKyAgICBDbGllbnQuZXhlIC10cjo8dHJhbnNwb3J0PiAtcHI6PHByb3RvY29sPiAtbWM6PG51bUNsaWVudHM+CisgICAgICAgIHdpbGwgcnVuIGNsaWVudCB3aXRoIHNwZWNpZmllZCBhcmd1bWVudHMgKHRjcCB0cmFuc3BvcnQgYW5kIGJpbmFyeSBwcm90b2NvbCBieSBkZWZhdWx0KQorCitPcHRpb25zOgorCisgICAgLXRyICh0cmFuc3BvcnQpOiAKKyAgICAgICAgdGNwIC0gKGRlZmF1bHQpIHRjcCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIHRjcGJ1ZmZlcmVkIC0gYnVmZmVyZWQgdHJhbnNwb3J0IG92ZXIgdGNwIHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBuYW1lZHBpcGUgLSBuYW1lZHBpcGUgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAocGlwZSBhZGRyZXNzIC0gIiIudGVzdCIiKQorICAgICAgICBodHRwIC0gaHR0cCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChhZGRyZXNzIC0gIiJodHRwOi8vbG9jYWxob3N0OjkwOTAiIikgICAgICAgIAorICAgICAgICB0Y3B0bHMgLSB0Y3AgdGxzIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgZnJhbWVkIC0gdGNwIGZyYW1lZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisKKyAgICAtcHIgKHByb3RvY29sKTogCisgICAgICAgIGJpbmFyeSAtIChkZWZhdWx0KSBiaW5hcnkgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGNvbXBhY3QgLSBjb21wYWN0IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBqc29uIC0ganNvbiBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgCisgICAgLW1jIChtdWx0aXBsZSBjbGllbnRzKToKKyAgICAgICAgPG51bUNsaWVudHM+IC0gbnVtYmVyIG9mIG11bHRpcGxlIGNsaWVudHMgdG8gY29ubmVjdCB0byBzZXJ2ZXIgKG1heCAxMDAsIGRlZmF1bHQgMSkKKworU2FtcGxlOgorCisgICAgQ2xpZW50LmV4ZSAtdHI6dGNwIC1wcjpiaW5hcnkgLW1jOjEwCisKK1JlbWFya3M6CisKKyAgICBGb3IgVGNwVGxzIG1vZGUgY2VydGlmaWNhdGUncyBmaWxlIFRocmlmdFRlc3QucGZ4IHNob3VsZCBiZSBpbiBkaXJlY3RvcnkgCisJd2l0aCBiaW5hcmllcyBpbiBjYXNlIG9mIGNvbW1hbmQgbGluZSB1c2FnZSAob3IgYXQgcHJvamVjdCBsZXZlbCBpbiBjYXNlIG9mIGRlYnVnZ2luZyBmcm9tIElERSkuCisgICAgUGFzc3dvcmQgZm9yIGNlcnRpZmljYXRlIC0gIlRocmlmdFRlc3QiLgorCisjIEhvdyB0byB0ZXN0IGNvbW11bmljYXRpb24gYmV0d2VlbiBOZXRDb3JlIGFuZCBQeXRob24KKworKiBHZW5lcmF0ZSBjb2RlIHdpdGggdGhlIGxhdGVzdCAqKnRocmlmdC5leGUqKiB1dGlsCisqIEVuc3VyZSB0aGF0ICoqdGhyaWZ0LmV4ZSoqIHV0aWwgZ2VuZXJhdGVkIGZvbGRlciAqKmdlbi1weSoqIHdpdGggZ2VuZXJhdGVkIGNvZGUgZm9yIFB5dGhvbgorKiBDcmVhdGUgKipjbGllbnQucHkqKiBhbmQgKipzZXJ2ZXIucHkqKiBmcm9tIHRoZSBjb2RlIGV4YW1wbGVzIGJlbG93IGFuZCBzYXZlIHRoZW0gdG8gdGhlIGZvbGRlciB3aXRoIHByZXZpb3NseSBnZW5lcmF0ZWQgZm9sZGVyICoqZ2VuLXB5KioKKyogUnVuIG5ldHN0ZCBzYW1wbGVzIChjbGllbnQgYW5kIHNlcnZlcikgYW5kIHB5dGhvbiBzYW1wbGVzIChjbGllbnQgYW5kIHNlcnZlcikKKworUmVtYXJrczoKKworU2FtcGxlcyBvZiBjbGllbnQgYW5kIHNlcnZlciBjb2RlIGJlbG93IHVzZSBjb3JyZWN0IG1ldGhvZHMgKG9wZXJhdGlvbnMpIAorYW5kIGZpZWxkcyAocHJvcGVydGllcykgYWNjb3JkaW5nIHRvIGdlbmVyYXRlZCBjb250cmFjdHMgZnJvbSAqLnRocmlmdCBmaWxlcworCitBdCBXaW5kb3dzIDEwIGFkZCByZWNvcmQgKioxMjcuMC4wLjEgdGVzdHNlcnZlcioqIHRvICoqQzpcV2luZG93c1xTeXN0ZW0zMlxkcml2ZXJzXGV0Y1xob3N0cyoqIGZpbGUKK2ZvciBjb3JyZWN0IHdvcmsgb2YgcHl0aG9uIHNlcnZlcgorCisKKyoqUHl0aG9uIENsaWVudDoqKgorCQorYGBgcHl0aG9uCitpbXBvcnQgc3lzCitpbXBvcnQgZ2xvYgorc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorCitmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uLCBXb3JrCisKK2Zyb20gdGhyaWZ0IGltcG9ydCBUaHJpZnQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisKKworZGVmIG1haW4oKToKKyAgICAjIE1ha2Ugc29ja2V0CisgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU29ja2V0KCcxMjcuMC4wLjEnLCA5MDkwKQorCisgICAgIyBCdWZmZXJpbmcgaXMgY3JpdGljYWwuIFJhdyBzb2NrZXRzIGFyZSB2ZXJ5IHNsb3cKKyAgICB0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQpCisKKyAgICAjIFdyYXAgaW4gYSBwcm90b2NvbAorICAgIHByb3RvY29sID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpCisKKyAgICAjIENyZWF0ZSBhIGNsaWVudCB0byB1c2UgdGhlIHByb3RvY29sIGVuY29kZXIKKyAgICBjbGllbnQgPSBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCkKKworICAgICMgQ29ubmVjdCEKKyAgICB0cmFuc3BvcnQub3BlbigpCisKKyAgICBjbGllbnQuUGluZygpCisgICAgcHJpbnQoJ3BpbmcoKScpCisKKyAgICBzdW0gPSBjbGllbnQuQWRkKDEsIDEpCisgICAgcHJpbnQoKCcxKzE9JWQnICUgKHN1bSkpKQorCisgICAgd29yayA9IFdvcmsoKQorCisgICAgd29yay5PcCA9IE9wZXJhdGlvbi5EaXZpZGUKKyAgICB3b3JrLk51bTEgPSAxCisgICAgd29yay5OdW0yID0gMAorCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IGNsaWVudC5DYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKQorICAgICAgICBwcmludCgnRllJIHRoZSBhbnN3ZXIgaXMgJWQnICUgcXVvdGllbnQpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoKCdJbnZhbGlkT3BlcmF0aW9uOiAlcicgJSBlKSkKKworICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uU3Vic3RyYWN0CisgICAgd29yay5OdW0xID0gMTUKKyAgICB3b3JrLk51bTIgPSAxMAorCisgICAgZGlmZiA9IGNsaWVudC5DYWxjdWxhdGUoMSwgd29yaykKKyAgICBwcmludCgoJzE1LTEwPSVkJyAlIChkaWZmKSkpCisKKyAgICBsb2cgPSBjbGllbnQuR2V0U3RydWN0KDEpCisgICAgcHJpbnQoKCdDaGVjayBsb2c6ICVzJyAlIChsb2cuVmFsdWUpKSkKKworICAgIGNsaWVudC5aaXAoKQorICAgIHByaW50KCd6aXAoKScpCisKKyAgICAjIENsb3NlIQorICAgIHRyYW5zcG9ydC5jbG9zZSgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHRyeToKKyAgICBtYWluKCkKKyAgZXhjZXB0IFRocmlmdC5URXhjZXB0aW9uIGFzIHR4OgorICAgIHByaW50KCclcycgJSB0eC5tZXNzYWdlKQorYGBgCisKKworKipQeXRob24gU2VydmVyOioqCisKKworYGBgcHl0aG9uCitpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cworc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorCitmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uCisKK2Zyb20gc2hhcmVkLnR0eXBlcyBpbXBvcnQgU2hhcmVkU3RydWN0CisKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKKworCitjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubG9nID0ge30KKworICAgIGRlZiBQaW5nKHNlbGYpOgorICAgICAgICBwcmludCgncGluZygpJykKKworICAgIGRlZiBBZGQoc2VsZiwgbjEsIG4yKToKKyAgICAgICAgcHJpbnQoJ2FkZCglZCwlZCknICUgKG4xLCBuMikpCisgICAgICAgIHJldHVybiBuMSArIG4yCisKKyAgICBkZWYgQ2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKKyAgICAgICAgcHJpbnQoJ2NhbGN1bGF0ZSglZCwgJXIpJyAlIChsb2dpZCwgd29yaykpCisKKyAgICAgICAgaWYgd29yay5PcCA9PSBPcGVyYXRpb24uQWRkOgorICAgICAgICAgICAgdmFsID0gd29yay5OdW0xICsgd29yay5OdW0yCisgICAgICAgIGVsaWYgd29yay5PcCA9PSBPcGVyYXRpb24uU3Vic3RyYWN0OgorICAgICAgICAgICAgdmFsID0gd29yay5OdW0xIC0gd29yay5OdW0yCisgICAgICAgIGVsaWYgd29yay5PcCA9PSBPcGVyYXRpb24uTXVsdGlwbHk6CisgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKiB3b3JrLk51bTIKKyAgICAgICAgZWxpZiB3b3JrLk9wID09IE9wZXJhdGlvbi5EaXZpZGU6CisgICAgICAgICAgICBpZiB3b3JrLk51bTIgPT0gMDoKKyAgICAgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICAgICAgeC5XaGF0T3AgPSB3b3JrLk9wCisgICAgICAgICAgICAgICAgeC5XaHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJworICAgICAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSAvIHdvcmsuTnVtMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgeC5XaGF0T3AgPSB3b3JrLk9wCisgICAgICAgICAgICB4LldoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKKyAgICAgICAgICAgIHJhaXNlIHgKKworICAgICAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQorICAgICAgICBsb2cuS2V5ID0gbG9naWQKKyAgICAgICAgbG9nLlZhbHVlID0gJyVkJyAlICh2YWwpCisgICAgICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZworCisgICAgICAgIHJldHVybiB2YWwKKworICAgIGRlZiBHZXRTdHJ1Y3Qoc2VsZiwga2V5KToKKyAgICAgICAgcHJpbnQoJ2dldFN0cnVjdCglZCknICUgKGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCisKKyAgICBkZWYgWmlwKHNlbGYpOgorICAgICAgICBwcmludCgnemlwKCknKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCisgICAgcHJvY2Vzc29yID0gQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcikKKyAgICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQoaG9zdD0idGVzdHNlcnZlciIsIHBvcnQ9OTA5MCkKKyAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisKKyAgICBzZXJ2ZXIgPSBUU2VydmVyLlRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICBwcmludCgnU3RhcnRpbmcgdGhlIHNlcnZlci4uLicpCisgICAgc2VydmVyLnNlcnZlKCkKKyAgICBwcmludCgnZG9uZS4nKQorCisgICAgIyBZb3UgY291bGQgZG8gb25lIG9mIHRoZXNlIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyCisgICAgIyBzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgICMgc2VydmVyID0gVFNlcnZlci5UVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorYGBgCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRzdGQvU2VydmVyL1Byb2dyYW0uY3MgYi90dXRvcmlhbC9uZXRzdGQvU2VydmVyL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2NTBjNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldHN0ZC9TZXJ2ZXIvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDQyOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5Bc3BOZXRDb3JlLkJ1aWxkZXI7Cit1c2luZyBNaWNyb3NvZnQuQXNwTmV0Q29yZS5Ib3N0aW5nOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuQ29uZmlndXJhdGlvbjsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkRlcGVuZGVuY3lJbmplY3Rpb247Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0LlNlcnZlcjsKK3VzaW5nIHR1dG9yaWFsOwordXNpbmcgc2hhcmVkOwordXNpbmcgVGhyaWZ0LlByb2Nlc3NvcjsKKworbmFtZXNwYWNlIFNlcnZlcgoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTG9nZ2VyIExvZ2dlciA9IG5ldyBMb2dnZXJGYWN0b3J5KCkuQWRkQ29uc29sZShMb2dMZXZlbC5UcmFjZSkuQWRkRGVidWcoTG9nTGV2ZWwuVHJhY2UpLkNyZWF0ZUxvZ2dlcihuYW1lb2YoU2VydmVyKSk7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgYXJncyA9IGFyZ3MgPz8gbmV3IHN0cmluZ1swXTsKKworICAgICAgICAgICAgaWYgKGFyZ3MuQW55KHggPT4geC5TdGFydHNXaXRoKCItaGVscCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaXNwbGF5SGVscCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNpbmcgKHZhciBzb3VyY2UgPSBuZXcgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSdW5Bc3luYyhhcmdzLCBzb3VyY2UuVG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiUHJlc3MgYW55IGtleSB0byBzdG9wLi4uIik7CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLlJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgc291cmNlLkNhbmNlbCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIlNlcnZlciBzdG9wcGVkIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIERpc3BsYXlIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKEAiCitVc2FnZTogCisgICAgU2VydmVyLmV4ZSAtaGVscAorICAgICAgICB3aWxsIGRpcGxheSBoZWxwIGluZm9ybWF0aW9uIAorCisgICAgU2VydmVyLmV4ZSAtdHI6PHRyYW5zcG9ydD4gLXByOjxwcm90b2NvbD4KKyAgICAgICAgd2lsbCBydW4gc2VydmVyIHdpdGggc3BlY2lmaWVkIGFyZ3VtZW50cyAodGNwIHRyYW5zcG9ydCBhbmQgYmluYXJ5IHByb3RvY29sIGJ5IGRlZmF1bHQpCisKK09wdGlvbnM6CisgICAgLXRyICh0cmFuc3BvcnQpOiAKKyAgICAgICAgdGNwIC0gKGRlZmF1bHQpIHRjcCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIHRjcGJ1ZmZlcmVkIC0gdGNwIGJ1ZmZlcmVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgbmFtZWRwaXBlIC0gbmFtZWRwaXBlIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKHBpcGUgYWRkcmVzcyAtICIiLnRlc3QiIikKKyAgICAgICAgaHR0cCAtIGh0dHAgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaHR0cCBhZGRyZXNzIC0gIiJsb2NhbGhvc3Q6OTA5MCIiKQorICAgICAgICB0Y3B0bHMgLSB0Y3AgdHJhbnNwb3J0IHdpdGggdGxzIHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBtdWx0aXBsZXhlZCAtIG11bHRpcGxleGVkIHByb3RvY29sIHdpbGwgYmUgdXNlZAorCitTYW1wbGU6CisgICAgU2VydmVyLmV4ZSAtdHI6dGNwIAorIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIFJ1bkFzeW5jKHN0cmluZ1tdIGFyZ3MsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VsZWN0ZWRUcmFuc3BvcnQgPSBHZXRUcmFuc3BvcnQoYXJncyk7CisgICAgICAgICAgICB2YXIgc2VsZWN0ZWRQcm90b2NvbCA9IEdldFByb3RvY29sKGFyZ3MpOworCisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFuc3BvcnQgPT0gVHJhbnNwb3J0Lkh0dHApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IEh0dHBTZXJ2ZXJTYW1wbGUoKS5SdW4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFJ1blNlbGVjdGVkQ29uZmlndXJhdGlvbkFzeW5jKHNlbGVjdGVkVHJhbnNwb3J0LCBzZWxlY3RlZFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBQcm90b2NvbCBHZXRQcm90b2NvbChzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gYXJncy5GaXJzdE9yRGVmYXVsdCh4ID0+IHguU3RhcnRzV2l0aCgiLXByIikpPy5TcGxpdCgnOicpP1sxXTsKKworICAgICAgICAgICAgRW51bS5UcnlQYXJzZSh0cmFuc3BvcnQsIHRydWUsIG91dCBQcm90b2NvbCBzZWxlY3RlZFByb3RvY29sKTsKKworICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkUHJvdG9jb2w7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItdHIiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBFbnVtLlRyeVBhcnNlKHRyYW5zcG9ydCwgdHJ1ZSwgb3V0IFRyYW5zcG9ydCBzZWxlY3RlZFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFRyYW5zcG9ydDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuU2VsZWN0ZWRDb25maWd1cmF0aW9uQXN5bmMoVHJhbnNwb3J0IHRyYW5zcG9ydCwgUHJvdG9jb2wgcHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmFicmljID0gbmV3IExvZ2dlckZhY3RvcnkoKS5BZGRDb25zb2xlKExvZ0xldmVsLlRyYWNlKS5BZGREZWJ1ZyhMb2dMZXZlbC5UcmFjZSk7CisgICAgICAgICAgICB2YXIgaGFuZGxlciA9IG5ldyBDYWxjdWxhdG9yQXN5bmNIYW5kbGVyKCk7CisgICAgICAgICAgICBJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciA9IG51bGw7CisKKyAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0ID0gbnVsbDsKKworICAgICAgICAgICAgc3dpdGNoICh0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwOgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydCg5MDkwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwQnVmZmVyZWQ6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KHBvcnQ6IDkwOTAsIGNsaWVudFRpbWVvdXQ6IDEwMDAwLCB1c2VCdWZmZXJlZFNvY2tldHM6IHRydWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5OYW1lZFBpcGU6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KCIudGVzdCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5UY3BUbHM6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0KDkwOTAsIGZhbHNlLCBHZXRDZXJ0aWZpY2F0ZSgpLCBDbGllbnRDZXJ0VmFsaWRhdG9yLCBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5GcmFtZWQ6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KDkwOTApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKKyAgICAgICAgICAgIHN3aXRjaCAocHJvdG9jb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5CaW5hcnk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3IoaGFuZGxlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkNvbXBhY3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuSnNvbjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRKc29uUHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEpzb25Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLkFzeW5jUHJvY2Vzc29yKGhhbmRsZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5NdWx0aXBsZXhlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBjYWxjSGFuZGxlciA9IG5ldyBDYWxjdWxhdG9yQXN5bmNIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBjYWxjUHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3IoY2FsY0hhbmRsZXIpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZWRTZXJ2aWNlSGFuZGxlciA9IG5ldyBTaGFyZWRTZXJ2aWNlQXN5bmNIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZWRTZXJ2aWNlUHJvY2Vzc29yID0gbmV3IFNoYXJlZFNlcnZpY2UuQXN5bmNQcm9jZXNzb3Ioc2hhcmVkU2VydmljZUhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBtdWx0aXBsZXhlZFByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IobmFtZW9mKENhbGN1bGF0b3IpLCBjYWxjUHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IobmFtZW9mKFNoYXJlZFNlcnZpY2UpLCBzaGFyZWRTZXJ2aWNlUHJvY2Vzc29yKTsKKworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBtdWx0aXBsZXhlZFByb2Nlc3NvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKHByb3RvY29sKSwgcHJvdG9jb2wsIG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oCisgICAgICAgICAgICAgICAgICAgICQiU2VsZWN0ZWQgVEFzeW5jU2VydmVyIHdpdGgge3NlcnZlclRyYW5zcG9ydH0gdHJhbnNwb3J0LCB7cHJvY2Vzc29yfSBwcm9jZXNzb3IgYW5kIHtpbnB1dFByb3RvY29sRmFjdG9yeX0gcHJvdG9jb2wgZmFjdG9yaWVzIik7CisKKyAgICAgICAgICAgICAgICB2YXIgc2VydmVyID0gbmV3IFRTaW1wbGVBc3luY1NlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgZmFicmljKTsKKworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpOworICAgICAgICAgICAgICAgIGF3YWl0IHNlcnZlci5TZXJ2ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oeC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZTIgR2V0Q2VydGlmaWNhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkdWUgdG8gZmlsZXMgbG9jYXRpb24gaW4gbmV0IGNvcmUgYmV0dGVyIHRvIHRha2UgY2VydHMgZnJvbSB0b3AgZm9sZGVyCisgICAgICAgICAgICB2YXIgY2VydEZpbGUgPSBHZXRDZXJ0UGF0aChEaXJlY3RvcnkuR2V0UGFyZW50KERpcmVjdG9yeS5HZXRDdXJyZW50RGlyZWN0b3J5KCkpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWDUwOUNlcnRpZmljYXRlMihjZXJ0RmlsZSwgIlRocmlmdFRlc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBHZXRDZXJ0UGF0aChEaXJlY3RvcnlJbmZvIGRpLCBpbnQgbWF4Q291bnQgPSA2KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG9wRGlyID0gZGk7CisgICAgICAgICAgICB2YXIgY2VydEZpbGUgPQorICAgICAgICAgICAgICAgIHRvcERpci5FbnVtZXJhdGVGaWxlcygiVGhyaWZ0VGVzdC5wZngiLCBTZWFyY2hPcHRpb24uQWxsRGlyZWN0b3JpZXMpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGNlcnRGaWxlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1heENvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkNhbm5vdCBmaW5kIGZpbGUgaW4gZGlyZWN0b3JpZXMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0Q2VydFBhdGgoZGkuUGFyZW50LCBtYXhDb3VudCAtIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gY2VydEZpbGUuRnVsbE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrKG9iamVjdCBzZW5kZXIsCisgICAgICAgICAgICBzdHJpbmcgdGFyZ2V0SG9zdCwgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiBsb2NhbENlcnRpZmljYXRlcywKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSByZW1vdGVDZXJ0aWZpY2F0ZSwgc3RyaW5nW10gYWNjZXB0YWJsZUlzc3VlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRDZXJ0aWZpY2F0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBDbGllbnRDZXJ0VmFsaWRhdG9yKG9iamVjdCBzZW5kZXIsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFg1MDlDaGFpbiBjaGFpbiwgU3NsUG9saWN5RXJyb3JzIHNzbFBvbGljeUVycm9ycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gVHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcCwKKyAgICAgICAgICAgIFRjcEJ1ZmZlcmVkLAorICAgICAgICAgICAgTmFtZWRQaXBlLAorICAgICAgICAgICAgSHR0cCwKKyAgICAgICAgICAgIFRjcFRscywKKyAgICAgICAgICAgIEZyYW1lZAorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIFByb3RvY29sCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpbmFyeSwKKyAgICAgICAgICAgIENvbXBhY3QsCisgICAgICAgICAgICBKc29uLAorICAgICAgICAgICAgTXVsdGlwbGV4ZWQKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBIdHRwU2VydmVyU2FtcGxlCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFJ1bihDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb25CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLkFkZEVudmlyb25tZW50VmFyaWFibGVzKHByZWZpeDogIkFTUE5FVENPUkVfIikKKyAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCk7CisKKyAgICAgICAgICAgICAgICB2YXIgaG9zdCA9IG5ldyBXZWJIb3N0QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5Vc2VDb25maWd1cmF0aW9uKGNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgLlVzZUtlc3RyZWwoKQorICAgICAgICAgICAgICAgICAgICAuVXNlVXJscygiaHR0cDovL2xvY2FsaG9zdDo5MDkwIikKKyAgICAgICAgICAgICAgICAgICAgLlVzZUNvbnRlbnRSb290KERpcmVjdG9yeS5HZXRDdXJyZW50RGlyZWN0b3J5KCkpCisgICAgICAgICAgICAgICAgICAgIC5Vc2VTdGFydHVwPFN0YXJ0dXA+KCkKKyAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCk7CisKKyAgICAgICAgICAgICAgICBob3N0LlJ1bkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBTdGFydHVwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVibGljIFN0YXJ0dXAoSUhvc3RpbmdFbnZpcm9ubWVudCBlbnYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBDb25maWd1cmF0aW9uQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuU2V0QmFzZVBhdGgoZW52LkNvbnRlbnRSb290UGF0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRFbnZpcm9ubWVudFZhcmlhYmxlcygpOworCisgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gPSBidWlsZGVyLkJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIElDb25maWd1cmF0aW9uUm9vdCBDb25maWd1cmF0aW9uIHsgZ2V0OyB9CisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCBieSB0aGUgcnVudGltZS4gVXNlIHRoaXMgbWV0aG9kIHRvIGFkZCBzZXJ2aWNlcyB0byB0aGUgY29udGFpbmVyLgorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIENvbmZpZ3VyZVNlcnZpY2VzKElTZXJ2aWNlQ29sbGVjdGlvbiBzZXJ2aWNlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLkFkZFRyYW5zaWVudDxDYWxjdWxhdG9yLklBc3luYywgQ2FsY3VsYXRvckFzeW5jSGFuZGxlcj4oKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXMuQWRkVHJhbnNpZW50PElUQXN5bmNQcm9jZXNzb3IsIENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3I+KCk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLkFkZFRyYW5zaWVudDxUSHR0cFNlcnZlclRyYW5zcG9ydCwgVEh0dHBTZXJ2ZXJUcmFuc3BvcnQ+KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgYnkgdGhlIHJ1bnRpbWUuIFVzZSB0aGlzIG1ldGhvZCB0byBjb25maWd1cmUgdGhlIEhUVFAgcmVxdWVzdCBwaXBlbGluZS4KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBDb25maWd1cmUoSUFwcGxpY2F0aW9uQnVpbGRlciBhcHAsIElIb3N0aW5nRW52aXJvbm1lbnQgZW52LAorICAgICAgICAgICAgICAgICAgICBJTG9nZ2VyRmFjdG9yeSBsb2dnZXJGYWN0b3J5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwLlVzZU1pZGRsZXdhcmU8VEh0dHBTZXJ2ZXJUcmFuc3BvcnQ+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIENhbGN1bGF0b3JBc3luY0hhbmRsZXIgOiBDYWxjdWxhdG9yLklBc3luYworICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8aW50LCBTaGFyZWRTdHJ1Y3Q+IF9sb2cgPSBuZXcgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4oKTsKKworICAgICAgICAgICAgcHVibGljIENhbGN1bGF0b3JBc3luY0hhbmRsZXIoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxTaGFyZWRTdHJ1Y3Q+IGdldFN0cnVjdEFzeW5jKGludCBrZXksCisgICAgICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJHZXRTdHJ1Y3RBc3luYyh7MH0pIiwga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tUmVzdWx0KF9sb2dba2V5XSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIHBpbmdBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIlBpbmdBc3luYygpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxpbnQ+IGFkZEFzeW5jKGludCBudW0xLCBpbnQgbnVtMiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiQWRkQXN5bmMoe251bTF9LHtudW0yfSkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tUmVzdWx0KG51bTEgKyBudW0yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8aW50PiBjYWxjdWxhdGVBc3luYyhpbnQgbG9naWQsIFdvcmsgdywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiQ2FsY3VsYXRlQXN5bmMoe2xvZ2lkfSwgW3t3Lk9wfSx7dy5OdW0xfSx7dy5OdW0yfV0pIik7CisKKyAgICAgICAgICAgICAgICB2YXIgdmFsID0gMDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHcuT3ApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB3Lk51bTEgKyB3Lk51bTI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHcuTnVtMSAtIHcuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdy5OdW0xICogdy5OdW0yOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHcuTnVtMiA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGF0T3AgPSAoaW50KSB3Lk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHcuTnVtMSAvIHcuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hhdE9wID0gKGludCkgdy5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaHkgPSAiVW5rbm93biBvcGVyYXRpb24iCisgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtleSA9IGxvZ2lkLAorICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IHZhbC5Ub1N0cmluZygpCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIF9sb2dbbG9naWRdID0gZW50cnk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tUmVzdWx0KHZhbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIHppcEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiWmlwQXN5bmMoKSB3aXRoIGRlbGF5IDEwMG1jIik7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5EZWxheSgxMDAsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIFNoYXJlZFNlcnZpY2VBc3luY0hhbmRsZXIgOiBTaGFyZWRTZXJ2aWNlLklBc3luYworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxTaGFyZWRTdHJ1Y3Q+IGdldFN0cnVjdEFzeW5jKGludCBrZXksIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiR2V0U3RydWN0QXN5bmMoezB9KSIsIGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbVJlc3VsdChuZXcgU2hhcmVkU3RydWN0KCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtleSA9IGtleSwKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiR2V0U3RydWN0QXN5bmMiCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRzdGQvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdHV0b3JpYWwvbmV0c3RkL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQ0MjM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0c3RkL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQwIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisKK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJlMjEwZmMxMC01YWZmLTRiMDQtYWMyMS01OGFmYzdiNzRiMGMiKV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRzdGQvU2VydmVyL1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbiBiL3R1dG9yaWFsL25ldHN0ZC9TZXJ2ZXIvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDc2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRzdGQvU2VydmVyL1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbgpAQCAtMCwwICsxLDggQEAKK3sKKyAgInByb2ZpbGVzIjogeworICAgICJTZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZE5hbWUiOiAiUHJvamVjdCIsCisgICAgICAiY29tbWFuZExpbmVBcmdzIjogIi1wOm11bHRpcGxleGVkIgorICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldHN0ZC9TZXJ2ZXIvU2VydmVyLmNzcHJvaiBiL3R1dG9yaWFsL25ldHN0ZC9TZXJ2ZXIvU2VydmVyLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmMyYzAzCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0c3RkL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qCkBAIC0wLDAgKzEsNDQgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsuV2ViIj4KKyAgPCEtLQorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAKKyAgCSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+U2VydmVyPC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5TZXJ2ZXI8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uL0ludGVyZmFjZXMvSW50ZXJmYWNlcy5jc3Byb2oiIC8+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi4vLi4vLi4vbGliL25ldHN0ZC9UaHJpZnQvVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZSIgVmVyc2lvbj0iMi4yLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkFzcE5ldENvcmUuU2VydmVyLklJU0ludGVncmF0aW9uIiBWZXJzaW9uPSIyLjIuMSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZS5TZXJ2ZXIuS2VzdHJlbCIgVmVyc2lvbj0iMi4yLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkV4dGVuc2lvbnMuQ29uZmlndXJhdGlvbi5GaWxlRXh0ZW5zaW9ucyIgVmVyc2lvbj0iMi4yLjAiIC8+CisgIDwvSXRlbUdyb3VwPgorCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRzdGQvU2VydmVyL1RocmlmdFRlc3QucGZ4IGIvdHV0b3JpYWwvbmV0c3RkL1NlcnZlci9UaHJpZnRUZXN0LnBmeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRlZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0c3RkL1NlcnZlci9UaHJpZnRUZXN0LnBmeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRzdGQvVHV0b3JpYWwuc2xuIGIvdHV0b3JpYWwvbmV0c3RkL1R1dG9yaWFsLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGIyNTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0c3RkL1R1dG9yaWFsLnNsbgpAQCAtMCwwICsxLDc4IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDE1CitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTUuMC4yNjExNC4yCitNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEwLjAuNDAyMTkuMQorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQiLCAiLi5cLi5cbGliXG5ldHN0ZFxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIsICJ7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiSW50ZXJmYWNlcyIsICJJbnRlcmZhY2VzXEludGVyZmFjZXMuY3Nwcm9qIiwgIntCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJDbGllbnQiLCAiQ2xpZW50XENsaWVudC5jc3Byb2oiLCAie0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlNlcnZlciIsICJTZXJ2ZXJcU2VydmVyLmNzcHJvaiIsICJ7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUdsb2JhbHMpID0gcG9zdFNvbHV0aW9uCisJCVNvbHV0aW9uR3VpZCA9IHswNzBBNUQxRC1CMjlELTQ2MDMtOTk5RC02OTNEQjQ0NEFEMER9CisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRzdGQvYnVpbGQuY21kIGIvdHV0b3JpYWwvbmV0c3RkL2J1aWxkLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjg0ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0c3RkL2J1aWxkLmNtZApAQCAtMCwwICsxLDI1IEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KK3NldGxvY2FsCisKK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZAorCis6ZW9mCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRzdGQvYnVpbGQuc2ggYi90dXRvcmlhbC9uZXRzdGQvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3ZTMxMAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldHN0ZC9idWlsZC5zaApAQCAtMCwwICsxLDI2IEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjZXhpdCBpZiBhbnkgY29tbWFuZCBmYWlscworc2V0IC1lCisKK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlLmFtCmluZGV4IGVjZjNiMmIuLjE1MTZmZWMgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL25vZGVqcy9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9ub2RlanMvTWFrZWZpbGUuYW0KQEAgLTE3LDggKzE3LDYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGdlbi1ub2RlanMvQ2FsY3VsYXRvci5qcyBnZW4tbm9kZWpzL1NoYXJlZFNlcnZpY2UuanM6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUgLXIgJDwKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnQuanMgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcwppbmRleCA3NGFhNTVhLi5iNDg4NmU4IDEwMDY0NAotLS0gYS90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcworKysgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcwpAQCAtMTgsMTQgKzE4LDEyIEBACiAgKi8KIAogdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOwotdmFyIFRocmlmdFRyYW5zcG9ydHMgPSByZXF1aXJlKCd0aHJpZnQvdHJhbnNwb3J0Jyk7Ci12YXIgVGhyaWZ0UHJvdG9jb2xzID0gcmVxdWlyZSgndGhyaWZ0L3Byb3RvY29sJyk7CiB2YXIgQ2FsY3VsYXRvciA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9DYWxjdWxhdG9yJyk7CiB2YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL3R1dG9yaWFsX3R5cGVzJyk7Citjb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKIAotCi10cmFuc3BvcnQgPSBUaHJpZnRUcmFuc3BvcnRzLlRCdWZmZXJlZFRyYW5zcG9ydCgpCi1wcm90b2NvbCA9IFRocmlmdFByb3RvY29scy5UQmluYXJ5UHJvdG9jb2woKQordmFyIHRyYW5zcG9ydCA9IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQ7Cit2YXIgcHJvdG9jb2wgPSB0aHJpZnQuVEJpbmFyeVByb3RvY29sOwogCiB2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MDkwLCB7CiAgIHRyYW5zcG9ydCA6IHRyYW5zcG9ydCwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50UHJvbWlzZS5qcyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50UHJvbWlzZS5qcwppbmRleCA3YmNmODg0Li4yY2RjMTg0IDEwMDY0NAotLS0gYS90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudFByb21pc2UuanMKKysrIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnRQcm9taXNlLmpzCkBAIC0xOCwxNCArMTgsMTIgQEAKICAqLwogCiB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Ci12YXIgVGhyaWZ0VHJhbnNwb3J0cyA9IHJlcXVpcmUoJ3RocmlmdC90cmFuc3BvcnQnKTsKLXZhciBUaHJpZnRQcm90b2NvbHMgPSByZXF1aXJlKCd0aHJpZnQvcHJvdG9jb2wnKTsKIHZhciBDYWxjdWxhdG9yID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0NhbGN1bGF0b3InKTsKIHZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvdHV0b3JpYWxfdHlwZXMnKTsKK2NvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpOwogCi0KLXRyYW5zcG9ydCA9IFRocmlmdFRyYW5zcG9ydHMuVEJ1ZmZlcmVkVHJhbnNwb3J0KCkKLXByb3RvY29sID0gVGhyaWZ0UHJvdG9jb2xzLlRCaW5hcnlQcm90b2NvbCgpCit2YXIgdHJhbnNwb3J0ID0gdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydDsKK3ZhciBwcm90b2NvbCA9IHRocmlmdC5UQmluYXJ5UHJvdG9jb2w7CiAKIHZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkwOTAsIHsKICAgdHJhbnNwb3J0IDogdHJhbnNwb3J0LApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvb2NhbWwvX29hc2lzIGIvdHV0b3JpYWwvb2NhbWwvX29hc2lzCmluZGV4IDg2OWNhZjEuLjRhNGYzMzcgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL29jYW1sL19vYXNpcworKysgYi90dXRvcmlhbC9vY2FtbC9fb2FzaXMKQEAgLTEsNSArMSw1IEBACiBOYW1lOiB0dXRvcmlhbAotVmVyc2lvbjogMC45LjMKK1ZlcnNpb246IDAuMTMuMAogT0FTSVNGb3JtYXQ6IDAuMwogU3lub3BzaXM6IE9DYW1sIFR1dG9yaWFsIGV4YW1wbGUKIEF1dGhvcnM6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGVybC9QZXJsQ2xpZW50LnBsIGIvdHV0b3JpYWwvcGVybC9QZXJsQ2xpZW50LnBsCmluZGV4IDFkNTk2NTYuLjdjMjMyODkgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL3BlcmwvUGVybENsaWVudC5wbAorKysgYi90dXRvcmlhbC9wZXJsL1BlcmxDbGllbnQucGwKQEAgLTM3LDEwICszNywxMCBAQAogCiB1c2UgRGF0YTo6RHVtcGVyOwogCi1teSAkc29ja2V0ICAgID0gbmV3IFRocmlmdDo6U29ja2V0KCdsb2NhbGhvc3QnLDkwOTApOwotbXkgJHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0KCRzb2NrZXQsMTAyNCwxMDI0KTsKLW15ICRwcm90b2NvbCAgPSBuZXcgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLW15ICRjbGllbnQgICAgPSBuZXcgdHV0b3JpYWw6OkNhbGN1bGF0b3JDbGllbnQoJHByb3RvY29sKTsKK215ICRzb2NrZXQgICAgPSBUaHJpZnQ6OlNvY2tldC0+bmV3KCdsb2NhbGhvc3QnLDkwOTApOworbXkgJHRyYW5zcG9ydCA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQtPm5ldygkc29ja2V0LDEwMjQsMTAyNCk7CitteSAkcHJvdG9jb2wgID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCR0cmFuc3BvcnQpOworbXkgJGNsaWVudCAgICA9IHR1dG9yaWFsOjpDYWxjdWxhdG9yQ2xpZW50LT5uZXcoJHByb3RvY29sKTsKIAogCiBldmFsewpAQCAtNTMsNyArNTMsNyBAQAogICAgIG15ICRzdW0gPSAkY2xpZW50LT5hZGQoMSwxKTsKICAgICBwcmludCAiMSsxPSRzdW1cbiI7CiAKLSAgICBteSAkd29yayA9IG5ldyB0dXRvcmlhbDo6V29yaygpOworICAgIG15ICR3b3JrID0gdHV0b3JpYWw6OldvcmstPm5ldygpOwogCiAgICAgJHdvcmstPm9wKHR1dG9yaWFsOjpPcGVyYXRpb246OkRJVklERSk7CiAgICAgJHdvcmstPm51bTEoMSk7CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgICRjbGllbnQtPmNhbGN1bGF0ZSgxLCAkd29yayk7CiAgICAgICAgIHByaW50ICJXaG9hISBXZSBjYW4gZGl2aWRlIGJ5IHplcm8/XG4iOwogICAgIH07IGlmKCRAKSB7Ci0gICAgICAgIHdhcm4gIkludmFsaWRPcGVyYXRpb246ICIuRHVtcGVyKCRAKTsKKyAgICAgICAgd2FybiAnSW52YWxpZE9wZXJhdGlvbjogJy5EdW1wZXIoJEApOwogICAgIH0KIAogICAgICR3b3JrLT5vcCh0dXRvcmlhbDo6T3BlcmF0aW9uOjpTVUJUUkFDVCk7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9wZXJsL1BlcmxTZXJ2ZXIucGwgYi90dXRvcmlhbC9wZXJsL1BlcmxTZXJ2ZXIucGwKaW5kZXggYWRlYzk3OC4uZGZlNmI4OSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvcGVybC9QZXJsU2VydmVyLnBsCisrKyBiL3R1dG9yaWFsL3BlcmwvUGVybFNlcnZlci5wbApAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vcGVybAorIyEvdXNyL2Jpbi9lbnYgcGVybAogCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTY3LDIwICs2NywyMCBAQAogICB9IGVsc2lmICgkb3AgPT0gdHV0b3JpYWw6Ok9wZXJhdGlvbjo6RElWSURFKSB7CiAgICAgaWYgKCRudW0yID09IDApCiAgICAgewotICAgICAgbXkgJHggPSBuZXcgdHV0b3JpYWw6OkludmFsaWRPcGVyYXRpb247CisgICAgICBteSAkeCA9IHR1dG9yaWFsOjpJbnZhbGlkT3BlcmF0aW9uLT5uZXcoKTsKICAgICAgICR4LT53aGF0T3AoJG9wKTsKICAgICAgICR4LT53aHkoJ0Nhbm5vdCBkaXZpZGUgYnkgMCcpOwogICAgICAgZGllICR4OwogICAgIH0KICAgICAkdmFsID0gJG51bTEgLyAkbnVtMjsKICAgfSBlbHNlIHsKLSAgICBteSAkeCA9IG5ldyB0dXRvcmlhbDo6SW52YWxpZE9wZXJhdGlvbjsKKyAgICBteSAkeCA9IHR1dG9yaWFsOjpJbnZhbGlkT3BlcmF0aW9uLT5uZXcoKTsKICAgICAkeC0+d2hhdE9wKCRvcCk7CiAgICAgJHgtPndoeSgnSW52YWxpZCBvcGVyYXRpb24nKTsKICAgICBkaWUgJHg7CiAgIH0KIAotICBteSAkbG9nID0gbmV3IHNoYXJlZDo6U2hhcmVkU3RydWN0OworICBteSAkbG9nID0gc2hhcmVkOjpTaGFyZWRTdHJ1Y3QtPm5ldygpOwogICAkbG9nLT5rZXkoJGxvZ2lkKTsKICAgJGxvZy0+dmFsdWUoaW50KCR2YWwpKTsKICAgJHNlbGYtPntsb2d9LT57JGxvZ2lkfSA9ICRsb2c7CkBAIC0xMDQsMTAgKzEwNCwxMCBAQAogCiAKIGV2YWwgewotICBteSAkaGFuZGxlciAgICAgICA9IG5ldyBDYWxjdWxhdG9ySGFuZGxlcjsKLSAgbXkgJHByb2Nlc3NvciAgICAgPSBuZXcgdHV0b3JpYWw6OkNhbGN1bGF0b3JQcm9jZXNzb3IoJGhhbmRsZXIpOwotICBteSAkc2VydmVyc29ja2V0ICA9IG5ldyBUaHJpZnQ6OlNlcnZlclNvY2tldCg5MDkwKTsKLSAgbXkgJGZvcmtpbmdzZXJ2ZXIgPSBuZXcgVGhyaWZ0OjpGb3JraW5nU2VydmVyKCRwcm9jZXNzb3IsICRzZXJ2ZXJzb2NrZXQpOworICBteSAkaGFuZGxlciAgICAgICA9IENhbGN1bGF0b3JIYW5kbGVyLT5uZXcoKTsKKyAgbXkgJHByb2Nlc3NvciAgICAgPSB0dXRvcmlhbDo6Q2FsY3VsYXRvclByb2Nlc3Nvci0+bmV3KCRoYW5kbGVyKTsKKyAgbXkgJHNlcnZlcnNvY2tldCAgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC0+bmV3KDkwOTApOworICBteSAkZm9ya2luZ3NlcnZlciA9IFRocmlmdDo6Rm9ya2luZ1NlcnZlci0+bmV3KCRwcm9jZXNzb3IsICRzZXJ2ZXJzb2NrZXQpOwogICBwcmludCAiU3RhcnRpbmcgdGhlIHNlcnZlci4uLlxuIjsKICAgJGZvcmtpbmdzZXJ2ZXItPnNlcnZlKCk7CiAgIHByaW50ICJkb25lLlxuIjsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BocC9QaHBDbGllbnQucGhwIGIvdHV0b3JpYWwvcGhwL1BocENsaWVudC5waHAKaW5kZXggZDI2MmI4Zi4uOTJkYzNjYiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcGhwL1BocENsaWVudC5waHAKKysrIGIvdHV0b3JpYWwvcGhwL1BocENsaWVudC5waHAKQEAgLTUsNyArNSw3IEBACiAKIGVycm9yX3JlcG9ydGluZyhFX0FMTCk7CiAKLXJlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vbGliL3BocC9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CityZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uL2xpYi9waHAvbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CiAKIHVzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7CiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BocC9QaHBTZXJ2ZXIucGhwIGIvdHV0b3JpYWwvcGhwL1BocFNlcnZlci5waHAKaW5kZXggMjJhZTQzZS4uNWE5YjQ5YiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcGhwL1BocFNlcnZlci5waHAKKysrIGIvdHV0b3JpYWwvcGhwL1BocFNlcnZlci5waHAKQEAgLTUsNyArNSw3IEBACiAKIGVycm9yX3JlcG9ydGluZyhFX0FMTCk7CiAKLXJlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vbGliL3BocC9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CityZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uL2xpYi9waHAvbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CiAKIHVzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7CiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BocC9ydW5zZXJ2ZXIucHkgYi90dXRvcmlhbC9waHAvcnVuc2VydmVyLnB5CmluZGV4IGFlMjlmZWQuLjhjYzMwZmIgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3BocC9ydW5zZXJ2ZXIucHkKKysrIGIvdHV0b3JpYWwvcGhwL3J1bnNlcnZlci5weQpAQCAtMjYsNyArMjYsOSBAQAogIyBjaGRpcigyKSBpbnRvIHRoZSB0dXRvcmlhbCBkaXJlY3RvcnkuCiBvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKSkpCiAKKwogY2xhc3MgSGFuZGxlcihDR0lIVFRQU2VydmVyLkNHSUhUVFBSZXF1ZXN0SGFuZGxlcik6Ci0gIGNnaV9kaXJlY3RvcmllcyAgPSBbJy9waHAnXQorICAgIGNnaV9kaXJlY3RvcmllcyA9IFsnL3BocCddCisKIAogQmFzZUhUVFBTZXJ2ZXIuSFRUUFNlcnZlcigoJycsIDgwODApLCBIYW5kbGVyKS5zZXJ2ZV9mb3JldmVyKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9weS50b3JuYWRvL01ha2VmaWxlLmFtCmluZGV4IDZhYzYwMjMuLjRiNzNjMWUgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KKysrIGIvdHV0b3JpYWwvcHkudG9ybmFkby9NYWtlZmlsZS5hbQpAQCAtMTcsOCArMTcsNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogZ2VuLXB5LnRvcm5hZG8vdHV0b3JpYWwvQ2FsY3VsYXRvci5weSBnZW4tcHkudG9ybmFkby9zaGFyZWQvU2hhcmVkU2VydmljZS5weTogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcHk6dG9ybmFkbyAtciAkPAogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvbkNsaWVudC5weSBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uQ2xpZW50LnB5CmluZGV4IDk1ZDc4YjguLjQyNjE0NmYgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uQ2xpZW50LnB5CisrKyBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uQ2xpZW50LnB5CkBAIC0xOSwxOCArMTksMTcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMKIGltcG9ydCBnbG9iCi1zeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50b3JuYWRvJykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCiBpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN5cworCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50b3JuYWRvJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKIGZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBPcGVyYXRpb24sIFdvcmssIEludmFsaWRPcGVyYXRpb24KIAogZnJvbSB0aHJpZnQgaW1wb3J0IFRUb3JuYWRvCi1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAogCkBAIC0zOCwzOSArMzcsMzggQEAKIGZyb20gdG9ybmFkbyBpbXBvcnQgaW9sb29wCiAKIAotQGdlbi5lbmdpbmUKLWRlZiBjb21tdW5pY2F0ZShjYWxsYmFjaz1Ob25lKToKK0BnZW4uY29yb3V0aW5lCitkZWYgY29tbXVuaWNhdGUoKToKICAgICAjIGNyZWF0ZSBjbGllbnQKICAgICB0cmFuc3BvcnQgPSBUVG9ybmFkby5UVG9ybmFkb1N0cmVhbVRyYW5zcG9ydCgnbG9jYWxob3N0JywgOTA5MCkKKyAgICAjIG9wZW4gdGhlIHRyYW5zcG9ydCwgYmFpbCBvbiBlcnJvcgorICAgIHRyeToKKyAgICAgICAgeWllbGQgdHJhbnNwb3J0Lm9wZW4oKQorICAgICAgICBwcmludCgnVHJhbnNwb3J0IGlzIG9wZW5lZCcpCisgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgICAgbG9nZ2luZy5lcnJvcihleCkKKyAgICAgICAgcmFpc2UgZ2VuLlJldHVybigpCisKICAgICBwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKICAgICBjbGllbnQgPSBDYWxjdWxhdG9yLkNsaWVudCh0cmFuc3BvcnQsIHBmYWN0b3J5KQogCi0gICAgIyBvcGVuIHRoZSB0cmFuc3BvcnQsIGJhaWwgb24gZXJyb3IKLSAgICB0cnk6Ci0gICAgICAgIHlpZWxkIGdlbi5UYXNrKHRyYW5zcG9ydC5vcGVuKQotICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24gYXMgZXg6Ci0gICAgICAgIGxvZ2dpbmcuZXJyb3IoZXgpCi0gICAgICAgIGlmIGNhbGxiYWNrOgotICAgICAgICAgICAgY2FsbGJhY2soKQotICAgICAgICByZXR1cm4KLQogICAgICMgcGluZwotICAgIHlpZWxkIGdlbi5UYXNrKGNsaWVudC5waW5nKQotICAgIHByaW50ICJwaW5nKCkiCisgICAgeWllbGQgY2xpZW50LnBpbmcoKQorICAgIHByaW50KCJwaW5nKCkiKQogCiAgICAgIyBhZGQKLSAgICBzdW1fID0geWllbGQgZ2VuLlRhc2soY2xpZW50LmFkZCwgMSwgMSkKLSAgICBwcmludCAiMSArIDEgPSB7fSIuZm9ybWF0KHN1bV8pCisgICAgc3VtXyA9IHlpZWxkIGNsaWVudC5hZGQoMSwgMSkKKyAgICBwcmludCgiMSArIDEgPSB7MH0iLmZvcm1hdChzdW1fKSkKIAogICAgICMgbWFrZSBhIG9uZXdheSBjYWxsIHdpdGhvdXQgYSBjYWxsYmFjayAoc2NoZWR1bGUgdGhlIHdyaXRlIGFuZCBjb250aW51ZQogICAgICMgd2l0aG91dCBibG9ja2luZykKICAgICBjbGllbnQuemlwKCkKLSAgICBwcmludCAiemlwKCkgd2l0aG91dCBjYWxsYmFjayIKKyAgICBwcmludCgiemlwKCkgd2l0aG91dCBjYWxsYmFjayIpCiAKICAgICAjIG1ha2UgYSBvbmV3YXkgY2FsbCB3aXRoIGEgY2FsbGJhY2sgKHdlJ2xsIHdhaXQgZm9yIHRoZSBzdHJlYW0gd3JpdGUgdG8KICAgICAjIGNvbXBsZXRlIGJlZm9yZSBjb250aW51aW5nKQotICAgIHlpZWxkIGdlbi5UYXNrKGNsaWVudC56aXApCi0gICAgcHJpbnQgInppcCgpIHdpdGggY2FsbGJhY2siCisgICAgY2xpZW50LnppcCgpCisgICAgcHJpbnQoInppcCgpIHdpdGggY2FsbGJhY2siKQogCiAgICAgIyBjYWxjdWxhdGUgMS8wCiAgICAgd29yayA9IFdvcmsoKQpAQCAtNzksMzcgKzc3LDMxIEBACiAgICAgd29yay5udW0yID0gMAogCiAgICAgdHJ5OgotICAgICAgICBxdW90aWVudCA9IHlpZWxkIGdlbi5UYXNrKGNsaWVudC5jYWxjdWxhdGUsIDEsIHdvcmspCi0gICAgICAgIHByaW50ICJXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/IgorICAgICAgICBxdW90aWVudCA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoIldob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybyA/IC0+IHswfSIuZm9ybWF0KHF1b3RpZW50KSkKICAgICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiBhcyBpbzoKLSAgICAgICAgcHJpbnQgIkludmFsaWRPcGVyYXRpb246IHt9Ii5mb3JtYXQoaW8pCisgICAgICAgIHByaW50KCJJbnZhbGlkT3BlcmF0aW9uOiB7MH0iLmZvcm1hdChpbykpCiAKICAgICAjIGNhbGN1bGF0ZSAxNS0xMAogICAgIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1QKICAgICB3b3JrLm51bTEgPSAxNQogICAgIHdvcmsubnVtMiA9IDEwCiAKLSAgICBkaWZmID0geWllbGQgZ2VuLlRhc2soY2xpZW50LmNhbGN1bGF0ZSwgMSwgd29yaykKLSAgICBwcmludCAiMTUgLSAxMCA9IHt9Ii5mb3JtYXQoZGlmZikKKyAgICBkaWZmID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgIHByaW50KCIxNSAtIDEwID0gezB9Ii5mb3JtYXQoZGlmZikpCiAKICAgICAjIGdldFN0cnVjdAotICAgIGxvZyA9IHlpZWxkIGdlbi5UYXNrKGNsaWVudC5nZXRTdHJ1Y3QsIDEpCi0gICAgcHJpbnQgIkNoZWNrIGxvZzoge30iLmZvcm1hdChsb2cudmFsdWUpCisgICAgbG9nID0geWllbGQgY2xpZW50LmdldFN0cnVjdCgxKQorICAgIHByaW50KCJDaGVjayBsb2c6IHswfSIuZm9ybWF0KGxvZy52YWx1ZSkpCiAKICAgICAjIGNsb3NlIHRoZSB0cmFuc3BvcnQKICAgICBjbGllbnQuX3RyYW5zcG9ydC5jbG9zZSgpCi0KLSAgICBpZiBjYWxsYmFjazoKLSAgICAgICAgY2FsbGJhY2soKQorICAgIHJhaXNlIGdlbi5SZXR1cm4oKQogCiAKIGRlZiBtYWluKCk6CiAgICAgIyBjcmVhdGUgYW4gaW9sb29wLCBkbyB0aGUgYWJvdmUsIHRoZW4gc3RvcAotICAgIGlvX2xvb3AgPSBpb2xvb3AuSU9Mb29wLmluc3RhbmNlKCkKLSAgICBkZWYgdGhpc19qb2ludCgpOgotICAgICAgICBjb21tdW5pY2F0ZShjYWxsYmFjaz1pb19sb29wLnN0b3ApCi0gICAgaW9fbG9vcC5hZGRfY2FsbGJhY2sodGhpc19qb2ludCkKLSAgICBpb19sb29wLnN0YXJ0KCkKKyAgICBpb2xvb3AuSU9Mb29wLmN1cnJlbnQoKS5ydW5fc3luYyhjb21tdW5pY2F0ZSkKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25TZXJ2ZXIucHkgYi90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvblNlcnZlci5weQppbmRleCA3YTM0MTA3Li5lMDIyOWEyIDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvblNlcnZlci5weQorKysgYi90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvblNlcnZlci5weQpAQCAtMTksMTAgKzE5LDExIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzCiBpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cworCiBzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50b3JuYWRvJykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIAogZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgogZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IE9wZXJhdGlvbiwgSW52YWxpZE9wZXJhdGlvbgpAQCAtMzAsMTAgKzMxLDcgQEAKIGZyb20gc2hhcmVkLnR0eXBlcyBpbXBvcnQgU2hhcmVkU3RydWN0CiAKIGZyb20gdGhyaWZ0IGltcG9ydCBUVG9ybmFkbwotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLWZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFNlcnZlcgogCiBmcm9tIHRvcm5hZG8gaW1wb3J0IGlvbG9vcAogCkBAIC00MiwxNiArNDAsMTUgQEAKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIHNlbGYubG9nID0ge30KIAotICAgIGRlZiBwaW5nKHNlbGYsIGNhbGxiYWNrKToKLSAgICAgICAgcHJpbnQgInBpbmcoKSIKLSAgICAgICAgY2FsbGJhY2soKQorICAgIGRlZiBwaW5nKHNlbGYpOgorICAgICAgICBwcmludCgicGluZygpIikKIAotICAgIGRlZiBhZGQoc2VsZiwgbjEsIG4yLCBjYWxsYmFjayk6Ci0gICAgICAgIHByaW50ICJhZGQoe30sIHt9KSIuZm9ybWF0KG4xLCBuMikKLSAgICAgICAgY2FsbGJhY2sobjEgKyBuMikKKyAgICBkZWYgYWRkKHNlbGYsIG4xLCBuMik6CisgICAgICAgIHByaW50KCJhZGQoe30sIHt9KSIuZm9ybWF0KG4xLCBuMikpCisgICAgICAgIHJldHVybiBuMSArIG4yCiAKLSAgICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrLCBjYWxsYmFjayk6Ci0gICAgICAgIHByaW50ICJjYWxjdWxhdGUoe30sIHt9KSIuZm9ybWF0KGxvZ2lkLCB3b3JrKQorICAgIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgorICAgICAgICBwcmludCgiY2FsY3VsYXRlKHt9LCB7fSkiLmZvcm1hdChsb2dpZCwgd29yaykpCiAKICAgICAgICAgaWYgd29yay5vcCA9PSBPcGVyYXRpb24uQUREOgogICAgICAgICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yCkBAIC03NiwxNSArNzMsMTQgQEAKICAgICAgICAgbG9nLmtleSA9IGxvZ2lkCiAgICAgICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQogICAgICAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKLSAgICAgICAgY2FsbGJhY2sodmFsKQorICAgICAgICByZXR1cm4gdmFsCiAKLSAgICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSwgY2FsbGJhY2spOgotICAgICAgICBwcmludCAiZ2V0U3RydWN0KHt9KSIuZm9ybWF0KGtleSkKLSAgICAgICAgY2FsbGJhY2soc2VsZi5sb2dba2V5XSkKKyAgICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6CisgICAgICAgIHByaW50KCJnZXRTdHJ1Y3Qoe30pIi5mb3JtYXQoa2V5KSkKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nW2tleV0KIAotICAgIGRlZiB6aXAoc2VsZiwgY2FsbGJhY2spOgotICAgICAgICBwcmludCAiemlwKCkiCi0gICAgICAgIGNhbGxiYWNrKCkKKyAgICBkZWYgemlwKHNlbGYpOgorICAgICAgICBwcmludCgiemlwKCkiKQogCiAKIGRlZiBtYWluKCk6CkBAIC05MywxMSArODksMTEgQEAKICAgICBwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKICAgICBzZXJ2ZXIgPSBUVG9ybmFkby5UVG9ybmFkb1NlcnZlcihwcm9jZXNzb3IsIHBmYWN0b3J5KQogCi0gICAgcHJpbnQgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iCisgICAgcHJpbnQoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iKQogICAgIHNlcnZlci5iaW5kKDkwOTApCiAgICAgc2VydmVyLnN0YXJ0KDEpCiAgICAgaW9sb29wLklPTG9vcC5pbnN0YW5jZSgpLnN0YXJ0KCkKLSAgICBwcmludCAiZG9uZS4iCisgICAgcHJpbnQoImRvbmUuIikKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KaW5kZXggYzZjYmQ0NS4uNTBjZDM0MiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlLmFtCkBAIC0xNyw4ICsxNyw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBnZW4tcHkvdHV0b3JpYWwvQ2FsY3VsYXRvci5weSBnZW4tcHkvc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHB5OnR3aXN0ZWQgLXIgJDwKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25DbGllbnQucHkgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weQppbmRleCA5ZTA4NmYwLi4yOTc2NDk1IDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weQorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weQpAQCAtMTksNTEgKzE5LDU0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCitpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cwogc3lzLnBhdGguYXBwZW5kKCdnZW4tcHkudHdpc3RlZCcpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uLCBXb3JrCiAKIGZyb20gdHdpc3RlZC5pbnRlcm5ldC5kZWZlciBpbXBvcnQgaW5saW5lQ2FsbGJhY2tzCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IHJlYWN0b3IKIGZyb20gdHdpc3RlZC5pbnRlcm5ldC5wcm90b2NvbCBpbXBvcnQgQ2xpZW50Q3JlYXRvcgogCi1mcm9tIHRocmlmdCBpbXBvcnQgVGhyaWZ0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkCiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiAKKwogQGlubGluZUNhbGxiYWNrcwogZGVmIG1haW4oY2xpZW50KToKLSAgeWllbGQgY2xpZW50LnBpbmcoKQotICBwcmludCAncGluZygpJworICAgIHlpZWxkIGNsaWVudC5waW5nKCkKKyAgICBwcmludCgncGluZygpJykKIAotICBzdW0gPSB5aWVsZCBjbGllbnQuYWRkKDEsMSkKLSAgcHJpbnQgJzErMT0lZCcgJSAoc3VtKQorICAgIHN1bSA9IHlpZWxkIGNsaWVudC5hZGQoMSwgMSkKKyAgICBwcmludCgoJzErMT0lZCcgJSAoc3VtKSkpCiAKLSAgd29yayA9IFdvcmsoKQorICAgIHdvcmsgPSBXb3JrKCkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQotICB3b3JrLm51bTEgPSAxCi0gIHdvcmsubnVtMiA9IDAKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQorICAgIHdvcmsubnVtMSA9IDEKKyAgICB3b3JrLm51bTIgPSAwCiAKLSAgdHJ5OgotICAgIHF1b3RpZW50ID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICAgIHByaW50ICdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/JwotICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiwgaW86Ci0gICAgcHJpbnQgJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGlvCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKQorICAgICAgICBwcmludCgnRllJIHRoZSBhbnN3ZXIgaXMgJWQnICUgcXVvdGllbnQpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoKCdJbnZhbGlkT3BlcmF0aW9uOiAlcicgJSBlKSkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUCi0gIHdvcmsubnVtMSA9IDE1Ci0gIHdvcmsubnVtMiA9IDEwCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAorICAgIHdvcmsubnVtMSA9IDE1CisgICAgd29yay5udW0yID0gMTAKIAotICBkaWZmID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICBwcmludCAnMTUtMTA9JWQnICUgKGRpZmYpCisgICAgZGlmZiA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICBwcmludCgoJzE1LTEwPSVkJyAlIChkaWZmKSkpCiAKLSAgbG9nID0geWllbGQgY2xpZW50LmdldFN0cnVjdCgxKQotICBwcmludCAnQ2hlY2sgbG9nOiAlcycgJSAobG9nLnZhbHVlKQotICByZWFjdG9yLnN0b3AoKQorICAgIGxvZyA9IHlpZWxkIGNsaWVudC5nZXRTdHJ1Y3QoMSkKKyAgICBwcmludCgoJ0NoZWNrIGxvZzogJXMnICUgKGxvZy52YWx1ZSkpKQorICAgIHJlYWN0b3Iuc3RvcCgpCisKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBkID0gQ2xpZW50Q3JlYXRvcihyZWFjdG9yLApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIucHkgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci5weQppbmRleCAyMjdmNmQ0Li4wMzRlNGEzIDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci5weQorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci5weQpAQCAtMTksMTIgKzE5LDEzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCitpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cwogc3lzLnBhdGguYXBwZW5kKCdnZW4tcHkudHdpc3RlZCcpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uCiAKIGZyb20gc2hhcmVkLnR0eXBlcyBpbXBvcnQgU2hhcmVkU3RydWN0CiAKQEAgLTMzLDYxICszNCw2NCBAQAogCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkCiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKKwogCiBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcjoKLSAgaW1wbGVtZW50cyhDYWxjdWxhdG9yLklmYWNlKSAgCi0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLmxvZyA9IHt9CisgICAgaW1wbGVtZW50cyhDYWxjdWxhdG9yLklmYWNlKQogCi0gIGRlZiBwaW5nKHNlbGYpOgotICAgIHByaW50ICdwaW5nKCknCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmxvZyA9IHt9CiAKLSAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgotICAgIHByaW50ICdhZGQoJWQsJWQpJyAlIChuMSwgbjIpCi0gICAgcmV0dXJuIG4xK24yCisgICAgZGVmIHBpbmcoc2VsZik6CisgICAgICAgIHByaW50KCdwaW5nKCknKQogCi0gIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgotICAgIHByaW50ICdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspCisgICAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgorICAgICAgICBwcmludCgnYWRkKCVkLCVkKScgJSAobjEsIG4yKSkKKyAgICAgICAgcmV0dXJuIG4xICsgbjIKIAotICAgIGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkFERDoKLSAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uU1VCVFJBQ1Q6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgotICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5ESVZJREU6Ci0gICAgICBpZiB3b3JrLm51bTIgPT0gMDoKLSAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQotICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKLSAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJwotICAgICAgICByYWlzZSB4Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKLSAgICBlbHNlOgotICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQotICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCi0gICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKLSAgICAgIHJhaXNlIHgKKyAgICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKKyAgICAgICAgcHJpbnQoJ2NhbGN1bGF0ZSglZCwgJXIpJyAlIChsb2dpZCwgd29yaykpCiAKLSAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQotICAgIGxvZy5rZXkgPSBsb2dpZAotICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQotICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZworICAgICAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgaWYgd29yay5udW0yID09IDA6CisgICAgICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKKyAgICAgICAgICAgICAgICByYWlzZSB4CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCisgICAgICAgICAgICByYWlzZSB4CiAKLSAgICByZXR1cm4gdmFsCisgICAgICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCisgICAgICAgIGxvZy5rZXkgPSBsb2dpZAorICAgICAgICBsb2cudmFsdWUgPSAnJWQnICUgKHZhbCkKKyAgICAgICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCiAKLSAgZGVmIGdldFN0cnVjdChzZWxmLCBrZXkpOgotICAgIHByaW50ICdnZXRTdHJ1Y3QoJWQpJyAlIChrZXkpCi0gICAgcmV0dXJuIHNlbGYubG9nW2tleV0KKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiB6aXAoc2VsZik6Ci0gICAgcHJpbnQgJ3ppcCgpJworICAgIGRlZiBnZXRTdHJ1Y3Qoc2VsZiwga2V5KToKKyAgICAgICAgcHJpbnQoJ2dldFN0cnVjdCglZCknICUgKGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCisKKyAgICBkZWYgemlwKHNlbGYpOgorICAgICAgICBwcmludCgnemlwKCknKQorCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKICAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQogICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQotICAgIHNlcnZlciA9IHJlYWN0b3IubGlzdGVuVENQKDkwOTAsCi0gICAgICAgICAgICAgICAgVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeShwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgcGZhY3RvcnkpLCBpbnRlcmZhY2U9IjEyNy4wLjAuMSIpCisgICAgc2VydmVyID0gcmVhY3Rvci5saXN0ZW5UQ1AoCisgICAgICAgIDkwOTAsCisgICAgICAgIFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3RvcnkocHJvY2Vzc29yLCBwZmFjdG9yeSksCisgICAgICAgIGludGVyZmFjZT0iMTI3LjAuMC4xIikKICAgICByZWFjdG9yLnJ1bigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci50YWMgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci50YWMKaW5kZXggMWQwYjZjNC4uMDQ3OTYzNiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIudGFjCisrKyBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnRhYwpAQCAtMjIsMTIgKzIyLDE0IEBACiBmcm9tIHR3aXN0ZWQuYXBwbGljYXRpb24gaW1wb3J0IGludGVybmV0LCBzZXJ2aWNlCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkCiAKLWltcG9ydCBzeXMsIGdsb2IKK2ltcG9ydCBnbG9iCitpbXBvcnQgc3lzCiBzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50d2lzdGVkJykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCiBmcm9tIFB5dGhvblNlcnZlciBpbXBvcnQgQ2FsY3VsYXRvckhhbmRsZXIKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKwogCiBkZWYgbWFrZV9hcHBsaWNhdGlvbigpOgogICAgIGFwcGxpY2F0aW9uID0gc2VydmljZS5BcHBsaWNhdGlvbignQ2FsY1NlcnZlcicpCkBAIC0zNSw4ICszNyw5IEBACiAgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKICAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQogCi0gICAgc2VydmVyRmFjdG9yeSA9IFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3RvcnkocHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKyAgICBzZXJ2ZXJGYWN0b3J5ID0gVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeSgKKyAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQogCiAgICAgY2FsY1NlcnZpY2UgPSBpbnRlcm5ldC5UQ1BTZXJ2ZXIoOTA5MCwgc2VydmVyRmFjdG9yeSkKIApAQCAtNDYsNCArNDksNSBAQAogCiAgICAgcmV0dXJuIGFwcGxpY2F0aW9uCiAKLWFwcGxpY2F0aW9uID0gbWFrZV9hcHBsaWNhdGlvbigpCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGFwcGxpY2F0aW9uID0gbWFrZV9hcHBsaWNhdGlvbigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3B5L01ha2VmaWxlLmFtCmluZGV4IDIzOTdhMTIuLjdkYjgxNmQgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5L01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL3B5L01ha2VmaWxlLmFtCkBAIC0xNyw4ICsxNyw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBnZW4tcHkvdHV0b3JpYWwvQ2FsY3VsYXRvci5weSBnZW4tcHkvc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHB5IC1yICQ8CiAKQEAgLTM0LDUgKzMyLDYgQEAKIAkkKFJNKSAtciBnZW4tKgogCiBFWFRSQV9ESVNUID0gXAorCXNldHVwLmNmZyBcCiAJUHl0aG9uU2VydmVyLnB5IFwKIAlQeXRob25DbGllbnQucHkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5L1B5dGhvbkNsaWVudC5weSBiL3R1dG9yaWFsL3B5L1B5dGhvbkNsaWVudC5weQppbmRleCAwNTU0ZWUxLi5hNmMxOTY2IDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS9QeXRob25DbGllbnQucHkKKysrIGIvdHV0b3JpYWwvcHkvUHl0aG9uQ2xpZW50LnB5CkBAIC0xOSw2NSArMTksNzEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IKK2ltcG9ydCBzeXMKK2ltcG9ydCBnbG9iCiBzeXMucGF0aC5hcHBlbmQoJ2dlbi1weScpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uLCBXb3JrCiAKIGZyb20gdGhyaWZ0IGltcG9ydCBUaHJpZnQKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiAKLXRyeToKIAotICAjIE1ha2Ugc29ja2V0Ci0gIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNvY2tldCgnbG9jYWxob3N0JywgOTA5MCkKK2RlZiBtYWluKCk6CisgICAgIyBNYWtlIHNvY2tldAorICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNvY2tldCgnbG9jYWxob3N0JywgOTA5MCkKIAotICAjIEJ1ZmZlcmluZyBpcyBjcml0aWNhbC4gUmF3IHNvY2tldHMgYXJlIHZlcnkgc2xvdwotICB0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQpCisgICAgIyBCdWZmZXJpbmcgaXMgY3JpdGljYWwuIFJhdyBzb2NrZXRzIGFyZSB2ZXJ5IHNsb3cKKyAgICB0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQpCiAKLSAgIyBXcmFwIGluIGEgcHJvdG9jb2wKLSAgcHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAjIFdyYXAgaW4gYSBwcm90b2NvbAorICAgIHByb3RvY29sID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpCiAKLSAgIyBDcmVhdGUgYSBjbGllbnQgdG8gdXNlIHRoZSBwcm90b2NvbCBlbmNvZGVyCi0gIGNsaWVudCA9IENhbGN1bGF0b3IuQ2xpZW50KHByb3RvY29sKQorICAgICMgQ3JlYXRlIGEgY2xpZW50IHRvIHVzZSB0aGUgcHJvdG9jb2wgZW5jb2RlcgorICAgIGNsaWVudCA9IENhbGN1bGF0b3IuQ2xpZW50KHByb3RvY29sKQogCi0gICMgQ29ubmVjdCEKLSAgdHJhbnNwb3J0Lm9wZW4oKQorICAgICMgQ29ubmVjdCEKKyAgICB0cmFuc3BvcnQub3BlbigpCiAKLSAgY2xpZW50LnBpbmcoKQotICBwcmludCAncGluZygpJworICAgIGNsaWVudC5waW5nKCkKKyAgICBwcmludCgncGluZygpJykKIAotICBzdW0gPSBjbGllbnQuYWRkKDEsMSkKLSAgcHJpbnQgJzErMT0lZCcgJSAoc3VtKQorICAgIHN1bV8gPSBjbGllbnQuYWRkKDEsIDEpCisgICAgcHJpbnQoJzErMT0lZCcgJSBzdW1fKQogCi0gIHdvcmsgPSBXb3JrKCkKKyAgICB3b3JrID0gV29yaygpCiAKLSAgd29yay5vcCA9IE9wZXJhdGlvbi5ESVZJREUKLSAgd29yay5udW0xID0gMQotICB3b3JrLm51bTIgPSAwCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5ESVZJREUKKyAgICB3b3JrLm51bTEgPSAxCisgICAgd29yay5udW0yID0gMAogCi0gIHRyeToKLSAgICBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKLSAgICBwcmludCAnV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvPycKLSAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24sIGlvOgotICAgIHByaW50ICdJbnZhbGlkT3BlcmF0aW9uOiAlcicgJSBpbworICAgIHRyeToKKyAgICAgICAgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgICAgICAgIHByaW50KCdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/JykKKyAgICAgICAgcHJpbnQoJ0ZZSSB0aGUgYW5zd2VyIGlzICVkJyAlIHF1b3RpZW50KQorICAgIGV4Y2VwdCBJbnZhbGlkT3BlcmF0aW9uIGFzIGU6CisgICAgICAgIHByaW50KCdJbnZhbGlkT3BlcmF0aW9uOiAlcicgJSBlKQogCi0gIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1QKLSAgd29yay5udW0xID0gMTUKLSAgd29yay5udW0yID0gMTAKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUCisgICAgd29yay5udW0xID0gMTUKKyAgICB3b3JrLm51bTIgPSAxMAogCi0gIGRpZmYgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCi0gIHByaW50ICcxNS0xMD0lZCcgJSAoZGlmZikKKyAgICBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgIHByaW50KCcxNS0xMD0lZCcgJSBkaWZmKQogCi0gIGxvZyA9IGNsaWVudC5nZXRTdHJ1Y3QoMSkKLSAgcHJpbnQgJ0NoZWNrIGxvZzogJXMnICUgKGxvZy52YWx1ZSkKKyAgICBsb2cgPSBjbGllbnQuZ2V0U3RydWN0KDEpCisgICAgcHJpbnQoJ0NoZWNrIGxvZzogJXMnICUgbG9nLnZhbHVlKQogCi0gICMgQ2xvc2UhCi0gIHRyYW5zcG9ydC5jbG9zZSgpCisgICAgIyBDbG9zZSEKKyAgICB0cmFuc3BvcnQuY2xvc2UoKQogCi1leGNlcHQgVGhyaWZ0LlRFeGNlcHRpb24sIHR4OgotICBwcmludCAnJXMnICUgKHR4Lm1lc3NhZ2UpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdHJ5OgorICAgICAgICBtYWluKCkKKyAgICBleGNlcHQgVGhyaWZ0LlRFeGNlcHRpb24gYXMgdHg6CisgICAgICAgIHByaW50KCclcycgJSB0eC5tZXNzYWdlKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkvUHl0aG9uU2VydmVyLnB5IGIvdHV0b3JpYWwvcHkvUHl0aG9uU2VydmVyLnB5CmluZGV4IDUzM2IwZWEuLmU2NDIxZWYgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5L1B5dGhvblNlcnZlci5weQorKysgYi90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkKQEAgLTE5LDEyICsxOSwxMyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgoraW1wb3J0IGdsb2IKK2ltcG9ydCBzeXMKIHN5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5JykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIAogZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgotZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24KIAogZnJvbSBzaGFyZWQudHR5cGVzIGltcG9ydCBTaGFyZWRTdHJ1Y3QKIApAQCAtMzMsNjUgKzM0LDcwIEBACiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKIAorCiBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcjoKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYubG9nID0ge30KKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubG9nID0ge30KIAotICBkZWYgcGluZyhzZWxmKToKLSAgICBwcmludCAncGluZygpJworICAgIGRlZiBwaW5nKHNlbGYpOgorICAgICAgICBwcmludCgncGluZygpJykKIAotICBkZWYgYWRkKHNlbGYsIG4xLCBuMik6Ci0gICAgcHJpbnQgJ2FkZCglZCwlZCknICUgKG4xLCBuMikKLSAgICByZXR1cm4gbjErbjIKKyAgICBkZWYgYWRkKHNlbGYsIG4xLCBuMik6CisgICAgICAgIHByaW50KCdhZGQoJWQsJWQpJyAlIChuMSwgbjIpKQorICAgICAgICByZXR1cm4gbjEgKyBuMgogCi0gIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgotICAgIHByaW50ICdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspCisgICAgZGVmIGNhbGN1bGF0ZShzZWxmLCBsb2dpZCwgd29yayk6CisgICAgICAgIHByaW50KCdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspKQogCi0gICAgaWYgd29yay5vcCA9PSBPcGVyYXRpb24uQUREOgotICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKLSAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uTVVMVElQTFk6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkRJVklERToKLSAgICAgIGlmIHdvcmsubnVtMiA9PSAwOgotICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCi0gICAgICAgIHgud2hhdE9wID0gd29yay5vcAotICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnCi0gICAgICAgIHJhaXNlIHgKLSAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgotICAgIGVsc2U6Ci0gICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCi0gICAgICB4LndoYXRPcCA9IHdvcmsub3AKLSAgICAgIHgud2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJwotICAgICAgcmFpc2UgeAorICAgICAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgaWYgd29yay5udW0yID09IDA6CisgICAgICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKKyAgICAgICAgICAgICAgICByYWlzZSB4CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCisgICAgICAgICAgICByYWlzZSB4CiAKLSAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQotICAgIGxvZy5rZXkgPSBsb2dpZAotICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQotICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZworICAgICAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQorICAgICAgICBsb2cua2V5ID0gbG9naWQKKyAgICAgICAgbG9nLnZhbHVlID0gJyVkJyAlICh2YWwpCisgICAgICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZwogCi0gICAgcmV0dXJuIHZhbAorICAgICAgICByZXR1cm4gdmFsCiAKLSAgZGVmIGdldFN0cnVjdChzZWxmLCBrZXkpOgotICAgIHByaW50ICdnZXRTdHJ1Y3QoJWQpJyAlIChrZXkpCi0gICAgcmV0dXJuIHNlbGYubG9nW2tleV0KKyAgICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6CisgICAgICAgIHByaW50KCdnZXRTdHJ1Y3QoJWQpJyAlIChrZXkpKQorICAgICAgICByZXR1cm4gc2VsZi5sb2dba2V5XQogCi0gIGRlZiB6aXAoc2VsZik6Ci0gICAgcHJpbnQgJ3ppcCgpJworICAgIGRlZiB6aXAoc2VsZik6CisgICAgICAgIHByaW50KCd6aXAoKScpCiAKLWhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCi1wcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQotdHJhbnNwb3J0ID0gVFNvY2tldC5UU2VydmVyU29ja2V0KHBvcnQ9OTA5MCkKLXRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKLXBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogCi1zZXJ2ZXIgPSBUU2VydmVyLlRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQorICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldChob3N0PScxMjcuMC4wLjEnLCBwb3J0PTkwOTApCisgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogCi0jIFlvdSBjb3VsZCBkbyBvbmUgb2YgdGhlc2UgZm9yIGEgbXVsdGl0aHJlYWRlZCBzZXJ2ZXIKLSNzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQotI3NlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICBzZXJ2ZXIgPSBUU2VydmVyLlRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKIAotcHJpbnQgJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nCi1zZXJ2ZXIuc2VydmUoKQotcHJpbnQgJ2RvbmUuJworICAgICMgWW91IGNvdWxkIGRvIG9uZSBvZiB0aGVzZSBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcgorICAgICMgc2VydmVyID0gVFNlcnZlci5UVGhyZWFkZWRTZXJ2ZXIoCisgICAgIyAgICAgcHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAjIHNlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXIoCisgICAgIyAgICAgcHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKworICAgIHByaW50KCdTdGFydGluZyB0aGUgc2VydmVyLi4uJykKKyAgICBzZXJ2ZXIuc2VydmUoKQorICAgIHByaW50KCdkb25lLicpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9zZXR1cC5jZmcgYi90dXRvcmlhbC9weS9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3MTIwYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5L3NldHVwLmNmZwpAQCAtMCwwICsxLDIgQEAKK1tmbGFrZThdCitpZ25vcmUgPSBFNDAyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9yYi9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtCmluZGV4IDM2OWU5MDMuLjkzNzI0MTMgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtCkBAIC0xNyw4ICsxNyw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBnZW4tcHkvY2FsY3VsYXRvci5yYiBnZW4tcHkvc2hhcmVkX3NlcnZpY2UucmI6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHJiIC1yICQ8CiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JzL0NhcmdvLnRvbWwgYi90dXRvcmlhbC9ycy9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMGEwZGEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ycy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTYgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJ0aHJpZnQtdHV0b3JpYWwiCit2ZXJzaW9uID0gIjAuMS4wIgorbGljZW5zZSA9ICJBcGFjaGUtMi4wIgorYXV0aG9ycyA9IFsiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Il0KK2V4Y2x1ZGUgPSBbIk1ha2VmaWxlKiIsICJzaGFyZWQucnMiLCAidHV0b3JpYWwucnMiXQorcHVibGlzaCA9IGZhbHNlCisKK1tkZXBlbmRlbmNpZXNdCitjbGFwID0gIjwyLjI4LjAiCitvcmRlcmVkLWZsb2F0ID0gIjAuMy4wIgordHJ5X2Zyb20gPSAiMC4yLjAiCisKK1tkZXBlbmRlbmNpZXMudGhyaWZ0XQorcGF0aCA9ICIuLi8uLi9saWIvcnMiCisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JzL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvcnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2MzMxZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCitnZW4tcnMvdHV0b3JpYWwucnMgZ2VuLXJzL3NoYXJlZC5yczogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLW91dCBzcmMgLS1nZW4gcnMgLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tcnMvdHV0b3JpYWwucnMKKwkkKENBUkdPKSBidWlsZAorCVsgLWQgYmluIF0gfHwgbWtkaXIgYmluCisJY3AgdGFyZ2V0L2RlYnVnL3R1dG9yaWFsX3NlcnZlciBiaW4vdHV0b3JpYWxfc2VydmVyCisJY3AgdGFyZ2V0L2RlYnVnL3R1dG9yaWFsX2NsaWVudCBiaW4vdHV0b3JpYWxfY2xpZW50CisKK2NoZWNrOiBhbGwKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCWJpbi90dXRvcmlhbF9zZXJ2ZXIJCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwliaW4vdHV0b3JpYWxfY2xpZW50CisKK2NsZWFuLWxvY2FsOgorCSQoQ0FSR08pIGNsZWFuCisJLSQoUk0pIENhcmdvLmxvY2sKKwktJChSTSkgc3JjL3NoYXJlZC5ycworCS0kKFJNKSBzcmMvdHV0b3JpYWwucnMKKwktJChSTSkgLXIgYmluCisKK0VYVFJBX0RJU1QgPSBcCisJQ2FyZ28udG9tbCBcCisJc3JjL2xpYi5ycyBcCisJc3JjL2Jpbi90dXRvcmlhbF9zZXJ2ZXIucnMgXAorCXNyYy9iaW4vdHV0b3JpYWxfY2xpZW50LnJzIFwKKwlSRUFETUUubWQKKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvUkVBRE1FLm1kIGIvdHV0b3JpYWwvcnMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NGU5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ycy9SRUFETUUubWQKQEAgLTAsMCArMSwzMTcgQEAKKyMgUnVzdCBMYW5ndWFnZSBCaW5kaW5ncyBmb3IgVGhyaWZ0CisKKyMjIEdldHRpbmcgU3RhcnRlZAorCisxLiBHZXQgdGhlIFtUaHJpZnQgY29tcGlsZXJdKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcpLgorCisyLiBBZGQgdGhlIGZvbGxvd2luZyBjcmF0ZXMgdG8geW91ciBgQ2FyZ28udG9tbGAuCisKK2BgYHRvbWwKK3RocmlmdCA9ICJ4LnkueiIgIyB4LnkueiBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgdGhyaWZ0IGNvbXBpbGVyCitvcmRlcmVkX2Zsb2F0ID0gIjAuMy4wIgordHJ5X2Zyb20gPSAiMC4yLjAiCitgYGAKKworMy4gQWRkIHRoZSBzYW1lIGNyYXRlcyB0byB5b3VyIGBsaWIucnNgIG9yIGBtYWluLnJzYC4KKworYGBgcnVzdAorZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworYGBgCisKKzQuIEdlbmVyYXRlIFJ1c3Qgc291cmNlcyBmb3IgeW91ciBJREwgKGZvciBleGFtcGxlLCBgVHV0b3JpYWwudGhyaWZ0YCkuCisKK2BgYHNoZWxsCit0aHJpZnQgLW91dCBteV9ydXN0X3Byb2dyYW0vc3JjIC0tZ2VuIHJzIC1yIFR1dG9yaWFsLnRocmlmdAorYGBgCisKKzUuIFVzZSB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBpbiB5b3VyIGNvZGUuCisKK2BgYHJ1c3QKKy8vIGFkZCBleHRlcm4gY3JhdGVzIGhlcmUsIG9yIGluIHlvdXIgbGliLnJzCitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKKy8vIGdlbmVyYXRlZCBSdXN0IG1vZHVsZQordXNlIHR1dG9yaWFsOworCit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RDb21wYWN0SW5wdXRQcm90b2NvbCwgVENvbXBhY3RPdXRwdXRQcm90b2NvbH07Cit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2x9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEZyYW1lZFJlYWRUcmFuc3BvcnQsIFRGcmFtZWRXcml0ZVRyYW5zcG9ydH07Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUSW9DaGFubmVsLCBUVGNwQ2hhbm5lbH07Cit1c2UgdHV0b3JpYWw6OntDYWxjdWxhdG9yU3luY0NsaWVudCwgVENhbGN1bGF0b3JTeW5jQ2xpZW50fTsKK3VzZSB0dXRvcmlhbDo6e09wZXJhdGlvbiwgV29ya307CisKK2ZuIG1haW4oKSB7CisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gcHJpbnRsbiEoImNsaWVudCByYW4gc3VjY2Vzc2Z1bGx5IiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBwcmludGxuISgiY2xpZW50IGZhaWxlZCB3aXRoIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAvLworICAgIC8vIGJ1aWxkIGNsaWVudAorICAgIC8vCisKKyAgICBwcmludGxuISgiY29ubmVjdCB0byBzZXJ2ZXIgb24gMTI3LjAuMC4xOjkwOTAiKTsKKyAgICBsZXQgbXV0IGMgPSBUVGNwVHJhbnNwb3J0OjpuZXcoKTsKKyAgICBjLm9wZW4oIjEyNy4wLjAuMTo5MDkwIik/OworCisgICAgbGV0IChpX2NoYW4sIG9fY2hhbikgPSBjLnNwbGl0KCk/OworICAgIAorICAgIGxldCBpX3Byb3QgPSBUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldygKKyAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhpX2NoYW4pCisgICAgKTsKKyAgICBsZXQgb19wcm90ID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KAorICAgICAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhvX2NoYW4pCisgICAgKTsKKworICAgIGxldCBjbGllbnQgPSBDYWxjdWxhdG9yU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KTsKKworICAgIC8vCisgICAgLy8gYWxyaWdodCEgLSBsZXQncyBtYWtlIHNvbWUgY2FsbHMKKyAgICAvLworCisgICAgLy8gdHdvLXdheSwgdm9pZCByZXR1cm4KKyAgICBjbGllbnQucGluZygpPzsKKworICAgIC8vIHR3by13YXkgd2l0aCBzb21lIHJldHVybgorICAgIGxldCByZXMgPSBjbGllbnQuY2FsY3VsYXRlKAorICAgICAgICA3MiwKKyAgICAgICAgV29yazo6bmV3KDcsIDgsIE9wZXJhdGlvbjo6TVVMVElQTFksIE5vbmUpCisgICAgKT87CisgICAgcHJpbnRsbiEoIm11bHRpcGxpZWQgNyBhbmQgOCwgZ290IHt9IiwgcmVzKTsKKworICAgIC8vIHR3by13YXkgYW5kIHJldHVybnMgYSBUaHJpZnQtZGVmaW5lZCBleGNlcHRpb24KKyAgICBsZXQgcmVzID0gY2xpZW50LmNhbGN1bGF0ZSgKKyAgICAgICAgNzcsCisgICAgICAgIFdvcms6Om5ldygyLCAwLCBPcGVyYXRpb246OkRJVklERSwgTm9uZSkKKyAgICApOworICAgIG1hdGNoIHJlcyB7CisgICAgICAgIE9rKHYpID0+IHBhbmljISgic2hvdWxkbid0IGhhdmUgc3VjY2VlZGVkIHdpdGggcmVzdWx0IHt9IiwgdiksCisgICAgICAgIEVycihlKSA9PiBwcmludGxuISgiZGl2aWRlIGJ5IHplcm8gZmFpbGVkIHdpdGggezo/fSIsIGUpLAorICAgIH0KKworICAgIC8vIG9uZS13YXkKKyAgICBjbGllbnQuemlwKCk/OworCisgICAgLy8gZG9uZSEKKyAgICBPaygoKSkKK30KK2BgYAorCisjIyBDb2RlIEdlbmVyYXRpb24KKworIyMjIFRocmlmdCBGaWxlcyBhbmQgR2VuZXJhdGVkIE1vZHVsZXMKKworVGhlIFRocmlmdCBjb2RlIGdlbmVyYXRvciB0YWtlcyBlYWNoIFRocmlmdCBmaWxlIGFuZCBnZW5lcmF0ZXMgYSBSdXN0IG1vZHVsZQord2l0aCB0aGUgc2FtZSBuYW1lIHNuYWtlLWNhc2VkLiBGb3IgZXhhbXBsZSwgcnVubmluZyB0aGUgY29tcGlsZXIgb24KK2BUaHJpZnRUZXN0LnRocmlmdGAgY3JlYXRlcyBgdGhyaWZ0X3Rlc3QucnNgLiBUbyB1c2UgdGhlc2UgZ2VuZXJhdGVkIGZpbGVzIGFkZAorYG1vZCAuLi5gIGFuZCBgdXNlIC4uLmAgZGVjbGFyYXRpb25zIHRvIHlvdXIgYGxpYi5yc2Agb3IgYG1haW4ucnNgIC0gb25lIGZvcgorZWFjaCBnZW5lcmF0ZWQgZmlsZS4KKworIyMjIFJlc3VsdHMgYW5kIEVycm9ycworCitUaGUgVGhyaWZ0IHJ1bnRpbWUgbGlicmFyeSBkZWZpbmVzIGEgYHRocmlmdDo6UmVzdWx0YCBhbmQgYSBgdGhyaWZ0OjpFcnJvcmAgdHlwZSwKK2JvdGggb2Ygd2hpY2ggYXJlIHVzZWQgdGhyb3VnaHQgdGhlIHJ1bnRpbWUgbGlicmFyeSBhbmQgaW4gYWxsIGdlbmVyYXRlZCBjb2RlLgorQ29udmVyc2lvbnMgYXJlIGRlZmluZWQgZnJvbSBgc3RkOjppbzo6RXJyb3JgLCBgc3RyYCBhbmQgYFN0cmluZ2AgaW50bworYHRocmlmdDo6RXJyb3JgLgorCisjIyMgVGhyaWZ0IFR5cGUgYW5kIHRoZWlyIFJ1c3QgRXF1aXZhbGVudHMKKworVGhyaWZ0IGRlZmluZXMgYSBudW1iZXIgb2YgdHlwZXMsIGVhY2ggb2Ygd2hpY2ggaXMgdHJhbnNsYXRlZCBpbnRvIGl0cyBSdXN0CitlcXVpdmFsZW50IGJ5IHRoZSBjb2RlIGdlbmVyYXRvci4KKworKiBQcmltaXRpdmVzIChib29sLCBpOCwgaTE2LCBpMzIsIGk2NCwgZG91YmxlLCBzdHJpbmcsIGJpbmFyeSkKKyogVHlwZWRlZnMKKyogRW51bXMKKyogQ29udGFpbmVycworKiBTdHJ1Y3RzCisqIFVuaW9ucworKiBFeGNlcHRpb25zCisqIFNlcnZpY2VzCisqIENvbnN0YW50cyAocHJpbWl0aXZlcywgY29udGFpbmVycywgc3RydWN0cykKKworSW4gYWRkaXRpb24sIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQsIHRocmlmdCBpbmNsdWRlcyBhcmUgdHJhbnNsYXRlZCBpbnRvCitgdXNlIC4uLmAgc3RhdGVtZW50cyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsIGFuZCBhbGwgZGVjbGFyYXRpb25zLCBwYXJhbWV0ZXJzLAordHJhaXRzIGFuZCB0eXBlcyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgYXJlIG5hbWVzcGFjZWQgYXBwcm9wcmlhdGVseS4KKworVGhlIGZvbGxvd2luZyBzdWJzZWN0aW9ucyBjb3ZlciBlYWNoIHR5cGUgYW5kIHRoZWlyIGdlbmVyYXRlZCBSdXN0IGVxdWl2YWxlbnQuCisKKyMjIyBQcmltaXRpdmVzCisKK1RocmlmdCBwcmltaXRpdmVzIGhhdmUgc3RyYWlnaHRmb3J3YXJkIFJ1c3QgZXF1aXZhbGVudHMuCisKKyogYm9vbDogYGJvb2xgCisqIGk4OiBgaThgCisqIGkxNjogYGkxNmAKKyogaTMyOiBgaTMyYAorKiBpNjQ6IGBpNjRgCisqIGRvdWJsZTogYE9yZGVyZWRGbG9hdDxmNjQ+YAorKiBzdHJpbmc6IGBTdHJpbmdgCisqIGJpbmFyeTogYFZlYzx1OD5gCisKKyMjIyBUeXBlZGVmcworCitBIHR5cGVkZWYgaXMgdHJhbnNsYXRlZCB0byBhIGBwdWIgdHlwZWAgZGVjbGFyYXRpb24uCisKK2BgYHRocmlmdAordHlwZWRlZiBpNjQgVXNlcklkCisKK3R5cGVkZWYgbWFwPHN0cmluZywgVXNlcklkPiBNYXBUeXBlCitgYGAKK2BgYHJ1c3QKK3B1YiB0eXBlIFVzZXJJZCA9IGk2NDsKKworcHViIHR5cGUgTWFwVHlwZSA9IEJUcmVlTWFwPFN0cmluZywgQm9uaz47CitgYGAKKworIyMjIEVudW1zCisKK0EgVGhyaWZ0IGVudW0gaXMgcmVwcmVzZW50ZWQgYXMgYSBSdXN0IGVudW0sIGFuZCBlYWNoIHZhcmlhbnQgaXMgdHJhbnNjcmliZWQgMToxLgorCitgYGB0aHJpZnQKK2VudW0gTnVtYmVyegoreworICAgIE9ORSA9IDEsCisgICAgVFdPLAorICAgIFRIUkVFLAorICAgIEZJVkUgPSA1LAorICAgIFNJWCwKKyAgICBFSUdIVCA9IDgKK30KK2BgYAorCitgYGBydXN0CisjW2Rlcml2ZShDb3B5LCBDbG9uZSwgRGVidWcsIEVxLCBPcmQsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCitwdWIgZW51bSBOdW1iZXJ6IHsKKyAgICBPTkUgPSAxLAorICAgIFRXTyA9IDIsCisgICAgVEhSRUUgPSAzLAorICAgIEZJVkUgPSA1LAorICAgIFNJWCA9IDYsCisgICAgRUlHSFQgPSA4LAorfQorCitpbXBsIFRyeUZyb208aTMyPiBmb3IgTnVtYmVyeiB7CisgICAgLy8gLi4uCit9CisKK2BgYAorCisjIyMgQ29udGFpbmVycworCitUaHJpZnQgaGFzIHRocmVlIGNvbnRhaW5lciB0eXBlczogbGlzdCwgc2V0IGFuZCBtYXAuIFRoZXkgYXJlIHRyYW5zbGF0ZWQgaW50bworUnVzdCBgVmVjYCwgYEJUcmVlU2V0YCBhbmQgYEJUcmVlTWFwYCByZXNwZWN0aXZlbHkuIEFueSBUaHJpZnQgdHlwZSAodGhpcworaW5jbHVkZXMgc3RydWN0cywgZW51bXMgYW5kIHR5cGVkZWZzKSBjYW4gYmUgYSBsaXN0L3NldCBlbGVtZW50IG9yIGEgbWFwCitrZXkvdmFsdWUuCisKKyMjIyMgTGlzdAorCitgYGB0aHJpZnQKK2xpc3QgPGkzMj4gbnVtYmVycworYGBgCisKK2BgYHJ1c3QKK251bWJlcnM6IFZlYzxpMzI+CitgYGAKKworIyMjIyBTZXQKKworYGBgdGhyaWZ0CitzZXQgPGkzMj4gbnVtYmVycworYGBgCisKK2BgYHJ1c3QKK251bWJlcnM6IEJUcmVlU2V0PGkzMj4KK2BgYAorCisjIyMjIE1hcAorCitgYGB0aHJpZnQKK21hcCA8c3RyaW5nLCBpMzI+IG51bWJlcnMKK2BgYAorCitgYGBydXN0CitudW1iZXJzOiBCVHJlZU1hcDxTdHJpbmcsIGkzMj4KK2BgYAorCisjIyMgU3RydWN0cworCitBIFRocmlmdCBzdHJ1Y3QgaXMgcmVwcmVzZW50ZWQgYXMgYSBSdXN0IHN0cnVjdCwgYW5kIGVhY2ggZmllbGQgdHJhbnNjcmliZWQgMToxLgorCitgYGB0aHJpZnQKK3N0cnVjdCBDcmF6eU5lc3RpbmcgeworICAgIDE6IHN0cmluZyBzdHJpbmdfZmllbGQsCisgICAgMjogb3B0aW9uYWwgc2V0PEluc2FuaXR5PiBzZXRfZmllbGQsCisgICAgMzogcmVxdWlyZWQgbGlzdDwKKyAgICAgICAgIG1hcDxzZXQ8aTMyPiwgbWFwPGkzMixzZXQ8bGlzdDxtYXA8SW5zYW5pdHksc3RyaW5nPj4+Pj4KKyAgICAgICA+CisgICAgNDogYmluYXJ5IGJpbmFyeV9maWVsZAorfQorYGBgCitgYGBydXN0CisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBPcmQsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCitwdWIgc3RydWN0IENyYXp5TmVzdGluZyB7CisgICAgcHViIHN0cmluZ19maWVsZDogT3B0aW9uPFN0cmluZz4sCisgICAgcHViIHNldF9maWVsZDogT3B0aW9uPEJUcmVlU2V0PEluc2FuaXR5Pj4sCisgICAgcHViIGxpc3RfZmllbGQ6IFZlYzwKKyAgICAgICAgQlRyZWVNYXA8CisgICAgICAgICAgICBCVHJlZVNldDxpMzI+LAorICAgICAgICAgICAgQlRyZWVNYXA8aTMyLCBCVHJlZVNldDxWZWM8QlRyZWVNYXA8SW5zYW5pdHksIFN0cmluZz4+Pj4KKyAgICAgICAgPgorICAgID4sCisgICAgcHViIGJpbmFyeV9maWVsZDogT3B0aW9uPFZlYzx1OD4+LAorfQorCitpbXBsIENyYXp5TmVzdGluZyB7CisgICAgcHViIGZuIHJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wpCisgICAgLT4KKyAgICB0aHJpZnQ6OlJlc3VsdDxDcmF6eU5lc3Rpbmc+IHsKKyAgICAgICAgLy8gLi4uCisgICAgfQorICAgIHB1YiBmbiB3cml0ZV90b19vdXRfcHJvdG9jb2woJnNlbGYsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpCisgICAgLT4KKyAgICB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgICAgICAvLyAuLi4KKyAgICB9Cit9CisKK2BgYAorIyMjIyMgT3B0aW9uYWxpdHkKKworVGhyaWZ0IGhhcyAzICJvcHRpb25hbGl0eSIgdHlwZXM6CisKKzEuIFJlcXVpcmVkCisyLiBPcHRpb25hbAorMy4gRGVmYXVsdAorCitUaGUgUnVzdCBjb2RlIGdlbmVyYXRvciBlbmNvZGVzICpSZXF1aXJlZCogZmllbGRzIGFzIHRoZSBiYXJlIHR5cGUgaXRzZWxmLCB3aGlsZQorKk9wdGlvbmFsKiBhbmQgKkRlZmF1bHQqIGZpZWxkcyBhcmUgZW5jb2RlZCBhcyBgT3B0aW9uPFR5cGVOYW1lPmAuCisKK2BgYHRocmlmdAorc3RydWN0IEZvbyB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIGJhciAgLy8gMS4gcmVxdWlyZWQKKyAgICAyOiBvcHRpb25hbCBzdHJpbmcgYmF6ICAvLyAyLiBvcHRpb25hbAorICAgIDM6IHN0cmluZyBxdXggICAgICAgICAgIC8vIDMuIGRlZmF1bHQKK30KK2BgYAorCitgYGBydXN0CitwdWIgc3RydWN0IEZvbyB7CisgICAgYmFyOiBTdHJpbmcsICAgICAgICAgICAgLy8gMS4gcmVxdWlyZWQKKyAgICBiYXo6IE9wdGlvbjxTdHJpbmc+LCAgICAvLyAyLiBvcHRpb25hbAorICAgIHF1eDogT3B0aW9uPFN0cmluZz4sICAgIC8vIDMuIGRlZmF1bHQKK30KK2BgYAorCisjIyBLbm93biBJc3N1ZXMKKworKiBTdHJ1Y3QgY29uc3RhbnRzIGFyZSBub3Qgc3VwcG9ydGVkCisqIE1hcCwgbGlzdCBhbmQgc2V0IGNvbnN0YW50cyByZXF1aXJlIGEgY29uc3QgaG9sZGVyIHN0cnVjdApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvc3JjL2Jpbi90dXRvcmlhbF9jbGllbnQucnMgYi90dXRvcmlhbC9ycy9zcmMvYmluL3R1dG9yaWFsX2NsaWVudC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODBmYWZjCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvc3JjL2Jpbi90dXRvcmlhbF9jbGllbnQucnMKQEAgLTAsMCArMSwxMzAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKKworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnRfdHV0b3JpYWw7CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VENvbXBhY3RJbnB1dFByb3RvY29sLCBUQ29tcGFjdE91dHB1dFByb3RvY29sfTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6eworICAgIFJlYWRIYWxmLCBURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0LCBUSW9DaGFubmVsLCBUVGNwQ2hhbm5lbCwgV3JpdGVIYWxmLAorfTsKKwordXNlIHRocmlmdF90dXRvcmlhbDo6c2hhcmVkOjpUU2hhcmVkU2VydmljZVN5bmNDbGllbnQ7Cit1c2UgdGhyaWZ0X3R1dG9yaWFsOjp0dXRvcmlhbDo6e0NhbGN1bGF0b3JTeW5jQ2xpZW50LCBPcGVyYXRpb24sIFRDYWxjdWxhdG9yU3luY0NsaWVudCwgV29ya307CisKK2ZuIG1haW4oKSB7CisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gcHJpbnRsbiEoInR1dG9yaWFsIGNsaWVudCByYW4gc3VjY2Vzc2Z1bGx5IiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBwcmludGxuISgidHV0b3JpYWwgY2xpZW50IGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgb3B0aW9ucyA9IGNsYXBfYXBwIShydXN0X3R1dG9yaWFsX2NsaWVudCA9PgorICAgICAgICAodmVyc2lvbjogIjAuMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlRocmlmdCBSdXN0IHR1dG9yaWFsIGNsaWVudCIpCisgICAgICAgIChAYXJnIGhvc3Q6IC0taG9zdCArdGFrZXNfdmFsdWUgImhvc3Qgb24gd2hpY2ggdGhlIHR1dG9yaWFsIHNlcnZlciBsaXN0ZW5zIikKKyAgICAgICAgKEBhcmcgcG9ydDogLS1wb3J0ICt0YWtlc192YWx1ZSAicG9ydCBvbiB3aGljaCB0aGUgdHV0b3JpYWwgc2VydmVyIGxpc3RlbnMiKQorICAgICk7CisgICAgbGV0IG1hdGNoZXMgPSBvcHRpb25zLmdldF9tYXRjaGVzKCk7CisKKyAgICAvLyBnZXQgYW55IHBhc3NlZC1pbiBhcmdzIG9yIHRoZSBkZWZhdWx0cworICAgIGxldCBob3N0ID0gbWF0Y2hlcy52YWx1ZV9vZigiaG9zdCIpLnVud3JhcF9vcigiMTI3LjAuMC4xIik7CisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworCisgICAgLy8gYnVpbGQgb3VyIGNsaWVudCBhbmQgY29ubmVjdCB0byB0aGUgaG9zdDpwb3J0CisgICAgbGV0IG11dCBjbGllbnQgPSBuZXdfY2xpZW50KGhvc3QsIHBvcnQpPzsKKworICAgIC8vIGFscmlnaHQhCisgICAgLy8gbGV0J3Mgc3RhcnQgbWFraW5nIHNvbWUgY2FsbHMKKworICAgIC8vIGxldCdzIHN0YXJ0IHdpdGggYSBwaW5nOyB0aGUgc2VydmVyIHNob3VsZCByZXNwb25kCisgICAgcHJpbnRsbiEoInBpbmchIik7CisgICAgY2xpZW50LnBpbmcoKT87CisKKyAgICAvLyBzaW1wbGUgYWRkCisgICAgcHJpbnRsbiEoImFkZCIpOworICAgIGxldCByZXMgPSBjbGllbnQuYWRkKDEsIDIpPzsKKyAgICBwcmludGxuISgiYWRkZWQgMSwgMiBhbmQgZ290IHt9IiwgcmVzKTsKKworICAgIGxldCBsb2dpZCA9IDMyOworCisgICAgLy8gbGV0J3MgZG8uLi5hIG11bHRpcGx5IQorICAgIGxldCByZXMgPSBjbGllbnQuY2FsY3VsYXRlKGxvZ2lkLCBXb3JrOjpuZXcoNywgOCwgT3BlcmF0aW9uOjpNdWx0aXBseSwgTm9uZSkpPzsKKyAgICBwcmludGxuISgibXVsdGlwbGllZCA3IGFuZCA4IGFuZCBnb3Qge30iLCByZXMpOworCisgICAgLy8gbGV0J3MgZ2V0IHRoZSBsb2cgZm9yIGl0CisgICAgbGV0IHJlcyA9IGNsaWVudC5nZXRfc3RydWN0KDMyKT87CisgICAgcHJpbnRsbiEoImdvdCBsb2cgezo/fSBmb3Igb3BlcmF0aW9uIHt9IiwgcmVzLCBsb2dpZCk7CisKKyAgICAvLyBvayAtIGxldCdzIGJlIGJhZCA6KAorICAgIC8vIGRvIGEgZGl2aWRlIGJ5IDAKKyAgICAvLyBsb2dpZCBkb2Vzbid0IG1hdHRlcjsgd29uJ3QgYmUgcmVjb3JkZWQKKyAgICBsZXQgcmVzID0gY2xpZW50LmNhbGN1bGF0ZSg3NywgV29yazo6bmV3KDIsIDAsIE9wZXJhdGlvbjo6RGl2aWRlLCAid2UgYmFkIi50b19vd25lZCgpKSk7CisKKyAgICAvLyB3ZSBzaG91bGQgaGF2ZSBnb3R0ZW4gYW4gZXhjZXB0aW9uIGJhY2sKKyAgICBtYXRjaCByZXMgeworICAgICAgICBPayh2KSA9PiBwYW5pYyEoInNob3VsZCBub3QgaGF2ZSBzdWNjZWVkZWQgd2l0aCByZXN1bHQge30iLCB2KSwKKyAgICAgICAgRXJyKGUpID0+IHByaW50bG4hKCJkaXZpZGUgYnkgemVybyBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSksCisgICAgfQorCisgICAgLy8gbGV0J3MgZG8gYSBvbmUtd2F5IGNhbGwKKyAgICBwcmludGxuISgiemlwIik7CisgICAgY2xpZW50LnppcCgpPzsKKworICAgIC8vIGFuZCB0aGVuIGNsb3NlIG91dCB3aXRoIGEgZmluYWwgcGluZworICAgIHByaW50bG4hKCJwaW5nISIpOworICAgIGNsaWVudC5waW5nKCk/OworCisgICAgT2soKCkpCit9CisKK3R5cGUgQ2xpZW50SW5wdXRQcm90b2NvbCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDxURnJhbWVkUmVhZFRyYW5zcG9ydDxSZWFkSGFsZjxUVGNwQ2hhbm5lbD4+PjsKK3R5cGUgQ2xpZW50T3V0cHV0UHJvdG9jb2wgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sPFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxXcml0ZUhhbGY8VFRjcENoYW5uZWw+Pj47CisKK2ZuIG5ld19jbGllbnQoCisgICAgaG9zdDogJnN0ciwKKyAgICBwb3J0OiB1MTYsCispIC0+IHRocmlmdDo6UmVzdWx0PENhbGN1bGF0b3JTeW5jQ2xpZW50PENsaWVudElucHV0UHJvdG9jb2wsIENsaWVudE91dHB1dFByb3RvY29sPj4geworICAgIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKworICAgIC8vIG9wZW4gdGhlIHVuZGVybHlpbmcgVENQIHN0cmVhbQorICAgIHByaW50bG4hKCJjb25uZWN0aW5nIHRvIHR1dG9yaWFsIHNlcnZlciBvbiB7fTp7fSIsIGhvc3QsIHBvcnQpOworICAgIGMub3BlbigmZm9ybWF0ISgie306e30iLCBob3N0LCBwb3J0KSk/OworCisgICAgLy8gY2xvbmUgdGhlIFRDUCBjaGFubmVsIGludG8gdHdvIGhhbHZlcywgb25lIHdoaWNoCisgICAgLy8gd2UnbGwgdXNlIGZvciByZWFkaW5nLCB0aGUgb3RoZXIgZm9yIHdyaXRpbmcKKyAgICBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IGMuc3BsaXQoKT87CisKKyAgICAvLyB3cmFwIHRoZSByYXcgc29ja2V0cyAoc2xvdykgd2l0aCBhIGJ1ZmZlcmVkIHRyYW5zcG9ydCBvZiBzb21lIGtpbmQKKyAgICBsZXQgaV90cmFuID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhpX2NoYW4pOworICAgIGxldCBvX3RyYW4gPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhvX2NoYW4pOworCisgICAgLy8gbm93IGNyZWF0ZSB0aGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zCisgICAgbGV0IGlfcHJvdCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbik7CisgICAgbGV0IG9fcHJvdCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4pOworCisgICAgLy8gd2UncmUgZG9uZSEKKyAgICBPayhDYWxjdWxhdG9yU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KSkKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JzL3NyYy9iaW4vdHV0b3JpYWxfc2VydmVyLnJzIGIvdHV0b3JpYWwvcnMvc3JjL2Jpbi90dXRvcmlhbF9zZXJ2ZXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViMWEyYgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL3NyYy9iaW4vdHV0b3JpYWxfc2VydmVyLnJzCkBAIC0wLDAgKzEsMTc5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGNsYXA7CisKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0X3R1dG9yaWFsOworCit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKK3VzZSBzdGQ6OmNvbnZlcnQ6OntGcm9tLCBJbnRvfTsKK3VzZSBzdGQ6OmRlZmF1bHQ6OkRlZmF1bHQ7Cit1c2Ugc3RkOjpzeW5jOjpNdXRleDsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5LCBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeX07Cit1c2UgdGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXI7CisKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07Cit1c2UgdGhyaWZ0X3R1dG9yaWFsOjpzaGFyZWQ6OntTaGFyZWRTZXJ2aWNlU3luY0hhbmRsZXIsIFNoYXJlZFN0cnVjdH07Cit1c2UgdGhyaWZ0X3R1dG9yaWFsOjp0dXRvcmlhbDo6e0NhbGN1bGF0b3JTeW5jSGFuZGxlciwgQ2FsY3VsYXRvclN5bmNQcm9jZXNzb3J9OwordXNlIHRocmlmdF90dXRvcmlhbDo6dHV0b3JpYWw6OntJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24sIFdvcmt9OworCitmbiBtYWluKCkgeworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IHByaW50bG4hKCJ0dXRvcmlhbCBzZXJ2ZXIgcmFuIHN1Y2Nlc3NmdWxseSIpLAorICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgcHJpbnRsbiEoInR1dG9yaWFsIHNlcnZlciBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG9wdGlvbnMgPSBjbGFwX2FwcCEocnVzdF90dXRvcmlhbF9zZXJ2ZXIgPT4KKyAgICAgICAgKHZlcnNpb246ICIwLjEuMCIpCisgICAgICAgIChhdXRob3I6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iKQorICAgICAgICAoYWJvdXQ6ICJUaHJpZnQgUnVzdCB0dXRvcmlhbCBzZXJ2ZXIiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJwb3J0IG9uIHdoaWNoIHRoZSB0dXRvcmlhbCBzZXJ2ZXIgbGlzdGVucyIpCisgICAgKTsKKyAgICBsZXQgbWF0Y2hlcyA9IG9wdGlvbnMuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKyAgICBsZXQgbGlzdGVuX2FkZHJlc3MgPSBmb3JtYXQhKCIxMjcuMC4wLjE6e30iLCBwb3J0KTsKKworICAgIHByaW50bG4hKCJiaW5kaW5nIHRvIHt9IiwgbGlzdGVuX2FkZHJlc3MpOworCisgICAgbGV0IGlfdHJhbl9mYWN0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKTsKKyAgICBsZXQgaV9wcm90X2ZhY3QgPSBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKTsKKworICAgIGxldCBvX3RyYW5fZmFjdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpOworICAgIGxldCBvX3Byb3RfZmFjdCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKTsKKworICAgIC8vIGRlbXV4IGluY29taW5nIG1lc3NhZ2VzCisgICAgbGV0IHByb2Nlc3NvciA9IENhbGN1bGF0b3JTeW5jUHJvY2Vzc29yOjpuZXcoQ2FsY3VsYXRvclNlcnZlciB7CisgICAgICAgIC4uRGVmYXVsdDo6ZGVmYXVsdCgpCisgICAgfSk7CisKKyAgICAvLyBjcmVhdGUgdGhlIHNlcnZlciBhbmQgc3RhcnQgbGlzdGVuaW5nCisgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgIGlfdHJhbl9mYWN0LAorICAgICAgICBpX3Byb3RfZmFjdCwKKyAgICAgICAgb190cmFuX2ZhY3QsCisgICAgICAgIG9fcHJvdF9mYWN0LAorICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgIDEwLAorICAgICk7CisKKyAgICBzZXJ2ZXIubGlzdGVuKCZsaXN0ZW5fYWRkcmVzcykKK30KKworLy8vIEhhbmRsZXMgaW5jb21pbmcgQ2FsY3VsYXRvciBzZXJ2aWNlIGNhbGxzLgorc3RydWN0IENhbGN1bGF0b3JTZXJ2ZXIgeworICAgIGxvZzogTXV0ZXg8SGFzaE1hcDxpMzIsIFNoYXJlZFN0cnVjdD4+LAorfQorCitpbXBsIERlZmF1bHQgZm9yIENhbGN1bGF0b3JTZXJ2ZXIgeworICAgIGZuIGRlZmF1bHQoKSAtPiBDYWxjdWxhdG9yU2VydmVyIHsKKyAgICAgICAgQ2FsY3VsYXRvclNlcnZlciB7CisgICAgICAgICAgICBsb2c6IE11dGV4OjpuZXcoSGFzaE1hcDo6bmV3KCkpLAorICAgICAgICB9CisgICAgfQorfQorCisvLyBzaW5jZSBDYWxjdWxhdG9yIGV4dGVuZHMgU2hhcmVkU2VydmljZSB3ZSBoYXZlIHRvIGltcGxlbWVudCB0aGUKKy8vIGhhbmRsZXIgZm9yIGJvdGggdHJhaXRzLgorLy8KKworLy8gU2hhcmVkU2VydmljZSBoYW5kbGVyCitpbXBsIFNoYXJlZFNlcnZpY2VTeW5jSGFuZGxlciBmb3IgQ2FsY3VsYXRvclNlcnZlciB7CisgICAgZm4gaGFuZGxlX2dldF9zdHJ1Y3QoJnNlbGYsIGtleTogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxTaGFyZWRTdHJ1Y3Q+IHsKKyAgICAgICAgbGV0IGxvZyA9IHNlbGYubG9nLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbG9nLmdldCgma2V5KQorICAgICAgICAgICAgLmNsb25lZCgpCisgICAgICAgICAgICAub2tfb3JfZWxzZSh8fCBmb3JtYXQhKCJjb3VsZCBub3QgZmluZCBsb2cgZm9yIGtleSB7fSIsIGtleSkuaW50bygpKQorICAgIH0KK30KKworLy8gQ2FsY3VsYXRvciBoYW5kbGVyCitpbXBsIENhbGN1bGF0b3JTeW5jSGFuZGxlciBmb3IgQ2FsY3VsYXRvclNlcnZlciB7CisgICAgZm4gaGFuZGxlX3BpbmcoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHByaW50bG4hKCJwb25nISIpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfYWRkKCZzZWxmLCBudW0xOiBpMzIsIG51bTI6IGkzMikgLT4gdGhyaWZ0OjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHByaW50bG4hKCJoYW5kbGluZyBhZGQ6IG4xOnt9IG4yOnt9IiwgbnVtMSwgbnVtMik7CisgICAgICAgIE9rKG51bTEgKyBudW0yKQorICAgIH0KKworICAgIGZuIGhhbmRsZV9jYWxjdWxhdGUoJnNlbGYsIGxvZ2lkOiBpMzIsIHc6IFdvcmspIC0+IHRocmlmdDo6UmVzdWx0PGkzMj4geworICAgICAgICBwcmludGxuISgiaGFuZGxpbmcgY2FsY3VsYXRlOiBsOnt9LCB3Ons6P30iLCBsb2dpZCwgdyk7CisKKyAgICAgICAgbGV0IHJlcyA9IGlmIGxldCBTb21lKHJlZiBvcCkgPSB3Lm9wIHsKKyAgICAgICAgICAgIGlmIHcubnVtMS5pc19ub25lKCkgfHwgdy5udW0yLmlzX25vbmUoKSB7CisgICAgICAgICAgICAgICAgRXJyKEludmFsaWRPcGVyYXRpb24geworICAgICAgICAgICAgICAgICAgICB3aGF0X29wOiBTb21lKCpvcCBhcyBpMzIpLAorICAgICAgICAgICAgICAgICAgICB3aHk6IFNvbWUoIm5vIG9wZXJhbmRzIHNwZWNpZmllZCIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gc28gdGhhdCBJIGRvbid0IGhhdmUgdG8gY2FsbCB1bndyYXAoKSBtdWx0aXBsZSB0aW1lcyBiZWxvdworICAgICAgICAgICAgICAgIGxldCBudW0xID0gdy5udW0xLmFzX3JlZigpLmV4cGVjdCgib3BlcmFuZHMgY2hlY2tlZCIpOworICAgICAgICAgICAgICAgIGxldCBudW0yID0gdy5udW0yLmFzX3JlZigpLmV4cGVjdCgib3BlcmFuZHMgY2hlY2tlZCIpOworCisgICAgICAgICAgICAgICAgbWF0Y2ggKm9wIHsKKyAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uOjpBZGQgPT4gT2sobnVtMSArIG51bTIpLAorICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb246OlN1YnRyYWN0ID0+IE9rKG51bTEgLSBudW0yKSwKKyAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uOjpNdWx0aXBseSA9PiBPayhudW0xICogbnVtMiksCisgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbjo6RGl2aWRlID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICpudW0yID09IDAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycihJbnZhbGlkT3BlcmF0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdF9vcDogU29tZSgqb3AgYXMgaTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2h5OiBTb21lKCJkaXZpZGUgYnkgMCIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2sobnVtMSAvIG51bTIpCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFcnIoSW52YWxpZE9wZXJhdGlvbjo6bmV3KAorICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgIm5vIG9wZXJhdGlvbiBzcGVjaWZpZWQiLnRvX293bmVkKCksCisgICAgICAgICAgICApKQorICAgICAgICB9OworCisgICAgICAgIC8vIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgbG9nIGl0CisgICAgICAgIGlmIGxldCBPayhyZWYgdikgPSByZXMgeworICAgICAgICAgICAgbGV0IG11dCBsb2cgPSBzZWxmLmxvZy5sb2NrKCkudW53cmFwKCk7CisgICAgICAgICAgICBsb2cuaW5zZXJ0KGxvZ2lkLCBTaGFyZWRTdHJ1Y3Q6Om5ldyhsb2dpZCwgZm9ybWF0ISgie30iLCB2KSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlIHRyeSEgbWFjcm8gYXV0b21hdGljYWxseSBtYXBzIGVycm9ycworICAgICAgICAvLyBidXQsIHNpbmNlIHdlIGFyZW4ndCB1c2luZyB0aGF0IGhlcmUgd2UgaGF2ZSB0byBtYXAgZXJyb3JzIG1hbnVhbGx5CisgICAgICAgIC8vCisgICAgICAgIC8vIGV4Y2VwdGlvbiBzdHJ1Y3RzIGRlZmluZWQgaW4gdGhlIElETCBoYXZlIGFuIGF1dG8tZ2VuZXJhdGVkCisgICAgICAgIC8vIGltcGwgb2YgRnJvbTo6ZnJvbQorICAgICAgICByZXMubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIGhhbmRsZV96aXAoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHByaW50bG4hKCJoYW5kbGluZyB6aXAiKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvc3JjL2xpYi5ycyBiL3R1dG9yaWFsL3JzL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwMDdlNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL3NyYy9saWIucnMKQEAgLTAsMCArMSwyMyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKK3B1YiBtb2Qgc2hhcmVkOworcHViIG1vZCB0dXRvcmlhbDsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3NoYXJlZC50aHJpZnQgYi90dXRvcmlhbC9zaGFyZWQudGhyaWZ0CmluZGV4IDYwZThlN2EuLjU3NDdmMDYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL3NoYXJlZC50aHJpZnQKKysrIGIvdHV0b3JpYWwvc2hhcmVkLnRocmlmdApAQCAtMjIsMTIgKzIyLDE3IEBACiAgKiB0aGVzZSBkZWZpbml0aW9ucy4KICAqLwogCituYW1lc3BhY2UgY2wgc2hhcmVkCiBuYW1lc3BhY2UgY3BwIHNoYXJlZAogbmFtZXNwYWNlIGQgc2hhcmUgLy8gInNoYXJlZCIgd291bGQgY29sbGlkZSB3aXRoIHRoZSBlcG9ueW1vdXMgRCBrZXl3b3JkLgorbmFtZXNwYWNlIGRhcnQgc2hhcmVkCiBuYW1lc3BhY2UgamF2YSBzaGFyZWQKIG5hbWVzcGFjZSBwZXJsIHNoYXJlZAogbmFtZXNwYWNlIHBocCBzaGFyZWQKIG5hbWVzcGFjZSBoYXhlIHNoYXJlZAorbmFtZXNwYWNlIG5ldGNvcmUgc2hhcmVkCituYW1lc3BhY2UgbmV0c3RkIHNoYXJlZAorCiAKIHN0cnVjdCBTaGFyZWRTdHJ1Y3QgewogICAxOiBpMzIga2V5CmRpZmYgLS1naXQgYS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQgYi90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKaW5kZXggNTcxYWI4ZS4uZWExOGI3MyAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisrKyBiL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdApAQCAtMzIsNyArMzIsNyBAQAogICogVGhlIGZpcnN0IHRoaW5nIHRvIGtub3cgYWJvdXQgYXJlIHR5cGVzLiBUaGUgYXZhaWxhYmxlIHR5cGVzIGluIFRocmlmdCBhcmU6CiAgKgogICogIGJvb2wgICAgICAgIEJvb2xlYW4sIG9uZSBieXRlCi0gKiAgYnl0ZSAgICAgICAgU2lnbmVkIGJ5dGUKKyAqICBpOCAoYnl0ZSkgICBTaWduZWQgOC1iaXQgaW50ZWdlcgogICogIGkxNiAgICAgICAgIFNpZ25lZCAxNi1iaXQgaW50ZWdlcgogICogIGkzMiAgICAgICAgIFNpZ25lZCAzMi1iaXQgaW50ZWdlcgogICogIGk2NCAgICAgICAgIFNpZ25lZCA2NC1iaXQgaW50ZWdlcgpAQCAtNjIsMTIgKzYyLDE3IEBACiAgKiBUaHJpZnQgZmlsZXMgY2FuIG5hbWVzcGFjZSwgcGFja2FnZSwgb3IgcHJlZml4IHRoZWlyIG91dHB1dCBpbiB2YXJpb3VzCiAgKiB0YXJnZXQgbGFuZ3VhZ2VzLgogICovCisKK25hbWVzcGFjZSBjbCB0dXRvcmlhbAogbmFtZXNwYWNlIGNwcCB0dXRvcmlhbAogbmFtZXNwYWNlIGQgdHV0b3JpYWwKK25hbWVzcGFjZSBkYXJ0IHR1dG9yaWFsCiBuYW1lc3BhY2UgamF2YSB0dXRvcmlhbAogbmFtZXNwYWNlIHBocCB0dXRvcmlhbAogbmFtZXNwYWNlIHBlcmwgdHV0b3JpYWwKIG5hbWVzcGFjZSBoYXhlIHR1dG9yaWFsCituYW1lc3BhY2UgbmV0Y29yZSB0dXRvcmlhbAorbmFtZXNwYWNlIG5ldHN0ZCB0dXRvcmlhbAogCiAvKioKICAqIFRocmlmdCBsZXRzIHlvdSBkbyB0eXBlZGVmcyB0byBnZXQgcHJldHR5IG5hbWVzIGZvciB5b3VyIHR5cGVzLiBTdGFuZGFyZAo=